From eb70a67422d66c839d17a5aa06d1a411a904ae24 Mon Sep 17 00:00:00 2001 From: Maciej Szulik Date: Sun, 25 Apr 2021 13:32:01 +0200 Subject: [PATCH 01/16] bump(k8s.io/*): 1.21 --- go.mod | 102 +- go.sum | 371 +- .../go-autorest/autorest/authorization.go | 17 +- .../go-autorest/autorest/authorization_sas.go | 7 +- .../autorest/authorization_storage.go | 3 + .../Azure/go-autorest/autorest/azure/async.go | 11 +- .../Azure/go-autorest/autorest/azure/azure.go | 5 + .../autorest/azure/environments.go | 20 + .../Azure/go-autorest/autorest/go.mod | 6 +- .../Azure/go-autorest/autorest/go.sum | 16 +- .../Azure/go-autorest/autorest/preparer.go | 29 +- .../Azure/go-autorest/autorest/sender.go | 63 +- .../Azure/go-autorest/autorest/utility.go | 7 + vendor/github.com/Microsoft/go-winio/go.mod | 2 +- vendor/github.com/Microsoft/go-winio/go.sum | 6 +- vendor/github.com/Microsoft/go-winio/pipe.go | 4 +- .../pkg/security/grantvmgroupaccess.go | 159 + .../go-winio/pkg/security/syscall_windows.go | 7 + .../go-winio/pkg/security/zsyscall_windows.go | 81 + .../github.com/Microsoft/go-winio/vhd/vhd.go | 341 +- .../github.com/Microsoft/go-winio/vhd/zvhd.go | 54 +- .../Microsoft/hcsshim/.gitattributes | 1 + .../github.com/Microsoft/hcsshim/CODEOWNERS | 4 +- .../github.com/Microsoft/hcsshim/appveyor.yml | 2 + .../hcsshim/computestorage/attach.go | 38 + .../hcsshim/computestorage/destroy.go | 26 + .../hcsshim/computestorage/detach.go | 26 + .../hcsshim/computestorage/export.go | 46 + .../hcsshim/computestorage/format.go | 26 + .../hcsshim/computestorage/helpers.go | 197 + .../hcsshim/computestorage/import.go | 41 + .../hcsshim/computestorage/initialize.go | 38 + .../Microsoft/hcsshim/computestorage/mount.go | 27 + .../Microsoft/hcsshim/computestorage/setup.go | 75 + .../hcsshim/computestorage/storage.go | 50 + .../computestorage/zsyscall_windows.go | 319 + vendor/github.com/Microsoft/hcsshim/go.mod | 4 +- vendor/github.com/Microsoft/hcsshim/go.sum | 8 +- .../github.com/Microsoft/hcsshim/hcn/hcn.go | 18 + .../Microsoft/hcsshim/hcn/hcnglobals.go | 15 +- .../Microsoft/hcsshim/hcn/hcnpolicy.go | 32 +- .../Microsoft/hcsshim/hcn/hcnsupport.go | 4 + .../Microsoft/hcsshim/internal/hcs/syscall.go | 5 - .../Microsoft/hcsshim/internal/hcs/utils.go | 5 +- .../hcsshim/internal/hcs/zsyscall_windows.go | 54 - .../hcsshim/internal/hns/namespace.go | 7 +- .../hcsshim/internal/safefile/safeopen.go | 158 +- .../internal/safefile/zsyscall_windows.go | 79 - .../hcsshim/internal/schema2/cpu_group.go | 15 + .../internal/schema2/cpu_group_affinity.go | 15 + .../internal/schema2/cpu_group_config.go | 18 + .../schema2/cpu_group_configurations.go | 15 + .../internal/schema2/cpu_group_operations.go | 18 + .../internal/schema2/cpu_group_property.go | 15 + .../schema2/create_group_operation.go | 17 + .../schema2/delete_group_operation.go | 15 + .../schema2/host_processor_modify_request.go | 16 + .../schema2/hv_socket_service_config.go | 6 + .../internal/schema2/logical_processor.go | 2 +- .../hcsshim/internal/schema2/memory.go | 2 +- .../hcsshim/internal/schema2/memory_2.go | 2 +- .../hcsshim/internal/schema2/property_type.go | 1 + .../internal/schema2/vm_processor_limits.go | 22 + .../hcsshim/internal/wclayer/baselayer.go | 7 +- .../internal/wclayer/createscratchlayer.go | 4 +- .../hcsshim/internal/wclayer/legacy.go | 17 +- .../hcsshim/internal/wclayer/wclayer.go | 3 + .../hcsshim/internal/winapi/devices.go | 13 + .../hcsshim/internal/winapi/errors.go | 15 + .../hcsshim/internal/winapi/filesystem.go | 110 + .../Microsoft/hcsshim/internal/winapi/iocp.go | 3 + .../hcsshim/internal/winapi/jobobject.go | 185 + .../hcsshim/internal/winapi/logon.go | 30 + .../hcsshim/internal/winapi/memory.go | 11 + .../Microsoft/hcsshim/internal/winapi/net.go | 3 + .../Microsoft/hcsshim/internal/winapi/path.go | 11 + .../hcsshim/internal/winapi/process.go | 3 + .../hcsshim/internal/winapi/processor.go | 7 + .../hcsshim/internal/winapi/utils.go | 60 + .../hcsshim/internal/winapi/winapi.go | 5 + .../internal/winapi/zsyscall_windows.go | 294 + .../hcsshim/osversion/windowsbuilds.go | 11 + .../NYTimes/gziphandler/.travis.yml | 10 +- vendor/github.com/NYTimes/gziphandler/LICENSE | 201 + .../github.com/NYTimes/gziphandler/LICENSE.md | 13 - .../github.com/NYTimes/gziphandler/README.md | 8 +- vendor/github.com/NYTimes/gziphandler/go.mod | 5 + vendor/github.com/NYTimes/gziphandler/go.sum | 7 + vendor/github.com/NYTimes/gziphandler/gzip.go | 296 +- vendor/github.com/certifi/gocertifi/LICENSE | 3 - vendor/github.com/certifi/gocertifi/README.md | 60 - .../github.com/certifi/gocertifi/certifi.go | 4330 - vendor/github.com/cilium/ebpf/.clang-format | 17 + vendor/github.com/cilium/ebpf/.gitignore | 1 + vendor/github.com/cilium/ebpf/abi.go | 6 - .../github.com/cilium/ebpf/asm/instruction.go | 121 +- vendor/github.com/cilium/ebpf/asm/opcode.go | 6 +- vendor/github.com/cilium/ebpf/collection.go | 168 +- vendor/github.com/cilium/ebpf/doc.go | 3 +- vendor/github.com/cilium/ebpf/elf_reader.go | 16 +- vendor/github.com/cilium/ebpf/go.mod | 7 +- vendor/github.com/cilium/ebpf/go.sum | 4 + .../cilium/ebpf/internal/btf/btf.go | 133 +- .../cilium/ebpf/internal/btf/btf_types.go | 18 +- .../cilium/ebpf/internal/btf/ext_info.go | 12 +- .../cilium/ebpf/internal/btf/fuzz.go | 49 + .../cilium/ebpf/internal/btf/types.go | 185 +- .../cilium/ebpf/internal/feature.go | 8 + .../cilium/ebpf/internal/syscall.go | 27 + .../cilium/ebpf/internal/unix/types_linux.go | 14 + .../cilium/ebpf/internal/unix/types_other.go | 5 + vendor/github.com/cilium/ebpf/linker.go | 47 + vendor/github.com/cilium/ebpf/map.go | 156 +- vendor/github.com/cilium/ebpf/prog.go | 52 +- vendor/github.com/cilium/ebpf/readme.md | 10 +- vendor/github.com/cilium/ebpf/run-tests.sh | 20 +- vendor/github.com/cilium/ebpf/syscalls.go | 29 +- vendor/github.com/cilium/ebpf/types.go | 54 +- vendor/github.com/cilium/ebpf/types_string.go | 41 +- .../spec/lib/go/csi/csi.pb.go | 923 +- .../containerd/console/.golangci.yml | 20 + .../github.com/containerd/console/.travis.yml | 27 - .../github.com/containerd/console/console.go | 22 +- .../containerd/console/console_unix.go | 2 +- vendor/github.com/containerd/console/go.mod | 4 +- vendor/github.com/containerd/console/go.sum | 8 +- .../containerd/console/tc_darwin.go | 11 +- .../github.com/containerd/console/tc_linux.go | 11 +- .../containerd/console/tc_netbsd.go | 45 + .../github.com/containerd/console/tc_unix.go | 2 +- .../services/containers/v1/containers.pb.go | 64 +- .../api/services/tasks/v1/tasks.pb.go | 135 +- .../api/services/version/v1/version.pb.go | 5 +- .../containerd/api/types/descriptor.pb.go | 7 +- .../containerd/api/types/metrics.pb.go | 5 +- .../containerd/api/types/mount.pb.go | 5 +- .../containerd/api/types/platform.pb.go | 5 +- .../containerd/api/types/task/task.pb.go | 10 +- .../containerd/containerd/log/context.go | 60 + .../containerd/platforms/compare.go | 229 + .../containerd/platforms/cpuinfo.go | 122 + .../containerd/platforms/database.go | 114 + .../containerd/platforms/defaults.go | 38 + .../containerd/platforms/defaults_unix.go | 24 + .../containerd/platforms/defaults_windows.go | 31 + .../containerd/platforms/platforms.go | 278 + .../containerd/containerd/sys/env.go | 33 + .../containerd/containerd/sys/epoll.go | 33 + .../containerd/containerd/sys/fds.go | 34 + .../containerd/containerd/sys/filesys.go | 35 + .../containerd/containerd/sys/filesys_unix.go | 31 + .../containerd/sys/filesys_windows.go | 268 + .../containerd/containerd/sys/mount_linux.go | 145 + .../containerd/containerd/sys/oom_unix.go | 61 + .../containerd/containerd/sys/oom_windows.go | 36 + .../containerd/containerd/sys/socket_unix.go | 80 + .../containerd/sys/socket_windows.go | 32 + .../containerd/containerd/sys/stat_bsd.go | 44 + .../containerd/containerd/sys/stat_unix.go | 44 + .../containerd/sys/subprocess_unsafe_linux.go | 30 + .../containerd/sys/subprocess_unsafe_linux.s | 15 + .../containerd/containerd/sys/userns_linux.go | 62 + .../containerd/sys/userns_unsupported.go | 25 + .../github.com/containerd/continuity/AUTHORS | 24 + .../containerd/continuity/fs/copy.go | 4 + .../fs/copy_darwinopenbsdsolaris.go | 40 + .../containerd/continuity/fs/copy_freebsd.go | 42 + .../containerd/continuity/fs/copy_linux.go | 5 +- .../containerd/continuity/fs/copy_unix.go | 14 +- .../containerd/continuity/fs/du_unix.go | 22 +- .../containerd/continuity/fs/path.go | 10 +- .../fs/{stat_bsd.go => stat_darwinfreebsd.go} | 0 .../containerd/continuity/fs/stat_linux.go | 43 - .../continuity/fs/stat_linuxopenbsd.go | 45 + .../continuity/pathdriver/path_driver.go | 101 - .../continuity/syscallx/syscall_unix.go | 26 - .../continuity/syscallx/syscall_windows.go | 112 - .../containerd/continuity/sysx/file_posix.go | 128 - .../containerd/continuity/sysx/nodata_unix.go | 2 +- .../containerd/continuity/sysx/xattr.go | 68 +- .../continuity/sysx/xattr_unsupported.go | 12 +- vendor/github.com/docker/docker/AUTHORS | 117 +- vendor/github.com/docker/docker/api/common.go | 2 +- .../github.com/docker/docker/api/swagger.yaml | 317 +- .../docker/docker/api/types/client.go | 8 +- .../docker/docker/api/types/configs.go | 2 + .../api/types/container/container_changes.go | 3 +- .../api/types/container/container_create.go | 3 +- .../api/types/container/container_top.go | 3 +- .../api/types/container/container_update.go | 3 +- .../api/types/container/container_wait.go | 3 +- .../docker/api/types/container/host_config.go | 37 +- .../docker/api/types/error_response_ext.go | 6 + .../docker/docker/api/types/events/events.go | 2 + .../docker/docker/api/types/filters/parse.go | 8 +- .../docker/api/types/image/image_history.go | 3 +- .../docker/docker/api/types/mount/mount.go | 2 +- .../docker/api/types/network/network.go | 5 +- .../docker/api/types/registry/registry.go | 2 +- .../docker/docker/api/types/seccomp.go | 94 - .../docker/api/types/swarm/container.go | 16 +- .../api/types/swarm/runtime/plugin.pb.go | 110 +- .../api/types/swarm/runtime/plugin.proto | 1 + .../docker/docker/api/types/swarm/service.go | 82 +- .../docker/docker/api/types/swarm/task.go | 18 +- .../docker/docker/api/types/types.go | 50 +- .../docker/api/types/volume/volume_create.go | 3 +- .../docker/api/types/volume/volume_list.go | 3 +- .../docker/docker/client/build_cancel.go | 2 +- .../github.com/docker/docker/client/client.go | 7 +- .../docker/docker/client/client_unix.go | 2 +- .../docker/docker/client/config_create.go | 2 +- .../docker/docker/client/config_remove.go | 2 +- .../docker/docker/client/config_update.go | 2 +- .../docker/docker/client/container_commit.go | 2 +- .../docker/docker/client/container_copy.go | 2 +- .../docker/docker/client/container_create.go | 15 +- .../docker/docker/client/container_list.go | 1 + .../docker/docker/client/container_restart.go | 2 +- .../docker/docker/client/container_stats.go | 16 + .../docker/docker/client/container_update.go | 2 +- .../docker/client/distribution_inspect.go | 2 +- .../github.com/docker/docker/client/errors.go | 8 +- .../github.com/docker/docker/client/events.go | 1 + .../github.com/docker/docker/client/hijack.go | 6 +- .../docker/docker/client/image_build.go | 4 +- .../docker/docker/client/image_create.go | 2 +- .../docker/docker/client/image_import.go | 4 +- .../docker/docker/client/image_list.go | 1 + .../docker/docker/client/image_push.go | 13 +- .../docker/docker/client/image_search.go | 2 +- .../docker/docker/client/interface.go | 4 +- .../docker/docker/client/network_list.go | 1 + .../github.com/docker/docker/client/ping.go | 6 +- .../docker/docker/client/plugin_list.go | 1 + .../docker/docker/client/request.go | 23 +- .../docker/docker/client/secret_create.go | 2 +- .../docker/docker/client/secret_remove.go | 2 +- .../docker/docker/client/secret_update.go | 2 +- .../docker/docker/client/service_create.go | 80 +- .../docker/docker/client/service_list.go | 4 + .../docker/docker/client/service_update.go | 41 +- .../docker/docker/client/task_inspect.go | 2 +- .../docker/docker/client/volume_list.go | 1 + .../docker/docker/errdefs/helpers.go | 52 + .../docker/docker/opts/address_pools.go | 84 - vendor/github.com/docker/docker/opts/env.go | 48 - vendor/github.com/docker/docker/opts/hosts.go | 176 - .../docker/docker/opts/hosts_unix.go | 8 - .../docker/docker/opts/hosts_windows.go | 4 - vendor/github.com/docker/docker/opts/ip.go | 47 - vendor/github.com/docker/docker/opts/opts.go | 337 - .../docker/docker/opts/opts_unix.go | 6 - .../docker/docker/opts/opts_windows.go | 56 - .../docker/docker/opts/quotedstring.go | 37 - .../github.com/docker/docker/opts/runtime.go | 79 - .../github.com/docker/docker/opts/ulimit.go | 81 - .../docker/docker/pkg/archive/archive.go | 88 +- .../docker/pkg/archive/archive_linux.go | 11 +- .../docker/docker/pkg/archive/archive_unix.go | 14 +- .../docker/pkg/archive/archive_windows.go | 2 +- .../docker/docker/pkg/archive/diff.go | 4 +- .../docker/pkg/homedir/homedir_linux.go | 16 - .../docker/pkg/homedir/homedir_others.go | 6 - .../docker/docker/pkg/homedir/homedir_unix.go | 12 +- .../docker/docker/pkg/idtools/idtools.go | 43 +- .../docker/docker/pkg/idtools/idtools_unix.go | 114 +- .../docker/pkg/idtools/idtools_windows.go | 2 +- .../docker/pkg/idtools/usergroupadd_linux.go | 34 +- .../docker/docker/pkg/idtools/utils_unix.go | 9 +- .../docker/docker/pkg/ioutils/bytespipe.go | 3 +- .../docker/pkg/jsonmessage/jsonmessage.go | 14 +- .../docker/docker/pkg/mount/flags.go | 137 - .../docker/docker/pkg/mount/flags_freebsd.go | 49 - .../docker/pkg/mount/flags_unsupported.go | 31 - .../docker/docker/pkg/mount/mount.go | 159 - .../docker/pkg/mount/mounter_freebsd.go | 59 - .../docker/pkg/mount/mounter_unsupported.go | 7 - .../docker/docker/pkg/mount/mountinfo.go | 40 - .../docker/pkg/mount/mountinfo_freebsd.go | 55 - .../docker/pkg/mount/mountinfo_linux.go | 144 - .../docker/pkg/mount/mountinfo_unsupported.go | 12 - .../docker/pkg/mount/mountinfo_windows.go | 6 - .../docker/docker/pkg/mount/unmount_unix.go | 22 - .../docker/pkg/mount/unmount_unsupported.go | 7 - .../docker/docker/pkg/pools/pools.go | 10 +- .../docker/pkg/system/chtimes_nowindows.go | 14 + .../docker/docker/pkg/system/chtimes_unix.go | 14 - .../docker/pkg/system/chtimes_windows.go | 4 +- .../docker/docker/pkg/system/filesys.go | 67 - .../docker/docker/pkg/system/filesys_unix.go | 67 + .../docker/pkg/system/filesys_windows.go | 22 +- .../docker/docker/pkg/system/init_unix.go | 12 - .../docker/docker/pkg/system/init_windows.go | 12 - .../docker/docker/pkg/system/lcow.go | 42 +- .../docker/docker/pkg/system/lcow_unix.go | 8 - .../docker/pkg/system/lcow_unsupported.go | 28 + .../docker/docker/pkg/system/lcow_windows.go | 6 - .../docker/docker/pkg/system/meminfo_linux.go | 8 +- .../docker/docker/pkg/system/path.go | 10 +- .../docker/docker/pkg/system/path_windows.go | 13 +- .../docker/docker/pkg/system/process_unix.go | 20 + .../docker/pkg/system/process_windows.go | 2 +- .../github.com/docker/docker/pkg/system/rm.go | 12 +- .../docker/docker/pkg/system/rm_windows.go | 6 + .../docker/docker/pkg/system/stat_bsd.go | 15 + .../docker/docker/pkg/system/stat_freebsd.go | 13 - .../docker/docker/pkg/system/stat_solaris.go | 4 +- .../docker/docker/pkg/system/syscall_unix.go | 6 - .../docker/pkg/system/syscall_windows.go | 127 +- .../docker/pkg/system/utimes_freebsd.go | 24 - .../docker/docker/pkg/system/utimes_linux.go | 25 - .../docker/docker/pkg/system/utimes_unix.go | 24 + .../docker/docker/pkg/system/xattrs_linux.go | 17 +- .../docker/docker/pkg/term/ascii.go | 66 - .../docker/docker/pkg/term/proxy.go | 78 - .../github.com/docker/docker/pkg/term/tc.go | 20 - .../github.com/docker/docker/pkg/term/term.go | 124 - .../docker/docker/pkg/term/term_windows.go | 221 - .../docker/docker/pkg/term/termios_bsd.go | 42 - .../docker/docker/pkg/term/termios_linux.go | 39 - .../docker/pkg/term/windows/ansi_reader.go | 263 - .../docker/pkg/term/windows/ansi_writer.go | 64 - .../docker/docker/pkg/term/windows/console.go | 35 - .../docker/docker/pkg/term/windows/windows.go | 33 - .../docker/docker/pkg/term/winsize.go | 20 - vendor/github.com/docker/libnetwork/LICENSE | 202 - .../docker/libnetwork/ipamutils/utils.go | 135 - vendor/github.com/docker/spdystream/LICENSE | 191 - .../github.com/docker/spdystream/LICENSE.docs | 425 - .../github.com/docker/spdystream/MAINTAINERS | 28 - vendor/github.com/docker/spdystream/README.md | 77 - .../github.com/docker/spdystream/handlers.go | 38 - .../github.com/docker/spdystream/priority.go | 98 - .../docker/spdystream/spdy/types.go | 275 - vendor/github.com/docker/spdystream/utils.go | 16 - .../fsouza/go-dockerclient/.gitattributes | 1 + .../fsouza/go-dockerclient/.golangci.yaml | 8 + .../fsouza/go-dockerclient/.travis.yml | 32 - .../github.com/fsouza/go-dockerclient/AUTHORS | 28 + .../fsouza/go-dockerclient/DOCKER-LICENSE | 2 +- .../github.com/fsouza/go-dockerclient/LICENSE | 19 +- .../fsouza/go-dockerclient/Makefile | 51 +- .../fsouza/go-dockerclient/README.markdown | 125 - .../fsouza/go-dockerclient/README.md | 151 + .../fsouza/go-dockerclient/appveyor.yml | 20 - .../github.com/fsouza/go-dockerclient/auth.go | 245 +- .../fsouza/go-dockerclient/client.go | 213 +- .../fsouza/go-dockerclient/client_unix.go | 18 +- .../fsouza/go-dockerclient/client_windows.go | 18 +- .../fsouza/go-dockerclient/container.go | 1092 +- .../go-dockerclient/container_archive.go | 58 + .../go-dockerclient/container_attach.go | 74 + .../go-dockerclient/container_changes.go | 28 + .../go-dockerclient/container_commit.go | 46 + .../fsouza/go-dockerclient/container_copy.go | 50 + .../go-dockerclient/container_create.go | 79 + .../go-dockerclient/container_export.go | 37 + .../go-dockerclient/container_inspect.go | 55 + .../fsouza/go-dockerclient/container_kill.go | 46 + .../fsouza/go-dockerclient/container_list.go | 37 + .../fsouza/go-dockerclient/container_logs.go | 58 + .../fsouza/go-dockerclient/container_pause.go | 24 + .../fsouza/go-dockerclient/container_prune.go | 40 + .../go-dockerclient/container_remove.go | 41 + .../go-dockerclient/container_rename.go | 33 + .../go-dockerclient/container_resize.go | 22 + .../go-dockerclient/container_restart.go | 64 + .../fsouza/go-dockerclient/container_start.go | 57 + .../fsouza/go-dockerclient/container_stats.go | 215 + .../fsouza/go-dockerclient/container_stop.go | 42 + .../fsouza/go-dockerclient/container_top.go | 40 + .../go-dockerclient/container_unpause.go | 24 + .../go-dockerclient/container_update.go | 43 + .../fsouza/go-dockerclient/container_wait.go | 42 + .../fsouza/go-dockerclient/distribution.go | 3 +- .../github.com/fsouza/go-dockerclient/env.go | 2 +- .../fsouza/go-dockerclient/event.go | 94 +- .../github.com/fsouza/go-dockerclient/exec.go | 41 +- .../github.com/fsouza/go-dockerclient/go.mod | 24 + .../github.com/fsouza/go-dockerclient/go.sum | 198 + .../fsouza/go-dockerclient/image.go | 181 +- .../github.com/fsouza/go-dockerclient/misc.go | 49 +- .../fsouza/go-dockerclient/network.go | 50 +- .../github.com/fsouza/go-dockerclient/node.go | 130 - .../fsouza/go-dockerclient/plugin.go | 461 + .../fsouza/go-dockerclient/registry_auth.go | 10 + .../fsouza/go-dockerclient/service.go | 216 - .../fsouza/go-dockerclient/swarm.go | 27 +- .../fsouza/go-dockerclient/swarm_configs.go | 175 + .../fsouza/go-dockerclient/swarm_node.go | 134 + .../fsouza/go-dockerclient/swarm_secrets.go | 175 + .../fsouza/go-dockerclient/swarm_service.go | 218 + .../fsouza/go-dockerclient/swarm_task.go | 72 + .../fsouza/go-dockerclient/system.go | 73 + .../github.com/fsouza/go-dockerclient/tar.go | 15 +- .../github.com/fsouza/go-dockerclient/task.go | 70 - .../github.com/fsouza/go-dockerclient/tls.go | 12 +- .../fsouza/go-dockerclient/volume.go | 63 +- .../getsentry/raven-go/.dockerignore | 1 - .../github.com/getsentry/raven-go/.gitignore | 5 - .../github.com/getsentry/raven-go/.travis.yml | 51 - .../getsentry/raven-go/Dockerfile.test | 13 - vendor/github.com/getsentry/raven-go/LICENSE | 28 - .../github.com/getsentry/raven-go/README.md | 19 - .../github.com/getsentry/raven-go/client.go | 1087 - .../github.com/getsentry/raven-go/errors.go | 70 - .../getsentry/raven-go/exception.go | 53 - vendor/github.com/getsentry/raven-go/http.go | 101 - .../getsentry/raven-go/interfaces.go | 53 - .../github.com/getsentry/raven-go/runtests.sh | 4 - .../getsentry/raven-go/stacktrace.go | 283 - .../github.com/getsentry/raven-go/writer.go | 21 - .../github.com/go-errors/errors/.travis.yml | 5 + .../github.com/go-errors/errors/LICENSE.MIT | 7 + vendor/github.com/go-errors/errors/README.md | 66 + vendor/github.com/go-errors/errors/cover.out | 89 + vendor/github.com/go-errors/errors/error.go | 217 + .../go-errors/errors/parse_panic.go | 127 + .../github.com/go-errors/errors/stackframe.go | 102 + .../github.com/go-openapi/spec/.golangci.yml | 5 + vendor/github.com/go-openapi/spec/bindata.go | 36 +- vendor/github.com/go-openapi/spec/expander.go | 7 +- vendor/github.com/go-openapi/spec/go.mod | 7 +- vendor/github.com/go-openapi/spec/go.sum | 29 +- vendor/github.com/go-openapi/spec/ref.go | 2 + .../go-openapi/spec/schema_loader.go | 7 +- .../cadvisor/container/common/helpers.go | 34 +- .../cadvisor/container/containerd/client.go | 7 +- .../cadvisor/container/docker/factory.go | 30 +- .../cadvisor/container/docker/handler.go | 37 + .../google/cadvisor/container/factory.go | 2 + .../container/libcontainer/handler.go | 84 +- vendor/github.com/google/cadvisor/fs/fs.go | 169 +- vendor/github.com/google/cadvisor/fs/types.go | 2 + .../google/cadvisor/info/v1/container.go | 6 + .../google/cadvisor/machine/machine.go | 47 +- .../google/cadvisor/manager/container.go | 225 +- .../google/cadvisor/metrics/prometheus.go | 32 + .../cadvisor/metrics/prometheus_fake.go | 16 + .../google/cadvisor/resctrl/collector.go | 12 +- .../cadvisor/utils/oomparser/oomparser.go | 8 +- .../google/cadvisor/utils/sysfs/sysfs.go | 180 +- .../cadvisor/utils/sysfs/sysfs_notx86.go | 19 + .../google/cadvisor/utils/sysfs/sysfs_x86.go | 19 + .../google/cadvisor/utils/sysinfo/sysinfo.go | 32 +- .../google/go-cmp/cmp/cmpopts/equate.go | 156 + .../google/go-cmp/cmp/cmpopts/ignore.go | 206 + .../google/go-cmp/cmp/cmpopts/sort.go | 147 + .../go-cmp/cmp/cmpopts/struct_filter.go | 187 + .../google/go-cmp/cmp/cmpopts/xform.go | 35 + .../github.com/google/go-cmp/cmp/compare.go | 6 +- .../google/go-cmp/cmp/export_panic.go | 2 +- .../google/go-cmp/cmp/export_unsafe.go | 2 +- .../go-cmp/cmp/internal/diff/debug_disable.go | 2 +- .../go-cmp/cmp/internal/diff/debug_enable.go | 2 +- .../google/go-cmp/cmp/internal/diff/diff.go | 50 +- .../google/go-cmp/cmp/internal/flags/flags.go | 2 +- .../cmp/internal/flags/toolchain_legacy.go | 2 +- .../cmp/internal/flags/toolchain_recent.go | 2 +- .../go-cmp/cmp/internal/function/func.go | 2 +- .../google/go-cmp/cmp/internal/value/name.go | 2 +- .../cmp/internal/value/pointer_purego.go | 2 +- .../cmp/internal/value/pointer_unsafe.go | 2 +- .../google/go-cmp/cmp/internal/value/sort.go | 2 +- .../google/go-cmp/cmp/internal/value/zero.go | 2 +- .../github.com/google/go-cmp/cmp/options.go | 2 +- vendor/github.com/google/go-cmp/cmp/path.go | 2 +- vendor/github.com/google/go-cmp/cmp/report.go | 2 +- .../google/go-cmp/cmp/report_compare.go | 2 +- .../google/go-cmp/cmp/report_references.go | 2 +- .../google/go-cmp/cmp/report_reflect.go | 4 +- .../google/go-cmp/cmp/report_slices.go | 2 +- .../google/go-cmp/cmp/report_text.go | 2 +- .../google/go-cmp/cmp/report_value.go | 2 +- vendor/github.com/google/shlex/COPYING | 202 + vendor/github.com/google/shlex/README | 2 + vendor/github.com/google/shlex/go.mod | 3 + vendor/github.com/google/shlex/shlex.go | 416 + .../client/api/go-client/block_volume.go | 53 + .../heketi/client/api/go-client/brick.go | 72 + .../heketi/client/api/go-client/client.go | 47 +- .../heketi/heketi/pkg/glusterfs/api/types.go | 48 +- .../heketi/heketi/pkg/utils/bodystring.go | 20 +- .../go-windows-terminal-sequences/LICENSE | 9 - .../go-windows-terminal-sequences/README.md | 42 - .../go-windows-terminal-sequences/go.mod | 1 - .../sequences.go | 35 - .../sequences_dummy.go | 11 - vendor/github.com/miekg/dns/.travis.yml | 11 +- vendor/github.com/miekg/dns/CODEOWNERS | 1 + vendor/github.com/miekg/dns/Gopkg.lock | 57 - vendor/github.com/miekg/dns/Gopkg.toml | 38 - vendor/github.com/miekg/dns/LICENSE | 6 +- vendor/github.com/miekg/dns/README.md | 19 +- vendor/github.com/miekg/dns/acceptfunc.go | 21 +- vendor/github.com/miekg/dns/client.go | 199 +- vendor/github.com/miekg/dns/clientconfig.go | 8 +- vendor/github.com/miekg/dns/defaults.go | 32 +- vendor/github.com/miekg/dns/dns.go | 4 +- vendor/github.com/miekg/dns/dnssec.go | 126 +- vendor/github.com/miekg/dns/dnssec_keygen.go | 46 +- vendor/github.com/miekg/dns/dnssec_keyscan.go | 70 +- vendor/github.com/miekg/dns/dnssec_privkey.go | 33 +- vendor/github.com/miekg/dns/doc.go | 13 +- vendor/github.com/miekg/dns/duplicate.go | 11 +- vendor/github.com/miekg/dns/edns.go | 54 +- vendor/github.com/miekg/dns/format.go | 6 + vendor/github.com/miekg/dns/fuzz.go | 11 +- vendor/github.com/miekg/dns/generate.go | 35 +- vendor/github.com/miekg/dns/go.mod | 11 + vendor/github.com/miekg/dns/go.sum | 39 + vendor/github.com/miekg/dns/labels.go | 66 +- vendor/github.com/miekg/dns/msg.go | 129 +- vendor/github.com/miekg/dns/msg_helpers.go | 364 +- vendor/github.com/miekg/dns/msg_truncate.go | 112 + vendor/github.com/miekg/dns/nsecx.go | 2 +- vendor/github.com/miekg/dns/privaterr.go | 39 +- vendor/github.com/miekg/dns/scan.go | 231 +- vendor/github.com/miekg/dns/scan_rr.go | 1141 +- vendor/github.com/miekg/dns/serve_mux.go | 37 +- vendor/github.com/miekg/dns/server.go | 346 +- vendor/github.com/miekg/dns/sig0.go | 22 +- vendor/github.com/miekg/dns/svcb.go | 744 + vendor/github.com/miekg/dns/tsig.go | 94 +- vendor/github.com/miekg/dns/types.go | 235 +- vendor/github.com/miekg/dns/version.go | 8 +- vendor/github.com/miekg/dns/xfr.go | 18 +- vendor/github.com/miekg/dns/zduplicate.go | 243 +- vendor/github.com/miekg/dns/zmsg.go | 101 + vendor/github.com/miekg/dns/ztypes.go | 87 +- .../spdystream/CONTRIBUTING.md | 0 vendor/github.com/moby/spdystream/LICENSE | 202 + vendor/github.com/moby/spdystream/MAINTAINERS | 40 + vendor/github.com/moby/spdystream/NOTICE | 5 + vendor/github.com/moby/spdystream/README.md | 77 + .../{docker => moby}/spdystream/connection.go | 46 +- vendor/github.com/moby/spdystream/go.mod | 5 + vendor/github.com/moby/spdystream/go.sum | 2 + vendor/github.com/moby/spdystream/handlers.go | 52 + vendor/github.com/moby/spdystream/priority.go | 114 + .../spdystream/spdy/dictionary.go | 16 + .../{docker => moby}/spdystream/spdy/read.go | 16 + .../github.com/moby/spdystream/spdy/types.go | 291 + .../{docker => moby}/spdystream/spdy/write.go | 16 + .../{docker => moby}/spdystream/stream.go | 18 +- vendor/github.com/moby/spdystream/utils.go | 32 + vendor/github.com/moby/sys/mount/LICENSE | 202 + vendor/github.com/moby/sys/mount/doc.go | 4 + vendor/github.com/moby/sys/mount/flags_bsd.go | 45 + .../pkg => moby/sys}/mount/flags_linux.go | 2 +- .../github.com/moby/sys/mount/flags_unix.go | 139 + vendor/github.com/moby/sys/mount/go.mod | 8 + vendor/github.com/moby/sys/mount/go.sum | 5 + .../github.com/moby/sys/mount/mount_errors.go | 46 + .../github.com/moby/sys/mount/mount_unix.go | 87 + .../github.com/moby/sys/mount/mounter_bsd.go | 61 + .../pkg => moby/sys}/mount/mounter_linux.go | 2 +- .../moby/sys/mount/mounter_unsupported.go | 7 + .../sys}/mount/sharedsubtree_linux.go | 6 +- vendor/github.com/moby/sys/mountinfo/doc.go | 44 + vendor/github.com/moby/sys/mountinfo/go.mod | 2 + vendor/github.com/moby/sys/mountinfo/go.sum | 2 + .../moby/sys/mountinfo/mounted_linux.go | 58 + .../moby/sys/mountinfo/mounted_unix.go | 66 + .../moby/sys/mountinfo/mountinfo.go | 42 +- .../moby/sys/mountinfo/mountinfo_bsd.go | 67 + .../moby/sys/mountinfo/mountinfo_filters.go | 26 +- .../moby/sys/mountinfo/mountinfo_freebsd.go | 53 - .../moby/sys/mountinfo/mountinfo_linux.go | 134 +- .../sys/mountinfo/mountinfo_unsupported.go | 11 +- .../moby/sys/mountinfo/mountinfo_windows.go | 6 +- vendor/github.com/moby/term/.gitignore | 30 +- vendor/github.com/moby/term/README.md | 36 + vendor/github.com/moby/term/ascii.go | 2 +- vendor/github.com/moby/term/go.mod | 9 +- vendor/github.com/moby/term/go.sum | 28 +- vendor/github.com/moby/term/proxy.go | 78 +- vendor/github.com/moby/term/tc.go | 19 +- vendor/github.com/moby/term/term.go | 20 +- vendor/github.com/moby/term/term_windows.go | 92 +- vendor/github.com/moby/term/termios.go | 35 + vendor/github.com/moby/term/termios_bsd.go | 32 +- vendor/github.com/moby/term/termios_linux.go | 39 - vendor/github.com/moby/term/termios_nonbsd.go | 12 + .../moby/term/windows/ansi_reader.go | 21 +- .../moby/term/windows/ansi_writer.go | 12 +- .../github.com/moby/term/windows/console.go | 16 +- vendor/github.com/moby/term/windows/doc.go | 5 + .../github.com/moby/term/windows/windows.go | 34 - vendor/github.com/moby/term/winsize.go | 2 +- .../monochromegane/go-gitignore/.travis.yml | 6 + .../monochromegane/go-gitignore/LICENSE | 21 + .../monochromegane/go-gitignore/README.md | 95 + .../go-gitignore/depth_holder.go | 79 + .../go-gitignore/full_scan_patterns.go | 31 + .../monochromegane/go-gitignore/gitignore.go | 80 + .../go-gitignore/index_scan_patterns.go | 35 + .../go-gitignore/initial_holder.go | 62 + .../monochromegane/go-gitignore/match.go | 24 + .../monochromegane/go-gitignore/pattern.go | 69 + .../monochromegane/go-gitignore/patterns.go | 22 + .../monochromegane/go-gitignore/util.go | 45 + .../github.com/mrunalp/fileutils/fileutils.go | 38 +- vendor/github.com/mrunalp/fileutils/go.mod | 3 + .../runc/libcontainer/README.md | 162 +- .../runc/libcontainer/apparmor/apparmor.go | 60 - .../apparmor/apparmor_disabled.go | 20 - .../libcontainer/apparmor/apparmor_linux.go | 54 + .../apparmor/apparmor_unsupported.go | 20 + .../libcontainer/capabilities/capabilities.go | 96 + .../capabilities/capabilities_unsupported.go | 3 + .../runc/libcontainer/capabilities_linux.go | 117 - .../cgroups/devices/devices_emulator.go | 50 +- .../cgroups/ebpf/devicefilter/devicefilter.go | 22 +- .../runc/libcontainer/cgroups/fs/blkio.go | 180 +- .../runc/libcontainer/cgroups/fs/cpu.go | 3 +- .../runc/libcontainer/cgroups/fs/cpuacct.go | 14 +- .../runc/libcontainer/cgroups/fs/cpuset.go | 188 +- .../runc/libcontainer/cgroups/fs/devices.go | 11 +- .../runc/libcontainer/cgroups/fs/freezer.go | 49 +- .../runc/libcontainer/cgroups/fs/fs.go | 89 +- .../runc/libcontainer/cgroups/fs/hugetlb.go | 9 +- .../runc/libcontainer/cgroups/fs/kmem.go | 6 +- .../runc/libcontainer/cgroups/fs/memory.go | 124 +- .../runc/libcontainer/cgroups/fs/name.go | 2 +- .../runc/libcontainer/cgroups/fs2/cpu.go | 3 +- .../runc/libcontainer/cgroups/fs2/create.go | 35 +- .../runc/libcontainer/cgroups/fs2/devices.go | 5 +- .../runc/libcontainer/cgroups/fs2/freezer.go | 2 +- .../runc/libcontainer/cgroups/fs2/fs2.go | 79 +- .../runc/libcontainer/cgroups/fs2/hugetlb.go | 21 +- .../runc/libcontainer/cgroups/fs2/io.go | 4 +- .../runc/libcontainer/cgroups/fs2/memory.go | 10 +- .../runc/libcontainer/cgroups/fs2/pids.go | 7 +- .../libcontainer/cgroups/fscommon/fscommon.go | 35 +- .../libcontainer/cgroups/fscommon/open.go | 103 + .../libcontainer/cgroups/fscommon/utils.go | 57 +- .../runc/libcontainer/cgroups/stats.go | 28 + .../libcontainer/cgroups/systemd/common.go | 118 +- .../libcontainer/cgroups/systemd/cpuset.go | 67 + .../runc/libcontainer/cgroups/systemd/user.go | 4 +- .../runc/libcontainer/cgroups/systemd/v1.go | 136 +- .../runc/libcontainer/cgroups/systemd/v2.go | 143 + .../runc/libcontainer/cgroups/utils.go | 135 +- .../runc/libcontainer/cgroups/v1_utils.go | 100 +- .../runc/libcontainer/configs/cgroup_linux.go | 6 +- .../runc/libcontainer/configs/config.go | 6 +- .../runc/libcontainer/configs/device.go | 170 - .../libcontainer/configs/device_windows.go | 5 - .../runc/libcontainer/configs/devices.go | 17 + .../libcontainer/configs/namespaces_linux.go | 2 +- .../configs/validate/validator.go | 87 +- .../runc/libcontainer/container_linux.go | 133 +- .../runc/libcontainer/criu_opts_linux.go | 12 +- .../runc/libcontainer/devices/device.go | 170 + .../{configs => devices}/device_unix.go | 4 +- .../libcontainer/devices/device_windows.go | 5 + .../runc/libcontainer/devices/devices.go | 112 + .../runc/libcontainer/factory_linux.go | 43 +- .../runc/libcontainer/init_linux.go | 34 +- .../runc/libcontainer/intelrdt/cmt.go | 11 +- .../runc/libcontainer/intelrdt/intelrdt.go | 244 +- .../runc/libcontainer/intelrdt/mbm.go | 1 + .../runc/libcontainer/intelrdt/monitoring.go | 5 +- .../runc/libcontainer/intelrdt/stats.go | 6 +- .../runc/libcontainer/network_linux.go | 4 +- .../runc/libcontainer/process_linux.go | 47 +- .../runc/libcontainer/rootfs_linux.go | 152 +- .../runc/libcontainer/seccomp/config.go | 6 +- .../seccomp/patchbpf/enosys_linux.go | 628 + .../seccomp/patchbpf/enosys_unsupported.go | 3 + .../libcontainer/seccomp/seccomp_linux.go | 22 +- .../seccomp/seccomp_unsupported.go | 5 + .../runc/libcontainer/setns_init_linux.go | 3 +- .../runc/libcontainer/standard_init_linux.go | 6 +- .../runc/libcontainer/state_linux.go | 3 +- .../runc/libcontainer/system/proc.go | 10 - .../runc/libcontainer/user/lookup_windows.go | 6 +- .../runc/libcontainer/user/user.go | 4 +- .../runc/libcontainer/utils/utils.go | 19 +- .../opencontainers/runc/types/events.go | 15 + .../runtime-spec/specs-go/config.go | 10 +- .../opencontainers/selinux/go-selinux/doc.go | 3 - .../selinux/go-selinux/label/label_linux.go | 190 + .../selinux/go-selinux/label/label_selinux.go | 193 - .../selinux/go-selinux/label/label_stub.go | 2 +- .../selinux/go-selinux/selinux.go | 41 +- .../selinux/go-selinux/selinux_linux.go | 224 +- .../selinux/go-selinux/selinux_stub.go | 6 +- .../selinux/go-selinux/xattrs.go | 30 - .../selinux/go-selinux/xattrs_linux.go | 38 + .../opencontainers/selinux/pkg/pwalk/pwalk.go | 17 +- ...er.openshift.io_deprecatedapirequests.yaml | 247 - .../openshift/api/apiserver/v1/register.go | 2 - .../v1/types_deprecatedapirequest.go | 114 - .../api/apiserver/v1/zz_generated.deepcopy.go | 192 - .../v1/zz_generated.swagger_doc_generated.go | 77 - .../v1/001-cloudprivateipconfig.crd.yaml | 4 +- .../api/cloudnetwork/v1/generated.proto | 2 +- .../openshift/api/cloudnetwork/v1/types.go | 2 +- .../0000_10-helm-chart-repository.crd.yaml | 299 +- .../imagereferencemutators/pods.go | 9 - .../sccadmission/admission.go | 12 +- .../sccmatching/provider.go | 31 +- .../openshift/build-machinery-go/Makefile | 2 +- .../openshift/build-machinery-go/README.md | 2 +- .../make/default.example.mk.help.log | 1 + .../make/golang.example.mk.help.log | 1 + .../build-machinery-go/make/golang.mk | 1 + .../make/operator.example.mk.help.log | 1 + .../make/targets/golang/version.mk | 65 + .../openshift/operator/profile-manifests.mk | 2 + .../typed/apiserver/v1/apiserver_client.go | 5 - .../apiserver/v1/deprecatedapirequest.go | 168 - .../typed/apiserver/v1/generated_expansion.go | 2 - .../hardcodedauthorizer/metrics.go | 38 + .../library-go/pkg/config/client/transport.go | 91 + .../library-go/pkg/config/serving/server.go | 9 +- .../pkg/controller/controllercmd/builder.go | 49 +- .../pkg/controller/factory/base_controller.go | 57 +- .../pkg/controller/factory/factory.go | 6 + .../pkg/image/dockerv1client/client.go | 1091 - .../resource/resourceapply/generic.go | 88 +- .../resource/resourceapply/monitoring.go | 84 +- .../resource/resourceapply/unstructured.go | 24 + .../resource/resourceread/admission.go | 35 + .../resourceread/credentialsrequest.go | 14 - .../operator/resource/resourceread/route.go | 26 + .../operator/resource/resourceread/storage.go | 8 + .../resource/resourceread/unstructured.go | 18 + .../library-go/pkg/operator/v1helpers/args.go | 61 + .../pkg/operator/v1helpers/helpers.go | 37 + .../pkg/operator/v1helpers/test_helpers.go | 14 +- .../library-go/pkg/serviceability/panic.go | 17 - .../library-go/pkg/serviceability/sentry.go | 62 - .../sergi/go-diff/diffmatchpatch/diff.go | 141 +- .../diffmatchpatch/operation_string.go | 17 + vendor/github.com/sirupsen/logrus/.gitignore | 2 + .../github.com/sirupsen/logrus/buffer_pool.go | 52 + vendor/github.com/sirupsen/logrus/entry.go | 14 +- vendor/github.com/sirupsen/logrus/exported.go | 45 + vendor/github.com/sirupsen/logrus/go.mod | 3 +- vendor/github.com/sirupsen/logrus/go.sum | 6 +- vendor/github.com/sirupsen/logrus/logger.go | 54 +- .../sirupsen/logrus/terminal_check_windows.go | 29 +- .../syndtr/gocapability/capability/enum.go | 45 +- .../gocapability/capability/enum_gen.go | 9 + vendor/github.com/willf/bitset/Makefile | 191 - vendor/github.com/willf/bitset/README.md | 20 +- vendor/github.com/willf/bitset/bitset.go | 72 +- vendor/github.com/willf/bitset/go.mod | 3 + .../.gitmodules => willf/bitset/go.sum} | 0 vendor/github.com/xlab/treeprint/LICENSE | 20 + vendor/github.com/xlab/treeprint/README.md | 128 + vendor/github.com/xlab/treeprint/helpers.go | 47 + vendor/github.com/xlab/treeprint/struct.go | 322 + vendor/github.com/xlab/treeprint/treeprint.go | 215 + vendor/go.starlark.net/LICENSE | 29 + .../internal/compile/compile.go | 1903 + .../internal/compile/serial.go | 389 + .../go.starlark.net/internal/spell/spell.go | 115 + vendor/go.starlark.net/resolve/binding.go | 74 + vendor/go.starlark.net/resolve/resolve.go | 978 + vendor/go.starlark.net/starlark/debug.go | 42 + vendor/go.starlark.net/starlark/empty.s | 3 + vendor/go.starlark.net/starlark/eval.go | 1497 + vendor/go.starlark.net/starlark/hashtable.go | 373 + vendor/go.starlark.net/starlark/int.go | 350 + vendor/go.starlark.net/starlark/interp.go | 637 + vendor/go.starlark.net/starlark/library.go | 2104 + vendor/go.starlark.net/starlark/profile.go | 449 + vendor/go.starlark.net/starlark/unpack.go | 258 + vendor/go.starlark.net/starlark/value.go | 1293 + .../go.starlark.net/starlarkstruct/module.go | 43 + .../go.starlark.net/starlarkstruct/struct.go | 281 + vendor/go.starlark.net/syntax/grammar.txt | 129 + vendor/go.starlark.net/syntax/parse.go | 1029 + vendor/go.starlark.net/syntax/quote.go | 269 + vendor/go.starlark.net/syntax/scan.go | 1089 + vendor/go.starlark.net/syntax/syntax.go | 529 + vendor/go.starlark.net/syntax/walk.go | 163 + .../x/crypto/chacha20/chacha_arm64.go | 3 +- .../x/crypto/chacha20/chacha_arm64.s | 2 +- .../x/crypto/chacha20/chacha_noasm.go | 3 +- .../x/crypto/chacha20/chacha_ppc64le.go | 3 +- .../x/crypto/chacha20/chacha_ppc64le.s | 2 +- .../x/crypto/chacha20/chacha_s390x.go | 3 +- .../x/crypto/chacha20/chacha_s390x.s | 2 +- .../x/crypto/curve25519/curve25519_amd64.go | 3 +- .../x/crypto/curve25519/curve25519_amd64.s | 2 +- .../x/crypto/curve25519/curve25519_noasm.go | 3 +- vendor/golang.org/x/crypto/ed25519/ed25519.go | 1 + .../x/crypto/ed25519/ed25519_go113.go | 1 + .../x/crypto/internal/subtle/aliasing.go | 3 +- .../internal/subtle/aliasing_appengine.go | 35 - .../crypto/internal/subtle/aliasing_purego.go | 36 + .../x/crypto/poly1305/bits_compat.go | 1 + .../x/crypto/poly1305/bits_go1.13.go | 1 + .../golang.org/x/crypto/poly1305/mac_noasm.go | 3 +- .../golang.org/x/crypto/poly1305/sum_amd64.go | 3 +- .../golang.org/x/crypto/poly1305/sum_amd64.s | 2 +- .../x/crypto/poly1305/sum_ppc64le.go | 3 +- .../x/crypto/poly1305/sum_ppc64le.s | 2 +- .../golang.org/x/crypto/poly1305/sum_s390x.go | 3 +- .../golang.org/x/crypto/poly1305/sum_s390x.s | 2 +- .../x/crypto/salsa20/salsa/salsa20_amd64.go | 3 +- .../x/crypto/salsa20/salsa/salsa20_amd64.s | 237 +- .../x/crypto/salsa20/salsa/salsa20_noasm.go | 3 +- vendor/golang.org/x/crypto/ssh/client_auth.go | 2 +- vendor/golang.org/x/crypto/ssh/server.go | 4 + .../golang.org/x/crypto/ssh/terminal/util.go | 114 - .../x/crypto/ssh/terminal/util_aix.go | 12 - .../x/crypto/ssh/terminal/util_bsd.go | 12 - .../x/crypto/ssh/terminal/util_linux.go | 10 - .../x/crypto/ssh/terminal/util_plan9.go | 58 - .../x/crypto/ssh/terminal/util_solaris.go | 124 - .../x/crypto/ssh/terminal/util_windows.go | 105 - vendor/golang.org/x/net/context/go17.go | 1 + vendor/golang.org/x/net/context/go19.go | 1 + vendor/golang.org/x/net/context/pre_go17.go | 1 + vendor/golang.org/x/net/context/pre_go19.go | 1 + vendor/golang.org/x/net/http2/go111.go | 1 + vendor/golang.org/x/net/http2/not_go111.go | 1 + vendor/golang.org/x/net/http2/transport.go | 4 +- vendor/golang.org/x/net/idna/idna10.0.0.go | 1 + vendor/golang.org/x/net/idna/idna9.0.0.go | 1 + vendor/golang.org/x/net/idna/tables10.0.0.go | 1 + vendor/golang.org/x/net/idna/tables11.0.0.go | 1 + vendor/golang.org/x/net/idna/tables12.0.0.go | 1 + vendor/golang.org/x/net/idna/tables13.0.0.go | 1 + vendor/golang.org/x/net/idna/tables9.0.0.go | 1 + .../x/net/internal/socket/cmsghdr.go | 1 + .../x/net/internal/socket/cmsghdr_bsd.go | 1 + .../internal/socket/cmsghdr_linux_32bit.go | 1 + .../internal/socket/cmsghdr_linux_64bit.go | 1 + .../internal/socket/cmsghdr_solaris_64bit.go | 4 +- .../x/net/internal/socket/cmsghdr_stub.go | 1 + .../x/net/internal/socket/cmsghdr_unix.go | 1 + .../x/net/internal/socket/error_unix.go | 1 + .../x/net/internal/socket/iovec_32bit.go | 1 + .../x/net/internal/socket/iovec_64bit.go | 1 + .../internal/socket/iovec_solaris_64bit.go | 4 +- .../x/net/internal/socket/iovec_stub.go | 1 + .../x/net/internal/socket/mmsghdr_stub.go | 1 + .../x/net/internal/socket/mmsghdr_unix.go | 1 + .../x/net/internal/socket/msghdr_bsd.go | 1 + .../x/net/internal/socket/msghdr_bsdvar.go | 1 + .../net/internal/socket/msghdr_linux_32bit.go | 1 + .../net/internal/socket/msghdr_linux_64bit.go | 1 + .../internal/socket/msghdr_solaris_64bit.go | 4 +- .../x/net/internal/socket/msghdr_stub.go | 1 + .../x/net/internal/socket/msghdr_zos_s390x.go | 4 +- .../x/net/internal/socket/norace.go | 1 + .../golang.org/x/net/internal/socket/race.go | 1 + .../x/net/internal/socket/rawconn_mmsg.go | 1 + .../x/net/internal/socket/rawconn_msg.go | 6 +- .../x/net/internal/socket/rawconn_nommsg.go | 1 + .../x/net/internal/socket/rawconn_nomsg.go | 1 + .../x/net/internal/socket/sys_bsd.go | 1 + .../x/net/internal/socket/sys_const_unix.go | 1 + .../x/net/internal/socket/sys_const_zos.go | 1 + .../x/net/internal/socket/sys_linkname.go | 1 + .../x/net/internal/socket/sys_linux.go | 1 + .../net/internal/socket/sys_linux_riscv64.go | 1 + .../x/net/internal/socket/sys_posix.go | 1 + .../x/net/internal/socket/sys_stub.go | 1 + .../x/net/internal/socket/sys_unix.go | 1 + .../x/net/internal/socket/zsys_aix_ppc64.go | 1 + .../net/internal/socket/zsys_linux_riscv64.go | 1 + .../internal/socket/zsys_openbsd_mips64.go | 50 + vendor/golang.org/x/net/ipv4/control_bsd.go | 1 + .../golang.org/x/net/ipv4/control_pktinfo.go | 1 + vendor/golang.org/x/net/ipv4/control_stub.go | 1 + vendor/golang.org/x/net/ipv4/control_unix.go | 1 + vendor/golang.org/x/net/ipv4/icmp_stub.go | 1 + vendor/golang.org/x/net/ipv4/payload_cmsg.go | 1 + .../golang.org/x/net/ipv4/payload_nocmsg.go | 1 + vendor/golang.org/x/net/ipv4/sockopt_posix.go | 1 + vendor/golang.org/x/net/ipv4/sockopt_stub.go | 1 + vendor/golang.org/x/net/ipv4/sys_aix.go | 1 + vendor/golang.org/x/net/ipv4/sys_asmreq.go | 1 + .../golang.org/x/net/ipv4/sys_asmreq_stub.go | 1 + vendor/golang.org/x/net/ipv4/sys_asmreqn.go | 1 + .../golang.org/x/net/ipv4/sys_asmreqn_stub.go | 1 + vendor/golang.org/x/net/ipv4/sys_bpf.go | 1 + vendor/golang.org/x/net/ipv4/sys_bpf_stub.go | 1 + vendor/golang.org/x/net/ipv4/sys_bsd.go | 1 + vendor/golang.org/x/net/ipv4/sys_ssmreq.go | 1 + .../golang.org/x/net/ipv4/sys_ssmreq_stub.go | 1 + vendor/golang.org/x/net/ipv4/sys_stub.go | 1 + .../golang.org/x/net/ipv4/zsys_aix_ppc64.go | 1 + .../x/net/ipv4/zsys_linux_riscv64.go | 1 + .../x/net/ipv6/control_rfc2292_unix.go | 1 + .../x/net/ipv6/control_rfc3542_unix.go | 1 + vendor/golang.org/x/net/ipv6/control_stub.go | 1 + vendor/golang.org/x/net/ipv6/control_unix.go | 1 + vendor/golang.org/x/net/ipv6/icmp_bsd.go | 1 + vendor/golang.org/x/net/ipv6/icmp_stub.go | 1 + vendor/golang.org/x/net/ipv6/payload_cmsg.go | 1 + .../golang.org/x/net/ipv6/payload_nocmsg.go | 1 + vendor/golang.org/x/net/ipv6/sockopt_posix.go | 1 + vendor/golang.org/x/net/ipv6/sockopt_stub.go | 1 + vendor/golang.org/x/net/ipv6/sys_aix.go | 1 + vendor/golang.org/x/net/ipv6/sys_asmreq.go | 1 + .../golang.org/x/net/ipv6/sys_asmreq_stub.go | 1 + vendor/golang.org/x/net/ipv6/sys_bpf.go | 1 + vendor/golang.org/x/net/ipv6/sys_bpf_stub.go | 1 + vendor/golang.org/x/net/ipv6/sys_bsd.go | 1 + vendor/golang.org/x/net/ipv6/sys_ssmreq.go | 1 + .../golang.org/x/net/ipv6/sys_ssmreq_stub.go | 1 + vendor/golang.org/x/net/ipv6/sys_stub.go | 1 + .../golang.org/x/net/ipv6/zsys_aix_ppc64.go | 1 + .../x/net/ipv6/zsys_linux_riscv64.go | 1 + vendor/golang.org/x/sys/cpu/cpu_aix.go | 1 + vendor/golang.org/x/sys/cpu/cpu_gc_arm64.go | 1 + vendor/golang.org/x/sys/cpu/cpu_gc_s390x.go | 1 + vendor/golang.org/x/sys/cpu/cpu_gc_x86.go | 1 + .../golang.org/x/sys/cpu/cpu_gccgo_arm64.go | 1 + .../golang.org/x/sys/cpu/cpu_gccgo_s390x.go | 1 + vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.go | 1 + vendor/golang.org/x/sys/cpu/cpu_linux.go | 1 + .../golang.org/x/sys/cpu/cpu_linux_mips64x.go | 1 + .../golang.org/x/sys/cpu/cpu_linux_noinit.go | 1 + .../golang.org/x/sys/cpu/cpu_linux_ppc64x.go | 1 + vendor/golang.org/x/sys/cpu/cpu_mips64x.go | 1 + vendor/golang.org/x/sys/cpu/cpu_mipsx.go | 1 + vendor/golang.org/x/sys/cpu/cpu_other_arm.go | 1 + .../golang.org/x/sys/cpu/cpu_other_arm64.go | 4 +- .../golang.org/x/sys/cpu/cpu_other_mips64x.go | 1 + vendor/golang.org/x/sys/cpu/cpu_ppc64x.go | 1 + vendor/golang.org/x/sys/cpu/cpu_riscv64.go | 1 + vendor/golang.org/x/sys/cpu/cpu_wasm.go | 1 + vendor/golang.org/x/sys/cpu/cpu_x86.go | 1 + .../golang.org/x/sys/cpu/syscall_aix_gccgo.go | 4 +- .../x/sys/cpu/syscall_aix_ppc64_gc.go | 4 +- vendor/golang.org/x/sys/execabs/execabs.go | 102 + vendor/golang.org/x/sys/plan9/asm.s | 8 + vendor/golang.org/x/sys/plan9/asm_plan9_386.s | 30 + .../golang.org/x/sys/plan9/asm_plan9_amd64.s | 30 + vendor/golang.org/x/sys/plan9/asm_plan9_arm.s | 25 + vendor/golang.org/x/sys/plan9/const_plan9.go | 70 + vendor/golang.org/x/sys/plan9/dir_plan9.go | 212 + vendor/golang.org/x/sys/plan9/env_plan9.go | 31 + vendor/golang.org/x/sys/plan9/errors_plan9.go | 50 + vendor/golang.org/x/sys/plan9/mkall.sh | 150 + vendor/golang.org/x/sys/plan9/mkerrors.sh | 246 + .../golang.org/x/sys/plan9/mksysnum_plan9.sh | 23 + .../golang.org/x/sys/plan9/pwd_go15_plan9.go | 21 + vendor/golang.org/x/sys/plan9/pwd_plan9.go | 23 + vendor/golang.org/x/sys/plan9/race.go | 30 + vendor/golang.org/x/sys/plan9/race0.go | 25 + vendor/golang.org/x/sys/plan9/str.go | 22 + vendor/golang.org/x/sys/plan9/syscall.go | 116 + .../golang.org/x/sys/plan9/syscall_plan9.go | 349 + .../x/sys/plan9/zsyscall_plan9_386.go | 284 + .../x/sys/plan9/zsyscall_plan9_amd64.go | 284 + .../x/sys/plan9/zsyscall_plan9_arm.go | 284 + .../golang.org/x/sys/plan9/zsysnum_plan9.go | 49 + vendor/golang.org/x/sys/unix/aliases.go | 3 +- vendor/golang.org/x/sys/unix/asm_zos_s390x.s | 426 + vendor/golang.org/x/sys/unix/cap_freebsd.go | 1 + vendor/golang.org/x/sys/unix/constants.go | 3 +- vendor/golang.org/x/sys/unix/dev_aix_ppc.go | 4 +- vendor/golang.org/x/sys/unix/dev_aix_ppc64.go | 4 +- vendor/golang.org/x/sys/unix/dev_zos.go | 29 + vendor/golang.org/x/sys/unix/dirent.go | 1 + vendor/golang.org/x/sys/unix/endian_big.go | 1 + vendor/golang.org/x/sys/unix/endian_little.go | 1 + vendor/golang.org/x/sys/unix/env_unix.go | 3 +- vendor/golang.org/x/sys/unix/epoll_zos.go | 221 + vendor/golang.org/x/sys/unix/fcntl.go | 1 + .../x/sys/unix/fcntl_linux_32bit.go | 1 + vendor/golang.org/x/sys/unix/fdset.go | 1 + vendor/golang.org/x/sys/unix/fstatfs_zos.go | 164 + vendor/golang.org/x/sys/unix/gccgo.go | 4 +- .../x/sys/unix/gccgo_linux_amd64.go | 1 + vendor/golang.org/x/sys/unix/ioctl.go | 1 + vendor/golang.org/x/sys/unix/ioctl_zos.go | 74 + vendor/golang.org/x/sys/unix/mkerrors.sh | 22 +- vendor/golang.org/x/sys/unix/pagesize_unix.go | 1 + vendor/golang.org/x/sys/unix/ptrace_darwin.go | 1 + vendor/golang.org/x/sys/unix/ptrace_ios.go | 1 + vendor/golang.org/x/sys/unix/race.go | 1 + vendor/golang.org/x/sys/unix/race0.go | 3 +- .../x/sys/unix/readdirent_getdents.go | 1 + .../x/sys/unix/readdirent_getdirentries.go | 1 + vendor/golang.org/x/sys/unix/sockcmsg_unix.go | 3 +- .../x/sys/unix/sockcmsg_unix_other.go | 7 +- vendor/golang.org/x/sys/unix/str.go | 1 + vendor/golang.org/x/sys/unix/syscall.go | 3 +- vendor/golang.org/x/sys/unix/syscall_aix.go | 11 +- .../golang.org/x/sys/unix/syscall_aix_ppc.go | 4 +- .../x/sys/unix/syscall_aix_ppc64.go | 4 +- vendor/golang.org/x/sys/unix/syscall_bsd.go | 9 +- .../x/sys/unix/syscall_darwin.1_12.go | 1 + .../x/sys/unix/syscall_darwin.1_13.go | 1 + .../golang.org/x/sys/unix/syscall_darwin.go | 19 +- .../x/sys/unix/syscall_darwin_386.go | 1 + .../x/sys/unix/syscall_darwin_amd64.go | 1 + .../x/sys/unix/syscall_darwin_arm64.go | 1 + .../x/sys/unix/syscall_darwin_libSystem.go | 1 + .../x/sys/unix/syscall_dragonfly.go | 18 +- .../x/sys/unix/syscall_dragonfly_amd64.go | 1 + .../golang.org/x/sys/unix/syscall_freebsd.go | 17 +- .../x/sys/unix/syscall_freebsd_386.go | 1 + .../x/sys/unix/syscall_freebsd_amd64.go | 1 + .../x/sys/unix/syscall_freebsd_arm.go | 1 + .../x/sys/unix/syscall_freebsd_arm64.go | 1 + .../golang.org/x/sys/unix/syscall_illumos.go | 1 + vendor/golang.org/x/sys/unix/syscall_linux.go | 107 +- .../x/sys/unix/syscall_linux_386.go | 7 +- .../x/sys/unix/syscall_linux_amd64.go | 3 +- .../x/sys/unix/syscall_linux_amd64_gc.go | 4 +- .../x/sys/unix/syscall_linux_arm.go | 11 +- .../x/sys/unix/syscall_linux_arm64.go | 3 +- .../golang.org/x/sys/unix/syscall_linux_gc.go | 1 + .../x/sys/unix/syscall_linux_gc_386.go | 1 + .../x/sys/unix/syscall_linux_gc_arm.go | 1 + .../x/sys/unix/syscall_linux_gccgo_386.go | 1 + .../x/sys/unix/syscall_linux_gccgo_arm.go | 1 + .../x/sys/unix/syscall_linux_mips64x.go | 3 +- .../x/sys/unix/syscall_linux_mipsx.go | 9 +- .../x/sys/unix/syscall_linux_ppc64x.go | 5 +- .../x/sys/unix/syscall_linux_riscv64.go | 3 +- .../x/sys/unix/syscall_linux_s390x.go | 3 +- .../x/sys/unix/syscall_linux_sparc64.go | 5 +- .../golang.org/x/sys/unix/syscall_netbsd.go | 21 +- .../x/sys/unix/syscall_netbsd_386.go | 1 + .../x/sys/unix/syscall_netbsd_amd64.go | 1 + .../x/sys/unix/syscall_netbsd_arm.go | 1 + .../x/sys/unix/syscall_netbsd_arm64.go | 1 + .../golang.org/x/sys/unix/syscall_openbsd.go | 4 +- .../x/sys/unix/syscall_openbsd_386.go | 1 + .../x/sys/unix/syscall_openbsd_amd64.go | 1 + .../x/sys/unix/syscall_openbsd_arm.go | 1 + .../x/sys/unix/syscall_openbsd_arm64.go | 1 + .../golang.org/x/sys/unix/syscall_solaris.go | 3 +- .../x/sys/unix/syscall_solaris_amd64.go | 1 + vendor/golang.org/x/sys/unix/syscall_unix.go | 1 + .../golang.org/x/sys/unix/syscall_unix_gc.go | 5 +- .../x/sys/unix/syscall_unix_gc_ppc64x.go | 1 + .../x/sys/unix/syscall_zos_s390x.go | 1781 + vendor/golang.org/x/sys/unix/timestruct.go | 3 +- vendor/golang.org/x/sys/unix/xattr_bsd.go | 1 + .../golang.org/x/sys/unix/zerrors_aix_ppc.go | 1 + .../x/sys/unix/zerrors_aix_ppc64.go | 1 + .../x/sys/unix/zerrors_darwin_386.go | 1 + .../x/sys/unix/zerrors_darwin_amd64.go | 63 +- .../x/sys/unix/zerrors_darwin_arm.go | 1 + .../x/sys/unix/zerrors_darwin_arm64.go | 63 +- .../x/sys/unix/zerrors_dragonfly_amd64.go | 1 + .../x/sys/unix/zerrors_freebsd_386.go | 7 + .../x/sys/unix/zerrors_freebsd_amd64.go | 7 + .../x/sys/unix/zerrors_freebsd_arm.go | 7 + .../x/sys/unix/zerrors_freebsd_arm64.go | 7 + vendor/golang.org/x/sys/unix/zerrors_linux.go | 23 +- .../x/sys/unix/zerrors_linux_386.go | 11 + .../x/sys/unix/zerrors_linux_amd64.go | 11 + .../x/sys/unix/zerrors_linux_arm.go | 11 + .../x/sys/unix/zerrors_linux_arm64.go | 12 + .../x/sys/unix/zerrors_linux_mips.go | 11 + .../x/sys/unix/zerrors_linux_mips64.go | 11 + .../x/sys/unix/zerrors_linux_mips64le.go | 11 + .../x/sys/unix/zerrors_linux_mipsle.go | 11 + .../x/sys/unix/zerrors_linux_ppc64.go | 11 + .../x/sys/unix/zerrors_linux_ppc64le.go | 11 + .../x/sys/unix/zerrors_linux_riscv64.go | 11 + .../x/sys/unix/zerrors_linux_s390x.go | 11 + .../x/sys/unix/zerrors_linux_sparc64.go | 11 + .../x/sys/unix/zerrors_netbsd_386.go | 1 + .../x/sys/unix/zerrors_netbsd_amd64.go | 1 + .../x/sys/unix/zerrors_netbsd_arm.go | 1 + .../x/sys/unix/zerrors_netbsd_arm64.go | 1 + .../x/sys/unix/zerrors_openbsd_386.go | 1 + .../x/sys/unix/zerrors_openbsd_amd64.go | 1 + .../x/sys/unix/zerrors_openbsd_arm.go | 1 + .../x/sys/unix/zerrors_openbsd_arm64.go | 1 + .../x/sys/unix/zerrors_openbsd_mips64.go | 1 + .../x/sys/unix/zerrors_solaris_amd64.go | 1 + .../x/sys/unix/zerrors_zos_s390x.go | 831 + .../x/sys/unix/zptrace_armnn_linux.go | 1 + .../x/sys/unix/zptrace_mipsnn_linux.go | 1 + .../x/sys/unix/zptrace_mipsnnle_linux.go | 1 + .../x/sys/unix/zptrace_x86_linux.go | 1 + .../golang.org/x/sys/unix/zsyscall_aix_ppc.go | 1 + .../x/sys/unix/zsyscall_aix_ppc64.go | 1 + .../x/sys/unix/zsyscall_aix_ppc64_gc.go | 4 +- .../x/sys/unix/zsyscall_aix_ppc64_gccgo.go | 4 +- .../x/sys/unix/zsyscall_darwin_386.1_13.go | 1 + .../x/sys/unix/zsyscall_darwin_386.go | 1 + .../x/sys/unix/zsyscall_darwin_amd64.1_13.go | 1 + .../x/sys/unix/zsyscall_darwin_amd64.go | 1 + .../x/sys/unix/zsyscall_darwin_arm.1_13.go | 1 + .../x/sys/unix/zsyscall_darwin_arm.go | 1 + .../x/sys/unix/zsyscall_darwin_arm64.1_13.go | 1 + .../x/sys/unix/zsyscall_darwin_arm64.go | 1 + .../x/sys/unix/zsyscall_dragonfly_amd64.go | 7 +- .../x/sys/unix/zsyscall_freebsd_386.go | 1 + .../x/sys/unix/zsyscall_freebsd_amd64.go | 1 + .../x/sys/unix/zsyscall_freebsd_arm.go | 1 + .../x/sys/unix/zsyscall_freebsd_arm64.go | 1 + .../x/sys/unix/zsyscall_illumos_amd64.go | 1 + .../golang.org/x/sys/unix/zsyscall_linux.go | 1 + .../x/sys/unix/zsyscall_linux_386.go | 1 + .../x/sys/unix/zsyscall_linux_amd64.go | 1 + .../x/sys/unix/zsyscall_linux_arm.go | 1 + .../x/sys/unix/zsyscall_linux_arm64.go | 1 + .../x/sys/unix/zsyscall_linux_mips.go | 1 + .../x/sys/unix/zsyscall_linux_mips64.go | 1 + .../x/sys/unix/zsyscall_linux_mips64le.go | 1 + .../x/sys/unix/zsyscall_linux_mipsle.go | 1 + .../x/sys/unix/zsyscall_linux_ppc64.go | 1 + .../x/sys/unix/zsyscall_linux_ppc64le.go | 1 + .../x/sys/unix/zsyscall_linux_riscv64.go | 1 + .../x/sys/unix/zsyscall_linux_s390x.go | 1 + .../x/sys/unix/zsyscall_linux_sparc64.go | 1 + .../x/sys/unix/zsyscall_netbsd_386.go | 11 + .../x/sys/unix/zsyscall_netbsd_amd64.go | 11 + .../x/sys/unix/zsyscall_netbsd_arm.go | 11 + .../x/sys/unix/zsyscall_netbsd_arm64.go | 11 + .../x/sys/unix/zsyscall_openbsd_386.go | 1 + .../x/sys/unix/zsyscall_openbsd_amd64.go | 1 + .../x/sys/unix/zsyscall_openbsd_arm.go | 1 + .../x/sys/unix/zsyscall_openbsd_arm64.go | 1 + .../x/sys/unix/zsyscall_openbsd_mips64.go | 1 + .../x/sys/unix/zsyscall_solaris_amd64.go | 15 + .../x/sys/unix/zsyscall_zos_s390x.go | 1217 + .../x/sys/unix/zsysctl_openbsd_386.go | 1 + .../x/sys/unix/zsysctl_openbsd_amd64.go | 1 + .../x/sys/unix/zsysctl_openbsd_arm.go | 1 + .../x/sys/unix/zsysctl_openbsd_arm64.go | 1 + .../x/sys/unix/zsysctl_openbsd_mips64.go | 1 + .../x/sys/unix/zsysnum_darwin_386.go | 1 + .../x/sys/unix/zsysnum_darwin_amd64.go | 1 + .../x/sys/unix/zsysnum_darwin_arm.go | 1 + .../x/sys/unix/zsysnum_darwin_arm64.go | 1 + .../x/sys/unix/zsysnum_dragonfly_amd64.go | 1 + .../x/sys/unix/zsysnum_freebsd_386.go | 1 + .../x/sys/unix/zsysnum_freebsd_amd64.go | 1 + .../x/sys/unix/zsysnum_freebsd_arm.go | 1 + .../x/sys/unix/zsysnum_freebsd_arm64.go | 1 + .../x/sys/unix/zsysnum_linux_386.go | 2 + .../x/sys/unix/zsysnum_linux_amd64.go | 2 + .../x/sys/unix/zsysnum_linux_arm.go | 2 + .../x/sys/unix/zsysnum_linux_arm64.go | 2 + .../x/sys/unix/zsysnum_linux_mips.go | 2 + .../x/sys/unix/zsysnum_linux_mips64.go | 2 + .../x/sys/unix/zsysnum_linux_mips64le.go | 2 + .../x/sys/unix/zsysnum_linux_mipsle.go | 2 + .../x/sys/unix/zsysnum_linux_ppc64.go | 2 + .../x/sys/unix/zsysnum_linux_ppc64le.go | 2 + .../x/sys/unix/zsysnum_linux_riscv64.go | 2 + .../x/sys/unix/zsysnum_linux_s390x.go | 2 + .../x/sys/unix/zsysnum_linux_sparc64.go | 2 + .../x/sys/unix/zsysnum_netbsd_386.go | 1 + .../x/sys/unix/zsysnum_netbsd_amd64.go | 1 + .../x/sys/unix/zsysnum_netbsd_arm.go | 1 + .../x/sys/unix/zsysnum_netbsd_arm64.go | 1 + .../x/sys/unix/zsysnum_openbsd_386.go | 1 + .../x/sys/unix/zsysnum_openbsd_amd64.go | 1 + .../x/sys/unix/zsysnum_openbsd_arm.go | 1 + .../x/sys/unix/zsysnum_openbsd_arm64.go | 1 + .../x/sys/unix/zsysnum_openbsd_mips64.go | 1 + .../x/sys/unix/zsysnum_zos_s390x.go | 2670 + .../golang.org/x/sys/unix/ztypes_aix_ppc.go | 1 + .../golang.org/x/sys/unix/ztypes_aix_ppc64.go | 1 + .../x/sys/unix/ztypes_darwin_386.go | 1 + .../x/sys/unix/ztypes_darwin_amd64.go | 9 + .../x/sys/unix/ztypes_darwin_arm.go | 1 + .../x/sys/unix/ztypes_darwin_arm64.go | 9 + .../x/sys/unix/ztypes_dragonfly_amd64.go | 1 + .../x/sys/unix/ztypes_freebsd_386.go | 10 + .../x/sys/unix/ztypes_freebsd_amd64.go | 10 + .../x/sys/unix/ztypes_freebsd_arm.go | 10 + .../x/sys/unix/ztypes_freebsd_arm64.go | 10 + vendor/golang.org/x/sys/unix/ztypes_linux.go | 35 +- .../golang.org/x/sys/unix/ztypes_linux_386.go | 1 + .../x/sys/unix/ztypes_linux_amd64.go | 1 + .../golang.org/x/sys/unix/ztypes_linux_arm.go | 1 + .../x/sys/unix/ztypes_linux_arm64.go | 1 + .../x/sys/unix/ztypes_linux_mips.go | 1 + .../x/sys/unix/ztypes_linux_mips64.go | 1 + .../x/sys/unix/ztypes_linux_mips64le.go | 1 + .../x/sys/unix/ztypes_linux_mipsle.go | 1 + .../x/sys/unix/ztypes_linux_ppc64.go | 1 + .../x/sys/unix/ztypes_linux_ppc64le.go | 1 + .../x/sys/unix/ztypes_linux_riscv64.go | 1 + .../x/sys/unix/ztypes_linux_s390x.go | 1 + .../x/sys/unix/ztypes_linux_sparc64.go | 1 + .../x/sys/unix/ztypes_netbsd_386.go | 1 + .../x/sys/unix/ztypes_netbsd_amd64.go | 1 + .../x/sys/unix/ztypes_netbsd_arm.go | 1 + .../x/sys/unix/ztypes_netbsd_arm64.go | 1 + .../x/sys/unix/ztypes_openbsd_386.go | 1 + .../x/sys/unix/ztypes_openbsd_amd64.go | 1 + .../x/sys/unix/ztypes_openbsd_arm.go | 1 + .../x/sys/unix/ztypes_openbsd_arm64.go | 1 + .../x/sys/unix/ztypes_openbsd_mips64.go | 1 + .../x/sys/unix/ztypes_solaris_amd64.go | 1 + .../golang.org/x/sys/unix/ztypes_zos_s390x.go | 402 + vendor/golang.org/x/sys/windows/svc/sys_386.s | 69 - .../golang.org/x/sys/windows/svc/sys_amd64.s | 48 - vendor/golang.org/x/sys/windows/svc/sys_arm.s | 38 - .../x/sys/windows/svc/sys_windows_386.s | 67 + .../x/sys/windows/svc/sys_windows_amd64.s | 46 + .../x/sys/windows/svc/sys_windows_arm.s | 36 + .../x/sys/windows/svc/sys_windows_arm64.s | 31 + .../x/sys/windows/syscall_windows.go | 10 +- .../golang.org/x/sys/windows/types_windows.go | 144 + .../x/sys/windows/types_windows_arm64.go | 34 + .../x/sys/windows/zsyscall_windows.go | 50 +- vendor/golang.org/x/term/AUTHORS | 3 + vendor/golang.org/x/term/CONTRIBUTING.md | 26 + vendor/golang.org/x/term/CONTRIBUTORS | 3 + vendor/golang.org/x/term/LICENSE | 27 + vendor/golang.org/x/term/PATENTS | 22 + vendor/golang.org/x/term/README.md | 19 + vendor/golang.org/x/term/go.mod | 5 + vendor/golang.org/x/term/go.sum | 2 + vendor/golang.org/x/term/term.go | 58 + vendor/golang.org/x/term/term_plan9.go | 42 + vendor/golang.org/x/term/term_solaris.go | 111 + vendor/golang.org/x/term/term_unix.go | 92 + vendor/golang.org/x/term/term_unix_aix.go | 10 + vendor/golang.org/x/term/term_unix_bsd.go | 13 + vendor/golang.org/x/term/term_unix_linux.go | 10 + vendor/golang.org/x/term/term_unix_zos.go | 10 + vendor/golang.org/x/term/term_unsupported.go | 39 + vendor/golang.org/x/term/term_windows.go | 79 + .../{crypto/ssh/terminal => term}/terminal.go | 2 +- vendor/golang.org/x/xerrors/LICENSE | 27 + vendor/golang.org/x/xerrors/PATENTS | 22 + vendor/golang.org/x/xerrors/README | 2 + vendor/golang.org/x/xerrors/adaptor.go | 193 + vendor/golang.org/x/xerrors/codereview.cfg | 1 + vendor/golang.org/x/xerrors/doc.go | 22 + vendor/golang.org/x/xerrors/errors.go | 33 + vendor/golang.org/x/xerrors/fmt.go | 187 + vendor/golang.org/x/xerrors/format.go | 34 + vendor/golang.org/x/xerrors/frame.go | 56 + vendor/golang.org/x/xerrors/go.mod | 3 + .../golang.org/x/xerrors/internal/internal.go | 8 + vendor/golang.org/x/xerrors/wrap.go | 106 + vendor/gopkg.in/yaml.v2/.travis.yml | 1 + vendor/gopkg.in/yaml.v2/apic.go | 6 +- vendor/gopkg.in/yaml.v2/go.mod | 8 +- vendor/gopkg.in/yaml.v2/yaml.go | 14 +- vendor/k8s.io/api/admission/v1/BUILD | 39 - .../k8s.io/api/admission/v1/generated.pb.go | 17 +- vendor/k8s.io/api/admission/v1/register.go | 8 +- vendor/k8s.io/api/admission/v1beta1/BUILD | 40 - .../api/admission/v1beta1/generated.pb.go | 17 +- .../k8s.io/api/admission/v1beta1/register.go | 8 +- .../k8s.io/api/admissionregistration/v1/BUILD | 39 - .../admissionregistration/v1/generated.pb.go | 50 +- .../admissionregistration/v1/generated.proto | 4 +- .../api/admissionregistration/v1/register.go | 9 +- .../api/admissionregistration/v1/types.go | 12 +- .../v1/types_swagger_doc_generated.go | 4 +- .../api/admissionregistration/v1beta1/BUILD | 40 - .../v1beta1/generated.pb.go | 50 +- .../v1beta1/generated.proto | 4 +- .../admissionregistration/v1beta1/register.go | 9 +- .../admissionregistration/v1beta1/types.go | 8 +- .../v1beta1/types_swagger_doc_generated.go | 4 +- .../api/apiserverinternal/v1alpha1/BUILD | 36 - .../v1alpha1/generated.pb.go | 30 +- vendor/k8s.io/api/apps/v1/BUILD | 38 - vendor/k8s.io/api/apps/v1/generated.pb.go | 441 +- vendor/k8s.io/api/apps/v1/generated.proto | 38 +- vendor/k8s.io/api/apps/v1/types.go | 38 +- .../apps/v1/types_swagger_doc_generated.go | 3 +- .../api/apps/v1/zz_generated.deepcopy.go | 5 + vendor/k8s.io/api/apps/v1beta1/BUILD | 43 - .../k8s.io/api/apps/v1beta1/generated.pb.go | 109 +- vendor/k8s.io/api/apps/v1beta2/BUILD | 43 - .../k8s.io/api/apps/v1beta2/generated.pb.go | 476 +- .../k8s.io/api/apps/v1beta2/generated.proto | 38 +- vendor/k8s.io/api/apps/v1beta2/types.go | 38 +- .../v1beta2/types_swagger_doc_generated.go | 3 +- .../api/apps/v1beta2/zz_generated.deepcopy.go | 5 + vendor/k8s.io/api/authentication/v1/BUILD | 41 - .../api/authentication/v1/generated.pb.go | 163 +- .../api/authentication/v1/generated.proto | 2 +- vendor/k8s.io/api/authentication/v1/types.go | 2 +- .../k8s.io/api/authentication/v1beta1/BUILD | 41 - .../authentication/v1beta1/generated.pb.go | 27 +- vendor/k8s.io/api/authorization/v1/BUILD | 40 - .../api/authorization/v1/generated.pb.go | 72 +- vendor/k8s.io/api/authorization/v1beta1/BUILD | 41 - .../api/authorization/v1beta1/generated.pb.go | 72 +- vendor/k8s.io/api/autoscaling/v1/BUILD | 41 - .../k8s.io/api/autoscaling/v1/generated.pb.go | 105 +- vendor/k8s.io/api/autoscaling/v2beta1/BUILD | 42 - .../api/autoscaling/v2beta1/generated.pb.go | 90 +- vendor/k8s.io/api/autoscaling/v2beta2/BUILD | 45 - .../api/autoscaling/v2beta2/generated.pb.go | 120 +- vendor/k8s.io/api/batch/v1/BUILD | 40 - vendor/k8s.io/api/batch/v1/generated.pb.go | 2221 +- vendor/k8s.io/api/batch/v1/generated.proto | 162 +- vendor/k8s.io/api/batch/v1/register.go | 2 + vendor/k8s.io/api/batch/v1/types.go | 209 +- .../batch/v1/types_swagger_doc_generated.go | 76 +- .../api/batch/v1/zz_generated.deepcopy.go | 156 + vendor/k8s.io/api/batch/v1beta1/BUILD | 42 - .../k8s.io/api/batch/v1beta1/generated.pb.go | 184 +- .../k8s.io/api/batch/v1beta1/generated.proto | 5 + vendor/k8s.io/api/batch/v1beta1/types.go | 13 +- .../v1beta1/types_swagger_doc_generated.go | 7 +- .../batch/v1beta1/zz_generated.deepcopy.go | 4 + .../zz_generated.prerelease-lifecycle.go | 20 +- vendor/k8s.io/api/batch/v2alpha1/BUILD | 41 - vendor/k8s.io/api/batch/v2alpha1/doc.go | 21 - .../k8s.io/api/batch/v2alpha1/generated.pb.go | 1743 - .../k8s.io/api/batch/v2alpha1/generated.proto | 135 - vendor/k8s.io/api/batch/v2alpha1/register.go | 53 - vendor/k8s.io/api/batch/v2alpha1/types.go | 156 - .../v2alpha1/types_swagger_doc_generated.go | 96 - .../batch/v2alpha1/zz_generated.deepcopy.go | 194 - vendor/k8s.io/api/certificates/v1/BUILD | 38 - .../api/certificates/v1/generated.pb.go | 32 +- vendor/k8s.io/api/certificates/v1beta1/BUILD | 42 - .../api/certificates/v1beta1/generated.pb.go | 32 +- vendor/k8s.io/api/coordination/v1/BUILD | 36 - .../api/coordination/v1/generated.pb.go | 15 +- vendor/k8s.io/api/coordination/v1beta1/BUILD | 43 - .../api/coordination/v1beta1/generated.pb.go | 15 +- vendor/k8s.io/api/core/v1/BUILD | 61 - .../api/core/v1/annotation_key_constants.go | 23 + vendor/k8s.io/api/core/v1/generated.pb.go | 3057 +- vendor/k8s.io/api/core/v1/generated.proto | 82 +- vendor/k8s.io/api/core/v1/types.go | 103 +- .../core/v1/types_swagger_doc_generated.go | 47 +- .../k8s.io/api/core/v1/well_known_labels.go | 32 +- .../k8s.io/api/core/v1/well_known_taints.go | 4 +- .../api/core/v1/zz_generated.deepcopy.go | 20 + vendor/k8s.io/api/discovery/v1/doc.go | 22 + .../k8s.io/api/discovery/v1/generated.pb.go | 2251 + .../k8s.io/api/discovery/v1/generated.proto | 196 + vendor/k8s.io/api/discovery/v1/register.go | 56 + vendor/k8s.io/api/discovery/v1/types.go | 194 + .../v1/types_swagger_doc_generated.go | 109 + .../{v1alpha1 => v1}/well_known_labels.go | 6 +- .../api/discovery/v1/zz_generated.deepcopy.go | 257 + vendor/k8s.io/api/discovery/v1alpha1/BUILD | 39 - vendor/k8s.io/api/discovery/v1alpha1/doc.go | 22 - .../api/discovery/v1alpha1/generated.pb.go | 1823 - .../api/discovery/v1alpha1/generated.proto | 179 - .../k8s.io/api/discovery/v1alpha1/register.go | 56 - vendor/k8s.io/api/discovery/v1alpha1/types.go | 183 - .../v1alpha1/types_swagger_doc_generated.go | 89 - .../v1alpha1/zz_generated.deepcopy.go | 210 - vendor/k8s.io/api/discovery/v1beta1/BUILD | 40 - .../api/discovery/v1beta1/generated.pb.go | 525 +- .../api/discovery/v1beta1/generated.proto | 20 + vendor/k8s.io/api/discovery/v1beta1/types.go | 27 +- .../v1beta1/types_swagger_doc_generated.go | 19 + .../v1beta1/zz_generated.deepcopy.go | 42 + .../zz_generated.prerelease-lifecycle.go | 20 +- vendor/k8s.io/api/events/v1/BUILD | 37 - vendor/k8s.io/api/events/v1/generated.pb.go | 15 +- vendor/k8s.io/api/events/v1/generated.proto | 3 + vendor/k8s.io/api/events/v1/types.go | 3 + .../events/v1/types_swagger_doc_generated.go | 1 + vendor/k8s.io/api/events/v1beta1/BUILD | 38 - .../k8s.io/api/events/v1beta1/generated.pb.go | 15 +- .../k8s.io/api/events/v1beta1/generated.proto | 3 + vendor/k8s.io/api/events/v1beta1/types.go | 3 + .../v1beta1/types_swagger_doc_generated.go | 1 + vendor/k8s.io/api/extensions/v1beta1/BUILD | 44 - .../api/extensions/v1beta1/generated.pb.go | 832 +- .../api/extensions/v1beta1/generated.proto | 58 +- vendor/k8s.io/api/extensions/v1beta1/types.go | 58 +- .../v1beta1/types_swagger_doc_generated.go | 8 +- .../v1beta1/zz_generated.deepcopy.go | 10 + vendor/k8s.io/api/flowcontrol/v1alpha1/BUILD | 37 - .../api/flowcontrol/v1alpha1/generated.pb.go | 110 +- vendor/k8s.io/api/flowcontrol/v1beta1/BUILD | 37 - .../api/flowcontrol/v1beta1/generated.pb.go | 110 +- vendor/k8s.io/api/imagepolicy/v1alpha1/BUILD | 40 - .../api/imagepolicy/v1alpha1/generated.pb.go | 24 +- vendor/k8s.io/api/networking/v1/BUILD | 41 - .../k8s.io/api/networking/v1/generated.pb.go | 701 +- .../k8s.io/api/networking/v1/generated.proto | 49 +- vendor/k8s.io/api/networking/v1/types.go | 58 +- .../v1/types_swagger_doc_generated.go | 18 +- .../networking/v1/zz_generated.deepcopy.go | 38 +- vendor/k8s.io/api/networking/v1beta1/BUILD | 43 - .../api/networking/v1beta1/generated.pb.go | 546 +- .../api/networking/v1beta1/generated.proto | 32 +- vendor/k8s.io/api/networking/v1beta1/types.go | 37 +- .../v1beta1/types_swagger_doc_generated.go | 13 + .../v1beta1/zz_generated.deepcopy.go | 33 +- vendor/k8s.io/api/node/v1/BUILD | 39 - vendor/k8s.io/api/node/v1/generated.pb.go | 24 +- vendor/k8s.io/api/node/v1alpha1/BUILD | 39 - .../k8s.io/api/node/v1alpha1/generated.pb.go | 29 +- vendor/k8s.io/api/node/v1beta1/BUILD | 40 - .../k8s.io/api/node/v1beta1/generated.pb.go | 24 +- vendor/k8s.io/api/policy/v1/doc.go | 24 + vendor/k8s.io/api/policy/v1/generated.pb.go | 1459 + vendor/k8s.io/api/policy/v1/generated.proto | 138 + vendor/k8s.io/api/policy/v1/register.go | 51 + vendor/k8s.io/api/policy/v1/types.go | 150 + .../policy/v1/types_swagger_doc_generated.go | 77 + .../api/policy/v1/zz_generated.deepcopy.go | 149 + vendor/k8s.io/api/policy/v1beta1/BUILD | 43 - .../k8s.io/api/policy/v1beta1/generated.pb.go | 396 +- .../k8s.io/api/policy/v1beta1/generated.proto | 25 + vendor/k8s.io/api/policy/v1beta1/types.go | 57 +- .../v1beta1/types_swagger_doc_generated.go | 5 +- .../policy/v1beta1/zz_generated.deepcopy.go | 7 + .../zz_generated.prerelease-lifecycle.go | 24 +- vendor/k8s.io/api/rbac/v1/BUILD | 39 - vendor/k8s.io/api/rbac/v1/generated.pb.go | 60 +- vendor/k8s.io/api/rbac/v1alpha1/BUILD | 39 - .../k8s.io/api/rbac/v1alpha1/generated.pb.go | 60 +- vendor/k8s.io/api/rbac/v1beta1/BUILD | 40 - .../k8s.io/api/rbac/v1beta1/generated.pb.go | 60 +- vendor/k8s.io/api/scheduling/v1/BUILD | 37 - .../k8s.io/api/scheduling/v1/generated.pb.go | 10 +- vendor/k8s.io/api/scheduling/v1alpha1/BUILD | 40 - .../api/scheduling/v1alpha1/generated.pb.go | 10 +- vendor/k8s.io/api/scheduling/v1beta1/BUILD | 41 - .../api/scheduling/v1beta1/generated.pb.go | 10 +- vendor/k8s.io/api/storage/v1/BUILD | 38 - vendor/k8s.io/api/storage/v1/generated.pb.go | 89 +- vendor/k8s.io/api/storage/v1/generated.proto | 25 +- vendor/k8s.io/api/storage/v1/types.go | 25 +- .../storage/v1/types_swagger_doc_generated.go | 14 +- vendor/k8s.io/api/storage/v1alpha1/BUILD | 39 - vendor/k8s.io/api/storage/v1alpha1/doc.go | 1 + .../api/storage/v1alpha1/generated.pb.go | 209 +- .../api/storage/v1alpha1/generated.proto | 18 +- vendor/k8s.io/api/storage/v1alpha1/types.go | 30 +- .../v1alpha1/types_swagger_doc_generated.go | 11 +- .../storage/v1alpha1/zz_generated.deepcopy.go | 5 + .../zz_generated.prerelease-lifecycle.go | 121 + vendor/k8s.io/api/storage/v1beta1/BUILD | 39 - .../api/storage/v1beta1/generated.pb.go | 941 +- .../api/storage/v1beta1/generated.proto | 116 +- vendor/k8s.io/api/storage/v1beta1/register.go | 3 + vendor/k8s.io/api/storage/v1beta1/types.go | 125 +- .../v1beta1/types_swagger_doc_generated.go | 37 +- .../storage/v1beta1/zz_generated.deepcopy.go | 83 +- .../zz_generated.prerelease-lifecycle.go | 36 + .../pkg/apihelpers/BUILD | 37 - .../pkg/apis/apiextensions/BUILD | 54 - .../pkg/apis/apiextensions/install/BUILD | 44 - .../pkg/apis/apiextensions/types.go | 2 + .../pkg/apis/apiextensions/v1/BUILD | 70 - .../pkg/apis/apiextensions/v1/generated.pb.go | 133 +- .../pkg/apis/apiextensions/v1/generated.proto | 2 + .../pkg/apis/apiextensions/v1/types.go | 2 + .../pkg/apis/apiextensions/v1beta1/BUILD | 70 - .../apiextensions/v1beta1/generated.pb.go | 128 +- .../apiextensions/v1beta1/generated.proto | 2 + .../pkg/apis/apiextensions/v1beta1/types.go | 2 + .../pkg/apis/apiextensions/validation/BUILD | 63 - .../apiextensions/validation/validation.go | 2 +- .../pkg/apiserver/BUILD | 150 - .../pkg/apiserver/apiserver.go | 14 +- .../pkg/apiserver/conversion/BUILD | 69 - .../customresource_discovery_controller.go | 4 +- .../pkg/apiserver/customresource_handler.go | 87 +- .../pkg/apiserver/schema/BUILD | 66 - .../pkg/apiserver/schema/defaulting/BUILD | 53 - .../pkg/apiserver/schema/listtype/BUILD | 38 - .../pkg/apiserver/schema/objectmeta/BUILD | 66 - .../pkg/apiserver/schema/pruning/BUILD | 36 - .../pkg/apiserver/validation/BUILD | 61 - .../pkg/client/clientset/clientset/BUILD | 42 - .../client/clientset/clientset/scheme/BUILD | 38 - .../clientset/typed/apiextensions/v1/BUILD | 39 - .../typed/apiextensions/v1beta1/BUILD | 42 - .../client/informers/externalversions/BUILD | 44 - .../externalversions/apiextensions/BUILD | 35 - .../externalversions/apiextensions/v1/BUILD | 36 - .../apiextensions/v1beta1/BUILD | 39 - .../externalversions/internalinterfaces/BUILD | 32 - .../pkg/client/listers/apiextensions/v1/BUILD | 32 - .../listers/apiextensions/v1beta1/BUILD | 35 - .../pkg/cmd/server/options/BUILD | 37 - .../pkg/cmd/server/testing/BUILD | 34 - .../pkg/controller/apiapproval/BUILD | 47 - .../pkg/controller/establish/BUILD | 37 - .../establish/establishing_controller.go | 4 +- .../pkg/controller/finalizer/BUILD | 47 - .../pkg/controller/finalizer/crd_finalizer.go | 4 +- .../pkg/controller/nonstructuralschema/BUILD | 50 - .../pkg/controller/openapi/BUILD | 48 - .../pkg/controller/openapi/builder/BUILD | 72 - .../pkg/controller/openapi/builder/builder.go | 5 +- .../pkg/controller/openapi/v2/BUILD | 43 - .../pkg/controller/status/BUILD | 58 - .../controller/status/naming_controller.go | 4 +- .../pkg/crdserverscheme/BUILD | 27 - .../pkg/generated/openapi/BUILD | 33 - .../generated/openapi/zz_generated.openapi.go | 105 +- .../pkg/registry/customresource/BUILD | 92 - .../pkg/registry/customresource/etcd.go | 17 +- .../customresource/status_strategy.go | 21 + .../pkg/registry/customresource/strategy.go | 17 + .../customresource/tableconvertor/BUILD | 46 - .../registry/customresourcedefinition/BUILD | 61 - .../registry/customresourcedefinition/etcd.go | 17 +- .../customresourcedefinition/strategy.go | 41 +- .../test/integration/BUILD | 107 - .../test/integration/fixtures/BUILD | 50 - .../test/integration/fixtures/etcd.go | 55 + .../test/integration/fixtures/resources.go | 224 +- .../test/integration/fixtures/server.go | 55 + .../test/integration/helpers.go | 75 +- .../apimachinery/pkg/api/apitesting/BUILD | 37 - .../apimachinery/pkg/api/equality/BUILD | 33 - .../k8s.io/apimachinery/pkg/api/errors/BUILD | 48 - .../k8s.io/apimachinery/pkg/api/errors/OWNERS | 2 - vendor/k8s.io/apimachinery/pkg/api/meta/BUILD | 72 - .../k8s.io/apimachinery/pkg/api/meta/OWNERS | 3 - .../apimachinery/pkg/api/meta/conditions.go | 2 +- .../apimachinery/pkg/api/meta/table/BUILD | 29 - .../apimachinery/pkg/api/resource/BUILD | 57 - .../apimachinery/pkg/api/resource/OWNERS | 1 - .../pkg/api/resource/quantity_proto.go | 2 +- .../apimachinery/pkg/api/validation/BUILD | 54 - .../pkg/api/validation/objectmeta.go | 7 +- .../pkg/api/validation/path/BUILD | 33 - .../pkg/apis/meta/internalversion/BUILD | 42 - .../pkg/apis/meta/internalversion/register.go | 1 - .../apis/meta/internalversion/scheme/BUILD | 48 - .../meta/internalversion/validation/BUILD | 38 - .../apimachinery/pkg/apis/meta/v1/BUILD | 98 - .../apimachinery/pkg/apis/meta/v1/OWNERS | 5 - .../pkg/apis/meta/v1/generated.pb.go | 991 +- .../pkg/apis/meta/v1/generated.proto | 37 +- .../apimachinery/pkg/apis/meta/v1/register.go | 1 - .../apimachinery/pkg/apis/meta/v1/types.go | 66 +- .../meta/v1/types_swagger_doc_generated.go | 21 +- .../pkg/apis/meta/v1/unstructured/BUILD | 71 - .../v1/unstructured/unstructuredscheme/BUILD | 30 - .../pkg/apis/meta/v1/validation/BUILD | 45 - .../pkg/apis/meta/v1/validation/validation.go | 4 +- .../apis/meta/v1/zz_generated.conversion.go | 30 - .../pkg/apis/meta/v1/zz_generated.deepcopy.go | 47 +- .../apimachinery/pkg/apis/meta/v1beta1/BUILD | 43 - .../pkg/apis/meta/v1beta1/generated.pb.go | 5 +- .../pkg/apis/meta/v1beta1/validation/BUILD | 27 - .../k8s.io/apimachinery/pkg/conversion/BUILD | 45 - .../pkg/conversion/queryparams/BUILD | 40 - vendor/k8s.io/apimachinery/pkg/fields/BUILD | 42 - vendor/k8s.io/apimachinery/pkg/labels/BUILD | 51 - .../k8s.io/apimachinery/pkg/labels/labels.go | 10 +- .../apimachinery/pkg/labels/selector.go | 130 +- vendor/k8s.io/apimachinery/pkg/runtime/BUILD | 94 - .../apimachinery/pkg/runtime/generated.pb.go | 15 +- .../apimachinery/pkg/runtime/schema/BUILD | 38 - .../k8s.io/apimachinery/pkg/runtime/scheme.go | 32 +- .../apimachinery/pkg/runtime/serializer/BUILD | 68 - .../pkg/runtime/serializer/json/BUILD | 58 - .../pkg/runtime/serializer/json/json.go | 5 +- .../pkg/runtime/serializer/protobuf/BUILD | 45 - .../runtime/serializer/protobuf/protobuf.go | 17 +- .../pkg/runtime/serializer/recognizer/BUILD | 33 - .../serializer/recognizer/recognizer.go | 13 +- .../pkg/runtime/serializer/streaming/BUILD | 42 - .../pkg/runtime/serializer/versioning/BUILD | 50 - .../k8s.io/apimachinery/pkg/selection/BUILD | 26 - vendor/k8s.io/apimachinery/pkg/types/BUILD | 32 - .../k8s.io/apimachinery/pkg/util/cache/BUILD | 48 - .../k8s.io/apimachinery/pkg/util/clock/BUILD | 33 - .../apimachinery/pkg/util/clock/clock.go | 42 +- .../k8s.io/apimachinery/pkg/util/diff/BUILD | 37 - .../apimachinery/pkg/util/duration/BUILD | 29 - .../k8s.io/apimachinery/pkg/util/errors/BUILD | 37 - .../k8s.io/apimachinery/pkg/util/framer/BUILD | 33 - .../apimachinery/pkg/util/httpstream/BUILD | 39 - .../pkg/util/httpstream/spdy/BUILD | 58 - .../pkg/util/httpstream/spdy/connection.go | 2 +- .../k8s.io/apimachinery/pkg/util/intstr/BUILD | 43 - .../pkg/util/intstr/generated.pb.go | 5 +- .../k8s.io/apimachinery/pkg/util/json/BUILD | 33 - .../pkg/util/managedfields/extract.go | 86 + .../apimachinery/pkg/util/mergepatch/BUILD | 40 - .../k8s.io/apimachinery/pkg/util/naming/BUILD | 29 - vendor/k8s.io/apimachinery/pkg/util/net/BUILD | 56 - .../k8s.io/apimachinery/pkg/util/net/http.go | 4 +- .../apimachinery/pkg/util/net/interface.go | 46 +- .../k8s.io/apimachinery/pkg/util/proxy/BUILD | 62 - .../apimachinery/pkg/util/proxy/dial.go | 2 +- .../apimachinery/pkg/util/proxy/transport.go | 3 +- .../pkg/util/proxy/upgradeaware.go | 14 + .../k8s.io/apimachinery/pkg/util/rand/BUILD | 33 - .../apimachinery/pkg/util/remotecommand/BUILD | 27 - .../apimachinery/pkg/util/runtime/BUILD | 34 - .../k8s.io/apimachinery/pkg/util/sets/BUILD | 74 - .../pkg/util/strategicpatch/BUILD | 61 - .../k8s.io/apimachinery/pkg/util/uuid/BUILD | 30 - .../apimachinery/pkg/util/validation/BUILD | 38 - .../pkg/util/validation/field/BUILD | 43 - .../pkg/util/validation/field/path.go | 23 + .../apimachinery/pkg/util/version/BUILD | 36 - .../k8s.io/apimachinery/pkg/util/wait/BUILD | 44 - .../apimachinery/pkg/util/waitgroup/BUILD | 32 - .../k8s.io/apimachinery/pkg/util/yaml/BUILD | 38 - .../apimachinery/pkg/util/yaml/decoder.go | 42 +- vendor/k8s.io/apimachinery/pkg/version/BUILD | 37 - vendor/k8s.io/apimachinery/pkg/watch/BUILD | 57 - vendor/k8s.io/apimachinery/pkg/watch/mux.go | 28 + .../apimachinery/pkg/watch/streamwatcher.go | 36 +- .../third_party/forked/golang/json/BUILD | 33 - .../third_party/forked/golang/netutil/BUILD | 26 - .../third_party/forked/golang/reflect/BUILD | 33 - vendor/k8s.io/apiserver/pkg/admission/BUILD | 86 - .../pkg/admission/configuration/BUILD | 61 - .../configuration/mutating_webhook_manager.go | 35 +- .../validating_webhook_manager.go | 37 +- .../apiserver/pkg/admission/initializer/BUILD | 51 - .../apiserver/pkg/admission/metrics/BUILD | 45 - .../pkg/admission/metrics/metrics.go | 28 +- .../plugin/namespace/lifecycle/BUILD | 65 - .../plugin/namespace/lifecycle/admission.go | 5 +- .../pkg/admission/plugin/resourcequota/BUILD | 87 - .../resourcequota/apis/resourcequota/BUILD | 44 - .../apis/resourcequota/install/BUILD | 34 - .../resourcequota/apis/resourcequota/v1/BUILD | 42 - .../apis/resourcequota/v1alpha1/BUILD | 42 - .../apis/resourcequota/v1beta1/BUILD | 42 - .../apis/resourcequota/validation/BUILD | 38 - .../plugin/resourcequota/controller.go | 9 +- .../pkg/admission/plugin/webhook/BUILD | 56 - .../pkg/admission/plugin/webhook/config/BUILD | 41 - .../config/apis/webhookadmission/BUILD | 38 - .../config/apis/webhookadmission/v1/BUILD | 37 - .../apis/webhookadmission/v1alpha1/BUILD | 37 - .../pkg/admission/plugin/webhook/errors/BUILD | 37 - .../admission/plugin/webhook/generic/BUILD | 73 - .../plugin/webhook/initializer/BUILD | 37 - .../admission/plugin/webhook/mutating/BUILD | 70 - .../plugin/webhook/mutating/dispatcher.go | 8 +- .../admission/plugin/webhook/namespace/BUILD | 53 - .../pkg/admission/plugin/webhook/object/BUILD | 49 - .../plugin/webhook/object/matcher.go | 2 +- .../admission/plugin/webhook/request/BUILD | 59 - .../pkg/admission/plugin/webhook/rules/BUILD | 43 - .../admission/plugin/webhook/validating/BUILD | 56 - .../plugin/webhook/validating/dispatcher.go | 8 +- .../k8s.io/apiserver/pkg/admission/plugins.go | 2 +- .../k8s.io/apiserver/pkg/apis/apiserver/BUILD | 42 - .../pkg/apis/apiserver/install/BUILD | 34 - .../apiserver/pkg/apis/apiserver/v1/BUILD | 40 - .../pkg/apis/apiserver/v1alpha1/BUILD | 40 - .../pkg/apis/apiserver/v1beta1/BUILD | 40 - vendor/k8s.io/apiserver/pkg/apis/audit/BUILD | 47 - .../apiserver/pkg/apis/audit/install/BUILD | 45 - .../k8s.io/apiserver/pkg/apis/audit/v1/BUILD | 46 - .../pkg/apis/audit/v1/generated.pb.go | 37 +- .../apiserver/pkg/apis/audit/v1alpha1/BUILD | 59 - .../apiserver/pkg/apis/audit/v1alpha1/doc.go | 1 + .../pkg/apis/audit/v1alpha1/generated.pb.go | 37 +- .../pkg/apis/audit/v1alpha1/generated.proto | 4 + .../pkg/apis/audit/v1alpha1/types.go | 16 + .../zz_generated.prerelease-lifecycle.go | 121 + .../apiserver/pkg/apis/audit/v1beta1/BUILD | 60 - .../apiserver/pkg/apis/audit/v1beta1/doc.go | 1 + .../pkg/apis/audit/v1beta1/generated.pb.go | 37 +- .../pkg/apis/audit/v1beta1/generated.proto | 4 + .../apiserver/pkg/apis/audit/v1beta1/types.go | 16 + .../zz_generated.prerelease-lifecycle.go | 121 + .../apiserver/pkg/apis/audit/validation/BUILD | 39 - vendor/k8s.io/apiserver/pkg/apis/config/BUILD | 37 - .../k8s.io/apiserver/pkg/apis/config/v1/BUILD | 48 - .../pkg/apis/config/validation/BUILD | 39 - .../pkg/apis/flowcontrol/bootstrap/BUILD | 31 - .../pkg/apis/flowcontrol/bootstrap/default.go | 20 +- vendor/k8s.io/apiserver/pkg/audit/BUILD | 80 - vendor/k8s.io/apiserver/pkg/audit/metrics.go | 11 +- .../k8s.io/apiserver/pkg/audit/policy/BUILD | 69 - .../apiserver/pkg/audit/policy/reader.go | 10 +- vendor/k8s.io/apiserver/pkg/audit/request.go | 18 +- .../pkg/authentication/authenticator/BUILD | 41 - .../authentication/authenticatorfactory/BUILD | 47 - .../authenticatorfactory/delegating.go | 5 +- .../apiserver/pkg/authentication/group/BUILD | 48 - .../authentication/request/anonymous/BUILD | 42 - .../authentication/request/bearertoken/BUILD | 38 - .../request/headerrequest/BUILD | 67 - .../pkg/authentication/request/union/BUILD | 41 - .../authentication/request/websocket/BUILD | 41 - .../pkg/authentication/request/x509/BUILD | 57 - .../pkg/authentication/request/x509/x509.go | 4 +- .../pkg/authentication/serviceaccount/BUILD | 46 - .../pkg/authentication/token/cache/BUILD | 65 - .../token/cache/cached_token_authenticator.go | 6 +- .../pkg/authentication/token/cache/stats.go | 21 +- .../pkg/authentication/token/tokenfile/BUILD | 39 - .../pkg/authentication/token/union/BUILD | 41 - .../apiserver/pkg/authentication/user/BUILD | 29 - .../pkg/authorization/authorizer/BUILD | 30 - .../pkg/authorization/authorizerfactory/BUILD | 47 - .../apiserver/pkg/authorization/path/BUILD | 37 - .../apiserver/pkg/authorization/union/BUILD | 42 - vendor/k8s.io/apiserver/pkg/endpoints/BUILD | 124 - .../apiserver/pkg/endpoints/deprecation/BUILD | 40 - .../apiserver/pkg/endpoints/discovery/BUILD | 64 - .../pkg/endpoints/filterlatency/BUILD | 35 - .../endpoints/filterlatency/filterlatency.go | 8 +- .../apiserver/pkg/endpoints/filters/BUILD | 110 - .../apiserver/pkg/endpoints/filters/audit.go | 37 +- .../pkg/endpoints/filters/authentication.go | 16 +- .../pkg/endpoints/filters/authn_audit.go | 2 +- .../pkg/endpoints/filters/authorization.go | 4 +- .../pkg/endpoints/filters/impersonation.go | 4 +- .../pkg/endpoints/filters/metrics.go | 11 +- .../pkg/endpoints/filters/request_deadline.go | 4 +- .../pkg/endpoints/filters/with_auditid.go | 68 + .../apiserver/pkg/endpoints/groupversion.go | 22 +- .../apiserver/pkg/endpoints/handlers/BUILD | 133 - .../pkg/endpoints/handlers/create.go | 4 +- .../pkg/endpoints/handlers/delete.go | 5 +- .../pkg/endpoints/handlers/fieldmanager/BUILD | 95 - .../handlers/fieldmanager/admission.go | 86 + .../handlers/fieldmanager/fieldmanager.go | 44 +- .../handlers/fieldmanager/internal/BUILD | 63 - .../fieldmanager/internal/managedfields.go | 32 +- .../endpoints/handlers/fieldmanager/node.yaml | 2 + .../handlers/fieldmanager/structuredmerge.go | 12 +- .../apiserver/pkg/endpoints/handlers/get.go | 29 +- .../pkg/endpoints/handlers/helpers.go | 30 + .../pkg/endpoints/handlers/negotiation/BUILD | 47 - .../apiserver/pkg/endpoints/handlers/patch.go | 5 +- .../endpoints/handlers/responsewriters/BUILD | 74 - .../handlers/responsewriters/status.go | 2 +- .../handlers/responsewriters/writers.go | 28 +- .../apiserver/pkg/endpoints/handlers/rest.go | 2 +- .../pkg/endpoints/handlers/trace_util.go | 33 + .../pkg/endpoints/handlers/update.go | 4 +- .../apiserver/pkg/endpoints/handlers/watch.go | 8 +- .../apiserver/pkg/endpoints/installer.go | 35 +- .../apiserver/pkg/endpoints/metrics/BUILD | 46 - .../apiserver/pkg/endpoints/metrics/OWNERS | 3 + .../pkg/endpoints/metrics/metrics.go | 76 +- .../apiserver/pkg/endpoints/openapi/BUILD | 49 - .../apiserver/pkg/endpoints/openapi/OWNERS | 4 - .../apiserver/pkg/endpoints/request/BUILD | 57 - .../pkg/endpoints/request/auditid.go | 66 + .../pkg/endpoints/request/context.go | 3 - .../pkg/endpoints/request/requestinfo.go | 2 +- .../apiserver/pkg/endpoints/warning/BUILD | 27 - vendor/k8s.io/apiserver/pkg/features/BUILD | 31 - .../apiserver/pkg/features/kube_features.go | 3 +- vendor/k8s.io/apiserver/pkg/quota/v1/BUILD | 53 - .../apiserver/pkg/quota/v1/generic/BUILD | 49 - .../apiserver/pkg/quota/v1/resources.go | 11 + .../apiserver/pkg/registry/generic/BUILD | 46 - .../apiserver/pkg/registry/generic/OWNERS | 2 - .../pkg/registry/generic/registry/BUILD | 106 - .../generic/registry/decorated_watcher.go | 27 +- .../pkg/registry/generic/registry/dryrun.go | 8 +- .../pkg/registry/generic/registry/store.go | 258 +- .../apiserver/pkg/registry/generic/rest/BUILD | 53 - .../pkg/registry/generic/rest/streamer.go | 11 + .../k8s.io/apiserver/pkg/registry/rest/BUILD | 71 - .../k8s.io/apiserver/pkg/registry/rest/OWNERS | 3 - .../apiserver/pkg/registry/rest/export.go | 34 - .../apiserver/pkg/registry/rest/rest.go | 33 +- vendor/k8s.io/apiserver/pkg/server/BUILD | 175 - vendor/k8s.io/apiserver/pkg/server/config.go | 16 +- .../apiserver/pkg/server/deleted_kinds.go | 198 + .../pkg/server/dynamiccertificates/BUILD | 69 - .../apiserver/pkg/server/egressselector/BUILD | 63 - .../server/egressselector/egress_selector.go | 4 +- .../pkg/server/egressselector/metrics/BUILD | 28 - .../k8s.io/apiserver/pkg/server/filters/BUILD | 99 - .../apiserver/pkg/server/filters/cors.go | 4 +- .../apiserver/pkg/server/filters/hsts.go | 40 + .../pkg/server/filters/maxinflight.go | 4 +- .../server/filters/priority-and-fairness.go | 22 +- .../apiserver/pkg/server/filters/wrap.go | 16 +- .../apiserver/pkg/server/genericapiserver.go | 27 +- vendor/k8s.io/apiserver/pkg/server/healthz.go | 18 +- .../k8s.io/apiserver/pkg/server/healthz/BUILD | 50 - .../k8s.io/apiserver/pkg/server/httplog/BUILD | 37 - .../apiserver/pkg/server/httplog/httplog.go | 22 +- vendor/k8s.io/apiserver/pkg/server/mux/BUILD | 42 - .../k8s.io/apiserver/pkg/server/options/BUILD | 193 - .../apiserver/pkg/server/options/OWNERS | 1 - .../apiserver/pkg/server/options/audit.go | 6 +- .../pkg/server/options/authentication.go | 55 +- .../pkg/server/options/authorization.go | 33 +- .../options/deprecated_insecure_serving.go | 4 +- .../pkg/server/options/egress_selector.go | 2 +- .../pkg/server/options/encryptionconfig/BUILD | 56 - .../server/options/encryptionconfig/config.go | 3 +- .../apiserver/pkg/server/options/etcd.go | 29 +- .../pkg/server/options/recommended.go | 17 +- .../pkg/server/options/server_run_options.go | 30 + .../apiserver/pkg/server/options/serving.go | 29 +- .../pkg/server/options/serving_unix.go | 14 +- .../pkg/server/options/serving_windows.go | 8 +- .../apiserver/pkg/server/resourceconfig/BUILD | 46 - .../k8s.io/apiserver/pkg/server/routes/BUILD | 51 - vendor/k8s.io/apiserver/pkg/server/signal.go | 29 +- .../k8s.io/apiserver/pkg/server/storage/BUILD | 63 - vendor/k8s.io/apiserver/pkg/storage/BUILD | 70 - vendor/k8s.io/apiserver/pkg/storage/OWNERS | 1 - .../k8s.io/apiserver/pkg/storage/cacher/BUILD | 86 - .../apiserver/pkg/storage/cacher/cacher.go | 36 +- .../apiserver/pkg/storage/cacher/metrics.go | 23 +- .../pkg/storage/cacher/watch_cache.go | 2 + .../k8s.io/apiserver/pkg/storage/errors/BUILD | 34 - .../k8s.io/apiserver/pkg/storage/etcd3/BUILD | 107 - .../k8s.io/apiserver/pkg/storage/etcd3/OWNERS | 1 - .../pkg/storage/etcd3/lease_manager.go | 65 +- .../apiserver/pkg/storage/etcd3/metrics/BUILD | 30 - .../pkg/storage/etcd3/metrics/OWNERS | 4 + .../pkg/storage/etcd3/metrics/metrics.go | 36 +- .../pkg/storage/etcd3/preflight/BUILD | 34 - .../apiserver/pkg/storage/etcd3/store.go | 114 +- .../apiserver/pkg/storage/etcd3/testing/BUILD | 48 - .../storage/etcd3/testing/testingcert/BUILD | 26 - .../apiserver/pkg/storage/interfaces.go | 15 +- .../k8s.io/apiserver/pkg/storage/names/BUILD | 34 - .../pkg/storage/storagebackend/BUILD | 34 - .../pkg/storage/storagebackend/config.go | 4 + .../pkg/storage/storagebackend/factory/BUILD | 66 - .../storage/storagebackend/factory/etcd3.go | 2 +- .../k8s.io/apiserver/pkg/storage/value/BUILD | 57 - .../pkg/storage/value/encrypt/aes/BUILD | 35 - .../pkg/storage/value/encrypt/envelope/BUILD | 116 - .../storage/value/encrypt/envelope/metrics.go | 2 +- .../value/encrypt/envelope/v1beta1/BUILD | 32 - .../pkg/storage/value/encrypt/identity/BUILD | 27 - .../pkg/storage/value/encrypt/secretbox/BUILD | 38 - .../apiserver/pkg/storage/value/metrics.go | 2 +- .../k8s.io/apiserver/pkg/storageversion/BUILD | 52 - .../apiserver/pkg/storageversion/manager.go | 23 +- .../apiserver/pkg/storageversion/updater.go | 95 +- .../apiserver/pkg/util/apihelpers/BUILD | 24 - vendor/k8s.io/apiserver/pkg/util/dryrun/BUILD | 23 - .../k8s.io/apiserver/pkg/util/feature/BUILD | 24 - .../apiserver/pkg/util/flowcontrol/BUILD | 95 - .../apiserver/pkg/util/flowcontrol/OWNERS | 15 + .../pkg/util/flowcontrol/apf_controller.go | 251 +- .../pkg/util/flowcontrol/apf_filter.go | 89 +- .../pkg/util/flowcontrol/counter/BUILD | 26 - .../pkg/util/flowcontrol/debug/BUILD | 24 - .../pkg/util/flowcontrol/fairqueuing/BUILD | 43 - .../util/flowcontrol/fairqueuing/interface.go | 2 +- .../flowcontrol/fairqueuing/promise/BUILD | 26 - .../fairqueuing/promise/lockingpromise/BUILD | 34 - .../flowcontrol/fairqueuing/queueset/BUILD | 56 - .../fairqueuing/queueset/queueset.go | 30 +- .../pkg/util/flowcontrol/format/BUILD | 28 - .../pkg/util/flowcontrol/format/formatting.go | 2 +- .../pkg/util/flowcontrol/metrics/BUILD | 34 - .../pkg/util/flowcontrol/metrics/metrics.go | 25 +- .../apiserver/pkg/util/flushwriter/BUILD | 36 - .../k8s.io/apiserver/pkg/util/openapi/BUILD | 40 - vendor/k8s.io/apiserver/pkg/util/proxy/BUILD | 45 - .../apiserver/pkg/util/shufflesharding/BUILD | 29 - .../k8s.io/apiserver/pkg/util/webhook/BUILD | 74 - .../k8s.io/apiserver/pkg/util/wsstream/BUILD | 46 - vendor/k8s.io/apiserver/pkg/warning/BUILD | 23 - .../apiserver/plugin/pkg/audit/buffered/BUILD | 46 - .../apiserver/plugin/pkg/audit/log/BUILD | 52 - .../apiserver/plugin/pkg/audit/truncate/BUILD | 47 - .../apiserver/plugin/pkg/audit/webhook/BUILD | 57 - .../plugin/pkg/authenticator/token/oidc/BUILD | 50 - .../pkg/authenticator/token/oidc/oidc.go | 2 +- .../pkg/authenticator/token/webhook/BUILD | 65 - .../authenticator/token/webhook/webhook.go | 27 +- .../plugin/pkg/authorizer/webhook/BUILD | 65 - .../cli-runtime/pkg/genericclioptions/BUILD | 75 - .../pkg/genericclioptions/builder_flags.go | 11 + .../genericclioptions/builder_flags_fake.go | 2 +- .../pkg/genericclioptions/client_config.go | 1 + .../pkg/genericclioptions/command_headers.go | 79 + .../pkg/genericclioptions/config_flags.go | 30 +- .../genericclioptions/config_flags_fake.go | 17 + .../cli-runtime/pkg/genericclioptions/doc.go | 2 +- .../pkg/genericclioptions/filename_flags.go | 3 + .../pkg/genericclioptions/json_yaml_flags.go | 13 +- .../pkg/genericclioptions/jsonpath_flags.go | 5 +- .../genericclioptions/kube_template_flags.go | 5 + .../pkg/genericclioptions/name_flags.go | 2 + .../pkg/genericclioptions/print_flags.go | 13 + .../pkg/genericclioptions/record_flags.go | 3 +- .../pkg/genericclioptions/template_flags.go | 5 +- vendor/k8s.io/cli-runtime/pkg/kustomize/BUILD | 38 - .../cli-runtime/pkg/kustomize/builder.go | 32 - .../cli-runtime/pkg/kustomize/k8sdeps/BUILD | 39 - .../k8sdeps/configmapandsecret/BUILD | 53 - .../configmapandsecret/configmapfactory.go | 125 - .../k8sdeps/configmapandsecret/kv.go | 107 - .../configmapandsecret/secretfactory.go | 106 - .../cli-runtime/pkg/kustomize/k8sdeps/doc.go | 76 - .../pkg/kustomize/k8sdeps/factory.go | 34 - .../pkg/kustomize/k8sdeps/kunstruct/BUILD | 47 - .../kustomize/k8sdeps/kunstruct/factory.go | 118 - .../pkg/kustomize/k8sdeps/kunstruct/helper.go | 71 - .../kustomize/k8sdeps/kunstruct/kunstruct.go | 92 - .../pkg/kustomize/k8sdeps/kv/BUILD | 30 - .../pkg/kustomize/k8sdeps/kv/kv.go | 102 - .../pkg/kustomize/k8sdeps/transformer/BUILD | 33 - .../kustomize/k8sdeps/transformer/factory.go | 43 - .../kustomize/k8sdeps/transformer/hash/BUILD | 50 - .../k8sdeps/transformer/hash/hash.go | 184 - .../k8sdeps/transformer/hash/namehash.go | 47 - .../kustomize/k8sdeps/transformer/patch/BUILD | 51 - .../k8sdeps/transformer/patch/patch.go | 174 - .../patch/patchconflictdetector.go | 137 - .../pkg/kustomize/k8sdeps/validator/BUILD | 29 - .../kustomize/k8sdeps/validator/validators.go | 61 - vendor/k8s.io/cli-runtime/pkg/printers/BUILD | 73 - .../cli-runtime/pkg/printers/managedfields.go | 59 + .../cli-runtime/pkg/printers/tableprinter.go | 5 +- vendor/k8s.io/cli-runtime/pkg/resource/BUILD | 111 - .../cli-runtime/pkg/resource/builder.go | 13 +- .../pkg/resource/dry_run_verifier.go | 11 +- .../pkg/resource/kustomizevisitor.go | 54 + .../cli-runtime/pkg/resource/visitor.go | 22 - .../v1/mutatingwebhook.go | 141 + .../v1/mutatingwebhookconfiguration.go | 259 + .../admissionregistration/v1/rule.go | 76 + .../v1/rulewithoperations.go | 84 + .../v1/servicereference.go | 66 + .../v1/validatingwebhook.go | 132 + .../v1/validatingwebhookconfiguration.go | 259 + .../v1/webhookclientconfig.go | 59 + .../v1beta1/mutatingwebhook.go | 141 + .../v1beta1/mutatingwebhookconfiguration.go | 259 + .../admissionregistration/v1beta1/rule.go | 76 + .../v1beta1/rulewithoperations.go | 84 + .../v1beta1/servicereference.go | 66 + .../v1beta1/validatingwebhook.go | 132 + .../v1beta1/validatingwebhookconfiguration.go | 259 + .../v1beta1/webhookclientconfig.go | 59 + .../v1alpha1/serverstorageversion.go | 59 + .../v1alpha1/storageversion.go | 263 + .../v1alpha1/storageversioncondition.go | 89 + .../v1alpha1/storageversionstatus.go | 67 + .../apps/v1/controllerrevision.go | 266 + .../applyconfigurations/apps/v1/daemonset.go | 265 + .../apps/v1/daemonsetcondition.go | 81 + .../apps/v1/daemonsetspec.go | 80 + .../apps/v1/daemonsetstatus.go | 125 + .../apps/v1/daemonsetupdatestrategy.go | 52 + .../applyconfigurations/apps/v1/deployment.go | 265 + .../apps/v1/deploymentcondition.go | 90 + .../apps/v1/deploymentspec.go | 107 + .../apps/v1/deploymentstatus.go | 107 + .../apps/v1/deploymentstrategy.go | 52 + .../applyconfigurations/apps/v1/replicaset.go | 265 + .../apps/v1/replicasetcondition.go | 81 + .../apps/v1/replicasetspec.go | 71 + .../apps/v1/replicasetstatus.go | 89 + .../apps/v1/rollingupdatedaemonset.go | 52 + .../apps/v1/rollingupdatedeployment.go | 52 + .../v1/rollingupdatestatefulsetstrategy.go | 39 + .../apps/v1/statefulset.go | 265 + .../apps/v1/statefulsetcondition.go | 81 + .../apps/v1/statefulsetspec.go | 113 + .../apps/v1/statefulsetstatus.go | 116 + .../apps/v1/statefulsetupdatestrategy.go | 52 + .../apps/v1beta1/controllerrevision.go | 266 + .../apps/v1beta1/deployment.go | 265 + .../apps/v1beta1/deploymentcondition.go | 90 + .../apps/v1beta1/deploymentspec.go | 116 + .../apps/v1beta1/deploymentstatus.go | 107 + .../apps/v1beta1/deploymentstrategy.go | 52 + .../apps/v1beta1/rollbackconfig.go | 39 + .../apps/v1beta1/rollingupdatedeployment.go | 52 + .../rollingupdatestatefulsetstrategy.go | 39 + .../apps/v1beta1/statefulset.go | 265 + .../apps/v1beta1/statefulsetcondition.go | 81 + .../apps/v1beta1/statefulsetspec.go | 113 + .../apps/v1beta1/statefulsetstatus.go | 116 + .../apps/v1beta1/statefulsetupdatestrategy.go | 52 + .../apps/v1beta2/controllerrevision.go | 266 + .../apps/v1beta2/daemonset.go | 265 + .../apps/v1beta2/daemonsetcondition.go | 81 + .../apps/v1beta2/daemonsetspec.go | 80 + .../apps/v1beta2/daemonsetstatus.go | 125 + .../apps/v1beta2/daemonsetupdatestrategy.go | 52 + .../apps/v1beta2/deployment.go | 265 + .../apps/v1beta2/deploymentcondition.go | 90 + .../apps/v1beta2/deploymentspec.go | 107 + .../apps/v1beta2/deploymentstatus.go | 107 + .../apps/v1beta2/deploymentstrategy.go | 52 + .../apps/v1beta2/replicaset.go | 265 + .../apps/v1beta2/replicasetcondition.go | 81 + .../apps/v1beta2/replicasetspec.go | 71 + .../apps/v1beta2/replicasetstatus.go | 89 + .../apps/v1beta2/rollingupdatedaemonset.go | 52 + .../apps/v1beta2/rollingupdatedeployment.go | 52 + .../rollingupdatestatefulsetstrategy.go | 39 + .../apps/v1beta2/statefulset.go | 265 + .../apps/v1beta2/statefulsetcondition.go | 81 + .../apps/v1beta2/statefulsetspec.go | 113 + .../apps/v1beta2/statefulsetstatus.go | 116 + .../apps/v1beta2/statefulsetupdatestrategy.go | 52 + .../v1/crossversionobjectreference.go | 57 + .../autoscaling/v1/horizontalpodautoscaler.go | 265 + .../v1/horizontalpodautoscalerspec.go | 66 + .../v1/horizontalpodautoscalerstatus.go | 79 + .../v2beta1/containerresourcemetricsource.go | 71 + .../v2beta1/containerresourcemetricstatus.go | 71 + .../v2beta1/crossversionobjectreference.go | 57 + .../v2beta1/externalmetricsource.go | 71 + .../v2beta1/externalmetricstatus.go | 71 + .../v2beta1/horizontalpodautoscaler.go | 265 + .../horizontalpodautoscalercondition.go | 81 + .../v2beta1/horizontalpodautoscalerspec.go | 71 + .../v2beta1/horizontalpodautoscalerstatus.go | 98 + .../autoscaling/v2beta1/metricspec.go | 88 + .../autoscaling/v2beta1/metricstatus.go | 88 + .../autoscaling/v2beta1/objectmetricsource.go | 80 + .../autoscaling/v2beta1/objectmetricstatus.go | 80 + .../autoscaling/v2beta1/podsmetricsource.go | 62 + .../autoscaling/v2beta1/podsmetricstatus.go | 62 + .../v2beta1/resourcemetricsource.go | 62 + .../v2beta1/resourcemetricstatus.go | 62 + .../v2beta2/containerresourcemetricsource.go | 61 + .../v2beta2/containerresourcemetricstatus.go | 61 + .../v2beta2/crossversionobjectreference.go | 57 + .../v2beta2/externalmetricsource.go | 48 + .../v2beta2/externalmetricstatus.go | 48 + .../v2beta2/horizontalpodautoscaler.go | 265 + .../horizontalpodautoscalerbehavior.go | 48 + .../horizontalpodautoscalercondition.go | 81 + .../v2beta2/horizontalpodautoscalerspec.go | 80 + .../v2beta2/horizontalpodautoscalerstatus.go | 98 + .../autoscaling/v2beta2/hpascalingpolicy.go | 61 + .../autoscaling/v2beta2/hpascalingrules.go | 66 + .../autoscaling/v2beta2/metricidentifier.go | 52 + .../autoscaling/v2beta2/metricspec.go | 88 + .../autoscaling/v2beta2/metricstatus.go | 88 + .../autoscaling/v2beta2/metrictarget.go | 71 + .../autoscaling/v2beta2/metricvaluestatus.go | 61 + .../autoscaling/v2beta2/objectmetricsource.go | 57 + .../autoscaling/v2beta2/objectmetricstatus.go | 57 + .../autoscaling/v2beta2/podsmetricsource.go | 48 + .../autoscaling/v2beta2/podsmetricstatus.go | 48 + .../v2beta2/resourcemetricsource.go | 52 + .../v2beta2/resourcemetricstatus.go | 52 + .../applyconfigurations/batch/v1/cronjob.go | 265 + .../batch/v1/cronjobspec.go | 97 + .../batch/v1/cronjobstatus.go | 67 + .../applyconfigurations/batch/v1/job.go | 265 + .../batch/v1/jobcondition.go | 90 + .../applyconfigurations/batch/v1/jobspec.go | 126 + .../applyconfigurations/batch/v1/jobstatus.go | 102 + .../batch/v1/jobtemplatespec.go | 206 + .../batch/v1beta1/cronjob.go | 265 + .../batch/v1beta1/cronjobspec.go | 97 + .../batch/v1beta1/cronjobstatus.go | 67 + .../batch/v1beta1/jobtemplatespec.go | 207 + .../v1/certificatesigningrequest.go | 263 + .../v1/certificatesigningrequestcondition.go | 90 + .../v1/certificatesigningrequestspec.go | 109 + .../v1/certificatesigningrequeststatus.go | 55 + .../v1beta1/certificatesigningrequest.go | 263 + .../certificatesigningrequestcondition.go | 90 + .../v1beta1/certificatesigningrequestspec.go | 109 + .../certificatesigningrequeststatus.go | 55 + .../coordination/v1/lease.go | 256 + .../coordination/v1/leasespec.go | 79 + .../coordination/v1beta1/lease.go | 256 + .../coordination/v1beta1/leasespec.go | 79 + .../applyconfigurations/core/v1/affinity.go | 57 + .../core/v1/attachedvolume.go | 52 + .../v1/awselasticblockstorevolumesource.go | 66 + .../core/v1/azurediskvolumesource.go | 88 + .../v1/azurefilepersistentvolumesource.go | 66 + .../core/v1/azurefilevolumesource.go | 57 + .../core/v1/capabilities.go | 56 + .../core/v1/cephfspersistentvolumesource.go | 86 + .../core/v1/cephfsvolumesource.go | 86 + .../core/v1/cinderpersistentvolumesource.go | 66 + .../core/v1/cindervolumesource.go | 66 + .../core/v1/clientipconfig.go | 39 + .../core/v1/componentcondition.go | 70 + .../core/v1/componentstatus.go | 259 + .../applyconfigurations/core/v1/configmap.go | 286 + .../core/v1/configmapenvsource.go | 48 + .../core/v1/configmapkeyselector.go | 57 + .../core/v1/configmapnodeconfigsource.go | 79 + .../core/v1/configmapprojection.go | 62 + .../core/v1/configmapvolumesource.go | 71 + .../applyconfigurations/core/v1/container.go | 261 + .../core/v1/containerimage.go | 50 + .../core/v1/containerport.go | 79 + .../core/v1/containerstate.go | 57 + .../core/v1/containerstaterunning.go | 43 + .../core/v1/containerstateterminated.go | 97 + .../core/v1/containerstatewaiting.go | 48 + .../core/v1/containerstatus.go | 111 + .../core/v1/csipersistentvolumesource.go | 117 + .../core/v1/csivolumesource.go | 81 + .../core/v1/daemonendpoint.go | 39 + .../core/v1/downwardapiprojection.go | 44 + .../core/v1/downwardapivolumefile.go | 66 + .../core/v1/downwardapivolumesource.go | 53 + .../core/v1/emptydirvolumesource.go | 53 + .../core/v1/endpointaddress.go | 66 + .../core/v1/endpointport.go | 70 + .../applyconfigurations/core/v1/endpoints.go | 261 + .../core/v1/endpointsubset.go | 72 + .../core/v1/envfromsource.go | 57 + .../applyconfigurations/core/v1/envvar.go | 57 + .../core/v1/envvarsource.go | 66 + .../core/v1/ephemeralcontainer.go | 249 + .../core/v1/ephemeralcontainercommon.go | 261 + .../core/v1/ephemeralvolumesource.go | 39 + .../applyconfigurations/core/v1/event.go | 373 + .../core/v1/eventseries.go | 52 + .../core/v1/eventsource.go | 48 + .../applyconfigurations/core/v1/execaction.go | 41 + .../core/v1/fcvolumesource.go | 79 + .../core/v1/flexpersistentvolumesource.go | 81 + .../core/v1/flexvolumesource.go | 81 + .../core/v1/flockervolumesource.go | 48 + .../core/v1/gcepersistentdiskvolumesource.go | 66 + .../core/v1/gitrepovolumesource.go | 57 + .../v1/glusterfspersistentvolumesource.go | 66 + .../core/v1/glusterfsvolumesource.go | 57 + .../applyconfigurations/core/v1/handler.go | 57 + .../applyconfigurations/core/v1/hostalias.go | 50 + .../core/v1/hostpathvolumesource.go | 52 + .../core/v1/httpgetaction.go | 85 + .../applyconfigurations/core/v1/httpheader.go | 48 + .../core/v1/iscsipersistentvolumesource.go | 131 + .../core/v1/iscsivolumesource.go | 131 + .../applyconfigurations/core/v1/keytopath.go | 57 + .../applyconfigurations/core/v1/lifecycle.go | 48 + .../applyconfigurations/core/v1/limitrange.go | 256 + .../core/v1/limitrangeitem.go | 88 + .../core/v1/limitrangespec.go | 44 + .../core/v1/loadbalanceringress.go | 62 + .../core/v1/loadbalancerstatus.go | 44 + .../core/v1/localobjectreference.go | 39 + .../core/v1/localvolumesource.go | 48 + .../applyconfigurations/core/v1/namespace.go | 263 + .../core/v1/namespacecondition.go | 80 + .../core/v1/namespacespec.go | 45 + .../core/v1/namespacestatus.go | 57 + .../core/v1/nfsvolumesource.go | 57 + .../applyconfigurations/core/v1/node.go | 263 + .../core/v1/nodeaddress.go | 52 + .../core/v1/nodeaffinity.go | 53 + .../core/v1/nodecondition.go | 89 + .../core/v1/nodeconfigsource.go | 39 + .../core/v1/nodeconfigstatus.go | 66 + .../core/v1/nodedaemonendpoints.go | 39 + .../core/v1/nodeselector.go | 44 + .../core/v1/nodeselectorrequirement.go | 63 + .../core/v1/nodeselectorterm.go | 58 + .../applyconfigurations/core/v1/nodespec.go | 100 + .../applyconfigurations/core/v1/nodestatus.go | 155 + .../core/v1/nodesysteminfo.go | 120 + .../core/v1/objectfieldselector.go | 48 + .../core/v1/objectreference.go | 97 + .../core/v1/persistentvolume.go | 263 + .../core/v1/persistentvolumeclaim.go | 265 + .../core/v1/persistentvolumeclaimcondition.go | 89 + .../core/v1/persistentvolumeclaimspec.go | 100 + .../core/v1/persistentvolumeclaimstatus.go | 77 + .../core/v1/persistentvolumeclaimtemplate.go | 206 + .../v1/persistentvolumeclaimvolumesource.go | 48 + .../core/v1/persistentvolumesource.go | 228 + .../core/v1/persistentvolumespec.go | 287 + .../core/v1/persistentvolumestatus.go | 61 + .../v1/photonpersistentdiskvolumesource.go | 48 + .../applyconfigurations/core/v1/pod.go | 265 + .../core/v1/podaffinity.go | 58 + .../core/v1/podaffinityterm.go | 72 + .../core/v1/podantiaffinity.go | 58 + .../core/v1/podcondition.go | 89 + .../core/v1/poddnsconfig.go | 66 + .../core/v1/poddnsconfigoption.go | 48 + .../applyconfigurations/core/v1/podip.go | 39 + .../core/v1/podreadinessgate.go | 43 + .../core/v1/podsecuritycontext.go | 131 + .../applyconfigurations/core/v1/podspec.go | 400 + .../applyconfigurations/core/v1/podstatus.go | 177 + .../core/v1/podtemplate.go | 256 + .../core/v1/podtemplatespec.go | 206 + .../applyconfigurations/core/v1/portstatus.go | 61 + .../core/v1/portworxvolumesource.go | 57 + .../core/v1/preferredschedulingterm.go | 48 + .../applyconfigurations/core/v1/probe.go | 109 + .../core/v1/projectedvolumesource.go | 53 + .../core/v1/quobytevolumesource.go | 84 + .../core/v1/rbdpersistentvolumesource.go | 104 + .../core/v1/rbdvolumesource.go | 104 + .../core/v1/replicationcontroller.go | 265 + .../core/v1/replicationcontrollercondition.go | 80 + .../core/v1/replicationcontrollerspec.go | 72 + .../core/v1/replicationcontrollerstatus.go | 89 + .../core/v1/resourcefieldselector.go | 61 + .../core/v1/resourcequota.go | 265 + .../core/v1/resourcequotaspec.go | 63 + .../core/v1/resourcequotastatus.go | 52 + .../core/v1/resourcerequirements.go | 52 + .../core/v1/scaleiopersistentvolumesource.go | 120 + .../core/v1/scaleiovolumesource.go | 120 + .../v1/scopedresourceselectorrequirement.go | 63 + .../core/v1/scopeselector.go | 44 + .../core/v1/seccompprofile.go | 52 + .../applyconfigurations/core/v1/secret.go | 295 + .../core/v1/secretenvsource.go | 48 + .../core/v1/secretkeyselector.go | 57 + .../core/v1/secretprojection.go | 62 + .../core/v1/secretreference.go | 48 + .../core/v1/secretvolumesource.go | 71 + .../core/v1/securitycontext.go | 133 + .../core/v1/selinuxoptions.go | 66 + .../applyconfigurations/core/v1/service.go | 265 + .../core/v1/serviceaccount.go | 284 + .../core/v1/serviceaccounttokenprojection.go | 57 + .../core/v1/serviceport.go | 89 + .../core/v1/servicespec.go | 235 + .../core/v1/servicestatus.go | 57 + .../core/v1/sessionaffinityconfig.go | 39 + .../v1/storageospersistentvolumesource.go | 75 + .../core/v1/storageosvolumesource.go | 75 + .../applyconfigurations/core/v1/sysctl.go | 48 + .../applyconfigurations/core/v1/taint.go | 71 + .../core/v1/tcpsocketaction.go | 52 + .../applyconfigurations/core/v1/toleration.go | 79 + .../v1/topologyselectorlabelrequirement.go | 50 + .../core/v1/topologyselectorterm.go | 44 + .../core/v1/topologyspreadconstraint.go | 71 + .../core/v1/typedlocalobjectreference.go | 57 + .../applyconfigurations/core/v1/volume.go | 272 + .../core/v1/volumedevice.go | 48 + .../core/v1/volumemount.go | 88 + .../core/v1/volumenodeaffinity.go | 39 + .../core/v1/volumeprojection.go | 66 + .../core/v1/volumesource.go | 291 + .../core/v1/vspherevirtualdiskvolumesource.go | 66 + .../core/v1/weightedpodaffinityterm.go | 48 + .../core/v1/windowssecuritycontextoptions.go | 57 + .../discovery/v1/endpoint.go | 114 + .../discovery/v1/endpointconditions.go | 57 + .../discovery/v1/endpointhints.go | 44 + .../discovery/v1/endpointport.go | 70 + .../discovery/v1/endpointslice.go | 284 + .../discovery/v1/forzone.go | 39 + .../discovery/v1beta1/endpoint.go | 105 + .../discovery/v1beta1/endpointconditions.go | 57 + .../discovery/v1beta1/endpointhints.go | 44 + .../discovery/v1beta1/endpointport.go | 70 + .../discovery/v1beta1/endpointslice.go | 284 + .../discovery/v1beta1/forzone.go | 39 + .../applyconfigurations/events/v1/event.go | 374 + .../events/v1/eventseries.go | 52 + .../events/v1beta1/event.go | 374 + .../events/v1beta1/eventseries.go | 52 + .../extensions/v1beta1/allowedcsidriver.go | 39 + .../extensions/v1beta1/allowedflexvolume.go | 39 + .../extensions/v1beta1/allowedhostpath.go | 48 + .../extensions/v1beta1/daemonset.go | 265 + .../extensions/v1beta1/daemonsetcondition.go | 81 + .../extensions/v1beta1/daemonsetspec.go | 89 + .../extensions/v1beta1/daemonsetstatus.go | 125 + .../v1beta1/daemonsetupdatestrategy.go | 52 + .../extensions/v1beta1/deployment.go | 265 + .../extensions/v1beta1/deploymentcondition.go | 90 + .../extensions/v1beta1/deploymentspec.go | 116 + .../extensions/v1beta1/deploymentstatus.go | 107 + .../extensions/v1beta1/deploymentstrategy.go | 52 + .../v1beta1/fsgroupstrategyoptions.go | 57 + .../extensions/v1beta1/hostportrange.go | 48 + .../extensions/v1beta1/httpingresspath.go | 61 + .../v1beta1/httpingressrulevalue.go | 44 + .../extensions/v1beta1/idrange.go | 48 + .../extensions/v1beta1/ingress.go | 265 + .../extensions/v1beta1/ingressbackend.go | 62 + .../extensions/v1beta1/ingressrule.go | 48 + .../extensions/v1beta1/ingressrulevalue.go | 39 + .../extensions/v1beta1/ingressspec.go | 76 + .../extensions/v1beta1/ingressstatus.go | 43 + .../extensions/v1beta1/ingresstls.go | 50 + .../extensions/v1beta1/ipblock.go | 50 + .../extensions/v1beta1/networkpolicy.go | 256 + .../v1beta1/networkpolicyegressrule.go | 58 + .../v1beta1/networkpolicyingressrule.go | 58 + .../extensions/v1beta1/networkpolicypeer.go | 61 + .../extensions/v1beta1/networkpolicyport.go | 62 + .../extensions/v1beta1/networkpolicyspec.go | 83 + .../extensions/v1beta1/podsecuritypolicy.go | 254 + .../v1beta1/podsecuritypolicyspec.go | 285 + .../extensions/v1beta1/replicaset.go | 265 + .../extensions/v1beta1/replicasetcondition.go | 81 + .../extensions/v1beta1/replicasetspec.go | 71 + .../extensions/v1beta1/replicasetstatus.go | 89 + .../extensions/v1beta1/rollbackconfig.go | 39 + .../v1beta1/rollingupdatedaemonset.go | 52 + .../v1beta1/rollingupdatedeployment.go | 52 + .../v1beta1/runasgroupstrategyoptions.go | 57 + .../v1beta1/runasuserstrategyoptions.go | 57 + .../v1beta1/runtimeclassstrategyoptions.go | 50 + .../v1beta1/selinuxstrategyoptions.go | 53 + .../supplementalgroupsstrategyoptions.go | 57 + .../v1alpha1/flowdistinguishermethod.go | 43 + .../flowcontrol/v1alpha1/flowschema.go | 263 + .../v1alpha1/flowschemacondition.go | 80 + .../flowcontrol/v1alpha1/flowschemaspec.go | 71 + .../flowcontrol/v1alpha1/flowschemastatus.go | 44 + .../flowcontrol/v1alpha1/groupsubject.go | 39 + .../limitedprioritylevelconfiguration.go | 48 + .../flowcontrol/v1alpha1/limitresponse.go | 52 + .../v1alpha1/nonresourcepolicyrule.go | 52 + .../v1alpha1/policyruleswithsubjects.go | 72 + .../v1alpha1/prioritylevelconfiguration.go | 263 + .../prioritylevelconfigurationcondition.go | 80 + .../prioritylevelconfigurationreference.go | 39 + .../prioritylevelconfigurationspec.go | 52 + .../prioritylevelconfigurationstatus.go | 44 + .../v1alpha1/queuingconfiguration.go | 57 + .../v1alpha1/resourcepolicyrule.go | 83 + .../v1alpha1/serviceaccountsubject.go | 48 + .../flowcontrol/v1alpha1/subject.go | 70 + .../flowcontrol/v1alpha1/usersubject.go | 39 + .../v1beta1/flowdistinguishermethod.go | 43 + .../flowcontrol/v1beta1/flowschema.go | 263 + .../v1beta1/flowschemacondition.go | 80 + .../flowcontrol/v1beta1/flowschemaspec.go | 71 + .../flowcontrol/v1beta1/flowschemastatus.go | 44 + .../flowcontrol/v1beta1/groupsubject.go | 39 + .../limitedprioritylevelconfiguration.go | 48 + .../flowcontrol/v1beta1/limitresponse.go | 52 + .../v1beta1/nonresourcepolicyrule.go | 52 + .../v1beta1/policyruleswithsubjects.go | 72 + .../v1beta1/prioritylevelconfiguration.go | 263 + .../prioritylevelconfigurationcondition.go | 80 + .../prioritylevelconfigurationreference.go | 39 + .../v1beta1/prioritylevelconfigurationspec.go | 52 + .../prioritylevelconfigurationstatus.go | 44 + .../v1beta1/queuingconfiguration.go | 57 + .../flowcontrol/v1beta1/resourcepolicyrule.go | 83 + .../v1beta1/serviceaccountsubject.go | 48 + .../flowcontrol/v1beta1/subject.go | 70 + .../flowcontrol/v1beta1/usersubject.go | 39 + .../applyconfigurations/internal/internal.go | 10762 ++ .../applyconfigurations/meta/v1/condition.go | 88 + .../meta/v1/deleteoptions.go | 98 + .../meta/v1/labelselector.go | 59 + .../meta/v1/labelselectorrequirement.go | 63 + .../meta/v1/managedfieldsentry.go | 88 + .../applyconfigurations/meta/v1/objectmeta.go | 189 + .../meta/v1/ownerreference.go | 88 + .../meta/v1/preconditions.go | 52 + .../applyconfigurations/meta/v1/typemeta.go | 48 + .../networking/v1/httpingresspath.go | 61 + .../networking/v1/httpingressrulevalue.go | 44 + .../networking/v1/ingress.go | 265 + .../networking/v1/ingressbackend.go | 52 + .../networking/v1/ingressclass.go | 254 + .../v1/ingressclassparametersreference.go | 75 + .../networking/v1/ingressclassspec.go | 48 + .../networking/v1/ingressrule.go | 48 + .../networking/v1/ingressrulevalue.go | 39 + .../networking/v1/ingressservicebackend.go | 48 + .../networking/v1/ingressspec.go | 76 + .../networking/v1/ingressstatus.go | 43 + .../networking/v1/ingresstls.go | 50 + .../networking/v1/ipblock.go | 50 + .../networking/v1/networkpolicy.go | 256 + .../networking/v1/networkpolicyegressrule.go | 58 + .../networking/v1/networkpolicyingressrule.go | 58 + .../networking/v1/networkpolicypeer.go | 61 + .../networking/v1/networkpolicyport.go | 62 + .../networking/v1/networkpolicyspec.go | 83 + .../networking/v1/servicebackendport.go | 48 + .../networking/v1beta1/httpingresspath.go | 61 + .../v1beta1/httpingressrulevalue.go | 44 + .../networking/v1beta1/ingress.go | 265 + .../networking/v1beta1/ingressbackend.go | 62 + .../networking/v1beta1/ingressclass.go | 254 + .../ingressclassparametersreference.go | 75 + .../networking/v1beta1/ingressclassspec.go | 48 + .../networking/v1beta1/ingressrule.go | 48 + .../networking/v1beta1/ingressrulevalue.go | 39 + .../networking/v1beta1/ingressspec.go | 76 + .../networking/v1beta1/ingressstatus.go | 43 + .../networking/v1beta1/ingresstls.go | 50 + .../applyconfigurations/node/v1/overhead.go | 43 + .../node/v1/runtimeclass.go | 272 + .../applyconfigurations/node/v1/scheduling.go | 63 + .../node/v1alpha1/overhead.go | 43 + .../node/v1alpha1/runtimeclass.go | 254 + .../node/v1alpha1/runtimeclassspec.go | 57 + .../node/v1alpha1/scheduling.go | 63 + .../node/v1beta1/overhead.go | 43 + .../node/v1beta1/runtimeclass.go | 272 + .../node/v1beta1/scheduling.go | 63 + .../policy/v1/poddisruptionbudget.go | 265 + .../policy/v1/poddisruptionbudgetspec.go | 62 + .../policy/v1/poddisruptionbudgetstatus.go | 109 + .../policy/v1beta1/allowedcsidriver.go | 39 + .../policy/v1beta1/allowedflexvolume.go | 39 + .../policy/v1beta1/allowedhostpath.go | 48 + .../policy/v1beta1/eviction.go | 256 + .../policy/v1beta1/fsgroupstrategyoptions.go | 57 + .../policy/v1beta1/hostportrange.go | 48 + .../policy/v1beta1/idrange.go | 48 + .../policy/v1beta1/poddisruptionbudget.go | 265 + .../policy/v1beta1/poddisruptionbudgetspec.go | 62 + .../v1beta1/poddisruptionbudgetstatus.go | 109 + .../policy/v1beta1/podsecuritypolicy.go | 254 + .../policy/v1beta1/podsecuritypolicyspec.go | 285 + .../v1beta1/runasgroupstrategyoptions.go | 57 + .../v1beta1/runasuserstrategyoptions.go | 57 + .../v1beta1/runtimeclassstrategyoptions.go | 50 + .../policy/v1beta1/selinuxstrategyoptions.go | 53 + .../supplementalgroupsstrategyoptions.go | 57 + .../rbac/v1/aggregationrule.go | 48 + .../rbac/v1/clusterrole.go | 268 + .../rbac/v1/clusterrolebinding.go | 268 + .../applyconfigurations/rbac/v1/policyrule.go | 85 + .../applyconfigurations/rbac/v1/role.go | 261 + .../rbac/v1/rolebinding.go | 270 + .../applyconfigurations/rbac/v1/roleref.go | 57 + .../applyconfigurations/rbac/v1/subject.go | 66 + .../rbac/v1alpha1/aggregationrule.go | 48 + .../rbac/v1alpha1/clusterrole.go | 268 + .../rbac/v1alpha1/clusterrolebinding.go | 268 + .../rbac/v1alpha1/policyrule.go | 85 + .../applyconfigurations/rbac/v1alpha1/role.go | 261 + .../rbac/v1alpha1/rolebinding.go | 270 + .../rbac/v1alpha1/roleref.go | 57 + .../rbac/v1alpha1/subject.go | 66 + .../rbac/v1beta1/aggregationrule.go | 48 + .../rbac/v1beta1/clusterrole.go | 268 + .../rbac/v1beta1/clusterrolebinding.go | 268 + .../rbac/v1beta1/policyrule.go | 85 + .../applyconfigurations/rbac/v1beta1/role.go | 261 + .../rbac/v1beta1/rolebinding.go | 270 + .../rbac/v1beta1/roleref.go | 57 + .../rbac/v1beta1/subject.go | 66 + .../scheduling/v1/priorityclass.go | 282 + .../scheduling/v1alpha1/priorityclass.go | 282 + .../scheduling/v1beta1/priorityclass.go | 282 + .../storage/v1/csidriver.go | 254 + .../storage/v1/csidriverspec.go | 104 + .../applyconfigurations/storage/v1/csinode.go | 254 + .../storage/v1/csinodedriver.go | 68 + .../storage/v1/csinodespec.go | 44 + .../storage/v1/storageclass.go | 323 + .../storage/v1/tokenrequest.go | 48 + .../storage/v1/volumeattachment.go | 263 + .../storage/v1/volumeattachmentsource.go | 52 + .../storage/v1/volumeattachmentspec.go | 57 + .../storage/v1/volumeattachmentstatus.go | 72 + .../storage/v1/volumeerror.go | 52 + .../storage/v1/volumenoderesources.go | 39 + .../storage/v1alpha1/csistoragecapacity.go | 284 + .../storage/v1alpha1/volumeattachment.go | 263 + .../v1alpha1/volumeattachmentsource.go | 52 + .../storage/v1alpha1/volumeattachmentspec.go | 57 + .../v1alpha1/volumeattachmentstatus.go | 72 + .../storage/v1alpha1/volumeerror.go | 52 + .../storage/v1beta1/csidriver.go | 254 + .../storage/v1beta1/csidriverspec.go | 104 + .../storage/v1beta1/csinode.go | 254 + .../storage/v1beta1/csinodedriver.go | 68 + .../storage/v1beta1/csinodespec.go | 44 + .../storage/v1beta1/csistoragecapacity.go | 284 + .../storage/v1beta1/storageclass.go | 323 + .../storage/v1beta1/tokenrequest.go | 48 + .../storage/v1beta1/volumeattachment.go | 263 + .../storage/v1beta1/volumeattachmentsource.go | 52 + .../storage/v1beta1/volumeattachmentspec.go | 57 + .../storage/v1beta1/volumeattachmentstatus.go | 72 + .../storage/v1beta1/volumeerror.go | 52 + .../storage/v1beta1/volumenoderesources.go | 39 + vendor/k8s.io/client-go/discovery/BUILD | 72 - .../k8s.io/client-go/discovery/cached/BUILD | 31 - .../client-go/discovery/cached/disk/BUILD | 59 - .../client-go/discovery/cached/memory/BUILD | 47 - vendor/k8s.io/client-go/discovery/fake/BUILD | 46 - vendor/k8s.io/client-go/dynamic/BUILD | 65 - .../client-go/dynamic/dynamicinformer/BUILD | 53 - .../client-go/dynamic/dynamiclister/BUILD | 49 - vendor/k8s.io/client-go/informers/BUILD | 112 - .../informers/admissionregistration/BUILD | 35 - .../informers/admissionregistration/v1/BUILD | 37 - .../admissionregistration/v1beta1/BUILD | 37 - .../informers/apiserverinternal/BUILD | 30 - .../apiserverinternal/v1alpha1/BUILD | 36 - vendor/k8s.io/client-go/informers/apps/BUILD | 37 - .../k8s.io/client-go/informers/apps/v1/BUILD | 40 - .../client-go/informers/apps/v1beta1/BUILD | 41 - .../client-go/informers/apps/v1beta2/BUILD | 43 - .../client-go/informers/autoscaling/BUILD | 34 - .../client-go/informers/autoscaling/v1/BUILD | 36 - .../informers/autoscaling/v2beta1/BUILD | 36 - .../informers/autoscaling/v2beta2/BUILD | 36 - vendor/k8s.io/client-go/informers/batch/BUILD | 37 - .../client-go/informers/batch/interface.go | 8 - .../k8s.io/client-go/informers/batch/v1/BUILD | 39 - .../client-go/informers/batch/v1/cronjob.go | 90 + .../client-go/informers/batch/v1/interface.go | 7 + .../client-go/informers/batch/v1beta1/BUILD | 39 - .../client-go/informers/batch/v2alpha1/BUILD | 39 - .../informers/batch/v2alpha1/cronjob.go | 90 - .../informers/batch/v2alpha1/interface.go | 45 - .../client-go/informers/certificates/BUILD | 35 - .../client-go/informers/certificates/v1/BUILD | 36 - .../informers/certificates/v1beta1/BUILD | 39 - .../client-go/informers/coordination/BUILD | 32 - .../client-go/informers/coordination/v1/BUILD | 36 - .../informers/coordination/v1beta1/BUILD | 36 - vendor/k8s.io/client-go/informers/core/BUILD | 33 - .../k8s.io/client-go/informers/core/v1/BUILD | 54 - .../client-go/informers/discovery/BUILD | 32 - .../informers/discovery/interface.go | 12 +- .../informers/discovery/v1/endpointslice.go | 90 + .../informers/discovery/v1/interface.go | 45 + .../informers/discovery/v1alpha1/BUILD | 36 - .../discovery/v1alpha1/endpointslice.go | 90 - .../informers/discovery/v1alpha1/interface.go | 45 - .../informers/discovery/v1beta1/BUILD | 36 - .../k8s.io/client-go/informers/events/BUILD | 32 - .../client-go/informers/events/v1/BUILD | 36 - .../client-go/informers/events/v1beta1/BUILD | 36 - .../client-go/informers/extensions/BUILD | 33 - .../informers/extensions/v1beta1/BUILD | 44 - .../client-go/informers/flowcontrol/BUILD | 32 - .../informers/flowcontrol/v1alpha1/BUILD | 37 - .../informers/flowcontrol/v1beta1/BUILD | 37 - vendor/k8s.io/client-go/informers/generic.go | 28 +- .../informers/internalinterfaces/BUILD | 32 - .../client-go/informers/networking/BUILD | 35 - .../client-go/informers/networking/v1/BUILD | 41 - .../informers/networking/v1beta1/BUILD | 37 - vendor/k8s.io/client-go/informers/node/BUILD | 34 - .../k8s.io/client-go/informers/node/v1/BUILD | 36 - .../client-go/informers/node/v1alpha1/BUILD | 36 - .../client-go/informers/node/v1beta1/BUILD | 36 - .../k8s.io/client-go/informers/policy/BUILD | 33 - .../client-go/informers/policy/interface.go | 8 + .../informers/policy/v1/interface.go | 45 + .../policy/v1/poddisruptionbudget.go | 90 + .../client-go/informers/policy/v1beta1/BUILD | 40 - vendor/k8s.io/client-go/informers/rbac/BUILD | 37 - .../k8s.io/client-go/informers/rbac/v1/BUILD | 42 - .../client-go/informers/rbac/v1alpha1/BUILD | 42 - .../client-go/informers/rbac/v1beta1/BUILD | 42 - .../client-go/informers/scheduling/BUILD | 37 - .../client-go/informers/scheduling/v1/BUILD | 36 - .../informers/scheduling/v1alpha1/BUILD | 39 - .../informers/scheduling/v1beta1/BUILD | 36 - .../k8s.io/client-go/informers/storage/BUILD | 37 - .../client-go/informers/storage/v1/BUILD | 42 - .../informers/storage/v1alpha1/BUILD | 37 - .../client-go/informers/storage/v1beta1/BUILD | 42 - .../storage/v1beta1/csistoragecapacity.go | 90 + .../informers/storage/v1beta1/interface.go | 7 + vendor/k8s.io/client-go/kubernetes/BUILD | 122 - .../k8s.io/client-go/kubernetes/clientset.go | 46 +- vendor/k8s.io/client-go/kubernetes/fake/BUILD | 168 - .../kubernetes/fake/clientset_generated.go | 24 +- .../client-go/kubernetes/fake/register.go | 8 +- .../k8s.io/client-go/kubernetes/scheme/BUILD | 76 - .../client-go/kubernetes/scheme/register.go | 8 +- .../typed/admissionregistration/v1/BUILD | 40 - .../typed/admissionregistration/v1/fake/BUILD | 39 - .../fake/fake_mutatingwebhookconfiguration.go | 24 + .../fake_validatingwebhookconfiguration.go | 24 + .../v1/mutatingwebhookconfiguration.go | 29 + .../v1/validatingwebhookconfiguration.go | 29 + .../typed/admissionregistration/v1beta1/BUILD | 40 - .../admissionregistration/v1beta1/fake/BUILD | 39 - .../fake/fake_mutatingwebhookconfiguration.go | 24 + .../fake_validatingwebhookconfiguration.go | 24 + .../v1beta1/mutatingwebhookconfiguration.go | 29 + .../v1beta1/validatingwebhookconfiguration.go | 29 + .../typed/apiserverinternal/v1alpha1/BUILD | 39 - .../apiserverinternal/v1alpha1/fake/BUILD | 38 - .../v1alpha1/fake/fake_storageversion.go | 46 + .../v1alpha1/storageversion.go | 59 + .../client-go/kubernetes/typed/apps/v1/BUILD | 44 - .../typed/apps/v1/controllerrevision.go | 30 + .../kubernetes/typed/apps/v1/daemonset.go | 61 + .../kubernetes/typed/apps/v1/deployment.go | 61 + .../kubernetes/typed/apps/v1/fake/BUILD | 43 - .../apps/v1/fake/fake_controllerrevision.go | 25 + .../typed/apps/v1/fake/fake_daemonset.go | 48 + .../typed/apps/v1/fake/fake_deployment.go | 48 + .../typed/apps/v1/fake/fake_replicaset.go | 48 + .../typed/apps/v1/fake/fake_statefulset.go | 48 + .../kubernetes/typed/apps/v1/replicaset.go | 61 + .../kubernetes/typed/apps/v1/statefulset.go | 61 + .../kubernetes/typed/apps/v1beta1/BUILD | 44 - .../typed/apps/v1beta1/controllerrevision.go | 30 + .../typed/apps/v1beta1/deployment.go | 61 + .../kubernetes/typed/apps/v1beta1/fake/BUILD | 43 - .../v1beta1/fake/fake_controllerrevision.go | 25 + .../apps/v1beta1/fake/fake_deployment.go | 48 + .../apps/v1beta1/fake/fake_statefulset.go | 48 + .../typed/apps/v1beta1/statefulset.go | 61 + .../kubernetes/typed/apps/v1beta2/BUILD | 46 - .../typed/apps/v1beta2/controllerrevision.go | 30 + .../typed/apps/v1beta2/daemonset.go | 61 + .../typed/apps/v1beta2/deployment.go | 61 + .../kubernetes/typed/apps/v1beta2/fake/BUILD | 45 - .../v1beta2/fake/fake_controllerrevision.go | 25 + .../typed/apps/v1beta2/fake/fake_daemonset.go | 48 + .../apps/v1beta2/fake/fake_deployment.go | 48 + .../apps/v1beta2/fake/fake_replicaset.go | 48 + .../apps/v1beta2/fake/fake_statefulset.go | 48 + .../typed/apps/v1beta2/replicaset.go | 61 + .../typed/apps/v1beta2/statefulset.go | 61 + .../kubernetes/typed/authentication/v1/BUILD | 40 - .../typed/authentication/v1/fake/BUILD | 38 - .../typed/authentication/v1beta1/BUILD | 40 - .../typed/authentication/v1beta1/fake/BUILD | 38 - .../kubernetes/typed/authorization/v1/BUILD | 43 - .../typed/authorization/v1/fake/BUILD | 41 - .../typed/authorization/v1beta1/BUILD | 43 - .../typed/authorization/v1beta1/fake/BUILD | 41 - .../kubernetes/typed/autoscaling/v1/BUILD | 42 - .../typed/autoscaling/v1/fake/BUILD | 41 - .../v1/fake/fake_horizontalpodautoscaler.go | 48 + .../autoscaling/v1/horizontalpodautoscaler.go | 61 + .../typed/autoscaling/v2beta1/BUILD | 39 - .../typed/autoscaling/v2beta1/fake/BUILD | 38 - .../fake/fake_horizontalpodautoscaler.go | 48 + .../v2beta1/horizontalpodautoscaler.go | 61 + .../typed/autoscaling/v2beta2/BUILD | 39 - .../typed/autoscaling/v2beta2/fake/BUILD | 38 - .../fake/fake_horizontalpodautoscaler.go | 48 + .../v2beta2/horizontalpodautoscaler.go | 61 + .../client-go/kubernetes/typed/batch/v1/BUILD | 42 - .../kubernetes/typed/batch/v1/batch_client.go | 5 + .../kubernetes/typed/batch/v1/cronjob.go | 256 + .../kubernetes/typed/batch/v1/fake/BUILD | 41 - .../typed/batch/v1/fake/fake_batch_client.go | 4 + .../typed/batch/v1/fake/fake_cronjob.go | 190 + .../typed/batch/v1/fake/fake_job.go | 48 + .../typed/batch/v1/generated_expansion.go | 2 + .../kubernetes/typed/batch/v1/job.go | 61 + .../kubernetes/typed/batch/v1beta1/BUILD | 42 - .../kubernetes/typed/batch/v1beta1/cronjob.go | 61 + .../kubernetes/typed/batch/v1beta1/fake/BUILD | 41 - .../typed/batch/v1beta1/fake/fake_cronjob.go | 48 + .../kubernetes/typed/batch/v2alpha1/BUILD | 42 - .../typed/batch/v2alpha1/batch_client.go | 89 - .../typed/batch/v2alpha1/cronjob.go | 195 - .../kubernetes/typed/batch/v2alpha1/doc.go | 20 - .../typed/batch/v2alpha1/fake/BUILD | 41 - .../batch/v2alpha1/fake/fake_batch_client.go | 40 - .../typed/batch/v2alpha1/fake/fake_cronjob.go | 142 - .../batch/v2alpha1/generated_expansion.go | 21 - .../kubernetes/typed/certificates/v1/BUILD | 39 - .../v1/certificatesigningrequest.go | 59 + .../typed/certificates/v1/fake/BUILD | 38 - .../v1/fake/fake_certificatesigningrequest.go | 46 + .../typed/certificates/v1beta1/BUILD | 43 - .../v1beta1/certificatesigningrequest.go | 59 + .../typed/certificates/v1beta1/fake/BUILD | 42 - .../fake/fake_certificatesigningrequest.go | 46 + .../kubernetes/typed/coordination/v1/BUILD | 39 - .../typed/coordination/v1/fake/BUILD | 38 - .../typed/coordination/v1/fake/fake_lease.go | 25 + .../kubernetes/typed/coordination/v1/lease.go | 30 + .../typed/coordination/v1beta1/BUILD | 39 - .../typed/coordination/v1beta1/fake/BUILD | 38 - .../coordination/v1beta1/fake/fake_lease.go | 25 + .../typed/coordination/v1beta1/lease.go | 30 + .../client-go/kubernetes/typed/core/v1/BUILD | 69 - .../typed/core/v1/componentstatus.go | 29 + .../kubernetes/typed/core/v1/configmap.go | 30 + .../kubernetes/typed/core/v1/endpoints.go | 30 + .../kubernetes/typed/core/v1/event.go | 30 + .../kubernetes/typed/core/v1/fake/BUILD | 79 - .../core/v1/fake/fake_componentstatus.go | 24 + .../typed/core/v1/fake/fake_configmap.go | 25 + .../typed/core/v1/fake/fake_endpoints.go | 25 + .../typed/core/v1/fake/fake_event.go | 25 + .../typed/core/v1/fake/fake_limitrange.go | 25 + .../typed/core/v1/fake/fake_namespace.go | 46 + .../typed/core/v1/fake/fake_node.go | 46 + .../core/v1/fake/fake_persistentvolume.go | 46 + .../v1/fake/fake_persistentvolumeclaim.go | 48 + .../kubernetes/typed/core/v1/fake/fake_pod.go | 48 + .../typed/core/v1/fake/fake_podtemplate.go | 25 + .../v1/fake/fake_replicationcontroller.go | 48 + .../typed/core/v1/fake/fake_resourcequota.go | 48 + .../typed/core/v1/fake/fake_secret.go | 25 + .../typed/core/v1/fake/fake_service.go | 48 + .../typed/core/v1/fake/fake_serviceaccount.go | 25 + .../kubernetes/typed/core/v1/limitrange.go | 30 + .../kubernetes/typed/core/v1/namespace.go | 59 + .../kubernetes/typed/core/v1/node.go | 59 + .../typed/core/v1/persistentvolume.go | 59 + .../typed/core/v1/persistentvolumeclaim.go | 61 + .../client-go/kubernetes/typed/core/v1/pod.go | 61 + .../kubernetes/typed/core/v1/podtemplate.go | 30 + .../typed/core/v1/replicationcontroller.go | 61 + .../kubernetes/typed/core/v1/resourcequota.go | 61 + .../kubernetes/typed/core/v1/secret.go | 30 + .../kubernetes/typed/core/v1/service.go | 61 + .../typed/core/v1/serviceaccount.go | 30 + .../typed/discovery/v1/discovery_client.go | 89 + .../kubernetes/typed/discovery/v1/doc.go | 20 + .../typed/discovery/v1/endpointslice.go | 208 + .../v2alpha1 => discovery/v1}/fake/doc.go | 0 .../fake/fake_discovery_client.go | 8 +- .../discovery/v1/fake/fake_endpointslice.go | 155 + .../typed/discovery/v1/generated_expansion.go | 21 + .../kubernetes/typed/discovery/v1alpha1/BUILD | 39 - .../discovery/v1alpha1/discovery_client.go | 89 - .../typed/discovery/v1alpha1/doc.go | 20 - .../typed/discovery/v1alpha1/endpointslice.go | 178 - .../typed/discovery/v1alpha1/fake/BUILD | 38 - .../v1alpha1/fake/fake_endpointslice.go | 130 - .../discovery/v1alpha1/generated_expansion.go | 21 - .../kubernetes/typed/discovery/v1beta1/BUILD | 39 - .../typed/discovery/v1beta1/endpointslice.go | 30 + .../typed/discovery/v1beta1/fake/BUILD | 38 - .../v1beta1/fake/fake_endpointslice.go | 25 + .../kubernetes/typed/events/v1/BUILD | 39 - .../kubernetes/typed/events/v1/event.go | 30 + .../kubernetes/typed/events/v1/fake/BUILD | 38 - .../typed/events/v1/fake/fake_event.go | 25 + .../kubernetes/typed/events/v1beta1/BUILD | 40 - .../kubernetes/typed/events/v1beta1/event.go | 30 + .../typed/events/v1beta1/fake/BUILD | 39 - .../typed/events/v1beta1/fake/fake_event.go | 25 + .../kubernetes/typed/extensions/v1beta1/BUILD | 48 - .../typed/extensions/v1beta1/daemonset.go | 61 + .../typed/extensions/v1beta1/deployment.go | 61 + .../typed/extensions/v1beta1/fake/BUILD | 47 - .../extensions/v1beta1/fake/fake_daemonset.go | 48 + .../v1beta1/fake/fake_deployment.go | 48 + .../extensions/v1beta1/fake/fake_ingress.go | 48 + .../v1beta1/fake/fake_networkpolicy.go | 25 + .../v1beta1/fake/fake_podsecuritypolicy.go | 24 + .../v1beta1/fake/fake_replicaset.go | 48 + .../typed/extensions/v1beta1/ingress.go | 61 + .../typed/extensions/v1beta1/networkpolicy.go | 30 + .../extensions/v1beta1/podsecuritypolicy.go | 29 + .../typed/extensions/v1beta1/replicaset.go | 61 + .../typed/flowcontrol/v1alpha1/BUILD | 40 - .../typed/flowcontrol/v1alpha1/fake/BUILD | 39 - .../v1alpha1/fake/fake_flowschema.go | 46 + .../fake/fake_prioritylevelconfiguration.go | 46 + .../typed/flowcontrol/v1alpha1/flowschema.go | 59 + .../v1alpha1/prioritylevelconfiguration.go | 59 + .../typed/flowcontrol/v1beta1/BUILD | 40 - .../typed/flowcontrol/v1beta1/fake/BUILD | 39 - .../v1beta1/fake/fake_flowschema.go | 46 + .../fake/fake_prioritylevelconfiguration.go | 46 + .../typed/flowcontrol/v1beta1/flowschema.go | 59 + .../v1beta1/prioritylevelconfiguration.go | 59 + .../kubernetes/typed/networking/v1/BUILD | 44 - .../kubernetes/typed/networking/v1/fake/BUILD | 43 - .../typed/networking/v1/fake/fake_ingress.go | 48 + .../networking/v1/fake/fake_ingressclass.go | 24 + .../networking/v1/fake/fake_networkpolicy.go | 25 + .../kubernetes/typed/networking/v1/ingress.go | 61 + .../typed/networking/v1/ingressclass.go | 29 + .../typed/networking/v1/networkpolicy.go | 30 + .../kubernetes/typed/networking/v1beta1/BUILD | 40 - .../typed/networking/v1beta1/fake/BUILD | 39 - .../networking/v1beta1/fake/fake_ingress.go | 48 + .../v1beta1/fake/fake_ingressclass.go | 24 + .../typed/networking/v1beta1/ingress.go | 61 + .../typed/networking/v1beta1/ingressclass.go | 29 + .../client-go/kubernetes/typed/node/v1/BUILD | 39 - .../kubernetes/typed/node/v1/fake/BUILD | 38 - .../typed/node/v1/fake/fake_runtimeclass.go | 24 + .../kubernetes/typed/node/v1/runtimeclass.go | 29 + .../kubernetes/typed/node/v1alpha1/BUILD | 39 - .../kubernetes/typed/node/v1alpha1/fake/BUILD | 38 - .../node/v1alpha1/fake/fake_runtimeclass.go | 24 + .../typed/node/v1alpha1/runtimeclass.go | 29 + .../kubernetes/typed/node/v1beta1/BUILD | 39 - .../kubernetes/typed/node/v1beta1/fake/BUILD | 38 - .../node/v1beta1/fake/fake_runtimeclass.go | 24 + .../typed/node/v1beta1/runtimeclass.go | 29 + .../kubernetes/typed/policy/v1/doc.go | 20 + .../v1alpha1 => policy/v1}/fake/doc.go | 0 .../v1/fake/fake_poddisruptionbudget.go | 190 + .../policy/v1/fake/fake_policy_client.go | 40 + .../typed/policy/v1/generated_expansion.go | 21 + .../typed/policy/v1/poddisruptionbudget.go | 256 + .../typed/policy/v1/policy_client.go | 89 + .../kubernetes/typed/policy/v1beta1/BUILD | 45 - .../typed/policy/v1beta1/fake/BUILD | 44 - .../v1beta1/fake/fake_poddisruptionbudget.go | 48 + .../v1beta1/fake/fake_podsecuritypolicy.go | 24 + .../policy/v1beta1/poddisruptionbudget.go | 61 + .../typed/policy/v1beta1/podsecuritypolicy.go | 29 + .../client-go/kubernetes/typed/rbac/v1/BUILD | 45 - .../kubernetes/typed/rbac/v1/clusterrole.go | 29 + .../typed/rbac/v1/clusterrolebinding.go | 29 + .../kubernetes/typed/rbac/v1/fake/BUILD | 44 - .../typed/rbac/v1/fake/fake_clusterrole.go | 24 + .../rbac/v1/fake/fake_clusterrolebinding.go | 24 + .../typed/rbac/v1/fake/fake_role.go | 25 + .../typed/rbac/v1/fake/fake_rolebinding.go | 25 + .../kubernetes/typed/rbac/v1/role.go | 30 + .../kubernetes/typed/rbac/v1/rolebinding.go | 30 + .../kubernetes/typed/rbac/v1alpha1/BUILD | 45 - .../typed/rbac/v1alpha1/clusterrole.go | 29 + .../typed/rbac/v1alpha1/clusterrolebinding.go | 29 + .../kubernetes/typed/rbac/v1alpha1/fake/BUILD | 44 - .../rbac/v1alpha1/fake/fake_clusterrole.go | 24 + .../v1alpha1/fake/fake_clusterrolebinding.go | 24 + .../typed/rbac/v1alpha1/fake/fake_role.go | 25 + .../rbac/v1alpha1/fake/fake_rolebinding.go | 25 + .../kubernetes/typed/rbac/v1alpha1/role.go | 30 + .../typed/rbac/v1alpha1/rolebinding.go | 30 + .../kubernetes/typed/rbac/v1beta1/BUILD | 45 - .../typed/rbac/v1beta1/clusterrole.go | 29 + .../typed/rbac/v1beta1/clusterrolebinding.go | 29 + .../kubernetes/typed/rbac/v1beta1/fake/BUILD | 44 - .../rbac/v1beta1/fake/fake_clusterrole.go | 24 + .../v1beta1/fake/fake_clusterrolebinding.go | 24 + .../typed/rbac/v1beta1/fake/fake_role.go | 25 + .../rbac/v1beta1/fake/fake_rolebinding.go | 25 + .../kubernetes/typed/rbac/v1beta1/role.go | 30 + .../typed/rbac/v1beta1/rolebinding.go | 30 + .../kubernetes/typed/scheduling/v1/BUILD | 39 - .../kubernetes/typed/scheduling/v1/fake/BUILD | 38 - .../scheduling/v1/fake/fake_priorityclass.go | 24 + .../typed/scheduling/v1/priorityclass.go | 29 + .../typed/scheduling/v1alpha1/BUILD | 42 - .../typed/scheduling/v1alpha1/fake/BUILD | 41 - .../v1alpha1/fake/fake_priorityclass.go | 24 + .../scheduling/v1alpha1/priorityclass.go | 29 + .../kubernetes/typed/scheduling/v1beta1/BUILD | 39 - .../typed/scheduling/v1beta1/fake/BUILD | 38 - .../v1beta1/fake/fake_priorityclass.go | 24 + .../typed/scheduling/v1beta1/priorityclass.go | 29 + .../kubernetes/typed/storage/v1/BUILD | 45 - .../kubernetes/typed/storage/v1/csidriver.go | 29 + .../kubernetes/typed/storage/v1/csinode.go | 29 + .../kubernetes/typed/storage/v1/fake/BUILD | 44 - .../typed/storage/v1/fake/fake_csidriver.go | 24 + .../typed/storage/v1/fake/fake_csinode.go | 24 + .../storage/v1/fake/fake_storageclass.go | 24 + .../storage/v1/fake/fake_volumeattachment.go | 46 + .../typed/storage/v1/storageclass.go | 29 + .../typed/storage/v1/volumeattachment.go | 59 + .../kubernetes/typed/storage/v1alpha1/BUILD | 40 - .../storage/v1alpha1/csistoragecapacity.go | 30 + .../typed/storage/v1alpha1/fake/BUILD | 39 - .../v1alpha1/fake/fake_csistoragecapacity.go | 25 + .../v1alpha1/fake/fake_volumeattachment.go | 46 + .../storage/v1alpha1/volumeattachment.go | 59 + .../kubernetes/typed/storage/v1beta1/BUILD | 45 - .../typed/storage/v1beta1/csidriver.go | 29 + .../typed/storage/v1beta1/csinode.go | 29 + .../storage/v1beta1/csistoragecapacity.go | 208 + .../typed/storage/v1beta1/fake/BUILD | 44 - .../storage/v1beta1/fake/fake_csidriver.go | 24 + .../storage/v1beta1/fake/fake_csinode.go | 24 + .../v1beta1/fake/fake_csistoragecapacity.go | 155 + .../v1beta1/fake/fake_storage_client.go | 4 + .../storage/v1beta1/fake/fake_storageclass.go | 24 + .../v1beta1/fake/fake_volumeattachment.go | 46 + .../storage/v1beta1/generated_expansion.go | 2 + .../typed/storage/v1beta1/storage_client.go | 5 + .../typed/storage/v1beta1/storageclass.go | 29 + .../typed/storage/v1beta1/volumeattachment.go | 59 + .../listers/admissionregistration/v1/BUILD | 33 - .../admissionregistration/v1beta1/BUILD | 33 - .../listers/apiserverinternal/v1alpha1/BUILD | 32 - vendor/k8s.io/client-go/listers/apps/v1/BUILD | 41 - .../client-go/listers/apps/v1beta1/BUILD | 40 - .../client-go/listers/apps/v1beta2/BUILD | 44 - .../client-go/listers/autoscaling/v1/BUILD | 32 - .../listers/autoscaling/v2beta1/BUILD | 32 - .../listers/autoscaling/v2beta2/BUILD | 32 - .../k8s.io/client-go/listers/batch/v1/BUILD | 38 - .../client-go/listers/batch/v1/cronjob.go | 99 + .../listers/batch/v1/expansion_generated.go | 8 + .../client-go/listers/batch/v1beta1/BUILD | 35 - .../client-go/listers/batch/v2alpha1/BUILD | 35 - .../listers/batch/v2alpha1/cronjob.go | 99 - .../batch/v2alpha1/expansion_generated.go | 27 - .../client-go/listers/certificates/v1/BUILD | 32 - .../listers/certificates/v1beta1/BUILD | 35 - .../client-go/listers/coordination/v1/BUILD | 32 - .../listers/coordination/v1beta1/BUILD | 32 - vendor/k8s.io/client-go/listers/core/v1/BUILD | 51 - .../listers/discovery/v1/endpointslice.go | 99 + .../discovery/v1/expansion_generated.go | 27 + .../listers/discovery/v1alpha1/BUILD | 32 - .../discovery/v1alpha1/endpointslice.go | 99 - .../discovery/v1alpha1/expansion_generated.go | 27 - .../client-go/listers/discovery/v1beta1/BUILD | 32 - .../k8s.io/client-go/listers/events/v1/BUILD | 32 - .../client-go/listers/events/v1beta1/BUILD | 32 - .../listers/extensions/v1beta1/BUILD | 60 - .../listers/flowcontrol/v1alpha1/BUILD | 33 - .../listers/flowcontrol/v1beta1/BUILD | 33 - .../client-go/listers/networking/v1/BUILD | 37 - .../listers/networking/v1beta1/BUILD | 33 - vendor/k8s.io/client-go/listers/node/v1/BUILD | 32 - .../client-go/listers/node/v1alpha1/BUILD | 32 - .../client-go/listers/node/v1beta1/BUILD | 32 - .../listers/policy/v1/expansion_generated.go | 19 + .../listers/policy/v1/poddisruptionbudget.go | 99 + .../v1/poddisruptionbudget_expansion.go | 69 + .../client-go/listers/policy/v1beta1/BUILD | 41 - .../v1beta1/poddisruptionbudget_expansion.go | 4 - vendor/k8s.io/client-go/listers/rbac/v1/BUILD | 38 - .../client-go/listers/rbac/v1alpha1/BUILD | 38 - .../client-go/listers/rbac/v1beta1/BUILD | 38 - .../client-go/listers/scheduling/v1/BUILD | 32 - .../listers/scheduling/v1alpha1/BUILD | 35 - .../listers/scheduling/v1beta1/BUILD | 32 - .../k8s.io/client-go/listers/storage/v1/BUILD | 38 - .../client-go/listers/storage/v1alpha1/BUILD | 33 - .../client-go/listers/storage/v1beta1/BUILD | 38 - .../storage/v1beta1/csistoragecapacity.go | 99 + .../storage/v1beta1/expansion_generated.go | 8 + .../pkg/apis/clientauthentication/BUILD | 38 - .../apis/clientauthentication/v1alpha1/BUILD | 41 - .../apis/clientauthentication/v1beta1/BUILD | 38 - vendor/k8s.io/client-go/pkg/version/BUILD | 31 - vendor/k8s.io/client-go/pkg/version/base.go | 2 +- vendor/k8s.io/client-go/pkg/version/def.bzl | 38 - .../client-go/plugin/pkg/client/auth/BUILD | 39 - .../plugin/pkg/client/auth/azure/BUILD | 45 - .../plugin/pkg/client/auth/exec/BUILD | 62 - .../plugin/pkg/client/auth/exec/exec.go | 47 +- .../plugin/pkg/client/auth/exec/metrics.go | 49 + .../plugin/pkg/client/auth/gcp/BUILD | 43 - .../plugin/pkg/client/auth/oidc/BUILD | 39 - .../plugin/pkg/client/auth/openstack/BUILD | 30 - vendor/k8s.io/client-go/rest/BUILD | 110 - vendor/k8s.io/client-go/rest/OWNERS | 2 - vendor/k8s.io/client-go/rest/client.go | 2 +- vendor/k8s.io/client-go/rest/fake/BUILD | 33 - vendor/k8s.io/client-go/rest/plugin.go | 10 + vendor/k8s.io/client-go/rest/request.go | 62 +- vendor/k8s.io/client-go/rest/watch/BUILD | 56 - vendor/k8s.io/client-go/restmapper/BUILD | 57 - vendor/k8s.io/client-go/scale/BUILD | 80 - vendor/k8s.io/client-go/scale/scheme/BUILD | 42 - .../client-go/scale/scheme/appsint/BUILD | 32 - .../client-go/scale/scheme/appsv1beta1/BUILD | 36 - .../client-go/scale/scheme/appsv1beta2/BUILD | 36 - .../scale/scheme/autoscalingv1/BUILD | 36 - .../scale/scheme/extensionsint/BUILD | 32 - .../scale/scheme/extensionsv1beta1/BUILD | 36 - vendor/k8s.io/client-go/testing/BUILD | 66 - .../third_party/forked/golang/template/BUILD | 29 - vendor/k8s.io/client-go/tools/auth/BUILD | 37 - vendor/k8s.io/client-go/tools/cache/BUILD | 111 - vendor/k8s.io/client-go/tools/cache/OWNERS | 2 - .../client-go/tools/cache/delta_fifo.go | 212 +- vendor/k8s.io/client-go/tools/clientcmd/BUILD | 79 - .../client-go/tools/clientcmd/api/BUILD | 51 - .../tools/clientcmd/api/latest/BUILD | 35 - .../client-go/tools/clientcmd/api/v1/BUILD | 39 - .../client-go/tools/clientcmd/auth_loaders.go | 6 +- .../tools/clientcmd/client_config.go | 35 +- .../client-go/tools/clientcmd/config.go | 2 +- .../client-go/tools/clientcmd/loader.go | 41 +- vendor/k8s.io/client-go/tools/events/BUILD | 68 - vendor/k8s.io/client-go/tools/events/OWNERS | 2 + .../client-go/tools/leaderelection/BUILD | 62 - .../client-go/tools/leaderelection/OWNERS | 1 - .../tools/leaderelection/resourcelock/BUILD | 40 - .../leaderelection/resourcelock/interface.go | 5 +- vendor/k8s.io/client-go/tools/metrics/BUILD | 26 - .../k8s.io/client-go/tools/metrics/metrics.go | 26 +- vendor/k8s.io/client-go/tools/pager/BUILD | 49 - .../k8s.io/client-go/tools/portforward/BUILD | 42 - vendor/k8s.io/client-go/tools/record/BUILD | 70 - vendor/k8s.io/client-go/tools/record/OWNERS | 28 +- vendor/k8s.io/client-go/tools/record/event.go | 25 +- .../k8s.io/client-go/tools/record/util/BUILD | 27 - vendor/k8s.io/client-go/tools/reference/BUILD | 44 - .../client-go/tools/remotecommand/BUILD | 62 - .../client-go/tools/remotecommand/v2.go | 5 + vendor/k8s.io/client-go/tools/watch/BUILD | 63 - .../client-go/tools/watch/informerwatcher.go | 2 +- .../client-go/tools/watch/retrywatcher.go | 14 +- vendor/k8s.io/client-go/transport/BUILD | 58 - .../client-go/transport/round_trippers.go | 59 +- vendor/k8s.io/client-go/transport/spdy/BUILD | 31 - .../k8s.io/client-go/transport/spdy/spdy.go | 9 +- .../client-go/transport/token_source.go | 56 +- vendor/k8s.io/client-go/util/cert/BUILD | 42 - .../k8s.io/client-go/util/certificate/BUILD | 70 - .../client-go/util/certificate/csr/BUILD | 46 - .../k8s.io/client-go/util/connrotation/BUILD | 29 - .../util/connrotation/connrotation.go | 84 +- vendor/k8s.io/client-go/util/exec/BUILD | 26 - .../k8s.io/client-go/util/flowcontrol/BUILD | 45 - vendor/k8s.io/client-go/util/homedir/BUILD | 26 - vendor/k8s.io/client-go/util/jsonpath/BUILD | 42 - vendor/k8s.io/client-go/util/keyutil/BUILD | 33 - vendor/k8s.io/client-go/util/retry/BUILD | 42 - vendor/k8s.io/client-go/util/workqueue/BUILD | 59 - .../k8s.io/client-go/util/workqueue/queue.go | 8 +- vendor/k8s.io/cloud-provider/BUILD | 54 - vendor/k8s.io/cloud-provider/OWNERS | 1 - vendor/k8s.io/cloud-provider/api/BUILD | 26 - .../credentialconfig/registry.go | 31 + vendor/k8s.io/cloud-provider/go.mod | 18 +- vendor/k8s.io/cloud-provider/go.sum | 220 +- .../k8s.io/cloud-provider/node/helpers/BUILD | 55 - .../cloud-provider/service/helpers/BUILD | 43 - vendor/k8s.io/cloud-provider/volume/BUILD | 27 - .../k8s.io/cloud-provider/volume/errors/BUILD | 24 - .../cloud-provider/volume/helpers/BUILD | 47 - .../cloud-provider/volume/helpers/zones.go | 13 +- .../k8s.io/cluster-bootstrap/token/api/BUILD | 27 - .../k8s.io/cluster-bootstrap/token/util/BUILD | 33 - .../cluster-bootstrap/util/secrets/BUILD | 41 - .../cluster-bootstrap/util/tokens/BUILD | 24 - vendor/k8s.io/component-base/cli/flag/BUILD | 63 - .../component-base/cli/flag/sectioned.go | 9 +- .../cli/flag/string_slice_flag.go | 6 +- .../component-base/cli/globalflag/BUILD | 38 - .../cli/globalflag/globalflags.go | 13 +- vendor/k8s.io/component-base/codec/BUILD | 27 - vendor/k8s.io/component-base/config/BUILD | 34 - vendor/k8s.io/component-base/config/types.go | 2 +- .../component-base/config/v1alpha1/BUILD | 38 - .../component-base/config/validation/BUILD | 38 - vendor/k8s.io/component-base/configz/BUILD | 33 - .../k8s.io/component-base/featuregate/BUILD | 41 - vendor/k8s.io/component-base/logs/BUILD | 44 - .../k8s.io/component-base/logs/datapol/BUILD | 37 - vendor/k8s.io/component-base/logs/json/BUILD | 43 - .../k8s.io/component-base/logs/json/json.go | 5 +- .../component-base/logs/logreduction/BUILD | 29 - vendor/k8s.io/component-base/logs/options.go | 33 +- .../component-base/logs/sanitization/BUILD | 31 - vendor/k8s.io/component-base/metrics/BUILD | 101 - vendor/k8s.io/component-base/metrics/OWNERS | 1 + .../component-base/metrics/collector.go | 20 +- .../k8s.io/component-base/metrics/counter.go | 57 +- vendor/k8s.io/component-base/metrics/gauge.go | 45 +- .../component-base/metrics/histogram.go | 45 +- .../metrics/legacyregistry/BUILD | 28 - .../k8s.io/component-base/metrics/metric.go | 23 +- .../k8s.io/component-base/metrics/options.go | 52 +- vendor/k8s.io/component-base/metrics/opts.go | 120 +- .../metrics/processstarttime.go | 26 +- .../metrics/processstarttime_others.go | 38 + .../metrics/processstarttime_windows.go | 33 + .../metrics/prometheus/ratelimiter/BUILD | 35 - .../metrics/prometheus/workqueue/BUILD | 28 - .../k8s.io/component-base/metrics/registry.go | 16 +- .../k8s.io/component-base/metrics/summary.go | 45 +- .../component-base/metrics/testutil/BUILD | 51 - .../metrics/testutil/metrics.go | 30 +- vendor/k8s.io/component-base/term/BUILD | 24 - vendor/k8s.io/component-base/version/BUILD | 30 - vendor/k8s.io/component-base/version/base.go | 2 +- vendor/k8s.io/component-base/version/def.bzl | 39 - .../component-base/version/verflag/BUILD | 31 - .../apimachinery/lease/BUILD | 57 - .../apps/poddisruptionbudget/helpers.go | 65 + .../auth/rbac/reconciliation/BUILD | 64 - .../auth/rbac/validation/BUILD | 31 - .../node/topology/helpers.go | 57 + .../component-helpers/scheduling/corev1/BUILD | 44 - .../scheduling/corev1/helpers.go | 56 + .../scheduling/corev1/nodeaffinity/BUILD | 42 - .../corev1/nodeaffinity/nodeaffinity.go | 152 +- .../storage/volume/helpers.go | 44 + .../pkg/clientbuilder/BUILD | 41 - .../pkg/clientbuilder/client_builder.go | 255 - vendor/k8s.io/cri-api/pkg/apis/BUILD | 29 - .../cri-api/pkg/apis/runtime/v1alpha2/BUILD | 34 - .../pkg/apis/runtime/v1alpha2/api.pb.go | 573 +- vendor/k8s.io/csi-translation-lib/BUILD | 43 - vendor/k8s.io/csi-translation-lib/OWNERS | 3 + vendor/k8s.io/csi-translation-lib/go.mod | 11 +- vendor/k8s.io/csi-translation-lib/go.sum | 71 +- .../k8s.io/csi-translation-lib/plugins/BUILD | 58 - .../csi-translation-lib/plugins/aws_ebs.go | 39 +- .../csi-translation-lib/plugins/azure_file.go | 53 +- .../csi-translation-lib/plugins/gce_pd.go | 20 +- .../plugins/in_tree_volume.go | 258 +- .../plugins/openstack_cinder.go | 33 +- .../pkg/apis/apiregistration/BUILD | 51 - .../pkg/apis/apiregistration/install/BUILD | 33 - .../pkg/apis/apiregistration/v1/BUILD | 47 - .../apis/apiregistration/v1/generated.pb.go | 30 +- .../pkg/apis/apiregistration/v1/helper/BUILD | 36 - .../pkg/apis/apiregistration/v1beta1/BUILD | 45 - .../apiregistration/v1beta1/generated.pb.go | 30 +- .../pkg/apis/apiregistration/validation/BUILD | 33 - .../kube-aggregator/pkg/apiserver/BUILD | 110 - .../pkg/apiserver/apiserver.go | 25 +- .../pkg/apiserver/apiservice_controller.go | 4 +- .../pkg/apiserver/handler_proxy.go | 7 + .../pkg/apiserver/scheme/BUILD | 32 - .../clientset_generated/clientset/BUILD | 42 - .../clientset/scheme/BUILD | 38 - .../clientset/typed/apiregistration/v1/BUILD | 39 - .../typed/apiregistration/v1beta1/BUILD | 42 - .../client/informers/externalversions/BUILD | 44 - .../externalversions/apiregistration/BUILD | 35 - .../externalversions/apiregistration/v1/BUILD | 36 - .../apiregistration/v1beta1/BUILD | 39 - .../externalversions/internalinterfaces/BUILD | 32 - .../client/listers/apiregistration/v1/BUILD | 32 - .../listers/apiregistration/v1beta1/BUILD | 35 - .../kube-aggregator/pkg/controllers/BUILD | 36 - .../pkg/controllers/autoregister/BUILD | 57 - .../autoregister/autoregister_controller.go | 4 +- .../pkg/controllers/openapi/BUILD | 34 - .../pkg/controllers/openapi/aggregator/BUILD | 58 - .../pkg/controllers/openapi/controller.go | 4 +- .../pkg/controllers/status/BUILD | 78 - .../status/available_controller.go | 4 +- .../pkg/controllers/status/metrics.go | 2 +- .../pkg/registry/apiservice/BUILD | 42 - .../pkg/registry/apiservice/etcd/BUILD | 37 - .../pkg/registry/apiservice/etcd/etcd.go | 17 +- .../pkg/registry/apiservice/rest/BUILD | 35 - .../apiservice/rest/storage_apiservice.go | 6 +- .../pkg/registry/apiservice/strategy.go | 34 +- .../k8s.io/kube-openapi/pkg/schemaconv/smd.go | 48 +- vendor/k8s.io/kube-openapi/pkg/util/util.go | 5 + .../pkg/validation/validate/type.go | 2 +- .../k8s.io/kube-proxy/config/v1alpha1/BUILD | 41 - .../k8s.io/kube-scheduler/extender/v1/BUILD | 43 - .../kube-scheduler/extender/v1/types.go | 4 + .../extender/v1/zz_generated.deepcopy.go | 7 + vendor/k8s.io/kubectl/pkg/apps/BUILD | 39 - vendor/k8s.io/kubectl/pkg/cmd/util/BUILD | 82 - .../k8s.io/kubectl/pkg/cmd/util/env_file.go | 103 + vendor/k8s.io/kubectl/pkg/cmd/util/factory.go | 5 +- .../pkg/cmd/util/factory_client_access.go | 45 +- vendor/k8s.io/kubectl/pkg/cmd/util/helpers.go | 4 + .../kubectl/pkg/cmd/util/podcmd/podcmd.go | 104 + vendor/k8s.io/kubectl/pkg/describe/BUILD | 100 - .../k8s.io/kubectl/pkg/describe/describe.go | 304 +- .../kubectl/pkg/polymorphichelpers/BUILD | 118 - .../pkg/polymorphichelpers/logsforobject.go | 62 +- .../pkg/polymorphichelpers/updatepodspec.go | 3 +- vendor/k8s.io/kubectl/pkg/scale/BUILD | 51 - vendor/k8s.io/kubectl/pkg/scheme/BUILD | 79 - vendor/k8s.io/kubectl/pkg/scheme/install.go | 6 +- .../k8s.io/kubectl/pkg/util/certificate/BUILD | 23 - .../k8s.io/kubectl/pkg/util/deployment/BUILD | 33 - vendor/k8s.io/kubectl/pkg/util/event/BUILD | 34 - .../k8s.io/kubectl/pkg/util/fieldpath/BUILD | 28 - .../k8s.io/kubectl/pkg/util/interrupt/BUILD | 23 - vendor/k8s.io/kubectl/pkg/util/openapi/BUILD | 60 - .../pkg/util/openapi/openapi_getter.go | 61 +- .../kubectl/pkg/util/openapi/validation/BUILD | 51 - vendor/k8s.io/kubectl/pkg/util/podutils/BUILD | 28 - vendor/k8s.io/kubectl/pkg/util/qos/BUILD | 28 - vendor/k8s.io/kubectl/pkg/util/rbac/BUILD | 27 - vendor/k8s.io/kubectl/pkg/util/resource/BUILD | 28 - vendor/k8s.io/kubectl/pkg/util/slice/BUILD | 33 - vendor/k8s.io/kubectl/pkg/util/storage/BUILD | 27 - .../k8s.io/kubectl/pkg/util/templates/BUILD | 36 - vendor/k8s.io/kubectl/pkg/util/term/BUILD | 86 - vendor/k8s.io/kubectl/pkg/validation/BUILD | 34 - vendor/k8s.io/kubelet/config/v1alpha1/BUILD | 33 - vendor/k8s.io/kubelet/config/v1beta1/BUILD | 42 - vendor/k8s.io/kubelet/config/v1beta1/types.go | 56 +- .../config/v1beta1/zz_generated.deepcopy.go | 41 + .../kubelet/pkg/apis/credentialprovider/BUILD | 37 - .../pkg/apis/credentialprovider/install/BUILD | 29 - .../apis/credentialprovider/v1alpha1/BUILD | 37 - .../pkg/apis/deviceplugin/v1beta1/BUILD | 37 - .../pkg/apis/deviceplugin/v1beta1/api.pb.go | 99 +- .../apis/deviceplugin/v1beta1/constants.go | 10 + .../pkg/apis/pluginregistration/v1/BUILD | 35 - .../kubelet/pkg/apis/podresources/v1/BUILD | 30 - .../pkg/apis/podresources/v1/api.pb.go | 600 +- .../pkg/apis/podresources/v1/api.proto | 9 + .../pkg/apis/podresources/v1alpha1/BUILD | 30 - .../kubelet/pkg/apis/stats/v1alpha1/BUILD | 27 - .../pkg}/apis/well_known_labels.go | 0 .../kubernetes/cmd/kube-apiserver/app/BUILD | 102 - .../cmd/kube-apiserver/app/aggregator.go | 10 +- .../cmd/kube-apiserver/app/apiextensions.go | 2 + .../cmd/kube-apiserver/app/options/BUILD | 88 - .../cmd/kube-apiserver/app/options/options.go | 5 +- .../kube-apiserver/app/options/validation.go | 28 +- .../cmd/kube-apiserver/app/server.go | 37 +- .../kubernetes/cmd/kube-proxy/app/BUILD | 405 - .../kubernetes/cmd/kube-proxy/app/server.go | 13 +- .../cmd/kube-proxy/app/server_others.go | 80 +- .../cmd/kube-proxy/app/server_windows.go | 9 +- .../k8s.io/kubernetes/cmd/kubelet/app/BUILD | 179 - .../k8s.io/kubernetes/cmd/kubelet/app/auth.go | 1 + .../cmd/kubelet/app/init_windows.go | 2 +- .../kubernetes/cmd/kubelet/app/options/BUILD | 90 - .../kubelet/app/options/container_runtime.go | 2 +- .../cmd/kubelet/app/options/options.go | 28 +- .../kubernetes/cmd/kubelet/app/patch_auth.go | 17 + .../kubernetes/cmd/kubelet/app/plugins.go | 5 - .../cmd/kubelet/app/plugins_providers.go | 43 +- .../kubernetes/cmd/kubelet/app/server.go | 162 +- .../cmd/kubelet/app/server_linux.go | 8 +- .../cmd/kubelet/app/server_others.go | 33 + .../cmd/kubelet/app/server_windows.go | 85 + .../openshift-hack/e2e/annotate/rules.go | 33 +- .../admission/admissionenablement/register.go | 3 + .../managementcpusoverride/admission.go | 573 + .../autoscaling/managementcpusoverride/doc.go | 16 + .../validation/validation.go | 2 +- .../customresourcevalidation/network/BUILD | 32 - .../oauth/bootstrapauthenticator.go | 10 +- .../oauth/tokenauthenticator.go | 15 +- .../apiaccess_count_controller.go | 169 + .../deprecatedapirequest/deprecated.go | 27 + .../deprecatedapirequest/request_counts.go | 413 + .../deprecatedapirequest/update_func.go | 202 + .../deprecatedapirequest/v1helpers/helpers.go | 58 + .../filters/deprecatedapirequest_filter.go | 40 + .../openshiftkubeapiserver/patch.go | 60 +- .../patch_handlerchain.go | 154 +- .../kubernetes/pkg/api/legacyscheme/BUILD | 26 - .../kubernetes/pkg/api/persistentvolume/BUILD | 40 - .../pkg/api/persistentvolumeclaim/BUILD | 44 - vendor/k8s.io/kubernetes/pkg/api/pod/BUILD | 56 - vendor/k8s.io/kubernetes/pkg/api/pod/util.go | 264 +- .../pkg/api/podsecuritypolicy/BUILD | 45 - .../pkg/api/podsecuritypolicy/util.go | 17 - .../k8s.io/kubernetes/pkg/api/service/BUILD | 40 - .../kubernetes/pkg/api/v1/endpoints/BUILD | 42 - .../pkg/api/v1/persistentvolume/BUILD | 35 - .../pkg/api/v1/persistentvolume/util.go | 12 + vendor/k8s.io/kubernetes/pkg/api/v1/pod/BUILD | 51 - .../k8s.io/kubernetes/pkg/api/v1/pod/util.go | 15 +- .../kubernetes/pkg/api/v1/resource/BUILD | 44 - .../kubernetes/pkg/api/v1/service/BUILD | 40 - .../kubernetes/pkg/api/v1/service/util.go | 11 +- vendor/k8s.io/kubernetes/pkg/apis/abac/BUILD | 42 - vendor/k8s.io/kubernetes/pkg/apis/abac/OWNERS | 1 - .../kubernetes/pkg/apis/abac/latest/BUILD | 30 - .../k8s.io/kubernetes/pkg/apis/abac/v0/BUILD | 51 - .../kubernetes/pkg/apis/abac/v1beta1/BUILD | 52 - .../kubernetes/pkg/apis/admission/BUILD | 43 - .../pkg/apis/admission/install/BUILD | 33 - .../kubernetes/pkg/apis/admission/v1/BUILD | 40 - .../pkg/apis/admission/v1beta1/BUILD | 40 - .../pkg/apis/admissionregistration/BUILD | 42 - .../apis/admissionregistration/install/BUILD | 33 - .../admissionregistration/install/install.go | 4 +- .../pkg/apis/admissionregistration/types.go | 4 +- .../pkg/apis/admissionregistration/v1/BUILD | 53 - .../apis/admissionregistration/v1beta1/BUILD | 53 - .../admissionregistration/validation/BUILD | 49 - .../pkg/apis/apiserverinternal/BUILD | 38 - .../pkg/apis/apiserverinternal/install/BUILD | 39 - .../pkg/apis/apiserverinternal/v1alpha1/BUILD | 34 - .../apis/apiserverinternal/validation/BUILD | 39 - vendor/k8s.io/kubernetes/pkg/apis/apps/BUILD | 46 - vendor/k8s.io/kubernetes/pkg/apis/apps/OWNERS | 2 - .../kubernetes/pkg/apis/apps/install/BUILD | 34 - .../k8s.io/kubernetes/pkg/apis/apps/types.go | 38 +- .../k8s.io/kubernetes/pkg/apis/apps/v1/BUILD | 65 - .../kubernetes/pkg/apis/apps/v1/defaults.go | 5 + .../apis/apps/v1/zz_generated.conversion.go | 6 + .../pkg/apis/apps/v1/zz_generated.defaults.go | 26 +- .../kubernetes/pkg/apis/apps/v1beta1/BUILD | 65 - .../apps/v1beta1/zz_generated.defaults.go | 14 +- .../kubernetes/pkg/apis/apps/v1beta2/BUILD | 72 - .../pkg/apis/apps/v1beta2/defaults.go | 5 + .../apps/v1beta2/zz_generated.conversion.go | 6 + .../apps/v1beta2/zz_generated.defaults.go | 26 +- .../kubernetes/pkg/apis/apps/validation/BUILD | 58 - .../pkg/apis/apps/validation/validation.go | 69 +- .../pkg/apis/apps/zz_generated.deepcopy.go | 1 + .../kubernetes/pkg/apis/authentication/BUILD | 43 - .../pkg/apis/authentication/install/BUILD | 33 - .../pkg/apis/authentication/v1/BUILD | 41 - .../pkg/apis/authentication/v1beta1/BUILD | 38 - .../pkg/apis/authentication/validation/BUILD | 26 - .../kubernetes/pkg/apis/authorization/BUILD | 42 - .../pkg/apis/authorization/install/BUILD | 33 - .../pkg/apis/authorization/v1/BUILD | 38 - .../pkg/apis/authorization/v1beta1/BUILD | 38 - .../pkg/apis/authorization/validation/BUILD | 43 - .../kubernetes/pkg/apis/autoscaling/BUILD | 47 - .../kubernetes/pkg/apis/autoscaling/OWNERS | 3 - .../pkg/apis/autoscaling/install/BUILD | 31 - .../kubernetes/pkg/apis/autoscaling/v1/BUILD | 56 - .../pkg/apis/autoscaling/v1/conversion.go | 1 + .../pkg/apis/autoscaling/v2beta1/BUILD | 62 - .../apis/autoscaling/v2beta1/conversion.go | 1 + .../pkg/apis/autoscaling/v2beta2/BUILD | 58 - .../pkg/apis/autoscaling/validation/BUILD | 53 - vendor/k8s.io/kubernetes/pkg/apis/batch/BUILD | 44 - .../k8s.io/kubernetes/pkg/apis/batch/OWNERS | 2 - .../kubernetes/pkg/apis/batch/install/BUILD | 34 - .../pkg/apis/batch/install/install.go | 4 +- .../k8s.io/kubernetes/pkg/apis/batch/types.go | 92 +- .../k8s.io/kubernetes/pkg/apis/batch/v1/BUILD | 60 - .../pkg/apis/batch/v1/conversion.go | 50 +- .../kubernetes/pkg/apis/batch/v1/defaults.go | 37 +- .../apis/batch/v1/zz_generated.conversion.go | 216 + .../apis/batch/v1/zz_generated.defaults.go | 231 +- .../kubernetes/pkg/apis/batch/v1beta1/BUILD | 59 - .../batch/v1beta1/zz_generated.conversion.go | 2 + .../batch/v1beta1/zz_generated.defaults.go | 14 +- .../kubernetes/pkg/apis/batch/v2alpha1/BUILD | 58 - .../pkg/apis/batch/v2alpha1/conversion.go | 44 - .../pkg/apis/batch/v2alpha1/defaults.go | 35 - .../kubernetes/pkg/apis/batch/v2alpha1/doc.go | 23 - .../pkg/apis/batch/v2alpha1/register.go | 45 - .../batch/v2alpha1/zz_generated.conversion.go | 288 - .../batch/v2alpha1/zz_generated.defaults.go | 473 - .../pkg/apis/batch/validation/BUILD | 53 - .../pkg/apis/batch/validation/validation.go | 20 + .../pkg/apis/batch/zz_generated.deepcopy.go | 14 + .../kubernetes/pkg/apis/certificates/BUILD | 45 - .../pkg/apis/certificates/install/BUILD | 33 - .../pkg/apis/certificates/install/install.go | 3 +- .../kubernetes/pkg/apis/certificates/types.go | 25 +- .../kubernetes/pkg/apis/certificates/v1/BUILD | 39 - .../pkg/apis/certificates/v1beta1/BUILD | 52 - .../pkg/apis/certificates/validation/BUILD | 54 - .../kubernetes/pkg/apis/coordination/BUILD | 38 - .../pkg/apis/coordination/install/BUILD | 30 - .../pkg/apis/coordination/install/install.go | 4 +- .../kubernetes/pkg/apis/coordination/v1/BUILD | 35 - .../pkg/apis/coordination/v1beta1/BUILD | 35 - .../pkg/apis/coordination/validation/BUILD | 38 - vendor/k8s.io/kubernetes/pkg/apis/core/BUILD | 60 - vendor/k8s.io/kubernetes/pkg/apis/core/OWNERS | 2 - .../pkg/apis/core/annotation_key_constants.go | 23 + .../pkg/apis/core/field_constants.go | 38 - .../kubernetes/pkg/apis/core/helper/BUILD | 51 - .../pkg/apis/core/helper/helpers.go | 50 +- .../kubernetes/pkg/apis/core/helper/qos/BUILD | 30 - .../kubernetes/pkg/apis/core/install/BUILD | 47 - .../kubernetes/pkg/apis/core/install/OWNERS | 1 - .../kubernetes/pkg/apis/core/pods/BUILD | 42 - .../k8s.io/kubernetes/pkg/apis/core/types.go | 88 +- .../k8s.io/kubernetes/pkg/apis/core/v1/BUILD | 81 - .../k8s.io/kubernetes/pkg/apis/core/v1/OWNERS | 3 - .../kubernetes/pkg/apis/core/v1/defaults.go | 52 +- .../kubernetes/pkg/apis/core/v1/helper/BUILD | 49 - .../pkg/apis/core/v1/helper/helpers.go | 86 - .../pkg/apis/core/v1/helper/qos/BUILD | 46 - .../pkg/apis/core/v1/validation/BUILD | 44 - .../apis/core/v1/zz_generated.conversion.go | 10 +- .../pkg/apis/core/v1/zz_generated.defaults.go | 29 +- .../kubernetes/pkg/apis/core/validation/BUILD | 88 - .../pkg/apis/core/validation/OWNERS | 2 - .../pkg/apis/core/validation/validation.go | 316 +- .../pkg/apis/core/zz_generated.deepcopy.go | 20 + .../kubernetes/pkg/apis/discovery/BUILD | 40 - .../pkg/apis/discovery/install/BUILD | 30 - .../pkg/apis/discovery/install/install.go | 6 +- .../kubernetes/pkg/apis/discovery/types.go | 39 +- .../pkg/apis/discovery/v1/defaults.go | 42 + .../kubernetes/pkg/apis/discovery/v1/doc.go | 22 + .../pkg/apis/discovery/v1/register.go | 45 + .../discovery/v1/zz_generated.conversion.go | 288 + .../discovery/v1/zz_generated.defaults.go | 49 + .../pkg/apis/discovery/v1alpha1/BUILD | 52 - .../pkg/apis/discovery/v1alpha1/defaults.go | 42 - .../pkg/apis/discovery/v1alpha1/doc.go | 22 - .../pkg/apis/discovery/v1alpha1/register.go | 45 - .../v1alpha1/zz_generated.conversion.go | 224 - .../v1alpha1/zz_generated.defaults.go | 49 - .../pkg/apis/discovery/v1beta1/BUILD | 52 - .../pkg/apis/discovery/v1beta1/conversion.go | 92 + .../v1beta1/zz_generated.conversion.go | 141 +- .../pkg/apis/discovery/validation/BUILD | 44 - .../apis/discovery/validation/validation.go | 47 +- .../apis/discovery/zz_generated.deepcopy.go | 51 +- .../k8s.io/kubernetes/pkg/apis/events/BUILD | 35 - .../kubernetes/pkg/apis/events/install/BUILD | 30 - .../kubernetes/pkg/apis/events/v1/BUILD | 37 - .../kubernetes/pkg/apis/events/v1beta1/BUILD | 37 - .../kubernetes/pkg/apis/extensions/BUILD | 44 - .../kubernetes/pkg/apis/extensions/OWNERS | 4 - .../pkg/apis/extensions/install/BUILD | 32 - .../pkg/apis/extensions/v1beta1/BUILD | 75 - .../pkg/apis/extensions/v1beta1/defaults.go | 7 +- .../v1beta1/zz_generated.conversion.go | 8 + .../v1beta1/zz_generated.defaults.go | 20 +- .../kubernetes/pkg/apis/flowcontrol/BUILD | 40 - .../pkg/apis/flowcontrol/install/BUILD | 33 - .../apis/flowcontrol/internalbootstrap/BUILD | 40 - .../pkg/apis/flowcontrol/util/BUILD | 23 - .../pkg/apis/flowcontrol/v1alpha1/BUILD | 35 - .../pkg/apis/flowcontrol/v1beta1/BUILD | 35 - .../pkg/apis/flowcontrol/validation/BUILD | 46 - .../kubernetes/pkg/apis/imagepolicy/BUILD | 40 - .../pkg/apis/imagepolicy/install/BUILD | 32 - .../pkg/apis/imagepolicy/v1alpha1/BUILD | 37 - .../kubernetes/pkg/apis/networking/BUILD | 44 - .../pkg/apis/networking/install/BUILD | 33 - .../kubernetes/pkg/apis/networking/types.go | 55 +- .../kubernetes/pkg/apis/networking/v1/BUILD | 59 - .../pkg/apis/networking/v1/defaults.go | 12 + .../networking/v1/zz_generated.conversion.go | 44 +- .../networking/v1/zz_generated.defaults.go | 13 + .../pkg/apis/networking/v1beta1/BUILD | 60 - .../v1beta1/zz_generated.conversion.go | 42 +- .../pkg/apis/networking/validation/BUILD | 59 - .../apis/networking/validation/validation.go | 74 +- .../apis/networking/zz_generated.deepcopy.go | 38 +- vendor/k8s.io/kubernetes/pkg/apis/node/BUILD | 40 - .../kubernetes/pkg/apis/node/install/BUILD | 31 - .../pkg/apis/node/install/install.go | 9 +- .../k8s.io/kubernetes/pkg/apis/node/v1/BUILD | 35 - .../kubernetes/pkg/apis/node/v1alpha1/BUILD | 52 - .../kubernetes/pkg/apis/node/v1beta1/BUILD | 35 - .../kubernetes/pkg/apis/node/validation/BUILD | 44 - .../pkg/apis/node/validation/validation.go | 3 +- .../k8s.io/kubernetes/pkg/apis/policy/BUILD | 43 - .../kubernetes/pkg/apis/policy/helper.go | 51 + .../kubernetes/pkg/apis/policy/install/BUILD | 32 - .../pkg/apis/policy/install/install.go | 5 +- .../kubernetes/pkg/apis/policy/types.go | 5 + .../pkg/apis/policy/v1/conversion.go | 42 + .../kubernetes/pkg/apis/policy/v1/doc.go | 24 + .../kubernetes/pkg/apis/policy/v1/register.go | 45 + .../apis/policy/v1/zz_generated.conversion.go | 207 + .../apis/policy/v1/zz_generated.defaults.go | 32 + .../kubernetes/pkg/apis/policy/v1beta1/BUILD | 42 - .../pkg/apis/policy/v1beta1/conversion.go | 66 + .../policy/v1beta1/zz_generated.conversion.go | 56 +- .../pkg/apis/policy/validation/BUILD | 58 - .../pkg/apis/policy/validation/validation.go | 38 +- .../pkg/apis/policy/zz_generated.deepcopy.go | 7 + vendor/k8s.io/kubernetes/pkg/apis/rbac/BUILD | 59 - .../kubernetes/pkg/apis/rbac/install/BUILD | 34 - .../k8s.io/kubernetes/pkg/apis/rbac/v1/BUILD | 42 - .../kubernetes/pkg/apis/rbac/v1alpha1/BUILD | 54 - .../kubernetes/pkg/apis/rbac/v1beta1/BUILD | 40 - .../kubernetes/pkg/apis/rbac/validation/BUILD | 45 - .../kubernetes/pkg/apis/scheduling/BUILD | 42 - .../pkg/apis/scheduling/install/BUILD | 34 - .../kubernetes/pkg/apis/scheduling/util/BUILD | 45 - .../kubernetes/pkg/apis/scheduling/v1/BUILD | 62 - .../pkg/apis/scheduling/v1alpha1/BUILD | 55 - .../pkg/apis/scheduling/v1beta1/BUILD | 55 - .../pkg/apis/scheduling/validation/BUILD | 45 - .../k8s.io/kubernetes/pkg/apis/storage/BUILD | 46 - .../kubernetes/pkg/apis/storage/install/BUILD | 34 - .../kubernetes/pkg/apis/storage/types.go | 49 +- .../kubernetes/pkg/apis/storage/util/BUILD | 48 - .../kubernetes/pkg/apis/storage/v1/BUILD | 63 - .../kubernetes/pkg/apis/storage/v1/util/BUILD | 26 - .../pkg/apis/storage/v1alpha1/BUILD | 39 - .../v1alpha1/zz_generated.conversion.go | 2 + .../kubernetes/pkg/apis/storage/v1beta1/BUILD | 63 - .../v1beta1/zz_generated.conversion.go | 86 +- .../pkg/apis/storage/validation/BUILD | 56 - .../pkg/apis/storage/validation/validation.go | 55 +- .../pkg/apis/storage/zz_generated.deepcopy.go | 5 + .../kubernetes/pkg/auth/authorizer/abac/BUILD | 60 - .../kubernetes/pkg/auth/nodeidentifier/BUILD | 37 - .../k8s.io/kubernetes/pkg/capabilities/BUILD | 31 - .../kubernetes/pkg/client/conditions/BUILD | 31 - .../pkg/cloudprovider/providers/BUILD | 45 - .../k8s.io/kubernetes/pkg/cluster/ports/BUILD | 31 - .../kubernetes/pkg/cluster/ports/ports.go | 8 +- vendor/k8s.io/kubernetes/pkg/controller/BUILD | 141 - .../k8s.io/kubernetes/pkg/controller/OWNERS | 1 + .../pkg/controller/client_builder_dynamic.go | 219 - .../pkg/controller/controller_utils.go | 114 +- .../kubernetes/pkg/controller/daemon/BUILD | 106 - .../controller/daemon/daemon_controller.go | 120 +- .../pkg/controller/daemon/update.go | 271 +- .../pkg/controller/daemon/util/BUILD | 51 - .../controller/daemon/util/daemonset_util.go | 62 +- .../pkg/controller/deployment/util/BUILD | 68 - .../deployment/util/deployment_util.go | 17 +- .../kubernetes/pkg/controller/job/BUILD | 86 - .../pkg/controller/job/indexed_job_utils.go | 221 + .../pkg/controller/job/job_controller.go | 322 +- .../pkg/controller/nodelifecycle/BUILD | 100 - .../pkg/controller/nodelifecycle/OWNERS | 5 +- .../node_lifecycle_controller.go | 41 +- .../controller/nodelifecycle/scheduler/BUILD | 65 - .../scheduler/rate_limited_queue.go | 14 - .../nodelifecycle/scheduler/taint_manager.go | 26 +- .../nodelifecycle/scheduler/timed_workers.go | 13 +- .../pkg/controller/replicaset/BUILD | 94 - .../pkg/controller/replicaset/replica_set.go | 2 +- .../pkg/controller/replication/BUILD | 66 - .../pkg/controller/replication/conversion.go | 9 + .../pkg/controller/serviceaccount/BUILD | 81 - .../kubernetes/pkg/controller/util/node/BUILD | 39 - .../pkg/controller/volume/events/BUILD | 25 - .../volume/persistentvolume/util/BUILD | 37 - .../volume/persistentvolume/util/util.go | 8 +- .../pkg/controller/volume/scheduling/BUILD | 92 - .../volume/scheduling/metrics/BUILD | 26 - .../scheduling/scheduler_assume_cache.go | 4 +- .../volume/scheduling/scheduler_binder.go | 62 +- .../k8s.io/kubernetes/pkg/controlplane/BUILD | 226 - .../k8s.io/kubernetes/pkg/controlplane/OWNERS | 7 +- .../controller/apiserverleasegc/BUILD | 35 - .../clusterauthenticationtrust/BUILD | 63 - .../controller/crdregistration/BUILD | 54 - .../pkg/controlplane/deleted_kinds.go | 167 - .../kubernetes/pkg/controlplane/instance.go | 79 +- .../pkg/controlplane/reconcilers/BUILD | 66 - .../reconcilers/endpointsadapter.go | 14 +- .../pkg/controlplane/reconcilers/lease.go | 2 +- .../pkg/controlplane/tunneler/BUILD | 43 - .../kubernetes/pkg/credentialprovider/BUILD | 53 - .../kubernetes/pkg/credentialprovider/OWNERS | 1 - .../pkg/credentialprovider/aws/BUILD | 48 - .../pkg/credentialprovider/azure/BUILD | 55 - .../azure/azure_credentials.go | 2 +- .../pkg/credentialprovider/config.go | 7 +- .../pkg/credentialprovider/gcp/BUILD | 44 - .../pkg/credentialprovider/gcp/metadata.go | 181 +- .../pkg/credentialprovider/keyring.go | 3 +- .../pkg/credentialprovider/plugin/BUILD | 58 - .../pkg/credentialprovider/plugin/plugin.go | 2 +- .../pkg/credentialprovider/provider.go | 2 +- .../pkg/credentialprovider/secrets/BUILD | 36 - .../pkg/credentialprovider/secrets/secrets.go | 2 +- vendor/k8s.io/kubernetes/pkg/features/BUILD | 31 - .../kubernetes/pkg/features/kube_features.go | 453 +- .../pkg/features/patch_kube_features.go | 30 + vendor/k8s.io/kubernetes/pkg/fieldpath/BUILD | 44 - .../kubernetes/pkg/generated/openapi/BUILD | 47 - .../generated/openapi/zz_generated.openapi.go | 2381 +- .../k8s.io/kubernetes/pkg/kubeapiserver/BUILD | 53 - .../pkg/kubeapiserver/admission/BUILD | 50 - .../pkg/kubeapiserver/authenticator/BUILD | 48 - .../pkg/kubeapiserver/authorizer/BUILD | 43 - .../pkg/kubeapiserver/authorizer/modes/BUILD | 33 - .../default_storage_factory_builder.go | 8 +- .../pkg/kubeapiserver/options/BUILD | 112 - .../kubeapiserver/options/authentication.go | 26 +- .../pkg/kubeapiserver/options/plugins.go | 37 +- .../pkg/kubeapiserver/options/serving.go | 33 - vendor/k8s.io/kubernetes/pkg/kubelet/BUILD | 346 - vendor/k8s.io/kubernetes/pkg/kubelet/OWNERS | 3 +- .../k8s.io/kubernetes/pkg/kubelet/apis/BUILD | 43 - .../kubernetes/pkg/kubelet/apis/config/BUILD | 62 - .../pkg/kubelet/apis/config/scheme/BUILD | 40 - .../pkg/kubelet/apis/config/types.go | 35 +- .../pkg/kubelet/apis/config/v1alpha1/BUILD | 36 - .../pkg/kubelet/apis/config/v1beta1/BUILD | 47 - .../kubelet/apis/config/v1beta1/defaults.go | 10 + .../config/v1beta1/zz_generated.conversion.go | 49 + .../config/v1beta1/zz_generated.defaults.go | 5 + .../pkg/kubelet/apis/config/validation/BUILD | 53 - .../apis/config/validation/validation.go | 2 + .../validation/validation_reserved_memory.go | 64 + .../apis/config/zz_generated.deepcopy.go | 31 + .../pkg/kubelet/apis/podresources/BUILD | 53 - .../kubelet/apis/podresources/server_v1.go | 22 + .../pkg/kubelet/apis/podresources/types.go | 9 +- .../apis/well_known_annotations_windows.go | 46 - .../kubernetes/pkg/kubelet/cadvisor/BUILD | 112 - .../cadvisor/cadvisor_cloudproviders.go | 28 + .../pkg/kubelet/cadvisor/cadvisor_linux.go | 10 +- .../kubernetes/pkg/kubelet/cadvisor/util.go | 2 +- .../kubernetes/pkg/kubelet/certificate/BUILD | 65 - .../pkg/kubelet/certificate/bootstrap/BUILD | 62 - .../certificate/bootstrap/bootstrap.go | 32 +- .../pkg/kubelet/certificate/transport.go | 13 +- .../pkg/kubelet/checkpointmanager/BUILD | 48 - .../kubelet/checkpointmanager/checksum/BUILD | 26 - .../kubelet/checkpointmanager/errors/BUILD | 25 - .../kubernetes/pkg/kubelet/client/BUILD | 44 - .../pkg/kubelet/cloudresource/BUILD | 40 - .../cloudresource/cloud_request_manager.go | 8 +- vendor/k8s.io/kubernetes/pkg/kubelet/cm/BUILD | 247 - .../pkg/kubelet/cm/cgroup_manager_linux.go | 33 +- .../pkg/kubelet/cm/container_manager.go | 75 +- .../pkg/kubelet/cm/container_manager_linux.go | 123 +- .../pkg/kubelet/cm/container_manager_stub.go | 13 +- .../kubelet/cm/container_manager_windows.go | 69 +- .../pkg/kubelet/cm/containermap/BUILD | 28 - .../pkg/kubelet/cm/cpumanager/BUILD | 78 - .../pkg/kubelet/cm/cpumanager/OWNERS | 4 +- .../kubelet/cm/cpumanager/cpu_assignment.go | 6 +- .../pkg/kubelet/cm/cpumanager/cpu_manager.go | 61 +- .../kubelet/cm/cpumanager/fake_cpu_manager.go | 21 +- .../pkg/kubelet/cm/cpumanager/policy.go | 3 + .../pkg/kubelet/cm/cpumanager/policy_none.go | 14 +- .../kubelet/cm/cpumanager/policy_static.go | 45 +- .../pkg/kubelet/cm/cpumanager/state/BUILD | 51 - .../cm/cpumanager/state/state_checkpoint.go | 16 +- .../kubelet/cm/cpumanager/state/state_mem.go | 12 +- .../pkg/kubelet/cm/cpumanager/topology/BUILD | 37 - .../cm/cpumanager/topology/topology.go | 5 +- .../kubernetes/pkg/kubelet/cm/cpuset/BUILD | 29 - .../pkg/kubelet/cm/cpuset/cpuset.go | 13 +- .../pkg/kubelet/cm/devicemanager/BUILD | 95 - .../kubelet/cm/devicemanager/checkpoint/BUILD | 27 - .../cm/devicemanager/device_plugin_stub.go | 19 +- .../pkg/kubelet/cm/devicemanager/endpoint.go | 8 +- .../pkg/kubelet/cm/devicemanager/manager.go | 115 +- .../kubelet/cm/devicemanager/manager_stub.go | 8 +- .../kubelet/cm/devicemanager/pod_devices.go | 92 +- .../cm/devicemanager/topology_hints.go | 17 +- .../pkg/kubelet/cm/devicemanager/types.go | 10 +- .../pkg/kubelet/cm/fake_container_manager.go | 16 +- .../pkg/kubelet/cm/helpers_linux.go | 10 +- .../cm/internal_container_lifecycle.go | 6 + .../cm/internal_container_lifecycle_linux.go | 14 + .../cm/memorymanager/fake_memory_manager.go | 82 + .../cm/memorymanager/memory_manager.go | 409 + .../pkg/kubelet/cm/memorymanager/policy.go | 44 + .../kubelet/cm/memorymanager/policy_none.go | 68 + .../kubelet/cm/memorymanager/policy_static.go | 769 + .../cm/memorymanager/state/checkpoint.go | 65 + .../kubelet/cm/memorymanager/state/state.go | 130 + .../memorymanager/state/state_checkpoint.go | 184 + .../cm/memorymanager/state/state_mem.go | 123 + .../cm/node_container_manager_linux.go | 10 +- .../kubelet/cm/pod_container_manager_linux.go | 16 +- .../kubelet/cm/qos_container_manager_linux.go | 22 +- .../pkg/kubelet/cm/topologymanager/BUILD | 67 - .../kubelet/cm/topologymanager/bitmask/BUILD | 28 - .../topologymanager/fake_topology_manager.go | 13 +- .../pkg/kubelet/cm/topologymanager/policy.go | 6 +- .../pkg/kubelet/cm/topologymanager/scope.go | 20 +- .../cm/topologymanager/scope_container.go | 15 +- .../kubelet/cm/topologymanager/scope_pod.go | 16 +- .../cm/topologymanager/topology_manager.go | 4 +- .../kubernetes/pkg/kubelet/cm/util/BUILD | 39 - .../kubernetes/pkg/kubelet/config/BUILD | 114 - .../pkg/kubelet/config/apiserver.go | 5 +- .../kubernetes/pkg/kubelet/config/common.go | 8 +- .../kubernetes/pkg/kubelet/config/config.go | 18 +- .../kubernetes/pkg/kubelet/config/file.go | 18 +- .../pkg/kubelet/config/file_linux.go | 10 +- .../pkg/kubelet/config/file_unsupported.go | 2 +- .../kubernetes/pkg/kubelet/config/flags.go | 10 +- .../kubernetes/pkg/kubelet/config/http.go | 10 +- .../kubernetes/pkg/kubelet/configmap/BUILD | 56 - .../kubelet/configmap/configmap_manager.go | 4 +- .../kubernetes/pkg/kubelet/container/BUILD | 84 - .../pkg/kubelet/container/container_gc.go | 2 +- .../pkg/kubelet/container/helpers.go | 7 +- .../pkg/kubelet/container/runtime.go | 2 +- .../pkg/kubelet/container/testing/BUILD | 41 - .../kubelet/container/testing/fake_runtime.go | 20 +- .../kubernetes/pkg/kubelet/cri/remote/BUILD | 60 - .../pkg/kubelet/cri/remote/remote_image.go | 21 +- .../pkg/kubelet/cri/remote/remote_runtime.go | 164 +- .../pkg/kubelet/cri/remote/util/BUILD | 89 - .../pkg/kubelet/cri/remote/util/util_unix.go | 2 +- .../pkg/kubelet/cri/streaming/BUILD | 66 - .../kubelet/cri/streaming/portforward/BUILD | 54 - .../cri/streaming/portforward/httpstream.go | 24 +- .../cri/streaming/portforward/websocket.go | 4 +- .../kubelet/cri/streaming/remotecommand/BUILD | 46 - .../cri/streaming/remotecommand/httpstream.go | 4 +- .../kubernetes/pkg/kubelet/dockershim/BUILD | 156 - .../pkg/kubelet/dockershim/cm/BUILD | 92 - .../dockershim/cm/container_manager_linux.go | 17 +- .../kubelet/dockershim/docker_container.go | 29 +- .../pkg/kubelet/dockershim/docker_image.go | 2 +- .../kubelet/dockershim/docker_image_linux.go | 2 +- .../dockershim/docker_image_windows.go | 4 +- .../dockershim/docker_legacy_service.go | 4 +- .../pkg/kubelet/dockershim/docker_sandbox.go | 28 +- .../pkg/kubelet/dockershim/docker_service.go | 61 +- .../dockershim/docker_stats_windows.go | 15 +- .../dockershim/docker_streaming_others.go | 2 +- .../kubernetes/pkg/kubelet/dockershim/exec.go | 2 +- .../pkg/kubelet/dockershim/helpers.go | 14 +- .../pkg/kubelet/dockershim/helpers_linux.go | 5 +- .../kubelet/dockershim/helpers_unsupported.go | 12 +- .../pkg/kubelet/dockershim/helpers_windows.go | 39 +- .../pkg/kubelet/dockershim/libdocker/BUILD | 62 - .../kubelet/dockershim/libdocker/client.go | 9 +- .../kubelet/dockershim/libdocker/helpers.go | 16 +- .../libdocker/kube_docker_client.go | 8 +- .../pkg/kubelet/dockershim/metrics/BUILD | 26 - .../pkg/kubelet/dockershim/network/BUILD | 59 - .../pkg/kubelet/dockershim/network/cni/BUILD | 94 - .../pkg/kubelet/dockershim/network/cni/cni.go | 47 +- .../dockershim/network/cni/cni_windows.go | 6 +- .../kubelet/dockershim/network/hostport/BUILD | 57 - .../network/hostport/fake_iptables.go | 23 +- .../dockershim/network/hostport/hostport.go | 36 +- .../network/hostport/hostport_manager.go | 83 +- .../kubelet/dockershim/network/kubenet/BUILD | 187 - .../network/kubenet/kubenet_linux.go | 70 +- .../kubelet/dockershim/network/metrics/BUILD | 26 - .../pkg/kubelet/dockershim/network/plugins.go | 14 +- .../pkg/kubelet/dockershim/remote/BUILD | 32 - .../dockershim/remote/docker_server.go | 8 +- .../kubelet/dockershim/security_context.go | 1 + .../kubernetes/pkg/kubelet/envvars/BUILD | 43 - .../kubernetes/pkg/kubelet/events/BUILD | 25 - .../kubernetes/pkg/kubelet/eviction/BUILD | 98 - .../kubernetes/pkg/kubelet/eviction/api/BUILD | 26 - .../pkg/kubelet/eviction/api/types.go | 13 +- .../pkg/kubelet/eviction/eviction_manager.go | 70 +- .../pkg/kubelet/eviction/helpers.go | 64 +- .../eviction/memory_threshold_notifier.go | 4 +- .../eviction/threshold_notifier_linux.go | 6 +- .../threshold_notifier_unsupported.go | 2 +- .../kubernetes/pkg/kubelet/images/BUILD | 70 - .../pkg/kubelet/images/image_gc_manager.go | 32 +- .../pkg/kubelet/images/image_manager.go | 2 +- .../k8s.io/kubernetes/pkg/kubelet/kubelet.go | 263 +- .../pkg/kubelet/kubelet_dockershim.go | 7 +- .../kubernetes/pkg/kubelet/kubelet_getters.go | 49 +- .../kubernetes/pkg/kubelet/kubelet_network.go | 3 +- .../pkg/kubelet/kubelet_network_linux.go | 32 +- .../pkg/kubelet/kubelet_node_status.go | 87 +- .../kubernetes/pkg/kubelet/kubelet_pods.go | 177 +- .../pkg/kubelet/kubelet_resources.go | 2 +- .../kubernetes/pkg/kubelet/kubelet_volumes.go | 55 +- .../pkg/kubelet/kubeletconfig/BUILD | 69 - .../kubelet/kubeletconfig/checkpoint/BUILD | 67 - .../kubeletconfig/checkpoint/download.go | 16 +- .../kubeletconfig/checkpoint/store/BUILD | 61 - .../kubeletconfig/checkpoint/store/fsstore.go | 6 +- .../kubelet/kubeletconfig/configfiles/BUILD | 50 - .../pkg/kubelet/kubeletconfig/configsync.go | 21 +- .../pkg/kubelet/kubeletconfig/controller.go | 24 +- .../pkg/kubelet/kubeletconfig/status/BUILD | 34 - .../kubelet/kubeletconfig/status/status.go | 8 +- .../kubelet/kubeletconfig/util/codec/BUILD | 38 - .../kubelet/kubeletconfig/util/codec/codec.go | 2 +- .../kubelet/kubeletconfig/util/files/BUILD | 37 - .../kubelet/kubeletconfig/util/files/files.go | 6 +- .../pkg/kubelet/kubeletconfig/util/log/BUILD | 26 - .../pkg/kubelet/kubeletconfig/util/log/log.go | 49 - .../kubelet/kubeletconfig/util/panic/BUILD | 26 - .../pkg/kubelet/kubeletconfig/watch.go | 22 +- .../kubernetes/pkg/kubelet/kuberuntime/BUILD | 171 - .../kuberuntime/fake_kuberuntime_manager.go | 4 +- .../pkg/kubelet/kuberuntime/helpers.go | 2 +- .../kuberuntime/kuberuntime_container.go | 75 +- .../kuberuntime_container_linux.go | 4 +- .../kuberuntime_container_windows.go | 33 +- .../pkg/kubelet/kuberuntime/kuberuntime_gc.go | 24 +- .../kubelet/kuberuntime/kuberuntime_image.go | 12 +- .../kuberuntime/kuberuntime_manager.go | 160 +- .../kuberuntime/kuberuntime_sandbox.go | 36 +- .../pkg/kubelet/kuberuntime/labels.go | 25 +- .../pkg/kubelet/kuberuntime/logs/BUILD | 43 - .../pkg/kubelet/kuberuntime/logs/logs.go | 30 +- .../kuberuntime/security_context_windows.go | 10 +- .../k8s.io/kubernetes/pkg/kubelet/leaky/BUILD | 25 - .../kubernetes/pkg/kubelet/legacy/BUILD | 27 - .../kubernetes/pkg/kubelet/lifecycle/BUILD | 71 - .../pkg/kubelet/lifecycle/handlers.go | 10 +- .../pkg/kubelet/lifecycle/predicate.go | 16 +- .../k8s.io/kubernetes/pkg/kubelet/logs/BUILD | 48 - .../pkg/kubelet/logs/container_log_manager.go | 14 +- .../pkg/kubelet/managed/cpu_shares.go | 30 + .../kubernetes/pkg/kubelet/managed/managed.go | 100 + .../kubernetes/pkg/kubelet/metrics/BUILD | 37 - .../pkg/kubelet/metrics/collectors/BUILD | 51 - .../kubelet/metrics/collectors/log_metrics.go | 2 +- .../metrics/collectors/resource_metrics.go | 2 +- .../kubernetes/pkg/kubelet/metrics/metrics.go | 70 +- .../kubernetes/pkg/kubelet/network/dns/BUILD | 50 - .../kubernetes/pkg/kubelet/network/dns/dns.go | 30 +- .../kubernetes/pkg/kubelet/nodeshutdown/BUILD | 127 - .../nodeshutdown_manager_linux.go | 64 +- .../nodeshutdown_manager_others.go | 11 +- .../pkg/kubelet/nodeshutdown/systemd/BUILD | 54 - .../nodeshutdown/systemd/inhibit_linux.go | 9 +- .../kubernetes/pkg/kubelet/nodestatus/BUILD | 70 - .../pkg/kubelet/nodestatus/setters.go | 22 +- .../k8s.io/kubernetes/pkg/kubelet/oom/BUILD | 103 - .../pkg/kubelet/oom/oom_watcher_linux.go | 4 +- .../k8s.io/kubernetes/pkg/kubelet/pleg/BUILD | 56 - .../kubernetes/pkg/kubelet/pleg/generic.go | 22 +- .../pkg/kubelet/pluginmanager/BUILD | 55 - .../pkg/kubelet/pluginmanager/cache/BUILD | 37 - .../cache/actual_state_of_world.go | 2 +- .../cache/desired_state_of_world.go | 2 +- .../pkg/kubelet/pluginmanager/metrics/BUILD | 34 - .../pluginmanager/operationexecutor/BUILD | 41 - .../operationexecutor/operation_generator.go | 4 +- .../kubelet/pluginmanager/plugin_manager.go | 6 +- .../kubelet/pluginmanager/pluginwatcher/BUILD | 54 - .../pluginwatcher/example_handler.go | 2 +- .../pluginwatcher/example_plugin.go | 14 +- .../example_plugin_apis/v1beta1/BUILD | 29 - .../example_plugin_apis/v1beta1/api.pb.go | 10 +- .../example_plugin_apis/v1beta2/BUILD | 29 - .../example_plugin_apis/v1beta2/api.pb.go | 10 +- .../pluginwatcher/plugin_watcher.go | 34 +- .../kubelet/pluginmanager/reconciler/BUILD | 45 - .../pluginmanager/reconciler/reconciler.go | 20 +- .../k8s.io/kubernetes/pkg/kubelet/pod/BUILD | 67 - .../pkg/kubelet/pod/mirror_client.go | 6 +- .../pkg/kubelet/pod_container_deletor.go | 6 +- .../kubernetes/pkg/kubelet/pod_workers.go | 3 +- .../kubernetes/pkg/kubelet/preemption/BUILD | 53 - .../pkg/kubelet/preemption/preemption.go | 8 +- .../kubernetes/pkg/kubelet/prober/BUILD | 89 - .../pkg/kubelet/prober/patch_prober.go | 49 + .../kubernetes/pkg/kubelet/prober/prober.go | 29 +- .../pkg/kubelet/prober/prober_manager.go | 58 +- .../pkg/kubelet/prober/results/BUILD | 44 - .../kubernetes/pkg/kubelet/prober/worker.go | 52 +- .../k8s.io/kubernetes/pkg/kubelet/qos/BUILD | 45 - .../kubernetes/pkg/kubelet/qos/policy.go | 4 +- .../k8s.io/kubernetes/pkg/kubelet/runonce.go | 30 +- .../kubernetes/pkg/kubelet/runtimeclass/BUILD | 42 - .../pkg/kubelet/runtimeclass/testing/BUILD | 29 - .../kubernetes/pkg/kubelet/secret/BUILD | 56 - .../pkg/kubelet/secret/secret_manager.go | 6 +- .../kubernetes/pkg/kubelet/server/BUILD | 119 - .../kubernetes/pkg/kubelet/server/auth.go | 5 +- .../pkg/kubelet/server/metrics/BUILD | 29 - .../kubernetes/pkg/kubelet/server/server.go | 195 +- .../kubernetes/pkg/kubelet/server/stats/BUILD | 132 - .../server/stats/fs_resource_analyzer.go | 11 +- .../pkg/kubelet/server/stats/handler.go | 160 +- .../kubelet/server/stats/resource_analyzer.go | 5 +- .../pkg/kubelet/server/stats/summary.go | 2 +- .../server/stats/summary_sys_containers.go | 4 +- .../server/stats/volume_stat_calculator.go | 32 +- .../k8s.io/kubernetes/pkg/kubelet/stats/BUILD | 101 - .../kubelet/stats/cadvisor_stats_provider.go | 32 +- .../pkg/kubelet/stats/cri_stats_provider.go | 128 +- .../stats/cri_stats_provider_windows.go | 4 +- .../kubernetes/pkg/kubelet/stats/helper.go | 30 +- .../pkg/kubelet/stats/host_stats_provider.go | 156 + .../kubelet/stats/host_stats_provider_fake.go | 110 + .../pkg/kubelet/stats/log_metrics_provider.go | 37 - .../pkg/kubelet/stats/pidlimit/BUILD | 78 - .../kubernetes/pkg/kubelet/stats/provider.go | 8 +- .../kubernetes/pkg/kubelet/status/BUILD | 79 - .../pkg/kubelet/status/status_manager.go | 114 +- .../kubernetes/pkg/kubelet/sysctl/BUILD | 44 - .../k8s.io/kubernetes/pkg/kubelet/token/BUILD | 44 - .../pkg/kubelet/token/token_manager.go | 4 +- .../k8s.io/kubernetes/pkg/kubelet/types/BUILD | 56 - .../kubernetes/pkg/kubelet/types/constants.go | 19 +- .../kubernetes/pkg/kubelet/types/doc.go | 2 +- .../kubernetes/pkg/kubelet/types/labels.go | 5 + .../pkg/kubelet/types/pod_update.go | 40 +- .../kubernetes/pkg/kubelet/types/types.go | 10 +- .../k8s.io/kubernetes/pkg/kubelet/util/BUILD | 107 - .../pkg/kubelet/util/boottime_util_freebsd.go | 39 + .../pkg/kubelet/util/boottime_util_linux.go | 2 +- .../kubernetes/pkg/kubelet/util/cache/BUILD | 37 - .../kubernetes/pkg/kubelet/util/format/BUILD | 45 - .../kubernetes/pkg/kubelet/util/format/pod.go | 31 +- .../kubernetes/pkg/kubelet/util/ioutils/BUILD | 29 - .../kubernetes/pkg/kubelet/util/manager/BUILD | 73 - .../util/manager/watch_based_manager.go | 172 +- .../kubernetes/pkg/kubelet/util/nodelease.go | 2 +- .../kubernetes/pkg/kubelet/util/queue/BUILD | 41 - .../pkg/kubelet/util/sliceutils/BUILD | 41 - .../kubernetes/pkg/kubelet/util/store/BUILD | 41 - .../kubernetes/pkg/kubelet/util/util_unix.go | 2 +- .../kubernetes/pkg/kubelet/volume_host.go | 6 +- .../pkg/kubelet/volumemanager/BUILD | 93 - .../pkg/kubelet/volumemanager/OWNERS | 1 + .../pkg/kubelet/volumemanager/cache/BUILD | 63 - .../cache/actual_state_of_world.go | 29 +- .../pkg/kubelet/volumemanager/metrics/BUILD | 45 - .../pkg/kubelet/volumemanager/populator/BUILD | 79 - .../desired_state_of_world_populator.go | 99 +- .../kubelet/volumemanager/reconciler/BUILD | 77 - .../volumemanager/reconciler/reconciler.go | 93 +- .../kubelet/volumemanager/volume_manager.go | 14 +- .../kubernetes/pkg/kubelet/winstats/BUILD | 56 - .../pkg/kubelet/winstats/network_stats.go | 16 +- .../kubelet/winstats/perfcounter_nodestats.go | 38 +- vendor/k8s.io/kubernetes/pkg/kubemark/BUILD | 90 - vendor/k8s.io/kubernetes/pkg/kubemark/OWNERS | 5 +- .../kubernetes/pkg/kubemark/hollow_kubelet.go | 1 + vendor/k8s.io/kubernetes/pkg/printers/BUILD | 47 - .../pkg/printers/internalversion/BUILD | 124 - .../kubernetes/pkg/printers/storage/BUILD | 30 - vendor/k8s.io/kubernetes/pkg/probe/BUILD | 33 - vendor/k8s.io/kubernetes/pkg/probe/OWNERS | 10 +- vendor/k8s.io/kubernetes/pkg/probe/exec/BUILD | 44 - vendor/k8s.io/kubernetes/pkg/probe/http/BUILD | 45 - .../k8s.io/kubernetes/pkg/probe/http/http.go | 17 +- .../kubernetes/pkg/probe/http/patch_http.go | 26 + vendor/k8s.io/kubernetes/pkg/probe/tcp/BUILD | 37 - vendor/k8s.io/kubernetes/pkg/proxy/BUILD | 83 - vendor/k8s.io/kubernetes/pkg/proxy/apis/BUILD | 28 - .../kubernetes/pkg/proxy/apis/config/BUILD | 49 - .../pkg/proxy/apis/config/scheme/BUILD | 41 - .../pkg/proxy/apis/config/v1alpha1/BUILD | 58 - .../pkg/proxy/apis/config/validation/BUILD | 51 - .../apis/config/validation/validation.go | 8 - .../k8s.io/kubernetes/pkg/proxy/config/BUILD | 57 - .../k8s.io/kubernetes/pkg/proxy/endpoints.go | 75 +- .../pkg/proxy/endpointslicecache.go | 39 +- .../kubernetes/pkg/proxy/healthcheck/BUILD | 52 - .../kubernetes/pkg/proxy/iptables/BUILD | 75 - .../kubernetes/pkg/proxy/iptables/proxier.go | 493 +- vendor/k8s.io/kubernetes/pkg/proxy/ipvs/BUILD | 109 - .../k8s.io/kubernetes/pkg/proxy/ipvs/ipset.go | 3 + .../pkg/proxy/ipvs/netlink_linux.go | 2 +- .../kubernetes/pkg/proxy/ipvs/proxier.go | 330 +- .../kubernetes/pkg/proxy/metaproxier/BUILD | 37 - .../k8s.io/kubernetes/pkg/proxy/metrics/BUILD | 26 - .../kubernetes/pkg/proxy/metrics/metrics.go | 12 + vendor/k8s.io/kubernetes/pkg/proxy/service.go | 89 +- .../k8s.io/kubernetes/pkg/proxy/topology.go | 119 +- vendor/k8s.io/kubernetes/pkg/proxy/types.go | 28 +- .../kubernetes/pkg/proxy/userspace/BUILD | 121 - .../kubernetes/pkg/proxy/userspace/proxier.go | 127 +- vendor/k8s.io/kubernetes/pkg/proxy/util/BUILD | 58 - .../kubernetes/pkg/proxy/util/iptables/BUILD | 37 - .../k8s.io/kubernetes/pkg/proxy/util/port.go | 67 - .../k8s.io/kubernetes/pkg/proxy/util/utils.go | 128 +- .../kubernetes/pkg/proxy/winkernel/BUILD | 81 - .../kubernetes/pkg/proxy/winkernel/hnsV1.go | 20 +- .../kubernetes/pkg/proxy/winkernel/hnsV2.go | 4 +- .../kubernetes/pkg/proxy/winkernel/proxier.go | 185 +- .../kubernetes/pkg/proxy/winuserspace/BUILD | 66 - .../pkg/proxy/winuserspace/proxier.go | 30 +- .../pkg/quota/v1/evaluator/core/BUILD | 71 - .../core/persistent_volume_claims.go | 4 +- .../pkg/quota/v1/evaluator/core/pods.go | 62 +- .../pkg/quota/v1/evaluator/core/services.go | 27 +- .../kubernetes/pkg/quota/v1/install/BUILD | 31 - .../mutatingwebhookconfiguration/BUILD | 41 - .../storage/BUILD | 36 - .../registry/admissionregistration/rest/BUILD | 37 - .../validatingwebhookconfiguration/BUILD | 41 - .../storage/BUILD | 36 - .../pkg/registry/apiserverinternal/rest/BUILD | 32 - .../apiserverinternal/storageversion/BUILD | 37 - .../storageversion/storage/BUILD | 34 - .../storageversion/storage/storage.go | 16 +- .../storageversion/strategy.go | 26 + .../registry/apps/controllerrevision/BUILD | 54 - .../apps/controllerrevision/storage/BUILD | 54 - .../pkg/registry/apps/daemonset/BUILD | 62 - .../pkg/registry/apps/daemonset/storage/BUILD | 56 - .../apps/daemonset/storage/storage.go | 14 +- .../pkg/registry/apps/daemonset/strategy.go | 57 + .../pkg/registry/apps/deployment/BUILD | 65 - .../registry/apps/deployment/storage/BUILD | 76 - .../apps/deployment/storage/storage.go | 14 +- .../pkg/registry/apps/deployment/strategy.go | 24 + .../pkg/registry/apps/replicaset/BUILD | 66 - .../registry/apps/replicaset/storage/BUILD | 70 - .../apps/replicaset/storage/storage.go | 14 +- .../pkg/registry/apps/replicaset/strategy.go | 23 + .../kubernetes/pkg/registry/apps/rest/BUILD | 39 - .../pkg/registry/apps/statefulset/BUILD | 60 - .../registry/apps/statefulset/storage/BUILD | 69 - .../apps/statefulset/storage/storage.go | 14 +- .../pkg/registry/apps/statefulset/strategy.go | 30 +- .../pkg/registry/authentication/rest/BUILD | 37 - .../registry/authentication/tokenreview/BUILD | 35 - .../localsubjectaccessreview/BUILD | 36 - .../pkg/registry/authorization/rest/BUILD | 40 - .../selfsubjectaccessreview/BUILD | 36 - .../selfsubjectrulesreview/BUILD | 31 - .../authorization/subjectaccessreview/BUILD | 50 - .../pkg/registry/authorization/util/BUILD | 42 - .../autoscaling/horizontalpodautoscaler/BUILD | 56 - .../horizontalpodautoscaler/storage/BUILD | 61 - .../storage/storage.go | 14 +- .../horizontalpodautoscaler/strategy.go | 37 + .../pkg/registry/autoscaling/rest/BUILD | 37 - .../pkg/registry/batch/cronjob/BUILD | 59 - .../pkg/registry/batch/cronjob/storage/BUILD | 56 - .../registry/batch/cronjob/storage/storage.go | 14 +- .../pkg/registry/batch/cronjob/strategy.go | 34 +- .../kubernetes/pkg/registry/batch/job/BUILD | 71 - .../pkg/registry/batch/job/storage/BUILD | 56 - .../pkg/registry/batch/job/storage/storage.go | 14 +- .../pkg/registry/batch/job/strategy.go | 45 + .../kubernetes/pkg/registry/batch/rest/BUILD | 38 - .../pkg/registry/batch/rest/storage_batch.go | 15 +- .../registry/certificates/certificates/BUILD | 61 - .../certificates/certificates/storage/BUILD | 37 - .../certificates/storage/storage.go | 21 +- .../certificates/certificates/strategy.go | 67 +- .../pkg/registry/certificates/rest/BUILD | 36 - .../pkg/registry/coordination/lease/BUILD | 36 - .../registry/coordination/lease/storage/BUILD | 32 - .../pkg/registry/coordination/rest/BUILD | 33 - .../pkg/registry/core/componentstatus/BUILD | 66 - .../core/componentstatus/validator.go | 6 +- .../pkg/registry/core/configmap/BUILD | 58 - .../pkg/registry/core/configmap/storage/BUILD | 55 - .../pkg/registry/core/configmap/strategy.go | 9 - .../pkg/registry/core/endpoint/BUILD | 39 - .../pkg/registry/core/endpoint/storage/BUILD | 54 - .../kubernetes/pkg/registry/core/event/BUILD | 61 - .../pkg/registry/core/event/storage/BUILD | 52 - .../pkg/registry/core/limitrange/BUILD | 40 - .../registry/core/limitrange/storage/BUILD | 53 - .../core/limitrange/storage/storage.go | 1 - .../pkg/registry/core/limitrange/strategy.go | 7 - .../pkg/registry/core/namespace/BUILD | 57 - .../pkg/registry/core/namespace/storage/BUILD | 65 - .../core/namespace/storage/storage.go | 24 +- .../pkg/registry/core/namespace/strategy.go | 58 + .../kubernetes/pkg/registry/core/node/BUILD | 72 - .../pkg/registry/core/node/rest/BUILD | 36 - .../pkg/registry/core/node/storage/BUILD | 62 - .../pkg/registry/core/node/storage/storage.go | 15 +- .../pkg/registry/core/node/strategy.go | 41 +- .../pkg/registry/core/persistentvolume/BUILD | 57 - .../core/persistentvolume/storage/BUILD | 60 - .../core/persistentvolume/storage/storage.go | 8 + .../core/persistentvolume/strategy.go | 25 + .../registry/core/persistentvolumeclaim/BUILD | 63 - .../core/persistentvolumeclaim/storage/BUILD | 60 - .../persistentvolumeclaim/storage/storage.go | 8 + .../core/persistentvolumeclaim/strategy.go | 25 + .../kubernetes/pkg/registry/core/pod/BUILD | 84 - .../pkg/registry/core/pod/rest/BUILD | 61 - .../pkg/registry/core/pod/rest/log.go | 39 +- .../pkg/registry/core/pod/rest/metrics.go | 67 + .../pkg/registry/core/pod/storage/BUILD | 96 - .../pkg/registry/core/pod/storage/eviction.go | 25 +- .../pkg/registry/core/pod/storage/storage.go | 10 +- .../pkg/registry/core/pod/strategy.go | 42 +- .../pkg/registry/core/podtemplate/BUILD | 40 - .../registry/core/podtemplate/storage/BUILD | 53 - .../core/podtemplate/storage/storage.go | 1 - .../pkg/registry/core/podtemplate/strategy.go | 5 - .../pkg/registry/core/rangeallocation/BUILD | 29 - .../registry/core/replicationcontroller/BUILD | 64 - .../core/replicationcontroller/storage/BUILD | 68 - .../replicationcontroller/storage/storage.go | 14 +- .../core/replicationcontroller/strategy.go | 23 + .../pkg/registry/core/resourcequota/BUILD | 52 - .../registry/core/resourcequota/storage/BUILD | 59 - .../core/resourcequota/storage/storage.go | 8 + .../registry/core/resourcequota/strategy.go | 69 +- .../kubernetes/pkg/registry/core/rest/BUILD | 80 - .../pkg/registry/core/rest/storage_core.go | 12 +- .../kubernetes/pkg/registry/core/secret/BUILD | 62 - .../pkg/registry/core/secret/storage/BUILD | 54 - .../registry/core/secret/storage/storage.go | 1 - .../pkg/registry/core/secret/strategy.go | 36 +- .../pkg/registry/core/service/BUILD | 73 - .../pkg/registry/core/service/allocator/BUILD | 43 - .../core/service/allocator/storage/BUILD | 54 - .../registry/core/service/ipallocator/BUILD | 45 - .../core/service/ipallocator/controller/BUILD | 58 - .../registry/core/service/portallocator/BUILD | 53 - .../service/portallocator/controller/BUILD | 56 - .../pkg/registry/core/service/storage/BUILD | 96 - .../pkg/registry/core/service/storage/rest.go | 45 +- .../registry/core/service/storage/storage.go | 66 +- .../pkg/registry/core/service/strategy.go | 103 +- .../pkg/registry/core/serviceaccount/BUILD | 39 - .../core/serviceaccount/storage/BUILD | 67 - .../registry/discovery/endpointslice/BUILD | 54 - .../discovery/endpointslice/storage/BUILD | 32 - .../discovery/endpointslice/strategy.go | 70 +- .../pkg/registry/discovery/rest/BUILD | 33 - .../discovery/rest/storage_discovery.go | 18 +- .../kubernetes/pkg/registry/events/rest/BUILD | 33 - .../pkg/registry/extensions/rest/BUILD | 35 - .../pkg/registry/flowcontrol/flowschema/BUILD | 37 - .../flowcontrol/flowschema/storage/BUILD | 34 - .../flowcontrol/flowschema/storage/storage.go | 14 +- .../flowcontrol/flowschema/strategy.go | 33 + .../prioritylevelconfiguration/BUILD | 37 - .../prioritylevelconfiguration/storage/BUILD | 34 - .../storage/storage.go | 14 +- .../prioritylevelconfiguration/strategy.go | 33 + .../pkg/registry/flowcontrol/rest/BUILD | 57 - .../flowcontrol/rest/storage_flowcontrol.go | 30 +- .../pkg/registry/networking/ingress/BUILD | 55 - .../registry/networking/ingress/storage/BUILD | 59 - .../networking/ingress/storage/storage.go | 14 +- .../registry/networking/ingress/strategy.go | 38 + .../registry/networking/ingressclass/BUILD | 48 - .../networking/ingressclass/storage/BUILD | 32 - .../networking/ingressclass/strategy.go | 21 + .../registry/networking/networkpolicy/BUILD | 39 - .../networking/networkpolicy/storage/BUILD | 57 - .../networking/networkpolicy/strategy.go | 49 + .../pkg/registry/networking/rest/BUILD | 38 - .../kubernetes/pkg/registry/node/rest/BUILD | 34 - .../pkg/registry/node/runtimeclass/BUILD | 39 - .../registry/node/runtimeclass/storage/BUILD | 32 - .../registry/policy/poddisruptionbudget/BUILD | 53 - .../policy/poddisruptionbudget/storage/BUILD | 57 - .../poddisruptionbudget/storage/storage.go | 14 +- .../policy/poddisruptionbudget/strategy.go | 45 +- .../registry/policy/podsecuritypolicy/BUILD | 41 - .../policy/podsecuritypolicy/storage/BUILD | 54 - .../policy/podsecuritypolicy/strategy.go | 28 +- .../kubernetes/pkg/registry/policy/rest/BUILD | 36 - .../registry/policy/rest/storage_policy.go | 22 + .../k8s.io/kubernetes/pkg/registry/rbac/BUILD | 62 - .../pkg/registry/rbac/clusterrole/BUILD | 46 - .../rbac/clusterrole/policybased/BUILD | 56 - .../registry/rbac/clusterrole/storage/BUILD | 33 - .../registry/rbac/clusterrolebinding/BUILD | 46 - .../rbac/clusterrolebinding/policybased/BUILD | 38 - .../rbac/clusterrolebinding/storage/BUILD | 35 - .../kubernetes/pkg/registry/rbac/rest/BUILD | 61 - .../pkg/registry/rbac/rest/storage_rbac.go | 309 +- .../kubernetes/pkg/registry/rbac/role/BUILD | 46 - .../pkg/registry/rbac/role/policybased/BUILD | 56 - .../pkg/registry/rbac/role/storage/BUILD | 33 - .../pkg/registry/rbac/rolebinding/BUILD | 46 - .../rbac/rolebinding/policybased/BUILD | 39 - .../registry/rbac/rolebinding/storage/BUILD | 35 - .../pkg/registry/rbac/validation/BUILD | 59 - .../pkg/registry/registrytest/BUILD | 52 - .../pkg/registry/registrytest/OWNERS | 2 - .../pkg/registry/registrytest/service.go | 7 - .../pkg/registry/registrytest/validate.go | 27 +- .../registry/scheduling/priorityclass/BUILD | 52 - .../scheduling/priorityclass/storage/BUILD | 60 - .../pkg/registry/scheduling/rest/BUILD | 43 - .../pkg/registry/storage/csidriver/BUILD | 54 - .../registry/storage/csidriver/storage/BUILD | 49 - .../registry/storage/csidriver/strategy.go | 34 +- .../pkg/registry/storage/csinode/BUILD | 49 - .../registry/storage/csinode/storage/BUILD | 49 - .../pkg/registry/storage/csinode/strategy.go | 25 +- .../registry/storage/csistoragecapacity/BUILD | 53 - .../storage/csistoragecapacity/storage/BUILD | 49 - .../pkg/registry/storage/rest/BUILD | 43 - .../registry/storage/rest/storage_storage.go | 45 +- .../pkg/registry/storage/storageclass/BUILD | 53 - .../storage/storageclass/storage/BUILD | 55 - .../registry/storage/volumeattachment/BUILD | 61 - .../storage/volumeattachment/storage/BUILD | 55 - .../volumeattachment/storage/storage.go | 8 + .../storage/volumeattachment/strategy.go | 26 + vendor/k8s.io/kubernetes/pkg/routes/BUILD | 34 - vendor/k8s.io/kubernetes/pkg/routes/logs.go | 2 +- .../pkg/scheduler/apis/config/BUILD | 51 - .../pkg/scheduler/apis/config/types.go | 52 +- .../scheduler/apis/config/validation/BUILD | 56 - .../apis/config/validation/validation.go | 4 +- .../validation/validation_pluginargs.go | 180 +- .../apis/config/zz_generated.deepcopy.go | 66 +- .../kubernetes/pkg/scheduler/framework/BUILD | 67 - .../pkg/scheduler/framework/cycle_state.go | 8 +- .../pkg/scheduler/framework/extender.go | 8 +- .../pkg/scheduler/framework/interface.go | 126 +- .../scheduler/framework/plugins/helper/BUILD | 53 - .../framework/plugins/helper/node_affinity.go | 1 - .../framework/plugins/helper/shape_score.go | 51 + .../framework/plugins/nodeaffinity/BUILD | 47 - .../plugins/nodeaffinity/node_affinity.go | 124 +- .../framework/plugins/nodename/BUILD | 38 - .../framework/plugins/nodename/node_name.go | 2 +- .../framework/plugins/nodeports/BUILD | 38 - .../framework/plugins/noderesources/BUILD | 74 - .../framework/plugins/noderesources/fit.go | 25 +- .../plugins/noderesources/least_allocated.go | 2 +- .../plugins/noderesources/most_allocated.go | 4 +- .../requested_to_capacity_ratio.go | 48 +- .../pkg/scheduler/framework/types.go | 271 +- .../internal/parallelize/error_channel.go | 59 + .../internal/parallelize/parallelism.go | 56 + .../kubernetes/pkg/scheduler/util/BUILD | 70 - .../pkg/scheduler/util/topologies.go | 81 - .../kubernetes/pkg/scheduler/util/utils.go | 28 - .../kubernetes/pkg/security/apparmor/BUILD | 52 - .../pkg/security/podsecuritypolicy/BUILD | 86 - .../security/podsecuritypolicy/apparmor/BUILD | 47 - .../podsecuritypolicy/capabilities/BUILD | 49 - .../pkg/security/podsecuritypolicy/factory.go | 11 +- .../security/podsecuritypolicy/group/BUILD | 53 - .../security/podsecuritypolicy/provider.go | 25 +- .../security/podsecuritypolicy/seccomp/BUILD | 43 - .../security/podsecuritypolicy/selinux/BUILD | 53 - .../security/podsecuritypolicy/sysctl/BUILD | 40 - .../pkg/security/podsecuritypolicy/user/BUILD | 53 - .../pkg/security/podsecuritypolicy/util/BUILD | 45 - .../security/podsecuritypolicy/util/util.go | 4 + .../kubernetes/pkg/securitycontext/BUILD | 50 - .../kubernetes/pkg/serviceaccount/BUILD | 75 - .../kubernetes/pkg/serviceaccount/claims.go | 4 +- .../kubernetes/pkg/serviceaccount/jwt.go | 2 +- vendor/k8s.io/kubernetes/pkg/ssh/BUILD | 46 - vendor/k8s.io/kubernetes/pkg/ssh/ssh.go | 2 +- vendor/k8s.io/kubernetes/pkg/util/async/BUILD | 42 - .../kubernetes/pkg/util/bandwidth/BUILD | 72 - .../k8s.io/kubernetes/pkg/util/config/BUILD | 36 - .../kubernetes/pkg/util/conntrack/BUILD | 40 - .../pkg/util/conntrack/conntrack.go | 2 +- vendor/k8s.io/kubernetes/pkg/util/env/BUILD | 33 - .../kubernetes/pkg/util/filesystem/BUILD | 34 - vendor/k8s.io/kubernetes/pkg/util/flag/BUILD | 38 - .../k8s.io/kubernetes/pkg/util/flag/flags.go | 104 + vendor/k8s.io/kubernetes/pkg/util/flock/BUILD | 55 - .../kubernetes/pkg/util/goroutinemap/BUILD | 41 - .../goroutinemap/exponentialbackoff/BUILD | 25 - vendor/k8s.io/kubernetes/pkg/util/hash/BUILD | 34 - .../k8s.io/kubernetes/pkg/util/ipconfig/BUILD | 40 - vendor/k8s.io/kubernetes/pkg/util/ipset/BUILD | 43 - .../k8s.io/kubernetes/pkg/util/iptables/BUILD | 80 - .../kubernetes/pkg/util/iptables/iptables.go | 14 +- vendor/k8s.io/kubernetes/pkg/util/ipvs/BUILD | 110 - .../k8s.io/kubernetes/pkg/util/labels/BUILD | 37 - vendor/k8s.io/kubernetes/pkg/util/maps/BUILD | 28 - vendor/k8s.io/kubernetes/pkg/util/netsh/BUILD | 48 - vendor/k8s.io/kubernetes/pkg/util/node/BUILD | 53 - .../k8s.io/kubernetes/pkg/util/node/node.go | 35 - vendor/k8s.io/kubernetes/pkg/util/oom/BUILD | 60 - .../k8s.io/kubernetes/pkg/util/parsers/BUILD | 33 - vendor/k8s.io/kubernetes/pkg/util/pod/BUILD | 41 - .../k8s.io/kubernetes/pkg/util/procfs/BUILD | 61 - .../kubernetes/pkg/util/removeall/BUILD | 37 - .../k8s.io/kubernetes/pkg/util/resizefs/BUILD | 75 - .../pkg/util/resizefs/resizefs_linux.go | 86 - .../k8s.io/kubernetes/pkg/util/rlimit/BUILD | 37 - .../k8s.io/kubernetes/pkg/util/selinux/BUILD | 39 - vendor/k8s.io/kubernetes/pkg/util/slice/BUILD | 32 - .../k8s.io/kubernetes/pkg/util/sysctl/BUILD | 28 - vendor/k8s.io/kubernetes/pkg/util/tail/BUILD | 32 - .../k8s.io/kubernetes/pkg/util/taints/BUILD | 45 - .../kubernetes/pkg/util/taints/taints.go | 2 +- .../kubernetes/pkg/util/tolerations/BUILD | 48 - vendor/k8s.io/kubernetes/pkg/volume/BUILD | 134 - .../k8s.io/kubernetes/pkg/volume/awsebs/BUILD | 76 - .../kubernetes/pkg/volume/awsebs/aws_util.go | 8 +- .../kubernetes/pkg/volume/azure_file/BUILD | 63 - .../pkg/volume/azure_file/azure_file.go | 3 +- .../pkg/volume/azure_file/azure_provision.go | 9 +- .../pkg/volume/azure_file/azure_util.go | 19 + .../kubernetes/pkg/volume/azuredd/BUILD | 128 - .../pkg/volume/azuredd/azure_mounter.go | 1 - .../k8s.io/kubernetes/pkg/volume/cephfs/BUILD | 53 - .../k8s.io/kubernetes/pkg/volume/cinder/BUILD | 76 - .../pkg/volume/cinder/cinder_util.go | 6 +- .../kubernetes/pkg/volume/configmap/BUILD | 57 - vendor/k8s.io/kubernetes/pkg/volume/csi/BUILD | 121 - .../kubernetes/pkg/volume/csi/csi_attacher.go | 214 +- .../kubernetes/pkg/volume/csi/csi_block.go | 19 +- .../kubernetes/pkg/volume/csi/csi_client.go | 70 +- .../kubernetes/pkg/volume/csi/csi_metrics.go | 51 + .../kubernetes/pkg/volume/csi/csi_mounter.go | 6 +- .../kubernetes/pkg/volume/csi/csi_plugin.go | 66 +- .../kubernetes/pkg/volume/csi/csi_util.go | 10 + .../kubernetes/pkg/volume/csi/expander.go | 3 +- .../pkg/volume/csi/nodeinfomanager/BUILD | 66 - .../csi/nodeinfomanager/nodeinfomanager.go | 28 +- .../kubernetes/pkg/volume/csimigration/BUILD | 45 - .../csimigration/patch_adc_plugin_manager.go | 44 + .../pkg/volume/csimigration/plugin_manager.go | 73 +- .../kubernetes/pkg/volume/downwardapi/BUILD | 55 - .../kubernetes/pkg/volume/emptydir/BUILD | 92 - vendor/k8s.io/kubernetes/pkg/volume/fc/BUILD | 65 - .../kubernetes/pkg/volume/fc/disk_manager.go | 2 +- vendor/k8s.io/kubernetes/pkg/volume/fc/fc.go | 2 +- .../kubernetes/pkg/volume/flexvolume/BUILD | 89 - .../kubernetes/pkg/volume/flocker/BUILD | 67 - .../k8s.io/kubernetes/pkg/volume/gcepd/BUILD | 79 - .../kubernetes/pkg/volume/gcepd/attacher.go | 2 + .../kubernetes/pkg/volume/gcepd/gce_pd.go | 7 +- .../kubernetes/pkg/volume/gcepd/gce_util.go | 5 +- .../kubernetes/pkg/volume/git_repo/BUILD | 53 - .../kubernetes/pkg/volume/glusterfs/BUILD | 73 - .../pkg/volume/glusterfs/glusterfs.go | 29 +- .../kubernetes/pkg/volume/hostpath/BUILD | 59 - .../k8s.io/kubernetes/pkg/volume/iscsi/BUILD | 68 - .../pkg/volume/iscsi/disk_manager.go | 2 +- .../kubernetes/pkg/volume/iscsi/iscsi.go | 2 +- .../k8s.io/kubernetes/pkg/volume/local/BUILD | 102 - .../kubernetes/pkg/volume/metrics_du.go | 2 +- .../kubernetes/pkg/volume/metrics_statfs.go | 2 +- vendor/k8s.io/kubernetes/pkg/volume/nfs/BUILD | 56 - .../k8s.io/kubernetes/pkg/volume/nfs/nfs.go | 9 +- .../k8s.io/kubernetes/pkg/volume/plugins.go | 14 +- .../kubernetes/pkg/volume/portworx/BUILD | 63 - .../kubernetes/pkg/volume/projected/BUILD | 66 - .../kubernetes/pkg/volume/quobyte/BUILD | 61 - vendor/k8s.io/kubernetes/pkg/volume/rbd/BUILD | 71 - .../kubernetes/pkg/volume/rbd/attacher.go | 2 +- .../kubernetes/pkg/volume/rbd/disk_manager.go | 4 +- .../k8s.io/kubernetes/pkg/volume/rbd/rbd.go | 2 +- .../kubernetes/pkg/volume/scaleio/BUILD | 74 - .../k8s.io/kubernetes/pkg/volume/secret/BUILD | 58 - .../kubernetes/pkg/volume/storageos/BUILD | 68 - .../k8s.io/kubernetes/pkg/volume/util/BUILD | 113 - .../kubernetes/pkg/volume/util/fs/BUILD | 95 - .../kubernetes/pkg/volume/util/fs/fs.go | 4 +- .../pkg/volume/util/fs/fs_unsupported.go | 11 +- .../pkg/volume/util/fs/fs_windows.go | 12 +- .../kubernetes/pkg/volume/util/fsquota/BUILD | 78 - .../pkg/volume/util/fsquota/common/BUILD | 34 - .../kubernetes/pkg/volume/util/hostutil/BUILD | 65 - .../kubernetes/pkg/volume/util/metrics.go | 64 +- .../volume/util/nestedpendingoperations/BUILD | 47 - .../pkg/volume/util/operationexecutor/BUILD | 81 - .../util/operationexecutor/fakegenerator.go | 4 +- .../operationexecutor/operation_generator.go | 314 +- .../pkg/volume/util/recyclerclient/BUILD | 44 - .../kubernetes/pkg/volume/util/resize_util.go | 79 +- .../kubernetes/pkg/volume/util/subpath/BUILD | 118 - .../pkg/volume/util/subpath/subpath_linux.go | 40 +- .../volume/util/subpath/subpath_windows.go | 4 +- .../kubernetes/pkg/volume/util/types/BUILD | 38 - .../kubernetes/pkg/volume/util/types/types.go | 34 +- .../k8s.io/kubernetes/pkg/volume/util/util.go | 10 +- .../pkg/volume/util/volumepathhandler/BUILD | 40 - .../kubernetes/pkg/volume/validation/BUILD | 41 - vendor/k8s.io/kubernetes/pkg/volume/volume.go | 11 + .../kubernetes/pkg/volume/volume_linux.go | 35 +- .../pkg/volume/volume_unsupported.go | 3 +- .../pkg/volume/vsphere_volume/BUILD | 78 - .../pkg/volume/vsphere_volume/attacher.go | 2 +- .../vsphere_volume/vsphere_volume_util.go | 23 +- .../kubernetes/pkg/windows/service/BUILD | 34 - .../plugin/pkg/admission/admit/BUILD | 42 - .../pkg/admission/alwayspullimages/BUILD | 47 - .../admission/alwayspullimages/admission.go | 39 + .../plugin/pkg/admission/antiaffinity/BUILD | 48 - .../plugin/pkg/admission/certificates/BUILD | 32 - .../pkg/admission/certificates/approval/BUILD | 44 - .../pkg/admission/certificates/signing/BUILD | 45 - .../certificates/subjectrestriction/BUILD | 41 - .../pkg/admission/defaultingressclass/BUILD | 53 - .../admission/defaulttolerationseconds/BUILD | 45 - .../plugin/pkg/admission/deny/BUILD | 42 - .../plugin/pkg/admission/eventratelimit/BUILD | 71 - .../eventratelimit/apis/eventratelimit/BUILD | 40 - .../apis/eventratelimit/install/BUILD | 31 - .../apis/eventratelimit/v1alpha1/BUILD | 40 - .../apis/eventratelimit/validation/BUILD | 37 - .../plugin/pkg/admission/exec/BUILD | 50 - .../plugin/pkg/admission/exec/admission.go | 163 - .../extendedresourcetoleration/BUILD | 42 - .../kubernetes/plugin/pkg/admission/gc/BUILD | 58 - .../plugin/pkg/admission/gc/gc_admission.go | 27 + .../plugin/pkg/admission/imagepolicy/BUILD | 63 - .../plugin/pkg/admission/limitranger/BUILD | 68 - .../admission/namespace/autoprovision/BUILD | 58 - .../pkg/admission/namespace/exists/BUILD | 55 - .../defaultingressclass/admission.go | 0 .../denyserviceexternalips/admission.go | 114 + .../pkg/admission/noderestriction/BUILD | 77 - .../admission/noderestriction/admission.go | 11 +- .../plugin/pkg/admission/nodetaint/BUILD | 41 - .../pkg/admission/podnodeselector/BUILD | 57 - .../admission/podtolerationrestriction/BUILD | 74 - .../apis/podtolerationrestriction/BUILD | 41 - .../podtolerationrestriction/install/BUILD | 31 - .../podtolerationrestriction/v1alpha1/BUILD | 42 - .../podtolerationrestriction/validation/BUILD | 41 - .../plugin/pkg/admission/priority/BUILD | 63 - .../plugin/pkg/admission/runtimeclass/BUILD | 63 - .../security/podsecuritypolicy/BUILD | 79 - .../admission/securitycontext/scdeny/BUILD | 41 - .../plugin/pkg/admission/serviceaccount/BUILD | 72 - .../storage/persistentvolume/label/BUILD | 59 - .../persistentvolume/label/admission.go | 46 +- .../storage/persistentvolume/resize/BUILD | 51 - .../storage/storageclass/setdefault/BUILD | 56 - .../storageobjectinuseprotection/BUILD | 46 - .../auth/authenticator/token/bootstrap/BUILD | 52 - .../plugin/pkg/auth/authorizer/node/BUILD | 84 - .../auth/authorizer/node/node_authorizer.go | 5 +- .../plugin/pkg/auth/authorizer/rbac/BUILD | 61 - .../authorizer/rbac/bootstrappolicy/BUILD | 68 - .../rbac/bootstrappolicy/controller_policy.go | 78 +- .../authorizer/rbac/bootstrappolicy/policy.go | 93 +- vendor/k8s.io/kubernetes/test/e2e/BUILD | 139 - vendor/k8s.io/kubernetes/test/e2e/README.md | 81 +- .../kubernetes/test/e2e/apimachinery/BUILD | 129 - .../kubernetes/test/e2e/apimachinery/OWNERS | 1 - .../test/e2e/apimachinery/aggregator.go | 47 +- .../kubernetes/test/e2e/apimachinery/apply.go | 1181 + .../test/e2e/apimachinery/events.go | 200 - .../test/e2e/apimachinery/flowcontrol.go | 136 +- .../test/e2e/apimachinery/resource_quota.go | 132 +- .../test/e2e/apimachinery/storage_version.go | 82 + .../test/e2e/apimachinery/webhook.go | 15 +- vendor/k8s.io/kubernetes/test/e2e/apps/BUILD | 101 - .../kubernetes/test/e2e/apps/cronjob.go | 244 +- .../kubernetes/test/e2e/apps/daemon_set.go | 342 +- .../kubernetes/test/e2e/apps/deployment.go | 94 +- .../kubernetes/test/e2e/apps/disruption.go | 115 +- vendor/k8s.io/kubernetes/test/e2e/apps/job.go | 114 + .../test/e2e/apps/network_partition.go | 19 +- .../kubernetes/test/e2e/apps/replica_set.go | 184 + .../kubernetes/test/e2e/apps/statefulset.go | 28 +- .../test/e2e/apps/ttl_after_finished.go | 151 + .../k8s.io/kubernetes/test/e2e/apps/types.go | 9 - vendor/k8s.io/kubernetes/test/e2e/auth/BUILD | 67 - .../kubernetes/test/e2e/auth/node_authz.go | 7 + .../test/e2e/auth/service_accounts.go | 38 +- .../kubernetes/test/e2e/autoscaling/BUILD | 72 - .../test/e2e/autoscaling/autoscaling_timer.go | 2 +- .../cluster_autoscaler_scalability.go | 2 +- .../autoscaling/cluster_size_autoscaling.go | 25 +- .../custom_metrics_stackdriver_autoscaling.go | 6 +- .../test/e2e/autoscaling/dns_autoscaling.go | 9 +- .../autoscaling/horizontal_pod_autoscaling.go | 38 +- .../kubernetes/test/e2e/chaosmonkey/BUILD | 34 - .../k8s.io/kubernetes/test/e2e/common/BUILD | 108 - .../kubernetes/test/e2e/common/configmap.go | 269 - .../kubernetes/test/e2e/common/container.go | 135 - .../test/e2e/common/downward_api.go | 426 - .../kubernetes/test/e2e/common/imports.go | 24 + .../kubernetes/test/e2e/common/lease.go | 168 - .../kubernetes/test/e2e/common/network/OWNERS | 4 + .../test/e2e/common/network/framework.go | 24 + .../e2e/common/{ => network}/networking.go | 4 +- .../kubernetes/test/e2e/common/node/OWNERS | 4 + .../test/e2e/common/node/configmap.go | 284 + .../test/e2e/common/node/container.go | 150 + .../e2e/common/{ => node}/container_probe.go | 124 +- .../common/{ => node}/docker_containers.go | 4 +- .../test/e2e/common/node/downwardapi.go | 424 + .../test/e2e/common/{ => node}/expansion.go | 14 +- .../test/e2e/common/node/framework.go | 24 + .../e2e/common/{ => node}/init_container.go | 4 +- .../test/e2e/common/{ => node}/kubelet.go | 4 +- .../common/{ => node}/kubelet_etc_hosts.go | 5 +- .../kubernetes/test/e2e/common/node/lease.go | 168 + .../e2e/common/{ => node}/lifecycle_hook.go | 4 +- .../test/e2e/common/{ => node}/node_lease.go | 4 +- .../test/e2e/common/{ => node}/pods.go | 16 +- .../e2e/common/{ => node}/podtemplates.go | 4 +- .../test/e2e/common/{ => node}/privileged.go | 4 +- .../test/e2e/common/node/runtime.go | 404 + .../test/e2e/common/node/runtimeclass.go | 288 + .../test/e2e/common/node/secrets.go | 278 + .../e2e/common/{ => node}/security_context.go | 9 +- .../kubernetes/test/e2e/common/node/sysctl.go | 208 + .../kubernetes/test/e2e/common/runtime.go | 404 - .../test/e2e/common/runtimeclass.go | 288 - .../kubernetes/test/e2e/common/secrets.go | 263 - .../kubernetes/test/e2e/common/storage/OWNERS | 4 + .../common/{ => storage}/configmap_volume.go | 20 +- .../test/e2e/common/storage/downwardapi.go | 140 + .../{ => storage}/downwardapi_volume.go | 4 +- .../e2e/common/{ => storage}/empty_dir.go | 25 +- .../test/e2e/common/storage/framework.go | 24 + .../e2e/common/{ => storage}/host_path.go | 4 +- .../{ => storage}/projected_combined.go | 4 +- .../{ => storage}/projected_configmap.go | 4 +- .../{ => storage}/projected_downwardapi.go | 4 +- .../common/{ => storage}/projected_secret.go | 4 +- .../common/{ => storage}/secrets_volume.go | 17 +- .../test/e2e/common/storage/util.go | 74 + .../test/e2e/common/{ => storage}/volumes.go | 9 +- .../kubernetes/test/e2e/common/sysctl.go | 208 - .../k8s.io/kubernetes/test/e2e/common/util.go | 54 +- vendor/k8s.io/kubernetes/test/e2e/e2e.go | 1 - .../test/e2e/framework/.import-restrictions | 550 +- .../kubernetes/test/e2e/framework/BUILD | 146 - .../kubernetes/test/e2e/framework/auth/BUILD | 33 - .../test/e2e/framework/autoscaling/BUILD | 40 - .../test/e2e/framework/config/BUILD | 32 - .../test/e2e/framework/deployment/BUILD | 37 - .../test/e2e/framework/deployment/fixtures.go | 13 +- .../test/e2e/framework/endpoints/BUILD | 26 - .../test/e2e/framework/endpointslice/BUILD | 26 - .../test/e2e/framework/endpointslice/ports.go | 4 +- .../test/e2e/framework/events/BUILD | 27 - .../test/e2e/framework/framework.go | 21 +- .../test/e2e/framework/ginkgowrapper/BUILD | 26 - .../kubernetes/test/e2e/framework/gpu/BUILD | 22 - .../test/e2e/framework/ingress/BUILD | 55 - .../kubernetes/test/e2e/framework/job/BUILD | 38 - .../kubernetes/test/e2e/framework/job/rest.go | 6 + .../test/e2e/framework/kubectl/BUILD | 32 - .../test/e2e/framework/kubelet/BUILD | 41 - .../test/e2e/framework/kubesystem/BUILD | 26 - .../kubernetes/test/e2e/framework/log/BUILD | 26 - .../test/e2e/framework/manifest/BUILD | 35 - .../test/e2e/framework/metrics/BUILD | 49 - .../test/e2e/framework/network/BUILD | 43 - .../test/e2e/framework/network/utils.go | 46 +- .../kubernetes/test/e2e/framework/node/BUILD | 60 - .../test/e2e/framework/node/resource.go | 8 + .../kubernetes/test/e2e/framework/perf/BUILD | 26 - .../kubernetes/test/e2e/framework/pod/BUILD | 57 - .../test/e2e/framework/pod/create.go | 70 +- .../test/e2e/framework/pod/resource.go | 14 + .../test/e2e/framework/pod/utils.go | 120 + .../kubernetes/test/e2e/framework/pod/wait.go | 25 +- .../kubernetes/test/e2e/framework/pods.go | 6 +- .../test/e2e/framework/providers/aws/BUILD | 33 - .../test/e2e/framework/providers/aws/aws.go | 2 +- .../test/e2e/framework/providers/azure/BUILD | 29 - .../test/e2e/framework/providers/gce/BUILD | 50 - .../e2e/framework/providers/kubemark/BUILD | 29 - .../e2e/framework/providers/openstack/BUILD | 23 - .../e2e/framework/providers/vsphere/BUILD | 23 - .../kubernetes/test/e2e/framework/pv/BUILD | 35 - .../kubernetes/test/e2e/framework/pv/pv.go | 45 +- .../kubernetes/test/e2e/framework/rc/BUILD | 34 - .../test/e2e/framework/replicaset/BUILD | 33 - .../test/e2e/framework/resource/BUILD | 44 - .../test/e2e/framework/security/BUILD | 31 - .../test/e2e/framework/service/BUILD | 56 - .../test/e2e/framework/service/const.go | 4 +- .../test/e2e/framework/service/jig.go | 203 +- .../test/e2e/framework/skipper/BUILD | 38 - .../test/e2e/framework/skipper/skipper.go | 17 + .../kubernetes/test/e2e/framework/ssh/BUILD | 32 - .../test/e2e/framework/statefulset/BUILD | 42 - .../test/e2e/framework/test_context.go | 8 +- .../test/e2e/framework/testfiles/BUILD | 22 - .../kubernetes/test/e2e/framework/timeouts.go | 99 + .../kubernetes/test/e2e/framework/util.go | 63 +- .../test/e2e/framework/volume/BUILD | 35 - .../test/e2e/framework/volume/fixtures.go | 153 +- .../test/e2e/framework/websocket/BUILD | 26 - .../kubernetes/test/e2e/generated/BUILD | 48 - .../kubernetes/test/e2e/generated/bindata.go | 1082 +- .../kubernetes/test/e2e/gke_node_pools.go | 111 - .../kubernetes/test/e2e/instrumentation/BUILD | 48 - .../test/e2e/instrumentation/OWNERS | 2 +- .../test/e2e/instrumentation/common/BUILD | 26 - .../test/e2e/instrumentation/core_events.go | 201 + .../test/e2e/instrumentation/logging/BUILD | 42 - .../logging/elasticsearch/BUILD | 43 - .../e2e/instrumentation/logging/utils/BUILD | 46 - .../test/e2e/instrumentation/monitoring/BUILD | 64 - .../monitoring/metrics_grabber.go | 30 +- .../k8s.io/kubernetes/test/e2e/kubectl/BUILD | 71 - .../kubernetes/test/e2e/kubectl/kubectl.go | 8 +- .../kubernetes/test/e2e/lifecycle/BUILD | 29 - .../k8s.io/kubernetes/test/e2e/network/BUILD | 116 - .../test/e2e/network/common/framework.go | 24 + .../kubernetes/test/e2e/network/conntrack.go | 175 +- .../k8s.io/kubernetes/test/e2e/network/dns.go | 3 +- .../kubernetes/test/e2e/network/dns_common.go | 5 +- .../test/e2e/network/dns_configmap.go | 3 +- .../test/e2e/network/dns_scale_records.go | 3 +- .../kubernetes/test/e2e/network/dual_stack.go | 181 +- .../test/e2e/network/endpointslice.go | 245 +- .../e2e/network/endpointslicemirroring.go | 27 +- .../test/e2e/network/example_cluster_dns.go | 3 +- .../kubernetes/test/e2e/network/firewall.go | 13 +- .../kubernetes/test/e2e/network/framework.go | 24 - .../kubernetes/test/e2e/network/hostport.go | 199 + .../kubernetes/test/e2e/network/ingress.go | 38 +- .../test/e2e/network/ingress_scale.go | 3 +- .../test/e2e/network/ingressclass.go | 5 +- .../kubernetes/test/e2e/network/kube_proxy.go | 130 +- .../test/e2e/network/loadbalancer.go | 1241 + .../kubernetes/test/e2e/network/netpol/OWNERS | 10 + .../test/e2e/network/netpol/kubemanager.go | 291 + .../test/e2e/network/netpol/model.go | 297 + .../test/e2e/network/netpol/network_legacy.go | 2387 + .../test/e2e/network/netpol/network_policy.go | 1228 + .../e2e/network/netpol/network_policy_api.go | 212 + .../test/e2e/network/netpol/policies.go | 581 + .../test/e2e/network/netpol/probe.go | 100 + .../test/e2e/network/netpol/reachability.go | 187 + .../test/e2e/network/netpol/test_helper.go | 164 + .../test/e2e/network/netpol/truthtable.go | 171 + .../test/e2e/network/network_policy.go | 2343 +- .../test/e2e/network/network_tiers.go | 3 +- .../kubernetes/test/e2e/network/networking.go | 28 +- .../test/e2e/network/networking_perf.go | 383 +- .../kubernetes/test/e2e/network/no_snat.go | 3 +- .../kubernetes/test/e2e/network/proxy.go | 187 +- .../kubernetes/test/e2e/network/scale/BUILD | 37 - .../kubernetes/test/e2e/network/service.go | 1402 +- .../test/e2e/network/service_latency.go | 3 +- .../kubernetes/test/e2e/network/util.go | 11 +- .../kubernetes/test/e2e/network/util_iperf.go | 81 +- vendor/k8s.io/kubernetes/test/e2e/node/BUILD | 83 - .../test/e2e/{ => node}/examples.go | 20 +- .../kubernetes/test/e2e/node/framework.go | 4 +- .../kubernetes/test/e2e/node/kubelet.go | 4 +- .../kubernetes/test/e2e/node/kubelet_perf.go | 4 +- .../test/e2e/node/node_problem_detector.go | 45 +- .../k8s.io/kubernetes/test/e2e/node/pods.go | 10 +- .../kubernetes/test/e2e/node/recreate_node.go | 134 - .../kubernetes/test/e2e/node/runtimeclass.go | 2 +- .../test/e2e/node/security_context.go | 16 +- .../k8s.io/kubernetes/test/e2e/node/taints.go | 4 +- .../test/e2e/node/ttlafterfinished.go | 151 - .../k8s.io/kubernetes/test/e2e/perftype/BUILD | 25 - .../kubernetes/test/e2e/reporters/BUILD | 30 - .../kubernetes/test/e2e/scheduling/BUILD | 81 - .../test/e2e/scheduling/framework.go | 31 - .../test/e2e/scheduling/predicates.go | 73 +- .../test/e2e/scheduling/preemption.go | 128 +- .../test/e2e/scheduling/priorities.go | 82 +- .../test/e2e/scheduling/ubernetes_lite.go | 18 +- .../k8s.io/kubernetes/test/e2e/storage/BUILD | 128 - .../test/e2e/storage/csi_mock_volume.go | 462 +- .../test/e2e/storage/csi_volumes.go | 7 +- .../kubernetes/test/e2e/storage/drivers/BUILD | 54 - .../storage/drivers/csi-test/driver/driver.go | 318 + .../drivers/csi-test/driver/driver.mock.go | 407 + .../storage/drivers/csi-test/driver/mock.go | 74 + .../csi-test/mock/cache/SnapshotCache.go | 105 + .../csi-test/mock/service/controller.go | 844 + .../drivers/csi-test/mock/service/identity.go | 90 + .../drivers/csi-test/mock/service/node.go | 450 + .../drivers/csi-test/mock/service/service.go | 276 + .../test/e2e/storage/drivers/csi.go | 677 +- .../test/e2e/storage/drivers/in_tree.go | 692 +- .../test/e2e/storage/drivers/proxy/io.go | 82 + .../e2e/storage/drivers/proxy/portproxy.go | 336 + .../test/e2e/storage/external/BUILD | 54 - .../test/e2e/storage/external/external.go | 118 +- .../flexvolume_mounted_volume_resize.go | 1 + .../e2e/storage/flexvolume_online_resize.go | 1 + .../storage/framework/driver_operations.go | 87 + .../storage/framework/snapshot_resource.go | 333 + .../test/e2e/storage/framework/testconfig.go | 78 + .../{testsuites => framework}/testdriver.go | 82 +- .../testpattern.go | 24 +- .../test/e2e/storage/framework/testsuite.go | 129 + .../e2e/storage/framework/volume_resource.go | 316 + .../generic_persistent_volume-disruptive.go | 3 +- .../test/e2e/{ => storage}/gke_local_ssd.go | 5 +- .../test/e2e/storage/host_path_type.go | 9 +- .../test/e2e/storage/in_tree_volumes.go | 7 +- .../test/e2e/storage/mounted_volume_resize.go | 16 +- .../nfs_persistent_volume-disruptive.go | 6 +- .../k8s.io/kubernetes/test/e2e/storage/pd.go | 12 +- .../e2e/storage/persistent_volumes-gce.go | 9 +- .../e2e/storage/persistent_volumes-local.go | 66 +- .../test/e2e/storage/persistent_volumes.go | 39 +- .../kubernetes/test/e2e/storage/podlogs/BUILD | 28 - .../test/e2e/storage/podlogs/podlogs.go | 14 + .../test/e2e/storage/pv_protection.go | 6 +- .../test/e2e/storage/pvc_protection.go | 6 +- .../test/e2e/storage/regional_pd.go | 55 +- .../test/e2e/storage/testpatterns/BUILD | 27 - .../test/e2e/storage/testsuites/BUILD | 96 - .../test/e2e/storage/testsuites/base.go | 628 +- .../test/e2e/storage/testsuites/capacity.go | 384 + .../test/e2e/storage/testsuites/disruptive.go | 80 +- .../storage/testsuites/driveroperations.go | 109 - .../test/e2e/storage/testsuites/ephemeral.go | 119 +- .../storage/testsuites/fsgroupchangepolicy.go | 94 +- .../e2e/storage/testsuites/multivolume.go | 134 +- .../e2e/storage/testsuites/provisioning.go | 310 +- .../e2e/storage/testsuites/snapshottable.go | 489 +- .../testsuites/snapshottable_stress.go | 142 +- .../test/e2e/storage/testsuites/subpath.go | 128 +- .../test/e2e/storage/testsuites/topology.go | 88 +- .../e2e/storage/testsuites/volume_expand.go | 101 +- .../test/e2e/storage/testsuites/volume_io.go | 102 +- .../e2e/storage/testsuites/volume_stress.go | 137 +- .../e2e/storage/testsuites/volumelimits.go | 73 +- .../test/e2e/storage/testsuites/volumemode.go | 106 +- .../test/e2e/storage/testsuites/volumeperf.go | 312 + .../test/e2e/storage/testsuites/volumes.go | 122 +- .../ubernetes_lite_volumes.go | 24 +- .../kubernetes/test/e2e/storage/utils/BUILD | 62 - .../test/e2e/storage/utils/deployment.go | 5 - .../test/e2e/storage/utils/host_exec.go | 2 +- .../kubernetes/test/e2e/storage/utils/pod.go | 182 + .../test/e2e/storage/utils/snapshot.go | 151 + .../test/e2e/storage/utils/utils.go | 306 +- .../test/e2e/storage/volume_metrics.go | 17 +- .../test/e2e/storage/volume_provisioning.go | 145 +- .../kubernetes/test/e2e/storage/vsphere/BUILD | 93 - .../vsphere/persistent_volumes-vsphere.go | 2 +- .../e2e/storage/vsphere/pv_reclaimpolicy.go | 12 +- .../e2e/storage/vsphere/pvc_label_selector.go | 4 +- .../test/e2e/storage/vsphere/vsphere_scale.go | 6 +- .../e2e/storage/vsphere/vsphere_stress.go | 6 +- .../test/e2e/storage/vsphere/vsphere_utils.go | 10 +- .../vsphere/vsphere_volume_diskformat.go | 2 +- .../storage/vsphere/vsphere_volume_fstype.go | 8 +- .../vsphere/vsphere_volume_node_poweroff.go | 2 +- .../vsphere/vsphere_volume_ops_storm.go | 4 +- .../storage/vsphere/vsphere_volume_perf.go | 2 +- .../vsphere/vsphere_volume_vsan_policy.go | 2 +- .../storage/vsphere/vsphere_zone_support.go | 38 +- .../k8s.io/kubernetes/test/e2e/upgrades/BUILD | 73 - .../kubernetes/test/e2e/upgrades/apparmor.go | 117 - .../kubernetes/test/e2e/upgrades/apps/BUILD | 52 - .../test/e2e/upgrades/{ => apps}/cassandra.go | 7 +- .../test/e2e/upgrades/apps/daemonsets.go | 2 +- .../test/e2e/upgrades/apps/deployments.go | 2 +- .../kubernetes/test/e2e/upgrades/apps/etcd.go | 211 + .../kubernetes/test/e2e/upgrades/apps/job.go | 2 +- .../test/e2e/upgrades/{ => apps}/mysql.go | 7 +- .../test/e2e/upgrades/apps/replicasets.go | 2 +- .../test/e2e/upgrades/apps/statefulset.go | 2 +- .../kubernetes/test/e2e/upgrades/etcd.go | 210 - .../upgrades/horizontal_pod_autoscalers.go | 99 - .../{ => network}/kube_proxy_migration.go | 7 +- .../e2e/upgrades/{ => network}/services.go | 9 +- .../test/e2e/upgrades/node/apparmor.go | 118 + .../e2e/upgrades/{ => node}/configmaps.go | 5 +- .../e2e/upgrades/{ => node}/nvidia-gpu.go | 7 +- .../test/e2e/upgrades/node/secrets.go | 151 + .../test/e2e/upgrades/node/sysctl.go | 136 + .../kubernetes/test/e2e/upgrades/secrets.go | 150 - ...eaccount_admission_controller_migration.go | 140 - .../kubernetes/test/e2e/upgrades/sysctl.go | 135 - .../test/e2e/upgrades/upgrade_suite.go | 151 + .../test/integration/.import-restrictions | 14 +- .../k8s.io/kubernetes/test/integration/BUILD | 90 - .../integration/benchmark-controller.json | 2 +- .../kubernetes/test/integration/etcd/BUILD | 90 - .../kubernetes/test/integration/etcd/data.go | 237 +- .../test/integration/etcd/server.go | 24 +- .../test/integration/framework/BUILD | 97 - .../test/integration/framework/etcd.go | 9 +- .../test/integration/framework/test_server.go | 2 +- .../test/integration/framework/util.go | 5 +- vendor/k8s.io/kubernetes/test/utils/BUILD | 89 - vendor/k8s.io/kubernetes/test/utils/crd/BUILD | 32 - .../kubernetes/test/utils/crd/crd_util.go | 7 +- .../k8s.io/kubernetes/test/utils/image/BUILD | 31 - .../k8s.io/kubernetes/test/utils/image/OWNERS | 4 +- .../kubernetes/test/utils/image/manifest.go | 137 +- .../k8s.io/kubernetes/test/utils/junit/BUILD | 25 - .../k8s.io/kubernetes/test/utils/runners.go | 60 +- .../third_party/forked/golang/expansion/BUILD | 35 - .../forked/golang/net/dnsclient.go | 58 + .../third_party/forked/gonum/graph/BUILD | 32 - .../forked/gonum/graph/internal/linear/BUILD | 28 - .../forked/gonum/graph/simple/BUILD | 48 - .../forked/gonum/graph/traverse/BUILD | 35 - .../k8s.io/legacy-cloud-providers/aws/BUILD | 116 - .../k8s.io/legacy-cloud-providers/aws/OWNERS | 9 +- .../k8s.io/legacy-cloud-providers/aws/aws.go | 119 +- .../k8s.io/legacy-cloud-providers/aws/tags.go | 9 + .../k8s.io/legacy-cloud-providers/azure/BUILD | 202 - .../legacy-cloud-providers/azure/OWNERS | 4 +- .../legacy-cloud-providers/azure/auth/BUILD | 49 - .../azure/azure_backoff.go | 29 + .../azure/azure_loadbalancer.go | 189 +- .../azure/azure_vmss.go | 8 +- .../legacy-cloud-providers/azure/cache/BUILD | 34 - .../azure/clients/BUILD | 61 - .../azure/clients/armclient/BUILD | 48 - .../clients/containerserviceclient/BUILD | 60 - .../azure/clients/deploymentclient/BUILD | 60 - .../azure/clients/diskclient/BUILD | 59 - .../clients/diskclient/mockdiskclient/BUILD | 31 - .../diskclient/mockdiskclient/interface.go | 2 +- .../azure/clients/fileclient/BUILD | 35 - .../azure/clients/interfaceclient/BUILD | 58 - .../interfaceclient/mockinterfaceclient/BUILD | 31 - .../azure/clients/loadbalancerclient/BUILD | 59 - .../mockloadbalancerclient/BUILD | 31 - .../azure/clients/publicipclient/BUILD | 60 - .../publicipclient/mockpublicipclient/BUILD | 31 - .../azure/clients/routeclient/BUILD | 58 - .../clients/routeclient/mockrouteclient/BUILD | 31 - .../azure/clients/routetableclient/BUILD | 59 - .../mockroutetableclient/BUILD | 31 - .../azure/clients/securitygroupclient/BUILD | 60 - .../mocksecuritygroupclient/BUILD | 31 - .../azure/clients/snapshotclient/BUILD | 60 - .../azure/clients/storageaccountclient/BUILD | 60 - .../azure/clients/subnetclient/BUILD | 60 - .../subnetclient/mocksubnetclient/BUILD | 31 - .../azure/clients/vmclient/BUILD | 60 - .../azure/clients/vmclient/mockvmclient/BUILD | 31 - .../azure/clients/vmsizeclient/BUILD | 59 - .../azure/clients/vmssclient/BUILD | 61 - .../clients/vmssclient/mockvmssclient/BUILD | 32 - .../azure/clients/vmssvmclient/BUILD | 61 - .../vmssvmclient/mockvmssvmclient/BUILD | 31 - .../azure/metrics/BUILD | 37 - .../legacy-cloud-providers/azure/retry/BUILD | 46 - .../k8s.io/legacy-cloud-providers/gce/BUILD | 146 - .../k8s.io/legacy-cloud-providers/gce/OWNERS | 5 +- .../legacy-cloud-providers/gce/gce_alpha.go | 3 - .../legacy-cloud-providers/gce/gce_disks.go | 15 +- .../gce/gce_instances.go | 2 +- .../gce/gce_loadbalancer_external.go | 44 +- .../gce/gce_loadbalancer_internal.go | 64 +- .../gce/gcpcredential/credentialutil.go | 113 + .../gce/gcpcredential/gcpcredential.go | 130 + .../gce/gcpcredential/registry_marshal.go | 110 + .../gce/token_source.go | 2 +- .../legacy-cloud-providers/openstack/BUILD | 106 - .../openstack/MAINTAINERS.md | 2 - .../legacy-cloud-providers/openstack/OWNERS | 4 +- .../openstack/openstack_volumes.go | 10 +- .../legacy-cloud-providers/vsphere/BUILD | 105 - .../legacy-cloud-providers/vsphere/OWNERS | 7 +- .../vsphere/nodemanager.go | 20 +- .../vsphere/shared_datastore.go | 209 + .../vsphere/vclib/BUILD | 81 - .../vsphere/vclib/connection.go | 11 +- .../vsphere/vclib/constants.go | 1 + .../vsphere/vclib/diskmanagers/BUILD | 36 - .../vsphere/vclib/utils.go | 32 + .../vsphere/vclib/virtualmachine.go | 18 + .../legacy-cloud-providers/vsphere/vsphere.go | 42 +- .../vsphere/vsphere_util.go | 16 + .../metrics/pkg/apis/custom_metrics/BUILD | 46 - .../pkg/apis/custom_metrics/v1beta1/BUILD | 44 - .../custom_metrics/v1beta1/generated.pb.go | 15 +- .../pkg/apis/custom_metrics/v1beta2/BUILD | 46 - .../custom_metrics/v1beta2/generated.pb.go | 20 +- .../metrics/pkg/apis/external_metrics/BUILD | 41 - .../pkg/apis/external_metrics/v1beta1/BUILD | 43 - .../external_metrics/v1beta1/generated.pb.go | 12 +- .../metrics/pkg/client/custom_metrics/BUILD | 63 - .../pkg/client/custom_metrics/scheme/BUILD | 32 - .../client/custom_metrics/scheme/register.go | 7 + .../metrics/pkg/client/external_metrics/BUILD | 40 - vendor/k8s.io/mount-utils/BUILD | 107 - vendor/k8s.io/mount-utils/OWNERS | 2 + vendor/k8s.io/mount-utils/go.mod | 9 +- vendor/k8s.io/mount-utils/go.sum | 23 +- vendor/k8s.io/mount-utils/mount.go | 8 + .../k8s.io/mount-utils/mount_helper_common.go | 78 +- vendor/k8s.io/mount-utils/mount_linux.go | 59 +- vendor/k8s.io/mount-utils/mount_windows.go | 2 +- vendor/k8s.io/mount-utils/resizefs_linux.go | 101 + .../resizefs_unsupported.go | 12 +- .../sample-apiserver/pkg/apis/wardle/BUILD | 43 - .../pkg/apis/wardle/v1alpha1/BUILD | 42 - vendor/modules.txt | 458 +- .../konnectivity-client/pkg/client/client.go | 6 + .../kustomize/api}/LICENSE | 0 .../api/builtins/AnnotationsTransformer.go | 44 + .../api/builtins/ConfigMapGenerator.go | 39 + .../kustomize/api/builtins/HashTransformer.go | 40 + .../builtins/HelmChartInflationGenerator.go | 287 + .../api/builtins/ImageTagTransformer.go | 50 + .../api/builtins/LabelTransformer.go | 44 + .../api/builtins/LegacyOrderTransformer.go | 46 + .../api/builtins/NamespaceTransformer.go | 60 + .../api/builtins/PatchJson6902Transformer.go | 93 + .../PatchStrategicMergeTransformer.go | 86 + .../api/builtins/PatchTransformer.go | 139 + .../api/builtins/PrefixSuffixTransformer.go | 104 + .../api/builtins/ReplicaCountTransformer.go | 73 + .../kustomize/api/builtins/SecretGenerator.go | 39 + .../api/builtins/ValueAddTransformer.go | 141 + .../sigs.k8s.io/kustomize/api/builtins/doc.go | 8 + .../kustomize/api/filesys/confirmeddir.go | 79 + .../sigs.k8s.io/kustomize/api/filesys/file.go | 15 + .../kustomize/api/filesys/fileinfo.go | 34 + .../kustomize/api/filesys/fileondisk.go | 27 + .../kustomize/api/filesys/filesystem.go | 50 + .../kustomize/api/filesys/fsnode.go | 557 + .../kustomize/api/filesys/fsondisk.go | 114 + .../sigs.k8s.io/kustomize/api/filesys/util.go | 125 + .../api/filters/annotations/annotations.go | 44 + .../kustomize/api/filters/annotations/doc.go | 6 + .../kustomize/api/filters/fieldspec/doc.go | 6 + .../api/filters/fieldspec/fieldspec.go | 185 + .../kustomize/api/filters/fieldspec/gvk.go | 49 + .../api/filters/filtersutil/setters.go | 33 + .../kustomize/api/filters/fsslice/doc.go | 6 + .../kustomize/api/filters/fsslice/fsslice.go | 47 + .../kustomize/api/filters/imagetag/doc.go | 12 + .../api/filters/imagetag/imagetag.go | 69 + .../kustomize/api/filters/imagetag/legacy.go | 113 + .../kustomize/api/filters/imagetag/updater.go | 43 + .../kustomize/api/filters/labels/doc.go | 6 + .../kustomize/api/filters/labels/labels.go | 45 + .../kustomize/api/filters/nameref/doc.go | 3 + .../kustomize/api/filters/nameref/nameref.go | 402 + .../api/filters/nameref/seqfilter.go | 57 + .../kustomize/api/filters/namespace/doc.go | 9 + .../api/filters/namespace/namespace.go | 169 + .../api/filters/patchjson6902/doc.go | 6 + .../filters/patchjson6902/patchjson6902.go | 65 + .../api/filters/patchstrategicmerge/doc.go | 6 + .../patchstrategicmerge.go | 37 + .../kustomize/api/filters/prefixsuffix/doc.go | 6 + .../api/filters/prefixsuffix/prefixsuffix.go | 43 + .../kustomize/api/filters/refvar/doc.go | 3 + .../kustomize/api/filters/refvar/expand.go | 147 + .../kustomize/api/filters/refvar/refvar.go | 110 + .../kustomize/api/filters/replicacount/doc.go | 6 + .../api/filters/replicacount/replicacount.go | 37 + .../api/filters/valueadd/valueadd.go | 134 + .../kustomize/api/hasher/hasher.go | 156 + vendor/sigs.k8s.io/kustomize/api/ifc/ifc.go | 130 + .../sigs.k8s.io/kustomize/api/image/image.go | 50 + .../accumulator/loadconfigfromcrds.go | 195 + .../accumulator/namereferencetransformer.go | 154 + .../internal/accumulator/refvartransformer.go | 57 + .../internal/accumulator/resaccumulator.go | 169 + .../api/internal/conflict/factory.go | 23 + .../conflict/smpatchmergeonlydetector.go | 33 + .../api/internal/generators/configmap.go | 45 + .../api/internal/generators/secret.go | 58 + .../api/internal/generators/utils.go | 78 + .../kustomize/api/internal/git/cloner.go | 51 + .../kustomize/api/internal/git/gitrunner.go | 58 + .../kustomize/api/internal/git/repospec.go | 219 + .../api/internal/kusterr/yamlformaterror.go | 35 + .../api/internal/plugins/builtinconfig/doc.go | 10 + .../builtinconfig/loaddefaultconfig.go | 42 + .../builtinconfig/namebackreferences.go | 99 + .../builtinconfig/transformerconfig.go | 148 + .../builtinplugintype_string.go | 38 + .../plugins/builtinhelpers/builtins.go | 77 + .../internal/plugins/execplugin/execplugin.go | 189 + .../api/internal/plugins/fnplugin/fnplugin.go | 197 + .../api/internal/plugins/loader/loader.go | 246 + .../api/internal/plugins/utils/utils.go | 237 + .../target/errmissingkustomization.go | 48 + .../api/internal/target/kusttarget.go | 452 + .../target/kusttarget_configplugin.go | 318 + .../api/internal/target/multitransformer.go | 85 + .../api/internal/utils/errtimeout.go | 36 + .../api/internal/utils/pathsplitter.go | 22 + .../kustomize/api/internal/utils/timedcall.go | 23 + .../api/internal/validate/fieldvalidator.go | 68 + .../kustomize/api/internal/wrappy/factory.go | 108 + .../kustomize/api/internal/wrappy/wnode.go | 292 + .../builtinpluginconsts/commonannotations.go | 47 + .../builtinpluginconsts}/commonlabels.go | 31 +- .../builtinpluginconsts/defaultconfig.go | 38 + .../api/konfig/builtinpluginconsts/doc.go | 8 + .../api/konfig/builtinpluginconsts/images.go | 18 + .../konfig/builtinpluginconsts/nameprefix.go | 11 + .../builtinpluginconsts/namereference.go | 403 + .../konfig/builtinpluginconsts/namespace.go | 23 + .../konfig/builtinpluginconsts/replicas.go | 23 + .../builtinpluginconsts/varreference.go | 223 + .../sigs.k8s.io/kustomize/api/konfig/doc.go | 6 + .../kustomize/api/konfig/general.go | 72 + .../kustomize/api/konfig/plugins.go | 159 + .../sigs.k8s.io/kustomize/api/krusty/doc.go | 11 + .../kustomize/api/krusty/kustomizer.go | 110 + .../kustomize/api/krusty/options.go | 77 + vendor/sigs.k8s.io/kustomize/api/kv/kv.go | 213 + .../kustomize/api/loader/fileloader.go | 336 + .../kustomize/api/loader/loader.go | 34 + .../kustomize/api/loader/loadrestrictions.go | 35 + .../kustomize/api/provenance/provenance.go | 68 + .../kustomize/api/provider/depprovider.go | 201 + vendor/sigs.k8s.io/kustomize/api/resid/gvk.go | 221 + .../sigs.k8s.io/kustomize/api/resid/resid.go | 127 + .../kustomize/api/resmap/factory.go | 163 + .../kustomize/{pkg => api}/resmap/idslice.go | 6 +- .../kustomize/api/resmap/merginator.go | 123 + .../kustomize/api/resmap/resmap.go | 245 + .../kustomize/api/resmap/reswrangler.go | 643 + .../api/resource/conflictdetector.go | 20 + .../sigs.k8s.io/kustomize/api/resource/doc.go | 5 + .../kustomize/api/resource/factory.go | 181 + .../kustomize/api/resource/idset.go | 30 + .../kustomize/api/resource/resource.go | 523 + .../builtinpluginloadingoptions_string.go | 25 + .../kustomize/api/types/configmapargs.go | 10 + vendor/sigs.k8s.io/kustomize/api/types/doc.go | 9 + .../api/types/erronlybuiltinpluginsallowed.go | 33 + .../kustomize/api/types/errunabletofind.go | 40 + .../kustomize/api/types/fieldspec.go | 92 + vendor/sigs.k8s.io/kustomize/api/types/fix.go | 54 + .../kustomize/api/types/genargs.go | 46 + .../kustomize/api/types/generationbehavior.go | 46 + .../kustomize/api/types/generatorargs.go | 27 + .../kustomize/api/types/generatoroptions.go | 70 + .../kustomize/api/types/helmchartargs.go | 22 + .../sigs.k8s.io/kustomize/api/types/image.go | 21 + .../kustomize/api/types/inventory.go | 16 + .../kustomize/api/types/kustomization.go | 225 + .../kustomize/api/types/kvpairsources.go | 36 + .../kustomize/api/types/loadrestrictions.go | 24 + .../api/types/loadrestrictions_string.go | 25 + .../kustomize/api/types/objectmeta.go | 13 + .../sigs.k8s.io/kustomize/api/types/pair.go | 10 + .../sigs.k8s.io/kustomize/api/types/patch.go | 28 + .../api/types/patchstrategicmerge.go | 9 + .../kustomize/api/types/pluginconfig.go | 35 + .../kustomize/api/types/pluginrestrictions.go | 58 + .../api/types/pluginrestrictions_string.go | 25 + .../kustomize/api/types/replacement.go | 27 + .../kustomize/api/types/replica.go | 16 + .../kustomize/api/types/secretargs.go | 19 + .../kustomize/api/types/selector.go | 115 + .../kustomize/api/types/typemeta.go | 11 + vendor/sigs.k8s.io/kustomize/api/types/var.go | 213 + .../sigs.k8s.io/kustomize/{ => kyaml}/LICENSE | 0 .../kustomize/kyaml/LICENSE_TEMPLATE | 2 + .../kustomize/kyaml/comments/comments.go | 78 + .../kustomize/kyaml/errors/errors.go | 40 + vendor/sigs.k8s.io/kustomize/kyaml/ext/ext.go | 10 + .../kustomize/kyaml/fieldmeta/fieldmeta.go | 275 + .../kustomize/kyaml/filtersutil/doc.go | 6 + .../kyaml/filtersutil/filtersutil.go | 83 + .../kyaml/fn/runtime/container/container.go | 192 + .../kustomize/kyaml/fn/runtime/exec/doc.go | 5 + .../kustomize/kyaml/fn/runtime/exec/exec.go | 36 + .../kyaml/fn/runtime/runtimeutil/doc.go | 5 + .../fn/runtime/runtimeutil/functiontypes.go | 305 + .../fn/runtime/runtimeutil/runtimeutil.go | 256 + .../kyaml/fn/runtime/runtimeutil/types.go | 8 + .../kyaml/fn/runtime/starlark/context.go | 79 + .../kyaml/fn/runtime/starlark/doc.go | 36 + .../kyaml/fn/runtime/starlark/starlark.go | 181 + .../github.com/qri-io/starlib/util/LICENSE | 21 + .../github.com/qri-io/starlib/util/doc.go | 25 + .../github.com/qri-io/starlib/util/util.go | 273 + .../kustomize/kyaml/kio/byteio_reader.go | 248 + .../kustomize/kyaml/kio/byteio_writer.go | 140 + vendor/sigs.k8s.io/kustomize/kyaml/kio/doc.go | 35 + .../kustomize/kyaml/kio/filters/filters.go | 199 + .../kustomize/kyaml/kio/filters/fmtr.go | 314 + .../kustomize/kyaml/kio/filters/grep.go | 117 + .../kustomize/kyaml/kio/filters/local.go | 38 + .../kustomize/kyaml/kio/filters/merge.go | 86 + .../kustomize/kyaml/kio/filters/merge3.go | 203 + .../kustomize/kyaml/kio/filters/modify.go | 4 + .../kyaml/kio/filters/stripcomments.go | 32 + .../kustomize/kyaml/kio/ignorefilesmatcher.go | 100 + vendor/sigs.k8s.io/kustomize/kyaml/kio/kio.go | 149 + .../kustomize/kyaml/kio/kioutil/kioutil.go | 233 + .../kustomize/kyaml/kio/pkgio_reader.go | 308 + .../kustomize/kyaml/kio/pkgio_writer.go | 152 + .../kustomize/kyaml/kio/testing.go | 55 + .../sigs.k8s.io/kustomize/kyaml/kio/tree.go | 514 + .../kustomize/kyaml/openapi/Makefile | 58 + .../kustomize/kyaml/openapi/README.md | 63 + .../openapi/kubernetesapi/openapiinfo.go | 18 + .../openapi/kubernetesapi/v1204/swagger.go | 251 + .../openapi/kubernetesapi/v1204/swagger.json | 96625 ++++++++++++++++ .../kyaml/openapi/kustomizationapi/swagger.go | 249 + .../openapi/kustomizationapi/swagger.json | 130 + .../kustomize/kyaml/openapi/openapi.go | 607 + .../kustomize/kyaml/runfn/runfn.go | 521 + .../kustomize/kyaml/sets/string.go | 64 + .../kustomize/kyaml/sets/stringlist.go | 44 + .../sigs.k8s.io/kustomize/kyaml/yaml/alias.go | 44 + .../kustomize/kyaml/yaml/compatibility.go | 92 + .../sigs.k8s.io/kustomize/kyaml/yaml/const.go | 30 + .../kustomize/kyaml/yaml/datamap.go | 121 + .../sigs.k8s.io/kustomize/kyaml/yaml/doc.go | 49 + .../kustomize/kyaml/yaml/filters.go | 146 + .../sigs.k8s.io/kustomize/kyaml/yaml/fns.go | 769 + .../k8sgen/pkg/labels/copied.deepcopy.go | 43 + .../yaml/internal/k8sgen/pkg/labels/labels.go | 192 + .../internal/k8sgen/pkg/labels/selector.go | 925 + .../internal/k8sgen/pkg/selection/operator.go | 36 + .../internal/k8sgen/pkg/util/errors/errors.go | 252 + .../internal/k8sgen/pkg/util/sets/empty.go | 24 + .../internal/k8sgen/pkg/util/sets/string.go | 206 + .../pkg/util/validation/field/errors.go | 275 + .../k8sgen/pkg/util/validation/field/path.go | 94 + .../k8sgen/pkg/util/validation/validation.go | 506 + .../sigs.k8s.io/kustomize/kyaml/yaml/kfns.go | 137 + .../kustomize/kyaml/yaml/mapnode.go | 40 + .../sigs.k8s.io/kustomize/kyaml/yaml/match.go | 206 + .../kustomize/kyaml/yaml/merge2/merge2.go | 182 + .../kyaml/yaml/merge2/smpdirective.go | 101 + .../kyaml/yaml/merge2/smpdirective_string.go | 26 + .../kustomize/kyaml/yaml/merge3/merge3.go | 45 + .../kustomize/kyaml/yaml/merge3/visitor.go | 172 + .../sigs.k8s.io/kustomize/kyaml/yaml/order.go | 107 + .../sigs.k8s.io/kustomize/kyaml/yaml/rnode.go | 861 + .../kustomize/kyaml/yaml/schema/schema.go | 44 + .../kustomize/kyaml/yaml/serialization.go | 76 + .../sigs.k8s.io/kustomize/kyaml/yaml/types.go | 237 + .../kyaml/yaml/walk/associative_sequence.go | 326 + .../kustomize/kyaml/yaml/walk/map.go | 173 + .../yaml/walk/nonassociative_sequence.go | 13 + .../kustomize/kyaml/yaml/walk/scalar.go | 11 + .../kustomize/kyaml/yaml/walk/visitor.go | 28 + .../kustomize/kyaml/yaml/walk/walk.go | 186 + .../kustomize/pkg/commands/build/build.go | 129 - .../kustomize/pkg/constants/constants.go | 28 - .../kustomize/pkg/expansion/expand.go | 121 - .../kustomize/pkg/factory/factory.go | 39 - .../kustomize/pkg/fs/confirmeddir.go | 93 - .../sigs.k8s.io/kustomize/pkg/fs/fakefile.go | 69 - .../kustomize/pkg/fs/fakefileinfo.go | 47 - vendor/sigs.k8s.io/kustomize/pkg/fs/fakefs.go | 185 - vendor/sigs.k8s.io/kustomize/pkg/fs/fs.go | 44 - .../sigs.k8s.io/kustomize/pkg/fs/realfile.go | 40 - vendor/sigs.k8s.io/kustomize/pkg/fs/realfs.go | 122 - .../sigs.k8s.io/kustomize/pkg/git/cloner.go | 75 - .../sigs.k8s.io/kustomize/pkg/git/repospec.go | 214 - vendor/sigs.k8s.io/kustomize/pkg/gvk/gvk.go | 180 - vendor/sigs.k8s.io/kustomize/pkg/ifc/ifc.go | 73 - .../kustomize/pkg/ifc/transformer/factory.go | 29 - .../kustomize/pkg/image/deprecatedimage.go | 32 - .../sigs.k8s.io/kustomize/pkg/image/image.go | 36 - .../pkg/internal/error/configmaperror.go | 30 - .../pkg/internal/error/kustomizationerror.go | 61 - .../pkg/internal/error/patcherror.go | 32 - .../pkg/internal/error/resourceerror.go | 30 - .../pkg/internal/error/secreterror.go | 30 - .../pkg/internal/error/yamlformaterror.go | 48 - .../kustomize/pkg/loader/fileloader.go | 312 - .../kustomize/pkg/loader/loader.go | 39 - .../kustomize/pkg/patch/json6902.go | 40 - .../kustomize/pkg/patch/strategicmerge.go | 40 - .../pkg/patch/transformer/factory.go | 83 - .../patch/transformer/patchjson6902json.go | 108 - .../sigs.k8s.io/kustomize/pkg/resid/resid.go | 207 - .../kustomize/pkg/resmap/factory.go | 123 - .../kustomize/pkg/resmap/resmap.go | 200 - .../kustomize/pkg/resource/factory.go | 148 - .../kustomize/pkg/resource/resource.go | 107 - .../kustomize/pkg/target/kusttarget.go | 315 - .../kustomize/pkg/target/resaccumulator.go | 161 - .../config/defaultconfig/commonannotations.go | 60 - .../config/defaultconfig/defaultconfig.go | 49 - .../config/defaultconfig/nameprefix.go | 24 - .../config/defaultconfig/namereference.go | 317 - .../config/defaultconfig/namespace.go | 25 - .../config/defaultconfig/varreference.go | 162 - .../pkg/transformers/config/factory.go | 87 - .../pkg/transformers/config/factorycrd.go | 201 - .../pkg/transformers/config/fieldspec.go | 139 - .../transformers/config/namebackreferences.go | 105 - .../transformers/config/transformerconfig.go | 134 - .../kustomize/pkg/transformers/image.go | 171 - .../pkg/transformers/labelsandannotations.go | 86 - .../pkg/transformers/multitransformer.go | 95 - .../kustomize/pkg/transformers/mutatefield.go | 81 - .../pkg/transformers/namereference.go | 144 - .../kustomize/pkg/transformers/namespace.go | 121 - .../pkg/transformers/nooptransformer.go | 34 - .../pkg/transformers/prefixsuffixname.go | 109 - .../kustomize/pkg/transformers/refvars.go | 94 - .../kustomize/pkg/transformers/transformer.go | 26 - .../kustomize/pkg/types/genargs.go | 64 - .../kustomize/pkg/types/generationbehavior.go | 59 - .../kustomize/pkg/types/kustomization.go | 250 - vendor/sigs.k8s.io/kustomize/pkg/types/var.go | 145 - .../structured-merge-diff/v4/fieldpath/set.go | 99 + .../structured-merge-diff/v4/merge/update.go | 12 +- .../structured-merge-diff/v4/typed/remove.go | 54 +- .../v4/typed/tofieldset.go | 4 +- .../structured-merge-diff/v4/typed/typed.go | 8 +- .../v4/typed/validate.go | 2 +- .../v4/value/reflectcache.go | 10 +- 5134 files changed, 326131 insertions(+), 139131 deletions(-) create mode 100644 vendor/github.com/Microsoft/go-winio/pkg/security/grantvmgroupaccess.go create mode 100644 vendor/github.com/Microsoft/go-winio/pkg/security/syscall_windows.go create mode 100644 vendor/github.com/Microsoft/go-winio/pkg/security/zsyscall_windows.go create mode 100644 vendor/github.com/Microsoft/hcsshim/.gitattributes create mode 100644 vendor/github.com/Microsoft/hcsshim/computestorage/attach.go create mode 100644 vendor/github.com/Microsoft/hcsshim/computestorage/destroy.go create mode 100644 vendor/github.com/Microsoft/hcsshim/computestorage/detach.go create mode 100644 vendor/github.com/Microsoft/hcsshim/computestorage/export.go create mode 100644 vendor/github.com/Microsoft/hcsshim/computestorage/format.go create mode 100644 vendor/github.com/Microsoft/hcsshim/computestorage/helpers.go create mode 100644 vendor/github.com/Microsoft/hcsshim/computestorage/import.go create mode 100644 vendor/github.com/Microsoft/hcsshim/computestorage/initialize.go create mode 100644 vendor/github.com/Microsoft/hcsshim/computestorage/mount.go create mode 100644 vendor/github.com/Microsoft/hcsshim/computestorage/setup.go create mode 100644 vendor/github.com/Microsoft/hcsshim/computestorage/storage.go create mode 100644 vendor/github.com/Microsoft/hcsshim/computestorage/zsyscall_windows.go delete mode 100644 vendor/github.com/Microsoft/hcsshim/internal/hcs/syscall.go delete mode 100644 vendor/github.com/Microsoft/hcsshim/internal/hcs/zsyscall_windows.go delete mode 100644 vendor/github.com/Microsoft/hcsshim/internal/safefile/zsyscall_windows.go create mode 100644 vendor/github.com/Microsoft/hcsshim/internal/schema2/cpu_group.go create mode 100644 vendor/github.com/Microsoft/hcsshim/internal/schema2/cpu_group_affinity.go create mode 100644 vendor/github.com/Microsoft/hcsshim/internal/schema2/cpu_group_config.go create mode 100644 vendor/github.com/Microsoft/hcsshim/internal/schema2/cpu_group_configurations.go create mode 100644 vendor/github.com/Microsoft/hcsshim/internal/schema2/cpu_group_operations.go create mode 100644 vendor/github.com/Microsoft/hcsshim/internal/schema2/cpu_group_property.go create mode 100644 vendor/github.com/Microsoft/hcsshim/internal/schema2/create_group_operation.go create mode 100644 vendor/github.com/Microsoft/hcsshim/internal/schema2/delete_group_operation.go create mode 100644 vendor/github.com/Microsoft/hcsshim/internal/schema2/host_processor_modify_request.go create mode 100644 vendor/github.com/Microsoft/hcsshim/internal/schema2/vm_processor_limits.go create mode 100644 vendor/github.com/Microsoft/hcsshim/internal/winapi/devices.go create mode 100644 vendor/github.com/Microsoft/hcsshim/internal/winapi/errors.go create mode 100644 vendor/github.com/Microsoft/hcsshim/internal/winapi/filesystem.go create mode 100644 vendor/github.com/Microsoft/hcsshim/internal/winapi/iocp.go create mode 100644 vendor/github.com/Microsoft/hcsshim/internal/winapi/jobobject.go create mode 100644 vendor/github.com/Microsoft/hcsshim/internal/winapi/logon.go create mode 100644 vendor/github.com/Microsoft/hcsshim/internal/winapi/memory.go create mode 100644 vendor/github.com/Microsoft/hcsshim/internal/winapi/net.go create mode 100644 vendor/github.com/Microsoft/hcsshim/internal/winapi/path.go create mode 100644 vendor/github.com/Microsoft/hcsshim/internal/winapi/process.go create mode 100644 vendor/github.com/Microsoft/hcsshim/internal/winapi/processor.go create mode 100644 vendor/github.com/Microsoft/hcsshim/internal/winapi/utils.go create mode 100644 vendor/github.com/Microsoft/hcsshim/internal/winapi/winapi.go create mode 100644 vendor/github.com/Microsoft/hcsshim/internal/winapi/zsyscall_windows.go create mode 100644 vendor/github.com/NYTimes/gziphandler/LICENSE delete mode 100644 vendor/github.com/NYTimes/gziphandler/LICENSE.md create mode 100644 vendor/github.com/NYTimes/gziphandler/go.mod create mode 100644 vendor/github.com/NYTimes/gziphandler/go.sum delete mode 100644 vendor/github.com/certifi/gocertifi/LICENSE delete mode 100644 vendor/github.com/certifi/gocertifi/README.md delete mode 100644 vendor/github.com/certifi/gocertifi/certifi.go create mode 100644 vendor/github.com/cilium/ebpf/.clang-format create mode 100644 vendor/github.com/cilium/ebpf/internal/btf/fuzz.go create mode 100644 vendor/github.com/containerd/console/.golangci.yml delete mode 100644 vendor/github.com/containerd/console/.travis.yml create mode 100644 vendor/github.com/containerd/console/tc_netbsd.go create mode 100644 vendor/github.com/containerd/containerd/log/context.go create mode 100644 vendor/github.com/containerd/containerd/platforms/compare.go create mode 100644 vendor/github.com/containerd/containerd/platforms/cpuinfo.go create mode 100644 vendor/github.com/containerd/containerd/platforms/database.go create mode 100644 vendor/github.com/containerd/containerd/platforms/defaults.go create mode 100644 vendor/github.com/containerd/containerd/platforms/defaults_unix.go create mode 100644 vendor/github.com/containerd/containerd/platforms/defaults_windows.go create mode 100644 vendor/github.com/containerd/containerd/platforms/platforms.go create mode 100644 vendor/github.com/containerd/containerd/sys/env.go create mode 100644 vendor/github.com/containerd/containerd/sys/epoll.go create mode 100644 vendor/github.com/containerd/containerd/sys/fds.go create mode 100644 vendor/github.com/containerd/containerd/sys/filesys.go create mode 100644 vendor/github.com/containerd/containerd/sys/filesys_unix.go create mode 100644 vendor/github.com/containerd/containerd/sys/filesys_windows.go create mode 100644 vendor/github.com/containerd/containerd/sys/mount_linux.go create mode 100644 vendor/github.com/containerd/containerd/sys/oom_unix.go create mode 100644 vendor/github.com/containerd/containerd/sys/oom_windows.go create mode 100644 vendor/github.com/containerd/containerd/sys/socket_unix.go create mode 100644 vendor/github.com/containerd/containerd/sys/socket_windows.go create mode 100644 vendor/github.com/containerd/containerd/sys/stat_bsd.go create mode 100644 vendor/github.com/containerd/containerd/sys/stat_unix.go create mode 100644 vendor/github.com/containerd/containerd/sys/subprocess_unsafe_linux.go create mode 100644 vendor/github.com/containerd/containerd/sys/subprocess_unsafe_linux.s create mode 100644 vendor/github.com/containerd/containerd/sys/userns_linux.go create mode 100644 vendor/github.com/containerd/containerd/sys/userns_unsupported.go create mode 100644 vendor/github.com/containerd/continuity/fs/copy_darwinopenbsdsolaris.go create mode 100644 vendor/github.com/containerd/continuity/fs/copy_freebsd.go rename vendor/github.com/containerd/continuity/fs/{stat_bsd.go => stat_darwinfreebsd.go} (100%) delete mode 100644 vendor/github.com/containerd/continuity/fs/stat_linux.go create mode 100644 vendor/github.com/containerd/continuity/fs/stat_linuxopenbsd.go delete mode 100644 vendor/github.com/containerd/continuity/pathdriver/path_driver.go delete mode 100644 vendor/github.com/containerd/continuity/syscallx/syscall_unix.go delete mode 100644 vendor/github.com/containerd/continuity/syscallx/syscall_windows.go delete mode 100644 vendor/github.com/containerd/continuity/sysx/file_posix.go create mode 100644 vendor/github.com/docker/docker/api/types/error_response_ext.go delete mode 100644 vendor/github.com/docker/docker/api/types/seccomp.go delete mode 100644 vendor/github.com/docker/docker/opts/address_pools.go delete mode 100644 vendor/github.com/docker/docker/opts/env.go delete mode 100644 vendor/github.com/docker/docker/opts/hosts.go delete mode 100644 vendor/github.com/docker/docker/opts/hosts_unix.go delete mode 100644 vendor/github.com/docker/docker/opts/hosts_windows.go delete mode 100644 vendor/github.com/docker/docker/opts/ip.go delete mode 100644 vendor/github.com/docker/docker/opts/opts.go delete mode 100644 vendor/github.com/docker/docker/opts/opts_unix.go delete mode 100644 vendor/github.com/docker/docker/opts/opts_windows.go delete mode 100644 vendor/github.com/docker/docker/opts/quotedstring.go delete mode 100644 vendor/github.com/docker/docker/opts/runtime.go delete mode 100644 vendor/github.com/docker/docker/opts/ulimit.go delete mode 100644 vendor/github.com/docker/docker/pkg/mount/flags.go delete mode 100644 vendor/github.com/docker/docker/pkg/mount/flags_freebsd.go delete mode 100644 vendor/github.com/docker/docker/pkg/mount/flags_unsupported.go delete mode 100644 vendor/github.com/docker/docker/pkg/mount/mount.go delete mode 100644 vendor/github.com/docker/docker/pkg/mount/mounter_freebsd.go delete mode 100644 vendor/github.com/docker/docker/pkg/mount/mounter_unsupported.go delete mode 100644 vendor/github.com/docker/docker/pkg/mount/mountinfo.go delete mode 100644 vendor/github.com/docker/docker/pkg/mount/mountinfo_freebsd.go delete mode 100644 vendor/github.com/docker/docker/pkg/mount/mountinfo_linux.go delete mode 100644 vendor/github.com/docker/docker/pkg/mount/mountinfo_unsupported.go delete mode 100644 vendor/github.com/docker/docker/pkg/mount/mountinfo_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/mount/unmount_unix.go delete mode 100644 vendor/github.com/docker/docker/pkg/mount/unmount_unsupported.go create mode 100644 vendor/github.com/docker/docker/pkg/system/chtimes_nowindows.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/chtimes_unix.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/filesys.go create mode 100644 vendor/github.com/docker/docker/pkg/system/filesys_unix.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/init_unix.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/lcow_unix.go create mode 100644 vendor/github.com/docker/docker/pkg/system/lcow_unsupported.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/lcow_windows.go create mode 100644 vendor/github.com/docker/docker/pkg/system/rm_windows.go create mode 100644 vendor/github.com/docker/docker/pkg/system/stat_bsd.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/stat_freebsd.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/utimes_freebsd.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/utimes_linux.go create mode 100644 vendor/github.com/docker/docker/pkg/system/utimes_unix.go delete mode 100644 vendor/github.com/docker/docker/pkg/term/ascii.go delete mode 100644 vendor/github.com/docker/docker/pkg/term/proxy.go delete mode 100644 vendor/github.com/docker/docker/pkg/term/tc.go delete mode 100644 vendor/github.com/docker/docker/pkg/term/term.go delete mode 100644 vendor/github.com/docker/docker/pkg/term/term_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/term/termios_bsd.go delete mode 100644 vendor/github.com/docker/docker/pkg/term/termios_linux.go delete mode 100644 vendor/github.com/docker/docker/pkg/term/windows/ansi_reader.go delete mode 100644 vendor/github.com/docker/docker/pkg/term/windows/ansi_writer.go delete mode 100644 vendor/github.com/docker/docker/pkg/term/windows/console.go delete mode 100644 vendor/github.com/docker/docker/pkg/term/windows/windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/term/winsize.go delete mode 100644 vendor/github.com/docker/libnetwork/LICENSE delete mode 100644 vendor/github.com/docker/libnetwork/ipamutils/utils.go delete mode 100644 vendor/github.com/docker/spdystream/LICENSE delete mode 100644 vendor/github.com/docker/spdystream/LICENSE.docs delete mode 100644 vendor/github.com/docker/spdystream/MAINTAINERS delete mode 100644 vendor/github.com/docker/spdystream/README.md delete mode 100644 vendor/github.com/docker/spdystream/handlers.go delete mode 100644 vendor/github.com/docker/spdystream/priority.go delete mode 100644 vendor/github.com/docker/spdystream/spdy/types.go delete mode 100644 vendor/github.com/docker/spdystream/utils.go create mode 100644 vendor/github.com/fsouza/go-dockerclient/.gitattributes create mode 100644 vendor/github.com/fsouza/go-dockerclient/.golangci.yaml delete mode 100644 vendor/github.com/fsouza/go-dockerclient/.travis.yml delete mode 100644 vendor/github.com/fsouza/go-dockerclient/README.markdown create mode 100644 vendor/github.com/fsouza/go-dockerclient/README.md delete mode 100644 vendor/github.com/fsouza/go-dockerclient/appveyor.yml create mode 100644 vendor/github.com/fsouza/go-dockerclient/container_archive.go create mode 100644 vendor/github.com/fsouza/go-dockerclient/container_attach.go create mode 100644 vendor/github.com/fsouza/go-dockerclient/container_changes.go create mode 100644 vendor/github.com/fsouza/go-dockerclient/container_commit.go create mode 100644 vendor/github.com/fsouza/go-dockerclient/container_copy.go create mode 100644 vendor/github.com/fsouza/go-dockerclient/container_create.go create mode 100644 vendor/github.com/fsouza/go-dockerclient/container_export.go create mode 100644 vendor/github.com/fsouza/go-dockerclient/container_inspect.go create mode 100644 vendor/github.com/fsouza/go-dockerclient/container_kill.go create mode 100644 vendor/github.com/fsouza/go-dockerclient/container_list.go create mode 100644 vendor/github.com/fsouza/go-dockerclient/container_logs.go create mode 100644 vendor/github.com/fsouza/go-dockerclient/container_pause.go create mode 100644 vendor/github.com/fsouza/go-dockerclient/container_prune.go create mode 100644 vendor/github.com/fsouza/go-dockerclient/container_remove.go create mode 100644 vendor/github.com/fsouza/go-dockerclient/container_rename.go create mode 100644 vendor/github.com/fsouza/go-dockerclient/container_resize.go create mode 100644 vendor/github.com/fsouza/go-dockerclient/container_restart.go create mode 100644 vendor/github.com/fsouza/go-dockerclient/container_start.go create mode 100644 vendor/github.com/fsouza/go-dockerclient/container_stats.go create mode 100644 vendor/github.com/fsouza/go-dockerclient/container_stop.go create mode 100644 vendor/github.com/fsouza/go-dockerclient/container_top.go create mode 100644 vendor/github.com/fsouza/go-dockerclient/container_unpause.go create mode 100644 vendor/github.com/fsouza/go-dockerclient/container_update.go create mode 100644 vendor/github.com/fsouza/go-dockerclient/container_wait.go create mode 100644 vendor/github.com/fsouza/go-dockerclient/go.mod create mode 100644 vendor/github.com/fsouza/go-dockerclient/go.sum delete mode 100644 vendor/github.com/fsouza/go-dockerclient/node.go create mode 100644 vendor/github.com/fsouza/go-dockerclient/plugin.go create mode 100644 vendor/github.com/fsouza/go-dockerclient/registry_auth.go delete mode 100644 vendor/github.com/fsouza/go-dockerclient/service.go create mode 100644 vendor/github.com/fsouza/go-dockerclient/swarm_configs.go create mode 100644 vendor/github.com/fsouza/go-dockerclient/swarm_node.go create mode 100644 vendor/github.com/fsouza/go-dockerclient/swarm_secrets.go create mode 100644 vendor/github.com/fsouza/go-dockerclient/swarm_service.go create mode 100644 vendor/github.com/fsouza/go-dockerclient/swarm_task.go create mode 100644 vendor/github.com/fsouza/go-dockerclient/system.go delete mode 100644 vendor/github.com/fsouza/go-dockerclient/task.go delete mode 100644 vendor/github.com/getsentry/raven-go/.dockerignore delete mode 100644 vendor/github.com/getsentry/raven-go/.gitignore delete mode 100644 vendor/github.com/getsentry/raven-go/.travis.yml delete mode 100644 vendor/github.com/getsentry/raven-go/Dockerfile.test delete mode 100644 vendor/github.com/getsentry/raven-go/LICENSE delete mode 100644 vendor/github.com/getsentry/raven-go/README.md delete mode 100644 vendor/github.com/getsentry/raven-go/client.go delete mode 100644 vendor/github.com/getsentry/raven-go/errors.go delete mode 100644 vendor/github.com/getsentry/raven-go/exception.go delete mode 100644 vendor/github.com/getsentry/raven-go/http.go delete mode 100644 vendor/github.com/getsentry/raven-go/interfaces.go delete mode 100644 vendor/github.com/getsentry/raven-go/runtests.sh delete mode 100644 vendor/github.com/getsentry/raven-go/stacktrace.go delete mode 100644 vendor/github.com/getsentry/raven-go/writer.go create mode 100644 vendor/github.com/go-errors/errors/.travis.yml create mode 100644 vendor/github.com/go-errors/errors/LICENSE.MIT create mode 100644 vendor/github.com/go-errors/errors/README.md create mode 100644 vendor/github.com/go-errors/errors/cover.out create mode 100644 vendor/github.com/go-errors/errors/error.go create mode 100644 vendor/github.com/go-errors/errors/parse_panic.go create mode 100644 vendor/github.com/go-errors/errors/stackframe.go create mode 100644 vendor/github.com/google/cadvisor/utils/sysfs/sysfs_notx86.go create mode 100644 vendor/github.com/google/cadvisor/utils/sysfs/sysfs_x86.go create mode 100644 vendor/github.com/google/go-cmp/cmp/cmpopts/equate.go create mode 100644 vendor/github.com/google/go-cmp/cmp/cmpopts/ignore.go create mode 100644 vendor/github.com/google/go-cmp/cmp/cmpopts/sort.go create mode 100644 vendor/github.com/google/go-cmp/cmp/cmpopts/struct_filter.go create mode 100644 vendor/github.com/google/go-cmp/cmp/cmpopts/xform.go create mode 100644 vendor/github.com/google/shlex/COPYING create mode 100644 vendor/github.com/google/shlex/README create mode 100644 vendor/github.com/google/shlex/go.mod create mode 100644 vendor/github.com/google/shlex/shlex.go create mode 100644 vendor/github.com/heketi/heketi/client/api/go-client/brick.go delete mode 100644 vendor/github.com/konsorten/go-windows-terminal-sequences/LICENSE delete mode 100644 vendor/github.com/konsorten/go-windows-terminal-sequences/README.md delete mode 100644 vendor/github.com/konsorten/go-windows-terminal-sequences/go.mod delete mode 100644 vendor/github.com/konsorten/go-windows-terminal-sequences/sequences.go delete mode 100644 vendor/github.com/konsorten/go-windows-terminal-sequences/sequences_dummy.go create mode 100644 vendor/github.com/miekg/dns/CODEOWNERS delete mode 100644 vendor/github.com/miekg/dns/Gopkg.lock delete mode 100644 vendor/github.com/miekg/dns/Gopkg.toml create mode 100644 vendor/github.com/miekg/dns/go.mod create mode 100644 vendor/github.com/miekg/dns/go.sum create mode 100644 vendor/github.com/miekg/dns/msg_truncate.go create mode 100644 vendor/github.com/miekg/dns/svcb.go rename vendor/github.com/{docker => moby}/spdystream/CONTRIBUTING.md (100%) create mode 100644 vendor/github.com/moby/spdystream/LICENSE create mode 100644 vendor/github.com/moby/spdystream/MAINTAINERS create mode 100644 vendor/github.com/moby/spdystream/NOTICE create mode 100644 vendor/github.com/moby/spdystream/README.md rename vendor/github.com/{docker => moby}/spdystream/connection.go (95%) create mode 100644 vendor/github.com/moby/spdystream/go.mod create mode 100644 vendor/github.com/moby/spdystream/go.sum create mode 100644 vendor/github.com/moby/spdystream/handlers.go create mode 100644 vendor/github.com/moby/spdystream/priority.go rename vendor/github.com/{docker => moby}/spdystream/spdy/dictionary.go (93%) rename vendor/github.com/{docker => moby}/spdystream/spdy/read.go (94%) create mode 100644 vendor/github.com/moby/spdystream/spdy/types.go rename vendor/github.com/{docker => moby}/spdystream/spdy/write.go (93%) rename vendor/github.com/{docker => moby}/spdystream/stream.go (92%) create mode 100644 vendor/github.com/moby/spdystream/utils.go create mode 100644 vendor/github.com/moby/sys/mount/LICENSE create mode 100644 vendor/github.com/moby/sys/mount/doc.go create mode 100644 vendor/github.com/moby/sys/mount/flags_bsd.go rename vendor/github.com/{docker/docker/pkg => moby/sys}/mount/flags_linux.go (97%) create mode 100644 vendor/github.com/moby/sys/mount/flags_unix.go create mode 100644 vendor/github.com/moby/sys/mount/go.mod create mode 100644 vendor/github.com/moby/sys/mount/go.sum create mode 100644 vendor/github.com/moby/sys/mount/mount_errors.go create mode 100644 vendor/github.com/moby/sys/mount/mount_unix.go create mode 100644 vendor/github.com/moby/sys/mount/mounter_bsd.go rename vendor/github.com/{docker/docker/pkg => moby/sys}/mount/mounter_linux.go (96%) create mode 100644 vendor/github.com/moby/sys/mount/mounter_unsupported.go rename vendor/github.com/{docker/docker/pkg => moby/sys}/mount/sharedsubtree_linux.go (96%) create mode 100644 vendor/github.com/moby/sys/mountinfo/doc.go create mode 100644 vendor/github.com/moby/sys/mountinfo/go.sum create mode 100644 vendor/github.com/moby/sys/mountinfo/mounted_linux.go create mode 100644 vendor/github.com/moby/sys/mountinfo/mounted_unix.go create mode 100644 vendor/github.com/moby/sys/mountinfo/mountinfo_bsd.go delete mode 100644 vendor/github.com/moby/sys/mountinfo/mountinfo_freebsd.go create mode 100644 vendor/github.com/moby/term/README.md create mode 100644 vendor/github.com/moby/term/termios.go delete mode 100644 vendor/github.com/moby/term/termios_linux.go create mode 100644 vendor/github.com/moby/term/termios_nonbsd.go create mode 100644 vendor/github.com/moby/term/windows/doc.go delete mode 100644 vendor/github.com/moby/term/windows/windows.go create mode 100644 vendor/github.com/monochromegane/go-gitignore/.travis.yml create mode 100644 vendor/github.com/monochromegane/go-gitignore/LICENSE create mode 100644 vendor/github.com/monochromegane/go-gitignore/README.md create mode 100644 vendor/github.com/monochromegane/go-gitignore/depth_holder.go create mode 100644 vendor/github.com/monochromegane/go-gitignore/full_scan_patterns.go create mode 100644 vendor/github.com/monochromegane/go-gitignore/gitignore.go create mode 100644 vendor/github.com/monochromegane/go-gitignore/index_scan_patterns.go create mode 100644 vendor/github.com/monochromegane/go-gitignore/initial_holder.go create mode 100644 vendor/github.com/monochromegane/go-gitignore/match.go create mode 100644 vendor/github.com/monochromegane/go-gitignore/pattern.go create mode 100644 vendor/github.com/monochromegane/go-gitignore/patterns.go create mode 100644 vendor/github.com/monochromegane/go-gitignore/util.go create mode 100644 vendor/github.com/mrunalp/fileutils/go.mod delete mode 100644 vendor/github.com/opencontainers/runc/libcontainer/apparmor/apparmor.go delete mode 100644 vendor/github.com/opencontainers/runc/libcontainer/apparmor/apparmor_disabled.go create mode 100644 vendor/github.com/opencontainers/runc/libcontainer/apparmor/apparmor_linux.go create mode 100644 vendor/github.com/opencontainers/runc/libcontainer/apparmor/apparmor_unsupported.go create mode 100644 vendor/github.com/opencontainers/runc/libcontainer/capabilities/capabilities.go create mode 100644 vendor/github.com/opencontainers/runc/libcontainer/capabilities/capabilities_unsupported.go delete mode 100644 vendor/github.com/opencontainers/runc/libcontainer/capabilities_linux.go create mode 100644 vendor/github.com/opencontainers/runc/libcontainer/cgroups/fscommon/open.go create mode 100644 vendor/github.com/opencontainers/runc/libcontainer/cgroups/systemd/cpuset.go delete mode 100644 vendor/github.com/opencontainers/runc/libcontainer/configs/device.go delete mode 100644 vendor/github.com/opencontainers/runc/libcontainer/configs/device_windows.go create mode 100644 vendor/github.com/opencontainers/runc/libcontainer/configs/devices.go create mode 100644 vendor/github.com/opencontainers/runc/libcontainer/devices/device.go rename vendor/github.com/opencontainers/runc/libcontainer/{configs => devices}/device_unix.go (79%) create mode 100644 vendor/github.com/opencontainers/runc/libcontainer/devices/device_windows.go create mode 100644 vendor/github.com/opencontainers/runc/libcontainer/devices/devices.go create mode 100644 vendor/github.com/opencontainers/runc/libcontainer/seccomp/patchbpf/enosys_linux.go create mode 100644 vendor/github.com/opencontainers/runc/libcontainer/seccomp/patchbpf/enosys_unsupported.go create mode 100644 vendor/github.com/opencontainers/selinux/go-selinux/label/label_linux.go delete mode 100644 vendor/github.com/opencontainers/selinux/go-selinux/label/label_selinux.go delete mode 100644 vendor/github.com/opencontainers/selinux/go-selinux/xattrs.go create mode 100644 vendor/github.com/opencontainers/selinux/go-selinux/xattrs_linux.go delete mode 100644 vendor/github.com/openshift/api/apiserver/v1/apiserver.openshift.io_deprecatedapirequests.yaml delete mode 100644 vendor/github.com/openshift/api/apiserver/v1/types_deprecatedapirequest.go create mode 100644 vendor/github.com/openshift/build-machinery-go/make/targets/golang/version.mk delete mode 100644 vendor/github.com/openshift/client-go/apiserver/clientset/versioned/typed/apiserver/v1/deprecatedapirequest.go create mode 100644 vendor/github.com/openshift/library-go/pkg/authorization/hardcodedauthorizer/metrics.go create mode 100644 vendor/github.com/openshift/library-go/pkg/config/client/transport.go delete mode 100644 vendor/github.com/openshift/library-go/pkg/image/dockerv1client/client.go create mode 100644 vendor/github.com/openshift/library-go/pkg/operator/resource/resourceapply/unstructured.go create mode 100644 vendor/github.com/openshift/library-go/pkg/operator/resource/resourceread/admission.go delete mode 100644 vendor/github.com/openshift/library-go/pkg/operator/resource/resourceread/credentialsrequest.go create mode 100644 vendor/github.com/openshift/library-go/pkg/operator/resource/resourceread/route.go create mode 100644 vendor/github.com/openshift/library-go/pkg/operator/resource/resourceread/unstructured.go create mode 100644 vendor/github.com/openshift/library-go/pkg/operator/v1helpers/args.go delete mode 100644 vendor/github.com/openshift/library-go/pkg/serviceability/sentry.go create mode 100644 vendor/github.com/sergi/go-diff/diffmatchpatch/operation_string.go create mode 100644 vendor/github.com/sirupsen/logrus/buffer_pool.go delete mode 100644 vendor/github.com/willf/bitset/Makefile create mode 100644 vendor/github.com/willf/bitset/go.mod rename vendor/github.com/{getsentry/raven-go/.gitmodules => willf/bitset/go.sum} (100%) create mode 100644 vendor/github.com/xlab/treeprint/LICENSE create mode 100644 vendor/github.com/xlab/treeprint/README.md create mode 100644 vendor/github.com/xlab/treeprint/helpers.go create mode 100644 vendor/github.com/xlab/treeprint/struct.go create mode 100644 vendor/github.com/xlab/treeprint/treeprint.go create mode 100644 vendor/go.starlark.net/LICENSE create mode 100644 vendor/go.starlark.net/internal/compile/compile.go create mode 100644 vendor/go.starlark.net/internal/compile/serial.go create mode 100644 vendor/go.starlark.net/internal/spell/spell.go create mode 100644 vendor/go.starlark.net/resolve/binding.go create mode 100644 vendor/go.starlark.net/resolve/resolve.go create mode 100644 vendor/go.starlark.net/starlark/debug.go create mode 100644 vendor/go.starlark.net/starlark/empty.s create mode 100644 vendor/go.starlark.net/starlark/eval.go create mode 100644 vendor/go.starlark.net/starlark/hashtable.go create mode 100644 vendor/go.starlark.net/starlark/int.go create mode 100644 vendor/go.starlark.net/starlark/interp.go create mode 100644 vendor/go.starlark.net/starlark/library.go create mode 100644 vendor/go.starlark.net/starlark/profile.go create mode 100644 vendor/go.starlark.net/starlark/unpack.go create mode 100644 vendor/go.starlark.net/starlark/value.go create mode 100644 vendor/go.starlark.net/starlarkstruct/module.go create mode 100644 vendor/go.starlark.net/starlarkstruct/struct.go create mode 100644 vendor/go.starlark.net/syntax/grammar.txt create mode 100644 vendor/go.starlark.net/syntax/parse.go create mode 100644 vendor/go.starlark.net/syntax/quote.go create mode 100644 vendor/go.starlark.net/syntax/scan.go create mode 100644 vendor/go.starlark.net/syntax/syntax.go create mode 100644 vendor/go.starlark.net/syntax/walk.go delete mode 100644 vendor/golang.org/x/crypto/internal/subtle/aliasing_appengine.go create mode 100644 vendor/golang.org/x/crypto/internal/subtle/aliasing_purego.go delete mode 100644 vendor/golang.org/x/crypto/ssh/terminal/util.go delete mode 100644 vendor/golang.org/x/crypto/ssh/terminal/util_aix.go delete mode 100644 vendor/golang.org/x/crypto/ssh/terminal/util_bsd.go delete mode 100644 vendor/golang.org/x/crypto/ssh/terminal/util_linux.go delete mode 100644 vendor/golang.org/x/crypto/ssh/terminal/util_plan9.go delete mode 100644 vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go delete mode 100644 vendor/golang.org/x/crypto/ssh/terminal/util_windows.go create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_openbsd_mips64.go create mode 100644 vendor/golang.org/x/sys/execabs/execabs.go create mode 100644 vendor/golang.org/x/sys/plan9/asm.s create mode 100644 vendor/golang.org/x/sys/plan9/asm_plan9_386.s create mode 100644 vendor/golang.org/x/sys/plan9/asm_plan9_amd64.s create mode 100644 vendor/golang.org/x/sys/plan9/asm_plan9_arm.s create mode 100644 vendor/golang.org/x/sys/plan9/const_plan9.go create mode 100644 vendor/golang.org/x/sys/plan9/dir_plan9.go create mode 100644 vendor/golang.org/x/sys/plan9/env_plan9.go create mode 100644 vendor/golang.org/x/sys/plan9/errors_plan9.go create mode 100644 vendor/golang.org/x/sys/plan9/mkall.sh create mode 100644 vendor/golang.org/x/sys/plan9/mkerrors.sh create mode 100644 vendor/golang.org/x/sys/plan9/mksysnum_plan9.sh create mode 100644 vendor/golang.org/x/sys/plan9/pwd_go15_plan9.go create mode 100644 vendor/golang.org/x/sys/plan9/pwd_plan9.go create mode 100644 vendor/golang.org/x/sys/plan9/race.go create mode 100644 vendor/golang.org/x/sys/plan9/race0.go create mode 100644 vendor/golang.org/x/sys/plan9/str.go create mode 100644 vendor/golang.org/x/sys/plan9/syscall.go create mode 100644 vendor/golang.org/x/sys/plan9/syscall_plan9.go create mode 100644 vendor/golang.org/x/sys/plan9/zsyscall_plan9_386.go create mode 100644 vendor/golang.org/x/sys/plan9/zsyscall_plan9_amd64.go create mode 100644 vendor/golang.org/x/sys/plan9/zsyscall_plan9_arm.go create mode 100644 vendor/golang.org/x/sys/plan9/zsysnum_plan9.go create mode 100644 vendor/golang.org/x/sys/unix/asm_zos_s390x.s create mode 100644 vendor/golang.org/x/sys/unix/dev_zos.go create mode 100644 vendor/golang.org/x/sys/unix/epoll_zos.go create mode 100644 vendor/golang.org/x/sys/unix/fstatfs_zos.go create mode 100644 vendor/golang.org/x/sys/unix/ioctl_zos.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_zos_s390x.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_zos_s390x.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_zos_s390x.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_zos_s390x.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_zos_s390x.go delete mode 100644 vendor/golang.org/x/sys/windows/svc/sys_386.s delete mode 100644 vendor/golang.org/x/sys/windows/svc/sys_amd64.s delete mode 100644 vendor/golang.org/x/sys/windows/svc/sys_arm.s create mode 100644 vendor/golang.org/x/sys/windows/svc/sys_windows_386.s create mode 100644 vendor/golang.org/x/sys/windows/svc/sys_windows_amd64.s create mode 100644 vendor/golang.org/x/sys/windows/svc/sys_windows_arm.s create mode 100644 vendor/golang.org/x/sys/windows/svc/sys_windows_arm64.s create mode 100644 vendor/golang.org/x/sys/windows/types_windows_arm64.go create mode 100644 vendor/golang.org/x/term/AUTHORS create mode 100644 vendor/golang.org/x/term/CONTRIBUTING.md create mode 100644 vendor/golang.org/x/term/CONTRIBUTORS create mode 100644 vendor/golang.org/x/term/LICENSE create mode 100644 vendor/golang.org/x/term/PATENTS create mode 100644 vendor/golang.org/x/term/README.md create mode 100644 vendor/golang.org/x/term/go.mod create mode 100644 vendor/golang.org/x/term/go.sum create mode 100644 vendor/golang.org/x/term/term.go create mode 100644 vendor/golang.org/x/term/term_plan9.go create mode 100644 vendor/golang.org/x/term/term_solaris.go create mode 100644 vendor/golang.org/x/term/term_unix.go create mode 100644 vendor/golang.org/x/term/term_unix_aix.go create mode 100644 vendor/golang.org/x/term/term_unix_bsd.go create mode 100644 vendor/golang.org/x/term/term_unix_linux.go create mode 100644 vendor/golang.org/x/term/term_unix_zos.go create mode 100644 vendor/golang.org/x/term/term_unsupported.go create mode 100644 vendor/golang.org/x/term/term_windows.go rename vendor/golang.org/x/{crypto/ssh/terminal => term}/terminal.go (99%) create mode 100644 vendor/golang.org/x/xerrors/LICENSE create mode 100644 vendor/golang.org/x/xerrors/PATENTS create mode 100644 vendor/golang.org/x/xerrors/README create mode 100644 vendor/golang.org/x/xerrors/adaptor.go create mode 100644 vendor/golang.org/x/xerrors/codereview.cfg create mode 100644 vendor/golang.org/x/xerrors/doc.go create mode 100644 vendor/golang.org/x/xerrors/errors.go create mode 100644 vendor/golang.org/x/xerrors/fmt.go create mode 100644 vendor/golang.org/x/xerrors/format.go create mode 100644 vendor/golang.org/x/xerrors/frame.go create mode 100644 vendor/golang.org/x/xerrors/go.mod create mode 100644 vendor/golang.org/x/xerrors/internal/internal.go create mode 100644 vendor/golang.org/x/xerrors/wrap.go delete mode 100644 vendor/k8s.io/api/admission/v1/BUILD delete mode 100644 vendor/k8s.io/api/admission/v1beta1/BUILD delete mode 100644 vendor/k8s.io/api/admissionregistration/v1/BUILD delete mode 100644 vendor/k8s.io/api/admissionregistration/v1beta1/BUILD delete mode 100644 vendor/k8s.io/api/apiserverinternal/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/api/apps/v1/BUILD delete mode 100644 vendor/k8s.io/api/apps/v1beta1/BUILD delete mode 100644 vendor/k8s.io/api/apps/v1beta2/BUILD delete mode 100644 vendor/k8s.io/api/authentication/v1/BUILD delete mode 100644 vendor/k8s.io/api/authentication/v1beta1/BUILD delete mode 100644 vendor/k8s.io/api/authorization/v1/BUILD delete mode 100644 vendor/k8s.io/api/authorization/v1beta1/BUILD delete mode 100644 vendor/k8s.io/api/autoscaling/v1/BUILD delete mode 100644 vendor/k8s.io/api/autoscaling/v2beta1/BUILD delete mode 100644 vendor/k8s.io/api/autoscaling/v2beta2/BUILD delete mode 100644 vendor/k8s.io/api/batch/v1/BUILD delete mode 100644 vendor/k8s.io/api/batch/v1beta1/BUILD delete mode 100644 vendor/k8s.io/api/batch/v2alpha1/BUILD delete mode 100644 vendor/k8s.io/api/batch/v2alpha1/doc.go delete mode 100644 vendor/k8s.io/api/batch/v2alpha1/generated.pb.go delete mode 100644 vendor/k8s.io/api/batch/v2alpha1/generated.proto delete mode 100644 vendor/k8s.io/api/batch/v2alpha1/register.go delete mode 100644 vendor/k8s.io/api/batch/v2alpha1/types.go delete mode 100644 vendor/k8s.io/api/batch/v2alpha1/types_swagger_doc_generated.go delete mode 100644 vendor/k8s.io/api/batch/v2alpha1/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/api/certificates/v1/BUILD delete mode 100644 vendor/k8s.io/api/certificates/v1beta1/BUILD delete mode 100644 vendor/k8s.io/api/coordination/v1/BUILD delete mode 100644 vendor/k8s.io/api/coordination/v1beta1/BUILD delete mode 100644 vendor/k8s.io/api/core/v1/BUILD create mode 100644 vendor/k8s.io/api/discovery/v1/doc.go create mode 100644 vendor/k8s.io/api/discovery/v1/generated.pb.go create mode 100644 vendor/k8s.io/api/discovery/v1/generated.proto create mode 100644 vendor/k8s.io/api/discovery/v1/register.go create mode 100644 vendor/k8s.io/api/discovery/v1/types.go create mode 100644 vendor/k8s.io/api/discovery/v1/types_swagger_doc_generated.go rename vendor/k8s.io/api/discovery/{v1alpha1 => v1}/well_known_labels.go (81%) create mode 100644 vendor/k8s.io/api/discovery/v1/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/api/discovery/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/api/discovery/v1alpha1/doc.go delete mode 100644 vendor/k8s.io/api/discovery/v1alpha1/generated.pb.go delete mode 100644 vendor/k8s.io/api/discovery/v1alpha1/generated.proto delete mode 100644 vendor/k8s.io/api/discovery/v1alpha1/register.go delete mode 100644 vendor/k8s.io/api/discovery/v1alpha1/types.go delete mode 100644 vendor/k8s.io/api/discovery/v1alpha1/types_swagger_doc_generated.go delete mode 100644 vendor/k8s.io/api/discovery/v1alpha1/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/api/discovery/v1beta1/BUILD delete mode 100644 vendor/k8s.io/api/events/v1/BUILD delete mode 100644 vendor/k8s.io/api/events/v1beta1/BUILD delete mode 100644 vendor/k8s.io/api/extensions/v1beta1/BUILD delete mode 100644 vendor/k8s.io/api/flowcontrol/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/api/flowcontrol/v1beta1/BUILD delete mode 100644 vendor/k8s.io/api/imagepolicy/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/api/networking/v1/BUILD delete mode 100644 vendor/k8s.io/api/networking/v1beta1/BUILD delete mode 100644 vendor/k8s.io/api/node/v1/BUILD delete mode 100644 vendor/k8s.io/api/node/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/api/node/v1beta1/BUILD create mode 100644 vendor/k8s.io/api/policy/v1/doc.go create mode 100644 vendor/k8s.io/api/policy/v1/generated.pb.go create mode 100644 vendor/k8s.io/api/policy/v1/generated.proto create mode 100644 vendor/k8s.io/api/policy/v1/register.go create mode 100644 vendor/k8s.io/api/policy/v1/types.go create mode 100644 vendor/k8s.io/api/policy/v1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/policy/v1/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/api/policy/v1beta1/BUILD delete mode 100644 vendor/k8s.io/api/rbac/v1/BUILD delete mode 100644 vendor/k8s.io/api/rbac/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/api/rbac/v1beta1/BUILD delete mode 100644 vendor/k8s.io/api/scheduling/v1/BUILD delete mode 100644 vendor/k8s.io/api/scheduling/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/api/scheduling/v1beta1/BUILD delete mode 100644 vendor/k8s.io/api/storage/v1/BUILD delete mode 100644 vendor/k8s.io/api/storage/v1alpha1/BUILD create mode 100644 vendor/k8s.io/api/storage/v1alpha1/zz_generated.prerelease-lifecycle.go delete mode 100644 vendor/k8s.io/api/storage/v1beta1/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/apihelpers/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/conversion/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/defaulting/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/listtype/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/objectmeta/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/pruning/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/validation/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1beta1/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/internalinterfaces/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1beta1/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/cmd/server/options/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/cmd/server/testing/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/controller/apiapproval/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/controller/establish/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/controller/finalizer/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/controller/nonstructuralschema/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/controller/openapi/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/controller/openapi/builder/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/controller/openapi/v2/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/controller/status/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/crdserverscheme/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/generated/openapi/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/tableconvertor/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/test/integration/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/test/integration/fixtures/BUILD create mode 100644 vendor/k8s.io/apiextensions-apiserver/test/integration/fixtures/etcd.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/apitesting/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/equality/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/errors/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/meta/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/meta/table/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/resource/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/validation/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/validation/path/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/scheme/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/validation/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructuredscheme/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/validation/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/validation/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/conversion/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/conversion/queryparams/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/fields/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/labels/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/schema/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/json/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/protobuf/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/recognizer/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/streaming/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/versioning/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/selection/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/types/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/cache/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/clock/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/diff/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/duration/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/errors/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/framer/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/httpstream/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/intstr/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/json/BUILD create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/extract.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/mergepatch/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/naming/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/net/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/proxy/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/rand/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/remotecommand/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/runtime/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/sets/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/strategicpatch/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/uuid/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/validation/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/validation/field/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/version/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/wait/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/waitgroup/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/yaml/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/version/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/watch/BUILD delete mode 100644 vendor/k8s.io/apimachinery/third_party/forked/golang/json/BUILD delete mode 100644 vendor/k8s.io/apimachinery/third_party/forked/golang/netutil/BUILD delete mode 100644 vendor/k8s.io/apimachinery/third_party/forked/golang/reflect/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/admission/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/admission/configuration/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/admission/initializer/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/admission/metrics/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/admission/plugin/namespace/lifecycle/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/admission/plugin/resourcequota/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/install/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1beta1/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/validation/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/v1/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/errors/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/generic/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/initializer/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/mutating/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/namespace/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/object/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/request/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/rules/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/validating/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/apis/apiserver/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/apis/apiserver/install/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/apis/apiserver/v1/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/apis/apiserver/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/apis/apiserver/v1beta1/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/apis/audit/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/apis/audit/install/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/apis/audit/v1/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/BUILD create mode 100644 vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/zz_generated.prerelease-lifecycle.go delete mode 100644 vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/BUILD create mode 100644 vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/zz_generated.prerelease-lifecycle.go delete mode 100644 vendor/k8s.io/apiserver/pkg/apis/audit/validation/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/apis/config/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/apis/config/v1/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/apis/config/validation/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/apis/flowcontrol/bootstrap/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/audit/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/audit/policy/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/authentication/authenticator/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/authentication/authenticatorfactory/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/authentication/group/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/authentication/request/anonymous/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/authentication/request/bearertoken/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/authentication/request/headerrequest/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/authentication/request/union/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/authentication/request/websocket/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/authentication/request/x509/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/authentication/serviceaccount/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/authentication/token/cache/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/authentication/token/tokenfile/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/authentication/token/union/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/authentication/user/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/authorization/authorizer/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/authorization/authorizerfactory/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/authorization/path/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/authorization/union/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/endpoints/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/endpoints/deprecation/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/endpoints/discovery/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/endpoints/filterlatency/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/endpoints/filters/BUILD create mode 100644 vendor/k8s.io/apiserver/pkg/endpoints/filters/with_auditid.go delete mode 100644 vendor/k8s.io/apiserver/pkg/endpoints/handlers/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/BUILD create mode 100644 vendor/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/admission.go delete mode 100644 vendor/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/internal/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/endpoints/handlers/negotiation/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters/BUILD create mode 100644 vendor/k8s.io/apiserver/pkg/endpoints/handlers/trace_util.go delete mode 100644 vendor/k8s.io/apiserver/pkg/endpoints/metrics/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/endpoints/openapi/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/endpoints/openapi/OWNERS delete mode 100644 vendor/k8s.io/apiserver/pkg/endpoints/request/BUILD create mode 100644 vendor/k8s.io/apiserver/pkg/endpoints/request/auditid.go delete mode 100644 vendor/k8s.io/apiserver/pkg/endpoints/warning/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/features/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/quota/v1/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/quota/v1/generic/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/registry/generic/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/registry/generic/registry/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/registry/generic/rest/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/registry/rest/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/registry/rest/export.go delete mode 100644 vendor/k8s.io/apiserver/pkg/server/BUILD create mode 100644 vendor/k8s.io/apiserver/pkg/server/deleted_kinds.go delete mode 100644 vendor/k8s.io/apiserver/pkg/server/dynamiccertificates/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/server/egressselector/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/server/egressselector/metrics/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/server/filters/BUILD create mode 100644 vendor/k8s.io/apiserver/pkg/server/filters/hsts.go delete mode 100644 vendor/k8s.io/apiserver/pkg/server/healthz/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/server/httplog/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/server/mux/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/server/options/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/server/options/encryptionconfig/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/server/resourceconfig/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/server/routes/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/server/storage/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/storage/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/storage/cacher/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/storage/errors/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/storage/etcd3/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/storage/etcd3/metrics/BUILD create mode 100644 vendor/k8s.io/apiserver/pkg/storage/etcd3/metrics/OWNERS delete mode 100644 vendor/k8s.io/apiserver/pkg/storage/etcd3/preflight/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/storage/etcd3/testing/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/storage/etcd3/testing/testingcert/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/storage/names/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/storage/storagebackend/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/storage/storagebackend/factory/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/storage/value/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/storage/value/encrypt/aes/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/storage/value/encrypt/envelope/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/storage/value/encrypt/envelope/v1beta1/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/storage/value/encrypt/identity/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/storage/value/encrypt/secretbox/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/storageversion/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/util/apihelpers/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/util/dryrun/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/util/feature/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/util/flowcontrol/BUILD create mode 100644 vendor/k8s.io/apiserver/pkg/util/flowcontrol/OWNERS delete mode 100644 vendor/k8s.io/apiserver/pkg/util/flowcontrol/counter/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/util/flowcontrol/debug/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing/promise/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing/promise/lockingpromise/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing/queueset/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/util/flowcontrol/format/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/util/flowcontrol/metrics/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/util/flushwriter/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/util/openapi/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/util/proxy/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/util/shufflesharding/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/util/webhook/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/util/wsstream/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/warning/BUILD delete mode 100644 vendor/k8s.io/apiserver/plugin/pkg/audit/buffered/BUILD delete mode 100644 vendor/k8s.io/apiserver/plugin/pkg/audit/log/BUILD delete mode 100644 vendor/k8s.io/apiserver/plugin/pkg/audit/truncate/BUILD delete mode 100644 vendor/k8s.io/apiserver/plugin/pkg/audit/webhook/BUILD delete mode 100644 vendor/k8s.io/apiserver/plugin/pkg/authenticator/token/oidc/BUILD delete mode 100644 vendor/k8s.io/apiserver/plugin/pkg/authenticator/token/webhook/BUILD delete mode 100644 vendor/k8s.io/apiserver/plugin/pkg/authorizer/webhook/BUILD delete mode 100644 vendor/k8s.io/cli-runtime/pkg/genericclioptions/BUILD create mode 100644 vendor/k8s.io/cli-runtime/pkg/genericclioptions/command_headers.go delete mode 100644 vendor/k8s.io/cli-runtime/pkg/kustomize/BUILD delete mode 100644 vendor/k8s.io/cli-runtime/pkg/kustomize/builder.go delete mode 100644 vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/BUILD delete mode 100644 vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/configmapandsecret/BUILD delete mode 100644 vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/configmapandsecret/configmapfactory.go delete mode 100644 vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/configmapandsecret/kv.go delete mode 100644 vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/configmapandsecret/secretfactory.go delete mode 100644 vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/doc.go delete mode 100644 vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/factory.go delete mode 100644 vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kunstruct/BUILD delete mode 100644 vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kunstruct/factory.go delete mode 100644 vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kunstruct/helper.go delete mode 100644 vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kunstruct/kunstruct.go delete mode 100644 vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kv/BUILD delete mode 100644 vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kv/kv.go delete mode 100644 vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/BUILD delete mode 100644 vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/factory.go delete mode 100644 vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/hash/BUILD delete mode 100644 vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/hash/hash.go delete mode 100644 vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/hash/namehash.go delete mode 100644 vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/patch/BUILD delete mode 100644 vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/patch/patch.go delete mode 100644 vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/patch/patchconflictdetector.go delete mode 100644 vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/validator/BUILD delete mode 100644 vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/validator/validators.go delete mode 100644 vendor/k8s.io/cli-runtime/pkg/printers/BUILD create mode 100644 vendor/k8s.io/cli-runtime/pkg/printers/managedfields.go delete mode 100644 vendor/k8s.io/cli-runtime/pkg/resource/BUILD create mode 100644 vendor/k8s.io/cli-runtime/pkg/resource/kustomizevisitor.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1/mutatingwebhook.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1/mutatingwebhookconfiguration.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1/rule.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1/rulewithoperations.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1/servicereference.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1/validatingwebhook.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1/validatingwebhookconfiguration.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1/webhookclientconfig.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/mutatingwebhook.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/mutatingwebhookconfiguration.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/rule.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/rulewithoperations.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/servicereference.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/validatingwebhook.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/validatingwebhookconfiguration.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/webhookclientconfig.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apiserverinternal/v1alpha1/serverstorageversion.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apiserverinternal/v1alpha1/storageversion.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apiserverinternal/v1alpha1/storageversioncondition.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apiserverinternal/v1alpha1/storageversionstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1/controllerrevision.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1/daemonset.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1/daemonsetcondition.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1/daemonsetspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1/daemonsetstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1/daemonsetupdatestrategy.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1/deployment.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1/deploymentcondition.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1/deploymentspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1/deploymentstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1/deploymentstrategy.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1/replicaset.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1/replicasetcondition.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1/replicasetspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1/replicasetstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1/rollingupdatedaemonset.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1/rollingupdatedeployment.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1/rollingupdatestatefulsetstrategy.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1/statefulset.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1/statefulsetcondition.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1/statefulsetspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1/statefulsetstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1/statefulsetupdatestrategy.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/controllerrevision.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/deployment.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/deploymentcondition.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/deploymentspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/deploymentstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/deploymentstrategy.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/rollbackconfig.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/rollingupdatedeployment.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/rollingupdatestatefulsetstrategy.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/statefulset.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/statefulsetcondition.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/statefulsetspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/statefulsetstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/statefulsetupdatestrategy.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/controllerrevision.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/daemonset.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/daemonsetcondition.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/daemonsetspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/daemonsetstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/daemonsetupdatestrategy.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/deployment.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/deploymentcondition.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/deploymentspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/deploymentstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/deploymentstrategy.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/replicaset.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/replicasetcondition.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/replicasetspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/replicasetstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/rollingupdatedaemonset.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/rollingupdatedeployment.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/rollingupdatestatefulsetstrategy.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/statefulset.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/statefulsetcondition.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/statefulsetspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/statefulsetstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/statefulsetupdatestrategy.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v1/crossversionobjectreference.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v1/horizontalpodautoscaler.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v1/horizontalpodautoscalerspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v1/horizontalpodautoscalerstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/containerresourcemetricsource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/containerresourcemetricstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/crossversionobjectreference.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/externalmetricsource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/externalmetricstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/horizontalpodautoscaler.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/horizontalpodautoscalercondition.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/horizontalpodautoscalerspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/horizontalpodautoscalerstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/metricspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/metricstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/objectmetricsource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/objectmetricstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/podsmetricsource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/podsmetricstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/resourcemetricsource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/resourcemetricstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/containerresourcemetricsource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/containerresourcemetricstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/crossversionobjectreference.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/externalmetricsource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/externalmetricstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/horizontalpodautoscaler.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/horizontalpodautoscalerbehavior.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/horizontalpodautoscalercondition.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/horizontalpodautoscalerspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/horizontalpodautoscalerstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/hpascalingpolicy.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/hpascalingrules.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/metricidentifier.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/metricspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/metricstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/metrictarget.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/metricvaluestatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/objectmetricsource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/objectmetricstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/podsmetricsource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/podsmetricstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/resourcemetricsource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/resourcemetricstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/batch/v1/cronjob.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/batch/v1/cronjobspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/batch/v1/cronjobstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/batch/v1/job.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/batch/v1/jobcondition.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/batch/v1/jobspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/batch/v1/jobstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/batch/v1/jobtemplatespec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/batch/v1beta1/cronjob.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/batch/v1beta1/cronjobspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/batch/v1beta1/cronjobstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/batch/v1beta1/jobtemplatespec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/certificates/v1/certificatesigningrequest.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/certificates/v1/certificatesigningrequestcondition.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/certificates/v1/certificatesigningrequestspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/certificates/v1/certificatesigningrequeststatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/certificates/v1beta1/certificatesigningrequest.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/certificates/v1beta1/certificatesigningrequestcondition.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/certificates/v1beta1/certificatesigningrequestspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/certificates/v1beta1/certificatesigningrequeststatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/coordination/v1/lease.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/coordination/v1/leasespec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/coordination/v1beta1/lease.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/coordination/v1beta1/leasespec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/affinity.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/attachedvolume.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/awselasticblockstorevolumesource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/azurediskvolumesource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/azurefilepersistentvolumesource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/azurefilevolumesource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/capabilities.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/cephfspersistentvolumesource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/cephfsvolumesource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/cinderpersistentvolumesource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/cindervolumesource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/clientipconfig.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/componentcondition.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/componentstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/configmap.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/configmapenvsource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/configmapkeyselector.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/configmapnodeconfigsource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/configmapprojection.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/configmapvolumesource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/container.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/containerimage.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/containerport.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/containerstate.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/containerstaterunning.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/containerstateterminated.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/containerstatewaiting.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/containerstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/csipersistentvolumesource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/csivolumesource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/daemonendpoint.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/downwardapiprojection.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/downwardapivolumefile.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/downwardapivolumesource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/emptydirvolumesource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/endpointaddress.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/endpointport.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/endpoints.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/endpointsubset.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/envfromsource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/envvar.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/envvarsource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/ephemeralcontainer.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/ephemeralcontainercommon.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/ephemeralvolumesource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/event.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/eventseries.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/eventsource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/execaction.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/fcvolumesource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/flexpersistentvolumesource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/flexvolumesource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/flockervolumesource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/gcepersistentdiskvolumesource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/gitrepovolumesource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/glusterfspersistentvolumesource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/glusterfsvolumesource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/handler.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/hostalias.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/hostpathvolumesource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/httpgetaction.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/httpheader.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/iscsipersistentvolumesource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/iscsivolumesource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/keytopath.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/lifecycle.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/limitrange.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/limitrangeitem.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/limitrangespec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/loadbalanceringress.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/loadbalancerstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/localobjectreference.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/localvolumesource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/namespace.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/namespacecondition.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/namespacespec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/namespacestatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/nfsvolumesource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/node.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/nodeaddress.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/nodeaffinity.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/nodecondition.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/nodeconfigsource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/nodeconfigstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/nodedaemonendpoints.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/nodeselector.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/nodeselectorrequirement.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/nodeselectorterm.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/nodespec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/nodestatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/nodesysteminfo.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/objectfieldselector.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/objectreference.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolume.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumeclaim.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumeclaimcondition.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumeclaimspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumeclaimstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumeclaimtemplate.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumeclaimvolumesource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumesource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumespec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumestatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/photonpersistentdiskvolumesource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/pod.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/podaffinity.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/podaffinityterm.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/podantiaffinity.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/podcondition.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/poddnsconfig.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/poddnsconfigoption.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/podip.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/podreadinessgate.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/podsecuritycontext.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/podspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/podstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/podtemplate.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/podtemplatespec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/portstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/portworxvolumesource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/preferredschedulingterm.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/probe.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/projectedvolumesource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/quobytevolumesource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/rbdpersistentvolumesource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/rbdvolumesource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/replicationcontroller.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/replicationcontrollercondition.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/replicationcontrollerspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/replicationcontrollerstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/resourcefieldselector.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/resourcequota.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/resourcequotaspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/resourcequotastatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/resourcerequirements.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/scaleiopersistentvolumesource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/scaleiovolumesource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/scopedresourceselectorrequirement.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/scopeselector.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/seccompprofile.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/secret.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/secretenvsource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/secretkeyselector.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/secretprojection.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/secretreference.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/secretvolumesource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/securitycontext.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/selinuxoptions.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/service.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/serviceaccount.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/serviceaccounttokenprojection.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/serviceport.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/servicespec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/servicestatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/sessionaffinityconfig.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/storageospersistentvolumesource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/storageosvolumesource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/sysctl.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/taint.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/tcpsocketaction.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/toleration.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/topologyselectorlabelrequirement.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/topologyselectorterm.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/topologyspreadconstraint.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/typedlocalobjectreference.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/volume.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/volumedevice.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/volumemount.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/volumenodeaffinity.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/volumeprojection.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/volumesource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/vspherevirtualdiskvolumesource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/weightedpodaffinityterm.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/windowssecuritycontextoptions.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/discovery/v1/endpoint.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/discovery/v1/endpointconditions.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/discovery/v1/endpointhints.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/discovery/v1/endpointport.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/discovery/v1/endpointslice.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/discovery/v1/forzone.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/discovery/v1beta1/endpoint.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/discovery/v1beta1/endpointconditions.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/discovery/v1beta1/endpointhints.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/discovery/v1beta1/endpointport.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/discovery/v1beta1/endpointslice.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/discovery/v1beta1/forzone.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/events/v1/event.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/events/v1/eventseries.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/events/v1beta1/event.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/events/v1beta1/eventseries.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/allowedcsidriver.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/allowedflexvolume.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/allowedhostpath.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/daemonset.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/daemonsetcondition.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/daemonsetspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/daemonsetstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/daemonsetupdatestrategy.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/deployment.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/deploymentcondition.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/deploymentspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/deploymentstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/deploymentstrategy.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/fsgroupstrategyoptions.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/hostportrange.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/httpingresspath.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/httpingressrulevalue.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/idrange.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/ingress.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/ingressbackend.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/ingressrule.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/ingressrulevalue.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/ingressspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/ingressstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/ingresstls.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/ipblock.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/networkpolicy.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/networkpolicyegressrule.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/networkpolicyingressrule.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/networkpolicypeer.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/networkpolicyport.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/networkpolicyspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/podsecuritypolicy.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/podsecuritypolicyspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/replicaset.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/replicasetcondition.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/replicasetspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/replicasetstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/rollbackconfig.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/rollingupdatedaemonset.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/rollingupdatedeployment.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/runasgroupstrategyoptions.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/runasuserstrategyoptions.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/runtimeclassstrategyoptions.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/selinuxstrategyoptions.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/supplementalgroupsstrategyoptions.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/flowdistinguishermethod.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/flowschema.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/flowschemacondition.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/flowschemaspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/flowschemastatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/groupsubject.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/limitedprioritylevelconfiguration.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/limitresponse.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/nonresourcepolicyrule.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/policyruleswithsubjects.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/prioritylevelconfiguration.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/prioritylevelconfigurationcondition.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/prioritylevelconfigurationreference.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/prioritylevelconfigurationspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/prioritylevelconfigurationstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/queuingconfiguration.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/resourcepolicyrule.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/serviceaccountsubject.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/subject.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/usersubject.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/flowdistinguishermethod.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/flowschema.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/flowschemacondition.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/flowschemaspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/flowschemastatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/groupsubject.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/limitedprioritylevelconfiguration.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/limitresponse.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/nonresourcepolicyrule.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/policyruleswithsubjects.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/prioritylevelconfiguration.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/prioritylevelconfigurationcondition.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/prioritylevelconfigurationreference.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/prioritylevelconfigurationspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/prioritylevelconfigurationstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/queuingconfiguration.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/resourcepolicyrule.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/serviceaccountsubject.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/subject.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/usersubject.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/internal/internal.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/meta/v1/condition.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/meta/v1/deleteoptions.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/meta/v1/labelselector.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/meta/v1/labelselectorrequirement.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/meta/v1/managedfieldsentry.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/meta/v1/objectmeta.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/meta/v1/ownerreference.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/meta/v1/preconditions.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/meta/v1/typemeta.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1/httpingresspath.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1/httpingressrulevalue.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingress.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingressbackend.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingressclass.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingressclassparametersreference.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingressclassspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingressrule.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingressrulevalue.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingressservicebackend.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingressspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingressstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingresstls.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1/ipblock.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1/networkpolicy.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1/networkpolicyegressrule.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1/networkpolicyingressrule.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1/networkpolicypeer.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1/networkpolicyport.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1/networkpolicyspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1/servicebackendport.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/httpingresspath.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/httpingressrulevalue.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/ingress.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/ingressbackend.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/ingressclass.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/ingressclassparametersreference.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/ingressclassspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/ingressrule.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/ingressrulevalue.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/ingressspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/ingressstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/ingresstls.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/node/v1/overhead.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/node/v1/runtimeclass.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/node/v1/scheduling.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/node/v1alpha1/overhead.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/node/v1alpha1/runtimeclass.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/node/v1alpha1/runtimeclassspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/node/v1alpha1/scheduling.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/node/v1beta1/overhead.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/node/v1beta1/runtimeclass.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/node/v1beta1/scheduling.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/policy/v1/poddisruptionbudget.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/policy/v1/poddisruptionbudgetspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/policy/v1/poddisruptionbudgetstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/allowedcsidriver.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/allowedflexvolume.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/allowedhostpath.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/eviction.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/fsgroupstrategyoptions.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/hostportrange.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/idrange.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/poddisruptionbudget.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/poddisruptionbudgetspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/poddisruptionbudgetstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/podsecuritypolicy.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/podsecuritypolicyspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/runasgroupstrategyoptions.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/runasuserstrategyoptions.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/runtimeclassstrategyoptions.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/selinuxstrategyoptions.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/supplementalgroupsstrategyoptions.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/rbac/v1/aggregationrule.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/rbac/v1/clusterrole.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/rbac/v1/clusterrolebinding.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/rbac/v1/policyrule.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/rbac/v1/role.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/rbac/v1/rolebinding.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/rbac/v1/roleref.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/rbac/v1/subject.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/rbac/v1alpha1/aggregationrule.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/rbac/v1alpha1/clusterrole.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/rbac/v1alpha1/clusterrolebinding.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/rbac/v1alpha1/policyrule.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/rbac/v1alpha1/role.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/rbac/v1alpha1/rolebinding.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/rbac/v1alpha1/roleref.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/rbac/v1alpha1/subject.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/rbac/v1beta1/aggregationrule.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/rbac/v1beta1/clusterrole.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/rbac/v1beta1/clusterrolebinding.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/rbac/v1beta1/policyrule.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/rbac/v1beta1/role.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/rbac/v1beta1/rolebinding.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/rbac/v1beta1/roleref.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/rbac/v1beta1/subject.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/scheduling/v1/priorityclass.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/scheduling/v1alpha1/priorityclass.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/scheduling/v1beta1/priorityclass.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/storage/v1/csidriver.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/storage/v1/csidriverspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/storage/v1/csinode.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/storage/v1/csinodedriver.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/storage/v1/csinodespec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/storage/v1/storageclass.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/storage/v1/tokenrequest.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/storage/v1/volumeattachment.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/storage/v1/volumeattachmentsource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/storage/v1/volumeattachmentspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/storage/v1/volumeattachmentstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/storage/v1/volumeerror.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/storage/v1/volumenoderesources.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/storage/v1alpha1/csistoragecapacity.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/storage/v1alpha1/volumeattachment.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/storage/v1alpha1/volumeattachmentsource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/storage/v1alpha1/volumeattachmentspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/storage/v1alpha1/volumeattachmentstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/storage/v1alpha1/volumeerror.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/csidriver.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/csidriverspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/csinode.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/csinodedriver.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/csinodespec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/csistoragecapacity.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/storageclass.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/tokenrequest.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/volumeattachment.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/volumeattachmentsource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/volumeattachmentspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/volumeattachmentstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/volumeerror.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/volumenoderesources.go delete mode 100644 vendor/k8s.io/client-go/discovery/BUILD delete mode 100644 vendor/k8s.io/client-go/discovery/cached/BUILD delete mode 100644 vendor/k8s.io/client-go/discovery/cached/disk/BUILD delete mode 100644 vendor/k8s.io/client-go/discovery/cached/memory/BUILD delete mode 100644 vendor/k8s.io/client-go/discovery/fake/BUILD delete mode 100644 vendor/k8s.io/client-go/dynamic/BUILD delete mode 100644 vendor/k8s.io/client-go/dynamic/dynamicinformer/BUILD delete mode 100644 vendor/k8s.io/client-go/dynamic/dynamiclister/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/admissionregistration/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/admissionregistration/v1/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/admissionregistration/v1beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/apiserverinternal/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/apiserverinternal/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/apps/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/apps/v1/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/apps/v1beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/apps/v1beta2/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/autoscaling/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/autoscaling/v1/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/autoscaling/v2beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/autoscaling/v2beta2/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/batch/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/batch/v1/BUILD create mode 100644 vendor/k8s.io/client-go/informers/batch/v1/cronjob.go delete mode 100644 vendor/k8s.io/client-go/informers/batch/v1beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/batch/v2alpha1/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/batch/v2alpha1/cronjob.go delete mode 100644 vendor/k8s.io/client-go/informers/batch/v2alpha1/interface.go delete mode 100644 vendor/k8s.io/client-go/informers/certificates/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/certificates/v1/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/certificates/v1beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/coordination/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/coordination/v1/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/coordination/v1beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/core/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/core/v1/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/discovery/BUILD create mode 100644 vendor/k8s.io/client-go/informers/discovery/v1/endpointslice.go create mode 100644 vendor/k8s.io/client-go/informers/discovery/v1/interface.go delete mode 100644 vendor/k8s.io/client-go/informers/discovery/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/discovery/v1alpha1/endpointslice.go delete mode 100644 vendor/k8s.io/client-go/informers/discovery/v1alpha1/interface.go delete mode 100644 vendor/k8s.io/client-go/informers/discovery/v1beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/events/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/events/v1/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/events/v1beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/extensions/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/extensions/v1beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/flowcontrol/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/flowcontrol/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/flowcontrol/v1beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/internalinterfaces/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/networking/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/networking/v1/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/networking/v1beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/node/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/node/v1/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/node/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/node/v1beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/policy/BUILD create mode 100644 vendor/k8s.io/client-go/informers/policy/v1/interface.go create mode 100644 vendor/k8s.io/client-go/informers/policy/v1/poddisruptionbudget.go delete mode 100644 vendor/k8s.io/client-go/informers/policy/v1beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/rbac/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/rbac/v1/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/rbac/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/rbac/v1beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/scheduling/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/scheduling/v1/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/scheduling/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/scheduling/v1beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/storage/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/storage/v1/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/storage/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/client-go/informers/storage/v1beta1/BUILD create mode 100644 vendor/k8s.io/client-go/informers/storage/v1beta1/csistoragecapacity.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/fake/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/scheme/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1/fake/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/fake/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apiserverinternal/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apiserverinternal/v1alpha1/fake/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/fake/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/fake/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/fake/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/fake/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/fake/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/fake/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/fake/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/batch/v1/BUILD create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/batch/v1/cronjob.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/batch/v1/fake/BUILD create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/batch/v1/fake/fake_cronjob.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/fake/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/batch_client.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/cronjob.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/doc.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/fake/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/fake/fake_batch_client.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/fake/fake_cronjob.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/generated_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/certificates/v1/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/certificates/v1/fake/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/fake/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/coordination/v1/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/coordination/v1/fake/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/coordination/v1beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/coordination/v1beta1/fake/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/BUILD create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/discovery/v1/discovery_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/discovery/v1/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/discovery/v1/endpointslice.go rename vendor/k8s.io/client-go/kubernetes/typed/{batch/v2alpha1 => discovery/v1}/fake/doc.go (100%) rename vendor/k8s.io/client-go/kubernetes/typed/discovery/{v1alpha1 => v1}/fake/fake_discovery_client.go (77%) create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/discovery/v1/fake/fake_endpointslice.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/discovery/v1/generated_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1/discovery_client.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1/doc.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1/endpointslice.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1/fake/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1/fake/fake_endpointslice.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1/generated_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/discovery/v1beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/discovery/v1beta1/fake/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/events/v1/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/events/v1/fake/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/fake/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1alpha1/fake/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta1/fake/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/networking/v1/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/networking/v1/fake/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/networking/v1beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/networking/v1beta1/fake/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/node/v1/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/node/v1/fake/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/node/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/node/v1alpha1/fake/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/node/v1beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/node/v1beta1/fake/BUILD create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/policy/v1/doc.go rename vendor/k8s.io/client-go/kubernetes/typed/{discovery/v1alpha1 => policy/v1}/fake/doc.go (100%) create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/policy/v1/fake/fake_poddisruptionbudget.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/policy/v1/fake/fake_policy_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/policy/v1/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/policy/v1/poddisruptionbudget.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/policy/v1/policy_client.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1/fake/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/fake/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/fake/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/storage/v1/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/storage/v1/fake/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/fake/BUILD delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/BUILD create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/csistoragecapacity.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/BUILD create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/fake_csistoragecapacity.go delete mode 100644 vendor/k8s.io/client-go/listers/admissionregistration/v1/BUILD delete mode 100644 vendor/k8s.io/client-go/listers/admissionregistration/v1beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/listers/apiserverinternal/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/client-go/listers/apps/v1/BUILD delete mode 100644 vendor/k8s.io/client-go/listers/apps/v1beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/listers/apps/v1beta2/BUILD delete mode 100644 vendor/k8s.io/client-go/listers/autoscaling/v1/BUILD delete mode 100644 vendor/k8s.io/client-go/listers/autoscaling/v2beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/listers/autoscaling/v2beta2/BUILD delete mode 100644 vendor/k8s.io/client-go/listers/batch/v1/BUILD create mode 100644 vendor/k8s.io/client-go/listers/batch/v1/cronjob.go delete mode 100644 vendor/k8s.io/client-go/listers/batch/v1beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/listers/batch/v2alpha1/BUILD delete mode 100644 vendor/k8s.io/client-go/listers/batch/v2alpha1/cronjob.go delete mode 100644 vendor/k8s.io/client-go/listers/batch/v2alpha1/expansion_generated.go delete mode 100644 vendor/k8s.io/client-go/listers/certificates/v1/BUILD delete mode 100644 vendor/k8s.io/client-go/listers/certificates/v1beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/listers/coordination/v1/BUILD delete mode 100644 vendor/k8s.io/client-go/listers/coordination/v1beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/listers/core/v1/BUILD create mode 100644 vendor/k8s.io/client-go/listers/discovery/v1/endpointslice.go create mode 100644 vendor/k8s.io/client-go/listers/discovery/v1/expansion_generated.go delete mode 100644 vendor/k8s.io/client-go/listers/discovery/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/client-go/listers/discovery/v1alpha1/endpointslice.go delete mode 100644 vendor/k8s.io/client-go/listers/discovery/v1alpha1/expansion_generated.go delete mode 100644 vendor/k8s.io/client-go/listers/discovery/v1beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/listers/events/v1/BUILD delete mode 100644 vendor/k8s.io/client-go/listers/events/v1beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/listers/extensions/v1beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/listers/flowcontrol/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/client-go/listers/flowcontrol/v1beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/listers/networking/v1/BUILD delete mode 100644 vendor/k8s.io/client-go/listers/networking/v1beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/listers/node/v1/BUILD delete mode 100644 vendor/k8s.io/client-go/listers/node/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/client-go/listers/node/v1beta1/BUILD create mode 100644 vendor/k8s.io/client-go/listers/policy/v1/expansion_generated.go create mode 100644 vendor/k8s.io/client-go/listers/policy/v1/poddisruptionbudget.go create mode 100644 vendor/k8s.io/client-go/listers/policy/v1/poddisruptionbudget_expansion.go delete mode 100644 vendor/k8s.io/client-go/listers/policy/v1beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/listers/rbac/v1/BUILD delete mode 100644 vendor/k8s.io/client-go/listers/rbac/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/client-go/listers/rbac/v1beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/listers/scheduling/v1/BUILD delete mode 100644 vendor/k8s.io/client-go/listers/scheduling/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/client-go/listers/scheduling/v1beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/listers/storage/v1/BUILD delete mode 100644 vendor/k8s.io/client-go/listers/storage/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/client-go/listers/storage/v1beta1/BUILD create mode 100644 vendor/k8s.io/client-go/listers/storage/v1beta1/csistoragecapacity.go delete mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/BUILD delete mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/pkg/version/BUILD delete mode 100644 vendor/k8s.io/client-go/pkg/version/def.bzl delete mode 100644 vendor/k8s.io/client-go/plugin/pkg/client/auth/BUILD delete mode 100644 vendor/k8s.io/client-go/plugin/pkg/client/auth/azure/BUILD delete mode 100644 vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/BUILD delete mode 100644 vendor/k8s.io/client-go/plugin/pkg/client/auth/gcp/BUILD delete mode 100644 vendor/k8s.io/client-go/plugin/pkg/client/auth/oidc/BUILD delete mode 100644 vendor/k8s.io/client-go/plugin/pkg/client/auth/openstack/BUILD delete mode 100644 vendor/k8s.io/client-go/rest/BUILD delete mode 100644 vendor/k8s.io/client-go/rest/fake/BUILD delete mode 100644 vendor/k8s.io/client-go/rest/watch/BUILD delete mode 100644 vendor/k8s.io/client-go/restmapper/BUILD delete mode 100644 vendor/k8s.io/client-go/scale/BUILD delete mode 100644 vendor/k8s.io/client-go/scale/scheme/BUILD delete mode 100644 vendor/k8s.io/client-go/scale/scheme/appsint/BUILD delete mode 100644 vendor/k8s.io/client-go/scale/scheme/appsv1beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/scale/scheme/appsv1beta2/BUILD delete mode 100644 vendor/k8s.io/client-go/scale/scheme/autoscalingv1/BUILD delete mode 100644 vendor/k8s.io/client-go/scale/scheme/extensionsint/BUILD delete mode 100644 vendor/k8s.io/client-go/scale/scheme/extensionsv1beta1/BUILD delete mode 100644 vendor/k8s.io/client-go/testing/BUILD delete mode 100644 vendor/k8s.io/client-go/third_party/forked/golang/template/BUILD delete mode 100644 vendor/k8s.io/client-go/tools/auth/BUILD delete mode 100644 vendor/k8s.io/client-go/tools/cache/BUILD delete mode 100644 vendor/k8s.io/client-go/tools/clientcmd/BUILD delete mode 100644 vendor/k8s.io/client-go/tools/clientcmd/api/BUILD delete mode 100644 vendor/k8s.io/client-go/tools/clientcmd/api/latest/BUILD delete mode 100644 vendor/k8s.io/client-go/tools/clientcmd/api/v1/BUILD delete mode 100644 vendor/k8s.io/client-go/tools/events/BUILD delete mode 100644 vendor/k8s.io/client-go/tools/leaderelection/BUILD delete mode 100644 vendor/k8s.io/client-go/tools/leaderelection/resourcelock/BUILD delete mode 100644 vendor/k8s.io/client-go/tools/metrics/BUILD delete mode 100644 vendor/k8s.io/client-go/tools/pager/BUILD delete mode 100644 vendor/k8s.io/client-go/tools/portforward/BUILD delete mode 100644 vendor/k8s.io/client-go/tools/record/BUILD delete mode 100644 vendor/k8s.io/client-go/tools/record/util/BUILD delete mode 100644 vendor/k8s.io/client-go/tools/reference/BUILD delete mode 100644 vendor/k8s.io/client-go/tools/remotecommand/BUILD delete mode 100644 vendor/k8s.io/client-go/tools/watch/BUILD delete mode 100644 vendor/k8s.io/client-go/transport/BUILD delete mode 100644 vendor/k8s.io/client-go/transport/spdy/BUILD delete mode 100644 vendor/k8s.io/client-go/util/cert/BUILD delete mode 100644 vendor/k8s.io/client-go/util/certificate/BUILD delete mode 100644 vendor/k8s.io/client-go/util/certificate/csr/BUILD delete mode 100644 vendor/k8s.io/client-go/util/connrotation/BUILD delete mode 100644 vendor/k8s.io/client-go/util/exec/BUILD delete mode 100644 vendor/k8s.io/client-go/util/flowcontrol/BUILD delete mode 100644 vendor/k8s.io/client-go/util/homedir/BUILD delete mode 100644 vendor/k8s.io/client-go/util/jsonpath/BUILD delete mode 100644 vendor/k8s.io/client-go/util/keyutil/BUILD delete mode 100644 vendor/k8s.io/client-go/util/retry/BUILD delete mode 100644 vendor/k8s.io/client-go/util/workqueue/BUILD delete mode 100644 vendor/k8s.io/cloud-provider/BUILD delete mode 100644 vendor/k8s.io/cloud-provider/api/BUILD create mode 100644 vendor/k8s.io/cloud-provider/credentialconfig/registry.go delete mode 100644 vendor/k8s.io/cloud-provider/node/helpers/BUILD delete mode 100644 vendor/k8s.io/cloud-provider/service/helpers/BUILD delete mode 100644 vendor/k8s.io/cloud-provider/volume/BUILD delete mode 100644 vendor/k8s.io/cloud-provider/volume/errors/BUILD delete mode 100644 vendor/k8s.io/cloud-provider/volume/helpers/BUILD delete mode 100644 vendor/k8s.io/cluster-bootstrap/token/api/BUILD delete mode 100644 vendor/k8s.io/cluster-bootstrap/token/util/BUILD delete mode 100644 vendor/k8s.io/cluster-bootstrap/util/secrets/BUILD delete mode 100644 vendor/k8s.io/cluster-bootstrap/util/tokens/BUILD delete mode 100644 vendor/k8s.io/component-base/cli/flag/BUILD delete mode 100644 vendor/k8s.io/component-base/cli/globalflag/BUILD delete mode 100644 vendor/k8s.io/component-base/codec/BUILD delete mode 100644 vendor/k8s.io/component-base/config/BUILD delete mode 100644 vendor/k8s.io/component-base/config/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/component-base/config/validation/BUILD delete mode 100644 vendor/k8s.io/component-base/configz/BUILD delete mode 100644 vendor/k8s.io/component-base/featuregate/BUILD delete mode 100644 vendor/k8s.io/component-base/logs/BUILD delete mode 100644 vendor/k8s.io/component-base/logs/datapol/BUILD delete mode 100644 vendor/k8s.io/component-base/logs/json/BUILD delete mode 100644 vendor/k8s.io/component-base/logs/logreduction/BUILD delete mode 100644 vendor/k8s.io/component-base/logs/sanitization/BUILD delete mode 100644 vendor/k8s.io/component-base/metrics/BUILD delete mode 100644 vendor/k8s.io/component-base/metrics/legacyregistry/BUILD create mode 100644 vendor/k8s.io/component-base/metrics/processstarttime_others.go create mode 100644 vendor/k8s.io/component-base/metrics/processstarttime_windows.go delete mode 100644 vendor/k8s.io/component-base/metrics/prometheus/ratelimiter/BUILD delete mode 100644 vendor/k8s.io/component-base/metrics/prometheus/workqueue/BUILD delete mode 100644 vendor/k8s.io/component-base/metrics/testutil/BUILD delete mode 100644 vendor/k8s.io/component-base/term/BUILD delete mode 100644 vendor/k8s.io/component-base/version/BUILD delete mode 100644 vendor/k8s.io/component-base/version/def.bzl delete mode 100644 vendor/k8s.io/component-base/version/verflag/BUILD delete mode 100644 vendor/k8s.io/component-helpers/apimachinery/lease/BUILD create mode 100644 vendor/k8s.io/component-helpers/apps/poddisruptionbudget/helpers.go delete mode 100644 vendor/k8s.io/component-helpers/auth/rbac/reconciliation/BUILD delete mode 100644 vendor/k8s.io/component-helpers/auth/rbac/validation/BUILD create mode 100644 vendor/k8s.io/component-helpers/node/topology/helpers.go delete mode 100644 vendor/k8s.io/component-helpers/scheduling/corev1/BUILD delete mode 100644 vendor/k8s.io/component-helpers/scheduling/corev1/nodeaffinity/BUILD create mode 100644 vendor/k8s.io/component-helpers/storage/volume/helpers.go delete mode 100644 vendor/k8s.io/controller-manager/pkg/clientbuilder/BUILD delete mode 100644 vendor/k8s.io/controller-manager/pkg/clientbuilder/client_builder.go delete mode 100644 vendor/k8s.io/cri-api/pkg/apis/BUILD delete mode 100644 vendor/k8s.io/cri-api/pkg/apis/runtime/v1alpha2/BUILD delete mode 100644 vendor/k8s.io/csi-translation-lib/BUILD delete mode 100644 vendor/k8s.io/csi-translation-lib/plugins/BUILD delete mode 100644 vendor/k8s.io/kube-aggregator/pkg/apis/apiregistration/BUILD delete mode 100644 vendor/k8s.io/kube-aggregator/pkg/apis/apiregistration/install/BUILD delete mode 100644 vendor/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1/BUILD delete mode 100644 vendor/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1/helper/BUILD delete mode 100644 vendor/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1/BUILD delete mode 100644 vendor/k8s.io/kube-aggregator/pkg/apis/apiregistration/validation/BUILD delete mode 100644 vendor/k8s.io/kube-aggregator/pkg/apiserver/BUILD delete mode 100644 vendor/k8s.io/kube-aggregator/pkg/apiserver/scheme/BUILD delete mode 100644 vendor/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/BUILD delete mode 100644 vendor/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme/BUILD delete mode 100644 vendor/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/typed/apiregistration/v1/BUILD delete mode 100644 vendor/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/typed/apiregistration/v1beta1/BUILD delete mode 100644 vendor/k8s.io/kube-aggregator/pkg/client/informers/externalversions/BUILD delete mode 100644 vendor/k8s.io/kube-aggregator/pkg/client/informers/externalversions/apiregistration/BUILD delete mode 100644 vendor/k8s.io/kube-aggregator/pkg/client/informers/externalversions/apiregistration/v1/BUILD delete mode 100644 vendor/k8s.io/kube-aggregator/pkg/client/informers/externalversions/apiregistration/v1beta1/BUILD delete mode 100644 vendor/k8s.io/kube-aggregator/pkg/client/informers/externalversions/internalinterfaces/BUILD delete mode 100644 vendor/k8s.io/kube-aggregator/pkg/client/listers/apiregistration/v1/BUILD delete mode 100644 vendor/k8s.io/kube-aggregator/pkg/client/listers/apiregistration/v1beta1/BUILD delete mode 100644 vendor/k8s.io/kube-aggregator/pkg/controllers/BUILD delete mode 100644 vendor/k8s.io/kube-aggregator/pkg/controllers/autoregister/BUILD delete mode 100644 vendor/k8s.io/kube-aggregator/pkg/controllers/openapi/BUILD delete mode 100644 vendor/k8s.io/kube-aggregator/pkg/controllers/openapi/aggregator/BUILD delete mode 100644 vendor/k8s.io/kube-aggregator/pkg/controllers/status/BUILD delete mode 100644 vendor/k8s.io/kube-aggregator/pkg/registry/apiservice/BUILD delete mode 100644 vendor/k8s.io/kube-aggregator/pkg/registry/apiservice/etcd/BUILD delete mode 100644 vendor/k8s.io/kube-aggregator/pkg/registry/apiservice/rest/BUILD delete mode 100644 vendor/k8s.io/kube-proxy/config/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/kube-scheduler/extender/v1/BUILD delete mode 100644 vendor/k8s.io/kubectl/pkg/apps/BUILD delete mode 100644 vendor/k8s.io/kubectl/pkg/cmd/util/BUILD create mode 100644 vendor/k8s.io/kubectl/pkg/cmd/util/env_file.go create mode 100644 vendor/k8s.io/kubectl/pkg/cmd/util/podcmd/podcmd.go delete mode 100644 vendor/k8s.io/kubectl/pkg/describe/BUILD delete mode 100644 vendor/k8s.io/kubectl/pkg/polymorphichelpers/BUILD delete mode 100644 vendor/k8s.io/kubectl/pkg/scale/BUILD delete mode 100644 vendor/k8s.io/kubectl/pkg/scheme/BUILD delete mode 100644 vendor/k8s.io/kubectl/pkg/util/certificate/BUILD delete mode 100644 vendor/k8s.io/kubectl/pkg/util/deployment/BUILD delete mode 100644 vendor/k8s.io/kubectl/pkg/util/event/BUILD delete mode 100644 vendor/k8s.io/kubectl/pkg/util/fieldpath/BUILD delete mode 100644 vendor/k8s.io/kubectl/pkg/util/interrupt/BUILD delete mode 100644 vendor/k8s.io/kubectl/pkg/util/openapi/BUILD delete mode 100644 vendor/k8s.io/kubectl/pkg/util/openapi/validation/BUILD delete mode 100644 vendor/k8s.io/kubectl/pkg/util/podutils/BUILD delete mode 100644 vendor/k8s.io/kubectl/pkg/util/qos/BUILD delete mode 100644 vendor/k8s.io/kubectl/pkg/util/rbac/BUILD delete mode 100644 vendor/k8s.io/kubectl/pkg/util/resource/BUILD delete mode 100644 vendor/k8s.io/kubectl/pkg/util/slice/BUILD delete mode 100644 vendor/k8s.io/kubectl/pkg/util/storage/BUILD delete mode 100644 vendor/k8s.io/kubectl/pkg/util/templates/BUILD delete mode 100644 vendor/k8s.io/kubectl/pkg/util/term/BUILD delete mode 100644 vendor/k8s.io/kubectl/pkg/validation/BUILD delete mode 100644 vendor/k8s.io/kubelet/config/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/kubelet/config/v1beta1/BUILD delete mode 100644 vendor/k8s.io/kubelet/pkg/apis/credentialprovider/BUILD delete mode 100644 vendor/k8s.io/kubelet/pkg/apis/credentialprovider/install/BUILD delete mode 100644 vendor/k8s.io/kubelet/pkg/apis/credentialprovider/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/kubelet/pkg/apis/deviceplugin/v1beta1/BUILD delete mode 100644 vendor/k8s.io/kubelet/pkg/apis/pluginregistration/v1/BUILD delete mode 100644 vendor/k8s.io/kubelet/pkg/apis/podresources/v1/BUILD delete mode 100644 vendor/k8s.io/kubelet/pkg/apis/podresources/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/kubelet/pkg/apis/stats/v1alpha1/BUILD rename vendor/k8s.io/{kubernetes/pkg/kubelet => kubelet/pkg}/apis/well_known_labels.go (100%) delete mode 100644 vendor/k8s.io/kubernetes/cmd/kube-apiserver/app/BUILD delete mode 100644 vendor/k8s.io/kubernetes/cmd/kube-apiserver/app/options/BUILD delete mode 100644 vendor/k8s.io/kubernetes/cmd/kube-proxy/app/BUILD delete mode 100644 vendor/k8s.io/kubernetes/cmd/kubelet/app/BUILD delete mode 100644 vendor/k8s.io/kubernetes/cmd/kubelet/app/options/BUILD create mode 100644 vendor/k8s.io/kubernetes/cmd/kubelet/app/patch_auth.go create mode 100644 vendor/k8s.io/kubernetes/cmd/kubelet/app/server_others.go create mode 100644 vendor/k8s.io/kubernetes/cmd/kubelet/app/server_windows.go create mode 100644 vendor/k8s.io/kubernetes/openshift-kube-apiserver/admission/autoscaling/managementcpusoverride/admission.go create mode 100644 vendor/k8s.io/kubernetes/openshift-kube-apiserver/admission/autoscaling/managementcpusoverride/doc.go delete mode 100644 vendor/k8s.io/kubernetes/openshift-kube-apiserver/admission/customresourcevalidation/network/BUILD create mode 100644 vendor/k8s.io/kubernetes/openshift-kube-apiserver/filters/deprecatedapirequest/apiaccess_count_controller.go create mode 100644 vendor/k8s.io/kubernetes/openshift-kube-apiserver/filters/deprecatedapirequest/deprecated.go create mode 100644 vendor/k8s.io/kubernetes/openshift-kube-apiserver/filters/deprecatedapirequest/request_counts.go create mode 100644 vendor/k8s.io/kubernetes/openshift-kube-apiserver/filters/deprecatedapirequest/update_func.go create mode 100644 vendor/k8s.io/kubernetes/openshift-kube-apiserver/filters/deprecatedapirequest/v1helpers/helpers.go create mode 100644 vendor/k8s.io/kubernetes/openshift-kube-apiserver/filters/deprecatedapirequest_filter.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/api/legacyscheme/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/api/persistentvolume/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/api/persistentvolumeclaim/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/api/pod/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/api/podsecuritypolicy/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/api/service/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/api/v1/endpoints/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/api/v1/persistentvolume/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/api/v1/pod/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/api/v1/resource/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/api/v1/service/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/abac/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/abac/latest/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/abac/v0/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/abac/v1beta1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/admission/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/admission/install/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/admission/v1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/admission/v1beta1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/admissionregistration/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/admissionregistration/install/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/admissionregistration/v1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/admissionregistration/v1beta1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/admissionregistration/validation/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/apiserverinternal/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/apiserverinternal/install/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/apiserverinternal/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/apiserverinternal/validation/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/apps/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/apps/install/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/apps/v1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta2/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/apps/validation/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/authentication/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/authentication/install/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/authentication/v1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/authentication/v1beta1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/authentication/validation/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/authorization/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/authorization/install/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/authorization/v1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/authorization/v1beta1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/authorization/validation/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/autoscaling/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/autoscaling/install/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/autoscaling/v1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/autoscaling/v2beta1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/autoscaling/v2beta2/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/autoscaling/validation/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/batch/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/batch/install/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/batch/v1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/batch/v1beta1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/batch/v2alpha1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/batch/v2alpha1/conversion.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/batch/v2alpha1/defaults.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/batch/v2alpha1/doc.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/batch/v2alpha1/register.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/batch/v2alpha1/zz_generated.conversion.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/batch/v2alpha1/zz_generated.defaults.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/batch/validation/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/certificates/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/certificates/install/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/certificates/v1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/certificates/v1beta1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/certificates/validation/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/coordination/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/coordination/install/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/coordination/v1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/coordination/v1beta1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/coordination/validation/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/core/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/core/field_constants.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/core/helper/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/core/helper/qos/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/core/install/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/core/pods/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/core/v1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/core/v1/helper/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/core/v1/helper/qos/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/core/v1/validation/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/core/validation/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/discovery/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/discovery/install/BUILD create mode 100644 vendor/k8s.io/kubernetes/pkg/apis/discovery/v1/defaults.go create mode 100644 vendor/k8s.io/kubernetes/pkg/apis/discovery/v1/doc.go create mode 100644 vendor/k8s.io/kubernetes/pkg/apis/discovery/v1/register.go create mode 100644 vendor/k8s.io/kubernetes/pkg/apis/discovery/v1/zz_generated.conversion.go create mode 100644 vendor/k8s.io/kubernetes/pkg/apis/discovery/v1/zz_generated.defaults.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/discovery/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/discovery/v1alpha1/defaults.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/discovery/v1alpha1/doc.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/discovery/v1alpha1/register.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/discovery/v1alpha1/zz_generated.conversion.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/discovery/v1alpha1/zz_generated.defaults.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/discovery/v1beta1/BUILD create mode 100644 vendor/k8s.io/kubernetes/pkg/apis/discovery/v1beta1/conversion.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/discovery/validation/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/events/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/events/install/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/events/v1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/events/v1beta1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/extensions/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/extensions/install/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/extensions/v1beta1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/flowcontrol/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/flowcontrol/install/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/flowcontrol/internalbootstrap/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/flowcontrol/util/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/flowcontrol/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/flowcontrol/v1beta1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/flowcontrol/validation/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/imagepolicy/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/imagepolicy/install/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/imagepolicy/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/networking/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/networking/install/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/networking/v1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/networking/v1beta1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/networking/validation/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/node/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/node/install/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/node/v1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/node/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/node/v1beta1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/node/validation/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/policy/BUILD create mode 100644 vendor/k8s.io/kubernetes/pkg/apis/policy/helper.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/policy/install/BUILD create mode 100644 vendor/k8s.io/kubernetes/pkg/apis/policy/v1/conversion.go create mode 100644 vendor/k8s.io/kubernetes/pkg/apis/policy/v1/doc.go create mode 100644 vendor/k8s.io/kubernetes/pkg/apis/policy/v1/register.go create mode 100644 vendor/k8s.io/kubernetes/pkg/apis/policy/v1/zz_generated.conversion.go create mode 100644 vendor/k8s.io/kubernetes/pkg/apis/policy/v1/zz_generated.defaults.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/policy/v1beta1/BUILD create mode 100644 vendor/k8s.io/kubernetes/pkg/apis/policy/v1beta1/conversion.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/policy/validation/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/rbac/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/rbac/install/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/rbac/v1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/rbac/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/rbac/v1beta1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/rbac/validation/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/scheduling/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/scheduling/install/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/scheduling/util/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/scheduling/v1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/scheduling/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/scheduling/v1beta1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/scheduling/validation/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/storage/install/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/storage/util/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/storage/v1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/storage/v1/util/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/storage/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/storage/v1beta1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/storage/validation/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/auth/authorizer/abac/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/auth/nodeidentifier/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/capabilities/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/client/conditions/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/cloudprovider/providers/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/cluster/ports/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/controller/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/controller/client_builder_dynamic.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/controller/daemon/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/controller/daemon/util/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/controller/deployment/util/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/controller/job/BUILD create mode 100644 vendor/k8s.io/kubernetes/pkg/controller/job/indexed_job_utils.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/controller/nodelifecycle/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/controller/nodelifecycle/scheduler/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/controller/replicaset/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/controller/replication/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/controller/serviceaccount/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/controller/util/node/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/controller/volume/events/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/util/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/controller/volume/scheduling/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/controller/volume/scheduling/metrics/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/controlplane/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/controlplane/controller/apiserverleasegc/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/controlplane/controller/clusterauthenticationtrust/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/controlplane/controller/crdregistration/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/controlplane/deleted_kinds.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/controlplane/reconcilers/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/controlplane/tunneler/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/credentialprovider/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/credentialprovider/aws/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/credentialprovider/azure/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/credentialprovider/gcp/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/credentialprovider/plugin/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/credentialprovider/secrets/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/features/BUILD create mode 100644 vendor/k8s.io/kubernetes/pkg/features/patch_kube_features.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/fieldpath/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/generated/openapi/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubeapiserver/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubeapiserver/admission/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubeapiserver/authenticator/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubeapiserver/authorizer/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubeapiserver/authorizer/modes/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubeapiserver/options/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/apis/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/scheme/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/validation/BUILD create mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/validation/validation_reserved_memory.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/apis/podresources/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/apis/well_known_annotations_windows.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/cadvisor/BUILD create mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/cadvisor/cadvisor_cloudproviders.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/certificate/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/certificate/bootstrap/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/checkpointmanager/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/checkpointmanager/checksum/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/checkpointmanager/errors/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/client/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/cloudresource/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/cm/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/cm/containermap/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/state/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/topology/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpuset/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/checkpoint/BUILD create mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/cm/memorymanager/fake_memory_manager.go create mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/cm/memorymanager/memory_manager.go create mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/cm/memorymanager/policy.go create mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/cm/memorymanager/policy_none.go create mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/cm/memorymanager/policy_static.go create mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/cm/memorymanager/state/checkpoint.go create mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/cm/memorymanager/state/state.go create mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/cm/memorymanager/state/state_checkpoint.go create mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/cm/memorymanager/state/state_mem.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/bitmask/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/cm/util/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/config/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/configmap/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/container/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/container/testing/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/cri/remote/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/cri/remote/util/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/cri/streaming/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/cri/streaming/portforward/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/cri/streaming/remotecommand/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/cm/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/libdocker/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/metrics/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/cni/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/hostport/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/kubenet/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/metrics/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/remote/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/envvars/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/events/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/eviction/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/eviction/api/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/images/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/store/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/configfiles/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/status/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/codec/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/files/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/log/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/log/log.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/panic/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/logs/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/leaky/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/legacy/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/lifecycle/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/logs/BUILD create mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/managed/cpu_shares.go create mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/managed/managed.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/metrics/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/metrics/collectors/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/network/dns/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/nodeshutdown/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/nodeshutdown/systemd/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/nodestatus/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/oom/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/pleg/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/cache/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/metrics/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/operationexecutor/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/pluginwatcher/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/pluginwatcher/example_plugin_apis/v1beta1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/pluginwatcher/example_plugin_apis/v1beta2/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/reconciler/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/pod/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/preemption/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/prober/BUILD create mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/prober/patch_prober.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/prober/results/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/qos/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/runtimeclass/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/runtimeclass/testing/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/secret/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/server/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/server/metrics/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/stats/BUILD create mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/stats/host_stats_provider.go create mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/stats/host_stats_provider_fake.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/stats/log_metrics_provider.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/stats/pidlimit/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/status/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/sysctl/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/token/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/types/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/util/BUILD create mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/util/boottime_util_freebsd.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/util/cache/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/util/format/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/util/ioutils/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/util/manager/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/util/queue/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/util/sliceutils/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/util/store/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/cache/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/metrics/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/populator/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/reconciler/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/winstats/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubemark/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/printers/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/printers/internalversion/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/printers/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/probe/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/probe/exec/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/probe/http/BUILD create mode 100644 vendor/k8s.io/kubernetes/pkg/probe/http/patch_http.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/probe/tcp/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/proxy/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/proxy/apis/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/proxy/apis/config/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/proxy/apis/config/scheme/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/proxy/apis/config/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/proxy/apis/config/validation/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/proxy/config/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/proxy/healthcheck/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/proxy/iptables/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/proxy/ipvs/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/proxy/metaproxier/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/proxy/metrics/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/proxy/userspace/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/proxy/util/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/proxy/util/iptables/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/proxy/util/port.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/proxy/winkernel/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/proxy/winuserspace/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/quota/v1/evaluator/core/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/quota/v1/install/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/admissionregistration/mutatingwebhookconfiguration/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/admissionregistration/mutatingwebhookconfiguration/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/admissionregistration/rest/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/admissionregistration/validatingwebhookconfiguration/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/admissionregistration/validatingwebhookconfiguration/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/apiserverinternal/rest/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/apiserverinternal/storageversion/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/apiserverinternal/storageversion/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/apps/controllerrevision/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/apps/controllerrevision/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/apps/daemonset/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/apps/daemonset/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/apps/deployment/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/apps/deployment/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/apps/replicaset/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/apps/replicaset/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/apps/rest/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/apps/statefulset/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/apps/statefulset/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/authentication/rest/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/authentication/tokenreview/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/authorization/localsubjectaccessreview/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/authorization/rest/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/authorization/selfsubjectaccessreview/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/authorization/selfsubjectrulesreview/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/authorization/subjectaccessreview/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/authorization/util/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/autoscaling/horizontalpodautoscaler/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/autoscaling/horizontalpodautoscaler/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/autoscaling/rest/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/batch/cronjob/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/batch/cronjob/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/batch/job/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/batch/job/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/batch/rest/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/certificates/certificates/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/certificates/certificates/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/certificates/rest/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/coordination/lease/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/coordination/lease/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/coordination/rest/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/core/componentstatus/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/core/configmap/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/core/configmap/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/core/endpoint/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/core/endpoint/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/core/event/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/core/event/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/core/limitrange/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/core/limitrange/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/core/namespace/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/core/namespace/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/core/node/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/core/node/rest/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/core/node/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/core/persistentvolume/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/core/persistentvolume/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/core/persistentvolumeclaim/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/core/persistentvolumeclaim/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/core/pod/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/core/pod/rest/BUILD create mode 100644 vendor/k8s.io/kubernetes/pkg/registry/core/pod/rest/metrics.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/core/pod/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/core/podtemplate/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/core/podtemplate/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/core/rangeallocation/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/core/replicationcontroller/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/core/replicationcontroller/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/core/resourcequota/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/core/resourcequota/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/core/rest/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/core/secret/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/core/secret/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/core/service/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/core/service/allocator/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/core/service/allocator/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/core/service/ipallocator/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/core/service/ipallocator/controller/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/core/service/portallocator/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/core/service/portallocator/controller/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/core/service/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/core/serviceaccount/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/core/serviceaccount/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/discovery/endpointslice/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/discovery/endpointslice/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/discovery/rest/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/events/rest/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/extensions/rest/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/flowcontrol/flowschema/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/flowcontrol/flowschema/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/flowcontrol/prioritylevelconfiguration/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/flowcontrol/prioritylevelconfiguration/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/flowcontrol/rest/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/networking/ingress/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/networking/ingress/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/networking/ingressclass/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/networking/ingressclass/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/networking/networkpolicy/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/networking/networkpolicy/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/networking/rest/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/node/rest/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/node/runtimeclass/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/node/runtimeclass/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/policy/poddisruptionbudget/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/policy/poddisruptionbudget/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/policy/podsecuritypolicy/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/policy/podsecuritypolicy/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/policy/rest/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/rbac/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/rbac/clusterrole/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/rbac/clusterrole/policybased/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/rbac/clusterrole/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/rbac/clusterrolebinding/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/rbac/clusterrolebinding/policybased/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/rbac/clusterrolebinding/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/rbac/rest/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/rbac/role/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/rbac/role/policybased/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/rbac/role/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/rbac/rolebinding/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/rbac/rolebinding/policybased/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/rbac/rolebinding/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/rbac/validation/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/registrytest/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/scheduling/priorityclass/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/scheduling/priorityclass/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/scheduling/rest/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/storage/csidriver/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/storage/csidriver/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/storage/csinode/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/storage/csinode/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/storage/csistoragecapacity/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/storage/csistoragecapacity/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/storage/rest/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/storage/storageclass/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/storage/storageclass/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/storage/volumeattachment/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/registry/storage/volumeattachment/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/routes/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/scheduler/apis/config/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/scheduler/apis/config/validation/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/scheduler/framework/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/helper/BUILD create mode 100644 vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/helper/shape_score.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodeaffinity/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodename/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodeports/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/noderesources/BUILD create mode 100644 vendor/k8s.io/kubernetes/pkg/scheduler/internal/parallelize/error_channel.go create mode 100644 vendor/k8s.io/kubernetes/pkg/scheduler/internal/parallelize/parallelism.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/scheduler/util/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/scheduler/util/topologies.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/security/apparmor/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/apparmor/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/capabilities/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/group/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/seccomp/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/selinux/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/sysctl/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/user/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/util/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/securitycontext/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/serviceaccount/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/ssh/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/util/async/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/util/bandwidth/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/util/config/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/util/conntrack/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/util/env/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/util/filesystem/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/util/flag/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/util/flock/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/util/goroutinemap/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/util/goroutinemap/exponentialbackoff/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/util/hash/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/util/ipconfig/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/util/ipset/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/util/iptables/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/util/ipvs/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/util/labels/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/util/maps/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/util/netsh/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/util/node/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/util/oom/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/util/parsers/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/util/pod/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/util/procfs/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/util/removeall/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/util/resizefs/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/util/resizefs/resizefs_linux.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/util/rlimit/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/util/selinux/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/util/slice/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/util/sysctl/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/util/tail/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/util/taints/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/util/tolerations/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/awsebs/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/azure_file/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/azuredd/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/cephfs/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/cinder/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/configmap/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/csi/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/csi/nodeinfomanager/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/csimigration/BUILD create mode 100644 vendor/k8s.io/kubernetes/pkg/volume/csimigration/patch_adc_plugin_manager.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/downwardapi/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/emptydir/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/fc/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/flexvolume/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/flocker/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/gcepd/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/git_repo/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/glusterfs/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/hostpath/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/iscsi/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/local/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/nfs/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/portworx/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/projected/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/quobyte/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/rbd/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/scaleio/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/secret/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/storageos/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/util/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/util/fs/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/util/fsquota/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/util/fsquota/common/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/util/hostutil/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/util/nestedpendingoperations/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/util/operationexecutor/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/util/recyclerclient/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/util/subpath/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/util/types/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/util/volumepathhandler/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/validation/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/vsphere_volume/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/windows/service/BUILD delete mode 100644 vendor/k8s.io/kubernetes/plugin/pkg/admission/admit/BUILD delete mode 100644 vendor/k8s.io/kubernetes/plugin/pkg/admission/alwayspullimages/BUILD delete mode 100644 vendor/k8s.io/kubernetes/plugin/pkg/admission/antiaffinity/BUILD delete mode 100644 vendor/k8s.io/kubernetes/plugin/pkg/admission/certificates/BUILD delete mode 100644 vendor/k8s.io/kubernetes/plugin/pkg/admission/certificates/approval/BUILD delete mode 100644 vendor/k8s.io/kubernetes/plugin/pkg/admission/certificates/signing/BUILD delete mode 100644 vendor/k8s.io/kubernetes/plugin/pkg/admission/certificates/subjectrestriction/BUILD delete mode 100644 vendor/k8s.io/kubernetes/plugin/pkg/admission/defaultingressclass/BUILD delete mode 100644 vendor/k8s.io/kubernetes/plugin/pkg/admission/defaulttolerationseconds/BUILD delete mode 100644 vendor/k8s.io/kubernetes/plugin/pkg/admission/deny/BUILD delete mode 100644 vendor/k8s.io/kubernetes/plugin/pkg/admission/eventratelimit/BUILD delete mode 100644 vendor/k8s.io/kubernetes/plugin/pkg/admission/eventratelimit/apis/eventratelimit/BUILD delete mode 100644 vendor/k8s.io/kubernetes/plugin/pkg/admission/eventratelimit/apis/eventratelimit/install/BUILD delete mode 100644 vendor/k8s.io/kubernetes/plugin/pkg/admission/eventratelimit/apis/eventratelimit/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/plugin/pkg/admission/eventratelimit/apis/eventratelimit/validation/BUILD delete mode 100644 vendor/k8s.io/kubernetes/plugin/pkg/admission/exec/BUILD delete mode 100644 vendor/k8s.io/kubernetes/plugin/pkg/admission/exec/admission.go delete mode 100644 vendor/k8s.io/kubernetes/plugin/pkg/admission/extendedresourcetoleration/BUILD delete mode 100644 vendor/k8s.io/kubernetes/plugin/pkg/admission/gc/BUILD delete mode 100644 vendor/k8s.io/kubernetes/plugin/pkg/admission/imagepolicy/BUILD delete mode 100644 vendor/k8s.io/kubernetes/plugin/pkg/admission/limitranger/BUILD delete mode 100644 vendor/k8s.io/kubernetes/plugin/pkg/admission/namespace/autoprovision/BUILD delete mode 100644 vendor/k8s.io/kubernetes/plugin/pkg/admission/namespace/exists/BUILD rename vendor/k8s.io/kubernetes/plugin/pkg/admission/{ => network}/defaultingressclass/admission.go (100%) create mode 100644 vendor/k8s.io/kubernetes/plugin/pkg/admission/network/denyserviceexternalips/admission.go delete mode 100644 vendor/k8s.io/kubernetes/plugin/pkg/admission/noderestriction/BUILD delete mode 100644 vendor/k8s.io/kubernetes/plugin/pkg/admission/nodetaint/BUILD delete mode 100644 vendor/k8s.io/kubernetes/plugin/pkg/admission/podnodeselector/BUILD delete mode 100644 vendor/k8s.io/kubernetes/plugin/pkg/admission/podtolerationrestriction/BUILD delete mode 100644 vendor/k8s.io/kubernetes/plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/BUILD delete mode 100644 vendor/k8s.io/kubernetes/plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/install/BUILD delete mode 100644 vendor/k8s.io/kubernetes/plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/kubernetes/plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/validation/BUILD delete mode 100644 vendor/k8s.io/kubernetes/plugin/pkg/admission/priority/BUILD delete mode 100644 vendor/k8s.io/kubernetes/plugin/pkg/admission/runtimeclass/BUILD delete mode 100644 vendor/k8s.io/kubernetes/plugin/pkg/admission/security/podsecuritypolicy/BUILD delete mode 100644 vendor/k8s.io/kubernetes/plugin/pkg/admission/securitycontext/scdeny/BUILD delete mode 100644 vendor/k8s.io/kubernetes/plugin/pkg/admission/serviceaccount/BUILD delete mode 100644 vendor/k8s.io/kubernetes/plugin/pkg/admission/storage/persistentvolume/label/BUILD delete mode 100644 vendor/k8s.io/kubernetes/plugin/pkg/admission/storage/persistentvolume/resize/BUILD delete mode 100644 vendor/k8s.io/kubernetes/plugin/pkg/admission/storage/storageclass/setdefault/BUILD delete mode 100644 vendor/k8s.io/kubernetes/plugin/pkg/admission/storage/storageobjectinuseprotection/BUILD delete mode 100644 vendor/k8s.io/kubernetes/plugin/pkg/auth/authenticator/token/bootstrap/BUILD delete mode 100644 vendor/k8s.io/kubernetes/plugin/pkg/auth/authorizer/node/BUILD delete mode 100644 vendor/k8s.io/kubernetes/plugin/pkg/auth/authorizer/rbac/BUILD delete mode 100644 vendor/k8s.io/kubernetes/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/apimachinery/BUILD create mode 100644 vendor/k8s.io/kubernetes/test/e2e/apimachinery/apply.go delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/apimachinery/events.go create mode 100644 vendor/k8s.io/kubernetes/test/e2e/apimachinery/storage_version.go delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/apps/BUILD create mode 100644 vendor/k8s.io/kubernetes/test/e2e/apps/ttl_after_finished.go delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/auth/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/autoscaling/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/chaosmonkey/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/common/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/common/configmap.go delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/common/container.go delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/common/downward_api.go create mode 100644 vendor/k8s.io/kubernetes/test/e2e/common/imports.go delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/common/lease.go create mode 100644 vendor/k8s.io/kubernetes/test/e2e/common/network/OWNERS create mode 100644 vendor/k8s.io/kubernetes/test/e2e/common/network/framework.go rename vendor/k8s.io/kubernetes/test/e2e/common/{ => network}/networking.go (99%) create mode 100644 vendor/k8s.io/kubernetes/test/e2e/common/node/OWNERS create mode 100644 vendor/k8s.io/kubernetes/test/e2e/common/node/configmap.go create mode 100644 vendor/k8s.io/kubernetes/test/e2e/common/node/container.go rename vendor/k8s.io/kubernetes/test/e2e/common/{ => node}/container_probe.go (84%) rename vendor/k8s.io/kubernetes/test/e2e/common/{ => node}/docker_containers.go (98%) create mode 100644 vendor/k8s.io/kubernetes/test/e2e/common/node/downwardapi.go rename vendor/k8s.io/kubernetes/test/e2e/common/{ => node}/expansion.go (96%) create mode 100644 vendor/k8s.io/kubernetes/test/e2e/common/node/framework.go rename vendor/k8s.io/kubernetes/test/e2e/common/{ => node}/init_container.go (99%) rename vendor/k8s.io/kubernetes/test/e2e/common/{ => node}/kubelet.go (99%) rename vendor/k8s.io/kubernetes/test/e2e/common/{ => node}/kubelet_etc_hosts.go (97%) create mode 100644 vendor/k8s.io/kubernetes/test/e2e/common/node/lease.go rename vendor/k8s.io/kubernetes/test/e2e/common/{ => node}/lifecycle_hook.go (98%) rename vendor/k8s.io/kubernetes/test/e2e/common/{ => node}/node_lease.go (99%) rename vendor/k8s.io/kubernetes/test/e2e/common/{ => node}/pods.go (98%) rename vendor/k8s.io/kubernetes/test/e2e/common/{ => node}/podtemplates.go (98%) rename vendor/k8s.io/kubernetes/test/e2e/common/{ => node}/privileged.go (97%) create mode 100644 vendor/k8s.io/kubernetes/test/e2e/common/node/runtime.go create mode 100644 vendor/k8s.io/kubernetes/test/e2e/common/node/runtimeclass.go create mode 100644 vendor/k8s.io/kubernetes/test/e2e/common/node/secrets.go rename vendor/k8s.io/kubernetes/test/e2e/common/{ => node}/security_context.go (99%) create mode 100644 vendor/k8s.io/kubernetes/test/e2e/common/node/sysctl.go delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/common/runtime.go delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/common/runtimeclass.go delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/common/secrets.go create mode 100644 vendor/k8s.io/kubernetes/test/e2e/common/storage/OWNERS rename vendor/k8s.io/kubernetes/test/e2e/common/{ => storage}/configmap_volume.go (97%) create mode 100644 vendor/k8s.io/kubernetes/test/e2e/common/storage/downwardapi.go rename vendor/k8s.io/kubernetes/test/e2e/common/{ => storage}/downwardapi_volume.go (99%) rename vendor/k8s.io/kubernetes/test/e2e/common/{ => storage}/empty_dir.go (97%) create mode 100644 vendor/k8s.io/kubernetes/test/e2e/common/storage/framework.go rename vendor/k8s.io/kubernetes/test/e2e/common/{ => storage}/host_path.go (98%) rename vendor/k8s.io/kubernetes/test/e2e/common/{ => storage}/projected_combined.go (98%) rename vendor/k8s.io/kubernetes/test/e2e/common/{ => storage}/projected_configmap.go (99%) rename vendor/k8s.io/kubernetes/test/e2e/common/{ => storage}/projected_downwardapi.go (99%) rename vendor/k8s.io/kubernetes/test/e2e/common/{ => storage}/projected_secret.go (99%) rename vendor/k8s.io/kubernetes/test/e2e/common/{ => storage}/secrets_volume.go (97%) create mode 100644 vendor/k8s.io/kubernetes/test/e2e/common/storage/util.go rename vendor/k8s.io/kubernetes/test/e2e/common/{ => storage}/volumes.go (95%) delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/common/sysctl.go delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/framework/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/framework/auth/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/framework/autoscaling/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/framework/config/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/framework/deployment/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/framework/endpoints/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/framework/endpointslice/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/framework/events/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/framework/ginkgowrapper/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/framework/gpu/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/framework/ingress/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/framework/job/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/framework/kubectl/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/framework/kubelet/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/framework/kubesystem/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/framework/log/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/framework/manifest/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/framework/metrics/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/framework/network/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/framework/node/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/framework/perf/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/framework/pod/BUILD create mode 100644 vendor/k8s.io/kubernetes/test/e2e/framework/pod/utils.go delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/framework/providers/aws/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/framework/providers/azure/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/framework/providers/gce/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/framework/providers/kubemark/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/framework/providers/openstack/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/framework/providers/vsphere/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/framework/pv/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/framework/rc/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/framework/replicaset/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/framework/resource/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/framework/security/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/framework/service/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/framework/skipper/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/framework/ssh/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/framework/statefulset/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/framework/testfiles/BUILD create mode 100644 vendor/k8s.io/kubernetes/test/e2e/framework/timeouts.go delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/framework/volume/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/framework/websocket/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/generated/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/gke_node_pools.go delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/instrumentation/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/instrumentation/common/BUILD create mode 100644 vendor/k8s.io/kubernetes/test/e2e/instrumentation/core_events.go delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/instrumentation/logging/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/instrumentation/logging/elasticsearch/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/instrumentation/logging/utils/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/instrumentation/monitoring/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/kubectl/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/lifecycle/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/network/BUILD create mode 100644 vendor/k8s.io/kubernetes/test/e2e/network/common/framework.go delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/network/framework.go create mode 100644 vendor/k8s.io/kubernetes/test/e2e/network/hostport.go create mode 100644 vendor/k8s.io/kubernetes/test/e2e/network/loadbalancer.go create mode 100644 vendor/k8s.io/kubernetes/test/e2e/network/netpol/OWNERS create mode 100644 vendor/k8s.io/kubernetes/test/e2e/network/netpol/kubemanager.go create mode 100644 vendor/k8s.io/kubernetes/test/e2e/network/netpol/model.go create mode 100644 vendor/k8s.io/kubernetes/test/e2e/network/netpol/network_legacy.go create mode 100644 vendor/k8s.io/kubernetes/test/e2e/network/netpol/network_policy.go create mode 100644 vendor/k8s.io/kubernetes/test/e2e/network/netpol/network_policy_api.go create mode 100644 vendor/k8s.io/kubernetes/test/e2e/network/netpol/policies.go create mode 100644 vendor/k8s.io/kubernetes/test/e2e/network/netpol/probe.go create mode 100644 vendor/k8s.io/kubernetes/test/e2e/network/netpol/reachability.go create mode 100644 vendor/k8s.io/kubernetes/test/e2e/network/netpol/test_helper.go create mode 100644 vendor/k8s.io/kubernetes/test/e2e/network/netpol/truthtable.go delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/network/scale/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/node/BUILD rename vendor/k8s.io/kubernetes/test/e2e/{ => node}/examples.go (91%) delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/node/recreate_node.go delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/node/ttlafterfinished.go delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/perftype/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/reporters/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/scheduling/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/storage/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/storage/drivers/BUILD create mode 100644 vendor/k8s.io/kubernetes/test/e2e/storage/drivers/csi-test/driver/driver.go create mode 100644 vendor/k8s.io/kubernetes/test/e2e/storage/drivers/csi-test/driver/driver.mock.go create mode 100644 vendor/k8s.io/kubernetes/test/e2e/storage/drivers/csi-test/driver/mock.go create mode 100644 vendor/k8s.io/kubernetes/test/e2e/storage/drivers/csi-test/mock/cache/SnapshotCache.go create mode 100644 vendor/k8s.io/kubernetes/test/e2e/storage/drivers/csi-test/mock/service/controller.go create mode 100644 vendor/k8s.io/kubernetes/test/e2e/storage/drivers/csi-test/mock/service/identity.go create mode 100644 vendor/k8s.io/kubernetes/test/e2e/storage/drivers/csi-test/mock/service/node.go create mode 100644 vendor/k8s.io/kubernetes/test/e2e/storage/drivers/csi-test/mock/service/service.go create mode 100644 vendor/k8s.io/kubernetes/test/e2e/storage/drivers/proxy/io.go create mode 100644 vendor/k8s.io/kubernetes/test/e2e/storage/drivers/proxy/portproxy.go delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/storage/external/BUILD create mode 100644 vendor/k8s.io/kubernetes/test/e2e/storage/framework/driver_operations.go create mode 100644 vendor/k8s.io/kubernetes/test/e2e/storage/framework/snapshot_resource.go create mode 100644 vendor/k8s.io/kubernetes/test/e2e/storage/framework/testconfig.go rename vendor/k8s.io/kubernetes/test/e2e/storage/{testsuites => framework}/testdriver.go (84%) rename vendor/k8s.io/kubernetes/test/e2e/storage/{testpatterns => framework}/testpattern.go (95%) create mode 100644 vendor/k8s.io/kubernetes/test/e2e/storage/framework/testsuite.go create mode 100644 vendor/k8s.io/kubernetes/test/e2e/storage/framework/volume_resource.go rename vendor/k8s.io/kubernetes/test/e2e/{ => storage}/gke_local_ssd.go (95%) delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/storage/podlogs/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/storage/testpatterns/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/BUILD create mode 100644 vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/capacity.go delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/driveroperations.go create mode 100644 vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/volumeperf.go rename vendor/k8s.io/kubernetes/test/e2e/{scheduling => storage}/ubernetes_lite_volumes.go (92%) delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/storage/utils/BUILD create mode 100644 vendor/k8s.io/kubernetes/test/e2e/storage/utils/pod.go create mode 100644 vendor/k8s.io/kubernetes/test/e2e/storage/utils/snapshot.go delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/upgrades/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/upgrades/apparmor.go delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/upgrades/apps/BUILD rename vendor/k8s.io/kubernetes/test/e2e/upgrades/{ => apps}/cassandra.go (97%) create mode 100644 vendor/k8s.io/kubernetes/test/e2e/upgrades/apps/etcd.go rename vendor/k8s.io/kubernetes/test/e2e/upgrades/{ => apps}/mysql.go (97%) delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/upgrades/etcd.go delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/upgrades/horizontal_pod_autoscalers.go rename vendor/k8s.io/kubernetes/test/e2e/upgrades/{ => network}/kube_proxy_migration.go (98%) rename vendor/k8s.io/kubernetes/test/e2e/upgrades/{ => network}/services.go (95%) create mode 100644 vendor/k8s.io/kubernetes/test/e2e/upgrades/node/apparmor.go rename vendor/k8s.io/kubernetes/test/e2e/upgrades/{ => node}/configmaps.go (97%) rename vendor/k8s.io/kubernetes/test/e2e/upgrades/{ => node}/nvidia-gpu.go (91%) create mode 100644 vendor/k8s.io/kubernetes/test/e2e/upgrades/node/secrets.go create mode 100644 vendor/k8s.io/kubernetes/test/e2e/upgrades/node/sysctl.go delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/upgrades/secrets.go delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/upgrades/serviceaccount_admission_controller_migration.go delete mode 100644 vendor/k8s.io/kubernetes/test/e2e/upgrades/sysctl.go create mode 100644 vendor/k8s.io/kubernetes/test/e2e/upgrades/upgrade_suite.go delete mode 100644 vendor/k8s.io/kubernetes/test/integration/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/integration/etcd/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/integration/framework/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/utils/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/utils/crd/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/utils/image/BUILD delete mode 100644 vendor/k8s.io/kubernetes/test/utils/junit/BUILD delete mode 100644 vendor/k8s.io/kubernetes/third_party/forked/golang/expansion/BUILD create mode 100644 vendor/k8s.io/kubernetes/third_party/forked/golang/net/dnsclient.go delete mode 100644 vendor/k8s.io/kubernetes/third_party/forked/gonum/graph/BUILD delete mode 100644 vendor/k8s.io/kubernetes/third_party/forked/gonum/graph/internal/linear/BUILD delete mode 100644 vendor/k8s.io/kubernetes/third_party/forked/gonum/graph/simple/BUILD delete mode 100644 vendor/k8s.io/kubernetes/third_party/forked/gonum/graph/traverse/BUILD delete mode 100644 vendor/k8s.io/legacy-cloud-providers/aws/BUILD delete mode 100644 vendor/k8s.io/legacy-cloud-providers/azure/BUILD delete mode 100644 vendor/k8s.io/legacy-cloud-providers/azure/auth/BUILD delete mode 100644 vendor/k8s.io/legacy-cloud-providers/azure/cache/BUILD delete mode 100644 vendor/k8s.io/legacy-cloud-providers/azure/clients/BUILD delete mode 100644 vendor/k8s.io/legacy-cloud-providers/azure/clients/armclient/BUILD delete mode 100644 vendor/k8s.io/legacy-cloud-providers/azure/clients/containerserviceclient/BUILD delete mode 100644 vendor/k8s.io/legacy-cloud-providers/azure/clients/deploymentclient/BUILD delete mode 100644 vendor/k8s.io/legacy-cloud-providers/azure/clients/diskclient/BUILD delete mode 100644 vendor/k8s.io/legacy-cloud-providers/azure/clients/diskclient/mockdiskclient/BUILD delete mode 100644 vendor/k8s.io/legacy-cloud-providers/azure/clients/fileclient/BUILD delete mode 100644 vendor/k8s.io/legacy-cloud-providers/azure/clients/interfaceclient/BUILD delete mode 100644 vendor/k8s.io/legacy-cloud-providers/azure/clients/interfaceclient/mockinterfaceclient/BUILD delete mode 100644 vendor/k8s.io/legacy-cloud-providers/azure/clients/loadbalancerclient/BUILD delete mode 100644 vendor/k8s.io/legacy-cloud-providers/azure/clients/loadbalancerclient/mockloadbalancerclient/BUILD delete mode 100644 vendor/k8s.io/legacy-cloud-providers/azure/clients/publicipclient/BUILD delete mode 100644 vendor/k8s.io/legacy-cloud-providers/azure/clients/publicipclient/mockpublicipclient/BUILD delete mode 100644 vendor/k8s.io/legacy-cloud-providers/azure/clients/routeclient/BUILD delete mode 100644 vendor/k8s.io/legacy-cloud-providers/azure/clients/routeclient/mockrouteclient/BUILD delete mode 100644 vendor/k8s.io/legacy-cloud-providers/azure/clients/routetableclient/BUILD delete mode 100644 vendor/k8s.io/legacy-cloud-providers/azure/clients/routetableclient/mockroutetableclient/BUILD delete mode 100644 vendor/k8s.io/legacy-cloud-providers/azure/clients/securitygroupclient/BUILD delete mode 100644 vendor/k8s.io/legacy-cloud-providers/azure/clients/securitygroupclient/mocksecuritygroupclient/BUILD delete mode 100644 vendor/k8s.io/legacy-cloud-providers/azure/clients/snapshotclient/BUILD delete mode 100644 vendor/k8s.io/legacy-cloud-providers/azure/clients/storageaccountclient/BUILD delete mode 100644 vendor/k8s.io/legacy-cloud-providers/azure/clients/subnetclient/BUILD delete mode 100644 vendor/k8s.io/legacy-cloud-providers/azure/clients/subnetclient/mocksubnetclient/BUILD delete mode 100644 vendor/k8s.io/legacy-cloud-providers/azure/clients/vmclient/BUILD delete mode 100644 vendor/k8s.io/legacy-cloud-providers/azure/clients/vmclient/mockvmclient/BUILD delete mode 100644 vendor/k8s.io/legacy-cloud-providers/azure/clients/vmsizeclient/BUILD delete mode 100644 vendor/k8s.io/legacy-cloud-providers/azure/clients/vmssclient/BUILD delete mode 100644 vendor/k8s.io/legacy-cloud-providers/azure/clients/vmssclient/mockvmssclient/BUILD delete mode 100644 vendor/k8s.io/legacy-cloud-providers/azure/clients/vmssvmclient/BUILD delete mode 100644 vendor/k8s.io/legacy-cloud-providers/azure/clients/vmssvmclient/mockvmssvmclient/BUILD delete mode 100644 vendor/k8s.io/legacy-cloud-providers/azure/metrics/BUILD delete mode 100644 vendor/k8s.io/legacy-cloud-providers/azure/retry/BUILD delete mode 100644 vendor/k8s.io/legacy-cloud-providers/gce/BUILD create mode 100644 vendor/k8s.io/legacy-cloud-providers/gce/gcpcredential/credentialutil.go create mode 100644 vendor/k8s.io/legacy-cloud-providers/gce/gcpcredential/gcpcredential.go create mode 100644 vendor/k8s.io/legacy-cloud-providers/gce/gcpcredential/registry_marshal.go delete mode 100644 vendor/k8s.io/legacy-cloud-providers/openstack/BUILD delete mode 100644 vendor/k8s.io/legacy-cloud-providers/vsphere/BUILD create mode 100644 vendor/k8s.io/legacy-cloud-providers/vsphere/shared_datastore.go delete mode 100644 vendor/k8s.io/legacy-cloud-providers/vsphere/vclib/BUILD delete mode 100644 vendor/k8s.io/legacy-cloud-providers/vsphere/vclib/diskmanagers/BUILD delete mode 100644 vendor/k8s.io/metrics/pkg/apis/custom_metrics/BUILD delete mode 100644 vendor/k8s.io/metrics/pkg/apis/custom_metrics/v1beta1/BUILD delete mode 100644 vendor/k8s.io/metrics/pkg/apis/custom_metrics/v1beta2/BUILD delete mode 100644 vendor/k8s.io/metrics/pkg/apis/external_metrics/BUILD delete mode 100644 vendor/k8s.io/metrics/pkg/apis/external_metrics/v1beta1/BUILD delete mode 100644 vendor/k8s.io/metrics/pkg/client/custom_metrics/BUILD delete mode 100644 vendor/k8s.io/metrics/pkg/client/custom_metrics/scheme/BUILD delete mode 100644 vendor/k8s.io/metrics/pkg/client/external_metrics/BUILD delete mode 100644 vendor/k8s.io/mount-utils/BUILD create mode 100644 vendor/k8s.io/mount-utils/resizefs_linux.go rename vendor/k8s.io/{kubernetes/pkg/util/resizefs => mount-utils}/resizefs_unsupported.go (80%) delete mode 100644 vendor/k8s.io/sample-apiserver/pkg/apis/wardle/BUILD delete mode 100644 vendor/k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1/BUILD rename vendor/{k8s.io/controller-manager => sigs.k8s.io/kustomize/api}/LICENSE (100%) create mode 100644 vendor/sigs.k8s.io/kustomize/api/builtins/AnnotationsTransformer.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/builtins/ConfigMapGenerator.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/builtins/HashTransformer.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/builtins/HelmChartInflationGenerator.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/builtins/ImageTagTransformer.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/builtins/LabelTransformer.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/builtins/LegacyOrderTransformer.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/builtins/NamespaceTransformer.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/builtins/PatchJson6902Transformer.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/builtins/PatchStrategicMergeTransformer.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/builtins/PatchTransformer.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/builtins/PrefixSuffixTransformer.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/builtins/ReplicaCountTransformer.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/builtins/SecretGenerator.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/builtins/ValueAddTransformer.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/builtins/doc.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/filesys/confirmeddir.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/filesys/file.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/filesys/fileinfo.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/filesys/fileondisk.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/filesys/filesystem.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/filesys/fsnode.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/filesys/fsondisk.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/filesys/util.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/filters/annotations/annotations.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/filters/annotations/doc.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/filters/fieldspec/doc.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/filters/fieldspec/fieldspec.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/filters/fieldspec/gvk.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/filters/filtersutil/setters.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/filters/fsslice/doc.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/filters/fsslice/fsslice.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/filters/imagetag/doc.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/filters/imagetag/imagetag.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/filters/imagetag/legacy.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/filters/imagetag/updater.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/filters/labels/doc.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/filters/labels/labels.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/filters/nameref/doc.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/filters/nameref/nameref.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/filters/nameref/seqfilter.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/filters/namespace/doc.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/filters/namespace/namespace.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/filters/patchjson6902/doc.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/filters/patchjson6902/patchjson6902.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/filters/patchstrategicmerge/doc.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/filters/patchstrategicmerge/patchstrategicmerge.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/filters/prefixsuffix/doc.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/filters/prefixsuffix/prefixsuffix.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/filters/refvar/doc.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/filters/refvar/expand.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/filters/refvar/refvar.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/filters/replicacount/doc.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/filters/replicacount/replicacount.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/filters/valueadd/valueadd.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/hasher/hasher.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/ifc/ifc.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/image/image.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/internal/accumulator/loadconfigfromcrds.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/internal/accumulator/namereferencetransformer.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/internal/accumulator/refvartransformer.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/internal/accumulator/resaccumulator.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/internal/conflict/factory.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/internal/conflict/smpatchmergeonlydetector.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/internal/generators/configmap.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/internal/generators/secret.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/internal/generators/utils.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/internal/git/cloner.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/internal/git/gitrunner.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/internal/git/repospec.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/internal/kusterr/yamlformaterror.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/internal/plugins/builtinconfig/doc.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/internal/plugins/builtinconfig/loaddefaultconfig.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/internal/plugins/builtinconfig/namebackreferences.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/internal/plugins/builtinconfig/transformerconfig.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/internal/plugins/builtinhelpers/builtinplugintype_string.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/internal/plugins/builtinhelpers/builtins.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/internal/plugins/execplugin/execplugin.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/internal/plugins/fnplugin/fnplugin.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/internal/plugins/loader/loader.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/internal/plugins/utils/utils.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/internal/target/errmissingkustomization.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/internal/target/kusttarget.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/internal/target/kusttarget_configplugin.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/internal/target/multitransformer.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/internal/utils/errtimeout.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/internal/utils/pathsplitter.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/internal/utils/timedcall.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/internal/validate/fieldvalidator.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/internal/wrappy/factory.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/internal/wrappy/wnode.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/commonannotations.go rename vendor/sigs.k8s.io/kustomize/{pkg/transformers/config/defaultconfig => api/konfig/builtinpluginconsts}/commonlabels.go (83%) create mode 100644 vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/defaultconfig.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/doc.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/images.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/nameprefix.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/namereference.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/namespace.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/replicas.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/varreference.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/konfig/doc.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/konfig/general.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/konfig/plugins.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/krusty/doc.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/krusty/kustomizer.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/krusty/options.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/kv/kv.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/loader/fileloader.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/loader/loader.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/loader/loadrestrictions.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/provenance/provenance.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/provider/depprovider.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/resid/gvk.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/resid/resid.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/resmap/factory.go rename vendor/sigs.k8s.io/kustomize/{pkg => api}/resmap/idslice.go (88%) create mode 100644 vendor/sigs.k8s.io/kustomize/api/resmap/merginator.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/resmap/resmap.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/resmap/reswrangler.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/resource/conflictdetector.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/resource/doc.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/resource/factory.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/resource/idset.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/resource/resource.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/types/builtinpluginloadingoptions_string.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/types/configmapargs.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/types/doc.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/types/erronlybuiltinpluginsallowed.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/types/errunabletofind.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/types/fieldspec.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/types/fix.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/types/genargs.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/types/generationbehavior.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/types/generatorargs.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/types/generatoroptions.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/types/helmchartargs.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/types/image.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/types/inventory.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/types/kustomization.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/types/kvpairsources.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/types/loadrestrictions.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/types/loadrestrictions_string.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/types/objectmeta.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/types/pair.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/types/patch.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/types/patchstrategicmerge.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/types/pluginconfig.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/types/pluginrestrictions.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/types/pluginrestrictions_string.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/types/replacement.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/types/replica.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/types/secretargs.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/types/selector.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/types/typemeta.go create mode 100644 vendor/sigs.k8s.io/kustomize/api/types/var.go rename vendor/sigs.k8s.io/kustomize/{ => kyaml}/LICENSE (100%) create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/LICENSE_TEMPLATE create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/comments/comments.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/errors/errors.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/ext/ext.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/fieldmeta/fieldmeta.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/filtersutil/doc.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/filtersutil/filtersutil.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/container/container.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/exec/doc.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/exec/exec.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/runtimeutil/doc.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/runtimeutil/functiontypes.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/runtimeutil/runtimeutil.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/runtimeutil/types.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/starlark/context.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/starlark/doc.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/starlark/starlark.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/qri-io/starlib/util/LICENSE create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/qri-io/starlib/util/doc.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/qri-io/starlib/util/util.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/kio/byteio_reader.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/kio/byteio_writer.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/kio/doc.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/filters.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/fmtr.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/grep.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/local.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/merge.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/merge3.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/modify.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/stripcomments.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/kio/ignorefilesmatcher.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/kio/kio.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/kio/kioutil/kioutil.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/kio/pkgio_reader.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/kio/pkgio_writer.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/kio/testing.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/kio/tree.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/openapi/Makefile create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/openapi/README.md create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/openapi/kubernetesapi/openapiinfo.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/openapi/kubernetesapi/v1204/swagger.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/openapi/kubernetesapi/v1204/swagger.json create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/openapi/kustomizationapi/swagger.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/openapi/kustomizationapi/swagger.json create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/openapi/openapi.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/runfn/runfn.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/sets/string.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/sets/stringlist.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/yaml/alias.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/yaml/compatibility.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/yaml/const.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/yaml/datamap.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/yaml/doc.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/yaml/filters.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/yaml/fns.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/labels/copied.deepcopy.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/labels/labels.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/labels/selector.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/selection/operator.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/util/errors/errors.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/util/sets/empty.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/util/sets/string.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/util/validation/field/errors.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/util/validation/field/path.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/util/validation/validation.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/yaml/kfns.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/yaml/mapnode.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/yaml/match.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/yaml/merge2/merge2.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/yaml/merge2/smpdirective.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/yaml/merge2/smpdirective_string.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/yaml/merge3/merge3.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/yaml/merge3/visitor.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/yaml/order.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/yaml/rnode.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/yaml/schema/schema.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/yaml/serialization.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/yaml/types.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/yaml/walk/associative_sequence.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/yaml/walk/map.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/yaml/walk/nonassociative_sequence.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/yaml/walk/scalar.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/yaml/walk/visitor.go create mode 100644 vendor/sigs.k8s.io/kustomize/kyaml/yaml/walk/walk.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/commands/build/build.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/constants/constants.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/expansion/expand.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/factory/factory.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/fs/confirmeddir.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/fs/fakefile.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/fs/fakefileinfo.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/fs/fakefs.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/fs/fs.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/fs/realfile.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/fs/realfs.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/git/cloner.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/git/repospec.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/gvk/gvk.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/ifc/ifc.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/ifc/transformer/factory.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/image/deprecatedimage.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/image/image.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/internal/error/configmaperror.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/internal/error/kustomizationerror.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/internal/error/patcherror.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/internal/error/resourceerror.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/internal/error/secreterror.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/internal/error/yamlformaterror.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/loader/fileloader.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/loader/loader.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/patch/json6902.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/patch/strategicmerge.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/patch/transformer/factory.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/patch/transformer/patchjson6902json.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/resid/resid.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/resmap/factory.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/resmap/resmap.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/resource/factory.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/resource/resource.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/target/kusttarget.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/target/resaccumulator.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/transformers/config/defaultconfig/commonannotations.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/transformers/config/defaultconfig/defaultconfig.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/transformers/config/defaultconfig/nameprefix.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/transformers/config/defaultconfig/namereference.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/transformers/config/defaultconfig/namespace.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/transformers/config/defaultconfig/varreference.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/transformers/config/factory.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/transformers/config/factorycrd.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/transformers/config/fieldspec.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/transformers/config/namebackreferences.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/transformers/config/transformerconfig.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/transformers/image.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/transformers/labelsandannotations.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/transformers/multitransformer.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/transformers/mutatefield.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/transformers/namereference.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/transformers/namespace.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/transformers/nooptransformer.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/transformers/prefixsuffixname.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/transformers/refvars.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/transformers/transformer.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/types/genargs.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/types/generationbehavior.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/types/kustomization.go delete mode 100644 vendor/sigs.k8s.io/kustomize/pkg/types/var.go diff --git a/go.mod b/go.mod index 95691e2c7f55..b4c46d1d8d1d 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/openshift/origin -go 1.15 +go 1.16 require ( github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd @@ -10,14 +10,13 @@ require ( github.com/boltdb/bolt v1.3.1 // indirect github.com/davecgh/go-spew v1.1.1 github.com/docker/distribution v2.7.1+incompatible - github.com/fsouza/go-dockerclient v0.0.0-20171004212419-da3951ba2e9e + github.com/fsouza/go-dockerclient v1.7.1 github.com/ghodss/yaml v1.0.0 github.com/go-bindata/go-bindata v3.1.2+incompatible github.com/go-ozzo/ozzo-validation v3.5.0+incompatible // indirect github.com/golang/protobuf v1.4.3 - github.com/google/go-cmp v0.5.2 + github.com/google/go-cmp v0.5.4 github.com/google/uuid v1.1.2 - github.com/gorilla/context v1.1.1 // indirect github.com/heketi/tests v0.0.0-20151005000721-f3775cbcefd6 // indirect github.com/lestrrat-go/jspointer v0.0.0-20181205001929-82fadba7561c // indirect github.com/lestrrat-go/jsref v0.0.0-20181205001954-1b590508f37d // indirect @@ -31,11 +30,11 @@ require ( github.com/onsi/ginkgo v4.7.0-origin.0+incompatible github.com/onsi/gomega v1.7.0 github.com/opencontainers/go-digest v1.0.0 - github.com/openshift/api v0.0.0-20210420151714-a3c8fa53e01b - github.com/openshift/apiserver-library-go v0.0.0-20201214145556-6f1013f42f98 - github.com/openshift/build-machinery-go v0.0.0-20210209125900-0da259a2c359 - github.com/openshift/client-go v0.0.0-20210416122133-a6ef8fb5934b - github.com/openshift/library-go v0.0.0-20201214135256-d265f469e75b + github.com/openshift/api v0.0.0-20210423140644-156ca80f8d83 + github.com/openshift/apiserver-library-go v0.0.0-20210415093535-9176fb31e5dc + github.com/openshift/build-machinery-go v0.0.0-20210423112049-9415d7ebd33e + github.com/openshift/client-go v0.0.0-20210422153130-25c8450d1535 + github.com/openshift/library-go v0.0.0-20210420183610-0e395da73318 github.com/pborman/uuid v1.2.0 github.com/pquerna/cachecontrol v0.0.0-20201205024021-ac21108117ac // indirect github.com/prometheus/client_golang v1.7.1 @@ -48,65 +47,58 @@ require ( github.com/stretchr/testify v1.6.1 github.com/xeipuuv/gojsonschema v1.2.0 // indirect go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489 - golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0 - golang.org/x/net v0.0.0-20201110031124-69a78807bb2b + golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 + golang.org/x/net v0.0.0-20210224082022-3d97a244fca7 golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d - golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c // indirect google.golang.org/grpc v1.27.1 gopkg.in/ldap.v2 v2.5.1 gopkg.in/src-d/go-git.v4 v4.13.1 - gopkg.in/yaml.v2 v2.3.0 + gopkg.in/yaml.v2 v2.4.0 k8s.io/api v0.21.0-rc.0 - k8s.io/apiextensions-apiserver v0.20.0 + k8s.io/apiextensions-apiserver v0.21.0-rc.0 k8s.io/apimachinery v0.21.0-rc.0 - k8s.io/apiserver v0.20.0 - k8s.io/cli-runtime v0.20.0 + k8s.io/apiserver v0.21.0-rc.0 + k8s.io/cli-runtime v0.21.0-rc.0 k8s.io/client-go v0.21.0-rc.0 - k8s.io/component-base v0.20.0 + k8s.io/component-base v0.21.0-rc.0 k8s.io/component-helpers v0.0.0 k8s.io/klog/v2 v2.8.0 - k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd - k8s.io/kubectl v0.20.0 - k8s.io/kubelet v0.20.0 - k8s.io/kubernetes v1.20.0 - k8s.io/legacy-cloud-providers v0.20.0 + k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7 + k8s.io/kubectl v0.21.0-rc.0 + k8s.io/kubelet v0.21.0-rc.0 + k8s.io/kubernetes v1.21.0-rc.0 + k8s.io/legacy-cloud-providers v0.21.0-rc.0 k8s.io/utils v0.0.0-20201110183641-67b214c5f920 sigs.k8s.io/yaml v1.2.0 ) replace ( github.com/onsi/ginkgo => github.com/openshift/onsi-ginkgo v4.7.0-origin.0+incompatible - github.com/openshift/apiserver-library-go => github.com/openshift/apiserver-library-go v0.0.0-20201214145556-6f1013f42f98 - github.com/openshift/library-go => github.com/openshift/library-go v0.0.0-20201214135256-d265f469e75b - k8s.io/api => github.com/openshift/kubernetes/staging/src/k8s.io/api v0.0.0-20210208155256-e509061a6d18 - k8s.io/apiextensions-apiserver => github.com/openshift/kubernetes/staging/src/k8s.io/apiextensions-apiserver v0.0.0-20210208155256-e509061a6d18 - k8s.io/apimachinery => github.com/openshift/kubernetes/staging/src/k8s.io/apimachinery v0.0.0-20210208155256-e509061a6d18 - k8s.io/apiserver => github.com/openshift/kubernetes/staging/src/k8s.io/apiserver v0.0.0-20210208155256-e509061a6d18 - k8s.io/cli-runtime => github.com/openshift/kubernetes/staging/src/k8s.io/cli-runtime v0.0.0-20210208155256-e509061a6d18 - k8s.io/client-go => github.com/openshift/kubernetes/staging/src/k8s.io/client-go v0.0.0-20210208155256-e509061a6d18 - k8s.io/cloud-provider => github.com/openshift/kubernetes/staging/src/k8s.io/cloud-provider v0.0.0-20210208155256-e509061a6d18 - k8s.io/cluster-bootstrap => github.com/openshift/kubernetes/staging/src/k8s.io/cluster-bootstrap v0.0.0-20210208155256-e509061a6d18 - k8s.io/code-generator => github.com/openshift/kubernetes/staging/src/k8s.io/code-generator v0.0.0-20210208155256-e509061a6d18 - k8s.io/component-base => github.com/openshift/kubernetes/staging/src/k8s.io/component-base v0.0.0-20210208155256-e509061a6d18 - k8s.io/component-helpers => github.com/openshift/kubernetes/staging/src/k8s.io/component-helpers v0.0.0-20210208155256-e509061a6d18 - k8s.io/controller-manager => github.com/openshift/kubernetes/staging/src/k8s.io/controller-manager v0.0.0-20210208155256-e509061a6d18 - k8s.io/cri-api => github.com/openshift/kubernetes/staging/src/k8s.io/cri-api v0.0.0-20210208155256-e509061a6d18 - k8s.io/csi-translation-lib => github.com/openshift/kubernetes/staging/src/k8s.io/csi-translation-lib v0.0.0-20210208155256-e509061a6d18 - k8s.io/gengo => k8s.io/gengo v0.0.0-20200114144118-36b2048a9120 - k8s.io/heapster => k8s.io/heapster v1.2.0-beta.1 - k8s.io/klog => k8s.io/klog v1.0.0 - k8s.io/kube-aggregator => github.com/openshift/kubernetes/staging/src/k8s.io/kube-aggregator v0.0.0-20210208155256-e509061a6d18 - k8s.io/kube-controller-manager => github.com/openshift/kubernetes/staging/src/k8s.io/kube-controller-manager v0.0.0-20210208155256-e509061a6d18 - k8s.io/kube-proxy => github.com/openshift/kubernetes/staging/src/k8s.io/kube-proxy v0.0.0-20210208155256-e509061a6d18 - k8s.io/kube-scheduler => github.com/openshift/kubernetes/staging/src/k8s.io/kube-scheduler v0.0.0-20210208155256-e509061a6d18 - k8s.io/kubectl => github.com/openshift/kubernetes/staging/src/k8s.io/kubectl v0.0.0-20210208155256-e509061a6d18 - k8s.io/kubelet => github.com/openshift/kubernetes/staging/src/k8s.io/kubelet v0.0.0-20210208155256-e509061a6d18 - k8s.io/kubernetes => github.com/openshift/kubernetes v1.20.1-0.20210208155256-e509061a6d18 - k8s.io/legacy-cloud-providers => github.com/openshift/kubernetes/staging/src/k8s.io/legacy-cloud-providers v0.0.0-20210208155256-e509061a6d18 - k8s.io/metrics => github.com/openshift/kubernetes/staging/src/k8s.io/metrics v0.0.0-20210208155256-e509061a6d18 - k8s.io/mount-utils => github.com/openshift/kubernetes/staging/src/k8s.io/mount-utils v0.0.0-20210208155256-e509061a6d18 - k8s.io/sample-apiserver => github.com/openshift/kubernetes/staging/src/k8s.io/sample-apiserver v0.0.0-20210208155256-e509061a6d18 - k8s.io/sample-cli-plugin => github.com/openshift/kubernetes/staging/src/k8s.io/sample-cli-plugin v0.0.0-20210208155256-e509061a6d18 - k8s.io/sample-controller => github.com/openshift/kubernetes/staging/src/k8s.io/sample-controller v0.0.0-20210208155256-e509061a6d18 - k8s.io/system-validators => k8s.io/system-validators v1.0.4 + k8s.io/api => github.com/openshift/kubernetes/staging/src/k8s.io/api v0.0.0-20210429023751-daa555af5040 + k8s.io/apiextensions-apiserver => github.com/openshift/kubernetes/staging/src/k8s.io/apiextensions-apiserver v0.0.0-20210429023751-daa555af5040 + k8s.io/apimachinery => github.com/openshift/kubernetes/staging/src/k8s.io/apimachinery v0.0.0-20210429023751-daa555af5040 + k8s.io/apiserver => github.com/openshift/kubernetes/staging/src/k8s.io/apiserver v0.0.0-20210429023751-daa555af5040 + k8s.io/cli-runtime => github.com/openshift/kubernetes/staging/src/k8s.io/cli-runtime v0.0.0-20210429023751-daa555af5040 + k8s.io/client-go => github.com/openshift/kubernetes/staging/src/k8s.io/client-go v0.0.0-20210429023751-daa555af5040 + k8s.io/cloud-provider => github.com/openshift/kubernetes/staging/src/k8s.io/cloud-provider v0.0.0-20210429023751-daa555af5040 + k8s.io/cluster-bootstrap => github.com/openshift/kubernetes/staging/src/k8s.io/cluster-bootstrap v0.0.0-20210429023751-daa555af5040 + k8s.io/code-generator => github.com/openshift/kubernetes/staging/src/k8s.io/code-generator v0.0.0-20210429023751-daa555af5040 + k8s.io/component-base => github.com/openshift/kubernetes/staging/src/k8s.io/component-base v0.0.0-20210429023751-daa555af5040 + k8s.io/component-helpers => github.com/openshift/kubernetes/staging/src/k8s.io/component-helpers v0.0.0-20210429023751-daa555af5040 + k8s.io/controller-manager => github.com/openshift/kubernetes/staging/src/k8s.io/controller-manager v0.0.0-20210429023751-daa555af5040 + k8s.io/cri-api => github.com/openshift/kubernetes/staging/src/k8s.io/cri-api v0.0.0-20210429023751-daa555af5040 + k8s.io/csi-translation-lib => github.com/openshift/kubernetes/staging/src/k8s.io/csi-translation-lib v0.0.0-20210429023751-daa555af5040 + k8s.io/kube-aggregator => github.com/openshift/kubernetes/staging/src/k8s.io/kube-aggregator v0.0.0-20210429023751-daa555af5040 + k8s.io/kube-controller-manager => github.com/openshift/kubernetes/staging/src/k8s.io/kube-controller-manager v0.0.0-20210429023751-daa555af5040 + k8s.io/kube-proxy => github.com/openshift/kubernetes/staging/src/k8s.io/kube-proxy v0.0.0-20210429023751-daa555af5040 + k8s.io/kube-scheduler => github.com/openshift/kubernetes/staging/src/k8s.io/kube-scheduler v0.0.0-20210429023751-daa555af5040 + k8s.io/kubectl => github.com/openshift/kubernetes/staging/src/k8s.io/kubectl v0.0.0-20210429023751-daa555af5040 + k8s.io/kubelet => github.com/openshift/kubernetes/staging/src/k8s.io/kubelet v0.0.0-20210429023751-daa555af5040 + k8s.io/kubernetes => github.com/openshift/kubernetes v1.21.0-rc.0.0.20210426183659-cd6d8b086ad5 + k8s.io/legacy-cloud-providers => github.com/openshift/kubernetes/staging/src/k8s.io/legacy-cloud-providers v0.0.0-20210429023751-daa555af5040 + k8s.io/metrics => github.com/openshift/kubernetes/staging/src/k8s.io/metrics v0.0.0-20210429023751-daa555af5040 + k8s.io/mount-utils => github.com/openshift/kubernetes/staging/src/k8s.io/mount-utils v0.0.0-20210429023751-daa555af5040 + k8s.io/sample-apiserver => github.com/openshift/kubernetes/staging/src/k8s.io/sample-apiserver v0.0.0-20210429023751-daa555af5040 + k8s.io/sample-cli-plugin => github.com/openshift/kubernetes/staging/src/k8s.io/sample-cli-plugin v0.0.0-20210429023751-daa555af5040 + k8s.io/sample-controller => github.com/openshift/kubernetes/staging/src/k8s.io/sample-controller v0.0.0-20210429023751-daa555af5040 ) diff --git a/go.sum b/go.sum index 08fdf327b445..33da8616b53e 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,4 @@ +bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= bitbucket.org/bertimus9/systemstat v0.0.0-20180207000608-0eeff89b0690/go.mod h1:Ulb78X89vxKYgdL24HMTiXYHlyHEvruOj1ZPlqeNEZM= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= @@ -31,14 +32,12 @@ github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7O github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.1 h1:eVvIXUKiTgv++6YnWb42DUA1YL7qDugnKP0HljexdnQ= -github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= -github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= +github.com/Azure/go-autorest/autorest v0.11.12 h1:gI8ytXbxMfI+IVbI9mP2JGCTXIuhHLgRlvQ9X4PsnHE= +github.com/Azure/go-autorest/autorest v0.11.12/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= github.com/Azure/go-autorest/autorest/adal v0.9.5 h1:Y3bBUV4rTuxenJJs41HU3qmqsb+auo+a3Lz+PlJPpL0= github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk= github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/autorest/to v0.2.0 h1:nQOZzFCudTh+TvquAtCRjM01VEYx85e9qbwt5ncW4L8= @@ -58,14 +57,17 @@ github.com/JeffAshton/win_pdh v0.0.0-20161109143554-76bb4ee9f0ab h1:UKkYhof1njT1 github.com/JeffAshton/win_pdh v0.0.0-20161109143554-76bb4ee9f0ab/go.mod h1:3VYc5hodBMJ5+l/7J4xAyMeuM2PNuepvHlGs8yilUCA= github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd h1:sjQovDkwrZp8u+gxLtPgKGjk5hCxuy2hrRejBTA9xFU= github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= -github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= -github.com/Microsoft/go-winio v0.4.15 h1:qkLXKzb1QoVatRyd/YlXZ/Kg0m5K3SPuoD82jjSOaBc= github.com/Microsoft/go-winio v0.4.15/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= -github.com/Microsoft/hcsshim v0.8.10-0.20200715222032-5eafd1556990 h1:1xpVY4dSUSbW3PcSGxZJhI8Z+CJiqbd933kM7HIinTc= +github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= +github.com/Microsoft/go-winio v0.4.16 h1:FtSW/jqD+l4ba5iPBj9CODVtgfYAD8w2wS923g/cFDk= +github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= github.com/Microsoft/hcsshim v0.8.10-0.20200715222032-5eafd1556990/go.mod h1:ay/0dTb7NsG8QMDfsRfLHgZo/6xAJShLe1+ePPflihk= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46 h1:lsxEuwrXEAokXB9qhlbKWPpo3KMLZQ5WB5WLQRW1uq0= +github.com/Microsoft/hcsshim v0.8.14 h1:lbPVK25c1cu5xTLITwpUcxoA9vKrKErASPYygvouJns= +github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/NYTimes/gziphandler v1.1.1 h1:ZUDjpQae29j0ryrS0u/B8HZfJBtBQHjqw2rQ2cqUQ3I= +github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= @@ -116,8 +118,6 @@ github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx2 github.com/caddyserver/caddy v1.0.3/go.mod h1:G+ouvOY32gENkJC+jhgl62TyhvqEsFaDiZ4uw0RzP1E= github.com/cenkalti/backoff v2.1.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/certifi/gocertifi v0.0.0-20180905225744-ee1a9a0726d2 h1:MmeatFT1pTPSVb4nkPmBFN/LRZ97vPjsFKsZrU3KKTs= -github.com/certifi/gocertifi v0.0.0-20180905225744-ee1a9a0726d2/go.mod h1:GJKEexRPVJrBSOjoqN5VNOIKJ5Q3RViH6eu3puDRwx4= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= @@ -130,27 +130,28 @@ github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWR github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= -github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775 h1:cHzBGGVew0ezFsq2grfy2RsB8hO/eNyBgOLHBCqfR1U= -github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= +github.com/cilium/ebpf v0.2.0 h1:Fv93L3KKckEcEHR3oApXVzyBTDA8WAm6VXhPE00N3f8= +github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/clusterhq/flocker-go v0.0.0-20160920122132-2b8b7259d313 h1:eIHD9GNM3Hp7kcRW5mvcz7WTR3ETeoYYKwpgA04kaXE= github.com/clusterhq/flocker-go v0.0.0-20160920122132-2b8b7259d313/go.mod h1:P1wt9Z3DP8O6W3rvwCt0REIlshg1InHImaLW0t3ObY0= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa h1:OaNxuTZr7kxeODyLWsRMC+OD03aFUH+mW6r2d+MWa5Y= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= -github.com/container-storage-interface/spec v1.2.0 h1:bD9KIVgaVKKkQ/UbVUY9kCaH/CJbhNxe0eeB4JeJV2s= -github.com/container-storage-interface/spec v1.2.0/go.mod h1:6URME8mwIBbpVyZV93Ce5St17xBiQJQY67NDsuohiy4= +github.com/container-storage-interface/spec v1.3.0 h1:wMH4UIoWnK/TXYw8mbcIHgZmB6kHOeIsYsiaTJwa6bc= +github.com/container-storage-interface/spec v1.3.0/go.mod h1:6URME8mwIBbpVyZV93Ce5St17xBiQJQY67NDsuohiy4= github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59 h1:qWj4qVYZ95vLWwqyNJCQg7rDsG5wPdze0UaPolH7DUk= github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM= github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= -github.com/containerd/console v1.0.0 h1:fU3UuQapBs+zLJu82NhR11Rif1ny2zfMMAyPJzSN5tQ= -github.com/containerd/console v1.0.0/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= +github.com/containerd/console v1.0.1 h1:u7SFAJyRqWcG6ogaMAx3KjSTy1e3hT9QxqX7Jco7dRc= +github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.1 h1:pASeJT3R3YyVn+94qEPk0SnU1OQ20Jd/T+SPKy9xehY= -github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.4 h1:rtRG4N6Ct7GNssATwgpvMGfnjnwfjnu/Zs9W3Ikzq+M= +github.com/containerd/containerd v1.4.4/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20190827140505-75bee3e2ccb6 h1:NmTXa/uVnDyp0TY5MKi197+3HWcnYWfnHGyaFthlnGw= -github.com/containerd/continuity v0.0.0-20190827140505-75bee3e2ccb6/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e h1:6JKvHHt396/qabvMhnhUZvWaHZzfVfldxE60TK8YLhg= +github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= @@ -161,7 +162,7 @@ github.com/containerd/typeurl v1.0.1 h1:PvuK4E3D5S5q6IqsPDCy928FhP0LUIGcmZ/Yhgp5 github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= github.com/containernetworking/cni v0.8.0 h1:BT9lpgGoH4jw3lFC7Odz2prU5ruiYKcgAjMCbgybcKI= github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/coredns/corefile-migration v1.0.10/go.mod h1:RMy/mXdeDlYwzt0vdMEJvT2hGJ2I86/eO0UdXmH9XNI= +github.com/coredns/corefile-migration v1.0.11/go.mod h1:RMy/mXdeDlYwzt0vdMEJvT2hGJ2I86/eO0UdXmH9XNI= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= @@ -184,6 +185,9 @@ github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwc 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= 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 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= +github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyphar/filepath-securejoin v0.2.2 h1:jCwT2GTP+PY5nBz3c/YL5PAIbusElVrPujOBSCj8xRg= github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -199,21 +203,17 @@ github.com/docker/distribution v0.0.0-20180920194744-16128bbac47f/go.mod h1:J2gT github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v17.12.0-ce-rc1.0.20200916142827-bd33bbf0497b+incompatible h1:SiUATuP//KecDjpOK2tvZJgeScYAklvyjfK8JZlU6fo= -github.com/docker/docker v17.12.0-ce-rc1.0.20200916142827-bd33bbf0497b+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/go-connections v0.3.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/docker v20.10.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.3-0.20210216175712-646072ed6524+incompatible h1:Yu2uGErhwEoOT/OxAFe+/SiJCqRLs+pgcS5XKrDXnG4= +github.com/docker/docker v20.10.3-0.20210216175712-646072ed6524+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/libnetwork v0.0.0-20190731215715-7f13a5c99f4b h1:rACxqwRsHD075Vb7qTimAgMSKWoM5zER0Dhws/SgCVo= -github.com/docker/libnetwork v0.0.0-20190731215715-7f13a5c99f4b/go.mod h1:93m0aTqz6z+g32wla4l4WxTrdtvBRmVzYRkYvasA5Z8= github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7 h1:UhxFibDNY/bfvqU5CAUmr9zpesgbU6SWc8/B4mflAE4= github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96 h1:cenwrSVm+Z7QLSV/BsnenAOcDXdX4cMv4wP0B/5QbPg= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= @@ -229,6 +229,7 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/euank/go-kmsg-parser v2.0.0+incompatible h1:cHD53+PLQuuQyLZeriD1V/esuG4MuU0Pjs5y6iknohY= github.com/euank/go-kmsg-parser v2.0.0+incompatible/go.mod h1:MhmAMZ8V4CYH4ybgdRwPr2TU5ThnS43puaKEMpja1uw= +github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.9.0+incompatible h1:kLcOMZeuLAJvL2BPWLMIj5oaZQobrkAqrL+WFZwQses= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d h1:105gxyaGwCFad8crR9dcMQWvV9Hvulu6hwUh4tWPJnM= @@ -236,7 +237,6 @@ github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZM github.com/fatih/camelcase v1.0.0 h1:hxNvNX/xYBp0ovncs8WyWZrOrpBNub/JfaMvbURyft8= 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/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ= 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/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= @@ -244,12 +244,9 @@ github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoD github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsouza/go-dockerclient v0.0.0-20171004212419-da3951ba2e9e h1:B94x7idrPK5yFSMWliAvakUQlTDLgO7iJyHtpbYxGGM= -github.com/fsouza/go-dockerclient v0.0.0-20171004212419-da3951ba2e9e/go.mod h1:KpcjM623fQYE9MZiTGzKhjfxXAV9wbyX2C1cyRHfhl0= +github.com/fsouza/go-dockerclient v1.7.1 h1:OHRaYvQslCqBStrel+I3OcXZBmpoTnRCGsmH2tAk7Hk= +github.com/fsouza/go-dockerclient v1.7.1/go.mod h1:PHUSk8IVIp+nkIVGrQa2GK69jPOeW/43OUKQgQcOH+M= github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= -github.com/getsentry/raven-go v0.0.0-20190513200303-c977f96e1095 h1:F2m41rgyxoveZKD+Z6xwyAbtdNeVvhpi9BpQLvt5oRU= -github.com/getsentry/raven-go v0.0.0-20190513200303-c977f96e1095/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 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= @@ -259,6 +256,8 @@ github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0 github.com/go-acme/lego v2.5.0+incompatible/go.mod h1:yzMNe9CasVUhkquNvti5nAtPmG94USbYxYrZfTkIn0M= github.com/go-bindata/go-bindata v3.1.2+incompatible h1:5vjJMVhowQdPzjE1LdxyFF7YFTXg5IgGVW4gBr5IbvE= github.com/go-bindata/go-bindata v3.1.2+incompatible/go.mod h1:xK8Dsgwmeed+BBsSy2XTopBn/8uK2HWuGSnA11C3Joo= +github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= +github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= 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= @@ -275,11 +274,9 @@ github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70t github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= -github.com/go-openapi/analysis v0.19.5 h1:8b2ZgKfKIUTVQpTb77MoRDIMEIwvDVw40o3aOXdfYzI= github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= -github.com/go-openapi/errors v0.19.2 h1:a2kIyV3w+OS3S97zxUndRVD46+FhGOUBDFY7nmu4CsY= github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= @@ -295,22 +292,21 @@ github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= -github.com/go-openapi/loads v0.19.4 h1:5I4CCSqoWzT+82bBkNIvmLc0UOsoKKQ4Fz+3VxOB7SY= github.com/go-openapi/loads v0.19.4/go.mod h1:zZVHonKd8DXyxyw4yfnVjPzBjIQcLt0CCsn0N0ZrQsk= github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= -github.com/go-openapi/runtime v0.19.4 h1:csnOgcgAiuGoM/Po7PEpKDoNulCcF3FGbSnbHfxgjMI= github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= -github.com/go-openapi/spec v0.19.3 h1:0XRyw8kguri6Yw4SxhsQA/atC88yqrk0+G4YhI2wabc= github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= +github.com/go-openapi/spec v0.19.5 h1:Xm0Ao53uqnk9QE/LlYV5DEU09UAgpliA85QoT9LzqPw= +github.com/go-openapi/spec v0.19.5/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= -github.com/go-openapi/strfmt v0.19.3 h1:eRfyY5SkaNJCAwmmMcADjY31ow9+N7MCLW7oRkbsINA= github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= +github.com/go-openapi/strfmt v0.19.5/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= @@ -318,13 +314,12 @@ github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tF github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= -github.com/go-openapi/validate v0.19.5 h1:QhCBKRYqZR+SKo4gl1lPhPahope8/RLt6EVgY8X80w0= -github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= +github.com/go-openapi/validate v0.19.8/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= github.com/go-ozzo/ozzo-validation v3.5.0+incompatible h1:sUy/in/P6askYr16XJgTKq/0SZhiWsdg4WZGaLsGQkM= github.com/go-ozzo/ozzo-validation v3.5.0+incompatible/go.mod h1:gsEKFIVnabGBt6mXmxK0MoFy+cZoTJY6mu5Ll3LVLBU= -github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gobuffalo/flect v0.2.0/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80= +github.com/gobuffalo/here v0.6.0/go.mod h1:wAG085dHOYqUpf+Ap+WOdrPTp5IYcDAs/x7PLa8Y5fM= github.com/godbus/dbus/v5 v5.0.3 h1:ZqHaoEF7TBzh4jzPmqVhE/5A1z9of6orkAe5uHoAeME= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= @@ -345,8 +340,9 @@ github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfb github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1 h1:ocYkMQY5RrXTYgXl7ICpV0IXwlEQGwKIsery4gyXa1U= github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= 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= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -362,8 +358,6 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golangplus/bytes v0.0.0-20160111154220-45c989fe5450/go.mod h1:Bk6SMAONeMXrxql8uvOKuAZSu8aM5RUGv+1C6IJaEho= -github.com/golangplus/fmt v0.0.0-20150411045040-2a5d6d7d2995/go.mod h1:lJgMEyOkYFkPcDKwRXegd+iM6E7matEszMG5HhwytU8= github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= github.com/gonum/blas v0.0.0-20181208220705-f22b278b28ac/go.mod h1:P32wAyui1PQ58Oce/KYkOqQv8cVw1zAapXOl+dRFGbc= github.com/gonum/floats v0.0.0-20181209220543-c233463c7e82/go.mod h1:PxC8OnwL11+aosOB5+iEPoV3picfs8tUpkVd0pDo+Kg= @@ -374,15 +368,16 @@ github.com/gonum/matrix v0.0.0-20181209220409-c518dec07be9/go.mod h1:0EXg4mc1CNP github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/cadvisor v0.38.5 h1:XOvqjL2+xMEuDORcLMv77NystZvQB7YgGxcKpRul/vE= -github.com/google/cadvisor v0.38.5/go.mod h1:1OFB9sOOMkBdUBGCO/1SArawTnDscgMzTodacVDe8mA= +github.com/google/cadvisor v0.39.0 h1:jai6dmBP9QAYluNGqU18yVUTw6uuyAW0AqtZIjvl8Qg= +github.com/google/cadvisor v0.39.0/go.mod h1:rjQFmK4jPCpxeUdLq9bYhNFFsjgGOtpnDmDeap0+nsw= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= 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= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4 h1:L8R9j+yAqZuZjsqh/z+F1NCffTKKLShY6zXTItVIZ8M= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -393,6 +388,8 @@ github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +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/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= @@ -408,8 +405,6 @@ github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEo github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/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= -github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= -github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/mux v0.0.0-20191024121256-f395758b854c/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= @@ -451,13 +446,14 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/heketi/heketi v9.0.1-0.20190917153846-c2e2a4ab7ab9+incompatible h1:ysqc8k973k1lLJ4BOOHAkx14K2nt4cLjsIm+hwWDZDE= -github.com/heketi/heketi v9.0.1-0.20190917153846-c2e2a4ab7ab9+incompatible/go.mod h1:bB9ly3RchcQqsQ9CpyaQwvva7RS5ytVoSoholZQON6o= +github.com/heketi/heketi v10.2.0+incompatible h1:kw0rXzWGCXZP5XMP07426kKiz4hGFgR9ok+GTg+wDS8= +github.com/heketi/heketi v10.2.0+incompatible/go.mod h1:bB9ly3RchcQqsQ9CpyaQwvva7RS5ytVoSoholZQON6o= github.com/heketi/tests v0.0.0-20151005000721-f3775cbcefd6 h1:oJ/NLadJn5HoxvonA6VxG31lg0d6XOURNA09BTtM4fY= github.com/heketi/tests v0.0.0-20151005000721-f3775cbcefd6/go.mod h1:xGMAM8JLi7UkZt1i4FQeQy0R2T8GLUwQhOP5M1gBhy4= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.7 h1:Y+UAYTZ7gDEuOfhxKWy+dvb5dRQ6rJjFSdX2HZY1/gI= github.com/imdario/mergo v0.3.7/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= @@ -494,17 +490,15 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= 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= -github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= github.com/lestrrat-go/jspointer v0.0.0-20181205001929-82fadba7561c h1:pGh5EFIfczeDHwgMHgfwjhZzL+8/E3uZF6T7vER/W8c= github.com/lestrrat-go/jspointer v0.0.0-20181205001929-82fadba7561c/go.mod h1:xw2Gm4Mg+ST9s8fHR1VkUIyOJMJnSloRZlPQB+wyVpY= @@ -541,6 +535,7 @@ github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.0 h1:aizVhC/NAAcKWb+5QsU1iNOZb4Yws5UO2I+aIprQITM= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/markbates/pkger v0.17.1/go.mod h1:0JoVlrol20BSywW79rN3kdFFsE5xYM+rSCQDXbLhiuI= github.com/marten-seemann/qtls v0.2.3/go.mod h1:xzjG7avBwGGbdZ8dTGxlBnLArsVKLvwmjgmPuiQEcYk= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= @@ -548,14 +543,15 @@ github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNx github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/mholt/certmagic v0.6.2-0.20190624175158-6a42ef9fe8c2/go.mod h1:g4cOPxcjV0oFq3qwpjSA30LReKD8AoIfwAY9VvG35NY= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.3/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.4 h1:rCMZsU2ScVSYcAsOXgmC6+AKOK+6pmQTOcw03nfwYV0= -github.com/miekg/dns v1.1.4/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.35 h1:oTfOaDH+mZkdcgdIjH6yBajRGtIwcwcaR+rt23ZSrJs= +github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/mindprince/gonvml v0.0.0-20190828220739-9ebdce4bb989 h1:PS1dLCGtD8bb9RPKJrc8bS7qHL6JnW1CZvwzH9dPoUs= github.com/mindprince/gonvml v0.0.0-20190828220739-9ebdce4bb989/go.mod h1:2eu9pRWp8mo84xCg6KswZ+USQHjwgRhNp06sozOdsTY= github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible h1:aKW/4cBs+yK6gpqU3K/oIwk9Q/XICqd3zOX/UFuvqmk= @@ -574,10 +570,14 @@ github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQz github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/moby/ipvs v1.0.1 h1:aoZ7fhLTXgDbzVrAnvV+XbKOU8kOET7B3+xULDF/1o0= github.com/moby/ipvs v1.0.1/go.mod h1:2pngiyseZbIKXNv7hsKj3O9UEz30c53MT9005gt2hxQ= -github.com/moby/sys/mountinfo v0.1.3 h1:KIrhRO14+AkwKvG/g2yIpNMOUVZ02xNhOw8KY1WsLOI= -github.com/moby/sys/mountinfo v0.1.3/go.mod h1:w2t2Avltqx8vE7gX5l+QiBKxODu2TX0+Syr3h52Tw4o= -github.com/moby/term v0.0.0-20200312100748-672ec06f55cd h1:aY7OQNf2XqY/JQ6qREWamhI/81os/agb2BAGpcx5yWI= -github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= +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 h1:WhCW5B355jtxndN5ovugJlMFJawbUODuW8fSnEH6SSM= +github.com/moby/sys/mount v0.2.0/go.mod h1:aAivFE2LB3W4bACsUXChRHQ0qKWsetY4Y9V7sxOougM= +github.com/moby/sys/mountinfo v0.4.0 h1:1KInV3Huv18akCu58V7lzNlt+jFmqlu1EaErnEHE/VM= +github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= +github.com/moby/term v0.0.0-20201216013528-df9cb8a40635 h1:rzf0wL0CHVc8CEsgyygG0Mn9CNCCPZqOPaz8RiiHYQk= +github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= 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= @@ -586,10 +586,12 @@ github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9 github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= +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/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/mrunalp/fileutils v0.0.0-20200520151820-abd8a0e76976 h1:aZQToFSLH8ejFeSkTc3r3L4dPImcj7Ib/KgmkQqbGGg= -github.com/mrunalp/fileutils v0.0.0-20200520151820-abd8a0e76976/go.mod h1:x8F1gnqOkIEiO4rqoeEEEqQbo7HjGMTvyoq3gej4iT0= +github.com/mrunalp/fileutils v0.5.0 h1:NKzVxiH7eSk+OQ4M+ZYW1K6h27RUV3MI6NUTsHhU6Z4= +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= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= @@ -599,8 +601,11 @@ github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= github.com/naoina/toml v0.1.1/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0 h1:XPnZz8VVBHjVsy1vzJmRwIcSwiUO+JFfrv/xGiigmME= @@ -612,76 +617,78 @@ github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3I github.com/opencontainers/image-spec v1.0.1 h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVojFA6h/TRcI= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v0.0.0-20191031171055-b133feaeeb2e/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc92 h1:+IczUKCRzDzFDnw99O/PAqrcBBCoRp9xN3cB1SYSNS4= -github.com/opencontainers/runc v1.0.0-rc92/go.mod h1:X1zlU4p7wOlX4+WRCz+hvlRv8phdL7UqbYD+vQwNMmE= +github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc93 h1:x2UMpOOVf3kQ8arv/EsDGwim8PTNqzL1/EYDr/+scOM= +github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.3-0.20200728170252-4d89ac9fbff6 h1:NhsM2gc769rVWDqJvapK37r+7+CBXI8xHhnfnt8uQsg= -github.com/opencontainers/runtime-spec v1.0.3-0.20200728170252-4d89ac9fbff6/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/selinux v1.6.0 h1:+bIAS/Za3q5FTwWym4fTB0vObnfCf3G/NC7K6Jx62mY= -github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= -github.com/openshift/api v0.0.0-20201214114959-164a2fb63b5f/go.mod h1:aqU5Cq+kqKKPbDMqxo9FojgDeSpNJI7iuskjXjtojDg= -github.com/openshift/api v0.0.0-20210416115537-a60c0dc032fd/go.mod h1:dZ4kytOo3svxJHNYd0J55hwe/6IQG5gAUHUE0F3Jkio= -github.com/openshift/api v0.0.0-20210420151714-a3c8fa53e01b h1:rHqB8raDfF9HTHOjzrDmrSpW4eNfN2JyyS2ul/RNrWY= -github.com/openshift/api v0.0.0-20210420151714-a3c8fa53e01b/go.mod h1:dZ4kytOo3svxJHNYd0J55hwe/6IQG5gAUHUE0F3Jkio= -github.com/openshift/apiserver-library-go v0.0.0-20201214145556-6f1013f42f98 h1:JUz5O4PiBoEFhf/ZvwRary38hejR6E0LDEtyNro01TM= -github.com/openshift/apiserver-library-go v0.0.0-20201214145556-6f1013f42f98/go.mod h1:bMWTKd7ZOYGyx1hVLipuA9LrIJw62V7Se99cZ/Volj8= -github.com/openshift/build-machinery-go v0.0.0-20200917070002-f171684f77ab/go.mod h1:b1BuldmJlbA/xYtdZvKi+7j5YGB44qJUJDZ9zwiNCfE= -github.com/openshift/build-machinery-go v0.0.0-20210209125900-0da259a2c359 h1:ehSDsWQiUVzJZrSEXMC7ceV9JIPEyTYqrpqu3m4Wa08= +github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d h1:pNa8metDkwZjb9g4T8s+krQ+HRgZAkqnXml+wNir/+s= +github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/selinux v1.8.0 h1:+77ba4ar4jsCbL1GLbFL8fFM57w6suPfSS9PDLDY7KM= +github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= +github.com/openshift/api v0.0.0-20210331162552-3e31249e6a55/go.mod h1:dZ4kytOo3svxJHNYd0J55hwe/6IQG5gAUHUE0F3Jkio= +github.com/openshift/api v0.0.0-20210331193751-3acddb19d360/go.mod h1:dZ4kytOo3svxJHNYd0J55hwe/6IQG5gAUHUE0F3Jkio= +github.com/openshift/api v0.0.0-20210422150128-d8a48168c81c/go.mod h1:dZ4kytOo3svxJHNYd0J55hwe/6IQG5gAUHUE0F3Jkio= +github.com/openshift/api v0.0.0-20210423140644-156ca80f8d83 h1:Rz7+q64KDked7wonxYd3r87QAcuiTSt5H+EPghmGMt0= +github.com/openshift/api v0.0.0-20210423140644-156ca80f8d83/go.mod h1:dZ4kytOo3svxJHNYd0J55hwe/6IQG5gAUHUE0F3Jkio= +github.com/openshift/apiserver-library-go v0.0.0-20210415093535-9176fb31e5dc h1:gLfHgd50Sa5GoxVHidJzpVR0QT/31kxv6gIJSuuBP9M= +github.com/openshift/apiserver-library-go v0.0.0-20210415093535-9176fb31e5dc/go.mod h1:nqn2IWld2A+Q9Lp/xGsbmUr2RyDCQixRU83yqAbymUM= github.com/openshift/build-machinery-go v0.0.0-20210209125900-0da259a2c359/go.mod h1:b1BuldmJlbA/xYtdZvKi+7j5YGB44qJUJDZ9zwiNCfE= -github.com/openshift/client-go v0.0.0-20201214125552-e615e336eb49/go.mod h1:9/jG4I6sh+5QublJpZZ4Zs/P4/QCXMsQQ/K/058bSB8= -github.com/openshift/client-go v0.0.0-20210416122133-a6ef8fb5934b h1:3YQry4QJbTMRKbCTe+6zzZZXEOoGD1TxRyDbHSNFukw= -github.com/openshift/client-go v0.0.0-20210416122133-a6ef8fb5934b/go.mod h1:t9pZ1Uuiq13Bxxw64OHZvSZSRyEFhe5Z+6pQpcMoerk= -github.com/openshift/kubernetes v1.20.1-0.20210208155256-e509061a6d18 h1:GVqYbZfHZ7yBu5PhiUXPGGeQkdFZsgaXaSMCpRqWq/s= -github.com/openshift/kubernetes v1.20.1-0.20210208155256-e509061a6d18/go.mod h1:WYL8/qQDpjRt1Rh9DNGRWe3V2ovnZnRJMffzC0gC1uc= -github.com/openshift/kubernetes/staging/src/k8s.io/api v0.0.0-20210208155256-e509061a6d18 h1:YDMWN6CW9C3EQCvTif/UHliRi3/mVCoEgN3kMsMkddU= -github.com/openshift/kubernetes/staging/src/k8s.io/api v0.0.0-20210208155256-e509061a6d18/go.mod h1:12gqmOZJjmP0ciWfqR5ANIxYgDdTchaRCQx+nTGBtm4= -github.com/openshift/kubernetes/staging/src/k8s.io/apiextensions-apiserver v0.0.0-20210208155256-e509061a6d18 h1:OGl9sJQsma12o/Ds8Hfk1DwtlJ4xiocLvPdl1pjU1ys= -github.com/openshift/kubernetes/staging/src/k8s.io/apiextensions-apiserver v0.0.0-20210208155256-e509061a6d18/go.mod h1:Tcd087AOtnbniuSkrQXpXxuN3y5UwtbXXTmLFiJca8s= -github.com/openshift/kubernetes/staging/src/k8s.io/apimachinery v0.0.0-20210208155256-e509061a6d18 h1:2SgrQIwTsA3A2NvZpyXcmcq2snMpQDbFrzCRya/Hfzw= -github.com/openshift/kubernetes/staging/src/k8s.io/apimachinery v0.0.0-20210208155256-e509061a6d18/go.mod h1:3axNrcLyqkBWxqU7Xl8RrLVDvPZOq5XMUHZ7mEFAQTM= -github.com/openshift/kubernetes/staging/src/k8s.io/apiserver v0.0.0-20210208155256-e509061a6d18 h1:vrqvl1tbk2eVkAM1sSxvhVUzk+WICtZFt7T/Nn3PLyQ= -github.com/openshift/kubernetes/staging/src/k8s.io/apiserver v0.0.0-20210208155256-e509061a6d18/go.mod h1:ED6HfkyjucTiWY56MfTsOW48qtYewvR5IODc4JRMc6k= -github.com/openshift/kubernetes/staging/src/k8s.io/cli-runtime v0.0.0-20210208155256-e509061a6d18 h1:FAmEbRcTjACZLFocBzJER5if7njryDWvgc6t8OSTeEI= -github.com/openshift/kubernetes/staging/src/k8s.io/cli-runtime v0.0.0-20210208155256-e509061a6d18/go.mod h1:2PkJ8J+3tJgD3gqH85mPwUZ0Z4gjOtdgrauOUoCndO0= -github.com/openshift/kubernetes/staging/src/k8s.io/client-go v0.0.0-20210208155256-e509061a6d18 h1:4BPd0bte+7JUgQpPoZXRK9KUPM+8GFRJlTg7L12IVto= -github.com/openshift/kubernetes/staging/src/k8s.io/client-go v0.0.0-20210208155256-e509061a6d18/go.mod h1:MfFvfPRc3qZnRjJYRnD8KZGtlN0XC+zUZu5wu5yfUz0= -github.com/openshift/kubernetes/staging/src/k8s.io/cloud-provider v0.0.0-20210208155256-e509061a6d18 h1:enYRIYarofYNrlQiinJIlezkHL7eDKQBqOUsCg5UcFo= -github.com/openshift/kubernetes/staging/src/k8s.io/cloud-provider v0.0.0-20210208155256-e509061a6d18/go.mod h1:UbIReMP6onJAgmEZQmjsi9PwQZnuy6mN6cA+NX63KtI= -github.com/openshift/kubernetes/staging/src/k8s.io/cluster-bootstrap v0.0.0-20210208155256-e509061a6d18 h1:A7RrJvvTlGvtVquafz5VpXmemJ6MXxTt+faXOxsI6HQ= -github.com/openshift/kubernetes/staging/src/k8s.io/cluster-bootstrap v0.0.0-20210208155256-e509061a6d18/go.mod h1:DwF2HdGOWvyoCRRAYTArqotIiLrKDWnOFYNGSXYv5kc= -github.com/openshift/kubernetes/staging/src/k8s.io/code-generator v0.0.0-20210208155256-e509061a6d18/go.mod h1:IdL3q169r16+fn077pRij9q//URx7OmYa+Wthx/j8KA= -github.com/openshift/kubernetes/staging/src/k8s.io/component-base v0.0.0-20210208155256-e509061a6d18 h1:G+2mcM8P8McJ1cjyur9nCg/KIjF2RYw8Sg4sz9gJ72I= -github.com/openshift/kubernetes/staging/src/k8s.io/component-base v0.0.0-20210208155256-e509061a6d18/go.mod h1:+m5WoP0r8VlXaFWELe3Us7JCRVtcZPrgUJ82zGtICDw= -github.com/openshift/kubernetes/staging/src/k8s.io/component-helpers v0.0.0-20210208155256-e509061a6d18 h1:Umie5sd/ZuxiXH9fyXeqRrVzZahHoag6GvwImpY01Yk= -github.com/openshift/kubernetes/staging/src/k8s.io/component-helpers v0.0.0-20210208155256-e509061a6d18/go.mod h1:aYiAP0jm/mzzaAPEbSnjAzpIvB32BWs83YlyYN7vNtc= -github.com/openshift/kubernetes/staging/src/k8s.io/controller-manager v0.0.0-20210208155256-e509061a6d18 h1:cqIJanJxDdFqJV5ZkuaTV6viow0POQgsLdhWq7kUVtM= -github.com/openshift/kubernetes/staging/src/k8s.io/controller-manager v0.0.0-20210208155256-e509061a6d18/go.mod h1:C4aXxyoP3zkEJSMu98FCHF7lNDSNcBxMe13/JNk3WX8= -github.com/openshift/kubernetes/staging/src/k8s.io/cri-api v0.0.0-20210208155256-e509061a6d18 h1:H+6c+tSxhixKZ1xyQj4OFBgpjvcYp4t3RZL14yE7qKw= -github.com/openshift/kubernetes/staging/src/k8s.io/cri-api v0.0.0-20210208155256-e509061a6d18/go.mod h1:4xhnGOFiv9lkvENieScdSfcQHzXH9DR6QZRrCH0amMo= -github.com/openshift/kubernetes/staging/src/k8s.io/csi-translation-lib v0.0.0-20210208155256-e509061a6d18 h1:/QaT4rZY15sKahEymii3BivKZx0bP9C2E0T6uey7AVg= -github.com/openshift/kubernetes/staging/src/k8s.io/csi-translation-lib v0.0.0-20210208155256-e509061a6d18/go.mod h1:yvSgp4ik96yUXtiMdgyHzrZRI0XNlq8Wfs2Q54+pICU= -github.com/openshift/kubernetes/staging/src/k8s.io/kube-aggregator v0.0.0-20210208155256-e509061a6d18 h1:bBCN11iPkTseDcV95Dyw7Quy53nu0cu5xYOMzkQ9JP8= -github.com/openshift/kubernetes/staging/src/k8s.io/kube-aggregator v0.0.0-20210208155256-e509061a6d18/go.mod h1:1q1yp9zAz75t3BOwP11lXWu9bKOEVr2D+Uuq/0tgaTc= -github.com/openshift/kubernetes/staging/src/k8s.io/kube-controller-manager v0.0.0-20210208155256-e509061a6d18/go.mod h1:G43SCvMMH8h7lJxYjXgy4Ik5i/xLkA5MQm1PHsuKQxc= -github.com/openshift/kubernetes/staging/src/k8s.io/kube-proxy v0.0.0-20210208155256-e509061a6d18 h1:Tj090PgUqiR3KZvTYd3wWfWQVQVvevNToiDUJTh5gl0= -github.com/openshift/kubernetes/staging/src/k8s.io/kube-proxy v0.0.0-20210208155256-e509061a6d18/go.mod h1:T53q06WyCndb2KNmm3lm6MT37ES+AIMi9msiFacQgiM= -github.com/openshift/kubernetes/staging/src/k8s.io/kube-scheduler v0.0.0-20210208155256-e509061a6d18 h1:ESv7o1wkDMJLIygRFLf8r64j+QL3bumSZl6o/DvDgQs= -github.com/openshift/kubernetes/staging/src/k8s.io/kube-scheduler v0.0.0-20210208155256-e509061a6d18/go.mod h1:1eeLynEfXxcPS3rGxwkUpSbjJ/6LhqhBK6E8tIaNNFs= -github.com/openshift/kubernetes/staging/src/k8s.io/kubectl v0.0.0-20210208155256-e509061a6d18 h1:3dRcGBCibd0xMKBi9Ml9YJyvCG4h7QMm6lLCGC2YMhc= -github.com/openshift/kubernetes/staging/src/k8s.io/kubectl v0.0.0-20210208155256-e509061a6d18/go.mod h1:OpQzy3zR3K/YFh6yaTqUJjNzDLsV4F0mEOITBpXpJv0= -github.com/openshift/kubernetes/staging/src/k8s.io/kubelet v0.0.0-20210208155256-e509061a6d18 h1:nau7Xodq++EmFuoySKAfkiFwFnegROXNR0G/nruRdr8= -github.com/openshift/kubernetes/staging/src/k8s.io/kubelet v0.0.0-20210208155256-e509061a6d18/go.mod h1:ry4feXn7kqXZhCrz+qGy576zyIpYATh0QTINIibRzRk= -github.com/openshift/kubernetes/staging/src/k8s.io/legacy-cloud-providers v0.0.0-20210208155256-e509061a6d18 h1:86UpBMQ4t0/nq7TdwnRapkUJ9LarH5WexfczxAG1MZM= -github.com/openshift/kubernetes/staging/src/k8s.io/legacy-cloud-providers v0.0.0-20210208155256-e509061a6d18/go.mod h1:SZzO0CnWBCwbiYLkYwThH9vvD4d0Q1plgf0r2WY1S+w= -github.com/openshift/kubernetes/staging/src/k8s.io/metrics v0.0.0-20210208155256-e509061a6d18 h1:P5RpCJPI/HQMcOHNqud+l7P1WeAWI2ON+axg+MpL9CE= -github.com/openshift/kubernetes/staging/src/k8s.io/metrics v0.0.0-20210208155256-e509061a6d18/go.mod h1:5UY8SSbdbpx1XBR5HUbS/QkW4poh3AJTQvW3443qQmg= -github.com/openshift/kubernetes/staging/src/k8s.io/mount-utils v0.0.0-20210208155256-e509061a6d18 h1:ITuETATk7m0CkUWv0CeH4ALuXgsN2HejjrUJMPc/CU0= -github.com/openshift/kubernetes/staging/src/k8s.io/mount-utils v0.0.0-20210208155256-e509061a6d18/go.mod h1:mFeSjsWvLj55xUpwltalvolz49izW7J0N5RfoIHrKKY= -github.com/openshift/kubernetes/staging/src/k8s.io/sample-apiserver v0.0.0-20210208155256-e509061a6d18 h1:obkql0YP+mkgPsIOntXeYrXT1xTJuzD1hso/CGbRU90= -github.com/openshift/kubernetes/staging/src/k8s.io/sample-apiserver v0.0.0-20210208155256-e509061a6d18/go.mod h1:WtXfFgTtCy2EaR3FvGYUsA+wulDHkF664sjyQrFMPQw= -github.com/openshift/library-go v0.0.0-20201214135256-d265f469e75b h1:zKZCcZgL3jf02/jf/ldUg8TvudOFcPGIdf8kFkWh5MI= -github.com/openshift/library-go v0.0.0-20201214135256-d265f469e75b/go.mod h1:udseDnqxn5ON8i+NBjDp00fBTK0JRu1/6Y6tf6EivDE= +github.com/openshift/build-machinery-go v0.0.0-20210423112049-9415d7ebd33e h1:F7rBobgSjtYL3/zsgDUjlTVx3Z06hdgpoldpDcn7jzc= +github.com/openshift/build-machinery-go v0.0.0-20210423112049-9415d7ebd33e/go.mod h1:b1BuldmJlbA/xYtdZvKi+7j5YGB44qJUJDZ9zwiNCfE= +github.com/openshift/client-go v0.0.0-20210331195552-cf6c2669e01f/go.mod h1:hHaRJ6vp2MRd/CpuZ1oJkqnMGy5eEnoAkQmKPZKcUPI= +github.com/openshift/client-go v0.0.0-20210422153130-25c8450d1535 h1:JGSJhDJiQxqUETyqseqeXD7X/hgA6V/F3WW/2dN4QCs= +github.com/openshift/client-go v0.0.0-20210422153130-25c8450d1535/go.mod h1:v5/AYttPCjfqMGC1Ed/vutuDpuXmgWc5O+W9nwQ7EtE= +github.com/openshift/kubernetes v1.21.0-rc.0.0.20210426183659-cd6d8b086ad5 h1:KhltVC8nc6q2Nw0SDToE+K9LgqD3SZ30cu7ty9hdtEE= +github.com/openshift/kubernetes v1.21.0-rc.0.0.20210426183659-cd6d8b086ad5/go.mod h1:kzK7uPSgrPV6t7lrGPHG3y8UPDwRYXO1LGZlZ4/rsck= +github.com/openshift/kubernetes/staging/src/k8s.io/api v0.0.0-20210429023751-daa555af5040 h1:hVSLDBIUw2/NO00uXtwSS6OE4KzntUeKihP/UDjaZTA= +github.com/openshift/kubernetes/staging/src/k8s.io/api v0.0.0-20210429023751-daa555af5040/go.mod h1:TD7fwYg7+uByU8PweROUvAH84/vAmY0AnsoPcqG5AOY= +github.com/openshift/kubernetes/staging/src/k8s.io/apiextensions-apiserver v0.0.0-20210429023751-daa555af5040 h1:C1MhgNpIrms8mFJo2/f4432tNRbwHH7skJkXTWJ0Ang= +github.com/openshift/kubernetes/staging/src/k8s.io/apiextensions-apiserver v0.0.0-20210429023751-daa555af5040/go.mod h1:EmNkPboJQXSs97WRpPoGsOitKvL6HtzNpYmsue1IyUw= +github.com/openshift/kubernetes/staging/src/k8s.io/apimachinery v0.0.0-20210429023751-daa555af5040 h1:dmlo5MTiLXBDDTGROmoRQgRfr/YMdmLTV9G6L2pIhwc= +github.com/openshift/kubernetes/staging/src/k8s.io/apimachinery v0.0.0-20210429023751-daa555af5040/go.mod h1:gSj2cuNqX6K8qw99Y4nsqe38hsALEQrBQhKvxhI8K3g= +github.com/openshift/kubernetes/staging/src/k8s.io/apiserver v0.0.0-20210429023751-daa555af5040 h1:Wcpa/YxZiKzS3REcf1sJh85eMSfp9gI1ANZsLPkNEh8= +github.com/openshift/kubernetes/staging/src/k8s.io/apiserver v0.0.0-20210429023751-daa555af5040/go.mod h1:RTtOhn9hZQpX8aIfwYdfKgx99yT3yHOVNc4i0y1s9W0= +github.com/openshift/kubernetes/staging/src/k8s.io/cli-runtime v0.0.0-20210429023751-daa555af5040 h1:J2a/Rx+qgJ4hdbposahFL0K+s8blaWjMpkfiUHK35sA= +github.com/openshift/kubernetes/staging/src/k8s.io/cli-runtime v0.0.0-20210429023751-daa555af5040/go.mod h1:6AKPzWlC3bh+MwEuLhhngoOq4cVo3BFQoTj51TLNn4Q= +github.com/openshift/kubernetes/staging/src/k8s.io/client-go v0.0.0-20210429023751-daa555af5040 h1:OQcBC8CweVnFjsHWsOomINQoEYpJNXiV89c2d7sP8os= +github.com/openshift/kubernetes/staging/src/k8s.io/client-go v0.0.0-20210429023751-daa555af5040/go.mod h1:7cEFT3aaZhYS0NHiDC5lfm81IEzr/DxrfSBrC6YmJJE= +github.com/openshift/kubernetes/staging/src/k8s.io/cloud-provider v0.0.0-20210429023751-daa555af5040 h1:efrQY9SHgfNw7VCbjBrY2bjtFgX3e3DRLG1TDxmGeeM= +github.com/openshift/kubernetes/staging/src/k8s.io/cloud-provider v0.0.0-20210429023751-daa555af5040/go.mod h1:+Ycnvx53+D8QfPrk0Z5wgrSyk0bBVO1Y/DzPXsjZjsU= +github.com/openshift/kubernetes/staging/src/k8s.io/cluster-bootstrap v0.0.0-20210429023751-daa555af5040 h1:KSj3mDKCmtewSaaiJ86VSpV1feBXbArTENFSHGbWcK0= +github.com/openshift/kubernetes/staging/src/k8s.io/cluster-bootstrap v0.0.0-20210429023751-daa555af5040/go.mod h1:60txAiFf+HzsdIr3xT3hvqn+hwKz0cU3hEkeuLmKLQM= +github.com/openshift/kubernetes/staging/src/k8s.io/code-generator v0.0.0-20210429023751-daa555af5040/go.mod h1:VqJOlKNWy84YNR4pdi7DzQ76GSOC96ybvgV6EI65Mto= +github.com/openshift/kubernetes/staging/src/k8s.io/component-base v0.0.0-20210429023751-daa555af5040 h1:8dpHJIFU/GSnrEJcY6yChCt0FSCG3gL7Y3UJ9bLn4vg= +github.com/openshift/kubernetes/staging/src/k8s.io/component-base v0.0.0-20210429023751-daa555af5040/go.mod h1:cT40BvKjtPXiD1o8aoWcaizNlSSJucymSvD8hQ2PowY= +github.com/openshift/kubernetes/staging/src/k8s.io/component-helpers v0.0.0-20210429023751-daa555af5040 h1:pqbrFDnj7CWQygdQGcBmYEWJtJyrvXN9h7L8vBXDLcE= +github.com/openshift/kubernetes/staging/src/k8s.io/component-helpers v0.0.0-20210429023751-daa555af5040/go.mod h1:LhIgv5ljbzvaTBuKgFiv6FcUTg4uQk3/S64e20ikDqE= +github.com/openshift/kubernetes/staging/src/k8s.io/controller-manager v0.0.0-20210429023751-daa555af5040/go.mod h1:0J0SWedetQhd4XcOuZjnrYT4f4iSAY6HqUnoUJ87I8s= +github.com/openshift/kubernetes/staging/src/k8s.io/cri-api v0.0.0-20210429023751-daa555af5040 h1:gOAwv/YNbIND2zfUMlp3Uz+s3Sjpd9Hxr+23N9gPbDI= +github.com/openshift/kubernetes/staging/src/k8s.io/cri-api v0.0.0-20210429023751-daa555af5040/go.mod h1:9zdUgM3lMAO5+g35Vyq3OQdMrylvtV97G7t5emDYCOs= +github.com/openshift/kubernetes/staging/src/k8s.io/csi-translation-lib v0.0.0-20210429023751-daa555af5040 h1:7OsF6Yj41iW0J15zYOWvzDuYlz0cfMUtwfGQoJPmsAs= +github.com/openshift/kubernetes/staging/src/k8s.io/csi-translation-lib v0.0.0-20210429023751-daa555af5040/go.mod h1:juK8ItOGGiCVV3KZh7/Jm/+QJHkzpLEmPg15ovsC5nw= +github.com/openshift/kubernetes/staging/src/k8s.io/kube-aggregator v0.0.0-20210429023751-daa555af5040 h1:2LiKMBv0COdJxPx41tsycImYYb+sXof2SoT54priRz8= +github.com/openshift/kubernetes/staging/src/k8s.io/kube-aggregator v0.0.0-20210429023751-daa555af5040/go.mod h1:iKaOvtiyiqvqZCBfFAoB7pX1fT6i7KwwXdo9gsQhTzY= +github.com/openshift/kubernetes/staging/src/k8s.io/kube-controller-manager v0.0.0-20210429023751-daa555af5040/go.mod h1:+m6UVCDbs8U3U5/Dcp0MuW4KStrCVhQmw4saP1UI4F4= +github.com/openshift/kubernetes/staging/src/k8s.io/kube-proxy v0.0.0-20210429023751-daa555af5040 h1:qSFp3H6Bemu6wCY9tB4pLIq9iNI+IojAoDlnWjIPDow= +github.com/openshift/kubernetes/staging/src/k8s.io/kube-proxy v0.0.0-20210429023751-daa555af5040/go.mod h1:Orfp0jnRIGgoOmRs40Bz9NEGiK0r4FdL3RrnlyAC65o= +github.com/openshift/kubernetes/staging/src/k8s.io/kube-scheduler v0.0.0-20210429023751-daa555af5040 h1:Fklw73qeyUvm+1Jry63zp7KHB2+kz3Fv+/NARbdcYEI= +github.com/openshift/kubernetes/staging/src/k8s.io/kube-scheduler v0.0.0-20210429023751-daa555af5040/go.mod h1:YO8d+vmrdYh9JGJwSYV74UcA1wmXgADrj/I8TlGMmLI= +github.com/openshift/kubernetes/staging/src/k8s.io/kubectl v0.0.0-20210429023751-daa555af5040 h1:XPv/bSQEO4GEMmlZj9MNnv7B5IYPUniKJH6kLbBkbcg= +github.com/openshift/kubernetes/staging/src/k8s.io/kubectl v0.0.0-20210429023751-daa555af5040/go.mod h1:ITnpkr/UFoWTueNMT0SRbFnSJOo+ph9zVlbZMe2IEf0= +github.com/openshift/kubernetes/staging/src/k8s.io/kubelet v0.0.0-20210429023751-daa555af5040 h1:AInoH6qV1DGpkGUTi0yhtOT/O4CdKhYla+Tl41PzQus= +github.com/openshift/kubernetes/staging/src/k8s.io/kubelet v0.0.0-20210429023751-daa555af5040/go.mod h1:ubZB7tOrDLJIcsCvtA15lyNAjLPMml0LUeMm1WVNi80= +github.com/openshift/kubernetes/staging/src/k8s.io/legacy-cloud-providers v0.0.0-20210429023751-daa555af5040 h1:18kwytleuoDQ/k6K9IXe/O1w2xJsmmBqBV1ALMCtXhM= +github.com/openshift/kubernetes/staging/src/k8s.io/legacy-cloud-providers v0.0.0-20210429023751-daa555af5040/go.mod h1:BiwUxtSVqlLdmmK9tHtxamiPyy/17athe9SYSXESVRc= +github.com/openshift/kubernetes/staging/src/k8s.io/metrics v0.0.0-20210429023751-daa555af5040 h1:F+Io53hCfwfER4UrXvz/zdCTeOWBFC9rIFaqdeWRP40= +github.com/openshift/kubernetes/staging/src/k8s.io/metrics v0.0.0-20210429023751-daa555af5040/go.mod h1:R3N6WaOJSt9L2VSYsKFYaz6keliSzDbCbw03STRdEQI= +github.com/openshift/kubernetes/staging/src/k8s.io/mount-utils v0.0.0-20210429023751-daa555af5040 h1:mWwJtjAtVXWp3aQGfQjYewmBlNFExzFdD5K9YOIEg3M= +github.com/openshift/kubernetes/staging/src/k8s.io/mount-utils v0.0.0-20210429023751-daa555af5040/go.mod h1:99KFJSKqMgMvpCWJr4w6ooLZgR+2usWp5GPaILFNq9k= +github.com/openshift/kubernetes/staging/src/k8s.io/sample-apiserver v0.0.0-20210429023751-daa555af5040 h1:5bk3RxNZF2dyAR8UkC3rB1UltI6oUT5FElxSYJU70DA= +github.com/openshift/kubernetes/staging/src/k8s.io/sample-apiserver v0.0.0-20210429023751-daa555af5040/go.mod h1:uRHcGzksxeAsANIOCE+K5vWMaqY9f2Jv68ZkqY0oqRM= +github.com/openshift/library-go v0.0.0-20210331235027-66936e2fcc52/go.mod h1:pnz961veImKsbn7pQcuFbcVpCQosYiC1fUOjzEDeOLU= +github.com/openshift/library-go v0.0.0-20210407092538-7021fda6f427/go.mod h1:pnz961veImKsbn7pQcuFbcVpCQosYiC1fUOjzEDeOLU= +github.com/openshift/library-go v0.0.0-20210420183610-0e395da73318 h1:ib7um2nUXJUHU8QOwqkXXTfXFzPmQUdBhNXXrX8SrfY= +github.com/openshift/library-go v0.0.0-20210420183610-0e395da73318/go.mod h1:pnz961veImKsbn7pQcuFbcVpCQosYiC1fUOjzEDeOLU= github.com/openshift/onsi-ginkgo v4.7.0-origin.0+incompatible h1:6XSBotNi58b4MwVV4F9o/jd4BaQd+uJyz+s5TR0/ot8= github.com/openshift/onsi-ginkgo v4.7.0-origin.0+incompatible/go.mod h1:azqkkH4Vpp9A579CC26hicol/wViXag9rOwElif6v9E= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= @@ -748,14 +755,15 @@ github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdh github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/seccomp/libseccomp-golang v0.9.1 h1:NJjM5DNFOs0s3kYE1WUOr6G8V97sdt46rlXTMfXGWBo= github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= -github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= +github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/assertions v1.1.0 h1:MkTeG1DMwsrdH7QtLXy5W+fUxWq+vmb6cLmyJ7aRtF0= github.com/smartystreets/assertions v1.1.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= @@ -769,6 +777,7 @@ github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +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 v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= @@ -777,6 +786,7 @@ github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJ github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= 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= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= @@ -800,11 +810,10 @@ github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2 h1:b6uOv7YOFK0TYG7HtkIgExQo+2RdLuwRft63jn2HWj8= -github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 h1:kdXcSzyDtseVEc4yCz2qF8ZrQvIDBJLl4S1c3GCXmoI= +github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/thecodeteam/goscaleio v0.1.0 h1:SB5tO98lawC+UK8ds/U2jyfOCH7GTcFztcF5x9gbut4= github.com/thecodeteam/goscaleio v0.1.0/go.mod h1:68sdkZAsK8bvEwBlbQnlLS+xU+hvLYM/iQ8KXej1AwM= -github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 h1:LnC5Kc/wtumK+WB441p7ynQJzVuNRJiqddSIE3IlSEQ= @@ -817,7 +826,6 @@ github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtX github.com/urfave/negroni v1.0.0 h1:kIimOitoypq34K7TG7DUaJ9kq/N4Ofuwi1sjz0KipXc= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= -github.com/vishvananda/netlink v1.0.0/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= github.com/vishvananda/netlink v1.1.0 h1:1iyaYNBLmP6L0220aDnYQpo1QEV4t4hJ+xEEhhJH8j0= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= @@ -825,8 +833,8 @@ github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae h1:4hwBBUfQCFe3C github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= github.com/vmware/govmomi v0.20.3 h1:gpw/0Ku+6RgF3jsi7fnCLmlcikBHfKBCUcu1qgc16OU= github.com/vmware/govmomi v0.20.3/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= -github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243 h1:R43TdZy32XXSXjJn7M/HhALJ9imq6ztLnChfYJpVDnM= -github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= +github.com/willf/bitset v1.1.11 h1:N7Z7E9UvjW+sGsEl7k/SJrvY2reP1A07MrGuCjIOjRE= +github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= github.com/xanzy/ssh-agent v0.2.1 h1:TCbipTQL2JiiCprBWx9frJ2eJlCYT00NmctrHxVAr70= github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= @@ -838,6 +846,8 @@ github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQ github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xlab/handysort v0.0.0-20150421192137-fb3537ed64a1/go.mod h1:QcJo0QPSfTONNIgpN5RA8prR7fF8nkF6cTWTcNerRO8= +github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca h1:1CFlNzQhALwjS9mBAUkycX616GzgsuYUOCHA5+HSlXI= +github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -849,13 +859,14 @@ go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489 h1:1JFLBqwIgdyHN1Zt go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.1.2 h1:jxcFYjlkl8xaERsgLo+RNquI0epW6zuy/ZRQs6jnrFA= go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3 h1:8sGtKOrtQqkN1bp2AtX+misvLIlOmsEsNd+9NIcPEm8= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 h1:+FNtrFTmVw0YZGpBGX56XDee331t6JAXeK2bcyhLOOc= +go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -880,8 +891,9 @@ golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0 h1:hb9wdF1z5waM+dSIICn1l0DkLVDT3hqhhQsDNUmHPRE= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 h1:/ZScEX8SfEmUGRHs0gxpqteO5nfNW6axyZbBdw9A12g= +golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -916,6 +928,7 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -940,6 +953,7 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/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-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= @@ -949,8 +963,10 @@ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b h1:uwuIcX0g4Yl1NC5XAz37xsr2lTtcqevgzYNVt49waME= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210224082022-3d97a244fca7 h1:OgUuv8lsRpBibGNbSizVwKWlysjaNzmC9gYMhPVfqFM= +golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -993,11 +1009,13 @@ golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191115151921-52ab43148777/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-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1013,13 +1031,22 @@ golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201110211018-35f3e6cf4a65/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c h1:VwygUrnw9jn88c4u8GD3rZQbqrP/tgas88tPUbBxQrk= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210216224549-f992740a1bac/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073 h1:8qxJSnu+7dRq6upnbntrmriWByIakBuct5OM/MdQC1M= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/term v0.0.0-20201113234701-d7a72108b828/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d h1:SZxvLBoTP5yHO3Frd4z4vrF+DBX9vMVanchswa69toE= +golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/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.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1031,8 +1058,9 @@ golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxb 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-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e h1:EHBhcS0mlXEAVwNyO2dLfjToGsyY4j24pTs2ScHnX7s= golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba h1:O8mE0/t419eoIwhTFpKVkHiTs/Igowgfkj25AcZrtiE= +golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1065,6 +1093,7 @@ golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtn 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= +golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -1075,7 +1104,7 @@ golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/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-20200616133436-c1934b75d054/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-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0 h1:po9/4sTYwZU9lPhi1tOrb4hCv3qrhiQ77LZfGa2OjwY= @@ -1155,8 +1184,9 @@ gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d h1:TxyelI5cVkbREznMhfzyc 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-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= @@ -1191,48 +1221,55 @@ gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20190905181640-827449938966/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -gotest.tools/v3 v3.0.2 h1:kG1BFyqVHuQoVQiR1bWGnfz/fmHvvuiSPIV7rvl360E= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= +gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= +gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/heapster v1.2.0-beta.1/go.mod h1:h1uhptVXMwC8xtZBYsPXKVi8fpdlYkTs6k949KozGrM= k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.8.0 h1:Q3gmuM9hKEjefWFFYF0Mat+YyFJvsUyYuwyNNJ5C9Ts= k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd h1:sOHNzJIkytDF6qadMNKhhDRpc6ODik8lVC6nOur7B2c= -k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= -k8s.io/system-validators v1.0.4/go.mod h1:HgSgTg4NAGNoYYjKsUyk52gdNi2PVDswQ9Iyn66R7NI= +k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7 h1:vEx13qjvaZ4yfObSSXW7BrMc/KQBBT/Jyee8XtLf4x0= +k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE= +k8s.io/system-validators v1.4.0/go.mod h1:bPldcLgkIUK22ALflnsXk8pvkTEndYdNuaHH6gRrl0Q= k8s.io/utils v0.0.0-20201110183641-67b214c5f920 h1:CbnUZsM497iRC5QMVkHwyl8s2tB3g7yaSHkYPkpgelw= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14 h1:TihvEz9MPj2u0KWds6E2OBUXfwaL4qRJ33c7HGiJpqk= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15 h1:4uqm9Mv+w2MmBYD+F4qf/v6tDFUdPOk29C095RbU5mY= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/controller-tools v0.2.8/go.mod h1:9VKHPszmf2DHz/QmHkcfZoewO6BL7pPs9uAiBVsaJSE= sigs.k8s.io/kube-storage-version-migrator v0.0.3/go.mod h1:mXfSLkx9xbJHQsgNDDUZK/iQTs2tMbx/hsJlWe6Fthw= -sigs.k8s.io/kustomize v2.0.3+incompatible h1:JUufWFNlI44MdtnjUqVnvh29rR37PQFzPbLXqhyOyX0= -sigs.k8s.io/kustomize v2.0.3+incompatible/go.mod h1:MkjgH3RdOWrievjo6c9T245dYlB5QeXV4WCbnt/PEpU= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2 h1:YHQV7Dajm86OuqnIR6zAelnDWBRjo+YhYV9PmGrh1s8= +sigs.k8s.io/kustomize/api v0.8.5 h1:bfCXGXDAbFbb/Jv5AhMj2BB8a5VAJuuQ5/KU69WtDjQ= +sigs.k8s.io/kustomize/api v0.8.5/go.mod h1:M377apnKT5ZHJS++6H4rQoCHmWtt6qTpp3mbe7p6OLY= +sigs.k8s.io/kustomize/cmd/config v0.9.7/go.mod h1:MvXCpHs77cfyxRmCNUQjIqCmZyYsbn5PyQpWiq44nW0= +sigs.k8s.io/kustomize/kustomize/v4 v4.0.5/go.mod h1:C7rYla7sI8EnxHE/xEhRBSHMNfcL91fx0uKmUlUhrBk= +sigs.k8s.io/kustomize/kyaml v0.10.15 h1:dSLgG78KyaxN4HylPXdK+7zB3k7sW6q3IcCmcfKA+aI= +sigs.k8s.io/kustomize/kyaml v0.10.15/go.mod h1:mlQFagmkm1P+W4lZJbJ/yaxMd8PqMRSC4cPcfUVt5Hg= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.1.0 h1:C4r9BgJ98vrKnnVCjwCSXcWjWe0NKcUQkmzDXZXGwH8= +sigs.k8s.io/structured-merge-diff/v4 v4.1.0/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/vendor/github.com/Azure/go-autorest/autorest/authorization.go b/vendor/github.com/Azure/go-autorest/autorest/authorization.go index 15138b642f2e..1226c4111509 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/authorization.go +++ b/vendor/github.com/Azure/go-autorest/autorest/authorization.go @@ -299,18 +299,24 @@ type MultiTenantServicePrincipalTokenAuthorizer interface { // NewMultiTenantServicePrincipalTokenAuthorizer crates a BearerAuthorizer using the given token provider func NewMultiTenantServicePrincipalTokenAuthorizer(tp adal.MultitenantOAuthTokenProvider) MultiTenantServicePrincipalTokenAuthorizer { - return &multiTenantSPTAuthorizer{tp: tp} + return NewMultiTenantBearerAuthorizer(tp) } -type multiTenantSPTAuthorizer struct { +// MultiTenantBearerAuthorizer implements bearer authorization across multiple tenants. +type MultiTenantBearerAuthorizer struct { tp adal.MultitenantOAuthTokenProvider } +// NewMultiTenantBearerAuthorizer creates a MultiTenantBearerAuthorizer using the given token provider. +func NewMultiTenantBearerAuthorizer(tp adal.MultitenantOAuthTokenProvider) *MultiTenantBearerAuthorizer { + return &MultiTenantBearerAuthorizer{tp: tp} +} + // WithAuthorization returns a PrepareDecorator that adds an HTTP Authorization header using the // primary token along with the auxiliary authorization header using the auxiliary tokens. // // By default, the token will be automatically refreshed through the Refresher interface. -func (mt multiTenantSPTAuthorizer) WithAuthorization() PrepareDecorator { +func (mt *MultiTenantBearerAuthorizer) WithAuthorization() PrepareDecorator { return func(p Preparer) Preparer { return PreparerFunc(func(r *http.Request) (*http.Request, error) { r, err := p.Prepare(r) @@ -340,3 +346,8 @@ func (mt multiTenantSPTAuthorizer) WithAuthorization() PrepareDecorator { }) } } + +// TokenProvider returns the underlying MultitenantOAuthTokenProvider for this authorizer. +func (mt *MultiTenantBearerAuthorizer) TokenProvider() adal.MultitenantOAuthTokenProvider { + return mt.tp +} diff --git a/vendor/github.com/Azure/go-autorest/autorest/authorization_sas.go b/vendor/github.com/Azure/go-autorest/autorest/authorization_sas.go index 89a659cb6646..66501493bd6f 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/authorization_sas.go +++ b/vendor/github.com/Azure/go-autorest/autorest/authorization_sas.go @@ -54,13 +54,12 @@ func (sas *SASTokenAuthorizer) WithAuthorization() PrepareDecorator { return r, err } - if r.URL.RawQuery != "" { - r.URL.RawQuery = fmt.Sprintf("%s&%s", r.URL.RawQuery, sas.sasToken) - } else { + if r.URL.RawQuery == "" { r.URL.RawQuery = sas.sasToken + } else if !strings.Contains(r.URL.RawQuery, sas.sasToken) { + r.URL.RawQuery = fmt.Sprintf("%s&%s", r.URL.RawQuery, sas.sasToken) } - r.RequestURI = r.URL.String() return Prepare(r) }) } diff --git a/vendor/github.com/Azure/go-autorest/autorest/authorization_storage.go b/vendor/github.com/Azure/go-autorest/autorest/authorization_storage.go index b844a3df4186..2af5030a1cd7 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/authorization_storage.go +++ b/vendor/github.com/Azure/go-autorest/autorest/authorization_storage.go @@ -152,6 +152,9 @@ func buildCanonicalizedResource(accountName, uri string, keyType SharedKeyType) // the resource's URI should be encoded exactly as it is in the URI. // -- https://msdn.microsoft.com/en-gb/library/azure/dd179428.aspx cr.WriteString(u.EscapedPath()) + } else { + // a slash is required to indicate the root path + cr.WriteString("/") } params, err := url.ParseQuery(u.RawQuery) diff --git a/vendor/github.com/Azure/go-autorest/autorest/azure/async.go b/vendor/github.com/Azure/go-autorest/autorest/azure/async.go index 5326f1fd3b9b..17fb4d8c5251 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/azure/async.go +++ b/vendor/github.com/Azure/go-autorest/autorest/azure/async.go @@ -413,12 +413,12 @@ func (pt *pollingTrackerBase) updateRawBody() error { if err != nil { return autorest.NewErrorWithError(err, "pollingTrackerBase", "updateRawBody", nil, "failed to read response body") } + // put the body back so it's available to other callers + pt.resp.Body = ioutil.NopCloser(bytes.NewReader(b)) // observed in 204 responses over HTTP/2.0; the content length is -1 but body is empty if len(b) == 0 { return nil } - // put the body back so it's available to other callers - pt.resp.Body = ioutil.NopCloser(bytes.NewReader(b)) if err = json.Unmarshal(b, &pt.rawBody); err != nil { return autorest.NewErrorWithError(err, "pollingTrackerBase", "updateRawBody", nil, "failed to unmarshal response body") } @@ -466,7 +466,12 @@ func (pt *pollingTrackerBase) updateErrorFromResponse() { re := respErr{} defer pt.resp.Body.Close() var b []byte - if b, err = ioutil.ReadAll(pt.resp.Body); err != nil || len(b) == 0 { + if b, err = ioutil.ReadAll(pt.resp.Body); err != nil { + goto Default + } + // put the body back so it's available to other callers + pt.resp.Body = ioutil.NopCloser(bytes.NewReader(b)) + if len(b) == 0 { goto Default } if err = json.Unmarshal(b, &re); err != nil { diff --git a/vendor/github.com/Azure/go-autorest/autorest/azure/azure.go b/vendor/github.com/Azure/go-autorest/autorest/azure/azure.go index 26be936b7e5f..a0b969dffa45 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/azure/azure.go +++ b/vendor/github.com/Azure/go-autorest/autorest/azure/azure.go @@ -171,6 +171,11 @@ type Resource struct { ResourceName string } +// String function returns a string in form of azureResourceID +func (r Resource) String() string { + return fmt.Sprintf("/subscriptions/%s/resourceGroups/%s/providers/%s/%s/%s", r.SubscriptionID, r.ResourceGroup, r.Provider, r.ResourceType, r.ResourceName) +} + // ParseResourceID parses a resource ID into a ResourceDetails struct. // See https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-template-functions-resource#return-value-4. func ParseResourceID(resourceID string) (Resource, error) { diff --git a/vendor/github.com/Azure/go-autorest/autorest/azure/environments.go b/vendor/github.com/Azure/go-autorest/autorest/azure/environments.go index faff93275991..9bbc0899e4ce 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/azure/environments.go +++ b/vendor/github.com/Azure/go-autorest/autorest/azure/environments.go @@ -46,6 +46,8 @@ type ResourceIdentifier struct { Batch string `json:"batch"` OperationalInsights string `json:"operationalInsights"` Storage string `json:"storage"` + Synapse string `json:"synapse"` + ServiceBus string `json:"serviceBus"` } // Environment represents a set of endpoints for each of Azure's Clouds. @@ -71,6 +73,8 @@ type Environment struct { ContainerRegistryDNSSuffix string `json:"containerRegistryDNSSuffix"` CosmosDBDNSSuffix string `json:"cosmosDBDNSSuffix"` TokenAudience string `json:"tokenAudience"` + APIManagementHostNameSuffix string `json:"apiManagementHostNameSuffix"` + SynapseEndpointSuffix string `json:"synapseEndpointSuffix"` ResourceIdentifiers ResourceIdentifier `json:"resourceIdentifiers"` } @@ -98,6 +102,8 @@ var ( ContainerRegistryDNSSuffix: "azurecr.io", CosmosDBDNSSuffix: "documents.azure.com", TokenAudience: "https://management.azure.com/", + APIManagementHostNameSuffix: "azure-api.net", + SynapseEndpointSuffix: "dev.azuresynapse.net", ResourceIdentifiers: ResourceIdentifier{ Graph: "https://graph.windows.net/", KeyVault: "https://vault.azure.net", @@ -105,6 +111,8 @@ var ( Batch: "https://batch.core.windows.net/", OperationalInsights: "https://api.loganalytics.io", Storage: "https://storage.azure.com/", + Synapse: "https://dev.azuresynapse.net", + ServiceBus: "https://servicebus.azure.net/", }, } @@ -131,6 +139,8 @@ var ( ContainerRegistryDNSSuffix: "azurecr.us", CosmosDBDNSSuffix: "documents.azure.us", TokenAudience: "https://management.usgovcloudapi.net/", + APIManagementHostNameSuffix: "azure-api.us", + SynapseEndpointSuffix: NotAvailable, ResourceIdentifiers: ResourceIdentifier{ Graph: "https://graph.windows.net/", KeyVault: "https://vault.usgovcloudapi.net", @@ -138,6 +148,8 @@ var ( Batch: "https://batch.core.usgovcloudapi.net/", OperationalInsights: "https://api.loganalytics.us", Storage: "https://storage.azure.com/", + Synapse: NotAvailable, + ServiceBus: "https://servicebus.azure.net/", }, } @@ -164,6 +176,8 @@ var ( ContainerRegistryDNSSuffix: "azurecr.cn", CosmosDBDNSSuffix: "documents.azure.cn", TokenAudience: "https://management.chinacloudapi.cn/", + APIManagementHostNameSuffix: "azure-api.cn", + SynapseEndpointSuffix: "dev.azuresynapse.azure.cn", ResourceIdentifiers: ResourceIdentifier{ Graph: "https://graph.chinacloudapi.cn/", KeyVault: "https://vault.azure.cn", @@ -171,6 +185,8 @@ var ( Batch: "https://batch.chinacloudapi.cn/", OperationalInsights: NotAvailable, Storage: "https://storage.azure.com/", + Synapse: "https://dev.azuresynapse.net", + ServiceBus: "https://servicebus.azure.net/", }, } @@ -197,6 +213,8 @@ var ( ContainerRegistryDNSSuffix: NotAvailable, CosmosDBDNSSuffix: "documents.microsoftazure.de", TokenAudience: "https://management.microsoftazure.de/", + APIManagementHostNameSuffix: NotAvailable, + SynapseEndpointSuffix: NotAvailable, ResourceIdentifiers: ResourceIdentifier{ Graph: "https://graph.cloudapi.de/", KeyVault: "https://vault.microsoftazure.de", @@ -204,6 +222,8 @@ var ( Batch: "https://batch.cloudapi.de/", OperationalInsights: NotAvailable, Storage: "https://storage.azure.com/", + Synapse: NotAvailable, + ServiceBus: "https://servicebus.azure.net/", }, } ) diff --git a/vendor/github.com/Azure/go-autorest/autorest/go.mod b/vendor/github.com/Azure/go-autorest/autorest/go.mod index b66c78da2ccf..75a534f10891 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/go.mod +++ b/vendor/github.com/Azure/go-autorest/autorest/go.mod @@ -4,9 +4,9 @@ go 1.12 require ( github.com/Azure/go-autorest v14.2.0+incompatible - github.com/Azure/go-autorest/autorest/adal v0.9.0 - github.com/Azure/go-autorest/autorest/mocks v0.4.0 + github.com/Azure/go-autorest/autorest/adal v0.9.5 + github.com/Azure/go-autorest/autorest/mocks v0.4.1 github.com/Azure/go-autorest/logger v0.2.0 github.com/Azure/go-autorest/tracing v0.6.0 - golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 + golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0 ) diff --git a/vendor/github.com/Azure/go-autorest/autorest/go.sum b/vendor/github.com/Azure/go-autorest/autorest/go.sum index 96d2ad0fcd86..fa27c68d1051 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/go.sum +++ b/vendor/github.com/Azure/go-autorest/autorest/go.sum @@ -1,21 +1,21 @@ github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest/adal v0.9.0 h1:SigMbuFNuKgc1xcGhaeapbh+8fgsu+GxgDRFyg7f5lM= -github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= +github.com/Azure/go-autorest/autorest/adal v0.9.5 h1:Y3bBUV4rTuxenJJs41HU3qmqsb+auo+a3Lz+PlJPpL0= +github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.0 h1:z20OWOSG5aCye0HEkDp6TPmP17ZcfeMxPi6HnSALa8c= -github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/logger v0.2.0 h1:e4RVHVZKC5p6UANLJHkM4OfR1UKZPj8Wt8Pcx+3oqrE= github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0 h1:hb9wdF1z5waM+dSIICn1l0DkLVDT3hqhhQsDNUmHPRE= +golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= diff --git a/vendor/github.com/Azure/go-autorest/autorest/preparer.go b/vendor/github.com/Azure/go-autorest/autorest/preparer.go index 6e8ed64eba1c..98574a4155fc 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/preparer.go +++ b/vendor/github.com/Azure/go-autorest/autorest/preparer.go @@ -127,10 +127,7 @@ func WithHeader(header string, value string) PrepareDecorator { return PreparerFunc(func(r *http.Request) (*http.Request, error) { r, err := p.Prepare(r) if err == nil { - if r.Header == nil { - r.Header = make(http.Header) - } - r.Header.Set(http.CanonicalHeaderKey(header), value) + setHeader(r, http.CanonicalHeaderKey(header), value) } return r, err }) @@ -230,7 +227,7 @@ func AsPost() PrepareDecorator { return WithMethod("POST") } func AsPut() PrepareDecorator { return WithMethod("PUT") } // WithBaseURL returns a PrepareDecorator that populates the http.Request with a url.URL constructed -// from the supplied baseUrl. +// from the supplied baseUrl. Query parameters will be encoded as required. func WithBaseURL(baseURL string) PrepareDecorator { return func(p Preparer) Preparer { return PreparerFunc(func(r *http.Request) (*http.Request, error) { @@ -241,11 +238,16 @@ func WithBaseURL(baseURL string) PrepareDecorator { return r, err } if u.Scheme == "" { - err = fmt.Errorf("autorest: No scheme detected in URL %s", baseURL) + return r, fmt.Errorf("autorest: No scheme detected in URL %s", baseURL) } - if err == nil { - r.URL = u + if u.RawQuery != "" { + q, err := url.ParseQuery(u.RawQuery) + if err != nil { + return r, err + } + u.RawQuery = q.Encode() } + r.URL = u } return r, err }) @@ -290,10 +292,7 @@ func WithFormData(v url.Values) PrepareDecorator { if err == nil { s := v.Encode() - if r.Header == nil { - r.Header = make(http.Header) - } - r.Header.Set(http.CanonicalHeaderKey(headerContentType), mimeTypeFormPost) + setHeader(r, http.CanonicalHeaderKey(headerContentType), mimeTypeFormPost) r.ContentLength = int64(len(s)) r.Body = ioutil.NopCloser(strings.NewReader(s)) } @@ -329,10 +328,7 @@ func WithMultiPartFormData(formDataParameters map[string]interface{}) PrepareDec if err = writer.Close(); err != nil { return r, err } - if r.Header == nil { - r.Header = make(http.Header) - } - r.Header.Set(http.CanonicalHeaderKey(headerContentType), writer.FormDataContentType()) + setHeader(r, http.CanonicalHeaderKey(headerContentType), writer.FormDataContentType()) r.Body = ioutil.NopCloser(bytes.NewReader(body.Bytes())) r.ContentLength = int64(body.Len()) return r, err @@ -437,6 +433,7 @@ func WithXML(v interface{}) PrepareDecorator { bytesWithHeader := []byte(withHeader) r.ContentLength = int64(len(bytesWithHeader)) + setHeader(r, headerContentLength, fmt.Sprintf("%d", len(bytesWithHeader))) r.Body = ioutil.NopCloser(bytes.NewReader(bytesWithHeader)) } } diff --git a/vendor/github.com/Azure/go-autorest/autorest/sender.go b/vendor/github.com/Azure/go-autorest/autorest/sender.go index 704f3e55e084..78610ef20441 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/sender.go +++ b/vendor/github.com/Azure/go-autorest/autorest/sender.go @@ -23,11 +23,29 @@ import ( "net/http" "net/http/cookiejar" "strconv" + "sync" "time" "github.com/Azure/go-autorest/tracing" ) +// there is one sender per TLS renegotiation type, i.e. count of tls.RenegotiationSupport enums +const defaultSendersCount = 3 + +type defaultSender struct { + sender Sender + init *sync.Once +} + +// each type of sender will be created on demand in sender() +var defaultSenders [defaultSendersCount]defaultSender + +func init() { + for i := 0; i < defaultSendersCount; i++ { + defaultSenders[i].init = &sync.Once{} + } +} + // used as a key type in context.WithValue() type ctxSendDecorators struct{} @@ -107,26 +125,31 @@ func SendWithSender(s Sender, r *http.Request, decorators ...SendDecorator) (*ht } func sender(renengotiation tls.RenegotiationSupport) Sender { - // Use behaviour compatible with DefaultTransport, but require TLS minimum version. - defaultTransport := http.DefaultTransport.(*http.Transport) - transport := &http.Transport{ - Proxy: defaultTransport.Proxy, - DialContext: defaultTransport.DialContext, - MaxIdleConns: defaultTransport.MaxIdleConns, - IdleConnTimeout: defaultTransport.IdleConnTimeout, - TLSHandshakeTimeout: defaultTransport.TLSHandshakeTimeout, - ExpectContinueTimeout: defaultTransport.ExpectContinueTimeout, - TLSClientConfig: &tls.Config{ - MinVersion: tls.VersionTLS12, - Renegotiation: renengotiation, - }, - } - var roundTripper http.RoundTripper = transport - if tracing.IsEnabled() { - roundTripper = tracing.NewTransport(transport) - } - j, _ := cookiejar.New(nil) - return &http.Client{Jar: j, Transport: roundTripper} + // note that we can't init defaultSenders in init() since it will + // execute before calling code has had a chance to enable tracing + defaultSenders[renengotiation].init.Do(func() { + // Use behaviour compatible with DefaultTransport, but require TLS minimum version. + defaultTransport := http.DefaultTransport.(*http.Transport) + transport := &http.Transport{ + Proxy: defaultTransport.Proxy, + DialContext: defaultTransport.DialContext, + MaxIdleConns: defaultTransport.MaxIdleConns, + IdleConnTimeout: defaultTransport.IdleConnTimeout, + TLSHandshakeTimeout: defaultTransport.TLSHandshakeTimeout, + ExpectContinueTimeout: defaultTransport.ExpectContinueTimeout, + TLSClientConfig: &tls.Config{ + MinVersion: tls.VersionTLS12, + Renegotiation: renengotiation, + }, + } + var roundTripper http.RoundTripper = transport + if tracing.IsEnabled() { + roundTripper = tracing.NewTransport(transport) + } + j, _ := cookiejar.New(nil) + defaultSenders[renengotiation].sender = &http.Client{Jar: j, Transport: roundTripper} + }) + return defaultSenders[renengotiation].sender } // AfterDelay returns a SendDecorator that delays for the passed time.Duration before diff --git a/vendor/github.com/Azure/go-autorest/autorest/utility.go b/vendor/github.com/Azure/go-autorest/autorest/utility.go index 67baab2cee24..416041c3f333 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/utility.go +++ b/vendor/github.com/Azure/go-autorest/autorest/utility.go @@ -237,3 +237,10 @@ func DrainResponseBody(resp *http.Response) error { } return nil } + +func setHeader(r *http.Request, key, value string) { + if r.Header == nil { + r.Header = make(http.Header) + } + r.Header.Set(key, value) +} diff --git a/vendor/github.com/Microsoft/go-winio/go.mod b/vendor/github.com/Microsoft/go-winio/go.mod index 50b9d6e2ec60..a2eb6496cf8b 100644 --- a/vendor/github.com/Microsoft/go-winio/go.mod +++ b/vendor/github.com/Microsoft/go-winio/go.mod @@ -3,7 +3,7 @@ module github.com/Microsoft/go-winio go 1.12 require ( - github.com/pkg/errors v0.8.1 + github.com/pkg/errors v0.9.1 github.com/sirupsen/logrus v1.4.1 golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3 ) diff --git a/vendor/github.com/Microsoft/go-winio/go.sum b/vendor/github.com/Microsoft/go-winio/go.sum index 209aa8cf4d85..6da76a492eea 100644 --- a/vendor/github.com/Microsoft/go-winio/go.sum +++ b/vendor/github.com/Microsoft/go-winio/go.sum @@ -2,8 +2,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/sirupsen/logrus v1.4.1 h1:GL2rEmy6nsikmW0r8opw9JIRScdMF5hA8cOYLH7In1k= @@ -12,7 +12,5 @@ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b h1:ag/x1USPSsqHud38I9BAC88qdNLDHHtQ4mlgQIZPPNA= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3 h1:7TYNF4UdlohbFwpNH04CoPMp1cHUZgO1Ebq5r2hIjfo= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/vendor/github.com/Microsoft/go-winio/pipe.go b/vendor/github.com/Microsoft/go-winio/pipe.go index ff96dff1c6cd..96700a73de25 100644 --- a/vendor/github.com/Microsoft/go-winio/pipe.go +++ b/vendor/github.com/Microsoft/go-winio/pipe.go @@ -429,10 +429,10 @@ type PipeConfig struct { // when the pipe is in message mode. MessageMode bool - // InputBufferSize specifies the size the input buffer, in bytes. + // InputBufferSize specifies the size of the input buffer, in bytes. InputBufferSize int32 - // OutputBufferSize specifies the size the input buffer, in bytes. + // OutputBufferSize specifies the size of the output buffer, in bytes. OutputBufferSize int32 } diff --git a/vendor/github.com/Microsoft/go-winio/pkg/security/grantvmgroupaccess.go b/vendor/github.com/Microsoft/go-winio/pkg/security/grantvmgroupaccess.go new file mode 100644 index 000000000000..2df31b660185 --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/pkg/security/grantvmgroupaccess.go @@ -0,0 +1,159 @@ +package security + +import ( + "os" + "syscall" + "unsafe" + + "github.com/pkg/errors" +) + +type ( + accessMask uint32 + accessMode uint32 + desiredAccess uint32 + inheritMode uint32 + objectType uint32 + shareMode uint32 + securityInformation uint32 + trusteeForm uint32 + trusteeType uint32 + + explicitAccess struct { + accessPermissions accessMask + accessMode accessMode + inheritance inheritMode + trustee trustee + } + + trustee struct { + multipleTrustee *trustee + multipleTrusteeOperation int32 + trusteeForm trusteeForm + trusteeType trusteeType + name uintptr + } +) + +const ( + accessMaskDesiredPermission accessMask = 1 << 31 // GENERIC_READ + + accessModeGrant accessMode = 1 + + desiredAccessReadControl desiredAccess = 0x20000 + desiredAccessWriteDac desiredAccess = 0x40000 + + gvmga = "GrantVmGroupAccess:" + + inheritModeNoInheritance inheritMode = 0x0 + inheritModeSubContainersAndObjectsInherit inheritMode = 0x3 + + objectTypeFileObject objectType = 0x1 + + securityInformationDACL securityInformation = 0x4 + + shareModeRead shareMode = 0x1 + shareModeWrite shareMode = 0x2 + + sidVmGroup = "S-1-5-83-0" + + trusteeFormIsSid trusteeForm = 0 + + trusteeTypeWellKnownGroup trusteeType = 5 +) + +// GrantVMGroupAccess sets the DACL for a specified file or directory to +// include Grant ACE entries for the VM Group SID. This is a golang re- +// implementation of the same function in vmcompute, just not exported in +// RS5. Which kind of sucks. Sucks a lot :/ +func GrantVmGroupAccess(name string) error { + // Stat (to determine if `name` is a directory). + s, err := os.Stat(name) + if err != nil { + return errors.Wrapf(err, "%s os.Stat %s", gvmga, name) + } + + // Get a handle to the file/directory. Must defer Close on success. + fd, err := createFile(name, s.IsDir()) + if err != nil { + return err // Already wrapped + } + defer syscall.CloseHandle(fd) + + // Get the current DACL and Security Descriptor. Must defer LocalFree on success. + ot := objectTypeFileObject + si := securityInformationDACL + sd := uintptr(0) + origDACL := uintptr(0) + if err := getSecurityInfo(fd, uint32(ot), uint32(si), nil, nil, &origDACL, nil, &sd); err != nil { + return errors.Wrapf(err, "%s GetSecurityInfo %s", gvmga, name) + } + defer syscall.LocalFree((syscall.Handle)(unsafe.Pointer(sd))) + + // Generate a new DACL which is the current DACL with the required ACEs added. + // Must defer LocalFree on success. + newDACL, err := generateDACLWithAcesAdded(name, s.IsDir(), origDACL) + if err != nil { + return err // Already wrapped + } + defer syscall.LocalFree((syscall.Handle)(unsafe.Pointer(newDACL))) + + // And finally use SetSecurityInfo to apply the updated DACL. + if err := setSecurityInfo(fd, uint32(ot), uint32(si), uintptr(0), uintptr(0), newDACL, uintptr(0)); err != nil { + return errors.Wrapf(err, "%s SetSecurityInfo %s", gvmga, name) + } + + return nil +} + +// createFile is a helper function to call [Nt]CreateFile to get a handle to +// the file or directory. +func createFile(name string, isDir bool) (syscall.Handle, error) { + namep := syscall.StringToUTF16(name) + da := uint32(desiredAccessReadControl | desiredAccessWriteDac) + sm := uint32(shareModeRead | shareModeWrite) + fa := uint32(syscall.FILE_ATTRIBUTE_NORMAL) + if isDir { + fa = uint32(fa | syscall.FILE_FLAG_BACKUP_SEMANTICS) + } + fd, err := syscall.CreateFile(&namep[0], da, sm, nil, syscall.OPEN_EXISTING, fa, 0) + if err != nil { + return 0, errors.Wrapf(err, "%s syscall.CreateFile %s", gvmga, name) + } + return fd, nil +} + +// generateDACLWithAcesAdded generates a new DACL with the two needed ACEs added. +// The caller is responsible for LocalFree of the returned DACL on success. +func generateDACLWithAcesAdded(name string, isDir bool, origDACL uintptr) (uintptr, error) { + // Generate pointers to the SIDs based on the string SIDs + sid, err := syscall.StringToSid(sidVmGroup) + if err != nil { + return 0, errors.Wrapf(err, "%s syscall.StringToSid %s %s", gvmga, name, sidVmGroup) + } + + inheritance := inheritModeNoInheritance + if isDir { + inheritance = inheritModeSubContainersAndObjectsInherit + } + + eaArray := []explicitAccess{ + explicitAccess{ + accessPermissions: accessMaskDesiredPermission, + accessMode: accessModeGrant, + inheritance: inheritance, + trustee: trustee{ + trusteeForm: trusteeFormIsSid, + trusteeType: trusteeTypeWellKnownGroup, + name: uintptr(unsafe.Pointer(sid)), + }, + }, + } + + modifiedDACL := uintptr(0) + if err := setEntriesInAcl(uintptr(uint32(1)), uintptr(unsafe.Pointer(&eaArray[0])), origDACL, &modifiedDACL); err != nil { + return 0, errors.Wrapf(err, "%s SetEntriesInAcl %s", gvmga, name) + } + + return modifiedDACL, nil +} diff --git a/vendor/github.com/Microsoft/go-winio/pkg/security/syscall_windows.go b/vendor/github.com/Microsoft/go-winio/pkg/security/syscall_windows.go new file mode 100644 index 000000000000..c40c2739b7c6 --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/pkg/security/syscall_windows.go @@ -0,0 +1,7 @@ +package security + +//go:generate go run mksyscall_windows.go -output zsyscall_windows.go syscall_windows.go + +//sys getSecurityInfo(handle syscall.Handle, objectType uint32, si uint32, ppsidOwner **uintptr, ppsidGroup **uintptr, ppDacl *uintptr, ppSacl *uintptr, ppSecurityDescriptor *uintptr) (err error) [failretval!=0] = advapi32.GetSecurityInfo +//sys setSecurityInfo(handle syscall.Handle, objectType uint32, si uint32, psidOwner uintptr, psidGroup uintptr, pDacl uintptr, pSacl uintptr) (err error) [failretval!=0] = advapi32.SetSecurityInfo +//sys setEntriesInAcl(count uintptr, pListOfEEs uintptr, oldAcl uintptr, newAcl *uintptr) (err error) [failretval!=0] = advapi32.SetEntriesInAclW diff --git a/vendor/github.com/Microsoft/go-winio/pkg/security/zsyscall_windows.go b/vendor/github.com/Microsoft/go-winio/pkg/security/zsyscall_windows.go new file mode 100644 index 000000000000..0f0c0deff231 --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/pkg/security/zsyscall_windows.go @@ -0,0 +1,81 @@ +// Code generated mksyscall_windows.exe DO NOT EDIT + +package security + +import ( + "syscall" + "unsafe" + + "golang.org/x/sys/windows" +) + +var _ unsafe.Pointer + +// Do the interface allocations only once for common +// Errno values. +const ( + errnoERROR_IO_PENDING = 997 +) + +var ( + errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) +) + +// errnoErr returns common boxed Errno values, to prevent +// allocations at runtime. +func errnoErr(e syscall.Errno) error { + switch e { + case 0: + return nil + case errnoERROR_IO_PENDING: + return errERROR_IO_PENDING + } + // TODO: add more here, after collecting data on the common + // error values see on Windows. (perhaps when running + // all.bat?) + return e +} + +var ( + modadvapi32 = windows.NewLazySystemDLL("advapi32.dll") + + procGetSecurityInfo = modadvapi32.NewProc("GetSecurityInfo") + procSetSecurityInfo = modadvapi32.NewProc("SetSecurityInfo") + procSetEntriesInAclW = modadvapi32.NewProc("SetEntriesInAclW") +) + +func getSecurityInfo(handle syscall.Handle, objectType uint32, si uint32, ppsidOwner **uintptr, ppsidGroup **uintptr, ppDacl *uintptr, ppSacl *uintptr, ppSecurityDescriptor *uintptr) (err error) { + r1, _, e1 := syscall.Syscall9(procGetSecurityInfo.Addr(), 8, uintptr(handle), uintptr(objectType), uintptr(si), uintptr(unsafe.Pointer(ppsidOwner)), uintptr(unsafe.Pointer(ppsidGroup)), uintptr(unsafe.Pointer(ppDacl)), uintptr(unsafe.Pointer(ppSacl)), uintptr(unsafe.Pointer(ppSecurityDescriptor)), 0) + if r1 != 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func setSecurityInfo(handle syscall.Handle, objectType uint32, si uint32, psidOwner uintptr, psidGroup uintptr, pDacl uintptr, pSacl uintptr) (err error) { + r1, _, e1 := syscall.Syscall9(procSetSecurityInfo.Addr(), 7, uintptr(handle), uintptr(objectType), uintptr(si), uintptr(psidOwner), uintptr(psidGroup), uintptr(pDacl), uintptr(pSacl), 0, 0) + if r1 != 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func setEntriesInAcl(count uintptr, pListOfEEs uintptr, oldAcl uintptr, newAcl *uintptr) (err error) { + r1, _, e1 := syscall.Syscall6(procSetEntriesInAclW.Addr(), 4, uintptr(count), uintptr(pListOfEEs), uintptr(oldAcl), uintptr(unsafe.Pointer(newAcl)), 0, 0) + if r1 != 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} diff --git a/vendor/github.com/Microsoft/go-winio/vhd/vhd.go b/vendor/github.com/Microsoft/go-winio/vhd/vhd.go index 229ac25565a5..91083a38806b 100644 --- a/vendor/github.com/Microsoft/go-winio/vhd/vhd.go +++ b/vendor/github.com/Microsoft/go-winio/vhd/vhd.go @@ -2,150 +2,323 @@ package vhd -import "syscall" +import ( + "fmt" + "syscall" + + "github.com/Microsoft/go-winio/pkg/guid" + "github.com/pkg/errors" + "golang.org/x/sys/windows" +) //go:generate go run mksyscall_windows.go -output zvhd.go vhd.go -//sys createVirtualDisk(virtualStorageType *virtualStorageType, path string, virtualDiskAccessMask uint32, securityDescriptor *uintptr, flags uint32, providerSpecificFlags uint32, parameters *createVirtualDiskParameters, o *syscall.Overlapped, handle *syscall.Handle) (err error) [failretval != 0] = VirtDisk.CreateVirtualDisk -//sys openVirtualDisk(virtualStorageType *virtualStorageType, path string, virtualDiskAccessMask uint32, flags uint32, parameters *openVirtualDiskParameters, handle *syscall.Handle) (err error) [failretval != 0] = VirtDisk.OpenVirtualDisk -//sys detachVirtualDisk(handle syscall.Handle, flags uint32, providerSpecificFlags uint32) (err error) [failretval != 0] = VirtDisk.DetachVirtualDisk - -type virtualStorageType struct { - DeviceID uint32 - VendorID [16]byte -} +//sys createVirtualDisk(virtualStorageType *VirtualStorageType, path string, virtualDiskAccessMask uint32, securityDescriptor *uintptr, createVirtualDiskFlags uint32, providerSpecificFlags uint32, parameters *CreateVirtualDiskParameters, overlapped *syscall.Overlapped, handle *syscall.Handle) (err error) [failretval != 0] = virtdisk.CreateVirtualDisk +//sys openVirtualDisk(virtualStorageType *VirtualStorageType, path string, virtualDiskAccessMask uint32, openVirtualDiskFlags uint32, parameters *OpenVirtualDiskParameters, handle *syscall.Handle) (err error) [failretval != 0] = virtdisk.OpenVirtualDisk +//sys attachVirtualDisk(handle syscall.Handle, securityDescriptor *uintptr, attachVirtualDiskFlag uint32, providerSpecificFlags uint32, parameters *AttachVirtualDiskParameters, overlapped *syscall.Overlapped) (err error) [failretval != 0] = virtdisk.AttachVirtualDisk +//sys detachVirtualDisk(handle syscall.Handle, detachVirtualDiskFlags uint32, providerSpecificFlags uint32) (err error) [failretval != 0] = virtdisk.DetachVirtualDisk +//sys getVirtualDiskPhysicalPath(handle syscall.Handle, diskPathSizeInBytes *uint32, buffer *uint16) (err error) [failretval != 0] = virtdisk.GetVirtualDiskPhysicalPath type ( - createVirtualDiskFlag uint32 - VirtualDiskAccessMask uint32 + CreateVirtualDiskFlag uint32 VirtualDiskFlag uint32 + AttachVirtualDiskFlag uint32 + DetachVirtualDiskFlag uint32 + VirtualDiskAccessMask uint32 ) -const ( - // Flags for creating a VHD (not exported) - createVirtualDiskFlagNone createVirtualDiskFlag = 0 - createVirtualDiskFlagFullPhysicalAllocation createVirtualDiskFlag = 1 - createVirtualDiskFlagPreventWritesToSourceDisk createVirtualDiskFlag = 2 - createVirtualDiskFlagDoNotCopyMetadataFromParent createVirtualDiskFlag = 4 - - // Access Mask for opening a VHD - VirtualDiskAccessNone VirtualDiskAccessMask = 0 - VirtualDiskAccessAttachRO VirtualDiskAccessMask = 65536 - VirtualDiskAccessAttachRW VirtualDiskAccessMask = 131072 - VirtualDiskAccessDetach VirtualDiskAccessMask = 262144 - VirtualDiskAccessGetInfo VirtualDiskAccessMask = 524288 - VirtualDiskAccessCreate VirtualDiskAccessMask = 1048576 - VirtualDiskAccessMetaOps VirtualDiskAccessMask = 2097152 - VirtualDiskAccessRead VirtualDiskAccessMask = 851968 - VirtualDiskAccessAll VirtualDiskAccessMask = 4128768 - VirtualDiskAccessWritable VirtualDiskAccessMask = 3276800 - - // Flags for opening a VHD - OpenVirtualDiskFlagNone VirtualDiskFlag = 0 - OpenVirtualDiskFlagNoParents VirtualDiskFlag = 0x1 - OpenVirtualDiskFlagBlankFile VirtualDiskFlag = 0x2 - OpenVirtualDiskFlagBootDrive VirtualDiskFlag = 0x4 - OpenVirtualDiskFlagCachedIO VirtualDiskFlag = 0x8 - OpenVirtualDiskFlagCustomDiffChain VirtualDiskFlag = 0x10 - OpenVirtualDiskFlagParentCachedIO VirtualDiskFlag = 0x20 - OpenVirtualDiskFlagVhdSetFileOnly VirtualDiskFlag = 0x40 - OpenVirtualDiskFlagIgnoreRelativeParentLocator VirtualDiskFlag = 0x80 - OpenVirtualDiskFlagNoWriteHardening VirtualDiskFlag = 0x100 -) +type VirtualStorageType struct { + DeviceID uint32 + VendorID guid.GUID +} -type createVersion2 struct { - UniqueID [16]byte // GUID +type CreateVersion2 struct { + UniqueID guid.GUID MaximumSize uint64 BlockSizeInBytes uint32 SectorSizeInBytes uint32 + PhysicalSectorSizeInByte uint32 ParentPath *uint16 // string SourcePath *uint16 // string OpenFlags uint32 - ParentVirtualStorageType virtualStorageType - SourceVirtualStorageType virtualStorageType - ResiliencyGUID [16]byte // GUID + ParentVirtualStorageType VirtualStorageType + SourceVirtualStorageType VirtualStorageType + ResiliencyGUID guid.GUID } -type createVirtualDiskParameters struct { +type CreateVirtualDiskParameters struct { Version uint32 // Must always be set to 2 - Version2 createVersion2 + Version2 CreateVersion2 } -type openVersion2 struct { - GetInfoOnly int32 // bool but 4-byte aligned - ReadOnly int32 // bool but 4-byte aligned - ResiliencyGUID [16]byte // GUID +type OpenVersion2 struct { + GetInfoOnly bool + ReadOnly bool + ResiliencyGUID guid.GUID } -type openVirtualDiskParameters struct { +type OpenVirtualDiskParameters struct { Version uint32 // Must always be set to 2 - Version2 openVersion2 + Version2 OpenVersion2 } -// CreateVhdx will create a simple vhdx file at the given path using default values. -func CreateVhdx(path string, maxSizeInGb, blockSizeInMb uint32) error { - var ( - defaultType virtualStorageType - handle syscall.Handle - ) +type AttachVersion2 struct { + RestrictedOffset uint64 + RestrictedLength uint64 +} + +type AttachVirtualDiskParameters struct { + Version uint32 // Must always be set to 2 + Version2 AttachVersion2 +} + +const ( + VIRTUAL_STORAGE_TYPE_DEVICE_VHDX = 0x3 + + // Access Mask for opening a VHD + VirtualDiskAccessNone VirtualDiskAccessMask = 0x00000000 + VirtualDiskAccessAttachRO VirtualDiskAccessMask = 0x00010000 + VirtualDiskAccessAttachRW VirtualDiskAccessMask = 0x00020000 + VirtualDiskAccessDetach VirtualDiskAccessMask = 0x00040000 + VirtualDiskAccessGetInfo VirtualDiskAccessMask = 0x00080000 + VirtualDiskAccessCreate VirtualDiskAccessMask = 0x00100000 + VirtualDiskAccessMetaOps VirtualDiskAccessMask = 0x00200000 + VirtualDiskAccessRead VirtualDiskAccessMask = 0x000d0000 + VirtualDiskAccessAll VirtualDiskAccessMask = 0x003f0000 + VirtualDiskAccessWritable VirtualDiskAccessMask = 0x00320000 - parameters := createVirtualDiskParameters{ + // Flags for creating a VHD + CreateVirtualDiskFlagNone CreateVirtualDiskFlag = 0x0 + CreateVirtualDiskFlagFullPhysicalAllocation CreateVirtualDiskFlag = 0x1 + CreateVirtualDiskFlagPreventWritesToSourceDisk CreateVirtualDiskFlag = 0x2 + CreateVirtualDiskFlagDoNotCopyMetadataFromParent CreateVirtualDiskFlag = 0x4 + CreateVirtualDiskFlagCreateBackingStorage CreateVirtualDiskFlag = 0x8 + CreateVirtualDiskFlagUseChangeTrackingSourceLimit CreateVirtualDiskFlag = 0x10 + CreateVirtualDiskFlagPreserveParentChangeTrackingState CreateVirtualDiskFlag = 0x20 + CreateVirtualDiskFlagVhdSetUseOriginalBackingStorage CreateVirtualDiskFlag = 0x40 + CreateVirtualDiskFlagSparseFile CreateVirtualDiskFlag = 0x80 + CreateVirtualDiskFlagPmemCompatible CreateVirtualDiskFlag = 0x100 + CreateVirtualDiskFlagSupportCompressedVolumes CreateVirtualDiskFlag = 0x200 + + // Flags for opening a VHD + OpenVirtualDiskFlagNone VirtualDiskFlag = 0x00000000 + OpenVirtualDiskFlagNoParents VirtualDiskFlag = 0x00000001 + OpenVirtualDiskFlagBlankFile VirtualDiskFlag = 0x00000002 + OpenVirtualDiskFlagBootDrive VirtualDiskFlag = 0x00000004 + OpenVirtualDiskFlagCachedIO VirtualDiskFlag = 0x00000008 + OpenVirtualDiskFlagCustomDiffChain VirtualDiskFlag = 0x00000010 + OpenVirtualDiskFlagParentCachedIO VirtualDiskFlag = 0x00000020 + OpenVirtualDiskFlagVhdsetFileOnly VirtualDiskFlag = 0x00000040 + OpenVirtualDiskFlagIgnoreRelativeParentLocator VirtualDiskFlag = 0x00000080 + OpenVirtualDiskFlagNoWriteHardening VirtualDiskFlag = 0x00000100 + OpenVirtualDiskFlagSupportCompressedVolumes VirtualDiskFlag = 0x00000200 + + // Flags for attaching a VHD + AttachVirtualDiskFlagNone AttachVirtualDiskFlag = 0x00000000 + AttachVirtualDiskFlagReadOnly AttachVirtualDiskFlag = 0x00000001 + AttachVirtualDiskFlagNoDriveLetter AttachVirtualDiskFlag = 0x00000002 + AttachVirtualDiskFlagPermanentLifetime AttachVirtualDiskFlag = 0x00000004 + AttachVirtualDiskFlagNoLocalHost AttachVirtualDiskFlag = 0x00000008 + AttachVirtualDiskFlagNoSecurityDescriptor AttachVirtualDiskFlag = 0x00000010 + AttachVirtualDiskFlagBypassDefaultEncryptionPolicy AttachVirtualDiskFlag = 0x00000020 + AttachVirtualDiskFlagNonPnp AttachVirtualDiskFlag = 0x00000040 + AttachVirtualDiskFlagRestrictedRange AttachVirtualDiskFlag = 0x00000080 + AttachVirtualDiskFlagSinglePartition AttachVirtualDiskFlag = 0x00000100 + AttachVirtualDiskFlagRegisterVolume AttachVirtualDiskFlag = 0x00000200 + + // Flags for detaching a VHD + DetachVirtualDiskFlagNone DetachVirtualDiskFlag = 0x0 +) + +// CreateVhdx is a helper function to create a simple vhdx file at the given path using +// default values. +func CreateVhdx(path string, maxSizeInGb, blockSizeInMb uint32) error { + params := CreateVirtualDiskParameters{ Version: 2, - Version2: createVersion2{ + Version2: CreateVersion2{ MaximumSize: uint64(maxSizeInGb) * 1024 * 1024 * 1024, BlockSizeInBytes: blockSizeInMb * 1024 * 1024, }, } - if err := createVirtualDisk( - &defaultType, - path, - uint32(VirtualDiskAccessNone), - nil, - uint32(createVirtualDiskFlagNone), - 0, - ¶meters, - nil, - &handle); err != nil { + handle, err := CreateVirtualDisk(path, VirtualDiskAccessNone, CreateVirtualDiskFlagNone, ¶ms) + if err != nil { return err } if err := syscall.CloseHandle(handle); err != nil { return err } + return nil +} +// DetachVirtualDisk detaches a virtual hard disk by handle. +func DetachVirtualDisk(handle syscall.Handle) (err error) { + if err := detachVirtualDisk(handle, 0, 0); err != nil { + return errors.Wrap(err, "failed to detach virtual disk") + } return nil } -// DetachVhd detaches a mounted container layer vhd found at `path`. +// DetachVhd detaches a vhd found at `path`. func DetachVhd(path string) error { handle, err := OpenVirtualDisk( path, VirtualDiskAccessNone, - OpenVirtualDiskFlagCachedIO|OpenVirtualDiskFlagIgnoreRelativeParentLocator) + OpenVirtualDiskFlagCachedIO|OpenVirtualDiskFlagIgnoreRelativeParentLocator, + ) + if err != nil { + return err + } + defer syscall.CloseHandle(handle) + return DetachVirtualDisk(handle) +} + +// AttachVirtualDisk attaches a virtual hard disk for use. +func AttachVirtualDisk(handle syscall.Handle, attachVirtualDiskFlag AttachVirtualDiskFlag, parameters *AttachVirtualDiskParameters) (err error) { + if parameters.Version != 2 { + return fmt.Errorf("only version 2 VHDs are supported, found version: %d", parameters.Version) + } + if err := attachVirtualDisk( + handle, + nil, + uint32(attachVirtualDiskFlag), + 0, + parameters, + nil, + ); err != nil { + return errors.Wrap(err, "failed to attach virtual disk") + } + return nil +} +// AttachVhd attaches a virtual hard disk at `path` for use. +func AttachVhd(path string) (err error) { + handle, err := OpenVirtualDisk( + path, + VirtualDiskAccessNone, + OpenVirtualDiskFlagCachedIO|OpenVirtualDiskFlagIgnoreRelativeParentLocator, + ) if err != nil { return err } + defer syscall.CloseHandle(handle) - return detachVirtualDisk(handle, 0, 0) + params := AttachVirtualDiskParameters{Version: 2} + if err := AttachVirtualDisk( + handle, + AttachVirtualDiskFlagNone, + ¶ms, + ); err != nil { + return errors.Wrap(err, "failed to attach virtual disk") + } + return nil } // OpenVirtualDisk obtains a handle to a VHD opened with supplied access mask and flags. -func OpenVirtualDisk(path string, accessMask VirtualDiskAccessMask, flag VirtualDiskFlag) (syscall.Handle, error) { +func OpenVirtualDisk(vhdPath string, virtualDiskAccessMask VirtualDiskAccessMask, openVirtualDiskFlags VirtualDiskFlag) (syscall.Handle, error) { + parameters := OpenVirtualDiskParameters{Version: 2} + handle, err := OpenVirtualDiskWithParameters( + vhdPath, + virtualDiskAccessMask, + openVirtualDiskFlags, + ¶meters, + ) + if err != nil { + return 0, err + } + return handle, nil +} + +// OpenVirtualDiskWithParameters obtains a handle to a VHD opened with supplied access mask, flags and parameters. +func OpenVirtualDiskWithParameters(vhdPath string, virtualDiskAccessMask VirtualDiskAccessMask, openVirtualDiskFlags VirtualDiskFlag, parameters *OpenVirtualDiskParameters) (syscall.Handle, error) { var ( - defaultType virtualStorageType handle syscall.Handle + defaultType VirtualStorageType ) - parameters := openVirtualDiskParameters{Version: 2} + if parameters.Version != 2 { + return handle, fmt.Errorf("only version 2 VHDs are supported, found version: %d", parameters.Version) + } if err := openVirtualDisk( + &defaultType, + vhdPath, + uint32(virtualDiskAccessMask), + uint32(openVirtualDiskFlags), + parameters, + &handle, + ); err != nil { + return 0, errors.Wrap(err, "failed to open virtual disk") + } + return handle, nil +} + +// CreateVirtualDisk creates a virtual harddisk and returns a handle to the disk. +func CreateVirtualDisk(path string, virtualDiskAccessMask VirtualDiskAccessMask, createVirtualDiskFlags CreateVirtualDiskFlag, parameters *CreateVirtualDiskParameters) (syscall.Handle, error) { + var ( + handle syscall.Handle + defaultType VirtualStorageType + ) + if parameters.Version != 2 { + return handle, fmt.Errorf("only version 2 VHDs are supported, found version: %d", parameters.Version) + } + + if err := createVirtualDisk( &defaultType, path, - uint32(accessMask), - uint32(flag), - ¶meters, - &handle); err != nil { - return 0, err + uint32(virtualDiskAccessMask), + nil, + uint32(createVirtualDiskFlags), + 0, + parameters, + nil, + &handle, + ); err != nil { + return handle, errors.Wrap(err, "failed to create virtual disk") } return handle, nil } + +// GetVirtualDiskPhysicalPath takes a handle to a virtual hard disk and returns the physical +// path of the disk on the machine. This path is in the form \\.\PhysicalDriveX where X is an integer +// that represents the particular enumeration of the physical disk on the caller's system. +func GetVirtualDiskPhysicalPath(handle syscall.Handle) (_ string, err error) { + var ( + diskPathSizeInBytes uint32 = 256 * 2 // max path length 256 wide chars + diskPhysicalPathBuf [256]uint16 + ) + if err := getVirtualDiskPhysicalPath( + handle, + &diskPathSizeInBytes, + &diskPhysicalPathBuf[0], + ); err != nil { + return "", errors.Wrap(err, "failed to get disk physical path") + } + return windows.UTF16ToString(diskPhysicalPathBuf[:]), nil +} + +// CreateDiffVhd is a helper function to create a differencing virtual disk. +func CreateDiffVhd(diffVhdPath, baseVhdPath string, blockSizeInMB uint32) error { + // Setting `ParentPath` is how to signal to create a differencing disk. + createParams := &CreateVirtualDiskParameters{ + Version: 2, + Version2: CreateVersion2{ + ParentPath: windows.StringToUTF16Ptr(baseVhdPath), + BlockSizeInBytes: blockSizeInMB * 1024 * 1024, + OpenFlags: uint32(OpenVirtualDiskFlagCachedIO), + }, + } + + vhdHandle, err := CreateVirtualDisk( + diffVhdPath, + VirtualDiskAccessNone, + CreateVirtualDiskFlagNone, + createParams, + ) + if err != nil { + return fmt.Errorf("failed to create differencing vhd: %s", err) + } + if err := syscall.CloseHandle(vhdHandle); err != nil { + return fmt.Errorf("failed to close differencing vhd handle: %s", err) + } + return nil +} diff --git a/vendor/github.com/Microsoft/go-winio/vhd/zvhd.go b/vendor/github.com/Microsoft/go-winio/vhd/zvhd.go index 00599ea497e8..54c94db77ad2 100644 --- a/vendor/github.com/Microsoft/go-winio/vhd/zvhd.go +++ b/vendor/github.com/Microsoft/go-winio/vhd/zvhd.go @@ -37,24 +37,26 @@ func errnoErr(e syscall.Errno) error { } var ( - modVirtDisk = windows.NewLazySystemDLL("VirtDisk.dll") + modvirtdisk = windows.NewLazySystemDLL("virtdisk.dll") - procCreateVirtualDisk = modVirtDisk.NewProc("CreateVirtualDisk") - procOpenVirtualDisk = modVirtDisk.NewProc("OpenVirtualDisk") - procDetachVirtualDisk = modVirtDisk.NewProc("DetachVirtualDisk") + procCreateVirtualDisk = modvirtdisk.NewProc("CreateVirtualDisk") + procOpenVirtualDisk = modvirtdisk.NewProc("OpenVirtualDisk") + procAttachVirtualDisk = modvirtdisk.NewProc("AttachVirtualDisk") + procDetachVirtualDisk = modvirtdisk.NewProc("DetachVirtualDisk") + procGetVirtualDiskPhysicalPath = modvirtdisk.NewProc("GetVirtualDiskPhysicalPath") ) -func createVirtualDisk(virtualStorageType *virtualStorageType, path string, virtualDiskAccessMask uint32, securityDescriptor *uintptr, flags uint32, providerSpecificFlags uint32, parameters *createVirtualDiskParameters, o *syscall.Overlapped, handle *syscall.Handle) (err error) { +func createVirtualDisk(virtualStorageType *VirtualStorageType, path string, virtualDiskAccessMask uint32, securityDescriptor *uintptr, createVirtualDiskFlags uint32, providerSpecificFlags uint32, parameters *CreateVirtualDiskParameters, overlapped *syscall.Overlapped, handle *syscall.Handle) (err error) { var _p0 *uint16 _p0, err = syscall.UTF16PtrFromString(path) if err != nil { return } - return _createVirtualDisk(virtualStorageType, _p0, virtualDiskAccessMask, securityDescriptor, flags, providerSpecificFlags, parameters, o, handle) + return _createVirtualDisk(virtualStorageType, _p0, virtualDiskAccessMask, securityDescriptor, createVirtualDiskFlags, providerSpecificFlags, parameters, overlapped, handle) } -func _createVirtualDisk(virtualStorageType *virtualStorageType, path *uint16, virtualDiskAccessMask uint32, securityDescriptor *uintptr, flags uint32, providerSpecificFlags uint32, parameters *createVirtualDiskParameters, o *syscall.Overlapped, handle *syscall.Handle) (err error) { - r1, _, e1 := syscall.Syscall9(procCreateVirtualDisk.Addr(), 9, uintptr(unsafe.Pointer(virtualStorageType)), uintptr(unsafe.Pointer(path)), uintptr(virtualDiskAccessMask), uintptr(unsafe.Pointer(securityDescriptor)), uintptr(flags), uintptr(providerSpecificFlags), uintptr(unsafe.Pointer(parameters)), uintptr(unsafe.Pointer(o)), uintptr(unsafe.Pointer(handle))) +func _createVirtualDisk(virtualStorageType *VirtualStorageType, path *uint16, virtualDiskAccessMask uint32, securityDescriptor *uintptr, createVirtualDiskFlags uint32, providerSpecificFlags uint32, parameters *CreateVirtualDiskParameters, overlapped *syscall.Overlapped, handle *syscall.Handle) (err error) { + r1, _, e1 := syscall.Syscall9(procCreateVirtualDisk.Addr(), 9, uintptr(unsafe.Pointer(virtualStorageType)), uintptr(unsafe.Pointer(path)), uintptr(virtualDiskAccessMask), uintptr(unsafe.Pointer(securityDescriptor)), uintptr(createVirtualDiskFlags), uintptr(providerSpecificFlags), uintptr(unsafe.Pointer(parameters)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(handle))) if r1 != 0 { if e1 != 0 { err = errnoErr(e1) @@ -65,17 +67,17 @@ func _createVirtualDisk(virtualStorageType *virtualStorageType, path *uint16, vi return } -func openVirtualDisk(virtualStorageType *virtualStorageType, path string, virtualDiskAccessMask uint32, flags uint32, parameters *openVirtualDiskParameters, handle *syscall.Handle) (err error) { +func openVirtualDisk(virtualStorageType *VirtualStorageType, path string, virtualDiskAccessMask uint32, openVirtualDiskFlags uint32, parameters *OpenVirtualDiskParameters, handle *syscall.Handle) (err error) { var _p0 *uint16 _p0, err = syscall.UTF16PtrFromString(path) if err != nil { return } - return _openVirtualDisk(virtualStorageType, _p0, virtualDiskAccessMask, flags, parameters, handle) + return _openVirtualDisk(virtualStorageType, _p0, virtualDiskAccessMask, openVirtualDiskFlags, parameters, handle) } -func _openVirtualDisk(virtualStorageType *virtualStorageType, path *uint16, virtualDiskAccessMask uint32, flags uint32, parameters *openVirtualDiskParameters, handle *syscall.Handle) (err error) { - r1, _, e1 := syscall.Syscall6(procOpenVirtualDisk.Addr(), 6, uintptr(unsafe.Pointer(virtualStorageType)), uintptr(unsafe.Pointer(path)), uintptr(virtualDiskAccessMask), uintptr(flags), uintptr(unsafe.Pointer(parameters)), uintptr(unsafe.Pointer(handle))) +func _openVirtualDisk(virtualStorageType *VirtualStorageType, path *uint16, virtualDiskAccessMask uint32, openVirtualDiskFlags uint32, parameters *OpenVirtualDiskParameters, handle *syscall.Handle) (err error) { + r1, _, e1 := syscall.Syscall6(procOpenVirtualDisk.Addr(), 6, uintptr(unsafe.Pointer(virtualStorageType)), uintptr(unsafe.Pointer(path)), uintptr(virtualDiskAccessMask), uintptr(openVirtualDiskFlags), uintptr(unsafe.Pointer(parameters)), uintptr(unsafe.Pointer(handle))) if r1 != 0 { if e1 != 0 { err = errnoErr(e1) @@ -86,8 +88,32 @@ func _openVirtualDisk(virtualStorageType *virtualStorageType, path *uint16, virt return } -func detachVirtualDisk(handle syscall.Handle, flags uint32, providerSpecificFlags uint32) (err error) { - r1, _, e1 := syscall.Syscall(procDetachVirtualDisk.Addr(), 3, uintptr(handle), uintptr(flags), uintptr(providerSpecificFlags)) +func attachVirtualDisk(handle syscall.Handle, securityDescriptor *uintptr, attachVirtualDiskFlag uint32, providerSpecificFlags uint32, parameters *AttachVirtualDiskParameters, overlapped *syscall.Overlapped) (err error) { + r1, _, e1 := syscall.Syscall6(procAttachVirtualDisk.Addr(), 6, uintptr(handle), uintptr(unsafe.Pointer(securityDescriptor)), uintptr(attachVirtualDiskFlag), uintptr(providerSpecificFlags), uintptr(unsafe.Pointer(parameters)), uintptr(unsafe.Pointer(overlapped))) + if r1 != 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func detachVirtualDisk(handle syscall.Handle, detachVirtualDiskFlags uint32, providerSpecificFlags uint32) (err error) { + r1, _, e1 := syscall.Syscall(procDetachVirtualDisk.Addr(), 3, uintptr(handle), uintptr(detachVirtualDiskFlags), uintptr(providerSpecificFlags)) + if r1 != 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func getVirtualDiskPhysicalPath(handle syscall.Handle, diskPathSizeInBytes *uint32, buffer *uint16) (err error) { + r1, _, e1 := syscall.Syscall(procGetVirtualDiskPhysicalPath.Addr(), 3, uintptr(handle), uintptr(unsafe.Pointer(diskPathSizeInBytes)), uintptr(unsafe.Pointer(buffer))) if r1 != 0 { if e1 != 0 { err = errnoErr(e1) diff --git a/vendor/github.com/Microsoft/hcsshim/.gitattributes b/vendor/github.com/Microsoft/hcsshim/.gitattributes new file mode 100644 index 000000000000..94f480de94e1 --- /dev/null +++ b/vendor/github.com/Microsoft/hcsshim/.gitattributes @@ -0,0 +1 @@ +* text=auto eol=lf \ No newline at end of file diff --git a/vendor/github.com/Microsoft/hcsshim/CODEOWNERS b/vendor/github.com/Microsoft/hcsshim/CODEOWNERS index 1a59c8021d51..87f49df314eb 100644 --- a/vendor/github.com/Microsoft/hcsshim/CODEOWNERS +++ b/vendor/github.com/Microsoft/hcsshim/CODEOWNERS @@ -1,3 +1,3 @@ -* @microsoft/containerplat - +* @microsoft/containerplat + /hcn/* @nagiesek \ No newline at end of file diff --git a/vendor/github.com/Microsoft/hcsshim/appveyor.yml b/vendor/github.com/Microsoft/hcsshim/appveyor.yml index 6617fade0f51..bd3f18f07508 100644 --- a/vendor/github.com/Microsoft/hcsshim/appveyor.yml +++ b/vendor/github.com/Microsoft/hcsshim/appveyor.yml @@ -18,6 +18,7 @@ build_script: - go build ./cmd/runhcs - go build ./cmd/tar2ext4 - go build ./cmd/wclayer + - go build ./cmd/device-util - go build ./internal/tools/grantvmgroupaccess - go build ./internal/tools/uvmboot - go build ./internal/tools/zapdir @@ -33,6 +34,7 @@ artifacts: - path: 'containerd-shim-runhcs-v1.exe' - path: 'runhcs.exe' - path: 'tar2ext4.exe' + - path: 'device-util.exe' - path: 'wclayer.exe' - path: 'grantvmgroupaccess.exe' - path: 'uvmboot.exe' diff --git a/vendor/github.com/Microsoft/hcsshim/computestorage/attach.go b/vendor/github.com/Microsoft/hcsshim/computestorage/attach.go new file mode 100644 index 000000000000..56901d926f6b --- /dev/null +++ b/vendor/github.com/Microsoft/hcsshim/computestorage/attach.go @@ -0,0 +1,38 @@ +package computestorage + +import ( + "context" + "encoding/json" + "fmt" + + "github.com/Microsoft/hcsshim/internal/oc" + "go.opencensus.io/trace" +) + +// AttachLayerStorageFilter sets up the layer storage filter on a writable +// container layer. +// +// `layerPath` is a path to a directory the writable layer is mounted. If the +// path does not end in a `\` the platform will append it automatically. +// +// `layerData` is the parent read-only layer data. +func AttachLayerStorageFilter(ctx context.Context, layerPath string, layerData LayerData) (err error) { + title := "hcsshim.AttachLayerStorageFilter" + ctx, span := trace.StartSpan(ctx, title) + defer span.End() + defer func() { oc.SetSpanStatus(span, err) }() + span.AddAttributes( + trace.StringAttribute("layerPath", layerPath), + ) + + bytes, err := json.Marshal(layerData) + if err != nil { + return err + } + + err = hcsAttachLayerStorageFilter(layerPath, string(bytes)) + if err != nil { + return fmt.Errorf("failed to attach layer storage filter: %s", err) + } + return nil +} diff --git a/vendor/github.com/Microsoft/hcsshim/computestorage/destroy.go b/vendor/github.com/Microsoft/hcsshim/computestorage/destroy.go new file mode 100644 index 000000000000..ecf3b550d587 --- /dev/null +++ b/vendor/github.com/Microsoft/hcsshim/computestorage/destroy.go @@ -0,0 +1,26 @@ +package computestorage + +import ( + "context" + "fmt" + + "github.com/Microsoft/hcsshim/internal/oc" + "go.opencensus.io/trace" +) + +// DestroyLayer deletes a container layer. +// +// `layerPath` is a path to a directory containing the layer to export. +func DestroyLayer(ctx context.Context, layerPath string) (err error) { + title := "hcsshim.DestroyLayer" + ctx, span := trace.StartSpan(ctx, title) + defer span.End() + defer func() { oc.SetSpanStatus(span, err) }() + span.AddAttributes(trace.StringAttribute("layerPath", layerPath)) + + err = hcsDestroyLayer(layerPath) + if err != nil { + return fmt.Errorf("failed to destroy layer: %s", err) + } + return nil +} diff --git a/vendor/github.com/Microsoft/hcsshim/computestorage/detach.go b/vendor/github.com/Microsoft/hcsshim/computestorage/detach.go new file mode 100644 index 000000000000..2a4df4213fd9 --- /dev/null +++ b/vendor/github.com/Microsoft/hcsshim/computestorage/detach.go @@ -0,0 +1,26 @@ +package computestorage + +import ( + "context" + "fmt" + + "github.com/Microsoft/hcsshim/internal/oc" + "go.opencensus.io/trace" +) + +// DetachLayerStorageFilter detaches the layer storage filter on a writable container layer. +// +// `layerPath` is a path to a directory containing the layer to export. +func DetachLayerStorageFilter(ctx context.Context, layerPath string) (err error) { + title := "hcsshim.DetachLayerStorageFilter" + ctx, span := trace.StartSpan(ctx, title) + defer span.End() + defer func() { oc.SetSpanStatus(span, err) }() + span.AddAttributes(trace.StringAttribute("layerPath", layerPath)) + + err = hcsDetachLayerStorageFilter(layerPath) + if err != nil { + return fmt.Errorf("failed to detach layer storage filter: %s", err) + } + return nil +} diff --git a/vendor/github.com/Microsoft/hcsshim/computestorage/export.go b/vendor/github.com/Microsoft/hcsshim/computestorage/export.go new file mode 100644 index 000000000000..b1721ef25e99 --- /dev/null +++ b/vendor/github.com/Microsoft/hcsshim/computestorage/export.go @@ -0,0 +1,46 @@ +package computestorage + +import ( + "context" + "encoding/json" + "fmt" + + "github.com/Microsoft/hcsshim/internal/oc" + "go.opencensus.io/trace" +) + +// ExportLayer exports a container layer. +// +// `layerPath` is a path to a directory containing the layer to export. +// +// `exportFolderPath` is a pre-existing folder to export the layer to. +// +// `layerData` is the parent layer data. +// +// `options` are the export options applied to the exported layer. +func ExportLayer(ctx context.Context, layerPath, exportFolderPath string, layerData LayerData, options ExportLayerOptions) (err error) { + title := "hcsshim.ExportLayer" + ctx, span := trace.StartSpan(ctx, title) + defer span.End() + defer func() { oc.SetSpanStatus(span, err) }() + span.AddAttributes( + trace.StringAttribute("layerPath", layerPath), + trace.StringAttribute("exportFolderPath", exportFolderPath), + ) + + ldbytes, err := json.Marshal(layerData) + if err != nil { + return err + } + + obytes, err := json.Marshal(options) + if err != nil { + return err + } + + err = hcsExportLayer(layerPath, exportFolderPath, string(ldbytes), string(obytes)) + if err != nil { + return fmt.Errorf("failed to export layer: %s", err) + } + return nil +} diff --git a/vendor/github.com/Microsoft/hcsshim/computestorage/format.go b/vendor/github.com/Microsoft/hcsshim/computestorage/format.go new file mode 100644 index 000000000000..2952c8a66781 --- /dev/null +++ b/vendor/github.com/Microsoft/hcsshim/computestorage/format.go @@ -0,0 +1,26 @@ +package computestorage + +import ( + "context" + "fmt" + + "github.com/Microsoft/hcsshim/internal/oc" + "go.opencensus.io/trace" + "golang.org/x/sys/windows" +) + +// FormatWritableLayerVhd formats a virtual disk for use as a writable container layer. +// +// If the VHD is not mounted it will be temporarily mounted. +func FormatWritableLayerVhd(ctx context.Context, vhdHandle windows.Handle) (err error) { + title := "hcsshim.FormatWritableLayerVhd" + ctx, span := trace.StartSpan(ctx, title) + defer span.End() + defer func() { oc.SetSpanStatus(span, err) }() + + err = hcsFormatWritableLayerVhd(vhdHandle) + if err != nil { + return fmt.Errorf("failed to format writable layer vhd: %s", err) + } + return nil +} diff --git a/vendor/github.com/Microsoft/hcsshim/computestorage/helpers.go b/vendor/github.com/Microsoft/hcsshim/computestorage/helpers.go new file mode 100644 index 000000000000..d31efd660932 --- /dev/null +++ b/vendor/github.com/Microsoft/hcsshim/computestorage/helpers.go @@ -0,0 +1,197 @@ +package computestorage + +import ( + "context" + "os" + "path/filepath" + "syscall" + + "github.com/Microsoft/go-winio/pkg/security" + "github.com/Microsoft/go-winio/vhd" + "github.com/pkg/errors" + "golang.org/x/sys/windows" +) + +const defaultVHDXBlockSizeInMB = 1 + +// SetupContainerBaseLayer is a helper to setup a containers scratch. It +// will create and format the vhdx's inside and the size is configurable with the sizeInGB +// parameter. +// +// `layerPath` is the path to the base container layer on disk. +// +// `baseVhdPath` is the path to where the base vhdx for the base layer should be created. +// +// `diffVhdPath` is the path where the differencing disk for the base layer should be created. +// +// `sizeInGB` is the size in gigabytes to make the base vhdx. +func SetupContainerBaseLayer(ctx context.Context, layerPath, baseVhdPath, diffVhdPath string, sizeInGB uint64) (err error) { + var ( + hivesPath = filepath.Join(layerPath, "Hives") + layoutPath = filepath.Join(layerPath, "Layout") + ) + + // We need to remove the hives directory and layout file as `SetupBaseOSLayer` fails if these files + // already exist. `SetupBaseOSLayer` will create these files internally. We also remove the base and + // differencing disks if they exist in case we're asking for a different size. + if _, err := os.Stat(hivesPath); err == nil { + if err := os.RemoveAll(hivesPath); err != nil { + return errors.Wrap(err, "failed to remove prexisting hives directory") + } + } + if _, err := os.Stat(layoutPath); err == nil { + if err := os.RemoveAll(layoutPath); err != nil { + return errors.Wrap(err, "failed to remove prexisting layout file") + } + } + + if _, err := os.Stat(baseVhdPath); err == nil { + if err := os.RemoveAll(baseVhdPath); err != nil { + return errors.Wrap(err, "failed to remove base vhdx path") + } + } + if _, err := os.Stat(diffVhdPath); err == nil { + if err := os.RemoveAll(diffVhdPath); err != nil { + return errors.Wrap(err, "failed to remove differencing vhdx") + } + } + + createParams := &vhd.CreateVirtualDiskParameters{ + Version: 2, + Version2: vhd.CreateVersion2{ + MaximumSize: sizeInGB * 1024 * 1024 * 1024, + BlockSizeInBytes: defaultVHDXBlockSizeInMB * 1024 * 1024, + }, + } + handle, err := vhd.CreateVirtualDisk(baseVhdPath, vhd.VirtualDiskAccessNone, vhd.CreateVirtualDiskFlagNone, createParams) + if err != nil { + return errors.Wrap(err, "failed to create vhdx") + } + + defer func() { + if err != nil { + syscall.CloseHandle(handle) + os.RemoveAll(baseVhdPath) + if os.Stat(diffVhdPath); err == nil { + os.RemoveAll(diffVhdPath) + } + } + }() + + if err = FormatWritableLayerVhd(ctx, windows.Handle(handle)); err != nil { + return err + } + // Base vhd handle must be closed before calling SetupBaseLayer in case of Container layer + if err = syscall.CloseHandle(handle); err != nil { + return errors.Wrap(err, "failed to close vhdx handle") + } + + options := OsLayerOptions{ + Type: OsLayerTypeContainer, + } + + // SetupBaseOSLayer expects an empty vhd handle for a container layer and will + // error out otherwise. + if err = SetupBaseOSLayer(ctx, layerPath, 0, options); err != nil { + return err + } + // Create the differencing disk that will be what's copied for the final rw layer + // for a container. + if err = vhd.CreateDiffVhd(diffVhdPath, baseVhdPath, defaultVHDXBlockSizeInMB); err != nil { + return errors.Wrap(err, "failed to create differencing disk") + } + + if err = security.GrantVmGroupAccess(baseVhdPath); err != nil { + return errors.Wrapf(err, "failed to grant vm group access to %s", baseVhdPath) + } + if err = security.GrantVmGroupAccess(diffVhdPath); err != nil { + return errors.Wrapf(err, "failed to grant vm group access to %s", diffVhdPath) + } + return nil +} + +// SetupUtilityVMBaseLayer is a helper to setup a UVMs scratch space. It will create and format +// the vhdx inside and the size is configurable by the sizeInGB parameter. +// +// `uvmPath` is the path to the UtilityVM filesystem. +// +// `baseVhdPath` is the path to where the base vhdx for the UVM should be created. +// +// `diffVhdPath` is the path where the differencing disk for the UVM should be created. +// +// `sizeInGB` specifies the size in gigabytes to make the base vhdx. +func SetupUtilityVMBaseLayer(ctx context.Context, uvmPath, baseVhdPath, diffVhdPath string, sizeInGB uint64) (err error) { + // Remove the base and differencing disks if they exist in case we're asking for a different size. + if _, err := os.Stat(baseVhdPath); err == nil { + if err := os.RemoveAll(baseVhdPath); err != nil { + return errors.Wrap(err, "failed to remove base vhdx") + } + } + if _, err := os.Stat(diffVhdPath); err == nil { + if err := os.RemoveAll(diffVhdPath); err != nil { + return errors.Wrap(err, "failed to remove differencing vhdx") + } + } + + // Just create the vhdx for utilityVM layer, no need to format it. + createParams := &vhd.CreateVirtualDiskParameters{ + Version: 2, + Version2: vhd.CreateVersion2{ + MaximumSize: sizeInGB * 1024 * 1024 * 1024, + BlockSizeInBytes: defaultVHDXBlockSizeInMB * 1024 * 1024, + }, + } + handle, err := vhd.CreateVirtualDisk(baseVhdPath, vhd.VirtualDiskAccessNone, vhd.CreateVirtualDiskFlagNone, createParams) + if err != nil { + return errors.Wrap(err, "failed to create vhdx") + } + + defer func() { + if err != nil { + syscall.CloseHandle(handle) + os.RemoveAll(baseVhdPath) + if os.Stat(diffVhdPath); err == nil { + os.RemoveAll(diffVhdPath) + } + } + }() + + // If it is a UtilityVM layer then the base vhdx must be attached when calling + // `SetupBaseOSLayer` + attachParams := &vhd.AttachVirtualDiskParameters{ + Version: 2, + } + if err := vhd.AttachVirtualDisk(handle, vhd.AttachVirtualDiskFlagNone, attachParams); err != nil { + return errors.Wrapf(err, "failed to attach virtual disk") + } + + options := OsLayerOptions{ + Type: OsLayerTypeVM, + } + if err := SetupBaseOSLayer(ctx, uvmPath, windows.Handle(handle), options); err != nil { + return err + } + + // Detach and close the handle after setting up the layer as we don't need the handle + // for anything else and we no longer need to be attached either. + if err = vhd.DetachVirtualDisk(handle); err != nil { + return errors.Wrap(err, "failed to detach vhdx") + } + if err = syscall.CloseHandle(handle); err != nil { + return errors.Wrap(err, "failed to close vhdx handle") + } + + // Create the differencing disk that will be what's copied for the final rw layer + // for a container. + if err = vhd.CreateDiffVhd(diffVhdPath, baseVhdPath, defaultVHDXBlockSizeInMB); err != nil { + return errors.Wrap(err, "failed to create differencing disk") + } + + if err := security.GrantVmGroupAccess(baseVhdPath); err != nil { + return errors.Wrapf(err, "failed to grant vm group access to %s", baseVhdPath) + } + if err := security.GrantVmGroupAccess(diffVhdPath); err != nil { + return errors.Wrapf(err, "failed to grant vm group access to %s", diffVhdPath) + } + return nil +} diff --git a/vendor/github.com/Microsoft/hcsshim/computestorage/import.go b/vendor/github.com/Microsoft/hcsshim/computestorage/import.go new file mode 100644 index 000000000000..06e329794659 --- /dev/null +++ b/vendor/github.com/Microsoft/hcsshim/computestorage/import.go @@ -0,0 +1,41 @@ +package computestorage + +import ( + "context" + "encoding/json" + "fmt" + + "github.com/Microsoft/hcsshim/internal/oc" + "go.opencensus.io/trace" +) + +// ImportLayer imports a container layer. +// +// `layerPath` is a path to a directory to import the layer to. If the directory +// does not exist it will be automatically created. +// +// `sourceFolderpath` is a pre-existing folder that contains the layer to +// import. +// +// `layerData` is the parent layer data. +func ImportLayer(ctx context.Context, layerPath, sourceFolderPath string, layerData LayerData) (err error) { + title := "hcsshim.ImportLayer" + ctx, span := trace.StartSpan(ctx, title) + defer span.End() + defer func() { oc.SetSpanStatus(span, err) }() + span.AddAttributes( + trace.StringAttribute("layerPath", layerPath), + trace.StringAttribute("sourceFolderPath", sourceFolderPath), + ) + + bytes, err := json.Marshal(layerData) + if err != nil { + return err + } + + err = hcsImportLayer(layerPath, sourceFolderPath, string(bytes)) + if err != nil { + return fmt.Errorf("failed to import layer: %s", err) + } + return nil +} diff --git a/vendor/github.com/Microsoft/hcsshim/computestorage/initialize.go b/vendor/github.com/Microsoft/hcsshim/computestorage/initialize.go new file mode 100644 index 000000000000..2e4810c45719 --- /dev/null +++ b/vendor/github.com/Microsoft/hcsshim/computestorage/initialize.go @@ -0,0 +1,38 @@ +package computestorage + +import ( + "context" + "encoding/json" + "fmt" + + "github.com/Microsoft/hcsshim/internal/oc" + "go.opencensus.io/trace" +) + +// InitializeWritableLayer initializes a writable layer for a container. +// +// `layerPath` is a path to a directory the layer is mounted. If the +// path does not end in a `\` the platform will append it automatically. +// +// `layerData` is the parent read-only layer data. +func InitializeWritableLayer(ctx context.Context, layerPath string, layerData LayerData) (err error) { + title := "hcsshim.InitializeWritableLayer" + ctx, span := trace.StartSpan(ctx, title) + defer span.End() + defer func() { oc.SetSpanStatus(span, err) }() + span.AddAttributes( + trace.StringAttribute("layerPath", layerPath), + ) + + bytes, err := json.Marshal(layerData) + if err != nil { + return err + } + + // Options are not used in the platform as of RS5 + err = hcsInitializeWritableLayer(layerPath, string(bytes), "") + if err != nil { + return fmt.Errorf("failed to intitialize container layer: %s", err) + } + return nil +} diff --git a/vendor/github.com/Microsoft/hcsshim/computestorage/mount.go b/vendor/github.com/Microsoft/hcsshim/computestorage/mount.go new file mode 100644 index 000000000000..40652b99e491 --- /dev/null +++ b/vendor/github.com/Microsoft/hcsshim/computestorage/mount.go @@ -0,0 +1,27 @@ +package computestorage + +import ( + "context" + "fmt" + + "github.com/Microsoft/hcsshim/internal/interop" + "github.com/Microsoft/hcsshim/internal/oc" + "go.opencensus.io/trace" + "golang.org/x/sys/windows" +) + +// GetLayerVhdMountPath returns the volume path for a virtual disk of a writable container layer. +func GetLayerVhdMountPath(ctx context.Context, vhdHandle windows.Handle) (path string, err error) { + title := "hcsshim.GetLayerVhdMountPath" + ctx, span := trace.StartSpan(ctx, title) + defer span.End() + defer func() { oc.SetSpanStatus(span, err) }() + + var mountPath *uint16 + err = hcsGetLayerVhdMountPath(vhdHandle, &mountPath) + if err != nil { + return "", fmt.Errorf("failed to get vhd mount path: %s", err) + } + path = interop.ConvertAndFreeCoTaskMemString(mountPath) + return path, nil +} diff --git a/vendor/github.com/Microsoft/hcsshim/computestorage/setup.go b/vendor/github.com/Microsoft/hcsshim/computestorage/setup.go new file mode 100644 index 000000000000..13ce0cd60616 --- /dev/null +++ b/vendor/github.com/Microsoft/hcsshim/computestorage/setup.go @@ -0,0 +1,75 @@ +package computestorage + +import ( + "context" + "encoding/json" + "errors" + "fmt" + + "github.com/Microsoft/hcsshim/internal/oc" + "github.com/Microsoft/hcsshim/osversion" + "go.opencensus.io/trace" + "golang.org/x/sys/windows" +) + +// SetupBaseOSLayer sets up a layer that contains a base OS for a container. +// +// `layerPath` is a path to a directory containing the layer. +// +// `vhdHandle` is an empty file handle of `options.Type == OsLayerTypeContainer` +// or else it is a file handle to the 'SystemTemplateBase.vhdx' if `options.Type +// == OsLayerTypeVm`. +// +// `options` are the options applied while processing the layer. +func SetupBaseOSLayer(ctx context.Context, layerPath string, vhdHandle windows.Handle, options OsLayerOptions) (err error) { + title := "hcsshim.SetupBaseOSLayer" + ctx, span := trace.StartSpan(ctx, title) + defer span.End() + defer func() { oc.SetSpanStatus(span, err) }() + span.AddAttributes( + trace.StringAttribute("layerPath", layerPath), + ) + + bytes, err := json.Marshal(options) + if err != nil { + return err + } + + err = hcsSetupBaseOSLayer(layerPath, vhdHandle, string(bytes)) + if err != nil { + return fmt.Errorf("failed to setup base OS layer: %s", err) + } + return nil +} + +// SetupBaseOSVolume sets up a volume that contains a base OS for a container. +// +// `layerPath` is a path to a directory containing the layer. +// +// `volumePath` is the path to the volume to be used for setup. +// +// `options` are the options applied while processing the layer. +func SetupBaseOSVolume(ctx context.Context, layerPath, volumePath string, options OsLayerOptions) (err error) { + if osversion.Get().Build < 19645 { + return errors.New("SetupBaseOSVolume is not present on builds older than 19645") + } + title := "hcsshim.SetupBaseOSVolume" + ctx, span := trace.StartSpan(ctx, title) + defer span.End() + defer func() { oc.SetSpanStatus(span, err) }() + span.AddAttributes( + trace.StringAttribute("layerPath", layerPath), + trace.StringAttribute("volumePath", volumePath), + ) + + bytes, err := json.Marshal(options) + if err != nil { + return err + } + + err = hcsSetupBaseOSVolume(layerPath, volumePath, string(bytes)) + if err != nil { + return fmt.Errorf("failed to setup base OS layer: %s", err) + } + return nil +} diff --git a/vendor/github.com/Microsoft/hcsshim/computestorage/storage.go b/vendor/github.com/Microsoft/hcsshim/computestorage/storage.go new file mode 100644 index 000000000000..9cd283d4b344 --- /dev/null +++ b/vendor/github.com/Microsoft/hcsshim/computestorage/storage.go @@ -0,0 +1,50 @@ +// Package computestorage is a wrapper around the HCS storage APIs. These are new storage APIs introduced +// separate from the original graphdriver calls intended to give more freedom around creating +// and managing container layers and scratch spaces. +package computestorage + +import ( + hcsschema "github.com/Microsoft/hcsshim/internal/schema2" +) + +//go:generate go run ../mksyscall_windows.go -output zsyscall_windows.go storage.go + +//sys hcsImportLayer(layerPath string, sourceFolderPath string, layerData string) (hr error) = computestorage.HcsImportLayer? +//sys hcsExportLayer(layerPath string, exportFolderPath string, layerData string, options string) (hr error) = computestorage.HcsExportLayer? +//sys hcsDestroyLayer(layerPath string) (hr error) = computestorage.HcsDestoryLayer? +//sys hcsSetupBaseOSLayer(layerPath string, handle windows.Handle, options string) (hr error) = computestorage.HcsSetupBaseOSLayer? +//sys hcsInitializeWritableLayer(writableLayerPath string, layerData string, options string) (hr error) = computestorage.HcsInitializeWritableLayer? +//sys hcsAttachLayerStorageFilter(layerPath string, layerData string) (hr error) = computestorage.HcsAttachLayerStorageFilter? +//sys hcsDetachLayerStorageFilter(layerPath string) (hr error) = computestorage.HcsDetachLayerStorageFilter? +//sys hcsFormatWritableLayerVhd(handle windows.Handle) (hr error) = computestorage.HcsFormatWritableLayerVhd? +//sys hcsGetLayerVhdMountPath(vhdHandle windows.Handle, mountPath **uint16) (hr error) = computestorage.HcsGetLayerVhdMountPath? +//sys hcsSetupBaseOSVolume(layerPath string, volumePath string, options string) (hr error) = computestorage.HcsSetupBaseOSVolume? + +// LayerData is the data used to describe parent layer information. +type LayerData struct { + SchemaVersion hcsschema.Version `json:"SchemaVersion,omitempty"` + Layers []hcsschema.Layer `json:"Layers,omitempty"` +} + +// ExportLayerOptions are the set of options that are used with the `computestorage.HcsExportLayer` syscall. +type ExportLayerOptions struct { + IsWritableLayer bool `json:"IsWritableLayer,omitempty"` +} + +// OsLayerType is the type of layer being operated on. +type OsLayerType string + +const ( + // OsLayerTypeContainer is a container layer. + OsLayerTypeContainer OsLayerType = "Container" + // OsLayerTypeVM is a virtual machine layer. + OsLayerTypeVM OsLayerType = "Vm" +) + +// OsLayerOptions are the set of options that are used with the `SetupBaseOSLayer` and +// `SetupBaseOSVolume` calls. +type OsLayerOptions struct { + Type OsLayerType `json:"Type,omitempty"` + DisableCiCacheOptimization bool `json:"DisableCiCacheOptimization,omitempty"` + SkipUpdateBcdForBoot bool `json:"SkipUpdateBcdForBoot,omitempty"` +} diff --git a/vendor/github.com/Microsoft/hcsshim/computestorage/zsyscall_windows.go b/vendor/github.com/Microsoft/hcsshim/computestorage/zsyscall_windows.go new file mode 100644 index 000000000000..4f9518067434 --- /dev/null +++ b/vendor/github.com/Microsoft/hcsshim/computestorage/zsyscall_windows.go @@ -0,0 +1,319 @@ +// Code generated mksyscall_windows.exe DO NOT EDIT + +package computestorage + +import ( + "syscall" + "unsafe" + + "golang.org/x/sys/windows" +) + +var _ unsafe.Pointer + +// Do the interface allocations only once for common +// Errno values. +const ( + errnoERROR_IO_PENDING = 997 +) + +var ( + errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) +) + +// errnoErr returns common boxed Errno values, to prevent +// allocations at runtime. +func errnoErr(e syscall.Errno) error { + switch e { + case 0: + return nil + case errnoERROR_IO_PENDING: + return errERROR_IO_PENDING + } + // TODO: add more here, after collecting data on the common + // error values see on Windows. (perhaps when running + // all.bat?) + return e +} + +var ( + modcomputestorage = windows.NewLazySystemDLL("computestorage.dll") + + procHcsImportLayer = modcomputestorage.NewProc("HcsImportLayer") + procHcsExportLayer = modcomputestorage.NewProc("HcsExportLayer") + procHcsDestoryLayer = modcomputestorage.NewProc("HcsDestoryLayer") + procHcsSetupBaseOSLayer = modcomputestorage.NewProc("HcsSetupBaseOSLayer") + procHcsInitializeWritableLayer = modcomputestorage.NewProc("HcsInitializeWritableLayer") + procHcsAttachLayerStorageFilter = modcomputestorage.NewProc("HcsAttachLayerStorageFilter") + procHcsDetachLayerStorageFilter = modcomputestorage.NewProc("HcsDetachLayerStorageFilter") + procHcsFormatWritableLayerVhd = modcomputestorage.NewProc("HcsFormatWritableLayerVhd") + procHcsGetLayerVhdMountPath = modcomputestorage.NewProc("HcsGetLayerVhdMountPath") + procHcsSetupBaseOSVolume = modcomputestorage.NewProc("HcsSetupBaseOSVolume") +) + +func hcsImportLayer(layerPath string, sourceFolderPath string, layerData string) (hr error) { + var _p0 *uint16 + _p0, hr = syscall.UTF16PtrFromString(layerPath) + if hr != nil { + return + } + var _p1 *uint16 + _p1, hr = syscall.UTF16PtrFromString(sourceFolderPath) + if hr != nil { + return + } + var _p2 *uint16 + _p2, hr = syscall.UTF16PtrFromString(layerData) + if hr != nil { + return + } + return _hcsImportLayer(_p0, _p1, _p2) +} + +func _hcsImportLayer(layerPath *uint16, sourceFolderPath *uint16, layerData *uint16) (hr error) { + if hr = procHcsImportLayer.Find(); hr != nil { + return + } + r0, _, _ := syscall.Syscall(procHcsImportLayer.Addr(), 3, uintptr(unsafe.Pointer(layerPath)), uintptr(unsafe.Pointer(sourceFolderPath)), uintptr(unsafe.Pointer(layerData))) + if int32(r0) < 0 { + if r0&0x1fff0000 == 0x00070000 { + r0 &= 0xffff + } + hr = syscall.Errno(r0) + } + return +} + +func hcsExportLayer(layerPath string, exportFolderPath string, layerData string, options string) (hr error) { + var _p0 *uint16 + _p0, hr = syscall.UTF16PtrFromString(layerPath) + if hr != nil { + return + } + var _p1 *uint16 + _p1, hr = syscall.UTF16PtrFromString(exportFolderPath) + if hr != nil { + return + } + var _p2 *uint16 + _p2, hr = syscall.UTF16PtrFromString(layerData) + if hr != nil { + return + } + var _p3 *uint16 + _p3, hr = syscall.UTF16PtrFromString(options) + if hr != nil { + return + } + return _hcsExportLayer(_p0, _p1, _p2, _p3) +} + +func _hcsExportLayer(layerPath *uint16, exportFolderPath *uint16, layerData *uint16, options *uint16) (hr error) { + if hr = procHcsExportLayer.Find(); hr != nil { + return + } + r0, _, _ := syscall.Syscall6(procHcsExportLayer.Addr(), 4, uintptr(unsafe.Pointer(layerPath)), uintptr(unsafe.Pointer(exportFolderPath)), uintptr(unsafe.Pointer(layerData)), uintptr(unsafe.Pointer(options)), 0, 0) + if int32(r0) < 0 { + if r0&0x1fff0000 == 0x00070000 { + r0 &= 0xffff + } + hr = syscall.Errno(r0) + } + return +} + +func hcsDestroyLayer(layerPath string) (hr error) { + var _p0 *uint16 + _p0, hr = syscall.UTF16PtrFromString(layerPath) + if hr != nil { + return + } + return _hcsDestroyLayer(_p0) +} + +func _hcsDestroyLayer(layerPath *uint16) (hr error) { + if hr = procHcsDestoryLayer.Find(); hr != nil { + return + } + r0, _, _ := syscall.Syscall(procHcsDestoryLayer.Addr(), 1, uintptr(unsafe.Pointer(layerPath)), 0, 0) + if int32(r0) < 0 { + if r0&0x1fff0000 == 0x00070000 { + r0 &= 0xffff + } + hr = syscall.Errno(r0) + } + return +} + +func hcsSetupBaseOSLayer(layerPath string, handle windows.Handle, options string) (hr error) { + var _p0 *uint16 + _p0, hr = syscall.UTF16PtrFromString(layerPath) + if hr != nil { + return + } + var _p1 *uint16 + _p1, hr = syscall.UTF16PtrFromString(options) + if hr != nil { + return + } + return _hcsSetupBaseOSLayer(_p0, handle, _p1) +} + +func _hcsSetupBaseOSLayer(layerPath *uint16, handle windows.Handle, options *uint16) (hr error) { + if hr = procHcsSetupBaseOSLayer.Find(); hr != nil { + return + } + r0, _, _ := syscall.Syscall(procHcsSetupBaseOSLayer.Addr(), 3, uintptr(unsafe.Pointer(layerPath)), uintptr(handle), uintptr(unsafe.Pointer(options))) + if int32(r0) < 0 { + if r0&0x1fff0000 == 0x00070000 { + r0 &= 0xffff + } + hr = syscall.Errno(r0) + } + return +} + +func hcsInitializeWritableLayer(writableLayerPath string, layerData string, options string) (hr error) { + var _p0 *uint16 + _p0, hr = syscall.UTF16PtrFromString(writableLayerPath) + if hr != nil { + return + } + var _p1 *uint16 + _p1, hr = syscall.UTF16PtrFromString(layerData) + if hr != nil { + return + } + var _p2 *uint16 + _p2, hr = syscall.UTF16PtrFromString(options) + if hr != nil { + return + } + return _hcsInitializeWritableLayer(_p0, _p1, _p2) +} + +func _hcsInitializeWritableLayer(writableLayerPath *uint16, layerData *uint16, options *uint16) (hr error) { + if hr = procHcsInitializeWritableLayer.Find(); hr != nil { + return + } + r0, _, _ := syscall.Syscall(procHcsInitializeWritableLayer.Addr(), 3, uintptr(unsafe.Pointer(writableLayerPath)), uintptr(unsafe.Pointer(layerData)), uintptr(unsafe.Pointer(options))) + if int32(r0) < 0 { + if r0&0x1fff0000 == 0x00070000 { + r0 &= 0xffff + } + hr = syscall.Errno(r0) + } + return +} + +func hcsAttachLayerStorageFilter(layerPath string, layerData string) (hr error) { + var _p0 *uint16 + _p0, hr = syscall.UTF16PtrFromString(layerPath) + if hr != nil { + return + } + var _p1 *uint16 + _p1, hr = syscall.UTF16PtrFromString(layerData) + if hr != nil { + return + } + return _hcsAttachLayerStorageFilter(_p0, _p1) +} + +func _hcsAttachLayerStorageFilter(layerPath *uint16, layerData *uint16) (hr error) { + if hr = procHcsAttachLayerStorageFilter.Find(); hr != nil { + return + } + r0, _, _ := syscall.Syscall(procHcsAttachLayerStorageFilter.Addr(), 2, uintptr(unsafe.Pointer(layerPath)), uintptr(unsafe.Pointer(layerData)), 0) + if int32(r0) < 0 { + if r0&0x1fff0000 == 0x00070000 { + r0 &= 0xffff + } + hr = syscall.Errno(r0) + } + return +} + +func hcsDetachLayerStorageFilter(layerPath string) (hr error) { + var _p0 *uint16 + _p0, hr = syscall.UTF16PtrFromString(layerPath) + if hr != nil { + return + } + return _hcsDetachLayerStorageFilter(_p0) +} + +func _hcsDetachLayerStorageFilter(layerPath *uint16) (hr error) { + if hr = procHcsDetachLayerStorageFilter.Find(); hr != nil { + return + } + r0, _, _ := syscall.Syscall(procHcsDetachLayerStorageFilter.Addr(), 1, uintptr(unsafe.Pointer(layerPath)), 0, 0) + if int32(r0) < 0 { + if r0&0x1fff0000 == 0x00070000 { + r0 &= 0xffff + } + hr = syscall.Errno(r0) + } + return +} + +func hcsFormatWritableLayerVhd(handle windows.Handle) (hr error) { + if hr = procHcsFormatWritableLayerVhd.Find(); hr != nil { + return + } + r0, _, _ := syscall.Syscall(procHcsFormatWritableLayerVhd.Addr(), 1, uintptr(handle), 0, 0) + if int32(r0) < 0 { + if r0&0x1fff0000 == 0x00070000 { + r0 &= 0xffff + } + hr = syscall.Errno(r0) + } + return +} + +func hcsGetLayerVhdMountPath(vhdHandle windows.Handle, mountPath **uint16) (hr error) { + if hr = procHcsGetLayerVhdMountPath.Find(); hr != nil { + return + } + r0, _, _ := syscall.Syscall(procHcsGetLayerVhdMountPath.Addr(), 2, uintptr(vhdHandle), uintptr(unsafe.Pointer(mountPath)), 0) + if int32(r0) < 0 { + if r0&0x1fff0000 == 0x00070000 { + r0 &= 0xffff + } + hr = syscall.Errno(r0) + } + return +} + +func hcsSetupBaseOSVolume(layerPath string, volumePath string, options string) (hr error) { + var _p0 *uint16 + _p0, hr = syscall.UTF16PtrFromString(layerPath) + if hr != nil { + return + } + var _p1 *uint16 + _p1, hr = syscall.UTF16PtrFromString(volumePath) + if hr != nil { + return + } + var _p2 *uint16 + _p2, hr = syscall.UTF16PtrFromString(options) + if hr != nil { + return + } + return _hcsSetupBaseOSVolume(_p0, _p1, _p2) +} + +func _hcsSetupBaseOSVolume(layerPath *uint16, volumePath *uint16, options *uint16) (hr error) { + if hr = procHcsSetupBaseOSVolume.Find(); hr != nil { + return + } + r0, _, _ := syscall.Syscall(procHcsSetupBaseOSVolume.Addr(), 3, uintptr(unsafe.Pointer(layerPath)), uintptr(unsafe.Pointer(volumePath)), uintptr(unsafe.Pointer(options))) + if int32(r0) < 0 { + if r0&0x1fff0000 == 0x00070000 { + r0 &= 0xffff + } + hr = syscall.Errno(r0) + } + return +} diff --git a/vendor/github.com/Microsoft/hcsshim/go.mod b/vendor/github.com/Microsoft/hcsshim/go.mod index 02d212705931..a2faeb52b3bb 100644 --- a/vendor/github.com/Microsoft/hcsshim/go.mod +++ b/vendor/github.com/Microsoft/hcsshim/go.mod @@ -3,7 +3,7 @@ module github.com/Microsoft/hcsshim go 1.13 require ( - github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5 + github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331 github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59 github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1 github.com/containerd/containerd v1.3.2 @@ -26,7 +26,7 @@ require ( go.opencensus.io v0.22.0 golang.org/x/net v0.0.0-20191004110552-13f9640d40b9 // indirect golang.org/x/sync v0.0.0-20190423024810-112230192c58 - golang.org/x/sys v0.0.0-20200120151820-655fe14d7479 + golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3 google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873 // indirect google.golang.org/grpc v1.23.1 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect diff --git a/vendor/github.com/Microsoft/hcsshim/go.sum b/vendor/github.com/Microsoft/hcsshim/go.sum index e949461b32e2..e71f8979af25 100644 --- a/vendor/github.com/Microsoft/hcsshim/go.sum +++ b/vendor/github.com/Microsoft/hcsshim/go.sum @@ -1,8 +1,10 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5 h1:ygIc8M6trr62pF5DucadTWGdEB4mEyvzi0e2nbcmcyA= -github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= +github.com/Microsoft/go-winio v0.4.15-0.20200908182639-5b44b70ab3ab h1:9pygWVFqbY9lPxM0peffumuVDyMuIMzNLyO9uFjJuQo= +github.com/Microsoft/go-winio v0.4.15-0.20200908182639-5b44b70ab3ab/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= +github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331 h1:3YnB7Hpmh1lPecPE8doMOtYCrMdrpedZOvxfuNES/Vk= +github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59 h1:qWj4qVYZ95vLWwqyNJCQg7rDsG5wPdze0UaPolH7DUk= @@ -121,6 +123,8 @@ golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200120151820-655fe14d7479 h1:LhLiKguPgZL+Tglay4GhVtfF0kb8cvOJ0dHTCBO8YNI= golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3 h1:kzM6+9dur93BcC2kVlYl34cHU+TYZLanmpSJHVMmL64= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= diff --git a/vendor/github.com/Microsoft/hcsshim/hcn/hcn.go b/vendor/github.com/Microsoft/hcsshim/hcn/hcn.go index d63c11f26c9d..54c258ed74b3 100644 --- a/vendor/github.com/Microsoft/hcsshim/hcn/hcn.go +++ b/vendor/github.com/Microsoft/hcsshim/hcn/hcn.go @@ -207,6 +207,24 @@ func IPv6DualStackSupported() error { return platformDoesNotSupportError("IPv6 DualStack") } +//L4proxySupported returns an error if the HCN verison does not support L4Proxy +func L4proxyPolicySupported() error { + supported := GetSupportedFeatures() + if supported.L4Proxy { + return nil + } + return platformDoesNotSupportError("L4ProxyPolicy") +} + +// L4WfpProxySupported returns an error if the HCN verison does not support L4WfpProxy +func L4WfpProxyPolicySupported() error { + supported := GetSupportedFeatures() + if supported.L4WfpProxy { + return nil + } + return platformDoesNotSupportError("L4WfpProxyPolicy") +} + // SetPolicySupported returns an error if the HCN version does not support SetPolicy. func SetPolicySupported() error { supported := GetSupportedFeatures() diff --git a/vendor/github.com/Microsoft/hcsshim/hcn/hcnglobals.go b/vendor/github.com/Microsoft/hcsshim/hcn/hcnglobals.go index 9628bc440bd6..a2195f57fcbf 100644 --- a/vendor/github.com/Microsoft/hcsshim/hcn/hcnglobals.go +++ b/vendor/github.com/Microsoft/hcsshim/hcn/hcnglobals.go @@ -49,8 +49,7 @@ var ( } // HNS 9.3 through 10.0 (not included) and, 10.4+ allow for HNS ACL Policies to support protocol 252 for VXLAN AclSupportForProtocol252Version = VersionRanges{ - VersionRange{MinVersion: Version{Major: 9, Minor: 3}, MaxVersion: Version{Major: 9, Minor: math.MaxInt32}}, - VersionRange{MinVersion: Version{Major: 10, Minor: 4}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}}, + VersionRange{MinVersion: Version{Major: 11, Minor: 0}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}}, } // HNS 12.0 allows for session affinity for loadbalancing SessionAffinityVersion = VersionRanges{VersionRange{MinVersion: Version{Major: 12, Minor: 0}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}}} @@ -63,6 +62,18 @@ var ( SetPolicyVersion = VersionRanges{VersionRange{MinVersion: Version{Major: 13, Minor: 0}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}}} // HNS 10.3 allows for VXLAN ports VxlanPortVersion = VersionRanges{VersionRange{MinVersion: Version{Major: 10, Minor: 3}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}}} + + //HNS 9.5 through 10.0(not included), 10.5 through 11.0(not included), 11.11 through 12.0(not included), 12.1 through 13.0(not included), 13.1+ allows for Network L4Proxy Policy support + L4ProxyPolicyVersion = VersionRanges{ + VersionRange{MinVersion: Version{Major: 9, Minor: 5}, MaxVersion: Version{Major: 9, Minor: math.MaxInt32}}, + VersionRange{MinVersion: Version{Major: 10, Minor: 5}, MaxVersion: Version{Major: 10, Minor: math.MaxInt32}}, + VersionRange{MinVersion: Version{Major: 11, Minor: 11}, MaxVersion: Version{Major: 11, Minor: math.MaxInt32}}, + VersionRange{MinVersion: Version{Major: 12, Minor: 1}, MaxVersion: Version{Major: 12, Minor: math.MaxInt32}}, + VersionRange{MinVersion: Version{Major: 13, Minor: 1}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}}, + } + + //HNS 13.2 allows for L4WfpProxy Policy support + L4WfpProxyPolicyVersion = VersionRanges{VersionRange{MinVersion: Version{Major: 13, Minor: 2}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}}} ) // GetGlobals returns the global properties of the HCN Service. diff --git a/vendor/github.com/Microsoft/hcsshim/hcn/hcnpolicy.go b/vendor/github.com/Microsoft/hcsshim/hcn/hcnpolicy.go index 65938f610f3f..e52a281c3c61 100644 --- a/vendor/github.com/Microsoft/hcsshim/hcn/hcnpolicy.go +++ b/vendor/github.com/Microsoft/hcsshim/hcn/hcnpolicy.go @@ -46,6 +46,7 @@ const ( VxlanPort NetworkPolicyType = "VxlanPort" HostRoute NetworkPolicyType = "HostRoute" SetPolicy NetworkPolicyType = "SetPolicy" + NetworkL4Proxy NetworkPolicyType = "L4Proxy" ) // NetworkPolicy is a collection of Policy settings for a Network. @@ -141,7 +142,7 @@ type SDNRoutePolicySetting struct { NeedEncap bool `json:",omitempty"` } -// FiveTuple is nested in L4ProxyPolicySetting for WFP support. +// FiveTuple is nested in L4ProxyPolicySetting for WFP support. type FiveTuple struct { Protocols string `json:",omitempty"` LocalAddresses string `json:",omitempty"` @@ -153,9 +154,10 @@ type FiveTuple struct { // L4WfpProxyPolicySetting sets Layer-4 Proxy on an endpoint. type L4WfpProxyPolicySetting struct { - Port string `json:",omitempty"` - FilterTuple FiveTuple `json:",omitempty"` - UserSID string `json:",omitempty"` + InboundProxyPort string `json:",omitempty"` + OutboundProxyPort string `json:",omitempty"` + FilterTuple FiveTuple `json:",omitempty"` + UserSID string `json:",omitempty"` } // PortnameEndpointPolicySetting sets the port name for an endpoint. @@ -252,3 +254,25 @@ type SetPolicySetting struct { type VxlanPortPolicySetting struct { Port uint16 } + +// ProtocolType associated with L4ProxyPolicy +type ProtocolType uint32 + +const ( + ProtocolTypeUnknown ProtocolType = 0 + ProtocolTypeICMPv4 ProtocolType = 1 + ProtocolTypeIGMP ProtocolType = 2 + ProtocolTypeTCP ProtocolType = 6 + ProtocolTypeUDP ProtocolType = 17 + ProtocolTypeICMPv6 ProtocolType = 58 +) + +//L4ProxyPolicySetting applies proxy policy on network/endpoint +type L4ProxyPolicySetting struct { + IP string `json:",omitempty"` + Port string `json:",omitempty"` + Protocol ProtocolType `json:",omitempty"` + Exceptions []string `json:",omitempty"` + Destination string + OutboundNAT bool `json:",omitempty"` +} diff --git a/vendor/github.com/Microsoft/hcsshim/hcn/hcnsupport.go b/vendor/github.com/Microsoft/hcsshim/hcn/hcnsupport.go index bec87353a6ad..1096aebde5a4 100644 --- a/vendor/github.com/Microsoft/hcsshim/hcn/hcnsupport.go +++ b/vendor/github.com/Microsoft/hcsshim/hcn/hcnsupport.go @@ -17,6 +17,8 @@ type SupportedFeatures struct { IPv6DualStack bool `json:"IPv6DualStack"` SetPolicy bool `json:"SetPolicy"` VxlanPort bool `json:"VxlanPort"` + L4Proxy bool `json:"L4Proxy"` // network policy that applies VFP rules to all endpoints on the network to redirect traffic + L4WfpProxy bool `json:"L4WfpProxy"` // endpoint policy that applies WFP filters to redirect traffic to/from that endpoint } // AclFeatures are the supported ACL possibilities. @@ -65,6 +67,8 @@ func GetSupportedFeatures() SupportedFeatures { features.IPv6DualStack = isFeatureSupported(globals.Version, IPv6DualStackVersion) features.SetPolicy = isFeatureSupported(globals.Version, SetPolicyVersion) features.VxlanPort = isFeatureSupported(globals.Version, VxlanPortVersion) + features.L4Proxy = isFeatureSupported(globals.Version, L4ProxyPolicyVersion) + features.L4WfpProxy = isFeatureSupported(globals.Version, L4WfpProxyPolicyVersion) return features } diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/syscall.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/syscall.go deleted file mode 100644 index ded2175c50dc..000000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/syscall.go +++ /dev/null @@ -1,5 +0,0 @@ -package hcs - -//go:generate go run ../../mksyscall_windows.go -output zsyscall_windows.go syscall.go - -//sys hcsFormatWritableLayerVhd(handle uintptr) (hr error) = computestorage.HcsFormatWritableLayerVhd diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/utils.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/utils.go index b474604bd208..3342e5bb9486 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/utils.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/hcs/utils.go @@ -7,6 +7,7 @@ import ( "github.com/Microsoft/go-winio" diskutil "github.com/Microsoft/go-winio/vhd" + "github.com/Microsoft/hcsshim/computestorage" "github.com/pkg/errors" "golang.org/x/sys/windows" ) @@ -36,7 +37,7 @@ func makeOpenFiles(hs []syscall.Handle) (_ []io.ReadWriteCloser, err error) { return fs, nil } -// creates a VHD formatted with NTFS of size `sizeGB` at the given `vhdPath`. +// CreateNTFSVHD creates a VHD formatted with NTFS of size `sizeGB` at the given `vhdPath`. func CreateNTFSVHD(ctx context.Context, vhdPath string, sizeGB uint32) (err error) { if err := diskutil.CreateVhdx(vhdPath, sizeGB, 1); err != nil { return errors.Wrap(err, "failed to create VHD") @@ -53,7 +54,7 @@ func CreateNTFSVHD(ctx context.Context, vhdPath string, sizeGB uint32) (err erro } }() - if err := hcsFormatWritableLayerVhd(uintptr(vhd)); err != nil { + if err := computestorage.FormatWritableLayerVhd(ctx, windows.Handle(vhd)); err != nil { return errors.Wrap(err, "failed to format VHD") } diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/zsyscall_windows.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/zsyscall_windows.go deleted file mode 100644 index 39396d27267f..000000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/zsyscall_windows.go +++ /dev/null @@ -1,54 +0,0 @@ -// Code generated mksyscall_windows.exe DO NOT EDIT - -package hcs - -import ( - "syscall" - "unsafe" - - "golang.org/x/sys/windows" -) - -var _ unsafe.Pointer - -// Do the interface allocations only once for common -// Errno values. -const ( - errnoERROR_IO_PENDING = 997 -) - -var ( - errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) -) - -// errnoErr returns common boxed Errno values, to prevent -// allocations at runtime. -func errnoErr(e syscall.Errno) error { - switch e { - case 0: - return nil - case errnoERROR_IO_PENDING: - return errERROR_IO_PENDING - } - // TODO: add more here, after collecting data on the common - // error values see on Windows. (perhaps when running - // all.bat?) - return e -} - -var ( - modcomputestorage = windows.NewLazySystemDLL("computestorage.dll") - - procHcsFormatWritableLayerVhd = modcomputestorage.NewProc("HcsFormatWritableLayerVhd") -) - -func hcsFormatWritableLayerVhd(handle uintptr) (hr error) { - r0, _, _ := syscall.Syscall(procHcsFormatWritableLayerVhd.Addr(), 1, uintptr(handle), 0, 0) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } - return -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hns/namespace.go b/vendor/github.com/Microsoft/hcsshim/internal/hns/namespace.go index 45e2281b0781..d3b04eefe0cd 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/hns/namespace.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/hns/namespace.go @@ -27,9 +27,10 @@ type namespaceResourceRequest struct { } type Namespace struct { - ID string - IsDefault bool `json:",omitempty"` - ResourceList []NamespaceResource `json:",omitempty"` + ID string + IsDefault bool `json:",omitempty"` + ResourceList []NamespaceResource `json:",omitempty"` + CompartmentId uint32 `json:",omitempty"` } func issueNamespaceRequest(id *string, method, subpath string, request interface{}) (*Namespace, error) { diff --git a/vendor/github.com/Microsoft/hcsshim/internal/safefile/safeopen.go b/vendor/github.com/Microsoft/hcsshim/internal/safefile/safeopen.go index f31edfaf8674..d484c212cdb4 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/safefile/safeopen.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/safefile/safeopen.go @@ -11,72 +11,11 @@ import ( "unsafe" "github.com/Microsoft/hcsshim/internal/longpath" + "github.com/Microsoft/hcsshim/internal/winapi" winio "github.com/Microsoft/go-winio" ) -//go:generate go run $GOROOT\src\syscall\mksyscall_windows.go -output zsyscall_windows.go safeopen.go - -//sys ntCreateFile(handle *uintptr, accessMask uint32, oa *objectAttributes, iosb *ioStatusBlock, allocationSize *uint64, fileAttributes uint32, shareAccess uint32, createDisposition uint32, createOptions uint32, eaBuffer *byte, eaLength uint32) (status uint32) = ntdll.NtCreateFile -//sys ntSetInformationFile(handle uintptr, iosb *ioStatusBlock, information uintptr, length uint32, class uint32) (status uint32) = ntdll.NtSetInformationFile -//sys rtlNtStatusToDosError(status uint32) (winerr error) = ntdll.RtlNtStatusToDosErrorNoTeb -//sys localAlloc(flags uint32, size int) (ptr uintptr) = kernel32.LocalAlloc -//sys localFree(ptr uintptr) = kernel32.LocalFree - -type ioStatusBlock struct { - Status, Information uintptr -} - -type objectAttributes struct { - Length uintptr - RootDirectory uintptr - ObjectName uintptr - Attributes uintptr - SecurityDescriptor uintptr - SecurityQoS uintptr -} - -type unicodeString struct { - Length uint16 - MaximumLength uint16 - Buffer uintptr -} - -type fileLinkInformation struct { - ReplaceIfExists bool - RootDirectory uintptr - FileNameLength uint32 - FileName [1]uint16 -} - -type fileDispositionInformationEx struct { - Flags uintptr -} - -const ( - _FileLinkInformation = 11 - _FileDispositionInformationEx = 64 - - FILE_READ_ATTRIBUTES = 0x0080 - FILE_WRITE_ATTRIBUTES = 0x0100 - DELETE = 0x10000 - - FILE_OPEN = 1 - FILE_CREATE = 2 - - FILE_DIRECTORY_FILE = 0x00000001 - FILE_SYNCHRONOUS_IO_NONALERT = 0x00000020 - FILE_DELETE_ON_CLOSE = 0x00001000 - FILE_OPEN_FOR_BACKUP_INTENT = 0x00004000 - FILE_OPEN_REPARSE_POINT = 0x00200000 - - FILE_DISPOSITION_DELETE = 0x00000001 - - _OBJ_DONT_REPARSE = 0x1000 - - _STATUS_REPARSE_POINT_ENCOUNTERED = 0xC000050B -) - func OpenRoot(path string) (*os.File, error) { longpath, err := longpath.LongAbs(path) if err != nil { @@ -85,16 +24,24 @@ func OpenRoot(path string) (*os.File, error) { return winio.OpenForBackup(longpath, syscall.GENERIC_READ, syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE, syscall.OPEN_EXISTING) } -func ntRelativePath(path string) ([]uint16, error) { +func cleanGoStringRelativePath(path string) (string, error) { path = filepath.Clean(path) if strings.Contains(path, ":") { // Since alternate data streams must follow the file they // are attached to, finding one here (out of order) is invalid. - return nil, errors.New("path contains invalid character `:`") + return "", errors.New("path contains invalid character `:`") } fspath := filepath.FromSlash(path) if len(fspath) > 0 && fspath[0] == '\\' { - return nil, errors.New("expected relative path") + return "", errors.New("expected relative path") + } + return fspath, nil +} + +func ntRelativePath(path string) ([]uint16, error) { + fspath, err := cleanGoStringRelativePath(path) + if err != nil { + return nil, err } path16 := utf16.Encode(([]rune)(fspath)) @@ -110,11 +57,11 @@ func ntRelativePath(path string) ([]uint16, error) { func openRelativeInternal(path string, root *os.File, accessMask uint32, shareFlags uint32, createDisposition uint32, flags uint32) (*os.File, error) { var ( h uintptr - iosb ioStatusBlock - oa objectAttributes + iosb winapi.IOStatusBlock + oa winapi.ObjectAttributes ) - path16, err := ntRelativePath(path) + cleanRelativePath, err := cleanGoStringRelativePath(path) if err != nil { return nil, err } @@ -123,20 +70,16 @@ func openRelativeInternal(path string, root *os.File, accessMask uint32, shareFl return nil, errors.New("missing root directory") } - upathBuffer := localAlloc(0, int(unsafe.Sizeof(unicodeString{}))+len(path16)*2) - defer localFree(upathBuffer) - - upath := (*unicodeString)(unsafe.Pointer(upathBuffer)) - upath.Length = uint16(len(path16) * 2) - upath.MaximumLength = upath.Length - upath.Buffer = upathBuffer + unsafe.Sizeof(*upath) - copy((*[32768]uint16)(unsafe.Pointer(upath.Buffer))[:], path16) + pathUnicode, err := winapi.NewUnicodeString(cleanRelativePath) + if err != nil { + return nil, err + } oa.Length = unsafe.Sizeof(oa) - oa.ObjectName = upathBuffer + oa.ObjectName = uintptr(unsafe.Pointer(pathUnicode)) oa.RootDirectory = uintptr(root.Fd()) - oa.Attributes = _OBJ_DONT_REPARSE - status := ntCreateFile( + oa.Attributes = winapi.OBJ_DONT_REPARSE + status := winapi.NtCreateFile( &h, accessMask|syscall.SYNCHRONIZE, &oa, @@ -145,12 +88,12 @@ func openRelativeInternal(path string, root *os.File, accessMask uint32, shareFl 0, shareFlags, createDisposition, - FILE_OPEN_FOR_BACKUP_INTENT|FILE_SYNCHRONOUS_IO_NONALERT|flags, + winapi.FILE_OPEN_FOR_BACKUP_INTENT|winapi.FILE_SYNCHRONOUS_IO_NONALERT|flags, nil, 0, ) if status != 0 { - return nil, rtlNtStatusToDosError(status) + return nil, winapi.RtlNtStatusToDosError(status) } fullPath, err := longpath.LongAbs(filepath.Join(root.Name(), path)) @@ -182,7 +125,7 @@ func LinkRelative(oldname string, oldroot *os.File, newname string, newroot *os. oldroot, syscall.FILE_WRITE_ATTRIBUTES, syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE, - FILE_OPEN, + winapi.FILE_OPEN, 0, ) if err != nil { @@ -199,8 +142,8 @@ func LinkRelative(oldname string, oldroot *os.File, newname string, newroot *os. newroot, syscall.GENERIC_READ, syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE, - FILE_OPEN, - FILE_DIRECTORY_FILE) + winapi.FILE_OPEN, + winapi.FILE_DIRECTORY_FILE) if err != nil { return &os.LinkError{Op: "link", Old: oldf.Name(), New: filepath.Join(newroot.Name(), newname), Err: err} } @@ -211,7 +154,7 @@ func LinkRelative(oldname string, oldroot *os.File, newname string, newroot *os. return err } if (fi.FileAttributes & syscall.FILE_ATTRIBUTE_REPARSE_POINT) != 0 { - return &os.LinkError{Op: "link", Old: oldf.Name(), New: filepath.Join(newroot.Name(), newname), Err: rtlNtStatusToDosError(_STATUS_REPARSE_POINT_ENCOUNTERED)} + return &os.LinkError{Op: "link", Old: oldf.Name(), New: filepath.Join(newroot.Name(), newname), Err: winapi.RtlNtStatusToDosError(winapi.STATUS_REPARSE_POINT_ENCOUNTERED)} } } else { @@ -227,24 +170,25 @@ func LinkRelative(oldname string, oldroot *os.File, newname string, newroot *os. return err } - size := int(unsafe.Offsetof(fileLinkInformation{}.FileName)) + len(newbase16)*2 - linkinfoBuffer := localAlloc(0, size) - defer localFree(linkinfoBuffer) - linkinfo := (*fileLinkInformation)(unsafe.Pointer(linkinfoBuffer)) + size := int(unsafe.Offsetof(winapi.FileLinkInformation{}.FileName)) + len(newbase16)*2 + linkinfoBuffer := winapi.LocalAlloc(0, size) + defer winapi.LocalFree(linkinfoBuffer) + + linkinfo := (*winapi.FileLinkInformation)(unsafe.Pointer(linkinfoBuffer)) linkinfo.RootDirectory = parent.Fd() linkinfo.FileNameLength = uint32(len(newbase16) * 2) copy((*[32768]uint16)(unsafe.Pointer(&linkinfo.FileName[0]))[:], newbase16) - var iosb ioStatusBlock - status := ntSetInformationFile( + var iosb winapi.IOStatusBlock + status := winapi.NtSetInformationFile( oldf.Fd(), &iosb, linkinfoBuffer, uint32(size), - _FileLinkInformation, + winapi.FileLinkInformationClass, ) if status != 0 { - return &os.LinkError{Op: "link", Old: oldf.Name(), New: filepath.Join(parent.Name(), newbase), Err: rtlNtStatusToDosError(status)} + return &os.LinkError{Op: "link", Old: oldf.Name(), New: filepath.Join(parent.Name(), newbase), Err: winapi.RtlNtStatusToDosError(status)} } return nil @@ -252,17 +196,17 @@ func LinkRelative(oldname string, oldroot *os.File, newname string, newroot *os. // deleteOnClose marks a file to be deleted when the handle is closed. func deleteOnClose(f *os.File) error { - disposition := fileDispositionInformationEx{Flags: FILE_DISPOSITION_DELETE} - var iosb ioStatusBlock - status := ntSetInformationFile( + disposition := winapi.FileDispositionInformationEx{Flags: winapi.FILE_DISPOSITION_DELETE} + var iosb winapi.IOStatusBlock + status := winapi.NtSetInformationFile( f.Fd(), &iosb, uintptr(unsafe.Pointer(&disposition)), uint32(unsafe.Sizeof(disposition)), - _FileDispositionInformationEx, + winapi.FileDispositionInformationExClass, ) if status != 0 { - return rtlNtStatusToDosError(status) + return winapi.RtlNtStatusToDosError(status) } return nil } @@ -291,10 +235,10 @@ func RemoveRelative(path string, root *os.File) error { f, err := openRelativeInternal( path, root, - FILE_READ_ATTRIBUTES|FILE_WRITE_ATTRIBUTES|DELETE, + winapi.FILE_READ_ATTRIBUTES|winapi.FILE_WRITE_ATTRIBUTES|winapi.DELETE, syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE, - FILE_OPEN, - FILE_OPEN_REPARSE_POINT) + winapi.FILE_OPEN, + winapi.FILE_OPEN_REPARSE_POINT) if err == nil { defer f.Close() err = deleteOnClose(f) @@ -385,8 +329,8 @@ func MkdirRelative(path string, root *os.File) error { root, 0, syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE, - FILE_CREATE, - FILE_DIRECTORY_FILE) + winapi.FILE_CREATE, + winapi.FILE_DIRECTORY_FILE) if err == nil { f.Close() } else { @@ -401,10 +345,10 @@ func LstatRelative(path string, root *os.File) (os.FileInfo, error) { f, err := openRelativeInternal( path, root, - FILE_READ_ATTRIBUTES, + winapi.FILE_READ_ATTRIBUTES, syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE, - FILE_OPEN, - FILE_OPEN_REPARSE_POINT) + winapi.FILE_OPEN, + winapi.FILE_OPEN_REPARSE_POINT) if err != nil { return nil, &os.PathError{Op: "stat", Path: filepath.Join(root.Name(), path), Err: err} } @@ -421,7 +365,7 @@ func EnsureNotReparsePointRelative(path string, root *os.File) error { root, 0, syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE, - FILE_OPEN, + winapi.FILE_OPEN, 0) if err != nil { return err diff --git a/vendor/github.com/Microsoft/hcsshim/internal/safefile/zsyscall_windows.go b/vendor/github.com/Microsoft/hcsshim/internal/safefile/zsyscall_windows.go deleted file mode 100644 index 709b9d3475d1..000000000000 --- a/vendor/github.com/Microsoft/hcsshim/internal/safefile/zsyscall_windows.go +++ /dev/null @@ -1,79 +0,0 @@ -// Code generated by 'go generate'; DO NOT EDIT. - -package safefile - -import ( - "syscall" - "unsafe" - - "golang.org/x/sys/windows" -) - -var _ unsafe.Pointer - -// Do the interface allocations only once for common -// Errno values. -const ( - errnoERROR_IO_PENDING = 997 -) - -var ( - errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) -) - -// errnoErr returns common boxed Errno values, to prevent -// allocations at runtime. -func errnoErr(e syscall.Errno) error { - switch e { - case 0: - return nil - case errnoERROR_IO_PENDING: - return errERROR_IO_PENDING - } - // TODO: add more here, after collecting data on the common - // error values see on Windows. (perhaps when running - // all.bat?) - return e -} - -var ( - modntdll = windows.NewLazySystemDLL("ntdll.dll") - modkernel32 = windows.NewLazySystemDLL("kernel32.dll") - - procNtCreateFile = modntdll.NewProc("NtCreateFile") - procNtSetInformationFile = modntdll.NewProc("NtSetInformationFile") - procRtlNtStatusToDosErrorNoTeb = modntdll.NewProc("RtlNtStatusToDosErrorNoTeb") - procLocalAlloc = modkernel32.NewProc("LocalAlloc") - procLocalFree = modkernel32.NewProc("LocalFree") -) - -func ntCreateFile(handle *uintptr, accessMask uint32, oa *objectAttributes, iosb *ioStatusBlock, allocationSize *uint64, fileAttributes uint32, shareAccess uint32, createDisposition uint32, createOptions uint32, eaBuffer *byte, eaLength uint32) (status uint32) { - r0, _, _ := syscall.Syscall12(procNtCreateFile.Addr(), 11, uintptr(unsafe.Pointer(handle)), uintptr(accessMask), uintptr(unsafe.Pointer(oa)), uintptr(unsafe.Pointer(iosb)), uintptr(unsafe.Pointer(allocationSize)), uintptr(fileAttributes), uintptr(shareAccess), uintptr(createDisposition), uintptr(createOptions), uintptr(unsafe.Pointer(eaBuffer)), uintptr(eaLength), 0) - status = uint32(r0) - return -} - -func ntSetInformationFile(handle uintptr, iosb *ioStatusBlock, information uintptr, length uint32, class uint32) (status uint32) { - r0, _, _ := syscall.Syscall6(procNtSetInformationFile.Addr(), 5, uintptr(handle), uintptr(unsafe.Pointer(iosb)), uintptr(information), uintptr(length), uintptr(class), 0) - status = uint32(r0) - return -} - -func rtlNtStatusToDosError(status uint32) (winerr error) { - r0, _, _ := syscall.Syscall(procRtlNtStatusToDosErrorNoTeb.Addr(), 1, uintptr(status), 0, 0) - if r0 != 0 { - winerr = syscall.Errno(r0) - } - return -} - -func localAlloc(flags uint32, size int) (ptr uintptr) { - r0, _, _ := syscall.Syscall(procLocalAlloc.Addr(), 2, uintptr(flags), uintptr(size), 0) - ptr = uintptr(r0) - return -} - -func localFree(ptr uintptr) { - syscall.Syscall(procLocalFree.Addr(), 1, uintptr(ptr), 0, 0) - return -} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/schema2/cpu_group.go b/vendor/github.com/Microsoft/hcsshim/internal/schema2/cpu_group.go new file mode 100644 index 000000000000..90332a5190f1 --- /dev/null +++ b/vendor/github.com/Microsoft/hcsshim/internal/schema2/cpu_group.go @@ -0,0 +1,15 @@ +/* + * HCS API + * + * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) + * + * API version: 2.4 + * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) + */ + +package hcsschema + +// CPU groups allow Hyper-V administrators to better manage and allocate the host's CPU resources across guest virtual machines +type CpuGroup struct { + Id string `json:"Id,omitempty"` +} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/schema2/cpu_group_affinity.go b/vendor/github.com/Microsoft/hcsshim/internal/schema2/cpu_group_affinity.go new file mode 100644 index 000000000000..8794961bf5c4 --- /dev/null +++ b/vendor/github.com/Microsoft/hcsshim/internal/schema2/cpu_group_affinity.go @@ -0,0 +1,15 @@ +/* + * HCS API + * + * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) + * + * API version: 2.4 + * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) + */ + +package hcsschema + +type CpuGroupAffinity struct { + LogicalProcessorCount int32 `json:"LogicalProcessorCount,omitempty"` + LogicalProcessors []int32 `json:"LogicalProcessors,omitempty"` +} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/schema2/cpu_group_config.go b/vendor/github.com/Microsoft/hcsshim/internal/schema2/cpu_group_config.go new file mode 100644 index 000000000000..f1a28cd38989 --- /dev/null +++ b/vendor/github.com/Microsoft/hcsshim/internal/schema2/cpu_group_config.go @@ -0,0 +1,18 @@ +/* + * HCS API + * + * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) + * + * API version: 2.4 + * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) + */ + +package hcsschema + +type CpuGroupConfig struct { + GroupId string `json:"GroupId,omitempty"` + Affinity *CpuGroupAffinity `json:"Affinity,omitempty"` + GroupProperties []CpuGroupProperty `json:"GroupProperties,omitempty"` + // Hypervisor CPU group IDs exposed to clients + HypervisorGroupId int32 `json:"HypervisorGroupId,omitempty"` +} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/schema2/cpu_group_configurations.go b/vendor/github.com/Microsoft/hcsshim/internal/schema2/cpu_group_configurations.go new file mode 100644 index 000000000000..3ace0ccc3b89 --- /dev/null +++ b/vendor/github.com/Microsoft/hcsshim/internal/schema2/cpu_group_configurations.go @@ -0,0 +1,15 @@ +/* + * HCS API + * + * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) + * + * API version: 2.4 + * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) + */ + +package hcsschema + +// Structure used to return cpu groups for a Service property query +type CpuGroupConfigurations struct { + CpuGroups []CpuGroupConfig `json:"CpuGroups,omitempty"` +} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/schema2/cpu_group_operations.go b/vendor/github.com/Microsoft/hcsshim/internal/schema2/cpu_group_operations.go new file mode 100644 index 000000000000..7d897807016d --- /dev/null +++ b/vendor/github.com/Microsoft/hcsshim/internal/schema2/cpu_group_operations.go @@ -0,0 +1,18 @@ +/* + * HCS API + * + * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) + * + * API version: 2.4 + * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) + */ + +package hcsschema + +type CPUGroupOperation string + +const ( + CreateGroup CPUGroupOperation = "CreateGroup" + DeleteGroup CPUGroupOperation = "DeleteGroup" + SetProperty CPUGroupOperation = "SetProperty" +) diff --git a/vendor/github.com/Microsoft/hcsshim/internal/schema2/cpu_group_property.go b/vendor/github.com/Microsoft/hcsshim/internal/schema2/cpu_group_property.go new file mode 100644 index 000000000000..bbad6a2c450a --- /dev/null +++ b/vendor/github.com/Microsoft/hcsshim/internal/schema2/cpu_group_property.go @@ -0,0 +1,15 @@ +/* + * HCS API + * + * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) + * + * API version: 2.4 + * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) + */ + +package hcsschema + +type CpuGroupProperty struct { + PropertyCode uint32 `json:"PropertyCode,omitempty"` + PropertyValue uint32 `json:"PropertyValue,omitempty"` +} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/schema2/create_group_operation.go b/vendor/github.com/Microsoft/hcsshim/internal/schema2/create_group_operation.go new file mode 100644 index 000000000000..91a8278fe3c5 --- /dev/null +++ b/vendor/github.com/Microsoft/hcsshim/internal/schema2/create_group_operation.go @@ -0,0 +1,17 @@ +/* + * HCS API + * + * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) + * + * API version: 2.4 + * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) + */ + +package hcsschema + +// Create group operation settings +type CreateGroupOperation struct { + GroupId string `json:"GroupId,omitempty"` + LogicalProcessorCount uint32 `json:"LogicalProcessorCount,omitempty"` + LogicalProcessors []uint32 `json:"LogicalProcessors,omitempty"` +} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/schema2/delete_group_operation.go b/vendor/github.com/Microsoft/hcsshim/internal/schema2/delete_group_operation.go new file mode 100644 index 000000000000..134bd988175c --- /dev/null +++ b/vendor/github.com/Microsoft/hcsshim/internal/schema2/delete_group_operation.go @@ -0,0 +1,15 @@ +/* + * HCS API + * + * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) + * + * API version: 2.4 + * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) + */ + +package hcsschema + +// Delete group operation settings +type DeleteGroupOperation struct { + GroupId string `json:"GroupId,omitempty"` +} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/schema2/host_processor_modify_request.go b/vendor/github.com/Microsoft/hcsshim/internal/schema2/host_processor_modify_request.go new file mode 100644 index 000000000000..2238ce5306c3 --- /dev/null +++ b/vendor/github.com/Microsoft/hcsshim/internal/schema2/host_processor_modify_request.go @@ -0,0 +1,16 @@ +/* + * HCS API + * + * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) + * + * API version: 2.4 + * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) + */ + +package hcsschema + +// Structure used to request a service processor modification +type HostProcessorModificationRequest struct { + Operation CPUGroupOperation `json:"Operation,omitempty"` + OperationDetails interface{} `json:"OperationDetails,omitempty"` +} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/schema2/hv_socket_service_config.go b/vendor/github.com/Microsoft/hcsshim/internal/schema2/hv_socket_service_config.go index a848e91e69b6..ecd9f7fbac24 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/schema2/hv_socket_service_config.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/schema2/hv_socket_service_config.go @@ -19,4 +19,10 @@ type HvSocketServiceConfig struct { // If true, HvSocket will process wildcard binds for this service/system combination. Wildcard binds are secured in the registry at SOFTWARE/Microsoft/Windows NT/CurrentVersion/Virtualization/HvSocket/WildcardDescriptors AllowWildcardBinds bool `json:"AllowWildcardBinds,omitempty"` + + // Disabled controls whether the HvSocket service is accepting connection requests. + // This set to true will make the service refuse all incoming connections as well as cancel + // any connections already established. The service itself will still be active however + // and can be re-enabled at a future time. + Disabled bool `json:"Disabled,omitempty"` } diff --git a/vendor/github.com/Microsoft/hcsshim/internal/schema2/logical_processor.go b/vendor/github.com/Microsoft/hcsshim/internal/schema2/logical_processor.go index 8436df02a090..676ad300dcce 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/schema2/logical_processor.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/schema2/logical_processor.go @@ -10,7 +10,7 @@ package hcsschema type LogicalProcessor struct { - LpIndex uint32 `json:"LogicalProcessorCount,omitempty"` + LpIndex uint32 `json:"LpIndex,omitempty"` NodeNumber uint8 `json:"NodeNumber, omitempty"` PackageId uint32 `json:"PackageId, omitempty"` CoreId uint32 `json:"CoreId, omitempty"` diff --git a/vendor/github.com/Microsoft/hcsshim/internal/schema2/memory.go b/vendor/github.com/Microsoft/hcsshim/internal/schema2/memory.go index ec93d004e104..30749c672496 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/schema2/memory.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/schema2/memory.go @@ -10,5 +10,5 @@ package hcsschema type Memory struct { - SizeInMB int32 `json:"SizeInMB,omitempty"` + SizeInMB uint64 `json:"SizeInMB,omitempty"` } diff --git a/vendor/github.com/Microsoft/hcsshim/internal/schema2/memory_2.go b/vendor/github.com/Microsoft/hcsshim/internal/schema2/memory_2.go index 95328ec301b5..71224c75b9de 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/schema2/memory_2.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/schema2/memory_2.go @@ -10,7 +10,7 @@ package hcsschema type Memory2 struct { - SizeInMB int32 `json:"SizeInMB,omitempty"` + SizeInMB uint64 `json:"SizeInMB,omitempty"` AllowOvercommit bool `json:"AllowOvercommit,omitempty"` diff --git a/vendor/github.com/Microsoft/hcsshim/internal/schema2/property_type.go b/vendor/github.com/Microsoft/hcsshim/internal/schema2/property_type.go index 0f1ee621a65c..98f2c96edbd6 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/schema2/property_type.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/schema2/property_type.go @@ -22,4 +22,5 @@ const ( PTGuestConnection PropertyType = "GuestConnection" PTICHeartbeatStatus PropertyType = "ICHeartbeatStatus" PTProcessorTopology PropertyType = "ProcessorTopology" + PTCPUGroup PropertyType = "CpuGroup" ) diff --git a/vendor/github.com/Microsoft/hcsshim/internal/schema2/vm_processor_limits.go b/vendor/github.com/Microsoft/hcsshim/internal/schema2/vm_processor_limits.go new file mode 100644 index 000000000000..de1b9cf1ae20 --- /dev/null +++ b/vendor/github.com/Microsoft/hcsshim/internal/schema2/vm_processor_limits.go @@ -0,0 +1,22 @@ +/* + * HCS API + * + * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) + * + * API version: 2.4 + * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) + */ + +package hcsschema + +// ProcessorLimits is used when modifying processor scheduling limits of a virtual machine. +type ProcessorLimits struct { + // Maximum amount of host CPU resources that the virtual machine can use. + Limit uint64 `json:"Limit,omitempty"` + // Value describing the relative priority of this virtual machine compared to other virtual machines. + Weight uint64 `json:"Weight,omitempty"` + // Minimum amount of host CPU resources that the virtual machine is guaranteed. + Reservation uint64 `json:"Reservation,omitempty"` + // Provides the target maximum CPU frequency, in MHz, for a virtual machine. + MaximumFrequencyMHz uint32 `json:"MaximumFrequencyMHz,omitempty"` +} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/baselayer.go b/vendor/github.com/Microsoft/hcsshim/internal/wclayer/baselayer.go index 20cafcf325fc..3ec708d1ed35 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/baselayer.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/wclayer/baselayer.go @@ -11,6 +11,7 @@ import ( "github.com/Microsoft/hcsshim/internal/hcserror" "github.com/Microsoft/hcsshim/internal/oc" "github.com/Microsoft/hcsshim/internal/safefile" + "github.com/Microsoft/hcsshim/internal/winapi" "go.opencensus.io/trace" ) @@ -37,7 +38,7 @@ type dirInfo struct { func reapplyDirectoryTimes(root *os.File, dis []dirInfo) error { for i := range dis { di := &dis[len(dis)-i-1] // reverse order: process child directories first - f, err := safefile.OpenRelative(di.path, root, syscall.GENERIC_READ|syscall.GENERIC_WRITE, syscall.FILE_SHARE_READ, safefile.FILE_OPEN, safefile.FILE_DIRECTORY_FILE|syscall.FILE_FLAG_OPEN_REPARSE_POINT) + f, err := safefile.OpenRelative(di.path, root, syscall.GENERIC_READ|syscall.GENERIC_WRITE, syscall.FILE_SHARE_READ, winapi.FILE_OPEN, winapi.FILE_DIRECTORY_FILE|syscall.FILE_FLAG_OPEN_REPARSE_POINT) if err != nil { return err } @@ -93,12 +94,12 @@ func (w *baseLayerWriter) Add(name string, fileInfo *winio.FileBasicInfo) (err e extraFlags := uint32(0) if fileInfo.FileAttributes&syscall.FILE_ATTRIBUTE_DIRECTORY != 0 { - extraFlags |= safefile.FILE_DIRECTORY_FILE + extraFlags |= winapi.FILE_DIRECTORY_FILE w.dirInfo = append(w.dirInfo, dirInfo{name, *fileInfo}) } mode := uint32(syscall.GENERIC_READ | syscall.GENERIC_WRITE | winio.WRITE_DAC | winio.WRITE_OWNER | winio.ACCESS_SYSTEM_SECURITY) - f, err = safefile.OpenRelative(name, w.root, mode, syscall.FILE_SHARE_READ, safefile.FILE_CREATE, extraFlags) + f, err = safefile.OpenRelative(name, w.root, mode, syscall.FILE_SHARE_READ, winapi.FILE_CREATE, extraFlags) if err != nil { return hcserror.New(err, "Failed to safefile.OpenRelative", name) } diff --git a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/createscratchlayer.go b/vendor/github.com/Microsoft/hcsshim/internal/wclayer/createscratchlayer.go index e3ff952a7b57..5a3809ae2292 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/createscratchlayer.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/wclayer/createscratchlayer.go @@ -10,9 +10,7 @@ import ( ) // CreateScratchLayer creates and populates new read-write layer for use by a container. -// This requires both the id of the direct parent layer, as well as the full list -// of paths to all parent layers up to the base (and including the direct parent -// whose id was provided). +// This requires the full list of paths to all parent layers up to the base func CreateScratchLayer(ctx context.Context, path string, parentLayerPaths []string) (err error) { title := "hcsshim::CreateScratchLayer" ctx, span := trace.StartSpan(ctx, title) diff --git a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/legacy.go b/vendor/github.com/Microsoft/hcsshim/internal/wclayer/legacy.go index a8a4db6f3f88..dc3caf7510d5 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/legacy.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/wclayer/legacy.go @@ -15,6 +15,7 @@ import ( "github.com/Microsoft/go-winio" "github.com/Microsoft/hcsshim/internal/longpath" "github.com/Microsoft/hcsshim/internal/safefile" + "github.com/Microsoft/hcsshim/internal/winapi" ) var errorIterationCanceled = errors.New("") @@ -472,8 +473,8 @@ func copyFileWithMetadata(srcRoot, destRoot *os.File, subPath string, isDir bool srcRoot, syscall.GENERIC_READ|winio.ACCESS_SYSTEM_SECURITY, syscall.FILE_SHARE_READ, - safefile.FILE_OPEN, - safefile.FILE_OPEN_REPARSE_POINT) + winapi.FILE_OPEN, + winapi.FILE_OPEN_REPARSE_POINT) if err != nil { return nil, err } @@ -488,14 +489,14 @@ func copyFileWithMetadata(srcRoot, destRoot *os.File, subPath string, isDir bool extraFlags := uint32(0) if isDir { - extraFlags |= safefile.FILE_DIRECTORY_FILE + extraFlags |= winapi.FILE_DIRECTORY_FILE } dest, err := safefile.OpenRelative( subPath, destRoot, syscall.GENERIC_READ|syscall.GENERIC_WRITE|winio.WRITE_DAC|winio.WRITE_OWNER|winio.ACCESS_SYSTEM_SECURITY, syscall.FILE_SHARE_READ, - safefile.FILE_CREATE, + winapi.FILE_CREATE, extraFlags) if err != nil { return nil, err @@ -595,7 +596,7 @@ func (w *legacyLayerWriter) Add(name string, fileInfo *winio.FileBasicInfo) erro if !hasPathPrefix(name, utilityVMFilesPath) && name != utilityVMFilesPath { return errors.New("invalid UtilityVM layer") } - createDisposition := uint32(safefile.FILE_OPEN) + createDisposition := uint32(winapi.FILE_OPEN) if (fileInfo.FileAttributes & syscall.FILE_ATTRIBUTE_DIRECTORY) != 0 { st, err := safefile.LstatRelative(name, w.destRoot) if err != nil && !os.IsNotExist(err) { @@ -622,7 +623,7 @@ func (w *legacyLayerWriter) Add(name string, fileInfo *winio.FileBasicInfo) erro if err != nil && !os.IsNotExist(err) { return err } - createDisposition = safefile.FILE_CREATE + createDisposition = winapi.FILE_CREATE } f, err := safefile.OpenRelative( @@ -631,7 +632,7 @@ func (w *legacyLayerWriter) Add(name string, fileInfo *winio.FileBasicInfo) erro syscall.GENERIC_READ|syscall.GENERIC_WRITE|winio.WRITE_DAC|winio.WRITE_OWNER|winio.ACCESS_SYSTEM_SECURITY, syscall.FILE_SHARE_READ, createDisposition, - safefile.FILE_OPEN_REPARSE_POINT, + winapi.FILE_OPEN_REPARSE_POINT, ) if err != nil { return err @@ -668,7 +669,7 @@ func (w *legacyLayerWriter) Add(name string, fileInfo *winio.FileBasicInfo) erro w.currentIsDir = true } - f, err := safefile.OpenRelative(fname, w.root, syscall.GENERIC_READ|syscall.GENERIC_WRITE, syscall.FILE_SHARE_READ, safefile.FILE_CREATE, 0) + f, err := safefile.OpenRelative(fname, w.root, syscall.GENERIC_READ|syscall.GENERIC_WRITE, syscall.FILE_SHARE_READ, winapi.FILE_CREATE, 0) if err != nil { return err } diff --git a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/wclayer.go b/vendor/github.com/Microsoft/hcsshim/internal/wclayer/wclayer.go index dc40bf51943c..9b1e06d50c5d 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/wclayer.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/wclayer/wclayer.go @@ -1,3 +1,6 @@ +// Package wclayer provides bindings to HCS's legacy layer management API and +// provides a higher level interface around these calls for container layer +// management. package wclayer import "github.com/Microsoft/go-winio/pkg/guid" diff --git a/vendor/github.com/Microsoft/hcsshim/internal/winapi/devices.go b/vendor/github.com/Microsoft/hcsshim/internal/winapi/devices.go new file mode 100644 index 000000000000..df28ea24216d --- /dev/null +++ b/vendor/github.com/Microsoft/hcsshim/internal/winapi/devices.go @@ -0,0 +1,13 @@ +package winapi + +import "github.com/Microsoft/go-winio/pkg/guid" + +//sys CMGetDeviceIDListSize(pulLen *uint32, pszFilter *byte, uFlags uint32) (hr error) = cfgmgr32.CM_Get_Device_ID_List_SizeA +//sys CMGetDeviceIDList(pszFilter *byte, buffer *byte, bufferLen uint32, uFlags uint32) (hr error)= cfgmgr32.CM_Get_Device_ID_ListA +//sys CMLocateDevNode(pdnDevInst *uint32, pDeviceID string, uFlags uint32) (hr error) = cfgmgr32.CM_Locate_DevNodeW +//sys CMGetDevNodeProperty(dnDevInst uint32, propertyKey *DevPropKey, propertyType *uint32, propertyBuffer *uint16, propertyBufferSize *uint32, uFlags uint32) (hr error) = cfgmgr32.CM_Get_DevNode_PropertyW + +type DevPropKey struct { + Fmtid guid.GUID + Pid uint32 +} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/winapi/errors.go b/vendor/github.com/Microsoft/hcsshim/internal/winapi/errors.go new file mode 100644 index 000000000000..4e80ef68c92c --- /dev/null +++ b/vendor/github.com/Microsoft/hcsshim/internal/winapi/errors.go @@ -0,0 +1,15 @@ +package winapi + +import "syscall" + +//sys RtlNtStatusToDosError(status uint32) (winerr error) = ntdll.RtlNtStatusToDosError + +const ( + STATUS_REPARSE_POINT_ENCOUNTERED = 0xC000050B + ERROR_NO_MORE_ITEMS = 0x103 + ERROR_MORE_DATA syscall.Errno = 234 +) + +func NTSuccess(status uint32) bool { + return status == 0 +} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/winapi/filesystem.go b/vendor/github.com/Microsoft/hcsshim/internal/winapi/filesystem.go new file mode 100644 index 000000000000..490576b9422b --- /dev/null +++ b/vendor/github.com/Microsoft/hcsshim/internal/winapi/filesystem.go @@ -0,0 +1,110 @@ +package winapi + +//sys NtCreateFile(handle *uintptr, accessMask uint32, oa *ObjectAttributes, iosb *IOStatusBlock, allocationSize *uint64, fileAttributes uint32, shareAccess uint32, createDisposition uint32, createOptions uint32, eaBuffer *byte, eaLength uint32) (status uint32) = ntdll.NtCreateFile +//sys NtSetInformationFile(handle uintptr, iosb *IOStatusBlock, information uintptr, length uint32, class uint32) (status uint32) = ntdll.NtSetInformationFile + +//sys NtOpenDirectoryObject(handle *uintptr, accessMask uint32, oa *ObjectAttributes) (status uint32) = ntdll.NtOpenDirectoryObject +//sys NtQueryDirectoryObject(handle uintptr, buffer *byte, length uint32, singleEntry bool, restartScan bool, context *uint32, returnLength *uint32)(status uint32) = ntdll.NtQueryDirectoryObject + +const ( + FileLinkInformationClass = 11 + FileDispositionInformationExClass = 64 + + FILE_READ_ATTRIBUTES = 0x0080 + FILE_WRITE_ATTRIBUTES = 0x0100 + DELETE = 0x10000 + + FILE_OPEN = 1 + FILE_CREATE = 2 + + FILE_LIST_DIRECTORY = 0x00000001 + FILE_DIRECTORY_FILE = 0x00000001 + FILE_SYNCHRONOUS_IO_NONALERT = 0x00000020 + FILE_OPEN_FOR_BACKUP_INTENT = 0x00004000 + FILE_OPEN_REPARSE_POINT = 0x00200000 + + FILE_DISPOSITION_DELETE = 0x00000001 + + OBJ_DONT_REPARSE = 0x1000 + + STATUS_MORE_ENTRIES = 0x105 + STATUS_NO_MORE_ENTRIES = 0x8000001a +) + +// Select entries from FILE_INFO_BY_HANDLE_CLASS. +// +// C declaration: +// typedef enum _FILE_INFO_BY_HANDLE_CLASS { +// FileBasicInfo, +// FileStandardInfo, +// FileNameInfo, +// FileRenameInfo, +// FileDispositionInfo, +// FileAllocationInfo, +// FileEndOfFileInfo, +// FileStreamInfo, +// FileCompressionInfo, +// FileAttributeTagInfo, +// FileIdBothDirectoryInfo, +// FileIdBothDirectoryRestartInfo, +// FileIoPriorityHintInfo, +// FileRemoteProtocolInfo, +// FileFullDirectoryInfo, +// FileFullDirectoryRestartInfo, +// FileStorageInfo, +// FileAlignmentInfo, +// FileIdInfo, +// FileIdExtdDirectoryInfo, +// FileIdExtdDirectoryRestartInfo, +// FileDispositionInfoEx, +// FileRenameInfoEx, +// FileCaseSensitiveInfo, +// FileNormalizedNameInfo, +// MaximumFileInfoByHandleClass +// } FILE_INFO_BY_HANDLE_CLASS, *PFILE_INFO_BY_HANDLE_CLASS; +// +// Documentation: https://docs.microsoft.com/en-us/windows/win32/api/minwinbase/ne-minwinbase-file_info_by_handle_class +const ( + FileIdInfo = 18 +) + +type FileDispositionInformationEx struct { + Flags uintptr +} + +type IOStatusBlock struct { + Status, Information uintptr +} + +type ObjectAttributes struct { + Length uintptr + RootDirectory uintptr + ObjectName uintptr + Attributes uintptr + SecurityDescriptor uintptr + SecurityQoS uintptr +} + +type ObjectDirectoryInformation struct { + Name UnicodeString + TypeName UnicodeString +} + +type FileLinkInformation struct { + ReplaceIfExists bool + RootDirectory uintptr + FileNameLength uint32 + FileName [1]uint16 +} + +// C declaration: +// typedef struct _FILE_ID_INFO { +// ULONGLONG VolumeSerialNumber; +// FILE_ID_128 FileId; +// } FILE_ID_INFO, *PFILE_ID_INFO; +// +// Documentation: https://docs.microsoft.com/en-us/windows/win32/api/winbase/ns-winbase-file_id_info +type FILE_ID_INFO struct { + VolumeSerialNumber uint64 + FileID [16]byte +} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/winapi/iocp.go b/vendor/github.com/Microsoft/hcsshim/internal/winapi/iocp.go new file mode 100644 index 000000000000..4e609cbf1cdb --- /dev/null +++ b/vendor/github.com/Microsoft/hcsshim/internal/winapi/iocp.go @@ -0,0 +1,3 @@ +package winapi + +//sys GetQueuedCompletionStatus(cphandle windows.Handle, qty *uint32, key *uintptr, overlapped **windows.Overlapped, timeout uint32) (err error) diff --git a/vendor/github.com/Microsoft/hcsshim/internal/winapi/jobobject.go b/vendor/github.com/Microsoft/hcsshim/internal/winapi/jobobject.go new file mode 100644 index 000000000000..6cb411cc4267 --- /dev/null +++ b/vendor/github.com/Microsoft/hcsshim/internal/winapi/jobobject.go @@ -0,0 +1,185 @@ +package winapi + +import ( + "unsafe" + + "golang.org/x/sys/windows" +) + +// Messages that can be received from an assigned io completion port. +// https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_associate_completion_port +const ( + JOB_OBJECT_MSG_END_OF_JOB_TIME uint32 = 1 + JOB_OBJECT_MSG_END_OF_PROCESS_TIME uint32 = 2 + JOB_OBJECT_MSG_ACTIVE_PROCESS_LIMIT uint32 = 3 + JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO uint32 = 4 + JOB_OBJECT_MSG_NEW_PROCESS uint32 = 6 + JOB_OBJECT_MSG_EXIT_PROCESS uint32 = 7 + JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESS uint32 = 8 + JOB_OBJECT_MSG_PROCESS_MEMORY_LIMIT uint32 = 9 + JOB_OBJECT_MSG_JOB_MEMORY_LIMIT uint32 = 10 + JOB_OBJECT_MSG_NOTIFICATION_LIMIT uint32 = 11 +) + +// IO limit flags +// +// https://docs.microsoft.com/en-us/windows/win32/api/jobapi2/ns-jobapi2-jobobject_io_rate_control_information +const JOB_OBJECT_IO_RATE_CONTROL_ENABLE = 0x1 + +const JOBOBJECT_IO_ATTRIBUTION_CONTROL_ENABLE uint32 = 0x1 + +// https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_cpu_rate_control_information +const ( + JOB_OBJECT_CPU_RATE_CONTROL_ENABLE uint32 = 1 << iota + JOB_OBJECT_CPU_RATE_CONTROL_WEIGHT_BASED + JOB_OBJECT_CPU_RATE_CONTROL_HARD_CAP + JOB_OBJECT_CPU_RATE_CONTROL_NOTIFY + JOB_OBJECT_CPU_RATE_CONTROL_MIN_MAX_RATE +) + +// JobObjectInformationClass values. Used for a call to QueryInformationJobObject +// +// https://docs.microsoft.com/en-us/windows/win32/api/jobapi2/nf-jobapi2-queryinformationjobobject +const ( + JobObjectBasicAccountingInformation uint32 = 1 + JobObjectBasicProcessIdList uint32 = 3 + JobObjectBasicAndIoAccountingInformation uint32 = 8 + JobObjectLimitViolationInformation uint32 = 13 + JobObjectMemoryUsageInformation uint32 = 28 + JobObjectNotificationLimitInformation2 uint32 = 33 + JobObjectIoAttribution uint32 = 42 +) + +// https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_basic_limit_information +type JOBOBJECT_BASIC_LIMIT_INFORMATION struct { + PerProcessUserTimeLimit int64 + PerJobUserTimeLimit int64 + LimitFlags uint32 + MinimumWorkingSetSize uintptr + MaximumWorkingSetSize uintptr + ActiveProcessLimit uint32 + Affinity uintptr + PriorityClass uint32 + SchedulingClass uint32 +} + +// https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_cpu_rate_control_information +type JOBOBJECT_CPU_RATE_CONTROL_INFORMATION struct { + ControlFlags uint32 + Value uint32 +} + +// https://docs.microsoft.com/en-us/windows/win32/api/jobapi2/ns-jobapi2-jobobject_io_rate_control_information +type JOBOBJECT_IO_RATE_CONTROL_INFORMATION struct { + MaxIops int64 + MaxBandwidth int64 + ReservationIops int64 + BaseIOSize uint32 + VolumeName string + ControlFlags uint32 +} + +// https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_basic_process_id_list +type JOBOBJECT_BASIC_PROCESS_ID_LIST struct { + NumberOfAssignedProcesses uint32 + NumberOfProcessIdsInList uint32 + ProcessIdList [1]uintptr +} + +// AllPids returns all the process Ids in the job object. +func (p *JOBOBJECT_BASIC_PROCESS_ID_LIST) AllPids() []uintptr { + return (*[(1 << 27) - 1]uintptr)(unsafe.Pointer(&p.ProcessIdList[0]))[:p.NumberOfProcessIdsInList] +} + +// https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_basic_accounting_information +type JOBOBJECT_BASIC_ACCOUNTING_INFORMATION struct { + TotalUserTime int64 + TotalKernelTime int64 + ThisPeriodTotalUserTime int64 + ThisPeriodTotalKernelTime int64 + TotalPageFaultCount uint32 + TotalProcesses uint32 + ActiveProcesses uint32 + TotalTerminateProcesses uint32 +} + +//https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_basic_and_io_accounting_information +type JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION struct { + BasicInfo JOBOBJECT_BASIC_ACCOUNTING_INFORMATION + IoInfo windows.IO_COUNTERS +} + +// typedef struct _JOBOBJECT_MEMORY_USAGE_INFORMATION { +// ULONG64 JobMemory; +// ULONG64 PeakJobMemoryUsed; +// } JOBOBJECT_MEMORY_USAGE_INFORMATION, *PJOBOBJECT_MEMORY_USAGE_INFORMATION; +// +type JOBOBJECT_MEMORY_USAGE_INFORMATION struct { + JobMemory uint64 + PeakJobMemoryUsed uint64 +} + +// typedef struct _JOBOBJECT_IO_ATTRIBUTION_STATS { +// ULONG_PTR IoCount; +// ULONGLONG TotalNonOverlappedQueueTime; +// ULONGLONG TotalNonOverlappedServiceTime; +// ULONGLONG TotalSize; +// } JOBOBJECT_IO_ATTRIBUTION_STATS, *PJOBOBJECT_IO_ATTRIBUTION_STATS; +// +type JOBOBJECT_IO_ATTRIBUTION_STATS struct { + IoCount uintptr + TotalNonOverlappedQueueTime uint64 + TotalNonOverlappedServiceTime uint64 + TotalSize uint64 +} + +// typedef struct _JOBOBJECT_IO_ATTRIBUTION_INFORMATION { +// ULONG ControlFlags; +// JOBOBJECT_IO_ATTRIBUTION_STATS ReadStats; +// JOBOBJECT_IO_ATTRIBUTION_STATS WriteStats; +// } JOBOBJECT_IO_ATTRIBUTION_INFORMATION, *PJOBOBJECT_IO_ATTRIBUTION_INFORMATION; +// +type JOBOBJECT_IO_ATTRIBUTION_INFORMATION struct { + ControlFlags uint32 + ReadStats JOBOBJECT_IO_ATTRIBUTION_STATS + WriteStats JOBOBJECT_IO_ATTRIBUTION_STATS +} + +// https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_associate_completion_port +type JOBOBJECT_ASSOCIATE_COMPLETION_PORT struct { + CompletionKey windows.Handle + CompletionPort windows.Handle +} + +// BOOL IsProcessInJob( +// HANDLE ProcessHandle, +// HANDLE JobHandle, +// PBOOL Result +// ); +// +//sys IsProcessInJob(procHandle windows.Handle, jobHandle windows.Handle, result *bool) (err error) = kernel32.IsProcessInJob + +// BOOL QueryInformationJobObject( +// HANDLE hJob, +// JOBOBJECTINFOCLASS JobObjectInformationClass, +// LPVOID lpJobObjectInformation, +// DWORD cbJobObjectInformationLength, +// LPDWORD lpReturnLength +// ); +// +//sys QueryInformationJobObject(jobHandle windows.Handle, infoClass uint32, jobObjectInfo uintptr, jobObjectInformationLength uint32, lpReturnLength *uint32) (err error) = kernel32.QueryInformationJobObject + +// HANDLE OpenJobObjectW( +// DWORD dwDesiredAccess, +// BOOL bInheritHandle, +// LPCWSTR lpName +// ); +// +//sys OpenJobObject(desiredAccess uint32, inheritHandle bool, lpName *uint16) (handle windows.Handle, err error) = kernel32.OpenJobObjectW + +// DWORD SetIoRateControlInformationJobObject( +// HANDLE hJob, +// JOBOBJECT_IO_RATE_CONTROL_INFORMATION *IoRateControlInfo +// ); +// +//sys SetIoRateControlInformationJobObject(jobHandle windows.Handle, ioRateControlInfo *JOBOBJECT_IO_RATE_CONTROL_INFORMATION) (ret uint32, err error) = kernel32.SetIoRateControlInformationJobObject diff --git a/vendor/github.com/Microsoft/hcsshim/internal/winapi/logon.go b/vendor/github.com/Microsoft/hcsshim/internal/winapi/logon.go new file mode 100644 index 000000000000..b6e7cfd4601d --- /dev/null +++ b/vendor/github.com/Microsoft/hcsshim/internal/winapi/logon.go @@ -0,0 +1,30 @@ +package winapi + +// BOOL LogonUserA( +// LPCWSTR lpszUsername, +// LPCWSTR lpszDomain, +// LPCWSTR lpszPassword, +// DWORD dwLogonType, +// DWORD dwLogonProvider, +// PHANDLE phToken +// ); +// +//sys LogonUser(username *uint16, domain *uint16, password *uint16, logonType uint32, logonProvider uint32, token *windows.Token) (err error) = advapi32.LogonUserW + +// Logon types +const ( + LOGON32_LOGON_INTERACTIVE uint32 = 2 + LOGON32_LOGON_NETWORK uint32 = 3 + LOGON32_LOGON_BATCH uint32 = 4 + LOGON32_LOGON_SERVICE uint32 = 5 + LOGON32_LOGON_UNLOCK uint32 = 7 + LOGON32_LOGON_NETWORK_CLEARTEXT uint32 = 8 + LOGON32_LOGON_NEW_CREDENTIALS uint32 = 9 +) + +// Logon providers +const ( + LOGON32_PROVIDER_DEFAULT uint32 = 0 + LOGON32_PROVIDER_WINNT40 uint32 = 2 + LOGON32_PROVIDER_WINNT50 uint32 = 3 +) diff --git a/vendor/github.com/Microsoft/hcsshim/internal/winapi/memory.go b/vendor/github.com/Microsoft/hcsshim/internal/winapi/memory.go new file mode 100644 index 000000000000..ccaf5a624f4f --- /dev/null +++ b/vendor/github.com/Microsoft/hcsshim/internal/winapi/memory.go @@ -0,0 +1,11 @@ +package winapi + +// VOID RtlMoveMemory( +// _Out_ VOID UNALIGNED *Destination, +// _In_ const VOID UNALIGNED *Source, +// _In_ SIZE_T Length +// ); +//sys RtlMoveMemory(destination *byte, source *byte, length uintptr) (err error) = kernel32.RtlMoveMemory + +//sys LocalAlloc(flags uint32, size int) (ptr uintptr) = kernel32.LocalAlloc +//sys LocalFree(ptr uintptr) = kernel32.LocalFree diff --git a/vendor/github.com/Microsoft/hcsshim/internal/winapi/net.go b/vendor/github.com/Microsoft/hcsshim/internal/winapi/net.go new file mode 100644 index 000000000000..f37910024f72 --- /dev/null +++ b/vendor/github.com/Microsoft/hcsshim/internal/winapi/net.go @@ -0,0 +1,3 @@ +package winapi + +//sys SetJobCompartmentId(handle windows.Handle, compartmentId uint32) (win32Err error) = iphlpapi.SetJobCompartmentId diff --git a/vendor/github.com/Microsoft/hcsshim/internal/winapi/path.go b/vendor/github.com/Microsoft/hcsshim/internal/winapi/path.go new file mode 100644 index 000000000000..0ae8f33ea63b --- /dev/null +++ b/vendor/github.com/Microsoft/hcsshim/internal/winapi/path.go @@ -0,0 +1,11 @@ +package winapi + +// DWORD SearchPathW( +// LPCWSTR lpPath, +// LPCWSTR lpFileName, +// LPCWSTR lpExtension, +// DWORD nBufferLength, +// LPWSTR lpBuffer, +// LPWSTR *lpFilePart +// ); +//sys SearchPath(lpPath *uint16, lpFileName *uint16, lpExtension *uint16, nBufferLength uint32, lpBuffer *uint16, lpFilePath **uint16) (size uint32, err error) = kernel32.SearchPathW diff --git a/vendor/github.com/Microsoft/hcsshim/internal/winapi/process.go b/vendor/github.com/Microsoft/hcsshim/internal/winapi/process.go new file mode 100644 index 000000000000..adf0168eae91 --- /dev/null +++ b/vendor/github.com/Microsoft/hcsshim/internal/winapi/process.go @@ -0,0 +1,3 @@ +package winapi + +const PROCESS_ALL_ACCESS uint32 = 2097151 diff --git a/vendor/github.com/Microsoft/hcsshim/internal/winapi/processor.go b/vendor/github.com/Microsoft/hcsshim/internal/winapi/processor.go new file mode 100644 index 000000000000..ce79ac2cdb8a --- /dev/null +++ b/vendor/github.com/Microsoft/hcsshim/internal/winapi/processor.go @@ -0,0 +1,7 @@ +package winapi + +// Get count from all processor groups. +// https://docs.microsoft.com/en-us/windows/win32/procthread/processor-groups +const ALL_PROCESSOR_GROUPS = 0xFFFF + +//sys GetActiveProcessorCount(groupNumber uint16) (amount uint32) = kernel32.GetActiveProcessorCount diff --git a/vendor/github.com/Microsoft/hcsshim/internal/winapi/utils.go b/vendor/github.com/Microsoft/hcsshim/internal/winapi/utils.go new file mode 100644 index 000000000000..f3055d41754c --- /dev/null +++ b/vendor/github.com/Microsoft/hcsshim/internal/winapi/utils.go @@ -0,0 +1,60 @@ +package winapi + +import ( + "errors" + "syscall" + "unicode/utf16" + "unsafe" +) + +type UnicodeString struct { + Length uint16 + MaximumLength uint16 + Buffer *uint16 +} + +//String converts a UnicodeString to a golang string +func (uni UnicodeString) String() string { + p := (*[0xffff]uint16)(unsafe.Pointer(uni.Buffer)) + + // UnicodeString is not guaranteed to be null terminated, therefore + // use the UnicodeString's Length field + lengthInChars := uni.Length / 2 + return syscall.UTF16ToString(p[:lengthInChars]) +} + +// NewUnicodeString allocates a new UnicodeString and copies `s` into +// the buffer of the new UnicodeString. +func NewUnicodeString(s string) (*UnicodeString, error) { + ws := utf16.Encode(([]rune)(s)) + if len(ws) > 32767 { + return nil, syscall.ENAMETOOLONG + } + + uni := &UnicodeString{ + Length: uint16(len(ws) * 2), + MaximumLength: uint16(len(ws) * 2), + Buffer: &make([]uint16, len(ws))[0], + } + copy((*[32768]uint16)(unsafe.Pointer(uni.Buffer))[:], ws) + return uni, nil +} + +// ConvertStringSetToSlice is a helper function used to convert the contents of +// `buf` into a string slice. `buf` contains a set of null terminated strings +// with an additional null at the end to indicate the end of the set. +func ConvertStringSetToSlice(buf []byte) ([]string, error) { + var results []string + prev := 0 + for i := range buf { + if buf[i] == 0 { + if prev == i { + // found two null characters in a row, return result + return results, nil + } + results = append(results, string(buf[prev:i])) + prev = i + 1 + } + } + return nil, errors.New("string set malformed: missing null terminator at end of buffer") +} diff --git a/vendor/github.com/Microsoft/hcsshim/internal/winapi/winapi.go b/vendor/github.com/Microsoft/hcsshim/internal/winapi/winapi.go new file mode 100644 index 000000000000..77ea13e3e385 --- /dev/null +++ b/vendor/github.com/Microsoft/hcsshim/internal/winapi/winapi.go @@ -0,0 +1,5 @@ +// Package winapi contains various low-level bindings to Windows APIs. It can +// be thought of as an extension to golang.org/x/sys/windows. +package winapi + +//go:generate go run ..\..\mksyscall_windows.go -output zsyscall_windows.go net.go iocp.go jobobject.go path.go logon.go memory.go processor.go devices.go filesystem.go errors.go diff --git a/vendor/github.com/Microsoft/hcsshim/internal/winapi/zsyscall_windows.go b/vendor/github.com/Microsoft/hcsshim/internal/winapi/zsyscall_windows.go new file mode 100644 index 000000000000..0a990951d729 --- /dev/null +++ b/vendor/github.com/Microsoft/hcsshim/internal/winapi/zsyscall_windows.go @@ -0,0 +1,294 @@ +// Code generated mksyscall_windows.exe DO NOT EDIT + +package winapi + +import ( + "syscall" + "unsafe" + + "golang.org/x/sys/windows" +) + +var _ unsafe.Pointer + +// Do the interface allocations only once for common +// Errno values. +const ( + errnoERROR_IO_PENDING = 997 +) + +var ( + errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) +) + +// errnoErr returns common boxed Errno values, to prevent +// allocations at runtime. +func errnoErr(e syscall.Errno) error { + switch e { + case 0: + return nil + case errnoERROR_IO_PENDING: + return errERROR_IO_PENDING + } + // TODO: add more here, after collecting data on the common + // error values see on Windows. (perhaps when running + // all.bat?) + return e +} + +var ( + modiphlpapi = windows.NewLazySystemDLL("iphlpapi.dll") + modkernel32 = windows.NewLazySystemDLL("kernel32.dll") + modadvapi32 = windows.NewLazySystemDLL("advapi32.dll") + modcfgmgr32 = windows.NewLazySystemDLL("cfgmgr32.dll") + modntdll = windows.NewLazySystemDLL("ntdll.dll") + + procSetJobCompartmentId = modiphlpapi.NewProc("SetJobCompartmentId") + procIsProcessInJob = modkernel32.NewProc("IsProcessInJob") + procQueryInformationJobObject = modkernel32.NewProc("QueryInformationJobObject") + procOpenJobObjectW = modkernel32.NewProc("OpenJobObjectW") + procSetIoRateControlInformationJobObject = modkernel32.NewProc("SetIoRateControlInformationJobObject") + procGetQueuedCompletionStatus = modkernel32.NewProc("GetQueuedCompletionStatus") + procSearchPathW = modkernel32.NewProc("SearchPathW") + procLogonUserW = modadvapi32.NewProc("LogonUserW") + procRtlMoveMemory = modkernel32.NewProc("RtlMoveMemory") + procLocalAlloc = modkernel32.NewProc("LocalAlloc") + procLocalFree = modkernel32.NewProc("LocalFree") + procGetActiveProcessorCount = modkernel32.NewProc("GetActiveProcessorCount") + procCM_Get_Device_ID_List_SizeA = modcfgmgr32.NewProc("CM_Get_Device_ID_List_SizeA") + procCM_Get_Device_ID_ListA = modcfgmgr32.NewProc("CM_Get_Device_ID_ListA") + procCM_Locate_DevNodeW = modcfgmgr32.NewProc("CM_Locate_DevNodeW") + procCM_Get_DevNode_PropertyW = modcfgmgr32.NewProc("CM_Get_DevNode_PropertyW") + procNtCreateFile = modntdll.NewProc("NtCreateFile") + procNtSetInformationFile = modntdll.NewProc("NtSetInformationFile") + procNtOpenDirectoryObject = modntdll.NewProc("NtOpenDirectoryObject") + procNtQueryDirectoryObject = modntdll.NewProc("NtQueryDirectoryObject") + procRtlNtStatusToDosError = modntdll.NewProc("RtlNtStatusToDosError") +) + +func SetJobCompartmentId(handle windows.Handle, compartmentId uint32) (win32Err error) { + r0, _, _ := syscall.Syscall(procSetJobCompartmentId.Addr(), 2, uintptr(handle), uintptr(compartmentId), 0) + if r0 != 0 { + win32Err = syscall.Errno(r0) + } + return +} + +func IsProcessInJob(procHandle windows.Handle, jobHandle windows.Handle, result *bool) (err error) { + r1, _, e1 := syscall.Syscall(procIsProcessInJob.Addr(), 3, uintptr(procHandle), uintptr(jobHandle), uintptr(unsafe.Pointer(result))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func QueryInformationJobObject(jobHandle windows.Handle, infoClass uint32, jobObjectInfo uintptr, jobObjectInformationLength uint32, lpReturnLength *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procQueryInformationJobObject.Addr(), 5, uintptr(jobHandle), uintptr(infoClass), uintptr(jobObjectInfo), uintptr(jobObjectInformationLength), uintptr(unsafe.Pointer(lpReturnLength)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func OpenJobObject(desiredAccess uint32, inheritHandle bool, lpName *uint16) (handle windows.Handle, err error) { + var _p0 uint32 + if inheritHandle { + _p0 = 1 + } else { + _p0 = 0 + } + r0, _, e1 := syscall.Syscall(procOpenJobObjectW.Addr(), 3, uintptr(desiredAccess), uintptr(_p0), uintptr(unsafe.Pointer(lpName))) + handle = windows.Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetIoRateControlInformationJobObject(jobHandle windows.Handle, ioRateControlInfo *JOBOBJECT_IO_RATE_CONTROL_INFORMATION) (ret uint32, err error) { + r0, _, e1 := syscall.Syscall(procSetIoRateControlInformationJobObject.Addr(), 2, uintptr(jobHandle), uintptr(unsafe.Pointer(ioRateControlInfo)), 0) + ret = uint32(r0) + if ret == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetQueuedCompletionStatus(cphandle windows.Handle, qty *uint32, key *uintptr, overlapped **windows.Overlapped, timeout uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procGetQueuedCompletionStatus.Addr(), 5, uintptr(cphandle), uintptr(unsafe.Pointer(qty)), uintptr(unsafe.Pointer(key)), uintptr(unsafe.Pointer(overlapped)), uintptr(timeout), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SearchPath(lpPath *uint16, lpFileName *uint16, lpExtension *uint16, nBufferLength uint32, lpBuffer *uint16, lpFilePath **uint16) (size uint32, err error) { + r0, _, e1 := syscall.Syscall6(procSearchPathW.Addr(), 6, uintptr(unsafe.Pointer(lpPath)), uintptr(unsafe.Pointer(lpFileName)), uintptr(unsafe.Pointer(lpExtension)), uintptr(nBufferLength), uintptr(unsafe.Pointer(lpBuffer)), uintptr(unsafe.Pointer(lpFilePath))) + size = uint32(r0) + if size == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func LogonUser(username *uint16, domain *uint16, password *uint16, logonType uint32, logonProvider uint32, token *windows.Token) (err error) { + r1, _, e1 := syscall.Syscall6(procLogonUserW.Addr(), 6, uintptr(unsafe.Pointer(username)), uintptr(unsafe.Pointer(domain)), uintptr(unsafe.Pointer(password)), uintptr(logonType), uintptr(logonProvider), uintptr(unsafe.Pointer(token))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func RtlMoveMemory(destination *byte, source *byte, length uintptr) (err error) { + r1, _, e1 := syscall.Syscall(procRtlMoveMemory.Addr(), 3, uintptr(unsafe.Pointer(destination)), uintptr(unsafe.Pointer(source)), uintptr(length)) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func LocalAlloc(flags uint32, size int) (ptr uintptr) { + r0, _, _ := syscall.Syscall(procLocalAlloc.Addr(), 2, uintptr(flags), uintptr(size), 0) + ptr = uintptr(r0) + return +} + +func LocalFree(ptr uintptr) { + syscall.Syscall(procLocalFree.Addr(), 1, uintptr(ptr), 0, 0) + return +} + +func GetActiveProcessorCount(groupNumber uint16) (amount uint32) { + r0, _, _ := syscall.Syscall(procGetActiveProcessorCount.Addr(), 1, uintptr(groupNumber), 0, 0) + amount = uint32(r0) + return +} + +func CMGetDeviceIDListSize(pulLen *uint32, pszFilter *byte, uFlags uint32) (hr error) { + r0, _, _ := syscall.Syscall(procCM_Get_Device_ID_List_SizeA.Addr(), 3, uintptr(unsafe.Pointer(pulLen)), uintptr(unsafe.Pointer(pszFilter)), uintptr(uFlags)) + if int32(r0) < 0 { + if r0&0x1fff0000 == 0x00070000 { + r0 &= 0xffff + } + hr = syscall.Errno(r0) + } + return +} + +func CMGetDeviceIDList(pszFilter *byte, buffer *byte, bufferLen uint32, uFlags uint32) (hr error) { + r0, _, _ := syscall.Syscall6(procCM_Get_Device_ID_ListA.Addr(), 4, uintptr(unsafe.Pointer(pszFilter)), uintptr(unsafe.Pointer(buffer)), uintptr(bufferLen), uintptr(uFlags), 0, 0) + if int32(r0) < 0 { + if r0&0x1fff0000 == 0x00070000 { + r0 &= 0xffff + } + hr = syscall.Errno(r0) + } + return +} + +func CMLocateDevNode(pdnDevInst *uint32, pDeviceID string, uFlags uint32) (hr error) { + var _p0 *uint16 + _p0, hr = syscall.UTF16PtrFromString(pDeviceID) + if hr != nil { + return + } + return _CMLocateDevNode(pdnDevInst, _p0, uFlags) +} + +func _CMLocateDevNode(pdnDevInst *uint32, pDeviceID *uint16, uFlags uint32) (hr error) { + r0, _, _ := syscall.Syscall(procCM_Locate_DevNodeW.Addr(), 3, uintptr(unsafe.Pointer(pdnDevInst)), uintptr(unsafe.Pointer(pDeviceID)), uintptr(uFlags)) + if int32(r0) < 0 { + if r0&0x1fff0000 == 0x00070000 { + r0 &= 0xffff + } + hr = syscall.Errno(r0) + } + return +} + +func CMGetDevNodeProperty(dnDevInst uint32, propertyKey *DevPropKey, propertyType *uint32, propertyBuffer *uint16, propertyBufferSize *uint32, uFlags uint32) (hr error) { + r0, _, _ := syscall.Syscall6(procCM_Get_DevNode_PropertyW.Addr(), 6, uintptr(dnDevInst), uintptr(unsafe.Pointer(propertyKey)), uintptr(unsafe.Pointer(propertyType)), uintptr(unsafe.Pointer(propertyBuffer)), uintptr(unsafe.Pointer(propertyBufferSize)), uintptr(uFlags)) + if int32(r0) < 0 { + if r0&0x1fff0000 == 0x00070000 { + r0 &= 0xffff + } + hr = syscall.Errno(r0) + } + return +} + +func NtCreateFile(handle *uintptr, accessMask uint32, oa *ObjectAttributes, iosb *IOStatusBlock, allocationSize *uint64, fileAttributes uint32, shareAccess uint32, createDisposition uint32, createOptions uint32, eaBuffer *byte, eaLength uint32) (status uint32) { + r0, _, _ := syscall.Syscall12(procNtCreateFile.Addr(), 11, uintptr(unsafe.Pointer(handle)), uintptr(accessMask), uintptr(unsafe.Pointer(oa)), uintptr(unsafe.Pointer(iosb)), uintptr(unsafe.Pointer(allocationSize)), uintptr(fileAttributes), uintptr(shareAccess), uintptr(createDisposition), uintptr(createOptions), uintptr(unsafe.Pointer(eaBuffer)), uintptr(eaLength), 0) + status = uint32(r0) + return +} + +func NtSetInformationFile(handle uintptr, iosb *IOStatusBlock, information uintptr, length uint32, class uint32) (status uint32) { + r0, _, _ := syscall.Syscall6(procNtSetInformationFile.Addr(), 5, uintptr(handle), uintptr(unsafe.Pointer(iosb)), uintptr(information), uintptr(length), uintptr(class), 0) + status = uint32(r0) + return +} + +func NtOpenDirectoryObject(handle *uintptr, accessMask uint32, oa *ObjectAttributes) (status uint32) { + r0, _, _ := syscall.Syscall(procNtOpenDirectoryObject.Addr(), 3, uintptr(unsafe.Pointer(handle)), uintptr(accessMask), uintptr(unsafe.Pointer(oa))) + status = uint32(r0) + return +} + +func NtQueryDirectoryObject(handle uintptr, buffer *byte, length uint32, singleEntry bool, restartScan bool, context *uint32, returnLength *uint32) (status uint32) { + var _p0 uint32 + if singleEntry { + _p0 = 1 + } else { + _p0 = 0 + } + var _p1 uint32 + if restartScan { + _p1 = 1 + } else { + _p1 = 0 + } + r0, _, _ := syscall.Syscall9(procNtQueryDirectoryObject.Addr(), 7, uintptr(handle), uintptr(unsafe.Pointer(buffer)), uintptr(length), uintptr(_p0), uintptr(_p1), uintptr(unsafe.Pointer(context)), uintptr(unsafe.Pointer(returnLength)), 0, 0) + status = uint32(r0) + return +} + +func RtlNtStatusToDosError(status uint32) (winerr error) { + r0, _, _ := syscall.Syscall(procRtlNtStatusToDosError.Addr(), 1, uintptr(status), 0, 0) + if r0 != 0 { + winerr = syscall.Errno(r0) + } + return +} diff --git a/vendor/github.com/Microsoft/hcsshim/osversion/windowsbuilds.go b/vendor/github.com/Microsoft/hcsshim/osversion/windowsbuilds.go index 726d1c8c1220..e9267b9554f2 100644 --- a/vendor/github.com/Microsoft/hcsshim/osversion/windowsbuilds.go +++ b/vendor/github.com/Microsoft/hcsshim/osversion/windowsbuilds.go @@ -24,4 +24,15 @@ const ( // V19H1 (version 1903) corresponds to Windows Server 1903 (semi-annual // channel). V19H1 = 18362 + + // V19H2 (version 1909) corresponds to Windows Server 1909 (semi-annual + // channel). + V19H2 = 18363 + + // V20H1 (version 2004) corresponds to Windows Server 2004 (semi-annual + // channel). + V20H1 = 19041 + + // V20H2 corresponds to Windows Server 20H2 (semi-annual channel). + V20H2 = 19042 ) diff --git a/vendor/github.com/NYTimes/gziphandler/.travis.yml b/vendor/github.com/NYTimes/gziphandler/.travis.yml index d2b67f69c1cf..94dfae362d3f 100644 --- a/vendor/github.com/NYTimes/gziphandler/.travis.yml +++ b/vendor/github.com/NYTimes/gziphandler/.travis.yml @@ -1,6 +1,10 @@ language: go - go: - - 1.7 - - 1.8 + - 1.x - tip +env: + - GO111MODULE=on +install: + - go mod download +script: + - go test -race -v diff --git a/vendor/github.com/NYTimes/gziphandler/LICENSE b/vendor/github.com/NYTimes/gziphandler/LICENSE new file mode 100644 index 000000000000..df6192d36f22 --- /dev/null +++ b/vendor/github.com/NYTimes/gziphandler/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2016-2017 The New York Times Company + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/NYTimes/gziphandler/LICENSE.md b/vendor/github.com/NYTimes/gziphandler/LICENSE.md deleted file mode 100644 index b7e2ecb63f9d..000000000000 --- a/vendor/github.com/NYTimes/gziphandler/LICENSE.md +++ /dev/null @@ -1,13 +0,0 @@ -Copyright (c) 2015 The New York Times Company - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this library except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/vendor/github.com/NYTimes/gziphandler/README.md b/vendor/github.com/NYTimes/gziphandler/README.md index 6d7246070726..6259acaca799 100644 --- a/vendor/github.com/NYTimes/gziphandler/README.md +++ b/vendor/github.com/NYTimes/gziphandler/README.md @@ -6,6 +6,10 @@ response body, for clients which support it. Although it's usually simpler to leave that to a reverse proxy (like nginx or Varnish), this package is useful when that's undesirable. +## Install +```bash +go get -u github.com/NYTimes/gziphandler +``` ## Usage @@ -48,5 +52,5 @@ The docs can be found at [godoc.org][docs], as usual. -[docs]: https://godoc.org/github.com/nytimes/gziphandler -[license]: https://github.com/nytimes/gziphandler/blob/master/LICENSE.md +[docs]: https://godoc.org/github.com/NYTimes/gziphandler +[license]: https://github.com/NYTimes/gziphandler/blob/master/LICENSE diff --git a/vendor/github.com/NYTimes/gziphandler/go.mod b/vendor/github.com/NYTimes/gziphandler/go.mod new file mode 100644 index 000000000000..801901274249 --- /dev/null +++ b/vendor/github.com/NYTimes/gziphandler/go.mod @@ -0,0 +1,5 @@ +module github.com/NYTimes/gziphandler + +go 1.11 + +require github.com/stretchr/testify v1.3.0 diff --git a/vendor/github.com/NYTimes/gziphandler/go.sum b/vendor/github.com/NYTimes/gziphandler/go.sum new file mode 100644 index 000000000000..4347755afe82 --- /dev/null +++ b/vendor/github.com/NYTimes/gziphandler/go.sum @@ -0,0 +1,7 @@ +github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= diff --git a/vendor/github.com/NYTimes/gziphandler/gzip.go b/vendor/github.com/NYTimes/gziphandler/gzip.go index ea6dba1e79de..c112bbdf81ce 100644 --- a/vendor/github.com/NYTimes/gziphandler/gzip.go +++ b/vendor/github.com/NYTimes/gziphandler/gzip.go @@ -1,10 +1,11 @@ -package gziphandler +package gziphandler // import "github.com/NYTimes/gziphandler" import ( "bufio" "compress/gzip" "fmt" "io" + "mime" "net" "net/http" "strconv" @@ -28,9 +29,11 @@ const ( // The examples seem to indicate that it is. DefaultQValue = 1.0 - // DefaultMinSize defines the minimum size to reach to enable compression. - // It's 512 bytes. - DefaultMinSize = 512 + // DefaultMinSize is the default minimum size until we enable gzip compression. + // 1500 bytes is the MTU size for the internet since that is the largest size allowed at the network layer. + // If you take a file that is 1300 bytes and compress it to 800 bytes, it’s still transmitted in that same 1500 byte packet regardless, so you’ve gained nothing. + // That being the case, you should restrict the gzip compression to files with a size greater than a single packet, 1400 bytes (1.4KB) is a safe value. + DefaultMinSize = 1400 ) // gzipWriterPools stores a sync.Pool for each compression level for reuse of @@ -80,40 +83,71 @@ type GzipResponseWriter struct { minSize int // Specifed the minimum response size to gzip. If the response length is bigger than this value, it is compressed. buf []byte // Holds the first part of the write before reaching the minSize or the end of the write. + ignore bool // If true, then we immediately passthru writes to the underlying ResponseWriter. + + contentTypes []parsedContentType // Only compress if the response is one of these content-types. All are accepted if empty. +} + +type GzipResponseWriterWithCloseNotify struct { + *GzipResponseWriter +} + +func (w GzipResponseWriterWithCloseNotify) CloseNotify() <-chan bool { + return w.ResponseWriter.(http.CloseNotifier).CloseNotify() } // Write appends data to the gzip writer. func (w *GzipResponseWriter) Write(b []byte) (int, error) { - // If content type is not set. - if _, ok := w.Header()[contentType]; !ok { - // It infer it from the uncompressed body. - w.Header().Set(contentType, http.DetectContentType(b)) - } - // GZIP responseWriter is initialized. Use the GZIP responseWriter. if w.gw != nil { - n, err := w.gw.Write(b) - return n, err + return w.gw.Write(b) + } + + // If we have already decided not to use GZIP, immediately passthrough. + if w.ignore { + return w.ResponseWriter.Write(b) } // Save the write into a buffer for later use in GZIP responseWriter (if content is long enough) or at close with regular responseWriter. // On the first write, w.buf changes from nil to a valid slice w.buf = append(w.buf, b...) - // If the global writes are bigger than the minSize, compression is enable. - if len(w.buf) >= w.minSize { - err := w.startGzip() - if err != nil { - return 0, err + var ( + cl, _ = strconv.Atoi(w.Header().Get(contentLength)) + ct = w.Header().Get(contentType) + ce = w.Header().Get(contentEncoding) + ) + // Only continue if they didn't already choose an encoding or a known unhandled content length or type. + if ce == "" && (cl == 0 || cl >= w.minSize) && (ct == "" || handleContentType(w.contentTypes, ct)) { + // If the current buffer is less than minSize and a Content-Length isn't set, then wait until we have more data. + if len(w.buf) < w.minSize && cl == 0 { + return len(b), nil + } + // If the Content-Length is larger than minSize or the current buffer is larger than minSize, then continue. + if cl >= w.minSize || len(w.buf) >= w.minSize { + // If a Content-Type wasn't specified, infer it from the current buffer. + if ct == "" { + ct = http.DetectContentType(w.buf) + w.Header().Set(contentType, ct) + } + // If the Content-Type is acceptable to GZIP, initialize the GZIP writer. + if handleContentType(w.contentTypes, ct) { + if err := w.startGzip(); err != nil { + return 0, err + } + return len(b), nil + } } } - + // If we got here, we should not GZIP this response. + if err := w.startPlain(); err != nil { + return 0, err + } return len(b), nil } -// startGzip initialize any GZIP specific informations. +// startGzip initializes a GZIP writer and writes the buffer. func (w *GzipResponseWriter) startGzip() error { - // Set the GZIP header. w.Header().Set(contentEncoding, "gzip") @@ -125,28 +159,57 @@ func (w *GzipResponseWriter) startGzip() error { // Write the header to gzip response. if w.code != 0 { w.ResponseWriter.WriteHeader(w.code) + // Ensure that no other WriteHeader's happen + w.code = 0 } - // Initialize the GZIP response. - w.init() - - // Flush the buffer into the gzip reponse. - n, err := w.gw.Write(w.buf) + // Initialize and flush the buffer into the gzip response if there are any bytes. + // If there aren't any, we shouldn't initialize it yet because on Close it will + // write the gzip header even if nothing was ever written. + if len(w.buf) > 0 { + // Initialize the GZIP response. + w.init() + n, err := w.gw.Write(w.buf) + + // This should never happen (per io.Writer docs), but if the write didn't + // accept the entire buffer but returned no specific error, we have no clue + // what's going on, so abort just to be safe. + if err == nil && n < len(w.buf) { + err = io.ErrShortWrite + } + return err + } + return nil +} +// startPlain writes to sent bytes and buffer the underlying ResponseWriter without gzip. +func (w *GzipResponseWriter) startPlain() error { + if w.code != 0 { + w.ResponseWriter.WriteHeader(w.code) + // Ensure that no other WriteHeader's happen + w.code = 0 + } + w.ignore = true + // If Write was never called then don't call Write on the underlying ResponseWriter. + if w.buf == nil { + return nil + } + n, err := w.ResponseWriter.Write(w.buf) + w.buf = nil // This should never happen (per io.Writer docs), but if the write didn't // accept the entire buffer but returned no specific error, we have no clue // what's going on, so abort just to be safe. if err == nil && n < len(w.buf) { - return io.ErrShortWrite + err = io.ErrShortWrite } - - w.buf = nil return err } // WriteHeader just saves the response code until close or GZIP effective writes. func (w *GzipResponseWriter) WriteHeader(code int) { - w.code = code + if w.code == 0 { + w.code = code + } } // init graps a new gzip writer from the gzipWriterPool and writes the correct @@ -161,19 +224,18 @@ func (w *GzipResponseWriter) init() { // Close will close the gzip.Writer and will put it back in the gzipWriterPool. func (w *GzipResponseWriter) Close() error { + if w.ignore { + return nil + } + if w.gw == nil { - // Gzip not trigged yet, write out regular response. - if w.code != 0 { - w.ResponseWriter.WriteHeader(w.code) - } - if w.buf != nil { - _, writeErr := w.ResponseWriter.Write(w.buf) - // Returns the error if any at write. - if writeErr != nil { - return fmt.Errorf("gziphandler: write to regular responseWriter at close gets error: %q", writeErr.Error()) - } + // GZIP not triggered yet, write out regular response. + err := w.startPlain() + // Returns the error if any at write. + if err != nil { + err = fmt.Errorf("gziphandler: write to regular responseWriter at close gets error: %q", err.Error()) } - return nil + return err } err := w.gw.Close() @@ -186,6 +248,14 @@ func (w *GzipResponseWriter) Close() error { // http.ResponseWriter if it is an http.Flusher. This makes GzipResponseWriter // an http.Flusher. func (w *GzipResponseWriter) Flush() { + if w.gw == nil && !w.ignore { + // Only flush once startGzip or startPlain has been called. + // + // Flush is thus a no-op until we're certain whether a plain + // or gzipped response will be served. + return + } + if w.gw != nil { w.gw.Flush() } @@ -230,27 +300,44 @@ func NewGzipLevelHandler(level int) (func(http.Handler) http.Handler, error) { // NewGzipLevelAndMinSize behave as NewGzipLevelHandler except it let the caller // specify the minimum size before compression. func NewGzipLevelAndMinSize(level, minSize int) (func(http.Handler) http.Handler, error) { - if level != gzip.DefaultCompression && (level < gzip.BestSpeed || level > gzip.BestCompression) { - return nil, fmt.Errorf("invalid compression level requested: %d", level) + return GzipHandlerWithOpts(CompressionLevel(level), MinSize(minSize)) +} + +func GzipHandlerWithOpts(opts ...option) (func(http.Handler) http.Handler, error) { + c := &config{ + level: gzip.DefaultCompression, + minSize: DefaultMinSize, } - if minSize < 0 { - return nil, fmt.Errorf("minimum size must be more than zero") + + for _, o := range opts { + o(c) + } + + if err := c.validate(); err != nil { + return nil, err } + return func(h http.Handler) http.Handler { - index := poolIndex(level) + index := poolIndex(c.level) return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Header().Add(vary, acceptEncoding) - if acceptsGzip(r) { gw := &GzipResponseWriter{ ResponseWriter: w, index: index, - minSize: minSize, + minSize: c.minSize, + contentTypes: c.contentTypes, } defer gw.Close() - h.ServeHTTP(gw, r) + if _, ok := w.(http.CloseNotifier); ok { + gwcn := GzipResponseWriterWithCloseNotify{gw} + h.ServeHTTP(gwcn, r) + } else { + h.ServeHTTP(gw, r) + } + } else { h.ServeHTTP(w, r) } @@ -258,6 +345,98 @@ func NewGzipLevelAndMinSize(level, minSize int) (func(http.Handler) http.Handler }, nil } +// Parsed representation of one of the inputs to ContentTypes. +// See https://golang.org/pkg/mime/#ParseMediaType +type parsedContentType struct { + mediaType string + params map[string]string +} + +// equals returns whether this content type matches another content type. +func (pct parsedContentType) equals(mediaType string, params map[string]string) bool { + if pct.mediaType != mediaType { + return false + } + // if pct has no params, don't care about other's params + if len(pct.params) == 0 { + return true + } + + // if pct has any params, they must be identical to other's. + if len(pct.params) != len(params) { + return false + } + for k, v := range pct.params { + if w, ok := params[k]; !ok || v != w { + return false + } + } + return true +} + +// Used for functional configuration. +type config struct { + minSize int + level int + contentTypes []parsedContentType +} + +func (c *config) validate() error { + if c.level != gzip.DefaultCompression && (c.level < gzip.BestSpeed || c.level > gzip.BestCompression) { + return fmt.Errorf("invalid compression level requested: %d", c.level) + } + + if c.minSize < 0 { + return fmt.Errorf("minimum size must be more than zero") + } + + return nil +} + +type option func(c *config) + +func MinSize(size int) option { + return func(c *config) { + c.minSize = size + } +} + +func CompressionLevel(level int) option { + return func(c *config) { + c.level = level + } +} + +// ContentTypes specifies a list of content types to compare +// the Content-Type header to before compressing. If none +// match, the response will be returned as-is. +// +// Content types are compared in a case-insensitive, whitespace-ignored +// manner. +// +// A MIME type without any other directive will match a content type +// that has the same MIME type, regardless of that content type's other +// directives. I.e., "text/html" will match both "text/html" and +// "text/html; charset=utf-8". +// +// A MIME type with any other directive will only match a content type +// that has the same MIME type and other directives. I.e., +// "text/html; charset=utf-8" will only match "text/html; charset=utf-8". +// +// By default, responses are gzipped regardless of +// Content-Type. +func ContentTypes(types []string) option { + return func(c *config) { + c.contentTypes = []parsedContentType{} + for _, v := range types { + mediaType, params, err := mime.ParseMediaType(v) + if err == nil { + c.contentTypes = append(c.contentTypes, parsedContentType{mediaType, params}) + } + } + } +} + // GzipHandler wraps an HTTP handler, to transparently gzip the response body if // the client supports it (via the Accept-Encoding header). This will compress at // the default compression level. @@ -273,6 +452,27 @@ func acceptsGzip(r *http.Request) bool { return acceptedEncodings["gzip"] > 0.0 } +// returns true if we've been configured to compress the specific content type. +func handleContentType(contentTypes []parsedContentType, ct string) bool { + // If contentTypes is empty we handle all content types. + if len(contentTypes) == 0 { + return true + } + + mediaType, params, err := mime.ParseMediaType(ct) + if err != nil { + return false + } + + for _, c := range contentTypes { + if c.equals(mediaType, params) { + return true + } + } + + return false +} + // parseEncodings attempts to parse a list of codings, per RFC 2616, as might // appear in an Accept-Encoding header. It returns a map of content-codings to // quality values, and an error containing the errors encountered. It's probably diff --git a/vendor/github.com/certifi/gocertifi/LICENSE b/vendor/github.com/certifi/gocertifi/LICENSE deleted file mode 100644 index cfd5dcbbb157..000000000000 --- a/vendor/github.com/certifi/gocertifi/LICENSE +++ /dev/null @@ -1,3 +0,0 @@ -This Source Code Form is subject to the terms of the Mozilla Public License, -v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain -one at http://mozilla.org/MPL/2.0/. diff --git a/vendor/github.com/certifi/gocertifi/README.md b/vendor/github.com/certifi/gocertifi/README.md deleted file mode 100644 index 1c01b11021b6..000000000000 --- a/vendor/github.com/certifi/gocertifi/README.md +++ /dev/null @@ -1,60 +0,0 @@ -# GoCertifi: SSL Certificates for Golang - -This Go package contains a CA bundle that you can reference in your Go code. -This is useful for systems that do not have CA bundles that Golang can find -itself, or where a uniform set of CAs is valuable. - -This is the same CA bundle that ships with the -[Python Requests](https://github.com/kennethreitz/requests) library, and is a -Golang specific port of [certifi](https://github.com/kennethreitz/certifi). The -CA bundle is derived from Mozilla's canonical set. - -## Usage - -You can use the `gocertifi` package as follows: - -```go -import "github.com/certifi/gocertifi" - -cert_pool, err := gocertifi.CACerts() -``` - -You can use the returned `*x509.CertPool` as part of an HTTP transport, for example: - -```go -import ( - "net/http" - "crypto/tls" -) - -// Setup an HTTP client with a custom transport -transport := &http.Transport{ - TLSClientConfig: &tls.Config{RootCAs: cert_pool}, -} -client := &http.Client{Transport: transport} - -// Make an HTTP request using our custom transport -resp, err := client.Get("https://example.com") -``` - -## Detailed Documentation - -Import as follows: - -```go -import "github.com/certifi/gocertifi" -``` - -### Errors - -```go -var ErrParseFailed = errors.New("gocertifi: error when parsing certificates") -``` - -### Functions - -```go -func CACerts() (*x509.CertPool, error) -``` -CACerts builds an X.509 certificate pool containing the Mozilla CA Certificate -bundle. Returns nil on error along with an appropriate error code. diff --git a/vendor/github.com/certifi/gocertifi/certifi.go b/vendor/github.com/certifi/gocertifi/certifi.go deleted file mode 100644 index edf32b45f043..000000000000 --- a/vendor/github.com/certifi/gocertifi/certifi.go +++ /dev/null @@ -1,4330 +0,0 @@ -// Code generated by go generate; DO NOT EDIT -// 2018-08-28 09:03:06.460975 -0700 PDT m=+0.705532595 -// https://mkcert.org/generate/ - -package gocertifi - -//go:generate go run gen.go - -import ( - "crypto/x509" - "errors" -) - -const pemcerts string = ` - -# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA -# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA -# Label: "GlobalSign Root CA" -# Serial: 4835703278459707669005204 -# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a -# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c -# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99 ------BEGIN CERTIFICATE----- -MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG -A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv -b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw -MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i -YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT -aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ -jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp -xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp -1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG -snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ -U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 -9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E -BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B -AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz -yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE -38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP -AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad -DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME -HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 -# Label: "GlobalSign Root CA - R2" -# Serial: 4835703278459682885658125 -# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30 -# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe -# SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 -MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL -v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 -eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq -tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd -C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa -zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB -mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH -V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n -bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG -3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs -J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO -291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS -ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd -AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 -TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only -# Label: "Verisign Class 3 Public Primary Certification Authority - G3" -# Serial: 206684696279472310254277870180966723415 -# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09 -# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6 -# SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44 ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl -cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu -LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT -aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD -VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT -aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ -bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu -IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b -N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t -KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu -kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm -CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ -Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu -imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te -2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe -DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC -/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p -F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt -TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== ------END CERTIFICATE----- - -# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Label: "Entrust.net Premium 2048 Secure Server CA" -# Serial: 946069240 -# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90 -# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31 -# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77 ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML -RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp -bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 -IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 -MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 -LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp -YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG -A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq -K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe -sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX -MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT -XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ -HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH -4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub -j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo -U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf -zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b -u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ -bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er -fF6adulZkMV8gzURZVE= ------END CERTIFICATE----- - -# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust -# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust -# Label: "Baltimore CyberTrust Root" -# Serial: 33554617 -# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 -# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 -# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ -RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD -VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX -DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y -ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy -VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr -mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr -IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK -mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu -XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy -dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye -jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 -BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 -DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 -9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx -jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 -Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz -ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS -R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp ------END CERTIFICATE----- - -# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network -# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network -# Label: "AddTrust External Root" -# Serial: 1 -# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f -# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68 -# SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2 ------BEGIN CERTIFICATE----- -MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs -IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 -MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux -FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h -bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v -dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt -H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 -uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX -mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX -a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN -E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 -WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD -VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 -Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU -cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx -IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN -AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH -YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 -6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC -Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX -c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a -mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. -# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. -# Label: "Entrust Root Certification Authority" -# Serial: 1164660820 -# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4 -# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9 -# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c ------BEGIN CERTIFICATE----- -MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 -Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW -KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw -NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw -NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy -ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV -BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ -KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo -Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 -4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 -KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI -rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi -94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB -sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi -gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo -kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE -vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA -A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t -O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua -AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP -9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ -eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m -0vdXcDazv/wor3ElhVsT/h5/WrQ8 ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Global CA O=GeoTrust Inc. -# Subject: CN=GeoTrust Global CA O=GeoTrust Inc. -# Label: "GeoTrust Global CA" -# Serial: 144470 -# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5 -# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12 -# SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a ------BEGIN CERTIFICATE----- -MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT -MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i -YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg -R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 -9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq -fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv -iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU -1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ -bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW -MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA -ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l -uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn -Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS -tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF -PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un -hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV -5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc. -# Subject: CN=GeoTrust Universal CA O=GeoTrust Inc. -# Label: "GeoTrust Universal CA" -# Serial: 1 -# MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48 -# SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79 -# SHA256 Fingerprint: a0:45:9b:9f:63:b2:25:59:f5:fa:5d:4c:6d:b3:f9:f7:2f:f1:93:42:03:35:78:f0:73:bf:1d:1b:46:cb:b9:12 ------BEGIN CERTIFICATE----- -MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy -c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE -BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 -IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV -VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 -cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT -QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh -F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v -c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w -mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd -VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX -teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ -f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe -Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ -nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB -/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY -MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG -9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc -aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX -IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn -ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z -uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN -Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja -QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW -koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 -ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt -DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm -bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. -# Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. -# Label: "GeoTrust Universal CA 2" -# Serial: 1 -# MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7 -# SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79 -# SHA256 Fingerprint: a0:23:4f:3b:c8:52:7c:a5:62:8e:ec:81:ad:5d:69:89:5d:a5:68:0d:c9:1d:1c:b8:47:7f:33:f8:78:b9:5b:0b ------BEGIN CERTIFICATE----- -MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy -c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD -VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 -c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 -WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG -FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq -XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL -se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb -KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd -IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 -y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt -hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc -QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 -Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV -HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ -KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z -dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ -L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr -Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo -ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY -T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz -GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m -1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV -OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH -6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX -QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS ------END CERTIFICATE----- - -# Issuer: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association -# Subject: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association -# Label: "Visa eCommerce Root" -# Serial: 25952180776285836048024890241505565794 -# MD5 Fingerprint: fc:11:b8:d8:08:93:30:00:6d:23:f9:7e:eb:52:1e:02 -# SHA1 Fingerprint: 70:17:9b:86:8c:00:a4:fa:60:91:52:22:3f:9f:3e:32:bd:e0:05:62 -# SHA256 Fingerprint: 69:fa:c9:bd:55:fb:0a:c7:8d:53:bb:ee:5c:f1:d5:97:98:9f:d0:aa:ab:20:a2:51:51:bd:f1:73:3e:e7:d1:22 ------BEGIN CERTIFICATE----- -MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr -MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl -cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv -bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw -CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h -dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l -cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h -2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E -lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV -ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq -299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t -vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL -dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD -AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF -AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR -zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3 -LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd -7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw -++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt -398znM/jra6O1I7mT1GvFpLgXPYHDw== ------END CERTIFICATE----- - -# Issuer: CN=AAA Certificate Services O=Comodo CA Limited -# Subject: CN=AAA Certificate Services O=Comodo CA Limited -# Label: "Comodo AAA Services root" -# Serial: 1 -# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0 -# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49 -# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4 ------BEGIN CERTIFICATE----- -MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj -YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM -GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua -BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe -3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 -YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR -rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm -ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU -oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF -MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v -QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t -b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF -AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q -GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz -Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 -G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi -l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 -smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority -# Subject: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority -# Label: "QuoVadis Root CA" -# Serial: 985026699 -# MD5 Fingerprint: 27:de:36:fe:72:b7:00:03:00:9d:f4:f0:1e:6c:04:24 -# SHA1 Fingerprint: de:3f:40:bd:50:93:d3:9b:6c:60:f6:da:bc:07:62:01:00:89:76:c9 -# SHA256 Fingerprint: a4:5e:de:3b:bb:f0:9c:8a:e1:5c:72:ef:c0:72:68:d6:93:a2:1c:99:6f:d5:1e:67:ca:07:94:60:fd:6d:88:73 ------BEGIN CERTIFICATE----- -MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz -MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw -IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR -dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp -li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D -rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ -WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug -F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU -xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC -Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv -dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw -ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl -IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh -c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy -ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh -Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI -KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T -KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq -y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p -dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD -VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL -MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk -fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 -7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R -cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y -mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW -xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK -SnQ2+Q== ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited -# Label: "QuoVadis Root CA 2" -# Serial: 1289 -# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b -# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7 -# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86 ------BEGIN CERTIFICATE----- -MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa -GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg -Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J -WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB -rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp -+ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 -ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i -Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz -PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og -/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH -oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI -yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud -EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 -A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL -MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT -ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f -BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn -g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl -fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K -WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha -B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc -hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR -TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD -mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z -ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y -4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza -8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 3" -# Serial: 1478 -# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf -# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85 -# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35 ------BEGIN CERTIFICATE----- -MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM -V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB -4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr -H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd -8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv -vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT -mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe -btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc -T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt -WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ -c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A -4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD -VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG -CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 -aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 -aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu -dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw -czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G -A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg -Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 -7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem -d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd -+LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B -4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN -t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x -DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 -k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s -zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j -Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT -mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK -4SVhM7JZG+Ju1zdXtg2pEto= ------END CERTIFICATE----- - -# Issuer: O=SECOM Trust.net OU=Security Communication RootCA1 -# Subject: O=SECOM Trust.net OU=Security Communication RootCA1 -# Label: "Security Communication Root CA" -# Serial: 0 -# MD5 Fingerprint: f1:bc:63:6a:54:e0:b5:27:f5:cd:e7:1a:e3:4d:6e:4a -# SHA1 Fingerprint: 36:b1:2b:49:f9:81:9e:d7:4c:9e:bc:38:0f:c6:56:8f:5d:ac:b2:f7 -# SHA256 Fingerprint: e7:5e:72:ed:9f:56:0e:ec:6e:b4:80:00:73:a4:3f:c3:ad:19:19:5a:39:22:82:01:78:95:97:4a:99:02:6b:6c ------BEGIN CERTIFICATE----- -MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY -MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t -dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 -WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD -VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 -9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ -DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 -Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N -QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ -xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G -A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T -AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG -kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr -Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 -Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU -JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot -RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== ------END CERTIFICATE----- - -# Issuer: CN=Sonera Class2 CA O=Sonera -# Subject: CN=Sonera Class2 CA O=Sonera -# Label: "Sonera Class 2 Root CA" -# Serial: 29 -# MD5 Fingerprint: a3:ec:75:0f:2e:88:df:fa:48:01:4e:0b:5c:48:6f:fb -# SHA1 Fingerprint: 37:f7:6d:e6:07:7c:90:c5:b1:3e:93:1a:b7:41:10:b4:f2:e4:9a:27 -# SHA256 Fingerprint: 79:08:b4:03:14:c1:38:10:0b:51:8d:07:35:80:7f:fb:fc:f8:51:8a:00:95:33:71:05:ba:38:6b:15:3d:d9:27 ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP -MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx -MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV -BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o -Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt -5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s -3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej -vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu -8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw -DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG -MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil -zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ -3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD -FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 -Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 -ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M ------END CERTIFICATE----- - -# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com -# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com -# Label: "XRamp Global CA Root" -# Serial: 107108908803651509692980124233745014957 -# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1 -# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6 -# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2 ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB -gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk -MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY -UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx -NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 -dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy -dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 -38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP -KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q -DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 -qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa -JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi -PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P -BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs -jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 -eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD -ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR -vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt -qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa -IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy -i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ -O+7ETPTsJ3xCwnR8gooJybQDJbw= ------END CERTIFICATE----- - -# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority -# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority -# Label: "Go Daddy Class 2 CA" -# Serial: 0 -# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 -# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 -# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 ------BEGIN CERTIFICATE----- -MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh -MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE -YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 -MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo -ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg -MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN -ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA -PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w -wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi -EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY -avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ -YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE -sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h -/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 -IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD -ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy -OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P -TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ -HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER -dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf -ReYNnyicsbkqWletNw+vHX/bvZ8= ------END CERTIFICATE----- - -# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority -# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority -# Label: "Starfield Class 2 CA" -# Serial: 0 -# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24 -# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a -# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58 ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl -MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp -U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw -NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE -ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp -ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 -DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf -8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN -+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 -X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa -K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA -1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G -A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR -zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 -YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD -bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w -DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 -L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D -eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl -xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp -VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY -WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= ------END CERTIFICATE----- - -# Issuer: O=Government Root Certification Authority -# Subject: O=Government Root Certification Authority -# Label: "Taiwan GRCA" -# Serial: 42023070807708724159991140556527066870 -# MD5 Fingerprint: 37:85:44:53:32:45:1f:20:f0:f3:95:e1:25:c4:43:4e -# SHA1 Fingerprint: f4:8b:11:bf:de:ab:be:94:54:20:71:e6:41:de:6b:be:88:2b:40:b9 -# SHA256 Fingerprint: 76:00:29:5e:ef:e8:5b:9e:1f:d6:24:db:76:06:2a:aa:ae:59:81:8a:54:d2:77:4c:d4:c0:b2:c0:11:31:e1:b3 ------BEGIN CERTIFICATE----- -MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ -MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow -PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB -AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR -IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q -gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy -yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts -F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2 -jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx -ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC -VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK -YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH -EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN -Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud -DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE -MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK -UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ -TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf -qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK -ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE -JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7 -hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1 -EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm -nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX -udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz -ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe -LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl -pYYsfPQS ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root CA" -# Serial: 17154717934120587862167794914071425081 -# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 -# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 -# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c ------BEGIN CERTIFICATE----- -MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv -b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl -cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c -JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP -mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ -wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 -VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ -AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB -AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW -BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun -pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC -dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf -fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm -NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx -H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe -+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root CA" -# Serial: 10944719598952040374951832963794454346 -# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e -# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 -# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD -QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB -CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 -nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt -43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P -T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 -gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR -TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw -DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr -hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg -06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF -PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls -YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- - -# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert High Assurance EV Root CA" -# Serial: 3553400076410547919724730734378100087 -# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a -# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 -# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j -ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 -LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug -RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm -+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW -PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM -xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB -Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 -hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg -EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA -FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec -nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z -eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF -hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 -Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe -vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep -+OkuE6N36B9K ------END CERTIFICATE----- - -# Issuer: CN=Class 2 Primary CA O=Certplus -# Subject: CN=Class 2 Primary CA O=Certplus -# Label: "Certplus Class 2 Primary CA" -# Serial: 177770208045934040241468760488327595043 -# MD5 Fingerprint: 88:2c:8c:52:b8:a2:3c:f3:f7:bb:03:ea:ae:ac:42:0b -# SHA1 Fingerprint: 74:20:74:41:72:9c:dd:92:ec:79:31:d8:23:10:8d:c2:81:92:e2:bb -# SHA256 Fingerprint: 0f:99:3c:8a:ef:97:ba:af:56:87:14:0e:d5:9a:d1:82:1b:b4:af:ac:f0:aa:9a:58:b5:d5:7a:33:8a:3a:fb:cb ------BEGIN CERTIFICATE----- -MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw -PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz -cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 -MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz -IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ -ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR -VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL -kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd -EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas -H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 -HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud -DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 -QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu -Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ -AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 -yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR -FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA -ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB -kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 -l7+ijrRU ------END CERTIFICATE----- - -# Issuer: CN=DST Root CA X3 O=Digital Signature Trust Co. -# Subject: CN=DST Root CA X3 O=Digital Signature Trust Co. -# Label: "DST Root CA X3" -# Serial: 91299735575339953335919266965803778155 -# MD5 Fingerprint: 41:03:52:dc:0f:f7:50:1b:16:f0:02:8e:ba:6f:45:c5 -# SHA1 Fingerprint: da:c9:02:4f:54:d8:f6:df:94:93:5f:b1:73:26:38:ca:6a:d7:7c:13 -# SHA256 Fingerprint: 06:87:26:03:31:a7:24:03:d9:09:f1:05:e6:9b:cf:0d:32:e1:bd:24:93:ff:c6:d9:20:6d:11:bc:d6:77:07:39 ------BEGIN CERTIFICATE----- -MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ -MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT -DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow -PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD -Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O -rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq -OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b -xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw -7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD -aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV -HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG -SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 -ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr -AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz -R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 -JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo -Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ ------END CERTIFICATE----- - -# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG -# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG -# Label: "SwissSign Gold CA - G2" -# Serial: 13492815561806991280 -# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93 -# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61 -# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95 ------BEGIN CERTIFICATE----- -MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV -BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln -biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF -MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT -d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC -CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8 -76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+ -bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c -6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE -emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd -MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt -MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y -MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y -FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi -aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM -gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB -qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7 -lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn -8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov -L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6 -45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO -UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5 -O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC -bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv -GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a -77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC -hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3 -92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp -Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w -ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt -Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ ------END CERTIFICATE----- - -# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG -# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG -# Label: "SwissSign Silver CA - G2" -# Serial: 5700383053117599563 -# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13 -# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb -# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5 ------BEGIN CERTIFICATE----- -MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE -BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu -IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow -RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY -U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A -MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv -Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br -YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF -nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH -6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt -eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/ -c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ -MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH -HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf -jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6 -5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB -rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU -F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c -wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 -cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB -AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp -WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9 -xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ -2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ -IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8 -aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X -em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR -dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/ -OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+ -hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy -tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. -# Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. -# Label: "GeoTrust Primary Certification Authority" -# Serial: 32798226551256963324313806436981982369 -# MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf -# SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96 -# SHA256 Fingerprint: 37:d5:10:06:c5:12:ea:ab:62:64:21:f1:ec:8c:92:01:3f:c5:f8:2a:e9:8e:e5:33:eb:46:19:b8:de:b4:d0:6c ------BEGIN CERTIFICATE----- -MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY -MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo -R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx -MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK -Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 -AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA -ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 -7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W -kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI -mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ -KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 -6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl -4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K -oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj -UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU -AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= ------END CERTIFICATE----- - -# Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only -# Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only -# Label: "thawte Primary Root CA" -# Serial: 69529181992039203566298953787712940909 -# MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12 -# SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81 -# SHA256 Fingerprint: 8d:72:2f:81:a9:c1:13:c0:79:1d:f1:36:a2:96:6d:b2:6c:95:0a:97:1d:b4:6b:41:99:f4:ea:54:b7:8b:fb:9f ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB -qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf -Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw -MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV -BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw -NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j -LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG -A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs -W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta -3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk -6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 -Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J -NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA -MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP -r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU -DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz -YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX -xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 -/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ -LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 -jVaMaA== ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only -# Label: "VeriSign Class 3 Public Primary Certification Authority - G5" -# Serial: 33037644167568058970164719475676101450 -# MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c -# SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5 -# SHA256 Fingerprint: 9a:cf:ab:7e:43:c8:d8:80:d0:6b:26:2a:94:de:ee:e4:b4:65:99:89:c3:d0:ca:f1:9b:af:64:05:e4:1a:b7:df ------BEGIN CERTIFICATE----- -MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB -yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL -ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp -U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW -ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW -ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp -U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y -aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 -nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex -t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz -SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG -BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ -rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ -NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E -BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH -BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy -aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv -MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE -p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y -5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK -WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ -4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N -hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq ------END CERTIFICATE----- - -# Issuer: CN=SecureTrust CA O=SecureTrust Corporation -# Subject: CN=SecureTrust CA O=SecureTrust Corporation -# Label: "SecureTrust CA" -# Serial: 17199774589125277788362757014266862032 -# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1 -# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11 -# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73 ------BEGIN CERTIFICATE----- -MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz -MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv -cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz -Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO -0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao -wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj -7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS -8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT -BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg -JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC -NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 -6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ -3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm -D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS -CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR -3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= ------END CERTIFICATE----- - -# Issuer: CN=Secure Global CA O=SecureTrust Corporation -# Subject: CN=Secure Global CA O=SecureTrust Corporation -# Label: "Secure Global CA" -# Serial: 9751836167731051554232119481456978597 -# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de -# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b -# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69 ------BEGIN CERTIFICATE----- -MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx -MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg -Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ -iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa -/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ -jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI -HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 -sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w -gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw -KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG -AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L -URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO -H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm -I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY -iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc -f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW ------END CERTIFICATE----- - -# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO Certification Authority O=COMODO CA Limited -# Label: "COMODO Certification Authority" -# Serial: 104350513648249232941998508985834464573 -# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 -# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b -# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 ------BEGIN CERTIFICATE----- -MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB -gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV -BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw -MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl -YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P -RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 -UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI -2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 -Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp -+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ -DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O -nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW -/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g -PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u -QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY -SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv -IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ -RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 -zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd -BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB -ZQ== ------END CERTIFICATE----- - -# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. -# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. -# Label: "Network Solutions Certificate Authority" -# Serial: 116697915152937497490437556386812487904 -# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e -# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce -# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c ------BEGIN CERTIFICATE----- -MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi -MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu -MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp -dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV -UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO -ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz -c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP -OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl -mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF -BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 -qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw -gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu -bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp -dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 -6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ -h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH -/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv -wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN -pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey ------END CERTIFICATE----- - -# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited -# Label: "COMODO ECC Certification Authority" -# Serial: 41578283867086692638256921589707938090 -# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 -# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 -# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 ------BEGIN CERTIFICATE----- -MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT -IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw -MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy -ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N -T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR -FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J -cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW -BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm -fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv -GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= ------END CERTIFICATE----- - -# Issuer: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed -# Subject: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed -# Label: "OISTE WISeKey Global Root GA CA" -# Serial: 86718877871133159090080555911823548314 -# MD5 Fingerprint: bc:6c:51:33:a7:e9:d3:66:63:54:15:72:1b:21:92:93 -# SHA1 Fingerprint: 59:22:a1:e1:5a:ea:16:35:21:f8:98:39:6a:46:46:b0:44:1b:0f:a9 -# SHA256 Fingerprint: 41:c9:23:86:6a:b4:ca:d6:b7:ad:57:80:81:58:2e:02:07:97:a6:cb:df:4f:ff:78:ce:83:96:b3:89:37:d7:f5 ------BEGIN CERTIFICATE----- -MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB -ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly -aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl -ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w -NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G -A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD -VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX -SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR -VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2 -w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF -mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg -4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9 -4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw -EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx -SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2 -ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8 -vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa -hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi -Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ -/L7fCg0= ------END CERTIFICATE----- - -# Issuer: CN=Certigna O=Dhimyotis -# Subject: CN=Certigna O=Dhimyotis -# Label: "Certigna" -# Serial: 18364802974209362175 -# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff -# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97 -# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d ------BEGIN CERTIFICATE----- -MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV -BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X -DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ -BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 -QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny -gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw -zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q -130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 -JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw -ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT -AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj -AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG -9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h -bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc -fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu -HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w -t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw -WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== ------END CERTIFICATE----- - -# Issuer: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center -# Subject: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center -# Label: "Deutsche Telekom Root CA 2" -# Serial: 38 -# MD5 Fingerprint: 74:01:4a:91:b1:08:c4:58:ce:47:cd:f0:dd:11:53:08 -# SHA1 Fingerprint: 85:a4:08:c0:9c:19:3e:5d:51:58:7d:cd:d6:13:30:fd:8c:de:37:bf -# SHA256 Fingerprint: b6:19:1a:50:d0:c3:97:7f:7d:a9:9b:cd:aa:c8:6a:22:7d:ae:b9:67:9e:c7:0b:a3:b0:c9:d9:22:71:c1:70:d3 ------BEGIN CERTIFICATE----- -MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc -MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj -IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB -IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE -RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl -U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 -IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU -ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC -QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr -rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S -NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc -QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH -txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP -BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC -AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp -tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa -IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl -6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ -xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU -Cm26OWMohpLzGITY+9HPBVZkVw== ------END CERTIFICATE----- - -# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc -# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc -# Label: "Cybertrust Global Root" -# Serial: 4835703278459682877484360 -# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1 -# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6 -# SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3 ------BEGIN CERTIFICATE----- -MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG -A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh -bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE -ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS -b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5 -7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS -J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y -HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP -t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz -FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY -XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ -MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw -hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js -MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA -A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj -Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx -XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o -omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc -A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW -WL1WMRJOEcgh4LMRkWXbtKaIOM5V ------END CERTIFICATE----- - -# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority -# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority -# Label: "ePKI Root Certification Authority" -# Serial: 28956088682735189655030529057352760477 -# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3 -# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0 -# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5 ------BEGIN CERTIFICATE----- -MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe -MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 -ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw -IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL -SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH -SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh -ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X -DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 -TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ -fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA -sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU -WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS -nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH -dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip -NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC -AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF -MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH -ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB -uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl -PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP -JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ -gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 -j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 -5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB -o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS -/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z -Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE -W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D -hNQ+IIX3Sj0rnP0qCglN6oH4EZw= ------END CERTIFICATE----- - -# Issuer: O=certSIGN OU=certSIGN ROOT CA -# Subject: O=certSIGN OU=certSIGN ROOT CA -# Label: "certSIGN ROOT CA" -# Serial: 35210227249154 -# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17 -# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b -# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb ------BEGIN CERTIFICATE----- -MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT -AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD -QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP -MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC -ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do -0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ -UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d -RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ -OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv -JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C -AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O -BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ -LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY -MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ -44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I -Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw -i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN -9u6wWk5JRFRYX0KD ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only -# Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only -# Label: "GeoTrust Primary Certification Authority - G3" -# Serial: 28809105769928564313984085209975885599 -# MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05 -# SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd -# SHA256 Fingerprint: b4:78:b8:12:25:0d:f8:78:63:5c:2a:a7:ec:7d:15:5e:aa:62:5e:e8:29:16:e2:cd:29:43:61:88:6c:d1:fb:d4 ------BEGIN CERTIFICATE----- -MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB -mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT -MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s -eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ -BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg -MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0 -BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz -+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm -hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn -5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W -JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL -DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC -huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw -HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB -AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB -zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN -kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD -AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH -SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G -spki4cErx5z481+oghLrGREt ------END CERTIFICATE----- - -# Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only -# Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only -# Label: "thawte Primary Root CA - G2" -# Serial: 71758320672825410020661621085256472406 -# MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f -# SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12 -# SHA256 Fingerprint: a4:31:0d:50:af:18:a6:44:71:90:37:2a:86:af:af:8b:95:1f:fb:43:1d:83:7f:1e:56:88:b4:59:71:ed:15:57 ------BEGIN CERTIFICATE----- -MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp -IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi -BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw -MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh -d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig -YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v -dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/ -BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6 -papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K -DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3 -KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox -XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== ------END CERTIFICATE----- - -# Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only -# Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only -# Label: "thawte Primary Root CA - G3" -# Serial: 127614157056681299805556476275995414779 -# MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31 -# SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2 -# SHA256 Fingerprint: 4b:03:f4:58:07:ad:70:f2:1b:fc:2c:ae:71:c9:fd:e4:60:4c:06:4c:f5:ff:b6:86:ba:e5:db:aa:d7:fd:d3:4c ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB -rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf -Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw -MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV -BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa -Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl -LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u -MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl -ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm -gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8 -YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf -b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9 -9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S -zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk -OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV -HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA -2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW -oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu -t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c -KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM -m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu -MdRAGmI0Nj81Aa6sY6A= ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only -# Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only -# Label: "GeoTrust Primary Certification Authority - G2" -# Serial: 80682863203381065782177908751794619243 -# MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a -# SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0 -# SHA256 Fingerprint: 5e:db:7a:c4:3b:82:a0:6a:87:61:e8:d7:be:49:79:eb:f2:61:1f:7d:d7:9b:f9:1c:1c:6b:56:6a:21:9e:d7:66 ------BEGIN CERTIFICATE----- -MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL -MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj -KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2 -MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 -eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV -BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw -NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV -BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH -MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL -So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal -tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO -BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG -CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT -qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz -rD6ogRLQy7rQkgu2npaqBA+K ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only -# Label: "VeriSign Universal Root Certification Authority" -# Serial: 85209574734084581917763752644031726877 -# MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19 -# SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54 -# SHA256 Fingerprint: 23:99:56:11:27:a5:71:25:de:8c:ef:ea:61:0d:df:2f:a0:78:b5:c8:06:7f:4e:82:82:90:bf:b8:60:e8:4b:3c ------BEGIN CERTIFICATE----- -MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB -vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL -ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp -U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W -ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX -MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0 -IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y -IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh -bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF -9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH -H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H -LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN -/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT -rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud -EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw -WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs -exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud -DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4 -sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+ -seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz -4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+ -BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR -lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3 -7M2CYfE45k+XmCpajQ== ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only -# Label: "VeriSign Class 3 Public Primary Certification Authority - G4" -# Serial: 63143484348153506665311985501458640051 -# MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41 -# SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a -# SHA256 Fingerprint: 69:dd:d7:ea:90:bb:57:c9:3e:13:5d:c8:5e:a6:fc:d5:48:0b:60:32:39:bd:c4:54:fc:75:8b:2a:26:cf:7f:79 ------BEGIN CERTIFICATE----- -MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW -ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp -U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y -aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp -U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg -SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln -biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm -GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve -fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw -AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ -aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj -aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW -kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC -4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga -FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== ------END CERTIFICATE----- - -# Issuer: CN=NetLock Arany (Class Gold) Főtanúsítvány O=NetLock Kft. OU=Tanúsítványkiadók (Certification Services) -# Subject: CN=NetLock Arany (Class Gold) Főtanúsítvány O=NetLock Kft. OU=Tanúsítványkiadók (Certification Services) -# Label: "NetLock Arany (Class Gold) Főtanúsítvány" -# Serial: 80544274841616 -# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88 -# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91 -# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98 ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG -EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 -MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl -cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR -dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB -pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM -b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm -aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz -IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT -lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz -AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 -VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG -ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 -BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG -AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M -U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh -bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C -+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC -bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F -uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 -XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= ------END CERTIFICATE----- - -# Issuer: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden -# Subject: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden -# Label: "Staat der Nederlanden Root CA - G2" -# Serial: 10000012 -# MD5 Fingerprint: 7c:a5:0f:f8:5b:9a:7d:6d:30:ae:54:5a:e3:42:a2:8a -# SHA1 Fingerprint: 59:af:82:79:91:86:c7:b4:75:07:cb:cf:03:57:46:eb:04:dd:b7:16 -# SHA256 Fingerprint: 66:8c:83:94:7d:a6:3b:72:4b:ec:e1:74:3c:31:a0:e6:ae:d0:db:8e:c5:b3:1b:e3:77:bb:78:4f:91:b6:71:6f ------BEGIN CERTIFICATE----- -MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX -DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl -ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv -b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291 -qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp -uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU -Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE -pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp -5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M -UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN -GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy -5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv -6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK -eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6 -B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/ -BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov -L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV -HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG -SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS -CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen -5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897 -IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK -gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL -+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL -vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm -bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk -N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC -Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z -ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ== ------END CERTIFICATE----- - -# Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post -# Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post -# Label: "Hongkong Post Root CA 1" -# Serial: 1000 -# MD5 Fingerprint: a8:0d:6f:39:78:b9:43:6d:77:42:6d:98:5a:cc:23:ca -# SHA1 Fingerprint: d6:da:a8:20:8d:09:d2:15:4d:24:b5:2f:cb:34:6e:b2:58:b2:8a:58 -# SHA256 Fingerprint: f9:e6:7d:33:6c:51:00:2a:c0:54:c6:32:02:2d:66:dd:a2:e7:e3:ff:f1:0a:d0:61:ed:31:d8:bb:b4:10:cf:b2 ------BEGIN CERTIFICATE----- -MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx -FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg -Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG -A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr -b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ -jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn -PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh -ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 -nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h -q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED -MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC -mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 -7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB -oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs -EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO -fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi -AmvZWg== ------END CERTIFICATE----- - -# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. -# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. -# Label: "SecureSign RootCA11" -# Serial: 1 -# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26 -# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3 -# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12 ------BEGIN CERTIFICATE----- -MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr -MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG -A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 -MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp -Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD -QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz -i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 -h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV -MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 -UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni -8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC -h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD -VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB -AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm -KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ -X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr -QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 -pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN -QSdJQO7e5iNEOdyhIta6A/I= ------END CERTIFICATE----- - -# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. -# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. -# Label: "Microsec e-Szigno Root CA 2009" -# Serial: 14014712776195784473 -# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1 -# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e -# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78 ------BEGIN CERTIFICATE----- -MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD -VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 -ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G -CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y -OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx -FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp -Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o -dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP -kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc -cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U -fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 -N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC -xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 -+rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G -A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM -Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG -SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h -mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk -ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 -tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c -2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t -HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 -# Label: "GlobalSign Root CA - R3" -# Serial: 4835703278459759426209954 -# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 -# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad -# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b ------BEGIN CERTIFICATE----- -MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 -MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 -RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT -gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm -KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd -QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ -XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw -DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o -LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU -RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp -jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK -6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX -mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs -Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH -WD9f ------END CERTIFICATE----- - -# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 -# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 -# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068" -# Serial: 6047274297262753887 -# MD5 Fingerprint: 73:3a:74:7a:ec:bb:a3:96:a6:c2:e4:e2:c8:9b:c0:c3 -# SHA1 Fingerprint: ae:c5:fb:3f:c8:e1:bf:c4:e5:4f:03:07:5a:9a:e8:00:b7:f7:b6:fa -# SHA256 Fingerprint: 04:04:80:28:bf:1f:28:64:d4:8f:9a:d4:d8:32:94:36:6a:82:88:56:55:3f:3b:14:30:3f:90:14:7f:5d:40:ef ------BEGIN CERTIFICATE----- -MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE -BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h -cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy -MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg -Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 -thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM -cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG -L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i -NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h -X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b -m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy -Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja -EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T -KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF -6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh -OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD -VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD -VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp -cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv -ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl -AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF -661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9 -am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1 -ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481 -PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS -3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k -SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF -3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM -ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g -StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz -Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB -jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V ------END CERTIFICATE----- - -# Issuer: CN=Izenpe.com O=IZENPE S.A. -# Subject: CN=Izenpe.com O=IZENPE S.A. -# Label: "Izenpe.com" -# Serial: 917563065490389241595536686991402621 -# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73 -# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19 -# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f ------BEGIN CERTIFICATE----- -MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4 -MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6 -ZW5wZS5jb20wHhcNMDcxMjEzMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYD -VQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5j -b20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ03rKDx6sp4boFmVq -scIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAKClaO -xdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6H -LmYRY2xU+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFX -uaOKmMPsOzTFlUFpfnXCPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQD -yCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxTOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+ -JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbKF7jJeodWLBoBHmy+E60Q -rLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK0GqfvEyN -BjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8L -hij+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIB -QFqNeb+Lz0vPqhbBleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+ -HMh3/1uaD7euBUbl8agW7EekFwIDAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2lu -Zm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+SVpFTlBFIFMuQS4gLSBDSUYg -QTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBGNjIgUzgxQzBB -BgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx -MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwHQYDVR0OBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUA -A4ICAQB4pgwWSp9MiDrAyw6lFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWb -laQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbgakEyrkgPH7UIBzg/YsfqikuFgba56 -awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8qhT/AQKM6WfxZSzwo -JNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Csg1lw -LDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCT -VyvehQP5aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGk -LhObNA5me0mrZJfQRsN5nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJb -UjWumDqtujWTI6cfSN01RpiyEGjkpTHCClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/ -QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZoQ0iy2+tzJOeRf1SktoA+ -naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1ZWrOZyGls -QyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== ------END CERTIFICATE----- - -# Issuer: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. -# Subject: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. -# Label: "Chambers of Commerce Root - 2008" -# Serial: 11806822484801597146 -# MD5 Fingerprint: 5e:80:9e:84:5a:0e:65:0b:17:02:f3:55:18:2a:3e:d7 -# SHA1 Fingerprint: 78:6a:74:ac:76:ab:14:7f:9c:6a:30:50:ba:9e:a8:7e:fe:9a:ce:3c -# SHA256 Fingerprint: 06:3e:4a:fa:c4:91:df:d3:32:f3:08:9b:85:42:e9:46:17:d8:93:d7:fe:94:4e:10:a7:93:7e:e2:9d:96:93:c0 ------BEGIN CERTIFICATE----- -MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD -VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 -IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 -MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz -IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz -MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj -dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw -EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp -MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G -CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9 -28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq -VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q -DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR -5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL -ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a -Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl -UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s -+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5 -Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj -ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx -hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV -HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1 -+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN -YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t -L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy -ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt -IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV -HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w -DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW -PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF -5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1 -glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH -FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2 -pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD -xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG -tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq -jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De -fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg -OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ -d0jQ ------END CERTIFICATE----- - -# Issuer: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. -# Subject: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. -# Label: "Global Chambersign Root - 2008" -# Serial: 14541511773111788494 -# MD5 Fingerprint: 9e:80:ff:78:01:0c:2e:c1:36:bd:fe:96:90:6e:08:f3 -# SHA1 Fingerprint: 4a:bd:ee:ec:95:0d:35:9c:89:ae:c7:52:a1:2c:5b:29:f6:d6:aa:0c -# SHA256 Fingerprint: 13:63:35:43:93:34:a7:69:80:16:a0:d3:24:de:72:28:4e:07:9d:7b:52:20:bb:8f:bd:74:78:16:ee:be:ba:ca ------BEGIN CERTIFICATE----- -MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD -VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 -IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 -MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD -aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx -MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy -cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG -A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl -BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI -hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed -KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7 -G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2 -zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4 -ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG -HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2 -Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V -yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e -beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r -6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh -wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog -zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW -BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr -ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp -ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk -cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt -YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC -CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow -KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI -hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ -UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz -X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x -fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz -a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd -Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd -SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O -AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso -M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge -v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z -09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B ------END CERTIFICATE----- - -# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. -# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. -# Label: "Go Daddy Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 -# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b -# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT -EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp -ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz -NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH -EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE -AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD -E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH -/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy -DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh -GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR -tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA -AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE -FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX -WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu -9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr -gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo -2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO -LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI -4uJEvlz36hz1 ------END CERTIFICATE----- - -# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Label: "Starfield Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 -# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e -# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT -HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs -ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw -MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 -b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj -aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp -Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg -nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 -HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N -Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN -dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 -HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO -BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G -CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU -sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 -4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg -8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K -pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 -mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 ------END CERTIFICATE----- - -# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Label: "Starfield Services Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2 -# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f -# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5 ------BEGIN CERTIFICATE----- -MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT -HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs -ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 -MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD -VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy -ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy -dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p -OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 -8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K -Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe -hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk -6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw -DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q -AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI -bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB -ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z -qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd -iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn -0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN -sSi6 ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Commercial O=AffirmTrust -# Subject: CN=AffirmTrust Commercial O=AffirmTrust -# Label: "AffirmTrust Commercial" -# Serial: 8608355977964138876 -# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7 -# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7 -# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7 ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz -dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL -MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp -cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP -Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr -ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL -MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 -yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr -VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ -nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ -KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG -XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj -vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt -Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g -N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC -nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Networking O=AffirmTrust -# Subject: CN=AffirmTrust Networking O=AffirmTrust -# Label: "AffirmTrust Networking" -# Serial: 8957382827206547757 -# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f -# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f -# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz -dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL -MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp -cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y -YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua -kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL -QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp -6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG -yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i -QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ -KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO -tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu -QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ -Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u -olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 -x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Premium O=AffirmTrust -# Subject: CN=AffirmTrust Premium O=AffirmTrust -# Label: "AffirmTrust Premium" -# Serial: 7893706540734352110 -# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57 -# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27 -# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a ------BEGIN CERTIFICATE----- -MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz -dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG -A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U -cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf -qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ -JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ -+jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS -s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 -HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 -70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG -V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S -qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S -5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia -C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX -OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE -FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 -KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg -Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B -8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ -MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc -0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ -u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF -u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH -YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 -GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO -RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e -KeC2uAloGRwYQw== ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust -# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust -# Label: "AffirmTrust Premium ECC" -# Serial: 8401224907861490260 -# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d -# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb -# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23 ------BEGIN CERTIFICATE----- -MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC -VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ -cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ -BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt -VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D -0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 -ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G -A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs -aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I -flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== ------END CERTIFICATE----- - -# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Label: "Certum Trusted Network CA" -# Serial: 279744 -# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78 -# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e -# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e ------BEGIN CERTIFICATE----- -MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM -MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D -ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU -cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 -WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg -Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw -IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH -UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM -TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU -BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM -kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x -AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV -HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y -sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL -I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 -J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY -VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI -03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= ------END CERTIFICATE----- - -# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA -# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA -# Label: "TWCA Root Certification Authority" -# Serial: 1 -# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79 -# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48 -# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44 ------BEGIN CERTIFICATE----- -MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES -MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU -V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz -WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO -LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE -AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH -K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX -RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z -rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx -3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq -hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC -MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls -XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D -lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn -aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ -YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== ------END CERTIFICATE----- - -# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 -# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 -# Label: "Security Communication RootCA2" -# Serial: 0 -# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43 -# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74 -# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6 ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl -MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe -U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX -DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy -dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj -YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV -OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr -zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM -VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ -hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO -ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw -awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs -OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 -DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF -coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc -okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 -t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy -1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ -SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions RootCA 2011" -# Serial: 0 -# MD5 Fingerprint: 73:9f:4c:4b:73:5b:79:e9:fa:ba:1c:ef:6e:cb:d5:c9 -# SHA1 Fingerprint: fe:45:65:9b:79:03:5b:98:a1:61:b5:51:2e:ac:da:58:09:48:22:4d -# SHA256 Fingerprint: bc:10:4f:15:a4:8b:e7:09:dc:a5:42:a7:e1:d4:b9:df:6f:05:45:27:e8:02:ea:a9:2d:59:54:44:25:8a:fe:71 ------BEGIN CERTIFICATE----- -MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix -RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 -dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p -YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw -NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK -EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl -cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl -c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz -dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ -fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns -bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD -75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP -FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV -HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp -5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu -b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA -A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p -6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 -TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7 -dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys -Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI -l7WdmplNsDz4SgCbZN2fOUvRJ9e4 ------END CERTIFICATE----- - -# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 -# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 -# Label: "Actalis Authentication Root CA" -# Serial: 6271844772424770508 -# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6 -# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac -# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66 ------BEGIN CERTIFICATE----- -MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE -BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w -MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 -IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC -SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 -ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv -UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX -4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 -KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ -gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb -rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ -51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F -be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe -KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F -v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn -fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 -jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz -ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt -ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL -e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 -jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz -WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V -SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j -pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX -X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok -fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R -K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU -ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU -LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT -LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== ------END CERTIFICATE----- - -# Issuer: O=Trustis Limited OU=Trustis FPS Root CA -# Subject: O=Trustis Limited OU=Trustis FPS Root CA -# Label: "Trustis FPS Root CA" -# Serial: 36053640375399034304724988975563710553 -# MD5 Fingerprint: 30:c9:e7:1e:6b:e6:14:eb:65:b2:16:69:20:31:67:4d -# SHA1 Fingerprint: 3b:c0:38:0b:33:c3:f6:a6:0c:86:15:22:93:d9:df:f5:4b:81:c0:04 -# SHA256 Fingerprint: c1:b4:82:99:ab:a5:20:8f:e9:63:0a:ce:55:ca:68:a0:3e:da:5a:51:9c:88:02:a0:d3:a6:73:be:8f:8e:55:7d ------BEGIN CERTIFICATE----- -MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF -MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL -ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx -MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc -MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+ -AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH -iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj -vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA -0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB -OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/ -BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E -FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01 -GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW -zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4 -1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE -f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F -jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN -ZetX2fNXlrtIzYE= ------END CERTIFICATE----- - -# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 -# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 -# Label: "Buypass Class 2 Root CA" -# Serial: 2 -# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29 -# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99 -# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48 ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg -Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow -TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw -HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB -BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr -6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV -L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 -1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx -MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ -QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB -arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr -Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi -FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS -P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN -9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP -AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz -uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h -9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s -A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t -OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo -+fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 -KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 -DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us -H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ -I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 -5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h -3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz -Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= ------END CERTIFICATE----- - -# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 -# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 -# Label: "Buypass Class 3 Root CA" -# Serial: 2 -# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec -# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57 -# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg -Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow -TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw -HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB -BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y -ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E -N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 -tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX -0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c -/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X -KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY -zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS -O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D -34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP -K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 -AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv -Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj -QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV -cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS -IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 -HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa -O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv -033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u -dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE -kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 -3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD -u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq -4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= ------END CERTIFICATE----- - -# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Label: "T-TeleSec GlobalRoot Class 3" -# Serial: 1 -# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef -# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1 -# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx -KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd -BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl -YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 -OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy -aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 -ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN -8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ -RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 -hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 -ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM -EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 -A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy -WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ -1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 -6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT -91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml -e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p -TpPDpFQUWw== ------END CERTIFICATE----- - -# Issuer: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus -# Subject: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus -# Label: "EE Certification Centre Root CA" -# Serial: 112324828676200291871926431888494945866 -# MD5 Fingerprint: 43:5e:88:d4:7d:1a:4a:7e:fd:84:2e:52:eb:01:d4:6f -# SHA1 Fingerprint: c9:a8:b9:e7:55:80:5e:58:e3:53:77:a7:25:eb:af:c3:7b:27:cc:d7 -# SHA256 Fingerprint: 3e:84:ba:43:42:90:85:16:e7:75:73:c0:99:2f:09:79:ca:08:4e:46:85:68:1f:f1:95:cc:ba:8a:22:9b:8a:76 ------BEGIN CERTIFICATE----- -MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1 -MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1 -czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG -CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy -MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl -ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS -b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy -euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO -bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw -WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d -MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE -1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD -VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/ -zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB -BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF -BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV -v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG -E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u -uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW -iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v -GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0= ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH -# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH -# Label: "D-TRUST Root Class 3 CA 2 2009" -# Serial: 623603 -# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f -# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0 -# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1 ------BEGIN CERTIFICATE----- -MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF -MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD -bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha -ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM -HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 -UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 -tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R -ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM -lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp -/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G -A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G -A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj -dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy -MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl -cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js -L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL -BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni -acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 -o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K -zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 -PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y -Johw1+qRzT65ysCQblrGXnRl11z+o+I= ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH -# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH -# Label: "D-TRUST Root Class 3 CA 2 EV 2009" -# Serial: 623604 -# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6 -# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83 -# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81 ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF -MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD -bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw -NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV -BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn -ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 -3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z -qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR -p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 -HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw -ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea -HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw -Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh -c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E -RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt -dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku -Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp -3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 -nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF -CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na -xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX -KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 ------END CERTIFICATE----- - -# Issuer: CN=CA Disig Root R2 O=Disig a.s. -# Subject: CN=CA Disig Root R2 O=Disig a.s. -# Label: "CA Disig Root R2" -# Serial: 10572350602393338211 -# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03 -# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71 -# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03 ------BEGIN CERTIFICATE----- -MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV -BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu -MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy -MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx -EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw -ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe -NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH -PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I -x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe -QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR -yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO -QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 -H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ -QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD -i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs -nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 -rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud -DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI -hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM -tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf -GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb -lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka -+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal -TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i -nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 -gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr -G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os -zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x -L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL ------END CERTIFICATE----- - -# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV -# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV -# Label: "ACCVRAIZ1" -# Serial: 6828503384748696800 -# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02 -# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17 -# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13 ------BEGIN CERTIFICATE----- -MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE -AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw -CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ -BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND -VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb -qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY -HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo -G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA -lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr -IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/ -0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH -k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47 -4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO -m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa -cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl -uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI -KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls -ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG -AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 -VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT -VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG -CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA -cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA -QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA -7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA -cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA -QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA -czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu -aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt -aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud -DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF -BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp -D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU -JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m -AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD -vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms -tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH -7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h -I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA -h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF -d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H -pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 ------END CERTIFICATE----- - -# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA -# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA -# Label: "TWCA Global Root CA" -# Serial: 3262 -# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96 -# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65 -# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b ------BEGIN CERTIFICATE----- -MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx -EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT -VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5 -NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT -B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF -10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz -0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh -MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH -zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc -46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2 -yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi -laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP -oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA -BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE -qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm -4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL -1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn -LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF -H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo -RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+ -nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh -15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW -6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW -nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j -wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz -aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy -KwbQBM0= ------END CERTIFICATE----- - -# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera -# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera -# Label: "TeliaSonera Root CA v1" -# Serial: 199041966741090107964904287217786801558 -# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c -# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37 -# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89 ------BEGIN CERTIFICATE----- -MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw -NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv -b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD -VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2 -MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F -VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1 -7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X -Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+ -/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs -81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm -dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe -Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu -sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4 -pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs -slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ -arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD -VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG -9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl -dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx -0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj -TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed -Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7 -Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI -OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7 -vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW -t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn -HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx -SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= ------END CERTIFICATE----- - -# Issuer: CN=E-Tugra Certification Authority O=E-Tuğra EBG Bilişim Teknolojileri ve Hizmetleri A.Ş. OU=E-Tugra Sertifikasyon Merkezi -# Subject: CN=E-Tugra Certification Authority O=E-Tuğra EBG Bilişim Teknolojileri ve Hizmetleri A.Ş. OU=E-Tugra Sertifikasyon Merkezi -# Label: "E-Tugra Certification Authority" -# Serial: 7667447206703254355 -# MD5 Fingerprint: b8:a1:03:63:b0:bd:21:71:70:8a:6f:13:3a:bb:79:49 -# SHA1 Fingerprint: 51:c6:e7:08:49:06:6e:f3:92:d4:5c:a0:0d:6d:a3:62:8f:c3:52:39 -# SHA256 Fingerprint: b0:bf:d5:2b:b0:d7:d9:bd:92:bf:5d:4d:c1:3d:a2:55:c0:2c:54:2f:37:83:65:ea:89:39:11:f5:5e:55:f2:3c ------BEGIN CERTIFICATE----- -MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV -BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC -aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV -BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1 -Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz -MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+ -BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp -em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN -ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY -B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH -D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF -Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo -q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D -k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH -fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut -dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM -ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8 -zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn -rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX -U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6 -Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5 -XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF -Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR -HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY -GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c -77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3 -+GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK -vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6 -FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl -yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P -AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD -y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d -NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA== ------END CERTIFICATE----- - -# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Label: "T-TeleSec GlobalRoot Class 2" -# Serial: 1 -# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a -# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9 -# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52 ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx -KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd -BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl -YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1 -OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy -aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 -ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd -AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC -FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi -1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq -jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ -wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/ -WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy -NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC -uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw -IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6 -g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN -9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP -BSeOE6Fuwg== ------END CERTIFICATE----- - -# Issuer: CN=Atos TrustedRoot 2011 O=Atos -# Subject: CN=Atos TrustedRoot 2011 O=Atos -# Label: "Atos TrustedRoot 2011" -# Serial: 6643877497813316402 -# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56 -# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21 -# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74 ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE -AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG -EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM -FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC -REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp -Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM -VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+ -SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ -4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L -cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi -eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV -HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG -A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 -DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j -vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP -DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc -maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D -lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv -KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 1 G3" -# Serial: 687049649626669250736271037606554624078720034195 -# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab -# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67 -# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00 -MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV -wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe -rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341 -68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh -4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp -UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o -abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc -3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G -KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt -hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO -Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt -zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD -ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC -MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2 -cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN -qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5 -YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv -b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2 -8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k -NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj -ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp -q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt -nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 2 G3" -# Serial: 390156079458959257446133169266079962026824725800 -# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06 -# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36 -# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00 -MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf -qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW -n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym -c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+ -O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1 -o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j -IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq -IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz -8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh -vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l -7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG -cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD -ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 -AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC -roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga -W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n -lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE -+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV -csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd -dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg -KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM -HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4 -WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 3 G3" -# Serial: 268090761170461462463995952157327242137089239581 -# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7 -# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d -# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00 -MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR -/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu -FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR -U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c -ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR -FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k -A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw -eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl -sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp -VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q -A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ -ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD -ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px -KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI -FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv -oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg -u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP -0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf -3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl -8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+ -DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN -PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ -ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0 ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root G2" -# Serial: 15385348160840213938643033620894905419 -# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d -# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f -# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85 ------BEGIN CERTIFICATE----- -MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv -b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl -cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA -n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc -biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp -EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA -bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu -YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB -AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW -BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI -QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I -0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni -lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9 -B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv -ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo -IhNzbM8m9Yop5w== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root G3" -# Serial: 15459312981008553731928384953135426796 -# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb -# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89 -# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2 ------BEGIN CERTIFICATE----- -MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw -CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu -ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg -RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu -Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq -hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf -Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q -RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD -AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY -JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv -6pZjamVFkpUBtA== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root G2" -# Serial: 4293743540046975378534879503202253541 -# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44 -# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4 -# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f ------BEGIN CERTIFICATE----- -MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH -MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI -2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx -1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ -q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz -tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ -vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP -BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV -5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY -1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 -NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG -Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 -8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe -pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl -MrY= ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root G3" -# Serial: 7089244469030293291760083333884364146 -# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca -# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e -# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0 ------BEGIN CERTIFICATE----- -MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw -CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu -ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe -Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw -EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x -IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF -K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG -fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO -Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd -BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx -AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ -oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 -sycX ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Trusted Root G4" -# Serial: 7451500558977370777930084869016614236 -# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49 -# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4 -# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88 ------BEGIN CERTIFICATE----- -MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg -RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu -Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y -ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If -xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV -ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO -DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ -jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/ -CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi -EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM -fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY -uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK -chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t -9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD -ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2 -SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd -+SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc -fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa -sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N -cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N -0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie -4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI -r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1 -/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm -gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+ ------END CERTIFICATE----- - -# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited -# Label: "COMODO RSA Certification Authority" -# Serial: 101909084537582093308941363524873193117 -# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18 -# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4 -# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34 ------BEGIN CERTIFICATE----- -MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB -hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV -BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 -MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT -EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR -Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR -6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X -pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC -9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV -/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf -Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z -+pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w -qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah -SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC -u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf -Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq -crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E -FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB -/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl -wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM -4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV -2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna -FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ -CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK -boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke -jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL -S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb -QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl -0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB -NVOFBkpdn627G190 ------END CERTIFICATE----- - -# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network -# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network -# Label: "USERTrust RSA Certification Authority" -# Serial: 2645093764781058787591871645665788717 -# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5 -# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e -# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2 ------BEGIN CERTIFICATE----- -MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB -iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl -cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV -BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw -MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV -BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU -aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy -dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B -3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY -tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ -Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 -VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT -79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 -c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT -Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l -c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee -UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE -Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd -BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G -A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF -Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO -VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 -ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs -8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR -iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze -Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ -XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ -qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB -VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB -L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG -jjxDah2nGN59PRbxYvnKkKj9 ------END CERTIFICATE----- - -# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network -# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network -# Label: "USERTrust ECC Certification Authority" -# Serial: 123013823720199481456569720443997572134 -# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1 -# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0 -# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a ------BEGIN CERTIFICATE----- -MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL -MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl -eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT -JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx -MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT -Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg -VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo -I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng -o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G -A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB -zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW -RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 -# Label: "GlobalSign ECC Root CA - R4" -# Serial: 14367148294922964480859022125800977897474 -# MD5 Fingerprint: 20:f0:27:68:d1:7e:a0:9d:0e:e6:2a:ca:df:5c:89:8e -# SHA1 Fingerprint: 69:69:56:2e:40:80:f4:24:a1:e7:19:9f:14:ba:f3:ee:58:ab:6a:bb -# SHA256 Fingerprint: be:c9:49:11:c2:95:56:76:db:6c:0a:55:09:86:d7:6e:3b:a0:05:66:7c:44:2c:97:62:b4:fb:b7:73:de:22:8c ------BEGIN CERTIFICATE----- -MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEk -MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpH -bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX -DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD -QSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu -MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJ -FspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAw -DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61F -uOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX -kPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTs -ewv4n4Q= ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 -# Label: "GlobalSign ECC Root CA - R5" -# Serial: 32785792099990507226680698011560947931244 -# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08 -# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa -# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24 ------BEGIN CERTIFICATE----- -MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk -MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH -bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX -DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD -QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu -MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc -8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke -hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI -KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg -515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO -xwy8p2Fp8fc74SrL+SvzZpA3 ------END CERTIFICATE----- - -# Issuer: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden -# Subject: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden -# Label: "Staat der Nederlanden Root CA - G3" -# Serial: 10003001 -# MD5 Fingerprint: 0b:46:67:07:db:10:2f:19:8c:35:50:60:d1:0b:f4:37 -# SHA1 Fingerprint: d8:eb:6b:41:51:92:59:e0:f3:e7:85:00:c0:3d:b6:88:97:c9:ee:fc -# SHA256 Fingerprint: 3c:4f:b0:b9:5a:b8:b3:00:32:f4:32:b8:6f:53:5f:e1:72:c1:85:d0:fd:39:86:58:37:cf:36:18:7f:a6:f4:28 ------BEGIN CERTIFICATE----- -MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloX -DTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl -ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv -b3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4yolQP -cPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WW -IkYFsO2tx1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqX -xz8ecAgwoNzFs21v0IJyEavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFy -KJLZWyNtZrVtB0LrpjPOktvA9mxjeM3KTj215VKb8b475lRgsGYeCasH/lSJEULR -9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUurmkVLoR9BvUhTFXFkC4az -5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU51nus6+N8 -6U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7 -Ngzp07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHP -bMk7ccHViLVlvMDoFxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXt -BznaqB16nzaeErAMZRKQFWDZJkBE41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTt -XUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMBAAGjQjBAMA8GA1UdEwEB/wQF -MAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleuyjWcLhL75Lpd -INyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD -U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwp -LiniyMMB8jPqKqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8 -Ipf3YF3qKS9Ysr1YvY2WTxB1v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixp -gZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA8KCWAg8zxXHzniN9lLf9OtMJgwYh -/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b8KKaa8MFSu1BYBQw -0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0rmj1A -fsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq -4BZ+Extq1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR -1VmiiXTTn74eS9fGbbeIJG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/ -QFH1T/U67cjF68IeHRaVesd+QnGTbksVtzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM -94B7IWcnMFk= ------END CERTIFICATE----- - -# Issuer: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden -# Subject: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden -# Label: "Staat der Nederlanden EV Root CA" -# Serial: 10000013 -# MD5 Fingerprint: fc:06:af:7b:e8:1a:f1:9a:b4:e8:d2:70:1f:c0:f5:ba -# SHA1 Fingerprint: 76:e2:7e:c1:4f:db:82:c1:c0:a6:75:b5:05:be:3d:29:b4:ed:db:bb -# SHA256 Fingerprint: 4d:24:91:41:4c:fe:95:67:46:ec:4c:ef:a6:cf:6f:72:e2:8a:13:29:43:2f:9d:8a:90:7a:c4:cb:5d:ad:c1:5a ------BEGIN CERTIFICATE----- -MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0y -MjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg -TmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBS -b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrS -M4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nC -UiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3d -Z//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46p -rfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13l -pJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXb -j5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxC -KFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS -/ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0X -cgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH -1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrP -px9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7 -MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI -eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u -2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHS -v4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTC -wPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKy -CqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2e -vTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6 -Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIa -Gl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeL -eG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8 -FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc -7uzXLg== ------END CERTIFICATE----- - -# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust -# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust -# Label: "IdenTrust Commercial Root CA 1" -# Serial: 13298821034946342390520003877796839426 -# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7 -# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25 -# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK -MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu -VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw -MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw -JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT -3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU -+ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp -S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1 -bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi -T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL -vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK -Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK -dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT -c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv -l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N -iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD -ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH -6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt -LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93 -nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3 -+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK -W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT -AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq -l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG -4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ -mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A -7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H ------END CERTIFICATE----- - -# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust -# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust -# Label: "IdenTrust Public Sector Root CA 1" -# Serial: 13298821034946342390521976156843933698 -# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba -# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd -# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f ------BEGIN CERTIFICATE----- -MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN -MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu -VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN -MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0 -MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7 -ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy -RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS -bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF -/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R -3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw -EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy -9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V -GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ -2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV -WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD -W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN -AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj -t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV -DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9 -TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G -lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW -mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df -WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5 -+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ -tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA -GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv -8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only -# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only -# Label: "Entrust Root Certification Authority - G2" -# Serial: 1246989352 -# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2 -# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4 -# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39 ------BEGIN CERTIFICATE----- -MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50 -cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs -IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz -dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy -NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu -dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt -dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0 -aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK -AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T -RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN -cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW -wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1 -U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0 -jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN -BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/ -jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ -Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v -1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R -nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH -VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g== ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only -# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only -# Label: "Entrust Root Certification Authority - EC1" -# Serial: 51543124481930649114116133369 -# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc -# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47 -# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5 ------BEGIN CERTIFICATE----- -MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG -A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3 -d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu -dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq -RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy -MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD -VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 -L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g -Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi -A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt -ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH -Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O -BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC -R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX -hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G ------END CERTIFICATE----- - -# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority -# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority -# Label: "CFCA EV ROOT" -# Serial: 407555286 -# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30 -# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83 -# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd ------BEGIN CERTIFICATE----- -MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD -TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y -aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx -MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j -aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP -T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03 -sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL -TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5 -/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp -7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz -EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt -hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP -a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot -aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg -TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV -PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv -cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL -tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd -BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB -ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT -ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL -jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS -ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy -P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19 -xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d -Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN -5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe -/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z -AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ -5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su ------END CERTIFICATE----- - -# Issuer: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 -# Subject: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 -# Label: "Certinomis - Root CA" -# Serial: 1 -# MD5 Fingerprint: 14:0a:fd:8d:a8:28:b5:38:69:db:56:7e:61:22:03:3f -# SHA1 Fingerprint: 9d:70:bb:01:a5:a4:a0:18:11:2e:f7:1c:01:b9:32:c5:34:e7:88:a8 -# SHA256 Fingerprint: 2a:99:f5:bc:11:74:b7:3c:bb:1d:62:08:84:e0:1c:34:e5:1c:cb:39:78:da:12:5f:0e:33:26:88:83:bf:41:58 ------BEGIN CERTIFICATE----- -MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjET -MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAb -BgNVBAMTFENlcnRpbm9taXMgLSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMz -MTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMx -FzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRDZXJ0aW5vbWlzIC0g -Um9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQosP5L2 -fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJfl -LieY6pOod5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQV -WZUKxkd8aRi5pwP5ynapz8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDF -TKWrteoB4owuZH9kb/2jJZOLyKIOSY008B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb -5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09xRLWtwHkziOC/7aOgFLSc -CbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE6OXWk6Ri -wsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJ -wx3tFvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SG -m/lg0h9tkQPTYKbVPZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4 -F2iw4lNVYC2vPsKD2NkJK/DAZNuHi5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZng -WVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I6tNxIqSSaHh0 -2TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF -AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/ -0KGRHCwPT5iVWVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWw -F6YSjNRieOpWauwK0kDDPAUwPk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZS -g081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAXlCOotQqSD7J6wWAsOMwaplv/8gzj -qh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJy29SWwNyhlCVCNSN -h4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9Iff/ -ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8V -btaw5BngDwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwj -Y/M50n92Uaf0yKHxDHYiI0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ -8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nMcyrDflOR1m749fPH0FFNjkulW+YZFzvW -gQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVrhkIGuUE= ------END CERTIFICATE----- - -# Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed -# Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed -# Label: "OISTE WISeKey Global Root GB CA" -# Serial: 157768595616588414422159278966750757568 -# MD5 Fingerprint: a4:eb:b9:61:28:2e:b7:2f:98:b0:35:26:90:99:51:1d -# SHA1 Fingerprint: 0f:f9:40:76:18:d3:d7:6a:4b:98:f0:a8:35:9e:0c:fd:27:ac:cc:ed -# SHA256 Fingerprint: 6b:9c:08:e8:6e:b0:f7:67:cf:ad:65:cd:98:b6:21:49:e5:49:4a:67:f5:84:5e:7b:d1:ed:01:9f:27:b8:6b:d6 ------BEGIN CERTIFICATE----- -MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt -MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg -Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i -YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x -CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG -b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh -bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3 -HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx -WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX -1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk -u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P -99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r -M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB -BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh -cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5 -gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO -ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf -aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic -Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= ------END CERTIFICATE----- - -# Issuer: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. -# Subject: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. -# Label: "SZAFIR ROOT CA2" -# Serial: 357043034767186914217277344587386743377558296292 -# MD5 Fingerprint: 11:64:c1:89:b0:24:b1:8c:b1:07:7e:89:9e:51:9e:99 -# SHA1 Fingerprint: e2:52:fa:95:3f:ed:db:24:60:bd:6e:28:f3:9c:cc:cf:5e:b3:3f:de -# SHA256 Fingerprint: a1:33:9d:33:28:1a:0b:56:e5:57:d3:d3:2b:1c:e7:f9:36:7e:b0:94:bd:5f:a7:2a:7e:50:04:c8:de:d7:ca:fe ------BEGIN CERTIFICATE----- -MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL -BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6 -ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw -NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L -cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg -Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN -QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT -3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw -3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6 -3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5 -BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN -XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD -AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF -AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw -8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG -nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP -oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy -d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg -LvWpCz/UXeHPhJ/iGcJfitYgHuNztw== ------END CERTIFICATE----- - -# Issuer: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Subject: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Label: "Certum Trusted Network CA 2" -# Serial: 44979900017204383099463764357512596969 -# MD5 Fingerprint: 6d:46:9e:d9:25:6d:08:23:5b:5e:74:7d:1e:27:db:f2 -# SHA1 Fingerprint: d3:dd:48:3e:2b:bf:4c:05:e8:af:10:f5:fa:76:26:cf:d3:dc:30:92 -# SHA256 Fingerprint: b6:76:f2:ed:da:e8:77:5c:d3:6c:b0:f6:3c:d1:d4:60:39:61:f4:9e:62:65:ba:01:3a:2f:03:07:b6:d0:b8:04 ------BEGIN CERTIFICATE----- -MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB -gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu -QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG -A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz -OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ -VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3 -b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA -DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn -0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB -OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE -fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E -Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m -o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i -sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW -OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez -Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS -adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n -3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC -AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ -F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf -CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29 -XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm -djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/ -WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb -AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq -P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko -b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj -XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P -5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi -DrW5viSP ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions RootCA 2015" -# Serial: 0 -# MD5 Fingerprint: ca:ff:e2:db:03:d9:cb:4b:e9:0f:ad:84:fd:7b:18:ce -# SHA1 Fingerprint: 01:0c:06:95:a6:98:19:14:ff:bf:5f:c6:b0:b6:95:ea:29:e9:12:a6 -# SHA256 Fingerprint: a0:40:92:9a:02:ce:53:b4:ac:f4:f2:ff:c6:98:1c:e4:49:6f:75:5e:6d:45:fe:0b:2a:69:2b:cd:52:52:3f:36 ------BEGIN CERTIFICATE----- -MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix -DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k -IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT -N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v -dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG -A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh -ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx -QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 -dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA -4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0 -AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10 -4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C -ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV -9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD -gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6 -Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq -NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko -LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc -Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd -ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I -XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI -M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot -9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V -Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea -j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh -X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ -l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf -bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4 -pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK -e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0 -vm9qp/UsQu0yrbYhnr68 ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions ECC RootCA 2015" -# Serial: 0 -# MD5 Fingerprint: 81:e5:b4:17:eb:c2:f5:e1:4b:0d:41:7b:49:92:fe:ef -# SHA1 Fingerprint: 9f:f1:71:8d:92:d5:9a:f3:7d:74:97:b4:bc:6f:84:68:0b:ba:b6:66 -# SHA256 Fingerprint: 44:b5:45:aa:8a:25:e6:5a:73:ca:15:dc:27:fc:36:d2:4c:1c:b9:95:3a:06:65:39:b1:15:82:dc:48:7b:48:33 ------BEGIN CERTIFICATE----- -MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN -BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl -c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl -bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv -b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ -BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj -YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5 -MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0 -dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg -QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa -jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi -C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep -lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof -TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR ------END CERTIFICATE----- - -# Issuer: CN=ISRG Root X1 O=Internet Security Research Group -# Subject: CN=ISRG Root X1 O=Internet Security Research Group -# Label: "ISRG Root X1" -# Serial: 172886928669790476064670243504169061120 -# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e -# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8 -# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6 ------BEGIN CERTIFICATE----- -MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw -TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh -cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 -WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu -ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY -MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc -h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ -0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U -A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW -T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH -B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC -B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv -KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn -OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn -jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw -qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI -rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq -hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL -ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ -3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK -NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 -ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur -TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC -jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc -oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq -4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA -mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d -emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= ------END CERTIFICATE----- - -# Issuer: O=FNMT-RCM OU=AC RAIZ FNMT-RCM -# Subject: O=FNMT-RCM OU=AC RAIZ FNMT-RCM -# Label: "AC RAIZ FNMT-RCM" -# Serial: 485876308206448804701554682760554759 -# MD5 Fingerprint: e2:09:04:b4:d3:bd:d1:a0:14:fd:1a:d2:47:c4:57:1d -# SHA1 Fingerprint: ec:50:35:07:b2:15:c4:95:62:19:e2:a8:9a:5b:42:99:2c:4c:2c:20 -# SHA256 Fingerprint: eb:c5:57:0c:29:01:8c:4d:67:b1:aa:12:7b:af:12:f7:03:b4:61:1e:bc:17:b7:da:b5:57:38:94:17:9b:93:fa ------BEGIN CERTIFICATE----- -MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx -CzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ -WiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ -BgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG -Tk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/ -yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf -BBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz -WHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF -tBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z -374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC -IfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL -mbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7 -wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS -MKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2 -ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet -UqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw -AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H -YJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3 -LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD -nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1 -RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM -LVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf -77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N -JpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm -fZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp -6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp -1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B -9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok -RqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv -uu8wd+RU4riEmViAqhOLUTpPSPaLtrM= ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 1 O=Amazon -# Subject: CN=Amazon Root CA 1 O=Amazon -# Label: "Amazon Root CA 1" -# Serial: 143266978916655856878034712317230054538369994 -# MD5 Fingerprint: 43:c6:bf:ae:ec:fe:ad:2f:18:c6:88:68:30:fc:c8:e6 -# SHA1 Fingerprint: 8d:a7:f9:65:ec:5e:fc:37:91:0f:1c:6e:59:fd:c1:cc:6a:6e:de:16 -# SHA256 Fingerprint: 8e:cd:e6:88:4f:3d:87:b1:12:5b:a3:1a:c3:fc:b1:3d:70:16:de:7f:57:cc:90:4f:e1:cb:97:c6:ae:98:19:6e ------BEGIN CERTIFICATE----- -MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF -ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 -b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv -b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj -ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM -9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw -IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6 -VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L -93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm -jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA -A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI -U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs -N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv -o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU -5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy -rqXRfboQnoZsG4q5WTP468SQvvG5 ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 2 O=Amazon -# Subject: CN=Amazon Root CA 2 O=Amazon -# Label: "Amazon Root CA 2" -# Serial: 143266982885963551818349160658925006970653239 -# MD5 Fingerprint: c8:e5:8d:ce:a8:42:e2:7a:c0:2a:5c:7c:9e:26:bf:66 -# SHA1 Fingerprint: 5a:8c:ef:45:d7:a6:98:59:76:7a:8c:8b:44:96:b5:78:cf:47:4b:1a -# SHA256 Fingerprint: 1b:a5:b2:aa:8c:65:40:1a:82:96:01:18:f8:0b:ec:4f:62:30:4d:83:ce:c4:71:3a:19:c3:9c:01:1e:a4:6d:b4 ------BEGIN CERTIFICATE----- -MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF -ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 -b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv -b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK -gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ -W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg -1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K -8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r -2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me -z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR -8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj -mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz -7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6 -+XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI -0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB -Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm -UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2 -LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY -+gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS -k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl -7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm -btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl -urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+ -fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63 -n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE -76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H -9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT -4PsJYGw= ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 3 O=Amazon -# Subject: CN=Amazon Root CA 3 O=Amazon -# Label: "Amazon Root CA 3" -# Serial: 143266986699090766294700635381230934788665930 -# MD5 Fingerprint: a0:d4:ef:0b:f7:b5:d8:49:95:2a:ec:f5:c4:fc:81:87 -# SHA1 Fingerprint: 0d:44:dd:8c:3c:8c:1a:1a:58:75:64:81:e9:0f:2e:2a:ff:b3:d2:6e -# SHA256 Fingerprint: 18:ce:6c:fe:7b:f1:4e:60:b2:e3:47:b8:df:e8:68:cb:31:d0:2e:bb:3a:da:27:15:69:f5:03:43:b4:6d:b3:a4 ------BEGIN CERTIFICATE----- -MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5 -MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g -Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG -A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg -Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl -ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr -ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr -BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM -YyRIHN8wfdVoOw== ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 4 O=Amazon -# Subject: CN=Amazon Root CA 4 O=Amazon -# Label: "Amazon Root CA 4" -# Serial: 143266989758080763974105200630763877849284878 -# MD5 Fingerprint: 89:bc:27:d5:eb:17:8d:06:6a:69:d5:fd:89:47:b4:cd -# SHA1 Fingerprint: f6:10:84:07:d6:f8:bb:67:98:0c:c2:e2:44:c2:eb:ae:1c:ef:63:be -# SHA256 Fingerprint: e3:5d:28:41:9e:d0:20:25:cf:a6:90:38:cd:62:39:62:45:8d:a5:c6:95:fb:de:a3:c2:2b:0b:fb:25:89:70:92 ------BEGIN CERTIFICATE----- -MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5 -MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g -Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG -A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg -Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi -9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk -M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB -MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw -CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW -1KyLa2tJElMzrdfkviT8tQp21KW8EA== ------END CERTIFICATE----- - -# Issuer: CN=LuxTrust Global Root 2 O=LuxTrust S.A. -# Subject: CN=LuxTrust Global Root 2 O=LuxTrust S.A. -# Label: "LuxTrust Global Root 2" -# Serial: 59914338225734147123941058376788110305822489521 -# MD5 Fingerprint: b2:e1:09:00:61:af:f7:f1:91:6f:c4:ad:8d:5e:3b:7c -# SHA1 Fingerprint: 1e:0e:56:19:0a:d1:8b:25:98:b2:04:44:ff:66:8a:04:17:99:5f:3f -# SHA256 Fingerprint: 54:45:5f:71:29:c2:0b:14:47:c4:18:f9:97:16:8f:24:c5:8f:c5:02:3b:f5:da:5b:e2:eb:6e:1d:d8:90:2e:d5 ------BEGIN CERTIFICATE----- -MIIFwzCCA6ugAwIBAgIUCn6m30tEntpqJIWe5rgV0xZ/u7EwDQYJKoZIhvcNAQEL -BQAwRjELMAkGA1UEBhMCTFUxFjAUBgNVBAoMDUx1eFRydXN0IFMuQS4xHzAdBgNV -BAMMFkx1eFRydXN0IEdsb2JhbCBSb290IDIwHhcNMTUwMzA1MTMyMTU3WhcNMzUw -MzA1MTMyMTU3WjBGMQswCQYDVQQGEwJMVTEWMBQGA1UECgwNTHV4VHJ1c3QgUy5B -LjEfMB0GA1UEAwwWTHV4VHJ1c3QgR2xvYmFsIFJvb3QgMjCCAiIwDQYJKoZIhvcN -AQEBBQADggIPADCCAgoCggIBANeFl78RmOnwYoNMPIf5U2o3C/IPPIfOb9wmKb3F -ibrJgz337spbxm1Jc7TJRqMbNBM/wYlFV/TZsfs2ZUv7COJIcRHIbjuend+JZTem -hfY7RBi2xjcwYkSSl2l9QjAk5A0MiWtj3sXh306pFGxT4GHO9hcvHTy95iJMHZP1 -EMShduxq3sVs35a0VkBCwGKSMKEtFZSg0iAGCW5qbeXrt77U8PEVfIvmTroTzEsn -Xpk8F12PgX8zPU/TPxvsXD/wPEx1bvKm1Z3aLQdjAsZy6ZS8TEmVT4hSyNvoaYL4 -zDRbIvCGp4m9SAptZoFtyMhk+wHh9OHe2Z7d21vUKpkmFRseTJIpgp7VkoGSQXAZ -96Tlk0u8d2cx3Rz9MXANF5kM+Qw5GSoXtTBxVdUPrljhPS80m8+f9niFwpN6cj5m -j5wWEWCPnolvZ77gR1o7DJpni89Gxq44o/KnvObWhWszJHAiS8sIm7vI+AIpHb4g -DEa/a4ebsypmQjVGbKq6rfmYe+lQVRQxv7HaLe2ArWgk+2mr2HETMOZns4dA/Yl+ -8kPREd8vZS9kzl8UubG/Mb2HeFpZZYiq/FkySIbWTLkpS5XTdvN3JW1CHDiDTf2j -X5t/Lax5Gw5CMZdjpPuKadUiDTSQMC6otOBttpSsvItO13D8xTiOZCXhTTmQzsmH -hFhxAgMBAAGjgagwgaUwDwYDVR0TAQH/BAUwAwEB/zBCBgNVHSAEOzA5MDcGByuB -KwEBAQowLDAqBggrBgEFBQcCARYeaHR0cHM6Ly9yZXBvc2l0b3J5Lmx1eHRydXN0 -Lmx1MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBT/GCh2+UgFLKGu8SsbK7JT -+Et8szAdBgNVHQ4EFgQU/xgodvlIBSyhrvErGyuyU/hLfLMwDQYJKoZIhvcNAQEL -BQADggIBAGoZFO1uecEsh9QNcH7X9njJCwROxLHOk3D+sFTAMs2ZMGQXvw/l4jP9 -BzZAcg4atmpZ1gDlaCDdLnINH2pkMSCEfUmmWjfrRcmF9dTHF5kH5ptV5AzoqbTO -jFu1EVzPig4N1qx3gf4ynCSecs5U89BvolbW7MM3LGVYvlcAGvI1+ut7MV3CwRI9 -loGIlonBWVx65n9wNOeD4rHh4bhY79SV5GCc8JaXcozrhAIuZY+kt9J/Z93I055c -qqmkoCUUBpvsT34tC38ddfEz2O3OuHVtPlu5mB0xDVbYQw8wkbIEa91WvpWAVWe+ -2M2D2RjuLg+GLZKecBPs3lHJQ3gCpU3I+V/EkVhGFndadKpAvAefMLmx9xIX3eP/ -JEAdemrRTxgKqpAd60Ae36EeRJIQmvKN4dFLRp7oRUKX6kWZ8+xm1QL68qZKJKre -zrnK+T+Tb/mjuuqlPpmt/f97mfVl7vBZKGfXkJWkE4SphMHozs51k2MavDzq1WQf -LSoSOcbDWjLtR5EWDrw4wVDej8oqkDQc7kGUnF4ZLvhFSZl0kbAEb+MEWrGrKqv+ -x9CWttrhSmQGbmBNvUJO/3jaJMobtNeWOWyu8Q6qp31IiyBMz2TWuJdGsE7RKlY6 -oJO9r4Ak4Ap+58rVyuiFVdw2KuGUaJPHZnJED4AhMmwlxyOAgwrr ------END CERTIFICATE----- - -# Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM -# Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM -# Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1" -# Serial: 1 -# MD5 Fingerprint: dc:00:81:dc:69:2f:3e:2f:b0:3b:f6:3d:5a:91:8e:49 -# SHA1 Fingerprint: 31:43:64:9b:ec:ce:27:ec:ed:3a:3f:0b:8f:0d:e4:e8:91:dd:ee:ca -# SHA256 Fingerprint: 46:ed:c3:68:90:46:d5:3a:45:3f:b3:10:4a:b8:0d:ca:ec:65:8b:26:60:ea:16:29:dd:7e:86:79:90:64:87:16 ------BEGIN CERTIFICATE----- -MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx -GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp -bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w -KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0 -BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy -dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG -EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll -IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU -QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT -TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg -LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7 -a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr -LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr -N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X -YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/ -iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f -AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH -V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL -BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh -AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf -IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4 -lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c -8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf -lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= ------END CERTIFICATE----- - -# Issuer: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. -# Subject: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. -# Label: "GDCA TrustAUTH R5 ROOT" -# Serial: 9009899650740120186 -# MD5 Fingerprint: 63:cc:d9:3d:34:35:5c:6f:53:a3:e2:08:70:48:1f:b4 -# SHA1 Fingerprint: 0f:36:38:5b:81:1a:25:c3:9b:31:4e:83:ca:e9:34:66:70:cc:74:b4 -# SHA256 Fingerprint: bf:ff:8f:d0:44:33:48:7d:6a:8a:a6:0c:1a:29:76:7a:9f:c2:bb:b0:5e:42:0f:71:3a:13:b9:92:89:1d:38:93 ------BEGIN CERTIFICATE----- -MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE -BhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ -IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0 -MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNV -BAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8w -HQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJj -Dp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBj -TnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+u -KU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEj -qcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpm -MUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12 -ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloP -zgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3Gk -L30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeC -jGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoA -HQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkC -AwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg -p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZm -DRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5 -COmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ry -L3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPf -JWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svg -IHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io -2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV -09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQ -XR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrq -T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe -MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== ------END CERTIFICATE----- - -# Issuer: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Subject: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Label: "TrustCor RootCert CA-1" -# Serial: 15752444095811006489 -# MD5 Fingerprint: 6e:85:f1:dc:1a:00:d3:22:d5:b2:b2:ac:6b:37:05:45 -# SHA1 Fingerprint: ff:bd:cd:e7:82:c8:43:5e:3c:6f:26:86:5c:ca:a8:3a:45:5b:c3:0a -# SHA256 Fingerprint: d4:0e:9c:86:cd:8f:e4:68:c1:77:69:59:f4:9e:a7:74:fa:54:86:84:b6:c4:06:f3:90:92:61:f4:dc:e2:57:5c ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYD -VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk -MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U -cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29y -IFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkxMjMxMTcyMzE2WjCB -pDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFuYW1h -IENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUG -A1UECwweVHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZU -cnVzdENvciBSb290Q2VydCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEAv463leLCJhJrMxnHQFgKq1mqjQCj/IDHUHuO1CAmujIS2CNUSSUQIpid -RtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4pQa81QBeCQryJ3pS/C3V -seq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0JEsq1pme -9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CV -EY4hgLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorW -hnAbJN7+KIor0Gqw/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/ -DeOxCbeKyKsZn3MzUOcwHwYDVR0jBBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcw -DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD -ggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5mDo4Nvu7Zp5I -/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf -ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZ -yonnMlo2HD6CqFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djts -L1Ac59v2Z3kf9YKVmgenFK+P3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdN -zl/HHk484IkzlQsPpTLWPFp5LBk= ------END CERTIFICATE----- - -# Issuer: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Subject: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Label: "TrustCor RootCert CA-2" -# Serial: 2711694510199101698 -# MD5 Fingerprint: a2:e1:f8:18:0b:ba:45:d5:c7:41:2a:bb:37:52:45:64 -# SHA1 Fingerprint: b8:be:6d:cb:56:f1:55:b9:63:d4:12:ca:4e:06:34:c7:94:b2:1c:c0 -# SHA256 Fingerprint: 07:53:e9:40:37:8c:1b:d5:e3:83:6e:39:5d:ae:a5:cb:83:9e:50:46:f1:bd:0e:ae:19:51:cf:10:fe:c7:c9:65 ------BEGIN CERTIFICATE----- -MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNV -BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw -IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy -dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEfMB0GA1UEAwwWVHJ1c3RDb3Ig -Um9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEyMzExNzI2MzlaMIGk -MQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEg -Q2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYD -VQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRy -dXN0Q29yIFJvb3RDZXJ0IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQCnIG7CKqJiJJWQdsg4foDSq8GbZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+ -QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9NkRvRUqdw6VC0xK5mC8tkq -1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1oYxOdqHp -2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nK -DOObXUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hape -az6LMvYHL1cEksr1/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF -3wP+TfSvPd9cW436cOGlfifHhi5qjxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88 -oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQPeSghYA2FFn3XVDjxklb9tTNM -g9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+CtgrKAmrhQhJ8Z3 -mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh -8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAd -BgNVHQ4EFgQU2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6U -nrybPZx9mCAZ5YwwYrIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYw -DQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/hOsh80QA9z+LqBrWyOrsGS2h60COX -dKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnpkpfbsEZC89NiqpX+ -MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv2wnL -/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RX -CI/hOWB3S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYa -ZH9bDTMJBzN7Bj8RpFxwPIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW -2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dvDDqPys/cA8GiCcjl/YBeyGBCARsaU1q7 -N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYURpFHmygk71dSTlxCnKr3 -Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANExdqtvArB -As8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp -5KeXRKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu -1uwJ ------END CERTIFICATE----- - -# Issuer: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Subject: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Label: "TrustCor ECA-1" -# Serial: 9548242946988625984 -# MD5 Fingerprint: 27:92:23:1d:0a:f5:40:7c:e9:e6:6b:9d:d8:f5:e7:6c -# SHA1 Fingerprint: 58:d1:df:95:95:67:6b:63:c0:f0:5b:1c:17:4d:8b:84:0b:c8:78:bd -# SHA256 Fingerprint: 5a:88:5d:b1:9c:01:d9:12:c5:75:93:88:93:8c:af:bb:df:03:1a:b2:d4:8e:91:ee:15:58:9b:42:97:1d:03:9c ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYD -VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk -MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U -cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxFzAVBgNVBAMMDlRydXN0Q29y -IEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3MjgwN1owgZwxCzAJBgNV -BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw -IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy -dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3Ig -RUNBLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb -3w9U73NjKYKtR8aja+3+XzP4Q1HpGjORMRegdMTUpwHmspI+ap3tDvl0mEDTPwOA -BoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23xFUfJ3zSCNV2HykVh0A5 -3ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmcp0yJF4Ou -owReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/ -wZ0+fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZF -ZtS6mFjBAgMBAAGjYzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAf -BgNVHSMEGDAWgBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/ -MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEABT41XBVwm8nHc2Fv -civUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u/ukZMjgDfxT2 -AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F -hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50 -soIipX1TH0XsJ5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BI -WJZpTdwHjFGTot+fDz2LYLSCjaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1Wi -tJ/X5g== ------END CERTIFICATE----- - -# Issuer: CN=SSL.com Root Certification Authority RSA O=SSL Corporation -# Subject: CN=SSL.com Root Certification Authority RSA O=SSL Corporation -# Label: "SSL.com Root Certification Authority RSA" -# Serial: 8875640296558310041 -# MD5 Fingerprint: 86:69:12:c0:70:f1:ec:ac:ac:c2:d5:bc:a5:5b:a1:29 -# SHA1 Fingerprint: b7:ab:33:08:d1:ea:44:77:ba:14:80:12:5a:6f:bd:a9:36:49:0c:bb -# SHA256 Fingerprint: 85:66:6a:56:2e:e0:be:5c:e9:25:c1:d8:89:0a:6f:76:a8:7e:c1:6d:4d:7d:5f:29:ea:74:19:cf:20:12:3b:69 ------BEGIN CERTIFICATE----- -MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UE -BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK -DA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYwMjEyMTczOTM5WhcNNDEwMjEyMTcz -OTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv -dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv -bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcN -AQEBBQADggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2R -xFdHaxh3a3by/ZPkPQ/CFp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aX -qhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcC -C52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/geoeOy3ZExqysdBP+lSgQ3 -6YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkpk8zruFvh -/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrF -YD3ZfBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93E -JNyAKoFBbZQ+yODJgUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVc -US4cK38acijnALXRdMbX5J+tB5O2UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8 -ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi81xtZPCvM8hnIk2snYxnP/Okm -+Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4sbE6x/c+cCbqi -M+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV -HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4G -A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGV -cpNxJK1ok1iOMq8bs3AD/CUrdIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBc -Hadm47GUBwwyOabqG7B52B2ccETjit3E+ZUfijhDPwGFpUenPUayvOUiaPd7nNgs -PgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAslu1OJD7OAUN5F7kR/ -q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjqerQ0 -cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jr -a6x+3uxjMxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90I -H37hVZkLId6Tngr75qNJvTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/Y -K9f1JmzJBjSWFupwWRoyeXkLtoh/D1JIPb9s2KJELtFOt3JY04kTlf5Eq/jXixtu -nLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406ywKBjYZC6VWg3dGq2ktuf -oYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NIWuuA8ShY -Ic2wBlX7Jz9TkHCpBB5XJ7k= ------END CERTIFICATE----- - -# Issuer: CN=SSL.com Root Certification Authority ECC O=SSL Corporation -# Subject: CN=SSL.com Root Certification Authority ECC O=SSL Corporation -# Label: "SSL.com Root Certification Authority ECC" -# Serial: 8495723813297216424 -# MD5 Fingerprint: 2e:da:e4:39:7f:9c:8f:37:d1:70:9f:26:17:51:3a:8e -# SHA1 Fingerprint: c3:19:7c:39:24:e6:54:af:1b:c4:ab:20:95:7a:e2:c3:0e:13:02:6a -# SHA256 Fingerprint: 34:17:bb:06:cc:60:07:da:1b:96:1c:92:0b:8a:b4:ce:3f:ad:82:0e:4a:a3:0b:9a:cb:c4:a7:4e:bd:ce:bc:65 ------BEGIN CERTIFICATE----- -MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMC -VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T -U0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0 -aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNDAzWhcNNDEwMjEyMTgxNDAz -WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0 -b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBS -b290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB -BAAiA2IABEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI -7Z4INcgn64mMU1jrYor+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPg -CemB+vNH06NjMGEwHQYDVR0OBBYEFILRhXMw5zUE044CkvvlpNHEIejNMA8GA1Ud -EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTTjgKS++Wk0cQh6M0wDgYD -VR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCWe+0F+S8T -kdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+ -gA0z5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl ------END CERTIFICATE----- - -# Issuer: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation -# Subject: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation -# Label: "SSL.com EV Root Certification Authority RSA R2" -# Serial: 6248227494352943350 -# MD5 Fingerprint: e1:1e:31:58:1a:ae:54:53:02:f6:17:6a:11:7b:4d:95 -# SHA1 Fingerprint: 74:3a:f0:52:9b:d0:32:a0:f4:4a:83:cd:d4:ba:a9:7b:7c:2e:c4:9a -# SHA256 Fingerprint: 2e:7b:f1:6c:c2:24:85:a7:bb:e2:aa:86:96:75:07:61:b0:ae:39:be:3b:2f:e9:d0:cc:6d:4e:f7:34:91:42:5c ------BEGIN CERTIFICATE----- -MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNV -BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UE -CgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2Vy -dGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMB4XDTE3MDUzMTE4MTQzN1oXDTQy -MDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4G -A1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQD -DC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvq -M0fNTPl9fb69LT3w23jhhqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssuf -OePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7wcXHswxzpY6IXFJ3vG2fThVUCAtZJycxa -4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTOZw+oz12WGQvE43LrrdF9 -HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+B6KjBSYR -aZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcA -b9ZhCBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQ -Gp8hLH94t2S42Oim9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQV -PWKchjgGAGYS5Fl2WlPAApiiECtoRHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMO -pgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+SlmJuwgUHfbSguPvuUCYHBBXtSu -UDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48+qvWBkofZ6aY -MBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV -HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa4 -9QaAJadz20ZpqJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBW -s47LCp1Jjr+kxJG7ZhcFUZh1++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5 -Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nxY/hoLVUE0fKNsKTPvDxeH3jnpaAg -cLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2GguDKBAdRUNf/ktUM -79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDzOFSz -/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXt -ll9ldDz7CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEm -Kf7GUmG6sXP/wwyc5WxqlD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKK -QbNmC1r7fSOl8hqw/96bg5Qu0T/fkreRrwU7ZcegbLHNYhLDkBvjJc40vG93drEQ -w/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1hlMYegouCRw2n5H9gooi -S9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX9hwJ1C07 -mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== ------END CERTIFICATE----- - -# Issuer: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation -# Subject: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation -# Label: "SSL.com EV Root Certification Authority ECC" -# Serial: 3182246526754555285 -# MD5 Fingerprint: 59:53:22:65:83:42:01:54:c0:ce:42:b9:5a:7c:f2:90 -# SHA1 Fingerprint: 4c:dd:51:a3:d1:f5:20:32:14:b0:c6:c5:32:23:03:91:c7:46:42:6d -# SHA256 Fingerprint: 22:a2:c1:f7:bd:ed:70:4c:c1:e7:01:b5:f4:08:c3:10:88:0f:e9:56:b5:de:2a:4a:44:f9:9c:87:3a:25:a7:c8 ------BEGIN CERTIFICATE----- -MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMC -VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T -U0wgQ29ycG9yYXRpb24xNDAyBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNTIzWhcNNDEwMjEyMTgx -NTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv -dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NMLmNv -bSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49 -AgEGBSuBBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMA -VIbc/R/fALhBYlzccBYy3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1Kthku -WnBaBu2+8KGwytAJKaNjMGEwHQYDVR0OBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZP -MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX -5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJN+vp1RPZ -ytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg -h5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 -# Label: "GlobalSign Root CA - R6" -# Serial: 1417766617973444989252670301619537 -# MD5 Fingerprint: 4f:dd:07:e4:d4:22:64:39:1e:0c:37:42:ea:d1:c6:ae -# SHA1 Fingerprint: 80:94:64:0e:b5:a7:a1:ca:11:9c:1f:dd:d5:9f:81:02:63:a7:fb:d1 -# SHA256 Fingerprint: 2c:ab:ea:fe:37:d0:6c:a2:2a:ba:73:91:c0:03:3d:25:98:29:52:c4:53:64:73:49:76:3a:3a:b5:ad:6c:cf:69 ------BEGIN CERTIFICATE----- -MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEg -MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2Jh -bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQx -MjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSNjET -MBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCAiIwDQYJ -KoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQssgrRI -xutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1k -ZguSgMpE3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxD -aNc9PIrFsmbVkJq3MQbFvuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJw -LnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqMPKq0pPbzlUoSB239jLKJz9CgYXfIWHSw -1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+azayOeSsJDa38O+2HBNX -k7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05OWgtH8wY2 -SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/h -bguyCLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4n -WUx2OVvq+aWh2IMP0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpY -rZxCRXluDocZXFSxZba/jJvcE+kNb7gu3GduyYsRtYQUigAZcIN5kZeR1Bonvzce -MgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNVHSMEGDAWgBSu -bAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN -nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGt -Ixg93eFyRJa0lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr61 -55wsTLxDKZmOMNOsIeDjHfrYBzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLj -vUYAGm0CuiVdjaExUd1URhxN25mW7xocBFymFe944Hn+Xds+qkxV/ZoVqW/hpvvf -cDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr3TsTjxKM4kEaSHpz -oHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB10jZp -nOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfs -pA9MRf/TuTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+v -JJUEeKgDu+6B5dpffItKoZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R -8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+tJDfLRVpOoERIyNiwmcUVhAn21klJwGW4 -5hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= ------END CERTIFICATE----- - -# Issuer: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed -# Subject: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed -# Label: "OISTE WISeKey Global Root GC CA" -# Serial: 44084345621038548146064804565436152554 -# MD5 Fingerprint: a9:d6:b9:2d:2f:93:64:f8:a5:69:ca:91:e9:68:07:23 -# SHA1 Fingerprint: e0:11:84:5e:34:de:be:88:81:b9:9c:f6:16:26:d1:96:1f:c3:b9:31 -# SHA256 Fingerprint: 85:60:f9:1c:36:24:da:ba:95:70:b5:fe:a0:db:e3:6f:f1:1a:83:23:be:94:86:85:4f:b3:f3:4a:55:71:19:8d ------BEGIN CERTIFICATE----- -MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQsw -CQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91 -bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwg -Um9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRaFw00MjA1MDkwOTU4MzNaMG0xCzAJ -BgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBGb3Vu -ZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2JhbCBS -b290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4ni -eUqjFqdrVCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4W -p2OQ0jnUsYd4XxiWD1AbNTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7T -rYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0EAwMDaAAwZQIwJsdpW9zV -57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtkAjEA2zQg -Mgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 ------END CERTIFICATE----- - -` - -var ErrParseFailed = errors.New("gocertifi: error when parsing certificates") - -// CACerts builds an X.509 certificate pool containing the Mozilla CA -// Certificate bundle. Returns nil on error along with an appropriate error -// code. -func CACerts() (*x509.CertPool, error) { - pool := x509.NewCertPool() - ok := pool.AppendCertsFromPEM([]byte(pemcerts)) - if !ok { - return nil, ErrParseFailed - } - return pool, nil -} diff --git a/vendor/github.com/cilium/ebpf/.clang-format b/vendor/github.com/cilium/ebpf/.clang-format new file mode 100644 index 000000000000..4eb94b1baa87 --- /dev/null +++ b/vendor/github.com/cilium/ebpf/.clang-format @@ -0,0 +1,17 @@ +--- +Language: Cpp +BasedOnStyle: LLVM +AlignAfterOpenBracket: DontAlign +AlignConsecutiveAssignments: true +AlignEscapedNewlines: DontAlign +AlwaysBreakBeforeMultilineStrings: true +AlwaysBreakTemplateDeclarations: false +AllowAllParametersOfDeclarationOnNextLine: false +AllowShortFunctionsOnASingleLine: false +BreakBeforeBraces: Attach +IndentWidth: 4 +KeepEmptyLinesAtTheStartOfBlocks: false +TabWidth: 4 +UseTab: ForContinuationAndIndentation +ColumnLimit: 1000 +... diff --git a/vendor/github.com/cilium/ebpf/.gitignore b/vendor/github.com/cilium/ebpf/.gitignore index f1c181ec9c5c..38b15653c0f9 100644 --- a/vendor/github.com/cilium/ebpf/.gitignore +++ b/vendor/github.com/cilium/ebpf/.gitignore @@ -4,6 +4,7 @@ *.dll *.so *.dylib +*.o # Test binary, build with `go test -c` *.test diff --git a/vendor/github.com/cilium/ebpf/abi.go b/vendor/github.com/cilium/ebpf/abi.go index d432eb46f420..f86a17ee7226 100644 --- a/vendor/github.com/cilium/ebpf/abi.go +++ b/vendor/github.com/cilium/ebpf/abi.go @@ -88,12 +88,6 @@ type ProgramABI struct { Type ProgramType } -func newProgramABIFromSpec(spec *ProgramSpec) *ProgramABI { - return &ProgramABI{ - spec.Type, - } -} - func newProgramABIFromFd(fd *internal.FD) (string, *ProgramABI, error) { info, err := bpfGetProgInfoByFD(fd) if err != nil { diff --git a/vendor/github.com/cilium/ebpf/asm/instruction.go b/vendor/github.com/cilium/ebpf/asm/instruction.go index 8fbcf56647c7..890dc008acf6 100644 --- a/vendor/github.com/cilium/ebpf/asm/instruction.go +++ b/vendor/github.com/cilium/ebpf/asm/instruction.go @@ -12,6 +12,14 @@ import ( // InstructionSize is the size of a BPF instruction in bytes const InstructionSize = 8 +// RawInstructionOffset is an offset in units of raw BPF instructions. +type RawInstructionOffset uint64 + +// Bytes returns the offset of an instruction in bytes. +func (rio RawInstructionOffset) Bytes() uint64 { + return uint64(rio) * InstructionSize +} + // Instruction is a single eBPF instruction. type Instruction struct { OpCode OpCode @@ -155,6 +163,13 @@ func (ins *Instruction) isLoadFromMap() bool { return ins.OpCode == LoadImmOp(DWord) && (ins.Src == PseudoMapFD || ins.Src == PseudoMapValue) } +// IsFunctionCall returns true if the instruction calls another BPF function. +// +// This is not the same thing as a BPF helper call. +func (ins *Instruction) IsFunctionCall() bool { + return ins.OpCode.JumpOp() == Call && ins.Src == PseudoCall +} + // Format implements fmt.Formatter. func (ins Instruction) Format(f fmt.State, c rune) { if c != 'v' { @@ -310,28 +325,6 @@ func (insns Instructions) ReferenceOffsets() map[string][]int { return offsets } -func (insns Instructions) marshalledOffsets() (map[string]int, error) { - symbols := make(map[string]int) - - marshalledPos := 0 - for _, ins := range insns { - currentPos := marshalledPos - marshalledPos += ins.OpCode.marshalledInstructions() - - if ins.Symbol == "" { - continue - } - - if _, ok := symbols[ins.Symbol]; ok { - return nil, fmt.Errorf("duplicate symbol %s", ins.Symbol) - } - - symbols[ins.Symbol] = currentPos - } - - return symbols, nil -} - // Format implements fmt.Formatter. // // You can control indentation of symbols by @@ -370,21 +363,17 @@ func (insns Instructions) Format(f fmt.State, c rune) { symIndent = strings.Repeat(" ", symPadding) } - // Figure out how many digits we need to represent the highest - // offset. - highestOffset := 0 - for _, ins := range insns { - highestOffset += ins.OpCode.marshalledInstructions() - } + // Guess how many digits we need at most, by assuming that all instructions + // are double wide. + highestOffset := len(insns) * 2 offsetWidth := int(math.Ceil(math.Log10(float64(highestOffset)))) - offset := 0 - for _, ins := range insns { - if ins.Symbol != "" { - fmt.Fprintf(f, "%s%s:\n", symIndent, ins.Symbol) + iter := insns.Iterate() + for iter.Next() { + if iter.Ins.Symbol != "" { + fmt.Fprintf(f, "%s%s:\n", symIndent, iter.Ins.Symbol) } - fmt.Fprintf(f, "%s%*d: %v\n", indent, offsetWidth, offset, ins) - offset += ins.OpCode.marshalledInstructions() + fmt.Fprintf(f, "%s%*d: %v\n", indent, offsetWidth, iter.Offset, iter.Ins) } return @@ -392,43 +381,49 @@ func (insns Instructions) Format(f fmt.State, c rune) { // Marshal encodes a BPF program into the kernel format. func (insns Instructions) Marshal(w io.Writer, bo binary.ByteOrder) error { - absoluteOffsets, err := insns.marshalledOffsets() - if err != nil { - return err - } - - num := 0 for i, ins := range insns { - switch { - case ins.OpCode.JumpOp() == Call && ins.Src == PseudoCall && ins.Constant == -1: - // Rewrite bpf to bpf call - offset, ok := absoluteOffsets[ins.Reference] - if !ok { - return fmt.Errorf("instruction %d: reference to missing symbol %s", i, ins.Reference) - } - - ins.Constant = int64(offset - num - 1) - - case ins.OpCode.Class() == JumpClass && ins.Offset == -1: - // Rewrite jump to label - offset, ok := absoluteOffsets[ins.Reference] - if !ok { - return fmt.Errorf("instruction %d: reference to missing symbol %s", i, ins.Reference) - } - - ins.Offset = int16(offset - num - 1) - } - - n, err := ins.Marshal(w, bo) + _, err := ins.Marshal(w, bo) if err != nil { return fmt.Errorf("instruction %d: %w", i, err) } - - num += int(n / InstructionSize) } return nil } +// Iterate allows iterating a BPF program while keeping track of +// various offsets. +// +// Modifying the instruction slice will lead to undefined behaviour. +func (insns Instructions) Iterate() *InstructionIterator { + return &InstructionIterator{insns: insns} +} + +// InstructionIterator iterates over a BPF program. +type InstructionIterator struct { + insns Instructions + // The instruction in question. + Ins *Instruction + // The index of the instruction in the original instruction slice. + Index int + // The offset of the instruction in raw BPF instructions. This accounts + // for double-wide instructions. + Offset RawInstructionOffset +} + +// Next returns true as long as there are any instructions remaining. +func (iter *InstructionIterator) Next() bool { + if len(iter.insns) == 0 { + return false + } + + if iter.Ins != nil { + iter.Offset += RawInstructionOffset(iter.Ins.OpCode.rawInstructions()) + } + iter.Ins = &iter.insns[0] + iter.insns = iter.insns[1:] + return true +} + type bpfInstruction struct { OpCode OpCode Registers bpfRegisters diff --git a/vendor/github.com/cilium/ebpf/asm/opcode.go b/vendor/github.com/cilium/ebpf/asm/opcode.go index c99b6595ac58..dc4564a98d20 100644 --- a/vendor/github.com/cilium/ebpf/asm/opcode.go +++ b/vendor/github.com/cilium/ebpf/asm/opcode.go @@ -66,10 +66,10 @@ type OpCode uint8 // InvalidOpCode is returned by setters on OpCode const InvalidOpCode OpCode = 0xff -// marshalledInstructions returns the number of BPF instructions required +// rawInstructions returns the number of BPF instructions required // to encode this opcode. -func (op OpCode) marshalledInstructions() int { - if op == LoadImmOp(DWord) { +func (op OpCode) rawInstructions() int { + if op.isDWordLoad() { return 2 } return 1 diff --git a/vendor/github.com/cilium/ebpf/collection.go b/vendor/github.com/cilium/ebpf/collection.go index 0c8b65d94de2..81ee2bd1a6bc 100644 --- a/vendor/github.com/cilium/ebpf/collection.go +++ b/vendor/github.com/cilium/ebpf/collection.go @@ -4,6 +4,8 @@ import ( "errors" "fmt" "math" + "reflect" + "strings" "github.com/cilium/ebpf/asm" "github.com/cilium/ebpf/internal" @@ -11,7 +13,10 @@ import ( ) // CollectionOptions control loading a collection into the kernel. +// +// Maps and Programs are passed to NewMapWithOptions and NewProgramsWithOptions. type CollectionOptions struct { + Maps MapOptions Programs ProgramOptions } @@ -126,6 +131,65 @@ func (cs *CollectionSpec) RewriteConstants(consts map[string]interface{}) error return nil } +// Assign the contents of a collection spec to a struct. +// +// This function is a short-cut to manually checking the presence +// of maps and programs in a collection spec. +// +// The argument to must be a pointer to a struct. A field of the +// struct is updated with values from Programs or Maps if it +// has an `ebpf` tag and its type is *ProgramSpec or *MapSpec. +// The tag gives the name of the program or map as found in +// the CollectionSpec. +// +// struct { +// Foo *ebpf.ProgramSpec `ebpf:"xdp_foo"` +// Bar *ebpf.MapSpec `ebpf:"bar_map"` +// Ignored int +// } +// +// Returns an error if any of the fields can't be found, or +// if the same map or program is assigned multiple times. +func (cs *CollectionSpec) Assign(to interface{}) error { + valueOf := func(typ reflect.Type, name string) (reflect.Value, error) { + switch typ { + case reflect.TypeOf((*ProgramSpec)(nil)): + p := cs.Programs[name] + if p == nil { + return reflect.Value{}, fmt.Errorf("missing program %q", name) + } + return reflect.ValueOf(p), nil + case reflect.TypeOf((*MapSpec)(nil)): + m := cs.Maps[name] + if m == nil { + return reflect.Value{}, fmt.Errorf("missing map %q", name) + } + return reflect.ValueOf(m), nil + default: + return reflect.Value{}, fmt.Errorf("unsupported type %s", typ) + } + } + + return assignValues(to, valueOf) +} + +// LoadAndAssign creates a collection from a spec, and assigns it to a struct. +// +// See Collection.Assign for details. +func (cs *CollectionSpec) LoadAndAssign(to interface{}, opts *CollectionOptions) error { + if opts == nil { + opts = &CollectionOptions{} + } + + coll, err := NewCollectionWithOptions(cs, *opts) + if err != nil { + return err + } + defer coll.Close() + + return coll.Assign(to) +} + // Collection is a collection of Programs and Maps associated // with their symbols type Collection struct { @@ -191,7 +255,7 @@ func NewCollectionWithOptions(spec *CollectionSpec, opts CollectionOptions) (col } } - m, err := newMapWithBTF(mapSpec, handle) + m, err := newMapWithBTF(mapSpec, handle, opts.Maps) if err != nil { return nil, fmt.Errorf("map %s: %w", mapName, err) } @@ -292,3 +356,105 @@ func (coll *Collection) DetachProgram(name string) *Program { delete(coll.Programs, name) return p } + +// Assign the contents of a collection to a struct. +// +// `to` must be a pointer to a struct like the following: +// +// struct { +// Foo *ebpf.Program `ebpf:"xdp_foo"` +// Bar *ebpf.Map `ebpf:"bar_map"` +// Ignored int +// } +// +// See CollectionSpec.Assign for the semantics of this function. +// +// DetachMap and DetachProgram is invoked for all assigned elements +// if the function is successful. +func (coll *Collection) Assign(to interface{}) error { + assignedMaps := make(map[string]struct{}) + assignedPrograms := make(map[string]struct{}) + valueOf := func(typ reflect.Type, name string) (reflect.Value, error) { + switch typ { + case reflect.TypeOf((*Program)(nil)): + p := coll.Programs[name] + if p == nil { + return reflect.Value{}, fmt.Errorf("missing program %q", name) + } + assignedPrograms[name] = struct{}{} + return reflect.ValueOf(p), nil + case reflect.TypeOf((*Map)(nil)): + m := coll.Maps[name] + if m == nil { + return reflect.Value{}, fmt.Errorf("missing map %q", name) + } + assignedMaps[name] = struct{}{} + return reflect.ValueOf(m), nil + default: + return reflect.Value{}, fmt.Errorf("unsupported type %s", typ) + } + } + + if err := assignValues(to, valueOf); err != nil { + return err + } + + for name := range assignedPrograms { + coll.DetachProgram(name) + } + + for name := range assignedMaps { + coll.DetachMap(name) + } + + return nil +} + +func assignValues(to interface{}, valueOf func(reflect.Type, string) (reflect.Value, error)) error { + v := reflect.ValueOf(to) + if v.Kind() != reflect.Ptr || v.Elem().Kind() != reflect.Struct { + return fmt.Errorf("%T is not a pointer to a struct", to) + } + + type elem struct { + typ reflect.Type + name string + } + + var ( + s = v.Elem() + sT = s.Type() + assignedTo = make(map[elem]string) + ) + for i := 0; i < sT.NumField(); i++ { + field := sT.Field(i) + + name := field.Tag.Get("ebpf") + if name == "" { + continue + } + if strings.Contains(name, ",") { + return fmt.Errorf("field %s: ebpf tag contains a comma", field.Name) + } + + e := elem{field.Type, name} + if assignedField := assignedTo[e]; assignedField != "" { + return fmt.Errorf("field %s: %q was already assigned to %s", field.Name, name, assignedField) + } + + value, err := valueOf(field.Type, name) + if err != nil { + return fmt.Errorf("field %s: %w", field.Name, err) + } + + fieldValue := s.Field(i) + if !fieldValue.CanSet() { + return fmt.Errorf("can't set value of field %s", field.Name) + } + + fieldValue.Set(value) + assignedTo[e] = field.Name + } + + return nil +} diff --git a/vendor/github.com/cilium/ebpf/doc.go b/vendor/github.com/cilium/ebpf/doc.go index d96e6b1e6d93..f7f34da8f44c 100644 --- a/vendor/github.com/cilium/ebpf/doc.go +++ b/vendor/github.com/cilium/ebpf/doc.go @@ -12,6 +12,5 @@ // eBPF code should be compiled ahead of time using clang, and shipped with // your application as any other resource. // -// This package doesn't include code required to attach eBPF to Linux -// subsystems, since this varies per subsystem. +// Use the link subpackage to attach a loaded program to a hook in the kernel. package ebpf diff --git a/vendor/github.com/cilium/ebpf/elf_reader.go b/vendor/github.com/cilium/ebpf/elf_reader.go index 77acaed8d962..2b564dae047c 100644 --- a/vendor/github.com/cilium/ebpf/elf_reader.go +++ b/vendor/github.com/cilium/ebpf/elf_reader.go @@ -1,6 +1,7 @@ package ebpf import ( + "bufio" "bytes" "debug/elf" "encoding/binary" @@ -236,7 +237,7 @@ func (ec *elfCode) loadPrograms(progSections map[elf.SectionIndex]*elf.Section, func (ec *elfCode) loadInstructions(section *elf.Section, symbols, relocations map[uint64]elf.Symbol) (asm.Instructions, uint64, error) { var ( - r = section.Open() + r = bufio.NewReader(section.Open()) insns asm.Instructions offset uint64 ) @@ -389,7 +390,7 @@ func (ec *elfCode) loadMaps(maps map[string]*MapSpec, mapSections map[elf.Sectio } var ( - r = sec.Open() + r = bufio.NewReader(sec.Open()) size = sec.Size / uint64(len(syms)) ) for i, offset := 0, uint64(0); i < len(syms); i, offset = i+1, offset+size { @@ -482,6 +483,7 @@ func mapSpecFromBTF(spec *btf.Spec, name string) (*MapSpec, error) { var ( mapType, flags, maxEntries uint32 + pinType PinType ) for _, member := range btfMapMembers { switch member.Name { @@ -529,9 +531,7 @@ func mapSpecFromBTF(spec *btf.Spec, name string) (*MapSpec, error) { return nil, fmt.Errorf("can't get pinning: %w", err) } - if pinning != 0 { - return nil, fmt.Errorf("'pinning' attribute not supported: %w", ErrNotSupported) - } + pinType = PinType(pinning) case "key", "value": default: @@ -540,12 +540,14 @@ func mapSpecFromBTF(spec *btf.Spec, name string) (*MapSpec, error) { } return &MapSpec{ + Name: SanitizeName(name, -1), Type: MapType(mapType), KeySize: keySize, ValueSize: valueSize, MaxEntries: maxEntries, Flags: flags, BTF: btfMap, + Pinning: pinType, }, nil } @@ -636,6 +638,8 @@ func getProgType(sectionName string) (ProgramType, AttachType, string) { "lirc_mode2": {LircMode2, AttachLircMode2}, "flow_dissector": {FlowDissector, AttachFlowDissector}, "iter/": {Tracing, AttachTraceIter}, + "sk_lookup/": {SkLookup, AttachSkLookup}, + "lsm/": {LSM, AttachLSMMac}, "cgroup_skb/ingress": {CGroupSKB, AttachCGroupInetIngress}, "cgroup_skb/egress": {CGroupSKB, AttachCGroupInetEgress}, @@ -684,7 +688,7 @@ func (ec *elfCode) loadRelocations(sections map[elf.SectionIndex]*elf.Section) ( return nil, nil, fmt.Errorf("section %s: relocations are less than 16 bytes", sec.Name) } - r := sec.Open() + r := bufio.NewReader(sec.Open()) for off := uint64(0); off < sec.Size; off += sec.Entsize { ent := io.LimitReader(r, int64(sec.Entsize)) diff --git a/vendor/github.com/cilium/ebpf/go.mod b/vendor/github.com/cilium/ebpf/go.mod index a05cf85eddd3..2d1004425024 100644 --- a/vendor/github.com/cilium/ebpf/go.mod +++ b/vendor/github.com/cilium/ebpf/go.mod @@ -1,5 +1,8 @@ module github.com/cilium/ebpf -go 1.13 +go 1.14 -require golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9 +require ( + github.com/google/go-cmp v0.5.2 + golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9 +) diff --git a/vendor/github.com/cilium/ebpf/go.sum b/vendor/github.com/cilium/ebpf/go.sum index e8b62417e811..47dd82f2921f 100644 --- a/vendor/github.com/cilium/ebpf/go.sum +++ b/vendor/github.com/cilium/ebpf/go.sum @@ -1,2 +1,6 @@ +github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9 h1:1/DFK4b7JH8DmkqhUk48onnSfrPzImPoVxuomtbT2nk= golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/vendor/github.com/cilium/ebpf/internal/btf/btf.go b/vendor/github.com/cilium/ebpf/internal/btf/btf.go index 3dd000a284e7..7a904a02c2c2 100644 --- a/vendor/github.com/cilium/ebpf/internal/btf/btf.go +++ b/vendor/github.com/cilium/ebpf/internal/btf/btf.go @@ -31,7 +31,7 @@ var ( type Spec struct { rawTypes []rawType strings stringTable - types map[string][]Type + types map[string][]namedType funcInfos map[string]extInfo lineInfos map[string]extInfo byteOrder binary.ByteOrder @@ -59,29 +59,9 @@ func LoadSpecFromReader(rd io.ReaderAt) (*Spec, error) { } defer file.Close() - var ( - btfSection *elf.Section - btfExtSection *elf.Section - sectionSizes = make(map[string]uint32) - ) - - for _, sec := range file.Sections { - switch sec.Name { - case ".BTF": - btfSection = sec - case ".BTF.ext": - btfExtSection = sec - default: - if sec.Type != elf.SHT_PROGBITS && sec.Type != elf.SHT_NOBITS { - break - } - - if sec.Size > math.MaxUint32 { - return nil, fmt.Errorf("section %s exceeds maximum size", sec.Name) - } - - sectionSizes[sec.Name] = uint32(sec.Size) - } + btfSection, btfExtSection, sectionSizes, err := findBtfSections(file) + if err != nil { + return nil, err } if btfSection == nil { @@ -129,6 +109,51 @@ func LoadSpecFromReader(rd io.ReaderAt) (*Spec, error) { return spec, nil } +func findBtfSections(file *elf.File) (*elf.Section, *elf.Section, map[string]uint32, error) { + var ( + btfSection *elf.Section + btfExtSection *elf.Section + sectionSizes = make(map[string]uint32) + ) + + for _, sec := range file.Sections { + switch sec.Name { + case ".BTF": + btfSection = sec + case ".BTF.ext": + btfExtSection = sec + default: + if sec.Type != elf.SHT_PROGBITS && sec.Type != elf.SHT_NOBITS { + break + } + + if sec.Size > math.MaxUint32 { + return nil, nil, nil, fmt.Errorf("section %s exceeds maximum size", sec.Name) + } + + sectionSizes[sec.Name] = uint32(sec.Size) + } + } + return btfSection, btfExtSection, sectionSizes, nil +} + +func loadSpecFromVmlinux(rd io.ReaderAt) (*Spec, error) { + file, err := elf.NewFile(rd) + if err != nil { + return nil, err + } + defer file.Close() + + btfSection, _, _, err := findBtfSections(file) + if err != nil { + return nil, fmt.Errorf(".BTF ELF section: %s", err) + } + if btfSection == nil { + return nil, fmt.Errorf("unable to find .BTF ELF section") + } + return loadNakedSpec(btfSection.Open(), file.ByteOrder, nil, nil) +} + func loadNakedSpec(btf io.ReadSeeker, bo binary.ByteOrder, sectionSizes map[string]uint32, variableOffsets map[variable]uint32) (*Spec, error) { rawTypes, rawStrings, err := parseBTF(btf, bo) if err != nil { @@ -176,16 +201,43 @@ func LoadKernelSpec() (*Spec, error) { } func loadKernelSpec() (*Spec, error) { + release, err := unix.KernelRelease() + if err != nil { + return nil, fmt.Errorf("can't read kernel release number: %w", err) + } + fh, err := os.Open("/sys/kernel/btf/vmlinux") - if os.IsNotExist(err) { - return nil, fmt.Errorf("can't open kernel BTF at /sys/kernel/btf/vmlinux: %w", ErrNotFound) + if err == nil { + defer fh.Close() + + return loadNakedSpec(fh, internal.NativeEndian, nil, nil) } - if err != nil { - return nil, fmt.Errorf("can't read kernel BTF: %s", err) + + // use same list of locations as libbpf + // https://github.com/libbpf/libbpf/blob/9a3a42608dbe3731256a5682a125ac1e23bced8f/src/btf.c#L3114-L3122 + locations := []string{ + "/boot/vmlinux-%s", + "/lib/modules/%s/vmlinux-%[1]s", + "/lib/modules/%s/build/vmlinux", + "/usr/lib/modules/%s/kernel/vmlinux", + "/usr/lib/debug/boot/vmlinux-%s", + "/usr/lib/debug/boot/vmlinux-%s.debug", + "/usr/lib/debug/lib/modules/%s/vmlinux", + } + + for _, loc := range locations { + path := fmt.Sprintf(loc, release) + + fh, err := os.Open(path) + if err != nil { + continue + } + defer fh.Close() + + return loadSpecFromVmlinux(fh) } - defer fh.Close() - return loadNakedSpec(fh, internal.NativeEndian, nil, nil) + return nil, fmt.Errorf("no BTF for kernel version %s: %w", release, internal.ErrNotSupported) } func parseBTF(btf io.ReadSeeker, bo binary.ByteOrder) ([]rawType, stringTable, error) { @@ -402,9 +454,19 @@ func (s *Spec) Map(name string) (*Map, []Member, error) { switch member.Name { case "key": key = member.Type + if pk, isPtr := key.(*Pointer); !isPtr { + return nil, nil, fmt.Errorf("key type is not a pointer: %T", key) + } else { + key = pk.Target + } case "value": value = member.Type + if vk, isPtr := value.(*Pointer); !isPtr { + return nil, nil, fmt.Errorf("value type is not a pointer: %T", value) + } else { + value = vk.Target + } } } @@ -441,11 +503,16 @@ func (s *Spec) FindType(name string, typ Type) error { candidate Type ) - for _, typ := range s.types[name] { + for _, typ := range s.types[essentialName(name)] { if reflect.TypeOf(typ) != wanted { continue } + // Match against the full name, not just the essential one. + if typ.name() != name { + continue + } + if candidate != nil { return fmt.Errorf("type %s: multiple candidates for %T", name, typ) } @@ -621,9 +688,7 @@ type bpfLoadBTFAttr struct { } func bpfLoadBTF(attr *bpfLoadBTFAttr) (*internal.FD, error) { - const _BTFLoad = 18 - - fd, err := internal.BPF(_BTFLoad, unsafe.Pointer(attr), unsafe.Sizeof(*attr)) + fd, err := internal.BPF(internal.BPF_BTF_LOAD, unsafe.Pointer(attr), unsafe.Sizeof(*attr)) if err != nil { return nil, err } diff --git a/vendor/github.com/cilium/ebpf/internal/btf/btf_types.go b/vendor/github.com/cilium/ebpf/internal/btf/btf_types.go index e34a87ecb457..a4cde3fe8270 100644 --- a/vendor/github.com/cilium/ebpf/internal/btf/btf_types.go +++ b/vendor/github.com/cilium/ebpf/internal/btf/btf_types.go @@ -40,10 +40,12 @@ const ( ) const ( - btfTypeKindShift = 24 - btfTypeKindLen = 4 - btfTypeVlenShift = 0 - btfTypeVlenMask = 16 + btfTypeKindShift = 24 + btfTypeKindLen = 4 + btfTypeVlenShift = 0 + btfTypeVlenMask = 16 + btfTypeKindFlagShift = 31 + btfTypeKindFlagMask = 1 ) // btfType is equivalent to struct btf_type in Documentation/bpf/btf.rst. @@ -136,6 +138,10 @@ func (bt *btfType) SetVlen(vlen int) { bt.setInfo(uint32(vlen), btfTypeVlenMask, btfTypeVlenShift) } +func (bt *btfType) KindFlag() bool { + return bt.info(btfTypeKindFlagMask, btfTypeKindFlagShift) == 1 +} + func (bt *btfType) Linkage() btfFuncLinkage { return btfFuncLinkage(bt.info(btfTypeVlenMask, btfTypeVlenShift)) } @@ -257,3 +263,7 @@ func readTypes(r io.Reader, bo binary.ByteOrder) ([]rawType, error) { types = append(types, rawType{header, data}) } } + +func intEncoding(raw uint32) (IntEncoding, uint32, byte) { + return IntEncoding((raw & 0x0f000000) >> 24), (raw & 0x00ff0000) >> 16, byte(raw & 0x000000ff) +} diff --git a/vendor/github.com/cilium/ebpf/internal/btf/ext_info.go b/vendor/github.com/cilium/ebpf/internal/btf/ext_info.go index 28918ae9e0c8..c1c82ec7f802 100644 --- a/vendor/github.com/cilium/ebpf/internal/btf/ext_info.go +++ b/vendor/github.com/cilium/ebpf/internal/btf/ext_info.go @@ -1,6 +1,7 @@ package btf import ( + "bufio" "bytes" "encoding/binary" "errors" @@ -58,7 +59,8 @@ func parseExtInfos(r io.ReadSeeker, bo binary.ByteOrder, strings stringTable) (f return nil, nil, fmt.Errorf("can't seek to function info section: %v", err) } - funcInfo, err = parseExtInfo(io.LimitReader(r, int64(header.FuncInfoLen)), bo, strings) + buf := bufio.NewReader(io.LimitReader(r, int64(header.FuncInfoLen))) + funcInfo, err = parseExtInfo(buf, bo, strings) if err != nil { return nil, nil, fmt.Errorf("function info: %w", err) } @@ -67,7 +69,8 @@ func parseExtInfos(r io.ReadSeeker, bo binary.ByteOrder, strings stringTable) (f return nil, nil, fmt.Errorf("can't seek to line info section: %v", err) } - lineInfo, err = parseExtInfo(io.LimitReader(r, int64(header.LineInfoLen)), bo, strings) + buf = bufio.NewReader(io.LimitReader(r, int64(header.LineInfoLen))) + lineInfo, err = parseExtInfo(buf, bo, strings) if err != nil { return nil, nil, fmt.Errorf("line info: %w", err) } @@ -127,6 +130,8 @@ func (ei extInfo) MarshalBinary() ([]byte, error) { } func parseExtInfo(r io.Reader, bo binary.ByteOrder, strings stringTable) (map[string]extInfo, error) { + const maxRecordSize = 256 + var recordSize uint32 if err := binary.Read(r, bo, &recordSize); err != nil { return nil, fmt.Errorf("can't read record size: %v", err) @@ -136,6 +141,9 @@ func parseExtInfo(r io.Reader, bo binary.ByteOrder, strings stringTable) (map[st // Need at least insnOff return nil, errors.New("record size too short") } + if recordSize > maxRecordSize { + return nil, fmt.Errorf("record size %v exceeds %v", recordSize, maxRecordSize) + } result := make(map[string]extInfo) for { diff --git a/vendor/github.com/cilium/ebpf/internal/btf/fuzz.go b/vendor/github.com/cilium/ebpf/internal/btf/fuzz.go new file mode 100644 index 000000000000..37e043fd378c --- /dev/null +++ b/vendor/github.com/cilium/ebpf/internal/btf/fuzz.go @@ -0,0 +1,49 @@ +// +build gofuzz + +// Use with https://github.com/dvyukov/go-fuzz + +package btf + +import ( + "bytes" + "encoding/binary" + + "github.com/cilium/ebpf/internal" +) + +func FuzzSpec(data []byte) int { + if len(data) < binary.Size(btfHeader{}) { + return -1 + } + + spec, err := loadNakedSpec(bytes.NewReader(data), internal.NativeEndian, nil, nil) + if err != nil { + if spec != nil { + panic("spec is not nil") + } + return 0 + } + if spec == nil { + panic("spec is nil") + } + return 1 +} + +func FuzzExtInfo(data []byte) int { + if len(data) < binary.Size(btfExtHeader{}) { + return -1 + } + + table := stringTable("\x00foo\x00barfoo\x00") + info, err := parseExtInfo(bytes.NewReader(data), internal.NativeEndian, table) + if err != nil { + if info != nil { + panic("info is not nil") + } + return 0 + } + if info == nil { + panic("info is nil") + } + return 1 +} diff --git a/vendor/github.com/cilium/ebpf/internal/btf/types.go b/vendor/github.com/cilium/ebpf/internal/btf/types.go index 264142abc0ad..a93039bd5183 100644 --- a/vendor/github.com/cilium/ebpf/internal/btf/types.go +++ b/vendor/github.com/cilium/ebpf/internal/btf/types.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" "math" + "strings" ) const maxTypeDepth = 32 @@ -23,9 +24,19 @@ type Type interface { // Make a copy of the type, without copying Type members. copy() Type + // Enumerate all nested Types. Repeated calls must visit nested + // types in the same order. walk(*copyStack) } +// namedType is a type with a name. +// +// Most named types simply embed Name. +type namedType interface { + Type + name() string +} + // Name identifies a type. // // Anonymous types have an empty name. @@ -43,15 +54,30 @@ func (v *Void) size() uint32 { return 0 } func (v *Void) copy() Type { return (*Void)(nil) } func (v *Void) walk(*copyStack) {} +type IntEncoding byte + +const ( + Signed IntEncoding = 1 << iota + Char + Bool +) + // Int is an integer of a given length. type Int struct { TypeID Name // The size of the integer in bytes. - Size uint32 + Size uint32 + Encoding IntEncoding + // Offset is the starting bit offset. Currently always 0. + // See https://www.kernel.org/doc/html/latest/bpf/btf.html#btf-kind-int + Offset uint32 + Bits byte } +var _ namedType = (*Int)(nil) + func (i *Int) size() uint32 { return i.Size } func (i *Int) walk(*copyStack) {} func (i *Int) copy() Type { @@ -109,6 +135,10 @@ func (s *Struct) copy() Type { return &cpy } +func (s *Struct) members() []Member { + return s.Members +} + // Union is a compound type where members occupy the same memory. type Union struct { TypeID @@ -133,25 +163,51 @@ func (u *Union) copy() Type { return &cpy } +func (u *Union) members() []Member { + return u.Members +} + +type composite interface { + members() []Member +} + +var ( + _ composite = (*Struct)(nil) + _ composite = (*Union)(nil) +) + // Member is part of a Struct or Union. // // It is not a valid Type. type Member struct { Name - Type Type - Offset uint32 + Type Type + // Offset is the bit offset of this member + Offset uint32 + BitfieldSize uint32 } // Enum lists possible values. type Enum struct { TypeID Name + Values []EnumValue +} + +// EnumValue is part of an Enum +// +// Is is not a valid Type +type EnumValue struct { + Name + Value int32 } func (e *Enum) size() uint32 { return 4 } func (e *Enum) walk(*copyStack) {} func (e *Enum) copy() Type { cpy := *e + cpy.Values = make([]EnumValue, len(e.Values)) + copy(cpy.Values, e.Values) return &cpy } @@ -180,36 +236,39 @@ func (td *Typedef) copy() Type { return &cpy } -// Volatile is a modifier. +// Volatile is a qualifier. type Volatile struct { TypeID Type Type } +func (v *Volatile) qualify() Type { return v.Type } func (v *Volatile) walk(cs *copyStack) { cs.push(&v.Type) } func (v *Volatile) copy() Type { cpy := *v return &cpy } -// Const is a modifier. +// Const is a qualifier. type Const struct { TypeID Type Type } +func (c *Const) qualify() Type { return c.Type } func (c *Const) walk(cs *copyStack) { cs.push(&c.Type) } func (c *Const) copy() Type { cpy := *c return &cpy } -// Restrict is a modifier. +// Restrict is a qualifier. type Restrict struct { TypeID Type Type } +func (r *Restrict) qualify() Type { return r.Type } func (r *Restrict) walk(cs *copyStack) { cs.push(&r.Type) } func (r *Restrict) copy() Type { cpy := *r @@ -233,15 +292,28 @@ func (f *Func) copy() Type { type FuncProto struct { TypeID Return Type - // Parameters not supported yet + Params []FuncParam +} + +func (fp *FuncProto) walk(cs *copyStack) { + cs.push(&fp.Return) + for i := range fp.Params { + cs.push(&fp.Params[i].Type) + } } -func (fp *FuncProto) walk(cs *copyStack) { cs.push(&fp.Return) } func (fp *FuncProto) copy() Type { cpy := *fp + cpy.Params = make([]FuncParam, len(fp.Params)) + copy(cpy.Params, fp.Params) return &cpy } +type FuncParam struct { + Name + Type Type +} + // Var is a global variable. type Var struct { TypeID @@ -298,6 +370,16 @@ var ( _ sizer = (*Datasec)(nil) ) +type qualifier interface { + qualify() Type +} + +var ( + _ qualifier = (*Const)(nil) + _ qualifier = (*Restrict)(nil) + _ qualifier = (*Volatile)(nil) +) + // Sizeof returns the size of a type in bytes. // // Returns an error if the size can't be computed. @@ -326,14 +408,9 @@ func Sizeof(typ Type) (int, error) { case *Typedef: typ = v.Type continue - case *Volatile: - typ = v.Type - continue - case *Const: - typ = v.Type - continue - case *Restrict: - typ = v.Type + + case qualifier: + typ = v.qualify() continue default: @@ -383,7 +460,7 @@ func copyType(typ Type) Type { } // copyStack keeps track of pointers to types which still -// need to be copied. +// need to be visited. type copyStack []*Type // push adds a type to the stack. @@ -403,19 +480,13 @@ func (cs *copyStack) pop() *Type { return t } -type namer interface { - name() string -} - -var _ namer = Name("") - // inflateRawTypes takes a list of raw btf types linked via type IDs, and turns // it into a graph of Types connected via pointers. // // Returns a map of named types (so, where NameOff is non-zero). Since BTF ignores // compilation units, multiple types may share the same name. A Type may form a // cyclic graph by pointing at itself. -func inflateRawTypes(rawTypes []rawType, rawStrings stringTable) (namedTypes map[string][]Type, err error) { +func inflateRawTypes(rawTypes []rawType, rawStrings stringTable) (namedTypes map[string][]namedType, err error) { type fixupDef struct { id TypeID expectedKind btfKind @@ -427,7 +498,7 @@ func inflateRawTypes(rawTypes []rawType, rawStrings stringTable) (namedTypes map fixups = append(fixups, fixupDef{id, expectedKind, typ}) } - convertMembers := func(raw []btfMember) ([]Member, error) { + convertMembers := func(raw []btfMember, kindFlag bool) ([]Member, error) { // NB: The fixup below relies on pre-allocating this array to // work, since otherwise append might re-allocate members. members := make([]Member, 0, len(raw)) @@ -436,10 +507,15 @@ func inflateRawTypes(rawTypes []rawType, rawStrings stringTable) (namedTypes map if err != nil { return nil, fmt.Errorf("can't get name for member %d: %w", i, err) } - members = append(members, Member{ + m := Member{ Name: name, Offset: btfMember.Offset, - }) + } + if kindFlag { + m.BitfieldSize = btfMember.Offset >> 24 + m.Offset &= 0xffffff + } + members = append(members, m) } for i := range members { fixup(raw[i].Type, kindUnknown, &members[i].Type) @@ -449,7 +525,7 @@ func inflateRawTypes(rawTypes []rawType, rawStrings stringTable) (namedTypes map types := make([]Type, 0, len(rawTypes)) types = append(types, (*Void)(nil)) - namedTypes = make(map[string][]Type) + namedTypes = make(map[string][]namedType) for i, raw := range rawTypes { var ( @@ -466,7 +542,8 @@ func inflateRawTypes(rawTypes []rawType, rawStrings stringTable) (namedTypes map switch raw.Kind() { case kindInt: - typ = &Int{id, name, raw.Size()} + encoding, offset, bits := intEncoding(*raw.data.(*uint32)) + typ = &Int{id, name, raw.Size(), encoding, offset, bits} case kindPointer: ptr := &Pointer{id, nil} @@ -483,21 +560,33 @@ func inflateRawTypes(rawTypes []rawType, rawStrings stringTable) (namedTypes map typ = arr case kindStruct: - members, err := convertMembers(raw.data.([]btfMember)) + members, err := convertMembers(raw.data.([]btfMember), raw.KindFlag()) if err != nil { return nil, fmt.Errorf("struct %s (id %d): %w", name, id, err) } typ = &Struct{id, name, raw.Size(), members} case kindUnion: - members, err := convertMembers(raw.data.([]btfMember)) + members, err := convertMembers(raw.data.([]btfMember), raw.KindFlag()) if err != nil { return nil, fmt.Errorf("union %s (id %d): %w", name, id, err) } typ = &Union{id, name, raw.Size(), members} case kindEnum: - typ = &Enum{id, name} + rawvals := raw.data.([]btfEnum) + vals := make([]EnumValue, 0, len(rawvals)) + for i, btfVal := range rawvals { + name, err := rawStrings.LookupName(btfVal.NameOff) + if err != nil { + return nil, fmt.Errorf("can't get name for enum value %d: %s", i, err) + } + vals = append(vals, EnumValue{ + Name: name, + Value: btfVal.Val, + }) + } + typ = &Enum{id, name, vals} case kindForward: typ = &Fwd{id, name} @@ -528,7 +617,22 @@ func inflateRawTypes(rawTypes []rawType, rawStrings stringTable) (namedTypes map typ = fn case kindFuncProto: - fp := &FuncProto{id, nil} + rawparams := raw.data.([]btfParam) + params := make([]FuncParam, 0, len(rawparams)) + for i, param := range rawparams { + name, err := rawStrings.LookupName(param.NameOff) + if err != nil { + return nil, fmt.Errorf("can't get name for func proto parameter %d: %s", i, err) + } + params = append(params, FuncParam{ + Name: name, + }) + } + for i := range params { + fixup(rawparams[i].Type, kindUnknown, ¶ms[i].Type) + } + + fp := &FuncProto{id, nil, params} fixup(raw.Type(), kindUnknown, &fp.Return) typ = fp @@ -557,9 +661,9 @@ func inflateRawTypes(rawTypes []rawType, rawStrings stringTable) (namedTypes map types = append(types, typ) - if namer, ok := typ.(namer); ok { - if name := namer.name(); name != "" { - namedTypes[name] = append(namedTypes[name], typ) + if named, ok := typ.(namedType); ok { + if name := essentialName(named.name()); name != "" { + namedTypes[name] = append(namedTypes[name], named) } } } @@ -585,3 +689,12 @@ func inflateRawTypes(rawTypes []rawType, rawStrings stringTable) (namedTypes map return namedTypes, nil } + +// essentialName returns name without a ___ suffix. +func essentialName(name string) string { + lastIdx := strings.LastIndex(name, "___") + if lastIdx > 0 { + return name[:lastIdx] + } + return name +} diff --git a/vendor/github.com/cilium/ebpf/internal/feature.go b/vendor/github.com/cilium/ebpf/internal/feature.go index 7375b21ef984..8f282db64dfa 100644 --- a/vendor/github.com/cilium/ebpf/internal/feature.go +++ b/vendor/github.com/cilium/ebpf/internal/feature.go @@ -20,6 +20,9 @@ type UnsupportedFeatureError struct { } func (ufe *UnsupportedFeatureError) Error() string { + if ufe.MinimumVersion.Unspecified() { + return fmt.Sprintf("%s not supported", ufe.Name) + } return fmt.Sprintf("%s not supported (requires >= %s)", ufe.Name, ufe.MinimumVersion) } @@ -120,3 +123,8 @@ func (v Version) Less(other Version) bool { } return false } + +// Unspecified returns true if the version is all zero. +func (v Version) Unspecified() bool { + return v[0] == 0 && v[1] == 0 && v[2] == 0 +} diff --git a/vendor/github.com/cilium/ebpf/internal/syscall.go b/vendor/github.com/cilium/ebpf/internal/syscall.go index efbf40327c6b..9c5e0b3edd1d 100644 --- a/vendor/github.com/cilium/ebpf/internal/syscall.go +++ b/vendor/github.com/cilium/ebpf/internal/syscall.go @@ -137,3 +137,30 @@ func BPFObjGet(fileName string) (*FD, error) { } return NewFD(uint32(ptr)), nil } + +type bpfObjGetInfoByFDAttr struct { + fd uint32 + infoLen uint32 + info Pointer +} + +// BPFObjGetInfoByFD wraps BPF_OBJ_GET_INFO_BY_FD. +// +// Available from 4.13. +func BPFObjGetInfoByFD(fd *FD, info unsafe.Pointer, size uintptr) error { + value, err := fd.Value() + if err != nil { + return err + } + + attr := bpfObjGetInfoByFDAttr{ + fd: value, + infoLen: uint32(size), + info: NewPointer(info), + } + _, err = BPF(BPF_OBJ_GET_INFO_BY_FD, unsafe.Pointer(&attr), unsafe.Sizeof(attr)) + if err != nil { + return fmt.Errorf("fd %v: %w", fd, err) + } + return nil +} diff --git a/vendor/github.com/cilium/ebpf/internal/unix/types_linux.go b/vendor/github.com/cilium/ebpf/internal/unix/types_linux.go index 9363d0be81cf..d8135c1836be 100644 --- a/vendor/github.com/cilium/ebpf/internal/unix/types_linux.go +++ b/vendor/github.com/cilium/ebpf/internal/unix/types_linux.go @@ -3,6 +3,7 @@ package unix import ( + "bytes" "syscall" linux "golang.org/x/sys/unix" @@ -19,6 +20,7 @@ const ( EPERM = linux.EPERM ESRCH = linux.ESRCH ENODEV = linux.ENODEV + BPF_F_NUMA_NODE = linux.BPF_F_NUMA_NODE BPF_F_RDONLY_PROG = linux.BPF_F_RDONLY_PROG BPF_F_WRONLY_PROG = linux.BPF_F_WRONLY_PROG BPF_OBJ_NAME_LEN = linux.BPF_OBJ_NAME_LEN @@ -148,3 +150,15 @@ func Gettid() int { func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { return linux.Tgkill(tgid, tid, sig) } + +func KernelRelease() (string, error) { + var uname Utsname + err := Uname(&uname) + if err != nil { + return "", err + } + + end := bytes.IndexByte(uname.Release[:], 0) + release := string(uname.Release[:end]) + return release, nil +} diff --git a/vendor/github.com/cilium/ebpf/internal/unix/types_other.go b/vendor/github.com/cilium/ebpf/internal/unix/types_other.go index 2dea950f8881..416b8d2f5dea 100644 --- a/vendor/github.com/cilium/ebpf/internal/unix/types_other.go +++ b/vendor/github.com/cilium/ebpf/internal/unix/types_other.go @@ -20,6 +20,7 @@ const ( EPERM = syscall.EPERM ESRCH = syscall.ESRCH ENODEV = syscall.ENODEV + BPF_F_NUMA_NODE = 0 BPF_F_RDONLY_PROG = 0 BPF_F_WRONLY_PROG = 0 BPF_OBJ_NAME_LEN = 0x10 @@ -215,3 +216,7 @@ func Gettid() int { func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { return errNonLinux } + +func KernelRelease() (string, error) { + return "", errNonLinux +} diff --git a/vendor/github.com/cilium/ebpf/linker.go b/vendor/github.com/cilium/ebpf/linker.go index 1bb8f61c25aa..fc4ad9dffa2a 100644 --- a/vendor/github.com/cilium/ebpf/linker.go +++ b/vendor/github.com/cilium/ebpf/linker.go @@ -84,3 +84,50 @@ func needSection(insns, section asm.Instructions) (bool, error) { // None of the functions in the section are called. return false, nil } + +func fixupJumpsAndCalls(insns asm.Instructions) error { + symbolOffsets := make(map[string]asm.RawInstructionOffset) + iter := insns.Iterate() + for iter.Next() { + ins := iter.Ins + + if ins.Symbol == "" { + continue + } + + if _, ok := symbolOffsets[ins.Symbol]; ok { + return fmt.Errorf("duplicate symbol %s", ins.Symbol) + } + + symbolOffsets[ins.Symbol] = iter.Offset + } + + iter = insns.Iterate() + for iter.Next() { + i := iter.Index + offset := iter.Offset + ins := iter.Ins + + switch { + case ins.IsFunctionCall() && ins.Constant == -1: + // Rewrite bpf to bpf call + callOffset, ok := symbolOffsets[ins.Reference] + if !ok { + return fmt.Errorf("instruction %d: reference to missing symbol %s", i, ins.Reference) + } + + ins.Constant = int64(callOffset - offset - 1) + + case ins.OpCode.Class() == asm.JumpClass && ins.Offset == -1: + // Rewrite jump to label + jumpOffset, ok := symbolOffsets[ins.Reference] + if !ok { + return fmt.Errorf("instruction %d: reference to missing symbol %s", i, ins.Reference) + } + + ins.Offset = int16(jumpOffset - offset - 1) + } + } + + return nil +} diff --git a/vendor/github.com/cilium/ebpf/map.go b/vendor/github.com/cilium/ebpf/map.go index 461b995a54bb..5c9028d9de5f 100644 --- a/vendor/github.com/cilium/ebpf/map.go +++ b/vendor/github.com/cilium/ebpf/map.go @@ -3,6 +3,8 @@ package ebpf import ( "errors" "fmt" + "io" + "path/filepath" "strings" "github.com/cilium/ebpf/internal" @@ -17,6 +19,14 @@ var ( ErrIterationAborted = errors.New("iteration aborted") ) +// MapOptions control loading a map into the kernel. +type MapOptions struct { + // The base path to pin maps in if requested via PinByName. + // Existing maps will be re-used if they are compatible, otherwise an + // error is returned. + PinPath string +} + // MapID represents the unique ID of an eBPF map type MapID uint32 @@ -31,6 +41,15 @@ type MapSpec struct { MaxEntries uint32 Flags uint32 + // Automatically pin and load a map from MapOptions.PinPath. + // Generates an error if an existing pinned map is incompatible with the MapSpec. + Pinning PinType + + // Specify numa node during map creation + // (effective only if unix.BPF_F_NUMA_NODE flag is set, + // which can be imported from golang.org/x/sys/unix) + NumaNode uint32 + // The initial contents of the map. May be nil. Contents []MapKV @@ -69,6 +88,26 @@ type MapKV struct { Value interface{} } +func (ms *MapSpec) checkCompatibility(m *Map) error { + switch { + case m.abi.Type != ms.Type: + return fmt.Errorf("expected type %v, got %v", ms.Type, m.abi.Type) + + case m.abi.KeySize != ms.KeySize: + return fmt.Errorf("expected key size %v, got %v", ms.KeySize, m.abi.KeySize) + + case m.abi.ValueSize != ms.ValueSize: + return fmt.Errorf("expected value size %v, got %v", ms.ValueSize, m.abi.ValueSize) + + case m.abi.MaxEntries != ms.MaxEntries: + return fmt.Errorf("expected max entries %v, got %v", ms.MaxEntries, m.abi.MaxEntries) + + case m.abi.Flags != ms.Flags: + return fmt.Errorf("expected flags %v, got %v", ms.Flags, m.abi.Flags) + } + return nil +} + // Map represents a Map file descriptor. // // It is not safe to close a map which is used by other goroutines. @@ -105,15 +144,22 @@ func NewMapFromFD(fd int) (*Map, error) { // NewMap creates a new Map. // +// It's equivalent to calling NewMapWithOptions with default options. +func NewMap(spec *MapSpec) (*Map, error) { + return NewMapWithOptions(spec, MapOptions{}) +} + +// NewMapWithOptions creates a new Map. +// // Creating a map for the first time will perform feature detection // by creating small, temporary maps. // // The caller is responsible for ensuring the process' rlimit is set // sufficiently high for locking memory during map creation. This can be done -// by calling unix.Setrlimit with unix.RLIMIT_MEMLOCK prior to calling NewMap. -func NewMap(spec *MapSpec) (*Map, error) { +// by calling unix.Setrlimit with unix.RLIMIT_MEMLOCK prior to calling NewMapWithOptions. +func NewMapWithOptions(spec *MapSpec, opts MapOptions) (*Map, error) { if spec.BTF == nil { - return newMapWithBTF(spec, nil) + return newMapWithBTF(spec, nil, opts) } handle, err := btf.NewHandle(btf.MapSpec(spec.BTF)) @@ -121,28 +167,75 @@ func NewMap(spec *MapSpec) (*Map, error) { return nil, fmt.Errorf("can't load BTF: %w", err) } - return newMapWithBTF(spec, handle) + return newMapWithBTF(spec, handle, opts) } -func newMapWithBTF(spec *MapSpec, handle *btf.Handle) (*Map, error) { - if spec.Type != ArrayOfMaps && spec.Type != HashOfMaps { - return createMap(spec, nil, handle) +func newMapWithBTF(spec *MapSpec, handle *btf.Handle, opts MapOptions) (*Map, error) { + switch spec.Pinning { + case PinByName: + if spec.Name == "" || opts.PinPath == "" { + return nil, fmt.Errorf("pin by name: missing Name or PinPath") + } + + m, err := LoadPinnedMap(filepath.Join(opts.PinPath, spec.Name)) + if errors.Is(err, unix.ENOENT) { + break + } + if err != nil { + return nil, fmt.Errorf("load pinned map: %s", err) + } + + if err := spec.checkCompatibility(m); err != nil { + m.Close() + return nil, fmt.Errorf("use pinned map %s: %s", spec.Name, err) + } + + return m, nil + + case PinNone: + // Nothing to do here + + default: + return nil, fmt.Errorf("unsupported pin type %d", int(spec.Pinning)) } - if spec.InnerMap == nil { - return nil, fmt.Errorf("%s requires InnerMap", spec.Type) + var innerFd *internal.FD + if spec.Type == ArrayOfMaps || spec.Type == HashOfMaps { + if spec.InnerMap == nil { + return nil, fmt.Errorf("%s requires InnerMap", spec.Type) + } + + template, err := createMap(spec.InnerMap, nil, handle, opts) + if err != nil { + return nil, err + } + defer template.Close() + + innerFd = template.fd } - template, err := createMap(spec.InnerMap, nil, handle) + m, err := createMap(spec, innerFd, handle, opts) if err != nil { return nil, err } - defer template.Close() - return createMap(spec, template.fd, handle) + if spec.Pinning == PinByName { + if err := m.Pin(filepath.Join(opts.PinPath, spec.Name)); err != nil { + m.Close() + return nil, fmt.Errorf("pin map: %s", err) + } + } + + return m, nil } -func createMap(spec *MapSpec, inner *internal.FD, handle *btf.Handle) (*Map, error) { +func createMap(spec *MapSpec, inner *internal.FD, handle *btf.Handle, opts MapOptions) (_ *Map, err error) { + closeOnError := func(closer io.Closer) { + if err != nil { + closer.Close() + } + } + abi := newMapABIFromSpec(spec) switch spec.Type { @@ -190,6 +283,7 @@ func createMap(spec *MapSpec, inner *internal.FD, handle *btf.Handle) (*Map, err valueSize: abi.ValueSize, maxEntries: abi.MaxEntries, flags: abi.Flags, + numaNode: spec.NumaNode, } if inner != nil { @@ -214,6 +308,7 @@ func createMap(spec *MapSpec, inner *internal.FD, handle *btf.Handle) (*Map, err if err != nil { return nil, fmt.Errorf("map create: %w", err) } + defer closeOnError(fd) m, err := newMap(fd, spec.Name, abi) if err != nil { @@ -221,13 +316,11 @@ func createMap(spec *MapSpec, inner *internal.FD, handle *btf.Handle) (*Map, err } if err := m.populate(spec.Contents); err != nil { - m.Close() return nil, fmt.Errorf("map create: can't set initial contents: %w", err) } if spec.Freeze { if err := m.Freeze(); err != nil { - m.Close() return nil, fmt.Errorf("can't freeze map: %w", err) } } @@ -263,7 +356,34 @@ func (m *Map) String() string { return fmt.Sprintf("%s#%v", m.abi.Type, m.fd) } -// ABI gets the ABI of the Map +// Type returns the underlying type of the map. +func (m *Map) Type() MapType { + return m.abi.Type +} + +// KeySize returns the size of the map key in bytes. +func (m *Map) KeySize() uint32 { + return m.abi.KeySize +} + +// ValueSize returns the size of the map value in bytes. +func (m *Map) ValueSize() uint32 { + return m.abi.ValueSize +} + +// MaxEntries returns the maximum number of elements the map can hold. +func (m *Map) MaxEntries() uint32 { + return m.abi.MaxEntries +} + +// Flags returns the flags of the map. +func (m *Map) Flags() uint32 { + return m.abi.Flags +} + +// ABI gets the ABI of the Map. +// +// Deprecated: use Type, KeySize, ValueSize, MaxEntries and Flags instead. func (m *Map) ABI() MapABI { return m.abi } @@ -544,7 +664,7 @@ func (m *Map) Clone() (*Map, error) { // Pin persists the map past the lifetime of the process that created it. // -// This requires bpffs to be mounted above fileName. See http://cilium.readthedocs.io/en/doc-1.0/kubernetes/install/#mounting-the-bpf-fs-optional +// This requires bpffs to be mounted above fileName. See https://docs.cilium.io/en/k8s-doc/admin/#admin-mount-bpffs func (m *Map) Pin(fileName string) error { return internal.BPFObjPin(fileName, m.fd) } @@ -789,6 +909,8 @@ func NewMapFromID(id MapID) (*Map, error) { } // ID returns the systemwide unique ID of the map. +// +// Requires at least Linux 4.13. func (m *Map) ID() (MapID, error) { info, err := bpfGetMapInfoByFD(m.fd) if err != nil { diff --git a/vendor/github.com/cilium/ebpf/prog.go b/vendor/github.com/cilium/ebpf/prog.go index 429203f07e85..67cfff67eb15 100644 --- a/vendor/github.com/cilium/ebpf/prog.go +++ b/vendor/github.com/cilium/ebpf/prog.go @@ -208,8 +208,15 @@ func convertProgramSpec(spec *ProgramSpec, handle *btf.Handle) (*bpfProgLoadAttr return nil, fmt.Errorf("can't load %s program on %s", spec.ByteOrder, internal.NativeEndian) } + insns := make(asm.Instructions, len(spec.Instructions)) + copy(insns, spec.Instructions) + + if err := fixupJumpsAndCalls(insns); err != nil { + return nil, err + } + buf := bytes.NewBuffer(make([]byte, 0, len(spec.Instructions)*asm.InstructionSize)) - err := spec.Instructions.Marshal(buf, internal.NativeEndian) + err := insns.Marshal(buf, internal.NativeEndian) if err != nil { return nil, err } @@ -269,7 +276,14 @@ func (p *Program) String() string { return fmt.Sprintf("%s#%v", p.abi.Type, p.fd) } -// ABI gets the ABI of the Program +// Type returns the underlying type of the program. +func (p *Program) Type() ProgramType { + return p.abi.Type +} + +// ABI gets the ABI of the Program. +// +// Deprecated: use Type instead. func (p *Program) ABI() ProgramABI { return p.abi } @@ -308,7 +322,7 @@ func (p *Program) Clone() (*Program, error) { // Pin persists the Program past the lifetime of the process that created it // -// This requires bpffs to be mounted above fileName. See http://cilium.readthedocs.io/en/doc-1.0/kubernetes/install/#mounting-the-bpf-fs-optional +// This requires bpffs to be mounted above fileName. See https://docs.cilium.io/en/k8s-doc/admin/#admin-mount-bpffs func (p *Program) Pin(fileName string) error { if err := internal.BPFObjPin(fileName, p.fd); err != nil { return fmt.Errorf("can't pin program: %w", err) @@ -595,12 +609,16 @@ func (p *Program) ID() (ProgramID, error) { return ProgramID(info.id), nil } -func resolveBTFType(name string, progType ProgramType, attachType AttachType) (btf.Type, error) { +func findKernelType(name string, typ btf.Type) error { kernel, err := btf.LoadKernelSpec() if err != nil { - return nil, fmt.Errorf("can't resolve BTF type %s: %w", name, err) + return fmt.Errorf("can't load kernel spec: %w", err) } + return kernel.FindType(name, typ) +} + +func resolveBTFType(name string, progType ProgramType, attachType AttachType) (btf.Type, error) { type match struct { p ProgramType a AttachType @@ -608,10 +626,30 @@ func resolveBTFType(name string, progType ProgramType, attachType AttachType) (b target := match{progType, attachType} switch target { + case match{LSM, AttachLSMMac}: + var target btf.Func + err := findKernelType("bpf_lsm_"+name, &target) + if errors.Is(err, btf.ErrNotFound) { + return nil, &internal.UnsupportedFeatureError{ + Name: name + " LSM hook", + } + } + if err != nil { + return nil, fmt.Errorf("resolve BTF for LSM hook %s: %w", name, err) + } + + return &target, nil + case match{Tracing, AttachTraceIter}: var target btf.Func - if err := kernel.FindType("bpf_iter_"+name, &target); err != nil { - return nil, fmt.Errorf("can't resolve BTF for iterator %s: %w", name, err) + err := findKernelType("bpf_iter_"+name, &target) + if errors.Is(err, btf.ErrNotFound) { + return nil, &internal.UnsupportedFeatureError{ + Name: name + " iterator", + } + } + if err != nil { + return nil, fmt.Errorf("resolve BTF for iterator %s: %w", name, err) } return &target, nil diff --git a/vendor/github.com/cilium/ebpf/readme.md b/vendor/github.com/cilium/ebpf/readme.md index cc8e89c75a95..298db57c300b 100644 --- a/vendor/github.com/cilium/ebpf/readme.md +++ b/vendor/github.com/cilium/ebpf/readme.md @@ -1,10 +1,13 @@ eBPF ------- -[![](https://godoc.org/github.com/cilium/ebpf?status.svg)](https://godoc.org/github.com/cilium/ebpf) +[![PkgGoDev](https://pkg.go.dev/badge/github.com/cilium/ebpf)](https://pkg.go.dev/github.com/cilium/ebpf) eBPF is a pure Go library that provides utilities for loading, compiling, and debugging eBPF programs. It has minimal external dependencies and is intended to be used in long running processes. -[ebpf/asm](https://godoc.org/github.com/cilium/ebpf/asm) contains a basic assembler. +* [asm](https://pkg.go.dev/github.com/cilium/ebpf/asm) contains a basic assembler. +* [link](https://pkg.go.dev/github.com/cilium/ebpf/link) allows attaching eBPF to various hooks. +* [perf](https://pkg.go.dev/github.com/cilium/ebpf/perf) allows reading from a PERF_EVENT_ARRAY. +* [cmd/bpf2go](https://pkg.go.dev/github.com/cilium/ebpf/cmd/bpf2go) allows embedding eBPF in Go. The library is maintained by [Cloudflare](https://www.cloudflare.com) and [Cilium](https://www.cilium.io). Feel free to [join](https://cilium.herokuapp.com/) the [libbpf-go](https://cilium.slack.com/messages/libbpf-go) channel on Slack. @@ -20,6 +23,7 @@ right now**. Expect to update your code if you want to follow along. ## Useful resources -* [Cilium eBPF documentation](https://cilium.readthedocs.io/en/latest/bpf/#bpf-guide) (recommended) +* [eBPF.io](https://ebpf.io) (recommended) +* [Cilium eBPF documentation](https://docs.cilium.io/en/latest/bpf/#bpf-guide) (recommended) * [Linux documentation on BPF](http://elixir.free-electrons.com/linux/latest/source/Documentation/networking/filter.txt) * [eBPF features by Linux version](https://github.com/iovisor/bcc/blob/master/docs/kernel-versions.md) diff --git a/vendor/github.com/cilium/ebpf/run-tests.sh b/vendor/github.com/cilium/ebpf/run-tests.sh index c43a90ddd0d9..bd349f95160e 100644 --- a/vendor/github.com/cilium/ebpf/run-tests.sh +++ b/vendor/github.com/cilium/ebpf/run-tests.sh @@ -12,7 +12,8 @@ if [[ "${1:-}" = "--in-vm" ]]; then export CGO_ENABLED=0 export GOFLAGS=-mod=readonly export GOPATH=/run/go-path - export GOPROXY=file:///run/go-root/pkg/mod/cache/download + export GOPROXY=file:///run/go-path/pkg/mod/cache/download + export GOSUMDB=off export GOCACHE=/run/go-cache elfs="" @@ -21,7 +22,9 @@ if [[ "${1:-}" = "--in-vm" ]]; then fi echo Running tests... - /usr/local/bin/go test -coverprofile="$1/coverage.txt" -covermode=atomic -v -elfs "$elfs" ./... + # TestLibBPFCompat runs separately to pass the "-elfs" flag only for it: https://github.com/cilium/ebpf/pull/119 + go test -v -count 1 -run TestLibBPFCompat -elfs "$elfs" + go test -v -count 1 ./... touch "$1/success" exit 0 fi @@ -66,11 +69,12 @@ fi echo Testing on "${kernel_version}" $sudo virtme-run --kimg "${tmp_dir}/${kernel}" --memory 512M --pwd \ + --rw \ --rwdir=/run/input="${input}" \ --rwdir=/run/output="${output}" \ --rodir=/run/go-path="$(go env GOPATH)" \ --rwdir=/run/go-cache="$(go env GOCACHE)" \ - --script-sh "$(realpath "$0") --in-vm /run/output" \ + --script-sh "PATH=\"$PATH\" $(realpath "$0") --in-vm /run/output" \ --qemu-opts -smp 2 # need at least two CPUs for some tests if [[ ! -e "${output}/success" ]]; then @@ -78,11 +82,11 @@ if [[ ! -e "${output}/success" ]]; then exit 1 else echo "Test successful on ${kernel_version}" - if [[ -v CODECOV_TOKEN ]]; then - curl --fail -s https://codecov.io/bash > "${tmp_dir}/codecov.sh" - chmod +x "${tmp_dir}/codecov.sh" - "${tmp_dir}/codecov.sh" -f "${output}/coverage.txt" - fi +# if [[ -v CODECOV_TOKEN ]]; then +# curl --fail -s https://codecov.io/bash > "${tmp_dir}/codecov.sh" +# chmod +x "${tmp_dir}/codecov.sh" +# "${tmp_dir}/codecov.sh" -f "${output}/coverage.txt" +# fi fi $sudo rm -r "${input}" diff --git a/vendor/github.com/cilium/ebpf/syscalls.go b/vendor/github.com/cilium/ebpf/syscalls.go index 2b713d06a0c7..ff5c8e6c3c32 100644 --- a/vendor/github.com/cilium/ebpf/syscalls.go +++ b/vendor/github.com/cilium/ebpf/syscalls.go @@ -129,12 +129,6 @@ type bpfProgTestRunAttr struct { duration uint32 } -type bpfObjGetInfoByFDAttr struct { - fd uint32 - infoLen uint32 - info internal.Pointer // May be either bpfMapInfo or bpfProgInfo -} - type bpfGetFDByIDAttr struct { id uint32 next uint32 @@ -353,28 +347,9 @@ func bpfMapFreeze(m *internal.FD) error { return err } -func bpfGetObjectInfoByFD(fd *internal.FD, info unsafe.Pointer, size uintptr) error { - value, err := fd.Value() - if err != nil { - return err - } - - // available from 4.13 - attr := bpfObjGetInfoByFDAttr{ - fd: value, - infoLen: uint32(size), - info: internal.NewPointer(info), - } - _, err = internal.BPF(internal.BPF_OBJ_GET_INFO_BY_FD, unsafe.Pointer(&attr), unsafe.Sizeof(attr)) - if err != nil { - return fmt.Errorf("fd %d: %w", fd, err) - } - return nil -} - func bpfGetProgInfoByFD(fd *internal.FD) (*bpfProgInfo, error) { var info bpfProgInfo - if err := bpfGetObjectInfoByFD(fd, unsafe.Pointer(&info), unsafe.Sizeof(info)); err != nil { + if err := internal.BPFObjGetInfoByFD(fd, unsafe.Pointer(&info), unsafe.Sizeof(info)); err != nil { return nil, fmt.Errorf("can't get program info: %w", err) } return &info, nil @@ -382,7 +357,7 @@ func bpfGetProgInfoByFD(fd *internal.FD) (*bpfProgInfo, error) { func bpfGetMapInfoByFD(fd *internal.FD) (*bpfMapInfo, error) { var info bpfMapInfo - err := bpfGetObjectInfoByFD(fd, unsafe.Pointer(&info), unsafe.Sizeof(info)) + err := internal.BPFObjGetInfoByFD(fd, unsafe.Pointer(&info), unsafe.Sizeof(info)) if err != nil { return nil, fmt.Errorf("can't get map info: %w", err) } diff --git a/vendor/github.com/cilium/ebpf/types.go b/vendor/github.com/cilium/ebpf/types.go index 1ffc62123be2..dd82dfd4d431 100644 --- a/vendor/github.com/cilium/ebpf/types.go +++ b/vendor/github.com/cilium/ebpf/types.go @@ -1,6 +1,6 @@ package ebpf -//go:generate stringer -output types_string.go -type=MapType,ProgramType,AttachType +//go:generate stringer -output types_string.go -type=MapType,ProgramType,AttachType,PinType // MapType indicates the type map structure // that will be initialized in the kernel. @@ -96,60 +96,37 @@ type ProgramType uint32 // eBPF program types const ( - // Unrecognized program type UnspecifiedProgram ProgramType = iota - // SocketFilter socket or seccomp filter SocketFilter - // Kprobe program Kprobe - // SchedCLS traffic control shaper SchedCLS - // SchedACT routing control shaper SchedACT - // TracePoint program TracePoint - // XDP program XDP - // PerfEvent program PerfEvent - // CGroupSKB program CGroupSKB - // CGroupSock program CGroupSock - // LWTIn program LWTIn - // LWTOut program LWTOut - // LWTXmit program LWTXmit - // SockOps program SockOps - // SkSKB program SkSKB - // CGroupDevice program CGroupDevice - // SkMsg program SkMsg - // RawTracepoint program RawTracepoint - // CGroupSockAddr program CGroupSockAddr - // LWTSeg6Local program LWTSeg6Local - // LircMode2 program LircMode2 - // SkReuseport program SkReuseport - // FlowDissector program FlowDissector - // CGroupSysctl program CGroupSysctl - // RawTracepointWritable program RawTracepointWritable - // CGroupSockopt program CGroupSockopt - // Tracing program Tracing + StructOps + Extension + LSM + SkLookup ) // AttachType of the eBPF program, needed to differentiate allowed context accesses in @@ -190,7 +167,28 @@ const ( AttachModifyReturn AttachLSMMac AttachTraceIter + AttachCgroupInet4GetPeername + AttachCgroupInet6GetPeername + AttachCgroupInet4GetSockname + AttachCgroupInet6GetSockname + AttachXDPDevMap + AttachCgroupInetSockRelease + AttachXDPCPUMap + AttachSkLookup + AttachXDP ) // AttachFlags of the eBPF program used in BPF_PROG_ATTACH command type AttachFlags uint32 + +// PinType determines whether a map is pinned into a BPFFS. +type PinType int + +// Valid pin types. +// +// Mirrors enum libbpf_pin_type. +const ( + PinNone PinType = iota + // Pin an object by using its name as the filename. + PinByName +) diff --git a/vendor/github.com/cilium/ebpf/types_string.go b/vendor/github.com/cilium/ebpf/types_string.go index c7139578ec6f..976bd76be010 100644 --- a/vendor/github.com/cilium/ebpf/types_string.go +++ b/vendor/github.com/cilium/ebpf/types_string.go @@ -1,4 +1,4 @@ -// Code generated by "stringer -output types_string.go -type=MapType,ProgramType,AttachType"; DO NOT EDIT. +// Code generated by "stringer -output types_string.go -type=MapType,ProgramType,AttachType,PinType"; DO NOT EDIT. package ebpf @@ -77,11 +77,15 @@ func _() { _ = x[RawTracepointWritable-24] _ = x[CGroupSockopt-25] _ = x[Tracing-26] + _ = x[StructOps-27] + _ = x[Extension-28] + _ = x[LSM-29] + _ = x[SkLookup-30] } -const _ProgramType_name = "UnspecifiedProgramSocketFilterKprobeSchedCLSSchedACTTracePointXDPPerfEventCGroupSKBCGroupSockLWTInLWTOutLWTXmitSockOpsSkSKBCGroupDeviceSkMsgRawTracepointCGroupSockAddrLWTSeg6LocalLircMode2SkReuseportFlowDissectorCGroupSysctlRawTracepointWritableCGroupSockoptTracing" +const _ProgramType_name = "UnspecifiedProgramSocketFilterKprobeSchedCLSSchedACTTracePointXDPPerfEventCGroupSKBCGroupSockLWTInLWTOutLWTXmitSockOpsSkSKBCGroupDeviceSkMsgRawTracepointCGroupSockAddrLWTSeg6LocalLircMode2SkReuseportFlowDissectorCGroupSysctlRawTracepointWritableCGroupSockoptTracingStructOpsExtensionLSMSkLookup" -var _ProgramType_index = [...]uint16{0, 18, 30, 36, 44, 52, 62, 65, 74, 83, 93, 98, 104, 111, 118, 123, 135, 140, 153, 167, 179, 188, 199, 212, 224, 245, 258, 265} +var _ProgramType_index = [...]uint16{0, 18, 30, 36, 44, 52, 62, 65, 74, 83, 93, 98, 104, 111, 118, 123, 135, 140, 153, 167, 179, 188, 199, 212, 224, 245, 258, 265, 274, 283, 286, 294} func (i ProgramType) String() string { if i >= ProgramType(len(_ProgramType_index)-1) { @@ -123,11 +127,20 @@ func _() { _ = x[AttachModifyReturn-26] _ = x[AttachLSMMac-27] _ = x[AttachTraceIter-28] + _ = x[AttachCgroupInet4GetPeername-29] + _ = x[AttachCgroupInet6GetPeername-30] + _ = x[AttachCgroupInet4GetSockname-31] + _ = x[AttachCgroupInet6GetSockname-32] + _ = x[AttachXDPDevMap-33] + _ = x[AttachCgroupInetSockRelease-34] + _ = x[AttachXDPCPUMap-35] + _ = x[AttachSkLookup-36] + _ = x[AttachXDP-37] } -const _AttachType_name = "AttachNoneAttachCGroupInetEgressAttachCGroupInetSockCreateAttachCGroupSockOpsAttachSkSKBStreamParserAttachSkSKBStreamVerdictAttachCGroupDeviceAttachSkMsgVerdictAttachCGroupInet4BindAttachCGroupInet6BindAttachCGroupInet4ConnectAttachCGroupInet6ConnectAttachCGroupInet4PostBindAttachCGroupInet6PostBindAttachCGroupUDP4SendmsgAttachCGroupUDP6SendmsgAttachLircMode2AttachFlowDissectorAttachCGroupSysctlAttachCGroupUDP4RecvmsgAttachCGroupUDP6RecvmsgAttachCGroupGetsockoptAttachCGroupSetsockoptAttachTraceRawTpAttachTraceFEntryAttachTraceFExitAttachModifyReturnAttachLSMMacAttachTraceIter" +const _AttachType_name = "AttachNoneAttachCGroupInetEgressAttachCGroupInetSockCreateAttachCGroupSockOpsAttachSkSKBStreamParserAttachSkSKBStreamVerdictAttachCGroupDeviceAttachSkMsgVerdictAttachCGroupInet4BindAttachCGroupInet6BindAttachCGroupInet4ConnectAttachCGroupInet6ConnectAttachCGroupInet4PostBindAttachCGroupInet6PostBindAttachCGroupUDP4SendmsgAttachCGroupUDP6SendmsgAttachLircMode2AttachFlowDissectorAttachCGroupSysctlAttachCGroupUDP4RecvmsgAttachCGroupUDP6RecvmsgAttachCGroupGetsockoptAttachCGroupSetsockoptAttachTraceRawTpAttachTraceFEntryAttachTraceFExitAttachModifyReturnAttachLSMMacAttachTraceIterAttachCgroupInet4GetPeernameAttachCgroupInet6GetPeernameAttachCgroupInet4GetSocknameAttachCgroupInet6GetSocknameAttachXDPDevMapAttachCgroupInetSockReleaseAttachXDPCPUMapAttachSkLookupAttachXDP" -var _AttachType_index = [...]uint16{0, 10, 32, 58, 77, 100, 124, 142, 160, 181, 202, 226, 250, 275, 300, 323, 346, 361, 380, 398, 421, 444, 466, 488, 504, 521, 537, 555, 567, 582} +var _AttachType_index = [...]uint16{0, 10, 32, 58, 77, 100, 124, 142, 160, 181, 202, 226, 250, 275, 300, 323, 346, 361, 380, 398, 421, 444, 466, 488, 504, 521, 537, 555, 567, 582, 610, 638, 666, 694, 709, 736, 751, 765, 774} func (i AttachType) String() string { if i >= AttachType(len(_AttachType_index)-1) { @@ -135,3 +148,21 @@ func (i AttachType) String() string { } return _AttachType_name[_AttachType_index[i]:_AttachType_index[i+1]] } +func _() { + // An "invalid array index" compiler error signifies that the constant values have changed. + // Re-run the stringer command to generate them again. + var x [1]struct{} + _ = x[PinNone-0] + _ = x[PinByName-1] +} + +const _PinType_name = "PinNonePinByName" + +var _PinType_index = [...]uint8{0, 7, 16} + +func (i PinType) String() string { + if i < 0 || i >= PinType(len(_PinType_index)-1) { + return "PinType(" + strconv.FormatInt(int64(i), 10) + ")" + } + return _PinType_name[_PinType_index[i]:_PinType_index[i+1]] +} diff --git a/vendor/github.com/container-storage-interface/spec/lib/go/csi/csi.pb.go b/vendor/github.com/container-storage-interface/spec/lib/go/csi/csi.pb.go index e2e02d808ef7..35f59755d39f 100644 --- a/vendor/github.com/container-storage-interface/spec/lib/go/csi/csi.pb.go +++ b/vendor/github.com/container-storage-interface/spec/lib/go/csi/csi.pb.go @@ -205,6 +205,22 @@ const ( // Indicates the SP supports the // ListVolumesResponse.entry.published_nodes field ControllerServiceCapability_RPC_LIST_VOLUMES_PUBLISHED_NODES ControllerServiceCapability_RPC_Type = 10 + // Indicates that the Controller service can report volume + // conditions. + // An SP MAY implement `VolumeCondition` in only the Controller + // Plugin, only the Node Plugin, or both. + // If `VolumeCondition` is implemented in both the Controller and + // Node Plugins, it SHALL report from different perspectives. + // If for some reason Controller and Node Plugins report + // misaligned volume conditions, CO SHALL assume the worst case + // is the truth. + // Note that, for alpha, `VolumeCondition` is intended be + // informative for humans only, not for automation. + ControllerServiceCapability_RPC_VOLUME_CONDITION ControllerServiceCapability_RPC_Type = 11 + // Indicates the SP supports the ControllerGetVolume RPC. + // This enables COs to, for example, fetch per volume + // condition after a volume is provisioned. + ControllerServiceCapability_RPC_GET_VOLUME ControllerServiceCapability_RPC_Type = 12 ) var ControllerServiceCapability_RPC_Type_name = map[int32]string{ @@ -219,6 +235,8 @@ var ControllerServiceCapability_RPC_Type_name = map[int32]string{ 8: "PUBLISH_READONLY", 9: "EXPAND_VOLUME", 10: "LIST_VOLUMES_PUBLISHED_NODES", + 11: "VOLUME_CONDITION", + 12: "GET_VOLUME", } var ControllerServiceCapability_RPC_Type_value = map[string]int32{ @@ -233,6 +251,8 @@ var ControllerServiceCapability_RPC_Type_value = map[string]int32{ "PUBLISH_READONLY": 8, "EXPAND_VOLUME": 9, "LIST_VOLUMES_PUBLISHED_NODES": 10, + "VOLUME_CONDITION": 11, + "GET_VOLUME": 12, } func (x ControllerServiceCapability_RPC_Type) String() string { @@ -240,7 +260,7 @@ func (x ControllerServiceCapability_RPC_Type) String() string { } func (ControllerServiceCapability_RPC_Type) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_9cdb00adce470e01, []int{29, 0, 0} + return fileDescriptor_9cdb00adce470e01, []int{31, 0, 0} } type VolumeUsage_Unit int32 @@ -268,7 +288,7 @@ func (x VolumeUsage_Unit) String() string { } func (VolumeUsage_Unit) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_9cdb00adce470e01, []int{49, 0} + return fileDescriptor_9cdb00adce470e01, []int{51, 0} } type NodeServiceCapability_RPC_Type int32 @@ -282,6 +302,18 @@ const ( NodeServiceCapability_RPC_GET_VOLUME_STATS NodeServiceCapability_RPC_Type = 2 // See VolumeExpansion for details. NodeServiceCapability_RPC_EXPAND_VOLUME NodeServiceCapability_RPC_Type = 3 + // Indicates that the Node service can report volume conditions. + // An SP MAY implement `VolumeCondition` in only the Node + // Plugin, only the Controller Plugin, or both. + // If `VolumeCondition` is implemented in both the Node and + // Controller Plugins, it SHALL report from different + // perspectives. + // If for some reason Node and Controller Plugins report + // misaligned volume conditions, CO SHALL assume the worst case + // is the truth. + // Note that, for alpha, `VolumeCondition` is intended to be + // informative for humans only, not for automation. + NodeServiceCapability_RPC_VOLUME_CONDITION NodeServiceCapability_RPC_Type = 4 ) var NodeServiceCapability_RPC_Type_name = map[int32]string{ @@ -289,6 +321,7 @@ var NodeServiceCapability_RPC_Type_name = map[int32]string{ 1: "STAGE_UNSTAGE_VOLUME", 2: "GET_VOLUME_STATS", 3: "EXPAND_VOLUME", + 4: "VOLUME_CONDITION", } var NodeServiceCapability_RPC_Type_value = map[string]int32{ @@ -296,6 +329,7 @@ var NodeServiceCapability_RPC_Type_value = map[string]int32{ "STAGE_UNSTAGE_VOLUME": 1, "GET_VOLUME_STATS": 2, "EXPAND_VOLUME": 3, + "VOLUME_CONDITION": 4, } func (x NodeServiceCapability_RPC_Type) String() string { @@ -303,7 +337,7 @@ func (x NodeServiceCapability_RPC_Type) String() string { } func (NodeServiceCapability_RPC_Type) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_9cdb00adce470e01, []int{52, 0, 0} + return fileDescriptor_9cdb00adce470e01, []int{55, 0, 0} } type GetPluginInfoRequest struct { @@ -1831,9 +1865,10 @@ type ControllerPublishVolumeRequest struct { // request. This field is OPTIONAL. Refer to the // `Secrets Requirements` section on how to use this field. Secrets map[string]string `protobuf:"bytes,5,rep,name=secrets,proto3" json:"secrets,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - // Volume context as returned by CO in CreateVolumeRequest. This field - // is OPTIONAL and MUST match the volume_context of the volume - // identified by `volume_id`. + // Volume context as returned by SP in + // CreateVolumeResponse.Volume.volume_context. + // This field is OPTIONAL and MUST match the volume_context of the + // volume identified by `volume_id`. VolumeContext map[string]string `protobuf:"bytes,6,rep,name=volume_context,json=volumeContext,proto3" json:"volume_context,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -2059,9 +2094,10 @@ var xxx_messageInfo_ControllerUnpublishVolumeResponse proto.InternalMessageInfo type ValidateVolumeCapabilitiesRequest struct { // The ID of the volume to check. This field is REQUIRED. VolumeId string `protobuf:"bytes,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` - // Volume context as returned by CO in CreateVolumeRequest. This field - // is OPTIONAL and MUST match the volume_context of the volume - // identified by `volume_id`. + // Volume context as returned by SP in + // CreateVolumeResponse.Volume.volume_context. + // This field is OPTIONAL and MUST match the volume_context of the + // volume identified by `volume_id`. VolumeContext map[string]string `protobuf:"bytes,2,rep,name=volume_context,json=volumeContext,proto3" json:"volume_context,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // The capabilities that the CO wants to check for the volume. This // call SHALL return "confirmed" only if all the volume capabilities @@ -2385,10 +2421,15 @@ type ListVolumesResponse_VolumeStatus struct { // not interpret this field. // published_node_ids MAY include nodes not published to or // reported by the SP. The CO MUST be resilient to that. - PublishedNodeIds []string `protobuf:"bytes,1,rep,name=published_node_ids,json=publishedNodeIds,proto3" json:"published_node_ids,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + PublishedNodeIds []string `protobuf:"bytes,1,rep,name=published_node_ids,json=publishedNodeIds,proto3" json:"published_node_ids,omitempty"` + // Information about the current condition of the volume. + // This field is OPTIONAL. + // This field MUST be specified if the + // VOLUME_CONDITION controller capability is supported. + VolumeCondition *VolumeCondition `protobuf:"bytes,2,opt,name=volume_condition,json=volumeCondition,proto3" json:"volume_condition,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *ListVolumesResponse_VolumeStatus) Reset() { *m = ListVolumesResponse_VolumeStatus{} } @@ -2423,6 +2464,13 @@ func (m *ListVolumesResponse_VolumeStatus) GetPublishedNodeIds() []string { return nil } +func (m *ListVolumesResponse_VolumeStatus) GetVolumeCondition() *VolumeCondition { + if m != nil { + return m.VolumeCondition + } + return nil +} + type ListVolumesResponse_Entry struct { // This field is REQUIRED Volume *Volume `protobuf:"bytes,1,opt,name=volume,proto3" json:"volume,omitempty"` @@ -2474,6 +2522,156 @@ func (m *ListVolumesResponse_Entry) GetStatus() *ListVolumesResponse_VolumeStatu return nil } +type ControllerGetVolumeRequest struct { + // The ID of the volume to fetch current volume information for. + // This field is REQUIRED. + VolumeId string `protobuf:"bytes,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ControllerGetVolumeRequest) Reset() { *m = ControllerGetVolumeRequest{} } +func (m *ControllerGetVolumeRequest) String() string { return proto.CompactTextString(m) } +func (*ControllerGetVolumeRequest) ProtoMessage() {} +func (*ControllerGetVolumeRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_9cdb00adce470e01, []int{25} +} + +func (m *ControllerGetVolumeRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ControllerGetVolumeRequest.Unmarshal(m, b) +} +func (m *ControllerGetVolumeRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ControllerGetVolumeRequest.Marshal(b, m, deterministic) +} +func (m *ControllerGetVolumeRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ControllerGetVolumeRequest.Merge(m, src) +} +func (m *ControllerGetVolumeRequest) XXX_Size() int { + return xxx_messageInfo_ControllerGetVolumeRequest.Size(m) +} +func (m *ControllerGetVolumeRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ControllerGetVolumeRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_ControllerGetVolumeRequest proto.InternalMessageInfo + +func (m *ControllerGetVolumeRequest) GetVolumeId() string { + if m != nil { + return m.VolumeId + } + return "" +} + +type ControllerGetVolumeResponse struct { + // This field is REQUIRED + Volume *Volume `protobuf:"bytes,1,opt,name=volume,proto3" json:"volume,omitempty"` + // This field is REQUIRED. + Status *ControllerGetVolumeResponse_VolumeStatus `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ControllerGetVolumeResponse) Reset() { *m = ControllerGetVolumeResponse{} } +func (m *ControllerGetVolumeResponse) String() string { return proto.CompactTextString(m) } +func (*ControllerGetVolumeResponse) ProtoMessage() {} +func (*ControllerGetVolumeResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_9cdb00adce470e01, []int{26} +} + +func (m *ControllerGetVolumeResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ControllerGetVolumeResponse.Unmarshal(m, b) +} +func (m *ControllerGetVolumeResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ControllerGetVolumeResponse.Marshal(b, m, deterministic) +} +func (m *ControllerGetVolumeResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_ControllerGetVolumeResponse.Merge(m, src) +} +func (m *ControllerGetVolumeResponse) XXX_Size() int { + return xxx_messageInfo_ControllerGetVolumeResponse.Size(m) +} +func (m *ControllerGetVolumeResponse) XXX_DiscardUnknown() { + xxx_messageInfo_ControllerGetVolumeResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_ControllerGetVolumeResponse proto.InternalMessageInfo + +func (m *ControllerGetVolumeResponse) GetVolume() *Volume { + if m != nil { + return m.Volume + } + return nil +} + +func (m *ControllerGetVolumeResponse) GetStatus() *ControllerGetVolumeResponse_VolumeStatus { + if m != nil { + return m.Status + } + return nil +} + +type ControllerGetVolumeResponse_VolumeStatus struct { + // A list of all the `node_id` of nodes that this volume is + // controller published on. + // This field is OPTIONAL. + // This field MUST be specified if the PUBLISH_UNPUBLISH_VOLUME + // controller capability is supported. + // published_node_ids MAY include nodes not published to or + // reported by the SP. The CO MUST be resilient to that. + PublishedNodeIds []string `protobuf:"bytes,1,rep,name=published_node_ids,json=publishedNodeIds,proto3" json:"published_node_ids,omitempty"` + // Information about the current condition of the volume. + // This field is OPTIONAL. + // This field MUST be specified if the + // VOLUME_CONDITION controller capability is supported. + VolumeCondition *VolumeCondition `protobuf:"bytes,2,opt,name=volume_condition,json=volumeCondition,proto3" json:"volume_condition,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ControllerGetVolumeResponse_VolumeStatus) Reset() { + *m = ControllerGetVolumeResponse_VolumeStatus{} +} +func (m *ControllerGetVolumeResponse_VolumeStatus) String() string { return proto.CompactTextString(m) } +func (*ControllerGetVolumeResponse_VolumeStatus) ProtoMessage() {} +func (*ControllerGetVolumeResponse_VolumeStatus) Descriptor() ([]byte, []int) { + return fileDescriptor_9cdb00adce470e01, []int{26, 0} +} + +func (m *ControllerGetVolumeResponse_VolumeStatus) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ControllerGetVolumeResponse_VolumeStatus.Unmarshal(m, b) +} +func (m *ControllerGetVolumeResponse_VolumeStatus) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ControllerGetVolumeResponse_VolumeStatus.Marshal(b, m, deterministic) +} +func (m *ControllerGetVolumeResponse_VolumeStatus) XXX_Merge(src proto.Message) { + xxx_messageInfo_ControllerGetVolumeResponse_VolumeStatus.Merge(m, src) +} +func (m *ControllerGetVolumeResponse_VolumeStatus) XXX_Size() int { + return xxx_messageInfo_ControllerGetVolumeResponse_VolumeStatus.Size(m) +} +func (m *ControllerGetVolumeResponse_VolumeStatus) XXX_DiscardUnknown() { + xxx_messageInfo_ControllerGetVolumeResponse_VolumeStatus.DiscardUnknown(m) +} + +var xxx_messageInfo_ControllerGetVolumeResponse_VolumeStatus proto.InternalMessageInfo + +func (m *ControllerGetVolumeResponse_VolumeStatus) GetPublishedNodeIds() []string { + if m != nil { + return m.PublishedNodeIds + } + return nil +} + +func (m *ControllerGetVolumeResponse_VolumeStatus) GetVolumeCondition() *VolumeCondition { + if m != nil { + return m.VolumeCondition + } + return nil +} + type GetCapacityRequest struct { // If specified, the Plugin SHALL report the capacity of the storage // that can be used to provision volumes that satisfy ALL of the @@ -2502,7 +2700,7 @@ func (m *GetCapacityRequest) Reset() { *m = GetCapacityRequest{} } func (m *GetCapacityRequest) String() string { return proto.CompactTextString(m) } func (*GetCapacityRequest) ProtoMessage() {} func (*GetCapacityRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9cdb00adce470e01, []int{25} + return fileDescriptor_9cdb00adce470e01, []int{27} } func (m *GetCapacityRequest) XXX_Unmarshal(b []byte) error { @@ -2561,7 +2759,7 @@ func (m *GetCapacityResponse) Reset() { *m = GetCapacityResponse{} } func (m *GetCapacityResponse) String() string { return proto.CompactTextString(m) } func (*GetCapacityResponse) ProtoMessage() {} func (*GetCapacityResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_9cdb00adce470e01, []int{26} + return fileDescriptor_9cdb00adce470e01, []int{28} } func (m *GetCapacityResponse) XXX_Unmarshal(b []byte) error { @@ -2599,7 +2797,7 @@ func (m *ControllerGetCapabilitiesRequest) Reset() { *m = ControllerGetC func (m *ControllerGetCapabilitiesRequest) String() string { return proto.CompactTextString(m) } func (*ControllerGetCapabilitiesRequest) ProtoMessage() {} func (*ControllerGetCapabilitiesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9cdb00adce470e01, []int{27} + return fileDescriptor_9cdb00adce470e01, []int{29} } func (m *ControllerGetCapabilitiesRequest) XXX_Unmarshal(b []byte) error { @@ -2633,7 +2831,7 @@ func (m *ControllerGetCapabilitiesResponse) Reset() { *m = ControllerGet func (m *ControllerGetCapabilitiesResponse) String() string { return proto.CompactTextString(m) } func (*ControllerGetCapabilitiesResponse) ProtoMessage() {} func (*ControllerGetCapabilitiesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_9cdb00adce470e01, []int{28} + return fileDescriptor_9cdb00adce470e01, []int{30} } func (m *ControllerGetCapabilitiesResponse) XXX_Unmarshal(b []byte) error { @@ -2675,7 +2873,7 @@ func (m *ControllerServiceCapability) Reset() { *m = ControllerServiceCa func (m *ControllerServiceCapability) String() string { return proto.CompactTextString(m) } func (*ControllerServiceCapability) ProtoMessage() {} func (*ControllerServiceCapability) Descriptor() ([]byte, []int) { - return fileDescriptor_9cdb00adce470e01, []int{29} + return fileDescriptor_9cdb00adce470e01, []int{31} } func (m *ControllerServiceCapability) XXX_Unmarshal(b []byte) error { @@ -2738,7 +2936,7 @@ func (m *ControllerServiceCapability_RPC) Reset() { *m = ControllerServi func (m *ControllerServiceCapability_RPC) String() string { return proto.CompactTextString(m) } func (*ControllerServiceCapability_RPC) ProtoMessage() {} func (*ControllerServiceCapability_RPC) Descriptor() ([]byte, []int) { - return fileDescriptor_9cdb00adce470e01, []int{29, 0} + return fileDescriptor_9cdb00adce470e01, []int{31, 0} } func (m *ControllerServiceCapability_RPC) XXX_Unmarshal(b []byte) error { @@ -2801,7 +2999,7 @@ func (m *CreateSnapshotRequest) Reset() { *m = CreateSnapshotRequest{} } func (m *CreateSnapshotRequest) String() string { return proto.CompactTextString(m) } func (*CreateSnapshotRequest) ProtoMessage() {} func (*CreateSnapshotRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9cdb00adce470e01, []int{30} + return fileDescriptor_9cdb00adce470e01, []int{32} } func (m *CreateSnapshotRequest) XXX_Unmarshal(b []byte) error { @@ -2864,7 +3062,7 @@ func (m *CreateSnapshotResponse) Reset() { *m = CreateSnapshotResponse{} func (m *CreateSnapshotResponse) String() string { return proto.CompactTextString(m) } func (*CreateSnapshotResponse) ProtoMessage() {} func (*CreateSnapshotResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_9cdb00adce470e01, []int{31} + return fileDescriptor_9cdb00adce470e01, []int{33} } func (m *CreateSnapshotResponse) XXX_Unmarshal(b []byte) error { @@ -2932,7 +3130,7 @@ func (m *Snapshot) Reset() { *m = Snapshot{} } func (m *Snapshot) String() string { return proto.CompactTextString(m) } func (*Snapshot) ProtoMessage() {} func (*Snapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_9cdb00adce470e01, []int{32} + return fileDescriptor_9cdb00adce470e01, []int{34} } func (m *Snapshot) XXX_Unmarshal(b []byte) error { @@ -3005,7 +3203,7 @@ func (m *DeleteSnapshotRequest) Reset() { *m = DeleteSnapshotRequest{} } func (m *DeleteSnapshotRequest) String() string { return proto.CompactTextString(m) } func (*DeleteSnapshotRequest) ProtoMessage() {} func (*DeleteSnapshotRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9cdb00adce470e01, []int{33} + return fileDescriptor_9cdb00adce470e01, []int{35} } func (m *DeleteSnapshotRequest) XXX_Unmarshal(b []byte) error { @@ -3050,7 +3248,7 @@ func (m *DeleteSnapshotResponse) Reset() { *m = DeleteSnapshotResponse{} func (m *DeleteSnapshotResponse) String() string { return proto.CompactTextString(m) } func (*DeleteSnapshotResponse) ProtoMessage() {} func (*DeleteSnapshotResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_9cdb00adce470e01, []int{34} + return fileDescriptor_9cdb00adce470e01, []int{36} } func (m *DeleteSnapshotResponse) XXX_Unmarshal(b []byte) error { @@ -3110,7 +3308,7 @@ func (m *ListSnapshotsRequest) Reset() { *m = ListSnapshotsRequest{} } func (m *ListSnapshotsRequest) String() string { return proto.CompactTextString(m) } func (*ListSnapshotsRequest) ProtoMessage() {} func (*ListSnapshotsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9cdb00adce470e01, []int{35} + return fileDescriptor_9cdb00adce470e01, []int{37} } func (m *ListSnapshotsRequest) XXX_Unmarshal(b []byte) error { @@ -3184,7 +3382,7 @@ func (m *ListSnapshotsResponse) Reset() { *m = ListSnapshotsResponse{} } func (m *ListSnapshotsResponse) String() string { return proto.CompactTextString(m) } func (*ListSnapshotsResponse) ProtoMessage() {} func (*ListSnapshotsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_9cdb00adce470e01, []int{36} + return fileDescriptor_9cdb00adce470e01, []int{38} } func (m *ListSnapshotsResponse) XXX_Unmarshal(b []byte) error { @@ -3230,7 +3428,7 @@ func (m *ListSnapshotsResponse_Entry) Reset() { *m = ListSnapshotsRespon func (m *ListSnapshotsResponse_Entry) String() string { return proto.CompactTextString(m) } func (*ListSnapshotsResponse_Entry) ProtoMessage() {} func (*ListSnapshotsResponse_Entry) Descriptor() ([]byte, []int) { - return fileDescriptor_9cdb00adce470e01, []int{36, 0} + return fileDescriptor_9cdb00adce470e01, []int{38, 0} } func (m *ListSnapshotsResponse_Entry) XXX_Unmarshal(b []byte) error { @@ -3284,7 +3482,7 @@ func (m *ControllerExpandVolumeRequest) Reset() { *m = ControllerExpandV func (m *ControllerExpandVolumeRequest) String() string { return proto.CompactTextString(m) } func (*ControllerExpandVolumeRequest) ProtoMessage() {} func (*ControllerExpandVolumeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9cdb00adce470e01, []int{37} + return fileDescriptor_9cdb00adce470e01, []int{39} } func (m *ControllerExpandVolumeRequest) XXX_Unmarshal(b []byte) error { @@ -3349,7 +3547,7 @@ func (m *ControllerExpandVolumeResponse) Reset() { *m = ControllerExpand func (m *ControllerExpandVolumeResponse) String() string { return proto.CompactTextString(m) } func (*ControllerExpandVolumeResponse) ProtoMessage() {} func (*ControllerExpandVolumeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_9cdb00adce470e01, []int{38} + return fileDescriptor_9cdb00adce470e01, []int{40} } func (m *ControllerExpandVolumeResponse) XXX_Unmarshal(b []byte) error { @@ -3412,9 +3610,10 @@ type NodeStageVolumeRequest struct { // This field is OPTIONAL. Refer to the `Secrets Requirements` // section on how to use this field. Secrets map[string]string `protobuf:"bytes,5,rep,name=secrets,proto3" json:"secrets,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - // Volume context as returned by CO in CreateVolumeRequest. This field - // is OPTIONAL and MUST match the volume_context of the volume - // identified by `volume_id`. + // Volume context as returned by SP in + // CreateVolumeResponse.Volume.volume_context. + // This field is OPTIONAL and MUST match the volume_context of the + // volume identified by `volume_id`. VolumeContext map[string]string `protobuf:"bytes,6,rep,name=volume_context,json=volumeContext,proto3" json:"volume_context,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -3425,7 +3624,7 @@ func (m *NodeStageVolumeRequest) Reset() { *m = NodeStageVolumeRequest{} func (m *NodeStageVolumeRequest) String() string { return proto.CompactTextString(m) } func (*NodeStageVolumeRequest) ProtoMessage() {} func (*NodeStageVolumeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9cdb00adce470e01, []int{39} + return fileDescriptor_9cdb00adce470e01, []int{41} } func (m *NodeStageVolumeRequest) XXX_Unmarshal(b []byte) error { @@ -3498,7 +3697,7 @@ func (m *NodeStageVolumeResponse) Reset() { *m = NodeStageVolumeResponse func (m *NodeStageVolumeResponse) String() string { return proto.CompactTextString(m) } func (*NodeStageVolumeResponse) ProtoMessage() {} func (*NodeStageVolumeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_9cdb00adce470e01, []int{40} + return fileDescriptor_9cdb00adce470e01, []int{42} } func (m *NodeStageVolumeResponse) XXX_Unmarshal(b []byte) error { @@ -3535,7 +3734,7 @@ func (m *NodeUnstageVolumeRequest) Reset() { *m = NodeUnstageVolumeReque func (m *NodeUnstageVolumeRequest) String() string { return proto.CompactTextString(m) } func (*NodeUnstageVolumeRequest) ProtoMessage() {} func (*NodeUnstageVolumeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9cdb00adce470e01, []int{41} + return fileDescriptor_9cdb00adce470e01, []int{43} } func (m *NodeUnstageVolumeRequest) XXX_Unmarshal(b []byte) error { @@ -3580,7 +3779,7 @@ func (m *NodeUnstageVolumeResponse) Reset() { *m = NodeUnstageVolumeResp func (m *NodeUnstageVolumeResponse) String() string { return proto.CompactTextString(m) } func (*NodeUnstageVolumeResponse) ProtoMessage() {} func (*NodeUnstageVolumeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_9cdb00adce470e01, []int{42} + return fileDescriptor_9cdb00adce470e01, []int{44} } func (m *NodeUnstageVolumeResponse) XXX_Unmarshal(b []byte) error { @@ -3642,9 +3841,10 @@ type NodePublishVolumeRequest struct { // This field is OPTIONAL. Refer to the `Secrets Requirements` // section on how to use this field. Secrets map[string]string `protobuf:"bytes,7,rep,name=secrets,proto3" json:"secrets,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - // Volume context as returned by CO in CreateVolumeRequest. This field - // is OPTIONAL and MUST match the volume_context of the volume - // identified by `volume_id`. + // Volume context as returned by SP in + // CreateVolumeResponse.Volume.volume_context. + // This field is OPTIONAL and MUST match the volume_context of the + // volume identified by `volume_id`. VolumeContext map[string]string `protobuf:"bytes,8,rep,name=volume_context,json=volumeContext,proto3" json:"volume_context,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -3655,7 +3855,7 @@ func (m *NodePublishVolumeRequest) Reset() { *m = NodePublishVolumeReque func (m *NodePublishVolumeRequest) String() string { return proto.CompactTextString(m) } func (*NodePublishVolumeRequest) ProtoMessage() {} func (*NodePublishVolumeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9cdb00adce470e01, []int{43} + return fileDescriptor_9cdb00adce470e01, []int{45} } func (m *NodePublishVolumeRequest) XXX_Unmarshal(b []byte) error { @@ -3742,7 +3942,7 @@ func (m *NodePublishVolumeResponse) Reset() { *m = NodePublishVolumeResp func (m *NodePublishVolumeResponse) String() string { return proto.CompactTextString(m) } func (*NodePublishVolumeResponse) ProtoMessage() {} func (*NodePublishVolumeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_9cdb00adce470e01, []int{44} + return fileDescriptor_9cdb00adce470e01, []int{46} } func (m *NodePublishVolumeResponse) XXX_Unmarshal(b []byte) error { @@ -3780,7 +3980,7 @@ func (m *NodeUnpublishVolumeRequest) Reset() { *m = NodeUnpublishVolumeR func (m *NodeUnpublishVolumeRequest) String() string { return proto.CompactTextString(m) } func (*NodeUnpublishVolumeRequest) ProtoMessage() {} func (*NodeUnpublishVolumeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9cdb00adce470e01, []int{45} + return fileDescriptor_9cdb00adce470e01, []int{47} } func (m *NodeUnpublishVolumeRequest) XXX_Unmarshal(b []byte) error { @@ -3825,7 +4025,7 @@ func (m *NodeUnpublishVolumeResponse) Reset() { *m = NodeUnpublishVolume func (m *NodeUnpublishVolumeResponse) String() string { return proto.CompactTextString(m) } func (*NodeUnpublishVolumeResponse) ProtoMessage() {} func (*NodeUnpublishVolumeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_9cdb00adce470e01, []int{46} + return fileDescriptor_9cdb00adce470e01, []int{48} } func (m *NodeUnpublishVolumeResponse) XXX_Unmarshal(b []byte) error { @@ -3870,7 +4070,7 @@ func (m *NodeGetVolumeStatsRequest) Reset() { *m = NodeGetVolumeStatsReq func (m *NodeGetVolumeStatsRequest) String() string { return proto.CompactTextString(m) } func (*NodeGetVolumeStatsRequest) ProtoMessage() {} func (*NodeGetVolumeStatsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9cdb00adce470e01, []int{47} + return fileDescriptor_9cdb00adce470e01, []int{49} } func (m *NodeGetVolumeStatsRequest) XXX_Unmarshal(b []byte) error { @@ -3914,17 +4114,22 @@ func (m *NodeGetVolumeStatsRequest) GetStagingTargetPath() string { type NodeGetVolumeStatsResponse struct { // This field is OPTIONAL. - Usage []*VolumeUsage `protobuf:"bytes,1,rep,name=usage,proto3" json:"usage,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Usage []*VolumeUsage `protobuf:"bytes,1,rep,name=usage,proto3" json:"usage,omitempty"` + // Information about the current condition of the volume. + // This field is OPTIONAL. + // This field MUST be specified if the VOLUME_CONDITION node + // capability is supported. + VolumeCondition *VolumeCondition `protobuf:"bytes,2,opt,name=volume_condition,json=volumeCondition,proto3" json:"volume_condition,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *NodeGetVolumeStatsResponse) Reset() { *m = NodeGetVolumeStatsResponse{} } func (m *NodeGetVolumeStatsResponse) String() string { return proto.CompactTextString(m) } func (*NodeGetVolumeStatsResponse) ProtoMessage() {} func (*NodeGetVolumeStatsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_9cdb00adce470e01, []int{48} + return fileDescriptor_9cdb00adce470e01, []int{50} } func (m *NodeGetVolumeStatsResponse) XXX_Unmarshal(b []byte) error { @@ -3952,6 +4157,13 @@ func (m *NodeGetVolumeStatsResponse) GetUsage() []*VolumeUsage { return nil } +func (m *NodeGetVolumeStatsResponse) GetVolumeCondition() *VolumeCondition { + if m != nil { + return m.VolumeCondition + } + return nil +} + type VolumeUsage struct { // The available capacity in specified Unit. This field is OPTIONAL. // The value of this field MUST NOT be negative. @@ -3973,7 +4185,7 @@ func (m *VolumeUsage) Reset() { *m = VolumeUsage{} } func (m *VolumeUsage) String() string { return proto.CompactTextString(m) } func (*VolumeUsage) ProtoMessage() {} func (*VolumeUsage) Descriptor() ([]byte, []int) { - return fileDescriptor_9cdb00adce470e01, []int{49} + return fileDescriptor_9cdb00adce470e01, []int{51} } func (m *VolumeUsage) XXX_Unmarshal(b []byte) error { @@ -4022,6 +4234,59 @@ func (m *VolumeUsage) GetUnit() VolumeUsage_Unit { return VolumeUsage_UNKNOWN } +// VolumeCondition represents the current condition of a volume. +type VolumeCondition struct { + // Normal volumes are available for use and operating optimally. + // An abnormal volume does not meet these criteria. + // This field is REQUIRED. + Abnormal bool `protobuf:"varint,1,opt,name=abnormal,proto3" json:"abnormal,omitempty"` + // The message describing the condition of the volume. + // This field is REQUIRED. + Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *VolumeCondition) Reset() { *m = VolumeCondition{} } +func (m *VolumeCondition) String() string { return proto.CompactTextString(m) } +func (*VolumeCondition) ProtoMessage() {} +func (*VolumeCondition) Descriptor() ([]byte, []int) { + return fileDescriptor_9cdb00adce470e01, []int{52} +} + +func (m *VolumeCondition) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_VolumeCondition.Unmarshal(m, b) +} +func (m *VolumeCondition) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_VolumeCondition.Marshal(b, m, deterministic) +} +func (m *VolumeCondition) XXX_Merge(src proto.Message) { + xxx_messageInfo_VolumeCondition.Merge(m, src) +} +func (m *VolumeCondition) XXX_Size() int { + return xxx_messageInfo_VolumeCondition.Size(m) +} +func (m *VolumeCondition) XXX_DiscardUnknown() { + xxx_messageInfo_VolumeCondition.DiscardUnknown(m) +} + +var xxx_messageInfo_VolumeCondition proto.InternalMessageInfo + +func (m *VolumeCondition) GetAbnormal() bool { + if m != nil { + return m.Abnormal + } + return false +} + +func (m *VolumeCondition) GetMessage() string { + if m != nil { + return m.Message + } + return "" +} + type NodeGetCapabilitiesRequest struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -4032,7 +4297,7 @@ func (m *NodeGetCapabilitiesRequest) Reset() { *m = NodeGetCapabilitiesR func (m *NodeGetCapabilitiesRequest) String() string { return proto.CompactTextString(m) } func (*NodeGetCapabilitiesRequest) ProtoMessage() {} func (*NodeGetCapabilitiesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9cdb00adce470e01, []int{50} + return fileDescriptor_9cdb00adce470e01, []int{53} } func (m *NodeGetCapabilitiesRequest) XXX_Unmarshal(b []byte) error { @@ -4066,7 +4331,7 @@ func (m *NodeGetCapabilitiesResponse) Reset() { *m = NodeGetCapabilities func (m *NodeGetCapabilitiesResponse) String() string { return proto.CompactTextString(m) } func (*NodeGetCapabilitiesResponse) ProtoMessage() {} func (*NodeGetCapabilitiesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_9cdb00adce470e01, []int{51} + return fileDescriptor_9cdb00adce470e01, []int{54} } func (m *NodeGetCapabilitiesResponse) XXX_Unmarshal(b []byte) error { @@ -4108,7 +4373,7 @@ func (m *NodeServiceCapability) Reset() { *m = NodeServiceCapability{} } func (m *NodeServiceCapability) String() string { return proto.CompactTextString(m) } func (*NodeServiceCapability) ProtoMessage() {} func (*NodeServiceCapability) Descriptor() ([]byte, []int) { - return fileDescriptor_9cdb00adce470e01, []int{52} + return fileDescriptor_9cdb00adce470e01, []int{55} } func (m *NodeServiceCapability) XXX_Unmarshal(b []byte) error { @@ -4171,7 +4436,7 @@ func (m *NodeServiceCapability_RPC) Reset() { *m = NodeServiceCapability func (m *NodeServiceCapability_RPC) String() string { return proto.CompactTextString(m) } func (*NodeServiceCapability_RPC) ProtoMessage() {} func (*NodeServiceCapability_RPC) Descriptor() ([]byte, []int) { - return fileDescriptor_9cdb00adce470e01, []int{52, 0} + return fileDescriptor_9cdb00adce470e01, []int{55, 0} } func (m *NodeServiceCapability_RPC) XXX_Unmarshal(b []byte) error { @@ -4209,7 +4474,7 @@ func (m *NodeGetInfoRequest) Reset() { *m = NodeGetInfoRequest{} } func (m *NodeGetInfoRequest) String() string { return proto.CompactTextString(m) } func (*NodeGetInfoRequest) ProtoMessage() {} func (*NodeGetInfoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9cdb00adce470e01, []int{53} + return fileDescriptor_9cdb00adce470e01, []int{56} } func (m *NodeGetInfoRequest) XXX_Unmarshal(b []byte) error { @@ -4273,7 +4538,7 @@ func (m *NodeGetInfoResponse) Reset() { *m = NodeGetInfoResponse{} } func (m *NodeGetInfoResponse) String() string { return proto.CompactTextString(m) } func (*NodeGetInfoResponse) ProtoMessage() {} func (*NodeGetInfoResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_9cdb00adce470e01, []int{54} + return fileDescriptor_9cdb00adce470e01, []int{57} } func (m *NodeGetInfoResponse) XXX_Unmarshal(b []byte) error { @@ -4352,7 +4617,7 @@ func (m *NodeExpandVolumeRequest) Reset() { *m = NodeExpandVolumeRequest func (m *NodeExpandVolumeRequest) String() string { return proto.CompactTextString(m) } func (*NodeExpandVolumeRequest) ProtoMessage() {} func (*NodeExpandVolumeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9cdb00adce470e01, []int{55} + return fileDescriptor_9cdb00adce470e01, []int{58} } func (m *NodeExpandVolumeRequest) XXX_Unmarshal(b []byte) error { @@ -4420,7 +4685,7 @@ func (m *NodeExpandVolumeResponse) Reset() { *m = NodeExpandVolumeRespon func (m *NodeExpandVolumeResponse) String() string { return proto.CompactTextString(m) } func (*NodeExpandVolumeResponse) ProtoMessage() {} func (*NodeExpandVolumeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_9cdb00adce470e01, []int{56} + return fileDescriptor_9cdb00adce470e01, []int{59} } func (m *NodeExpandVolumeResponse) XXX_Unmarshal(b []byte) error { @@ -4448,6 +4713,24 @@ func (m *NodeExpandVolumeResponse) GetCapacityBytes() int64 { return 0 } +var E_AlphaEnum = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.EnumOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 1060, + Name: "csi.v1.alpha_enum", + Tag: "varint,1060,opt,name=alpha_enum", + Filename: "github.com/container-storage-interface/spec/csi.proto", +} + +var E_AlphaEnumValue = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.EnumValueOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 1060, + Name: "csi.v1.alpha_enum_value", + Tag: "varint,1060,opt,name=alpha_enum_value", + Filename: "github.com/container-storage-interface/spec/csi.proto", +} + var E_CsiSecret = &proto.ExtensionDesc{ ExtendedType: (*descriptor.FieldOptions)(nil), ExtensionType: (*bool)(nil), @@ -4457,6 +4740,42 @@ var E_CsiSecret = &proto.ExtensionDesc{ Filename: "github.com/container-storage-interface/spec/csi.proto", } +var E_AlphaField = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FieldOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 1060, + Name: "csi.v1.alpha_field", + Tag: "varint,1060,opt,name=alpha_field", + Filename: "github.com/container-storage-interface/spec/csi.proto", +} + +var E_AlphaMessage = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.MessageOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 1060, + Name: "csi.v1.alpha_message", + Tag: "varint,1060,opt,name=alpha_message", + Filename: "github.com/container-storage-interface/spec/csi.proto", +} + +var E_AlphaMethod = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.MethodOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 1060, + Name: "csi.v1.alpha_method", + Tag: "varint,1060,opt,name=alpha_method", + Filename: "github.com/container-storage-interface/spec/csi.proto", +} + +var E_AlphaService = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.ServiceOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 1060, + Name: "csi.v1.alpha_service", + Tag: "varint,1060,opt,name=alpha_service", + Filename: "github.com/container-storage-interface/spec/csi.proto", +} + func init() { proto.RegisterEnum("csi.v1.PluginCapability_Service_Type", PluginCapability_Service_Type_name, PluginCapability_Service_Type_value) proto.RegisterEnum("csi.v1.PluginCapability_VolumeExpansion_Type", PluginCapability_VolumeExpansion_Type_name, PluginCapability_VolumeExpansion_Type_value) @@ -4514,6 +4833,9 @@ func init() { proto.RegisterType((*ListVolumesResponse)(nil), "csi.v1.ListVolumesResponse") proto.RegisterType((*ListVolumesResponse_VolumeStatus)(nil), "csi.v1.ListVolumesResponse.VolumeStatus") proto.RegisterType((*ListVolumesResponse_Entry)(nil), "csi.v1.ListVolumesResponse.Entry") + proto.RegisterType((*ControllerGetVolumeRequest)(nil), "csi.v1.ControllerGetVolumeRequest") + proto.RegisterType((*ControllerGetVolumeResponse)(nil), "csi.v1.ControllerGetVolumeResponse") + proto.RegisterType((*ControllerGetVolumeResponse_VolumeStatus)(nil), "csi.v1.ControllerGetVolumeResponse.VolumeStatus") proto.RegisterType((*GetCapacityRequest)(nil), "csi.v1.GetCapacityRequest") proto.RegisterMapType((map[string]string)(nil), "csi.v1.GetCapacityRequest.ParametersEntry") proto.RegisterType((*GetCapacityResponse)(nil), "csi.v1.GetCapacityResponse") @@ -4553,6 +4875,7 @@ func init() { proto.RegisterType((*NodeGetVolumeStatsRequest)(nil), "csi.v1.NodeGetVolumeStatsRequest") proto.RegisterType((*NodeGetVolumeStatsResponse)(nil), "csi.v1.NodeGetVolumeStatsResponse") proto.RegisterType((*VolumeUsage)(nil), "csi.v1.VolumeUsage") + proto.RegisterType((*VolumeCondition)(nil), "csi.v1.VolumeCondition") proto.RegisterType((*NodeGetCapabilitiesRequest)(nil), "csi.v1.NodeGetCapabilitiesRequest") proto.RegisterType((*NodeGetCapabilitiesResponse)(nil), "csi.v1.NodeGetCapabilitiesResponse") proto.RegisterType((*NodeServiceCapability)(nil), "csi.v1.NodeServiceCapability") @@ -4561,7 +4884,13 @@ func init() { proto.RegisterType((*NodeGetInfoResponse)(nil), "csi.v1.NodeGetInfoResponse") proto.RegisterType((*NodeExpandVolumeRequest)(nil), "csi.v1.NodeExpandVolumeRequest") proto.RegisterType((*NodeExpandVolumeResponse)(nil), "csi.v1.NodeExpandVolumeResponse") + proto.RegisterExtension(E_AlphaEnum) + proto.RegisterExtension(E_AlphaEnumValue) proto.RegisterExtension(E_CsiSecret) + proto.RegisterExtension(E_AlphaField) + proto.RegisterExtension(E_AlphaMessage) + proto.RegisterExtension(E_AlphaMethod) + proto.RegisterExtension(E_AlphaService) } func init() { @@ -4569,218 +4898,236 @@ func init() { } var fileDescriptor_9cdb00adce470e01 = []byte{ - // 3366 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x5a, 0x4d, 0x70, 0xdb, 0xc6, - 0xf5, 0x27, 0xf8, 0x25, 0xea, 0xe9, 0xc3, 0xf4, 0xea, 0xc3, 0x34, 0x24, 0xd9, 0x32, 0x1c, 0x3b, - 0xb2, 0x63, 0xd3, 0xff, 0x28, 0x71, 0xe6, 0x1f, 0x5b, 0x69, 0x43, 0x51, 0xb4, 0xc4, 0x98, 0xa6, - 0x14, 0x90, 0x92, 0x63, 0xb7, 0x19, 0x04, 0x22, 0x57, 0x34, 0x26, 0x24, 0xc0, 0x00, 0xa0, 0x2a, - 0xf5, 0xd2, 0x99, 0xf6, 0xd4, 0x69, 0xef, 0x6d, 0x4f, 0x9d, 0x49, 0x6f, 0x6d, 0x33, 0x39, 0x75, - 0x7a, 0xec, 0x4c, 0x0f, 0x3d, 0xf4, 0xd0, 0xe9, 0xad, 0x9d, 0x5e, 0x72, 0xed, 0x64, 0xda, 0x99, - 0x4c, 0x8f, 0x9d, 0x1e, 0x3a, 0xc0, 0x2e, 0x40, 0x2c, 0x08, 0x80, 0xa4, 0x65, 0x4f, 0x0e, 0x3d, - 0x49, 0x7c, 0xfb, 0xf6, 0xed, 0xdb, 0xb7, 0xef, 0xbd, 0x7d, 0xef, 0xb7, 0x80, 0xbb, 0x2d, 0xc5, - 0x7c, 0xd6, 0x3b, 0xcc, 0x37, 0xb4, 0xce, 0x9d, 0x86, 0xa6, 0x9a, 0xb2, 0xa2, 0x62, 0xfd, 0xb6, - 0x61, 0x6a, 0xba, 0xdc, 0xc2, 0xb7, 0x15, 0xd5, 0xc4, 0xfa, 0x91, 0xdc, 0xc0, 0x77, 0x8c, 0x2e, - 0x6e, 0xdc, 0x69, 0x18, 0x4a, 0xbe, 0xab, 0x6b, 0xa6, 0x86, 0xd2, 0xd6, 0xbf, 0xc7, 0xaf, 0xf3, - 0xab, 0x2d, 0x4d, 0x6b, 0xb5, 0xf1, 0x1d, 0x9b, 0x7a, 0xd8, 0x3b, 0xba, 0xd3, 0xc4, 0x46, 0x43, - 0x57, 0xba, 0xa6, 0xa6, 0x13, 0x4e, 0xfe, 0xb2, 0x9f, 0xc3, 0x54, 0x3a, 0xd8, 0x30, 0xe5, 0x4e, - 0x97, 0x32, 0x5c, 0xf2, 0x33, 0x7c, 0x47, 0x97, 0xbb, 0x5d, 0xac, 0x1b, 0x64, 0x5c, 0x58, 0x84, - 0xf9, 0x6d, 0x6c, 0xee, 0xb5, 0x7b, 0x2d, 0x45, 0x2d, 0xab, 0x47, 0x9a, 0x88, 0x3f, 0xe9, 0x61, - 0xc3, 0x14, 0xfe, 0xca, 0xc1, 0x82, 0x6f, 0xc0, 0xe8, 0x6a, 0xaa, 0x81, 0x11, 0x82, 0xa4, 0x2a, - 0x77, 0x70, 0x8e, 0x5b, 0xe5, 0xd6, 0x26, 0x45, 0xfb, 0x7f, 0x74, 0x0d, 0x66, 0x8f, 0xb1, 0xda, - 0xd4, 0x74, 0xe9, 0x18, 0xeb, 0x86, 0xa2, 0xa9, 0xb9, 0xb8, 0x3d, 0x3a, 0x43, 0xa8, 0x07, 0x84, - 0x88, 0xb6, 0x21, 0xd3, 0x91, 0x55, 0xe5, 0x08, 0x1b, 0x66, 0x2e, 0xb1, 0x9a, 0x58, 0x9b, 0x5a, - 0x7f, 0x2d, 0x4f, 0xb6, 0x9a, 0x0f, 0x5c, 0x2b, 0xff, 0x88, 0x72, 0x97, 0x54, 0x53, 0x3f, 0x15, - 0xdd, 0xc9, 0xfc, 0x7d, 0x98, 0x61, 0x86, 0x50, 0x16, 0x12, 0x1f, 0xe3, 0x53, 0xaa, 0x93, 0xf5, - 0x2f, 0x9a, 0x87, 0xd4, 0xb1, 0xdc, 0xee, 0x61, 0xaa, 0x09, 0xf9, 0x71, 0x2f, 0xfe, 0xff, 0x9c, - 0x70, 0x09, 0x96, 0xdd, 0xd5, 0x8a, 0x72, 0x57, 0x3e, 0x54, 0xda, 0x8a, 0xa9, 0x60, 0xc3, 0xd9, - 0xfa, 0x87, 0xb0, 0x12, 0x32, 0x4e, 0x2d, 0xb0, 0x01, 0xd3, 0x0d, 0x0f, 0x3d, 0xc7, 0xd9, 0x5b, - 0xc9, 0x39, 0x5b, 0xf1, 0xcd, 0x3c, 0x15, 0x19, 0x6e, 0xe1, 0x4f, 0x09, 0xc8, 0xfa, 0x59, 0xd0, - 0x06, 0x4c, 0x18, 0x58, 0x3f, 0x56, 0x1a, 0xc4, 0xae, 0x53, 0xeb, 0xab, 0x61, 0xd2, 0xf2, 0x35, - 0xc2, 0xb7, 0x13, 0x13, 0x9d, 0x29, 0x68, 0x1f, 0xb2, 0xc7, 0x5a, 0xbb, 0xd7, 0xc1, 0x12, 0x3e, - 0xe9, 0xca, 0xaa, 0x7b, 0x00, 0x53, 0xeb, 0x6b, 0xa1, 0x62, 0x0e, 0xec, 0x09, 0x25, 0x87, 0x7f, - 0x27, 0x26, 0x9e, 0x3b, 0x66, 0x49, 0xfc, 0x4f, 0x38, 0x98, 0xa0, 0xab, 0xa1, 0xb7, 0x21, 0x69, - 0x9e, 0x76, 0x89, 0x76, 0xb3, 0xeb, 0xd7, 0x86, 0x69, 0x97, 0xaf, 0x9f, 0x76, 0xb1, 0x68, 0x4f, - 0x11, 0xde, 0x87, 0xa4, 0xf5, 0x0b, 0x4d, 0xc1, 0xc4, 0x7e, 0xf5, 0x61, 0x75, 0xf7, 0x71, 0x35, - 0x1b, 0x43, 0x8b, 0x80, 0x8a, 0xbb, 0xd5, 0xba, 0xb8, 0x5b, 0xa9, 0x94, 0x44, 0xa9, 0x56, 0x12, - 0x0f, 0xca, 0xc5, 0x52, 0x96, 0x43, 0xaf, 0xc0, 0xea, 0xc1, 0x6e, 0x65, 0xff, 0x51, 0x49, 0x2a, - 0x14, 0x8b, 0xa5, 0x5a, 0xad, 0xbc, 0x59, 0xae, 0x94, 0xeb, 0x4f, 0xa4, 0xe2, 0x6e, 0xb5, 0x56, - 0x17, 0x0b, 0xe5, 0x6a, 0xbd, 0x96, 0x8d, 0xf3, 0xdf, 0xe7, 0xe0, 0x9c, 0x6f, 0x03, 0xa8, 0xc0, - 0x68, 0x78, 0x7b, 0xd4, 0x8d, 0x7b, 0x35, 0xbd, 0x15, 0xa4, 0x29, 0x40, 0x7a, 0xb7, 0x5a, 0x29, - 0x57, 0x2d, 0xed, 0xa6, 0x60, 0x62, 0xf7, 0xc1, 0x03, 0xfb, 0x47, 0x7c, 0x33, 0x4d, 0x16, 0x14, - 0x66, 0x61, 0x7a, 0x4f, 0xd7, 0x0e, 0xb1, 0xe3, 0x3f, 0x05, 0x98, 0xa1, 0xbf, 0xa9, 0xbf, 0xfc, - 0x1f, 0xa4, 0x74, 0x2c, 0x37, 0x4f, 0xe9, 0xd1, 0xf2, 0x79, 0x12, 0x93, 0x79, 0x27, 0x26, 0xf3, - 0x9b, 0x9a, 0xd6, 0x3e, 0xb0, 0xfc, 0x53, 0x24, 0x8c, 0xc2, 0x57, 0x49, 0x98, 0x2b, 0xea, 0x58, - 0x36, 0x31, 0xd1, 0x96, 0x8a, 0x0e, 0x8c, 0xbd, 0x0d, 0x98, 0xb5, 0xfc, 0xab, 0xa1, 0x98, 0xa7, - 0x92, 0x2e, 0xab, 0x2d, 0x4c, 0x8f, 0x7e, 0xc1, 0xb1, 0x40, 0x91, 0x8e, 0x8a, 0xd6, 0xa0, 0x38, - 0xd3, 0xf0, 0xfe, 0x44, 0x65, 0x98, 0xa3, 0xae, 0xc3, 0xb8, 0x74, 0x82, 0x75, 0x69, 0xa2, 0x85, - 0xc7, 0xa5, 0xd1, 0x31, 0x4b, 0x51, 0xb0, 0x81, 0x1e, 0x02, 0x74, 0x65, 0x5d, 0xee, 0x60, 0x13, - 0xeb, 0x46, 0x2e, 0xc9, 0xc6, 0x77, 0xc0, 0x6e, 0xf2, 0x7b, 0x2e, 0x37, 0x89, 0x6f, 0xcf, 0x74, - 0xb4, 0x6d, 0x05, 0x44, 0x43, 0xc7, 0xa6, 0x91, 0x4b, 0xd9, 0x92, 0xd6, 0xa2, 0x24, 0xd5, 0x08, - 0xab, 0x2d, 0x66, 0x33, 0xf1, 0xd3, 0x4d, 0x4e, 0x74, 0x66, 0xa3, 0x5d, 0x58, 0x70, 0x36, 0xa8, - 0xa9, 0x26, 0x56, 0x4d, 0xc9, 0xd0, 0x7a, 0x7a, 0x03, 0xe7, 0xd2, 0xb6, 0x95, 0x96, 0x7c, 0x5b, - 0x24, 0x3c, 0x35, 0x9b, 0x45, 0xa4, 0xa6, 0x61, 0x88, 0xe8, 0x29, 0xf0, 0x72, 0xa3, 0x81, 0x0d, - 0x43, 0x21, 0xb6, 0x90, 0x74, 0xfc, 0x49, 0x4f, 0xd1, 0x71, 0x07, 0xab, 0xa6, 0x91, 0x9b, 0x60, - 0xa5, 0xd6, 0xb5, 0xae, 0xd6, 0xd6, 0x5a, 0xa7, 0x62, 0x9f, 0x47, 0xbc, 0xc8, 0x4c, 0xf7, 0x8c, - 0x18, 0xfc, 0x3b, 0x70, 0xce, 0x67, 0x94, 0x71, 0x32, 0x1b, 0x7f, 0x0f, 0xa6, 0xbd, 0x96, 0x18, - 0x2b, 0x2b, 0xfe, 0x28, 0x0e, 0x73, 0x01, 0x36, 0x40, 0x3b, 0x90, 0x31, 0x54, 0xb9, 0x6b, 0x3c, - 0xd3, 0x4c, 0xea, 0xbf, 0x37, 0x23, 0x4c, 0x96, 0xaf, 0x51, 0x5e, 0xf2, 0x73, 0x27, 0x26, 0xba, - 0xb3, 0xd1, 0x26, 0xa4, 0x89, 0x3d, 0xfd, 0xb9, 0x29, 0x48, 0x0e, 0xa1, 0xb9, 0x52, 0xe8, 0x4c, - 0xfe, 0x75, 0x98, 0x65, 0x57, 0x40, 0x97, 0x61, 0xca, 0x59, 0x41, 0x52, 0x9a, 0x74, 0xaf, 0xe0, - 0x90, 0xca, 0x4d, 0xfe, 0x35, 0x98, 0xf6, 0x0a, 0x43, 0x4b, 0x30, 0x49, 0x1d, 0xc2, 0x65, 0xcf, - 0x10, 0x42, 0xb9, 0xe9, 0xc6, 0xf4, 0x37, 0x60, 0x9e, 0xf5, 0x33, 0x1a, 0xca, 0xd7, 0xdd, 0x3d, - 0x10, 0x5b, 0xcc, 0xb2, 0x7b, 0x70, 0xf4, 0x14, 0x7e, 0x99, 0x84, 0xac, 0x3f, 0x68, 0xd0, 0x06, - 0xa4, 0x0e, 0xdb, 0x5a, 0xe3, 0x63, 0x3a, 0xf7, 0x95, 0xb0, 0xe8, 0xca, 0x6f, 0x5a, 0x5c, 0x84, - 0xba, 0x13, 0x13, 0xc9, 0x24, 0x6b, 0x76, 0x47, 0xeb, 0xa9, 0x26, 0xb5, 0x5e, 0xf8, 0xec, 0x47, - 0x16, 0x57, 0x7f, 0xb6, 0x3d, 0x09, 0x6d, 0xc1, 0x14, 0x71, 0x3b, 0xa9, 0xa3, 0x35, 0x71, 0x2e, - 0x61, 0xcb, 0xb8, 0x1a, 0x2a, 0xa3, 0x60, 0xf3, 0x3e, 0xd2, 0x9a, 0x58, 0x04, 0xd9, 0xfd, 0x9f, - 0x9f, 0x81, 0x29, 0x8f, 0x6e, 0xfc, 0x36, 0x4c, 0x79, 0x16, 0x43, 0x17, 0x60, 0xe2, 0xc8, 0x90, - 0xdc, 0x24, 0x3c, 0x29, 0xa6, 0x8f, 0x0c, 0x3b, 0x9f, 0x5e, 0x86, 0x29, 0x5b, 0x0b, 0xe9, 0xa8, - 0x2d, 0xb7, 0x8c, 0x5c, 0x7c, 0x35, 0x61, 0x9d, 0x91, 0x4d, 0x7a, 0x60, 0x51, 0xf8, 0x7f, 0x70, - 0x00, 0xfd, 0x25, 0xd1, 0x06, 0x24, 0x6d, 0x2d, 0x49, 0x2a, 0x5f, 0x1b, 0x41, 0xcb, 0xbc, 0xad, - 0xaa, 0x3d, 0x4b, 0xf8, 0x39, 0x07, 0x49, 0x5b, 0x8c, 0xff, 0xc2, 0xa9, 0x95, 0xab, 0xdb, 0x95, - 0x92, 0x54, 0xdd, 0xdd, 0x2a, 0x49, 0x8f, 0xc5, 0x72, 0xbd, 0x24, 0x66, 0x39, 0xb4, 0x04, 0x17, - 0xbc, 0x74, 0xb1, 0x54, 0xd8, 0x2a, 0x89, 0xd2, 0x6e, 0xb5, 0xf2, 0x24, 0x1b, 0x47, 0x3c, 0x2c, - 0x3e, 0xda, 0xaf, 0xd4, 0xcb, 0x83, 0x63, 0x09, 0xb4, 0x0c, 0x39, 0xcf, 0x18, 0x95, 0x41, 0xc5, - 0x26, 0x2d, 0xb1, 0x9e, 0x51, 0xf2, 0x2f, 0x1d, 0x4c, 0x6d, 0xce, 0xb8, 0x87, 0x61, 0x3b, 0xdb, - 0x63, 0x98, 0x61, 0x72, 0xb4, 0x55, 0x4e, 0xd1, 0xa4, 0xd2, 0x94, 0x0e, 0x4f, 0x4d, 0xbb, 0xc4, - 0xe0, 0xd6, 0x12, 0xe2, 0x8c, 0x43, 0xdd, 0xb4, 0x88, 0x96, 0x59, 0xdb, 0x4a, 0x47, 0x31, 0x29, - 0x4f, 0xdc, 0xe6, 0x01, 0x9b, 0x64, 0x33, 0x08, 0x5f, 0xc4, 0x21, 0x4d, 0xcf, 0xe6, 0x9a, 0xe7, - 0x96, 0x60, 0x44, 0x3a, 0x54, 0x22, 0x92, 0x09, 0x8e, 0x38, 0x1b, 0x1c, 0x68, 0x07, 0x66, 0xbd, - 0xa9, 0xf4, 0xc4, 0x29, 0xe2, 0xae, 0xb0, 0x07, 0xe4, 0x8d, 0xe7, 0x13, 0x5a, 0xba, 0xcd, 0x1c, - 0x7b, 0x69, 0x68, 0x13, 0x66, 0x7d, 0xd9, 0x38, 0x39, 0x3c, 0x1b, 0xcf, 0x34, 0x98, 0xc4, 0x54, - 0x80, 0x39, 0x27, 0x91, 0xb6, 0xb1, 0x64, 0xd2, 0x44, 0x4b, 0x6f, 0x8b, 0xec, 0x40, 0x02, 0x46, - 0x7d, 0x66, 0x87, 0xc6, 0xbf, 0x0b, 0x68, 0x50, 0xd7, 0xb1, 0xb2, 0x66, 0x0f, 0xe6, 0x02, 0x52, - 0x3c, 0xca, 0xc3, 0xa4, 0x7d, 0x54, 0x86, 0x62, 0x62, 0x5a, 0x1e, 0x0e, 0x6a, 0xd4, 0x67, 0xb1, - 0xf8, 0xbb, 0x3a, 0x3e, 0xc2, 0xba, 0x8e, 0x9b, 0x76, 0x78, 0x04, 0xf2, 0xbb, 0x2c, 0xc2, 0x0f, - 0x38, 0xc8, 0x38, 0x74, 0x74, 0x0f, 0x32, 0x06, 0x6e, 0x91, 0xeb, 0x87, 0xac, 0x75, 0xc9, 0x3f, - 0x37, 0x5f, 0xa3, 0x0c, 0xb4, 0x90, 0x76, 0xf8, 0xad, 0x42, 0x9a, 0x19, 0x1a, 0x6b, 0xf3, 0xbf, - 0xe5, 0x60, 0x6e, 0x0b, 0xb7, 0xb1, 0xbf, 0x4a, 0x89, 0xca, 0xb0, 0xde, 0x8b, 0x3d, 0xce, 0x5e, - 0xec, 0x01, 0xa2, 0x22, 0x2e, 0xf6, 0x33, 0x5d, 0x76, 0x8b, 0x30, 0xcf, 0xae, 0x46, 0xd2, 0xbb, - 0xf0, 0xcf, 0x04, 0x5c, 0xb2, 0x7c, 0x41, 0xd7, 0xda, 0x6d, 0xac, 0xef, 0xf5, 0x0e, 0xdb, 0x8a, - 0xf1, 0x6c, 0x8c, 0xcd, 0x5d, 0x80, 0x09, 0x55, 0x6b, 0x7a, 0x82, 0x27, 0x6d, 0xfd, 0x2c, 0x37, - 0x51, 0x09, 0xce, 0xfb, 0xcb, 0xac, 0x53, 0x9a, 0x84, 0xc3, 0x8b, 0xac, 0xec, 0xb1, 0xff, 0x06, - 0xe1, 0x21, 0x63, 0x15, 0x88, 0x9a, 0xda, 0x3e, 0xb5, 0x23, 0x26, 0x23, 0xba, 0xbf, 0x91, 0xe8, - 0xaf, 0x98, 0xde, 0x70, 0x2b, 0xa6, 0xc8, 0x1d, 0x45, 0x15, 0x4f, 0x1f, 0x0d, 0x44, 0x7c, 0xda, - 0x16, 0xfd, 0xf6, 0x88, 0xa2, 0x87, 0x66, 0x82, 0xb3, 0x9c, 0xe2, 0x0b, 0x08, 0xdf, 0x3f, 0x72, - 0x70, 0x39, 0x74, 0x0b, 0xf4, 0xca, 0x6f, 0xc2, 0xb9, 0x2e, 0x19, 0x70, 0x8d, 0x40, 0xa2, 0xec, - 0xfe, 0x50, 0x23, 0xd0, 0x2e, 0x96, 0x52, 0x19, 0x33, 0xcc, 0x76, 0x19, 0x22, 0x5f, 0x80, 0xb9, - 0x00, 0xb6, 0xb1, 0x36, 0xf3, 0x25, 0x07, 0xab, 0x7d, 0x55, 0xf6, 0xd5, 0xee, 0x8b, 0x73, 0xdf, - 0x7a, 0xdf, 0xb7, 0x48, 0xca, 0xbf, 0x3b, 0xb8, 0xf7, 0xe0, 0x05, 0x5f, 0x56, 0x04, 0x5f, 0x85, - 0x2b, 0x11, 0x4b, 0xd3, 0x70, 0xfe, 0x22, 0x09, 0x57, 0x0e, 0xe4, 0xb6, 0xd2, 0x74, 0x0b, 0xb9, - 0x80, 0x7e, 0x3f, 0xda, 0x24, 0x8d, 0x81, 0x08, 0x20, 0x59, 0x6b, 0xc3, 0x8d, 0xda, 0x61, 0xf2, - 0x47, 0xb8, 0x0e, 0x5f, 0x60, 0x13, 0xf6, 0x24, 0xa0, 0x09, 0x7b, 0x7b, 0x74, 0x5d, 0xa3, 0x5a, - 0xb2, 0x7d, 0x7f, 0x82, 0x79, 0x6b, 0x74, 0xb9, 0x11, 0x5e, 0x70, 0xe6, 0x28, 0xfe, 0x3a, 0xbb, - 0xa6, 0xdf, 0x27, 0x41, 0x88, 0xda, 0x3d, 0xcd, 0x21, 0x22, 0x4c, 0x36, 0x34, 0xf5, 0x48, 0xd1, - 0x3b, 0xb8, 0x49, 0xab, 0xff, 0x37, 0x47, 0x31, 0x1e, 0x4d, 0x20, 0x45, 0x67, 0xae, 0xd8, 0x17, - 0x83, 0x72, 0x30, 0xd1, 0xc1, 0x86, 0x21, 0xb7, 0x1c, 0xb5, 0x9c, 0x9f, 0xfc, 0x67, 0x09, 0x98, - 0x74, 0xa7, 0x20, 0x75, 0xc0, 0x83, 0x49, 0xfa, 0xda, 0x7e, 0x1e, 0x05, 0x9e, 0xdf, 0x99, 0xe3, - 0xcf, 0xe1, 0xcc, 0x4d, 0xc6, 0x99, 0x49, 0x38, 0x6c, 0x3d, 0x97, 0xda, 0x11, 0x7e, 0xfd, 0xb5, - 0x3b, 0xa0, 0xf0, 0x6d, 0x40, 0x15, 0xc5, 0xa0, 0x5d, 0x94, 0x9b, 0x96, 0xac, 0xa6, 0x49, 0x3e, - 0x91, 0xb0, 0x6a, 0xea, 0x0a, 0x2d, 0xd7, 0x53, 0x22, 0x74, 0xe4, 0x93, 0x12, 0xa1, 0x58, 0x25, - 0xbd, 0x61, 0xca, 0xba, 0xa9, 0xa8, 0x2d, 0xc9, 0xd4, 0x3e, 0xc6, 0x2e, 0xe8, 0xea, 0x50, 0xeb, - 0x16, 0x51, 0xf8, 0x34, 0x0e, 0x73, 0x8c, 0x78, 0xea, 0x93, 0xf7, 0x61, 0xa2, 0x2f, 0x9b, 0x29, - 0xe3, 0x03, 0xb8, 0xf3, 0xc4, 0x6c, 0xce, 0x0c, 0xb4, 0x02, 0xa0, 0xe2, 0x13, 0x93, 0x59, 0x77, - 0xd2, 0xa2, 0xd8, 0x6b, 0xf2, 0x1b, 0x6e, 0xcf, 0x6d, 0xca, 0x66, 0xcf, 0x40, 0xb7, 0x00, 0xd1, - 0x0c, 0x8d, 0x9b, 0x12, 0xbd, 0x62, 0xc8, 0xb2, 0x93, 0x62, 0xd6, 0x1d, 0xa9, 0xda, 0x97, 0x8d, - 0xc1, 0x7f, 0x02, 0x29, 0x62, 0xc4, 0x11, 0xbb, 0x6d, 0xf4, 0x2e, 0xa4, 0x0d, 0x7b, 0x21, 0x3f, - 0xb2, 0x10, 0xb4, 0x13, 0xaf, 0x62, 0x22, 0x9d, 0x27, 0x7c, 0x16, 0x07, 0xb4, 0x8d, 0x4d, 0xb7, - 0x0d, 0xa3, 0x67, 0x10, 0xe2, 0xcb, 0xdc, 0x73, 0xf8, 0xf2, 0x7b, 0x8c, 0x2f, 0x93, 0x68, 0xb8, - 0xe9, 0x41, 0xbf, 0x7d, 0x4b, 0x47, 0x66, 0xe2, 0x90, 0xd6, 0x87, 0xd4, 0x93, 0xa3, 0xb5, 0x3e, - 0x67, 0x74, 0xd9, 0x2d, 0x98, 0x63, 0x74, 0xa6, 0x3e, 0x75, 0x1b, 0x90, 0x7c, 0x2c, 0x2b, 0x6d, - 0xd9, 0xd2, 0xcb, 0xe9, 0x2c, 0x69, 0xa7, 0x79, 0xde, 0x1d, 0x71, 0xa6, 0x09, 0x82, 0xb7, 0x60, - 0xa1, 0xf2, 0xfc, 0x68, 0x7c, 0xdb, 0x7b, 0xd1, 0x0f, 0xf0, 0xd0, 0x75, 0xb7, 0x03, 0x11, 0xf9, - 0xab, 0x83, 0x45, 0x0a, 0x85, 0xa7, 0x43, 0xc1, 0xf9, 0x5f, 0x25, 0x60, 0x29, 0x82, 0x1b, 0xdd, - 0x87, 0x84, 0xde, 0x6d, 0x50, 0x77, 0x7c, 0x75, 0x04, 0xf9, 0x79, 0x71, 0xaf, 0xb8, 0x13, 0x13, - 0xad, 0x59, 0xfc, 0x1f, 0xe2, 0x90, 0x10, 0xf7, 0x8a, 0xe8, 0x5d, 0x06, 0xa9, 0xbe, 0x35, 0xa2, - 0x14, 0x2f, 0x50, 0xfd, 0x1f, 0x2e, 0x08, 0xa9, 0xce, 0xc1, 0x7c, 0x51, 0x2c, 0x15, 0xea, 0x25, - 0x69, 0xab, 0x54, 0x29, 0xd5, 0x4b, 0x12, 0x41, 0xd2, 0xb3, 0x1c, 0x5a, 0x86, 0xdc, 0xde, 0xfe, - 0x66, 0xa5, 0x5c, 0xdb, 0x91, 0xf6, 0xab, 0xce, 0x7f, 0x74, 0x34, 0x8e, 0xb2, 0x30, 0x5d, 0x29, - 0xd7, 0xea, 0x94, 0x50, 0xcb, 0x26, 0x2c, 0xca, 0x76, 0xa9, 0x2e, 0x15, 0x0b, 0x7b, 0x85, 0x62, - 0xb9, 0xfe, 0x24, 0x9b, 0x44, 0x3c, 0x2c, 0xb2, 0xb2, 0x6b, 0xd5, 0xc2, 0x5e, 0x6d, 0x67, 0xb7, - 0x9e, 0x4d, 0x21, 0x04, 0xb3, 0xf6, 0x7c, 0x87, 0x54, 0xcb, 0xa6, 0x2d, 0x09, 0xc5, 0xca, 0x6e, - 0xd5, 0xd5, 0x61, 0x02, 0xcd, 0x43, 0xd6, 0x59, 0x59, 0x2c, 0x15, 0xb6, 0x6c, 0x14, 0x25, 0x83, - 0xce, 0xc3, 0x4c, 0xe9, 0x83, 0xbd, 0x42, 0x75, 0xcb, 0x61, 0x9c, 0x44, 0xab, 0xb0, 0xec, 0x55, - 0x47, 0xa2, 0xb3, 0x4a, 0x5b, 0x36, 0x96, 0x52, 0xcb, 0x82, 0x8b, 0xd2, 0x7d, 0x19, 0x87, 0x05, - 0x02, 0xd3, 0x39, 0xa0, 0xa0, 0x13, 0xb8, 0x6b, 0x90, 0x25, 0xc0, 0x82, 0xe4, 0x2f, 0xed, 0x66, - 0x09, 0xfd, 0xc0, 0x29, 0xf0, 0x1c, 0x48, 0x3d, 0xee, 0x81, 0xd4, 0xcb, 0xfe, 0x72, 0xf7, 0x26, - 0x0b, 0x3e, 0xfb, 0x56, 0x8b, 0xea, 0xa0, 0x1e, 0x05, 0xd4, 0x63, 0xb7, 0xa3, 0xa5, 0x45, 0xdd, - 0x55, 0x67, 0x69, 0x97, 0xce, 0x18, 0xf2, 0x0f, 0x60, 0xd1, 0xaf, 0x2f, 0x8d, 0xbe, 0x5b, 0x03, - 0x10, 0xb1, 0x9b, 0x83, 0x5c, 0x5e, 0x97, 0x43, 0xf8, 0x0b, 0x07, 0x19, 0x87, 0x6c, 0xdd, 0x23, - 0x86, 0xf2, 0x5d, 0xcc, 0x40, 0x52, 0x93, 0x16, 0xc5, 0x45, 0xb8, 0xbc, 0xe0, 0x6e, 0xdc, 0x0f, - 0xee, 0x06, 0x9e, 0x73, 0x22, 0xf0, 0x9c, 0xbf, 0x09, 0x33, 0x0d, 0x4b, 0x7d, 0x45, 0x53, 0x25, - 0x53, 0xe9, 0x38, 0x88, 0xd3, 0xe0, 0x63, 0x4c, 0xdd, 0x79, 0x41, 0x15, 0xa7, 0x9d, 0x09, 0x16, - 0x09, 0xad, 0xc2, 0xb4, 0xfd, 0x38, 0x23, 0x99, 0x9a, 0xd4, 0x33, 0x70, 0x2e, 0x65, 0xf7, 0xdf, - 0x60, 0xd3, 0xea, 0xda, 0xbe, 0x81, 0x85, 0xdf, 0x71, 0xb0, 0x40, 0x60, 0x05, 0xbf, 0x3b, 0x0e, - 0x03, 0xa9, 0xbd, 0x1e, 0xe7, 0xbb, 0x1a, 0x02, 0x05, 0xbe, 0xac, 0xae, 0x2a, 0x07, 0x8b, 0xfe, - 0xf5, 0x68, 0x2b, 0xf5, 0x79, 0x1c, 0xe6, 0xad, 0xdb, 0xd4, 0x19, 0x78, 0xd1, 0x65, 0xca, 0x18, - 0x27, 0xe9, 0x33, 0x66, 0x72, 0xc0, 0x98, 0x3b, 0xfe, 0x46, 0xe5, 0x86, 0xb7, 0x1e, 0xf0, 0xef, - 0xe0, 0x65, 0xd9, 0xf2, 0xd7, 0x1c, 0x2c, 0xf8, 0xd6, 0xa3, 0xf1, 0xf2, 0x8e, 0xbf, 0xf2, 0xba, - 0x1a, 0xa2, 0xdf, 0x73, 0xd5, 0x5e, 0x77, 0x9d, 0xea, 0x69, 0xbc, 0xb0, 0xfc, 0x73, 0x1c, 0x56, - 0xfa, 0x37, 0x90, 0xfd, 0x3c, 0xda, 0x1c, 0x03, 0x3a, 0x38, 0xdb, 0x2b, 0xe4, 0xfb, 0xfe, 0x84, - 0xbb, 0x3e, 0x78, 0x29, 0x06, 0xa8, 0x14, 0x95, 0x78, 0x03, 0x11, 0xb7, 0xe4, 0xb8, 0x88, 0xdb, - 0x99, 0x3c, 0xe0, 0x7b, 0x5e, 0x30, 0x91, 0x55, 0x9f, 0x7a, 0xc2, 0x88, 0xa8, 0xfc, 0x5b, 0x70, - 0xc1, 0x2e, 0x9a, 0xdd, 0xd7, 0x7d, 0xe7, 0xcd, 0x91, 0xa4, 0xc4, 0x8c, 0xb8, 0x60, 0x0d, 0xbb, - 0x4f, 0xda, 0x14, 0x89, 0x6e, 0x0a, 0x5f, 0x25, 0x61, 0xd1, 0x2a, 0xaa, 0x6b, 0xa6, 0xdc, 0x1a, - 0x07, 0xa3, 0xfd, 0xd6, 0x20, 0xe4, 0x15, 0x67, 0x8f, 0x25, 0x58, 0xea, 0x28, 0x48, 0x17, 0xca, - 0xc3, 0x9c, 0x61, 0xca, 0x2d, 0x3b, 0x1d, 0xc8, 0x7a, 0x0b, 0x9b, 0x52, 0x57, 0x36, 0x9f, 0xd1, - 0x58, 0x3f, 0x4f, 0x87, 0xea, 0xf6, 0xc8, 0x9e, 0x6c, 0x3e, 0x7b, 0x41, 0x07, 0x89, 0xde, 0xf3, - 0x27, 0x85, 0xd7, 0x86, 0xec, 0x25, 0xc2, 0xb7, 0x3e, 0x08, 0x81, 0x45, 0x5f, 0x1f, 0x22, 0x72, - 0x38, 0x1c, 0x7a, 0x76, 0x18, 0xf0, 0x6b, 0x46, 0x54, 0x2f, 0xc2, 0x85, 0x81, 0xcd, 0xd3, 0x2b, - 0xa4, 0x05, 0x39, 0x6b, 0x68, 0x5f, 0x35, 0xc6, 0x74, 0xc7, 0x10, 0x8f, 0x89, 0x87, 0x78, 0x8c, - 0xb0, 0x04, 0x17, 0x03, 0x16, 0xa2, 0x5a, 0xfc, 0x26, 0x45, 0xd4, 0x18, 0x1f, 0xdc, 0xff, 0x30, - 0x2c, 0x2a, 0xde, 0xf4, 0x1e, 0x7b, 0x20, 0x0e, 0xfe, 0x32, 0xe2, 0xe2, 0x32, 0x4c, 0x79, 0xf9, - 0xe8, 0x35, 0x68, 0x0e, 0x09, 0x9c, 0xd4, 0x99, 0xde, 0x1c, 0xd2, 0xbe, 0x37, 0x87, 0x4a, 0x3f, - 0xa8, 0x26, 0xd8, 0xd2, 0x36, 0xd4, 0x14, 0x11, 0x61, 0xf5, 0x74, 0x20, 0xac, 0x32, 0xec, 0x43, - 0x46, 0xa8, 0xd0, 0xff, 0x81, 0xc0, 0xa2, 0x4e, 0x1d, 0xf8, 0xc2, 0x20, 0x3c, 0x05, 0x9e, 0x78, - 0xfc, 0xf8, 0x98, 0xbf, 0xcf, 0x8d, 0xe2, 0x7e, 0x37, 0x12, 0x56, 0x60, 0x29, 0x50, 0x36, 0x5d, - 0xfa, 0x87, 0x1c, 0x51, 0x6c, 0x1b, 0x9b, 0x7d, 0x64, 0xc5, 0x18, 0x75, 0x69, 0x3a, 0xe8, 0x5d, - 0x9a, 0x90, 0x6c, 0x0f, 0x1e, 0x33, 0x24, 0x84, 0x6d, 0x62, 0x06, 0xbf, 0x2a, 0xf4, 0xb2, 0xbd, - 0x01, 0xa9, 0x9e, 0x0d, 0x97, 0x92, 0xa2, 0x6b, 0x8e, 0x8d, 0x81, 0x7d, 0x6b, 0x48, 0x24, 0x1c, - 0xc2, 0xe7, 0x1c, 0x4c, 0x79, 0xc8, 0x68, 0x19, 0x26, 0x5d, 0xf4, 0xc2, 0xe9, 0x52, 0x5c, 0x82, - 0x75, 0x68, 0xa6, 0x66, 0xca, 0x6d, 0xfa, 0x02, 0x4f, 0x7e, 0x58, 0x8d, 0x65, 0xcf, 0xc0, 0xa4, - 0x88, 0x4d, 0x88, 0xf6, 0xff, 0xe8, 0x16, 0x24, 0x7b, 0xaa, 0x62, 0xda, 0xc1, 0x3a, 0xeb, 0x8f, - 0x42, 0x7b, 0xa9, 0xfc, 0xbe, 0xaa, 0x98, 0xa2, 0xcd, 0x25, 0xdc, 0x84, 0xa4, 0xf5, 0x8b, 0x6d, - 0xf2, 0x27, 0x21, 0xb5, 0xf9, 0xa4, 0x5e, 0xaa, 0x65, 0x39, 0x04, 0x90, 0x2e, 0x93, 0x96, 0x38, - 0x2e, 0x2c, 0xbb, 0x5b, 0x0f, 0x02, 0x51, 0x3e, 0x22, 0x67, 0x18, 0x06, 0x9f, 0x14, 0x02, 0xe1, - 0x93, 0x15, 0xe6, 0x36, 0x1b, 0x02, 0x9c, 0xfc, 0x8b, 0x83, 0x85, 0x40, 0x3e, 0x74, 0xd7, 0x0b, - 0x99, 0x5c, 0x89, 0x94, 0xe9, 0x05, 0x4b, 0x7e, 0xc6, 0x11, 0xb0, 0xe4, 0x1e, 0x03, 0x96, 0x5c, - 0x1f, 0x3a, 0xdf, 0x0b, 0x93, 0x1c, 0x84, 0xa0, 0x24, 0xb5, 0x7a, 0x61, 0xbb, 0x24, 0xed, 0x57, - 0xc9, 0x5f, 0x17, 0x25, 0x99, 0x87, 0xec, 0x76, 0xc9, 0xc1, 0x1d, 0xa4, 0x5a, 0xbd, 0x50, 0xaf, - 0x65, 0xe3, 0x83, 0x08, 0x45, 0xc2, 0xc5, 0x1f, 0xe6, 0x01, 0x51, 0xb3, 0x7a, 0x3f, 0x9d, 0xfd, - 0x94, 0x83, 0x39, 0x86, 0x4c, 0xad, 0xec, 0x79, 0x5d, 0xe3, 0x98, 0xd7, 0xb5, 0x3b, 0x30, 0x6f, - 0xb5, 0x50, 0xc4, 0xf1, 0x0d, 0xa9, 0x8b, 0x75, 0x1b, 0x23, 0xa5, 0xee, 0x74, 0xbe, 0x23, 0x9f, - 0x50, 0x0c, 0x73, 0x0f, 0xeb, 0x96, 0xe0, 0x17, 0x80, 0xff, 0x09, 0x3f, 0x8e, 0x93, 0x8b, 0x7a, - 0xec, 0x42, 0x7f, 0x68, 0xd0, 0x0e, 0x76, 0x02, 0x89, 0x31, 0x3a, 0x81, 0x90, 0x90, 0x4f, 0x8e, - 0x55, 0x1d, 0x8e, 0x7d, 0xc9, 0x09, 0x05, 0x52, 0x14, 0x9c, 0xa1, 0x48, 0x5f, 0xff, 0x37, 0x07, - 0x99, 0x72, 0x13, 0xab, 0xa6, 0xe5, 0xf4, 0x55, 0x98, 0x61, 0xbe, 0x68, 0x46, 0xcb, 0x21, 0x1f, - 0x3a, 0xdb, 0x16, 0xe7, 0x57, 0x22, 0x3f, 0x83, 0x16, 0x62, 0xe8, 0xc8, 0xf3, 0x35, 0x36, 0x03, - 0x2b, 0xbf, 0x32, 0x30, 0x33, 0x20, 0xfe, 0xf9, 0x6b, 0x43, 0xb8, 0xdc, 0x75, 0xde, 0x82, 0x94, - 0xfd, 0xed, 0x2a, 0x9a, 0x77, 0xbf, 0x9f, 0xf5, 0x7c, 0xda, 0xca, 0x2f, 0xf8, 0xa8, 0xce, 0xbc, - 0xf5, 0xbf, 0x67, 0x00, 0xfa, 0xbd, 0x0e, 0x7a, 0x08, 0xd3, 0xde, 0xcf, 0xe7, 0xd0, 0x52, 0xc4, - 0xc7, 0x9b, 0xfc, 0x72, 0xf0, 0xa0, 0xab, 0xd3, 0x43, 0x98, 0xf6, 0x7e, 0xac, 0xd1, 0x17, 0x16, - 0xf0, 0xc1, 0x48, 0x5f, 0x58, 0xe0, 0xf7, 0x1d, 0x31, 0xd4, 0x86, 0x0b, 0x21, 0xcf, 0xf5, 0xe8, - 0xfa, 0x68, 0x1f, 0x35, 0xf0, 0xaf, 0x8e, 0xf8, 0xee, 0x2f, 0xc4, 0x90, 0x0e, 0x17, 0x43, 0x5f, - 0xa9, 0xd1, 0xda, 0xa8, 0x6f, 0xe8, 0xfc, 0x8d, 0x11, 0x38, 0xdd, 0x35, 0x7b, 0xc0, 0x87, 0x3f, - 0x8d, 0xa1, 0x1b, 0x23, 0xbf, 0xd9, 0xf2, 0x37, 0x47, 0x7f, 0x69, 0x13, 0x62, 0x68, 0x07, 0xa6, - 0x3c, 0xaf, 0x2d, 0x88, 0x0f, 0x7c, 0x82, 0x21, 0x82, 0x97, 0x22, 0x9e, 0x67, 0x88, 0x24, 0xcf, - 0xdb, 0x42, 0x5f, 0xd2, 0xe0, 0x23, 0x49, 0x5f, 0x52, 0xc0, 0x63, 0x84, 0xdf, 0xfc, 0xbe, 0xcb, - 0x2f, 0xc8, 0xfc, 0xc1, 0xb7, 0x67, 0x90, 0xf9, 0x43, 0x6e, 0x52, 0x21, 0x86, 0xde, 0x87, 0x59, - 0x16, 0x26, 0x45, 0x2b, 0x91, 0x70, 0x2f, 0x7f, 0x29, 0x6c, 0xd8, 0x2b, 0x92, 0x45, 0xe5, 0xfa, - 0x22, 0x03, 0xd1, 0xc1, 0xbe, 0xc8, 0x10, 0x30, 0x2f, 0x66, 0xe5, 0x27, 0x06, 0x6b, 0xea, 0xe7, - 0xa7, 0x20, 0x88, 0xac, 0x9f, 0x9f, 0x02, 0x01, 0x2a, 0x21, 0x86, 0x14, 0x58, 0x0c, 0x86, 0x3a, - 0xd0, 0xb5, 0x91, 0x90, 0x1c, 0xfe, 0xfa, 0x30, 0x36, 0x37, 0xd5, 0xfc, 0x2d, 0x05, 0x49, 0xfb, - 0x16, 0xac, 0xc3, 0x39, 0x5f, 0xab, 0x89, 0x2e, 0x45, 0x37, 0xe0, 0xfc, 0xe5, 0xd0, 0x71, 0x77, - 0x27, 0x4f, 0xe1, 0xfc, 0x40, 0xf3, 0x88, 0x56, 0xbd, 0xf3, 0x82, 0x1a, 0x58, 0xfe, 0x4a, 0x04, - 0x87, 0x5f, 0x36, 0x9b, 0x76, 0x56, 0x87, 0x75, 0x37, 0xac, 0xec, 0xb0, 0x54, 0xf3, 0x11, 0x29, - 0x3a, 0xfc, 0x49, 0x46, 0x60, 0xf5, 0x0a, 0x4c, 0x2f, 0x57, 0x23, 0x79, 0xdc, 0x15, 0x3e, 0x74, - 0xab, 0x1d, 0x4f, 0x75, 0x8d, 0x18, 0xe5, 0x02, 0x9b, 0x00, 0x5e, 0x88, 0x62, 0x71, 0xc5, 0x3f, - 0x86, 0xac, 0xff, 0x0a, 0x46, 0xcc, 0x79, 0x05, 0xb9, 0xcd, 0x6a, 0x38, 0x83, 0xdf, 0x32, 0xfe, - 0xf8, 0xf7, 0x6b, 0x15, 0x14, 0xf9, 0x57, 0x23, 0x79, 0xbc, 0x19, 0xcb, 0x53, 0xf0, 0xf5, 0x33, - 0xd6, 0x60, 0x71, 0xd8, 0xcf, 0x58, 0x01, 0x15, 0xa2, 0x10, 0xbb, 0xf7, 0x0e, 0x40, 0xc3, 0x50, - 0x24, 0xd2, 0x11, 0xa3, 0x95, 0x81, 0xc7, 0x89, 0x07, 0x0a, 0x6e, 0x37, 0x77, 0xbb, 0xa6, 0xa2, - 0xa9, 0x46, 0xee, 0x17, 0x19, 0xbb, 0x1d, 0x9f, 0x6c, 0x18, 0x0a, 0x69, 0x4c, 0x37, 0x53, 0x4f, - 0x13, 0x0d, 0x43, 0x39, 0x4c, 0xdb, 0xfc, 0x6f, 0xfc, 0x37, 0x00, 0x00, 0xff, 0xff, 0x16, 0x7c, - 0xfe, 0x46, 0x7f, 0x36, 0x00, 0x00, + // 3651 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x3b, 0x4b, 0x6c, 0x1b, 0xd7, + 0xb5, 0x1a, 0x7e, 0xf4, 0x39, 0x94, 0x64, 0xfa, 0xea, 0x63, 0x7a, 0x24, 0xd9, 0xf2, 0x38, 0x76, + 0x64, 0xc7, 0xa6, 0x13, 0x25, 0x0e, 0x5e, 0x64, 0xe7, 0x43, 0x52, 0xb4, 0xc4, 0x98, 0xa6, 0x94, + 0x21, 0x65, 0xc7, 0x7e, 0x2f, 0x98, 0x8c, 0xc8, 0x2b, 0x79, 0x10, 0x72, 0x86, 0x9e, 0x19, 0xea, + 0x59, 0x6f, 0xf3, 0x1e, 0x5e, 0xd1, 0x45, 0xd1, 0x16, 0xe8, 0x2e, 0xdd, 0xb5, 0x68, 0xbb, 0x2a, + 0x12, 0x64, 0xd3, 0xa2, 0xcb, 0x02, 0x5d, 0x16, 0x68, 0xd1, 0x5d, 0x8b, 0x76, 0x91, 0x7d, 0x90, + 0x02, 0x59, 0x75, 0xd1, 0x55, 0x31, 0xf7, 0xde, 0x19, 0xce, 0x9f, 0xa4, 0x65, 0x23, 0x8b, 0xae, + 0xc4, 0x39, 0xf7, 0x9c, 0x73, 0xcf, 0xbd, 0xf7, 0x9c, 0x73, 0xcf, 0xe7, 0x0a, 0x6e, 0x1e, 0x2a, + 0xe6, 0xe3, 0xde, 0x7e, 0xbe, 0xa9, 0x75, 0x6e, 0x34, 0x35, 0xd5, 0x94, 0x15, 0x15, 0xeb, 0xd7, + 0x0d, 0x53, 0xd3, 0xe5, 0x43, 0x7c, 0x5d, 0x51, 0x4d, 0xac, 0x1f, 0xc8, 0x4d, 0x7c, 0xc3, 0xe8, + 0xe2, 0xe6, 0x8d, 0xa6, 0xa1, 0xe4, 0xbb, 0xba, 0x66, 0x6a, 0x68, 0xdc, 0xfa, 0x79, 0xf4, 0x1a, + 0xbf, 0x7a, 0xa8, 0x69, 0x87, 0x6d, 0x7c, 0x83, 0x40, 0xf7, 0x7b, 0x07, 0x37, 0x5a, 0xd8, 0x68, + 0xea, 0x4a, 0xd7, 0xd4, 0x74, 0x8a, 0xc9, 0x9f, 0xf7, 0x63, 0x98, 0x4a, 0x07, 0x1b, 0xa6, 0xdc, + 0xe9, 0x32, 0x84, 0x73, 0x7e, 0x84, 0xff, 0xd6, 0xe5, 0x6e, 0x17, 0xeb, 0x06, 0x1d, 0x17, 0x16, + 0x61, 0x7e, 0x0b, 0x9b, 0xbb, 0xed, 0xde, 0xa1, 0xa2, 0x56, 0xd4, 0x03, 0x4d, 0xc4, 0x4f, 0x7a, + 0xd8, 0x30, 0x85, 0xbf, 0x70, 0xb0, 0xe0, 0x1b, 0x30, 0xba, 0x9a, 0x6a, 0x60, 0x84, 0x20, 0xa5, + 0xca, 0x1d, 0x9c, 0xe3, 0x56, 0xb9, 0xb5, 0x29, 0x91, 0xfc, 0x46, 0x97, 0x60, 0xf6, 0x08, 0xab, + 0x2d, 0x4d, 0x97, 0x8e, 0xb0, 0x6e, 0x28, 0x9a, 0x9a, 0x4b, 0x90, 0xd1, 0x19, 0x0a, 0xbd, 0x4f, + 0x81, 0x68, 0x0b, 0x26, 0x3b, 0xb2, 0xaa, 0x1c, 0x60, 0xc3, 0xcc, 0x25, 0x57, 0x93, 0x6b, 0x99, + 0xf5, 0x57, 0xf2, 0x74, 0xa9, 0xf9, 0xd0, 0xb9, 0xf2, 0xf7, 0x18, 0x76, 0x59, 0x35, 0xf5, 0x63, + 0xd1, 0x21, 0xe6, 0x6f, 0xc1, 0x8c, 0x67, 0x08, 0x65, 0x21, 0xf9, 0x09, 0x3e, 0x66, 0x32, 0x59, + 0x3f, 0xd1, 0x3c, 0xa4, 0x8f, 0xe4, 0x76, 0x0f, 0x33, 0x49, 0xe8, 0xc7, 0x46, 0xe2, 0x3f, 0x38, + 0xe1, 0x1c, 0x2c, 0x3b, 0xb3, 0x95, 0xe4, 0xae, 0xbc, 0xaf, 0xb4, 0x15, 0x53, 0xc1, 0x86, 0xbd, + 0xf4, 0x8f, 0x60, 0x25, 0x62, 0x9c, 0xed, 0xc0, 0x6d, 0x98, 0x6e, 0xba, 0xe0, 0x39, 0x8e, 0x2c, + 0x25, 0x67, 0x2f, 0xc5, 0x47, 0x79, 0x2c, 0x7a, 0xb0, 0x85, 0x3f, 0x26, 0x21, 0xeb, 0x47, 0x41, + 0xb7, 0x61, 0xc2, 0xc0, 0xfa, 0x91, 0xd2, 0xa4, 0xfb, 0x9a, 0x59, 0x5f, 0x8d, 0xe2, 0x96, 0xaf, + 0x53, 0xbc, 0xed, 0x31, 0xd1, 0x26, 0x41, 0x7b, 0x90, 0x3d, 0xd2, 0xda, 0xbd, 0x0e, 0x96, 0xf0, + 0xd3, 0xae, 0xac, 0x3a, 0x07, 0x90, 0x59, 0x5f, 0x8b, 0x64, 0x73, 0x9f, 0x10, 0x94, 0x6d, 0xfc, + 0xed, 0x31, 0xf1, 0xd4, 0x91, 0x17, 0xc4, 0x7f, 0xca, 0xc1, 0x04, 0x9b, 0x0d, 0xbd, 0x05, 0x29, + 0xf3, 0xb8, 0x4b, 0xa5, 0x9b, 0x5d, 0xbf, 0x34, 0x48, 0xba, 0x7c, 0xe3, 0xb8, 0x8b, 0x45, 0x42, + 0x22, 0x7c, 0x00, 0x29, 0xeb, 0x0b, 0x65, 0x60, 0x62, 0xaf, 0x76, 0xb7, 0xb6, 0xf3, 0xa0, 0x96, + 0x1d, 0x43, 0x8b, 0x80, 0x4a, 0x3b, 0xb5, 0x86, 0xb8, 0x53, 0xad, 0x96, 0x45, 0xa9, 0x5e, 0x16, + 0xef, 0x57, 0x4a, 0xe5, 0x2c, 0x87, 0x5e, 0x82, 0xd5, 0xfb, 0x3b, 0xd5, 0xbd, 0x7b, 0x65, 0xa9, + 0x50, 0x2a, 0x95, 0xeb, 0xf5, 0x4a, 0xb1, 0x52, 0xad, 0x34, 0x1e, 0x4a, 0xa5, 0x9d, 0x5a, 0xbd, + 0x21, 0x16, 0x2a, 0xb5, 0x46, 0x3d, 0x9b, 0xe0, 0xff, 0x9f, 0x83, 0x53, 0xbe, 0x05, 0xa0, 0x82, + 0x47, 0xc2, 0xeb, 0xc3, 0x2e, 0xdc, 0x2d, 0xe9, 0xb5, 0x30, 0x49, 0x01, 0xc6, 0x77, 0x6a, 0xd5, + 0x4a, 0xcd, 0x92, 0x2e, 0x03, 0x13, 0x3b, 0x77, 0xee, 0x90, 0x8f, 0x44, 0x71, 0x9c, 0x4e, 0x28, + 0xcc, 0xc2, 0xf4, 0xae, 0xae, 0xed, 0x63, 0x5b, 0x7f, 0x0a, 0x30, 0xc3, 0xbe, 0x99, 0xbe, 0xbc, + 0x0a, 0x69, 0x1d, 0xcb, 0xad, 0x63, 0x76, 0xb4, 0x7c, 0x9e, 0xda, 0x64, 0xde, 0xb6, 0xc9, 0x7c, + 0x51, 0xd3, 0xda, 0xf7, 0x2d, 0xfd, 0x14, 0x29, 0xa2, 0xf0, 0x4d, 0x0a, 0xe6, 0x4a, 0x3a, 0x96, + 0x4d, 0x4c, 0xa5, 0x65, 0xac, 0x43, 0x6d, 0xef, 0x36, 0xcc, 0x5a, 0xfa, 0xd5, 0x54, 0xcc, 0x63, + 0x49, 0x97, 0xd5, 0x43, 0xcc, 0x8e, 0x7e, 0xc1, 0xde, 0x81, 0x12, 0x1b, 0x15, 0xad, 0x41, 0x71, + 0xa6, 0xe9, 0xfe, 0x44, 0x15, 0x98, 0x63, 0xaa, 0xe3, 0x51, 0xe9, 0xa4, 0x57, 0xa5, 0xa9, 0x14, + 0x2e, 0x95, 0x46, 0x47, 0x5e, 0x88, 0x82, 0x0d, 0x74, 0x17, 0xa0, 0x2b, 0xeb, 0x72, 0x07, 0x9b, + 0x58, 0x37, 0x72, 0x29, 0xaf, 0x7d, 0x87, 0xac, 0x26, 0xbf, 0xeb, 0x60, 0x53, 0xfb, 0x76, 0x91, + 0xa3, 0x2d, 0xcb, 0x20, 0x9a, 0x3a, 0x36, 0x8d, 0x5c, 0x9a, 0x70, 0x5a, 0x8b, 0xe3, 0x54, 0xa7, + 0xa8, 0x84, 0x4d, 0x31, 0xf9, 0xe3, 0x22, 0x27, 0xda, 0xd4, 0x68, 0x07, 0x16, 0xec, 0x05, 0x6a, + 0xaa, 0x89, 0x55, 0x53, 0x32, 0xb4, 0x9e, 0xde, 0xc4, 0xb9, 0x71, 0xb2, 0x4b, 0x4b, 0xbe, 0x25, + 0x52, 0x9c, 0x3a, 0x41, 0x11, 0xd9, 0xd6, 0x78, 0x80, 0xe8, 0x11, 0xf0, 0x72, 0xb3, 0x89, 0x0d, + 0x43, 0xa1, 0x7b, 0x21, 0xe9, 0xf8, 0x49, 0x4f, 0xd1, 0x71, 0x07, 0xab, 0xa6, 0x91, 0x9b, 0xf0, + 0x72, 0x6d, 0x68, 0x5d, 0xad, 0xad, 0x1d, 0x1e, 0x8b, 0x7d, 0x1c, 0xf1, 0xac, 0x87, 0xdc, 0x35, + 0x62, 0xf0, 0x6f, 0xc3, 0x29, 0xdf, 0xa6, 0x8c, 0xe2, 0xd9, 0xf8, 0x0d, 0x98, 0x76, 0xef, 0xc4, + 0x48, 0x5e, 0xf1, 0xfb, 0x09, 0x98, 0x0b, 0xd9, 0x03, 0xb4, 0x0d, 0x93, 0x86, 0x2a, 0x77, 0x8d, + 0xc7, 0x9a, 0xc9, 0xf4, 0xf7, 0x6a, 0xcc, 0x96, 0xe5, 0xeb, 0x0c, 0x97, 0x7e, 0x6e, 0x8f, 0x89, + 0x0e, 0x35, 0x2a, 0xc2, 0x38, 0xdd, 0x4f, 0xbf, 0x6f, 0x0a, 0xe3, 0x43, 0x61, 0x0e, 0x17, 0x46, + 0xc9, 0xbf, 0x06, 0xb3, 0xde, 0x19, 0xd0, 0x79, 0xc8, 0xd8, 0x33, 0x48, 0x4a, 0x8b, 0xad, 0x15, + 0x6c, 0x50, 0xa5, 0xc5, 0xbf, 0x02, 0xd3, 0x6e, 0x66, 0x68, 0x09, 0xa6, 0x98, 0x42, 0x38, 0xe8, + 0x93, 0x14, 0x50, 0x69, 0x39, 0x36, 0xfd, 0x0e, 0xcc, 0x7b, 0xf5, 0x8c, 0x99, 0xf2, 0x65, 0x67, + 0x0d, 0x74, 0x2f, 0x66, 0xbd, 0x6b, 0xb0, 0xe5, 0x14, 0x7e, 0x99, 0x82, 0xac, 0xdf, 0x68, 0xd0, + 0x6d, 0x48, 0xef, 0xb7, 0xb5, 0xe6, 0x27, 0x8c, 0xf6, 0xa5, 0x28, 0xeb, 0xca, 0x17, 0x2d, 0x2c, + 0x0a, 0xdd, 0x1e, 0x13, 0x29, 0x91, 0x45, 0xdd, 0xd1, 0x7a, 0xaa, 0xc9, 0x76, 0x2f, 0x9a, 0xfa, + 0x9e, 0x85, 0xd5, 0xa7, 0x26, 0x44, 0x68, 0x13, 0x32, 0x54, 0xed, 0xa4, 0x8e, 0xd6, 0xc2, 0xb9, + 0x24, 0xe1, 0x71, 0x31, 0x92, 0x47, 0x81, 0xe0, 0xde, 0xd3, 0x5a, 0x58, 0x04, 0xd9, 0xf9, 0xcd, + 0xcf, 0x40, 0xc6, 0x25, 0x1b, 0xbf, 0x05, 0x19, 0xd7, 0x64, 0xe8, 0x0c, 0x4c, 0x1c, 0x18, 0x92, + 0xe3, 0x84, 0xa7, 0xc4, 0xf1, 0x03, 0x83, 0xf8, 0xd3, 0xf3, 0x90, 0x21, 0x52, 0x48, 0x07, 0x6d, + 0xf9, 0xd0, 0xc8, 0x25, 0x56, 0x93, 0xd6, 0x19, 0x11, 0xd0, 0x1d, 0x0b, 0xc2, 0x7f, 0xcd, 0x01, + 0xf4, 0xa7, 0x44, 0xb7, 0x21, 0x45, 0xa4, 0xa4, 0xae, 0x7c, 0x6d, 0x08, 0x29, 0xf3, 0x44, 0x54, + 0x42, 0x25, 0xfc, 0x84, 0x83, 0x14, 0x61, 0xe3, 0xbf, 0x70, 0xea, 0x95, 0xda, 0x56, 0xb5, 0x2c, + 0xd5, 0x76, 0x36, 0xcb, 0xd2, 0x03, 0xb1, 0xd2, 0x28, 0x8b, 0x59, 0x0e, 0x2d, 0xc1, 0x19, 0x37, + 0x5c, 0x2c, 0x17, 0x36, 0xcb, 0xa2, 0xb4, 0x53, 0xab, 0x3e, 0xcc, 0x26, 0x10, 0x0f, 0x8b, 0xf7, + 0xf6, 0xaa, 0x8d, 0x4a, 0x70, 0x2c, 0x89, 0x96, 0x21, 0xe7, 0x1a, 0x63, 0x3c, 0x18, 0xdb, 0x94, + 0xc5, 0xd6, 0x35, 0x4a, 0x7f, 0xb2, 0xc1, 0x74, 0x71, 0xc6, 0x39, 0x0c, 0xa2, 0x6c, 0x0f, 0x60, + 0xc6, 0xe3, 0xa3, 0xad, 0x70, 0x8a, 0x39, 0x95, 0x96, 0xb4, 0x7f, 0x6c, 0x92, 0x10, 0x83, 0x5b, + 0x4b, 0x8a, 0x33, 0x36, 0xb4, 0x68, 0x01, 0xad, 0x6d, 0x6d, 0x2b, 0x1d, 0xc5, 0x64, 0x38, 0x09, + 0x82, 0x03, 0x04, 0x44, 0x10, 0x84, 0x2f, 0x13, 0x30, 0xce, 0xce, 0xe6, 0x92, 0xeb, 0x96, 0xf0, + 0xb0, 0xb4, 0xa1, 0x94, 0xa5, 0xc7, 0x38, 0x12, 0x5e, 0xe3, 0x40, 0xdb, 0x30, 0xeb, 0x76, 0xa5, + 0x4f, 0xed, 0x20, 0xee, 0x82, 0xf7, 0x80, 0xdc, 0xf6, 0xfc, 0x94, 0x85, 0x6e, 0x33, 0x47, 0x6e, + 0x18, 0x2a, 0xc2, 0xac, 0xcf, 0x1b, 0xa7, 0x06, 0x7b, 0xe3, 0x99, 0xa6, 0xc7, 0x31, 0x15, 0x60, + 0xce, 0x76, 0xa4, 0x6d, 0x2c, 0x99, 0xcc, 0xd1, 0xb2, 0xdb, 0x22, 0x1b, 0x70, 0xc0, 0xa8, 0x8f, + 0x6c, 0xc3, 0xf8, 0xf7, 0x00, 0x05, 0x65, 0x1d, 0xc9, 0x6b, 0xf6, 0x60, 0x2e, 0xc4, 0xc5, 0xa3, + 0x3c, 0x4c, 0x91, 0xa3, 0x32, 0x14, 0x13, 0xb3, 0xf0, 0x30, 0x28, 0x51, 0x1f, 0xc5, 0xc2, 0xef, + 0xea, 0xf8, 0x00, 0xeb, 0x3a, 0x6e, 0x11, 0xf3, 0x08, 0xc5, 0x77, 0x50, 0x84, 0xef, 0x70, 0x30, + 0x69, 0xc3, 0xd1, 0x06, 0x4c, 0x1a, 0xf8, 0x90, 0x5e, 0x3f, 0x74, 0xae, 0x73, 0x7e, 0xda, 0x7c, + 0x9d, 0x21, 0xb0, 0x40, 0xda, 0xc6, 0xb7, 0x02, 0x69, 0xcf, 0xd0, 0x48, 0x8b, 0xff, 0x0d, 0x07, + 0x73, 0x9b, 0xb8, 0x8d, 0xfd, 0x51, 0x4a, 0x9c, 0x87, 0x75, 0x5f, 0xec, 0x09, 0xef, 0xc5, 0x1e, + 0xc2, 0x2a, 0xe6, 0x62, 0x3f, 0xd1, 0x65, 0xb7, 0x08, 0xf3, 0xde, 0xd9, 0xa8, 0x7b, 0x17, 0xfe, + 0x9e, 0x84, 0x73, 0x96, 0x2e, 0xe8, 0x5a, 0xbb, 0x8d, 0xf5, 0xdd, 0xde, 0x7e, 0x5b, 0x31, 0x1e, + 0x8f, 0xb0, 0xb8, 0x33, 0x30, 0xa1, 0x6a, 0x2d, 0x97, 0xf1, 0x8c, 0x5b, 0x9f, 0x95, 0x16, 0x2a, + 0xc3, 0x69, 0x7f, 0x98, 0x75, 0xcc, 0x9c, 0x70, 0x74, 0x90, 0x95, 0x3d, 0xf2, 0xdf, 0x20, 0x3c, + 0x4c, 0x5a, 0x01, 0xa2, 0xa6, 0xb6, 0x8f, 0x89, 0xc5, 0x4c, 0x8a, 0xce, 0x37, 0x12, 0xfd, 0x11, + 0xd3, 0xeb, 0x4e, 0xc4, 0x14, 0xbb, 0xa2, 0xb8, 0xe0, 0xe9, 0xe3, 0x80, 0xc5, 0x8f, 0x13, 0xd6, + 0x6f, 0x0d, 0xc9, 0x7a, 0xa0, 0x27, 0x38, 0xc9, 0x29, 0x3e, 0x07, 0xf3, 0xfd, 0x3d, 0x07, 0xe7, + 0x23, 0x97, 0xc0, 0xae, 0xfc, 0x16, 0x9c, 0xea, 0xd2, 0x01, 0x67, 0x13, 0xa8, 0x95, 0xdd, 0x1a, + 0xb8, 0x09, 0x2c, 0x8b, 0x65, 0x50, 0xcf, 0x36, 0xcc, 0x76, 0x3d, 0x40, 0xbe, 0x00, 0x73, 0x21, + 0x68, 0x23, 0x2d, 0xe6, 0x2b, 0x0e, 0x56, 0xfb, 0xa2, 0xec, 0xa9, 0xdd, 0xe7, 0xa7, 0xbe, 0x8d, + 0xbe, 0x6e, 0x51, 0x97, 0x7f, 0x33, 0xb8, 0xf6, 0xf0, 0x09, 0x5f, 0x94, 0x05, 0x5f, 0x84, 0x0b, + 0x31, 0x53, 0x33, 0x73, 0xfe, 0x32, 0x05, 0x17, 0xee, 0xcb, 0x6d, 0xa5, 0xe5, 0x04, 0x72, 0x21, + 0xf9, 0x7e, 0xfc, 0x96, 0x34, 0x03, 0x16, 0x40, 0xbd, 0xd6, 0x6d, 0xc7, 0x6a, 0x07, 0xf1, 0x1f, + 0xe2, 0x3a, 0x7c, 0x8e, 0x49, 0xd8, 0xc3, 0x90, 0x24, 0xec, 0xad, 0xe1, 0x65, 0x8d, 0x4b, 0xc9, + 0xf6, 0xfc, 0x0e, 0xe6, 0xcd, 0xe1, 0xf9, 0xc6, 0x68, 0xc1, 0x89, 0xad, 0xf8, 0xdb, 0xcc, 0x9a, + 0x7e, 0x97, 0x02, 0x21, 0x6e, 0xf5, 0xcc, 0x87, 0x88, 0x30, 0xd5, 0xd4, 0xd4, 0x03, 0x45, 0xef, + 0xe0, 0x16, 0x8b, 0xfe, 0xdf, 0x18, 0x66, 0xf3, 0x98, 0x03, 0x29, 0xd9, 0xb4, 0x62, 0x9f, 0x0d, + 0xca, 0xc1, 0x44, 0x07, 0x1b, 0x86, 0x7c, 0x68, 0x8b, 0x65, 0x7f, 0xf2, 0x9f, 0x27, 0x61, 0xca, + 0x21, 0x41, 0x6a, 0x40, 0x83, 0xa9, 0xfb, 0xda, 0x7a, 0x16, 0x01, 0x9e, 0x5d, 0x99, 0x13, 0xcf, + 0xa0, 0xcc, 0x2d, 0x8f, 0x32, 0x53, 0x73, 0xd8, 0x7c, 0x26, 0xb1, 0x63, 0xf4, 0xfa, 0x5b, 0x57, + 0x40, 0xe1, 0xbf, 0x00, 0x55, 0x15, 0x83, 0x65, 0x51, 0x8e, 0x5b, 0xb2, 0x92, 0x26, 0xf9, 0xa9, + 0x84, 0x55, 0x53, 0x57, 0x58, 0xb8, 0x9e, 0x16, 0xa1, 0x23, 0x3f, 0x2d, 0x53, 0x88, 0x15, 0xd2, + 0x1b, 0xa6, 0xac, 0x9b, 0x8a, 0x7a, 0x28, 0x99, 0xda, 0x27, 0xd8, 0x29, 0xba, 0xda, 0xd0, 0x86, + 0x05, 0x14, 0xbe, 0x4e, 0xc0, 0x9c, 0x87, 0x3d, 0xd3, 0xc9, 0x5b, 0x30, 0xd1, 0xe7, 0xed, 0x09, + 0xe3, 0x43, 0xb0, 0xf3, 0x74, 0xdb, 0x6c, 0x0a, 0xb4, 0x02, 0xa0, 0xe2, 0xa7, 0xa6, 0x67, 0xde, + 0x29, 0x0b, 0x42, 0xe6, 0xe4, 0xbf, 0xcb, 0x39, 0x49, 0xb7, 0x29, 0x9b, 0x3d, 0x03, 0x5d, 0x03, + 0xc4, 0x5c, 0x34, 0x6e, 0x49, 0xec, 0x8e, 0xa1, 0xf3, 0x4e, 0x89, 0x59, 0x67, 0xa4, 0x46, 0x6e, + 0x1b, 0x03, 0x6d, 0x39, 0xf5, 0xcc, 0xa6, 0xa6, 0xb6, 0x14, 0xb3, 0x5f, 0xcf, 0x3c, 0x13, 0x48, + 0x10, 0xe8, 0x70, 0x31, 0xf9, 0xd3, 0x22, 0x67, 0x57, 0x30, 0x1d, 0x28, 0xff, 0x04, 0xd2, 0xf4, + 0x38, 0x86, 0xcc, 0xdb, 0xd1, 0x7b, 0x30, 0x6e, 0x10, 0x89, 0xfd, 0x35, 0x8a, 0xb0, 0x3d, 0x71, + 0xaf, 0x50, 0x64, 0x74, 0xc2, 0x3b, 0xc0, 0xf7, 0x2f, 0xa6, 0x2d, 0x6c, 0x0e, 0x7f, 0xfd, 0x6e, + 0x58, 0x6b, 0x10, 0x3e, 0x4d, 0xc0, 0x52, 0x28, 0x83, 0xd1, 0x2a, 0x10, 0x68, 0xdb, 0xb7, 0x92, + 0x57, 0x83, 0x37, 0x76, 0x80, 0x79, 0xe8, 0x8a, 0xf8, 0xff, 0x3b, 0xd9, 0x61, 0x16, 0x47, 0x3e, + 0xcc, 0xc0, 0x39, 0xd2, 0x9d, 0xf9, 0x3c, 0x01, 0x68, 0x0b, 0x9b, 0x4e, 0xaa, 0xcc, 0xb6, 0x34, + 0xc2, 0xdf, 0x70, 0xcf, 0xe0, 0x6f, 0xde, 0xf7, 0xf8, 0x1b, 0xea, 0xb1, 0xae, 0xba, 0x3a, 0x14, + 0xbe, 0xa9, 0x63, 0x6f, 0xcb, 0x88, 0xf4, 0x94, 0xc6, 0xfc, 0xc3, 0xa5, 0xa7, 0x27, 0x74, 0x2b, + 0x9b, 0x30, 0xe7, 0x91, 0x99, 0x29, 0xd0, 0x75, 0x40, 0xf2, 0x91, 0xac, 0xb4, 0x65, 0x4b, 0x2e, + 0x3b, 0xfb, 0x67, 0xd5, 0x80, 0xd3, 0xce, 0x88, 0x4d, 0x26, 0x08, 0xee, 0xa0, 0x92, 0xf1, 0xf3, + 0x77, 0x4c, 0xda, 0xee, 0x60, 0x2c, 0x80, 0xc3, 0xe6, 0xdd, 0x0a, 0xed, 0x9a, 0x5c, 0x0c, 0xaa, + 0x25, 0x6b, 0x21, 0x44, 0x36, 0x50, 0xfe, 0x96, 0x74, 0x5b, 0x48, 0x00, 0x1b, 0xdd, 0x82, 0xa4, + 0xde, 0x6d, 0x32, 0xf3, 0x78, 0x79, 0x08, 0xfe, 0x79, 0x71, 0xb7, 0xb4, 0x3d, 0x26, 0x5a, 0x54, + 0xfc, 0x3f, 0x12, 0x90, 0x14, 0x77, 0x4b, 0xe8, 0x3d, 0x4f, 0x37, 0xe1, 0xda, 0x90, 0x5c, 0xdc, + 0xcd, 0x84, 0xcf, 0x12, 0x61, 0xdd, 0x84, 0x1c, 0xcc, 0x97, 0xc4, 0x72, 0xa1, 0x51, 0x96, 0x36, + 0xcb, 0xd5, 0x72, 0xa3, 0x2c, 0xd1, 0x6e, 0x47, 0x96, 0x43, 0xcb, 0x90, 0xdb, 0xdd, 0x2b, 0x56, + 0x2b, 0xf5, 0x6d, 0x69, 0xaf, 0x66, 0xff, 0x62, 0xa3, 0x09, 0x94, 0x85, 0xe9, 0x6a, 0xa5, 0xde, + 0x60, 0x80, 0x7a, 0x36, 0x69, 0x41, 0xb6, 0xca, 0x0d, 0xa9, 0x54, 0xd8, 0x2d, 0x94, 0x2a, 0x8d, + 0x87, 0xd9, 0x14, 0xe2, 0x61, 0xd1, 0xcb, 0xbb, 0x5e, 0x2b, 0xec, 0xd6, 0xb7, 0x77, 0x1a, 0xd9, + 0x34, 0x42, 0x30, 0x4b, 0xe8, 0x6d, 0x50, 0x3d, 0x3b, 0x6e, 0x71, 0x28, 0x55, 0x77, 0x6a, 0x8e, + 0x0c, 0x13, 0x68, 0x1e, 0xb2, 0xf6, 0xcc, 0x62, 0xb9, 0xb0, 0x49, 0x2a, 0x5d, 0x93, 0xe8, 0x34, + 0xcc, 0x94, 0x3f, 0xdc, 0x2d, 0xd4, 0x36, 0x6d, 0xc4, 0x29, 0xb4, 0x0a, 0xcb, 0x6e, 0x71, 0x24, + 0x46, 0x55, 0xde, 0x24, 0xf5, 0xae, 0x7a, 0x16, 0xd0, 0x59, 0xc8, 0xb2, 0x46, 0x4e, 0x69, 0xa7, + 0xb6, 0x59, 0x69, 0x54, 0x76, 0x6a, 0xd9, 0x0c, 0x6f, 0x19, 0x32, 0x9a, 0x03, 0xb0, 0x24, 0x67, + 0xcc, 0xa6, 0x09, 0xd0, 0xa9, 0xbc, 0x7e, 0x95, 0x80, 0x05, 0x5a, 0x7a, 0xb5, 0x0b, 0xbd, 0xb6, + 0xa1, 0xaf, 0x41, 0x96, 0x16, 0x8b, 0x24, 0xbf, 0x0b, 0x9d, 0xa5, 0xf0, 0xfb, 0x76, 0xd0, 0x6e, + 0xb7, 0x49, 0x12, 0xae, 0x36, 0x49, 0xc5, 0x9f, 0xc2, 0x5c, 0xf5, 0x36, 0x14, 0x7c, 0xb3, 0xc5, + 0x65, 0xc5, 0xf7, 0x42, 0x62, 0xec, 0xeb, 0xf1, 0xdc, 0xe2, 0xe2, 0x8f, 0x93, 0xa4, 0xc0, 0x27, + 0x74, 0x11, 0x77, 0x60, 0xd1, 0x2f, 0x2f, 0xb3, 0xd6, 0x6b, 0x81, 0xb2, 0xbf, 0xe3, 0xb3, 0x1c, + 0x5c, 0x07, 0x43, 0xf8, 0x33, 0x07, 0x93, 0x36, 0xd8, 0x8a, 0x0d, 0x0c, 0xe5, 0x7f, 0xb0, 0xa7, + 0xcc, 0x38, 0x65, 0x41, 0x9c, 0xaa, 0xa5, 0xbb, 0x60, 0x9f, 0xf0, 0x17, 0xec, 0x43, 0xcf, 0x39, + 0x19, 0x7a, 0xce, 0xef, 0xc2, 0x4c, 0xd3, 0x12, 0x5f, 0xd1, 0x54, 0xc9, 0x54, 0x3a, 0x76, 0x15, + 0x31, 0xd8, 0x60, 0x6b, 0xd8, 0x5d, 0x71, 0x71, 0xda, 0x26, 0xb0, 0x40, 0x68, 0x15, 0xa6, 0x49, + 0xc3, 0x4d, 0x32, 0x35, 0xa9, 0x67, 0xe0, 0x5c, 0x9a, 0xd4, 0x54, 0x80, 0xc0, 0x1a, 0xda, 0x9e, + 0x81, 0x85, 0xdf, 0x72, 0xb0, 0x40, 0x4b, 0x45, 0x7e, 0x75, 0x1c, 0xd4, 0x78, 0x70, 0x6b, 0x9c, + 0xef, 0x2a, 0x09, 0x65, 0xf8, 0xa2, 0x32, 0xe5, 0x1c, 0x2c, 0xfa, 0xe7, 0x63, 0xe9, 0xf1, 0x17, + 0x09, 0x98, 0xb7, 0xe2, 0x1a, 0x7b, 0xe0, 0x79, 0x87, 0x9e, 0x23, 0x9c, 0xa4, 0x6f, 0x33, 0x53, + 0x81, 0xcd, 0xdc, 0xf6, 0x27, 0x9f, 0x57, 0xdc, 0x91, 0x99, 0x7f, 0x05, 0x2f, 0x6a, 0x2f, 0x3f, + 0xe3, 0x60, 0xc1, 0x37, 0x1f, 0xb3, 0x97, 0xb7, 0xfd, 0xd1, 0xf4, 0xc5, 0x08, 0xf9, 0x9e, 0x29, + 0x9e, 0xbe, 0x69, 0xc7, 0xb1, 0xa3, 0x99, 0xe5, 0x9f, 0x12, 0xb0, 0xd2, 0xbf, 0xb1, 0x48, 0xcb, + 0xbb, 0x35, 0x42, 0x39, 0xe8, 0x64, 0x9d, 0xe5, 0x0f, 0xfc, 0x0e, 0x77, 0x3d, 0x78, 0x89, 0x86, + 0x88, 0x14, 0xe7, 0x78, 0x43, 0xab, 0xa8, 0xa9, 0x51, 0xab, 0xa8, 0x27, 0xd2, 0x80, 0xff, 0x75, + 0x17, 0x88, 0xbd, 0xe2, 0x33, 0x4d, 0x18, 0xb2, 0xd3, 0xf2, 0x26, 0x9c, 0x21, 0xa1, 0xb3, 0xf3, + 0x62, 0xc3, 0xee, 0x23, 0x53, 0x97, 0x38, 0x29, 0x2e, 0x58, 0xc3, 0xce, 0x33, 0x05, 0xd6, 0x5d, + 0x68, 0x09, 0xdf, 0xa4, 0x60, 0xd1, 0x0a, 0xad, 0xeb, 0xa6, 0x7c, 0x38, 0x4a, 0xdd, 0xfd, 0x3f, + 0x83, 0x65, 0xcc, 0x84, 0xf7, 0x58, 0xc2, 0xb9, 0x0e, 0x53, 0xbd, 0x44, 0x79, 0x98, 0x33, 0x4c, + 0xf9, 0x90, 0xb8, 0x03, 0x59, 0x3f, 0xc4, 0xa6, 0xd4, 0x95, 0xcd, 0xc7, 0xcc, 0xd6, 0x4f, 0xb3, + 0xa1, 0x06, 0x19, 0xd9, 0x95, 0xcd, 0xc7, 0xcf, 0xe9, 0x20, 0xd1, 0xfb, 0x7e, 0xa7, 0xf0, 0xca, + 0x80, 0xb5, 0xc4, 0xe8, 0xd6, 0x87, 0x11, 0xa5, 0xee, 0xd7, 0x06, 0xb0, 0x1c, 0x5c, 0xe2, 0x3e, + 0x79, 0x69, 0xf7, 0x5b, 0xae, 0x92, 0x9f, 0x85, 0x33, 0x81, 0xc5, 0xb3, 0x2b, 0xe4, 0x10, 0x72, + 0xd6, 0xd0, 0x9e, 0x6a, 0x8c, 0xa8, 0x8e, 0x11, 0x1a, 0x93, 0x88, 0xd0, 0x18, 0x61, 0x09, 0xce, + 0x86, 0x4c, 0xc4, 0xa4, 0xf8, 0x75, 0x9a, 0x8a, 0x31, 0x7a, 0xc3, 0xe6, 0xa3, 0x28, 0xab, 0x78, + 0xc3, 0x7d, 0xec, 0xa1, 0xbd, 0x8d, 0x17, 0x61, 0x17, 0xe7, 0x21, 0xe3, 0xc6, 0x63, 0xd7, 0xa0, + 0x39, 0xc0, 0x70, 0xd2, 0x27, 0xea, 0x23, 0x8d, 0xfb, 0xfa, 0x48, 0xd5, 0xbe, 0x51, 0x4d, 0x78, + 0x43, 0xdb, 0xc8, 0xad, 0x88, 0x31, 0xab, 0x47, 0x01, 0xb3, 0x9a, 0xf4, 0x36, 0xa7, 0x22, 0x99, + 0xfe, 0x1b, 0x18, 0x16, 0x53, 0xea, 0xd0, 0xae, 0x91, 0xf0, 0x08, 0x78, 0xaa, 0xf1, 0xa3, 0xf7, + 0x71, 0x7c, 0x6a, 0x94, 0xf0, 0xab, 0x91, 0xb0, 0x02, 0x4b, 0xa1, 0xbc, 0xd9, 0xd4, 0xdf, 0xe3, + 0xa8, 0x60, 0x4e, 0x81, 0xa8, 0x6e, 0xca, 0xa6, 0x31, 0xec, 0xd4, 0x6c, 0xd0, 0x3d, 0x35, 0x05, + 0x11, 0x0d, 0x1e, 0xd1, 0x24, 0x84, 0x1f, 0x71, 0x74, 0x1f, 0xfc, 0xb2, 0xb0, 0xdb, 0xf6, 0x0a, + 0xa4, 0x7b, 0xa4, 0x06, 0x4e, 0xa3, 0xae, 0x39, 0xaf, 0x11, 0xec, 0x59, 0x43, 0x22, 0xc5, 0x78, + 0x6e, 0x55, 0x45, 0xe1, 0x0b, 0x0e, 0x32, 0x2e, 0xfe, 0x68, 0x19, 0xa6, 0x9c, 0xba, 0x89, 0x9d, + 0xef, 0x38, 0x00, 0xeb, 0xf8, 0x4d, 0xcd, 0x94, 0xdb, 0xec, 0x7d, 0x06, 0xfd, 0xb0, 0x52, 0xd4, + 0x9e, 0x81, 0x69, 0x38, 0x9c, 0x14, 0xc9, 0x6f, 0x74, 0x0d, 0x52, 0x3d, 0x55, 0x31, 0x89, 0xd9, + 0xcf, 0xfa, 0xed, 0x99, 0x4c, 0x95, 0xdf, 0x53, 0x15, 0x53, 0x24, 0x58, 0xc2, 0x55, 0x48, 0x59, + 0x5f, 0xde, 0xf2, 0xc2, 0x14, 0xa4, 0x8b, 0x0f, 0x1b, 0xe5, 0x7a, 0x96, 0x43, 0x00, 0xe3, 0x15, + 0x9a, 0x8c, 0x27, 0x84, 0xaa, 0xfd, 0x5c, 0xd2, 0x59, 0x84, 0xe5, 0x02, 0xe4, 0x7d, 0x55, 0xd3, + 0x3b, 0x72, 0x9b, 0xc8, 0x3c, 0x29, 0x3a, 0xdf, 0xd1, 0xad, 0x05, 0x5a, 0x88, 0x5b, 0x76, 0x4e, + 0x24, 0xac, 0x18, 0xf4, 0x31, 0xd5, 0xad, 0xa8, 0x32, 0x50, 0x21, 0xb4, 0x0c, 0xb4, 0xe2, 0xb9, + 0x65, 0x07, 0x14, 0x80, 0x7e, 0x98, 0x80, 0x85, 0x50, 0x3c, 0x74, 0xd3, 0x5d, 0xfa, 0xb9, 0x10, + 0xcb, 0xd3, 0x5d, 0xf4, 0xf9, 0x15, 0x47, 0x8b, 0x3e, 0x1b, 0x9e, 0xa2, 0xcf, 0xe5, 0x81, 0xf4, + 0xee, 0x72, 0xcf, 0x93, 0x88, 0x6a, 0x4f, 0xbd, 0x51, 0xd8, 0x2a, 0x4b, 0x7b, 0x35, 0xfa, 0xd7, + 0xa9, 0xf6, 0xcc, 0x43, 0xb6, 0x5f, 0x03, 0x91, 0xea, 0x8d, 0x42, 0xa3, 0x9e, 0x4d, 0x04, 0x2b, + 0x2d, 0xc9, 0xd0, 0x3a, 0x4a, 0xca, 0x5b, 0x32, 0x99, 0x07, 0xc4, 0x76, 0xdc, 0xfd, 0x82, 0xfb, + 0x67, 0x1c, 0xcc, 0x79, 0xc0, 0xec, 0x00, 0x5c, 0x4d, 0x5e, 0xce, 0xd3, 0xe4, 0xbd, 0x01, 0xf3, + 0x56, 0xd6, 0x47, 0xb5, 0xdd, 0x90, 0xba, 0x58, 0x27, 0xc5, 0x5d, 0xa6, 0xb7, 0xa7, 0x3b, 0xf2, + 0x53, 0x56, 0x00, 0xdf, 0xc5, 0xba, 0xc5, 0xf8, 0x39, 0x94, 0x38, 0x85, 0x1f, 0x24, 0x68, 0x6c, + 0x31, 0x72, 0x6e, 0x32, 0xd0, 0xcf, 0x04, 0x93, 0x97, 0xe4, 0x08, 0xc9, 0x4b, 0x84, 0x97, 0x4a, + 0x8d, 0x14, 0xd0, 0x8e, 0x7c, 0x2f, 0x0b, 0x05, 0x1a, 0xc7, 0x9c, 0x20, 0xaf, 0x58, 0xff, 0x27, + 0x07, 0x93, 0x95, 0x16, 0x56, 0x4d, 0xcb, 0x1e, 0x6a, 0x30, 0xe3, 0x79, 0x58, 0x8f, 0x96, 0x23, + 0xde, 0xdb, 0x93, 0x1d, 0xe7, 0x57, 0x62, 0x5f, 0xe3, 0x0b, 0x63, 0xe8, 0xc0, 0xf5, 0x4f, 0x01, + 0x9e, 0xca, 0xf9, 0x4b, 0x01, 0xca, 0x10, 0xd7, 0xc0, 0x5f, 0x1a, 0x80, 0xe5, 0xcc, 0xf3, 0x26, + 0xa4, 0xc9, 0x13, 0x6a, 0x34, 0xef, 0x3c, 0xe3, 0x76, 0xbd, 0xb0, 0xe6, 0x17, 0x7c, 0x50, 0x9b, + 0x6e, 0xfd, 0x0f, 0x53, 0x00, 0xfd, 0xf4, 0x0c, 0xdd, 0x85, 0x69, 0xf7, 0x2b, 0x4e, 0xb4, 0x14, + 0xf3, 0x86, 0x98, 0x5f, 0x0e, 0x1f, 0x74, 0x64, 0xba, 0x0b, 0xd3, 0xee, 0x37, 0x43, 0x7d, 0x66, + 0x21, 0xef, 0x96, 0xfa, 0xcc, 0x42, 0x9f, 0x19, 0x8d, 0xa1, 0x36, 0x9c, 0x89, 0x78, 0x35, 0x82, + 0x2e, 0x0f, 0xf7, 0xb6, 0x86, 0x7f, 0x79, 0xc8, 0xe7, 0x27, 0xc2, 0x18, 0xd2, 0xe1, 0x6c, 0xe4, + 0x63, 0x09, 0xb4, 0x36, 0xec, 0x53, 0x0e, 0xfe, 0xca, 0x10, 0x98, 0xce, 0x9c, 0x3d, 0xe0, 0xa3, + 0x3b, 0xb4, 0xe8, 0xca, 0xd0, 0x4f, 0x07, 0xf8, 0xab, 0xc3, 0x37, 0x7c, 0x85, 0x31, 0xb4, 0x0d, + 0x19, 0x57, 0xab, 0x0e, 0xf1, 0xa1, 0xfd, 0x3b, 0xca, 0x78, 0x29, 0xa6, 0xb7, 0x47, 0x39, 0xb9, + 0xda, 0x27, 0x7d, 0x4e, 0xc1, 0x3e, 0x50, 0x9f, 0x53, 0x48, 0xbf, 0xc5, 0xbf, 0xfd, 0xbe, 0x7b, + 0x31, 0x6c, 0xfb, 0xc3, 0x2f, 0xd6, 0xb0, 0xed, 0x8f, 0xb8, 0x64, 0x85, 0x31, 0xf4, 0x01, 0xcc, + 0x7a, 0x2b, 0xbb, 0x68, 0x25, 0xb6, 0x42, 0xcd, 0x9f, 0x8b, 0x1a, 0x76, 0xb3, 0xf4, 0x16, 0x12, + 0xfb, 0x2c, 0x43, 0x0b, 0x9a, 0x7d, 0x96, 0x11, 0xf5, 0xc7, 0x31, 0xcb, 0x3f, 0x79, 0xca, 0x63, + 0x7d, 0xff, 0x14, 0x56, 0xd5, 0xeb, 0xfb, 0xa7, 0xd0, 0x9a, 0x9a, 0x30, 0x86, 0x14, 0x58, 0x0c, + 0xaf, 0xce, 0xa0, 0x4b, 0x43, 0x15, 0x9f, 0xf8, 0xcb, 0x83, 0xd0, 0x9c, 0xa9, 0x9a, 0x30, 0x17, + 0xd2, 0x49, 0x45, 0x42, 0x6c, 0x9b, 0x95, 0x4e, 0x72, 0x71, 0x88, 0x56, 0xac, 0x60, 0xdd, 0xf0, + 0xeb, 0x7f, 0x4d, 0x43, 0x8a, 0x5c, 0xb5, 0x0d, 0x38, 0xe5, 0x4b, 0xc1, 0xd1, 0xb9, 0xf8, 0xc2, + 0x04, 0x7f, 0x3e, 0x72, 0xdc, 0x59, 0xc3, 0x23, 0x38, 0x1d, 0x48, 0xaa, 0xd1, 0xaa, 0x9b, 0x2e, + 0x2c, 0xb1, 0xe7, 0x2f, 0xc4, 0x60, 0xf8, 0x79, 0x7b, 0x7d, 0xdb, 0xea, 0xa0, 0xac, 0xcf, 0xcb, + 0x3b, 0xca, 0x9f, 0x7d, 0x4c, 0x23, 0x1b, 0xbf, 0x27, 0x13, 0xbc, 0x72, 0x85, 0xfa, 0xb0, 0x8b, + 0xb1, 0x38, 0xce, 0x0c, 0x1f, 0x39, 0x21, 0x95, 0x2b, 0xe9, 0x40, 0x1e, 0xe1, 0x42, 0x93, 0x23, + 0x5e, 0x88, 0x43, 0x71, 0xd8, 0x3f, 0x80, 0xac, 0xff, 0x9e, 0x47, 0x9e, 0xf3, 0x0a, 0xd3, 0xcd, + 0xd5, 0x68, 0x04, 0xff, 0xce, 0xf8, 0x9d, 0x8c, 0x5f, 0xaa, 0x30, 0xf7, 0x72, 0x31, 0x16, 0xc7, + 0xed, 0x16, 0x5d, 0x51, 0x65, 0xdf, 0x2d, 0x06, 0x23, 0xd0, 0xbe, 0x5b, 0x0c, 0x09, 0x43, 0x85, + 0xb1, 0x8d, 0xdb, 0x00, 0x72, 0xbb, 0xfb, 0x58, 0x96, 0xb0, 0xda, 0xeb, 0xa0, 0xe5, 0x40, 0xd3, + 0xa6, 0xac, 0xf6, 0x3a, 0x3b, 0x5d, 0x2b, 0x59, 0x31, 0x72, 0xbf, 0x98, 0x24, 0x29, 0xca, 0x14, + 0x21, 0xb0, 0x06, 0x36, 0xaa, 0x90, 0xed, 0x53, 0x4b, 0x24, 0xa7, 0x46, 0x17, 0x42, 0x79, 0x90, + 0xff, 0xac, 0xf2, 0x31, 0x9a, 0x75, 0x18, 0x91, 0xd1, 0x8d, 0xb7, 0x01, 0x9a, 0x86, 0x22, 0xd1, + 0xaa, 0x05, 0x5a, 0x09, 0xf0, 0xb9, 0xa3, 0xe0, 0x76, 0xcb, 0xe6, 0xf1, 0x73, 0x26, 0x4c, 0xd3, + 0x50, 0x68, 0xf1, 0x60, 0xe3, 0x5d, 0xc8, 0x50, 0x61, 0x0e, 0x2c, 0xbc, 0x41, 0xf4, 0x4c, 0x06, + 0xba, 0x7a, 0x32, 0xb2, 0x51, 0x86, 0x19, 0xca, 0x80, 0x25, 0x5a, 0xe8, 0x7c, 0x80, 0xc5, 0x3d, + 0x3a, 0xe2, 0x63, 0x32, 0x4d, 0xc8, 0xd8, 0xd8, 0x46, 0x11, 0xa6, 0x6d, 0x36, 0xe6, 0x63, 0xad, + 0x85, 0xce, 0x85, 0x70, 0xb1, 0x06, 0x7c, 0x4c, 0x32, 0x8c, 0x89, 0x35, 0xd4, 0x17, 0xc5, 0xfe, + 0xef, 0xc2, 0xa0, 0x28, 0x2c, 0x19, 0x0a, 0x15, 0x85, 0x8d, 0x15, 0xd3, 0x8f, 0x92, 0x4d, 0x43, + 0xd9, 0x1f, 0x27, 0x44, 0xaf, 0xff, 0x2b, 0x00, 0x00, 0xff, 0xff, 0x60, 0x93, 0x14, 0xd0, 0x0a, + 0x3b, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -4951,6 +5298,7 @@ type ControllerClient interface { DeleteSnapshot(ctx context.Context, in *DeleteSnapshotRequest, opts ...grpc.CallOption) (*DeleteSnapshotResponse, error) ListSnapshots(ctx context.Context, in *ListSnapshotsRequest, opts ...grpc.CallOption) (*ListSnapshotsResponse, error) ControllerExpandVolume(ctx context.Context, in *ControllerExpandVolumeRequest, opts ...grpc.CallOption) (*ControllerExpandVolumeResponse, error) + ControllerGetVolume(ctx context.Context, in *ControllerGetVolumeRequest, opts ...grpc.CallOption) (*ControllerGetVolumeResponse, error) } type controllerClient struct { @@ -5069,6 +5417,15 @@ func (c *controllerClient) ControllerExpandVolume(ctx context.Context, in *Contr return out, nil } +func (c *controllerClient) ControllerGetVolume(ctx context.Context, in *ControllerGetVolumeRequest, opts ...grpc.CallOption) (*ControllerGetVolumeResponse, error) { + out := new(ControllerGetVolumeResponse) + err := c.cc.Invoke(ctx, "/csi.v1.Controller/ControllerGetVolume", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // ControllerServer is the server API for Controller service. type ControllerServer interface { CreateVolume(context.Context, *CreateVolumeRequest) (*CreateVolumeResponse, error) @@ -5083,6 +5440,7 @@ type ControllerServer interface { DeleteSnapshot(context.Context, *DeleteSnapshotRequest) (*DeleteSnapshotResponse, error) ListSnapshots(context.Context, *ListSnapshotsRequest) (*ListSnapshotsResponse, error) ControllerExpandVolume(context.Context, *ControllerExpandVolumeRequest) (*ControllerExpandVolumeResponse, error) + ControllerGetVolume(context.Context, *ControllerGetVolumeRequest) (*ControllerGetVolumeResponse, error) } // UnimplementedControllerServer can be embedded to have forward compatible implementations. @@ -5125,6 +5483,9 @@ func (*UnimplementedControllerServer) ListSnapshots(ctx context.Context, req *Li func (*UnimplementedControllerServer) ControllerExpandVolume(ctx context.Context, req *ControllerExpandVolumeRequest) (*ControllerExpandVolumeResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ControllerExpandVolume not implemented") } +func (*UnimplementedControllerServer) ControllerGetVolume(ctx context.Context, req *ControllerGetVolumeRequest) (*ControllerGetVolumeResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ControllerGetVolume not implemented") +} func RegisterControllerServer(s *grpc.Server, srv ControllerServer) { s.RegisterService(&_Controller_serviceDesc, srv) @@ -5346,6 +5707,24 @@ func _Controller_ControllerExpandVolume_Handler(srv interface{}, ctx context.Con return interceptor(ctx, in, info, handler) } +func _Controller_ControllerGetVolume_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ControllerGetVolumeRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControllerServer).ControllerGetVolume(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/csi.v1.Controller/ControllerGetVolume", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControllerServer).ControllerGetVolume(ctx, req.(*ControllerGetVolumeRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _Controller_serviceDesc = grpc.ServiceDesc{ ServiceName: "csi.v1.Controller", HandlerType: (*ControllerServer)(nil), @@ -5398,6 +5777,10 @@ var _Controller_serviceDesc = grpc.ServiceDesc{ MethodName: "ControllerExpandVolume", Handler: _Controller_ControllerExpandVolume_Handler, }, + { + MethodName: "ControllerGetVolume", + Handler: _Controller_ControllerGetVolume_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "github.com/container-storage-interface/spec/csi.proto", diff --git a/vendor/github.com/containerd/console/.golangci.yml b/vendor/github.com/containerd/console/.golangci.yml new file mode 100644 index 000000000000..fcba5e885f0a --- /dev/null +++ b/vendor/github.com/containerd/console/.golangci.yml @@ -0,0 +1,20 @@ +linters: + enable: + - structcheck + - varcheck + - staticcheck + - unconvert + - gofmt + - goimports + - golint + - ineffassign + - vet + - unused + - misspell + disable: + - errcheck + +run: + timeout: 3m + skip-dirs: + - vendor diff --git a/vendor/github.com/containerd/console/.travis.yml b/vendor/github.com/containerd/console/.travis.yml deleted file mode 100644 index 16827ec3e8f6..000000000000 --- a/vendor/github.com/containerd/console/.travis.yml +++ /dev/null @@ -1,27 +0,0 @@ -language: go -go: - - "1.12.x" - - "1.13.x" - -go_import_path: github.com/containerd/console - -env: - - GO111MODULE=on - -install: - - pushd ..; go get -u github.com/vbatts/git-validation; popd - - pushd ..; go get -u github.com/kunalkushwaha/ltag; popd - -before_script: - - pushd ..; git clone https://github.com/containerd/project; popd - -script: - - DCO_VERBOSITY=-q ../project/script/validate/dco - - ../project/script/validate/fileheader ../project/ - - travis_wait ../project/script/validate/vendor - - go test -race - - GOOS=openbsd go build - - GOOS=openbsd go test -c - - GOOS=solaris go build - - GOOS=solaris go test -c - - GOOS=windows go test diff --git a/vendor/github.com/containerd/console/console.go b/vendor/github.com/containerd/console/console.go index 6a36d1477674..f989d28a41cd 100644 --- a/vendor/github.com/containerd/console/console.go +++ b/vendor/github.com/containerd/console/console.go @@ -61,18 +61,24 @@ type WinSize struct { y uint16 } -// Current returns the current processes console -func Current() Console { - c, err := ConsoleFromFile(os.Stdin) - if err != nil { - // stdin should always be a console for the design - // of this function - panic(err) +// Current returns the current process' console +func Current() (c Console) { + var err error + // Usually all three streams (stdin, stdout, and stderr) + // are open to the same console, but some might be redirected, + // so try all three. + for _, s := range []*os.File{os.Stderr, os.Stdout, os.Stdin} { + if c, err = ConsoleFromFile(s); err == nil { + return c + } } - return c + // One of the std streams should always be a console + // for the design of this function. + panic(err) } // ConsoleFromFile returns a console using the provided file +// nolint:golint func ConsoleFromFile(f File) (Console, error) { if err := checkConsole(f); err != nil { return nil, err diff --git a/vendor/github.com/containerd/console/console_unix.go b/vendor/github.com/containerd/console/console_unix.go index 315f1d0c90ec..a78687523a34 100644 --- a/vendor/github.com/containerd/console/console_unix.go +++ b/vendor/github.com/containerd/console/console_unix.go @@ -1,4 +1,4 @@ -// +build darwin freebsd linux openbsd solaris +// +build darwin freebsd linux netbsd openbsd solaris /* Copyright The containerd Authors. diff --git a/vendor/github.com/containerd/console/go.mod b/vendor/github.com/containerd/console/go.mod index 97b587d62d2a..60bf028ee523 100644 --- a/vendor/github.com/containerd/console/go.mod +++ b/vendor/github.com/containerd/console/go.mod @@ -3,6 +3,6 @@ module github.com/containerd/console go 1.13 require ( - github.com/pkg/errors v0.8.1 - golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e + github.com/pkg/errors v0.9.1 + golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f ) diff --git a/vendor/github.com/containerd/console/go.sum b/vendor/github.com/containerd/console/go.sum index 25205cc9b690..6b9363c40a93 100644 --- a/vendor/github.com/containerd/console/go.sum +++ b/vendor/github.com/containerd/console/go.sum @@ -1,4 +1,4 @@ -github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e h1:N7DeIrjYszNmSW409R3frPPwglRwMkXSBzwVbkOjLLA= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f h1:6Sc1XOXTulBN6imkqo6XoAXDEzoQ4/ro6xy7Vn8+rOM= +golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/vendor/github.com/containerd/console/tc_darwin.go b/vendor/github.com/containerd/console/tc_darwin.go index b0128abb0c62..787154580f6c 100644 --- a/vendor/github.com/containerd/console/tc_darwin.go +++ b/vendor/github.com/containerd/console/tc_darwin.go @@ -19,7 +19,6 @@ package console import ( "fmt" "os" - "unsafe" "golang.org/x/sys/unix" ) @@ -29,18 +28,10 @@ const ( cmdTcSet = unix.TIOCSETA ) -func ioctl(fd, flag, data uintptr) error { - if _, _, err := unix.Syscall(unix.SYS_IOCTL, fd, flag, data); err != 0 { - return err - } - return nil -} - // unlockpt unlocks the slave pseudoterminal device corresponding to the master pseudoterminal referred to by f. // unlockpt should be called before opening the slave side of a pty. func unlockpt(f *os.File) error { - var u int32 - return ioctl(f.Fd(), unix.TIOCPTYUNLK, uintptr(unsafe.Pointer(&u))) + return unix.IoctlSetPointerInt(int(f.Fd()), unix.TIOCPTYUNLK, 0) } // ptsname retrieves the name of the first available pts for the given master. diff --git a/vendor/github.com/containerd/console/tc_linux.go b/vendor/github.com/containerd/console/tc_linux.go index 1bdd68e6d55b..75f8694f7fc8 100644 --- a/vendor/github.com/containerd/console/tc_linux.go +++ b/vendor/github.com/containerd/console/tc_linux.go @@ -19,7 +19,6 @@ package console import ( "fmt" "os" - "unsafe" "golang.org/x/sys/unix" ) @@ -32,17 +31,13 @@ const ( // unlockpt unlocks the slave pseudoterminal device corresponding to the master pseudoterminal referred to by f. // unlockpt should be called before opening the slave side of a pty. func unlockpt(f *os.File) error { - var u int32 - if _, _, err := unix.Syscall(unix.SYS_IOCTL, f.Fd(), unix.TIOCSPTLCK, uintptr(unsafe.Pointer(&u))); err != 0 { - return err - } - return nil + return unix.IoctlSetPointerInt(int(f.Fd()), unix.TIOCSPTLCK, 0) } // ptsname retrieves the name of the first available pts for the given master. func ptsname(f *os.File) (string, error) { - var u uint32 - if _, _, err := unix.Syscall(unix.SYS_IOCTL, f.Fd(), unix.TIOCGPTN, uintptr(unsafe.Pointer(&u))); err != 0 { + u, err := unix.IoctlGetInt(int(f.Fd()), unix.TIOCGPTN) + if err != nil { return "", err } return fmt.Sprintf("/dev/pts/%d", u), nil diff --git a/vendor/github.com/containerd/console/tc_netbsd.go b/vendor/github.com/containerd/console/tc_netbsd.go new file mode 100644 index 000000000000..71227aefdffd --- /dev/null +++ b/vendor/github.com/containerd/console/tc_netbsd.go @@ -0,0 +1,45 @@ +/* + Copyright The containerd Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package console + +import ( + "bytes" + "os" + + "golang.org/x/sys/unix" +) + +const ( + cmdTcGet = unix.TIOCGETA + cmdTcSet = unix.TIOCSETA +) + +// unlockpt unlocks the slave pseudoterminal device corresponding to the master pseudoterminal referred to by f. +// unlockpt should be called before opening the slave side of a pty. +// This does not exist on NetBSD, it does not allocate controlling terminals on open +func unlockpt(f *os.File) error { + return nil +} + +// ptsname retrieves the name of the first available pts for the given master. +func ptsname(f *os.File) (string, error) { + ptm, err := unix.IoctlGetPtmget(int(f.Fd()), unix.TIOCPTSNAME) + if err != nil { + return "", err + } + return string(ptm.Sn[:bytes.IndexByte(ptm.Sn[:], 0)]), nil +} diff --git a/vendor/github.com/containerd/console/tc_unix.go b/vendor/github.com/containerd/console/tc_unix.go index 7ae773c53eaa..5cd4c550ce88 100644 --- a/vendor/github.com/containerd/console/tc_unix.go +++ b/vendor/github.com/containerd/console/tc_unix.go @@ -1,4 +1,4 @@ -// +build darwin freebsd linux openbsd solaris +// +build darwin freebsd linux netbsd openbsd solaris /* Copyright The containerd Authors. diff --git a/vendor/github.com/containerd/containerd/api/services/containers/v1/containers.pb.go b/vendor/github.com/containerd/containerd/api/services/containers/v1/containers.pb.go index d951b2683258..af56c7de2bad 100644 --- a/vendor/github.com/containerd/containerd/api/services/containers/v1/containers.pb.go +++ b/vendor/github.com/containerd/containerd/api/services/containers/v1/containers.pb.go @@ -2106,7 +2106,7 @@ func (m *Container) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthContainers } if (iNdEx + skippy) > postIndex { @@ -2469,7 +2469,7 @@ func (m *Container) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthContainers } if (iNdEx + skippy) > postIndex { @@ -2486,10 +2486,7 @@ func (m *Container) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthContainers - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthContainers } if (iNdEx + skippy) > l { @@ -2608,10 +2605,7 @@ func (m *Container_Runtime) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthContainers - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthContainers } if (iNdEx + skippy) > l { @@ -2694,10 +2688,7 @@ func (m *GetContainerRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthContainers - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthContainers } if (iNdEx + skippy) > l { @@ -2781,10 +2772,7 @@ func (m *GetContainerResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthContainers - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthContainers } if (iNdEx + skippy) > l { @@ -2867,10 +2855,7 @@ func (m *ListContainersRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthContainers - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthContainers } if (iNdEx + skippy) > l { @@ -2955,10 +2940,7 @@ func (m *ListContainersResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthContainers - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthContainers } if (iNdEx + skippy) > l { @@ -3042,10 +3024,7 @@ func (m *CreateContainerRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthContainers - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthContainers } if (iNdEx + skippy) > l { @@ -3129,10 +3108,7 @@ func (m *CreateContainerResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthContainers - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthContainers } if (iNdEx + skippy) > l { @@ -3252,10 +3228,7 @@ func (m *UpdateContainerRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthContainers - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthContainers } if (iNdEx + skippy) > l { @@ -3339,10 +3312,7 @@ func (m *UpdateContainerResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthContainers - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthContainers } if (iNdEx + skippy) > l { @@ -3425,10 +3395,7 @@ func (m *DeleteContainerRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthContainers - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthContainers } if (iNdEx + skippy) > l { @@ -3515,10 +3482,7 @@ func (m *ListContainerMessage) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthContainers - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthContainers } if (iNdEx + skippy) > l { diff --git a/vendor/github.com/containerd/containerd/api/services/tasks/v1/tasks.pb.go b/vendor/github.com/containerd/containerd/api/services/tasks/v1/tasks.pb.go index 5ac5af11b92e..484b469c6e48 100644 --- a/vendor/github.com/containerd/containerd/api/services/tasks/v1/tasks.pb.go +++ b/vendor/github.com/containerd/containerd/api/services/tasks/v1/tasks.pb.go @@ -4347,10 +4347,7 @@ func (m *CreateTaskRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthTasks - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTasks } if (iNdEx + skippy) > l { @@ -4452,10 +4449,7 @@ func (m *CreateTaskResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthTasks - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTasks } if (iNdEx + skippy) > l { @@ -4570,10 +4564,7 @@ func (m *StartRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthTasks - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTasks } if (iNdEx + skippy) > l { @@ -4643,10 +4634,7 @@ func (m *StartResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthTasks - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTasks } if (iNdEx + skippy) > l { @@ -4729,10 +4717,7 @@ func (m *DeleteTaskRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthTasks - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTasks } if (iNdEx + skippy) > l { @@ -4886,10 +4871,7 @@ func (m *DeleteResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthTasks - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTasks } if (iNdEx + skippy) > l { @@ -5004,10 +4986,7 @@ func (m *DeleteProcessRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthTasks - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTasks } if (iNdEx + skippy) > l { @@ -5122,10 +5101,7 @@ func (m *GetRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthTasks - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTasks } if (iNdEx + skippy) > l { @@ -5212,10 +5188,7 @@ func (m *GetResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthTasks - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTasks } if (iNdEx + skippy) > l { @@ -5298,10 +5271,7 @@ func (m *ListTasksRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthTasks - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTasks } if (iNdEx + skippy) > l { @@ -5386,10 +5356,7 @@ func (m *ListTasksResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthTasks - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTasks } if (iNdEx + skippy) > l { @@ -5543,10 +5510,7 @@ func (m *KillRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthTasks - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTasks } if (iNdEx + skippy) > l { @@ -5813,10 +5777,7 @@ func (m *ExecProcessRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthTasks - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTasks } if (iNdEx + skippy) > l { @@ -5867,10 +5828,7 @@ func (m *ExecProcessResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthTasks - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTasks } if (iNdEx + skippy) > l { @@ -6023,10 +5981,7 @@ func (m *ResizePtyRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthTasks - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTasks } if (iNdEx + skippy) > l { @@ -6161,10 +6116,7 @@ func (m *CloseIORequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthTasks - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTasks } if (iNdEx + skippy) > l { @@ -6247,10 +6199,7 @@ func (m *PauseTaskRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthTasks - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTasks } if (iNdEx + skippy) > l { @@ -6333,10 +6282,7 @@ func (m *ResumeTaskRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthTasks - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTasks } if (iNdEx + skippy) > l { @@ -6419,10 +6365,7 @@ func (m *ListPidsRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthTasks - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTasks } if (iNdEx + skippy) > l { @@ -6507,10 +6450,7 @@ func (m *ListPidsResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthTasks - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTasks } if (iNdEx + skippy) > l { @@ -6661,10 +6601,7 @@ func (m *CheckpointTaskRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthTasks - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTasks } if (iNdEx + skippy) > l { @@ -6749,10 +6686,7 @@ func (m *CheckpointTaskResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthTasks - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTasks } if (iNdEx + skippy) > l { @@ -6871,10 +6805,7 @@ func (m *UpdateTaskRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthTasks - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTasks } if (iNdEx + skippy) > l { @@ -6957,10 +6888,7 @@ func (m *MetricsRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthTasks - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTasks } if (iNdEx + skippy) > l { @@ -7045,10 +6973,7 @@ func (m *MetricsResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthTasks - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTasks } if (iNdEx + skippy) > l { @@ -7163,10 +7088,7 @@ func (m *WaitRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthTasks - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTasks } if (iNdEx + skippy) > l { @@ -7269,10 +7191,7 @@ func (m *WaitResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthTasks - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTasks } if (iNdEx + skippy) > l { diff --git a/vendor/github.com/containerd/containerd/api/services/version/v1/version.pb.go b/vendor/github.com/containerd/containerd/api/services/version/v1/version.pb.go index 81b8c339539e..b742c6ae62f5 100644 --- a/vendor/github.com/containerd/containerd/api/services/version/v1/version.pb.go +++ b/vendor/github.com/containerd/containerd/api/services/version/v1/version.pb.go @@ -374,10 +374,7 @@ func (m *VersionResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthVersion - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthVersion } if (iNdEx + skippy) > l { diff --git a/vendor/github.com/containerd/containerd/api/types/descriptor.pb.go b/vendor/github.com/containerd/containerd/api/types/descriptor.pb.go index 437d41f23ad8..fe71dbf43300 100644 --- a/vendor/github.com/containerd/containerd/api/types/descriptor.pb.go +++ b/vendor/github.com/containerd/containerd/api/types/descriptor.pb.go @@ -479,7 +479,7 @@ func (m *Descriptor) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthDescriptor } if (iNdEx + skippy) > postIndex { @@ -496,10 +496,7 @@ func (m *Descriptor) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthDescriptor - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthDescriptor } if (iNdEx + skippy) > l { diff --git a/vendor/github.com/containerd/containerd/api/types/metrics.pb.go b/vendor/github.com/containerd/containerd/api/types/metrics.pb.go index 89a8d9cd6ffd..75773e442ab7 100644 --- a/vendor/github.com/containerd/containerd/api/types/metrics.pb.go +++ b/vendor/github.com/containerd/containerd/api/types/metrics.pb.go @@ -348,10 +348,7 @@ func (m *Metric) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthMetrics - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthMetrics } if (iNdEx + skippy) > l { diff --git a/vendor/github.com/containerd/containerd/api/types/mount.pb.go b/vendor/github.com/containerd/containerd/api/types/mount.pb.go index 6872e4120e1a..d0a0bee761f0 100644 --- a/vendor/github.com/containerd/containerd/api/types/mount.pb.go +++ b/vendor/github.com/containerd/containerd/api/types/mount.pb.go @@ -392,10 +392,7 @@ func (m *Mount) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthMount - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthMount } if (iNdEx + skippy) > l { diff --git a/vendor/github.com/containerd/containerd/api/types/platform.pb.go b/vendor/github.com/containerd/containerd/api/types/platform.pb.go index c03d8b077bf9..a0f78c8a769d 100644 --- a/vendor/github.com/containerd/containerd/api/types/platform.pb.go +++ b/vendor/github.com/containerd/containerd/api/types/platform.pb.go @@ -333,10 +333,7 @@ func (m *Platform) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthPlatform - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthPlatform } if (iNdEx + skippy) > l { diff --git a/vendor/github.com/containerd/containerd/api/types/task/task.pb.go b/vendor/github.com/containerd/containerd/api/types/task/task.pb.go index ae824ff45c4b..f511bbd058c8 100644 --- a/vendor/github.com/containerd/containerd/api/types/task/task.pb.go +++ b/vendor/github.com/containerd/containerd/api/types/task/task.pb.go @@ -772,10 +772,7 @@ func (m *Process) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthTask - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTask } if (iNdEx + skippy) > l { @@ -881,10 +878,7 @@ func (m *ProcessInfo) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthTask - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTask } if (iNdEx + skippy) > l { diff --git a/vendor/github.com/containerd/containerd/log/context.go b/vendor/github.com/containerd/containerd/log/context.go new file mode 100644 index 000000000000..21599c4fd646 --- /dev/null +++ b/vendor/github.com/containerd/containerd/log/context.go @@ -0,0 +1,60 @@ +/* + Copyright The containerd Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package log + +import ( + "context" + + "github.com/sirupsen/logrus" +) + +var ( + // G is an alias for GetLogger. + // + // We may want to define this locally to a package to get package tagged log + // messages. + G = GetLogger + + // L is an alias for the standard logger. + L = logrus.NewEntry(logrus.StandardLogger()) +) + +type ( + loggerKey struct{} +) + +// RFC3339NanoFixed is time.RFC3339Nano with nanoseconds padded using zeros to +// ensure the formatted time is always the same number of characters. +const RFC3339NanoFixed = "2006-01-02T15:04:05.000000000Z07:00" + +// WithLogger returns a new context with the provided logger. Use in +// combination with logger.WithField(s) for great effect. +func WithLogger(ctx context.Context, logger *logrus.Entry) context.Context { + return context.WithValue(ctx, loggerKey{}, logger) +} + +// GetLogger retrieves the current logger from the context. If no logger is +// available, the default logger is returned. +func GetLogger(ctx context.Context) *logrus.Entry { + logger := ctx.Value(loggerKey{}) + + if logger == nil { + return L + } + + return logger.(*logrus.Entry) +} diff --git a/vendor/github.com/containerd/containerd/platforms/compare.go b/vendor/github.com/containerd/containerd/platforms/compare.go new file mode 100644 index 000000000000..3ad22a10d0ce --- /dev/null +++ b/vendor/github.com/containerd/containerd/platforms/compare.go @@ -0,0 +1,229 @@ +/* + Copyright The containerd Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package platforms + +import specs "github.com/opencontainers/image-spec/specs-go/v1" + +// MatchComparer is able to match and compare platforms to +// filter and sort platforms. +type MatchComparer interface { + Matcher + + Less(specs.Platform, specs.Platform) bool +} + +// Only returns a match comparer for a single platform +// using default resolution logic for the platform. +// +// For ARMv8, will also match ARMv7, ARMv6 and ARMv5 (for 32bit runtimes) +// For ARMv7, will also match ARMv6 and ARMv5 +// For ARMv6, will also match ARMv5 +func Only(platform specs.Platform) MatchComparer { + platform = Normalize(platform) + if platform.Architecture == "arm" { + if platform.Variant == "v8" { + return orderedPlatformComparer{ + matchers: []Matcher{ + &matcher{ + Platform: platform, + }, + &matcher{ + Platform: specs.Platform{ + Architecture: platform.Architecture, + OS: platform.OS, + OSVersion: platform.OSVersion, + OSFeatures: platform.OSFeatures, + Variant: "v7", + }, + }, + &matcher{ + Platform: specs.Platform{ + Architecture: platform.Architecture, + OS: platform.OS, + OSVersion: platform.OSVersion, + OSFeatures: platform.OSFeatures, + Variant: "v6", + }, + }, + &matcher{ + Platform: specs.Platform{ + Architecture: platform.Architecture, + OS: platform.OS, + OSVersion: platform.OSVersion, + OSFeatures: platform.OSFeatures, + Variant: "v5", + }, + }, + }, + } + } + if platform.Variant == "v7" { + return orderedPlatformComparer{ + matchers: []Matcher{ + &matcher{ + Platform: platform, + }, + &matcher{ + Platform: specs.Platform{ + Architecture: platform.Architecture, + OS: platform.OS, + OSVersion: platform.OSVersion, + OSFeatures: platform.OSFeatures, + Variant: "v6", + }, + }, + &matcher{ + Platform: specs.Platform{ + Architecture: platform.Architecture, + OS: platform.OS, + OSVersion: platform.OSVersion, + OSFeatures: platform.OSFeatures, + Variant: "v5", + }, + }, + }, + } + } + if platform.Variant == "v6" { + return orderedPlatformComparer{ + matchers: []Matcher{ + &matcher{ + Platform: platform, + }, + &matcher{ + Platform: specs.Platform{ + Architecture: platform.Architecture, + OS: platform.OS, + OSVersion: platform.OSVersion, + OSFeatures: platform.OSFeatures, + Variant: "v5", + }, + }, + }, + } + } + } + + return singlePlatformComparer{ + Matcher: &matcher{ + Platform: platform, + }, + } +} + +// Ordered returns a platform MatchComparer which matches any of the platforms +// but orders them in order they are provided. +func Ordered(platforms ...specs.Platform) MatchComparer { + matchers := make([]Matcher, len(platforms)) + for i := range platforms { + matchers[i] = NewMatcher(platforms[i]) + } + return orderedPlatformComparer{ + matchers: matchers, + } +} + +// Any returns a platform MatchComparer which matches any of the platforms +// with no preference for ordering. +func Any(platforms ...specs.Platform) MatchComparer { + matchers := make([]Matcher, len(platforms)) + for i := range platforms { + matchers[i] = NewMatcher(platforms[i]) + } + return anyPlatformComparer{ + matchers: matchers, + } +} + +// All is a platform MatchComparer which matches all platforms +// with preference for ordering. +var All MatchComparer = allPlatformComparer{} + +type singlePlatformComparer struct { + Matcher +} + +func (c singlePlatformComparer) Less(p1, p2 specs.Platform) bool { + return c.Match(p1) && !c.Match(p2) +} + +type orderedPlatformComparer struct { + matchers []Matcher +} + +func (c orderedPlatformComparer) Match(platform specs.Platform) bool { + for _, m := range c.matchers { + if m.Match(platform) { + return true + } + } + return false +} + +func (c orderedPlatformComparer) Less(p1 specs.Platform, p2 specs.Platform) bool { + for _, m := range c.matchers { + p1m := m.Match(p1) + p2m := m.Match(p2) + if p1m && !p2m { + return true + } + if p1m || p2m { + return false + } + } + return false +} + +type anyPlatformComparer struct { + matchers []Matcher +} + +func (c anyPlatformComparer) Match(platform specs.Platform) bool { + for _, m := range c.matchers { + if m.Match(platform) { + return true + } + } + return false +} + +func (c anyPlatformComparer) Less(p1, p2 specs.Platform) bool { + var p1m, p2m bool + for _, m := range c.matchers { + if !p1m && m.Match(p1) { + p1m = true + } + if !p2m && m.Match(p2) { + p2m = true + } + if p1m && p2m { + return false + } + } + // If one matches, and the other does, sort match first + return p1m && !p2m +} + +type allPlatformComparer struct{} + +func (allPlatformComparer) Match(specs.Platform) bool { + return true +} + +func (allPlatformComparer) Less(specs.Platform, specs.Platform) bool { + return false +} diff --git a/vendor/github.com/containerd/containerd/platforms/cpuinfo.go b/vendor/github.com/containerd/containerd/platforms/cpuinfo.go new file mode 100644 index 000000000000..db65a726b902 --- /dev/null +++ b/vendor/github.com/containerd/containerd/platforms/cpuinfo.go @@ -0,0 +1,122 @@ +/* + Copyright The containerd Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package platforms + +import ( + "bufio" + "os" + "runtime" + "strings" + + "github.com/containerd/containerd/errdefs" + "github.com/containerd/containerd/log" + "github.com/pkg/errors" +) + +// Present the ARM instruction set architecture, eg: v7, v8 +var cpuVariant string + +func init() { + if isArmArch(runtime.GOARCH) { + cpuVariant = getCPUVariant() + } else { + cpuVariant = "" + } +} + +// For Linux, the kernel has already detected the ABI, ISA and Features. +// So we don't need to access the ARM registers to detect platform information +// by ourselves. We can just parse these information from /proc/cpuinfo +func getCPUInfo(pattern string) (info string, err error) { + if !isLinuxOS(runtime.GOOS) { + return "", errors.Wrapf(errdefs.ErrNotImplemented, "getCPUInfo for OS %s", runtime.GOOS) + } + + cpuinfo, err := os.Open("/proc/cpuinfo") + if err != nil { + return "", err + } + defer cpuinfo.Close() + + // Start to Parse the Cpuinfo line by line. For SMP SoC, we parse + // the first core is enough. + scanner := bufio.NewScanner(cpuinfo) + for scanner.Scan() { + newline := scanner.Text() + list := strings.Split(newline, ":") + + if len(list) > 1 && strings.EqualFold(strings.TrimSpace(list[0]), pattern) { + return strings.TrimSpace(list[1]), nil + } + } + + // Check whether the scanner encountered errors + err = scanner.Err() + if err != nil { + return "", err + } + + return "", errors.Wrapf(errdefs.ErrNotFound, "getCPUInfo for pattern: %s", pattern) +} + +func getCPUVariant() string { + if runtime.GOOS == "windows" || runtime.GOOS == "darwin" { + // Windows/Darwin only supports v7 for ARM32 and v8 for ARM64 and so we can use + // runtime.GOARCH to determine the variants + var variant string + switch runtime.GOARCH { + case "arm64": + variant = "v8" + case "arm": + variant = "v7" + default: + variant = "unknown" + } + + return variant + } + + variant, err := getCPUInfo("Cpu architecture") + if err != nil { + log.L.WithError(err).Error("failure getting variant") + return "" + } + + switch strings.ToLower(variant) { + case "8", "aarch64": + // special case: if running a 32-bit userspace on aarch64, the variant should be "v7" + if runtime.GOARCH == "arm" { + variant = "v7" + } else { + variant = "v8" + } + case "7", "7m", "?(12)", "?(13)", "?(14)", "?(15)", "?(16)", "?(17)": + variant = "v7" + case "6", "6tej": + variant = "v6" + case "5", "5t", "5te", "5tej": + variant = "v5" + case "4", "4t": + variant = "v4" + case "3": + variant = "v3" + default: + variant = "unknown" + } + + return variant +} diff --git a/vendor/github.com/containerd/containerd/platforms/database.go b/vendor/github.com/containerd/containerd/platforms/database.go new file mode 100644 index 000000000000..6ede94061eb8 --- /dev/null +++ b/vendor/github.com/containerd/containerd/platforms/database.go @@ -0,0 +1,114 @@ +/* + Copyright The containerd Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package platforms + +import ( + "runtime" + "strings" +) + +// isLinuxOS returns true if the operating system is Linux. +// +// The OS value should be normalized before calling this function. +func isLinuxOS(os string) bool { + return os == "linux" +} + +// These function are generated from https://golang.org/src/go/build/syslist.go. +// +// We use switch statements because they are slightly faster than map lookups +// and use a little less memory. + +// isKnownOS returns true if we know about the operating system. +// +// The OS value should be normalized before calling this function. +func isKnownOS(os string) bool { + switch os { + case "aix", "android", "darwin", "dragonfly", "freebsd", "hurd", "illumos", "js", "linux", "nacl", "netbsd", "openbsd", "plan9", "solaris", "windows", "zos": + return true + } + return false +} + +// isArmArch returns true if the architecture is ARM. +// +// The arch value should be normalized before being passed to this function. +func isArmArch(arch string) bool { + switch arch { + case "arm", "arm64": + return true + } + return false +} + +// isKnownArch returns true if we know about the architecture. +// +// The arch value should be normalized before being passed to this function. +func isKnownArch(arch string) bool { + switch arch { + case "386", "amd64", "amd64p32", "arm", "armbe", "arm64", "arm64be", "ppc64", "ppc64le", "mips", "mipsle", "mips64", "mips64le", "mips64p32", "mips64p32le", "ppc", "riscv", "riscv64", "s390", "s390x", "sparc", "sparc64", "wasm": + return true + } + return false +} + +func normalizeOS(os string) string { + if os == "" { + return runtime.GOOS + } + os = strings.ToLower(os) + + switch os { + case "macos": + os = "darwin" + } + return os +} + +// normalizeArch normalizes the architecture. +func normalizeArch(arch, variant string) (string, string) { + arch, variant = strings.ToLower(arch), strings.ToLower(variant) + switch arch { + case "i386": + arch = "386" + variant = "" + case "x86_64", "x86-64": + arch = "amd64" + variant = "" + case "aarch64", "arm64": + arch = "arm64" + switch variant { + case "8", "v8": + variant = "" + } + case "armhf": + arch = "arm" + variant = "v7" + case "armel": + arch = "arm" + variant = "v6" + case "arm": + switch variant { + case "", "7": + variant = "v7" + case "5", "6", "8": + variant = "v" + variant + } + } + + return arch, variant +} diff --git a/vendor/github.com/containerd/containerd/platforms/defaults.go b/vendor/github.com/containerd/containerd/platforms/defaults.go new file mode 100644 index 000000000000..a14d80e58cbf --- /dev/null +++ b/vendor/github.com/containerd/containerd/platforms/defaults.go @@ -0,0 +1,38 @@ +/* + Copyright The containerd Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package platforms + +import ( + "runtime" + + specs "github.com/opencontainers/image-spec/specs-go/v1" +) + +// DefaultString returns the default string specifier for the platform. +func DefaultString() string { + return Format(DefaultSpec()) +} + +// DefaultSpec returns the current platform's default platform specification. +func DefaultSpec() specs.Platform { + return specs.Platform{ + OS: runtime.GOOS, + Architecture: runtime.GOARCH, + // The Variant field will be empty if arch != ARM. + Variant: cpuVariant, + } +} diff --git a/vendor/github.com/containerd/containerd/platforms/defaults_unix.go b/vendor/github.com/containerd/containerd/platforms/defaults_unix.go new file mode 100644 index 000000000000..e8a7d5ffa0d6 --- /dev/null +++ b/vendor/github.com/containerd/containerd/platforms/defaults_unix.go @@ -0,0 +1,24 @@ +// +build !windows + +/* + Copyright The containerd Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package platforms + +// Default returns the default matcher for the platform. +func Default() MatchComparer { + return Only(DefaultSpec()) +} diff --git a/vendor/github.com/containerd/containerd/platforms/defaults_windows.go b/vendor/github.com/containerd/containerd/platforms/defaults_windows.go new file mode 100644 index 000000000000..0defbd36c042 --- /dev/null +++ b/vendor/github.com/containerd/containerd/platforms/defaults_windows.go @@ -0,0 +1,31 @@ +// +build windows + +/* + Copyright The containerd Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package platforms + +import ( + specs "github.com/opencontainers/image-spec/specs-go/v1" +) + +// Default returns the default matcher for the platform. +func Default() MatchComparer { + return Ordered(DefaultSpec(), specs.Platform{ + OS: "linux", + Architecture: "amd64", + }) +} diff --git a/vendor/github.com/containerd/containerd/platforms/platforms.go b/vendor/github.com/containerd/containerd/platforms/platforms.go new file mode 100644 index 000000000000..77d3f184ec1b --- /dev/null +++ b/vendor/github.com/containerd/containerd/platforms/platforms.go @@ -0,0 +1,278 @@ +/* + Copyright The containerd Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +// Package platforms provides a toolkit for normalizing, matching and +// specifying container platforms. +// +// Centered around OCI platform specifications, we define a string-based +// specifier syntax that can be used for user input. With a specifier, users +// only need to specify the parts of the platform that are relevant to their +// context, providing an operating system or architecture or both. +// +// How do I use this package? +// +// The vast majority of use cases should simply use the match function with +// user input. The first step is to parse a specifier into a matcher: +// +// m, err := Parse("linux") +// if err != nil { ... } +// +// Once you have a matcher, use it to match against the platform declared by a +// component, typically from an image or runtime. Since extracting an images +// platform is a little more involved, we'll use an example against the +// platform default: +// +// if ok := m.Match(Default()); !ok { /* doesn't match */ } +// +// This can be composed in loops for resolving runtimes or used as a filter for +// fetch and select images. +// +// More details of the specifier syntax and platform spec follow. +// +// Declaring Platform Support +// +// Components that have strict platform requirements should use the OCI +// platform specification to declare their support. Typically, this will be +// images and runtimes that should make these declaring which platform they +// support specifically. This looks roughly as follows: +// +// type Platform struct { +// Architecture string +// OS string +// Variant string +// } +// +// Most images and runtimes should at least set Architecture and OS, according +// to their GOARCH and GOOS values, respectively (follow the OCI image +// specification when in doubt). ARM should set variant under certain +// discussions, which are outlined below. +// +// Platform Specifiers +// +// While the OCI platform specifications provide a tool for components to +// specify structured information, user input typically doesn't need the full +// context and much can be inferred. To solve this problem, we introduced +// "specifiers". A specifier has the format +// `||/[/]`. The user can provide either the +// operating system or the architecture or both. +// +// An example of a common specifier is `linux/amd64`. If the host has a default +// of runtime that matches this, the user can simply provide the component that +// matters. For example, if a image provides amd64 and arm64 support, the +// operating system, `linux` can be inferred, so they only have to provide +// `arm64` or `amd64`. Similar behavior is implemented for operating systems, +// where the architecture may be known but a runtime may support images from +// different operating systems. +// +// Normalization +// +// Because not all users are familiar with the way the Go runtime represents +// platforms, several normalizations have been provided to make this package +// easier to user. +// +// The following are performed for architectures: +// +// Value Normalized +// aarch64 arm64 +// armhf arm +// armel arm/v6 +// i386 386 +// x86_64 amd64 +// x86-64 amd64 +// +// We also normalize the operating system `macos` to `darwin`. +// +// ARM Support +// +// To qualify ARM architecture, the Variant field is used to qualify the arm +// version. The most common arm version, v7, is represented without the variant +// unless it is explicitly provided. This is treated as equivalent to armhf. A +// previous architecture, armel, will be normalized to arm/v6. +// +// While these normalizations are provided, their support on arm platforms has +// not yet been fully implemented and tested. +package platforms + +import ( + "regexp" + "runtime" + "strconv" + "strings" + + "github.com/containerd/containerd/errdefs" + specs "github.com/opencontainers/image-spec/specs-go/v1" + "github.com/pkg/errors" +) + +var ( + specifierRe = regexp.MustCompile(`^[A-Za-z0-9_-]+$`) +) + +// Matcher matches platforms specifications, provided by an image or runtime. +type Matcher interface { + Match(platform specs.Platform) bool +} + +// NewMatcher returns a simple matcher based on the provided platform +// specification. The returned matcher only looks for equality based on os, +// architecture and variant. +// +// One may implement their own matcher if this doesn't provide the required +// functionality. +// +// Applications should opt to use `Match` over directly parsing specifiers. +func NewMatcher(platform specs.Platform) Matcher { + return &matcher{ + Platform: Normalize(platform), + } +} + +type matcher struct { + specs.Platform +} + +func (m *matcher) Match(platform specs.Platform) bool { + normalized := Normalize(platform) + return m.OS == normalized.OS && + m.Architecture == normalized.Architecture && + m.Variant == normalized.Variant +} + +func (m *matcher) String() string { + return Format(m.Platform) +} + +// Parse parses the platform specifier syntax into a platform declaration. +// +// Platform specifiers are in the format `||/[/]`. +// The minimum required information for a platform specifier is the operating +// system or architecture. If there is only a single string (no slashes), the +// value will be matched against the known set of operating systems, then fall +// back to the known set of architectures. The missing component will be +// inferred based on the local environment. +func Parse(specifier string) (specs.Platform, error) { + if strings.Contains(specifier, "*") { + // TODO(stevvooe): need to work out exact wildcard handling + return specs.Platform{}, errors.Wrapf(errdefs.ErrInvalidArgument, "%q: wildcards not yet supported", specifier) + } + + parts := strings.Split(specifier, "/") + + for _, part := range parts { + if !specifierRe.MatchString(part) { + return specs.Platform{}, errors.Wrapf(errdefs.ErrInvalidArgument, "%q is an invalid component of %q: platform specifier component must match %q", part, specifier, specifierRe.String()) + } + } + + var p specs.Platform + switch len(parts) { + case 1: + // in this case, we will test that the value might be an OS, then look + // it up. If it is not known, we'll treat it as an architecture. Since + // we have very little information about the platform here, we are + // going to be a little more strict if we don't know about the argument + // value. + p.OS = normalizeOS(parts[0]) + if isKnownOS(p.OS) { + // picks a default architecture + p.Architecture = runtime.GOARCH + if p.Architecture == "arm" && cpuVariant != "v7" { + p.Variant = cpuVariant + } + + return p, nil + } + + p.Architecture, p.Variant = normalizeArch(parts[0], "") + if p.Architecture == "arm" && p.Variant == "v7" { + p.Variant = "" + } + if isKnownArch(p.Architecture) { + p.OS = runtime.GOOS + return p, nil + } + + return specs.Platform{}, errors.Wrapf(errdefs.ErrInvalidArgument, "%q: unknown operating system or architecture", specifier) + case 2: + // In this case, we treat as a regular os/arch pair. We don't care + // about whether or not we know of the platform. + p.OS = normalizeOS(parts[0]) + p.Architecture, p.Variant = normalizeArch(parts[1], "") + if p.Architecture == "arm" && p.Variant == "v7" { + p.Variant = "" + } + + return p, nil + case 3: + // we have a fully specified variant, this is rare + p.OS = normalizeOS(parts[0]) + p.Architecture, p.Variant = normalizeArch(parts[1], parts[2]) + if p.Architecture == "arm64" && p.Variant == "" { + p.Variant = "v8" + } + + return p, nil + } + + return specs.Platform{}, errors.Wrapf(errdefs.ErrInvalidArgument, "%q: cannot parse platform specifier", specifier) +} + +// MustParse is like Parses but panics if the specifier cannot be parsed. +// Simplifies initialization of global variables. +func MustParse(specifier string) specs.Platform { + p, err := Parse(specifier) + if err != nil { + panic("platform: Parse(" + strconv.Quote(specifier) + "): " + err.Error()) + } + return p +} + +// Format returns a string specifier from the provided platform specification. +func Format(platform specs.Platform) string { + if platform.OS == "" { + return "unknown" + } + + return joinNotEmpty(platform.OS, platform.Architecture, platform.Variant) +} + +func joinNotEmpty(s ...string) string { + var ss []string + for _, s := range s { + if s == "" { + continue + } + + ss = append(ss, s) + } + + return strings.Join(ss, "/") +} + +// Normalize validates and translate the platform to the canonical value. +// +// For example, if "Aarch64" is encountered, we change it to "arm64" or if +// "x86_64" is encountered, it becomes "amd64". +func Normalize(platform specs.Platform) specs.Platform { + platform.OS = normalizeOS(platform.OS) + platform.Architecture, platform.Variant = normalizeArch(platform.Architecture, platform.Variant) + + // these fields are deprecated, remove them + platform.OSFeatures = nil + platform.OSVersion = "" + + return platform +} diff --git a/vendor/github.com/containerd/containerd/sys/env.go b/vendor/github.com/containerd/containerd/sys/env.go new file mode 100644 index 000000000000..8450d627582d --- /dev/null +++ b/vendor/github.com/containerd/containerd/sys/env.go @@ -0,0 +1,33 @@ +// +build !windows + +/* + Copyright The containerd Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package sys + +import "golang.org/x/sys/unix" + +// RunningPrivileged returns true if the effective user ID of the +// calling process is 0 +func RunningPrivileged() bool { + return unix.Geteuid() == 0 +} + +// RunningUnprivileged returns true if the effective user ID of the +// calling process is not 0 +func RunningUnprivileged() bool { + return !RunningPrivileged() +} diff --git a/vendor/github.com/containerd/containerd/sys/epoll.go b/vendor/github.com/containerd/containerd/sys/epoll.go new file mode 100644 index 000000000000..28d6c2cabc64 --- /dev/null +++ b/vendor/github.com/containerd/containerd/sys/epoll.go @@ -0,0 +1,33 @@ +// +build linux + +/* + Copyright The containerd Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package sys + +import "golang.org/x/sys/unix" + +// EpollCreate1 is an alias for unix.EpollCreate1 +// Deprecated: use golang.org/x/sys/unix.EpollCreate1 +var EpollCreate1 = unix.EpollCreate1 + +// EpollCtl is an alias for unix.EpollCtl +// Deprecated: use golang.org/x/sys/unix.EpollCtl +var EpollCtl = unix.EpollCtl + +// EpollWait is an alias for unix.EpollWait +// Deprecated: use golang.org/x/sys/unix.EpollWait +var EpollWait = unix.EpollWait diff --git a/vendor/github.com/containerd/containerd/sys/fds.go b/vendor/github.com/containerd/containerd/sys/fds.go new file mode 100644 index 000000000000..db3cf702f495 --- /dev/null +++ b/vendor/github.com/containerd/containerd/sys/fds.go @@ -0,0 +1,34 @@ +// +build !windows,!darwin + +/* + Copyright The containerd Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package sys + +import ( + "io/ioutil" + "path/filepath" + "strconv" +) + +// GetOpenFds returns the number of open fds for the process provided by pid +func GetOpenFds(pid int) (int, error) { + dirs, err := ioutil.ReadDir(filepath.Join("/proc", strconv.Itoa(pid), "fd")) + if err != nil { + return -1, err + } + return len(dirs), nil +} diff --git a/vendor/github.com/containerd/containerd/sys/filesys.go b/vendor/github.com/containerd/containerd/sys/filesys.go new file mode 100644 index 000000000000..825d21d19a05 --- /dev/null +++ b/vendor/github.com/containerd/containerd/sys/filesys.go @@ -0,0 +1,35 @@ +/* + Copyright The containerd Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package sys + +import "os" + +// IsFifo checks if a file is a (named pipe) fifo +// if the file does not exist then it returns false +func IsFifo(path string) (bool, error) { + stat, err := os.Stat(path) + if err != nil { + if os.IsNotExist(err) { + return false, nil + } + return false, err + } + if stat.Mode()&os.ModeNamedPipe == os.ModeNamedPipe { + return true, nil + } + return false, nil +} diff --git a/vendor/github.com/containerd/containerd/sys/filesys_unix.go b/vendor/github.com/containerd/containerd/sys/filesys_unix.go new file mode 100644 index 000000000000..d8329af9fbca --- /dev/null +++ b/vendor/github.com/containerd/containerd/sys/filesys_unix.go @@ -0,0 +1,31 @@ +// +build !windows + +/* + Copyright The containerd Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package sys + +import "os" + +// ForceRemoveAll on unix is just a wrapper for os.RemoveAll +func ForceRemoveAll(path string) error { + return os.RemoveAll(path) +} + +// MkdirAllWithACL is a wrapper for os.MkdirAll on Unix systems. +func MkdirAllWithACL(path string, perm os.FileMode) error { + return os.MkdirAll(path, perm) +} diff --git a/vendor/github.com/containerd/containerd/sys/filesys_windows.go b/vendor/github.com/containerd/containerd/sys/filesys_windows.go new file mode 100644 index 000000000000..2eaee2ca2971 --- /dev/null +++ b/vendor/github.com/containerd/containerd/sys/filesys_windows.go @@ -0,0 +1,268 @@ +// +build windows + +/* + Copyright The containerd Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package sys + +import ( + "os" + "path/filepath" + "regexp" + "strings" + "syscall" + "unsafe" + + "github.com/Microsoft/hcsshim" + "golang.org/x/sys/windows" +) + +const ( + // SddlAdministratorsLocalSystem is local administrators plus NT AUTHORITY\System + SddlAdministratorsLocalSystem = "D:P(A;OICI;GA;;;BA)(A;OICI;GA;;;SY)" +) + +// MkdirAllWithACL is a wrapper for MkdirAll that creates a directory +// ACL'd for Builtin Administrators and Local System. +func MkdirAllWithACL(path string, perm os.FileMode) error { + return mkdirall(path, true) +} + +// MkdirAll implementation that is volume path aware for Windows. It can be used +// as a drop-in replacement for os.MkdirAll() +func MkdirAll(path string, _ os.FileMode) error { + return mkdirall(path, false) +} + +// mkdirall is a custom version of os.MkdirAll modified for use on Windows +// so that it is both volume path aware, and can create a directory with +// a DACL. +func mkdirall(path string, adminAndLocalSystem bool) error { + if re := regexp.MustCompile(`^\\\\\?\\Volume{[a-z0-9-]+}$`); re.MatchString(path) { + return nil + } + + // The rest of this method is largely copied from os.MkdirAll and should be kept + // as-is to ensure compatibility. + + // Fast path: if we can tell whether path is a directory or file, stop with success or error. + dir, err := os.Stat(path) + if err == nil { + if dir.IsDir() { + return nil + } + return &os.PathError{ + Op: "mkdir", + Path: path, + Err: syscall.ENOTDIR, + } + } + + // Slow path: make sure parent exists and then call Mkdir for path. + i := len(path) + for i > 0 && os.IsPathSeparator(path[i-1]) { // Skip trailing path separator. + i-- + } + + j := i + for j > 0 && !os.IsPathSeparator(path[j-1]) { // Scan backward over element. + j-- + } + + if j > 1 { + // Create parent + err = mkdirall(path[0:j-1], adminAndLocalSystem) + if err != nil { + return err + } + } + + // Parent now exists; invoke os.Mkdir or mkdirWithACL and use its result. + if adminAndLocalSystem { + err = mkdirWithACL(path) + } else { + err = os.Mkdir(path, 0) + } + + if err != nil { + // Handle arguments like "foo/." by + // double-checking that directory doesn't exist. + dir, err1 := os.Lstat(path) + if err1 == nil && dir.IsDir() { + return nil + } + return err + } + return nil +} + +// mkdirWithACL creates a new directory. If there is an error, it will be of +// type *PathError. . +// +// This is a modified and combined version of os.Mkdir and windows.Mkdir +// in golang to cater for creating a directory am ACL permitting full +// access, with inheritance, to any subfolder/file for Built-in Administrators +// and Local System. +func mkdirWithACL(name string) error { + sa := windows.SecurityAttributes{Length: 0} + sd, err := windows.SecurityDescriptorFromString(SddlAdministratorsLocalSystem) + if err != nil { + return &os.PathError{Op: "mkdir", Path: name, Err: err} + } + sa.Length = uint32(unsafe.Sizeof(sa)) + sa.InheritHandle = 1 + sa.SecurityDescriptor = sd + + namep, err := windows.UTF16PtrFromString(name) + if err != nil { + return &os.PathError{Op: "mkdir", Path: name, Err: err} + } + + e := windows.CreateDirectory(namep, &sa) + if e != nil { + return &os.PathError{Op: "mkdir", Path: name, Err: e} + } + return nil +} + +// IsAbs is a platform-specific wrapper for filepath.IsAbs. On Windows, +// golang filepath.IsAbs does not consider a path \windows\system32 as absolute +// as it doesn't start with a drive-letter/colon combination. However, in +// docker we need to verify things such as WORKDIR /windows/system32 in +// a Dockerfile (which gets translated to \windows\system32 when being processed +// by the daemon. This SHOULD be treated as absolute from a docker processing +// perspective. +func IsAbs(path string) bool { + if !filepath.IsAbs(path) { + if !strings.HasPrefix(path, string(os.PathSeparator)) { + return false + } + } + return true +} + +// The origin of the functions below here are the golang OS and windows packages, +// slightly modified to only cope with files, not directories due to the +// specific use case. +// +// The alteration is to allow a file on Windows to be opened with +// FILE_FLAG_SEQUENTIAL_SCAN (particular for docker load), to avoid eating +// the standby list, particularly when accessing large files such as layer.tar. + +// CreateSequential creates the named file with mode 0666 (before umask), truncating +// it if it already exists. If successful, methods on the returned +// File can be used for I/O; the associated file descriptor has mode +// O_RDWR. +// If there is an error, it will be of type *PathError. +func CreateSequential(name string) (*os.File, error) { + return OpenFileSequential(name, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0) +} + +// OpenSequential opens the named file for reading. If successful, methods on +// the returned file can be used for reading; the associated file +// descriptor has mode O_RDONLY. +// If there is an error, it will be of type *PathError. +func OpenSequential(name string) (*os.File, error) { + return OpenFileSequential(name, os.O_RDONLY, 0) +} + +// OpenFileSequential is the generalized open call; most users will use Open +// or Create instead. +// If there is an error, it will be of type *PathError. +func OpenFileSequential(name string, flag int, _ os.FileMode) (*os.File, error) { + if name == "" { + return nil, &os.PathError{Op: "open", Path: name, Err: syscall.ENOENT} + } + r, errf := windowsOpenFileSequential(name, flag, 0) + if errf == nil { + return r, nil + } + return nil, &os.PathError{Op: "open", Path: name, Err: errf} +} + +func windowsOpenFileSequential(name string, flag int, _ os.FileMode) (file *os.File, err error) { + r, e := windowsOpenSequential(name, flag|windows.O_CLOEXEC, 0) + if e != nil { + return nil, e + } + return os.NewFile(uintptr(r), name), nil +} + +func makeInheritSa() *windows.SecurityAttributes { + var sa windows.SecurityAttributes + sa.Length = uint32(unsafe.Sizeof(sa)) + sa.InheritHandle = 1 + return &sa +} + +func windowsOpenSequential(path string, mode int, _ uint32) (fd windows.Handle, err error) { + if len(path) == 0 { + return windows.InvalidHandle, windows.ERROR_FILE_NOT_FOUND + } + pathp, err := windows.UTF16PtrFromString(path) + if err != nil { + return windows.InvalidHandle, err + } + var access uint32 + switch mode & (windows.O_RDONLY | windows.O_WRONLY | windows.O_RDWR) { + case windows.O_RDONLY: + access = windows.GENERIC_READ + case windows.O_WRONLY: + access = windows.GENERIC_WRITE + case windows.O_RDWR: + access = windows.GENERIC_READ | windows.GENERIC_WRITE + } + if mode&windows.O_CREAT != 0 { + access |= windows.GENERIC_WRITE + } + if mode&windows.O_APPEND != 0 { + access &^= windows.GENERIC_WRITE + access |= windows.FILE_APPEND_DATA + } + sharemode := uint32(windows.FILE_SHARE_READ | windows.FILE_SHARE_WRITE) + var sa *windows.SecurityAttributes + if mode&windows.O_CLOEXEC == 0 { + sa = makeInheritSa() + } + var createmode uint32 + switch { + case mode&(windows.O_CREAT|windows.O_EXCL) == (windows.O_CREAT | windows.O_EXCL): + createmode = windows.CREATE_NEW + case mode&(windows.O_CREAT|windows.O_TRUNC) == (windows.O_CREAT | windows.O_TRUNC): + createmode = windows.CREATE_ALWAYS + case mode&windows.O_CREAT == windows.O_CREAT: + createmode = windows.OPEN_ALWAYS + case mode&windows.O_TRUNC == windows.O_TRUNC: + createmode = windows.TRUNCATE_EXISTING + default: + createmode = windows.OPEN_EXISTING + } + // Use FILE_FLAG_SEQUENTIAL_SCAN rather than FILE_ATTRIBUTE_NORMAL as implemented in golang. + // https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx + const fileFlagSequentialScan = 0x08000000 // FILE_FLAG_SEQUENTIAL_SCAN + h, e := windows.CreateFile(pathp, access, sharemode, sa, createmode, fileFlagSequentialScan, 0) + return h, e +} + +// ForceRemoveAll is the same as os.RemoveAll, but uses hcsshim.DestroyLayer in order +// to delete container layers. +func ForceRemoveAll(path string) error { + info := hcsshim.DriverInfo{ + HomeDir: filepath.Dir(path), + } + + return hcsshim.DestroyLayer(info, filepath.Base(path)) +} diff --git a/vendor/github.com/containerd/containerd/sys/mount_linux.go b/vendor/github.com/containerd/containerd/sys/mount_linux.go new file mode 100644 index 000000000000..a21045529ae0 --- /dev/null +++ b/vendor/github.com/containerd/containerd/sys/mount_linux.go @@ -0,0 +1,145 @@ +/* + Copyright The containerd Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package sys + +import ( + "runtime" + "syscall" + "unsafe" + + "github.com/containerd/containerd/log" + "github.com/pkg/errors" + "golang.org/x/sys/unix" +) + +// FMountat performs mount from the provided directory. +func FMountat(dirfd uintptr, source, target, fstype string, flags uintptr, data string) error { + var ( + sourceP, targetP, fstypeP, dataP *byte + pid uintptr + err error + errno, status syscall.Errno + ) + + sourceP, err = syscall.BytePtrFromString(source) + if err != nil { + return err + } + + targetP, err = syscall.BytePtrFromString(target) + if err != nil { + return err + } + + fstypeP, err = syscall.BytePtrFromString(fstype) + if err != nil { + return err + } + + if data != "" { + dataP, err = syscall.BytePtrFromString(data) + if err != nil { + return err + } + } + + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + var pipefds [2]int + if err := syscall.Pipe2(pipefds[:], syscall.O_CLOEXEC); err != nil { + return errors.Wrap(err, "failed to open pipe") + } + + defer func() { + // close both ends of the pipe in a deferred function, since open file + // descriptor table is shared with child + syscall.Close(pipefds[0]) + syscall.Close(pipefds[1]) + }() + + pid, errno = forkAndMountat(dirfd, + uintptr(unsafe.Pointer(sourceP)), + uintptr(unsafe.Pointer(targetP)), + uintptr(unsafe.Pointer(fstypeP)), + flags, + uintptr(unsafe.Pointer(dataP)), + pipefds[1], + ) + + if errno != 0 { + return errors.Wrap(errno, "failed to fork thread") + } + + defer func() { + _, err := unix.Wait4(int(pid), nil, 0, nil) + for err == syscall.EINTR { + _, err = unix.Wait4(int(pid), nil, 0, nil) + } + + if err != nil { + log.L.WithError(err).Debugf("failed to find pid=%d process", pid) + } + }() + + _, _, errno = syscall.RawSyscall(syscall.SYS_READ, + uintptr(pipefds[0]), + uintptr(unsafe.Pointer(&status)), + unsafe.Sizeof(status)) + if errno != 0 { + return errors.Wrap(errno, "failed to read pipe") + } + + if status != 0 { + return errors.Wrap(status, "failed to mount") + } + + return nil +} + +// forkAndMountat will fork thread, change working dir and mount. +// +// precondition: the runtime OS thread must be locked. +func forkAndMountat(dirfd uintptr, source, target, fstype, flags, data uintptr, pipefd int) (pid uintptr, errno syscall.Errno) { + + // block signal during clone + beforeFork() + + // the cloned thread shares the open file descriptor, but the thread + // never be reused by runtime. + pid, _, errno = syscall.RawSyscall6(syscall.SYS_CLONE, uintptr(syscall.SIGCHLD)|syscall.CLONE_FILES, 0, 0, 0, 0, 0) + if errno != 0 || pid != 0 { + // restore all signals + afterFork() + return + } + + // restore all signals + afterForkInChild() + + // change working dir + _, _, errno = syscall.RawSyscall(syscall.SYS_FCHDIR, dirfd, 0, 0) + if errno != 0 { + goto childerr + } + _, _, errno = syscall.RawSyscall6(syscall.SYS_MOUNT, source, target, fstype, flags, data, 0) + +childerr: + _, _, errno = syscall.RawSyscall(syscall.SYS_WRITE, uintptr(pipefd), uintptr(unsafe.Pointer(&errno)), unsafe.Sizeof(errno)) + syscall.RawSyscall(syscall.SYS_EXIT, uintptr(errno), 0, 0) + panic("unreachable") +} diff --git a/vendor/github.com/containerd/containerd/sys/oom_unix.go b/vendor/github.com/containerd/containerd/sys/oom_unix.go new file mode 100644 index 000000000000..c381e1a7e28b --- /dev/null +++ b/vendor/github.com/containerd/containerd/sys/oom_unix.go @@ -0,0 +1,61 @@ +// +build !windows + +/* + Copyright The containerd Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package sys + +import ( + "fmt" + "io/ioutil" + "os" + "strconv" + "strings" +) + +const ( + // OOMScoreMaxKillable is the maximum score keeping the process killable by the oom killer + OOMScoreMaxKillable = -999 + // OOMScoreAdjMax is from OOM_SCORE_ADJ_MAX https://github.com/torvalds/linux/blob/master/include/uapi/linux/oom.h + OOMScoreAdjMax = 1000 +) + +// SetOOMScore sets the oom score for the provided pid +func SetOOMScore(pid, score int) error { + path := fmt.Sprintf("/proc/%d/oom_score_adj", pid) + f, err := os.OpenFile(path, os.O_WRONLY, 0) + if err != nil { + return err + } + defer f.Close() + if _, err = f.WriteString(strconv.Itoa(score)); err != nil { + if os.IsPermission(err) && (RunningInUserNS() || RunningUnprivileged()) { + return nil + } + return err + } + return nil +} + +// GetOOMScoreAdj gets the oom score for a process +func GetOOMScoreAdj(pid int) (int, error) { + path := fmt.Sprintf("/proc/%d/oom_score_adj", pid) + data, err := ioutil.ReadFile(path) + if err != nil { + return 0, err + } + return strconv.Atoi(strings.TrimSpace(string(data))) +} diff --git a/vendor/github.com/containerd/containerd/sys/oom_windows.go b/vendor/github.com/containerd/containerd/sys/oom_windows.go new file mode 100644 index 000000000000..215c171f6efe --- /dev/null +++ b/vendor/github.com/containerd/containerd/sys/oom_windows.go @@ -0,0 +1,36 @@ +/* + Copyright The containerd Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package sys + +const ( + // OOMScoreAdjMax is not implemented on Windows + OOMScoreAdjMax = 0 +) + +// SetOOMScore sets the oom score for the process +// +// Not implemented on Windows +func SetOOMScore(pid, score int) error { + return nil +} + +// GetOOMScoreAdj gets the oom score for a process +// +// Not implemented on Windows +func GetOOMScoreAdj(pid int) (int, error) { + return 0, nil +} diff --git a/vendor/github.com/containerd/containerd/sys/socket_unix.go b/vendor/github.com/containerd/containerd/sys/socket_unix.go new file mode 100644 index 000000000000..b67cc1fa3a71 --- /dev/null +++ b/vendor/github.com/containerd/containerd/sys/socket_unix.go @@ -0,0 +1,80 @@ +// +build !windows + +/* + Copyright The containerd Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package sys + +import ( + "net" + "os" + "path/filepath" + + "github.com/pkg/errors" + "golang.org/x/sys/unix" +) + +// CreateUnixSocket creates a unix socket and returns the listener +func CreateUnixSocket(path string) (net.Listener, error) { + // BSDs have a 104 limit + if len(path) > 104 { + return nil, errors.Errorf("%q: unix socket path too long (> 104)", path) + } + if err := os.MkdirAll(filepath.Dir(path), 0660); err != nil { + return nil, err + } + if err := unix.Unlink(path); err != nil && !os.IsNotExist(err) { + return nil, err + } + return net.Listen("unix", path) +} + +// GetLocalListener returns a listener out of a unix socket. +func GetLocalListener(path string, uid, gid int) (net.Listener, error) { + // Ensure parent directory is created + if err := mkdirAs(filepath.Dir(path), uid, gid); err != nil { + return nil, err + } + + l, err := CreateUnixSocket(path) + if err != nil { + return l, err + } + + if err := os.Chmod(path, 0660); err != nil { + l.Close() + return nil, err + } + + if err := os.Chown(path, uid, gid); err != nil { + l.Close() + return nil, err + } + + return l, nil +} + +func mkdirAs(path string, uid, gid int) error { + if _, err := os.Stat(path); !os.IsNotExist(err) { + return err + } + + if err := os.MkdirAll(path, 0770); err != nil { + return err + } + + return os.Chown(path, uid, gid) +} diff --git a/vendor/github.com/containerd/containerd/sys/socket_windows.go b/vendor/github.com/containerd/containerd/sys/socket_windows.go new file mode 100644 index 000000000000..3ee7679b49ba --- /dev/null +++ b/vendor/github.com/containerd/containerd/sys/socket_windows.go @@ -0,0 +1,32 @@ +// +build windows + +/* + Copyright The containerd Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package sys + +import ( + "net" + + "github.com/Microsoft/go-winio" +) + +// GetLocalListener returns a Listernet out of a named pipe. +// `path` must be of the form of `\\.\pipe\` +// (see https://msdn.microsoft.com/en-us/library/windows/desktop/aa365150) +func GetLocalListener(path string, uid, gid int) (net.Listener, error) { + return winio.ListenPipe(path, nil) +} diff --git a/vendor/github.com/containerd/containerd/sys/stat_bsd.go b/vendor/github.com/containerd/containerd/sys/stat_bsd.go new file mode 100644 index 000000000000..b9c95d90d783 --- /dev/null +++ b/vendor/github.com/containerd/containerd/sys/stat_bsd.go @@ -0,0 +1,44 @@ +// +build darwin freebsd + +/* + Copyright The containerd Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package sys + +import ( + "syscall" + "time" +) + +// StatAtime returns the access time from a stat struct +func StatAtime(st *syscall.Stat_t) syscall.Timespec { + return st.Atimespec +} + +// StatCtime returns the created time from a stat struct +func StatCtime(st *syscall.Stat_t) syscall.Timespec { + return st.Ctimespec +} + +// StatMtime returns the modified time from a stat struct +func StatMtime(st *syscall.Stat_t) syscall.Timespec { + return st.Mtimespec +} + +// StatATimeAsTime returns the access time as a time.Time +func StatATimeAsTime(st *syscall.Stat_t) time.Time { + return time.Unix(int64(st.Atimespec.Sec), int64(st.Atimespec.Nsec)) // nolint: unconvert +} diff --git a/vendor/github.com/containerd/containerd/sys/stat_unix.go b/vendor/github.com/containerd/containerd/sys/stat_unix.go new file mode 100644 index 000000000000..21a666dff868 --- /dev/null +++ b/vendor/github.com/containerd/containerd/sys/stat_unix.go @@ -0,0 +1,44 @@ +// +build linux solaris + +/* + Copyright The containerd Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package sys + +import ( + "syscall" + "time" +) + +// StatAtime returns the Atim +func StatAtime(st *syscall.Stat_t) syscall.Timespec { + return st.Atim +} + +// StatCtime returns the Ctim +func StatCtime(st *syscall.Stat_t) syscall.Timespec { + return st.Ctim +} + +// StatMtime returns the Mtim +func StatMtime(st *syscall.Stat_t) syscall.Timespec { + return st.Mtim +} + +// StatATimeAsTime returns st.Atim as a time.Time +func StatATimeAsTime(st *syscall.Stat_t) time.Time { + return time.Unix(int64(st.Atim.Sec), int64(st.Atim.Nsec)) // nolint: unconvert +} diff --git a/vendor/github.com/containerd/containerd/sys/subprocess_unsafe_linux.go b/vendor/github.com/containerd/containerd/sys/subprocess_unsafe_linux.go new file mode 100644 index 000000000000..6e40a9c7d7f0 --- /dev/null +++ b/vendor/github.com/containerd/containerd/sys/subprocess_unsafe_linux.go @@ -0,0 +1,30 @@ +/* + Copyright The containerd Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package sys + +import ( + _ "unsafe" // required for go:linkname. +) + +//go:linkname beforeFork syscall.runtime_BeforeFork +func beforeFork() + +//go:linkname afterFork syscall.runtime_AfterFork +func afterFork() + +//go:linkname afterForkInChild syscall.runtime_AfterForkInChild +func afterForkInChild() diff --git a/vendor/github.com/containerd/containerd/sys/subprocess_unsafe_linux.s b/vendor/github.com/containerd/containerd/sys/subprocess_unsafe_linux.s new file mode 100644 index 000000000000..c073fa4ad7cc --- /dev/null +++ b/vendor/github.com/containerd/containerd/sys/subprocess_unsafe_linux.s @@ -0,0 +1,15 @@ +/* + Copyright The containerd Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ diff --git a/vendor/github.com/containerd/containerd/sys/userns_linux.go b/vendor/github.com/containerd/containerd/sys/userns_linux.go new file mode 100644 index 000000000000..3cd1a2222082 --- /dev/null +++ b/vendor/github.com/containerd/containerd/sys/userns_linux.go @@ -0,0 +1,62 @@ +/* + Copyright The containerd Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package sys + +import ( + "bufio" + "fmt" + "os" + "sync" +) + +var ( + inUserNS bool + nsOnce sync.Once +) + +// RunningInUserNS detects whether we are currently running in a user namespace. +// Originally copied from github.com/lxc/lxd/shared/util.go +func RunningInUserNS() bool { + nsOnce.Do(func() { + file, err := os.Open("/proc/self/uid_map") + if err != nil { + // This kernel-provided file only exists if user namespaces are supported + return + } + defer file.Close() + + buf := bufio.NewReader(file) + l, _, err := buf.ReadLine() + if err != nil { + return + } + + line := string(l) + var a, b, c int64 + fmt.Sscanf(line, "%d %d %d", &a, &b, &c) + + /* + * We assume we are in the initial user namespace if we have a full + * range - 4294967295 uids starting at uid 0. + */ + if a == 0 && b == 0 && c == 4294967295 { + return + } + inUserNS = true + }) + return inUserNS +} diff --git a/vendor/github.com/containerd/containerd/sys/userns_unsupported.go b/vendor/github.com/containerd/containerd/sys/userns_unsupported.go new file mode 100644 index 000000000000..549b50200c50 --- /dev/null +++ b/vendor/github.com/containerd/containerd/sys/userns_unsupported.go @@ -0,0 +1,25 @@ +// +build !linux + +/* + Copyright The containerd Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package sys + +// RunningInUserNS is a stub for non-Linux systems +// Always returns false +func RunningInUserNS() bool { + return false +} diff --git a/vendor/github.com/containerd/continuity/AUTHORS b/vendor/github.com/containerd/continuity/AUTHORS index 4043394cc501..376ceb93d647 100644 --- a/vendor/github.com/containerd/continuity/AUTHORS +++ b/vendor/github.com/containerd/continuity/AUTHORS @@ -1,16 +1,40 @@ Aaron Lehmann Akash Gupta +Akihiro Suda Akihiro Suda +Akihiro Suda Andrew Pennebaker Brandon Philips +Brian Goff Christopher Jones Daniel, Dao Quang Minh +Darren Stahl +Derek McGowan Derek McGowan Edward Pilatowicz Ian Campbell +Ivan Markin Justin Cormack Justin Cummins +Kasper Fabæch Brandt +Kir Kolyshkin +Michael Crosby +Michael Crosby +Michael Wan +Mike Brown +Niels de Vos Phil Estes +Phil Estes +Samuel Karp +Sam Whited +Sebastiaan van Stijn +Shengjing Zhu Stephen J Day +Tibor Vass Tobias Klauser +Tom Faulhaber Tonis Tiigi +Trevor Porter +Wei Fu +Wilbert van de Ridder +Xiaodong Ye diff --git a/vendor/github.com/containerd/continuity/fs/copy.go b/vendor/github.com/containerd/continuity/fs/copy.go index 97053d7e5c47..818bba2cda20 100644 --- a/vendor/github.com/containerd/continuity/fs/copy.go +++ b/vendor/github.com/containerd/continuity/fs/copy.go @@ -104,6 +104,10 @@ func copyDirectory(dst, src string, inodes map[uint64]string, o *copyDirOpts) er return errors.Wrapf(err, "failed to copy file info for %s", dst) } + if err := copyXAttrs(dst, src, o.xeh); err != nil { + return errors.Wrap(err, "failed to copy xattrs") + } + for _, fi := range fis { source := filepath.Join(src, fi.Name()) target := filepath.Join(dst, fi.Name()) diff --git a/vendor/github.com/containerd/continuity/fs/copy_darwinopenbsdsolaris.go b/vendor/github.com/containerd/continuity/fs/copy_darwinopenbsdsolaris.go new file mode 100644 index 000000000000..92ccacf9af36 --- /dev/null +++ b/vendor/github.com/containerd/continuity/fs/copy_darwinopenbsdsolaris.go @@ -0,0 +1,40 @@ +// +build darwin openbsd solaris + +/* + Copyright The containerd Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package fs + +import ( + "os" + "syscall" + + "github.com/pkg/errors" + "golang.org/x/sys/unix" +) + +func copyDevice(dst string, fi os.FileInfo) error { + st, ok := fi.Sys().(*syscall.Stat_t) + if !ok { + return errors.New("unsupported stat type") + } + return unix.Mknod(dst, uint32(fi.Mode()), int(st.Rdev)) +} + +func utimesNano(name string, atime, mtime syscall.Timespec) error { + timespec := []syscall.Timespec{atime, mtime} + return syscall.UtimesNano(name, timespec) +} diff --git a/vendor/github.com/containerd/continuity/fs/copy_freebsd.go b/vendor/github.com/containerd/continuity/fs/copy_freebsd.go new file mode 100644 index 000000000000..4b116c95e43d --- /dev/null +++ b/vendor/github.com/containerd/continuity/fs/copy_freebsd.go @@ -0,0 +1,42 @@ +// +build freebsd + +/* + Copyright The containerd Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package fs + +import ( + "os" + "syscall" + + "github.com/pkg/errors" + "golang.org/x/sys/unix" +) + +func copyDevice(dst string, fi os.FileInfo) error { + st, ok := fi.Sys().(*syscall.Stat_t) + if !ok { + return errors.New("unsupported stat type") + } + return unix.Mknod(dst, uint32(fi.Mode()), st.Rdev) +} + +func utimesNano(name string, atime, mtime syscall.Timespec) error { + at := unix.NsecToTimespec(atime.Nano()) + mt := unix.NsecToTimespec(mtime.Nano()) + utimes := [2]unix.Timespec{at, mt} + return unix.UtimesNanoAt(unix.AT_FDCWD, name, utimes[0:], unix.AT_SYMLINK_NOFOLLOW) +} diff --git a/vendor/github.com/containerd/continuity/fs/copy_linux.go b/vendor/github.com/containerd/continuity/fs/copy_linux.go index 81c71522aa17..72bae7d4e499 100644 --- a/vendor/github.com/containerd/continuity/fs/copy_linux.go +++ b/vendor/github.com/containerd/continuity/fs/copy_linux.go @@ -51,7 +51,10 @@ func copyFileInfo(fi os.FileInfo, name string) error { } } - timespec := []unix.Timespec{unix.Timespec(StatAtime(st)), unix.Timespec(StatMtime(st))} + timespec := []unix.Timespec{ + unix.NsecToTimespec(syscall.TimespecToNsec(StatAtime(st))), + unix.NsecToTimespec(syscall.TimespecToNsec(StatMtime(st))), + } if err := unix.UtimesNanoAt(unix.AT_FDCWD, name, timespec, unix.AT_SYMLINK_NOFOLLOW); err != nil { return errors.Wrapf(err, "failed to utime %s", name) } diff --git a/vendor/github.com/containerd/continuity/fs/copy_unix.go b/vendor/github.com/containerd/continuity/fs/copy_unix.go index 73c01a46ddd7..dfd857aaa227 100644 --- a/vendor/github.com/containerd/continuity/fs/copy_unix.go +++ b/vendor/github.com/containerd/continuity/fs/copy_unix.go @@ -1,4 +1,4 @@ -// +build solaris darwin freebsd +// +build darwin freebsd openbsd solaris /* Copyright The containerd Authors. @@ -25,7 +25,6 @@ import ( "github.com/containerd/continuity/sysx" "github.com/pkg/errors" - "golang.org/x/sys/unix" ) func copyFileInfo(fi os.FileInfo, name string) error { @@ -53,8 +52,7 @@ func copyFileInfo(fi os.FileInfo, name string) error { } } - timespec := []syscall.Timespec{StatAtime(st), StatMtime(st)} - if err := syscall.UtimesNano(name, timespec); err != nil { + if err := utimesNano(name, StatAtime(st), StatMtime(st)); err != nil { return errors.Wrapf(err, "failed to utime %s", name) } @@ -102,11 +100,3 @@ func copyXAttrs(dst, src string, xeh XAttrErrorHandler) error { return nil } - -func copyDevice(dst string, fi os.FileInfo) error { - st, ok := fi.Sys().(*syscall.Stat_t) - if !ok { - return errors.New("unsupported stat type") - } - return unix.Mknod(dst, uint32(fi.Mode()), int(st.Rdev)) -} diff --git a/vendor/github.com/containerd/continuity/fs/du_unix.go b/vendor/github.com/containerd/continuity/fs/du_unix.go index e22ffbea378f..9da43d1bc8e9 100644 --- a/vendor/github.com/containerd/continuity/fs/du_unix.go +++ b/vendor/github.com/containerd/continuity/fs/du_unix.go @@ -25,6 +25,14 @@ import ( "syscall" ) +// blocksUnitSize is the unit used by `st_blocks` in `stat` in bytes. +// See https://man7.org/linux/man-pages/man2/stat.2.html +// st_blocks +// This field indicates the number of blocks allocated to the +// file, in 512-byte units. (This may be smaller than +// st_size/512 when the file has holes.) +const blocksUnitSize = 512 + type inode struct { // TODO(stevvooe): Can probably reduce memory usage by not tracking // device, but we can leave this right for now. @@ -33,9 +41,9 @@ type inode struct { func newInode(stat *syscall.Stat_t) inode { return inode{ - // Dev is uint32 on darwin/bsd, uint64 on linux/solaris + // Dev is uint32 on darwin/bsd, uint64 on linux/solaris/freebsd dev: uint64(stat.Dev), // nolint: unconvert - // Ino is uint32 on bsd, uint64 on darwin/linux/solaris + // Ino is uint32 on bsd, uint64 on darwin/linux/solaris/freebsd ino: uint64(stat.Ino), // nolint: unconvert } } @@ -59,10 +67,11 @@ func diskUsage(ctx context.Context, roots ...string) (Usage, error) { default: } - inoKey := newInode(fi.Sys().(*syscall.Stat_t)) + stat := fi.Sys().(*syscall.Stat_t) + inoKey := newInode(stat) if _, ok := inodes[inoKey]; !ok { inodes[inoKey] = struct{}{} - size += fi.Size() + size += stat.Blocks * blocksUnitSize } return nil @@ -89,10 +98,11 @@ func diffUsage(ctx context.Context, a, b string) (Usage, error) { } if kind == ChangeKindAdd || kind == ChangeKindModify { - inoKey := newInode(fi.Sys().(*syscall.Stat_t)) + stat := fi.Sys().(*syscall.Stat_t) + inoKey := newInode(stat) if _, ok := inodes[inoKey]; !ok { inodes[inoKey] = struct{}{} - size += fi.Size() + size += stat.Blocks * blocksUnitSize } return nil diff --git a/vendor/github.com/containerd/continuity/fs/path.go b/vendor/github.com/containerd/continuity/fs/path.go index 8863caa9df16..c26be79898e3 100644 --- a/vendor/github.com/containerd/continuity/fs/path.go +++ b/vendor/github.com/containerd/continuity/fs/path.go @@ -117,15 +117,13 @@ func sameFile(f1, f2 *currentPath) (bool, error) { // If the timestamp may have been truncated in both of the // files, check content of file to determine difference if t1.Nanosecond() == 0 && t2.Nanosecond() == 0 { - var eq bool if (f1.f.Mode() & os.ModeSymlink) == os.ModeSymlink { - eq, err = compareSymlinkTarget(f1.fullPath, f2.fullPath) - } else if f1.f.Size() > 0 { - eq, err = compareFileContent(f1.fullPath, f2.fullPath) + return compareSymlinkTarget(f1.fullPath, f2.fullPath) } - if err != nil || !eq { - return eq, err + if f1.f.Size() == 0 { // if file sizes are zero length, the files are the same by definition + return true, nil } + return compareFileContent(f1.fullPath, f2.fullPath) } else if t1.Nanosecond() != t2.Nanosecond() { return false, nil } diff --git a/vendor/github.com/containerd/continuity/fs/stat_bsd.go b/vendor/github.com/containerd/continuity/fs/stat_darwinfreebsd.go similarity index 100% rename from vendor/github.com/containerd/continuity/fs/stat_bsd.go rename to vendor/github.com/containerd/continuity/fs/stat_darwinfreebsd.go diff --git a/vendor/github.com/containerd/continuity/fs/stat_linux.go b/vendor/github.com/containerd/continuity/fs/stat_linux.go deleted file mode 100644 index 4a678dd1fd46..000000000000 --- a/vendor/github.com/containerd/continuity/fs/stat_linux.go +++ /dev/null @@ -1,43 +0,0 @@ -/* - Copyright The containerd Authors. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -package fs - -import ( - "syscall" - "time" -) - -// StatAtime returns the Atim -func StatAtime(st *syscall.Stat_t) syscall.Timespec { - return st.Atim -} - -// StatCtime returns the Ctim -func StatCtime(st *syscall.Stat_t) syscall.Timespec { - return st.Ctim -} - -// StatMtime returns the Mtim -func StatMtime(st *syscall.Stat_t) syscall.Timespec { - return st.Mtim -} - -// StatATimeAsTime returns st.Atim as a time.Time -func StatATimeAsTime(st *syscall.Stat_t) time.Time { - // The int64 conversions ensure the line compiles for 32-bit systems as well. - return time.Unix(int64(st.Atim.Sec), int64(st.Atim.Nsec)) // nolint: unconvert -} diff --git a/vendor/github.com/containerd/continuity/fs/stat_linuxopenbsd.go b/vendor/github.com/containerd/continuity/fs/stat_linuxopenbsd.go new file mode 100644 index 000000000000..c68df6e586cd --- /dev/null +++ b/vendor/github.com/containerd/continuity/fs/stat_linuxopenbsd.go @@ -0,0 +1,45 @@ +// +build linux openbsd + +/* + Copyright The containerd Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package fs + +import ( + "syscall" + "time" +) + +// StatAtime returns the Atim +func StatAtime(st *syscall.Stat_t) syscall.Timespec { + return st.Atim +} + +// StatCtime returns the Ctim +func StatCtime(st *syscall.Stat_t) syscall.Timespec { + return st.Ctim +} + +// StatMtime returns the Mtim +func StatMtime(st *syscall.Stat_t) syscall.Timespec { + return st.Mtim +} + +// StatATimeAsTime returns st.Atim as a time.Time +func StatATimeAsTime(st *syscall.Stat_t) time.Time { + // The int64 conversions ensure the line compiles for 32-bit systems as well. + return time.Unix(int64(st.Atim.Sec), int64(st.Atim.Nsec)) // nolint: unconvert +} diff --git a/vendor/github.com/containerd/continuity/pathdriver/path_driver.go b/vendor/github.com/containerd/continuity/pathdriver/path_driver.go deleted file mode 100644 index b0d5a6b56706..000000000000 --- a/vendor/github.com/containerd/continuity/pathdriver/path_driver.go +++ /dev/null @@ -1,101 +0,0 @@ -/* - Copyright The containerd Authors. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -package pathdriver - -import ( - "path/filepath" -) - -// PathDriver provides all of the path manipulation functions in a common -// interface. The context should call these and never use the `filepath` -// package or any other package to manipulate paths. -type PathDriver interface { - Join(paths ...string) string - IsAbs(path string) bool - Rel(base, target string) (string, error) - Base(path string) string - Dir(path string) string - Clean(path string) string - Split(path string) (dir, file string) - Separator() byte - Abs(path string) (string, error) - Walk(string, filepath.WalkFunc) error - FromSlash(path string) string - ToSlash(path string) string - Match(pattern, name string) (matched bool, err error) -} - -// pathDriver is a simple default implementation calls the filepath package. -type pathDriver struct{} - -// LocalPathDriver is the exported pathDriver struct for convenience. -var LocalPathDriver PathDriver = &pathDriver{} - -func (*pathDriver) Join(paths ...string) string { - return filepath.Join(paths...) -} - -func (*pathDriver) IsAbs(path string) bool { - return filepath.IsAbs(path) -} - -func (*pathDriver) Rel(base, target string) (string, error) { - return filepath.Rel(base, target) -} - -func (*pathDriver) Base(path string) string { - return filepath.Base(path) -} - -func (*pathDriver) Dir(path string) string { - return filepath.Dir(path) -} - -func (*pathDriver) Clean(path string) string { - return filepath.Clean(path) -} - -func (*pathDriver) Split(path string) (dir, file string) { - return filepath.Split(path) -} - -func (*pathDriver) Separator() byte { - return filepath.Separator -} - -func (*pathDriver) Abs(path string) (string, error) { - return filepath.Abs(path) -} - -// Note that filepath.Walk calls os.Stat, so if the context wants to -// to call Driver.Stat() for Walk, they need to create a new struct that -// overrides this method. -func (*pathDriver) Walk(root string, walkFn filepath.WalkFunc) error { - return filepath.Walk(root, walkFn) -} - -func (*pathDriver) FromSlash(path string) string { - return filepath.FromSlash(path) -} - -func (*pathDriver) ToSlash(path string) string { - return filepath.ToSlash(path) -} - -func (*pathDriver) Match(pattern, name string) (bool, error) { - return filepath.Match(pattern, name) -} diff --git a/vendor/github.com/containerd/continuity/syscallx/syscall_unix.go b/vendor/github.com/containerd/continuity/syscallx/syscall_unix.go deleted file mode 100644 index 0bfa6a0409d0..000000000000 --- a/vendor/github.com/containerd/continuity/syscallx/syscall_unix.go +++ /dev/null @@ -1,26 +0,0 @@ -// +build !windows - -/* - Copyright The containerd Authors. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -package syscallx - -import "syscall" - -// Readlink returns the destination of the named symbolic link. -func Readlink(path string, buf []byte) (n int, err error) { - return syscall.Readlink(path, buf) -} diff --git a/vendor/github.com/containerd/continuity/syscallx/syscall_windows.go b/vendor/github.com/containerd/continuity/syscallx/syscall_windows.go deleted file mode 100644 index 2ba814990519..000000000000 --- a/vendor/github.com/containerd/continuity/syscallx/syscall_windows.go +++ /dev/null @@ -1,112 +0,0 @@ -/* - Copyright The containerd Authors. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -package syscallx - -import ( - "syscall" - "unsafe" -) - -type reparseDataBuffer struct { - ReparseTag uint32 - ReparseDataLength uint16 - Reserved uint16 - - // GenericReparseBuffer - reparseBuffer byte -} - -type mountPointReparseBuffer struct { - SubstituteNameOffset uint16 - SubstituteNameLength uint16 - PrintNameOffset uint16 - PrintNameLength uint16 - PathBuffer [1]uint16 -} - -type symbolicLinkReparseBuffer struct { - SubstituteNameOffset uint16 - SubstituteNameLength uint16 - PrintNameOffset uint16 - PrintNameLength uint16 - Flags uint32 - PathBuffer [1]uint16 -} - -const ( - _IO_REPARSE_TAG_MOUNT_POINT = 0xA0000003 - _SYMLINK_FLAG_RELATIVE = 1 -) - -// Readlink returns the destination of the named symbolic link. -func Readlink(path string, buf []byte) (n int, err error) { - fd, err := syscall.CreateFile(syscall.StringToUTF16Ptr(path), syscall.GENERIC_READ, 0, nil, syscall.OPEN_EXISTING, - syscall.FILE_FLAG_OPEN_REPARSE_POINT|syscall.FILE_FLAG_BACKUP_SEMANTICS, 0) - if err != nil { - return -1, err - } - defer syscall.CloseHandle(fd) - - rdbbuf := make([]byte, syscall.MAXIMUM_REPARSE_DATA_BUFFER_SIZE) - var bytesReturned uint32 - err = syscall.DeviceIoControl(fd, syscall.FSCTL_GET_REPARSE_POINT, nil, 0, &rdbbuf[0], uint32(len(rdbbuf)), &bytesReturned, nil) - if err != nil { - return -1, err - } - - rdb := (*reparseDataBuffer)(unsafe.Pointer(&rdbbuf[0])) - var s string - switch rdb.ReparseTag { - case syscall.IO_REPARSE_TAG_SYMLINK: - data := (*symbolicLinkReparseBuffer)(unsafe.Pointer(&rdb.reparseBuffer)) - p := (*[0xffff]uint16)(unsafe.Pointer(&data.PathBuffer[0])) - s = syscall.UTF16ToString(p[data.SubstituteNameOffset/2 : (data.SubstituteNameOffset+data.SubstituteNameLength)/2]) - if data.Flags&_SYMLINK_FLAG_RELATIVE == 0 { - if len(s) >= 4 && s[:4] == `\??\` { - s = s[4:] - switch { - case len(s) >= 2 && s[1] == ':': // \??\C:\foo\bar - // do nothing - case len(s) >= 4 && s[:4] == `UNC\`: // \??\UNC\foo\bar - s = `\\` + s[4:] - default: - // unexpected; do nothing - } - } else { - // unexpected; do nothing - } - } - case _IO_REPARSE_TAG_MOUNT_POINT: - data := (*mountPointReparseBuffer)(unsafe.Pointer(&rdb.reparseBuffer)) - p := (*[0xffff]uint16)(unsafe.Pointer(&data.PathBuffer[0])) - s = syscall.UTF16ToString(p[data.SubstituteNameOffset/2 : (data.SubstituteNameOffset+data.SubstituteNameLength)/2]) - if len(s) >= 4 && s[:4] == `\??\` { // \??\C:\foo\bar - if len(s) < 48 || s[:11] != `\??\Volume{` { - s = s[4:] - } - } else { - // unexpected; do nothing - } - default: - // the path is not a symlink or junction but another type of reparse - // point - return -1, syscall.ENOENT - } - n = copy(buf, []byte(s)) - - return n, nil -} diff --git a/vendor/github.com/containerd/continuity/sysx/file_posix.go b/vendor/github.com/containerd/continuity/sysx/file_posix.go deleted file mode 100644 index e28f3a1b574c..000000000000 --- a/vendor/github.com/containerd/continuity/sysx/file_posix.go +++ /dev/null @@ -1,128 +0,0 @@ -/* - Copyright The containerd Authors. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -package sysx - -import ( - "os" - "path/filepath" - - "github.com/containerd/continuity/syscallx" -) - -// Readlink returns the destination of the named symbolic link. -// If there is an error, it will be of type *PathError. -func Readlink(name string) (string, error) { - for len := 128; ; len *= 2 { - b := make([]byte, len) - n, e := fixCount(syscallx.Readlink(fixLongPath(name), b)) - if e != nil { - return "", &os.PathError{Op: "readlink", Path: name, Err: e} - } - if n < len { - return string(b[0:n]), nil - } - } -} - -// Many functions in package syscall return a count of -1 instead of 0. -// Using fixCount(call()) instead of call() corrects the count. -func fixCount(n int, err error) (int, error) { - if n < 0 { - n = 0 - } - return n, err -} - -// fixLongPath returns the extended-length (\\?\-prefixed) form of -// path when needed, in order to avoid the default 260 character file -// path limit imposed by Windows. If path is not easily converted to -// the extended-length form (for example, if path is a relative path -// or contains .. elements), or is short enough, fixLongPath returns -// path unmodified. -// -// See https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx#maxpath -func fixLongPath(path string) string { - // Do nothing (and don't allocate) if the path is "short". - // Empirically (at least on the Windows Server 2013 builder), - // the kernel is arbitrarily okay with < 248 bytes. That - // matches what the docs above say: - // "When using an API to create a directory, the specified - // path cannot be so long that you cannot append an 8.3 file - // name (that is, the directory name cannot exceed MAX_PATH - // minus 12)." Since MAX_PATH is 260, 260 - 12 = 248. - // - // The MSDN docs appear to say that a normal path that is 248 bytes long - // will work; empirically the path must be less then 248 bytes long. - if len(path) < 248 { - // Don't fix. (This is how Go 1.7 and earlier worked, - // not automatically generating the \\?\ form) - return path - } - - // The extended form begins with \\?\, as in - // \\?\c:\windows\foo.txt or \\?\UNC\server\share\foo.txt. - // The extended form disables evaluation of . and .. path - // elements and disables the interpretation of / as equivalent - // to \. The conversion here rewrites / to \ and elides - // . elements as well as trailing or duplicate separators. For - // simplicity it avoids the conversion entirely for relative - // paths or paths containing .. elements. For now, - // \\server\share paths are not converted to - // \\?\UNC\server\share paths because the rules for doing so - // are less well-specified. - if len(path) >= 2 && path[:2] == `\\` { - // Don't canonicalize UNC paths. - return path - } - if !filepath.IsAbs(path) { - // Relative path - return path - } - - const prefix = `\\?` - - pathbuf := make([]byte, len(prefix)+len(path)+len(`\`)) - copy(pathbuf, prefix) - n := len(path) - r, w := 0, len(prefix) - for r < n { - switch { - case os.IsPathSeparator(path[r]): - // empty block - r++ - case path[r] == '.' && (r+1 == n || os.IsPathSeparator(path[r+1])): - // /./ - r++ - case r+1 < n && path[r] == '.' && path[r+1] == '.' && (r+2 == n || os.IsPathSeparator(path[r+2])): - // /../ is currently unhandled - return path - default: - pathbuf[w] = '\\' - w++ - for ; r < n && !os.IsPathSeparator(path[r]); r++ { - pathbuf[w] = path[r] - w++ - } - } - } - // A drive's root directory needs a trailing \ - if w == len(`\\?\c:`) { - pathbuf[w] = '\\' - w++ - } - return string(pathbuf[:w]) -} diff --git a/vendor/github.com/containerd/continuity/sysx/nodata_unix.go b/vendor/github.com/containerd/continuity/sysx/nodata_unix.go index b26f5b3d0394..de4b3d50ceda 100644 --- a/vendor/github.com/containerd/continuity/sysx/nodata_unix.go +++ b/vendor/github.com/containerd/continuity/sysx/nodata_unix.go @@ -1,4 +1,4 @@ -// +build darwin freebsd +// +build darwin freebsd openbsd /* Copyright The containerd Authors. diff --git a/vendor/github.com/containerd/continuity/sysx/xattr.go b/vendor/github.com/containerd/continuity/sysx/xattr.go index 9e4326dcfe3f..db6fe70fe927 100644 --- a/vendor/github.com/containerd/continuity/sysx/xattr.go +++ b/vendor/github.com/containerd/continuity/sysx/xattr.go @@ -20,7 +20,6 @@ package sysx import ( "bytes" - "syscall" "golang.org/x/sys/unix" ) @@ -66,60 +65,53 @@ func LGetxattr(path, attr string) ([]byte, error) { return getxattrAll(path, attr, unix.Lgetxattr) } -const defaultXattrBufferSize = 5 +const defaultXattrBufferSize = 128 type listxattrFunc func(path string, dest []byte) (int, error) func listxattrAll(path string, listFunc listxattrFunc) ([]string, error) { - var p []byte // nil on first execution - - for { - n, err := listFunc(path, p) // first call gets buffer size. + buf := make([]byte, defaultXattrBufferSize) + n, err := listFunc(path, buf) + for err == unix.ERANGE { + // Buffer too small, use zero-sized buffer to get the actual size + n, err = listFunc(path, []byte{}) if err != nil { return nil, err } + buf = make([]byte, n) + n, err = listFunc(path, buf) + } + if err != nil { + return nil, err + } - if n > len(p) { - p = make([]byte, n) - continue - } - - p = p[:n] - - ps := bytes.Split(bytes.TrimSuffix(p, []byte{0}), []byte{0}) - var entries []string - for _, p := range ps { - s := string(p) - if s != "" { - entries = append(entries, s) - } + ps := bytes.Split(bytes.TrimSuffix(buf[:n], []byte{0}), []byte{0}) + var entries []string + for _, p := range ps { + if len(p) > 0 { + entries = append(entries, string(p)) } - - return entries, nil } + + return entries, nil } type getxattrFunc func(string, string, []byte) (int, error) func getxattrAll(path, attr string, getFunc getxattrFunc) ([]byte, error) { - p := make([]byte, defaultXattrBufferSize) - for { - n, err := getFunc(path, attr, p) + buf := make([]byte, defaultXattrBufferSize) + n, err := getFunc(path, attr, buf) + for err == unix.ERANGE { + // Buffer too small, use zero-sized buffer to get the actual size + n, err = getFunc(path, attr, []byte{}) if err != nil { - if errno, ok := err.(syscall.Errno); ok && errno == syscall.ERANGE { - p = make([]byte, len(p)*2) // this can't be ideal. - continue // try again! - } - return nil, err } - - // realloc to correct size and repeat - if n > len(p) { - p = make([]byte, n) - continue - } - - return p[:n], nil + buf = make([]byte, n) + n, err = getFunc(path, attr, buf) + } + if err != nil { + return nil, err } + return buf[:n], nil } diff --git a/vendor/github.com/containerd/continuity/sysx/xattr_unsupported.go b/vendor/github.com/containerd/continuity/sysx/xattr_unsupported.go index c9ef3a1d251f..f8fa8c63fbae 100644 --- a/vendor/github.com/containerd/continuity/sysx/xattr_unsupported.go +++ b/vendor/github.com/containerd/continuity/sysx/xattr_unsupported.go @@ -23,7 +23,7 @@ import ( "runtime" ) -var unsupported = errors.New("extended attributes unsupported on " + runtime.GOOS) +var errUnsupported = errors.New("extended attributes unsupported on " + runtime.GOOS) // Listxattr calls syscall listxattr and reads all content // and returns a string array @@ -33,17 +33,17 @@ func Listxattr(path string) ([]string, error) { // Removexattr calls syscall removexattr func Removexattr(path string, attr string) (err error) { - return unsupported + return errUnsupported } // Setxattr calls syscall setxattr func Setxattr(path string, attr string, data []byte, flags int) (err error) { - return unsupported + return errUnsupported } // Getxattr calls syscall getxattr func Getxattr(path, attr string) ([]byte, error) { - return []byte{}, unsupported + return []byte{}, errUnsupported } // LListxattr lists xattrs, not following symlinks @@ -53,12 +53,12 @@ func LListxattr(path string) ([]string, error) { // LRemovexattr removes an xattr, not following symlinks func LRemovexattr(path string, attr string) (err error) { - return unsupported + return errUnsupported } // LSetxattr sets an xattr, not following symlinks func LSetxattr(path string, attr string, data []byte, flags int) (err error) { - return unsupported + return errUnsupported } // LGetxattr gets an xattr, not following symlinks diff --git a/vendor/github.com/docker/docker/AUTHORS b/vendor/github.com/docker/docker/AUTHORS index c5f725bc19d3..dffacff11202 100644 --- a/vendor/github.com/docker/docker/AUTHORS +++ b/vendor/github.com/docker/docker/AUTHORS @@ -4,6 +4,7 @@ Aanand Prasad Aaron Davidson Aaron Feng +Aaron Hnatiw Aaron Huslage Aaron L. Xu Aaron Lehmann @@ -17,6 +18,7 @@ Abhishek Chanda Abhishek Sharma Abin Shahab Adam Avilla +Adam Dobrawy Adam Eijdenberg Adam Kunk Adam Miller @@ -43,6 +45,7 @@ AJ Bowen Ajey Charantimath ajneu Akash Gupta +Akhil Mohan Akihiro Matsushima Akihiro Suda Akim Demaille @@ -50,10 +53,12 @@ Akira Koyasu Akshay Karle Al Tobey alambike +Alan Hoyle Alan Scherger Alan Thompson Albert Callarisa Albert Zhang +Albin Kerouanton Alejandro González Hevia Aleksa Sarai Aleksandrs Fadins @@ -107,11 +112,13 @@ Amy Lindburg Anand Patil AnandkumarPatel Anatoly Borodin +Anca Iordache Anchal Agrawal Anda Xu Anders Janmyr Andre Dublin <81dublin@gmail.com> Andre Granovsky +Andrea Denisse Gómez Andrea Luzzardi Andrea Turli Andreas Elvers @@ -176,8 +183,10 @@ Anusha Ragunathan apocas Arash Deshmeh ArikaChen +Arko Dasgupta Arnaud Lefebvre Arnaud Porterie +Arnaud Rebillout Arthur Barr Arthur Gautier Artur Meyster @@ -210,10 +219,12 @@ Benjamin Atkin Benjamin Baker Benjamin Boudreau Benjamin Yolken +Benny Ng Benoit Chesneau Bernerd Schaefer Bernhard M. Wiedemann Bert Goethals +Bertrand Roussel Bevisy Zhang Bharath Thiruveedula Bhiraj Butala @@ -226,6 +237,7 @@ Bingshen Wang Blake Geno Boaz Shuster bobby abbott +Boqin Qin Boris Pruessmann Boshi Lian Bouke Haarsma @@ -279,6 +291,7 @@ Carl Loa Odin Carl X. Su Carlo Mion Carlos Alexandro Becker +Carlos de Paula Carlos Sanchez Carol Fager-Higgins Cary @@ -328,6 +341,7 @@ Chris Gibson Chris Khoo Chris McKinnel Chris McKinnel +Chris Price Chris Seto Chris Snow Chris St. Pierre @@ -354,7 +368,7 @@ Christopher Currie Christopher Jones Christopher Latham Christopher Rigor -Christy Perez +Christy Norman Chun Chen Ciro S. Costa Clayton Coleman @@ -374,8 +388,10 @@ Corey Farrell Cory Forsyth cressie176 CrimsonGlory +Cristian Ariza Cristian Staretu cristiano balducci +Cristina Yenyxe Gonzalez Garcia Cruceru Calin-Cristian CUI Wei Cyprian Gracz @@ -402,12 +418,14 @@ Dan Williams Dani Hodovic Dani Louca Daniel Antlinger +Daniel Black Daniel Dao Daniel Exner Daniel Farrell Daniel Garcia Daniel Gasienica Daniel Grunwell +Daniel Helfand Daniel Hiltgen Daniel J Walsh Daniel Menet @@ -417,12 +435,14 @@ Daniel Norberg Daniel Nordberg Daniel Robinson Daniel S +Daniel Sweet Daniel Von Fange Daniel Watkins Daniel X Moore Daniel YC Lin Daniel Zhang Danny Berger +Danny Milosavljevic Danny Yates Danyal Khaliq Darren Coxall @@ -487,6 +507,7 @@ Derek McGowan Deric Crago Deshi Xiao devmeyster +Devon Estes Devvyn Murphy Dharmit Shah Dhawal Yogesh Bhanushali @@ -516,6 +537,8 @@ Dmitry Smirnov Dmitry V. Krivenok Dmitry Vorobev Dolph Mathews +Dominic Tubach +Dominic Yin Dominik Dingel Dominik Finkbeiner Dominik Honnef @@ -534,7 +557,7 @@ Douglas Curtis Dr Nic Williams dragon788 Dražen Lučanin -Drew Erny +Drew Erny Drew Hubl Dustin Sallings Ed Costello @@ -584,6 +607,7 @@ Erik Weathers Erno Hopearuoho Erwin van der Koogh Ethan Bell +Ethan Mosbaugh Euan Kemp Eugen Krizo Eugene Yakubovich @@ -595,6 +619,7 @@ Evan Phoenix Evan Wies Evelyn Xu Everett Toews +Evgeniy Makhrov Evgeny Shmarnev Evgeny Vereshchagin Ewa Czechowska @@ -620,6 +645,7 @@ Fareed Dudhia Fathi Boudra Federico Gimenez Felipe Oliveira +Felipe Ruhland Felix Abecassis Felix Geisendörfer Felix Hupfeld @@ -640,6 +666,7 @@ Florian Florian Klein Florian Maier Florian Noeding +Florian Schmaus Florian Weingarten Florin Asavoaie Florin Patan @@ -654,6 +681,7 @@ Frank Groeneveld Frank Herrmann Frank Macreery Frank Rosquin +frankyang Fred Lifton Frederick F. Kautz IV Frederik Loeffert @@ -675,7 +703,7 @@ Gareth Rushgrove Garrett Barboza Gary Schaetz Gaurav -gautam, prasanna +Gaurav Singh Gaël PORTAY Genki Takiuchi GennadySpb @@ -701,11 +729,12 @@ Gleb M Borisov Glyn Normington GoBella Goffert van Gool +Goldwyn Rodrigues Gopikannan Venugopalsamy Gosuke Miyashita Gou Rao Govinda Fichtner -Grant Millar +Grant Millar Grant Reaber Graydon Hoare Greg Fausak @@ -724,14 +753,17 @@ Guruprasad Gustav Sinder gwx296173 Günter Zöchbauer +Haichao Yang haikuoliu Hakan Özler Hamish Hutchings +Hannes Ljungberg Hans Kristian Flaatten Hans Rødtang Hao Shu Wei Hao Zhang <21521210@zju.edu.cn> Harald Albers +Harald Niesche Harley Laue Harold Cooper Harrison Turton @@ -751,9 +783,13 @@ Hobofan Hollie Teal Hong Xu Hongbin Lu +Hongxu Jia +Honza Pokorny +Hsing-Hui Hsu hsinko <21551195@zju.edu.cn> Hu Keping Hu Tao +HuanHuan Ye Huanzhong Zhang Huayi Zhang Hugo Duncan @@ -790,6 +826,7 @@ Ingo Gottwald Innovimax Isaac Dupree Isabel Jimenez +Isaiah Grace Isao Jonas Iskander Sharipov Ivan Babrou @@ -805,6 +842,7 @@ Jacob Edelman Jacob Tomlinson Jacob Vallejo Jacob Wen +Jaime Cepeda Jaivish Kothari Jake Champlin Jake Moshenko @@ -819,12 +857,13 @@ James Kyburz James Kyle James Lal James Mills -James Nesbitt +James Nesbitt James Nugent James Turnbull James Watkins-Harvey Jamie Hannaford Jamshid Afshar +Jan Chren Jan Keromnes Jan Koprowski Jan Pazdziora @@ -839,6 +878,7 @@ Jared Hocutt Jaroslaw Zabiello jaseg Jasmine Hegman +Jason A. Donenfeld Jason Divock Jason Giedymin Jason Green @@ -886,7 +926,7 @@ Jeroen Franse Jeroen Jacobs Jesse Dearing Jesse Dubay -Jessica Frazelle +Jessica Frazelle Jezeniel Zapanta Jhon Honce Ji.Zhilong @@ -894,9 +934,11 @@ Jian Liao Jian Zhang Jiang Jinyang Jie Luo +Jie Ma Jihyun Hwang Jilles Oldenbeuving Jim Alateras +Jim Ehrismann Jim Galasyn Jim Minter Jim Perrin @@ -934,7 +976,7 @@ John Feminella John Gardiner Myers John Gossman John Harris -John Howard (VM) +John Howard John Laswell John Maguire John Mulhausen @@ -948,6 +990,8 @@ John Willis Jon Johnson Jon Surrell Jon Wedaman +Jonas Dohse +Jonas Heinrich Jonas Pfenniger Jonathan A. Schweder Jonathan A. Sternberg @@ -997,10 +1041,13 @@ Julien Dubois Julien Kassar Julien Maitrehenry Julien Pervillé +Julien Pivotto +Julio Guerra Julio Montes Jun-Ru Chang Jussi Nummelin Justas Brazauskas +Justen Martin Justin Cormack Justin Force Justin Menga @@ -1009,6 +1056,7 @@ Justin Simonelis Justin Terry Justyn Temme Jyrki Puttonen +Jérémy Leherpeur Jérôme Petazzoni Jörg Thalheim K. Heller @@ -1046,6 +1094,7 @@ Ken Reese Kenfe-Mickaël Laventure Kenjiro Nakayama Kent Johnson +Kenta Tada Kevin "qwazerty" Houdebert Kevin Burke Kevin Clark @@ -1056,6 +1105,7 @@ Kevin Kern Kevin Menard Kevin Meredith Kevin P. Kucharczyk +Kevin Parsons Kevin Richardson Kevin Shi Kevin Wallace @@ -1146,6 +1196,7 @@ longliqiang88 <394564827@qq.com> Lorenz Leutgeb Lorenzo Fontana Lotus Fenn +Louis Delossantos Louis Opter Luca Favatella Luca Marturana @@ -1154,9 +1205,11 @@ Luca-Bogdan Grigorescu Lucas Chan Lucas Chi Lucas Molas +Lucas Silvestre Luciano Mores Luis Martínez de Bartolomé Izquierdo Luiz Svoboda +Lukas Heeren Lukas Waslowski lukaspustina Lukasz Zajaczkowski @@ -1256,6 +1309,7 @@ Matthieu Hauglustaine Mattias Jernberg Mauricio Garavaglia mauriyouth +Max Harmathy Max Shytikov Maxim Fedchyshyn Maxim Ivanov @@ -1296,6 +1350,7 @@ Michael Stapelberg Michael Steinert Michael Thies Michael West +Michael Zhao Michal Fojtik Michal Gebauer Michal Jemala @@ -1312,6 +1367,7 @@ Miguel Morales Mihai Borobocea Mihuleacc Sergiu Mike Brown +Mike Bush Mike Casas Mike Chelen Mike Danese @@ -1380,6 +1436,7 @@ Neyazul Haque Nghia Tran Niall O'Higgins Nicholas E. Rabenau +Nick Adcock Nick DeCoursin Nick Irvine Nick Neisen @@ -1403,6 +1460,7 @@ Nik Nyby Nikhil Chawla NikolaMandic Nikolas Garofil +Nikolay Edigaryev Nikolay Milovanov Nirmal Mehta Nishant Totla @@ -1418,6 +1476,7 @@ Nuutti Kotivuori nzwsch O.S. Tezer objectified +Odin Ugedal Oguz Bilgic Oh Jinkyun Ohad Schneider @@ -1428,6 +1487,7 @@ Oliver Reason Olivier Gambier Olle Jonsson Olli Janatuinen +Olly Pomeroy Omri Shiv Oriol Francès Oskar Niburski @@ -1437,6 +1497,7 @@ Ovidio Mallo Panagiotis Moustafellos Paolo G. Giarrusso Pascal +Pascal Bach Pascal Borreli Pascal Hartig Patrick Böänziger @@ -1461,6 +1522,7 @@ Paul Nasrat Paul Weaver Paulo Ribeiro Pavel Lobashov +Pavel Matěja Pavel Pletenev Pavel Pospisil Pavel Sutyrin @@ -1572,6 +1634,7 @@ Riku Voipio Riley Guerin Ritesh H Shukla Riyaz Faizullabhoy +Rob Gulewich Rob Vesse Robert Bachmann Robert Bittle @@ -1580,11 +1643,13 @@ Robert Schneider Robert Stern Robert Terhaar Robert Wallis +Robert Wang Roberto G. Hashioka Roberto Muñoz Fernández Robin Naundorf Robin Schneider Robin Speekenbrink +Robin Thoni robpc Rodolfo Carvalho Rodrigo Vaz @@ -1599,6 +1664,7 @@ Roland Kammerer Roland Moriz Roma Sokolov Roman Dudin +Roman Mazur Roman Strashkin Ron Smits Ron Williams @@ -1618,6 +1684,7 @@ Rozhnov Alexandr Rudolph Gottesheim Rui Cao Rui Lopes +Ruilin Li Runshen Zhu Russ Magee Ryan Abrams @@ -1656,6 +1723,7 @@ Sam J Sharpe Sam Neirinck Sam Reis Sam Rijs +Sam Whited Sambuddha Basu Sami Wagiaalla Samuel Andaya @@ -1670,6 +1738,7 @@ sapphiredev Sargun Dhillon Sascha Andres Sascha Grunert +SataQiu Satnam Singh Satoshi Amemiya Satoshi Tagomori @@ -1718,6 +1787,7 @@ Shijun Qin Shishir Mahajan Shoubhik Bose Shourya Sarcar +Shu-Wai Chow shuai-z Shukui Yang Shuwei Hao @@ -1728,6 +1798,7 @@ Silas Sewell Silvan Jegen Simão Reis Simei He +Simon Barendse Simon Eskildsen Simon Ferquel Simon Leinen @@ -1736,6 +1807,7 @@ Simon Taranto Simon Vikstrom Sindhu S Sjoerd Langkemper +skanehira Solganik Alexander Solomon Hykes Song Gao @@ -1747,18 +1819,21 @@ Sridatta Thatipamala Sridhar Ratnakumar Srini Brahmaroutu Srinivasan Srivatsan +Staf Wagemakers Stanislav Bondarenko +Stanislav Levin Steeve Morin Stefan Berger Stefan J. Wernli Stefan Praszalowicz Stefan S. -Stefan Scherer +Stefan Scherer Stefan Staudenmeyer Stefan Weil Stephan Spindler +Stephen Benjamin Stephen Crosby -Stephen Day +Stephen Day Stephen Drake Stephen Rust Steve Desmond @@ -1773,10 +1848,12 @@ Steven Iveson Steven Merrill Steven Richards Steven Taylor +Stig Larsson Subhajit Ghosh Sujith Haridasan Sun Gengze <690388648@qq.com> Sun Jianbo +Sune Keller Sunny Gogoi Suryakumar Sudar Sven Dowideit @@ -1827,6 +1904,8 @@ Tianyi Wang Tibor Vass Tiffany Jernigan Tiffany Low +Till Wegmüller +Tim Tim Bart Tim Bosse Tim Dettrick @@ -1878,7 +1957,7 @@ Tony Miller toogley Torstein Husebø Tõnis Tiigi -tpng +Trace Andreason tracylihui <793912329@qq.com> Trapier Marshall Travis Cline @@ -1901,6 +1980,7 @@ Utz Bacher vagrant Vaidas Jablonskis vanderliang +Velko Ivanov Veres Lajos Victor Algaze Victor Coisne @@ -1912,11 +1992,13 @@ Victor Palma Victor Vieux Victoria Bialas Vijaya Kumar K +Vikram bir Singh Viktor Stanchev Viktor Vojnovski VinayRaghavanKS Vincent Batts Vincent Bernat +Vincent Boulineau Vincent Demeester Vincent Giersch Vincent Mayers @@ -1947,6 +2029,8 @@ Wang Long Wang Ping Wang Xing Wang Yuexiao +Wang Yumu <37442693@qq.com> +wanghuaiqing Ward Vandewege WarheadsSE Wassim Dhif @@ -1963,12 +2047,14 @@ Wen Cheng Ma Wendel Fleming Wenjun Tang Wenkai Yin +wenlxie Wentao Zhang Wenxuan Zhao Wenyu You <21551128@zju.edu.cn> Wenzhi Liang Wes Morgan Wewang Xiaorenfine +Wiktor Kwapisiewicz Will Dietz Will Rouesnel Will Weaver @@ -1979,6 +2065,8 @@ William Hubbs William Martin William Riancho William Thurston +Wilson Júnior +Wing-Kam Wong WiseTrem Wolfgang Powisch Wonjun Kim @@ -1988,6 +2076,7 @@ Xianglin Gao Xianlu Bird Xiao YongBiao XiaoBing Jiang +Xiaodong Liu Xiaodong Zhang Xiaoxi He Xiaoxu Chen @@ -1996,6 +2085,7 @@ xichengliudui <1693291525@qq.com> xiekeyang Ximo Guanter Gonzálbez Xinbo Weng +Xinfeng Liu Xinzi Zhou Xiuming Chen Xuecong Liao @@ -2010,6 +2100,7 @@ Yang Pengfei yangchenliang Yanqiang Miao Yao Zaiyong +Yash Murty Yassine Tijani Yasunori Mahata Yazhong Liu @@ -2024,6 +2115,7 @@ Yongxin Li Yongzhi Pan Yosef Fertel You-Sheng Yang (楊有勝) +youcai Youcef YEKHLEF Yu Changchun Yu Chengxia @@ -2055,11 +2147,13 @@ Zhenan Ye <21551168@zju.edu.cn> zhenghenghuo Zhenhai Gao Zhenkun Bi +zhipengzuo Zhou Hao Zhoulin Xie Zhu Guihua Zhu Kunjia Zhuoyun Wei +Ziheng Liu Zilin Du zimbatm Ziming Dong @@ -2068,12 +2162,13 @@ zmarouf Zoltan Tombol Zou Yu zqh -Zuhayr Elahi +Zuhayr Elahi Zunayed Ali Álex González Álvaro Lázaro Átila Camurça Alves 尹吉峰 +屈骏 徐俊杰 慕陶 搏通 diff --git a/vendor/github.com/docker/docker/api/common.go b/vendor/github.com/docker/docker/api/common.go index aa146cdaeb1a..1565e2af6474 100644 --- a/vendor/github.com/docker/docker/api/common.go +++ b/vendor/github.com/docker/docker/api/common.go @@ -3,7 +3,7 @@ package api // import "github.com/docker/docker/api" // Common constants for daemon and client. const ( // DefaultVersion of Current REST API - DefaultVersion = "1.40" + DefaultVersion = "1.41" // NoBaseImageSpecifier is the symbol used by the FROM // command to specify that no base image is to be used. diff --git a/vendor/github.com/docker/docker/api/swagger.yaml b/vendor/github.com/docker/docker/api/swagger.yaml index 70b09a0e3b73..8500705b563d 100644 --- a/vendor/github.com/docker/docker/api/swagger.yaml +++ b/vendor/github.com/docker/docker/api/swagger.yaml @@ -19,10 +19,10 @@ produces: consumes: - "application/json" - "text/plain" -basePath: "/v1.40" +basePath: "/v1.41" info: title: "Docker Engine API" - version: "1.40" + version: "1.41" x-logo: url: "https://docs.docker.com/images/logo-docker-main.png" description: | @@ -55,8 +55,8 @@ info: the URL is not supported by the daemon, a HTTP `400 Bad Request` error message is returned. - If you omit the version-prefix, the current version of the API (v1.40) is used. - For example, calling `/info` is the same as calling `/v1.40/info`. Using the + If you omit the version-prefix, the current version of the API (v1.41) is used. + For example, calling `/info` is the same as calling `/v1.41/info`. Using the API without a version-prefix is deprecated and will be removed in a future release. Engine releases in the near future should support this version of the API, @@ -528,7 +528,13 @@ definitions: items: $ref: "#/definitions/DeviceRequest" KernelMemory: - description: "Kernel memory limit in bytes." + description: | + Kernel memory limit in bytes. + +


+ + > **Deprecated**: This field is deprecated as the kernel 5.4 deprecated + > `kmem.limit_in_bytes`. type: "integer" format: "int64" example: 209715200 @@ -554,7 +560,7 @@ definitions: format: "int64" minimum: 0 maximum: 100 - NanoCPUs: + NanoCpus: description: "CPU quota in units of 10-9 CPUs." type: "integer" format: "int64" @@ -625,6 +631,27 @@ definitions: type: "integer" format: "int64" + Limit: + description: | + An object describing a limit on resources which can be requested by a task. + type: "object" + properties: + NanoCPUs: + type: "integer" + format: "int64" + example: 4000000000 + MemoryBytes: + type: "integer" + format: "int64" + example: 8272408576 + Pids: + description: | + Limits the maximum number of PIDs in the container. Set `0` for unlimited. + type: "integer" + format: "int64" + default: 0 + example: 100 + ResourceObject: description: | An object describing the resources which can be advertised by a node and @@ -885,15 +912,6 @@ definitions: $ref: "#/definitions/Mount" # Applicable to UNIX platforms - Capabilities: - type: "array" - description: | - A list of kernel capabilities to be available for container (this - overrides the default set). - - Conflicts with options 'CapAdd' and 'CapDrop'" - items: - type: "string" CapAdd: type: "array" description: | @@ -908,6 +926,19 @@ definitions: with option 'Capabilities'. items: type: "string" + CgroupnsMode: + type: "string" + enum: + - "private" + - "host" + description: | + cgroup namespace mode for the container. Possible values are: + + - `"private"`: the container runs in its own private cgroup namespace + - `"host"`: use the host system's cgroup namespace + + If not specified, the daemon default is used, which can either be `"private"` + or `"host"`, depending on daemon version, kernel support and configuration. Dns: type: "array" description: "A list of DNS servers for the container to use." @@ -1243,7 +1274,7 @@ definitions: type: "object" properties: Bridge: - description: Name of the network'a bridge (for example, `docker0`). + description: Name of the network's bridge (for example, `docker0`). type: "string" example: "docker0" SandboxID: @@ -3253,6 +3284,44 @@ definitions: type: "object" additionalProperties: type: "string" + # This option is not used by Windows containers + CapabilityAdd: + type: "array" + description: | + A list of kernel capabilities to add to the default set + for the container. + items: + type: "string" + example: + - "CAP_NET_RAW" + - "CAP_SYS_ADMIN" + - "CAP_SYS_CHROOT" + - "CAP_SYSLOG" + CapabilityDrop: + type: "array" + description: | + A list of kernel capabilities to drop from the default set + for the container. + items: + type: "string" + example: + - "CAP_NET_RAW" + Ulimits: + description: | + A list of resource limits to set in the container. For example: `{"Name": "nofile", "Soft": 1024, "Hard": 2048}`" + type: "array" + items: + type: "object" + properties: + Name: + description: "Name of ulimit" + type: "string" + Soft: + description: "Soft limit" + type: "integer" + Hard: + description: "Hard limit" + type: "integer" NetworkAttachmentSpec: description: | Read-only spec type for non-swarm containers attached to swarm overlay @@ -3277,7 +3346,7 @@ definitions: properties: Limits: description: "Define resources limits." - $ref: "#/definitions/ResourceObject" + $ref: "#/definitions/Limit" Reservation: description: "Define resources reservation." $ref: "#/definitions/ResourceObject" @@ -3487,6 +3556,12 @@ definitions: type: "integer" DesiredState: $ref: "#/definitions/TaskState" + JobIteration: + description: | + If the Service this Task belongs to is a job-mode service, contains + the JobIteration of the Service this Task was created for. Absent if + the Task was created for a Replicated or Global Service. + $ref: "#/definitions/ObjectVersion" example: ID: "0kzzo1i0y4jz6027t0k7aezc7" Version: @@ -3579,6 +3654,29 @@ definitions: format: "int64" Global: type: "object" + ReplicatedJob: + description: | + The mode used for services with a finite number of tasks that run + to a completed state. + type: "object" + properties: + MaxConcurrent: + description: | + The maximum number of replicas to run simultaneously. + type: "integer" + format: "int64" + default: 1 + TotalCompletions: + description: | + The total number of replicas desired to reach the Completed + state. If unset, will default to the value of `MaxConcurrent` + type: "integer" + format: "int64" + GlobalJob: + description: | + The mode used for services which run a task to the completed state + on each valid node. + type: "object" UpdateConfig: description: "Specification for the update strategy of the service." type: "object" @@ -3785,6 +3883,61 @@ definitions: format: "dateTime" Message: type: "string" + ServiceStatus: + description: | + The status of the service's tasks. Provided only when requested as + part of a ServiceList operation. + type: "object" + properties: + RunningTasks: + description: | + The number of tasks for the service currently in the Running state. + type: "integer" + format: "uint64" + example: 7 + DesiredTasks: + description: | + The number of tasks for the service desired to be running. + For replicated services, this is the replica count from the + service spec. For global services, this is computed by taking + count of all tasks for the service with a Desired State other + than Shutdown. + type: "integer" + format: "uint64" + example: 10 + CompletedTasks: + description: | + The number of tasks for a job that are in the Completed state. + This field must be cross-referenced with the service type, as the + value of 0 may mean the service is not in a job mode, or it may + mean the job-mode service has no tasks yet Completed. + type: "integer" + format: "uint64" + JobStatus: + description: | + The status of the service when it is in one of ReplicatedJob or + GlobalJob modes. Absent on Replicated and Global mode services. The + JobIteration is an ObjectVersion, but unlike the Service's version, + does not need to be sent with an update request. + type: "object" + properties: + JobIteration: + description: | + JobIteration is a value increased each time a Job is executed, + successfully or otherwise. "Executed", in this case, means the + job as a whole has been started, not that an individual Task has + been launched. A job is "Executed" when its ServiceSpec is + updated. JobIteration can be used to disambiguate Tasks belonging + to different executions of a job. Though JobIteration will + increase with each subsequent execution, it may not necessarily + increase by 1, and so JobIteration should not be used to + $ref: "#/definitions/ObjectVersion" + LastExecution: + description: | + The last time, as observed by the server, that this job was + started. + type: "string" + format: "dateTime" example: ID: "9mnpnzenvg8p8tdbtq4wvbkcz" Version: @@ -4288,44 +4441,6 @@ definitions: on Windows. type: "string" example: "/var/lib/docker" - SystemStatus: - description: | - Status information about this node (standalone Swarm API). - -


- - > **Note**: The information returned in this field is only propagated - > by the Swarm standalone API, and is empty (`null`) when using - > built-in swarm mode. - type: "array" - items: - type: "array" - items: - type: "string" - example: - - ["Role", "primary"] - - ["State", "Healthy"] - - ["Strategy", "spread"] - - ["Filters", "health, port, containerslots, dependency, affinity, constraint, whitelist"] - - ["Nodes", "2"] - - [" swarm-agent-00", "192.168.99.102:2376"] - - [" └ ID", "5CT6:FBGO:RVGO:CZL4:PB2K:WCYN:2JSV:KSHH:GGFW:QOPG:6J5Q:IOZ2|192.168.99.102:2376"] - - [" └ Status", "Healthy"] - - [" └ Containers", "1 (1 Running, 0 Paused, 0 Stopped)"] - - [" └ Reserved CPUs", "0 / 1"] - - [" └ Reserved Memory", "0 B / 1.021 GiB"] - - [" └ Labels", "kernelversion=4.4.74-boot2docker, operatingsystem=Boot2Docker 17.06.0-ce (TCL 7.2); HEAD : 0672754 - Thu Jun 29 00:06:31 UTC 2017, ostype=linux, provider=virtualbox, storagedriver=aufs"] - - [" └ UpdatedAt", "2017-08-09T10:03:46Z"] - - [" └ ServerVersion", "17.06.0-ce"] - - [" swarm-manager", "192.168.99.101:2376"] - - [" └ ID", "TAMD:7LL3:SEF7:LW2W:4Q2X:WVFH:RTXX:JSYS:XY2P:JEHL:ZMJK:JGIW|192.168.99.101:2376"] - - [" └ Status", "Healthy"] - - [" └ Containers", "2 (2 Running, 0 Paused, 0 Stopped)"] - - [" └ Reserved CPUs", "0 / 1"] - - [" └ Reserved Memory", "0 B / 1.021 GiB"] - - [" └ Labels", "kernelversion=4.4.74-boot2docker, operatingsystem=Boot2Docker 17.06.0-ce (TCL 7.2); HEAD : 0672754 - Thu Jun 29 00:06:31 UTC 2017, ostype=linux, provider=virtualbox, storagedriver=aufs"] - - [" └ UpdatedAt", "2017-08-09T10:04:11Z"] - - [" └ ServerVersion", "17.06.0-ce"] Plugins: $ref: "#/definitions/PluginsInfo" MemoryLimit: @@ -4337,7 +4452,13 @@ definitions: type: "boolean" example: true KernelMemory: - description: "Indicates if the host has kernel memory limit support enabled." + description: | + Indicates if the host has kernel memory limit support enabled. + +


+ + > **Deprecated**: This field is deprecated as the kernel 5.4 deprecated + > `kmem.limit_in_bytes`. type: "boolean" example: true CpuCfsPeriod: @@ -4420,6 +4541,13 @@ definitions: enum: ["cgroupfs", "systemd", "none"] default: "cgroupfs" example: "cgroupfs" + CgroupVersion: + description: | + The version of the cgroup. + type: "string" + enum: ["1", "2"] + default: "1" + example: "1" NEventsListener: description: "Number of event listeners subscribed." type: "integer" @@ -4439,6 +4567,17 @@ definitions: or "Windows Server 2016 Datacenter" type: "string" example: "Alpine Linux v3.5" + OSVersion: + description: | + Version of the host's operating system + +


+ + > **Note**: The information returned in this field, including its + > very existence, and the formatting of values, should not be considered + > stable, and may change without notice. + type: "string" + example: "16.04" OSType: description: | Generic type of the operating system of the host, as returned by the @@ -4555,7 +4694,7 @@ definitions:


- > **Note**: This field is only propagated when using standalone Swarm + > **Deprecated**: This field is only propagated when using standalone Swarm > mode, and overlay networking using an external k/v store. Overlay > networks with Swarm mode enabled use the built-in raft store, and > this field will be empty. @@ -4569,7 +4708,7 @@ definitions:


- > **Note**: This field is only propagated when using standalone Swarm + > **Deprecated**: This field is only propagated when using standalone Swarm > mode, and overlay networking using an external k/v store. Overlay > networks with Swarm mode enabled use the built-in raft store, and > this field will be empty. @@ -4674,6 +4813,25 @@ definitions: such as number of nodes, and expiration are included. type: "string" example: "Community Engine" + DefaultAddressPools: + description: | + List of custom default address pools for local networks, which can be + specified in the daemon.json file or dockerd option. + + Example: a Base "10.10.0.0/16" with Size 24 will define the set of 256 + 10.10.[0-255].0/24 address pools. + type: "array" + items: + type: "object" + properties: + Base: + description: "The network address in CIDR format" + type: "string" + example: "10.10.0.0/16" + Size: + description: "The network pool size" + type: "integer" + example: "24" Warnings: description: | List of warnings / informational messages about missing features, or @@ -5308,7 +5466,7 @@ paths: MemorySwap: 0 MemoryReservation: 0 KernelMemory: 0 - NanoCPUs: 500000 + NanoCpus: 500000 CpuPercent: 80 CpuShares: 512 CpuPeriod: 100000 @@ -5482,9 +5640,6 @@ paths: type: "string" LogPath: type: "string" - Node: - description: "TODO" - type: "object" Name: type: "string" RestartCount: @@ -5971,6 +6126,12 @@ paths: nil then for compatibility with older daemons the length of the corresponding `cpu_usage.percpu_usage` array should be used. + On a cgroup v2 host, the following fields are not set + * `blkio_stats`: all fields other than `io_service_bytes_recursive` + * `cpu_stats`: `cpu_usage.percpu_usage` + * `memory_stats`: `max_usage` and `failcnt` + Also, `memory_stats.stats` fields are incompatible with cgroup v1. + To calculate the values shown by the `stats` command of the docker cli tool the following formulas can be used: * used_memory = `memory_stats.usage - memory_stats.stats.cache` @@ -6103,6 +6264,13 @@ paths: it will disconnect. type: "boolean" default: true + - name: "one-shot" + in: "query" + description: | + Only get a single stat instead of waiting for 2 cycles. Must be used + with `stream=false`. + type: "boolean" + default: false tags: ["Container"] /containers/{id}/resize: post: @@ -6755,7 +6923,7 @@ paths: type: "string" - name: "v" in: "query" - description: "Remove the volumes associated with the container." + description: "Remove anonymous volumes associated with the container." type: "boolean" default: false - name: "force" @@ -7142,7 +7310,7 @@ paths: For example, the build arg `FOO=bar` would become `{"FOO":"bar"}` in JSON. This would result in the - the query parameter `buildargs={"FOO":"bar"}`. Note that `{"FOO":"bar"}` should be URI component encoded. + query parameter `buildargs={"FOO":"bar"}`. Note that `{"FOO":"bar"}` should be URI component encoded. [Read more about the buildargs instruction.](https://docs.docker.com/engine/reference/builder/#arg) @@ -7855,7 +8023,7 @@ paths: API-Version: type: "string" description: "Max API Version the server supports" - BuildKit-Version: + Builder-Version: type: "string" description: "Default version of docker image builder" Docker-Experimental: @@ -7894,7 +8062,7 @@ paths: API-Version: type: "string" description: "Max API Version the server supports" - BuildKit-Version: + Builder-Version: type: "string" description: "Default version of docker image builder" Docker-Experimental: @@ -7979,13 +8147,13 @@ paths: Various objects within Docker report events when something happens to them. - Containers report these events: `attach`, `commit`, `copy`, `create`, `destroy`, `detach`, `die`, `exec_create`, `exec_detach`, `exec_start`, `exec_die`, `export`, `health_status`, `kill`, `oom`, `pause`, `rename`, `resize`, `restart`, `start`, `stop`, `top`, `unpause`, and `update` + Containers report these events: `attach`, `commit`, `copy`, `create`, `destroy`, `detach`, `die`, `exec_create`, `exec_detach`, `exec_start`, `exec_die`, `export`, `health_status`, `kill`, `oom`, `pause`, `rename`, `resize`, `restart`, `start`, `stop`, `top`, `unpause`, `update`, and `prune` - Images report these events: `delete`, `import`, `load`, `pull`, `push`, `save`, `tag`, and `untag` + Images report these events: `delete`, `import`, `load`, `pull`, `push`, `save`, `tag`, `untag`, and `prune` - Volumes report these events: `create`, `mount`, `unmount`, and `destroy` + Volumes report these events: `create`, `mount`, `unmount`, `destroy`, and `prune` - Networks report these events: `create`, `connect`, `disconnect`, `destroy`, `update`, and `remove` + Networks report these events: `create`, `connect`, `disconnect`, `destroy`, `update`, `remove`, and `prune` The Docker daemon reports these events: `reload` @@ -7997,6 +8165,8 @@ paths: Configs report these events: `create`, `update`, and `remove` + The Builder reports `prune` events + operationId: "SystemEvents" produces: - "application/json" @@ -9880,7 +10050,7 @@ paths: description: | Address or interface to use for data path traffic (format: ``), for example, `192.168.1.1`, or an interface, - like `eth0`. If `DataPathAddr` is unspecified, the same addres + like `eth0`. If `DataPathAddr` is unspecified, the same address as `AdvertiseAddr` is used. The `DataPathAddr` specifies the address that global scope @@ -10071,6 +10241,11 @@ paths: - `label=` - `mode=["replicated"|"global"]` - `name=` + - name: "status" + in: "query" + type: "boolean" + description: | + Include service status, with count of running and desired tasks. tags: ["Service"] /services/create: post: diff --git a/vendor/github.com/docker/docker/api/types/client.go b/vendor/github.com/docker/docker/api/types/client.go index fe90617eec35..9c464b73e25d 100644 --- a/vendor/github.com/docker/docker/api/types/client.go +++ b/vendor/github.com/docker/docker/api/types/client.go @@ -205,7 +205,7 @@ const ( // BuilderV1 is the first generation builder in docker daemon BuilderV1 BuilderVersion = "1" // BuilderBuildKit is builder based on moby/buildkit project - BuilderBuildKit = "2" + BuilderBuildKit BuilderVersion = "2" ) // ImageBuildResponse holds information @@ -265,7 +265,7 @@ type ImagePullOptions struct { // if the privilege request fails. type RequestPrivilegeFunc func() (string, error) -//ImagePushOptions holds information to push images. +// ImagePushOptions holds information to push images. type ImagePushOptions ImagePullOptions // ImageRemoveOptions holds parameters to remove images. @@ -363,6 +363,10 @@ type ServiceUpdateOptions struct { // ServiceListOptions holds parameters to list services with. type ServiceListOptions struct { Filters filters.Args + + // Status indicates whether the server should include the service task + // count of running and desired tasks. + Status bool } // ServiceInspectOptions holds parameters related to the "service inspect" diff --git a/vendor/github.com/docker/docker/api/types/configs.go b/vendor/github.com/docker/docker/api/types/configs.go index 178e911a7afc..3dd133a3a58a 100644 --- a/vendor/github.com/docker/docker/api/types/configs.go +++ b/vendor/github.com/docker/docker/api/types/configs.go @@ -3,6 +3,7 @@ package types // import "github.com/docker/docker/api/types" import ( "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/network" + specs "github.com/opencontainers/image-spec/specs-go/v1" ) // configs holds structs used for internal communication between the @@ -15,6 +16,7 @@ type ContainerCreateConfig struct { Config *container.Config HostConfig *container.HostConfig NetworkingConfig *network.NetworkingConfig + Platform *specs.Platform AdjustCPUShares bool } diff --git a/vendor/github.com/docker/docker/api/types/container/container_changes.go b/vendor/github.com/docker/docker/api/types/container/container_changes.go index 222d141007ec..16dd5019eef8 100644 --- a/vendor/github.com/docker/docker/api/types/container/container_changes.go +++ b/vendor/github.com/docker/docker/api/types/container/container_changes.go @@ -1,8 +1,7 @@ package container // import "github.com/docker/docker/api/types/container" // ---------------------------------------------------------------------------- -// DO NOT EDIT THIS FILE -// This file was generated by `swagger generate operation` +// Code generated by `swagger generate operation`. DO NOT EDIT. // // See hack/generate-swagger-api.sh // ---------------------------------------------------------------------------- diff --git a/vendor/github.com/docker/docker/api/types/container/container_create.go b/vendor/github.com/docker/docker/api/types/container/container_create.go index 1ec9c3728ba8..d0c852f84d5c 100644 --- a/vendor/github.com/docker/docker/api/types/container/container_create.go +++ b/vendor/github.com/docker/docker/api/types/container/container_create.go @@ -1,8 +1,7 @@ package container // import "github.com/docker/docker/api/types/container" // ---------------------------------------------------------------------------- -// DO NOT EDIT THIS FILE -// This file was generated by `swagger generate operation` +// Code generated by `swagger generate operation`. DO NOT EDIT. // // See hack/generate-swagger-api.sh // ---------------------------------------------------------------------------- diff --git a/vendor/github.com/docker/docker/api/types/container/container_top.go b/vendor/github.com/docker/docker/api/types/container/container_top.go index bd34cd6b6928..63381da36749 100644 --- a/vendor/github.com/docker/docker/api/types/container/container_top.go +++ b/vendor/github.com/docker/docker/api/types/container/container_top.go @@ -1,8 +1,7 @@ package container // import "github.com/docker/docker/api/types/container" // ---------------------------------------------------------------------------- -// DO NOT EDIT THIS FILE -// This file was generated by `swagger generate operation` +// Code generated by `swagger generate operation`. DO NOT EDIT. // // See hack/generate-swagger-api.sh // ---------------------------------------------------------------------------- diff --git a/vendor/github.com/docker/docker/api/types/container/container_update.go b/vendor/github.com/docker/docker/api/types/container/container_update.go index 33addedf7791..c10f175ea82f 100644 --- a/vendor/github.com/docker/docker/api/types/container/container_update.go +++ b/vendor/github.com/docker/docker/api/types/container/container_update.go @@ -1,8 +1,7 @@ package container // import "github.com/docker/docker/api/types/container" // ---------------------------------------------------------------------------- -// DO NOT EDIT THIS FILE -// This file was generated by `swagger generate operation` +// Code generated by `swagger generate operation`. DO NOT EDIT. // // See hack/generate-swagger-api.sh // ---------------------------------------------------------------------------- diff --git a/vendor/github.com/docker/docker/api/types/container/container_wait.go b/vendor/github.com/docker/docker/api/types/container/container_wait.go index 94b6a20e159b..49e05ae66944 100644 --- a/vendor/github.com/docker/docker/api/types/container/container_wait.go +++ b/vendor/github.com/docker/docker/api/types/container/container_wait.go @@ -1,8 +1,7 @@ package container // import "github.com/docker/docker/api/types/container" // ---------------------------------------------------------------------------- -// DO NOT EDIT THIS FILE -// This file was generated by `swagger generate operation` +// Code generated by `swagger generate operation`. DO NOT EDIT. // // See hack/generate-swagger-api.sh // ---------------------------------------------------------------------------- diff --git a/vendor/github.com/docker/docker/api/types/container/host_config.go b/vendor/github.com/docker/docker/api/types/container/host_config.go index c3de3d976a57..2d1cbaa9abd9 100644 --- a/vendor/github.com/docker/docker/api/types/container/host_config.go +++ b/vendor/github.com/docker/docker/api/types/container/host_config.go @@ -7,9 +7,32 @@ import ( "github.com/docker/docker/api/types/mount" "github.com/docker/docker/api/types/strslice" "github.com/docker/go-connections/nat" - "github.com/docker/go-units" + units "github.com/docker/go-units" ) +// CgroupnsMode represents the cgroup namespace mode of the container +type CgroupnsMode string + +// IsPrivate indicates whether the container uses its own private cgroup namespace +func (c CgroupnsMode) IsPrivate() bool { + return c == "private" +} + +// IsHost indicates whether the container shares the host's cgroup namespace +func (c CgroupnsMode) IsHost() bool { + return c == "host" +} + +// IsEmpty indicates whether the container cgroup namespace mode is unset +func (c CgroupnsMode) IsEmpty() bool { + return c == "" +} + +// Valid indicates whether the cgroup namespace mode is valid +func (c CgroupnsMode) Valid() bool { + return c.IsEmpty() || c.IsPrivate() || c.IsHost() +} + // Isolation represents the isolation technology of a container. The supported // values are platform specific type Isolation string @@ -122,7 +145,7 @@ func (n NetworkMode) ConnectedContainer() string { return "" } -//UserDefined indicates user-created network +// UserDefined indicates user-created network func (n NetworkMode) UserDefined() string { if n.IsUserDefined() { return string(n) @@ -338,7 +361,7 @@ type Resources struct { Devices []DeviceMapping // List of devices to map inside the container DeviceCgroupRules []string // List of rule to be added to the device cgroup DeviceRequests []DeviceRequest // List of device requests for device drivers - KernelMemory int64 // Kernel memory limit (in bytes) + KernelMemory int64 // Kernel memory limit (in bytes), Deprecated: kernel 5.4 deprecated kmem.limit_in_bytes KernelMemoryTCP int64 // Hard limit for kernel TCP buffer memory (in bytes) MemoryReservation int64 // Memory soft limit (in bytes) MemorySwap int64 // Total memory usage (memory + swap); set `-1` to enable unlimited swap @@ -380,10 +403,10 @@ type HostConfig struct { // Applicable to UNIX platforms CapAdd strslice.StrSlice // List of kernel capabilities to add to the container CapDrop strslice.StrSlice // List of kernel capabilities to remove from the container - Capabilities []string `json:"Capabilities"` // List of kernel capabilities to be available for container (this overrides the default set) - DNS []string `json:"Dns"` // List of DNS server to lookup - DNSOptions []string `json:"DnsOptions"` // List of DNSOption to look for - DNSSearch []string `json:"DnsSearch"` // List of DNSSearch to look for + CgroupnsMode CgroupnsMode // Cgroup namespace mode to use for the container + DNS []string `json:"Dns"` // List of DNS server to lookup + DNSOptions []string `json:"DnsOptions"` // List of DNSOption to look for + DNSSearch []string `json:"DnsSearch"` // List of DNSSearch to look for ExtraHosts []string // List of extra hosts GroupAdd []string // List of additional groups that the container process will run as IpcMode IpcMode // IPC namespace to use for the container diff --git a/vendor/github.com/docker/docker/api/types/error_response_ext.go b/vendor/github.com/docker/docker/api/types/error_response_ext.go new file mode 100644 index 000000000000..f84f034cd545 --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/error_response_ext.go @@ -0,0 +1,6 @@ +package types + +// Error returns the error message +func (e ErrorResponse) Error() string { + return e.Message +} diff --git a/vendor/github.com/docker/docker/api/types/events/events.go b/vendor/github.com/docker/docker/api/types/events/events.go index 027c6edb7223..aa8fba815484 100644 --- a/vendor/github.com/docker/docker/api/types/events/events.go +++ b/vendor/github.com/docker/docker/api/types/events/events.go @@ -1,6 +1,8 @@ package events // import "github.com/docker/docker/api/types/events" const ( + // BuilderEventType is the event type that the builder generates + BuilderEventType = "builder" // ContainerEventType is the event type that containers generate ContainerEventType = "container" // DaemonEventType is the event type that daemon generate diff --git a/vendor/github.com/docker/docker/api/types/filters/parse.go b/vendor/github.com/docker/docker/api/types/filters/parse.go index 0bd2e1e1853b..4bc91cffd6e5 100644 --- a/vendor/github.com/docker/docker/api/types/filters/parse.go +++ b/vendor/github.com/docker/docker/api/types/filters/parse.go @@ -66,7 +66,7 @@ func ToJSON(a Args) (string, error) { // then the encoded format will use an older legacy format where the values are a // list of strings, instead of a set. // -// Deprecated: Use ToJSON +// Deprecated: do not use in any new code; use ToJSON instead func ToParamWithVersion(version string, a Args) (string, error) { if a.Len() == 0 { return "", nil @@ -154,7 +154,7 @@ func (args Args) Len() int { func (args Args) MatchKVList(key string, sources map[string]string) bool { fieldValues := args.fields[key] - //do not filter if there is no filter set or cannot determine filter + // do not filter if there is no filter set or cannot determine filter if len(fieldValues) == 0 { return true } @@ -200,7 +200,7 @@ func (args Args) Match(field, source string) bool { // ExactMatch returns true if the source matches exactly one of the values. func (args Args) ExactMatch(key, source string) bool { fieldValues, ok := args.fields[key] - //do not filter if there is no filter set or cannot determine filter + // do not filter if there is no filter set or cannot determine filter if !ok || len(fieldValues) == 0 { return true } @@ -213,7 +213,7 @@ func (args Args) ExactMatch(key, source string) bool { // matches exactly the value. func (args Args) UniqueExactMatch(key, source string) bool { fieldValues := args.fields[key] - //do not filter if there is no filter set or cannot determine filter + // do not filter if there is no filter set or cannot determine filter if len(fieldValues) == 0 { return true } diff --git a/vendor/github.com/docker/docker/api/types/image/image_history.go b/vendor/github.com/docker/docker/api/types/image/image_history.go index b5a7a0c4901b..e302bb0aebbe 100644 --- a/vendor/github.com/docker/docker/api/types/image/image_history.go +++ b/vendor/github.com/docker/docker/api/types/image/image_history.go @@ -1,8 +1,7 @@ package image // import "github.com/docker/docker/api/types/image" // ---------------------------------------------------------------------------- -// DO NOT EDIT THIS FILE -// This file was generated by `swagger generate operation` +// Code generated by `swagger generate operation`. DO NOT EDIT. // // See hack/generate-swagger-api.sh // ---------------------------------------------------------------------------- diff --git a/vendor/github.com/docker/docker/api/types/mount/mount.go b/vendor/github.com/docker/docker/api/types/mount/mount.go index ab4446b38f6c..443b8d07a9f3 100644 --- a/vendor/github.com/docker/docker/api/types/mount/mount.go +++ b/vendor/github.com/docker/docker/api/types/mount/mount.go @@ -113,7 +113,7 @@ type TmpfsOptions struct { // TODO(stevvooe): There are several more tmpfs flags, specified in the // daemon, that are accepted. Only the most basic are added for now. // - // From docker/docker/pkg/mount/flags.go: + // From https://github.com/moby/sys/blob/mount/v0.1.1/mount/flags.go#L47-L56 // // var validFlags = map[string]bool{ // "": true, diff --git a/vendor/github.com/docker/docker/api/types/network/network.go b/vendor/github.com/docker/docker/api/types/network/network.go index 71e97338fdc8..437b184c67b5 100644 --- a/vendor/github.com/docker/docker/api/types/network/network.go +++ b/vendor/github.com/docker/docker/api/types/network/network.go @@ -1,7 +1,6 @@ package network // import "github.com/docker/docker/api/types/network" import ( "github.com/docker/docker/api/types/filters" - "github.com/docker/docker/errdefs" ) // Address represents an IP address @@ -13,7 +12,7 @@ type Address struct { // IPAM represents IP Address Management type IPAM struct { Driver string - Options map[string]string //Per network IPAM driver options + Options map[string]string // Per network IPAM driver options Config []IPAMConfig } @@ -123,5 +122,5 @@ var acceptedFilters = map[string]bool{ // ValidateFilters validates the list of filter args with the available filters. func ValidateFilters(filter filters.Args) error { - return errdefs.InvalidParameter(filter.Validate(acceptedFilters)) + return filter.Validate(acceptedFilters) } diff --git a/vendor/github.com/docker/docker/api/types/registry/registry.go b/vendor/github.com/docker/docker/api/types/registry/registry.go index 8789ad3b3210..53e47084c8d5 100644 --- a/vendor/github.com/docker/docker/api/types/registry/registry.go +++ b/vendor/github.com/docker/docker/api/types/registry/registry.go @@ -4,7 +4,7 @@ import ( "encoding/json" "net" - "github.com/opencontainers/image-spec/specs-go/v1" + v1 "github.com/opencontainers/image-spec/specs-go/v1" ) // ServiceConfig stores daemon registry services configuration. diff --git a/vendor/github.com/docker/docker/api/types/seccomp.go b/vendor/github.com/docker/docker/api/types/seccomp.go deleted file mode 100644 index 2259c6be1e65..000000000000 --- a/vendor/github.com/docker/docker/api/types/seccomp.go +++ /dev/null @@ -1,94 +0,0 @@ -package types // import "github.com/docker/docker/api/types" - -// Seccomp represents the config for a seccomp profile for syscall restriction. -type Seccomp struct { - DefaultAction Action `json:"defaultAction"` - // Architectures is kept to maintain backward compatibility with the old - // seccomp profile. - Architectures []Arch `json:"architectures,omitempty"` - ArchMap []Architecture `json:"archMap,omitempty"` - Syscalls []*Syscall `json:"syscalls"` -} - -// Architecture is used to represent a specific architecture -// and its sub-architectures -type Architecture struct { - Arch Arch `json:"architecture"` - SubArches []Arch `json:"subArchitectures"` -} - -// Arch used for architectures -type Arch string - -// Additional architectures permitted to be used for system calls -// By default only the native architecture of the kernel is permitted -const ( - ArchX86 Arch = "SCMP_ARCH_X86" - ArchX86_64 Arch = "SCMP_ARCH_X86_64" - ArchX32 Arch = "SCMP_ARCH_X32" - ArchARM Arch = "SCMP_ARCH_ARM" - ArchAARCH64 Arch = "SCMP_ARCH_AARCH64" - ArchMIPS Arch = "SCMP_ARCH_MIPS" - ArchMIPS64 Arch = "SCMP_ARCH_MIPS64" - ArchMIPS64N32 Arch = "SCMP_ARCH_MIPS64N32" - ArchMIPSEL Arch = "SCMP_ARCH_MIPSEL" - ArchMIPSEL64 Arch = "SCMP_ARCH_MIPSEL64" - ArchMIPSEL64N32 Arch = "SCMP_ARCH_MIPSEL64N32" - ArchPPC Arch = "SCMP_ARCH_PPC" - ArchPPC64 Arch = "SCMP_ARCH_PPC64" - ArchPPC64LE Arch = "SCMP_ARCH_PPC64LE" - ArchS390 Arch = "SCMP_ARCH_S390" - ArchS390X Arch = "SCMP_ARCH_S390X" -) - -// Action taken upon Seccomp rule match -type Action string - -// Define actions for Seccomp rules -const ( - ActKill Action = "SCMP_ACT_KILL" - ActTrap Action = "SCMP_ACT_TRAP" - ActErrno Action = "SCMP_ACT_ERRNO" - ActTrace Action = "SCMP_ACT_TRACE" - ActAllow Action = "SCMP_ACT_ALLOW" -) - -// Operator used to match syscall arguments in Seccomp -type Operator string - -// Define operators for syscall arguments in Seccomp -const ( - OpNotEqual Operator = "SCMP_CMP_NE" - OpLessThan Operator = "SCMP_CMP_LT" - OpLessEqual Operator = "SCMP_CMP_LE" - OpEqualTo Operator = "SCMP_CMP_EQ" - OpGreaterEqual Operator = "SCMP_CMP_GE" - OpGreaterThan Operator = "SCMP_CMP_GT" - OpMaskedEqual Operator = "SCMP_CMP_MASKED_EQ" -) - -// Arg used for matching specific syscall arguments in Seccomp -type Arg struct { - Index uint `json:"index"` - Value uint64 `json:"value"` - ValueTwo uint64 `json:"valueTwo"` - Op Operator `json:"op"` -} - -// Filter is used to conditionally apply Seccomp rules -type Filter struct { - Caps []string `json:"caps,omitempty"` - Arches []string `json:"arches,omitempty"` - MinKernel string `json:"minKernel,omitempty"` -} - -// Syscall is used to match a group of syscalls in Seccomp -type Syscall struct { - Name string `json:"name,omitempty"` - Names []string `json:"names,omitempty"` - Action Action `json:"action"` - Args []*Arg `json:"args"` - Comment string `json:"comment"` - Includes Filter `json:"includes"` - Excludes Filter `json:"excludes"` -} diff --git a/vendor/github.com/docker/docker/api/types/swarm/container.go b/vendor/github.com/docker/docker/api/types/swarm/container.go index 48190c1762f1..af5e1c0bc279 100644 --- a/vendor/github.com/docker/docker/api/types/swarm/container.go +++ b/vendor/github.com/docker/docker/api/types/swarm/container.go @@ -5,6 +5,7 @@ import ( "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/mount" + "github.com/docker/go-units" ) // DNSConfig specifies DNS related configurations in resolver configuration file (resolv.conf) @@ -67,10 +68,13 @@ type ContainerSpec struct { // The format of extra hosts on swarmkit is specified in: // http://man7.org/linux/man-pages/man5/hosts.5.html // IP_address canonical_hostname [aliases...] - Hosts []string `json:",omitempty"` - DNSConfig *DNSConfig `json:",omitempty"` - Secrets []*SecretReference `json:",omitempty"` - Configs []*ConfigReference `json:",omitempty"` - Isolation container.Isolation `json:",omitempty"` - Sysctls map[string]string `json:",omitempty"` + Hosts []string `json:",omitempty"` + DNSConfig *DNSConfig `json:",omitempty"` + Secrets []*SecretReference `json:",omitempty"` + Configs []*ConfigReference `json:",omitempty"` + Isolation container.Isolation `json:",omitempty"` + Sysctls map[string]string `json:",omitempty"` + CapabilityAdd []string `json:",omitempty"` + CapabilityDrop []string `json:",omitempty"` + Ulimits []*units.Ulimit `json:",omitempty"` } diff --git a/vendor/github.com/docker/docker/api/types/swarm/runtime/plugin.pb.go b/vendor/github.com/docker/docker/api/types/swarm/runtime/plugin.pb.go index 1fdc9b043613..e45045866a6e 100644 --- a/vendor/github.com/docker/docker/api/types/swarm/runtime/plugin.pb.go +++ b/vendor/github.com/docker/docker/api/types/swarm/runtime/plugin.pb.go @@ -1,6 +1,5 @@ -// Code generated by protoc-gen-gogo. +// Code generated by protoc-gen-gogo. DO NOT EDIT. // source: plugin.proto -// DO NOT EDIT! /* Package runtime is a generated protocol buffer package. @@ -38,6 +37,7 @@ type PluginSpec struct { Remote string `protobuf:"bytes,2,opt,name=remote,proto3" json:"remote,omitempty"` Privileges []*PluginPrivilege `protobuf:"bytes,3,rep,name=privileges" json:"privileges,omitempty"` Disabled bool `protobuf:"varint,4,opt,name=disabled,proto3" json:"disabled,omitempty"` + Env []string `protobuf:"bytes,5,rep,name=env" json:"env,omitempty"` } func (m *PluginSpec) Reset() { *m = PluginSpec{} } @@ -73,6 +73,13 @@ func (m *PluginSpec) GetDisabled() bool { return false } +func (m *PluginSpec) GetEnv() []string { + if m != nil { + return m.Env + } + return nil +} + // PluginPrivilege describes a permission the user has to accept // upon installing a plugin. type PluginPrivilege struct { @@ -160,6 +167,21 @@ func (m *PluginSpec) MarshalTo(dAtA []byte) (int, error) { } i++ } + if len(m.Env) > 0 { + for _, s := range m.Env { + dAtA[i] = 0x2a + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } return i, nil } @@ -208,24 +230,6 @@ func (m *PluginPrivilege) MarshalTo(dAtA []byte) (int, error) { return i, nil } -func encodeFixed64Plugin(dAtA []byte, offset int, v uint64) int { - dAtA[offset] = uint8(v) - dAtA[offset+1] = uint8(v >> 8) - dAtA[offset+2] = uint8(v >> 16) - dAtA[offset+3] = uint8(v >> 24) - dAtA[offset+4] = uint8(v >> 32) - dAtA[offset+5] = uint8(v >> 40) - dAtA[offset+6] = uint8(v >> 48) - dAtA[offset+7] = uint8(v >> 56) - return offset + 8 -} -func encodeFixed32Plugin(dAtA []byte, offset int, v uint32) int { - dAtA[offset] = uint8(v) - dAtA[offset+1] = uint8(v >> 8) - dAtA[offset+2] = uint8(v >> 16) - dAtA[offset+3] = uint8(v >> 24) - return offset + 4 -} func encodeVarintPlugin(dAtA []byte, offset int, v uint64) int { for v >= 1<<7 { dAtA[offset] = uint8(v&0x7f | 0x80) @@ -255,6 +259,12 @@ func (m *PluginSpec) Size() (n int) { if m.Disabled { n += 2 } + if len(m.Env) > 0 { + for _, s := range m.Env { + l = len(s) + n += 1 + l + sovPlugin(uint64(l)) + } + } return n } @@ -429,6 +439,35 @@ func (m *PluginSpec) Unmarshal(dAtA []byte) error { } } m.Disabled = bool(v != 0) + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Env", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPlugin + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthPlugin + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Env = append(m.Env, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipPlugin(dAtA[iNdEx:]) @@ -695,18 +734,21 @@ var ( func init() { proto.RegisterFile("plugin.proto", fileDescriptorPlugin) } var fileDescriptorPlugin = []byte{ - // 196 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0xe2, 0x29, 0xc8, 0x29, 0x4d, - 0xcf, 0xcc, 0xd3, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x57, 0x6a, 0x63, 0xe4, 0xe2, 0x0a, 0x00, 0x0b, - 0x04, 0x17, 0xa4, 0x26, 0x0b, 0x09, 0x71, 0xb1, 0xe4, 0x25, 0xe6, 0xa6, 0x4a, 0x30, 0x2a, 0x30, - 0x6a, 0x70, 0x06, 0x81, 0xd9, 0x42, 0x62, 0x5c, 0x6c, 0x45, 0xa9, 0xb9, 0xf9, 0x25, 0xa9, 0x12, - 0x4c, 0x60, 0x51, 0x28, 0x4f, 0xc8, 0x80, 0x8b, 0xab, 0xa0, 0x28, 0xb3, 0x2c, 0x33, 0x27, 0x35, - 0x3d, 0xb5, 0x58, 0x82, 0x59, 0x81, 0x59, 0x83, 0xdb, 0x48, 0x40, 0x0f, 0x62, 0x58, 0x00, 0x4c, - 0x22, 0x08, 0x49, 0x8d, 0x90, 0x14, 0x17, 0x47, 0x4a, 0x66, 0x71, 0x62, 0x52, 0x4e, 0x6a, 0x8a, - 0x04, 0x8b, 0x02, 0xa3, 0x06, 0x47, 0x10, 0x9c, 0xaf, 0x14, 0xcb, 0xc5, 0x8f, 0xa6, 0x15, 0xab, - 0x63, 0x14, 0xb8, 0xb8, 0x53, 0x52, 0x8b, 0x93, 0x8b, 0x32, 0x0b, 0x4a, 0x32, 0xf3, 0xf3, 0xa0, - 0x2e, 0x42, 0x16, 0x12, 0x12, 0xe1, 0x62, 0x2d, 0x4b, 0xcc, 0x29, 0x4d, 0x05, 0xbb, 0x88, 0x33, - 0x08, 0xc2, 0x71, 0xe2, 0x39, 0xf1, 0x48, 0x8e, 0xf1, 0xc2, 0x23, 0x39, 0xc6, 0x07, 0x8f, 0xe4, - 0x18, 0x93, 0xd8, 0xc0, 0x9e, 0x37, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0xb8, 0x84, 0xad, 0x79, - 0x0c, 0x01, 0x00, 0x00, + // 256 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x90, 0x4d, 0x4b, 0xc3, 0x30, + 0x18, 0xc7, 0x89, 0xdd, 0xc6, 0xfa, 0x4c, 0x70, 0x04, 0x91, 0xe2, 0xa1, 0x94, 0x9d, 0x7a, 0x6a, + 0x45, 0x2f, 0x82, 0x37, 0x0f, 0x9e, 0x47, 0xbc, 0x09, 0x1e, 0xd2, 0xf6, 0xa1, 0x06, 0x9b, 0x17, + 0x92, 0xb4, 0xe2, 0x37, 0xf1, 0x23, 0x79, 0xf4, 0x23, 0x48, 0x3f, 0x89, 0x98, 0x75, 0x32, 0x64, + 0xa7, 0xff, 0x4b, 0xc2, 0x9f, 0x1f, 0x0f, 0x9c, 0x9a, 0xae, 0x6f, 0x85, 0x2a, 0x8c, 0xd5, 0x5e, + 0x6f, 0x3e, 0x08, 0xc0, 0x36, 0x14, 0x8f, 0x06, 0x6b, 0x4a, 0x61, 0xa6, 0xb8, 0xc4, 0x84, 0x64, + 0x24, 0x8f, 0x59, 0xf0, 0xf4, 0x02, 0x16, 0x16, 0xa5, 0xf6, 0x98, 0x9c, 0x84, 0x76, 0x4a, 0xf4, + 0x0a, 0xc0, 0x58, 0x31, 0x88, 0x0e, 0x5b, 0x74, 0x49, 0x94, 0x45, 0xf9, 0xea, 0x7a, 0x5d, 0xec, + 0xc6, 0xb6, 0xfb, 0x07, 0x76, 0xf0, 0x87, 0x5e, 0xc2, 0xb2, 0x11, 0x8e, 0x57, 0x1d, 0x36, 0xc9, + 0x2c, 0x23, 0xf9, 0x92, 0xfd, 0x65, 0xba, 0x86, 0x08, 0xd5, 0x90, 0xcc, 0xb3, 0x28, 0x8f, 0xd9, + 0xaf, 0xdd, 0x3c, 0xc3, 0xd9, 0xbf, 0xb1, 0xa3, 0x78, 0x19, 0xac, 0x1a, 0x74, 0xb5, 0x15, 0xc6, + 0x0b, 0xad, 0x26, 0xc6, 0xc3, 0x8a, 0x9e, 0xc3, 0x7c, 0xe0, 0x5d, 0x8f, 0x81, 0x31, 0x66, 0xbb, + 0x70, 0xff, 0xf0, 0x39, 0xa6, 0xe4, 0x6b, 0x4c, 0xc9, 0xf7, 0x98, 0x92, 0xa7, 0xdb, 0x56, 0xf8, + 0x97, 0xbe, 0x2a, 0x6a, 0x2d, 0xcb, 0x46, 0xd7, 0xaf, 0x68, 0xf7, 0xc2, 0x8d, 0x28, 0xfd, 0xbb, + 0x41, 0x57, 0xba, 0x37, 0x6e, 0x65, 0x69, 0x7b, 0xe5, 0x85, 0xc4, 0xbb, 0x49, 0xab, 0x45, 0x38, + 0xe4, 0xcd, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x99, 0xa8, 0xd9, 0x9b, 0x58, 0x01, 0x00, 0x00, } diff --git a/vendor/github.com/docker/docker/api/types/swarm/runtime/plugin.proto b/vendor/github.com/docker/docker/api/types/swarm/runtime/plugin.proto index 6d63b7783fd9..9ef169046b4f 100644 --- a/vendor/github.com/docker/docker/api/types/swarm/runtime/plugin.proto +++ b/vendor/github.com/docker/docker/api/types/swarm/runtime/plugin.proto @@ -9,6 +9,7 @@ message PluginSpec { string remote = 2; repeated PluginPrivilege privileges = 3; bool disabled = 4; + repeated string env = 5; } // PluginPrivilege describes a permission the user has to accept diff --git a/vendor/github.com/docker/docker/api/types/swarm/service.go b/vendor/github.com/docker/docker/api/types/swarm/service.go index abf192e75941..6eb452d24d12 100644 --- a/vendor/github.com/docker/docker/api/types/swarm/service.go +++ b/vendor/github.com/docker/docker/api/types/swarm/service.go @@ -10,6 +10,17 @@ type Service struct { PreviousSpec *ServiceSpec `json:",omitempty"` Endpoint Endpoint `json:",omitempty"` UpdateStatus *UpdateStatus `json:",omitempty"` + + // ServiceStatus is an optional, extra field indicating the number of + // desired and running tasks. It is provided primarily as a shortcut to + // calculating these values client-side, which otherwise would require + // listing all tasks for a service, an operation that could be + // computation and network expensive. + ServiceStatus *ServiceStatus `json:",omitempty"` + + // JobStatus is the status of a Service which is in one of ReplicatedJob or + // GlobalJob modes. It is absent on Replicated and Global services. + JobStatus *JobStatus `json:",omitempty"` } // ServiceSpec represents the spec of a service. @@ -32,8 +43,10 @@ type ServiceSpec struct { // ServiceMode represents the mode of a service. type ServiceMode struct { - Replicated *ReplicatedService `json:",omitempty"` - Global *GlobalService `json:",omitempty"` + Replicated *ReplicatedService `json:",omitempty"` + Global *GlobalService `json:",omitempty"` + ReplicatedJob *ReplicatedJob `json:",omitempty"` + GlobalJob *GlobalJob `json:",omitempty"` } // UpdateState is the state of a service update. @@ -70,6 +83,32 @@ type ReplicatedService struct { // GlobalService is a kind of ServiceMode. type GlobalService struct{} +// ReplicatedJob is the a type of Service which executes a defined Tasks +// in parallel until the specified number of Tasks have succeeded. +type ReplicatedJob struct { + // MaxConcurrent indicates the maximum number of Tasks that should be + // executing simultaneously for this job at any given time. There may be + // fewer Tasks that MaxConcurrent executing simultaneously; for example, if + // there are fewer than MaxConcurrent tasks needed to reach + // TotalCompletions. + // + // If this field is empty, it will default to a max concurrency of 1. + MaxConcurrent *uint64 `json:",omitempty"` + + // TotalCompletions is the total number of Tasks desired to run to + // completion. + // + // If this field is empty, the value of MaxConcurrent will be used. + TotalCompletions *uint64 `json:",omitempty"` +} + +// GlobalJob is the type of a Service which executes a Task on every Node +// matching the Service's placement constraints. These tasks run to completion +// and then exit. +// +// This type is deliberately empty. +type GlobalJob struct{} + const ( // UpdateFailureActionPause PAUSE UpdateFailureActionPause = "pause" @@ -122,3 +161,42 @@ type UpdateConfig struct { // started, or the new task is started before the old task is shut down. Order string } + +// ServiceStatus represents the number of running tasks in a service and the +// number of tasks desired to be running. +type ServiceStatus struct { + // RunningTasks is the number of tasks for the service actually in the + // Running state + RunningTasks uint64 + + // DesiredTasks is the number of tasks desired to be running by the + // service. For replicated services, this is the replica count. For global + // services, this is computed by taking the number of tasks with desired + // state of not-Shutdown. + DesiredTasks uint64 + + // CompletedTasks is the number of tasks in the state Completed, if this + // service is in ReplicatedJob or GlobalJob mode. This field must be + // cross-referenced with the service type, because the default value of 0 + // may mean that a service is not in a job mode, or it may mean that the + // job has yet to complete any tasks. + CompletedTasks uint64 +} + +// JobStatus is the status of a job-type service. +type JobStatus struct { + // JobIteration is a value increased each time a Job is executed, + // successfully or otherwise. "Executed", in this case, means the job as a + // whole has been started, not that an individual Task has been launched. A + // job is "Executed" when its ServiceSpec is updated. JobIteration can be + // used to disambiguate Tasks belonging to different executions of a job. + // + // Though JobIteration will increase with each subsequent execution, it may + // not necessarily increase by 1, and so JobIteration should not be used to + // keep track of the number of times a job has been executed. + JobIteration Version + + // LastExecution is the time that the job was last executed, as observed by + // Swarm manager. + LastExecution time.Time `json:",omitempty"` +} diff --git a/vendor/github.com/docker/docker/api/types/swarm/task.go b/vendor/github.com/docker/docker/api/types/swarm/task.go index d5a57df5db5a..a6f7ab7b5c79 100644 --- a/vendor/github.com/docker/docker/api/types/swarm/task.go +++ b/vendor/github.com/docker/docker/api/types/swarm/task.go @@ -56,6 +56,12 @@ type Task struct { DesiredState TaskState `json:",omitempty"` NetworksAttachments []NetworkAttachment `json:",omitempty"` GenericResources []GenericResource `json:",omitempty"` + + // JobIteration is the JobIteration of the Service that this Task was + // spawned from, if the Service is a ReplicatedJob or GlobalJob. This is + // used to determine which Tasks belong to which run of the job. This field + // is absent if the Service mode is Replicated or Global. + JobIteration *Version `json:",omitempty"` } // TaskSpec represents the spec of a task. @@ -85,13 +91,21 @@ type TaskSpec struct { Runtime RuntimeType `json:",omitempty"` } -// Resources represents resources (CPU/Memory). +// Resources represents resources (CPU/Memory) which can be advertised by a +// node and requested to be reserved for a task. type Resources struct { NanoCPUs int64 `json:",omitempty"` MemoryBytes int64 `json:",omitempty"` GenericResources []GenericResource `json:",omitempty"` } +// Limit describes limits on resources which can be requested by a task. +type Limit struct { + NanoCPUs int64 `json:",omitempty"` + MemoryBytes int64 `json:",omitempty"` + Pids int64 `json:",omitempty"` +} + // GenericResource represents a "user defined" resource which can // be either an integer (e.g: SSD=3) or a string (e.g: SSD=sda1) type GenericResource struct { @@ -119,7 +133,7 @@ type DiscreteGenericResource struct { // ResourceRequirements represents resources requirements. type ResourceRequirements struct { - Limits *Resources `json:",omitempty"` + Limits *Limit `json:",omitempty"` Reservations *Resources `json:",omitempty"` } diff --git a/vendor/github.com/docker/docker/api/types/types.go b/vendor/github.com/docker/docker/api/types/types.go index a39ffcb7be2d..e3a159912e22 100644 --- a/vendor/github.com/docker/docker/api/types/types.go +++ b/vendor/github.com/docker/docker/api/types/types.go @@ -39,6 +39,7 @@ type ImageInspect struct { Author string Config *container.Config Architecture string + Variant string `json:",omitempty"` Os string OsVersion string `json:",omitempty"` Size int64 @@ -153,11 +154,11 @@ type Info struct { Images int Driver string DriverStatus [][2]string - SystemStatus [][2]string + SystemStatus [][2]string `json:",omitempty"` // SystemStatus is only propagated by the Swarm standalone API Plugins PluginsInfo MemoryLimit bool SwapLimit bool - KernelMemory bool + KernelMemory bool // Deprecated: kernel 5.4 deprecated kmem.limit_in_bytes KernelMemoryTCP bool CPUCfsPeriod bool `json:"CpuCfsPeriod"` CPUCfsQuota bool `json:"CpuCfsQuota"` @@ -174,9 +175,11 @@ type Info struct { SystemTime string LoggingDriver string CgroupDriver string + CgroupVersion string `json:",omitempty"` NEventsListener int KernelVersion string OperatingSystem string + OSVersion string OSType string Architecture string IndexServerAddress string @@ -192,23 +195,24 @@ type Info struct { Labels []string ExperimentalBuild bool ServerVersion string - ClusterStore string - ClusterAdvertise string + ClusterStore string `json:",omitempty"` // Deprecated: host-discovery and overlay networks with external k/v stores are deprecated + ClusterAdvertise string `json:",omitempty"` // Deprecated: host-discovery and overlay networks with external k/v stores are deprecated Runtimes map[string]Runtime DefaultRuntime string Swarm swarm.Info // LiveRestoreEnabled determines whether containers should be kept // running when the daemon is shutdown or upon daemon start if // running containers are detected - LiveRestoreEnabled bool - Isolation container.Isolation - InitBinary string - ContainerdCommit Commit - RuncCommit Commit - InitCommit Commit - SecurityOptions []string - ProductLicense string `json:",omitempty"` - Warnings []string + LiveRestoreEnabled bool + Isolation container.Isolation + InitBinary string + ContainerdCommit Commit + RuncCommit Commit + InitCommit Commit + SecurityOptions []string + ProductLicense string `json:",omitempty"` + DefaultAddressPools []NetworkAddressPool `json:",omitempty"` + Warnings []string } // KeyValue holds a key/value pair @@ -216,6 +220,12 @@ type KeyValue struct { Key, Value string } +// NetworkAddressPool is a temp struct used by Info struct +type NetworkAddressPool struct { + Base string + Size int +} + // SecurityOpt contains the name and options of a security option type SecurityOpt struct { Name string @@ -316,7 +326,7 @@ type ContainerState struct { } // ContainerNode stores information about the node that a container -// is running on. It's only available in Docker Swarm +// is running on. It's only used by the Docker Swarm standalone API type ContainerNode struct { ID string IPAddress string `json:"IP"` @@ -340,7 +350,7 @@ type ContainerJSONBase struct { HostnamePath string HostsPath string LogPath string - Node *ContainerNode `json:",omitempty"` + Node *ContainerNode `json:",omitempty"` // Node is only propagated by Docker Swarm standalone API Name string RestartCount int Driver string @@ -508,6 +518,16 @@ type Checkpoint struct { type Runtime struct { Path string `json:"path"` Args []string `json:"runtimeArgs,omitempty"` + + // This is exposed here only for internal use + // It is not currently supported to specify custom shim configs + Shim *ShimConfig `json:"-"` +} + +// ShimConfig is used by runtime to configure containerd shims +type ShimConfig struct { + Binary string + Opts interface{} } // DiskUsage contains response of Engine API: diff --git a/vendor/github.com/docker/docker/api/types/volume/volume_create.go b/vendor/github.com/docker/docker/api/types/volume/volume_create.go index 700aa804f851..8538078dd663 100644 --- a/vendor/github.com/docker/docker/api/types/volume/volume_create.go +++ b/vendor/github.com/docker/docker/api/types/volume/volume_create.go @@ -1,8 +1,7 @@ package volume // import "github.com/docker/docker/api/types/volume" // ---------------------------------------------------------------------------- -// DO NOT EDIT THIS FILE -// This file was generated by `swagger generate operation` +// Code generated by `swagger generate operation`. DO NOT EDIT. // // See hack/generate-swagger-api.sh // ---------------------------------------------------------------------------- diff --git a/vendor/github.com/docker/docker/api/types/volume/volume_list.go b/vendor/github.com/docker/docker/api/types/volume/volume_list.go index 5a79ad64370f..be06179bf488 100644 --- a/vendor/github.com/docker/docker/api/types/volume/volume_list.go +++ b/vendor/github.com/docker/docker/api/types/volume/volume_list.go @@ -1,8 +1,7 @@ package volume // import "github.com/docker/docker/api/types/volume" // ---------------------------------------------------------------------------- -// DO NOT EDIT THIS FILE -// This file was generated by `swagger generate operation` +// Code generated by `swagger generate operation`. DO NOT EDIT. // // See hack/generate-swagger-api.sh // ---------------------------------------------------------------------------- diff --git a/vendor/github.com/docker/docker/client/build_cancel.go b/vendor/github.com/docker/docker/client/build_cancel.go index 3aae43e3d17e..b76bf366bb9e 100644 --- a/vendor/github.com/docker/docker/client/build_cancel.go +++ b/vendor/github.com/docker/docker/client/build_cancel.go @@ -5,7 +5,7 @@ import ( "net/url" ) -// BuildCancel requests the daemon to cancel ongoing build request +// BuildCancel requests the daemon to cancel the ongoing build request. func (cli *Client) BuildCancel(ctx context.Context, id string) error { query := url.Values{} query.Set("id", id) diff --git a/vendor/github.com/docker/docker/client/client.go b/vendor/github.com/docker/docker/client/client.go index b63d4d6d4986..68064ca9c5f7 100644 --- a/vendor/github.com/docker/docker/client/client.go +++ b/vendor/github.com/docker/docker/client/client.go @@ -7,8 +7,8 @@ https://docs.docker.com/engine/reference/api/ Usage You use the library by creating a client object and calling methods on it. The -client can be created either from environment variables with NewEnvClient, or -configured manually with NewClient. +client can be created either from environment variables with NewClientWithOpts(client.FromEnv), +or configured manually with NewClient(). For example, to list running containers (the equivalent of "docker ps"): @@ -252,7 +252,8 @@ func (cli *Client) DaemonHost() string { // HTTPClient returns a copy of the HTTP client bound to the server func (cli *Client) HTTPClient() *http.Client { - return &*cli.client + c := *cli.client + return &c } // ParseHostURL parses a url string, validates the string is a host url, and diff --git a/vendor/github.com/docker/docker/client/client_unix.go b/vendor/github.com/docker/docker/client/client_unix.go index 178ff67409a1..9d0f0dcbf0ba 100644 --- a/vendor/github.com/docker/docker/client/client_unix.go +++ b/vendor/github.com/docker/docker/client/client_unix.go @@ -1,4 +1,4 @@ -// +build linux freebsd openbsd netbsd darwin dragonfly +// +build linux freebsd openbsd netbsd darwin solaris illumos dragonfly package client // import "github.com/docker/docker/client" diff --git a/vendor/github.com/docker/docker/client/config_create.go b/vendor/github.com/docker/docker/client/config_create.go index ee7d411df06a..f6b1881fc369 100644 --- a/vendor/github.com/docker/docker/client/config_create.go +++ b/vendor/github.com/docker/docker/client/config_create.go @@ -8,7 +8,7 @@ import ( "github.com/docker/docker/api/types/swarm" ) -// ConfigCreate creates a new Config. +// ConfigCreate creates a new config. func (cli *Client) ConfigCreate(ctx context.Context, config swarm.ConfigSpec) (types.ConfigCreateResponse, error) { var response types.ConfigCreateResponse if err := cli.NewVersionError("1.30", "config create"); err != nil { diff --git a/vendor/github.com/docker/docker/client/config_remove.go b/vendor/github.com/docker/docker/client/config_remove.go index a708fcaecfdc..93de0d8445b5 100644 --- a/vendor/github.com/docker/docker/client/config_remove.go +++ b/vendor/github.com/docker/docker/client/config_remove.go @@ -2,7 +2,7 @@ package client // import "github.com/docker/docker/client" import "context" -// ConfigRemove removes a Config. +// ConfigRemove removes a config. func (cli *Client) ConfigRemove(ctx context.Context, id string) error { if err := cli.NewVersionError("1.30", "config remove"); err != nil { return err diff --git a/vendor/github.com/docker/docker/client/config_update.go b/vendor/github.com/docker/docker/client/config_update.go index 39e59cf85890..ba79ae64e592 100644 --- a/vendor/github.com/docker/docker/client/config_update.go +++ b/vendor/github.com/docker/docker/client/config_update.go @@ -8,7 +8,7 @@ import ( "github.com/docker/docker/api/types/swarm" ) -// ConfigUpdate attempts to update a Config +// ConfigUpdate attempts to update a config func (cli *Client) ConfigUpdate(ctx context.Context, id string, version swarm.Version, config swarm.ConfigSpec) error { if err := cli.NewVersionError("1.30", "config update"); err != nil { return err diff --git a/vendor/github.com/docker/docker/client/container_commit.go b/vendor/github.com/docker/docker/client/container_commit.go index 2966e88c8eca..cd7f7634646f 100644 --- a/vendor/github.com/docker/docker/client/container_commit.go +++ b/vendor/github.com/docker/docker/client/container_commit.go @@ -10,7 +10,7 @@ import ( "github.com/docker/docker/api/types" ) -// ContainerCommit applies changes into a container and creates a new tagged image. +// ContainerCommit applies changes to a container and creates a new tagged image. func (cli *Client) ContainerCommit(ctx context.Context, container string, options types.ContainerCommitOptions) (types.IDResponse, error) { var repository, tag string if options.Reference != "" { diff --git a/vendor/github.com/docker/docker/client/container_copy.go b/vendor/github.com/docker/docker/client/container_copy.go index bb278bf7f324..c0a47c14e31b 100644 --- a/vendor/github.com/docker/docker/client/container_copy.go +++ b/vendor/github.com/docker/docker/client/container_copy.go @@ -14,7 +14,7 @@ import ( "github.com/docker/docker/api/types" ) -// ContainerStatPath returns Stat information about a path inside the container filesystem. +// ContainerStatPath returns stat information about a path inside the container filesystem. func (cli *Client) ContainerStatPath(ctx context.Context, containerID, path string) (types.ContainerPathStat, error) { query := url.Values{} query.Set("path", filepath.ToSlash(path)) // Normalize the paths used in the API. diff --git a/vendor/github.com/docker/docker/client/container_create.go b/vendor/github.com/docker/docker/client/container_create.go index 5b795e0c17ce..cfae96a6f5d3 100644 --- a/vendor/github.com/docker/docker/client/container_create.go +++ b/vendor/github.com/docker/docker/client/container_create.go @@ -5,20 +5,23 @@ import ( "encoding/json" "net/url" + "github.com/containerd/containerd/platforms" "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/network" "github.com/docker/docker/api/types/versions" + specs "github.com/opencontainers/image-spec/specs-go/v1" ) type configWrapper struct { *container.Config HostConfig *container.HostConfig NetworkingConfig *network.NetworkingConfig + Platform *specs.Platform } -// ContainerCreate creates a new container based in the given configuration. +// ContainerCreate creates a new container based on the given configuration. // It can be associated with a name, but it's not mandatory. -func (cli *Client) ContainerCreate(ctx context.Context, config *container.Config, hostConfig *container.HostConfig, networkingConfig *network.NetworkingConfig, containerName string) (container.ContainerCreateCreatedBody, error) { +func (cli *Client) ContainerCreate(ctx context.Context, config *container.Config, hostConfig *container.HostConfig, networkingConfig *network.NetworkingConfig, platform *specs.Platform, containerName string) (container.ContainerCreateCreatedBody, error) { var response container.ContainerCreateCreatedBody if err := cli.NewVersionError("1.25", "stop timeout"); config != nil && config.StopTimeout != nil && err != nil { @@ -30,7 +33,15 @@ func (cli *Client) ContainerCreate(ctx context.Context, config *container.Config hostConfig.AutoRemove = false } + if err := cli.NewVersionError("1.41", "specify container image platform"); platform != nil && err != nil { + return response, err + } + query := url.Values{} + if platform != nil { + query.Set("platform", platforms.Format(*platform)) + } + if containerName != "" { query.Set("name", containerName) } diff --git a/vendor/github.com/docker/docker/client/container_list.go b/vendor/github.com/docker/docker/client/container_list.go index 1e7a63a9c066..a973de597fdf 100644 --- a/vendor/github.com/docker/docker/client/container_list.go +++ b/vendor/github.com/docker/docker/client/container_list.go @@ -35,6 +35,7 @@ func (cli *Client) ContainerList(ctx context.Context, options types.ContainerLis } if options.Filters.Len() > 0 { + //nolint:staticcheck // ignore SA1019 for old code filterJSON, err := filters.ToParamWithVersion(cli.version, options.Filters) if err != nil { diff --git a/vendor/github.com/docker/docker/client/container_restart.go b/vendor/github.com/docker/docker/client/container_restart.go index 41e421969f47..aa0d6485de39 100644 --- a/vendor/github.com/docker/docker/client/container_restart.go +++ b/vendor/github.com/docker/docker/client/container_restart.go @@ -9,7 +9,7 @@ import ( ) // ContainerRestart stops and starts a container again. -// It makes the daemon to wait for the container to be up again for +// It makes the daemon wait for the container to be up again for // a specific amount of time, given the timeout. func (cli *Client) ContainerRestart(ctx context.Context, containerID string, timeout *time.Duration) error { query := url.Values{} diff --git a/vendor/github.com/docker/docker/client/container_stats.go b/vendor/github.com/docker/docker/client/container_stats.go index 6ef44c77480c..0a6488dde826 100644 --- a/vendor/github.com/docker/docker/client/container_stats.go +++ b/vendor/github.com/docker/docker/client/container_stats.go @@ -24,3 +24,19 @@ func (cli *Client) ContainerStats(ctx context.Context, containerID string, strea osType := getDockerOS(resp.header.Get("Server")) return types.ContainerStats{Body: resp.body, OSType: osType}, err } + +// ContainerStatsOneShot gets a single stat entry from a container. +// It differs from `ContainerStats` in that the API should not wait to prime the stats +func (cli *Client) ContainerStatsOneShot(ctx context.Context, containerID string) (types.ContainerStats, error) { + query := url.Values{} + query.Set("stream", "0") + query.Set("one-shot", "1") + + resp, err := cli.get(ctx, "/containers/"+containerID+"/stats", query, nil) + if err != nil { + return types.ContainerStats{}, err + } + + osType := getDockerOS(resp.header.Get("Server")) + return types.ContainerStats{Body: resp.body, OSType: osType}, err +} diff --git a/vendor/github.com/docker/docker/client/container_update.go b/vendor/github.com/docker/docker/client/container_update.go index 6917cf9fb36d..bf68a5300e9d 100644 --- a/vendor/github.com/docker/docker/client/container_update.go +++ b/vendor/github.com/docker/docker/client/container_update.go @@ -7,7 +7,7 @@ import ( "github.com/docker/docker/api/types/container" ) -// ContainerUpdate updates resources of a container +// ContainerUpdate updates the resources of a container. func (cli *Client) ContainerUpdate(ctx context.Context, containerID string, updateConfig container.UpdateConfig) (container.ContainerUpdateOKBody, error) { var response container.ContainerUpdateOKBody serverResp, err := cli.post(ctx, "/containers/"+containerID+"/update", nil, updateConfig, nil) diff --git a/vendor/github.com/docker/docker/client/distribution_inspect.go b/vendor/github.com/docker/docker/client/distribution_inspect.go index f4e3794cb4c6..7f36c99a0166 100644 --- a/vendor/github.com/docker/docker/client/distribution_inspect.go +++ b/vendor/github.com/docker/docker/client/distribution_inspect.go @@ -8,7 +8,7 @@ import ( registrytypes "github.com/docker/docker/api/types/registry" ) -// DistributionInspect returns the image digest with full Manifest +// DistributionInspect returns the image digest with the full manifest. func (cli *Client) DistributionInspect(ctx context.Context, image, encodedRegistryAuth string) (registrytypes.DistributionInspect, error) { // Contact the registry to retrieve digest and platform information var distributionInspect registrytypes.DistributionInspect diff --git a/vendor/github.com/docker/docker/client/errors.go b/vendor/github.com/docker/docker/client/errors.go index 001c10288141..041bc8d49c44 100644 --- a/vendor/github.com/docker/docker/client/errors.go +++ b/vendor/github.com/docker/docker/client/errors.go @@ -24,8 +24,7 @@ func (err errConnectionFailed) Error() string { // IsErrConnectionFailed returns true if the error is caused by connection failed. func IsErrConnectionFailed(err error) bool { - _, ok := errors.Cause(err).(errConnectionFailed) - return ok + return errors.As(err, &errConnectionFailed{}) } // ErrorConnectionFailed returns an error with host in the error message when connection to docker daemon failed. @@ -42,8 +41,9 @@ type notFound interface { // IsErrNotFound returns true if the error is a NotFound error, which is returned // by the API when some object is not found. func IsErrNotFound(err error) bool { - if _, ok := err.(notFound); ok { - return ok + var e notFound + if errors.As(err, &e) { + return true } return errdefs.IsNotFound(err) } diff --git a/vendor/github.com/docker/docker/client/events.go b/vendor/github.com/docker/docker/client/events.go index 6e56538955ee..f0dc9d9e12f3 100644 --- a/vendor/github.com/docker/docker/client/events.go +++ b/vendor/github.com/docker/docker/client/events.go @@ -90,6 +90,7 @@ func buildEventsQueryParams(cliVersion string, options types.EventsOptions) (url } if options.Filters.Len() > 0 { + //nolint:staticcheck // ignore SA1019 for old code filterJSON, err := filters.ToParamWithVersion(cliVersion, options.Filters) if err != nil { return nil, err diff --git a/vendor/github.com/docker/docker/client/hijack.go b/vendor/github.com/docker/docker/client/hijack.go index e9c9a752f83f..e1dc49ef0f66 100644 --- a/vendor/github.com/docker/docker/client/hijack.go +++ b/vendor/github.com/docker/docker/client/hijack.go @@ -24,7 +24,7 @@ func (cli *Client) postHijacked(ctx context.Context, path string, query url.Valu } apiPath := cli.getAPIPath(ctx, path, query) - req, err := http.NewRequest("POST", apiPath, bodyEncoded) + req, err := http.NewRequest(http.MethodPost, apiPath, bodyEncoded) if err != nil { return types.HijackedResponse{}, err } @@ -40,7 +40,7 @@ func (cli *Client) postHijacked(ctx context.Context, path string, query url.Valu // DialHijack returns a hijacked connection with negotiated protocol proto. func (cli *Client) DialHijack(ctx context.Context, url, proto string, meta map[string][]string) (net.Conn, error) { - req, err := http.NewRequest("POST", url, nil) + req, err := http.NewRequest(http.MethodPost, url, nil) if err != nil { return nil, err } @@ -87,6 +87,8 @@ func (cli *Client) setupHijackConn(ctx context.Context, req *http.Request, proto // Server hijacks the connection, error 'connection closed' expected resp, err := clientconn.Do(req) + + //nolint:staticcheck // ignore SA1019 for connecting to old (pre go1.8) daemons if err != httputil.ErrPersistEOF { if err != nil { return nil, err diff --git a/vendor/github.com/docker/docker/client/image_build.go b/vendor/github.com/docker/docker/client/image_build.go index 8fcf995036fb..d16e1d8ea98a 100644 --- a/vendor/github.com/docker/docker/client/image_build.go +++ b/vendor/github.com/docker/docker/client/image_build.go @@ -14,8 +14,8 @@ import ( "github.com/docker/docker/api/types/container" ) -// ImageBuild sends request to the daemon to build images. -// The Body in the response implement an io.ReadCloser and it's up to the caller to +// ImageBuild sends a request to the daemon to build images. +// The Body in the response implements an io.ReadCloser and it's up to the caller to // close it. func (cli *Client) ImageBuild(ctx context.Context, buildContext io.Reader, options types.ImageBuildOptions) (types.ImageBuildResponse, error) { query, err := cli.imageBuildOptionsToQuery(options) diff --git a/vendor/github.com/docker/docker/client/image_create.go b/vendor/github.com/docker/docker/client/image_create.go index 239380474e61..b1c0227775ce 100644 --- a/vendor/github.com/docker/docker/client/image_create.go +++ b/vendor/github.com/docker/docker/client/image_create.go @@ -10,7 +10,7 @@ import ( "github.com/docker/docker/api/types" ) -// ImageCreate creates a new image based in the parent options. +// ImageCreate creates a new image based on the parent options. // It returns the JSON content in the response body. func (cli *Client) ImageCreate(ctx context.Context, parentReference string, options types.ImageCreateOptions) (io.ReadCloser, error) { ref, err := reference.ParseNormalizedNamed(parentReference) diff --git a/vendor/github.com/docker/docker/client/image_import.go b/vendor/github.com/docker/docker/client/image_import.go index c2972ea950eb..c5de42cb799d 100644 --- a/vendor/github.com/docker/docker/client/image_import.go +++ b/vendor/github.com/docker/docker/client/image_import.go @@ -10,11 +10,11 @@ import ( "github.com/docker/docker/api/types" ) -// ImageImport creates a new image based in the source options. +// ImageImport creates a new image based on the source options. // It returns the JSON content in the response body. func (cli *Client) ImageImport(ctx context.Context, source types.ImageImportSource, ref string, options types.ImageImportOptions) (io.ReadCloser, error) { if ref != "" { - //Check if the given image name can be resolved + // Check if the given image name can be resolved if _, err := reference.ParseNormalizedNamed(ref); err != nil { return nil, err } diff --git a/vendor/github.com/docker/docker/client/image_list.go b/vendor/github.com/docker/docker/client/image_list.go index 4fa8c006b2ea..a4d7505094cd 100644 --- a/vendor/github.com/docker/docker/client/image_list.go +++ b/vendor/github.com/docker/docker/client/image_list.go @@ -24,6 +24,7 @@ func (cli *Client) ImageList(ctx context.Context, options types.ImageListOptions } } if optionFilters.Len() > 0 { + //nolint:staticcheck // ignore SA1019 for old code filterJSON, err := filters.ToParamWithVersion(cli.version, optionFilters) if err != nil { return images, err diff --git a/vendor/github.com/docker/docker/client/image_push.go b/vendor/github.com/docker/docker/client/image_push.go index 49d412ee375c..845580d4a4cd 100644 --- a/vendor/github.com/docker/docker/client/image_push.go +++ b/vendor/github.com/docker/docker/client/image_push.go @@ -25,15 +25,14 @@ func (cli *Client) ImagePush(ctx context.Context, image string, options types.Im return nil, errors.New("cannot push a digest reference") } - tag := "" name := reference.FamiliarName(ref) - - if nameTaggedRef, isNamedTagged := ref.(reference.NamedTagged); isNamedTagged { - tag = nameTaggedRef.Tag() - } - query := url.Values{} - query.Set("tag", tag) + if !options.All { + ref = reference.TagNameOnly(ref) + if tagged, ok := ref.(reference.Tagged); ok { + query.Set("tag", tagged.Tag()) + } + } resp, err := cli.tryImagePush(ctx, name, query, options.RegistryAuth) if errdefs.IsUnauthorized(err) && options.PrivilegeFunc != nil { diff --git a/vendor/github.com/docker/docker/client/image_search.go b/vendor/github.com/docker/docker/client/image_search.go index 82955a74775b..5f40a22a964c 100644 --- a/vendor/github.com/docker/docker/client/image_search.go +++ b/vendor/github.com/docker/docker/client/image_search.go @@ -12,7 +12,7 @@ import ( "github.com/docker/docker/errdefs" ) -// ImageSearch makes the docker host to search by a term in a remote registry. +// ImageSearch makes the docker host search by a term in a remote registry. // The list of results is not sorted in any fashion. func (cli *Client) ImageSearch(ctx context.Context, term string, options types.ImageSearchOptions) ([]registry.SearchResult, error) { var results []registry.SearchResult diff --git a/vendor/github.com/docker/docker/client/interface.go b/vendor/github.com/docker/docker/client/interface.go index cde64be4b56b..aabad4a91105 100644 --- a/vendor/github.com/docker/docker/client/interface.go +++ b/vendor/github.com/docker/docker/client/interface.go @@ -16,6 +16,7 @@ import ( "github.com/docker/docker/api/types/registry" "github.com/docker/docker/api/types/swarm" volumetypes "github.com/docker/docker/api/types/volume" + specs "github.com/opencontainers/image-spec/specs-go/v1" ) // CommonAPIClient is the common methods between stable and experimental versions of APIClient. @@ -47,7 +48,7 @@ type CommonAPIClient interface { type ContainerAPIClient interface { ContainerAttach(ctx context.Context, container string, options types.ContainerAttachOptions) (types.HijackedResponse, error) ContainerCommit(ctx context.Context, container string, options types.ContainerCommitOptions) (types.IDResponse, error) - ContainerCreate(ctx context.Context, config *containertypes.Config, hostConfig *containertypes.HostConfig, networkingConfig *networktypes.NetworkingConfig, containerName string) (containertypes.ContainerCreateCreatedBody, error) + ContainerCreate(ctx context.Context, config *containertypes.Config, hostConfig *containertypes.HostConfig, networkingConfig *networktypes.NetworkingConfig, platform *specs.Platform, containerName string) (containertypes.ContainerCreateCreatedBody, error) ContainerDiff(ctx context.Context, container string) ([]containertypes.ContainerChangeResponseItem, error) ContainerExecAttach(ctx context.Context, execID string, config types.ExecStartCheck) (types.HijackedResponse, error) ContainerExecCreate(ctx context.Context, container string, config types.ExecConfig) (types.IDResponse, error) @@ -67,6 +68,7 @@ type ContainerAPIClient interface { ContainerRestart(ctx context.Context, container string, timeout *time.Duration) error ContainerStatPath(ctx context.Context, container, path string) (types.ContainerPathStat, error) ContainerStats(ctx context.Context, container string, stream bool) (types.ContainerStats, error) + ContainerStatsOneShot(ctx context.Context, container string) (types.ContainerStats, error) ContainerStart(ctx context.Context, container string, options types.ContainerStartOptions) error ContainerStop(ctx context.Context, container string, timeout *time.Duration) error ContainerTop(ctx context.Context, container string, arguments []string) (containertypes.ContainerTopOKBody, error) diff --git a/vendor/github.com/docker/docker/client/network_list.go b/vendor/github.com/docker/docker/client/network_list.go index 7130c1364eb2..ed2acb55711d 100644 --- a/vendor/github.com/docker/docker/client/network_list.go +++ b/vendor/github.com/docker/docker/client/network_list.go @@ -13,6 +13,7 @@ import ( func (cli *Client) NetworkList(ctx context.Context, options types.NetworkListOptions) ([]types.NetworkResource, error) { query := url.Values{} if options.Filters.Len() > 0 { + //nolint:staticcheck // ignore SA1019 for old code filterJSON, err := filters.ToParamWithVersion(cli.version, options.Filters) if err != nil { return nil, err diff --git a/vendor/github.com/docker/docker/client/ping.go b/vendor/github.com/docker/docker/client/ping.go index 90f39ec14f92..a9af001ef46b 100644 --- a/vendor/github.com/docker/docker/client/ping.go +++ b/vendor/github.com/docker/docker/client/ping.go @@ -17,9 +17,9 @@ func (cli *Client) Ping(ctx context.Context) (types.Ping, error) { var ping types.Ping // Using cli.buildRequest() + cli.doRequest() instead of cli.sendRequest() - // because ping requests are used during API version negotiation, so we want + // because ping requests are used during API version negotiation, so we want // to hit the non-versioned /_ping endpoint, not /v1.xx/_ping - req, err := cli.buildRequest("HEAD", path.Join(cli.basePath, "/_ping"), nil, nil) + req, err := cli.buildRequest(http.MethodHead, path.Join(cli.basePath, "/_ping"), nil, nil) if err != nil { return ping, err } @@ -35,7 +35,7 @@ func (cli *Client) Ping(ctx context.Context) (types.Ping, error) { return ping, err } - req, err = cli.buildRequest("GET", path.Join(cli.basePath, "/_ping"), nil, nil) + req, err = cli.buildRequest(http.MethodGet, path.Join(cli.basePath, "/_ping"), nil, nil) if err != nil { return ping, err } diff --git a/vendor/github.com/docker/docker/client/plugin_list.go b/vendor/github.com/docker/docker/client/plugin_list.go index 8285cecd6e17..cf1935e2f5ee 100644 --- a/vendor/github.com/docker/docker/client/plugin_list.go +++ b/vendor/github.com/docker/docker/client/plugin_list.go @@ -15,6 +15,7 @@ func (cli *Client) PluginList(ctx context.Context, filter filters.Args) (types.P query := url.Values{} if filter.Len() > 0 { + //nolint:staticcheck // ignore SA1019 for old code filterJSON, err := filters.ToParamWithVersion(cli.version, filter) if err != nil { return plugins, err diff --git a/vendor/github.com/docker/docker/client/request.go b/vendor/github.com/docker/docker/client/request.go index 44e0a22c4f60..813eac2c9e0c 100644 --- a/vendor/github.com/docker/docker/client/request.go +++ b/vendor/github.com/docker/docker/client/request.go @@ -29,12 +29,12 @@ type serverResponse struct { // head sends an http request to the docker API using the method HEAD. func (cli *Client) head(ctx context.Context, path string, query url.Values, headers map[string][]string) (serverResponse, error) { - return cli.sendRequest(ctx, "HEAD", path, query, nil, headers) + return cli.sendRequest(ctx, http.MethodHead, path, query, nil, headers) } // get sends an http request to the docker API using the method GET with a specific Go context. func (cli *Client) get(ctx context.Context, path string, query url.Values, headers map[string][]string) (serverResponse, error) { - return cli.sendRequest(ctx, "GET", path, query, nil, headers) + return cli.sendRequest(ctx, http.MethodGet, path, query, nil, headers) } // post sends an http request to the docker API using the method POST with a specific Go context. @@ -43,30 +43,21 @@ func (cli *Client) post(ctx context.Context, path string, query url.Values, obj if err != nil { return serverResponse{}, err } - return cli.sendRequest(ctx, "POST", path, query, body, headers) + return cli.sendRequest(ctx, http.MethodPost, path, query, body, headers) } func (cli *Client) postRaw(ctx context.Context, path string, query url.Values, body io.Reader, headers map[string][]string) (serverResponse, error) { - return cli.sendRequest(ctx, "POST", path, query, body, headers) -} - -// put sends an http request to the docker API using the method PUT. -func (cli *Client) put(ctx context.Context, path string, query url.Values, obj interface{}, headers map[string][]string) (serverResponse, error) { - body, headers, err := encodeBody(obj, headers) - if err != nil { - return serverResponse{}, err - } - return cli.sendRequest(ctx, "PUT", path, query, body, headers) + return cli.sendRequest(ctx, http.MethodPost, path, query, body, headers) } // putRaw sends an http request to the docker API using the method PUT. func (cli *Client) putRaw(ctx context.Context, path string, query url.Values, body io.Reader, headers map[string][]string) (serverResponse, error) { - return cli.sendRequest(ctx, "PUT", path, query, body, headers) + return cli.sendRequest(ctx, http.MethodPut, path, query, body, headers) } // delete sends an http request to the docker API using the method DELETE. func (cli *Client) delete(ctx context.Context, path string, query url.Values, headers map[string][]string) (serverResponse, error) { - return cli.sendRequest(ctx, "DELETE", path, query, nil, headers) + return cli.sendRequest(ctx, http.MethodDelete, path, query, nil, headers) } type headers map[string][]string @@ -88,7 +79,7 @@ func encodeBody(obj interface{}, headers headers) (io.Reader, headers, error) { } func (cli *Client) buildRequest(method, path string, body io.Reader, headers headers) (*http.Request, error) { - expectedPayload := (method == "POST" || method == "PUT") + expectedPayload := (method == http.MethodPost || method == http.MethodPut) if expectedPayload && body == nil { body = bytes.NewReader([]byte{}) } diff --git a/vendor/github.com/docker/docker/client/secret_create.go b/vendor/github.com/docker/docker/client/secret_create.go index fd5b914136c3..c65d38a191f4 100644 --- a/vendor/github.com/docker/docker/client/secret_create.go +++ b/vendor/github.com/docker/docker/client/secret_create.go @@ -8,7 +8,7 @@ import ( "github.com/docker/docker/api/types/swarm" ) -// SecretCreate creates a new Secret. +// SecretCreate creates a new secret. func (cli *Client) SecretCreate(ctx context.Context, secret swarm.SecretSpec) (types.SecretCreateResponse, error) { var response types.SecretCreateResponse if err := cli.NewVersionError("1.25", "secret create"); err != nil { diff --git a/vendor/github.com/docker/docker/client/secret_remove.go b/vendor/github.com/docker/docker/client/secret_remove.go index c16f55580416..f6c69e57f850 100644 --- a/vendor/github.com/docker/docker/client/secret_remove.go +++ b/vendor/github.com/docker/docker/client/secret_remove.go @@ -2,7 +2,7 @@ package client // import "github.com/docker/docker/client" import "context" -// SecretRemove removes a Secret. +// SecretRemove removes a secret. func (cli *Client) SecretRemove(ctx context.Context, id string) error { if err := cli.NewVersionError("1.25", "secret remove"); err != nil { return err diff --git a/vendor/github.com/docker/docker/client/secret_update.go b/vendor/github.com/docker/docker/client/secret_update.go index 164256bbc15b..d082dcef75cc 100644 --- a/vendor/github.com/docker/docker/client/secret_update.go +++ b/vendor/github.com/docker/docker/client/secret_update.go @@ -8,7 +8,7 @@ import ( "github.com/docker/docker/api/types/swarm" ) -// SecretUpdate attempts to update a Secret +// SecretUpdate attempts to update a secret. func (cli *Client) SecretUpdate(ctx context.Context, id string, version swarm.Version, secret swarm.SecretSpec) error { if err := cli.NewVersionError("1.25", "secret update"); err != nil { return err diff --git a/vendor/github.com/docker/docker/client/service_create.go b/vendor/github.com/docker/docker/client/service_create.go index 620fc6cff757..a07315f71fe2 100644 --- a/vendor/github.com/docker/docker/client/service_create.go +++ b/vendor/github.com/docker/docker/client/service_create.go @@ -9,14 +9,13 @@ import ( "github.com/docker/distribution/reference" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/swarm" - "github.com/opencontainers/go-digest" + digest "github.com/opencontainers/go-digest" "github.com/pkg/errors" ) -// ServiceCreate creates a new Service. +// ServiceCreate creates a new service. func (cli *Client) ServiceCreate(ctx context.Context, service swarm.ServiceSpec, options types.ServiceCreateOptions) (types.ServiceCreateResponse, error) { - var distErr error - + var response types.ServiceCreateResponse headers := map[string][]string{ "version": {cli.version}, } @@ -31,46 +30,28 @@ func (cli *Client) ServiceCreate(ctx context.Context, service swarm.ServiceSpec, } if err := validateServiceSpec(service); err != nil { - return types.ServiceCreateResponse{}, err + return response, err } // ensure that the image is tagged - var imgPlatforms []swarm.Platform - if service.TaskTemplate.ContainerSpec != nil { + var resolveWarning string + switch { + case service.TaskTemplate.ContainerSpec != nil: if taggedImg := imageWithTagString(service.TaskTemplate.ContainerSpec.Image); taggedImg != "" { service.TaskTemplate.ContainerSpec.Image = taggedImg } if options.QueryRegistry { - var img string - img, imgPlatforms, distErr = imageDigestAndPlatforms(ctx, cli, service.TaskTemplate.ContainerSpec.Image, options.EncodedRegistryAuth) - if img != "" { - service.TaskTemplate.ContainerSpec.Image = img - } + resolveWarning = resolveContainerSpecImage(ctx, cli, &service.TaskTemplate, options.EncodedRegistryAuth) } - } - - // ensure that the image is tagged - if service.TaskTemplate.PluginSpec != nil { + case service.TaskTemplate.PluginSpec != nil: if taggedImg := imageWithTagString(service.TaskTemplate.PluginSpec.Remote); taggedImg != "" { service.TaskTemplate.PluginSpec.Remote = taggedImg } if options.QueryRegistry { - var img string - img, imgPlatforms, distErr = imageDigestAndPlatforms(ctx, cli, service.TaskTemplate.PluginSpec.Remote, options.EncodedRegistryAuth) - if img != "" { - service.TaskTemplate.PluginSpec.Remote = img - } + resolveWarning = resolvePluginSpecRemote(ctx, cli, &service.TaskTemplate, options.EncodedRegistryAuth) } } - if service.TaskTemplate.Placement == nil && len(imgPlatforms) > 0 { - service.TaskTemplate.Placement = &swarm.Placement{} - } - if len(imgPlatforms) > 0 { - service.TaskTemplate.Placement.Platforms = imgPlatforms - } - - var response types.ServiceCreateResponse resp, err := cli.post(ctx, "/services/create", nil, service, headers) defer ensureReaderClosed(resp) if err != nil { @@ -78,14 +59,45 @@ func (cli *Client) ServiceCreate(ctx context.Context, service swarm.ServiceSpec, } err = json.NewDecoder(resp.body).Decode(&response) - - if distErr != nil { - response.Warnings = append(response.Warnings, digestWarning(service.TaskTemplate.ContainerSpec.Image)) + if resolveWarning != "" { + response.Warnings = append(response.Warnings, resolveWarning) } return response, err } +func resolveContainerSpecImage(ctx context.Context, cli DistributionAPIClient, taskSpec *swarm.TaskSpec, encodedAuth string) string { + var warning string + if img, imgPlatforms, err := imageDigestAndPlatforms(ctx, cli, taskSpec.ContainerSpec.Image, encodedAuth); err != nil { + warning = digestWarning(taskSpec.ContainerSpec.Image) + } else { + taskSpec.ContainerSpec.Image = img + if len(imgPlatforms) > 0 { + if taskSpec.Placement == nil { + taskSpec.Placement = &swarm.Placement{} + } + taskSpec.Placement.Platforms = imgPlatforms + } + } + return warning +} + +func resolvePluginSpecRemote(ctx context.Context, cli DistributionAPIClient, taskSpec *swarm.TaskSpec, encodedAuth string) string { + var warning string + if img, imgPlatforms, err := imageDigestAndPlatforms(ctx, cli, taskSpec.PluginSpec.Remote, encodedAuth); err != nil { + warning = digestWarning(taskSpec.PluginSpec.Remote) + } else { + taskSpec.PluginSpec.Remote = img + if len(imgPlatforms) > 0 { + if taskSpec.Placement == nil { + taskSpec.Placement = &swarm.Placement{} + } + taskSpec.Placement.Platforms = imgPlatforms + } + } + return warning +} + func imageDigestAndPlatforms(ctx context.Context, cli DistributionAPIClient, image, encodedAuth string) (string, []swarm.Platform, error) { distributionInspect, err := cli.DistributionInspect(ctx, image, encodedAuth) var platforms []swarm.Platform @@ -119,7 +131,7 @@ func imageDigestAndPlatforms(ctx context.Context, cli DistributionAPIClient, ima // imageWithDigestString takes an image string and a digest, and updates // the image string if it didn't originally contain a digest. It returns -// an empty string if there are no updates. +// image unmodified in other situations. func imageWithDigestString(image string, dgst digest.Digest) string { namedRef, err := reference.ParseNormalizedNamed(image) if err == nil { @@ -131,7 +143,7 @@ func imageWithDigestString(image string, dgst digest.Digest) string { } } } - return "" + return image } // imageWithTagString takes an image string, and returns a tagged image diff --git a/vendor/github.com/docker/docker/client/service_list.go b/vendor/github.com/docker/docker/client/service_list.go index 64d35e715982..f97ec75a5cb7 100644 --- a/vendor/github.com/docker/docker/client/service_list.go +++ b/vendor/github.com/docker/docker/client/service_list.go @@ -23,6 +23,10 @@ func (cli *Client) ServiceList(ctx context.Context, options types.ServiceListOpt query.Set("filters", filterJSON) } + if options.Status { + query.Set("status", "true") + } + resp, err := cli.get(ctx, "/services", query, nil) defer ensureReaderClosed(resp) if err != nil { diff --git a/vendor/github.com/docker/docker/client/service_update.go b/vendor/github.com/docker/docker/client/service_update.go index cd0f59e21338..c63895f74f25 100644 --- a/vendor/github.com/docker/docker/client/service_update.go +++ b/vendor/github.com/docker/docker/client/service_update.go @@ -15,8 +15,8 @@ import ( // of swarm.Service, which can be found using ServiceInspectWithRaw. func (cli *Client) ServiceUpdate(ctx context.Context, serviceID string, version swarm.Version, service swarm.ServiceSpec, options types.ServiceUpdateOptions) (types.ServiceUpdateResponse, error) { var ( - query = url.Values{} - distErr error + query = url.Values{} + response = types.ServiceUpdateResponse{} ) headers := map[string][]string{ @@ -38,46 +38,28 @@ func (cli *Client) ServiceUpdate(ctx context.Context, serviceID string, version query.Set("version", strconv.FormatUint(version.Index, 10)) if err := validateServiceSpec(service); err != nil { - return types.ServiceUpdateResponse{}, err + return response, err } - var imgPlatforms []swarm.Platform // ensure that the image is tagged - if service.TaskTemplate.ContainerSpec != nil { + var resolveWarning string + switch { + case service.TaskTemplate.ContainerSpec != nil: if taggedImg := imageWithTagString(service.TaskTemplate.ContainerSpec.Image); taggedImg != "" { service.TaskTemplate.ContainerSpec.Image = taggedImg } if options.QueryRegistry { - var img string - img, imgPlatforms, distErr = imageDigestAndPlatforms(ctx, cli, service.TaskTemplate.ContainerSpec.Image, options.EncodedRegistryAuth) - if img != "" { - service.TaskTemplate.ContainerSpec.Image = img - } + resolveWarning = resolveContainerSpecImage(ctx, cli, &service.TaskTemplate, options.EncodedRegistryAuth) } - } - - // ensure that the image is tagged - if service.TaskTemplate.PluginSpec != nil { + case service.TaskTemplate.PluginSpec != nil: if taggedImg := imageWithTagString(service.TaskTemplate.PluginSpec.Remote); taggedImg != "" { service.TaskTemplate.PluginSpec.Remote = taggedImg } if options.QueryRegistry { - var img string - img, imgPlatforms, distErr = imageDigestAndPlatforms(ctx, cli, service.TaskTemplate.PluginSpec.Remote, options.EncodedRegistryAuth) - if img != "" { - service.TaskTemplate.PluginSpec.Remote = img - } + resolveWarning = resolvePluginSpecRemote(ctx, cli, &service.TaskTemplate, options.EncodedRegistryAuth) } } - if service.TaskTemplate.Placement == nil && len(imgPlatforms) > 0 { - service.TaskTemplate.Placement = &swarm.Placement{} - } - if len(imgPlatforms) > 0 { - service.TaskTemplate.Placement.Platforms = imgPlatforms - } - - var response types.ServiceUpdateResponse resp, err := cli.post(ctx, "/services/"+serviceID+"/update", query, service, headers) defer ensureReaderClosed(resp) if err != nil { @@ -85,9 +67,8 @@ func (cli *Client) ServiceUpdate(ctx context.Context, serviceID string, version } err = json.NewDecoder(resp.body).Decode(&response) - - if distErr != nil { - response.Warnings = append(response.Warnings, digestWarning(service.TaskTemplate.ContainerSpec.Image)) + if resolveWarning != "" { + response.Warnings = append(response.Warnings, resolveWarning) } return response, err diff --git a/vendor/github.com/docker/docker/client/task_inspect.go b/vendor/github.com/docker/docker/client/task_inspect.go index 44d40ba5ae83..ed132f37967d 100644 --- a/vendor/github.com/docker/docker/client/task_inspect.go +++ b/vendor/github.com/docker/docker/client/task_inspect.go @@ -9,7 +9,7 @@ import ( "github.com/docker/docker/api/types/swarm" ) -// TaskInspectWithRaw returns the task information and its raw representation.. +// TaskInspectWithRaw returns the task information and its raw representation. func (cli *Client) TaskInspectWithRaw(ctx context.Context, taskID string) (swarm.Task, []byte, error) { if taskID == "" { return swarm.Task{}, nil, objectNotFoundError{object: "task", id: taskID} diff --git a/vendor/github.com/docker/docker/client/volume_list.go b/vendor/github.com/docker/docker/client/volume_list.go index 2380d5638215..942498dde2c7 100644 --- a/vendor/github.com/docker/docker/client/volume_list.go +++ b/vendor/github.com/docker/docker/client/volume_list.go @@ -15,6 +15,7 @@ func (cli *Client) VolumeList(ctx context.Context, filter filters.Args) (volumet query := url.Values{} if filter.Len() > 0 { + //nolint:staticcheck // ignore SA1019 for old code filterJSON, err := filters.ToParamWithVersion(cli.version, filter) if err != nil { return volumes, err diff --git a/vendor/github.com/docker/docker/errdefs/helpers.go b/vendor/github.com/docker/docker/errdefs/helpers.go index c9916e01354e..fe06fb6f703b 100644 --- a/vendor/github.com/docker/docker/errdefs/helpers.go +++ b/vendor/github.com/docker/docker/errdefs/helpers.go @@ -10,6 +10,10 @@ func (e errNotFound) Cause() error { return e.error } +func (e errNotFound) Unwrap() error { + return e.error +} + // NotFound is a helper to create an error of the class with the same name from any error type func NotFound(err error) error { if err == nil || IsNotFound(err) { @@ -26,6 +30,10 @@ func (e errInvalidParameter) Cause() error { return e.error } +func (e errInvalidParameter) Unwrap() error { + return e.error +} + // InvalidParameter is a helper to create an error of the class with the same name from any error type func InvalidParameter(err error) error { if err == nil || IsInvalidParameter(err) { @@ -42,6 +50,10 @@ func (e errConflict) Cause() error { return e.error } +func (e errConflict) Unwrap() error { + return e.error +} + // Conflict is a helper to create an error of the class with the same name from any error type func Conflict(err error) error { if err == nil || IsConflict(err) { @@ -58,6 +70,10 @@ func (e errUnauthorized) Cause() error { return e.error } +func (e errUnauthorized) Unwrap() error { + return e.error +} + // Unauthorized is a helper to create an error of the class with the same name from any error type func Unauthorized(err error) error { if err == nil || IsUnauthorized(err) { @@ -74,6 +90,10 @@ func (e errUnavailable) Cause() error { return e.error } +func (e errUnavailable) Unwrap() error { + return e.error +} + // Unavailable is a helper to create an error of the class with the same name from any error type func Unavailable(err error) error { if err == nil || IsUnavailable(err) { @@ -90,6 +110,10 @@ func (e errForbidden) Cause() error { return e.error } +func (e errForbidden) Unwrap() error { + return e.error +} + // Forbidden is a helper to create an error of the class with the same name from any error type func Forbidden(err error) error { if err == nil || IsForbidden(err) { @@ -106,6 +130,10 @@ func (e errSystem) Cause() error { return e.error } +func (e errSystem) Unwrap() error { + return e.error +} + // System is a helper to create an error of the class with the same name from any error type func System(err error) error { if err == nil || IsSystem(err) { @@ -122,6 +150,10 @@ func (e errNotModified) Cause() error { return e.error } +func (e errNotModified) Unwrap() error { + return e.error +} + // NotModified is a helper to create an error of the class with the same name from any error type func NotModified(err error) error { if err == nil || IsNotModified(err) { @@ -138,6 +170,10 @@ func (e errNotImplemented) Cause() error { return e.error } +func (e errNotImplemented) Unwrap() error { + return e.error +} + // NotImplemented is a helper to create an error of the class with the same name from any error type func NotImplemented(err error) error { if err == nil || IsNotImplemented(err) { @@ -154,6 +190,10 @@ func (e errUnknown) Cause() error { return e.error } +func (e errUnknown) Unwrap() error { + return e.error +} + // Unknown is a helper to create an error of the class with the same name from any error type func Unknown(err error) error { if err == nil || IsUnknown(err) { @@ -170,6 +210,10 @@ func (e errCancelled) Cause() error { return e.error } +func (e errCancelled) Unwrap() error { + return e.error +} + // Cancelled is a helper to create an error of the class with the same name from any error type func Cancelled(err error) error { if err == nil || IsCancelled(err) { @@ -186,6 +230,10 @@ func (e errDeadline) Cause() error { return e.error } +func (e errDeadline) Unwrap() error { + return e.error +} + // Deadline is a helper to create an error of the class with the same name from any error type func Deadline(err error) error { if err == nil || IsDeadline(err) { @@ -202,6 +250,10 @@ func (e errDataLoss) Cause() error { return e.error } +func (e errDataLoss) Unwrap() error { + return e.error +} + // DataLoss is a helper to create an error of the class with the same name from any error type func DataLoss(err error) error { if err == nil || IsDataLoss(err) { diff --git a/vendor/github.com/docker/docker/opts/address_pools.go b/vendor/github.com/docker/docker/opts/address_pools.go deleted file mode 100644 index 9b27a62853c6..000000000000 --- a/vendor/github.com/docker/docker/opts/address_pools.go +++ /dev/null @@ -1,84 +0,0 @@ -package opts - -import ( - "encoding/csv" - "encoding/json" - "fmt" - "strconv" - "strings" - - types "github.com/docker/libnetwork/ipamutils" -) - -// PoolsOpt is a Value type for parsing the default address pools definitions -type PoolsOpt struct { - values []*types.NetworkToSplit -} - -// UnmarshalJSON fills values structure info from JSON input -func (p *PoolsOpt) UnmarshalJSON(raw []byte) error { - return json.Unmarshal(raw, &(p.values)) -} - -// Set predefined pools -func (p *PoolsOpt) Set(value string) error { - csvReader := csv.NewReader(strings.NewReader(value)) - fields, err := csvReader.Read() - if err != nil { - return err - } - - poolsDef := types.NetworkToSplit{} - - for _, field := range fields { - parts := strings.SplitN(field, "=", 2) - if len(parts) != 2 { - return fmt.Errorf("invalid field '%s' must be a key=value pair", field) - } - - key := strings.ToLower(parts[0]) - value := strings.ToLower(parts[1]) - - switch key { - case "base": - poolsDef.Base = value - case "size": - size, err := strconv.Atoi(value) - if err != nil { - return fmt.Errorf("invalid size value: %q (must be integer): %v", value, err) - } - poolsDef.Size = size - default: - return fmt.Errorf("unexpected key '%s' in '%s'", key, field) - } - } - - p.values = append(p.values, &poolsDef) - - return nil -} - -// Type returns the type of this option -func (p *PoolsOpt) Type() string { - return "pool-options" -} - -// String returns a string repr of this option -func (p *PoolsOpt) String() string { - var pools []string - for _, pool := range p.values { - repr := fmt.Sprintf("%s %d", pool.Base, pool.Size) - pools = append(pools, repr) - } - return strings.Join(pools, ", ") -} - -// Value returns the mounts -func (p *PoolsOpt) Value() []*types.NetworkToSplit { - return p.values -} - -// Name returns the flag name of this option -func (p *PoolsOpt) Name() string { - return "default-address-pools" -} diff --git a/vendor/github.com/docker/docker/opts/env.go b/vendor/github.com/docker/docker/opts/env.go deleted file mode 100644 index f6e5e9074d67..000000000000 --- a/vendor/github.com/docker/docker/opts/env.go +++ /dev/null @@ -1,48 +0,0 @@ -package opts // import "github.com/docker/docker/opts" - -import ( - "fmt" - "os" - "runtime" - "strings" - - "github.com/pkg/errors" -) - -// ValidateEnv validates an environment variable and returns it. -// If no value is specified, it returns the current value using os.Getenv. -// -// As on ParseEnvFile and related to #16585, environment variable names -// are not validate what so ever, it's up to application inside docker -// to validate them or not. -// -// The only validation here is to check if name is empty, per #25099 -func ValidateEnv(val string) (string, error) { - arr := strings.Split(val, "=") - if arr[0] == "" { - return "", errors.Errorf("invalid environment variable: %s", val) - } - if len(arr) > 1 { - return val, nil - } - if !doesEnvExist(val) { - return val, nil - } - return fmt.Sprintf("%s=%s", val, os.Getenv(val)), nil -} - -func doesEnvExist(name string) bool { - for _, entry := range os.Environ() { - parts := strings.SplitN(entry, "=", 2) - if runtime.GOOS == "windows" { - // Environment variable are case-insensitive on Windows. PaTh, path and PATH are equivalent. - if strings.EqualFold(parts[0], name) { - return true - } - } - if parts[0] == name { - return true - } - } - return false -} diff --git a/vendor/github.com/docker/docker/opts/hosts.go b/vendor/github.com/docker/docker/opts/hosts.go deleted file mode 100644 index a6f2662df088..000000000000 --- a/vendor/github.com/docker/docker/opts/hosts.go +++ /dev/null @@ -1,176 +0,0 @@ -package opts // import "github.com/docker/docker/opts" - -import ( - "fmt" - "net" - "net/url" - "path/filepath" - "strconv" - "strings" - - "github.com/docker/docker/pkg/homedir" -) - -var ( - // DefaultHTTPPort Default HTTP Port used if only the protocol is provided to -H flag e.g. dockerd -H tcp:// - // These are the IANA registered port numbers for use with Docker - // see http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml?search=docker - DefaultHTTPPort = 2375 // Default HTTP Port - // DefaultTLSHTTPPort Default HTTP Port used when TLS enabled - DefaultTLSHTTPPort = 2376 // Default TLS encrypted HTTP Port - // DefaultUnixSocket Path for the unix socket. - // Docker daemon by default always listens on the default unix socket - DefaultUnixSocket = "/var/run/docker.sock" - // DefaultTCPHost constant defines the default host string used by docker on Windows - DefaultTCPHost = fmt.Sprintf("tcp://%s:%d", DefaultHTTPHost, DefaultHTTPPort) - // DefaultTLSHost constant defines the default host string used by docker for TLS sockets - DefaultTLSHost = fmt.Sprintf("tcp://%s:%d", DefaultHTTPHost, DefaultTLSHTTPPort) - // DefaultNamedPipe defines the default named pipe used by docker on Windows - DefaultNamedPipe = `//./pipe/docker_engine` -) - -// ValidateHost validates that the specified string is a valid host and returns it. -func ValidateHost(val string) (string, error) { - host := strings.TrimSpace(val) - // The empty string means default and is not handled by parseDaemonHost - if host != "" { - _, err := parseDaemonHost(host) - if err != nil { - return val, err - } - } - // Note: unlike most flag validators, we don't return the mutated value here - // we need to know what the user entered later (using ParseHost) to adjust for TLS - return val, nil -} - -// ParseHost and set defaults for a Daemon host string. -// defaultToTLS is preferred over defaultToUnixXDG. -func ParseHost(defaultToTLS, defaultToUnixXDG bool, val string) (string, error) { - host := strings.TrimSpace(val) - if host == "" { - if defaultToTLS { - host = DefaultTLSHost - } else if defaultToUnixXDG { - runtimeDir, err := homedir.GetRuntimeDir() - if err != nil { - return "", err - } - socket := filepath.Join(runtimeDir, "docker.sock") - host = "unix://" + socket - } else { - host = DefaultHost - } - } else { - var err error - host, err = parseDaemonHost(host) - if err != nil { - return val, err - } - } - return host, nil -} - -// parseDaemonHost parses the specified address and returns an address that will be used as the host. -// Depending of the address specified, this may return one of the global Default* strings defined in hosts.go. -func parseDaemonHost(addr string) (string, error) { - addrParts := strings.SplitN(addr, "://", 2) - if len(addrParts) == 1 && addrParts[0] != "" { - addrParts = []string{"tcp", addrParts[0]} - } - - switch addrParts[0] { - case "tcp": - return ParseTCPAddr(addrParts[1], DefaultTCPHost) - case "unix": - return parseSimpleProtoAddr("unix", addrParts[1], DefaultUnixSocket) - case "npipe": - return parseSimpleProtoAddr("npipe", addrParts[1], DefaultNamedPipe) - case "fd": - return addr, nil - default: - return "", fmt.Errorf("Invalid bind address format: %s", addr) - } -} - -// parseSimpleProtoAddr parses and validates that the specified address is a valid -// socket address for simple protocols like unix and npipe. It returns a formatted -// socket address, either using the address parsed from addr, or the contents of -// defaultAddr if addr is a blank string. -func parseSimpleProtoAddr(proto, addr, defaultAddr string) (string, error) { - addr = strings.TrimPrefix(addr, proto+"://") - if strings.Contains(addr, "://") { - return "", fmt.Errorf("Invalid proto, expected %s: %s", proto, addr) - } - if addr == "" { - addr = defaultAddr - } - return fmt.Sprintf("%s://%s", proto, addr), nil -} - -// ParseTCPAddr parses and validates that the specified address is a valid TCP -// address. It returns a formatted TCP address, either using the address parsed -// from tryAddr, or the contents of defaultAddr if tryAddr is a blank string. -// tryAddr is expected to have already been Trim()'d -// defaultAddr must be in the full `tcp://host:port` form -func ParseTCPAddr(tryAddr string, defaultAddr string) (string, error) { - if tryAddr == "" || tryAddr == "tcp://" { - return defaultAddr, nil - } - addr := strings.TrimPrefix(tryAddr, "tcp://") - if strings.Contains(addr, "://") || addr == "" { - return "", fmt.Errorf("Invalid proto, expected tcp: %s", tryAddr) - } - - defaultAddr = strings.TrimPrefix(defaultAddr, "tcp://") - defaultHost, defaultPort, err := net.SplitHostPort(defaultAddr) - if err != nil { - return "", err - } - // url.Parse fails for trailing colon on IPv6 brackets on Go 1.5, but - // not 1.4. See https://github.com/golang/go/issues/12200 and - // https://github.com/golang/go/issues/6530. - if strings.HasSuffix(addr, "]:") { - addr += defaultPort - } - - u, err := url.Parse("tcp://" + addr) - if err != nil { - return "", err - } - host, port, err := net.SplitHostPort(u.Host) - if err != nil { - // try port addition once - host, port, err = net.SplitHostPort(net.JoinHostPort(u.Host, defaultPort)) - } - if err != nil { - return "", fmt.Errorf("Invalid bind address format: %s", tryAddr) - } - - if host == "" { - host = defaultHost - } - if port == "" { - port = defaultPort - } - p, err := strconv.Atoi(port) - if err != nil && p == 0 { - return "", fmt.Errorf("Invalid bind address format: %s", tryAddr) - } - - return fmt.Sprintf("tcp://%s%s", net.JoinHostPort(host, port), u.Path), nil -} - -// ValidateExtraHost validates that the specified string is a valid extrahost and returns it. -// ExtraHost is in the form of name:ip where the ip has to be a valid ip (IPv4 or IPv6). -func ValidateExtraHost(val string) (string, error) { - // allow for IPv6 addresses in extra hosts by only splitting on first ":" - arr := strings.SplitN(val, ":", 2) - if len(arr) != 2 || len(arr[0]) == 0 { - return "", fmt.Errorf("bad format for add-host: %q", val) - } - if _, err := ValidateIPAddress(arr[1]); err != nil { - return "", fmt.Errorf("invalid IP address in add-host: %q", arr[1]) - } - return val, nil -} diff --git a/vendor/github.com/docker/docker/opts/hosts_unix.go b/vendor/github.com/docker/docker/opts/hosts_unix.go deleted file mode 100644 index 9d5bb64565e5..000000000000 --- a/vendor/github.com/docker/docker/opts/hosts_unix.go +++ /dev/null @@ -1,8 +0,0 @@ -// +build !windows - -package opts // import "github.com/docker/docker/opts" - -import "fmt" - -// DefaultHost constant defines the default host string used by docker on other hosts than Windows -var DefaultHost = fmt.Sprintf("unix://%s", DefaultUnixSocket) diff --git a/vendor/github.com/docker/docker/opts/hosts_windows.go b/vendor/github.com/docker/docker/opts/hosts_windows.go deleted file mode 100644 index 906eba53ee2a..000000000000 --- a/vendor/github.com/docker/docker/opts/hosts_windows.go +++ /dev/null @@ -1,4 +0,0 @@ -package opts // import "github.com/docker/docker/opts" - -// DefaultHost constant defines the default host string used by docker on Windows -var DefaultHost = "npipe://" + DefaultNamedPipe diff --git a/vendor/github.com/docker/docker/opts/ip.go b/vendor/github.com/docker/docker/opts/ip.go deleted file mode 100644 index cfbff3a9fd61..000000000000 --- a/vendor/github.com/docker/docker/opts/ip.go +++ /dev/null @@ -1,47 +0,0 @@ -package opts // import "github.com/docker/docker/opts" - -import ( - "fmt" - "net" -) - -// IPOpt holds an IP. It is used to store values from CLI flags. -type IPOpt struct { - *net.IP -} - -// NewIPOpt creates a new IPOpt from a reference net.IP and a -// string representation of an IP. If the string is not a valid -// IP it will fallback to the specified reference. -func NewIPOpt(ref *net.IP, defaultVal string) *IPOpt { - o := &IPOpt{ - IP: ref, - } - o.Set(defaultVal) - return o -} - -// Set sets an IPv4 or IPv6 address from a given string. If the given -// string is not parsable as an IP address it returns an error. -func (o *IPOpt) Set(val string) error { - ip := net.ParseIP(val) - if ip == nil { - return fmt.Errorf("%s is not an ip address", val) - } - *o.IP = ip - return nil -} - -// String returns the IP address stored in the IPOpt. If stored IP is a -// nil pointer, it returns an empty string. -func (o *IPOpt) String() string { - if *o.IP == nil { - return "" - } - return o.IP.String() -} - -// Type returns the type of the option -func (o *IPOpt) Type() string { - return "ip" -} diff --git a/vendor/github.com/docker/docker/opts/opts.go b/vendor/github.com/docker/docker/opts/opts.go deleted file mode 100644 index de8aacb806d7..000000000000 --- a/vendor/github.com/docker/docker/opts/opts.go +++ /dev/null @@ -1,337 +0,0 @@ -package opts // import "github.com/docker/docker/opts" - -import ( - "fmt" - "net" - "path" - "regexp" - "strings" - - "github.com/docker/go-units" -) - -var ( - alphaRegexp = regexp.MustCompile(`[a-zA-Z]`) - domainRegexp = regexp.MustCompile(`^(:?(:?[a-zA-Z0-9]|(:?[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9]))(:?\.(:?[a-zA-Z0-9]|(:?[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])))*)\.?\s*$`) -) - -// ListOpts holds a list of values and a validation function. -type ListOpts struct { - values *[]string - validator ValidatorFctType -} - -// NewListOpts creates a new ListOpts with the specified validator. -func NewListOpts(validator ValidatorFctType) ListOpts { - var values []string - return *NewListOptsRef(&values, validator) -} - -// NewListOptsRef creates a new ListOpts with the specified values and validator. -func NewListOptsRef(values *[]string, validator ValidatorFctType) *ListOpts { - return &ListOpts{ - values: values, - validator: validator, - } -} - -func (opts *ListOpts) String() string { - if len(*opts.values) == 0 { - return "" - } - return fmt.Sprintf("%v", *opts.values) -} - -// Set validates if needed the input value and adds it to the -// internal slice. -func (opts *ListOpts) Set(value string) error { - if opts.validator != nil { - v, err := opts.validator(value) - if err != nil { - return err - } - value = v - } - *opts.values = append(*opts.values, value) - return nil -} - -// Delete removes the specified element from the slice. -func (opts *ListOpts) Delete(key string) { - for i, k := range *opts.values { - if k == key { - *opts.values = append((*opts.values)[:i], (*opts.values)[i+1:]...) - return - } - } -} - -// GetMap returns the content of values in a map in order to avoid -// duplicates. -func (opts *ListOpts) GetMap() map[string]struct{} { - ret := make(map[string]struct{}) - for _, k := range *opts.values { - ret[k] = struct{}{} - } - return ret -} - -// GetAll returns the values of slice. -func (opts *ListOpts) GetAll() []string { - return *opts.values -} - -// GetAllOrEmpty returns the values of the slice -// or an empty slice when there are no values. -func (opts *ListOpts) GetAllOrEmpty() []string { - v := *opts.values - if v == nil { - return make([]string, 0) - } - return v -} - -// Get checks the existence of the specified key. -func (opts *ListOpts) Get(key string) bool { - for _, k := range *opts.values { - if k == key { - return true - } - } - return false -} - -// Len returns the amount of element in the slice. -func (opts *ListOpts) Len() int { - return len(*opts.values) -} - -// Type returns a string name for this Option type -func (opts *ListOpts) Type() string { - return "list" -} - -// WithValidator returns the ListOpts with validator set. -func (opts *ListOpts) WithValidator(validator ValidatorFctType) *ListOpts { - opts.validator = validator - return opts -} - -// NamedOption is an interface that list and map options -// with names implement. -type NamedOption interface { - Name() string -} - -// NamedListOpts is a ListOpts with a configuration name. -// This struct is useful to keep reference to the assigned -// field name in the internal configuration struct. -type NamedListOpts struct { - name string - ListOpts -} - -var _ NamedOption = &NamedListOpts{} - -// NewNamedListOptsRef creates a reference to a new NamedListOpts struct. -func NewNamedListOptsRef(name string, values *[]string, validator ValidatorFctType) *NamedListOpts { - return &NamedListOpts{ - name: name, - ListOpts: *NewListOptsRef(values, validator), - } -} - -// Name returns the name of the NamedListOpts in the configuration. -func (o *NamedListOpts) Name() string { - return o.name -} - -// MapOpts holds a map of values and a validation function. -type MapOpts struct { - values map[string]string - validator ValidatorFctType -} - -// Set validates if needed the input value and add it to the -// internal map, by splitting on '='. -func (opts *MapOpts) Set(value string) error { - if opts.validator != nil { - v, err := opts.validator(value) - if err != nil { - return err - } - value = v - } - vals := strings.SplitN(value, "=", 2) - if len(vals) == 1 { - (opts.values)[vals[0]] = "" - } else { - (opts.values)[vals[0]] = vals[1] - } - return nil -} - -// GetAll returns the values of MapOpts as a map. -func (opts *MapOpts) GetAll() map[string]string { - return opts.values -} - -func (opts *MapOpts) String() string { - return fmt.Sprintf("%v", opts.values) -} - -// Type returns a string name for this Option type -func (opts *MapOpts) Type() string { - return "map" -} - -// NewMapOpts creates a new MapOpts with the specified map of values and a validator. -func NewMapOpts(values map[string]string, validator ValidatorFctType) *MapOpts { - if values == nil { - values = make(map[string]string) - } - return &MapOpts{ - values: values, - validator: validator, - } -} - -// NamedMapOpts is a MapOpts struct with a configuration name. -// This struct is useful to keep reference to the assigned -// field name in the internal configuration struct. -type NamedMapOpts struct { - name string - MapOpts -} - -var _ NamedOption = &NamedMapOpts{} - -// NewNamedMapOpts creates a reference to a new NamedMapOpts struct. -func NewNamedMapOpts(name string, values map[string]string, validator ValidatorFctType) *NamedMapOpts { - return &NamedMapOpts{ - name: name, - MapOpts: *NewMapOpts(values, validator), - } -} - -// Name returns the name of the NamedMapOpts in the configuration. -func (o *NamedMapOpts) Name() string { - return o.name -} - -// ValidatorFctType defines a validator function that returns a validated string and/or an error. -type ValidatorFctType func(val string) (string, error) - -// ValidatorFctListType defines a validator function that returns a validated list of string and/or an error -type ValidatorFctListType func(val string) ([]string, error) - -// ValidateIPAddress validates an Ip address. -func ValidateIPAddress(val string) (string, error) { - var ip = net.ParseIP(strings.TrimSpace(val)) - if ip != nil { - return ip.String(), nil - } - return "", fmt.Errorf("%s is not an ip address", val) -} - -// ValidateDNSSearch validates domain for resolvconf search configuration. -// A zero length domain is represented by a dot (.). -func ValidateDNSSearch(val string) (string, error) { - if val = strings.Trim(val, " "); val == "." { - return val, nil - } - return validateDomain(val) -} - -func validateDomain(val string) (string, error) { - if alphaRegexp.FindString(val) == "" { - return "", fmt.Errorf("%s is not a valid domain", val) - } - ns := domainRegexp.FindSubmatch([]byte(val)) - if len(ns) > 0 && len(ns[1]) < 255 { - return string(ns[1]), nil - } - return "", fmt.Errorf("%s is not a valid domain", val) -} - -// ValidateLabel validates that the specified string is a valid label, and returns it. -// Labels are in the form on key=value. -func ValidateLabel(val string) (string, error) { - if strings.Count(val, "=") < 1 { - return "", fmt.Errorf("bad attribute format: %s", val) - } - return val, nil -} - -// ValidateSingleGenericResource validates that a single entry in the -// generic resource list is valid. -// i.e 'GPU=UID1' is valid however 'GPU:UID1' or 'UID1' isn't -func ValidateSingleGenericResource(val string) (string, error) { - if strings.Count(val, "=") < 1 { - return "", fmt.Errorf("invalid node-generic-resource format `%s` expected `name=value`", val) - } - return val, nil -} - -// ParseLink parses and validates the specified string as a link format (name:alias) -func ParseLink(val string) (string, string, error) { - if val == "" { - return "", "", fmt.Errorf("empty string specified for links") - } - arr := strings.Split(val, ":") - if len(arr) > 2 { - return "", "", fmt.Errorf("bad format for links: %s", val) - } - if len(arr) == 1 { - return val, val, nil - } - // This is kept because we can actually get a HostConfig with links - // from an already created container and the format is not `foo:bar` - // but `/foo:/c1/bar` - if strings.HasPrefix(arr[0], "/") { - _, alias := path.Split(arr[1]) - return arr[0][1:], alias, nil - } - return arr[0], arr[1], nil -} - -// MemBytes is a type for human readable memory bytes (like 128M, 2g, etc) -type MemBytes int64 - -// String returns the string format of the human readable memory bytes -func (m *MemBytes) String() string { - // NOTE: In spf13/pflag/flag.go, "0" is considered as "zero value" while "0 B" is not. - // We return "0" in case value is 0 here so that the default value is hidden. - // (Sometimes "default 0 B" is actually misleading) - if m.Value() != 0 { - return units.BytesSize(float64(m.Value())) - } - return "0" -} - -// Set sets the value of the MemBytes by passing a string -func (m *MemBytes) Set(value string) error { - val, err := units.RAMInBytes(value) - *m = MemBytes(val) - return err -} - -// Type returns the type -func (m *MemBytes) Type() string { - return "bytes" -} - -// Value returns the value in int64 -func (m *MemBytes) Value() int64 { - return int64(*m) -} - -// UnmarshalJSON is the customized unmarshaler for MemBytes -func (m *MemBytes) UnmarshalJSON(s []byte) error { - if len(s) <= 2 || s[0] != '"' || s[len(s)-1] != '"' { - return fmt.Errorf("invalid size: %q", s) - } - val, err := units.RAMInBytes(string(s[1 : len(s)-1])) - *m = MemBytes(val) - return err -} diff --git a/vendor/github.com/docker/docker/opts/opts_unix.go b/vendor/github.com/docker/docker/opts/opts_unix.go deleted file mode 100644 index 0c32367cb22d..000000000000 --- a/vendor/github.com/docker/docker/opts/opts_unix.go +++ /dev/null @@ -1,6 +0,0 @@ -// +build !windows - -package opts // import "github.com/docker/docker/opts" - -// DefaultHTTPHost Default HTTP Host used if only port is provided to -H flag e.g. dockerd -H tcp://:8080 -const DefaultHTTPHost = "localhost" diff --git a/vendor/github.com/docker/docker/opts/opts_windows.go b/vendor/github.com/docker/docker/opts/opts_windows.go deleted file mode 100644 index 0e1b6c6d18e8..000000000000 --- a/vendor/github.com/docker/docker/opts/opts_windows.go +++ /dev/null @@ -1,56 +0,0 @@ -package opts // import "github.com/docker/docker/opts" - -// TODO Windows. Identify bug in GOLang 1.5.1+ and/or Windows Server 2016 TP5. -// @jhowardmsft, @swernli. -// -// On Windows, this mitigates a problem with the default options of running -// a docker client against a local docker daemon on TP5. -// -// What was found that if the default host is "localhost", even if the client -// (and daemon as this is local) is not physically on a network, and the DNS -// cache is flushed (ipconfig /flushdns), then the client will pause for -// exactly one second when connecting to the daemon for calls. For example -// using docker run windowsservercore cmd, the CLI will send a create followed -// by an attach. You see the delay between the attach finishing and the attach -// being seen by the daemon. -// -// Here's some daemon debug logs with additional debug spew put in. The -// AfterWriteJSON log is the very last thing the daemon does as part of the -// create call. The POST /attach is the second CLI call. Notice the second -// time gap. -// -// time="2015-11-06T13:38:37.259627400-08:00" level=debug msg="After createRootfs" -// time="2015-11-06T13:38:37.263626300-08:00" level=debug msg="After setHostConfig" -// time="2015-11-06T13:38:37.267631200-08:00" level=debug msg="before createContainerPl...." -// time="2015-11-06T13:38:37.271629500-08:00" level=debug msg=ToDiskLocking.... -// time="2015-11-06T13:38:37.275643200-08:00" level=debug msg="loggin event...." -// time="2015-11-06T13:38:37.277627600-08:00" level=debug msg="logged event...." -// time="2015-11-06T13:38:37.279631800-08:00" level=debug msg="In defer func" -// time="2015-11-06T13:38:37.282628100-08:00" level=debug msg="After daemon.create" -// time="2015-11-06T13:38:37.286651700-08:00" level=debug msg="return 2" -// time="2015-11-06T13:38:37.289629500-08:00" level=debug msg="Returned from daemon.ContainerCreate" -// time="2015-11-06T13:38:37.311629100-08:00" level=debug msg="After WriteJSON" -// ... 1 second gap here.... -// time="2015-11-06T13:38:38.317866200-08:00" level=debug msg="Calling POST /v1.22/containers/984758282b842f779e805664b2c95d563adc9a979c8a3973e68c807843ee4757/attach" -// time="2015-11-06T13:38:38.326882500-08:00" level=info msg="POST /v1.22/containers/984758282b842f779e805664b2c95d563adc9a979c8a3973e68c807843ee4757/attach?stderr=1&stdin=1&stdout=1&stream=1" -// -// We suspect this is either a bug introduced in GOLang 1.5.1, or that a change -// in GOLang 1.5.1 (from 1.4.3) is exposing a bug in Windows. In theory, -// the Windows networking stack is supposed to resolve "localhost" internally, -// without hitting DNS, or even reading the hosts file (which is why localhost -// is commented out in the hosts file on Windows). -// -// We have validated that working around this using the actual IPv4 localhost -// address does not cause the delay. -// -// This does not occur with the docker client built with 1.4.3 on the same -// Windows build, regardless of whether the daemon is built using 1.5.1 -// or 1.4.3. It does not occur on Linux. We also verified we see the same thing -// on a cross-compiled Windows binary (from Linux). -// -// Final note: This is a mitigation, not a 'real' fix. It is still susceptible -// to the delay if a user were to do 'docker run -H=tcp://localhost:2375...' -// explicitly. - -// DefaultHTTPHost Default HTTP Host used if only port is provided to -H flag e.g. dockerd -H tcp://:8080 -const DefaultHTTPHost = "127.0.0.1" diff --git a/vendor/github.com/docker/docker/opts/quotedstring.go b/vendor/github.com/docker/docker/opts/quotedstring.go deleted file mode 100644 index 6c889070e825..000000000000 --- a/vendor/github.com/docker/docker/opts/quotedstring.go +++ /dev/null @@ -1,37 +0,0 @@ -package opts // import "github.com/docker/docker/opts" - -// QuotedString is a string that may have extra quotes around the value. The -// quotes are stripped from the value. -type QuotedString struct { - value *string -} - -// Set sets a new value -func (s *QuotedString) Set(val string) error { - *s.value = trimQuotes(val) - return nil -} - -// Type returns the type of the value -func (s *QuotedString) Type() string { - return "string" -} - -func (s *QuotedString) String() string { - return *s.value -} - -func trimQuotes(value string) string { - lastIndex := len(value) - 1 - for _, char := range []byte{'\'', '"'} { - if value[0] == char && value[lastIndex] == char { - return value[1:lastIndex] - } - } - return value -} - -// NewQuotedString returns a new quoted string option -func NewQuotedString(value *string) *QuotedString { - return &QuotedString{value: value} -} diff --git a/vendor/github.com/docker/docker/opts/runtime.go b/vendor/github.com/docker/docker/opts/runtime.go deleted file mode 100644 index 4b9babf0a5c7..000000000000 --- a/vendor/github.com/docker/docker/opts/runtime.go +++ /dev/null @@ -1,79 +0,0 @@ -package opts // import "github.com/docker/docker/opts" - -import ( - "fmt" - "strings" - - "github.com/docker/docker/api/types" -) - -// RuntimeOpt defines a map of Runtimes -type RuntimeOpt struct { - name string - stockRuntimeName string - values *map[string]types.Runtime -} - -// NewNamedRuntimeOpt creates a new RuntimeOpt -func NewNamedRuntimeOpt(name string, ref *map[string]types.Runtime, stockRuntime string) *RuntimeOpt { - if ref == nil { - ref = &map[string]types.Runtime{} - } - return &RuntimeOpt{name: name, values: ref, stockRuntimeName: stockRuntime} -} - -// Name returns the name of the NamedListOpts in the configuration. -func (o *RuntimeOpt) Name() string { - return o.name -} - -// Set validates and updates the list of Runtimes -func (o *RuntimeOpt) Set(val string) error { - parts := strings.SplitN(val, "=", 2) - if len(parts) != 2 { - return fmt.Errorf("invalid runtime argument: %s", val) - } - - parts[0] = strings.TrimSpace(parts[0]) - parts[1] = strings.TrimSpace(parts[1]) - if parts[0] == "" || parts[1] == "" { - return fmt.Errorf("invalid runtime argument: %s", val) - } - - parts[0] = strings.ToLower(parts[0]) - if parts[0] == o.stockRuntimeName { - return fmt.Errorf("runtime name '%s' is reserved", o.stockRuntimeName) - } - - if _, ok := (*o.values)[parts[0]]; ok { - return fmt.Errorf("runtime '%s' was already defined", parts[0]) - } - - (*o.values)[parts[0]] = types.Runtime{Path: parts[1]} - - return nil -} - -// String returns Runtime values as a string. -func (o *RuntimeOpt) String() string { - var out []string - for k := range *o.values { - out = append(out, k) - } - - return fmt.Sprintf("%v", out) -} - -// GetMap returns a map of Runtimes (name: path) -func (o *RuntimeOpt) GetMap() map[string]types.Runtime { - if o.values != nil { - return *o.values - } - - return map[string]types.Runtime{} -} - -// Type returns the type of the option -func (o *RuntimeOpt) Type() string { - return "runtime" -} diff --git a/vendor/github.com/docker/docker/opts/ulimit.go b/vendor/github.com/docker/docker/opts/ulimit.go deleted file mode 100644 index 0e2a36236c1b..000000000000 --- a/vendor/github.com/docker/docker/opts/ulimit.go +++ /dev/null @@ -1,81 +0,0 @@ -package opts // import "github.com/docker/docker/opts" - -import ( - "fmt" - - "github.com/docker/go-units" -) - -// UlimitOpt defines a map of Ulimits -type UlimitOpt struct { - values *map[string]*units.Ulimit -} - -// NewUlimitOpt creates a new UlimitOpt -func NewUlimitOpt(ref *map[string]*units.Ulimit) *UlimitOpt { - if ref == nil { - ref = &map[string]*units.Ulimit{} - } - return &UlimitOpt{ref} -} - -// Set validates a Ulimit and sets its name as a key in UlimitOpt -func (o *UlimitOpt) Set(val string) error { - l, err := units.ParseUlimit(val) - if err != nil { - return err - } - - (*o.values)[l.Name] = l - - return nil -} - -// String returns Ulimit values as a string. -func (o *UlimitOpt) String() string { - var out []string - for _, v := range *o.values { - out = append(out, v.String()) - } - - return fmt.Sprintf("%v", out) -} - -// GetList returns a slice of pointers to Ulimits. -func (o *UlimitOpt) GetList() []*units.Ulimit { - var ulimits []*units.Ulimit - for _, v := range *o.values { - ulimits = append(ulimits, v) - } - - return ulimits -} - -// Type returns the option type -func (o *UlimitOpt) Type() string { - return "ulimit" -} - -// NamedUlimitOpt defines a named map of Ulimits -type NamedUlimitOpt struct { - name string - UlimitOpt -} - -var _ NamedOption = &NamedUlimitOpt{} - -// NewNamedUlimitOpt creates a new NamedUlimitOpt -func NewNamedUlimitOpt(name string, ref *map[string]*units.Ulimit) *NamedUlimitOpt { - if ref == nil { - ref = &map[string]*units.Ulimit{} - } - return &NamedUlimitOpt{ - name: name, - UlimitOpt: *NewUlimitOpt(ref), - } -} - -// Name returns the option name -func (o *NamedUlimitOpt) Name() string { - return o.name -} diff --git a/vendor/github.com/docker/docker/pkg/archive/archive.go b/vendor/github.com/docker/docker/pkg/archive/archive.go index bb623fa85648..134749d684f6 100644 --- a/vendor/github.com/docker/docker/pkg/archive/archive.go +++ b/vendor/github.com/docker/docker/pkg/archive/archive.go @@ -11,7 +11,6 @@ import ( "io" "io/ioutil" "os" - "os/exec" "path/filepath" "runtime" "strconv" @@ -25,19 +24,9 @@ import ( "github.com/docker/docker/pkg/pools" "github.com/docker/docker/pkg/system" "github.com/sirupsen/logrus" + exec "golang.org/x/sys/execabs" ) -var unpigzPath string - -func init() { - if path, err := exec.LookPath("unpigz"); err != nil { - logrus.Debug("unpigz binary not found in PATH, falling back to go gzip library") - } else { - logrus.Debugf("Using unpigz binary found at path %s", path) - unpigzPath = path - } -} - type ( // Compression is the state represents if compressed or not. Compression int @@ -158,19 +147,30 @@ func xzDecompress(ctx context.Context, archive io.Reader) (io.ReadCloser, error) } func gzDecompress(ctx context.Context, buf io.Reader) (io.ReadCloser, error) { - if unpigzPath == "" { + noPigzEnv := os.Getenv("MOBY_DISABLE_PIGZ") + var noPigz bool + + if noPigzEnv != "" { + var err error + noPigz, err = strconv.ParseBool(noPigzEnv) + if err != nil { + logrus.WithError(err).Warn("invalid value in MOBY_DISABLE_PIGZ env var") + } + } + + if noPigz { + logrus.Debugf("Use of pigz is disabled due to MOBY_DISABLE_PIGZ=%s", noPigzEnv) return gzip.NewReader(buf) } - disablePigzEnv := os.Getenv("MOBY_DISABLE_PIGZ") - if disablePigzEnv != "" { - if disablePigz, err := strconv.ParseBool(disablePigzEnv); err != nil { - return nil, err - } else if disablePigz { - return gzip.NewReader(buf) - } + unpigzPath, err := exec.LookPath("unpigz") + if err != nil { + logrus.Debugf("unpigz binary not found, falling back to go gzip library") + return gzip.NewReader(buf) } + logrus.Debugf("Using %s to decompress", unpigzPath) + return cmdStream(exec.CommandContext(ctx, unpigzPath, "-d", "-c"), buf) } @@ -402,10 +402,24 @@ func fillGo18FileTypeBits(mode int64, fi os.FileInfo) int64 { // ReadSecurityXattrToTarHeader reads security.capability xattr from filesystem // to a tar header func ReadSecurityXattrToTarHeader(path string, hdr *tar.Header) error { + const ( + // Values based on linux/include/uapi/linux/capability.h + xattrCapsSz2 = 20 + versionOffset = 3 + vfsCapRevision2 = 2 + vfsCapRevision3 = 3 + ) capability, _ := system.Lgetxattr(path, "security.capability") if capability != nil { + length := len(capability) + if capability[versionOffset] == vfsCapRevision3 { + // Convert VFS_CAP_REVISION_3 to VFS_CAP_REVISION_2 as root UID makes no + // sense outside the user namespace the archive is built in. + capability[versionOffset] = vfsCapRevision2 + length = xattrCapsSz2 + } hdr.Xattrs = make(map[string]string) - hdr.Xattrs["security.capability"] = string(capability) + hdr.Xattrs["security.capability"] = string(capability[:length]) } return nil } @@ -442,7 +456,7 @@ func newTarAppender(idMapping *idtools.IdentityMapping, writer io.Writer, chownO } // canonicalTarName provides a platform-independent and consistent posix-style -//path for files and directories to be archived regardless of the platform. +// path for files and directories to be archived regardless of the platform. func canonicalTarName(name string, isDir bool) string { name = CanonicalTarNameForPath(name) @@ -495,13 +509,13 @@ func (ta *tarAppender) addTarFile(path, name string) error { } } - //check whether the file is overlayfs whiteout - //if yes, skip re-mapping container ID mappings. + // check whether the file is overlayfs whiteout + // if yes, skip re-mapping container ID mappings. isOverlayWhiteout := fi.Mode()&os.ModeCharDevice != 0 && hdr.Devmajor == 0 && hdr.Devminor == 0 - //handle re-mapping container ID mappings back to host ID mappings before - //writing tar headers/files. We skip whiteout files because they were written - //by the kernel and already have proper ownership relative to the host + // handle re-mapping container ID mappings back to host ID mappings before + // writing tar headers/files. We skip whiteout files because they were written + // by the kernel and already have proper ownership relative to the host if !isOverlayWhiteout && !strings.HasPrefix(filepath.Base(hdr.Name), WhiteoutPrefix) && !ta.IdentityMapping.Empty() { fileIDPair, err := getFileUIDGID(fi.Sys()) if err != nil { @@ -917,6 +931,12 @@ loop: return err } + // ignore XGlobalHeader early to avoid creating parent directories for them + if hdr.Typeflag == tar.TypeXGlobalHeader { + logrus.Debugf("PAX Global Extended Headers found for %s and ignored", hdr.Name) + continue + } + // Normalize name, for safety and for a simple is-root check // This keeps "../" as-is, but normalizes "/../" to "/". Or Windows: // This keeps "..\" as-is, but normalizes "\..\" to "\". @@ -1134,7 +1154,7 @@ func (archiver *Archiver) CopyFileWithTar(src, dst string) (err error) { dst = filepath.Join(dst, filepath.Base(src)) } // Create the holding directory if necessary - if err := system.MkdirAll(filepath.Dir(dst), 0700, ""); err != nil { + if err := system.MkdirAll(filepath.Dir(dst), 0700); err != nil { return err } @@ -1218,6 +1238,9 @@ func cmdStream(cmd *exec.Cmd, input io.Reader) (io.ReadCloser, error) { return nil, err } + // Ensure the command has exited before we clean anything up + done := make(chan struct{}) + // Copy stdout to the returned pipe go func() { if err := cmd.Wait(); err != nil { @@ -1225,9 +1248,16 @@ func cmdStream(cmd *exec.Cmd, input io.Reader) (io.ReadCloser, error) { } else { pipeW.Close() } + close(done) }() - return pipeR, nil + return ioutils.NewReadCloserWrapper(pipeR, func() error { + // Close pipeR, and then wait for the command to complete before returning. We have to close pipeR first, as + // cmd.Wait waits for any non-file stdout/stderr/stdin to close. + err := pipeR.Close() + <-done + return err + }), nil } // NewTempArchive reads the content of src into a temporary file, and returns the contents diff --git a/vendor/github.com/docker/docker/pkg/archive/archive_linux.go b/vendor/github.com/docker/docker/pkg/archive/archive_linux.go index c0f81ac3d68f..f7888e6599db 100644 --- a/vendor/github.com/docker/docker/pkg/archive/archive_linux.go +++ b/vendor/github.com/docker/docker/pkg/archive/archive_linux.go @@ -11,6 +11,7 @@ import ( "github.com/containerd/continuity/fs" "github.com/docker/docker/pkg/system" + "github.com/moby/sys/mount" "github.com/pkg/errors" "golang.org/x/sys/unix" ) @@ -154,9 +155,8 @@ func mknodChar0Overlay(cleansedOriginalPath string) error { // lowerdir needs ":" to be escaped: https://github.com/moby/moby/issues/40939#issuecomment-627098286 lowerEscaped := strings.ReplaceAll(lower, ":", "\\:") mOpts := fmt.Sprintf("lowerdir=%s,upperdir=%s,workdir=%s", lowerEscaped, upper, work) - // docker/pkg/mount.Mount() requires procfs to be mounted. So we use syscall.Mount() directly instead. - if err := syscall.Mount("overlay", merged, "overlay", uintptr(0), mOpts); err != nil { - return errors.Wrapf(err, "failed to mount overlay (%s) on %s", mOpts, merged) + if err := mount.Mount("overlay", merged, "overlay", mOpts); err != nil { + return err } mergedDummy := filepath.Join(merged, dummyBase) if err := os.Remove(mergedDummy); err != nil { @@ -241,9 +241,8 @@ func createDirWithOverlayOpaque(tmp string) (string, error) { // lowerdir needs ":" to be escaped: https://github.com/moby/moby/issues/40939#issuecomment-627098286 lowerEscaped := strings.ReplaceAll(lower, ":", "\\:") mOpts := fmt.Sprintf("lowerdir=%s,upperdir=%s,workdir=%s", lowerEscaped, upper, work) - // docker/pkg/mount.Mount() requires procfs to be mounted. So we use syscall.Mount() directly instead. - if err := syscall.Mount("overlay", merged, "overlay", uintptr(0), mOpts); err != nil { - return "", errors.Wrapf(err, "failed to mount overlay (%s) on %s", mOpts, merged) + if err := mount.Mount("overlay", merged, "overlay", mOpts); err != nil { + return "", err } mergedDummy := filepath.Join(merged, dummyBase) if err := os.Remove(mergedDummy); err != nil { diff --git a/vendor/github.com/docker/docker/pkg/archive/archive_unix.go b/vendor/github.com/docker/docker/pkg/archive/archive_unix.go index d626336032ba..0b92bb0f4a3b 100644 --- a/vendor/github.com/docker/docker/pkg/archive/archive_unix.go +++ b/vendor/github.com/docker/docker/pkg/archive/archive_unix.go @@ -10,9 +10,9 @@ import ( "strings" "syscall" + "github.com/containerd/containerd/sys" "github.com/docker/docker/pkg/idtools" "github.com/docker/docker/pkg/system" - rsystem "github.com/opencontainers/runc/libcontainer/system" "golang.org/x/sys/unix" ) @@ -81,11 +81,6 @@ func getFileUIDGID(stat interface{}) (idtools.Identity, error) { // handleTarTypeBlockCharFifo is an OS-specific helper function used by // createTarFile to handle the following types of header: Block; Char; Fifo func handleTarTypeBlockCharFifo(hdr *tar.Header, path string) error { - if rsystem.RunningInUserNS() { - // cannot create a device if running in user namespace - return nil - } - mode := uint32(hdr.Mode & 07777) switch hdr.Typeflag { case tar.TypeBlock: @@ -96,7 +91,12 @@ func handleTarTypeBlockCharFifo(hdr *tar.Header, path string) error { mode |= unix.S_IFIFO } - return system.Mknod(path, mode, int(system.Mkdev(hdr.Devmajor, hdr.Devminor))) + err := system.Mknod(path, mode, int(system.Mkdev(hdr.Devmajor, hdr.Devminor))) + if errors.Is(err, syscall.EPERM) && sys.RunningInUserNS() { + // In most cases, cannot create a device if running in user namespace + err = nil + } + return err } func handleLChmod(hdr *tar.Header, path string, hdrInfo os.FileInfo) error { diff --git a/vendor/github.com/docker/docker/pkg/archive/archive_windows.go b/vendor/github.com/docker/docker/pkg/archive/archive_windows.go index ae6b89fd719c..7260174bfbb7 100644 --- a/vendor/github.com/docker/docker/pkg/archive/archive_windows.go +++ b/vendor/github.com/docker/docker/pkg/archive/archive_windows.go @@ -31,7 +31,7 @@ func CanonicalTarNameForPath(p string) string { // chmodTarEntry is used to adjust the file permissions used in tar header based // on the platform the archival is done. func chmodTarEntry(perm os.FileMode) os.FileMode { - //perm &= 0755 // this 0-ed out tar flags (like link, regular file, directory marker etc.) + // perm &= 0755 // this 0-ed out tar flags (like link, regular file, directory marker etc.) permPart := perm & os.ModePerm noPermPart := perm &^ os.ModePerm // Add the x bit: make everything +x from windows diff --git a/vendor/github.com/docker/docker/pkg/archive/diff.go b/vendor/github.com/docker/docker/pkg/archive/diff.go index 146e21fe18cf..27897e6ab732 100644 --- a/vendor/github.com/docker/docker/pkg/archive/diff.go +++ b/vendor/github.com/docker/docker/pkg/archive/diff.go @@ -84,7 +84,7 @@ func UnpackLayer(dest string, layer io.Reader, options *TarOptions) (size int64, parentPath := filepath.Join(dest, parent) if _, err := os.Lstat(parentPath); err != nil && os.IsNotExist(err) { - err = system.MkdirAll(parentPath, 0600, "") + err = system.MkdirAll(parentPath, 0600) if err != nil { return 0, err } @@ -196,7 +196,7 @@ func UnpackLayer(dest string, layer io.Reader, options *TarOptions) (size int64, return 0, err } - if err := createTarFile(path, dest, srcHdr, srcData, true, nil, options.InUserNS); err != nil { + if err := createTarFile(path, dest, srcHdr, srcData, !options.NoLchown, nil, options.InUserNS); err != nil { return 0, err } diff --git a/vendor/github.com/docker/docker/pkg/homedir/homedir_linux.go b/vendor/github.com/docker/docker/pkg/homedir/homedir_linux.go index 47ecd0c092b2..5e6310fdcd6b 100644 --- a/vendor/github.com/docker/docker/pkg/homedir/homedir_linux.go +++ b/vendor/github.com/docker/docker/pkg/homedir/homedir_linux.go @@ -5,24 +5,8 @@ import ( "os" "path/filepath" "strings" - - "github.com/docker/docker/pkg/idtools" ) -// GetStatic returns the home directory for the current user without calling -// os/user.Current(). This is useful for static-linked binary on glibc-based -// system, because a call to os/user.Current() in a static binary leads to -// segfault due to a glibc issue that won't be fixed in a short term. -// (#29344, golang/go#13470, https://sourceware.org/bugzilla/show_bug.cgi?id=19341) -func GetStatic() (string, error) { - uid := os.Getuid() - usr, err := idtools.LookupUID(uid) - if err != nil { - return "", err - } - return usr.Home, nil -} - // GetRuntimeDir returns XDG_RUNTIME_DIR. // XDG_RUNTIME_DIR is typically configured via pam_systemd. // GetRuntimeDir returns non-nil error if XDG_RUNTIME_DIR is not set. diff --git a/vendor/github.com/docker/docker/pkg/homedir/homedir_others.go b/vendor/github.com/docker/docker/pkg/homedir/homedir_others.go index f0a363dedf34..67ab9e9b31e0 100644 --- a/vendor/github.com/docker/docker/pkg/homedir/homedir_others.go +++ b/vendor/github.com/docker/docker/pkg/homedir/homedir_others.go @@ -6,12 +6,6 @@ import ( "errors" ) -// GetStatic is not needed for non-linux systems. -// (Precisely, it is needed only for glibc-based linux systems.) -func GetStatic() (string, error) { - return "", errors.New("homedir.GetStatic() is not supported on this system") -} - // GetRuntimeDir is unsupported on non-linux system. func GetRuntimeDir() (string, error) { return "", errors.New("homedir.GetRuntimeDir() is not supported on this system") diff --git a/vendor/github.com/docker/docker/pkg/homedir/homedir_unix.go b/vendor/github.com/docker/docker/pkg/homedir/homedir_unix.go index d85e12448840..441bd727b602 100644 --- a/vendor/github.com/docker/docker/pkg/homedir/homedir_unix.go +++ b/vendor/github.com/docker/docker/pkg/homedir/homedir_unix.go @@ -4,8 +4,7 @@ package homedir // import "github.com/docker/docker/pkg/homedir" import ( "os" - - "github.com/opencontainers/runc/libcontainer/user" + "os/user" ) // Key returns the env var name for the user's home dir based on @@ -17,11 +16,16 @@ func Key() string { // Get returns the home directory of the current user with the help of // environment variables depending on the target operating system. // Returned path should be used with "path/filepath" to form new paths. +// +// If linking statically with cgo enabled against glibc, ensure the +// osusergo build tag is used. +// +// If needing to do nss lookups, do not disable cgo or set osusergo. func Get() string { home := os.Getenv(Key()) if home == "" { - if u, err := user.CurrentUser(); err == nil { - return u.Home + if u, err := user.Current(); err == nil { + return u.HomeDir } } return home diff --git a/vendor/github.com/docker/docker/pkg/idtools/idtools.go b/vendor/github.com/docker/docker/pkg/idtools/idtools.go index b3af7a4226e6..25a57b231e01 100644 --- a/vendor/github.com/docker/docker/pkg/idtools/idtools.go +++ b/vendor/github.com/docker/docker/pkg/idtools/idtools.go @@ -35,13 +35,13 @@ const ( // MkdirAllAndChown creates a directory (include any along the path) and then modifies // ownership to the requested uid/gid. If the directory already exists, this -// function will still change ownership to the requested uid/gid pair. +// function will still change ownership and permissions. func MkdirAllAndChown(path string, mode os.FileMode, owner Identity) error { return mkdirAs(path, mode, owner, true, true) } // MkdirAndChown creates a directory and then modifies ownership to the requested uid/gid. -// If the directory already exists, this function still changes ownership. +// If the directory already exists, this function still changes ownership and permissions. // Note that unlike os.Mkdir(), this function does not return IsExist error // in case path already exists. func MkdirAndChown(path string, mode os.FileMode, owner Identity) error { @@ -50,7 +50,7 @@ func MkdirAndChown(path string, mode os.FileMode, owner Identity) error { // MkdirAllAndChownNew creates a directory (include any along the path) and then modifies // ownership ONLY of newly created directories to the requested uid/gid. If the -// directories along the path exist, no change of ownership will be performed +// directories along the path exist, no change of ownership or permissions will be performed func MkdirAllAndChownNew(path string, mode os.FileMode, owner Identity) error { return mkdirAs(path, mode, owner, true, false) } @@ -114,31 +114,6 @@ type IdentityMapping struct { gids []IDMap } -// NewIdentityMapping takes a requested user and group name and -// using the data from /etc/sub{uid,gid} ranges, creates the -// proper uid and gid remapping ranges for that user/group pair -func NewIdentityMapping(username, groupname string) (*IdentityMapping, error) { - subuidRanges, err := parseSubuid(username) - if err != nil { - return nil, err - } - subgidRanges, err := parseSubgid(groupname) - if err != nil { - return nil, err - } - if len(subuidRanges) == 0 { - return nil, fmt.Errorf("No subuid ranges found for user %q", username) - } - if len(subgidRanges) == 0 { - return nil, fmt.Errorf("No subgid ranges found for group %q", groupname) - } - - return &IdentityMapping{ - uids: createIDMap(subuidRanges), - gids: createIDMap(subgidRanges), - }, nil -} - // NewIDMappingsFromMaps creates a new mapping from two slices // Deprecated: this is a temporary shim while transitioning to IDMapping func NewIDMappingsFromMaps(uids []IDMap, gids []IDMap) *IdentityMapping { @@ -236,10 +211,6 @@ func parseSubidFile(path, username string) (ranges, error) { s := bufio.NewScanner(subidFile) for s.Scan() { - if err := s.Err(); err != nil { - return rangeList, err - } - text := strings.TrimSpace(s.Text()) if text == "" || strings.HasPrefix(text, "#") { continue @@ -260,5 +231,11 @@ func parseSubidFile(path, username string) (ranges, error) { rangeList = append(rangeList, subIDRange{startid, length}) } } - return rangeList, nil + + return rangeList, s.Err() +} + +// CurrentIdentity returns the identity of the current process +func CurrentIdentity() Identity { + return Identity{UID: os.Getuid(), GID: os.Getegid()} } diff --git a/vendor/github.com/docker/docker/pkg/idtools/idtools_unix.go b/vendor/github.com/docker/docker/pkg/idtools/idtools_unix.go index fb239743a01a..e7d25ee47132 100644 --- a/vendor/github.com/docker/docker/pkg/idtools/idtools_unix.go +++ b/vendor/github.com/docker/docker/pkg/idtools/idtools_unix.go @@ -8,12 +8,13 @@ import ( "io" "os" "path/filepath" - "strings" + "strconv" "sync" "syscall" "github.com/docker/docker/pkg/system" "github.com/opencontainers/runc/libcontainer/user" + "github.com/pkg/errors" ) var ( @@ -39,7 +40,7 @@ func mkdirAs(path string, mode os.FileMode, owner Identity, mkAll, chownExisting } // short-circuit--we were called with an existing directory and chown was requested - return lazyChown(path, owner.UID, owner.GID, stat) + return setPermissions(path, mode, owner.UID, owner.GID, stat) } if os.IsNotExist(err) { @@ -59,7 +60,7 @@ func mkdirAs(path string, mode os.FileMode, owner Identity, mkAll, chownExisting paths = append(paths, dirPath) } } - if err := system.MkdirAll(path, mode, ""); err != nil { + if err := system.MkdirAll(path, mode); err != nil { return err } } else { @@ -70,7 +71,7 @@ func mkdirAs(path string, mode os.FileMode, owner Identity, mkAll, chownExisting // even if it existed, we will chown the requested path + any subpaths that // didn't exist when we called MkdirAll for _, pathComponent := range paths { - if err := lazyChown(pathComponent, owner.UID, owner.GID, nil); err != nil { + if err := setPermissions(pathComponent, mode, owner.UID, owner.GID, nil); err != nil { return err } } @@ -105,14 +106,14 @@ func accessible(isOwner, isGroup bool, perms os.FileMode) bool { // LookupUser uses traditional local system files lookup (from libcontainer/user) on a username, // followed by a call to `getent` for supporting host configured non-files passwd and group dbs -func LookupUser(username string) (user.User, error) { +func LookupUser(name string) (user.User, error) { // first try a local system files lookup using existing capabilities - usr, err := user.LookupUser(username) + usr, err := user.LookupUser(name) if err == nil { return usr, nil } // local files lookup failed; attempt to call `getent` to query configured passwd dbs - usr, err = getentUser(fmt.Sprintf("%s %s", "passwd", username)) + usr, err = getentUser(name) if err != nil { return user.User{}, err } @@ -128,11 +129,11 @@ func LookupUID(uid int) (user.User, error) { return usr, nil } // local files lookup failed; attempt to call `getent` to query configured passwd dbs - return getentUser(fmt.Sprintf("%s %d", "passwd", uid)) + return getentUser(strconv.Itoa(uid)) } -func getentUser(args string) (user.User, error) { - reader, err := callGetent(args) +func getentUser(name string) (user.User, error) { + reader, err := callGetent("passwd", name) if err != nil { return user.User{}, err } @@ -141,21 +142,21 @@ func getentUser(args string) (user.User, error) { return user.User{}, err } if len(users) == 0 { - return user.User{}, fmt.Errorf("getent failed to find passwd entry for %q", strings.Split(args, " ")[1]) + return user.User{}, fmt.Errorf("getent failed to find passwd entry for %q", name) } return users[0], nil } // LookupGroup uses traditional local system files lookup (from libcontainer/user) on a group name, // followed by a call to `getent` for supporting host configured non-files passwd and group dbs -func LookupGroup(groupname string) (user.Group, error) { +func LookupGroup(name string) (user.Group, error) { // first try a local system files lookup using existing capabilities - group, err := user.LookupGroup(groupname) + group, err := user.LookupGroup(name) if err == nil { return group, nil } // local files lookup failed; attempt to call `getent` to query configured group dbs - return getentGroup(fmt.Sprintf("%s %s", "group", groupname)) + return getentGroup(name) } // LookupGID uses traditional local system files lookup (from libcontainer/user) on a group ID, @@ -167,11 +168,11 @@ func LookupGID(gid int) (user.Group, error) { return group, nil } // local files lookup failed; attempt to call `getent` to query configured group dbs - return getentGroup(fmt.Sprintf("%s %d", "group", gid)) + return getentGroup(strconv.Itoa(gid)) } -func getentGroup(args string) (user.Group, error) { - reader, err := callGetent(args) +func getentGroup(name string) (user.Group, error) { + reader, err := callGetent("group", name) if err != nil { return user.Group{}, err } @@ -180,18 +181,18 @@ func getentGroup(args string) (user.Group, error) { return user.Group{}, err } if len(groups) == 0 { - return user.Group{}, fmt.Errorf("getent failed to find groups entry for %q", strings.Split(args, " ")[1]) + return user.Group{}, fmt.Errorf("getent failed to find groups entry for %q", name) } return groups[0], nil } -func callGetent(args string) (io.Reader, error) { +func callGetent(database, key string) (io.Reader, error) { entOnce.Do(func() { getentCmd, _ = resolveBinary("getent") }) // if no `getent` command on host, can't do anything else if getentCmd == "" { - return nil, fmt.Errorf("") + return nil, fmt.Errorf("unable to find getent command") } - out, err := execCmd(getentCmd, args) + out, err := execCmd(getentCmd, database, key) if err != nil { exitCode, errC := system.GetExitCode(err) if errC != nil { @@ -201,8 +202,7 @@ func callGetent(args string) (io.Reader, error) { case 1: return nil, fmt.Errorf("getent reported invalid parameters/database unknown") case 2: - terms := strings.Split(args, " ") - return nil, fmt.Errorf("getent unable to find entry %q in %s database", terms[1], terms[0]) + return nil, fmt.Errorf("getent unable to find entry %q in %s database", key, database) case 3: return nil, fmt.Errorf("getent database doesn't support enumeration") default: @@ -213,10 +213,11 @@ func callGetent(args string) (io.Reader, error) { return bytes.NewReader(out), nil } -// lazyChown performs a chown only if the uid/gid don't match what's requested +// setPermissions performs a chown/chmod only if the uid/gid don't match what's requested // Normally a Chown is a no-op if uid/gid match, but in some cases this can still cause an error, e.g. if the // dir is on an NFS share, so don't call chown unless we absolutely must. -func lazyChown(p string, uid, gid int, stat *system.StatT) error { +// Likewise for setting permissions. +func setPermissions(p string, mode os.FileMode, uid, gid int, stat *system.StatT) error { if stat == nil { var err error stat, err = system.Stat(p) @@ -224,8 +225,71 @@ func lazyChown(p string, uid, gid int, stat *system.StatT) error { return err } } + if os.FileMode(stat.Mode()).Perm() != mode.Perm() { + if err := os.Chmod(p, mode.Perm()); err != nil { + return err + } + } if stat.UID() == uint32(uid) && stat.GID() == uint32(gid) { return nil } return os.Chown(p, uid, gid) } + +// NewIdentityMapping takes a requested username and +// using the data from /etc/sub{uid,gid} ranges, creates the +// proper uid and gid remapping ranges for that user/group pair +func NewIdentityMapping(name string) (*IdentityMapping, error) { + usr, err := LookupUser(name) + if err != nil { + return nil, fmt.Errorf("Could not get user for username %s: %v", name, err) + } + + subuidRanges, err := lookupSubUIDRanges(usr) + if err != nil { + return nil, err + } + subgidRanges, err := lookupSubGIDRanges(usr) + if err != nil { + return nil, err + } + + return &IdentityMapping{ + uids: subuidRanges, + gids: subgidRanges, + }, nil +} + +func lookupSubUIDRanges(usr user.User) ([]IDMap, error) { + rangeList, err := parseSubuid(strconv.Itoa(usr.Uid)) + if err != nil { + return nil, err + } + if len(rangeList) == 0 { + rangeList, err = parseSubuid(usr.Name) + if err != nil { + return nil, err + } + } + if len(rangeList) == 0 { + return nil, errors.Errorf("no subuid ranges found for user %q", usr.Name) + } + return createIDMap(rangeList), nil +} + +func lookupSubGIDRanges(usr user.User) ([]IDMap, error) { + rangeList, err := parseSubgid(strconv.Itoa(usr.Uid)) + if err != nil { + return nil, err + } + if len(rangeList) == 0 { + rangeList, err = parseSubgid(usr.Name) + if err != nil { + return nil, err + } + } + if len(rangeList) == 0 { + return nil, errors.Errorf("no subgid ranges found for user %q", usr.Name) + } + return createIDMap(rangeList), nil +} diff --git a/vendor/github.com/docker/docker/pkg/idtools/idtools_windows.go b/vendor/github.com/docker/docker/pkg/idtools/idtools_windows.go index 4ae38a1b17bb..35ede0fffa7f 100644 --- a/vendor/github.com/docker/docker/pkg/idtools/idtools_windows.go +++ b/vendor/github.com/docker/docker/pkg/idtools/idtools_windows.go @@ -11,7 +11,7 @@ import ( // Ownership is handled elsewhere, but in the future could be support here // too. func mkdirAs(path string, mode os.FileMode, owner Identity, mkAll, chownExisting bool) error { - if err := system.MkdirAll(path, mode, ""); err != nil { + if err := system.MkdirAll(path, mode); err != nil { return err } return nil diff --git a/vendor/github.com/docker/docker/pkg/idtools/usergroupadd_linux.go b/vendor/github.com/docker/docker/pkg/idtools/usergroupadd_linux.go index 6272c5a40471..bf7ae0564ba5 100644 --- a/vendor/github.com/docker/docker/pkg/idtools/usergroupadd_linux.go +++ b/vendor/github.com/docker/docker/pkg/idtools/usergroupadd_linux.go @@ -17,18 +17,13 @@ import ( var ( once sync.Once userCommand string - - cmdTemplates = map[string]string{ - "adduser": "--system --shell /bin/false --no-create-home --disabled-login --disabled-password --group %s", - "useradd": "-r -s /bin/false %s", - "usermod": "-%s %d-%d %s", - } - idOutRegexp = regexp.MustCompile(`uid=([0-9]+).*gid=([0-9]+)`) +) + +const ( // default length for a UID/GID subordinate range defaultRangeLen = 65536 defaultRangeStart = 100000 - userMod = "usermod" ) // AddNamespaceRangesUser takes a username and uses the standard system @@ -67,7 +62,7 @@ func AddNamespaceRangesUser(name string) (int, int, error) { return uid, gid, nil } -func addUser(userName string) error { +func addUser(name string) error { once.Do(func() { // set up which commands are used for adding users/groups dependent on distro if _, err := resolveBinary("adduser"); err == nil { @@ -76,13 +71,18 @@ func addUser(userName string) error { userCommand = "useradd" } }) - if userCommand == "" { - return fmt.Errorf("Cannot add user; no useradd/adduser binary found") + var args []string + switch userCommand { + case "adduser": + args = []string{"--system", "--shell", "/bin/false", "--no-create-home", "--disabled-login", "--disabled-password", "--group", name} + case "useradd": + args = []string{"-r", "-s", "/bin/false", name} + default: + return fmt.Errorf("cannot add user; no useradd/adduser binary found") } - args := fmt.Sprintf(cmdTemplates[userCommand], userName) - out, err := execCmd(userCommand, args) - if err != nil { - return fmt.Errorf("Failed to add user with error: %v; output: %q", err, string(out)) + + if out, err := execCmd(userCommand, args...); err != nil { + return fmt.Errorf("failed to add user with error: %v; output: %q", err, string(out)) } return nil } @@ -101,7 +101,7 @@ func createSubordinateRanges(name string) error { if err != nil { return fmt.Errorf("Can't find available subuid range: %v", err) } - out, err := execCmd(userMod, fmt.Sprintf(cmdTemplates[userMod], "v", startID, startID+defaultRangeLen-1, name)) + out, err := execCmd("usermod", "-v", fmt.Sprintf("%d-%d", startID, startID+defaultRangeLen-1), name) if err != nil { return fmt.Errorf("Unable to add subuid range to user: %q; output: %s, err: %v", name, out, err) } @@ -117,7 +117,7 @@ func createSubordinateRanges(name string) error { if err != nil { return fmt.Errorf("Can't find available subgid range: %v", err) } - out, err := execCmd(userMod, fmt.Sprintf(cmdTemplates[userMod], "w", startID, startID+defaultRangeLen-1, name)) + out, err := execCmd("usermod", "-w", fmt.Sprintf("%d-%d", startID, startID+defaultRangeLen-1), name) if err != nil { return fmt.Errorf("Unable to add subgid range to user: %q; output: %s, err: %v", name, out, err) } diff --git a/vendor/github.com/docker/docker/pkg/idtools/utils_unix.go b/vendor/github.com/docker/docker/pkg/idtools/utils_unix.go index 903ac4501b4b..1e2d4a7a75ad 100644 --- a/vendor/github.com/docker/docker/pkg/idtools/utils_unix.go +++ b/vendor/github.com/docker/docker/pkg/idtools/utils_unix.go @@ -6,7 +6,6 @@ import ( "fmt" "os/exec" "path/filepath" - "strings" ) func resolveBinary(binname string) (string, error) { @@ -18,15 +17,15 @@ func resolveBinary(binname string) (string, error) { if err != nil { return "", err } - //only return no error if the final resolved binary basename - //matches what was searched for + // only return no error if the final resolved binary basename + // matches what was searched for if filepath.Base(resolvedPath) == binname { return resolvedPath, nil } return "", fmt.Errorf("Binary %q does not resolve to a binary of that name in $PATH (%q)", binname, resolvedPath) } -func execCmd(cmd, args string) ([]byte, error) { - execCmd := exec.Command(cmd, strings.Split(args, " ")...) +func execCmd(cmd string, arg ...string) ([]byte, error) { + execCmd := exec.Command(cmd, arg...) return execCmd.CombinedOutput() } diff --git a/vendor/github.com/docker/docker/pkg/ioutils/bytespipe.go b/vendor/github.com/docker/docker/pkg/ioutils/bytespipe.go index d4bbf3c9dcaf..87514b643d74 100644 --- a/vendor/github.com/docker/docker/pkg/ioutils/bytespipe.go +++ b/vendor/github.com/docker/docker/pkg/ioutils/bytespipe.go @@ -128,8 +128,9 @@ func (bp *BytesPipe) Read(p []byte) (n int, err error) { bp.mu.Lock() if bp.bufLen == 0 { if bp.closeErr != nil { + err := bp.closeErr bp.mu.Unlock() - return 0, bp.closeErr + return 0, err } bp.wait.Wait() if bp.bufLen == 0 && bp.closeErr != nil { diff --git a/vendor/github.com/docker/docker/pkg/jsonmessage/jsonmessage.go b/vendor/github.com/docker/docker/pkg/jsonmessage/jsonmessage.go index a68b566cea2c..cf8d04b1b201 100644 --- a/vendor/github.com/docker/docker/pkg/jsonmessage/jsonmessage.go +++ b/vendor/github.com/docker/docker/pkg/jsonmessage/jsonmessage.go @@ -7,8 +7,8 @@ import ( "strings" "time" - "github.com/docker/docker/pkg/term" - "github.com/docker/go-units" + units "github.com/docker/go-units" + "github.com/moby/term" "github.com/morikuni/aec" ) @@ -139,13 +139,13 @@ type JSONMessage struct { Stream string `json:"stream,omitempty"` Status string `json:"status,omitempty"` Progress *JSONProgress `json:"progressDetail,omitempty"` - ProgressMessage string `json:"progress,omitempty"` //deprecated + ProgressMessage string `json:"progress,omitempty"` // deprecated ID string `json:"id,omitempty"` From string `json:"from,omitempty"` Time int64 `json:"time,omitempty"` TimeNano int64 `json:"timeNano,omitempty"` Error *JSONError `json:"errorDetail,omitempty"` - ErrorMessage string `json:"error,omitempty"` //deprecated + ErrorMessage string `json:"error,omitempty"` // deprecated // Aux contains out-of-band data, such as digests for push signing and image id after building. Aux *json.RawMessage `json:"aux,omitempty"` } @@ -177,8 +177,8 @@ func (jm *JSONMessage) Display(out io.Writer, isTerminal bool) error { if isTerminal && jm.Stream == "" && jm.Progress != nil { clearLine(out) endl = "\r" - fmt.Fprintf(out, endl) - } else if jm.Progress != nil && jm.Progress.String() != "" { //disable progressbar in non-terminal + fmt.Fprint(out, endl) + } else if jm.Progress != nil && jm.Progress.String() != "" { // disable progressbar in non-terminal return nil } if jm.TimeNano != 0 { @@ -194,7 +194,7 @@ func (jm *JSONMessage) Display(out io.Writer, isTerminal bool) error { } if jm.Progress != nil && isTerminal { fmt.Fprintf(out, "%s %s%s", jm.Status, jm.Progress.String(), endl) - } else if jm.ProgressMessage != "" { //deprecated + } else if jm.ProgressMessage != "" { // deprecated fmt.Fprintf(out, "%s %s%s", jm.Status, jm.ProgressMessage, endl) } else if jm.Stream != "" { fmt.Fprintf(out, "%s%s", jm.Stream, endl) diff --git a/vendor/github.com/docker/docker/pkg/mount/flags.go b/vendor/github.com/docker/docker/pkg/mount/flags.go deleted file mode 100644 index ffd473311dac..000000000000 --- a/vendor/github.com/docker/docker/pkg/mount/flags.go +++ /dev/null @@ -1,137 +0,0 @@ -package mount // import "github.com/docker/docker/pkg/mount" - -import ( - "fmt" - "strings" -) - -var flags = map[string]struct { - clear bool - flag int -}{ - "defaults": {false, 0}, - "ro": {false, RDONLY}, - "rw": {true, RDONLY}, - "suid": {true, NOSUID}, - "nosuid": {false, NOSUID}, - "dev": {true, NODEV}, - "nodev": {false, NODEV}, - "exec": {true, NOEXEC}, - "noexec": {false, NOEXEC}, - "sync": {false, SYNCHRONOUS}, - "async": {true, SYNCHRONOUS}, - "dirsync": {false, DIRSYNC}, - "remount": {false, REMOUNT}, - "mand": {false, MANDLOCK}, - "nomand": {true, MANDLOCK}, - "atime": {true, NOATIME}, - "noatime": {false, NOATIME}, - "diratime": {true, NODIRATIME}, - "nodiratime": {false, NODIRATIME}, - "bind": {false, BIND}, - "rbind": {false, RBIND}, - "unbindable": {false, UNBINDABLE}, - "runbindable": {false, RUNBINDABLE}, - "private": {false, PRIVATE}, - "rprivate": {false, RPRIVATE}, - "shared": {false, SHARED}, - "rshared": {false, RSHARED}, - "slave": {false, SLAVE}, - "rslave": {false, RSLAVE}, - "relatime": {false, RELATIME}, - "norelatime": {true, RELATIME}, - "strictatime": {false, STRICTATIME}, - "nostrictatime": {true, STRICTATIME}, -} - -var validFlags = map[string]bool{ - "": true, - "size": true, - "mode": true, - "uid": true, - "gid": true, - "nr_inodes": true, - "nr_blocks": true, - "mpol": true, -} - -var propagationFlags = map[string]bool{ - "bind": true, - "rbind": true, - "unbindable": true, - "runbindable": true, - "private": true, - "rprivate": true, - "shared": true, - "rshared": true, - "slave": true, - "rslave": true, -} - -// MergeTmpfsOptions merge mount options to make sure there is no duplicate. -func MergeTmpfsOptions(options []string) ([]string, error) { - // We use collisions maps to remove duplicates. - // For flag, the key is the flag value (the key for propagation flag is -1) - // For data=value, the key is the data - flagCollisions := map[int]bool{} - dataCollisions := map[string]bool{} - - var newOptions []string - // We process in reverse order - for i := len(options) - 1; i >= 0; i-- { - option := options[i] - if option == "defaults" { - continue - } - if f, ok := flags[option]; ok && f.flag != 0 { - // There is only one propagation mode - key := f.flag - if propagationFlags[option] { - key = -1 - } - // Check to see if there is collision for flag - if !flagCollisions[key] { - // We prepend the option and add to collision map - newOptions = append([]string{option}, newOptions...) - flagCollisions[key] = true - } - continue - } - opt := strings.SplitN(option, "=", 2) - if len(opt) != 2 || !validFlags[opt[0]] { - return nil, fmt.Errorf("Invalid tmpfs option %q", opt) - } - if !dataCollisions[opt[0]] { - // We prepend the option and add to collision map - newOptions = append([]string{option}, newOptions...) - dataCollisions[opt[0]] = true - } - } - - return newOptions, nil -} - -// Parse fstab type mount options into mount() flags -// and device specific data -func parseOptions(options string) (int, string) { - var ( - flag int - data []string - ) - - for _, o := range strings.Split(options, ",") { - // If the option does not exist in the flags table or the flag - // is not supported on the platform, - // then it is a data value for a specific fs type - if f, exists := flags[o]; exists && f.flag != 0 { - if f.clear { - flag &= ^f.flag - } else { - flag |= f.flag - } - } else { - data = append(data, o) - } - } - return flag, strings.Join(data, ",") -} diff --git a/vendor/github.com/docker/docker/pkg/mount/flags_freebsd.go b/vendor/github.com/docker/docker/pkg/mount/flags_freebsd.go deleted file mode 100644 index ef35ef90591a..000000000000 --- a/vendor/github.com/docker/docker/pkg/mount/flags_freebsd.go +++ /dev/null @@ -1,49 +0,0 @@ -// +build freebsd,cgo - -package mount // import "github.com/docker/docker/pkg/mount" - -/* -#include -*/ -import "C" - -const ( - // RDONLY will mount the filesystem as read-only. - RDONLY = C.MNT_RDONLY - - // NOSUID will not allow set-user-identifier or set-group-identifier bits to - // take effect. - NOSUID = C.MNT_NOSUID - - // NOEXEC will not allow execution of any binaries on the mounted file system. - NOEXEC = C.MNT_NOEXEC - - // SYNCHRONOUS will allow any I/O to the file system to be done synchronously. - SYNCHRONOUS = C.MNT_SYNCHRONOUS - - // NOATIME will not update the file access time when reading from a file. - NOATIME = C.MNT_NOATIME -) - -// These flags are unsupported. -const ( - BIND = 0 - DIRSYNC = 0 - MANDLOCK = 0 - NODEV = 0 - NODIRATIME = 0 - UNBINDABLE = 0 - RUNBINDABLE = 0 - PRIVATE = 0 - RPRIVATE = 0 - SHARED = 0 - RSHARED = 0 - SLAVE = 0 - RSLAVE = 0 - RBIND = 0 - RELATIVE = 0 - RELATIME = 0 - REMOUNT = 0 - STRICTATIME = 0 - mntDetach = 0 -) diff --git a/vendor/github.com/docker/docker/pkg/mount/flags_unsupported.go b/vendor/github.com/docker/docker/pkg/mount/flags_unsupported.go deleted file mode 100644 index cc6c4759083a..000000000000 --- a/vendor/github.com/docker/docker/pkg/mount/flags_unsupported.go +++ /dev/null @@ -1,31 +0,0 @@ -// +build !linux,!freebsd freebsd,!cgo - -package mount // import "github.com/docker/docker/pkg/mount" - -// These flags are unsupported. -const ( - BIND = 0 - DIRSYNC = 0 - MANDLOCK = 0 - NOATIME = 0 - NODEV = 0 - NODIRATIME = 0 - NOEXEC = 0 - NOSUID = 0 - UNBINDABLE = 0 - RUNBINDABLE = 0 - PRIVATE = 0 - RPRIVATE = 0 - SHARED = 0 - RSHARED = 0 - SLAVE = 0 - RSLAVE = 0 - RBIND = 0 - RELATIME = 0 - RELATIVE = 0 - REMOUNT = 0 - STRICTATIME = 0 - SYNCHRONOUS = 0 - RDONLY = 0 - mntDetach = 0 -) diff --git a/vendor/github.com/docker/docker/pkg/mount/mount.go b/vendor/github.com/docker/docker/pkg/mount/mount.go deleted file mode 100644 index be0631c630ca..000000000000 --- a/vendor/github.com/docker/docker/pkg/mount/mount.go +++ /dev/null @@ -1,159 +0,0 @@ -package mount // import "github.com/docker/docker/pkg/mount" - -import ( - "sort" - "strconv" - "strings" - - "github.com/sirupsen/logrus" -) - -// mountError records an error from mount or unmount operation -type mountError struct { - op string - source, target string - flags uintptr - data string - err error -} - -func (e *mountError) Error() string { - out := e.op + " " - - if e.source != "" { - out += e.source + ":" + e.target - } else { - out += e.target - } - - if e.flags != uintptr(0) { - out += ", flags: 0x" + strconv.FormatUint(uint64(e.flags), 16) - } - if e.data != "" { - out += ", data: " + e.data - } - - out += ": " + e.err.Error() - return out -} - -// Cause returns the underlying cause of the error -func (e *mountError) Cause() error { - return e.err -} - -// FilterFunc is a type defining a callback function -// to filter out unwanted entries. It takes a pointer -// to an Info struct (not fully populated, currently -// only Mountpoint is filled in), and returns two booleans: -// - skip: true if the entry should be skipped -// - stop: true if parsing should be stopped after the entry -type FilterFunc func(*Info) (skip, stop bool) - -// PrefixFilter discards all entries whose mount points -// do not start with a prefix specified -func PrefixFilter(prefix string) FilterFunc { - return func(m *Info) (bool, bool) { - skip := !strings.HasPrefix(m.Mountpoint, prefix) - return skip, false - } -} - -// SingleEntryFilter looks for a specific entry -func SingleEntryFilter(mp string) FilterFunc { - return func(m *Info) (bool, bool) { - if m.Mountpoint == mp { - return false, true // don't skip, stop now - } - return true, false // skip, keep going - } -} - -// ParentsFilter returns all entries whose mount points -// can be parents of a path specified, discarding others. -// For example, given `/var/lib/docker/something`, entries -// like `/var/lib/docker`, `/var` and `/` are returned. -func ParentsFilter(path string) FilterFunc { - return func(m *Info) (bool, bool) { - skip := !strings.HasPrefix(path, m.Mountpoint) - return skip, false - } -} - -// GetMounts retrieves a list of mounts for the current running process, -// with an optional filter applied (use nil for no filter). -func GetMounts(f FilterFunc) ([]*Info, error) { - return parseMountTable(f) -} - -// Mounted determines if a specified mountpoint has been mounted. -// On Linux it looks at /proc/self/mountinfo. -func Mounted(mountpoint string) (bool, error) { - entries, err := GetMounts(SingleEntryFilter(mountpoint)) - if err != nil { - return false, err - } - - return len(entries) > 0, nil -} - -// Mount will mount filesystem according to the specified configuration, on the -// condition that the target path is *not* already mounted. Options must be -// specified like the mount or fstab unix commands: "opt1=val1,opt2=val2". See -// flags.go for supported option flags. -func Mount(device, target, mType, options string) error { - flag, data := parseOptions(options) - if flag&REMOUNT != REMOUNT { - if mounted, err := Mounted(target); err != nil || mounted { - return err - } - } - return mount(device, target, mType, uintptr(flag), data) -} - -// ForceMount will mount a filesystem according to the specified configuration, -// *regardless* if the target path is not already mounted. Options must be -// specified like the mount or fstab unix commands: "opt1=val1,opt2=val2". See -// flags.go for supported option flags. -func ForceMount(device, target, mType, options string) error { - flag, data := parseOptions(options) - return mount(device, target, mType, uintptr(flag), data) -} - -// Unmount lazily unmounts a filesystem on supported platforms, otherwise -// does a normal unmount. -func Unmount(target string) error { - return unmount(target, mntDetach) -} - -// RecursiveUnmount unmounts the target and all mounts underneath, starting with -// the deepsest mount first. -func RecursiveUnmount(target string) error { - mounts, err := parseMountTable(PrefixFilter(target)) - if err != nil { - return err - } - - // Make the deepest mount be first - sort.Slice(mounts, func(i, j int) bool { - return len(mounts[i].Mountpoint) > len(mounts[j].Mountpoint) - }) - - for i, m := range mounts { - logrus.Debugf("Trying to unmount %s", m.Mountpoint) - err = unmount(m.Mountpoint, mntDetach) - if err != nil { - if i == len(mounts)-1 { // last mount - if mounted, e := Mounted(m.Mountpoint); e != nil || mounted { - return err - } - } else { - // This is some submount, we can ignore this error for now, the final unmount will fail if this is a real problem - logrus.WithError(err).Warnf("Failed to unmount submount %s", m.Mountpoint) - } - } - - logrus.Debugf("Unmounted %s", m.Mountpoint) - } - return nil -} diff --git a/vendor/github.com/docker/docker/pkg/mount/mounter_freebsd.go b/vendor/github.com/docker/docker/pkg/mount/mounter_freebsd.go deleted file mode 100644 index 09ad36060830..000000000000 --- a/vendor/github.com/docker/docker/pkg/mount/mounter_freebsd.go +++ /dev/null @@ -1,59 +0,0 @@ -package mount // import "github.com/docker/docker/pkg/mount" - -/* -#include -#include -#include -#include -#include -#include -*/ -import "C" - -import ( - "strings" - "syscall" - "unsafe" -) - -func allocateIOVecs(options []string) []C.struct_iovec { - out := make([]C.struct_iovec, len(options)) - for i, option := range options { - out[i].iov_base = unsafe.Pointer(C.CString(option)) - out[i].iov_len = C.size_t(len(option) + 1) - } - return out -} - -func mount(device, target, mType string, flag uintptr, data string) error { - isNullFS := false - - xs := strings.Split(data, ",") - for _, x := range xs { - if x == "bind" { - isNullFS = true - } - } - - options := []string{"fspath", target} - if isNullFS { - options = append(options, "fstype", "nullfs", "target", device) - } else { - options = append(options, "fstype", mType, "from", device) - } - rawOptions := allocateIOVecs(options) - for _, rawOption := range rawOptions { - defer C.free(rawOption.iov_base) - } - - if errno := C.nmount(&rawOptions[0], C.uint(len(options)), C.int(flag)); errno != 0 { - return &mountError{ - op: "mount", - source: device, - target: target, - flags: flag, - err: syscall.Errno(errno), - } - } - return nil -} diff --git a/vendor/github.com/docker/docker/pkg/mount/mounter_unsupported.go b/vendor/github.com/docker/docker/pkg/mount/mounter_unsupported.go deleted file mode 100644 index c3e5aec27448..000000000000 --- a/vendor/github.com/docker/docker/pkg/mount/mounter_unsupported.go +++ /dev/null @@ -1,7 +0,0 @@ -// +build !linux,!freebsd freebsd,!cgo - -package mount // import "github.com/docker/docker/pkg/mount" - -func mount(device, target, mType string, flag uintptr, data string) error { - panic("Not implemented") -} diff --git a/vendor/github.com/docker/docker/pkg/mount/mountinfo.go b/vendor/github.com/docker/docker/pkg/mount/mountinfo.go deleted file mode 100644 index ecd03fc02214..000000000000 --- a/vendor/github.com/docker/docker/pkg/mount/mountinfo.go +++ /dev/null @@ -1,40 +0,0 @@ -package mount // import "github.com/docker/docker/pkg/mount" - -// Info reveals information about a particular mounted filesystem. This -// struct is populated from the content in the /proc//mountinfo file. -type Info struct { - // ID is a unique identifier of the mount (may be reused after umount). - ID int - - // Parent indicates the ID of the mount parent (or of self for the top of the - // mount tree). - Parent int - - // Major indicates one half of the device ID which identifies the device class. - Major int - - // Minor indicates one half of the device ID which identifies a specific - // instance of device. - Minor int - - // Root of the mount within the filesystem. - Root string - - // Mountpoint indicates the mount point relative to the process's root. - Mountpoint string - - // Opts represents mount-specific options. - Opts string - - // Optional represents optional fields. - Optional string - - // Fstype indicates the type of filesystem, such as EXT3. - Fstype string - - // Source indicates filesystem specific information or "none". - Source string - - // VfsOpts represents per super block options. - VfsOpts string -} diff --git a/vendor/github.com/docker/docker/pkg/mount/mountinfo_freebsd.go b/vendor/github.com/docker/docker/pkg/mount/mountinfo_freebsd.go deleted file mode 100644 index 36c89dc1a240..000000000000 --- a/vendor/github.com/docker/docker/pkg/mount/mountinfo_freebsd.go +++ /dev/null @@ -1,55 +0,0 @@ -package mount // import "github.com/docker/docker/pkg/mount" - -/* -#include -#include -#include -*/ -import "C" - -import ( - "fmt" - "reflect" - "unsafe" -) - -// Parse /proc/self/mountinfo because comparing Dev and ino does not work from -// bind mounts. -func parseMountTable(filter FilterFunc) ([]*Info, error) { - var rawEntries *C.struct_statfs - - count := int(C.getmntinfo(&rawEntries, C.MNT_WAIT)) - if count == 0 { - return nil, fmt.Errorf("Failed to call getmntinfo") - } - - var entries []C.struct_statfs - header := (*reflect.SliceHeader)(unsafe.Pointer(&entries)) - header.Cap = count - header.Len = count - header.Data = uintptr(unsafe.Pointer(rawEntries)) - - var out []*Info - for _, entry := range entries { - var mountinfo Info - var skip, stop bool - mountinfo.Mountpoint = C.GoString(&entry.f_mntonname[0]) - - if filter != nil { - // filter out entries we're not interested in - skip, stop = filter(p) - if skip { - continue - } - } - - mountinfo.Source = C.GoString(&entry.f_mntfromname[0]) - mountinfo.Fstype = C.GoString(&entry.f_fstypename[0]) - - out = append(out, &mountinfo) - if stop { - break - } - } - return out, nil -} diff --git a/vendor/github.com/docker/docker/pkg/mount/mountinfo_linux.go b/vendor/github.com/docker/docker/pkg/mount/mountinfo_linux.go deleted file mode 100644 index fe6e3ddba132..000000000000 --- a/vendor/github.com/docker/docker/pkg/mount/mountinfo_linux.go +++ /dev/null @@ -1,144 +0,0 @@ -package mount // import "github.com/docker/docker/pkg/mount" - -import ( - "bufio" - "fmt" - "io" - "os" - "strconv" - "strings" - - "github.com/pkg/errors" -) - -func parseInfoFile(r io.Reader, filter FilterFunc) ([]*Info, error) { - s := bufio.NewScanner(r) - out := []*Info{} - var err error - for s.Scan() { - if err = s.Err(); err != nil { - return nil, err - } - /* - See http://man7.org/linux/man-pages/man5/proc.5.html - - 36 35 98:0 /mnt1 /mnt2 rw,noatime master:1 - ext3 /dev/root rw,errors=continue - (1)(2)(3) (4) (5) (6) (7) (8) (9) (10) (11) - - (1) mount ID: unique identifier of the mount (may be reused after umount) - (2) parent ID: ID of parent (or of self for the top of the mount tree) - (3) major:minor: value of st_dev for files on filesystem - (4) root: root of the mount within the filesystem - (5) mount point: mount point relative to the process's root - (6) mount options: per mount options - (7) optional fields: zero or more fields of the form "tag[:value]" - (8) separator: marks the end of the optional fields - (9) filesystem type: name of filesystem of the form "type[.subtype]" - (10) mount source: filesystem specific information or "none" - (11) super options: per super block options - */ - - text := s.Text() - fields := strings.Split(text, " ") - numFields := len(fields) - if numFields < 10 { - // should be at least 10 fields - return nil, fmt.Errorf("Parsing '%s' failed: not enough fields (%d)", text, numFields) - } - - p := &Info{} - // ignore any numbers parsing errors, as there should not be any - p.ID, _ = strconv.Atoi(fields[0]) - p.Parent, _ = strconv.Atoi(fields[1]) - mm := strings.Split(fields[2], ":") - if len(mm) != 2 { - return nil, fmt.Errorf("Parsing '%s' failed: unexpected minor:major pair %s", text, mm) - } - p.Major, _ = strconv.Atoi(mm[0]) - p.Minor, _ = strconv.Atoi(mm[1]) - - p.Root, err = strconv.Unquote(`"` + fields[3] + `"`) - if err != nil { - return nil, errors.Wrapf(err, "Parsing '%s' failed: unable to unquote root field", fields[3]) - } - - p.Mountpoint, err = strconv.Unquote(`"` + fields[4] + `"`) - if err != nil { - return nil, errors.Wrapf(err, "Parsing '%s' failed: unable to unquote mount point field", fields[4]) - } - p.Opts = fields[5] - - var skip, stop bool - if filter != nil { - // filter out entries we're not interested in - skip, stop = filter(p) - if skip { - continue - } - } - - // one or more optional fields, when a separator (-) - i := 6 - for ; i < numFields && fields[i] != "-"; i++ { - switch i { - case 6: - p.Optional = fields[6] - default: - /* NOTE there might be more optional fields before the such as - fields[7]...fields[N] (where N < sepIndex), although - as of Linux kernel 4.15 the only known ones are - mount propagation flags in fields[6]. The correct - behavior is to ignore any unknown optional fields. - */ - break - } - } - if i == numFields { - return nil, fmt.Errorf("Parsing '%s' failed: missing separator ('-')", text) - } - - // There should be 3 fields after the separator... - if i+4 > numFields { - return nil, fmt.Errorf("Parsing '%s' failed: not enough fields after a separator", text) - } - // ... but in Linux <= 3.9 mounting a cifs with spaces in a share name - // (like "//serv/My Documents") _may_ end up having a space in the last field - // of mountinfo (like "unc=//serv/My Documents"). Since kernel 3.10-rc1, cifs - // option unc= is ignored, so a space should not appear. In here we ignore - // those "extra" fields caused by extra spaces. - p.Fstype = fields[i+1] - p.Source = fields[i+2] - p.VfsOpts = fields[i+3] - - out = append(out, p) - if stop { - break - } - } - return out, nil -} - -// Parse /proc/self/mountinfo because comparing Dev and ino does not work from -// bind mounts -func parseMountTable(filter FilterFunc) ([]*Info, error) { - f, err := os.Open("/proc/self/mountinfo") - if err != nil { - return nil, err - } - defer f.Close() - - return parseInfoFile(f, filter) -} - -// PidMountInfo collects the mounts for a specific process ID. If the process -// ID is unknown, it is better to use `GetMounts` which will inspect -// "/proc/self/mountinfo" instead. -func PidMountInfo(pid int) ([]*Info, error) { - f, err := os.Open(fmt.Sprintf("/proc/%d/mountinfo", pid)) - if err != nil { - return nil, err - } - defer f.Close() - - return parseInfoFile(f, nil) -} diff --git a/vendor/github.com/docker/docker/pkg/mount/mountinfo_unsupported.go b/vendor/github.com/docker/docker/pkg/mount/mountinfo_unsupported.go deleted file mode 100644 index fd16d3ed698c..000000000000 --- a/vendor/github.com/docker/docker/pkg/mount/mountinfo_unsupported.go +++ /dev/null @@ -1,12 +0,0 @@ -// +build !windows,!linux,!freebsd freebsd,!cgo - -package mount // import "github.com/docker/docker/pkg/mount" - -import ( - "fmt" - "runtime" -) - -func parseMountTable(f FilterFunc) ([]*Info, error) { - return nil, fmt.Errorf("mount.parseMountTable is not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) -} diff --git a/vendor/github.com/docker/docker/pkg/mount/mountinfo_windows.go b/vendor/github.com/docker/docker/pkg/mount/mountinfo_windows.go deleted file mode 100644 index 27e0f6976ec6..000000000000 --- a/vendor/github.com/docker/docker/pkg/mount/mountinfo_windows.go +++ /dev/null @@ -1,6 +0,0 @@ -package mount // import "github.com/docker/docker/pkg/mount" - -func parseMountTable(f FilterFunc) ([]*Info, error) { - // Do NOT return an error! - return nil, nil -} diff --git a/vendor/github.com/docker/docker/pkg/mount/unmount_unix.go b/vendor/github.com/docker/docker/pkg/mount/unmount_unix.go deleted file mode 100644 index 4be4276851f5..000000000000 --- a/vendor/github.com/docker/docker/pkg/mount/unmount_unix.go +++ /dev/null @@ -1,22 +0,0 @@ -// +build !windows - -package mount // import "github.com/docker/docker/pkg/mount" - -import "golang.org/x/sys/unix" - -func unmount(target string, flags int) error { - err := unix.Unmount(target, flags) - if err == nil || err == unix.EINVAL { - // Ignore "not mounted" error here. Note the same error - // can be returned if flags are invalid, so this code - // assumes that the flags value is always correct. - return nil - } - - return &mountError{ - op: "umount", - target: target, - flags: uintptr(flags), - err: err, - } -} diff --git a/vendor/github.com/docker/docker/pkg/mount/unmount_unsupported.go b/vendor/github.com/docker/docker/pkg/mount/unmount_unsupported.go deleted file mode 100644 index a88ad35774ab..000000000000 --- a/vendor/github.com/docker/docker/pkg/mount/unmount_unsupported.go +++ /dev/null @@ -1,7 +0,0 @@ -// +build windows - -package mount // import "github.com/docker/docker/pkg/mount" - -func unmount(target string, flag int) error { - panic("Not implemented") -} diff --git a/vendor/github.com/docker/docker/pkg/pools/pools.go b/vendor/github.com/docker/docker/pkg/pools/pools.go index 46339c282f11..3792c67a9e45 100644 --- a/vendor/github.com/docker/docker/pkg/pools/pools.go +++ b/vendor/github.com/docker/docker/pkg/pools/pools.go @@ -62,23 +62,23 @@ type bufferPool struct { func newBufferPoolWithSize(size int) *bufferPool { return &bufferPool{ pool: sync.Pool{ - New: func() interface{} { return make([]byte, size) }, + New: func() interface{} { s := make([]byte, size); return &s }, }, } } -func (bp *bufferPool) Get() []byte { - return bp.pool.Get().([]byte) +func (bp *bufferPool) Get() *[]byte { + return bp.pool.Get().(*[]byte) } -func (bp *bufferPool) Put(b []byte) { +func (bp *bufferPool) Put(b *[]byte) { bp.pool.Put(b) } // Copy is a convenience wrapper which uses a buffer to avoid allocation in io.Copy. func Copy(dst io.Writer, src io.Reader) (written int64, err error) { buf := buffer32KPool.Get() - written, err = io.CopyBuffer(dst, src, buf) + written, err = io.CopyBuffer(dst, src, *buf) buffer32KPool.Put(buf) return } diff --git a/vendor/github.com/docker/docker/pkg/system/chtimes_nowindows.go b/vendor/github.com/docker/docker/pkg/system/chtimes_nowindows.go new file mode 100644 index 000000000000..d5fab96f9d16 --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/system/chtimes_nowindows.go @@ -0,0 +1,14 @@ +// +build !windows + +package system // import "github.com/docker/docker/pkg/system" + +import ( + "time" +) + +// setCTime will set the create time on a file. On Unix, the create +// time is updated as a side effect of setting the modified time, so +// no action is required. +func setCTime(path string, ctime time.Time) error { + return nil +} diff --git a/vendor/github.com/docker/docker/pkg/system/chtimes_unix.go b/vendor/github.com/docker/docker/pkg/system/chtimes_unix.go deleted file mode 100644 index 259138a45b52..000000000000 --- a/vendor/github.com/docker/docker/pkg/system/chtimes_unix.go +++ /dev/null @@ -1,14 +0,0 @@ -// +build !windows - -package system // import "github.com/docker/docker/pkg/system" - -import ( - "time" -) - -//setCTime will set the create time on a file. On Unix, the create -//time is updated as a side effect of setting the modified time, so -//no action is required. -func setCTime(path string, ctime time.Time) error { - return nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/chtimes_windows.go b/vendor/github.com/docker/docker/pkg/system/chtimes_windows.go index d3a115ff42b8..6664b8bcad76 100644 --- a/vendor/github.com/docker/docker/pkg/system/chtimes_windows.go +++ b/vendor/github.com/docker/docker/pkg/system/chtimes_windows.go @@ -6,8 +6,8 @@ import ( "golang.org/x/sys/windows" ) -//setCTime will set the create time on a file. On Windows, this requires -//calling SetFileTime and explicitly including the create time. +// setCTime will set the create time on a file. On Windows, this requires +// calling SetFileTime and explicitly including the create time. func setCTime(path string, ctime time.Time) error { ctimespec := windows.NsecToTimespec(ctime.UnixNano()) pathp, e := windows.UTF16PtrFromString(path) diff --git a/vendor/github.com/docker/docker/pkg/system/filesys.go b/vendor/github.com/docker/docker/pkg/system/filesys.go deleted file mode 100644 index adeb16305204..000000000000 --- a/vendor/github.com/docker/docker/pkg/system/filesys.go +++ /dev/null @@ -1,67 +0,0 @@ -// +build !windows - -package system // import "github.com/docker/docker/pkg/system" - -import ( - "io/ioutil" - "os" - "path/filepath" -) - -// MkdirAllWithACL is a wrapper for MkdirAll on unix systems. -func MkdirAllWithACL(path string, perm os.FileMode, sddl string) error { - return MkdirAll(path, perm, sddl) -} - -// MkdirAll creates a directory named path along with any necessary parents, -// with permission specified by attribute perm for all dir created. -func MkdirAll(path string, perm os.FileMode, sddl string) error { - return os.MkdirAll(path, perm) -} - -// IsAbs is a platform-specific wrapper for filepath.IsAbs. -func IsAbs(path string) bool { - return filepath.IsAbs(path) -} - -// The functions below here are wrappers for the equivalents in the os and ioutils packages. -// They are passthrough on Unix platforms, and only relevant on Windows. - -// CreateSequential creates the named file with mode 0666 (before umask), truncating -// it if it already exists. If successful, methods on the returned -// File can be used for I/O; the associated file descriptor has mode -// O_RDWR. -// If there is an error, it will be of type *PathError. -func CreateSequential(name string) (*os.File, error) { - return os.Create(name) -} - -// OpenSequential opens the named file for reading. If successful, methods on -// the returned file can be used for reading; the associated file -// descriptor has mode O_RDONLY. -// If there is an error, it will be of type *PathError. -func OpenSequential(name string) (*os.File, error) { - return os.Open(name) -} - -// OpenFileSequential is the generalized open call; most users will use Open -// or Create instead. It opens the named file with specified flag -// (O_RDONLY etc.) and perm, (0666 etc.) if applicable. If successful, -// methods on the returned File can be used for I/O. -// If there is an error, it will be of type *PathError. -func OpenFileSequential(name string, flag int, perm os.FileMode) (*os.File, error) { - return os.OpenFile(name, flag, perm) -} - -// TempFileSequential creates a new temporary file in the directory dir -// with a name beginning with prefix, opens the file for reading -// and writing, and returns the resulting *os.File. -// If dir is the empty string, TempFile uses the default directory -// for temporary files (see os.TempDir). -// Multiple programs calling TempFile simultaneously -// will not choose the same file. The caller can use f.Name() -// to find the pathname of the file. It is the caller's responsibility -// to remove the file when no longer needed. -func TempFileSequential(dir, prefix string) (f *os.File, err error) { - return ioutil.TempFile(dir, prefix) -} diff --git a/vendor/github.com/docker/docker/pkg/system/filesys_unix.go b/vendor/github.com/docker/docker/pkg/system/filesys_unix.go new file mode 100644 index 000000000000..dcee3e9f984f --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/system/filesys_unix.go @@ -0,0 +1,67 @@ +// +build !windows + +package system // import "github.com/docker/docker/pkg/system" + +import ( + "io/ioutil" + "os" + "path/filepath" +) + +// MkdirAllWithACL is a wrapper for os.MkdirAll on unix systems. +func MkdirAllWithACL(path string, perm os.FileMode, sddl string) error { + return os.MkdirAll(path, perm) +} + +// MkdirAll creates a directory named path along with any necessary parents, +// with permission specified by attribute perm for all dir created. +func MkdirAll(path string, perm os.FileMode) error { + return os.MkdirAll(path, perm) +} + +// IsAbs is a platform-specific wrapper for filepath.IsAbs. +func IsAbs(path string) bool { + return filepath.IsAbs(path) +} + +// The functions below here are wrappers for the equivalents in the os and ioutils packages. +// They are passthrough on Unix platforms, and only relevant on Windows. + +// CreateSequential creates the named file with mode 0666 (before umask), truncating +// it if it already exists. If successful, methods on the returned +// File can be used for I/O; the associated file descriptor has mode +// O_RDWR. +// If there is an error, it will be of type *PathError. +func CreateSequential(name string) (*os.File, error) { + return os.Create(name) +} + +// OpenSequential opens the named file for reading. If successful, methods on +// the returned file can be used for reading; the associated file +// descriptor has mode O_RDONLY. +// If there is an error, it will be of type *PathError. +func OpenSequential(name string) (*os.File, error) { + return os.Open(name) +} + +// OpenFileSequential is the generalized open call; most users will use Open +// or Create instead. It opens the named file with specified flag +// (O_RDONLY etc.) and perm, (0666 etc.) if applicable. If successful, +// methods on the returned File can be used for I/O. +// If there is an error, it will be of type *PathError. +func OpenFileSequential(name string, flag int, perm os.FileMode) (*os.File, error) { + return os.OpenFile(name, flag, perm) +} + +// TempFileSequential creates a new temporary file in the directory dir +// with a name beginning with prefix, opens the file for reading +// and writing, and returns the resulting *os.File. +// If dir is the empty string, TempFile uses the default directory +// for temporary files (see os.TempDir). +// Multiple programs calling TempFile simultaneously +// will not choose the same file. The caller can use f.Name() +// to find the pathname of the file. It is the caller's responsibility +// to remove the file when no longer needed. +func TempFileSequential(dir, prefix string) (f *os.File, err error) { + return ioutil.TempFile(dir, prefix) +} diff --git a/vendor/github.com/docker/docker/pkg/system/filesys_windows.go b/vendor/github.com/docker/docker/pkg/system/filesys_windows.go index 3049ff38a4a9..b4646277abf2 100644 --- a/vendor/github.com/docker/docker/pkg/system/filesys_windows.go +++ b/vendor/github.com/docker/docker/pkg/system/filesys_windows.go @@ -11,7 +11,6 @@ import ( "time" "unsafe" - winio "github.com/Microsoft/go-winio" "golang.org/x/sys/windows" ) @@ -26,9 +25,10 @@ func MkdirAllWithACL(path string, perm os.FileMode, sddl string) error { return mkdirall(path, true, sddl) } -// MkdirAll implementation that is volume path aware for Windows. -func MkdirAll(path string, _ os.FileMode, sddl string) error { - return mkdirall(path, false, sddl) +// MkdirAll implementation that is volume path aware for Windows. It can be used +// as a drop-in replacement for os.MkdirAll() +func MkdirAll(path string, _ os.FileMode) error { + return mkdirall(path, false, "") } // mkdirall is a custom version of os.MkdirAll modified for use on Windows @@ -102,13 +102,13 @@ func mkdirall(path string, applyACL bool, sddl string) error { // and Local System. func mkdirWithACL(name string, sddl string) error { sa := windows.SecurityAttributes{Length: 0} - sd, err := winio.SddlToSecurityDescriptor(sddl) + sd, err := windows.SecurityDescriptorFromString(sddl) if err != nil { return &os.PathError{Op: "mkdir", Path: name, Err: err} } sa.Length = uint32(unsafe.Sizeof(sa)) sa.InheritHandle = 1 - sa.SecurityDescriptor = uintptr(unsafe.Pointer(&sd[0])) + sa.SecurityDescriptor = sd namep, err := windows.UTF16PtrFromString(name) if err != nil { @@ -130,12 +130,10 @@ func mkdirWithACL(name string, sddl string) error { // by the daemon. This SHOULD be treated as absolute from a docker processing // perspective. func IsAbs(path string) bool { - if !filepath.IsAbs(path) { - if !strings.HasPrefix(path, string(os.PathSeparator)) { - return false - } + if filepath.IsAbs(path) || strings.HasPrefix(path, string(os.PathSeparator)) { + return true } - return true + return false } // The origin of the functions below here are the golang OS and windows packages, @@ -235,7 +233,7 @@ func windowsOpenSequential(path string, mode int, _ uint32) (fd windows.Handle, createmode = windows.OPEN_EXISTING } // Use FILE_FLAG_SEQUENTIAL_SCAN rather than FILE_ATTRIBUTE_NORMAL as implemented in golang. - //https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx + // https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx const fileFlagSequentialScan = 0x08000000 // FILE_FLAG_SEQUENTIAL_SCAN h, e := windows.CreateFile(pathp, access, sharemode, sa, createmode, fileFlagSequentialScan, 0) return h, e diff --git a/vendor/github.com/docker/docker/pkg/system/init_unix.go b/vendor/github.com/docker/docker/pkg/system/init_unix.go deleted file mode 100644 index c2bb0f4cc497..000000000000 --- a/vendor/github.com/docker/docker/pkg/system/init_unix.go +++ /dev/null @@ -1,12 +0,0 @@ -// +build !windows - -package system // import "github.com/docker/docker/pkg/system" - -// InitLCOW does nothing since LCOW is a windows only feature -func InitLCOW(experimental bool) { -} - -// ContainerdRuntimeSupported returns true if the use of ContainerD runtime is supported. -func ContainerdRuntimeSupported(_ bool, _ string) bool { - return true -} diff --git a/vendor/github.com/docker/docker/pkg/system/init_windows.go b/vendor/github.com/docker/docker/pkg/system/init_windows.go index f303aa906392..a91288c60b1c 100644 --- a/vendor/github.com/docker/docker/pkg/system/init_windows.go +++ b/vendor/github.com/docker/docker/pkg/system/init_windows.go @@ -3,27 +3,15 @@ package system // import "github.com/docker/docker/pkg/system" import ( "os" - "github.com/Microsoft/hcsshim/osversion" "github.com/sirupsen/logrus" ) var ( - // lcowSupported determines if Linux Containers on Windows are supported. - lcowSupported = false - // containerdRuntimeSupported determines if ContainerD should be the runtime. // As of March 2019, this is an experimental feature. containerdRuntimeSupported = false ) -// InitLCOW sets whether LCOW is supported or not. Requires RS5+ -func InitLCOW(experimental bool) { - v := GetOSVersion() - if experimental && v.Build >= osversion.RS5 { - lcowSupported = true - } -} - // InitContainerdRuntime sets whether to use ContainerD for runtime // on Windows. This is an experimental feature still in development, and // also requires an environment variable to be set (so as not to turn the diff --git a/vendor/github.com/docker/docker/pkg/system/lcow.go b/vendor/github.com/docker/docker/pkg/system/lcow.go index 5be3e2182ba0..0f00028fbdd7 100644 --- a/vendor/github.com/docker/docker/pkg/system/lcow.go +++ b/vendor/github.com/docker/docker/pkg/system/lcow.go @@ -1,32 +1,48 @@ +// +build windows,!no_lcow + package system // import "github.com/docker/docker/pkg/system" import ( - "runtime" "strings" + "github.com/Microsoft/hcsshim/osversion" specs "github.com/opencontainers/image-spec/specs-go/v1" "github.com/pkg/errors" ) -// IsOSSupported determines if an operating system is supported by the host -func IsOSSupported(os string) bool { - if strings.EqualFold(runtime.GOOS, os) { - return true - } - if LCOWSupported() && strings.EqualFold(os, "linux") { - return true +var ( + // lcowSupported determines if Linux Containers on Windows are supported. + lcowSupported = false +) + +// InitLCOW sets whether LCOW is supported or not. Requires RS5+ +func InitLCOW(experimental bool) { + if experimental && osversion.Build() >= osversion.RS5 { + lcowSupported = true } - return false +} + +func LCOWSupported() bool { + return lcowSupported } // ValidatePlatform determines if a platform structure is valid. // TODO This is a temporary windows-only function, should be replaced by // comparison of worker capabilities func ValidatePlatform(platform specs.Platform) error { - if runtime.GOOS == "windows" { - if !(platform.OS == runtime.GOOS || (LCOWSupported() && platform.OS == "linux")) { - return errors.Errorf("unsupported os %s", platform.OS) - } + if !IsOSSupported(platform.OS) { + return errors.Errorf("unsupported os %s", platform.OS) } return nil } + +// IsOSSupported determines if an operating system is supported by the host +func IsOSSupported(os string) bool { + if strings.EqualFold("windows", os) { + return true + } + if LCOWSupported() && strings.EqualFold(os, "linux") { + return true + } + return false +} diff --git a/vendor/github.com/docker/docker/pkg/system/lcow_unix.go b/vendor/github.com/docker/docker/pkg/system/lcow_unix.go deleted file mode 100644 index 26397fb8a176..000000000000 --- a/vendor/github.com/docker/docker/pkg/system/lcow_unix.go +++ /dev/null @@ -1,8 +0,0 @@ -// +build !windows - -package system // import "github.com/docker/docker/pkg/system" - -// LCOWSupported returns true if Linux containers on Windows are supported. -func LCOWSupported() bool { - return false -} diff --git a/vendor/github.com/docker/docker/pkg/system/lcow_unsupported.go b/vendor/github.com/docker/docker/pkg/system/lcow_unsupported.go new file mode 100644 index 000000000000..3d3cf775a702 --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/system/lcow_unsupported.go @@ -0,0 +1,28 @@ +// +build !windows windows,no_lcow + +package system // import "github.com/docker/docker/pkg/system" +import ( + "runtime" + "strings" + + specs "github.com/opencontainers/image-spec/specs-go/v1" +) + +// InitLCOW does nothing since LCOW is a windows only feature +func InitLCOW(_ bool) {} + +// LCOWSupported returns true if Linux containers on Windows are supported. +func LCOWSupported() bool { + return false +} + +// ValidatePlatform determines if a platform structure is valid. This function +// is used for LCOW, and is a no-op on non-windows platforms. +func ValidatePlatform(_ specs.Platform) error { + return nil +} + +// IsOSSupported determines if an operating system is supported by the host. +func IsOSSupported(os string) bool { + return strings.EqualFold(runtime.GOOS, os) +} diff --git a/vendor/github.com/docker/docker/pkg/system/lcow_windows.go b/vendor/github.com/docker/docker/pkg/system/lcow_windows.go deleted file mode 100644 index f0139df8f7e0..000000000000 --- a/vendor/github.com/docker/docker/pkg/system/lcow_windows.go +++ /dev/null @@ -1,6 +0,0 @@ -package system // import "github.com/docker/docker/pkg/system" - -// LCOWSupported returns true if Linux containers on Windows are supported. -func LCOWSupported() bool { - return lcowSupported -} diff --git a/vendor/github.com/docker/docker/pkg/system/meminfo_linux.go b/vendor/github.com/docker/docker/pkg/system/meminfo_linux.go index d79e8b076535..cd060eff24de 100644 --- a/vendor/github.com/docker/docker/pkg/system/meminfo_linux.go +++ b/vendor/github.com/docker/docker/pkg/system/meminfo_linux.go @@ -7,7 +7,7 @@ import ( "strconv" "strings" - "github.com/docker/go-units" + units "github.com/docker/go-units" ) // ReadMemInfo retrieves memory statistics of the host system and returns a @@ -27,6 +27,7 @@ func ReadMemInfo() (*MemInfo, error) { func parseMemInfo(reader io.Reader) (*MemInfo, error) { meminfo := &MemInfo{} scanner := bufio.NewScanner(reader) + memAvailable := int64(-1) for scanner.Scan() { // Expected format: ["MemTotal:", "1234", "kB"] parts := strings.Fields(scanner.Text()) @@ -48,6 +49,8 @@ func parseMemInfo(reader io.Reader) (*MemInfo, error) { meminfo.MemTotal = bytes case "MemFree:": meminfo.MemFree = bytes + case "MemAvailable:": + memAvailable = bytes case "SwapTotal:": meminfo.SwapTotal = bytes case "SwapFree:": @@ -55,6 +58,9 @@ func parseMemInfo(reader io.Reader) (*MemInfo, error) { } } + if memAvailable != -1 { + meminfo.MemFree = memAvailable + } // Handle errors that may have occurred during the reading of the file. if err := scanner.Err(); err != nil { diff --git a/vendor/github.com/docker/docker/pkg/system/path.go b/vendor/github.com/docker/docker/pkg/system/path.go index a3d957afab74..64e892289a62 100644 --- a/vendor/github.com/docker/docker/pkg/system/path.go +++ b/vendor/github.com/docker/docker/pkg/system/path.go @@ -5,8 +5,6 @@ import ( "path/filepath" "runtime" "strings" - - "github.com/containerd/continuity/pathdriver" ) const defaultUnixPathEnv = "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" @@ -27,6 +25,12 @@ func DefaultPathEnv(os string) string { } +// PathVerifier defines the subset of a PathDriver that CheckSystemDriveAndRemoveDriveLetter +// actually uses in order to avoid system depending on containerd/continuity. +type PathVerifier interface { + IsAbs(string) bool +} + // CheckSystemDriveAndRemoveDriveLetter verifies that a path, if it includes a drive letter, // is the system drive. // On Linux: this is a no-op. @@ -42,7 +46,7 @@ func DefaultPathEnv(os string) string { // a --> a // /a --> \a // d:\ --> Fail -func CheckSystemDriveAndRemoveDriveLetter(path string, driver pathdriver.PathDriver) (string, error) { +func CheckSystemDriveAndRemoveDriveLetter(path string, driver PathVerifier) (string, error) { if runtime.GOOS != "windows" || LCOWSupported() { return path, nil } diff --git a/vendor/github.com/docker/docker/pkg/system/path_windows.go b/vendor/github.com/docker/docker/pkg/system/path_windows.go index 188f2c2957a4..22a56136c8f9 100644 --- a/vendor/github.com/docker/docker/pkg/system/path_windows.go +++ b/vendor/github.com/docker/docker/pkg/system/path_windows.go @@ -1,24 +1,27 @@ package system // import "github.com/docker/docker/pkg/system" -import "syscall" +import "golang.org/x/sys/windows" // GetLongPathName converts Windows short pathnames to full pathnames. // For example C:\Users\ADMIN~1 --> C:\Users\Administrator. // It is a no-op on non-Windows platforms func GetLongPathName(path string) (string, error) { // See https://groups.google.com/forum/#!topic/golang-dev/1tufzkruoTg - p := syscall.StringToUTF16(path) + p, err := windows.UTF16FromString(path) + if err != nil { + return "", err + } b := p // GetLongPathName says we can reuse buffer - n, err := syscall.GetLongPathName(&p[0], &b[0], uint32(len(b))) + n, err := windows.GetLongPathName(&p[0], &b[0], uint32(len(b))) if err != nil { return "", err } if n > uint32(len(b)) { b = make([]uint16, n) - _, err = syscall.GetLongPathName(&p[0], &b[0], uint32(len(b))) + _, err = windows.GetLongPathName(&p[0], &b[0], uint32(len(b))) if err != nil { return "", err } } - return syscall.UTF16ToString(b), nil + return windows.UTF16ToString(b), nil } diff --git a/vendor/github.com/docker/docker/pkg/system/process_unix.go b/vendor/github.com/docker/docker/pkg/system/process_unix.go index 0195a891b27c..79aebb5272a4 100644 --- a/vendor/github.com/docker/docker/pkg/system/process_unix.go +++ b/vendor/github.com/docker/docker/pkg/system/process_unix.go @@ -3,6 +3,9 @@ package system // import "github.com/docker/docker/pkg/system" import ( + "fmt" + "io/ioutil" + "strings" "syscall" "golang.org/x/sys/unix" @@ -22,3 +25,20 @@ func IsProcessAlive(pid int) bool { func KillProcess(pid int) { unix.Kill(pid, unix.SIGKILL) } + +// IsProcessZombie return true if process has a state with "Z" +// http://man7.org/linux/man-pages/man5/proc.5.html +func IsProcessZombie(pid int) (bool, error) { + statPath := fmt.Sprintf("/proc/%d/stat", pid) + dataBytes, err := ioutil.ReadFile(statPath) + if err != nil { + return false, err + } + data := string(dataBytes) + sdata := strings.SplitN(data, " ", 4) + if len(sdata) >= 3 && sdata[2] == "Z" { + return true, nil + } + + return false, nil +} diff --git a/vendor/github.com/docker/docker/pkg/system/process_windows.go b/vendor/github.com/docker/docker/pkg/system/process_windows.go index 4e70c97b18f0..09bdfa0ca0aa 100644 --- a/vendor/github.com/docker/docker/pkg/system/process_windows.go +++ b/vendor/github.com/docker/docker/pkg/system/process_windows.go @@ -13,6 +13,6 @@ func IsProcessAlive(pid int) bool { func KillProcess(pid int) { p, err := os.FindProcess(pid) if err == nil { - p.Kill() + _ = p.Kill() } } diff --git a/vendor/github.com/docker/docker/pkg/system/rm.go b/vendor/github.com/docker/docker/pkg/system/rm.go index b3109918004a..c5d80ebda167 100644 --- a/vendor/github.com/docker/docker/pkg/system/rm.go +++ b/vendor/github.com/docker/docker/pkg/system/rm.go @@ -1,3 +1,5 @@ +// +build !darwin,!windows + package system // import "github.com/docker/docker/pkg/system" import ( @@ -5,7 +7,7 @@ import ( "syscall" "time" - "github.com/docker/docker/pkg/mount" + "github.com/moby/sys/mount" "github.com/pkg/errors" ) @@ -63,12 +65,8 @@ func EnsureRemoveAll(dir string) error { return err } - if mounted, _ := mount.Mounted(pe.Path); mounted { - if e := mount.Unmount(pe.Path); e != nil { - if mounted, _ := mount.Mounted(pe.Path); mounted { - return errors.Wrapf(e, "error while removing %s", dir) - } - } + if e := mount.Unmount(pe.Path); e != nil { + return errors.Wrapf(e, "error while removing %s", dir) } if exitOnErr[pe.Path] == maxRetry { diff --git a/vendor/github.com/docker/docker/pkg/system/rm_windows.go b/vendor/github.com/docker/docker/pkg/system/rm_windows.go new file mode 100644 index 000000000000..ed9c5dcb8ae9 --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/system/rm_windows.go @@ -0,0 +1,6 @@ +package system + +import "os" + +// EnsureRemoveAll is an alias to os.RemoveAll on Windows +var EnsureRemoveAll = os.RemoveAll diff --git a/vendor/github.com/docker/docker/pkg/system/stat_bsd.go b/vendor/github.com/docker/docker/pkg/system/stat_bsd.go new file mode 100644 index 000000000000..ea55c3dbb5ec --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/system/stat_bsd.go @@ -0,0 +1,15 @@ +// +build freebsd netbsd + +package system // import "github.com/docker/docker/pkg/system" + +import "syscall" + +// fromStatT converts a syscall.Stat_t type to a system.Stat_t type +func fromStatT(s *syscall.Stat_t) (*StatT, error) { + return &StatT{size: s.Size, + mode: uint32(s.Mode), + uid: s.Uid, + gid: s.Gid, + rdev: uint64(s.Rdev), + mtim: s.Mtimespec}, nil +} diff --git a/vendor/github.com/docker/docker/pkg/system/stat_freebsd.go b/vendor/github.com/docker/docker/pkg/system/stat_freebsd.go deleted file mode 100644 index c1c0ee9f3865..000000000000 --- a/vendor/github.com/docker/docker/pkg/system/stat_freebsd.go +++ /dev/null @@ -1,13 +0,0 @@ -package system // import "github.com/docker/docker/pkg/system" - -import "syscall" - -// fromStatT converts a syscall.Stat_t type to a system.Stat_t type -func fromStatT(s *syscall.Stat_t) (*StatT, error) { - return &StatT{size: s.Size, - mode: uint32(s.Mode), - uid: s.Uid, - gid: s.Gid, - rdev: uint64(s.Rdev), - mtim: s.Mtimespec}, nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/stat_solaris.go b/vendor/github.com/docker/docker/pkg/system/stat_solaris.go index 756b92d1e6cf..6a51ccd64233 100644 --- a/vendor/github.com/docker/docker/pkg/system/stat_solaris.go +++ b/vendor/github.com/docker/docker/pkg/system/stat_solaris.go @@ -5,9 +5,9 @@ import "syscall" // fromStatT converts a syscall.Stat_t type to a system.Stat_t type func fromStatT(s *syscall.Stat_t) (*StatT, error) { return &StatT{size: s.Size, - mode: uint32(s.Mode), + mode: s.Mode, uid: s.Uid, gid: s.Gid, - rdev: uint64(s.Rdev), + rdev: s.Rdev, mtim: s.Mtim}, nil } diff --git a/vendor/github.com/docker/docker/pkg/system/syscall_unix.go b/vendor/github.com/docker/docker/pkg/system/syscall_unix.go index 919a412a7b30..905d10f15327 100644 --- a/vendor/github.com/docker/docker/pkg/system/syscall_unix.go +++ b/vendor/github.com/docker/docker/pkg/system/syscall_unix.go @@ -9,9 +9,3 @@ import "golang.org/x/sys/unix" func Unmount(dest string) error { return unix.Unmount(dest, 0) } - -// CommandLineToArgv should not be used on Unix. -// It simply returns commandLine in the only element in the returned array. -func CommandLineToArgv(commandLine string) ([]string, error) { - return []string{commandLine}, nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/syscall_windows.go b/vendor/github.com/docker/docker/pkg/system/syscall_windows.go index 4ae92fa6c7d7..1588aa3ef9fe 100644 --- a/vendor/github.com/docker/docker/pkg/system/syscall_windows.go +++ b/vendor/github.com/docker/docker/pkg/system/syscall_windows.go @@ -1,45 +1,45 @@ package system // import "github.com/docker/docker/pkg/system" import ( - "fmt" "syscall" "unsafe" + "github.com/Microsoft/hcsshim/osversion" "github.com/sirupsen/logrus" "golang.org/x/sys/windows" ) const ( - OWNER_SECURITY_INFORMATION = 0x00000001 - GROUP_SECURITY_INFORMATION = 0x00000002 - DACL_SECURITY_INFORMATION = 0x00000004 - SACL_SECURITY_INFORMATION = 0x00000008 - LABEL_SECURITY_INFORMATION = 0x00000010 - ATTRIBUTE_SECURITY_INFORMATION = 0x00000020 - SCOPE_SECURITY_INFORMATION = 0x00000040 + OWNER_SECURITY_INFORMATION = windows.OWNER_SECURITY_INFORMATION // Deprecated: use golang.org/x/sys/windows.OWNER_SECURITY_INFORMATION + GROUP_SECURITY_INFORMATION = windows.GROUP_SECURITY_INFORMATION // Deprecated: use golang.org/x/sys/windows.GROUP_SECURITY_INFORMATION + DACL_SECURITY_INFORMATION = windows.DACL_SECURITY_INFORMATION // Deprecated: use golang.org/x/sys/windows.DACL_SECURITY_INFORMATION + SACL_SECURITY_INFORMATION = windows.SACL_SECURITY_INFORMATION // Deprecated: use golang.org/x/sys/windows.SACL_SECURITY_INFORMATION + LABEL_SECURITY_INFORMATION = windows.LABEL_SECURITY_INFORMATION // Deprecated: use golang.org/x/sys/windows.LABEL_SECURITY_INFORMATION + ATTRIBUTE_SECURITY_INFORMATION = windows.ATTRIBUTE_SECURITY_INFORMATION // Deprecated: use golang.org/x/sys/windows.ATTRIBUTE_SECURITY_INFORMATION + SCOPE_SECURITY_INFORMATION = windows.SCOPE_SECURITY_INFORMATION // Deprecated: use golang.org/x/sys/windows.SCOPE_SECURITY_INFORMATION PROCESS_TRUST_LABEL_SECURITY_INFORMATION = 0x00000080 ACCESS_FILTER_SECURITY_INFORMATION = 0x00000100 - BACKUP_SECURITY_INFORMATION = 0x00010000 - PROTECTED_DACL_SECURITY_INFORMATION = 0x80000000 - PROTECTED_SACL_SECURITY_INFORMATION = 0x40000000 - UNPROTECTED_DACL_SECURITY_INFORMATION = 0x20000000 - UNPROTECTED_SACL_SECURITY_INFORMATION = 0x10000000 + BACKUP_SECURITY_INFORMATION = windows.BACKUP_SECURITY_INFORMATION // Deprecated: use golang.org/x/sys/windows.BACKUP_SECURITY_INFORMATION + PROTECTED_DACL_SECURITY_INFORMATION = windows.PROTECTED_DACL_SECURITY_INFORMATION // Deprecated: use golang.org/x/sys/windows.PROTECTED_DACL_SECURITY_INFORMATION + PROTECTED_SACL_SECURITY_INFORMATION = windows.PROTECTED_SACL_SECURITY_INFORMATION // Deprecated: use golang.org/x/sys/windows.PROTECTED_SACL_SECURITY_INFORMATION + UNPROTECTED_DACL_SECURITY_INFORMATION = windows.UNPROTECTED_DACL_SECURITY_INFORMATION // Deprecated: use golang.org/x/sys/windows.UNPROTECTED_DACL_SECURITY_INFORMATION + UNPROTECTED_SACL_SECURITY_INFORMATION = windows.UNPROTECTED_SACL_SECURITY_INFORMATION // Deprecated: use golang.org/x/sys/windows.UNPROTECTED_SACL_SECURITY_INFORMATION ) const ( - SE_UNKNOWN_OBJECT_TYPE = iota - SE_FILE_OBJECT - SE_SERVICE - SE_PRINTER - SE_REGISTRY_KEY - SE_LMSHARE - SE_KERNEL_OBJECT - SE_WINDOW_OBJECT - SE_DS_OBJECT - SE_DS_OBJECT_ALL - SE_PROVIDER_DEFINED_OBJECT - SE_WMIGUID_OBJECT - SE_REGISTRY_WOW64_32KEY + SE_UNKNOWN_OBJECT_TYPE = windows.SE_UNKNOWN_OBJECT_TYPE // Deprecated: use golang.org/x/sys/windows.SE_UNKNOWN_OBJECT_TYPE + SE_FILE_OBJECT = windows.SE_FILE_OBJECT // Deprecated: use golang.org/x/sys/windows.SE_FILE_OBJECT + SE_SERVICE = windows.SE_SERVICE // Deprecated: use golang.org/x/sys/windows.SE_SERVICE + SE_PRINTER = windows.SE_PRINTER // Deprecated: use golang.org/x/sys/windows.SE_PRINTER + SE_REGISTRY_KEY = windows.SE_REGISTRY_KEY // Deprecated: use golang.org/x/sys/windows.SE_REGISTRY_KEY + SE_LMSHARE = windows.SE_LMSHARE // Deprecated: use golang.org/x/sys/windows.SE_LMSHARE + SE_KERNEL_OBJECT = windows.SE_KERNEL_OBJECT // Deprecated: use golang.org/x/sys/windows.SE_KERNEL_OBJECT + SE_WINDOW_OBJECT = windows.SE_WINDOW_OBJECT // Deprecated: use golang.org/x/sys/windows.SE_WINDOW_OBJECT + SE_DS_OBJECT = windows.SE_DS_OBJECT // Deprecated: use golang.org/x/sys/windows.SE_DS_OBJECT + SE_DS_OBJECT_ALL = windows.SE_DS_OBJECT_ALL // Deprecated: use golang.org/x/sys/windows.SE_DS_OBJECT_ALL + SE_PROVIDER_DEFINED_OBJECT = windows.SE_PROVIDER_DEFINED_OBJECT // Deprecated: use golang.org/x/sys/windows.SE_PROVIDER_DEFINED_OBJECT + SE_WMIGUID_OBJECT = windows.SE_WMIGUID_OBJECT // Deprecated: use golang.org/x/sys/windows.SE_WMIGUID_OBJECT + SE_REGISTRY_WOW64_32KEY = windows.SE_REGISTRY_WOW64_32KEY // Deprecated: use golang.org/x/sys/windows.SE_REGISTRY_WOW64_32KEY ) const ( @@ -55,21 +55,16 @@ var ( ntuserApiset = windows.NewLazyDLL("ext-ms-win-ntuser-window-l1-1-0") modadvapi32 = windows.NewLazySystemDLL("advapi32.dll") procGetVersionExW = modkernel32.NewProc("GetVersionExW") - procGetProductInfo = modkernel32.NewProc("GetProductInfo") procSetNamedSecurityInfo = modadvapi32.NewProc("SetNamedSecurityInfoW") procGetSecurityDescriptorDacl = modadvapi32.NewProc("GetSecurityDescriptorDacl") ) // OSVersion is a wrapper for Windows version information // https://msdn.microsoft.com/en-us/library/windows/desktop/ms724439(v=vs.85).aspx -type OSVersion struct { - Version uint32 - MajorVersion uint8 - MinorVersion uint8 - Build uint16 -} +type OSVersion = osversion.OSVersion // https://msdn.microsoft.com/en-us/library/windows/desktop/ms724833(v=vs.85).aspx +// TODO: use golang.org/x/sys/windows.OsVersionInfoEx (needs OSVersionInfoSize to be exported) type osVersionInfoEx struct { OSVersionInfoSize uint32 MajorVersion uint32 @@ -85,28 +80,13 @@ type osVersionInfoEx struct { } // GetOSVersion gets the operating system version on Windows. Note that -// docker.exe must be manifested to get the correct version information. +// dockerd.exe must be manifested to get the correct version information. +// Deprecated: use github.com/Microsoft/hcsshim/osversion.Get() instead func GetOSVersion() OSVersion { - var err error - osv := OSVersion{} - osv.Version, err = windows.GetVersion() - if err != nil { - // GetVersion never fails. - panic(err) - } - osv.MajorVersion = uint8(osv.Version & 0xFF) - osv.MinorVersion = uint8(osv.Version >> 8 & 0xFF) - osv.Build = uint16(osv.Version >> 16) - return osv -} - -func (osv OSVersion) ToString() string { - return fmt.Sprintf("%d.%d.%d", osv.MajorVersion, osv.MinorVersion, osv.Build) + return osversion.Get() } // IsWindowsClient returns true if the SKU is client -// @engine maintainers - this function should not be removed or modified as it -// is used to enforce licensing restrictions on Windows. func IsWindowsClient() bool { osviex := &osVersionInfoEx{OSVersionInfoSize: 284} r1, _, err := procGetVersionExW.Call(uintptr(unsafe.Pointer(osviex))) @@ -118,51 +98,12 @@ func IsWindowsClient() bool { return osviex.ProductType == verNTWorkstation } -// IsIoTCore returns true if the currently running image is based off of -// Windows 10 IoT Core. -// @engine maintainers - this function should not be removed or modified as it -// is used to enforce licensing restrictions on Windows. -func IsIoTCore() bool { - var returnedProductType uint32 - r1, _, err := procGetProductInfo.Call(6, 1, 0, 0, uintptr(unsafe.Pointer(&returnedProductType))) - if r1 == 0 { - logrus.Warnf("GetProductInfo failed - assuming this is not IoT: %v", err) - return false - } - const productIoTUAP = 0x0000007B - const productIoTUAPCommercial = 0x00000083 - return returnedProductType == productIoTUAP || returnedProductType == productIoTUAPCommercial -} - // Unmount is a platform-specific helper function to call // the unmount syscall. Not supported on Windows -func Unmount(dest string) error { +func Unmount(_ string) error { return nil } -// CommandLineToArgv wraps the Windows syscall to turn a commandline into an argument array. -func CommandLineToArgv(commandLine string) ([]string, error) { - var argc int32 - - argsPtr, err := windows.UTF16PtrFromString(commandLine) - if err != nil { - return nil, err - } - - argv, err := windows.CommandLineToArgv(argsPtr, &argc) - if err != nil { - return nil, err - } - defer windows.LocalFree(windows.Handle(uintptr(unsafe.Pointer(argv)))) - - newArgs := make([]string, argc) - for i, v := range (*argv)[:argc] { - newArgs[i] = string(windows.UTF16ToString((*v)[:])) - } - - return newArgs, nil -} - // HasWin32KSupport determines whether containers that depend on win32k can // run on this machine. Win32k is the driver used to implement windowing. func HasWin32KSupport() bool { @@ -172,6 +113,7 @@ func HasWin32KSupport() bool { return ntuserApiset.Load() == nil } +// Deprecated: use golang.org/x/sys/windows.SetNamedSecurityInfo() func SetNamedSecurityInfo(objectName *uint16, objectType uint32, securityInformation uint32, sidOwner *windows.SID, sidGroup *windows.SID, dacl *byte, sacl *byte) (result error) { r0, _, _ := syscall.Syscall9(procSetNamedSecurityInfo.Addr(), 7, uintptr(unsafe.Pointer(objectName)), uintptr(objectType), uintptr(securityInformation), uintptr(unsafe.Pointer(sidOwner)), uintptr(unsafe.Pointer(sidGroup)), uintptr(unsafe.Pointer(dacl)), uintptr(unsafe.Pointer(sacl)), 0, 0) if r0 != 0 { @@ -180,11 +122,12 @@ func SetNamedSecurityInfo(objectName *uint16, objectType uint32, securityInforma return } +// Deprecated: uses golang.org/x/sys/windows.SecurityDescriptorFromString() and golang.org/x/sys/windows.SECURITY_DESCRIPTOR.DACL() func GetSecurityDescriptorDacl(securityDescriptor *byte, daclPresent *uint32, dacl **byte, daclDefaulted *uint32) (result error) { r1, _, e1 := syscall.Syscall6(procGetSecurityDescriptorDacl.Addr(), 4, uintptr(unsafe.Pointer(securityDescriptor)), uintptr(unsafe.Pointer(daclPresent)), uintptr(unsafe.Pointer(dacl)), uintptr(unsafe.Pointer(daclDefaulted)), 0, 0) if r1 == 0 { if e1 != 0 { - result = syscall.Errno(e1) + result = e1 } else { result = syscall.EINVAL } diff --git a/vendor/github.com/docker/docker/pkg/system/utimes_freebsd.go b/vendor/github.com/docker/docker/pkg/system/utimes_freebsd.go deleted file mode 100644 index ed1b9fad59bb..000000000000 --- a/vendor/github.com/docker/docker/pkg/system/utimes_freebsd.go +++ /dev/null @@ -1,24 +0,0 @@ -package system // import "github.com/docker/docker/pkg/system" - -import ( - "syscall" - "unsafe" - - "golang.org/x/sys/unix" -) - -// LUtimesNano is used to change access and modification time of the specified path. -// It's used for symbol link file because unix.UtimesNano doesn't support a NOFOLLOW flag atm. -func LUtimesNano(path string, ts []syscall.Timespec) error { - var _path *byte - _path, err := unix.BytePtrFromString(path) - if err != nil { - return err - } - - if _, _, err := unix.Syscall(unix.SYS_LUTIMES, uintptr(unsafe.Pointer(_path)), uintptr(unsafe.Pointer(&ts[0])), 0); err != 0 && err != unix.ENOSYS { - return err - } - - return nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/utimes_linux.go b/vendor/github.com/docker/docker/pkg/system/utimes_linux.go deleted file mode 100644 index 0afe854589f6..000000000000 --- a/vendor/github.com/docker/docker/pkg/system/utimes_linux.go +++ /dev/null @@ -1,25 +0,0 @@ -package system // import "github.com/docker/docker/pkg/system" - -import ( - "syscall" - "unsafe" - - "golang.org/x/sys/unix" -) - -// LUtimesNano is used to change access and modification time of the specified path. -// It's used for symbol link file because unix.UtimesNano doesn't support a NOFOLLOW flag atm. -func LUtimesNano(path string, ts []syscall.Timespec) error { - atFdCwd := unix.AT_FDCWD - - var _path *byte - _path, err := unix.BytePtrFromString(path) - if err != nil { - return err - } - if _, _, err := unix.Syscall6(unix.SYS_UTIMENSAT, uintptr(atFdCwd), uintptr(unsafe.Pointer(_path)), uintptr(unsafe.Pointer(&ts[0])), unix.AT_SYMLINK_NOFOLLOW, 0, 0); err != 0 && err != unix.ENOSYS { - return err - } - - return nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/utimes_unix.go b/vendor/github.com/docker/docker/pkg/system/utimes_unix.go new file mode 100644 index 000000000000..61ba8c474c35 --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/system/utimes_unix.go @@ -0,0 +1,24 @@ +// +build linux freebsd + +package system // import "github.com/docker/docker/pkg/system" + +import ( + "syscall" + + "golang.org/x/sys/unix" +) + +// LUtimesNano is used to change access and modification time of the specified path. +// It's used for symbol link file because unix.UtimesNano doesn't support a NOFOLLOW flag atm. +func LUtimesNano(path string, ts []syscall.Timespec) error { + uts := []unix.Timespec{ + unix.NsecToTimespec(syscall.TimespecToNsec(ts[0])), + unix.NsecToTimespec(syscall.TimespecToNsec(ts[1])), + } + err := unix.UtimesNanoAt(unix.AT_FDCWD, path, uts, unix.AT_SYMLINK_NOFOLLOW) + if err != nil && err != unix.ENOSYS { + return err + } + + return nil +} diff --git a/vendor/github.com/docker/docker/pkg/system/xattrs_linux.go b/vendor/github.com/docker/docker/pkg/system/xattrs_linux.go index d4f1a57fb06e..95b609fe7a8b 100644 --- a/vendor/github.com/docker/docker/pkg/system/xattrs_linux.go +++ b/vendor/github.com/docker/docker/pkg/system/xattrs_linux.go @@ -10,24 +10,23 @@ func Lgetxattr(path string, attr string) ([]byte, error) { dest := make([]byte, 128) sz, errno := unix.Lgetxattr(path, attr, dest) - switch { - case errno == unix.ENODATA: - return nil, nil - case errno == unix.ERANGE: - // 128 byte array might just not be good enough. A dummy buffer is used - // to get the real size of the xattrs on disk + for errno == unix.ERANGE { + // Buffer too small, use zero-sized buffer to get the actual size sz, errno = unix.Lgetxattr(path, attr, []byte{}) if errno != nil { return nil, errno } dest = make([]byte, sz) sz, errno = unix.Lgetxattr(path, attr, dest) - if errno != nil { - return nil, errno - } + } + + switch { + case errno == unix.ENODATA: + return nil, nil case errno != nil: return nil, errno } + return dest[:sz], nil } diff --git a/vendor/github.com/docker/docker/pkg/term/ascii.go b/vendor/github.com/docker/docker/pkg/term/ascii.go deleted file mode 100644 index 87bca8d4acdb..000000000000 --- a/vendor/github.com/docker/docker/pkg/term/ascii.go +++ /dev/null @@ -1,66 +0,0 @@ -package term // import "github.com/docker/docker/pkg/term" - -import ( - "fmt" - "strings" -) - -// ASCII list the possible supported ASCII key sequence -var ASCII = []string{ - "ctrl-@", - "ctrl-a", - "ctrl-b", - "ctrl-c", - "ctrl-d", - "ctrl-e", - "ctrl-f", - "ctrl-g", - "ctrl-h", - "ctrl-i", - "ctrl-j", - "ctrl-k", - "ctrl-l", - "ctrl-m", - "ctrl-n", - "ctrl-o", - "ctrl-p", - "ctrl-q", - "ctrl-r", - "ctrl-s", - "ctrl-t", - "ctrl-u", - "ctrl-v", - "ctrl-w", - "ctrl-x", - "ctrl-y", - "ctrl-z", - "ctrl-[", - "ctrl-\\", - "ctrl-]", - "ctrl-^", - "ctrl-_", -} - -// ToBytes converts a string representing a suite of key-sequence to the corresponding ASCII code. -func ToBytes(keys string) ([]byte, error) { - codes := []byte{} -next: - for _, key := range strings.Split(keys, ",") { - if len(key) != 1 { - for code, ctrl := range ASCII { - if ctrl == key { - codes = append(codes, byte(code)) - continue next - } - } - if key == "DEL" { - codes = append(codes, 127) - } else { - return nil, fmt.Errorf("Unknown character: '%s'", key) - } - } else { - codes = append(codes, key[0]) - } - } - return codes, nil -} diff --git a/vendor/github.com/docker/docker/pkg/term/proxy.go b/vendor/github.com/docker/docker/pkg/term/proxy.go deleted file mode 100644 index da733e58484c..000000000000 --- a/vendor/github.com/docker/docker/pkg/term/proxy.go +++ /dev/null @@ -1,78 +0,0 @@ -package term // import "github.com/docker/docker/pkg/term" - -import ( - "io" -) - -// EscapeError is special error which returned by a TTY proxy reader's Read() -// method in case its detach escape sequence is read. -type EscapeError struct{} - -func (EscapeError) Error() string { - return "read escape sequence" -} - -// escapeProxy is used only for attaches with a TTY. It is used to proxy -// stdin keypresses from the underlying reader and look for the passed in -// escape key sequence to signal a detach. -type escapeProxy struct { - escapeKeys []byte - escapeKeyPos int - r io.Reader -} - -// NewEscapeProxy returns a new TTY proxy reader which wraps the given reader -// and detects when the specified escape keys are read, in which case the Read -// method will return an error of type EscapeError. -func NewEscapeProxy(r io.Reader, escapeKeys []byte) io.Reader { - return &escapeProxy{ - escapeKeys: escapeKeys, - r: r, - } -} - -func (r *escapeProxy) Read(buf []byte) (int, error) { - nr, err := r.r.Read(buf) - - if len(r.escapeKeys) == 0 { - return nr, err - } - - preserve := func() { - // this preserves the original key presses in the passed in buffer - nr += r.escapeKeyPos - preserve := make([]byte, 0, r.escapeKeyPos+len(buf)) - preserve = append(preserve, r.escapeKeys[:r.escapeKeyPos]...) - preserve = append(preserve, buf...) - r.escapeKeyPos = 0 - copy(buf[0:nr], preserve) - } - - if nr != 1 || err != nil { - if r.escapeKeyPos > 0 { - preserve() - } - return nr, err - } - - if buf[0] != r.escapeKeys[r.escapeKeyPos] { - if r.escapeKeyPos > 0 { - preserve() - } - return nr, nil - } - - if r.escapeKeyPos == len(r.escapeKeys)-1 { - return 0, EscapeError{} - } - - // Looks like we've got an escape key, but we need to match again on the next - // read. - // Store the current escape key we found so we can look for the next one on - // the next read. - // Since this is an escape key, make sure we don't let the caller read it - // If later on we find that this is not the escape sequence, we'll add the - // keys back - r.escapeKeyPos++ - return nr - r.escapeKeyPos, nil -} diff --git a/vendor/github.com/docker/docker/pkg/term/tc.go b/vendor/github.com/docker/docker/pkg/term/tc.go deleted file mode 100644 index 01bcaa8abb18..000000000000 --- a/vendor/github.com/docker/docker/pkg/term/tc.go +++ /dev/null @@ -1,20 +0,0 @@ -// +build !windows - -package term // import "github.com/docker/docker/pkg/term" - -import ( - "syscall" - "unsafe" - - "golang.org/x/sys/unix" -) - -func tcget(fd uintptr, p *Termios) syscall.Errno { - _, _, err := unix.Syscall(unix.SYS_IOCTL, fd, uintptr(getTermios), uintptr(unsafe.Pointer(p))) - return err -} - -func tcset(fd uintptr, p *Termios) syscall.Errno { - _, _, err := unix.Syscall(unix.SYS_IOCTL, fd, setTermios, uintptr(unsafe.Pointer(p))) - return err -} diff --git a/vendor/github.com/docker/docker/pkg/term/term.go b/vendor/github.com/docker/docker/pkg/term/term.go deleted file mode 100644 index 0589a955194b..000000000000 --- a/vendor/github.com/docker/docker/pkg/term/term.go +++ /dev/null @@ -1,124 +0,0 @@ -// +build !windows - -// Package term provides structures and helper functions to work with -// terminal (state, sizes). -package term // import "github.com/docker/docker/pkg/term" - -import ( - "errors" - "fmt" - "io" - "os" - "os/signal" - - "golang.org/x/sys/unix" -) - -var ( - // ErrInvalidState is returned if the state of the terminal is invalid. - ErrInvalidState = errors.New("Invalid terminal state") -) - -// State represents the state of the terminal. -type State struct { - termios Termios -} - -// Winsize represents the size of the terminal window. -type Winsize struct { - Height uint16 - Width uint16 - x uint16 - y uint16 -} - -// StdStreams returns the standard streams (stdin, stdout, stderr). -func StdStreams() (stdIn io.ReadCloser, stdOut, stdErr io.Writer) { - return os.Stdin, os.Stdout, os.Stderr -} - -// GetFdInfo returns the file descriptor for an os.File and indicates whether the file represents a terminal. -func GetFdInfo(in interface{}) (uintptr, bool) { - var inFd uintptr - var isTerminalIn bool - if file, ok := in.(*os.File); ok { - inFd = file.Fd() - isTerminalIn = IsTerminal(inFd) - } - return inFd, isTerminalIn -} - -// IsTerminal returns true if the given file descriptor is a terminal. -func IsTerminal(fd uintptr) bool { - var termios Termios - return tcget(fd, &termios) == 0 -} - -// RestoreTerminal restores the terminal connected to the given file descriptor -// to a previous state. -func RestoreTerminal(fd uintptr, state *State) error { - if state == nil { - return ErrInvalidState - } - if err := tcset(fd, &state.termios); err != 0 { - return err - } - return nil -} - -// SaveState saves the state of the terminal connected to the given file descriptor. -func SaveState(fd uintptr) (*State, error) { - var oldState State - if err := tcget(fd, &oldState.termios); err != 0 { - return nil, err - } - - return &oldState, nil -} - -// DisableEcho applies the specified state to the terminal connected to the file -// descriptor, with echo disabled. -func DisableEcho(fd uintptr, state *State) error { - newState := state.termios - newState.Lflag &^= unix.ECHO - - if err := tcset(fd, &newState); err != 0 { - return err - } - handleInterrupt(fd, state) - return nil -} - -// SetRawTerminal puts the terminal connected to the given file descriptor into -// raw mode and returns the previous state. On UNIX, this puts both the input -// and output into raw mode. On Windows, it only puts the input into raw mode. -func SetRawTerminal(fd uintptr) (*State, error) { - oldState, err := MakeRaw(fd) - if err != nil { - return nil, err - } - handleInterrupt(fd, oldState) - return oldState, err -} - -// SetRawTerminalOutput puts the output of terminal connected to the given file -// descriptor into raw mode. On UNIX, this does nothing and returns nil for the -// state. On Windows, it disables LF -> CRLF translation. -func SetRawTerminalOutput(fd uintptr) (*State, error) { - return nil, nil -} - -func handleInterrupt(fd uintptr, state *State) { - sigchan := make(chan os.Signal, 1) - signal.Notify(sigchan, os.Interrupt) - go func() { - for range sigchan { - // quit cleanly and the new terminal item is on a new line - fmt.Println() - signal.Stop(sigchan) - close(sigchan) - RestoreTerminal(fd, state) - os.Exit(1) - } - }() -} diff --git a/vendor/github.com/docker/docker/pkg/term/term_windows.go b/vendor/github.com/docker/docker/pkg/term/term_windows.go deleted file mode 100644 index a3c3db131574..000000000000 --- a/vendor/github.com/docker/docker/pkg/term/term_windows.go +++ /dev/null @@ -1,221 +0,0 @@ -package term // import "github.com/docker/docker/pkg/term" - -import ( - "io" - "os" - "os/signal" - "syscall" // used for STD_INPUT_HANDLE, STD_OUTPUT_HANDLE and STD_ERROR_HANDLE - - "github.com/Azure/go-ansiterm/winterm" - "github.com/docker/docker/pkg/term/windows" -) - -// State holds the console mode for the terminal. -type State struct { - mode uint32 -} - -// Winsize is used for window size. -type Winsize struct { - Height uint16 - Width uint16 -} - -// vtInputSupported is true if winterm.ENABLE_VIRTUAL_TERMINAL_INPUT is supported by the console -var vtInputSupported bool - -// StdStreams returns the standard streams (stdin, stdout, stderr). -func StdStreams() (stdIn io.ReadCloser, stdOut, stdErr io.Writer) { - // Turn on VT handling on all std handles, if possible. This might - // fail, in which case we will fall back to terminal emulation. - var emulateStdin, emulateStdout, emulateStderr bool - fd := os.Stdin.Fd() - if mode, err := winterm.GetConsoleMode(fd); err == nil { - // Validate that winterm.ENABLE_VIRTUAL_TERMINAL_INPUT is supported, but do not set it. - if err = winterm.SetConsoleMode(fd, mode|winterm.ENABLE_VIRTUAL_TERMINAL_INPUT); err != nil { - emulateStdin = true - } else { - vtInputSupported = true - } - // Unconditionally set the console mode back even on failure because SetConsoleMode - // remembers invalid bits on input handles. - winterm.SetConsoleMode(fd, mode) - } - - fd = os.Stdout.Fd() - if mode, err := winterm.GetConsoleMode(fd); err == nil { - // Validate winterm.DISABLE_NEWLINE_AUTO_RETURN is supported, but do not set it. - if err = winterm.SetConsoleMode(fd, mode|winterm.ENABLE_VIRTUAL_TERMINAL_PROCESSING|winterm.DISABLE_NEWLINE_AUTO_RETURN); err != nil { - emulateStdout = true - } else { - winterm.SetConsoleMode(fd, mode|winterm.ENABLE_VIRTUAL_TERMINAL_PROCESSING) - } - } - - fd = os.Stderr.Fd() - if mode, err := winterm.GetConsoleMode(fd); err == nil { - // Validate winterm.DISABLE_NEWLINE_AUTO_RETURN is supported, but do not set it. - if err = winterm.SetConsoleMode(fd, mode|winterm.ENABLE_VIRTUAL_TERMINAL_PROCESSING|winterm.DISABLE_NEWLINE_AUTO_RETURN); err != nil { - emulateStderr = true - } else { - winterm.SetConsoleMode(fd, mode|winterm.ENABLE_VIRTUAL_TERMINAL_PROCESSING) - } - } - - // Temporarily use STD_INPUT_HANDLE, STD_OUTPUT_HANDLE and - // STD_ERROR_HANDLE from syscall rather than x/sys/windows as long as - // go-ansiterm hasn't switch to x/sys/windows. - // TODO: switch back to x/sys/windows once go-ansiterm has switched - if emulateStdin { - stdIn = windowsconsole.NewAnsiReader(syscall.STD_INPUT_HANDLE) - } else { - stdIn = os.Stdin - } - - if emulateStdout { - stdOut = windowsconsole.NewAnsiWriter(syscall.STD_OUTPUT_HANDLE) - } else { - stdOut = os.Stdout - } - - if emulateStderr { - stdErr = windowsconsole.NewAnsiWriter(syscall.STD_ERROR_HANDLE) - } else { - stdErr = os.Stderr - } - - return -} - -// GetFdInfo returns the file descriptor for an os.File and indicates whether the file represents a terminal. -func GetFdInfo(in interface{}) (uintptr, bool) { - return windowsconsole.GetHandleInfo(in) -} - -// GetWinsize returns the window size based on the specified file descriptor. -func GetWinsize(fd uintptr) (*Winsize, error) { - info, err := winterm.GetConsoleScreenBufferInfo(fd) - if err != nil { - return nil, err - } - - winsize := &Winsize{ - Width: uint16(info.Window.Right - info.Window.Left + 1), - Height: uint16(info.Window.Bottom - info.Window.Top + 1), - } - - return winsize, nil -} - -// IsTerminal returns true if the given file descriptor is a terminal. -func IsTerminal(fd uintptr) bool { - return windowsconsole.IsConsole(fd) -} - -// RestoreTerminal restores the terminal connected to the given file descriptor -// to a previous state. -func RestoreTerminal(fd uintptr, state *State) error { - return winterm.SetConsoleMode(fd, state.mode) -} - -// SaveState saves the state of the terminal connected to the given file descriptor. -func SaveState(fd uintptr) (*State, error) { - mode, e := winterm.GetConsoleMode(fd) - if e != nil { - return nil, e - } - - return &State{mode: mode}, nil -} - -// DisableEcho disables echo for the terminal connected to the given file descriptor. -// -- See https://msdn.microsoft.com/en-us/library/windows/desktop/ms683462(v=vs.85).aspx -func DisableEcho(fd uintptr, state *State) error { - mode := state.mode - mode &^= winterm.ENABLE_ECHO_INPUT - mode |= winterm.ENABLE_PROCESSED_INPUT | winterm.ENABLE_LINE_INPUT - err := winterm.SetConsoleMode(fd, mode) - if err != nil { - return err - } - - // Register an interrupt handler to catch and restore prior state - restoreAtInterrupt(fd, state) - return nil -} - -// SetRawTerminal puts the terminal connected to the given file descriptor into -// raw mode and returns the previous state. On UNIX, this puts both the input -// and output into raw mode. On Windows, it only puts the input into raw mode. -func SetRawTerminal(fd uintptr) (*State, error) { - state, err := MakeRaw(fd) - if err != nil { - return nil, err - } - - // Register an interrupt handler to catch and restore prior state - restoreAtInterrupt(fd, state) - return state, err -} - -// SetRawTerminalOutput puts the output of terminal connected to the given file -// descriptor into raw mode. On UNIX, this does nothing and returns nil for the -// state. On Windows, it disables LF -> CRLF translation. -func SetRawTerminalOutput(fd uintptr) (*State, error) { - state, err := SaveState(fd) - if err != nil { - return nil, err - } - - // Ignore failures, since winterm.DISABLE_NEWLINE_AUTO_RETURN might not be supported on this - // version of Windows. - winterm.SetConsoleMode(fd, state.mode|winterm.DISABLE_NEWLINE_AUTO_RETURN) - return state, err -} - -// MakeRaw puts the terminal (Windows Console) connected to the given file descriptor into raw -// mode and returns the previous state of the terminal so that it can be restored. -func MakeRaw(fd uintptr) (*State, error) { - state, err := SaveState(fd) - if err != nil { - return nil, err - } - - mode := state.mode - - // See - // -- https://msdn.microsoft.com/en-us/library/windows/desktop/ms686033(v=vs.85).aspx - // -- https://msdn.microsoft.com/en-us/library/windows/desktop/ms683462(v=vs.85).aspx - - // Disable these modes - mode &^= winterm.ENABLE_ECHO_INPUT - mode &^= winterm.ENABLE_LINE_INPUT - mode &^= winterm.ENABLE_MOUSE_INPUT - mode &^= winterm.ENABLE_WINDOW_INPUT - mode &^= winterm.ENABLE_PROCESSED_INPUT - - // Enable these modes - mode |= winterm.ENABLE_EXTENDED_FLAGS - mode |= winterm.ENABLE_INSERT_MODE - mode |= winterm.ENABLE_QUICK_EDIT_MODE - if vtInputSupported { - mode |= winterm.ENABLE_VIRTUAL_TERMINAL_INPUT - } - - err = winterm.SetConsoleMode(fd, mode) - if err != nil { - return nil, err - } - return state, nil -} - -func restoreAtInterrupt(fd uintptr, state *State) { - sigchan := make(chan os.Signal, 1) - signal.Notify(sigchan, os.Interrupt) - - go func() { - _ = <-sigchan - RestoreTerminal(fd, state) - os.Exit(0) - }() -} diff --git a/vendor/github.com/docker/docker/pkg/term/termios_bsd.go b/vendor/github.com/docker/docker/pkg/term/termios_bsd.go deleted file mode 100644 index 48b16f52039c..000000000000 --- a/vendor/github.com/docker/docker/pkg/term/termios_bsd.go +++ /dev/null @@ -1,42 +0,0 @@ -// +build darwin freebsd openbsd netbsd - -package term // import "github.com/docker/docker/pkg/term" - -import ( - "unsafe" - - "golang.org/x/sys/unix" -) - -const ( - getTermios = unix.TIOCGETA - setTermios = unix.TIOCSETA -) - -// Termios is the Unix API for terminal I/O. -type Termios unix.Termios - -// MakeRaw put the terminal connected to the given file descriptor into raw -// mode and returns the previous state of the terminal so that it can be -// restored. -func MakeRaw(fd uintptr) (*State, error) { - var oldState State - if _, _, err := unix.Syscall(unix.SYS_IOCTL, fd, getTermios, uintptr(unsafe.Pointer(&oldState.termios))); err != 0 { - return nil, err - } - - newState := oldState.termios - newState.Iflag &^= (unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP | unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON) - newState.Oflag &^= unix.OPOST - newState.Lflag &^= (unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN) - newState.Cflag &^= (unix.CSIZE | unix.PARENB) - newState.Cflag |= unix.CS8 - newState.Cc[unix.VMIN] = 1 - newState.Cc[unix.VTIME] = 0 - - if _, _, err := unix.Syscall(unix.SYS_IOCTL, fd, setTermios, uintptr(unsafe.Pointer(&newState))); err != 0 { - return nil, err - } - - return &oldState, nil -} diff --git a/vendor/github.com/docker/docker/pkg/term/termios_linux.go b/vendor/github.com/docker/docker/pkg/term/termios_linux.go deleted file mode 100644 index 6d4c63fdb75e..000000000000 --- a/vendor/github.com/docker/docker/pkg/term/termios_linux.go +++ /dev/null @@ -1,39 +0,0 @@ -package term // import "github.com/docker/docker/pkg/term" - -import ( - "golang.org/x/sys/unix" -) - -const ( - getTermios = unix.TCGETS - setTermios = unix.TCSETS -) - -// Termios is the Unix API for terminal I/O. -type Termios unix.Termios - -// MakeRaw put the terminal connected to the given file descriptor into raw -// mode and returns the previous state of the terminal so that it can be -// restored. -func MakeRaw(fd uintptr) (*State, error) { - termios, err := unix.IoctlGetTermios(int(fd), getTermios) - if err != nil { - return nil, err - } - - var oldState State - oldState.termios = Termios(*termios) - - termios.Iflag &^= (unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP | unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON) - termios.Oflag &^= unix.OPOST - termios.Lflag &^= (unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN) - termios.Cflag &^= (unix.CSIZE | unix.PARENB) - termios.Cflag |= unix.CS8 - termios.Cc[unix.VMIN] = 1 - termios.Cc[unix.VTIME] = 0 - - if err := unix.IoctlSetTermios(int(fd), setTermios, termios); err != nil { - return nil, err - } - return &oldState, nil -} diff --git a/vendor/github.com/docker/docker/pkg/term/windows/ansi_reader.go b/vendor/github.com/docker/docker/pkg/term/windows/ansi_reader.go deleted file mode 100644 index 1d7c452cc845..000000000000 --- a/vendor/github.com/docker/docker/pkg/term/windows/ansi_reader.go +++ /dev/null @@ -1,263 +0,0 @@ -// +build windows - -package windowsconsole // import "github.com/docker/docker/pkg/term/windows" - -import ( - "bytes" - "errors" - "fmt" - "io" - "os" - "strings" - "unsafe" - - ansiterm "github.com/Azure/go-ansiterm" - "github.com/Azure/go-ansiterm/winterm" -) - -const ( - escapeSequence = ansiterm.KEY_ESC_CSI -) - -// ansiReader wraps a standard input file (e.g., os.Stdin) providing ANSI sequence translation. -type ansiReader struct { - file *os.File - fd uintptr - buffer []byte - cbBuffer int - command []byte -} - -// NewAnsiReader returns an io.ReadCloser that provides VT100 terminal emulation on top of a -// Windows console input handle. -func NewAnsiReader(nFile int) io.ReadCloser { - initLogger() - file, fd := winterm.GetStdFile(nFile) - return &ansiReader{ - file: file, - fd: fd, - command: make([]byte, 0, ansiterm.ANSI_MAX_CMD_LENGTH), - buffer: make([]byte, 0), - } -} - -// Close closes the wrapped file. -func (ar *ansiReader) Close() (err error) { - return ar.file.Close() -} - -// Fd returns the file descriptor of the wrapped file. -func (ar *ansiReader) Fd() uintptr { - return ar.fd -} - -// Read reads up to len(p) bytes of translated input events into p. -func (ar *ansiReader) Read(p []byte) (int, error) { - if len(p) == 0 { - return 0, nil - } - - // Previously read bytes exist, read as much as we can and return - if len(ar.buffer) > 0 { - logger.Debugf("Reading previously cached bytes") - - originalLength := len(ar.buffer) - copiedLength := copy(p, ar.buffer) - - if copiedLength == originalLength { - ar.buffer = make([]byte, 0, len(p)) - } else { - ar.buffer = ar.buffer[copiedLength:] - } - - logger.Debugf("Read from cache p[%d]: % x", copiedLength, p) - return copiedLength, nil - } - - // Read and translate key events - events, err := readInputEvents(ar.fd, len(p)) - if err != nil { - return 0, err - } else if len(events) == 0 { - logger.Debug("No input events detected") - return 0, nil - } - - keyBytes := translateKeyEvents(events, []byte(escapeSequence)) - - // Save excess bytes and right-size keyBytes - if len(keyBytes) > len(p) { - logger.Debugf("Received %d keyBytes, only room for %d bytes", len(keyBytes), len(p)) - ar.buffer = keyBytes[len(p):] - keyBytes = keyBytes[:len(p)] - } else if len(keyBytes) == 0 { - logger.Debug("No key bytes returned from the translator") - return 0, nil - } - - copiedLength := copy(p, keyBytes) - if copiedLength != len(keyBytes) { - return 0, errors.New("unexpected copy length encountered") - } - - logger.Debugf("Read p[%d]: % x", copiedLength, p) - logger.Debugf("Read keyBytes[%d]: % x", copiedLength, keyBytes) - return copiedLength, nil -} - -// readInputEvents polls until at least one event is available. -func readInputEvents(fd uintptr, maxBytes int) ([]winterm.INPUT_RECORD, error) { - // Determine the maximum number of records to retrieve - // -- Cast around the type system to obtain the size of a single INPUT_RECORD. - // unsafe.Sizeof requires an expression vs. a type-reference; the casting - // tricks the type system into believing it has such an expression. - recordSize := int(unsafe.Sizeof(*((*winterm.INPUT_RECORD)(unsafe.Pointer(&maxBytes))))) - countRecords := maxBytes / recordSize - if countRecords > ansiterm.MAX_INPUT_EVENTS { - countRecords = ansiterm.MAX_INPUT_EVENTS - } else if countRecords == 0 { - countRecords = 1 - } - logger.Debugf("[windows] readInputEvents: Reading %v records (buffer size %v, record size %v)", countRecords, maxBytes, recordSize) - - // Wait for and read input events - events := make([]winterm.INPUT_RECORD, countRecords) - nEvents := uint32(0) - eventsExist, err := winterm.WaitForSingleObject(fd, winterm.WAIT_INFINITE) - if err != nil { - return nil, err - } - - if eventsExist { - err = winterm.ReadConsoleInput(fd, events, &nEvents) - if err != nil { - return nil, err - } - } - - // Return a slice restricted to the number of returned records - logger.Debugf("[windows] readInputEvents: Read %v events", nEvents) - return events[:nEvents], nil -} - -// KeyEvent Translation Helpers - -var arrowKeyMapPrefix = map[uint16]string{ - winterm.VK_UP: "%s%sA", - winterm.VK_DOWN: "%s%sB", - winterm.VK_RIGHT: "%s%sC", - winterm.VK_LEFT: "%s%sD", -} - -var keyMapPrefix = map[uint16]string{ - winterm.VK_UP: "\x1B[%sA", - winterm.VK_DOWN: "\x1B[%sB", - winterm.VK_RIGHT: "\x1B[%sC", - winterm.VK_LEFT: "\x1B[%sD", - winterm.VK_HOME: "\x1B[1%s~", // showkey shows ^[[1 - winterm.VK_END: "\x1B[4%s~", // showkey shows ^[[4 - winterm.VK_INSERT: "\x1B[2%s~", - winterm.VK_DELETE: "\x1B[3%s~", - winterm.VK_PRIOR: "\x1B[5%s~", - winterm.VK_NEXT: "\x1B[6%s~", - winterm.VK_F1: "", - winterm.VK_F2: "", - winterm.VK_F3: "\x1B[13%s~", - winterm.VK_F4: "\x1B[14%s~", - winterm.VK_F5: "\x1B[15%s~", - winterm.VK_F6: "\x1B[17%s~", - winterm.VK_F7: "\x1B[18%s~", - winterm.VK_F8: "\x1B[19%s~", - winterm.VK_F9: "\x1B[20%s~", - winterm.VK_F10: "\x1B[21%s~", - winterm.VK_F11: "\x1B[23%s~", - winterm.VK_F12: "\x1B[24%s~", -} - -// translateKeyEvents converts the input events into the appropriate ANSI string. -func translateKeyEvents(events []winterm.INPUT_RECORD, escapeSequence []byte) []byte { - var buffer bytes.Buffer - for _, event := range events { - if event.EventType == winterm.KEY_EVENT && event.KeyEvent.KeyDown != 0 { - buffer.WriteString(keyToString(&event.KeyEvent, escapeSequence)) - } - } - - return buffer.Bytes() -} - -// keyToString maps the given input event record to the corresponding string. -func keyToString(keyEvent *winterm.KEY_EVENT_RECORD, escapeSequence []byte) string { - if keyEvent.UnicodeChar == 0 { - return formatVirtualKey(keyEvent.VirtualKeyCode, keyEvent.ControlKeyState, escapeSequence) - } - - _, alt, control := getControlKeys(keyEvent.ControlKeyState) - if control { - // TODO(azlinux): Implement following control sequences - // -D Signals the end of input from the keyboard; also exits current shell. - // -H Deletes the first character to the left of the cursor. Also called the ERASE key. - // -Q Restarts printing after it has been stopped with -s. - // -S Suspends printing on the screen (does not stop the program). - // -U Deletes all characters on the current line. Also called the KILL key. - // -E Quits current command and creates a core - - } - - // +Key generates ESC N Key - if !control && alt { - return ansiterm.KEY_ESC_N + strings.ToLower(string(keyEvent.UnicodeChar)) - } - - return string(keyEvent.UnicodeChar) -} - -// formatVirtualKey converts a virtual key (e.g., up arrow) into the appropriate ANSI string. -func formatVirtualKey(key uint16, controlState uint32, escapeSequence []byte) string { - shift, alt, control := getControlKeys(controlState) - modifier := getControlKeysModifier(shift, alt, control) - - if format, ok := arrowKeyMapPrefix[key]; ok { - return fmt.Sprintf(format, escapeSequence, modifier) - } - - if format, ok := keyMapPrefix[key]; ok { - return fmt.Sprintf(format, modifier) - } - - return "" -} - -// getControlKeys extracts the shift, alt, and ctrl key states. -func getControlKeys(controlState uint32) (shift, alt, control bool) { - shift = 0 != (controlState & winterm.SHIFT_PRESSED) - alt = 0 != (controlState & (winterm.LEFT_ALT_PRESSED | winterm.RIGHT_ALT_PRESSED)) - control = 0 != (controlState & (winterm.LEFT_CTRL_PRESSED | winterm.RIGHT_CTRL_PRESSED)) - return shift, alt, control -} - -// getControlKeysModifier returns the ANSI modifier for the given combination of control keys. -func getControlKeysModifier(shift, alt, control bool) string { - if shift && alt && control { - return ansiterm.KEY_CONTROL_PARAM_8 - } - if alt && control { - return ansiterm.KEY_CONTROL_PARAM_7 - } - if shift && control { - return ansiterm.KEY_CONTROL_PARAM_6 - } - if control { - return ansiterm.KEY_CONTROL_PARAM_5 - } - if shift && alt { - return ansiterm.KEY_CONTROL_PARAM_4 - } - if alt { - return ansiterm.KEY_CONTROL_PARAM_3 - } - if shift { - return ansiterm.KEY_CONTROL_PARAM_2 - } - return "" -} diff --git a/vendor/github.com/docker/docker/pkg/term/windows/ansi_writer.go b/vendor/github.com/docker/docker/pkg/term/windows/ansi_writer.go deleted file mode 100644 index 7799a03fc59e..000000000000 --- a/vendor/github.com/docker/docker/pkg/term/windows/ansi_writer.go +++ /dev/null @@ -1,64 +0,0 @@ -// +build windows - -package windowsconsole // import "github.com/docker/docker/pkg/term/windows" - -import ( - "io" - "os" - - ansiterm "github.com/Azure/go-ansiterm" - "github.com/Azure/go-ansiterm/winterm" -) - -// ansiWriter wraps a standard output file (e.g., os.Stdout) providing ANSI sequence translation. -type ansiWriter struct { - file *os.File - fd uintptr - infoReset *winterm.CONSOLE_SCREEN_BUFFER_INFO - command []byte - escapeSequence []byte - inAnsiSequence bool - parser *ansiterm.AnsiParser -} - -// NewAnsiWriter returns an io.Writer that provides VT100 terminal emulation on top of a -// Windows console output handle. -func NewAnsiWriter(nFile int) io.Writer { - initLogger() - file, fd := winterm.GetStdFile(nFile) - info, err := winterm.GetConsoleScreenBufferInfo(fd) - if err != nil { - return nil - } - - parser := ansiterm.CreateParser("Ground", winterm.CreateWinEventHandler(fd, file)) - logger.Infof("newAnsiWriter: parser %p", parser) - - aw := &ansiWriter{ - file: file, - fd: fd, - infoReset: info, - command: make([]byte, 0, ansiterm.ANSI_MAX_CMD_LENGTH), - escapeSequence: []byte(ansiterm.KEY_ESC_CSI), - parser: parser, - } - - logger.Infof("newAnsiWriter: aw.parser %p", aw.parser) - logger.Infof("newAnsiWriter: %v", aw) - return aw -} - -func (aw *ansiWriter) Fd() uintptr { - return aw.fd -} - -// Write writes len(p) bytes from p to the underlying data stream. -func (aw *ansiWriter) Write(p []byte) (total int, err error) { - if len(p) == 0 { - return 0, nil - } - - logger.Infof("Write: % x", p) - logger.Infof("Write: %s", string(p)) - return aw.parser.Parse(p) -} diff --git a/vendor/github.com/docker/docker/pkg/term/windows/console.go b/vendor/github.com/docker/docker/pkg/term/windows/console.go deleted file mode 100644 index 527401975805..000000000000 --- a/vendor/github.com/docker/docker/pkg/term/windows/console.go +++ /dev/null @@ -1,35 +0,0 @@ -// +build windows - -package windowsconsole // import "github.com/docker/docker/pkg/term/windows" - -import ( - "os" - - "github.com/Azure/go-ansiterm/winterm" -) - -// GetHandleInfo returns file descriptor and bool indicating whether the file is a console. -func GetHandleInfo(in interface{}) (uintptr, bool) { - switch t := in.(type) { - case *ansiReader: - return t.Fd(), true - case *ansiWriter: - return t.Fd(), true - } - - var inFd uintptr - var isTerminal bool - - if file, ok := in.(*os.File); ok { - inFd = file.Fd() - isTerminal = IsConsole(inFd) - } - return inFd, isTerminal -} - -// IsConsole returns true if the given file descriptor is a Windows Console. -// The code assumes that GetConsoleMode will return an error for file descriptors that are not a console. -func IsConsole(fd uintptr) bool { - _, e := winterm.GetConsoleMode(fd) - return e == nil -} diff --git a/vendor/github.com/docker/docker/pkg/term/windows/windows.go b/vendor/github.com/docker/docker/pkg/term/windows/windows.go deleted file mode 100644 index 3e5593ca6a68..000000000000 --- a/vendor/github.com/docker/docker/pkg/term/windows/windows.go +++ /dev/null @@ -1,33 +0,0 @@ -// These files implement ANSI-aware input and output streams for use by the Docker Windows client. -// When asked for the set of standard streams (e.g., stdin, stdout, stderr), the code will create -// and return pseudo-streams that convert ANSI sequences to / from Windows Console API calls. - -package windowsconsole // import "github.com/docker/docker/pkg/term/windows" - -import ( - "io/ioutil" - "os" - "sync" - - "github.com/Azure/go-ansiterm" - "github.com/sirupsen/logrus" -) - -var logger *logrus.Logger -var initOnce sync.Once - -func initLogger() { - initOnce.Do(func() { - logFile := ioutil.Discard - - if isDebugEnv := os.Getenv(ansiterm.LogEnv); isDebugEnv == "1" { - logFile, _ = os.Create("ansiReaderWriter.log") - } - - logger = &logrus.Logger{ - Out: logFile, - Formatter: new(logrus.TextFormatter), - Level: logrus.DebugLevel, - } - }) -} diff --git a/vendor/github.com/docker/docker/pkg/term/winsize.go b/vendor/github.com/docker/docker/pkg/term/winsize.go deleted file mode 100644 index a19663ad834b..000000000000 --- a/vendor/github.com/docker/docker/pkg/term/winsize.go +++ /dev/null @@ -1,20 +0,0 @@ -// +build !windows - -package term // import "github.com/docker/docker/pkg/term" - -import ( - "golang.org/x/sys/unix" -) - -// GetWinsize returns the window size based on the specified file descriptor. -func GetWinsize(fd uintptr) (*Winsize, error) { - uws, err := unix.IoctlGetWinsize(int(fd), unix.TIOCGWINSZ) - ws := &Winsize{Height: uws.Row, Width: uws.Col, x: uws.Xpixel, y: uws.Ypixel} - return ws, err -} - -// SetWinsize tries to set the specified window size for the specified file descriptor. -func SetWinsize(fd uintptr, ws *Winsize) error { - uws := &unix.Winsize{Row: ws.Height, Col: ws.Width, Xpixel: ws.x, Ypixel: ws.y} - return unix.IoctlSetWinsize(int(fd), unix.TIOCSWINSZ, uws) -} diff --git a/vendor/github.com/docker/libnetwork/LICENSE b/vendor/github.com/docker/libnetwork/LICENSE deleted file mode 100644 index e06d2081865a..000000000000 --- a/vendor/github.com/docker/libnetwork/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - diff --git a/vendor/github.com/docker/libnetwork/ipamutils/utils.go b/vendor/github.com/docker/libnetwork/ipamutils/utils.go deleted file mode 100644 index 3fd37cd88403..000000000000 --- a/vendor/github.com/docker/libnetwork/ipamutils/utils.go +++ /dev/null @@ -1,135 +0,0 @@ -// Package ipamutils provides utility functions for ipam management -package ipamutils - -import ( - "fmt" - "net" - "sync" -) - -var ( - // PredefinedLocalScopeDefaultNetworks contains a list of 31 IPv4 private networks with host size 16 and 12 - // (172.17-31.x.x/16, 192.168.x.x/20) which do not overlap with the networks in `PredefinedGlobalScopeDefaultNetworks` - PredefinedLocalScopeDefaultNetworks []*net.IPNet - // PredefinedGlobalScopeDefaultNetworks contains a list of 64K IPv4 private networks with host size 8 - // (10.x.x.x/24) which do not overlap with the networks in `PredefinedLocalScopeDefaultNetworks` - PredefinedGlobalScopeDefaultNetworks []*net.IPNet - mutex sync.Mutex - localScopeDefaultNetworks = []*NetworkToSplit{{"172.17.0.0/16", 16}, {"172.18.0.0/16", 16}, {"172.19.0.0/16", 16}, - {"172.20.0.0/14", 16}, {"172.24.0.0/14", 16}, {"172.28.0.0/14", 16}, - {"192.168.0.0/16", 20}} - globalScopeDefaultNetworks = []*NetworkToSplit{{"10.0.0.0/8", 24}} -) - -// NetworkToSplit represent a network that has to be split in chunks with mask length Size. -// Each subnet in the set is derived from the Base pool. Base is to be passed -// in CIDR format. -// Example: a Base "10.10.0.0/16 with Size 24 will define the set of 256 -// 10.10.[0-255].0/24 address pools -type NetworkToSplit struct { - Base string `json:"base"` - Size int `json:"size"` -} - -func init() { - var err error - if PredefinedGlobalScopeDefaultNetworks, err = splitNetworks(globalScopeDefaultNetworks); err != nil { - //we are going to panic in case of error as we should never get into this state - panic("InitAddressPools failed to initialize the global scope default address pool") - } - - if PredefinedLocalScopeDefaultNetworks, err = splitNetworks(localScopeDefaultNetworks); err != nil { - //we are going to panic in case of error as we should never get into this state - panic("InitAddressPools failed to initialize the local scope default address pool") - } -} - -// configDefaultNetworks configures local as well global default pool based on input -func configDefaultNetworks(defaultAddressPool []*NetworkToSplit, result *[]*net.IPNet) error { - mutex.Lock() - defer mutex.Unlock() - defaultNetworks, err := splitNetworks(defaultAddressPool) - if err != nil { - return err - } - *result = defaultNetworks - return nil -} - -// GetGlobalScopeDefaultNetworks returns PredefinedGlobalScopeDefaultNetworks -func GetGlobalScopeDefaultNetworks() []*net.IPNet { - mutex.Lock() - defer mutex.Unlock() - return PredefinedGlobalScopeDefaultNetworks -} - -// GetLocalScopeDefaultNetworks returns PredefinedLocalScopeDefaultNetworks -func GetLocalScopeDefaultNetworks() []*net.IPNet { - mutex.Lock() - defer mutex.Unlock() - return PredefinedLocalScopeDefaultNetworks -} - -// ConfigGlobalScopeDefaultNetworks configures global default pool. -// Ideally this will be called from SwarmKit as part of swarm init -func ConfigGlobalScopeDefaultNetworks(defaultAddressPool []*NetworkToSplit) error { - if defaultAddressPool == nil { - defaultAddressPool = globalScopeDefaultNetworks - } - return configDefaultNetworks(defaultAddressPool, &PredefinedGlobalScopeDefaultNetworks) -} - -// ConfigLocalScopeDefaultNetworks configures local default pool. -// Ideally this will be called during libnetwork init -func ConfigLocalScopeDefaultNetworks(defaultAddressPool []*NetworkToSplit) error { - if defaultAddressPool == nil { - return nil - } - return configDefaultNetworks(defaultAddressPool, &PredefinedLocalScopeDefaultNetworks) -} - -// splitNetworks takes a slice of networks, split them accordingly and returns them -func splitNetworks(list []*NetworkToSplit) ([]*net.IPNet, error) { - localPools := make([]*net.IPNet, 0, len(list)) - - for _, p := range list { - _, b, err := net.ParseCIDR(p.Base) - if err != nil { - return nil, fmt.Errorf("invalid base pool %q: %v", p.Base, err) - } - ones, _ := b.Mask.Size() - if p.Size <= 0 || p.Size < ones { - return nil, fmt.Errorf("invalid pools size: %d", p.Size) - } - localPools = append(localPools, splitNetwork(p.Size, b)...) - } - return localPools, nil -} - -func splitNetwork(size int, base *net.IPNet) []*net.IPNet { - one, bits := base.Mask.Size() - mask := net.CIDRMask(size, bits) - n := 1 << uint(size-one) - s := uint(bits - size) - list := make([]*net.IPNet, 0, n) - - for i := 0; i < n; i++ { - ip := copyIP(base.IP) - addIntToIP(ip, uint(i<= 0; i-- { - array[i] |= (byte)(ordinal & 0xff) - ordinal >>= 8 - } -} diff --git a/vendor/github.com/docker/spdystream/LICENSE b/vendor/github.com/docker/spdystream/LICENSE deleted file mode 100644 index 9e4bd4dbee94..000000000000 --- a/vendor/github.com/docker/spdystream/LICENSE +++ /dev/null @@ -1,191 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - Copyright 2014-2015 Docker, Inc. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/github.com/docker/spdystream/LICENSE.docs b/vendor/github.com/docker/spdystream/LICENSE.docs deleted file mode 100644 index e26cd4fc8ed9..000000000000 --- a/vendor/github.com/docker/spdystream/LICENSE.docs +++ /dev/null @@ -1,425 +0,0 @@ -Attribution-ShareAlike 4.0 International - -======================================================================= - -Creative Commons Corporation ("Creative Commons") is not a law firm and -does not provide legal services or legal advice. Distribution of -Creative Commons public licenses does not create a lawyer-client or -other relationship. Creative Commons makes its licenses and related -information available on an "as-is" basis. Creative Commons gives no -warranties regarding its licenses, any material licensed under their -terms and conditions, or any related information. Creative Commons -disclaims all liability for damages resulting from their use to the -fullest extent possible. - -Using Creative Commons Public Licenses - -Creative Commons public licenses provide a standard set of terms and -conditions that creators and other rights holders may use to share -original works of authorship and other material subject to copyright -and certain other rights specified in the public license below. The -following considerations are for informational purposes only, are not -exhaustive, and do not form part of our licenses. - - Considerations for licensors: Our public licenses are - intended for use by those authorized to give the public - permission to use material in ways otherwise restricted by - copyright and certain other rights. Our licenses are - irrevocable. Licensors should read and understand the terms - and conditions of the license they choose before applying it. - Licensors should also secure all rights necessary before - applying our licenses so that the public can reuse the - material as expected. Licensors should clearly mark any - material not subject to the license. This includes other CC- - licensed material, or material used under an exception or - limitation to copyright. More considerations for licensors: - wiki.creativecommons.org/Considerations_for_licensors - - Considerations for the public: By using one of our public - licenses, a licensor grants the public permission to use the - licensed material under specified terms and conditions. If - the licensor's permission is not necessary for any reason--for - example, because of any applicable exception or limitation to - copyright--then that use is not regulated by the license. Our - licenses grant only permissions under copyright and certain - other rights that a licensor has authority to grant. Use of - the licensed material may still be restricted for other - reasons, including because others have copyright or other - rights in the material. A licensor may make special requests, - such as asking that all changes be marked or described. - Although not required by our licenses, you are encouraged to - respect those requests where reasonable. More_considerations - for the public: - wiki.creativecommons.org/Considerations_for_licensees - -======================================================================= - -Creative Commons Attribution-ShareAlike 4.0 International Public -License - -By exercising the Licensed Rights (defined below), You accept and agree -to be bound by the terms and conditions of this Creative Commons -Attribution-ShareAlike 4.0 International Public License ("Public -License"). To the extent this Public License may be interpreted as a -contract, You are granted the Licensed Rights in consideration of Your -acceptance of these terms and conditions, and the Licensor grants You -such rights in consideration of benefits the Licensor receives from -making the Licensed Material available under these terms and -conditions. - - -Section 1 -- Definitions. - - a. Adapted Material means material subject to Copyright and Similar - Rights that is derived from or based upon the Licensed Material - and in which the Licensed Material is translated, altered, - arranged, transformed, or otherwise modified in a manner requiring - permission under the Copyright and Similar Rights held by the - Licensor. For purposes of this Public License, where the Licensed - Material is a musical work, performance, or sound recording, - Adapted Material is always produced where the Licensed Material is - synched in timed relation with a moving image. - - b. Adapter's License means the license You apply to Your Copyright - and Similar Rights in Your contributions to Adapted Material in - accordance with the terms and conditions of this Public License. - - c. BY-SA Compatible License means a license listed at - creativecommons.org/compatiblelicenses, approved by Creative - Commons as essentially the equivalent of this Public License. - - d. Copyright and Similar Rights means copyright and/or similar rights - closely related to copyright including, without limitation, - performance, broadcast, sound recording, and Sui Generis Database - Rights, without regard to how the rights are labeled or - categorized. For purposes of this Public License, the rights - specified in Section 2(b)(1)-(2) are not Copyright and Similar - Rights. - - e. Effective Technological Measures means those measures that, in the - absence of proper authority, may not be circumvented under laws - fulfilling obligations under Article 11 of the WIPO Copyright - Treaty adopted on December 20, 1996, and/or similar international - agreements. - - f. Exceptions and Limitations means fair use, fair dealing, and/or - any other exception or limitation to Copyright and Similar Rights - that applies to Your use of the Licensed Material. - - g. License Elements means the license attributes listed in the name - of a Creative Commons Public License. The License Elements of this - Public License are Attribution and ShareAlike. - - h. Licensed Material means the artistic or literary work, database, - or other material to which the Licensor applied this Public - License. - - i. Licensed Rights means the rights granted to You subject to the - terms and conditions of this Public License, which are limited to - all Copyright and Similar Rights that apply to Your use of the - Licensed Material and that the Licensor has authority to license. - - j. Licensor means the individual(s) or entity(ies) granting rights - under this Public License. - - k. Share means to provide material to the public by any means or - process that requires permission under the Licensed Rights, such - as reproduction, public display, public performance, distribution, - dissemination, communication, or importation, and to make material - available to the public including in ways that members of the - public may access the material from a place and at a time - individually chosen by them. - - l. Sui Generis Database Rights means rights other than copyright - resulting from Directive 96/9/EC of the European Parliament and of - the Council of 11 March 1996 on the legal protection of databases, - as amended and/or succeeded, as well as other essentially - equivalent rights anywhere in the world. - - m. You means the individual or entity exercising the Licensed Rights - under this Public License. Your has a corresponding meaning. - - -Section 2 -- Scope. - - a. License grant. - - 1. Subject to the terms and conditions of this Public License, - the Licensor hereby grants You a worldwide, royalty-free, - non-sublicensable, non-exclusive, irrevocable license to - exercise the Licensed Rights in the Licensed Material to: - - a. reproduce and Share the Licensed Material, in whole or - in part; and - - b. produce, reproduce, and Share Adapted Material. - - 2. Exceptions and Limitations. For the avoidance of doubt, where - Exceptions and Limitations apply to Your use, this Public - License does not apply, and You do not need to comply with - its terms and conditions. - - 3. Term. The term of this Public License is specified in Section - 6(a). - - 4. Media and formats; technical modifications allowed. The - Licensor authorizes You to exercise the Licensed Rights in - all media and formats whether now known or hereafter created, - and to make technical modifications necessary to do so. The - Licensor waives and/or agrees not to assert any right or - authority to forbid You from making technical modifications - necessary to exercise the Licensed Rights, including - technical modifications necessary to circumvent Effective - Technological Measures. For purposes of this Public License, - simply making modifications authorized by this Section 2(a) - (4) never produces Adapted Material. - - 5. Downstream recipients. - - a. Offer from the Licensor -- Licensed Material. Every - recipient of the Licensed Material automatically - receives an offer from the Licensor to exercise the - Licensed Rights under the terms and conditions of this - Public License. - - b. Additional offer from the Licensor -- Adapted Material. - Every recipient of Adapted Material from You - automatically receives an offer from the Licensor to - exercise the Licensed Rights in the Adapted Material - under the conditions of the Adapter's License You apply. - - c. No downstream restrictions. You may not offer or impose - any additional or different terms or conditions on, or - apply any Effective Technological Measures to, the - Licensed Material if doing so restricts exercise of the - Licensed Rights by any recipient of the Licensed - Material. - - 6. No endorsement. Nothing in this Public License constitutes or - may be construed as permission to assert or imply that You - are, or that Your use of the Licensed Material is, connected - with, or sponsored, endorsed, or granted official status by, - the Licensor or others designated to receive attribution as - provided in Section 3(a)(1)(A)(i). - - b. Other rights. - - 1. Moral rights, such as the right of integrity, are not - licensed under this Public License, nor are publicity, - privacy, and/or other similar personality rights; however, to - the extent possible, the Licensor waives and/or agrees not to - assert any such rights held by the Licensor to the limited - extent necessary to allow You to exercise the Licensed - Rights, but not otherwise. - - 2. Patent and trademark rights are not licensed under this - Public License. - - 3. To the extent possible, the Licensor waives any right to - collect royalties from You for the exercise of the Licensed - Rights, whether directly or through a collecting society - under any voluntary or waivable statutory or compulsory - licensing scheme. In all other cases the Licensor expressly - reserves any right to collect such royalties. - - -Section 3 -- License Conditions. - -Your exercise of the Licensed Rights is expressly made subject to the -following conditions. - - a. Attribution. - - 1. If You Share the Licensed Material (including in modified - form), You must: - - a. retain the following if it is supplied by the Licensor - with the Licensed Material: - - i. identification of the creator(s) of the Licensed - Material and any others designated to receive - attribution, in any reasonable manner requested by - the Licensor (including by pseudonym if - designated); - - ii. a copyright notice; - - iii. a notice that refers to this Public License; - - iv. a notice that refers to the disclaimer of - warranties; - - v. a URI or hyperlink to the Licensed Material to the - extent reasonably practicable; - - b. indicate if You modified the Licensed Material and - retain an indication of any previous modifications; and - - c. indicate the Licensed Material is licensed under this - Public License, and include the text of, or the URI or - hyperlink to, this Public License. - - 2. You may satisfy the conditions in Section 3(a)(1) in any - reasonable manner based on the medium, means, and context in - which You Share the Licensed Material. For example, it may be - reasonable to satisfy the conditions by providing a URI or - hyperlink to a resource that includes the required - information. - - 3. If requested by the Licensor, You must remove any of the - information required by Section 3(a)(1)(A) to the extent - reasonably practicable. - - b. ShareAlike. - - In addition to the conditions in Section 3(a), if You Share - Adapted Material You produce, the following conditions also apply. - - 1. The Adapter's License You apply must be a Creative Commons - license with the same License Elements, this version or - later, or a BY-SA Compatible License. - - 2. You must include the text of, or the URI or hyperlink to, the - Adapter's License You apply. You may satisfy this condition - in any reasonable manner based on the medium, means, and - context in which You Share Adapted Material. - - 3. You may not offer or impose any additional or different terms - or conditions on, or apply any Effective Technological - Measures to, Adapted Material that restrict exercise of the - rights granted under the Adapter's License You apply. - - -Section 4 -- Sui Generis Database Rights. - -Where the Licensed Rights include Sui Generis Database Rights that -apply to Your use of the Licensed Material: - - a. for the avoidance of doubt, Section 2(a)(1) grants You the right - to extract, reuse, reproduce, and Share all or a substantial - portion of the contents of the database; - - b. if You include all or a substantial portion of the database - contents in a database in which You have Sui Generis Database - Rights, then the database in which You have Sui Generis Database - Rights (but not its individual contents) is Adapted Material, - - including for purposes of Section 3(b); and - c. You must comply with the conditions in Section 3(a) if You Share - all or a substantial portion of the contents of the database. - -For the avoidance of doubt, this Section 4 supplements and does not -replace Your obligations under this Public License where the Licensed -Rights include other Copyright and Similar Rights. - - -Section 5 -- Disclaimer of Warranties and Limitation of Liability. - - a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE - EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS - AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF - ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, - IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, - WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR - PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, - ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT - KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT - ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. - - b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE - TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, - NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, - INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, - COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR - USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN - ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR - DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR - IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. - - c. The disclaimer of warranties and limitation of liability provided - above shall be interpreted in a manner that, to the extent - possible, most closely approximates an absolute disclaimer and - waiver of all liability. - - -Section 6 -- Term and Termination. - - a. This Public License applies for the term of the Copyright and - Similar Rights licensed here. However, if You fail to comply with - this Public License, then Your rights under this Public License - terminate automatically. - - b. Where Your right to use the Licensed Material has terminated under - Section 6(a), it reinstates: - - 1. automatically as of the date the violation is cured, provided - it is cured within 30 days of Your discovery of the - violation; or - - 2. upon express reinstatement by the Licensor. - - For the avoidance of doubt, this Section 6(b) does not affect any - right the Licensor may have to seek remedies for Your violations - of this Public License. - - c. For the avoidance of doubt, the Licensor may also offer the - Licensed Material under separate terms or conditions or stop - distributing the Licensed Material at any time; however, doing so - will not terminate this Public License. - - d. Sections 1, 5, 6, 7, and 8 survive termination of this Public - License. - - -Section 7 -- Other Terms and Conditions. - - a. The Licensor shall not be bound by any additional or different - terms or conditions communicated by You unless expressly agreed. - - b. Any arrangements, understandings, or agreements regarding the - Licensed Material not stated herein are separate from and - independent of the terms and conditions of this Public License. - - -Section 8 -- Interpretation. - - a. For the avoidance of doubt, this Public License does not, and - shall not be interpreted to, reduce, limit, restrict, or impose - conditions on any use of the Licensed Material that could lawfully - be made without permission under this Public License. - - b. To the extent possible, if any provision of this Public License is - deemed unenforceable, it shall be automatically reformed to the - minimum extent necessary to make it enforceable. If the provision - cannot be reformed, it shall be severed from this Public License - without affecting the enforceability of the remaining terms and - conditions. - - c. No term or condition of this Public License will be waived and no - failure to comply consented to unless expressly agreed to by the - Licensor. - - d. Nothing in this Public License constitutes or may be interpreted - as a limitation upon, or waiver of, any privileges and immunities - that apply to the Licensor or You, including from the legal - processes of any jurisdiction or authority. - - -======================================================================= - -Creative Commons is not a party to its public licenses. -Notwithstanding, Creative Commons may elect to apply one of its public -licenses to material it publishes and in those instances will be -considered the "Licensor." Except for the limited purpose of indicating -that material is shared under a Creative Commons public license or as -otherwise permitted by the Creative Commons policies published at -creativecommons.org/policies, Creative Commons does not authorize the -use of the trademark "Creative Commons" or any other trademark or logo -of Creative Commons without its prior written consent including, -without limitation, in connection with any unauthorized modifications -to any of its public licenses or any other arrangements, -understandings, or agreements concerning use of licensed material. For -the avoidance of doubt, this paragraph does not form part of the public -licenses. - -Creative Commons may be contacted at creativecommons.org. diff --git a/vendor/github.com/docker/spdystream/MAINTAINERS b/vendor/github.com/docker/spdystream/MAINTAINERS deleted file mode 100644 index 14e263325c70..000000000000 --- a/vendor/github.com/docker/spdystream/MAINTAINERS +++ /dev/null @@ -1,28 +0,0 @@ -# Spdystream maintainers file -# -# This file describes who runs the docker/spdystream project and how. -# This is a living document - if you see something out of date or missing, speak up! -# -# It is structured to be consumable by both humans and programs. -# To extract its contents programmatically, use any TOML-compliant parser. -# -# This file is compiled into the MAINTAINERS file in docker/opensource. -# -[Org] - [Org."Core maintainers"] - people = [ - "dmcgowan", - ] - -[people] - -# A reference list of all people associated with the project. -# All other sections should refer to people by their canonical key -# in the people section. - - # ADD YOURSELF HERE IN ALPHABETICAL ORDER - - [people.dmcgowan] - Name = "Derek McGowan" - Email = "derek@docker.com" - GitHub = "dmcgowan" diff --git a/vendor/github.com/docker/spdystream/README.md b/vendor/github.com/docker/spdystream/README.md deleted file mode 100644 index 11cccd0a09e4..000000000000 --- a/vendor/github.com/docker/spdystream/README.md +++ /dev/null @@ -1,77 +0,0 @@ -# SpdyStream - -A multiplexed stream library using spdy - -## Usage - -Client example (connecting to mirroring server without auth) - -```go -package main - -import ( - "fmt" - "github.com/docker/spdystream" - "net" - "net/http" -) - -func main() { - conn, err := net.Dial("tcp", "localhost:8080") - if err != nil { - panic(err) - } - spdyConn, err := spdystream.NewConnection(conn, false) - if err != nil { - panic(err) - } - go spdyConn.Serve(spdystream.NoOpStreamHandler) - stream, err := spdyConn.CreateStream(http.Header{}, nil, false) - if err != nil { - panic(err) - } - - stream.Wait() - - fmt.Fprint(stream, "Writing to stream") - - buf := make([]byte, 25) - stream.Read(buf) - fmt.Println(string(buf)) - - stream.Close() -} -``` - -Server example (mirroring server without auth) - -```go -package main - -import ( - "github.com/docker/spdystream" - "net" -) - -func main() { - listener, err := net.Listen("tcp", "localhost:8080") - if err != nil { - panic(err) - } - for { - conn, err := listener.Accept() - if err != nil { - panic(err) - } - spdyConn, err := spdystream.NewConnection(conn, true) - if err != nil { - panic(err) - } - go spdyConn.Serve(spdystream.MirrorStreamHandler) - } -} -``` - -## Copyright and license - -Copyright © 2014-2015 Docker, Inc. All rights reserved, except as follows. Code is released under the Apache 2.0 license. The README.md file, and files in the "docs" folder are licensed under the Creative Commons Attribution 4.0 International License under the terms and conditions set forth in the file "LICENSE.docs". You may obtain a duplicate copy of the same license, titled CC-BY-SA-4.0, at http://creativecommons.org/licenses/by/4.0/. diff --git a/vendor/github.com/docker/spdystream/handlers.go b/vendor/github.com/docker/spdystream/handlers.go deleted file mode 100644 index b59fa5fdcd06..000000000000 --- a/vendor/github.com/docker/spdystream/handlers.go +++ /dev/null @@ -1,38 +0,0 @@ -package spdystream - -import ( - "io" - "net/http" -) - -// MirrorStreamHandler mirrors all streams. -func MirrorStreamHandler(stream *Stream) { - replyErr := stream.SendReply(http.Header{}, false) - if replyErr != nil { - return - } - - go func() { - io.Copy(stream, stream) - stream.Close() - }() - go func() { - for { - header, receiveErr := stream.ReceiveHeader() - if receiveErr != nil { - return - } - sendErr := stream.SendHeader(header, false) - if sendErr != nil { - return - } - } - }() -} - -// NoopStreamHandler does nothing when stream connects, most -// likely used with RejectAuthHandler which will not allow any -// streams to make it to the stream handler. -func NoOpStreamHandler(stream *Stream) { - stream.SendReply(http.Header{}, false) -} diff --git a/vendor/github.com/docker/spdystream/priority.go b/vendor/github.com/docker/spdystream/priority.go deleted file mode 100644 index fc8582b5c6f3..000000000000 --- a/vendor/github.com/docker/spdystream/priority.go +++ /dev/null @@ -1,98 +0,0 @@ -package spdystream - -import ( - "container/heap" - "sync" - - "github.com/docker/spdystream/spdy" -) - -type prioritizedFrame struct { - frame spdy.Frame - priority uint8 - insertId uint64 -} - -type frameQueue []*prioritizedFrame - -func (fq frameQueue) Len() int { - return len(fq) -} - -func (fq frameQueue) Less(i, j int) bool { - if fq[i].priority == fq[j].priority { - return fq[i].insertId < fq[j].insertId - } - return fq[i].priority < fq[j].priority -} - -func (fq frameQueue) Swap(i, j int) { - fq[i], fq[j] = fq[j], fq[i] -} - -func (fq *frameQueue) Push(x interface{}) { - *fq = append(*fq, x.(*prioritizedFrame)) -} - -func (fq *frameQueue) Pop() interface{} { - old := *fq - n := len(old) - *fq = old[0 : n-1] - return old[n-1] -} - -type PriorityFrameQueue struct { - queue *frameQueue - c *sync.Cond - size int - nextInsertId uint64 - drain bool -} - -func NewPriorityFrameQueue(size int) *PriorityFrameQueue { - queue := make(frameQueue, 0, size) - heap.Init(&queue) - - return &PriorityFrameQueue{ - queue: &queue, - size: size, - c: sync.NewCond(&sync.Mutex{}), - } -} - -func (q *PriorityFrameQueue) Push(frame spdy.Frame, priority uint8) { - q.c.L.Lock() - defer q.c.L.Unlock() - for q.queue.Len() >= q.size { - q.c.Wait() - } - pFrame := &prioritizedFrame{ - frame: frame, - priority: priority, - insertId: q.nextInsertId, - } - q.nextInsertId = q.nextInsertId + 1 - heap.Push(q.queue, pFrame) - q.c.Signal() -} - -func (q *PriorityFrameQueue) Pop() spdy.Frame { - q.c.L.Lock() - defer q.c.L.Unlock() - for q.queue.Len() == 0 { - if q.drain { - return nil - } - q.c.Wait() - } - frame := heap.Pop(q.queue).(*prioritizedFrame).frame - q.c.Signal() - return frame -} - -func (q *PriorityFrameQueue) Drain() { - q.c.L.Lock() - defer q.c.L.Unlock() - q.drain = true - q.c.Broadcast() -} diff --git a/vendor/github.com/docker/spdystream/spdy/types.go b/vendor/github.com/docker/spdystream/spdy/types.go deleted file mode 100644 index 7b6ee9c6f2bd..000000000000 --- a/vendor/github.com/docker/spdystream/spdy/types.go +++ /dev/null @@ -1,275 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package spdy implements the SPDY protocol (currently SPDY/3), described in -// http://www.chromium.org/spdy/spdy-protocol/spdy-protocol-draft3. -package spdy - -import ( - "bytes" - "compress/zlib" - "io" - "net/http" -) - -// Version is the protocol version number that this package implements. -const Version = 3 - -// ControlFrameType stores the type field in a control frame header. -type ControlFrameType uint16 - -const ( - TypeSynStream ControlFrameType = 0x0001 - TypeSynReply = 0x0002 - TypeRstStream = 0x0003 - TypeSettings = 0x0004 - TypePing = 0x0006 - TypeGoAway = 0x0007 - TypeHeaders = 0x0008 - TypeWindowUpdate = 0x0009 -) - -// ControlFlags are the flags that can be set on a control frame. -type ControlFlags uint8 - -const ( - ControlFlagFin ControlFlags = 0x01 - ControlFlagUnidirectional = 0x02 - ControlFlagSettingsClearSettings = 0x01 -) - -// DataFlags are the flags that can be set on a data frame. -type DataFlags uint8 - -const ( - DataFlagFin DataFlags = 0x01 -) - -// MaxDataLength is the maximum number of bytes that can be stored in one frame. -const MaxDataLength = 1<<24 - 1 - -// headerValueSepator separates multiple header values. -const headerValueSeparator = "\x00" - -// Frame is a single SPDY frame in its unpacked in-memory representation. Use -// Framer to read and write it. -type Frame interface { - write(f *Framer) error -} - -// ControlFrameHeader contains all the fields in a control frame header, -// in its unpacked in-memory representation. -type ControlFrameHeader struct { - // Note, high bit is the "Control" bit. - version uint16 // spdy version number - frameType ControlFrameType - Flags ControlFlags - length uint32 // length of data field -} - -type controlFrame interface { - Frame - read(h ControlFrameHeader, f *Framer) error -} - -// StreamId represents a 31-bit value identifying the stream. -type StreamId uint32 - -// SynStreamFrame is the unpacked, in-memory representation of a SYN_STREAM -// frame. -type SynStreamFrame struct { - CFHeader ControlFrameHeader - StreamId StreamId - AssociatedToStreamId StreamId // stream id for a stream which this stream is associated to - Priority uint8 // priority of this frame (3-bit) - Slot uint8 // index in the server's credential vector of the client certificate - Headers http.Header -} - -// SynReplyFrame is the unpacked, in-memory representation of a SYN_REPLY frame. -type SynReplyFrame struct { - CFHeader ControlFrameHeader - StreamId StreamId - Headers http.Header -} - -// RstStreamStatus represents the status that led to a RST_STREAM. -type RstStreamStatus uint32 - -const ( - ProtocolError RstStreamStatus = iota + 1 - InvalidStream - RefusedStream - UnsupportedVersion - Cancel - InternalError - FlowControlError - StreamInUse - StreamAlreadyClosed - InvalidCredentials - FrameTooLarge -) - -// RstStreamFrame is the unpacked, in-memory representation of a RST_STREAM -// frame. -type RstStreamFrame struct { - CFHeader ControlFrameHeader - StreamId StreamId - Status RstStreamStatus -} - -// SettingsFlag represents a flag in a SETTINGS frame. -type SettingsFlag uint8 - -const ( - FlagSettingsPersistValue SettingsFlag = 0x1 - FlagSettingsPersisted = 0x2 -) - -// SettingsFlag represents the id of an id/value pair in a SETTINGS frame. -type SettingsId uint32 - -const ( - SettingsUploadBandwidth SettingsId = iota + 1 - SettingsDownloadBandwidth - SettingsRoundTripTime - SettingsMaxConcurrentStreams - SettingsCurrentCwnd - SettingsDownloadRetransRate - SettingsInitialWindowSize - SettingsClientCretificateVectorSize -) - -// SettingsFlagIdValue is the unpacked, in-memory representation of the -// combined flag/id/value for a setting in a SETTINGS frame. -type SettingsFlagIdValue struct { - Flag SettingsFlag - Id SettingsId - Value uint32 -} - -// SettingsFrame is the unpacked, in-memory representation of a SPDY -// SETTINGS frame. -type SettingsFrame struct { - CFHeader ControlFrameHeader - FlagIdValues []SettingsFlagIdValue -} - -// PingFrame is the unpacked, in-memory representation of a PING frame. -type PingFrame struct { - CFHeader ControlFrameHeader - Id uint32 // unique id for this ping, from server is even, from client is odd. -} - -// GoAwayStatus represents the status in a GoAwayFrame. -type GoAwayStatus uint32 - -const ( - GoAwayOK GoAwayStatus = iota - GoAwayProtocolError - GoAwayInternalError -) - -// GoAwayFrame is the unpacked, in-memory representation of a GOAWAY frame. -type GoAwayFrame struct { - CFHeader ControlFrameHeader - LastGoodStreamId StreamId // last stream id which was accepted by sender - Status GoAwayStatus -} - -// HeadersFrame is the unpacked, in-memory representation of a HEADERS frame. -type HeadersFrame struct { - CFHeader ControlFrameHeader - StreamId StreamId - Headers http.Header -} - -// WindowUpdateFrame is the unpacked, in-memory representation of a -// WINDOW_UPDATE frame. -type WindowUpdateFrame struct { - CFHeader ControlFrameHeader - StreamId StreamId - DeltaWindowSize uint32 // additional number of bytes to existing window size -} - -// TODO: Implement credential frame and related methods. - -// DataFrame is the unpacked, in-memory representation of a DATA frame. -type DataFrame struct { - // Note, high bit is the "Control" bit. Should be 0 for data frames. - StreamId StreamId - Flags DataFlags - Data []byte // payload data of this frame -} - -// A SPDY specific error. -type ErrorCode string - -const ( - UnlowercasedHeaderName ErrorCode = "header was not lowercased" - DuplicateHeaders = "multiple headers with same name" - WrongCompressedPayloadSize = "compressed payload size was incorrect" - UnknownFrameType = "unknown frame type" - InvalidControlFrame = "invalid control frame" - InvalidDataFrame = "invalid data frame" - InvalidHeaderPresent = "frame contained invalid header" - ZeroStreamId = "stream id zero is disallowed" -) - -// Error contains both the type of error and additional values. StreamId is 0 -// if Error is not associated with a stream. -type Error struct { - Err ErrorCode - StreamId StreamId -} - -func (e *Error) Error() string { - return string(e.Err) -} - -var invalidReqHeaders = map[string]bool{ - "Connection": true, - "Host": true, - "Keep-Alive": true, - "Proxy-Connection": true, - "Transfer-Encoding": true, -} - -var invalidRespHeaders = map[string]bool{ - "Connection": true, - "Keep-Alive": true, - "Proxy-Connection": true, - "Transfer-Encoding": true, -} - -// Framer handles serializing/deserializing SPDY frames, including compressing/ -// decompressing payloads. -type Framer struct { - headerCompressionDisabled bool - w io.Writer - headerBuf *bytes.Buffer - headerCompressor *zlib.Writer - r io.Reader - headerReader io.LimitedReader - headerDecompressor io.ReadCloser -} - -// NewFramer allocates a new Framer for a given SPDY connection, represented by -// a io.Writer and io.Reader. Note that Framer will read and write individual fields -// from/to the Reader and Writer, so the caller should pass in an appropriately -// buffered implementation to optimize performance. -func NewFramer(w io.Writer, r io.Reader) (*Framer, error) { - compressBuf := new(bytes.Buffer) - compressor, err := zlib.NewWriterLevelDict(compressBuf, zlib.BestCompression, []byte(headerDictionary)) - if err != nil { - return nil, err - } - framer := &Framer{ - w: w, - headerBuf: compressBuf, - headerCompressor: compressor, - r: r, - } - return framer, nil -} diff --git a/vendor/github.com/docker/spdystream/utils.go b/vendor/github.com/docker/spdystream/utils.go deleted file mode 100644 index 1b2c199a4021..000000000000 --- a/vendor/github.com/docker/spdystream/utils.go +++ /dev/null @@ -1,16 +0,0 @@ -package spdystream - -import ( - "log" - "os" -) - -var ( - DEBUG = os.Getenv("DEBUG") -) - -func debugMessage(fmt string, args ...interface{}) { - if DEBUG != "" { - log.Printf(fmt, args...) - } -} diff --git a/vendor/github.com/fsouza/go-dockerclient/.gitattributes b/vendor/github.com/fsouza/go-dockerclient/.gitattributes new file mode 100644 index 000000000000..6313b56c5784 --- /dev/null +++ b/vendor/github.com/fsouza/go-dockerclient/.gitattributes @@ -0,0 +1 @@ +* text=auto eol=lf diff --git a/vendor/github.com/fsouza/go-dockerclient/.golangci.yaml b/vendor/github.com/fsouza/go-dockerclient/.golangci.yaml new file mode 100644 index 000000000000..63415ffffed8 --- /dev/null +++ b/vendor/github.com/fsouza/go-dockerclient/.golangci.yaml @@ -0,0 +1,8 @@ +run: + deadline: 5m + +linters: + disable-all: true + enable: + - gofmt + - goimports diff --git a/vendor/github.com/fsouza/go-dockerclient/.travis.yml b/vendor/github.com/fsouza/go-dockerclient/.travis.yml deleted file mode 100644 index f8f29964dc93..000000000000 --- a/vendor/github.com/fsouza/go-dockerclient/.travis.yml +++ /dev/null @@ -1,32 +0,0 @@ -language: go -sudo: required -go: - - 1.8.x - - 1.9.x - - tip -os: - - linux - - osx -env: - matrix: - - GOARCH=amd64 DOCKER_PKG_VERSION=17.06.0~ce-0~ubuntu - - GOARCH=386 DOCKER_PKG_VERSION=17.06.0~ce-0~ubuntu - - GOARCH=amd64 DOCKER_PKG_VERSION=17.05.0~ce-0~ubuntu-trusty - - GOARCH=386 DOCKER_PKG_VERSION=17.05.0~ce-0~ubuntu-trusty - global: - - GO_TEST_FLAGS=-race - - DOCKER_HOST=tcp://127.0.0.1:2375 -install: - - make testdeps - - travis_retry travis-scripts/install-docker.bash -script: - - travis-scripts/run-tests.bash -services: - - docker -matrix: - fast_finish: true - exclude: - - os: osx - env: GOARCH=amd64 DOCKER_PKG_VERSION=17.05.0~ce-0~ubuntu-trusty - - os: osx - env: GOARCH=386 DOCKER_PKG_VERSION=17.05.0~ce-0~ubuntu-trusty diff --git a/vendor/github.com/fsouza/go-dockerclient/AUTHORS b/vendor/github.com/fsouza/go-dockerclient/AUTHORS index c1c38d9a5ad4..558113ccf1e3 100644 --- a/vendor/github.com/fsouza/go-dockerclient/AUTHORS +++ b/vendor/github.com/fsouza/go-dockerclient/AUTHORS @@ -2,7 +2,9 @@ Abhishek Chanda Adam Bell-Hanssen +Adnan Khan Adrien Kohlbecker +Aithal Aldrin Leal Alex Dadgar Alfonso Acosta @@ -13,6 +15,7 @@ Andrews Medina Andrey Sibiryov Andy Goldstein Anirudh Aithal +Antoine Brechon Antonio Murdaca Artem Sidorenko Arthur Rodrigues @@ -22,6 +25,7 @@ Ben Parees Benno van den Berg Bradley Cicenas Brendan Fosberry +Brett Buddin Brian Lalor Brian P. Hamachek Brian Palmer @@ -33,26 +37,33 @@ Cássio Botaro Cesar Wong Cezar Sa Espinola Changping Chen +Charles Teinturier Cheah Chu Yeow cheneydeng Chris Bednarski Chris Stavropoulos Christian Stewart Christophe Mourette +Clayton Coleman Clint Armstrong CMGS Colin Hebert Craig Jellick +Damien Lespiau Damon Wang Dan Williams Daniel, Dao Quang Minh +Daniel Black Daniel Garcia +Daniel Hess Daniel Hiltgen +Daniel Nephin Daniel Tsui Darren Shepherd Dave Choi David Huie Dawn Chen +Denis Makogon Derek Petersen Dinesh Subhraveti Drew Wells @@ -60,6 +71,7 @@ Ed Elias G. Schneevoigt Erez Horev Eric Anderson +Eric Fode Eric J. Holmes Eric Mountain Erwin van Eyk @@ -67,17 +79,20 @@ Ethan Mosbaugh Ewout Prangsma Fabio Rehm Fatih Arslan +Faye Salwin Felipe Oliveira Flavia Missi Florent Aide Francisco Souza Frank Groeneveld +George MacRorie George Moura Grégoire Delattre Guilherme Rezende Guillermo Álvarez Fernández Harry Zhang He Simei +Isaac Schnitzer Ivan Mikushin James Bardin James Nugent @@ -105,6 +120,8 @@ Kevin Xu Kim, Hirokuni Kostas Lekkas Kyle Allan +Kyle Quest +Yunhee Lee Liron Levin Lior Yankovich Liu Peng @@ -113,6 +130,7 @@ Lucas Clemente Lucas Weiblen Lyon Hill Mantas Matelis +Manuel Vogel Marguerite des Trois Maisons Mariusz Borsa Martin Sweeney @@ -122,6 +140,7 @@ Michal Fojtik Mike Dillon Mrunal Patel Nate Jones +Nathan Pemberton Nguyen Sy Thanh Son Nicholas Van Wiggeren Nick Ethier @@ -131,8 +150,10 @@ Orivej Desh Paul Bellamy Paul Morie Paul Weil +Peng Yin Peter Edge Peter Jihoon Kim +Peter Teich Phil Lu Philippe Lafoucrière Radek Simko @@ -150,6 +171,8 @@ Sam Rijs Sami Wagiaalla Samuel Archambault Samuel Karp +Sebastian Borza +Sergey Ponomarev Seth Jennings Shane Xie Silas Sewell @@ -161,20 +184,25 @@ Sridhar Ratnakumar Steven Jack Summer Mousa Sunjin Lee +Sunny Swaroop Ramachandra Tarsis Azevedo Tim Schindler Timothy St. Clair Tobi Knaup Tom Wilkie +Tomas Knappek Tonic ttyh061 +Umut Çömlekçioğlu upccup Victor Marmol +Vijay Krishnan Vincenzo Prignano Vlad Alexandru Ionescu Weitao Zhou Wiliam Souza Ye Yin +Yosuke Otosu Yu, Zou Yuriy Bogdanov diff --git a/vendor/github.com/fsouza/go-dockerclient/DOCKER-LICENSE b/vendor/github.com/fsouza/go-dockerclient/DOCKER-LICENSE index 706634474870..db092935f501 100644 --- a/vendor/github.com/fsouza/go-dockerclient/DOCKER-LICENSE +++ b/vendor/github.com/fsouza/go-dockerclient/DOCKER-LICENSE @@ -3,4 +3,4 @@ http://www.apache.org/licenses/ You can find the Docker license at the following link: -https://raw.githubusercontent.com/docker/docker/master/LICENSE +https://raw.githubusercontent.com/docker/docker/HEAD/LICENSE diff --git a/vendor/github.com/fsouza/go-dockerclient/LICENSE b/vendor/github.com/fsouza/go-dockerclient/LICENSE index 545174c18f79..707a0ed49b28 100644 --- a/vendor/github.com/fsouza/go-dockerclient/LICENSE +++ b/vendor/github.com/fsouza/go-dockerclient/LICENSE @@ -1,18 +1,19 @@ -Copyright (c) 2013-2017, go-dockerclient authors +Copyright (c) 2013-2021, go-dockerclient authors All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation -and/or other materials provided with the distribution. +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR diff --git a/vendor/github.com/fsouza/go-dockerclient/Makefile b/vendor/github.com/fsouza/go-dockerclient/Makefile index 483aa1bb4a2f..431458441da3 100644 --- a/vendor/github.com/fsouza/go-dockerclient/Makefile +++ b/vendor/github.com/fsouza/go-dockerclient/Makefile @@ -1,41 +1,30 @@ -.PHONY: \ - all \ - lint \ - vet \ - fmt \ - fmtcheck \ - pretest \ - test \ - integration \ - clean +ifeq "$(strip $(shell go env GOARCH))" "amd64" +RACE_FLAG := -race +endif -all: test - -lint: - @ go get -v github.com/golang/lint/golint - [ -z "$$(golint . | grep -v 'type name will be used as docker.DockerInfo' | grep -v 'context.Context should be the first' | tee /dev/stderr)" ] - -vet: - go vet ./... +.PHONY: test +test: pretest gotest -fmt: - gofmt -s -w . +.PHONY: golangci-lint +golangci-lint: + cd /tmp && GO111MODULE=on go get github.com/golangci/golangci-lint/cmd/golangci-lint@latest + golangci-lint run -fmtcheck: - [ -z "$$(gofmt -s -d . | tee /dev/stderr)" ] +.PHONY: staticcheck +staticcheck: + cd /tmp && GO111MODULE=on go get honnef.co/go/tools/cmd/staticcheck@master + staticcheck ./... -testdeps: - go get -d -t ./... +.PHONY: lint +lint: golangci-lint staticcheck -pretest: testdeps lint vet fmtcheck +.PHONY: pretest +pretest: lint +.PHONY: gotest gotest: - go test $(GO_TEST_FLAGS) ./... - -test: pretest gotest + go test $(RACE_FLAG) -vet all ./... +.PHONY: integration integration: go test -tags docker_integration -run TestIntegration -v - -clean: - go clean ./... diff --git a/vendor/github.com/fsouza/go-dockerclient/README.markdown b/vendor/github.com/fsouza/go-dockerclient/README.markdown deleted file mode 100644 index a9ffc17a0f63..000000000000 --- a/vendor/github.com/fsouza/go-dockerclient/README.markdown +++ /dev/null @@ -1,125 +0,0 @@ -# go-dockerclient - -[![Travis Build Status](https://travis-ci.org/fsouza/go-dockerclient.svg?branch=master)](https://travis-ci.org/fsouza/go-dockerclient) -[![AppVeyor Build Status](https://ci.appveyor.com/api/projects/status/4m374pti06ubg2l7?svg=true)](https://ci.appveyor.com/project/fsouza/go-dockerclient) -[![GoDoc](https://img.shields.io/badge/api-Godoc-blue.svg?style=flat-square)](https://godoc.org/github.com/fsouza/go-dockerclient) - -This package presents a client for the Docker remote API. It also provides -support for the extensions in the [Swarm API](https://docs.docker.com/swarm/swarm-api/). -It currently supports the Docker API up to version 1.23. - -This package also provides support for docker's network API, which is a simple -passthrough to the libnetwork remote API. Note that docker's network API is -only available in docker 1.8 and above, and only enabled in docker if -DOCKER_EXPERIMENTAL is defined during the docker build process. - -For more details, check the [remote API -documentation](http://docs.docker.com/engine/reference/api/docker_remote_api/). - -## Example - -```go -package main - -import ( - "fmt" - - "github.com/fsouza/go-dockerclient" -) - -func main() { - endpoint := "unix:///var/run/docker.sock" - client, err := docker.NewClient(endpoint) - if err != nil { - panic(err) - } - imgs, err := client.ListImages(docker.ListImagesOptions{All: false}) - if err != nil { - panic(err) - } - for _, img := range imgs { - fmt.Println("ID: ", img.ID) - fmt.Println("RepoTags: ", img.RepoTags) - fmt.Println("Created: ", img.Created) - fmt.Println("Size: ", img.Size) - fmt.Println("VirtualSize: ", img.VirtualSize) - fmt.Println("ParentId: ", img.ParentID) - } -} -``` - -## Using with TLS - -In order to instantiate the client for a TLS-enabled daemon, you should use -NewTLSClient, passing the endpoint and path for key and certificates as -parameters. - -```go -package main - -import ( - "fmt" - - "github.com/fsouza/go-dockerclient" -) - -func main() { - endpoint := "tcp://[ip]:[port]" - path := os.Getenv("DOCKER_CERT_PATH") - ca := fmt.Sprintf("%s/ca.pem", path) - cert := fmt.Sprintf("%s/cert.pem", path) - key := fmt.Sprintf("%s/key.pem", path) - client, _ := docker.NewTLSClient(endpoint, cert, key, ca) - // use client -} -``` - -If using [docker-machine](https://docs.docker.com/machine/), or another -application that exports environment variables `DOCKER_HOST`, -`DOCKER_TLS_VERIFY`, `DOCKER_CERT_PATH`, you can use NewClientFromEnv. - - -```go -package main - -import ( - "fmt" - - "github.com/fsouza/go-dockerclient" -) - -func main() { - client, _ := docker.NewClientFromEnv() - // use client -} -``` - -See the documentation for more details. - -## Developing - -All development commands can be seen in the [Makefile](Makefile). - -Commited code must pass: - -* [golint](https://github.com/golang/lint) (with some exceptions, see the Makefile). -* [go vet](https://golang.org/cmd/vet/) -* [gofmt](https://golang.org/cmd/gofmt) -* [go test](https://golang.org/cmd/go/#hdr-Test_packages) - -Running `make test` will check all of these. If your editor does not -automatically call ``gofmt -s``, `make fmt` will format all go files in this -repository. - -## Using with Docker 1.9 and Go 1.4 - -There's a tag for using go-dockerclient with Docker 1.9 (which requires -compiling go-dockerclient with Go 1.4), the tag name is ``docker-1.9/go-1.4``. - -The instructions below can be used to get a version of go-dockerclient that compiles with Go 1.4: - -``` -% git clone -b docker-1.9/go-1.4 https://github.com/fsouza/go-dockerclient.git $GOPATH/src/github.com/fsouza/go-dockerclient -% git clone -b v1.9.1 https://github.com/docker/docker.git $GOPATH/src/github.com/docker/docker -% go get github.com/fsouza/go-dockerclient -``` diff --git a/vendor/github.com/fsouza/go-dockerclient/README.md b/vendor/github.com/fsouza/go-dockerclient/README.md new file mode 100644 index 000000000000..e170059a1d28 --- /dev/null +++ b/vendor/github.com/fsouza/go-dockerclient/README.md @@ -0,0 +1,151 @@ +# go-dockerclient + +[![Build Status](https://github.com/fsouza/go-dockerclient/workflows/Build/badge.svg)](https://github.com/fsouza/go-dockerclient/actions?query=branch:main+workflow:Build) +[![GoDoc](https://img.shields.io/badge/api-Godoc-blue.svg?style=flat-square)](https://pkg.go.dev/github.com/fsouza/go-dockerclient) + +This package presents a client for the Docker remote API. It also provides +support for the extensions in the [Swarm API](https://docs.docker.com/swarm/swarm-api/). + +This package also provides support for docker's network API, which is a simple +passthrough to the libnetwork remote API. + +For more details, check the [remote API +documentation](https://docs.docker.com/engine/api/latest/). + +## Difference between go-dockerclient and the official SDK + +Link for the official SDK: https://docs.docker.com/develop/sdk/ + +go-dockerclient was created before Docker had an official Go SDK and is +still maintained and active because it's still used out there. New features in +the Docker API do not get automatically implemented here: it's based on demand, +if someone wants it, they can file an issue or a PR and the feature may get +implemented/merged. + +For new projects, using the official SDK is probably more appropriate as +go-dockerclient lags behind the official SDK. + +When using the official SDK, keep in mind that because of how the its +dependencies are organized, you may need some extra steps in order to be able +to import it in your projects (see +[#784](https://github.com/fsouza/go-dockerclient/issues/784) and +[moby/moby#28269](https://github.com/moby/moby/issues/28269)). + +## Example + +```go +package main + +import ( + "fmt" + + docker "github.com/fsouza/go-dockerclient" +) + +func main() { + client, err := docker.NewClientFromEnv() + if err != nil { + panic(err) + } + imgs, err := client.ListImages(docker.ListImagesOptions{All: false}) + if err != nil { + panic(err) + } + for _, img := range imgs { + fmt.Println("ID: ", img.ID) + fmt.Println("RepoTags: ", img.RepoTags) + fmt.Println("Created: ", img.Created) + fmt.Println("Size: ", img.Size) + fmt.Println("VirtualSize: ", img.VirtualSize) + fmt.Println("ParentId: ", img.ParentID) + } +} +``` + +## Using with TLS + +In order to instantiate the client for a TLS-enabled daemon, you should use +NewTLSClient, passing the endpoint and path for key and certificates as +parameters. + +```go +package main + +import ( + "fmt" + + docker "github.com/fsouza/go-dockerclient" +) + +func main() { + const endpoint = "tcp://[ip]:[port]" + path := os.Getenv("DOCKER_CERT_PATH") + ca := fmt.Sprintf("%s/ca.pem", path) + cert := fmt.Sprintf("%s/cert.pem", path) + key := fmt.Sprintf("%s/key.pem", path) + client, _ := docker.NewTLSClient(endpoint, cert, key, ca) + // use client +} +``` + +If using [docker-machine](https://docs.docker.com/machine/), or another +application that exports environment variables `DOCKER_HOST`, +`DOCKER_TLS_VERIFY`, `DOCKER_CERT_PATH`, `DOCKER_API_VERSION`, you can use +NewClientFromEnv. + + +```go +package main + +import ( + "fmt" + + docker "github.com/fsouza/go-dockerclient" +) + +func main() { + client, err := docker.NewClientFromEnv() + if err != nil { + // handle err + } + // use client +} +``` + +See the documentation for more details. + +## Developing + +All development commands can be seen in the [Makefile](Makefile). + +Commited code must pass: + +* [golangci-lint](https://github.com/golangci/golangci-lint) +* [go test](https://golang.org/cmd/go/#hdr-Test_packages) + +Running ``make test`` will run all checks, as well as install any required +dependencies. + +## Modules + +go-dockerclient supports Go modules. + +If you're using dep, you can check the [releases +page](https://github.com/fsouza/go-dockerclient/releases) for the latest +release fully compatible with dep. + +With other vendoring tools, users need to specify go-dockerclient's +dependencies manually. + +## Using with Docker 1.9 and Go 1.4 + +There's a tag for using go-dockerclient with Docker 1.9 (which requires +compiling go-dockerclient with Go 1.4), the tag name is ``docker-1.9/go-1.4``. + +The instructions below can be used to get a version of go-dockerclient that compiles with Go 1.4: + +``` +% git clone -b docker-1.9/go-1.4 https://github.com/fsouza/go-dockerclient.git $GOPATH/src/github.com/fsouza/go-dockerclient +% git clone -b v1.9.1 https://github.com/docker/docker.git $GOPATH/src/github.com/docker/docker +% go get github.com/fsouza/go-dockerclient +``` diff --git a/vendor/github.com/fsouza/go-dockerclient/appveyor.yml b/vendor/github.com/fsouza/go-dockerclient/appveyor.yml deleted file mode 100644 index 60867690dd1a..000000000000 --- a/vendor/github.com/fsouza/go-dockerclient/appveyor.yml +++ /dev/null @@ -1,20 +0,0 @@ -version: '{build}' -platform: x64 -clone_depth: 2 -clone_folder: c:\gopath\src\github.com\fsouza\go-dockerclient -environment: - GOPATH: c:\gopath - matrix: - - GOVERSION: 1.8.4 - - GOVERSION: 1.9.1 -install: - - set PATH=%GOPATH%\bin;c:\go\bin;%PATH% - - rmdir c:\go /s /q - - appveyor DownloadFile https://storage.googleapis.com/golang/go%GOVERSION%.windows-amd64.zip - - 7z x go%GOVERSION%.windows-amd64.zip -y -oC:\ > NUL -build_script: - - go get -race -d -t ./... -test_script: - - go test -race ./... -matrix: - fast_finish: true diff --git a/vendor/github.com/fsouza/go-dockerclient/auth.go b/vendor/github.com/fsouza/go-dockerclient/auth.go index 03d192b79227..bc949dc3590b 100644 --- a/vendor/github.com/fsouza/go-dockerclient/auth.go +++ b/vendor/github.com/fsouza/go-dockerclient/auth.go @@ -9,16 +9,17 @@ import ( "encoding/base64" "encoding/json" "errors" - "fmt" "io" "io/ioutil" + "net/http" "os" + "os/exec" "path" "strings" ) // ErrCannotParseDockercfg is the error returned by NewAuthConfigurations when the dockercfg cannot be parsed. -var ErrCannotParseDockercfg = errors.New("Failed to read authentication from dockercfg") +var ErrCannotParseDockercfg = errors.New("failed to read authentication from dockercfg") // AuthConfiguration represents authentication options to use in the PushImage // method. It represents the authentication in the Docker index server. @@ -27,6 +28,22 @@ type AuthConfiguration struct { Password string `json:"password,omitempty"` Email string `json:"email,omitempty"` ServerAddress string `json:"serveraddress,omitempty"` + + // IdentityToken can be supplied with the identitytoken response of the AuthCheck call + // see https://pkg.go.dev/github.com/docker/docker/api/types?tab=doc#AuthConfig + // It can be used in place of password not in conjunction with it + IdentityToken string `json:"identitytoken,omitempty"` + + // RegistryToken can be supplied with the registrytoken + RegistryToken string `json:"registrytoken,omitempty"` +} + +func (c AuthConfiguration) isEmpty() bool { + return c == AuthConfiguration{} +} + +func (c AuthConfiguration) headerKey() string { + return "X-Registry-Auth" } // AuthConfigurations represents authentication options to use for the @@ -35,15 +52,46 @@ type AuthConfigurations struct { Configs map[string]AuthConfiguration `json:"configs"` } +func (c AuthConfigurations) isEmpty() bool { + return len(c.Configs) == 0 +} + +func (AuthConfigurations) headerKey() string { + return "X-Registry-Config" +} + +// merge updates the configuration. If a key is defined in both maps, the one +// in c.Configs takes precedence. +func (c *AuthConfigurations) merge(other AuthConfigurations) { + for k, v := range other.Configs { + if c.Configs == nil { + c.Configs = make(map[string]AuthConfiguration) + } + if _, ok := c.Configs[k]; !ok { + c.Configs[k] = v + } + } +} + // AuthConfigurations119 is used to serialize a set of AuthConfigurations // for Docker API >= 1.19. type AuthConfigurations119 map[string]AuthConfiguration +func (c AuthConfigurations119) isEmpty() bool { + return len(c) == 0 +} + +func (c AuthConfigurations119) headerKey() string { + return "X-Registry-Config" +} + // dockerConfig represents a registry authentation configuration from the // .dockercfg file. type dockerConfig struct { - Auth string `json:"auth"` - Email string `json:"email"` + Auth string `json:"auth"` + Email string `json:"email"` + IdentityToken string `json:"identitytoken"` + RegistryToken string `json:"registrytoken"` } // NewAuthConfigurationsFromFile returns AuthConfigurations from a path containing JSON @@ -57,34 +105,65 @@ func NewAuthConfigurationsFromFile(path string) (*AuthConfigurations, error) { } func cfgPaths(dockerConfigEnv string, homeEnv string) []string { - var paths []string if dockerConfigEnv != "" { - paths = append(paths, path.Join(dockerConfigEnv, "config.json")) + return []string{ + path.Join(dockerConfigEnv, "plaintext-passwords.json"), + path.Join(dockerConfigEnv, "config.json"), + } } if homeEnv != "" { - paths = append(paths, path.Join(homeEnv, ".docker", "config.json")) - paths = append(paths, path.Join(homeEnv, ".dockercfg")) + return []string{ + path.Join(homeEnv, ".docker", "plaintext-passwords.json"), + path.Join(homeEnv, ".docker", "config.json"), + path.Join(homeEnv, ".dockercfg"), + } } - return paths + return nil } -// NewAuthConfigurationsFromDockerCfg returns AuthConfigurations from -// system config files. The following files are checked in the order listed: -// - $DOCKER_CONFIG/config.json if DOCKER_CONFIG set in the environment, +// NewAuthConfigurationsFromDockerCfg returns AuthConfigurations from system +// config files. The following files are checked in the order listed: +// +// If the environment variable DOCKER_CONFIG is set to a non-empty string: +// +// - $DOCKER_CONFIG/plaintext-passwords.json +// - $DOCKER_CONFIG/config.json +// +// Otherwise, it looks for files in the $HOME directory and the legacy +// location: +// +// - $HOME/.docker/plaintext-passwords.json // - $HOME/.docker/config.json // - $HOME/.dockercfg func NewAuthConfigurationsFromDockerCfg() (*AuthConfigurations, error) { - err := fmt.Errorf("No docker configuration found") - var auths *AuthConfigurations - pathsToTry := cfgPaths(os.Getenv("DOCKER_CONFIG"), os.Getenv("HOME")) + if len(pathsToTry) < 1 { + return nil, errors.New("no docker configuration found") + } + return newAuthConfigurationsFromDockerCfg(pathsToTry) +} + +func newAuthConfigurationsFromDockerCfg(pathsToTry []string) (*AuthConfigurations, error) { + var result *AuthConfigurations + var auths *AuthConfigurations + var err error for _, path := range pathsToTry { auths, err = NewAuthConfigurationsFromFile(path) - if err == nil { - return auths, nil + if err != nil { + continue } + + if result == nil { + result = auths + } else { + result.merge(*auths) + } + } + + if result != nil { + return result, nil } - return auths, err + return result, err } // NewAuthConfigurations returns AuthConfigurations from a JSON encoded string in the @@ -128,22 +207,47 @@ func authConfigs(confs map[string]dockerConfig) (*AuthConfigurations, error) { c := &AuthConfigurations{ Configs: make(map[string]AuthConfiguration), } + for reg, conf := range confs { + if conf.Auth == "" { + continue + } + + // support both padded and unpadded encoding data, err := base64.StdEncoding.DecodeString(conf.Auth) if err != nil { - return nil, err + data, err = base64.StdEncoding.WithPadding(base64.NoPadding).DecodeString(conf.Auth) + } + if err != nil { + return nil, errors.New("error decoding plaintext credentials") } + userpass := strings.SplitN(string(data), ":", 2) if len(userpass) != 2 { return nil, ErrCannotParseDockercfg } - c.Configs[reg] = AuthConfiguration{ + + authConfig := AuthConfiguration{ Email: conf.Email, Username: userpass[0], Password: userpass[1], ServerAddress: reg, } + + // if identitytoken provided then zero the password and set it + if conf.IdentityToken != "" { + authConfig.Password = "" + authConfig.IdentityToken = conf.IdentityToken + } + + // if registrytoken provided then zero the password and set it + if conf.RegistryToken != "" { + authConfig.Password = "" + authConfig.RegistryToken = conf.RegistryToken + } + c.Configs[reg] = authConfig } + return c, nil } @@ -163,7 +267,7 @@ func (c *Client) AuthCheck(conf *AuthConfiguration) (AuthStatus, error) { if conf == nil { return authStatus, errors.New("conf is nil") } - resp, err := c.do("POST", "/auth", doOptions{data: conf}) + resp, err := c.do(http.MethodPost, "/auth", doOptions{data: conf}) if err != nil { return authStatus, err } @@ -180,3 +284,102 @@ func (c *Client) AuthCheck(conf *AuthConfiguration) (AuthStatus, error) { } return authStatus, nil } + +// helperCredentials represents credentials commit from an helper +type helperCredentials struct { + Username string `json:"Username,omitempty"` + Secret string `json:"Secret,omitempty"` +} + +// NewAuthConfigurationsFromCredsHelpers returns AuthConfigurations from +// installed credentials helpers +func NewAuthConfigurationsFromCredsHelpers(registry string) (*AuthConfiguration, error) { + // Load docker configuration file in order to find a possible helper provider + pathsToTry := cfgPaths(os.Getenv("DOCKER_CONFIG"), os.Getenv("HOME")) + if len(pathsToTry) < 1 { + return nil, errors.New("no docker configuration found") + } + + provider, err := getHelperProviderFromDockerCfg(pathsToTry, registry) + if err != nil { + return nil, err + } + + c, err := getCredentialsFromHelper(provider, registry) + if err != nil { + return nil, err + } + + creds := new(AuthConfiguration) + creds.Username = c.Username + creds.Password = c.Secret + return creds, nil +} + +func getHelperProviderFromDockerCfg(pathsToTry []string, registry string) (string, error) { + for _, path := range pathsToTry { + content, err := ioutil.ReadFile(path) + if err != nil { + // if we can't read the file keep going + continue + } + + provider, err := parseCredsDockerConfig(content, registry) + if err != nil { + continue + } + if provider != "" { + return provider, nil + } + } + return "", errors.New("no docker credentials provider found") +} + +func parseCredsDockerConfig(config []byte, registry string) (string, error) { + creds := struct { + CredsStore string `json:"credsStore,omitempty"` + CredHelpers map[string]string `json:"credHelpers,omitempty"` + }{} + err := json.Unmarshal(config, &creds) + if err != nil { + return "", err + } + + provider, ok := creds.CredHelpers[registry] + if ok { + return provider, nil + } + return creds.CredsStore, nil +} + +// Run and parse the found credential helper +func getCredentialsFromHelper(provider string, registry string) (*helperCredentials, error) { + helpercreds, err := runDockerCredentialsHelper(provider, registry) + if err != nil { + return nil, err + } + + c := new(helperCredentials) + err = json.Unmarshal(helpercreds, c) + if err != nil { + return nil, err + } + + return c, nil +} + +func runDockerCredentialsHelper(provider string, registry string) ([]byte, error) { + cmd := exec.Command("docker-credential-"+provider, "get") + + var stdout bytes.Buffer + + cmd.Stdin = bytes.NewBuffer([]byte(registry)) + cmd.Stdout = &stdout + + err := cmd.Run() + if err != nil { + return nil, err + } + + return stdout.Bytes(), nil +} diff --git a/vendor/github.com/fsouza/go-dockerclient/client.go b/vendor/github.com/fsouza/go-dockerclient/client.go index b404953fc44f..d0814a5c0bda 100644 --- a/vendor/github.com/fsouza/go-dockerclient/client.go +++ b/vendor/github.com/fsouza/go-dockerclient/client.go @@ -10,6 +10,7 @@ package docker import ( "bufio" "bytes" + "context" "crypto/tls" "crypto/x509" "encoding/json" @@ -30,12 +31,9 @@ import ( "sync/atomic" "time" - "github.com/docker/docker/opts" "github.com/docker/docker/pkg/homedir" "github.com/docker/docker/pkg/jsonmessage" "github.com/docker/docker/pkg/stdcopy" - "golang.org/x/net/context" - "golang.org/x/net/context/ctxhttp" ) const ( @@ -56,9 +54,12 @@ var ( ErrInactivityTimeout = errors.New("inactivity time exceeded timeout") apiVersion112, _ = NewAPIVersion("1.12") + apiVersion118, _ = NewAPIVersion("1.18") apiVersion119, _ = NewAPIVersion("1.19") + apiVersion121, _ = NewAPIVersion("1.21") apiVersion124, _ = NewAPIVersion("1.24") apiVersion125, _ = NewAPIVersion("1.25") + apiVersion135, _ = NewAPIVersion("1.35") ) // APIVersion is an internal representation of a version of the Remote API. @@ -70,7 +71,7 @@ type APIVersion []int // and are integer numbers. func NewAPIVersion(input string) (APIVersion, error) { if !strings.Contains(input, ".") { - return nil, fmt.Errorf("Unable to parse version %q", input) + return nil, fmt.Errorf("unable to parse version %q", input) } raw := strings.Split(input, "-") arr := strings.Split(raw[0], ".") @@ -79,39 +80,36 @@ func NewAPIVersion(input string) (APIVersion, error) { for i, val := range arr { ret[i], err = strconv.Atoi(val) if err != nil { - return nil, fmt.Errorf("Unable to parse version %q: %q is not an integer", input, val) + return nil, fmt.Errorf("unable to parse version %q: %q is not an integer", input, val) } } return ret, nil } func (version APIVersion) String() string { - var str string + parts := make([]string, len(version)) for i, val := range version { - str += strconv.Itoa(val) - if i < len(version)-1 { - str += "." - } + parts[i] = strconv.Itoa(val) } - return str + return strings.Join(parts, ".") } -// LessThan is a function for comparing APIVersion structs +// LessThan is a function for comparing APIVersion structs. func (version APIVersion) LessThan(other APIVersion) bool { return version.compare(other) < 0 } -// LessThanOrEqualTo is a function for comparing APIVersion structs +// LessThanOrEqualTo is a function for comparing APIVersion structs. func (version APIVersion) LessThanOrEqualTo(other APIVersion) bool { return version.compare(other) <= 0 } -// GreaterThan is a function for comparing APIVersion structs +// GreaterThan is a function for comparing APIVersion structs. func (version APIVersion) GreaterThan(other APIVersion) bool { return version.compare(other) > 0 } -// GreaterThanOrEqualTo is a function for comparing APIVersion structs +// GreaterThanOrEqualTo is a function for comparing APIVersion structs. func (version APIVersion) GreaterThanOrEqualTo(other APIVersion) bool { return version.compare(other) >= 0 } @@ -218,11 +216,19 @@ func NewVersionedClient(endpoint string, apiVersionString string) (*Client, erro eventMonitor: new(eventMonitoringState), requestedAPIVersion: requestedAPIVersion, } - c.initializeNativeClient() + c.initializeNativeClient(defaultTransport) return c, nil } -// NewVersionnedTLSClient has been DEPRECATED, please use NewVersionedTLSClient. +// WithTransport replaces underlying HTTP client of Docker Client by accepting +// a function that returns pointer to a transport object. +func (c *Client) WithTransport(trFunc func() *http.Transport) { + c.initializeNativeClient(trFunc) +} + +// NewVersionnedTLSClient is like NewVersionedClient, but with ann extra n. +// +// Deprecated: Use NewVersionedTLSClient instead. func NewVersionnedTLSClient(endpoint string, cert, key, ca, apiVersionString string) (*Client, error) { return NewVersionedTLSClient(endpoint, cert, key, ca, apiVersionString) } @@ -255,16 +261,19 @@ func NewVersionedTLSClient(endpoint string, cert, key, ca, apiVersionString stri } // NewClientFromEnv returns a Client instance ready for communication created from -// Docker's default logic for the environment variables DOCKER_HOST, DOCKER_TLS_VERIFY, and DOCKER_CERT_PATH. +// Docker's default logic for the environment variables DOCKER_HOST, DOCKER_TLS_VERIFY, DOCKER_CERT_PATH, +// and DOCKER_API_VERSION. // // See https://github.com/docker/docker/blob/1f963af697e8df3a78217f6fdbf67b8123a7db94/docker/docker.go#L68. // See https://github.com/docker/compose/blob/81707ef1ad94403789166d2fe042c8a718a4c748/compose/cli/docker_client.py#L7. +// See https://github.com/moby/moby/blob/28d7dba41d0c0d9c7f0dafcc79d3c59f2b3f5dc3/client/options.go#L51 func NewClientFromEnv() (*Client, error) { - client, err := NewVersionedClientFromEnv("") + apiVersionString := os.Getenv("DOCKER_API_VERSION") + client, err := NewVersionedClientFromEnv(apiVersionString) if err != nil { return nil, err } - client.SkipServerVersionCheck = true + client.SkipServerVersionCheck = apiVersionString == "" return client, nil } @@ -308,7 +317,7 @@ func NewVersionedTLSClientFromBytes(endpoint string, certPEMBlock, keyPEMBlock, return nil, err } } - tlsConfig := &tls.Config{} + tlsConfig := &tls.Config{MinVersion: tls.VersionTLS12} if certPEMBlock != nil && keyPEMBlock != nil { tlsCert, err := tls.X509KeyPair(certPEMBlock, keyPEMBlock) if err != nil { @@ -321,7 +330,7 @@ func NewVersionedTLSClientFromBytes(endpoint string, certPEMBlock, keyPEMBlock, } else { caPool := x509.NewCertPool() if !caPool.AppendCertsFromPEM(caPEMCert) { - return nil, errors.New("Could not add RootCA pem") + return nil, errors.New("could not add RootCA pem") } tlsConfig.RootCAs = caPool } @@ -339,7 +348,7 @@ func NewVersionedTLSClientFromBytes(endpoint string, certPEMBlock, keyPEMBlock, eventMonitor: new(eventMonitoringState), requestedAPIVersion: requestedAPIVersion, } - c.initializeNativeClient() + c.initializeNativeClient(defaultTransport) return c, nil } @@ -379,7 +388,7 @@ func (c *Client) Endpoint() string { // // See https://goo.gl/wYfgY1 for more details. func (c *Client) Ping() error { - return c.PingWithContext(nil) + return c.PingWithContext(context.TODO()) } // PingWithContext pings the docker server @@ -388,7 +397,7 @@ func (c *Client) Ping() error { // See https://goo.gl/wYfgY1 for more details. func (c *Client) PingWithContext(ctx context.Context) error { path := "/_ping" - resp, err := c.do("GET", path, doOptions{context: ctx}) + resp, err := c.do(http.MethodGet, path, doOptions{context: ctx}) if err != nil { return err } @@ -400,13 +409,13 @@ func (c *Client) PingWithContext(ctx context.Context) error { } func (c *Client) getServerAPIVersionString() (version string, err error) { - resp, err := c.do("GET", "/version", doOptions{}) + resp, err := c.do(http.MethodGet, "/version", doOptions{}) if err != nil { return "", err } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { - return "", fmt.Errorf("Received unexpected status %d while trying to retrieve the server version", resp.StatusCode) + return "", fmt.Errorf("received unexpected status %d while trying to retrieve the server version", resp.StatusCode) } var versionResponse map[string]interface{} if err := json.NewDecoder(resp.Body).Decode(&versionResponse); err != nil { @@ -456,7 +465,7 @@ func (c *Client) do(method, path string, doOptions doOptions) (*http.Response, e req.Header.Set("User-Agent", userAgent) if doOptions.data != nil { req.Header.Set("Content-Type", "application/json") - } else if method == "POST" { + } else if method == http.MethodPost { req.Header.Set("Content-Type", "plain/text") } @@ -469,7 +478,7 @@ func (c *Client) do(method, path string, doOptions doOptions) (*http.Response, e ctx = context.Background() } - resp, err := ctxhttp.Do(ctx, c.HTTPClient, req) + resp, err := c.HTTPClient.Do(req.WithContext(ctx)) if err != nil { if strings.Contains(err.Error(), "connection refused") { return nil, ErrConnectionRefused @@ -500,7 +509,6 @@ type streamOptions struct { context context.Context } -// if error in context, return that instead of generic http error func chooseError(ctx context.Context, err error) error { select { case <-ctx.Done(): @@ -511,7 +519,7 @@ func chooseError(ctx context.Context, err error) error { } func (c *Client) stream(method, path string, streamOptions streamOptions) error { - if (method == "POST" || method == "PUT") && streamOptions.in == nil { + if (method == http.MethodPost || method == http.MethodPut) && streamOptions.in == nil { streamOptions.in = bytes.NewReader(nil) } if path != "/version" && !c.SkipServerVersionCheck && c.expectedAPIVersion == nil { @@ -520,12 +528,34 @@ func (c *Client) stream(method, path string, streamOptions streamOptions) error return err } } - req, err := http.NewRequest(method, c.getURL(path), streamOptions.in) + return c.streamURL(method, c.getURL(path), streamOptions) +} + +func (c *Client) streamURL(method, url string, streamOptions streamOptions) error { + if (method == http.MethodPost || method == http.MethodPut) && streamOptions.in == nil { + streamOptions.in = bytes.NewReader(nil) + } + if !c.SkipServerVersionCheck && c.expectedAPIVersion == nil { + err := c.checkAPIVersion() + if err != nil { + return err + } + } + + // make a sub-context so that our active cancellation does not affect parent + ctx := streamOptions.context + if ctx == nil { + ctx = context.Background() + } + subCtx, cancelRequest := context.WithCancel(ctx) + defer cancelRequest() + + req, err := http.NewRequestWithContext(ctx, method, url, streamOptions.in) if err != nil { return err } req.Header.Set("User-Agent", userAgent) - if method == "POST" { + if method == http.MethodPost { req.Header.Set("Content-Type", "plain/text") } for key, val := range streamOptions.headers { @@ -541,14 +571,6 @@ func (c *Client) stream(method, path string, streamOptions streamOptions) error streamOptions.stderr = ioutil.Discard } - // make a sub-context so that our active cancellation does not affect parent - ctx := streamOptions.context - if ctx == nil { - ctx = context.Background() - } - subCtx, cancelRequest := context.WithCancel(ctx) - defer cancelRequest() - if protocol == unixProtocol || protocol == namedPipeProtocol { var dial net.Conn dial, err = c.Dialer.Dial(protocol, address) @@ -584,18 +606,19 @@ func (c *Client) stream(method, path string, streamOptions streamOptions) error return chooseError(subCtx, err) } + defer resp.Body.Close() } else { - if resp, err = ctxhttp.Do(subCtx, c.HTTPClient, req); err != nil { + if resp, err = c.HTTPClient.Do(req.WithContext(subCtx)); err != nil { if strings.Contains(err.Error(), "connection refused") { return ErrConnectionRefused } return chooseError(subCtx, err) } + defer resp.Body.Close() if streamOptions.reqSent != nil { close(streamOptions.reqSent) } } - defer resp.Body.Close() if resp.StatusCode < 200 || resp.StatusCode >= 400 { return newError(resp) } @@ -631,11 +654,7 @@ func handleStreamResponse(resp *http.Response, streamOptions *streamOptions) err _, err = io.Copy(streamOptions.stdout, resp.Body) return err } - if st, ok := streamOptions.stdout.(interface { - io.Writer - FD() uintptr - IsTerminal() bool - }); ok { + if st, ok := streamOptions.stdout.(stream); ok { err = jsonmessage.DisplayJSONMessagesToStream(resp.Body, st, nil) } else { err = jsonmessage.DisplayJSONMessagesStream(resp.Body, streamOptions.stdout, 0, false, nil) @@ -643,6 +662,12 @@ func handleStreamResponse(resp *http.Response, streamOptions *streamOptions) err return err } +type stream interface { + io.Writer + FD() uintptr + IsTerminal() bool +} + type proxyReader struct { io.ReadCloser calls uint64 @@ -752,6 +777,7 @@ func (c *Client) hijack(method, path string, hijackOptions hijackOptions) (Close errs := make(chan error, 1) quit := make(chan struct{}) go func() { + //lint:ignore SA1019 the alternative doesn't quite work, so keep using the deprecated thing. clientconn := httputil.NewClientConn(dial, nil) defer clientconn.Close() clientconn.Do(req) @@ -848,6 +874,29 @@ func (c *Client) getURL(path string) string { return fmt.Sprintf("%s%s", urlStr, path) } +func (c *Client) getPath(basepath string, opts interface{}) (string, error) { + queryStr, requiredAPIVersion := queryStringVersion(opts) + return c.pathVersionCheck(basepath, queryStr, requiredAPIVersion) +} + +func (c *Client) pathVersionCheck(basepath, queryStr string, requiredAPIVersion APIVersion) (string, error) { + urlStr := strings.TrimRight(c.endpointURL.String(), "/") + if c.endpointURL.Scheme == unixProtocol || c.endpointURL.Scheme == namedPipeProtocol { + urlStr = "" + } + if c.requestedAPIVersion != nil { + if c.requestedAPIVersion.GreaterThanOrEqualTo(requiredAPIVersion) { + return fmt.Sprintf("%s/v%s%s?%s", urlStr, c.requestedAPIVersion, basepath, queryStr), nil + } + return "", fmt.Errorf("API %s requires version %s, requested version %s is insufficient", + basepath, requiredAPIVersion, c.requestedAPIVersion) + } + if requiredAPIVersion != nil { + return fmt.Sprintf("%s/v%s%s?%s", urlStr, requiredAPIVersion, basepath, queryStr), nil + } + return fmt.Sprintf("%s%s?%s", urlStr, basepath, queryStr), nil +} + // getFakeNativeURL returns the URL needed to make an HTTP request over a UNIX // domain socket to the given path. func (c *Client) getFakeNativeURL(path string) string { @@ -864,24 +913,18 @@ func (c *Client) getFakeNativeURL(path string) string { return fmt.Sprintf("%s%s", urlStr, path) } -type jsonMessage struct { - Status string `json:"status,omitempty"` - Progress string `json:"progress,omitempty"` - Error string `json:"error,omitempty"` - Stream string `json:"stream,omitempty"` -} - -func queryString(opts interface{}) string { +func queryStringVersion(opts interface{}) (string, APIVersion) { if opts == nil { - return "" + return "", nil } value := reflect.ValueOf(opts) if value.Kind() == reflect.Ptr { value = value.Elem() } if value.Kind() != reflect.Struct { - return "" + return "", nil } + var apiVersion APIVersion items := url.Values(map[string][]string{}) for i := 0; i < value.NumField(); i++ { field := value.Type().Field(i) @@ -894,49 +937,80 @@ func queryString(opts interface{}) string { } else if key == "-" { continue } - addQueryStringValue(items, key, value.Field(i)) + if addQueryStringValue(items, key, value.Field(i)) { + verstr := field.Tag.Get("ver") + if verstr != "" { + ver, _ := NewAPIVersion(verstr) + if apiVersion == nil { + apiVersion = ver + } else if ver.GreaterThan(apiVersion) { + apiVersion = ver + } + } + } } - return items.Encode() + return items.Encode(), apiVersion } -func addQueryStringValue(items url.Values, key string, v reflect.Value) { +func queryString(opts interface{}) string { + s, _ := queryStringVersion(opts) + return s +} + +func addQueryStringValue(items url.Values, key string, v reflect.Value) bool { switch v.Kind() { case reflect.Bool: if v.Bool() { items.Add(key, "1") + return true } case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: if v.Int() > 0 { items.Add(key, strconv.FormatInt(v.Int(), 10)) + return true + } + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + if v.Uint() > 0 { + items.Add(key, strconv.FormatUint(v.Uint(), 10)) + return true } case reflect.Float32, reflect.Float64: if v.Float() > 0 { items.Add(key, strconv.FormatFloat(v.Float(), 'f', -1, 64)) + return true } case reflect.String: if v.String() != "" { items.Add(key, v.String()) + return true } case reflect.Ptr: if !v.IsNil() { if b, err := json.Marshal(v.Interface()); err == nil { items.Add(key, string(b)) + return true } } case reflect.Map: if len(v.MapKeys()) > 0 { if b, err := json.Marshal(v.Interface()); err == nil { items.Add(key, string(b)) + return true } } case reflect.Array, reflect.Slice: vLen := v.Len() + var valuesAdded int if vLen > 0 { for i := 0; i < vLen; i++ { - addQueryStringValue(items, key, v.Index(i)) + if addQueryStringValue(items, key, v.Index(i)) { + valuesAdded++ + } } } + return valuesAdded > 0 } + return false } // Error represents failures in the API. It represents a failure from the API. @@ -946,12 +1020,20 @@ type Error struct { } func newError(resp *http.Response) *Error { + type ErrMsg struct { + Message string `json:"message"` + } defer resp.Body.Close() data, err := ioutil.ReadAll(resp.Body) if err != nil { return &Error{Status: resp.StatusCode, Message: fmt.Sprintf("cannot read body, err: %v", err)} } - return &Error{Status: resp.StatusCode, Message: string(data)} + var emsg ErrMsg + err = json.Unmarshal(data, &emsg) + if err != nil { + return &Error{Status: resp.StatusCode, Message: string(data)} + } + return &Error{Status: resp.StatusCode, Message: emsg.Message} } func (e *Error) Error() string { @@ -975,7 +1057,8 @@ func parseEndpoint(endpoint string, tls bool) (*url.URL, error) { case "http", "https", "tcp": _, port, err := net.SplitHostPort(u.Host) if err != nil { - if e, ok := err.(*net.AddrError); ok { + var e *net.AddrError + if errors.As(err, &e) { if e.Err == "missing port in address" { return u, nil } @@ -1009,7 +1092,7 @@ func getDockerEnv() (*dockerEnv, error) { dockerHost := os.Getenv("DOCKER_HOST") var err error if dockerHost == "" { - dockerHost = opts.DefaultHost + dockerHost = defaultHost } dockerTLSVerify := os.Getenv("DOCKER_TLS_VERIFY") != "" var dockerCertPath string diff --git a/vendor/github.com/fsouza/go-dockerclient/client_unix.go b/vendor/github.com/fsouza/go-dockerclient/client_unix.go index ab73cf2b0d69..cd2034304bed 100644 --- a/vendor/github.com/fsouza/go-dockerclient/client_unix.go +++ b/vendor/github.com/fsouza/go-dockerclient/client_unix.go @@ -9,21 +9,23 @@ package docker import ( "context" "net" + "net/http" ) +const defaultHost = "unix:///var/run/docker.sock" + // initializeNativeClient initializes the native Unix domain socket client on // Unix-style operating systems -func (c *Client) initializeNativeClient() { +func (c *Client) initializeNativeClient(trFunc func() *http.Transport) { if c.endpointURL.Scheme != unixProtocol { return } - socketPath := c.endpointURL.Path - tr := defaultTransport() - tr.Dial = func(network, addr string) (net.Conn, error) { - return c.Dialer.Dial(unixProtocol, socketPath) - } - tr.DialContext = func(ctx context.Context, network, addr string) (net.Conn, error) { - return c.Dialer.Dial(unixProtocol, socketPath) + sockPath := c.endpointURL.Path + + tr := trFunc() + tr.Proxy = nil + tr.DialContext = func(_ context.Context, network, addr string) (net.Conn, error) { + return c.Dialer.Dial(unixProtocol, sockPath) } c.HTTPClient.Transport = tr } diff --git a/vendor/github.com/fsouza/go-dockerclient/client_windows.go b/vendor/github.com/fsouza/go-dockerclient/client_windows.go index c9ecc187dada..d35f401a44d8 100644 --- a/vendor/github.com/fsouza/go-dockerclient/client_windows.go +++ b/vendor/github.com/fsouza/go-dockerclient/client_windows.go @@ -2,19 +2,21 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build windows - package docker import ( "context" "net" + "net/http" "time" - "github.com/Microsoft/go-winio" + winio "github.com/Microsoft/go-winio" ) -const namedPipeConnectTimeout = 2 * time.Second +const ( + defaultHost = "npipe:////./pipe/docker_engine" + namedPipeConnectTimeout = 2 * time.Second +) type pipeDialer struct { dialFunc func(network, addr string) (net.Conn, error) @@ -25,17 +27,17 @@ func (p pipeDialer) Dial(network, address string) (net.Conn, error) { } // initializeNativeClient initializes the native Named Pipe client for Windows -func (c *Client) initializeNativeClient() { +func (c *Client) initializeNativeClient(trFunc func() *http.Transport) { if c.endpointURL.Scheme != namedPipeProtocol { return } namedPipePath := c.endpointURL.Path - dialFunc := func(network, addr string) (net.Conn, error) { + dialFunc := func(_, addr string) (net.Conn, error) { timeout := namedPipeConnectTimeout return winio.DialPipe(namedPipePath, &timeout) } - tr := defaultTransport() - tr.Dial = dialFunc + tr := trFunc() + tr.Proxy = nil tr.DialContext = func(ctx context.Context, network, addr string) (net.Conn, error) { return dialFunc(network, addr) } diff --git a/vendor/github.com/fsouza/go-dockerclient/container.go b/vendor/github.com/fsouza/go-dockerclient/container.go index afa49ca83a9a..48e550495b8a 100644 --- a/vendor/github.com/fsouza/go-dockerclient/container.go +++ b/vendor/github.com/fsouza/go-dockerclient/container.go @@ -5,37 +5,14 @@ package docker import ( - "encoding/json" - "errors" "fmt" - "io" - "net/http" - "net/url" "strconv" "strings" "time" - "github.com/docker/go-units" - "golang.org/x/net/context" + units "github.com/docker/go-units" ) -// ErrContainerAlreadyExists is the error returned by CreateContainer when the -// container already exists. -var ErrContainerAlreadyExists = errors.New("container already exists") - -// ListContainersOptions specify parameters to the ListContainers function. -// -// See https://goo.gl/kaOHGw for more details. -type ListContainersOptions struct { - All bool - Size bool - Limit int - Since string - Before string - Filters map[string][]string - Context context.Context -} - // APIPort is a type that represents a port mapping returned by the Docker API type APIPort struct { PrivatePort int64 `json:"PrivatePort,omitempty" yaml:"PrivatePort,omitempty" toml:"PrivatePort,omitempty"` @@ -52,7 +29,8 @@ type APIMount struct { Driver string `json:"Driver,omitempty" yaml:"Driver,omitempty" toml:"Driver,omitempty"` Mode string `json:"Mode,omitempty" yaml:"Mode,omitempty" toml:"Mode,omitempty"` RW bool `json:"RW,omitempty" yaml:"RW,omitempty" toml:"RW,omitempty"` - Propogation string `json:"Propogation,omitempty" yaml:"Propogation,omitempty" toml:"Propogation,omitempty"` + Propagation string `json:"Propagation,omitempty" yaml:"Propagation,omitempty" toml:"Propagation,omitempty"` + Type string `json:"Type,omitempty" yaml:"Type,omitempty" toml:"Type,omitempty"` } // APIContainers represents each container in the list returned by @@ -79,23 +57,6 @@ type NetworkList struct { Networks map[string]ContainerNetwork `json:"Networks" yaml:"Networks,omitempty" toml:"Networks,omitempty"` } -// ListContainers returns a slice of containers matching the given criteria. -// -// See https://goo.gl/kaOHGw for more details. -func (c *Client) ListContainers(opts ListContainersOptions) ([]APIContainers, error) { - path := "/containers/json?" + queryString(opts) - resp, err := c.do("GET", path, doOptions{context: opts.Context}) - if err != nil { - return nil, err - } - defer resp.Body.Close() - var containers []APIContainers - if err := json.NewDecoder(resp.Body).Decode(&containers); err != nil { - return nil, err - } - return containers, nil -} - // Port represents the port number and the protocol, in the form // /. For example: 80/tcp. type Port string @@ -300,8 +261,10 @@ type Config struct { ExposedPorts map[Port]struct{} `json:"ExposedPorts,omitempty" yaml:"ExposedPorts,omitempty" toml:"ExposedPorts,omitempty"` PublishService string `json:"PublishService,omitempty" yaml:"PublishService,omitempty" toml:"PublishService,omitempty"` StopSignal string `json:"StopSignal,omitempty" yaml:"StopSignal,omitempty" toml:"StopSignal,omitempty"` + StopTimeout int `json:"StopTimeout,omitempty" yaml:"StopTimeout,omitempty" toml:"StopTimeout,omitempty"` Env []string `json:"Env,omitempty" yaml:"Env,omitempty" toml:"Env,omitempty"` Cmd []string `json:"Cmd" yaml:"Cmd" toml:"Cmd"` + Shell []string `json:"Shell,omitempty" yaml:"Shell,omitempty" toml:"Shell,omitempty"` Healthcheck *HealthConfig `json:"Healthcheck,omitempty" yaml:"Healthcheck,omitempty" toml:"Healthcheck,omitempty"` DNS []string `json:"Dns,omitempty" yaml:"Dns,omitempty" toml:"Dns,omitempty"` // For Docker API v1.9 and below only Image string `json:"Image,omitempty" yaml:"Image,omitempty" toml:"Image,omitempty"` @@ -338,7 +301,7 @@ type HostMount struct { ReadOnly bool `json:"ReadOnly,omitempty" yaml:"ReadOnly,omitempty" toml:"ReadOnly,omitempty"` BindOptions *BindOptions `json:"BindOptions,omitempty" yaml:"BindOptions,omitempty" toml:"BindOptions,omitempty"` VolumeOptions *VolumeOptions `json:"VolumeOptions,omitempty" yaml:"VolumeOptions,omitempty" toml:"VolumeOptions,omitempty"` - TempfsOptions *TempfsOptions `json:"TempfsOptions,omitempty" yaml:"TempfsOptions,omitempty" toml:"TempfsOptions,omitempty"` + TempfsOptions *TempfsOptions `json:"TmpfsOptions,omitempty" yaml:"TmpfsOptions,omitempty" toml:"TmpfsOptions,omitempty"` } // BindOptions contains optional configuration for the bind type @@ -426,8 +389,9 @@ type HealthConfig struct { Test []string `json:"Test,omitempty" yaml:"Test,omitempty" toml:"Test,omitempty"` // Zero means to inherit. Durations are expressed as integer nanoseconds. - Interval time.Duration `json:"Interval,omitempty" yaml:"Interval,omitempty" toml:"Interval,omitempty"` // Interval is the time to wait between checks. - Timeout time.Duration `json:"Timeout,omitempty" yaml:"Timeout,omitempty" toml:"Timeout,omitempty"` // Timeout is the time to wait before considering the check to have hung. + Interval time.Duration `json:"Interval,omitempty" yaml:"Interval,omitempty" toml:"Interval,omitempty"` // Interval is the time to wait between checks. + Timeout time.Duration `json:"Timeout,omitempty" yaml:"Timeout,omitempty" toml:"Timeout,omitempty"` // Timeout is the time to wait before considering the check to have hung. + StartPeriod time.Duration `json:"StartPeriod,omitempty" yaml:"StartPeriod,omitempty" toml:"StartPeriod,omitempty"` // The start period for the container to initialize before the retries starts to count down. // Retries is the number of consecutive failures needed to consider a container as unhealthy. // Zero means inherit. @@ -470,185 +434,12 @@ type Container struct { RestartCount int `json:"RestartCount,omitempty" yaml:"RestartCount,omitempty" toml:"RestartCount,omitempty"` AppArmorProfile string `json:"AppArmorProfile,omitempty" yaml:"AppArmorProfile,omitempty" toml:"AppArmorProfile,omitempty"` -} - -// UpdateContainerOptions specify parameters to the UpdateContainer function. -// -// See https://goo.gl/Y6fXUy for more details. -type UpdateContainerOptions struct { - BlkioWeight int `json:"BlkioWeight"` - CPUShares int `json:"CpuShares"` - CPUPeriod int `json:"CpuPeriod"` - CPURealtimePeriod int64 `json:"CpuRealtimePeriod"` - CPURealtimeRuntime int64 `json:"CpuRealtimeRuntime"` - CPUQuota int `json:"CpuQuota"` - CpusetCpus string `json:"CpusetCpus"` - CpusetMems string `json:"CpusetMems"` - Memory int `json:"Memory"` - MemorySwap int `json:"MemorySwap"` - MemoryReservation int `json:"MemoryReservation"` - KernelMemory int `json:"KernelMemory"` - RestartPolicy RestartPolicy `json:"RestartPolicy,omitempty"` - Context context.Context -} - -// UpdateContainer updates the container at ID with the options -// -// See https://goo.gl/Y6fXUy for more details. -func (c *Client) UpdateContainer(id string, opts UpdateContainerOptions) error { - resp, err := c.do("POST", fmt.Sprintf("/containers/"+id+"/update"), doOptions{ - data: opts, - forceJSON: true, - context: opts.Context, - }) - if err != nil { - return err - } - defer resp.Body.Close() - return nil -} - -// RenameContainerOptions specify parameters to the RenameContainer function. -// -// See https://goo.gl/46inai for more details. -type RenameContainerOptions struct { - // ID of container to rename - ID string `qs:"-"` - - // New name - Name string `json:"name,omitempty" yaml:"name,omitempty"` - Context context.Context -} - -// RenameContainer updates and existing containers name -// -// See https://goo.gl/46inai for more details. -func (c *Client) RenameContainer(opts RenameContainerOptions) error { - resp, err := c.do("POST", fmt.Sprintf("/containers/"+opts.ID+"/rename?%s", queryString(opts)), doOptions{ - context: opts.Context, - }) - if err != nil { - return err - } - resp.Body.Close() - return nil -} - -// InspectContainer returns information about a container by its ID. -// -// See https://goo.gl/FaI5JT for more details. -func (c *Client) InspectContainer(id string) (*Container, error) { - return c.inspectContainer(id, doOptions{}) -} - -// InspectContainerWithContext returns information about a container by its ID. -// The context object can be used to cancel the inspect request. -// -// See https://goo.gl/FaI5JT for more details. -func (c *Client) InspectContainerWithContext(id string, ctx context.Context) (*Container, error) { - return c.inspectContainer(id, doOptions{context: ctx}) -} - -func (c *Client) inspectContainer(id string, opts doOptions) (*Container, error) { - path := "/containers/" + id + "/json" - resp, err := c.do("GET", path, opts) - if err != nil { - if e, ok := err.(*Error); ok && e.Status == http.StatusNotFound { - return nil, &NoSuchContainer{ID: id} - } - return nil, err - } - defer resp.Body.Close() - var container Container - if err := json.NewDecoder(resp.Body).Decode(&container); err != nil { - return nil, err - } - return &container, nil -} - -// ContainerChanges returns changes in the filesystem of the given container. -// -// See https://goo.gl/15KKzh for more details. -func (c *Client) ContainerChanges(id string) ([]Change, error) { - path := "/containers/" + id + "/changes" - resp, err := c.do("GET", path, doOptions{}) - if err != nil { - if e, ok := err.(*Error); ok && e.Status == http.StatusNotFound { - return nil, &NoSuchContainer{ID: id} - } - return nil, err - } - defer resp.Body.Close() - var changes []Change - if err := json.NewDecoder(resp.Body).Decode(&changes); err != nil { - return nil, err - } - return changes, nil -} - -// CreateContainerOptions specify parameters to the CreateContainer function. -// -// See https://goo.gl/tyzwVM for more details. -type CreateContainerOptions struct { - Name string - Config *Config `qs:"-"` - HostConfig *HostConfig `qs:"-"` - NetworkingConfig *NetworkingConfig `qs:"-"` - Context context.Context -} - -// CreateContainer creates a new container, returning the container instance, -// or an error in case of failure. -// -// The returned container instance contains only the container ID. To get more -// details about the container after creating it, use InspectContainer. -// -// See https://goo.gl/tyzwVM for more details. -func (c *Client) CreateContainer(opts CreateContainerOptions) (*Container, error) { - path := "/containers/create?" + queryString(opts) - resp, err := c.do( - "POST", - path, - doOptions{ - data: struct { - *Config - HostConfig *HostConfig `json:"HostConfig,omitempty" yaml:"HostConfig,omitempty" toml:"HostConfig,omitempty"` - NetworkingConfig *NetworkingConfig `json:"NetworkingConfig,omitempty" yaml:"NetworkingConfig,omitempty" toml:"NetworkingConfig,omitempty"` - }{ - opts.Config, - opts.HostConfig, - opts.NetworkingConfig, - }, - context: opts.Context, - }, - ) - - if e, ok := err.(*Error); ok { - if e.Status == http.StatusNotFound { - return nil, ErrNoSuchImage - } - if e.Status == http.StatusConflict { - return nil, ErrContainerAlreadyExists - } - // Workaround for 17.09 bug returning 400 instead of 409. - // See https://github.com/moby/moby/issues/35021 - if e.Status == http.StatusBadRequest && strings.Contains(e.Message, "Conflict.") { - return nil, ErrContainerAlreadyExists - } - } - - if err != nil { - return nil, err - } - defer resp.Body.Close() - var container Container - if err := json.NewDecoder(resp.Body).Decode(&container); err != nil { - return nil, err - } - - container.Name = opts.Name - return &container, nil + MountLabel string `json:"MountLabel,omitempty" yaml:"MountLabel,omitempty" toml:"MountLabel,omitempty"` + ProcessLabel string `json:"ProcessLabel,omitempty" yaml:"ProcessLabel,omitempty" toml:"ProcessLabel,omitempty"` + Platform string `json:"Platform,omitempty" yaml:"Platform,omitempty" toml:"Platform,omitempty"` + SizeRw int64 `json:"SizeRw,omitempty" yaml:"SizeRw,omitempty" toml:"SizeRw,omitempty"` + SizeRootFs int64 `json:"SizeRootFs,omitempty" yaml:"SizeRootFs,omitempty" toml:"SizeRootFs,omitempty"` } // KeyValuePair is a type for generic key/value pairs as used in the Lxc @@ -658,45 +449,6 @@ type KeyValuePair struct { Value string `json:"Value,omitempty" yaml:"Value,omitempty" toml:"Value,omitempty"` } -// RestartPolicy represents the policy for automatically restarting a container. -// -// Possible values are: -// -// - always: the docker daemon will always restart the container -// - on-failure: the docker daemon will restart the container on failures, at -// most MaximumRetryCount times -// - unless-stopped: the docker daemon will always restart the container except -// when user has manually stopped the container -// - no: the docker daemon will not restart the container automatically -type RestartPolicy struct { - Name string `json:"Name,omitempty" yaml:"Name,omitempty" toml:"Name,omitempty"` - MaximumRetryCount int `json:"MaximumRetryCount,omitempty" yaml:"MaximumRetryCount,omitempty" toml:"MaximumRetryCount,omitempty"` -} - -// AlwaysRestart returns a restart policy that tells the Docker daemon to -// always restart the container. -func AlwaysRestart() RestartPolicy { - return RestartPolicy{Name: "always"} -} - -// RestartOnFailure returns a restart policy that tells the Docker daemon to -// restart the container on failures, trying at most maxRetry times. -func RestartOnFailure(maxRetry int) RestartPolicy { - return RestartPolicy{Name: "on-failure", MaximumRetryCount: maxRetry} -} - -// RestartUnlessStopped returns a restart policy that tells the Docker daemon to -// always restart the container except when user has manually stopped the container. -func RestartUnlessStopped() RestartPolicy { - return RestartPolicy{Name: "unless-stopped"} -} - -// NeverRestart returns a restart policy that tells the Docker daemon to never -// restart the container on failures. -func NeverRestart() RestartPolicy { - return RestartPolicy{Name: "no"} -} - // Device represents a device mapping between the Docker host and the // container. type Device struct { @@ -705,6 +457,15 @@ type Device struct { CgroupPermissions string `json:"CgroupPermissions,omitempty" yaml:"CgroupPermissions,omitempty" toml:"CgroupPermissions,omitempty"` } +// DeviceRequest represents a request for device that's sent to device drivers. +type DeviceRequest struct { + Driver string `json:"Driver,omitempty" yaml:"Driver,omitempty" toml:"Driver,omitempty"` + Count int `json:"Count,omitempty" yaml:"Count,omitempty" toml:"Count,omitempty"` + DeviceIDs []string `json:"DeviceIDs,omitempty" yaml:"DeviceIDs,omitempty" toml:"DeviceIDs,omitempty"` + Capabilities [][]string `json:"Capabilities,omitempty" yaml:"Capabilities,omitempty" toml:"Capabilities,omitempty"` + Options map[string]string `json:"Options,omitempty" yaml:"Options,omitempty" toml:"Options,omitempty"` +} + // BlockWeight represents a relative device weight for an individual device inside // of a container type BlockWeight struct { @@ -725,6 +486,7 @@ type HostConfig struct { Binds []string `json:"Binds,omitempty" yaml:"Binds,omitempty" toml:"Binds,omitempty"` CapAdd []string `json:"CapAdd,omitempty" yaml:"CapAdd,omitempty" toml:"CapAdd,omitempty"` CapDrop []string `json:"CapDrop,omitempty" yaml:"CapDrop,omitempty" toml:"CapDrop,omitempty"` + Capabilities []string `json:"Capabilities,omitempty" yaml:"Capabilities,omitempty" toml:"Capabilities,omitempty"` // Mutually exclusive w.r.t. CapAdd and CapDrop API v1.40 GroupAdd []string `json:"GroupAdd,omitempty" yaml:"GroupAdd,omitempty" toml:"GroupAdd,omitempty"` ContainerIDFile string `json:"ContainerIDFile,omitempty" yaml:"ContainerIDFile,omitempty" toml:"ContainerIDFile,omitempty"` LxcConf []KeyValuePair `json:"LxcConf,omitempty" yaml:"LxcConf,omitempty" toml:"LxcConf,omitempty"` @@ -738,19 +500,23 @@ type HostConfig struct { UsernsMode string `json:"UsernsMode,omitempty" yaml:"UsernsMode,omitempty" toml:"UsernsMode,omitempty"` NetworkMode string `json:"NetworkMode,omitempty" yaml:"NetworkMode,omitempty" toml:"NetworkMode,omitempty"` IpcMode string `json:"IpcMode,omitempty" yaml:"IpcMode,omitempty" toml:"IpcMode,omitempty"` + Isolation string `json:"Isolation,omitempty" yaml:"Isolation,omitempty" toml:"Isolation,omitempty"` // Windows only + ConsoleSize [2]int `json:"ConsoleSize,omitempty" yaml:"ConsoleSize,omitempty" toml:"ConsoleSize,omitempty"` // Windows only height x width PidMode string `json:"PidMode,omitempty" yaml:"PidMode,omitempty" toml:"PidMode,omitempty"` UTSMode string `json:"UTSMode,omitempty" yaml:"UTSMode,omitempty" toml:"UTSMode,omitempty"` RestartPolicy RestartPolicy `json:"RestartPolicy,omitempty" yaml:"RestartPolicy,omitempty" toml:"RestartPolicy,omitempty"` Devices []Device `json:"Devices,omitempty" yaml:"Devices,omitempty" toml:"Devices,omitempty"` + DeviceCgroupRules []string `json:"DeviceCgroupRules,omitempty" yaml:"DeviceCgroupRules,omitempty" toml:"DeviceCgroupRules,omitempty"` + DeviceRequests []DeviceRequest `json:"DeviceRequests,omitempty" yaml:"DeviceRequests,omitempty" toml:"DeviceRequests,omitempty"` LogConfig LogConfig `json:"LogConfig,omitempty" yaml:"LogConfig,omitempty" toml:"LogConfig,omitempty"` SecurityOpt []string `json:"SecurityOpt,omitempty" yaml:"SecurityOpt,omitempty" toml:"SecurityOpt,omitempty"` + CgroupnsMode string `json:"CgroupnsMode,omitempty" yaml:"CgroupnsMode,omitempty" toml:"CgroupnsMode,omitempty"` // v1.40+ Cgroup string `json:"Cgroup,omitempty" yaml:"Cgroup,omitempty" toml:"Cgroup,omitempty"` CgroupParent string `json:"CgroupParent,omitempty" yaml:"CgroupParent,omitempty" toml:"CgroupParent,omitempty"` Memory int64 `json:"Memory,omitempty" yaml:"Memory,omitempty" toml:"Memory,omitempty"` MemoryReservation int64 `json:"MemoryReservation,omitempty" yaml:"MemoryReservation,omitempty" toml:"MemoryReservation,omitempty"` KernelMemory int64 `json:"KernelMemory,omitempty" yaml:"KernelMemory,omitempty" toml:"KernelMemory,omitempty"` MemorySwap int64 `json:"MemorySwap,omitempty" yaml:"MemorySwap,omitempty" toml:"MemorySwap,omitempty"` - MemorySwappiness int64 `json:"MemorySwappiness" yaml:"MemorySwappiness" toml:"MemorySwappiness"` CPUShares int64 `json:"CpuShares,omitempty" yaml:"CpuShares,omitempty" toml:"CpuShares,omitempty"` CPUSet string `json:"Cpuset,omitempty" yaml:"Cpuset,omitempty" toml:"Cpuset,omitempty"` CPUSetCPUs string `json:"CpusetCpus,omitempty" yaml:"CpusetCpus,omitempty" toml:"CpusetCpus,omitempty"` @@ -759,6 +525,7 @@ type HostConfig struct { CPUPeriod int64 `json:"CpuPeriod,omitempty" yaml:"CpuPeriod,omitempty" toml:"CpuPeriod,omitempty"` CPURealtimePeriod int64 `json:"CpuRealtimePeriod,omitempty" yaml:"CpuRealtimePeriod,omitempty" toml:"CpuRealtimePeriod,omitempty"` CPURealtimeRuntime int64 `json:"CpuRealtimeRuntime,omitempty" yaml:"CpuRealtimeRuntime,omitempty" toml:"CpuRealtimeRuntime,omitempty"` + NanoCPUs int64 `json:"NanoCpus,omitempty" yaml:"NanoCpus,omitempty" toml:"NanoCpus,omitempty"` BlkioWeight int64 `json:"BlkioWeight,omitempty" yaml:"BlkioWeight,omitempty" toml:"BlkioWeight,omitempty"` BlkioWeightDevice []BlockWeight `json:"BlkioWeightDevice,omitempty" yaml:"BlkioWeightDevice,omitempty" toml:"BlkioWeightDevice,omitempty"` BlkioDeviceReadBps []BlockLimit `json:"BlkioDeviceReadBps,omitempty" yaml:"BlkioDeviceReadBps,omitempty" toml:"BlkioDeviceReadBps,omitempty"` @@ -768,14 +535,11 @@ type HostConfig struct { Ulimits []ULimit `json:"Ulimits,omitempty" yaml:"Ulimits,omitempty" toml:"Ulimits,omitempty"` VolumeDriver string `json:"VolumeDriver,omitempty" yaml:"VolumeDriver,omitempty" toml:"VolumeDriver,omitempty"` OomScoreAdj int `json:"OomScoreAdj,omitempty" yaml:"OomScoreAdj,omitempty" toml:"OomScoreAdj,omitempty"` - PidsLimit int64 `json:"PidsLimit,omitempty" yaml:"PidsLimit,omitempty" toml:"PidsLimit,omitempty"` + MemorySwappiness *int64 `json:"MemorySwappiness,omitempty" yaml:"MemorySwappiness,omitempty" toml:"MemorySwappiness,omitempty"` + PidsLimit *int64 `json:"PidsLimit,omitempty" yaml:"PidsLimit,omitempty" toml:"PidsLimit,omitempty"` + OOMKillDisable *bool `json:"OomKillDisable,omitempty" yaml:"OomKillDisable,omitempty" toml:"OomKillDisable,omitempty"` ShmSize int64 `json:"ShmSize,omitempty" yaml:"ShmSize,omitempty" toml:"ShmSize,omitempty"` Tmpfs map[string]string `json:"Tmpfs,omitempty" yaml:"Tmpfs,omitempty" toml:"Tmpfs,omitempty"` - Privileged bool `json:"Privileged,omitempty" yaml:"Privileged,omitempty" toml:"Privileged,omitempty"` - PublishAllPorts bool `json:"PublishAllPorts,omitempty" yaml:"PublishAllPorts,omitempty" toml:"PublishAllPorts,omitempty"` - ReadonlyRootfs bool `json:"ReadonlyRootfs,omitempty" yaml:"ReadonlyRootfs,omitempty" toml:"ReadonlyRootfs,omitempty"` - OOMKillDisable bool `json:"OomKillDisable,omitempty" yaml:"OomKillDisable,omitempty" toml:"OomKillDisable,omitempty"` - AutoRemove bool `json:"AutoRemove,omitempty" yaml:"AutoRemove,omitempty" toml:"AutoRemove,omitempty"` StorageOpt map[string]string `json:"StorageOpt,omitempty" yaml:"StorageOpt,omitempty" toml:"StorageOpt,omitempty"` Sysctls map[string]string `json:"Sysctls,omitempty" yaml:"Sysctls,omitempty" toml:"Sysctls,omitempty"` CPUCount int64 `json:"CpuCount,omitempty" yaml:"CpuCount,omitempty"` @@ -783,7 +547,14 @@ type HostConfig struct { IOMaximumBandwidth int64 `json:"IOMaximumBandwidth,omitempty" yaml:"IOMaximumBandwidth,omitempty"` IOMaximumIOps int64 `json:"IOMaximumIOps,omitempty" yaml:"IOMaximumIOps,omitempty"` Mounts []HostMount `json:"Mounts,omitempty" yaml:"Mounts,omitempty" toml:"Mounts,omitempty"` + MaskedPaths []string `json:"MaskedPaths,omitempty" yaml:"MaskedPaths,omitempty" toml:"MaskedPaths,omitempty"` + ReadonlyPaths []string `json:"ReadonlyPaths,omitempty" yaml:"ReadonlyPaths,omitempty" toml:"ReadonlyPaths,omitempty"` + Runtime string `json:"Runtime,omitempty" yaml:"Runtime,omitempty" toml:"Runtime,omitempty"` Init bool `json:",omitempty" yaml:",omitempty"` + Privileged bool `json:"Privileged,omitempty" yaml:"Privileged,omitempty" toml:"Privileged,omitempty"` + PublishAllPorts bool `json:"PublishAllPorts,omitempty" yaml:"PublishAllPorts,omitempty" toml:"PublishAllPorts,omitempty"` + ReadonlyRootfs bool `json:"ReadonlyRootfs,omitempty" yaml:"ReadonlyRootfs,omitempty" toml:"ReadonlyRootfs,omitempty"` + AutoRemove bool `json:"AutoRemove,omitempty" yaml:"AutoRemove,omitempty" toml:"AutoRemove,omitempty"` } // NetworkingConfig represents the container's networking configuration for each of its interfaces @@ -792,789 +563,6 @@ type NetworkingConfig struct { EndpointsConfig map[string]*EndpointConfig `json:"EndpointsConfig" yaml:"EndpointsConfig" toml:"EndpointsConfig"` // Endpoint configs for each connecting network } -// StartContainer starts a container, returning an error in case of failure. -// -// Passing the HostConfig to this method has been deprecated in Docker API 1.22 -// (Docker Engine 1.10.x) and totally removed in Docker API 1.24 (Docker Engine -// 1.12.x). The client will ignore the parameter when communicating with Docker -// API 1.24 or greater. -// -// See https://goo.gl/fbOSZy for more details. -func (c *Client) StartContainer(id string, hostConfig *HostConfig) error { - return c.startContainer(id, hostConfig, doOptions{}) -} - -// StartContainerWithContext starts a container, returning an error in case of -// failure. The context can be used to cancel the outstanding start container -// request. -// -// Passing the HostConfig to this method has been deprecated in Docker API 1.22 -// (Docker Engine 1.10.x) and totally removed in Docker API 1.24 (Docker Engine -// 1.12.x). The client will ignore the parameter when communicating with Docker -// API 1.24 or greater. -// -// See https://goo.gl/fbOSZy for more details. -func (c *Client) StartContainerWithContext(id string, hostConfig *HostConfig, ctx context.Context) error { - return c.startContainer(id, hostConfig, doOptions{context: ctx}) -} - -func (c *Client) startContainer(id string, hostConfig *HostConfig, opts doOptions) error { - path := "/containers/" + id + "/start" - if c.serverAPIVersion == nil { - c.checkAPIVersion() - } - if c.serverAPIVersion != nil && c.serverAPIVersion.LessThan(apiVersion124) { - opts.data = hostConfig - opts.forceJSON = true - } - resp, err := c.do("POST", path, opts) - if err != nil { - if e, ok := err.(*Error); ok && e.Status == http.StatusNotFound { - return &NoSuchContainer{ID: id, Err: err} - } - return err - } - defer resp.Body.Close() - if resp.StatusCode == http.StatusNotModified { - return &ContainerAlreadyRunning{ID: id} - } - return nil -} - -// StopContainer stops a container, killing it after the given timeout (in -// seconds). -// -// See https://goo.gl/R9dZcV for more details. -func (c *Client) StopContainer(id string, timeout uint) error { - return c.stopContainer(id, timeout, doOptions{}) -} - -// StopContainerWithContext stops a container, killing it after the given -// timeout (in seconds). The context can be used to cancel the stop -// container request. -// -// See https://goo.gl/R9dZcV for more details. -func (c *Client) StopContainerWithContext(id string, timeout uint, ctx context.Context) error { - return c.stopContainer(id, timeout, doOptions{context: ctx}) -} - -func (c *Client) stopContainer(id string, timeout uint, opts doOptions) error { - path := fmt.Sprintf("/containers/%s/stop?t=%d", id, timeout) - resp, err := c.do("POST", path, opts) - if err != nil { - if e, ok := err.(*Error); ok && e.Status == http.StatusNotFound { - return &NoSuchContainer{ID: id} - } - return err - } - defer resp.Body.Close() - if resp.StatusCode == http.StatusNotModified { - return &ContainerNotRunning{ID: id} - } - return nil -} - -// RestartContainer stops a container, killing it after the given timeout (in -// seconds), during the stop process. -// -// See https://goo.gl/MrAKQ5 for more details. -func (c *Client) RestartContainer(id string, timeout uint) error { - path := fmt.Sprintf("/containers/%s/restart?t=%d", id, timeout) - resp, err := c.do("POST", path, doOptions{}) - if err != nil { - if e, ok := err.(*Error); ok && e.Status == http.StatusNotFound { - return &NoSuchContainer{ID: id} - } - return err - } - resp.Body.Close() - return nil -} - -// PauseContainer pauses the given container. -// -// See https://goo.gl/D1Yaii for more details. -func (c *Client) PauseContainer(id string) error { - path := fmt.Sprintf("/containers/%s/pause", id) - resp, err := c.do("POST", path, doOptions{}) - if err != nil { - if e, ok := err.(*Error); ok && e.Status == http.StatusNotFound { - return &NoSuchContainer{ID: id} - } - return err - } - resp.Body.Close() - return nil -} - -// UnpauseContainer unpauses the given container. -// -// See https://goo.gl/sZ2faO for more details. -func (c *Client) UnpauseContainer(id string) error { - path := fmt.Sprintf("/containers/%s/unpause", id) - resp, err := c.do("POST", path, doOptions{}) - if err != nil { - if e, ok := err.(*Error); ok && e.Status == http.StatusNotFound { - return &NoSuchContainer{ID: id} - } - return err - } - resp.Body.Close() - return nil -} - -// TopResult represents the list of processes running in a container, as -// returned by /containers//top. -// -// See https://goo.gl/FLwpPl for more details. -type TopResult struct { - Titles []string - Processes [][]string -} - -// TopContainer returns processes running inside a container -// -// See https://goo.gl/FLwpPl for more details. -func (c *Client) TopContainer(id string, psArgs string) (TopResult, error) { - var args string - var result TopResult - if psArgs != "" { - args = fmt.Sprintf("?ps_args=%s", psArgs) - } - path := fmt.Sprintf("/containers/%s/top%s", id, args) - resp, err := c.do("GET", path, doOptions{}) - if err != nil { - if e, ok := err.(*Error); ok && e.Status == http.StatusNotFound { - return result, &NoSuchContainer{ID: id} - } - return result, err - } - defer resp.Body.Close() - err = json.NewDecoder(resp.Body).Decode(&result) - return result, err -} - -// Stats represents container statistics, returned by /containers//stats. -// -// See https://goo.gl/Dk3Xio for more details. -type Stats struct { - Read time.Time `json:"read,omitempty" yaml:"read,omitempty" toml:"read,omitempty"` - PreRead time.Time `json:"preread,omitempty" yaml:"preread,omitempty" toml:"preread,omitempty"` - NumProcs uint32 `json:"num_procs" yaml:"num_procs" toml:"num_procs"` - PidsStats struct { - Current uint64 `json:"current,omitempty" yaml:"current,omitempty"` - } `json:"pids_stats,omitempty" yaml:"pids_stats,omitempty" toml:"pids_stats,omitempty"` - Network NetworkStats `json:"network,omitempty" yaml:"network,omitempty" toml:"network,omitempty"` - Networks map[string]NetworkStats `json:"networks,omitempty" yaml:"networks,omitempty" toml:"networks,omitempty"` - MemoryStats struct { - Stats struct { - TotalPgmafault uint64 `json:"total_pgmafault,omitempty" yaml:"total_pgmafault,omitempty" toml:"total_pgmafault,omitempty"` - Cache uint64 `json:"cache,omitempty" yaml:"cache,omitempty" toml:"cache,omitempty"` - MappedFile uint64 `json:"mapped_file,omitempty" yaml:"mapped_file,omitempty" toml:"mapped_file,omitempty"` - TotalInactiveFile uint64 `json:"total_inactive_file,omitempty" yaml:"total_inactive_file,omitempty" toml:"total_inactive_file,omitempty"` - Pgpgout uint64 `json:"pgpgout,omitempty" yaml:"pgpgout,omitempty" toml:"pgpgout,omitempty"` - Rss uint64 `json:"rss,omitempty" yaml:"rss,omitempty" toml:"rss,omitempty"` - TotalMappedFile uint64 `json:"total_mapped_file,omitempty" yaml:"total_mapped_file,omitempty" toml:"total_mapped_file,omitempty"` - Writeback uint64 `json:"writeback,omitempty" yaml:"writeback,omitempty" toml:"writeback,omitempty"` - Unevictable uint64 `json:"unevictable,omitempty" yaml:"unevictable,omitempty" toml:"unevictable,omitempty"` - Pgpgin uint64 `json:"pgpgin,omitempty" yaml:"pgpgin,omitempty" toml:"pgpgin,omitempty"` - TotalUnevictable uint64 `json:"total_unevictable,omitempty" yaml:"total_unevictable,omitempty" toml:"total_unevictable,omitempty"` - Pgmajfault uint64 `json:"pgmajfault,omitempty" yaml:"pgmajfault,omitempty" toml:"pgmajfault,omitempty"` - TotalRss uint64 `json:"total_rss,omitempty" yaml:"total_rss,omitempty" toml:"total_rss,omitempty"` - TotalRssHuge uint64 `json:"total_rss_huge,omitempty" yaml:"total_rss_huge,omitempty" toml:"total_rss_huge,omitempty"` - TotalWriteback uint64 `json:"total_writeback,omitempty" yaml:"total_writeback,omitempty" toml:"total_writeback,omitempty"` - TotalInactiveAnon uint64 `json:"total_inactive_anon,omitempty" yaml:"total_inactive_anon,omitempty" toml:"total_inactive_anon,omitempty"` - RssHuge uint64 `json:"rss_huge,omitempty" yaml:"rss_huge,omitempty" toml:"rss_huge,omitempty"` - HierarchicalMemoryLimit uint64 `json:"hierarchical_memory_limit,omitempty" yaml:"hierarchical_memory_limit,omitempty" toml:"hierarchical_memory_limit,omitempty"` - TotalPgfault uint64 `json:"total_pgfault,omitempty" yaml:"total_pgfault,omitempty" toml:"total_pgfault,omitempty"` - TotalActiveFile uint64 `json:"total_active_file,omitempty" yaml:"total_active_file,omitempty" toml:"total_active_file,omitempty"` - ActiveAnon uint64 `json:"active_anon,omitempty" yaml:"active_anon,omitempty" toml:"active_anon,omitempty"` - TotalActiveAnon uint64 `json:"total_active_anon,omitempty" yaml:"total_active_anon,omitempty" toml:"total_active_anon,omitempty"` - TotalPgpgout uint64 `json:"total_pgpgout,omitempty" yaml:"total_pgpgout,omitempty" toml:"total_pgpgout,omitempty"` - TotalCache uint64 `json:"total_cache,omitempty" yaml:"total_cache,omitempty" toml:"total_cache,omitempty"` - InactiveAnon uint64 `json:"inactive_anon,omitempty" yaml:"inactive_anon,omitempty" toml:"inactive_anon,omitempty"` - ActiveFile uint64 `json:"active_file,omitempty" yaml:"active_file,omitempty" toml:"active_file,omitempty"` - Pgfault uint64 `json:"pgfault,omitempty" yaml:"pgfault,omitempty" toml:"pgfault,omitempty"` - InactiveFile uint64 `json:"inactive_file,omitempty" yaml:"inactive_file,omitempty" toml:"inactive_file,omitempty"` - TotalPgpgin uint64 `json:"total_pgpgin,omitempty" yaml:"total_pgpgin,omitempty" toml:"total_pgpgin,omitempty"` - HierarchicalMemswLimit uint64 `json:"hierarchical_memsw_limit,omitempty" yaml:"hierarchical_memsw_limit,omitempty" toml:"hierarchical_memsw_limit,omitempty"` - Swap uint64 `json:"swap,omitempty" yaml:"swap,omitempty" toml:"swap,omitempty"` - } `json:"stats,omitempty" yaml:"stats,omitempty" toml:"stats,omitempty"` - MaxUsage uint64 `json:"max_usage,omitempty" yaml:"max_usage,omitempty" toml:"max_usage,omitempty"` - Usage uint64 `json:"usage,omitempty" yaml:"usage,omitempty" toml:"usage,omitempty"` - Failcnt uint64 `json:"failcnt,omitempty" yaml:"failcnt,omitempty" toml:"failcnt,omitempty"` - Limit uint64 `json:"limit,omitempty" yaml:"limit,omitempty" toml:"limit,omitempty"` - Commit uint64 `json:"commitbytes,omitempty" yaml:"commitbytes,omitempty" toml:"privateworkingset,omitempty"` - CommitPeak uint64 `json:"commitpeakbytes,omitempty" yaml:"commitpeakbytes,omitempty" toml:"commitpeakbytes,omitempty"` - PrivateWorkingSet uint64 `json:"privateworkingset,omitempty" yaml:"privateworkingset,omitempty" toml:"privateworkingset,omitempty"` - } `json:"memory_stats,omitempty" yaml:"memory_stats,omitempty" toml:"memory_stats,omitempty"` - BlkioStats struct { - IOServiceBytesRecursive []BlkioStatsEntry `json:"io_service_bytes_recursive,omitempty" yaml:"io_service_bytes_recursive,omitempty" toml:"io_service_bytes_recursive,omitempty"` - IOServicedRecursive []BlkioStatsEntry `json:"io_serviced_recursive,omitempty" yaml:"io_serviced_recursive,omitempty" toml:"io_serviced_recursive,omitempty"` - IOQueueRecursive []BlkioStatsEntry `json:"io_queue_recursive,omitempty" yaml:"io_queue_recursive,omitempty" toml:"io_queue_recursive,omitempty"` - IOServiceTimeRecursive []BlkioStatsEntry `json:"io_service_time_recursive,omitempty" yaml:"io_service_time_recursive,omitempty" toml:"io_service_time_recursive,omitempty"` - IOWaitTimeRecursive []BlkioStatsEntry `json:"io_wait_time_recursive,omitempty" yaml:"io_wait_time_recursive,omitempty" toml:"io_wait_time_recursive,omitempty"` - IOMergedRecursive []BlkioStatsEntry `json:"io_merged_recursive,omitempty" yaml:"io_merged_recursive,omitempty" toml:"io_merged_recursive,omitempty"` - IOTimeRecursive []BlkioStatsEntry `json:"io_time_recursive,omitempty" yaml:"io_time_recursive,omitempty" toml:"io_time_recursive,omitempty"` - SectorsRecursive []BlkioStatsEntry `json:"sectors_recursive,omitempty" yaml:"sectors_recursive,omitempty" toml:"sectors_recursive,omitempty"` - } `json:"blkio_stats,omitempty" yaml:"blkio_stats,omitempty" toml:"blkio_stats,omitempty"` - CPUStats CPUStats `json:"cpu_stats,omitempty" yaml:"cpu_stats,omitempty" toml:"cpu_stats,omitempty"` - PreCPUStats CPUStats `json:"precpu_stats,omitempty"` - StorageStats struct { - ReadCountNormalized uint64 `json:"read_count_normalized,omitempty" yaml:"read_count_normalized,omitempty" toml:"read_count_normalized,omitempty"` - ReadSizeBytes uint64 `json:"read_size_bytes,omitempty" yaml:"read_size_bytes,omitempty" toml:"read_size_bytes,omitempty"` - WriteCountNormalized uint64 `json:"write_count_normalized,omitempty" yaml:"write_count_normalized,omitempty" toml:"write_count_normalized,omitempty"` - WriteSizeBytes uint64 `json:"write_size_bytes,omitempty" yaml:"write_size_bytes,omitempty" toml:"write_size_bytes,omitempty"` - } `json:"storage_stats,omitempty" yaml:"storage_stats,omitempty" toml:"storage_stats,omitempty"` -} - -// NetworkStats is a stats entry for network stats -type NetworkStats struct { - RxDropped uint64 `json:"rx_dropped,omitempty" yaml:"rx_dropped,omitempty" toml:"rx_dropped,omitempty"` - RxBytes uint64 `json:"rx_bytes,omitempty" yaml:"rx_bytes,omitempty" toml:"rx_bytes,omitempty"` - RxErrors uint64 `json:"rx_errors,omitempty" yaml:"rx_errors,omitempty" toml:"rx_errors,omitempty"` - TxPackets uint64 `json:"tx_packets,omitempty" yaml:"tx_packets,omitempty" toml:"tx_packets,omitempty"` - TxDropped uint64 `json:"tx_dropped,omitempty" yaml:"tx_dropped,omitempty" toml:"tx_dropped,omitempty"` - RxPackets uint64 `json:"rx_packets,omitempty" yaml:"rx_packets,omitempty" toml:"rx_packets,omitempty"` - TxErrors uint64 `json:"tx_errors,omitempty" yaml:"tx_errors,omitempty" toml:"tx_errors,omitempty"` - TxBytes uint64 `json:"tx_bytes,omitempty" yaml:"tx_bytes,omitempty" toml:"tx_bytes,omitempty"` -} - -// CPUStats is a stats entry for cpu stats -type CPUStats struct { - CPUUsage struct { - PercpuUsage []uint64 `json:"percpu_usage,omitempty" yaml:"percpu_usage,omitempty" toml:"percpu_usage,omitempty"` - UsageInUsermode uint64 `json:"usage_in_usermode,omitempty" yaml:"usage_in_usermode,omitempty" toml:"usage_in_usermode,omitempty"` - TotalUsage uint64 `json:"total_usage,omitempty" yaml:"total_usage,omitempty" toml:"total_usage,omitempty"` - UsageInKernelmode uint64 `json:"usage_in_kernelmode,omitempty" yaml:"usage_in_kernelmode,omitempty" toml:"usage_in_kernelmode,omitempty"` - } `json:"cpu_usage,omitempty" yaml:"cpu_usage,omitempty" toml:"cpu_usage,omitempty"` - SystemCPUUsage uint64 `json:"system_cpu_usage,omitempty" yaml:"system_cpu_usage,omitempty" toml:"system_cpu_usage,omitempty"` - ThrottlingData struct { - Periods uint64 `json:"periods,omitempty"` - ThrottledPeriods uint64 `json:"throttled_periods,omitempty"` - ThrottledTime uint64 `json:"throttled_time,omitempty"` - } `json:"throttling_data,omitempty" yaml:"throttling_data,omitempty" toml:"throttling_data,omitempty"` -} - -// BlkioStatsEntry is a stats entry for blkio_stats -type BlkioStatsEntry struct { - Major uint64 `json:"major,omitempty" yaml:"major,omitempty" toml:"major,omitempty"` - Minor uint64 `json:"minor,omitempty" yaml:"minor,omitempty" toml:"minor,omitempty"` - Op string `json:"op,omitempty" yaml:"op,omitempty" toml:"op,omitempty"` - Value uint64 `json:"value,omitempty" yaml:"value,omitempty" toml:"value,omitempty"` -} - -// StatsOptions specify parameters to the Stats function. -// -// See https://goo.gl/Dk3Xio for more details. -type StatsOptions struct { - ID string - Stats chan<- *Stats - Stream bool - // A flag that enables stopping the stats operation - Done <-chan bool - // Initial connection timeout - Timeout time.Duration - // Timeout with no data is received, it's reset every time new data - // arrives - InactivityTimeout time.Duration `qs:"-"` - Context context.Context -} - -// Stats sends container statistics for the given container to the given channel. -// -// This function is blocking, similar to a streaming call for logs, and should be run -// on a separate goroutine from the caller. Note that this function will block until -// the given container is removed, not just exited. When finished, this function -// will close the given channel. Alternatively, function can be stopped by -// signaling on the Done channel. -// -// See https://goo.gl/Dk3Xio for more details. -func (c *Client) Stats(opts StatsOptions) (retErr error) { - errC := make(chan error, 1) - readCloser, writeCloser := io.Pipe() - - defer func() { - close(opts.Stats) - - select { - case err := <-errC: - if err != nil && retErr == nil { - retErr = err - } - default: - // No errors - } - - if err := readCloser.Close(); err != nil && retErr == nil { - retErr = err - } - }() - - reqSent := make(chan struct{}) - go func() { - err := c.stream("GET", fmt.Sprintf("/containers/%s/stats?stream=%v", opts.ID, opts.Stream), streamOptions{ - rawJSONStream: true, - useJSONDecoder: true, - stdout: writeCloser, - timeout: opts.Timeout, - inactivityTimeout: opts.InactivityTimeout, - context: opts.Context, - reqSent: reqSent, - }) - if err != nil { - dockerError, ok := err.(*Error) - if ok { - if dockerError.Status == http.StatusNotFound { - err = &NoSuchContainer{ID: opts.ID} - } - } - } - if closeErr := writeCloser.Close(); closeErr != nil && err == nil { - err = closeErr - } - errC <- err - close(errC) - }() - - quit := make(chan struct{}) - defer close(quit) - go func() { - // block here waiting for the signal to stop function - select { - case <-opts.Done: - readCloser.Close() - case <-quit: - return - } - }() - - decoder := json.NewDecoder(readCloser) - stats := new(Stats) - <-reqSent - for err := decoder.Decode(stats); err != io.EOF; err = decoder.Decode(stats) { - if err != nil { - return err - } - opts.Stats <- stats - stats = new(Stats) - } - return nil -} - -// KillContainerOptions represents the set of options that can be used in a -// call to KillContainer. -// -// See https://goo.gl/JnTxXZ for more details. -type KillContainerOptions struct { - // The ID of the container. - ID string `qs:"-"` - - // The signal to send to the container. When omitted, Docker server - // will assume SIGKILL. - Signal Signal - Context context.Context -} - -// KillContainer sends a signal to a container, returning an error in case of -// failure. -// -// See https://goo.gl/JnTxXZ for more details. -func (c *Client) KillContainer(opts KillContainerOptions) error { - path := "/containers/" + opts.ID + "/kill" + "?" + queryString(opts) - resp, err := c.do("POST", path, doOptions{context: opts.Context}) - if err != nil { - if e, ok := err.(*Error); ok && e.Status == http.StatusNotFound { - return &NoSuchContainer{ID: opts.ID} - } - return err - } - resp.Body.Close() - return nil -} - -// RemoveContainerOptions encapsulates options to remove a container. -// -// See https://goo.gl/hL5IPC for more details. -type RemoveContainerOptions struct { - // The ID of the container. - ID string `qs:"-"` - - // A flag that indicates whether Docker should remove the volumes - // associated to the container. - RemoveVolumes bool `qs:"v"` - - // A flag that indicates whether Docker should remove the container - // even if it is currently running. - Force bool - Context context.Context -} - -// RemoveContainer removes a container, returning an error in case of failure. -// -// See https://goo.gl/hL5IPC for more details. -func (c *Client) RemoveContainer(opts RemoveContainerOptions) error { - path := "/containers/" + opts.ID + "?" + queryString(opts) - resp, err := c.do("DELETE", path, doOptions{context: opts.Context}) - if err != nil { - if e, ok := err.(*Error); ok && e.Status == http.StatusNotFound { - return &NoSuchContainer{ID: opts.ID} - } - return err - } - resp.Body.Close() - return nil -} - -// UploadToContainerOptions is the set of options that can be used when -// uploading an archive into a container. -// -// See https://goo.gl/g25o7u for more details. -type UploadToContainerOptions struct { - InputStream io.Reader `json:"-" qs:"-"` - Path string `qs:"path"` - NoOverwriteDirNonDir bool `qs:"noOverwriteDirNonDir"` - Context context.Context -} - -// UploadToContainer uploads a tar archive to be extracted to a path in the -// filesystem of the container. -// -// See https://goo.gl/g25o7u for more details. -func (c *Client) UploadToContainer(id string, opts UploadToContainerOptions) error { - url := fmt.Sprintf("/containers/%s/archive?", id) + queryString(opts) - - return c.stream("PUT", url, streamOptions{ - in: opts.InputStream, - context: opts.Context, - }) -} - -// DownloadFromContainerOptions is the set of options that can be used when -// downloading resources from a container. -// -// See https://goo.gl/W49jxK for more details. -type DownloadFromContainerOptions struct { - OutputStream io.Writer `json:"-" qs:"-"` - Path string `qs:"path"` - InactivityTimeout time.Duration `qs:"-"` - Context context.Context -} - -// DownloadFromContainer downloads a tar archive of files or folders in a container. -// -// See https://goo.gl/W49jxK for more details. -func (c *Client) DownloadFromContainer(id string, opts DownloadFromContainerOptions) error { - url := fmt.Sprintf("/containers/%s/archive?", id) + queryString(opts) - - return c.stream("GET", url, streamOptions{ - setRawTerminal: true, - stdout: opts.OutputStream, - inactivityTimeout: opts.InactivityTimeout, - context: opts.Context, - }) -} - -// CopyFromContainerOptions has been DEPRECATED, please use DownloadFromContainerOptions along with DownloadFromContainer. -// -// See https://goo.gl/nWk2YQ for more details. -type CopyFromContainerOptions struct { - OutputStream io.Writer `json:"-"` - Container string `json:"-"` - Resource string - Context context.Context `json:"-"` -} - -// CopyFromContainer has been DEPRECATED, please use DownloadFromContainerOptions along with DownloadFromContainer. -// -// See https://goo.gl/nWk2YQ for more details. -func (c *Client) CopyFromContainer(opts CopyFromContainerOptions) error { - if opts.Container == "" { - return &NoSuchContainer{ID: opts.Container} - } - if c.serverAPIVersion == nil { - c.checkAPIVersion() - } - if c.serverAPIVersion != nil && c.serverAPIVersion.GreaterThanOrEqualTo(apiVersion124) { - return errors.New("go-dockerclient: CopyFromContainer is no longer available in Docker >= 1.12, use DownloadFromContainer instead") - } - url := fmt.Sprintf("/containers/%s/copy", opts.Container) - resp, err := c.do("POST", url, doOptions{ - data: opts, - context: opts.Context, - }) - if err != nil { - if e, ok := err.(*Error); ok && e.Status == http.StatusNotFound { - return &NoSuchContainer{ID: opts.Container} - } - return err - } - defer resp.Body.Close() - _, err = io.Copy(opts.OutputStream, resp.Body) - return err -} - -// WaitContainer blocks until the given container stops, return the exit code -// of the container status. -// -// See https://goo.gl/4AGweZ for more details. -func (c *Client) WaitContainer(id string) (int, error) { - return c.waitContainer(id, doOptions{}) -} - -// WaitContainerWithContext blocks until the given container stops, return the exit code -// of the container status. The context object can be used to cancel the -// inspect request. -// -// See https://goo.gl/4AGweZ for more details. -func (c *Client) WaitContainerWithContext(id string, ctx context.Context) (int, error) { - return c.waitContainer(id, doOptions{context: ctx}) -} - -func (c *Client) waitContainer(id string, opts doOptions) (int, error) { - resp, err := c.do("POST", "/containers/"+id+"/wait", opts) - if err != nil { - if e, ok := err.(*Error); ok && e.Status == http.StatusNotFound { - return 0, &NoSuchContainer{ID: id} - } - return 0, err - } - defer resp.Body.Close() - var r struct{ StatusCode int } - if err := json.NewDecoder(resp.Body).Decode(&r); err != nil { - return 0, err - } - return r.StatusCode, nil -} - -// CommitContainerOptions aggregates parameters to the CommitContainer method. -// -// See https://goo.gl/CzIguf for more details. -type CommitContainerOptions struct { - Container string - Repository string `qs:"repo"` - Tag string - Message string `qs:"comment"` - Author string - Changes []string `qs:"changes"` - Run *Config `qs:"-"` - Context context.Context -} - -// CommitContainer creates a new image from a container's changes. -// -// See https://goo.gl/CzIguf for more details. -func (c *Client) CommitContainer(opts CommitContainerOptions) (*Image, error) { - path := "/commit?" + queryString(opts) - resp, err := c.do("POST", path, doOptions{ - data: opts.Run, - context: opts.Context, - }) - if err != nil { - if e, ok := err.(*Error); ok && e.Status == http.StatusNotFound { - return nil, &NoSuchContainer{ID: opts.Container} - } - return nil, err - } - defer resp.Body.Close() - var image Image - if err := json.NewDecoder(resp.Body).Decode(&image); err != nil { - return nil, err - } - return &image, nil -} - -// AttachToContainerOptions is the set of options that can be used when -// attaching to a container. -// -// See https://goo.gl/JF10Zk for more details. -type AttachToContainerOptions struct { - Container string `qs:"-"` - InputStream io.Reader `qs:"-"` - OutputStream io.Writer `qs:"-"` - ErrorStream io.Writer `qs:"-"` - - // If set, after a successful connect, a sentinel will be sent and then the - // client will block on receive before continuing. - // - // It must be an unbuffered channel. Using a buffered channel can lead - // to unexpected behavior. - Success chan struct{} - - // Use raw terminal? Usually true when the container contains a TTY. - RawTerminal bool `qs:"-"` - - // Get container logs, sending it to OutputStream. - Logs bool - - // Stream the response? - Stream bool - - // Attach to stdin, and use InputStream. - Stdin bool - - // Attach to stdout, and use OutputStream. - Stdout bool - - // Attach to stderr, and use ErrorStream. - Stderr bool -} - -// AttachToContainer attaches to a container, using the given options. -// -// See https://goo.gl/JF10Zk for more details. -func (c *Client) AttachToContainer(opts AttachToContainerOptions) error { - cw, err := c.AttachToContainerNonBlocking(opts) - if err != nil { - return err - } - return cw.Wait() -} - -// AttachToContainerNonBlocking attaches to a container, using the given options. -// This function does not block. -// -// See https://goo.gl/NKpkFk for more details. -func (c *Client) AttachToContainerNonBlocking(opts AttachToContainerOptions) (CloseWaiter, error) { - if opts.Container == "" { - return nil, &NoSuchContainer{ID: opts.Container} - } - path := "/containers/" + opts.Container + "/attach?" + queryString(opts) - return c.hijack("POST", path, hijackOptions{ - success: opts.Success, - setRawTerminal: opts.RawTerminal, - in: opts.InputStream, - stdout: opts.OutputStream, - stderr: opts.ErrorStream, - }) -} - -// LogsOptions represents the set of options used when getting logs from a -// container. -// -// See https://goo.gl/krK0ZH for more details. -type LogsOptions struct { - Context context.Context - Container string `qs:"-"` - OutputStream io.Writer `qs:"-"` - ErrorStream io.Writer `qs:"-"` - InactivityTimeout time.Duration `qs:"-"` - Tail string - - Since int64 - Follow bool - Stdout bool - Stderr bool - Timestamps bool - - // Use raw terminal? Usually true when the container contains a TTY. - RawTerminal bool `qs:"-"` -} - -// Logs gets stdout and stderr logs from the specified container. -// -// When LogsOptions.RawTerminal is set to false, go-dockerclient will multiplex -// the streams and send the containers stdout to LogsOptions.OutputStream, and -// stderr to LogsOptions.ErrorStream. -// -// When LogsOptions.RawTerminal is true, callers will get the raw stream on -// LogOptions.OutputStream. The caller can use libraries such as dlog -// (github.com/ahmetalpbalkan/dlog). -// -// See https://goo.gl/krK0ZH for more details. -func (c *Client) Logs(opts LogsOptions) error { - if opts.Container == "" { - return &NoSuchContainer{ID: opts.Container} - } - if opts.Tail == "" { - opts.Tail = "all" - } - path := "/containers/" + opts.Container + "/logs?" + queryString(opts) - return c.stream("GET", path, streamOptions{ - setRawTerminal: opts.RawTerminal, - stdout: opts.OutputStream, - stderr: opts.ErrorStream, - inactivityTimeout: opts.InactivityTimeout, - context: opts.Context, - }) -} - -// ResizeContainerTTY resizes the terminal to the given height and width. -// -// See https://goo.gl/FImjeq for more details. -func (c *Client) ResizeContainerTTY(id string, height, width int) error { - params := make(url.Values) - params.Set("h", strconv.Itoa(height)) - params.Set("w", strconv.Itoa(width)) - resp, err := c.do("POST", "/containers/"+id+"/resize?"+params.Encode(), doOptions{}) - if err != nil { - return err - } - resp.Body.Close() - return nil -} - -// ExportContainerOptions is the set of parameters to the ExportContainer -// method. -// -// See https://goo.gl/yGJCIh for more details. -type ExportContainerOptions struct { - ID string - OutputStream io.Writer - InactivityTimeout time.Duration `qs:"-"` - Context context.Context -} - -// ExportContainer export the contents of container id as tar archive -// and prints the exported contents to stdout. -// -// See https://goo.gl/yGJCIh for more details. -func (c *Client) ExportContainer(opts ExportContainerOptions) error { - if opts.ID == "" { - return &NoSuchContainer{ID: opts.ID} - } - url := fmt.Sprintf("/containers/%s/export", opts.ID) - return c.stream("GET", url, streamOptions{ - setRawTerminal: true, - stdout: opts.OutputStream, - inactivityTimeout: opts.InactivityTimeout, - context: opts.Context, - }) -} - -// PruneContainersOptions specify parameters to the PruneContainers function. -// -// See https://goo.gl/wnkgDT for more details. -type PruneContainersOptions struct { - Filters map[string][]string - Context context.Context -} - -// PruneContainersResults specify results from the PruneContainers function. -// -// See https://goo.gl/wnkgDT for more details. -type PruneContainersResults struct { - ContainersDeleted []string - SpaceReclaimed int64 -} - -// PruneContainers deletes containers which are stopped. -// -// See https://goo.gl/wnkgDT for more details. -func (c *Client) PruneContainers(opts PruneContainersOptions) (*PruneContainersResults, error) { - path := "/containers/prune?" + queryString(opts) - resp, err := c.do("POST", path, doOptions{context: opts.Context}) - if err != nil { - return nil, err - } - defer resp.Body.Close() - var results PruneContainersResults - if err := json.NewDecoder(resp.Body).Decode(&results); err != nil { - return nil, err - } - return &results, nil -} - // NoSuchContainer is the error returned when a given container does not exist. type NoSuchContainer struct { ID string diff --git a/vendor/github.com/fsouza/go-dockerclient/container_archive.go b/vendor/github.com/fsouza/go-dockerclient/container_archive.go new file mode 100644 index 000000000000..6c7e61c793b8 --- /dev/null +++ b/vendor/github.com/fsouza/go-dockerclient/container_archive.go @@ -0,0 +1,58 @@ +package docker + +import ( + "context" + "fmt" + "io" + "net/http" + "time" +) + +// UploadToContainerOptions is the set of options that can be used when +// uploading an archive into a container. +// +// See https://goo.gl/g25o7u for more details. +type UploadToContainerOptions struct { + InputStream io.Reader `json:"-" qs:"-"` + Path string `qs:"path"` + NoOverwriteDirNonDir bool `qs:"noOverwriteDirNonDir"` + Context context.Context +} + +// UploadToContainer uploads a tar archive to be extracted to a path in the +// filesystem of the container. +// +// See https://goo.gl/g25o7u for more details. +func (c *Client) UploadToContainer(id string, opts UploadToContainerOptions) error { + url := fmt.Sprintf("/containers/%s/archive?", id) + queryString(opts) + + return c.stream(http.MethodPut, url, streamOptions{ + in: opts.InputStream, + context: opts.Context, + }) +} + +// DownloadFromContainerOptions is the set of options that can be used when +// downloading resources from a container. +// +// See https://goo.gl/W49jxK for more details. +type DownloadFromContainerOptions struct { + OutputStream io.Writer `json:"-" qs:"-"` + Path string `qs:"path"` + InactivityTimeout time.Duration `qs:"-"` + Context context.Context +} + +// DownloadFromContainer downloads a tar archive of files or folders in a container. +// +// See https://goo.gl/W49jxK for more details. +func (c *Client) DownloadFromContainer(id string, opts DownloadFromContainerOptions) error { + url := fmt.Sprintf("/containers/%s/archive?", id) + queryString(opts) + + return c.stream(http.MethodGet, url, streamOptions{ + setRawTerminal: true, + stdout: opts.OutputStream, + inactivityTimeout: opts.InactivityTimeout, + context: opts.Context, + }) +} diff --git a/vendor/github.com/fsouza/go-dockerclient/container_attach.go b/vendor/github.com/fsouza/go-dockerclient/container_attach.go new file mode 100644 index 000000000000..e6742d007edd --- /dev/null +++ b/vendor/github.com/fsouza/go-dockerclient/container_attach.go @@ -0,0 +1,74 @@ +package docker + +import ( + "io" + "net/http" +) + +// AttachToContainerOptions is the set of options that can be used when +// attaching to a container. +// +// See https://goo.gl/JF10Zk for more details. +type AttachToContainerOptions struct { + Container string `qs:"-"` + InputStream io.Reader `qs:"-"` + OutputStream io.Writer `qs:"-"` + ErrorStream io.Writer `qs:"-"` + + // If set, after a successful connect, a sentinel will be sent and then the + // client will block on receive before continuing. + // + // It must be an unbuffered channel. Using a buffered channel can lead + // to unexpected behavior. + Success chan struct{} + + // Override the key sequence for detaching a container. + DetachKeys string + + // Use raw terminal? Usually true when the container contains a TTY. + RawTerminal bool `qs:"-"` + + // Get container logs, sending it to OutputStream. + Logs bool + + // Stream the response? + Stream bool + + // Attach to stdin, and use InputStream. + Stdin bool + + // Attach to stdout, and use OutputStream. + Stdout bool + + // Attach to stderr, and use ErrorStream. + Stderr bool +} + +// AttachToContainer attaches to a container, using the given options. +// +// See https://goo.gl/JF10Zk for more details. +func (c *Client) AttachToContainer(opts AttachToContainerOptions) error { + cw, err := c.AttachToContainerNonBlocking(opts) + if err != nil { + return err + } + return cw.Wait() +} + +// AttachToContainerNonBlocking attaches to a container, using the given options. +// This function does not block. +// +// See https://goo.gl/NKpkFk for more details. +func (c *Client) AttachToContainerNonBlocking(opts AttachToContainerOptions) (CloseWaiter, error) { + if opts.Container == "" { + return nil, &NoSuchContainer{ID: opts.Container} + } + path := "/containers/" + opts.Container + "/attach?" + queryString(opts) + return c.hijack(http.MethodPost, path, hijackOptions{ + success: opts.Success, + setRawTerminal: opts.RawTerminal, + in: opts.InputStream, + stdout: opts.OutputStream, + stderr: opts.ErrorStream, + }) +} diff --git a/vendor/github.com/fsouza/go-dockerclient/container_changes.go b/vendor/github.com/fsouza/go-dockerclient/container_changes.go new file mode 100644 index 000000000000..48835e231529 --- /dev/null +++ b/vendor/github.com/fsouza/go-dockerclient/container_changes.go @@ -0,0 +1,28 @@ +package docker + +import ( + "encoding/json" + "errors" + "net/http" +) + +// ContainerChanges returns changes in the filesystem of the given container. +// +// See https://goo.gl/15KKzh for more details. +func (c *Client) ContainerChanges(id string) ([]Change, error) { + path := "/containers/" + id + "/changes" + resp, err := c.do(http.MethodGet, path, doOptions{}) + if err != nil { + var e *Error + if errors.As(err, &e) && e.Status == http.StatusNotFound { + return nil, &NoSuchContainer{ID: id} + } + return nil, err + } + defer resp.Body.Close() + var changes []Change + if err := json.NewDecoder(resp.Body).Decode(&changes); err != nil { + return nil, err + } + return changes, nil +} diff --git a/vendor/github.com/fsouza/go-dockerclient/container_commit.go b/vendor/github.com/fsouza/go-dockerclient/container_commit.go new file mode 100644 index 000000000000..902ba6455387 --- /dev/null +++ b/vendor/github.com/fsouza/go-dockerclient/container_commit.go @@ -0,0 +1,46 @@ +package docker + +import ( + "context" + "encoding/json" + "errors" + "net/http" +) + +// CommitContainerOptions aggregates parameters to the CommitContainer method. +// +// See https://goo.gl/CzIguf for more details. +type CommitContainerOptions struct { + Container string + Repository string `qs:"repo"` + Tag string + Message string `qs:"comment"` + Author string + Changes []string `qs:"changes"` + Run *Config `qs:"-"` + Context context.Context +} + +// CommitContainer creates a new image from a container's changes. +// +// See https://goo.gl/CzIguf for more details. +func (c *Client) CommitContainer(opts CommitContainerOptions) (*Image, error) { + path := "/commit?" + queryString(opts) + resp, err := c.do(http.MethodPost, path, doOptions{ + data: opts.Run, + context: opts.Context, + }) + if err != nil { + var e *Error + if errors.As(err, &e) && e.Status == http.StatusNotFound { + return nil, &NoSuchContainer{ID: opts.Container} + } + return nil, err + } + defer resp.Body.Close() + var image Image + if err := json.NewDecoder(resp.Body).Decode(&image); err != nil { + return nil, err + } + return &image, nil +} diff --git a/vendor/github.com/fsouza/go-dockerclient/container_copy.go b/vendor/github.com/fsouza/go-dockerclient/container_copy.go new file mode 100644 index 000000000000..c8ffb85c3050 --- /dev/null +++ b/vendor/github.com/fsouza/go-dockerclient/container_copy.go @@ -0,0 +1,50 @@ +package docker + +import ( + "context" + "errors" + "fmt" + "io" + "net/http" +) + +// CopyFromContainerOptions contains the set of options used for copying +// files from a container. +// +// Deprecated: Use DownloadFromContainerOptions and DownloadFromContainer instead. +type CopyFromContainerOptions struct { + OutputStream io.Writer `json:"-"` + Container string `json:"-"` + Resource string + Context context.Context `json:"-"` +} + +// CopyFromContainer copies files from a container. +// +// Deprecated: Use DownloadFromContainer and DownloadFromContainer instead. +func (c *Client) CopyFromContainer(opts CopyFromContainerOptions) error { + if opts.Container == "" { + return &NoSuchContainer{ID: opts.Container} + } + if c.serverAPIVersion == nil { + c.checkAPIVersion() + } + if c.serverAPIVersion != nil && c.serverAPIVersion.GreaterThanOrEqualTo(apiVersion124) { + return errors.New("go-dockerclient: CopyFromContainer is no longer available in Docker >= 1.12, use DownloadFromContainer instead") + } + url := fmt.Sprintf("/containers/%s/copy", opts.Container) + resp, err := c.do(http.MethodPost, url, doOptions{ + data: opts, + context: opts.Context, + }) + if err != nil { + var e *Error + if errors.As(err, &e) && e.Status == http.StatusNotFound { + return &NoSuchContainer{ID: opts.Container} + } + return err + } + defer resp.Body.Close() + _, err = io.Copy(opts.OutputStream, resp.Body) + return err +} diff --git a/vendor/github.com/fsouza/go-dockerclient/container_create.go b/vendor/github.com/fsouza/go-dockerclient/container_create.go new file mode 100644 index 000000000000..5a5ffe0f0327 --- /dev/null +++ b/vendor/github.com/fsouza/go-dockerclient/container_create.go @@ -0,0 +1,79 @@ +package docker + +import ( + "context" + "encoding/json" + "errors" + "net/http" + "strings" +) + +// ErrContainerAlreadyExists is the error returned by CreateContainer when the +// container already exists. +var ErrContainerAlreadyExists = errors.New("container already exists") + +// CreateContainerOptions specify parameters to the CreateContainer function. +// +// See https://goo.gl/tyzwVM for more details. +type CreateContainerOptions struct { + Name string + Config *Config `qs:"-"` + HostConfig *HostConfig `qs:"-"` + NetworkingConfig *NetworkingConfig `qs:"-"` + Context context.Context +} + +// CreateContainer creates a new container, returning the container instance, +// or an error in case of failure. +// +// The returned container instance contains only the container ID. To get more +// details about the container after creating it, use InspectContainer. +// +// See https://goo.gl/tyzwVM for more details. +func (c *Client) CreateContainer(opts CreateContainerOptions) (*Container, error) { + path := "/containers/create?" + queryString(opts) + resp, err := c.do( + http.MethodPost, + path, + doOptions{ + data: struct { + *Config + HostConfig *HostConfig `json:"HostConfig,omitempty" yaml:"HostConfig,omitempty" toml:"HostConfig,omitempty"` + NetworkingConfig *NetworkingConfig `json:"NetworkingConfig,omitempty" yaml:"NetworkingConfig,omitempty" toml:"NetworkingConfig,omitempty"` + }{ + opts.Config, + opts.HostConfig, + opts.NetworkingConfig, + }, + context: opts.Context, + }, + ) + + var e *Error + if errors.As(err, &e) { + if e.Status == http.StatusNotFound && strings.Contains(e.Message, "No such image") { + return nil, ErrNoSuchImage + } + if e.Status == http.StatusConflict { + return nil, ErrContainerAlreadyExists + } + // Workaround for 17.09 bug returning 400 instead of 409. + // See https://github.com/moby/moby/issues/35021 + if e.Status == http.StatusBadRequest && strings.Contains(e.Message, "Conflict.") { + return nil, ErrContainerAlreadyExists + } + } + + if err != nil { + return nil, err + } + defer resp.Body.Close() + var container Container + if err := json.NewDecoder(resp.Body).Decode(&container); err != nil { + return nil, err + } + + container.Name = opts.Name + + return &container, nil +} diff --git a/vendor/github.com/fsouza/go-dockerclient/container_export.go b/vendor/github.com/fsouza/go-dockerclient/container_export.go new file mode 100644 index 000000000000..312f8cf1053a --- /dev/null +++ b/vendor/github.com/fsouza/go-dockerclient/container_export.go @@ -0,0 +1,37 @@ +package docker + +import ( + "context" + "fmt" + "io" + "net/http" + "time" +) + +// ExportContainerOptions is the set of parameters to the ExportContainer +// method. +// +// See https://goo.gl/yGJCIh for more details. +type ExportContainerOptions struct { + ID string + OutputStream io.Writer + InactivityTimeout time.Duration `qs:"-"` + Context context.Context +} + +// ExportContainer export the contents of container id as tar archive +// and prints the exported contents to stdout. +// +// See https://goo.gl/yGJCIh for more details. +func (c *Client) ExportContainer(opts ExportContainerOptions) error { + if opts.ID == "" { + return &NoSuchContainer{ID: opts.ID} + } + url := fmt.Sprintf("/containers/%s/export", opts.ID) + return c.stream(http.MethodGet, url, streamOptions{ + setRawTerminal: true, + stdout: opts.OutputStream, + inactivityTimeout: opts.InactivityTimeout, + context: opts.Context, + }) +} diff --git a/vendor/github.com/fsouza/go-dockerclient/container_inspect.go b/vendor/github.com/fsouza/go-dockerclient/container_inspect.go new file mode 100644 index 000000000000..48c1e8ea7b96 --- /dev/null +++ b/vendor/github.com/fsouza/go-dockerclient/container_inspect.go @@ -0,0 +1,55 @@ +package docker + +import ( + "context" + "encoding/json" + "errors" + "net/http" +) + +// InspectContainer returns information about a container by its ID. +// +// Deprecated: Use InspectContainerWithOptions instead. +func (c *Client) InspectContainer(id string) (*Container, error) { + return c.InspectContainerWithOptions(InspectContainerOptions{ID: id}) +} + +// InspectContainerWithContext returns information about a container by its ID. +// The context object can be used to cancel the inspect request. +// +// Deprecated: Use InspectContainerWithOptions instead. +func (c *Client) InspectContainerWithContext(id string, ctx context.Context) (*Container, error) { + return c.InspectContainerWithOptions(InspectContainerOptions{ID: id, Context: ctx}) +} + +// InspectContainerWithOptions returns information about a container by its ID. +// +// See https://goo.gl/FaI5JT for more details. +func (c *Client) InspectContainerWithOptions(opts InspectContainerOptions) (*Container, error) { + path := "/containers/" + opts.ID + "/json?" + queryString(opts) + resp, err := c.do(http.MethodGet, path, doOptions{ + context: opts.Context, + }) + if err != nil { + var e *Error + if errors.As(err, &e) && e.Status == http.StatusNotFound { + return nil, &NoSuchContainer{ID: opts.ID} + } + return nil, err + } + defer resp.Body.Close() + var container Container + if err := json.NewDecoder(resp.Body).Decode(&container); err != nil { + return nil, err + } + return &container, nil +} + +// InspectContainerOptions specifies parameters for InspectContainerWithOptions. +// +// See https://goo.gl/FaI5JT for more details. +type InspectContainerOptions struct { + Context context.Context + ID string `qs:"-"` + Size bool +} diff --git a/vendor/github.com/fsouza/go-dockerclient/container_kill.go b/vendor/github.com/fsouza/go-dockerclient/container_kill.go new file mode 100644 index 000000000000..600c58f1292c --- /dev/null +++ b/vendor/github.com/fsouza/go-dockerclient/container_kill.go @@ -0,0 +1,46 @@ +package docker + +import ( + "context" + "errors" + "net/http" +) + +// KillContainerOptions represents the set of options that can be used in a +// call to KillContainer. +// +// See https://goo.gl/JnTxXZ for more details. +type KillContainerOptions struct { + // The ID of the container. + ID string `qs:"-"` + + // The signal to send to the container. When omitted, Docker server + // will assume SIGKILL. + Signal Signal + Context context.Context +} + +// KillContainer sends a signal to a container, returning an error in case of +// failure. +// +// See https://goo.gl/JnTxXZ for more details. +func (c *Client) KillContainer(opts KillContainerOptions) error { + path := "/containers/" + opts.ID + "/kill" + "?" + queryString(opts) + resp, err := c.do(http.MethodPost, path, doOptions{context: opts.Context}) + if err != nil { + var e *Error + if !errors.As(err, &e) { + return err + } + switch e.Status { + case http.StatusNotFound: + return &NoSuchContainer{ID: opts.ID} + case http.StatusConflict: + return &ContainerNotRunning{ID: opts.ID} + default: + return err + } + } + resp.Body.Close() + return nil +} diff --git a/vendor/github.com/fsouza/go-dockerclient/container_list.go b/vendor/github.com/fsouza/go-dockerclient/container_list.go new file mode 100644 index 000000000000..1dec0e915a01 --- /dev/null +++ b/vendor/github.com/fsouza/go-dockerclient/container_list.go @@ -0,0 +1,37 @@ +package docker + +import ( + "context" + "encoding/json" + "net/http" +) + +// ListContainersOptions specify parameters to the ListContainers function. +// +// See https://goo.gl/kaOHGw for more details. +type ListContainersOptions struct { + All bool + Size bool + Limit int + Since string + Before string + Filters map[string][]string + Context context.Context +} + +// ListContainers returns a slice of containers matching the given criteria. +// +// See https://goo.gl/kaOHGw for more details. +func (c *Client) ListContainers(opts ListContainersOptions) ([]APIContainers, error) { + path := "/containers/json?" + queryString(opts) + resp, err := c.do(http.MethodGet, path, doOptions{context: opts.Context}) + if err != nil { + return nil, err + } + defer resp.Body.Close() + var containers []APIContainers + if err := json.NewDecoder(resp.Body).Decode(&containers); err != nil { + return nil, err + } + return containers, nil +} diff --git a/vendor/github.com/fsouza/go-dockerclient/container_logs.go b/vendor/github.com/fsouza/go-dockerclient/container_logs.go new file mode 100644 index 000000000000..0e3f1199cc55 --- /dev/null +++ b/vendor/github.com/fsouza/go-dockerclient/container_logs.go @@ -0,0 +1,58 @@ +package docker + +import ( + "context" + "io" + "net/http" + "time" +) + +// LogsOptions represents the set of options used when getting logs from a +// container. +// +// See https://goo.gl/krK0ZH for more details. +type LogsOptions struct { + Context context.Context + Container string `qs:"-"` + OutputStream io.Writer `qs:"-"` + ErrorStream io.Writer `qs:"-"` + InactivityTimeout time.Duration `qs:"-"` + Tail string + + Since int64 + Follow bool + Stdout bool + Stderr bool + Timestamps bool + + // Use raw terminal? Usually true when the container contains a TTY. + RawTerminal bool `qs:"-"` +} + +// Logs gets stdout and stderr logs from the specified container. +// +// When LogsOptions.RawTerminal is set to false, go-dockerclient will multiplex +// the streams and send the containers stdout to LogsOptions.OutputStream, and +// stderr to LogsOptions.ErrorStream. +// +// When LogsOptions.RawTerminal is true, callers will get the raw stream on +// LogsOptions.OutputStream. The caller can use libraries such as dlog +// (github.com/ahmetalpbalkan/dlog). +// +// See https://goo.gl/krK0ZH for more details. +func (c *Client) Logs(opts LogsOptions) error { + if opts.Container == "" { + return &NoSuchContainer{ID: opts.Container} + } + if opts.Tail == "" { + opts.Tail = "all" + } + path := "/containers/" + opts.Container + "/logs?" + queryString(opts) + return c.stream(http.MethodGet, path, streamOptions{ + setRawTerminal: opts.RawTerminal, + stdout: opts.OutputStream, + stderr: opts.ErrorStream, + inactivityTimeout: opts.InactivityTimeout, + context: opts.Context, + }) +} diff --git a/vendor/github.com/fsouza/go-dockerclient/container_pause.go b/vendor/github.com/fsouza/go-dockerclient/container_pause.go new file mode 100644 index 000000000000..7d18b32f9b4e --- /dev/null +++ b/vendor/github.com/fsouza/go-dockerclient/container_pause.go @@ -0,0 +1,24 @@ +package docker + +import ( + "errors" + "fmt" + "net/http" +) + +// PauseContainer pauses the given container. +// +// See https://goo.gl/D1Yaii for more details. +func (c *Client) PauseContainer(id string) error { + path := fmt.Sprintf("/containers/%s/pause", id) + resp, err := c.do(http.MethodPost, path, doOptions{}) + if err != nil { + var e *Error + if errors.As(err, &e) && e.Status == http.StatusNotFound { + return &NoSuchContainer{ID: id} + } + return err + } + resp.Body.Close() + return nil +} diff --git a/vendor/github.com/fsouza/go-dockerclient/container_prune.go b/vendor/github.com/fsouza/go-dockerclient/container_prune.go new file mode 100644 index 000000000000..3f2bdc6a29a6 --- /dev/null +++ b/vendor/github.com/fsouza/go-dockerclient/container_prune.go @@ -0,0 +1,40 @@ +package docker + +import ( + "context" + "encoding/json" + "net/http" +) + +// PruneContainersOptions specify parameters to the PruneContainers function. +// +// See https://goo.gl/wnkgDT for more details. +type PruneContainersOptions struct { + Filters map[string][]string + Context context.Context +} + +// PruneContainersResults specify results from the PruneContainers function. +// +// See https://goo.gl/wnkgDT for more details. +type PruneContainersResults struct { + ContainersDeleted []string + SpaceReclaimed int64 +} + +// PruneContainers deletes containers which are stopped. +// +// See https://goo.gl/wnkgDT for more details. +func (c *Client) PruneContainers(opts PruneContainersOptions) (*PruneContainersResults, error) { + path := "/containers/prune?" + queryString(opts) + resp, err := c.do(http.MethodPost, path, doOptions{context: opts.Context}) + if err != nil { + return nil, err + } + defer resp.Body.Close() + var results PruneContainersResults + if err := json.NewDecoder(resp.Body).Decode(&results); err != nil { + return nil, err + } + return &results, nil +} diff --git a/vendor/github.com/fsouza/go-dockerclient/container_remove.go b/vendor/github.com/fsouza/go-dockerclient/container_remove.go new file mode 100644 index 000000000000..dbe0907f0b56 --- /dev/null +++ b/vendor/github.com/fsouza/go-dockerclient/container_remove.go @@ -0,0 +1,41 @@ +package docker + +import ( + "context" + "errors" + "net/http" +) + +// RemoveContainerOptions encapsulates options to remove a container. +// +// See https://goo.gl/hL5IPC for more details. +type RemoveContainerOptions struct { + // The ID of the container. + ID string `qs:"-"` + + // A flag that indicates whether Docker should remove the volumes + // associated to the container. + RemoveVolumes bool `qs:"v"` + + // A flag that indicates whether Docker should remove the container + // even if it is currently running. + Force bool + Context context.Context +} + +// RemoveContainer removes a container, returning an error in case of failure. +// +// See https://goo.gl/hL5IPC for more details. +func (c *Client) RemoveContainer(opts RemoveContainerOptions) error { + path := "/containers/" + opts.ID + "?" + queryString(opts) + resp, err := c.do(http.MethodDelete, path, doOptions{context: opts.Context}) + if err != nil { + var e *Error + if errors.As(err, &e) && e.Status == http.StatusNotFound { + return &NoSuchContainer{ID: opts.ID} + } + return err + } + resp.Body.Close() + return nil +} diff --git a/vendor/github.com/fsouza/go-dockerclient/container_rename.go b/vendor/github.com/fsouza/go-dockerclient/container_rename.go new file mode 100644 index 000000000000..893c423bdf32 --- /dev/null +++ b/vendor/github.com/fsouza/go-dockerclient/container_rename.go @@ -0,0 +1,33 @@ +package docker + +import ( + "context" + "fmt" + "net/http" +) + +// RenameContainerOptions specify parameters to the RenameContainer function. +// +// See https://goo.gl/46inai for more details. +type RenameContainerOptions struct { + // ID of container to rename + ID string `qs:"-"` + + // New name + Name string `json:"name,omitempty" yaml:"name,omitempty"` + Context context.Context +} + +// RenameContainer updates and existing containers name +// +// See https://goo.gl/46inai for more details. +func (c *Client) RenameContainer(opts RenameContainerOptions) error { + resp, err := c.do(http.MethodPost, fmt.Sprintf("/containers/"+opts.ID+"/rename?%s", queryString(opts)), doOptions{ + context: opts.Context, + }) + if err != nil { + return err + } + resp.Body.Close() + return nil +} diff --git a/vendor/github.com/fsouza/go-dockerclient/container_resize.go b/vendor/github.com/fsouza/go-dockerclient/container_resize.go new file mode 100644 index 000000000000..3445be6b5770 --- /dev/null +++ b/vendor/github.com/fsouza/go-dockerclient/container_resize.go @@ -0,0 +1,22 @@ +package docker + +import ( + "net/http" + "net/url" + "strconv" +) + +// ResizeContainerTTY resizes the terminal to the given height and width. +// +// See https://goo.gl/FImjeq for more details. +func (c *Client) ResizeContainerTTY(id string, height, width int) error { + params := make(url.Values) + params.Set("h", strconv.Itoa(height)) + params.Set("w", strconv.Itoa(width)) + resp, err := c.do(http.MethodPost, "/containers/"+id+"/resize?"+params.Encode(), doOptions{}) + if err != nil { + return err + } + resp.Body.Close() + return nil +} diff --git a/vendor/github.com/fsouza/go-dockerclient/container_restart.go b/vendor/github.com/fsouza/go-dockerclient/container_restart.go new file mode 100644 index 000000000000..183cbac0ffb1 --- /dev/null +++ b/vendor/github.com/fsouza/go-dockerclient/container_restart.go @@ -0,0 +1,64 @@ +package docker + +import ( + "errors" + "fmt" + "net/http" +) + +// RestartPolicy represents the policy for automatically restarting a container. +// +// Possible values are: +// +// - always: the docker daemon will always restart the container +// - on-failure: the docker daemon will restart the container on failures, at +// most MaximumRetryCount times +// - unless-stopped: the docker daemon will always restart the container except +// when user has manually stopped the container +// - no: the docker daemon will not restart the container automatically +type RestartPolicy struct { + Name string `json:"Name,omitempty" yaml:"Name,omitempty" toml:"Name,omitempty"` + MaximumRetryCount int `json:"MaximumRetryCount,omitempty" yaml:"MaximumRetryCount,omitempty" toml:"MaximumRetryCount,omitempty"` +} + +// AlwaysRestart returns a restart policy that tells the Docker daemon to +// always restart the container. +func AlwaysRestart() RestartPolicy { + return RestartPolicy{Name: "always"} +} + +// RestartOnFailure returns a restart policy that tells the Docker daemon to +// restart the container on failures, trying at most maxRetry times. +func RestartOnFailure(maxRetry int) RestartPolicy { + return RestartPolicy{Name: "on-failure", MaximumRetryCount: maxRetry} +} + +// RestartUnlessStopped returns a restart policy that tells the Docker daemon to +// always restart the container except when user has manually stopped the container. +func RestartUnlessStopped() RestartPolicy { + return RestartPolicy{Name: "unless-stopped"} +} + +// NeverRestart returns a restart policy that tells the Docker daemon to never +// restart the container on failures. +func NeverRestart() RestartPolicy { + return RestartPolicy{Name: "no"} +} + +// RestartContainer stops a container, killing it after the given timeout (in +// seconds), during the stop process. +// +// See https://goo.gl/MrAKQ5 for more details. +func (c *Client) RestartContainer(id string, timeout uint) error { + path := fmt.Sprintf("/containers/%s/restart?t=%d", id, timeout) + resp, err := c.do(http.MethodPost, path, doOptions{}) + if err != nil { + var e *Error + if errors.As(err, &e) && e.Status == http.StatusNotFound { + return &NoSuchContainer{ID: id} + } + return err + } + resp.Body.Close() + return nil +} diff --git a/vendor/github.com/fsouza/go-dockerclient/container_start.go b/vendor/github.com/fsouza/go-dockerclient/container_start.go new file mode 100644 index 000000000000..0911eaab4153 --- /dev/null +++ b/vendor/github.com/fsouza/go-dockerclient/container_start.go @@ -0,0 +1,57 @@ +package docker + +import ( + "context" + "errors" + "net/http" +) + +// StartContainer starts a container, returning an error in case of failure. +// +// Passing the HostConfig to this method has been deprecated in Docker API 1.22 +// (Docker Engine 1.10.x) and totally removed in Docker API 1.24 (Docker Engine +// 1.12.x). The client will ignore the parameter when communicating with Docker +// API 1.24 or greater. +// +// See https://goo.gl/fbOSZy for more details. +func (c *Client) StartContainer(id string, hostConfig *HostConfig) error { + return c.startContainer(id, hostConfig, doOptions{}) +} + +// StartContainerWithContext starts a container, returning an error in case of +// failure. The context can be used to cancel the outstanding start container +// request. +// +// Passing the HostConfig to this method has been deprecated in Docker API 1.22 +// (Docker Engine 1.10.x) and totally removed in Docker API 1.24 (Docker Engine +// 1.12.x). The client will ignore the parameter when communicating with Docker +// API 1.24 or greater. +// +// See https://goo.gl/fbOSZy for more details. +func (c *Client) StartContainerWithContext(id string, hostConfig *HostConfig, ctx context.Context) error { + return c.startContainer(id, hostConfig, doOptions{context: ctx}) +} + +func (c *Client) startContainer(id string, hostConfig *HostConfig, opts doOptions) error { + path := "/containers/" + id + "/start" + if c.serverAPIVersion == nil { + c.checkAPIVersion() + } + if c.serverAPIVersion != nil && c.serverAPIVersion.LessThan(apiVersion124) { + opts.data = hostConfig + opts.forceJSON = true + } + resp, err := c.do(http.MethodPost, path, opts) + if err != nil { + var e *Error + if errors.As(err, &e) && e.Status == http.StatusNotFound { + return &NoSuchContainer{ID: id, Err: err} + } + return err + } + defer resp.Body.Close() + if resp.StatusCode == http.StatusNotModified { + return &ContainerAlreadyRunning{ID: id} + } + return nil +} diff --git a/vendor/github.com/fsouza/go-dockerclient/container_stats.go b/vendor/github.com/fsouza/go-dockerclient/container_stats.go new file mode 100644 index 000000000000..ee2499a520aa --- /dev/null +++ b/vendor/github.com/fsouza/go-dockerclient/container_stats.go @@ -0,0 +1,215 @@ +package docker + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "io" + "net/http" + "time" +) + +// Stats represents container statistics, returned by /containers//stats. +// +// See https://goo.gl/Dk3Xio for more details. +type Stats struct { + Read time.Time `json:"read,omitempty" yaml:"read,omitempty" toml:"read,omitempty"` + PreRead time.Time `json:"preread,omitempty" yaml:"preread,omitempty" toml:"preread,omitempty"` + NumProcs uint32 `json:"num_procs" yaml:"num_procs" toml:"num_procs"` + PidsStats struct { + Current uint64 `json:"current,omitempty" yaml:"current,omitempty"` + } `json:"pids_stats,omitempty" yaml:"pids_stats,omitempty" toml:"pids_stats,omitempty"` + Network NetworkStats `json:"network,omitempty" yaml:"network,omitempty" toml:"network,omitempty"` + Networks map[string]NetworkStats `json:"networks,omitempty" yaml:"networks,omitempty" toml:"networks,omitempty"` + MemoryStats struct { + Stats struct { + TotalPgmafault uint64 `json:"total_pgmafault,omitempty" yaml:"total_pgmafault,omitempty" toml:"total_pgmafault,omitempty"` + Cache uint64 `json:"cache,omitempty" yaml:"cache,omitempty" toml:"cache,omitempty"` + MappedFile uint64 `json:"mapped_file,omitempty" yaml:"mapped_file,omitempty" toml:"mapped_file,omitempty"` + TotalInactiveFile uint64 `json:"total_inactive_file,omitempty" yaml:"total_inactive_file,omitempty" toml:"total_inactive_file,omitempty"` + Pgpgout uint64 `json:"pgpgout,omitempty" yaml:"pgpgout,omitempty" toml:"pgpgout,omitempty"` + Rss uint64 `json:"rss,omitempty" yaml:"rss,omitempty" toml:"rss,omitempty"` + TotalMappedFile uint64 `json:"total_mapped_file,omitempty" yaml:"total_mapped_file,omitempty" toml:"total_mapped_file,omitempty"` + Writeback uint64 `json:"writeback,omitempty" yaml:"writeback,omitempty" toml:"writeback,omitempty"` + Unevictable uint64 `json:"unevictable,omitempty" yaml:"unevictable,omitempty" toml:"unevictable,omitempty"` + Pgpgin uint64 `json:"pgpgin,omitempty" yaml:"pgpgin,omitempty" toml:"pgpgin,omitempty"` + TotalUnevictable uint64 `json:"total_unevictable,omitempty" yaml:"total_unevictable,omitempty" toml:"total_unevictable,omitempty"` + Pgmajfault uint64 `json:"pgmajfault,omitempty" yaml:"pgmajfault,omitempty" toml:"pgmajfault,omitempty"` + TotalRss uint64 `json:"total_rss,omitempty" yaml:"total_rss,omitempty" toml:"total_rss,omitempty"` + TotalRssHuge uint64 `json:"total_rss_huge,omitempty" yaml:"total_rss_huge,omitempty" toml:"total_rss_huge,omitempty"` + TotalWriteback uint64 `json:"total_writeback,omitempty" yaml:"total_writeback,omitempty" toml:"total_writeback,omitempty"` + TotalInactiveAnon uint64 `json:"total_inactive_anon,omitempty" yaml:"total_inactive_anon,omitempty" toml:"total_inactive_anon,omitempty"` + RssHuge uint64 `json:"rss_huge,omitempty" yaml:"rss_huge,omitempty" toml:"rss_huge,omitempty"` + HierarchicalMemoryLimit uint64 `json:"hierarchical_memory_limit,omitempty" yaml:"hierarchical_memory_limit,omitempty" toml:"hierarchical_memory_limit,omitempty"` + TotalPgfault uint64 `json:"total_pgfault,omitempty" yaml:"total_pgfault,omitempty" toml:"total_pgfault,omitempty"` + TotalActiveFile uint64 `json:"total_active_file,omitempty" yaml:"total_active_file,omitempty" toml:"total_active_file,omitempty"` + ActiveAnon uint64 `json:"active_anon,omitempty" yaml:"active_anon,omitempty" toml:"active_anon,omitempty"` + TotalActiveAnon uint64 `json:"total_active_anon,omitempty" yaml:"total_active_anon,omitempty" toml:"total_active_anon,omitempty"` + TotalPgpgout uint64 `json:"total_pgpgout,omitempty" yaml:"total_pgpgout,omitempty" toml:"total_pgpgout,omitempty"` + TotalCache uint64 `json:"total_cache,omitempty" yaml:"total_cache,omitempty" toml:"total_cache,omitempty"` + InactiveAnon uint64 `json:"inactive_anon,omitempty" yaml:"inactive_anon,omitempty" toml:"inactive_anon,omitempty"` + ActiveFile uint64 `json:"active_file,omitempty" yaml:"active_file,omitempty" toml:"active_file,omitempty"` + Pgfault uint64 `json:"pgfault,omitempty" yaml:"pgfault,omitempty" toml:"pgfault,omitempty"` + InactiveFile uint64 `json:"inactive_file,omitempty" yaml:"inactive_file,omitempty" toml:"inactive_file,omitempty"` + TotalPgpgin uint64 `json:"total_pgpgin,omitempty" yaml:"total_pgpgin,omitempty" toml:"total_pgpgin,omitempty"` + HierarchicalMemswLimit uint64 `json:"hierarchical_memsw_limit,omitempty" yaml:"hierarchical_memsw_limit,omitempty" toml:"hierarchical_memsw_limit,omitempty"` + Swap uint64 `json:"swap,omitempty" yaml:"swap,omitempty" toml:"swap,omitempty"` + } `json:"stats,omitempty" yaml:"stats,omitempty" toml:"stats,omitempty"` + MaxUsage uint64 `json:"max_usage,omitempty" yaml:"max_usage,omitempty" toml:"max_usage,omitempty"` + Usage uint64 `json:"usage,omitempty" yaml:"usage,omitempty" toml:"usage,omitempty"` + Failcnt uint64 `json:"failcnt,omitempty" yaml:"failcnt,omitempty" toml:"failcnt,omitempty"` + Limit uint64 `json:"limit,omitempty" yaml:"limit,omitempty" toml:"limit,omitempty"` + Commit uint64 `json:"commitbytes,omitempty" yaml:"commitbytes,omitempty" toml:"privateworkingset,omitempty"` + CommitPeak uint64 `json:"commitpeakbytes,omitempty" yaml:"commitpeakbytes,omitempty" toml:"commitpeakbytes,omitempty"` + PrivateWorkingSet uint64 `json:"privateworkingset,omitempty" yaml:"privateworkingset,omitempty" toml:"privateworkingset,omitempty"` + } `json:"memory_stats,omitempty" yaml:"memory_stats,omitempty" toml:"memory_stats,omitempty"` + BlkioStats struct { + IOServiceBytesRecursive []BlkioStatsEntry `json:"io_service_bytes_recursive,omitempty" yaml:"io_service_bytes_recursive,omitempty" toml:"io_service_bytes_recursive,omitempty"` + IOServicedRecursive []BlkioStatsEntry `json:"io_serviced_recursive,omitempty" yaml:"io_serviced_recursive,omitempty" toml:"io_serviced_recursive,omitempty"` + IOQueueRecursive []BlkioStatsEntry `json:"io_queue_recursive,omitempty" yaml:"io_queue_recursive,omitempty" toml:"io_queue_recursive,omitempty"` + IOServiceTimeRecursive []BlkioStatsEntry `json:"io_service_time_recursive,omitempty" yaml:"io_service_time_recursive,omitempty" toml:"io_service_time_recursive,omitempty"` + IOWaitTimeRecursive []BlkioStatsEntry `json:"io_wait_time_recursive,omitempty" yaml:"io_wait_time_recursive,omitempty" toml:"io_wait_time_recursive,omitempty"` + IOMergedRecursive []BlkioStatsEntry `json:"io_merged_recursive,omitempty" yaml:"io_merged_recursive,omitempty" toml:"io_merged_recursive,omitempty"` + IOTimeRecursive []BlkioStatsEntry `json:"io_time_recursive,omitempty" yaml:"io_time_recursive,omitempty" toml:"io_time_recursive,omitempty"` + SectorsRecursive []BlkioStatsEntry `json:"sectors_recursive,omitempty" yaml:"sectors_recursive,omitempty" toml:"sectors_recursive,omitempty"` + } `json:"blkio_stats,omitempty" yaml:"blkio_stats,omitempty" toml:"blkio_stats,omitempty"` + CPUStats CPUStats `json:"cpu_stats,omitempty" yaml:"cpu_stats,omitempty" toml:"cpu_stats,omitempty"` + PreCPUStats CPUStats `json:"precpu_stats,omitempty"` + StorageStats struct { + ReadCountNormalized uint64 `json:"read_count_normalized,omitempty" yaml:"read_count_normalized,omitempty" toml:"read_count_normalized,omitempty"` + ReadSizeBytes uint64 `json:"read_size_bytes,omitempty" yaml:"read_size_bytes,omitempty" toml:"read_size_bytes,omitempty"` + WriteCountNormalized uint64 `json:"write_count_normalized,omitempty" yaml:"write_count_normalized,omitempty" toml:"write_count_normalized,omitempty"` + WriteSizeBytes uint64 `json:"write_size_bytes,omitempty" yaml:"write_size_bytes,omitempty" toml:"write_size_bytes,omitempty"` + } `json:"storage_stats,omitempty" yaml:"storage_stats,omitempty" toml:"storage_stats,omitempty"` +} + +// NetworkStats is a stats entry for network stats +type NetworkStats struct { + RxDropped uint64 `json:"rx_dropped,omitempty" yaml:"rx_dropped,omitempty" toml:"rx_dropped,omitempty"` + RxBytes uint64 `json:"rx_bytes,omitempty" yaml:"rx_bytes,omitempty" toml:"rx_bytes,omitempty"` + RxErrors uint64 `json:"rx_errors,omitempty" yaml:"rx_errors,omitempty" toml:"rx_errors,omitempty"` + TxPackets uint64 `json:"tx_packets,omitempty" yaml:"tx_packets,omitempty" toml:"tx_packets,omitempty"` + TxDropped uint64 `json:"tx_dropped,omitempty" yaml:"tx_dropped,omitempty" toml:"tx_dropped,omitempty"` + RxPackets uint64 `json:"rx_packets,omitempty" yaml:"rx_packets,omitempty" toml:"rx_packets,omitempty"` + TxErrors uint64 `json:"tx_errors,omitempty" yaml:"tx_errors,omitempty" toml:"tx_errors,omitempty"` + TxBytes uint64 `json:"tx_bytes,omitempty" yaml:"tx_bytes,omitempty" toml:"tx_bytes,omitempty"` +} + +// CPUStats is a stats entry for cpu stats +type CPUStats struct { + CPUUsage struct { + PercpuUsage []uint64 `json:"percpu_usage,omitempty" yaml:"percpu_usage,omitempty" toml:"percpu_usage,omitempty"` + UsageInUsermode uint64 `json:"usage_in_usermode,omitempty" yaml:"usage_in_usermode,omitempty" toml:"usage_in_usermode,omitempty"` + TotalUsage uint64 `json:"total_usage,omitempty" yaml:"total_usage,omitempty" toml:"total_usage,omitempty"` + UsageInKernelmode uint64 `json:"usage_in_kernelmode,omitempty" yaml:"usage_in_kernelmode,omitempty" toml:"usage_in_kernelmode,omitempty"` + } `json:"cpu_usage,omitempty" yaml:"cpu_usage,omitempty" toml:"cpu_usage,omitempty"` + SystemCPUUsage uint64 `json:"system_cpu_usage,omitempty" yaml:"system_cpu_usage,omitempty" toml:"system_cpu_usage,omitempty"` + OnlineCPUs uint64 `json:"online_cpus,omitempty" yaml:"online_cpus,omitempty" toml:"online_cpus,omitempty"` + ThrottlingData struct { + Periods uint64 `json:"periods,omitempty"` + ThrottledPeriods uint64 `json:"throttled_periods,omitempty"` + ThrottledTime uint64 `json:"throttled_time,omitempty"` + } `json:"throttling_data,omitempty" yaml:"throttling_data,omitempty" toml:"throttling_data,omitempty"` +} + +// BlkioStatsEntry is a stats entry for blkio_stats +type BlkioStatsEntry struct { + Major uint64 `json:"major,omitempty" yaml:"major,omitempty" toml:"major,omitempty"` + Minor uint64 `json:"minor,omitempty" yaml:"minor,omitempty" toml:"minor,omitempty"` + Op string `json:"op,omitempty" yaml:"op,omitempty" toml:"op,omitempty"` + Value uint64 `json:"value,omitempty" yaml:"value,omitempty" toml:"value,omitempty"` +} + +// StatsOptions specify parameters to the Stats function. +// +// See https://goo.gl/Dk3Xio for more details. +type StatsOptions struct { + ID string + Stats chan<- *Stats + Stream bool + // A flag that enables stopping the stats operation + Done <-chan bool + // Initial connection timeout + Timeout time.Duration + // Timeout with no data is received, it's reset every time new data + // arrives + InactivityTimeout time.Duration `qs:"-"` + Context context.Context +} + +// Stats sends container statistics for the given container to the given channel. +// +// This function is blocking, similar to a streaming call for logs, and should be run +// on a separate goroutine from the caller. Note that this function will block until +// the given container is removed, not just exited. When finished, this function +// will close the given channel. Alternatively, function can be stopped by +// signaling on the Done channel. +// +// See https://goo.gl/Dk3Xio for more details. +func (c *Client) Stats(opts StatsOptions) (retErr error) { + errC := make(chan error, 1) + readCloser, writeCloser := io.Pipe() + + defer func() { + close(opts.Stats) + + if err := <-errC; err != nil && retErr == nil { + retErr = err + } + + if err := readCloser.Close(); err != nil && retErr == nil { + retErr = err + } + }() + + reqSent := make(chan struct{}) + go func() { + defer close(errC) + err := c.stream(http.MethodGet, fmt.Sprintf("/containers/%s/stats?stream=%v", opts.ID, opts.Stream), streamOptions{ + rawJSONStream: true, + useJSONDecoder: true, + stdout: writeCloser, + timeout: opts.Timeout, + inactivityTimeout: opts.InactivityTimeout, + context: opts.Context, + reqSent: reqSent, + }) + if err != nil { + var dockerError *Error + if errors.As(err, &dockerError) { + if dockerError.Status == http.StatusNotFound { + err = &NoSuchContainer{ID: opts.ID} + } + } + } + if closeErr := writeCloser.Close(); closeErr != nil && err == nil { + err = closeErr + } + errC <- err + }() + + quit := make(chan struct{}) + defer close(quit) + go func() { + // block here waiting for the signal to stop function + select { + case <-opts.Done: + readCloser.Close() + case <-quit: + return + } + }() + + decoder := json.NewDecoder(readCloser) + stats := new(Stats) + <-reqSent + for err := decoder.Decode(stats); !errors.Is(err, io.EOF); err = decoder.Decode(stats) { + if err != nil { + return err + } + opts.Stats <- stats + stats = new(Stats) + } + return nil +} diff --git a/vendor/github.com/fsouza/go-dockerclient/container_stop.go b/vendor/github.com/fsouza/go-dockerclient/container_stop.go new file mode 100644 index 000000000000..43d989874132 --- /dev/null +++ b/vendor/github.com/fsouza/go-dockerclient/container_stop.go @@ -0,0 +1,42 @@ +package docker + +import ( + "context" + "errors" + "fmt" + "net/http" +) + +// StopContainer stops a container, killing it after the given timeout (in +// seconds). +// +// See https://goo.gl/R9dZcV for more details. +func (c *Client) StopContainer(id string, timeout uint) error { + return c.stopContainer(id, timeout, doOptions{}) +} + +// StopContainerWithContext stops a container, killing it after the given +// timeout (in seconds). The context can be used to cancel the stop +// container request. +// +// See https://goo.gl/R9dZcV for more details. +func (c *Client) StopContainerWithContext(id string, timeout uint, ctx context.Context) error { + return c.stopContainer(id, timeout, doOptions{context: ctx}) +} + +func (c *Client) stopContainer(id string, timeout uint, opts doOptions) error { + path := fmt.Sprintf("/containers/%s/stop?t=%d", id, timeout) + resp, err := c.do(http.MethodPost, path, opts) + if err != nil { + var e *Error + if errors.As(err, &e) && e.Status == http.StatusNotFound { + return &NoSuchContainer{ID: id} + } + return err + } + defer resp.Body.Close() + if resp.StatusCode == http.StatusNotModified { + return &ContainerNotRunning{ID: id} + } + return nil +} diff --git a/vendor/github.com/fsouza/go-dockerclient/container_top.go b/vendor/github.com/fsouza/go-dockerclient/container_top.go new file mode 100644 index 000000000000..0aec655fb4df --- /dev/null +++ b/vendor/github.com/fsouza/go-dockerclient/container_top.go @@ -0,0 +1,40 @@ +package docker + +import ( + "encoding/json" + "errors" + "fmt" + "net/http" +) + +// TopResult represents the list of processes running in a container, as +// returned by /containers//top. +// +// See https://goo.gl/FLwpPl for more details. +type TopResult struct { + Titles []string + Processes [][]string +} + +// TopContainer returns processes running inside a container +// +// See https://goo.gl/FLwpPl for more details. +func (c *Client) TopContainer(id string, psArgs string) (TopResult, error) { + var args string + var result TopResult + if psArgs != "" { + args = fmt.Sprintf("?ps_args=%s", psArgs) + } + path := fmt.Sprintf("/containers/%s/top%s", id, args) + resp, err := c.do(http.MethodGet, path, doOptions{}) + if err != nil { + var e *Error + if errors.As(err, &e) && e.Status == http.StatusNotFound { + return result, &NoSuchContainer{ID: id} + } + return result, err + } + defer resp.Body.Close() + err = json.NewDecoder(resp.Body).Decode(&result) + return result, err +} diff --git a/vendor/github.com/fsouza/go-dockerclient/container_unpause.go b/vendor/github.com/fsouza/go-dockerclient/container_unpause.go new file mode 100644 index 000000000000..8f3adc34b8f3 --- /dev/null +++ b/vendor/github.com/fsouza/go-dockerclient/container_unpause.go @@ -0,0 +1,24 @@ +package docker + +import ( + "errors" + "fmt" + "net/http" +) + +// UnpauseContainer unpauses the given container. +// +// See https://goo.gl/sZ2faO for more details. +func (c *Client) UnpauseContainer(id string) error { + path := fmt.Sprintf("/containers/%s/unpause", id) + resp, err := c.do(http.MethodPost, path, doOptions{}) + if err != nil { + var e *Error + if errors.As(err, &e) && e.Status == http.StatusNotFound { + return &NoSuchContainer{ID: id} + } + return err + } + resp.Body.Close() + return nil +} diff --git a/vendor/github.com/fsouza/go-dockerclient/container_update.go b/vendor/github.com/fsouza/go-dockerclient/container_update.go new file mode 100644 index 000000000000..e8de21365b9c --- /dev/null +++ b/vendor/github.com/fsouza/go-dockerclient/container_update.go @@ -0,0 +1,43 @@ +package docker + +import ( + "context" + "fmt" + "net/http" +) + +// UpdateContainerOptions specify parameters to the UpdateContainer function. +// +// See https://goo.gl/Y6fXUy for more details. +type UpdateContainerOptions struct { + BlkioWeight int `json:"BlkioWeight"` + CPUShares int `json:"CpuShares"` + CPUPeriod int `json:"CpuPeriod"` + CPURealtimePeriod int64 `json:"CpuRealtimePeriod"` + CPURealtimeRuntime int64 `json:"CpuRealtimeRuntime"` + CPUQuota int `json:"CpuQuota"` + CpusetCpus string `json:"CpusetCpus"` + CpusetMems string `json:"CpusetMems"` + Memory int `json:"Memory"` + MemorySwap int `json:"MemorySwap"` + MemoryReservation int `json:"MemoryReservation"` + KernelMemory int `json:"KernelMemory"` + RestartPolicy RestartPolicy `json:"RestartPolicy,omitempty"` + Context context.Context +} + +// UpdateContainer updates the container at ID with the options +// +// See https://goo.gl/Y6fXUy for more details. +func (c *Client) UpdateContainer(id string, opts UpdateContainerOptions) error { + resp, err := c.do(http.MethodPost, fmt.Sprintf("/containers/"+id+"/update"), doOptions{ + data: opts, + forceJSON: true, + context: opts.Context, + }) + if err != nil { + return err + } + defer resp.Body.Close() + return nil +} diff --git a/vendor/github.com/fsouza/go-dockerclient/container_wait.go b/vendor/github.com/fsouza/go-dockerclient/container_wait.go new file mode 100644 index 000000000000..96f0c25f4300 --- /dev/null +++ b/vendor/github.com/fsouza/go-dockerclient/container_wait.go @@ -0,0 +1,42 @@ +package docker + +import ( + "context" + "encoding/json" + "errors" + "net/http" +) + +// WaitContainer blocks until the given container stops, return the exit code +// of the container status. +// +// See https://goo.gl/4AGweZ for more details. +func (c *Client) WaitContainer(id string) (int, error) { + return c.waitContainer(id, doOptions{}) +} + +// WaitContainerWithContext blocks until the given container stops, return the exit code +// of the container status. The context object can be used to cancel the +// inspect request. +// +// See https://goo.gl/4AGweZ for more details. +func (c *Client) WaitContainerWithContext(id string, ctx context.Context) (int, error) { + return c.waitContainer(id, doOptions{context: ctx}) +} + +func (c *Client) waitContainer(id string, opts doOptions) (int, error) { + resp, err := c.do(http.MethodPost, "/containers/"+id+"/wait", opts) + if err != nil { + var e *Error + if errors.As(err, &e) && e.Status == http.StatusNotFound { + return 0, &NoSuchContainer{ID: id} + } + return 0, err + } + defer resp.Body.Close() + var r struct{ StatusCode int } + if err := json.NewDecoder(resp.Body).Decode(&r); err != nil { + return 0, err + } + return r.StatusCode, nil +} diff --git a/vendor/github.com/fsouza/go-dockerclient/distribution.go b/vendor/github.com/fsouza/go-dockerclient/distribution.go index d0f8ce74cc78..6e5e12f7dd3f 100644 --- a/vendor/github.com/fsouza/go-dockerclient/distribution.go +++ b/vendor/github.com/fsouza/go-dockerclient/distribution.go @@ -6,6 +6,7 @@ package docker import ( "encoding/json" + "net/http" "github.com/docker/docker/api/types/registry" ) @@ -13,7 +14,7 @@ import ( // InspectDistribution returns image digest and platform information by contacting the registry func (c *Client) InspectDistribution(name string) (*registry.DistributionInspect, error) { path := "/distribution/" + name + "/json" - resp, err := c.do("GET", path, doOptions{}) + resp, err := c.do(http.MethodGet, path, doOptions{}) if err != nil { return nil, err } diff --git a/vendor/github.com/fsouza/go-dockerclient/env.go b/vendor/github.com/fsouza/go-dockerclient/env.go index 13fedfb17e9d..0f2e72f11825 100644 --- a/vendor/github.com/fsouza/go-dockerclient/env.go +++ b/vendor/github.com/fsouza/go-dockerclient/env.go @@ -156,7 +156,7 @@ func (env *Env) SetAuto(key string, value interface{}) { // Map returns the map representation of the env. func (env *Env) Map() map[string]string { - if len(*env) == 0 { + if env == nil || len(*env) == 0 { return nil } m := make(map[string]string) diff --git a/vendor/github.com/fsouza/go-dockerclient/event.go b/vendor/github.com/fsouza/go-dockerclient/event.go index 21c0584f05bd..024b4ecc21f1 100644 --- a/vendor/github.com/fsouza/go-dockerclient/event.go +++ b/vendor/github.com/fsouza/go-dockerclient/event.go @@ -7,17 +7,48 @@ package docker import ( "encoding/json" "errors" - "fmt" "io" "math" "net" "net/http" "net/http/httputil" + "strconv" "sync" "sync/atomic" "time" ) +// EventsOptions to filter events +// See https://docs.docker.com/engine/api/v1.41/#operation/SystemEvents for more details. +type EventsOptions struct { + // Show events created since this timestamp then stream new events. + Since string + + // Show events created until this timestamp then stop streaming. + Until string + + // Filter for events. For example: + // map[string][]string{"type": {"container"}, "event": {"start", "die"}} + // will return events when container was started and stopped or killed + // + // Available filters: + // config= config name or ID + // container= container name or ID + // daemon= daemon name or ID + // event= event type + // image= image name or ID + // label= image or container label + // network= network name or ID + // node= node ID + // plugin= plugin name or ID + // scope= local or swarm + // secret= secret name or ID + // service= service name or ID + // type= container, image, volume, network, daemon, plugin, node, service, secret or config + // volume= volume name + Filters map[string][]string +} + // APIEvents represents events coming from the Docker API // The fields in the Docker API changed in API version 1.22, and // events for more than images and containers are now fired off. @@ -93,9 +124,17 @@ var ( // // The parameter is a channel through which events will be sent. func (c *Client) AddEventListener(listener chan<- *APIEvents) error { + return c.AddEventListenerWithOptions(EventsOptions{}, listener) +} + +// AddEventListener adds a new listener to container events in the Docker API. +// See https://docs.docker.com/engine/api/v1.41/#operation/SystemEvents for more details. +// +// The listener parameter is a channel through which events will be sent. +func (c *Client) AddEventListenerWithOptions(options EventsOptions, listener chan<- *APIEvents) error { var err error if !c.eventMonitor.isEnabled() { - err = c.eventMonitor.enableEventMonitoring(c) + err = c.eventMonitor.enableEventMonitoring(c, options) if err != nil { return err } @@ -165,7 +204,7 @@ func listenerExists(a chan<- *APIEvents, list *[]chan<- *APIEvents) bool { return false } -func (eventState *eventMonitoringState) enableEventMonitoring(c *Client) error { +func (eventState *eventMonitoringState) enableEventMonitoring(c *Client, opts EventsOptions) error { eventState.Lock() defer eventState.Unlock() if !eventState.enabled { @@ -173,12 +212,12 @@ func (eventState *eventMonitoringState) enableEventMonitoring(c *Client) error { atomic.StoreInt64(&eventState.lastSeen, 0) eventState.C = make(chan *APIEvents, 100) eventState.errC = make(chan error, 1) - go eventState.monitorEvents(c) + go eventState.monitorEvents(c, opts) } return nil } -func (eventState *eventMonitoringState) disableEventMonitoring() error { +func (eventState *eventMonitoringState) disableEventMonitoring() { eventState.Lock() defer eventState.Unlock() @@ -191,15 +230,29 @@ func (eventState *eventMonitoringState) disableEventMonitoring() error { close(eventState.C) close(eventState.errC) } - return nil } -func (eventState *eventMonitoringState) monitorEvents(c *Client) { +func (eventState *eventMonitoringState) monitorEvents(c *Client, opts EventsOptions) { + const ( + noListenersTimeout = 5 * time.Second + noListenersInterval = 10 * time.Millisecond + noListenersMaxTries = noListenersTimeout / noListenersInterval + ) + var err error - for eventState.noListeners() { + for i := time.Duration(0); i < noListenersMaxTries && eventState.noListeners(); i++ { time.Sleep(10 * time.Millisecond) } - if err = eventState.connectWithRetry(c); err != nil { + + if eventState.noListeners() { + // terminate if no listener is available after 5 seconds. + // Prevents goroutine leak when RemoveEventListener is called + // right after AddEventListener. + eventState.disableEventMonitoring() + return + } + + if err = eventState.connectWithRetry(c, opts); err != nil { // terminate if connect failed eventState.disableEventMonitoring() return @@ -218,11 +271,11 @@ func (eventState *eventMonitoringState) monitorEvents(c *Client) { eventState.updateLastSeen(ev) eventState.sendEvent(ev) case err = <-eventState.errC: - if err == ErrNoListeners { + if errors.Is(err, ErrNoListeners) { eventState.disableEventMonitoring() return } else if err != nil { - defer func() { go eventState.monitorEvents(c) }() + defer func() { go eventState.monitorEvents(c, opts) }() return } case <-timeout: @@ -231,13 +284,13 @@ func (eventState *eventMonitoringState) monitorEvents(c *Client) { } } -func (eventState *eventMonitoringState) connectWithRetry(c *Client) error { +func (eventState *eventMonitoringState) connectWithRetry(c *Client, opts EventsOptions) error { var retries int eventState.RLock() eventChan := eventState.C errChan := eventState.errC eventState.RUnlock() - err := c.eventHijack(atomic.LoadInt64(&eventState.lastSeen), eventChan, errChan) + err := c.eventHijack(opts, atomic.LoadInt64(&eventState.lastSeen), eventChan, errChan) for ; err != nil && retries < maxMonitorConnRetries; retries++ { waitTime := int64(retryInitialWaitTime * math.Pow(2, float64(retries))) time.Sleep(time.Duration(waitTime) * time.Millisecond) @@ -245,7 +298,7 @@ func (eventState *eventMonitoringState) connectWithRetry(c *Client) error { eventChan = eventState.C errChan = eventState.errC eventState.RUnlock() - err = c.eventHijack(atomic.LoadInt64(&eventState.lastSeen), eventChan, errChan) + err = c.eventHijack(opts, atomic.LoadInt64(&eventState.lastSeen), eventChan, errChan) } return err } @@ -290,11 +343,12 @@ func (eventState *eventMonitoringState) updateLastSeen(e *APIEvents) { } } -func (c *Client) eventHijack(startTime int64, eventChan chan *APIEvents, errChan chan error) error { - uri := "/events" +func (c *Client) eventHijack(opts EventsOptions, startTime int64, eventChan chan *APIEvents, errChan chan error) error { + // on reconnect override initial Since with last event seen time if startTime != 0 { - uri += fmt.Sprintf("?since=%d", startTime) + opts.Since = strconv.FormatInt(startTime, 10) } + uri := "/events?" + queryString(opts) protocol := c.endpointURL.Scheme address := c.endpointURL.Path if protocol != "unix" && protocol != "npipe" { @@ -315,8 +369,9 @@ func (c *Client) eventHijack(startTime int64, eventChan chan *APIEvents, errChan if err != nil { return err } + //lint:ignore SA1019 the alternative doesn't quite work, so keep using the deprecated thing. conn := httputil.NewClientConn(dial, nil) - req, err := http.NewRequest("GET", uri, nil) + req, err := http.NewRequest(http.MethodGet, uri, nil) if err != nil { return err } @@ -324,6 +379,7 @@ func (c *Client) eventHijack(startTime int64, eventChan chan *APIEvents, errChan if err != nil { return err } + //lint:ignore SA1019 the alternative doesn't quite work, so keep using the deprecated thing. go func(res *http.Response, conn *httputil.ClientConn) { defer conn.Close() defer res.Body.Close() @@ -331,7 +387,7 @@ func (c *Client) eventHijack(startTime int64, eventChan chan *APIEvents, errChan for { var event APIEvents if err = decoder.Decode(&event); err != nil { - if err == io.EOF || err == io.ErrUnexpectedEOF { + if errors.Is(err, io.EOF) || errors.Is(err, io.ErrUnexpectedEOF) { c.eventMonitor.RLock() if c.eventMonitor.enabled && c.eventMonitor.C == eventChan { // Signal that we're exiting. diff --git a/vendor/github.com/fsouza/go-dockerclient/exec.go b/vendor/github.com/fsouza/go-dockerclient/exec.go index 0048153096bd..96f76dc1b5e3 100644 --- a/vendor/github.com/fsouza/go-dockerclient/exec.go +++ b/vendor/github.com/fsouza/go-dockerclient/exec.go @@ -5,6 +5,7 @@ package docker import ( + "context" "encoding/json" "errors" "fmt" @@ -12,8 +13,6 @@ import ( "net/http" "net/url" "strconv" - - "golang.org/x/net/context" ) // Exec is the type representing a `docker exec` instance and containing the @@ -26,15 +25,17 @@ type Exec struct { // // See https://goo.gl/60TeBP for more details type CreateExecOptions struct { - AttachStdin bool `json:"AttachStdin,omitempty" yaml:"AttachStdin,omitempty" toml:"AttachStdin,omitempty"` - AttachStdout bool `json:"AttachStdout,omitempty" yaml:"AttachStdout,omitempty" toml:"AttachStdout,omitempty"` - AttachStderr bool `json:"AttachStderr,omitempty" yaml:"AttachStderr,omitempty" toml:"AttachStderr,omitempty"` - Tty bool `json:"Tty,omitempty" yaml:"Tty,omitempty" toml:"Tty,omitempty"` Env []string `json:"Env,omitempty" yaml:"Env,omitempty" toml:"Env,omitempty"` Cmd []string `json:"Cmd,omitempty" yaml:"Cmd,omitempty" toml:"Cmd,omitempty"` Container string `json:"Container,omitempty" yaml:"Container,omitempty" toml:"Container,omitempty"` User string `json:"User,omitempty" yaml:"User,omitempty" toml:"User,omitempty"` + WorkingDir string `json:"WorkingDir,omitempty" yaml:"WorkingDir,omitempty" toml:"WorkingDir,omitempty"` + DetachKeys string `json:"DetachKeys,omitempty" yaml:"DetachKeys,omitempty" toml:"DetachKeys,omitempty"` Context context.Context `json:"-"` + AttachStdin bool `json:"AttachStdin,omitempty" yaml:"AttachStdin,omitempty" toml:"AttachStdin,omitempty"` + AttachStdout bool `json:"AttachStdout,omitempty" yaml:"AttachStdout,omitempty" toml:"AttachStdout,omitempty"` + AttachStderr bool `json:"AttachStderr,omitempty" yaml:"AttachStderr,omitempty" toml:"AttachStderr,omitempty"` + Tty bool `json:"Tty,omitempty" yaml:"Tty,omitempty" toml:"Tty,omitempty"` Privileged bool `json:"Privileged,omitempty" yaml:"Privileged,omitempty" toml:"Privileged,omitempty"` } @@ -46,10 +47,14 @@ func (c *Client) CreateExec(opts CreateExecOptions) (*Exec, error) { if len(opts.Env) > 0 && c.serverAPIVersion.LessThan(apiVersion125) { return nil, errors.New("exec configuration Env is only supported in API#1.25 and above") } + if len(opts.WorkingDir) > 0 && c.serverAPIVersion.LessThan(apiVersion135) { + return nil, errors.New("exec configuration WorkingDir is only supported in API#1.35 and above") + } path := fmt.Sprintf("/containers/%s/exec", opts.Container) - resp, err := c.do("POST", path, doOptions{data: opts, context: opts.Context}) + resp, err := c.do(http.MethodPost, path, doOptions{data: opts, context: opts.Context}) if err != nil { - if e, ok := err.(*Error); ok && e.Status == http.StatusNotFound { + var e *Error + if errors.As(err, &e) && e.Status == http.StatusNotFound { return nil, &NoSuchContainer{ID: opts.Container} } return nil, err @@ -116,9 +121,10 @@ func (c *Client) StartExecNonBlocking(id string, opts StartExecOptions) (CloseWa path := fmt.Sprintf("/exec/%s/start", id) if opts.Detach { - resp, err := c.do("POST", path, doOptions{data: opts, context: opts.Context}) + resp, err := c.do(http.MethodPost, path, doOptions{data: opts, context: opts.Context}) if err != nil { - if e, ok := err.(*Error); ok && e.Status == http.StatusNotFound { + var e *Error + if errors.As(err, &e) && e.Status == http.StatusNotFound { return nil, &NoSuchExec{ID: id} } return nil, err @@ -127,7 +133,7 @@ func (c *Client) StartExecNonBlocking(id string, opts StartExecOptions) (CloseWa return nil, nil } - return c.hijack("POST", path, hijackOptions{ + return c.hijack(http.MethodPost, path, hijackOptions{ success: opts.Success, setRawTerminal: opts.RawTerminal, in: opts.InputStream, @@ -148,7 +154,7 @@ func (c *Client) ResizeExecTTY(id string, height, width int) error { params.Set("w", strconv.Itoa(width)) path := fmt.Sprintf("/exec/%s/resize?%s", id, params.Encode()) - resp, err := c.do("POST", path, doOptions{}) + resp, err := c.do(http.MethodPost, path, doOptions{}) if err != nil { return err } @@ -174,13 +180,13 @@ type ExecProcessConfig struct { type ExecInspect struct { ID string `json:"ID,omitempty" yaml:"ID,omitempty" toml:"ID,omitempty"` ExitCode int `json:"ExitCode,omitempty" yaml:"ExitCode,omitempty" toml:"ExitCode,omitempty"` + ProcessConfig ExecProcessConfig `json:"ProcessConfig,omitempty" yaml:"ProcessConfig,omitempty" toml:"ProcessConfig,omitempty"` + ContainerID string `json:"ContainerID,omitempty" yaml:"ContainerID,omitempty" toml:"ContainerID,omitempty"` + DetachKeys string `json:"DetachKeys,omitempty" yaml:"DetachKeys,omitempty" toml:"DetachKeys,omitempty"` Running bool `json:"Running,omitempty" yaml:"Running,omitempty" toml:"Running,omitempty"` OpenStdin bool `json:"OpenStdin,omitempty" yaml:"OpenStdin,omitempty" toml:"OpenStdin,omitempty"` OpenStderr bool `json:"OpenStderr,omitempty" yaml:"OpenStderr,omitempty" toml:"OpenStderr,omitempty"` OpenStdout bool `json:"OpenStdout,omitempty" yaml:"OpenStdout,omitempty" toml:"OpenStdout,omitempty"` - ProcessConfig ExecProcessConfig `json:"ProcessConfig,omitempty" yaml:"ProcessConfig,omitempty" toml:"ProcessConfig,omitempty"` - ContainerID string `json:"ContainerID,omitempty" yaml:"ContainerID,omitempty" toml:"ContainerID,omitempty"` - DetachKeys string `json:"DetachKeys,omitempty" yaml:"DetachKeys,omitempty" toml:"DetachKeys,omitempty"` CanRemove bool `json:"CanRemove,omitempty" yaml:"CanRemove,omitempty" toml:"CanRemove,omitempty"` } @@ -189,9 +195,10 @@ type ExecInspect struct { // See https://goo.gl/ctMUiW for more details func (c *Client) InspectExec(id string) (*ExecInspect, error) { path := fmt.Sprintf("/exec/%s/json", id) - resp, err := c.do("GET", path, doOptions{}) + resp, err := c.do(http.MethodGet, path, doOptions{}) if err != nil { - if e, ok := err.(*Error); ok && e.Status == http.StatusNotFound { + var e *Error + if errors.As(err, &e) && e.Status == http.StatusNotFound { return nil, &NoSuchExec{ID: id} } return nil, err diff --git a/vendor/github.com/fsouza/go-dockerclient/go.mod b/vendor/github.com/fsouza/go-dockerclient/go.mod new file mode 100644 index 000000000000..b8a5d6f7490c --- /dev/null +++ b/vendor/github.com/fsouza/go-dockerclient/go.mod @@ -0,0 +1,24 @@ +module github.com/fsouza/go-dockerclient + +go 1.15 + +require ( + github.com/Microsoft/go-winio v0.4.16 + github.com/Microsoft/hcsshim v0.8.14 // indirect + github.com/containerd/containerd v1.4.3 // indirect + github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e // indirect + github.com/docker/docker v20.10.3-0.20210216175712-646072ed6524+incompatible + github.com/docker/go-connections v0.4.0 // indirect + github.com/docker/go-units v0.4.0 + github.com/gogo/protobuf v1.3.2 // indirect + github.com/google/go-cmp v0.5.4 + github.com/gorilla/mux v1.8.0 + github.com/moby/sys/mount v0.2.0 // indirect + github.com/moby/term v0.0.0-20201216013528-df9cb8a40635 // indirect + github.com/morikuni/aec v1.0.0 // indirect + github.com/opencontainers/image-spec v1.0.1 // indirect + github.com/opencontainers/runc v0.1.1 // indirect + golang.org/x/sys v0.0.0-20210216224549-f992740a1bac // indirect + golang.org/x/term v0.0.0-20201113234701-d7a72108b828 + gotest.tools/v3 v3.0.3 // indirect +) diff --git a/vendor/github.com/fsouza/go-dockerclient/go.sum b/vendor/github.com/fsouza/go-dockerclient/go.sum new file mode 100644 index 000000000000..74dba2ed8b9c --- /dev/null +++ b/vendor/github.com/fsouza/go-dockerclient/go.sum @@ -0,0 +1,198 @@ +bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7OZ575w+acHgRric5iCyQh+xv+KJ4HB8= +github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= +github.com/Microsoft/go-winio v0.4.16 h1:FtSW/jqD+l4ba5iPBj9CODVtgfYAD8w2wS923g/cFDk= +github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= +github.com/Microsoft/hcsshim v0.8.14 h1:lbPVK25c1cu5xTLITwpUcxoA9vKrKErASPYygvouJns= +github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= +github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59 h1:qWj4qVYZ95vLWwqyNJCQg7rDsG5wPdze0UaPolH7DUk= +github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM= +github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= +github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.3 h1:ijQT13JedHSHrQGWFcGEwzcNKrAGIiZ+jSD5QQG07SY= +github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e h1:6JKvHHt396/qabvMhnhUZvWaHZzfVfldxE60TK8YLhg= +github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= +github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= +github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= +github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= +github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= +github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +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= +github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= +github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/docker/docker v20.10.3-0.20210216175712-646072ed6524+incompatible h1:Yu2uGErhwEoOT/OxAFe+/SiJCqRLs+pgcS5XKrDXnG4= +github.com/docker/docker v20.10.3-0.20210216175712-646072ed6524+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= +github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +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= +github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4 h1:L8R9j+yAqZuZjsqh/z+F1NCffTKKLShY6zXTItVIZ8M= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +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= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/moby/sys/mount v0.2.0 h1:WhCW5B355jtxndN5ovugJlMFJawbUODuW8fSnEH6SSM= +github.com/moby/sys/mount v0.2.0/go.mod h1:aAivFE2LB3W4bACsUXChRHQ0qKWsetY4Y9V7sxOougM= +github.com/moby/sys/mountinfo v0.4.0 h1:1KInV3Huv18akCu58V7lzNlt+jFmqlu1EaErnEHE/VM= +github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= +github.com/moby/term v0.0.0-20201216013528-df9cb8a40635 h1:rzf0wL0CHVc8CEsgyygG0Mn9CNCCPZqOPaz8RiiHYQk= +github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.0.1 h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVojFA6h/TRcI= +github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v0.1.1 h1:GlxAyO6x8rfZYN9Tt0Kti5a/cP41iuiO2yYT0IJGY8Y= +github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +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= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.opencensus.io v0.22.0 h1:C9hSCOW830chIVkdja34wa6Ky+IzWllkUinR+BtRZd4= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/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-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9 h1:SQFwaSi55rU7vdNs9Yr0Z324VNlrF+0wMqRXT4St8ck= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/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-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210216224549-f992740a1bac h1:9glrpwtNjBYgRpb67AZJKHfzj1stG/8BL5H7In2oTC4= +golang.org/x/sys v0.0.0-20210216224549-f992740a1bac/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/term v0.0.0-20201113234701-d7a72108b828 h1:htWEtQEuEVJ4tU/Ngx7Cd/4Q7e3A5Up1owgyBtVsTwk= +golang.org/x/term v0.0.0-20201113234701-d7a72108b828/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +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/tools v0.0.0-20180917221912-90fa682c2a6e/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-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= +gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= +gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= +gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/vendor/github.com/fsouza/go-dockerclient/image.go b/vendor/github.com/fsouza/go-dockerclient/image.go index c386ad5daeac..83af56b94ccd 100644 --- a/vendor/github.com/fsouza/go-dockerclient/image.go +++ b/vendor/github.com/fsouza/go-dockerclient/image.go @@ -5,7 +5,7 @@ package docker import ( - "bytes" + "context" "encoding/base64" "encoding/json" "errors" @@ -16,8 +16,6 @@ import ( "os" "strings" "time" - - "golang.org/x/net/context" ) // APIImages represent an image returned in the ListImages call. @@ -90,7 +88,7 @@ var ( // InputStream are provided in BuildImageOptions ErrMultipleContexts = errors.New("image build may not be provided BOTH context dir and input stream") - // ErrMustSpecifyNames is the error rreturned when the Names field on + // ErrMustSpecifyNames is the error returned when the Names field on // ExportImagesOptions is nil or empty ErrMustSpecifyNames = errors.New("must specify at least one name to export") ) @@ -111,7 +109,7 @@ type ListImagesOptions struct { // See https://goo.gl/BVzauZ for more details. func (c *Client) ListImages(opts ListImagesOptions) ([]APIImages, error) { path := "/images/json?" + queryString(opts) - resp, err := c.do("GET", path, doOptions{context: opts.Context}) + resp, err := c.do(http.MethodGet, path, doOptions{context: opts.Context}) if err != nil { return nil, err } @@ -131,15 +129,17 @@ type ImageHistory struct { Created int64 `json:"Created,omitempty" yaml:"Created,omitempty" toml:"Tags,omitempty"` CreatedBy string `json:"CreatedBy,omitempty" yaml:"CreatedBy,omitempty" toml:"CreatedBy,omitempty"` Size int64 `json:"Size,omitempty" yaml:"Size,omitempty" toml:"Size,omitempty"` + Comment string `json:"Comment,omitempty" yaml:"Comment,omitempty" toml:"Comment,omitempty"` } // ImageHistory returns the history of the image by its name or ID. // // See https://goo.gl/fYtxQa for more details. func (c *Client) ImageHistory(name string) ([]ImageHistory, error) { - resp, err := c.do("GET", "/images/"+name+"/history", doOptions{}) + resp, err := c.do(http.MethodGet, "/images/"+name+"/history", doOptions{}) if err != nil { - if e, ok := err.(*Error); ok && e.Status == http.StatusNotFound { + var e *Error + if errors.As(err, &e) && e.Status == http.StatusNotFound { return nil, ErrNoSuchImage } return nil, err @@ -156,9 +156,10 @@ func (c *Client) ImageHistory(name string) ([]ImageHistory, error) { // // See https://goo.gl/Vd2Pck for more details. func (c *Client) RemoveImage(name string) error { - resp, err := c.do("DELETE", "/images/"+name, doOptions{}) + resp, err := c.do(http.MethodDelete, "/images/"+name, doOptions{}) if err != nil { - if e, ok := err.(*Error); ok && e.Status == http.StatusNotFound { + var e *Error + if errors.As(err, &e) && e.Status == http.StatusNotFound { return ErrNoSuchImage } return err @@ -183,9 +184,10 @@ type RemoveImageOptions struct { // See https://goo.gl/Vd2Pck for more details. func (c *Client) RemoveImageExtended(name string, opts RemoveImageOptions) error { uri := fmt.Sprintf("/images/%s?%s", name, queryString(&opts)) - resp, err := c.do("DELETE", uri, doOptions{context: opts.Context}) + resp, err := c.do(http.MethodDelete, uri, doOptions{context: opts.Context}) if err != nil { - if e, ok := err.(*Error); ok && e.Status == http.StatusNotFound { + var e *Error + if errors.As(err, &e) && e.Status == http.StatusNotFound { return ErrNoSuchImage } return err @@ -198,9 +200,10 @@ func (c *Client) RemoveImageExtended(name string, opts RemoveImageOptions) error // // See https://goo.gl/ncLTG8 for more details. func (c *Client) InspectImage(name string) (*Image, error) { - resp, err := c.do("GET", "/images/"+name+"/json", doOptions{}) + resp, err := c.do(http.MethodGet, "/images/"+name+"/json", doOptions{}) if err != nil { - if e, ok := err.(*Error); ok && e.Status == http.StatusNotFound { + var e *Error + if errors.As(err, &e) && e.Status == http.StatusNotFound { return nil, ErrNoSuchImage } return nil, err @@ -273,7 +276,7 @@ func (c *Client) PushImage(opts PushImageOptions, auth AuthConfiguration) error name := opts.Name opts.Name = "" path := "/images/" + name + "/push?" + queryString(&opts) - return c.stream("POST", path, streamOptions{ + return c.stream(http.MethodPost, path, streamOptions{ setRawTerminal: true, rawJSONStream: opts.RawJSONStream, headers: headers, @@ -290,6 +293,7 @@ func (c *Client) PushImage(opts PushImageOptions, auth AuthConfiguration) error type PullImageOptions struct { Repository string `qs:"fromImage"` Tag string + Platform string `ver:"1.32"` // Only required for Docker Engine 1.9 or 1.10 w/ Remote API < 1.21 // and Docker Engine < 1.9 @@ -320,12 +324,15 @@ func (c *Client) PullImage(opts PullImageOptions, auth AuthConfiguration) error opts.Repository = parts[0] opts.Tag = parts[1] } - return c.createImage(queryString(&opts), headers, nil, opts.OutputStream, opts.RawJSONStream, opts.InactivityTimeout, opts.Context) + return c.createImage(&opts, headers, nil, opts.OutputStream, opts.RawJSONStream, opts.InactivityTimeout, opts.Context) } -func (c *Client) createImage(qs string, headers map[string]string, in io.Reader, w io.Writer, rawJSONStream bool, timeout time.Duration, context context.Context) error { - path := "/images/create?" + qs - return c.stream("POST", path, streamOptions{ +func (c *Client) createImage(opts interface{}, headers map[string]string, in io.Reader, w io.Writer, rawJSONStream bool, timeout time.Duration, context context.Context) error { + url, err := c.getPath("/images/create", opts) + if err != nil { + return err + } + return c.streamURL(http.MethodPost, url, streamOptions{ setRawTerminal: true, headers: headers, in: in, @@ -349,7 +356,7 @@ type LoadImageOptions struct { // // See https://goo.gl/rEsBV3 for more details. func (c *Client) LoadImage(opts LoadImageOptions) error { - return c.stream("POST", "/images/load", streamOptions{ + return c.stream(http.MethodPost, "/images/load", streamOptions{ setRawTerminal: true, in: opts.InputStream, stdout: opts.OutputStream, @@ -371,7 +378,7 @@ type ExportImageOptions struct { // // See https://goo.gl/AuySaA for more details. func (c *Client) ExportImage(opts ExportImageOptions) error { - return c.stream("GET", fmt.Sprintf("/images/%s/get", opts.Name), streamOptions{ + return c.stream(http.MethodGet, fmt.Sprintf("/images/%s/get", opts.Name), streamOptions{ setRawTerminal: true, stdout: opts.OutputStream, inactivityTimeout: opts.InactivityTimeout, @@ -396,7 +403,28 @@ func (c *Client) ExportImages(opts ExportImagesOptions) error { if opts.Names == nil || len(opts.Names) == 0 { return ErrMustSpecifyNames } - return c.stream("GET", "/images/get?"+queryString(&opts), streamOptions{ + // API < 1.25 allows multiple name values + // 1.25 says name must be a comma separated list + var err error + var exporturl string + if c.requestedAPIVersion.GreaterThanOrEqualTo(apiVersion125) { + str := opts.Names[0] + for _, val := range opts.Names[1:] { + str += "," + val + } + exporturl, err = c.getPath("/images/get", ExportImagesOptions{ + Names: []string{str}, + OutputStream: opts.OutputStream, + InactivityTimeout: opts.InactivityTimeout, + Context: opts.Context, + }) + } else { + exporturl, err = c.getPath("/images/get", &opts) + } + if err != nil { + return err + } + return c.streamURL(http.MethodGet, exporturl, streamOptions{ setRawTerminal: true, stdout: opts.OutputStream, inactivityTimeout: opts.InactivityTimeout, @@ -437,7 +465,7 @@ func (c *Client) ImportImage(opts ImportImageOptions) error { opts.InputStream = f opts.Source = "-" } - return c.createImage(queryString(&opts), nil, opts.InputStream, opts.OutputStream, opts.RawJSONStream, opts.InactivityTimeout, opts.Context) + return c.createImage(&opts, nil, opts.InputStream, opts.OutputStream, opts.RawJSONStream, opts.InactivityTimeout, opts.Context) } // BuildImageOptions present the set of informations available for building an @@ -446,34 +474,40 @@ func (c *Client) ImportImage(opts ImportImageOptions) error { // For more details about the Docker building process, see // https://goo.gl/4nYHwV. type BuildImageOptions struct { - Name string `qs:"t"` - Dockerfile string `qs:"dockerfile"` - NoCache bool `qs:"nocache"` - CacheFrom []string `qs:"-"` - SuppressOutput bool `qs:"q"` - Pull bool `qs:"pull"` - RmTmpContainer bool `qs:"rm"` - ForceRmTmpContainer bool `qs:"forcerm"` - RawJSONStream bool `qs:"-"` - Memory int64 `qs:"memory"` - Memswap int64 `qs:"memswap"` - CPUShares int64 `qs:"cpushares"` - CPUQuota int64 `qs:"cpuquota"` - CPUPeriod int64 `qs:"cpuperiod"` - CPUSetCPUs string `qs:"cpusetcpus"` - Labels map[string]string `qs:"labels"` - InputStream io.Reader `qs:"-"` - OutputStream io.Writer `qs:"-"` - Remote string `qs:"remote"` + Context context.Context + Name string `qs:"t"` + Dockerfile string `ver:"1.25"` + ExtraHosts string `ver:"1.28"` + CacheFrom []string `qs:"-" ver:"1.25"` + Memory int64 + Memswap int64 + ShmSize int64 + CPUShares int64 + CPUQuota int64 `ver:"1.21"` + CPUPeriod int64 `ver:"1.21"` + CPUSetCPUs string + Labels map[string]string + InputStream io.Reader `qs:"-"` + OutputStream io.Writer `qs:"-"` + Remote string Auth AuthConfiguration `qs:"-"` // for older docker X-Registry-Auth header AuthConfigs AuthConfigurations `qs:"-"` // for newer docker X-Registry-Config header ContextDir string `qs:"-"` - Ulimits []ULimit `qs:"-"` - BuildArgs []BuildArg `qs:"-"` - NetworkMode string `qs:"networkmode"` + Ulimits []ULimit `qs:"-" ver:"1.18"` + BuildArgs []BuildArg `qs:"-" ver:"1.21"` + NetworkMode string `ver:"1.25"` + Platform string `ver:"1.32"` InactivityTimeout time.Duration `qs:"-"` - CgroupParent string `qs:"cgroupparent"` - Context context.Context + CgroupParent string + SecurityOpt []string + Target string + Outputs string `ver:"1.40"` + NoCache bool + SuppressOutput bool `qs:"q"` + Pull bool `ver:"1.16"` + RmTmpContainer bool `qs:"rm"` + ForceRmTmpContainer bool `qs:"forcerm" ver:"1.12"` + RawJSONStream bool `qs:"-"` } // BuildArg represents arguments that can be passed to the image when building @@ -516,13 +550,16 @@ func (c *Client) BuildImage(opts BuildImageOptions) error { return err } } - qs := queryString(&opts) + qs, ver := queryStringVersion(&opts) - if c.serverAPIVersion.GreaterThanOrEqualTo(apiVersion125) && len(opts.CacheFrom) > 0 { + if len(opts.CacheFrom) > 0 { if b, err := json.Marshal(opts.CacheFrom); err == nil { item := url.Values(map[string][]string{}) item.Add("cachefrom", string(b)) qs = fmt.Sprintf("%s&%s", qs, item.Encode()) + if ver == nil || apiVersion125.GreaterThan(ver) { + ver = apiVersion125 + } } } @@ -531,6 +568,9 @@ func (c *Client) BuildImage(opts BuildImageOptions) error { item := url.Values(map[string][]string{}) item.Add("ulimits", string(b)) qs = fmt.Sprintf("%s&%s", qs, item.Encode()) + if ver == nil || apiVersion118.GreaterThan(ver) { + ver = apiVersion118 + } } } @@ -543,10 +583,18 @@ func (c *Client) BuildImage(opts BuildImageOptions) error { item := url.Values(map[string][]string{}) item.Add("buildargs", string(b)) qs = fmt.Sprintf("%s&%s", qs, item.Encode()) + if ver == nil || apiVersion121.GreaterThan(ver) { + ver = apiVersion121 + } } } - return c.stream("POST", fmt.Sprintf("/build?%s", qs), streamOptions{ + buildURL, err := c.pathVersionCheck("/build", qs, ver) + if err != nil { + return err + } + + return c.streamURL(http.MethodPost, buildURL, streamOptions{ setRawTerminal: true, rawJSONStream: opts.RawJSONStream, headers: headers, @@ -557,7 +605,7 @@ func (c *Client) BuildImage(opts BuildImageOptions) error { }) } -func (c *Client) versionedAuthConfigs(authConfigs AuthConfigurations) interface{} { +func (c *Client) versionedAuthConfigs(authConfigs AuthConfigurations) registryAuth { if c.serverAPIVersion == nil { c.checkAPIVersion() } @@ -584,10 +632,9 @@ func (c *Client) TagImage(name string, opts TagImageOptions) error { if name == "" { return ErrNoSuchImage } - resp, err := c.do("POST", "/images/"+name+"/tag?"+queryString(&opts), doOptions{ + resp, err := c.do(http.MethodPost, "/images/"+name+"/tag?"+queryString(&opts), doOptions{ context: opts.Context, }) - if err != nil { return err } @@ -609,24 +656,18 @@ func isURL(u string) bool { return p.Scheme == "http" || p.Scheme == "https" } -func headersWithAuth(auths ...interface{}) (map[string]string, error) { - var headers = make(map[string]string) +func headersWithAuth(auths ...registryAuth) (map[string]string, error) { + headers := make(map[string]string) for _, auth := range auths { - switch auth.(type) { - case AuthConfiguration: - var buf bytes.Buffer - if err := json.NewEncoder(&buf).Encode(auth); err != nil { - return nil, err - } - headers["X-Registry-Auth"] = base64.URLEncoding.EncodeToString(buf.Bytes()) - case AuthConfigurations, AuthConfigurations119: - var buf bytes.Buffer - if err := json.NewEncoder(&buf).Encode(auth); err != nil { - return nil, err - } - headers["X-Registry-Config"] = base64.URLEncoding.EncodeToString(buf.Bytes()) + if auth.isEmpty() { + continue + } + data, err := json.Marshal(auth) + if err != nil { + return nil, err } + headers[auth.headerKey()] = base64.URLEncoding.EncodeToString(data) } return headers, nil @@ -647,7 +688,7 @@ type APIImageSearch struct { // // See https://goo.gl/KLO9IZ for more details. func (c *Client) SearchImages(term string) ([]APIImageSearch, error) { - resp, err := c.do("GET", "/images/search?term="+term, doOptions{}) + resp, err := c.do(http.MethodGet, "/images/search?term="+term, doOptions{}) if err != nil { return nil, err } @@ -668,7 +709,7 @@ func (c *Client) SearchImagesEx(term string, auth AuthConfiguration) ([]APIImage return nil, err } - resp, err := c.do("GET", "/images/search?term="+term, doOptions{ + resp, err := c.do(http.MethodGet, "/images/search?term="+term, doOptions{ headers: headers, }) if err != nil { @@ -706,7 +747,7 @@ type PruneImagesResults struct { // See https://goo.gl/qfZlbZ for more details. func (c *Client) PruneImages(opts PruneImagesOptions) (*PruneImagesResults, error) { path := "/images/prune?" + queryString(opts) - resp, err := c.do("POST", path, doOptions{context: opts.Context}) + resp, err := c.do(http.MethodPost, path, doOptions{context: opts.Context}) if err != nil { return nil, err } diff --git a/vendor/github.com/fsouza/go-dockerclient/misc.go b/vendor/github.com/fsouza/go-dockerclient/misc.go index 0482838abee0..8eaa827040e0 100644 --- a/vendor/github.com/fsouza/go-dockerclient/misc.go +++ b/vendor/github.com/fsouza/go-dockerclient/misc.go @@ -5,8 +5,10 @@ package docker import ( + "context" "encoding/json" "net" + "net/http" "strings" "github.com/docker/docker/api/types/swarm" @@ -16,7 +18,12 @@ import ( // // See https://goo.gl/mU7yje for more details. func (c *Client) Version() (*Env, error) { - resp, err := c.do("GET", "/version", doOptions{}) + return c.VersionWithContext(context.TODO()) +} + +// VersionWithContext returns version information about the docker server. +func (c *Client) VersionWithContext(ctx context.Context) (*Env, error) { + resp, err := c.do(http.MethodGet, "/version", doOptions{context: ctx}) if err != nil { return nil, err } @@ -42,19 +49,6 @@ type DockerInfo struct { DriverStatus [][2]string SystemStatus [][2]string Plugins PluginsInfo - MemoryLimit bool - SwapLimit bool - KernelMemory bool - CPUCfsPeriod bool `json:"CpuCfsPeriod"` - CPUCfsQuota bool `json:"CpuCfsQuota"` - CPUShares bool - CPUSet bool - IPv4Forwarding bool - BridgeNfIptables bool - BridgeNfIP6tables bool `json:"BridgeNfIp6tables"` - Debug bool - OomKillDisable bool - ExperimentalBuild bool NFd int NGoroutines int SystemTime string @@ -68,6 +62,7 @@ type DockerInfo struct { Architecture string IndexServerAddress string RegistryConfig *ServiceConfig + SecurityOptions []string NCPU int MemTotal int64 DockerRootDir string @@ -78,12 +73,34 @@ type DockerInfo struct { Labels []string ServerVersion string ClusterStore string + Runtimes map[string]Runtime ClusterAdvertise string Isolation string InitBinary string DefaultRuntime string - LiveRestoreEnabled bool Swarm swarm.Info + LiveRestoreEnabled bool + MemoryLimit bool + SwapLimit bool + KernelMemory bool + CPUCfsPeriod bool `json:"CpuCfsPeriod"` + CPUCfsQuota bool `json:"CpuCfsQuota"` + CPUShares bool + CPUSet bool + IPv4Forwarding bool + BridgeNfIptables bool + BridgeNfIP6tables bool `json:"BridgeNfIp6tables"` + Debug bool + OomKillDisable bool + ExperimentalBuild bool +} + +// Runtime describes an OCI runtime +// +// for more information, see: https://dockr.ly/2NKM8qq +type Runtime struct { + Path string + Args []string `json:"runtimeArgs"` } // PluginsInfo is a struct with the plugins registered with the docker daemon @@ -146,7 +163,7 @@ type IndexInfo struct { // // See https://goo.gl/ElTHi2 for more details. func (c *Client) Info() (*DockerInfo, error) { - resp, err := c.do("GET", "/info", doOptions{}) + resp, err := c.do(http.MethodGet, "/info", doOptions{}) if err != nil { return nil, err } diff --git a/vendor/github.com/fsouza/go-dockerclient/network.go b/vendor/github.com/fsouza/go-dockerclient/network.go index b79b67cd58ff..f3ce4ce96a8a 100644 --- a/vendor/github.com/fsouza/go-dockerclient/network.go +++ b/vendor/github.com/fsouza/go-dockerclient/network.go @@ -5,12 +5,12 @@ package docker import ( + "context" "encoding/json" "errors" "fmt" "net/http" - - "golang.org/x/net/context" + "net/url" ) // ErrNetworkAlreadyExists is the error returned by CreateNetwork when the @@ -48,7 +48,7 @@ type Endpoint struct { // // See https://goo.gl/6GugX3 for more details. func (c *Client) ListNetworks() ([]Network, error) { - resp, err := c.do("GET", "/networks", doOptions{}) + resp, err := c.do(http.MethodGet, "/networks", doOptions{}) if err != nil { return nil, err } @@ -72,8 +72,10 @@ func (c *Client) FilteredListNetworks(opts NetworkFilterOpts) ([]Network, error) if err != nil { return nil, err } - path := "/networks?filters=" + string(params) - resp, err := c.do("GET", path, doOptions{}) + qs := make(url.Values) + qs.Add("filters", string(params)) + path := "/networks?" + qs.Encode() + resp, err := c.do(http.MethodGet, path, doOptions{}) if err != nil { return nil, err } @@ -90,9 +92,10 @@ func (c *Client) FilteredListNetworks(opts NetworkFilterOpts) ([]Network, error) // See https://goo.gl/6GugX3 for more details. func (c *Client) NetworkInfo(id string) (*Network, error) { path := "/networks/" + id - resp, err := c.do("GET", path, doOptions{}) + resp, err := c.do(http.MethodGet, path, doOptions{}) if err != nil { - if e, ok := err.(*Error); ok && e.Status == http.StatusNotFound { + var e *Error + if errors.As(err, &e) && e.Status == http.StatusNotFound { return nil, &NoSuchNetwork{ID: id} } return nil, err @@ -112,15 +115,26 @@ func (c *Client) NetworkInfo(id string) (*Network, error) { type CreateNetworkOptions struct { Name string `json:"Name" yaml:"Name" toml:"Name"` Driver string `json:"Driver" yaml:"Driver" toml:"Driver"` - IPAM IPAMOptions `json:"IPAM" yaml:"IPAM" toml:"IPAM"` + Scope string `json:"Scope" yaml:"Scope" toml:"Scope"` + IPAM *IPAMOptions `json:"IPAM,omitempty" yaml:"IPAM" toml:"IPAM"` + ConfigFrom *NetworkConfigFrom `json:"ConfigFrom,omitempty" yaml:"ConfigFrom" toml:"ConfigFrom"` Options map[string]interface{} `json:"Options" yaml:"Options" toml:"Options"` Labels map[string]string `json:"Labels" yaml:"Labels" toml:"Labels"` CheckDuplicate bool `json:"CheckDuplicate" yaml:"CheckDuplicate" toml:"CheckDuplicate"` Internal bool `json:"Internal" yaml:"Internal" toml:"Internal"` EnableIPv6 bool `json:"EnableIPv6" yaml:"EnableIPv6" toml:"EnableIPv6"` + Attachable bool `json:"Attachable" yaml:"Attachable" toml:"Attachable"` + ConfigOnly bool `json:"ConfigOnly" yaml:"ConfigOnly" toml:"ConfigOnly"` + Ingress bool `json:"Ingress" yaml:"Ingress" toml:"Ingress"` Context context.Context `json:"-"` } +// NetworkConfigFrom is used in network creation for specifying the source of a +// network configuration. +type NetworkConfigFrom struct { + Network string `json:"Network" yaml:"Network" toml:"Network"` +} + // IPAMOptions controls IP Address Management when creating a network // // See https://goo.gl/T8kRVH for more details. @@ -146,7 +160,7 @@ type IPAMConfig struct { // See https://goo.gl/6GugX3 for more details. func (c *Client) CreateNetwork(opts CreateNetworkOptions) (*Network, error) { resp, err := c.do( - "POST", + http.MethodPost, "/networks/create", doOptions{ data: opts, @@ -180,9 +194,10 @@ func (c *Client) CreateNetwork(opts CreateNetworkOptions) (*Network, error) { // // See https://goo.gl/6GugX3 for more details. func (c *Client) RemoveNetwork(id string) error { - resp, err := c.do("DELETE", "/networks/"+id, doOptions{}) + resp, err := c.do(http.MethodDelete, "/networks/"+id, doOptions{}) if err != nil { - if e, ok := err.(*Error); ok && e.Status == http.StatusNotFound { + var e *Error + if errors.As(err, &e) && e.Status == http.StatusNotFound { return &NoSuchNetwork{ID: id} } return err @@ -223,6 +238,7 @@ type EndpointConfig struct { GlobalIPv6Address string `json:"GlobalIPv6Address,omitempty" yaml:"GlobalIPv6Address,omitempty" toml:"GlobalIPv6Address,omitempty"` GlobalIPv6PrefixLen int `json:"GlobalIPv6PrefixLen,omitempty" yaml:"GlobalIPv6PrefixLen,omitempty" toml:"GlobalIPv6PrefixLen,omitempty"` MacAddress string `json:"MacAddress,omitempty" yaml:"MacAddress,omitempty" toml:"MacAddress,omitempty"` + DriverOpts map[string]string `json:"DriverOpts,omitempty" yaml:"DriverOpts,omitempty" toml:"DriverOpts,omitempty"` } // EndpointIPAMConfig represents IPAM configurations for an @@ -239,12 +255,13 @@ type EndpointIPAMConfig struct { // // See https://goo.gl/6GugX3 for more details. func (c *Client) ConnectNetwork(id string, opts NetworkConnectionOptions) error { - resp, err := c.do("POST", "/networks/"+id+"/connect", doOptions{ + resp, err := c.do(http.MethodPost, "/networks/"+id+"/connect", doOptions{ data: opts, context: opts.Context, }) if err != nil { - if e, ok := err.(*Error); ok && e.Status == http.StatusNotFound { + var e *Error + if errors.As(err, &e) && e.Status == http.StatusNotFound { return &NoSuchNetworkOrContainer{NetworkID: id, ContainerID: opts.Container} } return err @@ -258,9 +275,10 @@ func (c *Client) ConnectNetwork(id string, opts NetworkConnectionOptions) error // // See https://goo.gl/6GugX3 for more details. func (c *Client) DisconnectNetwork(id string, opts NetworkConnectionOptions) error { - resp, err := c.do("POST", "/networks/"+id+"/disconnect", doOptions{data: opts}) + resp, err := c.do(http.MethodPost, "/networks/"+id+"/disconnect", doOptions{data: opts}) if err != nil { - if e, ok := err.(*Error); ok && e.Status == http.StatusNotFound { + var e *Error + if errors.As(err, &e) && e.Status == http.StatusNotFound { return &NoSuchNetworkOrContainer{NetworkID: id, ContainerID: opts.Container} } return err @@ -289,7 +307,7 @@ type PruneNetworksResults struct { // See https://goo.gl/kX0S9h for more details. func (c *Client) PruneNetworks(opts PruneNetworksOptions) (*PruneNetworksResults, error) { path := "/networks/prune?" + queryString(opts) - resp, err := c.do("POST", path, doOptions{context: opts.Context}) + resp, err := c.do(http.MethodPost, path, doOptions{context: opts.Context}) if err != nil { return nil, err } diff --git a/vendor/github.com/fsouza/go-dockerclient/node.go b/vendor/github.com/fsouza/go-dockerclient/node.go deleted file mode 100644 index 843402541330..000000000000 --- a/vendor/github.com/fsouza/go-dockerclient/node.go +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright 2016 go-dockerclient authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package docker - -import ( - "encoding/json" - "net/http" - "net/url" - "strconv" - - "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" -) - -// NoSuchNode is the error returned when a given node does not exist. -type NoSuchNode struct { - ID string - Err error -} - -func (err *NoSuchNode) Error() string { - if err.Err != nil { - return err.Err.Error() - } - return "No such node: " + err.ID -} - -// ListNodesOptions specify parameters to the ListNodes function. -// -// See http://goo.gl/3K4GwU for more details. -type ListNodesOptions struct { - Filters map[string][]string - Context context.Context -} - -// ListNodes returns a slice of nodes matching the given criteria. -// -// See http://goo.gl/3K4GwU for more details. -func (c *Client) ListNodes(opts ListNodesOptions) ([]swarm.Node, error) { - path := "/nodes?" + queryString(opts) - resp, err := c.do("GET", path, doOptions{context: opts.Context}) - if err != nil { - return nil, err - } - defer resp.Body.Close() - var nodes []swarm.Node - if err := json.NewDecoder(resp.Body).Decode(&nodes); err != nil { - return nil, err - } - return nodes, nil -} - -// InspectNode returns information about a node by its ID. -// -// See http://goo.gl/WjkTOk for more details. -func (c *Client) InspectNode(id string) (*swarm.Node, error) { - resp, err := c.do("GET", "/nodes/"+id, doOptions{}) - if err != nil { - if e, ok := err.(*Error); ok && e.Status == http.StatusNotFound { - return nil, &NoSuchNode{ID: id} - } - return nil, err - } - defer resp.Body.Close() - var node swarm.Node - if err := json.NewDecoder(resp.Body).Decode(&node); err != nil { - return nil, err - } - return &node, nil -} - -// UpdateNodeOptions specify parameters to the NodeUpdate function. -// -// See http://goo.gl/VPBFgA for more details. -type UpdateNodeOptions struct { - swarm.NodeSpec - Version uint64 - Context context.Context -} - -// UpdateNode updates a node. -// -// See http://goo.gl/VPBFgA for more details. -func (c *Client) UpdateNode(id string, opts UpdateNodeOptions) error { - params := make(url.Values) - params.Set("version", strconv.FormatUint(opts.Version, 10)) - path := "/nodes/" + id + "/update?" + params.Encode() - resp, err := c.do("POST", path, doOptions{ - context: opts.Context, - forceJSON: true, - data: opts.NodeSpec, - }) - if err != nil { - if e, ok := err.(*Error); ok && e.Status == http.StatusNotFound { - return &NoSuchNode{ID: id} - } - return err - } - resp.Body.Close() - return nil -} - -// RemoveNodeOptions specify parameters to the RemoveNode function. -// -// See http://goo.gl/0SNvYg for more details. -type RemoveNodeOptions struct { - ID string - Force bool - Context context.Context -} - -// RemoveNode removes a node. -// -// See http://goo.gl/0SNvYg for more details. -func (c *Client) RemoveNode(opts RemoveNodeOptions) error { - params := make(url.Values) - params.Set("force", strconv.FormatBool(opts.Force)) - path := "/nodes/" + opts.ID + "?" + params.Encode() - resp, err := c.do("DELETE", path, doOptions{context: opts.Context}) - if err != nil { - if e, ok := err.(*Error); ok && e.Status == http.StatusNotFound { - return &NoSuchNode{ID: opts.ID} - } - return err - } - resp.Body.Close() - return nil -} diff --git a/vendor/github.com/fsouza/go-dockerclient/plugin.go b/vendor/github.com/fsouza/go-dockerclient/plugin.go new file mode 100644 index 000000000000..be45607b90fb --- /dev/null +++ b/vendor/github.com/fsouza/go-dockerclient/plugin.go @@ -0,0 +1,461 @@ +// Copyright 2018 go-dockerclient authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package docker + +import ( + "context" + "encoding/json" + "errors" + "io/ioutil" + "net/http" +) + +// PluginPrivilege represents a privilege for a plugin. +type PluginPrivilege struct { + Name string `json:"Name,omitempty" yaml:"Name,omitempty" toml:"Name,omitempty"` + Description string `json:"Description,omitempty" yaml:"Description,omitempty" toml:"Description,omitempty"` + Value []string `json:"Value,omitempty" yaml:"Value,omitempty" toml:"Value,omitempty"` +} + +// InstallPluginOptions specify parameters to the InstallPlugins function. +// +// See https://goo.gl/C4t7Tz for more details. +type InstallPluginOptions struct { + Remote string + Name string + Plugins []PluginPrivilege `qs:"-"` + + Auth AuthConfiguration + + Context context.Context +} + +// InstallPlugins installs a plugin or returns an error in case of failure. +// +// See https://goo.gl/C4t7Tz for more details. +func (c *Client) InstallPlugins(opts InstallPluginOptions) error { + headers, err := headersWithAuth(opts.Auth) + if err != nil { + return err + } + + path := "/plugins/pull?" + queryString(opts) + resp, err := c.do(http.MethodPost, path, doOptions{ + data: opts.Plugins, + context: opts.Context, + headers: headers, + }) + if err != nil { + return err + } + defer resp.Body.Close() + // PullPlugin streams back the progress of the pull, we must consume the whole body + // otherwise the pull will be canceled on the engine. + if _, err := ioutil.ReadAll(resp.Body); err != nil { + return err + } + return nil +} + +// PluginSettings stores plugin settings. +// +// See https://goo.gl/C4t7Tz for more details. +type PluginSettings struct { + Env []string `json:"Env,omitempty" yaml:"Env,omitempty" toml:"Env,omitempty"` + Args []string `json:"Args,omitempty" yaml:"Args,omitempty" toml:"Args,omitempty"` + Devices []string `json:"Devices,omitempty" yaml:"Devices,omitempty" toml:"Devices,omitempty"` +} + +// PluginInterface stores plugin interface. +// +// See https://goo.gl/C4t7Tz for more details. +type PluginInterface struct { + Types []string `json:"Types,omitempty" yaml:"Types,omitempty" toml:"Types,omitempty"` + Socket string `json:"Socket,omitempty" yaml:"Socket,omitempty" toml:"Socket,omitempty"` +} + +// PluginNetwork stores plugin network type. +// +// See https://goo.gl/C4t7Tz for more details. +type PluginNetwork struct { + Type string `json:"Type,omitempty" yaml:"Type,omitempty" toml:"Type,omitempty"` +} + +// PluginLinux stores plugin linux setting. +// +// See https://goo.gl/C4t7Tz for more details. +type PluginLinux struct { + Capabilities []string `json:"Capabilities,omitempty" yaml:"Capabilities,omitempty" toml:"Capabilities,omitempty"` + AllowAllDevices bool `json:"AllowAllDevices,omitempty" yaml:"AllowAllDevices,omitempty" toml:"AllowAllDevices,omitempty"` + Devices []PluginLinuxDevices `json:"Devices,omitempty" yaml:"Devices,omitempty" toml:"Devices,omitempty"` +} + +// PluginLinuxDevices stores plugin linux device setting. +// +// See https://goo.gl/C4t7Tz for more details. +type PluginLinuxDevices struct { + Name string `json:"Name,omitempty" yaml:"Name,omitempty" toml:"Name,omitempty"` + Description string `json:"Documentation,omitempty" yaml:"Documentation,omitempty" toml:"Documentation,omitempty"` + Settable []string `json:"Settable,omitempty" yaml:"Settable,omitempty" toml:"Settable,omitempty"` + Path string `json:"Path,omitempty" yaml:"Path,omitempty" toml:"Path,omitempty"` +} + +// PluginEnv stores plugin environment. +// +// See https://goo.gl/C4t7Tz for more details. +type PluginEnv struct { + Name string `json:"Name,omitempty" yaml:"Name,omitempty" toml:"Name,omitempty"` + Description string `json:"Description,omitempty" yaml:"Description,omitempty" toml:"Description,omitempty"` + Settable []string `json:"Settable,omitempty" yaml:"Settable,omitempty" toml:"Settable,omitempty"` + Value string `json:"Value,omitempty" yaml:"Value,omitempty" toml:"Value,omitempty"` +} + +// PluginArgs stores plugin arguments. +// +// See https://goo.gl/C4t7Tz for more details. +type PluginArgs struct { + Name string `json:"Name,omitempty" yaml:"Name,omitempty" toml:"Name,omitempty"` + Description string `json:"Description,omitempty" yaml:"Description,omitempty" toml:"Description,omitempty"` + Settable []string `json:"Settable,omitempty" yaml:"Settable,omitempty" toml:"Settable,omitempty"` + Value []string `json:"Value,omitempty" yaml:"Value,omitempty" toml:"Value,omitempty"` +} + +// PluginUser stores plugin user. +// +// See https://goo.gl/C4t7Tz for more details. +type PluginUser struct { + UID int32 `json:"UID,omitempty" yaml:"UID,omitempty" toml:"UID,omitempty"` + GID int32 `json:"GID,omitempty" yaml:"GID,omitempty" toml:"GID,omitempty"` +} + +// PluginConfig stores plugin config. +// +// See https://goo.gl/C4t7Tz for more details. +type PluginConfig struct { + Description string `json:"Description,omitempty" yaml:"Description,omitempty" toml:"Description,omitempty"` + Documentation string + Interface PluginInterface `json:"Interface,omitempty" yaml:"Interface,omitempty" toml:"Interface,omitempty"` + Entrypoint []string `json:"Entrypoint,omitempty" yaml:"Entrypoint,omitempty" toml:"Entrypoint,omitempty"` + WorkDir string `json:"WorkDir,omitempty" yaml:"WorkDir,omitempty" toml:"WorkDir,omitempty"` + User PluginUser `json:"User,omitempty" yaml:"User,omitempty" toml:"User,omitempty"` + Network PluginNetwork `json:"Network,omitempty" yaml:"Network,omitempty" toml:"Network,omitempty"` + Linux PluginLinux `json:"Linux,omitempty" yaml:"Linux,omitempty" toml:"Linux,omitempty"` + PropagatedMount string `json:"PropagatedMount,omitempty" yaml:"PropagatedMount,omitempty" toml:"PropagatedMount,omitempty"` + Mounts []Mount `json:"Mounts,omitempty" yaml:"Mounts,omitempty" toml:"Mounts,omitempty"` + Env []PluginEnv `json:"Env,omitempty" yaml:"Env,omitempty" toml:"Env,omitempty"` + Args PluginArgs `json:"Args,omitempty" yaml:"Args,omitempty" toml:"Args,omitempty"` +} + +// PluginDetail specify results from the ListPlugins function. +// +// See https://goo.gl/C4t7Tz for more details. +type PluginDetail struct { + ID string `json:"Id,omitempty" yaml:"Id,omitempty" toml:"Id,omitempty"` + Name string `json:"Name,omitempty" yaml:"Name,omitempty" toml:"Name,omitempty"` + Tag string `json:"Tag,omitempty" yaml:"Tag,omitempty" toml:"Tag,omitempty"` + Active bool `json:"Enabled,omitempty" yaml:"Active,omitempty" toml:"Active,omitempty"` + Settings PluginSettings `json:"Settings,omitempty" yaml:"Settings,omitempty" toml:"Settings,omitempty"` + Config PluginConfig `json:"Config,omitempty" yaml:"Config,omitempty" toml:"Config,omitempty"` +} + +// ListPlugins returns pluginDetails or an error. +// +// See https://goo.gl/C4t7Tz for more details. +func (c *Client) ListPlugins(ctx context.Context) ([]PluginDetail, error) { + resp, err := c.do(http.MethodGet, "/plugins", doOptions{ + context: ctx, + }) + if err != nil { + return nil, err + } + defer resp.Body.Close() + pluginDetails := make([]PluginDetail, 0) + if err := json.NewDecoder(resp.Body).Decode(&pluginDetails); err != nil { + return nil, err + } + return pluginDetails, nil +} + +// ListFilteredPluginsOptions specify parameters to the ListFilteredPlugins function. +// +// See https://goo.gl/C4t7Tz for more details. +type ListFilteredPluginsOptions struct { + Filters map[string][]string + Context context.Context +} + +// ListFilteredPlugins returns pluginDetails or an error. +// +// See https://goo.gl/rmdmWg for more details. +func (c *Client) ListFilteredPlugins(opts ListFilteredPluginsOptions) ([]PluginDetail, error) { + path := "/plugins/json?" + queryString(opts) + resp, err := c.do(http.MethodGet, path, doOptions{ + context: opts.Context, + }) + if err != nil { + return nil, err + } + defer resp.Body.Close() + pluginDetails := make([]PluginDetail, 0) + if err := json.NewDecoder(resp.Body).Decode(&pluginDetails); err != nil { + return nil, err + } + return pluginDetails, nil +} + +// GetPluginPrivileges returns pluginPrivileges or an error. +// +// See https://goo.gl/C4t7Tz for more details. +func (c *Client) GetPluginPrivileges(remote string, ctx context.Context) ([]PluginPrivilege, error) { + return c.GetPluginPrivilegesWithOptions( + GetPluginPrivilegesOptions{ + Remote: remote, + Context: ctx, + }) +} + +// GetPluginPrivilegesOptions specify parameters to the GetPluginPrivilegesWithOptions function. +// +// See https://goo.gl/C4t7Tz for more details. +type GetPluginPrivilegesOptions struct { + Remote string + Auth AuthConfiguration + Context context.Context +} + +// GetPluginPrivilegesWithOptions returns pluginPrivileges or an error. +// +// See https://goo.gl/C4t7Tz for more details. +func (c *Client) GetPluginPrivilegesWithOptions(opts GetPluginPrivilegesOptions) ([]PluginPrivilege, error) { + headers, err := headersWithAuth(opts.Auth) + if err != nil { + return nil, err + } + + path := "/plugins/privileges?" + queryString(opts) + resp, err := c.do(http.MethodGet, path, doOptions{ + context: opts.Context, + headers: headers, + }) + if err != nil { + return nil, err + } + defer resp.Body.Close() + var pluginPrivileges []PluginPrivilege + if err := json.NewDecoder(resp.Body).Decode(&pluginPrivileges); err != nil { + return nil, err + } + return pluginPrivileges, nil +} + +// InspectPlugins returns a pluginDetail or an error. +// +// See https://goo.gl/C4t7Tz for more details. +func (c *Client) InspectPlugins(name string, ctx context.Context) (*PluginDetail, error) { + resp, err := c.do(http.MethodGet, "/plugins/"+name+"/json", doOptions{ + context: ctx, + }) + if err != nil { + var e *Error + if errors.As(err, &e) && e.Status == http.StatusNotFound { + return nil, &NoSuchPlugin{ID: name} + } + return nil, err + } + defer resp.Body.Close() + var pluginDetail PluginDetail + if err := json.NewDecoder(resp.Body).Decode(&pluginDetail); err != nil { + return nil, err + } + return &pluginDetail, nil +} + +// RemovePluginOptions specify parameters to the RemovePlugin function. +// +// See https://goo.gl/C4t7Tz for more details. +type RemovePluginOptions struct { + // The Name of the plugin. + Name string `qs:"-"` + + Force bool `qs:"force"` + Context context.Context +} + +// RemovePlugin returns a PluginDetail or an error. +// +// See https://goo.gl/C4t7Tz for more details. +func (c *Client) RemovePlugin(opts RemovePluginOptions) (*PluginDetail, error) { + path := "/plugins/" + opts.Name + "?" + queryString(opts) + resp, err := c.do(http.MethodDelete, path, doOptions{context: opts.Context}) + if err != nil { + var e *Error + if errors.As(err, &e) && e.Status == http.StatusNotFound { + return nil, &NoSuchPlugin{ID: opts.Name} + } + return nil, err + } + defer resp.Body.Close() + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return nil, err + } + + if len(body) == 0 { + // Seems like newer docker versions won't return the plugindetail after removal + return nil, nil + } + + var pluginDetail PluginDetail + if err := json.Unmarshal(body, &pluginDetail); err != nil { + return nil, err + } + return &pluginDetail, nil +} + +// EnablePluginOptions specify parameters to the EnablePlugin function. +// +// See https://goo.gl/C4t7Tz for more details. +type EnablePluginOptions struct { + // The Name of the plugin. + Name string `qs:"-"` + Timeout int64 `qs:"timeout"` + + Context context.Context +} + +// EnablePlugin enables plugin that opts point or returns an error. +// +// See https://goo.gl/C4t7Tz for more details. +func (c *Client) EnablePlugin(opts EnablePluginOptions) error { + path := "/plugins/" + opts.Name + "/enable?" + queryString(opts) + resp, err := c.do(http.MethodPost, path, doOptions{context: opts.Context}) + if err != nil { + return err + } + resp.Body.Close() + return nil +} + +// DisablePluginOptions specify parameters to the DisablePlugin function. +// +// See https://goo.gl/C4t7Tz for more details. +type DisablePluginOptions struct { + // The Name of the plugin. + Name string `qs:"-"` + + Context context.Context +} + +// DisablePlugin disables plugin that opts point or returns an error. +// +// See https://goo.gl/C4t7Tz for more details. +func (c *Client) DisablePlugin(opts DisablePluginOptions) error { + path := "/plugins/" + opts.Name + "/disable" + resp, err := c.do(http.MethodPost, path, doOptions{context: opts.Context}) + if err != nil { + return err + } + resp.Body.Close() + return nil +} + +// CreatePluginOptions specify parameters to the CreatePlugin function. +// +// See https://goo.gl/C4t7Tz for more details. +type CreatePluginOptions struct { + // The Name of the plugin. + Name string `qs:"name"` + // Path to tar containing plugin + Path string `qs:"-"` + + Context context.Context +} + +// CreatePlugin creates plugin that opts point or returns an error. +// +// See https://goo.gl/C4t7Tz for more details. +func (c *Client) CreatePlugin(opts CreatePluginOptions) (string, error) { + path := "/plugins/create?" + queryString(opts) + resp, err := c.do(http.MethodPost, path, doOptions{ + data: opts.Path, + context: opts.Context, + }) + if err != nil { + return "", err + } + defer resp.Body.Close() + containerNameBytes, err := ioutil.ReadAll(resp.Body) + if err != nil { + return "", err + } + return string(containerNameBytes), nil +} + +// PushPluginOptions specify parameters to PushPlugin function. +// +// See https://goo.gl/C4t7Tz for more details. +type PushPluginOptions struct { + // The Name of the plugin. + Name string + + Context context.Context +} + +// PushPlugin pushes plugin that opts point or returns an error. +// +// See https://goo.gl/C4t7Tz for more details. +func (c *Client) PushPlugin(opts PushPluginOptions) error { + path := "/plugins/" + opts.Name + "/push" + resp, err := c.do(http.MethodPost, path, doOptions{context: opts.Context}) + if err != nil { + return err + } + resp.Body.Close() + return nil +} + +// ConfigurePluginOptions specify parameters to the ConfigurePlugin +// +// See https://goo.gl/C4t7Tz for more details. +type ConfigurePluginOptions struct { + // The Name of the plugin. + Name string `qs:"name"` + Envs []string + + Context context.Context +} + +// ConfigurePlugin configures plugin that opts point or returns an error. +// +// See https://goo.gl/C4t7Tz for more details. +func (c *Client) ConfigurePlugin(opts ConfigurePluginOptions) error { + path := "/plugins/" + opts.Name + "/set" + resp, err := c.do(http.MethodPost, path, doOptions{ + data: opts.Envs, + context: opts.Context, + }) + if err != nil { + var e *Error + if errors.As(err, &e) && e.Status == http.StatusNotFound { + return &NoSuchPlugin{ID: opts.Name} + } + return err + } + resp.Body.Close() + return nil +} + +// NoSuchPlugin is the error returned when a given plugin does not exist. +type NoSuchPlugin struct { + ID string + Err error +} + +func (err *NoSuchPlugin) Error() string { + if err.Err != nil { + return err.Err.Error() + } + return "No such plugin: " + err.ID +} diff --git a/vendor/github.com/fsouza/go-dockerclient/registry_auth.go b/vendor/github.com/fsouza/go-dockerclient/registry_auth.go new file mode 100644 index 000000000000..1f60d1e8f3b3 --- /dev/null +++ b/vendor/github.com/fsouza/go-dockerclient/registry_auth.go @@ -0,0 +1,10 @@ +// Copyright 2013 go-dockerclient authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package docker + +type registryAuth interface { + isEmpty() bool + headerKey() string +} diff --git a/vendor/github.com/fsouza/go-dockerclient/service.go b/vendor/github.com/fsouza/go-dockerclient/service.go deleted file mode 100644 index 33af547c6e5f..000000000000 --- a/vendor/github.com/fsouza/go-dockerclient/service.go +++ /dev/null @@ -1,216 +0,0 @@ -// Copyright 2016 go-dockerclient authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package docker - -import ( - "encoding/json" - "io" - "net/http" - "net/url" - "strconv" - "time" - - "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" -) - -// NoSuchService is the error returned when a given service does not exist. -type NoSuchService struct { - ID string - Err error -} - -func (err *NoSuchService) Error() string { - if err.Err != nil { - return err.Err.Error() - } - return "No such service: " + err.ID -} - -// CreateServiceOptions specify parameters to the CreateService function. -// -// See https://goo.gl/KrVjHz for more details. -type CreateServiceOptions struct { - Auth AuthConfiguration `qs:"-"` - swarm.ServiceSpec - Context context.Context -} - -// CreateService creates a new service, returning the service instance -// or an error in case of failure. -// -// See https://goo.gl/KrVjHz for more details. -func (c *Client) CreateService(opts CreateServiceOptions) (*swarm.Service, error) { - headers, err := headersWithAuth(opts.Auth) - if err != nil { - return nil, err - } - path := "/services/create?" + queryString(opts) - resp, err := c.do("POST", path, doOptions{ - headers: headers, - data: opts.ServiceSpec, - forceJSON: true, - context: opts.Context, - }) - if err != nil { - return nil, err - } - defer resp.Body.Close() - var service swarm.Service - if err := json.NewDecoder(resp.Body).Decode(&service); err != nil { - return nil, err - } - return &service, nil -} - -// RemoveServiceOptions encapsulates options to remove a service. -// -// See https://goo.gl/Tqrtya for more details. -type RemoveServiceOptions struct { - ID string `qs:"-"` - Context context.Context -} - -// RemoveService removes a service, returning an error in case of failure. -// -// See https://goo.gl/Tqrtya for more details. -func (c *Client) RemoveService(opts RemoveServiceOptions) error { - path := "/services/" + opts.ID - resp, err := c.do("DELETE", path, doOptions{context: opts.Context}) - if err != nil { - if e, ok := err.(*Error); ok && e.Status == http.StatusNotFound { - return &NoSuchService{ID: opts.ID} - } - return err - } - resp.Body.Close() - return nil -} - -// UpdateServiceOptions specify parameters to the UpdateService function. -// -// See https://goo.gl/wu3MmS for more details. -type UpdateServiceOptions struct { - Auth AuthConfiguration `qs:"-"` - swarm.ServiceSpec - Context context.Context - Version uint64 -} - -// UpdateService updates the service at ID with the options -// -// See https://goo.gl/wu3MmS for more details. -func (c *Client) UpdateService(id string, opts UpdateServiceOptions) error { - headers, err := headersWithAuth(opts.Auth) - if err != nil { - return err - } - params := make(url.Values) - params.Set("version", strconv.FormatUint(opts.Version, 10)) - resp, err := c.do("POST", "/services/"+id+"/update?"+params.Encode(), doOptions{ - headers: headers, - data: opts.ServiceSpec, - forceJSON: true, - context: opts.Context, - }) - if err != nil { - if e, ok := err.(*Error); ok && e.Status == http.StatusNotFound { - return &NoSuchService{ID: id} - } - return err - } - defer resp.Body.Close() - return nil -} - -// InspectService returns information about a service by its ID. -// -// See https://goo.gl/dHmr75 for more details. -func (c *Client) InspectService(id string) (*swarm.Service, error) { - path := "/services/" + id - resp, err := c.do("GET", path, doOptions{}) - if err != nil { - if e, ok := err.(*Error); ok && e.Status == http.StatusNotFound { - return nil, &NoSuchService{ID: id} - } - return nil, err - } - defer resp.Body.Close() - var service swarm.Service - if err := json.NewDecoder(resp.Body).Decode(&service); err != nil { - return nil, err - } - return &service, nil -} - -// ListServicesOptions specify parameters to the ListServices function. -// -// See https://goo.gl/DwvNMd for more details. -type ListServicesOptions struct { - Filters map[string][]string - Context context.Context -} - -// ListServices returns a slice of services matching the given criteria. -// -// See https://goo.gl/DwvNMd for more details. -func (c *Client) ListServices(opts ListServicesOptions) ([]swarm.Service, error) { - path := "/services?" + queryString(opts) - resp, err := c.do("GET", path, doOptions{context: opts.Context}) - if err != nil { - return nil, err - } - defer resp.Body.Close() - var services []swarm.Service - if err := json.NewDecoder(resp.Body).Decode(&services); err != nil { - return nil, err - } - return services, nil -} - -// LogsServiceOptions represents the set of options used when getting logs from a -// service. -type LogsServiceOptions struct { - Context context.Context - Service string `qs:"-"` - OutputStream io.Writer `qs:"-"` - ErrorStream io.Writer `qs:"-"` - InactivityTimeout time.Duration `qs:"-"` - Tail string - - // Use raw terminal? Usually true when the container contains a TTY. - RawTerminal bool `qs:"-"` - Since int64 - Follow bool - Stdout bool - Stderr bool - Timestamps bool - Details bool -} - -// GetServiceLogs gets stdout and stderr logs from the specified service. -// -// When LogsServiceOptions.RawTerminal is set to false, go-dockerclient will multiplex -// the streams and send the containers stdout to LogsServiceOptions.OutputStream, and -// stderr to LogsServiceOptions.ErrorStream. -// -// When LogsServiceOptions.RawTerminal is true, callers will get the raw stream on -// LogsServiceOptions.OutputStream. -func (c *Client) GetServiceLogs(opts LogsServiceOptions) error { - if opts.Service == "" { - return &NoSuchService{ID: opts.Service} - } - if opts.Tail == "" { - opts.Tail = "all" - } - path := "/services/" + opts.Service + "/logs?" + queryString(opts) - return c.stream("GET", path, streamOptions{ - setRawTerminal: opts.RawTerminal, - stdout: opts.OutputStream, - stderr: opts.ErrorStream, - inactivityTimeout: opts.InactivityTimeout, - context: opts.Context, - }) -} diff --git a/vendor/github.com/fsouza/go-dockerclient/swarm.go b/vendor/github.com/fsouza/go-dockerclient/swarm.go index 6d9086a5522d..ae37cd1e8c32 100644 --- a/vendor/github.com/fsouza/go-dockerclient/swarm.go +++ b/vendor/github.com/fsouza/go-dockerclient/swarm.go @@ -5,6 +5,7 @@ package docker import ( + "context" "encoding/json" "errors" "net/http" @@ -12,7 +13,6 @@ import ( "strconv" "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" ) var ( @@ -36,13 +36,14 @@ type InitSwarmOptions struct { // See https://goo.gl/ZWyG1M for more details. func (c *Client) InitSwarm(opts InitSwarmOptions) (string, error) { path := "/swarm/init" - resp, err := c.do("POST", path, doOptions{ + resp, err := c.do(http.MethodPost, path, doOptions{ data: opts.InitRequest, forceJSON: true, context: opts.Context, }) if err != nil { - if e, ok := err.(*Error); ok && (e.Status == http.StatusNotAcceptable || e.Status == http.StatusServiceUnavailable) { + var e *Error + if errors.As(err, &e) && (e.Status == http.StatusNotAcceptable || e.Status == http.StatusServiceUnavailable) { return "", ErrNodeAlreadyInSwarm } return "", err @@ -66,13 +67,14 @@ type JoinSwarmOptions struct { // See https://goo.gl/N59IP1 for more details. func (c *Client) JoinSwarm(opts JoinSwarmOptions) error { path := "/swarm/join" - resp, err := c.do("POST", path, doOptions{ + resp, err := c.do(http.MethodPost, path, doOptions{ data: opts.JoinRequest, forceJSON: true, context: opts.Context, }) if err != nil { - if e, ok := err.(*Error); ok && (e.Status == http.StatusNotAcceptable || e.Status == http.StatusServiceUnavailable) { + var e *Error + if errors.As(err, &e) && (e.Status == http.StatusNotAcceptable || e.Status == http.StatusServiceUnavailable) { return ErrNodeAlreadyInSwarm } } @@ -93,11 +95,12 @@ func (c *Client) LeaveSwarm(opts LeaveSwarmOptions) error { params := make(url.Values) params.Set("force", strconv.FormatBool(opts.Force)) path := "/swarm/leave?" + params.Encode() - resp, err := c.do("POST", path, doOptions{ + resp, err := c.do(http.MethodPost, path, doOptions{ context: opts.Context, }) if err != nil { - if e, ok := err.(*Error); ok && (e.Status == http.StatusNotAcceptable || e.Status == http.StatusServiceUnavailable) { + var e *Error + if errors.As(err, &e) && (e.Status == http.StatusNotAcceptable || e.Status == http.StatusServiceUnavailable) { return ErrNodeNotInSwarm } } @@ -123,13 +126,14 @@ func (c *Client) UpdateSwarm(opts UpdateSwarmOptions) error { params.Set("rotateWorkerToken", strconv.FormatBool(opts.RotateWorkerToken)) params.Set("rotateManagerToken", strconv.FormatBool(opts.RotateManagerToken)) path := "/swarm/update?" + params.Encode() - resp, err := c.do("POST", path, doOptions{ + resp, err := c.do(http.MethodPost, path, doOptions{ data: opts.Swarm, forceJSON: true, context: opts.Context, }) if err != nil { - if e, ok := err.(*Error); ok && (e.Status == http.StatusNotAcceptable || e.Status == http.StatusServiceUnavailable) { + var e *Error + if errors.As(err, &e) && (e.Status == http.StatusNotAcceptable || e.Status == http.StatusServiceUnavailable) { return ErrNodeNotInSwarm } } @@ -141,11 +145,12 @@ func (c *Client) UpdateSwarm(opts UpdateSwarmOptions) error { // See https://goo.gl/MFwgX9 for more details. func (c *Client) InspectSwarm(ctx context.Context) (swarm.Swarm, error) { response := swarm.Swarm{} - resp, err := c.do("GET", "/swarm", doOptions{ + resp, err := c.do(http.MethodGet, "/swarm", doOptions{ context: ctx, }) if err != nil { - if e, ok := err.(*Error); ok && (e.Status == http.StatusNotAcceptable || e.Status == http.StatusServiceUnavailable) { + var e *Error + if errors.As(err, &e) && (e.Status == http.StatusNotAcceptable || e.Status == http.StatusServiceUnavailable) { return response, ErrNodeNotInSwarm } return response, err diff --git a/vendor/github.com/fsouza/go-dockerclient/swarm_configs.go b/vendor/github.com/fsouza/go-dockerclient/swarm_configs.go new file mode 100644 index 000000000000..055e99544aae --- /dev/null +++ b/vendor/github.com/fsouza/go-dockerclient/swarm_configs.go @@ -0,0 +1,175 @@ +// Copyright 2017 go-dockerclient authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package docker + +import ( + "context" + "encoding/json" + "errors" + "net/http" + "net/url" + "strconv" + + "github.com/docker/docker/api/types/swarm" +) + +// NoSuchConfig is the error returned when a given config does not exist. +type NoSuchConfig struct { + ID string + Err error +} + +func (err *NoSuchConfig) Error() string { + if err.Err != nil { + return err.Err.Error() + } + return "No such config: " + err.ID +} + +// CreateConfigOptions specify parameters to the CreateConfig function. +// +// See https://goo.gl/KrVjHz for more details. +type CreateConfigOptions struct { + Auth AuthConfiguration `qs:"-"` + swarm.ConfigSpec + Context context.Context +} + +// CreateConfig creates a new config, returning the config instance +// or an error in case of failure. +// +// See https://goo.gl/KrVjHz for more details. +func (c *Client) CreateConfig(opts CreateConfigOptions) (*swarm.Config, error) { + headers, err := headersWithAuth(opts.Auth) + if err != nil { + return nil, err + } + path := "/configs/create?" + queryString(opts) + resp, err := c.do(http.MethodPost, path, doOptions{ + headers: headers, + data: opts.ConfigSpec, + forceJSON: true, + context: opts.Context, + }) + if err != nil { + return nil, err + } + defer resp.Body.Close() + var config swarm.Config + if err := json.NewDecoder(resp.Body).Decode(&config); err != nil { + return nil, err + } + return &config, nil +} + +// RemoveConfigOptions encapsulates options to remove a config. +// +// See https://goo.gl/Tqrtya for more details. +type RemoveConfigOptions struct { + ID string `qs:"-"` + Context context.Context +} + +// RemoveConfig removes a config, returning an error in case of failure. +// +// See https://goo.gl/Tqrtya for more details. +func (c *Client) RemoveConfig(opts RemoveConfigOptions) error { + path := "/configs/" + opts.ID + resp, err := c.do(http.MethodDelete, path, doOptions{context: opts.Context}) + if err != nil { + var e *Error + if errors.As(err, &e) && e.Status == http.StatusNotFound { + return &NoSuchConfig{ID: opts.ID} + } + return err + } + resp.Body.Close() + return nil +} + +// UpdateConfigOptions specify parameters to the UpdateConfig function. +// +// See https://goo.gl/wu3MmS for more details. +type UpdateConfigOptions struct { + Auth AuthConfiguration `qs:"-"` + swarm.ConfigSpec + Context context.Context + Version uint64 +} + +// UpdateConfig updates the config at ID with the options +// +// Only label can be updated +// https://docs.docker.com/engine/api/v1.33/#operation/ConfigUpdate +// See https://goo.gl/wu3MmS for more details. +func (c *Client) UpdateConfig(id string, opts UpdateConfigOptions) error { + headers, err := headersWithAuth(opts.Auth) + if err != nil { + return err + } + params := make(url.Values) + params.Set("version", strconv.FormatUint(opts.Version, 10)) + resp, err := c.do(http.MethodPost, "/configs/"+id+"/update?"+params.Encode(), doOptions{ + headers: headers, + data: opts.ConfigSpec, + forceJSON: true, + context: opts.Context, + }) + if err != nil { + var e *Error + if errors.As(err, &e) && e.Status == http.StatusNotFound { + return &NoSuchConfig{ID: id} + } + return err + } + defer resp.Body.Close() + return nil +} + +// InspectConfig returns information about a config by its ID. +// +// See https://goo.gl/dHmr75 for more details. +func (c *Client) InspectConfig(id string) (*swarm.Config, error) { + path := "/configs/" + id + resp, err := c.do(http.MethodGet, path, doOptions{}) + if err != nil { + var e *Error + if errors.As(err, &e) && e.Status == http.StatusNotFound { + return nil, &NoSuchConfig{ID: id} + } + return nil, err + } + defer resp.Body.Close() + var config swarm.Config + if err := json.NewDecoder(resp.Body).Decode(&config); err != nil { + return nil, err + } + return &config, nil +} + +// ListConfigsOptions specify parameters to the ListConfigs function. +// +// See https://goo.gl/DwvNMd for more details. +type ListConfigsOptions struct { + Filters map[string][]string + Context context.Context +} + +// ListConfigs returns a slice of configs matching the given criteria. +// +// See https://goo.gl/DwvNMd for more details. +func (c *Client) ListConfigs(opts ListConfigsOptions) ([]swarm.Config, error) { + path := "/configs?" + queryString(opts) + resp, err := c.do(http.MethodGet, path, doOptions{context: opts.Context}) + if err != nil { + return nil, err + } + defer resp.Body.Close() + var configs []swarm.Config + if err := json.NewDecoder(resp.Body).Decode(&configs); err != nil { + return nil, err + } + return configs, nil +} diff --git a/vendor/github.com/fsouza/go-dockerclient/swarm_node.go b/vendor/github.com/fsouza/go-dockerclient/swarm_node.go new file mode 100644 index 000000000000..8538a167b96d --- /dev/null +++ b/vendor/github.com/fsouza/go-dockerclient/swarm_node.go @@ -0,0 +1,134 @@ +// Copyright 2016 go-dockerclient authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package docker + +import ( + "context" + "encoding/json" + "errors" + "net/http" + "net/url" + "strconv" + + "github.com/docker/docker/api/types/swarm" +) + +// NoSuchNode is the error returned when a given node does not exist. +type NoSuchNode struct { + ID string + Err error +} + +func (err *NoSuchNode) Error() string { + if err.Err != nil { + return err.Err.Error() + } + return "No such node: " + err.ID +} + +// ListNodesOptions specify parameters to the ListNodes function. +// +// See http://goo.gl/3K4GwU for more details. +type ListNodesOptions struct { + Filters map[string][]string + Context context.Context +} + +// ListNodes returns a slice of nodes matching the given criteria. +// +// See http://goo.gl/3K4GwU for more details. +func (c *Client) ListNodes(opts ListNodesOptions) ([]swarm.Node, error) { + path := "/nodes?" + queryString(opts) + resp, err := c.do(http.MethodGet, path, doOptions{context: opts.Context}) + if err != nil { + return nil, err + } + defer resp.Body.Close() + var nodes []swarm.Node + if err := json.NewDecoder(resp.Body).Decode(&nodes); err != nil { + return nil, err + } + return nodes, nil +} + +// InspectNode returns information about a node by its ID. +// +// See http://goo.gl/WjkTOk for more details. +func (c *Client) InspectNode(id string) (*swarm.Node, error) { + resp, err := c.do(http.MethodGet, "/nodes/"+id, doOptions{}) + if err != nil { + var e *Error + if errors.As(err, &e) && e.Status == http.StatusNotFound { + return nil, &NoSuchNode{ID: id} + } + return nil, err + } + defer resp.Body.Close() + var node swarm.Node + if err := json.NewDecoder(resp.Body).Decode(&node); err != nil { + return nil, err + } + return &node, nil +} + +// UpdateNodeOptions specify parameters to the NodeUpdate function. +// +// See http://goo.gl/VPBFgA for more details. +type UpdateNodeOptions struct { + swarm.NodeSpec + Version uint64 + Context context.Context +} + +// UpdateNode updates a node. +// +// See http://goo.gl/VPBFgA for more details. +func (c *Client) UpdateNode(id string, opts UpdateNodeOptions) error { + params := make(url.Values) + params.Set("version", strconv.FormatUint(opts.Version, 10)) + path := "/nodes/" + id + "/update?" + params.Encode() + resp, err := c.do(http.MethodPost, path, doOptions{ + context: opts.Context, + forceJSON: true, + data: opts.NodeSpec, + }) + if err != nil { + var e *Error + if errors.As(err, &e) && e.Status == http.StatusNotFound { + return &NoSuchNode{ID: id} + } + return err + } + resp.Body.Close() + return nil +} + +// RemoveNodeOptions specify parameters to the RemoveNode function. +// +// See http://goo.gl/0SNvYg for more details. +type RemoveNodeOptions struct { + ID string + Force bool + Context context.Context +} + +// RemoveNode removes a node. +// +// See http://goo.gl/0SNvYg for more details. +func (c *Client) RemoveNode(opts RemoveNodeOptions) error { + params := make(url.Values) + params.Set("force", strconv.FormatBool(opts.Force)) + path := "/nodes/" + opts.ID + "?" + params.Encode() + resp, err := c.do(http.MethodDelete, path, doOptions{context: opts.Context}) + if err != nil { + var e *Error + if errors.As(err, &e) && e.Status == http.StatusNotFound { + return &NoSuchNode{ID: opts.ID} + } + return err + } + resp.Body.Close() + return nil +} diff --git a/vendor/github.com/fsouza/go-dockerclient/swarm_secrets.go b/vendor/github.com/fsouza/go-dockerclient/swarm_secrets.go new file mode 100644 index 000000000000..375e6e5ba377 --- /dev/null +++ b/vendor/github.com/fsouza/go-dockerclient/swarm_secrets.go @@ -0,0 +1,175 @@ +// Copyright 2016 go-dockerclient authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package docker + +import ( + "context" + "encoding/json" + "errors" + "net/http" + "net/url" + "strconv" + + "github.com/docker/docker/api/types/swarm" +) + +// NoSuchSecret is the error returned when a given secret does not exist. +type NoSuchSecret struct { + ID string + Err error +} + +func (err *NoSuchSecret) Error() string { + if err.Err != nil { + return err.Err.Error() + } + return "No such secret: " + err.ID +} + +// CreateSecretOptions specify parameters to the CreateSecret function. +// +// See https://goo.gl/KrVjHz for more details. +type CreateSecretOptions struct { + Auth AuthConfiguration `qs:"-"` + swarm.SecretSpec + Context context.Context +} + +// CreateSecret creates a new secret, returning the secret instance +// or an error in case of failure. +// +// See https://goo.gl/KrVjHz for more details. +func (c *Client) CreateSecret(opts CreateSecretOptions) (*swarm.Secret, error) { + headers, err := headersWithAuth(opts.Auth) + if err != nil { + return nil, err + } + path := "/secrets/create?" + queryString(opts) + resp, err := c.do(http.MethodPost, path, doOptions{ + headers: headers, + data: opts.SecretSpec, + forceJSON: true, + context: opts.Context, + }) + if err != nil { + return nil, err + } + defer resp.Body.Close() + var secret swarm.Secret + if err := json.NewDecoder(resp.Body).Decode(&secret); err != nil { + return nil, err + } + return &secret, nil +} + +// RemoveSecretOptions encapsulates options to remove a secret. +// +// See https://goo.gl/Tqrtya for more details. +type RemoveSecretOptions struct { + ID string `qs:"-"` + Context context.Context +} + +// RemoveSecret removes a secret, returning an error in case of failure. +// +// See https://goo.gl/Tqrtya for more details. +func (c *Client) RemoveSecret(opts RemoveSecretOptions) error { + path := "/secrets/" + opts.ID + resp, err := c.do(http.MethodDelete, path, doOptions{context: opts.Context}) + if err != nil { + var e *Error + if errors.As(err, &e) && e.Status == http.StatusNotFound { + return &NoSuchSecret{ID: opts.ID} + } + return err + } + resp.Body.Close() + return nil +} + +// UpdateSecretOptions specify parameters to the UpdateSecret function. +// +// Only label can be updated +// See https://docs.docker.com/engine/api/v1.33/#operation/SecretUpdate +// See https://goo.gl/wu3MmS for more details. +type UpdateSecretOptions struct { + Auth AuthConfiguration `qs:"-"` + swarm.SecretSpec + Context context.Context + Version uint64 +} + +// UpdateSecret updates the secret at ID with the options +// +// See https://goo.gl/wu3MmS for more details. +func (c *Client) UpdateSecret(id string, opts UpdateSecretOptions) error { + headers, err := headersWithAuth(opts.Auth) + if err != nil { + return err + } + params := make(url.Values) + params.Set("version", strconv.FormatUint(opts.Version, 10)) + resp, err := c.do(http.MethodPost, "/secrets/"+id+"/update?"+params.Encode(), doOptions{ + headers: headers, + data: opts.SecretSpec, + forceJSON: true, + context: opts.Context, + }) + if err != nil { + var e *Error + if errors.As(err, &e) && e.Status == http.StatusNotFound { + return &NoSuchSecret{ID: id} + } + return err + } + defer resp.Body.Close() + return nil +} + +// InspectSecret returns information about a secret by its ID. +// +// See https://goo.gl/dHmr75 for more details. +func (c *Client) InspectSecret(id string) (*swarm.Secret, error) { + path := "/secrets/" + id + resp, err := c.do(http.MethodGet, path, doOptions{}) + if err != nil { + var e *Error + if errors.As(err, &e) && e.Status == http.StatusNotFound { + return nil, &NoSuchSecret{ID: id} + } + return nil, err + } + defer resp.Body.Close() + var secret swarm.Secret + if err := json.NewDecoder(resp.Body).Decode(&secret); err != nil { + return nil, err + } + return &secret, nil +} + +// ListSecretsOptions specify parameters to the ListSecrets function. +// +// See https://goo.gl/DwvNMd for more details. +type ListSecretsOptions struct { + Filters map[string][]string + Context context.Context +} + +// ListSecrets returns a slice of secrets matching the given criteria. +// +// See https://goo.gl/DwvNMd for more details. +func (c *Client) ListSecrets(opts ListSecretsOptions) ([]swarm.Secret, error) { + path := "/secrets?" + queryString(opts) + resp, err := c.do(http.MethodGet, path, doOptions{context: opts.Context}) + if err != nil { + return nil, err + } + defer resp.Body.Close() + var secrets []swarm.Secret + if err := json.NewDecoder(resp.Body).Decode(&secrets); err != nil { + return nil, err + } + return secrets, nil +} diff --git a/vendor/github.com/fsouza/go-dockerclient/swarm_service.go b/vendor/github.com/fsouza/go-dockerclient/swarm_service.go new file mode 100644 index 000000000000..0d0f007b722a --- /dev/null +++ b/vendor/github.com/fsouza/go-dockerclient/swarm_service.go @@ -0,0 +1,218 @@ +// Copyright 2016 go-dockerclient authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package docker + +import ( + "context" + "encoding/json" + "errors" + "io" + "net/http" + "time" + + "github.com/docker/docker/api/types/swarm" +) + +// NoSuchService is the error returned when a given service does not exist. +type NoSuchService struct { + ID string + Err error +} + +func (err *NoSuchService) Error() string { + if err.Err != nil { + return err.Err.Error() + } + return "No such service: " + err.ID +} + +// CreateServiceOptions specify parameters to the CreateService function. +// +// See https://goo.gl/KrVjHz for more details. +type CreateServiceOptions struct { + Auth AuthConfiguration `qs:"-"` + swarm.ServiceSpec + Context context.Context +} + +// CreateService creates a new service, returning the service instance +// or an error in case of failure. +// +// See https://goo.gl/KrVjHz for more details. +func (c *Client) CreateService(opts CreateServiceOptions) (*swarm.Service, error) { + headers, err := headersWithAuth(opts.Auth) + if err != nil { + return nil, err + } + path := "/services/create?" + queryString(opts) + resp, err := c.do(http.MethodPost, path, doOptions{ + headers: headers, + data: opts.ServiceSpec, + forceJSON: true, + context: opts.Context, + }) + if err != nil { + return nil, err + } + defer resp.Body.Close() + var service swarm.Service + if err := json.NewDecoder(resp.Body).Decode(&service); err != nil { + return nil, err + } + return &service, nil +} + +// RemoveServiceOptions encapsulates options to remove a service. +// +// See https://goo.gl/Tqrtya for more details. +type RemoveServiceOptions struct { + ID string `qs:"-"` + Context context.Context +} + +// RemoveService removes a service, returning an error in case of failure. +// +// See https://goo.gl/Tqrtya for more details. +func (c *Client) RemoveService(opts RemoveServiceOptions) error { + path := "/services/" + opts.ID + resp, err := c.do(http.MethodDelete, path, doOptions{context: opts.Context}) + if err != nil { + var e *Error + if errors.As(err, &e) && e.Status == http.StatusNotFound { + return &NoSuchService{ID: opts.ID} + } + return err + } + resp.Body.Close() + return nil +} + +// UpdateServiceOptions specify parameters to the UpdateService function. +// +// See https://goo.gl/wu3MmS for more details. +type UpdateServiceOptions struct { + Auth AuthConfiguration `qs:"-"` + swarm.ServiceSpec `qs:"-"` + Context context.Context + Version uint64 + Rollback string +} + +// UpdateService updates the service at ID with the options +// +// See https://goo.gl/wu3MmS for more details. +func (c *Client) UpdateService(id string, opts UpdateServiceOptions) error { + headers, err := headersWithAuth(opts.Auth) + if err != nil { + return err + } + resp, err := c.do(http.MethodPost, "/services/"+id+"/update?"+queryString(opts), doOptions{ + headers: headers, + data: opts.ServiceSpec, + forceJSON: true, + context: opts.Context, + }) + if err != nil { + var e *Error + if errors.As(err, &e) && e.Status == http.StatusNotFound { + return &NoSuchService{ID: id} + } + return err + } + defer resp.Body.Close() + return nil +} + +// InspectService returns information about a service by its ID. +// +// See https://goo.gl/dHmr75 for more details. +func (c *Client) InspectService(id string) (*swarm.Service, error) { + path := "/services/" + id + resp, err := c.do(http.MethodGet, path, doOptions{}) + if err != nil { + var e *Error + if errors.As(err, &e) && e.Status == http.StatusNotFound { + return nil, &NoSuchService{ID: id} + } + return nil, err + } + defer resp.Body.Close() + var service swarm.Service + if err := json.NewDecoder(resp.Body).Decode(&service); err != nil { + return nil, err + } + return &service, nil +} + +// ListServicesOptions specify parameters to the ListServices function. +// +// See https://goo.gl/DwvNMd for more details. +type ListServicesOptions struct { + Filters map[string][]string + Status bool + Context context.Context +} + +// ListServices returns a slice of services matching the given criteria. +// +// See https://goo.gl/DwvNMd for more details. +func (c *Client) ListServices(opts ListServicesOptions) ([]swarm.Service, error) { + path := "/services?" + queryString(opts) + resp, err := c.do(http.MethodGet, path, doOptions{context: opts.Context}) + if err != nil { + return nil, err + } + defer resp.Body.Close() + var services []swarm.Service + if err := json.NewDecoder(resp.Body).Decode(&services); err != nil { + return nil, err + } + return services, nil +} + +// LogsServiceOptions represents the set of options used when getting logs from a +// service. +type LogsServiceOptions struct { + Context context.Context + Service string `qs:"-"` + OutputStream io.Writer `qs:"-"` + ErrorStream io.Writer `qs:"-"` + InactivityTimeout time.Duration `qs:"-"` + Tail string + Since int64 + + // Use raw terminal? Usually true when the container contains a TTY. + RawTerminal bool `qs:"-"` + Follow bool + Stdout bool + Stderr bool + Timestamps bool + Details bool +} + +// GetServiceLogs gets stdout and stderr logs from the specified service. +// +// When LogsServiceOptions.RawTerminal is set to false, go-dockerclient will multiplex +// the streams and send the containers stdout to LogsServiceOptions.OutputStream, and +// stderr to LogsServiceOptions.ErrorStream. +// +// When LogsServiceOptions.RawTerminal is true, callers will get the raw stream on +// LogsServiceOptions.OutputStream. +func (c *Client) GetServiceLogs(opts LogsServiceOptions) error { + if opts.Service == "" { + return &NoSuchService{ID: opts.Service} + } + if opts.Tail == "" { + opts.Tail = "all" + } + path := "/services/" + opts.Service + "/logs?" + queryString(opts) + return c.stream(http.MethodGet, path, streamOptions{ + setRawTerminal: opts.RawTerminal, + stdout: opts.OutputStream, + stderr: opts.ErrorStream, + inactivityTimeout: opts.InactivityTimeout, + context: opts.Context, + }) +} diff --git a/vendor/github.com/fsouza/go-dockerclient/swarm_task.go b/vendor/github.com/fsouza/go-dockerclient/swarm_task.go new file mode 100644 index 000000000000..9321368d3f3d --- /dev/null +++ b/vendor/github.com/fsouza/go-dockerclient/swarm_task.go @@ -0,0 +1,72 @@ +// Copyright 2016 go-dockerclient authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package docker + +import ( + "context" + "encoding/json" + "errors" + "net/http" + + "github.com/docker/docker/api/types/swarm" +) + +// NoSuchTask is the error returned when a given task does not exist. +type NoSuchTask struct { + ID string + Err error +} + +func (err *NoSuchTask) Error() string { + if err.Err != nil { + return err.Err.Error() + } + return "No such task: " + err.ID +} + +// ListTasksOptions specify parameters to the ListTasks function. +// +// See http://goo.gl/rByLzw for more details. +type ListTasksOptions struct { + Filters map[string][]string + Context context.Context +} + +// ListTasks returns a slice of tasks matching the given criteria. +// +// See http://goo.gl/rByLzw for more details. +func (c *Client) ListTasks(opts ListTasksOptions) ([]swarm.Task, error) { + path := "/tasks?" + queryString(opts) + resp, err := c.do(http.MethodGet, path, doOptions{context: opts.Context}) + if err != nil { + return nil, err + } + defer resp.Body.Close() + var tasks []swarm.Task + if err := json.NewDecoder(resp.Body).Decode(&tasks); err != nil { + return nil, err + } + return tasks, nil +} + +// InspectTask returns information about a task by its ID. +// +// See http://goo.gl/kyziuq for more details. +func (c *Client) InspectTask(id string) (*swarm.Task, error) { + resp, err := c.do(http.MethodGet, "/tasks/"+id, doOptions{}) + if err != nil { + var e *Error + if errors.As(err, &e) && e.Status == http.StatusNotFound { + return nil, &NoSuchTask{ID: id} + } + return nil, err + } + defer resp.Body.Close() + var task swarm.Task + if err := json.NewDecoder(resp.Body).Decode(&task); err != nil { + return nil, err + } + return &task, nil +} diff --git a/vendor/github.com/fsouza/go-dockerclient/system.go b/vendor/github.com/fsouza/go-dockerclient/system.go new file mode 100644 index 000000000000..46b9faf00e2b --- /dev/null +++ b/vendor/github.com/fsouza/go-dockerclient/system.go @@ -0,0 +1,73 @@ +package docker + +import ( + "context" + "encoding/json" + "net/http" +) + +// VolumeUsageData represents usage data from the docker system api +// More Info Here https://dockr.ly/2PNzQyO +type VolumeUsageData struct { + + // The number of containers referencing this volume. This field + // is set to `-1` if the reference-count is not available. + // + // Required: true + RefCount int64 `json:"RefCount"` + + // Amount of disk space used by the volume (in bytes). This information + // is only available for volumes created with the `"local"` volume + // driver. For volumes created with other volume drivers, this field + // is set to `-1` ("not available") + // + // Required: true + Size int64 `json:"Size"` +} + +// ImageSummary represents data about what images are +// currently known to docker +// More Info Here https://dockr.ly/2PNzQyO +type ImageSummary struct { + Containers int64 `json:"Containers"` + Created int64 `json:"Created"` + ID string `json:"Id"` + Labels map[string]string `json:"Labels"` + ParentID string `json:"ParentId"` + RepoDigests []string `json:"RepoDigests"` + RepoTags []string `json:"RepoTags"` + SharedSize int64 `json:"SharedSize"` + Size int64 `json:"Size"` + VirtualSize int64 `json:"VirtualSize"` +} + +// DiskUsage holds information about what docker is using disk space on. +// More Info Here https://dockr.ly/2PNzQyO +type DiskUsage struct { + LayersSize int64 + Images []*ImageSummary + Containers []*APIContainers + Volumes []*Volume +} + +// DiskUsageOptions only contains a context for canceling. +type DiskUsageOptions struct { + Context context.Context +} + +// DiskUsage returns a *DiskUsage describing what docker is using disk on. +// +// More Info Here https://dockr.ly/2PNzQyO +func (c *Client) DiskUsage(opts DiskUsageOptions) (*DiskUsage, error) { + path := "/system/df" + resp, err := c.do(http.MethodGet, path, doOptions{context: opts.Context}) + if err != nil { + return nil, err + } + defer resp.Body.Close() + var du *DiskUsage + if err := json.NewDecoder(resp.Body).Decode(&du); err != nil { + return nil, err + } + return du, nil +} diff --git a/vendor/github.com/fsouza/go-dockerclient/tar.go b/vendor/github.com/fsouza/go-dockerclient/tar.go index be4dfa573e43..f27a7bbf21ff 100644 --- a/vendor/github.com/fsouza/go-dockerclient/tar.go +++ b/vendor/github.com/fsouza/go-dockerclient/tar.go @@ -18,6 +18,11 @@ import ( ) func createTarStream(srcPath, dockerfilePath string) (io.ReadCloser, error) { + srcPath, err := filepath.Abs(srcPath) + if err != nil { + return nil, err + } + excludes, err := parseDockerignore(srcPath) if err != nil { return nil, err @@ -42,7 +47,7 @@ func createTarStream(srcPath, dockerfilePath string) (io.ReadCloser, error) { } keepThem, err := fileutils.Matches(includeFile, excludes) if err != nil { - return nil, fmt.Errorf("cannot match .dockerfile: '%s', error: %s", includeFile, err) + return nil, fmt.Errorf("cannot match .dockerfileignore: '%s', error: %w", includeFile, err) } if keepThem { includes = append(includes, includeFile) @@ -80,7 +85,7 @@ func validateContextDirectory(srcPath string, excludes []string) error { if err != nil { if os.IsPermission(err) { - return fmt.Errorf("can't stat '%s'", filePath) + return fmt.Errorf("cannot stat %q: %w", filePath, err) } if os.IsNotExist(err) { return nil @@ -96,8 +101,8 @@ func validateContextDirectory(srcPath string, excludes []string) error { if !f.IsDir() { currentFile, err := os.Open(filePath) - if err != nil && os.IsPermission(err) { - return fmt.Errorf("no permission to read from '%s'", filePath) + if err != nil { + return fmt.Errorf("cannot open %q for reading: %w", filePath, err) } currentFile.Close() } @@ -109,7 +114,7 @@ func parseDockerignore(root string) ([]string, error) { var excludes []string ignore, err := ioutil.ReadFile(path.Join(root, ".dockerignore")) if err != nil && !os.IsNotExist(err) { - return excludes, fmt.Errorf("error reading .dockerignore: '%s'", err) + return excludes, fmt.Errorf("error reading .dockerignore: %w", err) } excludes = strings.Split(string(ignore), "\n") diff --git a/vendor/github.com/fsouza/go-dockerclient/task.go b/vendor/github.com/fsouza/go-dockerclient/task.go deleted file mode 100644 index b1dad4b231bd..000000000000 --- a/vendor/github.com/fsouza/go-dockerclient/task.go +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2016 go-dockerclient authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package docker - -import ( - "encoding/json" - "net/http" - - "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" -) - -// NoSuchTask is the error returned when a given task does not exist. -type NoSuchTask struct { - ID string - Err error -} - -func (err *NoSuchTask) Error() string { - if err.Err != nil { - return err.Err.Error() - } - return "No such task: " + err.ID -} - -// ListTasksOptions specify parameters to the ListTasks function. -// -// See http://goo.gl/rByLzw for more details. -type ListTasksOptions struct { - Filters map[string][]string - Context context.Context -} - -// ListTasks returns a slice of tasks matching the given criteria. -// -// See http://goo.gl/rByLzw for more details. -func (c *Client) ListTasks(opts ListTasksOptions) ([]swarm.Task, error) { - path := "/tasks?" + queryString(opts) - resp, err := c.do("GET", path, doOptions{context: opts.Context}) - if err != nil { - return nil, err - } - defer resp.Body.Close() - var tasks []swarm.Task - if err := json.NewDecoder(resp.Body).Decode(&tasks); err != nil { - return nil, err - } - return tasks, nil -} - -// InspectTask returns information about a task by its ID. -// -// See http://goo.gl/kyziuq for more details. -func (c *Client) InspectTask(id string) (*swarm.Task, error) { - resp, err := c.do("GET", "/tasks/"+id, doOptions{}) - if err != nil { - if e, ok := err.(*Error); ok && e.Status == http.StatusNotFound { - return nil, &NoSuchTask{ID: id} - } - return nil, err - } - defer resp.Body.Close() - var task swarm.Task - if err := json.NewDecoder(resp.Body).Decode(&task); err != nil { - return nil, err - } - return &task, nil -} diff --git a/vendor/github.com/fsouza/go-dockerclient/tls.go b/vendor/github.com/fsouza/go-dockerclient/tls.go index bb5790b5f0bf..56f00589bea6 100644 --- a/vendor/github.com/fsouza/go-dockerclient/tls.go +++ b/vendor/github.com/fsouza/go-dockerclient/tls.go @@ -38,7 +38,7 @@ func tlsDialWithDialer(dialer *net.Dialer, network, addr string, config *tls.Con timeout := dialer.Timeout if !dialer.Deadline.IsZero() { - deadlineTimeout := dialer.Deadline.Sub(time.Now()) + deadlineTimeout := time.Until(dialer.Deadline) if timeout == 0 || deadlineTimeout < timeout { timeout = deadlineTimeout } @@ -106,13 +106,11 @@ func copyTLSConfig(cfg *tls.Config) *tls.Config { InsecureSkipVerify: cfg.InsecureSkipVerify, MaxVersion: cfg.MaxVersion, MinVersion: cfg.MinVersion, - NameToCertificate: cfg.NameToCertificate, NextProtos: cfg.NextProtos, PreferServerCipherSuites: cfg.PreferServerCipherSuites, - Rand: cfg.Rand, - RootCAs: cfg.RootCAs, - ServerName: cfg.ServerName, - SessionTicketKey: cfg.SessionTicketKey, - SessionTicketsDisabled: cfg.SessionTicketsDisabled, + Rand: cfg.Rand, + RootCAs: cfg.RootCAs, + ServerName: cfg.ServerName, + SessionTicketsDisabled: cfg.SessionTicketsDisabled, } } diff --git a/vendor/github.com/fsouza/go-dockerclient/volume.go b/vendor/github.com/fsouza/go-dockerclient/volume.go index 3c7bdeaa747e..9f8a435c91f1 100644 --- a/vendor/github.com/fsouza/go-dockerclient/volume.go +++ b/vendor/github.com/fsouza/go-dockerclient/volume.go @@ -5,11 +5,11 @@ package docker import ( + "context" "encoding/json" "errors" "net/http" - - "golang.org/x/net/context" + "time" ) var ( @@ -22,17 +22,19 @@ var ( // Volume represents a volume. // -// See https://goo.gl/FZA4BK for more details. +// See https://goo.gl/3wgTsd for more details. type Volume struct { Name string `json:"Name" yaml:"Name" toml:"Name"` Driver string `json:"Driver,omitempty" yaml:"Driver,omitempty" toml:"Driver,omitempty"` Mountpoint string `json:"Mountpoint,omitempty" yaml:"Mountpoint,omitempty" toml:"Mountpoint,omitempty"` Labels map[string]string `json:"Labels,omitempty" yaml:"Labels,omitempty" toml:"Labels,omitempty"` + Options map[string]string `json:"Options,omitempty" yaml:"Options,omitempty" toml:"Options,omitempty"` + CreatedAt time.Time `json:"CreatedAt,omitempty" yaml:"CreatedAt,omitempty" toml:"CreatedAt,omitempty"` } // ListVolumesOptions specify parameters to the ListVolumes function. // -// See https://goo.gl/FZA4BK for more details. +// See https://goo.gl/3wgTsd for more details. type ListVolumesOptions struct { Filters map[string][]string Context context.Context @@ -40,9 +42,9 @@ type ListVolumesOptions struct { // ListVolumes returns a list of available volumes in the server. // -// See https://goo.gl/FZA4BK for more details. +// See https://goo.gl/3wgTsd for more details. func (c *Client) ListVolumes(opts ListVolumesOptions) ([]Volume, error) { - resp, err := c.do("GET", "/volumes?"+queryString(opts), doOptions{ + resp, err := c.do(http.MethodGet, "/volumes?"+queryString(opts), doOptions{ context: opts.Context, }) if err != nil { @@ -70,7 +72,7 @@ func (c *Client) ListVolumes(opts ListVolumesOptions) ([]Volume, error) { // CreateVolumeOptions specify parameters to the CreateVolume function. // -// See https://goo.gl/pBUbZ9 for more details. +// See https://goo.gl/qEhmEC for more details. type CreateVolumeOptions struct { Name string Driver string @@ -81,9 +83,9 @@ type CreateVolumeOptions struct { // CreateVolume creates a volume on the server. // -// See https://goo.gl/pBUbZ9 for more details. +// See https://goo.gl/qEhmEC for more details. func (c *Client) CreateVolume(opts CreateVolumeOptions) (*Volume, error) { - resp, err := c.do("POST", "/volumes/create", doOptions{ + resp, err := c.do(http.MethodPost, "/volumes/create", doOptions{ data: opts, context: opts.Context, }) @@ -100,11 +102,12 @@ func (c *Client) CreateVolume(opts CreateVolumeOptions) (*Volume, error) { // InspectVolume returns a volume by its name. // -// See https://goo.gl/0g9A6i for more details. +// See https://goo.gl/GMjsMc for more details. func (c *Client) InspectVolume(name string) (*Volume, error) { - resp, err := c.do("GET", "/volumes/"+name, doOptions{}) + resp, err := c.do(http.MethodGet, "/volumes/"+name, doOptions{}) if err != nil { - if e, ok := err.(*Error); ok && e.Status == http.StatusNotFound { + var e *Error + if errors.As(err, &e) && e.Status == http.StatusNotFound { return nil, ErrNoSuchVolume } return nil, err @@ -119,11 +122,31 @@ func (c *Client) InspectVolume(name string) (*Volume, error) { // RemoveVolume removes a volume by its name. // -// See https://goo.gl/79GNQz for more details. +// Deprecated: Use RemoveVolumeWithOptions instead. func (c *Client) RemoveVolume(name string) error { - resp, err := c.do("DELETE", "/volumes/"+name, doOptions{}) + return c.RemoveVolumeWithOptions(RemoveVolumeOptions{Name: name}) +} + +// RemoveVolumeOptions specify parameters to the RemoveVolumeWithOptions +// function. +// +// See https://goo.gl/nvd6qj for more details. +type RemoveVolumeOptions struct { + Context context.Context + Name string `qs:"-"` + Force bool +} + +// RemoveVolumeWithOptions removes a volume by its name and takes extra +// parameters. +// +// See https://goo.gl/nvd6qj for more details. +func (c *Client) RemoveVolumeWithOptions(opts RemoveVolumeOptions) error { + path := "/volumes/" + opts.Name + resp, err := c.do(http.MethodDelete, path+"?"+queryString(opts), doOptions{context: opts.Context}) if err != nil { - if e, ok := err.(*Error); ok { + var e *Error + if errors.As(err, &e) { if e.Status == http.StatusNotFound { return ErrNoSuchVolume } @@ -131,7 +154,7 @@ func (c *Client) RemoveVolume(name string) error { return ErrVolumeInUse } } - return nil + return err } defer resp.Body.Close() return nil @@ -139,7 +162,7 @@ func (c *Client) RemoveVolume(name string) error { // PruneVolumesOptions specify parameters to the PruneVolumes function. // -// See https://goo.gl/pFN1Hj for more details. +// See https://goo.gl/f9XDem for more details. type PruneVolumesOptions struct { Filters map[string][]string Context context.Context @@ -147,7 +170,7 @@ type PruneVolumesOptions struct { // PruneVolumesResults specify results from the PruneVolumes function. // -// See https://goo.gl/pFN1Hj for more details. +// See https://goo.gl/f9XDem for more details. type PruneVolumesResults struct { VolumesDeleted []string SpaceReclaimed int64 @@ -155,10 +178,10 @@ type PruneVolumesResults struct { // PruneVolumes deletes volumes which are unused. // -// See https://goo.gl/pFN1Hj for more details. +// See https://goo.gl/f9XDem for more details. func (c *Client) PruneVolumes(opts PruneVolumesOptions) (*PruneVolumesResults, error) { path := "/volumes/prune?" + queryString(opts) - resp, err := c.do("POST", path, doOptions{context: opts.Context}) + resp, err := c.do(http.MethodPost, path, doOptions{context: opts.Context}) if err != nil { return nil, err } diff --git a/vendor/github.com/getsentry/raven-go/.dockerignore b/vendor/github.com/getsentry/raven-go/.dockerignore deleted file mode 100644 index 6b8710a711f3..000000000000 --- a/vendor/github.com/getsentry/raven-go/.dockerignore +++ /dev/null @@ -1 +0,0 @@ -.git diff --git a/vendor/github.com/getsentry/raven-go/.gitignore b/vendor/github.com/getsentry/raven-go/.gitignore deleted file mode 100644 index 0f66ce75dc91..000000000000 --- a/vendor/github.com/getsentry/raven-go/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -*.test -*.out -example/example -/xunit.xml -/coverage.xml diff --git a/vendor/github.com/getsentry/raven-go/.travis.yml b/vendor/github.com/getsentry/raven-go/.travis.yml deleted file mode 100644 index 31a0ac7ef929..000000000000 --- a/vendor/github.com/getsentry/raven-go/.travis.yml +++ /dev/null @@ -1,51 +0,0 @@ -sudo: false -language: go -go: - - 1.7.x - - 1.8.x - - 1.9.x - - 1.10.x - - 1.11.x - - tip - -before_install: - - go install -race std - - go get golang.org/x/tools/cmd/cover - - go get github.com/tebeka/go2xunit - - go get github.com/t-yuki/gocover-cobertura - - go get -v ./... - -script: - - go test -v -race ./... | tee gotest.out - - $GOPATH/bin/go2xunit -fail -input gotest.out -output xunit.xml - - go test -v -coverprofile=coverage.txt -covermode count . - - $GOPATH/bin/gocover-cobertura < coverage.txt > coverage.xml - -after_script: - - npm install -g @zeus-ci/cli - - zeus upload -t "application/x-cobertura+xml" coverage.xml - - zeus upload -t "application/x-xunit+xml" xunit.xml - -matrix: - include: - - name: "golint 1.9.x" - go: 1.9.x - script: ./scripts/lint.sh - - name: "golint 1.10.x" - go: 1.10.x - script: ./scripts/lint.sh - - name: "golint 1.11.x" - go: 1.11.x - script: ./scripts/lint.sh - allow_failures: - - go: tip - -notifications: - webhooks: - urls: - - https://zeus.ci/hooks/cd949996-d30a-11e8-ba53-0a580a28042d/public/provider/travis/webhook - on_success: always - on_failure: always - on_start: always - on_cancel: always - on_error: always diff --git a/vendor/github.com/getsentry/raven-go/Dockerfile.test b/vendor/github.com/getsentry/raven-go/Dockerfile.test deleted file mode 100644 index 5089c13c9ae8..000000000000 --- a/vendor/github.com/getsentry/raven-go/Dockerfile.test +++ /dev/null @@ -1,13 +0,0 @@ -FROM golang:1.7 - -RUN mkdir -p /go/src/github.com/getsentry/raven-go -WORKDIR /go/src/github.com/getsentry/raven-go -ENV GOPATH /go - -RUN go install -race std && go get golang.org/x/tools/cmd/cover - -COPY . /go/src/github.com/getsentry/raven-go - -RUN go get -v ./... - -CMD ["./runtests.sh"] diff --git a/vendor/github.com/getsentry/raven-go/LICENSE b/vendor/github.com/getsentry/raven-go/LICENSE deleted file mode 100644 index b0301b57e8aa..000000000000 --- a/vendor/github.com/getsentry/raven-go/LICENSE +++ /dev/null @@ -1,28 +0,0 @@ -Copyright (c) 2013 Apollic Software, LLC. All rights reserved. -Copyright (c) 2015 Functional Software, Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Apollic Software, LLC nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/getsentry/raven-go/README.md b/vendor/github.com/getsentry/raven-go/README.md deleted file mode 100644 index 16c9483e8a2e..000000000000 --- a/vendor/github.com/getsentry/raven-go/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# raven - -[![Build Status](https://api.travis-ci.org/getsentry/raven-go.svg?branch=master)](https://travis-ci.org/getsentry/raven-go) -[![Go Report Card](https://goreportcard.com/badge/github.com/getsentry/raven-go)](https://goreportcard.com/report/github.com/getsentry/raven-go) -[![GoDoc](https://godoc.org/github.com/getsentry/raven-go?status.svg)](https://godoc.org/github.com/getsentry/raven-go) - -raven is the official Go SDK for the [Sentry](https://github.com/getsentry/sentry) -event/error logging system. - -- [**API Documentation**](https://godoc.org/github.com/getsentry/raven-go) -- [**Usage and Examples**](https://docs.sentry.io/clients/go/) - -## Installation - -```text -go get github.com/getsentry/raven-go -``` - -Note: Go 1.7 and newer are supported. diff --git a/vendor/github.com/getsentry/raven-go/client.go b/vendor/github.com/getsentry/raven-go/client.go deleted file mode 100644 index 7419a11693d9..000000000000 --- a/vendor/github.com/getsentry/raven-go/client.go +++ /dev/null @@ -1,1087 +0,0 @@ -// Package raven implements a client for the Sentry error logging service. -package raven - -import ( - "bytes" - "compress/zlib" - "crypto/rand" - "crypto/tls" - "encoding/base64" - "encoding/hex" - "encoding/json" - "errors" - "fmt" - "io" - "io/ioutil" - "log" - mrand "math/rand" - "net/http" - "net/url" - "os" - "regexp" - "runtime" - "strings" - "sync" - "time" - - "github.com/certifi/gocertifi" -) - -const ( - userAgent = "raven-go/1.0" - timestampFormat = `"2006-01-02T15:04:05.00"` - transportClientTimeout = 30 * time.Second -) - -// Internal SDK Error types -var ( - ErrPacketDropped = errors.New("raven: packet dropped") - ErrUnableToUnmarshalJSON = errors.New("raven: unable to unmarshal JSON") - ErrMissingUser = errors.New("raven: dsn missing public key and/or password") - ErrMissingProjectID = errors.New("raven: dsn missing project id") - ErrInvalidSampleRate = errors.New("raven: sample rate should be between 0 and 1") -) - -// Severity used in the level attribute of a message -type Severity string - -// http://docs.python.org/2/howto/logging.html#logging-levels -const ( - DEBUG = Severity("debug") - INFO = Severity("info") - WARNING = Severity("warning") - ERROR = Severity("error") - FATAL = Severity("fatal") -) - -// Logger used in all internal log calls which can be enabled with SetDebug(true) function call -var debugLogger = log.New(ioutil.Discard, "", 0) - -// Timestamp holds the creation time of a Packet -type Timestamp time.Time - -// MarshalJSON returns the JSON encoding of a timestamp -func (timestamp Timestamp) MarshalJSON() ([]byte, error) { - return []byte(time.Time(timestamp).UTC().Format(timestampFormat)), nil -} - -// UnmarshalJSON sets timestamp to parsed JSON data -func (timestamp *Timestamp) UnmarshalJSON(data []byte) error { - t, err := time.Parse(timestampFormat, string(data)) - if err != nil { - return err - } - - *timestamp = Timestamp(t) - return nil -} - -// Format return timestamp in configured timestampFormat -func (timestamp Timestamp) Format(format string) string { - t := time.Time(timestamp) - return t.Format(format) -} - -// An Interface is a Sentry interface that will be serialized as JSON. -// It must implement json.Marshaler or use json struct tags. -type Interface interface { - // The Sentry class name. Example: sentry.interfaces.Stacktrace - Class() string -} - -// Culpriter holds information about the exception culprit -type Culpriter interface { - Culprit() string -} - -// Transport used in Capture calls that handles communication with the Sentry servers -type Transport interface { - Send(url, authHeader string, packet *Packet) error -} - -// Extra keeps track of any additional information that developer wants to attach to the final packet -type Extra map[string]interface{} - -type outgoingPacket struct { - packet *Packet - ch chan error -} - -// Tag is a key:value pair of strings provided by user to better categorize events -type Tag struct { - Key string - Value string -} - -// Tags keep track of user configured tags -type Tags []Tag - -// MarshalJSON returns the JSON encoding of a tag -func (t *Tag) MarshalJSON() ([]byte, error) { - return json.Marshal([2]string{t.Key, t.Value}) -} - -// UnmarshalJSON sets tag to parsed JSON data -func (t *Tag) UnmarshalJSON(data []byte) error { - var tag [2]string - if err := json.Unmarshal(data, &tag); err != nil { - return err - } - *t = Tag{tag[0], tag[1]} - return nil -} - -// UnmarshalJSON sets tags to parsed JSON data -func (t *Tags) UnmarshalJSON(data []byte) error { - var tags []Tag - - switch data[0] { - case '[': - // Unmarshal into []Tag - if err := json.Unmarshal(data, &tags); err != nil { - return err - } - case '{': - // Unmarshal into map[string]string - tagMap := make(map[string]string) - if err := json.Unmarshal(data, &tagMap); err != nil { - return err - } - - // Convert to []Tag - for k, v := range tagMap { - tags = append(tags, Tag{k, v}) - } - default: - return ErrUnableToUnmarshalJSON - } - - *t = tags - return nil -} - -// Packet defines Sentry's spec compliant interface holding Event information (top-level object) - https://docs.sentry.io/development/sdk-dev/attributes/ -type Packet struct { - // Required - Message string `json:"message"` - - // Required, set automatically by Client.Send/Report via Packet.Init if blank - EventID string `json:"event_id"` - Project string `json:"project"` - Timestamp Timestamp `json:"timestamp"` - Level Severity `json:"level"` - Logger string `json:"logger"` - - // Optional - Platform string `json:"platform,omitempty"` - Culprit string `json:"culprit,omitempty"` - ServerName string `json:"server_name,omitempty"` - Release string `json:"release,omitempty"` - Environment string `json:"environment,omitempty"` - Tags Tags `json:"tags,omitempty"` - Modules map[string]string `json:"modules,omitempty"` - Fingerprint []string `json:"fingerprint,omitempty"` - Extra Extra `json:"extra,omitempty"` - - Interfaces []Interface `json:"-"` -} - -// NewPacket constructs a packet with the specified message and interfaces. -func NewPacket(message string, interfaces ...Interface) *Packet { - extra := Extra{} - setExtraDefaults(extra) - return &Packet{ - Message: message, - Interfaces: interfaces, - Extra: extra, - } -} - -// NewPacketWithExtra constructs a packet with the specified message, extra information, and interfaces. -func NewPacketWithExtra(message string, extra Extra, interfaces ...Interface) *Packet { - if extra == nil { - extra = Extra{} - } - setExtraDefaults(extra) - - return &Packet{ - Message: message, - Interfaces: interfaces, - Extra: extra, - } -} - -func setExtraDefaults(extra Extra) Extra { - extra["runtime.Version"] = runtime.Version() - extra["runtime.NumCPU"] = runtime.NumCPU() - extra["runtime.GOMAXPROCS"] = runtime.GOMAXPROCS(0) // 0 just returns the current value - extra["runtime.NumGoroutine"] = runtime.NumGoroutine() - return extra -} - -// Init initializes required fields in a packet. It is typically called by -// Client.Send/Report automatically. -func (packet *Packet) Init(project string) error { - if packet.Project == "" { - packet.Project = project - } - if packet.EventID == "" { - var err error - packet.EventID, err = uuid() - if err != nil { - return err - } - } - if time.Time(packet.Timestamp).IsZero() { - packet.Timestamp = Timestamp(time.Now()) - } - if packet.Level == "" { - packet.Level = ERROR - } - if packet.Logger == "" { - packet.Logger = "root" - } - if packet.ServerName == "" { - packet.ServerName = hostname - } - if packet.Platform == "" { - packet.Platform = "go" - } - - if packet.Culprit == "" { - for _, inter := range packet.Interfaces { - if c, ok := inter.(Culpriter); ok { - packet.Culprit = c.Culprit() - if packet.Culprit != "" { - break - } - } - } - } - - return nil -} - -// AddTags appends new tags to the existing ones -func (packet *Packet) AddTags(tags map[string]string) { - for k, v := range tags { - packet.Tags = append(packet.Tags, Tag{k, v}) - } -} - -func uuid() (string, error) { - id := make([]byte, 16) - _, err := io.ReadFull(rand.Reader, id) - if err != nil { - return "", err - } - id[6] &= 0x0F // clear version - id[6] |= 0x40 // set version to 4 (random uuid) - id[8] &= 0x3F // clear variant - id[8] |= 0x80 // set to IETF variant - return hex.EncodeToString(id), nil -} - -// JSON encodes packet into JSON format that will be sent to the server -func (packet *Packet) JSON() ([]byte, error) { - packetJSON, err := json.Marshal(packet) - if err != nil { - return nil, err - } - - interfaces := make(map[string]Interface, len(packet.Interfaces)) - for _, inter := range packet.Interfaces { - if inter != nil { - interfaces[inter.Class()] = inter - } - } - - if len(interfaces) > 0 { - interfaceJSON, err := json.Marshal(interfaces) - if err != nil { - return nil, err - } - packetJSON[len(packetJSON)-1] = ',' - packetJSON = append(packetJSON, interfaceJSON[1:]...) - } - - return packetJSON, nil -} - -type context struct { - user *User - http *Http - tags map[string]string -} - -func (c *context) setUser(u *User) { c.user = u } -func (c *context) setHttp(h *Http) { c.http = h } -func (c *context) setTags(t map[string]string) { - if c.tags == nil { - c.tags = make(map[string]string) - } - for k, v := range t { - c.tags[k] = v - } -} -func (c *context) clear() { - c.user = nil - c.http = nil - c.tags = nil -} - -// Return a list of interfaces to be used in appending with the rest -func (c *context) interfaces() []Interface { - len, i := 0, 0 - if c.user != nil { - len++ - } - if c.http != nil { - len++ - } - interfaces := make([]Interface, len) - if c.user != nil { - interfaces[i] = c.user - i++ - } - if c.http != nil { - interfaces[i] = c.http - } - return interfaces -} - -// MaxQueueBuffer the maximum number of packets that will be buffered waiting to be delivered. -// Packets will be dropped if the buffer is full. Used by NewClient. -var MaxQueueBuffer = 100 - -func SetMaxQueueBuffer(maxCount int) { - MaxQueueBuffer = maxCount -} - -func newTransport() Transport { - t := &HTTPTransport{} - rootCAs, err := gocertifi.CACerts() - if err != nil { - debugLogger.Println("failed to load root TLS certificates:", err) - } else { - t.Client = &http.Client{ - Transport: &http.Transport{ - Proxy: http.ProxyFromEnvironment, - TLSClientConfig: &tls.Config{RootCAs: rootCAs}, - }, - Timeout: transportClientTimeout, - } - } - return t -} - -func newClient(tags map[string]string) *Client { - client := &Client{ - Transport: newTransport(), - Tags: tags, - context: &context{}, - sampleRate: 1.0, - queue: make(chan *outgoingPacket, MaxQueueBuffer), - } - err := client.SetDSN(os.Getenv("SENTRY_DSN")) - - if err != nil { - debugLogger.Println("incorrect DSN", err) - } - - client.SetRelease(os.Getenv("SENTRY_RELEASE")) - client.SetEnvironment(os.Getenv("SENTRY_ENVIRONMENT")) - return client -} - -// New constructs a new Sentry client instance -func New(dsn string) (*Client, error) { - client := newClient(nil) - return client, client.SetDSN(dsn) -} - -// NewWithTags constructs a new Sentry client instance with default tags. -func NewWithTags(dsn string, tags map[string]string) (*Client, error) { - client := newClient(tags) - return client, client.SetDSN(dsn) -} - -// NewClient constructs a Sentry client and spawns a background goroutine to -// handle packets sent by Client.Report. -// -// Deprecated: use New and NewWithTags instead -func NewClient(dsn string, tags map[string]string) (*Client, error) { - client := newClient(tags) - return client, client.SetDSN(dsn) -} - -// Client encapsulates a connection to a Sentry server. It must be initialized -// by calling NewClient. Modification of fields concurrently with Send or after -// calling Report for the first time is not thread-safe. -type Client struct { - Tags map[string]string - - Transport Transport - - // DropHandler is called when a packet is dropped because the buffer is full. - DropHandler func(*Packet) - - // Context that will get appending to all packets - context *context - - mu sync.RWMutex - url string - projectID string - authHeader string - release string - environment string - sampleRate float32 - - // default logger name (leave empty for 'root') - defaultLoggerName string - - includePaths []string - ignoreErrorsRegexp *regexp.Regexp - queue chan *outgoingPacket - - // A WaitGroup to keep track of all currently in-progress captures - // This is intended to be used with Client.Wait() to assure that - // all messages have been transported before exiting the process. - wg sync.WaitGroup - - // A Once to track only starting up the background worker once - start sync.Once -} - -// DefaultClient initialize a default *Client instance -var DefaultClient = newClient(nil) - -// SetIgnoreErrors updates ignoreErrors config on given client -func (client *Client) SetIgnoreErrors(errs []string) error { - joinedRegexp := strings.Join(errs, "|") - r, err := regexp.Compile(joinedRegexp) - if err != nil { - return fmt.Errorf("raven: failed to compile regexp %q for %q: %v", joinedRegexp, errs, err) - } - - client.mu.Lock() - client.ignoreErrorsRegexp = r - client.mu.Unlock() - return nil -} - -func (client *Client) shouldExcludeErr(errStr string) bool { - client.mu.RLock() - defer client.mu.RUnlock() - return client.ignoreErrorsRegexp != nil && client.ignoreErrorsRegexp.MatchString(errStr) -} - -// SetIgnoreErrors updates ignoreErrors config on default client -func SetIgnoreErrors(errs ...string) error { - return DefaultClient.SetIgnoreErrors(errs) -} - -// SetDSN updates a client with a new DSN. It safe to call after and -// concurrently with calls to Report and Send. -func (client *Client) SetDSN(dsn string) error { - if dsn == "" { - return nil - } - - client.mu.Lock() - defer client.mu.Unlock() - - uri, err := url.Parse(dsn) - if err != nil { - return err - } - - if uri.User == nil { - return ErrMissingUser - } - publicKey := uri.User.Username() - secretKey, hasSecretKey := uri.User.Password() - uri.User = nil - - if idx := strings.LastIndex(uri.Path, "/"); idx != -1 { - client.projectID = uri.Path[idx+1:] - uri.Path = uri.Path[:idx+1] + "api/" + client.projectID + "/store/" - } - if client.projectID == "" { - return ErrMissingProjectID - } - - client.url = uri.String() - - if hasSecretKey { - client.authHeader = fmt.Sprintf("Sentry sentry_version=4, sentry_key=%s, sentry_secret=%s", publicKey, secretKey) - } else { - client.authHeader = fmt.Sprintf("Sentry sentry_version=4, sentry_key=%s", publicKey) - } - - return nil -} - -// SetDSN sets the DSN for the default *Client instance -func SetDSN(dsn string) error { return DefaultClient.SetDSN(dsn) } - -// SetRelease sets the "release" tag. -func (client *Client) SetRelease(release string) { - client.mu.Lock() - defer client.mu.Unlock() - client.release = release -} - -// SetEnvironment sets the "environment" tag. -func (client *Client) SetEnvironment(environment string) { - client.mu.Lock() - defer client.mu.Unlock() - client.environment = environment -} - -// SetDefaultLoggerName sets the default logger name. -func (client *Client) SetDefaultLoggerName(name string) { - client.mu.Lock() - defer client.mu.Unlock() - client.defaultLoggerName = name -} - -// SetSampleRate sets how much sampling we want on client side -func (client *Client) SetSampleRate(rate float32) error { - client.mu.Lock() - defer client.mu.Unlock() - - if rate < 0 || rate > 1 { - return ErrInvalidSampleRate - } - client.sampleRate = rate - return nil -} - -func (client *Client) SetDebug(debug bool) { - if debug == true { - debugLogger = log.New(os.Stdout, "raven: ", 0) - } else { - debugLogger = log.New(ioutil.Discard, "", 0) - } -} - -// SetRelease sets the "release" tag on the default *Client -func SetRelease(release string) { DefaultClient.SetRelease(release) } - -// SetEnvironment sets the "environment" tag on the default *Client -func SetEnvironment(environment string) { DefaultClient.SetEnvironment(environment) } - -// SetDefaultLoggerName sets the "defaultLoggerName" on the default *Client -func SetDefaultLoggerName(name string) { - DefaultClient.SetDefaultLoggerName(name) -} - -// SetSampleRate sets the "sample rate" on the degault *Client -func SetSampleRate(rate float32) error { return DefaultClient.SetSampleRate(rate) } - -// SetDebug sets the "debug" config on the default *Client -func SetDebug(debug bool) { DefaultClient.SetDebug(debug) } - -func (client *Client) worker() { - for outgoingPacket := range client.queue { - - client.mu.RLock() - url, authHeader := client.url, client.authHeader - client.mu.RUnlock() - - outgoingPacket.ch <- client.Transport.Send(url, authHeader, outgoingPacket.packet) - client.wg.Done() - } -} - -// Capture asynchronously delivers a packet to the Sentry server. It is a no-op -// when client is nil. A channel is provided if it is important to check for a -// send's success. -func (client *Client) Capture(packet *Packet, captureTags map[string]string) (eventID string, ch chan error) { - ch = make(chan error, 1) - - if client == nil { - // return a chan that always returns nil when the caller receives from it - close(ch) - return - } - - if client.sampleRate < 1.0 && mrand.Float32() > client.sampleRate { - return - } - - if packet == nil { - close(ch) - return - } - - if client.shouldExcludeErr(packet.Message) { - return - } - - // Keep track of all running Captures so that we can wait for them all to finish - // *Must* call client.wg.Done() on any path that indicates that an event was - // finished being acted upon, whether success or failure - client.wg.Add(1) - - // Merge capture tags and client tags - packet.AddTags(captureTags) - packet.AddTags(client.Tags) - - // Initialize any required packet fields - client.mu.RLock() - packet.AddTags(client.context.tags) - projectID := client.projectID - release := client.release - environment := client.environment - defaultLoggerName := client.defaultLoggerName - client.mu.RUnlock() - - // set the global logger name on the packet if we must - if packet.Logger == "" && defaultLoggerName != "" { - packet.Logger = defaultLoggerName - } - - err := packet.Init(projectID) - if err != nil { - ch <- err - client.wg.Done() - return - } - - if packet.Release == "" { - packet.Release = release - } - - if packet.Environment == "" { - packet.Environment = environment - } - - outgoingPacket := &outgoingPacket{packet, ch} - - // Lazily start background worker until we - // do our first write into the queue. - client.start.Do(func() { - go client.worker() - }) - - select { - case client.queue <- outgoingPacket: - default: - // Send would block, drop the packet - if client.DropHandler != nil { - client.DropHandler(packet) - } - ch <- ErrPacketDropped - client.wg.Done() - } - - return packet.EventID, ch -} - -// Capture asynchronously delivers a packet to the Sentry server with the default *Client. -// It is a no-op when client is nil. A channel is provided if it is important to check for a -// send's success. -func Capture(packet *Packet, captureTags map[string]string) (eventID string, ch chan error) { - return DefaultClient.Capture(packet, captureTags) -} - -// CaptureMessage formats and delivers a string message to the Sentry server. -func (client *Client) CaptureMessage(message string, tags map[string]string, interfaces ...Interface) string { - if client == nil { - return "" - } - - if client.shouldExcludeErr(message) { - return "" - } - - packet := NewPacket(message, append(append(interfaces, client.context.interfaces()...), &Message{message, nil})...) - eventID, _ := client.Capture(packet, tags) - - return eventID -} - -// CaptureMessage formats and delivers a string message to the Sentry server with the default *Client -func CaptureMessage(message string, tags map[string]string, interfaces ...Interface) string { - return DefaultClient.CaptureMessage(message, tags, interfaces...) -} - -// CaptureMessageAndWait is identical to CaptureMessage except it blocks and waits for the message to be sent. -func (client *Client) CaptureMessageAndWait(message string, tags map[string]string, interfaces ...Interface) string { - if client == nil { - return "" - } - - if client.shouldExcludeErr(message) { - return "" - } - - packet := NewPacket(message, append(append(interfaces, client.context.interfaces()...), &Message{message, nil})...) - eventID, ch := client.Capture(packet, tags) - if eventID != "" { - <-ch - } - - return eventID -} - -// CaptureMessageAndWait is identical to CaptureMessage except it blocks and waits for the message to be sent. -func CaptureMessageAndWait(message string, tags map[string]string, interfaces ...Interface) string { - return DefaultClient.CaptureMessageAndWait(message, tags, interfaces...) -} - -// CaptureError formats and delivers an error to the Sentry server. -// Adds a stacktrace to the packet, excluding the call to this method. -func (client *Client) CaptureError(err error, tags map[string]string, interfaces ...Interface) string { - if client == nil { - return "" - } - - if err == nil { - return "" - } - - if client.shouldExcludeErr(err.Error()) { - return "" - } - - extra := extractExtra(err) - cause := Cause(err) - - packet := NewPacketWithExtra(err.Error(), extra, append(append(interfaces, client.context.interfaces()...), NewException(cause, GetOrNewStacktrace(cause, 1, 3, client.includePaths)))...) - eventID, _ := client.Capture(packet, tags) - - return eventID -} - -// CaptureError formats and delivers an error to the Sentry server using the default *Client. -// Adds a stacktrace to the packet, excluding the call to this method. -func CaptureError(err error, tags map[string]string, interfaces ...Interface) string { - return DefaultClient.CaptureError(err, tags, interfaces...) -} - -// CaptureErrorAndWait is identical to CaptureError, except it blocks and assures that the event was sent -func (client *Client) CaptureErrorAndWait(err error, tags map[string]string, interfaces ...Interface) string { - if client == nil { - return "" - } - - if client.shouldExcludeErr(err.Error()) { - return "" - } - - extra := extractExtra(err) - cause := Cause(err) - - packet := NewPacketWithExtra(err.Error(), extra, append(append(interfaces, client.context.interfaces()...), NewException(cause, GetOrNewStacktrace(cause, 1, 3, client.includePaths)))...) - eventID, ch := client.Capture(packet, tags) - if eventID != "" { - <-ch - } - - return eventID -} - -// CaptureErrorAndWait is identical to CaptureError, except it blocks and assures that the event was sent -func CaptureErrorAndWait(err error, tags map[string]string, interfaces ...Interface) string { - return DefaultClient.CaptureErrorAndWait(err, tags, interfaces...) -} - -// CapturePanic calls f and then recovers and reports a panic to the Sentry server if it occurs. -// If an error is captured, both the error and the reported Sentry error ID are returned. -func (client *Client) CapturePanic(f func(), tags map[string]string, interfaces ...Interface) (err interface{}, errorID string) { - // Note: This doesn't need to check for client, because we still want to go through the defer/recover path - // Down the line, Capture will be noop'd, so while this does a _tiny_ bit of overhead constructing the - // *Packet just to be thrown away, this should not be the normal case. Could be refactored to - // be completely noop though if we cared. - defer func() { - var packet *Packet - err = recover() - switch rval := err.(type) { - case nil: - return - case error: - if client.shouldExcludeErr(rval.Error()) { - return - } - packet = NewPacket(rval.Error(), append(append(interfaces, client.context.interfaces()...), NewException(rval, NewStacktrace(2, 3, client.includePaths)))...) - default: - rvalStr := fmt.Sprint(rval) - if client.shouldExcludeErr(rvalStr) { - return - } - packet = NewPacket(rvalStr, append(append(interfaces, client.context.interfaces()...), NewException(errors.New(rvalStr), NewStacktrace(2, 3, client.includePaths)))...) - } - - errorID, _ = client.Capture(packet, tags) - }() - - f() - return -} - -// CapturePanic calls f and then recovers and reports a panic to the Sentry server if it occurs. -// If an error is captured, both the error and the reported Sentry error ID are returned. -func CapturePanic(f func(), tags map[string]string, interfaces ...Interface) (interface{}, string) { - return DefaultClient.CapturePanic(f, tags, interfaces...) -} - -// CapturePanicAndWait is identical to CapturePanic, except it blocks and assures that the event was sent -func (client *Client) CapturePanicAndWait(f func(), tags map[string]string, interfaces ...Interface) (err interface{}, errorID string) { - // Note: This doesn't need to check for client, because we still want to go through the defer/recover path - // Down the line, Capture will be noop'd, so while this does a _tiny_ bit of overhead constructing the - // *Packet just to be thrown away, this should not be the normal case. Could be refactored to - // be completely noop though if we cared. - defer func() { - var packet *Packet - err = recover() - switch rval := err.(type) { - case nil: - return - case error: - if client.shouldExcludeErr(rval.Error()) { - return - } - packet = NewPacket(rval.Error(), append(append(interfaces, client.context.interfaces()...), NewException(rval, NewStacktrace(2, 3, client.includePaths)))...) - default: - rvalStr := fmt.Sprint(rval) - if client.shouldExcludeErr(rvalStr) { - return - } - packet = NewPacket(rvalStr, append(append(interfaces, client.context.interfaces()...), NewException(errors.New(rvalStr), NewStacktrace(2, 3, client.includePaths)))...) - } - - var ch chan error - errorID, ch = client.Capture(packet, tags) - if errorID != "" { - <-ch - } - }() - - f() - return -} - -// CapturePanicAndWait is identical to CapturePanic, except it blocks and assures that the event was sent -func CapturePanicAndWait(f func(), tags map[string]string, interfaces ...Interface) (interface{}, string) { - return DefaultClient.CapturePanicAndWait(f, tags, interfaces...) -} - -// Close given clients event queue -func (client *Client) Close() { - close(client.queue) -} - -// Close defaults client event queue -func Close() { DefaultClient.Close() } - -// Wait blocks and waits for all events to finish being sent to Sentry server -func (client *Client) Wait() { - client.wg.Wait() -} - -// Wait blocks and waits for all events to finish being sent to Sentry server -func Wait() { DefaultClient.Wait() } - -// URL returns configured url of given client -func (client *Client) URL() string { - client.mu.RLock() - defer client.mu.RUnlock() - - return client.url -} - -// URL returns configured url of default client -func URL() string { return DefaultClient.URL() } - -// ProjectID returns configured ProjectID of given client -func (client *Client) ProjectID() string { - client.mu.RLock() - defer client.mu.RUnlock() - - return client.projectID -} - -// ProjectID returns configured ProjectID of default client -func ProjectID() string { return DefaultClient.ProjectID() } - -// Release returns configured Release of given client -func (client *Client) Release() string { - client.mu.RLock() - defer client.mu.RUnlock() - - return client.release -} - -// Release returns configured Release of default client -func Release() string { return DefaultClient.Release() } - -// IncludePaths returns configured includePaths of given client -func (client *Client) IncludePaths() []string { - client.mu.RLock() - defer client.mu.RUnlock() - - return client.includePaths -} - -// IncludePaths returns configured includePaths of default client -func IncludePaths() []string { return DefaultClient.IncludePaths() } - -// SetIncludePaths updates includePaths config on given client -func (client *Client) SetIncludePaths(p []string) { - client.mu.Lock() - defer client.mu.Unlock() - - client.includePaths = p -} - -// SetIncludePaths updates includePaths config on default client -func SetIncludePaths(p []string) { DefaultClient.SetIncludePaths(p) } - -// SetUserContext updates User of Context interface on given client -func (client *Client) SetUserContext(u *User) { - client.mu.Lock() - defer client.mu.Unlock() - client.context.setUser(u) -} - -// SetHttpContext updates Http of Context interface on given client -func (client *Client) SetHttpContext(h *Http) { - client.mu.Lock() - defer client.mu.Unlock() - client.context.setHttp(h) -} - -// SetTagsContext updates Tags of Context interface on given client -func (client *Client) SetTagsContext(t map[string]string) { - client.mu.Lock() - defer client.mu.Unlock() - client.context.setTags(t) -} - -// ClearContext clears Context interface on given client by removing tags, user and request information -func (client *Client) ClearContext() { - client.mu.Lock() - defer client.mu.Unlock() - client.context.clear() -} - -// SetUserContext updates User of Context interface on default client -func SetUserContext(u *User) { DefaultClient.SetUserContext(u) } - -// SetHttpContext updates Http of Context interface on default client -func SetHttpContext(h *Http) { DefaultClient.SetHttpContext(h) } - -// SetTagsContext updates Tags of Context interface on default client -func SetTagsContext(t map[string]string) { DefaultClient.SetTagsContext(t) } - -// ClearContext clears Context interface on default client by removing tags, user and request information -func ClearContext() { DefaultClient.ClearContext() } - -// HTTPTransport is the default transport, delivering packets to Sentry via the -// HTTP API. -type HTTPTransport struct { - *http.Client -} - -// Send uses HTTPTransport to send a Packet to configured Sentry's DSN endpoint -func (t *HTTPTransport) Send(url, authHeader string, packet *Packet) error { - if url == "" { - return nil - } - - body, contentType, err := serializedPacket(packet) - if err != nil { - return fmt.Errorf("raven: error serializing packet: %v", err) - } - req, err := http.NewRequest("POST", url, body) - if err != nil { - return fmt.Errorf("raven: can't create new request: %v", err) - } - req.Header.Set("X-Sentry-Auth", authHeader) - req.Header.Set("User-Agent", userAgent) - req.Header.Set("Content-Type", contentType) - - res, err := t.Do(req) - if err != nil { - return err - } - - // Response body needs to be drained and closed in order for TCP connection to stay opened (via keep-alive) and reused - _, err = io.Copy(ioutil.Discard, res.Body) - if err != nil { - debugLogger.Println("Error while reading response body", res) - } - - err = res.Body.Close() - if err != nil { - debugLogger.Println("Error while closing response body", err) - } - - if res.StatusCode != 200 { - return fmt.Errorf("raven: got http status %d - x-sentry-error: %s", res.StatusCode, res.Header.Get("X-Sentry-Error")) - } - return nil -} - -func serializedPacket(packet *Packet) (io.Reader, string, error) { - packetJSON, err := packet.JSON() - if err != nil { - return nil, "", fmt.Errorf("raven: error marshaling packet %+v to JSON: %v", packet, err) - } - - // Only deflate/base64 the packet if it is bigger than 1KB, as there is an overhead - if len(packetJSON) > 1000 { - buf := &bytes.Buffer{} - b64 := base64.NewEncoder(base64.StdEncoding, buf) - deflate, _ := zlib.NewWriterLevel(b64, zlib.BestCompression) - _, err := deflate.Write(packetJSON) - if err != nil { - debugLogger.Println("Error while deflating data in packet serializer", err) - } - err = deflate.Close() - if err != nil { - debugLogger.Println("Error while closing zlib deflate in packet serializer", err) - } - err = b64.Close() - if err != nil { - debugLogger.Println("Error while closing b64 encoder in packet serializer", err) - } - return buf, "application/octet-stream", nil - } - return bytes.NewReader(packetJSON), "application/json", nil -} - -var hostname string - -func init() { - hostname, _ = os.Hostname() -} - -// Cause returns the underlying cause of the error, if possible. -// An error value has a cause if it implements the following -// interface: -// -// type causer interface { -// Cause() error -// } -// -// If the error does not implement Cause, the original error will -// be returned. If the error is nil, nil will be returned without further -// investigation. -func Cause(err error) error { - type causer interface { - Cause() error - } - - for err != nil { - cause, ok := err.(causer) - if !ok { - break - } - err = cause.Cause() - } - return err -} diff --git a/vendor/github.com/getsentry/raven-go/errors.go b/vendor/github.com/getsentry/raven-go/errors.go deleted file mode 100644 index ca3416b6429a..000000000000 --- a/vendor/github.com/getsentry/raven-go/errors.go +++ /dev/null @@ -1,70 +0,0 @@ -package raven - -type causer interface { - Cause() error -} - -type errWrappedWithExtra struct { - err error - extraInfo map[string]interface{} -} - -func (ewx *errWrappedWithExtra) Error() string { - if ewx.err == nil { - return "" - } - - return ewx.err.Error() -} - -func (ewx *errWrappedWithExtra) Cause() error { - return ewx.err -} - -func (ewx *errWrappedWithExtra) ExtraInfo() Extra { - return ewx.extraInfo -} - -// WrapWithExtra adds extra data to an error before reporting to Sentry -func WrapWithExtra(err error, extraInfo map[string]interface{}) error { - return &errWrappedWithExtra{ - err: err, - extraInfo: extraInfo, - } -} - -// errWithJustExtra is a regular error with just the user-provided extras added but without a cause -type errWithJustExtra interface { - error - ExtraInfo() Extra -} - -// ErrWithExtra links Error with attached user-provided extras that will be reported alongside the Error -type ErrWithExtra interface { - errWithJustExtra - Cause() error -} - -// Iteratively fetches all the Extra data added to an error, -// and it's underlying errors. Extra data defined first is -// respected, and is not overridden when extracting. -func extractExtra(err error) Extra { - extra := Extra{} - - currentErr := err - for currentErr != nil { - if errWithExtra, ok := currentErr.(errWithJustExtra); ok { - for k, v := range errWithExtra.ExtraInfo() { - extra[k] = v - } - } - - if errWithCause, ok := currentErr.(causer); ok { - currentErr = errWithCause.Cause() - } else { - currentErr = nil - } - } - - return extra -} diff --git a/vendor/github.com/getsentry/raven-go/exception.go b/vendor/github.com/getsentry/raven-go/exception.go deleted file mode 100644 index 919807476b4e..000000000000 --- a/vendor/github.com/getsentry/raven-go/exception.go +++ /dev/null @@ -1,53 +0,0 @@ -package raven - -import ( - "reflect" - "regexp" -) - -var errorMsgPattern = regexp.MustCompile(`\A(\w+): (.+)\z`) - -// NewException constructs an Exception using provided Error and Stacktrace -func NewException(err error, stacktrace *Stacktrace) *Exception { - msg := err.Error() - ex := &Exception{ - Stacktrace: stacktrace, - Value: msg, - Type: reflect.TypeOf(err).String(), - } - if m := errorMsgPattern.FindStringSubmatch(msg); m != nil { - ex.Module, ex.Value = m[1], m[2] - } - return ex -} - -// Exception defines Sentry's spec compliant interface holding Exception information - https://docs.sentry.io/development/sdk-dev/interfaces/exception/ -type Exception struct { - // Required - Value string `json:"value"` - - // Optional - Type string `json:"type,omitempty"` - Module string `json:"module,omitempty"` - Stacktrace *Stacktrace `json:"stacktrace,omitempty"` -} - -// Class provides name of implemented Sentry's interface -func (e *Exception) Class() string { return "exception" } - -// Culprit tries to read top-most error message from Exception's stacktrace -func (e *Exception) Culprit() string { - if e.Stacktrace == nil { - return "" - } - return e.Stacktrace.Culprit() -} - -// Exceptions defines Sentry's spec compliant interface holding Exceptions information - https://docs.sentry.io/development/sdk-dev/interfaces/exception/ -type Exceptions struct { - // Required - Values []*Exception `json:"values"` -} - -// Class provides name of implemented Sentry's interface -func (es Exceptions) Class() string { return "exception" } diff --git a/vendor/github.com/getsentry/raven-go/http.go b/vendor/github.com/getsentry/raven-go/http.go deleted file mode 100644 index 47a7980eb19b..000000000000 --- a/vendor/github.com/getsentry/raven-go/http.go +++ /dev/null @@ -1,101 +0,0 @@ -package raven - -import ( - "errors" - "fmt" - "net" - "net/http" - "net/url" - "runtime/debug" - "strings" -) - -// NewHttp creates new HTTP object that follows Sentry's HTTP interface spec and will be attached to the Packet -func NewHttp(req *http.Request) *Http { - proto := "http" - if req.TLS != nil || req.Header.Get("X-Forwarded-Proto") == "https" { - proto = "https" - } - h := &Http{ - Method: req.Method, - Cookies: req.Header.Get("Cookie"), - Query: sanitizeQuery(req.URL.Query()).Encode(), - URL: proto + "://" + req.Host + req.URL.Path, - Headers: make(map[string]string, len(req.Header)), - } - if addr, port, err := net.SplitHostPort(req.RemoteAddr); err == nil { - h.Env = map[string]string{"REMOTE_ADDR": addr, "REMOTE_PORT": port} - } - for k, v := range req.Header { - h.Headers[k] = strings.Join(v, ",") - } - h.Headers["Host"] = req.Host - return h -} - -var querySecretFields = []string{"password", "passphrase", "passwd", "secret"} - -func sanitizeQuery(query url.Values) url.Values { - for _, keyword := range querySecretFields { - for field := range query { - if strings.Contains(field, keyword) { - query[field] = []string{"********"} - } - } - } - return query -} - -// Http defines Sentry's spec compliant interface holding Request information - https://docs.sentry.io/development/sdk-dev/interfaces/http/ -type Http struct { - // Required - URL string `json:"url"` - Method string `json:"method"` - Query string `json:"query_string,omitempty"` - - // Optional - Cookies string `json:"cookies,omitempty"` - Headers map[string]string `json:"headers,omitempty"` - Env map[string]string `json:"env,omitempty"` - - // Must be either a string or map[string]string - Data interface{} `json:"data,omitempty"` -} - -// Class provides name of implemented Sentry's interface -func (h *Http) Class() string { return "request" } - -// RecoveryHandler uses Recoverer to wrap the stdlib net/http Mux. -// Example: -// http.HandleFunc("/", raven.RecoveryHandler(func(w http.ResponseWriter, r *http.Request) { -// ... -// })) -func RecoveryHandler(handler func(http.ResponseWriter, *http.Request)) func(http.ResponseWriter, *http.Request) { - return Recoverer(http.HandlerFunc(handler)).ServeHTTP -} - -// Recoverer wraps the stdlib net/http Mux. -// Example: -// mux := http.NewServeMux -// ... -// http.Handle("/", raven.Recoverer(mux)) -func Recoverer(handler http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - defer func() { - if rval := recover(); rval != nil { - debug.PrintStack() - rvalStr := fmt.Sprint(rval) - var packet *Packet - if err, ok := rval.(error); ok { - packet = NewPacket(rvalStr, NewException(errors.New(rvalStr), GetOrNewStacktrace(err, 2, 3, nil)), NewHttp(r)) - } else { - packet = NewPacket(rvalStr, NewException(errors.New(rvalStr), NewStacktrace(2, 3, nil)), NewHttp(r)) - } - Capture(packet, nil) - w.WriteHeader(http.StatusInternalServerError) - } - }() - - handler.ServeHTTP(w, r) - }) -} diff --git a/vendor/github.com/getsentry/raven-go/interfaces.go b/vendor/github.com/getsentry/raven-go/interfaces.go deleted file mode 100644 index a12b13893a5e..000000000000 --- a/vendor/github.com/getsentry/raven-go/interfaces.go +++ /dev/null @@ -1,53 +0,0 @@ -package raven - -// Message defines Sentry's spec compliant interface holding Message information - https://docs.sentry.io/development/sdk-dev/interfaces/message/ -type Message struct { - // Required - Message string `json:"message"` - - // Optional - Params []interface{} `json:"params,omitempty"` -} - -// Class provides name of implemented Sentry's interface -func (m *Message) Class() string { return "logentry" } - -// Template defines Sentry's spec compliant interface holding Template information - https://docs.sentry.io/development/sdk-dev/interfaces/template/ -type Template struct { - // Required - Filename string `json:"filename"` - Lineno int `json:"lineno"` - ContextLine string `json:"context_line"` - - // Optional - PreContext []string `json:"pre_context,omitempty"` - PostContext []string `json:"post_context,omitempty"` - AbsolutePath string `json:"abs_path,omitempty"` -} - -// Class provides name of implemented Sentry's interface -func (t *Template) Class() string { return "template" } - -// User defines Sentry's spec compliant interface holding User information - https://docs.sentry.io/development/sdk-dev/interfaces/user/ -type User struct { - // All fields are optional - ID string `json:"id,omitempty"` - Username string `json:"username,omitempty"` - Email string `json:"email,omitempty"` - IP string `json:"ip_address,omitempty"` -} - -// Class provides name of implemented Sentry's interface -func (h *User) Class() string { return "user" } - -// Query defines Sentry's spec compliant interface holding Context information - https://docs.sentry.io/development/sdk-dev/interfaces/contexts/ -type Query struct { - // Required - Query string `json:"query"` - - // Optional - Engine string `json:"engine,omitempty"` -} - -// Class provides name of implemented Sentry's interface -func (q *Query) Class() string { return "query" } diff --git a/vendor/github.com/getsentry/raven-go/runtests.sh b/vendor/github.com/getsentry/raven-go/runtests.sh deleted file mode 100644 index 9ed279c966e8..000000000000 --- a/vendor/github.com/getsentry/raven-go/runtests.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash -go test -race ./... -go test -cover ./... -go test -v ./... diff --git a/vendor/github.com/getsentry/raven-go/stacktrace.go b/vendor/github.com/getsentry/raven-go/stacktrace.go deleted file mode 100644 index 7da315688728..000000000000 --- a/vendor/github.com/getsentry/raven-go/stacktrace.go +++ /dev/null @@ -1,283 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. -// Some code from the runtime/debug package of the Go standard library. - -package raven - -import ( - "bytes" - "go/build" - "io/ioutil" - "path/filepath" - "runtime" - "strings" - "sync" -) - -// Stacktrace defines Sentry's spec compliant interface holding Stacktrace information - https://docs.sentry.io/development/sdk-dev/interfaces/stacktrace/ -type Stacktrace struct { - // Required - Frames []*StacktraceFrame `json:"frames"` -} - -// Class provides name of implemented Sentry's interface -func (s *Stacktrace) Class() string { return "stacktrace" } - -// Culprit iterates through stacktrace frames and returns first in-app frame's information -func (s *Stacktrace) Culprit() string { - for i := len(s.Frames) - 1; i >= 0; i-- { - frame := s.Frames[i] - if frame.InApp == true && frame.Module != "" && frame.Function != "" { - return frame.Module + "." + frame.Function - } - } - return "" -} - -// StacktraceFrame defines Sentry's spec compliant interface holding Frame information - https://docs.sentry.io/development/sdk-dev/interfaces/stacktrace/ -type StacktraceFrame struct { - // At least one required - Filename string `json:"filename,omitempty"` - Function string `json:"function,omitempty"` - Module string `json:"module,omitempty"` - - // Optional - Lineno int `json:"lineno,omitempty"` - Colno int `json:"colno,omitempty"` - AbsolutePath string `json:"abs_path,omitempty"` - ContextLine string `json:"context_line,omitempty"` - PreContext []string `json:"pre_context,omitempty"` - PostContext []string `json:"post_context,omitempty"` - InApp bool `json:"in_app"` -} - -// GetOrNewStacktrace tries to get stacktrace from err as an interface of github.com/pkg/errors, or else NewStacktrace() -func GetOrNewStacktrace(err error, skip int, context int, appPackagePrefixes []string) *Stacktrace { - type stackTracer interface { - StackTrace() []runtime.Frame - } - stacktrace, ok := err.(stackTracer) - if !ok { - return NewStacktrace(skip+1, context, appPackagePrefixes) - } - var frames []*StacktraceFrame - for _, f := range stacktrace.StackTrace() { - pc := uintptr(f.PC) - 1 - fn := runtime.FuncForPC(pc) - var fName string - var file string - var line int - if fn != nil { - file, line = fn.FileLine(pc) - fName = fn.Name() - } else { - file = "unknown" - fName = "unknown" - } - frame := NewStacktraceFrame(pc, fName, file, line, context, appPackagePrefixes) - if frame != nil { - frames = append([]*StacktraceFrame{frame}, frames...) - } - } - return &Stacktrace{Frames: frames} -} - -// NewStacktrace intializes and populates a new stacktrace, skipping skip frames. -// -// context is the number of surrounding lines that should be included for context. -// Setting context to 3 would try to get seven lines. Setting context to -1 returns -// one line with no surrounding context, and 0 returns no context. -// -// appPackagePrefixes is a list of prefixes used to check whether a package should -// be considered "in app". -func NewStacktrace(skip int, context int, appPackagePrefixes []string) *Stacktrace { - var frames []*StacktraceFrame - - callerPcs := make([]uintptr, 100) - numCallers := runtime.Callers(skip+2, callerPcs) - - // If there are no callers, the entire stacktrace is nil - if numCallers == 0 { - return nil - } - - callersFrames := runtime.CallersFrames(callerPcs) - - for { - fr, more := callersFrames.Next() - frame := NewStacktraceFrame(fr.PC, fr.Function, fr.File, fr.Line, context, appPackagePrefixes) - if frame != nil { - frames = append(frames, frame) - } - if !more { - break - } - } - // If there are no frames, the entire stacktrace is nil - if len(frames) == 0 { - return nil - } - // Optimize the path where there's only 1 frame - if len(frames) == 1 { - return &Stacktrace{frames} - } - // Sentry wants the frames with the oldest first, so reverse them - for i, j := 0, len(frames)-1; i < j; i, j = i+1, j-1 { - frames[i], frames[j] = frames[j], frames[i] - } - return &Stacktrace{frames} -} - -// NewStacktraceFrame builds a single frame using data returned from runtime.Caller. -// -// context is the number of surrounding lines that should be included for context. -// Setting context to 3 would try to get seven lines. Setting context to -1 returns -// one line with no surrounding context, and 0 returns no context. -// -// appPackagePrefixes is a list of prefixes used to check whether a package should -// be considered "in app". -func NewStacktraceFrame(pc uintptr, fName, file string, line, context int, appPackagePrefixes []string) *StacktraceFrame { - frame := &StacktraceFrame{AbsolutePath: file, Filename: trimPath(file), Lineno: line} - frame.Module, frame.Function = functionName(fName) - frame.InApp = isInAppFrame(*frame, appPackagePrefixes) - - // `runtime.goexit` is effectively a placeholder that comes from - // runtime/asm_amd64.s and is meaningless. - if frame.Module == "runtime" && frame.Function == "goexit" { - return nil - } - - if context > 0 { - contextLines, lineIdx := sourceCodeLoader.Load(file, line, context) - if len(contextLines) > 0 { - for i, line := range contextLines { - switch { - case i < lineIdx: - frame.PreContext = append(frame.PreContext, string(line)) - case i == lineIdx: - frame.ContextLine = string(line) - default: - frame.PostContext = append(frame.PostContext, string(line)) - } - } - } - } else if context == -1 { - contextLine, _ := sourceCodeLoader.Load(file, line, 0) - if len(contextLine) > 0 { - frame.ContextLine = string(contextLine[0]) - } - } - - return frame -} - -// Determines whether frame should be marked as InApp -func isInAppFrame(frame StacktraceFrame, appPackagePrefixes []string) bool { - if frame.Module == "main" { - return true - } - for _, prefix := range appPackagePrefixes { - if strings.HasPrefix(frame.Module, prefix) && !strings.Contains(frame.Module, "vendor") && !strings.Contains(frame.Module, "third_party") { - return true - } - } - return false -} - -// Retrieve the name of the package and function containing the PC. -func functionName(fName string) (pack string, name string) { - name = fName - // We get this: - // runtime/debug.*T·ptrmethod - // and want this: - // pack = runtime/debug - // name = *T.ptrmethod - if idx := strings.LastIndex(name, "."); idx != -1 { - pack = name[:idx] - name = name[idx+1:] - } - name = strings.Replace(name, "·", ".", -1) - return -} - -// SourceCodeLoader allows to read source code files from the current fs -type SourceCodeLoader interface { - Load(filename string, line, context int) ([][]byte, int) -} - -var sourceCodeLoader SourceCodeLoader = &fsLoader{cache: make(map[string][][]byte)} - -// SetSourceCodeLoader overrides currently used loader for the new one -func SetSourceCodeLoader(loader SourceCodeLoader) { - sourceCodeLoader = loader -} - -type fsLoader struct { - mu sync.Mutex - cache map[string][][]byte -} - -func (fs *fsLoader) Load(filename string, line, context int) ([][]byte, int) { - fs.mu.Lock() - defer fs.mu.Unlock() - lines, ok := fs.cache[filename] - if !ok { - data, err := ioutil.ReadFile(filename) - if err != nil { - // cache errors as nil slice: code below handles it correctly - // otherwise when missing the source or running as a different user, we try - // reading the file on each error which is unnecessary - fs.cache[filename] = nil - return nil, 0 - } - lines = bytes.Split(data, []byte{'\n'}) - fs.cache[filename] = lines - } - - if lines == nil { - // cached error from ReadFile: return no lines - return nil, 0 - } - - line-- // stack trace lines are 1-indexed - start := line - context - var idx int - if start < 0 { - start = 0 - idx = line - } else { - idx = context - } - end := line + context + 1 - if line >= len(lines) { - return nil, 0 - } - if end > len(lines) { - end = len(lines) - } - return lines[start:end], idx -} - -var trimPaths []string - -// Try to trim the GOROOT or GOPATH prefix off of a filename -func trimPath(filename string) string { - for _, prefix := range trimPaths { - if trimmed := strings.TrimPrefix(filename, prefix); len(trimmed) < len(filename) { - return trimmed - } - } - return filename -} - -func init() { - // Collect all source directories, and make sure they - // end in a trailing "separator" - for _, prefix := range build.Default.SrcDirs() { - if prefix[len(prefix)-1] != filepath.Separator { - prefix += string(filepath.Separator) - } - trimPaths = append(trimPaths, prefix) - } -} diff --git a/vendor/github.com/getsentry/raven-go/writer.go b/vendor/github.com/getsentry/raven-go/writer.go deleted file mode 100644 index 7bd89b0866f9..000000000000 --- a/vendor/github.com/getsentry/raven-go/writer.go +++ /dev/null @@ -1,21 +0,0 @@ -package raven - -// Writer holds all the information about the message that will be reported to Sentry -type Writer struct { - Client *Client - Level Severity - Logger string // Logger name reported to Sentry -} - -// Write formats the byte slice p into a string, and sends a message to -// Sentry at the severity level indicated by the Writer w. -func (w *Writer) Write(p []byte) (int, error) { - message := string(p) - - packet := NewPacket(message, &Message{message, nil}) - packet.Level = w.Level - packet.Logger = w.Logger - w.Client.Capture(packet, nil) - - return len(p), nil -} diff --git a/vendor/github.com/go-errors/errors/.travis.yml b/vendor/github.com/go-errors/errors/.travis.yml new file mode 100644 index 000000000000..9d00fdd5d66e --- /dev/null +++ b/vendor/github.com/go-errors/errors/.travis.yml @@ -0,0 +1,5 @@ +language: go + +go: + - "1.8.x" + - "1.10.x" diff --git a/vendor/github.com/go-errors/errors/LICENSE.MIT b/vendor/github.com/go-errors/errors/LICENSE.MIT new file mode 100644 index 000000000000..c9a5b2eeb751 --- /dev/null +++ b/vendor/github.com/go-errors/errors/LICENSE.MIT @@ -0,0 +1,7 @@ +Copyright (c) 2015 Conrad Irwin + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/go-errors/errors/README.md b/vendor/github.com/go-errors/errors/README.md new file mode 100644 index 000000000000..5d4f1873ddfe --- /dev/null +++ b/vendor/github.com/go-errors/errors/README.md @@ -0,0 +1,66 @@ +go-errors/errors +================ + +[![Build Status](https://travis-ci.org/go-errors/errors.svg?branch=master)](https://travis-ci.org/go-errors/errors) + +Package errors adds stacktrace support to errors in go. + +This is particularly useful when you want to understand the state of execution +when an error was returned unexpectedly. + +It provides the type \*Error which implements the standard golang error +interface, so you can use this library interchangably with code that is +expecting a normal error return. + +Usage +----- + +Full documentation is available on +[godoc](https://godoc.org/github.com/go-errors/errors), but here's a simple +example: + +```go +package crashy + +import "github.com/go-errors/errors" + +var Crashed = errors.Errorf("oh dear") + +func Crash() error { + return errors.New(Crashed) +} +``` + +This can be called as follows: + +```go +package main + +import ( + "crashy" + "fmt" + "github.com/go-errors/errors" +) + +func main() { + err := crashy.Crash() + if err != nil { + if errors.Is(err, crashy.Crashed) { + fmt.Println(err.(*errors.Error).ErrorStack()) + } else { + panic(err) + } + } +} +``` + +Meta-fu +------- + +This package was original written to allow reporting to +[Bugsnag](https://bugsnag.com/) from +[bugsnag-go](https://github.com/bugsnag/bugsnag-go), but after I found similar +packages by Facebook and Dropbox, it was moved to one canonical location so +everyone can benefit. + +This package is licensed under the MIT license, see LICENSE.MIT for details. diff --git a/vendor/github.com/go-errors/errors/cover.out b/vendor/github.com/go-errors/errors/cover.out new file mode 100644 index 000000000000..ab18b0519fcc --- /dev/null +++ b/vendor/github.com/go-errors/errors/cover.out @@ -0,0 +1,89 @@ +mode: set +github.com/go-errors/errors/stackframe.go:27.51,30.25 2 1 +github.com/go-errors/errors/stackframe.go:33.2,38.8 3 1 +github.com/go-errors/errors/stackframe.go:30.25,32.3 1 0 +github.com/go-errors/errors/stackframe.go:43.47,44.31 1 1 +github.com/go-errors/errors/stackframe.go:47.2,47.48 1 1 +github.com/go-errors/errors/stackframe.go:44.31,46.3 1 1 +github.com/go-errors/errors/stackframe.go:52.42,56.16 3 1 +github.com/go-errors/errors/stackframe.go:60.2,60.60 1 1 +github.com/go-errors/errors/stackframe.go:56.16,58.3 1 0 +github.com/go-errors/errors/stackframe.go:64.55,67.16 2 1 +github.com/go-errors/errors/stackframe.go:71.2,72.61 2 1 +github.com/go-errors/errors/stackframe.go:76.2,76.66 1 1 +github.com/go-errors/errors/stackframe.go:67.16,69.3 1 0 +github.com/go-errors/errors/stackframe.go:72.61,74.3 1 0 +github.com/go-errors/errors/stackframe.go:79.56,91.63 3 1 +github.com/go-errors/errors/stackframe.go:95.2,95.53 1 1 +github.com/go-errors/errors/stackframe.go:100.2,101.18 2 1 +github.com/go-errors/errors/stackframe.go:91.63,94.3 2 1 +github.com/go-errors/errors/stackframe.go:95.53,98.3 2 1 +github.com/go-errors/errors/error.go:70.32,73.23 2 1 +github.com/go-errors/errors/error.go:80.2,85.3 3 1 +github.com/go-errors/errors/error.go:74.2,75.10 1 1 +github.com/go-errors/errors/error.go:76.2,77.28 1 1 +github.com/go-errors/errors/error.go:92.43,95.23 2 1 +github.com/go-errors/errors/error.go:104.2,109.3 3 1 +github.com/go-errors/errors/error.go:96.2,97.11 1 1 +github.com/go-errors/errors/error.go:98.2,99.10 1 1 +github.com/go-errors/errors/error.go:100.2,101.28 1 1 +github.com/go-errors/errors/error.go:115.39,117.19 1 1 +github.com/go-errors/errors/error.go:121.2,121.29 1 1 +github.com/go-errors/errors/error.go:125.2,125.43 1 1 +github.com/go-errors/errors/error.go:129.2,129.14 1 1 +github.com/go-errors/errors/error.go:117.19,119.3 1 1 +github.com/go-errors/errors/error.go:121.29,123.3 1 1 +github.com/go-errors/errors/error.go:125.43,127.3 1 1 +github.com/go-errors/errors/error.go:135.53,137.2 1 1 +github.com/go-errors/errors/error.go:140.34,142.2 1 1 +github.com/go-errors/errors/error.go:146.34,149.42 2 1 +github.com/go-errors/errors/error.go:153.2,153.20 1 1 +github.com/go-errors/errors/error.go:149.42,151.3 1 1 +github.com/go-errors/errors/error.go:158.39,160.2 1 1 +github.com/go-errors/errors/error.go:164.46,165.23 1 1 +github.com/go-errors/errors/error.go:173.2,173.19 1 1 +github.com/go-errors/errors/error.go:165.23,168.32 2 1 +github.com/go-errors/errors/error.go:168.32,170.4 1 1 +github.com/go-errors/errors/error.go:177.37,178.42 1 1 +github.com/go-errors/errors/error.go:181.2,181.41 1 1 +github.com/go-errors/errors/error.go:178.42,180.3 1 1 +github.com/go-errors/errors/parse_panic.go:10.39,12.2 1 1 +github.com/go-errors/errors/parse_panic.go:16.46,24.34 5 1 +github.com/go-errors/errors/parse_panic.go:70.2,70.43 1 1 +github.com/go-errors/errors/parse_panic.go:73.2,73.55 1 0 +github.com/go-errors/errors/parse_panic.go:24.34,27.23 2 1 +github.com/go-errors/errors/parse_panic.go:27.23,28.42 1 1 +github.com/go-errors/errors/parse_panic.go:28.42,31.5 2 1 +github.com/go-errors/errors/parse_panic.go:31.6,33.5 1 0 +github.com/go-errors/errors/parse_panic.go:35.5,35.29 1 1 +github.com/go-errors/errors/parse_panic.go:35.29,36.86 1 1 +github.com/go-errors/errors/parse_panic.go:36.86,38.5 1 1 +github.com/go-errors/errors/parse_panic.go:40.5,40.32 1 1 +github.com/go-errors/errors/parse_panic.go:40.32,41.18 1 1 +github.com/go-errors/errors/parse_panic.go:45.4,46.46 2 1 +github.com/go-errors/errors/parse_panic.go:51.4,53.23 2 1 +github.com/go-errors/errors/parse_panic.go:57.4,58.18 2 1 +github.com/go-errors/errors/parse_panic.go:62.4,63.17 2 1 +github.com/go-errors/errors/parse_panic.go:41.18,43.10 2 1 +github.com/go-errors/errors/parse_panic.go:46.46,49.5 2 1 +github.com/go-errors/errors/parse_panic.go:53.23,55.5 1 0 +github.com/go-errors/errors/parse_panic.go:58.18,60.5 1 0 +github.com/go-errors/errors/parse_panic.go:63.17,65.10 2 1 +github.com/go-errors/errors/parse_panic.go:70.43,72.3 1 1 +github.com/go-errors/errors/parse_panic.go:80.85,82.29 2 1 +github.com/go-errors/errors/parse_panic.go:85.2,85.15 1 1 +github.com/go-errors/errors/parse_panic.go:88.2,90.63 2 1 +github.com/go-errors/errors/parse_panic.go:94.2,94.53 1 1 +github.com/go-errors/errors/parse_panic.go:99.2,101.36 2 1 +github.com/go-errors/errors/parse_panic.go:105.2,106.15 2 1 +github.com/go-errors/errors/parse_panic.go:109.2,112.49 3 1 +github.com/go-errors/errors/parse_panic.go:116.2,117.16 2 1 +github.com/go-errors/errors/parse_panic.go:121.2,126.8 1 1 +github.com/go-errors/errors/parse_panic.go:82.29,84.3 1 0 +github.com/go-errors/errors/parse_panic.go:85.15,87.3 1 1 +github.com/go-errors/errors/parse_panic.go:90.63,93.3 2 1 +github.com/go-errors/errors/parse_panic.go:94.53,97.3 2 1 +github.com/go-errors/errors/parse_panic.go:101.36,103.3 1 0 +github.com/go-errors/errors/parse_panic.go:106.15,108.3 1 0 +github.com/go-errors/errors/parse_panic.go:112.49,114.3 1 1 +github.com/go-errors/errors/parse_panic.go:117.16,119.3 1 0 diff --git a/vendor/github.com/go-errors/errors/error.go b/vendor/github.com/go-errors/errors/error.go new file mode 100644 index 000000000000..60062a4372bc --- /dev/null +++ b/vendor/github.com/go-errors/errors/error.go @@ -0,0 +1,217 @@ +// Package errors provides errors that have stack-traces. +// +// This is particularly useful when you want to understand the +// state of execution when an error was returned unexpectedly. +// +// It provides the type *Error which implements the standard +// golang error interface, so you can use this library interchangably +// with code that is expecting a normal error return. +// +// For example: +// +// package crashy +// +// import "github.com/go-errors/errors" +// +// var Crashed = errors.Errorf("oh dear") +// +// func Crash() error { +// return errors.New(Crashed) +// } +// +// This can be called as follows: +// +// package main +// +// import ( +// "crashy" +// "fmt" +// "github.com/go-errors/errors" +// ) +// +// func main() { +// err := crashy.Crash() +// if err != nil { +// if errors.Is(err, crashy.Crashed) { +// fmt.Println(err.(*errors.Error).ErrorStack()) +// } else { +// panic(err) +// } +// } +// } +// +// This package was original written to allow reporting to Bugsnag, +// but after I found similar packages by Facebook and Dropbox, it +// was moved to one canonical location so everyone can benefit. +package errors + +import ( + "bytes" + "fmt" + "reflect" + "runtime" +) + +// The maximum number of stackframes on any error. +var MaxStackDepth = 50 + +// Error is an error with an attached stacktrace. It can be used +// wherever the builtin error interface is expected. +type Error struct { + Err error + stack []uintptr + frames []StackFrame + prefix string +} + +// New makes an Error from the given value. If that value is already an +// error then it will be used directly, if not, it will be passed to +// fmt.Errorf("%v"). The stacktrace will point to the line of code that +// called New. +func New(e interface{}) *Error { + var err error + + switch e := e.(type) { + case error: + err = e + default: + err = fmt.Errorf("%v", e) + } + + stack := make([]uintptr, MaxStackDepth) + length := runtime.Callers(2, stack[:]) + return &Error{ + Err: err, + stack: stack[:length], + } +} + +// Wrap makes an Error from the given value. If that value is already an +// error then it will be used directly, if not, it will be passed to +// fmt.Errorf("%v"). The skip parameter indicates how far up the stack +// to start the stacktrace. 0 is from the current call, 1 from its caller, etc. +func Wrap(e interface{}, skip int) *Error { + var err error + + switch e := e.(type) { + case *Error: + return e + case error: + err = e + default: + err = fmt.Errorf("%v", e) + } + + stack := make([]uintptr, MaxStackDepth) + length := runtime.Callers(2+skip, stack[:]) + return &Error{ + Err: err, + stack: stack[:length], + } +} + +// WrapPrefix makes an Error from the given value. If that value is already an +// error then it will be used directly, if not, it will be passed to +// fmt.Errorf("%v"). The prefix parameter is used to add a prefix to the +// error message when calling Error(). The skip parameter indicates how far +// up the stack to start the stacktrace. 0 is from the current call, +// 1 from its caller, etc. +func WrapPrefix(e interface{}, prefix string, skip int) *Error { + + err := Wrap(e, 1+skip) + + if err.prefix != "" { + prefix = fmt.Sprintf("%s: %s", prefix, err.prefix) + } + + return &Error{ + Err: err.Err, + stack: err.stack, + prefix: prefix, + } + +} + +// Is detects whether the error is equal to a given error. Errors +// are considered equal by this function if they are the same object, +// or if they both contain the same error inside an errors.Error. +func Is(e error, original error) bool { + + if e == original { + return true + } + + if e, ok := e.(*Error); ok { + return Is(e.Err, original) + } + + if original, ok := original.(*Error); ok { + return Is(e, original.Err) + } + + return false +} + +// Errorf creates a new error with the given message. You can use it +// as a drop-in replacement for fmt.Errorf() to provide descriptive +// errors in return values. +func Errorf(format string, a ...interface{}) *Error { + return Wrap(fmt.Errorf(format, a...), 1) +} + +// Error returns the underlying error's message. +func (err *Error) Error() string { + + msg := err.Err.Error() + if err.prefix != "" { + msg = fmt.Sprintf("%s: %s", err.prefix, msg) + } + + return msg +} + +// Stack returns the callstack formatted the same way that go does +// in runtime/debug.Stack() +func (err *Error) Stack() []byte { + buf := bytes.Buffer{} + + for _, frame := range err.StackFrames() { + buf.WriteString(frame.String()) + } + + return buf.Bytes() +} + +// Callers satisfies the bugsnag ErrorWithCallerS() interface +// so that the stack can be read out. +func (err *Error) Callers() []uintptr { + return err.stack +} + +// ErrorStack returns a string that contains both the +// error message and the callstack. +func (err *Error) ErrorStack() string { + return err.TypeName() + " " + err.Error() + "\n" + string(err.Stack()) +} + +// StackFrames returns an array of frames containing information about the +// stack. +func (err *Error) StackFrames() []StackFrame { + if err.frames == nil { + err.frames = make([]StackFrame, len(err.stack)) + + for i, pc := range err.stack { + err.frames[i] = NewStackFrame(pc) + } + } + + return err.frames +} + +// TypeName returns the type this error. e.g. *errors.stringError. +func (err *Error) TypeName() string { + if _, ok := err.Err.(uncaughtPanic); ok { + return "panic" + } + return reflect.TypeOf(err.Err).String() +} diff --git a/vendor/github.com/go-errors/errors/parse_panic.go b/vendor/github.com/go-errors/errors/parse_panic.go new file mode 100644 index 000000000000..cc37052d7860 --- /dev/null +++ b/vendor/github.com/go-errors/errors/parse_panic.go @@ -0,0 +1,127 @@ +package errors + +import ( + "strconv" + "strings" +) + +type uncaughtPanic struct{ message string } + +func (p uncaughtPanic) Error() string { + return p.message +} + +// ParsePanic allows you to get an error object from the output of a go program +// that panicked. This is particularly useful with https://github.com/mitchellh/panicwrap. +func ParsePanic(text string) (*Error, error) { + lines := strings.Split(text, "\n") + + state := "start" + + var message string + var stack []StackFrame + + for i := 0; i < len(lines); i++ { + line := lines[i] + + if state == "start" { + if strings.HasPrefix(line, "panic: ") { + message = strings.TrimPrefix(line, "panic: ") + state = "seek" + } else { + return nil, Errorf("bugsnag.panicParser: Invalid line (no prefix): %s", line) + } + + } else if state == "seek" { + if strings.HasPrefix(line, "goroutine ") && strings.HasSuffix(line, "[running]:") { + state = "parsing" + } + + } else if state == "parsing" { + if line == "" { + state = "done" + break + } + createdBy := false + if strings.HasPrefix(line, "created by ") { + line = strings.TrimPrefix(line, "created by ") + createdBy = true + } + + i++ + + if i >= len(lines) { + return nil, Errorf("bugsnag.panicParser: Invalid line (unpaired): %s", line) + } + + frame, err := parsePanicFrame(line, lines[i], createdBy) + if err != nil { + return nil, err + } + + stack = append(stack, *frame) + if createdBy { + state = "done" + break + } + } + } + + if state == "done" || state == "parsing" { + return &Error{Err: uncaughtPanic{message}, frames: stack}, nil + } + return nil, Errorf("could not parse panic: %v", text) +} + +// The lines we're passing look like this: +// +// main.(*foo).destruct(0xc208067e98) +// /0/go/src/github.com/bugsnag/bugsnag-go/pan/main.go:22 +0x151 +func parsePanicFrame(name string, line string, createdBy bool) (*StackFrame, error) { + idx := strings.LastIndex(name, "(") + if idx == -1 && !createdBy { + return nil, Errorf("bugsnag.panicParser: Invalid line (no call): %s", name) + } + if idx != -1 { + name = name[:idx] + } + pkg := "" + + if lastslash := strings.LastIndex(name, "/"); lastslash >= 0 { + pkg += name[:lastslash] + "/" + name = name[lastslash+1:] + } + if period := strings.Index(name, "."); period >= 0 { + pkg += name[:period] + name = name[period+1:] + } + + name = strings.Replace(name, "·", ".", -1) + + if !strings.HasPrefix(line, "\t") { + return nil, Errorf("bugsnag.panicParser: Invalid line (no tab): %s", line) + } + + idx = strings.LastIndex(line, ":") + if idx == -1 { + return nil, Errorf("bugsnag.panicParser: Invalid line (no line number): %s", line) + } + file := line[1:idx] + + number := line[idx+1:] + if idx = strings.Index(number, " +"); idx > -1 { + number = number[:idx] + } + + lno, err := strconv.ParseInt(number, 10, 32) + if err != nil { + return nil, Errorf("bugsnag.panicParser: Invalid line (bad line number): %s", line) + } + + return &StackFrame{ + File: file, + LineNumber: int(lno), + Package: pkg, + Name: name, + }, nil +} diff --git a/vendor/github.com/go-errors/errors/stackframe.go b/vendor/github.com/go-errors/errors/stackframe.go new file mode 100644 index 000000000000..750ab9a52153 --- /dev/null +++ b/vendor/github.com/go-errors/errors/stackframe.go @@ -0,0 +1,102 @@ +package errors + +import ( + "bytes" + "fmt" + "io/ioutil" + "runtime" + "strings" +) + +// A StackFrame contains all necessary information about to generate a line +// in a callstack. +type StackFrame struct { + // The path to the file containing this ProgramCounter + File string + // The LineNumber in that file + LineNumber int + // The Name of the function that contains this ProgramCounter + Name string + // The Package that contains this function + Package string + // The underlying ProgramCounter + ProgramCounter uintptr +} + +// NewStackFrame popoulates a stack frame object from the program counter. +func NewStackFrame(pc uintptr) (frame StackFrame) { + + frame = StackFrame{ProgramCounter: pc} + if frame.Func() == nil { + return + } + frame.Package, frame.Name = packageAndName(frame.Func()) + + // pc -1 because the program counters we use are usually return addresses, + // and we want to show the line that corresponds to the function call + frame.File, frame.LineNumber = frame.Func().FileLine(pc - 1) + return + +} + +// Func returns the function that contained this frame. +func (frame *StackFrame) Func() *runtime.Func { + if frame.ProgramCounter == 0 { + return nil + } + return runtime.FuncForPC(frame.ProgramCounter) +} + +// String returns the stackframe formatted in the same way as go does +// in runtime/debug.Stack() +func (frame *StackFrame) String() string { + str := fmt.Sprintf("%s:%d (0x%x)\n", frame.File, frame.LineNumber, frame.ProgramCounter) + + source, err := frame.SourceLine() + if err != nil { + return str + } + + return str + fmt.Sprintf("\t%s: %s\n", frame.Name, source) +} + +// SourceLine gets the line of code (from File and Line) of the original source if possible. +func (frame *StackFrame) SourceLine() (string, error) { + data, err := ioutil.ReadFile(frame.File) + + if err != nil { + return "", New(err) + } + + lines := bytes.Split(data, []byte{'\n'}) + if frame.LineNumber <= 0 || frame.LineNumber >= len(lines) { + return "???", nil + } + // -1 because line-numbers are 1 based, but our array is 0 based + return string(bytes.Trim(lines[frame.LineNumber-1], " \t")), nil +} + +func packageAndName(fn *runtime.Func) (string, string) { + name := fn.Name() + pkg := "" + + // The name includes the path name to the package, which is unnecessary + // since the file name is already included. Plus, it has center dots. + // That is, we see + // runtime/debug.*T·ptrmethod + // and want + // *T.ptrmethod + // Since the package path might contains dots (e.g. code.google.com/...), + // we first remove the path prefix if there is one. + if lastslash := strings.LastIndex(name, "/"); lastslash >= 0 { + pkg += name[:lastslash] + "/" + name = name[lastslash+1:] + } + if period := strings.Index(name, "."); period >= 0 { + pkg += name[:period] + name = name[period+1:] + } + + name = strings.Replace(name, "·", ".", -1) + return pkg, name +} diff --git a/vendor/github.com/go-openapi/spec/.golangci.yml b/vendor/github.com/go-openapi/spec/.golangci.yml index 3e33f9f2e3ec..4e17ed4979b4 100644 --- a/vendor/github.com/go-openapi/spec/.golangci.yml +++ b/vendor/github.com/go-openapi/spec/.golangci.yml @@ -21,3 +21,8 @@ linters: - lll - gochecknoinits - gochecknoglobals + - funlen + - godox + - gocognit + - whitespace + - wsl diff --git a/vendor/github.com/go-openapi/spec/bindata.go b/vendor/github.com/go-openapi/spec/bindata.go index c67e2d877b01..66b1f32635d6 100644 --- a/vendor/github.com/go-openapi/spec/bindata.go +++ b/vendor/github.com/go-openapi/spec/bindata.go @@ -1,7 +1,7 @@ // Code generated by go-bindata. DO NOT EDIT. // sources: // schemas/jsonschema-draft-04.json (4.357kB) -// schemas/v2/schema.json (40.249kB) +// schemas/v2/schema.json (40.248kB) package spec @@ -70,43 +70,43 @@ func (fi bindataFileInfo) Sys() interface{} { return nil } -var _jsonschemaDraft04JSON = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x57\x3d\x6f\xdb\x3c\x10\xde\xf3\x2b\x08\x26\x63\xf2\x2a\x2f\xd0\xc9\x5b\xd1\x2e\x01\x5a\x34\x43\x37\x23\x03\x6d\x9d\x6c\x06\x14\xa9\x50\x54\x60\xc3\xd0\x7f\x2f\x28\x4a\x14\x29\x91\x92\x2d\xa7\x8d\x97\x28\xbc\xaf\xe7\x8e\xf7\xc5\xd3\x0d\x42\x08\x61\x9a\xe2\x15\xc2\x7b\xa5\x8a\x55\x92\xbc\x96\x82\x3f\x94\xdb\x3d\xe4\xe4\x3f\x21\x77\x49\x2a\x49\xa6\x1e\x1e\xbf\x24\xe6\xec\x16\xdf\x1b\xa1\x3b\xf3\xff\x02\xc9\x14\xca\xad\xa4\x85\xa2\x82\x6b\xe9\x6f\x42\x02\x32\x2c\x28\x07\x45\x5a\x15\x3d\x77\x46\x39\xd5\xcc\x25\x5e\x21\x83\xb8\x21\x18\xb6\xaf\x52\x92\xa3\x47\x68\x88\xea\x58\x80\x56\x4e\x1a\xf2\xbd\x4f\xcc\x29\x7f\x52\x90\x6b\x7d\xff\x0f\x48\xb4\x3d\x3f\x21\x7c\x27\x21\xd3\x2a\x6e\x31\xaa\x2d\x53\xdd\xf3\xe3\x42\x94\x54\xd1\x77\x78\xe2\x0a\x76\x20\xe3\x20\x68\xcb\x30\x86\x41\xf3\x2a\xc7\x2b\xf4\x78\x8e\xfe\xef\x90\x91\x8a\xa9\xc7\xb1\x1d\xc2\xd8\x2f\x0d\x75\xed\xc1\x4e\x9c\xc8\x25\x43\xac\xa8\xbe\xd7\xcc\xa9\xd1\xa9\x21\xa0\x1a\xbd\x04\x61\x94\x34\x2f\x18\xfc\x3e\x16\x50\x8e\x4d\x03\x6f\x1c\x58\xdb\x48\x23\xbc\x11\x82\x01\xe1\xfa\xd3\x3a\x8e\x30\xaf\x18\x33\x7f\xf3\x8d\x39\x11\x9b\x57\xd8\x2a\xfd\x55\x2a\x49\xf9\x0e\xc7\xec\x37\xd4\x25\xf7\xec\x5c\x66\xc7\xd7\x99\xaa\xcf\x4f\x89\x8a\xd3\xb7\x0a\x3a\xaa\x92\x15\xf4\x30\x6f\x1c\xb0\xd6\x46\xe7\x98\x39\x2d\xa4\x28\x40\x2a\x3a\x88\x9e\x29\xba\x88\x37\x2d\xca\x60\x38\xfa\xba\x5b\x20\xac\xa8\x62\xb0\x4c\xd4\xaf\xda\x45\x0a\xba\x5c\x3b\xb9\xc7\x79\xc5\x14\x2d\x18\x34\x19\x1c\x51\xdb\x25\x4d\xb4\x7e\x06\x14\x38\x6c\x59\x55\xd2\x77\xf8\x69\x59\xfc\x7b\x73\xed\x93\x43\xcb\x32\x6d\x3c\x28\xdc\x1b\x9a\xd3\x62\xab\xc2\x27\xf7\x41\xc9\x08\x2b\x23\x08\xad\x13\x57\x21\x9c\xd3\x72\x0d\x42\x72\xf8\x01\x7c\xa7\xf6\x83\xce\x39\xd7\x82\x3c\x1f\x2f\xd6\x60\x1b\xa2\xdf\x35\x89\x52\x20\xe7\x73\x74\xe0\x66\x26\x64\x4e\xb4\x97\x58\xc2\x0e\x0e\xe1\x60\x92\x34\x6d\xa0\x10\xd6\xb5\x83\x61\x27\xe6\x47\xd3\x89\xbd\x63\xfd\x3b\x8d\x03\x3d\x6c\x42\x2d\x5b\x70\xee\xe8\xdf\x4b\xf4\x66\x4e\xe1\x01\x45\x17\x80\x74\xad\x4f\xc3\xf3\xae\xc6\x1d\xc6\xd7\xc2\xce\xc9\xe1\x29\x30\x86\x2f\x4a\xa6\x4b\x15\x84\x73\xc9\x6f\xfd\x7f\xa5\x6e\x9e\xbd\xf1\xb0\xd4\xdd\x45\x5a\xc2\x3e\x4b\x78\xab\xa8\x84\x74\x4a\x91\x3b\x92\x23\x05\xf2\x1c\x1e\x7b\xf3\x09\xf8\xcf\xab\x24\xb6\x60\xa2\xe8\x4c\x9f\x75\x77\xaa\x8c\xe6\x01\x45\x36\x86\xcf\xc3\x63\x3a\xea\xd4\x8d\x7e\x06\xac\x14\x0a\xe0\x29\xf0\xed\x07\x22\x1a\x65\xda\x44\xae\xa2\x73\x1a\xe6\x90\x69\xa2\x8c\x46\xb2\x2f\xde\x49\x38\x08\xed\xfe\xfd\x41\xaf\x9f\xa9\x55\xd7\xdd\x22\x8d\xfa\x45\x63\xc5\x0f\x80\xf3\xb4\x08\xd6\x79\x30\x9e\x93\xee\x59\xa6\xd0\x4b\xee\x22\xe3\x33\xc1\x3a\x27\x68\x36\x78\x7e\x87\x0a\x06\xd5\x2e\x20\xd3\xaf\x15\xfb\xd8\x3b\x73\x14\xbb\x92\xed\x05\x5d\x2e\x29\x38\x2c\x94\xe4\x42\x45\x5e\xd3\xb5\x7d\xdf\x47\xca\x38\xb4\x5c\xaf\xfb\x7d\xdd\x6d\xf4\xa1\x2d\x77\xdd\x2f\xce\x6d\xc4\x7b\x8b\x4e\x67\xa9\x6f\xfe\x04\x00\x00\xff\xff\xb1\xd1\x27\x78\x05\x11\x00\x00") +var _jsonschemaDraft04Json = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x57\x3d\x6f\xdb\x3c\x10\xde\xf3\x2b\x08\x26\x63\xf2\x2a\x2f\xd0\xc9\x5b\xd1\x2e\x01\x5a\x34\x43\x37\x23\x03\x6d\x9d\x6c\x06\x14\xa9\x50\x54\x60\xc3\xd0\x7f\x2f\x28\x4a\x14\x29\x91\x92\x2d\xa7\x8d\x97\x28\xbc\xaf\xe7\x8e\xf7\xc5\xd3\x0d\x42\x08\x61\x9a\xe2\x15\xc2\x7b\xa5\x8a\x55\x92\xbc\x96\x82\x3f\x94\xdb\x3d\xe4\xe4\x3f\x21\x77\x49\x2a\x49\xa6\x1e\x1e\xbf\x24\xe6\xec\x16\xdf\x1b\xa1\x3b\xf3\xff\x02\xc9\x14\xca\xad\xa4\x85\xa2\x82\x6b\xe9\x6f\x42\x02\x32\x2c\x28\x07\x45\x5a\x15\x3d\x77\x46\x39\xd5\xcc\x25\x5e\x21\x83\xb8\x21\x18\xb6\xaf\x52\x92\xa3\x47\x68\x88\xea\x58\x80\x56\x4e\x1a\xf2\xbd\x4f\xcc\x29\x7f\x52\x90\x6b\x7d\xff\x0f\x48\xb4\x3d\x3f\x21\x7c\x27\x21\xd3\x2a\x6e\x31\xaa\x2d\x53\xdd\xf3\xe3\x42\x94\x54\xd1\x77\x78\xe2\x0a\x76\x20\xe3\x20\x68\xcb\x30\x86\x41\xf3\x2a\xc7\x2b\xf4\x78\x8e\xfe\xef\x90\x91\x8a\xa9\xc7\xb1\x1d\xc2\xd8\x2f\x0d\x75\xed\xc1\x4e\x9c\xc8\x25\x43\xac\xa8\xbe\xd7\xcc\xa9\xd1\xa9\x21\xa0\x1a\xbd\x04\x61\x94\x34\x2f\x18\xfc\x3e\x16\x50\x8e\x4d\x03\x6f\x1c\x58\xdb\x48\x23\xbc\x11\x82\x01\xe1\xfa\xd3\x3a\x8e\x30\xaf\x18\x33\x7f\xf3\x8d\x39\x11\x9b\x57\xd8\x2a\xfd\x55\x2a\x49\xf9\x0e\xc7\xec\x37\xd4\x25\xf7\xec\x5c\x66\xc7\xd7\x99\xaa\xcf\x4f\x89\x8a\xd3\xb7\x0a\x3a\xaa\x92\x15\xf4\x30\x6f\x1c\xb0\xd6\x46\xe7\x98\x39\x2d\xa4\x28\x40\x2a\x3a\x88\x9e\x29\xba\x88\x37\x2d\xca\x60\x38\xfa\xba\x5b\x20\xac\xa8\x62\xb0\x4c\xd4\xaf\xda\x45\x0a\xba\x5c\x3b\xb9\xc7\x79\xc5\x14\x2d\x18\x34\x19\x1c\x51\xdb\x25\x4d\xb4\x7e\x06\x14\x38\x6c\x59\x55\xd2\x77\xf8\x69\x59\xfc\x7b\x73\xed\x93\x43\xcb\x32\x6d\x3c\x28\xdc\x1b\x9a\xd3\x62\xab\xc2\x27\xf7\x41\xc9\x08\x2b\x23\x08\xad\x13\x57\x21\x9c\xd3\x72\x0d\x42\x72\xf8\x01\x7c\xa7\xf6\x83\xce\x39\xd7\x82\x3c\x1f\x2f\xd6\x60\x1b\xa2\xdf\x35\x89\x52\x20\xe7\x73\x74\xe0\x66\x26\x64\x4e\xb4\x97\x58\xc2\x0e\x0e\xe1\x60\x92\x34\x6d\xa0\x10\xd6\xb5\x83\x61\x27\xe6\x47\xd3\x89\xbd\x63\xfd\x3b\x8d\x03\x3d\x6c\x42\x2d\x5b\x70\xee\xe8\xdf\x4b\xf4\x66\x4e\xe1\x01\x45\x17\x80\x74\xad\x4f\xc3\xf3\xae\xc6\x1d\xc6\xd7\xc2\xce\xc9\xe1\x29\x30\x86\x2f\x4a\xa6\x4b\x15\x84\x73\xc9\x6f\xfd\x7f\xa5\x6e\x9e\xbd\xf1\xb0\xd4\xdd\x45\x5a\xc2\x3e\x4b\x78\xab\xa8\x84\x74\x4a\x91\x3b\x92\x23\x05\xf2\x1c\x1e\x7b\xf3\x09\xf8\xcf\xab\x24\xb6\x60\xa2\xe8\x4c\x9f\x75\x77\xaa\x8c\xe6\x01\x45\x36\x86\xcf\xc3\x63\x3a\xea\xd4\x8d\x7e\x06\xac\x14\x0a\xe0\x29\xf0\xed\x07\x22\x1a\x65\xda\x44\xae\xa2\x73\x1a\xe6\x90\x69\xa2\x8c\x46\xb2\x2f\xde\x49\x38\x08\xed\xfe\xfd\x41\xaf\x9f\xa9\x55\xd7\xdd\x22\x8d\xfa\x45\x63\xc5\x0f\x80\xf3\xb4\x08\xd6\x79\x30\x9e\x93\xee\x59\xa6\xd0\x4b\xee\x22\xe3\x33\xc1\x3a\x27\x68\x36\x78\x7e\x87\x0a\x06\xd5\x2e\x20\xd3\xaf\x15\xfb\xd8\x3b\x73\x14\xbb\x92\xed\x05\x5d\x2e\x29\x38\x2c\x94\xe4\x42\x45\x5e\xd3\xb5\x7d\xdf\x47\xca\x38\xb4\x5c\xaf\xfb\x7d\xdd\x6d\xf4\xa1\x2d\x77\xdd\x2f\xce\x6d\xc4\x7b\x8b\x4e\x67\xa9\x6f\xfe\x04\x00\x00\xff\xff\xb1\xd1\x27\x78\x05\x11\x00\x00") -func jsonschemaDraft04JSONBytes() ([]byte, error) { +func jsonschemaDraft04JsonBytes() ([]byte, error) { return bindataRead( - _jsonschemaDraft04JSON, + _jsonschemaDraft04Json, "jsonschema-draft-04.json", ) } -func jsonschemaDraft04JSON() (*asset, error) { - bytes, err := jsonschemaDraft04JSONBytes() +func jsonschemaDraft04Json() (*asset, error) { + bytes, err := jsonschemaDraft04JsonBytes() if err != nil { return nil, err } - info := bindataFileInfo{name: "jsonschema-draft-04.json", size: 4357, mode: os.FileMode(0644), modTime: time.Unix(1567900649, 0)} + info := bindataFileInfo{name: "jsonschema-draft-04.json", size: 4357, mode: os.FileMode(0640), modTime: time.Unix(1568963823, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xe1, 0x48, 0x9d, 0xb, 0x47, 0x55, 0xf0, 0x27, 0x93, 0x30, 0x25, 0x91, 0xd3, 0xfc, 0xb8, 0xf0, 0x7b, 0x68, 0x93, 0xa8, 0x2a, 0x94, 0xf2, 0x48, 0x95, 0xf8, 0xe4, 0xed, 0xf1, 0x1b, 0x82, 0xe2}} return a, nil } -var _v2SchemaJSON = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5d\x4f\x93\xdb\x36\xb2\xbf\xfb\x53\xa0\x14\x57\xd9\xae\xd8\x92\xe3\xf7\x2e\xcf\x97\xd4\xbc\xd8\x49\x66\x37\x5e\x4f\x79\x26\xbb\x87\x78\x5c\x05\x91\x2d\x09\x09\x09\x30\x00\x38\x33\x5a\xef\x7c\xf7\x2d\xf0\x9f\x08\x02\x20\x41\x8a\xd2\xc8\x0e\x0f\xa9\x78\x28\xa0\xd1\xdd\x68\x34\x7e\xdd\xf8\xf7\xf9\x11\x42\x33\x49\x64\x04\xb3\xd7\x68\x76\x86\xfe\x76\xf9\xfe\x1f\xe8\x32\xd8\x40\x8c\xd1\x8a\x71\x74\x79\x8b\xd7\x6b\xe0\xe8\xd5\xfc\x25\x3a\xbb\x38\x9f\xcf\x9e\xab\x0a\x24\x54\xa5\x37\x52\x26\xaf\x17\x0b\x91\x17\x99\x13\xb6\xb8\x79\xb5\x10\x59\xdd\xf9\xef\x82\xd1\x6f\xf2\xc2\x8f\xf3\x4f\xb5\x1a\xea\xc7\x17\x45\x41\xc6\xd7\x8b\x90\xe3\x95\x7c\xf1\xf2\x7f\x8b\xca\x45\x3d\xb9\x4d\x32\xa6\xd8\xf2\x77\x08\x64\xfe\x8d\xc3\x9f\x29\xe1\xa0\x9a\xff\xed\x11\x42\x08\xcd\x8a\xd6\xb3\x9f\x15\x67\x74\xc5\xca\x7f\x27\x58\x6e\xc4\xec\x11\x42\xd7\x59\x5d\x1c\x86\x44\x12\x46\x71\x74\xc1\x59\x02\x5c\x12\x10\xb3\xd7\x68\x85\x23\x01\x59\x81\x04\x4b\x09\x9c\x6a\xbf\x7e\xce\x49\x7d\xba\x7b\x51\xfd\xa1\x44\xe2\xb0\x52\xac\x7d\xb3\x08\x61\x45\x68\x46\x56\x2c\x6e\x80\x86\x8c\xbf\xbd\x93\x40\x05\x61\x74\x96\x95\xbe\x7f\x84\xd0\x7d\x4e\xde\x42\xb7\xe4\xbe\x46\xbb\x14\x5b\x48\x4e\xe8\xba\x90\x05\xa1\x19\xd0\x34\xae\xc4\xce\xbe\xbc\x9a\xbf\x9c\x15\x7f\x5d\x57\xc5\x42\x10\x01\x27\x89\xe2\x48\x51\xb9\xda\x40\xd5\x87\x37\xc0\x15\x5f\x88\xad\x90\xdc\x10\x81\x42\x16\xa4\x31\x50\x39\x2f\x38\xad\xab\xb0\x53\xd8\xac\x94\x56\x6f\xc3\x84\xf4\x11\xa4\x50\xb3\xfa\xe9\xd3\x6f\x9f\x3e\xdf\x2f\xd0\xeb\x8f\x1f\x3f\x7e\xbc\xfe\xf6\xe9\xf7\xaf\x5f\x7f\xfc\x18\x7e\xfb\xec\xfb\xc7\xb3\x36\x79\x54\x43\xe8\x29\xc5\x31\x20\xc6\x11\x49\x9e\xe5\x12\x41\x66\xa0\xe8\xed\x1d\x8e\x93\x08\x5e\xa3\x27\x3b\xc3\x7c\xa2\x73\xba\xc4\x02\x2e\xb0\xdc\xf4\xe5\x76\xd1\xca\x96\xa2\x8a\x94\xcd\x21\xc9\x6c\xec\x2c\x70\x42\x9e\x34\x74\x9d\x19\x7c\xcd\x20\x9c\xea\x2e\x0a\xfe\x42\x84\xd4\x29\x04\x8c\x8a\xb4\x41\xa2\xc1\xdc\x19\x8a\x88\x90\x4a\x49\xef\xce\xdf\xbd\x45\x4a\x52\x81\x70\x10\x40\x22\x21\x44\xcb\x6d\xc5\xec\x4e\x3c\x1c\x45\xef\x57\x9a\xb5\x7d\xae\xfe\xe5\xe4\x31\x86\x90\xe0\xab\x6d\x02\x3b\x2e\xcb\x11\x90\xd9\xa8\xc6\x77\xc2\x59\x98\x06\xfd\xf9\x2e\x78\x45\x01\xa6\xa8\xa0\x71\x5c\xbe\x33\xa7\xd2\xd9\x5f\x95\xef\xd9\xd5\xac\xfd\xdc\x5d\xbf\x5e\xb8\xd1\x3e\xc7\x31\x48\xe0\x5e\x4c\x14\x65\xdf\xb8\xa8\x71\x10\x09\xa3\xc2\xc7\x02\xcb\xa2\x4e\x5a\x02\x82\x94\x13\xb9\xf5\x30\xe6\xb2\xa4\xb5\xfe\x9b\x3e\x7a\xb2\x55\xd2\xa8\x4a\xbc\x16\xb6\x71\x8e\x39\xc7\xdb\x9d\xe1\x10\x09\x71\xbd\x9c\xb3\x41\x89\xd7\xa5\x89\xdc\x57\xb5\x53\x4a\xfe\x4c\xe1\xbc\xa0\x21\x79\x0a\x1a\x0f\x70\xa7\x5c\x08\x8e\xde\xb0\xc0\x43\x24\xad\x74\x63\x0e\xb1\xd9\x90\xe1\xb0\x2d\x13\xa7\x6d\x78\xfd\x04\x14\x38\x8e\x90\xaa\xce\x63\xac\x3e\x23\xbc\x64\xa9\xb4\xf8\x03\x63\xde\xcd\xbe\x16\x13\x4a\x55\xac\x82\x12\xc6\xac\xd4\x35\xf7\x22\xd4\x3a\xff\x22\x73\x0e\x6e\x51\xa0\x75\x1e\xae\x8f\xe8\x5d\xc7\x59\xe6\xe4\x9a\x18\x8d\xd6\x1c\x53\x84\x4d\xb7\x67\x28\x37\x09\x84\x69\x88\x12\x0e\x01\x11\x80\x32\xa2\xf5\xb9\xaa\xc6\xd9\x73\x53\xab\xfb\xb4\x2e\x20\xc6\x54\x92\xa0\x9a\xf3\x69\x1a\x2f\x81\x77\x37\xae\x53\x1a\xce\x40\xc4\xa8\x82\x1c\xb5\xef\xda\x24\x7d\xb9\x61\x69\x14\xa2\x25\xa0\x90\xac\x56\xc0\x81\x4a\xb4\xe2\x2c\xce\x4a\x64\x7a\x9a\x23\xf4\x13\x91\x3f\xa7\x4b\xf4\x63\x84\x6f\x18\x87\x10\xbd\xc3\xfc\x8f\x90\xdd\x52\x44\x04\xc2\x51\xc4\x6e\x21\x74\x48\x21\x81\xc7\xe2\xfd\xea\x12\xf8\x0d\x09\xf6\xe9\x47\x35\xaf\x67\xc4\x14\xf7\x22\x27\x97\xe1\xe2\x76\x2d\x06\x8c\x4a\x1c\x48\x3f\x73\x2d\x0b\x5b\x29\x45\x24\x00\x2a\x0c\x11\xec\x94\xca\xc2\xa6\xc1\x37\x21\x43\x83\x3b\x5f\x97\xf1\x43\x5e\x53\x73\x19\xa5\x36\xd8\x2d\x05\x2e\x34\x0b\xeb\x39\xfc\x1d\x63\x51\x01\xbd\x3d\xbb\x90\x84\x40\x25\x59\x6d\x09\x5d\xa3\x1c\x37\xe6\x5c\x16\x9a\x40\x09\x70\xc1\xe8\x82\xf1\x35\xa6\xe4\xdf\x99\x5c\x8e\x9e\x4d\x79\xb4\x27\x2f\xbf\x7e\xf8\x05\x25\x8c\x50\xa9\x98\x29\x90\x62\x60\xea\x75\xae\x13\xca\xbf\x2b\x1a\x29\x27\x76\xd6\x20\xc6\x64\x5f\xe6\x32\x1a\x08\x87\x21\x07\x21\xbc\xb4\xe4\xe0\x32\x67\xa6\xcd\xf3\x1e\xcd\xd9\x6b\xb6\x6f\x8e\x27\xa7\xed\xdb\xe7\xbc\xcc\x1a\x07\xce\x6f\x87\x33\xf0\xba\x51\x17\x22\x66\x78\x79\x8e\xce\xe5\x13\x81\x80\x06\x2c\xe5\x78\x0d\xa1\xb2\xb8\x54\xa8\x79\x09\xbd\xbf\x3c\x47\x01\x8b\x13\x2c\xc9\x32\xaa\xaa\x1d\xd5\xee\xab\x36\xbd\x6c\xfd\x54\x6c\xc8\x08\x01\x3c\xbd\xe7\x07\x88\xb0\x24\x37\x79\x90\x28\x4a\x1d\x10\x1a\x92\x1b\x12\xa6\x38\x42\x40\xc3\x4c\x43\x62\x8e\xae\x36\xb0\x45\x71\x2a\xa4\x9a\x23\x79\x59\xb1\xa8\xf2\xa4\x0c\x60\x9f\xcc\x8d\x40\xf5\x80\xca\xa8\x99\xc3\xa7\x85\x1f\x31\x25\xa9\x82\xc5\x6d\xbd\xd8\x36\x76\x7c\x02\x28\x97\xf6\x1d\x74\x3b\x11\x7e\x91\xae\x32\xf8\x6c\xf4\xe6\x7b\x9a\xa5\x1f\x62\xc6\x21\xcf\x9a\xe5\xed\x8b\x02\xf3\x2c\x33\x33\xdf\x00\xca\xc9\x09\xb4\x04\xf5\xa5\x08\xd7\xc3\x02\x18\x66\xf1\xab\x1e\x83\x37\x4c\xcd\x12\xc1\x1d\x50\xf6\xaa\xbd\xfe\xe2\x73\x48\x38\x08\xa0\x32\x9b\x18\x44\x86\x0b\x6a\xc1\xaa\x26\x96\x2d\x96\x3c\xa0\x54\x65\x73\x87\x15\xca\x15\xe5\xf5\x94\x46\x9f\x33\x1a\x0c\x9a\xb1\x5a\xd9\x6a\x95\xcd\xcb\x7e\xec\x9a\xc5\x94\x3b\x37\x26\x31\xd7\xfc\xe4\x1f\x13\x8c\x31\x75\x9c\xba\xf7\x87\x3c\xa1\xb7\x4f\x17\x1b\x09\x82\x98\xc4\x70\x95\xd3\xe8\x4c\x48\x5a\xa6\xd6\x2a\x3d\x56\x42\x80\x9f\xaf\xae\x2e\x50\x0c\x42\xe0\x35\x34\x3c\x8a\x62\x03\x37\xba\xb2\x27\x04\xda\x25\x8d\x06\xe2\xa0\x13\x8a\xf3\xf5\xec\x10\x72\x67\x88\x90\x3d\x4b\x64\xeb\xaa\xda\x8f\xf7\x5a\x75\x47\x9a\xa8\x51\x70\x26\xd2\x38\xc6\x7c\xbb\x57\xfc\xbd\xe4\x04\x56\xa8\xa0\x54\x9a\x45\xd5\xf7\x0f\x16\xfc\x57\x1c\x3c\xdf\x23\xba\x77\x38\xda\x16\x4b\x31\x53\x6a\x4d\x9a\x15\x63\xe7\xe1\x18\x69\x9f\x22\xe0\x24\xbb\x94\x4b\x97\xee\x2d\xf9\x70\x87\x72\x7b\xe6\xc4\x33\x2a\x66\x5e\x1c\x35\x72\xe3\x2d\xda\x73\xe4\xc7\x51\x6d\xa4\xa1\x2a\x4f\xde\x94\xcb\xb2\x3e\x31\x48\xae\x82\xce\xc9\xc8\x65\xcd\xc3\xb7\x34\xb6\x2b\xdf\x58\x65\x78\x6e\x73\xac\x5e\x24\x0d\x3f\xdc\x70\x23\xc6\xda\x52\x0b\x2d\x63\x7d\xa9\x49\x2d\x54\x48\x28\xc0\x12\x9c\xe3\x63\xc9\x58\x04\x98\x36\x07\xc8\x0a\xa7\x91\xd4\xf0\xbc\xc1\xa8\xb9\x70\xd0\xc6\xa9\xb6\x78\x80\x5a\xa3\xb4\x2c\xf4\x18\x0b\x8a\x9d\xd0\xb4\x55\x10\xee\x0d\xc5\xd6\xe0\x99\x93\xdc\xa1\x04\xbb\xf1\xa7\x23\xd1\xd1\x97\x8c\x87\x13\x0a\x21\x02\xe9\x99\x25\xed\x20\xc5\x92\x66\x3c\x32\x9c\xd6\x06\xb0\x31\x5c\x86\x29\x0a\xcb\x60\x33\x12\xa5\x91\xfc\x96\x75\xd0\x59\xd7\x13\xbd\xd3\x23\x79\xdd\x2a\x90\xa6\x38\x06\x91\x39\x7f\x20\x72\x03\x1c\x2d\x01\x61\xba\x45\x37\x38\x22\x61\x8e\x71\x85\xc4\x32\x15\x28\x60\x61\x16\xb8\x3d\x29\xdc\x4d\x3d\x2f\x12\x13\x7d\xc8\x7e\x37\xee\xa8\x7f\xfa\xdb\xcb\x17\xff\x77\xfd\xf9\x7f\xee\x9f\x3d\xfe\xcf\xa7\xa7\x45\xfb\xcf\x1e\xf7\xf3\xe0\xff\xc4\x51\x0a\x8e\x4c\xcb\x01\xdc\x0a\x65\xb2\x01\x83\xed\x3d\xe4\xa9\xa3\x4e\x2d\x59\xc5\xe8\x2f\x48\x7d\x5a\x6e\x37\xbf\x5c\x9f\x35\x13\x64\x14\xfa\xef\x0b\x68\xa6\x0d\xb4\x8e\xf1\xa8\xff\xbb\x60\xf4\x03\x64\xab\x5b\x81\x65\x51\xe6\xda\xca\xfa\xf0\xb0\xac\x3e\x9c\xca\x26\x0e\x1d\xdb\x57\x5b\xbb\xb4\x9a\xa6\xb6\x9b\x1a\x6b\xd1\x9a\x9e\x7e\x33\x9a\xec\x41\x69\x45\x22\xb8\xb4\x51\xeb\x04\x77\xca\x6f\x7b\x7b\xc8\xb2\xb0\x95\x92\x25\x5b\xd0\x42\xaa\x2a\xdd\x32\x78\x4f\x0c\xab\x68\x46\x6c\xea\x6d\xf4\x5c\x5e\xde\xc4\xac\xa5\xf9\xd1\x00\x9f\x7d\x98\x65\x24\xbd\xc7\x97\xd4\xb3\x3a\xa8\x2b\xa0\x34\x76\xf9\x65\x5f\x2d\x25\x95\x1b\xcf\xd6\xf4\x9b\x5f\x09\x95\xb0\x36\x3f\xdb\xd0\x39\x2a\x93\x1c\x9d\x03\xa2\x4a\xca\xf5\xf6\x10\xb6\x94\x89\x0b\x6a\x70\x12\x13\x49\x6e\x40\xe4\x29\x12\x2b\xbd\x80\x45\x11\x04\xaa\xc2\x8f\x56\x9e\x5c\x6b\xec\x8d\x5a\x0e\x14\x59\x06\x2b\x1e\x24\xcb\xc2\x56\x4a\x31\xbe\x23\x71\x1a\xfb\x51\x2a\x0b\x3b\x1c\x48\x10\xa5\x82\xdc\xc0\xbb\x3e\x24\x8d\x5a\x76\x2e\x09\xed\xc1\x65\x51\xb8\x83\xcb\x3e\x24\x8d\x5a\x2e\x5d\xfe\x02\x74\x2d\x3d\xf1\xef\xae\xb8\x4b\xe6\x5e\xd4\xaa\xe2\x2e\x5c\x5e\xec\x0e\xf5\x5b\x0c\xcb\x0a\xbb\xa4\x3c\xf7\x1f\x2a\x55\x69\x97\x8c\x7d\x68\x95\xa5\xad\xb4\xf4\x9c\xa5\x07\xb9\x7a\x05\xbb\xad\x50\x6f\xfb\xa0\x4e\x9b\x48\x23\x49\x92\x28\x87\x19\x3e\x32\xee\xca\x3b\x46\x7e\x7f\x18\x64\xcc\xcc\x0f\x34\xe9\x36\x8b\xb7\x6c\xa8\xa5\x5b\x54\x4c\x54\x5b\x15\x3a\xf1\x6c\x2d\xfe\x96\xc8\x0d\xba\x7b\x81\x88\xc8\x23\xab\xee\x7d\x3b\x92\xa7\x60\x29\xe3\xdc\xff\xb8\x64\xe1\xf6\xa2\x5a\x59\xdc\x6f\xeb\x45\x7d\x6a\xd1\x76\x1e\xea\xb8\xf1\xfa\x14\xd3\x36\x63\xe5\xd7\xf3\xe4\xbe\x25\xbd\x5e\x05\xeb\x73\x74\xb5\x21\x2a\x2e\x4e\xa3\x30\xdf\xbf\x43\x28\x2a\xd1\xa5\x2a\x9d\x8a\xfd\x76\xd8\x8d\xbc\x67\x65\xc7\xb8\x03\x45\xec\xa3\xb0\x37\x8a\x70\x4c\x68\x91\x51\x8e\x58\x80\xed\x4a\xf3\x81\x62\xca\x96\xbb\xf1\x52\xcd\x80\xfb\xe4\x4a\x5d\x6c\xdf\x6e\x20\x4b\x80\x30\x8e\x28\x93\xf9\xe9\x8d\x8a\x6d\xd5\x59\x65\x7b\xaa\x44\x9e\xc0\xc2\xd1\x7c\x40\x26\xd6\x1a\xce\xf9\xc5\x69\x7b\x6c\xec\xc8\x71\x7b\xe5\x21\x2e\xd3\xe5\x65\x93\x91\x53\x0b\x7b\x3a\xc7\xfa\x17\x6a\x01\xa7\x33\xd0\xf4\x40\x0f\x39\x87\xda\xe4\x54\x87\x3a\xd5\xe3\xc7\xa6\x8e\x20\xd4\x11\xb2\x4e\xb1\xe9\x14\x9b\x4e\xb1\xe9\x14\x9b\xfe\x15\x63\xd3\x47\xf5\xff\x97\x38\xe9\xcf\x14\xf8\x76\x82\x49\x13\x4c\xaa\x7d\xcd\x6c\x62\x42\x49\x87\x43\x49\x19\x33\x6f\xe3\x44\x6e\x9b\xab\x8a\x3e\x86\xaa\x99\x52\x1b\x5b\x59\x33\x02\x09\xa0\x21\xa1\x6b\x84\x6b\x66\xbb\xdc\x16\x0c\xd3\x68\xab\xec\x36\x4b\xd8\x60\x8a\x40\x31\x85\x6e\x14\x57\x13\xc2\xfb\x92\x10\xde\xbf\x88\xdc\xbc\x53\x5e\x7f\x82\x7a\x13\xd4\x9b\xa0\xde\x04\xf5\x90\x01\xf5\x94\xcb\x7b\x83\x25\x9e\xd0\xde\x84\xf6\x6a\x5f\x4b\xb3\x98\x00\xdf\x04\xf8\x6c\xbc\x7f\x19\x80\xaf\xf1\x71\x45\x22\x98\x40\xe0\x04\x02\x27\x10\xd8\x29\xf5\x04\x02\xff\x4a\x20\x30\xc1\x72\xf3\x65\x02\x40\xd7\xc1\xd1\xe2\x6b\xf1\xa9\x7b\xfb\xe4\x20\xc0\x68\x9d\xd4\xb4\xd3\x96\xb5\xa6\xd1\x41\x20\xe6\x89\xc3\x48\x65\x58\x13\x84\x9c\x56\x56\x3b\x0c\xe0\x6b\x83\x5c\x13\xd2\x9a\x90\xd6\x84\xb4\x26\xa4\x85\x0c\xa4\x45\x19\xfd\xff\x63\x6c\x52\xb5\x1f\x1e\x19\x74\x3a\xcd\xb9\x69\xce\xa6\x3a\x0f\x7a\x2d\x19\xc7\x81\x14\x5d\xcb\xd5\x03\xc9\x39\xd0\xb0\xd1\xb3\xcd\xfb\x7a\x2d\x5d\x3a\x48\xe1\xfa\x2e\xe6\x81\x42\x18\x86\xd6\xc1\xbe\xb1\x23\xd3\xf7\x34\xed\x19\x0a\x0b\xc4\x48\x44\xfd\x22\x50\xb6\x42\x58\xbb\xe5\x3d\xa7\x73\xd4\x8b\xc4\x8c\x70\x61\xec\x73\xee\xc3\x81\x8b\xf5\xe2\xd7\x52\x3e\xcf\xeb\xeb\x17\x3b\x71\x16\xda\x7d\xb8\xde\xf0\x7a\x8f\x06\x2d\xa7\x40\x7b\xc1\x9d\x41\x4d\xb6\x61\xa2\x4e\x9f\x3d\xa0\xc5\xae\xe3\x1c\x1d\x40\x6c\x48\x8b\x63\xa0\xb5\x01\xed\x8e\x02\xe9\x86\xc8\x3b\x06\xee\xdb\x4b\xde\xbd\xc0\xa1\x6f\xcb\xda\xfc\xc2\x44\x16\x87\x9c\x17\x31\xd3\x30\x20\x39\x42\xcb\x6f\xf2\xf1\xf4\x72\x10\xf8\x1c\xa0\xf3\xbd\x10\xea\x21\x35\x7d\xe8\x86\xdb\x15\xed\x81\x81\x07\x28\xbb\x13\x28\xc7\xf8\xce\x7d\x8d\xc2\x31\xb4\x7e\x94\xd6\xdb\x55\xef\x4a\xfb\xed\xc3\x40\x3e\xeb\x9f\xe9\x99\x0f\xdf\x08\x65\x88\x27\x73\x86\x31\x9d\x47\xdf\x55\x19\xba\x3d\xee\x15\x0a\xcd\x8c\xaa\x5e\xb9\xf6\x57\x33\x73\x5a\xa1\x89\x7b\x3b\xa0\xb2\xa4\xc2\xf6\xc1\x53\xb5\x00\xca\x23\xe5\xf4\x60\x6a\xb4\x2d\x74\xea\x4e\xed\x3b\xe3\x47\xfb\xed\x82\x3d\x19\xd4\x3b\x6b\xaf\xae\x2b\x2f\x57\xb3\x82\x68\xcb\xed\x88\x2e\xe1\x5c\xd7\x26\xfa\x0a\x65\xe7\xce\x11\x33\xb4\xdd\x66\xe3\x37\xf6\xfa\x70\xd6\x4f\xa1\x21\x51\xd8\x3c\x26\x14\x4b\xc6\x87\x44\x27\x1c\x70\xf8\x9e\x46\xce\xab\x21\x07\x5f\xc1\x76\x17\x1b\x77\xb4\xda\x75\xa0\x0a\x3a\x30\xe1\xf8\x97\x32\x16\x2b\x00\x75\x85\xee\x62\x46\xef\xd3\x85\xb5\x6b\x60\xbe\xf2\x30\x7a\x8c\x0b\x4b\xa6\xd0\xf9\x64\x42\xe7\x07\x41\x41\xe3\x2c\x5d\xf9\x6d\xe9\x39\x98\x3b\x3b\x5d\x67\xd4\x5c\xed\xf2\xf0\x48\x7b\xbd\x2d\x31\xdd\x3f\x34\xad\x44\x76\x51\x9a\x56\x22\xa7\x95\xc8\x69\x25\xf2\xe1\x56\x22\x1f\x00\x32\x6a\x73\x92\xed\xe1\xc6\x7d\x9f\x49\x2c\x69\x7e\xc8\x31\x4c\x0c\xb4\xf2\x54\x3b\x79\x3b\x9e\x4d\xb4\xd1\x18\x3e\x5f\x9a\x93\xa2\x11\xc3\xda\x27\x0b\xaf\x37\x2e\x5c\x37\xfb\xeb\x9a\xd6\xc3\xac\xc3\xcc\xf8\x1e\x5b\x9d\xac\x22\x64\xb7\xed\x26\xb8\xf3\xb9\x3c\xbb\x1f\xe2\xb0\x22\x77\x43\x6a\x62\x29\x39\x59\xa6\xe6\xe5\xcd\x7b\x83\xc0\x5b\x8e\x93\x64\xac\xeb\xca\x4f\x65\xac\x4a\xbc\x1e\xcd\x82\xfa\x3c\x70\x36\xb6\xb5\xed\x79\xef\xec\x68\x00\xff\x54\xfa\xb5\xe3\xf1\xdb\xe1\xbe\xce\x76\x17\xaf\x57\xb6\x6b\x89\x05\x09\xce\x52\xb9\x01\x2a\x49\xbe\xd9\xf4\xd2\xb8\x7a\xbf\x91\x02\xf3\x22\x8c\x13\xf2\x77\xd8\x8e\x43\x8b\xe1\x54\x6e\x5e\x9d\xc7\x49\x44\x02\x22\xc7\xa4\x79\x81\x85\xb8\x65\x3c\x1c\x93\xe6\x59\xa2\xf8\x1c\x51\x95\x05\xd9\x20\x00\x21\x7e\x60\x21\x58\xa9\x56\xff\xbe\xb6\x5a\x5e\x5b\x3f\x1f\xd6\xd3\x3c\xc4\x4d\xba\x99\xb4\x63\x6e\x7d\x3e\x3d\x57\xd2\x18\x5f\x47\xe8\xc3\x06\x8a\x68\x6c\x7f\x3b\x72\x0f\xe7\xe2\x77\x77\xf1\xd0\x99\xab\xdf\x2e\xfe\xd6\xbb\xcd\x1a\xb9\x90\xd1\xaf\xf2\x38\x3d\xdb\x74\xf8\xeb\xe3\xda\xe8\x2a\x62\xb7\xda\x1b\x07\xa9\xdc\x30\x5e\xbc\x68\xfb\x6b\x9f\x97\xf1\xc6\xb1\xd8\x5c\x29\x1e\x49\x30\xc5\xf7\xde\xad\x91\x42\xf9\xdd\xed\x89\x80\x25\xbe\x37\xd7\xe7\x32\x5c\xe6\x35\xac\xd4\x0c\x2d\xf7\x90\xc4\xe3\xf5\xe3\x2f\x7f\x54\x18\x88\xe3\x61\x47\x85\x64\x7f\xc0\xd7\x3f\x1a\x92\x42\xe9\xc7\x1e\x0d\x95\x76\xa7\x51\xa0\x8f\x02\x1b\x46\x9e\x06\x42\xd1\xf2\x01\x07\x02\xde\xe9\x7d\x1a\x0b\xa7\x32\x16\xcc\xc0\xee\xc4\x90\xd2\x5f\x6f\x98\x54\x5d\xf2\x95\xe1\xa7\x69\x10\x3a\x06\xe1\x65\xb3\x17\x47\x58\x78\xd0\x45\xd6\x5b\xd5\x5f\x25\x1d\x71\x49\xa6\x7a\x64\xda\xd0\x6f\xc7\x3a\x4c\xe3\x09\xc0\x6e\x96\x2c\xa7\xa7\x77\x34\x10\x05\x08\x21\x44\x92\x65\x77\xdf\x20\x5c\xbc\xe7\x97\x3f\xf4\x1a\x45\xd6\xe7\x27\x4a\xde\x74\x27\x66\x11\x7d\x70\xba\xd3\x78\xf9\x1e\x0d\xca\xc8\x39\xde\x7c\xb3\xa6\xe1\xbc\xd7\xc1\x6a\x6f\xb3\x0e\x52\xbe\xe4\x98\x8a\x15\x70\x94\x70\x26\x59\xc0\xa2\xf2\x1c\xfb\xd9\xc5\xf9\xbc\xd5\x92\x9c\xa3\xdf\xe6\x1e\xb3\x0d\x49\xba\x87\x50\x5f\x84\xfe\xe9\xd6\xf8\xbb\xe6\xf0\x7a\xeb\xa6\x65\x3b\x86\x8b\x79\x93\xf5\x59\x20\x6e\xb4\xa7\x44\xf4\x3f\xa5\xfe\x67\x42\x12\xdb\xd3\xe7\xbb\xa5\xa3\x8c\x5c\x2b\x97\xbb\xbb\x7f\x8e\xc5\x6e\xed\x43\x5c\xbf\x74\xc8\x8f\xff\xe6\xd6\xbe\x91\xb6\xf5\x95\xe4\xed\x93\xc4\xa8\x5b\xf9\x76\x4d\x35\xb7\xd8\x8c\xb6\x7d\xaf\x72\xe0\xb6\xbd\x01\x63\x9e\x76\xab\x1a\x32\x76\xe4\x8c\x76\xc2\xad\x6c\xa2\x65\xf7\xcf\xf8\xa7\xda\x2a\xb9\x8c\x3d\x3c\xa3\x9d\x64\x33\xe5\x1a\xb5\x2d\xfb\x86\xa2\x5a\x7f\x19\x5b\x7f\xc6\x3f\xd1\x53\xd3\xe2\x41\x5b\xd3\x4f\xf0\xec\xb0\x42\x73\x43\xd2\x68\x27\xd3\x6a\x6a\x34\xf6\x4e\x1e\x52\x8b\x87\x6c\xcc\xae\x44\xfb\x9e\xa7\x51\x4f\x9d\x55\x03\x81\x8e\x67\xfc\xb4\x69\xf0\x3a\x18\xf2\x40\xd0\xf6\xa8\x34\xe3\xc9\x98\xaf\xf6\xda\x24\xd3\xeb\x60\xb9\x0e\xd3\x1f\xa9\xff\xee\x1f\xfd\x37\x00\x00\xff\xff\x69\x5d\x0a\x6a\x39\x9d\x00\x00") +var _v2SchemaJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5d\x4f\x93\xdb\x36\xb2\xbf\xfb\x53\xa0\x14\x57\xd9\xae\xd8\x92\xe3\xf7\x2e\xcf\x97\xd4\xbc\xd8\x49\x66\x37\x5e\x4f\x79\x26\xbb\x87\x78\x5c\x05\x91\x2d\x09\x09\x09\x30\x00\x38\x33\x5a\xef\x7c\xf7\x2d\xf0\x9f\x08\x02\x20\x41\x8a\xd2\xc8\x0e\x0f\xa9\x78\x28\xa0\xd1\xdd\x68\x34\x7e\xdd\xf8\xf7\xf9\x11\x42\x33\x49\x64\x04\xb3\xd7\x68\x76\x86\xfe\x76\xf9\xfe\x1f\xe8\x32\xd8\x40\x8c\xd1\x8a\x71\x74\x79\x8b\xd7\x6b\xe0\xe8\xd5\xfc\x25\x3a\xbb\x38\x9f\xcf\x9e\xab\x0a\x24\x54\xa5\x37\x52\x26\xaf\x17\x0b\x91\x17\x99\x13\xb6\xb8\x79\xb5\x10\x59\xdd\xf9\xef\x82\xd1\x6f\xf2\xc2\x8f\xf3\x4f\xb5\x1a\xea\xc7\x17\x45\x41\xc6\xd7\x8b\x90\xe3\x95\x7c\xf1\xf2\x7f\x8b\xca\x45\x3d\xb9\x4d\x32\xa6\xd8\xf2\x77\x08\x64\xfe\x8d\xc3\x9f\x29\xe1\xa0\x9a\xff\xed\x11\x42\x08\xcd\x8a\xd6\xb3\x9f\x15\x67\x74\xc5\xca\x7f\x27\x58\x6e\xc4\xec\x11\x42\xd7\x59\x5d\x1c\x86\x44\x12\x46\x71\x74\xc1\x59\x02\x5c\x12\x10\xb3\xd7\x68\x85\x23\x01\x59\x81\x04\x4b\x09\x9c\x6a\xbf\x7e\xce\x49\x7d\xba\x7b\x51\xfd\xa1\x44\xe2\xb0\x52\xac\x7d\xb3\x08\x61\x45\x68\x46\x56\x2c\x6e\x80\x86\x8c\xbf\xbd\x93\x40\x05\x61\x74\x96\x95\xbe\x7f\x84\xd0\x7d\x4e\xde\x42\xb7\xe4\xbe\x46\xbb\x14\x5b\x48\x4e\xe8\xba\x90\x05\xa1\x19\xd0\x34\xae\xc4\xce\xbe\xbc\x9a\xbf\x9c\x15\x7f\x5d\x57\xc5\x42\x10\x01\x27\x89\xe2\x48\x51\xb9\xda\x40\xd5\x87\x37\xc0\x15\x5f\x88\xad\x90\xdc\x10\x81\x42\x16\xa4\x31\x50\x39\x2f\x38\xad\xab\xb0\x53\xd8\xac\x94\x56\x6f\xc3\x84\xf4\x11\xa4\x50\xb3\xfa\xe9\xd3\x6f\x9f\x3e\xdf\x2f\xd0\xeb\x8f\x1f\x3f\x7e\xbc\xfe\xf6\xe9\xf7\xaf\x5f\x7f\xfc\x18\x7e\xfb\xec\xfb\xc7\xb3\x36\x79\x54\x43\xe8\x29\xc5\x31\x20\xc6\x11\x49\x9e\xe5\x12\x41\x66\xa0\xe8\xed\x1d\x8e\x93\x08\x5e\xa3\x27\x3b\xc3\x7c\xa2\x73\xba\xc4\x02\x2e\xb0\xdc\xf4\xe5\x76\xd1\xca\x96\xa2\x8a\x94\xcd\x21\xc9\x6c\xec\x2c\x70\x42\x9e\x34\x74\x9d\x19\x7c\xcd\x20\x9c\xea\x2e\x0a\xfe\x42\x84\xd4\x29\x04\x8c\x8a\xb4\x41\xa2\xc1\xdc\x19\x8a\x88\x90\x4a\x49\xef\xce\xdf\xbd\x45\x4a\x52\x81\x70\x10\x40\x22\x21\x44\xcb\x6d\xc5\xec\x4e\x3c\x1c\x45\xef\x57\x9a\xb5\x7d\xae\xfe\xe5\xe4\x31\x86\x90\xe0\xab\x6d\x02\x3b\x2e\xcb\x11\x90\xd9\xa8\xc6\x77\xc2\x59\x98\x06\xfd\xf9\x2e\x78\x45\x01\xa6\xa8\xa0\x71\x5c\xbe\x33\xa7\xd2\xd9\x5f\x95\xef\xd9\xd5\xac\xfd\xdc\x5d\xbf\x5e\xb8\xd1\x3e\xc7\x31\x48\xe0\x5e\x4c\x14\x65\xdf\xb8\xa8\x71\x10\x09\xa3\xc2\xc7\x02\xcb\xa2\x4e\x5a\x02\x82\x94\x13\xb9\xf5\x30\xe6\xb2\xa4\xb5\xfe\x9b\x3e\x7a\xb2\x55\xd2\xa8\x4a\xbc\x16\xb6\x71\x8e\x39\xc7\xdb\x9d\xe1\x10\x09\x71\xbd\x9c\xb3\x41\x89\xd7\xa5\x89\xdc\x57\xb5\x53\x4a\xfe\x4c\xe1\xbc\xa0\x21\x79\x0a\x1a\x0f\x70\xa7\x5c\x08\x8e\xde\xb0\xc0\x43\x24\xad\x74\x63\x0e\xb1\xd9\x90\xe1\xb0\x2d\x13\xa7\x6d\x78\xfd\x04\x14\x38\x8e\x90\xaa\xce\x63\xac\x3e\x23\xbc\x64\xa9\xb4\xf8\x03\x63\xde\xcd\xbe\x16\x13\x4a\x55\xac\x82\x12\xc6\xac\xd4\x35\xf7\x22\xd4\x3a\xff\x22\x73\x0e\x6e\x51\xa0\x75\x1e\xae\x8f\xe8\x5d\xc7\x59\xe6\xe4\x9a\x18\x8d\xd6\x1c\x53\x84\x4d\xb7\x67\x28\x37\x09\x84\x69\x88\x12\x0e\x01\x11\x80\x32\xa2\xf5\xb9\xaa\xc6\xd9\x73\x53\xab\xfb\xb4\x2e\x20\xc6\x54\x92\xa0\x9a\xf3\x69\x1a\x2f\x81\x77\x37\xae\x53\x1a\xce\x40\xc4\xa8\x82\x1c\xb5\xef\xda\x24\x7d\xb9\x61\x69\x14\xa2\x25\xa0\x90\xac\x56\xc0\x81\x4a\xb4\xe2\x2c\xce\x4a\x64\x7a\x9a\x23\xf4\x13\x91\x3f\xa7\x4b\xf4\x63\x84\x6f\x18\x87\x10\xbd\xc3\xfc\x8f\x90\xdd\x52\x44\x04\xc2\x51\xc4\x6e\x21\x74\x48\x21\x81\xc7\xe2\xfd\xea\x12\xf8\x0d\x09\xf6\xe9\x47\x35\xaf\x67\xc4\x14\xf7\x22\x27\x97\xe1\xe2\x76\x2d\x06\x8c\x4a\x1c\x48\x3f\x73\x2d\x0b\x5b\x29\x45\x24\x00\x2a\x0c\x11\xec\x94\xca\xc2\xa6\xc1\x37\x21\x43\x83\x3b\x5f\x97\xf1\x43\x5e\x53\x73\x19\xa5\x36\xd8\x2d\x05\x2e\x34\x0b\xeb\x39\xfc\x1d\x63\x51\x01\xbd\x3d\xbb\x90\x84\x40\x25\x59\x6d\x09\x5d\xa3\x1c\x37\xe6\x5c\x16\x9a\x40\x09\x70\xc1\xe8\x82\xf1\x35\xa6\xe4\xdf\x99\x5c\x8e\x9e\x4d\x79\xb4\x27\x2f\xbf\x7e\xf8\x05\x25\x8c\x50\xa9\x98\x29\x90\x62\x60\xea\x75\xae\x13\xca\xbf\x2b\x1a\x29\x27\x76\xd6\x20\xc6\x64\x5f\xe6\x32\x1a\x08\x87\x21\x07\x21\xbc\xb4\xe4\xe0\x32\x67\xa6\xcd\xf3\x1e\xcd\xd9\x6b\xb6\x6f\x8e\x27\xa7\xed\xdb\xe7\xbc\xcc\x1a\x07\xce\x6f\x87\x33\xf0\xba\x51\x17\x22\x66\x78\x79\x8e\xce\xe5\x13\x81\x80\x06\x2c\xe5\x78\x0d\xa1\xb2\xb8\x54\xa8\x79\x09\xbd\xbf\x3c\x47\x01\x8b\x13\x2c\xc9\x32\xaa\xaa\x1d\xd5\xee\xab\x36\xbd\x6c\xfd\x54\x6c\xc8\x08\x01\x3c\xbd\xe7\x07\x88\xb0\x24\x37\x79\x90\x28\x4a\x1d\x10\x1a\x92\x1b\x12\xa6\x38\x42\x40\xc3\x4c\x43\x62\x8e\xae\x36\xb0\x45\x71\x2a\xa4\x9a\x23\x79\x59\xb1\xa8\xf2\xa4\x0c\x60\x9f\xcc\x8d\x40\xf5\x80\xca\xa8\x99\xc3\xa7\x85\x1f\x31\x25\xa9\x82\xc5\x6d\xbd\xd8\x36\x76\x7c\x02\x28\x97\xf6\x1d\x74\x3b\x11\x7e\x91\xae\x32\xf8\x6c\xf4\xe6\x7b\x9a\xa5\x1f\x62\xc6\x21\xcf\x9a\xe5\xed\x8b\x02\xf3\x2c\x33\x33\xdf\x00\xca\xc9\x09\xb4\x04\xf5\xa5\x08\xd7\xc3\x02\x18\x66\xf1\xab\x1e\x83\x37\x4c\xcd\x12\xc1\x1d\x50\xf6\xaa\xbd\xfe\xe2\x73\x48\x38\x08\xa0\x32\x9b\x18\x44\x86\x0b\x6a\xc1\xaa\x26\x96\x2d\x96\x3c\xa0\x54\x65\x73\xe3\x08\xb5\x8b\x99\xbd\x82\xbc\x9e\xc2\xe8\x53\x46\x83\x3f\x33\x54\x2b\x5b\xad\x92\x79\xd9\x8f\x5d\x93\x98\xf2\xe6\xc6\x1c\xe6\x9a\x9e\xfc\x43\x82\x31\x66\x8e\x53\x77\xfe\x90\xe7\xf3\xf6\xe9\x62\x23\x3f\x10\x93\x18\xae\x72\x1a\x9d\xf9\x48\xcb\xcc\x5a\x65\xc7\x4a\x04\xf0\xf3\xd5\xd5\x05\x8a\x41\x08\xbc\x86\x86\x43\x51\x6c\xe0\x46\x57\xf6\x44\x40\x0d\xfb\xff\xa2\xc3\x7c\x3d\x39\x84\xdc\x09\x22\x64\x4f\x12\xd9\xba\xaa\xf6\xe3\xbd\x56\xdd\x91\x25\x6a\x14\x9c\x89\x34\x8e\x31\xdf\xee\x15\x7e\x2f\x39\x81\x15\x2a\x28\x95\x66\x51\xf5\xfd\x83\xc5\xfe\x15\x07\xcf\xf7\x08\xee\x1d\x8e\xb6\xc5\x52\xcc\x8c\x5a\x93\x66\xc5\xd8\x79\x38\x46\xd6\xa7\x88\x37\xc9\x2e\xe3\xd2\xa5\x7b\x4b\x3a\xdc\xa1\xdc\x9e\x29\xf1\x8c\x8a\x99\x16\x47\x8d\xd4\x78\x8b\xf6\x1c\xe9\x71\x54\x1b\x69\xa8\x4a\x93\x37\xe5\xb2\x2c\x4f\x0c\x92\xab\xa0\x73\x32\x72\x59\xd3\xf0\x2d\x8d\xed\xca\x37\x16\x19\x9e\xdb\x1c\xab\x17\x49\xc3\x0f\x37\xdc\x88\xb1\xb4\xd4\x42\xcb\x58\x5e\x6a\x52\x0b\x15\x10\x0a\xb0\x04\xe7\xf8\x58\x32\x16\x01\xa6\xcd\x01\xb2\xc2\x69\x24\x35\x38\x6f\x30\x6a\xae\x1b\xb4\x71\xaa\xad\x1d\xa0\xd6\x20\x2d\x8b\x3c\xc6\x82\x62\x27\x34\x6d\x15\x84\x7b\x43\xb1\x35\x78\xa6\x24\x77\x28\xc1\x6e\xfc\xe9\x48\x74\xf4\x15\xe3\xe1\x84\x42\x88\x40\x7a\x26\x49\x3b\x48\xb1\xa4\x19\x8e\x0c\xa7\xb5\x01\x6c\x0c\x97\x61\x8a\xc2\x32\xd8\x8c\x44\x69\x24\xbf\x65\x1d\x74\xd6\xe5\x44\xef\xec\x48\x5e\xb7\x8a\xa3\x29\x8e\x41\x64\xce\x1f\x88\xdc\x00\x47\x4b\x40\x98\x6e\xd1\x0d\x8e\x48\x98\x63\x5c\x21\xb1\x4c\x05\x0a\x58\x98\xc5\x6d\x4f\x0a\x77\x53\x4f\x8b\xc4\x44\x1f\xb2\xdf\x8d\x3b\xea\x9f\xfe\xf6\xf2\xc5\xff\x5d\x7f\xfe\x9f\xfb\x67\x8f\xff\xf3\xe9\x69\xd1\xfe\xb3\xc7\xfd\x3c\xf8\x3f\x71\x94\x82\x23\xd1\x72\x00\xb7\x42\x99\x6c\xc0\x60\x7b\x0f\x79\xea\xa8\x53\x4b\x56\x31\xfa\x0b\x52\x9f\x96\xdb\xcd\x2f\xd7\x67\xcd\x04\x19\x85\xfe\xdb\x02\x9a\x59\x03\xad\x63\x3c\xea\xff\x2e\x18\xfd\x00\xd9\xe2\x56\x60\x59\x93\xb9\xb6\xb2\x3e\x3c\x2c\xab\x0f\xa7\xb2\x89\x43\xc7\xf6\xd5\xce\x2e\xad\xa6\xa9\xed\xa6\xc6\x5a\xb4\xa6\x67\xdf\x8c\x26\x7b\x50\x5a\x91\x08\x2e\x6d\xd4\x3a\xc1\x9d\xf2\xdb\xde\x1e\xb2\x2c\x6c\xa5\x64\xc9\x16\xb4\x90\xaa\x4a\xb7\x0c\xde\x13\xc3\x2a\x9a\x11\x9b\x7a\x1b\x3d\x95\x97\x37\x31\x6b\x69\x7e\x34\xc0\x67\x1f\x66\x19\x49\xef\xf1\x25\xf5\xac\x0e\xea\x0a\x28\x8d\x4d\x7e\xd9\x57\x4b\x49\xe5\xc6\xb3\x25\xfd\xe6\x57\x42\x25\xac\xcd\xcf\x36\x74\x8e\xca\x24\x47\xe7\x80\xa8\x92\x72\xbd\x3d\x84\x2d\x65\xe2\x82\x1a\x9c\xc4\x44\x92\x1b\x10\x79\x8a\xc4\x4a\x2f\x60\x51\x04\x81\xaa\xf0\xa3\x95\x27\xd7\x12\x7b\xa3\x96\x03\x45\x96\xc1\x8a\x07\xc9\xb2\xb0\x95\x52\x8c\xef\x48\x9c\xc6\x7e\x94\xca\xc2\x0e\x07\x12\x44\xa9\x20\x37\xf0\xae\x0f\x49\xa3\x96\x9d\x4b\x42\x7b\x70\x59\x14\xee\xe0\xb2\x0f\x49\xa3\x96\x4b\x97\xbf\x00\x5d\x4b\x4f\xfc\xbb\x2b\xee\x92\xb9\x17\xb5\xaa\xb8\x0b\x97\x17\x9b\x43\xfd\xd6\xc2\xb2\xc2\x2e\x29\xcf\xfd\x87\x4a\x55\xda\x25\x63\x1f\x5a\x65\x69\x2b\x2d\x3d\x67\xe9\x41\xae\x5e\xc1\x6e\x2b\xd4\xdb\x3e\xa8\xd3\x26\xd2\x48\x92\x24\xca\x61\x86\x8f\x8c\xbb\xf2\x8e\x91\xdf\x1f\x06\x19\x33\xf3\x03\x4d\xba\xcd\xe2\x2d\xfb\x69\xe9\x16\x15\x13\xd5\x56\x85\x4e\x3c\x5b\x8a\xbf\x25\x72\x83\xee\x5e\x20\x22\xf2\xc8\xaa\x7b\xdb\x8e\xe4\x29\x58\xca\x38\xb7\x3f\x2e\x59\xb8\xbd\xa8\x16\x16\xf7\xdb\x79\x51\x9f\x5a\xb4\x8d\x87\x3a\x6e\xbc\x3e\xc5\xb4\xcd\x58\xf9\xf5\x3c\xb9\x6f\x49\xaf\x57\xc1\xfa\x1c\x5d\x6d\x88\x8a\x8b\xd3\x28\xcc\xb7\xef\x10\x8a\x4a\x74\xa9\x4a\xa7\x62\xbf\x0d\x76\x23\x6f\x59\xd9\x31\xee\x40\x11\xfb\x28\xec\x8d\x22\x1c\x13\x5a\x64\x94\x23\x16\x60\xbb\xd2\x7c\xa0\x98\xb2\xe5\x6e\xbc\x54\x33\xe0\x3e\xb9\x52\x17\xdb\xb7\x1b\xc8\x12\x20\x8c\x23\xca\x64\x7e\x78\xa3\x62\x5b\x75\x56\xd9\x9e\x2a\x91\x27\xb0\x70\x34\x1f\x90\x89\xb5\x86\x73\x7e\x71\xda\x1e\xfb\x3a\x72\xdc\x5e\x79\x88\xcb\x74\x79\xd9\x64\xe4\xd4\xc2\x9e\xce\xb1\xfe\x85\x5a\xc0\xe9\x0c\x34\x3d\xd0\x43\xce\xa1\x36\x39\xd5\xa1\x4e\xf5\xf8\xb1\xa9\x23\x08\x75\x84\xac\x53\x6c\x3a\xc5\xa6\x53\x6c\x3a\xc5\xa6\x7f\xc5\xd8\xf4\x51\xfd\xff\x25\x4e\xfa\x33\x05\xbe\x9d\x60\xd2\x04\x93\x6a\x5f\x33\x9b\x98\x50\xd2\xe1\x50\x52\xc6\xcc\xdb\x38\x91\xdb\xe6\xaa\xa2\x8f\xa1\x6a\xa6\xd4\xc6\x56\xd6\x8c\x40\x02\x68\x48\xe8\x1a\xe1\x9a\xd9\x2e\xb7\x05\xc3\x34\xda\x2a\xbb\xcd\x12\x36\x98\x22\x50\x4c\xa1\x1b\xc5\xd5\x84\xf0\xbe\x24\x84\xf7\x2f\x22\x37\xef\x94\xd7\x9f\xa0\xde\x04\xf5\x26\xa8\x37\x41\x3d\x64\x40\x3d\xe5\xf2\xde\x60\x89\x27\xb4\x37\xa1\xbd\xda\xd7\xd2\x2c\x26\xc0\x37\x01\x3e\x1b\xef\x5f\x06\xe0\x6b\x7c\x5c\x91\x08\x26\x10\x38\x81\xc0\x09\x04\x76\x4a\x3d\x81\xc0\xbf\x12\x08\x4c\xb0\xdc\x7c\x99\x00\xd0\x75\x70\xb4\xf8\x5a\x7c\xea\xde\x3e\x39\x08\x30\x5a\x27\x35\xed\xb4\x65\xad\x69\x74\x10\x88\x79\xe2\x30\x52\x19\xd6\x04\x21\xa7\x95\xd5\x0e\x03\xf8\xda\x20\xd7\x84\xb4\x26\xa4\x35\x21\xad\x09\x69\x21\x03\x69\x51\x46\xff\xff\x18\x9b\x54\xed\x87\x47\x06\x9d\x4e\x73\x6e\x9a\xb3\xa9\xce\x83\x5e\x4b\xc6\x71\x20\x45\xd7\x72\xf5\x40\x72\x0e\x34\x6c\xf4\x6c\xf3\xba\x5e\x4b\x97\x0e\x52\xb8\xbe\x8b\x79\xa0\x10\x86\xa1\x75\xb0\x6f\xec\xc8\xf4\x3d\x4d\x7b\x86\xc2\x02\x31\x12\x51\xbf\x07\x94\xad\x10\xd6\x2e\x79\xcf\xe9\x1c\xf5\x1e\x31\x23\x5c\x18\xfb\x9c\xfb\x70\xe0\x62\xbd\xf7\xb5\x94\xcf\xf3\xf6\xfa\xc5\x4e\x9c\x85\x76\x1d\xae\x37\xbc\xde\xa3\x41\xcb\x29\xd0\x5e\x70\x67\x50\x93\x6d\x98\xa8\xd3\x67\x0f\x68\xb1\xeb\x38\x47\x07\x10\x1b\xd2\xe2\x18\x68\x6d\x40\xbb\xa3\x40\xba\x21\xf2\x8e\x81\xfb\xf6\x92\x77\x2f\x70\xe8\xdb\xb2\x36\xbf\x30\x91\xc5\x21\xe7\x45\xcc\x34\x0c\x48\x8e\xd0\xf2\x9b\x7c\x3c\xbd\x1c\x04\x3e\x07\xe8\x7c\x2f\x84\x7a\x48\x4d\x1f\xba\xe1\x76\x45\x7b\x60\xe0\x01\xca\xee\x04\xca\x31\xbe\x73\x5f\xa3\x70\x0c\xad\x1f\xa5\xf5\x76\xd5\xbb\xd2\x7e\xfb\x30\x90\xcf\xfa\x67\x7a\xe6\xc3\x37\x42\x19\xe2\xc9\x9c\x61\x4c\xe7\xd1\x77\x55\x86\x6e\x8f\x7b\x85\x42\x33\xa3\xaa\x57\xae\xfd\xd5\xcc\x9c\x56\x68\xe2\xde\x0e\xa8\x2c\xa9\xb0\x7d\xf0\x54\x2d\x80\xf2\x48\x39\x3d\x98\x1a\x6d\x0b\x9d\xba\x53\xfb\xce\xf8\xd1\x7e\xbb\x60\x4f\x06\xf5\xce\xda\xab\xeb\xca\xcb\xd5\xac\x20\xda\x72\x3b\xa2\x4b\x38\xd7\xb5\x89\xbe\x42\xd9\xb9\x73\xc4\x0c\x6d\xb7\xd9\xf8\x8d\xbd\x3e\x9c\xf5\x53\x68\x48\x14\x36\x8f\x09\xc5\x92\xf1\x21\xd1\x09\x07\x1c\xbe\xa7\x91\xf3\x6a\xc8\xc1\x57\xb0\xdd\xc5\xc6\x1d\xad\x76\x1d\xa8\x82\x0e\x4c\x38\xfe\xa5\x8c\xc5\x0a\x40\x5d\xa1\xbb\x98\xd1\xfb\x74\x61\xed\x1a\x98\xaf\x3c\x8c\x1e\xe3\xc2\x92\x29\x74\x3e\x99\xd0\xf9\x41\x50\xd0\x38\x4b\x57\x7e\x5b\x7a\x0e\xe6\xce\x4e\xd7\x19\x35\x57\xbb\x3c\x3c\xd2\x5e\x4f\x4b\x4c\xf7\x0f\x4d\x2b\x91\x5d\x94\xa6\x95\xc8\x69\x25\x72\x5a\x89\x7c\xb8\x95\xc8\x07\x80\x8c\xda\x9c\x64\x7b\xb7\x71\xdf\x57\x12\x4b\x9a\x1f\x72\x0c\x13\x03\xad\x3c\xd5\x4e\xde\x8e\x57\x13\x6d\x34\x86\xcf\x97\xe6\xa4\x68\xc4\xb0\xf6\xc9\xc2\xeb\x8d\x0b\xd7\xcd\xfe\xba\xa6\xf5\x30\xeb\x30\x33\xbe\xc7\x56\x27\xab\x08\xd9\x6d\xbb\x09\xee\x7c\x2d\xcf\xee\x87\x38\xac\xc8\xdd\x90\x9a\x58\x4a\x4e\x96\xa9\x79\x79\xf3\xde\x20\xf0\x96\xe3\x24\x19\xeb\xba\xf2\x53\x19\xab\x12\xaf\x47\xb3\xa0\x3e\xef\x9b\x8d\x6d\x6d\x7b\xde\x3b\x3b\x1a\xc0\x3f\x95\x7e\xed\x78\xfb\x76\xb8\xaf\xb3\xdd\xc5\xeb\x95\xed\x5a\x62\x41\x82\xb3\x54\x6e\x80\x4a\x92\x6f\x36\xbd\x34\xae\xde\x6f\xa4\xc0\xbc\x08\xe3\x84\xfc\x1d\xb6\xe3\xd0\x62\x38\x95\x9b\x57\xe7\x71\x12\x91\x80\xc8\x31\x69\x5e\x60\x21\x6e\x19\x0f\xc7\xa4\x79\x96\x28\x3e\x47\x54\x65\x41\x36\x08\x40\x88\x1f\x58\x08\x56\xaa\xd5\xbf\xaf\xad\x96\xd7\xd6\xcf\x87\xf5\x34\x0f\x71\x93\x6e\x26\xed\x98\x5b\x9f\x4f\xcf\x95\x34\xc6\xd7\x11\xfa\xb0\x81\x22\x1a\xdb\xdf\x8e\xdc\xc3\xb9\xf8\xdd\x5d\x3c\x74\xe6\xea\xb7\x8b\xbf\xf5\x6e\xb3\x46\x2e\x64\xf4\xab\x3c\x4e\xcf\x36\x1d\xfe\xfa\xb8\x36\xba\x8a\xd8\xad\xf6\xc6\x41\x2a\x37\x8c\x17\x0f\xda\xfe\xda\xe7\x65\xbc\x71\x2c\x36\x57\x8a\x47\x12\x4c\xf1\xbd\x77\x6b\xa4\x50\x7e\x77\x7b\x22\x60\x89\xef\xcd\xf5\xb9\x0c\x97\x79\x0d\x2b\x35\x43\xcb\x3d\x24\xf1\x78\xfc\xf8\xcb\x1f\x15\x06\xe2\x78\xd8\x51\x21\xd9\x1f\xf0\xf5\x8f\x86\xa4\x50\xfa\xb1\x47\x43\xa5\xdd\x69\x14\xe8\xa3\xc0\x86\x91\xa7\x81\x50\xb4\x7c\xc0\x81\x80\x77\x7a\x9f\xc6\xc2\xa9\x8c\x05\x33\xb0\x3b\x31\xa4\xf4\xd7\x1b\x26\x55\x97\x7c\x65\xf8\x69\x1a\x84\x8e\x41\x78\xd9\xec\xc5\x11\x16\x1e\x74\x91\xf5\x56\xf5\x57\x49\x47\x5c\x92\xa9\x1e\x99\x36\xf4\xdb\xb1\x0e\xd3\x78\x02\xb0\x9b\x25\xcb\xe9\xe9\x1d\x0d\x44\x01\x42\x08\x91\x64\xd9\xdd\x37\x08\x17\xef\xf9\xe5\x0f\xbd\x46\x91\xf5\xf9\x89\x92\x37\xdd\x89\x59\x44\x1f\x9c\xee\x34\x1e\xbe\x47\x83\x32\x72\x8e\x37\xdf\xac\x69\x38\xef\x75\xb0\xda\xdb\xac\x83\x94\x2f\x39\xa6\x62\x05\x1c\x25\x9c\x49\x16\xb0\xa8\x3c\xc7\x7e\x76\x71\x3e\x6f\xb5\x24\xe7\xe8\xb7\xb9\xc7\x6c\x43\x92\xee\x21\xd4\x17\xa1\x7f\xba\x35\xfe\xae\x39\xbc\xde\xba\x69\xd9\x8e\xe1\x62\xde\x64\x7d\x16\x88\x1b\xed\x29\x11\xfd\x4f\xa9\xff\x99\x90\xc4\xf6\xf4\xf9\x6e\xe9\x28\x23\xd7\xca\xe5\xee\xee\x9f\x63\xb1\x5b\xfb\x10\xd7\x2f\x1d\xf2\xe3\xbf\xb9\xb5\x6f\xa4\x6d\x7d\x25\x79\xfb\x24\x31\xea\x56\xbe\x5d\x53\xcd\x2d\x36\xa3\x6d\xdf\xab\x1c\xb8\x6d\x6f\xc0\x98\xa7\xdd\xaa\x86\x8c\x1d\x39\xa3\x9d\x70\x2b\x9b\x68\xd9\xfd\x33\xfe\xa9\xb6\x4a\x2e\x63\x0f\xcf\x68\x27\xd9\x4c\xb9\x46\x6d\xcb\xbe\xa1\xa8\xd6\x5f\xc6\xd6\x9f\xf1\x4f\xf4\xd4\xb4\x78\xd0\xd6\xf4\x13\x3c\x3b\xac\xd0\xdc\x90\x34\xda\xc9\xb4\x9a\x1a\x8d\xbd\x93\x87\xd4\xe2\x21\x1b\xb3\x2b\xd1\xbe\xe7\x69\xd4\x53\x67\xd5\x40\xa0\xe3\x19\x3f\x6d\x1a\xbc\x0e\x86\x3c\x10\xb4\x3d\x2a\xcd\x78\x32\xe6\xab\xbd\x36\xc9\xf4\x3a\x58\xae\xc3\xf4\x47\xea\xbf\xfb\x47\xff\x0d\x00\x00\xff\xff\xd2\x32\x5a\x28\x38\x9d\x00\x00") -func v2SchemaJSONBytes() ([]byte, error) { +func v2SchemaJsonBytes() ([]byte, error) { return bindataRead( - _v2SchemaJSON, + _v2SchemaJson, "v2/schema.json", ) } -func v2SchemaJSON() (*asset, error) { - bytes, err := v2SchemaJSONBytes() +func v2SchemaJson() (*asset, error) { + bytes, err := v2SchemaJsonBytes() if err != nil { return nil, err } - info := bindataFileInfo{name: "v2/schema.json", size: 40249, mode: os.FileMode(0644), modTime: time.Unix(1567900649, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xcb, 0x25, 0x27, 0xe8, 0x46, 0xae, 0x22, 0xc4, 0xf4, 0x8b, 0x1, 0x32, 0x4d, 0x1f, 0xf8, 0xdf, 0x75, 0x15, 0xc8, 0x2d, 0xc7, 0xed, 0xe, 0x7e, 0x0, 0x75, 0xc0, 0xf9, 0xd2, 0x1f, 0x75, 0x57}} + info := bindataFileInfo{name: "v2/schema.json", size: 40248, mode: os.FileMode(0640), modTime: time.Unix(1568964748, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xab, 0x88, 0x5e, 0xf, 0xbf, 0x17, 0x74, 0x0, 0xb2, 0x5a, 0x7f, 0xbc, 0x58, 0xcd, 0xc, 0x25, 0x73, 0xd5, 0x29, 0x1c, 0x7a, 0xd0, 0xce, 0x79, 0xd4, 0x89, 0x31, 0x27, 0x90, 0xf2, 0xff, 0xe6}} return a, nil } @@ -201,9 +201,9 @@ func AssetNames() []string { // _bindata is a table, holding each asset generator, mapped to its name. var _bindata = map[string]func() (*asset, error){ - "jsonschema-draft-04.json": jsonschemaDraft04JSON, + "jsonschema-draft-04.json": jsonschemaDraft04Json, - "v2/schema.json": v2SchemaJSON, + "v2/schema.json": v2SchemaJson, } // AssetDir returns the file names below a certain @@ -247,9 +247,9 @@ type bintree struct { } var _bintree = &bintree{nil, map[string]*bintree{ - "jsonschema-draft-04.json": &bintree{jsonschemaDraft04JSON, map[string]*bintree{}}, + "jsonschema-draft-04.json": &bintree{jsonschemaDraft04Json, map[string]*bintree{}}, "v2": &bintree{nil, map[string]*bintree{ - "schema.json": &bintree{v2SchemaJSON, map[string]*bintree{}}, + "schema.json": &bintree{v2SchemaJson, map[string]*bintree{}}, }}, }} diff --git a/vendor/github.com/go-openapi/spec/expander.go b/vendor/github.com/go-openapi/spec/expander.go index 1e7fc8c490c6..043720d7d8ea 100644 --- a/vendor/github.com/go-openapi/spec/expander.go +++ b/vendor/github.com/go-openapi/spec/expander.go @@ -452,11 +452,12 @@ func expandPathItem(pathItem *PathItem, resolver *schemaLoader, basePath string) return err } if pathItem.Ref.String() != "" { - var err error - resolver, err = resolver.transitiveResolver(basePath, pathItem.Ref) - if resolver.shouldStopOnError(err) { + transitiveResolver, err := resolver.transitiveResolver(basePath, pathItem.Ref) + if transitiveResolver.shouldStopOnError(err) { return err } + basePath = transitiveResolver.updateBasePath(resolver, basePath) + resolver = transitiveResolver } pathItem.Ref = Ref{} diff --git a/vendor/github.com/go-openapi/spec/go.mod b/vendor/github.com/go-openapi/spec/go.mod index 02a142c03c22..14e5f2dac3aa 100644 --- a/vendor/github.com/go-openapi/spec/go.mod +++ b/vendor/github.com/go-openapi/spec/go.mod @@ -4,14 +4,9 @@ require ( github.com/go-openapi/jsonpointer v0.19.3 github.com/go-openapi/jsonreference v0.19.2 github.com/go-openapi/swag v0.19.5 - github.com/kr/pty v1.1.5 // indirect - github.com/stretchr/objx v0.2.0 // indirect github.com/stretchr/testify v1.3.0 - golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8 // indirect golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 // indirect - golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f // indirect - golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59 // indirect - gopkg.in/yaml.v2 v2.2.2 + gopkg.in/yaml.v2 v2.2.4 ) go 1.13 diff --git a/vendor/github.com/go-openapi/spec/go.sum b/vendor/github.com/go-openapi/spec/go.sum index 86db601c9782..c209ff971206 100644 --- a/vendor/github.com/go-openapi/spec/go.sum +++ b/vendor/github.com/go-openapi/spec/go.sum @@ -1,5 +1,3 @@ -github.com/PuerkitoBio/purell v1.1.0 h1:rmGxhojJlM0tuKtfdvliR84CFHljx9ag64t2xmVkjK4= -github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= @@ -7,20 +5,12 @@ github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdko github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/go-openapi/jsonpointer v0.17.0 h1:nH6xp8XdXHx8dqveo0ZuJBluCO2qGrPbDNZ0dwoRHP0= -github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= -github.com/go-openapi/jsonpointer v0.19.0 h1:FTUMcX77w5rQkClIzDtTxvn6Bsa894CcrzNj2MMfeg8= -github.com/go-openapi/jsonpointer v0.19.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.19.2 h1:A9+F4Dc/MCNB5jibxf6rRvOvR/iFgQdyNx9eIhnGqq0= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.0 h1:BqWKpV1dFd+AuiKlgtddwVIFQsuMpxfBDBHGfM2yNpk= -github.com/go-openapi/jsonreference v0.19.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.19.2 h1:o20suLFB4Ri0tuzpWtyHlh7E7HnkqTNLq6aR6WVNS1w= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/swag v0.17.0 h1:iqrgMg7Q7SvtbWLlltPrkMs0UBJI6oTSs79JFRUi880= -github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.19.2 h1:jvO6bCMBEilGwMfHhrd61zIID4oIFdwb76V17SM88dE= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= @@ -28,11 +18,8 @@ github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329 h1:2gxZ0XQIU/5z3Z3bUBu+FXuk2pFbkN6tcwi/pjyaDic= -github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63 h1:nTT4s92Dgz2HlrB2NaMgvlfqHH39OgMhA7z3PK7PGD4= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8= @@ -40,35 +27,23 @@ github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/net v0.0.0-20181005035420-146acd28ed58 h1:otZG8yDCO4LVps5+9bxOeNiCvgmOyt96J3roHTYs7oE= -golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 h1:dfGZHvZk057jK2MCeWus/TowKpJ8y4AmooUzdBSR9GU= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/go-openapi/spec/ref.go b/vendor/github.com/go-openapi/spec/ref.go index 08ff869b2fcd..1f31a9ead01f 100644 --- a/vendor/github.com/go-openapi/spec/ref.go +++ b/vendor/github.com/go-openapi/spec/ref.go @@ -68,10 +68,12 @@ func (r *Ref) IsValidURI(basepaths ...string) bool { } if r.HasFullURL { + //#nosec rr, err := http.Get(v) if err != nil { return false } + defer rr.Body.Close() return rr.StatusCode/100 == 2 } diff --git a/vendor/github.com/go-openapi/spec/schema_loader.go b/vendor/github.com/go-openapi/spec/schema_loader.go index 9e20e96c2a19..961d477571a0 100644 --- a/vendor/github.com/go-openapi/spec/schema_loader.go +++ b/vendor/github.com/go-openapi/spec/schema_loader.go @@ -86,12 +86,7 @@ func (r *schemaLoader) transitiveResolver(basePath string, ref Ref) (*schemaLoad newOptions := r.options newOptions.RelativeBase = rootURL.String() debugLog("setting new root: %s", newOptions.RelativeBase) - resolver, err := defaultSchemaLoader(root, newOptions, r.cache, r.context) - if err != nil { - return nil, err - } - - return resolver, nil + return defaultSchemaLoader(root, newOptions, r.cache, r.context) } func (r *schemaLoader) updateBasePath(transitive *schemaLoader, basePath string) string { diff --git a/vendor/github.com/google/cadvisor/container/common/helpers.go b/vendor/github.com/google/cadvisor/container/common/helpers.go index 4382ffb7c0db..4eba4af2c3a4 100644 --- a/vendor/github.com/google/cadvisor/container/common/helpers.go +++ b/vendor/github.com/google/cadvisor/container/common/helpers.go @@ -30,6 +30,7 @@ import ( "github.com/karrick/godirwalk" "github.com/opencontainers/runc/libcontainer/cgroups" "github.com/pkg/errors" + "golang.org/x/sys/unix" "k8s.io/klog/v2" ) @@ -68,6 +69,16 @@ func findFileInAncestorDir(current, file, limit string) (string, error) { } } +var bootTime = func() time.Time { + now := time.Now() + var sysinfo unix.Sysinfo_t + if err := unix.Sysinfo(&sysinfo); err != nil { + return now + } + sinceBoot := time.Duration(sysinfo.Uptime) * time.Second + return now.Add(-1 * sinceBoot).Truncate(time.Minute) +}() + func GetSpec(cgroupPaths map[string]string, machineInfoFactory info.MachineInfoFactory, hasNetwork, hasFilesystem bool) (info.ContainerSpec, error) { var spec info.ContainerSpec @@ -75,17 +86,28 @@ func GetSpec(cgroupPaths map[string]string, machineInfoFactory info.MachineInfoF // Get the lowest creation time from all hierarchies as the container creation time. now := time.Now() lowestTime := now - for _, cgroupPath := range cgroupPaths { - // The modified time of the cgroup directory changes whenever a subcontainer is created. + for _, cgroupPathDir := range cgroupPaths { + dir, err := os.Stat(cgroupPathDir) + if err == nil && dir.ModTime().Before(lowestTime) { + lowestTime = dir.ModTime() + } + // The modified time of the cgroup directory sometimes changes whenever a subcontainer is created. // eg. /docker will have creation time matching the creation of latest docker container. - // Use clone_children as a workaround as it isn't usually modified. It is only likely changed - // immediately after creating a container. - cgroupPath = path.Join(cgroupPath, "cgroup.clone_children") - fi, err := os.Stat(cgroupPath) + // Use clone_children/events as a workaround as it isn't usually modified. It is only likely changed + // immediately after creating a container. If the directory modified time is lower, we use that. + cgroupPathFile := path.Join(cgroupPathDir, "cgroup.clone_children") + if cgroups.IsCgroup2UnifiedMode() { + cgroupPathFile = path.Join(cgroupPathDir, "cgroup.events") + } + fi, err := os.Stat(cgroupPathFile) if err == nil && fi.ModTime().Before(lowestTime) { lowestTime = fi.ModTime() } } + if lowestTime.Before(bootTime) { + lowestTime = bootTime + } + if lowestTime != now { spec.CreationTime = lowestTime } diff --git a/vendor/github.com/google/cadvisor/container/containerd/client.go b/vendor/github.com/google/cadvisor/container/containerd/client.go index 986476385f81..47eaffad7bd2 100644 --- a/vendor/github.com/google/cadvisor/container/containerd/client.go +++ b/vendor/github.com/google/cadvisor/container/containerd/client.go @@ -65,11 +65,10 @@ func Client(address, namespace string) (ContainerdClient, error) { tryConn.Close() connParams := grpc.ConnectParams{ - Backoff: backoff.Config{ - BaseDelay: baseBackoffDelay, - MaxDelay: maxBackoffDelay, - }, + Backoff: backoff.DefaultConfig, } + connParams.Backoff.BaseDelay = baseBackoffDelay + connParams.Backoff.MaxDelay = maxBackoffDelay gopts := []grpc.DialOption{ grpc.WithInsecure(), grpc.WithContextDialer(dialer.ContextDialer), diff --git a/vendor/github.com/google/cadvisor/container/docker/factory.go b/vendor/github.com/google/cadvisor/container/docker/factory.go index f0118166e2dd..1490a88f41b9 100644 --- a/vendor/github.com/google/cadvisor/container/docker/factory.go +++ b/vendor/github.com/google/cadvisor/container/docker/factory.go @@ -347,23 +347,25 @@ func Register(factory info.MachineInfoFactory, fsInfo fs.FsInfo, includedMetrics var ( thinPoolWatcher *devicemapper.ThinPoolWatcher thinPoolName string + zfsWatcher *zfs.ZfsWatcher ) - if storageDriver(dockerInfo.Driver) == devicemapperStorageDriver { - thinPoolWatcher, err = startThinPoolWatcher(dockerInfo) - if err != nil { - klog.Errorf("devicemapper filesystem stats will not be reported: %v", err) - } + if includedMetrics.Has(container.DiskUsageMetrics) { + if storageDriver(dockerInfo.Driver) == devicemapperStorageDriver { + thinPoolWatcher, err = startThinPoolWatcher(dockerInfo) + if err != nil { + klog.Errorf("devicemapper filesystem stats will not be reported: %v", err) + } - // Safe to ignore error - driver status should always be populated. - status, _ := StatusFromDockerInfo(*dockerInfo) - thinPoolName = status.DriverStatus[dockerutil.DriverStatusPoolName] - } + // Safe to ignore error - driver status should always be populated. + status, _ := StatusFromDockerInfo(*dockerInfo) + thinPoolName = status.DriverStatus[dockerutil.DriverStatusPoolName] + } - var zfsWatcher *zfs.ZfsWatcher - if storageDriver(dockerInfo.Driver) == zfsStorageDriver { - zfsWatcher, err = startZfsWatcher(dockerInfo) - if err != nil { - klog.Errorf("zfs filesystem stats will not be reported: %v", err) + if storageDriver(dockerInfo.Driver) == zfsStorageDriver { + zfsWatcher, err = startZfsWatcher(dockerInfo) + if err != nil { + klog.Errorf("zfs filesystem stats will not be reported: %v", err) + } } } diff --git a/vendor/github.com/google/cadvisor/container/docker/handler.go b/vendor/github.com/google/cadvisor/container/docker/handler.go index e2c904ca8863..e9afc7524462 100644 --- a/vendor/github.com/google/cadvisor/container/docker/handler.go +++ b/vendor/github.com/google/cadvisor/container/docker/handler.go @@ -398,11 +398,14 @@ func (h *dockerContainerHandler) getFsStats(stats *info.ContainerStats) error { fsType string ) + var fsInfo *info.FsInfo + // Docker does not impose any filesystem limits for containers. So use capacity as limit. for _, fs := range mi.Filesystems { if fs.Device == device { limit = fs.Capacity fsType = fs.Type + fsInfo = &fs break } } @@ -413,11 +416,45 @@ func (h *dockerContainerHandler) getFsStats(stats *info.ContainerStats) error { fsStat.Usage = usage.TotalUsageBytes fsStat.Inodes = usage.InodeUsage + if fsInfo != nil { + fileSystems, err := h.fsInfo.GetGlobalFsInfo() + + if err == nil { + addDiskStats(fileSystems, fsInfo, &fsStat) + } else { + klog.Errorf("Unable to obtain diskstats for filesystem %s: %v", fsStat.Device, err) + } + } + stats.Filesystem = append(stats.Filesystem, fsStat) return nil } +func addDiskStats(fileSystems []fs.Fs, fsInfo *info.FsInfo, fsStats *info.FsStats) { + if fsInfo == nil { + return + } + + for _, fileSys := range fileSystems { + if fsInfo.DeviceMajor == fileSys.DiskStats.Major && + fsInfo.DeviceMinor == fileSys.DiskStats.Minor { + fsStats.ReadsCompleted = fileSys.DiskStats.ReadsCompleted + fsStats.ReadsMerged = fileSys.DiskStats.ReadsMerged + fsStats.SectorsRead = fileSys.DiskStats.SectorsRead + fsStats.ReadTime = fileSys.DiskStats.ReadTime + fsStats.WritesCompleted = fileSys.DiskStats.WritesCompleted + fsStats.WritesMerged = fileSys.DiskStats.WritesMerged + fsStats.SectorsWritten = fileSys.DiskStats.SectorsWritten + fsStats.WriteTime = fileSys.DiskStats.WriteTime + fsStats.IoInProgress = fileSys.DiskStats.IoInProgress + fsStats.IoTime = fileSys.DiskStats.IoTime + fsStats.WeightedIoTime = fileSys.DiskStats.WeightedIoTime + break + } + } +} + // TODO(vmarmol): Get from libcontainer API instead of cgroup manager when we don't have to support older Dockers. func (h *dockerContainerHandler) GetStats() (*info.ContainerStats, error) { stats, err := h.libcontainerHandler.GetStats() diff --git a/vendor/github.com/google/cadvisor/container/factory.go b/vendor/github.com/google/cadvisor/container/factory.go index 652070b1b483..56d198976ef9 100644 --- a/vendor/github.com/google/cadvisor/container/factory.go +++ b/vendor/github.com/google/cadvisor/container/factory.go @@ -63,6 +63,7 @@ const ( ReferencedMemoryMetrics MetricKind = "referenced_memory" CPUTopologyMetrics MetricKind = "cpu_topology" ResctrlMetrics MetricKind = "resctrl" + CPUSetMetrics MetricKind = "cpuset" ) // AllMetrics represents all kinds of metrics that cAdvisor supported. @@ -87,6 +88,7 @@ var AllMetrics = MetricSet{ ReferencedMemoryMetrics: struct{}{}, CPUTopologyMetrics: struct{}{}, ResctrlMetrics: struct{}{}, + CPUSetMetrics: struct{}{}, } func (mk MetricKind) String() string { diff --git a/vendor/github.com/google/cadvisor/container/libcontainer/handler.go b/vendor/github.com/google/cadvisor/container/libcontainer/handler.go index 1094b1039266..4bfb6aef88a2 100644 --- a/vendor/github.com/google/cadvisor/container/libcontainer/handler.go +++ b/vendor/github.com/google/cadvisor/container/libcontainer/handler.go @@ -29,14 +29,13 @@ import ( "strings" "time" - "github.com/google/cadvisor/container" - info "github.com/google/cadvisor/info/v1" - "golang.org/x/sys/unix" - "github.com/opencontainers/runc/libcontainer" "github.com/opencontainers/runc/libcontainer/cgroups" - fs2 "github.com/opencontainers/runc/libcontainer/cgroups/fs2" + "github.com/opencontainers/runc/libcontainer/cgroups/fs2" "k8s.io/klog/v2" + + "github.com/google/cadvisor/container" + info "github.com/google/cadvisor/info/v1" ) var ( @@ -71,21 +70,22 @@ func NewHandler(cgroupManager cgroups.Manager, rootFs string, pid int, includedM // Get cgroup and networking stats of the specified container func (h *Handler) GetStats() (*info.ContainerStats, error) { - var cgroupStats *cgroups.Stats - readCgroupStats := true + ignoreStatsError := false if cgroups.IsCgroup2UnifiedMode() { - // On cgroup v2 there are no stats at the root cgroup - // so check whether it is the root cgroup + // On cgroup v2 the root cgroup stats have been introduced in recent kernel versions, + // so not all kernel versions have all the data. This means that stat fetching can fail + // due to lacking cgroup stat files, but that some data is provided. if h.cgroupManager.Path("") == fs2.UnifiedMountpoint { - readCgroupStats = false + ignoreStatsError = true } } - var err error - if readCgroupStats { - cgroupStats, err = h.cgroupManager.GetStats() - if err != nil { + + cgroupStats, err := h.cgroupManager.GetStats() + if err != nil { + if !ignoreStatsError { return nil, err } + klog.V(4).Infof("Ignoring errors when gathering stats for root cgroup since some controllers don't have stats on the root cgroup: %v", err) } libcontainerStats := &libcontainer.Stats{ CgroupStats: cgroupStats, @@ -758,16 +758,6 @@ func (h *Handler) GetProcesses() ([]int, error) { return pids, nil } -func minUint32(x, y uint32) uint32 { - if x < y { - return x - } - return y -} - -// var to allow unit tests to stub it out -var numCpusFunc = getNumberOnlineCPUs - // Convert libcontainer stats to info.ContainerStats. func setCPUStats(s *cgroups.Stats, ret *info.ContainerStats, withPerCPU bool) { ret.Cpu.Usage.User = s.CpuStats.CpuUsage.UsageInUsermode @@ -785,37 +775,7 @@ func setCPUStats(s *cgroups.Stats, ret *info.ContainerStats, withPerCPU bool) { // cpuacct subsystem. return } - - numPossible := uint32(len(s.CpuStats.CpuUsage.PercpuUsage)) - // Note that as of https://patchwork.kernel.org/patch/8607101/ (kernel v4.7), - // the percpu usage information includes extra zero values for all additional - // possible CPUs. This is to allow statistic collection after CPU-hotplug. - // We intentionally ignore these extra zeroes. - numActual, err := numCpusFunc() - if err != nil { - klog.Errorf("unable to determine number of actual cpus; defaulting to maximum possible number: errno %v", err) - numActual = numPossible - } - if numActual > numPossible { - // The real number of cores should never be greater than the number of - // datapoints reported in cpu usage. - klog.Errorf("PercpuUsage had %v cpus, but the actual number is %v; ignoring extra CPUs", numPossible, numActual) - } - numActual = minUint32(numPossible, numActual) - ret.Cpu.Usage.PerCpu = make([]uint64, numActual) - - for i := uint32(0); i < numActual; i++ { - ret.Cpu.Usage.PerCpu[i] = s.CpuStats.CpuUsage.PercpuUsage[i] - } - -} - -func getNumberOnlineCPUs() (uint32, error) { - var availableCPUs unix.CPUSet - if err := unix.SchedGetaffinity(0, &availableCPUs); err != nil { - return 0, err - } - return uint32(availableCPUs.Count()), nil + ret.Cpu.Usage.PerCpu = s.CpuStats.CpuUsage.PercpuUsage } func setDiskIoStats(s *cgroups.Stats, ret *info.ContainerStats) { @@ -834,7 +794,12 @@ func setMemoryStats(s *cgroups.Stats, ret *info.ContainerStats) { ret.Memory.MaxUsage = s.MemoryStats.Usage.MaxUsage ret.Memory.Failcnt = s.MemoryStats.Usage.Failcnt - if s.MemoryStats.UseHierarchy { + if cgroups.IsCgroup2UnifiedMode() { + ret.Memory.Cache = s.MemoryStats.Stats["file"] + ret.Memory.RSS = s.MemoryStats.Stats["anon"] + ret.Memory.Swap = s.MemoryStats.SwapUsage.Usage + ret.Memory.MappedFile = s.MemoryStats.Stats["file_mapped"] + } else if s.MemoryStats.UseHierarchy { ret.Memory.Cache = s.MemoryStats.Stats["total_cache"] ret.Memory.RSS = s.MemoryStats.Stats["total_rss"] ret.Memory.Swap = s.MemoryStats.Stats["total_swap"] @@ -870,6 +835,10 @@ func setMemoryStats(s *cgroups.Stats, ret *info.ContainerStats) { ret.Memory.WorkingSet = workingSet } +func setCPUSetStats(s *cgroups.Stats, ret *info.ContainerStats) { + ret.CpuSet.MemoryMigrate = s.CPUSetStats.MemoryMigrate +} + func getNumaStats(memoryStats map[uint8]uint64) map[uint8]uint64 { stats := make(map[uint8]uint64, len(memoryStats)) for node, usage := range memoryStats { @@ -947,6 +916,9 @@ func newContainerStats(libcontainerStats *libcontainer.Stats, includedMetrics co if includedMetrics.Has(container.HugetlbUsageMetrics) { setHugepageStats(s, ret) } + if includedMetrics.Has(container.CPUSetMetrics) { + setCPUSetStats(s, ret) + } } if len(libcontainerStats.Interfaces) > 0 { setNetworkStats(libcontainerStats, ret) diff --git a/vendor/github.com/google/cadvisor/fs/fs.go b/vendor/github.com/google/cadvisor/fs/fs.go index cb45c33c9332..91a2d1f26491 100644 --- a/vendor/github.com/google/cadvisor/fs/fs.go +++ b/vendor/github.com/google/cadvisor/fs/fs.go @@ -33,9 +33,9 @@ import ( "github.com/google/cadvisor/devicemapper" "github.com/google/cadvisor/utils" zfs "github.com/mistifyio/go-zfs" + mount "github.com/moby/sys/mountinfo" "k8s.io/klog/v2" - "k8s.io/utils/mount" ) const ( @@ -85,7 +85,7 @@ type RealFsInfo struct { // Labels are intent-specific tags that are auto-detected. labels map[string]string // Map from mountpoint to mount information. - mounts map[string]mount.MountInfo + mounts map[string]mount.Info // devicemapper client dmsetup devicemapper.DmsetupClient // fsUUIDToDeviceName is a map from the filesystem UUID to its device name. @@ -93,7 +93,11 @@ type RealFsInfo struct { } func NewFsInfo(context Context) (FsInfo, error) { - mounts, err := mount.ParseMountInfo("/proc/self/mountinfo") + fileReader, err := os.Open("/proc/self/mountinfo") + if err != nil { + return nil, err + } + mounts, err := mount.GetMountsFromReader(fileReader, nil) if err != nil { return nil, err } @@ -110,13 +114,13 @@ func NewFsInfo(context Context) (FsInfo, error) { fsInfo := &RealFsInfo{ partitions: processMounts(mounts, excluded), labels: make(map[string]string), - mounts: make(map[string]mount.MountInfo), + mounts: make(map[string]mount.Info), dmsetup: devicemapper.NewDmsetupClient(), fsUUIDToDeviceName: fsUUIDToDeviceName, } - for _, mount := range mounts { - fsInfo.mounts[mount.MountPoint] = mount + for _, mnt := range mounts { + fsInfo.mounts[mnt.Mountpoint] = *mnt } // need to call this before the log line below printing out the partitions, as this function may @@ -147,10 +151,10 @@ func getFsUUIDToDeviceNameMap() (map[string]string, error) { fsUUIDToDeviceName := make(map[string]string) for _, file := range files { - path := filepath.Join(dir, file.Name()) - target, err := os.Readlink(path) + fpath := filepath.Join(dir, file.Name()) + target, err := os.Readlink(fpath) if err != nil { - klog.Warningf("Failed to resolve symlink for %q", path) + klog.Warningf("Failed to resolve symlink for %q", fpath) continue } device, err := filepath.Abs(filepath.Join(dir, target)) @@ -162,11 +166,12 @@ func getFsUUIDToDeviceNameMap() (map[string]string, error) { return fsUUIDToDeviceName, nil } -func processMounts(mounts []mount.MountInfo, excludedMountpointPrefixes []string) map[string]partition { +func processMounts(mounts []*mount.Info, excludedMountpointPrefixes []string) map[string]partition { partitions := make(map[string]partition) supportedFsType := map[string]bool{ - // all ext systems are checked through prefix. + // all ext and nfs systems are checked through prefix + // because there are a number of families (e.g., ext3, ext4, nfs3, nfs4...) "btrfs": true, "overlay": true, "tmpfs": true, @@ -174,20 +179,21 @@ func processMounts(mounts []mount.MountInfo, excludedMountpointPrefixes []string "zfs": true, } - for _, mount := range mounts { - if !strings.HasPrefix(mount.FsType, "ext") && !supportedFsType[mount.FsType] { + for _, mnt := range mounts { + if !strings.HasPrefix(mnt.FSType, "ext") && !strings.HasPrefix(mnt.FSType, "nfs") && + !supportedFsType[mnt.FSType] { continue } // Avoid bind mounts, exclude tmpfs. - if _, ok := partitions[mount.Source]; ok { - if mount.FsType != "tmpfs" { + if _, ok := partitions[mnt.Source]; ok { + if mnt.FSType != "tmpfs" { continue } } hasPrefix := false for _, prefix := range excludedMountpointPrefixes { - if strings.HasPrefix(mount.MountPoint, prefix) { + if strings.HasPrefix(mnt.Mountpoint, prefix) { hasPrefix = true break } @@ -197,31 +203,31 @@ func processMounts(mounts []mount.MountInfo, excludedMountpointPrefixes []string } // using mountpoint to replace device once fstype it tmpfs - if mount.FsType == "tmpfs" { - mount.Source = mount.MountPoint + if mnt.FSType == "tmpfs" { + mnt.Source = mnt.Mountpoint } // btrfs fix: following workaround fixes wrong btrfs Major and Minor Ids reported in /proc/self/mountinfo. // instead of using values from /proc/self/mountinfo we use stat to get Ids from btrfs mount point - if mount.FsType == "btrfs" && mount.Major == 0 && strings.HasPrefix(mount.Source, "/dev/") { - major, minor, err := getBtrfsMajorMinorIds(&mount) + if mnt.FSType == "btrfs" && mnt.Major == 0 && strings.HasPrefix(mnt.Source, "/dev/") { + major, minor, err := getBtrfsMajorMinorIds(mnt) if err != nil { klog.Warningf("%s", err) } else { - mount.Major = major - mount.Minor = minor + mnt.Major = major + mnt.Minor = minor } } // overlay fix: Making mount source unique for all overlay mounts, using the mount's major and minor ids. - if mount.FsType == "overlay" { - mount.Source = fmt.Sprintf("%s_%d-%d", mount.Source, mount.Major, mount.Minor) + if mnt.FSType == "overlay" { + mnt.Source = fmt.Sprintf("%s_%d-%d", mnt.Source, mnt.Major, mnt.Minor) } - partitions[mount.Source] = partition{ - fsType: mount.FsType, - mountpoint: mount.MountPoint, - major: uint(mount.Major), - minor: uint(mount.Minor), + partitions[mnt.Source] = partition{ + fsType: mnt.FSType, + mountpoint: mnt.Mountpoint, + major: uint(mnt.Major), + minor: uint(mnt.Minor), } } @@ -256,12 +262,12 @@ func (i *RealFsInfo) getDockerDeviceMapperInfo(context DockerContext) (string, * } // addSystemRootLabel attempts to determine which device contains the mount for /. -func (i *RealFsInfo) addSystemRootLabel(mounts []mount.MountInfo) { +func (i *RealFsInfo) addSystemRootLabel(mounts []*mount.Info) { for _, m := range mounts { - if m.MountPoint == "/" { + if m.Mountpoint == "/" { i.partitions[m.Source] = partition{ - fsType: m.FsType, - mountpoint: m.MountPoint, + fsType: m.FSType, + mountpoint: m.Mountpoint, major: uint(m.Major), minor: uint(m.Minor), } @@ -272,7 +278,7 @@ func (i *RealFsInfo) addSystemRootLabel(mounts []mount.MountInfo) { } // addDockerImagesLabel attempts to determine which device contains the mount for docker images. -func (i *RealFsInfo) addDockerImagesLabel(context Context, mounts []mount.MountInfo) { +func (i *RealFsInfo) addDockerImagesLabel(context Context, mounts []*mount.Info) { dockerDev, dockerPartition, err := i.getDockerDeviceMapperInfo(context.Docker) if err != nil { klog.Warningf("Could not get Docker devicemapper device: %v", err) @@ -285,7 +291,7 @@ func (i *RealFsInfo) addDockerImagesLabel(context Context, mounts []mount.MountI } } -func (i *RealFsInfo) addCrioImagesLabel(context Context, mounts []mount.MountInfo) { +func (i *RealFsInfo) addCrioImagesLabel(context Context, mounts []*mount.Info) { if context.Crio.Root != "" { crioPath := context.Crio.Root crioImagePaths := map[string]struct{}{ @@ -324,20 +330,19 @@ func getDockerImagePaths(context Context) map[string]struct{} { // This method compares the mountpoints with possible container image mount points. If a match is found, // the label is added to the partition. -func (i *RealFsInfo) updateContainerImagesPath(label string, mounts []mount.MountInfo, containerImagePaths map[string]struct{}) { - var useMount *mount.MountInfo +func (i *RealFsInfo) updateContainerImagesPath(label string, mounts []*mount.Info, containerImagePaths map[string]struct{}) { + var useMount *mount.Info for _, m := range mounts { - if _, ok := containerImagePaths[m.MountPoint]; ok { - if useMount == nil || (len(useMount.MountPoint) < len(m.MountPoint)) { - useMount = new(mount.MountInfo) - *useMount = m + if _, ok := containerImagePaths[m.Mountpoint]; ok { + if useMount == nil || (len(useMount.Mountpoint) < len(m.Mountpoint)) { + useMount = m } } } if useMount != nil { i.partitions[useMount.Source] = partition{ - fsType: useMount.FsType, - mountpoint: useMount.MountPoint, + fsType: useMount.FSType, + mountpoint: useMount.Mountpoint, major: uint(useMount.Major), minor: uint(useMount.Minor), } @@ -354,7 +359,7 @@ func (i *RealFsInfo) GetDeviceForLabel(label string) (string, error) { } func (i *RealFsInfo) GetLabelsForDevice(device string) ([]string, error) { - labels := []string{} + var labels []string for label, dev := range i.labels { if dev == device { labels = append(labels, label) @@ -462,12 +467,12 @@ func getDiskStatsMap(diskStatsFile string) (map[string]DiskStats, error) { // 8 50 sdd2 40 0 280 223 7 0 22 108 0 330 330 deviceName := path.Join("/dev", words[2]) - var error error + var err error devInfo := make([]uint64, 2) for i := 0; i < len(devInfo); i++ { - devInfo[i], error = strconv.ParseUint(words[i], 10, 64) - if error != nil { - return nil, error + devInfo[i], err = strconv.ParseUint(words[i], 10, 64) + if err != nil { + return nil, err } } @@ -478,11 +483,22 @@ func getDiskStatsMap(diskStatsFile string) (map[string]DiskStats, error) { return nil, fmt.Errorf("could not parse all 11 columns of /proc/diskstats") } for i := offset; i < wordLength; i++ { - stats[i-offset], error = strconv.ParseUint(words[i], 10, 64) - if error != nil { - return nil, error + stats[i-offset], err = strconv.ParseUint(words[i], 10, 64) + if err != nil { + return nil, err } } + + major64, err := strconv.ParseUint(words[0], 10, 64) + if err != nil { + return nil, err + } + + minor64, err := strconv.ParseUint(words[1], 10, 64) + if err != nil { + return nil, err + } + diskStats := DiskStats{ MajorNum: devInfo[0], MinorNum: devInfo[1], @@ -497,6 +513,8 @@ func getDiskStatsMap(diskStatsFile string) (map[string]DiskStats, error) { IoInProgress: stats[8], IoTime: stats[9], WeightedIoTime: stats[10], + Major: major64, + Minor: minor64, } diskStatsMap[deviceName] = diskStats } @@ -527,6 +545,26 @@ func (i *RealFsInfo) GetDeviceInfoByFsUUID(uuid string) (*DeviceInfo, error) { return &DeviceInfo{deviceName, p.major, p.minor}, nil } +func (i *RealFsInfo) mountInfoFromDir(dir string) (*mount.Info, bool) { + mnt, found := i.mounts[dir] + // try the parent dir if not found until we reach the root dir + // this is an issue on btrfs systems where the directory is not + // the subvolume + for !found { + pathdir, _ := filepath.Split(dir) + // break when we reach root + if pathdir == "/" { + mnt, found = i.mounts["/"] + break + } + // trim "/" from the new parent path otherwise the next possible + // filepath.Split in the loop will not split the string any further + dir = strings.TrimSuffix(pathdir, "/") + mnt, found = i.mounts[dir] + } + return &mnt, found +} + func (i *RealFsInfo) GetDirFsDevice(dir string) (*DeviceInfo, error) { buf := new(syscall.Stat_t) err := syscall.Stat(dir, buf) @@ -543,28 +581,13 @@ func (i *RealFsInfo) GetDirFsDevice(dir string) (*DeviceInfo, error) { } } - mount, found := i.mounts[dir] - // try the parent dir if not found until we reach the root dir - // this is an issue on btrfs systems where the directory is not - // the subvolume - for !found { - pathdir, _ := filepath.Split(dir) - // break when we reach root - if pathdir == "/" { - break - } - // trim "/" from the new parent path otherwise the next possible - // filepath.Split in the loop will not split the string any further - dir = strings.TrimSuffix(pathdir, "/") - mount, found = i.mounts[dir] - } - - if found && mount.FsType == "btrfs" && mount.Major == 0 && strings.HasPrefix(mount.Source, "/dev/") { - major, minor, err := getBtrfsMajorMinorIds(&mount) + mnt, found := i.mountInfoFromDir(dir) + if found && mnt.FSType == "btrfs" && mnt.Major == 0 && strings.HasPrefix(mnt.Source, "/dev/") { + major, minor, err := getBtrfsMajorMinorIds(mnt) if err != nil { klog.Warningf("%s", err) } else { - return &DeviceInfo{mount.Source, uint(major), uint(minor)}, nil + return &DeviceInfo{mnt.Source, uint(major), uint(minor)}, nil } } return nil, fmt.Errorf("could not find device with major: %d, minor: %d in cached partitions map", major, minor) @@ -750,7 +773,7 @@ func getZfstats(poolName string) (uint64, uint64, uint64, error) { } // Get major and minor Ids for a mount point using btrfs as filesystem. -func getBtrfsMajorMinorIds(mount *mount.MountInfo) (int, int, error) { +func getBtrfsMajorMinorIds(mount *mount.Info) (int, int, error) { // btrfs fix: following workaround fixes wrong btrfs Major and Minor Ids reported in /proc/self/mountinfo. // instead of using values from /proc/self/mountinfo we use stat to get Ids from btrfs mount point @@ -763,9 +786,9 @@ func getBtrfsMajorMinorIds(mount *mount.MountInfo) (int, int, error) { klog.V(4).Infof("btrfs mount %#v", mount) if buf.Mode&syscall.S_IFMT == syscall.S_IFBLK { - err := syscall.Stat(mount.MountPoint, buf) + err := syscall.Stat(mount.Mountpoint, buf) if err != nil { - err = fmt.Errorf("stat failed on %s with error: %s", mount.MountPoint, err) + err = fmt.Errorf("stat failed on %s with error: %s", mount.Mountpoint, err) return 0, 0, err } diff --git a/vendor/github.com/google/cadvisor/fs/types.go b/vendor/github.com/google/cadvisor/fs/types.go index 93294ebcc27c..0445a17adbe3 100644 --- a/vendor/github.com/google/cadvisor/fs/types.go +++ b/vendor/github.com/google/cadvisor/fs/types.go @@ -77,6 +77,8 @@ type DiskStats struct { IoInProgress uint64 IoTime uint64 WeightedIoTime uint64 + Major uint64 + Minor uint64 } type UsageInfo struct { diff --git a/vendor/github.com/google/cadvisor/info/v1/container.go b/vendor/github.com/google/cadvisor/info/v1/container.go index 08cff3940f1c..9fe04fddea25 100644 --- a/vendor/github.com/google/cadvisor/info/v1/container.go +++ b/vendor/github.com/google/cadvisor/info/v1/container.go @@ -399,6 +399,10 @@ type MemoryStats struct { HierarchicalData MemoryStatsMemoryData `json:"hierarchical_data,omitempty"` } +type CPUSetStats struct { + MemoryMigrate uint64 `json:"memory_migrate"` +} + type MemoryNumaStats struct { File map[uint8]uint64 `json:"file,omitempty"` Anon map[uint8]uint64 `json:"anon,omitempty"` @@ -957,6 +961,8 @@ type ContainerStats struct { // Resource Control (resctrl) statistics Resctrl ResctrlStats `json:"resctrl,omitempty"` + + CpuSet CPUSetStats `json:"cpuset,omitempty"` } func timeEq(t1, t2 time.Time, tolerance time.Duration) bool { diff --git a/vendor/github.com/google/cadvisor/machine/machine.go b/vendor/github.com/google/cadvisor/machine/machine.go index 917569377ddd..706bba637823 100644 --- a/vendor/github.com/google/cadvisor/machine/machine.go +++ b/vendor/github.com/google/cadvisor/machine/machine.go @@ -16,18 +16,15 @@ package machine import ( - "bytes" "fmt" "io/ioutil" "os" "path" - "path/filepath" "regexp" - "strconv" - "strings" - // s390/s390x changes "runtime" + "strconv" + "strings" info "github.com/google/cadvisor/info/v1" "github.com/google/cadvisor/utils" @@ -54,9 +51,6 @@ var ( maxFreqFile = "/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq" ) -const sysFsCPUCoreID = "core_id" -const sysFsCPUPhysicalPackageID = "physical_package_id" -const sysFsCPUTopology = "topology" const memTypeFileName = "dimm_mem_type" const sizeFileName = "size" @@ -66,7 +60,7 @@ func GetPhysicalCores(procInfo []byte) int { if numCores == 0 { // read number of cores from /sys/bus/cpu/devices/cpu*/topology/core_id to deal with processors // for which 'core id' is not available in /proc/cpuinfo - numCores = getUniqueCPUPropertyCount(cpuBusPath, sysFsCPUCoreID) + numCores = sysfs.GetUniqueCPUPropertyCount(cpuBusPath, sysfs.CPUCoreID) } if numCores == 0 { klog.Errorf("Cannot read number of physical cores correctly, number of cores set to %d", numCores) @@ -80,7 +74,7 @@ func GetSockets(procInfo []byte) int { if numSocket == 0 { // read number of sockets from /sys/bus/cpu/devices/cpu*/topology/physical_package_id to deal with processors // for which 'physical id' is not available in /proc/cpuinfo - numSocket = getUniqueCPUPropertyCount(cpuBusPath, sysFsCPUPhysicalPackageID) + numSocket = sysfs.GetUniqueCPUPropertyCount(cpuBusPath, sysfs.CPUPhysicalPackageID) } if numSocket == 0 { klog.Errorf("Cannot read number of sockets correctly, number of sockets set to %d", numSocket) @@ -236,39 +230,6 @@ func parseCapacity(b []byte, r *regexp.Regexp) (uint64, error) { return m * 1024, err } -// Looks for sysfs cpu path containing given CPU property, e.g. core_id or physical_package_id -// and returns number of unique values of given property, exemplary usage: getting number of CPU physical cores -func getUniqueCPUPropertyCount(cpuBusPath string, propertyName string) int { - pathPattern := cpuBusPath + "cpu*[0-9]" - sysCPUPaths, err := filepath.Glob(pathPattern) - if err != nil { - klog.Errorf("Cannot find files matching pattern (pathPattern: %s), number of unique %s set to 0", pathPattern, propertyName) - return 0 - } - uniques := make(map[string]bool) - for _, sysCPUPath := range sysCPUPaths { - onlinePath := filepath.Join(sysCPUPath, "online") - onlineVal, err := ioutil.ReadFile(onlinePath) - if err != nil { - klog.Warningf("Cannot determine CPU %s online state, skipping", sysCPUPath) - continue - } - onlineVal = bytes.TrimSpace(onlineVal) - if len(onlineVal) == 0 || onlineVal[0] != 49 { - klog.Warningf("CPU %s is offline, skipping", sysCPUPath) - continue - } - propertyPath := filepath.Join(sysCPUPath, sysFsCPUTopology, propertyName) - propertyVal, err := ioutil.ReadFile(propertyPath) - if err != nil { - klog.Errorf("Cannot open %s, number of unique %s set to 0", propertyPath, propertyName) - return 0 - } - uniques[string(propertyVal)] = true - } - return len(uniques) -} - // getUniqueMatchesCount returns number of unique matches in given argument using provided regular expression func getUniqueMatchesCount(s string, r *regexp.Regexp) int { matches := r.FindAllString(s, -1) diff --git a/vendor/github.com/google/cadvisor/manager/container.go b/vendor/github.com/google/cadvisor/manager/container.go index c599300d84ba..c776e10d6406 100644 --- a/vendor/github.com/google/cadvisor/manager/container.go +++ b/vendor/github.com/google/cadvisor/manager/container.go @@ -38,7 +38,7 @@ import ( "github.com/google/cadvisor/summary" "github.com/google/cadvisor/utils/cpuload" - units "github.com/docker/go-units" + "github.com/docker/go-units" "k8s.io/klog/v2" "k8s.io/utils/clock" ) @@ -47,9 +47,14 @@ import ( var enableLoadReader = flag.Bool("enable_load_reader", false, "Whether to enable cpu load reader") var HousekeepingInterval = flag.Duration("housekeeping_interval", 1*time.Second, "Interval between container housekeepings") +// TODO: replace regular expressions with something simpler, such as strings.Split(). // cgroup type chosen to fetch the cgroup path of a process. -// Memory has been chosen, as it is one of the default cgroups that is enabled for most containers. -var cgroupPathRegExp = regexp.MustCompile(`memory[^:]*:(.*?)[,;$]`) +// Memory has been chosen, as it is one of the default cgroups that is enabled for most containers... +var cgroupMemoryPathRegExp = regexp.MustCompile(`memory[^:]*:(.*?)[,;$]`) + +// ... but there are systems (e.g. Raspberry Pi 4) where memory cgroup controller is disabled by default. +// We should check cpu cgroup then. +var cgroupCPUPathRegExp = regexp.MustCompile(`cpu[^:]*:(.*?)[,;$]`) type containerInfo struct { info.ContainerReference @@ -138,7 +143,10 @@ func (cd *containerData) allowErrorLogging() bool { // periodic housekeeping to reset. This should be used sparingly, as calling OnDemandHousekeeping frequently // can have serious performance costs. func (cd *containerData) OnDemandHousekeeping(maxAge time.Duration) { - if cd.clock.Since(cd.statsLastUpdatedTime) > maxAge { + cd.lock.Lock() + timeSinceStatsLastUpdate := cd.clock.Since(cd.statsLastUpdatedTime) + cd.lock.Unlock() + if timeSinceStatsLastUpdate > maxAge { housekeepingFinishedChan := make(chan struct{}) cd.onDemandChan <- housekeepingFinishedChan select { @@ -195,20 +203,28 @@ func (cd *containerData) DerivedStats() (v2.DerivedStats, error) { return cd.summaryReader.DerivedStats() } -func (cd *containerData) getCgroupPath(cgroups string) (string, error) { +func (cd *containerData) getCgroupPath(cgroups string) string { if cgroups == "-" { - return "/", nil + return "/" } if strings.HasPrefix(cgroups, "0::") { - return cgroups[3:], nil + return cgroups[3:] } - matches := cgroupPathRegExp.FindSubmatch([]byte(cgroups)) + matches := cgroupMemoryPathRegExp.FindSubmatch([]byte(cgroups)) if len(matches) != 2 { - klog.V(3).Infof("failed to get memory cgroup path from %q", cgroups) - // return root in case of failures - memory hierarchy might not be enabled. - return "/", nil - } - return string(matches[1]), nil + klog.V(3).Infof( + "failed to get memory cgroup path from %q, will try to get cpu cgroup path", + cgroups, + ) + // On some systems (e.g. Raspberry PI 4) cgroup memory controlled is disabled by default. + matches = cgroupCPUPathRegExp.FindSubmatch([]byte(cgroups)) + if len(matches) != 2 { + klog.V(3).Infof("failed to get cpu cgroup path from %q; assuming root cgroup", cgroups) + // return root in case of failures - memory hierarchy might not be enabled. + return "/" + } + } + return string(matches[1]) } // Returns contents of a file inside the container root. @@ -271,10 +287,7 @@ func (cd *containerData) getContainerPids(inHostNamespace bool) ([]string, error return nil, fmt.Errorf("expected at least %d fields, found %d: output: %q", expectedFields, len(fields), line) } pid := fields[0] - cgroup, err := cd.getCgroupPath(fields[1]) - if err != nil { - return nil, fmt.Errorf("could not parse cgroup path from %q: %v", fields[1], err) - } + cgroup := cd.getCgroupPath(fields[1]) if cd.info.Name == cgroup { pids = append(pids, pid) } @@ -283,106 +296,130 @@ func (cd *containerData) getContainerPids(inHostNamespace bool) ([]string, error } func (cd *containerData) GetProcessList(cadvisorContainer string, inHostNamespace bool) ([]v2.ProcessInfo, error) { - // report all processes for root. - isRoot := cd.info.Name == "/" - rootfs := "/" - if !inHostNamespace { - rootfs = "/rootfs" - } format := "user,pid,ppid,stime,pcpu,pmem,rss,vsz,stat,time,comm,psr,cgroup" out, err := cd.getPsOutput(inHostNamespace, format) if err != nil { return nil, err } - expectedFields := 13 + return cd.parseProcessList(cadvisorContainer, inHostNamespace, out) +} + +func (cd *containerData) parseProcessList(cadvisorContainer string, inHostNamespace bool, out []byte) ([]v2.ProcessInfo, error) { + rootfs := "/" + if !inHostNamespace { + rootfs = "/rootfs" + } processes := []v2.ProcessInfo{} lines := strings.Split(string(out), "\n") for _, line := range lines[1:] { - if len(line) == 0 { - continue - } - fields := strings.Fields(line) - if len(fields) < expectedFields { - return nil, fmt.Errorf("expected at least %d fields, found %d: output: %q", expectedFields, len(fields), line) - } - pid, err := strconv.Atoi(fields[1]) - if err != nil { - return nil, fmt.Errorf("invalid pid %q: %v", fields[1], err) - } - ppid, err := strconv.Atoi(fields[2]) - if err != nil { - return nil, fmt.Errorf("invalid ppid %q: %v", fields[2], err) - } - percentCPU, err := strconv.ParseFloat(fields[4], 32) - if err != nil { - return nil, fmt.Errorf("invalid cpu percent %q: %v", fields[4], err) - } - percentMem, err := strconv.ParseFloat(fields[5], 32) - if err != nil { - return nil, fmt.Errorf("invalid memory percent %q: %v", fields[5], err) - } - rss, err := strconv.ParseUint(fields[6], 0, 64) - if err != nil { - return nil, fmt.Errorf("invalid rss %q: %v", fields[6], err) - } - // convert to bytes - rss *= 1024 - vs, err := strconv.ParseUint(fields[7], 0, 64) - if err != nil { - return nil, fmt.Errorf("invalid virtual size %q: %v", fields[7], err) - } - // convert to bytes - vs *= 1024 - psr, err := strconv.Atoi(fields[11]) - if err != nil { - return nil, fmt.Errorf("invalid pid %q: %v", fields[1], err) - } - - cgroup, err := cd.getCgroupPath(fields[12]) + processInfo, err := cd.parsePsLine(line, cadvisorContainer, inHostNamespace) if err != nil { - return nil, fmt.Errorf("could not parse cgroup path from %q: %v", fields[11], err) + return nil, fmt.Errorf("could not parse line %s: %v", line, err) } - // Remove the ps command we just ran from cadvisor container. - // Not necessary, but makes the cadvisor page look cleaner. - if !inHostNamespace && cadvisorContainer == cgroup && fields[10] == "ps" { + if processInfo == nil { continue } - var cgroupPath string - if isRoot { - cgroupPath = cgroup - } var fdCount int - dirPath := path.Join(rootfs, "/proc", strconv.Itoa(pid), "fd") + dirPath := path.Join(rootfs, "/proc", strconv.Itoa(processInfo.Pid), "fd") fds, err := ioutil.ReadDir(dirPath) if err != nil { klog.V(4).Infof("error while listing directory %q to measure fd count: %v", dirPath, err) continue } fdCount = len(fds) + processInfo.FdCount = fdCount - if isRoot || cd.info.Name == cgroup { - processes = append(processes, v2.ProcessInfo{ - User: fields[0], - Pid: pid, - Ppid: ppid, - StartTime: fields[3], - PercentCpu: float32(percentCPU), - PercentMemory: float32(percentMem), - RSS: rss, - VirtualSize: vs, - Status: fields[8], - RunningTime: fields[9], - Cmd: fields[10], - CgroupPath: cgroupPath, - FdCount: fdCount, - Psr: psr, - }) - } + processes = append(processes, *processInfo) } return processes, nil } +func (cd *containerData) isRoot() bool { + return cd.info.Name == "/" +} + +func (cd *containerData) parsePsLine(line, cadvisorContainer string, inHostNamespace bool) (*v2.ProcessInfo, error) { + const expectedFields = 13 + if len(line) == 0 { + return nil, nil + } + + info := v2.ProcessInfo{} + var err error + + fields := strings.Fields(line) + if len(fields) < expectedFields { + return nil, fmt.Errorf("expected at least %d fields, found %d: output: %q", expectedFields, len(fields), line) + } + info.User = fields[0] + info.StartTime = fields[3] + info.Status = fields[8] + info.RunningTime = fields[9] + + info.Pid, err = strconv.Atoi(fields[1]) + if err != nil { + return nil, fmt.Errorf("invalid pid %q: %v", fields[1], err) + } + info.Ppid, err = strconv.Atoi(fields[2]) + if err != nil { + return nil, fmt.Errorf("invalid ppid %q: %v", fields[2], err) + } + + percentCPU, err := strconv.ParseFloat(fields[4], 32) + if err != nil { + return nil, fmt.Errorf("invalid cpu percent %q: %v", fields[4], err) + } + info.PercentCpu = float32(percentCPU) + percentMem, err := strconv.ParseFloat(fields[5], 32) + if err != nil { + return nil, fmt.Errorf("invalid memory percent %q: %v", fields[5], err) + } + info.PercentMemory = float32(percentMem) + + info.RSS, err = strconv.ParseUint(fields[6], 0, 64) + if err != nil { + return nil, fmt.Errorf("invalid rss %q: %v", fields[6], err) + } + info.VirtualSize, err = strconv.ParseUint(fields[7], 0, 64) + if err != nil { + return nil, fmt.Errorf("invalid virtual size %q: %v", fields[7], err) + } + // convert to bytes + info.RSS *= 1024 + info.VirtualSize *= 1024 + + // According to `man ps`: The following user-defined format specifiers may contain spaces: args, cmd, comm, command, + // fname, ucmd, ucomm, lstart, bsdstart, start. + // Therefore we need to be able to parse comm that consists of multiple space-separated parts. + info.Cmd = strings.Join(fields[10:len(fields)-2], " ") + + // These are last two parts of the line. We create a subslice of `fields` to handle comm that includes spaces. + lastTwoFields := fields[len(fields)-2:] + info.Psr, err = strconv.Atoi(lastTwoFields[0]) + if err != nil { + return nil, fmt.Errorf("invalid psr %q: %v", lastTwoFields[0], err) + } + info.CgroupPath = cd.getCgroupPath(lastTwoFields[1]) + + // Remove the ps command we just ran from cadvisor container. + // Not necessary, but makes the cadvisor page look cleaner. + if !inHostNamespace && cadvisorContainer == info.CgroupPath && info.Cmd == "ps" { + return nil, nil + } + + // Do not report processes from other containers when non-root container requested. + if !cd.isRoot() && info.CgroupPath != cd.info.Name { + return nil, nil + } + + // Remove cgroup information when non-root container requested. + if !cd.isRoot() { + info.CgroupPath = "" + } + return &info, nil +} + func newContainerData(containerName string, memoryCache *memory.InMemoryCache, handler container.ContainerHandler, logUsage bool, collectorManager collector.CollectorManager, maxHousekeepingInterval time.Duration, allowDynamicHousekeeping bool, clock clock.Clock) (*containerData, error) { if memoryCache == nil { return nil, fmt.Errorf("nil memory storage") @@ -516,7 +553,7 @@ func (cd *containerData) housekeeping() { usageCPUNs := uint64(0) for i := range stats { if i > 0 { - usageCPUNs += (stats[i].Cpu.Usage.Total - stats[i-1].Cpu.Usage.Total) + usageCPUNs += stats[i].Cpu.Usage.Total - stats[i-1].Cpu.Usage.Total } } usageMemory := stats[numSamples-1].Memory.Usage @@ -555,6 +592,8 @@ func (cd *containerData) housekeepingTick(timer <-chan time.Time, longHousekeepi klog.V(3).Infof("[%s] Housekeeping took %s", cd.info.Name, duration) } cd.notifyOnDemand() + cd.lock.Lock() + defer cd.lock.Unlock() cd.statsLastUpdatedTime = cd.clock.Now() return true } diff --git a/vendor/github.com/google/cadvisor/metrics/prometheus.go b/vendor/github.com/google/cadvisor/metrics/prometheus.go index 1064e045a2c6..7d3f24a99dad 100644 --- a/vendor/github.com/google/cadvisor/metrics/prometheus.go +++ b/vendor/github.com/google/cadvisor/metrics/prometheus.go @@ -455,6 +455,16 @@ func NewPrometheusCollector(i infoProvider, f ContainerLabelsFunc, includedMetri }, }...) } + if includedMetrics.Has(container.CPUSetMetrics) { + c.containerMetrics = append(c.containerMetrics, containerMetric{ + name: "container_memory_migrate", + help: "Memory migrate status.", + valueType: prometheus.GaugeValue, + getValues: func(s *info.ContainerStats) metricValues { + return metricValues{{value: float64(s.CpuSet.MemoryMigrate), timestamp: s.Timestamp}} + }, + }) + } if includedMetrics.Has(container.MemoryNumaMetrics) { c.containerMetrics = append(c.containerMetrics, []containerMetric{ { @@ -757,6 +767,28 @@ func NewPrometheusCollector(i infoProvider, f ContainerLabelsFunc, includedMetri }, s.Timestamp) }, }, + { + name: "container_blkio_device_usage_total", + help: "Blkio Device bytes usage", + valueType: prometheus.CounterValue, + extraLabels: []string{"device", "major", "minor", "operation"}, + getValues: func(s *info.ContainerStats) metricValues { + var values metricValues + for _, diskStat := range s.DiskIo.IoServiceBytes { + for operation, value := range diskStat.Stats { + values = append(values, metricValue{ + value: float64(value), + labels: []string{diskStat.Device, + strconv.Itoa(int(diskStat.Major)), + strconv.Itoa(int(diskStat.Minor)), + operation}, + timestamp: s.Timestamp, + }) + } + } + return values + }, + }, }...) } if includedMetrics.Has(container.NetworkUsageMetrics) { diff --git a/vendor/github.com/google/cadvisor/metrics/prometheus_fake.go b/vendor/github.com/google/cadvisor/metrics/prometheus_fake.go index 6368c0b75ebc..822b3f82c977 100644 --- a/vendor/github.com/google/cadvisor/metrics/prometheus_fake.go +++ b/vendor/github.com/google/cadvisor/metrics/prometheus_fake.go @@ -524,6 +524,21 @@ func (p testSubcontainersInfoProvider) GetRequestedContainersInfo(string, v2.Req TxQueued: 0, }, }, + DiskIo: info.DiskIoStats{ + IoServiceBytes: []info.PerDiskStats{{ + Device: "/dev/sdb", + Major: 8, + Minor: 0, + Stats: map[string]uint64{ + "Async": 1, + "Discard": 2, + "Read": 3, + "Sync": 4, + "Total": 5, + "Write": 6, + }, + }}, + }, Filesystem: []info.FsStats{ { Device: "sda1", @@ -708,6 +723,7 @@ func (p testSubcontainersInfoProvider) GetRequestedContainersInfo(string, v2.Req }, }, }, + CpuSet: info.CPUSetStats{MemoryMigrate: 1}, }, }, }, diff --git a/vendor/github.com/google/cadvisor/resctrl/collector.go b/vendor/github.com/google/cadvisor/resctrl/collector.go index 210156a89b1c..f677b8d04414 100644 --- a/vendor/github.com/google/cadvisor/resctrl/collector.go +++ b/vendor/github.com/google/cadvisor/resctrl/collector.go @@ -26,19 +26,19 @@ import ( ) type collector struct { - resctrl intelrdt.IntelRdtManager + resctrl intelrdt.Manager stats.NoopDestroy } func newCollector(id string, resctrlPath string) *collector { collector := &collector{ - resctrl: intelrdt.IntelRdtManager{ - Config: &configs.Config{ + resctrl: intelrdt.NewManager( + &configs.Config{ IntelRdt: &configs.IntelRdt{}, }, - Id: id, - Path: resctrlPath, - }, + id, + resctrlPath, + ), } return collector diff --git a/vendor/github.com/google/cadvisor/utils/oomparser/oomparser.go b/vendor/github.com/google/cadvisor/utils/oomparser/oomparser.go index e652874e52d0..32dc838fb919 100644 --- a/vendor/github.com/google/cadvisor/utils/oomparser/oomparser.go +++ b/vendor/github.com/google/cadvisor/utils/oomparser/oomparser.go @@ -28,7 +28,7 @@ import ( var ( legacyContainerRegexp = regexp.MustCompile(`Task in (.*) killed as a result of limit of (.*)`) // Starting in 5.0 linux kernels, the OOM message changed - containerRegexp = regexp.MustCompile(`oom-kill:constraint=(.*),nodemask=(.*),cpuset=(.*),mems_allowed=(.*),oom_memcg=(.*) (.*),task_memcg=(.*),task=(.*),pid=(.*),uid=(.*)`) + containerRegexp = regexp.MustCompile(`oom-kill:constraint=(.*),nodemask=(.*),cpuset=(.*),mems_allowed=(.*),oom_memcg=(.*),task_memcg=(.*),task=(.*),pid=(.*),uid=(.*)`) lastLineRegexp = regexp.MustCompile(`Killed process ([0-9]+) \((.+)\)`) firstLineRegexp = regexp.MustCompile(`invoked oom-killer:`) ) @@ -76,15 +76,15 @@ func getContainerName(line string, currentOomInstance *OomInstance) (bool, error // Fall back to the legacy format if it isn't found here. return false, getLegacyContainerName(line, currentOomInstance) } - currentOomInstance.ContainerName = parsedLine[7] + currentOomInstance.ContainerName = parsedLine[6] currentOomInstance.VictimContainerName = parsedLine[5] currentOomInstance.Constraint = parsedLine[1] - pid, err := strconv.Atoi(parsedLine[9]) + pid, err := strconv.Atoi(parsedLine[8]) if err != nil { return false, err } currentOomInstance.Pid = pid - currentOomInstance.ProcessName = parsedLine[8] + currentOomInstance.ProcessName = parsedLine[7] return true, nil } diff --git a/vendor/github.com/google/cadvisor/utils/sysfs/sysfs.go b/vendor/github.com/google/cadvisor/utils/sysfs/sysfs.go index becc4afc4751..1be228a0e5f6 100644 --- a/vendor/github.com/google/cadvisor/utils/sysfs/sysfs.go +++ b/vendor/github.com/google/cadvisor/utils/sysfs/sysfs.go @@ -16,7 +16,6 @@ package sysfs import ( "bytes" - "errors" "fmt" "io/ioutil" "os" @@ -37,9 +36,21 @@ const ( ppcDevTree = "/proc/device-tree" s390xDevTree = "/etc" // s390/s390x changes - coreIDFilePath = "/topology/core_id" - packageIDFilePath = "/topology/physical_package_id" - meminfoFile = "meminfo" + meminfoFile = "meminfo" + + sysFsCPUTopology = "topology" + + // CPUPhysicalPackageID is a physical package id of cpu#. Typically corresponds to a physical socket number, + // but the actual value is architecture and platform dependent. + CPUPhysicalPackageID = "physical_package_id" + // CPUCoreID is the CPU core ID of cpu#. Typically it is the hardware platform's identifier + // (rather than the kernel's). The actual value is architecture and platform dependent. + CPUCoreID = "core_id" + + coreIDFilePath = "/" + sysFsCPUTopology + "/core_id" + packageIDFilePath = "/" + sysFsCPUTopology + "/physical_package_id" + + // memory size calculations cpuDirPattern = "cpu*[0-9]" nodeDirPattern = "node*[0-9]" @@ -325,9 +336,9 @@ func (fs *realSysFs) GetSystemUUID() (string, error) { if id, err := ioutil.ReadFile(path.Join(dmiDir, "id", "product_uuid")); err == nil { return strings.TrimSpace(string(id)), nil } else if id, err = ioutil.ReadFile(path.Join(ppcDevTree, "system-id")); err == nil { - return strings.TrimSpace(string(id)), nil + return strings.TrimSpace(strings.TrimRight(string(id), "\000")), nil } else if id, err = ioutil.ReadFile(path.Join(ppcDevTree, "vm,uuid")); err == nil { - return strings.TrimSpace(string(id)), nil + return strings.TrimSpace(strings.TrimRight(string(id), "\000")), nil } else if id, err = ioutil.ReadFile(path.Join(s390xDevTree, "machine-id")); err == nil { return strings.TrimSpace(string(id)), nil } else { @@ -335,25 +346,152 @@ func (fs *realSysFs) GetSystemUUID() (string, error) { } } -func (fs *realSysFs) IsCPUOnline(dir string) bool { - cpuPath := fmt.Sprintf("%s/online", dir) - content, err := ioutil.ReadFile(cpuPath) +func (fs *realSysFs) IsCPUOnline(cpuPath string) bool { + onlinePath, err := filepath.Abs(cpuPath + "/../online") if err != nil { - pathErr, ok := err.(*os.PathError) - if ok { - if errors.Is(pathErr.Unwrap(), os.ErrNotExist) && isZeroCPU(dir) { - return true - } - } - klog.Warningf("unable to read %s: %s", cpuPath, err.Error()) + klog.V(1).Infof("Unable to get absolute path for %s", cpuPath) + return false + } + + // Quick check to determine if file exists: if it does not then kernel CPU hotplug is disabled and all CPUs are online. + _, err = os.Stat(onlinePath) + if err != nil && os.IsNotExist(err) { + return true + } + if err != nil { + klog.V(1).Infof("Unable to stat %s: %s", onlinePath, err) + } + + cpuID, err := getCPUID(cpuPath) + if err != nil { + klog.V(1).Infof("Unable to get CPU ID from path %s: %s", cpuPath, err) return false } - trimmed := bytes.TrimSpace(content) - return len(trimmed) == 1 && trimmed[0] == 49 + + isOnline, err := isCPUOnline(onlinePath, cpuID) + if err != nil { + klog.V(1).Infof("Unable to get online CPUs list: %s", err) + return false + } + return isOnline } -func isZeroCPU(dir string) bool { - regex := regexp.MustCompile("cpu([0-9]*)") +func getCPUID(dir string) (uint16, error) { + regex := regexp.MustCompile("cpu([0-9]+)") matches := regex.FindStringSubmatch(dir) - return len(matches) == 2 && matches[1] == "0" + if len(matches) == 2 { + id, err := strconv.Atoi(matches[1]) + if err != nil { + return 0, err + } + return uint16(id), nil + } + return 0, fmt.Errorf("can't get CPU ID from %s", dir) +} + +// isCPUOnline is copied from github.com/opencontainers/runc/libcontainer/cgroups/fs and modified to suite cAdvisor +// needs as Apache 2.0 license allows. +// It parses CPU list (such as: 0,3-5,10) into a struct that allows to determine quickly if CPU or particular ID is online. +// see: https://github.com/opencontainers/runc/blob/ab27e12cebf148aa5d1ee3ad13d9fc7ae12bf0b6/libcontainer/cgroups/fs/cpuset.go#L45 +func isCPUOnline(path string, cpuID uint16) (bool, error) { + fileContent, err := ioutil.ReadFile(path) + if err != nil { + return false, err + } + if len(fileContent) == 0 { + return false, fmt.Errorf("%s found to be empty", path) + } + + cpuList := strings.TrimSpace(string(fileContent)) + for _, s := range strings.Split(cpuList, ",") { + splitted := strings.SplitN(s, "-", 3) + switch len(splitted) { + case 3: + return false, fmt.Errorf("invalid values in %s", path) + case 2: + min, err := strconv.ParseUint(splitted[0], 10, 16) + if err != nil { + return false, err + } + max, err := strconv.ParseUint(splitted[1], 10, 16) + if err != nil { + return false, err + } + if min > max { + return false, fmt.Errorf("invalid values in %s", path) + } + for i := min; i <= max; i++ { + if uint16(i) == cpuID { + return true, nil + } + } + case 1: + value, err := strconv.ParseUint(s, 10, 16) + if err != nil { + return false, err + } + if uint16(value) == cpuID { + return true, nil + } + } + } + + return false, nil +} + +// Looks for sysfs cpu path containing given CPU property, e.g. core_id or physical_package_id +// and returns number of unique values of given property, exemplary usage: getting number of CPU physical cores +func GetUniqueCPUPropertyCount(cpuBusPath string, propertyName string) int { + absCPUBusPath, err := filepath.Abs(cpuBusPath) + if err != nil { + klog.Errorf("Cannot make %s absolute", cpuBusPath) + return 0 + } + pathPattern := absCPUBusPath + "/cpu*[0-9]" + sysCPUPaths, err := filepath.Glob(pathPattern) + if err != nil { + klog.Errorf("Cannot find files matching pattern (pathPattern: %s), number of unique %s set to 0", pathPattern, propertyName) + return 0 + } + onlinePath, err := filepath.Abs(cpuBusPath + "/online") + if err != nil { + klog.V(1).Infof("Unable to get absolute path for %s", cpuBusPath+"/../online") + return 0 + } + + if err != nil { + klog.V(1).Infof("Unable to get online CPUs list: %s", err) + return 0 + } + uniques := make(map[string]bool) + for _, sysCPUPath := range sysCPUPaths { + cpuID, err := getCPUID(sysCPUPath) + if err != nil { + klog.V(1).Infof("Unable to get CPU ID from path %s: %s", sysCPUPath, err) + return 0 + } + isOnline, err := isCPUOnline(onlinePath, cpuID) + if err != nil && !os.IsNotExist(err) { + klog.V(1).Infof("Unable to determine CPU online state: %s", err) + continue + } + if !isOnline && !os.IsNotExist(err) { + continue + } + propertyPath := filepath.Join(sysCPUPath, sysFsCPUTopology, propertyName) + propertyVal, err := ioutil.ReadFile(propertyPath) + if err != nil { + klog.Warningf("Cannot open %s, assuming 0 for %s of CPU %d", propertyPath, propertyName, cpuID) + propertyVal = []byte("0") + } + packagePath := filepath.Join(sysCPUPath, sysFsCPUTopology, CPUPhysicalPackageID) + packageVal, err := ioutil.ReadFile(packagePath) + if err != nil { + klog.Warningf("Cannot open %s, assuming 0 %s of CPU %d", packagePath, CPUPhysicalPackageID, cpuID) + packageVal = []byte("0") + + } + uniques[fmt.Sprintf("%s_%s", bytes.TrimSpace(propertyVal), bytes.TrimSpace(packageVal))] = true + } + return len(uniques) } diff --git a/vendor/github.com/google/cadvisor/utils/sysfs/sysfs_notx86.go b/vendor/github.com/google/cadvisor/utils/sysfs/sysfs_notx86.go new file mode 100644 index 000000000000..86b8d02467e6 --- /dev/null +++ b/vendor/github.com/google/cadvisor/utils/sysfs/sysfs_notx86.go @@ -0,0 +1,19 @@ +// +build !x86 + +// Copyright 2021 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package sysfs + +var isX86 = false diff --git a/vendor/github.com/google/cadvisor/utils/sysfs/sysfs_x86.go b/vendor/github.com/google/cadvisor/utils/sysfs/sysfs_x86.go new file mode 100644 index 000000000000..fd6ff358f6fc --- /dev/null +++ b/vendor/github.com/google/cadvisor/utils/sysfs/sysfs_x86.go @@ -0,0 +1,19 @@ +// +build x86 + +// Copyright 2021 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package sysfs + +var isX86 = true diff --git a/vendor/github.com/google/cadvisor/utils/sysinfo/sysinfo.go b/vendor/github.com/google/cadvisor/utils/sysinfo/sysinfo.go index 9586492f5803..980af9cc1420 100644 --- a/vendor/github.com/google/cadvisor/utils/sysinfo/sysinfo.go +++ b/vendor/github.com/google/cadvisor/utils/sysinfo/sysinfo.go @@ -383,7 +383,7 @@ func getCoresInfo(sysFs sysfs.SysFs, cpuDirs []string) ([]info.Core, error) { for _, cpuDir := range cpuDirs { cpuID, err := getMatchedInt(cpuDirRegExp, cpuDir) if err != nil { - return nil, fmt.Errorf("Unexpected format of CPU directory, cpuDirRegExp %s, cpuDir: %s", cpuDirRegExp, cpuDir) + return nil, fmt.Errorf("unexpected format of CPU directory, cpuDirRegExp %s, cpuDir: %s", cpuDirRegExp, cpuDir) } if !sysFs.IsCPUOnline(cpuDir) { continue @@ -401,9 +401,22 @@ func getCoresInfo(sysFs sysfs.SysFs, cpuDirs []string) ([]info.Core, error) { return nil, err } + rawPhysicalPackageID, err := sysFs.GetCPUPhysicalPackageID(cpuDir) + if os.IsNotExist(err) { + klog.Warningf("Cannot read physical package id for %s, physical_package_id file does not exist, err: %s", cpuDir, err) + continue + } else if err != nil { + return nil, err + } + + physicalPackageID, err := strconv.Atoi(rawPhysicalPackageID) + if err != nil { + return nil, err + } + coreIDx := -1 for id, core := range cores { - if core.Id == physicalID { + if core.Id == physicalID && core.SocketID == physicalPackageID { coreIDx = id } } @@ -414,25 +427,14 @@ func getCoresInfo(sysFs sysfs.SysFs, cpuDirs []string) ([]info.Core, error) { desiredCore := &cores[coreIDx] desiredCore.Id = physicalID + desiredCore.SocketID = physicalPackageID + if len(desiredCore.Threads) == 0 { desiredCore.Threads = []int{cpuID} } else { desiredCore.Threads = append(desiredCore.Threads, cpuID) } - rawPhysicalPackageID, err := sysFs.GetCPUPhysicalPackageID(cpuDir) - if os.IsNotExist(err) { - klog.Warningf("Cannot read physical package id for %s, physical_package_id file does not exist, err: %s", cpuDir, err) - continue - } else if err != nil { - return nil, err - } - - physicalPackageID, err := strconv.Atoi(rawPhysicalPackageID) - if err != nil { - return nil, err - } - desiredCore.SocketID = physicalPackageID } return cores, nil } diff --git a/vendor/github.com/google/go-cmp/cmp/cmpopts/equate.go b/vendor/github.com/google/go-cmp/cmp/cmpopts/equate.go new file mode 100644 index 000000000000..51ce36fb60da --- /dev/null +++ b/vendor/github.com/google/go-cmp/cmp/cmpopts/equate.go @@ -0,0 +1,156 @@ +// Copyright 2017, The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package cmpopts provides common options for the cmp package. +package cmpopts + +import ( + "math" + "reflect" + "time" + + "github.com/google/go-cmp/cmp" + "golang.org/x/xerrors" +) + +func equateAlways(_, _ interface{}) bool { return true } + +// EquateEmpty returns a Comparer option that determines all maps and slices +// with a length of zero to be equal, regardless of whether they are nil. +// +// EquateEmpty can be used in conjunction with SortSlices and SortMaps. +func EquateEmpty() cmp.Option { + return cmp.FilterValues(isEmpty, cmp.Comparer(equateAlways)) +} + +func isEmpty(x, y interface{}) bool { + vx, vy := reflect.ValueOf(x), reflect.ValueOf(y) + return (x != nil && y != nil && vx.Type() == vy.Type()) && + (vx.Kind() == reflect.Slice || vx.Kind() == reflect.Map) && + (vx.Len() == 0 && vy.Len() == 0) +} + +// EquateApprox returns a Comparer option that determines float32 or float64 +// values to be equal if they are within a relative fraction or absolute margin. +// This option is not used when either x or y is NaN or infinite. +// +// The fraction determines that the difference of two values must be within the +// smaller fraction of the two values, while the margin determines that the two +// values must be within some absolute margin. +// To express only a fraction or only a margin, use 0 for the other parameter. +// The fraction and margin must be non-negative. +// +// The mathematical expression used is equivalent to: +// |x-y| ≤ max(fraction*min(|x|, |y|), margin) +// +// EquateApprox can be used in conjunction with EquateNaNs. +func EquateApprox(fraction, margin float64) cmp.Option { + if margin < 0 || fraction < 0 || math.IsNaN(margin) || math.IsNaN(fraction) { + panic("margin or fraction must be a non-negative number") + } + a := approximator{fraction, margin} + return cmp.Options{ + cmp.FilterValues(areRealF64s, cmp.Comparer(a.compareF64)), + cmp.FilterValues(areRealF32s, cmp.Comparer(a.compareF32)), + } +} + +type approximator struct{ frac, marg float64 } + +func areRealF64s(x, y float64) bool { + return !math.IsNaN(x) && !math.IsNaN(y) && !math.IsInf(x, 0) && !math.IsInf(y, 0) +} +func areRealF32s(x, y float32) bool { + return areRealF64s(float64(x), float64(y)) +} +func (a approximator) compareF64(x, y float64) bool { + relMarg := a.frac * math.Min(math.Abs(x), math.Abs(y)) + return math.Abs(x-y) <= math.Max(a.marg, relMarg) +} +func (a approximator) compareF32(x, y float32) bool { + return a.compareF64(float64(x), float64(y)) +} + +// EquateNaNs returns a Comparer option that determines float32 and float64 +// NaN values to be equal. +// +// EquateNaNs can be used in conjunction with EquateApprox. +func EquateNaNs() cmp.Option { + return cmp.Options{ + cmp.FilterValues(areNaNsF64s, cmp.Comparer(equateAlways)), + cmp.FilterValues(areNaNsF32s, cmp.Comparer(equateAlways)), + } +} + +func areNaNsF64s(x, y float64) bool { + return math.IsNaN(x) && math.IsNaN(y) +} +func areNaNsF32s(x, y float32) bool { + return areNaNsF64s(float64(x), float64(y)) +} + +// EquateApproxTime returns a Comparer option that determines two non-zero +// time.Time values to be equal if they are within some margin of one another. +// If both times have a monotonic clock reading, then the monotonic time +// difference will be used. The margin must be non-negative. +func EquateApproxTime(margin time.Duration) cmp.Option { + if margin < 0 { + panic("margin must be a non-negative number") + } + a := timeApproximator{margin} + return cmp.FilterValues(areNonZeroTimes, cmp.Comparer(a.compare)) +} + +func areNonZeroTimes(x, y time.Time) bool { + return !x.IsZero() && !y.IsZero() +} + +type timeApproximator struct { + margin time.Duration +} + +func (a timeApproximator) compare(x, y time.Time) bool { + // Avoid subtracting times to avoid overflow when the + // difference is larger than the largest representible duration. + if x.After(y) { + // Ensure x is always before y + x, y = y, x + } + // We're within the margin if x+margin >= y. + // Note: time.Time doesn't have AfterOrEqual method hence the negation. + return !x.Add(a.margin).Before(y) +} + +// AnyError is an error that matches any non-nil error. +var AnyError anyError + +type anyError struct{} + +func (anyError) Error() string { return "any error" } +func (anyError) Is(err error) bool { return err != nil } + +// EquateErrors returns a Comparer option that determines errors to be equal +// if errors.Is reports them to match. The AnyError error can be used to +// match any non-nil error. +func EquateErrors() cmp.Option { + return cmp.FilterValues(areConcreteErrors, cmp.Comparer(compareErrors)) +} + +// areConcreteErrors reports whether x and y are types that implement error. +// The input types are deliberately of the interface{} type rather than the +// error type so that we can handle situations where the current type is an +// interface{}, but the underlying concrete types both happen to implement +// the error interface. +func areConcreteErrors(x, y interface{}) bool { + _, ok1 := x.(error) + _, ok2 := y.(error) + return ok1 && ok2 +} + +func compareErrors(x, y interface{}) bool { + xe := x.(error) + ye := y.(error) + // TODO(≥go1.13): Use standard definition of errors.Is. + return xerrors.Is(xe, ye) || xerrors.Is(ye, xe) +} diff --git a/vendor/github.com/google/go-cmp/cmp/cmpopts/ignore.go b/vendor/github.com/google/go-cmp/cmp/cmpopts/ignore.go new file mode 100644 index 000000000000..80c60617e40f --- /dev/null +++ b/vendor/github.com/google/go-cmp/cmp/cmpopts/ignore.go @@ -0,0 +1,206 @@ +// Copyright 2017, The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package cmpopts + +import ( + "fmt" + "reflect" + "unicode" + "unicode/utf8" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/internal/function" +) + +// IgnoreFields returns an Option that ignores fields of the +// given names on a single struct type. It respects the names of exported fields +// that are forwarded due to struct embedding. +// The struct type is specified by passing in a value of that type. +// +// The name may be a dot-delimited string (e.g., "Foo.Bar") to ignore a +// specific sub-field that is embedded or nested within the parent struct. +func IgnoreFields(typ interface{}, names ...string) cmp.Option { + sf := newStructFilter(typ, names...) + return cmp.FilterPath(sf.filter, cmp.Ignore()) +} + +// IgnoreTypes returns an Option that ignores all values assignable to +// certain types, which are specified by passing in a value of each type. +func IgnoreTypes(typs ...interface{}) cmp.Option { + tf := newTypeFilter(typs...) + return cmp.FilterPath(tf.filter, cmp.Ignore()) +} + +type typeFilter []reflect.Type + +func newTypeFilter(typs ...interface{}) (tf typeFilter) { + for _, typ := range typs { + t := reflect.TypeOf(typ) + if t == nil { + // This occurs if someone tries to pass in sync.Locker(nil) + panic("cannot determine type; consider using IgnoreInterfaces") + } + tf = append(tf, t) + } + return tf +} +func (tf typeFilter) filter(p cmp.Path) bool { + if len(p) < 1 { + return false + } + t := p.Last().Type() + for _, ti := range tf { + if t.AssignableTo(ti) { + return true + } + } + return false +} + +// IgnoreInterfaces returns an Option that ignores all values or references of +// values assignable to certain interface types. These interfaces are specified +// by passing in an anonymous struct with the interface types embedded in it. +// For example, to ignore sync.Locker, pass in struct{sync.Locker}{}. +func IgnoreInterfaces(ifaces interface{}) cmp.Option { + tf := newIfaceFilter(ifaces) + return cmp.FilterPath(tf.filter, cmp.Ignore()) +} + +type ifaceFilter []reflect.Type + +func newIfaceFilter(ifaces interface{}) (tf ifaceFilter) { + t := reflect.TypeOf(ifaces) + if ifaces == nil || t.Name() != "" || t.Kind() != reflect.Struct { + panic("input must be an anonymous struct") + } + for i := 0; i < t.NumField(); i++ { + fi := t.Field(i) + switch { + case !fi.Anonymous: + panic("struct cannot have named fields") + case fi.Type.Kind() != reflect.Interface: + panic("embedded field must be an interface type") + case fi.Type.NumMethod() == 0: + // This matches everything; why would you ever want this? + panic("cannot ignore empty interface") + default: + tf = append(tf, fi.Type) + } + } + return tf +} +func (tf ifaceFilter) filter(p cmp.Path) bool { + if len(p) < 1 { + return false + } + t := p.Last().Type() + for _, ti := range tf { + if t.AssignableTo(ti) { + return true + } + if t.Kind() != reflect.Ptr && reflect.PtrTo(t).AssignableTo(ti) { + return true + } + } + return false +} + +// IgnoreUnexported returns an Option that only ignores the immediate unexported +// fields of a struct, including anonymous fields of unexported types. +// In particular, unexported fields within the struct's exported fields +// of struct types, including anonymous fields, will not be ignored unless the +// type of the field itself is also passed to IgnoreUnexported. +// +// Avoid ignoring unexported fields of a type which you do not control (i.e. a +// type from another repository), as changes to the implementation of such types +// may change how the comparison behaves. Prefer a custom Comparer instead. +func IgnoreUnexported(typs ...interface{}) cmp.Option { + ux := newUnexportedFilter(typs...) + return cmp.FilterPath(ux.filter, cmp.Ignore()) +} + +type unexportedFilter struct{ m map[reflect.Type]bool } + +func newUnexportedFilter(typs ...interface{}) unexportedFilter { + ux := unexportedFilter{m: make(map[reflect.Type]bool)} + for _, typ := range typs { + t := reflect.TypeOf(typ) + if t == nil || t.Kind() != reflect.Struct { + panic(fmt.Sprintf("%T must be a non-pointer struct", typ)) + } + ux.m[t] = true + } + return ux +} +func (xf unexportedFilter) filter(p cmp.Path) bool { + sf, ok := p.Index(-1).(cmp.StructField) + if !ok { + return false + } + return xf.m[p.Index(-2).Type()] && !isExported(sf.Name()) +} + +// isExported reports whether the identifier is exported. +func isExported(id string) bool { + r, _ := utf8.DecodeRuneInString(id) + return unicode.IsUpper(r) +} + +// IgnoreSliceElements returns an Option that ignores elements of []V. +// The discard function must be of the form "func(T) bool" which is used to +// ignore slice elements of type V, where V is assignable to T. +// Elements are ignored if the function reports true. +func IgnoreSliceElements(discardFunc interface{}) cmp.Option { + vf := reflect.ValueOf(discardFunc) + if !function.IsType(vf.Type(), function.ValuePredicate) || vf.IsNil() { + panic(fmt.Sprintf("invalid discard function: %T", discardFunc)) + } + return cmp.FilterPath(func(p cmp.Path) bool { + si, ok := p.Index(-1).(cmp.SliceIndex) + if !ok { + return false + } + if !si.Type().AssignableTo(vf.Type().In(0)) { + return false + } + vx, vy := si.Values() + if vx.IsValid() && vf.Call([]reflect.Value{vx})[0].Bool() { + return true + } + if vy.IsValid() && vf.Call([]reflect.Value{vy})[0].Bool() { + return true + } + return false + }, cmp.Ignore()) +} + +// IgnoreMapEntries returns an Option that ignores entries of map[K]V. +// The discard function must be of the form "func(T, R) bool" which is used to +// ignore map entries of type K and V, where K and V are assignable to T and R. +// Entries are ignored if the function reports true. +func IgnoreMapEntries(discardFunc interface{}) cmp.Option { + vf := reflect.ValueOf(discardFunc) + if !function.IsType(vf.Type(), function.KeyValuePredicate) || vf.IsNil() { + panic(fmt.Sprintf("invalid discard function: %T", discardFunc)) + } + return cmp.FilterPath(func(p cmp.Path) bool { + mi, ok := p.Index(-1).(cmp.MapIndex) + if !ok { + return false + } + if !mi.Key().Type().AssignableTo(vf.Type().In(0)) || !mi.Type().AssignableTo(vf.Type().In(1)) { + return false + } + k := mi.Key() + vx, vy := mi.Values() + if vx.IsValid() && vf.Call([]reflect.Value{k, vx})[0].Bool() { + return true + } + if vy.IsValid() && vf.Call([]reflect.Value{k, vy})[0].Bool() { + return true + } + return false + }, cmp.Ignore()) +} diff --git a/vendor/github.com/google/go-cmp/cmp/cmpopts/sort.go b/vendor/github.com/google/go-cmp/cmp/cmpopts/sort.go new file mode 100644 index 000000000000..a646d7475477 --- /dev/null +++ b/vendor/github.com/google/go-cmp/cmp/cmpopts/sort.go @@ -0,0 +1,147 @@ +// Copyright 2017, The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package cmpopts + +import ( + "fmt" + "reflect" + "sort" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/internal/function" +) + +// SortSlices returns a Transformer option that sorts all []V. +// The less function must be of the form "func(T, T) bool" which is used to +// sort any slice with element type V that is assignable to T. +// +// The less function must be: +// • Deterministic: less(x, y) == less(x, y) +// • Irreflexive: !less(x, x) +// • Transitive: if !less(x, y) and !less(y, z), then !less(x, z) +// +// The less function does not have to be "total". That is, if !less(x, y) and +// !less(y, x) for two elements x and y, their relative order is maintained. +// +// SortSlices can be used in conjunction with EquateEmpty. +func SortSlices(lessFunc interface{}) cmp.Option { + vf := reflect.ValueOf(lessFunc) + if !function.IsType(vf.Type(), function.Less) || vf.IsNil() { + panic(fmt.Sprintf("invalid less function: %T", lessFunc)) + } + ss := sliceSorter{vf.Type().In(0), vf} + return cmp.FilterValues(ss.filter, cmp.Transformer("cmpopts.SortSlices", ss.sort)) +} + +type sliceSorter struct { + in reflect.Type // T + fnc reflect.Value // func(T, T) bool +} + +func (ss sliceSorter) filter(x, y interface{}) bool { + vx, vy := reflect.ValueOf(x), reflect.ValueOf(y) + if !(x != nil && y != nil && vx.Type() == vy.Type()) || + !(vx.Kind() == reflect.Slice && vx.Type().Elem().AssignableTo(ss.in)) || + (vx.Len() <= 1 && vy.Len() <= 1) { + return false + } + // Check whether the slices are already sorted to avoid an infinite + // recursion cycle applying the same transform to itself. + ok1 := sort.SliceIsSorted(x, func(i, j int) bool { return ss.less(vx, i, j) }) + ok2 := sort.SliceIsSorted(y, func(i, j int) bool { return ss.less(vy, i, j) }) + return !ok1 || !ok2 +} +func (ss sliceSorter) sort(x interface{}) interface{} { + src := reflect.ValueOf(x) + dst := reflect.MakeSlice(src.Type(), src.Len(), src.Len()) + for i := 0; i < src.Len(); i++ { + dst.Index(i).Set(src.Index(i)) + } + sort.SliceStable(dst.Interface(), func(i, j int) bool { return ss.less(dst, i, j) }) + ss.checkSort(dst) + return dst.Interface() +} +func (ss sliceSorter) checkSort(v reflect.Value) { + start := -1 // Start of a sequence of equal elements. + for i := 1; i < v.Len(); i++ { + if ss.less(v, i-1, i) { + // Check that first and last elements in v[start:i] are equal. + if start >= 0 && (ss.less(v, start, i-1) || ss.less(v, i-1, start)) { + panic(fmt.Sprintf("incomparable values detected: want equal elements: %v", v.Slice(start, i))) + } + start = -1 + } else if start == -1 { + start = i + } + } +} +func (ss sliceSorter) less(v reflect.Value, i, j int) bool { + vx, vy := v.Index(i), v.Index(j) + return ss.fnc.Call([]reflect.Value{vx, vy})[0].Bool() +} + +// SortMaps returns a Transformer option that flattens map[K]V types to be a +// sorted []struct{K, V}. The less function must be of the form +// "func(T, T) bool" which is used to sort any map with key K that is +// assignable to T. +// +// Flattening the map into a slice has the property that cmp.Equal is able to +// use Comparers on K or the K.Equal method if it exists. +// +// The less function must be: +// • Deterministic: less(x, y) == less(x, y) +// • Irreflexive: !less(x, x) +// • Transitive: if !less(x, y) and !less(y, z), then !less(x, z) +// • Total: if x != y, then either less(x, y) or less(y, x) +// +// SortMaps can be used in conjunction with EquateEmpty. +func SortMaps(lessFunc interface{}) cmp.Option { + vf := reflect.ValueOf(lessFunc) + if !function.IsType(vf.Type(), function.Less) || vf.IsNil() { + panic(fmt.Sprintf("invalid less function: %T", lessFunc)) + } + ms := mapSorter{vf.Type().In(0), vf} + return cmp.FilterValues(ms.filter, cmp.Transformer("cmpopts.SortMaps", ms.sort)) +} + +type mapSorter struct { + in reflect.Type // T + fnc reflect.Value // func(T, T) bool +} + +func (ms mapSorter) filter(x, y interface{}) bool { + vx, vy := reflect.ValueOf(x), reflect.ValueOf(y) + return (x != nil && y != nil && vx.Type() == vy.Type()) && + (vx.Kind() == reflect.Map && vx.Type().Key().AssignableTo(ms.in)) && + (vx.Len() != 0 || vy.Len() != 0) +} +func (ms mapSorter) sort(x interface{}) interface{} { + src := reflect.ValueOf(x) + outType := reflect.StructOf([]reflect.StructField{ + {Name: "K", Type: src.Type().Key()}, + {Name: "V", Type: src.Type().Elem()}, + }) + dst := reflect.MakeSlice(reflect.SliceOf(outType), src.Len(), src.Len()) + for i, k := range src.MapKeys() { + v := reflect.New(outType).Elem() + v.Field(0).Set(k) + v.Field(1).Set(src.MapIndex(k)) + dst.Index(i).Set(v) + } + sort.Slice(dst.Interface(), func(i, j int) bool { return ms.less(dst, i, j) }) + ms.checkSort(dst) + return dst.Interface() +} +func (ms mapSorter) checkSort(v reflect.Value) { + for i := 1; i < v.Len(); i++ { + if !ms.less(v, i-1, i) { + panic(fmt.Sprintf("partial order detected: want %v < %v", v.Index(i-1), v.Index(i))) + } + } +} +func (ms mapSorter) less(v reflect.Value, i, j int) bool { + vx, vy := v.Index(i).Field(0), v.Index(j).Field(0) + return ms.fnc.Call([]reflect.Value{vx, vy})[0].Bool() +} diff --git a/vendor/github.com/google/go-cmp/cmp/cmpopts/struct_filter.go b/vendor/github.com/google/go-cmp/cmp/cmpopts/struct_filter.go new file mode 100644 index 000000000000..a09829c3af92 --- /dev/null +++ b/vendor/github.com/google/go-cmp/cmp/cmpopts/struct_filter.go @@ -0,0 +1,187 @@ +// Copyright 2017, The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package cmpopts + +import ( + "fmt" + "reflect" + "strings" + + "github.com/google/go-cmp/cmp" +) + +// filterField returns a new Option where opt is only evaluated on paths that +// include a specific exported field on a single struct type. +// The struct type is specified by passing in a value of that type. +// +// The name may be a dot-delimited string (e.g., "Foo.Bar") to select a +// specific sub-field that is embedded or nested within the parent struct. +func filterField(typ interface{}, name string, opt cmp.Option) cmp.Option { + // TODO: This is currently unexported over concerns of how helper filters + // can be composed together easily. + // TODO: Add tests for FilterField. + + sf := newStructFilter(typ, name) + return cmp.FilterPath(sf.filter, opt) +} + +type structFilter struct { + t reflect.Type // The root struct type to match on + ft fieldTree // Tree of fields to match on +} + +func newStructFilter(typ interface{}, names ...string) structFilter { + // TODO: Perhaps allow * as a special identifier to allow ignoring any + // number of path steps until the next field match? + // This could be useful when a concrete struct gets transformed into + // an anonymous struct where it is not possible to specify that by type, + // but the transformer happens to provide guarantees about the names of + // the transformed fields. + + t := reflect.TypeOf(typ) + if t == nil || t.Kind() != reflect.Struct { + panic(fmt.Sprintf("%T must be a non-pointer struct", typ)) + } + var ft fieldTree + for _, name := range names { + cname, err := canonicalName(t, name) + if err != nil { + panic(fmt.Sprintf("%s: %v", strings.Join(cname, "."), err)) + } + ft.insert(cname) + } + return structFilter{t, ft} +} + +func (sf structFilter) filter(p cmp.Path) bool { + for i, ps := range p { + if ps.Type().AssignableTo(sf.t) && sf.ft.matchPrefix(p[i+1:]) { + return true + } + } + return false +} + +// fieldTree represents a set of dot-separated identifiers. +// +// For example, inserting the following selectors: +// Foo +// Foo.Bar.Baz +// Foo.Buzz +// Nuka.Cola.Quantum +// +// Results in a tree of the form: +// {sub: { +// "Foo": {ok: true, sub: { +// "Bar": {sub: { +// "Baz": {ok: true}, +// }}, +// "Buzz": {ok: true}, +// }}, +// "Nuka": {sub: { +// "Cola": {sub: { +// "Quantum": {ok: true}, +// }}, +// }}, +// }} +type fieldTree struct { + ok bool // Whether this is a specified node + sub map[string]fieldTree // The sub-tree of fields under this node +} + +// insert inserts a sequence of field accesses into the tree. +func (ft *fieldTree) insert(cname []string) { + if ft.sub == nil { + ft.sub = make(map[string]fieldTree) + } + if len(cname) == 0 { + ft.ok = true + return + } + sub := ft.sub[cname[0]] + sub.insert(cname[1:]) + ft.sub[cname[0]] = sub +} + +// matchPrefix reports whether any selector in the fieldTree matches +// the start of path p. +func (ft fieldTree) matchPrefix(p cmp.Path) bool { + for _, ps := range p { + switch ps := ps.(type) { + case cmp.StructField: + ft = ft.sub[ps.Name()] + if ft.ok { + return true + } + if len(ft.sub) == 0 { + return false + } + case cmp.Indirect: + default: + return false + } + } + return false +} + +// canonicalName returns a list of identifiers where any struct field access +// through an embedded field is expanded to include the names of the embedded +// types themselves. +// +// For example, suppose field "Foo" is not directly in the parent struct, +// but actually from an embedded struct of type "Bar". Then, the canonical name +// of "Foo" is actually "Bar.Foo". +// +// Suppose field "Foo" is not directly in the parent struct, but actually +// a field in two different embedded structs of types "Bar" and "Baz". +// Then the selector "Foo" causes a panic since it is ambiguous which one it +// refers to. The user must specify either "Bar.Foo" or "Baz.Foo". +func canonicalName(t reflect.Type, sel string) ([]string, error) { + var name string + sel = strings.TrimPrefix(sel, ".") + if sel == "" { + return nil, fmt.Errorf("name must not be empty") + } + if i := strings.IndexByte(sel, '.'); i < 0 { + name, sel = sel, "" + } else { + name, sel = sel[:i], sel[i:] + } + + // Type must be a struct or pointer to struct. + if t.Kind() == reflect.Ptr { + t = t.Elem() + } + if t.Kind() != reflect.Struct { + return nil, fmt.Errorf("%v must be a struct", t) + } + + // Find the canonical name for this current field name. + // If the field exists in an embedded struct, then it will be expanded. + sf, _ := t.FieldByName(name) + if !isExported(name) { + // Avoid using reflect.Type.FieldByName for unexported fields due to + // buggy behavior with regard to embeddeding and unexported fields. + // See https://golang.org/issue/4876 for details. + sf = reflect.StructField{} + for i := 0; i < t.NumField() && sf.Name == ""; i++ { + if t.Field(i).Name == name { + sf = t.Field(i) + } + } + } + if sf.Name == "" { + return []string{name}, fmt.Errorf("does not exist") + } + var ss []string + for i := range sf.Index { + ss = append(ss, t.FieldByIndex(sf.Index[:i+1]).Name) + } + if sel == "" { + return ss, nil + } + ssPost, err := canonicalName(sf.Type, sel) + return append(ss, ssPost...), err +} diff --git a/vendor/github.com/google/go-cmp/cmp/cmpopts/xform.go b/vendor/github.com/google/go-cmp/cmp/cmpopts/xform.go new file mode 100644 index 000000000000..4eb49d63db31 --- /dev/null +++ b/vendor/github.com/google/go-cmp/cmp/cmpopts/xform.go @@ -0,0 +1,35 @@ +// Copyright 2018, The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package cmpopts + +import ( + "github.com/google/go-cmp/cmp" +) + +type xformFilter struct{ xform cmp.Option } + +func (xf xformFilter) filter(p cmp.Path) bool { + for _, ps := range p { + if t, ok := ps.(cmp.Transform); ok && t.Option() == xf.xform { + return false + } + } + return true +} + +// AcyclicTransformer returns a Transformer with a filter applied that ensures +// that the transformer cannot be recursively applied upon its own output. +// +// An example use case is a transformer that splits a string by lines: +// AcyclicTransformer("SplitLines", func(s string) []string{ +// return strings.Split(s, "\n") +// }) +// +// Had this been an unfiltered Transformer instead, this would result in an +// infinite cycle converting a string to []string to [][]string and so on. +func AcyclicTransformer(name string, xformFunc interface{}) cmp.Option { + xf := xformFilter{cmp.Transformer(name, xformFunc)} + return cmp.FilterPath(xf.filter, xf.xform) +} diff --git a/vendor/github.com/google/go-cmp/cmp/compare.go b/vendor/github.com/google/go-cmp/cmp/compare.go index 6656186846e3..86d0903b8b54 100644 --- a/vendor/github.com/google/go-cmp/cmp/compare.go +++ b/vendor/github.com/google/go-cmp/cmp/compare.go @@ -1,6 +1,6 @@ // Copyright 2017, The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. +// license that can be found in the LICENSE file. // Package cmp determines equality of values. // @@ -100,8 +100,8 @@ func Equal(x, y interface{}, opts ...Option) bool { // same input values and options. // // The output is displayed as a literal in pseudo-Go syntax. -// At the start of each line, a "-" prefix indicates an element removed from y, -// a "+" prefix to indicates an element added to y, and the lack of a prefix +// At the start of each line, a "-" prefix indicates an element removed from x, +// a "+" prefix to indicates an element added from y, and the lack of a prefix // indicates an element common to both x and y. If possible, the output // uses fmt.Stringer.String or error.Error methods to produce more humanly // readable outputs. In such cases, the string is prefixed with either an diff --git a/vendor/github.com/google/go-cmp/cmp/export_panic.go b/vendor/github.com/google/go-cmp/cmp/export_panic.go index dfa5d213769b..5ff0b4218c6d 100644 --- a/vendor/github.com/google/go-cmp/cmp/export_panic.go +++ b/vendor/github.com/google/go-cmp/cmp/export_panic.go @@ -1,6 +1,6 @@ // Copyright 2017, The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. +// license that can be found in the LICENSE file. // +build purego diff --git a/vendor/github.com/google/go-cmp/cmp/export_unsafe.go b/vendor/github.com/google/go-cmp/cmp/export_unsafe.go index 351f1a34b468..21eb54858e03 100644 --- a/vendor/github.com/google/go-cmp/cmp/export_unsafe.go +++ b/vendor/github.com/google/go-cmp/cmp/export_unsafe.go @@ -1,6 +1,6 @@ // Copyright 2017, The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. +// license that can be found in the LICENSE file. // +build !purego diff --git a/vendor/github.com/google/go-cmp/cmp/internal/diff/debug_disable.go b/vendor/github.com/google/go-cmp/cmp/internal/diff/debug_disable.go index fe98dcc67746..1daaaacc5ee6 100644 --- a/vendor/github.com/google/go-cmp/cmp/internal/diff/debug_disable.go +++ b/vendor/github.com/google/go-cmp/cmp/internal/diff/debug_disable.go @@ -1,6 +1,6 @@ // Copyright 2017, The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. +// license that can be found in the LICENSE file. // +build !cmp_debug diff --git a/vendor/github.com/google/go-cmp/cmp/internal/diff/debug_enable.go b/vendor/github.com/google/go-cmp/cmp/internal/diff/debug_enable.go index 597b6ae56b1b..4b91dbcacaef 100644 --- a/vendor/github.com/google/go-cmp/cmp/internal/diff/debug_enable.go +++ b/vendor/github.com/google/go-cmp/cmp/internal/diff/debug_enable.go @@ -1,6 +1,6 @@ // Copyright 2017, The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. +// license that can be found in the LICENSE file. // +build cmp_debug diff --git a/vendor/github.com/google/go-cmp/cmp/internal/diff/diff.go b/vendor/github.com/google/go-cmp/cmp/internal/diff/diff.go index 730e223ee7b8..bc196b16cfaa 100644 --- a/vendor/github.com/google/go-cmp/cmp/internal/diff/diff.go +++ b/vendor/github.com/google/go-cmp/cmp/internal/diff/diff.go @@ -1,6 +1,6 @@ // Copyright 2017, The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. +// license that can be found in the LICENSE file. // Package diff implements an algorithm for producing edit-scripts. // The edit-script is a sequence of operations needed to transform one list @@ -119,7 +119,7 @@ func (r Result) Similar() bool { return r.NumSame+1 >= r.NumDiff } -var randInt = rand.New(rand.NewSource(time.Now().Unix())).Intn(2) +var randBool = rand.New(rand.NewSource(time.Now().Unix())).Intn(2) == 0 // Difference reports whether two lists of lengths nx and ny are equal // given the definition of equality provided as f. @@ -168,17 +168,6 @@ func Difference(nx, ny int, f EqualFunc) (es EditScript) { // A vertical edge is equivalent to inserting a symbol from list Y. // A diagonal edge is equivalent to a matching symbol between both X and Y. - // To ensure flexibility in changing the algorithm in the future, - // introduce some degree of deliberate instability. - // This is achieved by fiddling the zigzag iterator to start searching - // the graph starting from the bottom-right versus than the top-left. - // The result may differ depending on the starting search location, - // but still produces a valid edit script. - zigzagInit := randInt // either 0 or 1 - if flags.Deterministic { - zigzagInit = 0 - } - // Invariants: // • 0 ≤ fwdPath.X ≤ (fwdFrontier.X, revFrontier.X) ≤ revPath.X ≤ nx // • 0 ≤ fwdPath.Y ≤ (fwdFrontier.Y, revFrontier.Y) ≤ revPath.Y ≤ ny @@ -197,6 +186,11 @@ func Difference(nx, ny int, f EqualFunc) (es EditScript) { // approximately the square-root of the search budget. searchBudget := 4 * (nx + ny) // O(n) + // Running the tests with the "cmp_debug" build tag prints a visualization + // of the algorithm running in real-time. This is educational for + // understanding how the algorithm works. See debug_enable.go. + f = debug.Begin(nx, ny, f, &fwdPath.es, &revPath.es) + // The algorithm below is a greedy, meet-in-the-middle algorithm for // computing sub-optimal edit-scripts between two lists. // @@ -214,22 +208,28 @@ func Difference(nx, ny int, f EqualFunc) (es EditScript) { // frontier towards the opposite corner. // • This algorithm terminates when either the X coordinates or the // Y coordinates of the forward and reverse frontier points ever intersect. - // + // This algorithm is correct even if searching only in the forward direction // or in the reverse direction. We do both because it is commonly observed // that two lists commonly differ because elements were added to the front // or end of the other list. // - // Running the tests with the "cmp_debug" build tag prints a visualization - // of the algorithm running in real-time. This is educational for - // understanding how the algorithm works. See debug_enable.go. - f = debug.Begin(nx, ny, f, &fwdPath.es, &revPath.es) - for { + // Non-deterministically start with either the forward or reverse direction + // to introduce some deliberate instability so that we have the flexibility + // to change this algorithm in the future. + if flags.Deterministic || randBool { + goto forwardSearch + } else { + goto reverseSearch + } + +forwardSearch: + { // Forward search from the beginning. if fwdFrontier.X >= revFrontier.X || fwdFrontier.Y >= revFrontier.Y || searchBudget == 0 { - break + goto finishSearch } - for stop1, stop2, i := false, false, zigzagInit; !(stop1 && stop2) && searchBudget > 0; i++ { + for stop1, stop2, i := false, false, 0; !(stop1 && stop2) && searchBudget > 0; i++ { // Search in a diagonal pattern for a match. z := zigzag(i) p := point{fwdFrontier.X + z, fwdFrontier.Y - z} @@ -262,10 +262,14 @@ func Difference(nx, ny int, f EqualFunc) (es EditScript) { } else { fwdFrontier.Y++ } + goto reverseSearch + } +reverseSearch: + { // Reverse search from the end. if fwdFrontier.X >= revFrontier.X || fwdFrontier.Y >= revFrontier.Y || searchBudget == 0 { - break + goto finishSearch } for stop1, stop2, i := false, false, 0; !(stop1 && stop2) && searchBudget > 0; i++ { // Search in a diagonal pattern for a match. @@ -300,8 +304,10 @@ func Difference(nx, ny int, f EqualFunc) (es EditScript) { } else { revFrontier.Y-- } + goto forwardSearch } +finishSearch: // Join the forward and reverse paths and then append the reverse path. fwdPath.connect(revPath.point, f) for i := len(revPath.es) - 1; i >= 0; i-- { diff --git a/vendor/github.com/google/go-cmp/cmp/internal/flags/flags.go b/vendor/github.com/google/go-cmp/cmp/internal/flags/flags.go index a9e7fc0b5b39..d8e459c9b937 100644 --- a/vendor/github.com/google/go-cmp/cmp/internal/flags/flags.go +++ b/vendor/github.com/google/go-cmp/cmp/internal/flags/flags.go @@ -1,6 +1,6 @@ // Copyright 2019, The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. +// license that can be found in the LICENSE file. package flags diff --git a/vendor/github.com/google/go-cmp/cmp/internal/flags/toolchain_legacy.go b/vendor/github.com/google/go-cmp/cmp/internal/flags/toolchain_legacy.go index 01aed0a1532b..82d1d7fbf8a2 100644 --- a/vendor/github.com/google/go-cmp/cmp/internal/flags/toolchain_legacy.go +++ b/vendor/github.com/google/go-cmp/cmp/internal/flags/toolchain_legacy.go @@ -1,6 +1,6 @@ // Copyright 2019, The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. +// license that can be found in the LICENSE file. // +build !go1.10 diff --git a/vendor/github.com/google/go-cmp/cmp/internal/flags/toolchain_recent.go b/vendor/github.com/google/go-cmp/cmp/internal/flags/toolchain_recent.go index c0b667f58b05..8646f0529343 100644 --- a/vendor/github.com/google/go-cmp/cmp/internal/flags/toolchain_recent.go +++ b/vendor/github.com/google/go-cmp/cmp/internal/flags/toolchain_recent.go @@ -1,6 +1,6 @@ // Copyright 2019, The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. +// license that can be found in the LICENSE file. // +build go1.10 diff --git a/vendor/github.com/google/go-cmp/cmp/internal/function/func.go b/vendor/github.com/google/go-cmp/cmp/internal/function/func.go index ace1dbe86e57..d127d436230d 100644 --- a/vendor/github.com/google/go-cmp/cmp/internal/function/func.go +++ b/vendor/github.com/google/go-cmp/cmp/internal/function/func.go @@ -1,6 +1,6 @@ // Copyright 2017, The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. +// license that can be found in the LICENSE file. // Package function provides functionality for identifying function types. package function diff --git a/vendor/github.com/google/go-cmp/cmp/internal/value/name.go b/vendor/github.com/google/go-cmp/cmp/internal/value/name.go index 8228e7d512a3..b6c12cefb47e 100644 --- a/vendor/github.com/google/go-cmp/cmp/internal/value/name.go +++ b/vendor/github.com/google/go-cmp/cmp/internal/value/name.go @@ -1,6 +1,6 @@ // Copyright 2020, The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. +// license that can be found in the LICENSE file. package value diff --git a/vendor/github.com/google/go-cmp/cmp/internal/value/pointer_purego.go b/vendor/github.com/google/go-cmp/cmp/internal/value/pointer_purego.go index e9e384a1c89d..44f4a5afddcb 100644 --- a/vendor/github.com/google/go-cmp/cmp/internal/value/pointer_purego.go +++ b/vendor/github.com/google/go-cmp/cmp/internal/value/pointer_purego.go @@ -1,6 +1,6 @@ // Copyright 2018, The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. +// license that can be found in the LICENSE file. // +build purego diff --git a/vendor/github.com/google/go-cmp/cmp/internal/value/pointer_unsafe.go b/vendor/github.com/google/go-cmp/cmp/internal/value/pointer_unsafe.go index b50c17ec725a..a605953d4666 100644 --- a/vendor/github.com/google/go-cmp/cmp/internal/value/pointer_unsafe.go +++ b/vendor/github.com/google/go-cmp/cmp/internal/value/pointer_unsafe.go @@ -1,6 +1,6 @@ // Copyright 2018, The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. +// license that can be found in the LICENSE file. // +build !purego diff --git a/vendor/github.com/google/go-cmp/cmp/internal/value/sort.go b/vendor/github.com/google/go-cmp/cmp/internal/value/sort.go index 24fbae6e3c57..98533b036ccf 100644 --- a/vendor/github.com/google/go-cmp/cmp/internal/value/sort.go +++ b/vendor/github.com/google/go-cmp/cmp/internal/value/sort.go @@ -1,6 +1,6 @@ // Copyright 2017, The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. +// license that can be found in the LICENSE file. package value diff --git a/vendor/github.com/google/go-cmp/cmp/internal/value/zero.go b/vendor/github.com/google/go-cmp/cmp/internal/value/zero.go index 06a8ffd036d5..9147a2997311 100644 --- a/vendor/github.com/google/go-cmp/cmp/internal/value/zero.go +++ b/vendor/github.com/google/go-cmp/cmp/internal/value/zero.go @@ -1,6 +1,6 @@ // Copyright 2017, The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. +// license that can be found in the LICENSE file. package value diff --git a/vendor/github.com/google/go-cmp/cmp/options.go b/vendor/github.com/google/go-cmp/cmp/options.go index 4b0407a7f887..e57b9eb5392d 100644 --- a/vendor/github.com/google/go-cmp/cmp/options.go +++ b/vendor/github.com/google/go-cmp/cmp/options.go @@ -1,6 +1,6 @@ // Copyright 2017, The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. +// license that can be found in the LICENSE file. package cmp diff --git a/vendor/github.com/google/go-cmp/cmp/path.go b/vendor/github.com/google/go-cmp/cmp/path.go index 603dbb0026e6..3d45c1a47f28 100644 --- a/vendor/github.com/google/go-cmp/cmp/path.go +++ b/vendor/github.com/google/go-cmp/cmp/path.go @@ -1,6 +1,6 @@ // Copyright 2017, The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. +// license that can be found in the LICENSE file. package cmp diff --git a/vendor/github.com/google/go-cmp/cmp/report.go b/vendor/github.com/google/go-cmp/cmp/report.go index aafcb3635451..f43cd12eb5f3 100644 --- a/vendor/github.com/google/go-cmp/cmp/report.go +++ b/vendor/github.com/google/go-cmp/cmp/report.go @@ -1,6 +1,6 @@ // Copyright 2017, The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. +// license that can be found in the LICENSE file. package cmp diff --git a/vendor/github.com/google/go-cmp/cmp/report_compare.go b/vendor/github.com/google/go-cmp/cmp/report_compare.go index 9e2180964f1b..a6c070cfcd9e 100644 --- a/vendor/github.com/google/go-cmp/cmp/report_compare.go +++ b/vendor/github.com/google/go-cmp/cmp/report_compare.go @@ -1,6 +1,6 @@ // Copyright 2019, The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. +// license that can be found in the LICENSE file. package cmp diff --git a/vendor/github.com/google/go-cmp/cmp/report_references.go b/vendor/github.com/google/go-cmp/cmp/report_references.go index d620c2c20e7f..be31b33a9e19 100644 --- a/vendor/github.com/google/go-cmp/cmp/report_references.go +++ b/vendor/github.com/google/go-cmp/cmp/report_references.go @@ -1,6 +1,6 @@ // Copyright 2020, The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. +// license that can be found in the LICENSE file. package cmp diff --git a/vendor/github.com/google/go-cmp/cmp/report_reflect.go b/vendor/github.com/google/go-cmp/cmp/report_reflect.go index 786f671269cf..33f03577f98f 100644 --- a/vendor/github.com/google/go-cmp/cmp/report_reflect.go +++ b/vendor/github.com/google/go-cmp/cmp/report_reflect.go @@ -1,6 +1,6 @@ // Copyright 2019, The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. +// license that can be found in the LICENSE file. package cmp @@ -351,6 +351,8 @@ func formatMapKey(v reflect.Value, disambiguate bool, ptrs *pointerReferences) s opts.PrintAddresses = disambiguate opts.AvoidStringer = disambiguate opts.QualifiedNames = disambiguate + opts.VerbosityLevel = maxVerbosityPreset + opts.LimitVerbosity = true s := opts.FormatValue(v, reflect.Map, ptrs).String() return strings.TrimSpace(s) } diff --git a/vendor/github.com/google/go-cmp/cmp/report_slices.go b/vendor/github.com/google/go-cmp/cmp/report_slices.go index 35315dad3552..da04caf16490 100644 --- a/vendor/github.com/google/go-cmp/cmp/report_slices.go +++ b/vendor/github.com/google/go-cmp/cmp/report_slices.go @@ -1,6 +1,6 @@ // Copyright 2019, The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. +// license that can be found in the LICENSE file. package cmp diff --git a/vendor/github.com/google/go-cmp/cmp/report_text.go b/vendor/github.com/google/go-cmp/cmp/report_text.go index 8b12c05cd4f3..0fd46d7ffb6e 100644 --- a/vendor/github.com/google/go-cmp/cmp/report_text.go +++ b/vendor/github.com/google/go-cmp/cmp/report_text.go @@ -1,6 +1,6 @@ // Copyright 2019, The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. +// license that can be found in the LICENSE file. package cmp diff --git a/vendor/github.com/google/go-cmp/cmp/report_value.go b/vendor/github.com/google/go-cmp/cmp/report_value.go index 83031a7f5070..668d470fd83f 100644 --- a/vendor/github.com/google/go-cmp/cmp/report_value.go +++ b/vendor/github.com/google/go-cmp/cmp/report_value.go @@ -1,6 +1,6 @@ // Copyright 2019, The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. +// license that can be found in the LICENSE file. package cmp diff --git a/vendor/github.com/google/shlex/COPYING b/vendor/github.com/google/shlex/COPYING new file mode 100644 index 000000000000..d64569567334 --- /dev/null +++ b/vendor/github.com/google/shlex/COPYING @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/google/shlex/README b/vendor/github.com/google/shlex/README new file mode 100644 index 000000000000..c86bcc066fdd --- /dev/null +++ b/vendor/github.com/google/shlex/README @@ -0,0 +1,2 @@ +go-shlex is a simple lexer for go that supports shell-style quoting, +commenting, and escaping. diff --git a/vendor/github.com/google/shlex/go.mod b/vendor/github.com/google/shlex/go.mod new file mode 100644 index 000000000000..0ab3bce7f12a --- /dev/null +++ b/vendor/github.com/google/shlex/go.mod @@ -0,0 +1,3 @@ +module github.com/google/shlex + +go 1.13 diff --git a/vendor/github.com/google/shlex/shlex.go b/vendor/github.com/google/shlex/shlex.go new file mode 100644 index 000000000000..d98308bce380 --- /dev/null +++ b/vendor/github.com/google/shlex/shlex.go @@ -0,0 +1,416 @@ +/* +Copyright 2012 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +/* +Package shlex implements a simple lexer which splits input in to tokens using +shell-style rules for quoting and commenting. + +The basic use case uses the default ASCII lexer to split a string into sub-strings: + + shlex.Split("one \"two three\" four") -> []string{"one", "two three", "four"} + +To process a stream of strings: + + l := NewLexer(os.Stdin) + for ; token, err := l.Next(); err != nil { + // process token + } + +To access the raw token stream (which includes tokens for comments): + + t := NewTokenizer(os.Stdin) + for ; token, err := t.Next(); err != nil { + // process token + } + +*/ +package shlex + +import ( + "bufio" + "fmt" + "io" + "strings" +) + +// TokenType is a top-level token classification: A word, space, comment, unknown. +type TokenType int + +// runeTokenClass is the type of a UTF-8 character classification: A quote, space, escape. +type runeTokenClass int + +// the internal state used by the lexer state machine +type lexerState int + +// Token is a (type, value) pair representing a lexographical token. +type Token struct { + tokenType TokenType + value string +} + +// Equal reports whether tokens a, and b, are equal. +// Two tokens are equal if both their types and values are equal. A nil token can +// never be equal to another token. +func (a *Token) Equal(b *Token) bool { + if a == nil || b == nil { + return false + } + if a.tokenType != b.tokenType { + return false + } + return a.value == b.value +} + +// Named classes of UTF-8 runes +const ( + spaceRunes = " \t\r\n" + escapingQuoteRunes = `"` + nonEscapingQuoteRunes = "'" + escapeRunes = `\` + commentRunes = "#" +) + +// Classes of rune token +const ( + unknownRuneClass runeTokenClass = iota + spaceRuneClass + escapingQuoteRuneClass + nonEscapingQuoteRuneClass + escapeRuneClass + commentRuneClass + eofRuneClass +) + +// Classes of lexographic token +const ( + UnknownToken TokenType = iota + WordToken + SpaceToken + CommentToken +) + +// Lexer state machine states +const ( + startState lexerState = iota // no runes have been seen + inWordState // processing regular runes in a word + escapingState // we have just consumed an escape rune; the next rune is literal + escapingQuotedState // we have just consumed an escape rune within a quoted string + quotingEscapingState // we are within a quoted string that supports escaping ("...") + quotingState // we are within a string that does not support escaping ('...') + commentState // we are within a comment (everything following an unquoted or unescaped # +) + +// tokenClassifier is used for classifying rune characters. +type tokenClassifier map[rune]runeTokenClass + +func (typeMap tokenClassifier) addRuneClass(runes string, tokenType runeTokenClass) { + for _, runeChar := range runes { + typeMap[runeChar] = tokenType + } +} + +// newDefaultClassifier creates a new classifier for ASCII characters. +func newDefaultClassifier() tokenClassifier { + t := tokenClassifier{} + t.addRuneClass(spaceRunes, spaceRuneClass) + t.addRuneClass(escapingQuoteRunes, escapingQuoteRuneClass) + t.addRuneClass(nonEscapingQuoteRunes, nonEscapingQuoteRuneClass) + t.addRuneClass(escapeRunes, escapeRuneClass) + t.addRuneClass(commentRunes, commentRuneClass) + return t +} + +// ClassifyRune classifiees a rune +func (t tokenClassifier) ClassifyRune(runeVal rune) runeTokenClass { + return t[runeVal] +} + +// Lexer turns an input stream into a sequence of tokens. Whitespace and comments are skipped. +type Lexer Tokenizer + +// NewLexer creates a new lexer from an input stream. +func NewLexer(r io.Reader) *Lexer { + + return (*Lexer)(NewTokenizer(r)) +} + +// Next returns the next word, or an error. If there are no more words, +// the error will be io.EOF. +func (l *Lexer) Next() (string, error) { + for { + token, err := (*Tokenizer)(l).Next() + if err != nil { + return "", err + } + switch token.tokenType { + case WordToken: + return token.value, nil + case CommentToken: + // skip comments + default: + return "", fmt.Errorf("Unknown token type: %v", token.tokenType) + } + } +} + +// Tokenizer turns an input stream into a sequence of typed tokens +type Tokenizer struct { + input bufio.Reader + classifier tokenClassifier +} + +// NewTokenizer creates a new tokenizer from an input stream. +func NewTokenizer(r io.Reader) *Tokenizer { + input := bufio.NewReader(r) + classifier := newDefaultClassifier() + return &Tokenizer{ + input: *input, + classifier: classifier} +} + +// scanStream scans the stream for the next token using the internal state machine. +// It will panic if it encounters a rune which it does not know how to handle. +func (t *Tokenizer) scanStream() (*Token, error) { + state := startState + var tokenType TokenType + var value []rune + var nextRune rune + var nextRuneType runeTokenClass + var err error + + for { + nextRune, _, err = t.input.ReadRune() + nextRuneType = t.classifier.ClassifyRune(nextRune) + + if err == io.EOF { + nextRuneType = eofRuneClass + err = nil + } else if err != nil { + return nil, err + } + + switch state { + case startState: // no runes read yet + { + switch nextRuneType { + case eofRuneClass: + { + return nil, io.EOF + } + case spaceRuneClass: + { + } + case escapingQuoteRuneClass: + { + tokenType = WordToken + state = quotingEscapingState + } + case nonEscapingQuoteRuneClass: + { + tokenType = WordToken + state = quotingState + } + case escapeRuneClass: + { + tokenType = WordToken + state = escapingState + } + case commentRuneClass: + { + tokenType = CommentToken + state = commentState + } + default: + { + tokenType = WordToken + value = append(value, nextRune) + state = inWordState + } + } + } + case inWordState: // in a regular word + { + switch nextRuneType { + case eofRuneClass: + { + token := &Token{ + tokenType: tokenType, + value: string(value)} + return token, err + } + case spaceRuneClass: + { + token := &Token{ + tokenType: tokenType, + value: string(value)} + return token, err + } + case escapingQuoteRuneClass: + { + state = quotingEscapingState + } + case nonEscapingQuoteRuneClass: + { + state = quotingState + } + case escapeRuneClass: + { + state = escapingState + } + default: + { + value = append(value, nextRune) + } + } + } + case escapingState: // the rune after an escape character + { + switch nextRuneType { + case eofRuneClass: + { + err = fmt.Errorf("EOF found after escape character") + token := &Token{ + tokenType: tokenType, + value: string(value)} + return token, err + } + default: + { + state = inWordState + value = append(value, nextRune) + } + } + } + case escapingQuotedState: // the next rune after an escape character, in double quotes + { + switch nextRuneType { + case eofRuneClass: + { + err = fmt.Errorf("EOF found after escape character") + token := &Token{ + tokenType: tokenType, + value: string(value)} + return token, err + } + default: + { + state = quotingEscapingState + value = append(value, nextRune) + } + } + } + case quotingEscapingState: // in escaping double quotes + { + switch nextRuneType { + case eofRuneClass: + { + err = fmt.Errorf("EOF found when expecting closing quote") + token := &Token{ + tokenType: tokenType, + value: string(value)} + return token, err + } + case escapingQuoteRuneClass: + { + state = inWordState + } + case escapeRuneClass: + { + state = escapingQuotedState + } + default: + { + value = append(value, nextRune) + } + } + } + case quotingState: // in non-escaping single quotes + { + switch nextRuneType { + case eofRuneClass: + { + err = fmt.Errorf("EOF found when expecting closing quote") + token := &Token{ + tokenType: tokenType, + value: string(value)} + return token, err + } + case nonEscapingQuoteRuneClass: + { + state = inWordState + } + default: + { + value = append(value, nextRune) + } + } + } + case commentState: // in a comment + { + switch nextRuneType { + case eofRuneClass: + { + token := &Token{ + tokenType: tokenType, + value: string(value)} + return token, err + } + case spaceRuneClass: + { + if nextRune == '\n' { + state = startState + token := &Token{ + tokenType: tokenType, + value: string(value)} + return token, err + } else { + value = append(value, nextRune) + } + } + default: + { + value = append(value, nextRune) + } + } + } + default: + { + return nil, fmt.Errorf("Unexpected state: %v", state) + } + } + } +} + +// Next returns the next token in the stream. +func (t *Tokenizer) Next() (*Token, error) { + return t.scanStream() +} + +// Split partitions a string into a slice of strings. +func Split(s string) ([]string, error) { + l := NewLexer(strings.NewReader(s)) + subStrings := make([]string, 0) + for { + word, err := l.Next() + if err != nil { + if err == io.EOF { + return subStrings, nil + } + return subStrings, err + } + subStrings = append(subStrings, word) + } +} diff --git a/vendor/github.com/heketi/heketi/client/api/go-client/block_volume.go b/vendor/github.com/heketi/heketi/client/api/go-client/block_volume.go index 1855e96599ef..bee4a2a0c62f 100644 --- a/vendor/github.com/heketi/heketi/client/api/go-client/block_volume.go +++ b/vendor/github.com/heketi/heketi/client/api/go-client/block_volume.go @@ -157,3 +157,56 @@ func (c *Client) BlockVolumeDelete(id string) error { return nil } + +func (c *Client) BlockVolumeExpand(id string, request *api.BlockVolumeExpandRequest) ( + *api.BlockVolumeInfoResponse, error) { + + // Marshal request to JSON + buffer, err := json.Marshal(request) + if err != nil { + return nil, err + } + + // Create a request + req, err := http.NewRequest("POST", + c.host+"/blockvolumes/"+id+"/expand", + bytes.NewBuffer(buffer)) + if err != nil { + return nil, err + } + req.Header.Set("Content-Type", "application/json") + + // Set token + err = c.setToken(req) + if err != nil { + return nil, err + } + + // Send request + r, err := c.do(req) + if err != nil { + return nil, err + } + defer r.Body.Close() + if r.StatusCode != http.StatusAccepted { + return nil, utils.GetErrorFromResponse(r) + } + + // Wait for response + r, err = c.pollResponse(r) + if err != nil { + return nil, err + } + if r.StatusCode != http.StatusOK { + return nil, utils.GetErrorFromResponse(r) + } + + // Read JSON response + var blockvolume api.BlockVolumeInfoResponse + err = utils.GetJsonFromResponse(r, &blockvolume) + if err != nil { + return nil, err + } + + return &blockvolume, nil +} diff --git a/vendor/github.com/heketi/heketi/client/api/go-client/brick.go b/vendor/github.com/heketi/heketi/client/api/go-client/brick.go new file mode 100644 index 000000000000..2bd81568de62 --- /dev/null +++ b/vendor/github.com/heketi/heketi/client/api/go-client/brick.go @@ -0,0 +1,72 @@ +// +// Copyright (c) 2019 The heketi Authors +// +// This file is licensed to you under your choice of the GNU Lesser +// General Public License, version 3 or any later version (LGPLv3 or +// later), as published by the Free Software Foundation, +// or under the Apache License, Version 2.0 . +// +// You may not use this file except in compliance with those terms. +// + +package client + +import ( + "bytes" + "encoding/json" + "io" + "net/http" + + "github.com/heketi/heketi/pkg/glusterfs/api" + "github.com/heketi/heketi/pkg/utils" +) + +// BrickEvict requests that Heketi evict the given brick from the +// underlying gluster volume, automatically replacing it with a new brick. +// +// NOTE: options is currently empty but reserved for future extensions +// to the api. +func (c *Client) BrickEvict(id string, request *api.BrickEvictOptions) error { + var buf io.Reader + if request != nil { + b, err := json.Marshal(request) + if err != nil { + return err + } + buf = bytes.NewBuffer(b) + } + + // Create a request + req, err := http.NewRequest("POST", c.host+"/bricks/to-evict/"+id, buf) + if err != nil { + return err + } + + // Set token + err = c.setToken(req) + if err != nil { + return err + } + + // Send request + r, err := c.do(req) + if err != nil { + return err + } + defer r.Body.Close() + if r.StatusCode != http.StatusAccepted { + return utils.GetErrorFromResponse(r) + } + + // Wait for response + r, err = c.pollResponse(r) + if err != nil { + return err + } + if r.StatusCode != http.StatusNoContent { + return utils.GetErrorFromResponse(r) + } + + return nil +} diff --git a/vendor/github.com/heketi/heketi/client/api/go-client/client.go b/vendor/github.com/heketi/heketi/client/api/go-client/client.go index c8fd50cb7936..e8a629138927 100644 --- a/vendor/github.com/heketi/heketi/client/api/go-client/client.go +++ b/vendor/github.com/heketi/heketi/client/api/go-client/client.go @@ -71,6 +71,9 @@ type Client struct { // allow plugging in custom do wrappers do func(*http.Request) (*http.Response, error) + + // allow plugging in custom http client fetcher + getClient ClientFunc } var defaultClientOptions = ClientOptions{ @@ -154,6 +157,10 @@ func (c *Client) SetTLSOptions(o *ClientTLSOptions) error { return nil } +func (c *Client) SetClientFunc(f ClientFunc) { + c.getClient = f +} + // Simple Hello test to check if the server is up func (c *Client) Hello() error { // Create request @@ -189,13 +196,14 @@ func (c *Client) doBasic(req *http.Request) (*http.Response, error) { <-c.throttle }() - httpClient := &http.Client{} - if c.tlsClientConfig != nil { - httpClient.Transport = &http.Transport{ - TLSClientConfig: c.tlsClientConfig, - } + getClient := c.getClient + if getClient == nil { + getClient = HeketiHttpClient + } + httpClient, err := getClient(c.tlsClientConfig, c.checkRedirect) + if err != nil { + return nil, err } - httpClient.CheckRedirect = c.checkRedirect return httpClient.Do(req) } @@ -355,3 +363,30 @@ func (c *ClientOptions) retryDelay(r *http.Response) time.Duration { s := rand.Intn(max-min) + min return time.Second * time.Duration(s) } + +// CheckRedirectFunc is an alias for the somewhat complex function signature +// of the CheckRedirect function of the http.Client. +type CheckRedirectFunc func(*http.Request, []*http.Request) error + +// ClientFunc is an alias for the function signature needed to create custom +// http clients. +type ClientFunc func(*tls.Config, CheckRedirectFunc) (HttpPerformer, error) + +// HttpPerformer is an interface that the heketi api client needs from the http +// client. +type HttpPerformer interface { + Do(req *http.Request) (*http.Response, error) +} + +// HeketiHttpClient constructs a new http client for use by the heketi +// api client, using the traditional heketi approach. +func HeketiHttpClient(tlsConfig *tls.Config, checkRedirect CheckRedirectFunc) (HttpPerformer, error) { + httpClient := &http.Client{} + if tlsConfig != nil { + httpClient.Transport = &http.Transport{ + TLSClientConfig: tlsConfig, + } + } + httpClient.CheckRedirect = checkRedirect + return httpClient, nil +} diff --git a/vendor/github.com/heketi/heketi/pkg/glusterfs/api/types.go b/vendor/github.com/heketi/heketi/pkg/glusterfs/api/types.go index a1bdf85f8218..8bbb90422e67 100644 --- a/vendor/github.com/heketi/heketi/pkg/glusterfs/api/types.go +++ b/vendor/github.com/heketi/heketi/pkg/glusterfs/api/types.go @@ -86,12 +86,35 @@ func ValidateDurabilityType(value interface{}) error { return nil } +type HealInfoCheck string + +const ( + HealCheckUnknown HealInfoCheck = "" + HealCheckEnable HealInfoCheck = "enable" + HealCheckDisable HealInfoCheck = "disable" +) + +func ValidateHealCheck(value interface{}) error { + h, _ := value.(HealInfoCheck) + err := validation.Validate(h, validation.In(HealCheckUnknown, HealCheckEnable, HealCheckDisable)) + if err != nil { + return fmt.Errorf("%v is not valid heal info check", h) + } + return nil +} + // Common type StateRequest struct { - State EntryState `json:"state"` + State EntryState `json:"state"` + HealCheck HealInfoCheck `json:"healcheck"` } func (statereq StateRequest) Validate() error { + if err := validation.ValidateStruct(&statereq, + validation.Field(&statereq.HealCheck, validation.By(ValidateHealCheck))); err != nil { + return err + } + return validation.ValidateStruct(&statereq, validation.Field(&statereq.State, validation.Required, validation.By(ValidateEntryState)), ) @@ -422,6 +445,7 @@ type BlockVolumeInfo struct { } `json:"blockvolume"` Cluster string `json:"cluster,omitempty"` BlockHostingVolume string `json:"blockhostingvolume,omitempty"` + UsableSize int `json:"usablesize,omitempty"` } type BlockVolumeInfoResponse struct { @@ -432,6 +456,16 @@ type BlockVolumeListResponse struct { BlockVolumes []string `json:"blockvolumes"` } +type BlockVolumeExpandRequest struct { + Size int `json:"new_size"` +} + +func (blockVolExpandReq BlockVolumeExpandRequest) Validate() error { + return validation.ValidateStruct(&blockVolExpandReq, + validation.Field(&blockVolExpandReq.Size, validation.Required, validation.Min(1)), + ) +} + type LogLevelInfo struct { // should contain one or more logger to log-level-name mapping LogLevel map[string]string `json:"loglevel"` @@ -554,6 +588,7 @@ func NewBlockVolumeInfoResponse() *BlockVolumeInfoResponse { func (v *BlockVolumeInfoResponse) String() string { s := fmt.Sprintf("Name: %v\n"+ "Size: %v\n"+ + "UsableSize: %v\n"+ "Volume Id: %v\n"+ "Cluster Id: %v\n"+ "Hosts: %v\n"+ @@ -565,6 +600,7 @@ func (v *BlockVolumeInfoResponse) String() string { "Block Hosting Volume: %v\n", v.Name, v.Size, + v.UsableSize, v.Id, v.Cluster, v.BlockVolume.Hosts, @@ -680,3 +716,13 @@ func ValidateIds(v interface{}) error { } return nil } + +// reserving a type for future options for brick evict +type BrickEvictOptions struct { + HealCheck HealInfoCheck `json:"healcheck"` +} + +func (brickops BrickEvictOptions) Validate() error { + return validation.ValidateStruct(&brickops, + validation.Field(&brickops.HealCheck, validation.By(ValidateHealCheck))) +} diff --git a/vendor/github.com/heketi/heketi/pkg/utils/bodystring.go b/vendor/github.com/heketi/heketi/pkg/utils/bodystring.go index 8a7b4aca1bc1..be8efeddd583 100644 --- a/vendor/github.com/heketi/heketi/pkg/utils/bodystring.go +++ b/vendor/github.com/heketi/heketi/pkg/utils/bodystring.go @@ -21,9 +21,22 @@ import ( "strings" ) +var ( + errMax = int64(4096) + strMax = int64(8192) +) + // Return the body from a response as a string func GetStringFromResponse(r *http.Response) (string, error) { - body, err := ioutil.ReadAll(io.LimitReader(r.Body, r.ContentLength)) + // If the content length is not set, limit reading to 8K worth of data. + return getResponse(r, strMax) +} + +func getResponse(r *http.Response, max int64) (string, error) { + if r.ContentLength >= 0 { + max = r.ContentLength + } + body, err := ioutil.ReadAll(io.LimitReader(r.Body, max)) defer r.Body.Close() if err != nil { return "", err @@ -33,7 +46,10 @@ func GetStringFromResponse(r *http.Response) (string, error) { // Return the body from a response as an error func GetErrorFromResponse(r *http.Response) error { - s, err := GetStringFromResponse(r) + // If the content length is not set, limit reading to 4K worth of data. + // It is probably way more than needed because an error that long is + // very unusual. Plus it will only cut it off rather than show nothing. + s, err := getResponse(r, errMax) if err != nil { return err } diff --git a/vendor/github.com/konsorten/go-windows-terminal-sequences/LICENSE b/vendor/github.com/konsorten/go-windows-terminal-sequences/LICENSE deleted file mode 100644 index 14127cd831ec..000000000000 --- a/vendor/github.com/konsorten/go-windows-terminal-sequences/LICENSE +++ /dev/null @@ -1,9 +0,0 @@ -(The MIT License) - -Copyright (c) 2017 marvin + konsorten GmbH (open-source@konsorten.de) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/konsorten/go-windows-terminal-sequences/README.md b/vendor/github.com/konsorten/go-windows-terminal-sequences/README.md deleted file mode 100644 index 09a4a35c9bb7..000000000000 --- a/vendor/github.com/konsorten/go-windows-terminal-sequences/README.md +++ /dev/null @@ -1,42 +0,0 @@ -# Windows Terminal Sequences - -This library allow for enabling Windows terminal color support for Go. - -See [Console Virtual Terminal Sequences](https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences) for details. - -## Usage - -```go -import ( - "syscall" - - sequences "github.com/konsorten/go-windows-terminal-sequences" -) - -func main() { - sequences.EnableVirtualTerminalProcessing(syscall.Stdout, true) -} - -``` - -## Authors - -The tool is sponsored by the [marvin + konsorten GmbH](http://www.konsorten.de). - -We thank all the authors who provided code to this library: - -* Felix Kollmann -* Nicolas Perraut -* @dirty49374 - -## License - -(The MIT License) - -Copyright (c) 2018 marvin + konsorten GmbH (open-source@konsorten.de) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/konsorten/go-windows-terminal-sequences/go.mod b/vendor/github.com/konsorten/go-windows-terminal-sequences/go.mod deleted file mode 100644 index 716c6131256f..000000000000 --- a/vendor/github.com/konsorten/go-windows-terminal-sequences/go.mod +++ /dev/null @@ -1 +0,0 @@ -module github.com/konsorten/go-windows-terminal-sequences diff --git a/vendor/github.com/konsorten/go-windows-terminal-sequences/sequences.go b/vendor/github.com/konsorten/go-windows-terminal-sequences/sequences.go deleted file mode 100644 index 57f530ae83f6..000000000000 --- a/vendor/github.com/konsorten/go-windows-terminal-sequences/sequences.go +++ /dev/null @@ -1,35 +0,0 @@ -// +build windows - -package sequences - -import ( - "syscall" -) - -var ( - kernel32Dll *syscall.LazyDLL = syscall.NewLazyDLL("Kernel32.dll") - setConsoleMode *syscall.LazyProc = kernel32Dll.NewProc("SetConsoleMode") -) - -func EnableVirtualTerminalProcessing(stream syscall.Handle, enable bool) error { - const ENABLE_VIRTUAL_TERMINAL_PROCESSING uint32 = 0x4 - - var mode uint32 - err := syscall.GetConsoleMode(syscall.Stdout, &mode) - if err != nil { - return err - } - - if enable { - mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING - } else { - mode &^= ENABLE_VIRTUAL_TERMINAL_PROCESSING - } - - ret, _, err := setConsoleMode.Call(uintptr(stream), uintptr(mode)) - if ret == 0 { - return err - } - - return nil -} diff --git a/vendor/github.com/konsorten/go-windows-terminal-sequences/sequences_dummy.go b/vendor/github.com/konsorten/go-windows-terminal-sequences/sequences_dummy.go deleted file mode 100644 index df61a6f2f6fe..000000000000 --- a/vendor/github.com/konsorten/go-windows-terminal-sequences/sequences_dummy.go +++ /dev/null @@ -1,11 +0,0 @@ -// +build linux darwin - -package sequences - -import ( - "fmt" -) - -func EnableVirtualTerminalProcessing(stream uintptr, enable bool) error { - return fmt.Errorf("windows only package") -} diff --git a/vendor/github.com/miekg/dns/.travis.yml b/vendor/github.com/miekg/dns/.travis.yml index 18259374e513..7d9b17275664 100644 --- a/vendor/github.com/miekg/dns/.travis.yml +++ b/vendor/github.com/miekg/dns/.travis.yml @@ -2,16 +2,15 @@ language: go sudo: false go: - - 1.10.x - - 1.11.x + - 1.14.x + - 1.15.x - tip -before_install: - # don't use the miekg/dns when testing forks - - mkdir -p $GOPATH/src/github.com/miekg - - ln -s $TRAVIS_BUILD_DIR $GOPATH/src/github.com/miekg/ || true +env: + - GO111MODULE=on script: + - go generate ./... && test `git ls-files --modified | wc -l` = 0 - go test -race -v -bench=. -coverprofile=coverage.txt -covermode=atomic ./... after_success: diff --git a/vendor/github.com/miekg/dns/CODEOWNERS b/vendor/github.com/miekg/dns/CODEOWNERS new file mode 100644 index 000000000000..e0917031bc18 --- /dev/null +++ b/vendor/github.com/miekg/dns/CODEOWNERS @@ -0,0 +1 @@ +* @miekg @tmthrgd diff --git a/vendor/github.com/miekg/dns/Gopkg.lock b/vendor/github.com/miekg/dns/Gopkg.lock deleted file mode 100644 index 686632207a12..000000000000 --- a/vendor/github.com/miekg/dns/Gopkg.lock +++ /dev/null @@ -1,57 +0,0 @@ -# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. - - -[[projects]] - branch = "master" - digest = "1:6914c49eed986dfb8dffb33516fa129c49929d4d873f41e073c83c11c372b870" - name = "golang.org/x/crypto" - packages = [ - "ed25519", - "ed25519/internal/edwards25519", - ] - pruneopts = "" - revision = "e3636079e1a4c1f337f212cc5cd2aca108f6c900" - -[[projects]] - branch = "master" - digest = "1:08e41d63f8dac84d83797368b56cf0b339e42d0224e5e56668963c28aec95685" - name = "golang.org/x/net" - packages = [ - "bpf", - "context", - "internal/iana", - "internal/socket", - "ipv4", - "ipv6", - ] - pruneopts = "" - revision = "4dfa2610cdf3b287375bbba5b8f2a14d3b01d8de" - -[[projects]] - branch = "master" - digest = "1:b2ea75de0ccb2db2ac79356407f8a4cd8f798fe15d41b381c00abf3ae8e55ed1" - name = "golang.org/x/sync" - packages = ["errgroup"] - pruneopts = "" - revision = "1d60e4601c6fd243af51cc01ddf169918a5407ca" - -[[projects]] - branch = "master" - digest = "1:149a432fabebb8221a80f77731b1cd63597197ded4f14af606ebe3a0959004ec" - name = "golang.org/x/sys" - packages = ["unix"] - pruneopts = "" - revision = "e4b3c5e9061176387e7cea65e4dc5853801f3fb7" - -[solve-meta] - analyzer-name = "dep" - analyzer-version = 1 - input-imports = [ - "golang.org/x/crypto/ed25519", - "golang.org/x/net/ipv4", - "golang.org/x/net/ipv6", - "golang.org/x/sync/errgroup", - "golang.org/x/sys/unix", - ] - solver-name = "gps-cdcl" - solver-version = 1 diff --git a/vendor/github.com/miekg/dns/Gopkg.toml b/vendor/github.com/miekg/dns/Gopkg.toml deleted file mode 100644 index 85e6ff31b222..000000000000 --- a/vendor/github.com/miekg/dns/Gopkg.toml +++ /dev/null @@ -1,38 +0,0 @@ - -# Gopkg.toml example -# -# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md -# for detailed Gopkg.toml documentation. -# -# required = ["github.com/user/thing/cmd/thing"] -# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"] -# -# [[constraint]] -# name = "github.com/user/project" -# version = "1.0.0" -# -# [[constraint]] -# name = "github.com/user/project2" -# branch = "dev" -# source = "github.com/myfork/project2" -# -# [[override]] -# name = "github.com/x/y" -# version = "2.4.0" - - -[[constraint]] - branch = "master" - name = "golang.org/x/crypto" - -[[constraint]] - branch = "master" - name = "golang.org/x/net" - -[[constraint]] - branch = "master" - name = "golang.org/x/sys" - -[[constraint]] - branch = "master" - name = "golang.org/x/sync" diff --git a/vendor/github.com/miekg/dns/LICENSE b/vendor/github.com/miekg/dns/LICENSE index 5763fa7fe5d9..55f12ab7772a 100644 --- a/vendor/github.com/miekg/dns/LICENSE +++ b/vendor/github.com/miekg/dns/LICENSE @@ -1,7 +1,3 @@ -Extensions of the original work are copyright (c) 2011 Miek Gieben - -As this is fork of the official Go code the same license applies: - Copyright (c) 2009 The Go Authors. All rights reserved. Redistribution and use in source and binary forms, with or without @@ -30,3 +26,5 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +As this is fork of the official Go code the same license applies. +Extensions of the original work are copyright (c) 2011 Miek Gieben diff --git a/vendor/github.com/miekg/dns/README.md b/vendor/github.com/miekg/dns/README.md index 39737c78aa5b..fc8394e2697a 100644 --- a/vendor/github.com/miekg/dns/README.md +++ b/vendor/github.com/miekg/dns/README.md @@ -26,8 +26,8 @@ avoiding breaking changes wherever reasonable. We support the last two versions A not-so-up-to-date-list-that-may-be-actually-current: * https://github.com/coredns/coredns -* https://cloudflare.com * https://github.com/abh/geodns +* https://github.com/baidu/bfe * http://www.statdns.com/ * http://www.dnsinspect.com/ * https://github.com/chuangbo/jianbing-dictionary-dns @@ -41,11 +41,9 @@ A not-so-up-to-date-list-that-may-be-actually-current: * https://github.com/StalkR/dns-reverse-proxy * https://github.com/tianon/rawdns * https://mesosphere.github.io/mesos-dns/ -* https://pulse.turbobytes.com/ * https://github.com/fcambus/statzone * https://github.com/benschw/dns-clb-go * https://github.com/corny/dnscheck for -* https://namesmith.io * https://github.com/miekg/unbound * https://github.com/miekg/exdns * https://dnslookup.org @@ -54,20 +52,23 @@ A not-so-up-to-date-list-that-may-be-actually-current: * https://github.com/mehrdadrad/mylg * https://github.com/bamarni/dockness * https://github.com/fffaraz/microdns -* http://kelda.io * https://github.com/ipdcode/hades * https://github.com/StackExchange/dnscontrol/ * https://www.dnsperf.com/ * https://dnssectest.net/ -* https://dns.apebits.com * https://github.com/oif/apex * https://github.com/jedisct1/dnscrypt-proxy * https://github.com/jedisct1/rpdns * https://github.com/xor-gate/sshfp * https://github.com/rs/dnstrace * https://blitiri.com.ar/p/dnss ([github mirror](https://github.com/albertito/dnss)) -* https://github.com/semihalev/sdns * https://render.com +* https://github.com/peterzen/goresolver +* https://github.com/folbricht/routedns +* https://domainr.com/ +* https://zonedb.org/ +* https://router7.org/ +* https://github.com/fortio/dnsping Send pull request if you want to be listed here. @@ -92,8 +93,8 @@ DNS Authors 2012- # Building -Building is done with the `go` tool. If you have setup your GOPATH correctly, the following should -work: +This library uses Go modules and uses semantic versioning. Building is done with the `go` tool, so +the following should work: go get github.com/miekg/dns go build github.com/miekg/dns @@ -125,6 +126,7 @@ Example programs can be found in the `github.com/miekg/exdns` repository. * 2915 - NAPTR record * 2929 - DNS IANA Considerations * 3110 - RSASHA1 DNS keys +* 3123 - APL record * 3225 - DO bit (DNSSEC OK) * 340{1,2,3} - NAPTR record * 3445 - Limiting the scope of (DNS)KEY @@ -151,6 +153,7 @@ Example programs can be found in the `github.com/miekg/exdns` repository. * 6844 - CAA record * 6891 - EDNS0 update * 6895 - DNS IANA considerations +* 6944 - DNSSEC DNSKEY Algorithm Status * 6975 - Algorithm Understanding in DNSSEC * 7043 - EUI48/EUI64 records * 7314 - DNS (EDNS) EXPIRE Option diff --git a/vendor/github.com/miekg/dns/acceptfunc.go b/vendor/github.com/miekg/dns/acceptfunc.go index 78c076c2535c..825617fe215b 100644 --- a/vendor/github.com/miekg/dns/acceptfunc.go +++ b/vendor/github.com/miekg/dns/acceptfunc.go @@ -6,22 +6,30 @@ type MsgAcceptFunc func(dh Header) MsgAcceptAction // DefaultMsgAcceptFunc checks the request and will reject if: // -// * isn't a request (don't respond in that case). +// * isn't a request (don't respond in that case) +// // * opcode isn't OpcodeQuery or OpcodeNotify +// // * Zero bit isn't zero +// // * has more than 1 question in the question section +// // * has more than 1 RR in the Answer section +// // * has more than 0 RRs in the Authority section +// // * has more than 2 RRs in the Additional section +// var DefaultMsgAcceptFunc MsgAcceptFunc = defaultMsgAcceptFunc // MsgAcceptAction represents the action to be taken. type MsgAcceptAction int const ( - MsgAccept MsgAcceptAction = iota // Accept the message - MsgReject // Reject the message with a RcodeFormatError - MsgIgnore // Ignore the error and send nothing back. + MsgAccept MsgAcceptAction = iota // Accept the message + MsgReject // Reject the message with a RcodeFormatError + MsgIgnore // Ignore the error and send nothing back. + MsgRejectNotImplemented // Reject the message with a RcodeNotImplemented ) func defaultMsgAcceptFunc(dh Header) MsgAcceptAction { @@ -32,12 +40,9 @@ func defaultMsgAcceptFunc(dh Header) MsgAcceptAction { // Don't allow dynamic updates, because then the sections can contain a whole bunch of RRs. opcode := int(dh.Bits>>11) & 0xF if opcode != OpcodeQuery && opcode != OpcodeNotify { - return MsgReject + return MsgRejectNotImplemented } - if isZero := dh.Bits&_Z != 0; isZero { - return MsgReject - } if dh.Qdcount != 1 { return MsgReject } diff --git a/vendor/github.com/miekg/dns/client.go b/vendor/github.com/miekg/dns/client.go index 2393564c5233..e7ff786a237f 100644 --- a/vendor/github.com/miekg/dns/client.go +++ b/vendor/github.com/miekg/dns/client.go @@ -3,10 +3,10 @@ package dns // A client implementation. import ( - "bytes" "context" "crypto/tls" "encoding/binary" + "fmt" "io" "net" "strings" @@ -34,7 +34,7 @@ type Client struct { Dialer *net.Dialer // a net.Dialer used to set local address, timeouts and more // Timeout is a cumulative timeout for dial, write and read, defaults to 0 (disabled) - overrides DialTimeout, ReadTimeout, // WriteTimeout when non-zero. Can be overridden with net.Dialer.Timeout (see Client.ExchangeWithDialer and - // Client.Dialer) or context.Context.Deadline (see the deprecated ExchangeContext) + // Client.Dialer) or context.Context.Deadline (see ExchangeContext) Timeout time.Duration DialTimeout time.Duration // net.DialTimeout, defaults to 2 seconds, or net.Dialer.Timeout if expiring earlier - overridden by Timeout when that value is non-zero ReadTimeout time.Duration // net.Conn.SetReadTimeout value for connections, defaults to 2 seconds - overridden by Timeout when that value is non-zero @@ -106,7 +106,7 @@ func (c *Client) Dial(address string) (conn *Conn, err error) { if err != nil { return nil, err } - + conn.UDPSize = c.UDPSize return conn, nil } @@ -124,37 +124,47 @@ func (c *Client) Dial(address string) (conn *Conn, err error) { // of 512 bytes // To specify a local address or a timeout, the caller has to set the `Client.Dialer` // attribute appropriately + func (c *Client) Exchange(m *Msg, address string) (r *Msg, rtt time.Duration, err error) { - if !c.SingleInflight { - return c.exchange(m, address) - } + co, err := c.Dial(address) - t := "nop" - if t1, ok := TypeToString[m.Question[0].Qtype]; ok { - t = t1 + if err != nil { + return nil, 0, err } - cl := "nop" - if cl1, ok := ClassToString[m.Question[0].Qclass]; ok { - cl = cl1 + defer co.Close() + return c.ExchangeWithConn(m, co) +} + +// ExchangeWithConn has the same behavior as Exchange, just with a predetermined connection +// that will be used instead of creating a new one. +// Usage pattern with a *dns.Client: +// c := new(dns.Client) +// // connection management logic goes here +// +// conn := c.Dial(address) +// in, rtt, err := c.ExchangeWithConn(message, conn) +// +// This allows users of the library to implement their own connection management, +// as opposed to Exchange, which will always use new connections and incur the added overhead +// that entails when using "tcp" and especially "tcp-tls" clients. +func (c *Client) ExchangeWithConn(m *Msg, conn *Conn) (r *Msg, rtt time.Duration, err error) { + if !c.SingleInflight { + return c.exchange(m, conn) } - r, rtt, err, shared := c.group.Do(m.Question[0].Name+t+cl, func() (*Msg, time.Duration, error) { - return c.exchange(m, address) + + q := m.Question[0] + key := fmt.Sprintf("%s:%d:%d", q.Name, q.Qtype, q.Qclass) + r, rtt, err, shared := c.group.Do(key, func() (*Msg, time.Duration, error) { + return c.exchange(m, conn) }) if r != nil && shared { r = r.Copy() } + return r, rtt, err } -func (c *Client) exchange(m *Msg, a string) (r *Msg, rtt time.Duration, err error) { - var co *Conn - - co, err = c.Dial(a) - - if err != nil { - return nil, 0, err - } - defer co.Close() +func (c *Client) exchange(m *Msg, co *Conn) (r *Msg, rtt time.Duration, err error) { opt := m.IsEdns0() // If EDNS0 is used use that for size. @@ -175,9 +185,20 @@ func (c *Client) exchange(m *Msg, a string) (r *Msg, rtt time.Duration, err erro } co.SetReadDeadline(time.Now().Add(c.getTimeoutForRequest(c.readTimeout()))) - r, err = co.ReadMsg() - if err == nil && r.Id != m.Id { - err = ErrId + if _, ok := co.Conn.(net.PacketConn); ok { + for { + r, err = co.ReadMsg() + // Ignore replies with mismatched IDs because they might be + // responses to earlier queries that timed out. + if err != nil || r.Id == m.Id { + break + } + } + } else { + r, err = co.ReadMsg() + if err == nil && r.Id != m.Id { + err = ErrId + } } rtt = time.Since(t) return r, rtt, err @@ -221,24 +242,21 @@ func (co *Conn) ReadMsgHeader(hdr *Header) ([]byte, error) { err error ) - switch t := co.Conn.(type) { - case *net.TCPConn, *tls.Conn: - r := t.(io.Reader) - - // First two bytes specify the length of the entire message. - l, err := tcpMsgLen(r) - if err != nil { - return nil, err - } - p = make([]byte, l) - n, err = tcpRead(r, p) - default: + if _, ok := co.Conn.(net.PacketConn); ok { if co.UDPSize > MinMsgSize { p = make([]byte, co.UDPSize) } else { p = make([]byte, MinMsgSize) } n, err = co.Read(p) + } else { + var length uint16 + if err := binary.Read(co.Conn, binary.BigEndian, &length); err != nil { + return nil, err + } + + p = make([]byte, length) + n, err = io.ReadFull(co.Conn, p) } if err != nil { @@ -258,74 +276,26 @@ func (co *Conn) ReadMsgHeader(hdr *Header) ([]byte, error) { return p, err } -// tcpMsgLen is a helper func to read first two bytes of stream as uint16 packet length. -func tcpMsgLen(t io.Reader) (int, error) { - p := []byte{0, 0} - n, err := t.Read(p) - if err != nil { - return 0, err - } - - // As seen with my local router/switch, returns 1 byte on the above read, - // resulting a a ShortRead. Just write it out (instead of loop) and read the - // other byte. - if n == 1 { - n1, err := t.Read(p[1:]) - if err != nil { - return 0, err - } - n += n1 - } - - if n != 2 { - return 0, ErrShortRead - } - l := binary.BigEndian.Uint16(p) - if l == 0 { - return 0, ErrShortRead - } - return int(l), nil -} - -// tcpRead calls TCPConn.Read enough times to fill allocated buffer. -func tcpRead(t io.Reader, p []byte) (int, error) { - n, err := t.Read(p) - if err != nil { - return n, err - } - for n < len(p) { - j, err := t.Read(p[n:]) - if err != nil { - return n, err - } - n += j - } - return n, err -} - // Read implements the net.Conn read method. func (co *Conn) Read(p []byte) (n int, err error) { if co.Conn == nil { return 0, ErrConnEmpty } - if len(p) < 2 { - return 0, io.ErrShortBuffer + + if _, ok := co.Conn.(net.PacketConn); ok { + // UDP connection + return co.Conn.Read(p) } - switch t := co.Conn.(type) { - case *net.TCPConn, *tls.Conn: - r := t.(io.Reader) - l, err := tcpMsgLen(r) - if err != nil { - return 0, err - } - if l > len(p) { - return l, io.ErrShortBuffer - } - return tcpRead(r, p[:l]) + var length uint16 + if err := binary.Read(co.Conn, binary.BigEndian, &length); err != nil { + return 0, err } - // UDP connection - return co.Conn.Read(p) + if int(length) > len(p) { + return 0, io.ErrShortBuffer + } + + return io.ReadFull(co.Conn, p[:length]) } // WriteMsg sends a message through the connection co. @@ -352,25 +322,20 @@ func (co *Conn) WriteMsg(m *Msg) (err error) { } // Write implements the net.Conn Write method. -func (co *Conn) Write(p []byte) (n int, err error) { - switch t := co.Conn.(type) { - case *net.TCPConn, *tls.Conn: - w := t.(io.Writer) - - lp := len(p) - if lp < 2 { - return 0, io.ErrShortBuffer - } - if lp > MaxMsgSize { - return 0, &Error{err: "message too large"} - } - l := make([]byte, 2, lp+2) - binary.BigEndian.PutUint16(l, uint16(lp)) - p = append(l, p...) - n, err := io.Copy(w, bytes.NewReader(p)) - return int(n), err +func (co *Conn) Write(p []byte) (int, error) { + if len(p) > MaxMsgSize { + return 0, &Error{err: "message too large"} } - return co.Conn.Write(p) + + if _, ok := co.Conn.(net.PacketConn); ok { + return co.Conn.Write(p) + } + + l := make([]byte, 2) + binary.BigEndian.PutUint16(l, uint16(len(p))) + + n, err := (&net.Buffers{l, p}).WriteTo(co.Conn) + return int(n), err } // Return the appropriate timeout for a specific request @@ -413,7 +378,7 @@ func ExchangeContext(ctx context.Context, m *Msg, a string) (r *Msg, err error) // ExchangeConn performs a synchronous query. It sends the message m via the connection // c and waits for a reply. The connection c is not closed by ExchangeConn. -// This function is going away, but can easily be mimicked: +// Deprecated: This function is going away, but can easily be mimicked: // // co := &dns.Conn{Conn: c} // c is your net.Conn // co.WriteMsg(m) diff --git a/vendor/github.com/miekg/dns/clientconfig.go b/vendor/github.com/miekg/dns/clientconfig.go index f13cfa30cb54..e11b630df9f0 100644 --- a/vendor/github.com/miekg/dns/clientconfig.go +++ b/vendor/github.com/miekg/dns/clientconfig.go @@ -68,14 +68,10 @@ func ClientConfigFromReader(resolvconf io.Reader) (*ClientConfig, error) { } case "search": // set search path to given servers - c.Search = make([]string, len(f)-1) - for i := 0; i < len(c.Search); i++ { - c.Search[i] = f[i+1] - } + c.Search = append([]string(nil), f[1:]...) case "options": // magic options - for i := 1; i < len(f); i++ { - s := f[i] + for _, s := range f[1:] { switch { case len(s) >= 6 && s[:6] == "ndots:": n, _ := strconv.Atoi(s[6:]) diff --git a/vendor/github.com/miekg/dns/defaults.go b/vendor/github.com/miekg/dns/defaults.go index 391d67a2c732..d874e3008c21 100644 --- a/vendor/github.com/miekg/dns/defaults.go +++ b/vendor/github.com/miekg/dns/defaults.go @@ -105,7 +105,7 @@ func (dns *Msg) SetAxfr(z string) *Msg { // SetTsig appends a TSIG RR to the message. // This is only a skeleton TSIG RR that is added as the last RR in the -// additional section. The Tsig is calculated when the message is being send. +// additional section. The TSIG is calculated when the message is being send. func (dns *Msg) SetTsig(z, algo string, fudge uint16, timesigned int64) *Msg { t := new(TSIG) t.Hdr = RR_Header{z, TypeTSIG, ClassANY, 0, 0} @@ -146,10 +146,9 @@ func (dns *Msg) IsTsig() *TSIG { // record in the additional section will do. It returns the OPT record // found or nil. func (dns *Msg) IsEdns0() *OPT { - // EDNS0 is at the end of the additional section, start there. - // We might want to change this to *only* look at the last two - // records. So we see TSIG and/or OPT - this a slightly bigger - // change though. + // RFC 6891, Section 6.1.1 allows the OPT record to appear + // anywhere in the additional record section, but it's usually at + // the end so start there. for i := len(dns.Extra) - 1; i >= 0; i-- { if dns.Extra[i].Header().Rrtype == TypeOPT { return dns.Extra[i].(*OPT) @@ -158,6 +157,21 @@ func (dns *Msg) IsEdns0() *OPT { return nil } +// popEdns0 is like IsEdns0, but it removes the record from the message. +func (dns *Msg) popEdns0() *OPT { + // RFC 6891, Section 6.1.1 allows the OPT record to appear + // anywhere in the additional record section, but it's usually at + // the end so start there. + for i := len(dns.Extra) - 1; i >= 0; i-- { + if dns.Extra[i].Header().Rrtype == TypeOPT { + opt := dns.Extra[i].(*OPT) + dns.Extra = append(dns.Extra[:i], dns.Extra[i+1:]...) + return opt + } + } + return nil +} + // IsDomainName checks if s is a valid domain name, it returns the number of // labels and true, when a domain name is valid. Note that non fully qualified // domain name is considered valid, in this case the last label is counted in @@ -303,6 +317,12 @@ func Fqdn(s string) string { return s + "." } +// CanonicalName returns the domain name in canonical form. A name in canonical +// form is lowercase and fully qualified. See Section 6.2 in RFC 4034. +func CanonicalName(s string) string { + return strings.ToLower(Fqdn(s)) +} + // Copied from the official Go code. // ReverseAddr returns the in-addr.arpa. or ip6.arpa. hostname of the IP @@ -350,7 +370,7 @@ func (t Type) String() string { // String returns the string representation for the class c. func (c Class) String() string { if s, ok := ClassToString[uint16(c)]; ok { - // Only emit mnemonics when they are unambiguous, specically ANY is in both. + // Only emit mnemonics when they are unambiguous, specially ANY is in both. if _, ok := StringToType[s]; !ok { return s } diff --git a/vendor/github.com/miekg/dns/dns.go b/vendor/github.com/miekg/dns/dns.go index f57337b89eb8..ad83a27ecfab 100644 --- a/vendor/github.com/miekg/dns/dns.go +++ b/vendor/github.com/miekg/dns/dns.go @@ -54,7 +54,7 @@ type RR interface { // parse parses an RR from zone file format. // // This will only be called on a new and empty RR type with only the header populated. - parse(c *zlexer, origin, file string) *ParseError + parse(c *zlexer, origin string) *ParseError // isDuplicate returns whether the two RRs are duplicates. isDuplicate(r2 RR) bool @@ -105,7 +105,7 @@ func (h *RR_Header) unpack(msg []byte, off int) (int, error) { panic("dns: internal error: unpack should never be called on RR_Header") } -func (h *RR_Header) parse(c *zlexer, origin, file string) *ParseError { +func (h *RR_Header) parse(c *zlexer, origin string) *ParseError { panic("dns: internal error: parse should never be called on RR_Header") } diff --git a/vendor/github.com/miekg/dns/dnssec.go b/vendor/github.com/miekg/dns/dnssec.go index 3954d4198ed2..900f6e059d89 100644 --- a/vendor/github.com/miekg/dns/dnssec.go +++ b/vendor/github.com/miekg/dns/dnssec.go @@ -3,10 +3,8 @@ package dns import ( "bytes" "crypto" - "crypto/dsa" "crypto/ecdsa" "crypto/elliptic" - _ "crypto/md5" "crypto/rand" "crypto/rsa" _ "crypto/sha1" @@ -141,8 +139,8 @@ func (k *DNSKEY) KeyTag() uint16 { switch k.Algorithm { case RSAMD5: // Look at the bottom two bytes of the modules, which the last - // item in the pubkey. We could do this faster by looking directly - // at the base64 values. But I'm lazy. + // item in the pubkey. + // This algorithm has been deprecated, but keep this key-tag calculation. modulus, _ := fromBase64([]byte(k.PublicKey)) if len(modulus) > 1 { x := binary.BigEndian.Uint16(modulus[len(modulus)-2:]) @@ -200,7 +198,7 @@ func (k *DNSKEY) ToDS(h uint8) *DS { wire = wire[:n] owner := make([]byte, 255) - off, err1 := PackDomainName(strings.ToLower(k.Hdr.Name), owner, 0, nil, false) + off, err1 := PackDomainName(CanonicalName(k.Hdr.Name), owner, 0, nil, false) if err1 != nil { return nil } @@ -285,7 +283,7 @@ func (rr *RRSIG) Sign(k crypto.Signer, rrset []RR) error { sigwire.Inception = rr.Inception sigwire.KeyTag = rr.KeyTag // For signing, lowercase this name - sigwire.SignerName = strings.ToLower(rr.SignerName) + sigwire.SignerName = CanonicalName(rr.SignerName) // Create the desired binary blob signdata := make([]byte, DefaultMsgSize) @@ -318,6 +316,10 @@ func (rr *RRSIG) Sign(k crypto.Signer, rrset []RR) error { } rr.Signature = toBase64(signature) + return nil + case RSAMD5, DSA, DSANSEC3SHA1: + // See RFC 6944. + return ErrAlg default: h := hash.New() h.Write(signdata) @@ -329,9 +331,8 @@ func (rr *RRSIG) Sign(k crypto.Signer, rrset []RR) error { } rr.Signature = toBase64(signature) + return nil } - - return nil } func sign(k crypto.Signer, hashed []byte, hash crypto.Hash, alg uint8) ([]byte, error) { @@ -343,7 +344,6 @@ func sign(k crypto.Signer, hashed []byte, hash crypto.Hash, alg uint8) ([]byte, switch alg { case RSASHA1, RSASHA1NSEC3SHA1, RSASHA256, RSASHA512: return signature, nil - case ECDSAP256SHA256, ECDSAP384SHA384: ecdsaSignature := &struct { R, S *big.Int @@ -363,20 +363,11 @@ func sign(k crypto.Signer, hashed []byte, hash crypto.Hash, alg uint8) ([]byte, signature := intToBytes(ecdsaSignature.R, intlen) signature = append(signature, intToBytes(ecdsaSignature.S, intlen)...) return signature, nil - - // There is no defined interface for what a DSA backed crypto.Signer returns - case DSA, DSANSEC3SHA1: - // t := divRoundUp(divRoundUp(p.PublicKey.Y.BitLen(), 8)-64, 8) - // signature := []byte{byte(t)} - // signature = append(signature, intToBytes(r1, 20)...) - // signature = append(signature, intToBytes(s1, 20)...) - // rr.Signature = signature - case ED25519: return signature, nil + default: + return nil, ErrAlg } - - return nil, ErrAlg } // Verify validates an RRSet with the signature and key. This is only the @@ -420,7 +411,7 @@ func (rr *RRSIG) Verify(k *DNSKEY, rrset []RR) error { sigwire.Expiration = rr.Expiration sigwire.Inception = rr.Inception sigwire.KeyTag = rr.KeyTag - sigwire.SignerName = strings.ToLower(rr.SignerName) + sigwire.SignerName = CanonicalName(rr.SignerName) // Create the desired binary blob signeddata := make([]byte, DefaultMsgSize) n, err := packSigWire(sigwire, signeddata) @@ -445,7 +436,7 @@ func (rr *RRSIG) Verify(k *DNSKEY, rrset []RR) error { } switch rr.Algorithm { - case RSASHA1, RSASHA1NSEC3SHA1, RSASHA256, RSASHA512, RSAMD5: + case RSASHA1, RSASHA1NSEC3SHA1, RSASHA256, RSASHA512: // TODO(mg): this can be done quicker, ie. cache the pubkey data somewhere?? pubkey := k.publicKeyRSA() // Get the key if pubkey == nil { @@ -556,19 +547,18 @@ func (k *DNSKEY) publicKeyRSA() *rsa.PublicKey { pubkey := new(rsa.PublicKey) var expo uint64 - for i := 0; i < int(explen); i++ { + // The exponent of length explen is between keyoff and modoff. + for _, v := range keybuf[keyoff:modoff] { expo <<= 8 - expo |= uint64(keybuf[keyoff+i]) + expo |= uint64(v) } if expo > 1<<31-1 { // Larger exponent than supported by the crypto package. return nil } - pubkey.E = int(expo) - - pubkey.N = big.NewInt(0) - pubkey.N.SetBytes(keybuf[modoff:]) + pubkey.E = int(expo) + pubkey.N = new(big.Int).SetBytes(keybuf[modoff:]) return pubkey } @@ -593,34 +583,8 @@ func (k *DNSKEY) publicKeyECDSA() *ecdsa.PublicKey { return nil } } - pubkey.X = big.NewInt(0) - pubkey.X.SetBytes(keybuf[:len(keybuf)/2]) - pubkey.Y = big.NewInt(0) - pubkey.Y.SetBytes(keybuf[len(keybuf)/2:]) - return pubkey -} - -func (k *DNSKEY) publicKeyDSA() *dsa.PublicKey { - keybuf, err := fromBase64([]byte(k.PublicKey)) - if err != nil { - return nil - } - if len(keybuf) < 22 { - return nil - } - t, keybuf := int(keybuf[0]), keybuf[1:] - size := 64 + t*8 - q, keybuf := keybuf[:20], keybuf[20:] - if len(keybuf) != 3*size { - return nil - } - p, keybuf := keybuf[:size], keybuf[size:] - g, y := keybuf[:size], keybuf[size:] - pubkey := new(dsa.PublicKey) - pubkey.Parameters.Q = big.NewInt(0).SetBytes(q) - pubkey.Parameters.P = big.NewInt(0).SetBytes(p) - pubkey.Parameters.G = big.NewInt(0).SetBytes(g) - pubkey.Y = big.NewInt(0).SetBytes(y) + pubkey.X = new(big.Int).SetBytes(keybuf[:len(keybuf)/2]) + pubkey.Y = new(big.Int).SetBytes(keybuf[len(keybuf)/2:]) return pubkey } @@ -659,7 +623,7 @@ func rawSignatureData(rrset []RR, s *RRSIG) (buf []byte, err error) { h.Name = "*." + strings.Join(labels[len(labels)-int(s.Labels):], ".") + "." } // RFC 4034: 6.2. Canonical RR Form. (2) - domain name to lowercase - h.Name = strings.ToLower(h.Name) + h.Name = CanonicalName(h.Name) // 6.2. Canonical RR Form. (3) - domain rdata to lowercase. // NS, MD, MF, CNAME, SOA, MB, MG, MR, PTR, // HINFO, MINFO, MX, RP, AFSDB, RT, SIG, PX, NXT, NAPTR, KX, @@ -672,49 +636,49 @@ func rawSignatureData(rrset []RR, s *RRSIG) (buf []byte, err error) { // conversion. switch x := r1.(type) { case *NS: - x.Ns = strings.ToLower(x.Ns) + x.Ns = CanonicalName(x.Ns) case *MD: - x.Md = strings.ToLower(x.Md) + x.Md = CanonicalName(x.Md) case *MF: - x.Mf = strings.ToLower(x.Mf) + x.Mf = CanonicalName(x.Mf) case *CNAME: - x.Target = strings.ToLower(x.Target) + x.Target = CanonicalName(x.Target) case *SOA: - x.Ns = strings.ToLower(x.Ns) - x.Mbox = strings.ToLower(x.Mbox) + x.Ns = CanonicalName(x.Ns) + x.Mbox = CanonicalName(x.Mbox) case *MB: - x.Mb = strings.ToLower(x.Mb) + x.Mb = CanonicalName(x.Mb) case *MG: - x.Mg = strings.ToLower(x.Mg) + x.Mg = CanonicalName(x.Mg) case *MR: - x.Mr = strings.ToLower(x.Mr) + x.Mr = CanonicalName(x.Mr) case *PTR: - x.Ptr = strings.ToLower(x.Ptr) + x.Ptr = CanonicalName(x.Ptr) case *MINFO: - x.Rmail = strings.ToLower(x.Rmail) - x.Email = strings.ToLower(x.Email) + x.Rmail = CanonicalName(x.Rmail) + x.Email = CanonicalName(x.Email) case *MX: - x.Mx = strings.ToLower(x.Mx) + x.Mx = CanonicalName(x.Mx) case *RP: - x.Mbox = strings.ToLower(x.Mbox) - x.Txt = strings.ToLower(x.Txt) + x.Mbox = CanonicalName(x.Mbox) + x.Txt = CanonicalName(x.Txt) case *AFSDB: - x.Hostname = strings.ToLower(x.Hostname) + x.Hostname = CanonicalName(x.Hostname) case *RT: - x.Host = strings.ToLower(x.Host) + x.Host = CanonicalName(x.Host) case *SIG: - x.SignerName = strings.ToLower(x.SignerName) + x.SignerName = CanonicalName(x.SignerName) case *PX: - x.Map822 = strings.ToLower(x.Map822) - x.Mapx400 = strings.ToLower(x.Mapx400) + x.Map822 = CanonicalName(x.Map822) + x.Mapx400 = CanonicalName(x.Mapx400) case *NAPTR: - x.Replacement = strings.ToLower(x.Replacement) + x.Replacement = CanonicalName(x.Replacement) case *KX: - x.Exchanger = strings.ToLower(x.Exchanger) + x.Exchanger = CanonicalName(x.Exchanger) case *SRV: - x.Target = strings.ToLower(x.Target) + x.Target = CanonicalName(x.Target) case *DNAME: - x.Target = strings.ToLower(x.Target) + x.Target = CanonicalName(x.Target) } // 6.2. Canonical RR Form. (5) - origTTL wire := make([]byte, Len(r1)+1) // +1 to be safe(r) diff --git a/vendor/github.com/miekg/dns/dnssec_keygen.go b/vendor/github.com/miekg/dns/dnssec_keygen.go index 33e913ac527d..2ab7b6d73b80 100644 --- a/vendor/github.com/miekg/dns/dnssec_keygen.go +++ b/vendor/github.com/miekg/dns/dnssec_keygen.go @@ -2,7 +2,6 @@ package dns import ( "crypto" - "crypto/dsa" "crypto/ecdsa" "crypto/elliptic" "crypto/rand" @@ -20,11 +19,7 @@ import ( // bits should be set to the size of the algorithm. func (k *DNSKEY) Generate(bits int) (crypto.PrivateKey, error) { switch k.Algorithm { - case DSA, DSANSEC3SHA1: - if bits != 1024 { - return nil, ErrKeySize - } - case RSAMD5, RSASHA1, RSASHA256, RSASHA1NSEC3SHA1: + case RSASHA1, RSASHA256, RSASHA1NSEC3SHA1: if bits < 512 || bits > 4096 { return nil, ErrKeySize } @@ -44,23 +39,12 @@ func (k *DNSKEY) Generate(bits int) (crypto.PrivateKey, error) { if bits != 256 { return nil, ErrKeySize } + default: + return nil, ErrAlg } switch k.Algorithm { - case DSA, DSANSEC3SHA1: - params := new(dsa.Parameters) - if err := dsa.GenerateParameters(params, rand.Reader, dsa.L1024N160); err != nil { - return nil, err - } - priv := new(dsa.PrivateKey) - priv.PublicKey.Parameters = *params - err := dsa.GenerateKey(priv, rand.Reader) - if err != nil { - return nil, err - } - k.setPublicKeyDSA(params.Q, params.P, params.G, priv.PublicKey.Y) - return priv, nil - case RSAMD5, RSASHA1, RSASHA256, RSASHA512, RSASHA1NSEC3SHA1: + case RSASHA1, RSASHA256, RSASHA512, RSASHA1NSEC3SHA1: priv, err := rsa.GenerateKey(rand.Reader, bits) if err != nil { return nil, err @@ -120,16 +104,6 @@ func (k *DNSKEY) setPublicKeyECDSA(_X, _Y *big.Int) bool { return true } -// Set the public key for DSA -func (k *DNSKEY) setPublicKeyDSA(_Q, _P, _G, _Y *big.Int) bool { - if _Q == nil || _P == nil || _G == nil || _Y == nil { - return false - } - buf := dsaToBuf(_Q, _P, _G, _Y) - k.PublicKey = toBase64(buf) - return true -} - // Set the public key for Ed25519 func (k *DNSKEY) setPublicKeyED25519(_K ed25519.PublicKey) bool { if _K == nil { @@ -164,15 +138,3 @@ func curveToBuf(_X, _Y *big.Int, intlen int) []byte { buf = append(buf, intToBytes(_Y, intlen)...) return buf } - -// Set the public key for X and Y for Curve. The two -// values are just concatenated. -func dsaToBuf(_Q, _P, _G, _Y *big.Int) []byte { - t := divRoundUp(divRoundUp(_G.BitLen(), 8)-64, 8) - buf := []byte{byte(t)} - buf = append(buf, intToBytes(_Q, 20)...) - buf = append(buf, intToBytes(_P, 64+t*8)...) - buf = append(buf, intToBytes(_G, 64+t*8)...) - buf = append(buf, intToBytes(_Y, 64+t*8)...) - return buf -} diff --git a/vendor/github.com/miekg/dns/dnssec_keyscan.go b/vendor/github.com/miekg/dns/dnssec_keyscan.go index 5e6542230110..6cbc28483f13 100644 --- a/vendor/github.com/miekg/dns/dnssec_keyscan.go +++ b/vendor/github.com/miekg/dns/dnssec_keyscan.go @@ -3,7 +3,6 @@ package dns import ( "bufio" "crypto" - "crypto/dsa" "crypto/ecdsa" "crypto/rsa" "io" @@ -44,26 +43,7 @@ func (k *DNSKEY) ReadPrivateKey(q io.Reader, file string) (crypto.PrivateKey, er return nil, ErrPrivKey } switch uint8(algo) { - case DSA: - priv, err := readPrivateKeyDSA(m) - if err != nil { - return nil, err - } - pub := k.publicKeyDSA() - if pub == nil { - return nil, ErrKey - } - priv.PublicKey = *pub - return priv, nil - case RSAMD5: - fallthrough - case RSASHA1: - fallthrough - case RSASHA1NSEC3SHA1: - fallthrough - case RSASHA256: - fallthrough - case RSASHA512: + case RSASHA1, RSASHA1NSEC3SHA1, RSASHA256, RSASHA512: priv, err := readPrivateKeyRSA(m) if err != nil { return nil, err @@ -74,11 +54,7 @@ func (k *DNSKEY) ReadPrivateKey(q io.Reader, file string) (crypto.PrivateKey, er } priv.PublicKey = *pub return priv, nil - case ECCGOST: - return nil, ErrPrivKey - case ECDSAP256SHA256: - fallthrough - case ECDSAP384SHA384: + case ECDSAP256SHA256, ECDSAP384SHA384: priv, err := readPrivateKeyECDSA(m) if err != nil { return nil, err @@ -92,7 +68,7 @@ func (k *DNSKEY) ReadPrivateKey(q io.Reader, file string) (crypto.PrivateKey, er case ED25519: return readPrivateKeyED25519(m) default: - return nil, ErrPrivKey + return nil, ErrAlg } } @@ -109,21 +85,16 @@ func readPrivateKeyRSA(m map[string]string) (*rsa.PrivateKey, error) { } switch k { case "modulus": - p.PublicKey.N = big.NewInt(0) - p.PublicKey.N.SetBytes(v1) + p.PublicKey.N = new(big.Int).SetBytes(v1) case "publicexponent": - i := big.NewInt(0) - i.SetBytes(v1) + i := new(big.Int).SetBytes(v1) p.PublicKey.E = int(i.Int64()) // int64 should be large enough case "privateexponent": - p.D = big.NewInt(0) - p.D.SetBytes(v1) + p.D = new(big.Int).SetBytes(v1) case "prime1": - p.Primes[0] = big.NewInt(0) - p.Primes[0].SetBytes(v1) + p.Primes[0] = new(big.Int).SetBytes(v1) case "prime2": - p.Primes[1] = big.NewInt(0) - p.Primes[1].SetBytes(v1) + p.Primes[1] = new(big.Int).SetBytes(v1) } case "exponent1", "exponent2", "coefficient": // not used in Go (yet) @@ -134,27 +105,9 @@ func readPrivateKeyRSA(m map[string]string) (*rsa.PrivateKey, error) { return p, nil } -func readPrivateKeyDSA(m map[string]string) (*dsa.PrivateKey, error) { - p := new(dsa.PrivateKey) - p.X = big.NewInt(0) - for k, v := range m { - switch k { - case "private_value(x)": - v1, err := fromBase64([]byte(v)) - if err != nil { - return nil, err - } - p.X.SetBytes(v1) - case "created", "publish", "activate": - /* not used in Go (yet) */ - } - } - return p, nil -} - func readPrivateKeyECDSA(m map[string]string) (*ecdsa.PrivateKey, error) { p := new(ecdsa.PrivateKey) - p.D = big.NewInt(0) + p.D = new(big.Int) // TODO: validate that the required flags are present for k, v := range m { switch k { @@ -322,6 +275,11 @@ func (kl *klexer) Next() (lex, bool) { commt = false } + if kl.key && str.Len() == 0 { + // ignore empty lines + break + } + kl.key = true l.value = zValue diff --git a/vendor/github.com/miekg/dns/dnssec_privkey.go b/vendor/github.com/miekg/dns/dnssec_privkey.go index 0c65be17bc6b..072e445dadfa 100644 --- a/vendor/github.com/miekg/dns/dnssec_privkey.go +++ b/vendor/github.com/miekg/dns/dnssec_privkey.go @@ -2,7 +2,6 @@ package dns import ( "crypto" - "crypto/dsa" "crypto/ecdsa" "crypto/rsa" "math/big" @@ -13,10 +12,12 @@ import ( const format = "Private-key-format: v1.3\n" +var bigIntOne = big.NewInt(1) + // PrivateKeyString converts a PrivateKey to a string. This string has the same // format as the private-key-file of BIND9 (Private-key-format: v1.3). -// It needs some info from the key (the algorithm), so its a method of the DNSKEY -// It supports rsa.PrivateKey, ecdsa.PrivateKey and dsa.PrivateKey +// It needs some info from the key (the algorithm), so its a method of the DNSKEY. +// It supports *rsa.PrivateKey, *ecdsa.PrivateKey and ed25519.PrivateKey. func (r *DNSKEY) PrivateKeyString(p crypto.PrivateKey) string { algorithm := strconv.Itoa(int(r.Algorithm)) algorithm += " (" + AlgorithmToString[r.Algorithm] + ")" @@ -31,12 +32,11 @@ func (r *DNSKEY) PrivateKeyString(p crypto.PrivateKey) string { prime2 := toBase64(p.Primes[1].Bytes()) // Calculate Exponent1/2 and Coefficient as per: http://en.wikipedia.org/wiki/RSA#Using_the_Chinese_remainder_algorithm // and from: http://code.google.com/p/go/issues/detail?id=987 - one := big.NewInt(1) - p1 := big.NewInt(0).Sub(p.Primes[0], one) - q1 := big.NewInt(0).Sub(p.Primes[1], one) - exp1 := big.NewInt(0).Mod(p.D, p1) - exp2 := big.NewInt(0).Mod(p.D, q1) - coeff := big.NewInt(0).ModInverse(p.Primes[1], p.Primes[0]) + p1 := new(big.Int).Sub(p.Primes[0], bigIntOne) + q1 := new(big.Int).Sub(p.Primes[1], bigIntOne) + exp1 := new(big.Int).Mod(p.D, p1) + exp2 := new(big.Int).Mod(p.D, q1) + coeff := new(big.Int).ModInverse(p.Primes[1], p.Primes[0]) exponent1 := toBase64(exp1.Bytes()) exponent2 := toBase64(exp2.Bytes()) @@ -66,21 +66,6 @@ func (r *DNSKEY) PrivateKeyString(p crypto.PrivateKey) string { "Algorithm: " + algorithm + "\n" + "PrivateKey: " + private + "\n" - case *dsa.PrivateKey: - T := divRoundUp(divRoundUp(p.PublicKey.Parameters.G.BitLen(), 8)-64, 8) - prime := toBase64(intToBytes(p.PublicKey.Parameters.P, 64+T*8)) - subprime := toBase64(intToBytes(p.PublicKey.Parameters.Q, 20)) - base := toBase64(intToBytes(p.PublicKey.Parameters.G, 64+T*8)) - priv := toBase64(intToBytes(p.X, 20)) - pub := toBase64(intToBytes(p.PublicKey.Y, 64+T*8)) - return format + - "Algorithm: " + algorithm + "\n" + - "Prime(p): " + prime + "\n" + - "Subprime(q): " + subprime + "\n" + - "Base(g): " + base + "\n" + - "Private_value(x): " + priv + "\n" + - "Public_value(y): " + pub + "\n" - case ed25519.PrivateKey: private := toBase64(p.Seed()) return format + diff --git a/vendor/github.com/miekg/dns/doc.go b/vendor/github.com/miekg/dns/doc.go index d3d7cec9ef5c..6861de774b70 100644 --- a/vendor/github.com/miekg/dns/doc.go +++ b/vendor/github.com/miekg/dns/doc.go @@ -83,7 +83,7 @@ with: in, err := dns.Exchange(m1, "127.0.0.1:53") -When this functions returns you will get dns message. A dns message consists +When this functions returns you will get DNS message. A DNS message consists out of four sections. The question section: in.Question, the answer section: in.Answer, the authority section: in.Ns and the additional section: in.Extra. @@ -209,7 +209,7 @@ Basic use pattern validating and replying to a message that has TSIG set. // *Msg r has an TSIG record and it was validated m.SetTsig("axfr.", dns.HmacMD5, 300, time.Now().Unix()) } else { - // *Msg r has an TSIG records and it was not valided + // *Msg r has an TSIG records and it was not validated } } w.WriteMsg(m) @@ -221,7 +221,7 @@ RFC 6895 sets aside a range of type codes for private use. This range is 65,280 - 65,534 (0xFF00 - 0xFFFE). When experimenting with new Resource Records these can be used, before requesting an official type code from IANA. -See https://miek.nl/2014/September/21/idn-and-private-rr-in-go-dns/ for more +See https://miek.nl/2014/september/21/idn-and-private-rr-in-go-dns/ for more information. EDNS0 @@ -238,9 +238,8 @@ Basic use pattern for creating an (empty) OPT RR: The rdata of an OPT RR consists out of a slice of EDNS0 (RFC 6891) interfaces. Currently only a few have been standardized: EDNS0_NSID (RFC 5001) and -EDNS0_SUBNET (draft-vandergaast-edns-client-subnet-02). Note that these options -may be combined in an OPT RR. Basic use pattern for a server to check if (and -which) options are set: +EDNS0_SUBNET (RFC 7871). Note that these options may be combined in an OPT RR. +Basic use pattern for a server to check if (and which) options are set: // o is a dns.OPT for _, s := range o.Option { @@ -261,7 +260,7 @@ From RFC 2931: on requests and responses, and protection of the overall integrity of a response. It works like TSIG, except that SIG(0) uses public key cryptography, instead of -the shared secret approach in TSIG. Supported algorithms: DSA, ECDSAP256SHA256, +the shared secret approach in TSIG. Supported algorithms: ECDSAP256SHA256, ECDSAP384SHA384, RSASHA1, RSASHA256 and RSASHA512. Signing subsequent messages in multi-message sessions is not implemented. diff --git a/vendor/github.com/miekg/dns/duplicate.go b/vendor/github.com/miekg/dns/duplicate.go index 05c14aae3160..d21ae1cac156 100644 --- a/vendor/github.com/miekg/dns/duplicate.go +++ b/vendor/github.com/miekg/dns/duplicate.go @@ -3,9 +3,8 @@ package dns //go:generate go run duplicate_generate.go // IsDuplicate checks of r1 and r2 are duplicates of each other, excluding the TTL. -// So this means the header data is equal *and* the RDATA is the same. Return true -// is so, otherwise false. -// It's is a protocol violation to have identical RRs in a message. +// So this means the header data is equal *and* the RDATA is the same. Returns true +// if so, otherwise false. It's a protocol violation to have identical RRs in a message. func IsDuplicate(r1, r2 RR) bool { // Check whether the record header is identical. if !r1.Header().isDuplicate(r2.Header()) { @@ -27,12 +26,12 @@ func (r1 *RR_Header) isDuplicate(_r2 RR) bool { if r1.Rrtype != r2.Rrtype { return false } - if !isDulicateName(r1.Name, r2.Name) { + if !isDuplicateName(r1.Name, r2.Name) { return false } // ignore TTL return true } -// isDulicateName checks if the domain names s1 and s2 are equal. -func isDulicateName(s1, s2 string) bool { return equal(s1, s2) } +// isDuplicateName checks if the domain names s1 and s2 are equal. +func isDuplicateName(s1, s2 string) bool { return equal(s1, s2) } diff --git a/vendor/github.com/miekg/dns/edns.go b/vendor/github.com/miekg/dns/edns.go index 805641b267bb..04808d57897d 100644 --- a/vendor/github.com/miekg/dns/edns.go +++ b/vendor/github.com/miekg/dns/edns.go @@ -80,15 +80,15 @@ func (rr *OPT) String() string { func (rr *OPT) len(off int, compression map[string]struct{}) int { l := rr.Hdr.len(off, compression) - for i := 0; i < len(rr.Option); i++ { + for _, o := range rr.Option { l += 4 // Account for 2-byte option code and 2-byte option length. - lo, _ := rr.Option[i].pack() + lo, _ := o.pack() l += len(lo) } return l } -func (rr *OPT) parse(c *zlexer, origin, file string) *ParseError { +func (rr *OPT) parse(c *zlexer, origin string) *ParseError { panic("dns: internal error: parse should never be called on OPT") } @@ -360,7 +360,7 @@ func (e *EDNS0_COOKIE) copy() EDNS0 { return &EDNS0_COOKIE{e.Code, e.C // The EDNS0_UL (Update Lease) (draft RFC) option is used to tell the server to set // an expiration on an update RR. This is helpful for clients that cannot clean // up after themselves. This is a draft RFC and more information can be found at -// http://files.dns-sd.org/draft-sekar-dns-ul.txt +// https://tools.ietf.org/html/draft-sekar-dns-ul-02 // // o := new(dns.OPT) // o.Hdr.Name = "." @@ -370,24 +370,36 @@ func (e *EDNS0_COOKIE) copy() EDNS0 { return &EDNS0_COOKIE{e.Code, e.C // e.Lease = 120 // in seconds // o.Option = append(o.Option, e) type EDNS0_UL struct { - Code uint16 // Always EDNS0UL - Lease uint32 + Code uint16 // Always EDNS0UL + Lease uint32 + KeyLease uint32 } // Option implements the EDNS0 interface. func (e *EDNS0_UL) Option() uint16 { return EDNS0UL } -func (e *EDNS0_UL) String() string { return strconv.FormatUint(uint64(e.Lease), 10) } -func (e *EDNS0_UL) copy() EDNS0 { return &EDNS0_UL{e.Code, e.Lease} } +func (e *EDNS0_UL) String() string { return fmt.Sprintf("%d %d", e.Lease, e.KeyLease) } +func (e *EDNS0_UL) copy() EDNS0 { return &EDNS0_UL{e.Code, e.Lease, e.KeyLease} } // Copied: http://golang.org/src/pkg/net/dnsmsg.go func (e *EDNS0_UL) pack() ([]byte, error) { - b := make([]byte, 4) + var b []byte + if e.KeyLease == 0 { + b = make([]byte, 4) + } else { + b = make([]byte, 8) + binary.BigEndian.PutUint32(b[4:], e.KeyLease) + } binary.BigEndian.PutUint32(b, e.Lease) return b, nil } func (e *EDNS0_UL) unpack(b []byte) error { - if len(b) < 4 { + switch len(b) { + case 4: + e.KeyLease = 0 + case 8: + e.KeyLease = binary.BigEndian.Uint32(b[4:]) + default: return ErrBuf } e.Lease = binary.BigEndian.Uint32(b) @@ -453,11 +465,11 @@ func (e *EDNS0_DAU) unpack(b []byte) error { e.AlgCode = b; return nil } func (e *EDNS0_DAU) String() string { s := "" - for i := 0; i < len(e.AlgCode); i++ { - if a, ok := AlgorithmToString[e.AlgCode[i]]; ok { + for _, alg := range e.AlgCode { + if a, ok := AlgorithmToString[alg]; ok { s += " " + a } else { - s += " " + strconv.Itoa(int(e.AlgCode[i])) + s += " " + strconv.Itoa(int(alg)) } } return s @@ -477,11 +489,11 @@ func (e *EDNS0_DHU) unpack(b []byte) error { e.AlgCode = b; return nil } func (e *EDNS0_DHU) String() string { s := "" - for i := 0; i < len(e.AlgCode); i++ { - if a, ok := HashToString[e.AlgCode[i]]; ok { + for _, alg := range e.AlgCode { + if a, ok := HashToString[alg]; ok { s += " " + a } else { - s += " " + strconv.Itoa(int(e.AlgCode[i])) + s += " " + strconv.Itoa(int(alg)) } } return s @@ -502,11 +514,11 @@ func (e *EDNS0_N3U) unpack(b []byte) error { e.AlgCode = b; return nil } func (e *EDNS0_N3U) String() string { // Re-use the hash map s := "" - for i := 0; i < len(e.AlgCode); i++ { - if a, ok := HashToString[e.AlgCode[i]]; ok { + for _, alg := range e.AlgCode { + if a, ok := HashToString[alg]; ok { s += " " + a } else { - s += " " + strconv.Itoa(int(e.AlgCode[i])) + s += " " + strconv.Itoa(int(alg)) } } return s @@ -531,6 +543,10 @@ func (e *EDNS0_EXPIRE) pack() ([]byte, error) { } func (e *EDNS0_EXPIRE) unpack(b []byte) error { + if len(b) == 0 { + // zero-length EXPIRE query, see RFC 7314 Section 2 + return nil + } if len(b) < 4 { return ErrBuf } diff --git a/vendor/github.com/miekg/dns/format.go b/vendor/github.com/miekg/dns/format.go index 86057f99b7bc..0ec79f2fc126 100644 --- a/vendor/github.com/miekg/dns/format.go +++ b/vendor/github.com/miekg/dns/format.go @@ -31,6 +31,9 @@ func Field(r RR, i int) string { switch reflect.ValueOf(r).Elem().Type().Field(i).Tag { case `dns:"a"`: // TODO(miek): Hmm store this as 16 bytes + if d.Len() < net.IPv4len { + return "" + } if d.Len() < net.IPv6len { return net.IPv4(byte(d.Index(0).Uint()), byte(d.Index(1).Uint()), @@ -42,6 +45,9 @@ func Field(r RR, i int) string { byte(d.Index(14).Uint()), byte(d.Index(15).Uint())).String() case `dns:"aaaa"`: + if d.Len() < net.IPv6len { + return "" + } return net.IP{ byte(d.Index(0).Uint()), byte(d.Index(1).Uint()), diff --git a/vendor/github.com/miekg/dns/fuzz.go b/vendor/github.com/miekg/dns/fuzz.go index a8a09184d404..57410acda75e 100644 --- a/vendor/github.com/miekg/dns/fuzz.go +++ b/vendor/github.com/miekg/dns/fuzz.go @@ -2,6 +2,8 @@ package dns +import "strings" + func Fuzz(data []byte) int { msg := new(Msg) @@ -16,7 +18,14 @@ func Fuzz(data []byte) int { } func FuzzNewRR(data []byte) int { - if _, err := NewRR(string(data)); err != nil { + str := string(data) + // Do not fuzz lines that include the $INCLUDE keyword and hint the fuzzer + // at avoiding them. + // See GH#1025 for context. + if strings.Contains(strings.ToUpper(str), "$INCLUDE") { + return -1 + } + if _, err := NewRR(str); err != nil { return 0 } return 1 diff --git a/vendor/github.com/miekg/dns/generate.go b/vendor/github.com/miekg/dns/generate.go index 97bc39f58a82..f713074a181c 100644 --- a/vendor/github.com/miekg/dns/generate.go +++ b/vendor/github.com/miekg/dns/generate.go @@ -20,13 +20,13 @@ import ( // of $ after that are interpreted. func (zp *ZoneParser) generate(l lex) (RR, bool) { token := l.token - step := 1 + step := int64(1) if i := strings.IndexByte(token, '/'); i >= 0 { if i+1 == len(token) { return zp.setParseError("bad step in $GENERATE range", l) } - s, err := strconv.Atoi(token[i+1:]) + s, err := strconv.ParseInt(token[i+1:], 10, 64) if err != nil || s <= 0 { return zp.setParseError("bad step in $GENERATE range", l) } @@ -40,20 +40,24 @@ func (zp *ZoneParser) generate(l lex) (RR, bool) { return zp.setParseError("bad start-stop in $GENERATE range", l) } - start, err := strconv.Atoi(sx[0]) + start, err := strconv.ParseInt(sx[0], 10, 64) if err != nil { return zp.setParseError("bad start in $GENERATE range", l) } - end, err := strconv.Atoi(sx[1]) + end, err := strconv.ParseInt(sx[1], 10, 64) if err != nil { return zp.setParseError("bad stop in $GENERATE range", l) } - if end < 0 || start < 0 || end < start { + if end < 0 || start < 0 || end < start || (end-start)/step > 65535 { return zp.setParseError("bad range in $GENERATE range", l) } - zp.c.Next() // _BLANK + // _BLANK + l, ok := zp.c.Next() + if !ok || l.value != zBlank { + return zp.setParseError("garbage after $GENERATE range", l) + } // Create a complete new string, which we then parse again. var s string @@ -71,16 +75,17 @@ func (zp *ZoneParser) generate(l lex) (RR, bool) { r := &generateReader{ s: s, - cur: start, - start: start, - end: end, - step: step, + cur: int(start), + start: int(start), + end: int(end), + step: int(step), file: zp.file, lex: &l, } zp.sub = NewZoneParser(r, zp.origin, zp.file) zp.sub.includeDepth, zp.sub.includeAllowed = zp.includeDepth, zp.includeAllowed + zp.sub.generateDisallowed = true zp.sub.SetDefaultTTL(defaultTtl) return zp.subNext() } @@ -183,7 +188,7 @@ func (r *generateReader) ReadByte() (byte, error) { if errMsg != "" { return 0, r.parseError(errMsg, si+3+sep) } - if r.start+offset < 0 || r.end+offset > 1<<31-1 { + if r.start+offset < 0 || int64(r.end) + int64(offset) > 1<<31-1 { return 0, r.parseError("bad offset in $GENERATE", si+3+sep) } @@ -224,19 +229,19 @@ func modToPrintf(s string) (string, int, string) { return "", 0, "bad base in $GENERATE" } - offset, err := strconv.Atoi(offStr) + offset, err := strconv.ParseInt(offStr, 10, 64) if err != nil { return "", 0, "bad offset in $GENERATE" } - width, err := strconv.Atoi(widthStr) + width, err := strconv.ParseInt(widthStr, 10, 64) if err != nil || width < 0 || width > 255 { return "", 0, "bad width in $GENERATE" } if width == 0 { - return "%" + base, offset, "" + return "%" + base, int(offset), "" } - return "%0" + widthStr + base, offset, "" + return "%0" + widthStr + base, int(offset), "" } diff --git a/vendor/github.com/miekg/dns/go.mod b/vendor/github.com/miekg/dns/go.mod new file mode 100644 index 000000000000..6003d0573c6e --- /dev/null +++ b/vendor/github.com/miekg/dns/go.mod @@ -0,0 +1,11 @@ +module github.com/miekg/dns + +go 1.12 + +require ( + golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 + golang.org/x/net v0.0.0-20190923162816-aa69164e4478 + golang.org/x/sync v0.0.0-20190423024810-112230192c58 + golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe + golang.org/x/tools v0.0.0-20191216052735-49a3e744a425 // indirect +) diff --git a/vendor/github.com/miekg/dns/go.sum b/vendor/github.com/miekg/dns/go.sum new file mode 100644 index 000000000000..96bda3a94128 --- /dev/null +++ b/vendor/github.com/miekg/dns/go.sum @@ -0,0 +1,39 @@ +golang.org/x/crypto v0.0.0-20181001203147-e3636079e1a4 h1:Vk3wNqEZwyGyei9yq5ekj7frek2u7HUfffJ1/opblzc= +golang.org/x/crypto v0.0.0-20181001203147-e3636079e1a4/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190829043050-9756ffdc2472 h1:Gv7RPwsi3eZ2Fgewe3CBsuOebPwO27PoXzRpJPsvSSM= +golang.org/x/crypto v0.0.0-20190829043050-9756ffdc2472/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392 h1:ACG4HJsFiNMf47Y4PeRoebLNy/2lXT9EtprMuTFWt1M= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 h1:ObdrDkeb4kJdCP557AjRjq69pTHfNouLtWZG7j9rPN8= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/net v0.0.0-20180926154720-4dfa2610cdf3 h1:dgd4x4kJt7G4k4m93AYLzM8Ni6h2qLTfh9n9vXJT3/0= +golang.org/x/net v0.0.0-20180926154720-4dfa2610cdf3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478 h1:l5EDrHhldLYb3ZRHDUhXF7Om7MvYXnkV9/iQNo1lX6g= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180928133829-e4b3c5e90611 h1:O33LKL7WyJgjN9CvxfTIomjIClbd/Kq86/iipowHQU0= +golang.org/x/sys v0.0.0-20180928133829-e4b3c5e90611/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-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd h1:DBH9mDw0zluJT/R+nGuV3jWFWLFaHyYZWD4tOT+cjn0= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe h1:6fAMxZRR6sl1Uq8U61gxU+kPTs2tR8uOySCbBP7BN/M= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216052735-49a3e744a425 h1:VvQyQJN0tSuecqgcIxMWnnfG5kSmgy9KZR9sW3W5QeA= +golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/vendor/github.com/miekg/dns/labels.go b/vendor/github.com/miekg/dns/labels.go index ca8c204554c9..df1675dfd280 100644 --- a/vendor/github.com/miekg/dns/labels.go +++ b/vendor/github.com/miekg/dns/labels.go @@ -28,9 +28,7 @@ func SplitDomainName(s string) (labels []string) { case 1: // no-op default: - end := 0 - for i := 1; i < len(idx); i++ { - end = idx[i] + for _, end := range idx[1:] { labels = append(labels, s[begin:end-1]) begin = end } @@ -85,7 +83,7 @@ func CompareDomainName(s1, s2 string) (n int) { return } -// CountLabel counts the the number of labels in the string s. +// CountLabel counts the number of labels in the string s. // s must be a syntactically valid domain name. func CountLabel(s string) (labels int) { if s == "." { @@ -128,20 +126,23 @@ func Split(s string) []int { // The bool end is true when the end of the string has been reached. // Also see PrevLabel. func NextLabel(s string, offset int) (i int, end bool) { - quote := false + if s == "" { + return 0, true + } for i = offset; i < len(s)-1; i++ { - switch s[i] { - case '\\': - quote = !quote - default: - quote = false - case '.': - if quote { - quote = !quote - continue - } - return i + 1, false + if s[i] != '.' { + continue + } + j := i - 1 + for j >= 0 && s[j] == '\\' { + j-- + } + + if (j-i)%2 == 0 { + continue } + + return i + 1, false } return i + 1, true } @@ -151,17 +152,38 @@ func NextLabel(s string, offset int) (i int, end bool) { // The bool start is true when the start of the string has been overshot. // Also see NextLabel. func PrevLabel(s string, n int) (i int, start bool) { + if s == "" { + return 0, true + } if n == 0 { return len(s), false } - lab := Split(s) - if lab == nil { - return 0, true + + l := len(s) - 1 + if s[l] == '.' { + l-- } - if n > len(lab) { - return 0, true + + for ; l >= 0 && n > 0; l-- { + if s[l] != '.' { + continue + } + j := l - 1 + for j >= 0 && s[j] == '\\' { + j-- + } + + if (j-l)%2 == 0 { + continue + } + + n-- + if n == 0 { + return l + 1, false + } } - return lab[len(lab)-n], false + + return 0, n > 1 } // equal compares a and b while ignoring case. It returns true when equal otherwise false. diff --git a/vendor/github.com/miekg/dns/msg.go b/vendor/github.com/miekg/dns/msg.go index 5191fc06d09d..7001f6da79c8 100644 --- a/vendor/github.com/miekg/dns/msg.go +++ b/vendor/github.com/miekg/dns/msg.go @@ -11,14 +11,12 @@ package dns //go:generate go run msg_generate.go import ( - crand "crypto/rand" + "crypto/rand" "encoding/binary" "fmt" "math/big" - "math/rand" "strconv" "strings" - "sync" ) const ( @@ -73,53 +71,23 @@ var ( ErrTime error = &Error{err: "bad time"} // ErrTime indicates a timing error in TSIG authentication. ) -// Id by default, returns a 16 bits random number to be used as a -// message id. The random provided should be good enough. This being a -// variable the function can be reassigned to a custom function. -// For instance, to make it return a static value: +// Id by default returns a 16-bit random number to be used as a message id. The +// number is drawn from a cryptographically secure random number generator. +// This being a variable the function can be reassigned to a custom function. +// For instance, to make it return a static value for testing: // // dns.Id = func() uint16 { return 3 } var Id = id -var ( - idLock sync.Mutex - idRand *rand.Rand -) - // id returns a 16 bits random number to be used as a // message id. The random provided should be good enough. func id() uint16 { - idLock.Lock() - - if idRand == nil { - // This (partially) works around - // https://github.com/golang/go/issues/11833 by only - // seeding idRand upon the first call to id. - - var seed int64 - var buf [8]byte - - if _, err := crand.Read(buf[:]); err == nil { - seed = int64(binary.LittleEndian.Uint64(buf[:])) - } else { - seed = rand.Int63() - } - - idRand = rand.New(rand.NewSource(seed)) + var output uint16 + err := binary.Read(rand.Reader, binary.BigEndian, &output) + if err != nil { + panic("dns: reading random id failed: " + err.Error()) } - - // The call to idRand.Uint32 must be within the - // mutex lock because *rand.Rand is not safe for - // concurrent use. - // - // There is no added performance overhead to calling - // idRand.Uint32 inside a mutex lock over just - // calling rand.Uint32 as the global math/rand rng - // is internally protected by a sync.Mutex. - id := uint16(idRand.Uint32()) - - idLock.Unlock() - return id + return output } // MsgHdr is a a manually-unpacked version of (id, bits). @@ -429,18 +397,13 @@ Loop: if budget <= 0 { return "", lenmsg, ErrLongDomain } - for j := off; j < off+c; j++ { - switch b := msg[j]; b { - case '.', '(', ')', ';', ' ', '@': - fallthrough - case '"', '\\': + for _, b := range msg[off : off+c] { + if isDomainNameLabelSpecial(b) { s = append(s, '\\', b) - default: - if b < ' ' || b > '~' { // unprintable, use \DDD - s = append(s, escapeByte(b)...) - } else { - s = append(s, b) - } + } else if b < ' ' || b > '~' { + s = append(s, escapeByte(b)...) + } else { + s = append(s, b) } } s = append(s, '.') @@ -489,11 +452,11 @@ func packTxt(txt []string, msg []byte, offset int, tmp []byte) (int, error) { return offset, nil } var err error - for i := range txt { - if len(txt[i]) > len(tmp) { + for _, s := range txt { + if len(s) > len(tmp) { return offset, ErrBuf } - offset, err = packTxtString(txt[i], msg, offset, tmp) + offset, err = packTxtString(s, msg, offset, tmp) if err != nil { return offset, err } @@ -693,7 +656,6 @@ func unpackRRslice(l int, msg []byte, off int) (dst1 []RR, off1 int, err error) } // If offset does not increase anymore, l is a lie if off1 == off { - l = i break } dst = append(dst, r) @@ -934,31 +896,31 @@ func (dns *Msg) String() string { s += "ADDITIONAL: " + strconv.Itoa(len(dns.Extra)) + "\n" if len(dns.Question) > 0 { s += "\n;; QUESTION SECTION:\n" - for i := 0; i < len(dns.Question); i++ { - s += dns.Question[i].String() + "\n" + for _, r := range dns.Question { + s += r.String() + "\n" } } if len(dns.Answer) > 0 { s += "\n;; ANSWER SECTION:\n" - for i := 0; i < len(dns.Answer); i++ { - if dns.Answer[i] != nil { - s += dns.Answer[i].String() + "\n" + for _, r := range dns.Answer { + if r != nil { + s += r.String() + "\n" } } } if len(dns.Ns) > 0 { s += "\n;; AUTHORITY SECTION:\n" - for i := 0; i < len(dns.Ns); i++ { - if dns.Ns[i] != nil { - s += dns.Ns[i].String() + "\n" + for _, r := range dns.Ns { + if r != nil { + s += r.String() + "\n" } } } if len(dns.Extra) > 0 { s += "\n;; ADDITIONAL SECTION:\n" - for i := 0; i < len(dns.Extra); i++ { - if dns.Extra[i] != nil { - s += dns.Extra[i].String() + "\n" + for _, r := range dns.Extra { + if r != nil { + s += r.String() + "\n" } } } @@ -1091,33 +1053,20 @@ func (dns *Msg) CopyTo(r1 *Msg) *Msg { } rrArr := make([]RR, len(dns.Answer)+len(dns.Ns)+len(dns.Extra)) - var rri int + r1.Answer, rrArr = rrArr[:0:len(dns.Answer)], rrArr[len(dns.Answer):] + r1.Ns, rrArr = rrArr[:0:len(dns.Ns)], rrArr[len(dns.Ns):] + r1.Extra = rrArr[:0:len(dns.Extra)] - if len(dns.Answer) > 0 { - rrbegin := rri - for i := 0; i < len(dns.Answer); i++ { - rrArr[rri] = dns.Answer[i].copy() - rri++ - } - r1.Answer = rrArr[rrbegin:rri:rri] + for _, r := range dns.Answer { + r1.Answer = append(r1.Answer, r.copy()) } - if len(dns.Ns) > 0 { - rrbegin := rri - for i := 0; i < len(dns.Ns); i++ { - rrArr[rri] = dns.Ns[i].copy() - rri++ - } - r1.Ns = rrArr[rrbegin:rri:rri] + for _, r := range dns.Ns { + r1.Ns = append(r1.Ns, r.copy()) } - if len(dns.Extra) > 0 { - rrbegin := rri - for i := 0; i < len(dns.Extra); i++ { - rrArr[rri] = dns.Extra[i].copy() - rri++ - } - r1.Extra = rrArr[rrbegin:rri:rri] + for _, r := range dns.Extra { + r1.Extra = append(r1.Extra, r.copy()) } return r1 diff --git a/vendor/github.com/miekg/dns/msg_helpers.go b/vendor/github.com/miekg/dns/msg_helpers.go index 527621a00143..47625ed0902d 100644 --- a/vendor/github.com/miekg/dns/msg_helpers.go +++ b/vendor/github.com/miekg/dns/msg_helpers.go @@ -6,6 +6,7 @@ import ( "encoding/binary" "encoding/hex" "net" + "sort" "strings" ) @@ -25,12 +26,13 @@ func unpackDataA(msg []byte, off int) (net.IP, int, error) { } func packDataA(a net.IP, msg []byte, off int) (int, error) { - // It must be a slice of 4, even if it is 16, we encode only the first 4 - if off+net.IPv4len > len(msg) { - return len(msg), &Error{err: "overflow packing a"} - } switch len(a) { case net.IPv4len, net.IPv6len: + // It must be a slice of 4, even if it is 16, we encode only the first 4 + if off+net.IPv4len > len(msg) { + return len(msg), &Error{err: "overflow packing a"} + } + copy(msg[off:], a.To4()) off += net.IPv4len case 0: @@ -51,12 +53,12 @@ func unpackDataAAAA(msg []byte, off int) (net.IP, int, error) { } func packDataAAAA(aaaa net.IP, msg []byte, off int) (int, error) { - if off+net.IPv6len > len(msg) { - return len(msg), &Error{err: "overflow packing aaaa"} - } - switch len(aaaa) { case net.IPv6len: + if off+net.IPv6len > len(msg) { + return len(msg), &Error{err: "overflow packing aaaa"} + } + copy(msg[off:], aaaa) off += net.IPv6len case 0: @@ -264,24 +266,36 @@ func unpackString(msg []byte, off int) (string, int, error) { return "", off, &Error{err: "overflow unpacking txt"} } l := int(msg[off]) - if off+l+1 > len(msg) { + off++ + if off+l > len(msg) { return "", off, &Error{err: "overflow unpacking txt"} } var s strings.Builder - s.Grow(l) - for _, b := range msg[off+1 : off+1+l] { + consumed := 0 + for i, b := range msg[off : off+l] { switch { case b == '"' || b == '\\': + if consumed == 0 { + s.Grow(l * 2) + } + s.Write(msg[off+consumed : off+i]) s.WriteByte('\\') s.WriteByte(b) + consumed = i + 1 case b < ' ' || b > '~': // unprintable + if consumed == 0 { + s.Grow(l * 2) + } + s.Write(msg[off+consumed : off+i]) s.WriteString(escapeByte(b)) - default: - s.WriteByte(b) + consumed = i + 1 } } - off += 1 + l - return s.String(), off, nil + if consumed == 0 { // no escaping needed + return string(msg[off : off+l]), off + l, nil + } + s.Write(msg[off+consumed : off+l]) + return s.String(), off + l, nil } func packString(s string, msg []byte, off int) (int, error) { @@ -410,100 +424,60 @@ Option: if off+int(optlen) > len(msg) { return nil, len(msg), &Error{err: "overflow unpacking opt"} } + e := makeDataOpt(code) + if err := e.unpack(msg[off : off+int(optlen)]); err != nil { + return nil, len(msg), err + } + edns = append(edns, e) + off += int(optlen) + + if off < len(msg) { + goto Option + } + + return edns, off, nil +} + +func makeDataOpt(code uint16) EDNS0 { switch code { case EDNS0NSID: - e := new(EDNS0_NSID) - if err := e.unpack(msg[off : off+int(optlen)]); err != nil { - return nil, len(msg), err - } - edns = append(edns, e) - off += int(optlen) + return new(EDNS0_NSID) case EDNS0SUBNET: - e := new(EDNS0_SUBNET) - if err := e.unpack(msg[off : off+int(optlen)]); err != nil { - return nil, len(msg), err - } - edns = append(edns, e) - off += int(optlen) + return new(EDNS0_SUBNET) case EDNS0COOKIE: - e := new(EDNS0_COOKIE) - if err := e.unpack(msg[off : off+int(optlen)]); err != nil { - return nil, len(msg), err - } - edns = append(edns, e) - off += int(optlen) + return new(EDNS0_COOKIE) + case EDNS0EXPIRE: + return new(EDNS0_EXPIRE) case EDNS0UL: - e := new(EDNS0_UL) - if err := e.unpack(msg[off : off+int(optlen)]); err != nil { - return nil, len(msg), err - } - edns = append(edns, e) - off += int(optlen) + return new(EDNS0_UL) case EDNS0LLQ: - e := new(EDNS0_LLQ) - if err := e.unpack(msg[off : off+int(optlen)]); err != nil { - return nil, len(msg), err - } - edns = append(edns, e) - off += int(optlen) + return new(EDNS0_LLQ) case EDNS0DAU: - e := new(EDNS0_DAU) - if err := e.unpack(msg[off : off+int(optlen)]); err != nil { - return nil, len(msg), err - } - edns = append(edns, e) - off += int(optlen) + return new(EDNS0_DAU) case EDNS0DHU: - e := new(EDNS0_DHU) - if err := e.unpack(msg[off : off+int(optlen)]); err != nil { - return nil, len(msg), err - } - edns = append(edns, e) - off += int(optlen) + return new(EDNS0_DHU) case EDNS0N3U: - e := new(EDNS0_N3U) - if err := e.unpack(msg[off : off+int(optlen)]); err != nil { - return nil, len(msg), err - } - edns = append(edns, e) - off += int(optlen) + return new(EDNS0_N3U) case EDNS0PADDING: - e := new(EDNS0_PADDING) - if err := e.unpack(msg[off : off+int(optlen)]); err != nil { - return nil, len(msg), err - } - edns = append(edns, e) - off += int(optlen) + return new(EDNS0_PADDING) default: e := new(EDNS0_LOCAL) e.Code = code - if err := e.unpack(msg[off : off+int(optlen)]); err != nil { - return nil, len(msg), err - } - edns = append(edns, e) - off += int(optlen) + return e } - - if off < len(msg) { - goto Option - } - - return edns, off, nil } func packDataOpt(options []EDNS0, msg []byte, off int) (int, error) { for _, el := range options { b, err := el.pack() - if err != nil || off+3 > len(msg) { + if err != nil || off+4 > len(msg) { return len(msg), &Error{err: "overflow packing opt"} } binary.BigEndian.PutUint16(msg[off:], el.Option()) // Option code binary.BigEndian.PutUint16(msg[off+2:], uint16(len(b))) // Length off += 4 if off+len(b) > len(msg) { - copy(msg[off:], b) - off = len(msg) - continue + return len(msg), &Error{err: "overflow packing opt"} } // Actual data copy(msg[off:off+len(b)], b) @@ -553,8 +527,7 @@ func unpackDataNsec(msg []byte, off int) ([]uint16, int, error) { } // Walk the bytes in the window and extract the type bits - for j := 0; j < length; j++ { - b := msg[off+j] + for j, b := range msg[off : off+length] { // Check the bits one by one, and set the type if b&0x80 == 0x80 { nsec = append(nsec, uint16(window*256+j*8+0)) @@ -587,13 +560,35 @@ func unpackDataNsec(msg []byte, off int) ([]uint16, int, error) { return nsec, off, nil } +// typeBitMapLen is a helper function which computes the "maximum" length of +// a the NSEC Type BitMap field. +func typeBitMapLen(bitmap []uint16) int { + var l int + var lastwindow, lastlength uint16 + for _, t := range bitmap { + window := t / 256 + length := (t-window*256)/8 + 1 + if window > lastwindow && lastlength != 0 { // New window, jump to the new offset + l += int(lastlength) + 2 + lastlength = 0 + } + if window < lastwindow || length < lastlength { + // packDataNsec would return Error{err: "nsec bits out of order"} here, but + // when computing the length, we want do be liberal. + continue + } + lastwindow, lastlength = window, length + } + l += int(lastlength) + 2 + return l +} + func packDataNsec(bitmap []uint16, msg []byte, off int) (int, error) { if len(bitmap) == 0 { return off, nil } var lastwindow, lastlength uint16 - for j := 0; j < len(bitmap); j++ { - t := bitmap[j] + for _, t := range bitmap { window := t / 256 length := (t-window*256)/8 + 1 if window > lastwindow && lastlength != 0 { // New window, jump to the new offset @@ -618,6 +613,65 @@ func packDataNsec(bitmap []uint16, msg []byte, off int) (int, error) { return off, nil } +func unpackDataSVCB(msg []byte, off int) ([]SVCBKeyValue, int, error) { + var xs []SVCBKeyValue + var code uint16 + var length uint16 + var err error + for off < len(msg) { + code, off, err = unpackUint16(msg, off) + if err != nil { + return nil, len(msg), &Error{err: "overflow unpacking SVCB"} + } + length, off, err = unpackUint16(msg, off) + if err != nil || off+int(length) > len(msg) { + return nil, len(msg), &Error{err: "overflow unpacking SVCB"} + } + e := makeSVCBKeyValue(SVCBKey(code)) + if e == nil { + return nil, len(msg), &Error{err: "bad SVCB key"} + } + if err := e.unpack(msg[off : off+int(length)]); err != nil { + return nil, len(msg), err + } + if len(xs) > 0 && e.Key() <= xs[len(xs)-1].Key() { + return nil, len(msg), &Error{err: "SVCB keys not in strictly increasing order"} + } + xs = append(xs, e) + off += int(length) + } + return xs, off, nil +} + +func packDataSVCB(pairs []SVCBKeyValue, msg []byte, off int) (int, error) { + pairs = append([]SVCBKeyValue(nil), pairs...) + sort.Slice(pairs, func(i, j int) bool { + return pairs[i].Key() < pairs[j].Key() + }) + prev := svcb_RESERVED + for _, el := range pairs { + if el.Key() == prev { + return len(msg), &Error{err: "repeated SVCB keys are not allowed"} + } + prev = el.Key() + packed, err := el.pack() + if err != nil { + return len(msg), err + } + off, err = packUint16(uint16(el.Key()), msg, off) + if err != nil { + return len(msg), &Error{err: "overflow packing SVCB"} + } + off, err = packUint16(uint16(len(packed)), msg, off) + if err != nil || off+len(packed) > len(msg) { + return len(msg), &Error{err: "overflow packing SVCB"} + } + copy(msg[off:off+len(packed)], packed) + off += len(packed) + } + return off, nil +} + func unpackDataDomainNames(msg []byte, off, end int) ([]string, int, error) { var ( servers []string @@ -639,11 +693,141 @@ func unpackDataDomainNames(msg []byte, off, end int) ([]string, int, error) { func packDataDomainNames(names []string, msg []byte, off int, compression compressionMap, compress bool) (int, error) { var err error - for j := 0; j < len(names); j++ { - off, err = packDomainName(names[j], msg, off, compression, compress) + for _, name := range names { + off, err = packDomainName(name, msg, off, compression, compress) + if err != nil { + return len(msg), err + } + } + return off, nil +} + +func packDataApl(data []APLPrefix, msg []byte, off int) (int, error) { + var err error + for i := range data { + off, err = packDataAplPrefix(&data[i], msg, off) if err != nil { return len(msg), err } } return off, nil } + +func packDataAplPrefix(p *APLPrefix, msg []byte, off int) (int, error) { + if len(p.Network.IP) != len(p.Network.Mask) { + return len(msg), &Error{err: "address and mask lengths don't match"} + } + + var err error + prefix, _ := p.Network.Mask.Size() + addr := p.Network.IP.Mask(p.Network.Mask)[:(prefix+7)/8] + + switch len(p.Network.IP) { + case net.IPv4len: + off, err = packUint16(1, msg, off) + case net.IPv6len: + off, err = packUint16(2, msg, off) + default: + err = &Error{err: "unrecognized address family"} + } + if err != nil { + return len(msg), err + } + + off, err = packUint8(uint8(prefix), msg, off) + if err != nil { + return len(msg), err + } + + var n uint8 + if p.Negation { + n = 0x80 + } + + // trim trailing zero bytes as specified in RFC3123 Sections 4.1 and 4.2. + i := len(addr) - 1 + for ; i >= 0 && addr[i] == 0; i-- { + } + addr = addr[:i+1] + + adflen := uint8(len(addr)) & 0x7f + off, err = packUint8(n|adflen, msg, off) + if err != nil { + return len(msg), err + } + + if off+len(addr) > len(msg) { + return len(msg), &Error{err: "overflow packing APL prefix"} + } + off += copy(msg[off:], addr) + + return off, nil +} + +func unpackDataApl(msg []byte, off int) ([]APLPrefix, int, error) { + var result []APLPrefix + for off < len(msg) { + prefix, end, err := unpackDataAplPrefix(msg, off) + if err != nil { + return nil, len(msg), err + } + off = end + result = append(result, prefix) + } + return result, off, nil +} + +func unpackDataAplPrefix(msg []byte, off int) (APLPrefix, int, error) { + family, off, err := unpackUint16(msg, off) + if err != nil { + return APLPrefix{}, len(msg), &Error{err: "overflow unpacking APL prefix"} + } + prefix, off, err := unpackUint8(msg, off) + if err != nil { + return APLPrefix{}, len(msg), &Error{err: "overflow unpacking APL prefix"} + } + nlen, off, err := unpackUint8(msg, off) + if err != nil { + return APLPrefix{}, len(msg), &Error{err: "overflow unpacking APL prefix"} + } + + var ip []byte + switch family { + case 1: + ip = make([]byte, net.IPv4len) + case 2: + ip = make([]byte, net.IPv6len) + default: + return APLPrefix{}, len(msg), &Error{err: "unrecognized APL address family"} + } + if int(prefix) > 8*len(ip) { + return APLPrefix{}, len(msg), &Error{err: "APL prefix too long"} + } + afdlen := int(nlen & 0x7f) + if afdlen > len(ip) { + return APLPrefix{}, len(msg), &Error{err: "APL length too long"} + } + if off+afdlen > len(msg) { + return APLPrefix{}, len(msg), &Error{err: "overflow unpacking APL address"} + } + off += copy(ip, msg[off:off+afdlen]) + if afdlen > 0 { + last := ip[afdlen-1] + if last == 0 { + return APLPrefix{}, len(msg), &Error{err: "extra APL address bits"} + } + } + ipnet := net.IPNet{ + IP: ip, + Mask: net.CIDRMask(int(prefix), 8*len(ip)), + } + network := ipnet.IP.Mask(ipnet.Mask) + if !network.Equal(ipnet.IP) { + return APLPrefix{}, len(msg), &Error{err: "invalid APL address length"} + } + + return APLPrefix{ + Negation: (nlen & 0x80) != 0, + Network: ipnet, + }, off, nil +} diff --git a/vendor/github.com/miekg/dns/msg_truncate.go b/vendor/github.com/miekg/dns/msg_truncate.go new file mode 100644 index 000000000000..156c5a0e876a --- /dev/null +++ b/vendor/github.com/miekg/dns/msg_truncate.go @@ -0,0 +1,112 @@ +package dns + +// Truncate ensures the reply message will fit into the requested buffer +// size by removing records that exceed the requested size. +// +// It will first check if the reply fits without compression and then with +// compression. If it won't fit with compression, Truncate then walks the +// record adding as many records as possible without exceeding the +// requested buffer size. +// +// The TC bit will be set if any records were excluded from the message. +// If the TC bit is already set on the message it will be retained. +// TC indicates that the client should retry over TCP. +// +// According to RFC 2181, the TC bit should only be set if not all of the +// "required" RRs can be included in the response. Unfortunately, we have +// no way of knowing which RRs are required so we set the TC bit if any RR +// had to be omitted from the response. +// +// The appropriate buffer size can be retrieved from the requests OPT +// record, if present, and is transport specific otherwise. dns.MinMsgSize +// should be used for UDP requests without an OPT record, and +// dns.MaxMsgSize for TCP requests without an OPT record. +func (dns *Msg) Truncate(size int) { + if dns.IsTsig() != nil { + // To simplify this implementation, we don't perform + // truncation on responses with a TSIG record. + return + } + + // RFC 6891 mandates that the payload size in an OPT record + // less than 512 (MinMsgSize) bytes must be treated as equal to 512 bytes. + // + // For ease of use, we impose that restriction here. + if size < MinMsgSize { + size = MinMsgSize + } + + l := msgLenWithCompressionMap(dns, nil) // uncompressed length + if l <= size { + // Don't waste effort compressing this message. + dns.Compress = false + return + } + + dns.Compress = true + + edns0 := dns.popEdns0() + if edns0 != nil { + // Account for the OPT record that gets added at the end, + // by subtracting that length from our budget. + // + // The EDNS(0) OPT record must have the root domain and + // it's length is thus unaffected by compression. + size -= Len(edns0) + } + + compression := make(map[string]struct{}) + + l = headerSize + for _, r := range dns.Question { + l += r.len(l, compression) + } + + var numAnswer int + if l < size { + l, numAnswer = truncateLoop(dns.Answer, size, l, compression) + } + + var numNS int + if l < size { + l, numNS = truncateLoop(dns.Ns, size, l, compression) + } + + var numExtra int + if l < size { + _, numExtra = truncateLoop(dns.Extra, size, l, compression) + } + + // See the function documentation for when we set this. + dns.Truncated = dns.Truncated || len(dns.Answer) > numAnswer || + len(dns.Ns) > numNS || len(dns.Extra) > numExtra + + dns.Answer = dns.Answer[:numAnswer] + dns.Ns = dns.Ns[:numNS] + dns.Extra = dns.Extra[:numExtra] + + if edns0 != nil { + // Add the OPT record back onto the additional section. + dns.Extra = append(dns.Extra, edns0) + } +} + +func truncateLoop(rrs []RR, size, l int, compression map[string]struct{}) (int, int) { + for i, r := range rrs { + if r == nil { + continue + } + + l += r.len(l, compression) + if l > size { + // Return size, rather than l prior to this record, + // to prevent any further records being added. + return size, i + } + if l == size { + return l, i + 1 + } + } + + return l, len(rrs) +} diff --git a/vendor/github.com/miekg/dns/nsecx.go b/vendor/github.com/miekg/dns/nsecx.go index 8f071a47399d..f8826817b398 100644 --- a/vendor/github.com/miekg/dns/nsecx.go +++ b/vendor/github.com/miekg/dns/nsecx.go @@ -43,7 +43,7 @@ func HashName(label string, ha uint8, iter uint16, salt string) string { return toBase32(nsec3) } -// Cover returns true if a name is covered by the NSEC3 record +// Cover returns true if a name is covered by the NSEC3 record. func (rr *NSEC3) Cover(name string) bool { nameHash := HashName(name, rr.Hash, rr.Iterations, rr.Salt) owner := strings.ToUpper(rr.Hdr.Name) diff --git a/vendor/github.com/miekg/dns/privaterr.go b/vendor/github.com/miekg/dns/privaterr.go index d9c0d26774f0..cda6cae31e12 100644 --- a/vendor/github.com/miekg/dns/privaterr.go +++ b/vendor/github.com/miekg/dns/privaterr.go @@ -1,9 +1,6 @@ package dns -import ( - "fmt" - "strings" -) +import "strings" // PrivateRdata is an interface used for implementing "Private Use" RR types, see // RFC 6895. This allows one to experiment with new RR types, without requesting an @@ -16,9 +13,8 @@ type PrivateRdata interface { // Pack is used when packing a private RR into a buffer. Pack([]byte) (int, error) // Unpack is used when unpacking a private RR from a buffer. - // TODO(miek): diff. signature than Pack, see edns0.go for instance. Unpack([]byte) (int, error) - // Copy copies the Rdata. + // Copy copies the Rdata into the PrivateRdata argument. Copy(PrivateRdata) error // Len returns the length in octets of the Rdata. Len() int @@ -29,22 +25,8 @@ type PrivateRdata interface { type PrivateRR struct { Hdr RR_Header Data PrivateRdata -} - -func mkPrivateRR(rrtype uint16) *PrivateRR { - // Panics if RR is not an instance of PrivateRR. - rrfunc, ok := TypeToRR[rrtype] - if !ok { - panic(fmt.Sprintf("dns: invalid operation with Private RR type %d", rrtype)) - } - - anyrr := rrfunc() - rr, ok := anyrr.(*PrivateRR) - if !ok { - panic(fmt.Sprintf("dns: RR is not a PrivateRR, TypeToRR[%d] generator returned %T", rrtype, anyrr)) - } - return rr + generator func() PrivateRdata // for copy } // Header return the RR header of r. @@ -61,13 +43,12 @@ func (r *PrivateRR) len(off int, compression map[string]struct{}) int { func (r *PrivateRR) copy() RR { // make new RR like this: - rr := mkPrivateRR(r.Hdr.Rrtype) - rr.Hdr = r.Hdr + rr := &PrivateRR{r.Hdr, r.generator(), r.generator} - err := r.Data.Copy(rr.Data) - if err != nil { - panic("dns: got value that could not be used to copy Private rdata") + if err := r.Data.Copy(rr.Data); err != nil { + panic("dns: got value that could not be used to copy Private rdata: " + err.Error()) } + return rr } @@ -86,7 +67,7 @@ func (r *PrivateRR) unpack(msg []byte, off int) (int, error) { return off, err } -func (r *PrivateRR) parse(c *zlexer, origin, file string) *ParseError { +func (r *PrivateRR) parse(c *zlexer, origin string) *ParseError { var l lex text := make([]string, 0, 2) // could be 0..N elements, median is probably 1 Fetch: @@ -103,7 +84,7 @@ Fetch: err := r.Data.Parse(text) if err != nil { - return &ParseError{file, err.Error(), l} + return &ParseError{"", err.Error(), l} } return nil @@ -116,7 +97,7 @@ func (r1 *PrivateRR) isDuplicate(r2 RR) bool { return false } func PrivateHandle(rtypestr string, rtype uint16, generator func() PrivateRdata) { rtypestr = strings.ToUpper(rtypestr) - TypeToRR[rtype] = func() RR { return &PrivateRR{RR_Header{}, generator()} } + TypeToRR[rtype] = func() RR { return &PrivateRR{RR_Header{}, generator(), generator} } TypeToString[rtype] = rtypestr StringToType[rtypestr] = rtype } diff --git a/vendor/github.com/miekg/dns/scan.go b/vendor/github.com/miekg/dns/scan.go index a8691bca70ac..aa2840efba89 100644 --- a/vendor/github.com/miekg/dns/scan.go +++ b/vendor/github.com/miekg/dns/scan.go @@ -87,31 +87,18 @@ type lex struct { column int // column in the file } -// Token holds the token that are returned when a zone file is parsed. -type Token struct { - // The scanned resource record when error is not nil. - RR - // When an error occurred, this has the error specifics. - Error *ParseError - // A potential comment positioned after the RR and on the same line. - Comment string -} - // ttlState describes the state necessary to fill in an omitted RR TTL type ttlState struct { ttl uint32 // ttl is the current default TTL isByDirective bool // isByDirective indicates whether ttl was set by a $TTL directive } -// NewRR reads the RR contained in the string s. Only the first RR is -// returned. If s contains no records, NewRR will return nil with no -// error. -// -// The class defaults to IN and TTL defaults to 3600. The full zone -// file syntax like $TTL, $ORIGIN, etc. is supported. +// NewRR reads the RR contained in the string s. Only the first RR is returned. +// If s contains no records, NewRR will return nil with no error. // -// All fields of the returned RR are set, except RR.Header().Rdlength -// which is set to 0. +// The class defaults to IN and TTL defaults to 3600. The full zone file syntax +// like $TTL, $ORIGIN, etc. is supported. All fields of the returned RR are +// set, except RR.Header().Rdlength which is set to 0. func NewRR(s string) (RR, error) { if len(s) > 0 && s[len(s)-1] != '\n' { // We need a closing newline return ReadRR(strings.NewReader(s+"\n"), "") @@ -133,69 +120,6 @@ func ReadRR(r io.Reader, file string) (RR, error) { return rr, zp.Err() } -// ParseZone reads a RFC 1035 style zonefile from r. It returns -// *Tokens on the returned channel, each consisting of either a -// parsed RR and optional comment or a nil RR and an error. The -// channel is closed by ParseZone when the end of r is reached. -// -// The string file is used in error reporting and to resolve relative -// $INCLUDE directives. The string origin is used as the initial -// origin, as if the file would start with an $ORIGIN directive. -// -// The directives $INCLUDE, $ORIGIN, $TTL and $GENERATE are all -// supported. -// -// Basic usage pattern when reading from a string (z) containing the -// zone data: -// -// for x := range dns.ParseZone(strings.NewReader(z), "", "") { -// if x.Error != nil { -// // log.Println(x.Error) -// } else { -// // Do something with x.RR -// } -// } -// -// Comments specified after an RR (and on the same line!) are -// returned too: -// -// foo. IN A 10.0.0.1 ; this is a comment -// -// The text "; this is comment" is returned in Token.Comment. -// Comments inside the RR are returned concatenated along with the -// RR. Comments on a line by themselves are discarded. -// -// To prevent memory leaks it is important to always fully drain the -// returned channel. If an error occurs, it will always be the last -// Token sent on the channel. -// -// Deprecated: New users should prefer the ZoneParser API. -func ParseZone(r io.Reader, origin, file string) chan *Token { - t := make(chan *Token, 10000) - go parseZone(r, origin, file, t) - return t -} - -func parseZone(r io.Reader, origin, file string, t chan *Token) { - defer close(t) - - zp := NewZoneParser(r, origin, file) - zp.SetIncludeAllowed(true) - - for rr, ok := zp.Next(); ok; rr, ok = zp.Next() { - t <- &Token{RR: rr, Comment: zp.Comment()} - } - - if err := zp.Err(); err != nil { - pe, ok := err.(*ParseError) - if !ok { - pe = &ParseError{file: file, err: err.Error()} - } - - t <- &Token{Error: pe} - } -} - // ZoneParser is a parser for an RFC 1035 style zonefile. // // Each parsed RR in the zone is returned sequentially from Next. An @@ -203,6 +127,7 @@ func parseZone(r io.Reader, origin, file string, t chan *Token) { // // The directives $INCLUDE, $ORIGIN, $TTL and $GENERATE are all // supported. Although $INCLUDE is disabled by default. +// Note that $GENERATE's range support up to a maximum of 65535 steps. // // Basic usage pattern when reading from a string (z) containing the // zone data: @@ -245,7 +170,8 @@ type ZoneParser struct { includeDepth uint8 - includeAllowed bool + includeAllowed bool + generateDisallowed bool } // NewZoneParser returns an RFC 1035 style zonefile parser that reads @@ -503,9 +429,8 @@ func (zp *ZoneParser) Next() (RR, bool) { return zp.setParseError("expecting $TTL value, not this...", l) } - if e := slurpRemainder(zp.c, zp.file); e != nil { - zp.parseErr = e - return nil, false + if err := slurpRemainder(zp.c); err != nil { + return zp.setParseError(err.err, err.lex) } ttl, ok := stringToTTL(l.token) @@ -527,9 +452,8 @@ func (zp *ZoneParser) Next() (RR, bool) { return zp.setParseError("expecting $ORIGIN value, not this...", l) } - if e := slurpRemainder(zp.c, zp.file); e != nil { - zp.parseErr = e - return nil, false + if err := slurpRemainder(zp.c); err != nil { + return zp.setParseError(err.err, err.lex) } name, ok := toAbsoluteName(l.token, zp.origin) @@ -547,6 +471,9 @@ func (zp *ZoneParser) Next() (RR, bool) { st = zExpectDirGenerate case zExpectDirGenerate: + if zp.generateDisallowed { + return zp.setParseError("nested $GENERATE directive not allowed", l) + } if l.value != zString { return zp.setParseError("expecting $GENERATE value, not this...", l) } @@ -650,19 +577,44 @@ func (zp *ZoneParser) Next() (RR, bool) { st = zExpectRdata case zExpectRdata: - r, e := setRR(*h, zp.c, zp.origin, zp.file) - if e != nil { - // If e.lex is nil than we have encounter a unknown RR type - // in that case we substitute our current lex token - if e.lex.token == "" && e.lex.value == 0 { - e.lex = l // Uh, dirty + var rr RR + if newFn, ok := TypeToRR[h.Rrtype]; ok && canParseAsRR(h.Rrtype) { + rr = newFn() + *rr.Header() = *h + } else { + rr = &RFC3597{Hdr: *h} + } + + _, isPrivate := rr.(*PrivateRR) + if !isPrivate && zp.c.Peek().token == "" { + // This is a dynamic update rr. + + // TODO(tmthrgd): Previously slurpRemainder was only called + // for certain RR types, which may have been important. + if err := slurpRemainder(zp.c); err != nil { + return zp.setParseError(err.err, err.lex) + } + + return rr, true + } else if l.value == zNewline { + return zp.setParseError("unexpected newline", l) + } + + if err := rr.parse(zp.c, zp.origin); err != nil { + // err is a concrete *ParseError without the file field set. + // The setParseError call below will construct a new + // *ParseError with file set to zp.file. + + // If err.lex is nil than we have encounter an unknown RR type + // in that case we substitute our current lex token. + if err.lex == (lex{}) { + return zp.setParseError(err.err, l) } - zp.parseErr = e - return nil, false + return zp.setParseError(err.err, err.lex) } - return r, true + return rr, true } } @@ -671,6 +623,18 @@ func (zp *ZoneParser) Next() (RR, bool) { return nil, false } +// canParseAsRR returns true if the record type can be parsed as a +// concrete RR. It blacklists certain record types that must be parsed +// according to RFC 3597 because they lack a presentation format. +func canParseAsRR(rrtype uint16) bool { + switch rrtype { + case TypeANY, TypeNULL, TypeOPT, TypeTSIG: + return false + default: + return true + } +} + type zlexer struct { br io.ByteReader @@ -682,7 +646,8 @@ type zlexer struct { comBuf string comment string - l lex + l lex + cachedL *lex brace int quote bool @@ -748,13 +713,37 @@ func (zl *zlexer) readByte() (byte, bool) { return c, true } +func (zl *zlexer) Peek() lex { + if zl.nextL { + return zl.l + } + + l, ok := zl.Next() + if !ok { + return l + } + + if zl.nextL { + // Cache l. Next returns zl.cachedL then zl.l. + zl.cachedL = &l + } else { + // In this case l == zl.l, so we just tell Next to return zl.l. + zl.nextL = true + } + + return l +} + func (zl *zlexer) Next() (lex, bool) { l := &zl.l - if zl.nextL { + switch { + case zl.cachedL != nil: + l, zl.cachedL = zl.cachedL, nil + return *l, true + case zl.nextL: zl.nextL = false return *l, true - } - if l.err { + case l.err: // Parsing errors should be sticky. return lex{value: zEOF}, false } @@ -908,6 +897,11 @@ func (zl *zlexer) Next() (lex, bool) { // was inside braces and we delayed adding it until now. com[comi] = ' ' // convert newline to space comi++ + if comi >= len(com) { + l.token = "comment length insufficient for parsing" + l.err = true + return *l, true + } } com[comi] = ';' @@ -1216,11 +1210,29 @@ func stringToCm(token string) (e, m uint8, ok bool) { if cmeters, err = strconv.Atoi(s[1]); err != nil { return } + // There's no point in having more than 2 digits in this part, and would rather make the implementation complicated ('123' should be treated as '12'). + // So we simply reject it. + // We also make sure the first character is a digit to reject '+-' signs. + if len(s[1]) > 2 || s[1][0] < '0' || s[1][0] > '9' { + return + } + if len(s[1]) == 1 { + // 'nn.1' must be treated as 'nn-meters and 10cm, not 1cm. + cmeters *= 10 + } + if len(s[0]) == 0 { + // This will allow omitting the 'meter' part, like .01 (meaning 0.01m = 1cm). + break + } fallthrough case 1: if meters, err = strconv.Atoi(s[0]); err != nil { return } + // RFC1876 states the max value is 90000000.00. The latter two conditions enforce it. + if s[0][0] < '0' || s[0][0] > '9' || meters > 90000000 || (meters == 90000000 && cmeters != 0) { + return + } case 0: // huh? return 0, 0, false @@ -1233,13 +1245,10 @@ func stringToCm(token string) (e, m uint8, ok bool) { e = 0 val = cmeters } - for val > 10 { + for val >= 10 { e++ val /= 10 } - if e > 9 { - ok = false - } m = uint8(val) return } @@ -1281,6 +1290,9 @@ func appendOrigin(name, origin string) string { // LOC record helper function func locCheckNorth(token string, latitude uint32) (uint32, bool) { + if latitude > 90 * 1000 * 60 * 60 { + return latitude, false + } switch token { case "n", "N": return LOC_EQUATOR + latitude, true @@ -1292,6 +1304,9 @@ func locCheckNorth(token string, latitude uint32) (uint32, bool) { // LOC record helper function func locCheckEast(token string, longitude uint32) (uint32, bool) { + if longitude > 180 * 1000 * 60 * 60 { + return longitude, false + } switch token { case "e", "E": return LOC_EQUATOR + longitude, true @@ -1302,18 +1317,18 @@ func locCheckEast(token string, longitude uint32) (uint32, bool) { } // "Eat" the rest of the "line" -func slurpRemainder(c *zlexer, f string) *ParseError { +func slurpRemainder(c *zlexer) *ParseError { l, _ := c.Next() switch l.value { case zBlank: l, _ = c.Next() if l.value != zNewline && l.value != zEOF { - return &ParseError{f, "garbage after rdata", l} + return &ParseError{"", "garbage after rdata", l} } case zNewline: case zEOF: default: - return &ParseError{f, "garbage after rdata", l} + return &ParseError{"", "garbage after rdata", l} } return nil } diff --git a/vendor/github.com/miekg/dns/scan_rr.go b/vendor/github.com/miekg/dns/scan_rr.go index f48ff7890e8f..69f10052f4eb 100644 --- a/vendor/github.com/miekg/dns/scan_rr.go +++ b/vendor/github.com/miekg/dns/scan_rr.go @@ -1,75 +1,42 @@ package dns import ( + "bytes" "encoding/base64" "net" "strconv" "strings" ) -// Parse the rdata of each rrtype. -// All data from the channel c is either zString or zBlank. -// After the rdata there may come a zBlank and then a zNewline -// or immediately a zNewline. If this is not the case we flag -// an *ParseError: garbage after rdata. -func setRR(h RR_Header, c *zlexer, o, f string) (RR, *ParseError) { - var rr RR - if newFn, ok := TypeToRR[h.Rrtype]; ok && canParseAsRR(h.Rrtype) { - rr = newFn() - *rr.Header() = h - } else { - rr = &RFC3597{Hdr: h} - } - - err := rr.parse(c, o, f) - if err != nil { - return nil, err - } - - return rr, nil -} - -// canParseAsRR returns true if the record type can be parsed as a -// concrete RR. It blacklists certain record types that must be parsed -// according to RFC 3597 because they lack a presentation format. -func canParseAsRR(rrtype uint16) bool { - switch rrtype { - case TypeANY, TypeNULL, TypeOPT, TypeTSIG: - return false - default: - return true - } -} - // A remainder of the rdata with embedded spaces, return the parsed string (sans the spaces) // or an error -func endingToString(c *zlexer, errstr, f string) (string, *ParseError) { - var s string +func endingToString(c *zlexer, errstr string) (string, *ParseError) { + var buffer bytes.Buffer l, _ := c.Next() // zString for l.value != zNewline && l.value != zEOF { if l.err { - return s, &ParseError{f, errstr, l} + return buffer.String(), &ParseError{"", errstr, l} } switch l.value { case zString: - s += l.token + buffer.WriteString(l.token) case zBlank: // Ok default: - return "", &ParseError{f, errstr, l} + return "", &ParseError{"", errstr, l} } l, _ = c.Next() } - return s, nil + return buffer.String(), nil } // A remainder of the rdata with embedded spaces, split on unquoted whitespace // and return the parsed string slice or an error -func endingToTxtSlice(c *zlexer, errstr, f string) ([]string, *ParseError) { +func endingToTxtSlice(c *zlexer, errstr string) ([]string, *ParseError) { // Get the remaining data until we see a zNewline l, _ := c.Next() if l.err { - return nil, &ParseError{f, errstr, l} + return nil, &ParseError{"", errstr, l} } // Build the slice @@ -78,7 +45,7 @@ func endingToTxtSlice(c *zlexer, errstr, f string) ([]string, *ParseError) { empty := false for l.value != zNewline && l.value != zEOF { if l.err { - return nil, &ParseError{f, errstr, l} + return nil, &ParseError{"", errstr, l} } switch l.value { case zString: @@ -105,7 +72,7 @@ func endingToTxtSlice(c *zlexer, errstr, f string) ([]string, *ParseError) { case zBlank: if quote { // zBlank can only be seen in between txt parts. - return nil, &ParseError{f, errstr, l} + return nil, &ParseError{"", errstr, l} } case zQuote: if empty && quote { @@ -114,99 +81,79 @@ func endingToTxtSlice(c *zlexer, errstr, f string) ([]string, *ParseError) { quote = !quote empty = true default: - return nil, &ParseError{f, errstr, l} + return nil, &ParseError{"", errstr, l} } l, _ = c.Next() } if quote { - return nil, &ParseError{f, errstr, l} + return nil, &ParseError{"", errstr, l} } return s, nil } -func (rr *A) parse(c *zlexer, o, f string) *ParseError { +func (rr *A) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - rr.A = net.ParseIP(l.token) - if rr.A == nil || l.err { - return &ParseError{f, "bad A A", l} + // IPv4 addresses cannot include ":". + // We do this rather than use net.IP's To4() because + // To4() treats IPv4-mapped IPv6 addresses as being + // IPv4. + isIPv4 := !strings.Contains(l.token, ":") + if rr.A == nil || !isIPv4 || l.err { + return &ParseError{"", "bad A A", l} } - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *AAAA) parse(c *zlexer, o, f string) *ParseError { +func (rr *AAAA) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - rr.AAAA = net.ParseIP(l.token) - if rr.AAAA == nil || l.err { - return &ParseError{f, "bad AAAA AAAA", l} + // IPv6 addresses must include ":", and IPv4 + // addresses cannot include ":". + isIPv6 := strings.Contains(l.token, ":") + if rr.AAAA == nil || !isIPv6 || l.err { + return &ParseError{"", "bad AAAA AAAA", l} } - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *NS) parse(c *zlexer, o, f string) *ParseError { +func (rr *NS) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - rr.Ns = l.token - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{f, "bad NS Ns", l} + return &ParseError{"", "bad NS Ns", l} } rr.Ns = name - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *PTR) parse(c *zlexer, o, f string) *ParseError { +func (rr *PTR) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - rr.Ptr = l.token - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{f, "bad PTR Ptr", l} + return &ParseError{"", "bad PTR Ptr", l} } rr.Ptr = name - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *NSAPPTR) parse(c *zlexer, o, f string) *ParseError { +func (rr *NSAPPTR) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - rr.Ptr = l.token - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{f, "bad NSAP-PTR Ptr", l} + return &ParseError{"", "bad NSAP-PTR Ptr", l} } rr.Ptr = name - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *RP) parse(c *zlexer, o, f string) *ParseError { +func (rr *RP) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - rr.Mbox = l.token - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - mbox, mboxOk := toAbsoluteName(l.token, o) if l.err || !mboxOk { - return &ParseError{f, "bad RP Mbox", l} + return &ParseError{"", "bad RP Mbox", l} } rr.Mbox = mbox @@ -216,60 +163,45 @@ func (rr *RP) parse(c *zlexer, o, f string) *ParseError { txt, txtOk := toAbsoluteName(l.token, o) if l.err || !txtOk { - return &ParseError{f, "bad RP Txt", l} + return &ParseError{"", "bad RP Txt", l} } rr.Txt = txt - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *MR) parse(c *zlexer, o, f string) *ParseError { +func (rr *MR) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - rr.Mr = l.token - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{f, "bad MR Mr", l} + return &ParseError{"", "bad MR Mr", l} } rr.Mr = name - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *MB) parse(c *zlexer, o, f string) *ParseError { +func (rr *MB) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - rr.Mb = l.token - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{f, "bad MB Mb", l} + return &ParseError{"", "bad MB Mb", l} } rr.Mb = name - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *MG) parse(c *zlexer, o, f string) *ParseError { +func (rr *MG) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - rr.Mg = l.token - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{f, "bad MG Mg", l} + return &ParseError{"", "bad MG Mg", l} } rr.Mg = name - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *HINFO) parse(c *zlexer, o, f string) *ParseError { - chunks, e := endingToTxtSlice(c, "bad HINFO Fields", f) +func (rr *HINFO) parse(c *zlexer, o string) *ParseError { + chunks, e := endingToTxtSlice(c, "bad HINFO Fields") if e != nil { return e } @@ -291,16 +223,11 @@ func (rr *HINFO) parse(c *zlexer, o, f string) *ParseError { return nil } -func (rr *MINFO) parse(c *zlexer, o, f string) *ParseError { +func (rr *MINFO) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - rr.Rmail = l.token - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - rmail, rmailOk := toAbsoluteName(l.token, o) if l.err || !rmailOk { - return &ParseError{f, "bad MINFO Rmail", l} + return &ParseError{"", "bad MINFO Rmail", l} } rr.Rmail = rmail @@ -310,52 +237,38 @@ func (rr *MINFO) parse(c *zlexer, o, f string) *ParseError { email, emailOk := toAbsoluteName(l.token, o) if l.err || !emailOk { - return &ParseError{f, "bad MINFO Email", l} + return &ParseError{"", "bad MINFO Email", l} } rr.Email = email - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *MF) parse(c *zlexer, o, f string) *ParseError { +func (rr *MF) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - rr.Mf = l.token - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{f, "bad MF Mf", l} + return &ParseError{"", "bad MF Mf", l} } rr.Mf = name - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *MD) parse(c *zlexer, o, f string) *ParseError { +func (rr *MD) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - rr.Md = l.token - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{f, "bad MD Md", l} + return &ParseError{"", "bad MD Md", l} } rr.Md = name - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *MX) parse(c *zlexer, o, f string) *ParseError { +func (rr *MX) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{f, "bad MX Pref", l} + return &ParseError{"", "bad MX Pref", l} } rr.Preference = uint16(i) @@ -365,22 +278,18 @@ func (rr *MX) parse(c *zlexer, o, f string) *ParseError { name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{f, "bad MX Mx", l} + return &ParseError{"", "bad MX Mx", l} } rr.Mx = name - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *RT) parse(c *zlexer, o, f string) *ParseError { +func (rr *RT) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - i, e := strconv.ParseUint(l.token, 10, 16) if e != nil { - return &ParseError{f, "bad RT Preference", l} + return &ParseError{"", "bad RT Preference", l} } rr.Preference = uint16(i) @@ -390,22 +299,18 @@ func (rr *RT) parse(c *zlexer, o, f string) *ParseError { name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{f, "bad RT Host", l} + return &ParseError{"", "bad RT Host", l} } rr.Host = name - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *AFSDB) parse(c *zlexer, o, f string) *ParseError { +func (rr *AFSDB) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{f, "bad AFSDB Subtype", l} + return &ParseError{"", "bad AFSDB Subtype", l} } rr.Subtype = uint16(i) @@ -415,34 +320,26 @@ func (rr *AFSDB) parse(c *zlexer, o, f string) *ParseError { name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{f, "bad AFSDB Hostname", l} + return &ParseError{"", "bad AFSDB Hostname", l} } rr.Hostname = name - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *X25) parse(c *zlexer, o, f string) *ParseError { +func (rr *X25) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - if l.err { - return &ParseError{f, "bad X25 PSDNAddress", l} + return &ParseError{"", "bad X25 PSDNAddress", l} } rr.PSDNAddress = l.token - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *KX) parse(c *zlexer, o, f string) *ParseError { +func (rr *KX) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{f, "bad KX Pref", l} + return &ParseError{"", "bad KX Pref", l} } rr.Preference = uint16(i) @@ -452,52 +349,37 @@ func (rr *KX) parse(c *zlexer, o, f string) *ParseError { name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{f, "bad KX Exchanger", l} + return &ParseError{"", "bad KX Exchanger", l} } rr.Exchanger = name - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *CNAME) parse(c *zlexer, o, f string) *ParseError { +func (rr *CNAME) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - rr.Target = l.token - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{f, "bad CNAME Target", l} + return &ParseError{"", "bad CNAME Target", l} } rr.Target = name - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *DNAME) parse(c *zlexer, o, f string) *ParseError { +func (rr *DNAME) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - rr.Target = l.token - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{f, "bad DNAME Target", l} + return &ParseError{"", "bad DNAME Target", l} } rr.Target = name - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *SOA) parse(c *zlexer, o, f string) *ParseError { +func (rr *SOA) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - rr.Ns = l.token - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - ns, nsOk := toAbsoluteName(l.token, o) if l.err || !nsOk { - return &ParseError{f, "bad SOA Ns", l} + return &ParseError{"", "bad SOA Ns", l} } rr.Ns = ns @@ -507,7 +389,7 @@ func (rr *SOA) parse(c *zlexer, o, f string) *ParseError { mbox, mboxOk := toAbsoluteName(l.token, o) if l.err || !mboxOk { - return &ParseError{f, "bad SOA Mbox", l} + return &ParseError{"", "bad SOA Mbox", l} } rr.Mbox = mbox @@ -520,16 +402,16 @@ func (rr *SOA) parse(c *zlexer, o, f string) *ParseError { for i := 0; i < 5; i++ { l, _ = c.Next() if l.err { - return &ParseError{f, "bad SOA zone parameter", l} + return &ParseError{"", "bad SOA zone parameter", l} } - if j, e := strconv.ParseUint(l.token, 10, 32); e != nil { + if j, err := strconv.ParseUint(l.token, 10, 32); err != nil { if i == 0 { // Serial must be a number - return &ParseError{f, "bad SOA zone parameter", l} + return &ParseError{"", "bad SOA zone parameter", l} } // We allow other fields to be unitful duration strings if v, ok = stringToTTL(l.token); !ok { - return &ParseError{f, "bad SOA zone parameter", l} + return &ParseError{"", "bad SOA zone parameter", l} } } else { @@ -552,34 +434,30 @@ func (rr *SOA) parse(c *zlexer, o, f string) *ParseError { rr.Minttl = v } } - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *SRV) parse(c *zlexer, o, f string) *ParseError { +func (rr *SRV) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{f, "bad SRV Priority", l} + return &ParseError{"", "bad SRV Priority", l} } rr.Priority = uint16(i) c.Next() // zBlank l, _ = c.Next() // zString - i, e = strconv.ParseUint(l.token, 10, 16) - if e != nil || l.err { - return &ParseError{f, "bad SRV Weight", l} + i, e1 := strconv.ParseUint(l.token, 10, 16) + if e1 != nil || l.err { + return &ParseError{"", "bad SRV Weight", l} } rr.Weight = uint16(i) c.Next() // zBlank l, _ = c.Next() // zString - i, e = strconv.ParseUint(l.token, 10, 16) - if e != nil || l.err { - return &ParseError{f, "bad SRV Port", l} + i, e2 := strconv.ParseUint(l.token, 10, 16) + if e2 != nil || l.err { + return &ParseError{"", "bad SRV Port", l} } rr.Port = uint16(i) @@ -589,29 +467,25 @@ func (rr *SRV) parse(c *zlexer, o, f string) *ParseError { name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{f, "bad SRV Target", l} + return &ParseError{"", "bad SRV Target", l} } rr.Target = name - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *NAPTR) parse(c *zlexer, o, f string) *ParseError { +func (rr *NAPTR) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{f, "bad NAPTR Order", l} + return &ParseError{"", "bad NAPTR Order", l} } rr.Order = uint16(i) c.Next() // zBlank l, _ = c.Next() // zString - i, e = strconv.ParseUint(l.token, 10, 16) - if e != nil || l.err { - return &ParseError{f, "bad NAPTR Preference", l} + i, e1 := strconv.ParseUint(l.token, 10, 16) + if e1 != nil || l.err { + return &ParseError{"", "bad NAPTR Preference", l} } rr.Preference = uint16(i) @@ -619,57 +493,57 @@ func (rr *NAPTR) parse(c *zlexer, o, f string) *ParseError { c.Next() // zBlank l, _ = c.Next() // _QUOTE if l.value != zQuote { - return &ParseError{f, "bad NAPTR Flags", l} + return &ParseError{"", "bad NAPTR Flags", l} } l, _ = c.Next() // Either String or Quote if l.value == zString { rr.Flags = l.token l, _ = c.Next() // _QUOTE if l.value != zQuote { - return &ParseError{f, "bad NAPTR Flags", l} + return &ParseError{"", "bad NAPTR Flags", l} } } else if l.value == zQuote { rr.Flags = "" } else { - return &ParseError{f, "bad NAPTR Flags", l} + return &ParseError{"", "bad NAPTR Flags", l} } // Service c.Next() // zBlank l, _ = c.Next() // _QUOTE if l.value != zQuote { - return &ParseError{f, "bad NAPTR Service", l} + return &ParseError{"", "bad NAPTR Service", l} } l, _ = c.Next() // Either String or Quote if l.value == zString { rr.Service = l.token l, _ = c.Next() // _QUOTE if l.value != zQuote { - return &ParseError{f, "bad NAPTR Service", l} + return &ParseError{"", "bad NAPTR Service", l} } } else if l.value == zQuote { rr.Service = "" } else { - return &ParseError{f, "bad NAPTR Service", l} + return &ParseError{"", "bad NAPTR Service", l} } // Regexp c.Next() // zBlank l, _ = c.Next() // _QUOTE if l.value != zQuote { - return &ParseError{f, "bad NAPTR Regexp", l} + return &ParseError{"", "bad NAPTR Regexp", l} } l, _ = c.Next() // Either String or Quote if l.value == zString { rr.Regexp = l.token l, _ = c.Next() // _QUOTE if l.value != zQuote { - return &ParseError{f, "bad NAPTR Regexp", l} + return &ParseError{"", "bad NAPTR Regexp", l} } } else if l.value == zQuote { rr.Regexp = "" } else { - return &ParseError{f, "bad NAPTR Regexp", l} + return &ParseError{"", "bad NAPTR Regexp", l} } // After quote no space?? @@ -679,22 +553,17 @@ func (rr *NAPTR) parse(c *zlexer, o, f string) *ParseError { name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{f, "bad NAPTR Replacement", l} + return &ParseError{"", "bad NAPTR Replacement", l} } rr.Replacement = name - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *TALINK) parse(c *zlexer, o, f string) *ParseError { +func (rr *TALINK) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - rr.PreviousName = l.token - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - previousName, previousNameOk := toAbsoluteName(l.token, o) if l.err || !previousNameOk { - return &ParseError{f, "bad TALINK PreviousName", l} + return &ParseError{"", "bad TALINK PreviousName", l} } rr.PreviousName = previousName @@ -704,28 +573,25 @@ func (rr *TALINK) parse(c *zlexer, o, f string) *ParseError { nextName, nextNameOk := toAbsoluteName(l.token, o) if l.err || !nextNameOk { - return &ParseError{f, "bad TALINK NextName", l} + return &ParseError{"", "bad TALINK NextName", l} } rr.NextName = nextName - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *LOC) parse(c *zlexer, o, f string) *ParseError { +func (rr *LOC) parse(c *zlexer, o string) *ParseError { // Non zero defaults for LOC record, see RFC 1876, Section 3. - rr.HorizPre = 165 // 10000 - rr.VertPre = 162 // 10 - rr.Size = 18 // 1 + rr.Size = 0x12 // 1e2 cm (1m) + rr.HorizPre = 0x16 // 1e6 cm (10000m) + rr.VertPre = 0x13 // 1e3 cm (10m) ok := false // North l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return nil - } i, e := strconv.ParseUint(l.token, 10, 32) - if e != nil || l.err { - return &ParseError{f, "bad LOC Latitude", l} + if e != nil || l.err || i > 90 { + return &ParseError{"", "bad LOC Latitude", l} } rr.Latitude = 1000 * 60 * 60 * uint32(i) @@ -735,16 +601,16 @@ func (rr *LOC) parse(c *zlexer, o, f string) *ParseError { if rr.Latitude, ok = locCheckNorth(l.token, rr.Latitude); ok { goto East } - i, e = strconv.ParseUint(l.token, 10, 32) - if e != nil || l.err { - return &ParseError{f, "bad LOC Latitude minutes", l} + if i, err := strconv.ParseUint(l.token, 10, 32); err != nil || l.err || i > 59 { + return &ParseError{"", "bad LOC Latitude minutes", l} + } else { + rr.Latitude += 1000 * 60 * uint32(i) } - rr.Latitude += 1000 * 60 * uint32(i) c.Next() // zBlank l, _ = c.Next() - if i, e := strconv.ParseFloat(l.token, 32); e != nil || l.err { - return &ParseError{f, "bad LOC Latitude seconds", l} + if i, err := strconv.ParseFloat(l.token, 32); err != nil || l.err || i < 0 || i >= 60 { + return &ParseError{"", "bad LOC Latitude seconds", l} } else { rr.Latitude += uint32(1000 * i) } @@ -755,14 +621,14 @@ func (rr *LOC) parse(c *zlexer, o, f string) *ParseError { goto East } // If still alive, flag an error - return &ParseError{f, "bad LOC Latitude North/South", l} + return &ParseError{"", "bad LOC Latitude North/South", l} East: // East c.Next() // zBlank l, _ = c.Next() - if i, e := strconv.ParseUint(l.token, 10, 32); e != nil || l.err { - return &ParseError{f, "bad LOC Longitude", l} + if i, err := strconv.ParseUint(l.token, 10, 32); err != nil || l.err || i > 180 { + return &ParseError{"", "bad LOC Longitude", l} } else { rr.Longitude = 1000 * 60 * 60 * uint32(i) } @@ -772,15 +638,15 @@ East: if rr.Longitude, ok = locCheckEast(l.token, rr.Longitude); ok { goto Altitude } - if i, e := strconv.ParseUint(l.token, 10, 32); e != nil || l.err { - return &ParseError{f, "bad LOC Longitude minutes", l} + if i, err := strconv.ParseUint(l.token, 10, 32); err != nil || l.err || i > 59 { + return &ParseError{"", "bad LOC Longitude minutes", l} } else { rr.Longitude += 1000 * 60 * uint32(i) } c.Next() // zBlank l, _ = c.Next() - if i, e := strconv.ParseFloat(l.token, 32); e != nil || l.err { - return &ParseError{f, "bad LOC Longitude seconds", l} + if i, err := strconv.ParseFloat(l.token, 32); err != nil || l.err || i < 0 || i >= 60 { + return &ParseError{"", "bad LOC Longitude seconds", l} } else { rr.Longitude += uint32(1000 * i) } @@ -791,19 +657,19 @@ East: goto Altitude } // If still alive, flag an error - return &ParseError{f, "bad LOC Longitude East/West", l} + return &ParseError{"", "bad LOC Longitude East/West", l} Altitude: c.Next() // zBlank l, _ = c.Next() if len(l.token) == 0 || l.err { - return &ParseError{f, "bad LOC Altitude", l} + return &ParseError{"", "bad LOC Altitude", l} } if l.token[len(l.token)-1] == 'M' || l.token[len(l.token)-1] == 'm' { l.token = l.token[0 : len(l.token)-1] } - if i, e := strconv.ParseFloat(l.token, 32); e != nil { - return &ParseError{f, "bad LOC Altitude", l} + if i, err := strconv.ParseFloat(l.token, 64); err != nil { + return &ParseError{"", "bad LOC Altitude", l} } else { rr.Altitude = uint32(i*100.0 + 10000000.0 + 0.5) } @@ -816,52 +682,48 @@ Altitude: case zString: switch count { case 0: // Size - e, m, ok := stringToCm(l.token) + exp, m, ok := stringToCm(l.token) if !ok { - return &ParseError{f, "bad LOC Size", l} + return &ParseError{"", "bad LOC Size", l} } - rr.Size = e&0x0f | m<<4&0xf0 + rr.Size = exp&0x0f | m<<4&0xf0 case 1: // HorizPre - e, m, ok := stringToCm(l.token) + exp, m, ok := stringToCm(l.token) if !ok { - return &ParseError{f, "bad LOC HorizPre", l} + return &ParseError{"", "bad LOC HorizPre", l} } - rr.HorizPre = e&0x0f | m<<4&0xf0 + rr.HorizPre = exp&0x0f | m<<4&0xf0 case 2: // VertPre - e, m, ok := stringToCm(l.token) + exp, m, ok := stringToCm(l.token) if !ok { - return &ParseError{f, "bad LOC VertPre", l} + return &ParseError{"", "bad LOC VertPre", l} } - rr.VertPre = e&0x0f | m<<4&0xf0 + rr.VertPre = exp&0x0f | m<<4&0xf0 } count++ case zBlank: // Ok default: - return &ParseError{f, "bad LOC Size, HorizPre or VertPre", l} + return &ParseError{"", "bad LOC Size, HorizPre or VertPre", l} } l, _ = c.Next() } return nil } -func (rr *HIP) parse(c *zlexer, o, f string) *ParseError { +func (rr *HIP) parse(c *zlexer, o string) *ParseError { // HitLength is not represented l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return nil - } - i, e := strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { - return &ParseError{f, "bad HIP PublicKeyAlgorithm", l} + return &ParseError{"", "bad HIP PublicKeyAlgorithm", l} } rr.PublicKeyAlgorithm = uint8(i) c.Next() // zBlank l, _ = c.Next() // zString if len(l.token) == 0 || l.err { - return &ParseError{f, "bad HIP Hit", l} + return &ParseError{"", "bad HIP Hit", l} } rr.Hit = l.token // This can not contain spaces, see RFC 5205 Section 6. rr.HitLength = uint8(len(rr.Hit)) / 2 @@ -869,7 +731,7 @@ func (rr *HIP) parse(c *zlexer, o, f string) *ParseError { c.Next() // zBlank l, _ = c.Next() // zString if len(l.token) == 0 || l.err { - return &ParseError{f, "bad HIP PublicKey", l} + return &ParseError{"", "bad HIP PublicKey", l} } rr.PublicKey = l.token // This cannot contain spaces rr.PublicKeyLength = uint16(base64.StdEncoding.DecodedLen(len(rr.PublicKey))) @@ -882,13 +744,13 @@ func (rr *HIP) parse(c *zlexer, o, f string) *ParseError { case zString: name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{f, "bad HIP RendezvousServers", l} + return &ParseError{"", "bad HIP RendezvousServers", l} } xs = append(xs, name) case zBlank: // Ok default: - return &ParseError{f, "bad HIP RendezvousServers", l} + return &ParseError{"", "bad HIP RendezvousServers", l} } l, _ = c.Next() } @@ -897,16 +759,12 @@ func (rr *HIP) parse(c *zlexer, o, f string) *ParseError { return nil } -func (rr *CERT) parse(c *zlexer, o, f string) *ParseError { +func (rr *CERT) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return nil - } - if v, ok := StringToCertType[l.token]; ok { rr.Type = v - } else if i, e := strconv.ParseUint(l.token, 10, 16); e != nil { - return &ParseError{f, "bad CERT Type", l} + } else if i, err := strconv.ParseUint(l.token, 10, 16); err != nil { + return &ParseError{"", "bad CERT Type", l} } else { rr.Type = uint16(i) } @@ -914,19 +772,19 @@ func (rr *CERT) parse(c *zlexer, o, f string) *ParseError { l, _ = c.Next() // zString i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{f, "bad CERT KeyTag", l} + return &ParseError{"", "bad CERT KeyTag", l} } rr.KeyTag = uint16(i) c.Next() // zBlank l, _ = c.Next() // zString if v, ok := StringToAlgorithm[l.token]; ok { rr.Algorithm = v - } else if i, e := strconv.ParseUint(l.token, 10, 8); e != nil { - return &ParseError{f, "bad CERT Algorithm", l} + } else if i, err := strconv.ParseUint(l.token, 10, 8); err != nil { + return &ParseError{"", "bad CERT Algorithm", l} } else { rr.Algorithm = uint8(i) } - s, e1 := endingToString(c, "bad CERT Certificate", f) + s, e1 := endingToString(c, "bad CERT Certificate") if e1 != nil { return e1 } @@ -934,8 +792,8 @@ func (rr *CERT) parse(c *zlexer, o, f string) *ParseError { return nil } -func (rr *OPENPGPKEY) parse(c *zlexer, o, f string) *ParseError { - s, e := endingToString(c, "bad OPENPGPKEY PublicKey", f) +func (rr *OPENPGPKEY) parse(c *zlexer, o string) *ParseError { + s, e := endingToString(c, "bad OPENPGPKEY PublicKey") if e != nil { return e } @@ -943,25 +801,22 @@ func (rr *OPENPGPKEY) parse(c *zlexer, o, f string) *ParseError { return nil } -func (rr *CSYNC) parse(c *zlexer, o, f string) *ParseError { +func (rr *CSYNC) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return nil - } j, e := strconv.ParseUint(l.token, 10, 32) if e != nil { // Serial must be a number - return &ParseError{f, "bad CSYNC serial", l} + return &ParseError{"", "bad CSYNC serial", l} } rr.Serial = uint32(j) c.Next() // zBlank l, _ = c.Next() - j, e = strconv.ParseUint(l.token, 10, 16) - if e != nil { + j, e1 := strconv.ParseUint(l.token, 10, 16) + if e1 != nil { // Serial must be a number - return &ParseError{f, "bad CSYNC flags", l} + return &ParseError{"", "bad CSYNC flags", l} } rr.Flags = uint16(j) @@ -979,38 +834,32 @@ func (rr *CSYNC) parse(c *zlexer, o, f string) *ParseError { tokenUpper := strings.ToUpper(l.token) if k, ok = StringToType[tokenUpper]; !ok { if k, ok = typeToInt(l.token); !ok { - return &ParseError{f, "bad CSYNC TypeBitMap", l} + return &ParseError{"", "bad CSYNC TypeBitMap", l} } } rr.TypeBitMap = append(rr.TypeBitMap, k) default: - return &ParseError{f, "bad CSYNC TypeBitMap", l} + return &ParseError{"", "bad CSYNC TypeBitMap", l} } l, _ = c.Next() } return nil } -func (rr *SIG) parse(c *zlexer, o, f string) *ParseError { - return rr.RRSIG.parse(c, o, f) -} +func (rr *SIG) parse(c *zlexer, o string) *ParseError { return rr.RRSIG.parse(c, o) } -func (rr *RRSIG) parse(c *zlexer, o, f string) *ParseError { +func (rr *RRSIG) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return nil - } - tokenUpper := strings.ToUpper(l.token) if t, ok := StringToType[tokenUpper]; !ok { if strings.HasPrefix(tokenUpper, "TYPE") { t, ok = typeToInt(l.token) if !ok { - return &ParseError{f, "bad RRSIG Typecovered", l} + return &ParseError{"", "bad RRSIG Typecovered", l} } rr.TypeCovered = t } else { - return &ParseError{f, "bad RRSIG Typecovered", l} + return &ParseError{"", "bad RRSIG Typecovered", l} } } else { rr.TypeCovered = t @@ -1018,25 +867,25 @@ func (rr *RRSIG) parse(c *zlexer, o, f string) *ParseError { c.Next() // zBlank l, _ = c.Next() - i, err := strconv.ParseUint(l.token, 10, 8) - if err != nil || l.err { - return &ParseError{f, "bad RRSIG Algorithm", l} + i, e := strconv.ParseUint(l.token, 10, 8) + if e != nil || l.err { + return &ParseError{"", "bad RRSIG Algorithm", l} } rr.Algorithm = uint8(i) c.Next() // zBlank l, _ = c.Next() - i, err = strconv.ParseUint(l.token, 10, 8) - if err != nil || l.err { - return &ParseError{f, "bad RRSIG Labels", l} + i, e1 := strconv.ParseUint(l.token, 10, 8) + if e1 != nil || l.err { + return &ParseError{"", "bad RRSIG Labels", l} } rr.Labels = uint8(i) c.Next() // zBlank l, _ = c.Next() - i, err = strconv.ParseUint(l.token, 10, 32) - if err != nil || l.err { - return &ParseError{f, "bad RRSIG OrigTtl", l} + i, e2 := strconv.ParseUint(l.token, 10, 32) + if e2 != nil || l.err { + return &ParseError{"", "bad RRSIG OrigTtl", l} } rr.OrigTtl = uint32(i) @@ -1044,11 +893,10 @@ func (rr *RRSIG) parse(c *zlexer, o, f string) *ParseError { l, _ = c.Next() if i, err := StringToTime(l.token); err != nil { // Try to see if all numeric and use it as epoch - if i, err := strconv.ParseInt(l.token, 10, 64); err == nil { - // TODO(miek): error out on > MAX_UINT32, same below + if i, err := strconv.ParseUint(l.token, 10, 32); err == nil { rr.Expiration = uint32(i) } else { - return &ParseError{f, "bad RRSIG Expiration", l} + return &ParseError{"", "bad RRSIG Expiration", l} } } else { rr.Expiration = i @@ -1057,10 +905,10 @@ func (rr *RRSIG) parse(c *zlexer, o, f string) *ParseError { c.Next() // zBlank l, _ = c.Next() if i, err := StringToTime(l.token); err != nil { - if i, err := strconv.ParseInt(l.token, 10, 64); err == nil { + if i, err := strconv.ParseUint(l.token, 10, 32); err == nil { rr.Inception = uint32(i) } else { - return &ParseError{f, "bad RRSIG Inception", l} + return &ParseError{"", "bad RRSIG Inception", l} } } else { rr.Inception = i @@ -1068,9 +916,9 @@ func (rr *RRSIG) parse(c *zlexer, o, f string) *ParseError { c.Next() // zBlank l, _ = c.Next() - i, err = strconv.ParseUint(l.token, 10, 16) - if err != nil || l.err { - return &ParseError{f, "bad RRSIG KeyTag", l} + i, e3 := strconv.ParseUint(l.token, 10, 16) + if e3 != nil || l.err { + return &ParseError{"", "bad RRSIG KeyTag", l} } rr.KeyTag = uint16(i) @@ -1079,29 +927,24 @@ func (rr *RRSIG) parse(c *zlexer, o, f string) *ParseError { rr.SignerName = l.token name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{f, "bad RRSIG SignerName", l} + return &ParseError{"", "bad RRSIG SignerName", l} } rr.SignerName = name - s, e := endingToString(c, "bad RRSIG Signature", f) - if e != nil { - return e + s, e4 := endingToString(c, "bad RRSIG Signature") + if e4 != nil { + return e4 } rr.Signature = s return nil } -func (rr *NSEC) parse(c *zlexer, o, f string) *ParseError { +func (rr *NSEC) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - rr.NextDomain = l.token - if len(l.token) == 0 { // dynamic update rr. - return nil - } - name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{f, "bad NSEC NextDomain", l} + return &ParseError{"", "bad NSEC NextDomain", l} } rr.NextDomain = name @@ -1119,47 +962,43 @@ func (rr *NSEC) parse(c *zlexer, o, f string) *ParseError { tokenUpper := strings.ToUpper(l.token) if k, ok = StringToType[tokenUpper]; !ok { if k, ok = typeToInt(l.token); !ok { - return &ParseError{f, "bad NSEC TypeBitMap", l} + return &ParseError{"", "bad NSEC TypeBitMap", l} } } rr.TypeBitMap = append(rr.TypeBitMap, k) default: - return &ParseError{f, "bad NSEC TypeBitMap", l} + return &ParseError{"", "bad NSEC TypeBitMap", l} } l, _ = c.Next() } return nil } -func (rr *NSEC3) parse(c *zlexer, o, f string) *ParseError { +func (rr *NSEC3) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return nil - } - i, e := strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { - return &ParseError{f, "bad NSEC3 Hash", l} + return &ParseError{"", "bad NSEC3 Hash", l} } rr.Hash = uint8(i) c.Next() // zBlank l, _ = c.Next() - i, e = strconv.ParseUint(l.token, 10, 8) - if e != nil || l.err { - return &ParseError{f, "bad NSEC3 Flags", l} + i, e1 := strconv.ParseUint(l.token, 10, 8) + if e1 != nil || l.err { + return &ParseError{"", "bad NSEC3 Flags", l} } rr.Flags = uint8(i) c.Next() // zBlank l, _ = c.Next() - i, e = strconv.ParseUint(l.token, 10, 16) - if e != nil || l.err { - return &ParseError{f, "bad NSEC3 Iterations", l} + i, e2 := strconv.ParseUint(l.token, 10, 16) + if e2 != nil || l.err { + return &ParseError{"", "bad NSEC3 Iterations", l} } rr.Iterations = uint16(i) c.Next() l, _ = c.Next() if len(l.token) == 0 || l.err { - return &ParseError{f, "bad NSEC3 Salt", l} + return &ParseError{"", "bad NSEC3 Salt", l} } if l.token != "-" { rr.SaltLength = uint8(len(l.token)) / 2 @@ -1169,7 +1008,7 @@ func (rr *NSEC3) parse(c *zlexer, o, f string) *ParseError { c.Next() l, _ = c.Next() if len(l.token) == 0 || l.err { - return &ParseError{f, "bad NSEC3 NextDomain", l} + return &ParseError{"", "bad NSEC3 NextDomain", l} } rr.HashLength = 20 // Fix for NSEC3 (sha1 160 bits) rr.NextDomain = l.token @@ -1188,60 +1027,52 @@ func (rr *NSEC3) parse(c *zlexer, o, f string) *ParseError { tokenUpper := strings.ToUpper(l.token) if k, ok = StringToType[tokenUpper]; !ok { if k, ok = typeToInt(l.token); !ok { - return &ParseError{f, "bad NSEC3 TypeBitMap", l} + return &ParseError{"", "bad NSEC3 TypeBitMap", l} } } rr.TypeBitMap = append(rr.TypeBitMap, k) default: - return &ParseError{f, "bad NSEC3 TypeBitMap", l} + return &ParseError{"", "bad NSEC3 TypeBitMap", l} } l, _ = c.Next() } return nil } -func (rr *NSEC3PARAM) parse(c *zlexer, o, f string) *ParseError { +func (rr *NSEC3PARAM) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - i, e := strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { - return &ParseError{f, "bad NSEC3PARAM Hash", l} + return &ParseError{"", "bad NSEC3PARAM Hash", l} } rr.Hash = uint8(i) c.Next() // zBlank l, _ = c.Next() - i, e = strconv.ParseUint(l.token, 10, 8) - if e != nil || l.err { - return &ParseError{f, "bad NSEC3PARAM Flags", l} + i, e1 := strconv.ParseUint(l.token, 10, 8) + if e1 != nil || l.err { + return &ParseError{"", "bad NSEC3PARAM Flags", l} } rr.Flags = uint8(i) c.Next() // zBlank l, _ = c.Next() - i, e = strconv.ParseUint(l.token, 10, 16) - if e != nil || l.err { - return &ParseError{f, "bad NSEC3PARAM Iterations", l} + i, e2 := strconv.ParseUint(l.token, 10, 16) + if e2 != nil || l.err { + return &ParseError{"", "bad NSEC3PARAM Iterations", l} } rr.Iterations = uint16(i) c.Next() l, _ = c.Next() if l.token != "-" { - rr.SaltLength = uint8(len(l.token)) + rr.SaltLength = uint8(len(l.token) / 2) rr.Salt = l.token } - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *EUI48) parse(c *zlexer, o, f string) *ParseError { +func (rr *EUI48) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - if len(l.token) != 17 || l.err { - return &ParseError{f, "bad EUI48 Address", l} + return &ParseError{"", "bad EUI48 Address", l} } addr := make([]byte, 12) dash := 0 @@ -1250,7 +1081,7 @@ func (rr *EUI48) parse(c *zlexer, o, f string) *ParseError { addr[i+1] = l.token[i+1+dash] dash++ if l.token[i+1+dash] != '-' { - return &ParseError{f, "bad EUI48 Address", l} + return &ParseError{"", "bad EUI48 Address", l} } } addr[10] = l.token[15] @@ -1258,20 +1089,16 @@ func (rr *EUI48) parse(c *zlexer, o, f string) *ParseError { i, e := strconv.ParseUint(string(addr), 16, 48) if e != nil { - return &ParseError{f, "bad EUI48 Address", l} + return &ParseError{"", "bad EUI48 Address", l} } rr.Address = i - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *EUI64) parse(c *zlexer, o, f string) *ParseError { +func (rr *EUI64) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - if len(l.token) != 23 || l.err { - return &ParseError{f, "bad EUI64 Address", l} + return &ParseError{"", "bad EUI64 Address", l} } addr := make([]byte, 16) dash := 0 @@ -1280,7 +1107,7 @@ func (rr *EUI64) parse(c *zlexer, o, f string) *ParseError { addr[i+1] = l.token[i+1+dash] dash++ if l.token[i+1+dash] != '-' { - return &ParseError{f, "bad EUI64 Address", l} + return &ParseError{"", "bad EUI64 Address", l} } } addr[14] = l.token[21] @@ -1288,119 +1115,102 @@ func (rr *EUI64) parse(c *zlexer, o, f string) *ParseError { i, e := strconv.ParseUint(string(addr), 16, 64) if e != nil { - return &ParseError{f, "bad EUI68 Address", l} + return &ParseError{"", "bad EUI68 Address", l} } rr.Address = i - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *SSHFP) parse(c *zlexer, o, f string) *ParseError { +func (rr *SSHFP) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return nil - } - i, e := strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { - return &ParseError{f, "bad SSHFP Algorithm", l} + return &ParseError{"", "bad SSHFP Algorithm", l} } rr.Algorithm = uint8(i) c.Next() // zBlank l, _ = c.Next() - i, e = strconv.ParseUint(l.token, 10, 8) - if e != nil || l.err { - return &ParseError{f, "bad SSHFP Type", l} + i, e1 := strconv.ParseUint(l.token, 10, 8) + if e1 != nil || l.err { + return &ParseError{"", "bad SSHFP Type", l} } rr.Type = uint8(i) c.Next() // zBlank - s, e1 := endingToString(c, "bad SSHFP Fingerprint", f) - if e1 != nil { - return e1 + s, e2 := endingToString(c, "bad SSHFP Fingerprint") + if e2 != nil { + return e2 } rr.FingerPrint = s return nil } -func (rr *DNSKEY) parseDNSKEY(c *zlexer, o, f, typ string) *ParseError { +func (rr *DNSKEY) parseDNSKEY(c *zlexer, o, typ string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return nil - } - i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{f, "bad " + typ + " Flags", l} + return &ParseError{"", "bad " + typ + " Flags", l} } rr.Flags = uint16(i) c.Next() // zBlank l, _ = c.Next() // zString - i, e = strconv.ParseUint(l.token, 10, 8) - if e != nil || l.err { - return &ParseError{f, "bad " + typ + " Protocol", l} + i, e1 := strconv.ParseUint(l.token, 10, 8) + if e1 != nil || l.err { + return &ParseError{"", "bad " + typ + " Protocol", l} } rr.Protocol = uint8(i) c.Next() // zBlank l, _ = c.Next() // zString - i, e = strconv.ParseUint(l.token, 10, 8) - if e != nil || l.err { - return &ParseError{f, "bad " + typ + " Algorithm", l} + i, e2 := strconv.ParseUint(l.token, 10, 8) + if e2 != nil || l.err { + return &ParseError{"", "bad " + typ + " Algorithm", l} } rr.Algorithm = uint8(i) - s, e1 := endingToString(c, "bad "+typ+" PublicKey", f) - if e1 != nil { - return e1 + s, e3 := endingToString(c, "bad "+typ+" PublicKey") + if e3 != nil { + return e3 } rr.PublicKey = s return nil } -func (rr *DNSKEY) parse(c *zlexer, o, f string) *ParseError { - return rr.parseDNSKEY(c, o, f, "DNSKEY") -} - -func (rr *KEY) parse(c *zlexer, o, f string) *ParseError { - return rr.parseDNSKEY(c, o, f, "KEY") -} - -func (rr *CDNSKEY) parse(c *zlexer, o, f string) *ParseError { - return rr.parseDNSKEY(c, o, f, "CDNSKEY") -} +func (rr *DNSKEY) parse(c *zlexer, o string) *ParseError { return rr.parseDNSKEY(c, o, "DNSKEY") } +func (rr *KEY) parse(c *zlexer, o string) *ParseError { return rr.parseDNSKEY(c, o, "KEY") } +func (rr *CDNSKEY) parse(c *zlexer, o string) *ParseError { return rr.parseDNSKEY(c, o, "CDNSKEY") } +func (rr *DS) parse(c *zlexer, o string) *ParseError { return rr.parseDS(c, o, "DS") } +func (rr *DLV) parse(c *zlexer, o string) *ParseError { return rr.parseDS(c, o, "DLV") } +func (rr *CDS) parse(c *zlexer, o string) *ParseError { return rr.parseDS(c, o, "CDS") } -func (rr *RKEY) parse(c *zlexer, o, f string) *ParseError { +func (rr *RKEY) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return nil - } - i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{f, "bad RKEY Flags", l} + return &ParseError{"", "bad RKEY Flags", l} } rr.Flags = uint16(i) c.Next() // zBlank l, _ = c.Next() // zString - i, e = strconv.ParseUint(l.token, 10, 8) - if e != nil || l.err { - return &ParseError{f, "bad RKEY Protocol", l} + i, e1 := strconv.ParseUint(l.token, 10, 8) + if e1 != nil || l.err { + return &ParseError{"", "bad RKEY Protocol", l} } rr.Protocol = uint8(i) c.Next() // zBlank l, _ = c.Next() // zString - i, e = strconv.ParseUint(l.token, 10, 8) - if e != nil || l.err { - return &ParseError{f, "bad RKEY Algorithm", l} + i, e2 := strconv.ParseUint(l.token, 10, 8) + if e2 != nil || l.err { + return &ParseError{"", "bad RKEY Algorithm", l} } rr.Algorithm = uint8(i) - s, e1 := endingToString(c, "bad RKEY PublicKey", f) - if e1 != nil { - return e1 + s, e3 := endingToString(c, "bad RKEY PublicKey") + if e3 != nil { + return e3 } rr.PublicKey = s return nil } -func (rr *EID) parse(c *zlexer, o, f string) *ParseError { - s, e := endingToString(c, "bad EID Endpoint", f) +func (rr *EID) parse(c *zlexer, o string) *ParseError { + s, e := endingToString(c, "bad EID Endpoint") if e != nil { return e } @@ -1408,8 +1218,8 @@ func (rr *EID) parse(c *zlexer, o, f string) *ParseError { return nil } -func (rr *NIMLOC) parse(c *zlexer, o, f string) *ParseError { - s, e := endingToString(c, "bad NIMLOC Locator", f) +func (rr *NIMLOC) parse(c *zlexer, o string) *ParseError { + s, e := endingToString(c, "bad NIMLOC Locator") if e != nil { return e } @@ -1417,52 +1227,44 @@ func (rr *NIMLOC) parse(c *zlexer, o, f string) *ParseError { return nil } -func (rr *GPOS) parse(c *zlexer, o, f string) *ParseError { +func (rr *GPOS) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - _, e := strconv.ParseFloat(l.token, 64) if e != nil || l.err { - return &ParseError{f, "bad GPOS Longitude", l} + return &ParseError{"", "bad GPOS Longitude", l} } rr.Longitude = l.token c.Next() // zBlank l, _ = c.Next() - _, e = strconv.ParseFloat(l.token, 64) - if e != nil || l.err { - return &ParseError{f, "bad GPOS Latitude", l} + _, e1 := strconv.ParseFloat(l.token, 64) + if e1 != nil || l.err { + return &ParseError{"", "bad GPOS Latitude", l} } rr.Latitude = l.token c.Next() // zBlank l, _ = c.Next() - _, e = strconv.ParseFloat(l.token, 64) - if e != nil || l.err { - return &ParseError{f, "bad GPOS Altitude", l} + _, e2 := strconv.ParseFloat(l.token, 64) + if e2 != nil || l.err { + return &ParseError{"", "bad GPOS Altitude", l} } rr.Altitude = l.token - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *DS) parseDS(c *zlexer, o, f, typ string) *ParseError { +func (rr *DS) parseDS(c *zlexer, o, typ string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return nil - } - i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{f, "bad " + typ + " KeyTag", l} + return &ParseError{"", "bad " + typ + " KeyTag", l} } rr.KeyTag = uint16(i) c.Next() // zBlank l, _ = c.Next() - if i, e = strconv.ParseUint(l.token, 10, 8); e != nil { + if i, err := strconv.ParseUint(l.token, 10, 8); err != nil { tokenUpper := strings.ToUpper(l.token) i, ok := StringToAlgorithm[tokenUpper] if !ok || l.err { - return &ParseError{f, "bad " + typ + " Algorithm", l} + return &ParseError{"", "bad " + typ + " Algorithm", l} } rr.Algorithm = i } else { @@ -1470,49 +1272,33 @@ func (rr *DS) parseDS(c *zlexer, o, f, typ string) *ParseError { } c.Next() // zBlank l, _ = c.Next() - i, e = strconv.ParseUint(l.token, 10, 8) - if e != nil || l.err { - return &ParseError{f, "bad " + typ + " DigestType", l} + i, e1 := strconv.ParseUint(l.token, 10, 8) + if e1 != nil || l.err { + return &ParseError{"", "bad " + typ + " DigestType", l} } rr.DigestType = uint8(i) - s, e1 := endingToString(c, "bad "+typ+" Digest", f) - if e1 != nil { - return e1 + s, e2 := endingToString(c, "bad "+typ+" Digest") + if e2 != nil { + return e2 } rr.Digest = s return nil } -func (rr *DS) parse(c *zlexer, o, f string) *ParseError { - return rr.parseDS(c, o, f, "DS") -} - -func (rr *DLV) parse(c *zlexer, o, f string) *ParseError { - return rr.parseDS(c, o, f, "DLV") -} - -func (rr *CDS) parse(c *zlexer, o, f string) *ParseError { - return rr.parseDS(c, o, f, "CDS") -} - -func (rr *TA) parse(c *zlexer, o, f string) *ParseError { +func (rr *TA) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return nil - } - i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{f, "bad TA KeyTag", l} + return &ParseError{"", "bad TA KeyTag", l} } rr.KeyTag = uint16(i) c.Next() // zBlank l, _ = c.Next() - if i, e := strconv.ParseUint(l.token, 10, 8); e != nil { + if i, err := strconv.ParseUint(l.token, 10, 8); err != nil { tokenUpper := strings.ToUpper(l.token) i, ok := StringToAlgorithm[tokenUpper] if !ok || l.err { - return &ParseError{f, "bad TA Algorithm", l} + return &ParseError{"", "bad TA Algorithm", l} } rr.Algorithm = i } else { @@ -1520,113 +1306,105 @@ func (rr *TA) parse(c *zlexer, o, f string) *ParseError { } c.Next() // zBlank l, _ = c.Next() - i, e = strconv.ParseUint(l.token, 10, 8) - if e != nil || l.err { - return &ParseError{f, "bad TA DigestType", l} + i, e1 := strconv.ParseUint(l.token, 10, 8) + if e1 != nil || l.err { + return &ParseError{"", "bad TA DigestType", l} } rr.DigestType = uint8(i) - s, err := endingToString(c, "bad TA Digest", f) - if err != nil { - return err + s, e2 := endingToString(c, "bad TA Digest") + if e2 != nil { + return e2 } rr.Digest = s return nil } -func (rr *TLSA) parse(c *zlexer, o, f string) *ParseError { +func (rr *TLSA) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return nil - } - i, e := strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { - return &ParseError{f, "bad TLSA Usage", l} + return &ParseError{"", "bad TLSA Usage", l} } rr.Usage = uint8(i) c.Next() // zBlank l, _ = c.Next() - i, e = strconv.ParseUint(l.token, 10, 8) - if e != nil || l.err { - return &ParseError{f, "bad TLSA Selector", l} + i, e1 := strconv.ParseUint(l.token, 10, 8) + if e1 != nil || l.err { + return &ParseError{"", "bad TLSA Selector", l} } rr.Selector = uint8(i) c.Next() // zBlank l, _ = c.Next() - i, e = strconv.ParseUint(l.token, 10, 8) - if e != nil || l.err { - return &ParseError{f, "bad TLSA MatchingType", l} + i, e2 := strconv.ParseUint(l.token, 10, 8) + if e2 != nil || l.err { + return &ParseError{"", "bad TLSA MatchingType", l} } rr.MatchingType = uint8(i) // So this needs be e2 (i.e. different than e), because...??t - s, e2 := endingToString(c, "bad TLSA Certificate", f) - if e2 != nil { - return e2 + s, e3 := endingToString(c, "bad TLSA Certificate") + if e3 != nil { + return e3 } rr.Certificate = s return nil } -func (rr *SMIMEA) parse(c *zlexer, o, f string) *ParseError { +func (rr *SMIMEA) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return nil - } - i, e := strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { - return &ParseError{f, "bad SMIMEA Usage", l} + return &ParseError{"", "bad SMIMEA Usage", l} } rr.Usage = uint8(i) c.Next() // zBlank l, _ = c.Next() - i, e = strconv.ParseUint(l.token, 10, 8) - if e != nil || l.err { - return &ParseError{f, "bad SMIMEA Selector", l} + i, e1 := strconv.ParseUint(l.token, 10, 8) + if e1 != nil || l.err { + return &ParseError{"", "bad SMIMEA Selector", l} } rr.Selector = uint8(i) c.Next() // zBlank l, _ = c.Next() - i, e = strconv.ParseUint(l.token, 10, 8) - if e != nil || l.err { - return &ParseError{f, "bad SMIMEA MatchingType", l} + i, e2 := strconv.ParseUint(l.token, 10, 8) + if e2 != nil || l.err { + return &ParseError{"", "bad SMIMEA MatchingType", l} } rr.MatchingType = uint8(i) // So this needs be e2 (i.e. different than e), because...??t - s, e2 := endingToString(c, "bad SMIMEA Certificate", f) - if e2 != nil { - return e2 + s, e3 := endingToString(c, "bad SMIMEA Certificate") + if e3 != nil { + return e3 } rr.Certificate = s return nil } -func (rr *RFC3597) parse(c *zlexer, o, f string) *ParseError { +func (rr *RFC3597) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() if l.token != "\\#" { - return &ParseError{f, "bad RFC3597 Rdata", l} + return &ParseError{"", "bad RFC3597 Rdata", l} } c.Next() // zBlank l, _ = c.Next() rdlength, e := strconv.Atoi(l.token) if e != nil || l.err { - return &ParseError{f, "bad RFC3597 Rdata ", l} + return &ParseError{"", "bad RFC3597 Rdata ", l} } - s, e1 := endingToString(c, "bad RFC3597 Rdata", f) + s, e1 := endingToString(c, "bad RFC3597 Rdata") if e1 != nil { return e1 } if rdlength*2 != len(s) { - return &ParseError{f, "bad RFC3597 Rdata", l} + return &ParseError{"", "bad RFC3597 Rdata", l} } rr.Rdata = s return nil } -func (rr *SPF) parse(c *zlexer, o, f string) *ParseError { - s, e := endingToTxtSlice(c, "bad SPF Txt", f) +func (rr *SPF) parse(c *zlexer, o string) *ParseError { + s, e := endingToTxtSlice(c, "bad SPF Txt") if e != nil { return e } @@ -1634,8 +1412,8 @@ func (rr *SPF) parse(c *zlexer, o, f string) *ParseError { return nil } -func (rr *AVC) parse(c *zlexer, o, f string) *ParseError { - s, e := endingToTxtSlice(c, "bad AVC Txt", f) +func (rr *AVC) parse(c *zlexer, o string) *ParseError { + s, e := endingToTxtSlice(c, "bad AVC Txt") if e != nil { return e } @@ -1643,9 +1421,9 @@ func (rr *AVC) parse(c *zlexer, o, f string) *ParseError { return nil } -func (rr *TXT) parse(c *zlexer, o, f string) *ParseError { +func (rr *TXT) parse(c *zlexer, o string) *ParseError { // no zBlank reading here, because all this rdata is TXT - s, e := endingToTxtSlice(c, "bad TXT Txt", f) + s, e := endingToTxtSlice(c, "bad TXT Txt") if e != nil { return e } @@ -1654,8 +1432,8 @@ func (rr *TXT) parse(c *zlexer, o, f string) *ParseError { } // identical to setTXT -func (rr *NINFO) parse(c *zlexer, o, f string) *ParseError { - s, e := endingToTxtSlice(c, "bad NINFO ZSData", f) +func (rr *NINFO) parse(c *zlexer, o string) *ParseError { + s, e := endingToTxtSlice(c, "bad NINFO ZSData") if e != nil { return e } @@ -1663,40 +1441,36 @@ func (rr *NINFO) parse(c *zlexer, o, f string) *ParseError { return nil } -func (rr *URI) parse(c *zlexer, o, f string) *ParseError { +func (rr *URI) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return nil - } - i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{f, "bad URI Priority", l} + return &ParseError{"", "bad URI Priority", l} } rr.Priority = uint16(i) c.Next() // zBlank l, _ = c.Next() - i, e = strconv.ParseUint(l.token, 10, 16) - if e != nil || l.err { - return &ParseError{f, "bad URI Weight", l} + i, e1 := strconv.ParseUint(l.token, 10, 16) + if e1 != nil || l.err { + return &ParseError{"", "bad URI Weight", l} } rr.Weight = uint16(i) c.Next() // zBlank - s, err := endingToTxtSlice(c, "bad URI Target", f) - if err != nil { - return err + s, e2 := endingToTxtSlice(c, "bad URI Target") + if e2 != nil { + return e2 } if len(s) != 1 { - return &ParseError{f, "bad URI Target", l} + return &ParseError{"", "bad URI Target", l} } rr.Target = s[0] return nil } -func (rr *DHCID) parse(c *zlexer, o, f string) *ParseError { +func (rr *DHCID) parse(c *zlexer, o string) *ParseError { // awesome record to parse! - s, e := endingToString(c, "bad DHCID Digest", f) + s, e := endingToString(c, "bad DHCID Digest") if e != nil { return e } @@ -1704,56 +1478,44 @@ func (rr *DHCID) parse(c *zlexer, o, f string) *ParseError { return nil } -func (rr *NID) parse(c *zlexer, o, f string) *ParseError { +func (rr *NID) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{f, "bad NID Preference", l} + return &ParseError{"", "bad NID Preference", l} } rr.Preference = uint16(i) c.Next() // zBlank l, _ = c.Next() // zString - u, err := stringToNodeID(l) - if err != nil || l.err { - return err + u, e1 := stringToNodeID(l) + if e1 != nil || l.err { + return e1 } rr.NodeID = u - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *L32) parse(c *zlexer, o, f string) *ParseError { +func (rr *L32) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{f, "bad L32 Preference", l} + return &ParseError{"", "bad L32 Preference", l} } rr.Preference = uint16(i) c.Next() // zBlank l, _ = c.Next() // zString rr.Locator32 = net.ParseIP(l.token) if rr.Locator32 == nil || l.err { - return &ParseError{f, "bad L32 Locator", l} + return &ParseError{"", "bad L32 Locator", l} } - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *LP) parse(c *zlexer, o, f string) *ParseError { +func (rr *LP) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{f, "bad LP Preference", l} + return &ParseError{"", "bad LP Preference", l} } rr.Preference = uint16(i) @@ -1762,64 +1524,51 @@ func (rr *LP) parse(c *zlexer, o, f string) *ParseError { rr.Fqdn = l.token name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{f, "bad LP Fqdn", l} + return &ParseError{"", "bad LP Fqdn", l} } rr.Fqdn = name - - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *L64) parse(c *zlexer, o, f string) *ParseError { +func (rr *L64) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{f, "bad L64 Preference", l} + return &ParseError{"", "bad L64 Preference", l} } rr.Preference = uint16(i) c.Next() // zBlank l, _ = c.Next() // zString - u, err := stringToNodeID(l) - if err != nil || l.err { - return err + u, e1 := stringToNodeID(l) + if e1 != nil || l.err { + return e1 } rr.Locator64 = u - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *UID) parse(c *zlexer, o, f string) *ParseError { +func (rr *UID) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - i, e := strconv.ParseUint(l.token, 10, 32) if e != nil || l.err { - return &ParseError{f, "bad UID Uid", l} + return &ParseError{"", "bad UID Uid", l} } rr.Uid = uint32(i) - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *GID) parse(c *zlexer, o, f string) *ParseError { +func (rr *GID) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - i, e := strconv.ParseUint(l.token, 10, 32) if e != nil || l.err { - return &ParseError{f, "bad GID Gid", l} + return &ParseError{"", "bad GID Gid", l} } rr.Gid = uint32(i) - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *UINFO) parse(c *zlexer, o, f string) *ParseError { - s, e := endingToTxtSlice(c, "bad UINFO Uinfo", f) +func (rr *UINFO) parse(c *zlexer, o string) *ParseError { + s, e := endingToTxtSlice(c, "bad UINFO Uinfo") if e != nil { return e } @@ -1830,15 +1579,11 @@ func (rr *UINFO) parse(c *zlexer, o, f string) *ParseError { return nil } -func (rr *PX) parse(c *zlexer, o, f string) *ParseError { +func (rr *PX) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return slurpRemainder(c, f) - } - i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{f, "bad PX Preference", l} + return &ParseError{"", "bad PX Preference", l} } rr.Preference = uint16(i) @@ -1847,7 +1592,7 @@ func (rr *PX) parse(c *zlexer, o, f string) *ParseError { rr.Map822 = l.token map822, map822Ok := toAbsoluteName(l.token, o) if l.err || !map822Ok { - return &ParseError{f, "bad PX Map822", l} + return &ParseError{"", "bad PX Map822", l} } rr.Map822 = map822 @@ -1856,82 +1601,142 @@ func (rr *PX) parse(c *zlexer, o, f string) *ParseError { rr.Mapx400 = l.token mapx400, mapx400Ok := toAbsoluteName(l.token, o) if l.err || !mapx400Ok { - return &ParseError{f, "bad PX Mapx400", l} + return &ParseError{"", "bad PX Mapx400", l} } rr.Mapx400 = mapx400 - - return slurpRemainder(c, f) + return slurpRemainder(c) } -func (rr *CAA) parse(c *zlexer, o, f string) *ParseError { +func (rr *CAA) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() - if len(l.token) == 0 { // dynamic update rr. - return nil - } - - i, err := strconv.ParseUint(l.token, 10, 8) - if err != nil || l.err { - return &ParseError{f, "bad CAA Flag", l} + i, e := strconv.ParseUint(l.token, 10, 8) + if e != nil || l.err { + return &ParseError{"", "bad CAA Flag", l} } rr.Flag = uint8(i) c.Next() // zBlank l, _ = c.Next() // zString if l.value != zString { - return &ParseError{f, "bad CAA Tag", l} + return &ParseError{"", "bad CAA Tag", l} } rr.Tag = l.token c.Next() // zBlank - s, e := endingToTxtSlice(c, "bad CAA Value", f) - if e != nil { - return e + s, e1 := endingToTxtSlice(c, "bad CAA Value") + if e1 != nil { + return e1 } if len(s) != 1 { - return &ParseError{f, "bad CAA Value", l} + return &ParseError{"", "bad CAA Value", l} } rr.Value = s[0] return nil } -func (rr *TKEY) parse(c *zlexer, o, f string) *ParseError { +func (rr *TKEY) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() // Algorithm if l.value != zString { - return &ParseError{f, "bad TKEY algorithm", l} + return &ParseError{"", "bad TKEY algorithm", l} } rr.Algorithm = l.token c.Next() // zBlank // Get the key length and key values l, _ = c.Next() - i, err := strconv.ParseUint(l.token, 10, 8) - if err != nil || l.err { - return &ParseError{f, "bad TKEY key length", l} + i, e := strconv.ParseUint(l.token, 10, 8) + if e != nil || l.err { + return &ParseError{"", "bad TKEY key length", l} } rr.KeySize = uint16(i) c.Next() // zBlank l, _ = c.Next() if l.value != zString { - return &ParseError{f, "bad TKEY key", l} + return &ParseError{"", "bad TKEY key", l} } rr.Key = l.token c.Next() // zBlank // Get the otherdata length and string data l, _ = c.Next() - i, err = strconv.ParseUint(l.token, 10, 8) - if err != nil || l.err { - return &ParseError{f, "bad TKEY otherdata length", l} + i, e1 := strconv.ParseUint(l.token, 10, 8) + if e1 != nil || l.err { + return &ParseError{"", "bad TKEY otherdata length", l} } rr.OtherLen = uint16(i) c.Next() // zBlank l, _ = c.Next() if l.value != zString { - return &ParseError{f, "bad TKEY otherday", l} + return &ParseError{"", "bad TKEY otherday", l} } rr.OtherData = l.token + return nil +} + +func (rr *APL) parse(c *zlexer, o string) *ParseError { + var prefixes []APLPrefix + + for { + l, _ := c.Next() + if l.value == zNewline || l.value == zEOF { + break + } + if l.value == zBlank && prefixes != nil { + continue + } + if l.value != zString { + return &ParseError{"", "unexpected APL field", l} + } + + // Expected format: [!]afi:address/prefix + + colon := strings.IndexByte(l.token, ':') + if colon == -1 { + return &ParseError{"", "missing colon in APL field", l} + } + + family, cidr := l.token[:colon], l.token[colon+1:] + + var negation bool + if family != "" && family[0] == '!' { + negation = true + family = family[1:] + } + + afi, e := strconv.ParseUint(family, 10, 16) + if e != nil { + return &ParseError{"", "failed to parse APL family: " + e.Error(), l} + } + var addrLen int + switch afi { + case 1: + addrLen = net.IPv4len + case 2: + addrLen = net.IPv6len + default: + return &ParseError{"", "unrecognized APL family", l} + } + + ip, subnet, e1 := net.ParseCIDR(cidr) + if e1 != nil { + return &ParseError{"", "failed to parse APL address: " + e1.Error(), l} + } + if !ip.Equal(subnet.IP) { + return &ParseError{"", "extra bits in APL address", l} + } + + if len(subnet.IP) != addrLen { + return &ParseError{"", "address mismatch with the APL family", l} + } + + prefixes = append(prefixes, APLPrefix{ + Negation: negation, + Network: *subnet, + }) + } + rr.Prefixes = prefixes return nil } diff --git a/vendor/github.com/miekg/dns/serve_mux.go b/vendor/github.com/miekg/dns/serve_mux.go index ae304db530a5..e7f36e221824 100644 --- a/vendor/github.com/miekg/dns/serve_mux.go +++ b/vendor/github.com/miekg/dns/serve_mux.go @@ -1,7 +1,6 @@ package dns import ( - "strings" "sync" ) @@ -36,33 +35,9 @@ func (mux *ServeMux) match(q string, t uint16) Handler { return nil } - var handler Handler - - // TODO(tmthrgd): Once https://go-review.googlesource.com/c/go/+/137575 - // lands in a go release, replace the following with strings.ToLower. - var sb strings.Builder - for i := 0; i < len(q); i++ { - c := q[i] - if !(c >= 'A' && c <= 'Z') { - continue - } - - sb.Grow(len(q)) - sb.WriteString(q[:i]) - - for ; i < len(q); i++ { - c := q[i] - if c >= 'A' && c <= 'Z' { - c += 'a' - 'A' - } - - sb.WriteByte(c) - } - - q = sb.String() - break - } + q = CanonicalName(q) + var handler Handler for off, end := 0, false; !end; off, end = NextLabel(q, off) { if h, ok := mux.z[q[off:]]; ok { if t != TypeDS { @@ -90,7 +65,7 @@ func (mux *ServeMux) Handle(pattern string, handler Handler) { if mux.z == nil { mux.z = make(map[string]Handler) } - mux.z[Fqdn(pattern)] = handler + mux.z[CanonicalName(pattern)] = handler mux.m.Unlock() } @@ -105,7 +80,7 @@ func (mux *ServeMux) HandleRemove(pattern string) { panic("dns: invalid pattern " + pattern) } mux.m.Lock() - delete(mux.z, Fqdn(pattern)) + delete(mux.z, CanonicalName(pattern)) mux.m.Unlock() } @@ -116,7 +91,7 @@ func (mux *ServeMux) HandleRemove(pattern string) { // are redirected to the parent zone (if that is also registered), // otherwise the child gets the query. // -// If no handler is found, or there is no question, a standard SERVFAIL +// If no handler is found, or there is no question, a standard REFUSED // message is returned func (mux *ServeMux) ServeDNS(w ResponseWriter, req *Msg) { var h Handler @@ -127,7 +102,7 @@ func (mux *ServeMux) ServeDNS(w ResponseWriter, req *Msg) { if h != nil { h.ServeDNS(w, req) } else { - HandleFailed(w, req) + handleRefused(w, req) } } diff --git a/vendor/github.com/miekg/dns/server.go b/vendor/github.com/miekg/dns/server.go index 882403704afc..30dfd41def49 100644 --- a/vendor/github.com/miekg/dns/server.go +++ b/vendor/github.com/miekg/dns/server.go @@ -3,7 +3,6 @@ package dns import ( - "bytes" "context" "crypto/tls" "encoding/binary" @@ -12,26 +11,12 @@ import ( "net" "strings" "sync" - "sync/atomic" "time" ) // Default maximum number of TCP queries before we close the socket. const maxTCPQueries = 128 -// The maximum number of idle workers. -// -// This controls the maximum number of workers that are allowed to stay -// idle waiting for incoming requests before being torn down. -// -// If this limit is reached, the server will just keep spawning new -// workers (goroutines) for each incoming request. In this case, each -// worker will only be used for a single request. -const maxIdleWorkersCount = 10000 - -// The maximum length of time a worker may idle for before being destroyed. -const idleWorkerTimeout = 10 * time.Second - // aLongTimeAgo is a non-zero time, far in the past, used for // immediate cancelation of network operations. var aLongTimeAgo = time.Unix(1, 0) @@ -81,21 +66,28 @@ type ConnectionStater interface { } type response struct { - msg []byte closed bool // connection has been closed hijacked bool // connection has been hijacked by handler tsigTimersOnly bool tsigStatus error tsigRequestMAC string tsigSecret map[string]string // the tsig secrets - udp *net.UDPConn // i/o connection if UDP was used + udp net.PacketConn // i/o connection if UDP was used tcp net.Conn // i/o connection if TCP was used udpSession *SessionUDP // oob data to get egress interface right + pcSession net.Addr // address to use when writing to a generic net.PacketConn writer Writer // writer to output the raw DNS bits - wg *sync.WaitGroup // for gracefull shutdown +} + +// handleRefused returns a HandlerFunc that returns REFUSED for every request it gets. +func handleRefused(w ResponseWriter, r *Msg) { + m := new(Msg) + m.SetRcode(r, RcodeRefused) + w.WriteMsg(m) } // HandleFailed returns a HandlerFunc that returns SERVFAIL for every request it gets. +// Deprecated: This function is going away. func HandleFailed(w ResponseWriter, r *Msg) { m := new(Msg) m.SetRcode(r, RcodeServerFailure) @@ -156,12 +148,24 @@ type Reader interface { ReadUDP(conn *net.UDPConn, timeout time.Duration) ([]byte, *SessionUDP, error) } -// defaultReader is an adapter for the Server struct that implements the Reader interface -// using the readTCP and readUDP func of the embedded Server. +// PacketConnReader is an optional interface that Readers can implement to support using generic net.PacketConns. +type PacketConnReader interface { + Reader + + // ReadPacketConn reads a raw message from a generic net.PacketConn UDP connection. Implementations may + // alter connection properties, for example the read-deadline. + ReadPacketConn(conn net.PacketConn, timeout time.Duration) ([]byte, net.Addr, error) +} + +// defaultReader is an adapter for the Server struct that implements the Reader and +// PacketConnReader interfaces using the readTCP, readUDP and readPacketConn funcs +// of the embedded Server. type defaultReader struct { *Server } +var _ PacketConnReader = defaultReader{} + func (dr defaultReader) ReadTCP(conn net.Conn, timeout time.Duration) ([]byte, error) { return dr.readTCP(conn, timeout) } @@ -170,8 +174,14 @@ func (dr defaultReader) ReadUDP(conn *net.UDPConn, timeout time.Duration) ([]byt return dr.readUDP(conn, timeout) } +func (dr defaultReader) ReadPacketConn(conn net.PacketConn, timeout time.Duration) ([]byte, net.Addr, error) { + return dr.readPacketConn(conn, timeout) +} + // DecorateReader is a decorator hook for extending or supplanting the functionality of a Reader. // Implementations should never return a nil Reader. +// Readers should also implement the optional PacketConnReader interface. +// PacketConnReader is required to use a generic net.PacketConn. type DecorateReader func(Reader) Reader // DecorateWriter is a decorator hook for extending or supplanting the functionality of a Writer. @@ -218,11 +228,6 @@ type Server struct { // By default DefaultMsgAcceptFunc will be used. MsgAcceptFunc MsgAcceptFunc - // UDP packet or TCP connection queue - queue chan *response - // Workers count - workersCount int32 - // Shutdown handling lock sync.RWMutex started bool @@ -240,51 +245,6 @@ func (srv *Server) isStarted() bool { return started } -func (srv *Server) worker(w *response) { - srv.serve(w) - - for { - count := atomic.LoadInt32(&srv.workersCount) - if count > maxIdleWorkersCount { - return - } - if atomic.CompareAndSwapInt32(&srv.workersCount, count, count+1) { - break - } - } - - defer atomic.AddInt32(&srv.workersCount, -1) - - inUse := false - timeout := time.NewTimer(idleWorkerTimeout) - defer timeout.Stop() -LOOP: - for { - select { - case w, ok := <-srv.queue: - if !ok { - break LOOP - } - inUse = true - srv.serve(w) - case <-timeout.C: - if !inUse { - break LOOP - } - inUse = false - timeout.Reset(idleWorkerTimeout) - } - } -} - -func (srv *Server) spawnWorker(w *response) { - select { - case srv.queue <- w: - default: - go srv.worker(w) - } -} - func makeUDPBuffer(size int) func() interface{} { return func() interface{} { return make([]byte, size) @@ -292,8 +252,6 @@ func makeUDPBuffer(size int) func() interface{} { } func (srv *Server) init() { - srv.queue = make(chan *response) - srv.shutdown = make(chan struct{}) srv.conns = make(map[net.Conn]struct{}) @@ -301,7 +259,10 @@ func (srv *Server) init() { srv.UDPSize = MinMsgSize } if srv.MsgAcceptFunc == nil { - srv.MsgAcceptFunc = defaultMsgAcceptFunc + srv.MsgAcceptFunc = DefaultMsgAcceptFunc + } + if srv.Handler == nil { + srv.Handler = DefaultServeMux } srv.udpPool.New = makeUDPBuffer(srv.UDPSize) @@ -328,7 +289,6 @@ func (srv *Server) ListenAndServe() error { } srv.init() - defer close(srv.queue) switch srv.Net { case "tcp", "tcp4", "tcp6": @@ -383,26 +343,23 @@ func (srv *Server) ActivateAndServe() error { } srv.init() - defer close(srv.queue) - pConn := srv.PacketConn - l := srv.Listener - if pConn != nil { + if srv.PacketConn != nil { // Check PacketConn interface's type is valid and value // is not nil - if t, ok := pConn.(*net.UDPConn); ok && t != nil { + if t, ok := srv.PacketConn.(*net.UDPConn); ok && t != nil { if e := setUDPSocketOptions(t); e != nil { return e } - srv.started = true - unlock() - return srv.serveUDP(t) } + srv.started = true + unlock() + return srv.serveUDP(srv.PacketConn) } - if l != nil { + if srv.Listener != nil { srv.started = true unlock() - return srv.serveTCP(l) + return srv.serveTCP(srv.Listener) } return &Error{err: "bad listeners"} } @@ -499,29 +456,31 @@ func (srv *Server) serveTCP(l net.Listener) error { srv.conns[rw] = struct{}{} srv.lock.Unlock() wg.Add(1) - srv.spawnWorker(&response{ - tsigSecret: srv.TsigSecret, - tcp: rw, - wg: &wg, - }) + go srv.serveTCPConn(&wg, rw) } return nil } // serveUDP starts a UDP listener for the server. -func (srv *Server) serveUDP(l *net.UDPConn) error { +func (srv *Server) serveUDP(l net.PacketConn) error { defer l.Close() - if srv.NotifyStartedFunc != nil { - srv.NotifyStartedFunc() - } - reader := Reader(defaultReader{srv}) if srv.DecorateReader != nil { reader = srv.DecorateReader(reader) } + lUDP, isUDP := l.(*net.UDPConn) + readerPC, canPacketConn := reader.(PacketConnReader) + if !isUDP && !canPacketConn { + return &Error{err: "PacketConnReader was not implemented on Reader returned from DecorateReader but is required for net.PacketConn"} + } + + if srv.NotifyStartedFunc != nil { + srv.NotifyStartedFunc() + } + var wg sync.WaitGroup defer func() { wg.Wait() @@ -531,7 +490,17 @@ func (srv *Server) serveUDP(l *net.UDPConn) error { rtimeout := srv.getReadTimeout() // deadline is not used here for srv.isStarted() { - m, s, err := reader.ReadUDP(l, rtimeout) + var ( + m []byte + sPC net.Addr + sUDP *SessionUDP + err error + ) + if isUDP { + m, sUDP, err = reader.ReadUDP(lUDP, rtimeout) + } else { + m, sPC, err = readerPC.ReadPacketConn(l, rtimeout) + } if err != nil { if !srv.isStarted() { return nil @@ -548,45 +517,21 @@ func (srv *Server) serveUDP(l *net.UDPConn) error { continue } wg.Add(1) - srv.spawnWorker(&response{ - msg: m, - tsigSecret: srv.TsigSecret, - udp: l, - udpSession: s, - wg: &wg, - }) + go srv.serveUDPPacket(&wg, m, l, sUDP, sPC) } return nil } -func (srv *Server) serve(w *response) { +// Serve a new TCP connection. +func (srv *Server) serveTCPConn(wg *sync.WaitGroup, rw net.Conn) { + w := &response{tsigSecret: srv.TsigSecret, tcp: rw} if srv.DecorateWriter != nil { w.writer = srv.DecorateWriter(w) } else { w.writer = w } - if w.udp != nil { - // serve UDP - srv.serveDNS(w) - - w.wg.Done() - return - } - - defer func() { - if !w.hijacked { - w.Close() - } - - srv.lock.Lock() - delete(srv.conns, w.tcp) - srv.lock.Unlock() - - w.wg.Done() - }() - reader := Reader(defaultReader{srv}) if srv.DecorateReader != nil { reader = srv.DecorateReader(reader) @@ -605,14 +550,13 @@ func (srv *Server) serve(w *response) { } for q := 0; (q < limit || limit == -1) && srv.isStarted(); q++ { - var err error - w.msg, err = reader.ReadTCP(w.tcp, timeout) + m, err := reader.ReadTCP(w.tcp, timeout) if err != nil { // TODO(tmthrgd): handle error break } - srv.serveDNS(w) - if w.tcp == nil { + srv.serveDNS(m, w) + if w.closed { break // Close() was called } if w.hijacked { @@ -622,17 +566,33 @@ func (srv *Server) serve(w *response) { // idle timeout. timeout = idleTimeout } + + if !w.hijacked { + w.Close() + } + + srv.lock.Lock() + delete(srv.conns, w.tcp) + srv.lock.Unlock() + + wg.Done() } -func (srv *Server) disposeBuffer(w *response) { - if w.udp != nil && cap(w.msg) == srv.UDPSize { - srv.udpPool.Put(w.msg[:srv.UDPSize]) +// Serve a new UDP request. +func (srv *Server) serveUDPPacket(wg *sync.WaitGroup, m []byte, u net.PacketConn, udpSession *SessionUDP, pcSession net.Addr) { + w := &response{tsigSecret: srv.TsigSecret, udp: u, udpSession: udpSession, pcSession: pcSession} + if srv.DecorateWriter != nil { + w.writer = srv.DecorateWriter(w) + } else { + w.writer = w } - w.msg = nil + + srv.serveDNS(m, w) + wg.Done() } -func (srv *Server) serveDNS(w *response) { - dh, off, err := unpackMsgHdr(w.msg, 0) +func (srv *Server) serveDNS(m []byte, w *response) { + dh, off, err := unpackMsgHdr(m, 0) if err != nil { // Let client hang, they are sending crap; any reply can be used to amplify. return @@ -641,26 +601,32 @@ func (srv *Server) serveDNS(w *response) { req := new(Msg) req.setHdr(dh) - switch srv.MsgAcceptFunc(dh) { + switch action := srv.MsgAcceptFunc(dh); action { case MsgAccept: - case MsgIgnore: - return - case MsgReject: + if req.unpack(dh, m, off) == nil { + break + } + + fallthrough + case MsgReject, MsgRejectNotImplemented: + opcode := req.Opcode req.SetRcodeFormatError(req) + req.Zero = false + if action == MsgRejectNotImplemented { + req.Opcode = opcode + req.Rcode = RcodeNotImplemented + } + // Are we allowed to delete any OPT records here? req.Ns, req.Answer, req.Extra = nil, nil, nil w.WriteMsg(req) - srv.disposeBuffer(w) - return - } - - if err := req.unpack(dh, w.msg, off); err != nil { - req.SetRcodeFormatError(req) - req.Ns, req.Answer, req.Extra = nil, nil, nil + fallthrough + case MsgIgnore: + if w.udp != nil && cap(m) == srv.UDPSize { + srv.udpPool.Put(m[:srv.UDPSize]) + } - w.WriteMsg(req) - srv.disposeBuffer(w) return } @@ -668,7 +634,7 @@ func (srv *Server) serveDNS(w *response) { if w.tsigSecret != nil { if t := req.IsTsig(); t != nil { if secret, ok := w.tsigSecret[t.Hdr.Name]; ok { - w.tsigStatus = TsigVerify(w.msg, secret, "", false) + w.tsigStatus = TsigVerify(m, secret, "", false) } else { w.tsigStatus = ErrSecret } @@ -677,14 +643,11 @@ func (srv *Server) serveDNS(w *response) { } } - srv.disposeBuffer(w) - - handler := srv.Handler - if handler == nil { - handler = DefaultServeMux + if w.udp != nil && cap(m) == srv.UDPSize { + srv.udpPool.Put(m[:srv.UDPSize]) } - handler.ServeDNS(w, req) // Writes back to the client + srv.Handler.ServeDNS(w, req) // Writes back to the client } func (srv *Server) readTCP(conn net.Conn, timeout time.Duration) ([]byte, error) { @@ -698,36 +661,16 @@ func (srv *Server) readTCP(conn net.Conn, timeout time.Duration) ([]byte, error) } srv.lock.RUnlock() - l := make([]byte, 2) - n, err := conn.Read(l) - if err != nil || n != 2 { - if err != nil { - return nil, err - } - return nil, ErrShortRead - } - length := binary.BigEndian.Uint16(l) - if length == 0 { - return nil, ErrShortRead - } - m := make([]byte, int(length)) - n, err = conn.Read(m[:int(length)]) - if err != nil || n == 0 { - if err != nil { - return nil, err - } - return nil, ErrShortRead + var length uint16 + if err := binary.Read(conn, binary.BigEndian, &length); err != nil { + return nil, err } - i := n - for i < int(length) { - j, err := conn.Read(m[i:int(length)]) - if err != nil { - return nil, err - } - i += j + + m := make([]byte, length) + if _, err := io.ReadFull(conn, m); err != nil { + return nil, err } - n = i - m = m[:n] + return m, nil } @@ -749,6 +692,24 @@ func (srv *Server) readUDP(conn *net.UDPConn, timeout time.Duration) ([]byte, *S return m, s, nil } +func (srv *Server) readPacketConn(conn net.PacketConn, timeout time.Duration) ([]byte, net.Addr, error) { + srv.lock.RLock() + if srv.started { + // See the comment in readTCP above. + conn.SetReadDeadline(time.Now().Add(timeout)) + } + srv.lock.RUnlock() + + m := srv.udpPool.Get().([]byte) + n, addr, err := conn.ReadFrom(m) + if err != nil { + srv.udpPool.Put(m) + return nil, nil, err + } + m = m[:n] + return m, addr, nil +} + // WriteMsg implements the ResponseWriter.WriteMsg method. func (w *response) WriteMsg(m *Msg) (err error) { if w.closed { @@ -782,20 +743,19 @@ func (w *response) Write(m []byte) (int, error) { switch { case w.udp != nil: - return WriteToSessionUDP(w.udp, m, w.udpSession) - case w.tcp != nil: - lm := len(m) - if lm < 2 { - return 0, io.ErrShortBuffer + if u, ok := w.udp.(*net.UDPConn); ok { + return WriteToSessionUDP(u, m, w.udpSession) } - if lm > MaxMsgSize { + return w.udp.WriteTo(m, w.pcSession) + case w.tcp != nil: + if len(m) > MaxMsgSize { return 0, &Error{err: "message too large"} } - l := make([]byte, 2, 2+lm) - binary.BigEndian.PutUint16(l, uint16(lm)) - m = append(l, m...) - n, err := io.Copy(w.tcp, bytes.NewReader(m)) + l := make([]byte, 2) + binary.BigEndian.PutUint16(l, uint16(len(m))) + + n, err := (&net.Buffers{l, m}).WriteTo(w.tcp) return int(n), err default: panic("dns: internal error: udp and tcp both nil") @@ -819,10 +779,12 @@ func (w *response) RemoteAddr() net.Addr { switch { case w.udpSession != nil: return w.udpSession.RemoteAddr() + case w.pcSession != nil: + return w.pcSession case w.tcp != nil: return w.tcp.RemoteAddr() default: - panic("dns: internal error: udpSession and tcp both nil") + panic("dns: internal error: udpSession, pcSession and tcp are all nil") } } diff --git a/vendor/github.com/miekg/dns/sig0.go b/vendor/github.com/miekg/dns/sig0.go index ec65dd7f95dd..9ef13ccf3926 100644 --- a/vendor/github.com/miekg/dns/sig0.go +++ b/vendor/github.com/miekg/dns/sig0.go @@ -2,7 +2,6 @@ package dns import ( "crypto" - "crypto/dsa" "crypto/ecdsa" "crypto/rsa" "encoding/binary" @@ -85,7 +84,7 @@ func (rr *SIG) Verify(k *KEY, buf []byte) error { var hash crypto.Hash switch rr.Algorithm { - case DSA, RSASHA1: + case RSASHA1: hash = crypto.SHA1 case RSASHA256, ECDSAP256SHA256: hash = crypto.SHA256 @@ -178,19 +177,6 @@ func (rr *SIG) Verify(k *KEY, buf []byte) error { hashed := hasher.Sum(nil) sig := buf[sigend:] switch k.Algorithm { - case DSA: - pk := k.publicKeyDSA() - sig = sig[1:] - r := big.NewInt(0) - r.SetBytes(sig[:len(sig)/2]) - s := big.NewInt(0) - s.SetBytes(sig[len(sig)/2:]) - if pk != nil { - if dsa.Verify(pk, hashed, r, s) { - return nil - } - return ErrSig - } case RSASHA1, RSASHA256, RSASHA512: pk := k.publicKeyRSA() if pk != nil { @@ -198,10 +184,8 @@ func (rr *SIG) Verify(k *KEY, buf []byte) error { } case ECDSAP256SHA256, ECDSAP384SHA384: pk := k.publicKeyECDSA() - r := big.NewInt(0) - r.SetBytes(sig[:len(sig)/2]) - s := big.NewInt(0) - s.SetBytes(sig[len(sig)/2:]) + r := new(big.Int).SetBytes(sig[:len(sig)/2]) + s := new(big.Int).SetBytes(sig[len(sig)/2:]) if pk != nil { if ecdsa.Verify(pk, hashed, r, s) { return nil diff --git a/vendor/github.com/miekg/dns/svcb.go b/vendor/github.com/miekg/dns/svcb.go new file mode 100644 index 000000000000..f44dc67d7b50 --- /dev/null +++ b/vendor/github.com/miekg/dns/svcb.go @@ -0,0 +1,744 @@ +package dns + +import ( + "bytes" + "encoding/binary" + "errors" + "net" + "sort" + "strconv" + "strings" +) + +type SVCBKey uint16 + +// Keys defined in draft-ietf-dnsop-svcb-https-01 Section 12.3.2. +const ( + SVCB_MANDATORY SVCBKey = 0 + SVCB_ALPN SVCBKey = 1 + SVCB_NO_DEFAULT_ALPN SVCBKey = 2 + SVCB_PORT SVCBKey = 3 + SVCB_IPV4HINT SVCBKey = 4 + SVCB_ECHCONFIG SVCBKey = 5 + SVCB_IPV6HINT SVCBKey = 6 + svcb_RESERVED SVCBKey = 65535 +) + +var svcbKeyToStringMap = map[SVCBKey]string{ + SVCB_MANDATORY: "mandatory", + SVCB_ALPN: "alpn", + SVCB_NO_DEFAULT_ALPN: "no-default-alpn", + SVCB_PORT: "port", + SVCB_IPV4HINT: "ipv4hint", + SVCB_ECHCONFIG: "echconfig", + SVCB_IPV6HINT: "ipv6hint", +} + +var svcbStringToKeyMap = reverseSVCBKeyMap(svcbKeyToStringMap) + +func reverseSVCBKeyMap(m map[SVCBKey]string) map[string]SVCBKey { + n := make(map[string]SVCBKey, len(m)) + for u, s := range m { + n[s] = u + } + return n +} + +// String takes the numerical code of an SVCB key and returns its name. +// Returns an empty string for reserved keys. +// Accepts unassigned keys as well as experimental/private keys. +func (key SVCBKey) String() string { + if x := svcbKeyToStringMap[key]; x != "" { + return x + } + if key == svcb_RESERVED { + return "" + } + return "key" + strconv.FormatUint(uint64(key), 10) +} + +// svcbStringToKey returns the numerical code of an SVCB key. +// Returns svcb_RESERVED for reserved/invalid keys. +// Accepts unassigned keys as well as experimental/private keys. +func svcbStringToKey(s string) SVCBKey { + if strings.HasPrefix(s, "key") { + a, err := strconv.ParseUint(s[3:], 10, 16) + // no leading zeros + // key shouldn't be registered + if err != nil || a == 65535 || s[3] == '0' || svcbKeyToStringMap[SVCBKey(a)] != "" { + return svcb_RESERVED + } + return SVCBKey(a) + } + if key, ok := svcbStringToKeyMap[s]; ok { + return key + } + return svcb_RESERVED +} + +func (rr *SVCB) parse(c *zlexer, o string) *ParseError { + l, _ := c.Next() + i, e := strconv.ParseUint(l.token, 10, 16) + if e != nil || l.err { + return &ParseError{l.token, "bad SVCB priority", l} + } + rr.Priority = uint16(i) + + c.Next() // zBlank + l, _ = c.Next() // zString + rr.Target = l.token + + name, nameOk := toAbsoluteName(l.token, o) + if l.err || !nameOk { + return &ParseError{l.token, "bad SVCB Target", l} + } + rr.Target = name + + // Values (if any) + l, _ = c.Next() + var xs []SVCBKeyValue + // Helps require whitespace between pairs. + // Prevents key1000="a"key1001=... + canHaveNextKey := true + for l.value != zNewline && l.value != zEOF { + switch l.value { + case zString: + if !canHaveNextKey { + // The key we can now read was probably meant to be + // a part of the last value. + return &ParseError{l.token, "bad SVCB value quotation", l} + } + + // In key=value pairs, value does not have to be quoted unless value + // contains whitespace. And keys don't need to have values. + // Similarly, keys with an equality signs after them don't need values. + // l.token includes at least up to the first equality sign. + idx := strings.IndexByte(l.token, '=') + var key, value string + if idx < 0 { + // Key with no value and no equality sign + key = l.token + } else if idx == 0 { + return &ParseError{l.token, "bad SVCB key", l} + } else { + key, value = l.token[:idx], l.token[idx+1:] + + if value == "" { + // We have a key and an equality sign. Maybe we have nothing + // after "=" or we have a double quote. + l, _ = c.Next() + if l.value == zQuote { + // Only needed when value ends with double quotes. + // Any value starting with zQuote ends with it. + canHaveNextKey = false + + l, _ = c.Next() + switch l.value { + case zString: + // We have a value in double quotes. + value = l.token + l, _ = c.Next() + if l.value != zQuote { + return &ParseError{l.token, "SVCB unterminated value", l} + } + case zQuote: + // There's nothing in double quotes. + default: + return &ParseError{l.token, "bad SVCB value", l} + } + } + } + } + kv := makeSVCBKeyValue(svcbStringToKey(key)) + if kv == nil { + return &ParseError{l.token, "bad SVCB key", l} + } + if err := kv.parse(value); err != nil { + return &ParseError{l.token, err.Error(), l} + } + xs = append(xs, kv) + case zQuote: + return &ParseError{l.token, "SVCB key can't contain double quotes", l} + case zBlank: + canHaveNextKey = true + default: + return &ParseError{l.token, "bad SVCB values", l} + } + l, _ = c.Next() + } + rr.Value = xs + if rr.Priority == 0 && len(xs) > 0 { + return &ParseError{l.token, "SVCB aliasform can't have values", l} + } + return nil +} + +// makeSVCBKeyValue returns an SVCBKeyValue struct with the key or nil for reserved keys. +func makeSVCBKeyValue(key SVCBKey) SVCBKeyValue { + switch key { + case SVCB_MANDATORY: + return new(SVCBMandatory) + case SVCB_ALPN: + return new(SVCBAlpn) + case SVCB_NO_DEFAULT_ALPN: + return new(SVCBNoDefaultAlpn) + case SVCB_PORT: + return new(SVCBPort) + case SVCB_IPV4HINT: + return new(SVCBIPv4Hint) + case SVCB_ECHCONFIG: + return new(SVCBECHConfig) + case SVCB_IPV6HINT: + return new(SVCBIPv6Hint) + case svcb_RESERVED: + return nil + default: + e := new(SVCBLocal) + e.KeyCode = key + return e + } +} + +// SVCB RR. See RFC xxxx (https://tools.ietf.org/html/draft-ietf-dnsop-svcb-https-01). +type SVCB struct { + Hdr RR_Header + Priority uint16 + Target string `dns:"domain-name"` + Value []SVCBKeyValue `dns:"pairs"` // Value must be empty if Priority is non-zero. +} + +// HTTPS RR. Everything valid for SVCB applies to HTTPS as well. +// Except that the HTTPS record is intended for use with the HTTP and HTTPS protocols. +type HTTPS struct { + SVCB +} + +func (rr *HTTPS) String() string { + return rr.SVCB.String() +} + +func (rr *HTTPS) parse(c *zlexer, o string) *ParseError { + return rr.SVCB.parse(c, o) +} + +// SVCBKeyValue defines a key=value pair for the SVCB RR type. +// An SVCB RR can have multiple SVCBKeyValues appended to it. +type SVCBKeyValue interface { + Key() SVCBKey // Key returns the numerical key code. + pack() ([]byte, error) // pack returns the encoded value. + unpack([]byte) error // unpack sets the value. + String() string // String returns the string representation of the value. + parse(string) error // parse sets the value to the given string representation of the value. + copy() SVCBKeyValue // copy returns a deep-copy of the pair. + len() int // len returns the length of value in the wire format. +} + +// SVCBMandatory pair adds to required keys that must be interpreted for the RR +// to be functional. +// Basic use pattern for creating a mandatory option: +// +// s := &dns.SVCB{Hdr: dns.RR_Header{Name: ".", Rrtype: dns.TypeSVCB, Class: dns.ClassINET}} +// e := new(dns.SVCBMandatory) +// e.Code = []uint16{65403} +// s.Value = append(s.Value, e) +type SVCBMandatory struct { + Code []SVCBKey // Must not include mandatory +} + +func (*SVCBMandatory) Key() SVCBKey { return SVCB_MANDATORY } + +func (s *SVCBMandatory) String() string { + str := make([]string, len(s.Code)) + for i, e := range s.Code { + str[i] = e.String() + } + return strings.Join(str, ",") +} + +func (s *SVCBMandatory) pack() ([]byte, error) { + codes := append([]SVCBKey(nil), s.Code...) + sort.Slice(codes, func(i, j int) bool { + return codes[i] < codes[j] + }) + b := make([]byte, 2*len(codes)) + for i, e := range codes { + binary.BigEndian.PutUint16(b[2*i:], uint16(e)) + } + return b, nil +} + +func (s *SVCBMandatory) unpack(b []byte) error { + if len(b)%2 != 0 { + return errors.New("dns: svcbmandatory: value length is not a multiple of 2") + } + codes := make([]SVCBKey, 0, len(b)/2) + for i := 0; i < len(b); i += 2 { + // We assume strictly increasing order. + codes = append(codes, SVCBKey(binary.BigEndian.Uint16(b[i:]))) + } + s.Code = codes + return nil +} + +func (s *SVCBMandatory) parse(b string) error { + str := strings.Split(b, ",") + codes := make([]SVCBKey, 0, len(str)) + for _, e := range str { + codes = append(codes, svcbStringToKey(e)) + } + s.Code = codes + return nil +} + +func (s *SVCBMandatory) len() int { + return 2 * len(s.Code) +} + +func (s *SVCBMandatory) copy() SVCBKeyValue { + return &SVCBMandatory{ + append([]SVCBKey(nil), s.Code...), + } +} + +// SVCBAlpn pair is used to list supported connection protocols. +// Protocol ids can be found at: +// https://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml#alpn-protocol-ids +// Basic use pattern for creating an alpn option: +// +// h := new(dns.HTTPS) +// h.Hdr = dns.RR_Header{Name: ".", Rrtype: dns.TypeHTTPS, Class: dns.ClassINET} +// e := new(dns.SVCBAlpn) +// e.Alpn = []string{"h2", "http/1.1"} +// h.Value = append(o.Value, e) +type SVCBAlpn struct { + Alpn []string +} + +func (*SVCBAlpn) Key() SVCBKey { return SVCB_ALPN } +func (s *SVCBAlpn) String() string { return strings.Join(s.Alpn, ",") } + +func (s *SVCBAlpn) pack() ([]byte, error) { + // Liberally estimate the size of an alpn as 10 octets + b := make([]byte, 0, 10*len(s.Alpn)) + for _, e := range s.Alpn { + if len(e) == 0 { + return nil, errors.New("dns: svcbalpn: empty alpn-id") + } + if len(e) > 255 { + return nil, errors.New("dns: svcbalpn: alpn-id too long") + } + b = append(b, byte(len(e))) + b = append(b, e...) + } + return b, nil +} + +func (s *SVCBAlpn) unpack(b []byte) error { + // Estimate the size of the smallest alpn as 4 bytes + alpn := make([]string, 0, len(b)/4) + for i := 0; i < len(b); { + length := int(b[i]) + i++ + if i+length > len(b) { + return errors.New("dns: svcbalpn: alpn array overflowing") + } + alpn = append(alpn, string(b[i:i+length])) + i += length + } + s.Alpn = alpn + return nil +} + +func (s *SVCBAlpn) parse(b string) error { + s.Alpn = strings.Split(b, ",") + return nil +} + +func (s *SVCBAlpn) len() int { + var l int + for _, e := range s.Alpn { + l += 1 + len(e) + } + return l +} + +func (s *SVCBAlpn) copy() SVCBKeyValue { + return &SVCBAlpn{ + append([]string(nil), s.Alpn...), + } +} + +// SVCBNoDefaultAlpn pair signifies no support for default connection protocols. +// Basic use pattern for creating a no-default-alpn option: +// +// s := &dns.SVCB{Hdr: dns.RR_Header{Name: ".", Rrtype: dns.TypeSVCB, Class: dns.ClassINET}} +// e := new(dns.SVCBNoDefaultAlpn) +// s.Value = append(s.Value, e) +type SVCBNoDefaultAlpn struct{} + +func (*SVCBNoDefaultAlpn) Key() SVCBKey { return SVCB_NO_DEFAULT_ALPN } +func (*SVCBNoDefaultAlpn) copy() SVCBKeyValue { return &SVCBNoDefaultAlpn{} } +func (*SVCBNoDefaultAlpn) pack() ([]byte, error) { return []byte{}, nil } +func (*SVCBNoDefaultAlpn) String() string { return "" } +func (*SVCBNoDefaultAlpn) len() int { return 0 } + +func (*SVCBNoDefaultAlpn) unpack(b []byte) error { + if len(b) != 0 { + return errors.New("dns: svcbnodefaultalpn: no_default_alpn must have no value") + } + return nil +} + +func (*SVCBNoDefaultAlpn) parse(b string) error { + if len(b) != 0 { + return errors.New("dns: svcbnodefaultalpn: no_default_alpn must have no value") + } + return nil +} + +// SVCBPort pair defines the port for connection. +// Basic use pattern for creating a port option: +// +// s := &dns.SVCB{Hdr: dns.RR_Header{Name: ".", Rrtype: dns.TypeSVCB, Class: dns.ClassINET}} +// e := new(dns.SVCBPort) +// e.Port = 80 +// s.Value = append(s.Value, e) +type SVCBPort struct { + Port uint16 +} + +func (*SVCBPort) Key() SVCBKey { return SVCB_PORT } +func (*SVCBPort) len() int { return 2 } +func (s *SVCBPort) String() string { return strconv.FormatUint(uint64(s.Port), 10) } +func (s *SVCBPort) copy() SVCBKeyValue { return &SVCBPort{s.Port} } + +func (s *SVCBPort) unpack(b []byte) error { + if len(b) != 2 { + return errors.New("dns: svcbport: port length is not exactly 2 octets") + } + s.Port = binary.BigEndian.Uint16(b) + return nil +} + +func (s *SVCBPort) pack() ([]byte, error) { + b := make([]byte, 2) + binary.BigEndian.PutUint16(b, s.Port) + return b, nil +} + +func (s *SVCBPort) parse(b string) error { + port, err := strconv.ParseUint(b, 10, 16) + if err != nil { + return errors.New("dns: svcbport: port out of range") + } + s.Port = uint16(port) + return nil +} + +// SVCBIPv4Hint pair suggests an IPv4 address which may be used to open connections +// if A and AAAA record responses for SVCB's Target domain haven't been received. +// In that case, optionally, A and AAAA requests can be made, after which the connection +// to the hinted IP address may be terminated and a new connection may be opened. +// Basic use pattern for creating an ipv4hint option: +// +// h := new(dns.HTTPS) +// h.Hdr = dns.RR_Header{Name: ".", Rrtype: dns.TypeHTTPS, Class: dns.ClassINET} +// e := new(dns.SVCBIPv4Hint) +// e.Hint = []net.IP{net.IPv4(1,1,1,1).To4()} +// +// Or +// +// e.Hint = []net.IP{net.ParseIP("1.1.1.1").To4()} +// h.Value = append(h.Value, e) +type SVCBIPv4Hint struct { + Hint []net.IP +} + +func (*SVCBIPv4Hint) Key() SVCBKey { return SVCB_IPV4HINT } +func (s *SVCBIPv4Hint) len() int { return 4 * len(s.Hint) } + +func (s *SVCBIPv4Hint) pack() ([]byte, error) { + b := make([]byte, 0, 4*len(s.Hint)) + for _, e := range s.Hint { + x := e.To4() + if x == nil { + return nil, errors.New("dns: svcbipv4hint: expected ipv4, hint is ipv6") + } + b = append(b, x...) + } + return b, nil +} + +func (s *SVCBIPv4Hint) unpack(b []byte) error { + if len(b) == 0 || len(b)%4 != 0 { + return errors.New("dns: svcbipv4hint: ipv4 address byte array length is not a multiple of 4") + } + x := make([]net.IP, 0, len(b)/4) + for i := 0; i < len(b); i += 4 { + x = append(x, net.IP(b[i:i+4])) + } + s.Hint = x + return nil +} + +func (s *SVCBIPv4Hint) String() string { + str := make([]string, len(s.Hint)) + for i, e := range s.Hint { + x := e.To4() + if x == nil { + return "" + } + str[i] = x.String() + } + return strings.Join(str, ",") +} + +func (s *SVCBIPv4Hint) parse(b string) error { + if strings.Contains(b, ":") { + return errors.New("dns: svcbipv4hint: expected ipv4, got ipv6") + } + str := strings.Split(b, ",") + dst := make([]net.IP, len(str)) + for i, e := range str { + ip := net.ParseIP(e).To4() + if ip == nil { + return errors.New("dns: svcbipv4hint: bad ip") + } + dst[i] = ip + } + s.Hint = dst + return nil +} + +func (s *SVCBIPv4Hint) copy() SVCBKeyValue { + return &SVCBIPv4Hint{ + append([]net.IP(nil), s.Hint...), + } +} + +// SVCBECHConfig pair contains the ECHConfig structure defined in draft-ietf-tls-esni [RFC xxxx]. +// Basic use pattern for creating an echconfig option: +// +// h := new(dns.HTTPS) +// h.Hdr = dns.RR_Header{Name: ".", Rrtype: dns.TypeHTTPS, Class: dns.ClassINET} +// e := new(dns.SVCBECHConfig) +// e.ECH = []byte{0xfe, 0x08, ...} +// h.Value = append(h.Value, e) +type SVCBECHConfig struct { + ECH []byte +} + +func (*SVCBECHConfig) Key() SVCBKey { return SVCB_ECHCONFIG } +func (s *SVCBECHConfig) String() string { return toBase64(s.ECH) } +func (s *SVCBECHConfig) len() int { return len(s.ECH) } + +func (s *SVCBECHConfig) pack() ([]byte, error) { + return append([]byte(nil), s.ECH...), nil +} + +func (s *SVCBECHConfig) copy() SVCBKeyValue { + return &SVCBECHConfig{ + append([]byte(nil), s.ECH...), + } +} + +func (s *SVCBECHConfig) unpack(b []byte) error { + s.ECH = append([]byte(nil), b...) + return nil +} +func (s *SVCBECHConfig) parse(b string) error { + x, err := fromBase64([]byte(b)) + if err != nil { + return errors.New("dns: svcbechconfig: bad base64 echconfig") + } + s.ECH = x + return nil +} + +// SVCBIPv6Hint pair suggests an IPv6 address which may be used to open connections +// if A and AAAA record responses for SVCB's Target domain haven't been received. +// In that case, optionally, A and AAAA requests can be made, after which the +// connection to the hinted IP address may be terminated and a new connection may be opened. +// Basic use pattern for creating an ipv6hint option: +// +// h := new(dns.HTTPS) +// h.Hdr = dns.RR_Header{Name: ".", Rrtype: dns.TypeHTTPS, Class: dns.ClassINET} +// e := new(dns.SVCBIPv6Hint) +// e.Hint = []net.IP{net.ParseIP("2001:db8::1")} +// h.Value = append(h.Value, e) +type SVCBIPv6Hint struct { + Hint []net.IP +} + +func (*SVCBIPv6Hint) Key() SVCBKey { return SVCB_IPV6HINT } +func (s *SVCBIPv6Hint) len() int { return 16 * len(s.Hint) } + +func (s *SVCBIPv6Hint) pack() ([]byte, error) { + b := make([]byte, 0, 16*len(s.Hint)) + for _, e := range s.Hint { + if len(e) != net.IPv6len || e.To4() != nil { + return nil, errors.New("dns: svcbipv6hint: expected ipv6, hint is ipv4") + } + b = append(b, e...) + } + return b, nil +} + +func (s *SVCBIPv6Hint) unpack(b []byte) error { + if len(b) == 0 || len(b)%16 != 0 { + return errors.New("dns: svcbipv6hint: ipv6 address byte array length not a multiple of 16") + } + x := make([]net.IP, 0, len(b)/16) + for i := 0; i < len(b); i += 16 { + ip := net.IP(b[i : i+16]) + if ip.To4() != nil { + return errors.New("dns: svcbipv6hint: expected ipv6, got ipv4") + } + x = append(x, ip) + } + s.Hint = x + return nil +} + +func (s *SVCBIPv6Hint) String() string { + str := make([]string, len(s.Hint)) + for i, e := range s.Hint { + if x := e.To4(); x != nil { + return "" + } + str[i] = e.String() + } + return strings.Join(str, ",") +} + +func (s *SVCBIPv6Hint) parse(b string) error { + if strings.Contains(b, ".") { + return errors.New("dns: svcbipv6hint: expected ipv6, got ipv4") + } + str := strings.Split(b, ",") + dst := make([]net.IP, len(str)) + for i, e := range str { + ip := net.ParseIP(e) + if ip == nil { + return errors.New("dns: svcbipv6hint: bad ip") + } + dst[i] = ip + } + s.Hint = dst + return nil +} + +func (s *SVCBIPv6Hint) copy() SVCBKeyValue { + return &SVCBIPv6Hint{ + append([]net.IP(nil), s.Hint...), + } +} + +// SVCBLocal pair is intended for experimental/private use. The key is recommended +// to be in the range [SVCB_PRIVATE_LOWER, SVCB_PRIVATE_UPPER]. +// Basic use pattern for creating a keyNNNNN option: +// +// h := new(dns.HTTPS) +// h.Hdr = dns.RR_Header{Name: ".", Rrtype: dns.TypeHTTPS, Class: dns.ClassINET} +// e := new(dns.SVCBLocal) +// e.KeyCode = 65400 +// e.Data = []byte("abc") +// h.Value = append(h.Value, e) +type SVCBLocal struct { + KeyCode SVCBKey // Never 65535 or any assigned keys. + Data []byte // All byte sequences are allowed. +} + +func (s *SVCBLocal) Key() SVCBKey { return s.KeyCode } +func (s *SVCBLocal) pack() ([]byte, error) { return append([]byte(nil), s.Data...), nil } +func (s *SVCBLocal) len() int { return len(s.Data) } + +func (s *SVCBLocal) unpack(b []byte) error { + s.Data = append([]byte(nil), b...) + return nil +} + +func (s *SVCBLocal) String() string { + var str strings.Builder + str.Grow(4 * len(s.Data)) + for _, e := range s.Data { + if ' ' <= e && e <= '~' { + switch e { + case '"', ';', ' ', '\\': + str.WriteByte('\\') + str.WriteByte(e) + default: + str.WriteByte(e) + } + } else { + str.WriteString(escapeByte(e)) + } + } + return str.String() +} + +func (s *SVCBLocal) parse(b string) error { + data := make([]byte, 0, len(b)) + for i := 0; i < len(b); { + if b[i] != '\\' { + data = append(data, b[i]) + i++ + continue + } + if i+1 == len(b) { + return errors.New("dns: svcblocal: svcb private/experimental key escape unterminated") + } + if isDigit(b[i+1]) { + if i+3 < len(b) && isDigit(b[i+2]) && isDigit(b[i+3]) { + a, err := strconv.ParseUint(b[i+1:i+4], 10, 8) + if err == nil { + i += 4 + data = append(data, byte(a)) + continue + } + } + return errors.New("dns: svcblocal: svcb private/experimental key bad escaped octet") + } else { + data = append(data, b[i+1]) + i += 2 + } + } + s.Data = data + return nil +} + +func (s *SVCBLocal) copy() SVCBKeyValue { + return &SVCBLocal{s.KeyCode, + append([]byte(nil), s.Data...), + } +} + +func (rr *SVCB) String() string { + s := rr.Hdr.String() + + strconv.Itoa(int(rr.Priority)) + " " + + sprintName(rr.Target) + for _, e := range rr.Value { + s += " " + e.Key().String() + "=\"" + e.String() + "\"" + } + return s +} + +// areSVCBPairArraysEqual checks if SVCBKeyValue arrays are equal after sorting their +// copies. arrA and arrB have equal lengths, otherwise zduplicate.go wouldn't call this function. +func areSVCBPairArraysEqual(a []SVCBKeyValue, b []SVCBKeyValue) bool { + a = append([]SVCBKeyValue(nil), a...) + b = append([]SVCBKeyValue(nil), b...) + sort.Slice(a, func(i, j int) bool { return a[i].Key() < a[j].Key() }) + sort.Slice(b, func(i, j int) bool { return b[i].Key() < b[j].Key() }) + for i, e := range a { + if e.Key() != b[i].Key() { + return false + } + b1, err1 := e.pack() + b2, err2 := b[i].pack() + if err1 != nil || err2 != nil || !bytes.Equal(b1, b2) { + return false + } + } + return true +} diff --git a/vendor/github.com/miekg/dns/tsig.go b/vendor/github.com/miekg/dns/tsig.go index afa462fa0731..59904dd6a090 100644 --- a/vendor/github.com/miekg/dns/tsig.go +++ b/vendor/github.com/miekg/dns/tsig.go @@ -2,7 +2,6 @@ package dns import ( "crypto/hmac" - "crypto/md5" "crypto/sha1" "crypto/sha256" "crypto/sha512" @@ -16,10 +15,13 @@ import ( // HMAC hashing codes. These are transmitted as domain names. const ( - HmacMD5 = "hmac-md5.sig-alg.reg.int." HmacSHA1 = "hmac-sha1." + HmacSHA224 = "hmac-sha224." HmacSHA256 = "hmac-sha256." + HmacSHA384 = "hmac-sha384." HmacSHA512 = "hmac-sha512." + + HmacMD5 = "hmac-md5.sig-alg.reg.int." // Deprecated: HmacMD5 is no longer supported. ) // TSIG is the RR the holds the transaction signature of a message. @@ -40,7 +42,7 @@ type TSIG struct { // TSIG has no official presentation format, but this will suffice. func (rr *TSIG) String() string { - s := "\n;; TSIG PSEUDOSECTION:\n" + s := "\n;; TSIG PSEUDOSECTION:\n; " // add another semi-colon to signify TSIG does not have a presentation format s += rr.Hdr.String() + " " + rr.Algorithm + " " + tsigTimeToString(rr.TimeSigned) + @@ -54,7 +56,7 @@ func (rr *TSIG) String() string { return s } -func (rr *TSIG) parse(c *zlexer, origin, file string) *ParseError { +func (rr *TSIG) parse(c *zlexer, origin string) *ParseError { panic("dns: internal error: parse should never be called on TSIG") } @@ -111,32 +113,33 @@ func TsigGenerate(m *Msg, secret, requestMAC string, timersOnly bool) ([]byte, s if err != nil { return nil, "", err } - buf := tsigBuffer(mbuf, rr, requestMAC, timersOnly) + buf, err := tsigBuffer(mbuf, rr, requestMAC, timersOnly) + if err != nil { + return nil, "", err + } t := new(TSIG) var h hash.Hash - switch strings.ToLower(rr.Algorithm) { - case HmacMD5: - h = hmac.New(md5.New, rawsecret) + switch CanonicalName(rr.Algorithm) { case HmacSHA1: h = hmac.New(sha1.New, rawsecret) + case HmacSHA224: + h = hmac.New(sha256.New224, rawsecret) case HmacSHA256: h = hmac.New(sha256.New, rawsecret) + case HmacSHA384: + h = hmac.New(sha512.New384, rawsecret) case HmacSHA512: h = hmac.New(sha512.New, rawsecret) default: return nil, "", ErrKeyAlg } h.Write(buf) + // Copy all TSIG fields except MAC and its size, which are filled using the computed digest. + *t = *rr t.MAC = hex.EncodeToString(h.Sum(nil)) t.MACSize = uint16(len(t.MAC) / 2) // Size is half! - t.Hdr = RR_Header{Name: rr.Hdr.Name, Rrtype: TypeTSIG, Class: ClassANY, Ttl: 0} - t.Fudge = rr.Fudge - t.TimeSigned = rr.TimeSigned - t.Algorithm = rr.Algorithm - t.OrigId = m.Id - tbuf := make([]byte, Len(t)) off, err := PackRR(t, tbuf, 0, nil, false) if err != nil { @@ -153,6 +156,11 @@ func TsigGenerate(m *Msg, secret, requestMAC string, timersOnly bool) ([]byte, s // If the signature does not validate err contains the // error, otherwise it is nil. func TsigVerify(msg []byte, secret, requestMAC string, timersOnly bool) error { + return tsigVerify(msg, secret, requestMAC, timersOnly, uint64(time.Now().Unix())) +} + +// actual implementation of TsigVerify, taking the current time ('now') as a parameter for the convenience of tests. +func tsigVerify(msg []byte, secret, requestMAC string, timersOnly bool, now uint64) error { rawsecret, err := fromBase64([]byte(secret)) if err != nil { return err @@ -168,27 +176,21 @@ func TsigVerify(msg []byte, secret, requestMAC string, timersOnly bool) error { return err } - buf := tsigBuffer(stripped, tsig, requestMAC, timersOnly) - - // Fudge factor works both ways. A message can arrive before it was signed because - // of clock skew. - now := uint64(time.Now().Unix()) - ti := now - tsig.TimeSigned - if now < tsig.TimeSigned { - ti = tsig.TimeSigned - now - } - if uint64(tsig.Fudge) < ti { - return ErrTime + buf, err := tsigBuffer(stripped, tsig, requestMAC, timersOnly) + if err != nil { + return err } var h hash.Hash - switch strings.ToLower(tsig.Algorithm) { - case HmacMD5: - h = hmac.New(md5.New, rawsecret) + switch CanonicalName(tsig.Algorithm) { case HmacSHA1: h = hmac.New(sha1.New, rawsecret) + case HmacSHA224: + h = hmac.New(sha256.New224, rawsecret) case HmacSHA256: h = hmac.New(sha256.New, rawsecret) + case HmacSHA384: + h = hmac.New(sha512.New384, rawsecret) case HmacSHA512: h = hmac.New(sha512.New, rawsecret) default: @@ -198,11 +200,24 @@ func TsigVerify(msg []byte, secret, requestMAC string, timersOnly bool) error { if !hmac.Equal(h.Sum(nil), msgMAC) { return ErrSig } + + // Fudge factor works both ways. A message can arrive before it was signed because + // of clock skew. + // We check this after verifying the signature, following draft-ietf-dnsop-rfc2845bis + // instead of RFC2845, in order to prevent a security vulnerability as reported in CVE-2017-3142/3143. + ti := now - tsig.TimeSigned + if now < tsig.TimeSigned { + ti = tsig.TimeSigned - now + } + if uint64(tsig.Fudge) < ti { + return ErrTime + } + return nil } // Create a wiredata buffer for the MAC calculation. -func tsigBuffer(msgbuf []byte, rr *TSIG, requestMAC string, timersOnly bool) []byte { +func tsigBuffer(msgbuf []byte, rr *TSIG, requestMAC string, timersOnly bool) ([]byte, error) { var buf []byte if rr.TimeSigned == 0 { rr.TimeSigned = uint64(time.Now().Unix()) @@ -219,7 +234,10 @@ func tsigBuffer(msgbuf []byte, rr *TSIG, requestMAC string, timersOnly bool) []b m.MACSize = uint16(len(requestMAC) / 2) m.MAC = requestMAC buf = make([]byte, len(requestMAC)) // long enough - n, _ := packMacWire(m, buf) + n, err := packMacWire(m, buf) + if err != nil { + return nil, err + } buf = buf[:n] } @@ -228,20 +246,26 @@ func tsigBuffer(msgbuf []byte, rr *TSIG, requestMAC string, timersOnly bool) []b tsig := new(timerWireFmt) tsig.TimeSigned = rr.TimeSigned tsig.Fudge = rr.Fudge - n, _ := packTimerWire(tsig, tsigvar) + n, err := packTimerWire(tsig, tsigvar) + if err != nil { + return nil, err + } tsigvar = tsigvar[:n] } else { tsig := new(tsigWireFmt) - tsig.Name = strings.ToLower(rr.Hdr.Name) + tsig.Name = CanonicalName(rr.Hdr.Name) tsig.Class = ClassANY tsig.Ttl = rr.Hdr.Ttl - tsig.Algorithm = strings.ToLower(rr.Algorithm) + tsig.Algorithm = CanonicalName(rr.Algorithm) tsig.TimeSigned = rr.TimeSigned tsig.Fudge = rr.Fudge tsig.Error = rr.Error tsig.OtherLen = rr.OtherLen tsig.OtherData = rr.OtherData - n, _ := packTsigWire(tsig, tsigvar) + n, err := packTsigWire(tsig, tsigvar) + if err != nil { + return nil, err + } tsigvar = tsigvar[:n] } @@ -251,7 +275,7 @@ func tsigBuffer(msgbuf []byte, rr *TSIG, requestMAC string, timersOnly bool) []b } else { buf = append(msgbuf, tsigvar...) } - return buf + return buf, nil } // Strip the TSIG from the raw message. diff --git a/vendor/github.com/miekg/dns/types.go b/vendor/github.com/miekg/dns/types.go index efa342443bea..1f385bd229bf 100644 --- a/vendor/github.com/miekg/dns/types.go +++ b/vendor/github.com/miekg/dns/types.go @@ -1,6 +1,7 @@ package dns import ( + "bytes" "fmt" "net" "strconv" @@ -61,6 +62,7 @@ const ( TypeCERT uint16 = 37 TypeDNAME uint16 = 39 TypeOPT uint16 = 41 // EDNS + TypeAPL uint16 = 42 TypeDS uint16 = 43 TypeSSHFP uint16 = 44 TypeRRSIG uint16 = 46 @@ -79,6 +81,8 @@ const ( TypeCDNSKEY uint16 = 60 TypeOPENPGPKEY uint16 = 61 TypeCSYNC uint16 = 62 + TypeSVCB uint16 = 64 + TypeHTTPS uint16 = 65 TypeSPF uint16 = 99 TypeUINFO uint16 = 100 TypeUID uint16 = 101 @@ -163,11 +167,11 @@ const ( _RD = 1 << 8 // recursion desired _RA = 1 << 7 // recursion available _Z = 1 << 6 // Z - _AD = 1 << 5 // authticated data + _AD = 1 << 5 // authenticated data _CD = 1 << 4 // checking disabled ) -// Various constants used in the LOC RR, See RFC 1887. +// Various constants used in the LOC RR. See RFC 1887. const ( LOC_EQUATOR = 1 << 31 // RFC 1876, Section 2. LOC_PRIMEMERIDIAN = 1 << 31 // RFC 1876, Section 2. @@ -207,8 +211,11 @@ var CertTypeToString = map[uint16]string{ //go:generate go run types_generate.go -// Question holds a DNS question. There can be multiple questions in the -// question section of a message. Usually there is just one. +// Question holds a DNS question. Usually there is just one. While the +// original DNS RFCs allow multiple questions in the question section of a +// message, in practice it never works. Because most DNS servers see multiple +// questions as an error, it is recommended to only have one question per +// message. type Question struct { Name string `dns:"cdomain-name"` // "cdomain-name" specifies encoding (and may be compressed) Qtype uint16 @@ -229,7 +236,7 @@ func (q *Question) String() (s string) { return s } -// ANY is a wildcard record. See RFC 1035, Section 3.2.3. ANY +// ANY is a wild card record. See RFC 1035, Section 3.2.3. ANY // is named "*" there. type ANY struct { Hdr RR_Header @@ -238,7 +245,7 @@ type ANY struct { func (rr *ANY) String() string { return rr.Hdr.String() } -func (rr *ANY) parse(c *zlexer, origin, file string) *ParseError { +func (rr *ANY) parse(c *zlexer, origin string) *ParseError { panic("dns: internal error: parse should never be called on ANY") } @@ -253,7 +260,7 @@ func (rr *NULL) String() string { return ";" + rr.Hdr.String() + rr.Data } -func (rr *NULL) parse(c *zlexer, origin, file string) *ParseError { +func (rr *NULL) parse(c *zlexer, origin string) *ParseError { panic("dns: internal error: parse should never be called on NULL") } @@ -404,7 +411,7 @@ type RP struct { } func (rr *RP) String() string { - return rr.Hdr.String() + rr.Mbox + " " + sprintTxt([]string{rr.Txt}) + return rr.Hdr.String() + sprintName(rr.Mbox) + " " + sprintName(rr.Txt) } // SOA RR. See RFC 1035. @@ -438,25 +445,47 @@ func (rr *TXT) String() string { return rr.Hdr.String() + sprintTxt(rr.Txt) } func sprintName(s string) string { var dst strings.Builder - dst.Grow(len(s)) + for i := 0; i < len(s); { - if i+1 < len(s) && s[i] == '\\' && s[i+1] == '.' { - dst.WriteString(s[i : i+2]) - i += 2 + if s[i] == '.' { + if dst.Len() != 0 { + dst.WriteByte('.') + } + i++ continue } b, n := nextByte(s, i) - switch { - case n == 0: - i++ // dangling back slash - case b == '.': - dst.WriteByte('.') - default: - writeDomainNameByte(&dst, b) + if n == 0 { + // Drop "dangling" incomplete escapes. + if dst.Len() == 0 { + return s[:i] + } + break + } + if isDomainNameLabelSpecial(b) { + if dst.Len() == 0 { + dst.Grow(len(s) * 2) + dst.WriteString(s[:i]) + } + dst.WriteByte('\\') + dst.WriteByte(b) + } else if b < ' ' || b > '~' { // unprintable, use \DDD + if dst.Len() == 0 { + dst.Grow(len(s) * 2) + dst.WriteString(s[:i]) + } + dst.WriteString(escapeByte(b)) + } else { + if dst.Len() != 0 { + dst.WriteByte(b) + } } i += n } + if dst.Len() == 0 { + return s + } return dst.String() } @@ -472,15 +501,10 @@ func sprintTxtOctet(s string) string { } b, n := nextByte(s, i) - switch { - case n == 0: + if n == 0 { i++ // dangling back slash - case b == '.': - dst.WriteByte('.') - case b < ' ' || b > '~': - dst.WriteString(escapeByte(b)) - default: - dst.WriteByte(b) + } else { + writeTXTStringByte(&dst, b) } i += n } @@ -510,16 +534,6 @@ func sprintTxt(txt []string) string { return out.String() } -func writeDomainNameByte(s *strings.Builder, b byte) { - switch b { - case '.', ' ', '\'', '@', ';', '(', ')': // additional chars to escape - s.WriteByte('\\') - s.WriteByte(b) - default: - writeTXTStringByte(s, b) - } -} - func writeTXTStringByte(s *strings.Builder, b byte) { switch { case b == '"' || b == '\\': @@ -566,6 +580,17 @@ func escapeByte(b byte) string { return escapedByteLarge[int(b)*4 : int(b)*4+4] } +// isDomainNameLabelSpecial returns true if +// a domain name label byte should be prefixed +// with an escaping backslash. +func isDomainNameLabelSpecial(b byte) bool { + switch b { + case '.', ' ', '\'', '@', ';', '(', ')', '"', '\\': + return true + } + return false +} + func nextByte(s string, offset int) (byte, int) { if offset >= len(s) { return 0, 0 @@ -738,8 +763,8 @@ type LOC struct { Altitude uint32 } -// cmToM takes a cm value expressed in RFC1876 SIZE mantissa/exponent -// format and returns a string in m (two decimals for the cm) +// cmToM takes a cm value expressed in RFC 1876 SIZE mantissa/exponent +// format and returns a string in m (two decimals for the cm). func cmToM(m, e uint8) string { if e < 2 { if e == 1 { @@ -845,8 +870,8 @@ type NSEC struct { func (rr *NSEC) String() string { s := rr.Hdr.String() + sprintName(rr.NextDomain) - for i := 0; i < len(rr.TypeBitMap); i++ { - s += " " + Type(rr.TypeBitMap[i]).String() + for _, t := range rr.TypeBitMap { + s += " " + Type(t).String() } return s } @@ -854,14 +879,7 @@ func (rr *NSEC) String() string { func (rr *NSEC) len(off int, compression map[string]struct{}) int { l := rr.Hdr.len(off, compression) l += domainNameLen(rr.NextDomain, off+l, compression, false) - lastwindow := uint32(2 ^ 32 + 1) - for _, t := range rr.TypeBitMap { - window := t / 256 - if uint32(window) != lastwindow { - l += 1 + 32 - } - lastwindow = uint32(window) - } + l += typeBitMapLen(rr.TypeBitMap) return l } @@ -1011,8 +1029,8 @@ func (rr *NSEC3) String() string { " " + strconv.Itoa(int(rr.Iterations)) + " " + saltToString(rr.Salt) + " " + rr.NextDomain - for i := 0; i < len(rr.TypeBitMap); i++ { - s += " " + Type(rr.TypeBitMap[i]).String() + for _, t := range rr.TypeBitMap { + s += " " + Type(t).String() } return s } @@ -1020,14 +1038,7 @@ func (rr *NSEC3) String() string { func (rr *NSEC3) len(off int, compression map[string]struct{}) int { l := rr.Hdr.len(off, compression) l += 6 + len(rr.Salt)/2 + 1 + len(rr.NextDomain) + 1 - lastwindow := uint32(2 ^ 32 + 1) - for _, t := range rr.TypeBitMap { - window := t / 256 - if uint32(window) != lastwindow { - l += 1 + 32 - } - lastwindow = uint32(window) - } + l += typeBitMapLen(rr.TypeBitMap) return l } @@ -1111,6 +1122,7 @@ type URI struct { Target string `dns:"octet"` } +// rr.Target to be parsed as a sequence of character encoded octets according to RFC 3986 func (rr *URI) String() string { return rr.Hdr.String() + strconv.Itoa(int(rr.Priority)) + " " + strconv.Itoa(int(rr.Weight)) + " " + sprintTxtOctet(rr.Target) @@ -1272,6 +1284,7 @@ type CAA struct { Value string `dns:"octet"` } +// rr.Value Is the character-string encoding of the value field as specified in RFC 1035, Section 5.1. func (rr *CAA) String() string { return rr.Hdr.String() + strconv.Itoa(int(rr.Flag)) + " " + rr.Tag + " " + sprintTxtOctet(rr.Value) } @@ -1335,8 +1348,8 @@ type CSYNC struct { func (rr *CSYNC) String() string { s := rr.Hdr.String() + strconv.FormatInt(int64(rr.Serial), 10) + " " + strconv.Itoa(int(rr.Flags)) - for i := 0; i < len(rr.TypeBitMap); i++ { - s += " " + Type(rr.TypeBitMap[i]).String() + for _, t := range rr.TypeBitMap { + s += " " + Type(t).String() } return s } @@ -1344,15 +1357,90 @@ func (rr *CSYNC) String() string { func (rr *CSYNC) len(off int, compression map[string]struct{}) int { l := rr.Hdr.len(off, compression) l += 4 + 2 - lastwindow := uint32(2 ^ 32 + 1) - for _, t := range rr.TypeBitMap { - window := t / 256 - if uint32(window) != lastwindow { - l += 1 + 32 + l += typeBitMapLen(rr.TypeBitMap) + return l +} + +// APL RR. See RFC 3123. +type APL struct { + Hdr RR_Header + Prefixes []APLPrefix `dns:"apl"` +} + +// APLPrefix is an address prefix hold by an APL record. +type APLPrefix struct { + Negation bool + Network net.IPNet +} + +// String returns presentation form of the APL record. +func (rr *APL) String() string { + var sb strings.Builder + sb.WriteString(rr.Hdr.String()) + for i, p := range rr.Prefixes { + if i > 0 { + sb.WriteByte(' ') } - lastwindow = uint32(window) + sb.WriteString(p.str()) } - return l + return sb.String() +} + +// str returns presentation form of the APL prefix. +func (p *APLPrefix) str() string { + var sb strings.Builder + if p.Negation { + sb.WriteByte('!') + } + + switch len(p.Network.IP) { + case net.IPv4len: + sb.WriteByte('1') + case net.IPv6len: + sb.WriteByte('2') + } + + sb.WriteByte(':') + + switch len(p.Network.IP) { + case net.IPv4len: + sb.WriteString(p.Network.IP.String()) + case net.IPv6len: + // add prefix for IPv4-mapped IPv6 + if v4 := p.Network.IP.To4(); v4 != nil { + sb.WriteString("::ffff:") + } + sb.WriteString(p.Network.IP.String()) + } + + sb.WriteByte('/') + + prefix, _ := p.Network.Mask.Size() + sb.WriteString(strconv.Itoa(prefix)) + + return sb.String() +} + +// equals reports whether two APL prefixes are identical. +func (a *APLPrefix) equals(b *APLPrefix) bool { + return a.Negation == b.Negation && + bytes.Equal(a.Network.IP, b.Network.IP) && + bytes.Equal(a.Network.Mask, b.Network.Mask) +} + +// copy returns a copy of the APL prefix. +func (p *APLPrefix) copy() APLPrefix { + return APLPrefix{ + Negation: p.Negation, + Network: copyNet(p.Network), + } +} + +// len returns size of the prefix in wire format. +func (p *APLPrefix) len() int { + // 4-byte header and the network address prefix (see Section 4 of RFC 3123) + prefix, _ := p.Network.Mask.Size() + return 4 + (prefix+7)/8 } // TimeToString translates the RRSIG's incep. and expir. times to the @@ -1411,6 +1499,17 @@ func copyIP(ip net.IP) net.IP { return p } +// copyNet returns a copy of a subnet. +func copyNet(n net.IPNet) net.IPNet { + m := make(net.IPMask, len(n.Mask)) + copy(m, n.Mask) + + return net.IPNet{ + IP: copyIP(n.IP), + Mask: m, + } +} + // SplitN splits a string into N sized string chunks. // This might become an exported function once. func splitN(s string, n int) []string { diff --git a/vendor/github.com/miekg/dns/version.go b/vendor/github.com/miekg/dns/version.go index 46d644c58c24..5c75851b41dc 100644 --- a/vendor/github.com/miekg/dns/version.go +++ b/vendor/github.com/miekg/dns/version.go @@ -3,13 +3,13 @@ package dns import "fmt" // Version is current version of this library. -var Version = V{1, 1, 4} +var Version = v{1, 1, 35} -// V holds the version of this library. -type V struct { +// v holds the version of this library. +type v struct { Major, Minor, Patch int } -func (v V) String() string { +func (v v) String() string { return fmt.Sprintf("%d.%d.%d", v.Major, v.Minor, v.Patch) } diff --git a/vendor/github.com/miekg/dns/xfr.go b/vendor/github.com/miekg/dns/xfr.go index 82afc52ea82e..43970e64f39b 100644 --- a/vendor/github.com/miekg/dns/xfr.go +++ b/vendor/github.com/miekg/dns/xfr.go @@ -182,14 +182,17 @@ func (t *Transfer) inIxfr(q *Msg, c chan *Envelope) { // // ch := make(chan *dns.Envelope) // tr := new(dns.Transfer) -// go tr.Out(w, r, ch) +// var wg sync.WaitGroup +// go func() { +// tr.Out(w, r, ch) +// wg.Done() +// }() // ch <- &dns.Envelope{RR: []dns.RR{soa, rr1, rr2, rr3, soa}} // close(ch) -// w.Hijack() -// // w.Close() // Client closes connection +// wg.Wait() // wait until everything is written out +// w.Close() // close connection // -// The server is responsible for sending the correct sequence of RRs through the -// channel ch. +// The server is responsible for sending the correct sequence of RRs through the channel ch. func (t *Transfer) Out(w ResponseWriter, q *Msg, ch chan *Envelope) error { for x := range ch { r := new(Msg) @@ -198,11 +201,14 @@ func (t *Transfer) Out(w ResponseWriter, q *Msg, ch chan *Envelope) error { r.Authoritative = true // assume it fits TODO(miek): fix r.Answer = append(r.Answer, x.RR...) + if tsig := q.IsTsig(); tsig != nil && w.TsigStatus() == nil { + r.SetTsig(tsig.Hdr.Name, tsig.Algorithm, tsig.Fudge, time.Now().Unix()) + } if err := w.WriteMsg(r); err != nil { return err } + w.TsigTimersOnly(true) } - w.TsigTimersOnly(true) return nil } diff --git a/vendor/github.com/miekg/dns/zduplicate.go b/vendor/github.com/miekg/dns/zduplicate.go index 81e99e0d4cd3..0d3b34bd9b24 100644 --- a/vendor/github.com/miekg/dns/zduplicate.go +++ b/vendor/github.com/miekg/dns/zduplicate.go @@ -37,7 +37,7 @@ func (r1 *AFSDB) isDuplicate(_r2 RR) bool { if r1.Subtype != r2.Subtype { return false } - if !isDulicateName(r1.Hostname, r2.Hostname) { + if !isDuplicateName(r1.Hostname, r2.Hostname) { return false } return true @@ -52,6 +52,23 @@ func (r1 *ANY) isDuplicate(_r2 RR) bool { return true } +func (r1 *APL) isDuplicate(_r2 RR) bool { + r2, ok := _r2.(*APL) + if !ok { + return false + } + _ = r2 + if len(r1.Prefixes) != len(r2.Prefixes) { + return false + } + for i := 0; i < len(r1.Prefixes); i++ { + if !r1.Prefixes[i].equals(&r2.Prefixes[i]) { + return false + } + } + return true +} + func (r1 *AVC) isDuplicate(_r2 RR) bool { r2, ok := _r2.(*AVC) if !ok { @@ -87,6 +104,48 @@ func (r1 *CAA) isDuplicate(_r2 RR) bool { return true } +func (r1 *CDNSKEY) isDuplicate(_r2 RR) bool { + r2, ok := _r2.(*CDNSKEY) + if !ok { + return false + } + _ = r2 + if r1.Flags != r2.Flags { + return false + } + if r1.Protocol != r2.Protocol { + return false + } + if r1.Algorithm != r2.Algorithm { + return false + } + if r1.PublicKey != r2.PublicKey { + return false + } + return true +} + +func (r1 *CDS) isDuplicate(_r2 RR) bool { + r2, ok := _r2.(*CDS) + if !ok { + return false + } + _ = r2 + if r1.KeyTag != r2.KeyTag { + return false + } + if r1.Algorithm != r2.Algorithm { + return false + } + if r1.DigestType != r2.DigestType { + return false + } + if r1.Digest != r2.Digest { + return false + } + return true +} + func (r1 *CERT) isDuplicate(_r2 RR) bool { r2, ok := _r2.(*CERT) if !ok { @@ -114,7 +173,7 @@ func (r1 *CNAME) isDuplicate(_r2 RR) bool { return false } _ = r2 - if !isDulicateName(r1.Target, r2.Target) { + if !isDuplicateName(r1.Target, r2.Target) { return false } return true @@ -155,13 +214,34 @@ func (r1 *DHCID) isDuplicate(_r2 RR) bool { return true } +func (r1 *DLV) isDuplicate(_r2 RR) bool { + r2, ok := _r2.(*DLV) + if !ok { + return false + } + _ = r2 + if r1.KeyTag != r2.KeyTag { + return false + } + if r1.Algorithm != r2.Algorithm { + return false + } + if r1.DigestType != r2.DigestType { + return false + } + if r1.Digest != r2.Digest { + return false + } + return true +} + func (r1 *DNAME) isDuplicate(_r2 RR) bool { r2, ok := _r2.(*DNAME) if !ok { return false } _ = r2 - if !isDulicateName(r1.Target, r2.Target) { + if !isDuplicateName(r1.Target, r2.Target) { return false } return true @@ -315,13 +395,55 @@ func (r1 *HIP) isDuplicate(_r2 RR) bool { return false } for i := 0; i < len(r1.RendezvousServers); i++ { - if !isDulicateName(r1.RendezvousServers[i], r2.RendezvousServers[i]) { + if !isDuplicateName(r1.RendezvousServers[i], r2.RendezvousServers[i]) { return false } } return true } +func (r1 *HTTPS) isDuplicate(_r2 RR) bool { + r2, ok := _r2.(*HTTPS) + if !ok { + return false + } + _ = r2 + if r1.Priority != r2.Priority { + return false + } + if !isDuplicateName(r1.Target, r2.Target) { + return false + } + if len(r1.Value) != len(r2.Value) { + return false + } + if !areSVCBPairArraysEqual(r1.Value, r2.Value) { + return false + } + return true +} + +func (r1 *KEY) isDuplicate(_r2 RR) bool { + r2, ok := _r2.(*KEY) + if !ok { + return false + } + _ = r2 + if r1.Flags != r2.Flags { + return false + } + if r1.Protocol != r2.Protocol { + return false + } + if r1.Algorithm != r2.Algorithm { + return false + } + if r1.PublicKey != r2.PublicKey { + return false + } + return true +} + func (r1 *KX) isDuplicate(_r2 RR) bool { r2, ok := _r2.(*KX) if !ok { @@ -331,7 +453,7 @@ func (r1 *KX) isDuplicate(_r2 RR) bool { if r1.Preference != r2.Preference { return false } - if !isDulicateName(r1.Exchanger, r2.Exchanger) { + if !isDuplicateName(r1.Exchanger, r2.Exchanger) { return false } return true @@ -406,7 +528,7 @@ func (r1 *LP) isDuplicate(_r2 RR) bool { if r1.Preference != r2.Preference { return false } - if !isDulicateName(r1.Fqdn, r2.Fqdn) { + if !isDuplicateName(r1.Fqdn, r2.Fqdn) { return false } return true @@ -418,7 +540,7 @@ func (r1 *MB) isDuplicate(_r2 RR) bool { return false } _ = r2 - if !isDulicateName(r1.Mb, r2.Mb) { + if !isDuplicateName(r1.Mb, r2.Mb) { return false } return true @@ -430,7 +552,7 @@ func (r1 *MD) isDuplicate(_r2 RR) bool { return false } _ = r2 - if !isDulicateName(r1.Md, r2.Md) { + if !isDuplicateName(r1.Md, r2.Md) { return false } return true @@ -442,7 +564,7 @@ func (r1 *MF) isDuplicate(_r2 RR) bool { return false } _ = r2 - if !isDulicateName(r1.Mf, r2.Mf) { + if !isDuplicateName(r1.Mf, r2.Mf) { return false } return true @@ -454,7 +576,7 @@ func (r1 *MG) isDuplicate(_r2 RR) bool { return false } _ = r2 - if !isDulicateName(r1.Mg, r2.Mg) { + if !isDuplicateName(r1.Mg, r2.Mg) { return false } return true @@ -466,10 +588,10 @@ func (r1 *MINFO) isDuplicate(_r2 RR) bool { return false } _ = r2 - if !isDulicateName(r1.Rmail, r2.Rmail) { + if !isDuplicateName(r1.Rmail, r2.Rmail) { return false } - if !isDulicateName(r1.Email, r2.Email) { + if !isDuplicateName(r1.Email, r2.Email) { return false } return true @@ -481,7 +603,7 @@ func (r1 *MR) isDuplicate(_r2 RR) bool { return false } _ = r2 - if !isDulicateName(r1.Mr, r2.Mr) { + if !isDuplicateName(r1.Mr, r2.Mr) { return false } return true @@ -496,7 +618,7 @@ func (r1 *MX) isDuplicate(_r2 RR) bool { if r1.Preference != r2.Preference { return false } - if !isDulicateName(r1.Mx, r2.Mx) { + if !isDuplicateName(r1.Mx, r2.Mx) { return false } return true @@ -523,7 +645,7 @@ func (r1 *NAPTR) isDuplicate(_r2 RR) bool { if r1.Regexp != r2.Regexp { return false } - if !isDulicateName(r1.Replacement, r2.Replacement) { + if !isDuplicateName(r1.Replacement, r2.Replacement) { return false } return true @@ -579,7 +701,7 @@ func (r1 *NS) isDuplicate(_r2 RR) bool { return false } _ = r2 - if !isDulicateName(r1.Ns, r2.Ns) { + if !isDuplicateName(r1.Ns, r2.Ns) { return false } return true @@ -591,7 +713,7 @@ func (r1 *NSAPPTR) isDuplicate(_r2 RR) bool { return false } _ = r2 - if !isDulicateName(r1.Ptr, r2.Ptr) { + if !isDuplicateName(r1.Ptr, r2.Ptr) { return false } return true @@ -603,7 +725,7 @@ func (r1 *NSEC) isDuplicate(_r2 RR) bool { return false } _ = r2 - if !isDulicateName(r1.NextDomain, r2.NextDomain) { + if !isDuplicateName(r1.NextDomain, r2.NextDomain) { return false } if len(r1.TypeBitMap) != len(r2.TypeBitMap) { @@ -709,7 +831,7 @@ func (r1 *PTR) isDuplicate(_r2 RR) bool { return false } _ = r2 - if !isDulicateName(r1.Ptr, r2.Ptr) { + if !isDuplicateName(r1.Ptr, r2.Ptr) { return false } return true @@ -724,10 +846,10 @@ func (r1 *PX) isDuplicate(_r2 RR) bool { if r1.Preference != r2.Preference { return false } - if !isDulicateName(r1.Map822, r2.Map822) { + if !isDuplicateName(r1.Map822, r2.Map822) { return false } - if !isDulicateName(r1.Mapx400, r2.Mapx400) { + if !isDuplicateName(r1.Mapx400, r2.Mapx400) { return false } return true @@ -772,10 +894,10 @@ func (r1 *RP) isDuplicate(_r2 RR) bool { return false } _ = r2 - if !isDulicateName(r1.Mbox, r2.Mbox) { + if !isDuplicateName(r1.Mbox, r2.Mbox) { return false } - if !isDulicateName(r1.Txt, r2.Txt) { + if !isDuplicateName(r1.Txt, r2.Txt) { return false } return true @@ -808,7 +930,7 @@ func (r1 *RRSIG) isDuplicate(_r2 RR) bool { if r1.KeyTag != r2.KeyTag { return false } - if !isDulicateName(r1.SignerName, r2.SignerName) { + if !isDuplicateName(r1.SignerName, r2.SignerName) { return false } if r1.Signature != r2.Signature { @@ -826,7 +948,43 @@ func (r1 *RT) isDuplicate(_r2 RR) bool { if r1.Preference != r2.Preference { return false } - if !isDulicateName(r1.Host, r2.Host) { + if !isDuplicateName(r1.Host, r2.Host) { + return false + } + return true +} + +func (r1 *SIG) isDuplicate(_r2 RR) bool { + r2, ok := _r2.(*SIG) + if !ok { + return false + } + _ = r2 + if r1.TypeCovered != r2.TypeCovered { + return false + } + if r1.Algorithm != r2.Algorithm { + return false + } + if r1.Labels != r2.Labels { + return false + } + if r1.OrigTtl != r2.OrigTtl { + return false + } + if r1.Expiration != r2.Expiration { + return false + } + if r1.Inception != r2.Inception { + return false + } + if r1.KeyTag != r2.KeyTag { + return false + } + if !isDuplicateName(r1.SignerName, r2.SignerName) { + return false + } + if r1.Signature != r2.Signature { return false } return true @@ -859,10 +1017,10 @@ func (r1 *SOA) isDuplicate(_r2 RR) bool { return false } _ = r2 - if !isDulicateName(r1.Ns, r2.Ns) { + if !isDuplicateName(r1.Ns, r2.Ns) { return false } - if !isDulicateName(r1.Mbox, r2.Mbox) { + if !isDuplicateName(r1.Mbox, r2.Mbox) { return false } if r1.Serial != r2.Serial { @@ -915,7 +1073,7 @@ func (r1 *SRV) isDuplicate(_r2 RR) bool { if r1.Port != r2.Port { return false } - if !isDulicateName(r1.Target, r2.Target) { + if !isDuplicateName(r1.Target, r2.Target) { return false } return true @@ -939,6 +1097,27 @@ func (r1 *SSHFP) isDuplicate(_r2 RR) bool { return true } +func (r1 *SVCB) isDuplicate(_r2 RR) bool { + r2, ok := _r2.(*SVCB) + if !ok { + return false + } + _ = r2 + if r1.Priority != r2.Priority { + return false + } + if !isDuplicateName(r1.Target, r2.Target) { + return false + } + if len(r1.Value) != len(r2.Value) { + return false + } + if !areSVCBPairArraysEqual(r1.Value, r2.Value) { + return false + } + return true +} + func (r1 *TA) isDuplicate(_r2 RR) bool { r2, ok := _r2.(*TA) if !ok { @@ -966,10 +1145,10 @@ func (r1 *TALINK) isDuplicate(_r2 RR) bool { return false } _ = r2 - if !isDulicateName(r1.PreviousName, r2.PreviousName) { + if !isDuplicateName(r1.PreviousName, r2.PreviousName) { return false } - if !isDulicateName(r1.NextName, r2.NextName) { + if !isDuplicateName(r1.NextName, r2.NextName) { return false } return true @@ -981,7 +1160,7 @@ func (r1 *TKEY) isDuplicate(_r2 RR) bool { return false } _ = r2 - if !isDulicateName(r1.Algorithm, r2.Algorithm) { + if !isDuplicateName(r1.Algorithm, r2.Algorithm) { return false } if r1.Inception != r2.Inception { @@ -1038,7 +1217,7 @@ func (r1 *TSIG) isDuplicate(_r2 RR) bool { return false } _ = r2 - if !isDulicateName(r1.Algorithm, r2.Algorithm) { + if !isDuplicateName(r1.Algorithm, r2.Algorithm) { return false } if r1.TimeSigned != r2.TimeSigned { diff --git a/vendor/github.com/miekg/dns/zmsg.go b/vendor/github.com/miekg/dns/zmsg.go index c4cf4757e8a6..d24a10fa2426 100644 --- a/vendor/github.com/miekg/dns/zmsg.go +++ b/vendor/github.com/miekg/dns/zmsg.go @@ -36,6 +36,14 @@ func (rr *ANY) pack(msg []byte, off int, compression compressionMap, compress bo return off, nil } +func (rr *APL) pack(msg []byte, off int, compression compressionMap, compress bool) (off1 int, err error) { + off, err = packDataApl(rr.Prefixes, msg, off) + if err != nil { + return off, err + } + return off, nil +} + func (rr *AVC) pack(msg []byte, off int, compression compressionMap, compress bool) (off1 int, err error) { off, err = packStringTxt(rr.Txt, msg, off) if err != nil { @@ -308,6 +316,22 @@ func (rr *HIP) pack(msg []byte, off int, compression compressionMap, compress bo return off, nil } +func (rr *HTTPS) pack(msg []byte, off int, compression compressionMap, compress bool) (off1 int, err error) { + off, err = packUint16(rr.Priority, msg, off) + if err != nil { + return off, err + } + off, err = packDomainName(rr.Target, msg, off, compression, false) + if err != nil { + return off, err + } + off, err = packDataSVCB(rr.Value, msg, off) + if err != nil { + return off, err + } + return off, nil +} + func (rr *KEY) pack(msg []byte, off int, compression compressionMap, compress bool) (off1 int, err error) { off, err = packUint16(rr.Flags, msg, off) if err != nil { @@ -898,6 +922,22 @@ func (rr *SSHFP) pack(msg []byte, off int, compression compressionMap, compress return off, nil } +func (rr *SVCB) pack(msg []byte, off int, compression compressionMap, compress bool) (off1 int, err error) { + off, err = packUint16(rr.Priority, msg, off) + if err != nil { + return off, err + } + off, err = packDomainName(rr.Target, msg, off, compression, false) + if err != nil { + return off, err + } + off, err = packDataSVCB(rr.Value, msg, off) + if err != nil { + return off, err + } + return off, nil +} + func (rr *TA) pack(msg []byte, off int, compression compressionMap, compress bool) (off1 int, err error) { off, err = packUint16(rr.KeyTag, msg, off) if err != nil { @@ -1127,6 +1167,17 @@ func (rr *ANY) unpack(msg []byte, off int) (off1 int, err error) { return off, nil } +func (rr *APL) unpack(msg []byte, off int) (off1 int, err error) { + rdStart := off + _ = rdStart + + rr.Prefixes, off, err = unpackDataApl(msg, off) + if err != nil { + return off, err + } + return off, nil +} + func (rr *AVC) unpack(msg []byte, off int) (off1 int, err error) { rdStart := off _ = rdStart @@ -1540,6 +1591,31 @@ func (rr *HIP) unpack(msg []byte, off int) (off1 int, err error) { return off, nil } +func (rr *HTTPS) unpack(msg []byte, off int) (off1 int, err error) { + rdStart := off + _ = rdStart + + rr.Priority, off, err = unpackUint16(msg, off) + if err != nil { + return off, err + } + if off == len(msg) { + return off, nil + } + rr.Target, off, err = UnpackDomainName(msg, off) + if err != nil { + return off, err + } + if off == len(msg) { + return off, nil + } + rr.Value, off, err = unpackDataSVCB(msg, off) + if err != nil { + return off, err + } + return off, nil +} + func (rr *KEY) unpack(msg []byte, off int) (off1 int, err error) { rdStart := off _ = rdStart @@ -2442,6 +2518,31 @@ func (rr *SSHFP) unpack(msg []byte, off int) (off1 int, err error) { return off, nil } +func (rr *SVCB) unpack(msg []byte, off int) (off1 int, err error) { + rdStart := off + _ = rdStart + + rr.Priority, off, err = unpackUint16(msg, off) + if err != nil { + return off, err + } + if off == len(msg) { + return off, nil + } + rr.Target, off, err = UnpackDomainName(msg, off) + if err != nil { + return off, err + } + if off == len(msg) { + return off, nil + } + rr.Value, off, err = unpackDataSVCB(msg, off) + if err != nil { + return off, err + } + return off, nil +} + func (rr *TA) unpack(msg []byte, off int) (off1 int, err error) { rdStart := off _ = rdStart diff --git a/vendor/github.com/miekg/dns/ztypes.go b/vendor/github.com/miekg/dns/ztypes.go index 19a542d33ca2..11b51bf21710 100644 --- a/vendor/github.com/miekg/dns/ztypes.go +++ b/vendor/github.com/miekg/dns/ztypes.go @@ -13,6 +13,7 @@ var TypeToRR = map[uint16]func() RR{ TypeAAAA: func() RR { return new(AAAA) }, TypeAFSDB: func() RR { return new(AFSDB) }, TypeANY: func() RR { return new(ANY) }, + TypeAPL: func() RR { return new(APL) }, TypeAVC: func() RR { return new(AVC) }, TypeCAA: func() RR { return new(CAA) }, TypeCDNSKEY: func() RR { return new(CDNSKEY) }, @@ -32,6 +33,7 @@ var TypeToRR = map[uint16]func() RR{ TypeGPOS: func() RR { return new(GPOS) }, TypeHINFO: func() RR { return new(HINFO) }, TypeHIP: func() RR { return new(HIP) }, + TypeHTTPS: func() RR { return new(HTTPS) }, TypeKEY: func() RR { return new(KEY) }, TypeKX: func() RR { return new(KX) }, TypeL32: func() RR { return new(L32) }, @@ -69,6 +71,7 @@ var TypeToRR = map[uint16]func() RR{ TypeSPF: func() RR { return new(SPF) }, TypeSRV: func() RR { return new(SRV) }, TypeSSHFP: func() RR { return new(SSHFP) }, + TypeSVCB: func() RR { return new(SVCB) }, TypeTA: func() RR { return new(TA) }, TypeTALINK: func() RR { return new(TALINK) }, TypeTKEY: func() RR { return new(TKEY) }, @@ -87,6 +90,7 @@ var TypeToString = map[uint16]string{ TypeAAAA: "AAAA", TypeAFSDB: "AFSDB", TypeANY: "ANY", + TypeAPL: "APL", TypeATMA: "ATMA", TypeAVC: "AVC", TypeAXFR: "AXFR", @@ -108,6 +112,7 @@ var TypeToString = map[uint16]string{ TypeGPOS: "GPOS", TypeHINFO: "HINFO", TypeHIP: "HIP", + TypeHTTPS: "HTTPS", TypeISDN: "ISDN", TypeIXFR: "IXFR", TypeKEY: "KEY", @@ -151,6 +156,7 @@ var TypeToString = map[uint16]string{ TypeSPF: "SPF", TypeSRV: "SRV", TypeSSHFP: "SSHFP", + TypeSVCB: "SVCB", TypeTA: "TA", TypeTALINK: "TALINK", TypeTKEY: "TKEY", @@ -169,6 +175,7 @@ func (rr *A) Header() *RR_Header { return &rr.Hdr } func (rr *AAAA) Header() *RR_Header { return &rr.Hdr } func (rr *AFSDB) Header() *RR_Header { return &rr.Hdr } func (rr *ANY) Header() *RR_Header { return &rr.Hdr } +func (rr *APL) Header() *RR_Header { return &rr.Hdr } func (rr *AVC) Header() *RR_Header { return &rr.Hdr } func (rr *CAA) Header() *RR_Header { return &rr.Hdr } func (rr *CDNSKEY) Header() *RR_Header { return &rr.Hdr } @@ -188,6 +195,7 @@ func (rr *GID) Header() *RR_Header { return &rr.Hdr } func (rr *GPOS) Header() *RR_Header { return &rr.Hdr } func (rr *HINFO) Header() *RR_Header { return &rr.Hdr } func (rr *HIP) Header() *RR_Header { return &rr.Hdr } +func (rr *HTTPS) Header() *RR_Header { return &rr.Hdr } func (rr *KEY) Header() *RR_Header { return &rr.Hdr } func (rr *KX) Header() *RR_Header { return &rr.Hdr } func (rr *L32) Header() *RR_Header { return &rr.Hdr } @@ -226,6 +234,7 @@ func (rr *SOA) Header() *RR_Header { return &rr.Hdr } func (rr *SPF) Header() *RR_Header { return &rr.Hdr } func (rr *SRV) Header() *RR_Header { return &rr.Hdr } func (rr *SSHFP) Header() *RR_Header { return &rr.Hdr } +func (rr *SVCB) Header() *RR_Header { return &rr.Hdr } func (rr *TA) Header() *RR_Header { return &rr.Hdr } func (rr *TALINK) Header() *RR_Header { return &rr.Hdr } func (rr *TKEY) Header() *RR_Header { return &rr.Hdr } @@ -240,12 +249,16 @@ func (rr *X25) Header() *RR_Header { return &rr.Hdr } // len() functions func (rr *A) len(off int, compression map[string]struct{}) int { l := rr.Hdr.len(off, compression) - l += net.IPv4len // A + if len(rr.A) != 0 { + l += net.IPv4len + } return l } func (rr *AAAA) len(off int, compression map[string]struct{}) int { l := rr.Hdr.len(off, compression) - l += net.IPv6len // AAAA + if len(rr.AAAA) != 0 { + l += net.IPv6len + } return l } func (rr *AFSDB) len(off int, compression map[string]struct{}) int { @@ -258,6 +271,13 @@ func (rr *ANY) len(off int, compression map[string]struct{}) int { l := rr.Hdr.len(off, compression) return l } +func (rr *APL) len(off int, compression map[string]struct{}) int { + l := rr.Hdr.len(off, compression) + for _, x := range rr.Prefixes { + l += x.len() + } + return l +} func (rr *AVC) len(off int, compression map[string]struct{}) int { l := rr.Hdr.len(off, compression) for _, x := range rr.Txt { @@ -308,12 +328,12 @@ func (rr *DS) len(off int, compression map[string]struct{}) int { l += 2 // KeyTag l++ // Algorithm l++ // DigestType - l += len(rr.Digest)/2 + 1 + l += len(rr.Digest) / 2 return l } func (rr *EID) len(off int, compression map[string]struct{}) int { l := rr.Hdr.len(off, compression) - l += len(rr.Endpoint)/2 + 1 + l += len(rr.Endpoint) / 2 return l } func (rr *EUI48) len(off int, compression map[string]struct{}) int { @@ -364,8 +384,10 @@ func (rr *KX) len(off int, compression map[string]struct{}) int { } func (rr *L32) len(off int, compression map[string]struct{}) int { l := rr.Hdr.len(off, compression) - l += 2 // Preference - l += net.IPv4len // Locator32 + l += 2 // Preference + if len(rr.Locator32) != 0 { + l += net.IPv4len + } return l } func (rr *L64) len(off int, compression map[string]struct{}) int { @@ -446,7 +468,7 @@ func (rr *NID) len(off int, compression map[string]struct{}) int { } func (rr *NIMLOC) len(off int, compression map[string]struct{}) int { l := rr.Hdr.len(off, compression) - l += len(rr.Locator)/2 + 1 + l += len(rr.Locator) / 2 return l } func (rr *NINFO) len(off int, compression map[string]struct{}) int { @@ -499,7 +521,7 @@ func (rr *PX) len(off int, compression map[string]struct{}) int { } func (rr *RFC3597) len(off int, compression map[string]struct{}) int { l := rr.Hdr.len(off, compression) - l += len(rr.Rdata)/2 + 1 + l += len(rr.Rdata) / 2 return l } func (rr *RKEY) len(off int, compression map[string]struct{}) int { @@ -540,7 +562,7 @@ func (rr *SMIMEA) len(off int, compression map[string]struct{}) int { l++ // Usage l++ // Selector l++ // MatchingType - l += len(rr.Certificate)/2 + 1 + l += len(rr.Certificate) / 2 return l } func (rr *SOA) len(off int, compression map[string]struct{}) int { @@ -573,7 +595,16 @@ func (rr *SSHFP) len(off int, compression map[string]struct{}) int { l := rr.Hdr.len(off, compression) l++ // Algorithm l++ // Type - l += len(rr.FingerPrint)/2 + 1 + l += len(rr.FingerPrint) / 2 + return l +} +func (rr *SVCB) len(off int, compression map[string]struct{}) int { + l := rr.Hdr.len(off, compression) + l += 2 // Priority + l += domainNameLen(rr.Target, off+l, compression, false) + for _, x := range rr.Value { + l += 4 + int(x.len()) + } return l } func (rr *TA) len(off int, compression map[string]struct{}) int { @@ -581,7 +612,7 @@ func (rr *TA) len(off int, compression map[string]struct{}) int { l += 2 // KeyTag l++ // Algorithm l++ // DigestType - l += len(rr.Digest)/2 + 1 + l += len(rr.Digest) / 2 return l } func (rr *TALINK) len(off int, compression map[string]struct{}) int { @@ -608,7 +639,7 @@ func (rr *TLSA) len(off int, compression map[string]struct{}) int { l++ // Usage l++ // Selector l++ // MatchingType - l += len(rr.Certificate)/2 + 1 + l += len(rr.Certificate) / 2 return l } func (rr *TSIG) len(off int, compression map[string]struct{}) int { @@ -667,6 +698,13 @@ func (rr *AFSDB) copy() RR { func (rr *ANY) copy() RR { return &ANY{rr.Hdr} } +func (rr *APL) copy() RR { + Prefixes := make([]APLPrefix, len(rr.Prefixes)) + for i, e := range rr.Prefixes { + Prefixes[i] = e.copy() + } + return &APL{rr.Hdr, Prefixes} +} func (rr *AVC) copy() RR { Txt := make([]string, len(rr.Txt)) copy(Txt, rr.Txt) @@ -675,6 +713,12 @@ func (rr *AVC) copy() RR { func (rr *CAA) copy() RR { return &CAA{rr.Hdr, rr.Flag, rr.Tag, rr.Value} } +func (rr *CDNSKEY) copy() RR { + return &CDNSKEY{*rr.DNSKEY.copy().(*DNSKEY)} +} +func (rr *CDS) copy() RR { + return &CDS{*rr.DS.copy().(*DS)} +} func (rr *CERT) copy() RR { return &CERT{rr.Hdr, rr.Type, rr.KeyTag, rr.Algorithm, rr.Certificate} } @@ -689,6 +733,9 @@ func (rr *CSYNC) copy() RR { func (rr *DHCID) copy() RR { return &DHCID{rr.Hdr, rr.Digest} } +func (rr *DLV) copy() RR { + return &DLV{*rr.DS.copy().(*DS)} +} func (rr *DNAME) copy() RR { return &DNAME{rr.Hdr, rr.Target} } @@ -721,6 +768,12 @@ func (rr *HIP) copy() RR { copy(RendezvousServers, rr.RendezvousServers) return &HIP{rr.Hdr, rr.HitLength, rr.PublicKeyAlgorithm, rr.PublicKeyLength, rr.Hit, rr.PublicKey, RendezvousServers} } +func (rr *HTTPS) copy() RR { + return &HTTPS{*rr.SVCB.copy().(*SVCB)} +} +func (rr *KEY) copy() RR { + return &KEY{*rr.DNSKEY.copy().(*DNSKEY)} +} func (rr *KX) copy() RR { return &KX{rr.Hdr, rr.Preference, rr.Exchanger} } @@ -824,6 +877,9 @@ func (rr *RRSIG) copy() RR { func (rr *RT) copy() RR { return &RT{rr.Hdr, rr.Preference, rr.Host} } +func (rr *SIG) copy() RR { + return &SIG{*rr.RRSIG.copy().(*RRSIG)} +} func (rr *SMIMEA) copy() RR { return &SMIMEA{rr.Hdr, rr.Usage, rr.Selector, rr.MatchingType, rr.Certificate} } @@ -841,6 +897,13 @@ func (rr *SRV) copy() RR { func (rr *SSHFP) copy() RR { return &SSHFP{rr.Hdr, rr.Algorithm, rr.Type, rr.FingerPrint} } +func (rr *SVCB) copy() RR { + Value := make([]SVCBKeyValue, len(rr.Value)) + for i, e := range rr.Value { + Value[i] = e.copy() + } + return &SVCB{rr.Hdr, rr.Priority, rr.Target, Value} +} func (rr *TA) copy() RR { return &TA{rr.Hdr, rr.KeyTag, rr.Algorithm, rr.DigestType, rr.Digest} } diff --git a/vendor/github.com/docker/spdystream/CONTRIBUTING.md b/vendor/github.com/moby/spdystream/CONTRIBUTING.md similarity index 100% rename from vendor/github.com/docker/spdystream/CONTRIBUTING.md rename to vendor/github.com/moby/spdystream/CONTRIBUTING.md diff --git a/vendor/github.com/moby/spdystream/LICENSE b/vendor/github.com/moby/spdystream/LICENSE new file mode 100644 index 000000000000..d64569567334 --- /dev/null +++ b/vendor/github.com/moby/spdystream/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/moby/spdystream/MAINTAINERS b/vendor/github.com/moby/spdystream/MAINTAINERS new file mode 100644 index 000000000000..26e5ec828a16 --- /dev/null +++ b/vendor/github.com/moby/spdystream/MAINTAINERS @@ -0,0 +1,40 @@ +# Spdystream maintainers file +# +# This file describes who runs the moby/spdystream project and how. +# This is a living document - if you see something out of date or missing, speak up! +# +# It is structured to be consumable by both humans and programs. +# To extract its contents programmatically, use any TOML-compliant parser. +# +# This file is compiled into the MAINTAINERS file in docker/opensource. +# +[Org] + [Org."Core maintainers"] + people = [ + "adisky", + "dims", + "dmcgowan", + ] + +[people] + +# A reference list of all people associated with the project. +# All other sections should refer to people by their canonical key +# in the people section. + + # ADD YOURSELF HERE IN ALPHABETICAL ORDER + + [people.adisky] + Name = "Aditi Sharma" + Email = "adi.sky17@gmail.com" + GitHub = "adisky" + + [people.dims] + Name = "Davanum Srinivas" + Email = "davanum@gmail.com" + GitHub = "dims" + + [people.dmcgowan] + Name = "Derek McGowan" + Email = "derek@mcg.dev" + GitHub = "dmcgowan" diff --git a/vendor/github.com/moby/spdystream/NOTICE b/vendor/github.com/moby/spdystream/NOTICE new file mode 100644 index 000000000000..b9b11c9ab7b4 --- /dev/null +++ b/vendor/github.com/moby/spdystream/NOTICE @@ -0,0 +1,5 @@ +SpdyStream +Copyright 2014-2021 Docker Inc. + +This product includes software developed at +Docker Inc. (https://www.docker.com/). diff --git a/vendor/github.com/moby/spdystream/README.md b/vendor/github.com/moby/spdystream/README.md new file mode 100644 index 000000000000..b84e98343982 --- /dev/null +++ b/vendor/github.com/moby/spdystream/README.md @@ -0,0 +1,77 @@ +# SpdyStream + +A multiplexed stream library using spdy + +## Usage + +Client example (connecting to mirroring server without auth) + +```go +package main + +import ( + "fmt" + "github.com/moby/spdystream" + "net" + "net/http" +) + +func main() { + conn, err := net.Dial("tcp", "localhost:8080") + if err != nil { + panic(err) + } + spdyConn, err := spdystream.NewConnection(conn, false) + if err != nil { + panic(err) + } + go spdyConn.Serve(spdystream.NoOpStreamHandler) + stream, err := spdyConn.CreateStream(http.Header{}, nil, false) + if err != nil { + panic(err) + } + + stream.Wait() + + fmt.Fprint(stream, "Writing to stream") + + buf := make([]byte, 25) + stream.Read(buf) + fmt.Println(string(buf)) + + stream.Close() +} +``` + +Server example (mirroring server without auth) + +```go +package main + +import ( + "github.com/moby/spdystream" + "net" +) + +func main() { + listener, err := net.Listen("tcp", "localhost:8080") + if err != nil { + panic(err) + } + for { + conn, err := listener.Accept() + if err != nil { + panic(err) + } + spdyConn, err := spdystream.NewConnection(conn, true) + if err != nil { + panic(err) + } + go spdyConn.Serve(spdystream.MirrorStreamHandler) + } +} +``` + +## Copyright and license + +Copyright 2013-2021 Docker, inc. Released under the [Apache 2.0 license](LICENSE). diff --git a/vendor/github.com/docker/spdystream/connection.go b/vendor/github.com/moby/spdystream/connection.go similarity index 95% rename from vendor/github.com/docker/spdystream/connection.go rename to vendor/github.com/moby/spdystream/connection.go index 6031a0db1ab4..d906bb05ceda 100644 --- a/vendor/github.com/docker/spdystream/connection.go +++ b/vendor/github.com/moby/spdystream/connection.go @@ -1,3 +1,19 @@ +/* + Copyright 2014-2021 Docker Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + package spdystream import ( @@ -9,12 +25,12 @@ import ( "sync" "time" - "github.com/docker/spdystream/spdy" + "github.com/moby/spdystream/spdy" ) var ( ErrInvalidStreamId = errors.New("Invalid stream id") - ErrTimeout = errors.New("Timeout occured") + ErrTimeout = errors.New("Timeout occurred") ErrReset = errors.New("Stream reset") ErrWriteClosedStream = errors.New("Write on closed stream") ) @@ -101,14 +117,14 @@ Loop: // attempts to grab the write lock that Write() already has, causing a // deadlock. // - // See https://github.com/docker/spdystream/issues/49 for more details. + // See https://github.com/moby/spdystream/issues/49 for more details. go func() { - for _ = range resetChan { + for range resetChan { } }() go func() { - for _ = range setTimeoutChan { + for range setTimeoutChan { } }() @@ -127,7 +143,7 @@ Loop: } // Drain resetChan - for _ = range resetChan { + for range resetChan { } } @@ -200,7 +216,7 @@ type Connection struct { shutdownChan chan error hasShutdown bool - // for testing https://github.com/docker/spdystream/pull/56 + // for testing https://github.com/moby/spdystream/pull/56 dataFrameHandler func(*spdy.DataFrame) error } @@ -284,7 +300,7 @@ func (s *Connection) Ping() (time.Duration, error) { } break } - return time.Now().Sub(startTime), nil + return time.Since(startTime), nil } // Serve handles frames sent from the server, including reply frames @@ -325,7 +341,7 @@ Loop: readFrame, err := s.framer.ReadFrame() if err != nil { if err != io.EOF { - fmt.Errorf("frame read error: %s", err) + debugMessage("frame read error: %s", err) } else { debugMessage("(%p) EOF received", s) } @@ -421,7 +437,7 @@ func (s *Connection) frameHandler(frameQueue *PriorityFrameQueue, newHandler Str } if frameErr != nil { - fmt.Errorf("frame handling error: %s", frameErr) + debugMessage("frame handling error: %s", frameErr) } } } @@ -451,6 +467,7 @@ func (s *Connection) addStreamFrame(frame *spdy.SynStreamFrame) { dataChan: make(chan []byte), headerChan: make(chan http.Header), closeChan: make(chan bool), + priority: frame.Priority, } if frame.CFHeader.Flags&spdy.ControlFlagFin != 0x00 { stream.closeRemoteChannels() @@ -473,7 +490,7 @@ func (s *Connection) checkStreamFrame(frame *spdy.SynStreamFrame) bool { go func() { resetErr := s.sendResetFrame(spdy.ProtocolError, frame.StreamId) if resetErr != nil { - fmt.Errorf("reset error: %s", resetErr) + debugMessage("reset error: %s", resetErr) } }() return false @@ -718,7 +735,7 @@ func (s *Connection) shutdown(closeTimeout time.Duration) { select { case err, ok := <-s.shutdownChan: if ok { - fmt.Errorf("Unhandled close error after %s: %s", duration, err) + debugMessage("Unhandled close error after %s: %s", duration, err) } default: } @@ -726,8 +743,6 @@ func (s *Connection) shutdown(closeTimeout time.Duration) { s.shutdownChan <- err } close(s.shutdownChan) - - return } // Closes spdy connection by sending GoAway frame and initiating shutdown @@ -751,12 +766,11 @@ func (s *Connection) Close() error { } err := s.framer.WriteFrame(goAwayFrame) + go s.shutdown(s.closeTimeout) if err != nil { return err } - go s.shutdown(s.closeTimeout) - return nil } diff --git a/vendor/github.com/moby/spdystream/go.mod b/vendor/github.com/moby/spdystream/go.mod new file mode 100644 index 000000000000..d9b9ad59c7f0 --- /dev/null +++ b/vendor/github.com/moby/spdystream/go.mod @@ -0,0 +1,5 @@ +module github.com/moby/spdystream + +go 1.13 + +require github.com/gorilla/websocket v1.4.2 diff --git a/vendor/github.com/moby/spdystream/go.sum b/vendor/github.com/moby/spdystream/go.sum new file mode 100644 index 000000000000..85efffd996ee --- /dev/null +++ b/vendor/github.com/moby/spdystream/go.sum @@ -0,0 +1,2 @@ +github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= diff --git a/vendor/github.com/moby/spdystream/handlers.go b/vendor/github.com/moby/spdystream/handlers.go new file mode 100644 index 000000000000..d68f61f81218 --- /dev/null +++ b/vendor/github.com/moby/spdystream/handlers.go @@ -0,0 +1,52 @@ +/* + Copyright 2014-2021 Docker Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package spdystream + +import ( + "io" + "net/http" +) + +// MirrorStreamHandler mirrors all streams. +func MirrorStreamHandler(stream *Stream) { + replyErr := stream.SendReply(http.Header{}, false) + if replyErr != nil { + return + } + + go func() { + io.Copy(stream, stream) + stream.Close() + }() + go func() { + for { + header, receiveErr := stream.ReceiveHeader() + if receiveErr != nil { + return + } + sendErr := stream.SendHeader(header, false) + if sendErr != nil { + return + } + } + }() +} + +// NoopStreamHandler does nothing when stream connects. +func NoOpStreamHandler(stream *Stream) { + stream.SendReply(http.Header{}, false) +} diff --git a/vendor/github.com/moby/spdystream/priority.go b/vendor/github.com/moby/spdystream/priority.go new file mode 100644 index 000000000000..d8eb3516ca30 --- /dev/null +++ b/vendor/github.com/moby/spdystream/priority.go @@ -0,0 +1,114 @@ +/* + Copyright 2014-2021 Docker Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package spdystream + +import ( + "container/heap" + "sync" + + "github.com/moby/spdystream/spdy" +) + +type prioritizedFrame struct { + frame spdy.Frame + priority uint8 + insertId uint64 +} + +type frameQueue []*prioritizedFrame + +func (fq frameQueue) Len() int { + return len(fq) +} + +func (fq frameQueue) Less(i, j int) bool { + if fq[i].priority == fq[j].priority { + return fq[i].insertId < fq[j].insertId + } + return fq[i].priority < fq[j].priority +} + +func (fq frameQueue) Swap(i, j int) { + fq[i], fq[j] = fq[j], fq[i] +} + +func (fq *frameQueue) Push(x interface{}) { + *fq = append(*fq, x.(*prioritizedFrame)) +} + +func (fq *frameQueue) Pop() interface{} { + old := *fq + n := len(old) + *fq = old[0 : n-1] + return old[n-1] +} + +type PriorityFrameQueue struct { + queue *frameQueue + c *sync.Cond + size int + nextInsertId uint64 + drain bool +} + +func NewPriorityFrameQueue(size int) *PriorityFrameQueue { + queue := make(frameQueue, 0, size) + heap.Init(&queue) + + return &PriorityFrameQueue{ + queue: &queue, + size: size, + c: sync.NewCond(&sync.Mutex{}), + } +} + +func (q *PriorityFrameQueue) Push(frame spdy.Frame, priority uint8) { + q.c.L.Lock() + defer q.c.L.Unlock() + for q.queue.Len() >= q.size { + q.c.Wait() + } + pFrame := &prioritizedFrame{ + frame: frame, + priority: priority, + insertId: q.nextInsertId, + } + q.nextInsertId = q.nextInsertId + 1 + heap.Push(q.queue, pFrame) + q.c.Signal() +} + +func (q *PriorityFrameQueue) Pop() spdy.Frame { + q.c.L.Lock() + defer q.c.L.Unlock() + for q.queue.Len() == 0 { + if q.drain { + return nil + } + q.c.Wait() + } + frame := heap.Pop(q.queue).(*prioritizedFrame).frame + q.c.Signal() + return frame +} + +func (q *PriorityFrameQueue) Drain() { + q.c.L.Lock() + defer q.c.L.Unlock() + q.drain = true + q.c.Broadcast() +} diff --git a/vendor/github.com/docker/spdystream/spdy/dictionary.go b/vendor/github.com/moby/spdystream/spdy/dictionary.go similarity index 93% rename from vendor/github.com/docker/spdystream/spdy/dictionary.go rename to vendor/github.com/moby/spdystream/spdy/dictionary.go index 5a5ff0e14cd3..392232f17463 100644 --- a/vendor/github.com/docker/spdystream/spdy/dictionary.go +++ b/vendor/github.com/moby/spdystream/spdy/dictionary.go @@ -1,3 +1,19 @@ +/* + Copyright 2014-2021 Docker Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + // Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. diff --git a/vendor/github.com/docker/spdystream/spdy/read.go b/vendor/github.com/moby/spdystream/spdy/read.go similarity index 94% rename from vendor/github.com/docker/spdystream/spdy/read.go rename to vendor/github.com/moby/spdystream/spdy/read.go index 9359a95015cc..75ea045b8e3a 100644 --- a/vendor/github.com/docker/spdystream/spdy/read.go +++ b/vendor/github.com/moby/spdystream/spdy/read.go @@ -1,3 +1,19 @@ +/* + Copyright 2014-2021 Docker Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + // Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. diff --git a/vendor/github.com/moby/spdystream/spdy/types.go b/vendor/github.com/moby/spdystream/spdy/types.go new file mode 100644 index 000000000000..a254a43ab9d6 --- /dev/null +++ b/vendor/github.com/moby/spdystream/spdy/types.go @@ -0,0 +1,291 @@ +/* + Copyright 2014-2021 Docker Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package spdy implements the SPDY protocol (currently SPDY/3), described in +// http://www.chromium.org/spdy/spdy-protocol/spdy-protocol-draft3. +package spdy + +import ( + "bytes" + "compress/zlib" + "io" + "net/http" +) + +// Version is the protocol version number that this package implements. +const Version = 3 + +// ControlFrameType stores the type field in a control frame header. +type ControlFrameType uint16 + +const ( + TypeSynStream ControlFrameType = 0x0001 + TypeSynReply ControlFrameType = 0x0002 + TypeRstStream ControlFrameType = 0x0003 + TypeSettings ControlFrameType = 0x0004 + TypePing ControlFrameType = 0x0006 + TypeGoAway ControlFrameType = 0x0007 + TypeHeaders ControlFrameType = 0x0008 + TypeWindowUpdate ControlFrameType = 0x0009 +) + +// ControlFlags are the flags that can be set on a control frame. +type ControlFlags uint8 + +const ( + ControlFlagFin ControlFlags = 0x01 + ControlFlagUnidirectional ControlFlags = 0x02 + ControlFlagSettingsClearSettings ControlFlags = 0x01 +) + +// DataFlags are the flags that can be set on a data frame. +type DataFlags uint8 + +const ( + DataFlagFin DataFlags = 0x01 +) + +// MaxDataLength is the maximum number of bytes that can be stored in one frame. +const MaxDataLength = 1<<24 - 1 + +// headerValueSepator separates multiple header values. +const headerValueSeparator = "\x00" + +// Frame is a single SPDY frame in its unpacked in-memory representation. Use +// Framer to read and write it. +type Frame interface { + write(f *Framer) error +} + +// ControlFrameHeader contains all the fields in a control frame header, +// in its unpacked in-memory representation. +type ControlFrameHeader struct { + // Note, high bit is the "Control" bit. + version uint16 // spdy version number + frameType ControlFrameType + Flags ControlFlags + length uint32 // length of data field +} + +type controlFrame interface { + Frame + read(h ControlFrameHeader, f *Framer) error +} + +// StreamId represents a 31-bit value identifying the stream. +type StreamId uint32 + +// SynStreamFrame is the unpacked, in-memory representation of a SYN_STREAM +// frame. +type SynStreamFrame struct { + CFHeader ControlFrameHeader + StreamId StreamId + AssociatedToStreamId StreamId // stream id for a stream which this stream is associated to + Priority uint8 // priority of this frame (3-bit) + Slot uint8 // index in the server's credential vector of the client certificate + Headers http.Header +} + +// SynReplyFrame is the unpacked, in-memory representation of a SYN_REPLY frame. +type SynReplyFrame struct { + CFHeader ControlFrameHeader + StreamId StreamId + Headers http.Header +} + +// RstStreamStatus represents the status that led to a RST_STREAM. +type RstStreamStatus uint32 + +const ( + ProtocolError RstStreamStatus = iota + 1 + InvalidStream + RefusedStream + UnsupportedVersion + Cancel + InternalError + FlowControlError + StreamInUse + StreamAlreadyClosed + InvalidCredentials + FrameTooLarge +) + +// RstStreamFrame is the unpacked, in-memory representation of a RST_STREAM +// frame. +type RstStreamFrame struct { + CFHeader ControlFrameHeader + StreamId StreamId + Status RstStreamStatus +} + +// SettingsFlag represents a flag in a SETTINGS frame. +type SettingsFlag uint8 + +const ( + FlagSettingsPersistValue SettingsFlag = 0x1 + FlagSettingsPersisted SettingsFlag = 0x2 +) + +// SettingsFlag represents the id of an id/value pair in a SETTINGS frame. +type SettingsId uint32 + +const ( + SettingsUploadBandwidth SettingsId = iota + 1 + SettingsDownloadBandwidth + SettingsRoundTripTime + SettingsMaxConcurrentStreams + SettingsCurrentCwnd + SettingsDownloadRetransRate + SettingsInitialWindowSize + SettingsClientCretificateVectorSize +) + +// SettingsFlagIdValue is the unpacked, in-memory representation of the +// combined flag/id/value for a setting in a SETTINGS frame. +type SettingsFlagIdValue struct { + Flag SettingsFlag + Id SettingsId + Value uint32 +} + +// SettingsFrame is the unpacked, in-memory representation of a SPDY +// SETTINGS frame. +type SettingsFrame struct { + CFHeader ControlFrameHeader + FlagIdValues []SettingsFlagIdValue +} + +// PingFrame is the unpacked, in-memory representation of a PING frame. +type PingFrame struct { + CFHeader ControlFrameHeader + Id uint32 // unique id for this ping, from server is even, from client is odd. +} + +// GoAwayStatus represents the status in a GoAwayFrame. +type GoAwayStatus uint32 + +const ( + GoAwayOK GoAwayStatus = iota + GoAwayProtocolError + GoAwayInternalError +) + +// GoAwayFrame is the unpacked, in-memory representation of a GOAWAY frame. +type GoAwayFrame struct { + CFHeader ControlFrameHeader + LastGoodStreamId StreamId // last stream id which was accepted by sender + Status GoAwayStatus +} + +// HeadersFrame is the unpacked, in-memory representation of a HEADERS frame. +type HeadersFrame struct { + CFHeader ControlFrameHeader + StreamId StreamId + Headers http.Header +} + +// WindowUpdateFrame is the unpacked, in-memory representation of a +// WINDOW_UPDATE frame. +type WindowUpdateFrame struct { + CFHeader ControlFrameHeader + StreamId StreamId + DeltaWindowSize uint32 // additional number of bytes to existing window size +} + +// TODO: Implement credential frame and related methods. + +// DataFrame is the unpacked, in-memory representation of a DATA frame. +type DataFrame struct { + // Note, high bit is the "Control" bit. Should be 0 for data frames. + StreamId StreamId + Flags DataFlags + Data []byte // payload data of this frame +} + +// A SPDY specific error. +type ErrorCode string + +const ( + UnlowercasedHeaderName ErrorCode = "header was not lowercased" + DuplicateHeaders ErrorCode = "multiple headers with same name" + WrongCompressedPayloadSize ErrorCode = "compressed payload size was incorrect" + UnknownFrameType ErrorCode = "unknown frame type" + InvalidControlFrame ErrorCode = "invalid control frame" + InvalidDataFrame ErrorCode = "invalid data frame" + InvalidHeaderPresent ErrorCode = "frame contained invalid header" + ZeroStreamId ErrorCode = "stream id zero is disallowed" +) + +// Error contains both the type of error and additional values. StreamId is 0 +// if Error is not associated with a stream. +type Error struct { + Err ErrorCode + StreamId StreamId +} + +func (e *Error) Error() string { + return string(e.Err) +} + +var invalidReqHeaders = map[string]bool{ + "Connection": true, + "Host": true, + "Keep-Alive": true, + "Proxy-Connection": true, + "Transfer-Encoding": true, +} + +var invalidRespHeaders = map[string]bool{ + "Connection": true, + "Keep-Alive": true, + "Proxy-Connection": true, + "Transfer-Encoding": true, +} + +// Framer handles serializing/deserializing SPDY frames, including compressing/ +// decompressing payloads. +type Framer struct { + headerCompressionDisabled bool + w io.Writer + headerBuf *bytes.Buffer + headerCompressor *zlib.Writer + r io.Reader + headerReader io.LimitedReader + headerDecompressor io.ReadCloser +} + +// NewFramer allocates a new Framer for a given SPDY connection, represented by +// a io.Writer and io.Reader. Note that Framer will read and write individual fields +// from/to the Reader and Writer, so the caller should pass in an appropriately +// buffered implementation to optimize performance. +func NewFramer(w io.Writer, r io.Reader) (*Framer, error) { + compressBuf := new(bytes.Buffer) + compressor, err := zlib.NewWriterLevelDict(compressBuf, zlib.BestCompression, []byte(headerDictionary)) + if err != nil { + return nil, err + } + framer := &Framer{ + w: w, + headerBuf: compressBuf, + headerCompressor: compressor, + r: r, + } + return framer, nil +} diff --git a/vendor/github.com/docker/spdystream/spdy/write.go b/vendor/github.com/moby/spdystream/spdy/write.go similarity index 93% rename from vendor/github.com/docker/spdystream/spdy/write.go rename to vendor/github.com/moby/spdystream/spdy/write.go index b212f66a2354..ab6d91f3b824 100644 --- a/vendor/github.com/docker/spdystream/spdy/write.go +++ b/vendor/github.com/moby/spdystream/spdy/write.go @@ -1,3 +1,19 @@ +/* + Copyright 2014-2021 Docker Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + // Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. diff --git a/vendor/github.com/docker/spdystream/stream.go b/vendor/github.com/moby/spdystream/stream.go similarity index 92% rename from vendor/github.com/docker/spdystream/stream.go rename to vendor/github.com/moby/spdystream/stream.go index f9e9ee267f86..404e3c02dfac 100644 --- a/vendor/github.com/docker/spdystream/stream.go +++ b/vendor/github.com/moby/spdystream/stream.go @@ -1,3 +1,19 @@ +/* + Copyright 2014-2021 Docker Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + package spdystream import ( @@ -9,7 +25,7 @@ import ( "sync" "time" - "github.com/docker/spdystream/spdy" + "github.com/moby/spdystream/spdy" ) var ( diff --git a/vendor/github.com/moby/spdystream/utils.go b/vendor/github.com/moby/spdystream/utils.go new file mode 100644 index 000000000000..e9f7fffd606e --- /dev/null +++ b/vendor/github.com/moby/spdystream/utils.go @@ -0,0 +1,32 @@ +/* + Copyright 2014-2021 Docker Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package spdystream + +import ( + "log" + "os" +) + +var ( + DEBUG = os.Getenv("DEBUG") +) + +func debugMessage(fmt string, args ...interface{}) { + if DEBUG != "" { + log.Printf(fmt, args...) + } +} diff --git a/vendor/github.com/moby/sys/mount/LICENSE b/vendor/github.com/moby/sys/mount/LICENSE new file mode 100644 index 000000000000..d64569567334 --- /dev/null +++ b/vendor/github.com/moby/sys/mount/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/moby/sys/mount/doc.go b/vendor/github.com/moby/sys/mount/doc.go new file mode 100644 index 000000000000..86c2e01bbd8c --- /dev/null +++ b/vendor/github.com/moby/sys/mount/doc.go @@ -0,0 +1,4 @@ +// Package mount provides a set of functions to mount and unmount mounts. +// +// Currently it supports Linux. For historical reasons, there is also some support for FreeBSD. +package mount diff --git a/vendor/github.com/moby/sys/mount/flags_bsd.go b/vendor/github.com/moby/sys/mount/flags_bsd.go new file mode 100644 index 000000000000..27d8440aaba7 --- /dev/null +++ b/vendor/github.com/moby/sys/mount/flags_bsd.go @@ -0,0 +1,45 @@ +// +build freebsd openbsd + +package mount + +import "golang.org/x/sys/unix" + +const ( + // RDONLY will mount the filesystem as read-only. + RDONLY = unix.MNT_RDONLY + + // NOSUID will not allow set-user-identifier or set-group-identifier bits to + // take effect. + NOSUID = unix.MNT_NOSUID + + // NOEXEC will not allow execution of any binaries on the mounted file system. + NOEXEC = unix.MNT_NOEXEC + + // SYNCHRONOUS will allow any I/O to the file system to be done synchronously. + SYNCHRONOUS = unix.MNT_SYNCHRONOUS + + // NOATIME will not update the file access time when reading from a file. + NOATIME = unix.MNT_NOATIME +) + +// These flags are unsupported. +const ( + BIND = 0 + DIRSYNC = 0 + MANDLOCK = 0 + NODEV = 0 + NODIRATIME = 0 + UNBINDABLE = 0 + RUNBINDABLE = 0 + PRIVATE = 0 + RPRIVATE = 0 + SHARED = 0 + RSHARED = 0 + SLAVE = 0 + RSLAVE = 0 + RBIND = 0 + RELATIME = 0 + REMOUNT = 0 + STRICTATIME = 0 + mntDetach = 0 +) diff --git a/vendor/github.com/docker/docker/pkg/mount/flags_linux.go b/vendor/github.com/moby/sys/mount/flags_linux.go similarity index 97% rename from vendor/github.com/docker/docker/pkg/mount/flags_linux.go rename to vendor/github.com/moby/sys/mount/flags_linux.go index a1b199a31ac6..0425d0dd633c 100644 --- a/vendor/github.com/docker/docker/pkg/mount/flags_linux.go +++ b/vendor/github.com/moby/sys/mount/flags_linux.go @@ -1,4 +1,4 @@ -package mount // import "github.com/docker/docker/pkg/mount" +package mount import ( "golang.org/x/sys/unix" diff --git a/vendor/github.com/moby/sys/mount/flags_unix.go b/vendor/github.com/moby/sys/mount/flags_unix.go new file mode 100644 index 000000000000..995d72807c6a --- /dev/null +++ b/vendor/github.com/moby/sys/mount/flags_unix.go @@ -0,0 +1,139 @@ +// +build !darwin,!windows + +package mount + +import ( + "fmt" + "strings" +) + +var flags = map[string]struct { + clear bool + flag int +}{ + "defaults": {false, 0}, + "ro": {false, RDONLY}, + "rw": {true, RDONLY}, + "suid": {true, NOSUID}, + "nosuid": {false, NOSUID}, + "dev": {true, NODEV}, + "nodev": {false, NODEV}, + "exec": {true, NOEXEC}, + "noexec": {false, NOEXEC}, + "sync": {false, SYNCHRONOUS}, + "async": {true, SYNCHRONOUS}, + "dirsync": {false, DIRSYNC}, + "remount": {false, REMOUNT}, + "mand": {false, MANDLOCK}, + "nomand": {true, MANDLOCK}, + "atime": {true, NOATIME}, + "noatime": {false, NOATIME}, + "diratime": {true, NODIRATIME}, + "nodiratime": {false, NODIRATIME}, + "bind": {false, BIND}, + "rbind": {false, RBIND}, + "unbindable": {false, UNBINDABLE}, + "runbindable": {false, RUNBINDABLE}, + "private": {false, PRIVATE}, + "rprivate": {false, RPRIVATE}, + "shared": {false, SHARED}, + "rshared": {false, RSHARED}, + "slave": {false, SLAVE}, + "rslave": {false, RSLAVE}, + "relatime": {false, RELATIME}, + "norelatime": {true, RELATIME}, + "strictatime": {false, STRICTATIME}, + "nostrictatime": {true, STRICTATIME}, +} + +var validFlags = map[string]bool{ + "": true, + "size": true, + "mode": true, + "uid": true, + "gid": true, + "nr_inodes": true, + "nr_blocks": true, + "mpol": true, +} + +var propagationFlags = map[string]bool{ + "bind": true, + "rbind": true, + "unbindable": true, + "runbindable": true, + "private": true, + "rprivate": true, + "shared": true, + "rshared": true, + "slave": true, + "rslave": true, +} + +// MergeTmpfsOptions merge mount options to make sure there is no duplicate. +func MergeTmpfsOptions(options []string) ([]string, error) { + // We use collisions maps to remove duplicates. + // For flag, the key is the flag value (the key for propagation flag is -1) + // For data=value, the key is the data + flagCollisions := map[int]bool{} + dataCollisions := map[string]bool{} + + var newOptions []string + // We process in reverse order + for i := len(options) - 1; i >= 0; i-- { + option := options[i] + if option == "defaults" { + continue + } + if f, ok := flags[option]; ok && f.flag != 0 { + // There is only one propagation mode + key := f.flag + if propagationFlags[option] { + key = -1 + } + // Check to see if there is collision for flag + if !flagCollisions[key] { + // We prepend the option and add to collision map + newOptions = append([]string{option}, newOptions...) + flagCollisions[key] = true + } + continue + } + opt := strings.SplitN(option, "=", 2) + if len(opt) != 2 || !validFlags[opt[0]] { + return nil, fmt.Errorf("Invalid tmpfs option %q", opt) + } + if !dataCollisions[opt[0]] { + // We prepend the option and add to collision map + newOptions = append([]string{option}, newOptions...) + dataCollisions[opt[0]] = true + } + } + + return newOptions, nil +} + +// Parse fstab type mount options into mount() flags +// and device specific data +func parseOptions(options string) (int, string) { + var ( + flag int + data []string + ) + + for _, o := range strings.Split(options, ",") { + // If the option does not exist in the flags table or the flag + // is not supported on the platform, + // then it is a data value for a specific fs type + if f, exists := flags[o]; exists && f.flag != 0 { + if f.clear { + flag &= ^f.flag + } else { + flag |= f.flag + } + } else { + data = append(data, o) + } + } + return flag, strings.Join(data, ",") +} diff --git a/vendor/github.com/moby/sys/mount/go.mod b/vendor/github.com/moby/sys/mount/go.mod new file mode 100644 index 000000000000..e1e03a37695a --- /dev/null +++ b/vendor/github.com/moby/sys/mount/go.mod @@ -0,0 +1,8 @@ +module github.com/moby/sys/mount + +go 1.14 + +require ( + github.com/moby/sys/mountinfo v0.4.0 + golang.org/x/sys v0.0.0-20200922070232-aee5d888a860 +) diff --git a/vendor/github.com/moby/sys/mount/go.sum b/vendor/github.com/moby/sys/mount/go.sum new file mode 100644 index 000000000000..7c39d597b63f --- /dev/null +++ b/vendor/github.com/moby/sys/mount/go.sum @@ -0,0 +1,5 @@ +github.com/moby/sys/mountinfo v0.4.0 h1:1KInV3Huv18akCu58V7lzNlt+jFmqlu1EaErnEHE/VM= +github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= +golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200922070232-aee5d888a860 h1:YEu4SMq7D0cmT7CBbXfcH0NZeuChAXwsHe/9XueUO6o= +golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/vendor/github.com/moby/sys/mount/mount_errors.go b/vendor/github.com/moby/sys/mount/mount_errors.go new file mode 100644 index 000000000000..936a26373bd5 --- /dev/null +++ b/vendor/github.com/moby/sys/mount/mount_errors.go @@ -0,0 +1,46 @@ +// +build !windows + +package mount + +import "strconv" + +// mountError records an error from mount or unmount operation +type mountError struct { + op string + source, target string + flags uintptr + data string + err error +} + +func (e *mountError) Error() string { + out := e.op + " " + + if e.source != "" { + out += e.source + ":" + e.target + } else { + out += e.target + } + + if e.flags != uintptr(0) { + out += ", flags: 0x" + strconv.FormatUint(uint64(e.flags), 16) + } + if e.data != "" { + out += ", data: " + e.data + } + + out += ": " + e.err.Error() + return out +} + +// Cause returns the underlying cause of the error. +// This is a convention used in github.com/pkg/errors +func (e *mountError) Cause() error { + return e.err +} + +// Unwrap returns the underlying error. +// This is a convention used in golang 1.13+ +func (e *mountError) Unwrap() error { + return e.err +} diff --git a/vendor/github.com/moby/sys/mount/mount_unix.go b/vendor/github.com/moby/sys/mount/mount_unix.go new file mode 100644 index 000000000000..a250bfc80a79 --- /dev/null +++ b/vendor/github.com/moby/sys/mount/mount_unix.go @@ -0,0 +1,87 @@ +// +build !darwin,!windows + +package mount + +import ( + "fmt" + "sort" + + "github.com/moby/sys/mountinfo" + "golang.org/x/sys/unix" +) + +// Mount will mount filesystem according to the specified configuration. +// Options must be specified like the mount or fstab unix commands: +// "opt1=val1,opt2=val2". See flags.go for supported option flags. +func Mount(device, target, mType, options string) error { + flag, data := parseOptions(options) + return mount(device, target, mType, uintptr(flag), data) +} + +// Unmount lazily unmounts a filesystem on supported platforms, otherwise does +// a normal unmount. If target is not a mount point, no error is returned. +func Unmount(target string) error { + err := unix.Unmount(target, mntDetach) + if err == nil || err == unix.EINVAL { + // Ignore "not mounted" error here. Note the same error + // can be returned if flags are invalid, so this code + // assumes that the flags value is always correct. + return nil + } + + return &mountError{ + op: "umount", + target: target, + flags: uintptr(mntDetach), + err: err, + } +} + +// RecursiveUnmount unmounts the target and all mounts underneath, starting +// with the deepest mount first. The argument does not have to be a mount +// point itself. +func RecursiveUnmount(target string) error { + // Fast path, works if target is a mount point that can be unmounted. + // On Linux, mntDetach flag ensures a recursive unmount. For other + // platforms, if there are submounts, we'll get EBUSY (and fall back + // to the slow path). NOTE we do not ignore EINVAL here as target might + // not be a mount point itself (but there can be mounts underneath). + if err := unix.Unmount(target, mntDetach); err == nil { + return nil + } + + // Slow path: get all submounts, sort, unmount one by one. + mounts, err := mountinfo.GetMounts(mountinfo.PrefixFilter(target)) + if err != nil { + return err + } + + // Make the deepest mount be first + sort.Slice(mounts, func(i, j int) bool { + return len(mounts[i].Mountpoint) > len(mounts[j].Mountpoint) + }) + + var ( + suberr error + lastMount = len(mounts) - 1 + ) + for i, m := range mounts { + err = Unmount(m.Mountpoint) + if err != nil { + if i == lastMount { + if suberr != nil { + return fmt.Errorf("%w (possible cause: %s)", err, suberr) + } + return err + } + // This is a submount, we can ignore the error for now, + // the final unmount will fail if this is a real problem. + // With that in mind, the _first_ failed unmount error + // might be the real error cause, so let's keep it. + if suberr == nil { + suberr = err + } + } + } + return nil +} diff --git a/vendor/github.com/moby/sys/mount/mounter_bsd.go b/vendor/github.com/moby/sys/mount/mounter_bsd.go new file mode 100644 index 000000000000..656b762fe7f1 --- /dev/null +++ b/vendor/github.com/moby/sys/mount/mounter_bsd.go @@ -0,0 +1,61 @@ +// +build freebsd,cgo openbsd,cgo + +package mount + +/* +#include +#include +#include +#include +#include +#include +*/ +import "C" + +import ( + "strings" + "syscall" + "unsafe" +) + +func allocateIOVecs(options []string) []C.struct_iovec { + out := make([]C.struct_iovec, len(options)) + for i, option := range options { + out[i].iov_base = unsafe.Pointer(C.CString(option)) + out[i].iov_len = C.size_t(len(option) + 1) + } + return out +} + +func mount(device, target, mType string, flag uintptr, data string) error { + isNullFS := false + + xs := strings.Split(data, ",") + for _, x := range xs { + if x == "bind" { + isNullFS = true + } + } + + options := []string{"fspath", target} + if isNullFS { + options = append(options, "fstype", "nullfs", "target", device) + } else { + options = append(options, "fstype", mType, "from", device) + } + rawOptions := allocateIOVecs(options) + for _, rawOption := range rawOptions { + defer C.free(rawOption.iov_base) + } + + if errno := C.nmount(&rawOptions[0], C.uint(len(options)), C.int(flag)); errno != 0 { + return &mountError{ + op: "mount", + source: device, + target: target, + flags: flag, + err: syscall.Errno(errno), + } + } + return nil +} diff --git a/vendor/github.com/docker/docker/pkg/mount/mounter_linux.go b/vendor/github.com/moby/sys/mount/mounter_linux.go similarity index 96% rename from vendor/github.com/docker/docker/pkg/mount/mounter_linux.go rename to vendor/github.com/moby/sys/mount/mounter_linux.go index a0a1ad2364a1..0c477cc3d79d 100644 --- a/vendor/github.com/docker/docker/pkg/mount/mounter_linux.go +++ b/vendor/github.com/moby/sys/mount/mounter_linux.go @@ -1,4 +1,4 @@ -package mount // import "github.com/docker/docker/pkg/mount" +package mount import ( "golang.org/x/sys/unix" diff --git a/vendor/github.com/moby/sys/mount/mounter_unsupported.go b/vendor/github.com/moby/sys/mount/mounter_unsupported.go new file mode 100644 index 000000000000..e7ff5bd9ffa6 --- /dev/null +++ b/vendor/github.com/moby/sys/mount/mounter_unsupported.go @@ -0,0 +1,7 @@ +// +build !linux,!freebsd,!openbsd,!windows freebsd,!cgo openbsd,!cgo + +package mount + +func mount(device, target, mType string, flag uintptr, data string) error { + panic("cgo required on freebsd and openbsd") +} diff --git a/vendor/github.com/docker/docker/pkg/mount/sharedsubtree_linux.go b/vendor/github.com/moby/sys/mount/sharedsubtree_linux.go similarity index 96% rename from vendor/github.com/docker/docker/pkg/mount/sharedsubtree_linux.go rename to vendor/github.com/moby/sys/mount/sharedsubtree_linux.go index db3882874aea..948e6bacd8ae 100644 --- a/vendor/github.com/docker/docker/pkg/mount/sharedsubtree_linux.go +++ b/vendor/github.com/moby/sys/mount/sharedsubtree_linux.go @@ -1,4 +1,6 @@ -package mount // import "github.com/docker/docker/pkg/mount" +package mount + +import "github.com/moby/sys/mountinfo" // MakeShared ensures a mounted filesystem has the SHARED mount option enabled. // See the supported options in flags.go for further reference. @@ -51,7 +53,7 @@ func MakeRUnbindable(mountPoint string) error { // MakeMount ensures that the file or directory given is a mount point, // bind mounting it to itself it case it is not. func MakeMount(mnt string) error { - mounted, err := Mounted(mnt) + mounted, err := mountinfo.Mounted(mnt) if err != nil { return err } diff --git a/vendor/github.com/moby/sys/mountinfo/doc.go b/vendor/github.com/moby/sys/mountinfo/doc.go new file mode 100644 index 000000000000..b80e05efd056 --- /dev/null +++ b/vendor/github.com/moby/sys/mountinfo/doc.go @@ -0,0 +1,44 @@ +// Package mountinfo provides a set of functions to retrieve information about OS mounts. +// +// Currently it supports Linux. For historical reasons, there is also some support for FreeBSD and OpenBSD, +// and a shallow implementation for Windows, but in general this is Linux-only package, so +// the rest of the document only applies to Linux, unless explicitly specified otherwise. +// +// In Linux, information about mounts seen by the current process is available from +// /proc/self/mountinfo. Note that due to mount namespaces, different processes can +// see different mounts. A per-process mountinfo table is available from /proc//mountinfo, +// where is a numerical process identifier. +// +// In general, /proc is not a very efficient interface, and mountinfo is not an exception. +// For example, there is no way to get information about a specific mount point (i.e. it +// is all-or-nothing). This package tries to hide the /proc ineffectiveness by using +// parse filters while reading mountinfo. A filter can skip some entries, or stop +// processing the rest of the file once the needed information is found. +// +// For mountinfo filters that accept path as an argument, the path must be absolute, +// having all symlinks resolved, and being cleaned (i.e. no extra slashes or dots). +// One way to achieve all of the above is to employ filepath.Abs followed by +// filepath.EvalSymlinks (the latter calls filepath.Clean on the result so +// there is no need to explicitly call filepath.Clean). +// +// NOTE that in many cases there is no need to consult mountinfo at all. Here are some +// of the cases where mountinfo should not be parsed: +// +// 1. Before performing a mount. Usually, this is not needed, but if required (say to +// prevent over-mounts), to check whether a directory is mounted, call os.Lstat +// on it and its parent directory, and compare their st.Sys().(*syscall.Stat_t).Dev +// fields -- if they differ, then the directory is the mount point. NOTE this does +// not work for bind mounts. Optionally, the filesystem type can also be checked +// by calling unix.Statfs and checking the Type field (i.e. filesystem type). +// +// 2. After performing a mount. If there is no error returned, the mount succeeded; +// checking the mount table for a new mount is redundant and expensive. +// +// 3. Before performing an unmount. It is more efficient to do an unmount and ignore +// a specific error (EINVAL) which tells the directory is not mounted. +// +// 4. After performing an unmount. If there is no error returned, the unmount succeeded. +// +// 5. To find the mount point root of a specific directory. You can perform os.Stat() +// on the directory and traverse up until the Dev field of a parent directory differs. +package mountinfo diff --git a/vendor/github.com/moby/sys/mountinfo/go.mod b/vendor/github.com/moby/sys/mountinfo/go.mod index 10d9a15a6c75..9749ea96d9d5 100644 --- a/vendor/github.com/moby/sys/mountinfo/go.mod +++ b/vendor/github.com/moby/sys/mountinfo/go.mod @@ -1,3 +1,5 @@ module github.com/moby/sys/mountinfo go 1.14 + +require golang.org/x/sys v0.0.0-20200909081042-eff7692f9009 diff --git a/vendor/github.com/moby/sys/mountinfo/go.sum b/vendor/github.com/moby/sys/mountinfo/go.sum new file mode 100644 index 000000000000..2a5be7ea8438 --- /dev/null +++ b/vendor/github.com/moby/sys/mountinfo/go.sum @@ -0,0 +1,2 @@ +golang.org/x/sys v0.0.0-20200909081042-eff7692f9009 h1:W0lCpv29Hv0UaM1LXb9QlBHLNP8UFfcKjblhVCWftOM= +golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/vendor/github.com/moby/sys/mountinfo/mounted_linux.go b/vendor/github.com/moby/sys/mountinfo/mounted_linux.go new file mode 100644 index 000000000000..bc9f6b2ad3d7 --- /dev/null +++ b/vendor/github.com/moby/sys/mountinfo/mounted_linux.go @@ -0,0 +1,58 @@ +package mountinfo + +import ( + "os" + "path/filepath" + + "golang.org/x/sys/unix" +) + +// mountedByOpenat2 is a method of detecting a mount that works for all kinds +// of mounts (incl. bind mounts), but requires a recent (v5.6+) linux kernel. +func mountedByOpenat2(path string) (bool, error) { + dir, last := filepath.Split(path) + + dirfd, err := unix.Openat2(unix.AT_FDCWD, dir, &unix.OpenHow{ + Flags: unix.O_PATH | unix.O_CLOEXEC, + }) + if err != nil { + if err == unix.ENOENT { // not a mount + return false, nil + } + return false, &os.PathError{Op: "openat2", Path: dir, Err: err} + } + fd, err := unix.Openat2(dirfd, last, &unix.OpenHow{ + Flags: unix.O_PATH | unix.O_CLOEXEC | unix.O_NOFOLLOW, + Resolve: unix.RESOLVE_NO_XDEV, + }) + _ = unix.Close(dirfd) + switch err { + case nil: // definitely not a mount + _ = unix.Close(fd) + return false, nil + case unix.EXDEV: // definitely a mount + return true, nil + case unix.ENOENT: // not a mount + return false, nil + } + // not sure + return false, &os.PathError{Op: "openat2", Path: path, Err: err} +} + +func mounted(path string) (bool, error) { + // Try a fast path, using openat2() with RESOLVE_NO_XDEV. + mounted, err := mountedByOpenat2(path) + if err == nil { + return mounted, nil + } + // Another fast path: compare st.st_dev fields. + mounted, err = mountedByStat(path) + // This does not work for bind mounts, so false negative + // is possible, therefore only trust if return is true. + if mounted && err == nil { + return mounted, nil + } + + // Fallback to parsing mountinfo + return mountedByMountinfo(path) +} diff --git a/vendor/github.com/moby/sys/mountinfo/mounted_unix.go b/vendor/github.com/moby/sys/mountinfo/mounted_unix.go new file mode 100644 index 000000000000..efb03978b1e3 --- /dev/null +++ b/vendor/github.com/moby/sys/mountinfo/mounted_unix.go @@ -0,0 +1,66 @@ +// +build linux freebsd,cgo openbsd,cgo + +package mountinfo + +import ( + "errors" + "fmt" + "os" + "path/filepath" + + "golang.org/x/sys/unix" +) + +func mountedByStat(path string) (bool, error) { + var st unix.Stat_t + + if err := unix.Lstat(path, &st); err != nil { + if err == unix.ENOENT { + // Treat ENOENT as "not mounted". + return false, nil + } + return false, &os.PathError{Op: "stat", Path: path, Err: err} + } + dev := st.Dev + parent := filepath.Dir(path) + if err := unix.Lstat(parent, &st); err != nil { + return false, &os.PathError{Op: "stat", Path: parent, Err: err} + } + if dev != st.Dev { + // Device differs from that of parent, + // so definitely a mount point. + return true, nil + } + // NB: this does not detect bind mounts on Linux. + return false, nil +} + +func normalizePath(path string) (realPath string, err error) { + if realPath, err = filepath.Abs(path); err != nil { + return "", fmt.Errorf("unable to get absolute path for %q: %w", path, err) + } + if realPath, err = filepath.EvalSymlinks(realPath); err != nil { + return "", fmt.Errorf("failed to canonicalise path for %q: %w", path, err) + } + if _, err := os.Stat(realPath); err != nil { + return "", fmt.Errorf("failed to stat target of %q: %w", path, err) + } + return realPath, nil +} + +func mountedByMountinfo(path string) (bool, error) { + path, err := normalizePath(path) + if err != nil { + if errors.Is(err, unix.ENOENT) { + // treat ENOENT as "not mounted" + return false, nil + } + return false, err + } + entries, err := GetMounts(SingleEntryFilter(path)) + if err != nil { + return false, err + } + + return len(entries) > 0, nil +} diff --git a/vendor/github.com/moby/sys/mountinfo/mountinfo.go b/vendor/github.com/moby/sys/mountinfo/mountinfo.go index 136b14167b24..fe828c8f583d 100644 --- a/vendor/github.com/moby/sys/mountinfo/mountinfo.go +++ b/vendor/github.com/moby/sys/mountinfo/mountinfo.go @@ -1,6 +1,8 @@ package mountinfo -import "io" +import ( + "os" +) // GetMounts retrieves a list of mounts for the current running process, // with an optional filter applied (use nil for no filter). @@ -8,23 +10,17 @@ func GetMounts(f FilterFunc) ([]*Info, error) { return parseMountTable(f) } -// GetMountsFromReader retrieves a list of mounts from the -// reader provided, with an optional filter applied (use nil -// for no filter). This can be useful in tests or benchmarks -// that provide a fake mountinfo data. -func GetMountsFromReader(reader io.Reader, f FilterFunc) ([]*Info, error) { - return parseInfoFile(reader, f) -} - -// Mounted determines if a specified mountpoint has been mounted. -// On Linux it looks at /proc/self/mountinfo. -func Mounted(mountpoint string) (bool, error) { - entries, err := GetMounts(SingleEntryFilter(mountpoint)) - if err != nil { - return false, err +// Mounted determines if a specified path is a mount point. +// +// The argument must be an absolute path, with all symlinks resolved, and clean. +// One way to ensure it is to process the path using filepath.Abs followed by +// filepath.EvalSymlinks before calling this function. +func Mounted(path string) (bool, error) { + // root is always mounted + if path == string(os.PathSeparator) { + return true, nil } - - return len(entries) > 0, nil + return mounted(path) } // Info reveals information about a particular mounted filesystem. This @@ -50,18 +46,18 @@ type Info struct { // Mountpoint indicates the mount point relative to the process's root. Mountpoint string - // Opts represents mount-specific options. - Opts string + // Options represents mount-specific options. + Options string // Optional represents optional fields. Optional string - // Fstype indicates the type of filesystem, such as EXT3. - Fstype string + // FSType indicates the type of filesystem, such as EXT3. + FSType string // Source indicates filesystem specific information or "none". Source string - // VfsOpts represents per super block options. - VfsOpts string + // VFSOptions represents per super block options. + VFSOptions string } diff --git a/vendor/github.com/moby/sys/mountinfo/mountinfo_bsd.go b/vendor/github.com/moby/sys/mountinfo/mountinfo_bsd.go new file mode 100644 index 000000000000..b1c12d02b51e --- /dev/null +++ b/vendor/github.com/moby/sys/mountinfo/mountinfo_bsd.go @@ -0,0 +1,67 @@ +// +build freebsd,cgo openbsd,cgo + +package mountinfo + +/* +#include +#include +#include +*/ +import "C" + +import ( + "fmt" + "reflect" + "unsafe" +) + +// parseMountTable returns information about mounted filesystems +func parseMountTable(filter FilterFunc) ([]*Info, error) { + var rawEntries *C.struct_statfs + + count := int(C.getmntinfo(&rawEntries, C.MNT_WAIT)) + if count == 0 { + return nil, fmt.Errorf("Failed to call getmntinfo") + } + + var entries []C.struct_statfs + header := (*reflect.SliceHeader)(unsafe.Pointer(&entries)) + header.Cap = count + header.Len = count + header.Data = uintptr(unsafe.Pointer(rawEntries)) + + var out []*Info + for _, entry := range entries { + var mountinfo Info + var skip, stop bool + mountinfo.Mountpoint = C.GoString(&entry.f_mntonname[0]) + mountinfo.FSType = C.GoString(&entry.f_fstypename[0]) + mountinfo.Source = C.GoString(&entry.f_mntfromname[0]) + + if filter != nil { + // filter out entries we're not interested in + skip, stop = filter(&mountinfo) + if skip { + continue + } + } + + out = append(out, &mountinfo) + if stop { + break + } + } + return out, nil +} + +func mounted(path string) (bool, error) { + // Fast path: compare st.st_dev fields. + // This should always work for FreeBSD and OpenBSD. + mounted, err := mountedByStat(path) + if err == nil { + return mounted, nil + } + + // Fallback to parsing mountinfo + return mountedByMountinfo(path) +} diff --git a/vendor/github.com/moby/sys/mountinfo/mountinfo_filters.go b/vendor/github.com/moby/sys/mountinfo/mountinfo_filters.go index 79502646597c..5869b2cee391 100644 --- a/vendor/github.com/moby/sys/mountinfo/mountinfo_filters.go +++ b/vendor/github.com/moby/sys/mountinfo/mountinfo_filters.go @@ -6,16 +6,16 @@ import "strings" // used to filter out mountinfo entries we're not interested in, // and/or stop further processing if we found what we wanted. // -// It takes a pointer to the Info struct (not fully populated, -// currently only Mountpoint, Fstype, Source, and (on Linux) -// VfsOpts are filled in), and returns two booleans: +// It takes a pointer to the Info struct (fully populated with all available +// fields on the GOOS platform), and returns two booleans: // -// - skip: true if the entry should be skipped -// - stop: true if parsing should be stopped after the entry +// skip: true if the entry should be skipped; +// +// stop: true if parsing should be stopped after the entry. type FilterFunc func(*Info) (skip, stop bool) // PrefixFilter discards all entries whose mount points -// do not start with a specific prefix +// do not start with a specific prefix. func PrefixFilter(prefix string) FilterFunc { return func(m *Info) (bool, bool) { skip := !strings.HasPrefix(m.Mountpoint, prefix) @@ -23,7 +23,7 @@ func PrefixFilter(prefix string) FilterFunc { } } -// SingleEntryFilter looks for a specific entry +// SingleEntryFilter looks for a specific entry. func SingleEntryFilter(mp string) FilterFunc { return func(m *Info) (bool, bool) { if m.Mountpoint == mp { @@ -36,8 +36,8 @@ func SingleEntryFilter(mp string) FilterFunc { // ParentsFilter returns all entries whose mount points // can be parents of a path specified, discarding others. // -// For example, given `/var/lib/docker/something`, entries -// like `/var/lib/docker`, `/var` and `/` are returned. +// For example, given /var/lib/docker/something, entries +// like /var/lib/docker, /var and / are returned. func ParentsFilter(path string) FilterFunc { return func(m *Info) (bool, bool) { skip := !strings.HasPrefix(path, m.Mountpoint) @@ -45,12 +45,12 @@ func ParentsFilter(path string) FilterFunc { } } -// FstypeFilter returns all entries that match provided fstype(s). -func FstypeFilter(fstype ...string) FilterFunc { +// FSTypeFilter returns all entries that match provided fstype(s). +func FSTypeFilter(fstype ...string) FilterFunc { return func(m *Info) (bool, bool) { for _, t := range fstype { - if m.Fstype == t { - return false, false // don't skeep, keep going + if m.FSType == t { + return false, false // don't skip, keep going } } return true, false // skip, keep going diff --git a/vendor/github.com/moby/sys/mountinfo/mountinfo_freebsd.go b/vendor/github.com/moby/sys/mountinfo/mountinfo_freebsd.go deleted file mode 100644 index a7dbb1b46b74..000000000000 --- a/vendor/github.com/moby/sys/mountinfo/mountinfo_freebsd.go +++ /dev/null @@ -1,53 +0,0 @@ -package mountinfo - -/* -#include -#include -#include -*/ -import "C" - -import ( - "fmt" - "reflect" - "unsafe" -) - -// parseMountTable returns information about mounted filesystems -func parseMountTable(filter FilterFunc) ([]*Info, error) { - var rawEntries *C.struct_statfs - - count := int(C.getmntinfo(&rawEntries, C.MNT_WAIT)) - if count == 0 { - return nil, fmt.Errorf("Failed to call getmntinfo") - } - - var entries []C.struct_statfs - header := (*reflect.SliceHeader)(unsafe.Pointer(&entries)) - header.Cap = count - header.Len = count - header.Data = uintptr(unsafe.Pointer(rawEntries)) - - var out []*Info - for _, entry := range entries { - var mountinfo Info - var skip, stop bool - mountinfo.Mountpoint = C.GoString(&entry.f_mntonname[0]) - mountinfo.Fstype = C.GoString(&entry.f_fstypename[0]) - mountinfo.Source = C.GoString(&entry.f_mntfromname[0]) - - if filter != nil { - // filter out entries we're not interested in - skip, stop = filter(&mountinfo) - if skip { - continue - } - } - - out = append(out, &mountinfo) - if stop { - break - } - } - return out, nil -} diff --git a/vendor/github.com/moby/sys/mountinfo/mountinfo_linux.go b/vendor/github.com/moby/sys/mountinfo/mountinfo_linux.go index 2d630c8dc589..e591c8365389 100644 --- a/vendor/github.com/moby/sys/mountinfo/mountinfo_linux.go +++ b/vendor/github.com/moby/sys/mountinfo/mountinfo_linux.go @@ -1,5 +1,3 @@ -// +build go1.13 - package mountinfo import ( @@ -11,14 +9,18 @@ import ( "strings" ) -func parseInfoFile(r io.Reader, filter FilterFunc) ([]*Info, error) { +// GetMountsFromReader retrieves a list of mounts from the +// reader provided, with an optional filter applied (use nil +// for no filter). This can be useful in tests or benchmarks +// that provide a fake mountinfo data. +// +// This function is Linux-specific. +func GetMountsFromReader(r io.Reader, filter FilterFunc) ([]*Info, error) { s := bufio.NewScanner(r) out := []*Info{} - var err error for s.Scan() { - if err = s.Err(); err != nil { - return nil, err - } + var err error + /* See http://man7.org/linux/man-pages/man5/proc.5.html @@ -70,26 +72,19 @@ func parseInfoFile(r io.Reader, filter FilterFunc) ([]*Info, error) { p := &Info{} - // Fill in the fields that a filter might check - p.Mountpoint, err = strconv.Unquote(`"` + fields[4] + `"`) + p.Mountpoint, err = unescape(fields[4]) if err != nil { - return nil, fmt.Errorf("Parsing '%s' failed: unable to unquote mount point field: %w", fields[4], err) + return nil, fmt.Errorf("Parsing '%s' failed: mount point: %w", fields[4], err) } - p.Fstype = fields[sepIdx+1] - p.Source = fields[sepIdx+2] - p.VfsOpts = fields[sepIdx+3] - - // Run a filter soon so we can skip parsing/adding entries - // the caller is not interested in - var skip, stop bool - if filter != nil { - skip, stop = filter(p) - if skip { - continue - } + p.FSType, err = unescape(fields[sepIdx+1]) + if err != nil { + return nil, fmt.Errorf("Parsing '%s' failed: fstype: %w", fields[sepIdx+1], err) } - - // Fill in the rest of the fields + p.Source, err = unescape(fields[sepIdx+2]) + if err != nil { + return nil, fmt.Errorf("Parsing '%s' failed: source: %w", fields[sepIdx+2], err) + } + p.VFSOptions = fields[sepIdx+3] // ignore any numbers parsing errors, as there should not be any p.ID, _ = strconv.Atoi(fields[0]) @@ -101,12 +96,12 @@ func parseInfoFile(r io.Reader, filter FilterFunc) ([]*Info, error) { p.Major, _ = strconv.Atoi(mm[0]) p.Minor, _ = strconv.Atoi(mm[1]) - p.Root, err = strconv.Unquote(`"` + fields[3] + `"`) + p.Root, err = unescape(fields[3]) if err != nil { - return nil, fmt.Errorf("Parsing '%s' failed: unable to unquote root field: %w", fields[3], err) + return nil, fmt.Errorf("Parsing '%s' failed: root: %w", fields[3], err) } - p.Opts = fields[5] + p.Options = fields[5] // zero or more optional fields switch { @@ -118,11 +113,23 @@ func parseInfoFile(r io.Reader, filter FilterFunc) ([]*Info, error) { p.Optional = strings.Join(fields[6:sepIdx-1], " ") } + // Run the filter after parsing all of the fields. + var skip, stop bool + if filter != nil { + skip, stop = filter(p) + if skip { + continue + } + } + out = append(out, p) if stop { break } } + if err := s.Err(); err != nil { + return nil, err + } return out, nil } @@ -135,12 +142,17 @@ func parseMountTable(filter FilterFunc) ([]*Info, error) { } defer f.Close() - return parseInfoFile(f, filter) + return GetMountsFromReader(f, filter) } -// PidMountInfo collects the mounts for a specific process ID. If the process -// ID is unknown, it is better to use `GetMounts` which will inspect -// "/proc/self/mountinfo" instead. +// PidMountInfo retrieves the list of mounts from a given process' mount +// namespace. Unless there is a need to get mounts from a mount namespace +// different from that of a calling process, use GetMounts. +// +// This function is Linux-specific. +// +// Deprecated: this will be removed before v1; use GetMountsFromReader with +// opened /proc//mountinfo as an argument instead. func PidMountInfo(pid int) ([]*Info, error) { f, err := os.Open(fmt.Sprintf("/proc/%d/mountinfo", pid)) if err != nil { @@ -148,5 +160,63 @@ func PidMountInfo(pid int) ([]*Info, error) { } defer f.Close() - return parseInfoFile(f, nil) + return GetMountsFromReader(f, nil) +} + +// A few specific characters in mountinfo path entries (root and mountpoint) +// are escaped using a backslash followed by a character's ascii code in octal. +// +// space -- as \040 +// tab (aka \t) -- as \011 +// newline (aka \n) -- as \012 +// backslash (aka \\) -- as \134 +// +// This function converts path from mountinfo back, i.e. it unescapes the above sequences. +func unescape(path string) (string, error) { + // try to avoid copying + if strings.IndexByte(path, '\\') == -1 { + return path, nil + } + + // The following code is UTF-8 transparent as it only looks for some + // specific characters (backslash and 0..7) with values < utf8.RuneSelf, + // and everything else is passed through as is. + buf := make([]byte, len(path)) + bufLen := 0 + for i := 0; i < len(path); i++ { + if path[i] != '\\' { + buf[bufLen] = path[i] + bufLen++ + continue + } + s := path[i:] + if len(s) < 4 { + // too short + return "", fmt.Errorf("bad escape sequence %q: too short", s) + } + c := s[1] + switch c { + case '0', '1', '2', '3', '4', '5', '6', '7': + v := c - '0' + for j := 2; j < 4; j++ { // one digit already; two more + if s[j] < '0' || s[j] > '7' { + return "", fmt.Errorf("bad escape sequence %q: not a digit", s[:3]) + } + x := s[j] - '0' + v = (v << 3) | x + } + if v > 255 { + return "", fmt.Errorf("bad escape sequence %q: out of range" + s[:3]) + } + buf[bufLen] = v + bufLen++ + i += 3 + continue + default: + return "", fmt.Errorf("bad escape sequence %q: not a digit" + s[:3]) + + } + } + + return string(buf[:bufLen]), nil } diff --git a/vendor/github.com/moby/sys/mountinfo/mountinfo_unsupported.go b/vendor/github.com/moby/sys/mountinfo/mountinfo_unsupported.go index dc1869211895..d33ebca09688 100644 --- a/vendor/github.com/moby/sys/mountinfo/mountinfo_unsupported.go +++ b/vendor/github.com/moby/sys/mountinfo/mountinfo_unsupported.go @@ -1,17 +1,18 @@ -// +build !windows,!linux,!freebsd freebsd,!cgo +// +build !windows,!linux,!freebsd,!openbsd freebsd,!cgo openbsd,!cgo package mountinfo import ( "fmt" - "io" "runtime" ) +var errNotImplemented = fmt.Errorf("not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) + func parseMountTable(_ FilterFunc) ([]*Info, error) { - return nil, fmt.Errorf("mount.parseMountTable is not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) + return nil, errNotImplemented } -func parseInfoFile(_ io.Reader, f FilterFunc) ([]*Info, error) { - return parseMountTable(f) +func mounted(path string) (bool, error) { + return false, errNotImplemented } diff --git a/vendor/github.com/moby/sys/mountinfo/mountinfo_windows.go b/vendor/github.com/moby/sys/mountinfo/mountinfo_windows.go index 69ffdc52b6b6..13fad165e5d3 100644 --- a/vendor/github.com/moby/sys/mountinfo/mountinfo_windows.go +++ b/vendor/github.com/moby/sys/mountinfo/mountinfo_windows.go @@ -1,12 +1,10 @@ package mountinfo -import "io" - func parseMountTable(_ FilterFunc) ([]*Info, error) { // Do NOT return an error! return nil, nil } -func parseInfoFile(_ io.Reader, f FilterFunc) ([]*Info, error) { - return parseMountTable(f) +func mounted(_ string) (bool, error) { + return false, nil } diff --git a/vendor/github.com/moby/term/.gitignore b/vendor/github.com/moby/term/.gitignore index df63b129a790..b0747ff010a7 100644 --- a/vendor/github.com/moby/term/.gitignore +++ b/vendor/github.com/moby/term/.gitignore @@ -1,24 +1,8 @@ -# Docker project generated files to ignore -# if you want to ignore files created by your editor/tools, -# please consider a global .gitignore https://help.github.com/articles/ignoring-files -*.exe -*.exe~ -*.gz -*.orig -test.main -.*.swp -.DS_Store -# a .bashrc may be added to customize the build environment -.bashrc -.editorconfig -.gopath/ -.go-pkg-cache/ -.idea/ -autogen/ -bundles/ -cmd/dockerd/dockerd -contrib/builder/rpm/*/changelog -vendor/pkg/ -go-test-report.json +# if you want to ignore files created by your editor/tools, consider using a +# global .gitignore or .git/info/exclude see https://help.github.com/articles/ignoring-files +.* +!.github +!.gitignore profile.out -junit-report.xml +# support running go modules in vendor mode for local development +vendor/ diff --git a/vendor/github.com/moby/term/README.md b/vendor/github.com/moby/term/README.md new file mode 100644 index 000000000000..0ce92cc33980 --- /dev/null +++ b/vendor/github.com/moby/term/README.md @@ -0,0 +1,36 @@ +# term - utilities for dealing with terminals + +![Test](https://github.com/moby/term/workflows/Test/badge.svg) [![GoDoc](https://godoc.org/github.com/moby/term?status.svg)](https://godoc.org/github.com/moby/term) [![Go Report Card](https://goreportcard.com/badge/github.com/moby/term)](https://goreportcard.com/report/github.com/moby/term) + +term provides structures and helper functions to work with terminal (state, sizes). + +#### Using term + +```go +package main + +import ( + "log" + "os" + + "github.com/moby/term" +) + +func main() { + fd := os.Stdin.Fd() + if term.IsTerminal(fd) { + ws, err := term.GetWinsize(fd) + if err != nil { + log.Fatalf("term.GetWinsize: %s", err) + } + log.Printf("%d:%d\n", ws.Height, ws.Width) + } +} +``` + +## Contributing + +Want to hack on term? [Docker's contributions guidelines](https://github.com/docker/docker/blob/master/CONTRIBUTING.md) apply. + +## Copyright and license +Code and documentation copyright 2015 Docker, inc. Code released under the Apache 2.0 license. Docs released under Creative commons. diff --git a/vendor/github.com/moby/term/ascii.go b/vendor/github.com/moby/term/ascii.go index 7c445686f3b0..55873c0556c9 100644 --- a/vendor/github.com/moby/term/ascii.go +++ b/vendor/github.com/moby/term/ascii.go @@ -1,4 +1,4 @@ -package term // import "github.com/moby/term" +package term import ( "fmt" diff --git a/vendor/github.com/moby/term/go.mod b/vendor/github.com/moby/term/go.mod index 9f23ce0d5e4d..f453204333a8 100644 --- a/vendor/github.com/moby/term/go.mod +++ b/vendor/github.com/moby/term/go.mod @@ -4,10 +4,9 @@ go 1.13 require ( github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 - github.com/google/go-cmp v0.3.1 + github.com/creack/pty v1.1.11 + github.com/google/go-cmp v0.4.0 github.com/pkg/errors v0.9.1 // indirect - github.com/sirupsen/logrus v1.4.2 - golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527 - gotest.tools v2.2.0+incompatible - gotest.tools/v3 v3.0.2 // indirect + golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a + gotest.tools/v3 v3.0.2 ) diff --git a/vendor/github.com/moby/term/go.sum b/vendor/github.com/moby/term/go.sum index 413bf366683c..441e06137acd 100644 --- a/vendor/github.com/moby/term/go.sum +++ b/vendor/github.com/moby/term/go.sum @@ -1,33 +1,23 @@ github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7OZ575w+acHgRric5iCyQh+xv+KJ4HB8= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= +github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= +github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527 h1:uYVVQ9WP/Ds2ROhcaGPeIdVq0RIXVLwsHlnvJ+cT1So= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a h1:i47hUS795cOydZI4AwJQCKXOr4BvxzvikwDoDtHhP2Y= +golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gotest.tools/v3 v3.0.2 h1:kG1BFyqVHuQoVQiR1bWGnfz/fmHvvuiSPIV7rvl360E= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= diff --git a/vendor/github.com/moby/term/proxy.go b/vendor/github.com/moby/term/proxy.go index 9573222f9fa4..c47756b89a9c 100644 --- a/vendor/github.com/moby/term/proxy.go +++ b/vendor/github.com/moby/term/proxy.go @@ -1,4 +1,4 @@ -package term // import "github.com/moby/term" +package term import ( "io" @@ -19,6 +19,7 @@ type escapeProxy struct { escapeKeys []byte escapeKeyPos int r io.Reader + buf []byte } // NewEscapeProxy returns a new TTY proxy reader which wraps the given reader @@ -31,48 +32,57 @@ func NewEscapeProxy(r io.Reader, escapeKeys []byte) io.Reader { } } -func (r *escapeProxy) Read(buf []byte) (int, error) { - nr, err := r.r.Read(buf) +func (r *escapeProxy) Read(buf []byte) (n int, err error) { + if len(r.escapeKeys) > 0 && r.escapeKeyPos == len(r.escapeKeys) { + return 0, EscapeError{} + } - if len(r.escapeKeys) == 0 { - return nr, err + if len(r.buf) > 0 { + n = copy(buf, r.buf) + r.buf = r.buf[n:] } - preserve := func() { - // this preserves the original key presses in the passed in buffer - nr += r.escapeKeyPos - preserve := make([]byte, 0, r.escapeKeyPos+len(buf)) - preserve = append(preserve, r.escapeKeys[:r.escapeKeyPos]...) - preserve = append(preserve, buf...) - r.escapeKeyPos = 0 - copy(buf[0:nr], preserve) + nr, err := r.r.Read(buf[n:]) + n += nr + if len(r.escapeKeys) == 0 { + return n, err } - if nr != 1 || err != nil { - if r.escapeKeyPos > 0 { - preserve() + for i := 0; i < n; i++ { + if buf[i] == r.escapeKeys[r.escapeKeyPos] { + r.escapeKeyPos++ + + // Check if the full escape sequence is matched. + if r.escapeKeyPos == len(r.escapeKeys) { + n = i + 1 - r.escapeKeyPos + if n < 0 { + n = 0 + } + return n, EscapeError{} + } + continue } - return nr, err - } - if buf[0] != r.escapeKeys[r.escapeKeyPos] { - if r.escapeKeyPos > 0 { - preserve() + // If we need to prepend a partial escape sequence from the previous + // read, make sure the new buffer size doesn't exceed len(buf). + // Otherwise, preserve any extra data in a buffer for the next read. + if i < r.escapeKeyPos { + preserve := make([]byte, 0, r.escapeKeyPos+n) + preserve = append(preserve, r.escapeKeys[:r.escapeKeyPos]...) + preserve = append(preserve, buf[:n]...) + n = copy(buf, preserve) + i += r.escapeKeyPos + r.buf = append(r.buf, preserve[n:]...) } - return nr, nil + r.escapeKeyPos = 0 } - if r.escapeKeyPos == len(r.escapeKeys)-1 { - return 0, EscapeError{} + // If we're in the middle of reading an escape sequence, make sure we don't + // let the caller read it. If later on we find that this is not the escape + // sequence, we'll prepend it back to buf. + n -= r.escapeKeyPos + if n < 0 { + n = 0 } - - // Looks like we've got an escape key, but we need to match again on the next - // read. - // Store the current escape key we found so we can look for the next one on - // the next read. - // Since this is an escape key, make sure we don't let the caller read it - // If later on we find that this is not the escape sequence, we'll add the - // keys back - r.escapeKeyPos++ - return nr - r.escapeKeyPos, nil + return n, err } diff --git a/vendor/github.com/moby/term/tc.go b/vendor/github.com/moby/term/tc.go index 162dfb2b2f5c..65556027a6d3 100644 --- a/vendor/github.com/moby/term/tc.go +++ b/vendor/github.com/moby/term/tc.go @@ -1,20 +1,19 @@ // +build !windows -package term // import "github.com/moby/term" +package term import ( - "syscall" - "unsafe" - "golang.org/x/sys/unix" ) -func tcget(fd uintptr, p *Termios) syscall.Errno { - _, _, err := unix.Syscall(unix.SYS_IOCTL, fd, uintptr(getTermios), uintptr(unsafe.Pointer(p))) - return err +func tcget(fd uintptr) (*Termios, error) { + p, err := unix.IoctlGetTermios(int(fd), getTermios) + if err != nil { + return nil, err + } + return p, nil } -func tcset(fd uintptr, p *Termios) syscall.Errno { - _, _, err := unix.Syscall(unix.SYS_IOCTL, fd, setTermios, uintptr(unsafe.Pointer(p))) - return err +func tcset(fd uintptr, p *Termios) error { + return unix.IoctlSetTermios(int(fd), setTermios, p) } diff --git a/vendor/github.com/moby/term/term.go b/vendor/github.com/moby/term/term.go index 6d643516f395..29c6acf1c7ef 100644 --- a/vendor/github.com/moby/term/term.go +++ b/vendor/github.com/moby/term/term.go @@ -2,7 +2,7 @@ // Package term provides structures and helper functions to work with // terminal (state, sizes). -package term // import "github.com/moby/term" +package term import ( "errors" @@ -50,8 +50,8 @@ func GetFdInfo(in interface{}) (uintptr, bool) { // IsTerminal returns true if the given file descriptor is a terminal. func IsTerminal(fd uintptr) bool { - var termios Termios - return tcget(fd, &termios) == 0 + _, err := tcget(fd) + return err == nil } // RestoreTerminal restores the terminal connected to the given file descriptor @@ -60,20 +60,16 @@ func RestoreTerminal(fd uintptr, state *State) error { if state == nil { return ErrInvalidState } - if err := tcset(fd, &state.termios); err != 0 { - return err - } - return nil + return tcset(fd, &state.termios) } // SaveState saves the state of the terminal connected to the given file descriptor. func SaveState(fd uintptr) (*State, error) { - var oldState State - if err := tcget(fd, &oldState.termios); err != 0 { + termios, err := tcget(fd) + if err != nil { return nil, err } - - return &oldState, nil + return &State{termios: *termios}, nil } // DisableEcho applies the specified state to the terminal connected to the file @@ -82,7 +78,7 @@ func DisableEcho(fd uintptr, state *State) error { newState := state.termios newState.Lflag &^= unix.ECHO - if err := tcset(fd, &newState); err != 0 { + if err := tcset(fd, &newState); err != nil { return err } handleInterrupt(fd, state) diff --git a/vendor/github.com/moby/term/term_windows.go b/vendor/github.com/moby/term/term_windows.go index 1649c2306472..ba82960d4a6d 100644 --- a/vendor/github.com/moby/term/term_windows.go +++ b/vendor/github.com/moby/term/term_windows.go @@ -1,13 +1,12 @@ -package term // import "github.com/moby/term" +package term import ( "io" "os" "os/signal" - "syscall" // used for STD_INPUT_HANDLE, STD_OUTPUT_HANDLE and STD_ERROR_HANDLE - "github.com/Azure/go-ansiterm/winterm" windowsconsole "github.com/moby/term/windows" + "golang.org/x/sys/windows" ) // State holds the console mode for the terminal. @@ -28,37 +27,42 @@ var vtInputSupported bool func StdStreams() (stdIn io.ReadCloser, stdOut, stdErr io.Writer) { // Turn on VT handling on all std handles, if possible. This might // fail, in which case we will fall back to terminal emulation. - var emulateStdin, emulateStdout, emulateStderr bool - fd := os.Stdin.Fd() - if mode, err := winterm.GetConsoleMode(fd); err == nil { + var ( + emulateStdin, emulateStdout, emulateStderr bool + + mode uint32 + ) + + fd := windows.Handle(os.Stdin.Fd()) + if err := windows.GetConsoleMode(fd, &mode); err == nil { // Validate that winterm.ENABLE_VIRTUAL_TERMINAL_INPUT is supported, but do not set it. - if err = winterm.SetConsoleMode(fd, mode|winterm.ENABLE_VIRTUAL_TERMINAL_INPUT); err != nil { + if err = windows.SetConsoleMode(fd, mode|windows.ENABLE_VIRTUAL_TERMINAL_INPUT); err != nil { emulateStdin = true } else { vtInputSupported = true } // Unconditionally set the console mode back even on failure because SetConsoleMode // remembers invalid bits on input handles. - winterm.SetConsoleMode(fd, mode) + _ = windows.SetConsoleMode(fd, mode) } - fd = os.Stdout.Fd() - if mode, err := winterm.GetConsoleMode(fd); err == nil { + fd = windows.Handle(os.Stdout.Fd()) + if err := windows.GetConsoleMode(fd, &mode); err == nil { // Validate winterm.DISABLE_NEWLINE_AUTO_RETURN is supported, but do not set it. - if err = winterm.SetConsoleMode(fd, mode|winterm.ENABLE_VIRTUAL_TERMINAL_PROCESSING|winterm.DISABLE_NEWLINE_AUTO_RETURN); err != nil { + if err = windows.SetConsoleMode(fd, mode|windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING|windows.DISABLE_NEWLINE_AUTO_RETURN); err != nil { emulateStdout = true } else { - winterm.SetConsoleMode(fd, mode|winterm.ENABLE_VIRTUAL_TERMINAL_PROCESSING) + _ = windows.SetConsoleMode(fd, mode|windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING) } } - fd = os.Stderr.Fd() - if mode, err := winterm.GetConsoleMode(fd); err == nil { + fd = windows.Handle(os.Stderr.Fd()) + if err := windows.GetConsoleMode(fd, &mode); err == nil { // Validate winterm.DISABLE_NEWLINE_AUTO_RETURN is supported, but do not set it. - if err = winterm.SetConsoleMode(fd, mode|winterm.ENABLE_VIRTUAL_TERMINAL_PROCESSING|winterm.DISABLE_NEWLINE_AUTO_RETURN); err != nil { + if err = windows.SetConsoleMode(fd, mode|windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING|windows.DISABLE_NEWLINE_AUTO_RETURN); err != nil { emulateStderr = true } else { - winterm.SetConsoleMode(fd, mode|winterm.ENABLE_VIRTUAL_TERMINAL_PROCESSING) + _ = windows.SetConsoleMode(fd, mode|windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING) } } @@ -67,19 +71,22 @@ func StdStreams() (stdIn io.ReadCloser, stdOut, stdErr io.Writer) { // go-ansiterm hasn't switch to x/sys/windows. // TODO: switch back to x/sys/windows once go-ansiterm has switched if emulateStdin { - stdIn = windowsconsole.NewAnsiReader(syscall.STD_INPUT_HANDLE) + h := uint32(windows.STD_INPUT_HANDLE) + stdIn = windowsconsole.NewAnsiReader(int(h)) } else { stdIn = os.Stdin } if emulateStdout { - stdOut = windowsconsole.NewAnsiWriter(syscall.STD_OUTPUT_HANDLE) + h := uint32(windows.STD_OUTPUT_HANDLE) + stdOut = windowsconsole.NewAnsiWriter(int(h)) } else { stdOut = os.Stdout } if emulateStderr { - stdErr = windowsconsole.NewAnsiWriter(syscall.STD_ERROR_HANDLE) + h := uint32(windows.STD_ERROR_HANDLE) + stdErr = windowsconsole.NewAnsiWriter(int(h)) } else { stdErr = os.Stderr } @@ -94,8 +101,8 @@ func GetFdInfo(in interface{}) (uintptr, bool) { // GetWinsize returns the window size based on the specified file descriptor. func GetWinsize(fd uintptr) (*Winsize, error) { - info, err := winterm.GetConsoleScreenBufferInfo(fd) - if err != nil { + var info windows.ConsoleScreenBufferInfo + if err := windows.GetConsoleScreenBufferInfo(windows.Handle(fd), &info); err != nil { return nil, err } @@ -109,20 +116,23 @@ func GetWinsize(fd uintptr) (*Winsize, error) { // IsTerminal returns true if the given file descriptor is a terminal. func IsTerminal(fd uintptr) bool { - return windowsconsole.IsConsole(fd) + var mode uint32 + err := windows.GetConsoleMode(windows.Handle(fd), &mode) + return err == nil } // RestoreTerminal restores the terminal connected to the given file descriptor // to a previous state. func RestoreTerminal(fd uintptr, state *State) error { - return winterm.SetConsoleMode(fd, state.mode) + return windows.SetConsoleMode(windows.Handle(fd), state.mode) } // SaveState saves the state of the terminal connected to the given file descriptor. func SaveState(fd uintptr) (*State, error) { - mode, e := winterm.GetConsoleMode(fd) - if e != nil { - return nil, e + var mode uint32 + + if err := windows.GetConsoleMode(windows.Handle(fd), &mode); err != nil { + return nil, err } return &State{mode: mode}, nil @@ -132,9 +142,9 @@ func SaveState(fd uintptr) (*State, error) { // -- See https://msdn.microsoft.com/en-us/library/windows/desktop/ms683462(v=vs.85).aspx func DisableEcho(fd uintptr, state *State) error { mode := state.mode - mode &^= winterm.ENABLE_ECHO_INPUT - mode |= winterm.ENABLE_PROCESSED_INPUT | winterm.ENABLE_LINE_INPUT - err := winterm.SetConsoleMode(fd, mode) + mode &^= windows.ENABLE_ECHO_INPUT + mode |= windows.ENABLE_PROCESSED_INPUT | windows.ENABLE_LINE_INPUT + err := windows.SetConsoleMode(windows.Handle(fd), mode) if err != nil { return err } @@ -169,7 +179,7 @@ func SetRawTerminalOutput(fd uintptr) (*State, error) { // Ignore failures, since winterm.DISABLE_NEWLINE_AUTO_RETURN might not be supported on this // version of Windows. - winterm.SetConsoleMode(fd, state.mode|winterm.DISABLE_NEWLINE_AUTO_RETURN) + _ = windows.SetConsoleMode(windows.Handle(fd), state.mode|windows.DISABLE_NEWLINE_AUTO_RETURN) return state, err } @@ -188,21 +198,21 @@ func MakeRaw(fd uintptr) (*State, error) { // -- https://msdn.microsoft.com/en-us/library/windows/desktop/ms683462(v=vs.85).aspx // Disable these modes - mode &^= winterm.ENABLE_ECHO_INPUT - mode &^= winterm.ENABLE_LINE_INPUT - mode &^= winterm.ENABLE_MOUSE_INPUT - mode &^= winterm.ENABLE_WINDOW_INPUT - mode &^= winterm.ENABLE_PROCESSED_INPUT + mode &^= windows.ENABLE_ECHO_INPUT + mode &^= windows.ENABLE_LINE_INPUT + mode &^= windows.ENABLE_MOUSE_INPUT + mode &^= windows.ENABLE_WINDOW_INPUT + mode &^= windows.ENABLE_PROCESSED_INPUT // Enable these modes - mode |= winterm.ENABLE_EXTENDED_FLAGS - mode |= winterm.ENABLE_INSERT_MODE - mode |= winterm.ENABLE_QUICK_EDIT_MODE + mode |= windows.ENABLE_EXTENDED_FLAGS + mode |= windows.ENABLE_INSERT_MODE + mode |= windows.ENABLE_QUICK_EDIT_MODE if vtInputSupported { - mode |= winterm.ENABLE_VIRTUAL_TERMINAL_INPUT + mode |= windows.ENABLE_VIRTUAL_TERMINAL_INPUT } - err = winterm.SetConsoleMode(fd, mode) + err = windows.SetConsoleMode(windows.Handle(fd), mode) if err != nil { return nil, err } @@ -215,7 +225,7 @@ func restoreAtInterrupt(fd uintptr, state *State) { go func() { _ = <-sigchan - RestoreTerminal(fd, state) + _ = RestoreTerminal(fd, state) os.Exit(0) }() } diff --git a/vendor/github.com/moby/term/termios.go b/vendor/github.com/moby/term/termios.go new file mode 100644 index 000000000000..0f028e2273ac --- /dev/null +++ b/vendor/github.com/moby/term/termios.go @@ -0,0 +1,35 @@ +// +build !windows + +package term + +import ( + "golang.org/x/sys/unix" +) + +// Termios is the Unix API for terminal I/O. +type Termios = unix.Termios + +// MakeRaw puts the terminal connected to the given file descriptor into raw +// mode and returns the previous state of the terminal so that it can be +// restored. +func MakeRaw(fd uintptr) (*State, error) { + termios, err := tcget(fd) + if err != nil { + return nil, err + } + + oldState := State{termios: *termios} + + termios.Iflag &^= (unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP | unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON) + termios.Oflag &^= unix.OPOST + termios.Lflag &^= (unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN) + termios.Cflag &^= (unix.CSIZE | unix.PARENB) + termios.Cflag |= unix.CS8 + termios.Cc[unix.VMIN] = 1 + termios.Cc[unix.VTIME] = 0 + + if err := tcset(fd, termios); err != nil { + return nil, err + } + return &oldState, nil +} diff --git a/vendor/github.com/moby/term/termios_bsd.go b/vendor/github.com/moby/term/termios_bsd.go index da7851066574..922dd4baab04 100644 --- a/vendor/github.com/moby/term/termios_bsd.go +++ b/vendor/github.com/moby/term/termios_bsd.go @@ -1,10 +1,8 @@ // +build darwin freebsd openbsd netbsd -package term // import "github.com/moby/term" +package term import ( - "unsafe" - "golang.org/x/sys/unix" ) @@ -12,31 +10,3 @@ const ( getTermios = unix.TIOCGETA setTermios = unix.TIOCSETA ) - -// Termios is the Unix API for terminal I/O. -type Termios unix.Termios - -// MakeRaw put the terminal connected to the given file descriptor into raw -// mode and returns the previous state of the terminal so that it can be -// restored. -func MakeRaw(fd uintptr) (*State, error) { - var oldState State - if _, _, err := unix.Syscall(unix.SYS_IOCTL, fd, getTermios, uintptr(unsafe.Pointer(&oldState.termios))); err != 0 { - return nil, err - } - - newState := oldState.termios - newState.Iflag &^= (unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP | unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON) - newState.Oflag &^= unix.OPOST - newState.Lflag &^= (unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN) - newState.Cflag &^= (unix.CSIZE | unix.PARENB) - newState.Cflag |= unix.CS8 - newState.Cc[unix.VMIN] = 1 - newState.Cc[unix.VTIME] = 0 - - if _, _, err := unix.Syscall(unix.SYS_IOCTL, fd, setTermios, uintptr(unsafe.Pointer(&newState))); err != 0 { - return nil, err - } - - return &oldState, nil -} diff --git a/vendor/github.com/moby/term/termios_linux.go b/vendor/github.com/moby/term/termios_linux.go deleted file mode 100644 index be39ff56cc0e..000000000000 --- a/vendor/github.com/moby/term/termios_linux.go +++ /dev/null @@ -1,39 +0,0 @@ -package term // import "github.com/moby/term" - -import ( - "golang.org/x/sys/unix" -) - -const ( - getTermios = unix.TCGETS - setTermios = unix.TCSETS -) - -// Termios is the Unix API for terminal I/O. -type Termios unix.Termios - -// MakeRaw put the terminal connected to the given file descriptor into raw -// mode and returns the previous state of the terminal so that it can be -// restored. -func MakeRaw(fd uintptr) (*State, error) { - termios, err := unix.IoctlGetTermios(int(fd), getTermios) - if err != nil { - return nil, err - } - - var oldState State - oldState.termios = Termios(*termios) - - termios.Iflag &^= (unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP | unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON) - termios.Oflag &^= unix.OPOST - termios.Lflag &^= (unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN) - termios.Cflag &^= (unix.CSIZE | unix.PARENB) - termios.Cflag |= unix.CS8 - termios.Cc[unix.VMIN] = 1 - termios.Cc[unix.VTIME] = 0 - - if err := unix.IoctlSetTermios(int(fd), setTermios, termios); err != nil { - return nil, err - } - return &oldState, nil -} diff --git a/vendor/github.com/moby/term/termios_nonbsd.go b/vendor/github.com/moby/term/termios_nonbsd.go new file mode 100644 index 000000000000..038fd61ba1eb --- /dev/null +++ b/vendor/github.com/moby/term/termios_nonbsd.go @@ -0,0 +1,12 @@ +//+build !darwin,!freebsd,!netbsd,!openbsd,!windows + +package term + +import ( + "golang.org/x/sys/unix" +) + +const ( + getTermios = unix.TCGETS + setTermios = unix.TCSETS +) diff --git a/vendor/github.com/moby/term/windows/ansi_reader.go b/vendor/github.com/moby/term/windows/ansi_reader.go index 5114b63ebf16..155251521b09 100644 --- a/vendor/github.com/moby/term/windows/ansi_reader.go +++ b/vendor/github.com/moby/term/windows/ansi_reader.go @@ -1,6 +1,6 @@ // +build windows -package windowsconsole // import "github.com/moby/term/windows" +package windowsconsole import ( "bytes" @@ -31,7 +31,6 @@ type ansiReader struct { // NewAnsiReader returns an io.ReadCloser that provides VT100 terminal emulation on top of a // Windows console input handle. func NewAnsiReader(nFile int) io.ReadCloser { - initLogger() file, fd := winterm.GetStdFile(nFile) return &ansiReader{ file: file, @@ -59,8 +58,6 @@ func (ar *ansiReader) Read(p []byte) (int, error) { // Previously read bytes exist, read as much as we can and return if len(ar.buffer) > 0 { - logger.Debugf("Reading previously cached bytes") - originalLength := len(ar.buffer) copiedLength := copy(p, ar.buffer) @@ -70,16 +67,14 @@ func (ar *ansiReader) Read(p []byte) (int, error) { ar.buffer = ar.buffer[copiedLength:] } - logger.Debugf("Read from cache p[%d]: % x", copiedLength, p) return copiedLength, nil } // Read and translate key events - events, err := readInputEvents(ar.fd, len(p)) + events, err := readInputEvents(ar, len(p)) if err != nil { return 0, err } else if len(events) == 0 { - logger.Debug("No input events detected") return 0, nil } @@ -87,11 +82,9 @@ func (ar *ansiReader) Read(p []byte) (int, error) { // Save excess bytes and right-size keyBytes if len(keyBytes) > len(p) { - logger.Debugf("Received %d keyBytes, only room for %d bytes", len(keyBytes), len(p)) ar.buffer = keyBytes[len(p):] keyBytes = keyBytes[:len(p)] } else if len(keyBytes) == 0 { - logger.Debug("No key bytes returned from the translator") return 0, nil } @@ -100,13 +93,11 @@ func (ar *ansiReader) Read(p []byte) (int, error) { return 0, errors.New("unexpected copy length encountered") } - logger.Debugf("Read p[%d]: % x", copiedLength, p) - logger.Debugf("Read keyBytes[%d]: % x", copiedLength, keyBytes) return copiedLength, nil } // readInputEvents polls until at least one event is available. -func readInputEvents(fd uintptr, maxBytes int) ([]winterm.INPUT_RECORD, error) { +func readInputEvents(ar *ansiReader, maxBytes int) ([]winterm.INPUT_RECORD, error) { // Determine the maximum number of records to retrieve // -- Cast around the type system to obtain the size of a single INPUT_RECORD. // unsafe.Sizeof requires an expression vs. a type-reference; the casting @@ -118,25 +109,23 @@ func readInputEvents(fd uintptr, maxBytes int) ([]winterm.INPUT_RECORD, error) { } else if countRecords == 0 { countRecords = 1 } - logger.Debugf("[windows] readInputEvents: Reading %v records (buffer size %v, record size %v)", countRecords, maxBytes, recordSize) // Wait for and read input events events := make([]winterm.INPUT_RECORD, countRecords) nEvents := uint32(0) - eventsExist, err := winterm.WaitForSingleObject(fd, winterm.WAIT_INFINITE) + eventsExist, err := winterm.WaitForSingleObject(ar.fd, winterm.WAIT_INFINITE) if err != nil { return nil, err } if eventsExist { - err = winterm.ReadConsoleInput(fd, events, &nEvents) + err = winterm.ReadConsoleInput(ar.fd, events, &nEvents) if err != nil { return nil, err } } // Return a slice restricted to the number of returned records - logger.Debugf("[windows] readInputEvents: Read %v events", nEvents) return events[:nEvents], nil } diff --git a/vendor/github.com/moby/term/windows/ansi_writer.go b/vendor/github.com/moby/term/windows/ansi_writer.go index 51bf9aa48cf4..ccb5ef07757f 100644 --- a/vendor/github.com/moby/term/windows/ansi_writer.go +++ b/vendor/github.com/moby/term/windows/ansi_writer.go @@ -1,6 +1,6 @@ // +build windows -package windowsconsole // import "github.com/moby/term/windows" +package windowsconsole import ( "io" @@ -24,7 +24,6 @@ type ansiWriter struct { // NewAnsiWriter returns an io.Writer that provides VT100 terminal emulation on top of a // Windows console output handle. func NewAnsiWriter(nFile int) io.Writer { - initLogger() file, fd := winterm.GetStdFile(nFile) info, err := winterm.GetConsoleScreenBufferInfo(fd) if err != nil { @@ -32,9 +31,8 @@ func NewAnsiWriter(nFile int) io.Writer { } parser := ansiterm.CreateParser("Ground", winterm.CreateWinEventHandler(fd, file)) - logger.Infof("newAnsiWriter: parser %p", parser) - aw := &ansiWriter{ + return &ansiWriter{ file: file, fd: fd, infoReset: info, @@ -42,10 +40,6 @@ func NewAnsiWriter(nFile int) io.Writer { escapeSequence: []byte(ansiterm.KEY_ESC_CSI), parser: parser, } - - logger.Infof("newAnsiWriter: aw.parser %p", aw.parser) - logger.Infof("newAnsiWriter: %v", aw) - return aw } func (aw *ansiWriter) Fd() uintptr { @@ -58,7 +52,5 @@ func (aw *ansiWriter) Write(p []byte) (total int, err error) { return 0, nil } - logger.Infof("Write: % x", p) - logger.Infof("Write: %s", string(p)) return aw.parser.Parse(p) } diff --git a/vendor/github.com/moby/term/windows/console.go b/vendor/github.com/moby/term/windows/console.go index 54e0fe839fc0..993694ddcd99 100644 --- a/vendor/github.com/moby/term/windows/console.go +++ b/vendor/github.com/moby/term/windows/console.go @@ -1,11 +1,11 @@ // +build windows -package windowsconsole // import "github.com/moby/term/windows" +package windowsconsole import ( "os" - "github.com/Azure/go-ansiterm/winterm" + "golang.org/x/sys/windows" ) // GetHandleInfo returns file descriptor and bool indicating whether the file is a console. @@ -22,14 +22,18 @@ func GetHandleInfo(in interface{}) (uintptr, bool) { if file, ok := in.(*os.File); ok { inFd = file.Fd() - isTerminal = IsConsole(inFd) + isTerminal = isConsole(inFd) } return inFd, isTerminal } // IsConsole returns true if the given file descriptor is a Windows Console. // The code assumes that GetConsoleMode will return an error for file descriptors that are not a console. -func IsConsole(fd uintptr) bool { - _, e := winterm.GetConsoleMode(fd) - return e == nil +// Deprecated: use golang.org/x/sys/windows.GetConsoleMode() or golang.org/x/term.IsTerminal() +var IsConsole = isConsole + +func isConsole(fd uintptr) bool { + var mode uint32 + err := windows.GetConsoleMode(windows.Handle(fd), &mode) + return err == nil } diff --git a/vendor/github.com/moby/term/windows/doc.go b/vendor/github.com/moby/term/windows/doc.go new file mode 100644 index 000000000000..54265fffaffd --- /dev/null +++ b/vendor/github.com/moby/term/windows/doc.go @@ -0,0 +1,5 @@ +// These files implement ANSI-aware input and output streams for use by the Docker Windows client. +// When asked for the set of standard streams (e.g., stdin, stdout, stderr), the code will create +// and return pseudo-streams that convert ANSI sequences to / from Windows Console API calls. + +package windowsconsole diff --git a/vendor/github.com/moby/term/windows/windows.go b/vendor/github.com/moby/term/windows/windows.go deleted file mode 100644 index bb03e0601816..000000000000 --- a/vendor/github.com/moby/term/windows/windows.go +++ /dev/null @@ -1,34 +0,0 @@ -// +build windows -// These files implement ANSI-aware input and output streams for use by the Docker Windows client. -// When asked for the set of standard streams (e.g., stdin, stdout, stderr), the code will create -// and return pseudo-streams that convert ANSI sequences to / from Windows Console API calls. - -package windowsconsole // import "github.com/moby/term/windows" - -import ( - "io/ioutil" - "os" - "sync" - - ansiterm "github.com/Azure/go-ansiterm" - "github.com/sirupsen/logrus" -) - -var logger *logrus.Logger -var initOnce sync.Once - -func initLogger() { - initOnce.Do(func() { - logFile := ioutil.Discard - - if isDebugEnv := os.Getenv(ansiterm.LogEnv); isDebugEnv == "1" { - logFile, _ = os.Create("ansiReaderWriter.log") - } - - logger = &logrus.Logger{ - Out: logFile, - Formatter: new(logrus.TextFormatter), - Level: logrus.DebugLevel, - } - }) -} diff --git a/vendor/github.com/moby/term/winsize.go b/vendor/github.com/moby/term/winsize.go index 29a0463dc469..1ef98d59961e 100644 --- a/vendor/github.com/moby/term/winsize.go +++ b/vendor/github.com/moby/term/winsize.go @@ -1,6 +1,6 @@ // +build !windows -package term // import "github.com/moby/term" +package term import ( "golang.org/x/sys/unix" diff --git a/vendor/github.com/monochromegane/go-gitignore/.travis.yml b/vendor/github.com/monochromegane/go-gitignore/.travis.yml new file mode 100644 index 000000000000..b06a36a466ec --- /dev/null +++ b/vendor/github.com/monochromegane/go-gitignore/.travis.yml @@ -0,0 +1,6 @@ +language: go +go: + - 1.14.x + - master +script: + - go test -v ./... diff --git a/vendor/github.com/monochromegane/go-gitignore/LICENSE b/vendor/github.com/monochromegane/go-gitignore/LICENSE new file mode 100644 index 000000000000..91b84e92778d --- /dev/null +++ b/vendor/github.com/monochromegane/go-gitignore/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) [2015] [go-gitignore] + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/monochromegane/go-gitignore/README.md b/vendor/github.com/monochromegane/go-gitignore/README.md new file mode 100644 index 000000000000..51a480747b04 --- /dev/null +++ b/vendor/github.com/monochromegane/go-gitignore/README.md @@ -0,0 +1,95 @@ +# go-gitignore [![Build Status](https://travis-ci.org/monochromegane/go-gitignore.svg)](https://travis-ci.org/monochromegane/go-gitignore) + +A fast gitignore matching library for Go. + +This library use simple tree index for matching, so keep fast if gitignore file has many pattern. + +## Usage + +```go +gitignore, _ := gitignore.NewGitIgnore("/path/to/gitignore") + +path := "/path/to/file" +isDir := false +gitignore.Match(path, isDir) +``` + +### Specify base directory + +go-gitignore treat `path` as a base directory. +If you want to specify other base (e.g. current directory and Global gitignore), you can like the following. + +```go +gitignore, _ := gitignore.NewGitIgnore("/home/you/.gitignore", ".") +``` + +### From io.Reader + +go-gitignore can initialize from io.Reader. + +```go +gitignore, _ := gitignore.NewGitIgnoreFromReader(base, reader) +``` + +## Simple tree index + +go-gitignore parse gitignore file, and generate a simple tree index for matching like the following. + +``` +. +├── accept +│   ├── absolute +│   │   └── depth +│   │   ├── initial +│   │   └── other +│   └── relative +│   └── depth +│   ├── initial +│   └── other +└── ignore + ├── absolute + │   └── depth + │   ├── initial + │   └── other + └── relative + └── depth + ├── initial + └── other +``` + +## Features + +- Support absolute path (/path/to/ignore) +- Support relative path (path/to/ignore) +- Support accept pattern (!path/to/accept) +- Support directory pattern (path/to/directory/) +- Support glob pattern (path/to/\*.txt) + +*note: glob pattern* + +go-gitignore use [filepath.Match](https://golang.org/pkg/path/filepath/#Match) for matching meta char pattern, so not support recursive pattern (path/`**`/file). + +## Installation + +```sh +$ go get github.com/monochromegane/go-gitignore +``` + +## Contribution + +1. Fork it +2. Create a feature branch +3. Commit your changes +4. Rebase your local changes against the master branch +5. Run test suite with the `go test ./...` command and confirm that it passes +6. Run `gofmt -s` +7. Create new Pull Request + +## License + +[MIT](https://github.com/monochromegane/go-gitignore/blob/master/LICENSE) + +## Author + +[monochromegane](https://github.com/monochromegane) + diff --git a/vendor/github.com/monochromegane/go-gitignore/depth_holder.go b/vendor/github.com/monochromegane/go-gitignore/depth_holder.go new file mode 100644 index 000000000000..9805b325d419 --- /dev/null +++ b/vendor/github.com/monochromegane/go-gitignore/depth_holder.go @@ -0,0 +1,79 @@ +package gitignore + +import "strings" + +const ( + asc = iota + desc +) + +type depthPatternHolder struct { + patterns depthPatterns + order int +} + +func newDepthPatternHolder(order int) depthPatternHolder { + return depthPatternHolder{ + patterns: depthPatterns{m: map[int]initialPatternHolder{}}, + order: order, + } +} + +func (h *depthPatternHolder) add(pattern string) { + count := strings.Count(strings.Trim(pattern, "/"), "/") + h.patterns.set(count+1, pattern) +} + +func (h depthPatternHolder) match(path string, isDir bool) bool { + if h.patterns.size() == 0 { + return false + } + + for depth := 1; ; depth++ { + var part string + var isLast, isDirCurrent bool + if h.order == asc { + part, isLast = cutN(path, depth) + if isLast { + isDirCurrent = isDir + } else { + isDirCurrent = false + } + } else { + part, isLast = cutLastN(path, depth) + isDirCurrent = isDir + } + if patterns, ok := h.patterns.get(depth); ok { + if patterns.match(part, isDirCurrent) { + return true + } + } + if isLast { + break + } + } + return false +} + +type depthPatterns struct { + m map[int]initialPatternHolder +} + +func (p *depthPatterns) set(depth int, pattern string) { + if ps, ok := p.m[depth]; ok { + ps.add(pattern) + } else { + holder := newInitialPatternHolder() + holder.add(pattern) + p.m[depth] = holder + } +} + +func (p depthPatterns) get(depth int) (initialPatternHolder, bool) { + patterns, ok := p.m[depth] + return patterns, ok +} + +func (p depthPatterns) size() int { + return len(p.m) +} diff --git a/vendor/github.com/monochromegane/go-gitignore/full_scan_patterns.go b/vendor/github.com/monochromegane/go-gitignore/full_scan_patterns.go new file mode 100644 index 000000000000..8c04ef3a77d9 --- /dev/null +++ b/vendor/github.com/monochromegane/go-gitignore/full_scan_patterns.go @@ -0,0 +1,31 @@ +package gitignore + +import "strings" + +// Only benchmark use +type fullScanPatterns struct { + absolute patterns + relative patterns +} + +func newFullScanPatterns() *fullScanPatterns { + return &fullScanPatterns{ + absolute: patterns{}, + relative: patterns{}, + } +} + +func (ps *fullScanPatterns) add(pattern string) { + if strings.HasPrefix(pattern, "/") { + ps.absolute.add(newPattern(pattern)) + } else { + ps.relative.add(newPattern(pattern)) + } +} + +func (ps fullScanPatterns) match(path string, isDir bool) bool { + if ps.absolute.match(path, isDir) { + return true + } + return ps.relative.match(path, isDir) +} diff --git a/vendor/github.com/monochromegane/go-gitignore/gitignore.go b/vendor/github.com/monochromegane/go-gitignore/gitignore.go new file mode 100644 index 000000000000..9c719a6caba7 --- /dev/null +++ b/vendor/github.com/monochromegane/go-gitignore/gitignore.go @@ -0,0 +1,80 @@ +package gitignore + +import ( + "bufio" + "io" + "os" + "path/filepath" + "strings" +) + +type IgnoreMatcher interface { + Match(path string, isDir bool) bool +} + +type DummyIgnoreMatcher bool + +func (d DummyIgnoreMatcher) Match(path string, isDir bool) bool { + return bool(d) +} + +type gitIgnore struct { + ignorePatterns scanStrategy + acceptPatterns scanStrategy + path string +} + +func NewGitIgnore(gitignore string, base ...string) (IgnoreMatcher, error) { + var path string + if len(base) > 0 { + path = base[0] + } else { + path = filepath.Dir(gitignore) + } + + file, err := os.Open(gitignore) + if err != nil { + return nil, err + } + defer file.Close() + + return NewGitIgnoreFromReader(path, file), nil +} + +func NewGitIgnoreFromReader(path string, r io.Reader) IgnoreMatcher { + g := gitIgnore{ + ignorePatterns: newIndexScanPatterns(), + acceptPatterns: newIndexScanPatterns(), + path: path, + } + scanner := bufio.NewScanner(r) + for scanner.Scan() { + line := strings.Trim(scanner.Text(), " ") + if len(line) == 0 || strings.HasPrefix(line, "#") { + continue + } + if strings.HasPrefix(line, `\#`) { + line = strings.TrimPrefix(line, `\`) + } + + if strings.HasPrefix(line, "!") { + g.acceptPatterns.add(strings.TrimPrefix(line, "!")) + } else { + g.ignorePatterns.add(line) + } + } + return g +} + +func (g gitIgnore) Match(path string, isDir bool) bool { + relativePath, err := filepath.Rel(g.path, path) + if err != nil { + return false + } + relativePath = filepath.ToSlash(relativePath) + + if g.acceptPatterns.match(relativePath, isDir) { + return false + } + return g.ignorePatterns.match(relativePath, isDir) +} diff --git a/vendor/github.com/monochromegane/go-gitignore/index_scan_patterns.go b/vendor/github.com/monochromegane/go-gitignore/index_scan_patterns.go new file mode 100644 index 000000000000..882280e95309 --- /dev/null +++ b/vendor/github.com/monochromegane/go-gitignore/index_scan_patterns.go @@ -0,0 +1,35 @@ +package gitignore + +import "strings" + +type indexScanPatterns struct { + absolute depthPatternHolder + relative depthPatternHolder +} + +func newIndexScanPatterns() *indexScanPatterns { + return &indexScanPatterns{ + absolute: newDepthPatternHolder(asc), + relative: newDepthPatternHolder(desc), + } +} + +func (ps *indexScanPatterns) add(pattern string) { + if strings.HasPrefix(pattern, "/") { + ps.absolute.add(pattern) + } else { + ps.relative.add(pattern) + } +} + +func (ps indexScanPatterns) match(path string, isDir bool) bool { + if ps.absolute.match(path, isDir) { + return true + } + return ps.relative.match(path, isDir) +} + +type scanStrategy interface { + add(pattern string) + match(path string, isDir bool) bool +} diff --git a/vendor/github.com/monochromegane/go-gitignore/initial_holder.go b/vendor/github.com/monochromegane/go-gitignore/initial_holder.go new file mode 100644 index 000000000000..86f0bfee2be2 --- /dev/null +++ b/vendor/github.com/monochromegane/go-gitignore/initial_holder.go @@ -0,0 +1,62 @@ +package gitignore + +import "strings" + +const initials = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ." + +type initialPatternHolder struct { + patterns initialPatterns + otherPatterns *patterns +} + +func newInitialPatternHolder() initialPatternHolder { + return initialPatternHolder{ + patterns: initialPatterns{m: map[byte]*patterns{}}, + otherPatterns: &patterns{}, + } +} + +func (h *initialPatternHolder) add(pattern string) { + trimedPattern := strings.TrimPrefix(pattern, "/") + if strings.IndexAny(trimedPattern[0:1], initials) != -1 { + h.patterns.set(trimedPattern[0], newPatternForEqualizedPath(pattern)) + } else { + h.otherPatterns.add(newPatternForEqualizedPath(pattern)) + } +} + +func (h initialPatternHolder) match(path string, isDir bool) bool { + if h.patterns.size() == 0 && h.otherPatterns.size() == 0 { + return false + } + if patterns, ok := h.patterns.get(path[0]); ok { + if patterns.match(path, isDir) { + return true + } + } + return h.otherPatterns.match(path, isDir) +} + +type initialPatterns struct { + m map[byte]*patterns +} + +func (p *initialPatterns) set(initial byte, pattern pattern) { + if ps, ok := p.m[initial]; ok { + ps.add(pattern) + } else { + patterns := &patterns{} + patterns.add(pattern) + p.m[initial] = patterns + + } +} + +func (p initialPatterns) get(initial byte) (*patterns, bool) { + patterns, ok := p.m[initial] + return patterns, ok +} + +func (p initialPatterns) size() int { + return len(p.m) +} diff --git a/vendor/github.com/monochromegane/go-gitignore/match.go b/vendor/github.com/monochromegane/go-gitignore/match.go new file mode 100644 index 000000000000..4140a9bdc520 --- /dev/null +++ b/vendor/github.com/monochromegane/go-gitignore/match.go @@ -0,0 +1,24 @@ +package gitignore + +import "path/filepath" + +type pathMatcher interface { + match(path string) bool +} + +type simpleMatcher struct { + path string +} + +func (m simpleMatcher) match(path string) bool { + return m.path == path +} + +type filepathMatcher struct { + path string +} + +func (m filepathMatcher) match(path string) bool { + match, _ := filepath.Match(m.path, path) + return match +} diff --git a/vendor/github.com/monochromegane/go-gitignore/pattern.go b/vendor/github.com/monochromegane/go-gitignore/pattern.go new file mode 100644 index 000000000000..93adbf76361d --- /dev/null +++ b/vendor/github.com/monochromegane/go-gitignore/pattern.go @@ -0,0 +1,69 @@ +package gitignore + +import ( + "path/filepath" + "strings" +) + +var Separator = string(filepath.Separator) + +type pattern struct { + hasRootPrefix bool + hasDirSuffix bool + pathDepth int + matcher pathMatcher + onlyEqualizedPath bool +} + +func newPattern(path string) pattern { + hasRootPrefix := path[0] == '/' + hasDirSuffix := path[len(path)-1] == '/' + + var pathDepth int + if !hasRootPrefix { + pathDepth = strings.Count(path, "/") + } + + var matcher pathMatcher + matchingPath := strings.Trim(path, "/") + if hasMeta(path) { + matcher = filepathMatcher{path: matchingPath} + } else { + matcher = simpleMatcher{path: matchingPath} + } + + return pattern{ + hasRootPrefix: hasRootPrefix, + hasDirSuffix: hasDirSuffix, + pathDepth: pathDepth, + matcher: matcher, + } +} + +func newPatternForEqualizedPath(path string) pattern { + pattern := newPattern(path) + pattern.onlyEqualizedPath = true + return pattern +} + +func (p pattern) match(path string, isDir bool) bool { + + if p.hasDirSuffix && !isDir { + return false + } + + var targetPath string + if p.hasRootPrefix || p.onlyEqualizedPath { + // absolute pattern or only equalized path mode + targetPath = path + } else { + // relative pattern + targetPath = p.equalizeDepth(path) + } + return p.matcher.match(targetPath) +} + +func (p pattern) equalizeDepth(path string) string { + equalizedPath, _ := cutLastN(path, p.pathDepth+1) + return equalizedPath +} diff --git a/vendor/github.com/monochromegane/go-gitignore/patterns.go b/vendor/github.com/monochromegane/go-gitignore/patterns.go new file mode 100644 index 000000000000..6770fb465580 --- /dev/null +++ b/vendor/github.com/monochromegane/go-gitignore/patterns.go @@ -0,0 +1,22 @@ +package gitignore + +type patterns struct { + patterns []pattern +} + +func (ps *patterns) add(pattern pattern) { + ps.patterns = append(ps.patterns, pattern) +} + +func (ps *patterns) size() int { + return len(ps.patterns) +} + +func (ps patterns) match(path string, isDir bool) bool { + for _, p := range ps.patterns { + if match := p.match(path, isDir); match { + return true + } + } + return false +} diff --git a/vendor/github.com/monochromegane/go-gitignore/util.go b/vendor/github.com/monochromegane/go-gitignore/util.go new file mode 100644 index 000000000000..b5ab9bbfd240 --- /dev/null +++ b/vendor/github.com/monochromegane/go-gitignore/util.go @@ -0,0 +1,45 @@ +package gitignore + +import ( + "os" + "strings" +) + +func cutN(path string, n int) (string, bool) { + isLast := true + + var i, count int + for i < len(path)-1 { + if os.IsPathSeparator(path[i]) { + count++ + if count >= n { + isLast = false + break + } + } + i++ + } + return path[:i+1], isLast +} + +func cutLastN(path string, n int) (string, bool) { + isLast := true + i := len(path) - 1 + + var count int + for i >= 0 { + if os.IsPathSeparator(path[i]) { + count++ + if count >= n { + isLast = false + break + } + } + i-- + } + return path[i+1:], isLast +} + +func hasMeta(path string) bool { + return strings.IndexAny(path, "*?[") >= 0 +} diff --git a/vendor/github.com/mrunalp/fileutils/fileutils.go b/vendor/github.com/mrunalp/fileutils/fileutils.go index 136bbd9fb241..7421e6207f6b 100644 --- a/vendor/github.com/mrunalp/fileutils/fileutils.go +++ b/vendor/github.com/mrunalp/fileutils/fileutils.go @@ -22,7 +22,7 @@ func CopyFile(source string, dest string) error { uid := int(st.Uid) gid := int(st.Gid) - modeType := si.Mode()&os.ModeType + modeType := si.Mode() & os.ModeType // Handle symlinks if modeType == os.ModeSymlink { @@ -52,19 +52,7 @@ func CopyFile(source string, dest string) error { // Handle regular files if si.Mode().IsRegular() { - sf, err := os.Open(source) - if err != nil { - return err - } - defer sf.Close() - - df, err := os.Create(dest) - if err != nil { - return err - } - defer df.Close() - - _, err = io.Copy(df, sf) + err = copyInternal(source, dest) if err != nil { return err } @@ -85,6 +73,28 @@ func CopyFile(source string, dest string) error { return nil } +func copyInternal(source, dest string) (retErr error) { + sf, err := os.Open(source) + if err != nil { + return err + } + defer sf.Close() + + df, err := os.Create(dest) + if err != nil { + return err + } + defer func() { + err := df.Close() + if retErr == nil { + retErr = err + } + }() + + _, err = io.Copy(df, sf) + return err +} + // CopyDirectory copies the files under the source directory // to dest directory. The dest directory is created if it // does not exist. diff --git a/vendor/github.com/mrunalp/fileutils/go.mod b/vendor/github.com/mrunalp/fileutils/go.mod new file mode 100644 index 000000000000..d8971cabc469 --- /dev/null +++ b/vendor/github.com/mrunalp/fileutils/go.mod @@ -0,0 +1,3 @@ +module github.com/mrunalp/fileutils + +go 1.13 diff --git a/vendor/github.com/opencontainers/runc/libcontainer/README.md b/vendor/github.com/opencontainers/runc/libcontainer/README.md index 6803ef56c5ba..8b25d5c1c014 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/README.md +++ b/vendor/github.com/opencontainers/runc/libcontainer/README.md @@ -60,87 +60,87 @@ defaultMountFlags := unix.MS_NOEXEC | unix.MS_NOSUID | unix.MS_NODEV config := &configs.Config{ Rootfs: "/your/path/to/rootfs", Capabilities: &configs.Capabilities{ - Bounding: []string{ - "CAP_CHOWN", - "CAP_DAC_OVERRIDE", - "CAP_FSETID", - "CAP_FOWNER", - "CAP_MKNOD", - "CAP_NET_RAW", - "CAP_SETGID", - "CAP_SETUID", - "CAP_SETFCAP", - "CAP_SETPCAP", - "CAP_NET_BIND_SERVICE", - "CAP_SYS_CHROOT", - "CAP_KILL", - "CAP_AUDIT_WRITE", - }, - Effective: []string{ - "CAP_CHOWN", - "CAP_DAC_OVERRIDE", - "CAP_FSETID", - "CAP_FOWNER", - "CAP_MKNOD", - "CAP_NET_RAW", - "CAP_SETGID", - "CAP_SETUID", - "CAP_SETFCAP", - "CAP_SETPCAP", - "CAP_NET_BIND_SERVICE", - "CAP_SYS_CHROOT", - "CAP_KILL", - "CAP_AUDIT_WRITE", - }, - Inheritable: []string{ - "CAP_CHOWN", - "CAP_DAC_OVERRIDE", - "CAP_FSETID", - "CAP_FOWNER", - "CAP_MKNOD", - "CAP_NET_RAW", - "CAP_SETGID", - "CAP_SETUID", - "CAP_SETFCAP", - "CAP_SETPCAP", - "CAP_NET_BIND_SERVICE", - "CAP_SYS_CHROOT", - "CAP_KILL", - "CAP_AUDIT_WRITE", - }, - Permitted: []string{ - "CAP_CHOWN", - "CAP_DAC_OVERRIDE", - "CAP_FSETID", - "CAP_FOWNER", - "CAP_MKNOD", - "CAP_NET_RAW", - "CAP_SETGID", - "CAP_SETUID", - "CAP_SETFCAP", - "CAP_SETPCAP", - "CAP_NET_BIND_SERVICE", - "CAP_SYS_CHROOT", - "CAP_KILL", - "CAP_AUDIT_WRITE", - }, - Ambient: []string{ - "CAP_CHOWN", - "CAP_DAC_OVERRIDE", - "CAP_FSETID", - "CAP_FOWNER", - "CAP_MKNOD", - "CAP_NET_RAW", - "CAP_SETGID", - "CAP_SETUID", - "CAP_SETFCAP", - "CAP_SETPCAP", - "CAP_NET_BIND_SERVICE", - "CAP_SYS_CHROOT", - "CAP_KILL", - "CAP_AUDIT_WRITE", - }, - }, + Bounding: []string{ + "CAP_CHOWN", + "CAP_DAC_OVERRIDE", + "CAP_FSETID", + "CAP_FOWNER", + "CAP_MKNOD", + "CAP_NET_RAW", + "CAP_SETGID", + "CAP_SETUID", + "CAP_SETFCAP", + "CAP_SETPCAP", + "CAP_NET_BIND_SERVICE", + "CAP_SYS_CHROOT", + "CAP_KILL", + "CAP_AUDIT_WRITE", + }, + Effective: []string{ + "CAP_CHOWN", + "CAP_DAC_OVERRIDE", + "CAP_FSETID", + "CAP_FOWNER", + "CAP_MKNOD", + "CAP_NET_RAW", + "CAP_SETGID", + "CAP_SETUID", + "CAP_SETFCAP", + "CAP_SETPCAP", + "CAP_NET_BIND_SERVICE", + "CAP_SYS_CHROOT", + "CAP_KILL", + "CAP_AUDIT_WRITE", + }, + Inheritable: []string{ + "CAP_CHOWN", + "CAP_DAC_OVERRIDE", + "CAP_FSETID", + "CAP_FOWNER", + "CAP_MKNOD", + "CAP_NET_RAW", + "CAP_SETGID", + "CAP_SETUID", + "CAP_SETFCAP", + "CAP_SETPCAP", + "CAP_NET_BIND_SERVICE", + "CAP_SYS_CHROOT", + "CAP_KILL", + "CAP_AUDIT_WRITE", + }, + Permitted: []string{ + "CAP_CHOWN", + "CAP_DAC_OVERRIDE", + "CAP_FSETID", + "CAP_FOWNER", + "CAP_MKNOD", + "CAP_NET_RAW", + "CAP_SETGID", + "CAP_SETUID", + "CAP_SETFCAP", + "CAP_SETPCAP", + "CAP_NET_BIND_SERVICE", + "CAP_SYS_CHROOT", + "CAP_KILL", + "CAP_AUDIT_WRITE", + }, + Ambient: []string{ + "CAP_CHOWN", + "CAP_DAC_OVERRIDE", + "CAP_FSETID", + "CAP_FOWNER", + "CAP_MKNOD", + "CAP_NET_RAW", + "CAP_SETGID", + "CAP_SETUID", + "CAP_SETFCAP", + "CAP_SETPCAP", + "CAP_NET_BIND_SERVICE", + "CAP_SYS_CHROOT", + "CAP_KILL", + "CAP_AUDIT_WRITE", + }, + }, Namespaces: configs.Namespaces([]configs.Namespace{ {Type: configs.NEWNS}, {Type: configs.NEWUTS}, diff --git a/vendor/github.com/opencontainers/runc/libcontainer/apparmor/apparmor.go b/vendor/github.com/opencontainers/runc/libcontainer/apparmor/apparmor.go deleted file mode 100644 index debfc1e489ed..000000000000 --- a/vendor/github.com/opencontainers/runc/libcontainer/apparmor/apparmor.go +++ /dev/null @@ -1,60 +0,0 @@ -// +build apparmor,linux - -package apparmor - -import ( - "fmt" - "io/ioutil" - "os" - - "github.com/opencontainers/runc/libcontainer/utils" -) - -// IsEnabled returns true if apparmor is enabled for the host. -func IsEnabled() bool { - if _, err := os.Stat("/sys/kernel/security/apparmor"); err == nil && os.Getenv("container") == "" { - if _, err = os.Stat("/sbin/apparmor_parser"); err == nil { - buf, err := ioutil.ReadFile("/sys/module/apparmor/parameters/enabled") - return err == nil && len(buf) > 1 && buf[0] == 'Y' - } - } - return false -} - -func setProcAttr(attr, value string) error { - // Under AppArmor you can only change your own attr, so use /proc/self/ - // instead of /proc// like libapparmor does - path := fmt.Sprintf("/proc/self/attr/%s", attr) - - f, err := os.OpenFile(path, os.O_WRONLY, 0) - if err != nil { - return err - } - defer f.Close() - - if err := utils.EnsureProcHandle(f); err != nil { - return err - } - - _, err = fmt.Fprintf(f, "%s", value) - return err -} - -// changeOnExec reimplements aa_change_onexec from libapparmor in Go -func changeOnExec(name string) error { - value := "exec " + name - if err := setProcAttr("exec", value); err != nil { - return fmt.Errorf("apparmor failed to apply profile: %s", err) - } - return nil -} - -// ApplyProfile will apply the profile with the specified name to the process after -// the next exec. -func ApplyProfile(name string) error { - if name == "" { - return nil - } - - return changeOnExec(name) -} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/apparmor/apparmor_disabled.go b/vendor/github.com/opencontainers/runc/libcontainer/apparmor/apparmor_disabled.go deleted file mode 100644 index d4110cf0bc6d..000000000000 --- a/vendor/github.com/opencontainers/runc/libcontainer/apparmor/apparmor_disabled.go +++ /dev/null @@ -1,20 +0,0 @@ -// +build !apparmor !linux - -package apparmor - -import ( - "errors" -) - -var ErrApparmorNotEnabled = errors.New("apparmor: config provided but apparmor not supported") - -func IsEnabled() bool { - return false -} - -func ApplyProfile(name string) error { - if name != "" { - return ErrApparmorNotEnabled - } - return nil -} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/apparmor/apparmor_linux.go b/vendor/github.com/opencontainers/runc/libcontainer/apparmor/apparmor_linux.go new file mode 100644 index 000000000000..73965f12d83b --- /dev/null +++ b/vendor/github.com/opencontainers/runc/libcontainer/apparmor/apparmor_linux.go @@ -0,0 +1,54 @@ +package apparmor + +import ( + "bytes" + "fmt" + "io/ioutil" + "os" + + "github.com/opencontainers/runc/libcontainer/utils" +) + +// IsEnabled returns true if apparmor is enabled for the host. +func IsEnabled() bool { + if _, err := os.Stat("/sys/kernel/security/apparmor"); err == nil { + buf, err := ioutil.ReadFile("/sys/module/apparmor/parameters/enabled") + return err == nil && bytes.HasPrefix(buf, []byte("Y")) + } + return false +} + +func setProcAttr(attr, value string) error { + // Under AppArmor you can only change your own attr, so use /proc/self/ + // instead of /proc// like libapparmor does + f, err := os.OpenFile("/proc/self/attr/"+attr, os.O_WRONLY, 0) + if err != nil { + return err + } + defer f.Close() + + if err := utils.EnsureProcHandle(f); err != nil { + return err + } + + _, err = f.WriteString(value) + return err +} + +// changeOnExec reimplements aa_change_onexec from libapparmor in Go +func changeOnExec(name string) error { + if err := setProcAttr("exec", "exec "+name); err != nil { + return fmt.Errorf("apparmor failed to apply profile: %s", err) + } + return nil +} + +// ApplyProfile will apply the profile with the specified name to the process after +// the next exec. +func ApplyProfile(name string) error { + if name == "" { + return nil + } + + return changeOnExec(name) +} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/apparmor/apparmor_unsupported.go b/vendor/github.com/opencontainers/runc/libcontainer/apparmor/apparmor_unsupported.go new file mode 100644 index 000000000000..0bc473f810bc --- /dev/null +++ b/vendor/github.com/opencontainers/runc/libcontainer/apparmor/apparmor_unsupported.go @@ -0,0 +1,20 @@ +// +build !linux + +package apparmor + +import ( + "errors" +) + +var ErrApparmorNotEnabled = errors.New("apparmor: config provided but apparmor not supported") + +func IsEnabled() bool { + return false +} + +func ApplyProfile(name string) error { + if name != "" { + return ErrApparmorNotEnabled + } + return nil +} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/capabilities/capabilities.go b/vendor/github.com/opencontainers/runc/libcontainer/capabilities/capabilities.go new file mode 100644 index 000000000000..adbf6330c48e --- /dev/null +++ b/vendor/github.com/opencontainers/runc/libcontainer/capabilities/capabilities.go @@ -0,0 +1,96 @@ +// +build linux + +package capabilities + +import ( + "fmt" + "strings" + + "github.com/opencontainers/runc/libcontainer/configs" + "github.com/syndtr/gocapability/capability" +) + +const allCapabilityTypes = capability.CAPS | capability.BOUNDS | capability.AMBS + +var capabilityMap map[string]capability.Cap + +func init() { + capabilityMap = make(map[string]capability.Cap, capability.CAP_LAST_CAP+1) + for _, c := range capability.List() { + if c > capability.CAP_LAST_CAP { + continue + } + capabilityMap["CAP_"+strings.ToUpper(c.String())] = c + } +} + +// New creates a new Caps from the given Capabilities config. +func New(capConfig *configs.Capabilities) (*Caps, error) { + var ( + err error + caps Caps + ) + + if caps.bounding, err = capSlice(capConfig.Bounding); err != nil { + return nil, err + } + if caps.effective, err = capSlice(capConfig.Effective); err != nil { + return nil, err + } + if caps.inheritable, err = capSlice(capConfig.Inheritable); err != nil { + return nil, err + } + if caps.permitted, err = capSlice(capConfig.Permitted); err != nil { + return nil, err + } + if caps.ambient, err = capSlice(capConfig.Ambient); err != nil { + return nil, err + } + if caps.pid, err = capability.NewPid2(0); err != nil { + return nil, err + } + if err = caps.pid.Load(); err != nil { + return nil, err + } + return &caps, nil +} + +func capSlice(caps []string) ([]capability.Cap, error) { + out := make([]capability.Cap, len(caps)) + for i, c := range caps { + v, ok := capabilityMap[c] + if !ok { + return nil, fmt.Errorf("unknown capability %q", c) + } + out[i] = v + } + return out, nil +} + +// Caps holds the capabilities for a container. +type Caps struct { + pid capability.Capabilities + bounding []capability.Cap + effective []capability.Cap + inheritable []capability.Cap + permitted []capability.Cap + ambient []capability.Cap +} + +// ApplyBoundingSet sets the capability bounding set to those specified in the whitelist. +func (c *Caps) ApplyBoundingSet() error { + c.pid.Clear(capability.BOUNDS) + c.pid.Set(capability.BOUNDS, c.bounding...) + return c.pid.Apply(capability.BOUNDS) +} + +// Apply sets all the capabilities for the current process in the config. +func (c *Caps) ApplyCaps() error { + c.pid.Clear(allCapabilityTypes) + c.pid.Set(capability.BOUNDS, c.bounding...) + c.pid.Set(capability.PERMITTED, c.permitted...) + c.pid.Set(capability.INHERITABLE, c.inheritable...) + c.pid.Set(capability.EFFECTIVE, c.effective...) + c.pid.Set(capability.AMBIENT, c.ambient...) + return c.pid.Apply(allCapabilityTypes) +} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/capabilities/capabilities_unsupported.go b/vendor/github.com/opencontainers/runc/libcontainer/capabilities/capabilities_unsupported.go new file mode 100644 index 000000000000..a3e82ac1fd4d --- /dev/null +++ b/vendor/github.com/opencontainers/runc/libcontainer/capabilities/capabilities_unsupported.go @@ -0,0 +1,3 @@ +// +build !linux + +package capabilities diff --git a/vendor/github.com/opencontainers/runc/libcontainer/capabilities_linux.go b/vendor/github.com/opencontainers/runc/libcontainer/capabilities_linux.go deleted file mode 100644 index 9daef29e480a..000000000000 --- a/vendor/github.com/opencontainers/runc/libcontainer/capabilities_linux.go +++ /dev/null @@ -1,117 +0,0 @@ -// +build linux - -package libcontainer - -import ( - "fmt" - "strings" - - "github.com/opencontainers/runc/libcontainer/configs" - "github.com/syndtr/gocapability/capability" -) - -const allCapabilityTypes = capability.CAPS | capability.BOUNDS | capability.AMBS - -var capabilityMap map[string]capability.Cap - -func init() { - capabilityMap = make(map[string]capability.Cap) - last := capability.CAP_LAST_CAP - // workaround for RHEL6 which has no /proc/sys/kernel/cap_last_cap - if last == capability.Cap(63) { - last = capability.CAP_BLOCK_SUSPEND - } - for _, cap := range capability.List() { - if cap > last { - continue - } - capKey := fmt.Sprintf("CAP_%s", strings.ToUpper(cap.String())) - capabilityMap[capKey] = cap - } -} - -func newContainerCapList(capConfig *configs.Capabilities) (*containerCapabilities, error) { - bounding := []capability.Cap{} - for _, c := range capConfig.Bounding { - v, ok := capabilityMap[c] - if !ok { - return nil, fmt.Errorf("unknown capability %q", c) - } - bounding = append(bounding, v) - } - effective := []capability.Cap{} - for _, c := range capConfig.Effective { - v, ok := capabilityMap[c] - if !ok { - return nil, fmt.Errorf("unknown capability %q", c) - } - effective = append(effective, v) - } - inheritable := []capability.Cap{} - for _, c := range capConfig.Inheritable { - v, ok := capabilityMap[c] - if !ok { - return nil, fmt.Errorf("unknown capability %q", c) - } - inheritable = append(inheritable, v) - } - permitted := []capability.Cap{} - for _, c := range capConfig.Permitted { - v, ok := capabilityMap[c] - if !ok { - return nil, fmt.Errorf("unknown capability %q", c) - } - permitted = append(permitted, v) - } - ambient := []capability.Cap{} - for _, c := range capConfig.Ambient { - v, ok := capabilityMap[c] - if !ok { - return nil, fmt.Errorf("unknown capability %q", c) - } - ambient = append(ambient, v) - } - pid, err := capability.NewPid2(0) - if err != nil { - return nil, err - } - err = pid.Load() - if err != nil { - return nil, err - } - return &containerCapabilities{ - bounding: bounding, - effective: effective, - inheritable: inheritable, - permitted: permitted, - ambient: ambient, - pid: pid, - }, nil -} - -type containerCapabilities struct { - pid capability.Capabilities - bounding []capability.Cap - effective []capability.Cap - inheritable []capability.Cap - permitted []capability.Cap - ambient []capability.Cap -} - -// ApplyBoundingSet sets the capability bounding set to those specified in the whitelist. -func (c *containerCapabilities) ApplyBoundingSet() error { - c.pid.Clear(capability.BOUNDS) - c.pid.Set(capability.BOUNDS, c.bounding...) - return c.pid.Apply(capability.BOUNDS) -} - -// Apply sets all the capabilities for the current process in the config. -func (c *containerCapabilities) ApplyCaps() error { - c.pid.Clear(allCapabilityTypes) - c.pid.Set(capability.BOUNDS, c.bounding...) - c.pid.Set(capability.PERMITTED, c.permitted...) - c.pid.Set(capability.INHERITABLE, c.inheritable...) - c.pid.Set(capability.EFFECTIVE, c.effective...) - c.pid.Set(capability.AMBIENT, c.ambient...) - return c.pid.Apply(allCapabilityTypes) -} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/devices/devices_emulator.go b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/devices/devices_emulator.go index 6afedbc6e731..3572a5eae8ee 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/devices/devices_emulator.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/devices/devices_emulator.go @@ -27,29 +27,29 @@ import ( "sort" "strconv" - "github.com/opencontainers/runc/libcontainer/configs" + "github.com/opencontainers/runc/libcontainer/devices" "github.com/pkg/errors" ) -// deviceMeta is a DeviceRule without the Allow or Permissions fields, and no +// deviceMeta is a Rule without the Allow or Permissions fields, and no // wildcard-type support. It's effectively the "match" portion of a metadata // rule, for the purposes of our emulation. type deviceMeta struct { - node configs.DeviceType + node devices.Type major int64 minor int64 } -// deviceRule is effectively the tuple (deviceMeta, DevicePermissions). +// deviceRule is effectively the tuple (deviceMeta, Permissions). type deviceRule struct { meta deviceMeta - perms configs.DevicePermissions + perms devices.Permissions } // deviceRules is a mapping of device metadata rules to the associated // permissions in the ruleset. -type deviceRules map[deviceMeta]configs.DevicePermissions +type deviceRules map[deviceMeta]devices.Permissions func (r deviceRules) orderedEntries() []deviceRule { var rules []deviceRule @@ -103,9 +103,9 @@ func parseLine(line string) (*deviceRule, error) { // TODO: Double-check that the entire file is "a *:* rwm". return nil, nil case "b": - rule.meta.node = configs.BlockDevice + rule.meta.node = devices.BlockDevice case "c": - rule.meta.node = configs.CharDevice + rule.meta.node = devices.CharDevice default: // Should never happen! return nil, errors.Errorf("unknown device type %q", node) @@ -113,7 +113,7 @@ func parseLine(line string) (*deviceRule, error) { // Parse the major number. if major == "*" { - rule.meta.major = configs.Wildcard + rule.meta.major = devices.Wildcard } else { val, err := strconv.ParseUint(major, 10, 32) if err != nil { @@ -124,7 +124,7 @@ func parseLine(line string) (*deviceRule, error) { // Parse the minor number. if minor == "*" { - rule.meta.minor = configs.Wildcard + rule.meta.minor = devices.Wildcard } else { val, err := strconv.ParseUint(minor, 10, 32) if err != nil { @@ -134,7 +134,7 @@ func parseLine(line string) (*deviceRule, error) { } // Parse the access permissions. - rule.perms = configs.DevicePermissions(perms) + rule.perms = devices.Permissions(perms) if !rule.perms.IsValid() || rule.perms.IsEmpty() { // Should never happen! return nil, errors.Errorf("parse access mode: contained unknown modes or is empty: %q", perms) @@ -144,7 +144,7 @@ func parseLine(line string) (*deviceRule, error) { func (e *Emulator) addRule(rule deviceRule) error { if e.rules == nil { - e.rules = make(map[deviceMeta]configs.DevicePermissions) + e.rules = make(map[deviceMeta]devices.Permissions) } // Merge with any pre-existing permissions. @@ -169,9 +169,9 @@ func (e *Emulator) rmRule(rule deviceRule) error { // to mention it'd be really slow (the kernel side is implemented as a // linked-list of exceptions). for _, partialMeta := range []deviceMeta{ - {node: rule.meta.node, major: configs.Wildcard, minor: rule.meta.minor}, - {node: rule.meta.node, major: rule.meta.major, minor: configs.Wildcard}, - {node: rule.meta.node, major: configs.Wildcard, minor: configs.Wildcard}, + {node: rule.meta.node, major: devices.Wildcard, minor: rule.meta.minor}, + {node: rule.meta.node, major: rule.meta.major, minor: devices.Wildcard}, + {node: rule.meta.node, major: devices.Wildcard, minor: devices.Wildcard}, } { // This wildcard rule is equivalent to the requested rule, so skip it. if rule.meta == partialMeta { @@ -202,7 +202,7 @@ func (e *Emulator) rmRule(rule deviceRule) error { func (e *Emulator) allow(rule *deviceRule) error { // This cgroup is configured as a black-list. Reset the entire emulator, // and put is into black-list mode. - if rule == nil || rule.meta.node == configs.WildcardDevice { + if rule == nil || rule.meta.node == devices.WildcardDevice { *e = Emulator{ defaultAllow: true, rules: nil, @@ -222,7 +222,7 @@ func (e *Emulator) allow(rule *deviceRule) error { func (e *Emulator) deny(rule *deviceRule) error { // This cgroup is configured as a white-list. Reset the entire emulator, // and put is into white-list mode. - if rule == nil || rule.meta.node == configs.WildcardDevice { + if rule == nil || rule.meta.node == devices.WildcardDevice { *e = Emulator{ defaultAllow: false, rules: nil, @@ -239,7 +239,7 @@ func (e *Emulator) deny(rule *deviceRule) error { return err } -func (e *Emulator) Apply(rule configs.DeviceRule) error { +func (e *Emulator) Apply(rule devices.Rule) error { if !rule.Type.CanCgroup() { return errors.Errorf("cannot add rule [%#v] with non-cgroup type %q", rule, rule.Type) } @@ -252,7 +252,7 @@ func (e *Emulator) Apply(rule configs.DeviceRule) error { }, perms: rule.Permissions, } - if innerRule.meta.node == configs.WildcardDevice { + if innerRule.meta.node == devices.WildcardDevice { innerRule = nil } @@ -307,8 +307,8 @@ func EmulatorFromList(list io.Reader) (*Emulator, error) { // This function is the sole reason for all of Emulator -- to allow us // to figure out how to update a containers' cgroups without causing spurrious // device errors (if possible). -func (source *Emulator) Transition(target *Emulator) ([]*configs.DeviceRule, error) { - var transitionRules []*configs.DeviceRule +func (source *Emulator) Transition(target *Emulator) ([]*devices.Rule, error) { + var transitionRules []*devices.Rule oldRules := source.rules // If the default policy doesn't match, we need to include a "disruptive" @@ -319,11 +319,11 @@ func (source *Emulator) Transition(target *Emulator) ([]*configs.DeviceRule, err // deny rules are in place in a black-list cgroup. Thus if the source is a // black-list we also have to include a disruptive rule. if source.IsBlacklist() || source.defaultAllow != target.defaultAllow { - transitionRules = append(transitionRules, &configs.DeviceRule{ + transitionRules = append(transitionRules, &devices.Rule{ Type: 'a', Major: -1, Minor: -1, - Permissions: configs.DevicePermissions("rwm"), + Permissions: devices.Permissions("rwm"), Allow: target.defaultAllow, }) // The old rules are only relevant if we aren't starting out with a @@ -342,7 +342,7 @@ func (source *Emulator) Transition(target *Emulator) ([]*configs.DeviceRule, err newPerms := target.rules[meta] droppedPerms := oldPerms.Difference(newPerms) if !droppedPerms.IsEmpty() { - transitionRules = append(transitionRules, &configs.DeviceRule{ + transitionRules = append(transitionRules, &devices.Rule{ Type: meta.node, Major: meta.major, Minor: meta.minor, @@ -360,7 +360,7 @@ func (source *Emulator) Transition(target *Emulator) ([]*configs.DeviceRule, err oldPerms := oldRules[meta] gainedPerms := newPerms.Difference(oldPerms) if !gainedPerms.IsEmpty() { - transitionRules = append(transitionRules, &configs.DeviceRule{ + transitionRules = append(transitionRules, &devices.Rule{ Type: meta.node, Major: meta.major, Minor: meta.minor, diff --git a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/ebpf/devicefilter/devicefilter.go b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/ebpf/devicefilter/devicefilter.go index b593eb43e177..a173fd4a16f7 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/ebpf/devicefilter/devicefilter.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/ebpf/devicefilter/devicefilter.go @@ -1,4 +1,4 @@ -// Package devicefilter containes eBPF device filter program +// Package devicefilter contains eBPF device filter program // // The implementation is based on https://github.com/containers/crun/blob/0.10.2/src/libcrun/ebpf.c // @@ -7,11 +7,11 @@ package devicefilter import ( - "fmt" "math" + "strconv" "github.com/cilium/ebpf/asm" - "github.com/opencontainers/runc/libcontainer/configs" + "github.com/opencontainers/runc/libcontainer/devices" "github.com/pkg/errors" "golang.org/x/sys/unix" ) @@ -22,7 +22,7 @@ const ( ) // DeviceFilter returns eBPF device filter program and its license string -func DeviceFilter(devices []*configs.DeviceRule) (asm.Instructions, string, error) { +func DeviceFilter(devices []*devices.Rule) (asm.Instructions, string, error) { p := &program{} p.init() for i := len(devices) - 1; i >= 0; i-- { @@ -68,7 +68,7 @@ func (p *program) init() { } // appendDevice needs to be called from the last element of OCI linux.resources.devices to the head element. -func (p *program) appendDevice(dev *configs.DeviceRule) error { +func (p *program) appendDevice(dev *devices.Rule) error { if p.blockID < 0 { return errors.New("the program is finalized") } @@ -88,7 +88,7 @@ func (p *program) appendDevice(dev *configs.DeviceRule) error { hasType = false default: // if not specified in OCI json, typ is set to DeviceTypeAll - return errors.Errorf("invalid DeviceType %q", string(dev.Type)) + return errors.Errorf("invalid Type %q", string(dev.Type)) } if dev.Major > math.MaxUint32 { return errors.Errorf("invalid major %d", dev.Major) @@ -114,9 +114,11 @@ func (p *program) appendDevice(dev *configs.DeviceRule) error { // If the access is rwm, skip the check. hasAccess := bpfAccess != (unix.BPF_DEVCG_ACC_READ | unix.BPF_DEVCG_ACC_WRITE | unix.BPF_DEVCG_ACC_MKNOD) - blockSym := fmt.Sprintf("block-%d", p.blockID) - nextBlockSym := fmt.Sprintf("block-%d", p.blockID+1) - prevBlockLastIdx := len(p.insts) - 1 + var ( + blockSym = "block-" + strconv.Itoa(p.blockID) + nextBlockSym = "block-" + strconv.Itoa(p.blockID+1) + prevBlockLastIdx = len(p.insts) - 1 + ) if hasType { p.insts = append(p.insts, // if (R2 != bpfType) goto next @@ -158,7 +160,7 @@ func (p *program) finalize() (asm.Instructions, error) { // acceptBlock with asm.Return() is already inserted return p.insts, nil } - blockSym := fmt.Sprintf("block-%d", p.blockID) + blockSym := "block-" + strconv.Itoa(p.blockID) p.insts = append(p.insts, // R0 <- 0 asm.Mov.Imm32(asm.R0, 0).Sym(blockSym), diff --git a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/blkio.go b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/blkio.go index 031a6bbdab20..dca2a6220785 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/blkio.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/blkio.go @@ -6,7 +6,6 @@ import ( "bufio" "fmt" "os" - "path/filepath" "strconv" "strings" @@ -105,9 +104,9 @@ func splitBlkioStatLine(r rune) bool { return r == ' ' || r == ':' } -func getBlkioStat(path string) ([]cgroups.BlkioStatEntry, error) { +func getBlkioStat(dir, file string) ([]cgroups.BlkioStatEntry, error) { var blkioStats []cgroups.BlkioStatEntry - f, err := os.Open(path) + f, err := fscommon.OpenFile(dir, file, os.O_RDONLY) if err != nil { if os.IsNotExist(err) { return blkioStats, nil @@ -125,7 +124,7 @@ func getBlkioStat(path string) ([]cgroups.BlkioStatEntry, error) { // skip total line continue } else { - return nil, fmt.Errorf("Invalid line found while parsing %s: %s", path, sc.Text()) + return nil, fmt.Errorf("Invalid line found while parsing %s/%s: %s", dir, file, sc.Text()) } } @@ -158,73 +157,134 @@ func getBlkioStat(path string) ([]cgroups.BlkioStatEntry, error) { } func (s *BlkioGroup) GetStats(path string, stats *cgroups.Stats) error { - // Try to read CFQ stats available on all CFQ enabled kernels first - if blkioStats, err := getBlkioStat(filepath.Join(path, "blkio.io_serviced_recursive")); err == nil && blkioStats != nil { - return getCFQStats(path, stats) + type blkioStatInfo struct { + filename string + blkioStatEntriesPtr *[]cgroups.BlkioStatEntry } - return getStats(path, stats) // Use generic stats as fallback -} - -func getCFQStats(path string, stats *cgroups.Stats) error { - var blkioStats []cgroups.BlkioStatEntry - var err error - - if blkioStats, err = getBlkioStat(filepath.Join(path, "blkio.sectors_recursive")); err != nil { - return err - } - stats.BlkioStats.SectorsRecursive = blkioStats - - if blkioStats, err = getBlkioStat(filepath.Join(path, "blkio.io_service_bytes_recursive")); err != nil { - return err + var bfqDebugStats = []blkioStatInfo{ + { + filename: "blkio.bfq.sectors_recursive", + blkioStatEntriesPtr: &stats.BlkioStats.SectorsRecursive, + }, + { + filename: "blkio.bfq.io_service_time_recursive", + blkioStatEntriesPtr: &stats.BlkioStats.IoServiceTimeRecursive, + }, + { + filename: "blkio.bfq.io_wait_time_recursive", + blkioStatEntriesPtr: &stats.BlkioStats.IoWaitTimeRecursive, + }, + { + filename: "blkio.bfq.io_merged_recursive", + blkioStatEntriesPtr: &stats.BlkioStats.IoMergedRecursive, + }, + { + filename: "blkio.bfq.io_queued_recursive", + blkioStatEntriesPtr: &stats.BlkioStats.IoQueuedRecursive, + }, + { + filename: "blkio.bfq.time_recursive", + blkioStatEntriesPtr: &stats.BlkioStats.IoTimeRecursive, + }, + { + filename: "blkio.bfq.io_serviced_recursive", + blkioStatEntriesPtr: &stats.BlkioStats.IoServicedRecursive, + }, + { + filename: "blkio.bfq.io_service_bytes_recursive", + blkioStatEntriesPtr: &stats.BlkioStats.IoServiceBytesRecursive, + }, } - stats.BlkioStats.IoServiceBytesRecursive = blkioStats - - if blkioStats, err = getBlkioStat(filepath.Join(path, "blkio.io_serviced_recursive")); err != nil { - return err + var bfqStats = []blkioStatInfo{ + { + filename: "blkio.bfq.io_serviced_recursive", + blkioStatEntriesPtr: &stats.BlkioStats.IoServicedRecursive, + }, + { + filename: "blkio.bfq.io_service_bytes_recursive", + blkioStatEntriesPtr: &stats.BlkioStats.IoServiceBytesRecursive, + }, } - stats.BlkioStats.IoServicedRecursive = blkioStats - - if blkioStats, err = getBlkioStat(filepath.Join(path, "blkio.io_queued_recursive")); err != nil { - return err + var cfqStats = []blkioStatInfo{ + { + filename: "blkio.sectors_recursive", + blkioStatEntriesPtr: &stats.BlkioStats.SectorsRecursive, + }, + { + filename: "blkio.io_service_time_recursive", + blkioStatEntriesPtr: &stats.BlkioStats.IoServiceTimeRecursive, + }, + { + filename: "blkio.io_wait_time_recursive", + blkioStatEntriesPtr: &stats.BlkioStats.IoWaitTimeRecursive, + }, + { + filename: "blkio.io_merged_recursive", + blkioStatEntriesPtr: &stats.BlkioStats.IoMergedRecursive, + }, + { + filename: "blkio.io_queued_recursive", + blkioStatEntriesPtr: &stats.BlkioStats.IoQueuedRecursive, + }, + { + filename: "blkio.time_recursive", + blkioStatEntriesPtr: &stats.BlkioStats.IoTimeRecursive, + }, + { + filename: "blkio.io_serviced_recursive", + blkioStatEntriesPtr: &stats.BlkioStats.IoServicedRecursive, + }, + { + filename: "blkio.io_service_bytes_recursive", + blkioStatEntriesPtr: &stats.BlkioStats.IoServiceBytesRecursive, + }, } - stats.BlkioStats.IoQueuedRecursive = blkioStats - - if blkioStats, err = getBlkioStat(filepath.Join(path, "blkio.io_service_time_recursive")); err != nil { - return err + var throttleRecursiveStats = []blkioStatInfo{ + { + filename: "blkio.throttle.io_serviced_recursive", + blkioStatEntriesPtr: &stats.BlkioStats.IoServicedRecursive, + }, + { + filename: "blkio.throttle.io_service_bytes_recursive", + blkioStatEntriesPtr: &stats.BlkioStats.IoServiceBytesRecursive, + }, } - stats.BlkioStats.IoServiceTimeRecursive = blkioStats - - if blkioStats, err = getBlkioStat(filepath.Join(path, "blkio.io_wait_time_recursive")); err != nil { - return err + var baseStats = []blkioStatInfo{ + { + filename: "blkio.throttle.io_serviced", + blkioStatEntriesPtr: &stats.BlkioStats.IoServicedRecursive, + }, + { + filename: "blkio.throttle.io_service_bytes", + blkioStatEntriesPtr: &stats.BlkioStats.IoServiceBytesRecursive, + }, } - stats.BlkioStats.IoWaitTimeRecursive = blkioStats - - if blkioStats, err = getBlkioStat(filepath.Join(path, "blkio.io_merged_recursive")); err != nil { - return err + var orderedStats = [][]blkioStatInfo{ + bfqDebugStats, + bfqStats, + cfqStats, + throttleRecursiveStats, + baseStats, } - stats.BlkioStats.IoMergedRecursive = blkioStats - if blkioStats, err = getBlkioStat(filepath.Join(path, "blkio.time_recursive")); err != nil { - return err - } - stats.BlkioStats.IoTimeRecursive = blkioStats - - return nil -} - -func getStats(path string, stats *cgroups.Stats) error { var blkioStats []cgroups.BlkioStatEntry var err error - if blkioStats, err = getBlkioStat(filepath.Join(path, "blkio.throttle.io_service_bytes")); err != nil { - return err - } - stats.BlkioStats.IoServiceBytesRecursive = blkioStats - - if blkioStats, err = getBlkioStat(filepath.Join(path, "blkio.throttle.io_serviced")); err != nil { - return err + for _, statGroup := range orderedStats { + for i, statInfo := range statGroup { + if blkioStats, err = getBlkioStat(path, statInfo.filename); err != nil || blkioStats == nil { + // if error occurs on first file, move to next group + if i == 0 { + break + } + return err + } + *statInfo.blkioStatEntriesPtr = blkioStats + //finish if all stats are gathered + if i == len(statGroup)-1 { + return nil + } + } } - stats.BlkioStats.IoServicedRecursive = blkioStats - return nil } diff --git a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/cpu.go b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/cpu.go index 6fb1c2078a50..1d5f455d6a40 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/cpu.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/cpu.go @@ -6,7 +6,6 @@ import ( "bufio" "fmt" "os" - "path/filepath" "strconv" "github.com/opencontainers/runc/libcontainer/cgroups" @@ -87,7 +86,7 @@ func (s *CpuGroup) Set(path string, cgroup *configs.Cgroup) error { } func (s *CpuGroup) GetStats(path string, stats *cgroups.Stats) error { - f, err := os.Open(filepath.Join(path, "cpu.stat")) + f, err := fscommon.OpenFile(path, "cpu.stat", os.O_RDONLY) if err != nil { if os.IsNotExist(err) { return nil diff --git a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/cpuacct.go b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/cpuacct.go index 1a18971bc5a7..129de6a01cd1 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/cpuacct.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/cpuacct.go @@ -5,7 +5,6 @@ package fs import ( "bufio" "fmt" - "io/ioutil" "os" "path/filepath" "strconv" @@ -83,8 +82,7 @@ func (s *CpuacctGroup) GetStats(path string, stats *cgroups.Stats) error { // Returns user and kernel usage breakdown in nanoseconds. func getCpuUsageBreakdown(path string) (uint64, uint64, error) { - userModeUsage := uint64(0) - kernelModeUsage := uint64(0) + var userModeUsage, kernelModeUsage uint64 const ( userField = "user" systemField = "system" @@ -93,11 +91,11 @@ func getCpuUsageBreakdown(path string) (uint64, uint64, error) { // Expected format: // user // system - data, err := ioutil.ReadFile(filepath.Join(path, cgroupCpuacctStat)) + data, err := fscommon.ReadFile(path, cgroupCpuacctStat) if err != nil { return 0, 0, err } - fields := strings.Fields(string(data)) + fields := strings.Fields(data) if len(fields) < 4 { return 0, 0, fmt.Errorf("failure - %s is expected to have at least 4 fields", filepath.Join(path, cgroupCpuacctStat)) } @@ -119,11 +117,11 @@ func getCpuUsageBreakdown(path string) (uint64, uint64, error) { func getPercpuUsage(path string) ([]uint64, error) { percpuUsage := []uint64{} - data, err := ioutil.ReadFile(filepath.Join(path, "cpuacct.usage_percpu")) + data, err := fscommon.ReadFile(path, "cpuacct.usage_percpu") if err != nil { return percpuUsage, err } - for _, value := range strings.Fields(string(data)) { + for _, value := range strings.Fields(data) { value, err := strconv.ParseUint(value, 10, 64) if err != nil { return percpuUsage, fmt.Errorf("Unable to convert param value to uint64: %s", err) @@ -137,7 +135,7 @@ func getPercpuUsageInModes(path string) ([]uint64, []uint64, error) { usageKernelMode := []uint64{} usageUserMode := []uint64{} - file, err := os.Open(filepath.Join(path, cgroupCpuacctUsageAll)) + file, err := fscommon.OpenFile(path, cgroupCpuacctUsageAll, os.O_RDONLY) if os.IsNotExist(err) { return usageKernelMode, usageUserMode, nil } else if err != nil { diff --git a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/cpuset.go b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/cpuset.go index ba17519baea2..5bde025b4b91 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/cpuset.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/cpuset.go @@ -3,17 +3,17 @@ package fs import ( - "bytes" - "io/ioutil" + "fmt" "os" "path/filepath" + "strconv" + "strings" - "github.com/moby/sys/mountinfo" "github.com/opencontainers/runc/libcontainer/cgroups" "github.com/opencontainers/runc/libcontainer/cgroups/fscommon" "github.com/opencontainers/runc/libcontainer/configs" - libcontainerUtils "github.com/opencontainers/runc/libcontainer/utils" "github.com/pkg/errors" + "golang.org/x/sys/unix" ) type CpusetGroup struct { @@ -41,30 +41,107 @@ func (s *CpusetGroup) Set(path string, cgroup *configs.Cgroup) error { return nil } -func (s *CpusetGroup) GetStats(path string, stats *cgroups.Stats) error { - return nil +func getCpusetStat(path string, filename string) ([]uint16, error) { + var extracted []uint16 + fileContent, err := fscommon.GetCgroupParamString(path, filename) + if err != nil { + return extracted, err + } + if len(fileContent) == 0 { + return extracted, fmt.Errorf("%s found to be empty", filepath.Join(path, filename)) + } + + for _, s := range strings.Split(fileContent, ",") { + splitted := strings.SplitN(s, "-", 3) + switch len(splitted) { + case 3: + return extracted, fmt.Errorf("invalid values in %s", filepath.Join(path, filename)) + case 2: + min, err := strconv.ParseUint(splitted[0], 10, 16) + if err != nil { + return extracted, err + } + max, err := strconv.ParseUint(splitted[1], 10, 16) + if err != nil { + return extracted, err + } + if min > max { + return extracted, fmt.Errorf("invalid values in %s", filepath.Join(path, filename)) + } + for i := min; i <= max; i++ { + extracted = append(extracted, uint16(i)) + } + case 1: + value, err := strconv.ParseUint(s, 10, 16) + if err != nil { + return extracted, err + } + extracted = append(extracted, uint16(value)) + } + } + + return extracted, nil } -// Get the source mount point of directory passed in as argument. -func getMount(dir string) (string, error) { - mi, err := mountinfo.GetMounts(mountinfo.ParentsFilter(dir)) - if err != nil { - return "", err +func (s *CpusetGroup) GetStats(path string, stats *cgroups.Stats) error { + var err error + + stats.CPUSetStats.CPUs, err = getCpusetStat(path, "cpuset.cpus") + if err != nil && !errors.Is(err, os.ErrNotExist) { + return err + } + + stats.CPUSetStats.CPUExclusive, err = fscommon.GetCgroupParamUint(path, "cpuset.cpu_exclusive") + if err != nil && !errors.Is(err, os.ErrNotExist) { + return err } - if len(mi) < 1 { - return "", errors.Errorf("Can't find mount point of %s", dir) + + stats.CPUSetStats.Mems, err = getCpusetStat(path, "cpuset.mems") + if err != nil && !errors.Is(err, os.ErrNotExist) { + return err } - // find the longest mount point - var idx, maxlen int - for i := range mi { - if len(mi[i].Mountpoint) > maxlen { - maxlen = len(mi[i].Mountpoint) - idx = i - } + stats.CPUSetStats.MemHardwall, err = fscommon.GetCgroupParamUint(path, "cpuset.mem_hardwall") + if err != nil && !errors.Is(err, os.ErrNotExist) { + return err + } + + stats.CPUSetStats.MemExclusive, err = fscommon.GetCgroupParamUint(path, "cpuset.mem_exclusive") + if err != nil && !errors.Is(err, os.ErrNotExist) { + return err + } + + stats.CPUSetStats.MemoryMigrate, err = fscommon.GetCgroupParamUint(path, "cpuset.memory_migrate") + if err != nil && !errors.Is(err, os.ErrNotExist) { + return err } - return mi[idx].Mountpoint, nil + stats.CPUSetStats.MemorySpreadPage, err = fscommon.GetCgroupParamUint(path, "cpuset.memory_spread_page") + if err != nil && !errors.Is(err, os.ErrNotExist) { + return err + } + + stats.CPUSetStats.MemorySpreadSlab, err = fscommon.GetCgroupParamUint(path, "cpuset.memory_spread_slab") + if err != nil && !errors.Is(err, os.ErrNotExist) { + return err + } + + stats.CPUSetStats.MemoryPressure, err = fscommon.GetCgroupParamUint(path, "cpuset.memory_pressure") + if err != nil && !errors.Is(err, os.ErrNotExist) { + return err + } + + stats.CPUSetStats.SchedLoadBalance, err = fscommon.GetCgroupParamUint(path, "cpuset.sched_load_balance") + if err != nil && !errors.Is(err, os.ErrNotExist) { + return err + } + + stats.CPUSetStats.SchedRelaxDomainLevel, err = fscommon.GetCgroupParamInt(path, "cpuset.sched_relax_domain_level") + if err != nil && !errors.Is(err, os.ErrNotExist) { + return err + } + + return nil } func (s *CpusetGroup) ApplyDir(dir string, cgroup *configs.Cgroup, pid int) error { @@ -73,18 +150,13 @@ func (s *CpusetGroup) ApplyDir(dir string, cgroup *configs.Cgroup, pid int) erro if dir == "" { return nil } - root, err := getMount(dir) - if err != nil { - return err - } - root = filepath.Dir(root) // 'ensureParent' start with parent because we don't want to // explicitly inherit from parent, it could conflict with // 'cpuset.cpu_exclusive'. - if err := s.ensureParent(filepath.Dir(dir), root); err != nil { + if err := cpusetEnsureParent(filepath.Dir(dir)); err != nil { return err } - if err := os.MkdirAll(dir, 0755); err != nil { + if err := os.Mkdir(dir, 0755); err != nil && !os.IsExist(err) { return err } // We didn't inherit cpuset configs from parent, but we have @@ -103,59 +175,61 @@ func (s *CpusetGroup) ApplyDir(dir string, cgroup *configs.Cgroup, pid int) erro return cgroups.WriteCgroupProc(dir, pid) } -func (s *CpusetGroup) getSubsystemSettings(parent string) (cpus []byte, mems []byte, err error) { - if cpus, err = ioutil.ReadFile(filepath.Join(parent, "cpuset.cpus")); err != nil { +func getCpusetSubsystemSettings(parent string) (cpus, mems string, err error) { + if cpus, err = fscommon.ReadFile(parent, "cpuset.cpus"); err != nil { return } - if mems, err = ioutil.ReadFile(filepath.Join(parent, "cpuset.mems")); err != nil { + if mems, err = fscommon.ReadFile(parent, "cpuset.mems"); err != nil { return } return cpus, mems, nil } -// ensureParent makes sure that the parent directory of current is created -// and populated with the proper cpus and mems files copied from -// it's parent. -func (s *CpusetGroup) ensureParent(current, root string) error { +// cpusetEnsureParent makes sure that the parent directories of current +// are created and populated with the proper cpus and mems files copied +// from their respective parent. It does that recursively, starting from +// the top of the cpuset hierarchy (i.e. cpuset cgroup mount point). +func cpusetEnsureParent(current string) error { + var st unix.Statfs_t + parent := filepath.Dir(current) - if libcontainerUtils.CleanPath(parent) == root { + err := unix.Statfs(parent, &st) + if err == nil && st.Type != unix.CGROUP_SUPER_MAGIC { return nil } - // Avoid infinite recursion. - if parent == current { - return errors.New("cpuset: cgroup parent path outside cgroup root") + // Treat non-existing directory as cgroupfs as it will be created, + // and the root cpuset directory obviously exists. + if err != nil && err != unix.ENOENT { + return &os.PathError{Op: "statfs", Path: parent, Err: err} } - if err := s.ensureParent(parent, root); err != nil { + + if err := cpusetEnsureParent(parent); err != nil { return err } - if err := os.MkdirAll(current, 0755); err != nil { + if err := os.Mkdir(current, 0755); err != nil && !os.IsExist(err) { return err } - return s.copyIfNeeded(current, parent) + return cpusetCopyIfNeeded(current, parent) } -// copyIfNeeded copies the cpuset.cpus and cpuset.mems from the parent +// cpusetCopyIfNeeded copies the cpuset.cpus and cpuset.mems from the parent // directory to the current directory if the file's contents are 0 -func (s *CpusetGroup) copyIfNeeded(current, parent string) error { - var ( - err error - currentCpus, currentMems []byte - parentCpus, parentMems []byte - ) - - if currentCpus, currentMems, err = s.getSubsystemSettings(current); err != nil { +func cpusetCopyIfNeeded(current, parent string) error { + currentCpus, currentMems, err := getCpusetSubsystemSettings(current) + if err != nil { return err } - if parentCpus, parentMems, err = s.getSubsystemSettings(parent); err != nil { + parentCpus, parentMems, err := getCpusetSubsystemSettings(parent) + if err != nil { return err } - if s.isEmpty(currentCpus) { + if isEmptyCpuset(currentCpus) { if err := fscommon.WriteFile(current, "cpuset.cpus", string(parentCpus)); err != nil { return err } } - if s.isEmpty(currentMems) { + if isEmptyCpuset(currentMems) { if err := fscommon.WriteFile(current, "cpuset.mems", string(parentMems)); err != nil { return err } @@ -163,13 +237,13 @@ func (s *CpusetGroup) copyIfNeeded(current, parent string) error { return nil } -func (s *CpusetGroup) isEmpty(b []byte) bool { - return len(bytes.Trim(b, "\n")) == 0 +func isEmptyCpuset(str string) bool { + return str == "" || str == "\n" } func (s *CpusetGroup) ensureCpusAndMems(path string, cgroup *configs.Cgroup) error { if err := s.Set(path, cgroup); err != nil { return err } - return s.copyIfNeeded(path, filepath.Dir(path)) + return cpusetCopyIfNeeded(path, filepath.Dir(path)) } diff --git a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/devices.go b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/devices.go index fd8f00d5bfd0..9a37e68ec651 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/devices.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/devices.go @@ -8,9 +8,10 @@ import ( "reflect" "github.com/opencontainers/runc/libcontainer/cgroups" - "github.com/opencontainers/runc/libcontainer/cgroups/devices" + cgroupdevices "github.com/opencontainers/runc/libcontainer/cgroups/devices" "github.com/opencontainers/runc/libcontainer/cgroups/fscommon" "github.com/opencontainers/runc/libcontainer/configs" + "github.com/opencontainers/runc/libcontainer/devices" "github.com/opencontainers/runc/libcontainer/system" ) @@ -34,17 +35,17 @@ func (s *DevicesGroup) Apply(path string, d *cgroupData) error { return join(path, d.pid) } -func loadEmulator(path string) (*devices.Emulator, error) { +func loadEmulator(path string) (*cgroupdevices.Emulator, error) { list, err := fscommon.ReadFile(path, "devices.list") if err != nil { return nil, err } - return devices.EmulatorFromList(bytes.NewBufferString(list)) + return cgroupdevices.EmulatorFromList(bytes.NewBufferString(list)) } -func buildEmulator(rules []*configs.DeviceRule) (*devices.Emulator, error) { +func buildEmulator(rules []*devices.Rule) (*cgroupdevices.Emulator, error) { // This defaults to a white-list -- which is what we want! - emu := &devices.Emulator{} + emu := &cgroupdevices.Emulator{} for _, rule := range rules { if err := emu.Apply(*rule); err != nil { return nil, err diff --git a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/freezer.go b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/freezer.go index 11cb1646f482..25aff4f863fd 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/freezer.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/freezer.go @@ -28,33 +28,54 @@ func (s *FreezerGroup) Apply(path string, d *cgroupData) error { func (s *FreezerGroup) Set(path string, cgroup *configs.Cgroup) error { switch cgroup.Resources.Freezer { - case configs.Frozen, configs.Thawed: - for { - // In case this loop does not exit because it doesn't get the expected - // state, let's write again this state, hoping it's going to be properly - // set this time. Otherwise, this loop could run infinitely, waiting for - // a state change that would never happen. - if err := fscommon.WriteFile(path, "freezer.state", string(cgroup.Resources.Freezer)); err != nil { + case configs.Frozen: + // As per older kernel docs (freezer-subsystem.txt before + // kernel commit ef9fe980c6fcc1821), if FREEZING is seen, + // userspace should either retry or thaw. While current + // kernel cgroup v1 docs no longer mention a need to retry, + // the kernel (tested on v5.4, Ubuntu 20.04) can't reliably + // freeze a cgroup while new processes keep appearing in it + // (either via fork/clone or by writing new PIDs to + // cgroup.procs). + // + // The number of retries below is chosen to have a decent + // chance to succeed even in the worst case scenario (runc + // pause/unpause with parallel runc exec). + // + // Adding any amount of sleep in between retries did not + // increase the chances of successful freeze. + for i := 0; i < 1000; i++ { + if err := fscommon.WriteFile(path, "freezer.state", string(configs.Frozen)); err != nil { return err } - state, err := s.GetState(path) + state, err := fscommon.ReadFile(path, "freezer.state") if err != nil { return err } - if state == cgroup.Resources.Freezer { - break + state = strings.TrimSpace(state) + switch state { + case "FREEZING": + continue + case string(configs.Frozen): + return nil + default: + // should never happen + return fmt.Errorf("unexpected state %s while freezing", strings.TrimSpace(state)) } - - time.Sleep(1 * time.Millisecond) } + // Despite our best efforts, it got stuck in FREEZING. + // Leaving it in this state is bad and dangerous, so + // let's (try to) thaw it back and error out. + _ = fscommon.WriteFile(path, "freezer.state", string(configs.Thawed)) + return errors.New("unable to freeze") + case configs.Thawed: + return fscommon.WriteFile(path, "freezer.state", string(configs.Thawed)) case configs.Undefined: return nil default: return fmt.Errorf("Invalid argument '%s' to freezer.state", string(cgroup.Resources.Freezer)) } - - return nil } func (s *FreezerGroup) GetStats(path string, stats *cgroups.Stats) error { diff --git a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/fs.go b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/fs.go index 3ccf3a3c61d6..a42ce4535e97 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/fs.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/fs.go @@ -3,11 +3,9 @@ package fs import ( - "bufio" "fmt" "os" "path/filepath" - "strings" "sync" "github.com/opencontainers/runc/libcontainer/cgroups" @@ -133,46 +131,19 @@ func getCgroupRoot() (string, error) { return cgroupRoot, nil } - // slow path: parse mountinfo, find the first mount where fs=cgroup - // (e.g. "/sys/fs/cgroup/memory"), use its parent. - f, err := os.Open("/proc/self/mountinfo") + // slow path: parse mountinfo + mi, err := cgroups.GetCgroupMounts(false) if err != nil { return "", err } - defer f.Close() - - var root string - scanner := bufio.NewScanner(f) - for scanner.Scan() { - text := scanner.Text() - fields := strings.Split(text, " ") - // Safe as mountinfo encodes mountpoints with spaces as \040. - index := strings.Index(text, " - ") - postSeparatorFields := strings.Fields(text[index+3:]) - numPostFields := len(postSeparatorFields) - - // This is an error as we can't detect if the mount is for "cgroup" - if numPostFields == 0 { - return "", fmt.Errorf("mountinfo: found no fields post '-' in %q", text) - } - - if postSeparatorFields[0] == "cgroup" { - // Check that the mount is properly formatted. - if numPostFields < 3 { - return "", fmt.Errorf("Error found less than 3 fields post '-' in %q", text) - } - - root = filepath.Dir(fields[4]) - break - } - } - if err := scanner.Err(); err != nil { - return "", err - } - if root == "" { + if len(mi) < 1 { return "", errors.New("no cgroup mount found in mountinfo") } + // Get the first cgroup mount (e.g. "/sys/fs/cgroup/memory"), + // use its parent directory. + root := filepath.Dir(mi[0].Mountpoint) + if _, err := os.Stat(root); err != nil { return "", err } @@ -218,28 +189,31 @@ func (m *manager) Apply(pid int) (err error) { m.mu.Lock() defer m.mu.Unlock() - var c = m.cgroups - - d, err := getCgroupData(m.cgroups, pid) - if err != nil { - return err + c := m.cgroups + if c.Resources.Unified != nil { + return cgroups.ErrV1NoUnified } m.paths = make(map[string]string) if c.Paths != nil { + cgMap, err := cgroups.ParseCgroupFile("/proc/self/cgroup") + if err != nil { + return err + } for name, path := range c.Paths { - _, err := d.path(name) - if err != nil { - if cgroups.IsNotFound(err) { - continue - } - return err + // XXX(kolyshkin@): why this check is needed? + if _, ok := cgMap[name]; ok { + m.paths[name] = path } - m.paths[name] = path } return cgroups.EnterPid(m.paths, pid) } + d, err := getCgroupData(m.cgroups, pid) + if err != nil { + return err + } + for _, sys := range subsystems { p, err := d.path(sys.Name()) if err != nil { @@ -274,11 +248,7 @@ func (m *manager) Destroy() error { } m.mu.Lock() defer m.mu.Unlock() - if err := cgroups.RemovePaths(m.paths); err != nil { - return err - } - m.paths = make(map[string]string) - return nil + return cgroups.RemovePaths(m.paths) } func (m *manager) Path(subsys string) string { @@ -313,6 +283,9 @@ func (m *manager) Set(container *configs.Config) error { if m.cgroups != nil && m.cgroups.Paths != nil { return nil } + if container.Cgroups.Resources.Unified != nil { + return cgroups.ErrV1NoUnified + } m.mu.Lock() defer m.mu.Unlock() @@ -425,16 +398,6 @@ func join(path string, pid int) error { return cgroups.WriteCgroupProc(path, pid) } -func removePath(p string, err error) error { - if err != nil { - return err - } - if p != "" { - return os.RemoveAll(p) - } - return nil -} - func (m *manager) GetPaths() map[string]string { m.mu.Lock() defer m.mu.Unlock() diff --git a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/hugetlb.go b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/hugetlb.go index d32d02da1ca9..861793411e6a 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/hugetlb.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/hugetlb.go @@ -5,7 +5,6 @@ package fs import ( "fmt" "strconv" - "strings" "github.com/opencontainers/runc/libcontainer/cgroups" "github.com/opencontainers/runc/libcontainer/cgroups/fscommon" @@ -25,7 +24,7 @@ func (s *HugetlbGroup) Apply(path string, d *cgroupData) error { func (s *HugetlbGroup) Set(path string, cgroup *configs.Cgroup) error { for _, hugetlb := range cgroup.Resources.HugetlbLimit { - if err := fscommon.WriteFile(path, strings.Join([]string{"hugetlb", hugetlb.Pagesize, "limit_in_bytes"}, "."), strconv.FormatUint(hugetlb.Limit, 10)); err != nil { + if err := fscommon.WriteFile(path, "hugetlb."+hugetlb.Pagesize+".limit_in_bytes", strconv.FormatUint(hugetlb.Limit, 10)); err != nil { return err } } @@ -39,21 +38,21 @@ func (s *HugetlbGroup) GetStats(path string, stats *cgroups.Stats) error { return nil } for _, pageSize := range HugePageSizes { - usage := strings.Join([]string{"hugetlb", pageSize, "usage_in_bytes"}, ".") + usage := "hugetlb." + pageSize + ".usage_in_bytes" value, err := fscommon.GetCgroupParamUint(path, usage) if err != nil { return fmt.Errorf("failed to parse %s - %v", usage, err) } hugetlbStats.Usage = value - maxUsage := strings.Join([]string{"hugetlb", pageSize, "max_usage_in_bytes"}, ".") + maxUsage := "hugetlb." + pageSize + ".max_usage_in_bytes" value, err = fscommon.GetCgroupParamUint(path, maxUsage) if err != nil { return fmt.Errorf("failed to parse %s - %v", maxUsage, err) } hugetlbStats.MaxUsage = value - failcnt := strings.Join([]string{"hugetlb", pageSize, "failcnt"}, ".") + failcnt := "hugetlb." + pageSize + ".failcnt" value, err = fscommon.GetCgroupParamUint(path, failcnt) if err != nil { return fmt.Errorf("failed to parse %s - %v", failcnt, err) diff --git a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/kmem.go b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/kmem.go index 8d97a6791a43..86858f9083e9 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/kmem.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/kmem.go @@ -5,11 +5,11 @@ package fs import ( "errors" "fmt" - "io/ioutil" "path/filepath" "strconv" "github.com/opencontainers/runc/libcontainer/cgroups" + "github.com/opencontainers/runc/libcontainer/cgroups/fscommon" "golang.org/x/sys/unix" ) @@ -42,7 +42,7 @@ func setKernelMemory(path string, kernelMemoryLimit int64) error { // doesn't support it we *must* error out. return errors.New("kernel memory accounting not supported by this kernel") } - if err := ioutil.WriteFile(filepath.Join(path, cgroupKernelMemoryLimit), []byte(strconv.FormatInt(kernelMemoryLimit, 10)), 0700); err != nil { + if err := fscommon.WriteFile(path, cgroupKernelMemoryLimit, strconv.FormatInt(kernelMemoryLimit, 10)); err != nil { // Check if the error number returned by the syscall is "EBUSY" // The EBUSY signal is returned on attempts to write to the // memory.kmem.limit_in_bytes file if the cgroup has children or @@ -50,7 +50,7 @@ func setKernelMemory(path string, kernelMemoryLimit int64) error { if errors.Is(err, unix.EBUSY) { return fmt.Errorf("failed to set %s, because either tasks have already joined this cgroup or it has children", cgroupKernelMemoryLimit) } - return fmt.Errorf("failed to write %v to %v: %v", kernelMemoryLimit, cgroupKernelMemoryLimit, err) + return err } return nil } diff --git a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/memory.go b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/memory.go index 41adcd38f47c..61be6d7e9a6d 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/memory.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/memory.go @@ -7,7 +7,6 @@ import ( "fmt" "math" "os" - "path" "path/filepath" "strconv" "strings" @@ -18,16 +17,8 @@ import ( ) const ( - numaNodeSymbol = "N" - numaStatColumnSeparator = " " - numaStatKeyValueSeparator = "=" - numaStatMaxColumns = math.MaxUint8 + 1 - numaStatValueIndex = 1 - numaStatTypeIndex = 0 - numaStatColumnSliceLength = 2 - cgroupMemorySwapLimit = "memory.memsw.limit_in_bytes" - cgroupMemoryLimit = "memory.limit_in_bytes" - cgroupMemoryPagesByNuma = "memory.numa_stat" + cgroupMemorySwapLimit = "memory.memsw.limit_in_bytes" + cgroupMemoryLimit = "memory.limit_in_bytes" ) type MemoryGroup struct { @@ -160,7 +151,7 @@ func (s *MemoryGroup) Set(path string, cgroup *configs.Cgroup) error { func (s *MemoryGroup) GetStats(path string, stats *cgroups.Stats) error { // Set stats from memory.stat. - statsFile, err := os.Open(filepath.Join(path, "memory.stat")) + statsFile, err := fscommon.OpenFile(path, "memory.stat", os.O_RDONLY) if err != nil { if os.IsNotExist(err) { return nil @@ -200,8 +191,7 @@ func (s *MemoryGroup) GetStats(path string, stats *cgroups.Stats) error { } stats.MemoryStats.KernelTCPUsage = kernelTCPUsage - useHierarchy := strings.Join([]string{"memory", "use_hierarchy"}, ".") - value, err := fscommon.GetCgroupParamUint(path, useHierarchy) + value, err := fscommon.GetCgroupParamUint(path, "memory.use_hierarchy") if err != nil { return err } @@ -233,12 +223,14 @@ func getMemoryData(path, name string) (cgroups.MemoryData, error) { moduleName := "memory" if name != "" { - moduleName = strings.Join([]string{"memory", name}, ".") + moduleName = "memory." + name } - usage := strings.Join([]string{moduleName, "usage_in_bytes"}, ".") - maxUsage := strings.Join([]string{moduleName, "max_usage_in_bytes"}, ".") - failcnt := strings.Join([]string{moduleName, "failcnt"}, ".") - limit := strings.Join([]string{moduleName, "limit_in_bytes"}, ".") + var ( + usage = moduleName + ".usage_in_bytes" + maxUsage = moduleName + ".max_usage_in_bytes" + failcnt = moduleName + ".failcnt" + limit = moduleName + ".limit_in_bytes" + ) value, err := fscommon.GetCgroupParamUint(path, usage) if err != nil { @@ -277,47 +269,81 @@ func getMemoryData(path, name string) (cgroups.MemoryData, error) { } func getPageUsageByNUMA(cgroupPath string) (cgroups.PageUsageByNUMA, error) { + const ( + maxColumns = math.MaxUint8 + 1 + filename = "memory.numa_stat" + ) stats := cgroups.PageUsageByNUMA{} - file, err := os.Open(path.Join(cgroupPath, cgroupMemoryPagesByNuma)) + file, err := fscommon.OpenFile(cgroupPath, filename, os.O_RDONLY) if os.IsNotExist(err) { return stats, nil } else if err != nil { return stats, err } + // File format is documented in linux/Documentation/cgroup-v1/memory.txt + // and it looks like this: + // + // total= N0= N1= ... + // file= N0= N1= ... + // anon= N0= N1= ... + // unevictable= N0= N1= ... + // hierarchical_= N0= N1= ... + scanner := bufio.NewScanner(file) for scanner.Scan() { - var statsType string - statsByType := cgroups.PageStats{Nodes: map[uint8]uint64{}} - columns := strings.SplitN(scanner.Text(), numaStatColumnSeparator, numaStatMaxColumns) - - for _, column := range columns { - pagesByNode := strings.SplitN(column, numaStatKeyValueSeparator, numaStatColumnSliceLength) - - if strings.HasPrefix(pagesByNode[numaStatTypeIndex], numaNodeSymbol) { - nodeID, err := strconv.ParseUint(pagesByNode[numaStatTypeIndex][1:], 10, 8) + var field *cgroups.PageStats + + line := scanner.Text() + columns := strings.SplitN(line, " ", maxColumns) + for i, column := range columns { + byNode := strings.SplitN(column, "=", 2) + // Some custom kernels have non-standard fields, like + // numa_locality 0 0 0 0 0 0 0 0 0 0 + // numa_exectime 0 + if len(byNode) < 2 { + if i == 0 { + // Ignore/skip those. + break + } else { + // The first column was already validated, + // so be strict to the rest. + return stats, fmt.Errorf("malformed line %q in %s", + line, filename) + } + } + key, val := byNode[0], byNode[1] + if i == 0 { // First column: key is name, val is total. + field = getNUMAField(&stats, key) + if field == nil { // unknown field (new kernel?) + break + } + field.Total, err = strconv.ParseUint(val, 0, 64) if err != nil { - return cgroups.PageUsageByNUMA{}, err + return stats, err + } + field.Nodes = map[uint8]uint64{} + } else { // Subsequent columns: key is N, val is usage. + if len(key) < 2 || key[0] != 'N' { + // This is definitely an error. + return stats, fmt.Errorf("malformed line %q in %s", + line, filename) } - statsByType.Nodes[uint8(nodeID)], err = strconv.ParseUint(pagesByNode[numaStatValueIndex], 0, 64) + n, err := strconv.ParseUint(key[1:], 10, 8) if err != nil { return cgroups.PageUsageByNUMA{}, err } - } else { - statsByType.Total, err = strconv.ParseUint(pagesByNode[numaStatValueIndex], 0, 64) + + usage, err := strconv.ParseUint(val, 10, 64) if err != nil { return cgroups.PageUsageByNUMA{}, err } - statsType = pagesByNode[numaStatTypeIndex] + field.Nodes[uint8(n)] = usage } - err := addNUMAStatsByType(&stats, statsByType, statsType) - if err != nil { - return cgroups.PageUsageByNUMA{}, err - } } } err = scanner.Err() @@ -328,26 +354,24 @@ func getPageUsageByNUMA(cgroupPath string) (cgroups.PageUsageByNUMA, error) { return stats, nil } -func addNUMAStatsByType(stats *cgroups.PageUsageByNUMA, byTypeStats cgroups.PageStats, statsType string) error { - switch statsType { +func getNUMAField(stats *cgroups.PageUsageByNUMA, name string) *cgroups.PageStats { + switch name { case "total": - stats.Total = byTypeStats + return &stats.Total case "file": - stats.File = byTypeStats + return &stats.File case "anon": - stats.Anon = byTypeStats + return &stats.Anon case "unevictable": - stats.Unevictable = byTypeStats + return &stats.Unevictable case "hierarchical_total": - stats.Hierarchical.Total = byTypeStats + return &stats.Hierarchical.Total case "hierarchical_file": - stats.Hierarchical.File = byTypeStats + return &stats.Hierarchical.File case "hierarchical_anon": - stats.Hierarchical.Anon = byTypeStats + return &stats.Hierarchical.Anon case "hierarchical_unevictable": - stats.Hierarchical.Unevictable = byTypeStats - default: - return fmt.Errorf("unsupported NUMA page type found: %s", statsType) + return &stats.Hierarchical.Unevictable } return nil } diff --git a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/name.go b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/name.go index 9a5af709d249..7cada9149d46 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/name.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/name.go @@ -19,7 +19,7 @@ func (s *NameGroup) Name() string { func (s *NameGroup) Apply(path string, d *cgroupData) error { if s.Join { // ignore errors if the named cgroup does not exist - join(path, d.pid) + _ = join(path, d.pid) } return nil } diff --git a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs2/cpu.go b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs2/cpu.go index edf1060ecb4a..0dffe6648e97 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs2/cpu.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs2/cpu.go @@ -5,7 +5,6 @@ package fs2 import ( "bufio" "os" - "path/filepath" "strconv" "github.com/opencontainers/runc/libcontainer/cgroups" @@ -50,7 +49,7 @@ func setCpu(dirPath string, cgroup *configs.Cgroup) error { return nil } func statCpu(dirPath string, stats *cgroups.Stats) error { - f, err := os.Open(filepath.Join(dirPath, "cpu.stat")) + f, err := fscommon.OpenFile(dirPath, "cpu.stat", os.O_RDONLY) if err != nil { return err } diff --git a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs2/create.go b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs2/create.go index 7be9ece0bf4f..30cf51ee68b6 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs2/create.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs2/create.go @@ -1,19 +1,17 @@ package fs2 import ( - "bytes" "fmt" - "io/ioutil" "os" "path/filepath" "strings" + "github.com/opencontainers/runc/libcontainer/cgroups/fscommon" "github.com/opencontainers/runc/libcontainer/configs" ) -func supportedControllers(cgroup *configs.Cgroup) ([]byte, error) { - const file = UnifiedMountpoint + "/cgroup.controllers" - return ioutil.ReadFile(file) +func supportedControllers(cgroup *configs.Cgroup) (string, error) { + return fscommon.ReadFile(UnifiedMountpoint, "/cgroup.controllers") } // needAnyControllers returns whether we enable some supported controllers or not, @@ -31,7 +29,7 @@ func needAnyControllers(cgroup *configs.Cgroup) (bool, error) { return false, err } avail := make(map[string]struct{}) - for _, ctr := range strings.Fields(string(content)) { + for _, ctr := range strings.Fields(content) { avail[ctr] = struct{}{} } @@ -81,8 +79,12 @@ func CreateCgroupPath(path string, c *configs.Cgroup) (Err error) { return err } - ctrs := bytes.Fields(content) - res := append([]byte("+"), bytes.Join(ctrs, []byte(" +"))...) + const ( + cgTypeFile = "cgroup.type" + cgStCtlFile = "cgroup.subtree_control" + ) + ctrs := strings.Fields(content) + res := "+" + strings.Join(ctrs, " +") elements := strings.Split(path, "/") elements = elements[3:] @@ -103,9 +105,9 @@ func CreateCgroupPath(path string, c *configs.Cgroup) (Err error) { } }() } - cgTypeFile := filepath.Join(current, "cgroup.type") - cgType, _ := ioutil.ReadFile(cgTypeFile) - switch strings.TrimSpace(string(cgType)) { + cgType, _ := fscommon.ReadFile(current, cgTypeFile) + cgType = strings.TrimSpace(cgType) + switch cgType { // If the cgroup is in an invalid mode (usually this means there's an internal // process in the cgroup tree, because we created a cgroup under an // already-populated-by-other-processes cgroup), then we have to error out if @@ -120,7 +122,7 @@ func CreateCgroupPath(path string, c *configs.Cgroup) (Err error) { // since that means we're a properly delegated cgroup subtree) but in // this case there's not much we can do and it's better than giving an // error. - _ = ioutil.WriteFile(cgTypeFile, []byte("threaded"), 0644) + _ = fscommon.WriteFile(current, cgTypeFile, "threaded") } // If the cgroup is in (threaded) or (domain threaded) mode, we can only use thread-aware controllers // (and you cannot usually take a cgroup out of threaded mode). @@ -128,18 +130,17 @@ func CreateCgroupPath(path string, c *configs.Cgroup) (Err error) { fallthrough case "threaded": if containsDomainController(c) { - return fmt.Errorf("cannot enter cgroupv2 %q with domain controllers -- it is in %s mode", current, strings.TrimSpace(string(cgType))) + return fmt.Errorf("cannot enter cgroupv2 %q with domain controllers -- it is in %s mode", current, cgType) } } } // enable all supported controllers if i < len(elements)-1 { - file := filepath.Join(current, "cgroup.subtree_control") - if err := ioutil.WriteFile(file, res, 0644); err != nil { + if err := fscommon.WriteFile(current, cgStCtlFile, res); err != nil { // try write one by one - allCtrs := bytes.Split(res, []byte(" ")) + allCtrs := strings.Split(res, " ") for _, ctr := range allCtrs { - _ = ioutil.WriteFile(file, ctr, 0644) + _ = fscommon.WriteFile(current, cgStCtlFile, ctr) } } // Some controllers might not be enabled when rootless or containerized, diff --git a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs2/devices.go b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs2/devices.go index 053ec33e01a6..4c793a1cc1ad 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs2/devices.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs2/devices.go @@ -6,11 +6,12 @@ import ( "github.com/opencontainers/runc/libcontainer/cgroups/ebpf" "github.com/opencontainers/runc/libcontainer/cgroups/ebpf/devicefilter" "github.com/opencontainers/runc/libcontainer/configs" + "github.com/opencontainers/runc/libcontainer/devices" "github.com/pkg/errors" "golang.org/x/sys/unix" ) -func isRWM(perms configs.DevicePermissions) bool { +func isRWM(perms devices.Permissions) bool { var r, w, m bool for _, perm := range perms { switch perm { @@ -61,7 +62,7 @@ func setDevices(dirPath string, cgroup *configs.Cgroup) error { // // The real issue is that BPF_F_ALLOW_MULTI makes it hard to have a // race-free blacklist because it acts as a whitelist by default, and - // having a deny-everything program cannot be overriden by other + // having a deny-everything program cannot be overridden by other // programs. You could temporarily insert a deny-everything program // but that would result in spurrious failures during updates. if _, err := ebpf.LoadAttachCgroupDeviceFilter(insts, license, dirFD); err != nil { diff --git a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs2/freezer.go b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs2/freezer.go index 213ff65a1114..441531fd77d9 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs2/freezer.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs2/freezer.go @@ -19,7 +19,7 @@ func setFreezer(dirPath string, state configs.FreezerState) error { // freeze the container (since without the freezer cgroup, that's a // no-op). if state == configs.Undefined || state == configs.Thawed { - err = nil + return nil } return errors.Wrap(err, "freezer not supported") } diff --git a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs2/fs2.go b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs2/fs2.go index 7be26211a3dd..3f0b9e0d7e17 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs2/fs2.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs2/fs2.go @@ -3,15 +3,14 @@ package fs2 import ( - "io/ioutil" + "fmt" "os" - "path/filepath" "strings" "github.com/opencontainers/runc/libcontainer/cgroups" + "github.com/opencontainers/runc/libcontainer/cgroups/fscommon" "github.com/opencontainers/runc/libcontainer/configs" "github.com/pkg/errors" - "golang.org/x/sys/unix" ) type manager struct { @@ -52,15 +51,14 @@ func (m *manager) getControllers() error { return nil } - file := filepath.Join(m.dirPath, "cgroup.controllers") - data, err := ioutil.ReadFile(file) + data, err := fscommon.ReadFile(m.dirPath, "cgroup.controllers") if err != nil { if m.rootless && m.config.Path == "" { return nil } return err } - fields := strings.Fields(string(data)) + fields := strings.Fields(data) m.controllers = make(map[string]struct{}, len(fields)) for _, c := range fields { m.controllers[c] = struct{}{} @@ -157,45 +155,8 @@ func (m *manager) Freeze(state configs.FreezerState) error { return nil } -func rmdir(path string) error { - err := unix.Rmdir(path) - if err == nil || err == unix.ENOENT { - return nil - } - return &os.PathError{Op: "rmdir", Path: path, Err: err} -} - -// removeCgroupPath aims to remove cgroup path recursively -// Because there may be subcgroups in it. -func removeCgroupPath(path string) error { - // try the fast path first - if err := rmdir(path); err == nil { - return nil - } - - infos, err := ioutil.ReadDir(path) - if err != nil { - if os.IsNotExist(err) { - err = nil - } - return err - } - for _, info := range infos { - if info.IsDir() { - // We should remove subcgroups dir first - if err = removeCgroupPath(filepath.Join(path, info.Name())); err != nil { - break - } - } - } - if err == nil { - err = rmdir(path) - } - return err -} - func (m *manager) Destroy() error { - return removeCgroupPath(m.dirPath) + return cgroups.RemovePath(m.dirPath) } func (m *manager) Path(_ string) string { @@ -245,10 +206,40 @@ func (m *manager) Set(container *configs.Config) error { if err := setFreezer(m.dirPath, container.Cgroups.Freezer); err != nil { return err } + if err := m.setUnified(container.Cgroups.Unified); err != nil { + return err + } m.config = container.Cgroups return nil } +func (m *manager) setUnified(res map[string]string) error { + for k, v := range res { + if strings.Contains(k, "/") { + return fmt.Errorf("unified resource %q must be a file name (no slashes)", k) + } + if err := fscommon.WriteFile(m.dirPath, k, v); err != nil { + errC := errors.Cause(err) + // Check for both EPERM and ENOENT since O_CREAT is used by WriteFile. + if errors.Is(errC, os.ErrPermission) || errors.Is(errC, os.ErrNotExist) { + // Check if a controller is available, + // to give more specific error if not. + sk := strings.SplitN(k, ".", 2) + if len(sk) != 2 { + return fmt.Errorf("unified resource %q must be in the form CONTROLLER.PARAMETER", k) + } + c := sk[0] + if _, ok := m.controllers[c]; !ok && c != "cgroup" { + return fmt.Errorf("unified resource %q can't be set: controller %q not available", k, c) + } + } + return errors.Wrapf(err, "can't set unified resource %q", k) + } + } + + return nil +} + func (m *manager) GetPaths() map[string]string { paths := make(map[string]string, 1) paths[""] = m.dirPath diff --git a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs2/hugetlb.go b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs2/hugetlb.go index 4a399aaecd5c..18cd411ce08b 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs2/hugetlb.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs2/hugetlb.go @@ -3,10 +3,7 @@ package fs2 import ( - "io/ioutil" - "path/filepath" "strconv" - "strings" "github.com/pkg/errors" @@ -24,7 +21,7 @@ func setHugeTlb(dirPath string, cgroup *configs.Cgroup) error { return nil } for _, hugetlb := range cgroup.Resources.HugetlbLimit { - if err := fscommon.WriteFile(dirPath, strings.Join([]string{"hugetlb", hugetlb.Pagesize, "max"}, "."), strconv.FormatUint(hugetlb.Limit, 10)); err != nil { + if err := fscommon.WriteFile(dirPath, "hugetlb."+hugetlb.Pagesize+".max", strconv.FormatUint(hugetlb.Limit, 10)); err != nil { return err } } @@ -40,22 +37,20 @@ func statHugeTlb(dirPath string, stats *cgroups.Stats) error { hugetlbStats := cgroups.HugetlbStats{} for _, pagesize := range hugePageSizes { - usage := strings.Join([]string{"hugetlb", pagesize, "current"}, ".") - value, err := fscommon.GetCgroupParamUint(dirPath, usage) + value, err := fscommon.GetCgroupParamUint(dirPath, "hugetlb."+pagesize+".current") if err != nil { - return errors.Wrapf(err, "failed to parse hugetlb.%s.current file", pagesize) + return err } hugetlbStats.Usage = value - fileName := strings.Join([]string{"hugetlb", pagesize, "events"}, ".") - filePath := filepath.Join(dirPath, fileName) - contents, err := ioutil.ReadFile(filePath) + fileName := "hugetlb." + pagesize + ".events" + contents, err := fscommon.ReadFile(dirPath, fileName) if err != nil { - return errors.Wrapf(err, "failed to parse hugetlb.%s.events file", pagesize) + return errors.Wrap(err, "failed to read stats") } - _, value, err = fscommon.GetCgroupParamKeyValue(string(contents)) + _, value, err = fscommon.GetCgroupParamKeyValue(contents) if err != nil { - return errors.Wrapf(err, "failed to parse hugetlb.%s.events file", pagesize) + return errors.Wrap(err, "failed to parse "+fileName) } hugetlbStats.Failcnt = value diff --git a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs2/io.go b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs2/io.go index bbe3ac064b36..e01ea001b352 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs2/io.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs2/io.go @@ -5,7 +5,6 @@ package fs2 import ( "bufio" "os" - "path/filepath" "strconv" "strings" @@ -60,8 +59,7 @@ func setIo(dirPath string, cgroup *configs.Cgroup) error { func readCgroup2MapFile(dirPath string, name string) (map[string][]string, error) { ret := map[string][]string{} - p := filepath.Join(dirPath, name) - f, err := os.Open(p) + f, err := fscommon.OpenFile(dirPath, name, os.O_RDONLY) if err != nil { return nil, err } diff --git a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs2/memory.go b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs2/memory.go index 51d12c08653f..1c6913bf0f51 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs2/memory.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs2/memory.go @@ -5,9 +5,7 @@ package fs2 import ( "bufio" "os" - "path/filepath" "strconv" - "strings" "github.com/opencontainers/runc/libcontainer/cgroups" "github.com/opencontainers/runc/libcontainer/cgroups/fscommon" @@ -76,7 +74,7 @@ func setMemory(dirPath string, cgroup *configs.Cgroup) error { func statMemory(dirPath string, stats *cgroups.Stats) error { // Set stats from memory.stat. - statsFile, err := os.Open(filepath.Join(dirPath, "memory.stat")) + statsFile, err := fscommon.OpenFile(dirPath, "memory.stat", os.O_RDONLY) if err != nil { return err } @@ -112,10 +110,10 @@ func getMemoryDataV2(path, name string) (cgroups.MemoryData, error) { moduleName := "memory" if name != "" { - moduleName = strings.Join([]string{"memory", name}, ".") + moduleName = "memory." + name } - usage := strings.Join([]string{moduleName, "current"}, ".") - limit := strings.Join([]string{moduleName, "max"}, ".") + usage := moduleName + ".current" + limit := moduleName + ".max" value, err := fscommon.GetCgroupParamUint(path, usage) if err != nil { diff --git a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs2/pids.go b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs2/pids.go index b8153d283985..16e1c21957ad 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs2/pids.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs2/pids.go @@ -3,7 +3,6 @@ package fs2 import ( - "io/ioutil" "path/filepath" "strings" @@ -34,15 +33,15 @@ func setPids(dirPath string, cgroup *configs.Cgroup) error { func statPidsWithoutController(dirPath string, stats *cgroups.Stats) error { // if the controller is not enabled, let's read PIDS from cgroups.procs // (or threads if cgroup.threads is enabled) - contents, err := ioutil.ReadFile(filepath.Join(dirPath, "cgroup.procs")) + contents, err := fscommon.ReadFile(dirPath, "cgroup.procs") if errors.Is(err, unix.ENOTSUP) { - contents, err = ioutil.ReadFile(filepath.Join(dirPath, "cgroup.threads")) + contents, err = fscommon.ReadFile(dirPath, "cgroup.threads") } if err != nil { return err } pids := make(map[string]string) - for _, i := range strings.Split(string(contents), "\n") { + for _, i := range strings.Split(contents, "\n") { if i != "" { pids[i] = i } diff --git a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fscommon/fscommon.go b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fscommon/fscommon.go index 46e06dc62d36..ae2613cdbd1e 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fscommon/fscommon.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fscommon/fscommon.go @@ -3,46 +3,47 @@ package fscommon import ( - "io/ioutil" + "bytes" "os" - securejoin "github.com/cyphar/filepath-securejoin" "github.com/pkg/errors" "github.com/sirupsen/logrus" "golang.org/x/sys/unix" ) +// WriteFile writes data to a cgroup file in dir. +// It is supposed to be used for cgroup files only. func WriteFile(dir, file, data string) error { - if dir == "" { - return errors.Errorf("no directory specified for %s", file) - } - path, err := securejoin.SecureJoin(dir, file) + fd, err := OpenFile(dir, file, unix.O_WRONLY) if err != nil { return err } - if err := retryingWriteFile(path, []byte(data), 0700); err != nil { - return errors.Wrapf(err, "failed to write %q to %q", data, path) + defer fd.Close() + if err := retryingWriteFile(fd, data); err != nil { + return errors.Wrapf(err, "failed to write %q", data) } return nil } +// ReadFile reads data from a cgroup file in dir. +// It is supposed to be used for cgroup files only. func ReadFile(dir, file string) (string, error) { - if dir == "" { - return "", errors.Errorf("no directory specified for %s", file) - } - path, err := securejoin.SecureJoin(dir, file) + fd, err := OpenFile(dir, file, unix.O_RDONLY) if err != nil { return "", err } - data, err := ioutil.ReadFile(path) - return string(data), err + defer fd.Close() + var buf bytes.Buffer + + _, err = buf.ReadFrom(fd) + return buf.String(), err } -func retryingWriteFile(filename string, data []byte, perm os.FileMode) error { +func retryingWriteFile(fd *os.File, data string) error { for { - err := ioutil.WriteFile(filename, data, perm) + _, err := fd.Write([]byte(data)) if errors.Is(err, unix.EINTR) { - logrus.Infof("interrupted while writing %s to %s", string(data), filename) + logrus.Infof("interrupted while writing %s to %s", data, fd.Name()) continue } return err diff --git a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fscommon/open.go b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fscommon/open.go new file mode 100644 index 000000000000..0a7e3d952820 --- /dev/null +++ b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fscommon/open.go @@ -0,0 +1,103 @@ +package fscommon + +import ( + "os" + "strings" + "sync" + + securejoin "github.com/cyphar/filepath-securejoin" + "github.com/pkg/errors" + "github.com/sirupsen/logrus" + "golang.org/x/sys/unix" +) + +const ( + cgroupfsDir = "/sys/fs/cgroup" + cgroupfsPrefix = cgroupfsDir + "/" +) + +var ( + // Set to true by fs unit tests + TestMode bool + + cgroupFd int = -1 + prepOnce sync.Once + prepErr error + resolveFlags uint64 +) + +func prepareOpenat2() error { + prepOnce.Do(func() { + fd, err := unix.Openat2(-1, cgroupfsDir, &unix.OpenHow{ + Flags: unix.O_DIRECTORY | unix.O_PATH}) + if err != nil { + prepErr = &os.PathError{Op: "openat2", Path: cgroupfsDir, Err: err} + if err != unix.ENOSYS { + logrus.Warnf("falling back to securejoin: %s", prepErr) + } else { + logrus.Debug("openat2 not available, falling back to securejoin") + } + return + } + var st unix.Statfs_t + if err = unix.Fstatfs(fd, &st); err != nil { + prepErr = &os.PathError{Op: "statfs", Path: cgroupfsDir, Err: err} + logrus.Warnf("falling back to securejoin: %s", prepErr) + return + } + + cgroupFd = fd + + resolveFlags = unix.RESOLVE_BENEATH | unix.RESOLVE_NO_MAGICLINKS + if st.Type == unix.CGROUP2_SUPER_MAGIC { + // cgroupv2 has a single mountpoint and no "cpu,cpuacct" symlinks + resolveFlags |= unix.RESOLVE_NO_XDEV | unix.RESOLVE_NO_SYMLINKS + } + + }) + + return prepErr +} + +// OpenFile opens a cgroup file in a given dir with given flags. +// It is supposed to be used for cgroup files only. +func OpenFile(dir, file string, flags int) (*os.File, error) { + if dir == "" { + return nil, errors.Errorf("no directory specified for %s", file) + } + mode := os.FileMode(0) + if TestMode && flags&os.O_WRONLY != 0 { + // "emulate" cgroup fs for unit tests + flags |= os.O_TRUNC | os.O_CREATE + mode = 0o600 + } + reldir := strings.TrimPrefix(dir, cgroupfsPrefix) + if len(reldir) == len(dir) { // non-standard path, old system? + return openWithSecureJoin(dir, file, flags, mode) + } + if prepareOpenat2() != nil { + return openWithSecureJoin(dir, file, flags, mode) + } + + relname := reldir + "/" + file + fd, err := unix.Openat2(cgroupFd, relname, + &unix.OpenHow{ + Resolve: resolveFlags, + Flags: uint64(flags) | unix.O_CLOEXEC, + Mode: uint64(mode), + }) + if err != nil { + return nil, &os.PathError{Op: "openat2", Path: dir + "/" + file, Err: err} + } + + return os.NewFile(uintptr(fd), cgroupfsPrefix+relname), nil +} + +func openWithSecureJoin(dir, file string, flags int, mode os.FileMode) (*os.File, error) { + path, err := securejoin.SecureJoin(dir, file) + if err != nil { + return nil, err + } + + return os.OpenFile(path, flags, mode) +} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fscommon/utils.go b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fscommon/utils.go index 46c3c7799ee5..2e4e837f2b8e 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fscommon/utils.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fscommon/utils.go @@ -5,9 +5,7 @@ package fscommon import ( "errors" "fmt" - "io/ioutil" "math" - "path/filepath" "strconv" "strings" ) @@ -16,8 +14,9 @@ var ( ErrNotValidFormat = errors.New("line is not a valid key value format") ) -// Saturates negative values at zero and returns a uint64. -// Due to kernel bugs, some of the memory cgroup stats can be negative. +// ParseUint converts a string to an uint64 integer. +// Negative values are returned at zero as, due to kernel bugs, +// some of the memory cgroup stats can be negative. func ParseUint(s string, base, bitSize int) (uint64, error) { value, err := strconv.ParseUint(s, base, bitSize) if err != nil { @@ -36,15 +35,16 @@ func ParseUint(s string, base, bitSize int) (uint64, error) { return value, nil } -// Parses a cgroup param and returns as name, value -// i.e. "io_service_bytes 1234" will return as io_service_bytes, 1234 +// GetCgroupParamKeyValue parses a space-separated "name value" kind of cgroup +// parameter and returns its components. For example, "io_service_bytes 1234" +// will return as "io_service_bytes", 1234. func GetCgroupParamKeyValue(t string) (string, uint64, error) { parts := strings.Fields(t) switch len(parts) { case 2: value, err := ParseUint(parts[1], 10, 64) if err != nil { - return "", 0, fmt.Errorf("unable to convert param value (%q) to uint64: %v", parts[1], err) + return "", 0, fmt.Errorf("unable to convert to uint64: %v", err) } return parts[0], value, nil @@ -53,31 +53,50 @@ func GetCgroupParamKeyValue(t string) (string, uint64, error) { } } -// Gets a single uint64 value from the specified cgroup file. -func GetCgroupParamUint(cgroupPath, cgroupFile string) (uint64, error) { - fileName := filepath.Join(cgroupPath, cgroupFile) - contents, err := ioutil.ReadFile(fileName) +// GetCgroupParamUint reads a single uint64 value from the specified cgroup file. +// If the value read is "max", the math.MaxUint64 is returned. +func GetCgroupParamUint(path, file string) (uint64, error) { + contents, err := GetCgroupParamString(path, file) if err != nil { return 0, err } - trimmed := strings.TrimSpace(string(contents)) - if trimmed == "max" { + contents = strings.TrimSpace(contents) + if contents == "max" { return math.MaxUint64, nil } - res, err := ParseUint(trimmed, 10, 64) + res, err := ParseUint(contents, 10, 64) if err != nil { - return res, fmt.Errorf("unable to parse %q as a uint from Cgroup file %q", string(contents), fileName) + return res, fmt.Errorf("unable to parse file %q", path+"/"+file) } return res, nil } -// Gets a string value from the specified cgroup file -func GetCgroupParamString(cgroupPath, cgroupFile string) (string, error) { - contents, err := ioutil.ReadFile(filepath.Join(cgroupPath, cgroupFile)) +// GetCgroupParamInt reads a single int64 value from specified cgroup file. +// If the value read is "max", the math.MaxInt64 is returned. +func GetCgroupParamInt(path, file string) (int64, error) { + contents, err := ReadFile(path, file) + if err != nil { + return 0, err + } + contents = strings.TrimSpace(contents) + if contents == "max" { + return math.MaxInt64, nil + } + + res, err := strconv.ParseInt(contents, 10, 64) + if err != nil { + return res, fmt.Errorf("unable to parse %q as a int from Cgroup file %q", contents, path+"/"+file) + } + return res, nil +} + +// GetCgroupParamString reads a string from the specified cgroup file. +func GetCgroupParamString(path, file string) (string, error) { + contents, err := ReadFile(path, file) if err != nil { return "", err } - return strings.TrimSpace(string(contents)), nil + return strings.TrimSpace(contents), nil } diff --git a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/stats.go b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/stats.go index 7ac81660595e..e7f9c462635c 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/stats.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/stats.go @@ -39,6 +39,33 @@ type CpuStats struct { ThrottlingData ThrottlingData `json:"throttling_data,omitempty"` } +type CPUSetStats struct { + // List of the physical numbers of the CPUs on which processes + // in that cpuset are allowed to execute + CPUs []uint16 `json:"cpus,omitempty"` + // cpu_exclusive flag + CPUExclusive uint64 `json:"cpu_exclusive"` + // List of memory nodes on which processes in that cpuset + // are allowed to allocate memory + Mems []uint16 `json:"mems,omitempty"` + // mem_hardwall flag + MemHardwall uint64 `json:"mem_hardwall"` + // mem_exclusive flag + MemExclusive uint64 `json:"mem_exclusive"` + // memory_migrate flag + MemoryMigrate uint64 `json:"memory_migrate"` + // memory_spread page flag + MemorySpreadPage uint64 `json:"memory_spread_page"` + // memory_spread slab flag + MemorySpreadSlab uint64 `json:"memory_spread_slab"` + // memory_pressure + MemoryPressure uint64 `json:"memory_pressure"` + // sched_load balance flag + SchedLoadBalance uint64 `json:"sched_load_balance"` + // sched_relax_domain_level + SchedRelaxDomainLevel int64 `json:"sched_relax_domain_level"` +} + type MemoryData struct { Usage uint64 `json:"usage,omitempty"` MaxUsage uint64 `json:"max_usage,omitempty"` @@ -121,6 +148,7 @@ type HugetlbStats struct { type Stats struct { CpuStats CpuStats `json:"cpu_stats,omitempty"` + CPUSetStats CPUSetStats `json:"cpuset_stats,omitempty"` MemoryStats MemoryStats `json:"memory_stats,omitempty"` PidsStats PidsStats `json:"pids_stats,omitempty"` BlkioStats BlkioStats `json:"blkio_stats,omitempty"` diff --git a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/systemd/common.go b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/systemd/common.go index b567f3e1fcb0..6d5def71257c 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/systemd/common.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/systemd/common.go @@ -13,12 +13,20 @@ import ( systemdDbus "github.com/coreos/go-systemd/v22/dbus" dbus "github.com/godbus/dbus/v5" - "github.com/opencontainers/runc/libcontainer/cgroups/devices" + cgroupdevices "github.com/opencontainers/runc/libcontainer/cgroups/devices" "github.com/opencontainers/runc/libcontainer/configs" + "github.com/opencontainers/runc/libcontainer/devices" "github.com/pkg/errors" "github.com/sirupsen/logrus" ) +const ( + // Default kernel value for cpu quota period is 100000 us (100 ms), same for v1 and v2. + // v1: https://www.kernel.org/doc/html/latest/scheduler/sched-bwc.html and + // v2: https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html + defCPUQuotaPeriod = uint64(100000) +) + var ( connOnce sync.Once connDbus *systemdDbus.Conn @@ -26,7 +34,6 @@ var ( versionOnce sync.Once version int - versionErr error isRunningSystemdOnce sync.Once isRunningSystemd bool @@ -81,11 +88,11 @@ func ExpandSlice(slice string) (string, error) { return path, nil } -func groupPrefix(ruleType configs.DeviceType) (string, error) { +func groupPrefix(ruleType devices.Type) (string, error) { switch ruleType { - case configs.BlockDevice: + case devices.BlockDevice: return "block-", nil - case configs.CharDevice: + case devices.CharDevice: return "char-", nil default: return "", errors.Errorf("device type %v has no group prefix", ruleType) @@ -93,10 +100,10 @@ func groupPrefix(ruleType configs.DeviceType) (string, error) { } // findDeviceGroup tries to find the device group name (as listed in -// /proc/devices) with the type prefixed as requried for DeviceAllow, for a +// /proc/devices) with the type prefixed as required for DeviceAllow, for a // given (type, major) combination. If more than one device group exists, an // arbitrary one is chosen. -func findDeviceGroup(ruleType configs.DeviceType, ruleMajor int64) (string, error) { +func findDeviceGroup(ruleType devices.Type, ruleMajor int64) (string, error) { fh, err := os.Open("/proc/devices") if err != nil { return "", err @@ -109,7 +116,7 @@ func findDeviceGroup(ruleType configs.DeviceType, ruleMajor int64) (string, erro } scanner := bufio.NewScanner(fh) - var currentType configs.DeviceType + var currentType devices.Type for scanner.Scan() { // We need to strip spaces because the first number is column-aligned. line := strings.TrimSpace(scanner.Text()) @@ -117,10 +124,10 @@ func findDeviceGroup(ruleType configs.DeviceType, ruleMajor int64) (string, erro // Handle the "header" lines. switch line { case "Block devices:": - currentType = configs.BlockDevice + currentType = devices.BlockDevice continue case "Character devices:": - currentType = configs.CharDevice + currentType = devices.CharDevice continue case "": continue @@ -156,7 +163,7 @@ func findDeviceGroup(ruleType configs.DeviceType, ruleMajor int64) (string, erro // generateDeviceProperties takes the configured device rules and generates a // corresponding set of systemd properties to configure the devices correctly. -func generateDeviceProperties(rules []*configs.DeviceRule) ([]systemdDbus.Property, error) { +func generateDeviceProperties(rules []*devices.Rule) ([]systemdDbus.Property, error) { // DeviceAllow is the type "a(ss)" which means we need a temporary struct // to represent it in Go. type deviceAllowEntry struct { @@ -172,7 +179,7 @@ func generateDeviceProperties(rules []*configs.DeviceRule) ([]systemdDbus.Proper } // Figure out the set of rules. - configEmu := &devices.Emulator{} + configEmu := &cgroupdevices.Emulator{} for _, rule := range rules { if err := configEmu.Apply(*rule); err != nil { return nil, errors.Wrap(err, "apply rule for systemd") @@ -199,7 +206,7 @@ func generateDeviceProperties(rules []*configs.DeviceRule) ([]systemdDbus.Proper // Now generate the set of rules we actually need to apply. Unlike the // normal devices cgroup, in "strict" mode systemd defaults to a deny-all // whitelist which is the default for devices.Emulator. - baseEmu := &devices.Emulator{} + baseEmu := &cgroupdevices.Emulator{} finalRules, err := baseEmu.Transition(configEmu) if err != nil { return nil, errors.Wrap(err, "get simplified rules for systemd") @@ -211,7 +218,7 @@ func generateDeviceProperties(rules []*configs.DeviceRule) ([]systemdDbus.Proper return nil, errors.Errorf("[internal error] cannot add deny rule to systemd DeviceAllow list: %v", *rule) } switch rule.Type { - case configs.BlockDevice, configs.CharDevice: + case devices.BlockDevice, devices.CharDevice: default: // Should never happen. return nil, errors.Errorf("invalid device type for DeviceAllow: %v", rule.Type) @@ -243,9 +250,9 @@ func generateDeviceProperties(rules []*configs.DeviceRule) ([]systemdDbus.Proper // so we'll give a warning in that case (note that the fallback code // will insert any rules systemd couldn't handle). What amazing fun. - if rule.Major == configs.Wildcard { + if rule.Major == devices.Wildcard { // "_ *:n _" rules aren't supported by systemd. - if rule.Minor != configs.Wildcard { + if rule.Minor != devices.Wildcard { logrus.Warnf("systemd doesn't support '*:n' device rules -- temporarily ignoring rule: %v", *rule) continue } @@ -256,7 +263,7 @@ func generateDeviceProperties(rules []*configs.DeviceRule) ([]systemdDbus.Proper return nil, err } entry.Path = prefix + "*" - } else if rule.Minor == configs.Wildcard { + } else if rule.Minor == devices.Wildcard { // "_ n:* _" rules require a device group from /proc/devices. group, err := findDeviceGroup(rule.Type, rule.Major) if err != nil { @@ -271,9 +278,9 @@ func generateDeviceProperties(rules []*configs.DeviceRule) ([]systemdDbus.Proper } else { // "_ n:m _" rules are just a path in /dev/{block,char}/. switch rule.Type { - case configs.BlockDevice: + case devices.BlockDevice: entry.Path = fmt.Sprintf("/dev/block/%d:%d", rule.Major, rule.Minor) - case configs.CharDevice: + case devices.CharDevice: entry.Path = fmt.Sprintf("/dev/char/%d:%d", rule.Major, rule.Minor) } } @@ -307,7 +314,7 @@ func newProp(name string, units interface{}) systemdDbus.Property { func getUnitName(c *configs.Cgroup) string { // by default, we create a scope unless the user explicitly asks for a slice. if !strings.HasSuffix(c.Name, ".slice") { - return fmt.Sprintf("%s-%s.scope", c.ScopePrefix, c.Name) + return c.ScopePrefix + "-" + c.Name + ".scope" } return c.Name } @@ -325,6 +332,9 @@ func isUnitExists(err error) bool { func startUnit(dbusConnection *systemdDbus.Conn, unitName string, properties []systemdDbus.Property) error { statusChan := make(chan string, 1) if _, err := dbusConnection.StartTransientUnit(unitName, "replace", properties, statusChan); err == nil { + timeout := time.NewTimer(30 * time.Second) + defer timeout.Stop() + select { case s := <-statusChan: close(statusChan) @@ -333,8 +343,9 @@ func startUnit(dbusConnection *systemdDbus.Conn, unitName string, properties []s dbusConnection.ResetFailedUnit(unitName) return errors.Errorf("error creating systemd unit `%s`: got `%s`", unitName, s) } - case <-time.After(time.Second): - logrus.Warnf("Timed out while waiting for StartTransientUnit(%s) completion signal from dbus. Continuing...", unitName) + case <-timeout.C: + dbusConnection.ResetFailedUnit(unitName) + return errors.New("Timeout waiting for systemd to create " + unitName) } } else if !isUnitExists(err) { return err @@ -360,20 +371,20 @@ func stopUnit(dbusConnection *systemdDbus.Conn, unitName string) error { return nil } -func systemdVersion(conn *systemdDbus.Conn) (int, error) { +func systemdVersion(conn *systemdDbus.Conn) int { versionOnce.Do(func() { version = -1 verStr, err := conn.GetManagerProperty("Version") - if err != nil { - versionErr = err - return + if err == nil { + version, err = systemdVersionAtoi(verStr) } - version, versionErr = systemdVersionAtoi(verStr) - return + if err != nil { + logrus.WithError(err).Error("unable to get systemd version") + } }) - return version, versionErr + return version } func systemdVersionAtoi(verStr string) (int, error) { @@ -394,12 +405,13 @@ func systemdVersionAtoi(verStr string) (int, error) { func addCpuQuota(conn *systemdDbus.Conn, properties *[]systemdDbus.Property, quota int64, period uint64) { if period != 0 { // systemd only supports CPUQuotaPeriodUSec since v242 - sdVer, err := systemdVersion(conn) - if err != nil { - logrus.Warnf("systemdVersion: %s", err) - } else if sdVer >= 242 { + sdVer := systemdVersion(conn) + if sdVer >= 242 { *properties = append(*properties, newProp("CPUQuotaPeriodUSec", period)) + } else { + logrus.Debugf("systemd v%d is too old to support CPUQuotaPeriodSec "+ + " (setting will still be applied to cgroupfs)", sdVer) } } if quota != 0 || period != 0 { @@ -407,10 +419,8 @@ func addCpuQuota(conn *systemdDbus.Conn, properties *[]systemdDbus.Property, quo cpuQuotaPerSecUSec := uint64(math.MaxUint64) if quota > 0 { if period == 0 { - // assume the default kernel value of 100000 us (100 ms), same for v1 and v2. - // v1: https://www.kernel.org/doc/html/latest/scheduler/sched-bwc.html and - // v2: https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html - period = 100000 + // assume the default + period = defCPUQuotaPeriod } // systemd converts CPUQuotaPerSecUSec (microseconds per CPU second) to CPUQuota // (integer percentage of CPU) internally. This means that if a fractional percent of @@ -425,3 +435,37 @@ func addCpuQuota(conn *systemdDbus.Conn, properties *[]systemdDbus.Property, quo newProp("CPUQuotaPerSecUSec", cpuQuotaPerSecUSec)) } } + +func addCpuset(conn *systemdDbus.Conn, props *[]systemdDbus.Property, cpus, mems string) error { + if cpus == "" && mems == "" { + return nil + } + + // systemd only supports AllowedCPUs/AllowedMemoryNodes since v244 + sdVer := systemdVersion(conn) + if sdVer < 244 { + logrus.Debugf("systemd v%d is too old to support AllowedCPUs/AllowedMemoryNodes"+ + " (settings will still be applied to cgroupfs)", sdVer) + return nil + } + + if cpus != "" { + bits, err := rangeToBits(cpus) + if err != nil { + return fmt.Errorf("resources.CPU.Cpus=%q conversion error: %w", + cpus, err) + } + *props = append(*props, + newProp("AllowedCPUs", bits)) + } + if mems != "" { + bits, err := rangeToBits(mems) + if err != nil { + return fmt.Errorf("resources.CPU.Mems=%q conversion error: %w", + mems, err) + } + *props = append(*props, + newProp("AllowedMemoryNodes", bits)) + } + return nil +} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/systemd/cpuset.go b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/systemd/cpuset.go new file mode 100644 index 000000000000..070982188831 --- /dev/null +++ b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/systemd/cpuset.go @@ -0,0 +1,67 @@ +package systemd + +import ( + "encoding/binary" + "strconv" + "strings" + + "github.com/pkg/errors" + "github.com/willf/bitset" +) + +// rangeToBits converts a text representation of a CPU mask (as written to +// or read from cgroups' cpuset.* files, e.g. "1,3-5") to a slice of bytes +// with the corresponding bits set (as consumed by systemd over dbus as +// AllowedCPUs/AllowedMemoryNodes unit property value). +func rangeToBits(str string) ([]byte, error) { + bits := &bitset.BitSet{} + + for _, r := range strings.Split(str, ",") { + // allow extra spaces around + r = strings.TrimSpace(r) + // allow empty elements (extra commas) + if r == "" { + continue + } + ranges := strings.SplitN(r, "-", 2) + if len(ranges) > 1 { + start, err := strconv.ParseUint(ranges[0], 10, 32) + if err != nil { + return nil, err + } + end, err := strconv.ParseUint(ranges[1], 10, 32) + if err != nil { + return nil, err + } + if start > end { + return nil, errors.New("invalid range: " + r) + } + for i := uint(start); i <= uint(end); i++ { + bits.Set(i) + } + } else { + val, err := strconv.ParseUint(ranges[0], 10, 32) + if err != nil { + return nil, err + } + bits.Set(uint(val)) + } + } + + val := bits.Bytes() + if len(val) == 0 { + // do not allow empty values + return nil, errors.New("empty value") + } + ret := make([]byte, len(val)*8) + for i := range val { + // bitset uses BigEndian internally + binary.BigEndian.PutUint64(ret[i*8:], val[len(val)-1-i]) + } + // remove upper all-zero bytes + for ret[0] == 0 { + ret = ret[1:] + } + + return ret, nil +} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/systemd/user.go b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/systemd/user.go index cb070cec8b72..8fe91688477b 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/systemd/user.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/systemd/user.go @@ -57,7 +57,7 @@ func DetectUID() (int, error) { } b, err := exec.Command("busctl", "--user", "--no-pager", "status").CombinedOutput() if err != nil { - return -1, errors.Wrap(err, "could not execute `busctl --user --no-pager status`") + return -1, errors.Wrapf(err, "could not execute `busctl --user --no-pager status`: %q", string(b)) } scanner := bufio.NewScanner(bytes.NewReader(b)) for scanner.Scan() { @@ -102,5 +102,5 @@ func DetectUserDbusSessionBusAddress() (string, error) { return strings.TrimPrefix(s, "DBUS_SESSION_BUS_ADDRESS="), nil } } - return "", errors.New("could not detect DBUS_SESSION_BUS_ADDRESS from `systemctl --user --no-pager show-environment`") + return "", errors.New("could not detect DBUS_SESSION_BUS_ADDRESS from `systemctl --user --no-pager show-environment`. Make sure you have installed the dbus-user-session or dbus-daemon package and then run: `systemctl --user start dbus`") } diff --git a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/systemd/v1.go b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/systemd/v1.go index 7217b0af79cb..64af1d94b3e3 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/systemd/v1.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/systemd/v1.go @@ -4,7 +4,6 @@ package systemd import ( "errors" - "io/ioutil" "os" "path/filepath" "strings" @@ -13,6 +12,7 @@ import ( systemdDbus "github.com/coreos/go-systemd/v22/dbus" "github.com/opencontainers/runc/libcontainer/cgroups" "github.com/opencontainers/runc/libcontainer/cgroups/fs" + "github.com/opencontainers/runc/libcontainer/cgroups/fscommon" "github.com/opencontainers/runc/libcontainer/configs" "github.com/sirupsen/logrus" ) @@ -90,6 +90,11 @@ func genV1ResourcesProperties(c *configs.Cgroup, conn *systemdDbus.Conn) ([]syst newProp("TasksMax", uint64(r.PidsLimit))) } + err = addCpuset(conn, &properties, r.CpusetCpus, r.CpusetMems) + if err != nil { + return nil, err + } + return properties, nil } @@ -101,20 +106,23 @@ func (m *legacyManager) Apply(pid int) error { properties []systemdDbus.Property ) + if c.Resources.Unified != nil { + return cgroups.ErrV1NoUnified + } + m.mu.Lock() defer m.mu.Unlock() if c.Paths != nil { paths := make(map[string]string) + cgMap, err := cgroups.ParseCgroupFile("/proc/self/cgroup") + if err != nil { + return err + } + // XXX(kolyshkin@): why this check is needed? for name, path := range c.Paths { - _, err := getSubsystemPath(m.cgroups, name) - if err != nil { - // Don't fail if a cgroup hierarchy was not found, just skip this subsystem - if cgroups.IsNotFound(err) { - continue - } - return err + if _, ok := cgMap[name]; ok { + paths[name] = path } - paths[name] = path } m.paths = paths return cgroups.EnterPid(m.paths, pid) @@ -179,14 +187,16 @@ func (m *legacyManager) Apply(pid int) error { return err } - if err := joinCgroups(c, pid); err != nil { - return err - } - paths := make(map[string]string) for _, s := range legacySubsystems { subsystemPath, err := getSubsystemPath(m.cgroups, s.Name()) if err != nil { + // Even if it's `not found` error, we'll return err + // because devices cgroup is hard requirement for + // container security. + if s.Name() == "devices" { + return err + } // Don't fail if a cgroup hierarchy was not found, just skip this subsystem if cgroups.IsNotFound(err) { continue @@ -196,6 +206,11 @@ func (m *legacyManager) Apply(pid int) error { paths[s.Name()] = subsystemPath } m.paths = paths + + if err := m.joinCgroups(pid); err != nil { + return err + } + return nil } @@ -212,17 +227,14 @@ func (m *legacyManager) Destroy() error { } unitName := getUnitName(m.cgroups) - err = stopUnit(dbusConnection, unitName) + stopErr := stopUnit(dbusConnection, unitName) // Both on success and on error, cleanup all the cgroups we are aware of. // Some of them were created directly by Apply() and are not managed by systemd. if err := cgroups.RemovePaths(m.paths); err != nil { return err } - if err != nil { - return err - } - m.paths = make(map[string]string) - return nil + + return stopErr } func (m *legacyManager) Path(subsys string) string { @@ -231,48 +243,25 @@ func (m *legacyManager) Path(subsys string) string { return m.paths[subsys] } -func join(c *configs.Cgroup, subsystem string, pid int) (string, error) { - path, err := getSubsystemPath(c, subsystem) - if err != nil { - return "", err - } - - if err := os.MkdirAll(path, 0755); err != nil { - return "", err - } - if err := cgroups.WriteCgroupProc(path, pid); err != nil { - return "", err - } - return path, nil -} - -func joinCgroups(c *configs.Cgroup, pid int) error { +func (m *legacyManager) joinCgroups(pid int) error { for _, sys := range legacySubsystems { name := sys.Name() switch name { case "name=systemd": // let systemd handle this case "cpuset": - path, err := getSubsystemPath(c, name) - if err != nil && !cgroups.IsNotFound(err) { - return err - } - s := &fs.CpusetGroup{} - if err := s.ApplyDir(path, c, pid); err != nil { - return err + if path, ok := m.paths[name]; ok { + s := &fs.CpusetGroup{} + if err := s.ApplyDir(path, m.cgroups, pid); err != nil { + return err + } } default: - _, err := join(c, name, pid) - if err != nil { - // Even if it's `not found` error, we'll return err - // because devices cgroup is hard requirement for - // container security. - if name == "devices" { + if path, ok := m.paths[name]; ok { + if err := os.MkdirAll(path, 0755); err != nil { return err } - // For other subsystems, omit the `not found` error - // because they are optional. - if !cgroups.IsNotFound(err) { + if err := cgroups.WriteCgroupProc(path, pid); err != nil { return err } } @@ -283,7 +272,7 @@ func joinCgroups(c *configs.Cgroup, pid int) error { } func getSubsystemPath(c *configs.Cgroup, subsystem string) (string, error) { - mountpoint, err := cgroups.FindCgroupMountpoint(c.Path, subsystem) + mountpoint, err := cgroups.FindCgroupMountpoint("", subsystem) if err != nil { return "", err } @@ -309,15 +298,14 @@ func getSubsystemPath(c *configs.Cgroup, subsystem string) (string, error) { } func (m *legacyManager) Freeze(state configs.FreezerState) error { - path, err := getSubsystemPath(m.cgroups, "freezer") - if err != nil { - return err + path, ok := m.paths["freezer"] + if !ok { + return errSubsystemDoesNotExist } prevState := m.cgroups.Resources.Freezer m.cgroups.Resources.Freezer = state freezer := &fs.FreezerGroup{} - err = freezer.Set(path, m.cgroups) - if err != nil { + if err := freezer.Set(path, m.cgroups); err != nil { m.cgroups.Resources.Freezer = prevState return err } @@ -325,17 +313,17 @@ func (m *legacyManager) Freeze(state configs.FreezerState) error { } func (m *legacyManager) GetPids() ([]int, error) { - path, err := getSubsystemPath(m.cgroups, "devices") - if err != nil { - return nil, err + path, ok := m.paths["devices"] + if !ok { + return nil, errSubsystemDoesNotExist } return cgroups.GetPids(path) } func (m *legacyManager) GetAllPids() ([]int, error) { - path, err := getSubsystemPath(m.cgroups, "devices") - if err != nil { - return nil, err + path, ok := m.paths["devices"] + if !ok { + return nil, errSubsystemDoesNotExist } return cgroups.GetAllPids(path) } @@ -363,6 +351,9 @@ func (m *legacyManager) Set(container *configs.Config) error { if m.cgroups.Paths != nil { return nil } + if container.Cgroups.Resources.Unified != nil { + return cgroups.ErrV1NoUnified + } dbusConnection, err := getDbusConnection(false) if err != nil { return err @@ -406,9 +397,9 @@ func (m *legacyManager) Set(container *configs.Config) error { for _, sys := range legacySubsystems { // Get the subsystem path, but don't error out for not found cgroups. - path, err := getSubsystemPath(container.Cgroups, sys.Name()) - if err != nil && !cgroups.IsNotFound(err) { - return err + path, ok := m.paths[sys.Name()] + if !ok { + continue } if err := sys.Set(path, container.Cgroups); err != nil { return err @@ -420,7 +411,10 @@ func (m *legacyManager) Set(container *configs.Config) error { func enableKmem(c *configs.Cgroup) error { path, err := getSubsystemPath(c, "memory") - if err != nil && !cgroups.IsNotFound(err) { + if err != nil { + if cgroups.IsNotFound(err) { + return nil + } return err } @@ -429,7 +423,7 @@ func enableKmem(c *configs.Cgroup) error { } // do not try to enable the kernel memory if we already have // tasks in the cgroup. - content, err := ioutil.ReadFile(filepath.Join(path, "tasks")) + content, err := fscommon.ReadFile(path, "tasks") if err != nil { return err } @@ -450,9 +444,9 @@ func (m *legacyManager) GetCgroups() (*configs.Cgroup, error) { } func (m *legacyManager) GetFreezerState() (configs.FreezerState, error) { - path, err := getSubsystemPath(m.cgroups, "freezer") - if err != nil && !cgroups.IsNotFound(err) { - return configs.Undefined, err + path, ok := m.paths["freezer"] + if !ok { + return configs.Undefined, nil } freezer := &fs.FreezerGroup{} return freezer.GetState(path) diff --git a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/systemd/v2.go b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/systemd/v2.go index e1a6622a0d3d..70b5b368e862 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/systemd/v2.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/systemd/v2.go @@ -3,6 +3,8 @@ package systemd import ( + "fmt" + "math" "os" "path/filepath" "strconv" @@ -34,6 +36,133 @@ func NewUnifiedManager(config *configs.Cgroup, path string, rootless bool) cgrou } } +// unifiedResToSystemdProps tries to convert from Cgroup.Resources.Unified +// key/value map (where key is cgroupfs file name) to systemd unit properties. +// This is on a best-effort basis, so the properties that are not known +// (to this function and/or systemd) are ignored (but logged with "debug" +// log level). +// +// For the list of keys, see https://www.kernel.org/doc/Documentation/cgroup-v2.txt +// +// For the list of systemd unit properties, see systemd.resource-control(5). +func unifiedResToSystemdProps(conn *systemdDbus.Conn, res map[string]string) (props []systemdDbus.Property, _ error) { + var err error + + for k, v := range res { + if strings.Contains(k, "/") { + return nil, fmt.Errorf("unified resource %q must be a file name (no slashes)", k) + } + sk := strings.SplitN(k, ".", 2) + if len(sk) != 2 { + return nil, fmt.Errorf("unified resource %q must be in the form CONTROLLER.PARAMETER", k) + } + // Kernel is quite forgiving to extra whitespace + // around the value, and so should we. + v = strings.TrimSpace(v) + // Please keep cases in alphabetical order. + switch k { + case "cpu.max": + // value: quota [period] + quota := int64(0) // 0 means "unlimited" for addCpuQuota, if period is set + period := defCPUQuotaPeriod + sv := strings.Fields(v) + if len(sv) < 1 || len(sv) > 2 { + return nil, fmt.Errorf("unified resource %q value invalid: %q", k, v) + } + // quota + if sv[0] != "max" { + quota, err = strconv.ParseInt(sv[0], 10, 64) + if err != nil { + return nil, fmt.Errorf("unified resource %q period value conversion error: %w", k, err) + } + } + // period + if len(sv) == 2 { + period, err = strconv.ParseUint(sv[1], 10, 64) + if err != nil { + return nil, fmt.Errorf("unified resource %q quota value conversion error: %w", k, err) + } + } + addCpuQuota(conn, &props, quota, period) + + case "cpu.weight": + num, err := strconv.ParseUint(v, 10, 64) + if err != nil { + return nil, fmt.Errorf("unified resource %q value conversion error: %w", k, err) + } + props = append(props, + newProp("CPUWeight", num)) + + case "cpuset.cpus", "cpuset.mems": + bits, err := rangeToBits(v) + if err != nil { + return nil, fmt.Errorf("unified resource %q=%q conversion error: %w", k, v, err) + } + m := map[string]string{ + "cpuset.cpus": "AllowedCPUs", + "cpuset.mems": "AllowedMemoryNodes", + } + // systemd only supports these properties since v244 + sdVer := systemdVersion(conn) + if sdVer >= 244 { + props = append(props, + newProp(m[k], bits)) + } else { + logrus.Debugf("systemd v%d is too old to support %s"+ + " (setting will still be applied to cgroupfs)", + sdVer, m[k]) + } + + case "memory.high", "memory.low", "memory.min", "memory.max", "memory.swap.max": + num := uint64(math.MaxUint64) + if v != "max" { + num, err = strconv.ParseUint(v, 10, 64) + if err != nil { + return nil, fmt.Errorf("unified resource %q value conversion error: %w", k, err) + } + } + m := map[string]string{ + "memory.high": "MemoryHigh", + "memory.low": "MemoryLow", + "memory.min": "MemoryMin", + "memory.max": "MemoryMax", + "memory.swap.max": "MemorySwapMax", + } + props = append(props, + newProp(m[k], num)) + + case "pids.max": + num := uint64(math.MaxUint64) + if v != "max" { + var err error + num, err = strconv.ParseUint(v, 10, 64) + if err != nil { + return nil, fmt.Errorf("unified resource %q value conversion error: %w", k, err) + } + } + props = append(props, + newProp("TasksAccounting", true), + newProp("TasksMax", num)) + + case "memory.oom.group": + // Setting this to 1 is roughly equivalent to OOMPolicy=kill + // (as per systemd.service(5) and + // https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html), + // but it's not clear what to do if it is unset or set + // to 0 in runc update, as there are two other possible + // values for OOMPolicy (continue/stop). + fallthrough + + default: + // Ignore the unknown resource here -- will still be + // applied in Set which calls fs2.Set. + logrus.Debugf("don't know how to convert unified resource %q=%q to systemd unit property; skipping (will still be applied to cgroupfs)", k, v) + } + } + + return props, nil +} + func genV2ResourcesProperties(c *configs.Cgroup, conn *systemdDbus.Conn) ([]systemdDbus.Property, error) { var properties []systemdDbus.Property r := c.Resources @@ -80,8 +209,22 @@ func genV2ResourcesProperties(c *configs.Cgroup, conn *systemdDbus.Conn) ([]syst newProp("TasksMax", uint64(r.PidsLimit))) } + err = addCpuset(conn, &properties, r.CpusetCpus, r.CpusetMems) + if err != nil { + return nil, err + } + // ignore r.KernelMemory + // convert Resources.Unified map to systemd properties + if r.Unified != nil { + unifiedProps, err := unifiedResToSystemdProps(conn, r.Unified) + if err != nil { + return nil, err + } + properties = append(properties, unifiedProps...) + } + return properties, nil } diff --git a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/utils.go b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/utils.go index 6e88b5dff6ff..840817e398a8 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/utils.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/utils.go @@ -15,7 +15,9 @@ import ( "sync" "time" - units "github.com/docker/go-units" + "github.com/opencontainers/runc/libcontainer/cgroups/fscommon" + "github.com/opencontainers/runc/libcontainer/system" + "github.com/sirupsen/logrus" "golang.org/x/sys/unix" ) @@ -29,19 +31,19 @@ var ( isUnified bool ) -// HugePageSizeUnitList is a list of the units used by the linux kernel when -// naming the HugePage control files. -// https://www.kernel.org/doc/Documentation/cgroup-v1/hugetlb.txt -// TODO Since the kernel only use KB, MB and GB; TB and PB should be removed, -// depends on https://github.com/docker/go-units/commit/a09cd47f892041a4fac473133d181f5aea6fa393 -var HugePageSizeUnitList = []string{"B", "KB", "MB", "GB", "TB", "PB"} - // IsCgroup2UnifiedMode returns whether we are running in cgroup v2 unified mode. func IsCgroup2UnifiedMode() bool { isUnifiedOnce.Do(func() { var st unix.Statfs_t - if err := unix.Statfs(unifiedMountpoint, &st); err != nil { - panic("cannot statfs cgroup root") + err := unix.Statfs(unifiedMountpoint, &st) + if err != nil { + if os.IsNotExist(err) && system.RunningInUserNS() { + // ignore the "not found" error if running in userns + logrus.WithError(err).Debugf("%s missing, assuming cgroup v1", unifiedMountpoint) + isUnified = false + return + } + panic(fmt.Sprintf("cannot statfs cgroup root: %s", err)) } isUnified = st.Type == unix.CGROUP2_SUPER_MAGIC }) @@ -86,11 +88,11 @@ func GetAllSubsystems() ([]string, error) { // - freezer: implemented in kernel 5.2 // We assume these are always available, as it is hard to detect availability. pseudo := []string{"devices", "freezer"} - data, err := ioutil.ReadFile("/sys/fs/cgroup/cgroup.controllers") + data, err := fscommon.ReadFile("/sys/fs/cgroup", "cgroup.controllers") if err != nil { return nil, err } - subsystems := append(pseudo, strings.Fields(string(data))...) + subsystems := append(pseudo, strings.Fields(data)...) return subsystems, nil } f, err := os.Open("/proc/cgroups") @@ -207,20 +209,66 @@ func EnterPid(cgroupPaths map[string]string, pid int) error { return nil } +func rmdir(path string) error { + err := unix.Rmdir(path) + if err == nil || err == unix.ENOENT { + return nil + } + return &os.PathError{Op: "rmdir", Path: path, Err: err} +} + +// RemovePath aims to remove cgroup path. It does so recursively, +// by removing any subdirectories (sub-cgroups) first. +func RemovePath(path string) error { + // try the fast path first + if err := rmdir(path); err == nil { + return nil + } + + infos, err := ioutil.ReadDir(path) + if err != nil { + if os.IsNotExist(err) { + err = nil + } + return err + } + for _, info := range infos { + if info.IsDir() { + // We should remove subcgroups dir first + if err = RemovePath(filepath.Join(path, info.Name())); err != nil { + break + } + } + } + if err == nil { + err = rmdir(path) + } + return err +} + // RemovePaths iterates over the provided paths removing them. // We trying to remove all paths five times with increasing delay between tries. // If after all there are not removed cgroups - appropriate error will be // returned. func RemovePaths(paths map[string]string) (err error) { + const retries = 5 delay := 10 * time.Millisecond - for i := 0; i < 5; i++ { + for i := 0; i < retries; i++ { if i != 0 { time.Sleep(delay) delay *= 2 } for s, p := range paths { - os.RemoveAll(p) - // TODO: here probably should be logging + if err := RemovePath(p); err != nil { + // do not log intermediate iterations + switch i { + case 0: + logrus.WithError(err).Warnf("Failed to remove cgroup (will retry)") + case retries - 1: + logrus.WithError(err).Error("Failed to remove cgroup") + } + + } _, err := os.Stat(p) // We need this strange way of checking cgroups existence because // RemoveAll almost always returns error, even on already removed @@ -230,6 +278,8 @@ func RemovePaths(paths map[string]string) (err error) { } } if len(paths) == 0 { + //nolint:ineffassign,staticcheck // done to help garbage collecting: opencontainers/runc#2506 + paths = make(map[string]string) return nil } } @@ -237,27 +287,50 @@ func RemovePaths(paths map[string]string) (err error) { } func GetHugePageSize() ([]string, error) { - files, err := ioutil.ReadDir("/sys/kernel/mm/hugepages") + dir, err := os.OpenFile("/sys/kernel/mm/hugepages", unix.O_DIRECTORY|unix.O_RDONLY, 0) if err != nil { - return []string{}, err + return nil, err } - var fileNames []string - for _, st := range files { - fileNames = append(fileNames, st.Name()) + files, err := dir.Readdirnames(0) + dir.Close() + if err != nil { + return nil, err } - return getHugePageSizeFromFilenames(fileNames) + + return getHugePageSizeFromFilenames(files) } func getHugePageSizeFromFilenames(fileNames []string) ([]string, error) { - var pageSizes []string - for _, fileName := range fileNames { - nameArray := strings.Split(fileName, "-") - pageSize, err := units.RAMInBytes(nameArray[1]) + pageSizes := make([]string, 0, len(fileNames)) + + for _, file := range fileNames { + // example: hugepages-1048576kB + val := strings.TrimPrefix(file, "hugepages-") + if len(val) == len(file) { + // unexpected file name: no prefix found + continue + } + // The suffix is always "kB" (as of Linux 5.9) + eLen := len(val) - 2 + val = strings.TrimSuffix(val, "kB") + if len(val) != eLen { + logrus.Warnf("GetHugePageSize: %s: invalid filename suffix (expected \"kB\")", file) + continue + } + size, err := strconv.Atoi(val) if err != nil { - return []string{}, err + return nil, err + } + // Model after https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/mm/hugetlb_cgroup.c?id=eff48ddeab782e35e58ccc8853f7386bbae9dec4#n574 + // but in our case the size is in KB already. + if size >= (1 << 20) { + val = strconv.Itoa(size>>20) + "GB" + } else if size >= (1 << 10) { + val = strconv.Itoa(size>>10) + "MB" + } else { + val += "KB" } - sizeString := units.CustomSize("%g%s", float64(pageSize), 1024.0, HugePageSizeUnitList) - pageSizes = append(pageSizes, sizeString) + pageSizes = append(pageSizes, val) } return pageSizes, nil @@ -303,14 +376,14 @@ func WriteCgroupProc(dir string, pid int) error { return nil } - cgroupProcessesFile, err := os.OpenFile(filepath.Join(dir, CgroupProcesses), os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0700) + file, err := fscommon.OpenFile(dir, CgroupProcesses, os.O_WRONLY) if err != nil { return fmt.Errorf("failed to write %v to %v: %v", pid, CgroupProcesses, err) } - defer cgroupProcessesFile.Close() + defer file.Close() for i := 0; i < 5; i++ { - _, err = cgroupProcessesFile.WriteString(strconv.Itoa(pid)) + _, err = file.WriteString(strconv.Itoa(pid)) if err == nil { return nil } diff --git a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/v1_utils.go b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/v1_utils.go index a94f208616e5..95ec9dff0284 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/v1_utils.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/v1_utils.go @@ -1,16 +1,16 @@ package cgroups import ( - "bufio" "errors" "fmt" - "io" "os" "path/filepath" "strings" + "sync" "syscall" securejoin "github.com/cyphar/filepath-securejoin" + "github.com/moby/sys/mountinfo" "golang.org/x/sys/unix" ) @@ -23,7 +23,12 @@ const ( ) var ( - errUnified = errors.New("not implemented for cgroup v2 unified hierarchy") + errUnified = errors.New("not implemented for cgroup v2 unified hierarchy") + ErrV1NoUnified = errors.New("invalid configuration: cannot use unified on cgroup v1") + + readMountinfoOnce sync.Once + readMountinfoErr error + cgroupMountinfo []*mountinfo.Info ) type NotFoundError struct { @@ -90,6 +95,21 @@ func tryDefaultPath(cgroupPath, subsystem string) string { return path } +// readCgroupMountinfo returns a list of cgroup v1 mounts (i.e. the ones +// with fstype of "cgroup") for the current running process. +// +// The results are cached (to avoid re-reading mountinfo which is relatively +// expensive), so it is assumed that cgroup mounts are not being changed. +func readCgroupMountinfo() ([]*mountinfo.Info, error) { + readMountinfoOnce.Do(func() { + cgroupMountinfo, readMountinfoErr = mountinfo.GetMounts( + mountinfo.FSTypeFilter("cgroup"), + ) + }) + + return cgroupMountinfo, readMountinfoErr +} + // https://www.kernel.org/doc/Documentation/cgroup-v1/cgroups.txt func FindCgroupMountpoint(cgroupPath, subsystem string) (string, error) { if IsCgroup2UnifiedMode() { @@ -110,56 +130,28 @@ func FindCgroupMountpointAndRoot(cgroupPath, subsystem string) (string, string, return "", "", errUnified } - // Avoid parsing mountinfo by checking if subsystem is valid/available. - if !isSubsystemAvailable(subsystem) { - return "", "", NewNotFoundError(subsystem) - } - - f, err := os.Open("/proc/self/mountinfo") + mi, err := readCgroupMountinfo() if err != nil { return "", "", err } - defer f.Close() - return findCgroupMountpointAndRootFromReader(f, cgroupPath, subsystem) + return findCgroupMountpointAndRootFromMI(mi, cgroupPath, subsystem) } -func findCgroupMountpointAndRootFromReader(reader io.Reader, cgroupPath, subsystem string) (string, string, error) { - scanner := bufio.NewScanner(reader) - for scanner.Scan() { - txt := scanner.Text() - fields := strings.Fields(txt) - if len(fields) < 9 { - continue - } - if strings.HasPrefix(fields[4], cgroupPath) { - for _, opt := range strings.Split(fields[len(fields)-1], ",") { +func findCgroupMountpointAndRootFromMI(mounts []*mountinfo.Info, cgroupPath, subsystem string) (string, string, error) { + for _, mi := range mounts { + if strings.HasPrefix(mi.Mountpoint, cgroupPath) { + for _, opt := range strings.Split(mi.VFSOptions, ",") { if opt == subsystem { - return fields[4], fields[3], nil + return mi.Mountpoint, mi.Root, nil } } } } - if err := scanner.Err(); err != nil { - return "", "", err - } return "", "", NewNotFoundError(subsystem) } -func isSubsystemAvailable(subsystem string) bool { - if IsCgroup2UnifiedMode() { - panic("don't call isSubsystemAvailable from cgroupv2 code") - } - - cgroups, err := ParseCgroupFile("/proc/self/cgroup") - if err != nil { - return false - } - _, avail := cgroups[subsystem] - return avail -} - func (m Mount) GetOwnCgroup(cgroups map[string]string) (string, error) { if len(m.Subsystems) == 0 { return "", fmt.Errorf("no subsystem for mount") @@ -168,25 +160,15 @@ func (m Mount) GetOwnCgroup(cgroups map[string]string) (string, error) { return getControllerPath(m.Subsystems[0], cgroups) } -func getCgroupMountsHelper(ss map[string]bool, mi io.Reader, all bool) ([]Mount, error) { +func getCgroupMountsHelper(ss map[string]bool, mounts []*mountinfo.Info, all bool) ([]Mount, error) { res := make([]Mount, 0, len(ss)) - scanner := bufio.NewScanner(mi) numFound := 0 - for scanner.Scan() && numFound < len(ss) { - txt := scanner.Text() - sepIdx := strings.Index(txt, " - ") - if sepIdx == -1 { - return nil, fmt.Errorf("invalid mountinfo format") - } - if txt[sepIdx+3:sepIdx+10] == "cgroup2" || txt[sepIdx+3:sepIdx+9] != "cgroup" { - continue - } - fields := strings.Split(txt, " ") + for _, mi := range mounts { m := Mount{ - Mountpoint: fields[4], - Root: fields[3], + Mountpoint: mi.Mountpoint, + Root: mi.Root, } - for _, opt := range strings.Split(fields[len(fields)-1], ",") { + for _, opt := range strings.Split(mi.VFSOptions, ",") { seen, known := ss[opt] if !known || (!all && seen) { continue @@ -199,19 +181,18 @@ func getCgroupMountsHelper(ss map[string]bool, mi io.Reader, all bool) ([]Mount, if len(m.Subsystems) > 0 || all { res = append(res, m) } - } - if err := scanner.Err(); err != nil { - return nil, err + if !all && numFound >= len(ss) { + break + } } return res, nil } func getCgroupMountsV1(all bool) ([]Mount, error) { - f, err := os.Open("/proc/self/mountinfo") + mi, err := readCgroupMountinfo() if err != nil { return nil, err } - defer f.Close() allSubsystems, err := ParseCgroupFile("/proc/self/cgroup") if err != nil { @@ -222,7 +203,8 @@ func getCgroupMountsV1(all bool) ([]Mount, error) { for s := range allSubsystems { allMap[s] = false } - return getCgroupMountsHelper(allMap, f, all) + + return getCgroupMountsHelper(allMap, mi, all) } // GetOwnCgroup returns the relative path to the cgroup docker is running in. diff --git a/vendor/github.com/opencontainers/runc/libcontainer/configs/cgroup_linux.go b/vendor/github.com/opencontainers/runc/libcontainer/configs/cgroup_linux.go index 6e90ae16b506..aada5d62f199 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/configs/cgroup_linux.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/configs/cgroup_linux.go @@ -2,6 +2,7 @@ package configs import ( systemdDbus "github.com/coreos/go-systemd/v22/dbus" + "github.com/opencontainers/runc/libcontainer/devices" ) type FreezerState string @@ -42,7 +43,7 @@ type Cgroup struct { type Resources struct { // Devices is the set of access rules for devices in the container. - Devices []*DeviceRule `json:"devices"` + Devices []*devices.Rule `json:"devices"` // Memory limit (in bytes) Memory int64 `json:"memory"` @@ -127,6 +128,9 @@ type Resources struct { // CpuWeight sets a proportional bandwidth limit. CpuWeight uint64 `json:"cpu_weight"` + // Unified is cgroupv2-only key-value map. + Unified map[string]string `json:"unified"` + // SkipDevices allows to skip configuring device permissions. // Used by e.g. kubelet while creating a parent cgroup (kubepods) // common for many containers. diff --git a/vendor/github.com/opencontainers/runc/libcontainer/configs/config.go b/vendor/github.com/opencontainers/runc/libcontainer/configs/config.go index 540f0f85d29b..e1cd1626565a 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/configs/config.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/configs/config.go @@ -7,6 +7,7 @@ import ( "os/exec" "time" + "github.com/opencontainers/runc/libcontainer/devices" "github.com/opencontainers/runtime-spec/specs-go" "github.com/pkg/errors" "github.com/sirupsen/logrus" @@ -92,6 +93,9 @@ type Config struct { // Path to a directory containing the container's root filesystem. Rootfs string `json:"rootfs"` + // Umask is the umask to use inside of the container. + Umask *uint32 `json:"umask"` + // Readonlyfs will remount the container's rootfs as readonly where only externally mounted // bind mounts are writtable. Readonlyfs bool `json:"readonlyfs"` @@ -104,7 +108,7 @@ type Config struct { Mounts []*Mount `json:"mounts"` // The device nodes that should be automatically created within the container upon container start. Note, make sure that the node is marked as allowed in the cgroup as well! - Devices []*Device `json:"devices"` + Devices []*devices.Device `json:"devices"` MountLabel string `json:"mount_label"` diff --git a/vendor/github.com/opencontainers/runc/libcontainer/configs/device.go b/vendor/github.com/opencontainers/runc/libcontainer/configs/device.go deleted file mode 100644 index 632bf6ac49cc..000000000000 --- a/vendor/github.com/opencontainers/runc/libcontainer/configs/device.go +++ /dev/null @@ -1,170 +0,0 @@ -package configs - -import ( - "fmt" - "os" - "strconv" -) - -const ( - Wildcard = -1 -) - -type Device struct { - DeviceRule - - // Path to the device. - Path string `json:"path"` - - // FileMode permission bits for the device. - FileMode os.FileMode `json:"file_mode"` - - // Uid of the device. - Uid uint32 `json:"uid"` - - // Gid of the device. - Gid uint32 `json:"gid"` -} - -// DevicePermissions is a cgroupv1-style string to represent device access. It -// has to be a string for backward compatibility reasons, hence why it has -// methods to do set operations. -type DevicePermissions string - -const ( - deviceRead uint = (1 << iota) - deviceWrite - deviceMknod -) - -func (p DevicePermissions) toSet() uint { - var set uint - for _, perm := range p { - switch perm { - case 'r': - set |= deviceRead - case 'w': - set |= deviceWrite - case 'm': - set |= deviceMknod - } - } - return set -} - -func fromSet(set uint) DevicePermissions { - var perm string - if set&deviceRead == deviceRead { - perm += "r" - } - if set&deviceWrite == deviceWrite { - perm += "w" - } - if set&deviceMknod == deviceMknod { - perm += "m" - } - return DevicePermissions(perm) -} - -// Union returns the union of the two sets of DevicePermissions. -func (p DevicePermissions) Union(o DevicePermissions) DevicePermissions { - lhs := p.toSet() - rhs := o.toSet() - return fromSet(lhs | rhs) -} - -// Difference returns the set difference of the two sets of DevicePermissions. -// In set notation, A.Difference(B) gives you A\B. -func (p DevicePermissions) Difference(o DevicePermissions) DevicePermissions { - lhs := p.toSet() - rhs := o.toSet() - return fromSet(lhs &^ rhs) -} - -// Intersection computes the intersection of the two sets of DevicePermissions. -func (p DevicePermissions) Intersection(o DevicePermissions) DevicePermissions { - lhs := p.toSet() - rhs := o.toSet() - return fromSet(lhs & rhs) -} - -// IsEmpty returns whether the set of permissions in a DevicePermissions is -// empty. -func (p DevicePermissions) IsEmpty() bool { - return p == DevicePermissions("") -} - -// IsValid returns whether the set of permissions is a subset of valid -// permissions (namely, {r,w,m}). -func (p DevicePermissions) IsValid() bool { - return p == fromSet(p.toSet()) -} - -type DeviceType rune - -const ( - WildcardDevice DeviceType = 'a' - BlockDevice DeviceType = 'b' - CharDevice DeviceType = 'c' // or 'u' - FifoDevice DeviceType = 'p' -) - -func (t DeviceType) IsValid() bool { - switch t { - case WildcardDevice, BlockDevice, CharDevice, FifoDevice: - return true - default: - return false - } -} - -func (t DeviceType) CanMknod() bool { - switch t { - case BlockDevice, CharDevice, FifoDevice: - return true - default: - return false - } -} - -func (t DeviceType) CanCgroup() bool { - switch t { - case WildcardDevice, BlockDevice, CharDevice: - return true - default: - return false - } -} - -type DeviceRule struct { - // Type of device ('c' for char, 'b' for block). If set to 'a', this rule - // acts as a wildcard and all fields other than Allow are ignored. - Type DeviceType `json:"type"` - - // Major is the device's major number. - Major int64 `json:"major"` - - // Minor is the device's minor number. - Minor int64 `json:"minor"` - - // Permissions is the set of permissions that this rule applies to (in the - // cgroupv1 format -- any combination of "rwm"). - Permissions DevicePermissions `json:"permissions"` - - // Allow specifies whether this rule is allowed. - Allow bool `json:"allow"` -} - -func (d *DeviceRule) CgroupString() string { - var ( - major = strconv.FormatInt(d.Major, 10) - minor = strconv.FormatInt(d.Minor, 10) - ) - if d.Major == Wildcard { - major = "*" - } - if d.Minor == Wildcard { - minor = "*" - } - return fmt.Sprintf("%c %s:%s %s", d.Type, major, minor, d.Permissions) -} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/configs/device_windows.go b/vendor/github.com/opencontainers/runc/libcontainer/configs/device_windows.go deleted file mode 100644 index 729289393fe4..000000000000 --- a/vendor/github.com/opencontainers/runc/libcontainer/configs/device_windows.go +++ /dev/null @@ -1,5 +0,0 @@ -package configs - -func (d *DeviceRule) Mkdev() (uint64, error) { - return 0, nil -} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/configs/devices.go b/vendor/github.com/opencontainers/runc/libcontainer/configs/devices.go new file mode 100644 index 000000000000..b9e3664ceaa5 --- /dev/null +++ b/vendor/github.com/opencontainers/runc/libcontainer/configs/devices.go @@ -0,0 +1,17 @@ +package configs + +import "github.com/opencontainers/runc/libcontainer/devices" + +type ( + // Deprecated: use libcontainer/devices.Device + Device = devices.Device + + // Deprecated: use libcontainer/devices.Rule + DeviceRule = devices.Rule + + // Deprecated: use libcontainer/devices.Type + DeviceType = devices.Type + + // Deprecated: use libcontainer/devices.Permissions + DevicePermissions = devices.Permissions +) diff --git a/vendor/github.com/opencontainers/runc/libcontainer/configs/namespaces_linux.go b/vendor/github.com/opencontainers/runc/libcontainer/configs/namespaces_linux.go index 1bbaef9bd941..d52d6fcd1478 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/configs/namespaces_linux.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/configs/namespaces_linux.go @@ -56,7 +56,7 @@ func IsNamespaceSupported(ns NamespaceType) bool { if nsFile == "" { return false } - _, err := os.Stat(fmt.Sprintf("/proc/self/ns/%s", nsFile)) + _, err := os.Stat("/proc/self/ns/" + nsFile) // a namespace is supported if it exists and we have permissions to read it supported = err == nil supportedNamespaces[ns] = supported diff --git a/vendor/github.com/opencontainers/runc/libcontainer/configs/validate/validator.go b/vendor/github.com/opencontainers/runc/libcontainer/configs/validate/validator.go index 49b5f4c69fe1..63abdb00cb07 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/configs/validate/validator.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/configs/validate/validator.go @@ -6,10 +6,12 @@ import ( "os" "path/filepath" "strings" + "sync" "github.com/opencontainers/runc/libcontainer/configs" "github.com/opencontainers/runc/libcontainer/intelrdt" selinux "github.com/opencontainers/selinux/go-selinux" + "golang.org/x/sys/unix" ) type Validator interface { @@ -144,6 +146,12 @@ func (v *ConfigValidator) sysctl(config *configs.Config) error { "kernel.shm_rmid_forced": true, } + var ( + netOnce sync.Once + hostnet bool + hostnetErr error + ) + for s := range config.Sysctl { if validSysctlMap[s] || strings.HasPrefix(s, "fs.mqueue.") { if config.Namespaces.Contains(configs.NEWIPC) { @@ -153,16 +161,27 @@ func (v *ConfigValidator) sysctl(config *configs.Config) error { } } if strings.HasPrefix(s, "net.") { - if config.Namespaces.Contains(configs.NEWNET) { - if path := config.Namespaces.PathOf(configs.NEWNET); path != "" { - if err := checkHostNs(s, path); err != nil { - return err - } + // Is container using host netns? + // Here "host" means "current", not "initial". + netOnce.Do(func() { + if !config.Namespaces.Contains(configs.NEWNET) { + hostnet = true + return } - continue - } else { - return fmt.Errorf("sysctl %q is not allowed in the hosts network namespace", s) + path := config.Namespaces.PathOf(configs.NEWNET) + if path == "" { + // own netns, so hostnet = false + return + } + hostnet, hostnetErr = isHostNetNS(path) + }) + if hostnetErr != nil { + return hostnetErr + } + if hostnet { + return fmt.Errorf("sysctl %q not allowed in host network namespace", s) } + continue } if config.Namespaces.Contains(configs.NEWUTS) { switch s { @@ -182,21 +201,21 @@ func (v *ConfigValidator) sysctl(config *configs.Config) error { func (v *ConfigValidator) intelrdt(config *configs.Config) error { if config.IntelRdt != nil { - if !intelrdt.IsCatEnabled() && !intelrdt.IsMbaEnabled() { + if !intelrdt.IsCATEnabled() && !intelrdt.IsMBAEnabled() { return errors.New("intelRdt is specified in config, but Intel RDT is not supported or enabled") } - if !intelrdt.IsCatEnabled() && config.IntelRdt.L3CacheSchema != "" { + if !intelrdt.IsCATEnabled() && config.IntelRdt.L3CacheSchema != "" { return errors.New("intelRdt.l3CacheSchema is specified in config, but Intel RDT/CAT is not enabled") } - if !intelrdt.IsMbaEnabled() && config.IntelRdt.MemBwSchema != "" { + if !intelrdt.IsMBAEnabled() && config.IntelRdt.MemBwSchema != "" { return errors.New("intelRdt.memBwSchema is specified in config, but Intel RDT/MBA is not enabled") } - if intelrdt.IsCatEnabled() && config.IntelRdt.L3CacheSchema == "" { + if intelrdt.IsCATEnabled() && config.IntelRdt.L3CacheSchema == "" { return errors.New("Intel RDT/CAT is enabled and intelRdt is specified in config, but intelRdt.l3CacheSchema is empty") } - if intelrdt.IsMbaEnabled() && config.IntelRdt.MemBwSchema == "" { + if intelrdt.IsMBAEnabled() && config.IntelRdt.MemBwSchema == "" { return errors.New("Intel RDT/MBA is enabled and intelRdt is specified in config, but intelRdt.memBwSchema is empty") } } @@ -204,43 +223,17 @@ func (v *ConfigValidator) intelrdt(config *configs.Config) error { return nil } -func isSymbolicLink(path string) (bool, error) { - fi, err := os.Lstat(path) - if err != nil { - return false, err - } +func isHostNetNS(path string) (bool, error) { + const currentProcessNetns = "/proc/self/ns/net" - return fi.Mode()&os.ModeSymlink == os.ModeSymlink, nil -} + var st1, st2 unix.Stat_t -// checkHostNs checks whether network sysctl is used in host namespace. -func checkHostNs(sysctlConfig string, path string) error { - var currentProcessNetns = "/proc/self/ns/net" - // readlink on the current processes network namespace - destOfCurrentProcess, err := os.Readlink(currentProcessNetns) - if err != nil { - return fmt.Errorf("read soft link %q error", currentProcessNetns) + if err := unix.Stat(currentProcessNetns, &st1); err != nil { + return false, fmt.Errorf("unable to stat %q: %s", currentProcessNetns, err) } - - // First check if the provided path is a symbolic link - symLink, err := isSymbolicLink(path) - if err != nil { - return fmt.Errorf("could not check that %q is a symlink: %v", path, err) - } - - if symLink == false { - // The provided namespace is not a symbolic link, - // it is not the host namespace. - return nil + if err := unix.Stat(path, &st2); err != nil { + return false, fmt.Errorf("unable to stat %q: %s", path, err) } - // readlink on the path provided in the struct - destOfContainer, err := os.Readlink(path) - if err != nil { - return fmt.Errorf("read soft link %q error", path) - } - if destOfContainer == destOfCurrentProcess { - return fmt.Errorf("sysctl %q is not allowed in the hosts network namespace", sysctlConfig) - } - return nil + return (st1.Dev == st2.Dev) && (st1.Ino == st2.Ino), nil } diff --git a/vendor/github.com/opencontainers/runc/libcontainer/container_linux.go b/vendor/github.com/opencontainers/runc/libcontainer/container_linux.go index e2f64fcb9fe5..3dca29e4c3f2 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/container_linux.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/container_linux.go @@ -14,6 +14,7 @@ import ( "os/exec" "path/filepath" "reflect" + "strconv" "strings" "sync" "time" @@ -363,24 +364,10 @@ func (c *linuxContainer) start(process *Process) error { } parent.forwardChildLogs() if err := parent.start(); err != nil { - // terminate the process to ensure that it properly is reaped. - if err := ignoreTerminateErrors(parent.terminate()); err != nil { - logrus.Warn(err) - } return newSystemErrorWithCause(err, "starting container process") } - // generate a timestamp indicating when the container was started - c.created = time.Now().UTC() - if process.Init { - c.state = &createdState{ - c: c, - } - state, err := c.updateState(parent) - if err != nil { - return err - } - c.initProcessStartTime = state.InitProcessStartTime + if process.Init { if c.config.Hooks != nil { s, err := c.currentOCIState() if err != nil { @@ -463,7 +450,7 @@ func (c *linuxContainer) includeExecFifo(cmd *exec.Cmd) error { cmd.ExtraFiles = append(cmd.ExtraFiles, os.NewFile(uintptr(fifoFd), fifoName)) cmd.Env = append(cmd.Env, - fmt.Sprintf("_LIBCONTAINER_FIFOFD=%d", stdioFdCount+len(cmd.ExtraFiles)-1)) + "_LIBCONTAINER_FIFOFD="+strconv.Itoa(stdioFdCount+len(cmd.ExtraFiles)-1)) return nil } @@ -506,24 +493,24 @@ func (c *linuxContainer) commandTemplate(p *Process, childInitPipe *os.File, chi if cmd.SysProcAttr == nil { cmd.SysProcAttr = &unix.SysProcAttr{} } - cmd.Env = append(cmd.Env, fmt.Sprintf("GOMAXPROCS=%s", os.Getenv("GOMAXPROCS"))) + cmd.Env = append(cmd.Env, "GOMAXPROCS="+os.Getenv("GOMAXPROCS")) cmd.ExtraFiles = append(cmd.ExtraFiles, p.ExtraFiles...) if p.ConsoleSocket != nil { cmd.ExtraFiles = append(cmd.ExtraFiles, p.ConsoleSocket) cmd.Env = append(cmd.Env, - fmt.Sprintf("_LIBCONTAINER_CONSOLE=%d", stdioFdCount+len(cmd.ExtraFiles)-1), + "_LIBCONTAINER_CONSOLE="+strconv.Itoa(stdioFdCount+len(cmd.ExtraFiles)-1), ) } cmd.ExtraFiles = append(cmd.ExtraFiles, childInitPipe) cmd.Env = append(cmd.Env, - fmt.Sprintf("_LIBCONTAINER_INITPIPE=%d", stdioFdCount+len(cmd.ExtraFiles)-1), - fmt.Sprintf("_LIBCONTAINER_STATEDIR=%s", c.root), + "_LIBCONTAINER_INITPIPE="+strconv.Itoa(stdioFdCount+len(cmd.ExtraFiles)-1), + "_LIBCONTAINER_STATEDIR="+c.root, ) cmd.ExtraFiles = append(cmd.ExtraFiles, childLogPipe) cmd.Env = append(cmd.Env, - fmt.Sprintf("_LIBCONTAINER_LOGPIPE=%d", stdioFdCount+len(cmd.ExtraFiles)-1), - fmt.Sprintf("_LIBCONTAINER_LOGLEVEL=%s", p.LogLevel), + "_LIBCONTAINER_LOGPIPE="+strconv.Itoa(stdioFdCount+len(cmd.ExtraFiles)-1), + "_LIBCONTAINER_LOGLEVEL="+p.LogLevel, ) // NOTE: when running a container with no PID namespace and the parent process spawning the container is @@ -693,8 +680,7 @@ var criuFeatures *criurpc.CriuFeatures func (c *linuxContainer) checkCriuFeatures(criuOpts *CriuOpts, rpcOpts *criurpc.CriuOpts, criuFeat *criurpc.CriuFeatures) error { - var t criurpc.CriuReqType - t = criurpc.CriuReqType_FEATURE_CHECK + t := criurpc.CriuReqType_FEATURE_CHECK // make sure the features we are looking for are really not from // some previous check @@ -777,11 +763,7 @@ func (c *linuxContainer) checkCriuVersion(minVersion int) error { const descriptorsFilename = "descriptors.json" func (c *linuxContainer) addCriuDumpMount(req *criurpc.CriuReq, m *configs.Mount) { - mountDest := m.Destination - if strings.HasPrefix(mountDest, c.config.Rootfs) { - mountDest = mountDest[len(c.config.Rootfs):] - } - + mountDest := strings.TrimPrefix(m.Destination, c.config.Rootfs) extMnt := &criurpc.ExtMountMap{ Key: proto.String(mountDest), Val: proto.String(mountDest), @@ -853,7 +835,7 @@ func (c *linuxContainer) criuSupportsExtNS(t configs.NamespaceType) bool { return c.checkCriuVersion(minVersion) == nil } -func (c *linuxContainer) criuNsToKey(t configs.NamespaceType) string { +func criuNsToKey(t configs.NamespaceType) string { return "extRoot" + strings.Title(configs.NsName(t)) + "NS" } @@ -873,12 +855,50 @@ func (c *linuxContainer) handleCheckpointingExternalNamespaces(rpcOpts *criurpc. if err := unix.Stat(nsPath, &ns); err != nil { return err } - criuExternal := fmt.Sprintf("%s[%d]:%s", configs.NsName(t), ns.Ino, c.criuNsToKey(t)) + criuExternal := fmt.Sprintf("%s[%d]:%s", configs.NsName(t), ns.Ino, criuNsToKey(t)) rpcOpts.External = append(rpcOpts.External, criuExternal) return nil } +func (c *linuxContainer) handleRestoringNamespaces(rpcOpts *criurpc.CriuOpts, extraFiles *[]*os.File) error { + for _, ns := range c.config.Namespaces { + switch ns.Type { + case configs.NEWNET, configs.NEWPID: + // If the container is running in a network or PID namespace and has + // a path to the network or PID namespace configured, we will dump + // that network or PID namespace as an external namespace and we + // will expect that the namespace exists during restore. + // This basically means that CRIU will ignore the namespace + // and expect it to be setup correctly. + if err := c.handleRestoringExternalNamespaces(rpcOpts, extraFiles, ns.Type); err != nil { + return err + } + default: + // For all other namespaces except NET and PID CRIU has + // a simpler way of joining the existing namespace if set + nsPath := c.config.Namespaces.PathOf(ns.Type) + if nsPath == "" { + continue + } + if ns.Type == configs.NEWCGROUP { + // CRIU has no code to handle NEWCGROUP + return fmt.Errorf("Do not know how to handle namespace %v", ns.Type) + } + // CRIU has code to handle NEWTIME, but it does not seem to be defined in runc + + // CRIU will issue a warning for NEWUSER: + // criu/namespaces.c: 'join-ns with user-namespace is not fully tested and dangerous' + rpcOpts.JoinNs = append(rpcOpts.JoinNs, &criurpc.JoinNamespace{ + Ns: proto.String(configs.NsName(ns.Type)), + NsFile: proto.String(nsPath), + }) + } + } + + return nil +} + func (c *linuxContainer) handleRestoringExternalNamespaces(rpcOpts *criurpc.CriuOpts, extraFiles *[]*os.File, t configs.NamespaceType) error { if !c.criuSupportsExtNS(t) { return nil @@ -897,11 +917,12 @@ func (c *linuxContainer) handleRestoringExternalNamespaces(rpcOpts *criurpc.Criu logrus.Errorf("If a specific network namespace is defined it must exist: %s", err) return fmt.Errorf("Requested network namespace %v does not exist", nsPath) } - inheritFd := new(criurpc.InheritFd) - inheritFd.Key = proto.String(c.criuNsToKey(t)) - // The offset of four is necessary because 0, 1, 2 and 3 is already - // used by stdin, stdout, stderr, 'criu swrk' socket. - inheritFd.Fd = proto.Int32(int32(4 + len(*extraFiles))) + inheritFd := &criurpc.InheritFd{ + Key: proto.String(criuNsToKey(t)), + // The offset of four is necessary because 0, 1, 2 and 3 are + // already used by stdin, stdout, stderr, 'criu swrk' socket. + Fd: proto.Int32(int32(4 + len(*extraFiles))), + } rpcOpts.InheritFd = append(rpcOpts.InheritFd, inheritFd) // All open FDs need to be transferred to CRIU via extraFiles *extraFiles = append(*extraFiles, nsFd) @@ -1120,11 +1141,7 @@ func (c *linuxContainer) Checkpoint(criuOpts *CriuOpts) error { } func (c *linuxContainer) addCriuRestoreMount(req *criurpc.CriuReq, m *configs.Mount) { - mountDest := m.Destination - if strings.HasPrefix(mountDest, c.config.Rootfs) { - mountDest = mountDest[len(c.config.Rootfs):] - } - + mountDest := strings.TrimPrefix(m.Destination, c.config.Rootfs) extMnt := &criurpc.ExtMountMap{ Key: proto.String(mountDest), Val: proto.String(m.Source), @@ -1309,15 +1326,7 @@ func (c *linuxContainer) Restore(process *Process, criuOpts *CriuOpts) error { c.handleCriuConfigurationFile(req.Opts) - // Same as during checkpointing. If the container has a specific network namespace - // assigned to it, this now expects that the checkpoint will be restored in a - // already created network namespace. - if err := c.handleRestoringExternalNamespaces(req.Opts, &extraFiles, configs.NEWNET); err != nil { - return err - } - - // Same for PID namespaces. - if err := c.handleRestoringExternalNamespaces(req.Opts, &extraFiles, configs.NEWPID); err != nil { + if err := c.handleRestoringNamespaces(req.Opts, &extraFiles); err != nil { return err } @@ -1540,7 +1549,7 @@ func (c *linuxContainer) criuSwrk(process *Process, req *criurpc.CriuReq, opts * buf := make([]byte, 10*4096) oob := make([]byte, 4096) - for true { + for { n, oobn, _, _, err := criuClientCon.ReadMsgUnix(buf, oob) if req.Opts != nil && req.Opts.StatusFd != nil { // Close status_fd as soon as we got something back from criu, @@ -1792,10 +1801,6 @@ func (c *linuxContainer) saveState(s *State) (retErr error) { return os.Rename(tmpFile.Name(), stateFilePath) } -func (c *linuxContainer) deleteState() error { - return os.Remove(filepath.Join(c.root, stateFilename)) -} - func (c *linuxContainer) currentStatus() (Status, error) { if err := c.refreshState(); err != nil { return -1, err @@ -2042,7 +2047,7 @@ func (c *linuxContainer) bootstrapData(cloneFlags uintptr, nsMaps map[configs.Na // write oom_score_adj r.AddData(&Bytemsg{ Type: OomScoreAdjAttr, - Value: []byte(fmt.Sprintf("%d", *c.config.OomScoreAdj)), + Value: []byte(strconv.Itoa(*c.config.OomScoreAdj)), }) } @@ -2062,9 +2067,21 @@ func ignoreTerminateErrors(err error) error { if err == nil { return nil } + // terminate() might return an error from ether Kill or Wait. + // The (*Cmd).Wait documentation says: "If the command fails to run + // or doesn't complete successfully, the error is of type *ExitError". + // Filter out such errors (like "exit status 1" or "signal: killed"). + var exitErr *exec.ExitError + if errors.As(err, &exitErr) { + return nil + } + // TODO: use errors.Is(err, os.ErrProcessDone) here and + // remove "process already finished" string comparison below + // once go 1.16 is minimally supported version. + s := err.Error() - switch { - case strings.Contains(s, "process already finished"), strings.Contains(s, "Wait was already called"): + if strings.Contains(s, "process already finished") || + strings.Contains(s, "Wait was already called") { return nil } return err diff --git a/vendor/github.com/opencontainers/runc/libcontainer/criu_opts_linux.go b/vendor/github.com/opencontainers/runc/libcontainer/criu_opts_linux.go index 1d119246d1ef..11cbdb2db982 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/criu_opts_linux.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/criu_opts_linux.go @@ -1,14 +1,6 @@ package libcontainer -// cgroup restoring strategy provided by criu -type cgMode uint32 - -const ( - CRIU_CG_MODE_SOFT cgMode = 3 + iota // restore cgroup properties if only dir created by criu - CRIU_CG_MODE_FULL // always restore all cgroups and their properties - CRIU_CG_MODE_STRICT // restore all, requiring them to not present in the system - CRIU_CG_MODE_DEFAULT // the same as CRIU_CG_MODE_SOFT -) +import criu "github.com/checkpoint-restore/go-criu/v4/rpc" type CriuPageServerInfo struct { Address string // IP address of CRIU page server @@ -32,7 +24,7 @@ type CriuOpts struct { PreDump bool // call criu predump to perform iterative checkpoint PageServer CriuPageServerInfo // allow to dump to criu page server VethPairs []VethPairName // pass the veth to criu when restore - ManageCgroupsMode cgMode // dump or restore cgroup mode + ManageCgroupsMode criu.CriuCgMode // dump or restore cgroup mode EmptyNs uint32 // don't c/r properties for namespace from this mask AutoDedup bool // auto deduplication for incremental dumps LazyPages bool // restore memory pages lazily using userfaultfd diff --git a/vendor/github.com/opencontainers/runc/libcontainer/devices/device.go b/vendor/github.com/opencontainers/runc/libcontainer/devices/device.go new file mode 100644 index 000000000000..3eb73cc7c762 --- /dev/null +++ b/vendor/github.com/opencontainers/runc/libcontainer/devices/device.go @@ -0,0 +1,170 @@ +package devices + +import ( + "fmt" + "os" + "strconv" +) + +const ( + Wildcard = -1 +) + +type Device struct { + Rule + + // Path to the device. + Path string `json:"path"` + + // FileMode permission bits for the device. + FileMode os.FileMode `json:"file_mode"` + + // Uid of the device. + Uid uint32 `json:"uid"` + + // Gid of the device. + Gid uint32 `json:"gid"` +} + +// Permissions is a cgroupv1-style string to represent device access. It +// has to be a string for backward compatibility reasons, hence why it has +// methods to do set operations. +type Permissions string + +const ( + deviceRead uint = (1 << iota) + deviceWrite + deviceMknod +) + +func (p Permissions) toSet() uint { + var set uint + for _, perm := range p { + switch perm { + case 'r': + set |= deviceRead + case 'w': + set |= deviceWrite + case 'm': + set |= deviceMknod + } + } + return set +} + +func fromSet(set uint) Permissions { + var perm string + if set&deviceRead == deviceRead { + perm += "r" + } + if set&deviceWrite == deviceWrite { + perm += "w" + } + if set&deviceMknod == deviceMknod { + perm += "m" + } + return Permissions(perm) +} + +// Union returns the union of the two sets of Permissions. +func (p Permissions) Union(o Permissions) Permissions { + lhs := p.toSet() + rhs := o.toSet() + return fromSet(lhs | rhs) +} + +// Difference returns the set difference of the two sets of Permissions. +// In set notation, A.Difference(B) gives you A\B. +func (p Permissions) Difference(o Permissions) Permissions { + lhs := p.toSet() + rhs := o.toSet() + return fromSet(lhs &^ rhs) +} + +// Intersection computes the intersection of the two sets of Permissions. +func (p Permissions) Intersection(o Permissions) Permissions { + lhs := p.toSet() + rhs := o.toSet() + return fromSet(lhs & rhs) +} + +// IsEmpty returns whether the set of permissions in a Permissions is +// empty. +func (p Permissions) IsEmpty() bool { + return p == Permissions("") +} + +// IsValid returns whether the set of permissions is a subset of valid +// permissions (namely, {r,w,m}). +func (p Permissions) IsValid() bool { + return p == fromSet(p.toSet()) +} + +type Type rune + +const ( + WildcardDevice Type = 'a' + BlockDevice Type = 'b' + CharDevice Type = 'c' // or 'u' + FifoDevice Type = 'p' +) + +func (t Type) IsValid() bool { + switch t { + case WildcardDevice, BlockDevice, CharDevice, FifoDevice: + return true + default: + return false + } +} + +func (t Type) CanMknod() bool { + switch t { + case BlockDevice, CharDevice, FifoDevice: + return true + default: + return false + } +} + +func (t Type) CanCgroup() bool { + switch t { + case WildcardDevice, BlockDevice, CharDevice: + return true + default: + return false + } +} + +type Rule struct { + // Type of device ('c' for char, 'b' for block). If set to 'a', this rule + // acts as a wildcard and all fields other than Allow are ignored. + Type Type `json:"type"` + + // Major is the device's major number. + Major int64 `json:"major"` + + // Minor is the device's minor number. + Minor int64 `json:"minor"` + + // Permissions is the set of permissions that this rule applies to (in the + // cgroupv1 format -- any combination of "rwm"). + Permissions Permissions `json:"permissions"` + + // Allow specifies whether this rule is allowed. + Allow bool `json:"allow"` +} + +func (d *Rule) CgroupString() string { + var ( + major = strconv.FormatInt(d.Major, 10) + minor = strconv.FormatInt(d.Minor, 10) + ) + if d.Major == Wildcard { + major = "*" + } + if d.Minor == Wildcard { + minor = "*" + } + return fmt.Sprintf("%c %s:%s %s", d.Type, major, minor, d.Permissions) +} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/configs/device_unix.go b/vendor/github.com/opencontainers/runc/libcontainer/devices/device_unix.go similarity index 79% rename from vendor/github.com/opencontainers/runc/libcontainer/configs/device_unix.go rename to vendor/github.com/opencontainers/runc/libcontainer/devices/device_unix.go index 650c46848a10..a400341e440f 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/configs/device_unix.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/devices/device_unix.go @@ -1,6 +1,6 @@ // +build !windows -package configs +package devices import ( "errors" @@ -8,7 +8,7 @@ import ( "golang.org/x/sys/unix" ) -func (d *DeviceRule) Mkdev() (uint64, error) { +func (d *Rule) Mkdev() (uint64, error) { if d.Major == Wildcard || d.Minor == Wildcard { return 0, errors.New("cannot mkdev() device with wildcards") } diff --git a/vendor/github.com/opencontainers/runc/libcontainer/devices/device_windows.go b/vendor/github.com/opencontainers/runc/libcontainer/devices/device_windows.go new file mode 100644 index 000000000000..8511bf00e076 --- /dev/null +++ b/vendor/github.com/opencontainers/runc/libcontainer/devices/device_windows.go @@ -0,0 +1,5 @@ +package devices + +func (d *Rule) Mkdev() (uint64, error) { + return 0, nil +} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/devices/devices.go b/vendor/github.com/opencontainers/runc/libcontainer/devices/devices.go new file mode 100644 index 000000000000..5011f373d2c3 --- /dev/null +++ b/vendor/github.com/opencontainers/runc/libcontainer/devices/devices.go @@ -0,0 +1,112 @@ +package devices + +import ( + "errors" + "io/ioutil" + "os" + "path/filepath" + + "golang.org/x/sys/unix" +) + +var ( + // ErrNotADevice denotes that a file is not a valid linux device. + ErrNotADevice = errors.New("not a device node") +) + +// Testing dependencies +var ( + unixLstat = unix.Lstat + ioutilReadDir = ioutil.ReadDir +) + +// Given the path to a device and its cgroup_permissions(which cannot be easily queried) look up the +// information about a linux device and return that information as a Device struct. +func DeviceFromPath(path, permissions string) (*Device, error) { + var stat unix.Stat_t + err := unixLstat(path, &stat) + if err != nil { + return nil, err + } + + var ( + devType Type + mode = stat.Mode + devNumber = uint64(stat.Rdev) + major = unix.Major(devNumber) + minor = unix.Minor(devNumber) + ) + switch mode & unix.S_IFMT { + case unix.S_IFBLK: + devType = BlockDevice + case unix.S_IFCHR: + devType = CharDevice + case unix.S_IFIFO: + devType = FifoDevice + default: + return nil, ErrNotADevice + } + return &Device{ + Rule: Rule{ + Type: devType, + Major: int64(major), + Minor: int64(minor), + Permissions: Permissions(permissions), + }, + Path: path, + FileMode: os.FileMode(mode), + Uid: stat.Uid, + Gid: stat.Gid, + }, nil +} + +// HostDevices returns all devices that can be found under /dev directory. +func HostDevices() ([]*Device, error) { + return GetDevices("/dev") +} + +// GetDevices recursively traverses a directory specified by path +// and returns all devices found there. +func GetDevices(path string) ([]*Device, error) { + files, err := ioutilReadDir(path) + if err != nil { + return nil, err + } + var out []*Device + for _, f := range files { + switch { + case f.IsDir(): + switch f.Name() { + // ".lxc" & ".lxd-mounts" added to address https://github.com/lxc/lxd/issues/2825 + // ".udev" added to address https://github.com/opencontainers/runc/issues/2093 + case "pts", "shm", "fd", "mqueue", ".lxc", ".lxd-mounts", ".udev": + continue + default: + sub, err := GetDevices(filepath.Join(path, f.Name())) + if err != nil { + return nil, err + } + + out = append(out, sub...) + continue + } + case f.Name() == "console": + continue + } + device, err := DeviceFromPath(filepath.Join(path, f.Name()), "rwm") + if err != nil { + if err == ErrNotADevice { + continue + } + if os.IsNotExist(err) { + continue + } + return nil, err + } + if device.Type == FifoDevice { + continue + } + out = append(out, device) + } + return out, nil +} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/factory_linux.go b/vendor/github.com/opencontainers/runc/libcontainer/factory_linux.go index 59548ef88195..5cd374162b93 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/factory_linux.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/factory_linux.go @@ -148,11 +148,11 @@ func RootlessCgroupfs(l *LinuxFactory) error { // containers that use the Intel RDT "resource control" filesystem to // create and manage Intel RDT resources (e.g., L3 cache, memory bandwidth). func IntelRdtFs(l *LinuxFactory) error { - l.NewIntelRdtManager = func(config *configs.Config, id string, path string) intelrdt.Manager { - return &intelrdt.IntelRdtManager{ - Config: config, - Id: id, - Path: path, + if !intelrdt.IsCATEnabled() && !intelrdt.IsMBAEnabled() { + l.NewIntelRdtManager = nil + } else { + l.NewIntelRdtManager = func(config *configs.Config, id string, path string) intelrdt.Manager { + return intelrdt.NewManager(config, id, path) } } return nil @@ -276,7 +276,7 @@ func (l *LinuxFactory) Create(id string, config *configs.Config) (Container, err newgidmapPath: l.NewgidmapPath, cgroupManager: l.NewCgroupsManager(config.Cgroups, nil), } - if intelrdt.IsCatEnabled() || intelrdt.IsMbaEnabled() { + if l.NewIntelRdtManager != nil { c.intelRdtManager = l.NewIntelRdtManager(config, id, "") } c.state = &stoppedState{c: c} @@ -318,13 +318,13 @@ func (l *LinuxFactory) Load(id string) (Container, error) { root: containerRoot, created: state.Created, } + if l.NewIntelRdtManager != nil { + c.intelRdtManager = l.NewIntelRdtManager(&state.Config, id, state.IntelRdtPath) + } c.state = &loadedState{c: c} if err := c.refreshState(); err != nil { return nil, err } - if intelrdt.IsCatEnabled() || intelrdt.IsMbaEnabled() { - c.intelRdtManager = l.NewIntelRdtManager(&state.Config, id, state.IntelRdtPath) - } return c, nil } @@ -335,35 +335,28 @@ func (l *LinuxFactory) Type() string { // StartInitialization loads a container by opening the pipe fd from the parent to read the configuration and state // This is a low level implementation detail of the reexec and should not be consumed externally func (l *LinuxFactory) StartInitialization() (err error) { - var ( - pipefd, fifofd int - consoleSocket *os.File - envInitPipe = os.Getenv("_LIBCONTAINER_INITPIPE") - envFifoFd = os.Getenv("_LIBCONTAINER_FIFOFD") - envConsole = os.Getenv("_LIBCONTAINER_CONSOLE") - ) - // Get the INITPIPE. - pipefd, err = strconv.Atoi(envInitPipe) + envInitPipe := os.Getenv("_LIBCONTAINER_INITPIPE") + pipefd, err := strconv.Atoi(envInitPipe) if err != nil { return fmt.Errorf("unable to convert _LIBCONTAINER_INITPIPE=%s to int: %s", envInitPipe, err) } - - var ( - pipe = os.NewFile(uintptr(pipefd), "pipe") - it = initType(os.Getenv("_LIBCONTAINER_INITTYPE")) - ) + pipe := os.NewFile(uintptr(pipefd), "pipe") defer pipe.Close() // Only init processes have FIFOFD. - fifofd = -1 + fifofd := -1 + envInitType := os.Getenv("_LIBCONTAINER_INITTYPE") + it := initType(envInitType) if it == initStandard { + envFifoFd := os.Getenv("_LIBCONTAINER_FIFOFD") if fifofd, err = strconv.Atoi(envFifoFd); err != nil { return fmt.Errorf("unable to convert _LIBCONTAINER_FIFOFD=%s to int: %s", envFifoFd, err) } } - if envConsole != "" { + var consoleSocket *os.File + if envConsole := os.Getenv("_LIBCONTAINER_CONSOLE"); envConsole != "" { console, err := strconv.Atoi(envConsole) if err != nil { return fmt.Errorf("unable to convert _LIBCONTAINER_CONSOLE=%s to int: %s", envConsole, err) diff --git a/vendor/github.com/opencontainers/runc/libcontainer/init_linux.go b/vendor/github.com/opencontainers/runc/libcontainer/init_linux.go index f2dc17e00e93..c57af0eebb8b 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/init_linux.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/init_linux.go @@ -3,6 +3,7 @@ package libcontainer import ( + "bytes" "encoding/json" "fmt" "io" @@ -12,9 +13,8 @@ import ( "strings" "unsafe" - "golang.org/x/sys/unix" - "github.com/containerd/console" + "github.com/opencontainers/runc/libcontainer/capabilities" "github.com/opencontainers/runc/libcontainer/cgroups" "github.com/opencontainers/runc/libcontainer/configs" "github.com/opencontainers/runc/libcontainer/system" @@ -24,6 +24,7 @@ import ( "github.com/pkg/errors" "github.com/sirupsen/logrus" "github.com/vishvananda/netlink" + "golang.org/x/sys/unix" ) type initType string @@ -128,19 +129,13 @@ func finalizeNamespace(config *initConfig) error { return errors.Wrap(err, "close exec fds") } - if config.Cwd != "" { - if err := unix.Chdir(config.Cwd); err != nil { - return fmt.Errorf("chdir to cwd (%q) set in config.json failed: %v", config.Cwd, err) - } - } - - capabilities := &configs.Capabilities{} + caps := &configs.Capabilities{} if config.Capabilities != nil { - capabilities = config.Capabilities + caps = config.Capabilities } else if config.Config.Capabilities != nil { - capabilities = config.Config.Capabilities + caps = config.Config.Capabilities } - w, err := newContainerCapList(capabilities) + w, err := capabilities.New(caps) if err != nil { return err } @@ -155,6 +150,14 @@ func finalizeNamespace(config *initConfig) error { if err := setupUser(config); err != nil { return errors.Wrap(err, "setup user") } + // Change working directory AFTER the user has been set up. + // Otherwise, if the cwd is also a volume that's been chowned to the container user (and not the user running runc), + // this command will EPERM. + if config.Cwd != "" { + if err := unix.Chdir(config.Cwd); err != nil { + return fmt.Errorf("chdir to cwd (%q) set in config.json failed: %v", config.Cwd, err) + } + } if err := system.ClearKeepCaps(); err != nil { return errors.Wrap(err, "clear keep caps") } @@ -304,7 +307,7 @@ func setupUser(config *initConfig) error { // There's nothing we can do about /etc/group entries, so we silently // ignore setting groups here (since the user didn't explicitly ask us to // set the group). - allowSupGroups := !config.RootlessEUID && strings.TrimSpace(string(setgroups)) != "deny" + allowSupGroups := !config.RootlessEUID && string(bytes.TrimSpace(setgroups)) != "deny" if allowSupGroups { suppGroups := append(execUser.Sgids, addGroups...) @@ -431,6 +434,7 @@ func setupRlimits(limits []configs.Rlimit, pid int) error { const _P_PID = 1 +//nolint:structcheck,unused type siginfo struct { si_signo int32 si_errno int32 @@ -480,7 +484,9 @@ func signalAllProcesses(m cgroups.Manager, s os.Signal) error { } pids, err := m.GetAllPids() if err != nil { - m.Freeze(configs.Thawed) + if err := m.Freeze(configs.Thawed); err != nil { + logrus.Warn(err) + } return err } for _, pid := range pids { diff --git a/vendor/github.com/opencontainers/runc/libcontainer/intelrdt/cmt.go b/vendor/github.com/opencontainers/runc/libcontainer/intelrdt/cmt.go index 5c406e102077..ed950973f080 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/intelrdt/cmt.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/intelrdt/cmt.go @@ -6,17 +6,20 @@ var ( // Check if Intel RDT/CMT is enabled. func IsCMTEnabled() bool { + featuresInit() return cmtEnabled } func getCMTNumaNodeStats(numaPath string) (*CMTNumaNodeStats, error) { stats := &CMTNumaNodeStats{} - llcOccupancy, err := getIntelRdtParamUint(numaPath, "llc_occupancy") - if err != nil { - return nil, err + if enabledMonFeatures.llcOccupancy { + llcOccupancy, err := getIntelRdtParamUint(numaPath, "llc_occupancy") + if err != nil { + return nil, err + } + stats.LLCOccupancy = llcOccupancy } - stats.LLCOccupancy = llcOccupancy return stats, nil } diff --git a/vendor/github.com/opencontainers/runc/libcontainer/intelrdt/intelrdt.go b/vendor/github.com/opencontainers/runc/libcontainer/intelrdt/intelrdt.go index 5b19d55a2d7f..3fa11b8002d3 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/intelrdt/intelrdt.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/intelrdt/intelrdt.go @@ -4,7 +4,9 @@ package intelrdt import ( "bufio" + "bytes" "fmt" + "io" "io/ioutil" "os" "path/filepath" @@ -12,6 +14,7 @@ import ( "strings" "sync" + "github.com/moby/sys/mountinfo" "github.com/opencontainers/runc/libcontainer/configs" ) @@ -162,11 +165,19 @@ type Manager interface { } // This implements interface Manager -type IntelRdtManager struct { +type intelRdtManager struct { mu sync.Mutex - Config *configs.Config - Id string - Path string + config *configs.Config + id string + path string +} + +func NewManager(config *configs.Config, id string, path string) Manager { + return &intelRdtManager{ + config: config, + id: id, + path: path, + } } const ( @@ -179,11 +190,14 @@ var ( intelRdtRootLock sync.Mutex // The flag to indicate if Intel RDT/CAT is enabled - isCatEnabled bool + catEnabled bool // The flag to indicate if Intel RDT/MBA is enabled - isMbaEnabled bool + mbaEnabled bool // The flag to indicate if Intel RDT/MBA Software Controller is enabled - isMbaScEnabled bool + mbaScEnabled bool + + // For Intel RDT initialization + initOnce sync.Once ) type intelRdtData struct { @@ -192,94 +206,80 @@ type intelRdtData struct { pid int } -// Check if Intel RDT sub-features are enabled in init() -func init() { - // 1. Check if hardware and kernel support Intel RDT sub-features - flagsSet, err := parseCpuInfoFile("/proc/cpuinfo") - if err != nil { - return - } - - // 2. Check if Intel RDT "resource control" filesystem is mounted - // The user guarantees to mount the filesystem - if !isIntelRdtMounted() { - return - } - - // 3. Double check if Intel RDT sub-features are available in - // "resource control" filesystem. Intel RDT sub-features can be - // selectively disabled or enabled by kernel command line - // (e.g., rdt=!l3cat,mba) in 4.14 and newer kernel - if flagsSet.CAT { - if _, err := os.Stat(filepath.Join(intelRdtRoot, "info", "L3")); err == nil { - isCatEnabled = true - } - } - if isMbaScEnabled { - // We confirm MBA Software Controller is enabled in step 2, - // MBA should be enabled because MBA Software Controller - // depends on MBA - isMbaEnabled = true - } else if flagsSet.MBA { - if _, err := os.Stat(filepath.Join(intelRdtRoot, "info", "MB")); err == nil { - isMbaEnabled = true +// Check if Intel RDT sub-features are enabled in featuresInit() +func featuresInit() { + initOnce.Do(func() { + // 1. Check if hardware and kernel support Intel RDT sub-features + flagsSet, err := parseCpuInfoFile("/proc/cpuinfo") + if err != nil { + return } - } - if flagsSet.MBMTotal || flagsSet.MBMLocal { - if _, err := os.Stat(filepath.Join(intelRdtRoot, "info", "L3_MON")); err == nil { - mbmEnabled = true - cmtEnabled = true + // 2. Check if Intel RDT "resource control" filesystem is mounted + // The user guarantees to mount the filesystem + if !isIntelRdtMounted() { + return } - enabledMonFeatures, err = getMonFeatures(intelRdtRoot) - if err != nil { - return + // 3. Double check if Intel RDT sub-features are available in + // "resource control" filesystem. Intel RDT sub-features can be + // selectively disabled or enabled by kernel command line + // (e.g., rdt=!l3cat,mba) in 4.14 and newer kernel + if flagsSet.CAT { + if _, err := os.Stat(filepath.Join(intelRdtRoot, "info", "L3")); err == nil { + catEnabled = true + } } - } + if mbaScEnabled { + // We confirm MBA Software Controller is enabled in step 2, + // MBA should be enabled because MBA Software Controller + // depends on MBA + mbaEnabled = true + } else if flagsSet.MBA { + if _, err := os.Stat(filepath.Join(intelRdtRoot, "info", "MB")); err == nil { + mbaEnabled = true + } + } + if flagsSet.MBMTotal || flagsSet.MBMLocal || flagsSet.CMT { + if _, err := os.Stat(filepath.Join(intelRdtRoot, "info", "L3_MON")); err != nil { + return + } + enabledMonFeatures, err = getMonFeatures(intelRdtRoot) + if err != nil { + return + } + if enabledMonFeatures.mbmTotalBytes || enabledMonFeatures.mbmLocalBytes { + mbmEnabled = true + } + if enabledMonFeatures.llcOccupancy { + cmtEnabled = true + } + } + }) } // Return the mount point path of Intel RDT "resource control" filesysem -func findIntelRdtMountpointDir() (string, error) { - f, err := os.Open("/proc/self/mountinfo") +func findIntelRdtMountpointDir(f io.Reader) (string, error) { + mi, err := mountinfo.GetMountsFromReader(f, func(m *mountinfo.Info) (bool, bool) { + // similar to mountinfo.FSTypeFilter but stops after the first match + if m.FSType == "resctrl" { + return false, true // don't skip, stop + } + return true, false // skip, keep going + }) if err != nil { return "", err } - defer f.Close() - - s := bufio.NewScanner(f) - for s.Scan() { - text := s.Text() - fields := strings.Split(text, " ") - // Safe as mountinfo encodes mountpoints with spaces as \040. - index := strings.Index(text, " - ") - postSeparatorFields := strings.Fields(text[index+3:]) - numPostFields := len(postSeparatorFields) - - // This is an error as we can't detect if the mount is for "Intel RDT" - if numPostFields == 0 { - return "", fmt.Errorf("Found no fields post '-' in %q", text) - } - - if postSeparatorFields[0] == "resctrl" { - // Check that the mount is properly formatted. - if numPostFields < 3 { - return "", fmt.Errorf("Error found less than 3 fields post '-' in %q", text) - } - - // Check if MBA Software Controller is enabled through mount option "-o mba_MBps" - if strings.Contains(postSeparatorFields[2], "mba_MBps") { - isMbaScEnabled = true - } - - return fields[4], nil - } + if len(mi) < 1 { + return "", NewNotFoundError("Intel RDT") } - if err := s.Err(); err != nil { - return "", err + + // Check if MBA Software Controller is enabled through mount option "-o mba_MBps" + if strings.Contains(","+mi[0].VFSOptions+",", ",mba_MBps,") { + mbaScEnabled = true } - return "", NewNotFoundError("Intel RDT") + return mi[0].Mountpoint, nil } // Gets the root path of Intel RDT "resource control" filesystem @@ -291,7 +291,12 @@ func getIntelRdtRoot() (string, error) { return intelRdtRoot, nil } - root, err := findIntelRdtMountpointDir() + f, err := os.Open("/proc/self/mountinfo") + if err != nil { + return "", err + } + root, err := findIntelRdtMountpointDir(f) + f.Close() if err != nil { return "", err } @@ -306,11 +311,7 @@ func getIntelRdtRoot() (string, error) { func isIntelRdtMounted() bool { _, err := getIntelRdtRoot() - if err != nil { - return false - } - - return true + return err == nil } type cpuInfoFlags struct { @@ -320,6 +321,8 @@ type cpuInfoFlags struct { // Memory Bandwidth Monitoring related. MBMTotal bool MBMLocal bool + + CMT bool // Cache Monitoring Technology } func parseCpuInfoFile(path string) (cpuInfoFlags, error) { @@ -349,6 +352,8 @@ func parseCpuInfoFile(path string) (cpuInfoFlags, error) { infoFlags.MBMTotal = true case "cqm_mbm_local": infoFlags.MBMLocal = true + case "cqm_occup_llc": + infoFlags.CMT = true } } return infoFlags, nil @@ -387,7 +392,7 @@ func getIntelRdtParamUint(path, file string) (uint64, error) { return 0, err } - res, err := parseUint(strings.TrimSpace(string(contents)), 10, 64) + res, err := parseUint(string(bytes.TrimSpace(contents)), 10, 64) if err != nil { return res, fmt.Errorf("unable to parse %q as a uint from file %q", string(contents), fileName) } @@ -401,14 +406,14 @@ func getIntelRdtParamString(path, file string) (string, error) { return "", err } - return strings.TrimSpace(string(contents)), nil + return string(bytes.TrimSpace(contents)), nil } func writeFile(dir, file, data string) error { if dir == "" { return fmt.Errorf("no such directory for %s", file) } - if err := ioutil.WriteFile(filepath.Join(dir, file), []byte(data+"\n"), 0700); err != nil { + if err := ioutil.WriteFile(filepath.Join(dir, file), []byte(data+"\n"), 0o600); err != nil { return fmt.Errorf("failed to write %v to %v: %v", data, file, err) } return nil @@ -515,7 +520,7 @@ func WriteIntelRdtTasks(dir string, pid int) error { // Don't attach any pid if -1 is specified as a pid if pid != -1 { - if err := ioutil.WriteFile(filepath.Join(dir, IntelRdtTasks), []byte(strconv.Itoa(pid)), 0700); err != nil { + if err := ioutil.WriteFile(filepath.Join(dir, IntelRdtTasks), []byte(strconv.Itoa(pid)), 0o600); err != nil { return fmt.Errorf("failed to write %v to %v: %v", pid, IntelRdtTasks, err) } } @@ -523,18 +528,21 @@ func WriteIntelRdtTasks(dir string, pid int) error { } // Check if Intel RDT/CAT is enabled -func IsCatEnabled() bool { - return isCatEnabled +func IsCATEnabled() bool { + featuresInit() + return catEnabled } // Check if Intel RDT/MBA is enabled -func IsMbaEnabled() bool { - return isMbaEnabled +func IsMBAEnabled() bool { + featuresInit() + return mbaEnabled } // Check if Intel RDT/MBA Software Controller is enabled -func IsMbaScEnabled() bool { - return isMbaScEnabled +func IsMBAScEnabled() bool { + featuresInit() + return mbaScEnabled } // Get the 'container_id' path in Intel RDT "resource control" filesystem @@ -549,51 +557,51 @@ func GetIntelRdtPath(id string) (string, error) { } // Applies Intel RDT configuration to the process with the specified pid -func (m *IntelRdtManager) Apply(pid int) (err error) { +func (m *intelRdtManager) Apply(pid int) (err error) { // If intelRdt is not specified in config, we do nothing - if m.Config.IntelRdt == nil { + if m.config.IntelRdt == nil { return nil } - d, err := getIntelRdtData(m.Config, pid) + d, err := getIntelRdtData(m.config, pid) if err != nil && !IsNotFound(err) { return err } m.mu.Lock() defer m.mu.Unlock() - path, err := d.join(m.Id) + path, err := d.join(m.id) if err != nil { return err } - m.Path = path + m.path = path return nil } // Destroys the Intel RDT 'container_id' group -func (m *IntelRdtManager) Destroy() error { +func (m *intelRdtManager) Destroy() error { m.mu.Lock() defer m.mu.Unlock() if err := os.RemoveAll(m.GetPath()); err != nil { return err } - m.Path = "" + m.path = "" return nil } // Returns Intel RDT path to save in a state file and to be able to // restore the object later -func (m *IntelRdtManager) GetPath() string { - if m.Path == "" { - m.Path, _ = GetIntelRdtPath(m.Id) +func (m *intelRdtManager) GetPath() string { + if m.path == "" { + m.path, _ = GetIntelRdtPath(m.id) } - return m.Path + return m.path } // Returns statistics for Intel RDT -func (m *IntelRdtManager) GetStats() (*Stats, error) { +func (m *intelRdtManager) GetStats() (*Stats, error) { // If intelRdt is not specified in config - if m.Config.IntelRdt == nil { + if m.config.IntelRdt == nil { return nil, nil } @@ -620,7 +628,7 @@ func (m *IntelRdtManager) GetStats() (*Stats, error) { } schemaStrings := strings.Split(tmpStrings, "\n") - if IsCatEnabled() { + if IsCATEnabled() { // The read-only L3 cache information l3CacheInfo, err := getL3CacheInfo() if err != nil { @@ -643,7 +651,7 @@ func (m *IntelRdtManager) GetStats() (*Stats, error) { } } - if IsMbaEnabled() { + if IsMBAEnabled() { // The read-only memory bandwidth information memBwInfo, err := getMemBwInfo() if err != nil { @@ -666,16 +674,18 @@ func (m *IntelRdtManager) GetStats() (*Stats, error) { } } - err = getMonitoringStats(containerPath, stats) - if err != nil { - return nil, err + if IsMBMEnabled() || IsCMTEnabled() { + err = getMonitoringStats(containerPath, stats) + if err != nil { + return nil, err + } } return stats, nil } // Set Intel RDT "resource control" filesystem as configured. -func (m *IntelRdtManager) Set(container *configs.Config) error { +func (m *intelRdtManager) Set(container *configs.Config) error { // About L3 cache schema: // It has allocation bitmasks/values for L3 cache on each socket, // which contains L3 cache id and capacity bitmask (CBM). @@ -753,7 +763,7 @@ func (m *IntelRdtManager) Set(container *configs.Config) error { func (raw *intelRdtData) join(id string) (string, error) { path := filepath.Join(raw.root, id) - if err := os.MkdirAll(path, 0755); err != nil { + if err := os.MkdirAll(path, 0o755); err != nil { return "", NewLastCmdError(err) } diff --git a/vendor/github.com/opencontainers/runc/libcontainer/intelrdt/mbm.go b/vendor/github.com/opencontainers/runc/libcontainer/intelrdt/mbm.go index 3730bab56448..93063ee01905 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/intelrdt/mbm.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/intelrdt/mbm.go @@ -9,6 +9,7 @@ var ( // Check if Intel RDT/MBM is enabled. func IsMBMEnabled() bool { + featuresInit() return mbmEnabled } diff --git a/vendor/github.com/opencontainers/runc/libcontainer/intelrdt/monitoring.go b/vendor/github.com/opencontainers/runc/libcontainer/intelrdt/monitoring.go index 4ccc8eae050c..78c2f624c960 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/intelrdt/monitoring.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/intelrdt/monitoring.go @@ -2,11 +2,12 @@ package intelrdt import ( "bufio" - "github.com/sirupsen/logrus" "io" "io/ioutil" "os" "path/filepath" + + "github.com/sirupsen/logrus" ) var ( @@ -21,10 +22,10 @@ type monFeatures struct { func getMonFeatures(intelRdtRoot string) (monFeatures, error) { file, err := os.Open(filepath.Join(intelRdtRoot, "info", "L3_MON", "mon_features")) - defer file.Close() if err != nil { return monFeatures{}, err } + defer file.Close() return parseMonFeatures(file) } diff --git a/vendor/github.com/opencontainers/runc/libcontainer/intelrdt/stats.go b/vendor/github.com/opencontainers/runc/libcontainer/intelrdt/stats.go index eeb0ee9f0d8e..70df0d14e6ce 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/intelrdt/stats.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/intelrdt/stats.go @@ -17,15 +17,15 @@ type MemBwInfo struct { type MBMNumaNodeStats struct { // The 'mbm_total_bytes' in 'container_id' group. - MBMTotalBytes uint64 `json:"mbm_total_bytes,omitempty"` + MBMTotalBytes uint64 `json:"mbm_total_bytes"` // The 'mbm_local_bytes' in 'container_id' group. - MBMLocalBytes uint64 `json:"mbm_local_bytes,omitempty"` + MBMLocalBytes uint64 `json:"mbm_local_bytes"` } type CMTNumaNodeStats struct { // The 'llc_occupancy' in 'container_id' group. - LLCOccupancy uint64 `json:"llc_occupancy,omitempty"` + LLCOccupancy uint64 `json:"llc_occupancy"` } type Stats struct { diff --git a/vendor/github.com/opencontainers/runc/libcontainer/network_linux.go b/vendor/github.com/opencontainers/runc/libcontainer/network_linux.go index 938d8ce0640f..a0a87b9842af 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/network_linux.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/network_linux.go @@ -3,11 +3,11 @@ package libcontainer import ( + "bytes" "fmt" "io/ioutil" "path/filepath" "strconv" - "strings" "github.com/opencontainers/runc/libcontainer/configs" "github.com/opencontainers/runc/types" @@ -79,7 +79,7 @@ func readSysfsNetworkStats(ethInterface, statsFile string) (uint64, error) { if err != nil { return 0, err } - return strconv.ParseUint(strings.TrimSpace(string(data)), 10, 64) + return strconv.ParseUint(string(bytes.TrimSpace(data)), 10, 64) } // loopback is a network strategy that provides a basic loopback device diff --git a/vendor/github.com/opencontainers/runc/libcontainer/process_linux.go b/vendor/github.com/opencontainers/runc/libcontainer/process_linux.go index cb8c724a206e..834268b99571 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/process_linux.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/process_linux.go @@ -11,6 +11,7 @@ import ( "os/exec" "path/filepath" "strconv" + "time" "github.com/opencontainers/runc/libcontainer/cgroups" "github.com/opencontainers/runc/libcontainer/cgroups/fs2" @@ -85,21 +86,29 @@ func (p *setnsProcess) signal(sig os.Signal) error { return unix.Kill(p.pid(), s) } -func (p *setnsProcess) start() (err error) { +func (p *setnsProcess) start() (retErr error) { defer p.messageSockPair.parent.Close() - err = p.cmd.Start() + err := p.cmd.Start() // close the write-side of the pipes (controlled by child) p.messageSockPair.child.Close() p.logFilePair.child.Close() if err != nil { return newSystemErrorWithCause(err, "starting setns process") } + defer func() { + if retErr != nil { + err := ignoreTerminateErrors(p.terminate()) + if err != nil { + logrus.WithError(err).Warn("unable to terminate setnsProcess") + } + } + }() if p.bootstrapData != nil { if _, err := io.Copy(p.messageSockPair.parent, p.bootstrapData); err != nil { return newSystemErrorWithCause(err, "copying bootstrap data to pipe") } } - if err = p.execSetns(); err != nil { + if err := p.execSetns(); err != nil { return newSystemErrorWithCause(err, "executing setns process") } if len(p.cgroupPaths) > 0 { @@ -312,6 +321,11 @@ func (p *initProcess) start() (retErr error) { } defer func() { if retErr != nil { + // terminate the process to ensure we can remove cgroups + if err := ignoreTerminateErrors(p.terminate()); err != nil { + logrus.WithError(err).Warn("unable to terminate initProcess") + } + p.manager.Destroy() if p.intelRdtManager != nil { p.intelRdtManager.Destroy() @@ -411,6 +425,28 @@ func (p *initProcess) start() (retErr error) { } } } + + // generate a timestamp indicating when the container was started + p.container.created = time.Now().UTC() + p.container.state = &createdState{ + c: p.container, + } + + // NOTE: If the procRun state has been synced and the + // runc-create process has been killed for some reason, + // the runc-init[2:stage] process will be leaky. And + // the runc command also fails to parse root directory + // because the container doesn't have state.json. + // + // In order to cleanup the runc-init[2:stage] by + // runc-delete/stop, we should store the status before + // procRun sync. + state, uerr := p.container.updateState(p) + if uerr != nil { + return newSystemErrorWithCause(err, "store init state") + } + p.container.initProcessStartTime = state.InitProcessStartTime + // Sync with child. if err := writeSync(p.messageSockPair.parent, procRun); err != nil { return newSystemErrorWithCause(err, "writing syncT 'run'") @@ -475,14 +511,11 @@ func (p *initProcess) start() (retErr error) { func (p *initProcess) wait() (*os.ProcessState, error) { err := p.cmd.Wait() - if err != nil { - return p.cmd.ProcessState, err - } // we should kill all processes in cgroup when init is died if we use host PID namespace if p.sharePidns { signalAllProcesses(p.manager, unix.SIGKILL) } - return p.cmd.ProcessState, nil + return p.cmd.ProcessState, err } func (p *initProcess) terminate() error { diff --git a/vendor/github.com/opencontainers/runc/libcontainer/rootfs_linux.go b/vendor/github.com/opencontainers/runc/libcontainer/rootfs_linux.go index e00df0a2c123..411496ab7c6d 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/rootfs_linux.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/rootfs_linux.go @@ -18,11 +18,12 @@ import ( "github.com/mrunalp/fileutils" "github.com/opencontainers/runc/libcontainer/cgroups" "github.com/opencontainers/runc/libcontainer/configs" + "github.com/opencontainers/runc/libcontainer/devices" "github.com/opencontainers/runc/libcontainer/system" + "github.com/opencontainers/runc/libcontainer/utils" libcontainerUtils "github.com/opencontainers/runc/libcontainer/utils" "github.com/opencontainers/runtime-spec/specs-go" "github.com/opencontainers/selinux/go-selinux/label" - "golang.org/x/sys/unix" ) @@ -156,7 +157,11 @@ func finalizeRootfs(config *configs.Config) (err error) { } } - unix.Umask(0022) + if config.Umask != nil { + unix.Umask(int(*config.Umask)) + } else { + unix.Umask(0022) + } return nil } @@ -328,17 +333,20 @@ func mountToRootfs(m *configs.Mount, rootfs, mountLabel string, enableCgroupns b if err := os.MkdirAll(dest, 0755); err != nil { return err } - if err := mountPropagate(m, rootfs, mountLabel); err != nil { - // older kernels do not support labeling of /dev/mqueue - if err := mountPropagate(m, rootfs, ""); err != nil { - return err - } - return label.SetFileLabel(dest, mountLabel) + if err := mountPropagate(m, rootfs, ""); err != nil { + return err } - return nil + return label.SetFileLabel(dest, mountLabel) case "tmpfs": copyUp := m.Extensions&configs.EXT_COPYUP == configs.EXT_COPYUP tmpDir := "" + // dest might be an absolute symlink, so it needs + // to be resolved under rootfs. + dest, err := securejoin.SecureJoin(rootfs, m.Destination) + if err != nil { + return err + } + m.Destination = dest stat, err := os.Stat(dest) if err != nil { if err := os.MkdirAll(dest, 0755); err != nil { @@ -382,6 +390,12 @@ func mountToRootfs(m *configs.Mount, rootfs, mountLabel string, enableCgroupns b return err } } + // Initially mounted rw in mountPropagate, remount to ro if flag set. + if m.Flags&unix.MS_RDONLY != 0 { + if err := remount(m, rootfs); err != nil { + return err + } + } return nil case "bind": if err := prepareBindMount(m, rootfs); err != nil { @@ -475,28 +489,6 @@ func getCgroupMounts(m *configs.Mount) ([]*configs.Mount, error) { // if source is nil, don't stat the filesystem. This is used for restore of a checkpoint. func checkProcMount(rootfs, dest, source string) error { const procPath = "/proc" - // White list, it should be sub directories of invalid destinations - validDestinations := []string{ - // These entries can be bind mounted by files emulated by fuse, - // so commands like top, free displays stats in container. - "/proc/cpuinfo", - "/proc/diskstats", - "/proc/meminfo", - "/proc/stat", - "/proc/swaps", - "/proc/uptime", - "/proc/loadavg", - "/proc/net/dev", - } - for _, valid := range validDestinations { - path, err := filepath.Rel(filepath.Join(rootfs, valid), dest) - if err != nil { - return err - } - if path == "." { - return nil - } - } path, err := filepath.Rel(filepath.Join(rootfs, procPath), dest) if err != nil { return err @@ -522,6 +514,30 @@ func checkProcMount(rootfs, dest, source string) error { } return fmt.Errorf("%q cannot be mounted because it is not of type proc", dest) } + + // Here dest is definitely under /proc. Do not allow those, + // except for a few specific entries emulated by lxcfs. + validProcMounts := []string{ + "/proc/cpuinfo", + "/proc/diskstats", + "/proc/meminfo", + "/proc/stat", + "/proc/swaps", + "/proc/uptime", + "/proc/loadavg", + "/proc/slabinfo", + "/proc/net/dev", + } + for _, valid := range validProcMounts { + path, err := filepath.Rel(filepath.Join(rootfs, valid), dest) + if err != nil { + return err + } + if path == "." { + return nil + } + } + return fmt.Errorf("%q cannot be mounted because it is inside /proc", dest) } @@ -590,6 +606,12 @@ func createDevices(config *configs.Config) error { useBindMount := system.RunningInUserNS() || config.Namespaces.Contains(configs.NEWUSER) oldMask := unix.Umask(0000) for _, node := range config.Devices { + + // The /dev/ptmx device is setup by setupPtmx() + if utils.CleanPath(node.Path) == "/dev/ptmx" { + continue + } + // containers running in a user namespace are not allowed to mknod // devices so we can just bind mount it from the host. if err := createDeviceNode(config.Rootfs, node, useBindMount); err != nil { @@ -601,7 +623,7 @@ func createDevices(config *configs.Config) error { return nil } -func bindMountDeviceNode(dest string, node *configs.Device) error { +func bindMountDeviceNode(dest string, node *devices.Device) error { f, err := os.Create(dest) if err != nil && !os.IsExist(err) { return err @@ -613,7 +635,7 @@ func bindMountDeviceNode(dest string, node *configs.Device) error { } // Creates the device node in the rootfs of the container. -func createDeviceNode(rootfs string, node *configs.Device, bind bool) error { +func createDeviceNode(rootfs string, node *devices.Device, bind bool) error { if node.Path == "" { // The node only exists for cgroup reasons, ignore it here. return nil @@ -636,14 +658,14 @@ func createDeviceNode(rootfs string, node *configs.Device, bind bool) error { return nil } -func mknodDevice(dest string, node *configs.Device) error { +func mknodDevice(dest string, node *devices.Device) error { fileMode := node.FileMode switch node.Type { - case configs.BlockDevice: + case devices.BlockDevice: fileMode |= unix.S_IFBLK - case configs.CharDevice: + case devices.CharDevice: fileMode |= unix.S_IFCHR - case configs.FifoDevice: + case devices.FifoDevice: fileMode |= unix.S_IFIFO default: return fmt.Errorf("%c is not a valid device type for device %s", node.Type, node.Path) @@ -728,7 +750,19 @@ func prepareRoot(config *configs.Config) error { } func setReadonly() error { - return unix.Mount("/", "/", "bind", unix.MS_BIND|unix.MS_REMOUNT|unix.MS_RDONLY|unix.MS_REC, "") + flags := uintptr(unix.MS_BIND | unix.MS_REMOUNT | unix.MS_RDONLY) + + err := unix.Mount("", "/", "", flags, "") + if err == nil { + return nil + } + var s unix.Statfs_t + if err := unix.Statfs("/", &s); err != nil { + return &os.PathError{Op: "statfs", Path: "/", Err: err} + } + flags |= uintptr(s.Flags) + return unix.Mount("", "/", "", flags, "") + } func setupPtmx(config *configs.Config) error { @@ -802,24 +836,46 @@ func pivotRoot(rootfs string) error { } func msMoveRoot(rootfs string) error { + // Before we move the root and chroot we have to mask all "full" sysfs and + // procfs mounts which exist on the host. This is because while the kernel + // has protections against mounting procfs if it has masks, when using + // chroot(2) the *host* procfs mount is still reachable in the mount + // namespace and the kernel permits procfs mounts inside --no-pivot + // containers. + // + // Users shouldn't be using --no-pivot except in exceptional circumstances, + // but to avoid such a trivial security flaw we apply a best-effort + // protection here. The kernel only allows a mount of a pseudo-filesystem + // like procfs or sysfs if there is a *full* mount (the root of the + // filesystem is mounted) without any other locked mount points covering a + // subtree of the mount. + // + // So we try to unmount (or mount tmpfs on top of) any mountpoint which is + // a full mount of either sysfs or procfs (since those are the most + // concerning filesystems to us). mountinfos, err := mountinfo.GetMounts(func(info *mountinfo.Info) (skip, stop bool) { - skip = false - stop = false - // Collect every sysfs and proc file systems, except those under the container rootfs - if (info.Fstype != "proc" && info.Fstype != "sysfs") || strings.HasPrefix(info.Mountpoint, rootfs) { + // Collect every sysfs and procfs filesystem, except for those which + // are non-full mounts or are inside the rootfs of the container. + if info.Root != "/" || + (info.FSType != "proc" && info.FSType != "sysfs") || + strings.HasPrefix(info.Mountpoint, rootfs) { skip = true - return } return }) if err != nil { return err } - for _, info := range mountinfos { p := info.Mountpoint // Be sure umount events are not propagated to the host. if err := unix.Mount("", p, "", unix.MS_SLAVE|unix.MS_REC, ""); err != nil { + if err == unix.ENOENT { + // If the mountpoint doesn't exist that means that we've + // already blasted away some parent directory of the mountpoint + // and so we don't care about this error. + continue + } return err } if err := unix.Unmount(p, unix.MNT_DETACH); err != nil { @@ -834,6 +890,8 @@ func msMoveRoot(rootfs string) error { } } } + + // Move the rootfs on top of "/" in our mount namespace. if err := unix.Mount(rootfs, "/", "", unix.MS_MOVE, ""); err != nil { return err } @@ -950,6 +1008,12 @@ func mountPropagate(m *configs.Mount, rootfs string, mountLabel string) error { flags &= ^unix.MS_RDONLY } + // Mount it rw to allow chmod operation. A remount will be performed + // later to make it ro if set. + if m.Device == "tmpfs" { + flags &= ^unix.MS_RDONLY + } + copyUp := m.Extensions&configs.EXT_COPYUP == configs.EXT_COPYUP if !(copyUp || strings.HasPrefix(dest, rootfs)) { dest = filepath.Join(rootfs, dest) diff --git a/vendor/github.com/opencontainers/runc/libcontainer/seccomp/config.go b/vendor/github.com/opencontainers/runc/libcontainer/seccomp/config.go index c32122798759..b54b7eead3b7 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/seccomp/config.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/seccomp/config.go @@ -49,7 +49,7 @@ var archs = map[string]string{ // Attempting to convert a string that is not a valid operator results in an // error. func ConvertStringToOperator(in string) (configs.Operator, error) { - if op, ok := operators[in]; ok == true { + if op, ok := operators[in]; ok { return op, nil } return 0, fmt.Errorf("string %s is not a valid operator for seccomp", in) @@ -62,7 +62,7 @@ func ConvertStringToOperator(in string) (configs.Operator, error) { // Attempting to convert a string that is not a valid action results in an // error. func ConvertStringToAction(in string) (configs.Action, error) { - if act, ok := actions[in]; ok == true { + if act, ok := actions[in]; ok { return act, nil } return 0, fmt.Errorf("string %s is not a valid action for seccomp", in) @@ -70,7 +70,7 @@ func ConvertStringToAction(in string) (configs.Action, error) { // ConvertStringToArch converts a string into a Seccomp comparison arch. func ConvertStringToArch(in string) (string, error) { - if arch, ok := archs[in]; ok == true { + if arch, ok := archs[in]; ok { return arch, nil } return "", fmt.Errorf("string %s is not a valid arch for seccomp", in) diff --git a/vendor/github.com/opencontainers/runc/libcontainer/seccomp/patchbpf/enosys_linux.go b/vendor/github.com/opencontainers/runc/libcontainer/seccomp/patchbpf/enosys_linux.go new file mode 100644 index 000000000000..cdbd59da0952 --- /dev/null +++ b/vendor/github.com/opencontainers/runc/libcontainer/seccomp/patchbpf/enosys_linux.go @@ -0,0 +1,628 @@ +// +build linux,cgo,seccomp + +package patchbpf + +import ( + "encoding/binary" + "io" + "os" + "runtime" + "unsafe" + + "github.com/opencontainers/runc/libcontainer/configs" + "github.com/opencontainers/runc/libcontainer/utils" + + "github.com/pkg/errors" + libseccomp "github.com/seccomp/libseccomp-golang" + "github.com/sirupsen/logrus" + "golang.org/x/net/bpf" + "golang.org/x/sys/unix" +) + +// #cgo pkg-config: libseccomp +/* +#include +#include +#include +#include + +const uint32_t C_ACT_ERRNO_ENOSYS = SCMP_ACT_ERRNO(ENOSYS); + +// Copied from . + +#ifndef SECCOMP_SET_MODE_FILTER +# define SECCOMP_SET_MODE_FILTER 1 +#endif +const uintptr_t C_SET_MODE_FILTER = SECCOMP_SET_MODE_FILTER; + +#ifndef SECCOMP_FILTER_FLAG_LOG +# define SECCOMP_FILTER_FLAG_LOG (1UL << 1) +#endif +const uintptr_t C_FILTER_FLAG_LOG = SECCOMP_FILTER_FLAG_LOG; + +// We use the AUDIT_ARCH_* values because those are the ones used by the kernel +// and SCMP_ARCH_* sometimes has fake values (such as SCMP_ARCH_X32). But we +// use so we get libseccomp's fallback definitions of AUDIT_ARCH_*. + +const uint32_t C_AUDIT_ARCH_I386 = AUDIT_ARCH_I386; +const uint32_t C_AUDIT_ARCH_X86_64 = AUDIT_ARCH_X86_64; +const uint32_t C_AUDIT_ARCH_ARM = AUDIT_ARCH_ARM; +const uint32_t C_AUDIT_ARCH_AARCH64 = AUDIT_ARCH_AARCH64; +const uint32_t C_AUDIT_ARCH_MIPS = AUDIT_ARCH_MIPS; +const uint32_t C_AUDIT_ARCH_MIPS64 = AUDIT_ARCH_MIPS64; +const uint32_t C_AUDIT_ARCH_MIPS64N32 = AUDIT_ARCH_MIPS64N32; +const uint32_t C_AUDIT_ARCH_MIPSEL = AUDIT_ARCH_MIPSEL; +const uint32_t C_AUDIT_ARCH_MIPSEL64 = AUDIT_ARCH_MIPSEL64; +const uint32_t C_AUDIT_ARCH_MIPSEL64N32 = AUDIT_ARCH_MIPSEL64N32; +const uint32_t C_AUDIT_ARCH_PPC = AUDIT_ARCH_PPC; +const uint32_t C_AUDIT_ARCH_PPC64 = AUDIT_ARCH_PPC64; +const uint32_t C_AUDIT_ARCH_PPC64LE = AUDIT_ARCH_PPC64LE; +const uint32_t C_AUDIT_ARCH_S390 = AUDIT_ARCH_S390; +const uint32_t C_AUDIT_ARCH_S390X = AUDIT_ARCH_S390X; +*/ +import "C" + +var retErrnoEnosys = uint32(C.C_ACT_ERRNO_ENOSYS) + +func isAllowAction(action configs.Action) bool { + switch action { + // Trace is considered an "allow" action because a good tracer should + // support future syscalls (by handling -ENOSYS on its own), and giving + // -ENOSYS will be disruptive for emulation. + case configs.Allow, configs.Log, configs.Trace: + return true + default: + return false + } +} + +func parseProgram(rdr io.Reader) ([]bpf.RawInstruction, error) { + var program []bpf.RawInstruction +loop: + for { + // Read the next instruction. We have to use NativeEndian because + // seccomp_export_bpf outputs the program in *host* endian-ness. + var insn unix.SockFilter + if err := binary.Read(rdr, utils.NativeEndian, &insn); err != nil { + switch err { + case io.EOF: + // Parsing complete. + break loop + case io.ErrUnexpectedEOF: + // Parsing stopped mid-instruction. + return nil, errors.Wrap(err, "program parsing halted mid-instruction") + default: + // All other errors. + return nil, errors.Wrap(err, "parsing instructions") + } + } + program = append(program, bpf.RawInstruction{ + Op: insn.Code, + Jt: insn.Jt, + Jf: insn.Jf, + K: insn.K, + }) + } + return program, nil +} + +func disassembleFilter(filter *libseccomp.ScmpFilter) ([]bpf.Instruction, error) { + rdr, wtr, err := os.Pipe() + if err != nil { + return nil, errors.Wrap(err, "creating scratch pipe") + } + defer wtr.Close() + defer rdr.Close() + + if err := filter.ExportBPF(wtr); err != nil { + return nil, errors.Wrap(err, "exporting BPF") + } + // Close so that the reader actually gets EOF. + _ = wtr.Close() + + // Parse the instructions. + rawProgram, err := parseProgram(rdr) + if err != nil { + return nil, errors.Wrap(err, "parsing generated BPF filter") + } + program, ok := bpf.Disassemble(rawProgram) + if !ok { + return nil, errors.Errorf("could not disassemble entire BPF filter") + } + return program, nil +} + +type nativeArch uint32 + +const invalidArch nativeArch = 0 + +func archToNative(arch libseccomp.ScmpArch) (nativeArch, error) { + switch arch { + case libseccomp.ArchNative: + // Convert to actual native architecture. + arch, err := libseccomp.GetNativeArch() + if err != nil { + return invalidArch, errors.Wrap(err, "get native arch") + } + return archToNative(arch) + case libseccomp.ArchX86: + return nativeArch(C.C_AUDIT_ARCH_I386), nil + case libseccomp.ArchAMD64, libseccomp.ArchX32: + // NOTE: x32 is treated like x86_64 except all x32 syscalls have the + // 30th bit of the syscall number set to indicate that it's not a + // normal x86_64 syscall. + return nativeArch(C.C_AUDIT_ARCH_X86_64), nil + case libseccomp.ArchARM: + return nativeArch(C.C_AUDIT_ARCH_ARM), nil + case libseccomp.ArchARM64: + return nativeArch(C.C_AUDIT_ARCH_AARCH64), nil + case libseccomp.ArchMIPS: + return nativeArch(C.C_AUDIT_ARCH_MIPS), nil + case libseccomp.ArchMIPS64: + return nativeArch(C.C_AUDIT_ARCH_MIPS64), nil + case libseccomp.ArchMIPS64N32: + return nativeArch(C.C_AUDIT_ARCH_MIPS64N32), nil + case libseccomp.ArchMIPSEL: + return nativeArch(C.C_AUDIT_ARCH_MIPSEL), nil + case libseccomp.ArchMIPSEL64: + return nativeArch(C.C_AUDIT_ARCH_MIPSEL64), nil + case libseccomp.ArchMIPSEL64N32: + return nativeArch(C.C_AUDIT_ARCH_MIPSEL64N32), nil + case libseccomp.ArchPPC: + return nativeArch(C.C_AUDIT_ARCH_PPC), nil + case libseccomp.ArchPPC64: + return nativeArch(C.C_AUDIT_ARCH_PPC64), nil + case libseccomp.ArchPPC64LE: + return nativeArch(C.C_AUDIT_ARCH_PPC64LE), nil + case libseccomp.ArchS390: + return nativeArch(C.C_AUDIT_ARCH_S390), nil + case libseccomp.ArchS390X: + return nativeArch(C.C_AUDIT_ARCH_S390X), nil + default: + return invalidArch, errors.Errorf("unknown architecture: %v", arch) + } +} + +type lastSyscallMap map[nativeArch]map[libseccomp.ScmpArch]libseccomp.ScmpSyscall + +// Figure out largest syscall number referenced in the filter for each +// architecture. We will be generating code based on the native architecture +// representation, but SCMP_ARCH_X32 means we have to track cases where the +// same architecture has different largest syscalls based on the mode. +func findLastSyscalls(config *configs.Seccomp) (lastSyscallMap, error) { + lastSyscalls := make(lastSyscallMap) + // Only loop over architectures which are present in the filter. Any other + // architectures will get the libseccomp bad architecture action anyway. + for _, ociArch := range config.Architectures { + arch, err := libseccomp.GetArchFromString(ociArch) + if err != nil { + return nil, errors.Wrap(err, "validating seccomp architecture") + } + + // Map native architecture to a real architecture value to avoid + // doubling-up the lastSyscall mapping. + if arch == libseccomp.ArchNative { + nativeArch, err := libseccomp.GetNativeArch() + if err != nil { + return nil, errors.Wrap(err, "get native arch") + } + arch = nativeArch + } + + // Figure out native architecture representation of the architecture. + nativeArch, err := archToNative(arch) + if err != nil { + return nil, errors.Wrapf(err, "cannot map architecture %v to AUDIT_ARCH_ constant", arch) + } + + if _, ok := lastSyscalls[nativeArch]; !ok { + lastSyscalls[nativeArch] = map[libseccomp.ScmpArch]libseccomp.ScmpSyscall{} + } + if _, ok := lastSyscalls[nativeArch][arch]; ok { + // Because of ArchNative we may hit the same entry multiple times. + // Just skip it if we've seen this (nativeArch, ScmpArch) + // combination before. + continue + } + + // Find the largest syscall in the filter for this architecture. + var largestSyscall libseccomp.ScmpSyscall + for _, rule := range config.Syscalls { + sysno, err := libseccomp.GetSyscallFromNameByArch(rule.Name, arch) + if err != nil { + // Ignore unknown syscalls. + continue + } + if sysno > largestSyscall { + largestSyscall = sysno + } + } + if largestSyscall != 0 { + lastSyscalls[nativeArch][arch] = largestSyscall + } else { + logrus.Warnf("could not find any syscalls for arch %s", ociArch) + delete(lastSyscalls[nativeArch], arch) + } + } + return lastSyscalls, nil +} + +// FIXME FIXME FIXME +// +// This solution is less than ideal. In the future it would be great to have +// per-arch information about which syscalls were added in which kernel +// versions so we can create far more accurate filter rules (handling holes in +// the syscall table and determining -ENOSYS requirements based on kernel +// minimum version alone. +// +// This implementation can in principle cause issues with syscalls like +// close_range(2) which were added out-of-order in the syscall table between +// kernel releases. +func generateEnosysStub(lastSyscalls lastSyscallMap) ([]bpf.Instruction, error) { + // A jump-table for each nativeArch used to generate the initial + // conditional jumps -- measured from the *END* of the program so they + // remain valid after prepending to the tail. + archJumpTable := map[nativeArch]uint32{} + + // Generate our own -ENOSYS rules for each architecture. They have to be + // generated in reverse (prepended to the tail of the program) because the + // JumpIf jumps need to be computed from the end of the program. + programTail := []bpf.Instruction{ + // Fall-through rules jump into the filter. + bpf.Jump{Skip: 1}, + // Rules which jump to here get -ENOSYS. + bpf.RetConstant{Val: retErrnoEnosys}, + } + + // Generate the syscall -ENOSYS rules. + for nativeArch, maxSyscalls := range lastSyscalls { + // The number of instructions from the tail of this section which need + // to be jumped in order to reach the -ENOSYS return. If the section + // does not jump, it will fall through to the actual filter. + baseJumpEnosys := uint32(len(programTail) - 1) + baseJumpFilter := baseJumpEnosys + 1 + + // Add the load instruction for the syscall number -- we jump here + // directly from the arch code so we need to do it here. Sadly we can't + // share this code between architecture branches. + section := []bpf.Instruction{ + // load [0] + bpf.LoadAbsolute{Off: 0, Size: 4}, // NOTE: We assume sizeof(int) == 4. + } + + switch len(maxSyscalls) { + case 0: + // No syscalls found for this arch -- skip it and move on. + continue + case 1: + // Get the only syscall in the map. + var sysno libseccomp.ScmpSyscall + for _, no := range maxSyscalls { + sysno = no + } + + // The simplest case just boils down to a single jgt instruction, + // with special handling if baseJumpEnosys is larger than 255 (and + // thus a long jump is required). + var sectionTail []bpf.Instruction + if baseJumpEnosys+1 <= 255 { + sectionTail = []bpf.Instruction{ + // jgt [syscall],[baseJumpEnosys+1] + bpf.JumpIf{ + Cond: bpf.JumpGreaterThan, + Val: uint32(sysno), + SkipTrue: uint8(baseJumpEnosys + 1)}, + // ja [baseJumpFilter] + bpf.Jump{Skip: baseJumpFilter}, + } + } else { + sectionTail = []bpf.Instruction{ + // jle [syscall],1 + bpf.JumpIf{Cond: bpf.JumpLessOrEqual, Val: uint32(sysno), SkipTrue: 1}, + // ja [baseJumpEnosys+1] + bpf.Jump{Skip: baseJumpEnosys + 1}, + // ja [baseJumpFilter] + bpf.Jump{Skip: baseJumpFilter}, + } + } + + // If we're on x86 we need to add a check for x32 and if we're in + // the wrong mode we jump over the section. + if uint32(nativeArch) == uint32(C.C_AUDIT_ARCH_X86_64) { + // Grab the only architecture in the map. + var scmpArch libseccomp.ScmpArch + for arch := range maxSyscalls { + scmpArch = arch + } + + // Generate a prefix to check the mode. + switch scmpArch { + case libseccomp.ArchAMD64: + sectionTail = append([]bpf.Instruction{ + // jset (1<<30),[len(tail)-1] + bpf.JumpIf{Cond: bpf.JumpBitsSet, + Val: 1 << 30, + SkipTrue: uint8(len(sectionTail) - 1)}, + }, sectionTail...) + case libseccomp.ArchX32: + sectionTail = append([]bpf.Instruction{ + // jset (1<<30),0,[len(tail)-1] + bpf.JumpIf{Cond: bpf.JumpBitsNotSet, + Val: 1 << 30, + SkipTrue: uint8(len(sectionTail) - 1)}, + }, sectionTail...) + default: + return nil, errors.Errorf("unknown amd64 native architecture %#x", scmpArch) + } + } + + section = append(section, sectionTail...) + case 2: + // x32 and x86_64 are a unique case, we can't handle any others. + if uint32(nativeArch) != uint32(C.C_AUDIT_ARCH_X86_64) { + return nil, errors.Errorf("unknown architecture overlap on native arch %#x", nativeArch) + } + + x32sysno, ok := maxSyscalls[libseccomp.ArchX32] + if !ok { + return nil, errors.Errorf("missing %v in overlapping x86_64 arch: %v", libseccomp.ArchX32, maxSyscalls) + } + x86sysno, ok := maxSyscalls[libseccomp.ArchAMD64] + if !ok { + return nil, errors.Errorf("missing %v in overlapping x86_64 arch: %v", libseccomp.ArchAMD64, maxSyscalls) + } + + // The x32 ABI indicates that a syscall is being made by an x32 + // process by setting the 30th bit of the syscall number, but we + // need to do some special-casing depending on whether we need to + // do long jumps. + if baseJumpEnosys+2 <= 255 { + // For the simple case we want to have something like: + // jset (1<<30),1 + // jgt [x86 syscall],[baseJumpEnosys+2],1 + // jgt [x32 syscall],[baseJumpEnosys+1] + // ja [baseJumpFilter] + section = append(section, []bpf.Instruction{ + // jset (1<<30),1 + bpf.JumpIf{Cond: bpf.JumpBitsSet, Val: 1 << 30, SkipTrue: 1}, + // jgt [x86 syscall],[baseJumpEnosys+1],1 + bpf.JumpIf{ + Cond: bpf.JumpGreaterThan, + Val: uint32(x86sysno), + SkipTrue: uint8(baseJumpEnosys + 2), SkipFalse: 1}, + // jgt [x32 syscall],[baseJumpEnosys] + bpf.JumpIf{ + Cond: bpf.JumpGreaterThan, + Val: uint32(x32sysno), + SkipTrue: uint8(baseJumpEnosys + 1)}, + // ja [baseJumpFilter] + bpf.Jump{Skip: baseJumpFilter}, + }...) + } else { + // But if the [baseJumpEnosys+2] jump is larger than 255 we + // need to do a long jump like so: + // jset (1<<30),1 + // jgt [x86 syscall],1,2 + // jle [x32 syscall],1 + // ja [baseJumpEnosys+1] + // ja [baseJumpFilter] + section = append(section, []bpf.Instruction{ + // jset (1<<30),1 + bpf.JumpIf{Cond: bpf.JumpBitsSet, Val: 1 << 30, SkipTrue: 1}, + // jgt [x86 syscall],1,2 + bpf.JumpIf{ + Cond: bpf.JumpGreaterThan, + Val: uint32(x86sysno), + SkipTrue: 1, SkipFalse: 2}, + // jle [x32 syscall],[baseJumpEnosys] + bpf.JumpIf{ + Cond: bpf.JumpLessOrEqual, + Val: uint32(x32sysno), + SkipTrue: 1}, + // ja [baseJumpEnosys+1] + bpf.Jump{Skip: baseJumpEnosys + 1}, + // ja [baseJumpFilter] + bpf.Jump{Skip: baseJumpFilter}, + }...) + } + default: + return nil, errors.Errorf("invalid number of architecture overlaps: %v", len(maxSyscalls)) + } + + // Prepend this section to the tail. + programTail = append(section, programTail...) + + // Update jump table. + archJumpTable[nativeArch] = uint32(len(programTail)) + } + + // Add a dummy "jump to filter" for any architecture we might miss below. + // Such architectures will probably get the BadArch action of the filter + // regardless. + programTail = append([]bpf.Instruction{ + // ja [end of stub and start of filter] + bpf.Jump{Skip: uint32(len(programTail))}, + }, programTail...) + + // Generate the jump rules for each architecture. This has to be done in + // reverse as well for the same reason as above. We add to programTail + // directly because the jumps are impacted by each architecture rule we add + // as well. + // + // TODO: Maybe we want to optimise to avoid long jumps here? So sort the + // architectures based on how large the jumps are going to be, or + // re-sort the candidate architectures each time to make sure that we + // pick the largest jump which is going to be smaller than 255. + for nativeArch := range lastSyscalls { + // We jump forwards but the jump table is calculated from the *END*. + jump := uint32(len(programTail)) - archJumpTable[nativeArch] + + // Same routine as above -- this is a basic jeq check, complicated + // slightly if it turns out that we need to do a long jump. + if jump <= 255 { + programTail = append([]bpf.Instruction{ + // jeq [arch],[jump] + bpf.JumpIf{ + Cond: bpf.JumpEqual, + Val: uint32(nativeArch), + SkipTrue: uint8(jump)}, + }, programTail...) + } else { + programTail = append([]bpf.Instruction{ + // jne [arch],1 + bpf.JumpIf{ + Cond: bpf.JumpNotEqual, + Val: uint32(nativeArch), + SkipTrue: 1}, + // ja [jump] + bpf.Jump{Skip: jump}, + }, programTail...) + } + } + + // Prepend the load instruction for the architecture. + programTail = append([]bpf.Instruction{ + // load [4] + bpf.LoadAbsolute{Off: 4, Size: 4}, // NOTE: We assume sizeof(int) == 4. + }, programTail...) + + // And that's all folks! + return programTail, nil +} + +func assemble(program []bpf.Instruction) ([]unix.SockFilter, error) { + rawProgram, err := bpf.Assemble(program) + if err != nil { + return nil, errors.Wrap(err, "assembling program") + } + + // Convert to []unix.SockFilter for unix.SockFilter. + var filter []unix.SockFilter + for _, insn := range rawProgram { + filter = append(filter, unix.SockFilter{ + Code: insn.Op, + Jt: insn.Jt, + Jf: insn.Jf, + K: insn.K, + }) + } + return filter, nil +} + +func generatePatch(config *configs.Seccomp) ([]bpf.Instruction, error) { + // We only add the stub if the default action is not permissive. + if isAllowAction(config.DefaultAction) { + logrus.Debugf("seccomp: skipping -ENOSYS stub filter generation") + return nil, nil + } + + lastSyscalls, err := findLastSyscalls(config) + if err != nil { + return nil, errors.Wrap(err, "finding last syscalls for -ENOSYS stub") + } + stubProgram, err := generateEnosysStub(lastSyscalls) + if err != nil { + return nil, errors.Wrap(err, "generating -ENOSYS stub") + } + return stubProgram, nil +} + +func enosysPatchFilter(config *configs.Seccomp, filter *libseccomp.ScmpFilter) ([]unix.SockFilter, error) { + program, err := disassembleFilter(filter) + if err != nil { + return nil, errors.Wrap(err, "disassembling original filter") + } + + patch, err := generatePatch(config) + if err != nil { + return nil, errors.Wrap(err, "generating patch for filter") + } + fullProgram := append(patch, program...) + + logrus.Debugf("seccomp: prepending -ENOSYS stub filter to user filter...") + for idx, insn := range patch { + logrus.Debugf(" [%4.1d] %s", idx, insn) + } + logrus.Debugf(" [....] --- original filter ---") + + fprog, err := assemble(fullProgram) + if err != nil { + return nil, errors.Wrap(err, "assembling modified filter") + } + return fprog, nil +} + +func filterFlags(filter *libseccomp.ScmpFilter) (flags uint, noNewPrivs bool, err error) { + // Ignore the error since pre-2.4 libseccomp is treated as API level 0. + apiLevel, _ := libseccomp.GetApi() + + noNewPrivs, err = filter.GetNoNewPrivsBit() + if err != nil { + return 0, false, errors.Wrap(err, "fetch no_new_privs filter bit") + } + + if apiLevel >= 3 { + if logBit, err := filter.GetLogBit(); err != nil { + return 0, false, errors.Wrap(err, "fetch SECCOMP_FILTER_FLAG_LOG bit") + } else if logBit { + flags |= uint(C.C_FILTER_FLAG_LOG) + } + } + + // TODO: Support seccomp flags not yet added to libseccomp-golang... + return +} + +func sysSeccompSetFilter(flags uint, filter []unix.SockFilter) (err error) { + fprog := unix.SockFprog{ + Len: uint16(len(filter)), + Filter: &filter[0], + } + // If no seccomp flags were requested we can use the old-school prctl(2). + if flags == 0 { + err = unix.Prctl(unix.PR_SET_SECCOMP, + unix.SECCOMP_MODE_FILTER, + uintptr(unsafe.Pointer(&fprog)), 0, 0) + } else { + _, _, err = unix.RawSyscall(unix.SYS_SECCOMP, + uintptr(C.C_SET_MODE_FILTER), + uintptr(flags), uintptr(unsafe.Pointer(&fprog))) + } + runtime.KeepAlive(filter) + runtime.KeepAlive(fprog) + return +} + +// PatchAndLoad takes a seccomp configuration and a libseccomp filter which has +// been pre-configured with the set of rules in the seccomp config. It then +// patches said filter to handle -ENOSYS in a much nicer manner than the +// default libseccomp default action behaviour, and loads the patched filter +// into the kernel for the current process. +func PatchAndLoad(config *configs.Seccomp, filter *libseccomp.ScmpFilter) error { + // Generate a patched filter. + fprog, err := enosysPatchFilter(config, filter) + if err != nil { + return errors.Wrap(err, "patching filter") + } + + // Get the set of libseccomp flags set. + seccompFlags, noNewPrivs, err := filterFlags(filter) + if err != nil { + return errors.Wrap(err, "fetch seccomp filter flags") + } + + // Set no_new_privs if it was requested, though in runc we handle + // no_new_privs separately so warn if we hit this path. + if noNewPrivs { + logrus.Warnf("potentially misconfigured filter -- setting no_new_privs in seccomp path") + if err := unix.Prctl(unix.PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); err != nil { + return errors.Wrap(err, "enable no_new_privs bit") + } + } + + // Finally, load the filter. + if err := sysSeccompSetFilter(seccompFlags, fprog); err != nil { + return errors.Wrap(err, "loading seccomp filter") + } + return nil +} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/seccomp/patchbpf/enosys_unsupported.go b/vendor/github.com/opencontainers/runc/libcontainer/seccomp/patchbpf/enosys_unsupported.go new file mode 100644 index 000000000000..682131e49cc6 --- /dev/null +++ b/vendor/github.com/opencontainers/runc/libcontainer/seccomp/patchbpf/enosys_unsupported.go @@ -0,0 +1,3 @@ +// +build !linux !cgo !seccomp + +package patchbpf diff --git a/vendor/github.com/opencontainers/runc/libcontainer/seccomp/seccomp_linux.go b/vendor/github.com/opencontainers/runc/libcontainer/seccomp/seccomp_linux.go index 73ddf3d1827c..5e7b365c563a 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/seccomp/seccomp_linux.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/seccomp/seccomp_linux.go @@ -10,8 +10,9 @@ import ( "strings" "github.com/opencontainers/runc/libcontainer/configs" - libseccomp "github.com/seccomp/libseccomp-golang" + "github.com/opencontainers/runc/libcontainer/seccomp/patchbpf" + libseccomp "github.com/seccomp/libseccomp-golang" "golang.org/x/sys/unix" ) @@ -54,7 +55,6 @@ func InitSeccomp(config *configs.Seccomp) error { if err != nil { return fmt.Errorf("error validating Seccomp architecture: %s", err) } - if err := filter.AddArch(scmpArch); err != nil { return fmt.Errorf("error adding architecture to seccomp filter: %s", err) } @@ -70,16 +70,13 @@ func InitSeccomp(config *configs.Seccomp) error { if call == nil { return errors.New("encountered nil syscall while initializing Seccomp") } - - if err = matchCall(filter, call); err != nil { + if err := matchCall(filter, call); err != nil { return err } } - - if err = filter.Load(); err != nil { + if err := patchbpf.PatchAndLoad(config, filter); err != nil { return fmt.Errorf("error loading seccomp filter into kernel: %s", err) } - return nil } @@ -190,7 +187,7 @@ func matchCall(filter *libseccomp.ScmpFilter, call *configs.Syscall) error { // Unconditional match - just add the rule if len(call.Args) == 0 { - if err = filter.AddRule(callNum, callAct); err != nil { + if err := filter.AddRule(callNum, callAct); err != nil { return fmt.Errorf("error adding seccomp filter rule for syscall %s: %s", call.Name, err) } } else { @@ -224,14 +221,14 @@ func matchCall(filter *libseccomp.ScmpFilter, call *configs.Syscall) error { for _, cond := range conditions { condArr := []libseccomp.ScmpCondition{cond} - if err = filter.AddRuleConditional(callNum, callAct, condArr); err != nil { + if err := filter.AddRuleConditional(callNum, callAct, condArr); err != nil { return fmt.Errorf("error adding seccomp rule for syscall %s: %s", call.Name, err) } } } else { // No conditions share same argument // Use new, proper behavior - if err = filter.AddRuleConditional(callNum, callAct, conditions); err != nil { + if err := filter.AddRuleConditional(callNum, callAct, conditions); err != nil { return fmt.Errorf("error adding seccomp rule for syscall %s: %s", call.Name, err) } } @@ -266,3 +263,8 @@ func parseStatusFile(path string) (map[string]string, error) { return status, nil } + +// Version returns major, minor, and micro. +func Version() (uint, uint, uint) { + return libseccomp.GetLibraryVersion() +} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/seccomp/seccomp_unsupported.go b/vendor/github.com/opencontainers/runc/libcontainer/seccomp/seccomp_unsupported.go index 44df1ad4c269..244886a42e54 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/seccomp/seccomp_unsupported.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/seccomp/seccomp_unsupported.go @@ -22,3 +22,8 @@ func InitSeccomp(config *configs.Seccomp) error { func IsEnabled() bool { return false } + +// Version returns major, minor, and micro. +func Version() (uint, uint, uint) { + return 0, 0, 0 +} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/setns_init_linux.go b/vendor/github.com/opencontainers/runc/libcontainer/setns_init_linux.go index 0b9cd885208c..6b1e9a6e97c8 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/setns_init_linux.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/setns_init_linux.go @@ -3,7 +3,6 @@ package libcontainer import ( - "fmt" "os" "runtime" @@ -25,7 +24,7 @@ type linuxSetnsInit struct { } func (l *linuxSetnsInit) getSessionRingName() string { - return fmt.Sprintf("_ses.%s", l.config.ContainerId) + return "_ses." + l.config.ContainerId } func (l *linuxSetnsInit) Init() error { diff --git a/vendor/github.com/opencontainers/runc/libcontainer/standard_init_linux.go b/vendor/github.com/opencontainers/runc/libcontainer/standard_init_linux.go index b20ce1485f8c..7ec506c462ed 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/standard_init_linux.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/standard_init_linux.go @@ -3,10 +3,10 @@ package libcontainer import ( - "fmt" "os" "os/exec" "runtime" + "strconv" "github.com/opencontainers/runc/libcontainer/apparmor" "github.com/opencontainers/runc/libcontainer/configs" @@ -40,7 +40,7 @@ func (l *linuxStandardInit) getSessionRingParams() (string, uint32, uint32) { // Create a unique per session container name that we can join in setns; // However, other containers can also join it. - return fmt.Sprintf("_ses.%s", l.config.ContainerId), 0xffffffff, newperms + return "_ses." + l.config.ContainerId, 0xffffffff, newperms } func (l *linuxStandardInit) Init() error { @@ -185,7 +185,7 @@ func (l *linuxStandardInit) Init() error { // user process. We open it through /proc/self/fd/$fd, because the fd that // was given to us was an O_PATH fd to the fifo itself. Linux allows us to // re-open an O_PATH fd through /proc. - fd, err := unix.Open(fmt.Sprintf("/proc/self/fd/%d", l.fifoFd), unix.O_WRONLY|unix.O_CLOEXEC, 0) + fd, err := unix.Open("/proc/self/fd/"+strconv.Itoa(l.fifoFd), unix.O_WRONLY|unix.O_CLOEXEC, 0) if err != nil { return newSystemErrorWithCause(err, "open exec fifo") } diff --git a/vendor/github.com/opencontainers/runc/libcontainer/state_linux.go b/vendor/github.com/opencontainers/runc/libcontainer/state_linux.go index 0deb22d1f940..02ff06ea9cc2 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/state_linux.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/state_linux.go @@ -38,7 +38,8 @@ type containerState interface { } func destroy(c *linuxContainer) error { - if !c.config.Namespaces.Contains(configs.NEWPID) { + if !c.config.Namespaces.Contains(configs.NEWPID) || + c.config.Namespaces.PathOf(configs.NEWPID) != "" { if err := signalAllProcesses(c.cgroupManager, unix.SIGKILL); err != nil { logrus.Warn(err) } diff --git a/vendor/github.com/opencontainers/runc/libcontainer/system/proc.go b/vendor/github.com/opencontainers/runc/libcontainer/system/proc.go index 79232a43715b..b73cf70b4344 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/system/proc.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/system/proc.go @@ -71,16 +71,6 @@ func Stat(pid int) (stat Stat_t, err error) { return parseStat(string(bytes)) } -// GetProcessStartTime is deprecated. Use Stat(pid) and -// Stat_t.StartTime instead. -func GetProcessStartTime(pid int) (string, error) { - stat, err := Stat(pid) - if err != nil { - return "", err - } - return fmt.Sprintf("%d", stat.StartTime), nil -} - func parseStat(data string) (stat Stat_t, err error) { // From proc(5), field 2 could contain space and is inside `(` and `)`. // The following is an example: diff --git a/vendor/github.com/opencontainers/runc/libcontainer/user/lookup_windows.go b/vendor/github.com/opencontainers/runc/libcontainer/user/lookup_windows.go index 65cd40e9287b..f19333e61eb1 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/user/lookup_windows.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/user/lookup_windows.go @@ -3,8 +3,8 @@ package user import ( - "fmt" "os/user" + "strconv" ) func lookupUser(username string) (User, error) { @@ -16,7 +16,7 @@ func lookupUser(username string) (User, error) { } func lookupUid(uid int) (User, error) { - u, err := user.LookupId(fmt.Sprintf("%d", uid)) + u, err := user.LookupId(strconv.Itoa(uid)) if err != nil { return User{}, err } @@ -32,7 +32,7 @@ func lookupGroup(groupname string) (Group, error) { } func lookupGid(gid int) (Group, error) { - g, err := user.LookupGroupId(fmt.Sprintf("%d", gid)) + g, err := user.LookupGroupId(strconv.Itoa(gid)) if err != nil { return Group{}, err } diff --git a/vendor/github.com/opencontainers/runc/libcontainer/user/user.go b/vendor/github.com/opencontainers/runc/libcontainer/user/user.go index 4b89dad73761..a533bf5e6686 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/user/user.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/user/user.go @@ -466,7 +466,7 @@ func GetAdditionalGroups(additionalGroups []string, group io.Reader) ([]int, err // we asked for a group but didn't find it. let's check to see // if we wanted a numeric group if !found { - gid, err := strconv.Atoi(ag) + gid, err := strconv.ParseInt(ag, 10, 64) if err != nil { return nil, fmt.Errorf("Unable to find group %s", ag) } @@ -474,7 +474,7 @@ func GetAdditionalGroups(additionalGroups []string, group io.Reader) ([]int, err if gid < minId || gid > maxId { return nil, ErrRange } - gidMap[gid] = struct{}{} + gidMap[int(gid)] = struct{}{} } } gids := []int{} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/utils/utils.go b/vendor/github.com/opencontainers/runc/libcontainer/utils/utils.go index 40ccfaa1a01a..1b72b7a1c1ba 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/utils/utils.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/utils/utils.go @@ -1,6 +1,7 @@ package utils import ( + "encoding/binary" "encoding/json" "io" "os" @@ -15,6 +16,20 @@ const ( exitSignalOffset = 128 ) +// NativeEndian is the native byte order of the host system. +var NativeEndian binary.ByteOrder + +func init() { + // Copied from . + i := uint32(1) + b := (*[4]byte)(unsafe.Pointer(&i)) + if b[0] == 1 { + NativeEndian = binary.LittleEndian + } else { + NativeEndian = binary.BigEndian + } +} + // ResolveRootfs ensures that the current working directory is // not a symlink and returns the absolute path to the rootfs func ResolveRootfs(uncleanRootfs string) (string, error) { @@ -106,7 +121,3 @@ func Annotations(labels []string) (bundle string, userAnnotations map[string]str } return } - -func GetIntSize() int { - return int(unsafe.Sizeof(1)) -} diff --git a/vendor/github.com/opencontainers/runc/types/events.go b/vendor/github.com/opencontainers/runc/types/events.go index 6f9a12f15964..81bde829da59 100644 --- a/vendor/github.com/opencontainers/runc/types/events.go +++ b/vendor/github.com/opencontainers/runc/types/events.go @@ -12,6 +12,7 @@ type Event struct { // stats is the runc specific stats structure for stability when encoding and decoding stats. type Stats struct { CPU Cpu `json:"cpu"` + CPUSet CPUSet `json:"cpuset"` Memory Memory `json:"memory"` Pids Pids `json:"pids"` Blkio Blkio `json:"blkio"` @@ -70,6 +71,20 @@ type Cpu struct { Throttling Throttling `json:"throttling,omitempty"` } +type CPUSet struct { + CPUs []uint16 `json:"cpus,omitempty"` + CPUExclusive uint64 `json:"cpu_exclusive"` + Mems []uint16 `json:"mems,omitempty"` + MemHardwall uint64 `json:"mem_hardwall"` + MemExclusive uint64 `json:"mem_exclusive"` + MemoryMigrate uint64 `json:"memory_migrate"` + MemorySpreadPage uint64 `json:"memory_spread_page"` + MemorySpreadSlab uint64 `json:"memory_spread_slab"` + MemoryPressure uint64 `json:"memory_pressure"` + SchedLoadBalance uint64 `json:"sched_load_balance"` + SchedRelaxDomainLevel int64 `json:"sched_relax_domain_level"` +} + type MemoryEntry struct { Limit uint64 `json:"limit"` Usage uint64 `json:"usage,omitempty"` diff --git a/vendor/github.com/opencontainers/runtime-spec/specs-go/config.go b/vendor/github.com/opencontainers/runtime-spec/specs-go/config.go index 3dc9efd23e68..5fceeb63533e 100644 --- a/vendor/github.com/opencontainers/runtime-spec/specs-go/config.go +++ b/vendor/github.com/opencontainers/runtime-spec/specs-go/config.go @@ -60,7 +60,7 @@ type Process struct { SelinuxLabel string `json:"selinuxLabel,omitempty" platform:"linux"` } -// LinuxCapabilities specifies the whitelist of capabilities that are kept for a process. +// LinuxCapabilities specifies the list of allowed capabilities that are kept for a process. // http://man7.org/linux/man-pages/man7/capabilities.7.html type LinuxCapabilities struct { // Bounding is the set of capabilities checked by the kernel. @@ -354,7 +354,7 @@ type LinuxRdma struct { // LinuxResources has container runtime resource constraints type LinuxResources struct { - // Devices configures the device whitelist. + // Devices configures the device allowlist. Devices []LinuxDeviceCgroup `json:"devices,omitempty"` // Memory restriction configuration Memory *LinuxMemory `json:"memory,omitempty"` @@ -372,6 +372,8 @@ type LinuxResources struct { // Limits are a set of key value pairs that define RDMA resource limits, // where the key is device name and value is resource limits. Rdma map[string]LinuxRdma `json:"rdma,omitempty"` + // Unified resources. + Unified map[string]string `json:"unified,omitempty"` } // LinuxDevice represents the mknod information for a Linux special device file @@ -392,7 +394,8 @@ type LinuxDevice struct { GID *uint32 `json:"gid,omitempty"` } -// LinuxDeviceCgroup represents a device rule for the whitelist controller +// LinuxDeviceCgroup represents a device rule for the devices specified to +// the device controller type LinuxDeviceCgroup struct { // Allow or deny Allow bool `json:"allow"` @@ -628,6 +631,7 @@ const ( ArchS390X Arch = "SCMP_ARCH_S390X" ArchPARISC Arch = "SCMP_ARCH_PARISC" ArchPARISC64 Arch = "SCMP_ARCH_PARISC64" + ArchRISCV64 Arch = "SCMP_ARCH_RISCV64" ) // LinuxSeccompAction taken upon Seccomp rule match diff --git a/vendor/github.com/opencontainers/selinux/go-selinux/doc.go b/vendor/github.com/opencontainers/selinux/go-selinux/doc.go index 79a8e6446db6..9c9cbd120aa1 100644 --- a/vendor/github.com/opencontainers/selinux/go-selinux/doc.go +++ b/vendor/github.com/opencontainers/selinux/go-selinux/doc.go @@ -5,9 +5,6 @@ This package uses a selinux build tag to enable the selinux functionality. This allows non-linux and linux users who do not have selinux support to still use tools that rely on this library. -To compile with full selinux support use the -tags=selinux option in your build -and test commands. - Usage: import "github.com/opencontainers/selinux/go-selinux" diff --git a/vendor/github.com/opencontainers/selinux/go-selinux/label/label_linux.go b/vendor/github.com/opencontainers/selinux/go-selinux/label/label_linux.go new file mode 100644 index 000000000000..43945551172b --- /dev/null +++ b/vendor/github.com/opencontainers/selinux/go-selinux/label/label_linux.go @@ -0,0 +1,190 @@ +package label + +import ( + "os" + "os/user" + "strings" + + "github.com/opencontainers/selinux/go-selinux" + "github.com/pkg/errors" +) + +// Valid Label Options +var validOptions = map[string]bool{ + "disable": true, + "type": true, + "filetype": true, + "user": true, + "role": true, + "level": true, +} + +var ErrIncompatibleLabel = errors.New("Bad SELinux option z and Z can not be used together") + +// InitLabels returns the process label and file labels to be used within +// the container. A list of options can be passed into this function to alter +// the labels. The labels returned will include a random MCS String, that is +// guaranteed to be unique. +func InitLabels(options []string) (plabel string, mlabel string, retErr error) { + if !selinux.GetEnabled() { + return "", "", nil + } + processLabel, mountLabel := selinux.ContainerLabels() + if processLabel != "" { + defer func() { + if retErr != nil { + selinux.ReleaseLabel(mountLabel) + } + }() + pcon, err := selinux.NewContext(processLabel) + if err != nil { + return "", "", err + } + mcsLevel := pcon["level"] + mcon, err := selinux.NewContext(mountLabel) + if err != nil { + return "", "", err + } + for _, opt := range options { + if opt == "disable" { + return "", mountLabel, nil + } + if i := strings.Index(opt, ":"); i == -1 { + return "", "", errors.Errorf("Bad label option %q, valid options 'disable' or \n'user, role, level, type, filetype' followed by ':' and a value", opt) + } + con := strings.SplitN(opt, ":", 2) + if !validOptions[con[0]] { + return "", "", errors.Errorf("Bad label option %q, valid options 'disable, user, role, level, type, filetype'", con[0]) + } + if con[0] == "filetype" { + mcon["type"] = con[1] + continue + } + pcon[con[0]] = con[1] + if con[0] == "level" || con[0] == "user" { + mcon[con[0]] = con[1] + } + } + if pcon.Get() != processLabel { + if pcon["level"] != mcsLevel { + selinux.ReleaseLabel(processLabel) + } + processLabel = pcon.Get() + selinux.ReserveLabel(processLabel) + } + mountLabel = mcon.Get() + } + return processLabel, mountLabel, nil +} + +// Deprecated: The GenLabels function is only to be used during the transition +// to the official API. Use InitLabels(strings.Fields(options)) instead. +func GenLabels(options string) (string, string, error) { + return InitLabels(strings.Fields(options)) +} + +// SetFileLabel modifies the "path" label to the specified file label +func SetFileLabel(path string, fileLabel string) error { + if !selinux.GetEnabled() || fileLabel == "" { + return nil + } + return selinux.SetFileLabel(path, fileLabel) +} + +// SetFileCreateLabel tells the kernel the label for all files to be created +func SetFileCreateLabel(fileLabel string) error { + if !selinux.GetEnabled() { + return nil + } + return selinux.SetFSCreateLabel(fileLabel) +} + +// Relabel changes the label of path to the filelabel string. +// It changes the MCS label to s0 if shared is true. +// This will allow all containers to share the content. +func Relabel(path string, fileLabel string, shared bool) error { + if !selinux.GetEnabled() || fileLabel == "" { + return nil + } + + exclude_paths := map[string]bool{ + "/": true, + "/bin": true, + "/boot": true, + "/dev": true, + "/etc": true, + "/etc/passwd": true, + "/etc/pki": true, + "/etc/shadow": true, + "/home": true, + "/lib": true, + "/lib64": true, + "/media": true, + "/opt": true, + "/proc": true, + "/root": true, + "/run": true, + "/sbin": true, + "/srv": true, + "/sys": true, + "/tmp": true, + "/usr": true, + "/var": true, + "/var/lib": true, + "/var/log": true, + } + + if home := os.Getenv("HOME"); home != "" { + exclude_paths[home] = true + } + + if sudoUser := os.Getenv("SUDO_USER"); sudoUser != "" { + if usr, err := user.Lookup(sudoUser); err == nil { + exclude_paths[usr.HomeDir] = true + } + } + + if path != "/" { + path = strings.TrimSuffix(path, "/") + } + if exclude_paths[path] { + return errors.Errorf("SELinux relabeling of %s is not allowed", path) + } + + if shared { + c, err := selinux.NewContext(fileLabel) + if err != nil { + return err + } + + c["level"] = "s0" + fileLabel = c.Get() + } + if err := selinux.Chcon(path, fileLabel, true); err != nil { + return err + } + return nil +} + +// DisableSecOpt returns a security opt that can disable labeling +// support for future container processes +// Deprecated: use selinux.DisableSecOpt +var DisableSecOpt = selinux.DisableSecOpt + +// Validate checks that the label does not include unexpected options +func Validate(label string) error { + if strings.Contains(label, "z") && strings.Contains(label, "Z") { + return ErrIncompatibleLabel + } + return nil +} + +// RelabelNeeded checks whether the user requested a relabel +func RelabelNeeded(label string) bool { + return strings.Contains(label, "z") || strings.Contains(label, "Z") +} + +// IsShared checks that the label includes a "shared" mark +func IsShared(label string) bool { + return strings.Contains(label, "z") +} diff --git a/vendor/github.com/opencontainers/selinux/go-selinux/label/label_selinux.go b/vendor/github.com/opencontainers/selinux/go-selinux/label/label_selinux.go deleted file mode 100644 index 10ac15a8524d..000000000000 --- a/vendor/github.com/opencontainers/selinux/go-selinux/label/label_selinux.go +++ /dev/null @@ -1,193 +0,0 @@ -// +build selinux,linux - -package label - -import ( - "os" - "os/user" - "strings" - - "github.com/opencontainers/selinux/go-selinux" - "github.com/pkg/errors" -) - -// Valid Label Options -var validOptions = map[string]bool{ - "disable": true, - "type": true, - "filetype": true, - "user": true, - "role": true, - "level": true, -} - -var ErrIncompatibleLabel = errors.New("Bad SELinux option z and Z can not be used together") - -// InitLabels returns the process label and file labels to be used within -// the container. A list of options can be passed into this function to alter -// the labels. The labels returned will include a random MCS String, that is -// guaranteed to be unique. -func InitLabels(options []string) (plabel string, mlabel string, Err error) { - if !selinux.GetEnabled() { - return "", "", nil - } - processLabel, mountLabel := selinux.ContainerLabels() - if processLabel != "" { - defer func() { - if Err != nil { - selinux.ReleaseLabel(mountLabel) - } - }() - pcon, err := selinux.NewContext(processLabel) - if err != nil { - return "", "", err - } - mcsLevel := pcon["level"] - mcon, err := selinux.NewContext(mountLabel) - if err != nil { - return "", "", err - } - for _, opt := range options { - if opt == "disable" { - return "", mountLabel, nil - } - if i := strings.Index(opt, ":"); i == -1 { - return "", "", errors.Errorf("Bad label option %q, valid options 'disable' or \n'user, role, level, type, filetype' followed by ':' and a value", opt) - } - con := strings.SplitN(opt, ":", 2) - if !validOptions[con[0]] { - return "", "", errors.Errorf("Bad label option %q, valid options 'disable, user, role, level, type, filetype'", con[0]) - - } - if con[0] == "filetype" { - mcon["type"] = con[1] - continue - } - pcon[con[0]] = con[1] - if con[0] == "level" || con[0] == "user" { - mcon[con[0]] = con[1] - } - } - if pcon.Get() != processLabel { - if pcon["level"] != mcsLevel { - selinux.ReleaseLabel(processLabel) - } - processLabel = pcon.Get() - selinux.ReserveLabel(processLabel) - } - mountLabel = mcon.Get() - } - return processLabel, mountLabel, nil -} - -// Deprecated: The GenLabels function is only to be used during the transition -// to the official API. Use InitLabels(strings.Fields(options)) instead. -func GenLabels(options string) (string, string, error) { - return InitLabels(strings.Fields(options)) -} - -// SetFileLabel modifies the "path" label to the specified file label -func SetFileLabel(path string, fileLabel string) error { - if !selinux.GetEnabled() || fileLabel == "" { - return nil - } - return selinux.SetFileLabel(path, fileLabel) -} - -// SetFileCreateLabel tells the kernel the label for all files to be created -func SetFileCreateLabel(fileLabel string) error { - if !selinux.GetEnabled() { - return nil - } - return selinux.SetFSCreateLabel(fileLabel) -} - -// Relabel changes the label of path to the filelabel string. -// It changes the MCS label to s0 if shared is true. -// This will allow all containers to share the content. -func Relabel(path string, fileLabel string, shared bool) error { - if !selinux.GetEnabled() || fileLabel == "" { - return nil - } - - exclude_paths := map[string]bool{ - "/": true, - "/bin": true, - "/boot": true, - "/dev": true, - "/etc": true, - "/etc/passwd": true, - "/etc/pki": true, - "/etc/shadow": true, - "/home": true, - "/lib": true, - "/lib64": true, - "/media": true, - "/opt": true, - "/proc": true, - "/root": true, - "/run": true, - "/sbin": true, - "/srv": true, - "/sys": true, - "/tmp": true, - "/usr": true, - "/var": true, - "/var/lib": true, - "/var/log": true, - } - - if home := os.Getenv("HOME"); home != "" { - exclude_paths[home] = true - } - - if sudoUser := os.Getenv("SUDO_USER"); sudoUser != "" { - if usr, err := user.Lookup(sudoUser); err == nil { - exclude_paths[usr.HomeDir] = true - } - } - - if path != "/" { - path = strings.TrimSuffix(path, "/") - } - if exclude_paths[path] { - return errors.Errorf("SELinux relabeling of %s is not allowed", path) - } - - if shared { - c, err := selinux.NewContext(fileLabel) - if err != nil { - return err - } - - c["level"] = "s0" - fileLabel = c.Get() - } - if err := selinux.Chcon(path, fileLabel, true); err != nil { - return err - } - return nil -} - -// DisableSecOpt returns a security opt that can disable labeling -// support for future container processes -// Deprecated: use selinux.DisableSecOpt -var DisableSecOpt = selinux.DisableSecOpt - -// Validate checks that the label does not include unexpected options -func Validate(label string) error { - if strings.Contains(label, "z") && strings.Contains(label, "Z") { - return ErrIncompatibleLabel - } - return nil -} - -// RelabelNeeded checks whether the user requested a relabel -func RelabelNeeded(label string) bool { - return strings.Contains(label, "z") || strings.Contains(label, "Z") -} - -// IsShared checks that the label includes a "shared" mark -func IsShared(label string) bool { - return strings.Contains(label, "z") -} diff --git a/vendor/github.com/opencontainers/selinux/go-selinux/label/label_stub.go b/vendor/github.com/opencontainers/selinux/go-selinux/label/label_stub.go index a7d2d5e342bb..02d206239c7e 100644 --- a/vendor/github.com/opencontainers/selinux/go-selinux/label/label_stub.go +++ b/vendor/github.com/opencontainers/selinux/go-selinux/label/label_stub.go @@ -1,4 +1,4 @@ -// +build !selinux !linux +// +build !linux package label diff --git a/vendor/github.com/opencontainers/selinux/go-selinux/selinux.go b/vendor/github.com/opencontainers/selinux/go-selinux/selinux.go index 50760dc93e76..d9119908b782 100644 --- a/vendor/github.com/opencontainers/selinux/go-selinux/selinux.go +++ b/vendor/github.com/opencontainers/selinux/go-selinux/selinux.go @@ -30,6 +30,11 @@ var ( // ErrLevelSyntax is returned when a sensitivity or category do not have correct syntax in a level ErrLevelSyntax = errors.New("invalid level syntax") + // ErrContextMissing is returned if a requested context is not found in a file. + ErrContextMissing = errors.New("context does not have a match") + // ErrVerifierNil is returned when a context verifier function is nil. + ErrVerifierNil = errors.New("verifier function is nil") + // CategoryRange allows the upper bound on the category range to be adjusted CategoryRange = DefaultCategoryRange ) @@ -63,8 +68,12 @@ func FileLabel(fpath string) (string, error) { return fileLabel(fpath) } -// SetFSCreateLabel tells kernel the label to create all file system objects -// created by this task. Setting label="" to return to default. +// SetFSCreateLabel tells the kernel what label to use for all file system objects +// created by this task. +// Set the label to an empty string to return to the default label. Calls to SetFSCreateLabel +// should be wrapped in runtime.LockOSThread()/runtime.UnlockOSThread() until file system +// objects created by this task are finished to guarantee another goroutine does not migrate +// to the current thread before execution is complete. func SetFSCreateLabel(label string) error { return setFSCreateLabel(label) } @@ -113,19 +122,27 @@ func CalculateGlbLub(sourceRange, targetRange string) (string, error) { } // SetExecLabel sets the SELinux label that the kernel will use for any programs -// that are executed by the current process thread, or an error. +// that are executed by the current process thread, or an error. Calls to SetExecLabel +// should be wrapped in runtime.LockOSThread()/runtime.UnlockOSThread() until execution +// of the program is finished to guarantee another goroutine does not migrate to the current +// thread before execution is complete. func SetExecLabel(label string) error { return setExecLabel(label) } // SetTaskLabel sets the SELinux label for the current thread, or an error. -// This requires the dyntransition permission. +// This requires the dyntransition permission. Calls to SetTaskLabel should +// be wrapped in runtime.LockOSThread()/runtime.UnlockOSThread() to guarantee +// the current thread does not run in a new mislabeled thread. func SetTaskLabel(label string) error { return setTaskLabel(label) } // SetSocketLabel takes a process label and tells the kernel to assign the -// label to the next socket that gets created +// label to the next socket that gets created. Calls to SetSocketLabel +// should be wrapped in runtime.LockOSThread()/runtime.UnlockOSThread() until +// the the socket is created to guarantee another goroutine does not migrate +// to the current thread before execution is complete. func SetSocketLabel(label string) error { return setSocketLabel(label) } @@ -141,7 +158,10 @@ func PeerLabel(fd uintptr) (string, error) { } // SetKeyLabel takes a process label and tells the kernel to assign the -// label to the next kernel keyring that gets created +// label to the next kernel keyring that gets created. Calls to SetKeyLabel +// should be wrapped in runtime.LockOSThread()/runtime.UnlockOSThread() until +// the kernel keyring is created to guarantee another goroutine does not migrate +// to the current thread before execution is complete. func SetKeyLabel(label string) error { return setKeyLabel(label) } @@ -247,3 +267,12 @@ func DupSecOpt(src string) ([]string, error) { func DisableSecOpt() []string { return disableSecOpt() } + +// GetDefaultContextWithLevel gets a single context for the specified SELinux user +// identity that is reachable from the specified scon context. The context is based +// on the per-user /etc/selinux/{SELINUXTYPE}/contexts/users/ if it exists, +// and falls back to the global /etc/selinux/{SELINUXTYPE}/contexts/default_contexts +// file. +func GetDefaultContextWithLevel(user, level, scon string) (string, error) { + return getDefaultContextWithLevel(user, level, scon) +} diff --git a/vendor/github.com/opencontainers/selinux/go-selinux/selinux_linux.go b/vendor/github.com/opencontainers/selinux/go-selinux/selinux_linux.go index d6b0d49db658..5bfcc0490269 100644 --- a/vendor/github.com/opencontainers/selinux/go-selinux/selinux_linux.go +++ b/vendor/github.com/opencontainers/selinux/go-selinux/selinux_linux.go @@ -1,5 +1,3 @@ -// +build selinux,linux - package selinux import ( @@ -28,6 +26,8 @@ const ( minSensLen = 2 contextFile = "/usr/share/containers/selinux/contexts" selinuxDir = "/etc/selinux/" + selinuxUsersDir = "contexts/users" + defaultContexts = "contexts/default_contexts" selinuxConfig = selinuxDir + "config" selinuxfsMount = "/sys/fs/selinux" selinuxTypeTag = "SELINUXTYPE" @@ -35,6 +35,8 @@ const ( xattrNameSelinux = "security.selinux" ) +var policyRoot = filepath.Join(selinuxDir, readConfig(selinuxTypeTag)) + type selinuxState struct { enabledSet bool enabled bool @@ -54,6 +56,13 @@ type mlsRange struct { high *level } +type defaultSECtx struct { + user, level, scon string + userRdr, defaultRdr io.Reader + + verifier func(string) error +} + type levelItem byte const ( @@ -111,7 +120,7 @@ func verifySELinuxfsMount(mnt string) bool { if err == nil { break } - if err == unix.EAGAIN { + if err == unix.EAGAIN || err == unix.EINTR { continue } return false @@ -205,28 +214,16 @@ func getEnabled() bool { } func readConfig(target string) string { - var ( - val, key string - bufin *bufio.Reader - ) - in, err := os.Open(selinuxConfig) if err != nil { return "" } defer in.Close() - bufin = bufio.NewReader(in) + scanner := bufio.NewScanner(in) - for done := false; !done; { - var line string - if line, err = bufin.ReadString('\n'); err != nil { - if err != io.EOF { - return "" - } - done = true - } - line = strings.TrimSpace(line) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) if len(line) == 0 { // Skip blank lines continue @@ -236,7 +233,7 @@ func readConfig(target string) string { continue } if groups := assignRegex.FindStringSubmatch(line); groups != nil { - key, val = strings.TrimSpace(groups[1]), strings.TrimSpace(groups[2]) + key, val := strings.TrimSpace(groups[1]), strings.TrimSpace(groups[2]) if key == target { return strings.Trim(val, "\"") } @@ -245,15 +242,17 @@ func readConfig(target string) string { return "" } -func getSELinuxPolicyRoot() string { - return filepath.Join(selinuxDir, readConfig(selinuxTypeTag)) -} - func isProcHandle(fh *os.File) error { var buf unix.Statfs_t - err := unix.Fstatfs(int(fh.Fd()), &buf) - if err != nil { - return errors.Wrapf(err, "statfs(%q) failed", fh.Name()) + + for { + err := unix.Fstatfs(int(fh.Fd()), &buf) + if err == nil { + break + } + if err != unix.EINTR { + return errors.Wrapf(err, "statfs(%q) failed", fh.Name()) + } } if buf.Type != unix.PROC_SUPER_MAGIC { return errors.Errorf("file %q is not on procfs", fh.Name()) @@ -307,9 +306,16 @@ func setFileLabel(fpath string, label string) error { if fpath == "" { return ErrEmptyPath } - if err := unix.Lsetxattr(fpath, xattrNameSelinux, []byte(label), 0); err != nil { - return errors.Wrapf(err, "failed to set file label on %s", fpath) + for { + err := unix.Lsetxattr(fpath, xattrNameSelinux, []byte(label), 0) + if err == nil { + break + } + if err != unix.EINTR { + return errors.Wrapf(err, "failed to set file label on %s", fpath) + } } + return nil } @@ -751,7 +757,7 @@ func reserveLabel(label string) { if len(label) != 0 { con := strings.SplitN(label, ":", 4) if len(con) > 3 { - mcsAdd(con[3]) + _ = mcsAdd(con[3]) } } } @@ -828,11 +834,11 @@ func intToMcs(id int, catRange uint32) string { } for ORD > TIER { - ORD = ORD - TIER + ORD -= TIER TIER-- } TIER = SETSIZE - TIER - ORD = ORD + TIER + ORD += TIER return fmt.Sprintf("s0:c%d,c%d", TIER, ORD) } @@ -844,16 +850,14 @@ func uniqMcs(catRange uint32) string { ) for { - binary.Read(rand.Reader, binary.LittleEndian, &n) + _ = binary.Read(rand.Reader, binary.LittleEndian, &n) c1 = n % catRange - binary.Read(rand.Reader, binary.LittleEndian, &n) + _ = binary.Read(rand.Reader, binary.LittleEndian, &n) c2 = n % catRange if c1 == c2 { continue - } else { - if c1 > c2 { - c1, c2 = c2, c1 - } + } else if c1 > c2 { + c1, c2 = c2, c1 } mcs = fmt.Sprintf("s0:c%d,c%d", c1, c2) if err := mcsAdd(mcs); err != nil { @@ -884,18 +888,13 @@ func openContextFile() (*os.File, error) { if f, err := os.Open(contextFile); err == nil { return f, nil } - lxcPath := filepath.Join(getSELinuxPolicyRoot(), "/contexts/lxc_contexts") + lxcPath := filepath.Join(policyRoot, "/contexts/lxc_contexts") return os.Open(lxcPath) } var labels = loadLabels() func loadLabels() map[string]string { - var ( - val, key string - bufin *bufio.Reader - ) - labels := make(map[string]string) in, err := openContextFile() if err != nil { @@ -903,18 +902,10 @@ func loadLabels() map[string]string { } defer in.Close() - bufin = bufio.NewReader(in) + scanner := bufio.NewScanner(in) - for done := false; !done; { - var line string - if line, err = bufin.ReadString('\n'); err != nil { - if err == io.EOF { - done = true - } else { - break - } - } - line = strings.TrimSpace(line) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) if len(line) == 0 { // Skip blank lines continue @@ -924,7 +915,7 @@ func loadLabels() map[string]string { continue } if groups := assignRegex.FindStringSubmatch(line); groups != nil { - key, val = strings.TrimSpace(groups[1]), strings.TrimSpace(groups[2]) + key, val := strings.TrimSpace(groups[1]), strings.TrimSpace(groups[2]) labels[key] = strings.Trim(val, "\"") } } @@ -1015,7 +1006,7 @@ func copyLevel(src, dest string) (string, error) { return "", err } mcsDelete(tcon["level"]) - mcsAdd(scon["level"]) + _ = mcsAdd(scon["level"]) tcon["level"] = scon["level"] return tcon.Get(), nil } @@ -1095,3 +1086,124 @@ func dupSecOpt(src string) ([]string, error) { func disableSecOpt() []string { return []string{"disable"} } + +// findUserInContext scans the reader for a valid SELinux context +// match that is verified with the verifier. Invalid contexts are +// skipped. It returns a matched context or an empty string if no +// match is found. If a scanner error occurs, it is returned. +func findUserInContext(context Context, r io.Reader, verifier func(string) error) (string, error) { + fromRole := context["role"] + fromType := context["type"] + scanner := bufio.NewScanner(r) + + for scanner.Scan() { + fromConns := strings.Fields(scanner.Text()) + if len(fromConns) == 0 { + // Skip blank lines + continue + } + + line := fromConns[0] + + if line[0] == ';' || line[0] == '#' { + // Skip comments + continue + } + + // user context files contexts are formatted as + // role_r:type_t:s0 where the user is missing. + lineArr := strings.SplitN(line, ":", 4) + // skip context with typo, or role and type do not match + if len(lineArr) != 3 || + lineArr[0] != fromRole || + lineArr[1] != fromType { + continue + } + + for _, cc := range fromConns[1:] { + toConns := strings.SplitN(cc, ":", 4) + if len(toConns) != 3 { + continue + } + + context["role"] = toConns[0] + context["type"] = toConns[1] + + outConn := context.get() + if err := verifier(outConn); err != nil { + continue + } + + return outConn, nil + } + } + + if err := scanner.Err(); err != nil { + return "", errors.Wrap(err, "failed to scan for context") + } + + return "", nil +} + +func getDefaultContextFromReaders(c *defaultSECtx) (string, error) { + if c.verifier == nil { + return "", ErrVerifierNil + } + + context, err := newContext(c.scon) + if err != nil { + return "", errors.Wrapf(err, "failed to create label for %s", c.scon) + } + + // set so the verifier validates the matched context with the provided user and level. + context["user"] = c.user + context["level"] = c.level + + conn, err := findUserInContext(context, c.userRdr, c.verifier) + if err != nil { + return "", err + } + + if conn != "" { + return conn, nil + } + + conn, err = findUserInContext(context, c.defaultRdr, c.verifier) + if err != nil { + return "", err + } + + if conn != "" { + return conn, nil + } + + return "", errors.Wrapf(ErrContextMissing, "context not found: %q", c.scon) +} + +func getDefaultContextWithLevel(user, level, scon string) (string, error) { + userPath := filepath.Join(policyRoot, selinuxUsersDir, user) + defaultPath := filepath.Join(policyRoot, defaultContexts) + + fu, err := os.Open(userPath) + if err != nil { + return "", err + } + defer fu.Close() + + fd, err := os.Open(defaultPath) + if err != nil { + return "", err + } + defer fd.Close() + + c := defaultSECtx{ + user: user, + level: level, + scon: scon, + userRdr: fu, + defaultRdr: fd, + verifier: securityCheckContext, + } + + return getDefaultContextFromReaders(&c) +} diff --git a/vendor/github.com/opencontainers/selinux/go-selinux/selinux_stub.go b/vendor/github.com/opencontainers/selinux/go-selinux/selinux_stub.go index c526b210f9c2..70b7b7c8519d 100644 --- a/vendor/github.com/opencontainers/selinux/go-selinux/selinux_stub.go +++ b/vendor/github.com/opencontainers/selinux/go-selinux/selinux_stub.go @@ -1,4 +1,4 @@ -// +build !selinux !linux +// +build !linux package selinux @@ -146,3 +146,7 @@ func dupSecOpt(src string) ([]string, error) { func disableSecOpt() []string { return []string{"disable"} } + +func getDefaultContextWithLevel(user, level, scon string) (string, error) { + return "", nil +} diff --git a/vendor/github.com/opencontainers/selinux/go-selinux/xattrs.go b/vendor/github.com/opencontainers/selinux/go-selinux/xattrs.go deleted file mode 100644 index de5c80ef3a93..000000000000 --- a/vendor/github.com/opencontainers/selinux/go-selinux/xattrs.go +++ /dev/null @@ -1,30 +0,0 @@ -// +build selinux,linux - -package selinux - -import ( - "golang.org/x/sys/unix" -) - -// Returns a []byte slice if the xattr is set and nil otherwise -// Requires path and its attribute as arguments -func lgetxattr(path string, attr string) ([]byte, error) { - // Start with a 128 length byte array - dest := make([]byte, 128) - sz, errno := unix.Lgetxattr(path, attr, dest) - for errno == unix.ERANGE { - // Buffer too small, use zero-sized buffer to get the actual size - sz, errno = unix.Lgetxattr(path, attr, []byte{}) - if errno != nil { - return nil, errno - } - - dest = make([]byte, sz) - sz, errno = unix.Lgetxattr(path, attr, dest) - } - if errno != nil { - return nil, errno - } - - return dest[:sz], nil -} diff --git a/vendor/github.com/opencontainers/selinux/go-selinux/xattrs_linux.go b/vendor/github.com/opencontainers/selinux/go-selinux/xattrs_linux.go new file mode 100644 index 000000000000..117c255be201 --- /dev/null +++ b/vendor/github.com/opencontainers/selinux/go-selinux/xattrs_linux.go @@ -0,0 +1,38 @@ +package selinux + +import ( + "golang.org/x/sys/unix" +) + +// lgetxattr returns a []byte slice containing the value of +// an extended attribute attr set for path. +func lgetxattr(path, attr string) ([]byte, error) { + // Start with a 128 length byte array + dest := make([]byte, 128) + sz, errno := doLgetxattr(path, attr, dest) + for errno == unix.ERANGE { + // Buffer too small, use zero-sized buffer to get the actual size + sz, errno = doLgetxattr(path, attr, []byte{}) + if errno != nil { + return nil, errno + } + + dest = make([]byte, sz) + sz, errno = doLgetxattr(path, attr, dest) + } + if errno != nil { + return nil, errno + } + + return dest[:sz], nil +} + +// doLgetxattr is a wrapper that retries on EINTR +func doLgetxattr(path, attr string, dest []byte) (int, error) { + for { + sz, err := unix.Lgetxattr(path, attr, dest) + if err != unix.EINTR { + return sz, err + } + } +} diff --git a/vendor/github.com/opencontainers/selinux/pkg/pwalk/pwalk.go b/vendor/github.com/opencontainers/selinux/pkg/pwalk/pwalk.go index 63fde18429ae..437b12b3e289 100644 --- a/vendor/github.com/opencontainers/selinux/pkg/pwalk/pwalk.go +++ b/vendor/github.com/opencontainers/selinux/pkg/pwalk/pwalk.go @@ -20,17 +20,16 @@ type WalkFunc = filepath.WalkFunc // // Note that this implementation only supports primitive error handling: // -// * no errors are ever passed to WalkFn +// - no errors are ever passed to WalkFn; // -// * once a walkFn returns any error, all further processing stops -// and the error is returned to the caller of Walk; +// - once a walkFn returns any error, all further processing stops +// and the error is returned to the caller of Walk; // -// * filepath.SkipDir is not supported; -// -// * if more than one walkFn instance will return an error, only one -// of such errors will be propagated and returned by Walk, others -// will be silently discarded. +// - filepath.SkipDir is not supported; // +// - if more than one walkFn instance will return an error, only one +// of such errors will be propagated and returned by Walk, others +// will be silently discarded. func Walk(root string, walkFn WalkFunc) error { return WalkN(root, walkFn, runtime.NumCPU()*2) } @@ -38,6 +37,8 @@ func Walk(root string, walkFn WalkFunc) error { // WalkN is a wrapper for filepath.Walk which can call multiple walkFn // in parallel, allowing to handle each item concurrently. A maximum of // num walkFn will be called at any one time. +// +// Please see Walk documentation for caveats of using this function. func WalkN(root string, walkFn WalkFunc, num int) error { // make sure limit is sensible if num < 1 { diff --git a/vendor/github.com/openshift/api/apiserver/v1/apiserver.openshift.io_deprecatedapirequests.yaml b/vendor/github.com/openshift/api/apiserver/v1/apiserver.openshift.io_deprecatedapirequests.yaml deleted file mode 100644 index 89beaaa9d501..000000000000 --- a/vendor/github.com/openshift/api/apiserver/v1/apiserver.openshift.io_deprecatedapirequests.yaml +++ /dev/null @@ -1,247 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - include.release.openshift.io/self-managed-high-availability: "true" - include.release.openshift.io/single-node-developer: "true" - name: deprecatedapirequests.apiserver.openshift.io -spec: - group: apiserver.openshift.io - names: - kind: DeprecatedAPIRequest - listKind: DeprecatedAPIRequestList - plural: deprecatedapirequests - singular: deprecatedapirequest - scope: Cluster - versions: - - name: v1 - schema: - openAPIV3Schema: - description: DeprecatedAPIRequest tracts requests made to a deprecated API. - The instance name should be of the form `resource.version.group`, matching - the deprecated resource. - type: object - required: - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: spec defines the characteristics of the resource. - type: object - properties: - removedRelease: - description: removedRelease is when the API will be removed. - type: string - maxLength: 64 - minLength: 3 - pattern: ^[0-9][0-9]*\.[0-9][0-9]*$ - status: - description: status contains the observed state of the resource. - type: object - properties: - conditions: - description: conditions contains details of the current status of - this API Resource. - type: array - items: - description: "Condition contains details for one aspect of the current - state of this API Resource. --- This struct is intended for direct - use as an array at the field path .status.conditions. For example, - type FooStatus struct{ // Represents the observations of a - foo's current state. // Known .status.conditions.type are: - \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type - \ // +patchStrategy=merge // +listType=map // +listMapKey=type - \ Conditions []metav1.Condition `json:\"conditions,omitempty\" - patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` - \n // other fields }" - type: object - required: - - lastTransitionTime - - message - - reason - - status - - type - properties: - lastTransitionTime: - description: lastTransitionTime is the last time the condition - transitioned from one status to another. This should be when - the underlying condition changed. If that is not known, then - using the time when the API field changed is acceptable. - type: string - format: date-time - message: - description: message is a human readable message indicating - details about the transition. This may be an empty string. - type: string - maxLength: 32768 - observedGeneration: - description: observedGeneration represents the .metadata.generation - that the condition was set based upon. For instance, if .metadata.generation - is currently 12, but the .status.conditions[x].observedGeneration - is 9, the condition is out of date with respect to the current - state of the instance. - type: integer - format: int64 - minimum: 0 - reason: - description: reason contains a programmatic identifier indicating - the reason for the condition's last transition. Producers - of specific condition types may define expected values and - meanings for this field, and whether the values are considered - a guaranteed API. The value should be a CamelCase string. - This field may not be empty. - type: string - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - status: - description: status of the condition, one of True, False, Unknown. - type: string - enum: - - "True" - - "False" - - Unknown - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - --- Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) - type: string - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - requestsLast24h: - description: requestsLast24h contains request history for the last - 24 hours, indexed by the hour, so 12:00AM-12:59 is in index 0, 6am-6:59am - is index 6, etc. The index of the current hour is updated live and - then duplicated into the requestsLastHour field. - type: array - items: - description: RequestLog logs request for various nodes. - type: object - properties: - nodes: - description: nodes contains logs of requests per node. - type: array - items: - description: NodeRequestLog contains logs of requests to a - certain node. - type: object - properties: - lastUpdate: - description: lastUpdate should *always* being within the - hour this is for. This is a time indicating the last - moment the server is recording for, not the actual update - time. - type: string - format: date-time - nodeName: - description: nodeName where the request are being handled. - type: string - users: - description: users contains request details by top 10 - users. Note that because in the case of an apiserver - restart the list of top 10 users is determined on a - best-effort basis, the list might be imprecise. - type: array - items: - description: RequestUser contains logs of a user's requests. - type: object - properties: - count: - description: count of requests. - type: integer - requests: - description: requests details by verb. - type: array - items: - description: RequestCount counts requests by API - request verb. - type: object - properties: - count: - description: count of requests for verb. - type: integer - verb: - description: verb of API request (get, list, - create, etc...) - type: string - username: - description: userName that made the request. - type: string - requestsLastHour: - description: requestsLastHour contains request history for the current - hour. This is porcelain to make the API easier to read by humans - seeing if they addressed a problem. This field is reset on the hour. - type: object - properties: - nodes: - description: nodes contains logs of requests per node. - type: array - items: - description: NodeRequestLog contains logs of requests to a certain - node. - type: object - properties: - lastUpdate: - description: lastUpdate should *always* being within the - hour this is for. This is a time indicating the last - moment the server is recording for, not the actual update - time. - type: string - format: date-time - nodeName: - description: nodeName where the request are being handled. - type: string - users: - description: users contains request details by top 10 users. - Note that because in the case of an apiserver restart - the list of top 10 users is determined on a best-effort - basis, the list might be imprecise. - type: array - items: - description: RequestUser contains logs of a user's requests. - type: object - properties: - count: - description: count of requests. - type: integer - requests: - description: requests details by verb. - type: array - items: - description: RequestCount counts requests by API - request verb. - type: object - properties: - count: - description: count of requests for verb. - type: integer - verb: - description: verb of API request (get, list, - create, etc...) - type: string - username: - description: userName that made the request. - type: string - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] diff --git a/vendor/github.com/openshift/api/apiserver/v1/register.go b/vendor/github.com/openshift/api/apiserver/v1/register.go index 0155194719d5..9d6e126e40e8 100644 --- a/vendor/github.com/openshift/api/apiserver/v1/register.go +++ b/vendor/github.com/openshift/api/apiserver/v1/register.go @@ -32,8 +32,6 @@ func addKnownTypes(scheme *runtime.Scheme) error { scheme.AddKnownTypes(GroupVersion, &APIRequestCount{}, &APIRequestCountList{}, - &DeprecatedAPIRequest{}, - &DeprecatedAPIRequestList{}, ) metav1.AddToGroupVersion(scheme, GroupVersion) return nil diff --git a/vendor/github.com/openshift/api/apiserver/v1/types_deprecatedapirequest.go b/vendor/github.com/openshift/api/apiserver/v1/types_deprecatedapirequest.go deleted file mode 100644 index 1ed77ef18060..000000000000 --- a/vendor/github.com/openshift/api/apiserver/v1/types_deprecatedapirequest.go +++ /dev/null @@ -1,114 +0,0 @@ -// Package v1 is an api version in the apiserver.openshift.io group -package v1 - -import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - -// +genclient -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -// +kubebuilder:resource:scope="Cluster" -// +kubebuilder:subresource:status -// +genclient:nonNamespaced - -// DeprecatedAPIRequest tracts requests made to a deprecated API. The instance name should -// be of the form `resource.version.group`, matching the deprecated resource. -type DeprecatedAPIRequest struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - - // spec defines the characteristics of the resource. - // +kubebuilder:validation:Required - // +required - Spec DeprecatedAPIRequestSpec `json:"spec"` - - // status contains the observed state of the resource. - Status DeprecatedAPIRequestStatus `json:"status,omitempty"` -} - -type DeprecatedAPIRequestSpec struct { - // removedRelease is when the API will be removed. - // +kubebuilder:validation:Pattern=^[0-9][0-9]*\.[0-9][0-9]*$ - // +kubebuilder:validation:MinLength=3 - // +kubebuilder:validation:MaxLength=64 - // +required - RemovedRelease string `json:"removedRelease"` -} - -// +k8s:deepcopy-gen=true -type DeprecatedAPIRequestStatus struct { - - // conditions contains details of the current status of this API Resource. - // +patchMergeKey=type - // +patchStrategy=merge - Conditions []metav1.Condition `json:"conditions" patchStrategy:"merge" patchMergeKey:"type"` - - // requestsLastHour contains request history for the current hour. This is porcelain to make the API - // easier to read by humans seeing if they addressed a problem. This field is reset on the hour. - RequestsLastHour RequestLog `json:"requestsLastHour"` - - // requestsLast24h contains request history for the last 24 hours, indexed by the hour, so - // 12:00AM-12:59 is in index 0, 6am-6:59am is index 6, etc. The index of the current hour - // is updated live and then duplicated into the requestsLastHour field. - RequestsLast24h []RequestLog `json:"requestsLast24h"` -} - -// RequestLog logs request for various nodes. -type RequestLog struct { - - // nodes contains logs of requests per node. - Nodes []NodeRequestLog `json:"nodes"` -} - -// NodeRequestLog contains logs of requests to a certain node. -type NodeRequestLog struct { - - // nodeName where the request are being handled. - NodeName string `json:"nodeName"` - - // lastUpdate should *always* being within the hour this is for. This is a time indicating - // the last moment the server is recording for, not the actual update time. - LastUpdate metav1.Time `json:"lastUpdate"` - - // users contains request details by top 10 users. Note that because in the case of an apiserver - // restart the list of top 10 users is determined on a best-effort basis, the list might be imprecise. - Users []RequestUser `json:"users"` -} - -type DeprecatedAPIRequestConditionType string - -const ( - // UsedInPastDay condition indicates a request has been made against the deprecated api in the last 24h. - UsedInPastDay DeprecatedAPIRequestConditionType = "UsedInPastDay" -) - -// RequestUser contains logs of a user's requests. -type RequestUser struct { - - // userName that made the request. - UserName string `json:"username"` - - // count of requests. - Count int `json:"count"` - - // requests details by verb. - Requests []RequestCount `json:"requests"` -} - -// RequestCount counts requests by API request verb. -type RequestCount struct { - - // verb of API request (get, list, create, etc...) - Verb string `json:"verb"` - - // count of requests for verb. - Count int `json:"count"` -} - -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -// DeprecatedAPIRequestList is a list of DeprecatedAPIRequest resources. -type DeprecatedAPIRequestList struct { - metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata"` - - Items []DeprecatedAPIRequest `json:"items"` -} diff --git a/vendor/github.com/openshift/api/apiserver/v1/zz_generated.deepcopy.go b/vendor/github.com/openshift/api/apiserver/v1/zz_generated.deepcopy.go index 139b0c8f878b..f350d6805dc7 100644 --- a/vendor/github.com/openshift/api/apiserver/v1/zz_generated.deepcopy.go +++ b/vendor/github.com/openshift/api/apiserver/v1/zz_generated.deepcopy.go @@ -117,138 +117,6 @@ func (in *APIRequestCountStatus) DeepCopy() *APIRequestCountStatus { return out } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *DeprecatedAPIRequest) DeepCopyInto(out *DeprecatedAPIRequest) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - out.Spec = in.Spec - in.Status.DeepCopyInto(&out.Status) - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeprecatedAPIRequest. -func (in *DeprecatedAPIRequest) DeepCopy() *DeprecatedAPIRequest { - if in == nil { - return nil - } - out := new(DeprecatedAPIRequest) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *DeprecatedAPIRequest) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *DeprecatedAPIRequestList) DeepCopyInto(out *DeprecatedAPIRequestList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]DeprecatedAPIRequest, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeprecatedAPIRequestList. -func (in *DeprecatedAPIRequestList) DeepCopy() *DeprecatedAPIRequestList { - if in == nil { - return nil - } - out := new(DeprecatedAPIRequestList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *DeprecatedAPIRequestList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *DeprecatedAPIRequestSpec) DeepCopyInto(out *DeprecatedAPIRequestSpec) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeprecatedAPIRequestSpec. -func (in *DeprecatedAPIRequestSpec) DeepCopy() *DeprecatedAPIRequestSpec { - if in == nil { - return nil - } - out := new(DeprecatedAPIRequestSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *DeprecatedAPIRequestStatus) DeepCopyInto(out *DeprecatedAPIRequestStatus) { - *out = *in - if in.Conditions != nil { - in, out := &in.Conditions, &out.Conditions - *out = make([]metav1.Condition, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - in.RequestsLastHour.DeepCopyInto(&out.RequestsLastHour) - if in.RequestsLast24h != nil { - in, out := &in.RequestsLast24h, &out.RequestsLast24h - *out = make([]RequestLog, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeprecatedAPIRequestStatus. -func (in *DeprecatedAPIRequestStatus) DeepCopy() *DeprecatedAPIRequestStatus { - if in == nil { - return nil - } - out := new(DeprecatedAPIRequestStatus) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NodeRequestLog) DeepCopyInto(out *NodeRequestLog) { - *out = *in - in.LastUpdate.DeepCopyInto(&out.LastUpdate) - if in.Users != nil { - in, out := &in.Users, &out.Users - *out = make([]RequestUser, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeRequestLog. -func (in *NodeRequestLog) DeepCopy() *NodeRequestLog { - if in == nil { - return nil - } - out := new(NodeRequestLog) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *PerNodeAPIRequestLog) DeepCopyInto(out *PerNodeAPIRequestLog) { *out = *in @@ -331,63 +199,3 @@ func (in *PerVerbAPIRequestCount) DeepCopy() *PerVerbAPIRequestCount { in.DeepCopyInto(out) return out } - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *RequestCount) DeepCopyInto(out *RequestCount) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RequestCount. -func (in *RequestCount) DeepCopy() *RequestCount { - if in == nil { - return nil - } - out := new(RequestCount) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *RequestLog) DeepCopyInto(out *RequestLog) { - *out = *in - if in.Nodes != nil { - in, out := &in.Nodes, &out.Nodes - *out = make([]NodeRequestLog, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RequestLog. -func (in *RequestLog) DeepCopy() *RequestLog { - if in == nil { - return nil - } - out := new(RequestLog) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *RequestUser) DeepCopyInto(out *RequestUser) { - *out = *in - if in.Requests != nil { - in, out := &in.Requests, &out.Requests - *out = make([]RequestCount, len(*in)) - copy(*out, *in) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RequestUser. -func (in *RequestUser) DeepCopy() *RequestUser { - if in == nil { - return nil - } - out := new(RequestUser) - in.DeepCopyInto(out) - return out -} diff --git a/vendor/github.com/openshift/api/apiserver/v1/zz_generated.swagger_doc_generated.go b/vendor/github.com/openshift/api/apiserver/v1/zz_generated.swagger_doc_generated.go index c1146a17aa02..d028d3696b75 100644 --- a/vendor/github.com/openshift/api/apiserver/v1/zz_generated.swagger_doc_generated.go +++ b/vendor/github.com/openshift/api/apiserver/v1/zz_generated.swagger_doc_generated.go @@ -92,81 +92,4 @@ func (PerVerbAPIRequestCount) SwaggerDoc() map[string]string { return map_PerVerbAPIRequestCount } -var map_DeprecatedAPIRequest = map[string]string{ - "": "DeprecatedAPIRequest tracts requests made to a deprecated API. The instance name should be of the form `resource.version.group`, matching the deprecated resource.", - "spec": "spec defines the characteristics of the resource.", - "status": "status contains the observed state of the resource.", -} - -func (DeprecatedAPIRequest) SwaggerDoc() map[string]string { - return map_DeprecatedAPIRequest -} - -var map_DeprecatedAPIRequestList = map[string]string{ - "": "DeprecatedAPIRequestList is a list of DeprecatedAPIRequest resources.", -} - -func (DeprecatedAPIRequestList) SwaggerDoc() map[string]string { - return map_DeprecatedAPIRequestList -} - -var map_DeprecatedAPIRequestSpec = map[string]string{ - "removedRelease": "removedRelease is when the API will be removed.", -} - -func (DeprecatedAPIRequestSpec) SwaggerDoc() map[string]string { - return map_DeprecatedAPIRequestSpec -} - -var map_DeprecatedAPIRequestStatus = map[string]string{ - "conditions": "conditions contains details of the current status of this API Resource.", - "requestsLastHour": "requestsLastHour contains request history for the current hour. This is porcelain to make the API easier to read by humans seeing if they addressed a problem. This field is reset on the hour.", - "requestsLast24h": "requestsLast24h contains request history for the last 24 hours, indexed by the hour, so 12:00AM-12:59 is in index 0, 6am-6:59am is index 6, etc. The index of the current hour is updated live and then duplicated into the requestsLastHour field.", -} - -func (DeprecatedAPIRequestStatus) SwaggerDoc() map[string]string { - return map_DeprecatedAPIRequestStatus -} - -var map_NodeRequestLog = map[string]string{ - "": "NodeRequestLog contains logs of requests to a certain node.", - "nodeName": "nodeName where the request are being handled.", - "lastUpdate": "lastUpdate should *always* being within the hour this is for. This is a time indicating the last moment the server is recording for, not the actual update time.", - "users": "users contains request details by top 10 users. Note that because in the case of an apiserver restart the list of top 10 users is determined on a best-effort basis, the list might be imprecise.", -} - -func (NodeRequestLog) SwaggerDoc() map[string]string { - return map_NodeRequestLog -} - -var map_RequestCount = map[string]string{ - "": "RequestCount counts requests by API request verb.", - "verb": "verb of API request (get, list, create, etc...)", - "count": "count of requests for verb.", -} - -func (RequestCount) SwaggerDoc() map[string]string { - return map_RequestCount -} - -var map_RequestLog = map[string]string{ - "": "RequestLog logs request for various nodes.", - "nodes": "nodes contains logs of requests per node.", -} - -func (RequestLog) SwaggerDoc() map[string]string { - return map_RequestLog -} - -var map_RequestUser = map[string]string{ - "": "RequestUser contains logs of a user's requests.", - "username": "userName that made the request.", - "count": "count of requests.", - "requests": "requests details by verb.", -} - -func (RequestUser) SwaggerDoc() map[string]string { - return map_RequestUser -} - // AUTO-GENERATED FUNCTIONS END HERE diff --git a/vendor/github.com/openshift/api/cloudnetwork/v1/001-cloudprivateipconfig.crd.yaml b/vendor/github.com/openshift/api/cloudnetwork/v1/001-cloudprivateipconfig.crd.yaml index 91c71ad51e6d..14588cba4ce3 100644 --- a/vendor/github.com/openshift/api/cloudnetwork/v1/001-cloudprivateipconfig.crd.yaml +++ b/vendor/github.com/openshift/api/cloudnetwork/v1/001-cloudprivateipconfig.crd.yaml @@ -1,13 +1,13 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: - name: cloudprivateipconfig.cloud.network.openshift.io + name: cloudprivateipconfigs.cloud.network.openshift.io spec: group: cloud.network.openshift.io names: kind: CloudPrivateIPConfig listKind: CloudPrivateIPConfigList - plural: cloudprivateipconfig + plural: cloudprivateipconfigs singular: cloudprivateipconfig scope: Cluster versions: diff --git a/vendor/github.com/openshift/api/cloudnetwork/v1/generated.proto b/vendor/github.com/openshift/api/cloudnetwork/v1/generated.proto index 18bba8a9fee3..3b675bac8138 100644 --- a/vendor/github.com/openshift/api/cloudnetwork/v1/generated.proto +++ b/vendor/github.com/openshift/api/cloudnetwork/v1/generated.proto @@ -28,7 +28,7 @@ option go_package = "v1"; // +k8s:openapi-gen=true // +kubebuilder:object:root=true // +kubebuilder:subresource:status -// +kubebuilder:resource:path=cloudprivateipconfig,scope=Cluster +// +kubebuilder:resource:path=cloudprivateipconfigs,scope=Cluster message CloudPrivateIPConfig { optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; diff --git a/vendor/github.com/openshift/api/cloudnetwork/v1/types.go b/vendor/github.com/openshift/api/cloudnetwork/v1/types.go index 3f899f5598e1..ae98ff6e1f15 100644 --- a/vendor/github.com/openshift/api/cloudnetwork/v1/types.go +++ b/vendor/github.com/openshift/api/cloudnetwork/v1/types.go @@ -20,7 +20,7 @@ import ( // +k8s:openapi-gen=true // +kubebuilder:object:root=true // +kubebuilder:subresource:status -// +kubebuilder:resource:path=cloudprivateipconfig,scope=Cluster +// +kubebuilder:resource:path=cloudprivateipconfigs,scope=Cluster type CloudPrivateIPConfig struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` diff --git a/vendor/github.com/openshift/api/helm/v1beta1/0000_10-helm-chart-repository.crd.yaml b/vendor/github.com/openshift/api/helm/v1beta1/0000_10-helm-chart-repository.crd.yaml index 21416cad7443..ac9d2823c749 100644 --- a/vendor/github.com/openshift/api/helm/v1beta1/0000_10-helm-chart-repository.crd.yaml +++ b/vendor/github.com/openshift/api/helm/v1beta1/0000_10-helm-chart-repository.crd.yaml @@ -1,4 +1,4 @@ -apiVersion: apiextensions.k8s.io/v1beta1 +apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: name: helmchartrepositories.helm.openshift.io @@ -8,7 +8,6 @@ metadata: include.release.openshift.io/single-node-developer: "true" spec: scope: Cluster - preserveUnknownFields: false group: helm.openshift.io names: kind: HelmChartRepository @@ -19,156 +18,156 @@ spec: - name: v1beta1 served: true storage: true - subresources: - status: {} - "validation": - "openAPIV3Schema": - description: HelmChartRepository holds cluster-wide configuration for proxied - Helm chart repository - type: object - required: - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: spec holds user settable values for configuration - type: object - properties: - connectionConfig: - description: Required configuration for connecting to the chart repo - type: object - properties: - ca: - description: ca is an optional reference to a config map by name - containing the PEM-encoded CA bundle. It is used as a trust anchor - to validate the TLS certificate presented by the remote server. - The key "ca-bundle.crt" is used to locate the data. If empty, - the default system roots are used. The namespace for this config - map is openshift-config. + subresources: + status: {} + schema: + openAPIV3Schema: + description: HelmChartRepository holds cluster-wide configuration for proxied + Helm chart repository + type: object + required: + - spec + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: spec holds user settable values for configuration + type: object + properties: + connectionConfig: + description: Required configuration for connecting to the chart repo + type: object + properties: + ca: + description: ca is an optional reference to a config map by name + containing the PEM-encoded CA bundle. It is used as a trust + anchor to validate the TLS certificate presented by the remote + server. The key "ca-bundle.crt" is used to locate the data. + If empty, the default system roots are used. The namespace for + this config map is openshift-config. + type: object + required: + - name + properties: + name: + description: name is the metadata.name of the referenced config + map + type: string + tlsClientConfig: + description: tlsClientConfig is an optional reference to a secret + by name that contains the PEM-encoded TLS client certificate + and private key to present when connecting to the server. The + key "tls.crt" is used to locate the client certificate. The + key "tls.key" is used to locate the private key. The namespace + for this secret is openshift-config. + type: object + required: + - name + properties: + name: + description: name is the metadata.name of the referenced secret + type: string + url: + description: Chart repository URL + type: string + maxLength: 2048 + pattern: ^https?:\/\/ + description: + description: Optional human readable repository description, it can + be used by UI for displaying purposes + type: string + maxLength: 2048 + minLength: 1 + disabled: + description: If set to true, disable the repo usage in the cluster + type: boolean + name: + description: Optional associated human readable repository name, it + can be used by UI for displaying purposes + type: string + maxLength: 100 + minLength: 1 + status: + description: Observed status of the repository within the cluster.. + type: object + properties: + conditions: + description: conditions is a list of conditions and their statuses + type: array + items: + description: "Condition contains details for one aspect of the current + state of this API Resource. --- This struct is intended for direct + use as an array at the field path .status.conditions. For example, + type FooStatus struct{ // Represents the observations of a + foo's current state. // Known .status.conditions.type are: + \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type + \ // +patchStrategy=merge // +listType=map // +listMapKey=type + \ Conditions []metav1.Condition `json:\"conditions,omitempty\" + patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` + \n // other fields }" type: object required: - - name + - lastTransitionTime + - message + - reason + - status + - type properties: - name: - description: name is the metadata.name of the referenced config - map + lastTransitionTime: + description: lastTransitionTime is the last time the condition + transitioned from one status to another. This should be when + the underlying condition changed. If that is not known, then + using the time when the API field changed is acceptable. type: string - tlsClientConfig: - description: tlsClientConfig is an optional reference to a secret - by name that contains the PEM-encoded TLS client certificate and - private key to present when connecting to the server. The key - "tls.crt" is used to locate the client certificate. The key "tls.key" - is used to locate the private key. The namespace for this secret - is openshift-config. - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced secret + format: date-time + message: + description: message is a human readable message indicating + details about the transition. This may be an empty string. type: string - url: - description: Chart repository URL - type: string - maxLength: 2048 - pattern: ^https?:\/\/ - description: - description: Optional human readable repository description, it can - be used by UI for displaying purposes - type: string - maxLength: 2048 - minLength: 1 - disabled: - description: If set to true, disable the repo usage in the cluster - type: boolean - name: - description: Optional associated human readable repository name, it - can be used by UI for displaying purposes - type: string - maxLength: 100 - minLength: 1 - status: - description: Observed status of the repository within the cluster.. - type: object - properties: - conditions: - description: conditions is a list of conditions and their statuses - type: array - items: - description: "Condition contains details for one aspect of the current - state of this API Resource. --- This struct is intended for direct - use as an array at the field path .status.conditions. For example, - type FooStatus struct{ // Represents the observations of a foo's - current state. // Known .status.conditions.type are: \"Available\", - \"Progressing\", and \"Degraded\" // +patchMergeKey=type // - +patchStrategy=merge // +listType=map // +listMapKey=type - \ Conditions []metav1.Condition `json:\"conditions,omitempty\" - patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` - \n // other fields }" - type: object - required: - - lastTransitionTime - - message - - reason - - status - - type - properties: - lastTransitionTime: - description: lastTransitionTime is the last time the condition - transitioned from one status to another. This should be when - the underlying condition changed. If that is not known, then - using the time when the API field changed is acceptable. - type: string - format: date-time - message: - description: message is a human readable message indicating details - about the transition. This may be an empty string. - type: string - maxLength: 32768 - observedGeneration: - description: observedGeneration represents the .metadata.generation - that the condition was set based upon. For instance, if .metadata.generation - is currently 12, but the .status.conditions[x].observedGeneration - is 9, the condition is out of date with respect to the current - state of the instance. - type: integer - format: int64 - minimum: 0 - reason: - description: reason contains a programmatic identifier indicating - the reason for the condition's last transition. Producers of - specific condition types may define expected values and meanings - for this field, and whether the values are considered a guaranteed - API. The value should be a CamelCase string. This field may - not be empty. - type: string - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - status: - description: status of the condition, one of True, False, Unknown. - type: string - enum: - - "True" - - "False" - - Unknown - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - --- Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) - type: string - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ + maxLength: 32768 + observedGeneration: + description: observedGeneration represents the .metadata.generation + that the condition was set based upon. For instance, if .metadata.generation + is currently 12, but the .status.conditions[x].observedGeneration + is 9, the condition is out of date with respect to the current + state of the instance. + type: integer + format: int64 + minimum: 0 + reason: + description: reason contains a programmatic identifier indicating + the reason for the condition's last transition. Producers + of specific condition types may define expected values and + meanings for this field, and whether the values are considered + a guaranteed API. The value should be a CamelCase string. + This field may not be empty. + type: string + maxLength: 1024 + minLength: 1 + pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ + status: + description: status of the condition, one of True, False, Unknown. + type: string + enum: + - "True" + - "False" + - Unknown + type: + description: type of condition in CamelCase or in foo.example.com/CamelCase. + --- Many .condition.type values are consistent across resources + like Available, but because arbitrary conditions can be useful + (see .node.status.conditions), the ability to deconflict is + important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) + type: string + maxLength: 316 + pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ diff --git a/vendor/github.com/openshift/apiserver-library-go/pkg/admission/imagepolicy/imagereferencemutators/pods.go b/vendor/github.com/openshift/apiserver-library-go/pkg/admission/imagepolicy/imagereferencemutators/pods.go index dd4c1eafd38e..89e8a40230d6 100644 --- a/vendor/github.com/openshift/apiserver-library-go/pkg/admission/imagepolicy/imagereferencemutators/pods.go +++ b/vendor/github.com/openshift/apiserver-library-go/pkg/admission/imagepolicy/imagereferencemutators/pods.go @@ -8,7 +8,6 @@ import ( kappsv1beta2 "k8s.io/api/apps/v1beta2" batchv1 "k8s.io/api/batch/v1" batchv1beta1 "k8s.io/api/batch/v1beta1" - batchv2alpha1 "k8s.io/api/batch/v2alpha1" corev1 "k8s.io/api/core/v1" extensionsv1beta1 "k8s.io/api/extensions/v1beta1" "k8s.io/apimachinery/pkg/api/errors" @@ -96,13 +95,9 @@ func GetPodSpecV1(obj runtime.Object) (*corev1.PodSpec, *field.Path, error) { case *batchv1.Job: return &r.Spec.Template.Spec, field.NewPath("spec", "template", "spec"), nil - case *batchv2alpha1.CronJob: - return &r.Spec.JobTemplate.Spec.Template.Spec, field.NewPath("spec", "jobTemplate", "spec", "template", "spec"), nil case *batchv1beta1.CronJob: return &r.Spec.JobTemplate.Spec.Template.Spec, field.NewPath("spec", "jobTemplate", "spec", "template", "spec"), nil - case *batchv2alpha1.JobTemplate: - return &r.Template.Spec.Template.Spec, field.NewPath("template", "spec", "template", "spec"), nil case *batchv1beta1.JobTemplate: return &r.Template.Spec.Template.Spec, field.NewPath("template", "spec", "template", "spec"), nil @@ -155,13 +150,9 @@ func GetTemplateMetaObject(obj runtime.Object) (metav1.Object, bool) { case *batchv1.Job: return &r.Spec.Template.ObjectMeta, true - case *batchv2alpha1.CronJob: - return &r.Spec.JobTemplate.Spec.Template.ObjectMeta, true case *batchv1beta1.CronJob: return &r.Spec.JobTemplate.Spec.Template.ObjectMeta, true - case *batchv2alpha1.JobTemplate: - return &r.Template.Spec.Template.ObjectMeta, true case *batchv1beta1.JobTemplate: return &r.Template.Spec.Template.ObjectMeta, true diff --git a/vendor/github.com/openshift/apiserver-library-go/pkg/securitycontextconstraints/sccadmission/admission.go b/vendor/github.com/openshift/apiserver-library-go/pkg/securitycontextconstraints/sccadmission/admission.go index 7f7652a8f929..990fd7a012e9 100644 --- a/vendor/github.com/openshift/apiserver-library-go/pkg/securitycontextconstraints/sccadmission/admission.go +++ b/vendor/github.com/openshift/apiserver-library-go/pkg/securitycontextconstraints/sccadmission/admission.go @@ -105,8 +105,8 @@ func (c *constraint) Admit(ctx context.Context, a admission.Attributes, _ admiss } // we didn't validate against any security context constraint provider, reject the pod and give the errors for each attempt - klog.V(4).Infof("unable to validate pod %s (generate: %s) against any security context constraint: %v", pod.Name, pod.GenerateName, validationErrs) - return admission.NewForbidden(a, fmt.Errorf("unable to validate against any security context constraint: %v", validationErrs)) + klog.V(4).Infof("unable to validate pod %s (generate: %s) against any security context constraint: %v", pod.Name, pod.GenerateName, validationErrs.ToAggregate()) + return admission.NewForbidden(a, fmt.Errorf("unable to validate against any security context constraint: %v", validationErrs.ToAggregate())) } func (c *constraint) Validate(ctx context.Context, a admission.Attributes, _ admission.ObjectInterfaces) error { @@ -217,6 +217,14 @@ loop: for i, provider = range providers { if !allowedForUserOrSA(provider) { denied = append(denied, provider.GetSCCName()) + // this will cause every security context constraint attempted, in order, to the failure + validationErrs = append(validationErrs, + field.Forbidden( + field.NewPath(fmt.Sprintf("provider %q", provider.GetSCCName())), + "not usable by user or serviceaccount", + ), + ) + continue } diff --git a/vendor/github.com/openshift/apiserver-library-go/pkg/securitycontextconstraints/sccmatching/provider.go b/vendor/github.com/openshift/apiserver-library-go/pkg/securitycontextconstraints/sccmatching/provider.go index 016b68bef90e..10866dc85c6e 100644 --- a/vendor/github.com/openshift/apiserver-library-go/pkg/securitycontextconstraints/sccmatching/provider.go +++ b/vendor/github.com/openshift/apiserver-library-go/pkg/securitycontextconstraints/sccmatching/provider.go @@ -191,9 +191,38 @@ func (s *simpleProvider) CreateContainerSecurityContext(pod *api.Pod, container sc.SetReadOnlyRootFilesystem(&readOnlyRootFS) } + isPrivileged := sc.Privileged() != nil && *sc.Privileged() + addCapSysAdmin := false + if caps != nil { + for _, cap := range caps.Add { + if string(cap) == "CAP_SYS_ADMIN" { + addCapSysAdmin = true + break + } + } + } + // if the SCC sets DefaultAllowPrivilegeEscalation and the container security context // allowPrivilegeEscalation is not set, then default to that set by the SCC. - if s.scc.DefaultAllowPrivilegeEscalation != nil && sc.AllowPrivilegeEscalation() == nil { + // + // Exception: privileged pods and CAP_SYS_ADMIN capability + // + // This corresponds to Kube's pod validation: + // + // if sc.AllowPrivilegeEscalation != nil && !*sc.AllowPrivilegeEscalation { + // if sc.Privileged != nil && *sc.Privileged { + // allErrs = append(allErrs, field.Invalid(fldPath, sc, "cannot set `allowPrivilegeEscalation` to false and `privileged` to true")) + // } + // + // if sc.Capabilities != nil { + // for _, cap := range sc.Capabilities.Add { + // if string(cap) == "CAP_SYS_ADMIN" { + // allErrs = append(allErrs, field.Invalid(fldPath, sc, "cannot set `allowPrivilegeEscalation` to false and `capabilities.Add` CAP_SYS_ADMIN")) + // } + // } + // } + // } + if s.scc.DefaultAllowPrivilegeEscalation != nil && sc.AllowPrivilegeEscalation() == nil && !isPrivileged && !addCapSysAdmin { sc.SetAllowPrivilegeEscalation(s.scc.DefaultAllowPrivilegeEscalation) } diff --git a/vendor/github.com/openshift/build-machinery-go/Makefile b/vendor/github.com/openshift/build-machinery-go/Makefile index aa131b622e5d..7b69ea411d65 100644 --- a/vendor/github.com/openshift/build-machinery-go/Makefile +++ b/vendor/github.com/openshift/build-machinery-go/Makefile @@ -19,7 +19,7 @@ define update-makefile-log mkdir -p "$(3)" set -o pipefail; $(MAKE) -j 1 -C "$(dir $(1))" -f "$(notdir $(1))" --no-print-directory --warn-undefined-variables $(2) 2>&1 | \ sed 's/\.\(buildDate\|versionFromGit\|commitFromGit\|gitTreeState\)="[^"]*" /.\1="" /g' | \ - sed -E 's~/.*/(github.com/openshift/build-machinery-go/.*)~/\1~g' | \ + sed -E 's~/[^ ]*/(github.com/openshift/build-machinery-go/[^ ]*)~/\1~g' | \ sed '/\/tmp\/tmp./d' | \ sed '/git checkout -b/d' | \ sed -E 's~^[<> ]*((\+\+\+|\-\-\-) \./(testing/)?manifests/.*.yaml).*~\1~' | \ diff --git a/vendor/github.com/openshift/build-machinery-go/README.md b/vendor/github.com/openshift/build-machinery-go/README.md index bd37d7346605..66862f61a22a 100644 --- a/vendor/github.com/openshift/build-machinery-go/README.md +++ b/vendor/github.com/openshift/build-machinery-go/README.md @@ -40,5 +40,5 @@ Extends [#Default](). ### Updating generated files We track the log output from the makefile tests to make sure any change is visible and can be audited. Unfortunately due to subtle linux tooling differences in distributions and versions, `make update` may not get you the exact output as the CI. To avoid it, just run the command in the same container as CI: ``` -podman run -it --rm --pull=always -v $( pwd ):/go/src/$( go list -m ) --workdir=/go/src/$( go list -m ) registry.svc.ci.openshift.org/openshift/release:rhel-8-release-golang-1.15-openshift-4.7 make update +podman run -it --rm --pull=always -v $( pwd ):/go/src/$( go list -m ) --workdir=/go/src/$( go list -m ) registry.ci.openshift.org/openshift/release:rhel-8-release-golang-1.15-openshift-4.7 make update ``` diff --git a/vendor/github.com/openshift/build-machinery-go/make/default.example.mk.help.log b/vendor/github.com/openshift/build-machinery-go/make/default.example.mk.help.log index 05285660d515..39b69793745d 100644 --- a/vendor/github.com/openshift/build-machinery-go/make/default.example.mk.help.log +++ b/vendor/github.com/openshift/build-machinery-go/make/default.example.mk.help.log @@ -20,5 +20,6 @@ verify-codegen verify-deps verify-generated verify-gofmt +verify-golang-versions verify-golint verify-govet diff --git a/vendor/github.com/openshift/build-machinery-go/make/golang.example.mk.help.log b/vendor/github.com/openshift/build-machinery-go/make/golang.example.mk.help.log index a5cc906ddf6c..2a908b01337b 100644 --- a/vendor/github.com/openshift/build-machinery-go/make/golang.example.mk.help.log +++ b/vendor/github.com/openshift/build-machinery-go/make/golang.example.mk.help.log @@ -10,5 +10,6 @@ update update-gofmt verify verify-gofmt +verify-golang-versions verify-golint verify-govet diff --git a/vendor/github.com/openshift/build-machinery-go/make/golang.mk b/vendor/github.com/openshift/build-machinery-go/make/golang.mk index 15a0b49bcb0b..2c16ccafc7e6 100644 --- a/vendor/github.com/openshift/build-machinery-go/make/golang.mk +++ b/vendor/github.com/openshift/build-machinery-go/make/golang.mk @@ -6,6 +6,7 @@ self_dir := $(dir $(lastword $(MAKEFILE_LIST))) verify: verify-gofmt verify: verify-govet +verify: verify-golang-versions .PHONY: verify update: update-gofmt diff --git a/vendor/github.com/openshift/build-machinery-go/make/operator.example.mk.help.log b/vendor/github.com/openshift/build-machinery-go/make/operator.example.mk.help.log index 42a5fd5a3084..834cfbb90194 100644 --- a/vendor/github.com/openshift/build-machinery-go/make/operator.example.mk.help.log +++ b/vendor/github.com/openshift/build-machinery-go/make/operator.example.mk.help.log @@ -26,6 +26,7 @@ verify-codegen verify-deps verify-generated verify-gofmt +verify-golang-versions verify-golint verify-govet verify-profile-manifests diff --git a/vendor/github.com/openshift/build-machinery-go/make/targets/golang/version.mk b/vendor/github.com/openshift/build-machinery-go/make/targets/golang/version.mk new file mode 100644 index 000000000000..7532dfcf989d --- /dev/null +++ b/vendor/github.com/openshift/build-machinery-go/make/targets/golang/version.mk @@ -0,0 +1,65 @@ +self_dir :=$(dir $(lastword $(MAKEFILE_LIST))) + +.empty-golang-versions-files: + @rm -f "$(PERMANENT_TMP)/golang-versions" "$(PERMANENT_TMP)/named-golang-versions" +.PHONE: .empty-golang-versions-files + +verify-golang-versions: + @if [ -f "$(PERMANENT_TMP)/golang-versions" ]; then \ + LINES=$$(cat "$(PERMANENT_TMP)/golang-versions" | sort | uniq | wc -l); \ + if [ $${LINES} -gt 1 ]; then \ + echo "Golang version mismatch:"; \ + cat "$(PERMANENT_TMP)/named-golang-versions" | sort | sed 's/^/- /'; \ + false; \ + fi; \ + fi +.PHONY: verify-golang-versions + +# $1 - filename (symbolic, used as postfix in Makefile target) +# $2 - golang version +define verify-golang-version-reference-internal +verify-golang-versions-$(1): .empty-golang-versions-files +verify-golang-versions-$(1): + @mkdir -p "$(PERMANENT_TMP)" + @echo "$(1): $(2)" >> "$(PERMANENT_TMP)/named-golang-versions" + @echo "$(2)" >> "$(PERMANENT_TMP)/golang-versions" +.PHONY: verify-golang-versions-$(1) + +verify-golang-versions: verify-golang-versions-$(1) +endef + +# $1 - filename (symbolic, used as postfix in Makefile target) +# $2 - golang version +define verify-golang-version-reference +$(eval $(call verify-golang-version-reference-internal,$(1),$(2))) +endef + +# $1 - Dockerfile filename (symbolic, used as postfix in Makefile target) +define verify-Dockerfile-builder-golang-version +$(call verify-golang-version-reference,$(1),$(shell grep "AS builder" "$(1)" | sed 's/.*golang-\([[:digit:]][[:digit:]]*.[[:digit:]][[:digit:]]*\).*/\1/')) +endef + +define verify-go-mod-golang-version +$(call verify-golang-version-reference,go.mod,$(shell grep -e 'go [[:digit:]]*\.[[:digit:]]*' go.mod 2>/dev/null | sed 's/go //')) +endef + +define verify-buildroot-golang-version +$(call verify-golang-version-reference,.ci-operator.yaml,$(shell grep -e 'tag: .*golang-[[:digit:]]*\.[[:digit:]]' .ci-operator.yaml 2>/dev/null | sed 's/.*golang-\([[:digit:]][[:digit:]]*.[[:digit:]][[:digit:]]*\).*/\1/')) +endef + +# $1 - optional Dockerfile filename (symbolic, used as postfix in Makefile target) +define verify-golang-versions +$(if $(1),$(call verify-Dockerfile-builder-golang-version,$(1))) \ +$(if $(wildcard ./.ci-operator.yaml),$(if $(shell grep 'build_root_image:' .ci-operator.yaml 2>/dev/null),$(call verify-buildroot-golang-version))) \ +$(if $(wildcard ./go.mod),$(call verify-go-mod-golang-version)) +endef + +# We need to be careful to expand all the paths before any include is done +# or self_dir could be modified for the next include by the included file. +# Also doing this at the end of the file allows us to use self_dir before it could be modified. +include $(addprefix $(self_dir), \ + ../../lib/golang.mk \ +) +include $(addprefix $(self_dir), \ + ../../lib/tmp.mk \ +) \ No newline at end of file diff --git a/vendor/github.com/openshift/build-machinery-go/make/targets/openshift/operator/profile-manifests.mk b/vendor/github.com/openshift/build-machinery-go/make/targets/openshift/operator/profile-manifests.mk index b57ecd5ea877..a338831a98ca 100644 --- a/vendor/github.com/openshift/build-machinery-go/make/targets/openshift/operator/profile-manifests.mk +++ b/vendor/github.com/openshift/build-machinery-go/make/targets/openshift/operator/profile-manifests.mk @@ -6,6 +6,7 @@ self_dir :=$(dir $(lastword $(MAKEFILE_LIST))) # $3 - output file define patch-manifest-yq $(YQ) m -x '$(2)' '$(1)' > '$(3)' + sed -i '$(3)' -e '1s/^/# *** AUTOMATICALLY GENERATED FILE - DO NOT EDIT ***\n/' endef @@ -15,6 +16,7 @@ endef # $3 - output file define patch-manifest-yaml-patch $(YAML_PATCH) -o '$(1)' < '$(2)' > '$(3)' + sed -i '$(3)' -e '1s/^/# *** AUTOMATICALLY GENERATED FILE - DO NOT EDIT ***\n/' endef diff --git a/vendor/github.com/openshift/client-go/apiserver/clientset/versioned/typed/apiserver/v1/apiserver_client.go b/vendor/github.com/openshift/client-go/apiserver/clientset/versioned/typed/apiserver/v1/apiserver_client.go index 3b5e101c6bf6..92965d9070cc 100644 --- a/vendor/github.com/openshift/client-go/apiserver/clientset/versioned/typed/apiserver/v1/apiserver_client.go +++ b/vendor/github.com/openshift/client-go/apiserver/clientset/versioned/typed/apiserver/v1/apiserver_client.go @@ -11,7 +11,6 @@ import ( type ApiserverV1Interface interface { RESTClient() rest.Interface APIRequestCountsGetter - DeprecatedAPIRequestsGetter } // ApiserverV1Client is used to interact with features provided by the apiserver.openshift.io group. @@ -23,10 +22,6 @@ func (c *ApiserverV1Client) APIRequestCounts() APIRequestCountInterface { return newAPIRequestCounts(c) } -func (c *ApiserverV1Client) DeprecatedAPIRequests() DeprecatedAPIRequestInterface { - return newDeprecatedAPIRequests(c) -} - // NewForConfig creates a new ApiserverV1Client for the given config. func NewForConfig(c *rest.Config) (*ApiserverV1Client, error) { config := *c diff --git a/vendor/github.com/openshift/client-go/apiserver/clientset/versioned/typed/apiserver/v1/deprecatedapirequest.go b/vendor/github.com/openshift/client-go/apiserver/clientset/versioned/typed/apiserver/v1/deprecatedapirequest.go deleted file mode 100644 index 076f4a4fda98..000000000000 --- a/vendor/github.com/openshift/client-go/apiserver/clientset/versioned/typed/apiserver/v1/deprecatedapirequest.go +++ /dev/null @@ -1,168 +0,0 @@ -// Code generated by client-gen. DO NOT EDIT. - -package v1 - -import ( - "context" - "time" - - v1 "github.com/openshift/api/apiserver/v1" - scheme "github.com/openshift/client-go/apiserver/clientset/versioned/scheme" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - types "k8s.io/apimachinery/pkg/types" - watch "k8s.io/apimachinery/pkg/watch" - rest "k8s.io/client-go/rest" -) - -// DeprecatedAPIRequestsGetter has a method to return a DeprecatedAPIRequestInterface. -// A group's client should implement this interface. -type DeprecatedAPIRequestsGetter interface { - DeprecatedAPIRequests() DeprecatedAPIRequestInterface -} - -// DeprecatedAPIRequestInterface has methods to work with DeprecatedAPIRequest resources. -type DeprecatedAPIRequestInterface interface { - Create(ctx context.Context, deprecatedAPIRequest *v1.DeprecatedAPIRequest, opts metav1.CreateOptions) (*v1.DeprecatedAPIRequest, error) - Update(ctx context.Context, deprecatedAPIRequest *v1.DeprecatedAPIRequest, opts metav1.UpdateOptions) (*v1.DeprecatedAPIRequest, error) - UpdateStatus(ctx context.Context, deprecatedAPIRequest *v1.DeprecatedAPIRequest, opts metav1.UpdateOptions) (*v1.DeprecatedAPIRequest, error) - Delete(ctx context.Context, name string, opts metav1.DeleteOptions) error - DeleteCollection(ctx context.Context, opts metav1.DeleteOptions, listOpts metav1.ListOptions) error - Get(ctx context.Context, name string, opts metav1.GetOptions) (*v1.DeprecatedAPIRequest, error) - List(ctx context.Context, opts metav1.ListOptions) (*v1.DeprecatedAPIRequestList, error) - Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) - Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.DeprecatedAPIRequest, err error) - DeprecatedAPIRequestExpansion -} - -// deprecatedAPIRequests implements DeprecatedAPIRequestInterface -type deprecatedAPIRequests struct { - client rest.Interface -} - -// newDeprecatedAPIRequests returns a DeprecatedAPIRequests -func newDeprecatedAPIRequests(c *ApiserverV1Client) *deprecatedAPIRequests { - return &deprecatedAPIRequests{ - client: c.RESTClient(), - } -} - -// Get takes name of the deprecatedAPIRequest, and returns the corresponding deprecatedAPIRequest object, and an error if there is any. -func (c *deprecatedAPIRequests) Get(ctx context.Context, name string, options metav1.GetOptions) (result *v1.DeprecatedAPIRequest, err error) { - result = &v1.DeprecatedAPIRequest{} - err = c.client.Get(). - Resource("deprecatedapirequests"). - Name(name). - VersionedParams(&options, scheme.ParameterCodec). - Do(ctx). - Into(result) - return -} - -// List takes label and field selectors, and returns the list of DeprecatedAPIRequests that match those selectors. -func (c *deprecatedAPIRequests) List(ctx context.Context, opts metav1.ListOptions) (result *v1.DeprecatedAPIRequestList, err error) { - var timeout time.Duration - if opts.TimeoutSeconds != nil { - timeout = time.Duration(*opts.TimeoutSeconds) * time.Second - } - result = &v1.DeprecatedAPIRequestList{} - err = c.client.Get(). - Resource("deprecatedapirequests"). - VersionedParams(&opts, scheme.ParameterCodec). - Timeout(timeout). - Do(ctx). - Into(result) - return -} - -// Watch returns a watch.Interface that watches the requested deprecatedAPIRequests. -func (c *deprecatedAPIRequests) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) { - var timeout time.Duration - if opts.TimeoutSeconds != nil { - timeout = time.Duration(*opts.TimeoutSeconds) * time.Second - } - opts.Watch = true - return c.client.Get(). - Resource("deprecatedapirequests"). - VersionedParams(&opts, scheme.ParameterCodec). - Timeout(timeout). - Watch(ctx) -} - -// Create takes the representation of a deprecatedAPIRequest and creates it. Returns the server's representation of the deprecatedAPIRequest, and an error, if there is any. -func (c *deprecatedAPIRequests) Create(ctx context.Context, deprecatedAPIRequest *v1.DeprecatedAPIRequest, opts metav1.CreateOptions) (result *v1.DeprecatedAPIRequest, err error) { - result = &v1.DeprecatedAPIRequest{} - err = c.client.Post(). - Resource("deprecatedapirequests"). - VersionedParams(&opts, scheme.ParameterCodec). - Body(deprecatedAPIRequest). - Do(ctx). - Into(result) - return -} - -// Update takes the representation of a deprecatedAPIRequest and updates it. Returns the server's representation of the deprecatedAPIRequest, and an error, if there is any. -func (c *deprecatedAPIRequests) Update(ctx context.Context, deprecatedAPIRequest *v1.DeprecatedAPIRequest, opts metav1.UpdateOptions) (result *v1.DeprecatedAPIRequest, err error) { - result = &v1.DeprecatedAPIRequest{} - err = c.client.Put(). - Resource("deprecatedapirequests"). - Name(deprecatedAPIRequest.Name). - VersionedParams(&opts, scheme.ParameterCodec). - Body(deprecatedAPIRequest). - Do(ctx). - Into(result) - return -} - -// UpdateStatus was generated because the type contains a Status member. -// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). -func (c *deprecatedAPIRequests) UpdateStatus(ctx context.Context, deprecatedAPIRequest *v1.DeprecatedAPIRequest, opts metav1.UpdateOptions) (result *v1.DeprecatedAPIRequest, err error) { - result = &v1.DeprecatedAPIRequest{} - err = c.client.Put(). - Resource("deprecatedapirequests"). - Name(deprecatedAPIRequest.Name). - SubResource("status"). - VersionedParams(&opts, scheme.ParameterCodec). - Body(deprecatedAPIRequest). - Do(ctx). - Into(result) - return -} - -// Delete takes name of the deprecatedAPIRequest and deletes it. Returns an error if one occurs. -func (c *deprecatedAPIRequests) Delete(ctx context.Context, name string, opts metav1.DeleteOptions) error { - return c.client.Delete(). - Resource("deprecatedapirequests"). - Name(name). - Body(&opts). - Do(ctx). - Error() -} - -// DeleteCollection deletes a collection of objects. -func (c *deprecatedAPIRequests) DeleteCollection(ctx context.Context, opts metav1.DeleteOptions, listOpts metav1.ListOptions) error { - var timeout time.Duration - if listOpts.TimeoutSeconds != nil { - timeout = time.Duration(*listOpts.TimeoutSeconds) * time.Second - } - return c.client.Delete(). - Resource("deprecatedapirequests"). - VersionedParams(&listOpts, scheme.ParameterCodec). - Timeout(timeout). - Body(&opts). - Do(ctx). - Error() -} - -// Patch applies the patch and returns the patched deprecatedAPIRequest. -func (c *deprecatedAPIRequests) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.DeprecatedAPIRequest, err error) { - result = &v1.DeprecatedAPIRequest{} - err = c.client.Patch(pt). - Resource("deprecatedapirequests"). - Name(name). - SubResource(subresources...). - VersionedParams(&opts, scheme.ParameterCodec). - Body(data). - Do(ctx). - Into(result) - return -} diff --git a/vendor/github.com/openshift/client-go/apiserver/clientset/versioned/typed/apiserver/v1/generated_expansion.go b/vendor/github.com/openshift/client-go/apiserver/clientset/versioned/typed/apiserver/v1/generated_expansion.go index 289fed6955e7..e2bba0a87413 100644 --- a/vendor/github.com/openshift/client-go/apiserver/clientset/versioned/typed/apiserver/v1/generated_expansion.go +++ b/vendor/github.com/openshift/client-go/apiserver/clientset/versioned/typed/apiserver/v1/generated_expansion.go @@ -3,5 +3,3 @@ package v1 type APIRequestCountExpansion interface{} - -type DeprecatedAPIRequestExpansion interface{} diff --git a/vendor/github.com/openshift/library-go/pkg/authorization/hardcodedauthorizer/metrics.go b/vendor/github.com/openshift/library-go/pkg/authorization/hardcodedauthorizer/metrics.go new file mode 100644 index 000000000000..a5cf8f99a5cf --- /dev/null +++ b/vendor/github.com/openshift/library-go/pkg/authorization/hardcodedauthorizer/metrics.go @@ -0,0 +1,38 @@ +package hardcodedauthorizer + +import ( + "context" + + "k8s.io/apiserver/pkg/authorization/authorizer" +) + +type metricsAuthorizer struct{} + +// GetUser() user.Info - checked +// GetVerb() string - checked +// IsReadOnly() bool - na +// GetNamespace() string - na +// GetResource() string - na +// GetSubresource() string - na +// GetName() string - na +// GetAPIGroup() string - na +// GetAPIVersion() string - na +// IsResourceRequest() bool - checked +// GetPath() string - checked +func (metricsAuthorizer) Authorize(ctx context.Context, a authorizer.Attributes) (authorized authorizer.Decision, reason string, err error) { + if a.GetUser().GetName() != "system:serviceaccount:openshift-monitoring:prometheus-k8s" { + return authorizer.DecisionNoOpinion, "", nil + } + if !a.IsResourceRequest() && + a.GetVerb() == "get" && + a.GetPath() == "/metrics" { + return authorizer.DecisionAllow, "requesting metrics is allowed", nil + } + + return authorizer.DecisionNoOpinion, "", nil +} + +// NewHardCodedMetricsAuthorizer returns a hardcoded authorizer for checking metrics. +func NewHardCodedMetricsAuthorizer() *metricsAuthorizer { + return new(metricsAuthorizer) +} diff --git a/vendor/github.com/openshift/library-go/pkg/config/client/transport.go b/vendor/github.com/openshift/library-go/pkg/config/client/transport.go new file mode 100644 index 000000000000..7f2534fdf178 --- /dev/null +++ b/vendor/github.com/openshift/library-go/pkg/config/client/transport.go @@ -0,0 +1,91 @@ +package client + +import ( + "net" + "net/http" + "net/url" + + "k8s.io/client-go/rest" +) + +// AnonymousClientConfigWithWrapTransport returns a copy of the given config with all user credentials (cert/key, bearer token, and username/password) and custom transports (Transport) removed. +// This function preserves WrapTransport for clients that care about custom HTTP behavior. +func AnonymousClientConfigWithWrapTransport(config *rest.Config) *rest.Config { + newConfig := rest.AnonymousClientConfig(config) + newConfig.WrapTransport = config.WrapTransport + return newConfig +} + +// DefaultServerName extract the hostname from the config.Host and sets it in config.ServerName +// the ServerName is passed to the server for SNI and is used in the client to check server certificates. +// +// note: +// if the ServerName has been already specified calling this method has no effect +func DefaultServerName(config *rest.Config) error { + if len(config.ServerName) > 0 { + return nil + } + u, err := url.Parse(config.Host) + if err != nil { + return err + } + host, _, err := net.SplitHostPort(u.Host) + if err != nil { + // assume u.Host contains only host portion + config.ServerName = u.Host + return nil + } + config.ServerName = host + return nil +} + +// NewPreferredHostRoundTripper a simple middleware for changing the destination host for each request to the provided one. +// If the preferred host doesn't exists (an empty string) then this RT has no effect. +func NewPreferredHostRoundTripper(preferredHostFn func() string) func(http.RoundTripper) http.RoundTripper { + return func(rt http.RoundTripper) http.RoundTripper { + return &preferredHostRT{baseRT: rt, preferredHostFn: preferredHostFn} + } +} + +type preferredHostRT struct { + baseRT http.RoundTripper + preferredHostFn func() string +} + +func (rt *preferredHostRT) RoundTrip(r *http.Request) (*http.Response, error) { + preferredHost := rt.preferredHostFn() + + if len(preferredHost) == 0 { + return rt.baseRT.RoundTrip(r) + } + + r.Host = preferredHost + r.URL.Host = preferredHost + return rt.baseRT.RoundTrip(r) +} + +// CancelRequest exists to facilitate cancellation. +// +// In general there are at least three ways of cancelling a request by an HTTP client: +// 1. Transport.CancelRequest (depreciated) +// 2. Request.Cancel +// 3. Request.Context (preferred) +// +// While using client-go callers can specify a timeout value that gets passed directly to an http.Client. +// The HTTP client cancels requests to the underlying Transport as if the Request's Context ended. +// For compatibility, the Client will also use the deprecated CancelRequest method on Transport if found. +// New RoundTripper implementations should use the Request's Context for cancellation instead of implementing CancelRequest. +// +// Because this wrapper might be the first or might be actually wrapped with already existing wrappers that already implement CancelRequest we need to simply conform. +// +// See for more details: +// https://github.com/kubernetes/kubernetes/blob/442a69c3bdf6fe8e525b05887e57d89db1e2f3a5/staging/src/k8s.io/client-go/transport/transport.go#L257 +// https://github.com/kubernetes/kubernetes/blob/e29c568c4a9cd45d15665345aa015e21bcff52dd/staging/src/k8s.io/client-go/rest/config.go#L328 +// https://github.com/kubernetes/kubernetes/blob/3b2746c9ea9e0fa247b01dca27634e509b385eda/staging/src/k8s.io/client-go/transport/round_trippers.go#L302 +func (rt *preferredHostRT) CancelRequest(req *http.Request) { + type canceler interface{ CancelRequest(*http.Request) } + + if rtCanceller, ok := rt.baseRT.(canceler); ok { + rtCanceller.CancelRequest(req) + } +} diff --git a/vendor/github.com/openshift/library-go/pkg/config/serving/server.go b/vendor/github.com/openshift/library-go/pkg/config/serving/server.go index 4145f464ed75..2d6a736fec03 100644 --- a/vendor/github.com/openshift/library-go/pkg/config/serving/server.go +++ b/vendor/github.com/openshift/library-go/pkg/config/serving/server.go @@ -39,6 +39,8 @@ func ToServerConfig(ctx context.Context, servingInfo configv1.HTTPServingInfo, a if !authenticationConfig.Disabled { authenticationOptions := genericapiserveroptions.NewDelegatingAuthenticationOptions() authenticationOptions.RemoteKubeConfigFile = kubeConfigFile + // the platform generally uses 30s for /metrics scraping, avoid API request for every other /metrics request to the component + authenticationOptions.CacheTTL = 35 * time.Second // In some cases the API server can return connection refused when getting the "extension-apiserver-authentication" // config map. @@ -56,8 +58,13 @@ func ToServerConfig(ctx context.Context, servingInfo configv1.HTTPServingInfo, a } if !authorizationConfig.Disabled { - authorizationOptions := genericapiserveroptions.NewDelegatingAuthorizationOptions() + authorizationOptions := genericapiserveroptions.NewDelegatingAuthorizationOptions(). + WithAlwaysAllowPaths("/healthz", "/readyz", "/livez"). // this allows the kubelet to always get health and readiness without causing an access check + WithAlwaysAllowGroups("system:masters") // in a kube cluster, system:masters can take any action, so there is no need to ask for an authz check + authorizationOptions.RemoteKubeConfigFile = kubeConfigFile + // the platform generally uses 30s for /metrics scraping, avoid API request for every other /metrics request to the component + authorizationOptions.AllowCacheTTL = 35 * time.Second // In some cases the API server can return connection refused when getting the "extension-apiserver-authentication" // config map. diff --git a/vendor/github.com/openshift/library-go/pkg/controller/controllercmd/builder.go b/vendor/github.com/openshift/library-go/pkg/controller/controllercmd/builder.go index de24e336a659..a71cb9ff2974 100644 --- a/vendor/github.com/openshift/library-go/pkg/controller/controllercmd/builder.go +++ b/vendor/github.com/openshift/library-go/pkg/controller/controllercmd/builder.go @@ -9,29 +9,28 @@ import ( "sync" "time" - utilruntime "k8s.io/apimachinery/pkg/util/runtime" - "k8s.io/client-go/tools/record" - "k8s.io/component-base/metrics" - "k8s.io/component-base/metrics/legacyregistry" - "k8s.io/klog/v2" - - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/version" - genericapiserver "k8s.io/apiserver/pkg/server" - "k8s.io/apiserver/pkg/server/healthz" - "k8s.io/client-go/kubernetes" - "k8s.io/client-go/rest" - "k8s.io/client-go/tools/leaderelection" - configv1 "github.com/openshift/api/config/v1" operatorv1alpha1 "github.com/openshift/api/operator/v1alpha1" - + "github.com/openshift/library-go/pkg/authorization/hardcodedauthorizer" "github.com/openshift/library-go/pkg/config/client" "github.com/openshift/library-go/pkg/config/configdefaults" leaderelectionconverter "github.com/openshift/library-go/pkg/config/leaderelection" "github.com/openshift/library-go/pkg/config/serving" "github.com/openshift/library-go/pkg/controller/fileobserver" "github.com/openshift/library-go/pkg/operator/events" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" + "k8s.io/apimachinery/pkg/version" + "k8s.io/apiserver/pkg/authorization/union" + genericapiserver "k8s.io/apiserver/pkg/server" + "k8s.io/apiserver/pkg/server/healthz" + "k8s.io/client-go/kubernetes" + "k8s.io/client-go/rest" + "k8s.io/client-go/tools/leaderelection" + "k8s.io/client-go/tools/record" + "k8s.io/component-base/metrics" + "k8s.io/component-base/metrics/legacyregistry" + "k8s.io/klog/v2" ) // StartFunc is the function to call on leader election start @@ -53,6 +52,9 @@ type ControllerContext struct { // Server is the GenericAPIServer serving healthz checks and debug info Server *genericapiserver.GenericAPIServer + + // Namespace where the operator runs. Either specified on the command line or autodetected. + OperatorNamespace string } // defaultObserverInterval specifies the default interval that file observer will do rehash the files it watches and react to any changes @@ -249,6 +251,12 @@ func (b *ControllerBuilder) Run(ctx context.Context, config *unstructured.Unstru if err != nil { return err } + serverConfig.Authorization.Authorizer = union.New( + // prefix the authorizer with the permissions for metrics scraping which are well known. + // openshift RBAC policy will always allow this user to read metrics. + hardcodedauthorizer.NewHardCodedMetricsAuthorizer(), + serverConfig.Authorization.Authorizer, + ) serverConfig.HealthzChecks = append(serverConfig.HealthzChecks, b.healthChecks...) server, err = serverConfig.Complete(nil).New(b.componentName, genericapiserver.NewEmptyDelegate()) @@ -269,11 +277,12 @@ func (b *ControllerBuilder) Run(ctx context.Context, config *unstructured.Unstru protoConfig.ContentType = "application/vnd.kubernetes.protobuf" controllerContext := &ControllerContext{ - ComponentConfig: config, - KubeConfig: clientConfig, - ProtoKubeConfig: protoConfig, - EventRecorder: eventRecorder, - Server: server, + ComponentConfig: config, + KubeConfig: clientConfig, + ProtoKubeConfig: protoConfig, + EventRecorder: eventRecorder, + Server: server, + OperatorNamespace: namespace, } if b.leaderElection == nil { diff --git a/vendor/github.com/openshift/library-go/pkg/controller/factory/base_controller.go b/vendor/github.com/openshift/library-go/pkg/controller/factory/base_controller.go index 70e6eda8bbcf..9e75c580953b 100644 --- a/vendor/github.com/openshift/library-go/pkg/controller/factory/base_controller.go +++ b/vendor/github.com/openshift/library-go/pkg/controller/factory/base_controller.go @@ -76,7 +76,7 @@ func waitForNamedCacheSync(controllerName string, stopCh <-chan struct{}, cacheS func (c *baseController) Run(ctx context.Context, workers int) { // HandleCrash recovers panics - defer utilruntime.HandleCrash() + defer utilruntime.HandleCrash(c.degradedPanicHandler) // give caches 10 minutes to sync cacheSyncCtx, cacheSyncCancel := context.WithTimeout(ctx, c.cacheSyncTimeout) @@ -183,40 +183,53 @@ func (c *baseController) runPeriodicalResync(ctx context.Context, interval time. // The worker is asked to terminate when the passed context is cancelled and is given terminationGraceDuration time // to complete its shutdown. func (c *baseController) runWorker(queueCtx context.Context) { - var workerWaitGroup sync.WaitGroup - workerWaitGroup.Add(1) - go func() { - defer utilruntime.HandleCrash() - defer workerWaitGroup.Done() - for { - select { - case <-queueCtx.Done(): - return - default: - c.processNextWorkItem(queueCtx) + wait.UntilWithContext( + queueCtx, + func(queueCtx context.Context) { + defer utilruntime.HandleCrash(c.degradedPanicHandler) + for { + select { + case <-queueCtx.Done(): + return + default: + c.processNextWorkItem(queueCtx) + } } - } - }() - workerWaitGroup.Wait() + }, + 1*time.Second) } // reconcile wraps the sync() call and if operator client is set, it handle the degraded condition if sync() returns an error. func (c *baseController) reconcile(ctx context.Context, syncCtx SyncContext) error { err := c.sync(ctx, syncCtx) + return c.reportDegraded(ctx, err) +} + +// degradedPanicHandler will go degraded on failures, then we should catch potential panics and covert them into bad status. +func (c *baseController) degradedPanicHandler(panicVal interface{}) { + if c.syncDegradedClient == nil { + // if we don't have a client for reporting degraded condition, then let the existing panic handler do the work + return + } + _ = c.reportDegraded(context.TODO(), fmt.Errorf("panic caught:\n%v", panicVal)) +} + +// reportDegraded updates status with an indication of degraded-ness +func (c *baseController) reportDegraded(ctx context.Context, reportedError error) error { if c.syncDegradedClient == nil { - return err + return reportedError } - if err != nil { + if reportedError != nil { _, _, updateErr := v1helpers.UpdateStatus(c.syncDegradedClient, v1helpers.UpdateConditionFn(operatorv1.OperatorCondition{ Type: c.name + "Degraded", Status: operatorv1.ConditionTrue, Reason: "SyncError", - Message: err.Error(), + Message: reportedError.Error(), })) if updateErr != nil { klog.Warningf("Updating status of %q failed: %v", c.Name(), updateErr) } - return err + return reportedError } _, _, updateErr := v1helpers.UpdateStatus(c.syncDegradedClient, v1helpers.UpdateConditionFn(operatorv1.OperatorCondition{ @@ -247,7 +260,11 @@ func (c *baseController) processNextWorkItem(queueCtx context.Context) { // logging this helps detecting wedged controllers with missing pre-requirements klog.V(5).Infof("%q controller requested synthetic requeue with key %q", c.name, key) } else { - utilruntime.HandleError(fmt.Errorf("%q controller failed to sync %q, err: %w", c.name, key, err)) + if klog.V(4).Enabled() || key != "key" { + utilruntime.HandleError(fmt.Errorf("%q controller failed to sync %q, err: %w", c.name, key, err)) + } else { + utilruntime.HandleError(fmt.Errorf("%s reconciliation failed: %w", c.name, err)) + } } c.syncContext.Queue().AddRateLimited(key) return diff --git a/vendor/github.com/openshift/library-go/pkg/controller/factory/factory.go b/vendor/github.com/openshift/library-go/pkg/controller/factory/factory.go index 975687d5422a..09ce3abdb268 100644 --- a/vendor/github.com/openshift/library-go/pkg/controller/factory/factory.go +++ b/vendor/github.com/openshift/library-go/pkg/controller/factory/factory.go @@ -236,6 +236,12 @@ func (f *Factory) ToController(name string, eventRecorder events.Recorder) Contr cacheSyncTimeout: defaultCacheSyncTimeout, } + // Warn about too fast resyncs as they might drain the operators QPS. + // This event is cheap as it is only emitted on operator startup. + if c.resyncEvery.Seconds() < 60 { + ctx.Recorder().Warningf("FastControllerResync", "Controller %q resync interval is set to %s which might lead to client request throttling", name, c.resyncEvery) + } + for i := range f.informerQueueKeys { for d := range f.informerQueueKeys[i].informers { informer := f.informerQueueKeys[i].informers[d] diff --git a/vendor/github.com/openshift/library-go/pkg/image/dockerv1client/client.go b/vendor/github.com/openshift/library-go/pkg/image/dockerv1client/client.go deleted file mode 100644 index cd15cd279498..000000000000 --- a/vendor/github.com/openshift/library-go/pkg/image/dockerv1client/client.go +++ /dev/null @@ -1,1091 +0,0 @@ -package dockerv1client - -import ( - "crypto/tls" - "encoding/json" - "fmt" - "io/ioutil" - "net" - "net/http" - "net/http/cookiejar" - "net/url" - "path" - "strings" - "time" - - "github.com/docker/distribution/manifest/schema1" - "github.com/docker/distribution/manifest/schema2" - - godockerclient "github.com/fsouza/go-dockerclient" - - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/conversion" - "k8s.io/apimachinery/pkg/runtime" - knet "k8s.io/apimachinery/pkg/util/net" - "k8s.io/client-go/transport" - "k8s.io/klog/v2" - - "github.com/openshift/api/image/docker10" - "github.com/openshift/library-go/pkg/image/reference" -) - -var ( - ImageScheme = runtime.NewScheme() -) - -// convertImageToDockerImage converts an object of type *godockerclient.Image to *docker10.DockerImage -func convertImageToDockerImage(in *godockerclient.Image, out *docker10.DockerImage, s conversion.Scope) error { - if out.Config == nil { - out.Config = new(docker10.DockerConfig) - } - if err := convertConfigToDockerConfig(in.Config, out.Config); err != nil { - return err - } - if err := convertConfigToDockerConfig(&in.ContainerConfig, &out.ContainerConfig); err != nil { - return err - } - out.ID = in.ID - out.Parent = in.Parent - out.Comment = in.Comment - out.Created = metav1.NewTime(in.Created) - out.Container = in.Container - out.DockerVersion = in.DockerVersion - out.Author = in.Author - out.Architecture = in.Architecture - out.Size = in.Size - return nil -} - -// convertConfigToDockerConfig converts an object of type *godockerclient.Config to *docker10.DockerConfig -func convertConfigToDockerConfig(in *godockerclient.Config, out *docker10.DockerConfig) error { - if in == nil { - return nil - } - out.Hostname = in.Hostname - out.Domainname = in.Domainname - out.User = in.User - out.Memory = in.Memory - out.MemorySwap = in.MemorySwap - out.CPUShares = in.CPUShares - out.CPUSet = in.CPUSet - out.AttachStdin = in.AttachStdin - out.AttachStdout = in.AttachStdout - out.AttachStderr = in.AttachStderr - out.PortSpecs = in.PortSpecs - if out.ExposedPorts == nil { - out.ExposedPorts = make(map[string]struct{}) - } - for k, v := range in.ExposedPorts { - out.ExposedPorts[string(k)] = v - } - out.Tty = in.Tty - out.OpenStdin = in.OpenStdin - out.StdinOnce = in.StdinOnce - out.Env = in.Env - out.Cmd = in.Cmd - out.DNS = in.DNS - out.Image = in.Image - out.Volumes = in.Volumes - out.VolumesFrom = in.VolumesFrom - out.WorkingDir = in.WorkingDir - out.Entrypoint = in.Entrypoint - out.NetworkDisabled = in.NetworkDisabled - out.SecurityOpts = in.SecurityOpts - out.OnBuild = in.OnBuild - out.Labels = in.Labels - return nil -} - -// convertDockerImageToImage converts an object of type *docker10.DockerImage to *godockerclient.Image -func convertDockerImageToImage(in *docker10.DockerImage, out *godockerclient.Image, s conversion.Scope) error { - if out.Config == nil { - out.Config = new(godockerclient.Config) - } - if err := convertDockerConfigToConfig(in.Config, out.Config); err != nil { - return err - } - if err := convertDockerConfigToConfig(&in.ContainerConfig, &out.ContainerConfig); err != nil { - return err - } - out.ID = in.ID - out.Parent = in.Parent - out.Comment = in.Comment - out.Created = in.Created.Time - out.Container = in.Container - out.DockerVersion = in.DockerVersion - out.Author = in.Author - out.Architecture = in.Architecture - out.Size = in.Size - return nil -} - -// convertDockerConfigToConfig converts an object of type *docker10.DockerConfig to *godockerclient.Config -func convertDockerConfigToConfig(in *docker10.DockerConfig, out *godockerclient.Config) error { - if in == nil { - return nil - } - out.Hostname = in.Hostname - out.Domainname = in.Domainname - out.User = in.User - out.Memory = in.Memory - out.MemorySwap = in.MemorySwap - out.CPUShares = in.CPUShares - out.CPUSet = in.CPUSet - out.AttachStdin = in.AttachStdin - out.AttachStdout = in.AttachStdout - out.AttachStderr = in.AttachStderr - out.PortSpecs = in.PortSpecs - if out.ExposedPorts == nil { - out.ExposedPorts = make(map[godockerclient.Port]struct{}) - } - for k, v := range in.ExposedPorts { - out.ExposedPorts[godockerclient.Port(k)] = v - } - out.Tty = in.Tty - out.OpenStdin = in.OpenStdin - out.StdinOnce = in.StdinOnce - out.Env = in.Env - out.Cmd = in.Cmd - out.DNS = in.DNS - out.Image = in.Image - out.Volumes = in.Volumes - out.VolumesFrom = in.VolumesFrom - out.WorkingDir = in.WorkingDir - out.Entrypoint = in.Entrypoint - out.NetworkDisabled = in.NetworkDisabled - out.SecurityOpts = in.SecurityOpts - out.OnBuild = in.OnBuild - out.Labels = in.Labels - return nil -} - -func init() { - ImageScheme.AddConversionFunc((*godockerclient.Image)(nil), (*docker10.DockerImage)(nil), func(a, b interface{}, scope conversion.Scope) error { - return convertImageToDockerImage(a.(*godockerclient.Image), b.(*docker10.DockerImage), scope) - }) - ImageScheme.AddConversionFunc((*docker10.DockerImage)(nil), (*godockerclient.Image)(nil), func(a, b interface{}, scope conversion.Scope) error { - return convertDockerImageToImage(a.(*docker10.DockerImage), b.(*godockerclient.Image), scope) - }) -} - -type Image struct { - Image godockerclient.Image - - // Does this registry support pull by ID - PullByID bool -} - -// Client includes methods for accessing a Docker registry by name. -type Client interface { - // Connect to a Docker registry by name. Pass "" for the Docker Hub - Connect(registry string, allowInsecure bool) (Connection, error) -} - -// Connection allows you to retrieve data from a Docker V1/V2 registry. -type Connection interface { - // ImageTags will return a map of the tags for the image by namespace and name. - // If namespace is not specified, will default to "library" for Docker hub. - ImageTags(namespace, name string) (map[string]string, error) - // ImageByID will return the requested image by namespace, name, and ID. - // If namespace is not specified, will default to "library" for Docker hub. - ImageByID(namespace, name, id string) (*Image, error) - // ImageByTag will return the requested image by namespace, name, and tag - // (if not specified, "latest"). - // If namespace is not specified, will default to "library" for Docker hub. - ImageByTag(namespace, name, tag string) (*Image, error) - // ImageManifest will return the raw image manifest and digest by namespace, - // name, and tag. - ImageManifest(namespace, name, tag string) (string, []byte, error) -} - -// client implements the Client interface -type client struct { - dialTimeout time.Duration - connections map[string]*connection - allowV2 bool -} - -// NewClient returns a client object which allows public access to -// a Docker registry. enableV2 allows a client to prefer V1 registry -// API connections. -// TODO: accept a godockerclient auth config -func NewClient(dialTimeout time.Duration, allowV2 bool) Client { - return &client{ - dialTimeout: dialTimeout, - connections: make(map[string]*connection), - allowV2: allowV2, - } -} - -// Connect accepts the name of a registry in the common form Docker provides and will -// create a connection to the registry. Callers may provide a host, a host:port, or -// a fully qualified URL. When not providing a URL, the default scheme will be "https" -func (c *client) Connect(name string, allowInsecure bool) (Connection, error) { - target, err := normalizeRegistryName(name) - if err != nil { - return nil, err - } - prefix := target.String() - if conn, ok := c.connections[prefix]; ok && conn.allowInsecure == allowInsecure { - return conn, nil - } - conn := newConnection(*target, c.dialTimeout, allowInsecure, c.allowV2) - c.connections[prefix] = conn - return conn, nil -} - -// normalizeDockerHubHost returns the canonical DockerHub registry URL for a given host -// segment and godockerclient API version. -func normalizeDockerHubHost(host string, v2 bool) string { - switch host { - case reference.DockerDefaultRegistry, "www." + reference.DockerDefaultRegistry, reference.DockerDefaultV1Registry, reference.DockerDefaultV2Registry: - if v2 { - return reference.DockerDefaultV2Registry - } - return reference.DockerDefaultV1Registry - } - return host -} - -// normalizeRegistryName standardizes the registry URL so that it is consistent -// across different versions of the same name (for reuse of auth). -func normalizeRegistryName(name string) (*url.URL, error) { - prefix := name - if len(prefix) == 0 { - prefix = reference.DockerDefaultV1Registry - } - hadPrefix := false - switch { - case strings.HasPrefix(prefix, "http://"), strings.HasPrefix(prefix, "https://"): - hadPrefix = true - default: - prefix = "https://" + prefix - } - - target, err := url.Parse(prefix) - if err != nil { - return nil, fmt.Errorf("the registry name cannot be made into a valid url: %v", err) - } - - if host, port, err := net.SplitHostPort(target.Host); err == nil { - host = normalizeDockerHubHost(host, false) - if hadPrefix { - switch { - case port == "443" && target.Scheme == "https": - target.Host = host - case port == "80" && target.Scheme == "http": - target.Host = host - } - } - } else { - target.Host = normalizeDockerHubHost(target.Host, false) - } - return target, nil -} - -// convertConnectionError turns a registry error into a typed error if appropriate. -func convertConnectionError(registry string, err error) error { - switch { - case strings.Contains(err.Error(), "connection refused"): - return errRegistryNotFound{registry} - default: - return err - } -} - -// connection represents a connection to a particular DockerHub registry, reusing -// tokens and other settings. connections are not thread safe. -type connection struct { - client *http.Client - url url.URL - cached map[string]repository - isV2 *bool - token string - - allowInsecure bool -} - -// newConnection creates a new connection -func newConnection(url url.URL, dialTimeout time.Duration, allowInsecure, enableV2 bool) *connection { - var isV2 *bool - if !enableV2 { - v2 := false - isV2 = &v2 - } - - var rt http.RoundTripper - if allowInsecure { - rt = knet.SetTransportDefaults(&http.Transport{ - Dial: (&net.Dialer{ - Timeout: dialTimeout, - KeepAlive: 30 * time.Second, - }).Dial, - TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, - }) - } else { - rt = knet.SetTransportDefaults(&http.Transport{ - Dial: (&net.Dialer{ - Timeout: dialTimeout, - KeepAlive: 30 * time.Second, - }).Dial, - }) - } - - rt = transport.DebugWrappers(rt) - - jar, _ := cookiejar.New(nil) - client := &http.Client{Jar: jar, Transport: rt} - return &connection{ - url: url, - client: client, - cached: make(map[string]repository), - isV2: isV2, - - allowInsecure: allowInsecure, - } -} - -// ImageTags returns the tags for the named Docker image repository. -func (c *connection) ImageTags(namespace, name string) (map[string]string, error) { - if len(namespace) == 0 && reference.IsRegistryDockerHub(c.url.Host) { - namespace = "library" - } - if len(name) == 0 { - return nil, fmt.Errorf("image name must be specified") - } - - repo, err := c.getCachedRepository(fmt.Sprintf("%s/%s", namespace, name)) - if err != nil { - return nil, err - } - - return repo.getTags(c) -} - -// ImageByID returns the specified image within the named Docker image repository -func (c *connection) ImageByID(namespace, name, imageID string) (*Image, error) { - if len(namespace) == 0 && reference.IsRegistryDockerHub(c.url.Host) { - namespace = "library" - } - if len(name) == 0 { - return nil, fmt.Errorf("image name must be specified") - } - - repo, err := c.getCachedRepository(fmt.Sprintf("%s/%s", namespace, name)) - if err != nil { - return nil, err - } - - image, _, err := repo.getImage(c, imageID, "") - return image, err -} - -// ImageByTag returns the specified image within the named Docker image repository -func (c *connection) ImageByTag(namespace, name, tag string) (*Image, error) { - if len(namespace) == 0 && reference.IsRegistryDockerHub(c.url.Host) { - namespace = "library" - } - if len(name) == 0 { - return nil, fmt.Errorf("image name must be specified") - } - searchTag := tag - if len(searchTag) == 0 { - searchTag = "latest" - } - - repo, err := c.getCachedRepository(fmt.Sprintf("%s/%s", namespace, name)) - if err != nil { - return nil, err - } - - image, _, err := repo.getTaggedImage(c, searchTag, tag) - return image, err -} - -// ImageManifest returns raw manifest of the specified image within the named Docker image repository -func (c *connection) ImageManifest(namespace, name, tag string) (string, []byte, error) { - if len(name) == 0 { - return "", nil, fmt.Errorf("image name must be specified") - } - if len(namespace) == 0 && reference.IsRegistryDockerHub(c.url.Host) { - namespace = "library" - } - searchTag := tag - if len(searchTag) == 0 { - searchTag = "latest" - } - - repo, err := c.getCachedRepository(fmt.Sprintf("%s/%s", namespace, name)) - if err != nil { - return "", nil, err - } - - image, manifest, err := repo.getTaggedImage(c, searchTag, tag) - if err != nil { - return "", nil, err - } - return image.Image.ID, manifest, err -} - -// getCachedRepository returns a repository interface matching the provided name and -// may cache information about the server on the connection object. -func (c *connection) getCachedRepository(name string) (repository, error) { - if cached, ok := c.cached[name]; ok { - return cached, nil - } - - if c.isV2 == nil { - v2, err := c.checkV2() - if err != nil { - return nil, err - } - c.isV2 = &v2 - } - if *c.isV2 { - base := c.url - base.Host = normalizeDockerHubHost(base.Host, true) - repo := &v2repository{ - name: name, - endpoint: base, - token: c.token, - } - c.cached[name] = repo - return repo, nil - } - - repo, err := c.getRepositoryV1(name) - if err != nil { - return nil, err - } - c.cached[name] = repo - return repo, nil -} - -// checkV2 performs the registry version checking steps as described by -// https://docs.docker.com/registry/spec/api/ -func (c *connection) checkV2() (bool, error) { - base := c.url - base.Host = normalizeDockerHubHost(base.Host, true) - base.Path = path.Join(base.Path, "v2") + "/" - req, err := http.NewRequest("GET", base.String(), nil) - if err != nil { - return false, fmt.Errorf("error creating request: %v", err) - } - resp, err := c.client.Do(req) - if err != nil { - // if we tried https and were rejected, try http - if c.url.Scheme == "https" && c.allowInsecure { - klog.V(4).Infof("Failed to get https, trying http: %v", err) - c.url.Scheme = "http" - return c.checkV2() - } - return false, convertConnectionError(c.url.String(), fmt.Errorf("error checking for V2 registry at %s: %v", base.String(), err)) - } - defer resp.Body.Close() - - switch code := resp.StatusCode; { - case code == http.StatusUnauthorized: - // handle auth challenges on individual repositories - case code >= 300 || resp.StatusCode < 200: - return false, nil - } - if len(resp.Header.Get("Docker-Distribution-API-Version")) == 0 { - klog.V(5).Infof("Registry v2 API at %s did not have a Docker-Distribution-API-Version header", base.String()) - return false, nil - } - - klog.V(5).Infof("Found registry v2 API at %s", base.String()) - return true, nil -} - -// parseAuthChallenge splits a header of the form 'type[ =""[,...]]' returned -// by the godockerclient registry -func parseAuthChallenge(header string) (string, map[string]string) { - sections := strings.SplitN(header, " ", 2) - if len(sections) == 1 { - sections = append(sections, "") - } - challenge := sections[1] - keys := make(map[string]string) - for _, s := range strings.Split(challenge, ",") { - pair := strings.SplitN(strings.TrimSpace(s), "=", 2) - if len(pair) == 1 { - keys[pair[0]] = "" - continue - } - keys[pair[0]] = strings.Trim(pair[1], "\"") - } - return sections[0], keys -} - -// authenticateV2 attempts to respond to a given WWW-Authenticate challenge header -// by asking for a token from the realm. Currently only supports "Bearer" challenges -// with no credentials provided. -// TODO: support credentials or replace with the Docker distribution v2 registry client -func (c *connection) authenticateV2(header string) (string, error) { - mode, keys := parseAuthChallenge(header) - if strings.ToLower(mode) != "bearer" { - return "", fmt.Errorf("unsupported authentication challenge from registry: %s", header) - } - - realm, ok := keys["realm"] - if !ok { - return "", fmt.Errorf("no realm specified by the server, cannot authenticate: %s", header) - } - delete(keys, "realm") - - realmURL, err := url.Parse(realm) - if err != nil { - return "", fmt.Errorf("realm %q was not a valid url: %v", realm, err) - } - query := realmURL.Query() - for k, v := range keys { - query.Set(k, v) - } - realmURL.RawQuery = query.Encode() - req, err := http.NewRequest("GET", realmURL.String(), nil) - if err != nil { - return "", fmt.Errorf("error creating v2 auth request: %v", err) - } - - resp, err := c.client.Do(req) - if err != nil { - return "", convertConnectionError(realmURL.String(), fmt.Errorf("error authorizing to the registry: %v", err)) - } - defer resp.Body.Close() - - switch code := resp.StatusCode; { - case code == http.StatusUnauthorized: - return "", fmt.Errorf("permission denied to access realm %q", realmURL.String()) - case code == http.StatusNotFound: - return "", fmt.Errorf("defined realm %q cannot be found", realm) - case code >= 300 || resp.StatusCode < 200: - return "", fmt.Errorf("error authenticating to the realm %q; server returned %d", realmURL.String(), resp.StatusCode) - } - - token := struct { - Token string `json:"token"` - }{} - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - return "", fmt.Errorf("can't read authorization body from %s: %v", realmURL.String(), err) - } - if err := json.Unmarshal(body, &token); err != nil { - return "", fmt.Errorf("can't decode the server authorization from %s: %v", realmURL.String(), err) - } - return token.Token, nil -} - -// getRepositoryV1 returns a repository implementation for a v1 registry by asking for -// the appropriate endpoint token. It will try HTTP if HTTPS fails and insecure connections -// are allowed. -func (c *connection) getRepositoryV1(name string) (repository, error) { - klog.V(4).Infof("Getting repository %s from %s", name, c.url.String()) - - base := c.url - base.Path = path.Join(base.Path, fmt.Sprintf("/v1/repositories/%s/images", name)) - req, err := http.NewRequest("GET", base.String(), nil) - if err != nil { - return nil, fmt.Errorf("error creating request: %v", err) - } - req.Header.Add("X-Docker-Token", "true") - resp, err := c.client.Do(req) - if err != nil { - // if we tried https and were rejected, try http - if c.url.Scheme == "https" && c.allowInsecure { - klog.V(4).Infof("Failed to get https, trying http: %v", err) - c.url.Scheme = "http" - return c.getRepositoryV1(name) - } - return nil, convertConnectionError(c.url.String(), fmt.Errorf("error getting X-Docker-Token from %s: %v", name, err)) - } - defer resp.Body.Close() - - // if we were redirected, update the base urls - c.url.Scheme = resp.Request.URL.Scheme - c.url.Host = resp.Request.URL.Host - - switch code := resp.StatusCode; { - case code == http.StatusNotFound: - return nil, errRepositoryNotFound{name} - case code >= 300 || resp.StatusCode < 200: - return nil, fmt.Errorf("error retrieving repository: server returned %d", resp.StatusCode) - } - - // TODO: select a random endpoint - return &v1repository{ - name: name, - endpoint: url.URL{Scheme: c.url.Scheme, Host: resp.Header.Get("X-Docker-Endpoints")}, - token: resp.Header.Get("X-Docker-Token"), - }, nil -} - -// repository is an interface for retrieving image info from a Docker V1 or V2 repository. -type repository interface { - getTags(c *connection) (map[string]string, error) - getTaggedImage(c *connection, tag, userTag string) (*Image, []byte, error) - getImage(c *connection, image, userTag string) (*Image, []byte, error) -} - -// v2repository exposes methods for accessing a named Docker V2 repository on a server. -type v2repository struct { - name string - endpoint url.URL - token string - retries int -} - -// v2tags describes the tags/list returned by the Docker V2 registry. -type v2tags struct { - Name string `json:"name"` - Tags []string `json:"tags"` -} - -func (repo *v2repository) getTags(c *connection) (map[string]string, error) { - endpoint := repo.endpoint - endpoint.Path = path.Join(endpoint.Path, fmt.Sprintf("/v2/%s/tags/list", repo.name)) - req, err := http.NewRequest("GET", endpoint.String(), nil) - if err != nil { - return nil, fmt.Errorf("error creating request: %v", err) - } - addAcceptHeader(req) - - if len(repo.token) > 0 { - req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", repo.token)) - } - resp, err := c.client.Do(req) - if err != nil { - return nil, convertConnectionError(c.url.String(), fmt.Errorf("error getting image tags for %s: %v", repo.name, err)) - } - defer resp.Body.Close() - - switch code := resp.StatusCode; { - case code == http.StatusUnauthorized: - if len(repo.token) != 0 { - // The DockerHub returns JWT tokens that take effect at "now" at second resolution, which means clients can - // be rejected when requests are made near the time boundary. - if repo.retries > 0 { - repo.retries-- - time.Sleep(time.Second / 2) - return repo.getTags(c) - } - delete(c.cached, repo.name) - // godockerclient will not return a NotFound on any repository URL - for backwards compatibility, return NotFound on the - // repo - return nil, errRepositoryNotFound{repo.name} - } - token, err := c.authenticateV2(resp.Header.Get("WWW-Authenticate")) - if err != nil { - return nil, fmt.Errorf("error getting image tags for %s: %v", repo.name, err) - } - repo.retries = 2 - repo.token = token - return repo.getTags(c) - - case code == http.StatusNotFound: - return nil, errRepositoryNotFound{repo.name} - case code >= 300 || resp.StatusCode < 200: - // token might have expired - evict repo from cache so we can get a new one on retry - delete(c.cached, repo.name) - return nil, fmt.Errorf("error retrieving tags: server returned %d", resp.StatusCode) - } - tags := &v2tags{} - if err := json.NewDecoder(resp.Body).Decode(&tags); err != nil { - return nil, fmt.Errorf("error decoding image %s tags: %v", repo.name, err) - } - legacyTags := make(map[string]string) - for _, tag := range tags.Tags { - legacyTags[tag] = tag - } - return legacyTags, nil -} - -func (repo *v2repository) getTaggedImage(c *connection, tag, userTag string) (*Image, []byte, error) { - endpoint := repo.endpoint - endpoint.Path = path.Join(endpoint.Path, fmt.Sprintf("/v2/%s/manifests/%s", repo.name, tag)) - req, err := http.NewRequest("GET", endpoint.String(), nil) - if err != nil { - return nil, nil, fmt.Errorf("error creating request: %v", err) - } - addAcceptHeader(req) - - if len(repo.token) > 0 { - req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", repo.token)) - } - resp, err := c.client.Do(req) - if err != nil { - return nil, nil, convertConnectionError(c.url.String(), fmt.Errorf("error getting image for %s:%s: %v", repo.name, tag, err)) - } - defer resp.Body.Close() - - switch code := resp.StatusCode; { - case code == http.StatusUnauthorized: - if len(repo.token) != 0 { - // The DockerHub returns JWT tokens that take effect at "now" at second resolution, which means clients can - // be rejected when requests are made near the time boundary. - if repo.retries > 0 { - repo.retries-- - time.Sleep(time.Second / 2) - return repo.getTaggedImage(c, tag, userTag) - } - delete(c.cached, repo.name) - // godockerclient will not return a NotFound on any repository URL - for backwards compatibility, return NotFound on the - // repo - body, _ := ioutil.ReadAll(resp.Body) - klog.V(4).Infof("passed valid auth token, but unable to find tagged image at %q, %d %v: %s", req.URL.String(), resp.StatusCode, resp.Header, body) - return nil, nil, errTagNotFound{len(userTag) == 0, tag, repo.name} - } - token, err := c.authenticateV2(resp.Header.Get("WWW-Authenticate")) - if err != nil { - return nil, nil, fmt.Errorf("error getting image for %s:%s: %v", repo.name, tag, err) - } - repo.retries = 2 - repo.token = token - return repo.getTaggedImage(c, tag, userTag) - case code == http.StatusNotFound: - body, _ := ioutil.ReadAll(resp.Body) - klog.V(4).Infof("unable to find tagged image at %q, %d %v: %s", req.URL.String(), resp.StatusCode, resp.Header, body) - return nil, nil, errTagNotFound{len(userTag) == 0, tag, repo.name} - case code >= 300 || resp.StatusCode < 200: - // token might have expired - evict repo from cache so we can get a new one on retry - delete(c.cached, repo.name) - - return nil, nil, fmt.Errorf("error retrieving tagged image: server returned %d", resp.StatusCode) - } - - digest := resp.Header.Get("Docker-Content-Digest") - - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - return nil, nil, fmt.Errorf("can't read image body from %s: %v", req.URL, err) - } - dockerImage, err := repo.unmarshalImageManifest(c, body) - if err != nil { - return nil, nil, err - } - image := &Image{ - Image: *dockerImage, - } - if len(digest) > 0 { - image.Image.ID = digest - image.PullByID = true - } - return image, body, nil -} - -func (repo *v2repository) getImage(c *connection, image, userTag string) (*Image, []byte, error) { - return repo.getTaggedImage(c, image, userTag) -} - -func (repo *v2repository) getImageConfig(c *connection, dgst string) ([]byte, error) { - endpoint := repo.endpoint - endpoint.Path = path.Join(endpoint.Path, fmt.Sprintf("/v2/%s/blobs/%s", repo.name, dgst)) - req, err := http.NewRequest("GET", endpoint.String(), nil) - if err != nil { - return nil, fmt.Errorf("error creating request: %v", err) - } - - if len(repo.token) > 0 { - req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", repo.token)) - } - resp, err := c.client.Do(req) - if err != nil { - return nil, convertConnectionError(c.url.String(), fmt.Errorf("error getting image config for %s: %v", repo.name, err)) - } - defer resp.Body.Close() - - switch code := resp.StatusCode; { - case code == http.StatusUnauthorized: - if len(repo.token) != 0 { - // The DockerHub returns JWT tokens that take effect at "now" at second resolution, which means clients can - // be rejected when requests are made near the time boundary. - if repo.retries > 0 { - repo.retries-- - time.Sleep(time.Second / 2) - return repo.getImageConfig(c, dgst) - } - delete(c.cached, repo.name) - // godockerclient will not return a NotFound on any repository URL - for backwards compatibility, return NotFound on the - // repo - body, _ := ioutil.ReadAll(resp.Body) - klog.V(4).Infof("passed valid auth token, but unable to find image config at %q, %d %v: %s", req.URL.String(), resp.StatusCode, resp.Header, body) - return nil, errBlobNotFound{dgst, repo.name} - } - token, err := c.authenticateV2(resp.Header.Get("WWW-Authenticate")) - if err != nil { - return nil, fmt.Errorf("error getting image config for %s:%s: %v", repo.name, dgst, err) - } - repo.retries = 2 - repo.token = token - return repo.getImageConfig(c, dgst) - case code == http.StatusNotFound: - body, _ := ioutil.ReadAll(resp.Body) - klog.V(4).Infof("unable to find image config at %q, %d %v: %s", req.URL.String(), resp.StatusCode, resp.Header, body) - return nil, errBlobNotFound{dgst, repo.name} - case code >= 300 || resp.StatusCode < 200: - // token might have expired - evict repo from cache so we can get a new one on retry - delete(c.cached, repo.name) - - return nil, fmt.Errorf("error retrieving image config: server returned %d", resp.StatusCode) - } - - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - return nil, fmt.Errorf("can't read image body from %s: %v", req.URL, err) - } - - return body, nil -} - -func (repo *v2repository) unmarshalImageManifest(c *connection, body []byte) (*godockerclient.Image, error) { - manifest := DockerImageManifest{} - if err := json.Unmarshal(body, &manifest); err != nil { - return nil, err - } - switch manifest.SchemaVersion { - case 1: - if len(manifest.History) == 0 { - return nil, fmt.Errorf("image has no v1Compatibility history and cannot be used") - } - return unmarshalDockerImage([]byte(manifest.History[0].DockerV1Compatibility)) - case 2: - config, err := repo.getImageConfig(c, manifest.Config.Digest) - if err != nil { - return nil, err - } - return unmarshalDockerImage(config) - } - return nil, fmt.Errorf("unrecognized Docker image manifest schema %d", manifest.SchemaVersion) -} - -// v1repository exposes methods for accessing a named Docker V1 repository on a server. -type v1repository struct { - name string - endpoint url.URL - token string -} - -func (repo *v1repository) getTags(c *connection) (map[string]string, error) { - endpoint := repo.endpoint - endpoint.Path = path.Join(endpoint.Path, fmt.Sprintf("/v1/repositories/%s/tags", repo.name)) - req, err := http.NewRequest("GET", endpoint.String(), nil) - if err != nil { - return nil, fmt.Errorf("error creating request: %v", err) - } - req.Header.Add("Authorization", "Token "+repo.token) - resp, err := c.client.Do(req) - if err != nil { - return nil, convertConnectionError(c.url.String(), fmt.Errorf("error getting image tags for %s: %v", repo.name, err)) - } - defer resp.Body.Close() - - switch code := resp.StatusCode; { - case code == http.StatusNotFound: - return nil, errRepositoryNotFound{repo.name} - case code >= 300 || resp.StatusCode < 200: - // token might have expired - evict repo from cache so we can get a new one on retry - delete(c.cached, repo.name) - - return nil, fmt.Errorf("error retrieving tags: server returned %d", resp.StatusCode) - } - tags := make(map[string]string) - if err := json.NewDecoder(resp.Body).Decode(&tags); err != nil { - return nil, fmt.Errorf("error decoding image %s tags: %v", repo.name, err) - } - return tags, nil -} - -func (repo *v1repository) getTaggedImage(c *connection, tag, userTag string) (*Image, []byte, error) { - endpoint := repo.endpoint - endpoint.Path = path.Join(endpoint.Path, fmt.Sprintf("/v1/repositories/%s/tags/%s", repo.name, tag)) - req, err := http.NewRequest("GET", endpoint.String(), nil) - if err != nil { - return nil, nil, fmt.Errorf("error creating request: %v", err) - } - req.Header.Add("Authorization", "Token "+repo.token) - resp, err := c.client.Do(req) - if err != nil { - return nil, nil, convertConnectionError(c.url.String(), fmt.Errorf("error getting image id for %s:%s: %v", repo.name, tag, err)) - } - defer resp.Body.Close() - - switch code := resp.StatusCode; { - case code == http.StatusNotFound: - // Attempt to lookup tag in tags map, supporting registries that don't allow retrieval - // of tags to ids (Pulp/Crane) - allTags, err := repo.getTags(c) - if err != nil { - return nil, nil, err - } - if image, ok := allTags[tag]; ok { - return repo.getImage(c, image, "") - } - body, _ := ioutil.ReadAll(resp.Body) - klog.V(4).Infof("unable to find v1 tagged image at %q, %d %v: %s", req.URL.String(), resp.StatusCode, resp.Header, body) - return nil, nil, errTagNotFound{len(userTag) == 0, tag, repo.name} - case code >= 300 || resp.StatusCode < 200: - // token might have expired - evict repo from cache so we can get a new one on retry - delete(c.cached, repo.name) - - return nil, nil, fmt.Errorf("error retrieving tag: server returned %d", resp.StatusCode) - } - var imageID string - if err := json.NewDecoder(resp.Body).Decode(&imageID); err != nil { - return nil, nil, fmt.Errorf("error decoding image id: %v", err) - } - return repo.getImage(c, imageID, "") -} - -func (repo *v1repository) getImage(c *connection, image, userTag string) (*Image, []byte, error) { - endpoint := repo.endpoint - endpoint.Path = path.Join(endpoint.Path, fmt.Sprintf("/v1/images/%s/json", image)) - req, err := http.NewRequest("GET", endpoint.String(), nil) - if err != nil { - return nil, nil, fmt.Errorf("error creating request: %v", err) - } - - if len(repo.token) > 0 { - req.Header.Add("Authorization", "Token "+repo.token) - } - resp, err := c.client.Do(req) - if err != nil { - return nil, nil, convertConnectionError(c.url.String(), fmt.Errorf("error getting json for image %q: %v", image, err)) - } - defer resp.Body.Close() - switch code := resp.StatusCode; { - case code == http.StatusNotFound: - return nil, nil, NewImageNotFoundError(repo.name, image, userTag) - case code >= 300 || resp.StatusCode < 200: - // token might have expired - evict repo from cache so we can get a new one on retry - delete(c.cached, repo.name) - if body, err := ioutil.ReadAll(resp.Body); err == nil { - klog.V(6).Infof("unable to fetch image %s: %#v\n%s", req.URL, resp, string(body)) - } - return nil, nil, fmt.Errorf("error retrieving image %s: server returned %d", req.URL, resp.StatusCode) - } - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - return nil, nil, fmt.Errorf("can't read image body from %s: %v", req.URL, err) - } - dockerImage, err := unmarshalDockerImage(body) - if err != nil { - return nil, nil, err - } - return &Image{Image: *dockerImage}, body, nil -} - -// errBlobNotFound is an error indicating the requested blob does not exist in the repository. -type errBlobNotFound struct { - digest string - repository string -} - -func (e errBlobNotFound) Error() string { - return fmt.Sprintf("blob %s was not found in repository %q", e.digest, e.repository) -} - -// errTagNotFound is an error indicating the requested tag does not exist on the server. May be returned on -// a v2 repository when the repository does not exist (because the v2 registry returns 401 on any repository -// you do not have permission to see, or does not exist) -type errTagNotFound struct { - wasDefault bool - tag string - repository string -} - -func (e errTagNotFound) Error() string { - if e.wasDefault { - return fmt.Sprintf("the default tag %q has not been set on repository %q", e.tag, e.repository) - } - return fmt.Sprintf("tag %q has not been set on repository %q", e.tag, e.repository) -} - -// errRepositoryNotFound indicates the repository is not found - but is only guaranteed to be returned -// for v1 godockerclient registries. -type errRepositoryNotFound struct { - repository string -} - -func (e errRepositoryNotFound) Error() string { - return fmt.Sprintf("the repository %q was not found", e.repository) -} - -type errImageNotFound struct { - tag string - image string - repository string -} - -func NewImageNotFoundError(repository, image, tag string) error { - return errImageNotFound{tag, image, repository} -} - -func (e errImageNotFound) Error() string { - if len(e.tag) == 0 { - return fmt.Sprintf("the image %q in repository %q was not found and may have been deleted", e.image, e.repository) - } - return fmt.Sprintf("the image %q in repository %q with tag %q was not found and may have been deleted", e.image, e.repository, e.tag) -} - -type errRegistryNotFound struct { - registry string -} - -func (e errRegistryNotFound) Error() string { - return fmt.Sprintf("the registry %q could not be reached", e.registry) -} - -func IsRegistryNotFound(err error) bool { - _, ok := err.(errRegistryNotFound) - return ok -} - -func IsRepositoryNotFound(err error) bool { - _, ok := err.(errRepositoryNotFound) - return ok -} - -func IsImageNotFound(err error) bool { - _, ok := err.(errImageNotFound) - return ok -} - -func IsTagNotFound(err error) bool { - _, ok := err.(errTagNotFound) - return ok -} - -func IsBlobNotFound(err error) bool { - _, ok := err.(errBlobNotFound) - return ok -} - -func IsNotFound(err error) bool { - return IsRegistryNotFound(err) || IsRepositoryNotFound(err) || IsImageNotFound(err) || IsTagNotFound(err) || IsBlobNotFound(err) -} - -func unmarshalDockerImage(body []byte) (*godockerclient.Image, error) { - var imagePre012 godockerclient.ImagePre012 - if err := json.Unmarshal(body, &imagePre012); err != nil { - return nil, err - } - - return &godockerclient.Image{ - ID: imagePre012.ID, - Parent: imagePre012.Parent, - Comment: imagePre012.Comment, - Created: imagePre012.Created, - Container: imagePre012.Container, - ContainerConfig: imagePre012.ContainerConfig, - DockerVersion: imagePre012.DockerVersion, - Author: imagePre012.Author, - Config: imagePre012.Config, - Architecture: imagePre012.Architecture, - Size: imagePre012.Size, - }, nil -} - -func addAcceptHeader(r *http.Request) { - r.Header.Add("Accept", schema1.MediaTypeManifest) - r.Header.Add("Accept", schema2.MediaTypeManifest) -} diff --git a/vendor/github.com/openshift/library-go/pkg/operator/resource/resourceapply/generic.go b/vendor/github.com/openshift/library-go/pkg/operator/resource/resourceapply/generic.go index 7f62f87abe25..b13453923e3d 100644 --- a/vendor/github.com/openshift/library-go/pkg/operator/resource/resourceapply/generic.go +++ b/vendor/github.com/openshift/library-go/pkg/operator/resource/resourceapply/generic.go @@ -3,22 +3,24 @@ package resourceapply import ( "fmt" - corev1client "k8s.io/client-go/kubernetes/typed/core/v1" - - "github.com/openshift/library-go/pkg/operator/v1helpers" - - "github.com/openshift/api" - "github.com/openshift/library-go/pkg/operator/events" corev1 "k8s.io/api/core/v1" rbacv1 "k8s.io/api/rbac/v1" storagev1 "k8s.io/api/storage/v1" apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" apiextensionsclient "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/serializer" utilruntime "k8s.io/apimachinery/pkg/util/runtime" + "k8s.io/client-go/dynamic" "k8s.io/client-go/kubernetes" + "k8s.io/client-go/kubernetes/scheme" + corev1client "k8s.io/client-go/kubernetes/typed/core/v1" + + "github.com/openshift/api" + "github.com/openshift/library-go/pkg/operator/events" + "github.com/openshift/library-go/pkg/operator/v1helpers" ) var ( @@ -30,6 +32,8 @@ var ( func init() { utilruntime.Must(api.InstallKube(genericScheme)) utilruntime.Must(apiextensionsv1beta1.AddToScheme(genericScheme)) + utilruntime.Must(apiextensionsv1.AddToScheme(genericScheme)) + } type AssetFunc func(name string) ([]byte, error) @@ -46,6 +50,7 @@ type ClientHolder struct { kubeClient kubernetes.Interface apiExtensionsClient apiextensionsclient.Interface kubeInformers v1helpers.KubeInformersForNamespaces + dynamicClient dynamic.Interface } func NewClientHolder() *ClientHolder { @@ -71,6 +76,11 @@ func (c *ClientHolder) WithAPIExtensionsClient(client apiextensionsclient.Interf return c } +func (c *ClientHolder) WithDynamicClient(client dynamic.Interface) *ClientHolder { + c.dynamicClient = client + return c +} + // ApplyDirectly applies the given manifest files to API server. func ApplyDirectly(clients *ClientHolder, recorder events.Recorder, manifests AssetFunc, files ...string) []ApplyResult { ret := []ApplyResult{} @@ -83,7 +93,7 @@ func ApplyDirectly(clients *ClientHolder, recorder events.Recorder, manifests As ret = append(ret, result) continue } - requiredObj, _, err := genericCodec.Decode(objBytes, nil, nil) + requiredObj, err := decode(objBytes) if err != nil { result.Error = fmt.Errorf("cannot decode %q: %v", file, err) ret = append(ret, result) @@ -96,75 +106,95 @@ func ApplyDirectly(clients *ClientHolder, recorder events.Recorder, manifests As case *corev1.Namespace: if clients.kubeClient == nil { result.Error = fmt.Errorf("missing kubeClient") + } else { + result.Result, result.Changed, result.Error = ApplyNamespace(clients.kubeClient.CoreV1(), recorder, t) } - result.Result, result.Changed, result.Error = ApplyNamespace(clients.kubeClient.CoreV1(), recorder, t) case *corev1.Service: if clients.kubeClient == nil { result.Error = fmt.Errorf("missing kubeClient") + } else { + result.Result, result.Changed, result.Error = ApplyService(clients.kubeClient.CoreV1(), recorder, t) } - result.Result, result.Changed, result.Error = ApplyService(clients.kubeClient.CoreV1(), recorder, t) case *corev1.Pod: if clients.kubeClient == nil { result.Error = fmt.Errorf("missing kubeClient") + } else { + result.Result, result.Changed, result.Error = ApplyPod(clients.kubeClient.CoreV1(), recorder, t) } - result.Result, result.Changed, result.Error = ApplyPod(clients.kubeClient.CoreV1(), recorder, t) case *corev1.ServiceAccount: if clients.kubeClient == nil { result.Error = fmt.Errorf("missing kubeClient") + } else { + result.Result, result.Changed, result.Error = ApplyServiceAccount(clients.kubeClient.CoreV1(), recorder, t) } - result.Result, result.Changed, result.Error = ApplyServiceAccount(clients.kubeClient.CoreV1(), recorder, t) case *corev1.ConfigMap: client := clients.configMapsGetter() if client == nil { result.Error = fmt.Errorf("missing kubeClient") + } else { + result.Result, result.Changed, result.Error = ApplyConfigMap(client, recorder, t) } - result.Result, result.Changed, result.Error = ApplyConfigMap(client, recorder, t) case *corev1.Secret: client := clients.secretsGetter() if client == nil { result.Error = fmt.Errorf("missing kubeClient") + } else { + result.Result, result.Changed, result.Error = ApplySecret(client, recorder, t) } - result.Result, result.Changed, result.Error = ApplySecret(client, recorder, t) case *rbacv1.ClusterRole: if clients.kubeClient == nil { result.Error = fmt.Errorf("missing kubeClient") + } else { + result.Result, result.Changed, result.Error = ApplyClusterRole(clients.kubeClient.RbacV1(), recorder, t) } - result.Result, result.Changed, result.Error = ApplyClusterRole(clients.kubeClient.RbacV1(), recorder, t) case *rbacv1.ClusterRoleBinding: if clients.kubeClient == nil { result.Error = fmt.Errorf("missing kubeClient") + } else { + result.Result, result.Changed, result.Error = ApplyClusterRoleBinding(clients.kubeClient.RbacV1(), recorder, t) } - result.Result, result.Changed, result.Error = ApplyClusterRoleBinding(clients.kubeClient.RbacV1(), recorder, t) case *rbacv1.Role: if clients.kubeClient == nil { result.Error = fmt.Errorf("missing kubeClient") + } else { + result.Result, result.Changed, result.Error = ApplyRole(clients.kubeClient.RbacV1(), recorder, t) } - result.Result, result.Changed, result.Error = ApplyRole(clients.kubeClient.RbacV1(), recorder, t) case *rbacv1.RoleBinding: if clients.kubeClient == nil { result.Error = fmt.Errorf("missing kubeClient") + } else { + result.Result, result.Changed, result.Error = ApplyRoleBinding(clients.kubeClient.RbacV1(), recorder, t) } - result.Result, result.Changed, result.Error = ApplyRoleBinding(clients.kubeClient.RbacV1(), recorder, t) case *apiextensionsv1beta1.CustomResourceDefinition: if clients.apiExtensionsClient == nil { result.Error = fmt.Errorf("missing apiExtensionsClient") + } else { + result.Result, result.Changed, result.Error = ApplyCustomResourceDefinitionV1Beta1(clients.apiExtensionsClient.ApiextensionsV1beta1(), recorder, t) } - result.Result, result.Changed, result.Error = ApplyCustomResourceDefinitionV1Beta1(clients.apiExtensionsClient.ApiextensionsV1beta1(), recorder, t) case *apiextensionsv1.CustomResourceDefinition: if clients.apiExtensionsClient == nil { result.Error = fmt.Errorf("missing apiExtensionsClient") + } else { + result.Result, result.Changed, result.Error = ApplyCustomResourceDefinitionV1(clients.apiExtensionsClient.ApiextensionsV1(), recorder, t) } - result.Result, result.Changed, result.Error = ApplyCustomResourceDefinitionV1(clients.apiExtensionsClient.ApiextensionsV1(), recorder, t) case *storagev1.StorageClass: if clients.kubeClient == nil { result.Error = fmt.Errorf("missing kubeClient") + } else { + result.Result, result.Changed, result.Error = ApplyStorageClass(clients.kubeClient.StorageV1(), recorder, t) } - result.Result, result.Changed, result.Error = ApplyStorageClass(clients.kubeClient.StorageV1(), recorder, t) case *storagev1.CSIDriver: if clients.kubeClient == nil { result.Error = fmt.Errorf("missing kubeClient") + } else { + result.Result, result.Changed, result.Error = ApplyCSIDriver(clients.kubeClient.StorageV1(), recorder, t) + } + case *unstructured.Unstructured: + if clients.dynamicClient == nil { + result.Error = fmt.Errorf("missing dynamicClient") + } else { + result.Result, result.Changed, result.Error = ApplyKnownUnstructured(clients.dynamicClient, recorder, t) } - result.Result, result.Changed, result.Error = ApplyCSIDriver(clients.kubeClient.StorageV1(), recorder, t) default: result.Error = fmt.Errorf("unhandled type %T", requiredObj) } @@ -194,3 +224,19 @@ func (c *ClientHolder) secretsGetter() corev1client.SecretsGetter { } return v1helpers.CachedSecretGetter(c.kubeClient.CoreV1(), c.kubeInformers) } + +func decode(objBytes []byte) (runtime.Object, error) { + // Try to get a typed object first + typedObj, _, decodeErr := genericCodec.Decode(objBytes, nil, nil) + if decodeErr == nil { + return typedObj, nil + } + + // Try unstructured, hoping to recover from "no kind XXX is registered for version YYY" + unstructuredObj, _, err := scheme.Codecs.UniversalDecoder().Decode(objBytes, nil, &unstructured.Unstructured{}) + if err != nil { + // Return the original error + return nil, decodeErr + } + return unstructuredObj, nil +} diff --git a/vendor/github.com/openshift/library-go/pkg/operator/resource/resourceapply/monitoring.go b/vendor/github.com/openshift/library-go/pkg/operator/resource/resourceapply/monitoring.go index 5b297eb7f44b..4f333b8adaf3 100644 --- a/vendor/github.com/openshift/library-go/pkg/operator/resource/resourceapply/monitoring.go +++ b/vendor/github.com/openshift/library-go/pkg/operator/resource/resourceapply/monitoring.go @@ -2,9 +2,7 @@ package resourceapply import ( "context" - "fmt" - "github.com/ghodss/yaml" "github.com/imdario/mergo" "k8s.io/klog/v2" @@ -12,7 +10,6 @@ import ( "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/client-go/dynamic" @@ -21,7 +18,7 @@ import ( var serviceMonitorGVR = schema.GroupVersionResource{Group: "monitoring.coreos.com", Version: "v1", Resource: "servicemonitors"} -func ensureServiceMonitorSpec(required, existing *unstructured.Unstructured) (*unstructured.Unstructured, bool, error) { +func ensureGenericSpec(required, existing *unstructured.Unstructured) (*unstructured.Unstructured, bool, error) { requiredSpec, _, err := unstructured.NestedMap(required.UnstructuredContent(), "spec") if err != nil { return nil, false, err @@ -48,58 +45,89 @@ func ensureServiceMonitorSpec(required, existing *unstructured.Unstructured) (*u } // ApplyServiceMonitor applies the Prometheus service monitor. -func ApplyServiceMonitor(client dynamic.Interface, recorder events.Recorder, serviceMonitorBytes []byte) (bool, error) { - monitorJSON, err := yaml.YAMLToJSON(serviceMonitorBytes) +func ApplyServiceMonitor(client dynamic.Interface, recorder events.Recorder, required *unstructured.Unstructured) (*unstructured.Unstructured, bool, error) { + namespace := required.GetNamespace() + + existing, err := client.Resource(serviceMonitorGVR).Namespace(namespace).Get(context.TODO(), required.GetName(), metav1.GetOptions{}) + if errors.IsNotFound(err) { + newObj, createErr := client.Resource(serviceMonitorGVR).Namespace(namespace).Create(context.TODO(), required, metav1.CreateOptions{}) + if createErr != nil { + recorder.Warningf("ServiceMonitorCreateFailed", "Failed to create ServiceMonitor.monitoring.coreos.com/v1: %v", createErr) + return nil, true, createErr + } + recorder.Eventf("ServiceMonitorCreated", "Created ServiceMonitor.monitoring.coreos.com/v1 because it was missing") + return newObj, true, nil + } if err != nil { - return false, err + return nil, false, err } - monitorObj, err := runtime.Decode(unstructured.UnstructuredJSONScheme, monitorJSON) + existingCopy := existing.DeepCopy() + + updated, endpointsModified, err := ensureGenericSpec(required, existingCopy) if err != nil { - return false, err + return nil, false, err } - required, ok := monitorObj.(*unstructured.Unstructured) - if !ok { - return false, fmt.Errorf("unexpected object in %t", monitorObj) + if !endpointsModified { + return nil, false, nil } + if klog.V(4).Enabled() { + klog.Infof("ServiceMonitor %q changes: %v", namespace+"/"+required.GetName(), JSONPatchNoError(existing, existingCopy)) + } + + newObj, err := client.Resource(serviceMonitorGVR).Namespace(namespace).Update(context.TODO(), updated, metav1.UpdateOptions{}) + if err != nil { + recorder.Warningf("ServiceMonitorUpdateFailed", "Failed to update ServiceMonitor.monitoring.coreos.com/v1: %v", err) + return nil, true, err + } + + recorder.Eventf("ServiceMonitorUpdated", "Updated ServiceMonitor.monitoring.coreos.com/v1 because it changed") + return newObj, true, err +} + +var prometheusRuleGVR = schema.GroupVersionResource{Group: "monitoring.coreos.com", Version: "v1", Resource: "prometheusrules"} + +// ApplyPrometheusRule applies the PrometheusRule +func ApplyPrometheusRule(client dynamic.Interface, recorder events.Recorder, required *unstructured.Unstructured) (*unstructured.Unstructured, bool, error) { namespace := required.GetNamespace() - existing, err := client.Resource(serviceMonitorGVR).Namespace(namespace).Get(context.TODO(), required.GetName(), metav1.GetOptions{}) + existing, err := client.Resource(prometheusRuleGVR).Namespace(namespace).Get(context.TODO(), required.GetName(), metav1.GetOptions{}) if errors.IsNotFound(err) { - _, createErr := client.Resource(serviceMonitorGVR).Namespace(namespace).Create(context.TODO(), required, metav1.CreateOptions{}) + newObj, createErr := client.Resource(prometheusRuleGVR).Namespace(namespace).Create(context.TODO(), required, metav1.CreateOptions{}) if createErr != nil { - recorder.Warningf("ServiceMonitorCreateFailed", "Failed to create ServiceMonitor.monitoring.coreos.com/v1: %v", createErr) - return true, createErr + recorder.Warningf("PrometheusRuleCreateFailed", "Failed to create PrometheusRule.monitoring.coreos.com/v1: %v", createErr) + return nil, true, createErr } - recorder.Eventf("ServiceMonitorCreated", "Created ServiceMonitor.monitoring.coreos.com/v1 because it was missing") - return true, nil + recorder.Eventf("PrometheusRuleCreated", "Created PrometheusRule.monitoring.coreos.com/v1 because it was missing") + return newObj, true, nil } if err != nil { - return false, err + return nil, false, err } existingCopy := existing.DeepCopy() - updated, endpointsModified, err := ensureServiceMonitorSpec(required, existingCopy) + updated, endpointsModified, err := ensureGenericSpec(required, existingCopy) if err != nil { - return false, err + return nil, false, err } if !endpointsModified { - return false, nil + return nil, false, nil } if klog.V(4).Enabled() { - klog.Infof("ServiceMonitor %q changes: %v", namespace+"/"+required.GetName(), JSONPatchNoError(existing, existingCopy)) + klog.Infof("PrometheusRule %q changes: %v", namespace+"/"+required.GetName(), JSONPatchNoError(existing, existingCopy)) } - if _, err = client.Resource(serviceMonitorGVR).Namespace(namespace).Update(context.TODO(), updated, metav1.UpdateOptions{}); err != nil { - recorder.Warningf("ServiceMonitorUpdateFailed", "Failed to update ServiceMonitor.monitoring.coreos.com/v1: %v", err) - return true, err + newObj, err := client.Resource(prometheusRuleGVR).Namespace(namespace).Update(context.TODO(), updated, metav1.UpdateOptions{}) + if err != nil { + recorder.Warningf("PrometheusRuleUpdateFailed", "Failed to update PrometheusRule.monitoring.coreos.com/v1: %v", err) + return nil, true, err } - recorder.Eventf("ServiceMonitorUpdated", "Updated ServiceMonitor.monitoring.coreos.com/v1 because it changed") - return true, err + recorder.Eventf("PrometheusRuleUpdated", "Updated PrometheusRule.monitoring.coreos.com/v1 because it changed") + return newObj, true, err } diff --git a/vendor/github.com/openshift/library-go/pkg/operator/resource/resourceapply/unstructured.go b/vendor/github.com/openshift/library-go/pkg/operator/resource/resourceapply/unstructured.go new file mode 100644 index 000000000000..9c095e4950ac --- /dev/null +++ b/vendor/github.com/openshift/library-go/pkg/operator/resource/resourceapply/unstructured.go @@ -0,0 +1,24 @@ +package resourceapply + +import ( + "fmt" + + "github.com/openshift/library-go/pkg/operator/events" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/client-go/dynamic" +) + +// ApplyKnownUnstructured applies few selected Unstructured types, where it semantic knowledge +// to merge existing & required objects intelligently. Feel free to add more. +func ApplyKnownUnstructured(client dynamic.Interface, recorder events.Recorder, obj *unstructured.Unstructured) (*unstructured.Unstructured, bool, error) { + switch obj.GetObjectKind().GroupVersionKind().GroupKind() { + case schema.GroupKind{Group: "monitoring.coreos.com", Kind: "ServiceMonitor"}: + return ApplyServiceMonitor(client, recorder, obj) + case schema.GroupKind{Group: "monitoring.coreos.com", Kind: "PrometheusRule"}: + return ApplyPrometheusRule(client, recorder, obj) + + } + + return nil, false, fmt.Errorf("unsupported object type: %s", obj.GetKind()) +} diff --git a/vendor/github.com/openshift/library-go/pkg/operator/resource/resourceread/admission.go b/vendor/github.com/openshift/library-go/pkg/operator/resource/resourceread/admission.go new file mode 100644 index 000000000000..7c69478ea6c0 --- /dev/null +++ b/vendor/github.com/openshift/library-go/pkg/operator/resource/resourceread/admission.go @@ -0,0 +1,35 @@ +package resourceread + +import ( + admissionv1 "k8s.io/api/admissionregistration/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/serializer" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" +) + +var ( + admissionScheme = runtime.NewScheme() + admissionCodecs = serializer.NewCodecFactory(admissionScheme) +) + +func init() { + utilruntime.Must(admissionv1.AddToScheme(admissionScheme)) +} + +func ReadValidatingWebhookConfigurationV1OrDie(objBytes []byte) *admissionv1.ValidatingWebhookConfiguration { + requiredObj, err := runtime.Decode(admissionCodecs.UniversalDecoder(admissionv1.SchemeGroupVersion), objBytes) + if err != nil { + panic(err) + } + + return requiredObj.(*admissionv1.ValidatingWebhookConfiguration) +} + +func ReadMutatingWebhookConfigurationV1OrDie(objBytes []byte) *admissionv1.MutatingWebhookConfiguration { + requiredObj, err := runtime.Decode(admissionCodecs.UniversalDecoder(admissionv1.SchemeGroupVersion), objBytes) + if err != nil { + panic(err) + } + + return requiredObj.(*admissionv1.MutatingWebhookConfiguration) +} diff --git a/vendor/github.com/openshift/library-go/pkg/operator/resource/resourceread/credentialsrequest.go b/vendor/github.com/openshift/library-go/pkg/operator/resource/resourceread/credentialsrequest.go deleted file mode 100644 index 76bc6823d92b..000000000000 --- a/vendor/github.com/openshift/library-go/pkg/operator/resource/resourceread/credentialsrequest.go +++ /dev/null @@ -1,14 +0,0 @@ -package resourceread - -import ( - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/client-go/kubernetes/scheme" -) - -func ReadCredentialRequestsOrDie(objBytes []byte) *unstructured.Unstructured { - udi, _, err := scheme.Codecs.UniversalDecoder().Decode(objBytes, nil, &unstructured.Unstructured{}) - if err != nil { - panic(err) - } - return udi.(*unstructured.Unstructured) -} diff --git a/vendor/github.com/openshift/library-go/pkg/operator/resource/resourceread/route.go b/vendor/github.com/openshift/library-go/pkg/operator/resource/resourceread/route.go new file mode 100644 index 000000000000..08e125892bec --- /dev/null +++ b/vendor/github.com/openshift/library-go/pkg/operator/resource/resourceread/route.go @@ -0,0 +1,26 @@ +package resourceread + +import ( + routev1 "github.com/openshift/api/route/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/serializer" +) + +var ( + routeScheme = runtime.NewScheme() + routeCodecs = serializer.NewCodecFactory(routeScheme) +) + +func init() { + if err := routev1.AddToScheme(routeScheme); err != nil { + panic(err) + } +} + +func ReadRouteV1OrDie(objBytes []byte) *routev1.Route { + requiredObj, err := runtime.Decode(routeCodecs.UniversalDecoder(routev1.SchemeGroupVersion), objBytes) + if err != nil { + panic(err) + } + return requiredObj.(*routev1.Route) +} diff --git a/vendor/github.com/openshift/library-go/pkg/operator/resource/resourceread/storage.go b/vendor/github.com/openshift/library-go/pkg/operator/resource/resourceread/storage.go index 0a4c290e5b65..6a7d51ee7b3a 100644 --- a/vendor/github.com/openshift/library-go/pkg/operator/resource/resourceread/storage.go +++ b/vendor/github.com/openshift/library-go/pkg/operator/resource/resourceread/storage.go @@ -33,3 +33,11 @@ func ReadCSIDriverV1Beta1OrDie(objBytes []byte) *storagev1beta1.CSIDriver { } return requiredObj.(*storagev1beta1.CSIDriver) } + +func ReadCSIDriverV1OrDie(objBytes []byte) *storagev1.CSIDriver { + requiredObj, err := runtime.Decode(storageCodecs.UniversalDecoder(storagev1.SchemeGroupVersion), objBytes) + if err != nil { + panic(err) + } + return requiredObj.(*storagev1.CSIDriver) +} diff --git a/vendor/github.com/openshift/library-go/pkg/operator/resource/resourceread/unstructured.go b/vendor/github.com/openshift/library-go/pkg/operator/resource/resourceread/unstructured.go new file mode 100644 index 000000000000..bf6bfb010511 --- /dev/null +++ b/vendor/github.com/openshift/library-go/pkg/operator/resource/resourceread/unstructured.go @@ -0,0 +1,18 @@ +package resourceread + +import ( + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/client-go/kubernetes/scheme" +) + +func ReadCredentialRequestsOrDie(objBytes []byte) *unstructured.Unstructured { + return ReadUnstructuredOrDie(objBytes) +} + +func ReadUnstructuredOrDie(objBytes []byte) *unstructured.Unstructured { + udi, _, err := scheme.Codecs.UniversalDecoder().Decode(objBytes, nil, &unstructured.Unstructured{}) + if err != nil { + panic(err) + } + return udi.(*unstructured.Unstructured) +} diff --git a/vendor/github.com/openshift/library-go/pkg/operator/v1helpers/args.go b/vendor/github.com/openshift/library-go/pkg/operator/v1helpers/args.go new file mode 100644 index 000000000000..e1a165e63f37 --- /dev/null +++ b/vendor/github.com/openshift/library-go/pkg/operator/v1helpers/args.go @@ -0,0 +1,61 @@ +package v1helpers + +import ( + "fmt" + "sort" + + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" +) + +// FlagsFromUnstructured process the unstructured arguments usually retrieved from an operator's configuration file under a specific key. +// There are only two supported/valid types for arguments, that is []sting and/or string. +// Passing a different type yield an error. +// +// Use ToFlagSlice function to get a slice of string flags. +func FlagsFromUnstructured(unstructuredArgs map[string]interface{}) (map[string][]string, error) { + return flagsFromUnstructured(unstructuredArgs) +} + +// ToFlagSlice transforms the provided arguments to a slice of string flags. +// A flag name is taken directly from the key and the value is simply attached. +// A flag is repeated iff it has more than one value. +func ToFlagSlice(args map[string][]string) []string { + var keys []string + for key := range args { + keys = append(keys, key) + } + sort.Strings(keys) + + var flags []string + for _, key := range keys { + for _, token := range args[key] { + flags = append(flags, fmt.Sprintf("--%s=%s", key, token)) + } + } + return flags +} + +// flagsFromUnstructured process the unstructured arguments (interface{}) to a map of strings. +// There are only two supported/valid types for arguments, that is []sting and/or string. +// Passing a different type yield an error. +func flagsFromUnstructured(unstructuredArgs map[string]interface{}) (map[string][]string, error) { + ret := map[string][]string{} + for argName, argRawValue := range unstructuredArgs { + var argsSlice []string + var found bool + var err error + + argsSlice, found, err = unstructured.NestedStringSlice(unstructuredArgs, argName) + if !found || err != nil { + str, found, err := unstructured.NestedString(unstructuredArgs, argName) + if !found || err != nil { + return nil, fmt.Errorf("unable to process an argument, incorrect value %v under %v key, expected []string or string", argRawValue, argName) + } + argsSlice = append(argsSlice, str) + } + + ret[argName] = argsSlice + } + + return ret, nil +} diff --git a/vendor/github.com/openshift/library-go/pkg/operator/v1helpers/helpers.go b/vendor/github.com/openshift/library-go/pkg/operator/v1helpers/helpers.go index ac680e27b60f..40a46f96daba 100644 --- a/vendor/github.com/openshift/library-go/pkg/operator/v1helpers/helpers.go +++ b/vendor/github.com/openshift/library-go/pkg/operator/v1helpers/helpers.go @@ -2,6 +2,7 @@ package v1helpers import ( "errors" + "fmt" "sort" "strings" "time" @@ -14,6 +15,8 @@ import ( utilerrors "k8s.io/apimachinery/pkg/util/errors" "k8s.io/client-go/util/retry" + "github.com/ghodss/yaml" + configv1 "github.com/openshift/api/config/v1" operatorv1 "github.com/openshift/api/operator/v1" ) @@ -310,3 +313,37 @@ func MapToEnvVars(mapEnvVars map[string]string) []corev1.EnvVar { sort.Slice(envVars, func(i, j int) bool { return envVars[i].Name < envVars[j].Name }) return envVars } + +// InjectObservedProxyIntoContainers injects proxy environment variables in containers specified in containerNames. +func InjectObservedProxyIntoContainers(podSpec *corev1.PodSpec, containerNames []string, observedConfig []byte, fields ...string) error { + var config map[string]interface{} + if err := yaml.Unmarshal(observedConfig, &config); err != nil { + return fmt.Errorf("failed to unmarshal the observedConfig: %w", err) + } + + proxyConfig, found, err := unstructured.NestedStringMap(config, fields...) + if err != nil { + return fmt.Errorf("couldn't get the proxy config from observedConfig: %w", err) + } + + proxyEnvVars := MapToEnvVars(proxyConfig) + if !found || len(proxyEnvVars) < 1 { + // There's no observed proxy config, we should tolerate that + return nil + } + + for _, containerName := range containerNames { + for i := range podSpec.InitContainers { + if podSpec.InitContainers[i].Name == containerName { + podSpec.InitContainers[i].Env = append(podSpec.InitContainers[i].Env, proxyEnvVars...) + } + } + for i := range podSpec.Containers { + if podSpec.Containers[i].Name == containerName { + podSpec.Containers[i].Env = append(podSpec.Containers[i].Env, proxyEnvVars...) + } + } + } + + return nil +} diff --git a/vendor/github.com/openshift/library-go/pkg/operator/v1helpers/test_helpers.go b/vendor/github.com/openshift/library-go/pkg/operator/v1helpers/test_helpers.go index 4564b3f648e9..612c5566c339 100644 --- a/vendor/github.com/openshift/library-go/pkg/operator/v1helpers/test_helpers.go +++ b/vendor/github.com/openshift/library-go/pkg/operator/v1helpers/test_helpers.go @@ -234,6 +234,16 @@ func (c *fakeOperatorClient) UpdateOperatorStatus(resourceVersion string, status c.fakeOperatorStatus = status return c.fakeOperatorStatus, nil } -func (c *fakeOperatorClient) UpdateOperatorSpec(string, *operatorv1.OperatorSpec) (spec *operatorv1.OperatorSpec, resourceVersion string, err error) { - panic("not supported") + +func (c *fakeOperatorClient) UpdateOperatorSpec(resourceVersion string, spec *operatorv1.OperatorSpec) (*operatorv1.OperatorSpec, string, error) { + if c.resourceVersion != resourceVersion { + return nil, c.resourceVersion, errors.NewConflict(schema.GroupResource{Group: operatorv1.GroupName, Resource: "TestOperatorConfig"}, "instance", fmt.Errorf("invalid resourceVersion")) + } + rv, err := strconv.Atoi(resourceVersion) + if err != nil { + return nil, c.resourceVersion, err + } + c.resourceVersion = strconv.Itoa(rv + 1) + c.fakeOperatorSpec = spec + return c.fakeOperatorSpec, c.resourceVersion, nil } diff --git a/vendor/github.com/openshift/library-go/pkg/serviceability/panic.go b/vendor/github.com/openshift/library-go/pkg/serviceability/panic.go index 8e5fd741669a..93309febac2e 100644 --- a/vendor/github.com/openshift/library-go/pkg/serviceability/panic.go +++ b/vendor/github.com/openshift/library-go/pkg/serviceability/panic.go @@ -54,23 +54,6 @@ func behaviorOnPanic(mode string, productVersion version.Info) func() { utilruntime.PanicHandlers = append(utilruntime.PanicHandlers, crashOnDelay(delayDuration, delayDurationString)) return doNothing - case strings.HasPrefix(mode, "sentry:"): - url := strings.TrimPrefix(mode, "sentry:") - m, err := NewSentryMonitor(url, productVersion) - if err != nil { - klog.Errorf("Unable to start Sentry for panic tracing: %v", err) - return doNothing - } - klog.Infof("Process will log all panics and errors to Sentry.") - utilruntime.ReallyCrash = false - utilruntime.PanicHandlers = append(utilruntime.PanicHandlers, m.CapturePanic) - utilruntime.ErrorHandlers = append(utilruntime.ErrorHandlers, m.CaptureError) - return func() { - if r := recover(); r != nil { - m.CapturePanicAndWait(r, 2*time.Second) - panic(r) - } - } case len(mode) == 0: // default panic behavior utilruntime.ReallyCrash = false diff --git a/vendor/github.com/openshift/library-go/pkg/serviceability/sentry.go b/vendor/github.com/openshift/library-go/pkg/serviceability/sentry.go deleted file mode 100644 index 42968df3afdd..000000000000 --- a/vendor/github.com/openshift/library-go/pkg/serviceability/sentry.go +++ /dev/null @@ -1,62 +0,0 @@ -package serviceability - -import ( - "errors" - "fmt" - "time" - - "github.com/getsentry/raven-go" - - "k8s.io/apimachinery/pkg/version" -) - -// SentryMonitor encapsulates a Sentry client and set of default tags -type SentryMonitor struct { - client *raven.Client - tags map[string]string -} - -// NewSentryMonitor creates a class that can capture panics and errors from OpenShift -// and Kubernetes that can roll up to a Sentry server. -func NewSentryMonitor(url string, version version.Info) (*SentryMonitor, error) { - client, err := raven.NewClient(url, nil) - if err != nil { - return nil, err - } - client.SetRelease(version.GitCommit) - return &SentryMonitor{ - client: client, - }, nil -} - -func (m *SentryMonitor) capturePanic(capture interface{}) chan error { - var packet *raven.Packet - switch rval := capture.(type) { - case error: - packet = raven.NewPacket(rval.Error(), raven.NewException(rval, raven.NewStacktrace(2, 3, nil))) - default: - rvalStr := fmt.Sprint(rval) - packet = raven.NewPacket(rvalStr, raven.NewException(errors.New(rvalStr), raven.NewStacktrace(2, 3, nil))) - } - _, ch := m.client.Capture(packet, m.tags) - return ch -} - -// CapturePanic is used by the Sentry client to capture panics -func (m *SentryMonitor) CapturePanic(capture interface{}) { - m.capturePanic(capture) -} - -// CapturePanicAndWait waits until either the Sentry client captures a panic or -// the provided time expires -func (m *SentryMonitor) CapturePanicAndWait(capture interface{}, until time.Duration) { - select { - case <-m.capturePanic(capture): - case <-time.After(until): - } -} - -// CaptureError is used by the Sentry client to capture errors -func (m *SentryMonitor) CaptureError(err error) { - m.client.CaptureError(err, m.tags) -} diff --git a/vendor/github.com/sergi/go-diff/diffmatchpatch/diff.go b/vendor/github.com/sergi/go-diff/diffmatchpatch/diff.go index 82ad7bc8f1c2..cb25b4375750 100644 --- a/vendor/github.com/sergi/go-diff/diffmatchpatch/diff.go +++ b/vendor/github.com/sergi/go-diff/diffmatchpatch/diff.go @@ -25,6 +25,8 @@ import ( // Operation defines the operation of a diff item. type Operation int8 +//go:generate stringer -type=Operation -trimprefix=Diff + const ( // DiffDelete item represents a delete diff. DiffDelete Operation = -1 @@ -40,8 +42,41 @@ type Diff struct { Text string } +// splice removes amount elements from slice at index index, replacing them with elements. func splice(slice []Diff, index int, amount int, elements ...Diff) []Diff { - return append(slice[:index], append(elements, slice[index+amount:]...)...) + if len(elements) == amount { + // Easy case: overwrite the relevant items. + copy(slice[index:], elements) + return slice + } + if len(elements) < amount { + // Fewer new items than old. + // Copy in the new items. + copy(slice[index:], elements) + // Shift the remaining items left. + copy(slice[index+len(elements):], slice[index+amount:]) + // Calculate the new end of the slice. + end := len(slice) - amount + len(elements) + // Zero stranded elements at end so that they can be garbage collected. + tail := slice[end:] + for i := range tail { + tail[i] = Diff{} + } + return slice[:end] + } + // More new items than old. + // Make room in slice for new elements. + // There's probably an even more efficient way to do this, + // but this is simple and clear. + need := len(slice) - amount + len(elements) + for len(slice) < need { + slice = append(slice, Diff{}) + } + // Shift slice elements right to make room for new elements. + copy(slice[index+len(elements):], slice[index+amount:]) + // Copy in new elements. + copy(slice[index:], elements) + return slice } // DiffMain finds the differences between two texts. @@ -145,7 +180,10 @@ func (dmp *DiffMatchPatch) diffCompute(text1, text2 []rune, checklines bool, dea diffsA := dmp.diffMainRunes(text1A, text2A, checklines, deadline) diffsB := dmp.diffMainRunes(text1B, text2B, checklines, deadline) // Merge the results. - return append(diffsA, append([]Diff{Diff{DiffEqual, string(midCommon)}}, diffsB...)...) + diffs := diffsA + diffs = append(diffs, Diff{DiffEqual, string(midCommon)}) + diffs = append(diffs, diffsB...) + return diffs } else if checklines && len(text1) > 100 && len(text2) > 100 { return dmp.diffLineMode(text1, text2, deadline) } @@ -247,7 +285,7 @@ func (dmp *DiffMatchPatch) diffBisect(runes1, runes2 []rune, deadline time.Time) k2end := 0 for d := 0; d < maxD; d++ { // Bail out if deadline is reached. - if !deadline.IsZero() && time.Now().After(deadline) { + if !deadline.IsZero() && d%16 == 0 && time.Now().After(deadline) { break } @@ -434,48 +472,29 @@ func (dmp *DiffMatchPatch) DiffCommonSuffix(text1, text2 string) int { // commonPrefixLength returns the length of the common prefix of two rune slices. func commonPrefixLength(text1, text2 []rune) int { - short, long := text1, text2 - if len(short) > len(long) { - short, long = long, short - } - for i, r := range short { - if r != long[i] { - return i + // Linear search. See comment in commonSuffixLength. + n := 0 + for ; n < len(text1) && n < len(text2); n++ { + if text1[n] != text2[n] { + return n } } - return len(short) + return n } // commonSuffixLength returns the length of the common suffix of two rune slices. func commonSuffixLength(text1, text2 []rune) int { - n := min(len(text1), len(text2)) - for i := 0; i < n; i++ { - if text1[len(text1)-i-1] != text2[len(text2)-i-1] { - return i + // Use linear search rather than the binary search discussed at https://neil.fraser.name/news/2007/10/09/. + // See discussion at https://github.com/sergi/go-diff/issues/54. + i1 := len(text1) + i2 := len(text2) + for n := 0; ; n++ { + i1-- + i2-- + if i1 < 0 || i2 < 0 || text1[i1] != text2[i2] { + return n } } - return n - - // TODO research and benchmark this, why is it not activated? https://github.com/sergi/go-diff/issues/54 - // Binary search. - // Performance analysis: http://neil.fraser.name/news/2007/10/09/ - /* - pointermin := 0 - pointermax := math.Min(len(text1), len(text2)) - pointermid := pointermax - pointerend := 0 - for pointermin < pointermid { - if text1[len(text1)-pointermid:len(text1)-pointerend] == - text2[len(text2)-pointermid:len(text2)-pointerend] { - pointermin = pointermid - pointerend = pointermin - } else { - pointermax = pointermid - } - pointermid = math.Floor((pointermax-pointermin)/2 + pointermin) - } - return pointermid - */ } // DiffCommonOverlap determines if the suffix of one string is the prefix of another. @@ -628,11 +647,7 @@ func (dmp *DiffMatchPatch) diffHalfMatchI(l, s []rune, i int) [][]rune { func (dmp *DiffMatchPatch) DiffCleanupSemantic(diffs []Diff) []Diff { changes := false // Stack of indices where equalities are found. - type equality struct { - data int - next *equality - } - var equalities *equality + equalities := make([]int, 0, len(diffs)) var lastequality string // Always equal to diffs[equalities[equalitiesLength - 1]][1] @@ -645,11 +660,7 @@ func (dmp *DiffMatchPatch) DiffCleanupSemantic(diffs []Diff) []Diff { for pointer < len(diffs) { if diffs[pointer].Type == DiffEqual { // Equality found. - - equalities = &equality{ - data: pointer, - next: equalities, - } + equalities = append(equalities, pointer) lengthInsertions1 = lengthInsertions2 lengthDeletions1 = lengthDeletions2 lengthInsertions2 = 0 @@ -670,23 +681,20 @@ func (dmp *DiffMatchPatch) DiffCleanupSemantic(diffs []Diff) []Diff { (len(lastequality) <= difference1) && (len(lastequality) <= difference2) { // Duplicate record. - insPoint := equalities.data - diffs = append( - diffs[:insPoint], - append([]Diff{Diff{DiffDelete, lastequality}}, diffs[insPoint:]...)...) + insPoint := equalities[len(equalities)-1] + diffs = splice(diffs, insPoint, 0, Diff{DiffDelete, lastequality}) // Change second copy to insert. diffs[insPoint+1].Type = DiffInsert // Throw away the equality we just deleted. - equalities = equalities.next + equalities = equalities[:len(equalities)-1] - if equalities != nil { - equalities = equalities.next + if len(equalities) > 0 { + equalities = equalities[:len(equalities)-1] } - if equalities != nil { - pointer = equalities.data - } else { - pointer = -1 + pointer = -1 + if len(equalities) > 0 { + pointer = equalities[len(equalities)-1] } lengthInsertions1 = 0 // Reset the counters. @@ -724,10 +732,7 @@ func (dmp *DiffMatchPatch) DiffCleanupSemantic(diffs []Diff) []Diff { float64(overlapLength1) >= float64(len(insertion))/2 { // Overlap found. Insert an equality and trim the surrounding edits. - diffs = append( - diffs[:pointer], - append([]Diff{Diff{DiffEqual, insertion[:overlapLength1]}}, diffs[pointer:]...)...) - + diffs = splice(diffs, pointer, 0, Diff{DiffEqual, insertion[:overlapLength1]}) diffs[pointer-1].Text = deletion[0 : len(deletion)-overlapLength1] diffs[pointer+1].Text = insertion[overlapLength1:] @@ -738,10 +743,7 @@ func (dmp *DiffMatchPatch) DiffCleanupSemantic(diffs []Diff) []Diff { float64(overlapLength2) >= float64(len(insertion))/2 { // Reverse overlap found. Insert an equality and swap and trim the surrounding edits. overlap := Diff{DiffEqual, deletion[:overlapLength2]} - diffs = append( - diffs[:pointer], - append([]Diff{overlap}, diffs[pointer:]...)...) - + diffs = splice(diffs, pointer, 0, overlap) diffs[pointer-1].Type = DiffInsert diffs[pointer-1].Text = insertion[0 : len(insertion)-overlapLength2] diffs[pointer+1].Type = DiffDelete @@ -954,8 +956,7 @@ func (dmp *DiffMatchPatch) DiffCleanupEfficiency(diffs []Diff) []Diff { insPoint := equalities.data // Duplicate record. - diffs = append(diffs[:insPoint], - append([]Diff{Diff{DiffDelete, lastequality}}, diffs[insPoint:]...)...) + diffs = splice(diffs, insPoint, 0, Diff{DiffDelete, lastequality}) // Change second copy to insert. diffs[insPoint+1].Type = DiffInsert @@ -1235,9 +1236,9 @@ func (dmp *DiffMatchPatch) DiffLevenshtein(diffs []Diff) int { for _, aDiff := range diffs { switch aDiff.Type { case DiffInsert: - insertions += len(aDiff.Text) + insertions += utf8.RuneCountInString(aDiff.Text) case DiffDelete: - deletions += len(aDiff.Text) + deletions += utf8.RuneCountInString(aDiff.Text) case DiffEqual: // A deletion and an insertion is one substitution. levenshtein += max(insertions, deletions) diff --git a/vendor/github.com/sergi/go-diff/diffmatchpatch/operation_string.go b/vendor/github.com/sergi/go-diff/diffmatchpatch/operation_string.go new file mode 100644 index 000000000000..533ec0da7b34 --- /dev/null +++ b/vendor/github.com/sergi/go-diff/diffmatchpatch/operation_string.go @@ -0,0 +1,17 @@ +// Code generated by "stringer -type=Operation -trimprefix=Diff"; DO NOT EDIT. + +package diffmatchpatch + +import "fmt" + +const _Operation_name = "DeleteEqualInsert" + +var _Operation_index = [...]uint8{0, 6, 11, 17} + +func (i Operation) String() string { + i -= -1 + if i < 0 || i >= Operation(len(_Operation_index)-1) { + return fmt.Sprintf("Operation(%d)", i+-1) + } + return _Operation_name[_Operation_index[i]:_Operation_index[i+1]] +} diff --git a/vendor/github.com/sirupsen/logrus/.gitignore b/vendor/github.com/sirupsen/logrus/.gitignore index 6b7d7d1e8b90..1fb13abebe72 100644 --- a/vendor/github.com/sirupsen/logrus/.gitignore +++ b/vendor/github.com/sirupsen/logrus/.gitignore @@ -1,2 +1,4 @@ logrus vendor + +.idea/ diff --git a/vendor/github.com/sirupsen/logrus/buffer_pool.go b/vendor/github.com/sirupsen/logrus/buffer_pool.go new file mode 100644 index 000000000000..4545dec07d8b --- /dev/null +++ b/vendor/github.com/sirupsen/logrus/buffer_pool.go @@ -0,0 +1,52 @@ +package logrus + +import ( + "bytes" + "sync" +) + +var ( + bufferPool BufferPool +) + +type BufferPool interface { + Put(*bytes.Buffer) + Get() *bytes.Buffer +} + +type defaultPool struct { + pool *sync.Pool +} + +func (p *defaultPool) Put(buf *bytes.Buffer) { + p.pool.Put(buf) +} + +func (p *defaultPool) Get() *bytes.Buffer { + return p.pool.Get().(*bytes.Buffer) +} + +func getBuffer() *bytes.Buffer { + return bufferPool.Get() +} + +func putBuffer(buf *bytes.Buffer) { + buf.Reset() + bufferPool.Put(buf) +} + +// SetBufferPool allows to replace the default logrus buffer pool +// to better meets the specific needs of an application. +func SetBufferPool(bp BufferPool) { + bufferPool = bp +} + +func init() { + SetBufferPool(&defaultPool{ + pool: &sync.Pool{ + New: func() interface{} { + return new(bytes.Buffer) + }, + }, + }) +} diff --git a/vendor/github.com/sirupsen/logrus/entry.go b/vendor/github.com/sirupsen/logrus/entry.go index f6e062a3466c..5a5cbfe7c897 100644 --- a/vendor/github.com/sirupsen/logrus/entry.go +++ b/vendor/github.com/sirupsen/logrus/entry.go @@ -13,7 +13,6 @@ import ( ) var ( - bufferPool *sync.Pool // qualified package name, cached at first use logrusPackage string @@ -31,12 +30,6 @@ const ( ) func init() { - bufferPool = &sync.Pool{ - New: func() interface{} { - return new(bytes.Buffer) - }, - } - // start at the bottom of the stack before the package-name cache is primed minimumCallerDepth = 1 } @@ -243,9 +236,12 @@ func (entry Entry) log(level Level, msg string) { entry.fireHooks() - buffer = bufferPool.Get().(*bytes.Buffer) + buffer = getBuffer() + defer func() { + entry.Buffer = nil + putBuffer(buffer) + }() buffer.Reset() - defer bufferPool.Put(buffer) entry.Buffer = buffer entry.write() diff --git a/vendor/github.com/sirupsen/logrus/exported.go b/vendor/github.com/sirupsen/logrus/exported.go index 42b04f6c8094..017c30ce6783 100644 --- a/vendor/github.com/sirupsen/logrus/exported.go +++ b/vendor/github.com/sirupsen/logrus/exported.go @@ -134,6 +134,51 @@ func Fatal(args ...interface{}) { std.Fatal(args...) } +// TraceFn logs a message from a func at level Trace on the standard logger. +func TraceFn(fn LogFunction) { + std.TraceFn(fn) +} + +// DebugFn logs a message from a func at level Debug on the standard logger. +func DebugFn(fn LogFunction) { + std.DebugFn(fn) +} + +// PrintFn logs a message from a func at level Info on the standard logger. +func PrintFn(fn LogFunction) { + std.PrintFn(fn) +} + +// InfoFn logs a message from a func at level Info on the standard logger. +func InfoFn(fn LogFunction) { + std.InfoFn(fn) +} + +// WarnFn logs a message from a func at level Warn on the standard logger. +func WarnFn(fn LogFunction) { + std.WarnFn(fn) +} + +// WarningFn logs a message from a func at level Warn on the standard logger. +func WarningFn(fn LogFunction) { + std.WarningFn(fn) +} + +// ErrorFn logs a message from a func at level Error on the standard logger. +func ErrorFn(fn LogFunction) { + std.ErrorFn(fn) +} + +// PanicFn logs a message from a func at level Panic on the standard logger. +func PanicFn(fn LogFunction) { + std.PanicFn(fn) +} + +// FatalFn logs a message from a func at level Fatal on the standard logger then the process will exit with status set to 1. +func FatalFn(fn LogFunction) { + std.FatalFn(fn) +} + // Tracef logs a message at level Trace on the standard logger. func Tracef(format string, args ...interface{}) { std.Tracef(format, args...) diff --git a/vendor/github.com/sirupsen/logrus/go.mod b/vendor/github.com/sirupsen/logrus/go.mod index d41329679f83..b3919d5eabf8 100644 --- a/vendor/github.com/sirupsen/logrus/go.mod +++ b/vendor/github.com/sirupsen/logrus/go.mod @@ -2,10 +2,9 @@ module github.com/sirupsen/logrus require ( github.com/davecgh/go-spew v1.1.1 // indirect - github.com/konsorten/go-windows-terminal-sequences v1.0.3 github.com/pmezard/go-difflib v1.0.0 // indirect github.com/stretchr/testify v1.2.2 - golang.org/x/sys v0.0.0-20190422165155-953cdadca894 + golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 ) go 1.13 diff --git a/vendor/github.com/sirupsen/logrus/go.sum b/vendor/github.com/sirupsen/logrus/go.sum index 49c690f23837..1edc143bed02 100644 --- a/vendor/github.com/sirupsen/logrus/go.sum +++ b/vendor/github.com/sirupsen/logrus/go.sum @@ -1,12 +1,10 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= -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.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 h1:YyJpGZS1sBuBCzLAR1VEpK193GlqGZbnPFnPV/5Rsb4= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/vendor/github.com/sirupsen/logrus/logger.go b/vendor/github.com/sirupsen/logrus/logger.go index 6fdda748e4db..dbf627c97541 100644 --- a/vendor/github.com/sirupsen/logrus/logger.go +++ b/vendor/github.com/sirupsen/logrus/logger.go @@ -9,6 +9,11 @@ import ( "time" ) +// LogFunction For big messages, it can be more efficient to pass a function +// and only call it if the log level is actually enables rather than +// generating the log message and then checking if the level is enabled +type LogFunction func()[]interface{} + type Logger struct { // The logs are `io.Copy`'d to this in a mutex. It's common to set this to a // file, or leave it default which is `os.Stderr`. You can also set this to @@ -70,7 +75,7 @@ func (mw *MutexWrap) Disable() { // // var log = &logrus.Logger{ // Out: os.Stderr, -// Formatter: new(logrus.JSONFormatter), +// Formatter: new(logrus.TextFormatter), // Hooks: make(logrus.LevelHooks), // Level: logrus.DebugLevel, // } @@ -195,6 +200,14 @@ func (logger *Logger) Log(level Level, args ...interface{}) { } } +func (logger *Logger) LogFn(level Level, fn LogFunction) { + if logger.IsLevelEnabled(level) { + entry := logger.newEntry() + entry.Log(level, fn()...) + logger.releaseEntry(entry) + } +} + func (logger *Logger) Trace(args ...interface{}) { logger.Log(TraceLevel, args...) } @@ -234,6 +247,45 @@ func (logger *Logger) Panic(args ...interface{}) { logger.Log(PanicLevel, args...) } +func (logger *Logger) TraceFn(fn LogFunction) { + logger.LogFn(TraceLevel, fn) +} + +func (logger *Logger) DebugFn(fn LogFunction) { + logger.LogFn(DebugLevel, fn) +} + +func (logger *Logger) InfoFn(fn LogFunction) { + logger.LogFn(InfoLevel, fn) +} + +func (logger *Logger) PrintFn(fn LogFunction) { + entry := logger.newEntry() + entry.Print(fn()...) + logger.releaseEntry(entry) +} + +func (logger *Logger) WarnFn(fn LogFunction) { + logger.LogFn(WarnLevel, fn) +} + +func (logger *Logger) WarningFn(fn LogFunction) { + logger.WarnFn(fn) +} + +func (logger *Logger) ErrorFn(fn LogFunction) { + logger.LogFn(ErrorLevel, fn) +} + +func (logger *Logger) FatalFn(fn LogFunction) { + logger.LogFn(FatalLevel, fn) + logger.Exit(1) +} + +func (logger *Logger) PanicFn(fn LogFunction) { + logger.LogFn(PanicLevel, fn) +} + func (logger *Logger) Logln(level Level, args ...interface{}) { if logger.IsLevelEnabled(level) { entry := logger.newEntry() diff --git a/vendor/github.com/sirupsen/logrus/terminal_check_windows.go b/vendor/github.com/sirupsen/logrus/terminal_check_windows.go index 572889db2162..2879eb50ea6d 100644 --- a/vendor/github.com/sirupsen/logrus/terminal_check_windows.go +++ b/vendor/github.com/sirupsen/logrus/terminal_check_windows.go @@ -5,30 +5,23 @@ package logrus import ( "io" "os" - "syscall" - sequences "github.com/konsorten/go-windows-terminal-sequences" + "golang.org/x/sys/windows" ) -func initTerminal(w io.Writer) { - switch v := w.(type) { - case *os.File: - sequences.EnableVirtualTerminalProcessing(syscall.Handle(v.Fd()), true) - } -} - func checkIfTerminal(w io.Writer) bool { - var ret bool switch v := w.(type) { case *os.File: + handle := windows.Handle(v.Fd()) var mode uint32 - err := syscall.GetConsoleMode(syscall.Handle(v.Fd()), &mode) - ret = (err == nil) - default: - ret = false - } - if ret { - initTerminal(w) + if err := windows.GetConsoleMode(handle, &mode); err != nil { + return false + } + mode |= windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING + if err := windows.SetConsoleMode(handle, mode); err != nil { + return false + } + return true } - return ret + return false } diff --git a/vendor/github.com/syndtr/gocapability/capability/enum.go b/vendor/github.com/syndtr/gocapability/capability/enum.go index 693817317bd0..ad10785314de 100644 --- a/vendor/github.com/syndtr/gocapability/capability/enum.go +++ b/vendor/github.com/syndtr/gocapability/capability/enum.go @@ -41,7 +41,9 @@ const ( //go:generate go run enumgen/gen.go type Cap int -// POSIX-draft defined capabilities. +// POSIX-draft defined capabilities and Linux extensions. +// +// Defined in https://github.com/torvalds/linux/blob/master/include/uapi/linux/capability.h const ( // In a system with the [_POSIX_CHOWN_RESTRICTED] option defined, this // overrides the restriction of changing file ownership and group @@ -187,6 +189,7 @@ const ( // arbitrary SCSI commands // Allow setting encryption key on loopback filesystem // Allow setting zone reclaim policy + // Allow everything under CAP_BPF and CAP_PERFMON for backward compatibility CAP_SYS_ADMIN = Cap(21) // Allow use of reboot() @@ -211,6 +214,7 @@ const ( // Allow more than 64hz interrupts from the real-time clock // Override max number of consoles on console allocation // Override max number of keymaps + // Control memory reclaim behavior CAP_SYS_RESOURCE = Cap(24) // Allow manipulation of system clock @@ -256,8 +260,45 @@ const ( // Allow preventing system suspends CAP_BLOCK_SUSPEND = Cap(36) - // Allow reading audit messages from the kernel + // Allow reading the audit log via multicast netlink socket CAP_AUDIT_READ = Cap(37) + + // Allow system performance and observability privileged operations + // using perf_events, i915_perf and other kernel subsystems + CAP_PERFMON = Cap(38) + + // CAP_BPF allows the following BPF operations: + // - Creating all types of BPF maps + // - Advanced verifier features + // - Indirect variable access + // - Bounded loops + // - BPF to BPF function calls + // - Scalar precision tracking + // - Larger complexity limits + // - Dead code elimination + // - And potentially other features + // - Loading BPF Type Format (BTF) data + // - Retrieve xlated and JITed code of BPF programs + // - Use bpf_spin_lock() helper + // + // CAP_PERFMON relaxes the verifier checks further: + // - BPF progs can use of pointer-to-integer conversions + // - speculation attack hardening measures are bypassed + // - bpf_probe_read to read arbitrary kernel memory is allowed + // - bpf_trace_printk to print kernel memory is allowed + // + // CAP_SYS_ADMIN is required to use bpf_probe_write_user. + // + // CAP_SYS_ADMIN is required to iterate system wide loaded + // programs, maps, links, BTFs and convert their IDs to file descriptors. + // + // CAP_PERFMON and CAP_BPF are required to load tracing programs. + // CAP_NET_ADMIN and CAP_BPF are required to load networking programs. + CAP_BPF = Cap(39) + + // Allow checkpoint/restore related operations. + // Introduced in kernel 5.9 + CAP_CHECKPOINT_RESTORE = Cap(40) ) var ( diff --git a/vendor/github.com/syndtr/gocapability/capability/enum_gen.go b/vendor/github.com/syndtr/gocapability/capability/enum_gen.go index b9e6d2d5e1ee..2ff9bf4d8879 100644 --- a/vendor/github.com/syndtr/gocapability/capability/enum_gen.go +++ b/vendor/github.com/syndtr/gocapability/capability/enum_gen.go @@ -80,6 +80,12 @@ func (c Cap) String() string { return "block_suspend" case CAP_AUDIT_READ: return "audit_read" + case CAP_PERFMON: + return "perfmon" + case CAP_BPF: + return "bpf" + case CAP_CHECKPOINT_RESTORE: + return "checkpoint_restore" } return "unknown" } @@ -125,5 +131,8 @@ func List() []Cap { CAP_WAKE_ALARM, CAP_BLOCK_SUSPEND, CAP_AUDIT_READ, + CAP_PERFMON, + CAP_BPF, + CAP_CHECKPOINT_RESTORE, } } diff --git a/vendor/github.com/willf/bitset/Makefile b/vendor/github.com/willf/bitset/Makefile deleted file mode 100644 index db8377106f61..000000000000 --- a/vendor/github.com/willf/bitset/Makefile +++ /dev/null @@ -1,191 +0,0 @@ -# MAKEFILE -# -# @author Nicola Asuni -# @link https://github.com/willf/bitset -# ------------------------------------------------------------------------------ - -# List special make targets that are not associated with files -.PHONY: help all test format fmtcheck vet lint coverage cyclo ineffassign misspell structcheck varcheck errcheck gosimple astscan qa deps clean nuke - -# Use bash as shell (Note: Ubuntu now uses dash which doesn't support PIPESTATUS). -SHELL=/bin/bash - -# CVS path (path to the parent dir containing the project) -CVSPATH=github.com/willf - -# Project owner -OWNER=willf - -# Project vendor -VENDOR=willf - -# Project name -PROJECT=bitset - -# Project version -VERSION=$(shell cat VERSION) - -# Name of RPM or DEB package -PKGNAME=${VENDOR}-${PROJECT} - -# Current directory -CURRENTDIR=$(shell pwd) - -# GO lang path -ifneq ($(GOPATH),) - ifeq ($(findstring $(GOPATH),$(CURRENTDIR)),) - # the defined GOPATH is not valid - GOPATH= - endif -endif -ifeq ($(GOPATH),) - # extract the GOPATH - GOPATH=$(firstword $(subst /src/, ,$(CURRENTDIR))) -endif - -# --- MAKE TARGETS --- - -# Display general help about this command -help: - @echo "" - @echo "$(PROJECT) Makefile." - @echo "GOPATH=$(GOPATH)" - @echo "The following commands are available:" - @echo "" - @echo " make qa : Run all the tests" - @echo " make test : Run the unit tests" - @echo "" - @echo " make format : Format the source code" - @echo " make fmtcheck : Check if the source code has been formatted" - @echo " make vet : Check for suspicious constructs" - @echo " make lint : Check for style errors" - @echo " make coverage : Generate the coverage report" - @echo " make cyclo : Generate the cyclomatic complexity report" - @echo " make ineffassign : Detect ineffectual assignments" - @echo " make misspell : Detect commonly misspelled words in source files" - @echo " make structcheck : Find unused struct fields" - @echo " make varcheck : Find unused global variables and constants" - @echo " make errcheck : Check that error return values are used" - @echo " make gosimple : Suggest code simplifications" - @echo " make astscan : GO AST scanner" - @echo "" - @echo " make docs : Generate source code documentation" - @echo "" - @echo " make deps : Get the dependencies" - @echo " make clean : Remove any build artifact" - @echo " make nuke : Deletes any intermediate file" - @echo "" - -# Alias for help target -all: help - -# Run the unit tests -test: - @mkdir -p target/test - @mkdir -p target/report - GOPATH=$(GOPATH) \ - go test \ - -covermode=atomic \ - -bench=. \ - -race \ - -cpuprofile=target/report/cpu.out \ - -memprofile=target/report/mem.out \ - -mutexprofile=target/report/mutex.out \ - -coverprofile=target/report/coverage.out \ - -v ./... | \ - tee >(PATH=$(GOPATH)/bin:$(PATH) go-junit-report > target/test/report.xml); \ - test $${PIPESTATUS[0]} -eq 0 - -# Format the source code -format: - @find . -type f -name "*.go" -exec gofmt -s -w {} \; - -# Check if the source code has been formatted -fmtcheck: - @mkdir -p target - @find . -type f -name "*.go" -exec gofmt -s -d {} \; | tee target/format.diff - @test ! -s target/format.diff || { echo "ERROR: the source code has not been formatted - please use 'make format' or 'gofmt'"; exit 1; } - -# Check for syntax errors -vet: - GOPATH=$(GOPATH) go vet . - -# Check for style errors -lint: - GOPATH=$(GOPATH) PATH=$(GOPATH)/bin:$(PATH) golint . - -# Generate the coverage report -coverage: - @mkdir -p target/report - GOPATH=$(GOPATH) \ - go tool cover -html=target/report/coverage.out -o target/report/coverage.html - -# Report cyclomatic complexity -cyclo: - @mkdir -p target/report - GOPATH=$(GOPATH) gocyclo -avg ./ | tee target/report/cyclo.txt ; test $${PIPESTATUS[0]} -eq 0 - -# Detect ineffectual assignments -ineffassign: - @mkdir -p target/report - GOPATH=$(GOPATH) ineffassign ./ | tee target/report/ineffassign.txt ; test $${PIPESTATUS[0]} -eq 0 - -# Detect commonly misspelled words in source files -misspell: - @mkdir -p target/report - GOPATH=$(GOPATH) misspell -error ./ | tee target/report/misspell.txt ; test $${PIPESTATUS[0]} -eq 0 - -# Find unused struct fields -structcheck: - @mkdir -p target/report - GOPATH=$(GOPATH) structcheck -a ./ | tee target/report/structcheck.txt - -# Find unused global variables and constants -varcheck: - @mkdir -p target/report - GOPATH=$(GOPATH) varcheck -e ./ | tee target/report/varcheck.txt - -# Check that error return values are used -errcheck: - @mkdir -p target/report - GOPATH=$(GOPATH) errcheck ./ | tee target/report/errcheck.txt - -# AST scanner -astscan: - @mkdir -p target/report - GOPATH=$(GOPATH) gosec . | tee target/report/astscan.txt ; test $${PIPESTATUS[0]} -eq 0 || true - -# Generate source docs -docs: - @mkdir -p target/docs - nohup sh -c 'GOPATH=$(GOPATH) godoc -http=127.0.0.1:6060' > target/godoc_server.log 2>&1 & - wget --directory-prefix=target/docs/ --execute robots=off --retry-connrefused --recursive --no-parent --adjust-extension --page-requisites --convert-links http://127.0.0.1:6060/pkg/github.com/${VENDOR}/${PROJECT}/ ; kill -9 `lsof -ti :6060` - @echo ''${PKGNAME}' Documentation ...' > target/docs/index.html - -# Alias to run all quality-assurance checks -qa: fmtcheck test vet lint coverage cyclo ineffassign misspell structcheck varcheck errcheck gosimple astscan - -# --- INSTALL --- - -# Get the dependencies -deps: - GOPATH=$(GOPATH) go get ./... - GOPATH=$(GOPATH) go get golang.org/x/lint/golint - GOPATH=$(GOPATH) go get github.com/jstemmer/go-junit-report - GOPATH=$(GOPATH) go get github.com/axw/gocov/gocov - GOPATH=$(GOPATH) go get github.com/fzipp/gocyclo - GOPATH=$(GOPATH) go get github.com/gordonklaus/ineffassign - GOPATH=$(GOPATH) go get github.com/client9/misspell/cmd/misspell - GOPATH=$(GOPATH) go get github.com/opennota/check/cmd/structcheck - GOPATH=$(GOPATH) go get github.com/opennota/check/cmd/varcheck - GOPATH=$(GOPATH) go get github.com/kisielk/errcheck - GOPATH=$(GOPATH) go get github.com/securego/gosec/cmd/gosec/... - -# Remove any build artifact -clean: - GOPATH=$(GOPATH) go clean ./... - -# Deletes any intermediate file -nuke: - rm -rf ./target - GOPATH=$(GOPATH) go clean -i ./... diff --git a/vendor/github.com/willf/bitset/README.md b/vendor/github.com/willf/bitset/README.md index 6c62b20c6c80..50338e71dfdb 100644 --- a/vendor/github.com/willf/bitset/README.md +++ b/vendor/github.com/willf/bitset/README.md @@ -2,10 +2,10 @@ *Go language library to map between non-negative integers and boolean values* -[![Master Build Status](https://secure.travis-ci.org/willf/bitset.png?branch=master)](https://travis-ci.org/willf/bitset?branch=master) +[![Test](https://github.com/willf/bitset/workflows/Test/badge.svg)](https://github.com/willf/bitset/actions?query=workflow%3ATest) [![Master Coverage Status](https://coveralls.io/repos/willf/bitset/badge.svg?branch=master&service=github)](https://coveralls.io/github/willf/bitset?branch=master) [![Go Report Card](https://goreportcard.com/badge/github.com/willf/bitset)](https://goreportcard.com/report/github.com/willf/bitset) -[![GoDoc](https://godoc.org/github.com/willf/bitset?status.svg)](http://godoc.org/github.com/willf/bitset) +[![PkgGoDev](https://pkg.go.dev/badge/github.com/willf/bitset?tab=doc)](https://pkg.go.dev/github.com/willf/bitset?tab=doc) ## Description @@ -63,8 +63,11 @@ func main() { As an alternative to BitSets, one should check out the 'big' package, which provides a (less set-theoretical) view of bitsets. -Godoc documentation is at: https://godoc.org/github.com/willf/bitset +Package documentation is at: https://pkg.go.dev/github.com/willf/bitset?tab=doc +## Memory Usage + +The memory usage of a bitset using N bits is at least N/8 bytes. The number of bits in a bitset is at least as large as one plus the greatest bit index you have accessed. Thus it is possible to run out of memory while using a bitset. If you have lots of bits, you might prefer compressed bitsets, like the [Roaring bitmaps](http://roaringbitmap.org) and its [Go implementation](https://github.com/RoaringBitmap/roaring). ## Implementation Note @@ -82,15 +85,10 @@ go get github.com/willf/bitset If you wish to contribute to this project, please branch and issue a pull request against master ("[GitHub Flow](https://guides.github.com/introduction/flow/)") -This project include a Makefile that allows you to test and build the project with simple commands. -To see all available options: -```bash -make help -``` - ## Running all tests -Before committing the code, please check if it passes all tests using (note: this will install some dependencies): +Before committing the code, please check if it passes tests, has adequate coverage, etc. ```bash -make qa +go test +go test -cover ``` diff --git a/vendor/github.com/willf/bitset/bitset.go b/vendor/github.com/willf/bitset/bitset.go index 22e5d42e5d6d..21e889da2e06 100644 --- a/vendor/github.com/willf/bitset/bitset.go +++ b/vendor/github.com/willf/bitset/bitset.go @@ -138,6 +138,9 @@ func (b *BitSet) Len() uint { // extendSetMaybe adds additional words to incorporate new bits if needed func (b *BitSet) extendSetMaybe(i uint) { if i >= b.length { // if we need more bits, make 'em + if i >= Cap() { + panic("You are exceeding the capacity") + } nsize := wordsNeeded(i + 1) if b.set == nil { b.set = make([]uint64, nsize) @@ -160,7 +163,12 @@ func (b *BitSet) Test(i uint) bool { return b.set[i>>log2WordSize]&(1<<(i&(wordSize-1))) != 0 } -// Set bit i to 1 +// Set bit i to 1, the capacity of the bitset is automatically +// increased accordingly. +// If i>= Cap(), this function will panic. +// Warning: using a very large value for 'i' +// may lead to a memory shortage and a panic: the caller is responsible +// for providing sensible parameters in line with their memory capacity. func (b *BitSet) Set(i uint) *BitSet { b.extendSetMaybe(i) b.set[i>>log2WordSize] |= 1 << (i & (wordSize - 1)) @@ -176,7 +184,11 @@ func (b *BitSet) Clear(i uint) *BitSet { return b } -// SetTo sets bit i to value +// SetTo sets bit i to value. +// If i>= Cap(), this function will panic. +// Warning: using a very large value for 'i' +// may lead to a memory shortage and a panic: the caller is responsible +// for providing sensible parameters in line with their memory capacity. func (b *BitSet) SetTo(i uint, value bool) *BitSet { if value { return b.Set(i) @@ -184,7 +196,11 @@ func (b *BitSet) SetTo(i uint, value bool) *BitSet { return b.Clear(i) } -// Flip bit at i +// Flip bit at i. +// If i>= Cap(), this function will panic. +// Warning: using a very large value for 'i' +// may lead to a memory shortage and a panic: the caller is responsible +// for providing sensible parameters in line with their memory capacity. func (b *BitSet) Flip(i uint) *BitSet { if i >= b.length { return b.Set(i) @@ -193,26 +209,51 @@ func (b *BitSet) Flip(i uint) *BitSet { return b } -// Shrink shrinks BitSet to desired length in bits. It clears all bits > length -// and reduces the size and length of the set. +// Shrink shrinks BitSet so that the provided value is the last possible +// set value. It clears all bits > the provided index and reduces the size +// and length of the set. +// +// Note that the parameter value is not the new length in bits: it is the +// maximal value that can be stored in the bitset after the function call. +// The new length in bits is the parameter value + 1. Thus it is not possible +// to use this function to set the length to 0, the minimal value of the length +// after this function call is 1. // // A new slice is allocated to store the new bits, so you may see an increase in // memory usage until the GC runs. Normally this should not be a problem, but if you // have an extremely large BitSet its important to understand that the old BitSet will // remain in memory until the GC frees it. -func (b *BitSet) Shrink(length uint) *BitSet { - idx := wordsNeeded(length + 1) +func (b *BitSet) Shrink(lastbitindex uint) *BitSet { + length := lastbitindex + 1 + idx := wordsNeeded(length) if idx > len(b.set) { return b } shrunk := make([]uint64, idx) copy(shrunk, b.set[:idx]) b.set = shrunk - b.length = length + 1 - b.set[idx-1] &= (allBits >> (uint64(64) - uint64(length&(wordSize-1)) - 1)) + b.length = length + b.set[idx-1] &= (allBits >> (uint64(64) - uint64(length&(wordSize-1)))) return b } +// Compact shrinks BitSet to so that we preserve all set bits, while minimizing +// memory usage. Compact calls Shrink. +func (b *BitSet) Compact() *BitSet { + idx := len(b.set) - 1 + for ; idx >= 0 && b.set[idx] == 0; idx-- { + } + newlength := uint((idx + 1) << log2WordSize) + if newlength >= b.length { + return b // nothing to do + } + if newlength > 0 { + return b.Shrink(newlength - 1) + } + // We preserve one word + return b.Shrink(63) +} + // InsertAt takes an index which indicates where a bit should be // inserted. Then it shifts all the bits in the set to the left by 1, starting // from the given index position, and sets the index position to 0. @@ -323,6 +364,9 @@ func (b *BitSet) DeleteAt(i uint) *BitSet { // including possibly the current index // along with an error code (true = valid, false = no set bit found) // for i,e := v.NextSet(0); e; i,e = v.NextSet(i + 1) {...} +// +// Users concerned with performance may want to use NextSetMany to +// retrieve several values at once. func (b *BitSet) NextSet(i uint) (uint, bool) { x := int(i >> log2WordSize) if x >= len(b.set) { @@ -358,6 +402,14 @@ func (b *BitSet) NextSet(i uint) (uint, bool) { // j += 1 // } // +// +// It is possible to retrieve all set bits as follow: +// +// indices := make([]uint, bitmap.Count()) +// bitmap.NextSetMany(0, indices) +// +// However if bitmap.Count() is large, it might be preferable to +// use several calls to NextSetMany, for performance reasons. func (b *BitSet) NextSetMany(i uint, buffer []uint) (uint, []uint) { myanswer := buffer capacity := cap(buffer) @@ -809,7 +861,7 @@ func (b *BitSet) ReadFrom(stream io.Reader) (int64, error) { newset := New(uint(length)) if uint64(newset.length) != length { - return 0, errors.New("Unmarshalling error: type mismatch") + return 0, errors.New("unmarshalling error: type mismatch") } // Read remaining bytes as set diff --git a/vendor/github.com/willf/bitset/go.mod b/vendor/github.com/willf/bitset/go.mod new file mode 100644 index 000000000000..583ecab78f74 --- /dev/null +++ b/vendor/github.com/willf/bitset/go.mod @@ -0,0 +1,3 @@ +module github.com/willf/bitset + +go 1.14 diff --git a/vendor/github.com/getsentry/raven-go/.gitmodules b/vendor/github.com/willf/bitset/go.sum similarity index 100% rename from vendor/github.com/getsentry/raven-go/.gitmodules rename to vendor/github.com/willf/bitset/go.sum diff --git a/vendor/github.com/xlab/treeprint/LICENSE b/vendor/github.com/xlab/treeprint/LICENSE new file mode 100644 index 000000000000..5ab533ad2f64 --- /dev/null +++ b/vendor/github.com/xlab/treeprint/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) +Copyright © 2016 Maxim Kupriianov + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the “Software”), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/github.com/xlab/treeprint/README.md b/vendor/github.com/xlab/treeprint/README.md new file mode 100644 index 000000000000..6f1628295cbf --- /dev/null +++ b/vendor/github.com/xlab/treeprint/README.md @@ -0,0 +1,128 @@ +treeprint [![GoDoc](https://godoc.org/github.com/xlab/treeprint?status.svg)](https://godoc.org/github.com/xlab/treeprint) ![test coverage](https://img.shields.io/badge/coverage-68.6%25-green.svg) +========= + +Package `treeprint` provides a simple ASCII tree composing tool. + +SYSTEME FIGURE + +If you are familiar with the [tree](http://mama.indstate.edu/users/ice/tree/) utility that is a recursive directory listing command that produces a depth indented listing of files, then you have the idea of what it would look like. + +On my system the command yields the following + +``` + $ tree +. +├── LICENSE +├── README.md +├── treeprint.go +└── treeprint_test.go + +0 directories, 4 files +``` + +and I'd like to have the same format for my Go data structures when I print them. + +## Installation + +``` +$ go get github.com/xlab/treeprint +``` + +## Concept of work + +The general idea is that you initialise a new tree with `treeprint.New()` and then add nodes and +branches into it. Use `AddNode()` when you want add a node on the same level as the target or +use `AddBranch()` when you want to go a level deeper. So `tree.AddBranch().AddNode().AddNode()` would +create a new level with two distinct nodes on it. So `tree.AddNode().AddNode()` is a flat thing and +`tree.AddBranch().AddBranch().AddBranch()` is a high thing. Use `String()` or `Bytes()` on a branch +to render a subtree, or use it on the root to print the whole tree. + +The utility will yield Unicode-friendly trees. The output is predictable and there is no platform-dependent exceptions, so if you have issues with displaying the tree in the console, all platform-related transformations can be done after the tree has been rendered: [an example](https://github.com/xlab/treeprint/issues/2#issuecomment-324944141) for Asian locales. + +## Use cases + +When you want to render a complex data structure: + +```go +func main() { + tree := treeprint.New() + + // create a new branch in the root + one := tree.AddBranch("one") + + // add some nodes + one.AddNode("subnode1").AddNode("subnode2") + + // create a new sub-branch + one.AddBranch("two"). + AddNode("subnode1").AddNode("subnode2"). // add some nodes + AddBranch("three"). // add a new sub-branch + AddNode("subnode1").AddNode("subnode2") // add some nodes too + + // add one more node that should surround the inner branch + one.AddNode("subnode3") + + // add a new node to the root + tree.AddNode("outernode") + + fmt.Println(tree.String()) +} +``` + +Will give you: + +``` +. +├── one +│   ├── subnode1 +│   ├── subnode2 +│   ├── two +│   │   ├── subnode1 +│   │   ├── subnode2 +│   │   └── three +│   │   ├── subnode1 +│   │   └── subnode2 +│   └── subnode3 +└── outernode +``` + +Another case, when you have to make a tree where any leaf may have some meta-data (as `tree` is capable of it): + +```go +func main { + tree := treeprint.New() + + tree.AddNode("Dockerfile") + tree.AddNode("Makefile") + tree.AddNode("aws.sh") + tree.AddMetaBranch(" 204", "bin"). + AddNode("dbmaker").AddNode("someserver").AddNode("testtool") + tree.AddMetaBranch(" 374", "deploy"). + AddNode("Makefile").AddNode("bootstrap.sh") + tree.AddMetaNode("122K", "testtool.a") + + fmt.Println(tree.String()) +} +``` + +Output: + +``` +. +├── Dockerfile +├── Makefile +├── aws.sh +├── [ 204] bin +│   ├── dbmaker +│   ├── someserver +│   └── testtool +├── [ 374] deploy +│   ├── Makefile +│   └── bootstrap.sh +└── [122K] testtool.a +``` + +Yay! So it works. + +## License +MIT diff --git a/vendor/github.com/xlab/treeprint/helpers.go b/vendor/github.com/xlab/treeprint/helpers.go new file mode 100644 index 000000000000..a091a5a0f0aa --- /dev/null +++ b/vendor/github.com/xlab/treeprint/helpers.go @@ -0,0 +1,47 @@ +package treeprint + +import ( + "reflect" + "strings" +) + +func isEmpty(v *reflect.Value) bool { + switch v.Kind() { + case reflect.Array, reflect.Map, reflect.Slice, reflect.String: + return v.Len() == 0 + case reflect.Bool: + return !v.Bool() + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return v.Int() == 0 + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return v.Uint() == 0 + case reflect.Float32, reflect.Float64: + return v.Float() == 0 + case reflect.Interface, reflect.Ptr: + return v.IsNil() + } + return false +} + +func tagSpec(tag string) (name string, omit bool) { + parts := strings.Split(tag, ",") + if len(parts) < 2 { + return tag, false + } + if parts[1] == "omitempty" { + return parts[0], true + } + return parts[0], false +} + +func filterTags(tag reflect.StructTag) string { + tags := strings.Split(string(tag), " ") + filtered := make([]string, 0, len(tags)) + for i := range tags { + if strings.HasPrefix(tags[i], "tree:") { + continue + } + filtered = append(filtered, tags[i]) + } + return strings.Join(filtered, " ") +} diff --git a/vendor/github.com/xlab/treeprint/struct.go b/vendor/github.com/xlab/treeprint/struct.go new file mode 100644 index 000000000000..4d5cc82540dc --- /dev/null +++ b/vendor/github.com/xlab/treeprint/struct.go @@ -0,0 +1,322 @@ +package treeprint + +import ( + "fmt" + "reflect" + "strings" +) + +type StructTreeOption int + +const ( + StructNameTree StructTreeOption = iota + StructValueTree + StructTagTree + StructTypeTree + StructTypeSizeTree +) + +func FromStruct(v interface{}, opt ...StructTreeOption) (Tree, error) { + var treeOpt StructTreeOption + if len(opt) > 0 { + treeOpt = opt[0] + } + switch treeOpt { + case StructNameTree: + tree := New() + err := nameTree(tree, v) + return tree, err + case StructValueTree: + tree := New() + err := valueTree(tree, v) + return tree, err + case StructTagTree: + tree := New() + err := tagTree(tree, v) + return tree, err + case StructTypeTree: + tree := New() + err := typeTree(tree, v) + return tree, err + case StructTypeSizeTree: + tree := New() + err := typeSizeTree(tree, v) + return tree, err + default: + err := fmt.Errorf("treeprint: invalid StructTreeOption %v", treeOpt) + return nil, err + } +} + +type FmtFunc func(name string, v interface{}) (string, bool) + +func FromStructWithMeta(v interface{}, fmtFunc FmtFunc) (Tree, error) { + if fmtFunc == nil { + tree := New() + err := nameTree(tree, v) + return tree, err + } + tree := New() + err := metaTree(tree, v, fmtFunc) + return tree, err +} + +func Repr(v interface{}) string { + tree := New() + vType := reflect.TypeOf(v) + vValue := reflect.ValueOf(v) + _, val, isStruct := getValue(vType, &vValue) + if !isStruct { + return fmt.Sprintf("%+v", val.Interface()) + } + err := valueTree(tree, val.Interface()) + if err != nil { + return err.Error() + } + return tree.String() +} + +func nameTree(tree Tree, v interface{}) error { + typ, val, err := checkType(v) + if err != nil { + return err + } + fields := typ.NumField() + for i := 0; i < fields; i++ { + field := typ.Field(i) + fieldValue := val.Field(i) + name, skip, omit := getMeta(field.Name, field.Tag) + if skip || omit && isEmpty(&fieldValue) { + continue + } + typ, val, isStruct := getValue(field.Type, &fieldValue) + if !isStruct { + tree.AddNode(name) + continue + } else if subNum := typ.NumField(); subNum == 0 { + tree.AddNode(name) + continue + } + branch := tree.AddBranch(name) + if err := nameTree(branch, val.Interface()); err != nil { + err := fmt.Errorf("%v on struct branch %s", err, name) + return err + } + } + return nil +} + +func getMeta(fieldName string, tag reflect.StructTag) (name string, skip, omit bool) { + if tagStr := tag.Get("tree"); len(tagStr) > 0 { + name, omit = tagSpec(tagStr) + } + if name == "-" { + return fieldName, true, omit + } + if len(name) == 0 { + name = fieldName + } else if trimmed := strings.TrimSpace(name); len(trimmed) == 0 { + name = fieldName + } + return +} + +func valueTree(tree Tree, v interface{}) error { + typ, val, err := checkType(v) + if err != nil { + return err + } + fields := typ.NumField() + for i := 0; i < fields; i++ { + field := typ.Field(i) + fieldValue := val.Field(i) + name, skip, omit := getMeta(field.Name, field.Tag) + if skip || omit && isEmpty(&fieldValue) { + continue + } + typ, val, isStruct := getValue(field.Type, &fieldValue) + if !isStruct { + tree.AddMetaNode(val.Interface(), name) + continue + } else if subNum := typ.NumField(); subNum == 0 { + tree.AddMetaNode(val.Interface(), name) + continue + } + branch := tree.AddBranch(name) + if err := valueTree(branch, val.Interface()); err != nil { + err := fmt.Errorf("%v on struct branch %s", err, name) + return err + } + } + return nil +} + +func tagTree(tree Tree, v interface{}) error { + typ, val, err := checkType(v) + if err != nil { + return err + } + fields := typ.NumField() + for i := 0; i < fields; i++ { + field := typ.Field(i) + fieldValue := val.Field(i) + name, skip, omit := getMeta(field.Name, field.Tag) + if skip || omit && isEmpty(&fieldValue) { + continue + } + filteredTag := filterTags(field.Tag) + typ, val, isStruct := getValue(field.Type, &fieldValue) + if !isStruct { + tree.AddMetaNode(filteredTag, name) + continue + } else if subNum := typ.NumField(); subNum == 0 { + tree.AddMetaNode(filteredTag, name) + continue + } + branch := tree.AddMetaBranch(filteredTag, name) + if err := tagTree(branch, val.Interface()); err != nil { + err := fmt.Errorf("%v on struct branch %s", err, name) + return err + } + } + return nil +} + +func typeTree(tree Tree, v interface{}) error { + typ, val, err := checkType(v) + if err != nil { + return err + } + fields := typ.NumField() + for i := 0; i < fields; i++ { + field := typ.Field(i) + fieldValue := val.Field(i) + name, skip, omit := getMeta(field.Name, field.Tag) + if skip || omit && isEmpty(&fieldValue) { + continue + } + typ, val, isStruct := getValue(field.Type, &fieldValue) + typename := fmt.Sprintf("%T", val.Interface()) + if !isStruct { + tree.AddMetaNode(typename, name) + continue + } else if subNum := typ.NumField(); subNum == 0 { + tree.AddMetaNode(typename, name) + continue + } + branch := tree.AddMetaBranch(typename, name) + if err := typeTree(branch, val.Interface()); err != nil { + err := fmt.Errorf("%v on struct branch %s", err, name) + return err + } + } + return nil +} + +func typeSizeTree(tree Tree, v interface{}) error { + typ, val, err := checkType(v) + if err != nil { + return err + } + fields := typ.NumField() + for i := 0; i < fields; i++ { + field := typ.Field(i) + fieldValue := val.Field(i) + name, skip, omit := getMeta(field.Name, field.Tag) + if skip || omit && isEmpty(&fieldValue) { + continue + } + typ, val, isStruct := getValue(field.Type, &fieldValue) + typesize := typ.Size() + if !isStruct { + tree.AddMetaNode(typesize, name) + continue + } else if subNum := typ.NumField(); subNum == 0 { + tree.AddMetaNode(typesize, name) + continue + } + branch := tree.AddMetaBranch(typesize, name) + if err := typeSizeTree(branch, val.Interface()); err != nil { + err := fmt.Errorf("%v on struct branch %s", err, name) + return err + } + } + return nil +} + +func metaTree(tree Tree, v interface{}, fmtFunc FmtFunc) error { + typ, val, err := checkType(v) + if err != nil { + return err + } + fields := typ.NumField() + for i := 0; i < fields; i++ { + field := typ.Field(i) + fieldValue := val.Field(i) + name, skip, omit := getMeta(field.Name, field.Tag) + if skip || omit && isEmpty(&fieldValue) { + continue + } + typ, val, isStruct := getValue(field.Type, &fieldValue) + formatted, show := fmtFunc(name, val.Interface()) + if !isStruct { + if show { + tree.AddMetaNode(formatted, name) + continue + } + tree.AddNode(name) + continue + } else if subNum := typ.NumField(); subNum == 0 { + if show { + tree.AddMetaNode(formatted, name) + continue + } + tree.AddNode(name) + continue + } + var branch Tree + if show { + branch = tree.AddMetaBranch(formatted, name) + } else { + branch = tree.AddBranch(name) + } + if err := metaTree(branch, val.Interface(), fmtFunc); err != nil { + err := fmt.Errorf("%v on struct branch %s", err, name) + return err + } + } + return nil +} + +func getValue(typ reflect.Type, val *reflect.Value) (reflect.Type, *reflect.Value, bool) { + switch typ.Kind() { + case reflect.Ptr: + typ = typ.Elem() + if typ.Kind() == reflect.Struct { + elem := val.Elem() + return typ, &elem, true + } + case reflect.Struct: + return typ, val, true + } + return typ, val, false +} + +func checkType(v interface{}) (reflect.Type, *reflect.Value, error) { + typ := reflect.TypeOf(v) + val := reflect.ValueOf(v) + switch typ.Kind() { + case reflect.Ptr: + typ = typ.Elem() + if typ.Kind() != reflect.Struct { + err := fmt.Errorf("treeprint: %T is not a struct we could work with", v) + return nil, nil, err + } + val = val.Elem() + case reflect.Struct: + default: + err := fmt.Errorf("treeprint: %T is not a struct we could work with", v) + return nil, nil, err + } + return typ, &val, nil +} diff --git a/vendor/github.com/xlab/treeprint/treeprint.go b/vendor/github.com/xlab/treeprint/treeprint.go new file mode 100644 index 000000000000..8876f7e56656 --- /dev/null +++ b/vendor/github.com/xlab/treeprint/treeprint.go @@ -0,0 +1,215 @@ +// Package treeprint provides a simple ASCII tree composing tool. +package treeprint + +import ( + "bytes" + "fmt" + "io" + "reflect" +) + +type Value interface{} +type MetaValue interface{} + +// Tree represents a tree structure with leaf-nodes and branch-nodes. +type Tree interface { + // AddNode adds a new node to a branch. + AddNode(v Value) Tree + // AddMetaNode adds a new node with meta value provided to a branch. + AddMetaNode(meta MetaValue, v Value) Tree + // AddBranch adds a new branch node (a level deeper). + AddBranch(v Value) Tree + // AddMetaBranch adds a new branch node (a level deeper) with meta value provided. + AddMetaBranch(meta MetaValue, v Value) Tree + // Branch converts a leaf-node to a branch-node, + // applying this on a branch-node does no effect. + Branch() Tree + // FindByMeta finds a node whose meta value matches the provided one by reflect.DeepEqual, + // returns nil if not found. + FindByMeta(meta MetaValue) Tree + // FindByValue finds a node whose value matches the provided one by reflect.DeepEqual, + // returns nil if not found. + FindByValue(value Value) Tree + // returns the last node of a tree + FindLastNode() Tree + // String renders the tree or subtree as a string. + String() string + // Bytes renders the tree or subtree as byteslice. + Bytes() []byte + + SetValue(value Value) + SetMetaValue(meta MetaValue) +} + +type node struct { + Root *node + Meta MetaValue + Value Value + Nodes []*node +} + +func (n *node) FindLastNode() Tree { + ns := n.Nodes + n = ns[len(ns)-1] + return n +} + +func (n *node) AddNode(v Value) Tree { + n.Nodes = append(n.Nodes, &node{ + Root: n, + Value: v, + }) + if n.Root != nil { + return n.Root + } + return n +} + +func (n *node) AddMetaNode(meta MetaValue, v Value) Tree { + n.Nodes = append(n.Nodes, &node{ + Root: n, + Meta: meta, + Value: v, + }) + if n.Root != nil { + return n.Root + } + return n +} + +func (n *node) AddBranch(v Value) Tree { + branch := &node{ + Value: v, + } + n.Nodes = append(n.Nodes, branch) + return branch +} + +func (n *node) AddMetaBranch(meta MetaValue, v Value) Tree { + branch := &node{ + Meta: meta, + Value: v, + } + n.Nodes = append(n.Nodes, branch) + return branch +} + +func (n *node) Branch() Tree { + n.Root = nil + return n +} + +func (n *node) FindByMeta(meta MetaValue) Tree { + for _, node := range n.Nodes { + if reflect.DeepEqual(node.Meta, meta) { + return node + } + if v := node.FindByMeta(meta); v != nil { + return v + } + } + return nil +} + +func (n *node) FindByValue(value Value) Tree { + for _, node := range n.Nodes { + if reflect.DeepEqual(node.Value, value) { + return node + } + if v := node.FindByMeta(value); v != nil { + return v + } + } + return nil +} + +func (n *node) Bytes() []byte { + buf := new(bytes.Buffer) + level := 0 + var levelsEnded []int + if n.Root == nil { + if n.Meta != nil { + buf.WriteString(fmt.Sprintf("[%v] %v", n.Meta, n.Value)) + } else { + buf.WriteString(fmt.Sprintf("%v",n.Value)) + } + buf.WriteByte('\n') + } else { + edge := EdgeTypeMid + if len(n.Nodes) == 0 { + edge = EdgeTypeEnd + levelsEnded = append(levelsEnded, level) + } + printValues(buf, 0, levelsEnded, edge, n.Meta, n.Value) + } + if len(n.Nodes) > 0 { + printNodes(buf, level, levelsEnded, n.Nodes) + } + return buf.Bytes() +} + +func (n *node) String() string { + return string(n.Bytes()) +} + +func (n *node) SetValue(value Value){ + n.Value = value +} + +func (n *node) SetMetaValue(meta MetaValue){ + n.Meta = meta +} + +func printNodes(wr io.Writer, + level int, levelsEnded []int, nodes []*node) { + + for i, node := range nodes { + edge := EdgeTypeMid + if i == len(nodes)-1 { + levelsEnded = append(levelsEnded, level) + edge = EdgeTypeEnd + } + printValues(wr, level, levelsEnded, edge, node.Meta, node.Value) + if len(node.Nodes) > 0 { + printNodes(wr, level+1, levelsEnded, node.Nodes) + } + } +} + +func printValues(wr io.Writer, + level int, levelsEnded []int, edge EdgeType, meta MetaValue, val Value) { + + for i := 0; i < level; i++ { + if isEnded(levelsEnded, i) { + fmt.Fprint(wr, " ") + continue + } + fmt.Fprintf(wr, "%s   ", EdgeTypeLink) + } + if meta != nil { + fmt.Fprintf(wr, "%s [%v] %v\n", edge, meta, val) + return + } + fmt.Fprintf(wr, "%s %v\n", edge, val) +} + +func isEnded(levelsEnded []int, level int) bool { + for _, l := range levelsEnded { + if l == level { + return true + } + } + return false +} + +type EdgeType string + +var ( + EdgeTypeLink EdgeType = "│" + EdgeTypeMid EdgeType = "├──" + EdgeTypeEnd EdgeType = "└──" +) + +func New() Tree { + return &node{Value: "."} +} diff --git a/vendor/go.starlark.net/LICENSE b/vendor/go.starlark.net/LICENSE new file mode 100644 index 000000000000..a6609a143720 --- /dev/null +++ b/vendor/go.starlark.net/LICENSE @@ -0,0 +1,29 @@ +Copyright (c) 2017 The Bazel Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the + distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/go.starlark.net/internal/compile/compile.go b/vendor/go.starlark.net/internal/compile/compile.go new file mode 100644 index 000000000000..eb8e162792b8 --- /dev/null +++ b/vendor/go.starlark.net/internal/compile/compile.go @@ -0,0 +1,1903 @@ +// Package compile defines the Starlark bytecode compiler. +// It is an internal package of the Starlark interpreter and is not directly accessible to clients. +// +// The compiler generates byte code with optional uint32 operands for a +// virtual machine with the following components: +// - a program counter, which is an index into the byte code array. +// - an operand stack, whose maximum size is computed for each function by the compiler. +// - an stack of active iterators. +// - an array of local variables. +// The number of local variables and their indices are computed by the resolver. +// Locals (possibly including parameters) that are shared with nested functions +// are 'cells': their locals array slot will contain a value of type 'cell', +// an indirect value in a box that is explicitly read/updated by instructions. +// - an array of free variables, for nested functions. +// Free variables are a subset of the ancestors' cell variables. +// As with locals and cells, these are computed by the resolver. +// - an array of global variables, shared among all functions in the same module. +// All elements are initially nil. +// - two maps of predeclared and universal identifiers. +// +// Each function has a line number table that maps each program counter +// offset to a source position, including the column number. +// +// Operands, logically uint32s, are encoded using little-endian 7-bit +// varints, the top bit indicating that more bytes follow. +// +package compile // import "go.starlark.net/internal/compile" + +import ( + "bytes" + "fmt" + "log" + "os" + "path/filepath" + "strconv" + "sync" + + "go.starlark.net/resolve" + "go.starlark.net/syntax" +) + +// Disassemble causes the assembly code for each function +// to be printed to stderr as it is generated. +var Disassemble = false + +const debug = false // make code generation verbose, for debugging the compiler + +// Increment this to force recompilation of saved bytecode files. +const Version = 10 + +type Opcode uint8 + +// "x DUP x x" is a "stack picture" that describes the state of the +// stack before and after execution of the instruction. +// +// OP indicates an immediate operand that is an index into the +// specified table: locals, names, freevars, constants. +const ( + NOP Opcode = iota // - NOP - + + // stack operations + DUP // x DUP x x + DUP2 // x y DUP2 x y x y + POP // x POP - + EXCH // x y EXCH y x + + // binary comparisons + // (order must match Token) + LT + GT + GE + LE + EQL + NEQ + + // binary arithmetic + // (order must match Token) + PLUS + MINUS + STAR + SLASH + SLASHSLASH + PERCENT + AMP + PIPE + CIRCUMFLEX + LTLT + GTGT + + IN + + // unary operators + UPLUS // x UPLUS x + UMINUS // x UMINUS -x + TILDE // x TILDE ~x + + NONE // - NONE None + TRUE // - TRUE True + FALSE // - FALSE False + MANDATORY // - MANDATORY Mandatory [sentinel value for required kwonly args] + + ITERPUSH // iterable ITERPUSH - [pushes the iterator stack] + ITERPOP // - ITERPOP - [pops the iterator stack] + NOT // value NOT bool + RETURN // value RETURN - + SETINDEX // a i new SETINDEX - + INDEX // a i INDEX elem + SETDICT // dict key value SETDICT - + SETDICTUNIQ // dict key value SETDICTUNIQ - + APPEND // list elem APPEND - + SLICE // x lo hi step SLICE slice + INPLACE_ADD // x y INPLACE_ADD z where z is x+y or x.extend(y) + MAKEDICT // - MAKEDICT dict + SETCELL // value cell SETCELL - + CELL // cell CELL value + + // --- opcodes with an argument must go below this line --- + + // control flow + JMP // - JMP - + CJMP // cond CJMP - + ITERJMP // - ITERJMP elem (and fall through) [acts on topmost iterator] + // or: - ITERJMP - (and jump) + + CONSTANT // - CONSTANT value + MAKETUPLE // x1 ... xn MAKETUPLE tuple + MAKELIST // x1 ... xn MAKELIST list + MAKEFUNC // defaults+freevars MAKEFUNC fn + LOAD // from1 ... fromN module LOAD v1 ... vN + SETLOCAL // value SETLOCAL - + SETGLOBAL // value SETGLOBAL - + LOCAL // - LOCAL value + FREE // - FREE cell + GLOBAL // - GLOBAL value + PREDECLARED // - PREDECLARED value + UNIVERSAL // - UNIVERSAL value + ATTR // x ATTR y y = x.name + SETFIELD // x y SETFIELD - x.name = y + UNPACK // iterable UNPACK vn ... v1 + + // n>>8 is #positional args and n&0xff is #named args (pairs). + CALL // fn positional named CALL result + CALL_VAR // fn positional named *args CALL_VAR result + CALL_KW // fn positional named **kwargs CALL_KW result + CALL_VAR_KW // fn positional named *args **kwargs CALL_VAR_KW result + + OpcodeArgMin = JMP + OpcodeMax = CALL_VAR_KW +) + +// TODO(adonovan): add dynamic checks for missing opcodes in the tables below. + +var opcodeNames = [...]string{ + AMP: "amp", + APPEND: "append", + ATTR: "attr", + CALL: "call", + CALL_KW: "call_kw ", + CALL_VAR: "call_var", + CALL_VAR_KW: "call_var_kw", + CELL: "cell", + CIRCUMFLEX: "circumflex", + CJMP: "cjmp", + CONSTANT: "constant", + DUP2: "dup2", + DUP: "dup", + EQL: "eql", + EXCH: "exch", + FALSE: "false", + FREE: "free", + GE: "ge", + GLOBAL: "global", + GT: "gt", + GTGT: "gtgt", + IN: "in", + INDEX: "index", + INPLACE_ADD: "inplace_add", + ITERJMP: "iterjmp", + ITERPOP: "iterpop", + ITERPUSH: "iterpush", + JMP: "jmp", + LE: "le", + LOAD: "load", + LOCAL: "local", + LT: "lt", + LTLT: "ltlt", + MAKEDICT: "makedict", + MAKEFUNC: "makefunc", + MAKELIST: "makelist", + MAKETUPLE: "maketuple", + MANDATORY: "mandatory", + MINUS: "minus", + NEQ: "neq", + NONE: "none", + NOP: "nop", + NOT: "not", + PERCENT: "percent", + PIPE: "pipe", + PLUS: "plus", + POP: "pop", + PREDECLARED: "predeclared", + RETURN: "return", + SETCELL: "setcell", + SETDICT: "setdict", + SETDICTUNIQ: "setdictuniq", + SETFIELD: "setfield", + SETGLOBAL: "setglobal", + SETINDEX: "setindex", + SETLOCAL: "setlocal", + SLASH: "slash", + SLASHSLASH: "slashslash", + SLICE: "slice", + STAR: "star", + TILDE: "tilde", + TRUE: "true", + UMINUS: "uminus", + UNIVERSAL: "universal", + UNPACK: "unpack", + UPLUS: "uplus", +} + +const variableStackEffect = 0x7f + +// stackEffect records the effect on the size of the operand stack of +// each kind of instruction. For some instructions this requires computation. +var stackEffect = [...]int8{ + AMP: -1, + APPEND: -2, + ATTR: 0, + CALL: variableStackEffect, + CALL_KW: variableStackEffect, + CALL_VAR: variableStackEffect, + CALL_VAR_KW: variableStackEffect, + CELL: 0, + CIRCUMFLEX: -1, + CJMP: -1, + CONSTANT: +1, + DUP2: +2, + DUP: +1, + EQL: -1, + FALSE: +1, + FREE: +1, + GE: -1, + GLOBAL: +1, + GT: -1, + GTGT: -1, + IN: -1, + INDEX: -1, + INPLACE_ADD: -1, + ITERJMP: variableStackEffect, + ITERPOP: 0, + ITERPUSH: -1, + JMP: 0, + LE: -1, + LOAD: -1, + LOCAL: +1, + LT: -1, + LTLT: -1, + MAKEDICT: +1, + MAKEFUNC: 0, + MAKELIST: variableStackEffect, + MAKETUPLE: variableStackEffect, + MANDATORY: +1, + MINUS: -1, + NEQ: -1, + NONE: +1, + NOP: 0, + NOT: 0, + PERCENT: -1, + PIPE: -1, + PLUS: -1, + POP: -1, + PREDECLARED: +1, + RETURN: -1, + SETCELL: -2, + SETDICT: -3, + SETDICTUNIQ: -3, + SETFIELD: -2, + SETGLOBAL: -1, + SETINDEX: -3, + SETLOCAL: -1, + SLASH: -1, + SLASHSLASH: -1, + SLICE: -3, + STAR: -1, + TRUE: +1, + UMINUS: 0, + UNIVERSAL: +1, + UNPACK: variableStackEffect, + UPLUS: 0, +} + +func (op Opcode) String() string { + if op < OpcodeMax { + if name := opcodeNames[op]; name != "" { + return name + } + } + return fmt.Sprintf("illegal op (%d)", op) +} + +// A Program is a Starlark file in executable form. +// +// Programs are serialized by the Program.Encode method, +// which must be updated whenever this declaration is changed. +type Program struct { + Loads []Binding // name (really, string) and position of each load stmt + Names []string // names of attributes and predeclared variables + Constants []interface{} // = string | int64 | float64 | *big.Int + Functions []*Funcode + Globals []Binding // for error messages and tracing + Toplevel *Funcode // module initialization function +} + +// A Funcode is the code of a compiled Starlark function. +// +// Funcodes are serialized by the encoder.function method, +// which must be updated whenever this declaration is changed. +type Funcode struct { + Prog *Program + Pos syntax.Position // position of def or lambda token + Name string // name of this function + Doc string // docstring of this function + Code []byte // the byte code + pclinetab []uint16 // mapping from pc to linenum + Locals []Binding // locals, parameters first + Cells []int // indices of Locals that require cells + Freevars []Binding // for tracing + MaxStack int + NumParams int + NumKwonlyParams int + HasVarargs, HasKwargs bool + + // -- transient state -- + + lntOnce sync.Once + lnt []pclinecol // decoded line number table +} + +type pclinecol struct { + pc uint32 + line, col int32 +} + +// A Binding is the name and position of a binding identifier. +type Binding struct { + Name string + Pos syntax.Position +} + +// A pcomp holds the compiler state for a Program. +type pcomp struct { + prog *Program // what we're building + + names map[string]uint32 + constants map[interface{}]uint32 + functions map[*Funcode]uint32 +} + +// An fcomp holds the compiler state for a Funcode. +type fcomp struct { + fn *Funcode // what we're building + + pcomp *pcomp + pos syntax.Position // current position of generated code + loops []loop + block *block +} + +type loop struct { + break_, continue_ *block +} + +type block struct { + insns []insn + + // If the last insn is a RETURN, jmp and cjmp are nil. + // If the last insn is a CJMP or ITERJMP, + // cjmp and jmp are the "true" and "false" successors. + // Otherwise, jmp is the sole successor. + jmp, cjmp *block + + initialstack int // for stack depth computation + + // Used during encoding + index int // -1 => not encoded yet + addr uint32 +} + +type insn struct { + op Opcode + arg uint32 + line, col int32 +} + +// Position returns the source position for program counter pc. +func (fn *Funcode) Position(pc uint32) syntax.Position { + fn.lntOnce.Do(fn.decodeLNT) + + // Binary search to find last LNT entry not greater than pc. + // To avoid dynamic dispatch, this is a specialization of + // sort.Search using this predicate: + // !(i < len(fn.lnt)-1 && fn.lnt[i+1].pc <= pc) + n := len(fn.lnt) + i, j := 0, n + for i < j { + h := int(uint(i+j) >> 1) + if !(h >= n-1 || fn.lnt[h+1].pc > pc) { + i = h + 1 + } else { + j = h + } + } + + var line, col int32 + if i < n { + line = fn.lnt[i].line + col = fn.lnt[i].col + } + + pos := fn.Pos // copy the (annoyingly inaccessible) filename + pos.Col = col + pos.Line = line + return pos +} + +// decodeLNT decodes the line number table and populates fn.lnt. +// It is called at most once. +func (fn *Funcode) decodeLNT() { + // Conceptually the table contains rows of the form + // (pc uint32, line int32, col int32), sorted by pc. + // We use a delta encoding, since the differences + // between successive pc, line, and column values + // are typically small and positive (though line and + // especially column differences may be negative). + // The delta encoding starts from + // {pc: 0, line: fn.Pos.Line, col: fn.Pos.Col}. + // + // Each entry is packed into one or more 16-bit values: + // Δpc uint4 + // Δline int5 + // Δcol int6 + // incomplete uint1 + // The top 4 bits are the unsigned delta pc. + // The next 5 bits are the signed line number delta. + // The next 6 bits are the signed column number delta. + // The bottom bit indicates that more rows follow because + // one of the deltas was maxed out. + // These field widths were chosen from a sample of real programs, + // and allow >97% of rows to be encoded in a single uint16. + + fn.lnt = make([]pclinecol, 0, len(fn.pclinetab)) // a minor overapproximation + entry := pclinecol{ + pc: 0, + line: fn.Pos.Line, + col: fn.Pos.Col, + } + for _, x := range fn.pclinetab { + entry.pc += uint32(x) >> 12 + entry.line += int32((int16(x) << 4) >> (16 - 5)) // sign extend Δline + entry.col += int32((int16(x) << 9) >> (16 - 6)) // sign extend Δcol + if (x & 1) == 0 { + fn.lnt = append(fn.lnt, entry) + } + } +} + +// bindings converts resolve.Bindings to compiled form. +func bindings(bindings []*resolve.Binding) []Binding { + res := make([]Binding, len(bindings)) + for i, bind := range bindings { + res[i].Name = bind.First.Name + res[i].Pos = bind.First.NamePos + } + return res +} + +// Expr compiles an expression to a program whose toplevel function evaluates it. +func Expr(expr syntax.Expr, name string, locals []*resolve.Binding) *Program { + pos := syntax.Start(expr) + stmts := []syntax.Stmt{&syntax.ReturnStmt{Result: expr}} + return File(stmts, pos, name, locals, nil) +} + +// File compiles the statements of a file into a program. +func File(stmts []syntax.Stmt, pos syntax.Position, name string, locals, globals []*resolve.Binding) *Program { + pcomp := &pcomp{ + prog: &Program{ + Globals: bindings(globals), + }, + names: make(map[string]uint32), + constants: make(map[interface{}]uint32), + functions: make(map[*Funcode]uint32), + } + pcomp.prog.Toplevel = pcomp.function(name, pos, stmts, locals, nil) + + return pcomp.prog +} + +func (pcomp *pcomp) function(name string, pos syntax.Position, stmts []syntax.Stmt, locals, freevars []*resolve.Binding) *Funcode { + fcomp := &fcomp{ + pcomp: pcomp, + pos: pos, + fn: &Funcode{ + Prog: pcomp.prog, + Pos: pos, + Name: name, + Doc: docStringFromBody(stmts), + Locals: bindings(locals), + Freevars: bindings(freevars), + }, + } + + // Record indices of locals that require cells. + for i, local := range locals { + if local.Scope == resolve.Cell { + fcomp.fn.Cells = append(fcomp.fn.Cells, i) + } + } + + if debug { + fmt.Fprintf(os.Stderr, "start function(%s @ %s)\n", name, pos) + } + + // Convert AST to a CFG of instructions. + entry := fcomp.newBlock() + fcomp.block = entry + fcomp.stmts(stmts) + if fcomp.block != nil { + fcomp.emit(NONE) + fcomp.emit(RETURN) + } + + var oops bool // something bad happened + + setinitialstack := func(b *block, depth int) { + if b.initialstack == -1 { + b.initialstack = depth + } else if b.initialstack != depth { + fmt.Fprintf(os.Stderr, "%d: setinitialstack: depth mismatch: %d vs %d\n", + b.index, b.initialstack, depth) + oops = true + } + } + + // Linearize the CFG: + // compute order, address, and initial + // stack depth of each reachable block. + var pc uint32 + var blocks []*block + var maxstack int + var visit func(b *block) + visit = func(b *block) { + if b.index >= 0 { + return // already visited + } + b.index = len(blocks) + b.addr = pc + blocks = append(blocks, b) + + stack := b.initialstack + if debug { + fmt.Fprintf(os.Stderr, "%s block %d: (stack = %d)\n", name, b.index, stack) + } + var cjmpAddr *uint32 + var isiterjmp int + for i, insn := range b.insns { + pc++ + + // Compute size of argument. + if insn.op >= OpcodeArgMin { + switch insn.op { + case ITERJMP: + isiterjmp = 1 + fallthrough + case CJMP: + cjmpAddr = &b.insns[i].arg + pc += 4 + default: + pc += uint32(argLen(insn.arg)) + } + } + + // Compute effect on stack. + se := insn.stackeffect() + if debug { + fmt.Fprintln(os.Stderr, "\t", insn.op, stack, stack+se) + } + stack += se + if stack < 0 { + fmt.Fprintf(os.Stderr, "After pc=%d: stack underflow\n", pc) + oops = true + } + if stack+isiterjmp > maxstack { + maxstack = stack + isiterjmp + } + } + + if debug { + fmt.Fprintf(os.Stderr, "successors of block %d (start=%d):\n", + b.addr, b.index) + if b.jmp != nil { + fmt.Fprintf(os.Stderr, "jmp to %d\n", b.jmp.index) + } + if b.cjmp != nil { + fmt.Fprintf(os.Stderr, "cjmp to %d\n", b.cjmp.index) + } + } + + // Place the jmp block next. + if b.jmp != nil { + // jump threading (empty cycles are impossible) + for b.jmp.insns == nil { + b.jmp = b.jmp.jmp + } + + setinitialstack(b.jmp, stack+isiterjmp) + if b.jmp.index < 0 { + // Successor is not yet visited: + // place it next and fall through. + visit(b.jmp) + } else { + // Successor already visited; + // explicit backward jump required. + pc += 5 + } + } + + // Then the cjmp block. + if b.cjmp != nil { + // jump threading (empty cycles are impossible) + for b.cjmp.insns == nil { + b.cjmp = b.cjmp.jmp + } + + setinitialstack(b.cjmp, stack) + visit(b.cjmp) + + // Patch the CJMP/ITERJMP, if present. + if cjmpAddr != nil { + *cjmpAddr = b.cjmp.addr + } + } + } + setinitialstack(entry, 0) + visit(entry) + + fn := fcomp.fn + fn.MaxStack = maxstack + + // Emit bytecode (and position table). + if Disassemble { + fmt.Fprintf(os.Stderr, "Function %s: (%d blocks, %d bytes)\n", name, len(blocks), pc) + } + fcomp.generate(blocks, pc) + + if debug { + fmt.Fprintf(os.Stderr, "code=%d maxstack=%d\n", fn.Code, fn.MaxStack) + } + + // Don't panic until we've completed printing of the function. + if oops { + panic("internal error") + } + + if debug { + fmt.Fprintf(os.Stderr, "end function(%s @ %s)\n", name, pos) + } + + return fn +} + +func docStringFromBody(body []syntax.Stmt) string { + if len(body) == 0 { + return "" + } + expr, ok := body[0].(*syntax.ExprStmt) + if !ok { + return "" + } + lit, ok := expr.X.(*syntax.Literal) + if !ok { + return "" + } + if lit.Token != syntax.STRING { + return "" + } + return lit.Value.(string) +} + +func (insn *insn) stackeffect() int { + se := int(stackEffect[insn.op]) + if se == variableStackEffect { + arg := int(insn.arg) + switch insn.op { + case CALL, CALL_KW, CALL_VAR, CALL_VAR_KW: + se = -int(2*(insn.arg&0xff) + insn.arg>>8) + if insn.op != CALL { + se-- + } + if insn.op == CALL_VAR_KW { + se-- + } + case ITERJMP: + // Stack effect differs by successor: + // +1 for jmp/false/ok + // 0 for cjmp/true/exhausted + // Handled specially in caller. + se = 0 + case MAKELIST, MAKETUPLE: + se = 1 - arg + case UNPACK: + se = arg - 1 + default: + panic(insn.op) + } + } + return se +} + +// generate emits the linear instruction stream from the CFG, +// and builds the PC-to-line number table. +func (fcomp *fcomp) generate(blocks []*block, codelen uint32) { + code := make([]byte, 0, codelen) + var pclinetab []uint16 + prev := pclinecol{ + pc: 0, + line: fcomp.fn.Pos.Line, + col: fcomp.fn.Pos.Col, + } + + for _, b := range blocks { + if Disassemble { + fmt.Fprintf(os.Stderr, "%d:\n", b.index) + } + pc := b.addr + for _, insn := range b.insns { + if insn.line != 0 { + // Instruction has a source position. Delta-encode it. + // See Funcode.Position for the encoding. + for { + var incomplete uint16 + + // Δpc, uint4 + deltapc := pc - prev.pc + if deltapc > 0x0f { + deltapc = 0x0f + incomplete = 1 + } + prev.pc += deltapc + + // Δline, int5 + deltaline, ok := clip(insn.line-prev.line, -0x10, 0x0f) + if !ok { + incomplete = 1 + } + prev.line += deltaline + + // Δcol, int6 + deltacol, ok := clip(insn.col-prev.col, -0x20, 0x1f) + if !ok { + incomplete = 1 + } + prev.col += deltacol + + entry := uint16(deltapc<<12) | uint16(deltaline&0x1f)<<7 | uint16(deltacol&0x3f)<<1 | incomplete + pclinetab = append(pclinetab, entry) + if incomplete == 0 { + break + } + } + + if Disassemble { + fmt.Fprintf(os.Stderr, "\t\t\t\t\t; %s:%d:%d\n", + filepath.Base(fcomp.fn.Pos.Filename()), insn.line, insn.col) + } + } + if Disassemble { + PrintOp(fcomp.fn, pc, insn.op, insn.arg) + } + code = append(code, byte(insn.op)) + pc++ + if insn.op >= OpcodeArgMin { + if insn.op == CJMP || insn.op == ITERJMP { + code = addUint32(code, insn.arg, 4) // pad arg to 4 bytes + } else { + code = addUint32(code, insn.arg, 0) + } + pc = uint32(len(code)) + } + } + + if b.jmp != nil && b.jmp.index != b.index+1 { + addr := b.jmp.addr + if Disassemble { + fmt.Fprintf(os.Stderr, "\t%d\tjmp\t\t%d\t; block %d\n", + pc, addr, b.jmp.index) + } + code = append(code, byte(JMP)) + code = addUint32(code, addr, 4) + } + } + if len(code) != int(codelen) { + panic("internal error: wrong code length") + } + + fcomp.fn.pclinetab = pclinetab + fcomp.fn.Code = code +} + +// clip returns the value nearest x in the range [min...max], +// and whether it equals x. +func clip(x, min, max int32) (int32, bool) { + if x > max { + return max, false + } else if x < min { + return min, false + } else { + return x, true + } +} + +// addUint32 encodes x as 7-bit little-endian varint. +// TODO(adonovan): opt: steal top two bits of opcode +// to encode the number of complete bytes that follow. +func addUint32(code []byte, x uint32, min int) []byte { + end := len(code) + min + for x >= 0x80 { + code = append(code, byte(x)|0x80) + x >>= 7 + } + code = append(code, byte(x)) + // Pad the operand with NOPs to exactly min bytes. + for len(code) < end { + code = append(code, byte(NOP)) + } + return code +} + +func argLen(x uint32) int { + n := 0 + for x >= 0x80 { + n++ + x >>= 7 + } + return n + 1 +} + +// PrintOp prints an instruction. +// It is provided for debugging. +func PrintOp(fn *Funcode, pc uint32, op Opcode, arg uint32) { + if op < OpcodeArgMin { + fmt.Fprintf(os.Stderr, "\t%d\t%s\n", pc, op) + return + } + + var comment string + switch op { + case CONSTANT: + switch x := fn.Prog.Constants[arg].(type) { + case string: + comment = strconv.Quote(x) + default: + comment = fmt.Sprint(x) + } + case MAKEFUNC: + comment = fn.Prog.Functions[arg].Name + case SETLOCAL, LOCAL: + comment = fn.Locals[arg].Name + case SETGLOBAL, GLOBAL: + comment = fn.Prog.Globals[arg].Name + case ATTR, SETFIELD, PREDECLARED, UNIVERSAL: + comment = fn.Prog.Names[arg] + case FREE: + comment = fn.Freevars[arg].Name + case CALL, CALL_VAR, CALL_KW, CALL_VAR_KW: + comment = fmt.Sprintf("%d pos, %d named", arg>>8, arg&0xff) + default: + // JMP, CJMP, ITERJMP, MAKETUPLE, MAKELIST, LOAD, UNPACK: + // arg is just a number + } + var buf bytes.Buffer + fmt.Fprintf(&buf, "\t%d\t%-10s\t%d", pc, op, arg) + if comment != "" { + fmt.Fprint(&buf, "\t; ", comment) + } + fmt.Fprintln(&buf) + os.Stderr.Write(buf.Bytes()) +} + +// newBlock returns a new block. +func (fcomp) newBlock() *block { + return &block{index: -1, initialstack: -1} +} + +// emit emits an instruction to the current block. +func (fcomp *fcomp) emit(op Opcode) { + if op >= OpcodeArgMin { + panic("missing arg: " + op.String()) + } + insn := insn{op: op, line: fcomp.pos.Line, col: fcomp.pos.Col} + fcomp.block.insns = append(fcomp.block.insns, insn) + fcomp.pos.Line = 0 + fcomp.pos.Col = 0 +} + +// emit1 emits an instruction with an immediate operand. +func (fcomp *fcomp) emit1(op Opcode, arg uint32) { + if op < OpcodeArgMin { + panic("unwanted arg: " + op.String()) + } + insn := insn{op: op, arg: arg, line: fcomp.pos.Line, col: fcomp.pos.Col} + fcomp.block.insns = append(fcomp.block.insns, insn) + fcomp.pos.Line = 0 + fcomp.pos.Col = 0 +} + +// jump emits a jump to the specified block. +// On return, the current block is unset. +func (fcomp *fcomp) jump(b *block) { + if b == fcomp.block { + panic("self-jump") // unreachable: Starlark has no arbitrary looping constructs + } + fcomp.block.jmp = b + fcomp.block = nil +} + +// condjump emits a conditional jump (CJMP or ITERJMP) +// to the specified true/false blocks. +// (For ITERJMP, the cases are jmp/f/ok and cjmp/t/exhausted.) +// On return, the current block is unset. +func (fcomp *fcomp) condjump(op Opcode, t, f *block) { + if !(op == CJMP || op == ITERJMP) { + panic("not a conditional jump: " + op.String()) + } + fcomp.emit1(op, 0) // fill in address later + fcomp.block.cjmp = t + fcomp.jump(f) +} + +// nameIndex returns the index of the specified name +// within the name pool, adding it if necessary. +func (pcomp *pcomp) nameIndex(name string) uint32 { + index, ok := pcomp.names[name] + if !ok { + index = uint32(len(pcomp.prog.Names)) + pcomp.names[name] = index + pcomp.prog.Names = append(pcomp.prog.Names, name) + } + return index +} + +// constantIndex returns the index of the specified constant +// within the constant pool, adding it if necessary. +func (pcomp *pcomp) constantIndex(v interface{}) uint32 { + index, ok := pcomp.constants[v] + if !ok { + index = uint32(len(pcomp.prog.Constants)) + pcomp.constants[v] = index + pcomp.prog.Constants = append(pcomp.prog.Constants, v) + } + return index +} + +// functionIndex returns the index of the specified function +// AST the nestedfun pool, adding it if necessary. +func (pcomp *pcomp) functionIndex(fn *Funcode) uint32 { + index, ok := pcomp.functions[fn] + if !ok { + index = uint32(len(pcomp.prog.Functions)) + pcomp.functions[fn] = index + pcomp.prog.Functions = append(pcomp.prog.Functions, fn) + } + return index +} + +// string emits code to push the specified string. +func (fcomp *fcomp) string(s string) { + fcomp.emit1(CONSTANT, fcomp.pcomp.constantIndex(s)) +} + +// setPos sets the current source position. +// It should be called prior to any operation that can fail dynamically. +// All positions are assumed to belong to the same file. +func (fcomp *fcomp) setPos(pos syntax.Position) { + fcomp.pos = pos +} + +// set emits code to store the top-of-stack value +// to the specified local, cell, or global variable. +func (fcomp *fcomp) set(id *syntax.Ident) { + bind := id.Binding.(*resolve.Binding) + switch bind.Scope { + case resolve.Local: + fcomp.emit1(SETLOCAL, uint32(bind.Index)) + case resolve.Cell: + // TODO(adonovan): opt: make a single op for LOCAL, SETCELL. + fcomp.emit1(LOCAL, uint32(bind.Index)) + fcomp.emit(SETCELL) + case resolve.Global: + fcomp.emit1(SETGLOBAL, uint32(bind.Index)) + default: + log.Panicf("%s: set(%s): not global/local/cell (%d)", id.NamePos, id.Name, bind.Scope) + } +} + +// lookup emits code to push the value of the specified variable. +func (fcomp *fcomp) lookup(id *syntax.Ident) { + bind := id.Binding.(*resolve.Binding) + if bind.Scope != resolve.Universal { // (universal lookup can't fail) + fcomp.setPos(id.NamePos) + } + switch bind.Scope { + case resolve.Local: + fcomp.emit1(LOCAL, uint32(bind.Index)) + case resolve.Free: + // TODO(adonovan): opt: make a single op for FREE, CELL. + fcomp.emit1(FREE, uint32(bind.Index)) + fcomp.emit(CELL) + case resolve.Cell: + // TODO(adonovan): opt: make a single op for LOCAL, CELL. + fcomp.emit1(LOCAL, uint32(bind.Index)) + fcomp.emit(CELL) + case resolve.Global: + fcomp.emit1(GLOBAL, uint32(bind.Index)) + case resolve.Predeclared: + fcomp.emit1(PREDECLARED, fcomp.pcomp.nameIndex(id.Name)) + case resolve.Universal: + fcomp.emit1(UNIVERSAL, fcomp.pcomp.nameIndex(id.Name)) + default: + log.Panicf("%s: compiler.lookup(%s): scope = %d", id.NamePos, id.Name, bind.Scope) + } +} + +func (fcomp *fcomp) stmts(stmts []syntax.Stmt) { + for _, stmt := range stmts { + fcomp.stmt(stmt) + } +} + +func (fcomp *fcomp) stmt(stmt syntax.Stmt) { + switch stmt := stmt.(type) { + case *syntax.ExprStmt: + if _, ok := stmt.X.(*syntax.Literal); ok { + // Opt: don't compile doc comments only to pop them. + return + } + fcomp.expr(stmt.X) + fcomp.emit(POP) + + case *syntax.BranchStmt: + // Resolver invariant: break/continue appear only within loops. + switch stmt.Token { + case syntax.PASS: + // no-op + case syntax.BREAK: + b := fcomp.loops[len(fcomp.loops)-1].break_ + fcomp.jump(b) + fcomp.block = fcomp.newBlock() // dead code + case syntax.CONTINUE: + b := fcomp.loops[len(fcomp.loops)-1].continue_ + fcomp.jump(b) + fcomp.block = fcomp.newBlock() // dead code + } + + case *syntax.IfStmt: + // Keep consistent with CondExpr. + t := fcomp.newBlock() + f := fcomp.newBlock() + done := fcomp.newBlock() + + fcomp.ifelse(stmt.Cond, t, f) + + fcomp.block = t + fcomp.stmts(stmt.True) + fcomp.jump(done) + + fcomp.block = f + fcomp.stmts(stmt.False) + fcomp.jump(done) + + fcomp.block = done + + case *syntax.AssignStmt: + switch stmt.Op { + case syntax.EQ: + // simple assignment: x = y + fcomp.expr(stmt.RHS) + fcomp.assign(stmt.OpPos, stmt.LHS) + + case syntax.PLUS_EQ, + syntax.MINUS_EQ, + syntax.STAR_EQ, + syntax.SLASH_EQ, + syntax.SLASHSLASH_EQ, + syntax.PERCENT_EQ, + syntax.AMP_EQ, + syntax.PIPE_EQ, + syntax.CIRCUMFLEX_EQ, + syntax.LTLT_EQ, + syntax.GTGT_EQ: + // augmented assignment: x += y + + var set func() + + // Evaluate "address" of x exactly once to avoid duplicate side-effects. + switch lhs := unparen(stmt.LHS).(type) { + case *syntax.Ident: + // x = ... + fcomp.lookup(lhs) + set = func() { + fcomp.set(lhs) + } + + case *syntax.IndexExpr: + // x[y] = ... + fcomp.expr(lhs.X) + fcomp.expr(lhs.Y) + fcomp.emit(DUP2) + fcomp.setPos(lhs.Lbrack) + fcomp.emit(INDEX) + set = func() { + fcomp.setPos(lhs.Lbrack) + fcomp.emit(SETINDEX) + } + + case *syntax.DotExpr: + // x.f = ... + fcomp.expr(lhs.X) + fcomp.emit(DUP) + name := fcomp.pcomp.nameIndex(lhs.Name.Name) + fcomp.setPos(lhs.Dot) + fcomp.emit1(ATTR, name) + set = func() { + fcomp.setPos(lhs.Dot) + fcomp.emit1(SETFIELD, name) + } + + default: + panic(lhs) + } + + fcomp.expr(stmt.RHS) + + if stmt.Op == syntax.PLUS_EQ { + // Allow the runtime to optimize list += iterable. + fcomp.setPos(stmt.OpPos) + fcomp.emit(INPLACE_ADD) + } else { + fcomp.binop(stmt.OpPos, stmt.Op-syntax.PLUS_EQ+syntax.PLUS) + } + set() + } + + case *syntax.DefStmt: + fcomp.function(stmt.Function.(*resolve.Function)) + fcomp.set(stmt.Name) + + case *syntax.ForStmt: + // Keep consistent with ForClause. + head := fcomp.newBlock() + body := fcomp.newBlock() + tail := fcomp.newBlock() + + fcomp.expr(stmt.X) + fcomp.setPos(stmt.For) + fcomp.emit(ITERPUSH) + fcomp.jump(head) + + fcomp.block = head + fcomp.condjump(ITERJMP, tail, body) + + fcomp.block = body + fcomp.assign(stmt.For, stmt.Vars) + fcomp.loops = append(fcomp.loops, loop{break_: tail, continue_: head}) + fcomp.stmts(stmt.Body) + fcomp.loops = fcomp.loops[:len(fcomp.loops)-1] + fcomp.jump(head) + + fcomp.block = tail + fcomp.emit(ITERPOP) + + case *syntax.WhileStmt: + head := fcomp.newBlock() + body := fcomp.newBlock() + done := fcomp.newBlock() + + fcomp.jump(head) + fcomp.block = head + fcomp.ifelse(stmt.Cond, body, done) + + fcomp.block = body + fcomp.loops = append(fcomp.loops, loop{break_: done, continue_: head}) + fcomp.stmts(stmt.Body) + fcomp.loops = fcomp.loops[:len(fcomp.loops)-1] + fcomp.jump(head) + + fcomp.block = done + + case *syntax.ReturnStmt: + if stmt.Result != nil { + fcomp.expr(stmt.Result) + } else { + fcomp.emit(NONE) + } + fcomp.emit(RETURN) + fcomp.block = fcomp.newBlock() // dead code + + case *syntax.LoadStmt: + for i := range stmt.From { + fcomp.string(stmt.From[i].Name) + } + module := stmt.Module.Value.(string) + fcomp.pcomp.prog.Loads = append(fcomp.pcomp.prog.Loads, Binding{ + Name: module, + Pos: stmt.Module.TokenPos, + }) + fcomp.string(module) + fcomp.setPos(stmt.Load) + fcomp.emit1(LOAD, uint32(len(stmt.From))) + for i := range stmt.To { + fcomp.set(stmt.To[len(stmt.To)-1-i]) + } + + default: + start, _ := stmt.Span() + log.Panicf("%s: exec: unexpected statement %T", start, stmt) + } +} + +// assign implements lhs = rhs for arbitrary expressions lhs. +// RHS is on top of stack, consumed. +func (fcomp *fcomp) assign(pos syntax.Position, lhs syntax.Expr) { + switch lhs := lhs.(type) { + case *syntax.ParenExpr: + // (lhs) = rhs + fcomp.assign(pos, lhs.X) + + case *syntax.Ident: + // x = rhs + fcomp.set(lhs) + + case *syntax.TupleExpr: + // x, y = rhs + fcomp.assignSequence(pos, lhs.List) + + case *syntax.ListExpr: + // [x, y] = rhs + fcomp.assignSequence(pos, lhs.List) + + case *syntax.IndexExpr: + // x[y] = rhs + fcomp.expr(lhs.X) + fcomp.emit(EXCH) + fcomp.expr(lhs.Y) + fcomp.emit(EXCH) + fcomp.setPos(lhs.Lbrack) + fcomp.emit(SETINDEX) + + case *syntax.DotExpr: + // x.f = rhs + fcomp.expr(lhs.X) + fcomp.emit(EXCH) + fcomp.setPos(lhs.Dot) + fcomp.emit1(SETFIELD, fcomp.pcomp.nameIndex(lhs.Name.Name)) + + default: + panic(lhs) + } +} + +func (fcomp *fcomp) assignSequence(pos syntax.Position, lhs []syntax.Expr) { + fcomp.setPos(pos) + fcomp.emit1(UNPACK, uint32(len(lhs))) + for i := range lhs { + fcomp.assign(pos, lhs[i]) + } +} + +func (fcomp *fcomp) expr(e syntax.Expr) { + switch e := e.(type) { + case *syntax.ParenExpr: + fcomp.expr(e.X) + + case *syntax.Ident: + fcomp.lookup(e) + + case *syntax.Literal: + // e.Value is int64, float64, *bigInt, or string. + fcomp.emit1(CONSTANT, fcomp.pcomp.constantIndex(e.Value)) + + case *syntax.ListExpr: + for _, x := range e.List { + fcomp.expr(x) + } + fcomp.emit1(MAKELIST, uint32(len(e.List))) + + case *syntax.CondExpr: + // Keep consistent with IfStmt. + t := fcomp.newBlock() + f := fcomp.newBlock() + done := fcomp.newBlock() + + fcomp.ifelse(e.Cond, t, f) + + fcomp.block = t + fcomp.expr(e.True) + fcomp.jump(done) + + fcomp.block = f + fcomp.expr(e.False) + fcomp.jump(done) + + fcomp.block = done + + case *syntax.IndexExpr: + fcomp.expr(e.X) + fcomp.expr(e.Y) + fcomp.setPos(e.Lbrack) + fcomp.emit(INDEX) + + case *syntax.SliceExpr: + fcomp.setPos(e.Lbrack) + fcomp.expr(e.X) + if e.Lo != nil { + fcomp.expr(e.Lo) + } else { + fcomp.emit(NONE) + } + if e.Hi != nil { + fcomp.expr(e.Hi) + } else { + fcomp.emit(NONE) + } + if e.Step != nil { + fcomp.expr(e.Step) + } else { + fcomp.emit(NONE) + } + fcomp.emit(SLICE) + + case *syntax.Comprehension: + if e.Curly { + fcomp.emit(MAKEDICT) + } else { + fcomp.emit1(MAKELIST, 0) + } + fcomp.comprehension(e, 0) + + case *syntax.TupleExpr: + fcomp.tuple(e.List) + + case *syntax.DictExpr: + fcomp.emit(MAKEDICT) + for _, entry := range e.List { + entry := entry.(*syntax.DictEntry) + fcomp.emit(DUP) + fcomp.expr(entry.Key) + fcomp.expr(entry.Value) + fcomp.setPos(entry.Colon) + fcomp.emit(SETDICTUNIQ) + } + + case *syntax.UnaryExpr: + fcomp.expr(e.X) + fcomp.setPos(e.OpPos) + switch e.Op { + case syntax.MINUS: + fcomp.emit(UMINUS) + case syntax.PLUS: + fcomp.emit(UPLUS) + case syntax.NOT: + fcomp.emit(NOT) + case syntax.TILDE: + fcomp.emit(TILDE) + default: + log.Panicf("%s: unexpected unary op: %s", e.OpPos, e.Op) + } + + case *syntax.BinaryExpr: + switch e.Op { + // short-circuit operators + // TODO(adonovan): use ifelse to simplify conditions. + case syntax.OR: + // x or y => if x then x else y + done := fcomp.newBlock() + y := fcomp.newBlock() + + fcomp.expr(e.X) + fcomp.emit(DUP) + fcomp.condjump(CJMP, done, y) + + fcomp.block = y + fcomp.emit(POP) // discard X + fcomp.expr(e.Y) + fcomp.jump(done) + + fcomp.block = done + + case syntax.AND: + // x and y => if x then y else x + done := fcomp.newBlock() + y := fcomp.newBlock() + + fcomp.expr(e.X) + fcomp.emit(DUP) + fcomp.condjump(CJMP, y, done) + + fcomp.block = y + fcomp.emit(POP) // discard X + fcomp.expr(e.Y) + fcomp.jump(done) + + fcomp.block = done + + case syntax.PLUS: + fcomp.plus(e) + + default: + // all other strict binary operator (includes comparisons) + fcomp.expr(e.X) + fcomp.expr(e.Y) + fcomp.binop(e.OpPos, e.Op) + } + + case *syntax.DotExpr: + fcomp.expr(e.X) + fcomp.setPos(e.Dot) + fcomp.emit1(ATTR, fcomp.pcomp.nameIndex(e.Name.Name)) + + case *syntax.CallExpr: + fcomp.call(e) + + case *syntax.LambdaExpr: + fcomp.function(e.Function.(*resolve.Function)) + + default: + start, _ := e.Span() + log.Panicf("%s: unexpected expr %T", start, e) + } +} + +type summand struct { + x syntax.Expr + plusPos syntax.Position +} + +// plus emits optimized code for ((a+b)+...)+z that avoids naive +// quadratic behavior for strings, tuples, and lists, +// and folds together adjacent literals of the same type. +func (fcomp *fcomp) plus(e *syntax.BinaryExpr) { + // Gather all the right operands of the left tree of plusses. + // A tree (((a+b)+c)+d) becomes args=[a +b +c +d]. + args := make([]summand, 0, 2) // common case: 2 operands + for plus := e; ; { + args = append(args, summand{unparen(plus.Y), plus.OpPos}) + left := unparen(plus.X) + x, ok := left.(*syntax.BinaryExpr) + if !ok || x.Op != syntax.PLUS { + args = append(args, summand{x: left}) + break + } + plus = x + } + // Reverse args to syntactic order. + for i, n := 0, len(args)/2; i < n; i++ { + j := len(args) - 1 - i + args[i], args[j] = args[j], args[i] + } + + // Fold sums of adjacent literals of the same type: ""+"", []+[], ()+(). + out := args[:0] // compact in situ + for i := 0; i < len(args); { + j := i + 1 + if code := addable(args[i].x); code != 0 { + for j < len(args) && addable(args[j].x) == code { + j++ + } + if j > i+1 { + args[i].x = add(code, args[i:j]) + } + } + out = append(out, args[i]) + i = j + } + args = out + + // Emit code for an n-ary sum (n > 0). + fcomp.expr(args[0].x) + for _, summand := range args[1:] { + fcomp.expr(summand.x) + fcomp.setPos(summand.plusPos) + fcomp.emit(PLUS) + } + + // If len(args) > 2, use of an accumulator instead of a chain of + // PLUS operations may be more efficient. + // However, no gain was measured on a workload analogous to Bazel loading; + // TODO(adonovan): opt: re-evaluate on a Bazel analysis-like workload. + // + // We cannot use a single n-ary SUM operation + // a b c SUM<3> + // because we need to report a distinct error for each + // individual '+' operation, so three additional operations are + // needed: + // + // ACCSTART => create buffer and append to it + // ACCUM => append to buffer + // ACCEND => get contents of buffer + // + // For string, list, and tuple values, the interpreter can + // optimize these operations by using a mutable buffer. + // For all other types, ACCSTART and ACCEND would behave like + // the identity function and ACCUM behaves like PLUS. + // ACCUM must correctly support user-defined operations + // such as list+foo. + // + // fcomp.emit(ACCSTART) + // for _, summand := range args[1:] { + // fcomp.expr(summand.x) + // fcomp.setPos(summand.plusPos) + // fcomp.emit(ACCUM) + // } + // fcomp.emit(ACCEND) +} + +// addable reports whether e is a statically addable +// expression: a [s]tring, [l]ist, or [t]uple. +func addable(e syntax.Expr) rune { + switch e := e.(type) { + case *syntax.Literal: + // TODO(adonovan): opt: support INT/FLOAT/BIGINT constant folding. + switch e.Token { + case syntax.STRING: + return 's' + } + case *syntax.ListExpr: + return 'l' + case *syntax.TupleExpr: + return 't' + } + return 0 +} + +// add returns an expression denoting the sum of args, +// which are all addable values of the type indicated by code. +// The resulting syntax is degenerate, lacking position, etc. +func add(code rune, args []summand) syntax.Expr { + switch code { + case 's': + var buf bytes.Buffer + for _, arg := range args { + buf.WriteString(arg.x.(*syntax.Literal).Value.(string)) + } + return &syntax.Literal{Token: syntax.STRING, Value: buf.String()} + case 'l': + var elems []syntax.Expr + for _, arg := range args { + elems = append(elems, arg.x.(*syntax.ListExpr).List...) + } + return &syntax.ListExpr{List: elems} + case 't': + var elems []syntax.Expr + for _, arg := range args { + elems = append(elems, arg.x.(*syntax.TupleExpr).List...) + } + return &syntax.TupleExpr{List: elems} + } + panic(code) +} + +func unparen(e syntax.Expr) syntax.Expr { + if p, ok := e.(*syntax.ParenExpr); ok { + return unparen(p.X) + } + return e +} + +func (fcomp *fcomp) binop(pos syntax.Position, op syntax.Token) { + // TODO(adonovan): simplify by assuming syntax and compiler constants align. + fcomp.setPos(pos) + switch op { + // arithmetic + case syntax.PLUS: + fcomp.emit(PLUS) + case syntax.MINUS: + fcomp.emit(MINUS) + case syntax.STAR: + fcomp.emit(STAR) + case syntax.SLASH: + fcomp.emit(SLASH) + case syntax.SLASHSLASH: + fcomp.emit(SLASHSLASH) + case syntax.PERCENT: + fcomp.emit(PERCENT) + case syntax.AMP: + fcomp.emit(AMP) + case syntax.PIPE: + fcomp.emit(PIPE) + case syntax.CIRCUMFLEX: + fcomp.emit(CIRCUMFLEX) + case syntax.LTLT: + fcomp.emit(LTLT) + case syntax.GTGT: + fcomp.emit(GTGT) + case syntax.IN: + fcomp.emit(IN) + case syntax.NOT_IN: + fcomp.emit(IN) + fcomp.emit(NOT) + + // comparisons + case syntax.EQL, + syntax.NEQ, + syntax.GT, + syntax.LT, + syntax.LE, + syntax.GE: + fcomp.emit(Opcode(op-syntax.EQL) + EQL) + + default: + log.Panicf("%s: unexpected binary op: %s", pos, op) + } +} + +func (fcomp *fcomp) call(call *syntax.CallExpr) { + // TODO(adonovan): opt: Use optimized path for calling methods + // of built-ins: x.f(...) to avoid materializing a closure. + // if dot, ok := call.Fcomp.(*syntax.DotExpr); ok { + // fcomp.expr(dot.X) + // fcomp.args(call) + // fcomp.emit1(CALL_ATTR, fcomp.name(dot.Name.Name)) + // return + // } + + // usual case + fcomp.expr(call.Fn) + op, arg := fcomp.args(call) + fcomp.setPos(call.Lparen) + fcomp.emit1(op, arg) +} + +// args emits code to push a tuple of positional arguments +// and a tuple of named arguments containing alternating keys and values. +// Either or both tuples may be empty (TODO(adonovan): optimize). +func (fcomp *fcomp) args(call *syntax.CallExpr) (op Opcode, arg uint32) { + var callmode int + // Compute the number of each kind of parameter. + var p, n int // number of positional, named arguments + var varargs, kwargs syntax.Expr + for _, arg := range call.Args { + if binary, ok := arg.(*syntax.BinaryExpr); ok && binary.Op == syntax.EQ { + + // named argument (name, value) + fcomp.string(binary.X.(*syntax.Ident).Name) + fcomp.expr(binary.Y) + n++ + continue + } + if unary, ok := arg.(*syntax.UnaryExpr); ok { + if unary.Op == syntax.STAR { + callmode |= 1 + varargs = unary.X + continue + } else if unary.Op == syntax.STARSTAR { + callmode |= 2 + kwargs = unary.X + continue + } + } + + // positional argument + fcomp.expr(arg) + p++ + } + + // Python2 and Python3 both permit named arguments + // to appear both before and after a *args argument: + // f(1, 2, x=3, *[4], y=5, **dict(z=6)) + // + // They also differ in their evaluation order: + // Python2: 1 2 3 5 4 6 (*args and **kwargs evaluated last) + // Python3: 1 2 4 3 5 6 (positional args evaluated before named args) + // Starlark-in-Java historically used a third order: + // Lexical: 1 2 3 4 5 6 (all args evaluated left-to-right) + // + // After discussion in github.com/bazelbuild/starlark#13, the + // spec now requires Starlark to statically reject named + // arguments after *args (e.g. y=5), and to use Python2-style + // evaluation order. This is both easy to implement and + // consistent with lexical order: + // + // f(1, 2, x=3, *[4], **dict(z=6)) # 1 2 3 4 6 + + // *args + if varargs != nil { + fcomp.expr(varargs) + } + + // **kwargs + if kwargs != nil { + fcomp.expr(kwargs) + } + + // TODO(adonovan): avoid this with a more flexible encoding. + if p >= 256 || n >= 256 { + // resolve already checked this; should be unreachable + panic("too many arguments in call") + } + + return CALL + Opcode(callmode), uint32(p<<8 | n) +} + +func (fcomp *fcomp) tuple(elems []syntax.Expr) { + for _, elem := range elems { + fcomp.expr(elem) + } + fcomp.emit1(MAKETUPLE, uint32(len(elems))) +} + +func (fcomp *fcomp) comprehension(comp *syntax.Comprehension, clauseIndex int) { + if clauseIndex == len(comp.Clauses) { + fcomp.emit(DUP) // accumulator + if comp.Curly { + // dict: {k:v for ...} + // Parser ensures that body is of form k:v. + // Python-style set comprehensions {body for vars in x} + // are not supported. + entry := comp.Body.(*syntax.DictEntry) + fcomp.expr(entry.Key) + fcomp.expr(entry.Value) + fcomp.setPos(entry.Colon) + fcomp.emit(SETDICT) + } else { + // list: [body for vars in x] + fcomp.expr(comp.Body) + fcomp.emit(APPEND) + } + return + } + + clause := comp.Clauses[clauseIndex] + switch clause := clause.(type) { + case *syntax.IfClause: + t := fcomp.newBlock() + done := fcomp.newBlock() + fcomp.ifelse(clause.Cond, t, done) + + fcomp.block = t + fcomp.comprehension(comp, clauseIndex+1) + fcomp.jump(done) + + fcomp.block = done + return + + case *syntax.ForClause: + // Keep consistent with ForStmt. + head := fcomp.newBlock() + body := fcomp.newBlock() + tail := fcomp.newBlock() + + fcomp.expr(clause.X) + fcomp.setPos(clause.For) + fcomp.emit(ITERPUSH) + fcomp.jump(head) + + fcomp.block = head + fcomp.condjump(ITERJMP, tail, body) + + fcomp.block = body + fcomp.assign(clause.For, clause.Vars) + fcomp.comprehension(comp, clauseIndex+1) + fcomp.jump(head) + + fcomp.block = tail + fcomp.emit(ITERPOP) + return + } + + start, _ := clause.Span() + log.Panicf("%s: unexpected comprehension clause %T", start, clause) +} + +func (fcomp *fcomp) function(f *resolve.Function) { + // Evaluation of the defaults may fail, so record the position. + fcomp.setPos(f.Pos) + + // To reduce allocation, we emit a combined tuple + // for the defaults and the freevars. + // The function knows where to split it at run time. + + // Generate tuple of parameter defaults. For: + // def f(p1, p2=dp2, p3=dp3, *, k1, k2=dk2, k3, **kwargs) + // the tuple is: + // (dp2, dp3, MANDATORY, dk2, MANDATORY). + ndefaults := 0 + seenStar := false + for _, param := range f.Params { + switch param := param.(type) { + case *syntax.BinaryExpr: + fcomp.expr(param.Y) + ndefaults++ + case *syntax.UnaryExpr: + seenStar = true // * or *args (also **kwargs) + case *syntax.Ident: + if seenStar { + fcomp.emit(MANDATORY) + ndefaults++ + } + } + } + + // Capture the cells of the function's + // free variables from the lexical environment. + for _, freevar := range f.FreeVars { + // Don't call fcomp.lookup because we want + // the cell itself, not its content. + switch freevar.Scope { + case resolve.Free: + fcomp.emit1(FREE, uint32(freevar.Index)) + case resolve.Cell: + fcomp.emit1(LOCAL, uint32(freevar.Index)) + } + } + + fcomp.emit1(MAKETUPLE, uint32(ndefaults+len(f.FreeVars))) + + funcode := fcomp.pcomp.function(f.Name, f.Pos, f.Body, f.Locals, f.FreeVars) + + if debug { + // TODO(adonovan): do compilations sequentially not as a tree, + // to make the log easier to read. + // Simplify by identifying Toplevel and functionIndex 0. + fmt.Fprintf(os.Stderr, "resuming %s @ %s\n", fcomp.fn.Name, fcomp.pos) + } + + // def f(a, *, b=1) has only 2 parameters. + numParams := len(f.Params) + if f.NumKwonlyParams > 0 && !f.HasVarargs { + numParams-- + } + + funcode.NumParams = numParams + funcode.NumKwonlyParams = f.NumKwonlyParams + funcode.HasVarargs = f.HasVarargs + funcode.HasKwargs = f.HasKwargs + fcomp.emit1(MAKEFUNC, fcomp.pcomp.functionIndex(funcode)) +} + +// ifelse emits a Boolean control flow decision. +// On return, the current block is unset. +func (fcomp *fcomp) ifelse(cond syntax.Expr, t, f *block) { + switch cond := cond.(type) { + case *syntax.UnaryExpr: + if cond.Op == syntax.NOT { + // if not x then goto t else goto f + // => + // if x then goto f else goto t + fcomp.ifelse(cond.X, f, t) + return + } + + case *syntax.BinaryExpr: + switch cond.Op { + case syntax.AND: + // if x and y then goto t else goto f + // => + // if x then ifelse(y, t, f) else goto f + fcomp.expr(cond.X) + y := fcomp.newBlock() + fcomp.condjump(CJMP, y, f) + + fcomp.block = y + fcomp.ifelse(cond.Y, t, f) + return + + case syntax.OR: + // if x or y then goto t else goto f + // => + // if x then goto t else ifelse(y, t, f) + fcomp.expr(cond.X) + y := fcomp.newBlock() + fcomp.condjump(CJMP, t, y) + + fcomp.block = y + fcomp.ifelse(cond.Y, t, f) + return + case syntax.NOT_IN: + // if x not in y then goto t else goto f + // => + // if x in y then goto f else goto t + copy := *cond + copy.Op = syntax.IN + fcomp.expr(©) + fcomp.condjump(CJMP, f, t) + return + } + } + + // general case + fcomp.expr(cond) + fcomp.condjump(CJMP, t, f) +} diff --git a/vendor/go.starlark.net/internal/compile/serial.go b/vendor/go.starlark.net/internal/compile/serial.go new file mode 100644 index 000000000000..0107ef9cdf5d --- /dev/null +++ b/vendor/go.starlark.net/internal/compile/serial.go @@ -0,0 +1,389 @@ +package compile + +// This file defines functions to read and write a compile.Program to a file. +// +// It is the client's responsibility to avoid version skew between the +// compiler used to produce a file and the interpreter that consumes it. +// The version number is provided as a constant. +// Incompatible protocol changes should also increment the version number. +// +// Encoding +// +// Program: +// "sky!" [4]byte # magic number +// str uint32le # offset of section +// version varint # must match Version +// filename string +// numloads varint +// loads []Ident +// numnames varint +// names []string +// numconsts varint +// consts []Constant +// numglobals varint +// globals []Ident +// toplevel Funcode +// numfuncs varint +// funcs []Funcode +// []byte # concatenation of all referenced strings +// EOF +// +// Funcode: +// id Ident +// code []byte +// pclinetablen varint +// pclinetab []varint +// numlocals varint +// locals []Ident +// numcells varint +// cells []int +// numfreevars varint +// freevar []Ident +// maxstack varint +// numparams varint +// numkwonlyparams varint +// hasvarargs varint (0 or 1) +// haskwargs varint (0 or 1) +// +// Ident: +// filename string +// line, col varint +// +// Constant: # type data +// type varint # 0=string string +// data ... # 1=int varint +// # 2=float varint (bits as uint64) +// # 3=bigint string (decimal ASCII text) +// +// The encoding starts with a four-byte magic number. +// The next four bytes are a little-endian uint32 +// that provides the offset of the string section +// at the end of the file, which contains the ordered +// concatenation of all strings referenced by the +// program. This design permits the decoder to read +// the first and second parts of the file into different +// memory allocations: the first (the encoded program) +// is transient, but the second (the strings) persists +// for the life of the Program. +// +// Within the encoded program, all strings are referred +// to by their length. As the encoder and decoder process +// the entire file sequentially, they are in lock step, +// so the start offset of each string is implicit. +// +// Program.Code is represented as a []byte slice to permit +// modification when breakpoints are set. All other strings +// are represented as strings. They all (unsafely) share the +// same backing byte slice. +// +// Aside from the str field, all integers are encoded as varints. + +import ( + "encoding/binary" + "fmt" + "math" + "math/big" + debugpkg "runtime/debug" + "unsafe" + + "go.starlark.net/syntax" +) + +const magic = "!sky" + +// Encode encodes a compiled Starlark program. +func (prog *Program) Encode() []byte { + var e encoder + e.p = append(e.p, magic...) + e.p = append(e.p, "????"...) // string data offset; filled in later + e.int(Version) + e.string(prog.Toplevel.Pos.Filename()) + e.bindings(prog.Loads) + e.int(len(prog.Names)) + for _, name := range prog.Names { + e.string(name) + } + e.int(len(prog.Constants)) + for _, c := range prog.Constants { + switch c := c.(type) { + case string: + e.int(0) + e.string(c) + case int64: + e.int(1) + e.int64(c) + case float64: + e.int(2) + e.uint64(math.Float64bits(c)) + case *big.Int: + e.int(3) + e.string(c.Text(10)) + } + } + e.bindings(prog.Globals) + e.function(prog.Toplevel) + e.int(len(prog.Functions)) + for _, fn := range prog.Functions { + e.function(fn) + } + + // Patch in the offset of the string data section. + binary.LittleEndian.PutUint32(e.p[4:8], uint32(len(e.p))) + + return append(e.p, e.s...) +} + +type encoder struct { + p []byte // encoded program + s []byte // strings + tmp [binary.MaxVarintLen64]byte +} + +func (e *encoder) int(x int) { + e.int64(int64(x)) +} + +func (e *encoder) int64(x int64) { + n := binary.PutVarint(e.tmp[:], x) + e.p = append(e.p, e.tmp[:n]...) +} + +func (e *encoder) uint64(x uint64) { + n := binary.PutUvarint(e.tmp[:], x) + e.p = append(e.p, e.tmp[:n]...) +} + +func (e *encoder) string(s string) { + e.int(len(s)) + e.s = append(e.s, s...) +} + +func (e *encoder) bytes(b []byte) { + e.int(len(b)) + e.s = append(e.s, b...) +} + +func (e *encoder) binding(bind Binding) { + e.string(bind.Name) + e.int(int(bind.Pos.Line)) + e.int(int(bind.Pos.Col)) +} + +func (e *encoder) bindings(binds []Binding) { + e.int(len(binds)) + for _, bind := range binds { + e.binding(bind) + } +} + +func (e *encoder) function(fn *Funcode) { + e.binding(Binding{fn.Name, fn.Pos}) + e.string(fn.Doc) + e.bytes(fn.Code) + e.int(len(fn.pclinetab)) + for _, x := range fn.pclinetab { + e.int64(int64(x)) + } + e.bindings(fn.Locals) + e.int(len(fn.Cells)) + for _, index := range fn.Cells { + e.int(index) + } + e.bindings(fn.Freevars) + e.int(fn.MaxStack) + e.int(fn.NumParams) + e.int(fn.NumKwonlyParams) + e.int(b2i(fn.HasVarargs)) + e.int(b2i(fn.HasKwargs)) +} + +func b2i(b bool) int { + if b { + return 1 + } else { + return 0 + } +} + +// DecodeProgram decodes a compiled Starlark program from data. +func DecodeProgram(data []byte) (_ *Program, err error) { + if len(data) < len(magic) { + return nil, fmt.Errorf("not a compiled module: no magic number") + } + if got := string(data[:4]); got != magic { + return nil, fmt.Errorf("not a compiled module: got magic number %q, want %q", + got, magic) + } + defer func() { + if x := recover(); x != nil { + debugpkg.PrintStack() + err = fmt.Errorf("internal error while decoding program: %v", x) + } + }() + + offset := binary.LittleEndian.Uint32(data[4:8]) + d := decoder{ + p: data[8:offset], + s: append([]byte(nil), data[offset:]...), // allocate a copy, which will persist + } + + if v := d.int(); v != Version { + return nil, fmt.Errorf("version mismatch: read %d, want %d", v, Version) + } + + filename := d.string() + d.filename = &filename + + loads := d.bindings() + + names := make([]string, d.int()) + for i := range names { + names[i] = d.string() + } + + // constants + constants := make([]interface{}, d.int()) + for i := range constants { + var c interface{} + switch d.int() { + case 0: + c = d.string() + case 1: + c = d.int64() + case 2: + c = math.Float64frombits(d.uint64()) + case 3: + c, _ = new(big.Int).SetString(d.string(), 10) + } + constants[i] = c + } + + globals := d.bindings() + toplevel := d.function() + funcs := make([]*Funcode, d.int()) + for i := range funcs { + funcs[i] = d.function() + } + + prog := &Program{ + Loads: loads, + Names: names, + Constants: constants, + Globals: globals, + Functions: funcs, + Toplevel: toplevel, + } + toplevel.Prog = prog + for _, f := range funcs { + f.Prog = prog + } + + if len(d.p)+len(d.s) > 0 { + return nil, fmt.Errorf("internal error: unconsumed data during decoding") + } + + return prog, nil +} + +type decoder struct { + p []byte // encoded program + s []byte // strings + filename *string // (indirect to avoid keeping decoder live) +} + +func (d *decoder) int() int { + return int(d.int64()) +} + +func (d *decoder) int64() int64 { + x, len := binary.Varint(d.p[:]) + d.p = d.p[len:] + return x +} + +func (d *decoder) uint64() uint64 { + x, len := binary.Uvarint(d.p[:]) + d.p = d.p[len:] + return x +} + +func (d *decoder) string() (s string) { + if slice := d.bytes(); len(slice) > 0 { + // Avoid a memory allocation for each string + // by unsafely aliasing slice. + type string struct { + data *byte + len int + } + ptr := (*string)(unsafe.Pointer(&s)) + ptr.data = &slice[0] + ptr.len = len(slice) + } + return s +} + +func (d *decoder) bytes() []byte { + len := d.int() + r := d.s[:len:len] + d.s = d.s[len:] + return r +} + +func (d *decoder) binding() Binding { + name := d.string() + line := int32(d.int()) + col := int32(d.int()) + return Binding{Name: name, Pos: syntax.MakePosition(d.filename, line, col)} +} + +func (d *decoder) bindings() []Binding { + bindings := make([]Binding, d.int()) + for i := range bindings { + bindings[i] = d.binding() + } + return bindings +} + +func (d *decoder) ints() []int { + ints := make([]int, d.int()) + for i := range ints { + ints[i] = d.int() + } + return ints +} + +func (d *decoder) bool() bool { return d.int() != 0 } + +func (d *decoder) function() *Funcode { + id := d.binding() + doc := d.string() + code := d.bytes() + pclinetab := make([]uint16, d.int()) + for i := range pclinetab { + pclinetab[i] = uint16(d.int()) + } + locals := d.bindings() + cells := d.ints() + freevars := d.bindings() + maxStack := d.int() + numParams := d.int() + numKwonlyParams := d.int() + hasVarargs := d.int() != 0 + hasKwargs := d.int() != 0 + return &Funcode{ + // Prog is filled in later. + Pos: id.Pos, + Name: id.Name, + Doc: doc, + Code: code, + pclinetab: pclinetab, + Locals: locals, + Cells: cells, + Freevars: freevars, + MaxStack: maxStack, + NumParams: numParams, + NumKwonlyParams: numKwonlyParams, + HasVarargs: hasVarargs, + HasKwargs: hasKwargs, + } +} diff --git a/vendor/go.starlark.net/internal/spell/spell.go b/vendor/go.starlark.net/internal/spell/spell.go new file mode 100644 index 000000000000..7739fabaa4de --- /dev/null +++ b/vendor/go.starlark.net/internal/spell/spell.go @@ -0,0 +1,115 @@ +// Package spell file defines a simple spelling checker for use in attribute errors +// such as "no such field .foo; did you mean .food?". +package spell + +import ( + "strings" + "unicode" +) + +// Nearest returns the element of candidates +// nearest to x using the Levenshtein metric, +// or "" if none were promising. +func Nearest(x string, candidates []string) string { + // Ignore underscores and case when matching. + fold := func(s string) string { + return strings.Map(func(r rune) rune { + if r == '_' { + return -1 + } + return unicode.ToLower(r) + }, s) + } + + x = fold(x) + + var best string + bestD := (len(x) + 1) / 2 // allow up to 50% typos + for _, c := range candidates { + d := levenshtein(x, fold(c), bestD) + if d < bestD { + bestD = d + best = c + } + } + return best +} + +// levenshtein returns the non-negative Levenshtein edit distance +// between the byte strings x and y. +// +// If the computed distance exceeds max, +// the function may return early with an approximate value > max. +func levenshtein(x, y string, max int) int { + // This implementation is derived from one by Laurent Le Brun in + // Bazel that uses the single-row space efficiency trick + // described at bitbucket.org/clearer/iosifovich. + + // Let x be the shorter string. + if len(x) > len(y) { + x, y = y, x + } + + // Remove common prefix. + for i := 0; i < len(x); i++ { + if x[i] != y[i] { + x = x[i:] + y = y[i:] + break + } + } + if x == "" { + return len(y) + } + + if d := abs(len(x) - len(y)); d > max { + return d // excessive length divergence + } + + row := make([]int, len(y)+1) + for i := range row { + row[i] = i + } + + for i := 1; i <= len(x); i++ { + row[0] = i + best := i + prev := i - 1 + for j := 1; j <= len(y); j++ { + a := prev + b2i(x[i-1] != y[j-1]) // substitution + b := 1 + row[j-1] // deletion + c := 1 + row[j] // insertion + k := min(a, min(b, c)) + prev, row[j] = row[j], k + best = min(best, k) + } + if best > max { + return best + } + } + return row[len(y)] +} + +func b2i(b bool) int { + if b { + return 1 + } else { + return 0 + } +} + +func min(x, y int) int { + if x < y { + return x + } else { + return y + } +} + +func abs(x int) int { + if x >= 0 { + return x + } else { + return -x + } +} diff --git a/vendor/go.starlark.net/resolve/binding.go b/vendor/go.starlark.net/resolve/binding.go new file mode 100644 index 000000000000..6b99f4b9739a --- /dev/null +++ b/vendor/go.starlark.net/resolve/binding.go @@ -0,0 +1,74 @@ +// Copyright 2019 The Bazel Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package resolve + +import "go.starlark.net/syntax" + +// This file defines resolver data types saved in the syntax tree. +// We cannot guarantee API stability for these types +// as they are closely tied to the implementation. + +// A Binding contains resolver information about an identifer. +// The resolver populates the Binding field of each syntax.Identifier. +// The Binding ties together all identifiers that denote the same variable. +type Binding struct { + Scope Scope + + // Index records the index into the enclosing + // - {DefStmt,File}.Locals, if Scope==Local + // - DefStmt.FreeVars, if Scope==Free + // - File.Globals, if Scope==Global. + // It is zero if Scope is Predeclared, Universal, or Undefined. + Index int + + First *syntax.Ident // first binding use (iff Scope==Local/Free/Global) +} + +// The Scope of Binding indicates what kind of scope it has. +type Scope uint8 + +const ( + Undefined Scope = iota // name is not defined + Local // name is local to its function or file + Cell // name is function-local but shared with a nested function + Free // name is cell of some enclosing function + Global // name is global to module + Predeclared // name is predeclared for this module (e.g. glob) + Universal // name is universal (e.g. len) +) + +var scopeNames = [...]string{ + Undefined: "undefined", + Local: "local", + Cell: "cell", + Free: "free", + Global: "global", + Predeclared: "predeclared", + Universal: "universal", +} + +func (scope Scope) String() string { return scopeNames[scope] } + +// A Module contains resolver information about a file. +// The resolver populates the Module field of each syntax.File. +type Module struct { + Locals []*Binding // the file's (comprehension-)local variables + Globals []*Binding // the file's global variables +} + +// A Function contains resolver information about a named or anonymous function. +// The resolver populates the Function field of each syntax.DefStmt and syntax.LambdaExpr. +type Function struct { + Pos syntax.Position // of DEF or LAMBDA + Name string // name of def, or "lambda" + Params []syntax.Expr // param = ident | ident=expr | * | *ident | **ident + Body []syntax.Stmt // contains synthetic 'return expr' for lambda + + HasVarargs bool // whether params includes *args (convenience) + HasKwargs bool // whether params includes **kwargs (convenience) + NumKwonlyParams int // number of keyword-only optional parameters + Locals []*Binding // this function's local/cell variables, parameters first + FreeVars []*Binding // enclosing cells to capture in closure +} diff --git a/vendor/go.starlark.net/resolve/resolve.go b/vendor/go.starlark.net/resolve/resolve.go new file mode 100644 index 000000000000..440bcf08177f --- /dev/null +++ b/vendor/go.starlark.net/resolve/resolve.go @@ -0,0 +1,978 @@ +// Copyright 2017 The Bazel Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package resolve defines a name-resolution pass for Starlark abstract +// syntax trees. +// +// The resolver sets the Locals and FreeVars arrays of each DefStmt and +// the LocalIndex field of each syntax.Ident that refers to a local or +// free variable. It also sets the Locals array of a File for locals +// bound by top-level comprehensions and load statements. +// Identifiers for global variables do not get an index. +package resolve // import "go.starlark.net/resolve" + +// All references to names are statically resolved. Names may be +// predeclared, global, or local to a function or file. +// File-local variables include those bound by top-level comprehensions +// and by load statements. ("Top-level" means "outside of any function".) +// The resolver maps each global name to a small integer and each local +// name to a small integer; these integers enable a fast and compact +// representation of globals and locals in the evaluator. +// +// As an optimization, the resolver classifies each predeclared name as +// either universal (e.g. None, len) or per-module (e.g. glob in Bazel's +// build language), enabling the evaluator to share the representation +// of the universal environment across all modules. +// +// The lexical environment is a tree of blocks with the file block at +// its root. The file's child blocks may be of two kinds: functions +// and comprehensions, and these may have further children of either +// kind. +// +// Python-style resolution requires multiple passes because a name is +// determined to be local to a function only if the function contains a +// "binding" use of it; similarly, a name is determined to be global (as +// opposed to predeclared) if the module contains a top-level binding use. +// Unlike ordinary top-level assignments, the bindings created by load +// statements are local to the file block. +// A non-binding use may lexically precede the binding to which it is resolved. +// In the first pass, we inspect each function, recording in +// 'uses' each identifier and the environment block in which it occurs. +// If a use of a name is binding, such as a function parameter or +// assignment, we add the name to the block's bindings mapping and add a +// local variable to the enclosing function. +// +// As we finish resolving each function, we inspect all the uses within +// that function and discard ones that were found to be function-local. The +// remaining ones must be either free (local to some lexically enclosing +// function), or top-level (global, predeclared, or file-local), but we cannot tell +// which until we have finished inspecting the outermost enclosing +// function. At that point, we can distinguish local from top-level names +// (and this is when Python would compute free variables). +// +// However, Starlark additionally requires that all references to global +// names are satisfied by some declaration in the current module; +// Starlark permits a function to forward-reference a global or file-local +// that has not +// been declared yet so long as it is declared before the end of the +// module. So, instead of re-resolving the unresolved references after +// each top-level function, we defer this until the end of the module +// and ensure that all such references are satisfied by some definition. +// +// At the end of the module, we visit each of the nested function blocks +// in bottom-up order, doing a recursive lexical lookup for each +// unresolved name. If the name is found to be local to some enclosing +// function, we must create a DefStmt.FreeVar (capture) parameter for +// each intervening function. We enter these synthetic bindings into +// the bindings map so that we create at most one freevar per name. If +// the name was not local, we check that it was defined at module level. +// +// We resolve all uses of locals in the module (due to load statements +// and comprehensions) in a similar way and compute the file's set of +// local variables. +// +// Starlark enforces that all global names are assigned at most once on +// all control flow paths by forbidding if/else statements and loops at +// top level. A global may be used before it is defined, leading to a +// dynamic error. However, the AllowGlobalReassign flag (really: allow +// top-level reassign) makes the resolver allow multiple to a variable +// at top-level. It also allows if-, for-, and while-loops at top-level, +// which in turn may make the evaluator dynamically assign multiple +// values to a variable at top-level. (These two roles should be separated.) + +import ( + "fmt" + "log" + "sort" + "strings" + + "go.starlark.net/internal/spell" + "go.starlark.net/syntax" +) + +const debug = false +const doesnt = "this Starlark dialect does not " + +// global options +// These features are either not standard Starlark (yet), or deprecated +// features of the BUILD language, so we put them behind flags. +var ( + AllowNestedDef = false // allow def statements within function bodies + AllowLambda = false // allow lambda expressions + AllowFloat = false // allow floating point literals, the 'float' built-in, and x / y + AllowSet = false // allow the 'set' built-in + AllowGlobalReassign = false // allow reassignment to top-level names; also, allow if/for/while at top-level + AllowRecursion = false // allow while statements and recursive functions + AllowBitwise = true // obsolete; bitwise operations (&, |, ^, ~, <<, and >>) are always enabled + LoadBindsGlobally = false // load creates global not file-local bindings (deprecated) +) + +// File resolves the specified file and records information about the +// module in file.Module. +// +// The isPredeclared and isUniversal predicates report whether a name is +// a pre-declared identifier (visible in the current module) or a +// universal identifier (visible in every module). +// Clients should typically pass predeclared.Has for the first and +// starlark.Universe.Has for the second, where predeclared is the +// module's StringDict of predeclared names and starlark.Universe is the +// standard set of built-ins. +// The isUniverse predicate is supplied a parameter to avoid a cyclic +// dependency upon starlark.Universe, not because users should ever need +// to redefine it. +func File(file *syntax.File, isPredeclared, isUniversal func(name string) bool) error { + return REPLChunk(file, nil, isPredeclared, isUniversal) +} + +// REPLChunk is a generalization of the File function that supports a +// non-empty initial global block, as occurs in a REPL. +func REPLChunk(file *syntax.File, isGlobal, isPredeclared, isUniversal func(name string) bool) error { + r := newResolver(isGlobal, isPredeclared, isUniversal) + r.stmts(file.Stmts) + + r.env.resolveLocalUses() + + // At the end of the module, resolve all non-local variable references, + // computing closures. + // Function bodies may contain forward references to later global declarations. + r.resolveNonLocalUses(r.env) + + file.Module = &Module{ + Locals: r.moduleLocals, + Globals: r.moduleGlobals, + } + + if len(r.errors) > 0 { + return r.errors + } + return nil +} + +// Expr resolves the specified expression. +// It returns the local variables bound within the expression. +// +// The isPredeclared and isUniversal predicates behave as for the File function. +func Expr(expr syntax.Expr, isPredeclared, isUniversal func(name string) bool) ([]*Binding, error) { + r := newResolver(nil, isPredeclared, isUniversal) + r.expr(expr) + r.env.resolveLocalUses() + r.resolveNonLocalUses(r.env) // globals & universals + if len(r.errors) > 0 { + return nil, r.errors + } + return r.moduleLocals, nil +} + +// An ErrorList is a non-empty list of resolver error messages. +type ErrorList []Error // len > 0 + +func (e ErrorList) Error() string { return e[0].Error() } + +// An Error describes the nature and position of a resolver error. +type Error struct { + Pos syntax.Position + Msg string +} + +func (e Error) Error() string { return e.Pos.String() + ": " + e.Msg } + +func newResolver(isGlobal, isPredeclared, isUniversal func(name string) bool) *resolver { + file := new(block) + return &resolver{ + file: file, + env: file, + isGlobal: isGlobal, + isPredeclared: isPredeclared, + isUniversal: isUniversal, + globals: make(map[string]*Binding), + predeclared: make(map[string]*Binding), + } +} + +type resolver struct { + // env is the current local environment: + // a linked list of blocks, innermost first. + // The tail of the list is the file block. + env *block + file *block // file block (contains load bindings) + + // moduleLocals contains the local variables of the module + // (due to load statements and comprehensions outside any function). + // moduleGlobals contains the global variables of the module. + moduleLocals []*Binding + moduleGlobals []*Binding + + // globals maps each global name in the module to its binding. + // predeclared does the same for predeclared and universal names. + globals map[string]*Binding + predeclared map[string]*Binding + + // These predicates report whether a name is + // pre-declared, either in this module or universally, + // or already declared in the module globals (as in a REPL). + // isGlobal may be nil. + isGlobal, isPredeclared, isUniversal func(name string) bool + + loops int // number of enclosing for loops + + errors ErrorList +} + +// container returns the innermost enclosing "container" block: +// a function (function != nil) or file (function == nil). +// Container blocks accumulate local variable bindings. +func (r *resolver) container() *block { + for b := r.env; ; b = b.parent { + if b.function != nil || b == r.file { + return b + } + } +} + +func (r *resolver) push(b *block) { + r.env.children = append(r.env.children, b) + b.parent = r.env + r.env = b +} + +func (r *resolver) pop() { r.env = r.env.parent } + +type block struct { + parent *block // nil for file block + + // In the file (root) block, both these fields are nil. + function *Function // only for function blocks + comp *syntax.Comprehension // only for comprehension blocks + + // bindings maps a name to its binding. + // A local binding has an index into its innermost enclosing container's locals array. + // A free binding has an index into its innermost enclosing function's freevars array. + bindings map[string]*Binding + + // children records the child blocks of the current one. + children []*block + + // uses records all identifiers seen in this container (function or file), + // and a reference to the environment in which they appear. + // As we leave each container block, we resolve them, + // so that only free and global ones remain. + // At the end of each top-level function we compute closures. + uses []use +} + +func (b *block) bind(name string, bind *Binding) { + if b.bindings == nil { + b.bindings = make(map[string]*Binding) + } + b.bindings[name] = bind +} + +func (b *block) String() string { + if b.function != nil { + return "function block at " + fmt.Sprint(b.function.Pos) + } + if b.comp != nil { + return "comprehension block at " + fmt.Sprint(b.comp.Span()) + } + return "file block" +} + +func (r *resolver) errorf(posn syntax.Position, format string, args ...interface{}) { + r.errors = append(r.errors, Error{posn, fmt.Sprintf(format, args...)}) +} + +// A use records an identifier and the environment in which it appears. +type use struct { + id *syntax.Ident + env *block +} + +// bind creates a binding for id: a global (not file-local) +// binding at top-level, a local binding otherwise. +// At top-level, it reports an error if a global or file-local +// binding already exists, unless AllowGlobalReassign. +// It sets id.Binding to the binding (whether old or new), +// and returns whether a binding already existed. +func (r *resolver) bind(id *syntax.Ident) bool { + // Binding outside any local (comprehension/function) block? + if r.env == r.file { + bind, ok := r.file.bindings[id.Name] + if !ok { + bind, ok = r.globals[id.Name] + if !ok { + // first global binding of this name + bind = &Binding{ + First: id, + Scope: Global, + Index: len(r.moduleGlobals), + } + r.globals[id.Name] = bind + r.moduleGlobals = append(r.moduleGlobals, bind) + } + } + if ok && !AllowGlobalReassign { + r.errorf(id.NamePos, "cannot reassign %s %s declared at %s", + bind.Scope, id.Name, bind.First.NamePos) + } + id.Binding = bind + return ok + } + + return r.bindLocal(id) +} + +func (r *resolver) bindLocal(id *syntax.Ident) bool { + // Mark this name as local to current block. + // Assign it a new local (positive) index in the current container. + _, ok := r.env.bindings[id.Name] + if !ok { + var locals *[]*Binding + if fn := r.container().function; fn != nil { + locals = &fn.Locals + } else { + locals = &r.moduleLocals + } + bind := &Binding{ + First: id, + Scope: Local, + Index: len(*locals), + } + r.env.bind(id.Name, bind) + *locals = append(*locals, bind) + } + + r.use(id) + return ok +} + +func (r *resolver) use(id *syntax.Ident) { + use := use{id, r.env} + + // The spec says that if there is a global binding of a name + // then all references to that name in that block refer to the + // global, even if the use precedes the def---just as for locals. + // For example, in this code, + // + // print(len); len=1; print(len) + // + // both occurrences of len refer to the len=1 binding, which + // completely shadows the predeclared len function. + // + // The rationale for these semantics, which differ from Python, + // is that the static meaning of len (a reference to a global) + // does not change depending on where it appears in the file. + // Of course, its dynamic meaning does change, from an error + // into a valid reference, so it's not clear these semantics + // have any practical advantage. + // + // In any case, the Bazel implementation lags behind the spec + // and follows Python behavior, so the first use of len refers + // to the predeclared function. This typically used in a BUILD + // file that redefines a predeclared name half way through, + // for example: + // + // proto_library(...) # built-in rule + // load("myproto.bzl", "proto_library") + // proto_library(...) # user-defined rule + // + // We will piggyback support for the legacy semantics on the + // AllowGlobalReassign flag, which is loosely related and also + // required for Bazel. + if AllowGlobalReassign && r.env == r.file { + r.useToplevel(use) + return + } + + b := r.container() + b.uses = append(b.uses, use) +} + +// useToplevel resolves use.id as a reference to a name visible at top-level. +// The use.env field captures the original environment for error reporting. +func (r *resolver) useToplevel(use use) (bind *Binding) { + id := use.id + + if prev, ok := r.file.bindings[id.Name]; ok { + // use of load-defined name in file block + bind = prev + } else if prev, ok := r.globals[id.Name]; ok { + // use of global declared by module + bind = prev + } else if r.isGlobal != nil && r.isGlobal(id.Name) { + // use of global defined in a previous REPL chunk + bind = &Binding{ + First: id, // wrong: this is not even a binding use + Scope: Global, + Index: len(r.moduleGlobals), + } + r.globals[id.Name] = bind + r.moduleGlobals = append(r.moduleGlobals, bind) + } else if prev, ok := r.predeclared[id.Name]; ok { + // repeated use of predeclared or universal + bind = prev + } else if r.isPredeclared(id.Name) { + // use of pre-declared name + bind = &Binding{Scope: Predeclared} + r.predeclared[id.Name] = bind // save it + } else if r.isUniversal(id.Name) { + // use of universal name + if !AllowFloat && id.Name == "float" { + r.errorf(id.NamePos, doesnt+"support floating point") + } + if !AllowSet && id.Name == "set" { + r.errorf(id.NamePos, doesnt+"support sets") + } + bind = &Binding{Scope: Universal} + r.predeclared[id.Name] = bind // save it + } else { + bind = &Binding{Scope: Undefined} + var hint string + if n := r.spellcheck(use); n != "" { + hint = fmt.Sprintf(" (did you mean %s?)", n) + } + r.errorf(id.NamePos, "undefined: %s%s", id.Name, hint) + } + id.Binding = bind + return bind +} + +// spellcheck returns the most likely misspelling of +// the name use.id in the environment use.env. +func (r *resolver) spellcheck(use use) string { + var names []string + + // locals + for b := use.env; b != nil; b = b.parent { + for name := range b.bindings { + names = append(names, name) + } + } + + // globals + // + // We have no way to enumerate the sets whose membership + // tests are isPredeclared, isUniverse, and isGlobal, + // which includes prior names in the REPL session. + for _, bind := range r.moduleGlobals { + names = append(names, bind.First.Name) + } + + sort.Strings(names) + return spell.Nearest(use.id.Name, names) +} + +// resolveLocalUses is called when leaving a container (function/module) +// block. It resolves all uses of locals/cells within that block. +func (b *block) resolveLocalUses() { + unresolved := b.uses[:0] + for _, use := range b.uses { + if bind := lookupLocal(use); bind != nil && (bind.Scope == Local || bind.Scope == Cell) { + use.id.Binding = bind + } else { + unresolved = append(unresolved, use) + } + } + b.uses = unresolved +} + +func (r *resolver) stmts(stmts []syntax.Stmt) { + for _, stmt := range stmts { + r.stmt(stmt) + } +} + +func (r *resolver) stmt(stmt syntax.Stmt) { + switch stmt := stmt.(type) { + case *syntax.ExprStmt: + r.expr(stmt.X) + + case *syntax.BranchStmt: + if r.loops == 0 && (stmt.Token == syntax.BREAK || stmt.Token == syntax.CONTINUE) { + r.errorf(stmt.TokenPos, "%s not in a loop", stmt.Token) + } + + case *syntax.IfStmt: + if !AllowGlobalReassign && r.container().function == nil { + r.errorf(stmt.If, "if statement not within a function") + } + r.expr(stmt.Cond) + r.stmts(stmt.True) + r.stmts(stmt.False) + + case *syntax.AssignStmt: + r.expr(stmt.RHS) + isAugmented := stmt.Op != syntax.EQ + r.assign(stmt.LHS, isAugmented) + + case *syntax.DefStmt: + if !AllowNestedDef && r.container().function != nil { + r.errorf(stmt.Def, doesnt+"support nested def") + } + r.bind(stmt.Name) + fn := &Function{ + Name: stmt.Name.Name, + Pos: stmt.Def, + Params: stmt.Params, + Body: stmt.Body, + } + stmt.Function = fn + r.function(fn, stmt.Def) + + case *syntax.ForStmt: + if !AllowGlobalReassign && r.container().function == nil { + r.errorf(stmt.For, "for loop not within a function") + } + r.expr(stmt.X) + const isAugmented = false + r.assign(stmt.Vars, isAugmented) + r.loops++ + r.stmts(stmt.Body) + r.loops-- + + case *syntax.WhileStmt: + if !AllowRecursion { + r.errorf(stmt.While, doesnt+"support while loops") + } + if !AllowGlobalReassign && r.container().function == nil { + r.errorf(stmt.While, "while loop not within a function") + } + r.expr(stmt.Cond) + r.loops++ + r.stmts(stmt.Body) + r.loops-- + + case *syntax.ReturnStmt: + if r.container().function == nil { + r.errorf(stmt.Return, "return statement not within a function") + } + if stmt.Result != nil { + r.expr(stmt.Result) + } + + case *syntax.LoadStmt: + if r.container().function != nil { + r.errorf(stmt.Load, "load statement within a function") + } + + for i, from := range stmt.From { + if from.Name == "" { + r.errorf(from.NamePos, "load: empty identifier") + continue + } + if from.Name[0] == '_' { + r.errorf(from.NamePos, "load: names with leading underscores are not exported: %s", from.Name) + } + + id := stmt.To[i] + if LoadBindsGlobally { + r.bind(id) + } else if r.bindLocal(id) && !AllowGlobalReassign { + // "Global" in AllowGlobalReassign is a misnomer for "toplevel". + // Sadly we can't report the previous declaration + // as id.Binding may not be set yet. + r.errorf(id.NamePos, "cannot reassign top-level %s", id.Name) + } + } + + default: + log.Panicf("unexpected stmt %T", stmt) + } +} + +func (r *resolver) assign(lhs syntax.Expr, isAugmented bool) { + switch lhs := lhs.(type) { + case *syntax.Ident: + // x = ... + r.bind(lhs) + + case *syntax.IndexExpr: + // x[i] = ... + r.expr(lhs.X) + r.expr(lhs.Y) + + case *syntax.DotExpr: + // x.f = ... + r.expr(lhs.X) + + case *syntax.TupleExpr: + // (x, y) = ... + if len(lhs.List) == 0 { + r.errorf(syntax.Start(lhs), "can't assign to ()") + } + if isAugmented { + r.errorf(syntax.Start(lhs), "can't use tuple expression in augmented assignment") + } + for _, elem := range lhs.List { + r.assign(elem, isAugmented) + } + + case *syntax.ListExpr: + // [x, y, z] = ... + if len(lhs.List) == 0 { + r.errorf(syntax.Start(lhs), "can't assign to []") + } + if isAugmented { + r.errorf(syntax.Start(lhs), "can't use list expression in augmented assignment") + } + for _, elem := range lhs.List { + r.assign(elem, isAugmented) + } + + case *syntax.ParenExpr: + r.assign(lhs.X, isAugmented) + + default: + name := strings.ToLower(strings.TrimPrefix(fmt.Sprintf("%T", lhs), "*syntax.")) + r.errorf(syntax.Start(lhs), "can't assign to %s", name) + } +} + +func (r *resolver) expr(e syntax.Expr) { + switch e := e.(type) { + case *syntax.Ident: + r.use(e) + + case *syntax.Literal: + if !AllowFloat && e.Token == syntax.FLOAT { + r.errorf(e.TokenPos, doesnt+"support floating point") + } + + case *syntax.ListExpr: + for _, x := range e.List { + r.expr(x) + } + + case *syntax.CondExpr: + r.expr(e.Cond) + r.expr(e.True) + r.expr(e.False) + + case *syntax.IndexExpr: + r.expr(e.X) + r.expr(e.Y) + + case *syntax.DictEntry: + r.expr(e.Key) + r.expr(e.Value) + + case *syntax.SliceExpr: + r.expr(e.X) + if e.Lo != nil { + r.expr(e.Lo) + } + if e.Hi != nil { + r.expr(e.Hi) + } + if e.Step != nil { + r.expr(e.Step) + } + + case *syntax.Comprehension: + // The 'in' operand of the first clause (always a ForClause) + // is resolved in the outer block; consider: [x for x in x]. + clause := e.Clauses[0].(*syntax.ForClause) + r.expr(clause.X) + + // A list/dict comprehension defines a new lexical block. + // Locals defined within the block will be allotted + // distinct slots in the locals array of the innermost + // enclosing container (function/module) block. + r.push(&block{comp: e}) + + const isAugmented = false + r.assign(clause.Vars, isAugmented) + + for _, clause := range e.Clauses[1:] { + switch clause := clause.(type) { + case *syntax.IfClause: + r.expr(clause.Cond) + case *syntax.ForClause: + r.assign(clause.Vars, isAugmented) + r.expr(clause.X) + } + } + r.expr(e.Body) // body may be *DictEntry + r.pop() + + case *syntax.TupleExpr: + for _, x := range e.List { + r.expr(x) + } + + case *syntax.DictExpr: + for _, entry := range e.List { + entry := entry.(*syntax.DictEntry) + r.expr(entry.Key) + r.expr(entry.Value) + } + + case *syntax.UnaryExpr: + r.expr(e.X) + + case *syntax.BinaryExpr: + if !AllowFloat && e.Op == syntax.SLASH { + r.errorf(e.OpPos, doesnt+"support floating point (use //)") + } + r.expr(e.X) + r.expr(e.Y) + + case *syntax.DotExpr: + r.expr(e.X) + // ignore e.Name + + case *syntax.CallExpr: + r.expr(e.Fn) + var seenVarargs, seenKwargs bool + var seenName map[string]bool + var n, p int + for _, arg := range e.Args { + pos, _ := arg.Span() + if unop, ok := arg.(*syntax.UnaryExpr); ok && unop.Op == syntax.STARSTAR { + // **kwargs + if seenKwargs { + r.errorf(pos, "multiple **kwargs not allowed") + } + seenKwargs = true + r.expr(arg) + } else if ok && unop.Op == syntax.STAR { + // *args + if seenKwargs { + r.errorf(pos, "*args may not follow **kwargs") + } else if seenVarargs { + r.errorf(pos, "multiple *args not allowed") + } + seenVarargs = true + r.expr(arg) + } else if binop, ok := arg.(*syntax.BinaryExpr); ok && binop.Op == syntax.EQ { + // k=v + n++ + if seenKwargs { + r.errorf(pos, "argument may not follow **kwargs") + } + x := binop.X.(*syntax.Ident) + if seenName[x.Name] { + r.errorf(x.NamePos, "keyword argument %s repeated", x.Name) + } else { + if seenName == nil { + seenName = make(map[string]bool) + } + seenName[x.Name] = true + } + r.expr(binop.Y) + } else { + // positional argument + p++ + if seenVarargs { + r.errorf(pos, "argument may not follow *args") + } else if seenKwargs { + r.errorf(pos, "argument may not follow **kwargs") + } else if len(seenName) > 0 { + r.errorf(pos, "positional argument may not follow named") + } + r.expr(arg) + } + } + + // Fail gracefully if compiler-imposed limit is exceeded. + if p >= 256 { + pos, _ := e.Span() + r.errorf(pos, "%v positional arguments in call, limit is 255", p) + } + if n >= 256 { + pos, _ := e.Span() + r.errorf(pos, "%v keyword arguments in call, limit is 255", n) + } + + case *syntax.LambdaExpr: + if !AllowLambda { + r.errorf(e.Lambda, doesnt+"support lambda") + } + fn := &Function{ + Name: "lambda", + Pos: e.Lambda, + Params: e.Params, + Body: []syntax.Stmt{&syntax.ReturnStmt{Result: e.Body}}, + } + e.Function = fn + r.function(fn, e.Lambda) + + case *syntax.ParenExpr: + r.expr(e.X) + + default: + log.Panicf("unexpected expr %T", e) + } +} + +func (r *resolver) function(function *Function, pos syntax.Position) { + // Resolve defaults in enclosing environment. + for _, param := range function.Params { + if binary, ok := param.(*syntax.BinaryExpr); ok { + r.expr(binary.Y) + } + } + + // Enter function block. + b := &block{function: function} + r.push(b) + + var seenOptional bool + var star *syntax.UnaryExpr // * or *args param + var starStar *syntax.Ident // **kwargs ident + var numKwonlyParams int + for _, param := range function.Params { + switch param := param.(type) { + case *syntax.Ident: + // e.g. x + if starStar != nil { + r.errorf(param.NamePos, "required parameter may not follow **%s", starStar.Name) + } else if star != nil { + numKwonlyParams++ + } else if seenOptional { + r.errorf(param.NamePos, "required parameter may not follow optional") + } + if r.bind(param) { + r.errorf(param.NamePos, "duplicate parameter: %s", param.Name) + } + + case *syntax.BinaryExpr: + // e.g. y=dflt + if starStar != nil { + r.errorf(param.OpPos, "optional parameter may not follow **%s", starStar.Name) + } else if star != nil { + numKwonlyParams++ + } + if id := param.X.(*syntax.Ident); r.bind(id) { + r.errorf(param.OpPos, "duplicate parameter: %s", id.Name) + } + seenOptional = true + + case *syntax.UnaryExpr: + // * or *args or **kwargs + if param.Op == syntax.STAR { + if starStar != nil { + r.errorf(param.OpPos, "* parameter may not follow **%s", starStar.Name) + } else if star != nil { + r.errorf(param.OpPos, "multiple * parameters not allowed") + } else { + star = param + } + } else { + if starStar != nil { + r.errorf(param.OpPos, "multiple ** parameters not allowed") + } + starStar = param.X.(*syntax.Ident) + } + } + } + + // Bind the *args and **kwargs parameters at the end, + // so that regular parameters a/b/c are contiguous and + // there is no hole for the "*": + // def f(a, b, *args, c=0, **kwargs) + // def f(a, b, *, c=0, **kwargs) + if star != nil { + if id, _ := star.X.(*syntax.Ident); id != nil { + // *args + if r.bind(id) { + r.errorf(id.NamePos, "duplicate parameter: %s", id.Name) + } + function.HasVarargs = true + } else if numKwonlyParams == 0 { + r.errorf(star.OpPos, "bare * must be followed by keyword-only parameters") + } + } + if starStar != nil { + if r.bind(starStar) { + r.errorf(starStar.NamePos, "duplicate parameter: %s", starStar.Name) + } + function.HasKwargs = true + } + + function.NumKwonlyParams = numKwonlyParams + r.stmts(function.Body) + + // Resolve all uses of this function's local vars, + // and keep just the remaining uses of free/global vars. + b.resolveLocalUses() + + // Leave function block. + r.pop() + + // References within the function body to globals are not + // resolved until the end of the module. +} + +func (r *resolver) resolveNonLocalUses(b *block) { + // First resolve inner blocks. + for _, child := range b.children { + r.resolveNonLocalUses(child) + } + for _, use := range b.uses { + use.id.Binding = r.lookupLexical(use, use.env) + } +} + +// lookupLocal looks up an identifier within its immediately enclosing function. +func lookupLocal(use use) *Binding { + for env := use.env; env != nil; env = env.parent { + if bind, ok := env.bindings[use.id.Name]; ok { + if bind.Scope == Free { + // shouldn't exist till later + log.Panicf("%s: internal error: %s, %v", use.id.NamePos, use.id.Name, bind) + } + return bind // found + } + if env.function != nil { + break + } + } + return nil // not found in this function +} + +// lookupLexical looks up an identifier use.id within its lexically enclosing environment. +// The use.env field captures the original environment for error reporting. +func (r *resolver) lookupLexical(use use, env *block) (bind *Binding) { + if debug { + fmt.Printf("lookupLexical %s in %s = ...\n", use.id.Name, env) + defer func() { fmt.Printf("= %v\n", bind) }() + } + + // Is this the file block? + if env == r.file { + return r.useToplevel(use) // file-local, global, predeclared, or not found + } + + // Defined in this block? + bind, ok := env.bindings[use.id.Name] + if !ok { + // Defined in parent block? + bind = r.lookupLexical(use, env.parent) + if env.function != nil && (bind.Scope == Local || bind.Scope == Free || bind.Scope == Cell) { + // Found in parent block, which belongs to enclosing function. + // Add the parent's binding to the function's freevars, + // and add a new 'free' binding to the inner function's block, + // and turn the parent's local into cell. + if bind.Scope == Local { + bind.Scope = Cell + } + index := len(env.function.FreeVars) + env.function.FreeVars = append(env.function.FreeVars, bind) + bind = &Binding{ + First: bind.First, + Scope: Free, + Index: index, + } + if debug { + fmt.Printf("creating freevar %v in function at %s: %s\n", + len(env.function.FreeVars), env.function.Pos, use.id.Name) + } + } + + // Memoize, to avoid duplicate free vars + // and redundant global (failing) lookups. + env.bind(use.id.Name, bind) + } + return bind +} diff --git a/vendor/go.starlark.net/starlark/debug.go b/vendor/go.starlark.net/starlark/debug.go new file mode 100644 index 000000000000..22a21240f1e5 --- /dev/null +++ b/vendor/go.starlark.net/starlark/debug.go @@ -0,0 +1,42 @@ +package starlark + +import "go.starlark.net/syntax" + +// This file defines an experimental API for the debugging tools. +// Some of these declarations expose details of internal packages. +// (The debugger makes liberal use of exported fields of unexported types.) +// Breaking changes may occur without notice. + +// Local returns the value of the i'th local variable. +// It may be nil if not yet assigned. +// +// Local may be called only for frames whose Callable is a *Function (a +// function defined by Starlark source code), and only while the frame +// is active; it will panic otherwise. +// +// This function is provided only for debugging tools. +// +// THIS API IS EXPERIMENTAL AND MAY CHANGE WITHOUT NOTICE. +func (fr *frame) Local(i int) Value { return fr.locals[i] } + +// DebugFrame is the debugger API for a frame of the interpreter's call stack. +// +// Most applications have no need for this API; use CallFrame instead. +// +// Clients must not retain a DebugFrame nor call any of its methods once +// the current built-in call has returned or execution has resumed +// after a breakpoint as this may have unpredictable effects, including +// but not limited to retention of object that would otherwise be garbage. +type DebugFrame interface { + Callable() Callable // returns the frame's function + Local(i int) Value // returns the value of the (Starlark) frame's ith local variable + Position() syntax.Position // returns the current position of execution in this frame +} + +// DebugFrame returns the debugger interface for +// the specified frame of the interpreter's call stack. +// Frame numbering is as for Thread.CallFrame. +// +// This function is intended for use in debugging tools. +// Most applications should have no need for it; use CallFrame instead. +func (thread *Thread) DebugFrame(depth int) DebugFrame { return thread.frameAt(depth) } diff --git a/vendor/go.starlark.net/starlark/empty.s b/vendor/go.starlark.net/starlark/empty.s new file mode 100644 index 000000000000..3b8216999728 --- /dev/null +++ b/vendor/go.starlark.net/starlark/empty.s @@ -0,0 +1,3 @@ +// The presence of this file allows the package to use the +// "go:linkname" hack to call non-exported functions in the +// Go runtime, such as hardware-accelerated string hashing. diff --git a/vendor/go.starlark.net/starlark/eval.go b/vendor/go.starlark.net/starlark/eval.go new file mode 100644 index 000000000000..de492ca3c229 --- /dev/null +++ b/vendor/go.starlark.net/starlark/eval.go @@ -0,0 +1,1497 @@ +// Copyright 2017 The Bazel Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package starlark + +import ( + "fmt" + "io" + "io/ioutil" + "log" + "math" + "math/big" + "sort" + "strings" + "time" + "unicode" + "unicode/utf8" + + "go.starlark.net/internal/compile" + "go.starlark.net/internal/spell" + "go.starlark.net/resolve" + "go.starlark.net/syntax" +) + +// A Thread contains the state of a Starlark thread, +// such as its call stack and thread-local storage. +// The Thread is threaded throughout the evaluator. +type Thread struct { + // Name is an optional name that describes the thread, for debugging. + Name string + + // stack is the stack of (internal) call frames. + stack []*frame + + // Print is the client-supplied implementation of the Starlark + // 'print' function. If nil, fmt.Fprintln(os.Stderr, msg) is + // used instead. + Print func(thread *Thread, msg string) + + // Load is the client-supplied implementation of module loading. + // Repeated calls with the same module name must return the same + // module environment or error. + // The error message need not include the module name. + // + // See example_test.go for some example implementations of Load. + Load func(thread *Thread, module string) (StringDict, error) + + // locals holds arbitrary "thread-local" Go values belonging to the client. + // They are accessible to the client but not to any Starlark program. + locals map[string]interface{} + + // proftime holds the accumulated execution time since the last profile event. + proftime time.Duration +} + +// SetLocal sets the thread-local value associated with the specified key. +// It must not be called after execution begins. +func (thread *Thread) SetLocal(key string, value interface{}) { + if thread.locals == nil { + thread.locals = make(map[string]interface{}) + } + thread.locals[key] = value +} + +// Local returns the thread-local value associated with the specified key. +func (thread *Thread) Local(key string) interface{} { + return thread.locals[key] +} + +// CallFrame returns a copy of the specified frame of the callstack. +// It should only be used in built-ins called from Starlark code. +// Depth 0 means the frame of the built-in itself, 1 is its caller, and so on. +// +// It is equivalent to CallStack().At(depth), but more efficient. +func (thread *Thread) CallFrame(depth int) CallFrame { + return thread.frameAt(depth).asCallFrame() +} + +func (thread *Thread) frameAt(depth int) *frame { + return thread.stack[len(thread.stack)-1-depth] +} + +// CallStack returns a new slice containing the thread's stack of call frames. +func (thread *Thread) CallStack() CallStack { + frames := make([]CallFrame, len(thread.stack)) + for i, fr := range thread.stack { + frames[i] = fr.asCallFrame() + } + return frames +} + +// CallStackDepth returns the number of frames in the current call stack. +func (thread *Thread) CallStackDepth() int { return len(thread.stack) } + +// A StringDict is a mapping from names to values, and represents +// an environment such as the global variables of a module. +// It is not a true starlark.Value. +type StringDict map[string]Value + +// Keys returns a new sorted slice of d's keys. +func (d StringDict) Keys() []string { + names := make([]string, 0, len(d)) + for name := range d { + names = append(names, name) + } + sort.Strings(names) + return names +} + +func (d StringDict) String() string { + buf := new(strings.Builder) + buf.WriteByte('{') + sep := "" + for _, name := range d.Keys() { + buf.WriteString(sep) + buf.WriteString(name) + buf.WriteString(": ") + writeValue(buf, d[name], nil) + sep = ", " + } + buf.WriteByte('}') + return buf.String() +} + +func (d StringDict) Freeze() { + for _, v := range d { + v.Freeze() + } +} + +// Has reports whether the dictionary contains the specified key. +func (d StringDict) Has(key string) bool { _, ok := d[key]; return ok } + +// A frame records a call to a Starlark function (including module toplevel) +// or a built-in function or method. +type frame struct { + callable Callable // current function (or toplevel) or built-in + pc uint32 // program counter (Starlark frames only) + locals []Value // local variables (Starlark frames only) + spanStart int64 // start time of current profiler span +} + +// Position returns the source position of the current point of execution in this frame. +func (fr *frame) Position() syntax.Position { + switch c := fr.callable.(type) { + case *Function: + // Starlark function + return c.funcode.Position(fr.pc) + case callableWithPosition: + // If a built-in Callable defines + // a Position method, use it. + return c.Position() + } + return syntax.MakePosition(&builtinFilename, 0, 0) +} + +var builtinFilename = "" + +// Function returns the frame's function or built-in. +func (fr *frame) Callable() Callable { return fr.callable } + +// A CallStack is a stack of call frames, outermost first. +type CallStack []CallFrame + +// At returns a copy of the frame at depth i. +// At(0) returns the topmost frame. +func (stack CallStack) At(i int) CallFrame { return stack[len(stack)-1-i] } + +// Pop removes and returns the topmost frame. +func (stack *CallStack) Pop() CallFrame { + last := len(*stack) - 1 + top := (*stack)[last] + *stack = (*stack)[:last] + return top +} + +// String returns a user-friendly description of the stack. +func (stack CallStack) String() string { + out := new(strings.Builder) + fmt.Fprintf(out, "Traceback (most recent call last):\n") + for _, fr := range stack { + fmt.Fprintf(out, " %s: in %s\n", fr.Pos, fr.Name) + } + return out.String() +} + +// An EvalError is a Starlark evaluation error and +// a copy of the thread's stack at the moment of the error. +type EvalError struct { + Msg string + CallStack CallStack + cause error +} + +// A CallFrame represents the function name and current +// position of execution of an enclosing call frame. +type CallFrame struct { + Name string + Pos syntax.Position +} + +func (fr *frame) asCallFrame() CallFrame { + return CallFrame{ + Name: fr.Callable().Name(), + Pos: fr.Position(), + } +} + +func (thread *Thread) evalError(err error) *EvalError { + return &EvalError{ + Msg: err.Error(), + CallStack: thread.CallStack(), + cause: err, + } +} + +func (e *EvalError) Error() string { return e.Msg } + +// Backtrace returns a user-friendly error message describing the stack +// of calls that led to this error. +func (e *EvalError) Backtrace() string { + return fmt.Sprintf("%sError: %s", e.CallStack, e.Msg) +} + +func (e *EvalError) Unwrap() error { return e.cause } + +// A Program is a compiled Starlark program. +// +// Programs are immutable, and contain no Values. +// A Program may be created by parsing a source file (see SourceProgram) +// or by loading a previously saved compiled program (see CompiledProgram). +type Program struct { + compiled *compile.Program +} + +// CompilerVersion is the version number of the protocol for compiled +// files. Applications must not run programs compiled by one version +// with an interpreter at another version, and should thus incorporate +// the compiler version into the cache key when reusing compiled code. +const CompilerVersion = compile.Version + +// Filename returns the name of the file from which this program was loaded. +func (prog *Program) Filename() string { return prog.compiled.Toplevel.Pos.Filename() } + +func (prog *Program) String() string { return prog.Filename() } + +// NumLoads returns the number of load statements in the compiled program. +func (prog *Program) NumLoads() int { return len(prog.compiled.Loads) } + +// Load(i) returns the name and position of the i'th module directly +// loaded by this one, where 0 <= i < NumLoads(). +// The name is unresolved---exactly as it appears in the source. +func (prog *Program) Load(i int) (string, syntax.Position) { + id := prog.compiled.Loads[i] + return id.Name, id.Pos +} + +// WriteTo writes the compiled module to the specified output stream. +func (prog *Program) Write(out io.Writer) error { + data := prog.compiled.Encode() + _, err := out.Write(data) + return err +} + +// ExecFile parses, resolves, and executes a Starlark file in the +// specified global environment, which may be modified during execution. +// +// Thread is the state associated with the Starlark thread. +// +// The filename and src parameters are as for syntax.Parse: +// filename is the name of the file to execute, +// and the name that appears in error messages; +// src is an optional source of bytes to use +// instead of filename. +// +// predeclared defines the predeclared names specific to this module. +// Execution does not modify this dictionary, though it may mutate +// its values. +// +// If ExecFile fails during evaluation, it returns an *EvalError +// containing a backtrace. +func ExecFile(thread *Thread, filename string, src interface{}, predeclared StringDict) (StringDict, error) { + // Parse, resolve, and compile a Starlark source file. + _, mod, err := SourceProgram(filename, src, predeclared.Has) + if err != nil { + return nil, err + } + + g, err := mod.Init(thread, predeclared) + g.Freeze() + return g, err +} + +// SourceProgram produces a new program by parsing, resolving, +// and compiling a Starlark source file. +// On success, it returns the parsed file and the compiled program. +// The filename and src parameters are as for syntax.Parse. +// +// The isPredeclared predicate reports whether a name is +// a pre-declared identifier of the current module. +// Its typical value is predeclared.Has, +// where predeclared is a StringDict of pre-declared values. +func SourceProgram(filename string, src interface{}, isPredeclared func(string) bool) (*syntax.File, *Program, error) { + f, err := syntax.Parse(filename, src, 0) + if err != nil { + return nil, nil, err + } + prog, err := FileProgram(f, isPredeclared) + return f, prog, err +} + +// FileProgram produces a new program by resolving, +// and compiling the Starlark source file syntax tree. +// On success, it returns the compiled program. +// +// Resolving a syntax tree mutates it. +// Do not call FileProgram more than once on the same file. +// +// The isPredeclared predicate reports whether a name is +// a pre-declared identifier of the current module. +// Its typical value is predeclared.Has, +// where predeclared is a StringDict of pre-declared values. +func FileProgram(f *syntax.File, isPredeclared func(string) bool) (*Program, error) { + if err := resolve.File(f, isPredeclared, Universe.Has); err != nil { + return nil, err + } + + var pos syntax.Position + if len(f.Stmts) > 0 { + pos = syntax.Start(f.Stmts[0]) + } else { + pos = syntax.MakePosition(&f.Path, 1, 1) + } + + module := f.Module.(*resolve.Module) + compiled := compile.File(f.Stmts, pos, "", module.Locals, module.Globals) + + return &Program{compiled}, nil +} + +// CompiledProgram produces a new program from the representation +// of a compiled program previously saved by Program.Write. +func CompiledProgram(in io.Reader) (*Program, error) { + data, err := ioutil.ReadAll(in) + if err != nil { + return nil, err + } + compiled, err := compile.DecodeProgram(data) + if err != nil { + return nil, err + } + return &Program{compiled}, nil +} + +// Init creates a set of global variables for the program, +// executes the toplevel code of the specified program, +// and returns a new, unfrozen dictionary of the globals. +func (prog *Program) Init(thread *Thread, predeclared StringDict) (StringDict, error) { + toplevel := makeToplevelFunction(prog.compiled, predeclared) + + _, err := Call(thread, toplevel, nil, nil) + + // Convert the global environment to a map. + // We return a (partial) map even in case of error. + return toplevel.Globals(), err +} + +// ExecREPLChunk compiles and executes file f in the specified thread +// and global environment. This is a variant of ExecFile specialized to +// the needs of a REPL, in which a sequence of input chunks, each +// syntactically a File, manipulates the same set of module globals, +// which are not frozen after execution. +// +// This function is intended to support only go.starlark.net/repl. +// Its API stability is not guaranteed. +func ExecREPLChunk(f *syntax.File, thread *Thread, globals StringDict) error { + var predeclared StringDict + + // -- variant of FileProgram -- + + if err := resolve.REPLChunk(f, globals.Has, predeclared.Has, Universe.Has); err != nil { + return err + } + + var pos syntax.Position + if len(f.Stmts) > 0 { + pos = syntax.Start(f.Stmts[0]) + } else { + pos = syntax.MakePosition(&f.Path, 1, 1) + } + + module := f.Module.(*resolve.Module) + compiled := compile.File(f.Stmts, pos, "", module.Locals, module.Globals) + prog := &Program{compiled} + + // -- variant of Program.Init -- + + toplevel := makeToplevelFunction(prog.compiled, predeclared) + + // Initialize module globals from parameter. + for i, id := range prog.compiled.Globals { + if v := globals[id.Name]; v != nil { + toplevel.module.globals[i] = v + } + } + + _, err := Call(thread, toplevel, nil, nil) + + // Reflect changes to globals back to parameter, even after an error. + for i, id := range prog.compiled.Globals { + if v := toplevel.module.globals[i]; v != nil { + globals[id.Name] = v + } + } + + return err +} + +func makeToplevelFunction(prog *compile.Program, predeclared StringDict) *Function { + // Create the Starlark value denoted by each program constant c. + constants := make([]Value, len(prog.Constants)) + for i, c := range prog.Constants { + var v Value + switch c := c.(type) { + case int64: + v = MakeInt64(c) + case *big.Int: + v = MakeBigInt(c) + case string: + v = String(c) + case float64: + v = Float(c) + default: + log.Panicf("unexpected constant %T: %v", c, c) + } + constants[i] = v + } + + return &Function{ + funcode: prog.Toplevel, + module: &module{ + program: prog, + predeclared: predeclared, + globals: make([]Value, len(prog.Globals)), + constants: constants, + }, + } +} + +// Eval parses, resolves, and evaluates an expression within the +// specified (predeclared) environment. +// +// Evaluation cannot mutate the environment dictionary itself, +// though it may modify variables reachable from the dictionary. +// +// The filename and src parameters are as for syntax.Parse. +// +// If Eval fails during evaluation, it returns an *EvalError +// containing a backtrace. +func Eval(thread *Thread, filename string, src interface{}, env StringDict) (Value, error) { + expr, err := syntax.ParseExpr(filename, src, 0) + if err != nil { + return nil, err + } + f, err := makeExprFunc(expr, env) + if err != nil { + return nil, err + } + return Call(thread, f, nil, nil) +} + +// EvalExpr resolves and evaluates an expression within the +// specified (predeclared) environment. +// Evaluating a comma-separated list of expressions yields a tuple value. +// +// Resolving an expression mutates it. +// Do not call EvalExpr more than once for the same expression. +// +// Evaluation cannot mutate the environment dictionary itself, +// though it may modify variables reachable from the dictionary. +// +// If Eval fails during evaluation, it returns an *EvalError +// containing a backtrace. +func EvalExpr(thread *Thread, expr syntax.Expr, env StringDict) (Value, error) { + fn, err := makeExprFunc(expr, env) + if err != nil { + return nil, err + } + return Call(thread, fn, nil, nil) +} + +// ExprFunc returns a no-argument function +// that evaluates the expression whose source is src. +func ExprFunc(filename string, src interface{}, env StringDict) (*Function, error) { + expr, err := syntax.ParseExpr(filename, src, 0) + if err != nil { + return nil, err + } + return makeExprFunc(expr, env) +} + +// makeExprFunc returns a no-argument function whose body is expr. +func makeExprFunc(expr syntax.Expr, env StringDict) (*Function, error) { + locals, err := resolve.Expr(expr, env.Has, Universe.Has) + if err != nil { + return nil, err + } + + return makeToplevelFunction(compile.Expr(expr, "", locals), env), nil +} + +// The following functions are primitive operations of the byte code interpreter. + +// list += iterable +func listExtend(x *List, y Iterable) { + if ylist, ok := y.(*List); ok { + // fast path: list += list + x.elems = append(x.elems, ylist.elems...) + } else { + iter := y.Iterate() + defer iter.Done() + var z Value + for iter.Next(&z) { + x.elems = append(x.elems, z) + } + } +} + +// getAttr implements x.dot. +func getAttr(x Value, name string) (Value, error) { + hasAttr, ok := x.(HasAttrs) + if !ok { + return nil, fmt.Errorf("%s has no .%s field or method", x.Type(), name) + } + + var errmsg string + v, err := hasAttr.Attr(name) + if err == nil { + if v != nil { + return v, nil // success + } + // (nil, nil) => generic error + errmsg = fmt.Sprintf("%s has no .%s field or method", x.Type(), name) + } else if nsa, ok := err.(NoSuchAttrError); ok { + errmsg = string(nsa) + } else { + return nil, err // return error as is + } + + // add spelling hint + if n := spell.Nearest(name, hasAttr.AttrNames()); n != "" { + errmsg = fmt.Sprintf("%s (did you mean .%s?)", errmsg, n) + } + + return nil, fmt.Errorf("%s", errmsg) +} + +// setField implements x.name = y. +func setField(x Value, name string, y Value) error { + if x, ok := x.(HasSetField); ok { + err := x.SetField(name, y) + if _, ok := err.(NoSuchAttrError); ok { + // No such field: check spelling. + if n := spell.Nearest(name, x.AttrNames()); n != "" { + err = fmt.Errorf("%s (did you mean .%s?)", err, n) + } + } + return err + } + + return fmt.Errorf("can't assign to .%s field of %s", name, x.Type()) +} + +// getIndex implements x[y]. +func getIndex(x, y Value) (Value, error) { + switch x := x.(type) { + case Mapping: // dict + z, found, err := x.Get(y) + if err != nil { + return nil, err + } + if !found { + return nil, fmt.Errorf("key %v not in %s", y, x.Type()) + } + return z, nil + + case Indexable: // string, list, tuple + n := x.Len() + i, err := AsInt32(y) + if err != nil { + return nil, fmt.Errorf("%s index: %s", x.Type(), err) + } + origI := i + if i < 0 { + i += n + } + if i < 0 || i >= n { + return nil, outOfRange(origI, n, x) + } + return x.Index(i), nil + } + return nil, fmt.Errorf("unhandled index operation %s[%s]", x.Type(), y.Type()) +} + +func outOfRange(i, n int, x Value) error { + if n == 0 { + return fmt.Errorf("index %d out of range: empty %s", i, x.Type()) + } else { + return fmt.Errorf("%s index %d out of range [%d:%d]", x.Type(), i, -n, n-1) + } +} + +// setIndex implements x[y] = z. +func setIndex(x, y, z Value) error { + switch x := x.(type) { + case HasSetKey: + if err := x.SetKey(y, z); err != nil { + return err + } + + case HasSetIndex: + n := x.Len() + i, err := AsInt32(y) + if err != nil { + return err + } + origI := i + if i < 0 { + i += n + } + if i < 0 || i >= n { + return outOfRange(origI, n, x) + } + return x.SetIndex(i, z) + + default: + return fmt.Errorf("%s value does not support item assignment", x.Type()) + } + return nil +} + +// Unary applies a unary operator (+, -, ~, not) to its operand. +func Unary(op syntax.Token, x Value) (Value, error) { + // The NOT operator is not customizable. + if op == syntax.NOT { + return !x.Truth(), nil + } + + // Int, Float, and user-defined types + if x, ok := x.(HasUnary); ok { + // (nil, nil) => unhandled + y, err := x.Unary(op) + if y != nil || err != nil { + return y, err + } + } + + return nil, fmt.Errorf("unknown unary op: %s %s", op, x.Type()) +} + +// Binary applies a strict binary operator (not AND or OR) to its operands. +// For equality tests or ordered comparisons, use Compare instead. +func Binary(op syntax.Token, x, y Value) (Value, error) { + switch op { + case syntax.PLUS: + switch x := x.(type) { + case String: + if y, ok := y.(String); ok { + return x + y, nil + } + case Int: + switch y := y.(type) { + case Int: + return x.Add(y), nil + case Float: + return x.Float() + y, nil + } + case Float: + switch y := y.(type) { + case Float: + return x + y, nil + case Int: + return x + y.Float(), nil + } + case *List: + if y, ok := y.(*List); ok { + z := make([]Value, 0, x.Len()+y.Len()) + z = append(z, x.elems...) + z = append(z, y.elems...) + return NewList(z), nil + } + case Tuple: + if y, ok := y.(Tuple); ok { + z := make(Tuple, 0, len(x)+len(y)) + z = append(z, x...) + z = append(z, y...) + return z, nil + } + } + + case syntax.MINUS: + switch x := x.(type) { + case Int: + switch y := y.(type) { + case Int: + return x.Sub(y), nil + case Float: + return x.Float() - y, nil + } + case Float: + switch y := y.(type) { + case Float: + return x - y, nil + case Int: + return x - y.Float(), nil + } + } + + case syntax.STAR: + switch x := x.(type) { + case Int: + switch y := y.(type) { + case Int: + return x.Mul(y), nil + case Float: + return x.Float() * y, nil + case String: + return stringRepeat(y, x) + case *List: + elems, err := tupleRepeat(Tuple(y.elems), x) + if err != nil { + return nil, err + } + return NewList(elems), nil + case Tuple: + return tupleRepeat(y, x) + } + case Float: + switch y := y.(type) { + case Float: + return x * y, nil + case Int: + return x * y.Float(), nil + } + case String: + if y, ok := y.(Int); ok { + return stringRepeat(x, y) + } + case *List: + if y, ok := y.(Int); ok { + elems, err := tupleRepeat(Tuple(x.elems), y) + if err != nil { + return nil, err + } + return NewList(elems), nil + } + case Tuple: + if y, ok := y.(Int); ok { + return tupleRepeat(x, y) + } + + } + + case syntax.SLASH: + switch x := x.(type) { + case Int: + switch y := y.(type) { + case Int: + yf := y.Float() + if yf == 0.0 { + return nil, fmt.Errorf("real division by zero") + } + return x.Float() / yf, nil + case Float: + if y == 0.0 { + return nil, fmt.Errorf("real division by zero") + } + return x.Float() / y, nil + } + case Float: + switch y := y.(type) { + case Float: + if y == 0.0 { + return nil, fmt.Errorf("real division by zero") + } + return x / y, nil + case Int: + yf := y.Float() + if yf == 0.0 { + return nil, fmt.Errorf("real division by zero") + } + return x / yf, nil + } + } + + case syntax.SLASHSLASH: + switch x := x.(type) { + case Int: + switch y := y.(type) { + case Int: + if y.Sign() == 0 { + return nil, fmt.Errorf("floored division by zero") + } + return x.Div(y), nil + case Float: + if y == 0.0 { + return nil, fmt.Errorf("floored division by zero") + } + return floor((x.Float() / y)), nil + } + case Float: + switch y := y.(type) { + case Float: + if y == 0.0 { + return nil, fmt.Errorf("floored division by zero") + } + return floor(x / y), nil + case Int: + yf := y.Float() + if yf == 0.0 { + return nil, fmt.Errorf("floored division by zero") + } + return floor(x / yf), nil + } + } + + case syntax.PERCENT: + switch x := x.(type) { + case Int: + switch y := y.(type) { + case Int: + if y.Sign() == 0 { + return nil, fmt.Errorf("integer modulo by zero") + } + return x.Mod(y), nil + case Float: + if y == 0 { + return nil, fmt.Errorf("float modulo by zero") + } + return x.Float().Mod(y), nil + } + case Float: + switch y := y.(type) { + case Float: + if y == 0.0 { + return nil, fmt.Errorf("float modulo by zero") + } + return Float(math.Mod(float64(x), float64(y))), nil + case Int: + if y.Sign() == 0 { + return nil, fmt.Errorf("float modulo by zero") + } + return x.Mod(y.Float()), nil + } + case String: + return interpolate(string(x), y) + } + + case syntax.NOT_IN: + z, err := Binary(syntax.IN, x, y) + if err != nil { + return nil, err + } + return !z.Truth(), nil + + case syntax.IN: + switch y := y.(type) { + case *List: + for _, elem := range y.elems { + if eq, err := Equal(elem, x); err != nil { + return nil, err + } else if eq { + return True, nil + } + } + return False, nil + case Tuple: + for _, elem := range y { + if eq, err := Equal(elem, x); err != nil { + return nil, err + } else if eq { + return True, nil + } + } + return False, nil + case Mapping: // e.g. dict + // Ignore error from Get as we cannot distinguish true + // errors (value cycle, type error) from "key not found". + _, found, _ := y.Get(x) + return Bool(found), nil + case *Set: + ok, err := y.Has(x) + return Bool(ok), err + case String: + needle, ok := x.(String) + if !ok { + return nil, fmt.Errorf("'in ' requires string as left operand, not %s", x.Type()) + } + return Bool(strings.Contains(string(y), string(needle))), nil + case rangeValue: + i, err := NumberToInt(x) + if err != nil { + return nil, fmt.Errorf("'in ' requires integer as left operand, not %s", x.Type()) + } + return Bool(y.contains(i)), nil + } + + case syntax.PIPE: + switch x := x.(type) { + case Int: + if y, ok := y.(Int); ok { + return x.Or(y), nil + } + case *Set: // union + if y, ok := y.(*Set); ok { + iter := Iterate(y) + defer iter.Done() + return x.Union(iter) + } + } + + case syntax.AMP: + switch x := x.(type) { + case Int: + if y, ok := y.(Int); ok { + return x.And(y), nil + } + case *Set: // intersection + if y, ok := y.(*Set); ok { + set := new(Set) + if x.Len() > y.Len() { + x, y = y, x // opt: range over smaller set + } + for _, xelem := range x.elems() { + // Has, Insert cannot fail here. + if found, _ := y.Has(xelem); found { + set.Insert(xelem) + } + } + return set, nil + } + } + + case syntax.CIRCUMFLEX: + switch x := x.(type) { + case Int: + if y, ok := y.(Int); ok { + return x.Xor(y), nil + } + case *Set: // symmetric difference + if y, ok := y.(*Set); ok { + set := new(Set) + for _, xelem := range x.elems() { + if found, _ := y.Has(xelem); !found { + set.Insert(xelem) + } + } + for _, yelem := range y.elems() { + if found, _ := x.Has(yelem); !found { + set.Insert(yelem) + } + } + return set, nil + } + } + + case syntax.LTLT, syntax.GTGT: + if x, ok := x.(Int); ok { + y, err := AsInt32(y) + if err != nil { + return nil, err + } + if y < 0 { + return nil, fmt.Errorf("negative shift count: %v", y) + } + if op == syntax.LTLT { + if y >= 512 { + return nil, fmt.Errorf("shift count too large: %v", y) + } + return x.Lsh(uint(y)), nil + } else { + return x.Rsh(uint(y)), nil + } + } + + default: + // unknown operator + goto unknown + } + + // user-defined types + // (nil, nil) => unhandled + if x, ok := x.(HasBinary); ok { + z, err := x.Binary(op, y, Left) + if z != nil || err != nil { + return z, err + } + } + if y, ok := y.(HasBinary); ok { + z, err := y.Binary(op, x, Right) + if z != nil || err != nil { + return z, err + } + } + + // unsupported operand types +unknown: + return nil, fmt.Errorf("unknown binary op: %s %s %s", x.Type(), op, y.Type()) +} + +// It's always possible to overeat in small bites but we'll +// try to stop someone swallowing the world in one gulp. +const maxAlloc = 1 << 30 + +func tupleRepeat(elems Tuple, n Int) (Tuple, error) { + if len(elems) == 0 { + return nil, nil + } + i, err := AsInt32(n) + if err != nil { + return nil, fmt.Errorf("repeat count %s too large", n) + } + if i < 1 { + return nil, nil + } + // Inv: i > 0, len > 0 + sz := len(elems) * i + if sz < 0 || sz >= maxAlloc { // sz < 0 => overflow + return nil, fmt.Errorf("excessive repeat (%d elements)", sz) + } + res := make([]Value, sz) + // copy elems into res, doubling each time + x := copy(res, elems) + for x < len(res) { + copy(res[x:], res[:x]) + x *= 2 + } + return res, nil +} + +func stringRepeat(s String, n Int) (String, error) { + if s == "" { + return "", nil + } + i, err := AsInt32(n) + if err != nil { + return "", fmt.Errorf("repeat count %s too large", n) + } + if i < 1 { + return "", nil + } + // Inv: i > 0, len > 0 + sz := len(s) * i + if sz < 0 || sz >= maxAlloc { // sz < 0 => overflow + return "", fmt.Errorf("excessive repeat (%d elements)", sz) + } + return String(strings.Repeat(string(s), i)), nil +} + +// Call calls the function fn with the specified positional and keyword arguments. +func Call(thread *Thread, fn Value, args Tuple, kwargs []Tuple) (Value, error) { + c, ok := fn.(Callable) + if !ok { + return nil, fmt.Errorf("invalid call of non-function (%s)", fn.Type()) + } + + // Allocate and push a new frame. + var fr *frame + // Optimization: use slack portion of thread.stack + // slice as a freelist of empty frames. + if n := len(thread.stack); n < cap(thread.stack) { + fr = thread.stack[n : n+1][0] + } + if fr == nil { + fr = new(frame) + } + thread.stack = append(thread.stack, fr) // push + + fr.callable = c + + thread.beginProfSpan() + result, err := c.CallInternal(thread, args, kwargs) + thread.endProfSpan() + + // Sanity check: nil is not a valid Starlark value. + if result == nil && err == nil { + err = fmt.Errorf("internal error: nil (not None) returned from %s", fn) + } + + // Always return an EvalError with an accurate frame. + if err != nil { + if _, ok := err.(*EvalError); !ok { + err = thread.evalError(err) + } + } + + *fr = frame{} // clear out any references + thread.stack = thread.stack[:len(thread.stack)-1] // pop + + return result, err +} + +func slice(x, lo, hi, step_ Value) (Value, error) { + sliceable, ok := x.(Sliceable) + if !ok { + return nil, fmt.Errorf("invalid slice operand %s", x.Type()) + } + + n := sliceable.Len() + step := 1 + if step_ != None { + var err error + step, err = AsInt32(step_) + if err != nil { + return nil, fmt.Errorf("got %s for slice step, want int", step_.Type()) + } + if step == 0 { + return nil, fmt.Errorf("zero is not a valid slice step") + } + } + + // TODO(adonovan): opt: preallocate result array. + + var start, end int + if step > 0 { + // positive stride + // default indices are [0:n]. + var err error + start, end, err = indices(lo, hi, n) + if err != nil { + return nil, err + } + + if end < start { + end = start // => empty result + } + } else { + // negative stride + // default indices are effectively [n-1:-1], though to + // get this effect using explicit indices requires + // [n-1:-1-n:-1] because of the treatment of -ve values. + start = n - 1 + if err := asIndex(lo, n, &start); err != nil { + return nil, fmt.Errorf("invalid start index: %s", err) + } + if start >= n { + start = n - 1 + } + + end = -1 + if err := asIndex(hi, n, &end); err != nil { + return nil, fmt.Errorf("invalid end index: %s", err) + } + if end < -1 { + end = -1 + } + + if start < end { + start = end // => empty result + } + } + + return sliceable.Slice(start, end, step), nil +} + +// From Hacker's Delight, section 2.8. +func signum64(x int64) int { return int(uint64(x>>63) | uint64(-x)>>63) } +func signum(x int) int { return signum64(int64(x)) } + +// indices converts start_ and end_ to indices in the range [0:len]. +// The start index defaults to 0 and the end index defaults to len. +// An index -len < i < 0 is treated like i+len. +// All other indices outside the range are clamped to the nearest value in the range. +// Beware: start may be greater than end. +// This function is suitable only for slices with positive strides. +func indices(start_, end_ Value, len int) (start, end int, err error) { + start = 0 + if err := asIndex(start_, len, &start); err != nil { + return 0, 0, fmt.Errorf("invalid start index: %s", err) + } + // Clamp to [0:len]. + if start < 0 { + start = 0 + } else if start > len { + start = len + } + + end = len + if err := asIndex(end_, len, &end); err != nil { + return 0, 0, fmt.Errorf("invalid end index: %s", err) + } + // Clamp to [0:len]. + if end < 0 { + end = 0 + } else if end > len { + end = len + } + + return start, end, nil +} + +// asIndex sets *result to the integer value of v, adding len to it +// if it is negative. If v is nil or None, *result is unchanged. +func asIndex(v Value, len int, result *int) error { + if v != nil && v != None { + var err error + *result, err = AsInt32(v) + if err != nil { + return fmt.Errorf("got %s, want int", v.Type()) + } + if *result < 0 { + *result += len + } + } + return nil +} + +// setArgs sets the values of the formal parameters of function fn in +// based on the actual parameter values in args and kwargs. +func setArgs(locals []Value, fn *Function, args Tuple, kwargs []Tuple) error { + + // This is the general schema of a function: + // + // def f(p1, p2=dp2, p3=dp3, *args, k1, k2=dk2, k3, **kwargs) + // + // The p parameters are non-kwonly, and may be specified positionally. + // The k parameters are kwonly, and must be specified by name. + // The defaults tuple is (dp2, dp3, mandatory, dk2, mandatory). + // + // Arguments are processed as follows: + // - positional arguments are bound to a prefix of [p1, p2, p3]. + // - surplus positional arguments are bound to *args. + // - keyword arguments are bound to any of {p1, p2, p3, k1, k2, k3}; + // duplicate bindings are rejected. + // - surplus keyword arguments are bound to **kwargs. + // - defaults are bound to each parameter from p2 to k3 if no value was set. + // default values come from the tuple above. + // It is an error if the tuple entry for an unset parameter is 'mandatory'. + + // Nullary function? + if fn.NumParams() == 0 { + if nactual := len(args) + len(kwargs); nactual > 0 { + return fmt.Errorf("function %s accepts no arguments (%d given)", fn.Name(), nactual) + } + return nil + } + + cond := func(x bool, y, z interface{}) interface{} { + if x { + return y + } + return z + } + + // nparams is the number of ordinary parameters (sans *args and **kwargs). + nparams := fn.NumParams() + var kwdict *Dict + if fn.HasKwargs() { + nparams-- + kwdict = new(Dict) + locals[nparams] = kwdict + } + if fn.HasVarargs() { + nparams-- + } + + // nonkwonly is the number of non-kwonly parameters. + nonkwonly := nparams - fn.NumKwonlyParams() + + // Too many positional args? + n := len(args) + if len(args) > nonkwonly { + if !fn.HasVarargs() { + return fmt.Errorf("function %s accepts %s%d positional argument%s (%d given)", + fn.Name(), + cond(len(fn.defaults) > fn.NumKwonlyParams(), "at most ", ""), + nonkwonly, + cond(nonkwonly == 1, "", "s"), + len(args)) + } + n = nonkwonly + } + + // Bind positional arguments to non-kwonly parameters. + for i := 0; i < n; i++ { + locals[i] = args[i] + } + + // Bind surplus positional arguments to *args parameter. + if fn.HasVarargs() { + tuple := make(Tuple, len(args)-n) + for i := n; i < len(args); i++ { + tuple[i-n] = args[i] + } + locals[nparams] = tuple + } + + // Bind keyword arguments to parameters. + paramIdents := fn.funcode.Locals[:nparams] + for _, pair := range kwargs { + k, v := pair[0].(String), pair[1] + if i := findParam(paramIdents, string(k)); i >= 0 { + if locals[i] != nil { + return fmt.Errorf("function %s got multiple values for parameter %s", fn.Name(), k) + } + locals[i] = v + continue + } + if kwdict == nil { + return fmt.Errorf("function %s got an unexpected keyword argument %s", fn.Name(), k) + } + oldlen := kwdict.Len() + kwdict.SetKey(k, v) + if kwdict.Len() == oldlen { + return fmt.Errorf("function %s got multiple values for parameter %s", fn.Name(), k) + } + } + + // Are defaults required? + if n < nparams || fn.NumKwonlyParams() > 0 { + m := nparams - len(fn.defaults) // first default + + // Report errors for missing required arguments. + var missing []string + var i int + for i = n; i < m; i++ { + if locals[i] == nil { + missing = append(missing, paramIdents[i].Name) + } + } + + // Bind default values to parameters. + for ; i < nparams; i++ { + if locals[i] == nil { + dflt := fn.defaults[i-m] + if _, ok := dflt.(mandatory); ok { + missing = append(missing, paramIdents[i].Name) + continue + } + locals[i] = dflt + } + } + + if missing != nil { + return fmt.Errorf("function %s missing %d argument%s (%s)", + fn.Name(), len(missing), cond(len(missing) > 1, "s", ""), strings.Join(missing, ", ")) + } + } + return nil +} + +func findParam(params []compile.Binding, name string) int { + for i, param := range params { + if param.Name == name { + return i + } + } + return -1 +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#string-interpolation +func interpolate(format string, x Value) (Value, error) { + buf := new(strings.Builder) + index := 0 + nargs := 1 + if tuple, ok := x.(Tuple); ok { + nargs = len(tuple) + } + for { + i := strings.IndexByte(format, '%') + if i < 0 { + buf.WriteString(format) + break + } + buf.WriteString(format[:i]) + format = format[i+1:] + + if format != "" && format[0] == '%' { + buf.WriteByte('%') + format = format[1:] + continue + } + + var arg Value + if format != "" && format[0] == '(' { + // keyword argument: %(name)s. + format = format[1:] + j := strings.IndexByte(format, ')') + if j < 0 { + return nil, fmt.Errorf("incomplete format key") + } + key := format[:j] + if dict, ok := x.(Mapping); !ok { + return nil, fmt.Errorf("format requires a mapping") + } else if v, found, _ := dict.Get(String(key)); found { + arg = v + } else { + return nil, fmt.Errorf("key not found: %s", key) + } + format = format[j+1:] + } else { + // positional argument: %s. + if index >= nargs { + return nil, fmt.Errorf("not enough arguments for format string") + } + if tuple, ok := x.(Tuple); ok { + arg = tuple[index] + } else { + arg = x + } + } + + // NOTE: Starlark does not support any of these optional Python features: + // - optional conversion flags: [#0- +], etc. + // - optional minimum field width (number or *). + // - optional precision (.123 or *) + // - optional length modifier + + // conversion type + if format == "" { + return nil, fmt.Errorf("incomplete format") + } + switch c := format[0]; c { + case 's', 'r': + if str, ok := AsString(arg); ok && c == 's' { + buf.WriteString(str) + } else { + writeValue(buf, arg, nil) + } + case 'd', 'i', 'o', 'x', 'X': + i, err := NumberToInt(arg) + if err != nil { + return nil, fmt.Errorf("%%%c format requires integer: %v", c, err) + } + switch c { + case 'd', 'i': + fmt.Fprintf(buf, "%d", i) + case 'o': + fmt.Fprintf(buf, "%o", i) + case 'x': + fmt.Fprintf(buf, "%x", i) + case 'X': + fmt.Fprintf(buf, "%X", i) + } + case 'e', 'f', 'g', 'E', 'F', 'G': + f, ok := AsFloat(arg) + if !ok { + return nil, fmt.Errorf("%%%c format requires float, not %s", c, arg.Type()) + } + switch c { + case 'e': + fmt.Fprintf(buf, "%e", f) + case 'f': + fmt.Fprintf(buf, "%f", f) + case 'g': + fmt.Fprintf(buf, "%g", f) + case 'E': + fmt.Fprintf(buf, "%E", f) + case 'F': + fmt.Fprintf(buf, "%F", f) + case 'G': + fmt.Fprintf(buf, "%G", f) + } + case 'c': + switch arg := arg.(type) { + case Int: + // chr(int) + r, err := AsInt32(arg) + if err != nil || r < 0 || r > unicode.MaxRune { + return nil, fmt.Errorf("%%c format requires a valid Unicode code point, got %s", arg) + } + buf.WriteRune(rune(r)) + case String: + r, size := utf8.DecodeRuneInString(string(arg)) + if size != len(arg) || len(arg) == 0 { + return nil, fmt.Errorf("%%c format requires a single-character string") + } + buf.WriteRune(r) + default: + return nil, fmt.Errorf("%%c format requires int or single-character string, not %s", arg.Type()) + } + case '%': + buf.WriteByte('%') + default: + return nil, fmt.Errorf("unknown conversion %%%c", c) + } + format = format[1:] + index++ + } + + if index < nargs { + return nil, fmt.Errorf("too many arguments for format string") + } + + return String(buf.String()), nil +} diff --git a/vendor/go.starlark.net/starlark/hashtable.go b/vendor/go.starlark.net/starlark/hashtable.go new file mode 100644 index 000000000000..d4250194ab61 --- /dev/null +++ b/vendor/go.starlark.net/starlark/hashtable.go @@ -0,0 +1,373 @@ +// Copyright 2017 The Bazel Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package starlark + +import ( + "fmt" + _ "unsafe" // for go:linkname hack +) + +// hashtable is used to represent Starlark dict and set values. +// It is a hash table whose key/value entries form a doubly-linked list +// in the order the entries were inserted. +type hashtable struct { + table []bucket // len is zero or a power of two + bucket0 [1]bucket // inline allocation for small maps. + len uint32 + itercount uint32 // number of active iterators (ignored if frozen) + head *entry // insertion order doubly-linked list; may be nil + tailLink **entry // address of nil link at end of list (perhaps &head) + frozen bool +} + +const bucketSize = 8 + +type bucket struct { + entries [bucketSize]entry + next *bucket // linked list of buckets +} + +type entry struct { + hash uint32 // nonzero => in use + key, value Value + next *entry // insertion order doubly-linked list; may be nil + prevLink **entry // address of link to this entry (perhaps &head) +} + +func (ht *hashtable) init(size int) { + if size < 0 { + panic("size < 0") + } + nb := 1 + for overloaded(size, nb) { + nb = nb << 1 + } + if nb < 2 { + ht.table = ht.bucket0[:1] + } else { + ht.table = make([]bucket, nb) + } + ht.tailLink = &ht.head +} + +func (ht *hashtable) freeze() { + if !ht.frozen { + ht.frozen = true + for i := range ht.table { + for p := &ht.table[i]; p != nil; p = p.next { + for i := range p.entries { + e := &p.entries[i] + if e.hash != 0 { + e.key.Freeze() + e.value.Freeze() + } + } + } + } + } +} + +func (ht *hashtable) insert(k, v Value) error { + if ht.frozen { + return fmt.Errorf("cannot insert into frozen hash table") + } + if ht.itercount > 0 { + return fmt.Errorf("cannot insert into hash table during iteration") + } + if ht.table == nil { + ht.init(1) + } + h, err := k.Hash() + if err != nil { + return err + } + if h == 0 { + h = 1 // zero is reserved + } + +retry: + var insert *entry + + // Inspect each bucket in the bucket list. + p := &ht.table[h&(uint32(len(ht.table)-1))] + for { + for i := range p.entries { + e := &p.entries[i] + if e.hash != h { + if e.hash == 0 { + // Found empty entry; make a note. + insert = e + } + continue + } + if eq, err := Equal(k, e.key); err != nil { + return err // e.g. excessively recursive tuple + } else if !eq { + continue + } + // Key already present; update value. + e.value = v + return nil + } + if p.next == nil { + break + } + p = p.next + } + + // Key not found. p points to the last bucket. + + // Does the number of elements exceed the buckets' load factor? + if overloaded(int(ht.len), len(ht.table)) { + ht.grow() + goto retry + } + + if insert == nil { + // No space in existing buckets. Add a new one to the bucket list. + b := new(bucket) + p.next = b + insert = &b.entries[0] + } + + // Insert key/value pair. + insert.hash = h + insert.key = k + insert.value = v + + // Append entry to doubly-linked list. + insert.prevLink = ht.tailLink + *ht.tailLink = insert + ht.tailLink = &insert.next + + ht.len++ + + return nil +} + +func overloaded(elems, buckets int) bool { + const loadFactor = 6.5 // just a guess + return elems >= bucketSize && float64(elems) >= loadFactor*float64(buckets) +} + +func (ht *hashtable) grow() { + // Double the number of buckets and rehash. + // TODO(adonovan): opt: + // - avoid reentrant calls to ht.insert, and specialize it. + // e.g. we know the calls to Equals will return false since + // there are no duplicates among the old keys. + // - saving the entire hash in the bucket would avoid the need to + // recompute the hash. + // - save the old buckets on a free list. + ht.table = make([]bucket, len(ht.table)<<1) + oldhead := ht.head + ht.head = nil + ht.tailLink = &ht.head + ht.len = 0 + for e := oldhead; e != nil; e = e.next { + ht.insert(e.key, e.value) + } + ht.bucket0[0] = bucket{} // clear out unused initial bucket +} + +func (ht *hashtable) lookup(k Value) (v Value, found bool, err error) { + h, err := k.Hash() + if err != nil { + return nil, false, err // unhashable + } + if h == 0 { + h = 1 // zero is reserved + } + if ht.table == nil { + return None, false, nil // empty + } + + // Inspect each bucket in the bucket list. + for p := &ht.table[h&(uint32(len(ht.table)-1))]; p != nil; p = p.next { + for i := range p.entries { + e := &p.entries[i] + if e.hash == h { + if eq, err := Equal(k, e.key); err != nil { + return nil, false, err // e.g. excessively recursive tuple + } else if eq { + return e.value, true, nil // found + } + } + } + } + return None, false, nil // not found +} + +// Items returns all the items in the map (as key/value pairs) in insertion order. +func (ht *hashtable) items() []Tuple { + items := make([]Tuple, 0, ht.len) + array := make([]Value, ht.len*2) // allocate a single backing array + for e := ht.head; e != nil; e = e.next { + pair := Tuple(array[:2:2]) + array = array[2:] + pair[0] = e.key + pair[1] = e.value + items = append(items, pair) + } + return items +} + +func (ht *hashtable) first() (Value, bool) { + if ht.head != nil { + return ht.head.key, true + } + return None, false +} + +func (ht *hashtable) keys() []Value { + keys := make([]Value, 0, ht.len) + for e := ht.head; e != nil; e = e.next { + keys = append(keys, e.key) + } + return keys +} + +func (ht *hashtable) delete(k Value) (v Value, found bool, err error) { + if ht.frozen { + return nil, false, fmt.Errorf("cannot delete from frozen hash table") + } + if ht.itercount > 0 { + return nil, false, fmt.Errorf("cannot delete from hash table during iteration") + } + if ht.table == nil { + return None, false, nil // empty + } + h, err := k.Hash() + if err != nil { + return nil, false, err // unhashable + } + if h == 0 { + h = 1 // zero is reserved + } + + // Inspect each bucket in the bucket list. + for p := &ht.table[h&(uint32(len(ht.table)-1))]; p != nil; p = p.next { + for i := range p.entries { + e := &p.entries[i] + if e.hash == h { + if eq, err := Equal(k, e.key); err != nil { + return nil, false, err + } else if eq { + // Remove e from doubly-linked list. + *e.prevLink = e.next + if e.next == nil { + ht.tailLink = e.prevLink // deletion of last entry + } else { + e.next.prevLink = e.prevLink + } + + v := e.value + *e = entry{} + ht.len-- + return v, true, nil // found + } + } + } + } + + // TODO(adonovan): opt: remove completely empty bucket from bucket list. + + return None, false, nil // not found +} + +func (ht *hashtable) clear() error { + if ht.frozen { + return fmt.Errorf("cannot clear frozen hash table") + } + if ht.itercount > 0 { + return fmt.Errorf("cannot clear hash table during iteration") + } + if ht.table != nil { + for i := range ht.table { + ht.table[i] = bucket{} + } + } + ht.head = nil + ht.tailLink = &ht.head + ht.len = 0 + return nil +} + +// dump is provided as an aid to debugging. +func (ht *hashtable) dump() { + fmt.Printf("hashtable %p len=%d head=%p tailLink=%p", + ht, ht.len, ht.head, ht.tailLink) + if ht.tailLink != nil { + fmt.Printf(" *tailLink=%p", *ht.tailLink) + } + fmt.Println() + for j := range ht.table { + fmt.Printf("bucket chain %d\n", j) + for p := &ht.table[j]; p != nil; p = p.next { + fmt.Printf("bucket %p\n", p) + for i := range p.entries { + e := &p.entries[i] + fmt.Printf("\tentry %d @ %p hash=%d key=%v value=%v\n", + i, e, e.hash, e.key, e.value) + fmt.Printf("\t\tnext=%p &next=%p prev=%p", + e.next, &e.next, e.prevLink) + if e.prevLink != nil { + fmt.Printf(" *prev=%p", *e.prevLink) + } + fmt.Println() + } + } + } +} + +func (ht *hashtable) iterate() *keyIterator { + if !ht.frozen { + ht.itercount++ + } + return &keyIterator{ht: ht, e: ht.head} +} + +type keyIterator struct { + ht *hashtable + e *entry +} + +func (it *keyIterator) Next(k *Value) bool { + if it.e != nil { + *k = it.e.key + it.e = it.e.next + return true + } + return false +} + +func (it *keyIterator) Done() { + if !it.ht.frozen { + it.ht.itercount-- + } +} + +// hashString computes the hash of s. +func hashString(s string) uint32 { + if len(s) >= 12 { + // Call the Go runtime's optimized hash implementation, + // which uses the AESENC instruction on amd64 machines. + return uint32(goStringHash(s, 0)) + } + return softHashString(s) +} + +//go:linkname goStringHash runtime.stringHash +func goStringHash(s string, seed uintptr) uintptr + +// softHashString computes the FNV hash of s in software. +func softHashString(s string) uint32 { + var h uint32 + for i := 0; i < len(s); i++ { + h ^= uint32(s[i]) + h *= 16777619 + } + return h +} diff --git a/vendor/go.starlark.net/starlark/int.go b/vendor/go.starlark.net/starlark/int.go new file mode 100644 index 000000000000..35bd42b3ff1d --- /dev/null +++ b/vendor/go.starlark.net/starlark/int.go @@ -0,0 +1,350 @@ +// Copyright 2017 The Bazel Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package starlark + +import ( + "fmt" + "math" + "math/big" + "strconv" + + "go.starlark.net/syntax" +) + +// Int is the type of a Starlark int. +type Int struct { + // We use only the signed 32 bit range of small to ensure + // that small+small and small*small do not overflow. + + small int64 // minint32 <= small <= maxint32 + big *big.Int // big != nil <=> value is not representable as int32 +} + +// newBig allocates a new big.Int. +func newBig(x int64) *big.Int { + if 0 <= x && int64(big.Word(x)) == x { + // x is guaranteed to fit into a single big.Word. + // Most starlark ints are small, + // but math/big assumes that since you've chosen to use math/big, + // your big.Ints will probably grow, so it over-allocates. + // Avoid that over-allocation by manually constructing a single-word slice. + // See https://golang.org/cl/150999, which will hopefully land in Go 1.13. + return new(big.Int).SetBits([]big.Word{big.Word(x)}) + } + return big.NewInt(x) +} + +// MakeInt returns a Starlark int for the specified signed integer. +func MakeInt(x int) Int { return MakeInt64(int64(x)) } + +// MakeInt64 returns a Starlark int for the specified int64. +func MakeInt64(x int64) Int { + if math.MinInt32 <= x && x <= math.MaxInt32 { + return Int{small: x} + } + return Int{big: newBig(x)} +} + +// MakeUint returns a Starlark int for the specified unsigned integer. +func MakeUint(x uint) Int { return MakeUint64(uint64(x)) } + +// MakeUint64 returns a Starlark int for the specified uint64. +func MakeUint64(x uint64) Int { + if x <= math.MaxInt32 { + return Int{small: int64(x)} + } + if uint64(big.Word(x)) == x { + // See comment in newBig for an explanation of this optimization. + return Int{big: new(big.Int).SetBits([]big.Word{big.Word(x)})} + } + return Int{big: new(big.Int).SetUint64(x)} +} + +// MakeBigInt returns a Starlark int for the specified big.Int. +// The caller must not subsequently modify x. +func MakeBigInt(x *big.Int) Int { + if n := x.BitLen(); n < 32 || n == 32 && x.Int64() == math.MinInt32 { + return Int{small: x.Int64()} + } + return Int{big: x} +} + +var ( + zero, one = Int{small: 0}, Int{small: 1} + oneBig = newBig(1) + + _ HasUnary = Int{} +) + +// Unary implements the operations +int, -int, and ~int. +func (i Int) Unary(op syntax.Token) (Value, error) { + switch op { + case syntax.MINUS: + return zero.Sub(i), nil + case syntax.PLUS: + return i, nil + case syntax.TILDE: + return i.Not(), nil + } + return nil, nil +} + +// Int64 returns the value as an int64. +// If it is not exactly representable the result is undefined and ok is false. +func (i Int) Int64() (_ int64, ok bool) { + if i.big != nil { + x, acc := bigintToInt64(i.big) + if acc != big.Exact { + return // inexact + } + return x, true + } + return i.small, true +} + +// BigInt returns the value as a big.Int. +// The returned variable must not be modified by the client. +func (i Int) BigInt() *big.Int { + if i.big != nil { + return i.big + } + return newBig(i.small) +} + +// Uint64 returns the value as a uint64. +// If it is not exactly representable the result is undefined and ok is false. +func (i Int) Uint64() (_ uint64, ok bool) { + if i.big != nil { + x, acc := bigintToUint64(i.big) + if acc != big.Exact { + return // inexact + } + return x, true + } + if i.small < 0 { + return // inexact + } + return uint64(i.small), true +} + +// The math/big API should provide this function. +func bigintToInt64(i *big.Int) (int64, big.Accuracy) { + sign := i.Sign() + if sign > 0 { + if i.Cmp(maxint64) > 0 { + return math.MaxInt64, big.Below + } + } else if sign < 0 { + if i.Cmp(minint64) < 0 { + return math.MinInt64, big.Above + } + } + return i.Int64(), big.Exact +} + +// The math/big API should provide this function. +func bigintToUint64(i *big.Int) (uint64, big.Accuracy) { + sign := i.Sign() + if sign > 0 { + if i.BitLen() > 64 { + return math.MaxUint64, big.Below + } + } else if sign < 0 { + return 0, big.Above + } + return i.Uint64(), big.Exact +} + +var ( + minint64 = new(big.Int).SetInt64(math.MinInt64) + maxint64 = new(big.Int).SetInt64(math.MaxInt64) +) + +func (i Int) Format(s fmt.State, ch rune) { + if i.big != nil { + i.big.Format(s, ch) + return + } + newBig(i.small).Format(s, ch) +} +func (i Int) String() string { + if i.big != nil { + return i.big.Text(10) + } + return strconv.FormatInt(i.small, 10) +} +func (i Int) Type() string { return "int" } +func (i Int) Freeze() {} // immutable +func (i Int) Truth() Bool { return i.Sign() != 0 } +func (i Int) Hash() (uint32, error) { + var lo big.Word + if i.big != nil { + lo = i.big.Bits()[0] + } else { + lo = big.Word(i.small) + } + return 12582917 * uint32(lo+3), nil +} +func (x Int) CompareSameType(op syntax.Token, v Value, depth int) (bool, error) { + y := v.(Int) + if x.big != nil || y.big != nil { + return threeway(op, x.BigInt().Cmp(y.BigInt())), nil + } + return threeway(op, signum64(x.small-y.small)), nil +} + +// Float returns the float value nearest i. +func (i Int) Float() Float { + if i.big != nil { + f, _ := new(big.Float).SetInt(i.big).Float64() + return Float(f) + } + return Float(i.small) +} + +func (x Int) Sign() int { + if x.big != nil { + return x.big.Sign() + } + return signum64(x.small) +} + +func (x Int) Add(y Int) Int { + if x.big != nil || y.big != nil { + return MakeBigInt(new(big.Int).Add(x.BigInt(), y.BigInt())) + } + return MakeInt64(x.small + y.small) +} +func (x Int) Sub(y Int) Int { + if x.big != nil || y.big != nil { + return MakeBigInt(new(big.Int).Sub(x.BigInt(), y.BigInt())) + } + return MakeInt64(x.small - y.small) +} +func (x Int) Mul(y Int) Int { + if x.big != nil || y.big != nil { + return MakeBigInt(new(big.Int).Mul(x.BigInt(), y.BigInt())) + } + return MakeInt64(x.small * y.small) +} +func (x Int) Or(y Int) Int { + if x.big != nil || y.big != nil { + return Int{big: new(big.Int).Or(x.BigInt(), y.BigInt())} + } + return Int{small: x.small | y.small} +} +func (x Int) And(y Int) Int { + if x.big != nil || y.big != nil { + return MakeBigInt(new(big.Int).And(x.BigInt(), y.BigInt())) + } + return Int{small: x.small & y.small} +} +func (x Int) Xor(y Int) Int { + if x.big != nil || y.big != nil { + return MakeBigInt(new(big.Int).Xor(x.BigInt(), y.BigInt())) + } + return Int{small: x.small ^ y.small} +} +func (x Int) Not() Int { + if x.big != nil { + return MakeBigInt(new(big.Int).Not(x.big)) + } + return Int{small: ^x.small} +} +func (x Int) Lsh(y uint) Int { return MakeBigInt(new(big.Int).Lsh(x.BigInt(), y)) } +func (x Int) Rsh(y uint) Int { return MakeBigInt(new(big.Int).Rsh(x.BigInt(), y)) } + +// Precondition: y is nonzero. +func (x Int) Div(y Int) Int { + // http://python-history.blogspot.com/2010/08/why-pythons-integer-division-floors.html + if x.big != nil || y.big != nil { + xb, yb := x.BigInt(), y.BigInt() + + var quo, rem big.Int + quo.QuoRem(xb, yb, &rem) + if (xb.Sign() < 0) != (yb.Sign() < 0) && rem.Sign() != 0 { + quo.Sub(&quo, oneBig) + } + return MakeBigInt(&quo) + } + quo := x.small / y.small + rem := x.small % y.small + if (x.small < 0) != (y.small < 0) && rem != 0 { + quo -= 1 + } + return MakeInt64(quo) +} + +// Precondition: y is nonzero. +func (x Int) Mod(y Int) Int { + if x.big != nil || y.big != nil { + xb, yb := x.BigInt(), y.BigInt() + + var quo, rem big.Int + quo.QuoRem(xb, yb, &rem) + if (xb.Sign() < 0) != (yb.Sign() < 0) && rem.Sign() != 0 { + rem.Add(&rem, yb) + } + return MakeBigInt(&rem) + } + rem := x.small % y.small + if (x.small < 0) != (y.small < 0) && rem != 0 { + rem += y.small + } + return Int{small: rem} +} + +func (i Int) rational() *big.Rat { + if i.big != nil { + return new(big.Rat).SetInt(i.big) + } + return new(big.Rat).SetInt64(i.small) +} + +// AsInt32 returns the value of x if is representable as an int32. +func AsInt32(x Value) (int, error) { + i, ok := x.(Int) + if !ok { + return 0, fmt.Errorf("got %s, want int", x.Type()) + } + if i.big != nil { + return 0, fmt.Errorf("%s out of range", i) + } + return int(i.small), nil +} + +// NumberToInt converts a number x to an integer value. +// An int is returned unchanged, a float is truncated towards zero. +// NumberToInt reports an error for all other values. +func NumberToInt(x Value) (Int, error) { + switch x := x.(type) { + case Int: + return x, nil + case Float: + f := float64(x) + if math.IsInf(f, 0) { + return zero, fmt.Errorf("cannot convert float infinity to integer") + } else if math.IsNaN(f) { + return zero, fmt.Errorf("cannot convert float NaN to integer") + } + return finiteFloatToInt(x), nil + + } + return zero, fmt.Errorf("cannot convert %s to int", x.Type()) +} + +// finiteFloatToInt converts f to an Int, truncating towards zero. +// f must be finite. +func finiteFloatToInt(f Float) Int { + if math.MinInt64 <= f && f <= math.MaxInt64 { + // small values + return MakeInt64(int64(f)) + } + rat := f.rational() + if rat == nil { + panic(f) // non-finite + } + return MakeBigInt(new(big.Int).Div(rat.Num(), rat.Denom())) +} diff --git a/vendor/go.starlark.net/starlark/interp.go b/vendor/go.starlark.net/starlark/interp.go new file mode 100644 index 000000000000..5290730080e0 --- /dev/null +++ b/vendor/go.starlark.net/starlark/interp.go @@ -0,0 +1,637 @@ +package starlark + +// This file defines the bytecode interpreter. + +import ( + "fmt" + "os" + + "go.starlark.net/internal/compile" + "go.starlark.net/internal/spell" + "go.starlark.net/resolve" + "go.starlark.net/syntax" +) + +const vmdebug = false // TODO(adonovan): use a bitfield of specific kinds of error. + +// TODO(adonovan): +// - optimize position table. +// - opt: record MaxIterStack during compilation and preallocate the stack. + +func (fn *Function) CallInternal(thread *Thread, args Tuple, kwargs []Tuple) (Value, error) { + if !resolve.AllowRecursion { + // detect recursion + for _, fr := range thread.stack[:len(thread.stack)-1] { + // We look for the same function code, + // not function value, otherwise the user could + // defeat the check by writing the Y combinator. + if frfn, ok := fr.Callable().(*Function); ok && frfn.funcode == fn.funcode { + return nil, fmt.Errorf("function %s called recursively", fn.Name()) + } + } + } + + f := fn.funcode + fr := thread.frameAt(0) + + // Allocate space for stack and locals. + // Logically these do not escape from this frame + // (See https://github.com/golang/go/issues/20533.) + // + // This heap allocation looks expensive, but I was unable to get + // more than 1% real time improvement in a large alloc-heavy + // benchmark (in which this alloc was 8% of alloc-bytes) + // by allocating space for 8 Values in each frame, or + // by allocating stack by slicing an array held by the Thread + // that is expanded in chunks of min(k, nspace), for k=256 or 1024. + nlocals := len(f.Locals) + nspace := nlocals + f.MaxStack + space := make([]Value, nspace) + locals := space[:nlocals:nlocals] // local variables, starting with parameters + stack := space[nlocals:] // operand stack + + // Digest arguments and set parameters. + err := setArgs(locals, fn, args, kwargs) + if err != nil { + return nil, thread.evalError(err) + } + + fr.locals = locals + + if vmdebug { + fmt.Printf("Entering %s @ %s\n", f.Name, f.Position(0)) + fmt.Printf("%d stack, %d locals\n", len(stack), len(locals)) + defer fmt.Println("Leaving ", f.Name) + } + + // Spill indicated locals to cells. + // Each cell is a separate alloc to avoid spurious liveness. + for _, index := range f.Cells { + locals[index] = &cell{locals[index]} + } + + // TODO(adonovan): add static check that beneath this point + // - there is exactly one return statement + // - there is no redefinition of 'err'. + + var iterstack []Iterator // stack of active iterators + + sp := 0 + var pc uint32 + var result Value + code := f.Code +loop: + for { + fr.pc = pc + + op := compile.Opcode(code[pc]) + pc++ + var arg uint32 + if op >= compile.OpcodeArgMin { + // TODO(adonovan): opt: profile this. + // Perhaps compiling big endian would be less work to decode? + for s := uint(0); ; s += 7 { + b := code[pc] + pc++ + arg |= uint32(b&0x7f) << s + if b < 0x80 { + break + } + } + } + if vmdebug { + fmt.Fprintln(os.Stderr, stack[:sp]) // very verbose! + compile.PrintOp(f, fr.pc, op, arg) + } + + switch op { + case compile.NOP: + // nop + + case compile.DUP: + stack[sp] = stack[sp-1] + sp++ + + case compile.DUP2: + stack[sp] = stack[sp-2] + stack[sp+1] = stack[sp-1] + sp += 2 + + case compile.POP: + sp-- + + case compile.EXCH: + stack[sp-2], stack[sp-1] = stack[sp-1], stack[sp-2] + + case compile.EQL, compile.NEQ, compile.GT, compile.LT, compile.LE, compile.GE: + op := syntax.Token(op-compile.EQL) + syntax.EQL + y := stack[sp-1] + x := stack[sp-2] + sp -= 2 + ok, err2 := Compare(op, x, y) + if err2 != nil { + err = err2 + break loop + } + stack[sp] = Bool(ok) + sp++ + + case compile.PLUS, + compile.MINUS, + compile.STAR, + compile.SLASH, + compile.SLASHSLASH, + compile.PERCENT, + compile.AMP, + compile.PIPE, + compile.CIRCUMFLEX, + compile.LTLT, + compile.GTGT, + compile.IN: + binop := syntax.Token(op-compile.PLUS) + syntax.PLUS + if op == compile.IN { + binop = syntax.IN // IN token is out of order + } + y := stack[sp-1] + x := stack[sp-2] + sp -= 2 + z, err2 := Binary(binop, x, y) + if err2 != nil { + err = err2 + break loop + } + stack[sp] = z + sp++ + + case compile.UPLUS, compile.UMINUS, compile.TILDE: + var unop syntax.Token + if op == compile.TILDE { + unop = syntax.TILDE + } else { + unop = syntax.Token(op-compile.UPLUS) + syntax.PLUS + } + x := stack[sp-1] + y, err2 := Unary(unop, x) + if err2 != nil { + err = err2 + break loop + } + stack[sp-1] = y + + case compile.INPLACE_ADD: + y := stack[sp-1] + x := stack[sp-2] + sp -= 2 + + // It's possible that y is not Iterable but + // nonetheless defines x+y, in which case we + // should fall back to the general case. + var z Value + if xlist, ok := x.(*List); ok { + if yiter, ok := y.(Iterable); ok { + if err = xlist.checkMutable("apply += to"); err != nil { + break loop + } + listExtend(xlist, yiter) + z = xlist + } + } + if z == nil { + z, err = Binary(syntax.PLUS, x, y) + if err != nil { + break loop + } + } + + stack[sp] = z + sp++ + + case compile.NONE: + stack[sp] = None + sp++ + + case compile.TRUE: + stack[sp] = True + sp++ + + case compile.FALSE: + stack[sp] = False + sp++ + + case compile.MANDATORY: + stack[sp] = mandatory{} + sp++ + + case compile.JMP: + pc = arg + + case compile.CALL, compile.CALL_VAR, compile.CALL_KW, compile.CALL_VAR_KW: + var kwargs Value + if op == compile.CALL_KW || op == compile.CALL_VAR_KW { + kwargs = stack[sp-1] + sp-- + } + + var args Value + if op == compile.CALL_VAR || op == compile.CALL_VAR_KW { + args = stack[sp-1] + sp-- + } + + // named args (pairs) + var kvpairs []Tuple + if nkvpairs := int(arg & 0xff); nkvpairs > 0 { + kvpairs = make([]Tuple, 0, nkvpairs) + kvpairsAlloc := make(Tuple, 2*nkvpairs) // allocate a single backing array + sp -= 2 * nkvpairs + for i := 0; i < nkvpairs; i++ { + pair := kvpairsAlloc[:2:2] + kvpairsAlloc = kvpairsAlloc[2:] + pair[0] = stack[sp+2*i] // name + pair[1] = stack[sp+2*i+1] // value + kvpairs = append(kvpairs, pair) + } + } + if kwargs != nil { + // Add key/value items from **kwargs dictionary. + dict, ok := kwargs.(IterableMapping) + if !ok { + err = fmt.Errorf("argument after ** must be a mapping, not %s", kwargs.Type()) + break loop + } + items := dict.Items() + for _, item := range items { + if _, ok := item[0].(String); !ok { + err = fmt.Errorf("keywords must be strings, not %s", item[0].Type()) + break loop + } + } + if len(kvpairs) == 0 { + kvpairs = items + } else { + kvpairs = append(kvpairs, items...) + } + } + + // positional args + var positional Tuple + if npos := int(arg >> 8); npos > 0 { + positional = make(Tuple, npos) + sp -= npos + copy(positional, stack[sp:]) + } + if args != nil { + // Add elements from *args sequence. + iter := Iterate(args) + if iter == nil { + err = fmt.Errorf("argument after * must be iterable, not %s", args.Type()) + break loop + } + var elem Value + for iter.Next(&elem) { + positional = append(positional, elem) + } + iter.Done() + } + + function := stack[sp-1] + + if vmdebug { + fmt.Printf("VM call %s args=%s kwargs=%s @%s\n", + function, positional, kvpairs, f.Position(fr.pc)) + } + + thread.endProfSpan() + z, err2 := Call(thread, function, positional, kvpairs) + thread.beginProfSpan() + if err2 != nil { + err = err2 + break loop + } + if vmdebug { + fmt.Printf("Resuming %s @ %s\n", f.Name, f.Position(0)) + } + stack[sp-1] = z + + case compile.ITERPUSH: + x := stack[sp-1] + sp-- + iter := Iterate(x) + if iter == nil { + err = fmt.Errorf("%s value is not iterable", x.Type()) + break loop + } + iterstack = append(iterstack, iter) + + case compile.ITERJMP: + iter := iterstack[len(iterstack)-1] + if iter.Next(&stack[sp]) { + sp++ + } else { + pc = arg + } + + case compile.ITERPOP: + n := len(iterstack) - 1 + iterstack[n].Done() + iterstack = iterstack[:n] + + case compile.NOT: + stack[sp-1] = !stack[sp-1].Truth() + + case compile.RETURN: + result = stack[sp-1] + break loop + + case compile.SETINDEX: + z := stack[sp-1] + y := stack[sp-2] + x := stack[sp-3] + sp -= 3 + err = setIndex(x, y, z) + if err != nil { + break loop + } + + case compile.INDEX: + y := stack[sp-1] + x := stack[sp-2] + sp -= 2 + z, err2 := getIndex(x, y) + if err2 != nil { + err = err2 + break loop + } + stack[sp] = z + sp++ + + case compile.ATTR: + x := stack[sp-1] + name := f.Prog.Names[arg] + y, err2 := getAttr(x, name) + if err2 != nil { + err = err2 + break loop + } + stack[sp-1] = y + + case compile.SETFIELD: + y := stack[sp-1] + x := stack[sp-2] + sp -= 2 + name := f.Prog.Names[arg] + if err2 := setField(x, name, y); err2 != nil { + err = err2 + break loop + } + + case compile.MAKEDICT: + stack[sp] = new(Dict) + sp++ + + case compile.SETDICT, compile.SETDICTUNIQ: + dict := stack[sp-3].(*Dict) + k := stack[sp-2] + v := stack[sp-1] + sp -= 3 + oldlen := dict.Len() + if err2 := dict.SetKey(k, v); err2 != nil { + err = err2 + break loop + } + if op == compile.SETDICTUNIQ && dict.Len() == oldlen { + err = fmt.Errorf("duplicate key: %v", k) + break loop + } + + case compile.APPEND: + elem := stack[sp-1] + list := stack[sp-2].(*List) + sp -= 2 + list.elems = append(list.elems, elem) + + case compile.SLICE: + x := stack[sp-4] + lo := stack[sp-3] + hi := stack[sp-2] + step := stack[sp-1] + sp -= 4 + res, err2 := slice(x, lo, hi, step) + if err2 != nil { + err = err2 + break loop + } + stack[sp] = res + sp++ + + case compile.UNPACK: + n := int(arg) + iterable := stack[sp-1] + sp-- + iter := Iterate(iterable) + if iter == nil { + err = fmt.Errorf("got %s in sequence assignment", iterable.Type()) + break loop + } + i := 0 + sp += n + for i < n && iter.Next(&stack[sp-1-i]) { + i++ + } + var dummy Value + if iter.Next(&dummy) { + // NB: Len may return -1 here in obscure cases. + err = fmt.Errorf("too many values to unpack (got %d, want %d)", Len(iterable), n) + break loop + } + iter.Done() + if i < n { + err = fmt.Errorf("too few values to unpack (got %d, want %d)", i, n) + break loop + } + + case compile.CJMP: + if stack[sp-1].Truth() { + pc = arg + } + sp-- + + case compile.CONSTANT: + stack[sp] = fn.module.constants[arg] + sp++ + + case compile.MAKETUPLE: + n := int(arg) + tuple := make(Tuple, n) + sp -= n + copy(tuple, stack[sp:]) + stack[sp] = tuple + sp++ + + case compile.MAKELIST: + n := int(arg) + elems := make([]Value, n) + sp -= n + copy(elems, stack[sp:]) + stack[sp] = NewList(elems) + sp++ + + case compile.MAKEFUNC: + funcode := f.Prog.Functions[arg] + tuple := stack[sp-1].(Tuple) + n := len(tuple) - len(funcode.Freevars) + defaults := tuple[:n:n] + freevars := tuple[n:] + stack[sp-1] = &Function{ + funcode: funcode, + module: fn.module, + defaults: defaults, + freevars: freevars, + } + + case compile.LOAD: + n := int(arg) + module := string(stack[sp-1].(String)) + sp-- + + if thread.Load == nil { + err = fmt.Errorf("load not implemented by this application") + break loop + } + + thread.endProfSpan() + dict, err2 := thread.Load(thread, module) + thread.beginProfSpan() + if err2 != nil { + err = wrappedError{ + msg: fmt.Sprintf("cannot load %s: %v", module, err2), + cause: err2, + } + break loop + } + + for i := 0; i < n; i++ { + from := string(stack[sp-1-i].(String)) + v, ok := dict[from] + if !ok { + err = fmt.Errorf("load: name %s not found in module %s", from, module) + if n := spell.Nearest(from, dict.Keys()); n != "" { + err = fmt.Errorf("%s (did you mean %s?)", err, n) + } + break loop + } + stack[sp-1-i] = v + } + + case compile.SETLOCAL: + locals[arg] = stack[sp-1] + sp-- + + case compile.SETCELL: + x := stack[sp-2] + y := stack[sp-1] + sp -= 2 + y.(*cell).v = x + + case compile.SETGLOBAL: + fn.module.globals[arg] = stack[sp-1] + sp-- + + case compile.LOCAL: + x := locals[arg] + if x == nil { + err = fmt.Errorf("local variable %s referenced before assignment", f.Locals[arg].Name) + break loop + } + stack[sp] = x + sp++ + + case compile.FREE: + stack[sp] = fn.freevars[arg] + sp++ + + case compile.CELL: + x := stack[sp-1] + stack[sp-1] = x.(*cell).v + + case compile.GLOBAL: + x := fn.module.globals[arg] + if x == nil { + err = fmt.Errorf("global variable %s referenced before assignment", f.Prog.Globals[arg].Name) + break loop + } + stack[sp] = x + sp++ + + case compile.PREDECLARED: + name := f.Prog.Names[arg] + x := fn.module.predeclared[name] + if x == nil { + err = fmt.Errorf("internal error: predeclared variable %s is uninitialized", name) + break loop + } + stack[sp] = x + sp++ + + case compile.UNIVERSAL: + stack[sp] = Universe[f.Prog.Names[arg]] + sp++ + + default: + err = fmt.Errorf("unimplemented: %s", op) + break loop + } + } + + // ITERPOP the rest of the iterator stack. + for _, iter := range iterstack { + iter.Done() + } + + fr.locals = nil + + return result, err +} + +type wrappedError struct { + msg string + cause error +} + +func (e wrappedError) Error() string { + return e.msg +} + +// Implements the xerrors.Wrapper interface +// https://godoc.org/golang.org/x/xerrors#Wrapper +func (e wrappedError) Unwrap() error { + return e.cause +} + +// mandatory is a sentinel value used in a function's defaults tuple +// to indicate that a (keyword-only) parameter is mandatory. +type mandatory struct{} + +func (mandatory) String() string { return "mandatory" } +func (mandatory) Type() string { return "mandatory" } +func (mandatory) Freeze() {} // immutable +func (mandatory) Truth() Bool { return False } +func (mandatory) Hash() (uint32, error) { return 0, nil } + +// A cell is a box containing a Value. +// Local variables marked as cells hold their value indirectly +// so that they may be shared by outer and inner nested functions. +// Cells are always accessed using indirect CELL/SETCELL instructions. +// The FreeVars tuple contains only cells. +// The FREE instruction always yields a cell. +type cell struct{ v Value } + +func (c *cell) String() string { return "cell" } +func (c *cell) Type() string { return "cell" } +func (c *cell) Freeze() { + if c.v != nil { + c.v.Freeze() + } +} +func (c *cell) Truth() Bool { panic("unreachable") } +func (c *cell) Hash() (uint32, error) { panic("unreachable") } diff --git a/vendor/go.starlark.net/starlark/library.go b/vendor/go.starlark.net/starlark/library.go new file mode 100644 index 000000000000..7a9440ed1b53 --- /dev/null +++ b/vendor/go.starlark.net/starlark/library.go @@ -0,0 +1,2104 @@ +// Copyright 2017 The Bazel Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package starlark + +// This file defines the library of built-ins. +// +// Built-ins must explicitly check the "frozen" flag before updating +// mutable types such as lists and dicts. + +import ( + "errors" + "fmt" + "math/big" + "os" + "sort" + "strconv" + "strings" + "unicode" + "unicode/utf16" + "unicode/utf8" + + "go.starlark.net/syntax" +) + +// Universe defines the set of universal built-ins, such as None, True, and len. +// +// The Go application may add or remove items from the +// universe dictionary before Starlark evaluation begins. +// All values in the dictionary must be immutable. +// Starlark programs cannot modify the dictionary. +var Universe StringDict + +func init() { + // https://github.com/google/starlark-go/blob/master/doc/spec.md#built-in-constants-and-functions + Universe = StringDict{ + "None": None, + "True": True, + "False": False, + "any": NewBuiltin("any", any), + "all": NewBuiltin("all", all), + "bool": NewBuiltin("bool", bool_), + "chr": NewBuiltin("chr", chr), + "dict": NewBuiltin("dict", dict), + "dir": NewBuiltin("dir", dir), + "enumerate": NewBuiltin("enumerate", enumerate), + "fail": NewBuiltin("fail", fail), + "float": NewBuiltin("float", float), // requires resolve.AllowFloat + "getattr": NewBuiltin("getattr", getattr), + "hasattr": NewBuiltin("hasattr", hasattr), + "hash": NewBuiltin("hash", hash), + "int": NewBuiltin("int", int_), + "len": NewBuiltin("len", len_), + "list": NewBuiltin("list", list), + "max": NewBuiltin("max", minmax), + "min": NewBuiltin("min", minmax), + "ord": NewBuiltin("ord", ord), + "print": NewBuiltin("print", print), + "range": NewBuiltin("range", range_), + "repr": NewBuiltin("repr", repr), + "reversed": NewBuiltin("reversed", reversed), + "set": NewBuiltin("set", set), // requires resolve.AllowSet + "sorted": NewBuiltin("sorted", sorted), + "str": NewBuiltin("str", str), + "tuple": NewBuiltin("tuple", tuple), + "type": NewBuiltin("type", type_), + "zip": NewBuiltin("zip", zip), + } +} + +// methods of built-in types +// https://github.com/google/starlark-go/blob/master/doc/spec.md#built-in-methods +var ( + dictMethods = map[string]*Builtin{ + "clear": NewBuiltin("clear", dict_clear), + "get": NewBuiltin("get", dict_get), + "items": NewBuiltin("items", dict_items), + "keys": NewBuiltin("keys", dict_keys), + "pop": NewBuiltin("pop", dict_pop), + "popitem": NewBuiltin("popitem", dict_popitem), + "setdefault": NewBuiltin("setdefault", dict_setdefault), + "update": NewBuiltin("update", dict_update), + "values": NewBuiltin("values", dict_values), + } + + listMethods = map[string]*Builtin{ + "append": NewBuiltin("append", list_append), + "clear": NewBuiltin("clear", list_clear), + "extend": NewBuiltin("extend", list_extend), + "index": NewBuiltin("index", list_index), + "insert": NewBuiltin("insert", list_insert), + "pop": NewBuiltin("pop", list_pop), + "remove": NewBuiltin("remove", list_remove), + } + + stringMethods = map[string]*Builtin{ + "capitalize": NewBuiltin("capitalize", string_capitalize), + "codepoint_ords": NewBuiltin("codepoint_ords", string_iterable), + "codepoints": NewBuiltin("codepoints", string_iterable), // sic + "count": NewBuiltin("count", string_count), + "elem_ords": NewBuiltin("elem_ords", string_iterable), + "elems": NewBuiltin("elems", string_iterable), // sic + "endswith": NewBuiltin("endswith", string_startswith), // sic + "find": NewBuiltin("find", string_find), + "format": NewBuiltin("format", string_format), + "index": NewBuiltin("index", string_index), + "isalnum": NewBuiltin("isalnum", string_isalnum), + "isalpha": NewBuiltin("isalpha", string_isalpha), + "isdigit": NewBuiltin("isdigit", string_isdigit), + "islower": NewBuiltin("islower", string_islower), + "isspace": NewBuiltin("isspace", string_isspace), + "istitle": NewBuiltin("istitle", string_istitle), + "isupper": NewBuiltin("isupper", string_isupper), + "join": NewBuiltin("join", string_join), + "lower": NewBuiltin("lower", string_lower), + "lstrip": NewBuiltin("lstrip", string_strip), // sic + "partition": NewBuiltin("partition", string_partition), + "replace": NewBuiltin("replace", string_replace), + "rfind": NewBuiltin("rfind", string_rfind), + "rindex": NewBuiltin("rindex", string_rindex), + "rpartition": NewBuiltin("rpartition", string_partition), // sic + "rsplit": NewBuiltin("rsplit", string_split), // sic + "rstrip": NewBuiltin("rstrip", string_strip), // sic + "split": NewBuiltin("split", string_split), + "splitlines": NewBuiltin("splitlines", string_splitlines), + "startswith": NewBuiltin("startswith", string_startswith), + "strip": NewBuiltin("strip", string_strip), + "title": NewBuiltin("title", string_title), + "upper": NewBuiltin("upper", string_upper), + } + + setMethods = map[string]*Builtin{ + "union": NewBuiltin("union", set_union), + } +) + +func builtinAttr(recv Value, name string, methods map[string]*Builtin) (Value, error) { + b := methods[name] + if b == nil { + return nil, nil // no such method + } + return b.BindReceiver(recv), nil +} + +func builtinAttrNames(methods map[string]*Builtin) []string { + names := make([]string, 0, len(methods)) + for name := range methods { + names = append(names, name) + } + sort.Strings(names) + return names +} + +// ---- built-in functions ---- + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#all +func all(thread *Thread, _ *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + var iterable Iterable + if err := UnpackPositionalArgs("all", args, kwargs, 1, &iterable); err != nil { + return nil, err + } + iter := iterable.Iterate() + defer iter.Done() + var x Value + for iter.Next(&x) { + if !x.Truth() { + return False, nil + } + } + return True, nil +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#any +func any(thread *Thread, _ *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + var iterable Iterable + if err := UnpackPositionalArgs("any", args, kwargs, 1, &iterable); err != nil { + return nil, err + } + iter := iterable.Iterate() + defer iter.Done() + var x Value + for iter.Next(&x) { + if x.Truth() { + return True, nil + } + } + return False, nil +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#bool +func bool_(thread *Thread, _ *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + var x Value = False + if err := UnpackPositionalArgs("bool", args, kwargs, 0, &x); err != nil { + return nil, err + } + return x.Truth(), nil +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#chr +func chr(thread *Thread, _ *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + if len(kwargs) > 0 { + return nil, fmt.Errorf("chr does not accept keyword arguments") + } + if len(args) != 1 { + return nil, fmt.Errorf("chr: got %d arguments, want 1", len(args)) + } + i, err := AsInt32(args[0]) + if err != nil { + return nil, fmt.Errorf("chr: got %s, want int", args[0].Type()) + } + if i < 0 { + return nil, fmt.Errorf("chr: Unicode code point %d out of range (<0)", i) + } + if i > unicode.MaxRune { + return nil, fmt.Errorf("chr: Unicode code point U+%X out of range (>0x10FFFF)", i) + } + return String(string(i)), nil +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#dict +func dict(thread *Thread, _ *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + if len(args) > 1 { + return nil, fmt.Errorf("dict: got %d arguments, want at most 1", len(args)) + } + dict := new(Dict) + if err := updateDict(dict, args, kwargs); err != nil { + return nil, fmt.Errorf("dict: %v", err) + } + return dict, nil +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#dir +func dir(thread *Thread, _ *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + if len(kwargs) > 0 { + return nil, fmt.Errorf("dir does not accept keyword arguments") + } + if len(args) != 1 { + return nil, fmt.Errorf("dir: got %d arguments, want 1", len(args)) + } + + var names []string + if x, ok := args[0].(HasAttrs); ok { + names = x.AttrNames() + } + sort.Strings(names) + elems := make([]Value, len(names)) + for i, name := range names { + elems[i] = String(name) + } + return NewList(elems), nil +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#enumerate +func enumerate(thread *Thread, _ *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + var iterable Iterable + var start int + if err := UnpackPositionalArgs("enumerate", args, kwargs, 1, &iterable, &start); err != nil { + return nil, err + } + + iter := iterable.Iterate() + if iter == nil { + return nil, fmt.Errorf("enumerate: got %s, want iterable", iterable.Type()) + } + defer iter.Done() + + var pairs []Value + var x Value + + if n := Len(iterable); n >= 0 { + // common case: known length + pairs = make([]Value, 0, n) + array := make(Tuple, 2*n) // allocate a single backing array + for i := 0; iter.Next(&x); i++ { + pair := array[:2:2] + array = array[2:] + pair[0] = MakeInt(start + i) + pair[1] = x + pairs = append(pairs, pair) + } + } else { + // non-sequence (unknown length) + for i := 0; iter.Next(&x); i++ { + pair := Tuple{MakeInt(start + i), x} + pairs = append(pairs, pair) + } + } + + return NewList(pairs), nil +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#fail +func fail(thread *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + sep := " " + if err := UnpackArgs("fail", nil, kwargs, "sep?", &sep); err != nil { + return nil, err + } + buf := new(strings.Builder) + buf.WriteString("fail: ") + for i, v := range args { + if i > 0 { + buf.WriteString(sep) + } + if s, ok := AsString(v); ok { + buf.WriteString(s) + } else { + writeValue(buf, v, nil) + } + } + + return nil, errors.New(buf.String()) +} + +func float(thread *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + if len(kwargs) > 0 { + return nil, fmt.Errorf("float does not accept keyword arguments") + } + if len(args) == 0 { + return Float(0.0), nil + } + if len(args) != 1 { + return nil, fmt.Errorf("float got %d arguments, wants 1", len(args)) + } + switch x := args[0].(type) { + case Bool: + if x { + return Float(1.0), nil + } else { + return Float(0.0), nil + } + case Int: + return x.Float(), nil + case Float: + return x, nil + case String: + f, err := strconv.ParseFloat(string(x), 64) + if err != nil { + return nil, nameErr(b, err) + } + return Float(f), nil + default: + return nil, fmt.Errorf("float got %s, want number or string", x.Type()) + } +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#getattr +func getattr(thread *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + var object, dflt Value + var name string + if err := UnpackPositionalArgs("getattr", args, kwargs, 2, &object, &name, &dflt); err != nil { + return nil, err + } + if object, ok := object.(HasAttrs); ok { + v, err := object.Attr(name) + if err != nil { + // An error could mean the field doesn't exist, + // or it exists but could not be computed. + if dflt != nil { + return dflt, nil + } + return nil, nameErr(b, err) + } + if v != nil { + return v, nil + } + // (nil, nil) => no such field + } + if dflt != nil { + return dflt, nil + } + return nil, fmt.Errorf("getattr: %s has no .%s field or method", object.Type(), name) +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#hasattr +func hasattr(thread *Thread, _ *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + var object Value + var name string + if err := UnpackPositionalArgs("hasattr", args, kwargs, 2, &object, &name); err != nil { + return nil, err + } + if object, ok := object.(HasAttrs); ok { + v, err := object.Attr(name) + if err == nil { + return Bool(v != nil), nil + } + + // An error does not conclusively indicate presence or + // absence of a field: it could occur while computing + // the value of a present attribute, or it could be a + // "no such attribute" error with details. + for _, x := range object.AttrNames() { + if x == name { + return True, nil + } + } + } + return False, nil +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#hash +func hash(thread *Thread, _ *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + var s string + if err := UnpackPositionalArgs("hash", args, kwargs, 1, &s); err != nil { + return nil, err + } + + // The Starlark spec requires that the hash function be + // deterministic across all runs, motivated by the need + // for reproducibility of builds. Thus we cannot call + // String.Hash, which uses the fastest implementation + // available, because as varies across process restarts, + // and may evolve with the implementation. + + return MakeInt(int(javaStringHash(s))), nil +} + +// javaStringHash returns the same hash as would be produced by +// java.lang.String.hashCode. This requires transcoding the string to +// UTF-16; transcoding may introduce Unicode replacement characters +// U+FFFD if s does not contain valid UTF-8. +func javaStringHash(s string) (h int32) { + for _, r := range s { + if utf16.IsSurrogate(r) { + c1, c2 := utf16.EncodeRune(r) + h = 31*h + c1 + h = 31*h + c2 + } else { + h = 31*h + r // r may be U+FFFD + } + } + return h +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#int +func int_(thread *Thread, _ *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + var x Value = zero + var base Value + if err := UnpackArgs("int", args, kwargs, "x", &x, "base?", &base); err != nil { + return nil, err + } + + // "If x is not a number or base is given, x must be a string." + if s, ok := AsString(x); ok { + b := 10 + if base != nil { + var err error + b, err = AsInt32(base) + if err != nil || b != 0 && (b < 2 || b > 36) { + return nil, fmt.Errorf("int: base must be an integer >= 2 && <= 36") + } + } + + orig := s // save original for error message + + // remove sign + var neg bool + if s != "" { + if s[0] == '+' { + s = s[1:] + } else if s[0] == '-' { + neg = true + s = s[1:] + } + } + + // remove base prefix + baseprefix := 0 + if len(s) > 1 && s[0] == '0' { + if len(s) > 2 { + switch s[1] { + case 'o', 'O': + s = s[2:] + baseprefix = 8 + case 'x', 'X': + s = s[2:] + baseprefix = 16 + case 'b', 'B': + s = s[2:] + baseprefix = 2 + } + } + + // For automatic base detection, + // a string starting with zero + // must be all zeros. + // Thus we reject int("0755", 0). + if baseprefix == 0 && b == 0 { + for i := 1; i < len(s); i++ { + if s[i] != '0' { + goto invalid + } + } + return zero, nil + } + + if b != 0 && baseprefix != 0 && baseprefix != b { + // Explicit base doesn't match prefix, + // e.g. int("0o755", 16). + goto invalid + } + } + + // select base + if b == 0 { + if baseprefix != 0 { + b = baseprefix + } else { + b = 10 + } + } + + // we explicitly handled sign above. + // if a sign remains, it is invalid. + if s != "" && (s[0] == '-' || s[0] == '+') { + goto invalid + } + + // s has no sign or base prefix. + // + // int(x) permits arbitrary precision, unlike the scanner. + if i, ok := new(big.Int).SetString(s, b); ok { + res := MakeBigInt(i) + if neg { + res = zero.Sub(res) + } + return res, nil + } + + invalid: + return nil, fmt.Errorf("int: invalid literal with base %d: %s", b, orig) + } + + if base != nil { + return nil, fmt.Errorf("int: can't convert non-string with explicit base") + } + + if b, ok := x.(Bool); ok { + if b { + return one, nil + } else { + return zero, nil + } + } + + i, err := NumberToInt(x) + if err != nil { + return nil, fmt.Errorf("int: %s", err) + } + return i, nil +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#len +func len_(thread *Thread, _ *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + var x Value + if err := UnpackPositionalArgs("len", args, kwargs, 1, &x); err != nil { + return nil, err + } + len := Len(x) + if len < 0 { + return nil, fmt.Errorf("len: value of type %s has no len", x.Type()) + } + return MakeInt(len), nil +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#list +func list(thread *Thread, _ *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + var iterable Iterable + if err := UnpackPositionalArgs("list", args, kwargs, 0, &iterable); err != nil { + return nil, err + } + var elems []Value + if iterable != nil { + iter := iterable.Iterate() + defer iter.Done() + if n := Len(iterable); n > 0 { + elems = make([]Value, 0, n) // preallocate if length known + } + var x Value + for iter.Next(&x) { + elems = append(elems, x) + } + } + return NewList(elems), nil +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#min +func minmax(thread *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + if len(args) == 0 { + return nil, fmt.Errorf("%s requires at least one positional argument", b.Name()) + } + var keyFunc Callable + if err := UnpackArgs(b.Name(), nil, kwargs, "key?", &keyFunc); err != nil { + return nil, err + } + var op syntax.Token + if b.Name() == "max" { + op = syntax.GT + } else { + op = syntax.LT + } + var iterable Value + if len(args) == 1 { + iterable = args[0] + } else { + iterable = args + } + iter := Iterate(iterable) + if iter == nil { + return nil, fmt.Errorf("%s: %s value is not iterable", b.Name(), iterable.Type()) + } + defer iter.Done() + var extremum Value + if !iter.Next(&extremum) { + return nil, nameErr(b, "argument is an empty sequence") + } + + var extremeKey Value + var keyargs Tuple + if keyFunc == nil { + extremeKey = extremum + } else { + keyargs = Tuple{extremum} + res, err := Call(thread, keyFunc, keyargs, nil) + if err != nil { + return nil, err // to preserve backtrace, don't modify error + } + extremeKey = res + } + + var x Value + for iter.Next(&x) { + var key Value + if keyFunc == nil { + key = x + } else { + keyargs[0] = x + res, err := Call(thread, keyFunc, keyargs, nil) + if err != nil { + return nil, err // to preserve backtrace, don't modify error + } + key = res + } + + if ok, err := Compare(op, key, extremeKey); err != nil { + return nil, nameErr(b, err) + } else if ok { + extremum = x + extremeKey = key + } + } + return extremum, nil +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#ord +func ord(thread *Thread, _ *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + if len(kwargs) > 0 { + return nil, fmt.Errorf("ord does not accept keyword arguments") + } + if len(args) != 1 { + return nil, fmt.Errorf("ord: got %d arguments, want 1", len(args)) + } + s, ok := AsString(args[0]) + if !ok { + return nil, fmt.Errorf("ord: got %s, want string", args[0].Type()) + } + r, sz := utf8.DecodeRuneInString(s) + if sz == 0 || sz != len(s) { + n := utf8.RuneCountInString(s) + return nil, fmt.Errorf("ord: string encodes %d Unicode code points, want 1", n) + } + return MakeInt(int(r)), nil +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#print +func print(thread *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + sep := " " + if err := UnpackArgs("print", nil, kwargs, "sep?", &sep); err != nil { + return nil, err + } + buf := new(strings.Builder) + for i, v := range args { + if i > 0 { + buf.WriteString(sep) + } + if s, ok := AsString(v); ok { + buf.WriteString(s) + } else { + writeValue(buf, v, nil) + } + } + + s := buf.String() + if thread.Print != nil { + thread.Print(thread, s) + } else { + fmt.Fprintln(os.Stderr, s) + } + return None, nil +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#range +func range_(thread *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + var start, stop, step int + step = 1 + if err := UnpackPositionalArgs("range", args, kwargs, 1, &start, &stop, &step); err != nil { + return nil, err + } + + // TODO(adonovan): analyze overflow/underflows cases for 32-bit implementations. + if len(args) == 1 { + // range(stop) + start, stop = 0, start + } + if step == 0 { + // we were given range(start, stop, 0) + return nil, nameErr(b, "step argument must not be zero") + } + + return rangeValue{start: start, stop: stop, step: step, len: rangeLen(start, stop, step)}, nil +} + +// A rangeValue is a comparable, immutable, indexable sequence of integers +// defined by the three parameters to a range(...) call. +// Invariant: step != 0. +type rangeValue struct{ start, stop, step, len int } + +var ( + _ Indexable = rangeValue{} + _ Sequence = rangeValue{} + _ Comparable = rangeValue{} + _ Sliceable = rangeValue{} +) + +func (r rangeValue) Len() int { return r.len } +func (r rangeValue) Index(i int) Value { return MakeInt(r.start + i*r.step) } +func (r rangeValue) Iterate() Iterator { return &rangeIterator{r, 0} } + +// rangeLen calculates the length of a range with the provided start, stop, and step. +// caller must ensure that step is non-zero. +func rangeLen(start, stop, step int) int { + switch { + case step > 0: + if stop > start { + return (stop-1-start)/step + 1 + } + case step < 0: + if start > stop { + return (start-1-stop)/-step + 1 + } + default: + panic("rangeLen: zero step") + } + return 0 +} + +func (r rangeValue) Slice(start, end, step int) Value { + newStart := r.start + r.step*start + newStop := r.start + r.step*end + newStep := r.step * step + return rangeValue{ + start: newStart, + stop: newStop, + step: newStep, + len: rangeLen(newStart, newStop, newStep), + } +} + +func (r rangeValue) Freeze() {} // immutable +func (r rangeValue) String() string { + if r.step != 1 { + return fmt.Sprintf("range(%d, %d, %d)", r.start, r.stop, r.step) + } else if r.start != 0 { + return fmt.Sprintf("range(%d, %d)", r.start, r.stop) + } else { + return fmt.Sprintf("range(%d)", r.stop) + } +} +func (r rangeValue) Type() string { return "range" } +func (r rangeValue) Truth() Bool { return r.len > 0 } +func (r rangeValue) Hash() (uint32, error) { return 0, fmt.Errorf("unhashable: range") } + +func (x rangeValue) CompareSameType(op syntax.Token, y_ Value, depth int) (bool, error) { + y := y_.(rangeValue) + switch op { + case syntax.EQL: + return rangeEqual(x, y), nil + case syntax.NEQ: + return !rangeEqual(x, y), nil + default: + return false, fmt.Errorf("%s %s %s not implemented", x.Type(), op, y.Type()) + } +} + +func rangeEqual(x, y rangeValue) bool { + // Two ranges compare equal if they denote the same sequence. + if x.len != y.len { + return false // sequences differ in length + } + if x.len == 0 { + return true // both sequences are empty + } + if x.start != y.start { + return false // first element differs + } + return x.len == 1 || x.step == y.step +} + +func (r rangeValue) contains(x Int) bool { + x32, err := AsInt32(x) + if err != nil { + return false // out of range + } + delta := x32 - r.start + quo, rem := delta/r.step, delta%r.step + return rem == 0 && 0 <= quo && quo < r.len +} + +type rangeIterator struct { + r rangeValue + i int +} + +func (it *rangeIterator) Next(p *Value) bool { + if it.i < it.r.len { + *p = it.r.Index(it.i) + it.i++ + return true + } + return false +} +func (*rangeIterator) Done() {} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#repr +func repr(thread *Thread, _ *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + var x Value + if err := UnpackPositionalArgs("repr", args, kwargs, 1, &x); err != nil { + return nil, err + } + return String(x.String()), nil +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#reversed +func reversed(thread *Thread, _ *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + var iterable Iterable + if err := UnpackPositionalArgs("reversed", args, kwargs, 1, &iterable); err != nil { + return nil, err + } + iter := iterable.Iterate() + defer iter.Done() + var elems []Value + if n := Len(args[0]); n >= 0 { + elems = make([]Value, 0, n) // preallocate if length known + } + var x Value + for iter.Next(&x) { + elems = append(elems, x) + } + n := len(elems) + for i := 0; i < n>>1; i++ { + elems[i], elems[n-1-i] = elems[n-1-i], elems[i] + } + return NewList(elems), nil +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#set +func set(thread *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + var iterable Iterable + if err := UnpackPositionalArgs("set", args, kwargs, 0, &iterable); err != nil { + return nil, err + } + set := new(Set) + if iterable != nil { + iter := iterable.Iterate() + defer iter.Done() + var x Value + for iter.Next(&x) { + if err := set.Insert(x); err != nil { + return nil, nameErr(b, err) + } + } + } + return set, nil +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#sorted +func sorted(thread *Thread, _ *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + // Oddly, Python's sorted permits all arguments to be positional, thus so do we. + var iterable Iterable + var key Callable + var reverse bool + if err := UnpackArgs("sorted", args, kwargs, + "iterable", &iterable, + "key?", &key, + "reverse?", &reverse, + ); err != nil { + return nil, err + } + + iter := iterable.Iterate() + defer iter.Done() + var values []Value + if n := Len(iterable); n > 0 { + values = make(Tuple, 0, n) // preallocate if length is known + } + var x Value + for iter.Next(&x) { + values = append(values, x) + } + + // Derive keys from values by applying key function. + var keys []Value + if key != nil { + keys = make([]Value, len(values)) + for i, v := range values { + k, err := Call(thread, key, Tuple{v}, nil) + if err != nil { + return nil, err // to preserve backtrace, don't modify error + } + keys[i] = k + } + } + + slice := &sortSlice{keys: keys, values: values} + if reverse { + sort.Stable(sort.Reverse(slice)) + } else { + sort.Stable(slice) + } + return NewList(slice.values), slice.err +} + +type sortSlice struct { + keys []Value // nil => values[i] is key + values []Value + err error +} + +func (s *sortSlice) Len() int { return len(s.values) } +func (s *sortSlice) Less(i, j int) bool { + keys := s.keys + if s.keys == nil { + keys = s.values + } + ok, err := Compare(syntax.LT, keys[i], keys[j]) + if err != nil { + s.err = err + } + return ok +} +func (s *sortSlice) Swap(i, j int) { + if s.keys != nil { + s.keys[i], s.keys[j] = s.keys[j], s.keys[i] + } + s.values[i], s.values[j] = s.values[j], s.values[i] +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#str +func str(thread *Thread, _ *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + if len(kwargs) > 0 { + return nil, fmt.Errorf("str does not accept keyword arguments") + } + if len(args) != 1 { + return nil, fmt.Errorf("str: got %d arguments, want exactly 1", len(args)) + } + x := args[0] + if _, ok := AsString(x); !ok { + x = String(x.String()) + } + return x, nil +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#tuple +func tuple(thread *Thread, _ *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + var iterable Iterable + if err := UnpackPositionalArgs("tuple", args, kwargs, 0, &iterable); err != nil { + return nil, err + } + if len(args) == 0 { + return Tuple(nil), nil + } + iter := iterable.Iterate() + defer iter.Done() + var elems Tuple + if n := Len(iterable); n > 0 { + elems = make(Tuple, 0, n) // preallocate if length is known + } + var x Value + for iter.Next(&x) { + elems = append(elems, x) + } + return elems, nil +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#type +func type_(thread *Thread, _ *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + if len(kwargs) > 0 { + return nil, fmt.Errorf("type does not accept keyword arguments") + } + if len(args) != 1 { + return nil, fmt.Errorf("type: got %d arguments, want exactly 1", len(args)) + } + return String(args[0].Type()), nil +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#zip +func zip(thread *Thread, _ *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + if len(kwargs) > 0 { + return nil, fmt.Errorf("zip does not accept keyword arguments") + } + rows, cols := 0, len(args) + iters := make([]Iterator, cols) + defer func() { + for _, iter := range iters { + if iter != nil { + iter.Done() + } + } + }() + for i, seq := range args { + it := Iterate(seq) + if it == nil { + return nil, fmt.Errorf("zip: argument #%d is not iterable: %s", i+1, seq.Type()) + } + iters[i] = it + n := Len(seq) + if i == 0 || n < rows { + rows = n // possibly -1 + } + } + var result []Value + if rows >= 0 { + // length known + result = make([]Value, rows) + array := make(Tuple, cols*rows) // allocate a single backing array + for i := 0; i < rows; i++ { + tuple := array[:cols:cols] + array = array[cols:] + for j, iter := range iters { + iter.Next(&tuple[j]) + } + result[i] = tuple + } + } else { + // length not known + outer: + for { + tuple := make(Tuple, cols) + for i, iter := range iters { + if !iter.Next(&tuple[i]) { + break outer + } + } + result = append(result, tuple) + } + } + return NewList(result), nil +} + +// ---- methods of built-in types --- + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#dict·get +func dict_get(_ *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + var key, dflt Value + if err := UnpackPositionalArgs(b.Name(), args, kwargs, 1, &key, &dflt); err != nil { + return nil, err + } + if v, ok, err := b.Receiver().(*Dict).Get(key); err != nil { + return nil, nameErr(b, err) + } else if ok { + return v, nil + } else if dflt != nil { + return dflt, nil + } + return None, nil +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#dict·clear +func dict_clear(_ *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + if err := UnpackPositionalArgs(b.Name(), args, kwargs, 0); err != nil { + return nil, err + } + return None, b.Receiver().(*Dict).Clear() +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#dict·items +func dict_items(_ *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + if err := UnpackPositionalArgs(b.Name(), args, kwargs, 0); err != nil { + return nil, err + } + items := b.Receiver().(*Dict).Items() + res := make([]Value, len(items)) + for i, item := range items { + res[i] = item // convert [2]Value to Value + } + return NewList(res), nil +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#dict·keys +func dict_keys(_ *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + if err := UnpackPositionalArgs(b.Name(), args, kwargs, 0); err != nil { + return nil, err + } + return NewList(b.Receiver().(*Dict).Keys()), nil +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#dict·pop +func dict_pop(_ *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + var k, d Value + if err := UnpackPositionalArgs(b.Name(), args, kwargs, 1, &k, &d); err != nil { + return nil, err + } + if v, found, err := b.Receiver().(*Dict).Delete(k); err != nil { + return nil, nameErr(b, err) // dict is frozen or key is unhashable + } else if found { + return v, nil + } else if d != nil { + return d, nil + } + return nil, nameErr(b, "missing key") +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#dict·popitem +func dict_popitem(_ *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + if err := UnpackPositionalArgs(b.Name(), args, kwargs, 0); err != nil { + return nil, err + } + recv := b.Receiver().(*Dict) + k, ok := recv.ht.first() + if !ok { + return nil, nameErr(b, "empty dict") + } + v, _, err := recv.Delete(k) + if err != nil { + return nil, nameErr(b, err) // dict is frozen + } + return Tuple{k, v}, nil +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#dict·setdefault +func dict_setdefault(_ *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + var key, dflt Value = nil, None + if err := UnpackPositionalArgs(b.Name(), args, kwargs, 1, &key, &dflt); err != nil { + return nil, err + } + dict := b.Receiver().(*Dict) + if v, ok, err := dict.Get(key); err != nil { + return nil, nameErr(b, err) + } else if ok { + return v, nil + } else if err := dict.SetKey(key, dflt); err != nil { + return nil, nameErr(b, err) + } else { + return dflt, nil + } +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#dict·update +func dict_update(_ *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + if len(args) > 1 { + return nil, fmt.Errorf("update: got %d arguments, want at most 1", len(args)) + } + if err := updateDict(b.Receiver().(*Dict), args, kwargs); err != nil { + return nil, fmt.Errorf("update: %v", err) + } + return None, nil +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#dict·update +func dict_values(_ *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + if err := UnpackPositionalArgs(b.Name(), args, kwargs, 0); err != nil { + return nil, err + } + items := b.Receiver().(*Dict).Items() + res := make([]Value, len(items)) + for i, item := range items { + res[i] = item[1] + } + return NewList(res), nil +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#list·append +func list_append(_ *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + var object Value + if err := UnpackPositionalArgs(b.Name(), args, kwargs, 1, &object); err != nil { + return nil, err + } + recv := b.Receiver().(*List) + if err := recv.checkMutable("append to"); err != nil { + return nil, nameErr(b, err) + } + recv.elems = append(recv.elems, object) + return None, nil +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#list·clear +func list_clear(_ *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + if err := UnpackPositionalArgs(b.Name(), args, kwargs, 0); err != nil { + return nil, err + } + if err := b.Receiver().(*List).Clear(); err != nil { + return nil, nameErr(b, err) + } + return None, nil +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#list·extend +func list_extend(_ *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + recv := b.Receiver().(*List) + var iterable Iterable + if err := UnpackPositionalArgs(b.Name(), args, kwargs, 1, &iterable); err != nil { + return nil, err + } + if err := recv.checkMutable("extend"); err != nil { + return nil, nameErr(b, err) + } + listExtend(recv, iterable) + return None, nil +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#list·index +func list_index(_ *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + var value, start_, end_ Value + if err := UnpackPositionalArgs(b.Name(), args, kwargs, 1, &value, &start_, &end_); err != nil { + return nil, err + } + + recv := b.Receiver().(*List) + start, end, err := indices(start_, end_, recv.Len()) + if err != nil { + return nil, nameErr(b, err) + } + + for i := start; i < end; i++ { + if eq, err := Equal(recv.elems[i], value); err != nil { + return nil, nameErr(b, err) + } else if eq { + return MakeInt(i), nil + } + } + return nil, nameErr(b, "value not in list") +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#list·insert +func list_insert(_ *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + recv := b.Receiver().(*List) + var index int + var object Value + if err := UnpackPositionalArgs(b.Name(), args, kwargs, 2, &index, &object); err != nil { + return nil, err + } + if err := recv.checkMutable("insert into"); err != nil { + return nil, nameErr(b, err) + } + + if index < 0 { + index += recv.Len() + } + + if index >= recv.Len() { + // end + recv.elems = append(recv.elems, object) + } else { + if index < 0 { + index = 0 // start + } + recv.elems = append(recv.elems, nil) + copy(recv.elems[index+1:], recv.elems[index:]) // slide up one + recv.elems[index] = object + } + return None, nil +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#list·remove +func list_remove(_ *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + recv := b.Receiver().(*List) + var value Value + if err := UnpackPositionalArgs(b.Name(), args, kwargs, 1, &value); err != nil { + return nil, err + } + if err := recv.checkMutable("remove from"); err != nil { + return nil, nameErr(b, err) + } + for i, elem := range recv.elems { + if eq, err := Equal(elem, value); err != nil { + return nil, fmt.Errorf("remove: %v", err) + } else if eq { + recv.elems = append(recv.elems[:i], recv.elems[i+1:]...) + return None, nil + } + } + return nil, fmt.Errorf("remove: element not found") +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#list·pop +func list_pop(_ *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + recv := b.Receiver() + list := recv.(*List) + n := list.Len() + i := n - 1 + if err := UnpackPositionalArgs(b.Name(), args, kwargs, 0, &i); err != nil { + return nil, err + } + origI := i + if i < 0 { + i += n + } + if i < 0 || i >= n { + return nil, nameErr(b, outOfRange(origI, n, list)) + } + if err := list.checkMutable("pop from"); err != nil { + return nil, nameErr(b, err) + } + res := list.elems[i] + list.elems = append(list.elems[:i], list.elems[i+1:]...) + return res, nil +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#string·capitalize +func string_capitalize(_ *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + if err := UnpackPositionalArgs(b.Name(), args, kwargs, 0); err != nil { + return nil, err + } + s := string(b.Receiver().(String)) + res := new(strings.Builder) + res.Grow(len(s)) + for i, r := range s { + if i == 0 { + r = unicode.ToTitle(r) + } else { + r = unicode.ToLower(r) + } + res.WriteRune(r) + } + return String(res.String()), nil +} + +// string_iterable returns an unspecified iterable value whose iterator yields: +// - elems: successive 1-byte substrings +// - codepoints: successive substrings that encode a single Unicode code point. +// - elem_ords: numeric values of successive bytes +// - codepoint_ords: numeric values of successive Unicode code points +func string_iterable(_ *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + if err := UnpackPositionalArgs(b.Name(), args, kwargs, 0); err != nil { + return nil, err + } + return stringIterable{ + s: b.Receiver().(String), + ords: b.Name()[len(b.Name())-2] == 'd', + codepoints: b.Name()[0] == 'c', + }, nil +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#string·count +func string_count(_ *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + var sub string + var start_, end_ Value + if err := UnpackPositionalArgs(b.Name(), args, kwargs, 1, &sub, &start_, &end_); err != nil { + return nil, err + } + + recv := string(b.Receiver().(String)) + start, end, err := indices(start_, end_, len(recv)) + if err != nil { + return nil, nameErr(b, err) + } + + var slice string + if start < end { + slice = recv[start:end] + } + return MakeInt(strings.Count(slice, sub)), nil +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#string·isalnum +func string_isalnum(_ *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + if err := UnpackPositionalArgs(b.Name(), args, kwargs, 0); err != nil { + return nil, err + } + recv := string(b.Receiver().(String)) + for _, r := range recv { + if !unicode.IsLetter(r) && !unicode.IsDigit(r) { + return False, nil + } + } + return Bool(recv != ""), nil +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#string·isalpha +func string_isalpha(_ *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + if err := UnpackPositionalArgs(b.Name(), args, kwargs, 0); err != nil { + return nil, err + } + recv := string(b.Receiver().(String)) + for _, r := range recv { + if !unicode.IsLetter(r) { + return False, nil + } + } + return Bool(recv != ""), nil +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#string·isdigit +func string_isdigit(_ *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + if err := UnpackPositionalArgs(b.Name(), args, kwargs, 0); err != nil { + return nil, err + } + recv := string(b.Receiver().(String)) + for _, r := range recv { + if !unicode.IsDigit(r) { + return False, nil + } + } + return Bool(recv != ""), nil +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#string·islower +func string_islower(_ *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + if err := UnpackPositionalArgs(b.Name(), args, kwargs, 0); err != nil { + return nil, err + } + recv := string(b.Receiver().(String)) + return Bool(isCasedString(recv) && recv == strings.ToLower(recv)), nil +} + +// isCasedString reports whether its argument contains any cased code points. +func isCasedString(s string) bool { + for _, r := range s { + if isCasedRune(r) { + return true + } + } + return false +} + +func isCasedRune(r rune) bool { + // It's unclear what the correct behavior is for a rune such as 'ffi', + // a lowercase letter with no upper or title case and no SimpleFold. + return 'a' <= r && r <= 'z' || 'A' <= r && r <= 'Z' || unicode.SimpleFold(r) != r +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#string·isspace +func string_isspace(_ *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + if err := UnpackPositionalArgs(b.Name(), args, kwargs, 0); err != nil { + return nil, err + } + recv := string(b.Receiver().(String)) + for _, r := range recv { + if !unicode.IsSpace(r) { + return False, nil + } + } + return Bool(recv != ""), nil +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#string·istitle +func string_istitle(_ *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + if err := UnpackPositionalArgs(b.Name(), args, kwargs, 0); err != nil { + return nil, err + } + recv := string(b.Receiver().(String)) + + // Python semantics differ from x==strings.{To,}Title(x) in Go: + // "uppercase characters may only follow uncased characters and + // lowercase characters only cased ones." + var cased, prevCased bool + for _, r := range recv { + if 'A' <= r && r <= 'Z' || unicode.IsTitle(r) { // e.g. "Dž" + if prevCased { + return False, nil + } + prevCased = true + cased = true + } else if unicode.IsLower(r) { + if !prevCased { + return False, nil + } + prevCased = true + cased = true + } else if unicode.IsUpper(r) { + return False, nil + } else { + prevCased = false + } + } + return Bool(cased), nil +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#string·isupper +func string_isupper(_ *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + if err := UnpackPositionalArgs(b.Name(), args, kwargs, 0); err != nil { + return nil, err + } + recv := string(b.Receiver().(String)) + return Bool(isCasedString(recv) && recv == strings.ToUpper(recv)), nil +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#string·find +func string_find(_ *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + return string_find_impl(b, args, kwargs, true, false) +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#string·format +func string_format(_ *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + format := string(b.Receiver().(String)) + var auto, manual bool // kinds of positional indexing used + buf := new(strings.Builder) + index := 0 + for { + literal := format + i := strings.IndexByte(format, '{') + if i >= 0 { + literal = format[:i] + } + + // Replace "}}" with "}" in non-field portion, rejecting a lone '}'. + for { + j := strings.IndexByte(literal, '}') + if j < 0 { + buf.WriteString(literal) + break + } + if len(literal) == j+1 || literal[j+1] != '}' { + return nil, fmt.Errorf("format: single '}' in format") + } + buf.WriteString(literal[:j+1]) + literal = literal[j+2:] + } + + if i < 0 { + break // end of format string + } + + if i+1 < len(format) && format[i+1] == '{' { + // "{{" means a literal '{' + buf.WriteByte('{') + format = format[i+2:] + continue + } + + format = format[i+1:] + i = strings.IndexByte(format, '}') + if i < 0 { + return nil, fmt.Errorf("format: unmatched '{' in format") + } + + var arg Value + conv := "s" + var spec string + + field := format[:i] + format = format[i+1:] + + var name string + if i := strings.IndexByte(field, '!'); i < 0 { + // "name" or "name:spec" + if i := strings.IndexByte(field, ':'); i < 0 { + name = field + } else { + name = field[:i] + spec = field[i+1:] + } + } else { + // "name!conv" or "name!conv:spec" + name = field[:i] + field = field[i+1:] + // "conv" or "conv:spec" + if i := strings.IndexByte(field, ':'); i < 0 { + conv = field + } else { + conv = field[:i] + spec = field[i+1:] + } + } + + if name == "" { + // "{}": automatic indexing + if manual { + return nil, fmt.Errorf("format: cannot switch from manual field specification to automatic field numbering") + } + auto = true + if index >= len(args) { + return nil, fmt.Errorf("format: tuple index out of range") + } + arg = args[index] + index++ + } else if num, ok := decimal(name); ok { + // positional argument + if auto { + return nil, fmt.Errorf("format: cannot switch from automatic field numbering to manual field specification") + } + manual = true + if num >= len(args) { + return nil, fmt.Errorf("format: tuple index out of range") + } else { + arg = args[num] + } + } else { + // keyword argument + for _, kv := range kwargs { + if string(kv[0].(String)) == name { + arg = kv[1] + break + } + } + if arg == nil { + // Starlark does not support Python's x.y or a[i] syntaxes, + // or nested use of {...}. + if strings.Contains(name, ".") { + return nil, fmt.Errorf("format: attribute syntax x.y is not supported in replacement fields: %s", name) + } + if strings.Contains(name, "[") { + return nil, fmt.Errorf("format: element syntax a[i] is not supported in replacement fields: %s", name) + } + if strings.Contains(name, "{") { + return nil, fmt.Errorf("format: nested replacement fields not supported") + } + return nil, fmt.Errorf("format: keyword %s not found", name) + } + } + + if spec != "" { + // Starlark does not support Python's format_spec features. + return nil, fmt.Errorf("format spec features not supported in replacement fields: %s", spec) + } + + switch conv { + case "s": + if str, ok := AsString(arg); ok { + buf.WriteString(str) + } else { + writeValue(buf, arg, nil) + } + case "r": + writeValue(buf, arg, nil) + default: + return nil, fmt.Errorf("format: unknown conversion %q", conv) + } + } + return String(buf.String()), nil +} + +// decimal interprets s as a sequence of decimal digits. +func decimal(s string) (x int, ok bool) { + n := len(s) + for i := 0; i < n; i++ { + digit := s[i] - '0' + if digit > 9 { + return 0, false + } + x = x*10 + int(digit) + if x < 0 { + return 0, false // underflow + } + } + return x, true +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#string·index +func string_index(_ *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + return string_find_impl(b, args, kwargs, false, false) +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#string·join +func string_join(_ *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + recv := string(b.Receiver().(String)) + var iterable Iterable + if err := UnpackPositionalArgs(b.Name(), args, kwargs, 1, &iterable); err != nil { + return nil, err + } + iter := iterable.Iterate() + defer iter.Done() + buf := new(strings.Builder) + var x Value + for i := 0; iter.Next(&x); i++ { + if i > 0 { + buf.WriteString(recv) + } + s, ok := AsString(x) + if !ok { + return nil, fmt.Errorf("join: in list, want string, got %s", x.Type()) + } + buf.WriteString(s) + } + return String(buf.String()), nil +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#string·lower +func string_lower(_ *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + if err := UnpackPositionalArgs(b.Name(), args, kwargs, 0); err != nil { + return nil, err + } + return String(strings.ToLower(string(b.Receiver().(String)))), nil +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#string·partition +func string_partition(_ *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + recv := string(b.Receiver().(String)) + var sep string + if err := UnpackPositionalArgs(b.Name(), args, kwargs, 1, &sep); err != nil { + return nil, err + } + if sep == "" { + return nil, nameErr(b, "empty separator") + } + var i int + if b.Name()[0] == 'p' { + i = strings.Index(recv, sep) // partition + } else { + i = strings.LastIndex(recv, sep) // rpartition + } + tuple := make(Tuple, 0, 3) + if i < 0 { + if b.Name()[0] == 'p' { + tuple = append(tuple, String(recv), String(""), String("")) + } else { + tuple = append(tuple, String(""), String(""), String(recv)) + } + } else { + tuple = append(tuple, String(recv[:i]), String(sep), String(recv[i+len(sep):])) + } + return tuple, nil +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#string·replace +func string_replace(_ *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + recv := string(b.Receiver().(String)) + var old, new string + count := -1 + if err := UnpackPositionalArgs(b.Name(), args, kwargs, 2, &old, &new, &count); err != nil { + return nil, err + } + return String(strings.Replace(recv, old, new, count)), nil +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#string·rfind +func string_rfind(_ *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + return string_find_impl(b, args, kwargs, true, true) +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#string·rindex +func string_rindex(_ *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + return string_find_impl(b, args, kwargs, false, true) +} + +// https://github.com/google/starlark-go/starlark/blob/master/doc/spec.md#string·startswith +// https://github.com/google/starlark-go/starlark/blob/master/doc/spec.md#string·endswith +func string_startswith(_ *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + var x Value + var start, end Value = None, None + if err := UnpackPositionalArgs(b.Name(), args, kwargs, 1, &x, &start, &end); err != nil { + return nil, err + } + + // compute effective substring. + s := string(b.Receiver().(String)) + if start, end, err := indices(start, end, len(s)); err != nil { + return nil, nameErr(b, err) + } else { + if end < start { + end = start // => empty result + } + s = s[start:end] + } + + f := strings.HasPrefix + if b.Name()[0] == 'e' { // endswith + f = strings.HasSuffix + } + + switch x := x.(type) { + case Tuple: + for i, x := range x { + prefix, ok := AsString(x) + if !ok { + return nil, fmt.Errorf("%s: want string, got %s, for element %d", + b.Name(), x.Type(), i) + } + if f(s, prefix) { + return True, nil + } + } + return False, nil + case String: + return Bool(f(s, string(x))), nil + } + return nil, fmt.Errorf("%s: got %s, want string or tuple of string", b.Name(), x.Type()) +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#string·strip +// https://github.com/google/starlark-go/blob/master/doc/spec.md#string·lstrip +// https://github.com/google/starlark-go/blob/master/doc/spec.md#string·rstrip +func string_strip(_ *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + var chars string + if err := UnpackPositionalArgs(b.Name(), args, kwargs, 0, &chars); err != nil { + return nil, err + } + recv := string(b.Receiver().(String)) + var s string + switch b.Name()[0] { + case 's': // strip + if chars != "" { + s = strings.Trim(recv, chars) + } else { + s = strings.TrimSpace(recv) + } + case 'l': // lstrip + if chars != "" { + s = strings.TrimLeft(recv, chars) + } else { + s = strings.TrimLeftFunc(recv, unicode.IsSpace) + } + case 'r': // rstrip + if chars != "" { + s = strings.TrimRight(recv, chars) + } else { + s = strings.TrimRightFunc(recv, unicode.IsSpace) + } + } + return String(s), nil +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#string·title +func string_title(_ *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + if err := UnpackPositionalArgs(b.Name(), args, kwargs, 0); err != nil { + return nil, err + } + + s := string(b.Receiver().(String)) + + // Python semantics differ from x==strings.{To,}Title(x) in Go: + // "uppercase characters may only follow uncased characters and + // lowercase characters only cased ones." + buf := new(strings.Builder) + buf.Grow(len(s)) + var prevCased bool + for _, r := range s { + if prevCased { + r = unicode.ToLower(r) + } else { + r = unicode.ToTitle(r) + } + prevCased = isCasedRune(r) + buf.WriteRune(r) + } + return String(buf.String()), nil +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#string·upper +func string_upper(_ *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + if err := UnpackPositionalArgs(b.Name(), args, kwargs, 0); err != nil { + return nil, err + } + return String(strings.ToUpper(string(b.Receiver().(String)))), nil +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#string·split +// https://github.com/google/starlark-go/blob/master/doc/spec.md#string·rsplit +func string_split(_ *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + recv := string(b.Receiver().(String)) + var sep_ Value + maxsplit := -1 + if err := UnpackPositionalArgs(b.Name(), args, kwargs, 0, &sep_, &maxsplit); err != nil { + return nil, err + } + + var res []string + + if sep_ == nil || sep_ == None { + // special case: split on whitespace + if maxsplit < 0 { + res = strings.Fields(recv) + } else if b.Name() == "split" { + res = splitspace(recv, maxsplit) + } else { // rsplit + res = rsplitspace(recv, maxsplit) + } + + } else if sep, ok := AsString(sep_); ok { + if sep == "" { + return nil, fmt.Errorf("split: empty separator") + } + // usual case: split on non-empty separator + if maxsplit < 0 { + res = strings.Split(recv, sep) + } else if b.Name() == "split" { + res = strings.SplitN(recv, sep, maxsplit+1) + } else { // rsplit + res = strings.Split(recv, sep) + if excess := len(res) - maxsplit; excess > 0 { + res[0] = strings.Join(res[:excess], sep) + res = append(res[:1], res[excess:]...) + } + } + + } else { + return nil, fmt.Errorf("split: got %s for separator, want string", sep_.Type()) + } + + list := make([]Value, len(res)) + for i, x := range res { + list[i] = String(x) + } + return NewList(list), nil +} + +// Precondition: max >= 0. +func rsplitspace(s string, max int) []string { + res := make([]string, 0, max+1) + end := -1 // index of field end, or -1 in a region of spaces. + for i := len(s); i > 0; { + r, sz := utf8.DecodeLastRuneInString(s[:i]) + if unicode.IsSpace(r) { + if end >= 0 { + if len(res) == max { + break // let this field run to the start + } + res = append(res, s[i:end]) + end = -1 + } + } else if end < 0 { + end = i + } + i -= sz + } + if end >= 0 { + res = append(res, s[:end]) + } + + resLen := len(res) + for i := 0; i < resLen/2; i++ { + res[i], res[resLen-1-i] = res[resLen-1-i], res[i] + } + + return res +} + +// Precondition: max >= 0. +func splitspace(s string, max int) []string { + var res []string + start := -1 // index of field start, or -1 in a region of spaces + for i, r := range s { + if unicode.IsSpace(r) { + if start >= 0 { + if len(res) == max { + break // let this field run to the end + } + res = append(res, s[start:i]) + start = -1 + } + } else if start == -1 { + start = i + } + } + if start >= 0 { + res = append(res, s[start:]) + } + return res +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#string·splitlines +func string_splitlines(_ *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + var keepends bool + if err := UnpackPositionalArgs(b.Name(), args, kwargs, 0, &keepends); err != nil { + return nil, err + } + var lines []string + if s := string(b.Receiver().(String)); s != "" { + // TODO(adonovan): handle CRLF correctly. + if keepends { + lines = strings.SplitAfter(s, "\n") + } else { + lines = strings.Split(s, "\n") + } + if strings.HasSuffix(s, "\n") { + lines = lines[:len(lines)-1] + } + } + list := make([]Value, len(lines)) + for i, x := range lines { + list[i] = String(x) + } + return NewList(list), nil +} + +// https://github.com/google/starlark-go/blob/master/doc/spec.md#set·union. +func set_union(_ *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { + var iterable Iterable + if err := UnpackPositionalArgs(b.Name(), args, kwargs, 0, &iterable); err != nil { + return nil, err + } + iter := iterable.Iterate() + defer iter.Done() + union, err := b.Receiver().(*Set).Union(iter) + if err != nil { + return nil, nameErr(b, err) + } + return union, nil +} + +// Common implementation of string_{r}{find,index}. +func string_find_impl(b *Builtin, args Tuple, kwargs []Tuple, allowError, last bool) (Value, error) { + var sub string + var start_, end_ Value + if err := UnpackPositionalArgs(b.Name(), args, kwargs, 1, &sub, &start_, &end_); err != nil { + return nil, err + } + + s := string(b.Receiver().(String)) + start, end, err := indices(start_, end_, len(s)) + if err != nil { + return nil, nameErr(b, err) + } + var slice string + if start < end { + slice = s[start:end] + } + + var i int + if last { + i = strings.LastIndex(slice, sub) + } else { + i = strings.Index(slice, sub) + } + if i < 0 { + if !allowError { + return nil, nameErr(b, "substring not found") + } + return MakeInt(-1), nil + } + return MakeInt(i + start), nil +} + +// Common implementation of builtin dict function and dict.update method. +// Precondition: len(updates) == 0 or 1. +func updateDict(dict *Dict, updates Tuple, kwargs []Tuple) error { + if len(updates) == 1 { + switch updates := updates[0].(type) { + case IterableMapping: + // Iterate over dict's key/value pairs, not just keys. + for _, item := range updates.Items() { + if err := dict.SetKey(item[0], item[1]); err != nil { + return err // dict is frozen + } + } + default: + // all other sequences + iter := Iterate(updates) + if iter == nil { + return fmt.Errorf("got %s, want iterable", updates.Type()) + } + defer iter.Done() + var pair Value + for i := 0; iter.Next(&pair); i++ { + iter2 := Iterate(pair) + if iter2 == nil { + return fmt.Errorf("dictionary update sequence element #%d is not iterable (%s)", i, pair.Type()) + + } + defer iter2.Done() + len := Len(pair) + if len < 0 { + return fmt.Errorf("dictionary update sequence element #%d has unknown length (%s)", i, pair.Type()) + } else if len != 2 { + return fmt.Errorf("dictionary update sequence element #%d has length %d, want 2", i, len) + } + var k, v Value + iter2.Next(&k) + iter2.Next(&v) + if err := dict.SetKey(k, v); err != nil { + return err + } + } + } + } + + // Then add the kwargs. + before := dict.Len() + for _, pair := range kwargs { + if err := dict.SetKey(pair[0], pair[1]); err != nil { + return err // dict is frozen + } + } + // In the common case, each kwarg will add another dict entry. + // If that's not so, check whether it is because there was a duplicate kwarg. + if dict.Len() < before+len(kwargs) { + keys := make(map[String]bool, len(kwargs)) + for _, kv := range kwargs { + k := kv[0].(String) + if keys[k] { + return fmt.Errorf("duplicate keyword arg: %v", k) + } + keys[k] = true + } + } + + return nil +} + +// nameErr returns an error message of the form "name: msg" +// where name is b.Name() and msg is a string or error. +func nameErr(b *Builtin, msg interface{}) error { + return fmt.Errorf("%s: %v", b.Name(), msg) +} diff --git a/vendor/go.starlark.net/starlark/profile.go b/vendor/go.starlark.net/starlark/profile.go new file mode 100644 index 000000000000..38da2b2e9ff2 --- /dev/null +++ b/vendor/go.starlark.net/starlark/profile.go @@ -0,0 +1,449 @@ +// Copyright 2019 The Bazel Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package starlark + +// This file defines a simple execution-time profiler for Starlark. +// It measures the wall time spent executing Starlark code, and emits a +// gzipped protocol message in pprof format (github.com/google/pprof). +// +// When profiling is enabled, the interpreter calls the profiler to +// indicate the start and end of each "span" or time interval. A leaf +// function (whether Go or Starlark) has a single span. A function that +// calls another function has spans for each interval in which it is the +// top of the stack. (A LOAD instruction also ends a span.) +// +// At the start of a span, the interpreter records the current time in +// the thread's topmost frame. At the end of the span, it obtains the +// time again and subtracts the span start time. The difference is added +// to an accumulator variable in the thread. If the accumulator exceeds +// some fixed quantum (10ms, say), the profiler records the current call +// stack and sends it to the profiler goroutine, along with the number +// of quanta, which are subtracted. For example, if the accumulator +// holds 3ms and then a completed span adds 25ms to it, its value is 28ms, +// which exceeeds 10ms. The profiler records a stack with the value 20ms +// (2 quanta), and the accumulator is left with 8ms. +// +// The profiler goroutine converts the stacks into the pprof format and +// emits a gzip-compressed protocol message to the designated output +// file. We use a hand-written streaming proto encoder to avoid +// dependencies on pprof and proto, and to avoid the need to +// materialize the profile data structure in memory. +// +// A limitation of this profiler is that it measures wall time, which +// does not necessarily correspond to CPU time. A CPU profiler requires +// that only running (not runnable) threads are sampled; this is +// commonly achieved by having the kernel deliver a (PROF) signal to an +// arbitrary running thread, through setitimer(2). The CPU profiler in the +// Go runtime uses this mechanism, but it is not possible for a Go +// application to register a SIGPROF handler, nor is it possible for a +// Go handler for some other signal to read the stack pointer of +// the interrupted thread. +// +// Two caveats: +// (1) it is tempting to send the leaf Frame directly to the profiler +// goroutine instead of making a copy of the stack, since a Frame is a +// spaghetti stack--a linked list. However, as soon as execution +// resumes, the stack's Frame.pc values may be mutated, so Frames are +// not safe to share with the asynchronous profiler goroutine. +// (2) it is tempting to use Callables as keys in a map when tabulating +// the pprof protocols's Function entities. However, we cannot assume +// that Callables are valid map keys, and furthermore we must not +// pin function values in memory indefinitely as this may cause lambda +// values to keep their free variables live much longer than necessary. + +// TODO(adonovan): +// - make Start/Stop fully thread-safe. +// - fix the pc hack. +// - experiment with other values of quantum. + +import ( + "bufio" + "bytes" + "compress/gzip" + "encoding/binary" + "fmt" + "io" + "log" + "reflect" + "sync/atomic" + "time" + "unsafe" + + "go.starlark.net/syntax" +) + +// StartProfile enables time profiling of all Starlark threads, +// and writes a profile in pprof format to w. +// It must be followed by a call to StopProfiler to stop +// the profiler and finalize the profile. +// +// StartProfile returns an error if profiling was already enabled. +// +// StartProfile must not be called concurrently with Starlark execution. +func StartProfile(w io.Writer) error { + if !atomic.CompareAndSwapUint32(&profiler.on, 0, 1) { + return fmt.Errorf("profiler already running") + } + + // TODO(adonovan): make the API fully concurrency-safe. + // The main challenge is racy reads/writes of profiler.events, + // and of send/close races on the channel it refers to. + // It's easy to solve them with a mutex but harder to do + // it efficiently. + + profiler.events = make(chan *profEvent, 1) + profiler.done = make(chan error) + + go profile(w) + + return nil +} + +// StopProfiler stops the profiler started by a prior call to +// StartProfile and finalizes the profile. It returns an error if the +// profile could not be completed. +// +// StopProfiler must not be called concurrently with Starlark execution. +func StopProfile() error { + // Terminate the profiler goroutine and get its result. + close(profiler.events) + err := <-profiler.done + + profiler.done = nil + profiler.events = nil + atomic.StoreUint32(&profiler.on, 0) + + return err +} + +// globals +var profiler struct { + on uint32 // nonzero => profiler running + events chan *profEvent // profile events from interpreter threads + done chan error // indicates profiler goroutine is ready +} + +func (thread *Thread) beginProfSpan() { + if profiler.events == nil { + return // profiling not enabled + } + + thread.frameAt(0).spanStart = nanotime() +} + +// TODO(adonovan): experiment with smaller values, +// which trade space and time for greater precision. +const quantum = 10 * time.Millisecond + +func (thread *Thread) endProfSpan() { + if profiler.events == nil { + return // profiling not enabled + } + + // Add the span to the thread's accumulator. + thread.proftime += time.Duration(nanotime() - thread.frameAt(0).spanStart) + if thread.proftime < quantum { + return + } + + // Only record complete quanta. + n := thread.proftime / quantum + thread.proftime -= n * quantum + + // Copy the stack. + // (We can't save thread.frame because its pc will change.) + ev := &profEvent{ + thread: thread, + time: n * quantum, + } + ev.stack = ev.stackSpace[:0] + for i := range thread.stack { + fr := thread.frameAt(i) + ev.stack = append(ev.stack, profFrame{ + pos: fr.Position(), + fn: fr.Callable(), + pc: fr.pc, + }) + } + + profiler.events <- ev +} + +type profEvent struct { + thread *Thread // currently unused + time time.Duration + stack []profFrame + stackSpace [8]profFrame // initial space for stack +} + +type profFrame struct { + fn Callable // don't hold this live for too long (prevents GC of lambdas) + pc uint32 // program counter (Starlark frames only) + pos syntax.Position // position of pc within this frame +} + +// profile is the profiler goroutine. +// It runs until StopProfiler is called. +func profile(w io.Writer) { + // Field numbers from pprof protocol. + // See https://github.com/google/pprof/blob/master/proto/profile.proto + const ( + Profile_sample_type = 1 // repeated ValueType + Profile_sample = 2 // repeated Sample + Profile_mapping = 3 // repeated Mapping + Profile_location = 4 // repeated Location + Profile_function = 5 // repeated Function + Profile_string_table = 6 // repeated string + Profile_time_nanos = 9 // int64 + Profile_duration_nanos = 10 // int64 + Profile_period_type = 11 // ValueType + Profile_period = 12 // int64 + + ValueType_type = 1 // int64 + ValueType_unit = 2 // int64 + + Sample_location_id = 1 // repeated uint64 + Sample_value = 2 // repeated int64 + Sample_label = 3 // repeated Label + + Label_key = 1 // int64 + Label_str = 2 // int64 + Label_num = 3 // int64 + Label_num_unit = 4 // int64 + + Location_id = 1 // uint64 + Location_mapping_id = 2 // uint64 + Location_address = 3 // uint64 + Location_line = 4 // repeated Line + + Line_function_id = 1 // uint64 + Line_line = 2 // int64 + + Function_id = 1 // uint64 + Function_name = 2 // int64 + Function_system_name = 3 // int64 + Function_filename = 4 // int64 + Function_start_line = 5 // int64 + ) + + bufw := bufio.NewWriter(w) // write file in 4KB (not 240B flate-sized) chunks + gz := gzip.NewWriter(bufw) + enc := protoEncoder{w: gz} + + // strings + stringIndex := make(map[string]int64) + str := func(s string) int64 { + i, ok := stringIndex[s] + if !ok { + i = int64(len(stringIndex)) + enc.string(Profile_string_table, s) + stringIndex[s] = i + } + return i + } + str("") // entry 0 + + // functions + // + // function returns the ID of a Callable for use in Line.FunctionId. + // The ID is the same as the function's logical address, + // which is supplied by the caller to avoid the need to recompute it. + functionId := make(map[uintptr]uint64) + function := func(fn Callable, addr uintptr) uint64 { + id, ok := functionId[addr] + if !ok { + id = uint64(addr) + + var pos syntax.Position + if fn, ok := fn.(callableWithPosition); ok { + pos = fn.Position() + } + + name := fn.Name() + if name == "" { + name = pos.Filename() + } + + nameIndex := str(name) + + fun := new(bytes.Buffer) + funenc := protoEncoder{w: fun} + funenc.uint(Function_id, id) + funenc.int(Function_name, nameIndex) + funenc.int(Function_system_name, nameIndex) + funenc.int(Function_filename, str(pos.Filename())) + funenc.int(Function_start_line, int64(pos.Line)) + enc.bytes(Profile_function, fun.Bytes()) + + functionId[addr] = id + } + return id + } + + // locations + // + // location returns the ID of the location denoted by fr. + // For Starlark frames, this is the Frame pc. + locationId := make(map[uintptr]uint64) + location := func(fr profFrame) uint64 { + fnAddr := profFuncAddr(fr.fn) + + // For Starlark functions, the frame position + // represents the current PC value. + // Mix it into the low bits of the address. + // This is super hacky and may result in collisions + // in large functions or if functions are numerous. + // TODO(adonovan): fix: try making this cleaner by treating + // each bytecode segment as a Profile.Mapping. + pcAddr := fnAddr + if _, ok := fr.fn.(*Function); ok { + pcAddr = (pcAddr << 16) ^ uintptr(fr.pc) + } + + id, ok := locationId[pcAddr] + if !ok { + id = uint64(pcAddr) + + line := new(bytes.Buffer) + lineenc := protoEncoder{w: line} + lineenc.uint(Line_function_id, function(fr.fn, fnAddr)) + lineenc.int(Line_line, int64(fr.pos.Line)) + loc := new(bytes.Buffer) + locenc := protoEncoder{w: loc} + locenc.uint(Location_id, id) + locenc.uint(Location_address, uint64(pcAddr)) + locenc.bytes(Location_line, line.Bytes()) + enc.bytes(Profile_location, loc.Bytes()) + + locationId[pcAddr] = id + } + return id + } + + wallNanos := new(bytes.Buffer) + wnenc := protoEncoder{w: wallNanos} + wnenc.int(ValueType_type, str("wall")) + wnenc.int(ValueType_unit, str("nanoseconds")) + + // informational fields of Profile + enc.bytes(Profile_sample_type, wallNanos.Bytes()) + enc.int(Profile_period, quantum.Nanoseconds()) // magnitude of sampling period + enc.bytes(Profile_period_type, wallNanos.Bytes()) // dimension and unit of period + enc.int(Profile_time_nanos, time.Now().UnixNano()) // start (real) time of profile + + startNano := nanotime() + + // Read profile events from the channel + // until it is closed by StopProfiler. + for e := range profiler.events { + sample := new(bytes.Buffer) + sampleenc := protoEncoder{w: sample} + sampleenc.int(Sample_value, e.time.Nanoseconds()) // wall nanoseconds + for _, fr := range e.stack { + sampleenc.uint(Sample_location_id, location(fr)) + } + enc.bytes(Profile_sample, sample.Bytes()) + } + + endNano := nanotime() + enc.int(Profile_duration_nanos, endNano-startNano) + + err := gz.Close() // Close reports any prior write error + if flushErr := bufw.Flush(); err == nil { + err = flushErr + } + profiler.done <- err +} + +// nanotime returns the time in nanoseconds since epoch. +// It is implemented by runtime.nanotime using the linkname hack; +// runtime.nanotime is defined for all OSs/ARCHS and uses the +// monotonic system clock, which there is no portable way to access. +// Should that function ever go away, these alternatives exist: +// +// // POSIX only. REALTIME not MONOTONIC. 17ns. +// var tv syscall.Timeval +// syscall.Gettimeofday(&tv) // can't fail +// return tv.Nano() +// +// // Portable. REALTIME not MONOTONIC. 46ns. +// return time.Now().Nanoseconds() +// +// // POSIX only. Adds a dependency. +// import "golang.org/x/sys/unix" +// var ts unix.Timespec +// unix.ClockGettime(CLOCK_MONOTONIC, &ts) // can't fail +// return unix.TimespecToNsec(ts) +// +//go:linkname nanotime runtime.nanotime +func nanotime() int64 + +// profFuncAddr returns the canonical "address" +// of a Callable for use by the profiler. +func profFuncAddr(fn Callable) uintptr { + switch fn := fn.(type) { + case *Builtin: + return reflect.ValueOf(fn.fn).Pointer() + case *Function: + return uintptr(unsafe.Pointer(fn.funcode)) + } + + // User-defined callable types are typically of + // of kind pointer-to-struct. Handle them specially. + if v := reflect.ValueOf(fn); v.Type().Kind() == reflect.Ptr { + return v.Pointer() + } + + // Address zero is reserved by the protocol. + // Use 1 for callables we don't recognize. + log.Printf("Starlark profiler: no address for Callable %T", fn) + return 1 +} + +// We encode the protocol message by hand to avoid making +// the interpreter depend on both github.com/google/pprof +// and github.com/golang/protobuf. +// +// This also avoids the need to materialize a protocol message object +// tree of unbounded size and serialize it all at the end. +// The pprof format appears to have been designed to +// permit streaming implementations such as this one. +// +// See https://developers.google.com/protocol-buffers/docs/encoding. +type protoEncoder struct { + w io.Writer // *bytes.Buffer or *gzip.Writer + tmp [binary.MaxVarintLen64]byte +} + +func (e *protoEncoder) uvarint(x uint64) { + n := binary.PutUvarint(e.tmp[:], x) + e.w.Write(e.tmp[:n]) +} + +func (e *protoEncoder) tag(field, wire uint) { + e.uvarint(uint64(field<<3 | wire)) +} + +func (e *protoEncoder) string(field uint, s string) { + e.tag(field, 2) // length-delimited + e.uvarint(uint64(len(s))) + io.WriteString(e.w, s) +} + +func (e *protoEncoder) bytes(field uint, b []byte) { + e.tag(field, 2) // length-delimited + e.uvarint(uint64(len(b))) + e.w.Write(b) +} + +func (e *protoEncoder) uint(field uint, x uint64) { + e.tag(field, 0) // varint + e.uvarint(x) +} + +func (e *protoEncoder) int(field uint, x int64) { + e.tag(field, 0) // varint + e.uvarint(uint64(x)) +} diff --git a/vendor/go.starlark.net/starlark/unpack.go b/vendor/go.starlark.net/starlark/unpack.go new file mode 100644 index 000000000000..6c870f951ebe --- /dev/null +++ b/vendor/go.starlark.net/starlark/unpack.go @@ -0,0 +1,258 @@ +package starlark + +// This file defines the Unpack helper functions used by +// built-in functions to interpret their call arguments. + +import ( + "fmt" + "log" + "reflect" + "strings" +) + +// UnpackArgs unpacks the positional and keyword arguments into the +// supplied parameter variables. pairs is an alternating list of names +// and pointers to variables. +// +// If the variable is a bool, int, string, *List, *Dict, Callable, +// Iterable, or user-defined implementation of Value, +// UnpackArgs performs the appropriate type check. +// An int uses the AsInt32 check. +// If the parameter name ends with "?", +// it and all following parameters are optional. +// +// If the variable implements Value, UnpackArgs may call +// its Type() method while constructing the error message. +// +// Beware: an optional *List, *Dict, Callable, Iterable, or Value variable that is +// not assigned is not a valid Starlark Value, so the caller must +// explicitly handle such cases by interpreting nil as None or some +// computed default. +func UnpackArgs(fnname string, args Tuple, kwargs []Tuple, pairs ...interface{}) error { + nparams := len(pairs) / 2 + var defined intset + defined.init(nparams) + + paramName := func(x interface{}) string { // (no free variables) + name := x.(string) + if name[len(name)-1] == '?' { + name = name[:len(name)-1] + } + return name + } + + // positional arguments + if len(args) > nparams { + return fmt.Errorf("%s: got %d arguments, want at most %d", + fnname, len(args), nparams) + } + for i, arg := range args { + defined.set(i) + if err := unpackOneArg(arg, pairs[2*i+1]); err != nil { + name := paramName(pairs[2*i]) + return fmt.Errorf("%s: for parameter %s: %s", fnname, name, err) + } + } + + // keyword arguments +kwloop: + for _, item := range kwargs { + name, arg := item[0].(String), item[1] + for i := 0; i < nparams; i++ { + if paramName(pairs[2*i]) == string(name) { + // found it + if defined.set(i) { + return fmt.Errorf("%s: got multiple values for keyword argument %s", + fnname, name) + } + ptr := pairs[2*i+1] + if err := unpackOneArg(arg, ptr); err != nil { + return fmt.Errorf("%s: for parameter %s: %s", fnname, name, err) + } + continue kwloop + } + } + return fmt.Errorf("%s: unexpected keyword argument %s", fnname, name) + } + + // Check that all non-optional parameters are defined. + // (We needn't check the first len(args).) + for i := len(args); i < nparams; i++ { + name := pairs[2*i].(string) + if strings.HasSuffix(name, "?") { + break // optional + } + if !defined.get(i) { + return fmt.Errorf("%s: missing argument for %s", fnname, name) + } + } + + return nil +} + +// UnpackPositionalArgs unpacks the positional arguments into +// corresponding variables. Each element of vars is a pointer; see +// UnpackArgs for allowed types and conversions. +// +// UnpackPositionalArgs reports an error if the number of arguments is +// less than min or greater than len(vars), if kwargs is nonempty, or if +// any conversion fails. +func UnpackPositionalArgs(fnname string, args Tuple, kwargs []Tuple, min int, vars ...interface{}) error { + if len(kwargs) > 0 { + return fmt.Errorf("%s: unexpected keyword arguments", fnname) + } + max := len(vars) + if len(args) < min { + var atleast string + if min < max { + atleast = "at least " + } + return fmt.Errorf("%s: got %d arguments, want %s%d", fnname, len(args), atleast, min) + } + if len(args) > max { + var atmost string + if max > min { + atmost = "at most " + } + return fmt.Errorf("%s: got %d arguments, want %s%d", fnname, len(args), atmost, max) + } + for i, arg := range args { + if err := unpackOneArg(arg, vars[i]); err != nil { + return fmt.Errorf("%s: for parameter %d: %s", fnname, i+1, err) + } + } + return nil +} + +func unpackOneArg(v Value, ptr interface{}) error { + // On failure, don't clobber *ptr. + switch ptr := ptr.(type) { + case *Value: + *ptr = v + case *string: + s, ok := AsString(v) + if !ok { + return fmt.Errorf("got %s, want string", v.Type()) + } + *ptr = s + case *bool: + b, ok := v.(Bool) + if !ok { + return fmt.Errorf("got %s, want bool", v.Type()) + } + *ptr = bool(b) + case *int: + i, err := AsInt32(v) + if err != nil { + return err + } + *ptr = i + case **List: + list, ok := v.(*List) + if !ok { + return fmt.Errorf("got %s, want list", v.Type()) + } + *ptr = list + case **Dict: + dict, ok := v.(*Dict) + if !ok { + return fmt.Errorf("got %s, want dict", v.Type()) + } + *ptr = dict + case *Callable: + f, ok := v.(Callable) + if !ok { + return fmt.Errorf("got %s, want callable", v.Type()) + } + *ptr = f + case *Iterable: + it, ok := v.(Iterable) + if !ok { + return fmt.Errorf("got %s, want iterable", v.Type()) + } + *ptr = it + default: + // v must have type *V, where V is some subtype of starlark.Value. + ptrv := reflect.ValueOf(ptr) + if ptrv.Kind() != reflect.Ptr { + log.Panicf("internal error: not a pointer: %T", ptr) + } + paramVar := ptrv.Elem() + if !reflect.TypeOf(v).AssignableTo(paramVar.Type()) { + // The value is not assignable to the variable. + + // Detect a possible bug in the Go program that called Unpack: + // If the variable *ptr is not a subtype of Value, + // no value of v can possibly work. + if !paramVar.Type().AssignableTo(reflect.TypeOf(new(Value)).Elem()) { + log.Panicf("pointer element type does not implement Value: %T", ptr) + } + + // Report Starlark dynamic type error. + // + // We prefer the Starlark Value.Type name over + // its Go reflect.Type name, but calling the + // Value.Type method on the variable is not safe + // in general. If the variable is an interface, + // the call will fail. Even if the variable has + // a concrete type, it might not be safe to call + // Type() on a zero instance. Thus we must use + // recover. + + // Default to Go reflect.Type name + paramType := paramVar.Type().String() + + // Attempt to call Value.Type method. + func() { + defer func() { recover() }() + paramType = paramVar.MethodByName("Type").Call(nil)[0].String() + }() + return fmt.Errorf("got %s, want %s", v.Type(), paramType) + } + paramVar.Set(reflect.ValueOf(v)) + } + return nil +} + +type intset struct { + small uint64 // bitset, used if n < 64 + large map[int]bool // set, used if n >= 64 +} + +func (is *intset) init(n int) { + if n >= 64 { + is.large = make(map[int]bool) + } +} + +func (is *intset) set(i int) (prev bool) { + if is.large == nil { + prev = is.small&(1< Hash(x) == Hash(y). + // Hash may fail if the value's type is not hashable, or if the value + // contains a non-hashable value. The hash is used only by dictionaries and + // is not exposed to the Starlark program. + Hash() (uint32, error) +} + +// A Comparable is a value that defines its own equivalence relation and +// perhaps ordered comparisons. +type Comparable interface { + Value + // CompareSameType compares one value to another of the same Type(). + // The comparison operation must be one of EQL, NEQ, LT, LE, GT, or GE. + // CompareSameType returns an error if an ordered comparison was + // requested for a type that does not support it. + // + // Implementations that recursively compare subcomponents of + // the value should use the CompareDepth function, not Compare, to + // avoid infinite recursion on cyclic structures. + // + // The depth parameter is used to bound comparisons of cyclic + // data structures. Implementations should decrement depth + // before calling CompareDepth and should return an error if depth + // < 1. + // + // Client code should not call this method. Instead, use the + // standalone Compare or Equals functions, which are defined for + // all pairs of operands. + CompareSameType(op syntax.Token, y Value, depth int) (bool, error) +} + +var ( + _ Comparable = None + _ Comparable = Int{} + _ Comparable = False + _ Comparable = Float(0) + _ Comparable = String("") + _ Comparable = (*Dict)(nil) + _ Comparable = (*List)(nil) + _ Comparable = Tuple(nil) + _ Comparable = (*Set)(nil) +) + +// A Callable value f may be the operand of a function call, f(x). +// +// Clients should use the Call function, never the CallInternal method. +type Callable interface { + Value + Name() string + CallInternal(thread *Thread, args Tuple, kwargs []Tuple) (Value, error) +} + +type callableWithPosition interface { + Callable + Position() syntax.Position +} + +var ( + _ Callable = (*Builtin)(nil) + _ Callable = (*Function)(nil) + _ callableWithPosition = (*Function)(nil) +) + +// An Iterable abstracts a sequence of values. +// An iterable value may be iterated over by a 'for' loop or used where +// any other Starlark iterable is allowed. Unlike a Sequence, the length +// of an Iterable is not necessarily known in advance of iteration. +type Iterable interface { + Value + Iterate() Iterator // must be followed by call to Iterator.Done +} + +// A Sequence is a sequence of values of known length. +type Sequence interface { + Iterable + Len() int +} + +var ( + _ Sequence = (*Dict)(nil) + _ Sequence = (*Set)(nil) +) + +// An Indexable is a sequence of known length that supports efficient random access. +// It is not necessarily iterable. +type Indexable interface { + Value + Index(i int) Value // requires 0 <= i < Len() + Len() int +} + +// A Sliceable is a sequence that can be cut into pieces with the slice operator (x[i:j:step]). +// +// All native indexable objects are sliceable. +// This is a separate interface for backwards-compatibility. +type Sliceable interface { + Indexable + // For positive strides (step > 0), 0 <= start <= end <= n. + // For negative strides (step < 0), -1 <= end <= start < n. + // The caller must ensure that the start and end indices are valid + // and that step is non-zero. + Slice(start, end, step int) Value +} + +// A HasSetIndex is an Indexable value whose elements may be assigned (x[i] = y). +// +// The implementation should not add Len to a negative index as the +// evaluator does this before the call. +type HasSetIndex interface { + Indexable + SetIndex(index int, v Value) error +} + +var ( + _ HasSetIndex = (*List)(nil) + _ Indexable = Tuple(nil) + _ Indexable = String("") + _ Sliceable = Tuple(nil) + _ Sliceable = String("") + _ Sliceable = (*List)(nil) +) + +// An Iterator provides a sequence of values to the caller. +// +// The caller must call Done when the iterator is no longer needed. +// Operations that modify a sequence will fail if it has active iterators. +// +// Example usage: +// +// iter := iterable.Iterator() +// defer iter.Done() +// var x Value +// for iter.Next(&x) { +// ... +// } +// +type Iterator interface { + // If the iterator is exhausted, Next returns false. + // Otherwise it sets *p to the current element of the sequence, + // advances the iterator, and returns true. + Next(p *Value) bool + Done() +} + +// A Mapping is a mapping from keys to values, such as a dictionary. +// +// If a type satisfies both Mapping and Iterable, the iterator yields +// the keys of the mapping. +type Mapping interface { + Value + // Get returns the value corresponding to the specified key, + // or !found if the mapping does not contain the key. + // + // Get also defines the behavior of "v in mapping". + // The 'in' operator reports the 'found' component, ignoring errors. + Get(Value) (v Value, found bool, err error) +} + +// An IterableMapping is a mapping that supports key enumeration. +type IterableMapping interface { + Mapping + Iterate() Iterator // see Iterable interface + Items() []Tuple // a new slice containing all key/value pairs +} + +var _ IterableMapping = (*Dict)(nil) + +// A HasSetKey supports map update using x[k]=v syntax, like a dictionary. +type HasSetKey interface { + Mapping + SetKey(k, v Value) error +} + +var _ HasSetKey = (*Dict)(nil) + +// A HasBinary value may be used as either operand of these binary operators: +// + - * / // % in not in | & ^ << >> +// +// The Side argument indicates whether the receiver is the left or right operand. +// +// An implementation may decline to handle an operation by returning (nil, nil). +// For this reason, clients should always call the standalone Binary(op, x, y) +// function rather than calling the method directly. +type HasBinary interface { + Value + Binary(op syntax.Token, y Value, side Side) (Value, error) +} + +type Side bool + +const ( + Left Side = false + Right Side = true +) + +// A HasUnary value may be used as the operand of these unary operators: +// + - ~ +// +// An implementation may decline to handle an operation by returning (nil, nil). +// For this reason, clients should always call the standalone Unary(op, x) +// function rather than calling the method directly. +type HasUnary interface { + Value + Unary(op syntax.Token) (Value, error) +} + +// A HasAttrs value has fields or methods that may be read by a dot expression (y = x.f). +// Attribute names may be listed using the built-in 'dir' function. +// +// For implementation convenience, a result of (nil, nil) from Attr is +// interpreted as a "no such field or method" error. Implementations are +// free to return a more precise error. +type HasAttrs interface { + Value + Attr(name string) (Value, error) // returns (nil, nil) if attribute not present + AttrNames() []string // callers must not modify the result. +} + +var ( + _ HasAttrs = String("") + _ HasAttrs = new(List) + _ HasAttrs = new(Dict) + _ HasAttrs = new(Set) +) + +// A HasSetField value has fields that may be written by a dot expression (x.f = y). +// +// An implementation of SetField may return a NoSuchAttrError, +// in which case the runtime may augment the error message to +// warn of possible misspelling. +type HasSetField interface { + HasAttrs + SetField(name string, val Value) error +} + +// A NoSuchAttrError may be returned by an implementation of +// HasAttrs.Attr or HasSetField.SetField to indicate that no such field +// exists. In that case the runtime may augment the error message to +// warn of possible misspelling. +type NoSuchAttrError string + +func (e NoSuchAttrError) Error() string { return string(e) } + +// NoneType is the type of None. Its only legal value is None. +// (We represent it as a number, not struct{}, so that None may be constant.) +type NoneType byte + +const None = NoneType(0) + +func (NoneType) String() string { return "None" } +func (NoneType) Type() string { return "NoneType" } +func (NoneType) Freeze() {} // immutable +func (NoneType) Truth() Bool { return False } +func (NoneType) Hash() (uint32, error) { return 0, nil } +func (NoneType) CompareSameType(op syntax.Token, y Value, depth int) (bool, error) { + return threeway(op, 0), nil +} + +// Bool is the type of a Starlark bool. +type Bool bool + +const ( + False Bool = false + True Bool = true +) + +func (b Bool) String() string { + if b { + return "True" + } else { + return "False" + } +} +func (b Bool) Type() string { return "bool" } +func (b Bool) Freeze() {} // immutable +func (b Bool) Truth() Bool { return b } +func (b Bool) Hash() (uint32, error) { return uint32(b2i(bool(b))), nil } +func (x Bool) CompareSameType(op syntax.Token, y_ Value, depth int) (bool, error) { + y := y_.(Bool) + return threeway(op, b2i(bool(x))-b2i(bool(y))), nil +} + +// Float is the type of a Starlark float. +type Float float64 + +func (f Float) String() string { return strconv.FormatFloat(float64(f), 'g', 6, 64) } +func (f Float) Type() string { return "float" } +func (f Float) Freeze() {} // immutable +func (f Float) Truth() Bool { return f != 0.0 } +func (f Float) Hash() (uint32, error) { + // Equal float and int values must yield the same hash. + // TODO(adonovan): opt: if f is non-integral, and thus not equal + // to any Int, we can avoid the Int conversion and use a cheaper hash. + if isFinite(float64(f)) { + return finiteFloatToInt(f).Hash() + } + return 1618033, nil // NaN, +/-Inf +} + +func floor(f Float) Float { return Float(math.Floor(float64(f))) } + +// isFinite reports whether f represents a finite rational value. +// It is equivalent to !math.IsNan(f) && !math.IsInf(f, 0). +func isFinite(f float64) bool { + return math.Abs(f) <= math.MaxFloat64 +} + +func (x Float) CompareSameType(op syntax.Token, y_ Value, depth int) (bool, error) { + y := y_.(Float) + switch op { + case syntax.EQL: + return x == y, nil + case syntax.NEQ: + return x != y, nil + case syntax.LE: + return x <= y, nil + case syntax.LT: + return x < y, nil + case syntax.GE: + return x >= y, nil + case syntax.GT: + return x > y, nil + } + panic(op) +} + +func (f Float) rational() *big.Rat { return new(big.Rat).SetFloat64(float64(f)) } + +// AsFloat returns the float64 value closest to x. +// The f result is undefined if x is not a float or int. +func AsFloat(x Value) (f float64, ok bool) { + switch x := x.(type) { + case Float: + return float64(x), true + case Int: + return float64(x.Float()), true + } + return 0, false +} + +func (x Float) Mod(y Float) Float { return Float(math.Mod(float64(x), float64(y))) } + +// Unary implements the operations +float and -float. +func (f Float) Unary(op syntax.Token) (Value, error) { + switch op { + case syntax.MINUS: + return -f, nil + case syntax.PLUS: + return +f, nil + } + return nil, nil +} + +// String is the type of a Starlark string. +// +// A String encapsulates an an immutable sequence of bytes, +// but strings are not directly iterable. Instead, iterate +// over the result of calling one of these four methods: +// codepoints, codepoint_ords, elems, elem_ords. +// +// Warning: the contract of the Value interface's String method is that +// it returns the value printed in Starlark notation, +// so s.String() or fmt.Sprintf("%s", s) returns a quoted string. +// Use string(s) or s.GoString() or fmt.Sprintf("%#v", s) to obtain the raw contents +// of a Starlark string as a Go string. +type String string + +func (s String) String() string { return strconv.Quote(string(s)) } +func (s String) GoString() string { return string(s) } +func (s String) Type() string { return "string" } +func (s String) Freeze() {} // immutable +func (s String) Truth() Bool { return len(s) > 0 } +func (s String) Hash() (uint32, error) { return hashString(string(s)), nil } +func (s String) Len() int { return len(s) } // bytes +func (s String) Index(i int) Value { return s[i : i+1] } + +func (s String) Slice(start, end, step int) Value { + if step == 1 { + return s[start:end] + } + + sign := signum(step) + var str []byte + for i := start; signum(end-i) == sign; i += step { + str = append(str, s[i]) + } + return String(str) +} + +func (s String) Attr(name string) (Value, error) { return builtinAttr(s, name, stringMethods) } +func (s String) AttrNames() []string { return builtinAttrNames(stringMethods) } + +func (x String) CompareSameType(op syntax.Token, y_ Value, depth int) (bool, error) { + y := y_.(String) + return threeway(op, strings.Compare(string(x), string(y))), nil +} + +func AsString(x Value) (string, bool) { v, ok := x.(String); return string(v), ok } + +// A stringIterable is an iterable whose iterator yields a sequence of +// either Unicode code points or elements (bytes), +// either numerically or as successive substrings. +type stringIterable struct { + s String + ords bool + codepoints bool +} + +var _ Iterable = (*stringIterable)(nil) + +func (si stringIterable) String() string { + var etype string + if si.codepoints { + etype = "codepoint" + } else { + etype = "elem" + } + if si.ords { + return si.s.String() + "." + etype + "_ords()" + } else { + return si.s.String() + "." + etype + "s()" + } +} +func (si stringIterable) Type() string { + if si.codepoints { + return "codepoints" + } else { + return "elems" + } +} +func (si stringIterable) Freeze() {} // immutable +func (si stringIterable) Truth() Bool { return True } +func (si stringIterable) Hash() (uint32, error) { return 0, fmt.Errorf("unhashable: %s", si.Type()) } +func (si stringIterable) Iterate() Iterator { return &stringIterator{si, 0} } + +type stringIterator struct { + si stringIterable + i int +} + +func (it *stringIterator) Next(p *Value) bool { + s := it.si.s[it.i:] + if s == "" { + return false + } + if it.si.codepoints { + r, sz := utf8.DecodeRuneInString(string(s)) + if !it.si.ords { + *p = s[:sz] + } else { + *p = MakeInt(int(r)) + } + it.i += sz + } else { + b := int(s[0]) + if !it.si.ords { + *p = s[:1] + } else { + *p = MakeInt(b) + } + it.i += 1 + } + return true +} + +func (*stringIterator) Done() {} + +// A Function is a function defined by a Starlark def statement or lambda expression. +// The initialization behavior of a Starlark module is also represented by a Function. +type Function struct { + funcode *compile.Funcode + module *module + defaults Tuple + freevars Tuple +} + +// A module is the dynamic counterpart to a Program. +// All functions in the same program share a module. +type module struct { + program *compile.Program + predeclared StringDict + globals []Value + constants []Value +} + +// makeGlobalDict returns a new, unfrozen StringDict containing all global +// variables so far defined in the module. +func (m *module) makeGlobalDict() StringDict { + r := make(StringDict, len(m.program.Globals)) + for i, id := range m.program.Globals { + if v := m.globals[i]; v != nil { + r[id.Name] = v + } + } + return r +} + +func (fn *Function) Name() string { return fn.funcode.Name } // "lambda" for anonymous functions +func (fn *Function) Doc() string { return fn.funcode.Doc } +func (fn *Function) Hash() (uint32, error) { return hashString(fn.funcode.Name), nil } +func (fn *Function) Freeze() { fn.defaults.Freeze(); fn.freevars.Freeze() } +func (fn *Function) String() string { return toString(fn) } +func (fn *Function) Type() string { return "function" } +func (fn *Function) Truth() Bool { return true } + +// Globals returns a new, unfrozen StringDict containing all global +// variables so far defined in the function's module. +func (fn *Function) Globals() StringDict { return fn.module.makeGlobalDict() } + +func (fn *Function) Position() syntax.Position { return fn.funcode.Pos } +func (fn *Function) NumParams() int { return fn.funcode.NumParams } +func (fn *Function) NumKwonlyParams() int { return fn.funcode.NumKwonlyParams } + +// Param returns the name and position of the ith parameter, +// where 0 <= i < NumParams(). +// The *args and **kwargs parameters are at the end +// even if there were optional parameters after *args. +func (fn *Function) Param(i int) (string, syntax.Position) { + if i >= fn.NumParams() { + panic(i) + } + id := fn.funcode.Locals[i] + return id.Name, id.Pos +} +func (fn *Function) HasVarargs() bool { return fn.funcode.HasVarargs } +func (fn *Function) HasKwargs() bool { return fn.funcode.HasKwargs } + +// A Builtin is a function implemented in Go. +type Builtin struct { + name string + fn func(thread *Thread, fn *Builtin, args Tuple, kwargs []Tuple) (Value, error) + recv Value // for bound methods (e.g. "".startswith) +} + +func (b *Builtin) Name() string { return b.name } +func (b *Builtin) Freeze() { + if b.recv != nil { + b.recv.Freeze() + } +} +func (b *Builtin) Hash() (uint32, error) { + h := hashString(b.name) + if b.recv != nil { + h ^= 5521 + } + return h, nil +} +func (b *Builtin) Receiver() Value { return b.recv } +func (b *Builtin) String() string { return toString(b) } +func (b *Builtin) Type() string { return "builtin_function_or_method" } +func (b *Builtin) CallInternal(thread *Thread, args Tuple, kwargs []Tuple) (Value, error) { + return b.fn(thread, b, args, kwargs) +} +func (b *Builtin) Truth() Bool { return true } + +// NewBuiltin returns a new 'builtin_function_or_method' value with the specified name +// and implementation. It compares unequal with all other values. +func NewBuiltin(name string, fn func(thread *Thread, fn *Builtin, args Tuple, kwargs []Tuple) (Value, error)) *Builtin { + return &Builtin{name: name, fn: fn} +} + +// BindReceiver returns a new Builtin value representing a method +// closure, that is, a built-in function bound to a receiver value. +// +// In the example below, the value of f is the string.index +// built-in method bound to the receiver value "abc": +// +// f = "abc".index; f("a"); f("b") +// +// In the common case, the receiver is bound only during the call, +// but this still results in the creation of a temporary method closure: +// +// "abc".index("a") +// +func (b *Builtin) BindReceiver(recv Value) *Builtin { + return &Builtin{name: b.name, fn: b.fn, recv: recv} +} + +// A *Dict represents a Starlark dictionary. +// The zero value of Dict is a valid empty dictionary. +// If you know the exact final number of entries, +// it is more efficient to call NewDict. +type Dict struct { + ht hashtable +} + +// NewDict returns a set with initial space for +// at least size insertions before rehashing. +func NewDict(size int) *Dict { + dict := new(Dict) + dict.ht.init(size) + return dict +} + +func (d *Dict) Clear() error { return d.ht.clear() } +func (d *Dict) Delete(k Value) (v Value, found bool, err error) { return d.ht.delete(k) } +func (d *Dict) Get(k Value) (v Value, found bool, err error) { return d.ht.lookup(k) } +func (d *Dict) Items() []Tuple { return d.ht.items() } +func (d *Dict) Keys() []Value { return d.ht.keys() } +func (d *Dict) Len() int { return int(d.ht.len) } +func (d *Dict) Iterate() Iterator { return d.ht.iterate() } +func (d *Dict) SetKey(k, v Value) error { return d.ht.insert(k, v) } +func (d *Dict) String() string { return toString(d) } +func (d *Dict) Type() string { return "dict" } +func (d *Dict) Freeze() { d.ht.freeze() } +func (d *Dict) Truth() Bool { return d.Len() > 0 } +func (d *Dict) Hash() (uint32, error) { return 0, fmt.Errorf("unhashable type: dict") } + +func (d *Dict) Attr(name string) (Value, error) { return builtinAttr(d, name, dictMethods) } +func (d *Dict) AttrNames() []string { return builtinAttrNames(dictMethods) } + +func (x *Dict) CompareSameType(op syntax.Token, y_ Value, depth int) (bool, error) { + y := y_.(*Dict) + switch op { + case syntax.EQL: + ok, err := dictsEqual(x, y, depth) + return ok, err + case syntax.NEQ: + ok, err := dictsEqual(x, y, depth) + return !ok, err + default: + return false, fmt.Errorf("%s %s %s not implemented", x.Type(), op, y.Type()) + } +} + +func dictsEqual(x, y *Dict, depth int) (bool, error) { + if x.Len() != y.Len() { + return false, nil + } + for _, xitem := range x.Items() { + key, xval := xitem[0], xitem[1] + + if yval, found, _ := y.Get(key); !found { + return false, nil + } else if eq, err := EqualDepth(xval, yval, depth-1); err != nil { + return false, err + } else if !eq { + return false, nil + } + } + return true, nil +} + +// A *List represents a Starlark list value. +type List struct { + elems []Value + frozen bool + itercount uint32 // number of active iterators (ignored if frozen) +} + +// NewList returns a list containing the specified elements. +// Callers should not subsequently modify elems. +func NewList(elems []Value) *List { return &List{elems: elems} } + +func (l *List) Freeze() { + if !l.frozen { + l.frozen = true + for _, elem := range l.elems { + elem.Freeze() + } + } +} + +// checkMutable reports an error if the list should not be mutated. +// verb+" list" should describe the operation. +func (l *List) checkMutable(verb string) error { + if l.frozen { + return fmt.Errorf("cannot %s frozen list", verb) + } + if l.itercount > 0 { + return fmt.Errorf("cannot %s list during iteration", verb) + } + return nil +} + +func (l *List) String() string { return toString(l) } +func (l *List) Type() string { return "list" } +func (l *List) Hash() (uint32, error) { return 0, fmt.Errorf("unhashable type: list") } +func (l *List) Truth() Bool { return l.Len() > 0 } +func (l *List) Len() int { return len(l.elems) } +func (l *List) Index(i int) Value { return l.elems[i] } + +func (l *List) Slice(start, end, step int) Value { + if step == 1 { + elems := append([]Value{}, l.elems[start:end]...) + return NewList(elems) + } + + sign := signum(step) + var list []Value + for i := start; signum(end-i) == sign; i += step { + list = append(list, l.elems[i]) + } + return NewList(list) +} + +func (l *List) Attr(name string) (Value, error) { return builtinAttr(l, name, listMethods) } +func (l *List) AttrNames() []string { return builtinAttrNames(listMethods) } + +func (l *List) Iterate() Iterator { + if !l.frozen { + l.itercount++ + } + return &listIterator{l: l} +} + +func (x *List) CompareSameType(op syntax.Token, y_ Value, depth int) (bool, error) { + y := y_.(*List) + // It's tempting to check x == y as an optimization here, + // but wrong because a list containing NaN is not equal to itself. + return sliceCompare(op, x.elems, y.elems, depth) +} + +func sliceCompare(op syntax.Token, x, y []Value, depth int) (bool, error) { + // Fast path: check length. + if len(x) != len(y) && (op == syntax.EQL || op == syntax.NEQ) { + return op == syntax.NEQ, nil + } + + // Find first element that is not equal in both lists. + for i := 0; i < len(x) && i < len(y); i++ { + if eq, err := EqualDepth(x[i], y[i], depth-1); err != nil { + return false, err + } else if !eq { + switch op { + case syntax.EQL: + return false, nil + case syntax.NEQ: + return true, nil + default: + return CompareDepth(op, x[i], y[i], depth-1) + } + } + } + + return threeway(op, len(x)-len(y)), nil +} + +type listIterator struct { + l *List + i int +} + +func (it *listIterator) Next(p *Value) bool { + if it.i < it.l.Len() { + *p = it.l.elems[it.i] + it.i++ + return true + } + return false +} + +func (it *listIterator) Done() { + if !it.l.frozen { + it.l.itercount-- + } +} + +func (l *List) SetIndex(i int, v Value) error { + if err := l.checkMutable("assign to element of"); err != nil { + return err + } + l.elems[i] = v + return nil +} + +func (l *List) Append(v Value) error { + if err := l.checkMutable("append to"); err != nil { + return err + } + l.elems = append(l.elems, v) + return nil +} + +func (l *List) Clear() error { + if err := l.checkMutable("clear"); err != nil { + return err + } + for i := range l.elems { + l.elems[i] = nil // aid GC + } + l.elems = l.elems[:0] + return nil +} + +// A Tuple represents a Starlark tuple value. +type Tuple []Value + +func (t Tuple) Len() int { return len(t) } +func (t Tuple) Index(i int) Value { return t[i] } + +func (t Tuple) Slice(start, end, step int) Value { + if step == 1 { + return t[start:end] + } + + sign := signum(step) + var tuple Tuple + for i := start; signum(end-i) == sign; i += step { + tuple = append(tuple, t[i]) + } + return tuple +} + +func (t Tuple) Iterate() Iterator { return &tupleIterator{elems: t} } +func (t Tuple) Freeze() { + for _, elem := range t { + elem.Freeze() + } +} +func (t Tuple) String() string { return toString(t) } +func (t Tuple) Type() string { return "tuple" } +func (t Tuple) Truth() Bool { return len(t) > 0 } + +func (x Tuple) CompareSameType(op syntax.Token, y_ Value, depth int) (bool, error) { + y := y_.(Tuple) + return sliceCompare(op, x, y, depth) +} + +func (t Tuple) Hash() (uint32, error) { + // Use same algorithm as Python. + var x, mult uint32 = 0x345678, 1000003 + for _, elem := range t { + y, err := elem.Hash() + if err != nil { + return 0, err + } + x = x ^ y*mult + mult += 82520 + uint32(len(t)+len(t)) + } + return x, nil +} + +type tupleIterator struct{ elems Tuple } + +func (it *tupleIterator) Next(p *Value) bool { + if len(it.elems) > 0 { + *p = it.elems[0] + it.elems = it.elems[1:] + return true + } + return false +} + +func (it *tupleIterator) Done() {} + +// A Set represents a Starlark set value. +// The zero value of Set is a valid empty set. +// If you know the exact final number of elements, +// it is more efficient to call NewSet. +type Set struct { + ht hashtable // values are all None +} + +// NewSet returns a dictionary with initial space for +// at least size insertions before rehashing. +func NewSet(size int) *Set { + set := new(Set) + set.ht.init(size) + return set +} + +func (s *Set) Delete(k Value) (found bool, err error) { _, found, err = s.ht.delete(k); return } +func (s *Set) Clear() error { return s.ht.clear() } +func (s *Set) Has(k Value) (found bool, err error) { _, found, err = s.ht.lookup(k); return } +func (s *Set) Insert(k Value) error { return s.ht.insert(k, None) } +func (s *Set) Len() int { return int(s.ht.len) } +func (s *Set) Iterate() Iterator { return s.ht.iterate() } +func (s *Set) String() string { return toString(s) } +func (s *Set) Type() string { return "set" } +func (s *Set) elems() []Value { return s.ht.keys() } +func (s *Set) Freeze() { s.ht.freeze() } +func (s *Set) Hash() (uint32, error) { return 0, fmt.Errorf("unhashable type: set") } +func (s *Set) Truth() Bool { return s.Len() > 0 } + +func (s *Set) Attr(name string) (Value, error) { return builtinAttr(s, name, setMethods) } +func (s *Set) AttrNames() []string { return builtinAttrNames(setMethods) } + +func (x *Set) CompareSameType(op syntax.Token, y_ Value, depth int) (bool, error) { + y := y_.(*Set) + switch op { + case syntax.EQL: + ok, err := setsEqual(x, y, depth) + return ok, err + case syntax.NEQ: + ok, err := setsEqual(x, y, depth) + return !ok, err + default: + return false, fmt.Errorf("%s %s %s not implemented", x.Type(), op, y.Type()) + } +} + +func setsEqual(x, y *Set, depth int) (bool, error) { + if x.Len() != y.Len() { + return false, nil + } + for _, elem := range x.elems() { + if found, _ := y.Has(elem); !found { + return false, nil + } + } + return true, nil +} + +func (s *Set) Union(iter Iterator) (Value, error) { + set := new(Set) + for _, elem := range s.elems() { + set.Insert(elem) // can't fail + } + var x Value + for iter.Next(&x) { + if err := set.Insert(x); err != nil { + return nil, err + } + } + return set, nil +} + +// toString returns the string form of value v. +// It may be more efficient than v.String() for larger values. +func toString(v Value) string { + buf := new(strings.Builder) + writeValue(buf, v, nil) + return buf.String() +} + +// writeValue writes x to out. +// +// path is used to detect cycles. +// It contains the list of *List and *Dict values we're currently printing. +// (These are the only potentially cyclic structures.) +// Callers should generally pass nil for path. +// It is safe to re-use the same path slice for multiple calls. +func writeValue(out *strings.Builder, x Value, path []Value) { + switch x := x.(type) { + case nil: + out.WriteString("") // indicates a bug + + case NoneType: + out.WriteString("None") + + case Int: + out.WriteString(x.String()) + + case Bool: + if x { + out.WriteString("True") + } else { + out.WriteString("False") + } + + case String: + fmt.Fprintf(out, "%q", string(x)) + + case *List: + out.WriteByte('[') + if pathContains(path, x) { + out.WriteString("...") // list contains itself + } else { + for i, elem := range x.elems { + if i > 0 { + out.WriteString(", ") + } + writeValue(out, elem, append(path, x)) + } + } + out.WriteByte(']') + + case Tuple: + out.WriteByte('(') + for i, elem := range x { + if i > 0 { + out.WriteString(", ") + } + writeValue(out, elem, path) + } + if len(x) == 1 { + out.WriteByte(',') + } + out.WriteByte(')') + + case *Function: + fmt.Fprintf(out, "", x.Name()) + + case *Builtin: + if x.recv != nil { + fmt.Fprintf(out, "", x.Name(), x.recv.Type()) + } else { + fmt.Fprintf(out, "", x.Name()) + } + + case *Dict: + out.WriteByte('{') + if pathContains(path, x) { + out.WriteString("...") // dict contains itself + } else { + sep := "" + for _, item := range x.Items() { + k, v := item[0], item[1] + out.WriteString(sep) + writeValue(out, k, path) + out.WriteString(": ") + writeValue(out, v, append(path, x)) // cycle check + sep = ", " + } + } + out.WriteByte('}') + + case *Set: + out.WriteString("set([") + for i, elem := range x.elems() { + if i > 0 { + out.WriteString(", ") + } + writeValue(out, elem, path) + } + out.WriteString("])") + + default: + out.WriteString(x.String()) + } +} + +func pathContains(path []Value, x Value) bool { + for _, y := range path { + if x == y { + return true + } + } + return false +} + +const maxdepth = 10 + +// Equal reports whether two Starlark values are equal. +func Equal(x, y Value) (bool, error) { + if x, ok := x.(String); ok { + return x == y, nil // fast path for an important special case + } + return EqualDepth(x, y, maxdepth) +} + +// EqualDepth reports whether two Starlark values are equal. +// +// Recursive comparisons by implementations of Value.CompareSameType +// should use EqualDepth to prevent infinite recursion. +func EqualDepth(x, y Value, depth int) (bool, error) { + return CompareDepth(syntax.EQL, x, y, depth) +} + +// Compare compares two Starlark values. +// The comparison operation must be one of EQL, NEQ, LT, LE, GT, or GE. +// Compare returns an error if an ordered comparison was +// requested for a type that does not support it. +// +// Recursive comparisons by implementations of Value.CompareSameType +// should use CompareDepth to prevent infinite recursion. +func Compare(op syntax.Token, x, y Value) (bool, error) { + return CompareDepth(op, x, y, maxdepth) +} + +// CompareDepth compares two Starlark values. +// The comparison operation must be one of EQL, NEQ, LT, LE, GT, or GE. +// CompareDepth returns an error if an ordered comparison was +// requested for a pair of values that do not support it. +// +// The depth parameter limits the maximum depth of recursion +// in cyclic data structures. +func CompareDepth(op syntax.Token, x, y Value, depth int) (bool, error) { + if depth < 1 { + return false, fmt.Errorf("comparison exceeded maximum recursion depth") + } + if sameType(x, y) { + if xcomp, ok := x.(Comparable); ok { + return xcomp.CompareSameType(op, y, depth) + } + + // use identity comparison + switch op { + case syntax.EQL: + return x == y, nil + case syntax.NEQ: + return x != y, nil + } + return false, fmt.Errorf("%s %s %s not implemented", x.Type(), op, y.Type()) + } + + // different types + + // int/float ordered comparisons + switch x := x.(type) { + case Int: + if y, ok := y.(Float); ok { + if y != y { + return false, nil // y is NaN + } + var cmp int + if !math.IsInf(float64(y), 0) { + cmp = x.rational().Cmp(y.rational()) // y is finite + } else if y > 0 { + cmp = -1 // y is +Inf + } else { + cmp = +1 // y is -Inf + } + return threeway(op, cmp), nil + } + case Float: + if y, ok := y.(Int); ok { + if x != x { + return false, nil // x is NaN + } + var cmp int + if !math.IsInf(float64(x), 0) { + cmp = x.rational().Cmp(y.rational()) // x is finite + } else if x > 0 { + cmp = -1 // x is +Inf + } else { + cmp = +1 // x is -Inf + } + return threeway(op, cmp), nil + } + } + + // All other values of different types compare unequal. + switch op { + case syntax.EQL: + return false, nil + case syntax.NEQ: + return true, nil + } + return false, fmt.Errorf("%s %s %s not implemented", x.Type(), op, y.Type()) +} + +func sameType(x, y Value) bool { + return reflect.TypeOf(x) == reflect.TypeOf(y) || x.Type() == y.Type() +} + +// threeway interprets a three-way comparison value cmp (-1, 0, +1) +// as a boolean comparison (e.g. x < y). +func threeway(op syntax.Token, cmp int) bool { + switch op { + case syntax.EQL: + return cmp == 0 + case syntax.NEQ: + return cmp != 0 + case syntax.LE: + return cmp <= 0 + case syntax.LT: + return cmp < 0 + case syntax.GE: + return cmp >= 0 + case syntax.GT: + return cmp > 0 + } + panic(op) +} + +func b2i(b bool) int { + if b { + return 1 + } else { + return 0 + } +} + +// Len returns the length of a string or sequence value, +// and -1 for all others. +// +// Warning: Len(x) >= 0 does not imply Iterate(x) != nil. +// A string has a known length but is not directly iterable. +func Len(x Value) int { + switch x := x.(type) { + case String: + return x.Len() + case Sequence: + return x.Len() + } + return -1 +} + +// Iterate return a new iterator for the value if iterable, nil otherwise. +// If the result is non-nil, the caller must call Done when finished with it. +// +// Warning: Iterate(x) != nil does not imply Len(x) >= 0. +// Some iterables may have unknown length. +func Iterate(x Value) Iterator { + if x, ok := x.(Iterable); ok { + return x.Iterate() + } + return nil +} diff --git a/vendor/go.starlark.net/starlarkstruct/module.go b/vendor/go.starlark.net/starlarkstruct/module.go new file mode 100644 index 000000000000..735c98ae313b --- /dev/null +++ b/vendor/go.starlark.net/starlarkstruct/module.go @@ -0,0 +1,43 @@ +package starlarkstruct + +import ( + "fmt" + + "go.starlark.net/starlark" +) + +// A Module is a named collection of values, +// typically a suite of functions imported by a load statement. +// +// It differs from Struct primarily in that its string representation +// does not enumerate its fields. +type Module struct { + Name string + Members starlark.StringDict +} + +var _ starlark.HasAttrs = (*Module)(nil) + +func (m *Module) Attr(name string) (starlark.Value, error) { return m.Members[name], nil } +func (m *Module) AttrNames() []string { return m.Members.Keys() } +func (m *Module) Freeze() { m.Members.Freeze() } +func (m *Module) Hash() (uint32, error) { return 0, fmt.Errorf("unhashable: %s", m.Type()) } +func (m *Module) String() string { return fmt.Sprintf("", m.Name) } +func (m *Module) Truth() starlark.Bool { return true } +func (m *Module) Type() string { return "module" } + +// MakeModule may be used as the implementation of a Starlark built-in +// function, module(name, **kwargs). It returns a new module with the +// specified name and members. +func MakeModule(thread *starlark.Thread, b *starlark.Builtin, args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) { + var name string + if err := starlark.UnpackPositionalArgs(b.Name(), args, nil, 1, &name); err != nil { + return nil, err + } + members := make(starlark.StringDict, len(kwargs)) + for _, kwarg := range kwargs { + k := string(kwarg[0].(starlark.String)) + members[k] = kwarg[1] + } + return &Module{name, members}, nil +} diff --git a/vendor/go.starlark.net/starlarkstruct/struct.go b/vendor/go.starlark.net/starlarkstruct/struct.go new file mode 100644 index 000000000000..1982cc085438 --- /dev/null +++ b/vendor/go.starlark.net/starlarkstruct/struct.go @@ -0,0 +1,281 @@ +// Copyright 2017 The Bazel Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package starlarkstruct defines the Starlark types 'struct' and +// 'module', both optional language extensions. +// +package starlarkstruct // import "go.starlark.net/starlarkstruct" + +// It is tempting to introduce a variant of Struct that is a wrapper +// around a Go struct value, for stronger typing guarantees and more +// efficient and convenient field lookup. However: +// 1) all fields of Starlark structs are optional, so we cannot represent +// them using more specific types such as String, Int, *Depset, and +// *File, as such types give no way to represent missing fields. +// 2) the efficiency gain of direct struct field access is rather +// marginal: finding the index of a field by binary searching on the +// sorted list of field names is quite fast compared to the other +// overheads. +// 3) the gains in compactness and spatial locality are also rather +// marginal: the array behind the []entry slice is (due to field name +// strings) only a factor of 2 larger than the corresponding Go struct +// would be, and, like the Go struct, requires only a single allocation. + +import ( + "fmt" + "sort" + "strings" + + "go.starlark.net/starlark" + "go.starlark.net/syntax" +) + +// Make is the implementation of a built-in function that instantiates +// an immutable struct from the specified keyword arguments. +// +// An application can add 'struct' to the Starlark environment like so: +// +// globals := starlark.StringDict{ +// "struct": starlark.NewBuiltin("struct", starlarkstruct.Make), +// } +// +func Make(_ *starlark.Thread, _ *starlark.Builtin, args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) { + if len(args) > 0 { + return nil, fmt.Errorf("struct: unexpected positional arguments") + } + return FromKeywords(Default, kwargs), nil +} + +// FromKeywords returns a new struct instance whose fields are specified by the +// key/value pairs in kwargs. (Each kwargs[i][0] must be a starlark.String.) +func FromKeywords(constructor starlark.Value, kwargs []starlark.Tuple) *Struct { + if constructor == nil { + panic("nil constructor") + } + s := &Struct{ + constructor: constructor, + entries: make(entries, 0, len(kwargs)), + } + for _, kwarg := range kwargs { + k := string(kwarg[0].(starlark.String)) + v := kwarg[1] + s.entries = append(s.entries, entry{k, v}) + } + sort.Sort(s.entries) + return s +} + +// FromStringDict returns a whose elements are those of d. +// The constructor parameter specifies the constructor; use Default for an ordinary struct. +func FromStringDict(constructor starlark.Value, d starlark.StringDict) *Struct { + if constructor == nil { + panic("nil constructor") + } + s := &Struct{ + constructor: constructor, + entries: make(entries, 0, len(d)), + } + for k, v := range d { + s.entries = append(s.entries, entry{k, v}) + } + sort.Sort(s.entries) + return s +} + +// Struct is an immutable Starlark type that maps field names to values. +// It is not iterable and does not support len. +// +// A struct has a constructor, a distinct value that identifies a class +// of structs, and which appears in the struct's string representation. +// +// Operations such as x+y fail if the constructors of the two operands +// are not equal. +// +// The default constructor, Default, is the string "struct", but +// clients may wish to 'brand' structs for their own purposes. +// The constructor value appears in the printed form of the value, +// and is accessible using the Constructor method. +// +// Use Attr to access its fields and AttrNames to enumerate them. +type Struct struct { + constructor starlark.Value + entries entries // sorted by name +} + +// Default is the default constructor for structs. +// It is merely the string "struct". +const Default = starlark.String("struct") + +type entries []entry + +func (a entries) Len() int { return len(a) } +func (a entries) Less(i, j int) bool { return a[i].name < a[j].name } +func (a entries) Swap(i, j int) { a[i], a[j] = a[j], a[i] } + +type entry struct { + name string + value starlark.Value +} + +var ( + _ starlark.HasAttrs = (*Struct)(nil) + _ starlark.HasBinary = (*Struct)(nil) +) + +// ToStringDict adds a name/value entry to d for each field of the struct. +func (s *Struct) ToStringDict(d starlark.StringDict) { + for _, e := range s.entries { + d[e.name] = e.value + } +} + +func (s *Struct) String() string { + buf := new(strings.Builder) + if s.constructor == Default { + // NB: The Java implementation always prints struct + // even for Bazel provider instances. + buf.WriteString("struct") // avoid String()'s quotation + } else { + buf.WriteString(s.constructor.String()) + } + buf.WriteByte('(') + for i, e := range s.entries { + if i > 0 { + buf.WriteString(", ") + } + buf.WriteString(e.name) + buf.WriteString(" = ") + buf.WriteString(e.value.String()) + } + buf.WriteByte(')') + return buf.String() +} + +// Constructor returns the constructor used to create this struct. +func (s *Struct) Constructor() starlark.Value { return s.constructor } + +func (s *Struct) Type() string { return "struct" } +func (s *Struct) Truth() starlark.Bool { return true } // even when empty +func (s *Struct) Hash() (uint32, error) { + // Same algorithm as Tuple.hash, but with different primes. + var x, m uint32 = 8731, 9839 + for _, e := range s.entries { + namehash, _ := starlark.String(e.name).Hash() + x = x ^ 3*namehash + y, err := e.value.Hash() + if err != nil { + return 0, err + } + x = x ^ y*m + m += 7349 + } + return x, nil +} +func (s *Struct) Freeze() { + for _, e := range s.entries { + e.value.Freeze() + } +} + +func (x *Struct) Binary(op syntax.Token, y starlark.Value, side starlark.Side) (starlark.Value, error) { + if y, ok := y.(*Struct); ok && op == syntax.PLUS { + if side == starlark.Right { + x, y = y, x + } + + if eq, err := starlark.Equal(x.constructor, y.constructor); err != nil { + return nil, fmt.Errorf("in %s + %s: error comparing constructors: %v", + x.constructor, y.constructor, err) + } else if !eq { + return nil, fmt.Errorf("cannot add structs of different constructors: %s + %s", + x.constructor, y.constructor) + } + + z := make(starlark.StringDict, x.len()+y.len()) + for _, e := range x.entries { + z[e.name] = e.value + } + for _, e := range y.entries { + z[e.name] = e.value + } + + return FromStringDict(x.constructor, z), nil + } + return nil, nil // unhandled +} + +// Attr returns the value of the specified field. +func (s *Struct) Attr(name string) (starlark.Value, error) { + // Binary search the entries. + // This implementation is a specialization of + // sort.Search that avoids dynamic dispatch. + n := len(s.entries) + i, j := 0, n + for i < j { + h := int(uint(i+j) >> 1) + if s.entries[h].name < name { + i = h + 1 + } else { + j = h + } + } + if i < n && s.entries[i].name == name { + return s.entries[i].value, nil + } + + var ctor string + if s.constructor != Default { + ctor = s.constructor.String() + " " + } + return nil, starlark.NoSuchAttrError( + fmt.Sprintf("%sstruct has no .%s attribute", ctor, name)) +} + +func (s *Struct) len() int { return len(s.entries) } + +// AttrNames returns a new sorted list of the struct fields. +func (s *Struct) AttrNames() []string { + names := make([]string, len(s.entries)) + for i, e := range s.entries { + names[i] = e.name + } + return names +} + +func (x *Struct) CompareSameType(op syntax.Token, y_ starlark.Value, depth int) (bool, error) { + y := y_.(*Struct) + switch op { + case syntax.EQL: + return structsEqual(x, y, depth) + case syntax.NEQ: + eq, err := structsEqual(x, y, depth) + return !eq, err + default: + return false, fmt.Errorf("%s %s %s not implemented", x.Type(), op, y.Type()) + } +} + +func structsEqual(x, y *Struct, depth int) (bool, error) { + if x.len() != y.len() { + return false, nil + } + + if eq, err := starlark.Equal(x.constructor, y.constructor); err != nil { + return false, fmt.Errorf("error comparing struct constructors %v and %v: %v", + x.constructor, y.constructor, err) + } else if !eq { + return false, nil + } + + for i, n := 0, x.len(); i < n; i++ { + if x.entries[i].name != y.entries[i].name { + return false, nil + } else if eq, err := starlark.EqualDepth(x.entries[i].value, y.entries[i].value, depth-1); err != nil { + return false, err + } else if !eq { + return false, nil + } + } + return true, nil +} diff --git a/vendor/go.starlark.net/syntax/grammar.txt b/vendor/go.starlark.net/syntax/grammar.txt new file mode 100644 index 000000000000..7f5dfc811b02 --- /dev/null +++ b/vendor/go.starlark.net/syntax/grammar.txt @@ -0,0 +1,129 @@ + +Grammar of Starlark +================== + +File = {Statement | newline} eof . + +Statement = DefStmt | IfStmt | ForStmt | WhileStmt | SimpleStmt . + +DefStmt = 'def' identifier '(' [Parameters [',']] ')' ':' Suite . + +Parameters = Parameter {',' Parameter}. + +Parameter = identifier | identifier '=' Test | '*' | '*' identifier | '**' identifier . + +IfStmt = 'if' Test ':' Suite {'elif' Test ':' Suite} ['else' ':' Suite] . + +ForStmt = 'for' LoopVariables 'in' Expression ':' Suite . + +WhileStmt = 'while' Test ':' Suite . + +Suite = [newline indent {Statement} outdent] | SimpleStmt . + +SimpleStmt = SmallStmt {';' SmallStmt} [';'] '\n' . +# NOTE: '\n' optional at EOF + +SmallStmt = ReturnStmt + | BreakStmt | ContinueStmt | PassStmt + | AssignStmt + | ExprStmt + | LoadStmt + . + +ReturnStmt = 'return' [Expression] . +BreakStmt = 'break' . +ContinueStmt = 'continue' . +PassStmt = 'pass' . +AssignStmt = Expression ('=' | '+=' | '-=' | '*=' | '/=' | '//=' | '%=' | '&=' | '|=' | '^=' | '<<=' | '>>=') Expression . +ExprStmt = Expression . + +LoadStmt = 'load' '(' string {',' [identifier '='] string} [','] ')' . + +Test = LambdaExpr + | IfExpr + | PrimaryExpr + | UnaryExpr + | BinaryExpr + . + +LambdaExpr = 'lambda' [Parameters] ':' Test . + +IfExpr = Test 'if' Test 'else' Test . + +PrimaryExpr = Operand + | PrimaryExpr DotSuffix + | PrimaryExpr CallSuffix + | PrimaryExpr SliceSuffix + . + +Operand = identifier + | int | float | string + | ListExpr | ListComp + | DictExpr | DictComp + | '(' [Expression [',']] ')' + | ('-' | '+') PrimaryExpr + . + +DotSuffix = '.' identifier . +CallSuffix = '(' [Arguments [',']] ')' . +SliceSuffix = '[' [Expression] [':' Test [':' Test]] ']' . + +Arguments = Argument {',' Argument} . +Argument = Test | identifier '=' Test | '*' Test | '**' Test . + +ListExpr = '[' [Expression [',']] ']' . +ListComp = '[' Test {CompClause} ']'. + +DictExpr = '{' [Entries [',']] '}' . +DictComp = '{' Entry {CompClause} '}' . +Entries = Entry {',' Entry} . +Entry = Test ':' Test . + +CompClause = 'for' LoopVariables 'in' Test | 'if' Test . + +UnaryExpr = 'not' Test . + +BinaryExpr = Test {Binop Test} . + +Binop = 'or' + | 'and' + | '==' | '!=' | '<' | '>' | '<=' | '>=' | 'in' | 'not' 'in' + | '|' + | '^' + | '&' + | '-' | '+' + | '*' | '%' | '/' | '//' + . + +Expression = Test {',' Test} . +# NOTE: trailing comma permitted only when within [...] or (...). + +LoopVariables = PrimaryExpr {',' PrimaryExpr} . + + +# Notation (similar to Go spec): +- lowercase and 'quoted' items are lexical tokens. +- Capitalized names denote grammar productions. +- (...) implies grouping +- x | y means either x or y. +- [x] means x is optional +- {x} means x is repeated zero or more times +- The end of each declaration is marked with a period. + +# Tokens +- spaces: newline, eof, indent, outdent. +- identifier. +- literals: string, int, float. +- plus all quoted tokens such as '+=', 'return'. + +# Notes: +- Ambiguity is resolved using operator precedence. +- The grammar does not enforce the legal order of params and args, + nor that the first compclause must be a 'for'. + +TODO: +- explain how the lexer generates indent, outdent, and newline tokens. +- why is unary NOT separated from unary - and +? +- the grammar is (mostly) in LL(1) style so, for example, + dot expressions are formed suffixes, not complete expressions, + which makes the spec harder to read. Reorganize into non-LL(1) form? diff --git a/vendor/go.starlark.net/syntax/parse.go b/vendor/go.starlark.net/syntax/parse.go new file mode 100644 index 000000000000..0281e4b878b2 --- /dev/null +++ b/vendor/go.starlark.net/syntax/parse.go @@ -0,0 +1,1029 @@ +// Copyright 2017 The Bazel Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package syntax + +// This file defines a recursive-descent parser for Starlark. +// The LL(1) grammar of Starlark and the names of many productions follow Python 2.7. +// +// TODO(adonovan): use syntax.Error more systematically throughout the +// package. Verify that error positions are correct using the +// chunkedfile mechanism. + +import "log" + +// Enable this flag to print the token stream and log.Fatal on the first error. +const debug = false + +// A Mode value is a set of flags (or 0) that controls optional parser functionality. +type Mode uint + +const ( + RetainComments Mode = 1 << iota // retain comments in AST; see Node.Comments +) + +// Parse parses the input data and returns the corresponding parse tree. +// +// If src != nil, ParseFile parses the source from src and the filename +// is only used when recording position information. +// The type of the argument for the src parameter must be string, +// []byte, or io.Reader. +// If src == nil, ParseFile parses the file specified by filename. +func Parse(filename string, src interface{}, mode Mode) (f *File, err error) { + in, err := newScanner(filename, src, mode&RetainComments != 0) + if err != nil { + return nil, err + } + p := parser{in: in} + defer p.in.recover(&err) + + p.nextToken() // read first lookahead token + f = p.parseFile() + if f != nil { + f.Path = filename + } + p.assignComments(f) + return f, nil +} + +// ParseCompoundStmt parses a single compound statement: +// a blank line, a def, for, while, or if statement, or a +// semicolon-separated list of simple statements followed +// by a newline. These are the units on which the REPL operates. +// ParseCompoundStmt does not consume any following input. +// The parser calls the readline function each +// time it needs a new line of input. +func ParseCompoundStmt(filename string, readline func() ([]byte, error)) (f *File, err error) { + in, err := newScanner(filename, readline, false) + if err != nil { + return nil, err + } + + p := parser{in: in} + defer p.in.recover(&err) + + p.nextToken() // read first lookahead token + + var stmts []Stmt + switch p.tok { + case DEF, IF, FOR, WHILE: + stmts = p.parseStmt(stmts) + case NEWLINE: + // blank line + default: + stmts = p.parseSimpleStmt(stmts, false) + // Require but don't consume newline, to avoid blocking again. + if p.tok != NEWLINE { + p.in.errorf(p.in.pos, "invalid syntax") + } + } + + return &File{Path: filename, Stmts: stmts}, nil +} + +// ParseExpr parses a Starlark expression. +// A comma-separated list of expressions is parsed as a tuple. +// See Parse for explanation of parameters. +func ParseExpr(filename string, src interface{}, mode Mode) (expr Expr, err error) { + in, err := newScanner(filename, src, mode&RetainComments != 0) + if err != nil { + return nil, err + } + p := parser{in: in} + defer p.in.recover(&err) + + p.nextToken() // read first lookahead token + + // Use parseExpr, not parseTest, to permit an unparenthesized tuple. + expr = p.parseExpr(false) + + // A following newline (e.g. "f()\n") appears outside any brackets, + // on a non-blank line, and thus results in a NEWLINE token. + if p.tok == NEWLINE { + p.nextToken() + } + + if p.tok != EOF { + p.in.errorf(p.in.pos, "got %#v after expression, want EOF", p.tok) + } + p.assignComments(expr) + return expr, nil +} + +type parser struct { + in *scanner + tok Token + tokval tokenValue +} + +// nextToken advances the scanner and returns the position of the +// previous token. +func (p *parser) nextToken() Position { + oldpos := p.tokval.pos + p.tok = p.in.nextToken(&p.tokval) + // enable to see the token stream + if debug { + log.Printf("nextToken: %-20s%+v\n", p.tok, p.tokval.pos) + } + return oldpos +} + +// file_input = (NEWLINE | stmt)* EOF +func (p *parser) parseFile() *File { + var stmts []Stmt + for p.tok != EOF { + if p.tok == NEWLINE { + p.nextToken() + continue + } + stmts = p.parseStmt(stmts) + } + return &File{Stmts: stmts} +} + +func (p *parser) parseStmt(stmts []Stmt) []Stmt { + if p.tok == DEF { + return append(stmts, p.parseDefStmt()) + } else if p.tok == IF { + return append(stmts, p.parseIfStmt()) + } else if p.tok == FOR { + return append(stmts, p.parseForStmt()) + } else if p.tok == WHILE { + return append(stmts, p.parseWhileStmt()) + } + return p.parseSimpleStmt(stmts, true) +} + +func (p *parser) parseDefStmt() Stmt { + defpos := p.nextToken() // consume DEF + id := p.parseIdent() + p.consume(LPAREN) + params := p.parseParams() + p.consume(RPAREN) + p.consume(COLON) + body := p.parseSuite() + return &DefStmt{ + Def: defpos, + Name: id, + Params: params, + Body: body, + } +} + +func (p *parser) parseIfStmt() Stmt { + ifpos := p.nextToken() // consume IF + cond := p.parseTest() + p.consume(COLON) + body := p.parseSuite() + ifStmt := &IfStmt{ + If: ifpos, + Cond: cond, + True: body, + } + tail := ifStmt + for p.tok == ELIF { + elifpos := p.nextToken() // consume ELIF + cond := p.parseTest() + p.consume(COLON) + body := p.parseSuite() + elif := &IfStmt{ + If: elifpos, + Cond: cond, + True: body, + } + tail.ElsePos = elifpos + tail.False = []Stmt{elif} + tail = elif + } + if p.tok == ELSE { + tail.ElsePos = p.nextToken() // consume ELSE + p.consume(COLON) + tail.False = p.parseSuite() + } + return ifStmt +} + +func (p *parser) parseForStmt() Stmt { + forpos := p.nextToken() // consume FOR + vars := p.parseForLoopVariables() + p.consume(IN) + x := p.parseExpr(false) + p.consume(COLON) + body := p.parseSuite() + return &ForStmt{ + For: forpos, + Vars: vars, + X: x, + Body: body, + } +} + +func (p *parser) parseWhileStmt() Stmt { + whilepos := p.nextToken() // consume WHILE + cond := p.parseTest() + p.consume(COLON) + body := p.parseSuite() + return &WhileStmt{ + While: whilepos, + Cond: cond, + Body: body, + } +} + +// Equivalent to 'exprlist' production in Python grammar. +// +// loop_variables = primary_with_suffix (COMMA primary_with_suffix)* COMMA? +func (p *parser) parseForLoopVariables() Expr { + // Avoid parseExpr because it would consume the IN token + // following x in "for x in y: ...". + v := p.parsePrimaryWithSuffix() + if p.tok != COMMA { + return v + } + + list := []Expr{v} + for p.tok == COMMA { + p.nextToken() + if terminatesExprList(p.tok) { + break + } + list = append(list, p.parsePrimaryWithSuffix()) + } + return &TupleExpr{List: list} +} + +// simple_stmt = small_stmt (SEMI small_stmt)* SEMI? NEWLINE +// In REPL mode, it does not consume the NEWLINE. +func (p *parser) parseSimpleStmt(stmts []Stmt, consumeNL bool) []Stmt { + for { + stmts = append(stmts, p.parseSmallStmt()) + if p.tok != SEMI { + break + } + p.nextToken() // consume SEMI + if p.tok == NEWLINE || p.tok == EOF { + break + } + } + // EOF without NEWLINE occurs in `if x: pass`, for example. + if p.tok != EOF && consumeNL { + p.consume(NEWLINE) + } + + return stmts +} + +// small_stmt = RETURN expr? +// | PASS | BREAK | CONTINUE +// | LOAD ... +// | expr ('=' | '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^=' | '<<=' | '>>=') expr // assign +// | expr +func (p *parser) parseSmallStmt() Stmt { + switch p.tok { + case RETURN: + pos := p.nextToken() // consume RETURN + var result Expr + if p.tok != EOF && p.tok != NEWLINE && p.tok != SEMI { + result = p.parseExpr(false) + } + return &ReturnStmt{Return: pos, Result: result} + + case BREAK, CONTINUE, PASS: + tok := p.tok + pos := p.nextToken() // consume it + return &BranchStmt{Token: tok, TokenPos: pos} + + case LOAD: + return p.parseLoadStmt() + } + + // Assignment + x := p.parseExpr(false) + switch p.tok { + case EQ, PLUS_EQ, MINUS_EQ, STAR_EQ, SLASH_EQ, SLASHSLASH_EQ, PERCENT_EQ, AMP_EQ, PIPE_EQ, CIRCUMFLEX_EQ, LTLT_EQ, GTGT_EQ: + op := p.tok + pos := p.nextToken() // consume op + rhs := p.parseExpr(false) + return &AssignStmt{OpPos: pos, Op: op, LHS: x, RHS: rhs} + } + + // Expression statement (e.g. function call, doc string). + return &ExprStmt{X: x} +} + +// stmt = LOAD '(' STRING {',' (IDENT '=')? STRING} [','] ')' +func (p *parser) parseLoadStmt() *LoadStmt { + loadPos := p.nextToken() // consume LOAD + lparen := p.consume(LPAREN) + + if p.tok != STRING { + p.in.errorf(p.in.pos, "first operand of load statement must be a string literal") + } + module := p.parsePrimary().(*Literal) + + var from, to []*Ident + for p.tok != RPAREN && p.tok != EOF { + p.consume(COMMA) + if p.tok == RPAREN { + break // allow trailing comma + } + switch p.tok { + case STRING: + // load("module", "id") + // To name is same as original. + lit := p.parsePrimary().(*Literal) + id := &Ident{ + NamePos: lit.TokenPos.add(`"`), + Name: lit.Value.(string), + } + to = append(to, id) + from = append(from, id) + + case IDENT: + // load("module", to="from") + id := p.parseIdent() + to = append(to, id) + if p.tok != EQ { + p.in.errorf(p.in.pos, `load operand must be "%[1]s" or %[1]s="originalname" (want '=' after %[1]s)`, id.Name) + } + p.consume(EQ) + if p.tok != STRING { + p.in.errorf(p.in.pos, `original name of loaded symbol must be quoted: %s="originalname"`, id.Name) + } + lit := p.parsePrimary().(*Literal) + from = append(from, &Ident{ + NamePos: lit.TokenPos.add(`"`), + Name: lit.Value.(string), + }) + + case RPAREN: + p.in.errorf(p.in.pos, "trailing comma in load statement") + + default: + p.in.errorf(p.in.pos, `load operand must be "name" or localname="name" (got %#v)`, p.tok) + } + } + rparen := p.consume(RPAREN) + + if len(to) == 0 { + p.in.errorf(lparen, "load statement must import at least 1 symbol") + } + return &LoadStmt{ + Load: loadPos, + Module: module, + To: to, + From: from, + Rparen: rparen, + } +} + +// suite is typically what follows a COLON (e.g. after DEF or FOR). +// suite = simple_stmt | NEWLINE INDENT stmt+ OUTDENT +func (p *parser) parseSuite() []Stmt { + if p.tok == NEWLINE { + p.nextToken() // consume NEWLINE + p.consume(INDENT) + var stmts []Stmt + for p.tok != OUTDENT && p.tok != EOF { + stmts = p.parseStmt(stmts) + } + p.consume(OUTDENT) + return stmts + } + + return p.parseSimpleStmt(nil, true) +} + +func (p *parser) parseIdent() *Ident { + if p.tok != IDENT { + p.in.error(p.in.pos, "not an identifier") + } + id := &Ident{ + NamePos: p.tokval.pos, + Name: p.tokval.raw, + } + p.nextToken() + return id +} + +func (p *parser) consume(t Token) Position { + if p.tok != t { + p.in.errorf(p.in.pos, "got %#v, want %#v", p.tok, t) + } + return p.nextToken() +} + +// params = (param COMMA)* param COMMA? +// | +// +// param = IDENT +// | IDENT EQ test +// | STAR +// | STAR IDENT +// | STARSTAR IDENT +// +// parseParams parses a parameter list. The resulting expressions are of the form: +// +// *Ident x +// *Binary{Op: EQ, X: *Ident, Y: Expr} x=y +// *Unary{Op: STAR} * +// *Unary{Op: STAR, X: *Ident} *args +// *Unary{Op: STARSTAR, X: *Ident} **kwargs +func (p *parser) parseParams() []Expr { + var params []Expr + for p.tok != RPAREN && p.tok != COLON && p.tok != EOF { + if len(params) > 0 { + p.consume(COMMA) + } + if p.tok == RPAREN { + break + } + + // * or *args or **kwargs + if p.tok == STAR || p.tok == STARSTAR { + op := p.tok + pos := p.nextToken() + var x Expr + if op == STARSTAR || p.tok == IDENT { + x = p.parseIdent() + } + params = append(params, &UnaryExpr{ + OpPos: pos, + Op: op, + X: x, + }) + continue + } + + // IDENT + // IDENT = test + id := p.parseIdent() + if p.tok == EQ { // default value + eq := p.nextToken() + dflt := p.parseTest() + params = append(params, &BinaryExpr{ + X: id, + OpPos: eq, + Op: EQ, + Y: dflt, + }) + continue + } + + params = append(params, id) + } + return params +} + +// parseExpr parses an expression, possible consisting of a +// comma-separated list of 'test' expressions. +// +// In many cases we must use parseTest to avoid ambiguity such as +// f(x, y) vs. f((x, y)). +func (p *parser) parseExpr(inParens bool) Expr { + x := p.parseTest() + if p.tok != COMMA { + return x + } + + // tuple + exprs := p.parseExprs([]Expr{x}, inParens) + return &TupleExpr{List: exprs} +} + +// parseExprs parses a comma-separated list of expressions, starting with the comma. +// It is used to parse tuples and list elements. +// expr_list = (',' expr)* ','? +func (p *parser) parseExprs(exprs []Expr, allowTrailingComma bool) []Expr { + for p.tok == COMMA { + pos := p.nextToken() + if terminatesExprList(p.tok) { + if !allowTrailingComma { + p.in.error(pos, "unparenthesized tuple with trailing comma") + } + break + } + exprs = append(exprs, p.parseTest()) + } + return exprs +} + +// parseTest parses a 'test', a single-component expression. +func (p *parser) parseTest() Expr { + if p.tok == LAMBDA { + return p.parseLambda(true) + } + + x := p.parseTestPrec(0) + + // conditional expression (t IF cond ELSE f) + if p.tok == IF { + ifpos := p.nextToken() + cond := p.parseTestPrec(0) + if p.tok != ELSE { + p.in.error(ifpos, "conditional expression without else clause") + } + elsepos := p.nextToken() + else_ := p.parseTest() + return &CondExpr{If: ifpos, Cond: cond, True: x, ElsePos: elsepos, False: else_} + } + + return x +} + +// parseTestNoCond parses a a single-component expression without +// consuming a trailing 'if expr else expr'. +func (p *parser) parseTestNoCond() Expr { + if p.tok == LAMBDA { + return p.parseLambda(false) + } + return p.parseTestPrec(0) +} + +// parseLambda parses a lambda expression. +// The allowCond flag allows the body to be an 'a if b else c' conditional. +func (p *parser) parseLambda(allowCond bool) Expr { + lambda := p.nextToken() + var params []Expr + if p.tok != COLON { + params = p.parseParams() + } + p.consume(COLON) + + var body Expr + if allowCond { + body = p.parseTest() + } else { + body = p.parseTestNoCond() + } + + return &LambdaExpr{ + Lambda: lambda, + Params: params, + Body: body, + } +} + +func (p *parser) parseTestPrec(prec int) Expr { + if prec >= len(preclevels) { + return p.parsePrimaryWithSuffix() + } + + // expr = NOT expr + if p.tok == NOT && prec == int(precedence[NOT]) { + pos := p.nextToken() + x := p.parseTestPrec(prec) + return &UnaryExpr{ + OpPos: pos, + Op: NOT, + X: x, + } + } + + return p.parseBinopExpr(prec) +} + +// expr = test (OP test)* +// Uses precedence climbing; see http://www.engr.mun.ca/~theo/Misc/exp_parsing.htm#climbing. +func (p *parser) parseBinopExpr(prec int) Expr { + x := p.parseTestPrec(prec + 1) + for first := true; ; first = false { + if p.tok == NOT { + p.nextToken() // consume NOT + // In this context, NOT must be followed by IN. + // Replace NOT IN by a single NOT_IN token. + if p.tok != IN { + p.in.errorf(p.in.pos, "got %#v, want in", p.tok) + } + p.tok = NOT_IN + } + + // Binary operator of specified precedence? + opprec := int(precedence[p.tok]) + if opprec < prec { + return x + } + + // Comparisons are non-associative. + if !first && opprec == int(precedence[EQL]) { + p.in.errorf(p.in.pos, "%s does not associate with %s (use parens)", + x.(*BinaryExpr).Op, p.tok) + } + + op := p.tok + pos := p.nextToken() + y := p.parseTestPrec(opprec + 1) + x = &BinaryExpr{OpPos: pos, Op: op, X: x, Y: y} + } +} + +// precedence maps each operator to its precedence (0-7), or -1 for other tokens. +var precedence [maxToken]int8 + +// preclevels groups operators of equal precedence. +// Comparisons are nonassociative; other binary operators associate to the left. +// Unary MINUS, unary PLUS, and TILDE have higher precedence so are handled in parsePrimary. +// See https://github.com/google/starlark-go/blob/master/doc/spec.md#binary-operators +var preclevels = [...][]Token{ + {OR}, // or + {AND}, // and + {NOT}, // not (unary) + {EQL, NEQ, LT, GT, LE, GE, IN, NOT_IN}, // == != < > <= >= in not in + {PIPE}, // | + {CIRCUMFLEX}, // ^ + {AMP}, // & + {LTLT, GTGT}, // << >> + {MINUS, PLUS}, // - + {STAR, PERCENT, SLASH, SLASHSLASH}, // * % / // +} + +func init() { + // populate precedence table + for i := range precedence { + precedence[i] = -1 + } + for level, tokens := range preclevels { + for _, tok := range tokens { + precedence[tok] = int8(level) + } + } +} + +// primary_with_suffix = primary +// | primary '.' IDENT +// | primary slice_suffix +// | primary call_suffix +func (p *parser) parsePrimaryWithSuffix() Expr { + x := p.parsePrimary() + for { + switch p.tok { + case DOT: + dot := p.nextToken() + id := p.parseIdent() + x = &DotExpr{Dot: dot, X: x, Name: id} + case LBRACK: + x = p.parseSliceSuffix(x) + case LPAREN: + x = p.parseCallSuffix(x) + default: + return x + } + } +} + +// slice_suffix = '[' expr? ':' expr? ':' expr? ']' +func (p *parser) parseSliceSuffix(x Expr) Expr { + lbrack := p.nextToken() + var lo, hi, step Expr + if p.tok != COLON { + y := p.parseExpr(false) + + // index x[y] + if p.tok == RBRACK { + rbrack := p.nextToken() + return &IndexExpr{X: x, Lbrack: lbrack, Y: y, Rbrack: rbrack} + } + + lo = y + } + + // slice or substring x[lo:hi:step] + if p.tok == COLON { + p.nextToken() + if p.tok != COLON && p.tok != RBRACK { + hi = p.parseTest() + } + } + if p.tok == COLON { + p.nextToken() + if p.tok != RBRACK { + step = p.parseTest() + } + } + rbrack := p.consume(RBRACK) + return &SliceExpr{X: x, Lbrack: lbrack, Lo: lo, Hi: hi, Step: step, Rbrack: rbrack} +} + +// call_suffix = '(' arg_list? ')' +func (p *parser) parseCallSuffix(fn Expr) Expr { + lparen := p.consume(LPAREN) + var rparen Position + var args []Expr + if p.tok == RPAREN { + rparen = p.nextToken() + } else { + args = p.parseArgs() + rparen = p.consume(RPAREN) + } + return &CallExpr{Fn: fn, Lparen: lparen, Args: args, Rparen: rparen} +} + +// parseArgs parses a list of actual parameter values (arguments). +// It mirrors the structure of parseParams. +// arg_list = ((arg COMMA)* arg COMMA?)? +func (p *parser) parseArgs() []Expr { + var args []Expr + for p.tok != RPAREN && p.tok != EOF { + if len(args) > 0 { + p.consume(COMMA) + } + if p.tok == RPAREN { + break + } + + // *args or **kwargs + if p.tok == STAR || p.tok == STARSTAR { + op := p.tok + pos := p.nextToken() + x := p.parseTest() + args = append(args, &UnaryExpr{ + OpPos: pos, + Op: op, + X: x, + }) + continue + } + + // We use a different strategy from Bazel here to stay within LL(1). + // Instead of looking ahead two tokens (IDENT, EQ) we parse + // 'test = test' then check that the first was an IDENT. + x := p.parseTest() + + if p.tok == EQ { + // name = value + if _, ok := x.(*Ident); !ok { + p.in.errorf(p.in.pos, "keyword argument must have form name=expr") + } + eq := p.nextToken() + y := p.parseTest() + x = &BinaryExpr{ + X: x, + OpPos: eq, + Op: EQ, + Y: y, + } + } + + args = append(args, x) + } + return args +} + +// primary = IDENT +// | INT | FLOAT +// | STRING +// | '[' ... // list literal or comprehension +// | '{' ... // dict literal or comprehension +// | '(' ... // tuple or parenthesized expression +// | ('-'|'+'|'~') primary_with_suffix +func (p *parser) parsePrimary() Expr { + switch p.tok { + case IDENT: + return p.parseIdent() + + case INT, FLOAT, STRING: + var val interface{} + tok := p.tok + switch tok { + case INT: + if p.tokval.bigInt != nil { + val = p.tokval.bigInt + } else { + val = p.tokval.int + } + case FLOAT: + val = p.tokval.float + case STRING: + val = p.tokval.string + } + raw := p.tokval.raw + pos := p.nextToken() + return &Literal{Token: tok, TokenPos: pos, Raw: raw, Value: val} + + case LBRACK: + return p.parseList() + + case LBRACE: + return p.parseDict() + + case LPAREN: + lparen := p.nextToken() + if p.tok == RPAREN { + // empty tuple + rparen := p.nextToken() + return &TupleExpr{Lparen: lparen, Rparen: rparen} + } + e := p.parseExpr(true) // allow trailing comma + rparen := p.consume(RPAREN) + return &ParenExpr{ + Lparen: lparen, + X: e, + Rparen: rparen, + } + + case MINUS, PLUS, TILDE: // unary + tok := p.tok + pos := p.nextToken() + x := p.parsePrimaryWithSuffix() + return &UnaryExpr{ + OpPos: pos, + Op: tok, + X: x, + } + } + p.in.errorf(p.in.pos, "got %#v, want primary expression", p.tok) + panic("unreachable") +} + +// list = '[' ']' +// | '[' expr ']' +// | '[' expr expr_list ']' +// | '[' expr (FOR loop_variables IN expr)+ ']' +func (p *parser) parseList() Expr { + lbrack := p.nextToken() + if p.tok == RBRACK { + // empty List + rbrack := p.nextToken() + return &ListExpr{Lbrack: lbrack, Rbrack: rbrack} + } + + x := p.parseTest() + + if p.tok == FOR { + // list comprehension + return p.parseComprehensionSuffix(lbrack, x, RBRACK) + } + + exprs := []Expr{x} + if p.tok == COMMA { + // multi-item list literal + exprs = p.parseExprs(exprs, true) // allow trailing comma + } + + rbrack := p.consume(RBRACK) + return &ListExpr{Lbrack: lbrack, List: exprs, Rbrack: rbrack} +} + +// dict = '{' '}' +// | '{' dict_entry_list '}' +// | '{' dict_entry FOR loop_variables IN expr '}' +func (p *parser) parseDict() Expr { + lbrace := p.nextToken() + if p.tok == RBRACE { + // empty dict + rbrace := p.nextToken() + return &DictExpr{Lbrace: lbrace, Rbrace: rbrace} + } + + x := p.parseDictEntry() + + if p.tok == FOR { + // dict comprehension + return p.parseComprehensionSuffix(lbrace, x, RBRACE) + } + + entries := []Expr{x} + for p.tok == COMMA { + p.nextToken() + if p.tok == RBRACE { + break + } + entries = append(entries, p.parseDictEntry()) + } + + rbrace := p.consume(RBRACE) + return &DictExpr{Lbrace: lbrace, List: entries, Rbrace: rbrace} +} + +// dict_entry = test ':' test +func (p *parser) parseDictEntry() *DictEntry { + k := p.parseTest() + colon := p.consume(COLON) + v := p.parseTest() + return &DictEntry{Key: k, Colon: colon, Value: v} +} + +// comp_suffix = FOR loopvars IN expr comp_suffix +// | IF expr comp_suffix +// | ']' or ')' (end) +// +// There can be multiple FOR/IF clauses; the first is always a FOR. +func (p *parser) parseComprehensionSuffix(lbrace Position, body Expr, endBrace Token) Expr { + var clauses []Node + for p.tok != endBrace { + if p.tok == FOR { + pos := p.nextToken() + vars := p.parseForLoopVariables() + in := p.consume(IN) + // Following Python 3, the operand of IN cannot be: + // - a conditional expression ('x if y else z'), + // due to conflicts in Python grammar + // ('if' is used by the comprehension); + // - a lambda expression + // - an unparenthesized tuple. + x := p.parseTestPrec(0) + clauses = append(clauses, &ForClause{For: pos, Vars: vars, In: in, X: x}) + } else if p.tok == IF { + pos := p.nextToken() + cond := p.parseTestNoCond() + clauses = append(clauses, &IfClause{If: pos, Cond: cond}) + } else { + p.in.errorf(p.in.pos, "got %#v, want '%s', for, or if", p.tok, endBrace) + } + } + rbrace := p.nextToken() + + return &Comprehension{ + Curly: endBrace == RBRACE, + Lbrack: lbrace, + Body: body, + Clauses: clauses, + Rbrack: rbrace, + } +} + +func terminatesExprList(tok Token) bool { + switch tok { + case EOF, NEWLINE, EQ, RBRACE, RBRACK, RPAREN, SEMI: + return true + } + return false +} + +// Comment assignment. +// We build two lists of all subnodes, preorder and postorder. +// The preorder list is ordered by start location, with outer nodes first. +// The postorder list is ordered by end location, with outer nodes last. +// We use the preorder list to assign each whole-line comment to the syntax +// immediately following it, and we use the postorder list to assign each +// end-of-line comment to the syntax immediately preceding it. + +// flattenAST returns the list of AST nodes, both in prefix order and in postfix +// order. +func flattenAST(root Node) (pre, post []Node) { + stack := []Node{} + Walk(root, func(n Node) bool { + if n != nil { + pre = append(pre, n) + stack = append(stack, n) + } else { + post = append(post, stack[len(stack)-1]) + stack = stack[:len(stack)-1] + } + return true + }) + return pre, post +} + +// assignComments attaches comments to nearby syntax. +func (p *parser) assignComments(n Node) { + // Leave early if there are no comments + if len(p.in.lineComments)+len(p.in.suffixComments) == 0 { + return + } + + pre, post := flattenAST(n) + + // Assign line comments to syntax immediately following. + line := p.in.lineComments + for _, x := range pre { + start, _ := x.Span() + + switch x.(type) { + case *File: + continue + } + + for len(line) > 0 && !start.isBefore(line[0].Start) { + x.AllocComments() + x.Comments().Before = append(x.Comments().Before, line[0]) + line = line[1:] + } + } + + // Remaining line comments go at end of file. + if len(line) > 0 { + n.AllocComments() + n.Comments().After = append(n.Comments().After, line...) + } + + // Assign suffix comments to syntax immediately before. + suffix := p.in.suffixComments + for i := len(post) - 1; i >= 0; i-- { + x := post[i] + + // Do not assign suffix comments to file + switch x.(type) { + case *File: + continue + } + + _, end := x.Span() + if len(suffix) > 0 && end.isBefore(suffix[len(suffix)-1].Start) { + x.AllocComments() + x.Comments().Suffix = append(x.Comments().Suffix, suffix[len(suffix)-1]) + suffix = suffix[:len(suffix)-1] + } + } +} diff --git a/vendor/go.starlark.net/syntax/quote.go b/vendor/go.starlark.net/syntax/quote.go new file mode 100644 index 000000000000..cc9a8d0aeafc --- /dev/null +++ b/vendor/go.starlark.net/syntax/quote.go @@ -0,0 +1,269 @@ +// Copyright 2017 The Bazel Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package syntax + +// Starlark quoted string utilities. + +import ( + "fmt" + "strconv" + "strings" +) + +// unesc maps single-letter chars following \ to their actual values. +var unesc = [256]byte{ + 'a': '\a', + 'b': '\b', + 'f': '\f', + 'n': '\n', + 'r': '\r', + 't': '\t', + 'v': '\v', + '\\': '\\', + '\'': '\'', + '"': '"', +} + +// esc maps escape-worthy bytes to the char that should follow \. +var esc = [256]byte{ + '\a': 'a', + '\b': 'b', + '\f': 'f', + '\n': 'n', + '\r': 'r', + '\t': 't', + '\v': 'v', + '\\': '\\', + '\'': '\'', + '"': '"', +} + +// notEsc is a list of characters that can follow a \ in a string value +// without having to escape the \. That is, since ( is in this list, we +// quote the Go string "foo\\(bar" as the Python literal "foo\(bar". +// This really does happen in BUILD files, especially in strings +// being used as shell arguments containing regular expressions. +const notEsc = " !#$%&()*+,-./:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~" + +// unquote unquotes the quoted string, returning the actual +// string value, whether the original was triple-quoted, and +// an error describing invalid input. +func unquote(quoted string) (s string, triple bool, err error) { + // Check for raw prefix: means don't interpret the inner \. + raw := false + if strings.HasPrefix(quoted, "r") { + raw = true + quoted = quoted[1:] + } + + if len(quoted) < 2 { + err = fmt.Errorf("string literal too short") + return + } + + if quoted[0] != '"' && quoted[0] != '\'' || quoted[0] != quoted[len(quoted)-1] { + err = fmt.Errorf("string literal has invalid quotes") + return + } + + // Check for triple quoted string. + quote := quoted[0] + if len(quoted) >= 6 && quoted[1] == quote && quoted[2] == quote && quoted[:3] == quoted[len(quoted)-3:] { + triple = true + quoted = quoted[3 : len(quoted)-3] + } else { + quoted = quoted[1 : len(quoted)-1] + } + + // Now quoted is the quoted data, but no quotes. + // If we're in raw mode or there are no escapes or + // carriage returns, we're done. + var unquoteChars string + if raw { + unquoteChars = "\r" + } else { + unquoteChars = "\\\r" + } + if !strings.ContainsAny(quoted, unquoteChars) { + s = quoted + return + } + + // Otherwise process quoted string. + // Each iteration processes one escape sequence along with the + // plain text leading up to it. + buf := new(strings.Builder) + for { + // Remove prefix before escape sequence. + i := strings.IndexAny(quoted, unquoteChars) + if i < 0 { + i = len(quoted) + } + buf.WriteString(quoted[:i]) + quoted = quoted[i:] + + if len(quoted) == 0 { + break + } + + // Process carriage return. + if quoted[0] == '\r' { + buf.WriteByte('\n') + if len(quoted) > 1 && quoted[1] == '\n' { + quoted = quoted[2:] + } else { + quoted = quoted[1:] + } + continue + } + + // Process escape sequence. + if len(quoted) == 1 { + err = fmt.Errorf(`truncated escape sequence \`) + return + } + + switch quoted[1] { + default: + // In Python, if \z (for some byte z) is not a known escape sequence + // then it appears as literal text in the string. + buf.WriteString(quoted[:2]) + quoted = quoted[2:] + + case '\n': + // Ignore the escape and the line break. + quoted = quoted[2:] + + case 'a', 'b', 'f', 'n', 'r', 't', 'v', '\\', '\'', '"': + // One-char escape + buf.WriteByte(unesc[quoted[1]]) + quoted = quoted[2:] + + case '0', '1', '2', '3', '4', '5', '6', '7': + // Octal escape, up to 3 digits. + n := int(quoted[1] - '0') + quoted = quoted[2:] + for i := 1; i < 3; i++ { + if len(quoted) == 0 || quoted[0] < '0' || '7' < quoted[0] { + break + } + n = n*8 + int(quoted[0]-'0') + quoted = quoted[1:] + } + if n >= 256 { + // NOTE: Python silently discards the high bit, + // so that '\541' == '\141' == 'a'. + // Let's see if we can avoid doing that in BUILD files. + err = fmt.Errorf(`invalid escape sequence \%03o`, n) + return + } + buf.WriteByte(byte(n)) + + case 'x': + // Hexadecimal escape, exactly 2 digits. + if len(quoted) < 4 { + err = fmt.Errorf(`truncated escape sequence %s`, quoted) + return + } + n, err1 := strconv.ParseUint(quoted[2:4], 16, 0) + if err1 != nil { + err = fmt.Errorf(`invalid escape sequence %s`, quoted[:4]) + return + } + buf.WriteByte(byte(n)) + quoted = quoted[4:] + } + } + + s = buf.String() + return +} + +// indexByte returns the index of the first instance of b in s, or else -1. +func indexByte(s string, b byte) int { + for i := 0; i < len(s); i++ { + if s[i] == b { + return i + } + } + return -1 +} + +// hex is a list of the hexadecimal digits, for use in quoting. +// We always print lower-case hexadecimal. +const hex = "0123456789abcdef" + +// quote returns the quoted form of the string value "x". +// If triple is true, quote uses the triple-quoted form """x""". +func quote(unquoted string, triple bool) string { + q := `"` + if triple { + q = `"""` + } + + buf := new(strings.Builder) + buf.WriteString(q) + + for i := 0; i < len(unquoted); i++ { + c := unquoted[i] + if c == '"' && triple && (i+1 < len(unquoted) && unquoted[i+1] != '"' || i+2 < len(unquoted) && unquoted[i+2] != '"') { + // Can pass up to two quotes through, because they are followed by a non-quote byte. + buf.WriteByte(c) + if i+1 < len(unquoted) && unquoted[i+1] == '"' { + buf.WriteByte(c) + i++ + } + continue + } + if triple && c == '\n' { + // Can allow newline in triple-quoted string. + buf.WriteByte(c) + continue + } + if c == '\'' { + // Can allow ' since we always use ". + buf.WriteByte(c) + continue + } + if c == '\\' { + if i+1 < len(unquoted) && indexByte(notEsc, unquoted[i+1]) >= 0 { + // Can pass \ through when followed by a byte that + // known not to be a valid escape sequence and also + // that does not trigger an escape sequence of its own. + // Use this, because various BUILD files do. + buf.WriteByte('\\') + buf.WriteByte(unquoted[i+1]) + i++ + continue + } + } + if esc[c] != 0 { + buf.WriteByte('\\') + buf.WriteByte(esc[c]) + continue + } + if c < 0x20 || c >= 0x80 { + // BUILD files are supposed to be Latin-1, so escape all control and high bytes. + // I'd prefer to use \x here, but Blaze does not implement + // \x in quoted strings (b/7272572). + buf.WriteByte('\\') + buf.WriteByte(hex[c>>6]) // actually octal but reusing hex digits 0-7. + buf.WriteByte(hex[(c>>3)&7]) + buf.WriteByte(hex[c&7]) + /* + buf.WriteByte('\\') + buf.WriteByte('x') + buf.WriteByte(hex[c>>4]) + buf.WriteByte(hex[c&0xF]) + */ + continue + } + buf.WriteByte(c) + continue + } + + buf.WriteString(q) + return buf.String() +} diff --git a/vendor/go.starlark.net/syntax/scan.go b/vendor/go.starlark.net/syntax/scan.go new file mode 100644 index 000000000000..51cf8855fd0d --- /dev/null +++ b/vendor/go.starlark.net/syntax/scan.go @@ -0,0 +1,1089 @@ +// Copyright 2017 The Bazel Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package syntax + +// A lexical scanner for Starlark. + +import ( + "fmt" + "io" + "io/ioutil" + "log" + "math/big" + "os" + "strconv" + "strings" + "unicode" + "unicode/utf8" +) + +// A Token represents a Starlark lexical token. +type Token int8 + +const ( + ILLEGAL Token = iota + EOF + + NEWLINE + INDENT + OUTDENT + + // Tokens with values + IDENT // x + INT // 123 + FLOAT // 1.23e45 + STRING // "foo" or 'foo' or '''foo''' or r'foo' or r"foo" + + // Punctuation + PLUS // + + MINUS // - + STAR // * + SLASH // / + SLASHSLASH // // + PERCENT // % + AMP // & + PIPE // | + CIRCUMFLEX // ^ + LTLT // << + GTGT // >> + TILDE // ~ + DOT // . + COMMA // , + EQ // = + SEMI // ; + COLON // : + LPAREN // ( + RPAREN // ) + LBRACK // [ + RBRACK // ] + LBRACE // { + RBRACE // } + LT // < + GT // > + GE // >= + LE // <= + EQL // == + NEQ // != + PLUS_EQ // += (keep order consistent with PLUS..GTGT) + MINUS_EQ // -= + STAR_EQ // *= + SLASH_EQ // /= + SLASHSLASH_EQ // //= + PERCENT_EQ // %= + AMP_EQ // &= + PIPE_EQ // |= + CIRCUMFLEX_EQ // ^= + LTLT_EQ // <<= + GTGT_EQ // >>= + STARSTAR // ** + + // Keywords + AND + BREAK + CONTINUE + DEF + ELIF + ELSE + FOR + IF + IN + LAMBDA + LOAD + NOT + NOT_IN // synthesized by parser from NOT IN + OR + PASS + RETURN + WHILE + + maxToken +) + +func (tok Token) String() string { return tokenNames[tok] } + +// GoString is like String but quotes punctuation tokens. +// Use Sprintf("%#v", tok) when constructing error messages. +func (tok Token) GoString() string { + if tok >= PLUS && tok <= STARSTAR { + return "'" + tokenNames[tok] + "'" + } + return tokenNames[tok] +} + +var tokenNames = [...]string{ + ILLEGAL: "illegal token", + EOF: "end of file", + NEWLINE: "newline", + INDENT: "indent", + OUTDENT: "outdent", + IDENT: "identifier", + INT: "int literal", + FLOAT: "float literal", + STRING: "string literal", + PLUS: "+", + MINUS: "-", + STAR: "*", + SLASH: "/", + SLASHSLASH: "//", + PERCENT: "%", + AMP: "&", + PIPE: "|", + CIRCUMFLEX: "^", + LTLT: "<<", + GTGT: ">>", + TILDE: "~", + DOT: ".", + COMMA: ",", + EQ: "=", + SEMI: ";", + COLON: ":", + LPAREN: "(", + RPAREN: ")", + LBRACK: "[", + RBRACK: "]", + LBRACE: "{", + RBRACE: "}", + LT: "<", + GT: ">", + GE: ">=", + LE: "<=", + EQL: "==", + NEQ: "!=", + PLUS_EQ: "+=", + MINUS_EQ: "-=", + STAR_EQ: "*=", + SLASH_EQ: "/=", + SLASHSLASH_EQ: "//=", + PERCENT_EQ: "%=", + AMP_EQ: "&=", + PIPE_EQ: "|=", + CIRCUMFLEX_EQ: "^=", + LTLT_EQ: "<<=", + GTGT_EQ: ">>=", + STARSTAR: "**", + AND: "and", + BREAK: "break", + CONTINUE: "continue", + DEF: "def", + ELIF: "elif", + ELSE: "else", + FOR: "for", + IF: "if", + IN: "in", + LAMBDA: "lambda", + LOAD: "load", + NOT: "not", + NOT_IN: "not in", + OR: "or", + PASS: "pass", + RETURN: "return", + WHILE: "while", +} + +// A Position describes the location of a rune of input. +type Position struct { + file *string // filename (indirect for compactness) + Line int32 // 1-based line number; 0 if line unknown + Col int32 // 1-based column (rune) number; 0 if column unknown +} + +// IsValid reports whether the position is valid. +func (p Position) IsValid() bool { return p.file != nil } + +// Filename returns the name of the file containing this position. +func (p Position) Filename() string { + if p.file != nil { + return *p.file + } + return "" +} + +// MakePosition returns position with the specified components. +func MakePosition(file *string, line, col int32) Position { return Position{file, line, col} } + +// add returns the position at the end of s, assuming it starts at p. +func (p Position) add(s string) Position { + if n := strings.Count(s, "\n"); n > 0 { + p.Line += int32(n) + s = s[strings.LastIndex(s, "\n")+1:] + p.Col = 1 + } + p.Col += int32(utf8.RuneCountInString(s)) + return p +} + +func (p Position) String() string { + file := p.Filename() + if p.Line > 0 { + if p.Col > 0 { + return fmt.Sprintf("%s:%d:%d", file, p.Line, p.Col) + } + return fmt.Sprintf("%s:%d", file, p.Line) + } + return file +} + +func (p Position) isBefore(q Position) bool { + if p.Line != q.Line { + return p.Line < q.Line + } + return p.Col < q.Col +} + +// An scanner represents a single input file being parsed. +type scanner struct { + rest []byte // rest of input (in REPL, a line of input) + token []byte // token being scanned + pos Position // current input position + depth int // nesting of [ ] { } ( ) + indentstk []int // stack of indentation levels + dents int // number of saved INDENT (>0) or OUTDENT (<0) tokens to return + lineStart bool // after NEWLINE; convert spaces to indentation tokens + keepComments bool // accumulate comments in slice + lineComments []Comment // list of full line comments (if keepComments) + suffixComments []Comment // list of suffix comments (if keepComments) + + readline func() ([]byte, error) // read next line of input (REPL only) +} + +func newScanner(filename string, src interface{}, keepComments bool) (*scanner, error) { + sc := &scanner{ + pos: Position{file: &filename, Line: 1, Col: 1}, + indentstk: make([]int, 1, 10), // []int{0} + spare capacity + lineStart: true, + keepComments: keepComments, + } + sc.readline, _ = src.(func() ([]byte, error)) // REPL only + if sc.readline == nil { + data, err := readSource(filename, src) + if err != nil { + return nil, err + } + sc.rest = data + } + return sc, nil +} + +func readSource(filename string, src interface{}) ([]byte, error) { + switch src := src.(type) { + case string: + return []byte(src), nil + case []byte: + return src, nil + case io.Reader: + data, err := ioutil.ReadAll(src) + if err != nil { + err = &os.PathError{Op: "read", Path: filename, Err: err} + return nil, err + } + return data, nil + case nil: + return ioutil.ReadFile(filename) + default: + return nil, fmt.Errorf("invalid source: %T", src) + } +} + +// An Error describes the nature and position of a scanner or parser error. +type Error struct { + Pos Position + Msg string +} + +func (e Error) Error() string { return e.Pos.String() + ": " + e.Msg } + +// errorf is called to report an error. +// errorf does not return: it panics. +func (sc *scanner) error(pos Position, s string) { + panic(Error{pos, s}) +} + +func (sc *scanner) errorf(pos Position, format string, args ...interface{}) { + sc.error(pos, fmt.Sprintf(format, args...)) +} + +func (sc *scanner) recover(err *error) { + // The scanner and parser panic both for routine errors like + // syntax errors and for programmer bugs like array index + // errors. Turn both into error returns. Catching bug panics + // is especially important when processing many files. + switch e := recover().(type) { + case nil: + // no panic + case Error: + *err = e + default: + *err = Error{sc.pos, fmt.Sprintf("internal error: %v", e)} + if debug { + log.Fatal(*err) + } + } +} + +// eof reports whether the input has reached end of file. +func (sc *scanner) eof() bool { + return len(sc.rest) == 0 && !sc.readLine() +} + +// readLine attempts to read another line of input. +// Precondition: len(sc.rest)==0. +func (sc *scanner) readLine() bool { + if sc.readline != nil { + var err error + sc.rest, err = sc.readline() + if err != nil { + sc.errorf(sc.pos, "%v", err) // EOF or ErrInterrupt + } + return len(sc.rest) > 0 + } + return false +} + +// peekRune returns the next rune in the input without consuming it. +// Newlines in Unix, DOS, or Mac format are treated as one rune, '\n'. +func (sc *scanner) peekRune() rune { + // TODO(adonovan): opt: measure and perhaps inline eof. + if sc.eof() { + return 0 + } + + // fast path: ASCII + if b := sc.rest[0]; b < utf8.RuneSelf { + if b == '\r' { + return '\n' + } + return rune(b) + } + + r, _ := utf8.DecodeRune(sc.rest) + return r +} + +// readRune consumes and returns the next rune in the input. +// Newlines in Unix, DOS, or Mac format are treated as one rune, '\n'. +func (sc *scanner) readRune() rune { + // eof() has been inlined here, both to avoid a call + // and to establish len(rest)>0 to avoid a bounds check. + if len(sc.rest) == 0 { + if !sc.readLine() { + sc.error(sc.pos, "internal scanner error: readRune at EOF") + } + // Redundant, but eliminates the bounds-check below. + if len(sc.rest) == 0 { + return 0 + } + } + + // fast path: ASCII + if b := sc.rest[0]; b < utf8.RuneSelf { + r := rune(b) + sc.rest = sc.rest[1:] + if r == '\r' { + if len(sc.rest) > 0 && sc.rest[0] == '\n' { + sc.rest = sc.rest[1:] + } + r = '\n' + } + if r == '\n' { + sc.pos.Line++ + sc.pos.Col = 1 + } else { + sc.pos.Col++ + } + return r + } + + r, size := utf8.DecodeRune(sc.rest) + sc.rest = sc.rest[size:] + sc.pos.Col++ + return r +} + +// tokenValue records the position and value associated with each token. +type tokenValue struct { + raw string // raw text of token + int int64 // decoded int + bigInt *big.Int // decoded integers > int64 + float float64 // decoded float + string string // decoded string + pos Position // start position of token +} + +// startToken marks the beginning of the next input token. +// It must be followed by a call to endToken once the token has +// been consumed using readRune. +func (sc *scanner) startToken(val *tokenValue) { + sc.token = sc.rest + val.raw = "" + val.pos = sc.pos +} + +// endToken marks the end of an input token. +// It records the actual token string in val.raw if the caller +// has not done that already. +func (sc *scanner) endToken(val *tokenValue) { + if val.raw == "" { + val.raw = string(sc.token[:len(sc.token)-len(sc.rest)]) + } +} + +// nextToken is called by the parser to obtain the next input token. +// It returns the token value and sets val to the data associated with +// the token. +// +// For all our input tokens, the associated data is val.pos (the +// position where the token begins), val.raw (the input string +// corresponding to the token). For string and int tokens, the string +// and int fields additionally contain the token's interpreted value. +func (sc *scanner) nextToken(val *tokenValue) Token { + + // The following distribution of tokens guides case ordering: + // + // COMMA 27 % + // STRING 23 % + // IDENT 15 % + // EQL 11 % + // LBRACK 5.5 % + // RBRACK 5.5 % + // NEWLINE 3 % + // LPAREN 2.9 % + // RPAREN 2.9 % + // INT 2 % + // others < 1 % + // + // Although NEWLINE tokens are infrequent, and lineStart is + // usually (~97%) false on entry, skipped newlines account for + // about 50% of all iterations of the 'start' loop. + +start: + var c rune + + // Deal with leading spaces and indentation. + blank := false + savedLineStart := sc.lineStart + if sc.lineStart { + sc.lineStart = false + col := 0 + for { + c = sc.peekRune() + if c == ' ' { + col++ + sc.readRune() + } else if c == '\t' { + const tab = 8 + col += int(tab - (sc.pos.Col-1)%tab) + sc.readRune() + } else { + break + } + } + + // The third clause matches EOF. + if c == '#' || c == '\n' || c == 0 { + blank = true + } + + // Compute indentation level for non-blank lines not + // inside an expression. This is not the common case. + if !blank && sc.depth == 0 { + cur := sc.indentstk[len(sc.indentstk)-1] + if col > cur { + // indent + sc.dents++ + sc.indentstk = append(sc.indentstk, col) + } else if col < cur { + // outdent(s) + for len(sc.indentstk) > 0 && col < sc.indentstk[len(sc.indentstk)-1] { + sc.dents-- + sc.indentstk = sc.indentstk[:len(sc.indentstk)-1] // pop + } + if col != sc.indentstk[len(sc.indentstk)-1] { + sc.error(sc.pos, "unindent does not match any outer indentation level") + } + } + } + } + + // Return saved indentation tokens. + if sc.dents != 0 { + sc.startToken(val) + sc.endToken(val) + if sc.dents < 0 { + sc.dents++ + return OUTDENT + } else { + sc.dents-- + return INDENT + } + } + + // start of line proper + c = sc.peekRune() + + // Skip spaces. + for c == ' ' || c == '\t' { + sc.readRune() + c = sc.peekRune() + } + + // comment + if c == '#' { + if sc.keepComments { + sc.startToken(val) + } + // Consume up to newline (included). + for c != 0 && c != '\n' { + sc.readRune() + c = sc.peekRune() + } + if sc.keepComments { + sc.endToken(val) + if blank { + sc.lineComments = append(sc.lineComments, Comment{val.pos, val.raw}) + } else { + sc.suffixComments = append(sc.suffixComments, Comment{val.pos, val.raw}) + } + } + } + + // newline + if c == '\n' { + sc.lineStart = true + + // Ignore newlines within expressions (common case). + if sc.depth > 0 { + sc.readRune() + goto start + } + + // Ignore blank lines, except in the REPL, + // where they emit OUTDENTs and NEWLINE. + if blank { + if sc.readline == nil { + sc.readRune() + goto start + } else if len(sc.indentstk) > 1 { + sc.dents = 1 - len(sc.indentstk) + sc.indentstk = sc.indentstk[:1] + goto start + } + } + + // At top-level (not in an expression). + sc.startToken(val) + sc.readRune() + val.raw = "\n" + return NEWLINE + } + + // end of file + if c == 0 { + // Emit OUTDENTs for unfinished indentation, + // preceded by a NEWLINE if we haven't just emitted one. + if len(sc.indentstk) > 1 { + if savedLineStart { + sc.dents = 1 - len(sc.indentstk) + sc.indentstk = sc.indentstk[:1] + goto start + } else { + sc.lineStart = true + sc.startToken(val) + val.raw = "\n" + return NEWLINE + } + } + + sc.startToken(val) + sc.endToken(val) + return EOF + } + + // line continuation + if c == '\\' { + sc.readRune() + if sc.peekRune() != '\n' { + sc.errorf(sc.pos, "stray backslash in program") + } + sc.readRune() + goto start + } + + // start of the next token + sc.startToken(val) + + // comma (common case) + if c == ',' { + sc.readRune() + sc.endToken(val) + return COMMA + } + + // string literal + if c == '"' || c == '\'' { + return sc.scanString(val, c) + } + + // identifier or keyword + if isIdentStart(c) { + // raw string literal + if c == 'r' && len(sc.rest) > 1 && (sc.rest[1] == '"' || sc.rest[1] == '\'') { + sc.readRune() + c = sc.peekRune() + return sc.scanString(val, c) + } + + for isIdent(c) { + sc.readRune() + c = sc.peekRune() + } + sc.endToken(val) + if k, ok := keywordToken[val.raw]; ok { + return k + } + + return IDENT + } + + // brackets + switch c { + case '[', '(', '{': + sc.depth++ + sc.readRune() + sc.endToken(val) + switch c { + case '[': + return LBRACK + case '(': + return LPAREN + case '{': + return LBRACE + } + panic("unreachable") + + case ']', ')', '}': + if sc.depth == 0 { + sc.errorf(sc.pos, "unexpected %q", c) + } else { + sc.depth-- + } + sc.readRune() + sc.endToken(val) + switch c { + case ']': + return RBRACK + case ')': + return RPAREN + case '}': + return RBRACE + } + panic("unreachable") + } + + // int or float literal, or period + if isdigit(c) || c == '.' { + return sc.scanNumber(val, c) + } + + // other punctuation + defer sc.endToken(val) + switch c { + case '=', '<', '>', '!', '+', '-', '%', '/', '&', '|', '^': // possibly followed by '=' + start := sc.pos + sc.readRune() + if sc.peekRune() == '=' { + sc.readRune() + switch c { + case '<': + return LE + case '>': + return GE + case '=': + return EQL + case '!': + return NEQ + case '+': + return PLUS_EQ + case '-': + return MINUS_EQ + case '/': + return SLASH_EQ + case '%': + return PERCENT_EQ + case '&': + return AMP_EQ + case '|': + return PIPE_EQ + case '^': + return CIRCUMFLEX_EQ + } + } + switch c { + case '=': + return EQ + case '<': + if sc.peekRune() == '<' { + sc.readRune() + if sc.peekRune() == '=' { + sc.readRune() + return LTLT_EQ + } else { + return LTLT + } + } + return LT + case '>': + if sc.peekRune() == '>' { + sc.readRune() + if sc.peekRune() == '=' { + sc.readRune() + return GTGT_EQ + } else { + return GTGT + } + } + return GT + case '!': + sc.error(start, "unexpected input character '!'") + case '+': + return PLUS + case '-': + return MINUS + case '/': + if sc.peekRune() == '/' { + sc.readRune() + if sc.peekRune() == '=' { + sc.readRune() + return SLASHSLASH_EQ + } else { + return SLASHSLASH + } + } + return SLASH + case '%': + return PERCENT + case '&': + return AMP + case '|': + return PIPE + case '^': + return CIRCUMFLEX + } + panic("unreachable") + + case ':', ';', '~': // single-char tokens (except comma) + sc.readRune() + switch c { + case ':': + return COLON + case ';': + return SEMI + case '~': + return TILDE + } + panic("unreachable") + + case '*': // possibly followed by '*' or '=' + sc.readRune() + switch sc.peekRune() { + case '*': + sc.readRune() + return STARSTAR + case '=': + sc.readRune() + return STAR_EQ + } + return STAR + } + + sc.errorf(sc.pos, "unexpected input character %#q", c) + panic("unreachable") +} + +func (sc *scanner) scanString(val *tokenValue, quote rune) Token { + start := sc.pos + triple := len(sc.rest) >= 3 && sc.rest[0] == byte(quote) && sc.rest[1] == byte(quote) && sc.rest[2] == byte(quote) + sc.readRune() + if !triple { + // Precondition: startToken was already called. + for { + if sc.eof() { + sc.error(val.pos, "unexpected EOF in string") + } + c := sc.readRune() + if c == quote { + break + } + if c == '\n' { + sc.error(val.pos, "unexpected newline in string") + } + if c == '\\' { + if sc.eof() { + sc.error(val.pos, "unexpected EOF in string") + } + sc.readRune() + } + } + sc.endToken(val) + } else { + // triple-quoted string literal + sc.readRune() + sc.readRune() + + // A triple-quoted string literal may span multiple + // gulps of REPL input; it is the only such token. + // Thus we must avoid {start,end}Token. + raw := new(strings.Builder) + + // Copy the prefix, e.g. r''' or """ (see startToken). + raw.Write(sc.token[:len(sc.token)-len(sc.rest)]) + + quoteCount := 0 + for { + if sc.eof() { + sc.error(val.pos, "unexpected EOF in string") + } + c := sc.readRune() + raw.WriteRune(c) + if c == quote { + quoteCount++ + if quoteCount == 3 { + break + } + } else { + quoteCount = 0 + } + if c == '\\' { + if sc.eof() { + sc.error(val.pos, "unexpected EOF in string") + } + c = sc.readRune() + raw.WriteRune(c) + } + } + val.raw = raw.String() + } + + s, _, err := unquote(val.raw) + if err != nil { + sc.error(start, err.Error()) + } + val.string = s + return STRING +} + +func (sc *scanner) scanNumber(val *tokenValue, c rune) Token { + // https://github.com/google/starlark-go/blob/master/doc/spec.md#lexical-elements + // + // Python features not supported: + // - integer literals of >64 bits of precision + // - 123L or 123l long suffix + // - traditional octal: 0755 + // https://docs.python.org/2/reference/lexical_analysis.html#integer-and-long-integer-literals + + start := sc.pos + fraction, exponent := false, false + + if c == '.' { + // dot or start of fraction + sc.readRune() + c = sc.peekRune() + if !isdigit(c) { + sc.endToken(val) + return DOT + } + fraction = true + } else if c == '0' { + // hex, octal, binary or float + sc.readRune() + c = sc.peekRune() + + if c == '.' { + fraction = true + } else if c == 'x' || c == 'X' { + // hex + sc.readRune() + c = sc.peekRune() + if !isxdigit(c) { + sc.error(start, "invalid hex literal") + } + for isxdigit(c) { + sc.readRune() + c = sc.peekRune() + } + } else if c == 'o' || c == 'O' { + // octal + sc.readRune() + c = sc.peekRune() + if !isodigit(c) { + sc.error(sc.pos, "invalid octal literal") + } + for isodigit(c) { + sc.readRune() + c = sc.peekRune() + } + } else if c == 'b' || c == 'B' { + // binary + sc.readRune() + c = sc.peekRune() + if !isbdigit(c) { + sc.error(sc.pos, "invalid binary literal") + } + for isbdigit(c) { + sc.readRune() + c = sc.peekRune() + } + } else { + // float (or obsolete octal "0755") + allzeros, octal := true, true + for isdigit(c) { + if c != '0' { + allzeros = false + } + if c > '7' { + octal = false + } + sc.readRune() + c = sc.peekRune() + } + if c == '.' { + fraction = true + } else if c == 'e' || c == 'E' { + exponent = true + } else if octal && !allzeros { + sc.endToken(val) + sc.errorf(sc.pos, "obsolete form of octal literal; use 0o%s", val.raw[1:]) + } + } + } else { + // decimal + for isdigit(c) { + sc.readRune() + c = sc.peekRune() + } + + if c == '.' { + fraction = true + } else if c == 'e' || c == 'E' { + exponent = true + } + } + + if fraction { + sc.readRune() // consume '.' + c = sc.peekRune() + for isdigit(c) { + sc.readRune() + c = sc.peekRune() + } + + if c == 'e' || c == 'E' { + exponent = true + } + } + + if exponent { + sc.readRune() // consume [eE] + c = sc.peekRune() + if c == '+' || c == '-' { + sc.readRune() + c = sc.peekRune() + if !isdigit(c) { + sc.error(sc.pos, "invalid float literal") + } + } + for isdigit(c) { + sc.readRune() + c = sc.peekRune() + } + } + + sc.endToken(val) + if fraction || exponent { + var err error + val.float, err = strconv.ParseFloat(val.raw, 64) + if err != nil { + sc.error(sc.pos, "invalid float literal") + } + return FLOAT + } else { + var err error + s := val.raw + val.bigInt = nil + if len(s) > 2 && s[0] == '0' && (s[1] == 'o' || s[1] == 'O') { + val.int, err = strconv.ParseInt(s[2:], 8, 64) + } else if len(s) > 2 && s[0] == '0' && (s[1] == 'b' || s[1] == 'B') { + val.int, err = strconv.ParseInt(s[2:], 2, 64) + } else { + val.int, err = strconv.ParseInt(s, 0, 64) + if err != nil { + num := new(big.Int) + var ok bool + val.bigInt, ok = num.SetString(s, 0) + if ok { + err = nil + } + } + } + if err != nil { + sc.error(start, "invalid int literal") + } + return INT + } +} + +// isIdent reports whether c is an identifier rune. +func isIdent(c rune) bool { + return isdigit(c) || isIdentStart(c) +} + +func isIdentStart(c rune) bool { + return 'a' <= c && c <= 'z' || + 'A' <= c && c <= 'Z' || + c == '_' || + unicode.IsLetter(c) +} + +func isdigit(c rune) bool { return '0' <= c && c <= '9' } +func isodigit(c rune) bool { return '0' <= c && c <= '7' } +func isxdigit(c rune) bool { return isdigit(c) || 'A' <= c && c <= 'F' || 'a' <= c && c <= 'f' } +func isbdigit(c rune) bool { return '0' == c || c == '1' } + +// keywordToken records the special tokens for +// strings that should not be treated as ordinary identifiers. +var keywordToken = map[string]Token{ + "and": AND, + "break": BREAK, + "continue": CONTINUE, + "def": DEF, + "elif": ELIF, + "else": ELSE, + "for": FOR, + "if": IF, + "in": IN, + "lambda": LAMBDA, + "load": LOAD, + "not": NOT, + "or": OR, + "pass": PASS, + "return": RETURN, + "while": WHILE, + + // reserved words: + "as": ILLEGAL, + // "assert": ILLEGAL, // heavily used by our tests + "class": ILLEGAL, + "del": ILLEGAL, + "except": ILLEGAL, + "finally": ILLEGAL, + "from": ILLEGAL, + "global": ILLEGAL, + "import": ILLEGAL, + "is": ILLEGAL, + "nonlocal": ILLEGAL, + "raise": ILLEGAL, + "try": ILLEGAL, + "with": ILLEGAL, + "yield": ILLEGAL, +} diff --git a/vendor/go.starlark.net/syntax/syntax.go b/vendor/go.starlark.net/syntax/syntax.go new file mode 100644 index 000000000000..b4817c1a2852 --- /dev/null +++ b/vendor/go.starlark.net/syntax/syntax.go @@ -0,0 +1,529 @@ +// Copyright 2017 The Bazel Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package syntax provides a Starlark parser and abstract syntax tree. +package syntax // import "go.starlark.net/syntax" + +// A Node is a node in a Starlark syntax tree. +type Node interface { + // Span returns the start and end position of the expression. + Span() (start, end Position) + + // Comments returns the comments associated with this node. + // It returns nil if RetainComments was not specified during parsing, + // or if AllocComments was not called. + Comments() *Comments + + // AllocComments allocates a new Comments node if there was none. + // This makes possible to add new comments using Comments() method. + AllocComments() +} + +// A Comment represents a single # comment. +type Comment struct { + Start Position + Text string // without trailing newline +} + +// Comments collects the comments associated with an expression. +type Comments struct { + Before []Comment // whole-line comments before this expression + Suffix []Comment // end-of-line comments after this expression (up to 1) + + // For top-level expressions only, After lists whole-line + // comments following the expression. + After []Comment +} + +// A commentsRef is a possibly-nil reference to a set of comments. +// A commentsRef is embedded in each type of syntax node, +// and provides its Comments and AllocComments methods. +type commentsRef struct{ ref *Comments } + +// Comments returns the comments associated with a syntax node, +// or nil if AllocComments has not yet been called. +func (cr commentsRef) Comments() *Comments { return cr.ref } + +// AllocComments enables comments to be associated with a syntax node. +func (cr *commentsRef) AllocComments() { + if cr.ref == nil { + cr.ref = new(Comments) + } +} + +// Start returns the start position of the expression. +func Start(n Node) Position { + start, _ := n.Span() + return start +} + +// End returns the end position of the expression. +func End(n Node) Position { + _, end := n.Span() + return end +} + +// A File represents a Starlark file. +type File struct { + commentsRef + Path string + Stmts []Stmt + + Module interface{} // a *resolve.Module, set by resolver +} + +func (x *File) Span() (start, end Position) { + if len(x.Stmts) == 0 { + return + } + start, _ = x.Stmts[0].Span() + _, end = x.Stmts[len(x.Stmts)-1].Span() + return start, end +} + +// A Stmt is a Starlark statement. +type Stmt interface { + Node + stmt() +} + +func (*AssignStmt) stmt() {} +func (*BranchStmt) stmt() {} +func (*DefStmt) stmt() {} +func (*ExprStmt) stmt() {} +func (*ForStmt) stmt() {} +func (*WhileStmt) stmt() {} +func (*IfStmt) stmt() {} +func (*LoadStmt) stmt() {} +func (*ReturnStmt) stmt() {} + +// An AssignStmt represents an assignment: +// x = 0 +// x, y = y, x +// x += 1 +type AssignStmt struct { + commentsRef + OpPos Position + Op Token // = EQ | {PLUS,MINUS,STAR,PERCENT}_EQ + LHS Expr + RHS Expr +} + +func (x *AssignStmt) Span() (start, end Position) { + start, _ = x.LHS.Span() + _, end = x.RHS.Span() + return +} + +// A DefStmt represents a function definition. +type DefStmt struct { + commentsRef + Def Position + Name *Ident + Params []Expr // param = ident | ident=expr | * | *ident | **ident + Body []Stmt + + Function interface{} // a *resolve.Function, set by resolver +} + +func (x *DefStmt) Span() (start, end Position) { + _, end = x.Body[len(x.Body)-1].Span() + return x.Def, end +} + +// An ExprStmt is an expression evaluated for side effects. +type ExprStmt struct { + commentsRef + X Expr +} + +func (x *ExprStmt) Span() (start, end Position) { + return x.X.Span() +} + +// An IfStmt is a conditional: If Cond: True; else: False. +// 'elseif' is desugared into a chain of IfStmts. +type IfStmt struct { + commentsRef + If Position // IF or ELIF + Cond Expr + True []Stmt + ElsePos Position // ELSE or ELIF + False []Stmt // optional +} + +func (x *IfStmt) Span() (start, end Position) { + body := x.False + if body == nil { + body = x.True + } + _, end = body[len(body)-1].Span() + return x.If, end +} + +// A LoadStmt loads another module and binds names from it: +// load(Module, "x", y="foo"). +// +// The AST is slightly unfaithful to the concrete syntax here because +// Starlark's load statement, so that it can be implemented in Python, +// binds some names (like y above) with an identifier and some (like x) +// without. For consistency we create fake identifiers for all the +// strings. +type LoadStmt struct { + commentsRef + Load Position + Module *Literal // a string + From []*Ident // name defined in loading module + To []*Ident // name in loaded module + Rparen Position +} + +func (x *LoadStmt) Span() (start, end Position) { + return x.Load, x.Rparen +} + +// ModuleName returns the name of the module loaded by this statement. +func (x *LoadStmt) ModuleName() string { return x.Module.Value.(string) } + +// A BranchStmt changes the flow of control: break, continue, pass. +type BranchStmt struct { + commentsRef + Token Token // = BREAK | CONTINUE | PASS + TokenPos Position +} + +func (x *BranchStmt) Span() (start, end Position) { + return x.TokenPos, x.TokenPos.add(x.Token.String()) +} + +// A ReturnStmt returns from a function. +type ReturnStmt struct { + commentsRef + Return Position + Result Expr // may be nil +} + +func (x *ReturnStmt) Span() (start, end Position) { + if x.Result == nil { + return x.Return, x.Return.add("return") + } + _, end = x.Result.Span() + return x.Return, end +} + +// An Expr is a Starlark expression. +type Expr interface { + Node + expr() +} + +func (*BinaryExpr) expr() {} +func (*CallExpr) expr() {} +func (*Comprehension) expr() {} +func (*CondExpr) expr() {} +func (*DictEntry) expr() {} +func (*DictExpr) expr() {} +func (*DotExpr) expr() {} +func (*Ident) expr() {} +func (*IndexExpr) expr() {} +func (*LambdaExpr) expr() {} +func (*ListExpr) expr() {} +func (*Literal) expr() {} +func (*ParenExpr) expr() {} +func (*SliceExpr) expr() {} +func (*TupleExpr) expr() {} +func (*UnaryExpr) expr() {} + +// An Ident represents an identifier. +type Ident struct { + commentsRef + NamePos Position + Name string + + Binding interface{} // a *resolver.Binding, set by resolver +} + +func (x *Ident) Span() (start, end Position) { + return x.NamePos, x.NamePos.add(x.Name) +} + +// A Literal represents a literal string or number. +type Literal struct { + commentsRef + Token Token // = STRING | INT + TokenPos Position + Raw string // uninterpreted text + Value interface{} // = string | int64 | *big.Int +} + +func (x *Literal) Span() (start, end Position) { + return x.TokenPos, x.TokenPos.add(x.Raw) +} + +// A ParenExpr represents a parenthesized expression: (X). +type ParenExpr struct { + commentsRef + Lparen Position + X Expr + Rparen Position +} + +func (x *ParenExpr) Span() (start, end Position) { + return x.Lparen, x.Rparen.add(")") +} + +// A CallExpr represents a function call expression: Fn(Args). +type CallExpr struct { + commentsRef + Fn Expr + Lparen Position + Args []Expr // arg = expr | ident=expr | *expr | **expr + Rparen Position +} + +func (x *CallExpr) Span() (start, end Position) { + start, _ = x.Fn.Span() + return start, x.Rparen.add(")") +} + +// A DotExpr represents a field or method selector: X.Name. +type DotExpr struct { + commentsRef + X Expr + Dot Position + NamePos Position + Name *Ident +} + +func (x *DotExpr) Span() (start, end Position) { + start, _ = x.X.Span() + _, end = x.Name.Span() + return +} + +// A Comprehension represents a list or dict comprehension: +// [Body for ... if ...] or {Body for ... if ...} +type Comprehension struct { + commentsRef + Curly bool // {x:y for ...} or {x for ...}, not [x for ...] + Lbrack Position + Body Expr + Clauses []Node // = *ForClause | *IfClause + Rbrack Position +} + +func (x *Comprehension) Span() (start, end Position) { + return x.Lbrack, x.Rbrack.add("]") +} + +// A ForStmt represents a loop: for Vars in X: Body. +type ForStmt struct { + commentsRef + For Position + Vars Expr // name, or tuple of names + X Expr + Body []Stmt +} + +func (x *ForStmt) Span() (start, end Position) { + _, end = x.Body[len(x.Body)-1].Span() + return x.For, end +} + +// A WhileStmt represents a while loop: while X: Body. +type WhileStmt struct { + commentsRef + While Position + Cond Expr + Body []Stmt +} + +func (x *WhileStmt) Span() (start, end Position) { + _, end = x.Body[len(x.Body)-1].Span() + return x.While, end +} + +// A ForClause represents a for clause in a list comprehension: for Vars in X. +type ForClause struct { + commentsRef + For Position + Vars Expr // name, or tuple of names + In Position + X Expr +} + +func (x *ForClause) Span() (start, end Position) { + _, end = x.X.Span() + return x.For, end +} + +// An IfClause represents an if clause in a list comprehension: if Cond. +type IfClause struct { + commentsRef + If Position + Cond Expr +} + +func (x *IfClause) Span() (start, end Position) { + _, end = x.Cond.Span() + return x.If, end +} + +// A DictExpr represents a dictionary literal: { List }. +type DictExpr struct { + commentsRef + Lbrace Position + List []Expr // all *DictEntrys + Rbrace Position +} + +func (x *DictExpr) Span() (start, end Position) { + return x.Lbrace, x.Rbrace.add("}") +} + +// A DictEntry represents a dictionary entry: Key: Value. +// Used only within a DictExpr. +type DictEntry struct { + commentsRef + Key Expr + Colon Position + Value Expr +} + +func (x *DictEntry) Span() (start, end Position) { + start, _ = x.Key.Span() + _, end = x.Value.Span() + return start, end +} + +// A LambdaExpr represents an inline function abstraction. +// +// Although they may be added in future, lambda expressions are not +// currently part of the Starlark spec, so their use is controlled by the +// resolver.AllowLambda flag. +type LambdaExpr struct { + commentsRef + Lambda Position + Params []Expr // param = ident | ident=expr | * | *ident | **ident + Body Expr + + Function interface{} // a *resolve.Function, set by resolver +} + +func (x *LambdaExpr) Span() (start, end Position) { + _, end = x.Body.Span() + return x.Lambda, end +} + +// A ListExpr represents a list literal: [ List ]. +type ListExpr struct { + commentsRef + Lbrack Position + List []Expr + Rbrack Position +} + +func (x *ListExpr) Span() (start, end Position) { + return x.Lbrack, x.Rbrack.add("]") +} + +// CondExpr represents the conditional: X if COND else ELSE. +type CondExpr struct { + commentsRef + If Position + Cond Expr + True Expr + ElsePos Position + False Expr +} + +func (x *CondExpr) Span() (start, end Position) { + start, _ = x.True.Span() + _, end = x.False.Span() + return start, end +} + +// A TupleExpr represents a tuple literal: (List). +type TupleExpr struct { + commentsRef + Lparen Position // optional (e.g. in x, y = 0, 1), but required if List is empty + List []Expr + Rparen Position +} + +func (x *TupleExpr) Span() (start, end Position) { + if x.Lparen.IsValid() { + return x.Lparen, x.Rparen + } else { + return Start(x.List[0]), End(x.List[len(x.List)-1]) + } +} + +// A UnaryExpr represents a unary expression: Op X. +// +// As a special case, UnaryOp{Op:Star} may also represent +// the star parameter in def f(*args) or def f(*, x). +type UnaryExpr struct { + commentsRef + OpPos Position + Op Token + X Expr // may be nil if Op==STAR +} + +func (x *UnaryExpr) Span() (start, end Position) { + if x.X != nil { + _, end = x.X.Span() + } else { + end = x.OpPos.add("*") + } + return x.OpPos, end +} + +// A BinaryExpr represents a binary expression: X Op Y. +// +// As a special case, BinaryExpr{Op:EQ} may also +// represent a named argument in a call f(k=v) +// or a named parameter in a function declaration +// def f(param=default). +type BinaryExpr struct { + commentsRef + X Expr + OpPos Position + Op Token + Y Expr +} + +func (x *BinaryExpr) Span() (start, end Position) { + start, _ = x.X.Span() + _, end = x.Y.Span() + return start, end +} + +// A SliceExpr represents a slice or substring expression: X[Lo:Hi:Step]. +type SliceExpr struct { + commentsRef + X Expr + Lbrack Position + Lo, Hi, Step Expr // all optional + Rbrack Position +} + +func (x *SliceExpr) Span() (start, end Position) { + start, _ = x.X.Span() + return start, x.Rbrack +} + +// An IndexExpr represents an index expression: X[Y]. +type IndexExpr struct { + commentsRef + X Expr + Lbrack Position + Y Expr + Rbrack Position +} + +func (x *IndexExpr) Span() (start, end Position) { + start, _ = x.X.Span() + return start, x.Rbrack +} diff --git a/vendor/go.starlark.net/syntax/walk.go b/vendor/go.starlark.net/syntax/walk.go new file mode 100644 index 000000000000..1491149c6a47 --- /dev/null +++ b/vendor/go.starlark.net/syntax/walk.go @@ -0,0 +1,163 @@ +// Copyright 2017 The Bazel Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package syntax + +// Walk traverses a syntax tree in depth-first order. +// It starts by calling f(n); n must not be nil. +// If f returns true, Walk calls itself +// recursively for each non-nil child of n. +// Walk then calls f(nil). +func Walk(n Node, f func(Node) bool) { + if n == nil { + panic("nil") + } + if !f(n) { + return + } + + // TODO(adonovan): opt: order cases using profile data. + switch n := n.(type) { + case *File: + walkStmts(n.Stmts, f) + + case *ExprStmt: + Walk(n.X, f) + + case *BranchStmt: + // no-op + + case *IfStmt: + Walk(n.Cond, f) + walkStmts(n.True, f) + walkStmts(n.False, f) + + case *AssignStmt: + Walk(n.LHS, f) + Walk(n.RHS, f) + + case *DefStmt: + Walk(n.Name, f) + for _, param := range n.Params { + Walk(param, f) + } + walkStmts(n.Body, f) + + case *ForStmt: + Walk(n.Vars, f) + Walk(n.X, f) + walkStmts(n.Body, f) + + case *ReturnStmt: + if n.Result != nil { + Walk(n.Result, f) + } + + case *LoadStmt: + Walk(n.Module, f) + for _, from := range n.From { + Walk(from, f) + } + for _, to := range n.To { + Walk(to, f) + } + + case *Ident, *Literal: + // no-op + + case *ListExpr: + for _, x := range n.List { + Walk(x, f) + } + + case *ParenExpr: + Walk(n.X, f) + + case *CondExpr: + Walk(n.Cond, f) + Walk(n.True, f) + Walk(n.False, f) + + case *IndexExpr: + Walk(n.X, f) + Walk(n.Y, f) + + case *DictEntry: + Walk(n.Key, f) + Walk(n.Value, f) + + case *SliceExpr: + Walk(n.X, f) + if n.Lo != nil { + Walk(n.Lo, f) + } + if n.Hi != nil { + Walk(n.Hi, f) + } + if n.Step != nil { + Walk(n.Step, f) + } + + case *Comprehension: + Walk(n.Body, f) + for _, clause := range n.Clauses { + Walk(clause, f) + } + + case *IfClause: + Walk(n.Cond, f) + + case *ForClause: + Walk(n.Vars, f) + Walk(n.X, f) + + case *TupleExpr: + for _, x := range n.List { + Walk(x, f) + } + + case *DictExpr: + for _, entry := range n.List { + entry := entry.(*DictEntry) + Walk(entry.Key, f) + Walk(entry.Value, f) + } + + case *UnaryExpr: + if n.X != nil { + Walk(n.X, f) + } + + case *BinaryExpr: + Walk(n.X, f) + Walk(n.Y, f) + + case *DotExpr: + Walk(n.X, f) + Walk(n.Name, f) + + case *CallExpr: + Walk(n.Fn, f) + for _, arg := range n.Args { + Walk(arg, f) + } + + case *LambdaExpr: + for _, param := range n.Params { + Walk(param, f) + } + Walk(n.Body, f) + + default: + panic(n) + } + + f(nil) +} + +func walkStmts(stmts []Stmt, f func(Node) bool) { + for _, stmt := range stmts { + Walk(stmt, f) + } +} diff --git a/vendor/golang.org/x/crypto/chacha20/chacha_arm64.go b/vendor/golang.org/x/crypto/chacha20/chacha_arm64.go index b799e440b4a1..94c71ac1ac86 100644 --- a/vendor/golang.org/x/crypto/chacha20/chacha_arm64.go +++ b/vendor/golang.org/x/crypto/chacha20/chacha_arm64.go @@ -2,7 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build go1.11,!gccgo,!purego +//go:build go1.11 && gc && !purego +// +build go1.11,gc,!purego package chacha20 diff --git a/vendor/golang.org/x/crypto/chacha20/chacha_arm64.s b/vendor/golang.org/x/crypto/chacha20/chacha_arm64.s index 891481539a11..8fb49a13e3bf 100644 --- a/vendor/golang.org/x/crypto/chacha20/chacha_arm64.s +++ b/vendor/golang.org/x/crypto/chacha20/chacha_arm64.s @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build go1.11,!gccgo,!purego +// +build go1.11,gc,!purego #include "textflag.h" diff --git a/vendor/golang.org/x/crypto/chacha20/chacha_noasm.go b/vendor/golang.org/x/crypto/chacha20/chacha_noasm.go index 4635307b8f29..025b49897e32 100644 --- a/vendor/golang.org/x/crypto/chacha20/chacha_noasm.go +++ b/vendor/golang.org/x/crypto/chacha20/chacha_noasm.go @@ -2,7 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build !arm64,!s390x,!ppc64le arm64,!go1.11 gccgo purego +//go:build (!arm64 && !s390x && !ppc64le) || (arm64 && !go1.11) || !gc || purego +// +build !arm64,!s390x,!ppc64le arm64,!go1.11 !gc purego package chacha20 diff --git a/vendor/golang.org/x/crypto/chacha20/chacha_ppc64le.go b/vendor/golang.org/x/crypto/chacha20/chacha_ppc64le.go index b79933034156..da420b2e97b0 100644 --- a/vendor/golang.org/x/crypto/chacha20/chacha_ppc64le.go +++ b/vendor/golang.org/x/crypto/chacha20/chacha_ppc64le.go @@ -2,7 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build !gccgo,!purego +//go:build gc && !purego +// +build gc,!purego package chacha20 diff --git a/vendor/golang.org/x/crypto/chacha20/chacha_ppc64le.s b/vendor/golang.org/x/crypto/chacha20/chacha_ppc64le.s index 23c602164301..3dad4b2fa27b 100644 --- a/vendor/golang.org/x/crypto/chacha20/chacha_ppc64le.s +++ b/vendor/golang.org/x/crypto/chacha20/chacha_ppc64le.s @@ -19,7 +19,7 @@ // The differences in this and the original implementation are // due to the calling conventions and initialization of constants. -// +build !gccgo,!purego +// +build gc,!purego #include "textflag.h" diff --git a/vendor/golang.org/x/crypto/chacha20/chacha_s390x.go b/vendor/golang.org/x/crypto/chacha20/chacha_s390x.go index a9244bdf4dbf..c5898db46584 100644 --- a/vendor/golang.org/x/crypto/chacha20/chacha_s390x.go +++ b/vendor/golang.org/x/crypto/chacha20/chacha_s390x.go @@ -2,7 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build !gccgo,!purego +//go:build gc && !purego +// +build gc,!purego package chacha20 diff --git a/vendor/golang.org/x/crypto/chacha20/chacha_s390x.s b/vendor/golang.org/x/crypto/chacha20/chacha_s390x.s index 89c658c410bf..818161189bc4 100644 --- a/vendor/golang.org/x/crypto/chacha20/chacha_s390x.s +++ b/vendor/golang.org/x/crypto/chacha20/chacha_s390x.s @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build !gccgo,!purego +// +build gc,!purego #include "go_asm.h" #include "textflag.h" diff --git a/vendor/golang.org/x/crypto/curve25519/curve25519_amd64.go b/vendor/golang.org/x/crypto/curve25519/curve25519_amd64.go index 5120b779b9b4..84858480dff5 100644 --- a/vendor/golang.org/x/crypto/curve25519/curve25519_amd64.go +++ b/vendor/golang.org/x/crypto/curve25519/curve25519_amd64.go @@ -2,7 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build amd64,!gccgo,!appengine,!purego +//go:build amd64 && gc && !purego +// +build amd64,gc,!purego package curve25519 diff --git a/vendor/golang.org/x/crypto/curve25519/curve25519_amd64.s b/vendor/golang.org/x/crypto/curve25519/curve25519_amd64.s index 0250c8885929..6c533809266b 100644 --- a/vendor/golang.org/x/crypto/curve25519/curve25519_amd64.s +++ b/vendor/golang.org/x/crypto/curve25519/curve25519_amd64.s @@ -5,7 +5,7 @@ // This code was translated into a form compatible with 6a from the public // domain sources in SUPERCOP: https://bench.cr.yp.to/supercop.html -// +build amd64,!gccgo,!appengine,!purego +// +build amd64,gc,!purego #define REDMASK51 0x0007FFFFFFFFFFFF diff --git a/vendor/golang.org/x/crypto/curve25519/curve25519_noasm.go b/vendor/golang.org/x/crypto/curve25519/curve25519_noasm.go index 047d49afc27e..259728af7dad 100644 --- a/vendor/golang.org/x/crypto/curve25519/curve25519_noasm.go +++ b/vendor/golang.org/x/crypto/curve25519/curve25519_noasm.go @@ -2,7 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build !amd64 gccgo appengine purego +//go:build !amd64 || !gc || purego +// +build !amd64 !gc purego package curve25519 diff --git a/vendor/golang.org/x/crypto/ed25519/ed25519.go b/vendor/golang.org/x/crypto/ed25519/ed25519.go index c7f8c7e64ec8..71ad917dadd8 100644 --- a/vendor/golang.org/x/crypto/ed25519/ed25519.go +++ b/vendor/golang.org/x/crypto/ed25519/ed25519.go @@ -5,6 +5,7 @@ // In Go 1.13, the ed25519 package was promoted to the standard library as // crypto/ed25519, and this package became a wrapper for the standard library one. // +//go:build !go1.13 // +build !go1.13 // Package ed25519 implements the Ed25519 signature algorithm. See diff --git a/vendor/golang.org/x/crypto/ed25519/ed25519_go113.go b/vendor/golang.org/x/crypto/ed25519/ed25519_go113.go index d1448d8d2202..b5974dc8b27b 100644 --- a/vendor/golang.org/x/crypto/ed25519/ed25519_go113.go +++ b/vendor/golang.org/x/crypto/ed25519/ed25519_go113.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build go1.13 // +build go1.13 // Package ed25519 implements the Ed25519 signature algorithm. See diff --git a/vendor/golang.org/x/crypto/internal/subtle/aliasing.go b/vendor/golang.org/x/crypto/internal/subtle/aliasing.go index f38797bfa1bf..4fad24f8dcde 100644 --- a/vendor/golang.org/x/crypto/internal/subtle/aliasing.go +++ b/vendor/golang.org/x/crypto/internal/subtle/aliasing.go @@ -2,7 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build !appengine +//go:build !purego +// +build !purego // Package subtle implements functions that are often useful in cryptographic // code but require careful thought to use correctly. diff --git a/vendor/golang.org/x/crypto/internal/subtle/aliasing_appengine.go b/vendor/golang.org/x/crypto/internal/subtle/aliasing_appengine.go deleted file mode 100644 index 0cc4a8a642c9..000000000000 --- a/vendor/golang.org/x/crypto/internal/subtle/aliasing_appengine.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build appengine - -// Package subtle implements functions that are often useful in cryptographic -// code but require careful thought to use correctly. -package subtle // import "golang.org/x/crypto/internal/subtle" - -// This is the Google App Engine standard variant based on reflect -// because the unsafe package and cgo are disallowed. - -import "reflect" - -// AnyOverlap reports whether x and y share memory at any (not necessarily -// corresponding) index. The memory beyond the slice length is ignored. -func AnyOverlap(x, y []byte) bool { - return len(x) > 0 && len(y) > 0 && - reflect.ValueOf(&x[0]).Pointer() <= reflect.ValueOf(&y[len(y)-1]).Pointer() && - reflect.ValueOf(&y[0]).Pointer() <= reflect.ValueOf(&x[len(x)-1]).Pointer() -} - -// InexactOverlap reports whether x and y share memory at any non-corresponding -// index. The memory beyond the slice length is ignored. Note that x and y can -// have different lengths and still not have any inexact overlap. -// -// InexactOverlap can be used to implement the requirements of the crypto/cipher -// AEAD, Block, BlockMode and Stream interfaces. -func InexactOverlap(x, y []byte) bool { - if len(x) == 0 || len(y) == 0 || &x[0] == &y[0] { - return false - } - return AnyOverlap(x, y) -} diff --git a/vendor/golang.org/x/crypto/internal/subtle/aliasing_purego.go b/vendor/golang.org/x/crypto/internal/subtle/aliasing_purego.go new file mode 100644 index 000000000000..80ccbed2c0de --- /dev/null +++ b/vendor/golang.org/x/crypto/internal/subtle/aliasing_purego.go @@ -0,0 +1,36 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build purego +// +build purego + +// Package subtle implements functions that are often useful in cryptographic +// code but require careful thought to use correctly. +package subtle // import "golang.org/x/crypto/internal/subtle" + +// This is the Google App Engine standard variant based on reflect +// because the unsafe package and cgo are disallowed. + +import "reflect" + +// AnyOverlap reports whether x and y share memory at any (not necessarily +// corresponding) index. The memory beyond the slice length is ignored. +func AnyOverlap(x, y []byte) bool { + return len(x) > 0 && len(y) > 0 && + reflect.ValueOf(&x[0]).Pointer() <= reflect.ValueOf(&y[len(y)-1]).Pointer() && + reflect.ValueOf(&y[0]).Pointer() <= reflect.ValueOf(&x[len(x)-1]).Pointer() +} + +// InexactOverlap reports whether x and y share memory at any non-corresponding +// index. The memory beyond the slice length is ignored. Note that x and y can +// have different lengths and still not have any inexact overlap. +// +// InexactOverlap can be used to implement the requirements of the crypto/cipher +// AEAD, Block, BlockMode and Stream interfaces. +func InexactOverlap(x, y []byte) bool { + if len(x) == 0 || len(y) == 0 || &x[0] == &y[0] { + return false + } + return AnyOverlap(x, y) +} diff --git a/vendor/golang.org/x/crypto/poly1305/bits_compat.go b/vendor/golang.org/x/crypto/poly1305/bits_compat.go index 157a69f61bd9..45b5c966b2be 100644 --- a/vendor/golang.org/x/crypto/poly1305/bits_compat.go +++ b/vendor/golang.org/x/crypto/poly1305/bits_compat.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build !go1.13 // +build !go1.13 package poly1305 diff --git a/vendor/golang.org/x/crypto/poly1305/bits_go1.13.go b/vendor/golang.org/x/crypto/poly1305/bits_go1.13.go index a0a185f0fc77..ed52b3418ab5 100644 --- a/vendor/golang.org/x/crypto/poly1305/bits_go1.13.go +++ b/vendor/golang.org/x/crypto/poly1305/bits_go1.13.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build go1.13 // +build go1.13 package poly1305 diff --git a/vendor/golang.org/x/crypto/poly1305/mac_noasm.go b/vendor/golang.org/x/crypto/poly1305/mac_noasm.go index d118f30ed56c..f184b67d98db 100644 --- a/vendor/golang.org/x/crypto/poly1305/mac_noasm.go +++ b/vendor/golang.org/x/crypto/poly1305/mac_noasm.go @@ -2,7 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build !amd64,!ppc64le,!s390x gccgo purego +//go:build (!amd64 && !ppc64le && !s390x) || !gc || purego +// +build !amd64,!ppc64le,!s390x !gc purego package poly1305 diff --git a/vendor/golang.org/x/crypto/poly1305/sum_amd64.go b/vendor/golang.org/x/crypto/poly1305/sum_amd64.go index 99e5a1d50efc..6d522333f29e 100644 --- a/vendor/golang.org/x/crypto/poly1305/sum_amd64.go +++ b/vendor/golang.org/x/crypto/poly1305/sum_amd64.go @@ -2,7 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build !gccgo,!purego +//go:build gc && !purego +// +build gc,!purego package poly1305 diff --git a/vendor/golang.org/x/crypto/poly1305/sum_amd64.s b/vendor/golang.org/x/crypto/poly1305/sum_amd64.s index 8d394a212ee9..2cb03731408c 100644 --- a/vendor/golang.org/x/crypto/poly1305/sum_amd64.s +++ b/vendor/golang.org/x/crypto/poly1305/sum_amd64.s @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build !gccgo,!purego +// +build gc,!purego #include "textflag.h" diff --git a/vendor/golang.org/x/crypto/poly1305/sum_ppc64le.go b/vendor/golang.org/x/crypto/poly1305/sum_ppc64le.go index 2e7a120b1923..4a069941a6ef 100644 --- a/vendor/golang.org/x/crypto/poly1305/sum_ppc64le.go +++ b/vendor/golang.org/x/crypto/poly1305/sum_ppc64le.go @@ -2,7 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build !gccgo,!purego +//go:build gc && !purego +// +build gc,!purego package poly1305 diff --git a/vendor/golang.org/x/crypto/poly1305/sum_ppc64le.s b/vendor/golang.org/x/crypto/poly1305/sum_ppc64le.s index 4e0281387968..5cd7494b21a7 100644 --- a/vendor/golang.org/x/crypto/poly1305/sum_ppc64le.s +++ b/vendor/golang.org/x/crypto/poly1305/sum_ppc64le.s @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build !gccgo,!purego +// +build gc,!purego #include "textflag.h" diff --git a/vendor/golang.org/x/crypto/poly1305/sum_s390x.go b/vendor/golang.org/x/crypto/poly1305/sum_s390x.go index 958fedc0790b..62cc9f84709e 100644 --- a/vendor/golang.org/x/crypto/poly1305/sum_s390x.go +++ b/vendor/golang.org/x/crypto/poly1305/sum_s390x.go @@ -2,7 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build !gccgo,!purego +//go:build gc && !purego +// +build gc,!purego package poly1305 diff --git a/vendor/golang.org/x/crypto/poly1305/sum_s390x.s b/vendor/golang.org/x/crypto/poly1305/sum_s390x.s index 0fa9ee6e0bff..bdd882c606de 100644 --- a/vendor/golang.org/x/crypto/poly1305/sum_s390x.s +++ b/vendor/golang.org/x/crypto/poly1305/sum_s390x.s @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build !gccgo,!purego +// +build gc,!purego #include "textflag.h" diff --git a/vendor/golang.org/x/crypto/salsa20/salsa/salsa20_amd64.go b/vendor/golang.org/x/crypto/salsa20/salsa/salsa20_amd64.go index 656e8df942b8..c400dfcf7bce 100644 --- a/vendor/golang.org/x/crypto/salsa20/salsa/salsa20_amd64.go +++ b/vendor/golang.org/x/crypto/salsa20/salsa/salsa20_amd64.go @@ -2,7 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build amd64,!appengine,!gccgo +//go:build amd64 && !purego && gc +// +build amd64,!purego,gc package salsa diff --git a/vendor/golang.org/x/crypto/salsa20/salsa/salsa20_amd64.s b/vendor/golang.org/x/crypto/salsa20/salsa/salsa20_amd64.s index 18085d2e8c69..f97efc67648d 100644 --- a/vendor/golang.org/x/crypto/salsa20/salsa/salsa20_amd64.s +++ b/vendor/golang.org/x/crypto/salsa20/salsa/salsa20_amd64.s @@ -2,13 +2,13 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build amd64,!appengine,!gccgo +// +build amd64,!purego,gc // This code was translated into a form compatible with 6a from the public // domain sources in SUPERCOP: https://bench.cr.yp.to/supercop.html // func salsa2020XORKeyStream(out, in *byte, n uint64, nonce, key *byte) -// This needs up to 64 bytes at 360(SP); hence the non-obvious frame size. +// This needs up to 64 bytes at 360(R12); hence the non-obvious frame size. TEXT ·salsa2020XORKeyStream(SB),0,$456-40 // frame = 424 + 32 byte alignment MOVQ out+0(FP),DI MOVQ in+8(FP),SI @@ -17,10 +17,8 @@ TEXT ·salsa2020XORKeyStream(SB),0,$456-40 // frame = 424 + 32 byte alignment MOVQ key+32(FP),R8 MOVQ SP,R12 - MOVQ SP,R9 - ADDQ $31, R9 - ANDQ $~31, R9 - MOVQ R9, SP + ADDQ $31, R12 + ANDQ $~31, R12 MOVQ DX,R9 MOVQ CX,DX @@ -32,116 +30,116 @@ TEXT ·salsa2020XORKeyStream(SB),0,$456-40 // frame = 424 + 32 byte alignment MOVL 0(R10),R8 MOVL 0(DX),AX MOVL 16(R10),R11 - MOVL CX,0(SP) - MOVL R8, 4 (SP) - MOVL AX, 8 (SP) - MOVL R11, 12 (SP) + MOVL CX,0(R12) + MOVL R8, 4 (R12) + MOVL AX, 8 (R12) + MOVL R11, 12 (R12) MOVL 8(DX),CX MOVL 24(R10),R8 MOVL 4(R10),AX MOVL 4(DX),R11 - MOVL CX,16(SP) - MOVL R8, 20 (SP) - MOVL AX, 24 (SP) - MOVL R11, 28 (SP) + MOVL CX,16(R12) + MOVL R8, 20 (R12) + MOVL AX, 24 (R12) + MOVL R11, 28 (R12) MOVL 12(DX),CX MOVL 12(R10),DX MOVL 28(R10),R8 MOVL 8(R10),AX - MOVL DX,32(SP) - MOVL CX, 36 (SP) - MOVL R8, 40 (SP) - MOVL AX, 44 (SP) + MOVL DX,32(R12) + MOVL CX, 36 (R12) + MOVL R8, 40 (R12) + MOVL AX, 44 (R12) MOVQ $1634760805,DX MOVQ $857760878,CX MOVQ $2036477234,R8 MOVQ $1797285236,AX - MOVL DX,48(SP) - MOVL CX, 52 (SP) - MOVL R8, 56 (SP) - MOVL AX, 60 (SP) + MOVL DX,48(R12) + MOVL CX, 52 (R12) + MOVL R8, 56 (R12) + MOVL AX, 60 (R12) CMPQ R9,$256 JB BYTESBETWEEN1AND255 - MOVOA 48(SP),X0 + MOVOA 48(R12),X0 PSHUFL $0X55,X0,X1 PSHUFL $0XAA,X0,X2 PSHUFL $0XFF,X0,X3 PSHUFL $0X00,X0,X0 - MOVOA X1,64(SP) - MOVOA X2,80(SP) - MOVOA X3,96(SP) - MOVOA X0,112(SP) - MOVOA 0(SP),X0 + MOVOA X1,64(R12) + MOVOA X2,80(R12) + MOVOA X3,96(R12) + MOVOA X0,112(R12) + MOVOA 0(R12),X0 PSHUFL $0XAA,X0,X1 PSHUFL $0XFF,X0,X2 PSHUFL $0X00,X0,X3 PSHUFL $0X55,X0,X0 - MOVOA X1,128(SP) - MOVOA X2,144(SP) - MOVOA X3,160(SP) - MOVOA X0,176(SP) - MOVOA 16(SP),X0 + MOVOA X1,128(R12) + MOVOA X2,144(R12) + MOVOA X3,160(R12) + MOVOA X0,176(R12) + MOVOA 16(R12),X0 PSHUFL $0XFF,X0,X1 PSHUFL $0X55,X0,X2 PSHUFL $0XAA,X0,X0 - MOVOA X1,192(SP) - MOVOA X2,208(SP) - MOVOA X0,224(SP) - MOVOA 32(SP),X0 + MOVOA X1,192(R12) + MOVOA X2,208(R12) + MOVOA X0,224(R12) + MOVOA 32(R12),X0 PSHUFL $0X00,X0,X1 PSHUFL $0XAA,X0,X2 PSHUFL $0XFF,X0,X0 - MOVOA X1,240(SP) - MOVOA X2,256(SP) - MOVOA X0,272(SP) + MOVOA X1,240(R12) + MOVOA X2,256(R12) + MOVOA X0,272(R12) BYTESATLEAST256: - MOVL 16(SP),DX - MOVL 36 (SP),CX - MOVL DX,288(SP) - MOVL CX,304(SP) + MOVL 16(R12),DX + MOVL 36 (R12),CX + MOVL DX,288(R12) + MOVL CX,304(R12) SHLQ $32,CX ADDQ CX,DX ADDQ $1,DX MOVQ DX,CX SHRQ $32,CX - MOVL DX, 292 (SP) - MOVL CX, 308 (SP) + MOVL DX, 292 (R12) + MOVL CX, 308 (R12) ADDQ $1,DX MOVQ DX,CX SHRQ $32,CX - MOVL DX, 296 (SP) - MOVL CX, 312 (SP) + MOVL DX, 296 (R12) + MOVL CX, 312 (R12) ADDQ $1,DX MOVQ DX,CX SHRQ $32,CX - MOVL DX, 300 (SP) - MOVL CX, 316 (SP) + MOVL DX, 300 (R12) + MOVL CX, 316 (R12) ADDQ $1,DX MOVQ DX,CX SHRQ $32,CX - MOVL DX,16(SP) - MOVL CX, 36 (SP) - MOVQ R9,352(SP) + MOVL DX,16(R12) + MOVL CX, 36 (R12) + MOVQ R9,352(R12) MOVQ $20,DX - MOVOA 64(SP),X0 - MOVOA 80(SP),X1 - MOVOA 96(SP),X2 - MOVOA 256(SP),X3 - MOVOA 272(SP),X4 - MOVOA 128(SP),X5 - MOVOA 144(SP),X6 - MOVOA 176(SP),X7 - MOVOA 192(SP),X8 - MOVOA 208(SP),X9 - MOVOA 224(SP),X10 - MOVOA 304(SP),X11 - MOVOA 112(SP),X12 - MOVOA 160(SP),X13 - MOVOA 240(SP),X14 - MOVOA 288(SP),X15 + MOVOA 64(R12),X0 + MOVOA 80(R12),X1 + MOVOA 96(R12),X2 + MOVOA 256(R12),X3 + MOVOA 272(R12),X4 + MOVOA 128(R12),X5 + MOVOA 144(R12),X6 + MOVOA 176(R12),X7 + MOVOA 192(R12),X8 + MOVOA 208(R12),X9 + MOVOA 224(R12),X10 + MOVOA 304(R12),X11 + MOVOA 112(R12),X12 + MOVOA 160(R12),X13 + MOVOA 240(R12),X14 + MOVOA 288(R12),X15 MAINLOOP1: - MOVOA X1,320(SP) - MOVOA X2,336(SP) + MOVOA X1,320(R12) + MOVOA X2,336(R12) MOVOA X13,X1 PADDL X12,X1 MOVOA X1,X2 @@ -191,8 +189,8 @@ TEXT ·salsa2020XORKeyStream(SB),0,$456-40 // frame = 424 + 32 byte alignment PXOR X1,X12 PSRLL $14,X2 PXOR X2,X12 - MOVOA 320(SP),X1 - MOVOA X12,320(SP) + MOVOA 320(R12),X1 + MOVOA X12,320(R12) MOVOA X9,X2 PADDL X7,X2 MOVOA X2,X12 @@ -207,8 +205,8 @@ TEXT ·salsa2020XORKeyStream(SB),0,$456-40 // frame = 424 + 32 byte alignment PXOR X2,X3 PSRLL $25,X12 PXOR X12,X3 - MOVOA 336(SP),X2 - MOVOA X0,336(SP) + MOVOA 336(R12),X2 + MOVOA X0,336(R12) MOVOA X6,X0 PADDL X2,X0 MOVOA X0,X12 @@ -251,8 +249,8 @@ TEXT ·salsa2020XORKeyStream(SB),0,$456-40 // frame = 424 + 32 byte alignment PXOR X0,X1 PSRLL $14,X12 PXOR X12,X1 - MOVOA 320(SP),X0 - MOVOA X1,320(SP) + MOVOA 320(R12),X0 + MOVOA X1,320(R12) MOVOA X4,X1 PADDL X0,X1 MOVOA X1,X12 @@ -267,8 +265,8 @@ TEXT ·salsa2020XORKeyStream(SB),0,$456-40 // frame = 424 + 32 byte alignment PXOR X1,X2 PSRLL $14,X12 PXOR X12,X2 - MOVOA 336(SP),X12 - MOVOA X2,336(SP) + MOVOA 336(R12),X12 + MOVOA X2,336(R12) MOVOA X14,X1 PADDL X12,X1 MOVOA X1,X2 @@ -311,8 +309,8 @@ TEXT ·salsa2020XORKeyStream(SB),0,$456-40 // frame = 424 + 32 byte alignment PXOR X1,X0 PSRLL $14,X2 PXOR X2,X0 - MOVOA 320(SP),X1 - MOVOA X0,320(SP) + MOVOA 320(R12),X1 + MOVOA X0,320(R12) MOVOA X8,X0 PADDL X14,X0 MOVOA X0,X2 @@ -327,8 +325,8 @@ TEXT ·salsa2020XORKeyStream(SB),0,$456-40 // frame = 424 + 32 byte alignment PXOR X0,X6 PSRLL $25,X2 PXOR X2,X6 - MOVOA 336(SP),X2 - MOVOA X12,336(SP) + MOVOA 336(R12),X2 + MOVOA X12,336(R12) MOVOA X3,X0 PADDL X2,X0 MOVOA X0,X12 @@ -378,14 +376,14 @@ TEXT ·salsa2020XORKeyStream(SB),0,$456-40 // frame = 424 + 32 byte alignment PXOR X0,X2 PSRLL $14,X12 PXOR X12,X2 - MOVOA 320(SP),X12 - MOVOA 336(SP),X0 + MOVOA 320(R12),X12 + MOVOA 336(R12),X0 SUBQ $2,DX JA MAINLOOP1 - PADDL 112(SP),X12 - PADDL 176(SP),X7 - PADDL 224(SP),X10 - PADDL 272(SP),X4 + PADDL 112(R12),X12 + PADDL 176(R12),X7 + PADDL 224(R12),X10 + PADDL 272(R12),X4 MOVD X12,DX MOVD X7,CX MOVD X10,R8 @@ -446,10 +444,10 @@ TEXT ·salsa2020XORKeyStream(SB),0,$456-40 // frame = 424 + 32 byte alignment MOVL CX,196(DI) MOVL R8,200(DI) MOVL R9,204(DI) - PADDL 240(SP),X14 - PADDL 64(SP),X0 - PADDL 128(SP),X5 - PADDL 192(SP),X8 + PADDL 240(R12),X14 + PADDL 64(R12),X0 + PADDL 128(R12),X5 + PADDL 192(R12),X8 MOVD X14,DX MOVD X0,CX MOVD X5,R8 @@ -510,10 +508,10 @@ TEXT ·salsa2020XORKeyStream(SB),0,$456-40 // frame = 424 + 32 byte alignment MOVL CX,212(DI) MOVL R8,216(DI) MOVL R9,220(DI) - PADDL 288(SP),X15 - PADDL 304(SP),X11 - PADDL 80(SP),X1 - PADDL 144(SP),X6 + PADDL 288(R12),X15 + PADDL 304(R12),X11 + PADDL 80(R12),X1 + PADDL 144(R12),X6 MOVD X15,DX MOVD X11,CX MOVD X1,R8 @@ -574,10 +572,10 @@ TEXT ·salsa2020XORKeyStream(SB),0,$456-40 // frame = 424 + 32 byte alignment MOVL CX,228(DI) MOVL R8,232(DI) MOVL R9,236(DI) - PADDL 160(SP),X13 - PADDL 208(SP),X9 - PADDL 256(SP),X3 - PADDL 96(SP),X2 + PADDL 160(R12),X13 + PADDL 208(R12),X9 + PADDL 256(R12),X3 + PADDL 96(R12),X2 MOVD X13,DX MOVD X9,CX MOVD X3,R8 @@ -638,7 +636,7 @@ TEXT ·salsa2020XORKeyStream(SB),0,$456-40 // frame = 424 + 32 byte alignment MOVL CX,244(DI) MOVL R8,248(DI) MOVL R9,252(DI) - MOVQ 352(SP),R9 + MOVQ 352(R12),R9 SUBQ $256,R9 ADDQ $256,SI ADDQ $256,DI @@ -650,17 +648,17 @@ TEXT ·salsa2020XORKeyStream(SB),0,$456-40 // frame = 424 + 32 byte alignment CMPQ R9,$64 JAE NOCOPY MOVQ DI,DX - LEAQ 360(SP),DI + LEAQ 360(R12),DI MOVQ R9,CX REP; MOVSB - LEAQ 360(SP),DI - LEAQ 360(SP),SI + LEAQ 360(R12),DI + LEAQ 360(R12),SI NOCOPY: - MOVQ R9,352(SP) - MOVOA 48(SP),X0 - MOVOA 0(SP),X1 - MOVOA 16(SP),X2 - MOVOA 32(SP),X3 + MOVQ R9,352(R12) + MOVOA 48(R12),X0 + MOVOA 0(R12),X1 + MOVOA 16(R12),X2 + MOVOA 32(R12),X3 MOVOA X1,X4 MOVQ $20,CX MAINLOOP2: @@ -791,10 +789,10 @@ TEXT ·salsa2020XORKeyStream(SB),0,$456-40 // frame = 424 + 32 byte alignment PSHUFL $0X39,X3,X3 PXOR X6,X0 JA MAINLOOP2 - PADDL 48(SP),X0 - PADDL 0(SP),X1 - PADDL 16(SP),X2 - PADDL 32(SP),X3 + PADDL 48(R12),X0 + PADDL 0(R12),X1 + PADDL 16(R12),X2 + PADDL 32(R12),X3 MOVD X0,CX MOVD X1,R8 MOVD X2,R9 @@ -855,16 +853,16 @@ TEXT ·salsa2020XORKeyStream(SB),0,$456-40 // frame = 424 + 32 byte alignment MOVL R8,44(DI) MOVL R9,28(DI) MOVL AX,12(DI) - MOVQ 352(SP),R9 - MOVL 16(SP),CX - MOVL 36 (SP),R8 + MOVQ 352(R12),R9 + MOVL 16(R12),CX + MOVL 36 (R12),R8 ADDQ $1,CX SHLQ $32,R8 ADDQ R8,CX MOVQ CX,R8 SHRQ $32,R8 - MOVL CX,16(SP) - MOVL R8, 36 (SP) + MOVL CX,16(R12) + MOVL R8, 36 (R12) CMPQ R9,$64 JA BYTESATLEAST65 JAE BYTESATLEAST64 @@ -874,7 +872,6 @@ TEXT ·salsa2020XORKeyStream(SB),0,$456-40 // frame = 424 + 32 byte alignment REP; MOVSB BYTESATLEAST64: DONE: - MOVQ R12,SP RET BYTESATLEAST65: SUBQ $64,R9 diff --git a/vendor/golang.org/x/crypto/salsa20/salsa/salsa20_noasm.go b/vendor/golang.org/x/crypto/salsa20/salsa/salsa20_noasm.go index 8a46bd2b3af6..4392cc1ac740 100644 --- a/vendor/golang.org/x/crypto/salsa20/salsa/salsa20_noasm.go +++ b/vendor/golang.org/x/crypto/salsa20/salsa/salsa20_noasm.go @@ -2,7 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build !amd64 appengine gccgo +//go:build !amd64 || purego || !gc +// +build !amd64 purego !gc package salsa diff --git a/vendor/golang.org/x/crypto/ssh/client_auth.go b/vendor/golang.org/x/crypto/ssh/client_auth.go index f3265655eec4..c611aeb68467 100644 --- a/vendor/golang.org/x/crypto/ssh/client_auth.go +++ b/vendor/golang.org/x/crypto/ssh/client_auth.go @@ -471,7 +471,7 @@ func (cb KeyboardInteractiveChallenge) auth(session []byte, user string, c packe } if len(answers) != len(prompts) { - return authFailure, nil, errors.New("ssh: not enough answers from keyboard-interactive callback") + return authFailure, nil, fmt.Errorf("ssh: incorrect number of answers from keyboard-interactive callback %d (expected %d)", len(answers), len(prompts)) } responseLength := 1 + 4 for _, a := range answers { diff --git a/vendor/golang.org/x/crypto/ssh/server.go b/vendor/golang.org/x/crypto/ssh/server.go index 7d42a8c88d26..b6911e8306d6 100644 --- a/vendor/golang.org/x/crypto/ssh/server.go +++ b/vendor/golang.org/x/crypto/ssh/server.go @@ -572,6 +572,10 @@ userAuthLoop: perms = candidate.perms } case "gssapi-with-mic": + if config.GSSAPIWithMICConfig == nil { + authErr = errors.New("ssh: gssapi-with-mic auth not configured") + break + } gssapiConfig := config.GSSAPIWithMICConfig userAuthRequestGSSAPI, err := parseGSSAPIPayload(userAuthReq.Payload) if err != nil { diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util.go b/vendor/golang.org/x/crypto/ssh/terminal/util.go deleted file mode 100644 index 391104084097..000000000000 --- a/vendor/golang.org/x/crypto/ssh/terminal/util.go +++ /dev/null @@ -1,114 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build aix darwin dragonfly freebsd linux,!appengine netbsd openbsd - -// Package terminal provides support functions for dealing with terminals, as -// commonly found on UNIX systems. -// -// Putting a terminal into raw mode is the most common requirement: -// -// oldState, err := terminal.MakeRaw(0) -// if err != nil { -// panic(err) -// } -// defer terminal.Restore(0, oldState) -package terminal // import "golang.org/x/crypto/ssh/terminal" - -import ( - "golang.org/x/sys/unix" -) - -// State contains the state of a terminal. -type State struct { - termios unix.Termios -} - -// IsTerminal returns whether the given file descriptor is a terminal. -func IsTerminal(fd int) bool { - _, err := unix.IoctlGetTermios(fd, ioctlReadTermios) - return err == nil -} - -// MakeRaw put the terminal connected to the given file descriptor into raw -// mode and returns the previous state of the terminal so that it can be -// restored. -func MakeRaw(fd int) (*State, error) { - termios, err := unix.IoctlGetTermios(fd, ioctlReadTermios) - if err != nil { - return nil, err - } - - oldState := State{termios: *termios} - - // This attempts to replicate the behaviour documented for cfmakeraw in - // the termios(3) manpage. - termios.Iflag &^= unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP | unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON - termios.Oflag &^= unix.OPOST - termios.Lflag &^= unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN - termios.Cflag &^= unix.CSIZE | unix.PARENB - termios.Cflag |= unix.CS8 - termios.Cc[unix.VMIN] = 1 - termios.Cc[unix.VTIME] = 0 - if err := unix.IoctlSetTermios(fd, ioctlWriteTermios, termios); err != nil { - return nil, err - } - - return &oldState, nil -} - -// GetState returns the current state of a terminal which may be useful to -// restore the terminal after a signal. -func GetState(fd int) (*State, error) { - termios, err := unix.IoctlGetTermios(fd, ioctlReadTermios) - if err != nil { - return nil, err - } - - return &State{termios: *termios}, nil -} - -// Restore restores the terminal connected to the given file descriptor to a -// previous state. -func Restore(fd int, state *State) error { - return unix.IoctlSetTermios(fd, ioctlWriteTermios, &state.termios) -} - -// GetSize returns the dimensions of the given terminal. -func GetSize(fd int) (width, height int, err error) { - ws, err := unix.IoctlGetWinsize(fd, unix.TIOCGWINSZ) - if err != nil { - return -1, -1, err - } - return int(ws.Col), int(ws.Row), nil -} - -// passwordReader is an io.Reader that reads from a specific file descriptor. -type passwordReader int - -func (r passwordReader) Read(buf []byte) (int, error) { - return unix.Read(int(r), buf) -} - -// ReadPassword reads a line of input from a terminal without local echo. This -// is commonly used for inputting passwords and other sensitive data. The slice -// returned does not include the \n. -func ReadPassword(fd int) ([]byte, error) { - termios, err := unix.IoctlGetTermios(fd, ioctlReadTermios) - if err != nil { - return nil, err - } - - newState := *termios - newState.Lflag &^= unix.ECHO - newState.Lflag |= unix.ICANON | unix.ISIG - newState.Iflag |= unix.ICRNL - if err := unix.IoctlSetTermios(fd, ioctlWriteTermios, &newState); err != nil { - return nil, err - } - - defer unix.IoctlSetTermios(fd, ioctlWriteTermios, termios) - - return readPasswordLine(passwordReader(fd)) -} diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util_aix.go b/vendor/golang.org/x/crypto/ssh/terminal/util_aix.go deleted file mode 100644 index dfcd62785926..000000000000 --- a/vendor/golang.org/x/crypto/ssh/terminal/util_aix.go +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build aix - -package terminal - -import "golang.org/x/sys/unix" - -const ioctlReadTermios = unix.TCGETS -const ioctlWriteTermios = unix.TCSETS diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util_bsd.go b/vendor/golang.org/x/crypto/ssh/terminal/util_bsd.go deleted file mode 100644 index cb23a5904940..000000000000 --- a/vendor/golang.org/x/crypto/ssh/terminal/util_bsd.go +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build darwin dragonfly freebsd netbsd openbsd - -package terminal - -import "golang.org/x/sys/unix" - -const ioctlReadTermios = unix.TIOCGETA -const ioctlWriteTermios = unix.TIOCSETA diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util_linux.go b/vendor/golang.org/x/crypto/ssh/terminal/util_linux.go deleted file mode 100644 index 5fadfe8a1d50..000000000000 --- a/vendor/golang.org/x/crypto/ssh/terminal/util_linux.go +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package terminal - -import "golang.org/x/sys/unix" - -const ioctlReadTermios = unix.TCGETS -const ioctlWriteTermios = unix.TCSETS diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util_plan9.go b/vendor/golang.org/x/crypto/ssh/terminal/util_plan9.go deleted file mode 100644 index 9317ac7ede64..000000000000 --- a/vendor/golang.org/x/crypto/ssh/terminal/util_plan9.go +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package terminal provides support functions for dealing with terminals, as -// commonly found on UNIX systems. -// -// Putting a terminal into raw mode is the most common requirement: -// -// oldState, err := terminal.MakeRaw(0) -// if err != nil { -// panic(err) -// } -// defer terminal.Restore(0, oldState) -package terminal - -import ( - "fmt" - "runtime" -) - -type State struct{} - -// IsTerminal returns whether the given file descriptor is a terminal. -func IsTerminal(fd int) bool { - return false -} - -// MakeRaw put the terminal connected to the given file descriptor into raw -// mode and returns the previous state of the terminal so that it can be -// restored. -func MakeRaw(fd int) (*State, error) { - return nil, fmt.Errorf("terminal: MakeRaw not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) -} - -// GetState returns the current state of a terminal which may be useful to -// restore the terminal after a signal. -func GetState(fd int) (*State, error) { - return nil, fmt.Errorf("terminal: GetState not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) -} - -// Restore restores the terminal connected to the given file descriptor to a -// previous state. -func Restore(fd int, state *State) error { - return fmt.Errorf("terminal: Restore not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) -} - -// GetSize returns the dimensions of the given terminal. -func GetSize(fd int) (width, height int, err error) { - return 0, 0, fmt.Errorf("terminal: GetSize not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) -} - -// ReadPassword reads a line of input from a terminal without local echo. This -// is commonly used for inputting passwords and other sensitive data. The slice -// returned does not include the \n. -func ReadPassword(fd int) ([]byte, error) { - return nil, fmt.Errorf("terminal: ReadPassword not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) -} diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go b/vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go deleted file mode 100644 index 3d5f06a9f049..000000000000 --- a/vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build solaris - -package terminal // import "golang.org/x/crypto/ssh/terminal" - -import ( - "golang.org/x/sys/unix" - "io" - "syscall" -) - -// State contains the state of a terminal. -type State struct { - termios unix.Termios -} - -// IsTerminal returns whether the given file descriptor is a terminal. -func IsTerminal(fd int) bool { - _, err := unix.IoctlGetTermio(fd, unix.TCGETA) - return err == nil -} - -// ReadPassword reads a line of input from a terminal without local echo. This -// is commonly used for inputting passwords and other sensitive data. The slice -// returned does not include the \n. -func ReadPassword(fd int) ([]byte, error) { - // see also: http://src.illumos.org/source/xref/illumos-gate/usr/src/lib/libast/common/uwin/getpass.c - val, err := unix.IoctlGetTermios(fd, unix.TCGETS) - if err != nil { - return nil, err - } - oldState := *val - - newState := oldState - newState.Lflag &^= syscall.ECHO - newState.Lflag |= syscall.ICANON | syscall.ISIG - newState.Iflag |= syscall.ICRNL - err = unix.IoctlSetTermios(fd, unix.TCSETS, &newState) - if err != nil { - return nil, err - } - - defer unix.IoctlSetTermios(fd, unix.TCSETS, &oldState) - - var buf [16]byte - var ret []byte - for { - n, err := syscall.Read(fd, buf[:]) - if err != nil { - return nil, err - } - if n == 0 { - if len(ret) == 0 { - return nil, io.EOF - } - break - } - if buf[n-1] == '\n' { - n-- - } - ret = append(ret, buf[:n]...) - if n < len(buf) { - break - } - } - - return ret, nil -} - -// MakeRaw puts the terminal connected to the given file descriptor into raw -// mode and returns the previous state of the terminal so that it can be -// restored. -// see http://cr.illumos.org/~webrev/andy_js/1060/ -func MakeRaw(fd int) (*State, error) { - termios, err := unix.IoctlGetTermios(fd, unix.TCGETS) - if err != nil { - return nil, err - } - - oldState := State{termios: *termios} - - termios.Iflag &^= unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP | unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON - termios.Oflag &^= unix.OPOST - termios.Lflag &^= unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN - termios.Cflag &^= unix.CSIZE | unix.PARENB - termios.Cflag |= unix.CS8 - termios.Cc[unix.VMIN] = 1 - termios.Cc[unix.VTIME] = 0 - - if err := unix.IoctlSetTermios(fd, unix.TCSETS, termios); err != nil { - return nil, err - } - - return &oldState, nil -} - -// Restore restores the terminal connected to the given file descriptor to a -// previous state. -func Restore(fd int, oldState *State) error { - return unix.IoctlSetTermios(fd, unix.TCSETS, &oldState.termios) -} - -// GetState returns the current state of a terminal which may be useful to -// restore the terminal after a signal. -func GetState(fd int) (*State, error) { - termios, err := unix.IoctlGetTermios(fd, unix.TCGETS) - if err != nil { - return nil, err - } - - return &State{termios: *termios}, nil -} - -// GetSize returns the dimensions of the given terminal. -func GetSize(fd int) (width, height int, err error) { - ws, err := unix.IoctlGetWinsize(fd, unix.TIOCGWINSZ) - if err != nil { - return 0, 0, err - } - return int(ws.Col), int(ws.Row), nil -} diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util_windows.go b/vendor/golang.org/x/crypto/ssh/terminal/util_windows.go deleted file mode 100644 index f614e9cb607f..000000000000 --- a/vendor/golang.org/x/crypto/ssh/terminal/util_windows.go +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build windows - -// Package terminal provides support functions for dealing with terminals, as -// commonly found on UNIX systems. -// -// Putting a terminal into raw mode is the most common requirement: -// -// oldState, err := terminal.MakeRaw(0) -// if err != nil { -// panic(err) -// } -// defer terminal.Restore(0, oldState) -package terminal - -import ( - "os" - - "golang.org/x/sys/windows" -) - -type State struct { - mode uint32 -} - -// IsTerminal returns whether the given file descriptor is a terminal. -func IsTerminal(fd int) bool { - var st uint32 - err := windows.GetConsoleMode(windows.Handle(fd), &st) - return err == nil -} - -// MakeRaw put the terminal connected to the given file descriptor into raw -// mode and returns the previous state of the terminal so that it can be -// restored. -func MakeRaw(fd int) (*State, error) { - var st uint32 - if err := windows.GetConsoleMode(windows.Handle(fd), &st); err != nil { - return nil, err - } - raw := st &^ (windows.ENABLE_ECHO_INPUT | windows.ENABLE_PROCESSED_INPUT | windows.ENABLE_LINE_INPUT | windows.ENABLE_PROCESSED_OUTPUT) - if err := windows.SetConsoleMode(windows.Handle(fd), raw); err != nil { - return nil, err - } - return &State{st}, nil -} - -// GetState returns the current state of a terminal which may be useful to -// restore the terminal after a signal. -func GetState(fd int) (*State, error) { - var st uint32 - if err := windows.GetConsoleMode(windows.Handle(fd), &st); err != nil { - return nil, err - } - return &State{st}, nil -} - -// Restore restores the terminal connected to the given file descriptor to a -// previous state. -func Restore(fd int, state *State) error { - return windows.SetConsoleMode(windows.Handle(fd), state.mode) -} - -// GetSize returns the visible dimensions of the given terminal. -// -// These dimensions don't include any scrollback buffer height. -func GetSize(fd int) (width, height int, err error) { - var info windows.ConsoleScreenBufferInfo - if err := windows.GetConsoleScreenBufferInfo(windows.Handle(fd), &info); err != nil { - return 0, 0, err - } - return int(info.Window.Right - info.Window.Left + 1), int(info.Window.Bottom - info.Window.Top + 1), nil -} - -// ReadPassword reads a line of input from a terminal without local echo. This -// is commonly used for inputting passwords and other sensitive data. The slice -// returned does not include the \n. -func ReadPassword(fd int) ([]byte, error) { - var st uint32 - if err := windows.GetConsoleMode(windows.Handle(fd), &st); err != nil { - return nil, err - } - old := st - - st &^= (windows.ENABLE_ECHO_INPUT | windows.ENABLE_LINE_INPUT) - st |= (windows.ENABLE_PROCESSED_OUTPUT | windows.ENABLE_PROCESSED_INPUT) - if err := windows.SetConsoleMode(windows.Handle(fd), st); err != nil { - return nil, err - } - - defer windows.SetConsoleMode(windows.Handle(fd), old) - - var h windows.Handle - p, _ := windows.GetCurrentProcess() - if err := windows.DuplicateHandle(p, windows.Handle(fd), p, &h, 0, false, windows.DUPLICATE_SAME_ACCESS); err != nil { - return nil, err - } - - f := os.NewFile(uintptr(h), "stdin") - defer f.Close() - return readPasswordLine(f) -} diff --git a/vendor/golang.org/x/net/context/go17.go b/vendor/golang.org/x/net/context/go17.go index d20f52b7de93..344bd1433450 100644 --- a/vendor/golang.org/x/net/context/go17.go +++ b/vendor/golang.org/x/net/context/go17.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build go1.7 // +build go1.7 package context diff --git a/vendor/golang.org/x/net/context/go19.go b/vendor/golang.org/x/net/context/go19.go index d88bd1db127d..64d31ecc3ef4 100644 --- a/vendor/golang.org/x/net/context/go19.go +++ b/vendor/golang.org/x/net/context/go19.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build go1.9 // +build go1.9 package context diff --git a/vendor/golang.org/x/net/context/pre_go17.go b/vendor/golang.org/x/net/context/pre_go17.go index 0f35592df518..5270db5db7db 100644 --- a/vendor/golang.org/x/net/context/pre_go17.go +++ b/vendor/golang.org/x/net/context/pre_go17.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build !go1.7 // +build !go1.7 package context diff --git a/vendor/golang.org/x/net/context/pre_go19.go b/vendor/golang.org/x/net/context/pre_go19.go index b105f80be4fe..1f9715341faa 100644 --- a/vendor/golang.org/x/net/context/pre_go19.go +++ b/vendor/golang.org/x/net/context/pre_go19.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build !go1.9 // +build !go1.9 package context diff --git a/vendor/golang.org/x/net/http2/go111.go b/vendor/golang.org/x/net/http2/go111.go index 3a131016b2c9..5bf62b032ec5 100644 --- a/vendor/golang.org/x/net/http2/go111.go +++ b/vendor/golang.org/x/net/http2/go111.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build go1.11 // +build go1.11 package http2 diff --git a/vendor/golang.org/x/net/http2/not_go111.go b/vendor/golang.org/x/net/http2/not_go111.go index 161bca7ce85a..cc0baa8197fe 100644 --- a/vendor/golang.org/x/net/http2/not_go111.go +++ b/vendor/golang.org/x/net/http2/not_go111.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build !go1.11 // +build !go1.11 package http2 diff --git a/vendor/golang.org/x/net/http2/transport.go b/vendor/golang.org/x/net/http2/transport.go index 8b129b79419c..7688d72c3960 100644 --- a/vendor/golang.org/x/net/http2/transport.go +++ b/vendor/golang.org/x/net/http2/transport.go @@ -2632,7 +2632,9 @@ func (t *Transport) getBodyWriterState(cs *clientStream, body io.Reader) (s body func (s bodyWriterState) cancel() { if s.timer != nil { - s.timer.Stop() + if s.timer.Stop() { + s.resc <- nil + } } } diff --git a/vendor/golang.org/x/net/idna/idna10.0.0.go b/vendor/golang.org/x/net/idna/idna10.0.0.go index a98a31f40388..7e69ee1b22ed 100644 --- a/vendor/golang.org/x/net/idna/idna10.0.0.go +++ b/vendor/golang.org/x/net/idna/idna10.0.0.go @@ -4,6 +4,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build go1.10 // +build go1.10 // Package idna implements IDNA2008 using the compatibility processing diff --git a/vendor/golang.org/x/net/idna/idna9.0.0.go b/vendor/golang.org/x/net/idna/idna9.0.0.go index 8842146b5d99..7c7456374c13 100644 --- a/vendor/golang.org/x/net/idna/idna9.0.0.go +++ b/vendor/golang.org/x/net/idna/idna9.0.0.go @@ -4,6 +4,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build !go1.10 // +build !go1.10 // Package idna implements IDNA2008 using the compatibility processing diff --git a/vendor/golang.org/x/net/idna/tables10.0.0.go b/vendor/golang.org/x/net/idna/tables10.0.0.go index 54fddb4b16cc..d1d62ef459bb 100644 --- a/vendor/golang.org/x/net/idna/tables10.0.0.go +++ b/vendor/golang.org/x/net/idna/tables10.0.0.go @@ -1,5 +1,6 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. +//go:build go1.10 && !go1.13 // +build go1.10,!go1.13 package idna diff --git a/vendor/golang.org/x/net/idna/tables11.0.0.go b/vendor/golang.org/x/net/idna/tables11.0.0.go index 8ce0811fdf3d..167efba71256 100644 --- a/vendor/golang.org/x/net/idna/tables11.0.0.go +++ b/vendor/golang.org/x/net/idna/tables11.0.0.go @@ -1,5 +1,6 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. +//go:build go1.13 && !go1.14 // +build go1.13,!go1.14 package idna diff --git a/vendor/golang.org/x/net/idna/tables12.0.0.go b/vendor/golang.org/x/net/idna/tables12.0.0.go index f39f0cb4cd87..ab40f7bcc3b8 100644 --- a/vendor/golang.org/x/net/idna/tables12.0.0.go +++ b/vendor/golang.org/x/net/idna/tables12.0.0.go @@ -1,5 +1,6 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. +//go:build go1.14 && !go1.16 // +build go1.14,!go1.16 package idna diff --git a/vendor/golang.org/x/net/idna/tables13.0.0.go b/vendor/golang.org/x/net/idna/tables13.0.0.go index e8c7a36d7a74..390c5e56d2a4 100644 --- a/vendor/golang.org/x/net/idna/tables13.0.0.go +++ b/vendor/golang.org/x/net/idna/tables13.0.0.go @@ -1,5 +1,6 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. +//go:build go1.16 // +build go1.16 package idna diff --git a/vendor/golang.org/x/net/idna/tables9.0.0.go b/vendor/golang.org/x/net/idna/tables9.0.0.go index 8b65fa167830..4074b5332e3e 100644 --- a/vendor/golang.org/x/net/idna/tables9.0.0.go +++ b/vendor/golang.org/x/net/idna/tables9.0.0.go @@ -1,5 +1,6 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. +//go:build !go1.10 // +build !go1.10 package idna diff --git a/vendor/golang.org/x/net/internal/socket/cmsghdr.go b/vendor/golang.org/x/net/internal/socket/cmsghdr.go index 0cde35a4401f..4bdaaaf1ad41 100644 --- a/vendor/golang.org/x/net/internal/socket/cmsghdr.go +++ b/vendor/golang.org/x/net/internal/socket/cmsghdr.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos // +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos package socket diff --git a/vendor/golang.org/x/net/internal/socket/cmsghdr_bsd.go b/vendor/golang.org/x/net/internal/socket/cmsghdr_bsd.go index 14dbb3ad42de..0d30e0a0f2ea 100644 --- a/vendor/golang.org/x/net/internal/socket/cmsghdr_bsd.go +++ b/vendor/golang.org/x/net/internal/socket/cmsghdr_bsd.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build aix || darwin || dragonfly || freebsd || netbsd || openbsd // +build aix darwin dragonfly freebsd netbsd openbsd package socket diff --git a/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_32bit.go b/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_32bit.go index bac66811ddd2..623cf30f4cc2 100644 --- a/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_32bit.go +++ b/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_32bit.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build (arm || mips || mipsle || 386) && linux // +build arm mips mipsle 386 // +build linux diff --git a/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_64bit.go b/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_64bit.go index 27be0efaca92..1ba43101fc78 100644 --- a/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_64bit.go +++ b/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_64bit.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build (arm64 || amd64 || ppc64 || ppc64le || mips64 || mips64le || riscv64 || s390x) && linux // +build arm64 amd64 ppc64 ppc64le mips64 mips64le riscv64 s390x // +build linux diff --git a/vendor/golang.org/x/net/internal/socket/cmsghdr_solaris_64bit.go b/vendor/golang.org/x/net/internal/socket/cmsghdr_solaris_64bit.go index 7dedd430eb0a..d3dbe1b8e015 100644 --- a/vendor/golang.org/x/net/internal/socket/cmsghdr_solaris_64bit.go +++ b/vendor/golang.org/x/net/internal/socket/cmsghdr_solaris_64bit.go @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build amd64 -// +build solaris +//go:build amd64 && solaris +// +build amd64,solaris package socket diff --git a/vendor/golang.org/x/net/internal/socket/cmsghdr_stub.go b/vendor/golang.org/x/net/internal/socket/cmsghdr_stub.go index 83c35ecdcc4e..1d9f2ed625bc 100644 --- a/vendor/golang.org/x/net/internal/socket/cmsghdr_stub.go +++ b/vendor/golang.org/x/net/internal/socket/cmsghdr_stub.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !zos // +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!zos package socket diff --git a/vendor/golang.org/x/net/internal/socket/cmsghdr_unix.go b/vendor/golang.org/x/net/internal/socket/cmsghdr_unix.go index c2b2b6595f4c..aa1b06203cf5 100644 --- a/vendor/golang.org/x/net/internal/socket/cmsghdr_unix.go +++ b/vendor/golang.org/x/net/internal/socket/cmsghdr_unix.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris // +build aix darwin dragonfly freebsd linux netbsd openbsd solaris package socket diff --git a/vendor/golang.org/x/net/internal/socket/error_unix.go b/vendor/golang.org/x/net/internal/socket/error_unix.go index 47f0d6e2de53..78f4129047e2 100644 --- a/vendor/golang.org/x/net/internal/socket/error_unix.go +++ b/vendor/golang.org/x/net/internal/socket/error_unix.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos // +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos package socket diff --git a/vendor/golang.org/x/net/internal/socket/iovec_32bit.go b/vendor/golang.org/x/net/internal/socket/iovec_32bit.go index 05d6082d1479..1f42d034dcb8 100644 --- a/vendor/golang.org/x/net/internal/socket/iovec_32bit.go +++ b/vendor/golang.org/x/net/internal/socket/iovec_32bit.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build (arm || mips || mipsle || 386) && (darwin || dragonfly || freebsd || linux || netbsd || openbsd) // +build arm mips mipsle 386 // +build darwin dragonfly freebsd linux netbsd openbsd diff --git a/vendor/golang.org/x/net/internal/socket/iovec_64bit.go b/vendor/golang.org/x/net/internal/socket/iovec_64bit.go index 0309e10fecd7..3dc5def2bc28 100644 --- a/vendor/golang.org/x/net/internal/socket/iovec_64bit.go +++ b/vendor/golang.org/x/net/internal/socket/iovec_64bit.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build (arm64 || amd64 || ppc64 || ppc64le || mips64 || mips64le || riscv64 || s390x) && (aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || zos) // +build arm64 amd64 ppc64 ppc64le mips64 mips64le riscv64 s390x // +build aix darwin dragonfly freebsd linux netbsd openbsd zos diff --git a/vendor/golang.org/x/net/internal/socket/iovec_solaris_64bit.go b/vendor/golang.org/x/net/internal/socket/iovec_solaris_64bit.go index 8d17a40c4049..f7da2bc4d4bc 100644 --- a/vendor/golang.org/x/net/internal/socket/iovec_solaris_64bit.go +++ b/vendor/golang.org/x/net/internal/socket/iovec_solaris_64bit.go @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build amd64 -// +build solaris +//go:build amd64 && solaris +// +build amd64,solaris package socket diff --git a/vendor/golang.org/x/net/internal/socket/iovec_stub.go b/vendor/golang.org/x/net/internal/socket/iovec_stub.go index f44d4f523321..14caf52483ee 100644 --- a/vendor/golang.org/x/net/internal/socket/iovec_stub.go +++ b/vendor/golang.org/x/net/internal/socket/iovec_stub.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !zos // +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!zos package socket diff --git a/vendor/golang.org/x/net/internal/socket/mmsghdr_stub.go b/vendor/golang.org/x/net/internal/socket/mmsghdr_stub.go index 1a7f2792f254..113e773cd531 100644 --- a/vendor/golang.org/x/net/internal/socket/mmsghdr_stub.go +++ b/vendor/golang.org/x/net/internal/socket/mmsghdr_stub.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build !aix && !linux && !netbsd // +build !aix,!linux,!netbsd package socket diff --git a/vendor/golang.org/x/net/internal/socket/mmsghdr_unix.go b/vendor/golang.org/x/net/internal/socket/mmsghdr_unix.go index f1100683a579..5025a0f75acd 100644 --- a/vendor/golang.org/x/net/internal/socket/mmsghdr_unix.go +++ b/vendor/golang.org/x/net/internal/socket/mmsghdr_unix.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build aix || linux || netbsd // +build aix linux netbsd package socket diff --git a/vendor/golang.org/x/net/internal/socket/msghdr_bsd.go b/vendor/golang.org/x/net/internal/socket/msghdr_bsd.go index 77f44c1f1293..25f6847f99a7 100644 --- a/vendor/golang.org/x/net/internal/socket/msghdr_bsd.go +++ b/vendor/golang.org/x/net/internal/socket/msghdr_bsd.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build aix || darwin || dragonfly || freebsd || netbsd || openbsd // +build aix darwin dragonfly freebsd netbsd openbsd package socket diff --git a/vendor/golang.org/x/net/internal/socket/msghdr_bsdvar.go b/vendor/golang.org/x/net/internal/socket/msghdr_bsdvar.go index c5562dd66ad9..5b8e00f1cd4b 100644 --- a/vendor/golang.org/x/net/internal/socket/msghdr_bsdvar.go +++ b/vendor/golang.org/x/net/internal/socket/msghdr_bsdvar.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build aix || darwin || dragonfly || freebsd || netbsd // +build aix darwin dragonfly freebsd netbsd package socket diff --git a/vendor/golang.org/x/net/internal/socket/msghdr_linux_32bit.go b/vendor/golang.org/x/net/internal/socket/msghdr_linux_32bit.go index a7a5987c8830..2e09e2669962 100644 --- a/vendor/golang.org/x/net/internal/socket/msghdr_linux_32bit.go +++ b/vendor/golang.org/x/net/internal/socket/msghdr_linux_32bit.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build (arm || mips || mipsle || 386) && linux // +build arm mips mipsle 386 // +build linux diff --git a/vendor/golang.org/x/net/internal/socket/msghdr_linux_64bit.go b/vendor/golang.org/x/net/internal/socket/msghdr_linux_64bit.go index e731833a262d..c9c592ddb887 100644 --- a/vendor/golang.org/x/net/internal/socket/msghdr_linux_64bit.go +++ b/vendor/golang.org/x/net/internal/socket/msghdr_linux_64bit.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build (arm64 || amd64 || ppc64 || ppc64le || mips64 || mips64le || riscv64 || s390x) && linux // +build arm64 amd64 ppc64 ppc64le mips64 mips64le riscv64 s390x // +build linux diff --git a/vendor/golang.org/x/net/internal/socket/msghdr_solaris_64bit.go b/vendor/golang.org/x/net/internal/socket/msghdr_solaris_64bit.go index 6465b2073243..3098f5d783de 100644 --- a/vendor/golang.org/x/net/internal/socket/msghdr_solaris_64bit.go +++ b/vendor/golang.org/x/net/internal/socket/msghdr_solaris_64bit.go @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build amd64 -// +build solaris +//go:build amd64 && solaris +// +build amd64,solaris package socket diff --git a/vendor/golang.org/x/net/internal/socket/msghdr_stub.go b/vendor/golang.org/x/net/internal/socket/msghdr_stub.go index 1a253d2d6091..eb79151f6ae1 100644 --- a/vendor/golang.org/x/net/internal/socket/msghdr_stub.go +++ b/vendor/golang.org/x/net/internal/socket/msghdr_stub.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !zos // +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!zos package socket diff --git a/vendor/golang.org/x/net/internal/socket/msghdr_zos_s390x.go b/vendor/golang.org/x/net/internal/socket/msghdr_zos_s390x.go index eb1a99a3342d..324e9ee7d1ec 100644 --- a/vendor/golang.org/x/net/internal/socket/msghdr_zos_s390x.go +++ b/vendor/golang.org/x/net/internal/socket/msghdr_zos_s390x.go @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build s390x -// +build zos +//go:build s390x && zos +// +build s390x,zos package socket diff --git a/vendor/golang.org/x/net/internal/socket/norace.go b/vendor/golang.org/x/net/internal/socket/norace.go index 9519ffbba47e..de0ad420fc52 100644 --- a/vendor/golang.org/x/net/internal/socket/norace.go +++ b/vendor/golang.org/x/net/internal/socket/norace.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build !race // +build !race package socket diff --git a/vendor/golang.org/x/net/internal/socket/race.go b/vendor/golang.org/x/net/internal/socket/race.go index df60c62fff54..f0a28a625d08 100644 --- a/vendor/golang.org/x/net/internal/socket/race.go +++ b/vendor/golang.org/x/net/internal/socket/race.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build race // +build race package socket diff --git a/vendor/golang.org/x/net/internal/socket/rawconn_mmsg.go b/vendor/golang.org/x/net/internal/socket/rawconn_mmsg.go index d01fc4c7da25..5d90de118358 100644 --- a/vendor/golang.org/x/net/internal/socket/rawconn_mmsg.go +++ b/vendor/golang.org/x/net/internal/socket/rawconn_mmsg.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build linux // +build linux package socket diff --git a/vendor/golang.org/x/net/internal/socket/rawconn_msg.go b/vendor/golang.org/x/net/internal/socket/rawconn_msg.go index 610b1a1a5e32..dfed9a8da338 100644 --- a/vendor/golang.org/x/net/internal/socket/rawconn_msg.go +++ b/vendor/golang.org/x/net/internal/socket/rawconn_msg.go @@ -2,13 +2,13 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || windows || zos // +build aix darwin dragonfly freebsd linux netbsd openbsd solaris windows zos package socket import ( "os" - "runtime" "syscall" ) @@ -25,7 +25,7 @@ func (c *Conn) recvMsg(m *Message, flags int) error { var n int fn := func(s uintptr) bool { n, operr = recvmsg(s, &h, flags) - if operr == syscall.EAGAIN || (runtime.GOOS == "zos" && operr == syscall.EWOULDBLOCK) { + if operr == syscall.EAGAIN || operr == syscall.EWOULDBLOCK { return false } return true @@ -62,7 +62,7 @@ func (c *Conn) sendMsg(m *Message, flags int) error { var n int fn := func(s uintptr) bool { n, operr = sendmsg(s, &h, flags) - if operr == syscall.EAGAIN || (runtime.GOOS == "zos" && operr == syscall.EWOULDBLOCK) { + if operr == syscall.EAGAIN || operr == syscall.EWOULDBLOCK { return false } return true diff --git a/vendor/golang.org/x/net/internal/socket/rawconn_nommsg.go b/vendor/golang.org/x/net/internal/socket/rawconn_nommsg.go index fe5bb942ba69..02f32855660a 100644 --- a/vendor/golang.org/x/net/internal/socket/rawconn_nommsg.go +++ b/vendor/golang.org/x/net/internal/socket/rawconn_nommsg.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build !linux // +build !linux package socket diff --git a/vendor/golang.org/x/net/internal/socket/rawconn_nomsg.go b/vendor/golang.org/x/net/internal/socket/rawconn_nomsg.go index e51b60d15107..dd785877b66b 100644 --- a/vendor/golang.org/x/net/internal/socket/rawconn_nomsg.go +++ b/vendor/golang.org/x/net/internal/socket/rawconn_nomsg.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !windows && !zos // +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows,!zos package socket diff --git a/vendor/golang.org/x/net/internal/socket/sys_bsd.go b/vendor/golang.org/x/net/internal/socket/sys_bsd.go index d432835b4195..b6cd77088d59 100644 --- a/vendor/golang.org/x/net/internal/socket/sys_bsd.go +++ b/vendor/golang.org/x/net/internal/socket/sys_bsd.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build aix || darwin || dragonfly || freebsd || openbsd // +build aix darwin dragonfly freebsd openbsd package socket diff --git a/vendor/golang.org/x/net/internal/socket/sys_const_unix.go b/vendor/golang.org/x/net/internal/socket/sys_const_unix.go index 43797d6e5353..f077b2f11fea 100644 --- a/vendor/golang.org/x/net/internal/socket/sys_const_unix.go +++ b/vendor/golang.org/x/net/internal/socket/sys_const_unix.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris // +build aix darwin dragonfly freebsd linux netbsd openbsd solaris package socket diff --git a/vendor/golang.org/x/net/internal/socket/sys_const_zos.go b/vendor/golang.org/x/net/internal/socket/sys_const_zos.go index 01b6372039af..3048629541b5 100644 --- a/vendor/golang.org/x/net/internal/socket/sys_const_zos.go +++ b/vendor/golang.org/x/net/internal/socket/sys_const_zos.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build zos // +build zos package socket diff --git a/vendor/golang.org/x/net/internal/socket/sys_linkname.go b/vendor/golang.org/x/net/internal/socket/sys_linkname.go index 61c3f38a51b3..21734af4b85d 100644 --- a/vendor/golang.org/x/net/internal/socket/sys_linkname.go +++ b/vendor/golang.org/x/net/internal/socket/sys_linkname.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build aix || (go1.12 && darwin) // +build aix go1.12,darwin package socket diff --git a/vendor/golang.org/x/net/internal/socket/sys_linux.go b/vendor/golang.org/x/net/internal/socket/sys_linux.go index 8b03cd6dec3d..76f5b8ae5d5d 100644 --- a/vendor/golang.org/x/net/internal/socket/sys_linux.go +++ b/vendor/golang.org/x/net/internal/socket/sys_linux.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build linux && !s390x && !386 // +build linux,!s390x,!386 package socket diff --git a/vendor/golang.org/x/net/internal/socket/sys_linux_riscv64.go b/vendor/golang.org/x/net/internal/socket/sys_linux_riscv64.go index 64f69f1dc559..5b128fbb2a2c 100644 --- a/vendor/golang.org/x/net/internal/socket/sys_linux_riscv64.go +++ b/vendor/golang.org/x/net/internal/socket/sys_linux_riscv64.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build riscv64 // +build riscv64 package socket diff --git a/vendor/golang.org/x/net/internal/socket/sys_posix.go b/vendor/golang.org/x/net/internal/socket/sys_posix.go index 05ded237ec93..25ded21763ad 100644 --- a/vendor/golang.org/x/net/internal/socket/sys_posix.go +++ b/vendor/golang.org/x/net/internal/socket/sys_posix.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || windows || zos // +build aix darwin dragonfly freebsd linux netbsd openbsd solaris windows zos package socket diff --git a/vendor/golang.org/x/net/internal/socket/sys_stub.go b/vendor/golang.org/x/net/internal/socket/sys_stub.go index 3c97008da403..dc7bb389b3c3 100644 --- a/vendor/golang.org/x/net/internal/socket/sys_stub.go +++ b/vendor/golang.org/x/net/internal/socket/sys_stub.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !windows && !zos // +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows,!zos package socket diff --git a/vendor/golang.org/x/net/internal/socket/sys_unix.go b/vendor/golang.org/x/net/internal/socket/sys_unix.go index 0eb71283f52f..c98ebae548c4 100644 --- a/vendor/golang.org/x/net/internal/socket/sys_unix.go +++ b/vendor/golang.org/x/net/internal/socket/sys_unix.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build dragonfly || freebsd || (linux && !s390x && !386) || netbsd || openbsd // +build dragonfly freebsd linux,!s390x,!386 netbsd openbsd package socket diff --git a/vendor/golang.org/x/net/internal/socket/zsys_aix_ppc64.go b/vendor/golang.org/x/net/internal/socket/zsys_aix_ppc64.go index 93d923ad77a6..79f3bdd5b9d2 100644 --- a/vendor/golang.org/x/net/internal/socket/zsys_aix_ppc64.go +++ b/vendor/golang.org/x/net/internal/socket/zsys_aix_ppc64.go @@ -2,6 +2,7 @@ // cgo -godefs defs_aix.go // Added for go1.11 compatibility +//go:build aix // +build aix package socket diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_riscv64.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_riscv64.go index 8640c03e4d45..12ec2e42b880 100644 --- a/vendor/golang.org/x/net/internal/socket/zsys_linux_riscv64.go +++ b/vendor/golang.org/x/net/internal/socket/zsys_linux_riscv64.go @@ -1,6 +1,7 @@ // Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_linux.go +//go:build riscv64 // +build riscv64 package socket diff --git a/vendor/golang.org/x/net/internal/socket/zsys_openbsd_mips64.go b/vendor/golang.org/x/net/internal/socket/zsys_openbsd_mips64.go new file mode 100644 index 000000000000..0112832400bd --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/zsys_openbsd_mips64.go @@ -0,0 +1,50 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_openbsd.go + +package socket + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Iov *iovec + Iovlen uint32 + Control *byte + Controllen uint32 + Flags int32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x30 + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/vendor/golang.org/x/net/ipv4/control_bsd.go b/vendor/golang.org/x/net/ipv4/control_bsd.go index 69c4f553cda4..6fef740f2ff6 100644 --- a/vendor/golang.org/x/net/ipv4/control_bsd.go +++ b/vendor/golang.org/x/net/ipv4/control_bsd.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build aix || darwin || dragonfly || freebsd || netbsd || openbsd // +build aix darwin dragonfly freebsd netbsd openbsd package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/control_pktinfo.go b/vendor/golang.org/x/net/ipv4/control_pktinfo.go index 425338f35bf1..b0a8dbe4e25e 100644 --- a/vendor/golang.org/x/net/ipv4/control_pktinfo.go +++ b/vendor/golang.org/x/net/ipv4/control_pktinfo.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build darwin || linux || solaris // +build darwin linux solaris package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/control_stub.go b/vendor/golang.org/x/net/ipv4/control_stub.go index 9d8253479cec..f27322c3ed47 100644 --- a/vendor/golang.org/x/net/ipv4/control_stub.go +++ b/vendor/golang.org/x/net/ipv4/control_stub.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !windows && !zos // +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows,!zos package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/control_unix.go b/vendor/golang.org/x/net/ipv4/control_unix.go index b27fa4903a99..edce30f12611 100644 --- a/vendor/golang.org/x/net/ipv4/control_unix.go +++ b/vendor/golang.org/x/net/ipv4/control_unix.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris // +build aix darwin dragonfly freebsd linux netbsd openbsd solaris package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/icmp_stub.go b/vendor/golang.org/x/net/ipv4/icmp_stub.go index 21bb29ab3669..cd4ee6e1c920 100644 --- a/vendor/golang.org/x/net/ipv4/icmp_stub.go +++ b/vendor/golang.org/x/net/ipv4/icmp_stub.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build !linux // +build !linux package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/payload_cmsg.go b/vendor/golang.org/x/net/ipv4/payload_cmsg.go index 7bde68947fa7..1bb370e25fd7 100644 --- a/vendor/golang.org/x/net/ipv4/payload_cmsg.go +++ b/vendor/golang.org/x/net/ipv4/payload_cmsg.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos // +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/payload_nocmsg.go b/vendor/golang.org/x/net/ipv4/payload_nocmsg.go index 251bd0c70867..53f0794eb764 100644 --- a/vendor/golang.org/x/net/ipv4/payload_nocmsg.go +++ b/vendor/golang.org/x/net/ipv4/payload_nocmsg.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !zos // +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!zos package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/sockopt_posix.go b/vendor/golang.org/x/net/ipv4/sockopt_posix.go index ef29718d1570..eb07c1c02a5c 100644 --- a/vendor/golang.org/x/net/ipv4/sockopt_posix.go +++ b/vendor/golang.org/x/net/ipv4/sockopt_posix.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || windows || zos // +build aix darwin dragonfly freebsd linux netbsd openbsd solaris windows zos package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/sockopt_stub.go b/vendor/golang.org/x/net/ipv4/sockopt_stub.go index fbca52684a5e..cf036893b7d1 100644 --- a/vendor/golang.org/x/net/ipv4/sockopt_stub.go +++ b/vendor/golang.org/x/net/ipv4/sockopt_stub.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !windows && !zos // +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows,!zos package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/sys_aix.go b/vendor/golang.org/x/net/ipv4/sys_aix.go index 3d1201e6d7c7..b0b69d9c02ce 100644 --- a/vendor/golang.org/x/net/ipv4/sys_aix.go +++ b/vendor/golang.org/x/net/ipv4/sys_aix.go @@ -3,6 +3,7 @@ // license that can be found in the LICENSE file. // Added for go1.11 compatibility +//go:build aix // +build aix package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/sys_asmreq.go b/vendor/golang.org/x/net/ipv4/sys_asmreq.go index 76d670acaa9e..22322b387ec9 100644 --- a/vendor/golang.org/x/net/ipv4/sys_asmreq.go +++ b/vendor/golang.org/x/net/ipv4/sys_asmreq.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build aix || darwin || dragonfly || freebsd || netbsd || openbsd || solaris || windows // +build aix darwin dragonfly freebsd netbsd openbsd solaris windows package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/sys_asmreq_stub.go b/vendor/golang.org/x/net/ipv4/sys_asmreq_stub.go index 6dc339ce67a3..fde640142df5 100644 --- a/vendor/golang.org/x/net/ipv4/sys_asmreq_stub.go +++ b/vendor/golang.org/x/net/ipv4/sys_asmreq_stub.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build !aix && !darwin && !dragonfly && !freebsd && !netbsd && !openbsd && !solaris && !windows // +build !aix,!darwin,!dragonfly,!freebsd,!netbsd,!openbsd,!solaris,!windows package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/sys_asmreqn.go b/vendor/golang.org/x/net/ipv4/sys_asmreqn.go index 1f24f69f3b08..fbfe4af69d2d 100644 --- a/vendor/golang.org/x/net/ipv4/sys_asmreqn.go +++ b/vendor/golang.org/x/net/ipv4/sys_asmreqn.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build darwin || freebsd || linux // +build darwin freebsd linux package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/sys_asmreqn_stub.go b/vendor/golang.org/x/net/ipv4/sys_asmreqn_stub.go index 48ef55624ec4..dcb15f25a55c 100644 --- a/vendor/golang.org/x/net/ipv4/sys_asmreqn_stub.go +++ b/vendor/golang.org/x/net/ipv4/sys_asmreqn_stub.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build !darwin && !freebsd && !linux // +build !darwin,!freebsd,!linux package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/sys_bpf.go b/vendor/golang.org/x/net/ipv4/sys_bpf.go index 5c03dce3b774..fb11e324e2ca 100644 --- a/vendor/golang.org/x/net/ipv4/sys_bpf.go +++ b/vendor/golang.org/x/net/ipv4/sys_bpf.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build linux // +build linux package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/sys_bpf_stub.go b/vendor/golang.org/x/net/ipv4/sys_bpf_stub.go index 5c98642716b5..fc53a0d33ae9 100644 --- a/vendor/golang.org/x/net/ipv4/sys_bpf_stub.go +++ b/vendor/golang.org/x/net/ipv4/sys_bpf_stub.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build !linux // +build !linux package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/sys_bsd.go b/vendor/golang.org/x/net/ipv4/sys_bsd.go index 58256dd9d6fa..8074f9898c30 100644 --- a/vendor/golang.org/x/net/ipv4/sys_bsd.go +++ b/vendor/golang.org/x/net/ipv4/sys_bsd.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build netbsd || openbsd // +build netbsd openbsd package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/sys_ssmreq.go b/vendor/golang.org/x/net/ipv4/sys_ssmreq.go index eeced7f3138b..6a4e7abf9bdf 100644 --- a/vendor/golang.org/x/net/ipv4/sys_ssmreq.go +++ b/vendor/golang.org/x/net/ipv4/sys_ssmreq.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build darwin || freebsd || linux || solaris // +build darwin freebsd linux solaris package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/sys_ssmreq_stub.go b/vendor/golang.org/x/net/ipv4/sys_ssmreq_stub.go index c0921674b050..157159fd507b 100644 --- a/vendor/golang.org/x/net/ipv4/sys_ssmreq_stub.go +++ b/vendor/golang.org/x/net/ipv4/sys_ssmreq_stub.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build !darwin && !freebsd && !linux && !solaris // +build !darwin,!freebsd,!linux,!solaris package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/sys_stub.go b/vendor/golang.org/x/net/ipv4/sys_stub.go index 555585188f4a..d55085165852 100644 --- a/vendor/golang.org/x/net/ipv4/sys_stub.go +++ b/vendor/golang.org/x/net/ipv4/sys_stub.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !windows && !zos // +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows,!zos package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/zsys_aix_ppc64.go b/vendor/golang.org/x/net/ipv4/zsys_aix_ppc64.go index c741d5c8ea91..d6f24754e5a4 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_aix_ppc64.go +++ b/vendor/golang.org/x/net/ipv4/zsys_aix_ppc64.go @@ -2,6 +2,7 @@ // cgo -godefs defs_aix.go // Added for go1.11 compatibility +//go:build aix // +build aix package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_riscv64.go b/vendor/golang.org/x/net/ipv4/zsys_linux_riscv64.go index e626134a8b50..ec9e2dbecca9 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_linux_riscv64.go +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_riscv64.go @@ -1,6 +1,7 @@ // Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_linux.go +//go:build riscv64 // +build riscv64 package ipv4 diff --git a/vendor/golang.org/x/net/ipv6/control_rfc2292_unix.go b/vendor/golang.org/x/net/ipv6/control_rfc2292_unix.go index 9fd9eb15e3bc..dd5fdc3133ca 100644 --- a/vendor/golang.org/x/net/ipv6/control_rfc2292_unix.go +++ b/vendor/golang.org/x/net/ipv6/control_rfc2292_unix.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build darwin // +build darwin package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/control_rfc3542_unix.go b/vendor/golang.org/x/net/ipv6/control_rfc3542_unix.go index 77c449eceb3e..24221941950c 100644 --- a/vendor/golang.org/x/net/ipv6/control_rfc3542_unix.go +++ b/vendor/golang.org/x/net/ipv6/control_rfc3542_unix.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos // +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/control_stub.go b/vendor/golang.org/x/net/ipv6/control_stub.go index e50b8864a24c..b7e8643fc9c2 100644 --- a/vendor/golang.org/x/net/ipv6/control_stub.go +++ b/vendor/golang.org/x/net/ipv6/control_stub.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !windows && !zos // +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows,!zos package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/control_unix.go b/vendor/golang.org/x/net/ipv6/control_unix.go index ec31ca2adc71..63e475db8318 100644 --- a/vendor/golang.org/x/net/ipv6/control_unix.go +++ b/vendor/golang.org/x/net/ipv6/control_unix.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos // +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/icmp_bsd.go b/vendor/golang.org/x/net/ipv6/icmp_bsd.go index b03025cdccfc..120bf8775839 100644 --- a/vendor/golang.org/x/net/ipv6/icmp_bsd.go +++ b/vendor/golang.org/x/net/ipv6/icmp_bsd.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build aix || darwin || dragonfly || freebsd || netbsd || openbsd // +build aix darwin dragonfly freebsd netbsd openbsd package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/icmp_stub.go b/vendor/golang.org/x/net/ipv6/icmp_stub.go index 297e191f5758..d60136a9016e 100644 --- a/vendor/golang.org/x/net/ipv6/icmp_stub.go +++ b/vendor/golang.org/x/net/ipv6/icmp_stub.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !windows && !zos // +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows,!zos package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/payload_cmsg.go b/vendor/golang.org/x/net/ipv6/payload_cmsg.go index 8baa26e7731b..b0692e4304f5 100644 --- a/vendor/golang.org/x/net/ipv6/payload_cmsg.go +++ b/vendor/golang.org/x/net/ipv6/payload_cmsg.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos // +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/payload_nocmsg.go b/vendor/golang.org/x/net/ipv6/payload_nocmsg.go index 00c4f5875476..cd0ff508388d 100644 --- a/vendor/golang.org/x/net/ipv6/payload_nocmsg.go +++ b/vendor/golang.org/x/net/ipv6/payload_nocmsg.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !zos // +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!zos package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/sockopt_posix.go b/vendor/golang.org/x/net/ipv6/sockopt_posix.go index f718792782e4..37c6287130ff 100644 --- a/vendor/golang.org/x/net/ipv6/sockopt_posix.go +++ b/vendor/golang.org/x/net/ipv6/sockopt_posix.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || windows || zos // +build aix darwin dragonfly freebsd linux netbsd openbsd solaris windows zos package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/sockopt_stub.go b/vendor/golang.org/x/net/ipv6/sockopt_stub.go index d87db6a0dcd9..32fd8664ceb8 100644 --- a/vendor/golang.org/x/net/ipv6/sockopt_stub.go +++ b/vendor/golang.org/x/net/ipv6/sockopt_stub.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !windows && !zos // +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows,!zos package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/sys_aix.go b/vendor/golang.org/x/net/ipv6/sys_aix.go index bce7091fb0b3..29c5c0e4f915 100644 --- a/vendor/golang.org/x/net/ipv6/sys_aix.go +++ b/vendor/golang.org/x/net/ipv6/sys_aix.go @@ -3,6 +3,7 @@ // license that can be found in the LICENSE file. // Added for go1.11 compatibility +//go:build aix // +build aix package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/sys_asmreq.go b/vendor/golang.org/x/net/ipv6/sys_asmreq.go index 8c3934c3eecb..6ff9950d1358 100644 --- a/vendor/golang.org/x/net/ipv6/sys_asmreq.go +++ b/vendor/golang.org/x/net/ipv6/sys_asmreq.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || windows // +build aix darwin dragonfly freebsd linux netbsd openbsd solaris windows package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/sys_asmreq_stub.go b/vendor/golang.org/x/net/ipv6/sys_asmreq_stub.go index 87ae4818144f..485290cb824b 100644 --- a/vendor/golang.org/x/net/ipv6/sys_asmreq_stub.go +++ b/vendor/golang.org/x/net/ipv6/sys_asmreq_stub.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !windows // +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/sys_bpf.go b/vendor/golang.org/x/net/ipv6/sys_bpf.go index 90ef4dfaf434..b5661fb8f066 100644 --- a/vendor/golang.org/x/net/ipv6/sys_bpf.go +++ b/vendor/golang.org/x/net/ipv6/sys_bpf.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build linux // +build linux package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/sys_bpf_stub.go b/vendor/golang.org/x/net/ipv6/sys_bpf_stub.go index eb9f8316237a..cb006618720a 100644 --- a/vendor/golang.org/x/net/ipv6/sys_bpf_stub.go +++ b/vendor/golang.org/x/net/ipv6/sys_bpf_stub.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build !linux // +build !linux package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/sys_bsd.go b/vendor/golang.org/x/net/ipv6/sys_bsd.go index e416eaa1fe4a..63e5ee2d599d 100644 --- a/vendor/golang.org/x/net/ipv6/sys_bsd.go +++ b/vendor/golang.org/x/net/ipv6/sys_bsd.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build dragonfly || netbsd || openbsd // +build dragonfly netbsd openbsd package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/sys_ssmreq.go b/vendor/golang.org/x/net/ipv6/sys_ssmreq.go index 88d64f17ebdf..023488a49cde 100644 --- a/vendor/golang.org/x/net/ipv6/sys_ssmreq.go +++ b/vendor/golang.org/x/net/ipv6/sys_ssmreq.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build aix || darwin || freebsd || linux || solaris || zos // +build aix darwin freebsd linux solaris zos package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/sys_ssmreq_stub.go b/vendor/golang.org/x/net/ipv6/sys_ssmreq_stub.go index b0708868fe9d..acdf2e5cf7c4 100644 --- a/vendor/golang.org/x/net/ipv6/sys_ssmreq_stub.go +++ b/vendor/golang.org/x/net/ipv6/sys_ssmreq_stub.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build !aix && !darwin && !freebsd && !linux && !solaris && !zos // +build !aix,!darwin,!freebsd,!linux,!solaris,!zos package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/sys_stub.go b/vendor/golang.org/x/net/ipv6/sys_stub.go index cbe4a029c36d..5807bba39266 100644 --- a/vendor/golang.org/x/net/ipv6/sys_stub.go +++ b/vendor/golang.org/x/net/ipv6/sys_stub.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !windows && !zos // +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows,!zos package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/zsys_aix_ppc64.go b/vendor/golang.org/x/net/ipv6/zsys_aix_ppc64.go index bf44e338bd80..75e2dd99486d 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_aix_ppc64.go +++ b/vendor/golang.org/x/net/ipv6/zsys_aix_ppc64.go @@ -2,6 +2,7 @@ // cgo -godefs defs_aix.go // Added for go1.11 compatibility +//go:build aix // +build aix package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_riscv64.go b/vendor/golang.org/x/net/ipv6/zsys_linux_riscv64.go index 6083ddcedcba..2072c313e9c9 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_linux_riscv64.go +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_riscv64.go @@ -1,6 +1,7 @@ // Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs defs_linux.go +//go:build riscv64 // +build riscv64 package ipv6 diff --git a/vendor/golang.org/x/sys/cpu/cpu_aix.go b/vendor/golang.org/x/sys/cpu/cpu_aix.go index 464a209cf598..28b521643b1d 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_aix.go +++ b/vendor/golang.org/x/sys/cpu/cpu_aix.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build aix // +build aix package cpu diff --git a/vendor/golang.org/x/sys/cpu/cpu_gc_arm64.go b/vendor/golang.org/x/sys/cpu/cpu_gc_arm64.go index 7f7f272a014f..ccf542a73da8 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_gc_arm64.go +++ b/vendor/golang.org/x/sys/cpu/cpu_gc_arm64.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build gc // +build gc package cpu diff --git a/vendor/golang.org/x/sys/cpu/cpu_gc_s390x.go b/vendor/golang.org/x/sys/cpu/cpu_gc_s390x.go index 75a95566161d..0af2f248412d 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_gc_s390x.go +++ b/vendor/golang.org/x/sys/cpu/cpu_gc_s390x.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build gc // +build gc package cpu diff --git a/vendor/golang.org/x/sys/cpu/cpu_gc_x86.go b/vendor/golang.org/x/sys/cpu/cpu_gc_x86.go index 4adb89cf9cc8..fa7cdb9bcd5f 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_gc_x86.go +++ b/vendor/golang.org/x/sys/cpu/cpu_gc_x86.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build (386 || amd64 || amd64p32) && gc // +build 386 amd64 amd64p32 // +build gc diff --git a/vendor/golang.org/x/sys/cpu/cpu_gccgo_arm64.go b/vendor/golang.org/x/sys/cpu/cpu_gccgo_arm64.go index 53ca8d65c37e..2aff31891162 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_gccgo_arm64.go +++ b/vendor/golang.org/x/sys/cpu/cpu_gccgo_arm64.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build gccgo // +build gccgo package cpu diff --git a/vendor/golang.org/x/sys/cpu/cpu_gccgo_s390x.go b/vendor/golang.org/x/sys/cpu/cpu_gccgo_s390x.go index aa986f77825f..4bfbda61993d 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_gccgo_s390x.go +++ b/vendor/golang.org/x/sys/cpu/cpu_gccgo_s390x.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build gccgo // +build gccgo package cpu diff --git a/vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.go b/vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.go index ba49b91bd398..8478a6d59794 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.go +++ b/vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build (386 || amd64 || amd64p32) && gccgo // +build 386 amd64 amd64p32 // +build gccgo diff --git a/vendor/golang.org/x/sys/cpu/cpu_linux.go b/vendor/golang.org/x/sys/cpu/cpu_linux.go index 6fc874f7fefd..159a686f6f7a 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_linux.go +++ b/vendor/golang.org/x/sys/cpu/cpu_linux.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build !386 && !amd64 && !amd64p32 && !arm64 // +build !386,!amd64,!amd64p32,!arm64 package cpu diff --git a/vendor/golang.org/x/sys/cpu/cpu_linux_mips64x.go b/vendor/golang.org/x/sys/cpu/cpu_linux_mips64x.go index 5a4189005380..6000db4cdd1b 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_linux_mips64x.go +++ b/vendor/golang.org/x/sys/cpu/cpu_linux_mips64x.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build linux && (mips64 || mips64le) // +build linux // +build mips64 mips64le diff --git a/vendor/golang.org/x/sys/cpu/cpu_linux_noinit.go b/vendor/golang.org/x/sys/cpu/cpu_linux_noinit.go index 42b5d33cb698..f4992b1a5938 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_linux_noinit.go +++ b/vendor/golang.org/x/sys/cpu/cpu_linux_noinit.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build linux && !arm && !arm64 && !mips64 && !mips64le && !ppc64 && !ppc64le && !s390x // +build linux,!arm,!arm64,!mips64,!mips64le,!ppc64,!ppc64le,!s390x package cpu diff --git a/vendor/golang.org/x/sys/cpu/cpu_linux_ppc64x.go b/vendor/golang.org/x/sys/cpu/cpu_linux_ppc64x.go index 99f8a6399efb..021356d6deb0 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_linux_ppc64x.go +++ b/vendor/golang.org/x/sys/cpu/cpu_linux_ppc64x.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build linux && (ppc64 || ppc64le) // +build linux // +build ppc64 ppc64le diff --git a/vendor/golang.org/x/sys/cpu/cpu_mips64x.go b/vendor/golang.org/x/sys/cpu/cpu_mips64x.go index 57b5b677de00..f4063c66423b 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_mips64x.go +++ b/vendor/golang.org/x/sys/cpu/cpu_mips64x.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build mips64 || mips64le // +build mips64 mips64le package cpu diff --git a/vendor/golang.org/x/sys/cpu/cpu_mipsx.go b/vendor/golang.org/x/sys/cpu/cpu_mipsx.go index cfc1946b7bb8..07c4e36d8f55 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_mipsx.go +++ b/vendor/golang.org/x/sys/cpu/cpu_mipsx.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build mips || mipsle // +build mips mipsle package cpu diff --git a/vendor/golang.org/x/sys/cpu/cpu_other_arm.go b/vendor/golang.org/x/sys/cpu/cpu_other_arm.go index b412efc1bd1d..d7b4fb4ccc24 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_other_arm.go +++ b/vendor/golang.org/x/sys/cpu/cpu_other_arm.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build !linux && arm // +build !linux,arm package cpu diff --git a/vendor/golang.org/x/sys/cpu/cpu_other_arm64.go b/vendor/golang.org/x/sys/cpu/cpu_other_arm64.go index 16c1c4090ee2..f8c484f589f5 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_other_arm64.go +++ b/vendor/golang.org/x/sys/cpu/cpu_other_arm64.go @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build !linux,!netbsd -// +build arm64 +//go:build !linux && !netbsd && arm64 +// +build !linux,!netbsd,arm64 package cpu diff --git a/vendor/golang.org/x/sys/cpu/cpu_other_mips64x.go b/vendor/golang.org/x/sys/cpu/cpu_other_mips64x.go index f49fad67783e..0dafe9644a5a 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_other_mips64x.go +++ b/vendor/golang.org/x/sys/cpu/cpu_other_mips64x.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build !linux && (mips64 || mips64le) // +build !linux // +build mips64 mips64le diff --git a/vendor/golang.org/x/sys/cpu/cpu_ppc64x.go b/vendor/golang.org/x/sys/cpu/cpu_ppc64x.go index d28d675b5f1c..4e8acd16583d 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_ppc64x.go +++ b/vendor/golang.org/x/sys/cpu/cpu_ppc64x.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build ppc64 || ppc64le // +build ppc64 ppc64le package cpu diff --git a/vendor/golang.org/x/sys/cpu/cpu_riscv64.go b/vendor/golang.org/x/sys/cpu/cpu_riscv64.go index 8b08de341b88..bd6c128af9b9 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_riscv64.go +++ b/vendor/golang.org/x/sys/cpu/cpu_riscv64.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build riscv64 // +build riscv64 package cpu diff --git a/vendor/golang.org/x/sys/cpu/cpu_wasm.go b/vendor/golang.org/x/sys/cpu/cpu_wasm.go index 5382f2a227af..7747d888a692 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_wasm.go +++ b/vendor/golang.org/x/sys/cpu/cpu_wasm.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build wasm // +build wasm package cpu diff --git a/vendor/golang.org/x/sys/cpu/cpu_x86.go b/vendor/golang.org/x/sys/cpu/cpu_x86.go index 48d42933195f..fd380c0a713a 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_x86.go +++ b/vendor/golang.org/x/sys/cpu/cpu_x86.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build 386 || amd64 || amd64p32 // +build 386 amd64 amd64p32 package cpu diff --git a/vendor/golang.org/x/sys/cpu/syscall_aix_gccgo.go b/vendor/golang.org/x/sys/cpu/syscall_aix_gccgo.go index 76fbe40b762d..a864f24d7589 100644 --- a/vendor/golang.org/x/sys/cpu/syscall_aix_gccgo.go +++ b/vendor/golang.org/x/sys/cpu/syscall_aix_gccgo.go @@ -8,8 +8,8 @@ // Morever, this file will be used during the building of // gccgo's libgo and thus must not used a CGo method. -// +build aix -// +build gccgo +//go:build aix && gccgo +// +build aix,gccgo package cpu diff --git a/vendor/golang.org/x/sys/cpu/syscall_aix_ppc64_gc.go b/vendor/golang.org/x/sys/cpu/syscall_aix_ppc64_gc.go index 5b427d67e2f7..904be42ffdce 100644 --- a/vendor/golang.org/x/sys/cpu/syscall_aix_ppc64_gc.go +++ b/vendor/golang.org/x/sys/cpu/syscall_aix_ppc64_gc.go @@ -6,8 +6,8 @@ // system call on AIX without depending on x/sys/unix. // (See golang.org/issue/32102) -// +build aix,ppc64 -// +build gc +//go:build aix && ppc64 && gc +// +build aix,ppc64,gc package cpu diff --git a/vendor/golang.org/x/sys/execabs/execabs.go b/vendor/golang.org/x/sys/execabs/execabs.go new file mode 100644 index 000000000000..78192498db01 --- /dev/null +++ b/vendor/golang.org/x/sys/execabs/execabs.go @@ -0,0 +1,102 @@ +// Copyright 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package execabs is a drop-in replacement for os/exec +// that requires PATH lookups to find absolute paths. +// That is, execabs.Command("cmd") runs the same PATH lookup +// as exec.Command("cmd"), but if the result is a path +// which is relative, the Run and Start methods will report +// an error instead of running the executable. +// +// See https://blog.golang.org/path-security for more information +// about when it may be necessary or appropriate to use this package. +package execabs + +import ( + "context" + "fmt" + "os/exec" + "path/filepath" + "reflect" + "unsafe" +) + +// ErrNotFound is the error resulting if a path search failed to find an executable file. +// It is an alias for exec.ErrNotFound. +var ErrNotFound = exec.ErrNotFound + +// Cmd represents an external command being prepared or run. +// It is an alias for exec.Cmd. +type Cmd = exec.Cmd + +// Error is returned by LookPath when it fails to classify a file as an executable. +// It is an alias for exec.Error. +type Error = exec.Error + +// An ExitError reports an unsuccessful exit by a command. +// It is an alias for exec.ExitError. +type ExitError = exec.ExitError + +func relError(file, path string) error { + return fmt.Errorf("%s resolves to executable in current directory (.%c%s)", file, filepath.Separator, path) +} + +// LookPath searches for an executable named file in the directories +// named by the PATH environment variable. If file contains a slash, +// it is tried directly and the PATH is not consulted. The result will be +// an absolute path. +// +// LookPath differs from exec.LookPath in its handling of PATH lookups, +// which are used for file names without slashes. If exec.LookPath's +// PATH lookup would have returned an executable from the current directory, +// LookPath instead returns an error. +func LookPath(file string) (string, error) { + path, err := exec.LookPath(file) + if err != nil { + return "", err + } + if filepath.Base(file) == file && !filepath.IsAbs(path) { + return "", relError(file, path) + } + return path, nil +} + +func fixCmd(name string, cmd *exec.Cmd) { + if filepath.Base(name) == name && !filepath.IsAbs(cmd.Path) { + // exec.Command was called with a bare binary name and + // exec.LookPath returned a path which is not absolute. + // Set cmd.lookPathErr and clear cmd.Path so that it + // cannot be run. + lookPathErr := (*error)(unsafe.Pointer(reflect.ValueOf(cmd).Elem().FieldByName("lookPathErr").Addr().Pointer())) + if *lookPathErr == nil { + *lookPathErr = relError(name, cmd.Path) + } + cmd.Path = "" + } +} + +// CommandContext is like Command but includes a context. +// +// The provided context is used to kill the process (by calling os.Process.Kill) +// if the context becomes done before the command completes on its own. +func CommandContext(ctx context.Context, name string, arg ...string) *exec.Cmd { + cmd := exec.CommandContext(ctx, name, arg...) + fixCmd(name, cmd) + return cmd + +} + +// Command returns the Cmd struct to execute the named program with the given arguments. +// See exec.Command for most details. +// +// Command differs from exec.Command in its handling of PATH lookups, +// which are used when the program name contains no slashes. +// If exec.Command would have returned an exec.Cmd configured to run an +// executable from the current directory, Command instead +// returns an exec.Cmd that will return an error from Start or Run. +func Command(name string, arg ...string) *exec.Cmd { + cmd := exec.Command(name, arg...) + fixCmd(name, cmd) + return cmd +} diff --git a/vendor/golang.org/x/sys/plan9/asm.s b/vendor/golang.org/x/sys/plan9/asm.s new file mode 100644 index 000000000000..06449ebfa9e5 --- /dev/null +++ b/vendor/golang.org/x/sys/plan9/asm.s @@ -0,0 +1,8 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include "textflag.h" + +TEXT ·use(SB),NOSPLIT,$0 + RET diff --git a/vendor/golang.org/x/sys/plan9/asm_plan9_386.s b/vendor/golang.org/x/sys/plan9/asm_plan9_386.s new file mode 100644 index 000000000000..bc5cab1f3475 --- /dev/null +++ b/vendor/golang.org/x/sys/plan9/asm_plan9_386.s @@ -0,0 +1,30 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include "textflag.h" + +// +// System call support for 386, Plan 9 +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-32 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-44 + JMP syscall·Syscall6(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + JMP syscall·RawSyscall6(SB) + +TEXT ·seek(SB),NOSPLIT,$0-36 + JMP syscall·seek(SB) + +TEXT ·exit(SB),NOSPLIT,$4-4 + JMP syscall·exit(SB) diff --git a/vendor/golang.org/x/sys/plan9/asm_plan9_amd64.s b/vendor/golang.org/x/sys/plan9/asm_plan9_amd64.s new file mode 100644 index 000000000000..d3448e6750b2 --- /dev/null +++ b/vendor/golang.org/x/sys/plan9/asm_plan9_amd64.s @@ -0,0 +1,30 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include "textflag.h" + +// +// System call support for amd64, Plan 9 +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-64 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-88 + JMP syscall·Syscall6(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + JMP syscall·RawSyscall6(SB) + +TEXT ·seek(SB),NOSPLIT,$0-56 + JMP syscall·seek(SB) + +TEXT ·exit(SB),NOSPLIT,$8-8 + JMP syscall·exit(SB) diff --git a/vendor/golang.org/x/sys/plan9/asm_plan9_arm.s b/vendor/golang.org/x/sys/plan9/asm_plan9_arm.s new file mode 100644 index 000000000000..afb7c0a9b905 --- /dev/null +++ b/vendor/golang.org/x/sys/plan9/asm_plan9_arm.s @@ -0,0 +1,25 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include "textflag.h" + +// System call support for plan9 on arm + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-32 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-44 + JMP syscall·Syscall6(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + JMP syscall·RawSyscall6(SB) + +TEXT ·seek(SB),NOSPLIT,$0-36 + JMP syscall·exit(SB) diff --git a/vendor/golang.org/x/sys/plan9/const_plan9.go b/vendor/golang.org/x/sys/plan9/const_plan9.go new file mode 100644 index 000000000000..b4e85a3a9d3b --- /dev/null +++ b/vendor/golang.org/x/sys/plan9/const_plan9.go @@ -0,0 +1,70 @@ +package plan9 + +// Plan 9 Constants + +// Open modes +const ( + O_RDONLY = 0 + O_WRONLY = 1 + O_RDWR = 2 + O_TRUNC = 16 + O_CLOEXEC = 32 + O_EXCL = 0x1000 +) + +// Rfork flags +const ( + RFNAMEG = 1 << 0 + RFENVG = 1 << 1 + RFFDG = 1 << 2 + RFNOTEG = 1 << 3 + RFPROC = 1 << 4 + RFMEM = 1 << 5 + RFNOWAIT = 1 << 6 + RFCNAMEG = 1 << 10 + RFCENVG = 1 << 11 + RFCFDG = 1 << 12 + RFREND = 1 << 13 + RFNOMNT = 1 << 14 +) + +// Qid.Type bits +const ( + QTDIR = 0x80 + QTAPPEND = 0x40 + QTEXCL = 0x20 + QTMOUNT = 0x10 + QTAUTH = 0x08 + QTTMP = 0x04 + QTFILE = 0x00 +) + +// Dir.Mode bits +const ( + DMDIR = 0x80000000 + DMAPPEND = 0x40000000 + DMEXCL = 0x20000000 + DMMOUNT = 0x10000000 + DMAUTH = 0x08000000 + DMTMP = 0x04000000 + DMREAD = 0x4 + DMWRITE = 0x2 + DMEXEC = 0x1 +) + +const ( + STATMAX = 65535 + ERRMAX = 128 + STATFIXLEN = 49 +) + +// Mount and bind flags +const ( + MREPL = 0x0000 + MBEFORE = 0x0001 + MAFTER = 0x0002 + MORDER = 0x0003 + MCREATE = 0x0004 + MCACHE = 0x0010 + MMASK = 0x0017 +) diff --git a/vendor/golang.org/x/sys/plan9/dir_plan9.go b/vendor/golang.org/x/sys/plan9/dir_plan9.go new file mode 100644 index 000000000000..0955e0c53e0b --- /dev/null +++ b/vendor/golang.org/x/sys/plan9/dir_plan9.go @@ -0,0 +1,212 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Plan 9 directory marshalling. See intro(5). + +package plan9 + +import "errors" + +var ( + ErrShortStat = errors.New("stat buffer too short") + ErrBadStat = errors.New("malformed stat buffer") + ErrBadName = errors.New("bad character in file name") +) + +// A Qid represents a 9P server's unique identification for a file. +type Qid struct { + Path uint64 // the file server's unique identification for the file + Vers uint32 // version number for given Path + Type uint8 // the type of the file (plan9.QTDIR for example) +} + +// A Dir contains the metadata for a file. +type Dir struct { + // system-modified data + Type uint16 // server type + Dev uint32 // server subtype + + // file data + Qid Qid // unique id from server + Mode uint32 // permissions + Atime uint32 // last read time + Mtime uint32 // last write time + Length int64 // file length + Name string // last element of path + Uid string // owner name + Gid string // group name + Muid string // last modifier name +} + +var nullDir = Dir{ + Type: ^uint16(0), + Dev: ^uint32(0), + Qid: Qid{ + Path: ^uint64(0), + Vers: ^uint32(0), + Type: ^uint8(0), + }, + Mode: ^uint32(0), + Atime: ^uint32(0), + Mtime: ^uint32(0), + Length: ^int64(0), +} + +// Null assigns special "don't touch" values to members of d to +// avoid modifying them during plan9.Wstat. +func (d *Dir) Null() { *d = nullDir } + +// Marshal encodes a 9P stat message corresponding to d into b +// +// If there isn't enough space in b for a stat message, ErrShortStat is returned. +func (d *Dir) Marshal(b []byte) (n int, err error) { + n = STATFIXLEN + len(d.Name) + len(d.Uid) + len(d.Gid) + len(d.Muid) + if n > len(b) { + return n, ErrShortStat + } + + for _, c := range d.Name { + if c == '/' { + return n, ErrBadName + } + } + + b = pbit16(b, uint16(n)-2) + b = pbit16(b, d.Type) + b = pbit32(b, d.Dev) + b = pbit8(b, d.Qid.Type) + b = pbit32(b, d.Qid.Vers) + b = pbit64(b, d.Qid.Path) + b = pbit32(b, d.Mode) + b = pbit32(b, d.Atime) + b = pbit32(b, d.Mtime) + b = pbit64(b, uint64(d.Length)) + b = pstring(b, d.Name) + b = pstring(b, d.Uid) + b = pstring(b, d.Gid) + b = pstring(b, d.Muid) + + return n, nil +} + +// UnmarshalDir decodes a single 9P stat message from b and returns the resulting Dir. +// +// If b is too small to hold a valid stat message, ErrShortStat is returned. +// +// If the stat message itself is invalid, ErrBadStat is returned. +func UnmarshalDir(b []byte) (*Dir, error) { + if len(b) < STATFIXLEN { + return nil, ErrShortStat + } + size, buf := gbit16(b) + if len(b) != int(size)+2 { + return nil, ErrBadStat + } + b = buf + + var d Dir + d.Type, b = gbit16(b) + d.Dev, b = gbit32(b) + d.Qid.Type, b = gbit8(b) + d.Qid.Vers, b = gbit32(b) + d.Qid.Path, b = gbit64(b) + d.Mode, b = gbit32(b) + d.Atime, b = gbit32(b) + d.Mtime, b = gbit32(b) + + n, b := gbit64(b) + d.Length = int64(n) + + var ok bool + if d.Name, b, ok = gstring(b); !ok { + return nil, ErrBadStat + } + if d.Uid, b, ok = gstring(b); !ok { + return nil, ErrBadStat + } + if d.Gid, b, ok = gstring(b); !ok { + return nil, ErrBadStat + } + if d.Muid, b, ok = gstring(b); !ok { + return nil, ErrBadStat + } + + return &d, nil +} + +// pbit8 copies the 8-bit number v to b and returns the remaining slice of b. +func pbit8(b []byte, v uint8) []byte { + b[0] = byte(v) + return b[1:] +} + +// pbit16 copies the 16-bit number v to b in little-endian order and returns the remaining slice of b. +func pbit16(b []byte, v uint16) []byte { + b[0] = byte(v) + b[1] = byte(v >> 8) + return b[2:] +} + +// pbit32 copies the 32-bit number v to b in little-endian order and returns the remaining slice of b. +func pbit32(b []byte, v uint32) []byte { + b[0] = byte(v) + b[1] = byte(v >> 8) + b[2] = byte(v >> 16) + b[3] = byte(v >> 24) + return b[4:] +} + +// pbit64 copies the 64-bit number v to b in little-endian order and returns the remaining slice of b. +func pbit64(b []byte, v uint64) []byte { + b[0] = byte(v) + b[1] = byte(v >> 8) + b[2] = byte(v >> 16) + b[3] = byte(v >> 24) + b[4] = byte(v >> 32) + b[5] = byte(v >> 40) + b[6] = byte(v >> 48) + b[7] = byte(v >> 56) + return b[8:] +} + +// pstring copies the string s to b, prepending it with a 16-bit length in little-endian order, and +// returning the remaining slice of b.. +func pstring(b []byte, s string) []byte { + b = pbit16(b, uint16(len(s))) + n := copy(b, s) + return b[n:] +} + +// gbit8 reads an 8-bit number from b and returns it with the remaining slice of b. +func gbit8(b []byte) (uint8, []byte) { + return uint8(b[0]), b[1:] +} + +// gbit16 reads a 16-bit number in little-endian order from b and returns it with the remaining slice of b. +func gbit16(b []byte) (uint16, []byte) { + return uint16(b[0]) | uint16(b[1])<<8, b[2:] +} + +// gbit32 reads a 32-bit number in little-endian order from b and returns it with the remaining slice of b. +func gbit32(b []byte) (uint32, []byte) { + return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24, b[4:] +} + +// gbit64 reads a 64-bit number in little-endian order from b and returns it with the remaining slice of b. +func gbit64(b []byte) (uint64, []byte) { + lo := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 + hi := uint32(b[4]) | uint32(b[5])<<8 | uint32(b[6])<<16 | uint32(b[7])<<24 + return uint64(lo) | uint64(hi)<<32, b[8:] +} + +// gstring reads a string from b, prefixed with a 16-bit length in little-endian order. +// It returns the string with the remaining slice of b and a boolean. If the length is +// greater than the number of bytes in b, the boolean will be false. +func gstring(b []byte) (string, []byte, bool) { + n, b := gbit16(b) + if int(n) > len(b) { + return "", b, false + } + return string(b[:n]), b[n:], true +} diff --git a/vendor/golang.org/x/sys/plan9/env_plan9.go b/vendor/golang.org/x/sys/plan9/env_plan9.go new file mode 100644 index 000000000000..8f1918004ff4 --- /dev/null +++ b/vendor/golang.org/x/sys/plan9/env_plan9.go @@ -0,0 +1,31 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Plan 9 environment variables. + +package plan9 + +import ( + "syscall" +) + +func Getenv(key string) (value string, found bool) { + return syscall.Getenv(key) +} + +func Setenv(key, value string) error { + return syscall.Setenv(key, value) +} + +func Clearenv() { + syscall.Clearenv() +} + +func Environ() []string { + return syscall.Environ() +} + +func Unsetenv(key string) error { + return syscall.Unsetenv(key) +} diff --git a/vendor/golang.org/x/sys/plan9/errors_plan9.go b/vendor/golang.org/x/sys/plan9/errors_plan9.go new file mode 100644 index 000000000000..65fe74d3efb9 --- /dev/null +++ b/vendor/golang.org/x/sys/plan9/errors_plan9.go @@ -0,0 +1,50 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package plan9 + +import "syscall" + +// Constants +const ( + // Invented values to support what package os expects. + O_CREAT = 0x02000 + O_APPEND = 0x00400 + O_NOCTTY = 0x00000 + O_NONBLOCK = 0x00000 + O_SYNC = 0x00000 + O_ASYNC = 0x00000 + + S_IFMT = 0x1f000 + S_IFIFO = 0x1000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFBLK = 0x6000 + S_IFREG = 0x8000 + S_IFLNK = 0xa000 + S_IFSOCK = 0xc000 +) + +// Errors +var ( + EINVAL = syscall.NewError("bad arg in system call") + ENOTDIR = syscall.NewError("not a directory") + EISDIR = syscall.NewError("file is a directory") + ENOENT = syscall.NewError("file does not exist") + EEXIST = syscall.NewError("file already exists") + EMFILE = syscall.NewError("no free file descriptors") + EIO = syscall.NewError("i/o error") + ENAMETOOLONG = syscall.NewError("file name too long") + EINTR = syscall.NewError("interrupted") + EPERM = syscall.NewError("permission denied") + EBUSY = syscall.NewError("no free devices") + ETIMEDOUT = syscall.NewError("connection timed out") + EPLAN9 = syscall.NewError("not supported by plan 9") + + // The following errors do not correspond to any + // Plan 9 system messages. Invented to support + // what package os and others expect. + EACCES = syscall.NewError("access permission denied") + EAFNOSUPPORT = syscall.NewError("address family not supported by protocol") +) diff --git a/vendor/golang.org/x/sys/plan9/mkall.sh b/vendor/golang.org/x/sys/plan9/mkall.sh new file mode 100644 index 000000000000..1650fbcc7452 --- /dev/null +++ b/vendor/golang.org/x/sys/plan9/mkall.sh @@ -0,0 +1,150 @@ +#!/usr/bin/env bash +# Copyright 2009 The Go Authors. All rights reserved. +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file. + +# The plan9 package provides access to the raw system call +# interface of the underlying operating system. Porting Go to +# a new architecture/operating system combination requires +# some manual effort, though there are tools that automate +# much of the process. The auto-generated files have names +# beginning with z. +# +# This script runs or (given -n) prints suggested commands to generate z files +# for the current system. Running those commands is not automatic. +# This script is documentation more than anything else. +# +# * asm_${GOOS}_${GOARCH}.s +# +# This hand-written assembly file implements system call dispatch. +# There are three entry points: +# +# func Syscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr); +# func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr); +# func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr); +# +# The first and second are the standard ones; they differ only in +# how many arguments can be passed to the kernel. +# The third is for low-level use by the ForkExec wrapper; +# unlike the first two, it does not call into the scheduler to +# let it know that a system call is running. +# +# * syscall_${GOOS}.go +# +# This hand-written Go file implements system calls that need +# special handling and lists "//sys" comments giving prototypes +# for ones that can be auto-generated. Mksyscall reads those +# comments to generate the stubs. +# +# * syscall_${GOOS}_${GOARCH}.go +# +# Same as syscall_${GOOS}.go except that it contains code specific +# to ${GOOS} on one particular architecture. +# +# * types_${GOOS}.c +# +# This hand-written C file includes standard C headers and then +# creates typedef or enum names beginning with a dollar sign +# (use of $ in variable names is a gcc extension). The hardest +# part about preparing this file is figuring out which headers to +# include and which symbols need to be #defined to get the +# actual data structures that pass through to the kernel system calls. +# Some C libraries present alternate versions for binary compatibility +# and translate them on the way in and out of system calls, but +# there is almost always a #define that can get the real ones. +# See types_darwin.c and types_linux.c for examples. +# +# * zerror_${GOOS}_${GOARCH}.go +# +# This machine-generated file defines the system's error numbers, +# error strings, and signal numbers. The generator is "mkerrors.sh". +# Usually no arguments are needed, but mkerrors.sh will pass its +# arguments on to godefs. +# +# * zsyscall_${GOOS}_${GOARCH}.go +# +# Generated by mksyscall.pl; see syscall_${GOOS}.go above. +# +# * zsysnum_${GOOS}_${GOARCH}.go +# +# Generated by mksysnum_${GOOS}. +# +# * ztypes_${GOOS}_${GOARCH}.go +# +# Generated by godefs; see types_${GOOS}.c above. + +GOOSARCH="${GOOS}_${GOARCH}" + +# defaults +mksyscall="go run mksyscall.go" +mkerrors="./mkerrors.sh" +zerrors="zerrors_$GOOSARCH.go" +mksysctl="" +zsysctl="zsysctl_$GOOSARCH.go" +mksysnum= +mktypes= +run="sh" + +case "$1" in +-syscalls) + for i in zsyscall*go + do + sed 1q $i | sed 's;^// ;;' | sh > _$i && gofmt < _$i > $i + rm _$i + done + exit 0 + ;; +-n) + run="cat" + shift +esac + +case "$#" in +0) + ;; +*) + echo 'usage: mkall.sh [-n]' 1>&2 + exit 2 +esac + +case "$GOOSARCH" in +_* | *_ | _) + echo 'undefined $GOOS_$GOARCH:' "$GOOSARCH" 1>&2 + exit 1 + ;; +plan9_386) + mkerrors= + mksyscall="go run mksyscall.go -l32 -plan9 -tags plan9,386" + mksysnum="./mksysnum_plan9.sh /n/sources/plan9/sys/src/libc/9syscall/sys.h" + mktypes="XXX" + ;; +plan9_amd64) + mkerrors= + mksyscall="go run mksyscall.go -l32 -plan9 -tags plan9,amd64" + mksysnum="./mksysnum_plan9.sh /n/sources/plan9/sys/src/libc/9syscall/sys.h" + mktypes="XXX" + ;; +plan9_arm) + mkerrors= + mksyscall="go run mksyscall.go -l32 -plan9 -tags plan9,arm" + mksysnum="./mksysnum_plan9.sh /n/sources/plan9/sys/src/libc/9syscall/sys.h" + mktypes="XXX" + ;; +*) + echo 'unrecognized $GOOS_$GOARCH: ' "$GOOSARCH" 1>&2 + exit 1 + ;; +esac + +( + if [ -n "$mkerrors" ]; then echo "$mkerrors |gofmt >$zerrors"; fi + case "$GOOS" in + plan9) + syscall_goos="syscall_$GOOS.go" + if [ -n "$mksyscall" ]; then echo "$mksyscall $syscall_goos |gofmt >zsyscall_$GOOSARCH.go"; fi + ;; + esac + if [ -n "$mksysctl" ]; then echo "$mksysctl |gofmt >$zsysctl"; fi + if [ -n "$mksysnum" ]; then echo "$mksysnum |gofmt >zsysnum_$GOOSARCH.go"; fi + if [ -n "$mktypes" ]; then echo "$mktypes types_$GOOS.go |gofmt >ztypes_$GOOSARCH.go"; fi +) | $run diff --git a/vendor/golang.org/x/sys/plan9/mkerrors.sh b/vendor/golang.org/x/sys/plan9/mkerrors.sh new file mode 100644 index 000000000000..85309c4a5ba7 --- /dev/null +++ b/vendor/golang.org/x/sys/plan9/mkerrors.sh @@ -0,0 +1,246 @@ +#!/usr/bin/env bash +# Copyright 2009 The Go Authors. All rights reserved. +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file. + +# Generate Go code listing errors and other #defined constant +# values (ENAMETOOLONG etc.), by asking the preprocessor +# about the definitions. + +unset LANG +export LC_ALL=C +export LC_CTYPE=C + +CC=${CC:-gcc} + +uname=$(uname) + +includes=' +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +' + +ccflags="$@" + +# Write go tool cgo -godefs input. +( + echo package plan9 + echo + echo '/*' + indirect="includes_$(uname)" + echo "${!indirect} $includes" + echo '*/' + echo 'import "C"' + echo + echo 'const (' + + # The gcc command line prints all the #defines + # it encounters while processing the input + echo "${!indirect} $includes" | $CC -x c - -E -dM $ccflags | + awk ' + $1 != "#define" || $2 ~ /\(/ || $3 == "" {next} + + $2 ~ /^E([ABCD]X|[BIS]P|[SD]I|S|FL)$/ {next} # 386 registers + $2 ~ /^(SIGEV_|SIGSTKSZ|SIGRT(MIN|MAX))/ {next} + $2 ~ /^(SCM_SRCRT)$/ {next} + $2 ~ /^(MAP_FAILED)$/ {next} + + $2 !~ /^ETH_/ && + $2 !~ /^EPROC_/ && + $2 !~ /^EQUIV_/ && + $2 !~ /^EXPR_/ && + $2 ~ /^E[A-Z0-9_]+$/ || + $2 ~ /^B[0-9_]+$/ || + $2 ~ /^V[A-Z0-9]+$/ || + $2 ~ /^CS[A-Z0-9]/ || + $2 ~ /^I(SIG|CANON|CRNL|EXTEN|MAXBEL|STRIP|UTF8)$/ || + $2 ~ /^IGN/ || + $2 ~ /^IX(ON|ANY|OFF)$/ || + $2 ~ /^IN(LCR|PCK)$/ || + $2 ~ /(^FLU?SH)|(FLU?SH$)/ || + $2 ~ /^C(LOCAL|READ)$/ || + $2 == "BRKINT" || + $2 == "HUPCL" || + $2 == "PENDIN" || + $2 == "TOSTOP" || + $2 ~ /^PAR/ || + $2 ~ /^SIG[^_]/ || + $2 ~ /^O[CNPFP][A-Z]+[^_][A-Z]+$/ || + $2 ~ /^IN_/ || + $2 ~ /^LOCK_(SH|EX|NB|UN)$/ || + $2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|ICMP6|TCP|EVFILT|NOTE|EV|SHUT|PROT|MAP|PACKET|MSG|SCM|MCL|DT|MADV|PR)_/ || + $2 == "ICMPV6_FILTER" || + $2 == "SOMAXCONN" || + $2 == "NAME_MAX" || + $2 == "IFNAMSIZ" || + $2 ~ /^CTL_(MAXNAME|NET|QUERY)$/ || + $2 ~ /^SYSCTL_VERS/ || + $2 ~ /^(MS|MNT)_/ || + $2 ~ /^TUN(SET|GET|ATTACH|DETACH)/ || + $2 ~ /^(O|F|FD|NAME|S|PTRACE|PT)_/ || + $2 ~ /^LINUX_REBOOT_CMD_/ || + $2 ~ /^LINUX_REBOOT_MAGIC[12]$/ || + $2 !~ "NLA_TYPE_MASK" && + $2 ~ /^(NETLINK|NLM|NLMSG|NLA|IFA|IFAN|RT|RTCF|RTN|RTPROT|RTNH|ARPHRD|ETH_P)_/ || + $2 ~ /^SIOC/ || + $2 ~ /^TIOC/ || + $2 !~ "RTF_BITS" && + $2 ~ /^(IFF|IFT|NET_RT|RTM|RTF|RTV|RTA|RTAX)_/ || + $2 ~ /^BIOC/ || + $2 ~ /^RUSAGE_(SELF|CHILDREN|THREAD)/ || + $2 ~ /^RLIMIT_(AS|CORE|CPU|DATA|FSIZE|NOFILE|STACK)|RLIM_INFINITY/ || + $2 ~ /^PRIO_(PROCESS|PGRP|USER)/ || + $2 ~ /^CLONE_[A-Z_]+/ || + $2 !~ /^(BPF_TIMEVAL)$/ && + $2 ~ /^(BPF|DLT)_/ || + $2 !~ "WMESGLEN" && + $2 ~ /^W[A-Z0-9]+$/ {printf("\t%s = C.%s\n", $2, $2)} + $2 ~ /^__WCOREFLAG$/ {next} + $2 ~ /^__W[A-Z0-9]+$/ {printf("\t%s = C.%s\n", substr($2,3), $2)} + + {next} + ' | sort + + echo ')' +) >_const.go + +# Pull out the error names for later. +errors=$( + echo '#include ' | $CC -x c - -E -dM $ccflags | + awk '$1=="#define" && $2 ~ /^E[A-Z0-9_]+$/ { print $2 }' | + sort +) + +# Pull out the signal names for later. +signals=$( + echo '#include ' | $CC -x c - -E -dM $ccflags | + awk '$1=="#define" && $2 ~ /^SIG[A-Z0-9]+$/ { print $2 }' | + egrep -v '(SIGSTKSIZE|SIGSTKSZ|SIGRT)' | + sort +) + +# Again, writing regexps to a file. +echo '#include ' | $CC -x c - -E -dM $ccflags | + awk '$1=="#define" && $2 ~ /^E[A-Z0-9_]+$/ { print "^\t" $2 "[ \t]*=" }' | + sort >_error.grep +echo '#include ' | $CC -x c - -E -dM $ccflags | + awk '$1=="#define" && $2 ~ /^SIG[A-Z0-9]+$/ { print "^\t" $2 "[ \t]*=" }' | + egrep -v '(SIGSTKSIZE|SIGSTKSZ|SIGRT)' | + sort >_signal.grep + +echo '// mkerrors.sh' "$@" +echo '// Code generated by the command above; DO NOT EDIT.' +echo +go tool cgo -godefs -- "$@" _const.go >_error.out +cat _error.out | grep -vf _error.grep | grep -vf _signal.grep +echo +echo '// Errors' +echo 'const (' +cat _error.out | grep -f _error.grep | sed 's/=\(.*\)/= Errno(\1)/' +echo ')' + +echo +echo '// Signals' +echo 'const (' +cat _error.out | grep -f _signal.grep | sed 's/=\(.*\)/= Signal(\1)/' +echo ')' + +# Run C program to print error and syscall strings. +( + echo -E " +#include +#include +#include +#include +#include +#include + +#define nelem(x) (sizeof(x)/sizeof((x)[0])) + +enum { A = 'A', Z = 'Z', a = 'a', z = 'z' }; // avoid need for single quotes below + +int errors[] = { +" + for i in $errors + do + echo -E ' '$i, + done + + echo -E " +}; + +int signals[] = { +" + for i in $signals + do + echo -E ' '$i, + done + + # Use -E because on some systems bash builtin interprets \n itself. + echo -E ' +}; + +static int +intcmp(const void *a, const void *b) +{ + return *(int*)a - *(int*)b; +} + +int +main(void) +{ + int i, j, e; + char buf[1024], *p; + + printf("\n\n// Error table\n"); + printf("var errors = [...]string {\n"); + qsort(errors, nelem(errors), sizeof errors[0], intcmp); + for(i=0; i 0 && errors[i-1] == e) + continue; + strcpy(buf, strerror(e)); + // lowercase first letter: Bad -> bad, but STREAM -> STREAM. + if(A <= buf[0] && buf[0] <= Z && a <= buf[1] && buf[1] <= z) + buf[0] += a - A; + printf("\t%d: \"%s\",\n", e, buf); + } + printf("}\n\n"); + + printf("\n\n// Signal table\n"); + printf("var signals = [...]string {\n"); + qsort(signals, nelem(signals), sizeof signals[0], intcmp); + for(i=0; i 0 && signals[i-1] == e) + continue; + strcpy(buf, strsignal(e)); + // lowercase first letter: Bad -> bad, but STREAM -> STREAM. + if(A <= buf[0] && buf[0] <= Z && a <= buf[1] && buf[1] <= z) + buf[0] += a - A; + // cut trailing : number. + p = strrchr(buf, ":"[0]); + if(p) + *p = '\0'; + printf("\t%d: \"%s\",\n", e, buf); + } + printf("}\n\n"); + + return 0; +} + +' +) >_errors.c + +$CC $ccflags -o _errors _errors.c && $GORUN ./_errors && rm -f _errors.c _errors _const.go _error.grep _signal.grep _error.out diff --git a/vendor/golang.org/x/sys/plan9/mksysnum_plan9.sh b/vendor/golang.org/x/sys/plan9/mksysnum_plan9.sh new file mode 100644 index 000000000000..3c3ab05810ee --- /dev/null +++ b/vendor/golang.org/x/sys/plan9/mksysnum_plan9.sh @@ -0,0 +1,23 @@ +#!/bin/sh +# Copyright 2009 The Go Authors. All rights reserved. +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file. + +COMMAND="mksysnum_plan9.sh $@" + +cat <= 10 { + buf[i] = byte(val%10 + '0') + i-- + val /= 10 + } + buf[i] = byte(val + '0') + return string(buf[i:]) +} diff --git a/vendor/golang.org/x/sys/plan9/syscall.go b/vendor/golang.org/x/sys/plan9/syscall.go new file mode 100644 index 000000000000..e7363a2f54d5 --- /dev/null +++ b/vendor/golang.org/x/sys/plan9/syscall.go @@ -0,0 +1,116 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build plan9 + +// Package plan9 contains an interface to the low-level operating system +// primitives. OS details vary depending on the underlying system, and +// by default, godoc will display the OS-specific documentation for the current +// system. If you want godoc to display documentation for another +// system, set $GOOS and $GOARCH to the desired system. For example, if +// you want to view documentation for freebsd/arm on linux/amd64, set $GOOS +// to freebsd and $GOARCH to arm. +// +// The primary use of this package is inside other packages that provide a more +// portable interface to the system, such as "os", "time" and "net". Use +// those packages rather than this one if you can. +// +// For details of the functions and data types in this package consult +// the manuals for the appropriate operating system. +// +// These calls return err == nil to indicate success; otherwise +// err represents an operating system error describing the failure and +// holds a value of type syscall.ErrorString. +package plan9 // import "golang.org/x/sys/plan9" + +import ( + "bytes" + "strings" + "unsafe" + + "golang.org/x/sys/internal/unsafeheader" +) + +// ByteSliceFromString returns a NUL-terminated slice of bytes +// containing the text of s. If s contains a NUL byte at any +// location, it returns (nil, EINVAL). +func ByteSliceFromString(s string) ([]byte, error) { + if strings.IndexByte(s, 0) != -1 { + return nil, EINVAL + } + a := make([]byte, len(s)+1) + copy(a, s) + return a, nil +} + +// BytePtrFromString returns a pointer to a NUL-terminated array of +// bytes containing the text of s. If s contains a NUL byte at any +// location, it returns (nil, EINVAL). +func BytePtrFromString(s string) (*byte, error) { + a, err := ByteSliceFromString(s) + if err != nil { + return nil, err + } + return &a[0], nil +} + +// ByteSliceToString returns a string form of the text represented by the slice s, with a terminating NUL and any +// bytes after the NUL removed. +func ByteSliceToString(s []byte) string { + if i := bytes.IndexByte(s, 0); i != -1 { + s = s[:i] + } + return string(s) +} + +// BytePtrToString takes a pointer to a sequence of text and returns the corresponding string. +// If the pointer is nil, it returns the empty string. It assumes that the text sequence is terminated +// at a zero byte; if the zero byte is not present, the program may crash. +func BytePtrToString(p *byte) string { + if p == nil { + return "" + } + if *p == 0 { + return "" + } + + // Find NUL terminator. + n := 0 + for ptr := unsafe.Pointer(p); *(*byte)(ptr) != 0; n++ { + ptr = unsafe.Pointer(uintptr(ptr) + 1) + } + + var s []byte + h := (*unsafeheader.Slice)(unsafe.Pointer(&s)) + h.Data = unsafe.Pointer(p) + h.Len = n + h.Cap = n + + return string(s) +} + +// Single-word zero for use when we need a valid pointer to 0 bytes. +// See mksyscall.pl. +var _zero uintptr + +func (ts *Timespec) Unix() (sec int64, nsec int64) { + return int64(ts.Sec), int64(ts.Nsec) +} + +func (tv *Timeval) Unix() (sec int64, nsec int64) { + return int64(tv.Sec), int64(tv.Usec) * 1000 +} + +func (ts *Timespec) Nano() int64 { + return int64(ts.Sec)*1e9 + int64(ts.Nsec) +} + +func (tv *Timeval) Nano() int64 { + return int64(tv.Sec)*1e9 + int64(tv.Usec)*1000 +} + +// use is a no-op, but the compiler cannot see that it is. +// Calling use(p) ensures that p is kept live until that point. +//go:noescape +func use(p unsafe.Pointer) diff --git a/vendor/golang.org/x/sys/plan9/syscall_plan9.go b/vendor/golang.org/x/sys/plan9/syscall_plan9.go new file mode 100644 index 000000000000..84e14714811d --- /dev/null +++ b/vendor/golang.org/x/sys/plan9/syscall_plan9.go @@ -0,0 +1,349 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Plan 9 system calls. +// This file is compiled as ordinary Go code, +// but it is also input to mksyscall, +// which parses the //sys lines and generates system call stubs. +// Note that sometimes we use a lowercase //sys name and +// wrap it in our own nicer implementation. + +package plan9 + +import ( + "bytes" + "syscall" + "unsafe" +) + +// A Note is a string describing a process note. +// It implements the os.Signal interface. +type Note string + +func (n Note) Signal() {} + +func (n Note) String() string { + return string(n) +} + +var ( + Stdin = 0 + Stdout = 1 + Stderr = 2 +) + +// For testing: clients can set this flag to force +// creation of IPv6 sockets to return EAFNOSUPPORT. +var SocketDisableIPv6 bool + +func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.ErrorString) +func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.ErrorString) +func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr) +func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) + +func atoi(b []byte) (n uint) { + n = 0 + for i := 0; i < len(b); i++ { + n = n*10 + uint(b[i]-'0') + } + return +} + +func cstring(s []byte) string { + i := bytes.IndexByte(s, 0) + if i == -1 { + i = len(s) + } + return string(s[:i]) +} + +func errstr() string { + var buf [ERRMAX]byte + + RawSyscall(SYS_ERRSTR, uintptr(unsafe.Pointer(&buf[0])), uintptr(len(buf)), 0) + + buf[len(buf)-1] = 0 + return cstring(buf[:]) +} + +// Implemented in assembly to import from runtime. +func exit(code int) + +func Exit(code int) { exit(code) } + +func readnum(path string) (uint, error) { + var b [12]byte + + fd, e := Open(path, O_RDONLY) + if e != nil { + return 0, e + } + defer Close(fd) + + n, e := Pread(fd, b[:], 0) + + if e != nil { + return 0, e + } + + m := 0 + for ; m < n && b[m] == ' '; m++ { + } + + return atoi(b[m : n-1]), nil +} + +func Getpid() (pid int) { + n, _ := readnum("#c/pid") + return int(n) +} + +func Getppid() (ppid int) { + n, _ := readnum("#c/ppid") + return int(n) +} + +func Read(fd int, p []byte) (n int, err error) { + return Pread(fd, p, -1) +} + +func Write(fd int, p []byte) (n int, err error) { + return Pwrite(fd, p, -1) +} + +var ioSync int64 + +//sys fd2path(fd int, buf []byte) (err error) +func Fd2path(fd int) (path string, err error) { + var buf [512]byte + + e := fd2path(fd, buf[:]) + if e != nil { + return "", e + } + return cstring(buf[:]), nil +} + +//sys pipe(p *[2]int32) (err error) +func Pipe(p []int) (err error) { + if len(p) != 2 { + return syscall.ErrorString("bad arg in system call") + } + var pp [2]int32 + err = pipe(&pp) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +// Underlying system call writes to newoffset via pointer. +// Implemented in assembly to avoid allocation. +func seek(placeholder uintptr, fd int, offset int64, whence int) (newoffset int64, err string) + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + newoffset, e := seek(0, fd, offset, whence) + + if newoffset == -1 { + err = syscall.ErrorString(e) + } + return +} + +func Mkdir(path string, mode uint32) (err error) { + fd, err := Create(path, O_RDONLY, DMDIR|mode) + + if fd != -1 { + Close(fd) + } + + return +} + +type Waitmsg struct { + Pid int + Time [3]uint32 + Msg string +} + +func (w Waitmsg) Exited() bool { return true } +func (w Waitmsg) Signaled() bool { return false } + +func (w Waitmsg) ExitStatus() int { + if len(w.Msg) == 0 { + // a normal exit returns no message + return 0 + } + return 1 +} + +//sys await(s []byte) (n int, err error) +func Await(w *Waitmsg) (err error) { + var buf [512]byte + var f [5][]byte + + n, err := await(buf[:]) + + if err != nil || w == nil { + return + } + + nf := 0 + p := 0 + for i := 0; i < n && nf < len(f)-1; i++ { + if buf[i] == ' ' { + f[nf] = buf[p:i] + p = i + 1 + nf++ + } + } + f[nf] = buf[p:] + nf++ + + if nf != len(f) { + return syscall.ErrorString("invalid wait message") + } + w.Pid = int(atoi(f[0])) + w.Time[0] = uint32(atoi(f[1])) + w.Time[1] = uint32(atoi(f[2])) + w.Time[2] = uint32(atoi(f[3])) + w.Msg = cstring(f[4]) + if w.Msg == "''" { + // await() returns '' for no error + w.Msg = "" + } + return +} + +func Unmount(name, old string) (err error) { + fixwd() + oldp, err := BytePtrFromString(old) + if err != nil { + return err + } + oldptr := uintptr(unsafe.Pointer(oldp)) + + var r0 uintptr + var e syscall.ErrorString + + // bind(2) man page: If name is zero, everything bound or mounted upon old is unbound or unmounted. + if name == "" { + r0, _, e = Syscall(SYS_UNMOUNT, _zero, oldptr, 0) + } else { + namep, err := BytePtrFromString(name) + if err != nil { + return err + } + r0, _, e = Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(namep)), oldptr, 0) + } + + if int32(r0) == -1 { + err = e + } + return +} + +func Fchdir(fd int) (err error) { + path, err := Fd2path(fd) + + if err != nil { + return + } + + return Chdir(path) +} + +type Timespec struct { + Sec int32 + Nsec int32 +} + +type Timeval struct { + Sec int32 + Usec int32 +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Usec = int32(nsec % 1e9 / 1e3) + tv.Sec = int32(nsec / 1e9) + return +} + +func nsec() int64 { + var scratch int64 + + r0, _, _ := Syscall(SYS_NSEC, uintptr(unsafe.Pointer(&scratch)), 0, 0) + // TODO(aram): remove hack after I fix _nsec in the pc64 kernel. + if r0 == 0 { + return scratch + } + return int64(r0) +} + +func Gettimeofday(tv *Timeval) error { + nsec := nsec() + *tv = NsecToTimeval(nsec) + return nil +} + +func Getpagesize() int { return 0x1000 } + +func Getegid() (egid int) { return -1 } +func Geteuid() (euid int) { return -1 } +func Getgid() (gid int) { return -1 } +func Getuid() (uid int) { return -1 } + +func Getgroups() (gids []int, err error) { + return make([]int, 0), nil +} + +//sys open(path string, mode int) (fd int, err error) +func Open(path string, mode int) (fd int, err error) { + fixwd() + return open(path, mode) +} + +//sys create(path string, mode int, perm uint32) (fd int, err error) +func Create(path string, mode int, perm uint32) (fd int, err error) { + fixwd() + return create(path, mode, perm) +} + +//sys remove(path string) (err error) +func Remove(path string) error { + fixwd() + return remove(path) +} + +//sys stat(path string, edir []byte) (n int, err error) +func Stat(path string, edir []byte) (n int, err error) { + fixwd() + return stat(path, edir) +} + +//sys bind(name string, old string, flag int) (err error) +func Bind(name string, old string, flag int) (err error) { + fixwd() + return bind(name, old, flag) +} + +//sys mount(fd int, afd int, old string, flag int, aname string) (err error) +func Mount(fd int, afd int, old string, flag int, aname string) (err error) { + fixwd() + return mount(fd, afd, old, flag, aname) +} + +//sys wstat(path string, edir []byte) (err error) +func Wstat(path string, edir []byte) (err error) { + fixwd() + return wstat(path, edir) +} + +//sys chdir(path string) (err error) +//sys Dup(oldfd int, newfd int) (fd int, err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) +//sys Close(fd int) (err error) +//sys Fstat(fd int, edir []byte) (n int, err error) +//sys Fwstat(fd int, edir []byte) (err error) diff --git a/vendor/golang.org/x/sys/plan9/zsyscall_plan9_386.go b/vendor/golang.org/x/sys/plan9/zsyscall_plan9_386.go new file mode 100644 index 000000000000..6819bc2094d3 --- /dev/null +++ b/vendor/golang.org/x/sys/plan9/zsyscall_plan9_386.go @@ -0,0 +1,284 @@ +// go run mksyscall.go -l32 -plan9 -tags plan9,386 syscall_plan9.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build plan9,386 + +package plan9 + +import "unsafe" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fd2path(fd int, buf []byte) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_FD2PATH, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]int32) (err error) { + r0, _, e1 := Syscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func await(s []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(s) > 0 { + _p0 = unsafe.Pointer(&s[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_AWAIT, uintptr(_p0), uintptr(len(s)), 0) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func open(path string, mode int) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + fd = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func create(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_CREATE, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func remove(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_REMOVE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func stat(path string, edir []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(edir) > 0 { + _p1 = unsafe.Pointer(&edir[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(edir))) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(name string, old string, flag int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(old) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_BIND, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(flag)) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(fd int, afd int, old string, flag int, aname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(old) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(aname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_MOUNT, uintptr(fd), uintptr(afd), uintptr(unsafe.Pointer(_p0)), uintptr(flag), uintptr(unsafe.Pointer(_p1)), 0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wstat(path string, edir []byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(edir) > 0 { + _p1 = unsafe.Pointer(&edir[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(edir))) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int, newfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), uintptr(newfd), 0) + fd = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + r0, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, edir []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(edir) > 0 { + _p0 = unsafe.Pointer(&edir[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(_p0), uintptr(len(edir))) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fwstat(fd int, edir []byte) (err error) { + var _p0 unsafe.Pointer + if len(edir) > 0 { + _p0 = unsafe.Pointer(&edir[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_FWSTAT, uintptr(fd), uintptr(_p0), uintptr(len(edir))) + if int32(r0) == -1 { + err = e1 + } + return +} diff --git a/vendor/golang.org/x/sys/plan9/zsyscall_plan9_amd64.go b/vendor/golang.org/x/sys/plan9/zsyscall_plan9_amd64.go new file mode 100644 index 000000000000..418abbbfc75b --- /dev/null +++ b/vendor/golang.org/x/sys/plan9/zsyscall_plan9_amd64.go @@ -0,0 +1,284 @@ +// go run mksyscall.go -l32 -plan9 -tags plan9,amd64 syscall_plan9.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build plan9,amd64 + +package plan9 + +import "unsafe" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fd2path(fd int, buf []byte) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_FD2PATH, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]int32) (err error) { + r0, _, e1 := Syscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func await(s []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(s) > 0 { + _p0 = unsafe.Pointer(&s[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_AWAIT, uintptr(_p0), uintptr(len(s)), 0) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func open(path string, mode int) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + fd = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func create(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_CREATE, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func remove(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_REMOVE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func stat(path string, edir []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(edir) > 0 { + _p1 = unsafe.Pointer(&edir[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(edir))) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(name string, old string, flag int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(old) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_BIND, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(flag)) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(fd int, afd int, old string, flag int, aname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(old) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(aname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_MOUNT, uintptr(fd), uintptr(afd), uintptr(unsafe.Pointer(_p0)), uintptr(flag), uintptr(unsafe.Pointer(_p1)), 0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wstat(path string, edir []byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(edir) > 0 { + _p1 = unsafe.Pointer(&edir[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(edir))) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int, newfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), uintptr(newfd), 0) + fd = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + r0, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, edir []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(edir) > 0 { + _p0 = unsafe.Pointer(&edir[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(_p0), uintptr(len(edir))) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fwstat(fd int, edir []byte) (err error) { + var _p0 unsafe.Pointer + if len(edir) > 0 { + _p0 = unsafe.Pointer(&edir[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_FWSTAT, uintptr(fd), uintptr(_p0), uintptr(len(edir))) + if int32(r0) == -1 { + err = e1 + } + return +} diff --git a/vendor/golang.org/x/sys/plan9/zsyscall_plan9_arm.go b/vendor/golang.org/x/sys/plan9/zsyscall_plan9_arm.go new file mode 100644 index 000000000000..3e8a1a58cac8 --- /dev/null +++ b/vendor/golang.org/x/sys/plan9/zsyscall_plan9_arm.go @@ -0,0 +1,284 @@ +// go run mksyscall.go -l32 -plan9 -tags plan9,arm syscall_plan9.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build plan9,arm + +package plan9 + +import "unsafe" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fd2path(fd int, buf []byte) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_FD2PATH, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]int32) (err error) { + r0, _, e1 := Syscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func await(s []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(s) > 0 { + _p0 = unsafe.Pointer(&s[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_AWAIT, uintptr(_p0), uintptr(len(s)), 0) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func open(path string, mode int) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + fd = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func create(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_CREATE, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func remove(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_REMOVE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func stat(path string, edir []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(edir) > 0 { + _p1 = unsafe.Pointer(&edir[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(edir))) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(name string, old string, flag int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(old) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_BIND, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(flag)) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(fd int, afd int, old string, flag int, aname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(old) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(aname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_MOUNT, uintptr(fd), uintptr(afd), uintptr(unsafe.Pointer(_p0)), uintptr(flag), uintptr(unsafe.Pointer(_p1)), 0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wstat(path string, edir []byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(edir) > 0 { + _p1 = unsafe.Pointer(&edir[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(edir))) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int, newfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), uintptr(newfd), 0) + fd = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + r0, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, edir []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(edir) > 0 { + _p0 = unsafe.Pointer(&edir[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(_p0), uintptr(len(edir))) + n = int(r0) + if int32(r0) == -1 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fwstat(fd int, edir []byte) (err error) { + var _p0 unsafe.Pointer + if len(edir) > 0 { + _p0 = unsafe.Pointer(&edir[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_FWSTAT, uintptr(fd), uintptr(_p0), uintptr(len(edir))) + if int32(r0) == -1 { + err = e1 + } + return +} diff --git a/vendor/golang.org/x/sys/plan9/zsysnum_plan9.go b/vendor/golang.org/x/sys/plan9/zsysnum_plan9.go new file mode 100644 index 000000000000..22e8abd43d86 --- /dev/null +++ b/vendor/golang.org/x/sys/plan9/zsysnum_plan9.go @@ -0,0 +1,49 @@ +// mksysnum_plan9.sh /opt/plan9/sys/src/libc/9syscall/sys.h +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +package plan9 + +const ( + SYS_SYSR1 = 0 + SYS_BIND = 2 + SYS_CHDIR = 3 + SYS_CLOSE = 4 + SYS_DUP = 5 + SYS_ALARM = 6 + SYS_EXEC = 7 + SYS_EXITS = 8 + SYS_FAUTH = 10 + SYS_SEGBRK = 12 + SYS_OPEN = 14 + SYS_OSEEK = 16 + SYS_SLEEP = 17 + SYS_RFORK = 19 + SYS_PIPE = 21 + SYS_CREATE = 22 + SYS_FD2PATH = 23 + SYS_BRK_ = 24 + SYS_REMOVE = 25 + SYS_NOTIFY = 28 + SYS_NOTED = 29 + SYS_SEGATTACH = 30 + SYS_SEGDETACH = 31 + SYS_SEGFREE = 32 + SYS_SEGFLUSH = 33 + SYS_RENDEZVOUS = 34 + SYS_UNMOUNT = 35 + SYS_SEMACQUIRE = 37 + SYS_SEMRELEASE = 38 + SYS_SEEK = 39 + SYS_FVERSION = 40 + SYS_ERRSTR = 41 + SYS_STAT = 42 + SYS_FSTAT = 43 + SYS_WSTAT = 44 + SYS_FWSTAT = 45 + SYS_MOUNT = 46 + SYS_AWAIT = 47 + SYS_PREAD = 50 + SYS_PWRITE = 51 + SYS_TSEMACQUIRE = 52 + SYS_NSEC = 53 +) diff --git a/vendor/golang.org/x/sys/unix/aliases.go b/vendor/golang.org/x/sys/unix/aliases.go index 951fce4d0d93..abc89c104a8e 100644 --- a/vendor/golang.org/x/sys/unix/aliases.go +++ b/vendor/golang.org/x/sys/unix/aliases.go @@ -2,7 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris +//go:build (aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos) && go1.9 +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos // +build go1.9 package unix diff --git a/vendor/golang.org/x/sys/unix/asm_zos_s390x.s b/vendor/golang.org/x/sys/unix/asm_zos_s390x.s new file mode 100644 index 000000000000..3b54e1858131 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/asm_zos_s390x.s @@ -0,0 +1,426 @@ +// Copyright 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build zos && s390x && gc +// +build zos +// +build s390x +// +build gc + +#include "textflag.h" + +#define PSALAA 1208(R0) +#define GTAB64(x) 80(x) +#define LCA64(x) 88(x) +#define CAA(x) 8(x) +#define EDCHPXV(x) 1016(x) // in the CAA +#define SAVSTACK_ASYNC(x) 336(x) // in the LCA + +// SS_*, where x=SAVSTACK_ASYNC +#define SS_LE(x) 0(x) +#define SS_GO(x) 8(x) +#define SS_ERRNO(x) 16(x) +#define SS_ERRNOJR(x) 20(x) + +#define LE_CALL BYTE $0x0D; BYTE $0x76; // BL R7, R6 + +TEXT ·clearErrno(SB),NOSPLIT,$0-0 + BL addrerrno<>(SB) + MOVD $0, 0(R3) + RET + +// Returns the address of errno in R3. +TEXT addrerrno<>(SB),NOSPLIT|NOFRAME,$0-0 + // Get library control area (LCA). + MOVW PSALAA, R8 + MOVD LCA64(R8), R8 + + // Get __errno FuncDesc. + MOVD CAA(R8), R9 + MOVD EDCHPXV(R9), R9 + ADD $(0x156*16), R9 + LMG 0(R9), R5, R6 + + // Switch to saved LE stack. + MOVD SAVSTACK_ASYNC(R8), R9 + MOVD 0(R9), R4 + MOVD $0, 0(R9) + + // Call __errno function. + LE_CALL + NOPH + + // Switch back to Go stack. + XOR R0, R0 // Restore R0 to $0. + MOVD R4, 0(R9) // Save stack pointer. + RET + +TEXT ·syscall_syscall(SB),NOSPLIT,$0-56 + BL runtime·entersyscall(SB) + MOVD a1+8(FP), R1 + MOVD a2+16(FP), R2 + MOVD a3+24(FP), R3 + + // Get library control area (LCA). + MOVW PSALAA, R8 + MOVD LCA64(R8), R8 + + // Get function. + MOVD CAA(R8), R9 + MOVD EDCHPXV(R9), R9 + MOVD trap+0(FP), R5 + SLD $4, R5 + ADD R5, R9 + LMG 0(R9), R5, R6 + + // Restore LE stack. + MOVD SAVSTACK_ASYNC(R8), R9 + MOVD 0(R9), R4 + MOVD $0, 0(R9) + + // Call function. + LE_CALL + NOPH + XOR R0, R0 // Restore R0 to $0. + MOVD R4, 0(R9) // Save stack pointer. + + MOVD R3, r1+32(FP) + MOVD R0, r2+40(FP) + MOVD R0, err+48(FP) + MOVW R3, R4 + CMP R4, $-1 + BNE done + BL addrerrno<>(SB) + MOVWZ 0(R3), R3 + MOVD R3, err+48(FP) +done: + BL runtime·exitsyscall(SB) + RET + +TEXT ·syscall_rawsyscall(SB),NOSPLIT,$0-56 + MOVD a1+8(FP), R1 + MOVD a2+16(FP), R2 + MOVD a3+24(FP), R3 + + // Get library control area (LCA). + MOVW PSALAA, R8 + MOVD LCA64(R8), R8 + + // Get function. + MOVD CAA(R8), R9 + MOVD EDCHPXV(R9), R9 + MOVD trap+0(FP), R5 + SLD $4, R5 + ADD R5, R9 + LMG 0(R9), R5, R6 + + // Restore LE stack. + MOVD SAVSTACK_ASYNC(R8), R9 + MOVD 0(R9), R4 + MOVD $0, 0(R9) + + // Call function. + LE_CALL + NOPH + XOR R0, R0 // Restore R0 to $0. + MOVD R4, 0(R9) // Save stack pointer. + + MOVD R3, r1+32(FP) + MOVD R0, r2+40(FP) + MOVD R0, err+48(FP) + MOVW R3, R4 + CMP R4, $-1 + BNE done + BL addrerrno<>(SB) + MOVWZ 0(R3), R3 + MOVD R3, err+48(FP) +done: + RET + +TEXT ·syscall_syscall6(SB),NOSPLIT,$0-80 + BL runtime·entersyscall(SB) + MOVD a1+8(FP), R1 + MOVD a2+16(FP), R2 + MOVD a3+24(FP), R3 + + // Get library control area (LCA). + MOVW PSALAA, R8 + MOVD LCA64(R8), R8 + + // Get function. + MOVD CAA(R8), R9 + MOVD EDCHPXV(R9), R9 + MOVD trap+0(FP), R5 + SLD $4, R5 + ADD R5, R9 + LMG 0(R9), R5, R6 + + // Restore LE stack. + MOVD SAVSTACK_ASYNC(R8), R9 + MOVD 0(R9), R4 + MOVD $0, 0(R9) + + // Fill in parameter list. + MOVD a4+32(FP), R12 + MOVD R12, (2176+24)(R4) + MOVD a5+40(FP), R12 + MOVD R12, (2176+32)(R4) + MOVD a6+48(FP), R12 + MOVD R12, (2176+40)(R4) + + // Call function. + LE_CALL + NOPH + XOR R0, R0 // Restore R0 to $0. + MOVD R4, 0(R9) // Save stack pointer. + + MOVD R3, r1+56(FP) + MOVD R0, r2+64(FP) + MOVD R0, err+72(FP) + MOVW R3, R4 + CMP R4, $-1 + BNE done + BL addrerrno<>(SB) + MOVWZ 0(R3), R3 + MOVD R3, err+72(FP) +done: + BL runtime·exitsyscall(SB) + RET + +TEXT ·syscall_rawsyscall6(SB),NOSPLIT,$0-80 + MOVD a1+8(FP), R1 + MOVD a2+16(FP), R2 + MOVD a3+24(FP), R3 + + // Get library control area (LCA). + MOVW PSALAA, R8 + MOVD LCA64(R8), R8 + + // Get function. + MOVD CAA(R8), R9 + MOVD EDCHPXV(R9), R9 + MOVD trap+0(FP), R5 + SLD $4, R5 + ADD R5, R9 + LMG 0(R9), R5, R6 + + // Restore LE stack. + MOVD SAVSTACK_ASYNC(R8), R9 + MOVD 0(R9), R4 + MOVD $0, 0(R9) + + // Fill in parameter list. + MOVD a4+32(FP), R12 + MOVD R12, (2176+24)(R4) + MOVD a5+40(FP), R12 + MOVD R12, (2176+32)(R4) + MOVD a6+48(FP), R12 + MOVD R12, (2176+40)(R4) + + // Call function. + LE_CALL + NOPH + XOR R0, R0 // Restore R0 to $0. + MOVD R4, 0(R9) // Save stack pointer. + + MOVD R3, r1+56(FP) + MOVD R0, r2+64(FP) + MOVD R0, err+72(FP) + MOVW R3, R4 + CMP R4, $-1 + BNE done + BL ·rrno<>(SB) + MOVWZ 0(R3), R3 + MOVD R3, err+72(FP) +done: + RET + +TEXT ·syscall_syscall9(SB),NOSPLIT,$0 + BL runtime·entersyscall(SB) + MOVD a1+8(FP), R1 + MOVD a2+16(FP), R2 + MOVD a3+24(FP), R3 + + // Get library control area (LCA). + MOVW PSALAA, R8 + MOVD LCA64(R8), R8 + + // Get function. + MOVD CAA(R8), R9 + MOVD EDCHPXV(R9), R9 + MOVD trap+0(FP), R5 + SLD $4, R5 + ADD R5, R9 + LMG 0(R9), R5, R6 + + // Restore LE stack. + MOVD SAVSTACK_ASYNC(R8), R9 + MOVD 0(R9), R4 + MOVD $0, 0(R9) + + // Fill in parameter list. + MOVD a4+32(FP), R12 + MOVD R12, (2176+24)(R4) + MOVD a5+40(FP), R12 + MOVD R12, (2176+32)(R4) + MOVD a6+48(FP), R12 + MOVD R12, (2176+40)(R4) + MOVD a7+56(FP), R12 + MOVD R12, (2176+48)(R4) + MOVD a8+64(FP), R12 + MOVD R12, (2176+56)(R4) + MOVD a9+72(FP), R12 + MOVD R12, (2176+64)(R4) + + // Call function. + LE_CALL + NOPH + XOR R0, R0 // Restore R0 to $0. + MOVD R4, 0(R9) // Save stack pointer. + + MOVD R3, r1+80(FP) + MOVD R0, r2+88(FP) + MOVD R0, err+96(FP) + MOVW R3, R4 + CMP R4, $-1 + BNE done + BL addrerrno<>(SB) + MOVWZ 0(R3), R3 + MOVD R3, err+96(FP) +done: + BL runtime·exitsyscall(SB) + RET + +TEXT ·syscall_rawsyscall9(SB),NOSPLIT,$0 + MOVD a1+8(FP), R1 + MOVD a2+16(FP), R2 + MOVD a3+24(FP), R3 + + // Get library control area (LCA). + MOVW PSALAA, R8 + MOVD LCA64(R8), R8 + + // Get function. + MOVD CAA(R8), R9 + MOVD EDCHPXV(R9), R9 + MOVD trap+0(FP), R5 + SLD $4, R5 + ADD R5, R9 + LMG 0(R9), R5, R6 + + // Restore LE stack. + MOVD SAVSTACK_ASYNC(R8), R9 + MOVD 0(R9), R4 + MOVD $0, 0(R9) + + // Fill in parameter list. + MOVD a4+32(FP), R12 + MOVD R12, (2176+24)(R4) + MOVD a5+40(FP), R12 + MOVD R12, (2176+32)(R4) + MOVD a6+48(FP), R12 + MOVD R12, (2176+40)(R4) + MOVD a7+56(FP), R12 + MOVD R12, (2176+48)(R4) + MOVD a8+64(FP), R12 + MOVD R12, (2176+56)(R4) + MOVD a9+72(FP), R12 + MOVD R12, (2176+64)(R4) + + // Call function. + LE_CALL + NOPH + XOR R0, R0 // Restore R0 to $0. + MOVD R4, 0(R9) // Save stack pointer. + + MOVD R3, r1+80(FP) + MOVD R0, r2+88(FP) + MOVD R0, err+96(FP) + MOVW R3, R4 + CMP R4, $-1 + BNE done + BL addrerrno<>(SB) + MOVWZ 0(R3), R3 + MOVD R3, err+96(FP) +done: + RET + +// func svcCall(fnptr unsafe.Pointer, argv *unsafe.Pointer, dsa *uint64) +TEXT ·svcCall(SB),NOSPLIT,$0 + BL runtime·save_g(SB) // Save g and stack pointer + MOVW PSALAA, R8 + MOVD LCA64(R8), R8 + MOVD SAVSTACK_ASYNC(R8), R9 + MOVD R15, 0(R9) + + MOVD argv+8(FP), R1 // Move function arguments into registers + MOVD dsa+16(FP), g + MOVD fnptr+0(FP), R15 + + BYTE $0x0D // Branch to function + BYTE $0xEF + + BL runtime·load_g(SB) // Restore g and stack pointer + MOVW PSALAA, R8 + MOVD LCA64(R8), R8 + MOVD SAVSTACK_ASYNC(R8), R9 + MOVD 0(R9), R15 + + RET + +// func svcLoad(name *byte) unsafe.Pointer +TEXT ·svcLoad(SB),NOSPLIT,$0 + MOVD R15, R2 // Save go stack pointer + MOVD name+0(FP), R0 // Move SVC args into registers + MOVD $0x80000000, R1 + MOVD $0, R15 + BYTE $0x0A // SVC 08 LOAD + BYTE $0x08 + MOVW R15, R3 // Save return code from SVC + MOVD R2, R15 // Restore go stack pointer + CMP R3, $0 // Check SVC return code + BNE error + + MOVD $-2, R3 // Reset last bit of entry point to zero + AND R0, R3 + MOVD R3, addr+8(FP) // Return entry point returned by SVC + CMP R0, R3 // Check if last bit of entry point was set + BNE done + + MOVD R15, R2 // Save go stack pointer + MOVD $0, R15 // Move SVC args into registers (entry point still in r0 from SVC 08) + BYTE $0x0A // SVC 09 DELETE + BYTE $0x09 + MOVD R2, R15 // Restore go stack pointer + +error: + MOVD $0, addr+8(FP) // Return 0 on failure +done: + XOR R0, R0 // Reset r0 to 0 + RET + +// func svcUnload(name *byte, fnptr unsafe.Pointer) int64 +TEXT ·svcUnload(SB),NOSPLIT,$0 + MOVD R15, R2 // Save go stack pointer + MOVD name+0(FP), R0 // Move SVC args into registers + MOVD addr+8(FP), R15 + BYTE $0x0A // SVC 09 + BYTE $0x09 + XOR R0, R0 // Reset r0 to 0 + MOVD R15, R1 // Save SVC return code + MOVD R2, R15 // Restore go stack pointer + MOVD R1, rc+0(FP) // Return SVC return code + RET + +// func gettid() uint64 +TEXT ·gettid(SB), NOSPLIT, $0 + // Get library control area (LCA). + MOVW PSALAA, R8 + MOVD LCA64(R8), R8 + + // Get CEECAATHDID + MOVD CAA(R8), R9 + MOVD 0x3D0(R9), R9 + MOVD R9, ret+0(FP) + + RET diff --git a/vendor/golang.org/x/sys/unix/cap_freebsd.go b/vendor/golang.org/x/sys/unix/cap_freebsd.go index df5204877378..0b7c6adb8661 100644 --- a/vendor/golang.org/x/sys/unix/cap_freebsd.go +++ b/vendor/golang.org/x/sys/unix/cap_freebsd.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build freebsd // +build freebsd package unix diff --git a/vendor/golang.org/x/sys/unix/constants.go b/vendor/golang.org/x/sys/unix/constants.go index 3a6ac648dd59..394a3965b68d 100644 --- a/vendor/golang.org/x/sys/unix/constants.go +++ b/vendor/golang.org/x/sys/unix/constants.go @@ -2,7 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris +//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos package unix diff --git a/vendor/golang.org/x/sys/unix/dev_aix_ppc.go b/vendor/golang.org/x/sys/unix/dev_aix_ppc.go index 5e5fb451044a..65a998508db4 100644 --- a/vendor/golang.org/x/sys/unix/dev_aix_ppc.go +++ b/vendor/golang.org/x/sys/unix/dev_aix_ppc.go @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build aix -// +build ppc +//go:build aix && ppc +// +build aix,ppc // Functions to access/create device major and minor numbers matching the // encoding used by AIX. diff --git a/vendor/golang.org/x/sys/unix/dev_aix_ppc64.go b/vendor/golang.org/x/sys/unix/dev_aix_ppc64.go index 8b401244c419..8fc08ad0aae2 100644 --- a/vendor/golang.org/x/sys/unix/dev_aix_ppc64.go +++ b/vendor/golang.org/x/sys/unix/dev_aix_ppc64.go @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build aix -// +build ppc64 +//go:build aix && ppc64 +// +build aix,ppc64 // Functions to access/create device major and minor numbers matching the // encoding used AIX. diff --git a/vendor/golang.org/x/sys/unix/dev_zos.go b/vendor/golang.org/x/sys/unix/dev_zos.go new file mode 100644 index 000000000000..a388e59a0e0f --- /dev/null +++ b/vendor/golang.org/x/sys/unix/dev_zos.go @@ -0,0 +1,29 @@ +// Copyright 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build zos && s390x +// +build zos,s390x + +// Functions to access/create device major and minor numbers matching the +// encoding used by z/OS. +// +// The information below is extracted and adapted from macros. + +package unix + +// Major returns the major component of a z/OS device number. +func Major(dev uint64) uint32 { + return uint32((dev >> 16) & 0x0000FFFF) +} + +// Minor returns the minor component of a z/OS device number. +func Minor(dev uint64) uint32 { + return uint32(dev & 0x0000FFFF) +} + +// Mkdev returns a z/OS device number generated from the given major and minor +// components. +func Mkdev(major, minor uint32) uint64 { + return (uint64(major) << 16) | uint64(minor) +} diff --git a/vendor/golang.org/x/sys/unix/dirent.go b/vendor/golang.org/x/sys/unix/dirent.go index 304016b68868..e74e5eaa3bfe 100644 --- a/vendor/golang.org/x/sys/unix/dirent.go +++ b/vendor/golang.org/x/sys/unix/dirent.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris // +build aix darwin dragonfly freebsd linux netbsd openbsd solaris package unix diff --git a/vendor/golang.org/x/sys/unix/endian_big.go b/vendor/golang.org/x/sys/unix/endian_big.go index 86781eac2210..a52026557681 100644 --- a/vendor/golang.org/x/sys/unix/endian_big.go +++ b/vendor/golang.org/x/sys/unix/endian_big.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +//go:build armbe || arm64be || m68k || mips || mips64 || mips64p32 || ppc || ppc64 || s390 || s390x || shbe || sparc || sparc64 // +build armbe arm64be m68k mips mips64 mips64p32 ppc ppc64 s390 s390x shbe sparc sparc64 package unix diff --git a/vendor/golang.org/x/sys/unix/endian_little.go b/vendor/golang.org/x/sys/unix/endian_little.go index 8822d8541f23..4362f47e2c00 100644 --- a/vendor/golang.org/x/sys/unix/endian_little.go +++ b/vendor/golang.org/x/sys/unix/endian_little.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +//go:build 386 || amd64 || amd64p32 || alpha || arm || arm64 || mipsle || mips64le || mips64p32le || nios2 || ppc64le || riscv || riscv64 || sh // +build 386 amd64 amd64p32 alpha arm arm64 mipsle mips64le mips64p32le nios2 ppc64le riscv riscv64 sh package unix diff --git a/vendor/golang.org/x/sys/unix/env_unix.go b/vendor/golang.org/x/sys/unix/env_unix.go index 84178b0a134a..29ccc4d1334c 100644 --- a/vendor/golang.org/x/sys/unix/env_unix.go +++ b/vendor/golang.org/x/sys/unix/env_unix.go @@ -2,7 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris +//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos // Unix environment variables. diff --git a/vendor/golang.org/x/sys/unix/epoll_zos.go b/vendor/golang.org/x/sys/unix/epoll_zos.go new file mode 100644 index 000000000000..cedaf7e024b4 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/epoll_zos.go @@ -0,0 +1,221 @@ +// Copyright 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build zos && s390x +// +build zos,s390x + +package unix + +import ( + "sync" +) + +// This file simulates epoll on z/OS using poll. + +// Analogous to epoll_event on Linux. +// TODO(neeilan): Pad is because the Linux kernel expects a 96-bit struct. We never pass this to the kernel; remove? +type EpollEvent struct { + Events uint32 + Fd int32 + Pad int32 +} + +const ( + EPOLLERR = 0x8 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDNORM = 0x40 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + // The following constants are part of the epoll API, but represent + // currently unsupported functionality on z/OS. + // EPOLL_CLOEXEC = 0x80000 + // EPOLLET = 0x80000000 + // EPOLLONESHOT = 0x40000000 + // EPOLLRDHUP = 0x2000 // Typically used with edge-triggered notis + // EPOLLEXCLUSIVE = 0x10000000 // Exclusive wake-up mode + // EPOLLWAKEUP = 0x20000000 // Relies on Linux's BLOCK_SUSPEND capability +) + +// TODO(neeilan): We can eliminate these epToPoll / pToEpoll calls by using identical mask values for POLL/EPOLL +// constants where possible The lower 16 bits of epoll events (uint32) can fit any system poll event (int16). + +// epToPollEvt converts epoll event field to poll equivalent. +// In epoll, Events is a 32-bit field, while poll uses 16 bits. +func epToPollEvt(events uint32) int16 { + var ep2p = map[uint32]int16{ + EPOLLIN: POLLIN, + EPOLLOUT: POLLOUT, + EPOLLHUP: POLLHUP, + EPOLLPRI: POLLPRI, + EPOLLERR: POLLERR, + } + + var pollEvts int16 = 0 + for epEvt, pEvt := range ep2p { + if (events & epEvt) != 0 { + pollEvts |= pEvt + } + } + + return pollEvts +} + +// pToEpollEvt converts 16 bit poll event bitfields to 32-bit epoll event fields. +func pToEpollEvt(revents int16) uint32 { + var p2ep = map[int16]uint32{ + POLLIN: EPOLLIN, + POLLOUT: EPOLLOUT, + POLLHUP: EPOLLHUP, + POLLPRI: EPOLLPRI, + POLLERR: EPOLLERR, + } + + var epollEvts uint32 = 0 + for pEvt, epEvt := range p2ep { + if (revents & pEvt) != 0 { + epollEvts |= epEvt + } + } + + return epollEvts +} + +// Per-process epoll implementation. +type epollImpl struct { + mu sync.Mutex + epfd2ep map[int]*eventPoll + nextEpfd int +} + +// eventPoll holds a set of file descriptors being watched by the process. A process can have multiple epoll instances. +// On Linux, this is an in-kernel data structure accessed through a fd. +type eventPoll struct { + mu sync.Mutex + fds map[int]*EpollEvent +} + +// epoll impl for this process. +var impl epollImpl = epollImpl{ + epfd2ep: make(map[int]*eventPoll), + nextEpfd: 0, +} + +func (e *epollImpl) epollcreate(size int) (epfd int, err error) { + e.mu.Lock() + defer e.mu.Unlock() + epfd = e.nextEpfd + e.nextEpfd++ + + e.epfd2ep[epfd] = &eventPoll{ + fds: make(map[int]*EpollEvent), + } + return epfd, nil +} + +func (e *epollImpl) epollcreate1(flag int) (fd int, err error) { + return e.epollcreate(4) +} + +func (e *epollImpl) epollctl(epfd int, op int, fd int, event *EpollEvent) (err error) { + e.mu.Lock() + defer e.mu.Unlock() + + ep, ok := e.epfd2ep[epfd] + if !ok { + + return EBADF + } + + switch op { + case EPOLL_CTL_ADD: + // TODO(neeilan): When we make epfds and fds disjoint, detect epoll + // loops here (instances watching each other) and return ELOOP. + if _, ok := ep.fds[fd]; ok { + return EEXIST + } + ep.fds[fd] = event + case EPOLL_CTL_MOD: + if _, ok := ep.fds[fd]; !ok { + return ENOENT + } + ep.fds[fd] = event + case EPOLL_CTL_DEL: + if _, ok := ep.fds[fd]; !ok { + return ENOENT + } + delete(ep.fds, fd) + + } + return nil +} + +// Must be called while holding ep.mu +func (ep *eventPoll) getFds() []int { + fds := make([]int, len(ep.fds)) + for fd := range ep.fds { + fds = append(fds, fd) + } + return fds +} + +func (e *epollImpl) epollwait(epfd int, events []EpollEvent, msec int) (n int, err error) { + e.mu.Lock() // in [rare] case of concurrent epollcreate + epollwait + ep, ok := e.epfd2ep[epfd] + + if !ok { + e.mu.Unlock() + return 0, EBADF + } + + pollfds := make([]PollFd, 4) + for fd, epollevt := range ep.fds { + pollfds = append(pollfds, PollFd{Fd: int32(fd), Events: epToPollEvt(epollevt.Events)}) + } + e.mu.Unlock() + + n, err = Poll(pollfds, msec) + if err != nil { + return n, err + } + + i := 0 + for _, pFd := range pollfds { + if pFd.Revents != 0 { + events[i] = EpollEvent{Fd: pFd.Fd, Events: pToEpollEvt(pFd.Revents)} + i++ + } + + if i == n { + break + } + } + + return n, nil +} + +func EpollCreate(size int) (fd int, err error) { + return impl.epollcreate(size) +} + +func EpollCreate1(flag int) (fd int, err error) { + return impl.epollcreate1(flag) +} + +func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + return impl.epollctl(epfd, op, fd, event) +} + +// Because EpollWait mutates events, the caller is expected to coordinate +// concurrent access if calling with the same epfd from multiple goroutines. +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + return impl.epollwait(epfd, events, msec) +} diff --git a/vendor/golang.org/x/sys/unix/fcntl.go b/vendor/golang.org/x/sys/unix/fcntl.go index 4dc534864365..e9b991258c18 100644 --- a/vendor/golang.org/x/sys/unix/fcntl.go +++ b/vendor/golang.org/x/sys/unix/fcntl.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build dragonfly || freebsd || linux || netbsd || openbsd // +build dragonfly freebsd linux netbsd openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/fcntl_linux_32bit.go b/vendor/golang.org/x/sys/unix/fcntl_linux_32bit.go index 8db48e5e0626..cb0dfbd09a04 100644 --- a/vendor/golang.org/x/sys/unix/fcntl_linux_32bit.go +++ b/vendor/golang.org/x/sys/unix/fcntl_linux_32bit.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build (linux && 386) || (linux && arm) || (linux && mips) || (linux && mipsle) // +build linux,386 linux,arm linux,mips linux,mipsle package unix diff --git a/vendor/golang.org/x/sys/unix/fdset.go b/vendor/golang.org/x/sys/unix/fdset.go index b27be0a014c9..b1e07b22023d 100644 --- a/vendor/golang.org/x/sys/unix/fdset.go +++ b/vendor/golang.org/x/sys/unix/fdset.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris // +build aix darwin dragonfly freebsd linux netbsd openbsd solaris package unix diff --git a/vendor/golang.org/x/sys/unix/fstatfs_zos.go b/vendor/golang.org/x/sys/unix/fstatfs_zos.go new file mode 100644 index 000000000000..e377cc9f49c3 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/fstatfs_zos.go @@ -0,0 +1,164 @@ +// Copyright 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build zos && s390x +// +build zos,s390x + +package unix + +import ( + "unsafe" +) + +// This file simulates fstatfs on z/OS using fstatvfs and w_getmntent. + +func Fstatfs(fd int, stat *Statfs_t) (err error) { + var stat_v Statvfs_t + err = Fstatvfs(fd, &stat_v) + if err == nil { + // populate stat + stat.Type = 0 + stat.Bsize = stat_v.Bsize + stat.Blocks = stat_v.Blocks + stat.Bfree = stat_v.Bfree + stat.Bavail = stat_v.Bavail + stat.Files = stat_v.Files + stat.Ffree = stat_v.Ffree + stat.Fsid = stat_v.Fsid + stat.Namelen = stat_v.Namemax + stat.Frsize = stat_v.Frsize + stat.Flags = stat_v.Flag + for passn := 0; passn < 5; passn++ { + switch passn { + case 0: + err = tryGetmntent64(stat) + break + case 1: + err = tryGetmntent128(stat) + break + case 2: + err = tryGetmntent256(stat) + break + case 3: + err = tryGetmntent512(stat) + break + case 4: + err = tryGetmntent1024(stat) + break + default: + break + } + //proceed to return if: err is nil (found), err is nonnil but not ERANGE (another error occurred) + if err == nil || err != nil && err != ERANGE { + break + } + } + } + return err +} + +func tryGetmntent64(stat *Statfs_t) (err error) { + var mnt_ent_buffer struct { + header W_Mnth + filesys_info [64]W_Mntent + } + var buffer_size int = int(unsafe.Sizeof(mnt_ent_buffer)) + fs_count, err := W_Getmntent((*byte)(unsafe.Pointer(&mnt_ent_buffer)), buffer_size) + if err != nil { + return err + } + err = ERANGE //return ERANGE if no match is found in this batch + for i := 0; i < fs_count; i++ { + if stat.Fsid == uint64(mnt_ent_buffer.filesys_info[i].Dev) { + stat.Type = uint32(mnt_ent_buffer.filesys_info[i].Fstname[0]) + err = nil + break + } + } + return err +} + +func tryGetmntent128(stat *Statfs_t) (err error) { + var mnt_ent_buffer struct { + header W_Mnth + filesys_info [128]W_Mntent + } + var buffer_size int = int(unsafe.Sizeof(mnt_ent_buffer)) + fs_count, err := W_Getmntent((*byte)(unsafe.Pointer(&mnt_ent_buffer)), buffer_size) + if err != nil { + return err + } + err = ERANGE //return ERANGE if no match is found in this batch + for i := 0; i < fs_count; i++ { + if stat.Fsid == uint64(mnt_ent_buffer.filesys_info[i].Dev) { + stat.Type = uint32(mnt_ent_buffer.filesys_info[i].Fstname[0]) + err = nil + break + } + } + return err +} + +func tryGetmntent256(stat *Statfs_t) (err error) { + var mnt_ent_buffer struct { + header W_Mnth + filesys_info [256]W_Mntent + } + var buffer_size int = int(unsafe.Sizeof(mnt_ent_buffer)) + fs_count, err := W_Getmntent((*byte)(unsafe.Pointer(&mnt_ent_buffer)), buffer_size) + if err != nil { + return err + } + err = ERANGE //return ERANGE if no match is found in this batch + for i := 0; i < fs_count; i++ { + if stat.Fsid == uint64(mnt_ent_buffer.filesys_info[i].Dev) { + stat.Type = uint32(mnt_ent_buffer.filesys_info[i].Fstname[0]) + err = nil + break + } + } + return err +} + +func tryGetmntent512(stat *Statfs_t) (err error) { + var mnt_ent_buffer struct { + header W_Mnth + filesys_info [512]W_Mntent + } + var buffer_size int = int(unsafe.Sizeof(mnt_ent_buffer)) + fs_count, err := W_Getmntent((*byte)(unsafe.Pointer(&mnt_ent_buffer)), buffer_size) + if err != nil { + return err + } + err = ERANGE //return ERANGE if no match is found in this batch + for i := 0; i < fs_count; i++ { + if stat.Fsid == uint64(mnt_ent_buffer.filesys_info[i].Dev) { + stat.Type = uint32(mnt_ent_buffer.filesys_info[i].Fstname[0]) + err = nil + break + } + } + return err +} + +func tryGetmntent1024(stat *Statfs_t) (err error) { + var mnt_ent_buffer struct { + header W_Mnth + filesys_info [1024]W_Mntent + } + var buffer_size int = int(unsafe.Sizeof(mnt_ent_buffer)) + fs_count, err := W_Getmntent((*byte)(unsafe.Pointer(&mnt_ent_buffer)), buffer_size) + if err != nil { + return err + } + err = ERANGE //return ERANGE if no match is found in this batch + for i := 0; i < fs_count; i++ { + if stat.Fsid == uint64(mnt_ent_buffer.filesys_info[i].Dev) { + stat.Type = uint32(mnt_ent_buffer.filesys_info[i].Fstname[0]) + err = nil + break + } + } + return err +} diff --git a/vendor/golang.org/x/sys/unix/gccgo.go b/vendor/golang.org/x/sys/unix/gccgo.go index 86032c11ef39..0dee23222ca8 100644 --- a/vendor/golang.org/x/sys/unix/gccgo.go +++ b/vendor/golang.org/x/sys/unix/gccgo.go @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build gccgo -// +build !aix +//go:build gccgo && !aix +// +build gccgo,!aix package unix diff --git a/vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go b/vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go index 251a977a8113..e60e49a3d9c0 100644 --- a/vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build gccgo && linux && amd64 // +build gccgo,linux,amd64 package unix diff --git a/vendor/golang.org/x/sys/unix/ioctl.go b/vendor/golang.org/x/sys/unix/ioctl.go index 5641678613c9..6c7ad052e6b3 100644 --- a/vendor/golang.org/x/sys/unix/ioctl.go +++ b/vendor/golang.org/x/sys/unix/ioctl.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris // +build aix darwin dragonfly freebsd linux netbsd openbsd solaris package unix diff --git a/vendor/golang.org/x/sys/unix/ioctl_zos.go b/vendor/golang.org/x/sys/unix/ioctl_zos.go new file mode 100644 index 000000000000..5384e7d91d79 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/ioctl_zos.go @@ -0,0 +1,74 @@ +// Copyright 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build zos && s390x +// +build zos,s390x + +package unix + +import ( + "runtime" + "unsafe" +) + +// ioctl itself should not be exposed directly, but additional get/set +// functions for specific types are permissible. + +// IoctlSetInt performs an ioctl operation which sets an integer value +// on fd, using the specified request number. +func IoctlSetInt(fd int, req uint, value int) error { + return ioctl(fd, req, uintptr(value)) +} + +// IoctlSetWinsize performs an ioctl on fd with a *Winsize argument. +// +// To change fd's window size, the req argument should be TIOCSWINSZ. +func IoctlSetWinsize(fd int, req uint, value *Winsize) error { + // TODO: if we get the chance, remove the req parameter and + // hardcode TIOCSWINSZ. + err := ioctl(fd, req, uintptr(unsafe.Pointer(value))) + runtime.KeepAlive(value) + return err +} + +// IoctlSetTermios performs an ioctl on fd with a *Termios. +// +// The req value is expected to be TCSETS, TCSETSW, or TCSETSF +func IoctlSetTermios(fd int, req uint, value *Termios) error { + if (req != TCSETS) && (req != TCSETSW) && (req != TCSETSF) { + return ENOSYS + } + err := Tcsetattr(fd, int(req), value) + runtime.KeepAlive(value) + return err +} + +// IoctlGetInt performs an ioctl operation which gets an integer value +// from fd, using the specified request number. +// +// A few ioctl requests use the return value as an output parameter; +// for those, IoctlRetInt should be used instead of this function. +func IoctlGetInt(fd int, req uint) (int, error) { + var value int + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return value, err +} + +func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { + var value Winsize + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +// IoctlGetTermios performs an ioctl on fd with a *Termios. +// +// The req value is expected to be TCGETS +func IoctlGetTermios(fd int, req uint) (*Termios, error) { + var value Termios + if req != TCGETS { + return &value, ENOSYS + } + err := Tcgetattr(fd, &value) + return &value, err +} diff --git a/vendor/golang.org/x/sys/unix/mkerrors.sh b/vendor/golang.org/x/sys/unix/mkerrors.sh index b8313e98afad..60ffa48a29b2 100644 --- a/vendor/golang.org/x/sys/unix/mkerrors.sh +++ b/vendor/golang.org/x/sys/unix/mkerrors.sh @@ -65,6 +65,7 @@ includes_Darwin=' #include #include #include +#include #include #include #include @@ -114,6 +115,7 @@ includes_FreeBSD=' #include #include #include +#include #include #include #include @@ -213,6 +215,7 @@ struct ltchars { #include #include #include +#include #include #include #include @@ -223,6 +226,7 @@ struct ltchars { #include #include #include +#include #include #include #include @@ -299,6 +303,17 @@ struct ltchars { // Including linux/l2tp.h here causes conflicts between linux/in.h // and netinet/in.h included via net/route.h above. #define IPPROTO_L2TP 115 + +// Copied from linux/hid.h. +// Keep in sync with the size of the referenced fields. +#define _HIDIOCGRAWNAME_LEN 128 // sizeof_field(struct hid_device, name) +#define _HIDIOCGRAWPHYS_LEN 64 // sizeof_field(struct hid_device, phys) +#define _HIDIOCGRAWUNIQ_LEN 64 // sizeof_field(struct hid_device, uniq) + +#define _HIDIOCGRAWNAME HIDIOCGRAWNAME(_HIDIOCGRAWNAME_LEN) +#define _HIDIOCGRAWPHYS HIDIOCGRAWPHYS(_HIDIOCGRAWPHYS_LEN) +#define _HIDIOCGRAWUNIQ HIDIOCGRAWUNIQ(_HIDIOCGRAWUNIQ_LEN) + ' includes_NetBSD=' @@ -446,6 +461,8 @@ ccflags="$@" $2 !~ /^EPROC_/ && $2 !~ /^EQUIV_/ && $2 !~ /^EXPR_/ && + $2 !~ /^EVIOC/ && + $2 !~ /^EV_/ && $2 ~ /^E[A-Z0-9_]+$/ || $2 ~ /^B[0-9_]+$/ || $2 ~ /^(OLD|NEW)DEV$/ || @@ -480,7 +497,7 @@ ccflags="$@" $2 ~ /^LOCK_(SH|EX|NB|UN)$/ || $2 ~ /^LO_(KEY|NAME)_SIZE$/ || $2 ~ /^LOOP_(CLR|CTL|GET|SET)_/ || - $2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|ICMP6|TCP|MCAST|EVFILT|NOTE|EV|SHUT|PROT|MAP|MFD|T?PACKET|MSG|SCM|MCL|DT|MADV|PR)_/ || + $2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|ICMP6|TCP|MCAST|EVFILT|NOTE|SHUT|PROT|MAP|MFD|T?PACKET|MSG|SCM|MCL|DT|MADV|PR|LOCAL)_/ || $2 ~ /^TP_STATUS_/ || $2 ~ /^FALLOC_/ || $2 == "ICMPV6_FILTER" || @@ -570,6 +587,9 @@ ccflags="$@" $2 ~ /^W[A-Z0-9]+$/ || $2 ~/^PPPIOC/ || $2 ~ /^FAN_|FANOTIFY_/ || + $2 == "HID_MAX_DESCRIPTOR_SIZE" || + $2 ~ /^_?HIDIOC/ || + $2 ~ /^BUS_(USB|HIL|BLUETOOTH|VIRTUAL)$/ || $2 ~ /^BLK[A-Z]*(GET$|SET$|BUF$|PART$|SIZE)/ {printf("\t%s = C.%s\n", $2, $2)} $2 ~ /^__WCOREFLAG$/ {next} $2 ~ /^__W[A-Z0-9]+$/ {printf("\t%s = C.%s\n", substr($2,3), $2)} diff --git a/vendor/golang.org/x/sys/unix/pagesize_unix.go b/vendor/golang.org/x/sys/unix/pagesize_unix.go index bc2f3629a7a9..53f1b4c5b81e 100644 --- a/vendor/golang.org/x/sys/unix/pagesize_unix.go +++ b/vendor/golang.org/x/sys/unix/pagesize_unix.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris // +build aix darwin dragonfly freebsd linux netbsd openbsd solaris // For Unix, get the pagesize from the runtime. diff --git a/vendor/golang.org/x/sys/unix/ptrace_darwin.go b/vendor/golang.org/x/sys/unix/ptrace_darwin.go index fc568b5403e6..463c3eff7fd2 100644 --- a/vendor/golang.org/x/sys/unix/ptrace_darwin.go +++ b/vendor/golang.org/x/sys/unix/ptrace_darwin.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build darwin && !ios // +build darwin,!ios package unix diff --git a/vendor/golang.org/x/sys/unix/ptrace_ios.go b/vendor/golang.org/x/sys/unix/ptrace_ios.go index 183441c9a531..ed0509a0117c 100644 --- a/vendor/golang.org/x/sys/unix/ptrace_ios.go +++ b/vendor/golang.org/x/sys/unix/ptrace_ios.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build ios // +build ios package unix diff --git a/vendor/golang.org/x/sys/unix/race.go b/vendor/golang.org/x/sys/unix/race.go index 61712b51c965..6f6c5fec5ae3 100644 --- a/vendor/golang.org/x/sys/unix/race.go +++ b/vendor/golang.org/x/sys/unix/race.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build (darwin && race) || (linux && race) || (freebsd && race) // +build darwin,race linux,race freebsd,race package unix diff --git a/vendor/golang.org/x/sys/unix/race0.go b/vendor/golang.org/x/sys/unix/race0.go index ad026678c7ca..706e1322ae41 100644 --- a/vendor/golang.org/x/sys/unix/race0.go +++ b/vendor/golang.org/x/sys/unix/race0.go @@ -2,7 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build aix darwin,!race linux,!race freebsd,!race netbsd openbsd solaris dragonfly +//go:build aix || (darwin && !race) || (linux && !race) || (freebsd && !race) || netbsd || openbsd || solaris || dragonfly || zos +// +build aix darwin,!race linux,!race freebsd,!race netbsd openbsd solaris dragonfly zos package unix diff --git a/vendor/golang.org/x/sys/unix/readdirent_getdents.go b/vendor/golang.org/x/sys/unix/readdirent_getdents.go index 3a90aa6dfaeb..4d6257569ea8 100644 --- a/vendor/golang.org/x/sys/unix/readdirent_getdents.go +++ b/vendor/golang.org/x/sys/unix/readdirent_getdents.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build aix || dragonfly || freebsd || linux || netbsd || openbsd // +build aix dragonfly freebsd linux netbsd openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/readdirent_getdirentries.go b/vendor/golang.org/x/sys/unix/readdirent_getdirentries.go index 5fdae40b3a8e..2a4ba47c45b4 100644 --- a/vendor/golang.org/x/sys/unix/readdirent_getdirentries.go +++ b/vendor/golang.org/x/sys/unix/readdirent_getdirentries.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build darwin // +build darwin package unix diff --git a/vendor/golang.org/x/sys/unix/sockcmsg_unix.go b/vendor/golang.org/x/sys/unix/sockcmsg_unix.go index 003916ed7a0f..453a942c5db3 100644 --- a/vendor/golang.org/x/sys/unix/sockcmsg_unix.go +++ b/vendor/golang.org/x/sys/unix/sockcmsg_unix.go @@ -2,7 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris +//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos // Socket control messages diff --git a/vendor/golang.org/x/sys/unix/sockcmsg_unix_other.go b/vendor/golang.org/x/sys/unix/sockcmsg_unix_other.go index 57a0021da55f..0840fe4a5749 100644 --- a/vendor/golang.org/x/sys/unix/sockcmsg_unix_other.go +++ b/vendor/golang.org/x/sys/unix/sockcmsg_unix_other.go @@ -2,7 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build aix darwin freebsd linux netbsd openbsd solaris +//go:build aix || darwin || freebsd || linux || netbsd || openbsd || solaris || zos +// +build aix darwin freebsd linux netbsd openbsd solaris zos package unix @@ -36,6 +37,10 @@ func cmsgAlignOf(salen int) int { if runtime.GOOS == "netbsd" && runtime.GOARCH == "arm64" { salign = 16 } + case "zos": + // z/OS socket macros use [32-bit] sizeof(int) alignment, + // not pointer width. + salign = SizeofInt } return (salen + salign - 1) & ^(salign - 1) diff --git a/vendor/golang.org/x/sys/unix/str.go b/vendor/golang.org/x/sys/unix/str.go index 17fb69868313..8ba89ed8694f 100644 --- a/vendor/golang.org/x/sys/unix/str.go +++ b/vendor/golang.org/x/sys/unix/str.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris // +build aix darwin dragonfly freebsd linux netbsd openbsd solaris package unix diff --git a/vendor/golang.org/x/sys/unix/syscall.go b/vendor/golang.org/x/sys/unix/syscall.go index ab75ef9cc621..649fa87405d1 100644 --- a/vendor/golang.org/x/sys/unix/syscall.go +++ b/vendor/golang.org/x/sys/unix/syscall.go @@ -2,7 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris +//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos // Package unix contains an interface to the low-level operating system // primitives. OS details vary depending on the underlying system, and diff --git a/vendor/golang.org/x/sys/unix/syscall_aix.go b/vendor/golang.org/x/sys/unix/syscall_aix.go index 4408153822db..d2723225ec58 100644 --- a/vendor/golang.org/x/sys/unix/syscall_aix.go +++ b/vendor/golang.org/x/sys/unix/syscall_aix.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build aix // +build aix // Aix system calls. @@ -419,8 +420,8 @@ func (w WaitStatus) TrapCause() int { return -1 } //sys Mknod(path string, mode uint32, dev int) (err error) //sys Mknodat(dirfd int, path string, mode uint32, dev int) (err error) //sys Nanosleep(time *Timespec, leftover *Timespec) (err error) -//sys Open(path string, mode int, perm uint32) (fd int, err error) = open64 -//sys Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) +//sys Open(path string, mode int, perm uint32) (fd int, err error) = open64 +//sys Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) //sys read(fd int, p []byte) (n int, err error) //sys Readlink(path string, buf []byte) (n int, err error) //sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) @@ -439,8 +440,8 @@ func (w WaitStatus) TrapCause() int { return -1 } //sysnb Times(tms *Tms) (ticks uintptr, err error) //sysnb Umask(mask int) (oldmask int) //sysnb Uname(buf *Utsname) (err error) -//sys Unlink(path string) (err error) -//sys Unlinkat(dirfd int, path string, flags int) (err error) +//sys Unlink(path string) (err error) +//sys Unlinkat(dirfd int, path string, flags int) (err error) //sys Ustat(dev int, ubuf *Ustat_t) (err error) //sys write(fd int, p []byte) (n int, err error) //sys readlen(fd int, p *byte, np int) (n int, err error) = read @@ -514,7 +515,7 @@ func Munmap(b []byte) (err error) { //sys Munlock(b []byte) (err error) //sys Munlockall() (err error) -//sysnb pipe(p *[2]_C_int) (err error) +//sysnb pipe(p *[2]_C_int) (err error) func Pipe(p []int) (err error) { if len(p) != 2 { diff --git a/vendor/golang.org/x/sys/unix/syscall_aix_ppc.go b/vendor/golang.org/x/sys/unix/syscall_aix_ppc.go index b3c8e3301ce6..e92a0be1630c 100644 --- a/vendor/golang.org/x/sys/unix/syscall_aix_ppc.go +++ b/vendor/golang.org/x/sys/unix/syscall_aix_ppc.go @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build aix -// +build ppc +//go:build aix && ppc +// +build aix,ppc package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_aix_ppc64.go b/vendor/golang.org/x/sys/unix/syscall_aix_ppc64.go index 9a6e024179da..16eed17098e5 100644 --- a/vendor/golang.org/x/sys/unix/syscall_aix_ppc64.go +++ b/vendor/golang.org/x/sys/unix/syscall_aix_ppc64.go @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build aix -// +build ppc64 +//go:build aix && ppc64 +// +build aix,ppc64 package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_bsd.go b/vendor/golang.org/x/sys/unix/syscall_bsd.go index bc634a280a08..95ac3946b5cc 100644 --- a/vendor/golang.org/x/sys/unix/syscall_bsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_bsd.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build darwin || dragonfly || freebsd || netbsd || openbsd // +build darwin dragonfly freebsd netbsd openbsd // BSD system call wrappers shared by *BSD based systems @@ -318,7 +319,7 @@ func Getsockname(fd int) (sa Sockaddr, err error) { return anyToSockaddr(fd, &rsa) } -//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) +//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) // GetsockoptString returns the string value of the socket option opt for the // socket associated with fd at the given socket level. @@ -332,8 +333,8 @@ func GetsockoptString(fd, level, opt int) (string, error) { return string(buf[:vallen-1]), nil } -//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) -//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) //sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { @@ -626,7 +627,7 @@ func Futimes(fd int, tv []Timeval) error { return futimes(fd, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) } -//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) +//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) func Poll(fds []PollFd, timeout int) (n int, err error) { if len(fds) == 0 { diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin.1_12.go b/vendor/golang.org/x/sys/unix/syscall_darwin.1_12.go index b31ef0358812..b0098607c706 100644 --- a/vendor/golang.org/x/sys/unix/syscall_darwin.1_12.go +++ b/vendor/golang.org/x/sys/unix/syscall_darwin.1_12.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build darwin && go1.12 && !go1.13 // +build darwin,go1.12,!go1.13 package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin.1_13.go b/vendor/golang.org/x/sys/unix/syscall_darwin.1_13.go index ee852f1abc5a..5fc3cda6fc83 100644 --- a/vendor/golang.org/x/sys/unix/syscall_darwin.1_13.go +++ b/vendor/golang.org/x/sys/unix/syscall_darwin.1_13.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build darwin && go1.13 // +build darwin,go1.13 package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin.go b/vendor/golang.org/x/sys/unix/syscall_darwin.go index 16f9c226b908..1223d7aed1c7 100644 --- a/vendor/golang.org/x/sys/unix/syscall_darwin.go +++ b/vendor/golang.org/x/sys/unix/syscall_darwin.go @@ -119,7 +119,7 @@ type attrList struct { Forkattr uint32 } -//sysnb pipe(p *[2]int32) (err error) +//sysnb pipe(p *[2]int32) (err error) func Pipe(p []int) (err error) { if len(p) != 2 { @@ -272,7 +272,7 @@ func setattrlistTimes(path string, times []Timespec, flags int) error { options) } -//sys setattrlist(path *byte, list unsafe.Pointer, buf unsafe.Pointer, size uintptr, options int) (err error) +//sys setattrlist(path *byte, list unsafe.Pointer, buf unsafe.Pointer, size uintptr, options int) (err error) func utimensat(dirfd int, path string, times *[2]Timespec, flags int) error { // Darwin doesn't support SYS_UTIMENSAT @@ -320,7 +320,7 @@ func IoctlSetIfreqMTU(fd int, ifreq *IfreqMTU) error { return err } -//sys sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS_SYSCTL +//sys sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS_SYSCTL func Uname(uname *Utsname) error { mib := []_C_int{CTL_KERN, KERN_OSTYPE} @@ -378,6 +378,15 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e return } +// GetsockoptXucred is a getsockopt wrapper that returns an Xucred struct. +// The usual level and opt are SOL_LOCAL and LOCAL_PEERCRED, respectively. +func GetsockoptXucred(fd, level, opt int) (*Xucred, error) { + x := new(Xucred) + vallen := _Socklen(SizeofXucred) + err := getsockopt(fd, level, opt, unsafe.Pointer(x), &vallen) + return x, err +} + //sys sendfile(infd int, outfd int, offset int64, len *int64, hdtr unsafe.Pointer, flags int) (err error) /* @@ -472,8 +481,8 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e //sys Unlinkat(dirfd int, path string, flags int) (err error) //sys Unmount(path string, flags int) (err error) //sys write(fd int, p []byte) (n int, err error) -//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) -//sys munmap(addr uintptr, length uintptr) (err error) +//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) +//sys munmap(addr uintptr, length uintptr) (err error) //sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ //sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin_386.go b/vendor/golang.org/x/sys/unix/syscall_darwin_386.go index ee065fcf2da9..647467712265 100644 --- a/vendor/golang.org/x/sys/unix/syscall_darwin_386.go +++ b/vendor/golang.org/x/sys/unix/syscall_darwin_386.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build 386 && darwin // +build 386,darwin package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go b/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go index 7a1f64a7b6b4..b37310ce9b40 100644 --- a/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go +++ b/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build amd64 && darwin // +build amd64,darwin package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go b/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go index 9f85fd4046ea..d51ec996304e 100644 --- a/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go +++ b/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build arm64 && darwin // +build arm64,darwin package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin_libSystem.go b/vendor/golang.org/x/sys/unix/syscall_darwin_libSystem.go index f34c86c899ac..38bec3002627 100644 --- a/vendor/golang.org/x/sys/unix/syscall_darwin_libSystem.go +++ b/vendor/golang.org/x/sys/unix/syscall_darwin_libSystem.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build darwin && go1.12 // +build darwin,go1.12 package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_dragonfly.go b/vendor/golang.org/x/sys/unix/syscall_dragonfly.go index a4f2944a24ea..5af108a50385 100644 --- a/vendor/golang.org/x/sys/unix/syscall_dragonfly.go +++ b/vendor/golang.org/x/sys/unix/syscall_dragonfly.go @@ -95,7 +95,7 @@ func direntNamlen(buf []byte) (uint64, bool) { return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen)) } -//sysnb pipe() (r int, w int, err error) +//sysnb pipe() (r int, w int, err error) func Pipe(p []int) (err error) { if len(p) != 2 { @@ -105,16 +105,16 @@ func Pipe(p []int) (err error) { return } -//sysnb pipe2(p *[2]_C_int, flags int) (err error) +//sysnb pipe2(p *[2]_C_int, flags int) (r int, w int, err error) -func Pipe2(p []int, flags int) error { +func Pipe2(p []int, flags int) (err error) { if len(p) != 2 { return EINVAL } var pp [2]_C_int - err := pipe2(&pp, flags) - p[0] = int(pp[0]) - p[1] = int(pp[1]) + // pipe2 on dragonfly takes an fds array as an argument, but still + // returns the file descriptors. + p[0], p[1], err = pipe2(&pp, flags) return err } @@ -170,7 +170,7 @@ func setattrlistTimes(path string, times []Timespec, flags int) error { //sys ioctl(fd int, req uint, arg uintptr) (err error) -//sys sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL +//sys sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL func sysctlUname(mib []_C_int, old *byte, oldlen *uintptr) error { err := sysctl(mib, old, oldlen, nil, 0) @@ -337,8 +337,8 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e //sys Unlinkat(dirfd int, path string, flags int) (err error) //sys Unmount(path string, flags int) (err error) //sys write(fd int, p []byte) (n int, err error) -//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) -//sys munmap(addr uintptr, length uintptr) (err error) +//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) +//sys munmap(addr uintptr, length uintptr) (err error) //sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ //sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE //sys accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go b/vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go index a6b4830ac8a5..4e2d32120a89 100644 --- a/vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go +++ b/vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build amd64 && dragonfly // +build amd64,dragonfly package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd.go b/vendor/golang.org/x/sys/unix/syscall_freebsd.go index acc00c2e6a10..18c392cf3692 100644 --- a/vendor/golang.org/x/sys/unix/syscall_freebsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_freebsd.go @@ -126,6 +126,15 @@ func SetsockoptIPMreqn(fd, level, opt int, mreq *IPMreqn) (err error) { return setsockopt(fd, level, opt, unsafe.Pointer(mreq), unsafe.Sizeof(*mreq)) } +// GetsockoptXucred is a getsockopt wrapper that returns an Xucred struct. +// The usual level and opt are SOL_LOCAL and LOCAL_PEERCRED, respectively. +func GetsockoptXucred(fd, level, opt int) (*Xucred, error) { + x := new(Xucred) + vallen := _Socklen(SizeofXucred) + err := getsockopt(fd, level, opt, unsafe.Pointer(x), &vallen) + return x, err +} + func Accept4(fd, flags int) (nfd int, sa Sockaddr, err error) { var rsa RawSockaddrAny var len _Socklen = SizeofSockaddrAny @@ -188,9 +197,9 @@ func setattrlistTimes(path string, times []Timespec, flags int) error { return ENOSYS } -//sys ioctl(fd int, req uint, arg uintptr) (err error) +//sys ioctl(fd int, req uint, arg uintptr) (err error) -//sys sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL +//sys sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL func Uname(uname *Utsname) error { mib := []_C_int{CTL_KERN, KERN_OSTYPE} @@ -665,8 +674,8 @@ func PtraceSingleStep(pid int) (err error) { //sys Unlinkat(dirfd int, path string, flags int) (err error) //sys Unmount(path string, flags int) (err error) //sys write(fd int, p []byte) (n int, err error) -//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) -//sys munmap(addr uintptr, length uintptr) (err error) +//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) +//sys munmap(addr uintptr, length uintptr) (err error) //sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ //sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE //sys accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go b/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go index 72a506ddcb5d..342fc32b1686 100644 --- a/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build 386 && freebsd // +build 386,freebsd package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go index d5e376acaeac..a32d5aa4aed4 100644 --- a/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build amd64 && freebsd // +build amd64,freebsd package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go b/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go index 4ea45bce52b0..1e36d39abe01 100644 --- a/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go +++ b/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build arm && freebsd // +build arm,freebsd package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go index aa5326db193d..a09a1537bd6f 100644 --- a/vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build arm64 && freebsd // +build arm64,freebsd package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_illumos.go b/vendor/golang.org/x/sys/unix/syscall_illumos.go index 7a2d4120fc08..bc442e3bace9 100644 --- a/vendor/golang.org/x/sys/unix/syscall_illumos.go +++ b/vendor/golang.org/x/sys/unix/syscall_illumos.go @@ -4,6 +4,7 @@ // illumos system calls not present on Solaris. +//go:build amd64 && illumos // +build amd64,illumos package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_linux.go b/vendor/golang.org/x/sys/unix/syscall_linux.go index 28be1306ec97..0a48548e80f3 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux.go @@ -137,12 +137,61 @@ func IoctlFileClone(destFd, srcFd int) error { return ioctl(destFd, FICLONE, uintptr(srcFd)) } +type FileDedupeRange struct { + Src_offset uint64 + Src_length uint64 + Reserved1 uint16 + Reserved2 uint32 + Info []FileDedupeRangeInfo +} + +type FileDedupeRangeInfo struct { + Dest_fd int64 + Dest_offset uint64 + Bytes_deduped uint64 + Status int32 + Reserved uint32 +} + // IoctlFileDedupeRange performs an FIDEDUPERANGE ioctl operation to share the -// range of data conveyed in value with the file associated with the file -// descriptor destFd. See the ioctl_fideduperange(2) man page for details. -func IoctlFileDedupeRange(destFd int, value *FileDedupeRange) error { - err := ioctl(destFd, FIDEDUPERANGE, uintptr(unsafe.Pointer(value))) - runtime.KeepAlive(value) +// range of data conveyed in value from the file associated with the file +// descriptor srcFd to the value.Info destinations. See the +// ioctl_fideduperange(2) man page for details. +func IoctlFileDedupeRange(srcFd int, value *FileDedupeRange) error { + buf := make([]byte, SizeofRawFileDedupeRange+ + len(value.Info)*SizeofRawFileDedupeRangeInfo) + rawrange := (*RawFileDedupeRange)(unsafe.Pointer(&buf[0])) + rawrange.Src_offset = value.Src_offset + rawrange.Src_length = value.Src_length + rawrange.Dest_count = uint16(len(value.Info)) + rawrange.Reserved1 = value.Reserved1 + rawrange.Reserved2 = value.Reserved2 + + for i := range value.Info { + rawinfo := (*RawFileDedupeRangeInfo)(unsafe.Pointer( + uintptr(unsafe.Pointer(&buf[0])) + uintptr(SizeofRawFileDedupeRange) + + uintptr(i*SizeofRawFileDedupeRangeInfo))) + rawinfo.Dest_fd = value.Info[i].Dest_fd + rawinfo.Dest_offset = value.Info[i].Dest_offset + rawinfo.Bytes_deduped = value.Info[i].Bytes_deduped + rawinfo.Status = value.Info[i].Status + rawinfo.Reserved = value.Info[i].Reserved + } + + err := ioctl(srcFd, FIDEDUPERANGE, uintptr(unsafe.Pointer(&buf[0]))) + + // Output + for i := range value.Info { + rawinfo := (*RawFileDedupeRangeInfo)(unsafe.Pointer( + uintptr(unsafe.Pointer(&buf[0])) + uintptr(SizeofRawFileDedupeRange) + + uintptr(i*SizeofRawFileDedupeRangeInfo))) + value.Info[i].Dest_fd = rawinfo.Dest_fd + value.Info[i].Dest_offset = rawinfo.Dest_offset + value.Info[i].Bytes_deduped = rawinfo.Bytes_deduped + value.Info[i].Status = rawinfo.Status + value.Info[i].Reserved = rawinfo.Reserved + } + return err } @@ -153,6 +202,36 @@ func IoctlWatchdogKeepalive(fd int) error { return ioctl(fd, WDIOC_KEEPALIVE, 0) } +func IoctlHIDGetDesc(fd int, value *HIDRawReportDescriptor) error { + err := ioctl(fd, HIDIOCGRDESC, uintptr(unsafe.Pointer(value))) + runtime.KeepAlive(value) + return err +} + +func IoctlHIDGetRawInfo(fd int) (*HIDRawDevInfo, error) { + var value HIDRawDevInfo + err := ioctl(fd, HIDIOCGRAWINFO, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func IoctlHIDGetRawName(fd int) (string, error) { + var value [_HIDIOCGRAWNAME_LEN]byte + err := ioctl(fd, _HIDIOCGRAWNAME, uintptr(unsafe.Pointer(&value[0]))) + return ByteSliceToString(value[:]), err +} + +func IoctlHIDGetRawPhys(fd int) (string, error) { + var value [_HIDIOCGRAWPHYS_LEN]byte + err := ioctl(fd, _HIDIOCGRAWPHYS, uintptr(unsafe.Pointer(&value[0]))) + return ByteSliceToString(value[:]), err +} + +func IoctlHIDGetRawUniq(fd int) (string, error) { + var value [_HIDIOCGRAWUNIQ_LEN]byte + err := ioctl(fd, _HIDIOCGRAWUNIQ, uintptr(unsafe.Pointer(&value[0]))) + return ByteSliceToString(value[:]), err +} + //sys Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) func Link(oldpath string, newpath string) (err error) { @@ -1482,8 +1561,8 @@ func KeyctlRestrictKeyring(ringid int, keyType string, restriction string) error return keyctlRestrictKeyringByType(KEYCTL_RESTRICT_KEYRING, ringid, keyType, restriction) } -//sys keyctlRestrictKeyringByType(cmd int, arg2 int, keyType string, restriction string) (err error) = SYS_KEYCTL -//sys keyctlRestrictKeyring(cmd int, arg2 int) (err error) = SYS_KEYCTL +//sys keyctlRestrictKeyringByType(cmd int, arg2 int, keyType string, restriction string) (err error) = SYS_KEYCTL +//sys keyctlRestrictKeyring(cmd int, arg2 int) (err error) = SYS_KEYCTL func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { var msg Msghdr @@ -1860,8 +1939,8 @@ func Getpgrp() (pid int) { //sys Nanosleep(time *Timespec, leftover *Timespec) (err error) //sys PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) //sys PivotRoot(newroot string, putold string) (err error) = SYS_PIVOT_ROOT -//sysnb prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) = SYS_PRLIMIT64 -//sys Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) +//sysnb prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) = SYS_PRLIMIT64 +//sys Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) //sys Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) = SYS_PSELECT6 //sys read(fd int, p []byte) (n int, err error) //sys Removexattr(path string, attr string) (err error) @@ -1934,9 +2013,9 @@ func Signalfd(fd int, sigmask *Sigset_t, flags int) (newfd int, err error) { //sys Syncfs(fd int) (err error) //sysnb Sysinfo(info *Sysinfo_t) (err error) //sys Tee(rfd int, wfd int, len int, flags int) (n int64, err error) -//sysnb TimerfdCreate(clockid int, flags int) (fd int, err error) -//sysnb TimerfdGettime(fd int, currValue *ItimerSpec) (err error) -//sysnb TimerfdSettime(fd int, flags int, newValue *ItimerSpec, oldValue *ItimerSpec) (err error) +//sysnb TimerfdCreate(clockid int, flags int) (fd int, err error) +//sysnb TimerfdGettime(fd int, currValue *ItimerSpec) (err error) +//sysnb TimerfdSettime(fd int, flags int, newValue *ItimerSpec, oldValue *ItimerSpec) (err error) //sysnb Tgkill(tgid int, tid int, sig syscall.Signal) (err error) //sysnb Times(tms *Tms) (ticks uintptr, err error) //sysnb Umask(mask int) (oldmask int) @@ -2196,8 +2275,8 @@ func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { return EACCES } -//sys nameToHandleAt(dirFD int, pathname string, fh *fileHandle, mountID *_C_int, flags int) (err error) = SYS_NAME_TO_HANDLE_AT -//sys openByHandleAt(mountFD int, fh *fileHandle, flags int) (fd int, err error) = SYS_OPEN_BY_HANDLE_AT +//sys nameToHandleAt(dirFD int, pathname string, fh *fileHandle, mountID *_C_int, flags int) (err error) = SYS_NAME_TO_HANDLE_AT +//sys openByHandleAt(mountFD int, fh *fileHandle, flags int) (fd int, err error) = SYS_OPEN_BY_HANDLE_AT // fileHandle is the argument to nameToHandleAt and openByHandleAt. We // originally tried to generate it via unix/linux/types.go with "type diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_386.go b/vendor/golang.org/x/sys/unix/syscall_linux_386.go index c97c2ee53e5f..7b52e5d8a40a 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_386.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_386.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build 386 && linux // +build 386,linux package unix @@ -31,7 +32,7 @@ func Pipe(p []int) (err error) { return } -//sysnb pipe2(p *[2]_C_int, flags int) (err error) +//sysnb pipe2(p *[2]_C_int, flags int) (err error) func Pipe2(p []int, flags int) (err error) { if len(p) != 2 { @@ -98,7 +99,7 @@ type rlimit32 struct { Max uint32 } -//sysnb getrlimit(resource int, rlim *rlimit32) (err error) = SYS_GETRLIMIT +//sysnb getrlimit(resource int, rlim *rlimit32) (err error) = SYS_GETRLIMIT const rlimInf32 = ^uint32(0) const rlimInf64 = ^uint64(0) @@ -129,7 +130,7 @@ func Getrlimit(resource int, rlim *Rlimit) (err error) { return } -//sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT +//sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT func Setrlimit(resource int, rlim *Rlimit) (err error) { err = prlimit(0, resource, rlim, nil) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go b/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go index 72efe86ed4ff..28b76411522f 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build amd64 && linux // +build amd64,linux package unix @@ -138,7 +139,7 @@ func Pipe(p []int) (err error) { return } -//sysnb pipe2(p *[2]_C_int, flags int) (err error) +//sysnb pipe2(p *[2]_C_int, flags int) (err error) func Pipe2(p []int, flags int) (err error) { if len(p) != 2 { diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_amd64_gc.go b/vendor/golang.org/x/sys/unix/syscall_linux_amd64_gc.go index baa771f8ad98..8b0f0f3aa568 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_amd64_gc.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_amd64_gc.go @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build amd64,linux -// +build gc +//go:build amd64 && linux && gc +// +build amd64,linux,gc package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_arm.go b/vendor/golang.org/x/sys/unix/syscall_linux_arm.go index 496837b1e37e..68877728ec60 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_arm.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build arm && linux // +build arm,linux package unix @@ -35,7 +36,7 @@ func Pipe(p []int) (err error) { return } -//sysnb pipe2(p *[2]_C_int, flags int) (err error) +//sysnb pipe2(p *[2]_C_int, flags int) (err error) func Pipe2(p []int, flags int) (err error) { if len(p) != 2 { @@ -129,8 +130,8 @@ func Utime(path string, buf *Utimbuf) error { //sys utimes(path string, times *[2]Timeval) (err error) -//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 -//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 //sys Truncate(path string, length int64) (err error) = SYS_TRUNCATE64 //sys Ftruncate(fd int, length int64) (err error) = SYS_FTRUNCATE64 @@ -177,7 +178,7 @@ type rlimit32 struct { Max uint32 } -//sysnb getrlimit(resource int, rlim *rlimit32) (err error) = SYS_UGETRLIMIT +//sysnb getrlimit(resource int, rlim *rlimit32) (err error) = SYS_UGETRLIMIT const rlimInf32 = ^uint32(0) const rlimInf64 = ^uint64(0) @@ -208,7 +209,7 @@ func Getrlimit(resource int, rlim *Rlimit) (err error) { return } -//sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT +//sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT func Setrlimit(resource int, rlim *Rlimit) (err error) { err = prlimit(0, resource, rlim, nil) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go b/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go index c6de6b91345e..7ed7034761c5 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build arm64 && linux // +build arm64,linux package unix @@ -155,7 +156,7 @@ func Pipe(p []int) (err error) { return } -//sysnb pipe2(p *[2]_C_int, flags int) (err error) +//sysnb pipe2(p *[2]_C_int, flags int) (err error) func Pipe2(p []int, flags int) (err error) { if len(p) != 2 { diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_gc.go b/vendor/golang.org/x/sys/unix/syscall_linux_gc.go index 9edf3961b010..2b1168d7d19f 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_gc.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_gc.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build linux && gc // +build linux,gc package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_gc_386.go b/vendor/golang.org/x/sys/unix/syscall_linux_gc_386.go index 90e33d8cf751..9843fb489601 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_gc_386.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_gc_386.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build linux && gc && 386 // +build linux,gc,386 package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_gc_arm.go b/vendor/golang.org/x/sys/unix/syscall_linux_gc_arm.go index 1a97baae732e..a6008fccd59d 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_gc_arm.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_gc_arm.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build arm && gc && linux // +build arm,gc,linux package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_gccgo_386.go b/vendor/golang.org/x/sys/unix/syscall_linux_gccgo_386.go index 308eb7aecfa8..7740af2428be 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_gccgo_386.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_gccgo_386.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build linux && gccgo && 386 // +build linux,gccgo,386 package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_gccgo_arm.go b/vendor/golang.org/x/sys/unix/syscall_linux_gccgo_arm.go index aa7fc9e19975..e16a12299aea 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_gccgo_arm.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_gccgo_arm.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build linux && gccgo && arm // +build linux,gccgo,arm package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go b/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go index f0287476cd5d..06dec06fa194 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build linux && (mips64 || mips64le) // +build linux // +build mips64 mips64le @@ -104,7 +105,7 @@ func Pipe(p []int) (err error) { return } -//sysnb pipe2(p *[2]_C_int, flags int) (err error) +//sysnb pipe2(p *[2]_C_int, flags int) (err error) func Pipe2(p []int, flags int) (err error) { if len(p) != 2 { diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go b/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go index c11328111d14..8f0d0a5b592a 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build linux && (mips || mipsle) // +build linux // +build mips mipsle @@ -112,7 +113,7 @@ func setTimeval(sec, usec int64) Timeval { return Timeval{Sec: int32(sec), Usec: int32(usec)} } -//sysnb pipe2(p *[2]_C_int, flags int) (err error) +//sysnb pipe2(p *[2]_C_int, flags int) (err error) func Pipe2(p []int, flags int) (err error) { if len(p) != 2 { @@ -125,7 +126,7 @@ func Pipe2(p []int, flags int) (err error) { return } -//sysnb pipe() (p1 int, p2 int, err error) +//sysnb pipe() (p1 int, p2 int, err error) func Pipe(p []int) (err error) { if len(p) != 2 { @@ -153,7 +154,7 @@ type rlimit32 struct { Max uint32 } -//sysnb getrlimit(resource int, rlim *rlimit32) (err error) = SYS_GETRLIMIT +//sysnb getrlimit(resource int, rlim *rlimit32) (err error) = SYS_GETRLIMIT func Getrlimit(resource int, rlim *Rlimit) (err error) { err = prlimit(0, resource, nil, rlim) @@ -181,7 +182,7 @@ func Getrlimit(resource int, rlim *Rlimit) (err error) { return } -//sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT +//sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT func Setrlimit(resource int, rlim *Rlimit) (err error) { err = prlimit(0, resource, rlim, nil) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go b/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go index 349374409ba1..0b1f0d6da579 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build linux && (ppc64 || ppc64le) // +build linux // +build ppc64 ppc64le @@ -99,7 +100,7 @@ func (cmsg *Cmsghdr) SetLen(length int) { cmsg.Len = uint64(length) } -//sysnb pipe(p *[2]_C_int) (err error) +//sysnb pipe(p *[2]_C_int) (err error) func Pipe(p []int) (err error) { if len(p) != 2 { @@ -112,7 +113,7 @@ func Pipe(p []int) (err error) { return } -//sysnb pipe2(p *[2]_C_int, flags int) (err error) +//sysnb pipe2(p *[2]_C_int, flags int) (err error) func Pipe2(p []int, flags int) (err error) { if len(p) != 2 { diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go b/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go index b0b1505565b3..ce9bcd31717a 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build riscv64 && linux // +build riscv64,linux package unix @@ -154,7 +155,7 @@ func Pipe(p []int) (err error) { return } -//sysnb pipe2(p *[2]_C_int, flags int) (err error) +//sysnb pipe2(p *[2]_C_int, flags int) (err error) func Pipe2(p []int, flags int) (err error) { if len(p) != 2 { diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go b/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go index 2363f749913b..a941d8881501 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build s390x && linux // +build s390x,linux package unix @@ -76,7 +77,7 @@ func setTimeval(sec, usec int64) Timeval { return Timeval{Sec: sec, Usec: usec} } -//sysnb pipe2(p *[2]_C_int, flags int) (err error) +//sysnb pipe2(p *[2]_C_int, flags int) (err error) func Pipe(p []int) (err error) { if len(p) != 2 { diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go b/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go index d389f1518faf..49055a3cf51b 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build sparc64 && linux // +build sparc64,linux package unix @@ -115,7 +116,7 @@ func (cmsg *Cmsghdr) SetLen(length int) { cmsg.Len = uint64(length) } -//sysnb pipe(p *[2]_C_int) (err error) +//sysnb pipe(p *[2]_C_int) (err error) func Pipe(p []int) (err error) { if len(p) != 2 { @@ -128,7 +129,7 @@ func Pipe(p []int) (err error) { return } -//sysnb pipe2(p *[2]_C_int, flags int) (err error) +//sysnb pipe2(p *[2]_C_int, flags int) (err error) func Pipe2(p []int, flags int) (err error) { if len(p) != 2 { diff --git a/vendor/golang.org/x/sys/unix/syscall_netbsd.go b/vendor/golang.org/x/sys/unix/syscall_netbsd.go index 1e6843b4c3da..853d5f0f4365 100644 --- a/vendor/golang.org/x/sys/unix/syscall_netbsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_netbsd.go @@ -110,7 +110,8 @@ func direntNamlen(buf []byte) (uint64, bool) { return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen)) } -//sysnb pipe() (fd1 int, fd2 int, err error) +//sysnb pipe() (fd1 int, fd2 int, err error) + func Pipe(p []int) (err error) { if len(p) != 2 { return EINVAL @@ -119,7 +120,21 @@ func Pipe(p []int) (err error) { return } -//sys Getdents(fd int, buf []byte) (n int, err error) +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe2(p []int, flags int) error { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err := pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return err +} + +//sys Getdents(fd int, buf []byte) (n int, err error) + func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { n, err = Getdents(fd, buf) if err != nil || basep == nil { @@ -159,7 +174,7 @@ func setattrlistTimes(path string, times []Timespec, flags int) error { //sys ioctl(fd int, req uint, arg uintptr) (err error) -//sys sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL +//sys sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL func IoctlGetPtmget(fd int, req uint) (*Ptmget, error) { var value Ptmget diff --git a/vendor/golang.org/x/sys/unix/syscall_netbsd_386.go b/vendor/golang.org/x/sys/unix/syscall_netbsd_386.go index 24da8b524548..5199d282fd0d 100644 --- a/vendor/golang.org/x/sys/unix/syscall_netbsd_386.go +++ b/vendor/golang.org/x/sys/unix/syscall_netbsd_386.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build 386 && netbsd // +build 386,netbsd package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go index 25a0ac82589a..70a9c52e9801 100644 --- a/vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build amd64 && netbsd // +build amd64,netbsd package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go b/vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go index 21591ecd4d11..3eb5942f93ff 100644 --- a/vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build arm && netbsd // +build arm,netbsd package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_netbsd_arm64.go b/vendor/golang.org/x/sys/unix/syscall_netbsd_arm64.go index 804749635008..fc6ccfd810d9 100644 --- a/vendor/golang.org/x/sys/unix/syscall_netbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/syscall_netbsd_arm64.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build arm64 && netbsd // +build arm64,netbsd package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd.go b/vendor/golang.org/x/sys/unix/syscall_openbsd.go index 6a50b50bd692..22b55038501f 100644 --- a/vendor/golang.org/x/sys/unix/syscall_openbsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_openbsd.go @@ -92,7 +92,7 @@ func Pipe2(p []int, flags int) error { return err } -//sys Getdents(fd int, buf []byte) (n int, err error) +//sys Getdents(fd int, buf []byte) (n int, err error) func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { n, err = Getdents(fd, buf) if err != nil || basep == nil { @@ -154,7 +154,7 @@ func setattrlistTimes(path string, times []Timespec, flags int) error { //sys ioctl(fd int, req uint, arg uintptr) (err error) -//sys sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL +//sys sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL //sys ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd_386.go b/vendor/golang.org/x/sys/unix/syscall_openbsd_386.go index 42b5a0e51e8c..6baabcdcb069 100644 --- a/vendor/golang.org/x/sys/unix/syscall_openbsd_386.go +++ b/vendor/golang.org/x/sys/unix/syscall_openbsd_386.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build 386 && openbsd // +build 386,openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go index 6ea4b48831b2..bab25360eae3 100644 --- a/vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build amd64 && openbsd // +build amd64,openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go b/vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go index 1c3d26fa2c9f..8eed3c4d4e7c 100644 --- a/vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build arm && openbsd // +build arm,openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd_arm64.go b/vendor/golang.org/x/sys/unix/syscall_openbsd_arm64.go index a8c458cb031e..483dde99d4c6 100644 --- a/vendor/golang.org/x/sys/unix/syscall_openbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/syscall_openbsd_arm64.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build arm64 && openbsd // +build arm64,openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_solaris.go b/vendor/golang.org/x/sys/unix/syscall_solaris.go index 184786ed99b7..169497f0620e 100644 --- a/vendor/golang.org/x/sys/unix/syscall_solaris.go +++ b/vendor/golang.org/x/sys/unix/syscall_solaris.go @@ -579,7 +579,7 @@ func IoctlGetTermio(fd int, req uint) (*Termio, error) { return &value, err } -//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) +//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) func Poll(fds []PollFd, timeout int) (n int, err error) { if len(fds) == 0 { @@ -682,6 +682,7 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e //sys Statvfs(path string, vfsstat *Statvfs_t) (err error) //sys Symlink(path string, link string) (err error) //sys Sync() (err error) +//sys Sysconf(which int) (n int64, err error) //sysnb Times(tms *Tms) (ticks uintptr, err error) //sys Truncate(path string, length int64) (err error) //sys Fsync(fd int) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go b/vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go index b22a34d7ae97..0bd25ef81f20 100644 --- a/vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go +++ b/vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build amd64 && solaris // +build amd64,solaris package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_unix.go b/vendor/golang.org/x/sys/unix/syscall_unix.go index 400ba9fbc904..a7618ceb55e3 100644 --- a/vendor/golang.org/x/sys/unix/syscall_unix.go +++ b/vendor/golang.org/x/sys/unix/syscall_unix.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris // +build aix darwin dragonfly freebsd linux netbsd openbsd solaris package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_unix_gc.go b/vendor/golang.org/x/sys/unix/syscall_unix_gc.go index 87bd161cefc9..5898e9a52b75 100644 --- a/vendor/golang.org/x/sys/unix/syscall_unix_gc.go +++ b/vendor/golang.org/x/sys/unix/syscall_unix_gc.go @@ -2,8 +2,11 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build (darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris) && gc && !ppc64le && !ppc64 // +build darwin dragonfly freebsd linux netbsd openbsd solaris -// +build gc,!ppc64le,!ppc64 +// +build gc +// +build !ppc64le +// +build !ppc64 package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_unix_gc_ppc64x.go b/vendor/golang.org/x/sys/unix/syscall_unix_gc_ppc64x.go index d36216c3ca73..f6f707acf2c3 100644 --- a/vendor/golang.org/x/sys/unix/syscall_unix_gc_ppc64x.go +++ b/vendor/golang.org/x/sys/unix/syscall_unix_gc_ppc64x.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build linux && (ppc64le || ppc64) && gc // +build linux // +build ppc64le ppc64 // +build gc diff --git a/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go b/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go new file mode 100644 index 000000000000..13f58d2b2fbc --- /dev/null +++ b/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go @@ -0,0 +1,1781 @@ +// Copyright 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build zos && s390x +// +build zos,s390x + +package unix + +import ( + "bytes" + "runtime" + "sort" + "sync" + "syscall" + "unsafe" +) + +const ( + O_CLOEXEC = 0 // Dummy value (not supported). + AF_LOCAL = AF_UNIX // AF_LOCAL is an alias for AF_UNIX +) + +func syscall_syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) +func syscall_rawsyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) +func syscall_syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) +func syscall_rawsyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) +func syscall_syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err Errno) +func syscall_rawsyscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err Errno) + +func copyStat(stat *Stat_t, statLE *Stat_LE_t) { + stat.Dev = uint64(statLE.Dev) + stat.Ino = uint64(statLE.Ino) + stat.Nlink = uint64(statLE.Nlink) + stat.Mode = uint32(statLE.Mode) + stat.Uid = uint32(statLE.Uid) + stat.Gid = uint32(statLE.Gid) + stat.Rdev = uint64(statLE.Rdev) + stat.Size = statLE.Size + stat.Atim.Sec = int64(statLE.Atim) + stat.Atim.Nsec = 0 //zos doesn't return nanoseconds + stat.Mtim.Sec = int64(statLE.Mtim) + stat.Mtim.Nsec = 0 //zos doesn't return nanoseconds + stat.Ctim.Sec = int64(statLE.Ctim) + stat.Ctim.Nsec = 0 //zos doesn't return nanoseconds + stat.Blksize = int64(statLE.Blksize) + stat.Blocks = statLE.Blocks +} + +func svcCall(fnptr unsafe.Pointer, argv *unsafe.Pointer, dsa *uint64) +func svcLoad(name *byte) unsafe.Pointer +func svcUnload(name *byte, fnptr unsafe.Pointer) int64 + +func (d *Dirent) NameString() string { + if d == nil { + return "" + } + return string(d.Name[:d.Namlen]) +} + +func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Port < 0 || sa.Port > 0xFFFF { + return nil, 0, EINVAL + } + sa.raw.Len = SizeofSockaddrInet4 + sa.raw.Family = AF_INET + p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) + p[0] = byte(sa.Port >> 8) + p[1] = byte(sa.Port) + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Addr[i] = sa.Addr[i] + } + return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil +} + +func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Port < 0 || sa.Port > 0xFFFF { + return nil, 0, EINVAL + } + sa.raw.Len = SizeofSockaddrInet6 + sa.raw.Family = AF_INET6 + p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) + p[0] = byte(sa.Port >> 8) + p[1] = byte(sa.Port) + sa.raw.Scope_id = sa.ZoneId + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Addr[i] = sa.Addr[i] + } + return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil +} + +func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) { + name := sa.Name + n := len(name) + if n >= len(sa.raw.Path) || n == 0 { + return nil, 0, EINVAL + } + sa.raw.Len = byte(3 + n) // 2 for Family, Len; 1 for NUL + sa.raw.Family = AF_UNIX + for i := 0; i < n; i++ { + sa.raw.Path[i] = int8(name[i]) + } + return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil +} + +func anyToSockaddr(_ int, rsa *RawSockaddrAny) (Sockaddr, error) { + // TODO(neeilan): Implement use of first param (fd) + switch rsa.Addr.Family { + case AF_UNIX: + pp := (*RawSockaddrUnix)(unsafe.Pointer(rsa)) + sa := new(SockaddrUnix) + // For z/OS, only replace NUL with @ when the + // length is not zero. + if pp.Len != 0 && pp.Path[0] == 0 { + // "Abstract" Unix domain socket. + // Rewrite leading NUL as @ for textual display. + // (This is the standard convention.) + // Not friendly to overwrite in place, + // but the callers below don't care. + pp.Path[0] = '@' + } + + // Assume path ends at NUL. + // + // For z/OS, the length of the name is a field + // in the structure. To be on the safe side, we + // will still scan the name for a NUL but only + // to the length provided in the structure. + // + // This is not technically the Linux semantics for + // abstract Unix domain sockets--they are supposed + // to be uninterpreted fixed-size binary blobs--but + // everyone uses this convention. + n := 0 + for n < int(pp.Len) && pp.Path[n] != 0 { + n++ + } + bytes := (*[len(pp.Path)]byte)(unsafe.Pointer(&pp.Path[0]))[0:n] + sa.Name = string(bytes) + return sa, nil + + case AF_INET: + pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa)) + sa := new(SockaddrInet4) + p := (*[2]byte)(unsafe.Pointer(&pp.Port)) + sa.Port = int(p[0])<<8 + int(p[1]) + for i := 0; i < len(sa.Addr); i++ { + sa.Addr[i] = pp.Addr[i] + } + return sa, nil + + case AF_INET6: + pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa)) + sa := new(SockaddrInet6) + p := (*[2]byte)(unsafe.Pointer(&pp.Port)) + sa.Port = int(p[0])<<8 + int(p[1]) + sa.ZoneId = pp.Scope_id + for i := 0; i < len(sa.Addr); i++ { + sa.Addr[i] = pp.Addr[i] + } + return sa, nil + } + return nil, EAFNOSUPPORT +} + +func Accept(fd int) (nfd int, sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + nfd, err = accept(fd, &rsa, &len) + if err != nil { + return + } + // TODO(neeilan): Remove 0 in call + sa, err = anyToSockaddr(0, &rsa) + if err != nil { + Close(nfd) + nfd = 0 + } + return +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = int32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = int32(length) +} + +//sys fcntl(fd int, cmd int, arg int) (val int, err error) +//sys read(fd int, p []byte) (n int, err error) +//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ +//sys write(fd int, p []byte) (n int, err error) + +//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) = SYS___ACCEPT_A +//sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) = SYS___BIND_A +//sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) = SYS___CONNECT_A +//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) +//sysnb setgroups(n int, list *_Gid_t) (err error) +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) +//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) +//sysnb socket(domain int, typ int, proto int) (fd int, err error) +//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) +//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) = SYS___GETPEERNAME_A +//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) = SYS___GETSOCKNAME_A +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) = SYS___RECVFROM_A +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) = SYS___SENDTO_A +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) = SYS___RECVMSG_A +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) = SYS___SENDMSG_A +//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) = SYS_MMAP +//sys munmap(addr uintptr, length uintptr) (err error) = SYS_MUNMAP +//sys ioctl(fd int, req uint, arg uintptr) (err error) = SYS_IOCTL + +//sys Access(path string, mode uint32) (err error) = SYS___ACCESS_A +//sys Chdir(path string) (err error) = SYS___CHDIR_A +//sys Chown(path string, uid int, gid int) (err error) = SYS___CHOWN_A +//sys Chmod(path string, mode uint32) (err error) = SYS___CHMOD_A +//sys Creat(path string, mode uint32) (fd int, err error) = SYS___CREAT_A +//sys Dup(oldfd int) (fd int, err error) +//sys Dup2(oldfd int, newfd int) (err error) +//sys Exit(code int) +//sys Fchdir(fd int) (err error) +//sys Fchmod(fd int, mode uint32) (err error) +//sys Fchown(fd int, uid int, gid int) (err error) +//sys FcntlInt(fd uintptr, cmd int, arg int) (retval int, err error) = SYS_FCNTL +//sys fstat(fd int, stat *Stat_LE_t) (err error) + +func Fstat(fd int, stat *Stat_t) (err error) { + var statLE Stat_LE_t + err = fstat(fd, &statLE) + copyStat(stat, &statLE) + return +} + +//sys Fstatvfs(fd int, stat *Statvfs_t) (err error) = SYS_FSTATVFS +//sys Fsync(fd int) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sys Getpagesize() (pgsize int) = SYS_GETPAGESIZE +//sys Mprotect(b []byte, prot int) (err error) = SYS_MPROTECT +//sys Msync(b []byte, flags int) (err error) = SYS_MSYNC +//sys Poll(fds []PollFd, timeout int) (n int, err error) = SYS_POLL +//sys Times(tms *Tms) (ticks uintptr, err error) = SYS_TIMES +//sys W_Getmntent(buff *byte, size int) (lastsys int, err error) = SYS_W_GETMNTENT + +//sys Mount(path string, filesystem string, fstype string, mtm uint32, parmlen int32, parm string) (err error) = SYS___MOUNT_A +//sys Unmount(filesystem string, mtm int) (err error) = SYS___UMOUNT_A +//sys Chroot(path string) (err error) = SYS___CHROOT_A +//sysnb Uname(buf *Utsname) (err error) = SYS___UNAME_A + +func Ptsname(fd int) (name string, err error) { + r0, _, e1 := syscall_syscall(SYS___PTSNAME_A, uintptr(fd), 0, 0) + name = u2s(unsafe.Pointer(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func u2s(cstr unsafe.Pointer) string { + str := (*[1024]uint8)(cstr) + i := 0 + for str[i] != 0 { + i++ + } + return string(str[:i]) +} + +func Close(fd int) (err error) { + _, _, e1 := syscall_syscall(SYS_CLOSE, uintptr(fd), 0, 0) + for i := 0; e1 == EAGAIN && i < 10; i++ { + _, _, _ = syscall_syscall(SYS_USLEEP, uintptr(10), 0, 0) + _, _, e1 = syscall_syscall(SYS_CLOSE, uintptr(fd), 0, 0) + } + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var mapper = &mmapper{ + active: make(map[*byte][]byte), + mmap: mmap, + munmap: munmap, +} + +// Dummy function: there are no semantics for Madvise on z/OS +func Madvise(b []byte, advice int) (err error) { + return +} + +func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { + return mapper.Mmap(fd, offset, length, prot, flags) +} + +func Munmap(b []byte) (err error) { + return mapper.Munmap(b) +} + +//sys Gethostname(buf []byte) (err error) = SYS___GETHOSTNAME_A +//sysnb Getegid() (egid int) +//sysnb Geteuid() (uid int) +//sysnb Getgid() (gid int) +//sysnb Getpid() (pid int) +//sysnb Getpgid(pid int) (pgid int, err error) = SYS_GETPGID + +func Getpgrp() (pid int) { + pid, _ = Getpgid(0) + return +} + +//sysnb Getppid() (pid int) +//sys Getpriority(which int, who int) (prio int, err error) +//sysnb Getrlimit(resource int, rlim *Rlimit) (err error) = SYS_GETRLIMIT + +//sysnb getrusage(who int, rusage *rusage_zos) (err error) = SYS_GETRUSAGE + +func Getrusage(who int, rusage *Rusage) (err error) { + var ruz rusage_zos + err = getrusage(who, &ruz) + //Only the first two fields of Rusage are set + rusage.Utime.Sec = ruz.Utime.Sec + rusage.Utime.Usec = int64(ruz.Utime.Usec) + rusage.Stime.Sec = ruz.Stime.Sec + rusage.Stime.Usec = int64(ruz.Stime.Usec) + return +} + +//sysnb Getsid(pid int) (sid int, err error) = SYS_GETSID +//sysnb Getuid() (uid int) +//sysnb Kill(pid int, sig Signal) (err error) +//sys Lchown(path string, uid int, gid int) (err error) = SYS___LCHOWN_A +//sys Link(path string, link string) (err error) = SYS___LINK_A +//sys Listen(s int, n int) (err error) +//sys lstat(path string, stat *Stat_LE_t) (err error) = SYS___LSTAT_A + +func Lstat(path string, stat *Stat_t) (err error) { + var statLE Stat_LE_t + err = lstat(path, &statLE) + copyStat(stat, &statLE) + return +} + +//sys Mkdir(path string, mode uint32) (err error) = SYS___MKDIR_A +//sys Mkfifo(path string, mode uint32) (err error) = SYS___MKFIFO_A +//sys Mknod(path string, mode uint32, dev int) (err error) = SYS___MKNOD_A +//sys Pread(fd int, p []byte, offset int64) (n int, err error) +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) +//sys Readlink(path string, buf []byte) (n int, err error) = SYS___READLINK_A +//sys Rename(from string, to string) (err error) = SYS___RENAME_A +//sys Rmdir(path string) (err error) = SYS___RMDIR_A +//sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK +//sys Setpriority(which int, who int, prio int) (err error) +//sysnb Setpgid(pid int, pgid int) (err error) = SYS_SETPGID +//sysnb Setrlimit(resource int, lim *Rlimit) (err error) +//sysnb Setregid(rgid int, egid int) (err error) = SYS_SETREGID +//sysnb Setreuid(ruid int, euid int) (err error) = SYS_SETREUID +//sysnb Setsid() (pid int, err error) = SYS_SETSID +//sys Setuid(uid int) (err error) = SYS_SETUID +//sys Setgid(uid int) (err error) = SYS_SETGID +//sys Shutdown(fd int, how int) (err error) +//sys stat(path string, statLE *Stat_LE_t) (err error) = SYS___STAT_A + +func Stat(path string, sta *Stat_t) (err error) { + var statLE Stat_LE_t + err = stat(path, &statLE) + copyStat(sta, &statLE) + return +} + +//sys Symlink(path string, link string) (err error) = SYS___SYMLINK_A +//sys Sync() = SYS_SYNC +//sys Truncate(path string, length int64) (err error) = SYS___TRUNCATE_A +//sys Tcgetattr(fildes int, termptr *Termios) (err error) = SYS_TCGETATTR +//sys Tcsetattr(fildes int, when int, termptr *Termios) (err error) = SYS_TCSETATTR +//sys Umask(mask int) (oldmask int) +//sys Unlink(path string) (err error) = SYS___UNLINK_A +//sys Utime(path string, utim *Utimbuf) (err error) = SYS___UTIME_A + +//sys open(path string, mode int, perm uint32) (fd int, err error) = SYS___OPEN_A + +func Open(path string, mode int, perm uint32) (fd int, err error) { + return open(path, mode, perm) +} + +func Mkfifoat(dirfd int, path string, mode uint32) (err error) { + wd, err := Getwd() + if err != nil { + return err + } + + if err := Fchdir(dirfd); err != nil { + return err + } + defer Chdir(wd) + + return Mkfifo(path, mode) +} + +//sys remove(path string) (err error) + +func Remove(path string) error { + return remove(path) +} + +const ImplementsGetwd = true + +func Getcwd(buf []byte) (n int, err error) { + var p unsafe.Pointer + if len(buf) > 0 { + p = unsafe.Pointer(&buf[0]) + } else { + p = unsafe.Pointer(&_zero) + } + _, _, e := syscall_syscall(SYS___GETCWD_A, uintptr(p), uintptr(len(buf)), 0) + n = clen(buf) + 1 + if e != 0 { + err = errnoErr(e) + } + return +} + +func Getwd() (wd string, err error) { + var buf [PathMax]byte + n, err := Getcwd(buf[0:]) + if err != nil { + return "", err + } + // Getcwd returns the number of bytes written to buf, including the NUL. + if n < 1 || n > len(buf) || buf[n-1] != 0 { + return "", EINVAL + } + return string(buf[0 : n-1]), nil +} + +func Getgroups() (gids []int, err error) { + n, err := getgroups(0, nil) + if err != nil { + return nil, err + } + if n == 0 { + return nil, nil + } + + // Sanity check group count. Max is 1<<16 on Linux. + if n < 0 || n > 1<<20 { + return nil, EINVAL + } + + a := make([]_Gid_t, n) + n, err = getgroups(n, &a[0]) + if err != nil { + return nil, err + } + gids = make([]int, n) + for i, v := range a[0:n] { + gids[i] = int(v) + } + return +} + +func Setgroups(gids []int) (err error) { + if len(gids) == 0 { + return setgroups(0, nil) + } + + a := make([]_Gid_t, len(gids)) + for i, v := range gids { + a[i] = _Gid_t(v) + } + return setgroups(len(a), &a[0]) +} + +func gettid() uint64 + +func Gettid() (tid int) { + return int(gettid()) +} + +type WaitStatus uint32 + +// Wait status is 7 bits at bottom, either 0 (exited), +// 0x7F (stopped), or a signal number that caused an exit. +// The 0x80 bit is whether there was a core dump. +// An extra number (exit code, signal causing a stop) +// is in the high bits. At least that's the idea. +// There are various irregularities. For example, the +// "continued" status is 0xFFFF, distinguishing itself +// from stopped via the core dump bit. + +const ( + mask = 0x7F + core = 0x80 + exited = 0x00 + stopped = 0x7F + shift = 8 +) + +func (w WaitStatus) Exited() bool { return w&mask == exited } + +func (w WaitStatus) Signaled() bool { return w&mask != stopped && w&mask != exited } + +func (w WaitStatus) Stopped() bool { return w&0xFF == stopped } + +func (w WaitStatus) Continued() bool { return w == 0xFFFF } + +func (w WaitStatus) CoreDump() bool { return w.Signaled() && w&core != 0 } + +func (w WaitStatus) ExitStatus() int { + if !w.Exited() { + return -1 + } + return int(w>>shift) & 0xFF +} + +func (w WaitStatus) Signal() Signal { + if !w.Signaled() { + return -1 + } + return Signal(w & mask) +} + +func (w WaitStatus) StopSignal() Signal { + if !w.Stopped() { + return -1 + } + return Signal(w>>shift) & 0xFF +} + +func (w WaitStatus) TrapCause() int { return -1 } + +//sys waitpid(pid int, wstatus *_C_int, options int) (wpid int, err error) + +func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) { + // TODO(mundaym): z/OS doesn't have wait4. I don't think getrusage does what we want. + // At the moment rusage will not be touched. + var status _C_int + wpid, err = waitpid(pid, &status, options) + if wstatus != nil { + *wstatus = WaitStatus(status) + } + return +} + +//sysnb gettimeofday(tv *timeval_zos) (err error) + +func Gettimeofday(tv *Timeval) (err error) { + var tvz timeval_zos + err = gettimeofday(&tvz) + tv.Sec = tvz.Sec + tv.Usec = int64(tvz.Usec) + return +} + +func Time(t *Time_t) (tt Time_t, err error) { + var tv Timeval + err = Gettimeofday(&tv) + if err != nil { + return 0, err + } + if t != nil { + *t = Time_t(tv.Sec) + } + return Time_t(tv.Sec), nil +} + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} +} + +func setTimeval(sec, usec int64) Timeval { //fix + return Timeval{Sec: sec, Usec: usec} +} + +//sysnb pipe(p *[2]_C_int) (err error) + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe(&pp) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sys utimes(path string, timeval *[2]Timeval) (err error) = SYS___UTIMES_A + +func Utimes(path string, tv []Timeval) (err error) { + if len(tv) != 2 { + return EINVAL + } + return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +func UtimesNano(path string, ts []Timespec) error { + if len(ts) != 2 { + return EINVAL + } + // Not as efficient as it could be because Timespec and + // Timeval have different types in the different OSes + tv := [2]Timeval{ + NsecToTimeval(TimespecToNsec(ts[0])), + NsecToTimeval(TimespecToNsec(ts[1])), + } + return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +func Getsockname(fd int) (sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + if err = getsockname(fd, &rsa, &len); err != nil { + return + } + // TODO(neeilan) : Remove this 0 ( added to get sys/unix compiling on z/OS ) + return anyToSockaddr(0, &rsa) +} + +const ( + // identifier constants + nwmHeaderIdentifier = 0xd5e6d4c8 + nwmFilterIdentifier = 0xd5e6d4c6 + nwmTCPConnIdentifier = 0xd5e6d4c3 + nwmRecHeaderIdentifier = 0xd5e6d4d9 + nwmIPStatsIdentifier = 0xd5e6d4c9d7e2e340 + nwmIPGStatsIdentifier = 0xd5e6d4c9d7c7e2e3 + nwmTCPStatsIdentifier = 0xd5e6d4e3c3d7e2e3 + nwmUDPStatsIdentifier = 0xd5e6d4e4c4d7e2e3 + nwmICMPGStatsEntry = 0xd5e6d4c9c3d4d7c7 + nwmICMPTStatsEntry = 0xd5e6d4c9c3d4d7e3 + + // nwmHeader constants + nwmVersion1 = 1 + nwmVersion2 = 2 + nwmCurrentVer = 2 + + nwmTCPConnType = 1 + nwmGlobalStatsType = 14 + + // nwmFilter constants + nwmFilterLclAddrMask = 0x20000000 // Local address + nwmFilterSrcAddrMask = 0x20000000 // Source address + nwmFilterLclPortMask = 0x10000000 // Local port + nwmFilterSrcPortMask = 0x10000000 // Source port + + // nwmConnEntry constants + nwmTCPStateClosed = 1 + nwmTCPStateListen = 2 + nwmTCPStateSynSent = 3 + nwmTCPStateSynRcvd = 4 + nwmTCPStateEstab = 5 + nwmTCPStateFinWait1 = 6 + nwmTCPStateFinWait2 = 7 + nwmTCPStateClosWait = 8 + nwmTCPStateLastAck = 9 + nwmTCPStateClosing = 10 + nwmTCPStateTimeWait = 11 + nwmTCPStateDeletTCB = 12 + + // Existing constants on linux + BPF_TCP_CLOSE = 1 + BPF_TCP_LISTEN = 2 + BPF_TCP_SYN_SENT = 3 + BPF_TCP_SYN_RECV = 4 + BPF_TCP_ESTABLISHED = 5 + BPF_TCP_FIN_WAIT1 = 6 + BPF_TCP_FIN_WAIT2 = 7 + BPF_TCP_CLOSE_WAIT = 8 + BPF_TCP_LAST_ACK = 9 + BPF_TCP_CLOSING = 10 + BPF_TCP_TIME_WAIT = 11 + BPF_TCP_NEW_SYN_RECV = -1 + BPF_TCP_MAX_STATES = -2 +) + +type nwmTriplet struct { + offset uint32 + length uint32 + number uint32 +} + +type nwmQuadruplet struct { + offset uint32 + length uint32 + number uint32 + match uint32 +} + +type nwmHeader struct { + ident uint32 + length uint32 + version uint16 + nwmType uint16 + bytesNeeded uint32 + options uint32 + _ [16]byte + inputDesc nwmTriplet + outputDesc nwmQuadruplet +} + +type nwmFilter struct { + ident uint32 + flags uint32 + resourceName [8]byte + resourceId uint32 + listenerId uint32 + local [28]byte // union of sockaddr4 and sockaddr6 + remote [28]byte // union of sockaddr4 and sockaddr6 + _ uint16 + _ uint16 + asid uint16 + _ [2]byte + tnLuName [8]byte + tnMonGrp uint32 + tnAppl [8]byte + applData [40]byte + nInterface [16]byte + dVipa [16]byte + dVipaPfx uint16 + dVipaPort uint16 + dVipaFamily byte + _ [3]byte + destXCF [16]byte + destXCFPfx uint16 + destXCFFamily byte + _ [1]byte + targIP [16]byte + targIPPfx uint16 + targIPFamily byte + _ [1]byte + _ [20]byte +} + +type nwmRecHeader struct { + ident uint32 + length uint32 + number byte + _ [3]byte +} + +type nwmTCPStatsEntry struct { + ident uint64 + currEstab uint32 + activeOpened uint32 + passiveOpened uint32 + connClosed uint32 + estabResets uint32 + attemptFails uint32 + passiveDrops uint32 + timeWaitReused uint32 + inSegs uint64 + predictAck uint32 + predictData uint32 + inDupAck uint32 + inBadSum uint32 + inBadLen uint32 + inShort uint32 + inDiscOldTime uint32 + inAllBeforeWin uint32 + inSomeBeforeWin uint32 + inAllAfterWin uint32 + inSomeAfterWin uint32 + inOutOfOrder uint32 + inAfterClose uint32 + inWinProbes uint32 + inWinUpdates uint32 + outWinUpdates uint32 + outSegs uint64 + outDelayAcks uint32 + outRsts uint32 + retransSegs uint32 + retransTimeouts uint32 + retransDrops uint32 + pmtuRetrans uint32 + pmtuErrors uint32 + outWinProbes uint32 + probeDrops uint32 + keepAliveProbes uint32 + keepAliveDrops uint32 + finwait2Drops uint32 + acceptCount uint64 + inBulkQSegs uint64 + inDiscards uint64 + connFloods uint32 + connStalls uint32 + cfgEphemDef uint16 + ephemInUse uint16 + ephemHiWater uint16 + flags byte + _ [1]byte + ephemExhaust uint32 + smcRCurrEstabLnks uint32 + smcRLnkActTimeOut uint32 + smcRActLnkOpened uint32 + smcRPasLnkOpened uint32 + smcRLnksClosed uint32 + smcRCurrEstab uint32 + smcRActiveOpened uint32 + smcRPassiveOpened uint32 + smcRConnClosed uint32 + smcRInSegs uint64 + smcROutSegs uint64 + smcRInRsts uint32 + smcROutRsts uint32 + smcDCurrEstabLnks uint32 + smcDActLnkOpened uint32 + smcDPasLnkOpened uint32 + smcDLnksClosed uint32 + smcDCurrEstab uint32 + smcDActiveOpened uint32 + smcDPassiveOpened uint32 + smcDConnClosed uint32 + smcDInSegs uint64 + smcDOutSegs uint64 + smcDInRsts uint32 + smcDOutRsts uint32 +} + +type nwmConnEntry struct { + ident uint32 + local [28]byte // union of sockaddr4 and sockaddr6 + remote [28]byte // union of sockaddr4 and sockaddr6 + startTime [8]byte // uint64, changed to prevent padding from being inserted + lastActivity [8]byte // uint64 + bytesIn [8]byte // uint64 + bytesOut [8]byte // uint64 + inSegs [8]byte // uint64 + outSegs [8]byte // uint64 + state uint16 + activeOpen byte + flag01 byte + outBuffered uint32 + inBuffered uint32 + maxSndWnd uint32 + reXmtCount uint32 + congestionWnd uint32 + ssThresh uint32 + roundTripTime uint32 + roundTripVar uint32 + sendMSS uint32 + sndWnd uint32 + rcvBufSize uint32 + sndBufSize uint32 + outOfOrderCount uint32 + lcl0WindowCount uint32 + rmt0WindowCount uint32 + dupacks uint32 + flag02 byte + sockOpt6Cont byte + asid uint16 + resourceName [8]byte + resourceId uint32 + subtask uint32 + sockOpt byte + sockOpt6 byte + clusterConnFlag byte + proto byte + targetAppl [8]byte + luName [8]byte + clientUserId [8]byte + logMode [8]byte + timeStamp uint32 + timeStampAge uint32 + serverResourceId uint32 + intfName [16]byte + ttlsStatPol byte + ttlsStatConn byte + ttlsSSLProt uint16 + ttlsNegCiph [2]byte + ttlsSecType byte + ttlsFIPS140Mode byte + ttlsUserID [8]byte + applData [40]byte + inOldestTime [8]byte // uint64 + outOldestTime [8]byte // uint64 + tcpTrustedPartner byte + _ [3]byte + bulkDataIntfName [16]byte + ttlsNegCiph4 [4]byte + smcReason uint32 + lclSMCLinkId uint32 + rmtSMCLinkId uint32 + smcStatus byte + smcFlags byte + _ [2]byte + rcvWnd uint32 + lclSMCBufSz uint32 + rmtSMCBufSz uint32 + ttlsSessID [32]byte + ttlsSessIDLen int16 + _ [1]byte + smcDStatus byte + smcDReason uint32 +} + +var svcNameTable [][]byte = [][]byte{ + []byte("\xc5\xe9\xc2\xd5\xd4\xc9\xc6\xf4"), // svc_EZBNMIF4 +} + +const ( + svc_EZBNMIF4 = 0 +) + +func GetsockoptTCPInfo(fd, level, opt int) (*TCPInfo, error) { + jobname := []byte("\x5c\x40\x40\x40\x40\x40\x40\x40") // "*" + responseBuffer := [4096]byte{0} + var bufferAlet, reasonCode uint32 = 0, 0 + var bufferLen, returnValue, returnCode int32 = 4096, 0, 0 + + dsa := [18]uint64{0} + var argv [7]unsafe.Pointer + argv[0] = unsafe.Pointer(&jobname[0]) + argv[1] = unsafe.Pointer(&responseBuffer[0]) + argv[2] = unsafe.Pointer(&bufferAlet) + argv[3] = unsafe.Pointer(&bufferLen) + argv[4] = unsafe.Pointer(&returnValue) + argv[5] = unsafe.Pointer(&returnCode) + argv[6] = unsafe.Pointer(&reasonCode) + + request := (*struct { + header nwmHeader + filter nwmFilter + })(unsafe.Pointer(&responseBuffer[0])) + + EZBNMIF4 := svcLoad(&svcNameTable[svc_EZBNMIF4][0]) + if EZBNMIF4 == nil { + return nil, errnoErr(EINVAL) + } + + // GetGlobalStats EZBNMIF4 call + request.header.ident = nwmHeaderIdentifier + request.header.length = uint32(unsafe.Sizeof(request.header)) + request.header.version = nwmCurrentVer + request.header.nwmType = nwmGlobalStatsType + request.header.options = 0x80000000 + + svcCall(EZBNMIF4, &argv[0], &dsa[0]) + + // outputDesc field is filled by EZBNMIF4 on success + if returnCode != 0 || request.header.outputDesc.offset == 0 { + return nil, errnoErr(EINVAL) + } + + // Check that EZBNMIF4 returned a nwmRecHeader + recHeader := (*nwmRecHeader)(unsafe.Pointer(&responseBuffer[request.header.outputDesc.offset])) + if recHeader.ident != nwmRecHeaderIdentifier { + return nil, errnoErr(EINVAL) + } + + // Parse nwmTriplets to get offsets of returned entries + var sections []*uint64 + var sectionDesc *nwmTriplet = (*nwmTriplet)(unsafe.Pointer(&responseBuffer[0])) + for i := uint32(0); i < uint32(recHeader.number); i++ { + offset := request.header.outputDesc.offset + uint32(unsafe.Sizeof(*recHeader)) + i*uint32(unsafe.Sizeof(*sectionDesc)) + sectionDesc = (*nwmTriplet)(unsafe.Pointer(&responseBuffer[offset])) + for j := uint32(0); j < sectionDesc.number; j++ { + offset = request.header.outputDesc.offset + sectionDesc.offset + j*sectionDesc.length + sections = append(sections, (*uint64)(unsafe.Pointer(&responseBuffer[offset]))) + } + } + + // Find nwmTCPStatsEntry in returned entries + var tcpStats *nwmTCPStatsEntry = nil + for _, ptr := range sections { + switch *ptr { + case nwmTCPStatsIdentifier: + if tcpStats != nil { + return nil, errnoErr(EINVAL) + } + tcpStats = (*nwmTCPStatsEntry)(unsafe.Pointer(ptr)) + case nwmIPStatsIdentifier: + case nwmIPGStatsIdentifier: + case nwmUDPStatsIdentifier: + case nwmICMPGStatsEntry: + case nwmICMPTStatsEntry: + default: + return nil, errnoErr(EINVAL) + } + } + if tcpStats == nil { + return nil, errnoErr(EINVAL) + } + + // GetConnectionDetail EZBNMIF4 call + responseBuffer = [4096]byte{0} + dsa = [18]uint64{0} + bufferAlet, reasonCode = 0, 0 + bufferLen, returnValue, returnCode = 4096, 0, 0 + nameptr := (*uint32)(unsafe.Pointer(uintptr(0x21c))) // Get jobname of current process + nameptr = (*uint32)(unsafe.Pointer(uintptr(*nameptr + 12))) + argv[0] = unsafe.Pointer(uintptr(*nameptr)) + + request.header.ident = nwmHeaderIdentifier + request.header.length = uint32(unsafe.Sizeof(request.header)) + request.header.version = nwmCurrentVer + request.header.nwmType = nwmTCPConnType + request.header.options = 0x80000000 + + request.filter.ident = nwmFilterIdentifier + + var localSockaddr RawSockaddrAny + socklen := _Socklen(SizeofSockaddrAny) + err := getsockname(fd, &localSockaddr, &socklen) + if err != nil { + return nil, errnoErr(EINVAL) + } + if localSockaddr.Addr.Family == AF_INET { + localSockaddr := (*RawSockaddrInet4)(unsafe.Pointer(&localSockaddr.Addr)) + localSockFilter := (*RawSockaddrInet4)(unsafe.Pointer(&request.filter.local[0])) + localSockFilter.Family = AF_INET + var i int + for i = 0; i < 4; i++ { + if localSockaddr.Addr[i] != 0 { + break + } + } + if i != 4 { + request.filter.flags |= nwmFilterLclAddrMask + for i = 0; i < 4; i++ { + localSockFilter.Addr[i] = localSockaddr.Addr[i] + } + } + if localSockaddr.Port != 0 { + request.filter.flags |= nwmFilterLclPortMask + localSockFilter.Port = localSockaddr.Port + } + } else if localSockaddr.Addr.Family == AF_INET6 { + localSockaddr := (*RawSockaddrInet6)(unsafe.Pointer(&localSockaddr.Addr)) + localSockFilter := (*RawSockaddrInet6)(unsafe.Pointer(&request.filter.local[0])) + localSockFilter.Family = AF_INET6 + var i int + for i = 0; i < 16; i++ { + if localSockaddr.Addr[i] != 0 { + break + } + } + if i != 16 { + request.filter.flags |= nwmFilterLclAddrMask + for i = 0; i < 16; i++ { + localSockFilter.Addr[i] = localSockaddr.Addr[i] + } + } + if localSockaddr.Port != 0 { + request.filter.flags |= nwmFilterLclPortMask + localSockFilter.Port = localSockaddr.Port + } + } + + svcCall(EZBNMIF4, &argv[0], &dsa[0]) + + // outputDesc field is filled by EZBNMIF4 on success + if returnCode != 0 || request.header.outputDesc.offset == 0 { + return nil, errnoErr(EINVAL) + } + + // Check that EZBNMIF4 returned a nwmConnEntry + conn := (*nwmConnEntry)(unsafe.Pointer(&responseBuffer[request.header.outputDesc.offset])) + if conn.ident != nwmTCPConnIdentifier { + return nil, errnoErr(EINVAL) + } + + // Copy data from the returned data structures into tcpInfo + // Stats from nwmConnEntry are specific to that connection. + // Stats from nwmTCPStatsEntry are global (to the interface?) + // Fields may not be an exact match. Some fields have no equivalent. + var tcpinfo TCPInfo + tcpinfo.State = uint8(conn.state) + tcpinfo.Ca_state = 0 // dummy + tcpinfo.Retransmits = uint8(tcpStats.retransSegs) + tcpinfo.Probes = uint8(tcpStats.outWinProbes) + tcpinfo.Backoff = 0 // dummy + tcpinfo.Options = 0 // dummy + tcpinfo.Rto = tcpStats.retransTimeouts + tcpinfo.Ato = tcpStats.outDelayAcks + tcpinfo.Snd_mss = conn.sendMSS + tcpinfo.Rcv_mss = conn.sendMSS // dummy + tcpinfo.Unacked = 0 // dummy + tcpinfo.Sacked = 0 // dummy + tcpinfo.Lost = 0 // dummy + tcpinfo.Retrans = conn.reXmtCount + tcpinfo.Fackets = 0 // dummy + tcpinfo.Last_data_sent = uint32(*(*uint64)(unsafe.Pointer(&conn.lastActivity[0]))) + tcpinfo.Last_ack_sent = uint32(*(*uint64)(unsafe.Pointer(&conn.outOldestTime[0]))) + tcpinfo.Last_data_recv = uint32(*(*uint64)(unsafe.Pointer(&conn.inOldestTime[0]))) + tcpinfo.Last_ack_recv = uint32(*(*uint64)(unsafe.Pointer(&conn.inOldestTime[0]))) + tcpinfo.Pmtu = conn.sendMSS // dummy, NWMIfRouteMtu is a candidate + tcpinfo.Rcv_ssthresh = conn.ssThresh + tcpinfo.Rtt = conn.roundTripTime + tcpinfo.Rttvar = conn.roundTripVar + tcpinfo.Snd_ssthresh = conn.ssThresh // dummy + tcpinfo.Snd_cwnd = conn.congestionWnd + tcpinfo.Advmss = conn.sendMSS // dummy + tcpinfo.Reordering = 0 // dummy + tcpinfo.Rcv_rtt = conn.roundTripTime // dummy + tcpinfo.Rcv_space = conn.sendMSS // dummy + tcpinfo.Total_retrans = conn.reXmtCount + + svcUnload(&svcNameTable[svc_EZBNMIF4][0], EZBNMIF4) + + return &tcpinfo, nil +} + +// GetsockoptString returns the string value of the socket option opt for the +// socket associated with fd at the given socket level. +func GetsockoptString(fd, level, opt int) (string, error) { + buf := make([]byte, 256) + vallen := _Socklen(len(buf)) + err := getsockopt(fd, level, opt, unsafe.Pointer(&buf[0]), &vallen) + if err != nil { + return "", err + } + + return string(buf[:vallen-1]), nil +} + +func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { + var msg Msghdr + var rsa RawSockaddrAny + msg.Name = (*byte)(unsafe.Pointer(&rsa)) + msg.Namelen = SizeofSockaddrAny + var iov Iovec + if len(p) > 0 { + iov.Base = (*byte)(unsafe.Pointer(&p[0])) + iov.SetLen(len(p)) + } + var dummy byte + if len(oob) > 0 { + // receive at least one normal byte + if len(p) == 0 { + iov.Base = &dummy + iov.SetLen(1) + } + msg.Control = (*byte)(unsafe.Pointer(&oob[0])) + msg.SetControllen(len(oob)) + } + msg.Iov = &iov + msg.Iovlen = 1 + if n, err = recvmsg(fd, &msg, flags); err != nil { + return + } + oobn = int(msg.Controllen) + recvflags = int(msg.Flags) + // source address is only specified if the socket is unconnected + if rsa.Addr.Family != AF_UNSPEC { + // TODO(neeilan): Remove 0 arg added to get this compiling on z/OS + from, err = anyToSockaddr(0, &rsa) + } + return +} + +func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) { + _, err = SendmsgN(fd, p, oob, to, flags) + return +} + +func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) { + var ptr unsafe.Pointer + var salen _Socklen + if to != nil { + var err error + ptr, salen, err = to.sockaddr() + if err != nil { + return 0, err + } + } + var msg Msghdr + msg.Name = (*byte)(unsafe.Pointer(ptr)) + msg.Namelen = int32(salen) + var iov Iovec + if len(p) > 0 { + iov.Base = (*byte)(unsafe.Pointer(&p[0])) + iov.SetLen(len(p)) + } + var dummy byte + if len(oob) > 0 { + // send at least one normal byte + if len(p) == 0 { + iov.Base = &dummy + iov.SetLen(1) + } + msg.Control = (*byte)(unsafe.Pointer(&oob[0])) + msg.SetControllen(len(oob)) + } + msg.Iov = &iov + msg.Iovlen = 1 + if n, err = sendmsg(fd, &msg, flags); err != nil { + return 0, err + } + if len(oob) > 0 && len(p) == 0 { + n = 0 + } + return n, nil +} + +func Opendir(name string) (uintptr, error) { + p, err := BytePtrFromString(name) + if err != nil { + return 0, err + } + dir, _, e := syscall_syscall(SYS___OPENDIR_A, uintptr(unsafe.Pointer(p)), 0, 0) + runtime.KeepAlive(unsafe.Pointer(p)) + if e != 0 { + err = errnoErr(e) + } + return dir, err +} + +// clearsyscall.Errno resets the errno value to 0. +func clearErrno() + +func Readdir(dir uintptr) (*Dirent, error) { + var ent Dirent + var res uintptr + // __readdir_r_a returns errno at the end of the directory stream, rather than 0. + // Therefore to avoid false positives we clear errno before calling it. + + // TODO(neeilan): Commented this out to get sys/unix compiling on z/OS. Uncomment and fix. Error: "undefined: clearsyscall" + //clearsyscall.Errno() // TODO(mundaym): check pre-emption rules. + + e, _, _ := syscall_syscall(SYS___READDIR_R_A, dir, uintptr(unsafe.Pointer(&ent)), uintptr(unsafe.Pointer(&res))) + var err error + if e != 0 { + err = errnoErr(Errno(e)) + } + if res == 0 { + return nil, err + } + return &ent, err +} + +func Closedir(dir uintptr) error { + _, _, e := syscall_syscall(SYS_CLOSEDIR, dir, 0, 0) + if e != 0 { + return errnoErr(e) + } + return nil +} + +func Seekdir(dir uintptr, pos int) { + _, _, _ = syscall_syscall(SYS_SEEKDIR, dir, uintptr(pos), 0) +} + +func Telldir(dir uintptr) (int, error) { + p, _, e := syscall_syscall(SYS_TELLDIR, dir, 0, 0) + pos := int(p) + if pos == -1 { + return pos, errnoErr(e) + } + return pos, nil +} + +// FcntlFlock performs a fcntl syscall for the F_GETLK, F_SETLK or F_SETLKW command. +func FcntlFlock(fd uintptr, cmd int, lk *Flock_t) error { + // struct flock is packed on z/OS. We can't emulate that in Go so + // instead we pack it here. + var flock [24]byte + *(*int16)(unsafe.Pointer(&flock[0])) = lk.Type + *(*int16)(unsafe.Pointer(&flock[2])) = lk.Whence + *(*int64)(unsafe.Pointer(&flock[4])) = lk.Start + *(*int64)(unsafe.Pointer(&flock[12])) = lk.Len + *(*int32)(unsafe.Pointer(&flock[20])) = lk.Pid + _, _, errno := syscall_syscall(SYS_FCNTL, fd, uintptr(cmd), uintptr(unsafe.Pointer(&flock))) + lk.Type = *(*int16)(unsafe.Pointer(&flock[0])) + lk.Whence = *(*int16)(unsafe.Pointer(&flock[2])) + lk.Start = *(*int64)(unsafe.Pointer(&flock[4])) + lk.Len = *(*int64)(unsafe.Pointer(&flock[12])) + lk.Pid = *(*int32)(unsafe.Pointer(&flock[20])) + if errno == 0 { + return nil + } + return errno +} + +func Flock(fd int, how int) error { + + var flock_type int16 + var fcntl_cmd int + + switch how { + case LOCK_SH | LOCK_NB: + flock_type = F_RDLCK + fcntl_cmd = F_SETLK + case LOCK_EX | LOCK_NB: + flock_type = F_WRLCK + fcntl_cmd = F_SETLK + case LOCK_EX: + flock_type = F_WRLCK + fcntl_cmd = F_SETLKW + case LOCK_UN: + flock_type = F_UNLCK + fcntl_cmd = F_SETLKW + default: + } + + flock := Flock_t{ + Type: int16(flock_type), + Whence: int16(0), + Start: int64(0), + Len: int64(0), + Pid: int32(Getppid()), + } + + err := FcntlFlock(uintptr(fd), fcntl_cmd, &flock) + return err +} + +func Mlock(b []byte) (err error) { + _, _, e1 := syscall_syscall(SYS___MLOCKALL, _BPX_NONSWAP, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func Mlock2(b []byte, flags int) (err error) { + _, _, e1 := syscall_syscall(SYS___MLOCKALL, _BPX_NONSWAP, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func Mlockall(flags int) (err error) { + _, _, e1 := syscall_syscall(SYS___MLOCKALL, _BPX_NONSWAP, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func Munlock(b []byte) (err error) { + _, _, e1 := syscall_syscall(SYS___MLOCKALL, _BPX_SWAP, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func Munlockall() (err error) { + _, _, e1 := syscall_syscall(SYS___MLOCKALL, _BPX_SWAP, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func ClockGettime(clockid int32, ts *Timespec) error { + + var ticks_per_sec uint32 = 100 //TODO(kenan): value is currently hardcoded; need sysconf() call otherwise + var nsec_per_sec int64 = 1000000000 + + if ts == nil { + return EFAULT + } + if clockid == CLOCK_REALTIME || clockid == CLOCK_MONOTONIC { + var nanotime int64 = runtime.Nanotime1() + ts.Sec = nanotime / nsec_per_sec + ts.Nsec = nanotime % nsec_per_sec + } else if clockid == CLOCK_PROCESS_CPUTIME_ID || clockid == CLOCK_THREAD_CPUTIME_ID { + var tm Tms + _, err := Times(&tm) + if err != nil { + return EFAULT + } + ts.Sec = int64(tm.Utime / ticks_per_sec) + ts.Nsec = int64(tm.Utime) * nsec_per_sec / int64(ticks_per_sec) + } else { + return EINVAL + } + return nil +} + +func Statfs(path string, stat *Statfs_t) (err error) { + fd, err := open(path, O_RDONLY, 0) + defer Close(fd) + if err != nil { + return err + } + return Fstatfs(fd, stat) +} + +var ( + Stdin = 0 + Stdout = 1 + Stderr = 2 +) + +// Do the interface allocations only once for common +// Errno values. +var ( + errEAGAIN error = syscall.EAGAIN + errEINVAL error = syscall.EINVAL + errENOENT error = syscall.ENOENT +) + +var ( + signalNameMapOnce sync.Once + signalNameMap map[string]syscall.Signal +) + +// errnoErr returns common boxed Errno values, to prevent +// allocations at runtime. +func errnoErr(e Errno) error { + switch e { + case 0: + return nil + case EAGAIN: + return errEAGAIN + case EINVAL: + return errEINVAL + case ENOENT: + return errENOENT + } + return e +} + +// ErrnoName returns the error name for error number e. +func ErrnoName(e Errno) string { + i := sort.Search(len(errorList), func(i int) bool { + return errorList[i].num >= e + }) + if i < len(errorList) && errorList[i].num == e { + return errorList[i].name + } + return "" +} + +// SignalName returns the signal name for signal number s. +func SignalName(s syscall.Signal) string { + i := sort.Search(len(signalList), func(i int) bool { + return signalList[i].num >= s + }) + if i < len(signalList) && signalList[i].num == s { + return signalList[i].name + } + return "" +} + +// SignalNum returns the syscall.Signal for signal named s, +// or 0 if a signal with such name is not found. +// The signal name should start with "SIG". +func SignalNum(s string) syscall.Signal { + signalNameMapOnce.Do(func() { + signalNameMap = make(map[string]syscall.Signal, len(signalList)) + for _, signal := range signalList { + signalNameMap[signal.name] = signal.num + } + }) + return signalNameMap[s] +} + +// clen returns the index of the first NULL byte in n or len(n) if n contains no NULL byte. +func clen(n []byte) int { + i := bytes.IndexByte(n, 0) + if i == -1 { + i = len(n) + } + return i +} + +// Mmap manager, for use by operating system-specific implementations. + +type mmapper struct { + sync.Mutex + active map[*byte][]byte // active mappings; key is last byte in mapping + mmap func(addr, length uintptr, prot, flags, fd int, offset int64) (uintptr, error) + munmap func(addr uintptr, length uintptr) error +} + +func (m *mmapper) Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { + if length <= 0 { + return nil, EINVAL + } + + // Map the requested memory. + addr, errno := m.mmap(0, uintptr(length), prot, flags, fd, offset) + if errno != nil { + return nil, errno + } + + // Slice memory layout + var sl = struct { + addr uintptr + len int + cap int + }{addr, length, length} + + // Use unsafe to turn sl into a []byte. + b := *(*[]byte)(unsafe.Pointer(&sl)) + + // Register mapping in m and return it. + p := &b[cap(b)-1] + m.Lock() + defer m.Unlock() + m.active[p] = b + return b, nil +} + +func (m *mmapper) Munmap(data []byte) (err error) { + if len(data) == 0 || len(data) != cap(data) { + return EINVAL + } + + // Find the base of the mapping. + p := &data[cap(data)-1] + m.Lock() + defer m.Unlock() + b := m.active[p] + if b == nil || &b[0] != &data[0] { + return EINVAL + } + + // Unmap the memory and update m. + if errno := m.munmap(uintptr(unsafe.Pointer(&b[0])), uintptr(len(b))); errno != nil { + return errno + } + delete(m.active, p) + return nil +} + +func Read(fd int, p []byte) (n int, err error) { + n, err = read(fd, p) + if raceenabled { + if n > 0 { + raceWriteRange(unsafe.Pointer(&p[0]), n) + } + if err == nil { + raceAcquire(unsafe.Pointer(&ioSync)) + } + } + return +} + +func Write(fd int, p []byte) (n int, err error) { + if raceenabled { + raceReleaseMerge(unsafe.Pointer(&ioSync)) + } + n, err = write(fd, p) + if raceenabled && n > 0 { + raceReadRange(unsafe.Pointer(&p[0]), n) + } + return +} + +// For testing: clients can set this flag to force +// creation of IPv6 sockets to return EAFNOSUPPORT. +var SocketDisableIPv6 bool + +// Sockaddr represents a socket address. +type Sockaddr interface { + sockaddr() (ptr unsafe.Pointer, len _Socklen, err error) // lowercase; only we can define Sockaddrs +} + +// SockaddrInet4 implements the Sockaddr interface for AF_INET type sockets. +type SockaddrInet4 struct { + Port int + Addr [4]byte + raw RawSockaddrInet4 +} + +// SockaddrInet6 implements the Sockaddr interface for AF_INET6 type sockets. +type SockaddrInet6 struct { + Port int + ZoneId uint32 + Addr [16]byte + raw RawSockaddrInet6 +} + +// SockaddrUnix implements the Sockaddr interface for AF_UNIX type sockets. +type SockaddrUnix struct { + Name string + raw RawSockaddrUnix +} + +func Bind(fd int, sa Sockaddr) (err error) { + ptr, n, err := sa.sockaddr() + if err != nil { + return err + } + return bind(fd, ptr, n) +} + +func Connect(fd int, sa Sockaddr) (err error) { + ptr, n, err := sa.sockaddr() + if err != nil { + return err + } + return connect(fd, ptr, n) +} + +func Getpeername(fd int) (sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + if err = getpeername(fd, &rsa, &len); err != nil { + return + } + return anyToSockaddr(fd, &rsa) +} + +func GetsockoptByte(fd, level, opt int) (value byte, err error) { + var n byte + vallen := _Socklen(1) + err = getsockopt(fd, level, opt, unsafe.Pointer(&n), &vallen) + return n, err +} + +func GetsockoptInt(fd, level, opt int) (value int, err error) { + var n int32 + vallen := _Socklen(4) + err = getsockopt(fd, level, opt, unsafe.Pointer(&n), &vallen) + return int(n), err +} + +func GetsockoptInet4Addr(fd, level, opt int) (value [4]byte, err error) { + vallen := _Socklen(4) + err = getsockopt(fd, level, opt, unsafe.Pointer(&value[0]), &vallen) + return value, err +} + +func GetsockoptIPMreq(fd, level, opt int) (*IPMreq, error) { + var value IPMreq + vallen := _Socklen(SizeofIPMreq) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +func GetsockoptIPv6Mreq(fd, level, opt int) (*IPv6Mreq, error) { + var value IPv6Mreq + vallen := _Socklen(SizeofIPv6Mreq) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +func GetsockoptIPv6MTUInfo(fd, level, opt int) (*IPv6MTUInfo, error) { + var value IPv6MTUInfo + vallen := _Socklen(SizeofIPv6MTUInfo) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +func GetsockoptICMPv6Filter(fd, level, opt int) (*ICMPv6Filter, error) { + var value ICMPv6Filter + vallen := _Socklen(SizeofICMPv6Filter) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +func GetsockoptLinger(fd, level, opt int) (*Linger, error) { + var linger Linger + vallen := _Socklen(SizeofLinger) + err := getsockopt(fd, level, opt, unsafe.Pointer(&linger), &vallen) + return &linger, err +} + +func GetsockoptTimeval(fd, level, opt int) (*Timeval, error) { + var tv Timeval + vallen := _Socklen(unsafe.Sizeof(tv)) + err := getsockopt(fd, level, opt, unsafe.Pointer(&tv), &vallen) + return &tv, err +} + +func GetsockoptUint64(fd, level, opt int) (value uint64, err error) { + var n uint64 + vallen := _Socklen(8) + err = getsockopt(fd, level, opt, unsafe.Pointer(&n), &vallen) + return n, err +} + +func Recvfrom(fd int, p []byte, flags int) (n int, from Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + if n, err = recvfrom(fd, p, flags, &rsa, &len); err != nil { + return + } + if rsa.Addr.Family != AF_UNSPEC { + from, err = anyToSockaddr(fd, &rsa) + } + return +} + +func Sendto(fd int, p []byte, flags int, to Sockaddr) (err error) { + ptr, n, err := to.sockaddr() + if err != nil { + return err + } + return sendto(fd, p, flags, ptr, n) +} + +func SetsockoptByte(fd, level, opt int, value byte) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(&value), 1) +} + +func SetsockoptInt(fd, level, opt int, value int) (err error) { + var n = int32(value) + return setsockopt(fd, level, opt, unsafe.Pointer(&n), 4) +} + +func SetsockoptInet4Addr(fd, level, opt int, value [4]byte) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(&value[0]), 4) +} + +func SetsockoptIPMreq(fd, level, opt int, mreq *IPMreq) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(mreq), SizeofIPMreq) +} + +func SetsockoptIPv6Mreq(fd, level, opt int, mreq *IPv6Mreq) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(mreq), SizeofIPv6Mreq) +} + +func SetsockoptICMPv6Filter(fd, level, opt int, filter *ICMPv6Filter) error { + return setsockopt(fd, level, opt, unsafe.Pointer(filter), SizeofICMPv6Filter) +} + +func SetsockoptLinger(fd, level, opt int, l *Linger) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(l), SizeofLinger) +} + +func SetsockoptString(fd, level, opt int, s string) (err error) { + var p unsafe.Pointer + if len(s) > 0 { + p = unsafe.Pointer(&[]byte(s)[0]) + } + return setsockopt(fd, level, opt, p, uintptr(len(s))) +} + +func SetsockoptTimeval(fd, level, opt int, tv *Timeval) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(tv), unsafe.Sizeof(*tv)) +} + +func SetsockoptUint64(fd, level, opt int, value uint64) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(&value), 8) +} + +func Socket(domain, typ, proto int) (fd int, err error) { + if domain == AF_INET6 && SocketDisableIPv6 { + return -1, EAFNOSUPPORT + } + fd, err = socket(domain, typ, proto) + return +} + +func Socketpair(domain, typ, proto int) (fd [2]int, err error) { + var fdx [2]int32 + err = socketpair(domain, typ, proto, &fdx) + if err == nil { + fd[0] = int(fdx[0]) + fd[1] = int(fdx[1]) + } + return +} + +var ioSync int64 + +func CloseOnExec(fd int) { fcntl(fd, F_SETFD, FD_CLOEXEC) } + +func SetNonblock(fd int, nonblocking bool) (err error) { + flag, err := fcntl(fd, F_GETFL, 0) + if err != nil { + return err + } + if nonblocking { + flag |= O_NONBLOCK + } else { + flag &= ^O_NONBLOCK + } + _, err = fcntl(fd, F_SETFL, flag) + return err +} + +// Exec calls execve(2), which replaces the calling executable in the process +// tree. argv0 should be the full path to an executable ("/bin/ls") and the +// executable name should also be the first argument in argv (["ls", "-l"]). +// envv are the environment variables that should be passed to the new +// process (["USER=go", "PWD=/tmp"]). +func Exec(argv0 string, argv []string, envv []string) error { + return syscall.Exec(argv0, argv, envv) +} diff --git a/vendor/golang.org/x/sys/unix/timestruct.go b/vendor/golang.org/x/sys/unix/timestruct.go index 103604299e2a..3d893040553b 100644 --- a/vendor/golang.org/x/sys/unix/timestruct.go +++ b/vendor/golang.org/x/sys/unix/timestruct.go @@ -2,7 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris +//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos package unix diff --git a/vendor/golang.org/x/sys/unix/xattr_bsd.go b/vendor/golang.org/x/sys/unix/xattr_bsd.go index 30c1d71f4edd..25df1e37801f 100644 --- a/vendor/golang.org/x/sys/unix/xattr_bsd.go +++ b/vendor/golang.org/x/sys/unix/xattr_bsd.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build freebsd || netbsd // +build freebsd netbsd package unix diff --git a/vendor/golang.org/x/sys/unix/zerrors_aix_ppc.go b/vendor/golang.org/x/sys/unix/zerrors_aix_ppc.go index 104994bc6a98..ca9799b79ef9 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_aix_ppc.go +++ b/vendor/golang.org/x/sys/unix/zerrors_aix_ppc.go @@ -1,6 +1,7 @@ // mkerrors.sh -maix32 // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build ppc && aix // +build ppc,aix // Created by cgo -godefs - DO NOT EDIT diff --git a/vendor/golang.org/x/sys/unix/zerrors_aix_ppc64.go b/vendor/golang.org/x/sys/unix/zerrors_aix_ppc64.go index 4fc8d306493c..200c8c26fe65 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_aix_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_aix_ppc64.go @@ -1,6 +1,7 @@ // mkerrors.sh -maix64 // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build ppc64 && aix // +build ppc64,aix // Code generated by cmd/cgo -godefs; DO NOT EDIT. diff --git a/vendor/golang.org/x/sys/unix/zerrors_darwin_386.go b/vendor/golang.org/x/sys/unix/zerrors_darwin_386.go index ec376f51bc42..7ee196f7fccf 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_darwin_386.go +++ b/vendor/golang.org/x/sys/unix/zerrors_darwin_386.go @@ -1,6 +1,7 @@ // mkerrors.sh -m32 // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build 386 && darwin // +build 386,darwin // Code generated by cmd/cgo -godefs; DO NOT EDIT. diff --git a/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go index fea5dfaadb9b..0100cb12f1f3 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go @@ -1,6 +1,7 @@ // mkerrors.sh -m64 // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build amd64 && darwin // +build amd64,darwin // Code generated by cmd/cgo -godefs; DO NOT EDIT. @@ -32,7 +33,7 @@ const ( AF_LAT = 0xe AF_LINK = 0x12 AF_LOCAL = 0x1 - AF_MAX = 0x28 + AF_MAX = 0x29 AF_NATM = 0x1f AF_NDRV = 0x1b AF_NETBIOS = 0x21 @@ -49,6 +50,7 @@ const ( AF_UNIX = 0x1 AF_UNSPEC = 0x0 AF_UTUN = 0x26 + AF_VSOCK = 0x28 ALTWERASE = 0x200 ATTR_BIT_MAP_COUNT = 0x5 ATTR_CMN_ACCESSMASK = 0x20000 @@ -83,7 +85,7 @@ const ( ATTR_CMN_PAROBJID = 0x80 ATTR_CMN_RETURNED_ATTRS = 0x80000000 ATTR_CMN_SCRIPT = 0x100 - ATTR_CMN_SETMASK = 0x41c7ff00 + ATTR_CMN_SETMASK = 0x51c7ff00 ATTR_CMN_USERACCESS = 0x200000 ATTR_CMN_UUID = 0x800000 ATTR_CMN_VALIDMASK = 0xffffffff @@ -357,7 +359,7 @@ const ( DLT_LINUX_SLL = 0x71 DLT_LOOP = 0x6c DLT_LTALK = 0x72 - DLT_MATCHING_MAX = 0xf5 + DLT_MATCHING_MAX = 0x10a DLT_MATCHING_MIN = 0x68 DLT_MFR = 0xb6 DLT_MOST = 0xd3 @@ -398,6 +400,7 @@ const ( DLT_SYMANTEC_FIREWALL = 0x63 DLT_TZSP = 0x80 DLT_USB = 0xba + DLT_USB_DARWIN = 0x10a DLT_USB_LINUX = 0xbd DLT_USB_LINUX_MMAPPED = 0xdc DLT_USER0 = 0x93 @@ -442,8 +445,8 @@ const ( EVFILT_PROC = -0x5 EVFILT_READ = -0x1 EVFILT_SIGNAL = -0x6 - EVFILT_SYSCOUNT = 0xf - EVFILT_THREADMARKER = 0xf + EVFILT_SYSCOUNT = 0x11 + EVFILT_THREADMARKER = 0x11 EVFILT_TIMER = -0x7 EVFILT_USER = -0xa EVFILT_VM = -0xc @@ -481,9 +484,12 @@ const ( FSOPT_NOINMEMUPDATE = 0x2 FSOPT_PACK_INVAL_ATTRS = 0x8 FSOPT_REPORT_FULLSIZE = 0x4 + FSOPT_RETURN_REALDEV = 0x200 F_ADDFILESIGS = 0x3d F_ADDFILESIGS_FOR_DYLD_SIM = 0x53 + F_ADDFILESIGS_INFO = 0x67 F_ADDFILESIGS_RETURN = 0x61 + F_ADDFILESUPPL = 0x68 F_ADDSIGS = 0x3b F_ALLOCATEALL = 0x4 F_ALLOCATECONTIG = 0x2 @@ -505,8 +511,10 @@ const ( F_GETOWN = 0x5 F_GETPATH = 0x32 F_GETPATH_MTMINFO = 0x47 + F_GETPATH_NOFIRMLINK = 0x66 F_GETPROTECTIONCLASS = 0x3f F_GETPROTECTIONLEVEL = 0x4d + F_GETSIGSINFO = 0x69 F_GLOBAL_NOCACHE = 0x37 F_LOG2PHYS = 0x31 F_LOG2PHYS_EXT = 0x41 @@ -531,6 +539,7 @@ const ( F_SETPROTECTIONCLASS = 0x40 F_SETSIZE = 0x2b F_SINGLE_WRITER = 0x4c + F_SPECULATIVE_READ = 0x65 F_THAW_FS = 0x36 F_TRANSCODEKEY = 0x4b F_TRIM_ACTIVE_FILE = 0x64 @@ -562,6 +571,7 @@ const ( IFF_UP = 0x1 IFNAMSIZ = 0x10 IFT_1822 = 0x2 + IFT_6LOWPAN = 0x40 IFT_AAL5 = 0x31 IFT_ARCNET = 0x23 IFT_ARCNETPLUS = 0x24 @@ -766,6 +776,9 @@ const ( IPV6_2292PKTINFO = 0x13 IPV6_2292PKTOPTIONS = 0x19 IPV6_2292RTHDR = 0x18 + IPV6_ADDR_MC_FLAGS_PREFIX = 0x20 + IPV6_ADDR_MC_FLAGS_TRANSIENT = 0x10 + IPV6_ADDR_MC_FLAGS_UNICAST_BASED = 0x30 IPV6_BINDV6ONLY = 0x1b IPV6_BOUND_IF = 0x7d IPV6_CHECKSUM = 0x1a @@ -775,7 +788,7 @@ const ( IPV6_FAITH = 0x1d IPV6_FLOWINFO_MASK = 0xffffff0f IPV6_FLOWLABEL_MASK = 0xffff0f00 - IPV6_FLOW_ECN_MASK = 0x300 + IPV6_FLOW_ECN_MASK = 0x3000 IPV6_FRAGTTL = 0x3c IPV6_FW_ADD = 0x1e IPV6_FW_DEL = 0x1f @@ -818,6 +831,7 @@ const ( IP_DEFAULT_MULTICAST_LOOP = 0x1 IP_DEFAULT_MULTICAST_TTL = 0x1 IP_DF = 0x4000 + IP_DONTFRAG = 0x1c IP_DROP_MEMBERSHIP = 0xd IP_DROP_SOURCE_MEMBERSHIP = 0x47 IP_DUMMYNET_CONFIGURE = 0x3c @@ -889,6 +903,12 @@ const ( KERN_OSRELEASE = 0x2 KERN_OSTYPE = 0x1 KERN_VERSION = 0x4 + LOCAL_PEERCRED = 0x1 + LOCAL_PEEREPID = 0x3 + LOCAL_PEEREUUID = 0x5 + LOCAL_PEERPID = 0x2 + LOCAL_PEERTOKEN = 0x6 + LOCAL_PEERUUID = 0x4 LOCK_EX = 0x2 LOCK_NB = 0x4 LOCK_SH = 0x1 @@ -904,6 +924,7 @@ const ( MADV_SEQUENTIAL = 0x2 MADV_WILLNEED = 0x3 MADV_ZERO_WIRED_PAGES = 0x6 + MAP_32BIT = 0x8000 MAP_ANON = 0x1000 MAP_ANONYMOUS = 0x1000 MAP_COPY = 0x2 @@ -920,6 +941,17 @@ const ( MAP_RESILIENT_CODESIGN = 0x2000 MAP_RESILIENT_MEDIA = 0x4000 MAP_SHARED = 0x1 + MAP_TRANSLATED_ALLOW_EXECUTE = 0x20000 + MAP_UNIX03 = 0x40000 + MCAST_BLOCK_SOURCE = 0x54 + MCAST_EXCLUDE = 0x2 + MCAST_INCLUDE = 0x1 + MCAST_JOIN_GROUP = 0x50 + MCAST_JOIN_SOURCE_GROUP = 0x52 + MCAST_LEAVE_GROUP = 0x51 + MCAST_LEAVE_SOURCE_GROUP = 0x53 + MCAST_UNBLOCK_SOURCE = 0x55 + MCAST_UNDEFINED = 0x0 MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 MNT_ASYNC = 0x40 @@ -931,6 +963,7 @@ const ( MNT_DOVOLFS = 0x8000 MNT_DWAIT = 0x4 MNT_EXPORTED = 0x100 + MNT_EXT_ROOT_DATA_VOL = 0x1 MNT_FORCE = 0x80000 MNT_IGNORE_OWNERSHIP = 0x200000 MNT_JOURNALED = 0x800000 @@ -947,12 +980,15 @@ const ( MNT_QUOTA = 0x2000 MNT_RDONLY = 0x1 MNT_RELOAD = 0x40000 + MNT_REMOVABLE = 0x200 MNT_ROOTFS = 0x4000 + MNT_SNAPSHOT = 0x40000000 + MNT_STRICTATIME = 0x80000000 MNT_SYNCHRONOUS = 0x2 MNT_UNION = 0x20 MNT_UNKNOWNPERMISSIONS = 0x200000 MNT_UPDATE = 0x10000 - MNT_VISFLAGMASK = 0x17f0f5ff + MNT_VISFLAGMASK = 0xd7f0f7ff MNT_WAIT = 0x1 MSG_CTRUNC = 0x20 MSG_DONTROUTE = 0x4 @@ -963,6 +999,7 @@ const ( MSG_HAVEMORE = 0x2000 MSG_HOLD = 0x800 MSG_NEEDSA = 0x10000 + MSG_NOSIGNAL = 0x80000 MSG_OOB = 0x1 MSG_PEEK = 0x2 MSG_RCVMORE = 0x4000 @@ -979,9 +1016,10 @@ const ( NET_RT_DUMP = 0x1 NET_RT_DUMP2 = 0x7 NET_RT_FLAGS = 0x2 + NET_RT_FLAGS_PRIV = 0xa NET_RT_IFLIST = 0x3 NET_RT_IFLIST2 = 0x6 - NET_RT_MAXID = 0xa + NET_RT_MAXID = 0xb NET_RT_STAT = 0x4 NET_RT_TRASH = 0x5 NFDBITS = 0x20 @@ -1019,6 +1057,7 @@ const ( NOTE_LEEWAY = 0x10 NOTE_LINK = 0x10 NOTE_LOWAT = 0x1 + NOTE_MACHTIME = 0x100 NOTE_MACH_CONTINUOUS_TIME = 0x80 NOTE_NONE = 0x80 NOTE_NSECONDS = 0x4 @@ -1065,6 +1104,7 @@ const ( O_NDELAY = 0x4 O_NOCTTY = 0x20000 O_NOFOLLOW = 0x100 + O_NOFOLLOW_ANY = 0x20000000 O_NONBLOCK = 0x4 O_POPUP = 0x80000000 O_RDONLY = 0x0 @@ -1136,6 +1176,7 @@ const ( RTF_BROADCAST = 0x400000 RTF_CLONING = 0x100 RTF_CONDEMNED = 0x2000000 + RTF_DEAD = 0x20000000 RTF_DELCLONE = 0x80 RTF_DONE = 0x40 RTF_DYNAMIC = 0x10 @@ -1143,6 +1184,7 @@ const ( RTF_HOST = 0x4 RTF_IFREF = 0x4000000 RTF_IFSCOPE = 0x1000000 + RTF_LLDATA = 0x400 RTF_LLINFO = 0x400 RTF_LOCAL = 0x200000 RTF_MODIFIED = 0x20 @@ -1210,6 +1252,7 @@ const ( SIOCGDRVSPEC = 0xc028697b SIOCGETVLAN = 0xc020697f SIOCGHIWAT = 0x40047301 + SIOCGIF6LOWPAN = 0xc02069c5 SIOCGIFADDR = 0xc0206921 SIOCGIFALTMTU = 0xc0206948 SIOCGIFASYNCMAP = 0xc020697c @@ -1220,6 +1263,7 @@ const ( SIOCGIFDEVMTU = 0xc0206944 SIOCGIFDSTADDR = 0xc0206922 SIOCGIFFLAGS = 0xc0206911 + SIOCGIFFUNCTIONALTYPE = 0xc02069ad SIOCGIFGENERIC = 0xc020693a SIOCGIFKPI = 0xc0206987 SIOCGIFMAC = 0xc0206982 @@ -1233,6 +1277,7 @@ const ( SIOCGIFSTATUS = 0xc331693d SIOCGIFVLAN = 0xc020697f SIOCGIFWAKEFLAGS = 0xc0206988 + SIOCGIFXMEDIA = 0xc02c6948 SIOCGLOWAT = 0x40047303 SIOCGPGRP = 0x40047309 SIOCIFCREATE = 0xc0206978 @@ -1243,6 +1288,7 @@ const ( SIOCSDRVSPEC = 0x8028697b SIOCSETVLAN = 0x8020697e SIOCSHIWAT = 0x80047300 + SIOCSIF6LOWPAN = 0x802069c4 SIOCSIFADDR = 0x8020690c SIOCSIFALTMTU = 0x80206945 SIOCSIFASYNCMAP = 0x8020697d @@ -1270,6 +1316,7 @@ const ( SOCK_RDM = 0x4 SOCK_SEQPACKET = 0x5 SOCK_STREAM = 0x1 + SOL_LOCAL = 0x0 SOL_SOCKET = 0xffff SOMAXCONN = 0x80 SO_ACCEPTCONN = 0x2 diff --git a/vendor/golang.org/x/sys/unix/zerrors_darwin_arm.go b/vendor/golang.org/x/sys/unix/zerrors_darwin_arm.go index 03feefbf8c92..e748cb110579 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_darwin_arm.go +++ b/vendor/golang.org/x/sys/unix/zerrors_darwin_arm.go @@ -1,6 +1,7 @@ // mkerrors.sh // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build arm && darwin // +build arm,darwin // Code generated by cmd/cgo -godefs; DO NOT EDIT. diff --git a/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go index b40fb1f69675..df26a19681e3 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go @@ -1,6 +1,7 @@ // mkerrors.sh -m64 // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build arm64 && darwin // +build arm64,darwin // Code generated by cmd/cgo -godefs; DO NOT EDIT. @@ -32,7 +33,7 @@ const ( AF_LAT = 0xe AF_LINK = 0x12 AF_LOCAL = 0x1 - AF_MAX = 0x28 + AF_MAX = 0x29 AF_NATM = 0x1f AF_NDRV = 0x1b AF_NETBIOS = 0x21 @@ -49,6 +50,7 @@ const ( AF_UNIX = 0x1 AF_UNSPEC = 0x0 AF_UTUN = 0x26 + AF_VSOCK = 0x28 ALTWERASE = 0x200 ATTR_BIT_MAP_COUNT = 0x5 ATTR_CMN_ACCESSMASK = 0x20000 @@ -83,7 +85,7 @@ const ( ATTR_CMN_PAROBJID = 0x80 ATTR_CMN_RETURNED_ATTRS = 0x80000000 ATTR_CMN_SCRIPT = 0x100 - ATTR_CMN_SETMASK = 0x41c7ff00 + ATTR_CMN_SETMASK = 0x51c7ff00 ATTR_CMN_USERACCESS = 0x200000 ATTR_CMN_UUID = 0x800000 ATTR_CMN_VALIDMASK = 0xffffffff @@ -357,7 +359,7 @@ const ( DLT_LINUX_SLL = 0x71 DLT_LOOP = 0x6c DLT_LTALK = 0x72 - DLT_MATCHING_MAX = 0xf5 + DLT_MATCHING_MAX = 0x10a DLT_MATCHING_MIN = 0x68 DLT_MFR = 0xb6 DLT_MOST = 0xd3 @@ -398,6 +400,7 @@ const ( DLT_SYMANTEC_FIREWALL = 0x63 DLT_TZSP = 0x80 DLT_USB = 0xba + DLT_USB_DARWIN = 0x10a DLT_USB_LINUX = 0xbd DLT_USB_LINUX_MMAPPED = 0xdc DLT_USER0 = 0x93 @@ -442,8 +445,8 @@ const ( EVFILT_PROC = -0x5 EVFILT_READ = -0x1 EVFILT_SIGNAL = -0x6 - EVFILT_SYSCOUNT = 0xf - EVFILT_THREADMARKER = 0xf + EVFILT_SYSCOUNT = 0x11 + EVFILT_THREADMARKER = 0x11 EVFILT_TIMER = -0x7 EVFILT_USER = -0xa EVFILT_VM = -0xc @@ -481,9 +484,12 @@ const ( FSOPT_NOINMEMUPDATE = 0x2 FSOPT_PACK_INVAL_ATTRS = 0x8 FSOPT_REPORT_FULLSIZE = 0x4 + FSOPT_RETURN_REALDEV = 0x200 F_ADDFILESIGS = 0x3d F_ADDFILESIGS_FOR_DYLD_SIM = 0x53 + F_ADDFILESIGS_INFO = 0x67 F_ADDFILESIGS_RETURN = 0x61 + F_ADDFILESUPPL = 0x68 F_ADDSIGS = 0x3b F_ALLOCATEALL = 0x4 F_ALLOCATECONTIG = 0x2 @@ -505,8 +511,10 @@ const ( F_GETOWN = 0x5 F_GETPATH = 0x32 F_GETPATH_MTMINFO = 0x47 + F_GETPATH_NOFIRMLINK = 0x66 F_GETPROTECTIONCLASS = 0x3f F_GETPROTECTIONLEVEL = 0x4d + F_GETSIGSINFO = 0x69 F_GLOBAL_NOCACHE = 0x37 F_LOG2PHYS = 0x31 F_LOG2PHYS_EXT = 0x41 @@ -531,6 +539,7 @@ const ( F_SETPROTECTIONCLASS = 0x40 F_SETSIZE = 0x2b F_SINGLE_WRITER = 0x4c + F_SPECULATIVE_READ = 0x65 F_THAW_FS = 0x36 F_TRANSCODEKEY = 0x4b F_TRIM_ACTIVE_FILE = 0x64 @@ -562,6 +571,7 @@ const ( IFF_UP = 0x1 IFNAMSIZ = 0x10 IFT_1822 = 0x2 + IFT_6LOWPAN = 0x40 IFT_AAL5 = 0x31 IFT_ARCNET = 0x23 IFT_ARCNETPLUS = 0x24 @@ -766,6 +776,9 @@ const ( IPV6_2292PKTINFO = 0x13 IPV6_2292PKTOPTIONS = 0x19 IPV6_2292RTHDR = 0x18 + IPV6_ADDR_MC_FLAGS_PREFIX = 0x20 + IPV6_ADDR_MC_FLAGS_TRANSIENT = 0x10 + IPV6_ADDR_MC_FLAGS_UNICAST_BASED = 0x30 IPV6_BINDV6ONLY = 0x1b IPV6_BOUND_IF = 0x7d IPV6_CHECKSUM = 0x1a @@ -775,7 +788,7 @@ const ( IPV6_FAITH = 0x1d IPV6_FLOWINFO_MASK = 0xffffff0f IPV6_FLOWLABEL_MASK = 0xffff0f00 - IPV6_FLOW_ECN_MASK = 0x300 + IPV6_FLOW_ECN_MASK = 0x3000 IPV6_FRAGTTL = 0x3c IPV6_FW_ADD = 0x1e IPV6_FW_DEL = 0x1f @@ -818,6 +831,7 @@ const ( IP_DEFAULT_MULTICAST_LOOP = 0x1 IP_DEFAULT_MULTICAST_TTL = 0x1 IP_DF = 0x4000 + IP_DONTFRAG = 0x1c IP_DROP_MEMBERSHIP = 0xd IP_DROP_SOURCE_MEMBERSHIP = 0x47 IP_DUMMYNET_CONFIGURE = 0x3c @@ -889,6 +903,12 @@ const ( KERN_OSRELEASE = 0x2 KERN_OSTYPE = 0x1 KERN_VERSION = 0x4 + LOCAL_PEERCRED = 0x1 + LOCAL_PEEREPID = 0x3 + LOCAL_PEEREUUID = 0x5 + LOCAL_PEERPID = 0x2 + LOCAL_PEERTOKEN = 0x6 + LOCAL_PEERUUID = 0x4 LOCK_EX = 0x2 LOCK_NB = 0x4 LOCK_SH = 0x1 @@ -904,6 +924,7 @@ const ( MADV_SEQUENTIAL = 0x2 MADV_WILLNEED = 0x3 MADV_ZERO_WIRED_PAGES = 0x6 + MAP_32BIT = 0x8000 MAP_ANON = 0x1000 MAP_ANONYMOUS = 0x1000 MAP_COPY = 0x2 @@ -920,6 +941,17 @@ const ( MAP_RESILIENT_CODESIGN = 0x2000 MAP_RESILIENT_MEDIA = 0x4000 MAP_SHARED = 0x1 + MAP_TRANSLATED_ALLOW_EXECUTE = 0x20000 + MAP_UNIX03 = 0x40000 + MCAST_BLOCK_SOURCE = 0x54 + MCAST_EXCLUDE = 0x2 + MCAST_INCLUDE = 0x1 + MCAST_JOIN_GROUP = 0x50 + MCAST_JOIN_SOURCE_GROUP = 0x52 + MCAST_LEAVE_GROUP = 0x51 + MCAST_LEAVE_SOURCE_GROUP = 0x53 + MCAST_UNBLOCK_SOURCE = 0x55 + MCAST_UNDEFINED = 0x0 MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 MNT_ASYNC = 0x40 @@ -931,6 +963,7 @@ const ( MNT_DOVOLFS = 0x8000 MNT_DWAIT = 0x4 MNT_EXPORTED = 0x100 + MNT_EXT_ROOT_DATA_VOL = 0x1 MNT_FORCE = 0x80000 MNT_IGNORE_OWNERSHIP = 0x200000 MNT_JOURNALED = 0x800000 @@ -947,12 +980,15 @@ const ( MNT_QUOTA = 0x2000 MNT_RDONLY = 0x1 MNT_RELOAD = 0x40000 + MNT_REMOVABLE = 0x200 MNT_ROOTFS = 0x4000 + MNT_SNAPSHOT = 0x40000000 + MNT_STRICTATIME = 0x80000000 MNT_SYNCHRONOUS = 0x2 MNT_UNION = 0x20 MNT_UNKNOWNPERMISSIONS = 0x200000 MNT_UPDATE = 0x10000 - MNT_VISFLAGMASK = 0x17f0f5ff + MNT_VISFLAGMASK = 0xd7f0f7ff MNT_WAIT = 0x1 MSG_CTRUNC = 0x20 MSG_DONTROUTE = 0x4 @@ -963,6 +999,7 @@ const ( MSG_HAVEMORE = 0x2000 MSG_HOLD = 0x800 MSG_NEEDSA = 0x10000 + MSG_NOSIGNAL = 0x80000 MSG_OOB = 0x1 MSG_PEEK = 0x2 MSG_RCVMORE = 0x4000 @@ -979,9 +1016,10 @@ const ( NET_RT_DUMP = 0x1 NET_RT_DUMP2 = 0x7 NET_RT_FLAGS = 0x2 + NET_RT_FLAGS_PRIV = 0xa NET_RT_IFLIST = 0x3 NET_RT_IFLIST2 = 0x6 - NET_RT_MAXID = 0xa + NET_RT_MAXID = 0xb NET_RT_STAT = 0x4 NET_RT_TRASH = 0x5 NFDBITS = 0x20 @@ -1019,6 +1057,7 @@ const ( NOTE_LEEWAY = 0x10 NOTE_LINK = 0x10 NOTE_LOWAT = 0x1 + NOTE_MACHTIME = 0x100 NOTE_MACH_CONTINUOUS_TIME = 0x80 NOTE_NONE = 0x80 NOTE_NSECONDS = 0x4 @@ -1065,6 +1104,7 @@ const ( O_NDELAY = 0x4 O_NOCTTY = 0x20000 O_NOFOLLOW = 0x100 + O_NOFOLLOW_ANY = 0x20000000 O_NONBLOCK = 0x4 O_POPUP = 0x80000000 O_RDONLY = 0x0 @@ -1136,6 +1176,7 @@ const ( RTF_BROADCAST = 0x400000 RTF_CLONING = 0x100 RTF_CONDEMNED = 0x2000000 + RTF_DEAD = 0x20000000 RTF_DELCLONE = 0x80 RTF_DONE = 0x40 RTF_DYNAMIC = 0x10 @@ -1143,6 +1184,7 @@ const ( RTF_HOST = 0x4 RTF_IFREF = 0x4000000 RTF_IFSCOPE = 0x1000000 + RTF_LLDATA = 0x400 RTF_LLINFO = 0x400 RTF_LOCAL = 0x200000 RTF_MODIFIED = 0x20 @@ -1210,6 +1252,7 @@ const ( SIOCGDRVSPEC = 0xc028697b SIOCGETVLAN = 0xc020697f SIOCGHIWAT = 0x40047301 + SIOCGIF6LOWPAN = 0xc02069c5 SIOCGIFADDR = 0xc0206921 SIOCGIFALTMTU = 0xc0206948 SIOCGIFASYNCMAP = 0xc020697c @@ -1220,6 +1263,7 @@ const ( SIOCGIFDEVMTU = 0xc0206944 SIOCGIFDSTADDR = 0xc0206922 SIOCGIFFLAGS = 0xc0206911 + SIOCGIFFUNCTIONALTYPE = 0xc02069ad SIOCGIFGENERIC = 0xc020693a SIOCGIFKPI = 0xc0206987 SIOCGIFMAC = 0xc0206982 @@ -1233,6 +1277,7 @@ const ( SIOCGIFSTATUS = 0xc331693d SIOCGIFVLAN = 0xc020697f SIOCGIFWAKEFLAGS = 0xc0206988 + SIOCGIFXMEDIA = 0xc02c6948 SIOCGLOWAT = 0x40047303 SIOCGPGRP = 0x40047309 SIOCIFCREATE = 0xc0206978 @@ -1243,6 +1288,7 @@ const ( SIOCSDRVSPEC = 0x8028697b SIOCSETVLAN = 0x8020697e SIOCSHIWAT = 0x80047300 + SIOCSIF6LOWPAN = 0x802069c4 SIOCSIFADDR = 0x8020690c SIOCSIFALTMTU = 0x80206945 SIOCSIFASYNCMAP = 0x8020697d @@ -1270,6 +1316,7 @@ const ( SOCK_RDM = 0x4 SOCK_SEQPACKET = 0x5 SOCK_STREAM = 0x1 + SOL_LOCAL = 0x0 SOL_SOCKET = 0xffff SOMAXCONN = 0x80 SO_ACCEPTCONN = 0x2 diff --git a/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go index f5e91b7abaaa..17bba0e44f9e 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go @@ -1,6 +1,7 @@ // mkerrors.sh -m64 // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build amd64 && dragonfly // +build amd64,dragonfly // Code generated by cmd/cgo -godefs; DO NOT EDIT. diff --git a/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go b/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go index 3689c8084819..9c7c5e165464 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go @@ -1,6 +1,7 @@ // mkerrors.sh -m32 // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build 386 && freebsd // +build 386,freebsd // Code generated by cmd/cgo -godefs; DO NOT EDIT. @@ -997,6 +998,11 @@ const ( KERN_OSRELEASE = 0x2 KERN_OSTYPE = 0x1 KERN_VERSION = 0x4 + LOCAL_CONNWAIT = 0x4 + LOCAL_CREDS = 0x2 + LOCAL_CREDS_PERSISTENT = 0x3 + LOCAL_PEERCRED = 0x1 + LOCAL_VENDOR = 0x80000000 LOCK_EX = 0x2 LOCK_NB = 0x4 LOCK_SH = 0x1 @@ -1375,6 +1381,7 @@ const ( SOCK_RDM = 0x4 SOCK_SEQPACKET = 0x5 SOCK_STREAM = 0x1 + SOL_LOCAL = 0x0 SOL_SOCKET = 0xffff SOMAXCONN = 0x80 SO_ACCEPTCONN = 0x2 diff --git a/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go index b8f7c3c930aa..b265abb25f89 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go @@ -1,6 +1,7 @@ // mkerrors.sh -m64 // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build amd64 && freebsd // +build amd64,freebsd // Code generated by cmd/cgo -godefs; DO NOT EDIT. @@ -997,6 +998,11 @@ const ( KERN_OSRELEASE = 0x2 KERN_OSTYPE = 0x1 KERN_VERSION = 0x4 + LOCAL_CONNWAIT = 0x4 + LOCAL_CREDS = 0x2 + LOCAL_CREDS_PERSISTENT = 0x3 + LOCAL_PEERCRED = 0x1 + LOCAL_VENDOR = 0x80000000 LOCK_EX = 0x2 LOCK_NB = 0x4 LOCK_SH = 0x1 @@ -1376,6 +1382,7 @@ const ( SOCK_RDM = 0x4 SOCK_SEQPACKET = 0x5 SOCK_STREAM = 0x1 + SOL_LOCAL = 0x0 SOL_SOCKET = 0xffff SOMAXCONN = 0x80 SO_ACCEPTCONN = 0x2 diff --git a/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go b/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go index be14bb1a4cdc..0326a6b3af97 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go @@ -1,6 +1,7 @@ // mkerrors.sh // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build arm && freebsd // +build arm,freebsd // Code generated by cmd/cgo -godefs; DO NOT EDIT. @@ -980,6 +981,11 @@ const ( KERN_OSRELEASE = 0x2 KERN_OSTYPE = 0x1 KERN_VERSION = 0x4 + LOCAL_CONNWAIT = 0x4 + LOCAL_CREDS = 0x2 + LOCAL_CREDS_PERSISTENT = 0x3 + LOCAL_PEERCRED = 0x1 + LOCAL_VENDOR = 0x80000000 LOCK_EX = 0x2 LOCK_NB = 0x4 LOCK_SH = 0x1 @@ -1341,6 +1347,7 @@ const ( SOCK_RDM = 0x4 SOCK_SEQPACKET = 0x5 SOCK_STREAM = 0x1 + SOL_LOCAL = 0x0 SOL_SOCKET = 0xffff SOMAXCONN = 0x80 SO_ACCEPTCONN = 0x2 diff --git a/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm64.go index 7ce9c0081a8c..218d39906da6 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm64.go @@ -1,6 +1,7 @@ // mkerrors.sh -m64 // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build arm64 && freebsd // +build arm64,freebsd // Code generated by cmd/cgo -godefs; DO NOT EDIT. @@ -997,6 +998,11 @@ const ( KERN_OSRELEASE = 0x2 KERN_OSTYPE = 0x1 KERN_VERSION = 0x4 + LOCAL_CONNWAIT = 0x4 + LOCAL_CREDS = 0x2 + LOCAL_CREDS_PERSISTENT = 0x3 + LOCAL_PEERCRED = 0x1 + LOCAL_VENDOR = 0x80000000 LOCK_EX = 0x2 LOCK_NB = 0x4 LOCK_SH = 0x1 @@ -1376,6 +1382,7 @@ const ( SOCK_RDM = 0x4 SOCK_SEQPACKET = 0x5 SOCK_STREAM = 0x1 + SOL_LOCAL = 0x0 SOL_SOCKET = 0xffff SOMAXCONN = 0x80 SO_ACCEPTCONN = 0x2 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux.go b/vendor/golang.org/x/sys/unix/zerrors_linux.go index b3463a8b5a54..504dd6cd2d02 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux.go @@ -1,5 +1,6 @@ // Code generated by mkmerge.go; DO NOT EDIT. +//go:build linux // +build linux package unix @@ -244,6 +245,10 @@ const ( BS0 = 0x0 BTRFS_SUPER_MAGIC = 0x9123683e BTRFS_TEST_MAGIC = 0x73727279 + BUS_BLUETOOTH = 0x5 + BUS_HIL = 0x4 + BUS_USB = 0x3 + BUS_VIRTUAL = 0x6 CAN_BCM = 0x2 CAN_EFF_FLAG = 0x80000000 CAN_EFF_ID_BITS = 0x1d @@ -313,6 +318,7 @@ const ( CAN_J1939 = 0x7 CAN_MAX_DLC = 0x8 CAN_MAX_DLEN = 0x8 + CAN_MAX_RAW_DLC = 0xf CAN_MCNET = 0x5 CAN_MTU = 0x10 CAN_NPROTO = 0x8 @@ -664,6 +670,7 @@ const ( ETH_P_CAIF = 0xf7 ETH_P_CAN = 0xc ETH_P_CANFD = 0xd + ETH_P_CFM = 0x8902 ETH_P_CONTROL = 0x16 ETH_P_CUST = 0x6006 ETH_P_DDCMP = 0x6 @@ -834,7 +841,6 @@ const ( FSCRYPT_POLICY_FLAGS_PAD_4 = 0x0 FSCRYPT_POLICY_FLAGS_PAD_8 = 0x1 FSCRYPT_POLICY_FLAGS_PAD_MASK = 0x3 - FSCRYPT_POLICY_FLAGS_VALID = 0x1f FSCRYPT_POLICY_FLAG_DIRECT_KEY = 0x4 FSCRYPT_POLICY_FLAG_IV_INO_LBLK_32 = 0x10 FSCRYPT_POLICY_FLAG_IV_INO_LBLK_64 = 0x8 @@ -865,7 +871,7 @@ const ( FS_POLICY_FLAGS_PAD_4 = 0x0 FS_POLICY_FLAGS_PAD_8 = 0x1 FS_POLICY_FLAGS_PAD_MASK = 0x3 - FS_POLICY_FLAGS_VALID = 0x1f + FS_POLICY_FLAGS_VALID = 0x7 FS_VERITY_FL = 0x100000 FS_VERITY_HASH_ALG_SHA256 = 0x1 FS_VERITY_HASH_ALG_SHA512 = 0x2 @@ -962,6 +968,7 @@ const ( HDIO_SET_XFER = 0x306 HDIO_TRISTATE_HWIF = 0x31b HDIO_UNREGISTER_HWIF = 0x32a + HID_MAX_DESCRIPTOR_SIZE = 0x1000 HOSTFS_SUPER_MAGIC = 0xc0ffee HPFS_SUPER_MAGIC = 0xf995e849 HUGETLBFS_MAGIC = 0x958458f6 @@ -1138,6 +1145,7 @@ const ( IPV6_PMTUDISC_WANT = 0x1 IPV6_RECVDSTOPTS = 0x3a IPV6_RECVERR = 0x19 + IPV6_RECVERR_RFC4884 = 0x1f IPV6_RECVFRAGSIZE = 0x4d IPV6_RECVHOPLIMIT = 0x33 IPV6_RECVHOPOPTS = 0x35 @@ -1202,6 +1210,7 @@ const ( IP_PMTUDISC_PROBE = 0x3 IP_PMTUDISC_WANT = 0x1 IP_RECVERR = 0xb + IP_RECVERR_RFC4884 = 0x1a IP_RECVFRAGSIZE = 0x19 IP_RECVOPTS = 0x6 IP_RECVORIGDSTADDR = 0x14 @@ -1840,6 +1849,7 @@ const ( PR_SET_SECCOMP = 0x16 PR_SET_SECUREBITS = 0x1c PR_SET_SPECULATION_CTRL = 0x35 + PR_SET_SYSCALL_USER_DISPATCH = 0x3b PR_SET_TAGGED_ADDR_CTRL = 0x37 PR_SET_THP_DISABLE = 0x29 PR_SET_TIMERSLACK = 0x1d @@ -1859,6 +1869,8 @@ const ( PR_SVE_SET_VL_ONEXEC = 0x40000 PR_SVE_VL_INHERIT = 0x20000 PR_SVE_VL_LEN_MASK = 0xffff + PR_SYS_DISPATCH_OFF = 0x0 + PR_SYS_DISPATCH_ON = 0x1 PR_TAGGED_ADDR_ENABLE = 0x1 PR_TASK_PERF_EVENTS_DISABLE = 0x1f PR_TASK_PERF_EVENTS_ENABLE = 0x20 @@ -2104,12 +2116,13 @@ const ( RTM_SETLINK = 0x13 RTM_SETNEIGHTBL = 0x43 RTNH_ALIGNTO = 0x4 - RTNH_COMPARE_MASK = 0x19 + RTNH_COMPARE_MASK = 0x59 RTNH_F_DEAD = 0x1 RTNH_F_LINKDOWN = 0x10 RTNH_F_OFFLOAD = 0x8 RTNH_F_ONLINK = 0x4 RTNH_F_PERVASIVE = 0x2 + RTNH_F_TRAP = 0x40 RTNH_F_UNRESOLVED = 0x20 RTN_MAX = 0xb RTPROT_BABEL = 0x2a @@ -2580,6 +2593,7 @@ const ( VMADDR_CID_HOST = 0x2 VMADDR_CID_HYPERVISOR = 0x0 VMADDR_CID_LOCAL = 0x1 + VMADDR_FLAG_TO_HOST = 0x1 VMADDR_PORT_ANY = 0xffffffff VM_SOCKETS_INVALID_VERSION = 0xffffffff VQUIT = 0x1 @@ -2727,6 +2741,9 @@ const ( Z3FOLD_MAGIC = 0x33 ZONEFS_MAGIC = 0x5a4f4653 ZSMALLOC_MAGIC = 0x58295829 + _HIDIOCGRAWNAME_LEN = 0x80 + _HIDIOCGRAWPHYS_LEN = 0x40 + _HIDIOCGRAWUNIQ_LEN = 0x40 ) // Errors diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go index 336e0b326a91..e91a1a95792b 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go @@ -1,6 +1,7 @@ // mkerrors.sh -Wall -Werror -static -I/tmp/include -m32 // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build 386 && linux // +build 386,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. @@ -93,6 +94,9 @@ const ( F_SETOWN = 0x8 F_UNLCK = 0x2 F_WRLCK = 0x1 + HIDIOCGRAWINFO = 0x80084803 + HIDIOCGRDESC = 0x90044802 + HIDIOCGRDESCSIZE = 0x80044801 HUPCL = 0x400 ICANON = 0x2 IEXTEN = 0x8000 @@ -165,6 +169,7 @@ const ( PERF_EVENT_IOC_SET_OUTPUT = 0x2405 PPPIOCATTACH = 0x4004743d PPPIOCATTCHAN = 0x40047438 + PPPIOCBRIDGECHAN = 0x40047435 PPPIOCCONNECT = 0x4004743a PPPIOCDETACH = 0x4004743c PPPIOCDISCONN = 0x7439 @@ -192,6 +197,7 @@ const ( PPPIOCSPASS = 0x40087447 PPPIOCSRASYNCMAP = 0x40047454 PPPIOCSXASYNCMAP = 0x4020744f + PPPIOCUNBRIDGECHAN = 0x7434 PPPIOCXFERUNIT = 0x744e PR_SET_PTRACER_ANY = 0xffffffff PTRACE_GETFPREGS = 0xe @@ -268,6 +274,7 @@ const ( SO_BROADCAST = 0x6 SO_BSDCOMPAT = 0xe SO_BUSY_POLL = 0x2e + SO_BUSY_POLL_BUDGET = 0x46 SO_CNX_ADVICE = 0x35 SO_COOKIE = 0x39 SO_DETACH_REUSEPORT_BPF = 0x44 @@ -290,6 +297,7 @@ const ( SO_PEERCRED = 0x11 SO_PEERGROUPS = 0x3b SO_PEERSEC = 0x1f + SO_PREFER_BUSY_POLL = 0x45 SO_PROTOCOL = 0x26 SO_RCVBUF = 0x8 SO_RCVBUFFORCE = 0x21 @@ -481,6 +489,9 @@ const ( X86_FXSR_MAGIC = 0x0 XCASE = 0x4 XTABS = 0x1800 + _HIDIOCGRAWNAME = 0x80804804 + _HIDIOCGRAWPHYS = 0x80404805 + _HIDIOCGRAWUNIQ = 0x80404808 ) // Errors diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go index 961507e937d4..a9cbac64439e 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go @@ -1,6 +1,7 @@ // mkerrors.sh -Wall -Werror -static -I/tmp/include -m64 // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build amd64 && linux // +build amd64,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. @@ -93,6 +94,9 @@ const ( F_SETOWN = 0x8 F_UNLCK = 0x2 F_WRLCK = 0x1 + HIDIOCGRAWINFO = 0x80084803 + HIDIOCGRDESC = 0x90044802 + HIDIOCGRDESCSIZE = 0x80044801 HUPCL = 0x400 ICANON = 0x2 IEXTEN = 0x8000 @@ -165,6 +169,7 @@ const ( PERF_EVENT_IOC_SET_OUTPUT = 0x2405 PPPIOCATTACH = 0x4004743d PPPIOCATTCHAN = 0x40047438 + PPPIOCBRIDGECHAN = 0x40047435 PPPIOCCONNECT = 0x4004743a PPPIOCDETACH = 0x4004743c PPPIOCDISCONN = 0x7439 @@ -192,6 +197,7 @@ const ( PPPIOCSPASS = 0x40107447 PPPIOCSRASYNCMAP = 0x40047454 PPPIOCSXASYNCMAP = 0x4020744f + PPPIOCUNBRIDGECHAN = 0x7434 PPPIOCXFERUNIT = 0x744e PR_SET_PTRACER_ANY = 0xffffffffffffffff PTRACE_ARCH_PRCTL = 0x1e @@ -269,6 +275,7 @@ const ( SO_BROADCAST = 0x6 SO_BSDCOMPAT = 0xe SO_BUSY_POLL = 0x2e + SO_BUSY_POLL_BUDGET = 0x46 SO_CNX_ADVICE = 0x35 SO_COOKIE = 0x39 SO_DETACH_REUSEPORT_BPF = 0x44 @@ -291,6 +298,7 @@ const ( SO_PEERCRED = 0x11 SO_PEERGROUPS = 0x3b SO_PEERSEC = 0x1f + SO_PREFER_BUSY_POLL = 0x45 SO_PROTOCOL = 0x26 SO_RCVBUF = 0x8 SO_RCVBUFFORCE = 0x21 @@ -481,6 +489,9 @@ const ( WORDSIZE = 0x40 XCASE = 0x4 XTABS = 0x1800 + _HIDIOCGRAWNAME = 0x80804804 + _HIDIOCGRAWPHYS = 0x80404805 + _HIDIOCGRAWUNIQ = 0x80404808 ) // Errors diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go index a65576db7b61..d74f3c15a1d8 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go @@ -1,6 +1,7 @@ // mkerrors.sh -Wall -Werror -static -I/tmp/include // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build arm && linux // +build arm,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. @@ -92,6 +93,9 @@ const ( F_SETOWN = 0x8 F_UNLCK = 0x2 F_WRLCK = 0x1 + HIDIOCGRAWINFO = 0x80084803 + HIDIOCGRDESC = 0x90044802 + HIDIOCGRDESCSIZE = 0x80044801 HUPCL = 0x400 ICANON = 0x2 IEXTEN = 0x8000 @@ -163,6 +167,7 @@ const ( PERF_EVENT_IOC_SET_OUTPUT = 0x2405 PPPIOCATTACH = 0x4004743d PPPIOCATTCHAN = 0x40047438 + PPPIOCBRIDGECHAN = 0x40047435 PPPIOCCONNECT = 0x4004743a PPPIOCDETACH = 0x4004743c PPPIOCDISCONN = 0x7439 @@ -190,6 +195,7 @@ const ( PPPIOCSPASS = 0x40087447 PPPIOCSRASYNCMAP = 0x40047454 PPPIOCSXASYNCMAP = 0x4020744f + PPPIOCUNBRIDGECHAN = 0x7434 PPPIOCXFERUNIT = 0x744e PR_SET_PTRACER_ANY = 0xffffffff PTRACE_GETCRUNCHREGS = 0x19 @@ -275,6 +281,7 @@ const ( SO_BROADCAST = 0x6 SO_BSDCOMPAT = 0xe SO_BUSY_POLL = 0x2e + SO_BUSY_POLL_BUDGET = 0x46 SO_CNX_ADVICE = 0x35 SO_COOKIE = 0x39 SO_DETACH_REUSEPORT_BPF = 0x44 @@ -297,6 +304,7 @@ const ( SO_PEERCRED = 0x11 SO_PEERGROUPS = 0x3b SO_PEERSEC = 0x1f + SO_PREFER_BUSY_POLL = 0x45 SO_PROTOCOL = 0x26 SO_RCVBUF = 0x8 SO_RCVBUFFORCE = 0x21 @@ -487,6 +495,9 @@ const ( WORDSIZE = 0x20 XCASE = 0x4 XTABS = 0x1800 + _HIDIOCGRAWNAME = 0x80804804 + _HIDIOCGRAWPHYS = 0x80404805 + _HIDIOCGRAWUNIQ = 0x80404808 ) // Errors diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go index cf075caa8c8f..e1538995b49d 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go @@ -1,6 +1,7 @@ // mkerrors.sh -Wall -Werror -static -I/tmp/include -fsigned-char // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build arm64 && linux // +build arm64,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. @@ -95,6 +96,9 @@ const ( F_SETOWN = 0x8 F_UNLCK = 0x2 F_WRLCK = 0x1 + HIDIOCGRAWINFO = 0x80084803 + HIDIOCGRDESC = 0x90044802 + HIDIOCGRDESCSIZE = 0x80044801 HUPCL = 0x400 ICANON = 0x2 IEXTEN = 0x8000 @@ -166,6 +170,7 @@ const ( PERF_EVENT_IOC_SET_OUTPUT = 0x2405 PPPIOCATTACH = 0x4004743d PPPIOCATTCHAN = 0x40047438 + PPPIOCBRIDGECHAN = 0x40047435 PPPIOCCONNECT = 0x4004743a PPPIOCDETACH = 0x4004743c PPPIOCDISCONN = 0x7439 @@ -193,8 +198,10 @@ const ( PPPIOCSPASS = 0x40107447 PPPIOCSRASYNCMAP = 0x40047454 PPPIOCSXASYNCMAP = 0x4020744f + PPPIOCUNBRIDGECHAN = 0x7434 PPPIOCXFERUNIT = 0x744e PROT_BTI = 0x10 + PROT_MTE = 0x20 PR_SET_PTRACER_ANY = 0xffffffffffffffff PTRACE_PEEKMTETAGS = 0x21 PTRACE_POKEMTETAGS = 0x22 @@ -264,6 +271,7 @@ const ( SO_BROADCAST = 0x6 SO_BSDCOMPAT = 0xe SO_BUSY_POLL = 0x2e + SO_BUSY_POLL_BUDGET = 0x46 SO_CNX_ADVICE = 0x35 SO_COOKIE = 0x39 SO_DETACH_REUSEPORT_BPF = 0x44 @@ -286,6 +294,7 @@ const ( SO_PEERCRED = 0x11 SO_PEERGROUPS = 0x3b SO_PEERSEC = 0x1f + SO_PREFER_BUSY_POLL = 0x45 SO_PROTOCOL = 0x26 SO_RCVBUF = 0x8 SO_RCVBUFFORCE = 0x21 @@ -477,6 +486,9 @@ const ( WORDSIZE = 0x40 XCASE = 0x4 XTABS = 0x1800 + _HIDIOCGRAWNAME = 0x80804804 + _HIDIOCGRAWPHYS = 0x80404805 + _HIDIOCGRAWUNIQ = 0x80404808 ) // Errors diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go index efe90deeab85..5e8e71ff8635 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go @@ -1,6 +1,7 @@ // mkerrors.sh -Wall -Werror -static -I/tmp/include // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build mips && linux // +build mips,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. @@ -92,6 +93,9 @@ const ( F_SETOWN = 0x18 F_UNLCK = 0x2 F_WRLCK = 0x1 + HIDIOCGRAWINFO = 0x40084803 + HIDIOCGRDESC = 0x50044802 + HIDIOCGRDESCSIZE = 0x40044801 HUPCL = 0x400 ICANON = 0x2 IEXTEN = 0x100 @@ -163,6 +167,7 @@ const ( PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 PPPIOCATTACH = 0x8004743d PPPIOCATTCHAN = 0x80047438 + PPPIOCBRIDGECHAN = 0x80047435 PPPIOCCONNECT = 0x8004743a PPPIOCDETACH = 0x8004743c PPPIOCDISCONN = 0x20007439 @@ -190,6 +195,7 @@ const ( PPPIOCSPASS = 0x80087447 PPPIOCSRASYNCMAP = 0x80047454 PPPIOCSXASYNCMAP = 0x8020744f + PPPIOCUNBRIDGECHAN = 0x20007434 PPPIOCXFERUNIT = 0x2000744e PR_SET_PTRACER_ANY = 0xffffffff PTRACE_GETFPREGS = 0xe @@ -268,6 +274,7 @@ const ( SO_BROADCAST = 0x20 SO_BSDCOMPAT = 0xe SO_BUSY_POLL = 0x2e + SO_BUSY_POLL_BUDGET = 0x46 SO_CNX_ADVICE = 0x35 SO_COOKIE = 0x39 SO_DETACH_REUSEPORT_BPF = 0x44 @@ -290,6 +297,7 @@ const ( SO_PEERCRED = 0x12 SO_PEERGROUPS = 0x3b SO_PEERSEC = 0x1e + SO_PREFER_BUSY_POLL = 0x45 SO_PROTOCOL = 0x1028 SO_RCVBUF = 0x1002 SO_RCVBUFFORCE = 0x21 @@ -483,6 +491,9 @@ const ( WORDSIZE = 0x20 XCASE = 0x4 XTABS = 0x1800 + _HIDIOCGRAWNAME = 0x40804804 + _HIDIOCGRAWPHYS = 0x40404805 + _HIDIOCGRAWUNIQ = 0x40404808 ) // Errors diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go index 8b0e8911dc3f..e670ee148140 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go @@ -1,6 +1,7 @@ // mkerrors.sh -Wall -Werror -static -I/tmp/include // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build mips64 && linux // +build mips64,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. @@ -92,6 +93,9 @@ const ( F_SETOWN = 0x18 F_UNLCK = 0x2 F_WRLCK = 0x1 + HIDIOCGRAWINFO = 0x40084803 + HIDIOCGRDESC = 0x50044802 + HIDIOCGRDESCSIZE = 0x40044801 HUPCL = 0x400 ICANON = 0x2 IEXTEN = 0x100 @@ -163,6 +167,7 @@ const ( PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 PPPIOCATTACH = 0x8004743d PPPIOCATTCHAN = 0x80047438 + PPPIOCBRIDGECHAN = 0x80047435 PPPIOCCONNECT = 0x8004743a PPPIOCDETACH = 0x8004743c PPPIOCDISCONN = 0x20007439 @@ -190,6 +195,7 @@ const ( PPPIOCSPASS = 0x80107447 PPPIOCSRASYNCMAP = 0x80047454 PPPIOCSXASYNCMAP = 0x8020744f + PPPIOCUNBRIDGECHAN = 0x20007434 PPPIOCXFERUNIT = 0x2000744e PR_SET_PTRACER_ANY = 0xffffffffffffffff PTRACE_GETFPREGS = 0xe @@ -268,6 +274,7 @@ const ( SO_BROADCAST = 0x20 SO_BSDCOMPAT = 0xe SO_BUSY_POLL = 0x2e + SO_BUSY_POLL_BUDGET = 0x46 SO_CNX_ADVICE = 0x35 SO_COOKIE = 0x39 SO_DETACH_REUSEPORT_BPF = 0x44 @@ -290,6 +297,7 @@ const ( SO_PEERCRED = 0x12 SO_PEERGROUPS = 0x3b SO_PEERSEC = 0x1e + SO_PREFER_BUSY_POLL = 0x45 SO_PROTOCOL = 0x1028 SO_RCVBUF = 0x1002 SO_RCVBUFFORCE = 0x21 @@ -483,6 +491,9 @@ const ( WORDSIZE = 0x40 XCASE = 0x4 XTABS = 0x1800 + _HIDIOCGRAWNAME = 0x40804804 + _HIDIOCGRAWPHYS = 0x40404805 + _HIDIOCGRAWUNIQ = 0x40404808 ) // Errors diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go index e9430cd1a22a..dd11eacb81e0 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go @@ -1,6 +1,7 @@ // mkerrors.sh -Wall -Werror -static -I/tmp/include // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build mips64le && linux // +build mips64le,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. @@ -92,6 +93,9 @@ const ( F_SETOWN = 0x18 F_UNLCK = 0x2 F_WRLCK = 0x1 + HIDIOCGRAWINFO = 0x40084803 + HIDIOCGRDESC = 0x50044802 + HIDIOCGRDESCSIZE = 0x40044801 HUPCL = 0x400 ICANON = 0x2 IEXTEN = 0x100 @@ -163,6 +167,7 @@ const ( PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 PPPIOCATTACH = 0x8004743d PPPIOCATTCHAN = 0x80047438 + PPPIOCBRIDGECHAN = 0x80047435 PPPIOCCONNECT = 0x8004743a PPPIOCDETACH = 0x8004743c PPPIOCDISCONN = 0x20007439 @@ -190,6 +195,7 @@ const ( PPPIOCSPASS = 0x80107447 PPPIOCSRASYNCMAP = 0x80047454 PPPIOCSXASYNCMAP = 0x8020744f + PPPIOCUNBRIDGECHAN = 0x20007434 PPPIOCXFERUNIT = 0x2000744e PR_SET_PTRACER_ANY = 0xffffffffffffffff PTRACE_GETFPREGS = 0xe @@ -268,6 +274,7 @@ const ( SO_BROADCAST = 0x20 SO_BSDCOMPAT = 0xe SO_BUSY_POLL = 0x2e + SO_BUSY_POLL_BUDGET = 0x46 SO_CNX_ADVICE = 0x35 SO_COOKIE = 0x39 SO_DETACH_REUSEPORT_BPF = 0x44 @@ -290,6 +297,7 @@ const ( SO_PEERCRED = 0x12 SO_PEERGROUPS = 0x3b SO_PEERSEC = 0x1e + SO_PREFER_BUSY_POLL = 0x45 SO_PROTOCOL = 0x1028 SO_RCVBUF = 0x1002 SO_RCVBUFFORCE = 0x21 @@ -483,6 +491,9 @@ const ( WORDSIZE = 0x40 XCASE = 0x4 XTABS = 0x1800 + _HIDIOCGRAWNAME = 0x40804804 + _HIDIOCGRAWPHYS = 0x40404805 + _HIDIOCGRAWUNIQ = 0x40404808 ) // Errors diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go index 61e4f5db67c1..a0a5b22ae93a 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go @@ -1,6 +1,7 @@ // mkerrors.sh -Wall -Werror -static -I/tmp/include // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build mipsle && linux // +build mipsle,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. @@ -92,6 +93,9 @@ const ( F_SETOWN = 0x18 F_UNLCK = 0x2 F_WRLCK = 0x1 + HIDIOCGRAWINFO = 0x40084803 + HIDIOCGRDESC = 0x50044802 + HIDIOCGRDESCSIZE = 0x40044801 HUPCL = 0x400 ICANON = 0x2 IEXTEN = 0x100 @@ -163,6 +167,7 @@ const ( PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 PPPIOCATTACH = 0x8004743d PPPIOCATTCHAN = 0x80047438 + PPPIOCBRIDGECHAN = 0x80047435 PPPIOCCONNECT = 0x8004743a PPPIOCDETACH = 0x8004743c PPPIOCDISCONN = 0x20007439 @@ -190,6 +195,7 @@ const ( PPPIOCSPASS = 0x80087447 PPPIOCSRASYNCMAP = 0x80047454 PPPIOCSXASYNCMAP = 0x8020744f + PPPIOCUNBRIDGECHAN = 0x20007434 PPPIOCXFERUNIT = 0x2000744e PR_SET_PTRACER_ANY = 0xffffffff PTRACE_GETFPREGS = 0xe @@ -268,6 +274,7 @@ const ( SO_BROADCAST = 0x20 SO_BSDCOMPAT = 0xe SO_BUSY_POLL = 0x2e + SO_BUSY_POLL_BUDGET = 0x46 SO_CNX_ADVICE = 0x35 SO_COOKIE = 0x39 SO_DETACH_REUSEPORT_BPF = 0x44 @@ -290,6 +297,7 @@ const ( SO_PEERCRED = 0x12 SO_PEERGROUPS = 0x3b SO_PEERSEC = 0x1e + SO_PREFER_BUSY_POLL = 0x45 SO_PROTOCOL = 0x1028 SO_RCVBUF = 0x1002 SO_RCVBUFFORCE = 0x21 @@ -483,6 +491,9 @@ const ( WORDSIZE = 0x20 XCASE = 0x4 XTABS = 0x1800 + _HIDIOCGRAWNAME = 0x40804804 + _HIDIOCGRAWPHYS = 0x40404805 + _HIDIOCGRAWUNIQ = 0x40404808 ) // Errors diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go index 973ad934633c..e60102f6a92a 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go @@ -1,6 +1,7 @@ // mkerrors.sh -Wall -Werror -static -I/tmp/include // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build ppc64 && linux // +build ppc64,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. @@ -92,6 +93,9 @@ const ( F_SETOWN = 0x8 F_UNLCK = 0x2 F_WRLCK = 0x1 + HIDIOCGRAWINFO = 0x40084803 + HIDIOCGRDESC = 0x50044802 + HIDIOCGRDESCSIZE = 0x40044801 HUPCL = 0x4000 ICANON = 0x100 IEXTEN = 0x400 @@ -165,6 +169,7 @@ const ( PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 PPPIOCATTACH = 0x8004743d PPPIOCATTCHAN = 0x80047438 + PPPIOCBRIDGECHAN = 0x80047435 PPPIOCCONNECT = 0x8004743a PPPIOCDETACH = 0x8004743c PPPIOCDISCONN = 0x20007439 @@ -192,6 +197,7 @@ const ( PPPIOCSPASS = 0x80107447 PPPIOCSRASYNCMAP = 0x80047454 PPPIOCSXASYNCMAP = 0x8020744f + PPPIOCUNBRIDGECHAN = 0x20007434 PPPIOCXFERUNIT = 0x2000744e PROT_SAO = 0x10 PR_SET_PTRACER_ANY = 0xffffffffffffffff @@ -327,6 +333,7 @@ const ( SO_BROADCAST = 0x6 SO_BSDCOMPAT = 0xe SO_BUSY_POLL = 0x2e + SO_BUSY_POLL_BUDGET = 0x46 SO_CNX_ADVICE = 0x35 SO_COOKIE = 0x39 SO_DETACH_REUSEPORT_BPF = 0x44 @@ -349,6 +356,7 @@ const ( SO_PEERCRED = 0x15 SO_PEERGROUPS = 0x3b SO_PEERSEC = 0x1f + SO_PREFER_BUSY_POLL = 0x45 SO_PROTOCOL = 0x26 SO_RCVBUF = 0x8 SO_RCVBUFFORCE = 0x21 @@ -543,6 +551,9 @@ const ( WORDSIZE = 0x40 XCASE = 0x4000 XTABS = 0xc00 + _HIDIOCGRAWNAME = 0x40804804 + _HIDIOCGRAWPHYS = 0x40404805 + _HIDIOCGRAWUNIQ = 0x40404808 ) // Errors diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go index 70a7406ba11a..838ff4ea6d06 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go @@ -1,6 +1,7 @@ // mkerrors.sh -Wall -Werror -static -I/tmp/include // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build ppc64le && linux // +build ppc64le,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. @@ -92,6 +93,9 @@ const ( F_SETOWN = 0x8 F_UNLCK = 0x2 F_WRLCK = 0x1 + HIDIOCGRAWINFO = 0x40084803 + HIDIOCGRDESC = 0x50044802 + HIDIOCGRDESCSIZE = 0x40044801 HUPCL = 0x4000 ICANON = 0x100 IEXTEN = 0x400 @@ -165,6 +169,7 @@ const ( PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 PPPIOCATTACH = 0x8004743d PPPIOCATTCHAN = 0x80047438 + PPPIOCBRIDGECHAN = 0x80047435 PPPIOCCONNECT = 0x8004743a PPPIOCDETACH = 0x8004743c PPPIOCDISCONN = 0x20007439 @@ -192,6 +197,7 @@ const ( PPPIOCSPASS = 0x80107447 PPPIOCSRASYNCMAP = 0x80047454 PPPIOCSXASYNCMAP = 0x8020744f + PPPIOCUNBRIDGECHAN = 0x20007434 PPPIOCXFERUNIT = 0x2000744e PROT_SAO = 0x10 PR_SET_PTRACER_ANY = 0xffffffffffffffff @@ -327,6 +333,7 @@ const ( SO_BROADCAST = 0x6 SO_BSDCOMPAT = 0xe SO_BUSY_POLL = 0x2e + SO_BUSY_POLL_BUDGET = 0x46 SO_CNX_ADVICE = 0x35 SO_COOKIE = 0x39 SO_DETACH_REUSEPORT_BPF = 0x44 @@ -349,6 +356,7 @@ const ( SO_PEERCRED = 0x15 SO_PEERGROUPS = 0x3b SO_PEERSEC = 0x1f + SO_PREFER_BUSY_POLL = 0x45 SO_PROTOCOL = 0x26 SO_RCVBUF = 0x8 SO_RCVBUFFORCE = 0x21 @@ -543,6 +551,9 @@ const ( WORDSIZE = 0x40 XCASE = 0x4000 XTABS = 0xc00 + _HIDIOCGRAWNAME = 0x40804804 + _HIDIOCGRAWPHYS = 0x40404805 + _HIDIOCGRAWUNIQ = 0x40404808 ) // Errors diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go index b1bf7997cbdc..7cc98f09c3ed 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go @@ -1,6 +1,7 @@ // mkerrors.sh -Wall -Werror -static -I/tmp/include // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build riscv64 && linux // +build riscv64,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. @@ -92,6 +93,9 @@ const ( F_SETOWN = 0x8 F_UNLCK = 0x2 F_WRLCK = 0x1 + HIDIOCGRAWINFO = 0x80084803 + HIDIOCGRDESC = 0x90044802 + HIDIOCGRDESCSIZE = 0x80044801 HUPCL = 0x400 ICANON = 0x2 IEXTEN = 0x8000 @@ -163,6 +167,7 @@ const ( PERF_EVENT_IOC_SET_OUTPUT = 0x2405 PPPIOCATTACH = 0x4004743d PPPIOCATTCHAN = 0x40047438 + PPPIOCBRIDGECHAN = 0x40047435 PPPIOCCONNECT = 0x4004743a PPPIOCDETACH = 0x4004743c PPPIOCDISCONN = 0x7439 @@ -190,6 +195,7 @@ const ( PPPIOCSPASS = 0x40107447 PPPIOCSRASYNCMAP = 0x40047454 PPPIOCSXASYNCMAP = 0x4020744f + PPPIOCUNBRIDGECHAN = 0x7434 PPPIOCXFERUNIT = 0x744e PR_SET_PTRACER_ANY = 0xffffffffffffffff RLIMIT_AS = 0x9 @@ -256,6 +262,7 @@ const ( SO_BROADCAST = 0x6 SO_BSDCOMPAT = 0xe SO_BUSY_POLL = 0x2e + SO_BUSY_POLL_BUDGET = 0x46 SO_CNX_ADVICE = 0x35 SO_COOKIE = 0x39 SO_DETACH_REUSEPORT_BPF = 0x44 @@ -278,6 +285,7 @@ const ( SO_PEERCRED = 0x11 SO_PEERGROUPS = 0x3b SO_PEERSEC = 0x1f + SO_PREFER_BUSY_POLL = 0x45 SO_PROTOCOL = 0x26 SO_RCVBUF = 0x8 SO_RCVBUFFORCE = 0x21 @@ -468,6 +476,9 @@ const ( WORDSIZE = 0x40 XCASE = 0x4 XTABS = 0x1800 + _HIDIOCGRAWNAME = 0x80804804 + _HIDIOCGRAWPHYS = 0x80404805 + _HIDIOCGRAWUNIQ = 0x80404808 ) // Errors diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go index 7053d10ba024..a508392d2582 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go @@ -1,6 +1,7 @@ // mkerrors.sh -Wall -Werror -static -I/tmp/include -fsigned-char // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build s390x && linux // +build s390x,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. @@ -92,6 +93,9 @@ const ( F_SETOWN = 0x8 F_UNLCK = 0x2 F_WRLCK = 0x1 + HIDIOCGRAWINFO = 0x80084803 + HIDIOCGRDESC = 0x90044802 + HIDIOCGRDESCSIZE = 0x80044801 HUPCL = 0x400 ICANON = 0x2 IEXTEN = 0x8000 @@ -163,6 +167,7 @@ const ( PERF_EVENT_IOC_SET_OUTPUT = 0x2405 PPPIOCATTACH = 0x4004743d PPPIOCATTCHAN = 0x40047438 + PPPIOCBRIDGECHAN = 0x40047435 PPPIOCCONNECT = 0x4004743a PPPIOCDETACH = 0x4004743c PPPIOCDISCONN = 0x7439 @@ -190,6 +195,7 @@ const ( PPPIOCSPASS = 0x40107447 PPPIOCSRASYNCMAP = 0x40047454 PPPIOCSXASYNCMAP = 0x4020744f + PPPIOCUNBRIDGECHAN = 0x7434 PPPIOCXFERUNIT = 0x744e PR_SET_PTRACER_ANY = 0xffffffffffffffff PTRACE_DISABLE_TE = 0x5010 @@ -329,6 +335,7 @@ const ( SO_BROADCAST = 0x6 SO_BSDCOMPAT = 0xe SO_BUSY_POLL = 0x2e + SO_BUSY_POLL_BUDGET = 0x46 SO_CNX_ADVICE = 0x35 SO_COOKIE = 0x39 SO_DETACH_REUSEPORT_BPF = 0x44 @@ -351,6 +358,7 @@ const ( SO_PEERCRED = 0x11 SO_PEERGROUPS = 0x3b SO_PEERSEC = 0x1f + SO_PREFER_BUSY_POLL = 0x45 SO_PROTOCOL = 0x26 SO_RCVBUF = 0x8 SO_RCVBUFFORCE = 0x21 @@ -541,6 +549,9 @@ const ( WORDSIZE = 0x40 XCASE = 0x4 XTABS = 0x1800 + _HIDIOCGRAWNAME = 0x80804804 + _HIDIOCGRAWPHYS = 0x80404805 + _HIDIOCGRAWUNIQ = 0x80404808 ) // Errors diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go index 137cfe796269..d5e2dc94faa4 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go @@ -1,6 +1,7 @@ // mkerrors.sh -Wall -Werror -static -I/tmp/include // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build sparc64 && linux // +build sparc64,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. @@ -96,6 +97,9 @@ const ( F_SETOWN = 0x6 F_UNLCK = 0x3 F_WRLCK = 0x2 + HIDIOCGRAWINFO = 0x40084803 + HIDIOCGRDESC = 0x50044802 + HIDIOCGRDESCSIZE = 0x40044801 HUPCL = 0x400 ICANON = 0x2 IEXTEN = 0x8000 @@ -168,6 +172,7 @@ const ( PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 PPPIOCATTACH = 0x8004743d PPPIOCATTCHAN = 0x80047438 + PPPIOCBRIDGECHAN = 0x80047435 PPPIOCCONNECT = 0x8004743a PPPIOCDETACH = 0x8004743c PPPIOCDISCONN = 0x20007439 @@ -195,6 +200,7 @@ const ( PPPIOCSPASS = 0x80107447 PPPIOCSRASYNCMAP = 0x80047454 PPPIOCSXASYNCMAP = 0x8020744f + PPPIOCUNBRIDGECHAN = 0x20007434 PPPIOCXFERUNIT = 0x2000744e PR_SET_PTRACER_ANY = 0xffffffffffffffff PTRACE_GETFPAREGS = 0x14 @@ -322,6 +328,7 @@ const ( SO_BROADCAST = 0x20 SO_BSDCOMPAT = 0x400 SO_BUSY_POLL = 0x30 + SO_BUSY_POLL_BUDGET = 0x49 SO_CNX_ADVICE = 0x37 SO_COOKIE = 0x3b SO_DETACH_REUSEPORT_BPF = 0x47 @@ -344,6 +351,7 @@ const ( SO_PEERCRED = 0x40 SO_PEERGROUPS = 0x3d SO_PEERSEC = 0x1e + SO_PREFER_BUSY_POLL = 0x48 SO_PROTOCOL = 0x1028 SO_RCVBUF = 0x1002 SO_RCVBUFFORCE = 0x100b @@ -531,6 +539,9 @@ const ( WORDSIZE = 0x40 XCASE = 0x4 XTABS = 0x1800 + _HIDIOCGRAWNAME = 0x40804804 + _HIDIOCGRAWPHYS = 0x40404805 + _HIDIOCGRAWUNIQ = 0x40404808 __TIOCFLUSH = 0x80047410 ) diff --git a/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go b/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go index 20f3a5799fd1..72f7420d20a1 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go @@ -1,6 +1,7 @@ // mkerrors.sh -m32 // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build 386 && netbsd // +build 386,netbsd // Code generated by cmd/cgo -godefs; DO NOT EDIT. diff --git a/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go index 90b8fcd29c5a..8d4eb0c0804e 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go @@ -1,6 +1,7 @@ // mkerrors.sh -m64 // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build amd64 && netbsd // +build amd64,netbsd // Code generated by cmd/cgo -godefs; DO NOT EDIT. diff --git a/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go b/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go index c5c03993b67a..9eef9749f6aa 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go @@ -1,6 +1,7 @@ // mkerrors.sh -marm // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build arm && netbsd // +build arm,netbsd // Code generated by cmd/cgo -godefs; DO NOT EDIT. diff --git a/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm64.go index 14dd3c1d1ee9..3b62ba192c35 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm64.go @@ -1,6 +1,7 @@ // mkerrors.sh -m64 // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build arm64 && netbsd // +build arm64,netbsd // Code generated by cmd/cgo -godefs; DO NOT EDIT. diff --git a/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go b/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go index c865a10df446..593cc0feffa0 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go @@ -1,6 +1,7 @@ // mkerrors.sh -m32 // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build 386 && openbsd // +build 386,openbsd // Code generated by cmd/cgo -godefs; DO NOT EDIT. diff --git a/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go index 9db6b2fb6e2c..25cb6094813c 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go @@ -1,6 +1,7 @@ // mkerrors.sh -m64 // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build amd64 && openbsd // +build amd64,openbsd // Code generated by cmd/cgo -godefs; DO NOT EDIT. diff --git a/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go b/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go index 7072526a640d..a4e4c22314e0 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go @@ -1,6 +1,7 @@ // mkerrors.sh // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build arm && openbsd // +build arm,openbsd // Code generated by cmd/cgo -godefs; DO NOT EDIT. diff --git a/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm64.go index ac5efbe5ac76..90de7dfc33a3 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm64.go @@ -1,6 +1,7 @@ // mkerrors.sh -m64 // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build arm64 && openbsd // +build arm64,openbsd // Code generated by cmd/cgo -godefs; DO NOT EDIT. diff --git a/vendor/golang.org/x/sys/unix/zerrors_openbsd_mips64.go b/vendor/golang.org/x/sys/unix/zerrors_openbsd_mips64.go index a74639a46fb8..f1154ff56f6c 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_openbsd_mips64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_openbsd_mips64.go @@ -1,6 +1,7 @@ // mkerrors.sh -m64 // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build mips64 && openbsd // +build mips64,openbsd // Code generated by cmd/cgo -godefs; DO NOT EDIT. diff --git a/vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go index 5312c36cc828..65fb2c5cd83c 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go @@ -1,6 +1,7 @@ // mkerrors.sh -m64 // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build amd64 && solaris // +build amd64,solaris // Code generated by cmd/cgo -godefs; DO NOT EDIT. diff --git a/vendor/golang.org/x/sys/unix/zerrors_zos_s390x.go b/vendor/golang.org/x/sys/unix/zerrors_zos_s390x.go new file mode 100644 index 000000000000..4117ce08a506 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zerrors_zos_s390x.go @@ -0,0 +1,831 @@ +// Copyright 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build zos && s390x +// +build zos,s390x + +// Hand edited based on zerrors_linux_s390x.go +// TODO: auto-generate. + +package unix + +const ( + BRKINT = 0x0001 + CLOCK_MONOTONIC = 0x1 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_THREAD_CPUTIME_ID = 0x3 + CS8 = 0x0030 + CSIZE = 0x0030 + ECHO = 0x00000008 + ECHONL = 0x00000001 + FD_CLOEXEC = 0x01 + FD_CLOFORK = 0x02 + FNDELAY = 0x04 + F_CLOSFD = 9 + F_CONTROL_CVT = 13 + F_DUPFD = 0 + F_DUPFD2 = 8 + F_GETFD = 1 + F_GETFL = 259 + F_GETLK = 5 + F_GETOWN = 10 + F_OK = 0x0 + F_RDLCK = 1 + F_SETFD = 2 + F_SETFL = 4 + F_SETLK = 6 + F_SETLKW = 7 + F_SETOWN = 11 + F_SETTAG = 12 + F_UNLCK = 3 + F_WRLCK = 2 + FSTYPE_ZFS = 0xe9 //"Z" + FSTYPE_HFS = 0xc8 //"H" + FSTYPE_NFS = 0xd5 //"N" + FSTYPE_TFS = 0xe3 //"T" + FSTYPE_AUTOMOUNT = 0xc1 //"A" + IP6F_MORE_FRAG = 0x0001 + IP6F_OFF_MASK = 0xfff8 + IP6F_RESERVED_MASK = 0x0006 + IP6OPT_JUMBO = 0xc2 + IP6OPT_JUMBO_LEN = 6 + IP6OPT_MUTABLE = 0x20 + IP6OPT_NSAP_ADDR = 0xc3 + IP6OPT_PAD1 = 0x00 + IP6OPT_PADN = 0x01 + IP6OPT_ROUTER_ALERT = 0x05 + IP6OPT_TUNNEL_LIMIT = 0x04 + IP6OPT_TYPE_DISCARD = 0x40 + IP6OPT_TYPE_FORCEICMP = 0x80 + IP6OPT_TYPE_ICMP = 0xc0 + IP6OPT_TYPE_SKIP = 0x00 + IP6_ALERT_AN = 0x0002 + IP6_ALERT_MLD = 0x0000 + IP6_ALERT_RSVP = 0x0001 + IPPORT_RESERVED = 1024 + IPPORT_USERRESERVED = 5000 + IPPROTO_AH = 51 + IPPROTO_DSTOPTS = 60 + IPPROTO_EGP = 8 + IPPROTO_ESP = 50 + IPPROTO_FRAGMENT = 44 + IPPROTO_GGP = 2 + IPPROTO_HOPOPTS = 0 + IPPROTO_ICMP = 1 + IPPROTO_ICMPV6 = 58 + IPPROTO_IDP = 22 + IPPROTO_IP = 0 + IPPROTO_IPV6 = 41 + IPPROTO_MAX = 256 + IPPROTO_NONE = 59 + IPPROTO_PUP = 12 + IPPROTO_RAW = 255 + IPPROTO_ROUTING = 43 + IPPROTO_TCP = 6 + IPPROTO_UDP = 17 + IPV6_ADDR_PREFERENCES = 32 + IPV6_CHECKSUM = 19 + IPV6_DONTFRAG = 29 + IPV6_DSTOPTS = 23 + IPV6_HOPLIMIT = 11 + IPV6_HOPOPTS = 22 + IPV6_JOIN_GROUP = 5 + IPV6_LEAVE_GROUP = 6 + IPV6_MULTICAST_HOPS = 9 + IPV6_MULTICAST_IF = 7 + IPV6_MULTICAST_LOOP = 4 + IPV6_NEXTHOP = 20 + IPV6_PATHMTU = 12 + IPV6_PKTINFO = 13 + IPV6_PREFER_SRC_CGA = 0x10 + IPV6_PREFER_SRC_COA = 0x02 + IPV6_PREFER_SRC_HOME = 0x01 + IPV6_PREFER_SRC_NONCGA = 0x20 + IPV6_PREFER_SRC_PUBLIC = 0x08 + IPV6_PREFER_SRC_TMP = 0x04 + IPV6_RECVDSTOPTS = 28 + IPV6_RECVHOPLIMIT = 14 + IPV6_RECVHOPOPTS = 26 + IPV6_RECVPATHMTU = 16 + IPV6_RECVPKTINFO = 15 + IPV6_RECVRTHDR = 25 + IPV6_RECVTCLASS = 31 + IPV6_RTHDR = 21 + IPV6_RTHDRDSTOPTS = 24 + IPV6_RTHDR_TYPE_0 = 0 + IPV6_TCLASS = 30 + IPV6_UNICAST_HOPS = 3 + IPV6_USE_MIN_MTU = 18 + IPV6_V6ONLY = 10 + IP_ADD_MEMBERSHIP = 5 + IP_ADD_SOURCE_MEMBERSHIP = 12 + IP_BLOCK_SOURCE = 10 + IP_DEFAULT_MULTICAST_LOOP = 1 + IP_DEFAULT_MULTICAST_TTL = 1 + IP_DROP_MEMBERSHIP = 6 + IP_DROP_SOURCE_MEMBERSHIP = 13 + IP_MAX_MEMBERSHIPS = 20 + IP_MULTICAST_IF = 7 + IP_MULTICAST_LOOP = 4 + IP_MULTICAST_TTL = 3 + IP_OPTIONS = 1 + IP_PKTINFO = 101 + IP_RECVPKTINFO = 102 + IP_TOS = 2 + IP_TTL = 3 + IP_UNBLOCK_SOURCE = 11 + ICANON = 0x0010 + ICRNL = 0x0002 + IEXTEN = 0x0020 + IGNBRK = 0x0004 + IGNCR = 0x0008 + INLCR = 0x0020 + ISIG = 0x0040 + ISTRIP = 0x0080 + IXON = 0x0200 + IXOFF = 0x0100 + LOCK_SH = 0x1 // Not exist on zOS + LOCK_EX = 0x2 // Not exist on zOS + LOCK_NB = 0x4 // Not exist on zOS + LOCK_UN = 0x8 // Not exist on zOS + POLLIN = 0x0003 + POLLOUT = 0x0004 + POLLPRI = 0x0010 + POLLERR = 0x0020 + POLLHUP = 0x0040 + POLLNVAL = 0x0080 + PROT_READ = 0x1 // mmap - page can be read + PROT_WRITE = 0x2 // page can be written + PROT_NONE = 0x4 // can't be accessed + PROT_EXEC = 0x8 // can be executed + MAP_PRIVATE = 0x1 // changes are private + MAP_SHARED = 0x2 // changes are shared + MAP_FIXED = 0x4 // place exactly + MS_SYNC = 0x1 // msync - synchronous writes + MS_ASYNC = 0x2 // asynchronous writes + MS_INVALIDATE = 0x4 // invalidate mappings + MTM_RDONLY = 0x80000000 + MTM_RDWR = 0x40000000 + MTM_UMOUNT = 0x10000000 + MTM_IMMED = 0x08000000 + MTM_FORCE = 0x04000000 + MTM_DRAIN = 0x02000000 + MTM_RESET = 0x01000000 + MTM_SAMEMODE = 0x00100000 + MTM_UNQSEFORCE = 0x00040000 + MTM_NOSUID = 0x00000400 + MTM_SYNCHONLY = 0x00000200 + MTM_REMOUNT = 0x00000100 + MTM_NOSECURITY = 0x00000080 + O_ACCMODE = 0x03 + O_APPEND = 0x08 + O_ASYNCSIG = 0x0200 + O_CREAT = 0x80 + O_EXCL = 0x40 + O_GETFL = 0x0F + O_LARGEFILE = 0x0400 + O_NONBLOCK = 0x04 + O_RDONLY = 0x02 + O_RDWR = 0x03 + O_SYNC = 0x0100 + O_TRUNC = 0x10 + O_WRONLY = 0x01 + O_NOCTTY = 0x20 + OPOST = 0x0001 + ONLCR = 0x0004 + PARENB = 0x0200 + PARMRK = 0x0400 + QUERYCVT = 3 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 // RUSAGE_THREAD unsupported on z/OS + SEEK_CUR = 1 + SEEK_END = 2 + SEEK_SET = 0 + SETAUTOCVTALL = 5 + SETAUTOCVTON = 2 + SETCVTALL = 4 + SETCVTOFF = 0 + SETCVTON = 1 + AF_APPLETALK = 16 + AF_CCITT = 10 + AF_CHAOS = 5 + AF_DATAKIT = 9 + AF_DLI = 13 + AF_ECMA = 8 + AF_HYLINK = 15 + AF_IMPLINK = 3 + AF_INET = 2 + AF_INET6 = 19 + AF_INTF = 20 + AF_IUCV = 17 + AF_LAT = 14 + AF_LINK = 18 + AF_MAX = 30 + AF_NBS = 7 + AF_NDD = 23 + AF_NETWARE = 22 + AF_NS = 6 + AF_PUP = 4 + AF_RIF = 21 + AF_ROUTE = 20 + AF_SNA = 11 + AF_UNIX = 1 + AF_UNSPEC = 0 + IBMTCP_IMAGE = 1 + MSG_ACK_EXPECTED = 0x10 + MSG_ACK_GEN = 0x40 + MSG_ACK_TIMEOUT = 0x20 + MSG_CONNTERM = 0x80 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_EOF = 0x8000 + MSG_EOR = 0x8 + MSG_MAXIOVLEN = 16 + MSG_NONBLOCK = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + PRIO_PROCESS = 1 + PRIO_PGRP = 2 + PRIO_USER = 3 + RLIMIT_CPU = 0 + RLIMIT_FSIZE = 1 + RLIMIT_DATA = 2 + RLIMIT_STACK = 3 + RLIMIT_CORE = 4 + RLIMIT_AS = 5 + RLIMIT_NOFILE = 6 + RLIMIT_MEMLIMIT = 7 + RLIM_INFINITY = 2147483647 + SCM_RIGHTS = 0x01 + SF_CLOSE = 0x00000002 + SF_REUSE = 0x00000001 + SHUT_RD = 0 + SHUT_RDWR = 2 + SHUT_WR = 1 + SOCK_CONN_DGRAM = 6 + SOCK_DGRAM = 2 + SOCK_RAW = 3 + SOCK_RDM = 4 + SOCK_SEQPACKET = 5 + SOCK_STREAM = 1 + SOL_SOCKET = 0xffff + SOMAXCONN = 10 + SO_ACCEPTCONN = 0x0002 + SO_ACCEPTECONNABORTED = 0x0006 + SO_ACKNOW = 0x7700 + SO_BROADCAST = 0x0020 + SO_BULKMODE = 0x8000 + SO_CKSUMRECV = 0x0800 + SO_CLOSE = 0x01 + SO_CLUSTERCONNTYPE = 0x00004001 + SO_CLUSTERCONNTYPE_INTERNAL = 8 + SO_CLUSTERCONNTYPE_NOCONN = 0 + SO_CLUSTERCONNTYPE_NONE = 1 + SO_CLUSTERCONNTYPE_SAME_CLUSTER = 2 + SO_CLUSTERCONNTYPE_SAME_IMAGE = 4 + SO_DEBUG = 0x0001 + SO_DONTROUTE = 0x0010 + SO_ERROR = 0x1007 + SO_IGNOREINCOMINGPUSH = 0x1 + SO_IGNORESOURCEVIPA = 0x0002 + SO_KEEPALIVE = 0x0008 + SO_LINGER = 0x0080 + SO_NONBLOCKLOCAL = 0x8001 + SO_NOREUSEADDR = 0x1000 + SO_OOBINLINE = 0x0100 + SO_OPTACK = 0x8004 + SO_OPTMSS = 0x8003 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x0004 + SO_REUSEPORT = 0x0200 + SO_SECINFO = 0x00004002 + SO_SET = 0x0200 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_TYPE = 0x1008 + SO_UNSET = 0x0400 + SO_USELOOPBACK = 0x0040 + SO_USE_IFBUFS = 0x0400 + S_ISUID = 0x0800 + S_ISGID = 0x0400 + S_ISVTX = 0x0200 + S_IRUSR = 0x0100 + S_IWUSR = 0x0080 + S_IXUSR = 0x0040 + S_IRWXU = 0x01C0 + S_IRGRP = 0x0020 + S_IWGRP = 0x0010 + S_IXGRP = 0x0008 + S_IRWXG = 0x0038 + S_IROTH = 0x0004 + S_IWOTH = 0x0002 + S_IXOTH = 0x0001 + S_IRWXO = 0x0007 + S_IREAD = S_IRUSR + S_IWRITE = S_IWUSR + S_IEXEC = S_IXUSR + S_IFDIR = 0x01000000 + S_IFCHR = 0x02000000 + S_IFREG = 0x03000000 + S_IFFIFO = 0x04000000 + S_IFIFO = 0x04000000 + S_IFLNK = 0x05000000 + S_IFBLK = 0x06000000 + S_IFSOCK = 0x07000000 + S_IFVMEXTL = 0xFE000000 + S_IFVMEXTL_EXEC = 0x00010000 + S_IFVMEXTL_DATA = 0x00020000 + S_IFVMEXTL_MEL = 0x00030000 + S_IFEXTL = 0x00000001 + S_IFPROGCTL = 0x00000002 + S_IFAPFCTL = 0x00000004 + S_IFNOSHARE = 0x00000008 + S_IFSHARELIB = 0x00000010 + S_IFMT = 0xFF000000 + S_IFMST = 0x00FF0000 + TCP_KEEPALIVE = 0x8 + TCP_NODELAY = 0x1 + TIOCGWINSZ = 0x4008a368 + TIOCSWINSZ = 0x8008a367 + TIOCSBRK = 0x2000a77b + TIOCCBRK = 0x2000a77a + TIOCSTI = 0x8001a772 + TIOCGPGRP = 0x4004a777 // _IOR(167, 119, int) + TCSANOW = 0 + TCSETS = 0 // equivalent to TCSANOW for tcsetattr + TCSADRAIN = 1 + TCSETSW = 1 // equivalent to TCSADRAIN for tcsetattr + TCSAFLUSH = 2 + TCSETSF = 2 // equivalent to TCSAFLUSH for tcsetattr + TCGETS = 3 // not defined in ioctl.h -- zos golang only + TCIFLUSH = 0 + TCOFLUSH = 1 + TCIOFLUSH = 2 + TCOOFF = 0 + TCOON = 1 + TCIOFF = 2 + TCION = 3 + TIOCSPGRP = 0x8004a776 + TIOCNOTTY = 0x2000a771 + TIOCEXCL = 0x2000a70d + TIOCNXCL = 0x2000a70e + TIOCGETD = 0x4004a700 + TIOCSETD = 0x8004a701 + TIOCPKT = 0x8004a770 + TIOCSTOP = 0x2000a76f + TIOCSTART = 0x2000a76e + TIOCUCNTL = 0x8004a766 + TIOCREMOTE = 0x8004a769 + TIOCMGET = 0x4004a76a + TIOCMSET = 0x8004a76d + TIOCMBIC = 0x8004a76b + TIOCMBIS = 0x8004a76c + VINTR = 0 + VQUIT = 1 + VERASE = 2 + VKILL = 3 + VEOF = 4 + VEOL = 5 + VMIN = 6 + VSTART = 7 + VSTOP = 8 + VSUSP = 9 + VTIME = 10 + WCONTINUED = 0x4 + WNOHANG = 0x1 + WUNTRACED = 0x2 + _BPX_SWAP = 1 + _BPX_NONSWAP = 2 + MCL_CURRENT = 1 // for Linux compatibility -- no zos semantics + MCL_FUTURE = 2 // for Linux compatibility -- no zos semantics + MCL_ONFAULT = 3 // for Linux compatibility -- no zos semantics + MADV_NORMAL = 0 // for Linux compatibility -- no zos semantics + MADV_RANDOM = 1 // for Linux compatibility -- no zos semantics + MADV_SEQUENTIAL = 2 // for Linux compatibility -- no zos semantics + MADV_WILLNEED = 3 // for Linux compatibility -- no zos semantics + MADV_REMOVE = 4 // for Linux compatibility -- no zos semantics + MADV_DONTFORK = 5 // for Linux compatibility -- no zos semantics + MADV_DOFORK = 6 // for Linux compatibility -- no zos semantics + MADV_HWPOISON = 7 // for Linux compatibility -- no zos semantics + MADV_MERGEABLE = 8 // for Linux compatibility -- no zos semantics + MADV_UNMERGEABLE = 9 // for Linux compatibility -- no zos semantics + MADV_SOFT_OFFLINE = 10 // for Linux compatibility -- no zos semantics + MADV_HUGEPAGE = 11 // for Linux compatibility -- no zos semantics + MADV_NOHUGEPAGE = 12 // for Linux compatibility -- no zos semantics + MADV_DONTDUMP = 13 // for Linux compatibility -- no zos semantics + MADV_DODUMP = 14 // for Linux compatibility -- no zos semantics + MADV_FREE = 15 // for Linux compatibility -- no zos semantics + MADV_WIPEONFORK = 16 // for Linux compatibility -- no zos semantics + MADV_KEEPONFORK = 17 // for Linux compatibility -- no zos semantics + AT_SYMLINK_NOFOLLOW = 1 // for Unix compatibility -- no zos semantics + AT_FDCWD = 2 // for Unix compatibility -- no zos semantics +) + +const ( + EDOM = Errno(1) + ERANGE = Errno(2) + EACCES = Errno(111) + EAGAIN = Errno(112) + EBADF = Errno(113) + EBUSY = Errno(114) + ECHILD = Errno(115) + EDEADLK = Errno(116) + EEXIST = Errno(117) + EFAULT = Errno(118) + EFBIG = Errno(119) + EINTR = Errno(120) + EINVAL = Errno(121) + EIO = Errno(122) + EISDIR = Errno(123) + EMFILE = Errno(124) + EMLINK = Errno(125) + ENAMETOOLONG = Errno(126) + ENFILE = Errno(127) + ENODEV = Errno(128) + ENOENT = Errno(129) + ENOEXEC = Errno(130) + ENOLCK = Errno(131) + ENOMEM = Errno(132) + ENOSPC = Errno(133) + ENOSYS = Errno(134) + ENOTDIR = Errno(135) + ENOTEMPTY = Errno(136) + ENOTTY = Errno(137) + ENXIO = Errno(138) + EPERM = Errno(139) + EPIPE = Errno(140) + EROFS = Errno(141) + ESPIPE = Errno(142) + ESRCH = Errno(143) + EXDEV = Errno(144) + E2BIG = Errno(145) + ELOOP = Errno(146) + EILSEQ = Errno(147) + ENODATA = Errno(148) + EOVERFLOW = Errno(149) + EMVSNOTUP = Errno(150) + ECMSSTORAGE = Errno(151) + EMVSDYNALC = Errno(151) + EMVSCVAF = Errno(152) + EMVSCATLG = Errno(153) + ECMSINITIAL = Errno(156) + EMVSINITIAL = Errno(156) + ECMSERR = Errno(157) + EMVSERR = Errno(157) + EMVSPARM = Errno(158) + ECMSPFSFILE = Errno(159) + EMVSPFSFILE = Errno(159) + EMVSBADCHAR = Errno(160) + ECMSPFSPERM = Errno(162) + EMVSPFSPERM = Errno(162) + EMVSSAFEXTRERR = Errno(163) + EMVSSAF2ERR = Errno(164) + EMVSTODNOTSET = Errno(165) + EMVSPATHOPTS = Errno(166) + EMVSNORTL = Errno(167) + EMVSEXPIRE = Errno(168) + EMVSPASSWORD = Errno(169) + EMVSWLMERROR = Errno(170) + EMVSCPLERROR = Errno(171) + EMVSARMERROR = Errno(172) + ELENOFORK = Errno(200) + ELEMSGERR = Errno(201) + EFPMASKINV = Errno(202) + EFPMODEINV = Errno(203) + EBUFLEN = Errno(227) + EEXTLINK = Errno(228) + ENODD = Errno(229) + ECMSESMERR = Errno(230) + ECPERR = Errno(231) + ELEMULTITHREAD = Errno(232) + ELEFENCE = Errno(244) + EBADDATA = Errno(245) + EUNKNOWN = Errno(246) + ENOTSUP = Errno(247) + EBADNAME = Errno(248) + ENOTSAFE = Errno(249) + ELEMULTITHREADFORK = Errno(257) + ECUNNOENV = Errno(258) + ECUNNOCONV = Errno(259) + ECUNNOTALIGNED = Errno(260) + ECUNERR = Errno(262) + EIBMBADCALL = Errno(1000) + EIBMBADPARM = Errno(1001) + EIBMSOCKOUTOFRANGE = Errno(1002) + EIBMSOCKINUSE = Errno(1003) + EIBMIUCVERR = Errno(1004) + EOFFLOADboxERROR = Errno(1005) + EOFFLOADboxRESTART = Errno(1006) + EOFFLOADboxDOWN = Errno(1007) + EIBMCONFLICT = Errno(1008) + EIBMCANCELLED = Errno(1009) + EIBMBADTCPNAME = Errno(1011) + ENOTBLK = Errno(1100) + ETXTBSY = Errno(1101) + EWOULDBLOCK = Errno(1102) + EINPROGRESS = Errno(1103) + EALREADY = Errno(1104) + ENOTSOCK = Errno(1105) + EDESTADDRREQ = Errno(1106) + EMSGSIZE = Errno(1107) + EPROTOTYPE = Errno(1108) + ENOPROTOOPT = Errno(1109) + EPROTONOSUPPORT = Errno(1110) + ESOCKTNOSUPPORT = Errno(1111) + EOPNOTSUPP = Errno(1112) + EPFNOSUPPORT = Errno(1113) + EAFNOSUPPORT = Errno(1114) + EADDRINUSE = Errno(1115) + EADDRNOTAVAIL = Errno(1116) + ENETDOWN = Errno(1117) + ENETUNREACH = Errno(1118) + ENETRESET = Errno(1119) + ECONNABORTED = Errno(1120) + ECONNRESET = Errno(1121) + ENOBUFS = Errno(1122) + EISCONN = Errno(1123) + ENOTCONN = Errno(1124) + ESHUTDOWN = Errno(1125) + ETOOMANYREFS = Errno(1126) + ETIMEDOUT = Errno(1127) + ECONNREFUSED = Errno(1128) + EHOSTDOWN = Errno(1129) + EHOSTUNREACH = Errno(1130) + EPROCLIM = Errno(1131) + EUSERS = Errno(1132) + EDQUOT = Errno(1133) + ESTALE = Errno(1134) + EREMOTE = Errno(1135) + ENOSTR = Errno(1136) + ETIME = Errno(1137) + ENOSR = Errno(1138) + ENOMSG = Errno(1139) + EBADMSG = Errno(1140) + EIDRM = Errno(1141) + ENONET = Errno(1142) + ERREMOTE = Errno(1143) + ENOLINK = Errno(1144) + EADV = Errno(1145) + ESRMNT = Errno(1146) + ECOMM = Errno(1147) + EPROTO = Errno(1148) + EMULTIHOP = Errno(1149) + EDOTDOT = Errno(1150) + EREMCHG = Errno(1151) + ECANCELED = Errno(1152) + EINTRNODATA = Errno(1159) + ENOREUSE = Errno(1160) + ENOMOVE = Errno(1161) +) + +// Signals +const ( + SIGHUP = Signal(1) + SIGINT = Signal(2) + SIGABRT = Signal(3) + SIGILL = Signal(4) + SIGPOLL = Signal(5) + SIGURG = Signal(6) + SIGSTOP = Signal(7) + SIGFPE = Signal(8) + SIGKILL = Signal(9) + SIGBUS = Signal(10) + SIGSEGV = Signal(11) + SIGSYS = Signal(12) + SIGPIPE = Signal(13) + SIGALRM = Signal(14) + SIGTERM = Signal(15) + SIGUSR1 = Signal(16) + SIGUSR2 = Signal(17) + SIGABND = Signal(18) + SIGCONT = Signal(19) + SIGCHLD = Signal(20) + SIGTTIN = Signal(21) + SIGTTOU = Signal(22) + SIGIO = Signal(23) + SIGQUIT = Signal(24) + SIGTSTP = Signal(25) + SIGTRAP = Signal(26) + SIGIOERR = Signal(27) + SIGWINCH = Signal(28) + SIGXCPU = Signal(29) + SIGXFSZ = Signal(30) + SIGVTALRM = Signal(31) + SIGPROF = Signal(32) + SIGDANGER = Signal(33) + SIGTHSTOP = Signal(34) + SIGTHCONT = Signal(35) + SIGTRACE = Signal(37) + SIGDCE = Signal(38) + SIGDUMP = Signal(39) +) + +// Error table +var errorList = [...]struct { + num Errno + name string + desc string +}{ + {1, "EDC5001I", "A domain error occurred."}, + {2, "EDC5002I", "A range error occurred."}, + {111, "EDC5111I", "Permission denied."}, + {112, "EDC5112I", "Resource temporarily unavailable."}, + {113, "EDC5113I", "Bad file descriptor."}, + {114, "EDC5114I", "Resource busy."}, + {115, "EDC5115I", "No child processes."}, + {116, "EDC5116I", "Resource deadlock avoided."}, + {117, "EDC5117I", "File exists."}, + {118, "EDC5118I", "Incorrect address."}, + {119, "EDC5119I", "File too large."}, + {120, "EDC5120I", "Interrupted function call."}, + {121, "EDC5121I", "Invalid argument."}, + {122, "EDC5122I", "Input/output error."}, + {123, "EDC5123I", "Is a directory."}, + {124, "EDC5124I", "Too many open files."}, + {125, "EDC5125I", "Too many links."}, + {126, "EDC5126I", "Filename too long."}, + {127, "EDC5127I", "Too many open files in system."}, + {128, "EDC5128I", "No such device."}, + {129, "EDC5129I", "No such file or directory."}, + {130, "EDC5130I", "Exec format error."}, + {131, "EDC5131I", "No locks available."}, + {132, "EDC5132I", "Not enough memory."}, + {133, "EDC5133I", "No space left on device."}, + {134, "EDC5134I", "Function not implemented."}, + {135, "EDC5135I", "Not a directory."}, + {136, "EDC5136I", "Directory not empty."}, + {137, "EDC5137I", "Inappropriate I/O control operation."}, + {138, "EDC5138I", "No such device or address."}, + {139, "EDC5139I", "Operation not permitted."}, + {140, "EDC5140I", "Broken pipe."}, + {141, "EDC5141I", "Read-only file system."}, + {142, "EDC5142I", "Invalid seek."}, + {143, "EDC5143I", "No such process."}, + {144, "EDC5144I", "Improper link."}, + {145, "EDC5145I", "The parameter list is too long, or the message to receive was too large for the buffer."}, + {146, "EDC5146I", "Too many levels of symbolic links."}, + {147, "EDC5147I", "Illegal byte sequence."}, + {148, "", ""}, + {149, "EDC5149I", "Value Overflow Error."}, + {150, "EDC5150I", "UNIX System Services is not active."}, + {151, "EDC5151I", "Dynamic allocation error."}, + {152, "EDC5152I", "Common VTOC access facility (CVAF) error."}, + {153, "EDC5153I", "Catalog obtain error."}, + {156, "EDC5156I", "Process initialization error."}, + {157, "EDC5157I", "An internal error has occurred."}, + {158, "EDC5158I", "Bad parameters were passed to the service."}, + {159, "EDC5159I", "The Physical File System encountered a permanent file error."}, + {160, "EDC5160I", "Bad character in environment variable name."}, + {162, "EDC5162I", "The Physical File System encountered a system error."}, + {163, "EDC5163I", "SAF/RACF extract error."}, + {164, "EDC5164I", "SAF/RACF error."}, + {165, "EDC5165I", "System TOD clock not set."}, + {166, "EDC5166I", "Access mode argument on function call conflicts with PATHOPTS parameter on JCL DD statement."}, + {167, "EDC5167I", "Access to the UNIX System Services version of the C RTL is denied."}, + {168, "EDC5168I", "Password has expired."}, + {169, "EDC5169I", "Password is invalid."}, + {170, "EDC5170I", "An error was encountered with WLM."}, + {171, "EDC5171I", "An error was encountered with CPL."}, + {172, "EDC5172I", "An error was encountered with Application Response Measurement (ARM) component."}, + {200, "EDC5200I", "The application contains a Language Environment member language that cannot tolerate a fork()."}, + {201, "EDC5201I", "The Language Environment message file was not found in the hierarchical file system."}, + {202, "EDC5202E", "DLL facilities are not supported under SPC environment."}, + {203, "EDC5203E", "DLL facilities are not supported under POSIX environment."}, + {227, "EDC5227I", "Buffer is not long enough to contain a path definition"}, + {228, "EDC5228I", "The file referred to is an external link"}, + {229, "EDC5229I", "No path definition for ddname in effect"}, + {230, "EDC5230I", "ESM error."}, + {231, "EDC5231I", "CP or the external security manager had an error"}, + {232, "EDC5232I", "The function failed because it was invoked from a multithread environment."}, + {244, "EDC5244I", "The program, module or DLL is not supported in this environment."}, + {245, "EDC5245I", "Data is not valid."}, + {246, "EDC5246I", "Unknown system state."}, + {247, "EDC5247I", "Operation not supported."}, + {248, "EDC5248I", "The object name specified is not correct."}, + {249, "EDC5249I", "The function is not allowed."}, + {257, "EDC5257I", "Function cannot be called in the child process of a fork() from a multithreaded process until exec() is called."}, + {258, "EDC5258I", "A CUN_RS_NO_UNI_ENV error was issued by Unicode Services."}, + {259, "EDC5259I", "A CUN_RS_NO_CONVERSION error was issued by Unicode Services."}, + {260, "EDC5260I", "A CUN_RS_TABLE_NOT_ALIGNED error was issued by Unicode Services."}, + {262, "EDC5262I", "An iconv() function encountered an unexpected error while using Unicode Services."}, + {1000, "EDC8000I", "A bad socket-call constant was found in the IUCV header."}, + {1001, "EDC8001I", "An error was found in the IUCV header."}, + {1002, "EDC8002I", "A socket descriptor is out of range."}, + {1003, "EDC8003I", "A socket descriptor is in use."}, + {1004, "EDC8004I", "Request failed because of an IUCV error."}, + {1005, "EDC8005I", "Offload box error."}, + {1006, "EDC8006I", "Offload box restarted."}, + {1007, "EDC8007I", "Offload box down."}, + {1008, "EDC8008I", "Already a conflicting call outstanding on socket."}, + {1009, "EDC8009I", "Request cancelled using a SOCKcallCANCEL request."}, + {1011, "EDC8011I", "A name of a PFS was specified that either is not configured or is not a Sockets PFS."}, + {1100, "EDC8100I", "Block device required."}, + {1101, "EDC8101I", "Text file busy."}, + {1102, "EDC8102I", "Operation would block."}, + {1103, "EDC8103I", "Operation now in progress."}, + {1104, "EDC8104I", "Connection already in progress."}, + {1105, "EDC8105I", "Socket operation on non-socket."}, + {1106, "EDC8106I", "Destination address required."}, + {1107, "EDC8107I", "Message too long."}, + {1108, "EDC8108I", "Protocol wrong type for socket."}, + {1109, "EDC8109I", "Protocol not available."}, + {1110, "EDC8110I", "Protocol not supported."}, + {1111, "EDC8111I", "Socket type not supported."}, + {1112, "EDC8112I", "Operation not supported on socket."}, + {1113, "EDC8113I", "Protocol family not supported."}, + {1114, "EDC8114I", "Address family not supported."}, + {1115, "EDC8115I", "Address already in use."}, + {1116, "EDC8116I", "Address not available."}, + {1117, "EDC8117I", "Network is down."}, + {1118, "EDC8118I", "Network is unreachable."}, + {1119, "EDC8119I", "Network dropped connection on reset."}, + {1120, "EDC8120I", "Connection ended abnormally."}, + {1121, "EDC8121I", "Connection reset."}, + {1122, "EDC8122I", "No buffer space available."}, + {1123, "EDC8123I", "Socket already connected."}, + {1124, "EDC8124I", "Socket not connected."}, + {1125, "EDC8125I", "Can't send after socket shutdown."}, + {1126, "EDC8126I", "Too many references; can't splice."}, + {1127, "EDC8127I", "Connection timed out."}, + {1128, "EDC8128I", "Connection refused."}, + {1129, "EDC8129I", "Host is not available."}, + {1130, "EDC8130I", "Host cannot be reached."}, + {1131, "EDC8131I", "Too many processes."}, + {1132, "EDC8132I", "Too many users."}, + {1133, "EDC8133I", "Disk quota exceeded."}, + {1134, "EDC8134I", "Stale file handle."}, + {1135, "", ""}, + {1136, "EDC8136I", "File is not a STREAM."}, + {1137, "EDC8137I", "STREAMS ioctl() timeout."}, + {1138, "EDC8138I", "No STREAMS resources."}, + {1139, "EDC8139I", "The message identified by set_id and msg_id is not in the message catalog."}, + {1140, "EDC8140I", "Bad message."}, + {1141, "EDC8141I", "Identifier removed."}, + {1142, "", ""}, + {1143, "", ""}, + {1144, "EDC8144I", "The link has been severed."}, + {1145, "", ""}, + {1146, "", ""}, + {1147, "", ""}, + {1148, "EDC8148I", "Protocol error."}, + {1149, "EDC8149I", "Multihop not allowed."}, + {1150, "", ""}, + {1151, "", ""}, + {1152, "EDC8152I", "The asynchronous I/O request has been canceled."}, + {1159, "EDC8159I", "Function call was interrupted before any data was received."}, + {1160, "EDC8160I", "Socket reuse is not supported."}, + {1161, "EDC8161I", "The file system cannot currently be moved."}, +} + +// Signal table +var signalList = [...]struct { + num Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGABT", "aborted"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGPOLL", "pollable event"}, + {6, "SIGURG", "urgent I/O condition"}, + {7, "SIGSTOP", "stop process"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGBUS", "bus error"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGSYS", "bad argument to routine"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGUSR1", "user defined signal 1"}, + {17, "SIGUSR2", "user defined signal 2"}, + {18, "SIGABND", "abend"}, + {19, "SIGCONT", "continued"}, + {20, "SIGCHLD", "child exited"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGIO", "I/O possible"}, + {24, "SIGQUIT", "quit"}, + {25, "SIGTSTP", "stopped"}, + {26, "SIGTRAP", "trace/breakpoint trap"}, + {27, "SIGIOER", "I/O error"}, + {28, "SIGWINCH", "window changed"}, + {29, "SIGXCPU", "CPU time limit exceeded"}, + {30, "SIGXFSZ", "file size limit exceeded"}, + {31, "SIGVTALRM", "virtual timer expired"}, + {32, "SIGPROF", "profiling timer expired"}, + {33, "SIGDANGER", "danger"}, + {34, "SIGTHSTOP", "stop thread"}, + {35, "SIGTHCONT", "continue thread"}, + {37, "SIGTRACE", "trace"}, + {38, "", "DCE"}, + {39, "SIGDUMP", "dump"}, +} diff --git a/vendor/golang.org/x/sys/unix/zptrace_armnn_linux.go b/vendor/golang.org/x/sys/unix/zptrace_armnn_linux.go index 89c5920e0cb8..bd001a6e1cc7 100644 --- a/vendor/golang.org/x/sys/unix/zptrace_armnn_linux.go +++ b/vendor/golang.org/x/sys/unix/zptrace_armnn_linux.go @@ -1,5 +1,6 @@ // Code generated by linux/mkall.go generatePtracePair("arm", "arm64"). DO NOT EDIT. +//go:build linux && (arm || arm64) // +build linux // +build arm arm64 diff --git a/vendor/golang.org/x/sys/unix/zptrace_mipsnn_linux.go b/vendor/golang.org/x/sys/unix/zptrace_mipsnn_linux.go index 24b841eec509..c34d0639be3a 100644 --- a/vendor/golang.org/x/sys/unix/zptrace_mipsnn_linux.go +++ b/vendor/golang.org/x/sys/unix/zptrace_mipsnn_linux.go @@ -1,5 +1,6 @@ // Code generated by linux/mkall.go generatePtracePair("mips", "mips64"). DO NOT EDIT. +//go:build linux && (mips || mips64) // +build linux // +build mips mips64 diff --git a/vendor/golang.org/x/sys/unix/zptrace_mipsnnle_linux.go b/vendor/golang.org/x/sys/unix/zptrace_mipsnnle_linux.go index 47b048956510..3ccf0c0c4a80 100644 --- a/vendor/golang.org/x/sys/unix/zptrace_mipsnnle_linux.go +++ b/vendor/golang.org/x/sys/unix/zptrace_mipsnnle_linux.go @@ -1,5 +1,6 @@ // Code generated by linux/mkall.go generatePtracePair("mipsle", "mips64le"). DO NOT EDIT. +//go:build linux && (mipsle || mips64le) // +build linux // +build mipsle mips64le diff --git a/vendor/golang.org/x/sys/unix/zptrace_x86_linux.go b/vendor/golang.org/x/sys/unix/zptrace_x86_linux.go index ea5d9cb536cb..7d65857004c4 100644 --- a/vendor/golang.org/x/sys/unix/zptrace_x86_linux.go +++ b/vendor/golang.org/x/sys/unix/zptrace_x86_linux.go @@ -1,5 +1,6 @@ // Code generated by linux/mkall.go generatePtracePair("386", "amd64"). DO NOT EDIT. +//go:build linux && (386 || amd64) // +build linux // +build 386 amd64 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go index ed657ff1bc0b..91a23cc72874 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go @@ -1,6 +1,7 @@ // go run mksyscall_aix_ppc.go -aix -tags aix,ppc syscall_aix.go syscall_aix_ppc.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build aix && ppc // +build aix,ppc package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go index 664b293b4317..33c2609b8b40 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go @@ -1,6 +1,7 @@ // go run mksyscall_aix_ppc64.go -aix -tags aix,ppc64 syscall_aix.go syscall_aix_ppc64.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build aix && ppc64 // +build aix,ppc64 package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go index 0550da06d147..8b737fa971e8 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go @@ -1,8 +1,8 @@ // go run mksyscall_aix_ppc64.go -aix -tags aix,ppc64 syscall_aix.go syscall_aix_ppc64.go // Code generated by the command above; see README.md. DO NOT EDIT. -// +build aix,ppc64 -// +build gc +//go:build aix && ppc64 && gc +// +build aix,ppc64,gc package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go index cde4dbc5f543..3c260917ed59 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go @@ -1,8 +1,8 @@ // go run mksyscall_aix_ppc64.go -aix -tags aix,ppc64 syscall_aix.go syscall_aix_ppc64.go // Code generated by the command above; see README.md. DO NOT EDIT. -// +build aix,ppc64 -// +build gccgo +//go:build aix && ppc64 && gccgo +// +build aix,ppc64,gccgo package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.1_13.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.1_13.go index c8c142c59a09..48a62e39062c 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.1_13.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.1_13.go @@ -1,6 +1,7 @@ // go run mksyscall.go -l32 -tags darwin,386,go1.13 syscall_darwin.1_13.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build darwin && 386 && go1.13 // +build darwin,386,go1.13 package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go index 3877183483f1..a266636af67e 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go @@ -1,6 +1,7 @@ // go run mksyscall.go -l32 -tags darwin,386,go1.12 syscall_bsd.go syscall_darwin.go syscall_darwin_386.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build darwin && 386 && go1.12 // +build darwin,386,go1.12 package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_13.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_13.go index 88826236136b..e36299ead094 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_13.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_13.go @@ -1,6 +1,7 @@ // go run mksyscall.go -tags darwin,amd64,go1.13 syscall_darwin.1_13.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build darwin && amd64 && go1.13 // +build darwin,amd64,go1.13 package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go index 508e5639bf4a..f4111628823b 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go @@ -1,6 +1,7 @@ // go run mksyscall.go -tags darwin,amd64,go1.12 syscall_bsd.go syscall_darwin.go syscall_darwin_amd64.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build darwin && amd64 && go1.12 // +build darwin,amd64,go1.12 package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.1_13.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.1_13.go index de4738fff800..ed437f89a9e3 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.1_13.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.1_13.go @@ -1,6 +1,7 @@ // go run mksyscall.go -l32 -tags darwin,arm,go1.13 syscall_darwin.1_13.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build darwin && arm && go1.13 // +build darwin,arm,go1.13 package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go index c0c771f4025d..7f88cb5ea22d 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go @@ -1,6 +1,7 @@ // go run mksyscall.go -l32 -tags darwin,arm,go1.12 syscall_bsd.go syscall_darwin.go syscall_darwin_arm.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build darwin && arm && go1.12 // +build darwin,arm,go1.12 package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_13.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_13.go index 870eb37abf57..d30ec4e29a01 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_13.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_13.go @@ -1,6 +1,7 @@ // go run mksyscall.go -tags darwin,arm64,go1.13 syscall_darwin.1_13.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build darwin && arm64 && go1.13 // +build darwin,arm64,go1.13 package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go index 9b01a79c41ea..a10df58d00e1 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go @@ -1,6 +1,7 @@ // go run mksyscall.go -tags darwin,arm64,go1.12 syscall_bsd.go syscall_darwin.go syscall_darwin_arm64.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build darwin && arm64 && go1.12 // +build darwin,arm64,go1.12 package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go index 1aaccd3615ee..1b6eedfa6115 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go @@ -1,6 +1,7 @@ // go run mksyscall.go -dragonfly -tags dragonfly,amd64 syscall_bsd.go syscall_dragonfly.go syscall_dragonfly_amd64.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build dragonfly && amd64 // +build dragonfly,amd64 package unix @@ -362,8 +363,10 @@ func pipe() (r int, w int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func pipe2(p *[2]_C_int, flags int) (err error) { - _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) +func pipe2(p *[2]_C_int, flags int) (r int, w int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + r = int(r0) + w = int(r1) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go index 600f1d26d211..3e9bddb7b224 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go @@ -1,6 +1,7 @@ // go run mksyscall.go -l32 -tags freebsd,386 syscall_bsd.go syscall_freebsd.go syscall_freebsd_386.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build freebsd && 386 // +build freebsd,386 package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go index 064934b0d132..c72a462b91e1 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go @@ -1,6 +1,7 @@ // go run mksyscall.go -tags freebsd,amd64 syscall_bsd.go syscall_freebsd.go syscall_freebsd_amd64.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build freebsd && amd64 // +build freebsd,amd64 package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go index 31d2c4616578..530d5df90c0c 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go @@ -1,6 +1,7 @@ // go run mksyscall.go -l32 -arm -tags freebsd,arm syscall_bsd.go syscall_freebsd.go syscall_freebsd_arm.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build freebsd && arm // +build freebsd,arm package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go index 4adaaa56183e..71e7df9e8558 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go @@ -1,6 +1,7 @@ // go run mksyscall.go -tags freebsd,arm64 syscall_bsd.go syscall_freebsd.go syscall_freebsd_arm64.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build freebsd && arm64 // +build freebsd,arm64 package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_illumos_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_illumos_amd64.go index 665dd9e4b49e..b57c7050d7a8 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_illumos_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_illumos_amd64.go @@ -1,6 +1,7 @@ // go run mksyscall_solaris.go -illumos -tags illumos,amd64 syscall_illumos.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build illumos && amd64 // +build illumos,amd64 package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux.go b/vendor/golang.org/x/sys/unix/zsyscall_linux.go index 2fbbbe5a898b..3ee26f4ad169 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux.go @@ -1,5 +1,6 @@ // Code generated by mkmerge.go; DO NOT EDIT. +//go:build linux // +build linux package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go index 19ebd3ff75f9..e37096e4decc 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go @@ -1,6 +1,7 @@ // go run mksyscall.go -l32 -tags linux,386 syscall_linux.go syscall_linux_386.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build linux && 386 // +build linux,386 package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go index 5c562182a198..9919d8486d41 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go @@ -1,6 +1,7 @@ // go run mksyscall.go -tags linux,amd64 syscall_linux.go syscall_linux_amd64.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build linux && amd64 // +build linux,amd64 package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go index dc69d99c6129..076754d48d1d 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go @@ -1,6 +1,7 @@ // go run mksyscall.go -l32 -arm -tags linux,arm syscall_linux.go syscall_linux_arm.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build linux && arm // +build linux,arm package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go index 1b897dee05d1..e893f987f91d 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go @@ -1,6 +1,7 @@ // go run mksyscall.go -tags linux,arm64 syscall_linux.go syscall_linux_arm64.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build linux && arm64 // +build linux,arm64 package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go index 49186843ae52..4703cf3c3385 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go @@ -1,6 +1,7 @@ // go run mksyscall.go -b32 -arm -tags linux,mips syscall_linux.go syscall_linux_mipsx.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build linux && mips // +build linux,mips package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go index 9171d3bd2a69..a134f9a4d2e0 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go @@ -1,6 +1,7 @@ // go run mksyscall.go -tags linux,mips64 syscall_linux.go syscall_linux_mips64x.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build linux && mips64 // +build linux,mips64 package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go index 82286f04f9a3..b1fff2d946a2 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go @@ -1,6 +1,7 @@ // go run mksyscall.go -tags linux,mips64le syscall_linux.go syscall_linux_mips64x.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build linux && mips64le // +build linux,mips64le package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go index 15920621c473..d13d6da01ef8 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go @@ -1,6 +1,7 @@ // go run mksyscall.go -l32 -arm -tags linux,mipsle syscall_linux.go syscall_linux_mipsx.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build linux && mipsle // +build linux,mipsle package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go index 73a42e2ccbaa..da8ec0396665 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go @@ -1,6 +1,7 @@ // go run mksyscall.go -tags linux,ppc64 syscall_linux.go syscall_linux_ppc64x.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build linux && ppc64 // +build linux,ppc64 package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go index 6b85595366a1..083f493bb6f4 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go @@ -1,6 +1,7 @@ // go run mksyscall.go -tags linux,ppc64le syscall_linux.go syscall_linux_ppc64x.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build linux && ppc64le // +build linux,ppc64le package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go index b76133447e8a..63b393b8027d 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go @@ -1,6 +1,7 @@ // go run mksyscall.go -tags linux,riscv64 syscall_linux.go syscall_linux_riscv64.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build linux && riscv64 // +build linux,riscv64 package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go index d7032ab1e4ad..bb347407d3d4 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go @@ -1,6 +1,7 @@ // go run mksyscall.go -tags linux,s390x syscall_linux.go syscall_linux_s390x.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build linux && s390x // +build linux,s390x package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go index bcbbdd906e8a..8edc517e1e65 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go @@ -1,6 +1,7 @@ // go run mksyscall.go -tags linux,sparc64 syscall_linux.go syscall_linux_sparc64.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build linux && sparc64 // +build linux,sparc64 package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go index 3bbd9e39cda4..4726ab30a8fa 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go @@ -1,6 +1,7 @@ // go run mksyscall.go -l32 -netbsd -tags netbsd,386 syscall_bsd.go syscall_netbsd.go syscall_netbsd_386.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build netbsd && 386 // +build netbsd,386 package unix @@ -362,6 +363,16 @@ func pipe() (fd1 int, fd2 int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Getdents(fd int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go index d8cf5012c276..fe71456dbc0f 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go @@ -1,6 +1,7 @@ // go run mksyscall.go -netbsd -tags netbsd,amd64 syscall_bsd.go syscall_netbsd.go syscall_netbsd_amd64.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build netbsd && amd64 // +build netbsd,amd64 package unix @@ -362,6 +363,16 @@ func pipe() (fd1 int, fd2 int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Getdents(fd int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go index 1153fe69b8ec..0b5b2f0143be 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go @@ -1,6 +1,7 @@ // go run mksyscall.go -l32 -netbsd -arm -tags netbsd,arm syscall_bsd.go syscall_netbsd.go syscall_netbsd_arm.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build netbsd && arm // +build netbsd,arm package unix @@ -362,6 +363,16 @@ func pipe() (fd1 int, fd2 int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Getdents(fd int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go index 24b4ebb41fa3..bfca28648fb5 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go @@ -1,6 +1,7 @@ // go run mksyscall.go -netbsd -tags netbsd,arm64 syscall_bsd.go syscall_netbsd.go syscall_netbsd_arm64.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build netbsd && arm64 // +build netbsd,arm64 package unix @@ -362,6 +363,16 @@ func pipe() (fd1 int, fd2 int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Getdents(fd int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go index b44b31aeb161..8f80f4ade511 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go @@ -1,6 +1,7 @@ // go run mksyscall.go -l32 -openbsd -tags openbsd,386 syscall_bsd.go syscall_openbsd.go syscall_openbsd_386.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build openbsd && 386 // +build openbsd,386 package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go index 67f93ee76d8c..3a47aca7bf70 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go @@ -1,6 +1,7 @@ // go run mksyscall.go -openbsd -tags openbsd,amd64 syscall_bsd.go syscall_openbsd.go syscall_openbsd_amd64.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build openbsd && amd64 // +build openbsd,amd64 package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go index d7c878b1d0a8..883a9b45e8e2 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go @@ -1,6 +1,7 @@ // go run mksyscall.go -l32 -openbsd -arm -tags openbsd,arm syscall_bsd.go syscall_openbsd.go syscall_openbsd_arm.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build openbsd && arm // +build openbsd,arm package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go index 8facd695d5ac..aac7fdc95e28 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go @@ -1,6 +1,7 @@ // go run mksyscall.go -openbsd -tags openbsd,arm64 syscall_bsd.go syscall_openbsd.go syscall_openbsd_arm64.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build openbsd && arm64 // +build openbsd,arm64 package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go index ec6bd5bb73aa..8776187462b7 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go @@ -1,6 +1,7 @@ // go run mksyscall.go -openbsd -tags openbsd,mips64 syscall_bsd.go syscall_openbsd.go syscall_openbsd_mips64.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build openbsd && mips64 // +build openbsd,mips64 package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go index 6dbb83716c23..7099f555aa4c 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go @@ -1,6 +1,7 @@ // go run mksyscall_solaris.go -tags solaris,amd64 syscall_solaris.go syscall_solaris_amd64.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build solaris && amd64 // +build solaris,amd64 package unix @@ -115,6 +116,7 @@ import ( //go:cgo_import_dynamic libc_statvfs statvfs "libc.so" //go:cgo_import_dynamic libc_symlink symlink "libc.so" //go:cgo_import_dynamic libc_sync sync "libc.so" +//go:cgo_import_dynamic libc_sysconf sysconf "libc.so" //go:cgo_import_dynamic libc_times times "libc.so" //go:cgo_import_dynamic libc_truncate truncate "libc.so" //go:cgo_import_dynamic libc_fsync fsync "libc.so" @@ -245,6 +247,7 @@ import ( //go:linkname procStatvfs libc_statvfs //go:linkname procSymlink libc_symlink //go:linkname procSync libc_sync +//go:linkname procSysconf libc_sysconf //go:linkname procTimes libc_times //go:linkname procTruncate libc_truncate //go:linkname procFsync libc_fsync @@ -376,6 +379,7 @@ var ( procStatvfs, procSymlink, procSync, + procSysconf, procTimes, procTruncate, procFsync, @@ -1687,6 +1691,17 @@ func Sync() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Sysconf(which int) (n int64, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSysconf)), 1, uintptr(which), 0, 0, 0, 0, 0) + n = int64(r0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Times(tms *Tms) (ticks uintptr, err error) { r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procTimes)), 1, uintptr(unsafe.Pointer(tms)), 0, 0, 0, 0, 0) ticks = uintptr(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_zos_s390x.go b/vendor/golang.org/x/sys/unix/zsyscall_zos_s390x.go new file mode 100644 index 000000000000..8285ab8419e2 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zsyscall_zos_s390x.go @@ -0,0 +1,1217 @@ +// go run mksyscall.go -tags zos,s390x syscall_zos_s390x.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +//go:build zos && s390x +// +build zos,s390x + +package unix + +import ( + "unsafe" +) + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := syscall_syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := syscall_syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := syscall_syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := syscall_syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := syscall_syscall(SYS___ACCEPT_A, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := syscall_syscall(SYS___BIND_A, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := syscall_syscall(SYS___CONNECT_A, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := syscall_rawsyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := syscall_rawsyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := syscall_syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := syscall_syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := syscall_rawsyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := syscall_rawsyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := syscall_rawsyscall(SYS___GETPEERNAME_A, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := syscall_rawsyscall(SYS___GETSOCKNAME_A, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := syscall_syscall6(SYS___RECVFROM_A, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := syscall_syscall6(SYS___SENDTO_A, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := syscall_syscall(SYS___RECVMSG_A, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := syscall_syscall(SYS___SENDMSG_A, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := syscall_syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos)) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := syscall_syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := syscall_syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := syscall_syscall(SYS___ACCESS_A, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := syscall_syscall(SYS___CHDIR_A, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := syscall_syscall(SYS___CHOWN_A, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := syscall_syscall(SYS___CHMOD_A, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Creat(path string, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := syscall_syscall(SYS___CREAT_A, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := syscall_syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := syscall_syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + syscall_syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := syscall_syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := syscall_syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := syscall_syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func FcntlInt(fd uintptr, cmd int, arg int) (retval int, err error) { + r0, _, e1 := syscall_syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + retval = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fstat(fd int, stat *Stat_LE_t) (err error) { + _, _, e1 := syscall_syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatvfs(fd int, stat *Statvfs_t) (err error) { + _, _, e1 := syscall_syscall(SYS_FSTATVFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := syscall_syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := syscall_syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpagesize() (pgsize int) { + r0, _, _ := syscall_syscall(SYS_GETPAGESIZE, 0, 0, 0) + pgsize = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := syscall_syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := syscall_syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Poll(fds []PollFd, timeout int) (n int, err error) { + var _p0 unsafe.Pointer + if len(fds) > 0 { + _p0 = unsafe.Pointer(&fds[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := syscall_syscall(SYS_POLL, uintptr(_p0), uintptr(len(fds)), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := syscall_syscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func W_Getmntent(buff *byte, size int) (lastsys int, err error) { + r0, _, e1 := syscall_syscall(SYS_W_GETMNTENT, uintptr(unsafe.Pointer(buff)), uintptr(size), 0) + lastsys = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mount(path string, filesystem string, fstype string, mtm uint32, parmlen int32, parm string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(filesystem) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + var _p3 *byte + _p3, err = BytePtrFromString(parm) + if err != nil { + return + } + _, _, e1 := syscall_syscall6(SYS___MOUNT_A, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(mtm), uintptr(parmlen), uintptr(unsafe.Pointer(_p3))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(filesystem string, mtm int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(filesystem) + if err != nil { + return + } + _, _, e1 := syscall_syscall(SYS___UMOUNT_A, uintptr(unsafe.Pointer(_p0)), uintptr(mtm), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := syscall_syscall(SYS___CHROOT_A, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := syscall_rawsyscall(SYS___UNAME_A, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gethostname(buf []byte) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := syscall_syscall(SYS___GETHOSTNAME_A, uintptr(_p0), uintptr(len(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := syscall_rawsyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := syscall_rawsyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := syscall_rawsyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := syscall_rawsyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := syscall_rawsyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (pid int) { + r0, _, _ := syscall_rawsyscall(SYS_GETPPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := syscall_syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := syscall_rawsyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getrusage(who int, rusage *rusage_zos) (err error) { + _, _, e1 := syscall_rawsyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := syscall_rawsyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := syscall_rawsyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig Signal) (err error) { + _, _, e1 := syscall_rawsyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := syscall_syscall(SYS___LCHOWN_A, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := syscall_syscall(SYS___LINK_A, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, n int) (err error) { + _, _, e1 := syscall_syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func lstat(path string, stat *Stat_LE_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := syscall_syscall(SYS___LSTAT_A, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := syscall_syscall(SYS___MKDIR_A, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := syscall_syscall(SYS___MKFIFO_A, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := syscall_syscall(SYS___MKNOD_A, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := syscall_syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := syscall_syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := syscall_syscall(SYS___READLINK_A, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := syscall_syscall(SYS___RENAME_A, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := syscall_syscall(SYS___RMDIR_A, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (off int64, err error) { + r0, _, e1 := syscall_syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + off = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := syscall_syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := syscall_rawsyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(resource int, lim *Rlimit) (err error) { + _, _, e1 := syscall_rawsyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := syscall_rawsyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := syscall_rawsyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := syscall_rawsyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := syscall_syscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(uid int) (err error) { + _, _, e1 := syscall_syscall(SYS_SETGID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(fd int, how int) (err error) { + _, _, e1 := syscall_syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func stat(path string, statLE *Stat_LE_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := syscall_syscall(SYS___STAT_A, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(statLE)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := syscall_syscall(SYS___SYMLINK_A, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + syscall_syscall(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := syscall_syscall(SYS___TRUNCATE_A, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tcgetattr(fildes int, termptr *Termios) (err error) { + _, _, e1 := syscall_syscall(SYS_TCGETATTR, uintptr(fildes), uintptr(unsafe.Pointer(termptr)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tcsetattr(fildes int, when int, termptr *Termios) (err error) { + _, _, e1 := syscall_syscall(SYS_TCSETATTR, uintptr(fildes), uintptr(when), uintptr(unsafe.Pointer(termptr))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _, _ := syscall_syscall(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := syscall_syscall(SYS___UNLINK_A, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Utime(path string, utim *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := syscall_syscall(SYS___UTIME_A, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(utim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := syscall_syscall(SYS___OPEN_A, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func remove(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := syscall_syscall(SYS_REMOVE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func waitpid(pid int, wstatus *_C_int, options int) (wpid int, err error) { + r0, _, e1 := syscall_syscall(SYS_WAITPID, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options)) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func gettimeofday(tv *timeval_zos) (err error) { + _, _, e1 := syscall_rawsyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]_C_int) (err error) { + _, _, e1 := syscall_rawsyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := syscall_syscall(SYS___UTIMES_A, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go index 102f1ab4750b..9e9d0b2a9c45 100644 --- a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go @@ -1,6 +1,7 @@ // go run mksysctl_openbsd.go // Code generated by the command above; DO NOT EDIT. +//go:build 386 && openbsd // +build 386,openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go index 4866fced8ae8..adecd09667d0 100644 --- a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go @@ -1,6 +1,7 @@ // go run mksysctl_openbsd.go // Code generated by the command above; DO NOT EDIT. +//go:build amd64 && openbsd // +build amd64,openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go index d3801eb24b38..8ea52a4a1810 100644 --- a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go @@ -1,6 +1,7 @@ // go run mksysctl_openbsd.go // Code generated by the command above; DO NOT EDIT. +//go:build arm && openbsd // +build arm,openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm64.go b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm64.go index ba4304fd2338..154b57ae3e2a 100644 --- a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm64.go @@ -1,6 +1,7 @@ // go run mksysctl_openbsd.go // Code generated by the command above; DO NOT EDIT. +//go:build arm64 && openbsd // +build arm64,openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_mips64.go b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_mips64.go index aca34b349337..d96bb2ba4db6 100644 --- a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_mips64.go +++ b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_mips64.go @@ -1,6 +1,7 @@ // go run mksysctl_openbsd.go // Code generated by the command above; DO NOT EDIT. +//go:build mips64 && openbsd // +build mips64,openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/zsysnum_darwin_386.go b/vendor/golang.org/x/sys/unix/zsysnum_darwin_386.go index ad62324c7c14..1794ffc92455 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_darwin_386.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_darwin_386.go @@ -1,6 +1,7 @@ // go run mksysnum.go /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/usr/include/sys/syscall.h // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build 386 && darwin // +build 386,darwin package unix diff --git a/vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go b/vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go index a2fc91d6a800..f8298ff9b58a 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go @@ -1,6 +1,7 @@ // go run mksysnum.go /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/usr/include/sys/syscall.h // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build amd64 && darwin // +build amd64,darwin package unix diff --git a/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm.go b/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm.go index 20d7808ace3d..6dc736449a5b 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm.go @@ -1,6 +1,7 @@ // go run mksysnum.go /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.1.sdk/usr/include/sys/syscall.h // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build arm && darwin // +build arm,darwin package unix diff --git a/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go b/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go index 527b9588cc96..5eb433bbf010 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go @@ -1,6 +1,7 @@ // go run mksysnum.go /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.1.sdk/usr/include/sys/syscall.h // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build arm64 && darwin // +build arm64,darwin package unix diff --git a/vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go b/vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go index 9912c6ee3d6a..703675c0c4a5 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go @@ -1,6 +1,7 @@ // go run mksysnum.go https://gitweb.dragonflybsd.org/dragonfly.git/blob_plain/HEAD:/sys/kern/syscalls.master // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build amd64 && dragonfly // +build amd64,dragonfly package unix diff --git a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go index 9474974b657d..59d5dfc20922 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go @@ -1,6 +1,7 @@ // go run mksysnum.go https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build 386 && freebsd // +build 386,freebsd package unix diff --git a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go index 48a7beae7bb5..342d471d2eb1 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go @@ -1,6 +1,7 @@ // go run mksysnum.go https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build amd64 && freebsd // +build amd64,freebsd package unix diff --git a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go index 4a6dfd4a7459..e2e3d72c5b04 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go @@ -1,6 +1,7 @@ // go run mksysnum.go https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build arm && freebsd // +build arm,freebsd package unix diff --git a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm64.go index 3e51af8edd21..61ad5ca3c19b 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm64.go @@ -1,6 +1,7 @@ // go run mksysnum.go https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build arm64 && freebsd // +build arm64,freebsd package unix diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go index f6742bdee090..8e5359713489 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go @@ -1,6 +1,7 @@ // go run linux/mksysnum.go -Wall -Werror -static -I/tmp/include -m32 /tmp/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build 386 && linux // +build 386,linux package unix @@ -436,4 +437,5 @@ const ( SYS_PIDFD_GETFD = 438 SYS_FACCESSAT2 = 439 SYS_PROCESS_MADVISE = 440 + SYS_EPOLL_PWAIT2 = 441 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go index f7e525573bf2..d7dceb769b3f 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go @@ -1,6 +1,7 @@ // go run linux/mksysnum.go -Wall -Werror -static -I/tmp/include -m64 /tmp/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build amd64 && linux // +build amd64,linux package unix @@ -358,4 +359,5 @@ const ( SYS_PIDFD_GETFD = 438 SYS_FACCESSAT2 = 439 SYS_PROCESS_MADVISE = 440 + SYS_EPOLL_PWAIT2 = 441 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go index 3f60977da678..04093a69fd8a 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go @@ -1,6 +1,7 @@ // go run linux/mksysnum.go -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build arm && linux // +build arm,linux package unix @@ -400,4 +401,5 @@ const ( SYS_PIDFD_GETFD = 438 SYS_FACCESSAT2 = 439 SYS_PROCESS_MADVISE = 440 + SYS_EPOLL_PWAIT2 = 441 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go index dbedf4cbaccc..48f94f135d6d 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go @@ -1,6 +1,7 @@ // go run linux/mksysnum.go -Wall -Werror -static -I/tmp/include -fsigned-char /tmp/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build arm64 && linux // +build arm64,linux package unix @@ -303,4 +304,5 @@ const ( SYS_PIDFD_GETFD = 438 SYS_FACCESSAT2 = 439 SYS_PROCESS_MADVISE = 440 + SYS_EPOLL_PWAIT2 = 441 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go index eeff7e1dc930..499978c3e402 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go @@ -1,6 +1,7 @@ // go run linux/mksysnum.go -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build mips && linux // +build mips,linux package unix @@ -421,4 +422,5 @@ const ( SYS_PIDFD_GETFD = 4438 SYS_FACCESSAT2 = 4439 SYS_PROCESS_MADVISE = 4440 + SYS_EPOLL_PWAIT2 = 4441 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go index 73cfa535cd69..10d1db2be0ce 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go @@ -1,6 +1,7 @@ // go run linux/mksysnum.go -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build mips64 && linux // +build mips64,linux package unix @@ -351,4 +352,5 @@ const ( SYS_PIDFD_GETFD = 5438 SYS_FACCESSAT2 = 5439 SYS_PROCESS_MADVISE = 5440 + SYS_EPOLL_PWAIT2 = 5441 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go index be74729e0cb3..208d5dcd5a32 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go @@ -1,6 +1,7 @@ // go run linux/mksysnum.go -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build mips64le && linux // +build mips64le,linux package unix @@ -351,4 +352,5 @@ const ( SYS_PIDFD_GETFD = 5438 SYS_FACCESSAT2 = 5439 SYS_PROCESS_MADVISE = 5440 + SYS_EPOLL_PWAIT2 = 5441 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go index 2a1047c818c8..f8250602eb8e 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go @@ -1,6 +1,7 @@ // go run linux/mksysnum.go -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build mipsle && linux // +build mipsle,linux package unix @@ -421,4 +422,5 @@ const ( SYS_PIDFD_GETFD = 4438 SYS_FACCESSAT2 = 4439 SYS_PROCESS_MADVISE = 4440 + SYS_EPOLL_PWAIT2 = 4441 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go index 32707428ce27..d5ed3ff5100e 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go @@ -1,6 +1,7 @@ // go run linux/mksysnum.go -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build ppc64 && linux // +build ppc64,linux package unix @@ -400,4 +401,5 @@ const ( SYS_PIDFD_GETFD = 438 SYS_FACCESSAT2 = 439 SYS_PROCESS_MADVISE = 440 + SYS_EPOLL_PWAIT2 = 441 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go index a58572f78108..e29b4424c245 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go @@ -1,6 +1,7 @@ // go run linux/mksysnum.go -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build ppc64le && linux // +build ppc64le,linux package unix @@ -400,4 +401,5 @@ const ( SYS_PIDFD_GETFD = 438 SYS_FACCESSAT2 = 439 SYS_PROCESS_MADVISE = 440 + SYS_EPOLL_PWAIT2 = 441 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go index 72a65b76026a..41deed6c3a57 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go @@ -1,6 +1,7 @@ // go run linux/mksysnum.go -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build riscv64 && linux // +build riscv64,linux package unix @@ -302,4 +303,5 @@ const ( SYS_PIDFD_GETFD = 438 SYS_FACCESSAT2 = 439 SYS_PROCESS_MADVISE = 440 + SYS_EPOLL_PWAIT2 = 441 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go index 1fb9ae5d4932..8e53a9e8ceb6 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go @@ -1,6 +1,7 @@ // go run linux/mksysnum.go -Wall -Werror -static -I/tmp/include -fsigned-char /tmp/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build s390x && linux // +build s390x,linux package unix @@ -365,4 +366,5 @@ const ( SYS_PIDFD_GETFD = 438 SYS_FACCESSAT2 = 439 SYS_PROCESS_MADVISE = 440 + SYS_EPOLL_PWAIT2 = 441 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go index 57636e09e41b..596e5bc7d357 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go @@ -1,6 +1,7 @@ // go run linux/mksysnum.go -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build sparc64 && linux // +build sparc64,linux package unix @@ -379,4 +380,5 @@ const ( SYS_PIDFD_GETFD = 438 SYS_FACCESSAT2 = 439 SYS_PROCESS_MADVISE = 440 + SYS_EPOLL_PWAIT2 = 441 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go b/vendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go index e66a8c9d39ea..3a6699eba982 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go @@ -1,6 +1,7 @@ // go run mksysnum.go http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build 386 && netbsd // +build 386,netbsd package unix diff --git a/vendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go index 42c788f2490c..5677cd4f1584 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go @@ -1,6 +1,7 @@ // go run mksysnum.go http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build amd64 && netbsd // +build amd64,netbsd package unix diff --git a/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go b/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go index 0a0757179ba4..e784cb6db1c2 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go @@ -1,6 +1,7 @@ // go run mksysnum.go http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build arm && netbsd // +build arm,netbsd package unix diff --git a/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm64.go b/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm64.go index 0291c0931b4f..bd4952efa5bd 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm64.go @@ -1,6 +1,7 @@ // go run mksysnum.go http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master // Code generated by the command above; DO NOT EDIT. +//go:build arm64 && netbsd // +build arm64,netbsd package unix diff --git a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go index b0207d1c9bbc..817edbf95c0a 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go @@ -1,6 +1,7 @@ // go run mksysnum.go https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build 386 && openbsd // +build 386,openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go index f0dec6f0b43c..ea453614e697 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go @@ -1,6 +1,7 @@ // go run mksysnum.go https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build amd64 && openbsd // +build amd64,openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go index 33d1dc5404e4..467971eed661 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go @@ -1,6 +1,7 @@ // go run mksysnum.go https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build arm && openbsd // +build arm,openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm64.go b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm64.go index fe2b689b6375..32eec5ed56f1 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm64.go @@ -1,6 +1,7 @@ // go run mksysnum.go https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build arm64 && openbsd // +build arm64,openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_mips64.go b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_mips64.go index 5c08d573b3ee..a37f77375636 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_mips64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_mips64.go @@ -1,6 +1,7 @@ // go run mksysnum.go https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build mips64 && openbsd // +build mips64,openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/zsysnum_zos_s390x.go b/vendor/golang.org/x/sys/unix/zsysnum_zos_s390x.go new file mode 100644 index 000000000000..073daad43b7a --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zsysnum_zos_s390x.go @@ -0,0 +1,2670 @@ +// Copyright 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build zos && s390x +// +build zos,s390x + +package unix + +// TODO: auto-generate. + +const ( + SYS_ACOSD128 = 0xB80 + SYS_ACOSD32 = 0xB7E + SYS_ACOSD64 = 0xB7F + SYS_ACOSHD128 = 0xB83 + SYS_ACOSHD32 = 0xB81 + SYS_ACOSHD64 = 0xB82 + SYS_AIO_FSYNC = 0xC69 + SYS_ASCTIME = 0x0AE + SYS_ASCTIME64 = 0xCD7 + SYS_ASCTIME64_R = 0xCD8 + SYS_ASIND128 = 0xB86 + SYS_ASIND32 = 0xB84 + SYS_ASIND64 = 0xB85 + SYS_ASINHD128 = 0xB89 + SYS_ASINHD32 = 0xB87 + SYS_ASINHD64 = 0xB88 + SYS_ATAN2D128 = 0xB8F + SYS_ATAN2D32 = 0xB8D + SYS_ATAN2D64 = 0xB8E + SYS_ATAND128 = 0xB8C + SYS_ATAND32 = 0xB8A + SYS_ATAND64 = 0xB8B + SYS_ATANHD128 = 0xB92 + SYS_ATANHD32 = 0xB90 + SYS_ATANHD64 = 0xB91 + SYS_BIND2ADDRSEL = 0xD59 + SYS_C16RTOMB = 0xD40 + SYS_C32RTOMB = 0xD41 + SYS_CBRTD128 = 0xB95 + SYS_CBRTD32 = 0xB93 + SYS_CBRTD64 = 0xB94 + SYS_CEILD128 = 0xB98 + SYS_CEILD32 = 0xB96 + SYS_CEILD64 = 0xB97 + SYS_CLEARENV = 0x0C9 + SYS_CLEARERR_UNLOCKED = 0xCA1 + SYS_CLOCK = 0x0AA + SYS_CLOGL = 0xA00 + SYS_CLRMEMF = 0x0BD + SYS_CONJ = 0xA03 + SYS_CONJF = 0xA06 + SYS_CONJL = 0xA09 + SYS_COPYSIGND128 = 0xB9E + SYS_COPYSIGND32 = 0xB9C + SYS_COPYSIGND64 = 0xB9D + SYS_COSD128 = 0xBA1 + SYS_COSD32 = 0xB9F + SYS_COSD64 = 0xBA0 + SYS_COSHD128 = 0xBA4 + SYS_COSHD32 = 0xBA2 + SYS_COSHD64 = 0xBA3 + SYS_CPOW = 0xA0C + SYS_CPOWF = 0xA0F + SYS_CPOWL = 0xA12 + SYS_CPROJ = 0xA15 + SYS_CPROJF = 0xA18 + SYS_CPROJL = 0xA1B + SYS_CREAL = 0xA1E + SYS_CREALF = 0xA21 + SYS_CREALL = 0xA24 + SYS_CSIN = 0xA27 + SYS_CSINF = 0xA2A + SYS_CSINH = 0xA30 + SYS_CSINHF = 0xA33 + SYS_CSINHL = 0xA36 + SYS_CSINL = 0xA2D + SYS_CSNAP = 0x0C5 + SYS_CSQRT = 0xA39 + SYS_CSQRTF = 0xA3C + SYS_CSQRTL = 0xA3F + SYS_CTAN = 0xA42 + SYS_CTANF = 0xA45 + SYS_CTANH = 0xA4B + SYS_CTANHF = 0xA4E + SYS_CTANHL = 0xA51 + SYS_CTANL = 0xA48 + SYS_CTIME = 0x0AB + SYS_CTIME64 = 0xCD9 + SYS_CTIME64_R = 0xCDA + SYS_CTRACE = 0x0C6 + SYS_DIFFTIME = 0x0A7 + SYS_DIFFTIME64 = 0xCDB + SYS_DLADDR = 0xC82 + SYS_DYNALLOC = 0x0C3 + SYS_DYNFREE = 0x0C2 + SYS_ERFCD128 = 0xBAA + SYS_ERFCD32 = 0xBA8 + SYS_ERFCD64 = 0xBA9 + SYS_ERFD128 = 0xBA7 + SYS_ERFD32 = 0xBA5 + SYS_ERFD64 = 0xBA6 + SYS_EXP2D128 = 0xBB0 + SYS_EXP2D32 = 0xBAE + SYS_EXP2D64 = 0xBAF + SYS_EXPD128 = 0xBAD + SYS_EXPD32 = 0xBAB + SYS_EXPD64 = 0xBAC + SYS_EXPM1D128 = 0xBB3 + SYS_EXPM1D32 = 0xBB1 + SYS_EXPM1D64 = 0xBB2 + SYS_FABSD128 = 0xBB6 + SYS_FABSD32 = 0xBB4 + SYS_FABSD64 = 0xBB5 + SYS_FDELREC_UNLOCKED = 0xCA2 + SYS_FDIMD128 = 0xBB9 + SYS_FDIMD32 = 0xBB7 + SYS_FDIMD64 = 0xBB8 + SYS_FDOPEN_UNLOCKED = 0xCFC + SYS_FECLEAREXCEPT = 0xAEA + SYS_FEGETENV = 0xAEB + SYS_FEGETEXCEPTFLAG = 0xAEC + SYS_FEGETROUND = 0xAED + SYS_FEHOLDEXCEPT = 0xAEE + SYS_FEOF_UNLOCKED = 0xCA3 + SYS_FERAISEEXCEPT = 0xAEF + SYS_FERROR_UNLOCKED = 0xCA4 + SYS_FESETENV = 0xAF0 + SYS_FESETEXCEPTFLAG = 0xAF1 + SYS_FESETROUND = 0xAF2 + SYS_FETCHEP = 0x0BF + SYS_FETESTEXCEPT = 0xAF3 + SYS_FEUPDATEENV = 0xAF4 + SYS_FE_DEC_GETROUND = 0xBBA + SYS_FE_DEC_SETROUND = 0xBBB + SYS_FFLUSH_UNLOCKED = 0xCA5 + SYS_FGETC_UNLOCKED = 0xC80 + SYS_FGETPOS64 = 0xCEE + SYS_FGETPOS64_UNLOCKED = 0xCF4 + SYS_FGETPOS_UNLOCKED = 0xCA6 + SYS_FGETS_UNLOCKED = 0xC7C + SYS_FGETWC_UNLOCKED = 0xCA7 + SYS_FGETWS_UNLOCKED = 0xCA8 + SYS_FILENO_UNLOCKED = 0xCA9 + SYS_FLDATA = 0x0C1 + SYS_FLDATA_UNLOCKED = 0xCAA + SYS_FLOCATE_UNLOCKED = 0xCAB + SYS_FLOORD128 = 0xBBE + SYS_FLOORD32 = 0xBBC + SYS_FLOORD64 = 0xBBD + SYS_FMA = 0xA63 + SYS_FMAD128 = 0xBC1 + SYS_FMAD32 = 0xBBF + SYS_FMAD64 = 0xBC0 + SYS_FMAF = 0xA66 + SYS_FMAL = 0xA69 + SYS_FMAX = 0xA6C + SYS_FMAXD128 = 0xBC4 + SYS_FMAXD32 = 0xBC2 + SYS_FMAXD64 = 0xBC3 + SYS_FMAXF = 0xA6F + SYS_FMAXL = 0xA72 + SYS_FMIN = 0xA75 + SYS_FMIND128 = 0xBC7 + SYS_FMIND32 = 0xBC5 + SYS_FMIND64 = 0xBC6 + SYS_FMINF = 0xA78 + SYS_FMINL = 0xA7B + SYS_FMODD128 = 0xBCA + SYS_FMODD32 = 0xBC8 + SYS_FMODD64 = 0xBC9 + SYS_FOPEN64 = 0xD49 + SYS_FOPEN64_UNLOCKED = 0xD4A + SYS_FOPEN_UNLOCKED = 0xCFA + SYS_FPRINTF_UNLOCKED = 0xCAC + SYS_FPUTC_UNLOCKED = 0xC81 + SYS_FPUTS_UNLOCKED = 0xC7E + SYS_FPUTWC_UNLOCKED = 0xCAD + SYS_FPUTWS_UNLOCKED = 0xCAE + SYS_FREAD_NOUPDATE = 0xCEC + SYS_FREAD_NOUPDATE_UNLOCKED = 0xCED + SYS_FREAD_UNLOCKED = 0xC7B + SYS_FREEIFADDRS = 0xCE6 + SYS_FREOPEN64 = 0xD4B + SYS_FREOPEN64_UNLOCKED = 0xD4C + SYS_FREOPEN_UNLOCKED = 0xCFB + SYS_FREXPD128 = 0xBCE + SYS_FREXPD32 = 0xBCC + SYS_FREXPD64 = 0xBCD + SYS_FSCANF_UNLOCKED = 0xCAF + SYS_FSEEK64 = 0xCEF + SYS_FSEEK64_UNLOCKED = 0xCF5 + SYS_FSEEKO64 = 0xCF0 + SYS_FSEEKO64_UNLOCKED = 0xCF6 + SYS_FSEEKO_UNLOCKED = 0xCB1 + SYS_FSEEK_UNLOCKED = 0xCB0 + SYS_FSETPOS64 = 0xCF1 + SYS_FSETPOS64_UNLOCKED = 0xCF7 + SYS_FSETPOS_UNLOCKED = 0xCB3 + SYS_FTELL64 = 0xCF2 + SYS_FTELL64_UNLOCKED = 0xCF8 + SYS_FTELLO64 = 0xCF3 + SYS_FTELLO64_UNLOCKED = 0xCF9 + SYS_FTELLO_UNLOCKED = 0xCB5 + SYS_FTELL_UNLOCKED = 0xCB4 + SYS_FUPDATE = 0x0B5 + SYS_FUPDATE_UNLOCKED = 0xCB7 + SYS_FWIDE_UNLOCKED = 0xCB8 + SYS_FWPRINTF_UNLOCKED = 0xCB9 + SYS_FWRITE_UNLOCKED = 0xC7A + SYS_FWSCANF_UNLOCKED = 0xCBA + SYS_GETDATE64 = 0xD4F + SYS_GETIFADDRS = 0xCE7 + SYS_GETIPV4SOURCEFILTER = 0xC77 + SYS_GETSOURCEFILTER = 0xC79 + SYS_GETSYNTX = 0x0FD + SYS_GETS_UNLOCKED = 0xC7D + SYS_GETTIMEOFDAY64 = 0xD50 + SYS_GETWCHAR_UNLOCKED = 0xCBC + SYS_GETWC_UNLOCKED = 0xCBB + SYS_GMTIME = 0x0B0 + SYS_GMTIME64 = 0xCDC + SYS_GMTIME64_R = 0xCDD + SYS_HYPOTD128 = 0xBD1 + SYS_HYPOTD32 = 0xBCF + SYS_HYPOTD64 = 0xBD0 + SYS_ILOGBD128 = 0xBD4 + SYS_ILOGBD32 = 0xBD2 + SYS_ILOGBD64 = 0xBD3 + SYS_ILOGBF = 0xA7E + SYS_ILOGBL = 0xA81 + SYS_INET6_IS_SRCADDR = 0xD5A + SYS_ISBLANK = 0x0FE + SYS_ISWALNUM = 0x0FF + SYS_LDEXPD128 = 0xBD7 + SYS_LDEXPD32 = 0xBD5 + SYS_LDEXPD64 = 0xBD6 + SYS_LGAMMAD128 = 0xBDA + SYS_LGAMMAD32 = 0xBD8 + SYS_LGAMMAD64 = 0xBD9 + SYS_LIO_LISTIO = 0xC6A + SYS_LLRINT = 0xA84 + SYS_LLRINTD128 = 0xBDD + SYS_LLRINTD32 = 0xBDB + SYS_LLRINTD64 = 0xBDC + SYS_LLRINTF = 0xA87 + SYS_LLRINTL = 0xA8A + SYS_LLROUND = 0xA8D + SYS_LLROUNDD128 = 0xBE0 + SYS_LLROUNDD32 = 0xBDE + SYS_LLROUNDD64 = 0xBDF + SYS_LLROUNDF = 0xA90 + SYS_LLROUNDL = 0xA93 + SYS_LOCALTIM = 0x0B1 + SYS_LOCALTIME = 0x0B1 + SYS_LOCALTIME64 = 0xCDE + SYS_LOCALTIME64_R = 0xCDF + SYS_LOG10D128 = 0xBE6 + SYS_LOG10D32 = 0xBE4 + SYS_LOG10D64 = 0xBE5 + SYS_LOG1PD128 = 0xBE9 + SYS_LOG1PD32 = 0xBE7 + SYS_LOG1PD64 = 0xBE8 + SYS_LOG2D128 = 0xBEC + SYS_LOG2D32 = 0xBEA + SYS_LOG2D64 = 0xBEB + SYS_LOGBD128 = 0xBEF + SYS_LOGBD32 = 0xBED + SYS_LOGBD64 = 0xBEE + SYS_LOGBF = 0xA96 + SYS_LOGBL = 0xA99 + SYS_LOGD128 = 0xBE3 + SYS_LOGD32 = 0xBE1 + SYS_LOGD64 = 0xBE2 + SYS_LRINT = 0xA9C + SYS_LRINTD128 = 0xBF2 + SYS_LRINTD32 = 0xBF0 + SYS_LRINTD64 = 0xBF1 + SYS_LRINTF = 0xA9F + SYS_LRINTL = 0xAA2 + SYS_LROUNDD128 = 0xBF5 + SYS_LROUNDD32 = 0xBF3 + SYS_LROUNDD64 = 0xBF4 + SYS_LROUNDL = 0xAA5 + SYS_MBLEN = 0x0AF + SYS_MBRTOC16 = 0xD42 + SYS_MBRTOC32 = 0xD43 + SYS_MEMSET = 0x0A3 + SYS_MKTIME = 0x0AC + SYS_MKTIME64 = 0xCE0 + SYS_MODFD128 = 0xBF8 + SYS_MODFD32 = 0xBF6 + SYS_MODFD64 = 0xBF7 + SYS_NAN = 0xAA8 + SYS_NAND128 = 0xBFB + SYS_NAND32 = 0xBF9 + SYS_NAND64 = 0xBFA + SYS_NANF = 0xAAA + SYS_NANL = 0xAAC + SYS_NEARBYINT = 0xAAE + SYS_NEARBYINTD128 = 0xBFE + SYS_NEARBYINTD32 = 0xBFC + SYS_NEARBYINTD64 = 0xBFD + SYS_NEARBYINTF = 0xAB1 + SYS_NEARBYINTL = 0xAB4 + SYS_NEXTAFTERD128 = 0xC01 + SYS_NEXTAFTERD32 = 0xBFF + SYS_NEXTAFTERD64 = 0xC00 + SYS_NEXTAFTERF = 0xAB7 + SYS_NEXTAFTERL = 0xABA + SYS_NEXTTOWARD = 0xABD + SYS_NEXTTOWARDD128 = 0xC04 + SYS_NEXTTOWARDD32 = 0xC02 + SYS_NEXTTOWARDD64 = 0xC03 + SYS_NEXTTOWARDF = 0xAC0 + SYS_NEXTTOWARDL = 0xAC3 + SYS_NL_LANGINFO = 0x0FC + SYS_PERROR_UNLOCKED = 0xCBD + SYS_POSIX_FALLOCATE = 0xCE8 + SYS_POSIX_MEMALIGN = 0xCE9 + SYS_POSIX_OPENPT = 0xC66 + SYS_POWD128 = 0xC07 + SYS_POWD32 = 0xC05 + SYS_POWD64 = 0xC06 + SYS_PRINTF_UNLOCKED = 0xCBE + SYS_PSELECT = 0xC67 + SYS_PTHREAD_ATTR_GETSTACK = 0xB3E + SYS_PTHREAD_ATTR_SETSTACK = 0xB3F + SYS_PTHREAD_SECURITY_APPLID_NP = 0xCE4 + SYS_PUTS_UNLOCKED = 0xC7F + SYS_PUTWCHAR_UNLOCKED = 0xCC0 + SYS_PUTWC_UNLOCKED = 0xCBF + SYS_QUANTEXPD128 = 0xD46 + SYS_QUANTEXPD32 = 0xD44 + SYS_QUANTEXPD64 = 0xD45 + SYS_QUANTIZED128 = 0xC0A + SYS_QUANTIZED32 = 0xC08 + SYS_QUANTIZED64 = 0xC09 + SYS_REMAINDERD128 = 0xC0D + SYS_REMAINDERD32 = 0xC0B + SYS_REMAINDERD64 = 0xC0C + SYS_RESIZE_ALLOC = 0xCEB + SYS_REWIND_UNLOCKED = 0xCC1 + SYS_RINTD128 = 0xC13 + SYS_RINTD32 = 0xC11 + SYS_RINTD64 = 0xC12 + SYS_RINTF = 0xACB + SYS_RINTL = 0xACD + SYS_ROUND = 0xACF + SYS_ROUNDD128 = 0xC16 + SYS_ROUNDD32 = 0xC14 + SYS_ROUNDD64 = 0xC15 + SYS_ROUNDF = 0xAD2 + SYS_ROUNDL = 0xAD5 + SYS_SAMEQUANTUMD128 = 0xC19 + SYS_SAMEQUANTUMD32 = 0xC17 + SYS_SAMEQUANTUMD64 = 0xC18 + SYS_SCALBLN = 0xAD8 + SYS_SCALBLND128 = 0xC1C + SYS_SCALBLND32 = 0xC1A + SYS_SCALBLND64 = 0xC1B + SYS_SCALBLNF = 0xADB + SYS_SCALBLNL = 0xADE + SYS_SCALBND128 = 0xC1F + SYS_SCALBND32 = 0xC1D + SYS_SCALBND64 = 0xC1E + SYS_SCALBNF = 0xAE3 + SYS_SCALBNL = 0xAE6 + SYS_SCANF_UNLOCKED = 0xCC2 + SYS_SCHED_YIELD = 0xB32 + SYS_SETENV = 0x0C8 + SYS_SETIPV4SOURCEFILTER = 0xC76 + SYS_SETSOURCEFILTER = 0xC78 + SYS_SHM_OPEN = 0xC8C + SYS_SHM_UNLINK = 0xC8D + SYS_SIND128 = 0xC22 + SYS_SIND32 = 0xC20 + SYS_SIND64 = 0xC21 + SYS_SINHD128 = 0xC25 + SYS_SINHD32 = 0xC23 + SYS_SINHD64 = 0xC24 + SYS_SIZEOF_ALLOC = 0xCEA + SYS_SOCKATMARK = 0xC68 + SYS_SQRTD128 = 0xC28 + SYS_SQRTD32 = 0xC26 + SYS_SQRTD64 = 0xC27 + SYS_STRCHR = 0x0A0 + SYS_STRCSPN = 0x0A1 + SYS_STRERROR = 0x0A8 + SYS_STRERROR_R = 0xB33 + SYS_STRFTIME = 0x0B2 + SYS_STRLEN = 0x0A9 + SYS_STRPBRK = 0x0A2 + SYS_STRSPN = 0x0A4 + SYS_STRSTR = 0x0A5 + SYS_STRTOD128 = 0xC2B + SYS_STRTOD32 = 0xC29 + SYS_STRTOD64 = 0xC2A + SYS_STRTOK = 0x0A6 + SYS_TAND128 = 0xC2E + SYS_TAND32 = 0xC2C + SYS_TAND64 = 0xC2D + SYS_TANHD128 = 0xC31 + SYS_TANHD32 = 0xC2F + SYS_TANHD64 = 0xC30 + SYS_TGAMMAD128 = 0xC34 + SYS_TGAMMAD32 = 0xC32 + SYS_TGAMMAD64 = 0xC33 + SYS_TIME = 0x0AD + SYS_TIME64 = 0xCE1 + SYS_TMPFILE64 = 0xD4D + SYS_TMPFILE64_UNLOCKED = 0xD4E + SYS_TMPFILE_UNLOCKED = 0xCFD + SYS_TRUNCD128 = 0xC40 + SYS_TRUNCD32 = 0xC3E + SYS_TRUNCD64 = 0xC3F + SYS_UNGETC_UNLOCKED = 0xCC3 + SYS_UNGETWC_UNLOCKED = 0xCC4 + SYS_UNSETENV = 0xB34 + SYS_VFPRINTF_UNLOCKED = 0xCC5 + SYS_VFSCANF_UNLOCKED = 0xCC7 + SYS_VFWPRINTF_UNLOCKED = 0xCC9 + SYS_VFWSCANF_UNLOCKED = 0xCCB + SYS_VPRINTF_UNLOCKED = 0xCCD + SYS_VSCANF_UNLOCKED = 0xCCF + SYS_VWPRINTF_UNLOCKED = 0xCD1 + SYS_VWSCANF_UNLOCKED = 0xCD3 + SYS_WCSTOD128 = 0xC43 + SYS_WCSTOD32 = 0xC41 + SYS_WCSTOD64 = 0xC42 + SYS_WPRINTF_UNLOCKED = 0xCD5 + SYS_WSCANF_UNLOCKED = 0xCD6 + SYS__FLUSHLBF = 0xD68 + SYS__FLUSHLBF_UNLOCKED = 0xD6F + SYS___ACOSHF_H = 0xA54 + SYS___ACOSHL_H = 0xA55 + SYS___ASINHF_H = 0xA56 + SYS___ASINHL_H = 0xA57 + SYS___ATANPID128 = 0xC6D + SYS___ATANPID32 = 0xC6B + SYS___ATANPID64 = 0xC6C + SYS___CBRTF_H = 0xA58 + SYS___CBRTL_H = 0xA59 + SYS___CDUMP = 0x0C4 + SYS___CLASS = 0xAFA + SYS___CLASS2 = 0xB99 + SYS___CLASS2D128 = 0xC99 + SYS___CLASS2D32 = 0xC97 + SYS___CLASS2D64 = 0xC98 + SYS___CLASS2F = 0xC91 + SYS___CLASS2F_B = 0xC93 + SYS___CLASS2F_H = 0xC94 + SYS___CLASS2L = 0xC92 + SYS___CLASS2L_B = 0xC95 + SYS___CLASS2L_H = 0xC96 + SYS___CLASS2_B = 0xB9A + SYS___CLASS2_H = 0xB9B + SYS___CLASS_B = 0xAFB + SYS___CLASS_H = 0xAFC + SYS___CLOGL_B = 0xA01 + SYS___CLOGL_H = 0xA02 + SYS___CLRENV = 0x0C9 + SYS___CLRMF = 0x0BD + SYS___CODEPAGE_INFO = 0xC64 + SYS___CONJF_B = 0xA07 + SYS___CONJF_H = 0xA08 + SYS___CONJL_B = 0xA0A + SYS___CONJL_H = 0xA0B + SYS___CONJ_B = 0xA04 + SYS___CONJ_H = 0xA05 + SYS___COPYSIGN_B = 0xA5A + SYS___COPYSIGN_H = 0xAF5 + SYS___COSPID128 = 0xC70 + SYS___COSPID32 = 0xC6E + SYS___COSPID64 = 0xC6F + SYS___CPOWF_B = 0xA10 + SYS___CPOWF_H = 0xA11 + SYS___CPOWL_B = 0xA13 + SYS___CPOWL_H = 0xA14 + SYS___CPOW_B = 0xA0D + SYS___CPOW_H = 0xA0E + SYS___CPROJF_B = 0xA19 + SYS___CPROJF_H = 0xA1A + SYS___CPROJL_B = 0xA1C + SYS___CPROJL_H = 0xA1D + SYS___CPROJ_B = 0xA16 + SYS___CPROJ_H = 0xA17 + SYS___CREALF_B = 0xA22 + SYS___CREALF_H = 0xA23 + SYS___CREALL_B = 0xA25 + SYS___CREALL_H = 0xA26 + SYS___CREAL_B = 0xA1F + SYS___CREAL_H = 0xA20 + SYS___CSINF_B = 0xA2B + SYS___CSINF_H = 0xA2C + SYS___CSINHF_B = 0xA34 + SYS___CSINHF_H = 0xA35 + SYS___CSINHL_B = 0xA37 + SYS___CSINHL_H = 0xA38 + SYS___CSINH_B = 0xA31 + SYS___CSINH_H = 0xA32 + SYS___CSINL_B = 0xA2E + SYS___CSINL_H = 0xA2F + SYS___CSIN_B = 0xA28 + SYS___CSIN_H = 0xA29 + SYS___CSNAP = 0x0C5 + SYS___CSQRTF_B = 0xA3D + SYS___CSQRTF_H = 0xA3E + SYS___CSQRTL_B = 0xA40 + SYS___CSQRTL_H = 0xA41 + SYS___CSQRT_B = 0xA3A + SYS___CSQRT_H = 0xA3B + SYS___CTANF_B = 0xA46 + SYS___CTANF_H = 0xA47 + SYS___CTANHF_B = 0xA4F + SYS___CTANHF_H = 0xA50 + SYS___CTANHL_B = 0xA52 + SYS___CTANHL_H = 0xA53 + SYS___CTANH_B = 0xA4C + SYS___CTANH_H = 0xA4D + SYS___CTANL_B = 0xA49 + SYS___CTANL_H = 0xA4A + SYS___CTAN_B = 0xA43 + SYS___CTAN_H = 0xA44 + SYS___CTEST = 0x0C7 + SYS___CTRACE = 0x0C6 + SYS___D1TOP = 0xC9B + SYS___D2TOP = 0xC9C + SYS___D4TOP = 0xC9D + SYS___DYNALL = 0x0C3 + SYS___DYNFRE = 0x0C2 + SYS___EXP2F_H = 0xA5E + SYS___EXP2L_H = 0xA5F + SYS___EXP2_H = 0xA5D + SYS___EXPM1F_H = 0xA5B + SYS___EXPM1L_H = 0xA5C + SYS___FBUFSIZE = 0xD60 + SYS___FLBF = 0xD62 + SYS___FLDATA = 0x0C1 + SYS___FMAF_B = 0xA67 + SYS___FMAF_H = 0xA68 + SYS___FMAL_B = 0xA6A + SYS___FMAL_H = 0xA6B + SYS___FMAXF_B = 0xA70 + SYS___FMAXF_H = 0xA71 + SYS___FMAXL_B = 0xA73 + SYS___FMAXL_H = 0xA74 + SYS___FMAX_B = 0xA6D + SYS___FMAX_H = 0xA6E + SYS___FMA_B = 0xA64 + SYS___FMA_H = 0xA65 + SYS___FMINF_B = 0xA79 + SYS___FMINF_H = 0xA7A + SYS___FMINL_B = 0xA7C + SYS___FMINL_H = 0xA7D + SYS___FMIN_B = 0xA76 + SYS___FMIN_H = 0xA77 + SYS___FPENDING = 0xD61 + SYS___FPENDING_UNLOCKED = 0xD6C + SYS___FPURGE = 0xD69 + SYS___FPURGE_UNLOCKED = 0xD70 + SYS___FP_CAST_D = 0xBCB + SYS___FREADABLE = 0xD63 + SYS___FREADAHEAD = 0xD6A + SYS___FREADAHEAD_UNLOCKED = 0xD71 + SYS___FREADING = 0xD65 + SYS___FREADING_UNLOCKED = 0xD6D + SYS___FSEEK2 = 0xB3C + SYS___FSETERR = 0xD6B + SYS___FSETLOCKING = 0xD67 + SYS___FTCHEP = 0x0BF + SYS___FTELL2 = 0xB3B + SYS___FUPDT = 0x0B5 + SYS___FWRITABLE = 0xD64 + SYS___FWRITING = 0xD66 + SYS___FWRITING_UNLOCKED = 0xD6E + SYS___GETCB = 0x0B4 + SYS___GETGRGID1 = 0xD5B + SYS___GETGRNAM1 = 0xD5C + SYS___GETTHENT = 0xCE5 + SYS___GETTOD = 0xD3E + SYS___HYPOTF_H = 0xAF6 + SYS___HYPOTL_H = 0xAF7 + SYS___ILOGBF_B = 0xA7F + SYS___ILOGBF_H = 0xA80 + SYS___ILOGBL_B = 0xA82 + SYS___ILOGBL_H = 0xA83 + SYS___ISBLANK_A = 0xB2E + SYS___ISBLNK = 0x0FE + SYS___ISWBLANK_A = 0xB2F + SYS___LE_CEEGTJS = 0xD72 + SYS___LE_TRACEBACK = 0xB7A + SYS___LGAMMAL_H = 0xA62 + SYS___LGAMMA_B_C99 = 0xB39 + SYS___LGAMMA_H_C99 = 0xB38 + SYS___LGAMMA_R_C99 = 0xB3A + SYS___LLRINTF_B = 0xA88 + SYS___LLRINTF_H = 0xA89 + SYS___LLRINTL_B = 0xA8B + SYS___LLRINTL_H = 0xA8C + SYS___LLRINT_B = 0xA85 + SYS___LLRINT_H = 0xA86 + SYS___LLROUNDF_B = 0xA91 + SYS___LLROUNDF_H = 0xA92 + SYS___LLROUNDL_B = 0xA94 + SYS___LLROUNDL_H = 0xA95 + SYS___LLROUND_B = 0xA8E + SYS___LLROUND_H = 0xA8F + SYS___LOCALE_CTL = 0xD47 + SYS___LOG1PF_H = 0xA60 + SYS___LOG1PL_H = 0xA61 + SYS___LOGBF_B = 0xA97 + SYS___LOGBF_H = 0xA98 + SYS___LOGBL_B = 0xA9A + SYS___LOGBL_H = 0xA9B + SYS___LOGIN_APPLID = 0xCE2 + SYS___LRINTF_B = 0xAA0 + SYS___LRINTF_H = 0xAA1 + SYS___LRINTL_B = 0xAA3 + SYS___LRINTL_H = 0xAA4 + SYS___LRINT_B = 0xA9D + SYS___LRINT_H = 0xA9E + SYS___LROUNDF_FIXUP = 0xB31 + SYS___LROUNDL_B = 0xAA6 + SYS___LROUNDL_H = 0xAA7 + SYS___LROUND_FIXUP = 0xB30 + SYS___MOSERVICES = 0xD3D + SYS___MUST_STAY_CLEAN = 0xB7C + SYS___NANF_B = 0xAAB + SYS___NANL_B = 0xAAD + SYS___NAN_B = 0xAA9 + SYS___NEARBYINTF_B = 0xAB2 + SYS___NEARBYINTF_H = 0xAB3 + SYS___NEARBYINTL_B = 0xAB5 + SYS___NEARBYINTL_H = 0xAB6 + SYS___NEARBYINT_B = 0xAAF + SYS___NEARBYINT_H = 0xAB0 + SYS___NEXTAFTERF_B = 0xAB8 + SYS___NEXTAFTERF_H = 0xAB9 + SYS___NEXTAFTERL_B = 0xABB + SYS___NEXTAFTERL_H = 0xABC + SYS___NEXTTOWARDF_B = 0xAC1 + SYS___NEXTTOWARDF_H = 0xAC2 + SYS___NEXTTOWARDL_B = 0xAC4 + SYS___NEXTTOWARDL_H = 0xAC5 + SYS___NEXTTOWARD_B = 0xABE + SYS___NEXTTOWARD_H = 0xABF + SYS___O_ENV = 0xB7D + SYS___PASSWD_APPLID = 0xCE3 + SYS___PTOD1 = 0xC9E + SYS___PTOD2 = 0xC9F + SYS___PTOD4 = 0xCA0 + SYS___REGCOMP_STD = 0x0EA + SYS___REMAINDERF_H = 0xAC6 + SYS___REMAINDERL_H = 0xAC7 + SYS___REMQUOD128 = 0xC10 + SYS___REMQUOD32 = 0xC0E + SYS___REMQUOD64 = 0xC0F + SYS___REMQUOF_H = 0xAC9 + SYS___REMQUOL_H = 0xACA + SYS___REMQUO_H = 0xAC8 + SYS___RINTF_B = 0xACC + SYS___RINTL_B = 0xACE + SYS___ROUNDF_B = 0xAD3 + SYS___ROUNDF_H = 0xAD4 + SYS___ROUNDL_B = 0xAD6 + SYS___ROUNDL_H = 0xAD7 + SYS___ROUND_B = 0xAD0 + SYS___ROUND_H = 0xAD1 + SYS___SCALBLNF_B = 0xADC + SYS___SCALBLNF_H = 0xADD + SYS___SCALBLNL_B = 0xADF + SYS___SCALBLNL_H = 0xAE0 + SYS___SCALBLN_B = 0xAD9 + SYS___SCALBLN_H = 0xADA + SYS___SCALBNF_B = 0xAE4 + SYS___SCALBNF_H = 0xAE5 + SYS___SCALBNL_B = 0xAE7 + SYS___SCALBNL_H = 0xAE8 + SYS___SCALBN_B = 0xAE1 + SYS___SCALBN_H = 0xAE2 + SYS___SETENV = 0x0C8 + SYS___SINPID128 = 0xC73 + SYS___SINPID32 = 0xC71 + SYS___SINPID64 = 0xC72 + SYS___SMF_RECORD2 = 0xD48 + SYS___STATIC_REINIT = 0xB3D + SYS___TGAMMAF_H_C99 = 0xB79 + SYS___TGAMMAL_H = 0xAE9 + SYS___TGAMMA_H_C99 = 0xB78 + SYS___TOCSNAME2 = 0xC9A + SYS_CEIL = 0x01F + SYS_CHAUDIT = 0x1E0 + SYS_EXP = 0x01A + SYS_FCHAUDIT = 0x1E1 + SYS_FREXP = 0x01D + SYS_GETGROUPSBYNAME = 0x1E2 + SYS_GETPWUID = 0x1A0 + SYS_GETUID = 0x1A1 + SYS_ISATTY = 0x1A3 + SYS_KILL = 0x1A4 + SYS_LDEXP = 0x01E + SYS_LINK = 0x1A5 + SYS_LOG10 = 0x01C + SYS_LSEEK = 0x1A6 + SYS_LSTAT = 0x1A7 + SYS_MKDIR = 0x1A8 + SYS_MKFIFO = 0x1A9 + SYS_MKNOD = 0x1AA + SYS_MODF = 0x01B + SYS_MOUNT = 0x1AB + SYS_OPEN = 0x1AC + SYS_OPENDIR = 0x1AD + SYS_PATHCONF = 0x1AE + SYS_PAUSE = 0x1AF + SYS_PIPE = 0x1B0 + SYS_PTHREAD_ATTR_DESTROY = 0x1E7 + SYS_PTHREAD_ATTR_GETDETACHSTATE = 0x1EB + SYS_PTHREAD_ATTR_GETSTACKSIZE = 0x1E9 + SYS_PTHREAD_ATTR_GETWEIGHT_NP = 0x1ED + SYS_PTHREAD_ATTR_INIT = 0x1E6 + SYS_PTHREAD_ATTR_SETDETACHSTATE = 0x1EA + SYS_PTHREAD_ATTR_SETSTACKSIZE = 0x1E8 + SYS_PTHREAD_ATTR_SETWEIGHT_NP = 0x1EC + SYS_PTHREAD_CANCEL = 0x1EE + SYS_PTHREAD_CLEANUP_POP = 0x1F0 + SYS_PTHREAD_CLEANUP_PUSH = 0x1EF + SYS_PTHREAD_CONDATTR_DESTROY = 0x1F2 + SYS_PTHREAD_CONDATTR_INIT = 0x1F1 + SYS_PTHREAD_COND_BROADCAST = 0x1F6 + SYS_PTHREAD_COND_DESTROY = 0x1F4 + SYS_PTHREAD_COND_INIT = 0x1F3 + SYS_PTHREAD_COND_SIGNAL = 0x1F5 + SYS_PTHREAD_COND_TIMEDWAIT = 0x1F8 + SYS_PTHREAD_COND_WAIT = 0x1F7 + SYS_PTHREAD_CREATE = 0x1F9 + SYS_PTHREAD_DETACH = 0x1FA + SYS_PTHREAD_EQUAL = 0x1FB + SYS_PTHREAD_EXIT = 0x1E4 + SYS_PTHREAD_GETSPECIFIC = 0x1FC + SYS_PTHREAD_JOIN = 0x1FD + SYS_PTHREAD_KEY_CREATE = 0x1FE + SYS_PTHREAD_KILL = 0x1E5 + SYS_PTHREAD_MUTEXATTR_INIT = 0x1FF + SYS_READ = 0x1B2 + SYS_READDIR = 0x1B3 + SYS_READLINK = 0x1B4 + SYS_REWINDDIR = 0x1B5 + SYS_RMDIR = 0x1B6 + SYS_SETEGID = 0x1B7 + SYS_SETEUID = 0x1B8 + SYS_SETGID = 0x1B9 + SYS_SETPGID = 0x1BA + SYS_SETSID = 0x1BB + SYS_SETUID = 0x1BC + SYS_SIGACTION = 0x1BD + SYS_SIGADDSET = 0x1BE + SYS_SIGDELSET = 0x1BF + SYS_SIGEMPTYSET = 0x1C0 + SYS_SIGFILLSET = 0x1C1 + SYS_SIGISMEMBER = 0x1C2 + SYS_SIGLONGJMP = 0x1C3 + SYS_SIGPENDING = 0x1C4 + SYS_SIGPROCMASK = 0x1C5 + SYS_SIGSETJMP = 0x1C6 + SYS_SIGSUSPEND = 0x1C7 + SYS_SIGWAIT = 0x1E3 + SYS_SLEEP = 0x1C8 + SYS_STAT = 0x1C9 + SYS_SYMLINK = 0x1CB + SYS_SYSCONF = 0x1CC + SYS_TCDRAIN = 0x1CD + SYS_TCFLOW = 0x1CE + SYS_TCFLUSH = 0x1CF + SYS_TCGETATTR = 0x1D0 + SYS_TCGETPGRP = 0x1D1 + SYS_TCSENDBREAK = 0x1D2 + SYS_TCSETATTR = 0x1D3 + SYS_TCSETPGRP = 0x1D4 + SYS_TIMES = 0x1D5 + SYS_TTYNAME = 0x1D6 + SYS_TZSET = 0x1D7 + SYS_UMASK = 0x1D8 + SYS_UMOUNT = 0x1D9 + SYS_UNAME = 0x1DA + SYS_UNLINK = 0x1DB + SYS_UTIME = 0x1DC + SYS_WAIT = 0x1DD + SYS_WAITPID = 0x1DE + SYS_WRITE = 0x1DF + SYS_W_GETPSENT = 0x1B1 + SYS_W_IOCTL = 0x1A2 + SYS_W_STATFS = 0x1CA + SYS_A64L = 0x2EF + SYS_BCMP = 0x2B9 + SYS_BCOPY = 0x2BA + SYS_BZERO = 0x2BB + SYS_CATCLOSE = 0x2B6 + SYS_CATGETS = 0x2B7 + SYS_CATOPEN = 0x2B8 + SYS_CRYPT = 0x2AC + SYS_DBM_CLEARERR = 0x2F7 + SYS_DBM_CLOSE = 0x2F8 + SYS_DBM_DELETE = 0x2F9 + SYS_DBM_ERROR = 0x2FA + SYS_DBM_FETCH = 0x2FB + SYS_DBM_FIRSTKEY = 0x2FC + SYS_DBM_NEXTKEY = 0x2FD + SYS_DBM_OPEN = 0x2FE + SYS_DBM_STORE = 0x2FF + SYS_DRAND48 = 0x2B2 + SYS_ENCRYPT = 0x2AD + SYS_ENDUTXENT = 0x2E1 + SYS_ERAND48 = 0x2B3 + SYS_ERF = 0x02C + SYS_ERFC = 0x02D + SYS_FCHDIR = 0x2D9 + SYS_FFS = 0x2BC + SYS_FMTMSG = 0x2E5 + SYS_FSTATVFS = 0x2B4 + SYS_FTIME = 0x2F5 + SYS_GAMMA = 0x02E + SYS_GETDATE = 0x2A6 + SYS_GETPAGESIZE = 0x2D8 + SYS_GETTIMEOFDAY = 0x2F6 + SYS_GETUTXENT = 0x2E0 + SYS_GETUTXID = 0x2E2 + SYS_GETUTXLINE = 0x2E3 + SYS_HCREATE = 0x2C6 + SYS_HDESTROY = 0x2C7 + SYS_HSEARCH = 0x2C8 + SYS_HYPOT = 0x02B + SYS_INDEX = 0x2BD + SYS_INITSTATE = 0x2C2 + SYS_INSQUE = 0x2CF + SYS_ISASCII = 0x2ED + SYS_JRAND48 = 0x2E6 + SYS_L64A = 0x2F0 + SYS_LCONG48 = 0x2EA + SYS_LFIND = 0x2C9 + SYS_LRAND48 = 0x2E7 + SYS_LSEARCH = 0x2CA + SYS_MEMCCPY = 0x2D4 + SYS_MRAND48 = 0x2E8 + SYS_NRAND48 = 0x2E9 + SYS_PCLOSE = 0x2D2 + SYS_POPEN = 0x2D1 + SYS_PUTUTXLINE = 0x2E4 + SYS_RANDOM = 0x2C4 + SYS_REMQUE = 0x2D0 + SYS_RINDEX = 0x2BE + SYS_SEED48 = 0x2EC + SYS_SETKEY = 0x2AE + SYS_SETSTATE = 0x2C3 + SYS_SETUTXENT = 0x2DF + SYS_SRAND48 = 0x2EB + SYS_SRANDOM = 0x2C5 + SYS_STATVFS = 0x2B5 + SYS_STRCASECMP = 0x2BF + SYS_STRDUP = 0x2C0 + SYS_STRNCASECMP = 0x2C1 + SYS_SWAB = 0x2D3 + SYS_TDELETE = 0x2CB + SYS_TFIND = 0x2CC + SYS_TOASCII = 0x2EE + SYS_TSEARCH = 0x2CD + SYS_TWALK = 0x2CE + SYS_UALARM = 0x2F1 + SYS_USLEEP = 0x2F2 + SYS_WAIT3 = 0x2A7 + SYS_WAITID = 0x2A8 + SYS_Y1 = 0x02A + SYS___ATOE = 0x2DB + SYS___ATOE_L = 0x2DC + SYS___CATTRM = 0x2A9 + SYS___CNVBLK = 0x2AF + SYS___CRYTRM = 0x2B0 + SYS___DLGHT = 0x2A1 + SYS___ECRTRM = 0x2B1 + SYS___ETOA = 0x2DD + SYS___ETOA_L = 0x2DE + SYS___GDTRM = 0x2AA + SYS___OCLCK = 0x2DA + SYS___OPARGF = 0x2A2 + SYS___OPERRF = 0x2A5 + SYS___OPINDF = 0x2A4 + SYS___OPOPTF = 0x2A3 + SYS___RNDTRM = 0x2AB + SYS___SRCTRM = 0x2F4 + SYS___TZONE = 0x2A0 + SYS___UTXTRM = 0x2F3 + SYS_ASIN = 0x03E + SYS_ISXDIGIT = 0x03B + SYS_SETLOCAL = 0x03A + SYS_SETLOCALE = 0x03A + SYS_SIN = 0x03F + SYS_TOLOWER = 0x03C + SYS_TOUPPER = 0x03D + SYS_ACCEPT_AND_RECV = 0x4F7 + SYS_ATOL = 0x04E + SYS_CHECKSCH = 0x4BC + SYS_CHECKSCHENV = 0x4BC + SYS_CLEARERR = 0x04C + SYS_CONNECTS = 0x4B5 + SYS_CONNECTSERVER = 0x4B5 + SYS_CONNECTW = 0x4B4 + SYS_CONNECTWORKMGR = 0x4B4 + SYS_CONTINUE = 0x4B3 + SYS_CONTINUEWORKUNIT = 0x4B3 + SYS_COPYSIGN = 0x4C2 + SYS_CREATEWO = 0x4B2 + SYS_CREATEWORKUNIT = 0x4B2 + SYS_DELETEWO = 0x4B9 + SYS_DELETEWORKUNIT = 0x4B9 + SYS_DISCONNE = 0x4B6 + SYS_DISCONNECTSERVER = 0x4B6 + SYS_FEOF = 0x04D + SYS_FERROR = 0x04A + SYS_FINITE = 0x4C8 + SYS_GAMMA_R = 0x4E2 + SYS_JOINWORK = 0x4B7 + SYS_JOINWORKUNIT = 0x4B7 + SYS_LEAVEWOR = 0x4B8 + SYS_LEAVEWORKUNIT = 0x4B8 + SYS_LGAMMA_R = 0x4EB + SYS_MATHERR = 0x4D0 + SYS_PERROR = 0x04F + SYS_QUERYMET = 0x4BA + SYS_QUERYMETRICS = 0x4BA + SYS_QUERYSCH = 0x4BB + SYS_QUERYSCHENV = 0x4BB + SYS_REWIND = 0x04B + SYS_SCALBN = 0x4D4 + SYS_SIGNIFIC = 0x4D5 + SYS_SIGNIFICAND = 0x4D5 + SYS___ACOSH_B = 0x4DA + SYS___ACOS_B = 0x4D9 + SYS___ASINH_B = 0x4BE + SYS___ASIN_B = 0x4DB + SYS___ATAN2_B = 0x4DC + SYS___ATANH_B = 0x4DD + SYS___ATAN_B = 0x4BF + SYS___CBRT_B = 0x4C0 + SYS___CEIL_B = 0x4C1 + SYS___COSH_B = 0x4DE + SYS___COS_B = 0x4C3 + SYS___DGHT = 0x4A8 + SYS___ENVN = 0x4B0 + SYS___ERFC_B = 0x4C5 + SYS___ERF_B = 0x4C4 + SYS___EXPM1_B = 0x4C6 + SYS___EXP_B = 0x4DF + SYS___FABS_B = 0x4C7 + SYS___FLOOR_B = 0x4C9 + SYS___FMOD_B = 0x4E0 + SYS___FP_SETMODE = 0x4F8 + SYS___FREXP_B = 0x4CA + SYS___GAMMA_B = 0x4E1 + SYS___GDRR = 0x4A1 + SYS___HRRNO = 0x4A2 + SYS___HYPOT_B = 0x4E3 + SYS___ILOGB_B = 0x4CB + SYS___ISNAN_B = 0x4CC + SYS___J0_B = 0x4E4 + SYS___J1_B = 0x4E6 + SYS___JN_B = 0x4E8 + SYS___LDEXP_B = 0x4CD + SYS___LGAMMA_B = 0x4EA + SYS___LOG10_B = 0x4ED + SYS___LOG1P_B = 0x4CE + SYS___LOGB_B = 0x4CF + SYS___LOGIN = 0x4F5 + SYS___LOG_B = 0x4EC + SYS___MLOCKALL = 0x4B1 + SYS___MODF_B = 0x4D1 + SYS___NEXTAFTER_B = 0x4D2 + SYS___OPENDIR2 = 0x4F3 + SYS___OPEN_STAT = 0x4F6 + SYS___OPND = 0x4A5 + SYS___OPPT = 0x4A6 + SYS___OPRG = 0x4A3 + SYS___OPRR = 0x4A4 + SYS___PID_AFFINITY = 0x4BD + SYS___POW_B = 0x4EE + SYS___READDIR2 = 0x4F4 + SYS___REMAINDER_B = 0x4EF + SYS___RINT_B = 0x4D3 + SYS___SCALB_B = 0x4F0 + SYS___SIGACTIONSET = 0x4FB + SYS___SIGGM = 0x4A7 + SYS___SINH_B = 0x4F1 + SYS___SIN_B = 0x4D6 + SYS___SQRT_B = 0x4F2 + SYS___TANH_B = 0x4D8 + SYS___TAN_B = 0x4D7 + SYS___TRRNO = 0x4AF + SYS___TZNE = 0x4A9 + SYS___TZZN = 0x4AA + SYS___UCREATE = 0x4FC + SYS___UFREE = 0x4FE + SYS___UHEAPREPORT = 0x4FF + SYS___UMALLOC = 0x4FD + SYS___Y0_B = 0x4E5 + SYS___Y1_B = 0x4E7 + SYS___YN_B = 0x4E9 + SYS_ABORT = 0x05C + SYS_ASCTIME_R = 0x5E0 + SYS_ATEXIT = 0x05D + SYS_CONNECTE = 0x5AE + SYS_CONNECTEXPORTIMPORT = 0x5AE + SYS_CTIME_R = 0x5E1 + SYS_DN_COMP = 0x5DF + SYS_DN_EXPAND = 0x5DD + SYS_DN_SKIPNAME = 0x5DE + SYS_EXIT = 0x05A + SYS_EXPORTWO = 0x5A1 + SYS_EXPORTWORKUNIT = 0x5A1 + SYS_EXTRACTW = 0x5A5 + SYS_EXTRACTWORKUNIT = 0x5A5 + SYS_FSEEKO = 0x5C9 + SYS_FTELLO = 0x5C8 + SYS_GETGRGID_R = 0x5E7 + SYS_GETGRNAM_R = 0x5E8 + SYS_GETLOGIN_R = 0x5E9 + SYS_GETPWNAM_R = 0x5EA + SYS_GETPWUID_R = 0x5EB + SYS_GMTIME_R = 0x5E2 + SYS_IMPORTWO = 0x5A3 + SYS_IMPORTWORKUNIT = 0x5A3 + SYS_INET_NTOP = 0x5D3 + SYS_INET_PTON = 0x5D4 + SYS_LLABS = 0x5CE + SYS_LLDIV = 0x5CB + SYS_LOCALTIME_R = 0x5E3 + SYS_PTHREAD_ATFORK = 0x5ED + SYS_PTHREAD_ATTR_GETDETACHSTATE_U98 = 0x5FB + SYS_PTHREAD_ATTR_GETGUARDSIZE = 0x5EE + SYS_PTHREAD_ATTR_GETSCHEDPARAM = 0x5F9 + SYS_PTHREAD_ATTR_GETSTACKADDR = 0x5EF + SYS_PTHREAD_ATTR_SETDETACHSTATE_U98 = 0x5FC + SYS_PTHREAD_ATTR_SETGUARDSIZE = 0x5F0 + SYS_PTHREAD_ATTR_SETSCHEDPARAM = 0x5FA + SYS_PTHREAD_ATTR_SETSTACKADDR = 0x5F1 + SYS_PTHREAD_CONDATTR_GETPSHARED = 0x5F2 + SYS_PTHREAD_CONDATTR_SETPSHARED = 0x5F3 + SYS_PTHREAD_DETACH_U98 = 0x5FD + SYS_PTHREAD_GETCONCURRENCY = 0x5F4 + SYS_PTHREAD_GETSPECIFIC_U98 = 0x5FE + SYS_PTHREAD_KEY_DELETE = 0x5F5 + SYS_PTHREAD_SETCANCELSTATE = 0x5FF + SYS_PTHREAD_SETCONCURRENCY = 0x5F6 + SYS_PTHREAD_SIGMASK = 0x5F7 + SYS_QUERYENC = 0x5AD + SYS_QUERYWORKUNITCLASSIFICATION = 0x5AD + SYS_RAISE = 0x05E + SYS_RAND_R = 0x5E4 + SYS_READDIR_R = 0x5E6 + SYS_REALLOC = 0x05B + SYS_RES_INIT = 0x5D8 + SYS_RES_MKQUERY = 0x5D7 + SYS_RES_QUERY = 0x5D9 + SYS_RES_QUERYDOMAIN = 0x5DC + SYS_RES_SEARCH = 0x5DA + SYS_RES_SEND = 0x5DB + SYS_SETJMP = 0x05F + SYS_SIGQUEUE = 0x5A9 + SYS_STRTOK_R = 0x5E5 + SYS_STRTOLL = 0x5B0 + SYS_STRTOULL = 0x5B1 + SYS_TTYNAME_R = 0x5EC + SYS_UNDOEXPO = 0x5A2 + SYS_UNDOEXPORTWORKUNIT = 0x5A2 + SYS_UNDOIMPO = 0x5A4 + SYS_UNDOIMPORTWORKUNIT = 0x5A4 + SYS_WCSTOLL = 0x5CC + SYS_WCSTOULL = 0x5CD + SYS___ABORT = 0x05C + SYS___CONSOLE2 = 0x5D2 + SYS___CPL = 0x5A6 + SYS___DISCARDDATA = 0x5F8 + SYS___DSA_PREV = 0x5B2 + SYS___EP_FIND = 0x5B3 + SYS___FP_SWAPMODE = 0x5AF + SYS___GETUSERID = 0x5AB + SYS___GET_CPUID = 0x5B9 + SYS___GET_SYSTEM_SETTINGS = 0x5BA + SYS___IPDOMAINNAME = 0x5AC + SYS___MAP_INIT = 0x5A7 + SYS___MAP_SERVICE = 0x5A8 + SYS___MOUNT = 0x5AA + SYS___MSGRCV_TIMED = 0x5B7 + SYS___RES = 0x5D6 + SYS___SEMOP_TIMED = 0x5B8 + SYS___SERVER_THREADS_QUERY = 0x5B4 + SYS_FPRINTF = 0x06D + SYS_FSCANF = 0x06A + SYS_PRINTF = 0x06F + SYS_SETBUF = 0x06B + SYS_SETVBUF = 0x06C + SYS_SSCANF = 0x06E + SYS___CATGETS_A = 0x6C0 + SYS___CHAUDIT_A = 0x6F4 + SYS___CHMOD_A = 0x6E8 + SYS___COLLATE_INIT_A = 0x6AC + SYS___CREAT_A = 0x6F6 + SYS___CTYPE_INIT_A = 0x6AF + SYS___DLLLOAD_A = 0x6DF + SYS___DLLQUERYFN_A = 0x6E0 + SYS___DLLQUERYVAR_A = 0x6E1 + SYS___E2A_L = 0x6E3 + SYS___EXECLE_A = 0x6A0 + SYS___EXECLP_A = 0x6A4 + SYS___EXECVE_A = 0x6C1 + SYS___EXECVP_A = 0x6C2 + SYS___EXECV_A = 0x6B1 + SYS___FPRINTF_A = 0x6FA + SYS___GETADDRINFO_A = 0x6BF + SYS___GETNAMEINFO_A = 0x6C4 + SYS___GET_WCTYPE_STD_A = 0x6AE + SYS___ICONV_OPEN_A = 0x6DE + SYS___IF_INDEXTONAME_A = 0x6DC + SYS___IF_NAMETOINDEX_A = 0x6DB + SYS___ISWCTYPE_A = 0x6B0 + SYS___IS_WCTYPE_STD_A = 0x6B2 + SYS___LOCALECONV_A = 0x6B8 + SYS___LOCALECONV_STD_A = 0x6B9 + SYS___LOCALE_INIT_A = 0x6B7 + SYS___LSTAT_A = 0x6EE + SYS___LSTAT_O_A = 0x6EF + SYS___MKDIR_A = 0x6E9 + SYS___MKFIFO_A = 0x6EC + SYS___MKNOD_A = 0x6F0 + SYS___MONETARY_INIT_A = 0x6BC + SYS___MOUNT_A = 0x6F1 + SYS___NL_CSINFO_A = 0x6D6 + SYS___NL_LANGINFO_A = 0x6BA + SYS___NL_LNAGINFO_STD_A = 0x6BB + SYS___NL_MONINFO_A = 0x6D7 + SYS___NL_NUMINFO_A = 0x6D8 + SYS___NL_RESPINFO_A = 0x6D9 + SYS___NL_TIMINFO_A = 0x6DA + SYS___NUMERIC_INIT_A = 0x6C6 + SYS___OPEN_A = 0x6F7 + SYS___PRINTF_A = 0x6DD + SYS___RESP_INIT_A = 0x6C7 + SYS___RPMATCH_A = 0x6C8 + SYS___RPMATCH_C_A = 0x6C9 + SYS___RPMATCH_STD_A = 0x6CA + SYS___SETLOCALE_A = 0x6F9 + SYS___SPAWNP_A = 0x6C5 + SYS___SPAWN_A = 0x6C3 + SYS___SPRINTF_A = 0x6FB + SYS___STAT_A = 0x6EA + SYS___STAT_O_A = 0x6EB + SYS___STRCOLL_STD_A = 0x6A1 + SYS___STRFMON_A = 0x6BD + SYS___STRFMON_STD_A = 0x6BE + SYS___STRFTIME_A = 0x6CC + SYS___STRFTIME_STD_A = 0x6CD + SYS___STRPTIME_A = 0x6CE + SYS___STRPTIME_STD_A = 0x6CF + SYS___STRXFRM_A = 0x6A2 + SYS___STRXFRM_C_A = 0x6A3 + SYS___STRXFRM_STD_A = 0x6A5 + SYS___SYNTAX_INIT_A = 0x6D4 + SYS___TIME_INIT_A = 0x6CB + SYS___TOD_INIT_A = 0x6D5 + SYS___TOWLOWER_A = 0x6B3 + SYS___TOWLOWER_STD_A = 0x6B4 + SYS___TOWUPPER_A = 0x6B5 + SYS___TOWUPPER_STD_A = 0x6B6 + SYS___UMOUNT_A = 0x6F2 + SYS___VFPRINTF_A = 0x6FC + SYS___VPRINTF_A = 0x6FD + SYS___VSPRINTF_A = 0x6FE + SYS___VSWPRINTF_A = 0x6FF + SYS___WCSCOLL_A = 0x6A6 + SYS___WCSCOLL_C_A = 0x6A7 + SYS___WCSCOLL_STD_A = 0x6A8 + SYS___WCSFTIME_A = 0x6D0 + SYS___WCSFTIME_STD_A = 0x6D1 + SYS___WCSXFRM_A = 0x6A9 + SYS___WCSXFRM_C_A = 0x6AA + SYS___WCSXFRM_STD_A = 0x6AB + SYS___WCTYPE_A = 0x6AD + SYS___W_GETMNTENT_A = 0x6F5 + SYS_____CCSIDTYPE_A = 0x6E6 + SYS_____CHATTR_A = 0x6E2 + SYS_____CSNAMETYPE_A = 0x6E7 + SYS_____OPEN_STAT_A = 0x6ED + SYS_____SPAWN2_A = 0x6D2 + SYS_____SPAWNP2_A = 0x6D3 + SYS_____TOCCSID_A = 0x6E4 + SYS_____TOCSNAME_A = 0x6E5 + SYS_ACL_FREE = 0x7FF + SYS_ACL_INIT = 0x7FE + SYS_FWIDE = 0x7DF + SYS_FWPRINTF = 0x7D1 + SYS_FWRITE = 0x07E + SYS_FWSCANF = 0x7D5 + SYS_GETCHAR = 0x07B + SYS_GETS = 0x07C + SYS_M_CREATE_LAYOUT = 0x7C9 + SYS_M_DESTROY_LAYOUT = 0x7CA + SYS_M_GETVALUES_LAYOUT = 0x7CB + SYS_M_SETVALUES_LAYOUT = 0x7CC + SYS_M_TRANSFORM_LAYOUT = 0x7CD + SYS_M_WTRANSFORM_LAYOUT = 0x7CE + SYS_PREAD = 0x7C7 + SYS_PUTC = 0x07D + SYS_PUTCHAR = 0x07A + SYS_PUTS = 0x07F + SYS_PWRITE = 0x7C8 + SYS_TOWCTRAN = 0x7D8 + SYS_TOWCTRANS = 0x7D8 + SYS_UNATEXIT = 0x7B5 + SYS_VFWPRINT = 0x7D3 + SYS_VFWPRINTF = 0x7D3 + SYS_VWPRINTF = 0x7D4 + SYS_WCTRANS = 0x7D7 + SYS_WPRINTF = 0x7D2 + SYS_WSCANF = 0x7D6 + SYS___ASCTIME_R_A = 0x7A1 + SYS___BASENAME_A = 0x7DC + SYS___BTOWC_A = 0x7E4 + SYS___CDUMP_A = 0x7B7 + SYS___CEE3DMP_A = 0x7B6 + SYS___CEILF_H = 0x7F4 + SYS___CEILL_H = 0x7F5 + SYS___CEIL_H = 0x7EA + SYS___CRYPT_A = 0x7BE + SYS___CSNAP_A = 0x7B8 + SYS___CTEST_A = 0x7B9 + SYS___CTIME_R_A = 0x7A2 + SYS___CTRACE_A = 0x7BA + SYS___DBM_OPEN_A = 0x7E6 + SYS___DIRNAME_A = 0x7DD + SYS___FABSF_H = 0x7FA + SYS___FABSL_H = 0x7FB + SYS___FABS_H = 0x7ED + SYS___FGETWC_A = 0x7AA + SYS___FGETWS_A = 0x7AD + SYS___FLOORF_H = 0x7F6 + SYS___FLOORL_H = 0x7F7 + SYS___FLOOR_H = 0x7EB + SYS___FPUTWC_A = 0x7A5 + SYS___FPUTWS_A = 0x7A8 + SYS___GETTIMEOFDAY_A = 0x7AE + SYS___GETWCHAR_A = 0x7AC + SYS___GETWC_A = 0x7AB + SYS___GLOB_A = 0x7DE + SYS___GMTIME_A = 0x7AF + SYS___GMTIME_R_A = 0x7B0 + SYS___INET_PTON_A = 0x7BC + SYS___J0_H = 0x7EE + SYS___J1_H = 0x7EF + SYS___JN_H = 0x7F0 + SYS___LOCALTIME_A = 0x7B1 + SYS___LOCALTIME_R_A = 0x7B2 + SYS___MALLOC24 = 0x7FC + SYS___MALLOC31 = 0x7FD + SYS___MKTIME_A = 0x7B3 + SYS___MODFF_H = 0x7F8 + SYS___MODFL_H = 0x7F9 + SYS___MODF_H = 0x7EC + SYS___OPENDIR_A = 0x7C2 + SYS___OSNAME = 0x7E0 + SYS___PUTWCHAR_A = 0x7A7 + SYS___PUTWC_A = 0x7A6 + SYS___READDIR_A = 0x7C3 + SYS___STRTOLL_A = 0x7A3 + SYS___STRTOULL_A = 0x7A4 + SYS___SYSLOG_A = 0x7BD + SYS___TZZNA = 0x7B4 + SYS___UNGETWC_A = 0x7A9 + SYS___UTIME_A = 0x7A0 + SYS___VFPRINTF2_A = 0x7E7 + SYS___VPRINTF2_A = 0x7E8 + SYS___VSPRINTF2_A = 0x7E9 + SYS___VSWPRNTF2_A = 0x7BB + SYS___WCSTOD_A = 0x7D9 + SYS___WCSTOL_A = 0x7DA + SYS___WCSTOUL_A = 0x7DB + SYS___WCTOB_A = 0x7E5 + SYS___Y0_H = 0x7F1 + SYS___Y1_H = 0x7F2 + SYS___YN_H = 0x7F3 + SYS_____OPENDIR2_A = 0x7BF + SYS_____OSNAME_A = 0x7E1 + SYS_____READDIR2_A = 0x7C0 + SYS_DLCLOSE = 0x8DF + SYS_DLERROR = 0x8E0 + SYS_DLOPEN = 0x8DD + SYS_DLSYM = 0x8DE + SYS_FLOCKFILE = 0x8D3 + SYS_FTRYLOCKFILE = 0x8D4 + SYS_FUNLOCKFILE = 0x8D5 + SYS_GETCHAR_UNLOCKED = 0x8D7 + SYS_GETC_UNLOCKED = 0x8D6 + SYS_PUTCHAR_UNLOCKED = 0x8D9 + SYS_PUTC_UNLOCKED = 0x8D8 + SYS_SNPRINTF = 0x8DA + SYS_VSNPRINTF = 0x8DB + SYS_WCSCSPN = 0x08B + SYS_WCSLEN = 0x08C + SYS_WCSNCAT = 0x08D + SYS_WCSNCMP = 0x08A + SYS_WCSNCPY = 0x08F + SYS_WCSSPN = 0x08E + SYS___ABSF_H = 0x8E7 + SYS___ABSL_H = 0x8E8 + SYS___ABS_H = 0x8E6 + SYS___ACOSF_H = 0x8EA + SYS___ACOSH_H = 0x8EC + SYS___ACOSL_H = 0x8EB + SYS___ACOS_H = 0x8E9 + SYS___ASINF_H = 0x8EE + SYS___ASINH_H = 0x8F0 + SYS___ASINL_H = 0x8EF + SYS___ASIN_H = 0x8ED + SYS___ATAN2F_H = 0x8F8 + SYS___ATAN2L_H = 0x8F9 + SYS___ATAN2_H = 0x8F7 + SYS___ATANF_H = 0x8F2 + SYS___ATANHF_H = 0x8F5 + SYS___ATANHL_H = 0x8F6 + SYS___ATANH_H = 0x8F4 + SYS___ATANL_H = 0x8F3 + SYS___ATAN_H = 0x8F1 + SYS___CBRT_H = 0x8FA + SYS___COPYSIGNF_H = 0x8FB + SYS___COPYSIGNL_H = 0x8FC + SYS___COSF_H = 0x8FE + SYS___COSL_H = 0x8FF + SYS___COS_H = 0x8FD + SYS___DLERROR_A = 0x8D2 + SYS___DLOPEN_A = 0x8D0 + SYS___DLSYM_A = 0x8D1 + SYS___GETUTXENT_A = 0x8C6 + SYS___GETUTXID_A = 0x8C7 + SYS___GETUTXLINE_A = 0x8C8 + SYS___ITOA = 0x8AA + SYS___ITOA_A = 0x8B0 + SYS___LE_CONDITION_TOKEN_BUILD = 0x8A5 + SYS___LE_MSG_ADD_INSERT = 0x8A6 + SYS___LE_MSG_GET = 0x8A7 + SYS___LE_MSG_GET_AND_WRITE = 0x8A8 + SYS___LE_MSG_WRITE = 0x8A9 + SYS___LLTOA = 0x8AE + SYS___LLTOA_A = 0x8B4 + SYS___LTOA = 0x8AC + SYS___LTOA_A = 0x8B2 + SYS___PUTCHAR_UNLOCKED_A = 0x8CC + SYS___PUTC_UNLOCKED_A = 0x8CB + SYS___PUTUTXLINE_A = 0x8C9 + SYS___RESET_EXCEPTION_HANDLER = 0x8E3 + SYS___REXEC_A = 0x8C4 + SYS___REXEC_AF_A = 0x8C5 + SYS___SET_EXCEPTION_HANDLER = 0x8E2 + SYS___SNPRINTF_A = 0x8CD + SYS___SUPERKILL = 0x8A4 + SYS___TCGETATTR_A = 0x8A1 + SYS___TCSETATTR_A = 0x8A2 + SYS___ULLTOA = 0x8AF + SYS___ULLTOA_A = 0x8B5 + SYS___ULTOA = 0x8AD + SYS___ULTOA_A = 0x8B3 + SYS___UTOA = 0x8AB + SYS___UTOA_A = 0x8B1 + SYS___VHM_EVENT = 0x8E4 + SYS___VSNPRINTF_A = 0x8CE + SYS_____GETENV_A = 0x8C3 + SYS_____UTMPXNAME_A = 0x8CA + SYS_CACOSH = 0x9A0 + SYS_CACOSHF = 0x9A3 + SYS_CACOSHL = 0x9A6 + SYS_CARG = 0x9A9 + SYS_CARGF = 0x9AC + SYS_CARGL = 0x9AF + SYS_CASIN = 0x9B2 + SYS_CASINF = 0x9B5 + SYS_CASINH = 0x9BB + SYS_CASINHF = 0x9BE + SYS_CASINHL = 0x9C1 + SYS_CASINL = 0x9B8 + SYS_CATAN = 0x9C4 + SYS_CATANF = 0x9C7 + SYS_CATANH = 0x9CD + SYS_CATANHF = 0x9D0 + SYS_CATANHL = 0x9D3 + SYS_CATANL = 0x9CA + SYS_CCOS = 0x9D6 + SYS_CCOSF = 0x9D9 + SYS_CCOSH = 0x9DF + SYS_CCOSHF = 0x9E2 + SYS_CCOSHL = 0x9E5 + SYS_CCOSL = 0x9DC + SYS_CEXP = 0x9E8 + SYS_CEXPF = 0x9EB + SYS_CEXPL = 0x9EE + SYS_CIMAG = 0x9F1 + SYS_CIMAGF = 0x9F4 + SYS_CIMAGL = 0x9F7 + SYS_CLOGF = 0x9FD + SYS_MEMCHR = 0x09B + SYS_MEMCMP = 0x09A + SYS_STRCOLL = 0x09C + SYS_STRNCMP = 0x09D + SYS_STRRCHR = 0x09F + SYS_STRXFRM = 0x09E + SYS___CACOSHF_B = 0x9A4 + SYS___CACOSHF_H = 0x9A5 + SYS___CACOSHL_B = 0x9A7 + SYS___CACOSHL_H = 0x9A8 + SYS___CACOSH_B = 0x9A1 + SYS___CACOSH_H = 0x9A2 + SYS___CARGF_B = 0x9AD + SYS___CARGF_H = 0x9AE + SYS___CARGL_B = 0x9B0 + SYS___CARGL_H = 0x9B1 + SYS___CARG_B = 0x9AA + SYS___CARG_H = 0x9AB + SYS___CASINF_B = 0x9B6 + SYS___CASINF_H = 0x9B7 + SYS___CASINHF_B = 0x9BF + SYS___CASINHF_H = 0x9C0 + SYS___CASINHL_B = 0x9C2 + SYS___CASINHL_H = 0x9C3 + SYS___CASINH_B = 0x9BC + SYS___CASINH_H = 0x9BD + SYS___CASINL_B = 0x9B9 + SYS___CASINL_H = 0x9BA + SYS___CASIN_B = 0x9B3 + SYS___CASIN_H = 0x9B4 + SYS___CATANF_B = 0x9C8 + SYS___CATANF_H = 0x9C9 + SYS___CATANHF_B = 0x9D1 + SYS___CATANHF_H = 0x9D2 + SYS___CATANHL_B = 0x9D4 + SYS___CATANHL_H = 0x9D5 + SYS___CATANH_B = 0x9CE + SYS___CATANH_H = 0x9CF + SYS___CATANL_B = 0x9CB + SYS___CATANL_H = 0x9CC + SYS___CATAN_B = 0x9C5 + SYS___CATAN_H = 0x9C6 + SYS___CCOSF_B = 0x9DA + SYS___CCOSF_H = 0x9DB + SYS___CCOSHF_B = 0x9E3 + SYS___CCOSHF_H = 0x9E4 + SYS___CCOSHL_B = 0x9E6 + SYS___CCOSHL_H = 0x9E7 + SYS___CCOSH_B = 0x9E0 + SYS___CCOSH_H = 0x9E1 + SYS___CCOSL_B = 0x9DD + SYS___CCOSL_H = 0x9DE + SYS___CCOS_B = 0x9D7 + SYS___CCOS_H = 0x9D8 + SYS___CEXPF_B = 0x9EC + SYS___CEXPF_H = 0x9ED + SYS___CEXPL_B = 0x9EF + SYS___CEXPL_H = 0x9F0 + SYS___CEXP_B = 0x9E9 + SYS___CEXP_H = 0x9EA + SYS___CIMAGF_B = 0x9F5 + SYS___CIMAGF_H = 0x9F6 + SYS___CIMAGL_B = 0x9F8 + SYS___CIMAGL_H = 0x9F9 + SYS___CIMAG_B = 0x9F2 + SYS___CIMAG_H = 0x9F3 + SYS___CLOG = 0x9FA + SYS___CLOGF_B = 0x9FE + SYS___CLOGF_H = 0x9FF + SYS___CLOG_B = 0x9FB + SYS___CLOG_H = 0x9FC + SYS_ISWCTYPE = 0x10C + SYS_ISWXDIGI = 0x10A + SYS_ISWXDIGIT = 0x10A + SYS_MBSINIT = 0x10F + SYS_TOWLOWER = 0x10D + SYS_TOWUPPER = 0x10E + SYS_WCTYPE = 0x10B + SYS_WCSSTR = 0x11B + SYS___RPMTCH = 0x11A + SYS_WCSTOD = 0x12E + SYS_WCSTOK = 0x12C + SYS_WCSTOL = 0x12D + SYS_WCSTOUL = 0x12F + SYS_FGETWC = 0x13C + SYS_FGETWS = 0x13D + SYS_FPUTWC = 0x13E + SYS_FPUTWS = 0x13F + SYS_REGERROR = 0x13B + SYS_REGFREE = 0x13A + SYS_COLLEQUIV = 0x14F + SYS_COLLTOSTR = 0x14E + SYS_ISMCCOLLEL = 0x14C + SYS_STRTOCOLL = 0x14D + SYS_DLLFREE = 0x16F + SYS_DLLQUERYFN = 0x16D + SYS_DLLQUERYVAR = 0x16E + SYS_GETMCCOLL = 0x16A + SYS_GETWMCCOLL = 0x16B + SYS___ERR2AD = 0x16C + SYS_CFSETOSPEED = 0x17A + SYS_CHDIR = 0x17B + SYS_CHMOD = 0x17C + SYS_CHOWN = 0x17D + SYS_CLOSE = 0x17E + SYS_CLOSEDIR = 0x17F + SYS_LOG = 0x017 + SYS_COSH = 0x018 + SYS_FCHMOD = 0x18A + SYS_FCHOWN = 0x18B + SYS_FCNTL = 0x18C + SYS_FILENO = 0x18D + SYS_FORK = 0x18E + SYS_FPATHCONF = 0x18F + SYS_GETLOGIN = 0x19A + SYS_GETPGRP = 0x19C + SYS_GETPID = 0x19D + SYS_GETPPID = 0x19E + SYS_GETPWNAM = 0x19F + SYS_TANH = 0x019 + SYS_W_GETMNTENT = 0x19B + SYS_POW = 0x020 + SYS_PTHREAD_SELF = 0x20A + SYS_PTHREAD_SETINTR = 0x20B + SYS_PTHREAD_SETINTRTYPE = 0x20C + SYS_PTHREAD_SETSPECIFIC = 0x20D + SYS_PTHREAD_TESTINTR = 0x20E + SYS_PTHREAD_YIELD = 0x20F + SYS_SQRT = 0x021 + SYS_FLOOR = 0x022 + SYS_J1 = 0x023 + SYS_WCSPBRK = 0x23F + SYS_BSEARCH = 0x24C + SYS_FABS = 0x024 + SYS_GETENV = 0x24A + SYS_LDIV = 0x24D + SYS_SYSTEM = 0x24B + SYS_FMOD = 0x025 + SYS___RETHROW = 0x25F + SYS___THROW = 0x25E + SYS_J0 = 0x026 + SYS_PUTENV = 0x26A + SYS___GETENV = 0x26F + SYS_SEMCTL = 0x27A + SYS_SEMGET = 0x27B + SYS_SEMOP = 0x27C + SYS_SHMAT = 0x27D + SYS_SHMCTL = 0x27E + SYS_SHMDT = 0x27F + SYS_YN = 0x027 + SYS_JN = 0x028 + SYS_SIGALTSTACK = 0x28A + SYS_SIGHOLD = 0x28B + SYS_SIGIGNORE = 0x28C + SYS_SIGINTERRUPT = 0x28D + SYS_SIGPAUSE = 0x28E + SYS_SIGRELSE = 0x28F + SYS_GETOPT = 0x29A + SYS_GETSUBOPT = 0x29D + SYS_LCHOWN = 0x29B + SYS_SETPGRP = 0x29E + SYS_TRUNCATE = 0x29C + SYS_Y0 = 0x029 + SYS___GDERR = 0x29F + SYS_ISALPHA = 0x030 + SYS_VFORK = 0x30F + SYS__LONGJMP = 0x30D + SYS__SETJMP = 0x30E + SYS_GLOB = 0x31A + SYS_GLOBFREE = 0x31B + SYS_ISALNUM = 0x031 + SYS_PUTW = 0x31C + SYS_SEEKDIR = 0x31D + SYS_TELLDIR = 0x31E + SYS_TEMPNAM = 0x31F + SYS_GETTIMEOFDAY_R = 0x32E + SYS_ISLOWER = 0x032 + SYS_LGAMMA = 0x32C + SYS_REMAINDER = 0x32A + SYS_SCALB = 0x32B + SYS_SYNC = 0x32F + SYS_TTYSLOT = 0x32D + SYS_ENDPROTOENT = 0x33A + SYS_ENDSERVENT = 0x33B + SYS_GETHOSTBYADDR = 0x33D + SYS_GETHOSTBYADDR_R = 0x33C + SYS_GETHOSTBYNAME = 0x33F + SYS_GETHOSTBYNAME_R = 0x33E + SYS_ISCNTRL = 0x033 + SYS_GETSERVBYNAME = 0x34A + SYS_GETSERVBYPORT = 0x34B + SYS_GETSERVENT = 0x34C + SYS_GETSOCKNAME = 0x34D + SYS_GETSOCKOPT = 0x34E + SYS_INET_ADDR = 0x34F + SYS_ISDIGIT = 0x034 + SYS_ISGRAPH = 0x035 + SYS_SELECT = 0x35B + SYS_SELECTEX = 0x35C + SYS_SEND = 0x35D + SYS_SENDTO = 0x35F + SYS_CHROOT = 0x36A + SYS_ISNAN = 0x36D + SYS_ISUPPER = 0x036 + SYS_ULIMIT = 0x36C + SYS_UTIMES = 0x36E + SYS_W_STATVFS = 0x36B + SYS___H_ERRNO = 0x36F + SYS_GRANTPT = 0x37A + SYS_ISPRINT = 0x037 + SYS_TCGETSID = 0x37C + SYS_UNLOCKPT = 0x37B + SYS___TCGETCP = 0x37D + SYS___TCSETCP = 0x37E + SYS___TCSETTABLES = 0x37F + SYS_ISPUNCT = 0x038 + SYS_NLIST = 0x38C + SYS___IPDBCS = 0x38D + SYS___IPDSPX = 0x38E + SYS___IPMSGC = 0x38F + SYS___STHOSTENT = 0x38B + SYS___STSERVENT = 0x38A + SYS_ISSPACE = 0x039 + SYS_COS = 0x040 + SYS_T_ALLOC = 0x40A + SYS_T_BIND = 0x40B + SYS_T_CLOSE = 0x40C + SYS_T_CONNECT = 0x40D + SYS_T_ERROR = 0x40E + SYS_T_FREE = 0x40F + SYS_TAN = 0x041 + SYS_T_RCVREL = 0x41A + SYS_T_RCVUDATA = 0x41B + SYS_T_RCVUDERR = 0x41C + SYS_T_SND = 0x41D + SYS_T_SNDDIS = 0x41E + SYS_T_SNDREL = 0x41F + SYS_GETPMSG = 0x42A + SYS_ISASTREAM = 0x42B + SYS_PUTMSG = 0x42C + SYS_PUTPMSG = 0x42D + SYS_SINH = 0x042 + SYS___ISPOSIXON = 0x42E + SYS___OPENMVSREL = 0x42F + SYS_ACOS = 0x043 + SYS_ATAN = 0x044 + SYS_ATAN2 = 0x045 + SYS_FTELL = 0x046 + SYS_FGETPOS = 0x047 + SYS_SOCK_DEBUG = 0x47A + SYS_SOCK_DO_TESTSTOR = 0x47D + SYS_TAKESOCKET = 0x47E + SYS___SERVER_INIT = 0x47F + SYS_FSEEK = 0x048 + SYS___IPHOST = 0x48B + SYS___IPNODE = 0x48C + SYS___SERVER_CLASSIFY_CREATE = 0x48D + SYS___SERVER_CLASSIFY_DESTROY = 0x48E + SYS___SERVER_CLASSIFY_RESET = 0x48F + SYS___SMF_RECORD = 0x48A + SYS_FSETPOS = 0x049 + SYS___FNWSA = 0x49B + SYS___SPAWN2 = 0x49D + SYS___SPAWNP2 = 0x49E + SYS_ATOF = 0x050 + SYS_PTHREAD_MUTEXATTR_GETPSHARED = 0x50A + SYS_PTHREAD_MUTEXATTR_SETPSHARED = 0x50B + SYS_PTHREAD_RWLOCK_DESTROY = 0x50C + SYS_PTHREAD_RWLOCK_INIT = 0x50D + SYS_PTHREAD_RWLOCK_RDLOCK = 0x50E + SYS_PTHREAD_RWLOCK_TRYRDLOCK = 0x50F + SYS_ATOI = 0x051 + SYS___FP_CLASS = 0x51D + SYS___FP_CLR_FLAG = 0x51A + SYS___FP_FINITE = 0x51E + SYS___FP_ISNAN = 0x51F + SYS___FP_RAISE_XCP = 0x51C + SYS___FP_READ_FLAG = 0x51B + SYS_RAND = 0x052 + SYS_SIGTIMEDWAIT = 0x52D + SYS_SIGWAITINFO = 0x52E + SYS___CHKBFP = 0x52F + SYS___FPC_RS = 0x52C + SYS___FPC_RW = 0x52A + SYS___FPC_SM = 0x52B + SYS_STRTOD = 0x053 + SYS_STRTOL = 0x054 + SYS_STRTOUL = 0x055 + SYS_MALLOC = 0x056 + SYS_SRAND = 0x057 + SYS_CALLOC = 0x058 + SYS_FREE = 0x059 + SYS___OSENV = 0x59F + SYS___W_PIOCTL = 0x59E + SYS_LONGJMP = 0x060 + SYS___FLOORF_B = 0x60A + SYS___FLOORL_B = 0x60B + SYS___FREXPF_B = 0x60C + SYS___FREXPL_B = 0x60D + SYS___LDEXPF_B = 0x60E + SYS___LDEXPL_B = 0x60F + SYS_SIGNAL = 0x061 + SYS___ATAN2F_B = 0x61A + SYS___ATAN2L_B = 0x61B + SYS___COSHF_B = 0x61C + SYS___COSHL_B = 0x61D + SYS___EXPF_B = 0x61E + SYS___EXPL_B = 0x61F + SYS_TMPNAM = 0x062 + SYS___ABSF_B = 0x62A + SYS___ABSL_B = 0x62C + SYS___ABS_B = 0x62B + SYS___FMODF_B = 0x62D + SYS___FMODL_B = 0x62E + SYS___MODFF_B = 0x62F + SYS_ATANL = 0x63A + SYS_CEILF = 0x63B + SYS_CEILL = 0x63C + SYS_COSF = 0x63D + SYS_COSHF = 0x63F + SYS_COSL = 0x63E + SYS_REMOVE = 0x063 + SYS_POWL = 0x64A + SYS_RENAME = 0x064 + SYS_SINF = 0x64B + SYS_SINHF = 0x64F + SYS_SINL = 0x64C + SYS_SQRTF = 0x64D + SYS_SQRTL = 0x64E + SYS_BTOWC = 0x65F + SYS_FREXPL = 0x65A + SYS_LDEXPF = 0x65B + SYS_LDEXPL = 0x65C + SYS_MODFF = 0x65D + SYS_MODFL = 0x65E + SYS_TMPFILE = 0x065 + SYS_FREOPEN = 0x066 + SYS___CHARMAP_INIT_A = 0x66E + SYS___GETHOSTBYADDR_R_A = 0x66C + SYS___GETHOSTBYNAME_A = 0x66A + SYS___GETHOSTBYNAME_R_A = 0x66D + SYS___MBLEN_A = 0x66F + SYS___RES_INIT_A = 0x66B + SYS_FCLOSE = 0x067 + SYS___GETGRGID_R_A = 0x67D + SYS___WCSTOMBS_A = 0x67A + SYS___WCSTOMBS_STD_A = 0x67B + SYS___WCSWIDTH_A = 0x67C + SYS___WCSWIDTH_ASIA = 0x67F + SYS___WCSWIDTH_STD_A = 0x67E + SYS_FFLUSH = 0x068 + SYS___GETLOGIN_R_A = 0x68E + SYS___GETPWNAM_R_A = 0x68C + SYS___GETPWUID_R_A = 0x68D + SYS___TTYNAME_R_A = 0x68F + SYS___WCWIDTH_ASIA = 0x68B + SYS___WCWIDTH_STD_A = 0x68A + SYS_FOPEN = 0x069 + SYS___REGEXEC_A = 0x69A + SYS___REGEXEC_STD_A = 0x69B + SYS___REGFREE_A = 0x69C + SYS___REGFREE_STD_A = 0x69D + SYS___STRCOLL_A = 0x69E + SYS___STRCOLL_C_A = 0x69F + SYS_SCANF = 0x070 + SYS___A64L_A = 0x70C + SYS___ECVT_A = 0x70D + SYS___FCVT_A = 0x70E + SYS___GCVT_A = 0x70F + SYS___STRTOUL_A = 0x70A + SYS_____AE_CORRESTBL_QUERY_A = 0x70B + SYS_SPRINTF = 0x071 + SYS___ACCESS_A = 0x71F + SYS___CATOPEN_A = 0x71E + SYS___GETOPT_A = 0x71D + SYS___REALPATH_A = 0x71A + SYS___SETENV_A = 0x71B + SYS___SYSTEM_A = 0x71C + SYS_FGETC = 0x072 + SYS___GAI_STRERROR_A = 0x72F + SYS___RMDIR_A = 0x72A + SYS___STATVFS_A = 0x72B + SYS___SYMLINK_A = 0x72C + SYS___TRUNCATE_A = 0x72D + SYS___UNLINK_A = 0x72E + SYS_VFPRINTF = 0x073 + SYS___ISSPACE_A = 0x73A + SYS___ISUPPER_A = 0x73B + SYS___ISWALNUM_A = 0x73F + SYS___ISXDIGIT_A = 0x73C + SYS___TOLOWER_A = 0x73D + SYS___TOUPPER_A = 0x73E + SYS_VPRINTF = 0x074 + SYS___CONFSTR_A = 0x74B + SYS___FDOPEN_A = 0x74E + SYS___FLDATA_A = 0x74F + SYS___FTOK_A = 0x74C + SYS___ISWXDIGIT_A = 0x74A + SYS___MKTEMP_A = 0x74D + SYS_VSPRINTF = 0x075 + SYS___GETGRGID_A = 0x75A + SYS___GETGRNAM_A = 0x75B + SYS___GETGROUPSBYNAME_A = 0x75C + SYS___GETHOSTENT_A = 0x75D + SYS___GETHOSTNAME_A = 0x75E + SYS___GETLOGIN_A = 0x75F + SYS_GETC = 0x076 + SYS___CREATEWORKUNIT_A = 0x76A + SYS___CTERMID_A = 0x76B + SYS___FMTMSG_A = 0x76C + SYS___INITGROUPS_A = 0x76D + SYS___MSGRCV_A = 0x76F + SYS_____LOGIN_A = 0x76E + SYS_FGETS = 0x077 + SYS___STRCASECMP_A = 0x77B + SYS___STRNCASECMP_A = 0x77C + SYS___TTYNAME_A = 0x77D + SYS___UNAME_A = 0x77E + SYS___UTIMES_A = 0x77F + SYS_____SERVER_PWU_A = 0x77A + SYS_FPUTC = 0x078 + SYS___CREAT_O_A = 0x78E + SYS___ENVNA = 0x78F + SYS___FREAD_A = 0x78A + SYS___FWRITE_A = 0x78B + SYS___ISASCII = 0x78D + SYS___OPEN_O_A = 0x78C + SYS_FPUTS = 0x079 + SYS___ASCTIME_A = 0x79C + SYS___CTIME_A = 0x79D + SYS___GETDATE_A = 0x79E + SYS___GETSERVBYPORT_A = 0x79A + SYS___GETSERVENT_A = 0x79B + SYS___TZSET_A = 0x79F + SYS_ACL_FROM_TEXT = 0x80C + SYS_ACL_SET_FD = 0x80A + SYS_ACL_SET_FILE = 0x80B + SYS_ACL_SORT = 0x80E + SYS_ACL_TO_TEXT = 0x80D + SYS_UNGETC = 0x080 + SYS___SHUTDOWN_REGISTRATION = 0x80F + SYS_FREAD = 0x081 + SYS_FREEADDRINFO = 0x81A + SYS_GAI_STRERROR = 0x81B + SYS_REXEC_AF = 0x81C + SYS___DYNALLOC_A = 0x81F + SYS___POE = 0x81D + SYS_WCSTOMBS = 0x082 + SYS___INET_ADDR_A = 0x82F + SYS___NLIST_A = 0x82A + SYS_____TCGETCP_A = 0x82B + SYS_____TCSETCP_A = 0x82C + SYS_____W_PIOCTL_A = 0x82E + SYS_MBTOWC = 0x083 + SYS___CABEND = 0x83D + SYS___LE_CIB_GET = 0x83E + SYS___RECVMSG_A = 0x83B + SYS___SENDMSG_A = 0x83A + SYS___SET_LAA_FOR_JIT = 0x83F + SYS_____LCHATTR_A = 0x83C + SYS_WCTOMB = 0x084 + SYS___CBRTL_B = 0x84A + SYS___COPYSIGNF_B = 0x84B + SYS___COPYSIGNL_B = 0x84C + SYS___COTANF_B = 0x84D + SYS___COTANL_B = 0x84F + SYS___COTAN_B = 0x84E + SYS_MBSTOWCS = 0x085 + SYS___LOG1PL_B = 0x85A + SYS___LOG2F_B = 0x85B + SYS___LOG2L_B = 0x85D + SYS___LOG2_B = 0x85C + SYS___REMAINDERF_B = 0x85E + SYS___REMAINDERL_B = 0x85F + SYS_ACOSHF = 0x86E + SYS_ACOSHL = 0x86F + SYS_WCSCPY = 0x086 + SYS___ERFCF_B = 0x86D + SYS___ERFF_B = 0x86C + SYS___LROUNDF_B = 0x86A + SYS___LROUND_B = 0x86B + SYS_COTANL = 0x87A + SYS_EXP2F = 0x87B + SYS_EXP2L = 0x87C + SYS_EXPM1F = 0x87D + SYS_EXPM1L = 0x87E + SYS_FDIMF = 0x87F + SYS_WCSCAT = 0x087 + SYS___COTANL = 0x87A + SYS_REMAINDERF = 0x88A + SYS_REMAINDERL = 0x88B + SYS_REMAINDF = 0x88A + SYS_REMAINDL = 0x88B + SYS_REMQUO = 0x88D + SYS_REMQUOF = 0x88C + SYS_REMQUOL = 0x88E + SYS_TGAMMAF = 0x88F + SYS_WCSCHR = 0x088 + SYS_ERFCF = 0x89B + SYS_ERFCL = 0x89C + SYS_ERFL = 0x89A + SYS_EXP2 = 0x89E + SYS_WCSCMP = 0x089 + SYS___EXP2_B = 0x89D + SYS___FAR_JUMP = 0x89F + SYS_ABS = 0x090 + SYS___ERFCL_H = 0x90A + SYS___EXPF_H = 0x90C + SYS___EXPL_H = 0x90D + SYS___EXPM1_H = 0x90E + SYS___EXP_H = 0x90B + SYS___FDIM_H = 0x90F + SYS_DIV = 0x091 + SYS___LOG2F_H = 0x91F + SYS___LOG2_H = 0x91E + SYS___LOGB_H = 0x91D + SYS___LOGF_H = 0x91B + SYS___LOGL_H = 0x91C + SYS___LOG_H = 0x91A + SYS_LABS = 0x092 + SYS___POWL_H = 0x92A + SYS___REMAINDER_H = 0x92B + SYS___RINT_H = 0x92C + SYS___SCALB_H = 0x92D + SYS___SINF_H = 0x92F + SYS___SIN_H = 0x92E + SYS_STRNCPY = 0x093 + SYS___TANHF_H = 0x93B + SYS___TANHL_H = 0x93C + SYS___TANH_H = 0x93A + SYS___TGAMMAF_H = 0x93E + SYS___TGAMMA_H = 0x93D + SYS___TRUNC_H = 0x93F + SYS_MEMCPY = 0x094 + SYS_VFWSCANF = 0x94A + SYS_VSWSCANF = 0x94E + SYS_VWSCANF = 0x94C + SYS_INET6_RTH_ADD = 0x95D + SYS_INET6_RTH_INIT = 0x95C + SYS_INET6_RTH_REVERSE = 0x95E + SYS_INET6_RTH_SEGMENTS = 0x95F + SYS_INET6_RTH_SPACE = 0x95B + SYS_MEMMOVE = 0x095 + SYS_WCSTOLD = 0x95A + SYS_STRCPY = 0x096 + SYS_STRCMP = 0x097 + SYS_CABS = 0x98E + SYS_STRCAT = 0x098 + SYS___CABS_B = 0x98F + SYS___POW_II = 0x98A + SYS___POW_II_B = 0x98B + SYS___POW_II_H = 0x98C + SYS_CACOSF = 0x99A + SYS_CACOSL = 0x99D + SYS_STRNCAT = 0x099 + SYS___CACOSF_B = 0x99B + SYS___CACOSF_H = 0x99C + SYS___CACOSL_B = 0x99E + SYS___CACOSL_H = 0x99F + SYS_ISWALPHA = 0x100 + SYS_ISWBLANK = 0x101 + SYS___ISWBLK = 0x101 + SYS_ISWCNTRL = 0x102 + SYS_ISWDIGIT = 0x103 + SYS_ISWGRAPH = 0x104 + SYS_ISWLOWER = 0x105 + SYS_ISWPRINT = 0x106 + SYS_ISWPUNCT = 0x107 + SYS_ISWSPACE = 0x108 + SYS_ISWUPPER = 0x109 + SYS_WCTOB = 0x110 + SYS_MBRLEN = 0x111 + SYS_MBRTOWC = 0x112 + SYS_MBSRTOWC = 0x113 + SYS_MBSRTOWCS = 0x113 + SYS_WCRTOMB = 0x114 + SYS_WCSRTOMB = 0x115 + SYS_WCSRTOMBS = 0x115 + SYS___CSID = 0x116 + SYS___WCSID = 0x117 + SYS_STRPTIME = 0x118 + SYS___STRPTM = 0x118 + SYS_STRFMON = 0x119 + SYS_WCSCOLL = 0x130 + SYS_WCSXFRM = 0x131 + SYS_WCSWIDTH = 0x132 + SYS_WCWIDTH = 0x133 + SYS_WCSFTIME = 0x134 + SYS_SWPRINTF = 0x135 + SYS_VSWPRINT = 0x136 + SYS_VSWPRINTF = 0x136 + SYS_SWSCANF = 0x137 + SYS_REGCOMP = 0x138 + SYS_REGEXEC = 0x139 + SYS_GETWC = 0x140 + SYS_GETWCHAR = 0x141 + SYS_PUTWC = 0x142 + SYS_PUTWCHAR = 0x143 + SYS_UNGETWC = 0x144 + SYS_ICONV_OPEN = 0x145 + SYS_ICONV = 0x146 + SYS_ICONV_CLOSE = 0x147 + SYS_COLLRANGE = 0x150 + SYS_CCLASS = 0x151 + SYS_COLLORDER = 0x152 + SYS___DEMANGLE = 0x154 + SYS_FDOPEN = 0x155 + SYS___ERRNO = 0x156 + SYS___ERRNO2 = 0x157 + SYS___TERROR = 0x158 + SYS_MAXCOLL = 0x169 + SYS_DLLLOAD = 0x170 + SYS__EXIT = 0x174 + SYS_ACCESS = 0x175 + SYS_ALARM = 0x176 + SYS_CFGETISPEED = 0x177 + SYS_CFGETOSPEED = 0x178 + SYS_CFSETISPEED = 0x179 + SYS_CREAT = 0x180 + SYS_CTERMID = 0x181 + SYS_DUP = 0x182 + SYS_DUP2 = 0x183 + SYS_EXECL = 0x184 + SYS_EXECLE = 0x185 + SYS_EXECLP = 0x186 + SYS_EXECV = 0x187 + SYS_EXECVE = 0x188 + SYS_EXECVP = 0x189 + SYS_FSTAT = 0x190 + SYS_FSYNC = 0x191 + SYS_FTRUNCATE = 0x192 + SYS_GETCWD = 0x193 + SYS_GETEGID = 0x194 + SYS_GETEUID = 0x195 + SYS_GETGID = 0x196 + SYS_GETGRGID = 0x197 + SYS_GETGRNAM = 0x198 + SYS_GETGROUPS = 0x199 + SYS_PTHREAD_MUTEXATTR_DESTROY = 0x200 + SYS_PTHREAD_MUTEXATTR_SETKIND_NP = 0x201 + SYS_PTHREAD_MUTEXATTR_GETKIND_NP = 0x202 + SYS_PTHREAD_MUTEX_INIT = 0x203 + SYS_PTHREAD_MUTEX_DESTROY = 0x204 + SYS_PTHREAD_MUTEX_LOCK = 0x205 + SYS_PTHREAD_MUTEX_TRYLOCK = 0x206 + SYS_PTHREAD_MUTEX_UNLOCK = 0x207 + SYS_PTHREAD_ONCE = 0x209 + SYS_TW_OPEN = 0x210 + SYS_TW_FCNTL = 0x211 + SYS_PTHREAD_JOIN_D4_NP = 0x212 + SYS_PTHREAD_CONDATTR_SETKIND_NP = 0x213 + SYS_PTHREAD_CONDATTR_GETKIND_NP = 0x214 + SYS_EXTLINK_NP = 0x215 + SYS___PASSWD = 0x216 + SYS_SETGROUPS = 0x217 + SYS_INITGROUPS = 0x218 + SYS_WCSRCHR = 0x240 + SYS_SVC99 = 0x241 + SYS___SVC99 = 0x241 + SYS_WCSWCS = 0x242 + SYS_LOCALECO = 0x243 + SYS_LOCALECONV = 0x243 + SYS___LIBREL = 0x244 + SYS_RELEASE = 0x245 + SYS___RLSE = 0x245 + SYS_FLOCATE = 0x246 + SYS___FLOCT = 0x246 + SYS_FDELREC = 0x247 + SYS___FDLREC = 0x247 + SYS_FETCH = 0x248 + SYS___FETCH = 0x248 + SYS_QSORT = 0x249 + SYS___CLEANUPCATCH = 0x260 + SYS___CATCHMATCH = 0x261 + SYS___CLEAN2UPCATCH = 0x262 + SYS_GETPRIORITY = 0x270 + SYS_NICE = 0x271 + SYS_SETPRIORITY = 0x272 + SYS_GETITIMER = 0x273 + SYS_SETITIMER = 0x274 + SYS_MSGCTL = 0x275 + SYS_MSGGET = 0x276 + SYS_MSGRCV = 0x277 + SYS_MSGSND = 0x278 + SYS_MSGXRCV = 0x279 + SYS___MSGXR = 0x279 + SYS_SHMGET = 0x280 + SYS___GETIPC = 0x281 + SYS_SETGRENT = 0x282 + SYS_GETGRENT = 0x283 + SYS_ENDGRENT = 0x284 + SYS_SETPWENT = 0x285 + SYS_GETPWENT = 0x286 + SYS_ENDPWENT = 0x287 + SYS_BSD_SIGNAL = 0x288 + SYS_KILLPG = 0x289 + SYS_SIGSET = 0x290 + SYS_SIGSTACK = 0x291 + SYS_GETRLIMIT = 0x292 + SYS_SETRLIMIT = 0x293 + SYS_GETRUSAGE = 0x294 + SYS_MMAP = 0x295 + SYS_MPROTECT = 0x296 + SYS_MSYNC = 0x297 + SYS_MUNMAP = 0x298 + SYS_CONFSTR = 0x299 + SYS___NDMTRM = 0x300 + SYS_FTOK = 0x301 + SYS_BASENAME = 0x302 + SYS_DIRNAME = 0x303 + SYS_GETDTABLESIZE = 0x304 + SYS_MKSTEMP = 0x305 + SYS_MKTEMP = 0x306 + SYS_NFTW = 0x307 + SYS_GETWD = 0x308 + SYS_LOCKF = 0x309 + SYS_WORDEXP = 0x310 + SYS_WORDFREE = 0x311 + SYS_GETPGID = 0x312 + SYS_GETSID = 0x313 + SYS___UTMPXNAME = 0x314 + SYS_CUSERID = 0x315 + SYS_GETPASS = 0x316 + SYS_FNMATCH = 0x317 + SYS_FTW = 0x318 + SYS_GETW = 0x319 + SYS_ACOSH = 0x320 + SYS_ASINH = 0x321 + SYS_ATANH = 0x322 + SYS_CBRT = 0x323 + SYS_EXPM1 = 0x324 + SYS_ILOGB = 0x325 + SYS_LOGB = 0x326 + SYS_LOG1P = 0x327 + SYS_NEXTAFTER = 0x328 + SYS_RINT = 0x329 + SYS_SPAWN = 0x330 + SYS_SPAWNP = 0x331 + SYS_GETLOGIN_UU = 0x332 + SYS_ECVT = 0x333 + SYS_FCVT = 0x334 + SYS_GCVT = 0x335 + SYS_ACCEPT = 0x336 + SYS_BIND = 0x337 + SYS_CONNECT = 0x338 + SYS_ENDHOSTENT = 0x339 + SYS_GETHOSTENT = 0x340 + SYS_GETHOSTID = 0x341 + SYS_GETHOSTNAME = 0x342 + SYS_GETNETBYADDR = 0x343 + SYS_GETNETBYNAME = 0x344 + SYS_GETNETENT = 0x345 + SYS_GETPEERNAME = 0x346 + SYS_GETPROTOBYNAME = 0x347 + SYS_GETPROTOBYNUMBER = 0x348 + SYS_GETPROTOENT = 0x349 + SYS_INET_LNAOF = 0x350 + SYS_INET_MAKEADDR = 0x351 + SYS_INET_NETOF = 0x352 + SYS_INET_NETWORK = 0x353 + SYS_INET_NTOA = 0x354 + SYS_IOCTL = 0x355 + SYS_LISTEN = 0x356 + SYS_READV = 0x357 + SYS_RECV = 0x358 + SYS_RECVFROM = 0x359 + SYS_SETHOSTENT = 0x360 + SYS_SETNETENT = 0x361 + SYS_SETPEER = 0x362 + SYS_SETPROTOENT = 0x363 + SYS_SETSERVENT = 0x364 + SYS_SETSOCKOPT = 0x365 + SYS_SHUTDOWN = 0x366 + SYS_SOCKET = 0x367 + SYS_SOCKETPAIR = 0x368 + SYS_WRITEV = 0x369 + SYS_ENDNETENT = 0x370 + SYS_CLOSELOG = 0x371 + SYS_OPENLOG = 0x372 + SYS_SETLOGMASK = 0x373 + SYS_SYSLOG = 0x374 + SYS_PTSNAME = 0x375 + SYS_SETREUID = 0x376 + SYS_SETREGID = 0x377 + SYS_REALPATH = 0x378 + SYS___SIGNGAM = 0x379 + SYS_POLL = 0x380 + SYS_REXEC = 0x381 + SYS___ISASCII2 = 0x382 + SYS___TOASCII2 = 0x383 + SYS_CHPRIORITY = 0x384 + SYS_PTHREAD_ATTR_SETSYNCTYPE_NP = 0x385 + SYS_PTHREAD_ATTR_GETSYNCTYPE_NP = 0x386 + SYS_PTHREAD_SET_LIMIT_NP = 0x387 + SYS___STNETENT = 0x388 + SYS___STPROTOENT = 0x389 + SYS___SELECT1 = 0x390 + SYS_PTHREAD_SECURITY_NP = 0x391 + SYS___CHECK_RESOURCE_AUTH_NP = 0x392 + SYS___CONVERT_ID_NP = 0x393 + SYS___OPENVMREL = 0x394 + SYS_WMEMCHR = 0x395 + SYS_WMEMCMP = 0x396 + SYS_WMEMCPY = 0x397 + SYS_WMEMMOVE = 0x398 + SYS_WMEMSET = 0x399 + SYS___FPUTWC = 0x400 + SYS___PUTWC = 0x401 + SYS___PWCHAR = 0x402 + SYS___WCSFTM = 0x403 + SYS___WCSTOK = 0x404 + SYS___WCWDTH = 0x405 + SYS_T_ACCEPT = 0x409 + SYS_T_GETINFO = 0x410 + SYS_T_GETPROTADDR = 0x411 + SYS_T_GETSTATE = 0x412 + SYS_T_LISTEN = 0x413 + SYS_T_LOOK = 0x414 + SYS_T_OPEN = 0x415 + SYS_T_OPTMGMT = 0x416 + SYS_T_RCV = 0x417 + SYS_T_RCVCONNECT = 0x418 + SYS_T_RCVDIS = 0x419 + SYS_T_SNDUDATA = 0x420 + SYS_T_STRERROR = 0x421 + SYS_T_SYNC = 0x422 + SYS_T_UNBIND = 0x423 + SYS___T_ERRNO = 0x424 + SYS___RECVMSG2 = 0x425 + SYS___SENDMSG2 = 0x426 + SYS_FATTACH = 0x427 + SYS_FDETACH = 0x428 + SYS_GETMSG = 0x429 + SYS_GETCONTEXT = 0x430 + SYS_SETCONTEXT = 0x431 + SYS_MAKECONTEXT = 0x432 + SYS_SWAPCONTEXT = 0x433 + SYS_PTHREAD_GETSPECIFIC_D8_NP = 0x434 + SYS_GETCLIENTID = 0x470 + SYS___GETCLIENTID = 0x471 + SYS_GETSTABLESIZE = 0x472 + SYS_GETIBMOPT = 0x473 + SYS_GETIBMSOCKOPT = 0x474 + SYS_GIVESOCKET = 0x475 + SYS_IBMSFLUSH = 0x476 + SYS_MAXDESC = 0x477 + SYS_SETIBMOPT = 0x478 + SYS_SETIBMSOCKOPT = 0x479 + SYS___SERVER_PWU = 0x480 + SYS_PTHREAD_TAG_NP = 0x481 + SYS___CONSOLE = 0x482 + SYS___WSINIT = 0x483 + SYS___IPTCPN = 0x489 + SYS___SERVER_CLASSIFY = 0x490 + SYS___HEAPRPT = 0x496 + SYS___ISBFP = 0x500 + SYS___FP_CAST = 0x501 + SYS___CERTIFICATE = 0x502 + SYS_SEND_FILE = 0x503 + SYS_AIO_CANCEL = 0x504 + SYS_AIO_ERROR = 0x505 + SYS_AIO_READ = 0x506 + SYS_AIO_RETURN = 0x507 + SYS_AIO_SUSPEND = 0x508 + SYS_AIO_WRITE = 0x509 + SYS_PTHREAD_RWLOCK_TRYWRLOCK = 0x510 + SYS_PTHREAD_RWLOCK_UNLOCK = 0x511 + SYS_PTHREAD_RWLOCK_WRLOCK = 0x512 + SYS_PTHREAD_RWLOCKATTR_GETPSHARED = 0x513 + SYS_PTHREAD_RWLOCKATTR_SETPSHARED = 0x514 + SYS_PTHREAD_RWLOCKATTR_INIT = 0x515 + SYS_PTHREAD_RWLOCKATTR_DESTROY = 0x516 + SYS___CTTBL = 0x517 + SYS_PTHREAD_MUTEXATTR_SETTYPE = 0x518 + SYS_PTHREAD_MUTEXATTR_GETTYPE = 0x519 + SYS___FP_UNORDERED = 0x520 + SYS___FP_READ_RND = 0x521 + SYS___FP_READ_RND_B = 0x522 + SYS___FP_SWAP_RND = 0x523 + SYS___FP_SWAP_RND_B = 0x524 + SYS___FP_LEVEL = 0x525 + SYS___FP_BTOH = 0x526 + SYS___FP_HTOB = 0x527 + SYS___FPC_RD = 0x528 + SYS___FPC_WR = 0x529 + SYS_PTHREAD_SETCANCELTYPE = 0x600 + SYS_PTHREAD_TESTCANCEL = 0x601 + SYS___ATANF_B = 0x602 + SYS___ATANL_B = 0x603 + SYS___CEILF_B = 0x604 + SYS___CEILL_B = 0x605 + SYS___COSF_B = 0x606 + SYS___COSL_B = 0x607 + SYS___FABSF_B = 0x608 + SYS___FABSL_B = 0x609 + SYS___SINF_B = 0x610 + SYS___SINL_B = 0x611 + SYS___TANF_B = 0x612 + SYS___TANL_B = 0x613 + SYS___TANHF_B = 0x614 + SYS___TANHL_B = 0x615 + SYS___ACOSF_B = 0x616 + SYS___ACOSL_B = 0x617 + SYS___ASINF_B = 0x618 + SYS___ASINL_B = 0x619 + SYS___LOGF_B = 0x620 + SYS___LOGL_B = 0x621 + SYS___LOG10F_B = 0x622 + SYS___LOG10L_B = 0x623 + SYS___POWF_B = 0x624 + SYS___POWL_B = 0x625 + SYS___SINHF_B = 0x626 + SYS___SINHL_B = 0x627 + SYS___SQRTF_B = 0x628 + SYS___SQRTL_B = 0x629 + SYS___MODFL_B = 0x630 + SYS_ABSF = 0x631 + SYS_ABSL = 0x632 + SYS_ACOSF = 0x633 + SYS_ACOSL = 0x634 + SYS_ASINF = 0x635 + SYS_ASINL = 0x636 + SYS_ATAN2F = 0x637 + SYS_ATAN2L = 0x638 + SYS_ATANF = 0x639 + SYS_COSHL = 0x640 + SYS_EXPF = 0x641 + SYS_EXPL = 0x642 + SYS_TANHF = 0x643 + SYS_TANHL = 0x644 + SYS_LOG10F = 0x645 + SYS_LOG10L = 0x646 + SYS_LOGF = 0x647 + SYS_LOGL = 0x648 + SYS_POWF = 0x649 + SYS_SINHL = 0x650 + SYS_TANF = 0x651 + SYS_TANL = 0x652 + SYS_FABSF = 0x653 + SYS_FABSL = 0x654 + SYS_FLOORF = 0x655 + SYS_FLOORL = 0x656 + SYS_FMODF = 0x657 + SYS_FMODL = 0x658 + SYS_FREXPF = 0x659 + SYS___CHATTR = 0x660 + SYS___FCHATTR = 0x661 + SYS___TOCCSID = 0x662 + SYS___CSNAMETYPE = 0x663 + SYS___TOCSNAME = 0x664 + SYS___CCSIDTYPE = 0x665 + SYS___AE_CORRESTBL_QUERY = 0x666 + SYS___AE_AUTOCONVERT_STATE = 0x667 + SYS_DN_FIND = 0x668 + SYS___GETHOSTBYADDR_A = 0x669 + SYS___MBLEN_SB_A = 0x670 + SYS___MBLEN_STD_A = 0x671 + SYS___MBLEN_UTF = 0x672 + SYS___MBSTOWCS_A = 0x673 + SYS___MBSTOWCS_STD_A = 0x674 + SYS___MBTOWC_A = 0x675 + SYS___MBTOWC_ISO1 = 0x676 + SYS___MBTOWC_SBCS = 0x677 + SYS___MBTOWC_MBCS = 0x678 + SYS___MBTOWC_UTF = 0x679 + SYS___CSID_A = 0x680 + SYS___CSID_STD_A = 0x681 + SYS___WCSID_A = 0x682 + SYS___WCSID_STD_A = 0x683 + SYS___WCTOMB_A = 0x684 + SYS___WCTOMB_ISO1 = 0x685 + SYS___WCTOMB_STD_A = 0x686 + SYS___WCTOMB_UTF = 0x687 + SYS___WCWIDTH_A = 0x688 + SYS___GETGRNAM_R_A = 0x689 + SYS___READDIR_R_A = 0x690 + SYS___E2A_S = 0x691 + SYS___FNMATCH_A = 0x692 + SYS___FNMATCH_C_A = 0x693 + SYS___EXECL_A = 0x694 + SYS___FNMATCH_STD_A = 0x695 + SYS___REGCOMP_A = 0x696 + SYS___REGCOMP_STD_A = 0x697 + SYS___REGERROR_A = 0x698 + SYS___REGERROR_STD_A = 0x699 + SYS___SWPRINTF_A = 0x700 + SYS___FSCANF_A = 0x701 + SYS___SCANF_A = 0x702 + SYS___SSCANF_A = 0x703 + SYS___SWSCANF_A = 0x704 + SYS___ATOF_A = 0x705 + SYS___ATOI_A = 0x706 + SYS___ATOL_A = 0x707 + SYS___STRTOD_A = 0x708 + SYS___STRTOL_A = 0x709 + SYS___L64A_A = 0x710 + SYS___STRERROR_A = 0x711 + SYS___PERROR_A = 0x712 + SYS___FETCH_A = 0x713 + SYS___GETENV_A = 0x714 + SYS___MKSTEMP_A = 0x717 + SYS___PTSNAME_A = 0x718 + SYS___PUTENV_A = 0x719 + SYS___CHDIR_A = 0x720 + SYS___CHOWN_A = 0x721 + SYS___CHROOT_A = 0x722 + SYS___GETCWD_A = 0x723 + SYS___GETWD_A = 0x724 + SYS___LCHOWN_A = 0x725 + SYS___LINK_A = 0x726 + SYS___PATHCONF_A = 0x727 + SYS___IF_NAMEINDEX_A = 0x728 + SYS___READLINK_A = 0x729 + SYS___EXTLINK_NP_A = 0x730 + SYS___ISALNUM_A = 0x731 + SYS___ISALPHA_A = 0x732 + SYS___A2E_S = 0x733 + SYS___ISCNTRL_A = 0x734 + SYS___ISDIGIT_A = 0x735 + SYS___ISGRAPH_A = 0x736 + SYS___ISLOWER_A = 0x737 + SYS___ISPRINT_A = 0x738 + SYS___ISPUNCT_A = 0x739 + SYS___ISWALPHA_A = 0x740 + SYS___A2E_L = 0x741 + SYS___ISWCNTRL_A = 0x742 + SYS___ISWDIGIT_A = 0x743 + SYS___ISWGRAPH_A = 0x744 + SYS___ISWLOWER_A = 0x745 + SYS___ISWPRINT_A = 0x746 + SYS___ISWPUNCT_A = 0x747 + SYS___ISWSPACE_A = 0x748 + SYS___ISWUPPER_A = 0x749 + SYS___REMOVE_A = 0x750 + SYS___RENAME_A = 0x751 + SYS___TMPNAM_A = 0x752 + SYS___FOPEN_A = 0x753 + SYS___FREOPEN_A = 0x754 + SYS___CUSERID_A = 0x755 + SYS___POPEN_A = 0x756 + SYS___TEMPNAM_A = 0x757 + SYS___FTW_A = 0x758 + SYS___GETGRENT_A = 0x759 + SYS___INET_NTOP_A = 0x760 + SYS___GETPASS_A = 0x761 + SYS___GETPWENT_A = 0x762 + SYS___GETPWNAM_A = 0x763 + SYS___GETPWUID_A = 0x764 + SYS_____CHECK_RESOURCE_AUTH_NP_A = 0x765 + SYS___CHECKSCHENV_A = 0x766 + SYS___CONNECTSERVER_A = 0x767 + SYS___CONNECTWORKMGR_A = 0x768 + SYS_____CONSOLE_A = 0x769 + SYS___MSGSND_A = 0x770 + SYS___MSGXRCV_A = 0x771 + SYS___NFTW_A = 0x772 + SYS_____PASSWD_A = 0x773 + SYS___PTHREAD_SECURITY_NP_A = 0x774 + SYS___QUERYMETRICS_A = 0x775 + SYS___QUERYSCHENV = 0x776 + SYS___READV_A = 0x777 + SYS_____SERVER_CLASSIFY_A = 0x778 + SYS_____SERVER_INIT_A = 0x779 + SYS___W_GETPSENT_A = 0x780 + SYS___WRITEV_A = 0x781 + SYS___W_STATFS_A = 0x782 + SYS___W_STATVFS_A = 0x783 + SYS___FPUTC_A = 0x784 + SYS___PUTCHAR_A = 0x785 + SYS___PUTS_A = 0x786 + SYS___FGETS_A = 0x787 + SYS___GETS_A = 0x788 + SYS___FPUTS_A = 0x789 + SYS___PUTC_A = 0x790 + SYS___AE_THREAD_SETMODE = 0x791 + SYS___AE_THREAD_SWAPMODE = 0x792 + SYS___GETNETBYADDR_A = 0x793 + SYS___GETNETBYNAME_A = 0x794 + SYS___GETNETENT_A = 0x795 + SYS___GETPROTOBYNAME_A = 0x796 + SYS___GETPROTOBYNUMBER_A = 0x797 + SYS___GETPROTOENT_A = 0x798 + SYS___GETSERVBYNAME_A = 0x799 + SYS_ACL_FIRST_ENTRY = 0x800 + SYS_ACL_GET_ENTRY = 0x801 + SYS_ACL_VALID = 0x802 + SYS_ACL_CREATE_ENTRY = 0x803 + SYS_ACL_DELETE_ENTRY = 0x804 + SYS_ACL_UPDATE_ENTRY = 0x805 + SYS_ACL_DELETE_FD = 0x806 + SYS_ACL_DELETE_FILE = 0x807 + SYS_ACL_GET_FD = 0x808 + SYS_ACL_GET_FILE = 0x809 + SYS___ERFL_B = 0x810 + SYS___ERFCL_B = 0x811 + SYS___LGAMMAL_B = 0x812 + SYS___SETHOOKEVENTS = 0x813 + SYS_IF_NAMETOINDEX = 0x814 + SYS_IF_INDEXTONAME = 0x815 + SYS_IF_NAMEINDEX = 0x816 + SYS_IF_FREENAMEINDEX = 0x817 + SYS_GETADDRINFO = 0x818 + SYS_GETNAMEINFO = 0x819 + SYS___DYNFREE_A = 0x820 + SYS___RES_QUERY_A = 0x821 + SYS___RES_SEARCH_A = 0x822 + SYS___RES_QUERYDOMAIN_A = 0x823 + SYS___RES_MKQUERY_A = 0x824 + SYS___RES_SEND_A = 0x825 + SYS___DN_EXPAND_A = 0x826 + SYS___DN_SKIPNAME_A = 0x827 + SYS___DN_COMP_A = 0x828 + SYS___DN_FIND_A = 0x829 + SYS___INET_NTOA_A = 0x830 + SYS___INET_NETWORK_A = 0x831 + SYS___ACCEPT_A = 0x832 + SYS___ACCEPT_AND_RECV_A = 0x833 + SYS___BIND_A = 0x834 + SYS___CONNECT_A = 0x835 + SYS___GETPEERNAME_A = 0x836 + SYS___GETSOCKNAME_A = 0x837 + SYS___RECVFROM_A = 0x838 + SYS___SENDTO_A = 0x839 + SYS___LCHATTR = 0x840 + SYS___WRITEDOWN = 0x841 + SYS_PTHREAD_MUTEX_INIT2 = 0x842 + SYS___ACOSHF_B = 0x843 + SYS___ACOSHL_B = 0x844 + SYS___ASINHF_B = 0x845 + SYS___ASINHL_B = 0x846 + SYS___ATANHF_B = 0x847 + SYS___ATANHL_B = 0x848 + SYS___CBRTF_B = 0x849 + SYS___EXP2F_B = 0x850 + SYS___EXP2L_B = 0x851 + SYS___EXPM1F_B = 0x852 + SYS___EXPM1L_B = 0x853 + SYS___FDIMF_B = 0x854 + SYS___FDIM_B = 0x855 + SYS___FDIML_B = 0x856 + SYS___HYPOTF_B = 0x857 + SYS___HYPOTL_B = 0x858 + SYS___LOG1PF_B = 0x859 + SYS___REMQUOF_B = 0x860 + SYS___REMQUO_B = 0x861 + SYS___REMQUOL_B = 0x862 + SYS___TGAMMAF_B = 0x863 + SYS___TGAMMA_B = 0x864 + SYS___TGAMMAL_B = 0x865 + SYS___TRUNCF_B = 0x866 + SYS___TRUNC_B = 0x867 + SYS___TRUNCL_B = 0x868 + SYS___LGAMMAF_B = 0x869 + SYS_ASINHF = 0x870 + SYS_ASINHL = 0x871 + SYS_ATANHF = 0x872 + SYS_ATANHL = 0x873 + SYS_CBRTF = 0x874 + SYS_CBRTL = 0x875 + SYS_COPYSIGNF = 0x876 + SYS_CPYSIGNF = 0x876 + SYS_COPYSIGNL = 0x877 + SYS_CPYSIGNL = 0x877 + SYS_COTANF = 0x878 + SYS___COTANF = 0x878 + SYS_COTAN = 0x879 + SYS___COTAN = 0x879 + SYS_FDIM = 0x881 + SYS_FDIML = 0x882 + SYS_HYPOTF = 0x883 + SYS_HYPOTL = 0x884 + SYS_LOG1PF = 0x885 + SYS_LOG1PL = 0x886 + SYS_LOG2F = 0x887 + SYS_LOG2 = 0x888 + SYS_LOG2L = 0x889 + SYS_TGAMMA = 0x890 + SYS_TGAMMAL = 0x891 + SYS_TRUNCF = 0x892 + SYS_TRUNC = 0x893 + SYS_TRUNCL = 0x894 + SYS_LGAMMAF = 0x895 + SYS_LGAMMAL = 0x896 + SYS_LROUNDF = 0x897 + SYS_LROUND = 0x898 + SYS_ERFF = 0x899 + SYS___COSHF_H = 0x900 + SYS___COSHL_H = 0x901 + SYS___COTAN_H = 0x902 + SYS___COTANF_H = 0x903 + SYS___COTANL_H = 0x904 + SYS___ERF_H = 0x905 + SYS___ERFF_H = 0x906 + SYS___ERFL_H = 0x907 + SYS___ERFC_H = 0x908 + SYS___ERFCF_H = 0x909 + SYS___FDIMF_H = 0x910 + SYS___FDIML_H = 0x911 + SYS___FMOD_H = 0x912 + SYS___FMODF_H = 0x913 + SYS___FMODL_H = 0x914 + SYS___GAMMA_H = 0x915 + SYS___HYPOT_H = 0x916 + SYS___ILOGB_H = 0x917 + SYS___LGAMMA_H = 0x918 + SYS___LGAMMAF_H = 0x919 + SYS___LOG2L_H = 0x920 + SYS___LOG1P_H = 0x921 + SYS___LOG10_H = 0x922 + SYS___LOG10F_H = 0x923 + SYS___LOG10L_H = 0x924 + SYS___LROUND_H = 0x925 + SYS___LROUNDF_H = 0x926 + SYS___NEXTAFTER_H = 0x927 + SYS___POW_H = 0x928 + SYS___POWF_H = 0x929 + SYS___SINL_H = 0x930 + SYS___SINH_H = 0x931 + SYS___SINHF_H = 0x932 + SYS___SINHL_H = 0x933 + SYS___SQRT_H = 0x934 + SYS___SQRTF_H = 0x935 + SYS___SQRTL_H = 0x936 + SYS___TAN_H = 0x937 + SYS___TANF_H = 0x938 + SYS___TANL_H = 0x939 + SYS___TRUNCF_H = 0x940 + SYS___TRUNCL_H = 0x941 + SYS___COSH_H = 0x942 + SYS___LE_DEBUG_SET_RESUME_MCH = 0x943 + SYS_VFSCANF = 0x944 + SYS_VSCANF = 0x946 + SYS_VSSCANF = 0x948 + SYS_IMAXABS = 0x950 + SYS_IMAXDIV = 0x951 + SYS_STRTOIMAX = 0x952 + SYS_STRTOUMAX = 0x953 + SYS_WCSTOIMAX = 0x954 + SYS_WCSTOUMAX = 0x955 + SYS_ATOLL = 0x956 + SYS_STRTOF = 0x957 + SYS_STRTOLD = 0x958 + SYS_WCSTOF = 0x959 + SYS_INET6_RTH_GETADDR = 0x960 + SYS_INET6_OPT_INIT = 0x961 + SYS_INET6_OPT_APPEND = 0x962 + SYS_INET6_OPT_FINISH = 0x963 + SYS_INET6_OPT_SET_VAL = 0x964 + SYS_INET6_OPT_NEXT = 0x965 + SYS_INET6_OPT_FIND = 0x966 + SYS_INET6_OPT_GET_VAL = 0x967 + SYS___POW_I = 0x987 + SYS___POW_I_B = 0x988 + SYS___POW_I_H = 0x989 + SYS___CABS_H = 0x990 + SYS_CABSF = 0x991 + SYS___CABSF_B = 0x992 + SYS___CABSF_H = 0x993 + SYS_CABSL = 0x994 + SYS___CABSL_B = 0x995 + SYS___CABSL_H = 0x996 + SYS_CACOS = 0x997 + SYS___CACOS_B = 0x998 + SYS___CACOS_H = 0x999 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_aix_ppc.go b/vendor/golang.org/x/sys/unix/ztypes_aix_ppc.go index 295859c503db..7a8161c1d1ca 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_aix_ppc.go +++ b/vendor/golang.org/x/sys/unix/ztypes_aix_ppc.go @@ -1,6 +1,7 @@ // cgo -godefs types_aix.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build ppc && aix // +build ppc,aix package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_aix_ppc64.go b/vendor/golang.org/x/sys/unix/ztypes_aix_ppc64.go index a9ee0ffd44c1..07ed733c51b5 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_aix_ppc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_aix_ppc64.go @@ -1,6 +1,7 @@ // cgo -godefs types_aix.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build ppc64 && aix // +build ppc64,aix package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_darwin_386.go b/vendor/golang.org/x/sys/unix/ztypes_darwin_386.go index 725b4bee27db..54db43335554 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_darwin_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_darwin_386.go @@ -1,6 +1,7 @@ // cgo -godefs types_darwin.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build 386 && darwin // +build 386,darwin package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go index 080ffce32550..eb73e52fb68c 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go @@ -1,6 +1,7 @@ // cgo -godefs types_darwin.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build amd64 && darwin // +build amd64,darwin package unix @@ -210,6 +211,13 @@ type RawSockaddrCtl struct { type _Socklen uint32 +type Xucred struct { + Version uint32 + Uid uint32 + Ngroups int16 + Groups [16]uint32 +} + type Linger struct { Onoff int32 Linger int32 @@ -273,6 +281,7 @@ const ( SizeofSockaddrUnix = 0x6a SizeofSockaddrDatalink = 0x14 SizeofSockaddrCtl = 0x20 + SizeofXucred = 0x4c SizeofLinger = 0x8 SizeofIovec = 0x10 SizeofIPMreq = 0x8 diff --git a/vendor/golang.org/x/sys/unix/ztypes_darwin_arm.go b/vendor/golang.org/x/sys/unix/ztypes_darwin_arm.go index f2a77bc4e28e..8606d654e568 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_darwin_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_darwin_arm.go @@ -1,6 +1,7 @@ // cgo -godefs types_darwin.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build arm && darwin // +build arm,darwin package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go index c9492428bfa3..dcb51f8404d6 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go @@ -1,6 +1,7 @@ // cgo -godefs types_darwin.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build arm64 && darwin // +build arm64,darwin package unix @@ -210,6 +211,13 @@ type RawSockaddrCtl struct { type _Socklen uint32 +type Xucred struct { + Version uint32 + Uid uint32 + Ngroups int16 + Groups [16]uint32 +} + type Linger struct { Onoff int32 Linger int32 @@ -273,6 +281,7 @@ const ( SizeofSockaddrUnix = 0x6a SizeofSockaddrDatalink = 0x14 SizeofSockaddrCtl = 0x20 + SizeofXucred = 0x4c SizeofLinger = 0x8 SizeofIovec = 0x10 SizeofIPMreq = 0x8 diff --git a/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go index 85506a05d4b8..1d049d7a1224 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go @@ -1,6 +1,7 @@ // cgo -godefs types_dragonfly.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build amd64 && dragonfly // +build amd64,dragonfly package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go index 3e9dad33e338..c51bc88ffdfc 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go @@ -1,6 +1,7 @@ // cgo -godefs types_freebsd.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build 386 && freebsd // +build 386,freebsd package unix @@ -250,6 +251,14 @@ type RawSockaddrAny struct { type _Socklen uint32 +type Xucred struct { + Version uint32 + Uid uint32 + Ngroups int16 + Groups [16]uint32 + _ *byte +} + type Linger struct { Onoff int32 Linger int32 @@ -312,6 +321,7 @@ const ( SizeofSockaddrAny = 0x6c SizeofSockaddrUnix = 0x6a SizeofSockaddrDatalink = 0x36 + SizeofXucred = 0x50 SizeofLinger = 0x8 SizeofIovec = 0x8 SizeofIPMreq = 0x8 diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go index e00e615544c8..395b69187113 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go @@ -1,6 +1,7 @@ // cgo -godefs types_freebsd.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build amd64 && freebsd // +build amd64,freebsd package unix @@ -246,6 +247,14 @@ type RawSockaddrAny struct { type _Socklen uint32 +type Xucred struct { + Version uint32 + Uid uint32 + Ngroups int16 + Groups [16]uint32 + _ *byte +} + type Linger struct { Onoff int32 Linger int32 @@ -308,6 +317,7 @@ const ( SizeofSockaddrAny = 0x6c SizeofSockaddrUnix = 0x6a SizeofSockaddrDatalink = 0x36 + SizeofXucred = 0x58 SizeofLinger = 0x8 SizeofIovec = 0x10 SizeofIPMreq = 0x8 diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go index 5da13c871b54..d3f9d2541b5c 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go @@ -1,6 +1,7 @@ // cgo -godefs -- -fsigned-char types_freebsd.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build arm && freebsd // +build arm,freebsd package unix @@ -248,6 +249,14 @@ type RawSockaddrAny struct { type _Socklen uint32 +type Xucred struct { + Version uint32 + Uid uint32 + Ngroups int16 + Groups [16]uint32 + _ *byte +} + type Linger struct { Onoff int32 Linger int32 @@ -310,6 +319,7 @@ const ( SizeofSockaddrAny = 0x6c SizeofSockaddrUnix = 0x6a SizeofSockaddrDatalink = 0x36 + SizeofXucred = 0x50 SizeofLinger = 0x8 SizeofIovec = 0x8 SizeofIPMreq = 0x8 diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go index 995ecf9d4e2c..434d6e8e83c4 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go @@ -1,6 +1,7 @@ // cgo -godefs -- -fsigned-char types_freebsd.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build arm64 && freebsd // +build arm64,freebsd package unix @@ -246,6 +247,14 @@ type RawSockaddrAny struct { type _Socklen uint32 +type Xucred struct { + Version uint32 + Uid uint32 + Ngroups int16 + Groups [16]uint32 + _ *byte +} + type Linger struct { Onoff int32 Linger int32 @@ -308,6 +317,7 @@ const ( SizeofSockaddrAny = 0x6c SizeofSockaddrUnix = 0x6a SizeofSockaddrDatalink = 0x36 + SizeofXucred = 0x58 SizeofLinger = 0x8 SizeofIovec = 0x10 SizeofIPMreq = 0x8 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux.go b/vendor/golang.org/x/sys/unix/ztypes_linux.go index 9f3b1a4e56e3..d3a18713bb94 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux.go @@ -1,5 +1,6 @@ // Code generated by mkmerge.go; DO NOT EDIT. +//go:build linux // +build linux package unix @@ -83,7 +84,7 @@ type FileCloneRange struct { Dest_offset uint64 } -type FileDedupeRange struct { +type RawFileDedupeRange struct { Src_offset uint64 Src_length uint64 Dest_count uint16 @@ -91,6 +92,21 @@ type FileDedupeRange struct { Reserved2 uint32 } +type RawFileDedupeRangeInfo struct { + Dest_fd int64 + Dest_offset uint64 + Bytes_deduped uint64 + Status int32 + Reserved uint32 +} + +const ( + SizeofRawFileDedupeRange = 0x18 + SizeofRawFileDedupeRangeInfo = 0x20 + FILE_DEDUPE_RANGE_SAME = 0x0 + FILE_DEDUPE_RANGE_DIFFERS = 0x1 +) + type FscryptPolicy struct { Version uint8 Contents_encryption_mode uint8 @@ -288,7 +304,8 @@ type RawSockaddrVM struct { Reserved1 uint16 Port uint32 Cid uint32 - Zero [4]uint8 + Flags uint8 + Zero [3]uint8 } type RawSockaddrXDP struct { @@ -999,7 +1016,7 @@ const ( PERF_SAMPLE_PHYS_ADDR = 0x80000 PERF_SAMPLE_AUX = 0x100000 PERF_SAMPLE_CGROUP = 0x200000 - PERF_SAMPLE_MAX = 0x400000 + PERF_SAMPLE_MAX = 0x1000000 PERF_SAMPLE_BRANCH_USER_SHIFT = 0x0 PERF_SAMPLE_BRANCH_KERNEL_SHIFT = 0x1 PERF_SAMPLE_BRANCH_HV_SHIFT = 0x2 @@ -3680,3 +3697,15 @@ const ( ETHTOOL_A_TUNNEL_INFO_UDP_PORTS = 0x2 ETHTOOL_A_TUNNEL_INFO_MAX = 0x2 ) + +type ( + HIDRawReportDescriptor struct { + Size uint32 + Value [4096]uint8 + } + HIDRawDevInfo struct { + Bustype uint32 + Vendor int16 + Product int16 + } +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go index 088bd77e3be3..4d4d283de5b1 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go @@ -1,6 +1,7 @@ // cgo -godefs -- -Wall -Werror -static -I/tmp/include -m32 /build/linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build 386 && linux // +build 386,linux package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go index 078d958ec956..8a2eed5ec4e3 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go @@ -1,6 +1,7 @@ // cgo -godefs -- -Wall -Werror -static -I/tmp/include -m64 /build/linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build amd64 && linux // +build amd64,linux package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go index 2d39122f410c..94b34add6430 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go @@ -1,6 +1,7 @@ // cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build arm && linux // +build arm,linux package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go index 304cbd04536e..2143de4d599f 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go @@ -1,6 +1,7 @@ // cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char /build/linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build arm64 && linux // +build arm64,linux package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go index 7d9d57006aa8..a40216eee60a 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go @@ -1,6 +1,7 @@ // cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build mips && linux // +build mips,linux package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go index a1eb2577b089..e834b069fd5c 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go @@ -1,6 +1,7 @@ // cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build mips64 && linux // +build mips64,linux package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go index 2e5ce3b6a69f..e31083b04896 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go @@ -1,6 +1,7 @@ // cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build mips64le && linux // +build mips64le,linux package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go index bbaa1200b6a6..42811f7fb559 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go @@ -1,6 +1,7 @@ // cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build mipsle && linux // +build mipsle,linux package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go index 0e6e8a774839..2a3afbaef9fc 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go @@ -1,6 +1,7 @@ // cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build ppc64 && linux // +build ppc64,linux package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go index 7382f385faf6..c0de30a658a4 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go @@ -1,6 +1,7 @@ // cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build ppc64le && linux // +build ppc64le,linux package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go index 28d552216656..74faf2e91fdc 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go @@ -1,6 +1,7 @@ // cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build riscv64 && linux // +build riscv64,linux package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go index a91a7a44bd39..9a8f0c2c6a3d 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go @@ -1,6 +1,7 @@ // cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char /build/linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build s390x && linux // +build s390x,linux package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go index f824b2358dc7..72cdda75bde9 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go @@ -1,6 +1,7 @@ // cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build sparc64 && linux // +build sparc64,linux package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go b/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go index 3f11f88e3c65..b10e73abf95c 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go @@ -1,6 +1,7 @@ // cgo -godefs types_netbsd.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build 386 && netbsd // +build 386,netbsd package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go index 0bed83af57b3..28ed6d55ae3a 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go @@ -1,6 +1,7 @@ // cgo -godefs types_netbsd.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build amd64 && netbsd // +build amd64,netbsd package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go b/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go index e4e3bf736d86..4ba196ebe563 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go @@ -1,6 +1,7 @@ // cgo -godefs types_netbsd.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build arm && netbsd // +build arm,netbsd package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go index efac861bb7fa..dd642bd9c874 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go @@ -1,6 +1,7 @@ // cgo -godefs types_netbsd.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build arm64 && netbsd // +build arm64,netbsd package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go b/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go index 80fa295f1dfc..1fdb0e5fa5f9 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go @@ -1,6 +1,7 @@ // cgo -godefs types_openbsd.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build 386 && openbsd // +build 386,openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go index 560dd6d08af1..e2fc93c7c069 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go @@ -1,6 +1,7 @@ // cgo -godefs types_openbsd.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build amd64 && openbsd // +build amd64,openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go b/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go index 0c1700fa4356..8d34b5a2fc06 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go @@ -1,6 +1,7 @@ // cgo -godefs -- -fsigned-char types_openbsd.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build arm && openbsd // +build arm,openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go index 5b3e46633e9b..ea8f1a0d9ba2 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go @@ -1,6 +1,7 @@ // cgo -godefs -- -fsigned-char types_openbsd.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build arm64 && openbsd // +build arm64,openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_openbsd_mips64.go b/vendor/golang.org/x/sys/unix/ztypes_openbsd_mips64.go index 62bff1670979..ec6e8bc3f135 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_openbsd_mips64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_openbsd_mips64.go @@ -1,6 +1,7 @@ // cgo -godefs -- -fsigned-char types_openbsd.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build mips64 && openbsd // +build mips64,openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go index ca512aff7f86..85effef9c199 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go @@ -1,6 +1,7 @@ // cgo -godefs types_solaris.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build amd64 && solaris // +build amd64,solaris package unix diff --git a/vendor/golang.org/x/sys/unix/ztypes_zos_s390x.go b/vendor/golang.org/x/sys/unix/ztypes_zos_s390x.go new file mode 100644 index 000000000000..8bffde78e58b --- /dev/null +++ b/vendor/golang.org/x/sys/unix/ztypes_zos_s390x.go @@ -0,0 +1,402 @@ +// Copyright 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build zos && s390x +// +build zos,s390x + +// Hand edited based on ztypes_linux_s390x.go +// TODO: auto-generate. + +package unix + +const ( + SizeofPtr = 0x8 + SizeofShort = 0x2 + SizeofInt = 0x4 + SizeofLong = 0x8 + SizeofLongLong = 0x8 + PathMax = 0x1000 +) + +const ( + SizeofSockaddrAny = 128 + SizeofCmsghdr = 12 + SizeofIPMreq = 8 + SizeofIPv6Mreq = 20 + SizeofICMPv6Filter = 32 + SizeofIPv6MTUInfo = 32 + SizeofLinger = 8 + SizeofSockaddrInet4 = 16 + SizeofSockaddrInet6 = 28 + SizeofTCPInfo = 0x68 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type timeval_zos struct { //correct (with padding and all) + Sec int64 + _ [4]byte // pad + Usec int32 +} + +type Tms struct { //clock_t is 4-byte unsigned int in zos + Utime uint32 + Stime uint32 + Cutime uint32 + Cstime uint32 +} + +type Time_t int64 + +type Utimbuf struct { + Actime int64 + Modtime int64 +} + +type Utsname struct { + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte +} + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [108]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]uint8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + _ [112]uint8 // pad +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Iov *Iovec + Control *byte + Flags int32 + Namelen int32 + Iovlen int32 + Controllen int32 +} + +type Cmsghdr struct { + Len int32 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Addr [4]byte /* in_addr */ + Ifindex uint32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +type _Gid_t uint32 + +type rusage_zos struct { + Utime timeval_zos + Stime timeval_zos +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +// { int, short, short } in poll.h +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +type Stat_t struct { //Linux Definition + Dev uint64 + Ino uint64 + Nlink uint64 + Mode uint32 + Uid uint32 + Gid uint32 + _ int32 + Rdev uint64 + Size int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Blksize int64 + Blocks int64 + _ [3]int64 +} + +type Stat_LE_t struct { + _ [4]byte // eye catcher + Length uint16 + Version uint16 + Mode int32 + Ino uint32 + Dev uint32 + Nlink int32 + Uid int32 + Gid int32 + Size int64 + Atim31 [4]byte + Mtim31 [4]byte + Ctim31 [4]byte + Rdev uint32 + Auditoraudit uint32 + Useraudit uint32 + Blksize int32 + Creatim31 [4]byte + AuditID [16]byte + _ [4]byte // rsrvd1 + File_tag struct { + Ccsid uint16 + Txtflag uint16 // aggregating Txflag:1 deferred:1 rsvflags:14 + } + CharsetID [8]byte + Blocks int64 + Genvalue uint32 + Reftim31 [4]byte + Fid [8]byte + Filefmt byte + Fspflag2 byte + _ [2]byte // rsrvd2 + Ctimemsec int32 + Seclabel [8]byte + _ [4]byte // rsrvd3 + _ [4]byte // rsrvd4 + Atim Time_t + Mtim Time_t + Ctim Time_t + Creatim Time_t + Reftim Time_t + _ [24]byte // rsrvd5 +} + +type Statvfs_t struct { + ID [4]byte + Len int32 + Bsize uint64 + Blocks uint64 + Usedspace uint64 + Bavail uint64 + Flag uint64 + Maxfilesize int64 + _ [16]byte + Frsize uint64 + Bfree uint64 + Files uint32 + Ffree uint32 + Favail uint32 + Namemax31 uint32 + Invarsec uint32 + _ [4]byte + Fsid uint64 + Namemax uint64 +} + +type Statfs_t struct { + Type uint32 + Bsize uint64 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint32 + Ffree uint32 + Fsid uint64 + Namelen uint64 + Frsize uint64 + Flags uint64 +} + +type Dirent struct { + Reclen uint16 + Namlen uint16 + Ino uint32 + Extra uintptr + Name [256]byte +} + +// This struct is packed on z/OS so it can't be used directly. +type Flock_t struct { + Type int16 + Whence int16 + Start int64 + Len int64 + Pid int32 +} + +type Termios struct { + Cflag uint32 + Iflag uint32 + Lflag uint32 + Oflag uint32 + Cc [11]uint8 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type W_Mnth struct { + Hid [4]byte + Size int32 + Cur1 int32 //32bit pointer + Cur2 int32 //^ + Devno uint32 + _ [4]byte +} + +type W_Mntent struct { + Fstype uint32 + Mode uint32 + Dev uint32 + Parentdev uint32 + Rootino uint32 + Status byte + Ddname [9]byte + Fstname [9]byte + Fsname [45]byte + Pathlen uint32 + Mountpoint [1024]byte + Jobname [8]byte + PID int32 + Parmoffset int32 + Parmlen int16 + Owner [8]byte + Quiesceowner [8]byte + _ [38]byte +} diff --git a/vendor/golang.org/x/sys/windows/svc/sys_386.s b/vendor/golang.org/x/sys/windows/svc/sys_386.s deleted file mode 100644 index c8a583d7375d..000000000000 --- a/vendor/golang.org/x/sys/windows/svc/sys_386.s +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build windows - -// func servicemain(argc uint32, argv **uint16) -TEXT ·servicemain(SB),7,$0 - MOVL argc+0(FP), AX - MOVL AX, ·sArgc(SB) - MOVL argv+4(FP), AX - MOVL AX, ·sArgv(SB) - - PUSHL BP - PUSHL BX - PUSHL SI - PUSHL DI - - SUBL $12, SP - - MOVL ·sName(SB), AX - MOVL AX, (SP) - MOVL $·servicectlhandler(SB), AX - MOVL AX, 4(SP) - // Set context to 123456 to test issue #25660. - MOVL $123456, 8(SP) - MOVL ·cRegisterServiceCtrlHandlerExW(SB), AX - MOVL SP, BP - CALL AX - MOVL BP, SP - CMPL AX, $0 - JE exit - MOVL AX, ·ssHandle(SB) - - MOVL ·goWaitsH(SB), AX - MOVL AX, (SP) - MOVL ·cSetEvent(SB), AX - MOVL SP, BP - CALL AX - MOVL BP, SP - - MOVL ·cWaitsH(SB), AX - MOVL AX, (SP) - MOVL $-1, AX - MOVL AX, 4(SP) - MOVL ·cWaitForSingleObject(SB), AX - MOVL SP, BP - CALL AX - MOVL BP, SP - -exit: - ADDL $12, SP - - POPL DI - POPL SI - POPL BX - POPL BP - - MOVL 0(SP), CX - ADDL $12, SP - JMP CX - -// I do not know why, but this seems to be the only way to call -// ctlHandlerProc on Windows 7. - -// func servicectlhandler(ctl uint32, evtype uint32, evdata uintptr, context uintptr) uintptr { -TEXT ·servicectlhandler(SB),7,$0 - MOVL ·ctlHandlerExProc(SB), CX - JMP CX diff --git a/vendor/golang.org/x/sys/windows/svc/sys_amd64.s b/vendor/golang.org/x/sys/windows/svc/sys_amd64.s deleted file mode 100644 index 3d4df0c3de59..000000000000 --- a/vendor/golang.org/x/sys/windows/svc/sys_amd64.s +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build windows - -// func servicemain(argc uint32, argv **uint16) -TEXT ·servicemain(SB),7,$0 - MOVQ SP, AX - ANDQ $~15, SP // alignment as per Windows requirement - SUBQ $48, SP // room for SP and 4 args as per Windows requirement - // plus one extra word to keep stack 16 bytes aligned - MOVQ AX, 32(SP) - - MOVL CX, ·sArgc(SB) - MOVQ DX, ·sArgv(SB) - - MOVQ ·sName(SB), CX - MOVQ $·servicectlhandler(SB), DX - // BUG(pastarmovj): Figure out a way to pass in context in R8. - // Set context to 123456 to test issue #25660. - MOVQ $123456, R8 - MOVQ ·cRegisterServiceCtrlHandlerExW(SB), AX - CALL AX - CMPQ AX, $0 - JE exit - MOVQ AX, ·ssHandle(SB) - - MOVQ ·goWaitsH(SB), CX - MOVQ ·cSetEvent(SB), AX - CALL AX - - MOVQ ·cWaitsH(SB), CX - MOVQ $4294967295, DX - MOVQ ·cWaitForSingleObject(SB), AX - CALL AX - -exit: - MOVQ 32(SP), SP - RET - -// I do not know why, but this seems to be the only way to call -// ctlHandlerProc on Windows 7. - -// func ·servicectlhandler(ctl uint32, evtype uint32, evdata uintptr, context uintptr) uintptr { -TEXT ·servicectlhandler(SB),7,$0 - MOVQ ·ctlHandlerExProc(SB), AX - JMP AX diff --git a/vendor/golang.org/x/sys/windows/svc/sys_arm.s b/vendor/golang.org/x/sys/windows/svc/sys_arm.s deleted file mode 100644 index 33c692a8dea4..000000000000 --- a/vendor/golang.org/x/sys/windows/svc/sys_arm.s +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build windows - -#include "textflag.h" - -// func servicemain(argc uint32, argv **uint16) -TEXT ·servicemain(SB),NOSPLIT|NOFRAME,$0 - MOVM.DB.W [R4, R14], (R13) // push {r4, lr} - MOVW R13, R4 - BIC $0x7, R13 // alignment for ABI - - MOVW R0, ·sArgc(SB) - MOVW R1, ·sArgv(SB) - - MOVW ·sName(SB), R0 - MOVW ·ctlHandlerExProc(SB), R1 - MOVW $0, R2 - MOVW ·cRegisterServiceCtrlHandlerExW(SB), R3 - BL (R3) - CMP $0, R0 - BEQ exit - MOVW R0, ·ssHandle(SB) - - MOVW ·goWaitsH(SB), R0 - MOVW ·cSetEvent(SB), R1 - BL (R1) - - MOVW ·cWaitsH(SB), R0 - MOVW $-1, R1 - MOVW ·cWaitForSingleObject(SB), R2 - BL (R2) - -exit: - MOVW R4, R13 // free extra stack space - MOVM.IA.W (R13), [R4, R15] // pop {r4, pc} diff --git a/vendor/golang.org/x/sys/windows/svc/sys_windows_386.s b/vendor/golang.org/x/sys/windows/svc/sys_windows_386.s new file mode 100644 index 000000000000..1ed914130b96 --- /dev/null +++ b/vendor/golang.org/x/sys/windows/svc/sys_windows_386.s @@ -0,0 +1,67 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// func servicemain(argc uint32, argv **uint16) +TEXT ·servicemain(SB),7,$0 + MOVL argc+0(FP), AX + MOVL AX, ·sArgc(SB) + MOVL argv+4(FP), AX + MOVL AX, ·sArgv(SB) + + PUSHL BP + PUSHL BX + PUSHL SI + PUSHL DI + + SUBL $12, SP + + MOVL ·sName(SB), AX + MOVL AX, (SP) + MOVL $·servicectlhandler(SB), AX + MOVL AX, 4(SP) + // Set context to 123456 to test issue #25660. + MOVL $123456, 8(SP) + MOVL ·cRegisterServiceCtrlHandlerExW(SB), AX + MOVL SP, BP + CALL AX + MOVL BP, SP + CMPL AX, $0 + JE exit + MOVL AX, ·ssHandle(SB) + + MOVL ·goWaitsH(SB), AX + MOVL AX, (SP) + MOVL ·cSetEvent(SB), AX + MOVL SP, BP + CALL AX + MOVL BP, SP + + MOVL ·cWaitsH(SB), AX + MOVL AX, (SP) + MOVL $-1, AX + MOVL AX, 4(SP) + MOVL ·cWaitForSingleObject(SB), AX + MOVL SP, BP + CALL AX + MOVL BP, SP + +exit: + ADDL $12, SP + + POPL DI + POPL SI + POPL BX + POPL BP + + MOVL 0(SP), CX + ADDL $12, SP + JMP CX + +// I do not know why, but this seems to be the only way to call +// ctlHandlerProc on Windows 7. + +// func servicectlhandler(ctl uint32, evtype uint32, evdata uintptr, context uintptr) uintptr { +TEXT ·servicectlhandler(SB),7,$0 + MOVL ·ctlHandlerExProc(SB), CX + JMP CX diff --git a/vendor/golang.org/x/sys/windows/svc/sys_windows_amd64.s b/vendor/golang.org/x/sys/windows/svc/sys_windows_amd64.s new file mode 100644 index 000000000000..1e5ef92b22aa --- /dev/null +++ b/vendor/golang.org/x/sys/windows/svc/sys_windows_amd64.s @@ -0,0 +1,46 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// func servicemain(argc uint32, argv **uint16) +TEXT ·servicemain(SB),7,$0 + MOVQ SP, AX + ANDQ $~15, SP // alignment as per Windows requirement + SUBQ $48, SP // room for SP and 4 args as per Windows requirement + // plus one extra word to keep stack 16 bytes aligned + MOVQ AX, 32(SP) + + MOVL CX, ·sArgc(SB) + MOVQ DX, ·sArgv(SB) + + MOVQ ·sName(SB), CX + MOVQ $·servicectlhandler(SB), DX + // BUG(pastarmovj): Figure out a way to pass in context in R8. + // Set context to 123456 to test issue #25660. + MOVQ $123456, R8 + MOVQ ·cRegisterServiceCtrlHandlerExW(SB), AX + CALL AX + CMPQ AX, $0 + JE exit + MOVQ AX, ·ssHandle(SB) + + MOVQ ·goWaitsH(SB), CX + MOVQ ·cSetEvent(SB), AX + CALL AX + + MOVQ ·cWaitsH(SB), CX + MOVQ $4294967295, DX + MOVQ ·cWaitForSingleObject(SB), AX + CALL AX + +exit: + MOVQ 32(SP), SP + RET + +// I do not know why, but this seems to be the only way to call +// ctlHandlerProc on Windows 7. + +// func ·servicectlhandler(ctl uint32, evtype uint32, evdata uintptr, context uintptr) uintptr { +TEXT ·servicectlhandler(SB),7,$0 + MOVQ ·ctlHandlerExProc(SB), AX + JMP AX diff --git a/vendor/golang.org/x/sys/windows/svc/sys_windows_arm.s b/vendor/golang.org/x/sys/windows/svc/sys_windows_arm.s new file mode 100644 index 000000000000..360b86ed5b55 --- /dev/null +++ b/vendor/golang.org/x/sys/windows/svc/sys_windows_arm.s @@ -0,0 +1,36 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include "textflag.h" + +// func servicemain(argc uint32, argv **uint16) +TEXT ·servicemain(SB),NOSPLIT|NOFRAME,$0 + MOVM.DB.W [R4, R14], (R13) // push {r4, lr} + MOVW R13, R4 + BIC $0x7, R13 // alignment for ABI + + MOVW R0, ·sArgc(SB) + MOVW R1, ·sArgv(SB) + + MOVW ·sName(SB), R0 + MOVW ·ctlHandlerExProc(SB), R1 + MOVW $0, R2 + MOVW ·cRegisterServiceCtrlHandlerExW(SB), R3 + BL (R3) + CMP $0, R0 + BEQ exit + MOVW R0, ·ssHandle(SB) + + MOVW ·goWaitsH(SB), R0 + MOVW ·cSetEvent(SB), R1 + BL (R1) + + MOVW ·cWaitsH(SB), R0 + MOVW $-1, R1 + MOVW ·cWaitForSingleObject(SB), R2 + BL (R2) + +exit: + MOVW R4, R13 // free extra stack space + MOVM.IA.W (R13), [R4, R15] // pop {r4, pc} diff --git a/vendor/golang.org/x/sys/windows/svc/sys_windows_arm64.s b/vendor/golang.org/x/sys/windows/svc/sys_windows_arm64.s new file mode 100644 index 000000000000..3ca540e69078 --- /dev/null +++ b/vendor/golang.org/x/sys/windows/svc/sys_windows_arm64.s @@ -0,0 +1,31 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include "textflag.h" + +// func servicemain(argc uint32, argv **uint16) +TEXT ·servicemain(SB),NOSPLIT|NOFRAME,$0 + MOVD R0, ·sArgc(SB) + MOVD R1, ·sArgv(SB) + + MOVD ·sName(SB), R0 + MOVD ·ctlHandlerExProc(SB), R1 + MOVD $0, R2 + MOVD ·cRegisterServiceCtrlHandlerExW(SB), R3 + BL (R3) + CMP $0, R0 + BEQ exit + MOVD R0, ·ssHandle(SB) + + MOVD ·goWaitsH(SB), R0 + MOVD ·cSetEvent(SB), R1 + BL (R1) + + MOVD ·cWaitsH(SB), R0 + MOVD $-1, R1 + MOVD ·cWaitForSingleObject(SB), R2 + BL (R2) + +exit: + RET diff --git a/vendor/golang.org/x/sys/windows/syscall_windows.go b/vendor/golang.org/x/sys/windows/syscall_windows.go index 0197df87276d..25c6efdca2cd 100644 --- a/vendor/golang.org/x/sys/windows/syscall_windows.go +++ b/vendor/golang.org/x/sys/windows/syscall_windows.go @@ -208,9 +208,9 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys GetSystemTimeAsFileTime(time *Filetime) //sys GetSystemTimePreciseAsFileTime(time *Filetime) //sys GetTimeZoneInformation(tzi *Timezoneinformation) (rc uint32, err error) [failretval==0xffffffff] -//sys CreateIoCompletionPort(filehandle Handle, cphandle Handle, key uint32, threadcnt uint32) (handle Handle, err error) -//sys GetQueuedCompletionStatus(cphandle Handle, qty *uint32, key *uint32, overlapped **Overlapped, timeout uint32) (err error) -//sys PostQueuedCompletionStatus(cphandle Handle, qty uint32, key uint32, overlapped *Overlapped) (err error) +//sys CreateIoCompletionPort(filehandle Handle, cphandle Handle, key uintptr, threadcnt uint32) (handle Handle, err error) +//sys GetQueuedCompletionStatus(cphandle Handle, qty *uint32, key *uintptr, overlapped **Overlapped, timeout uint32) (err error) +//sys PostQueuedCompletionStatus(cphandle Handle, qty uint32, key uintptr, overlapped *Overlapped) (err error) //sys CancelIo(s Handle) (err error) //sys CancelIoEx(s Handle, o *Overlapped) (err error) //sys CreateProcess(appName *uint16, commandLine *uint16, procSecurity *SecurityAttributes, threadSecurity *SecurityAttributes, inheritHandles bool, creationFlags uint32, env *uint16, currentDir *uint16, startupInfo *StartupInfo, outProcInfo *ProcessInformation) (err error) = CreateProcessW @@ -283,6 +283,9 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys CertVerifyCertificateChainPolicy(policyOID uintptr, chain *CertChainContext, para *CertChainPolicyPara, status *CertChainPolicyStatus) (err error) = crypt32.CertVerifyCertificateChainPolicy //sys CertGetNameString(certContext *CertContext, nameType uint32, flags uint32, typePara unsafe.Pointer, name *uint16, size uint32) (chars uint32) = crypt32.CertGetNameStringW //sys CertFindExtension(objId *byte, countExtensions uint32, extensions *CertExtension) (ret *CertExtension) = crypt32.CertFindExtension +//sys CertFindCertificateInStore(store Handle, certEncodingType uint32, findFlags uint32, findType uint32, findPara unsafe.Pointer, prevCertContext *CertContext) (cert *CertContext, err error) [failretval==nil] = crypt32.CertFindCertificateInStore +//sys CertFindChainInStore(store Handle, certEncodingType uint32, findFlags uint32, findType uint32, findPara unsafe.Pointer, prevChainContext *CertChainContext) (certchain *CertChainContext, err error) [failretval==nil] = crypt32.CertFindChainInStore +//sys CryptAcquireCertificatePrivateKey(cert *CertContext, flags uint32, parameters unsafe.Pointer, cryptProvOrNCryptKey *Handle, keySpec *uint32, callerFreeProvOrNCryptKey *bool) (err error) = crypt32.CryptAcquireCertificatePrivateKey //sys CryptQueryObject(objectType uint32, object unsafe.Pointer, expectedContentTypeFlags uint32, expectedFormatTypeFlags uint32, flags uint32, msgAndCertEncodingType *uint32, contentType *uint32, formatType *uint32, certStore *Handle, msg *Handle, context *unsafe.Pointer) (err error) = crypt32.CryptQueryObject //sys CryptDecodeObject(encodingType uint32, structType *byte, encodedBytes *byte, lenEncodedBytes uint32, flags uint32, decoded unsafe.Pointer, decodedLen *uint32) (err error) = crypt32.CryptDecodeObject //sys CryptProtectData(dataIn *DataBlob, name *uint16, optionalEntropy *DataBlob, reserved uintptr, promptStruct *CryptProtectPromptStruct, flags uint32, dataOut *DataBlob) (err error) = crypt32.CryptProtectData @@ -770,6 +773,7 @@ const socket_error = uintptr(^uint32(0)) //sys WSASend(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSASend //sys WSARecvFrom(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32, from *RawSockaddrAny, fromlen *int32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSARecvFrom //sys WSASendTo(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, to *RawSockaddrAny, tolen int32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSASendTo +//sys WSASocket(af int32, typ int32, protocol int32, protoInfo *WSAProtocolInfo, group uint32, flags uint32) (handle Handle, err error) [failretval==InvalidHandle] = ws2_32.WSASocketW //sys GetHostByName(name string) (h *Hostent, err error) [failretval==nil] = ws2_32.gethostbyname //sys GetServByName(name string, proto string) (s *Servent, err error) [failretval==nil] = ws2_32.getservbyname //sys Ntohs(netshort uint16) (u uint16) = ws2_32.ntohs diff --git a/vendor/golang.org/x/sys/windows/types_windows.go b/vendor/golang.org/x/sys/windows/types_windows.go index fd4260762a8d..fe135276efe3 100644 --- a/vendor/golang.org/x/sys/windows/types_windows.go +++ b/vendor/golang.org/x/sys/windows/types_windows.go @@ -287,6 +287,23 @@ const ( PKCS12_NO_PERSIST_KEY = 0x00008000 PKCS12_INCLUDE_EXTENDED_PROPERTIES = 0x00000010 + /* Flags for CryptAcquireCertificatePrivateKey */ + CRYPT_ACQUIRE_CACHE_FLAG = 0x00000001 + CRYPT_ACQUIRE_USE_PROV_INFO_FLAG = 0x00000002 + CRYPT_ACQUIRE_COMPARE_KEY_FLAG = 0x00000004 + CRYPT_ACQUIRE_NO_HEALING = 0x00000008 + CRYPT_ACQUIRE_SILENT_FLAG = 0x00000040 + CRYPT_ACQUIRE_WINDOW_HANDLE_FLAG = 0x00000080 + CRYPT_ACQUIRE_NCRYPT_KEY_FLAGS_MASK = 0x00070000 + CRYPT_ACQUIRE_ALLOW_NCRYPT_KEY_FLAG = 0x00010000 + CRYPT_ACQUIRE_PREFER_NCRYPT_KEY_FLAG = 0x00020000 + CRYPT_ACQUIRE_ONLY_NCRYPT_KEY_FLAG = 0x00040000 + + /* pdwKeySpec for CryptAcquireCertificatePrivateKey */ + AT_KEYEXCHANGE = 1 + AT_SIGNATURE = 2 + CERT_NCRYPT_KEY_SPEC = 0xFFFFFFFF + /* Default usage match type is AND with value zero */ USAGE_MATCH_TYPE_AND = 0 USAGE_MATCH_TYPE_OR = 1 @@ -412,6 +429,89 @@ const ( CERT_TRUST_IS_CA_TRUSTED = 0x00004000 CERT_TRUST_IS_COMPLEX_CHAIN = 0x00010000 + /* Certificate Information Flags */ + CERT_INFO_VERSION_FLAG = 1 + CERT_INFO_SERIAL_NUMBER_FLAG = 2 + CERT_INFO_SIGNATURE_ALGORITHM_FLAG = 3 + CERT_INFO_ISSUER_FLAG = 4 + CERT_INFO_NOT_BEFORE_FLAG = 5 + CERT_INFO_NOT_AFTER_FLAG = 6 + CERT_INFO_SUBJECT_FLAG = 7 + CERT_INFO_SUBJECT_PUBLIC_KEY_INFO_FLAG = 8 + CERT_INFO_ISSUER_UNIQUE_ID_FLAG = 9 + CERT_INFO_SUBJECT_UNIQUE_ID_FLAG = 10 + CERT_INFO_EXTENSION_FLAG = 11 + + /* dwFindType for CertFindCertificateInStore */ + CERT_COMPARE_MASK = 0xFFFF + CERT_COMPARE_SHIFT = 16 + CERT_COMPARE_ANY = 0 + CERT_COMPARE_SHA1_HASH = 1 + CERT_COMPARE_NAME = 2 + CERT_COMPARE_ATTR = 3 + CERT_COMPARE_MD5_HASH = 4 + CERT_COMPARE_PROPERTY = 5 + CERT_COMPARE_PUBLIC_KEY = 6 + CERT_COMPARE_HASH = CERT_COMPARE_SHA1_HASH + CERT_COMPARE_NAME_STR_A = 7 + CERT_COMPARE_NAME_STR_W = 8 + CERT_COMPARE_KEY_SPEC = 9 + CERT_COMPARE_ENHKEY_USAGE = 10 + CERT_COMPARE_CTL_USAGE = CERT_COMPARE_ENHKEY_USAGE + CERT_COMPARE_SUBJECT_CERT = 11 + CERT_COMPARE_ISSUER_OF = 12 + CERT_COMPARE_EXISTING = 13 + CERT_COMPARE_SIGNATURE_HASH = 14 + CERT_COMPARE_KEY_IDENTIFIER = 15 + CERT_COMPARE_CERT_ID = 16 + CERT_COMPARE_CROSS_CERT_DIST_POINTS = 17 + CERT_COMPARE_PUBKEY_MD5_HASH = 18 + CERT_COMPARE_SUBJECT_INFO_ACCESS = 19 + CERT_COMPARE_HASH_STR = 20 + CERT_COMPARE_HAS_PRIVATE_KEY = 21 + CERT_FIND_ANY = (CERT_COMPARE_ANY << CERT_COMPARE_SHIFT) + CERT_FIND_SHA1_HASH = (CERT_COMPARE_SHA1_HASH << CERT_COMPARE_SHIFT) + CERT_FIND_MD5_HASH = (CERT_COMPARE_MD5_HASH << CERT_COMPARE_SHIFT) + CERT_FIND_SIGNATURE_HASH = (CERT_COMPARE_SIGNATURE_HASH << CERT_COMPARE_SHIFT) + CERT_FIND_KEY_IDENTIFIER = (CERT_COMPARE_KEY_IDENTIFIER << CERT_COMPARE_SHIFT) + CERT_FIND_HASH = CERT_FIND_SHA1_HASH + CERT_FIND_PROPERTY = (CERT_COMPARE_PROPERTY << CERT_COMPARE_SHIFT) + CERT_FIND_PUBLIC_KEY = (CERT_COMPARE_PUBLIC_KEY << CERT_COMPARE_SHIFT) + CERT_FIND_SUBJECT_NAME = (CERT_COMPARE_NAME<") + } + p.buf.WriteByte(')') + io.Copy(s, &p.buf) + return + } + +loop: + for { + switch v := err.(type) { + case Formatter: + err = v.FormatError((*printer)(p)) + case fmt.Formatter: + v.Format(p, 'v') + break loop + default: + io.WriteString(&p.buf, v.Error()) + break loop + } + if err == nil { + break + } + if p.needColon || !p.printDetail { + p.buf.WriteByte(':') + p.needColon = false + } + p.buf.WriteString(sep) + p.inDetail = false + p.needNewline = false + } + +exit: + width, okW := s.Width() + prec, okP := s.Precision() + + if !direct || (okW && width > 0) || okP { + // Construct format string from State s. + format := []byte{'%'} + if s.Flag('-') { + format = append(format, '-') + } + if s.Flag('+') { + format = append(format, '+') + } + if s.Flag(' ') { + format = append(format, ' ') + } + if okW { + format = strconv.AppendInt(format, int64(width), 10) + } + if okP { + format = append(format, '.') + format = strconv.AppendInt(format, int64(prec), 10) + } + format = append(format, string(verb)...) + fmt.Fprintf(s, string(format), p.buf.String()) + } else { + io.Copy(s, &p.buf) + } +} + +var detailSep = []byte("\n ") + +// state tracks error printing state. It implements fmt.State. +type state struct { + fmt.State + buf bytes.Buffer + + printDetail bool + inDetail bool + needColon bool + needNewline bool +} + +func (s *state) Write(b []byte) (n int, err error) { + if s.printDetail { + if len(b) == 0 { + return 0, nil + } + if s.inDetail && s.needColon { + s.needNewline = true + if b[0] == '\n' { + b = b[1:] + } + } + k := 0 + for i, c := range b { + if s.needNewline { + if s.inDetail && s.needColon { + s.buf.WriteByte(':') + s.needColon = false + } + s.buf.Write(detailSep) + s.needNewline = false + } + if c == '\n' { + s.buf.Write(b[k:i]) + k = i + 1 + s.needNewline = true + } + } + s.buf.Write(b[k:]) + if !s.inDetail { + s.needColon = true + } + } else if !s.inDetail { + s.buf.Write(b) + } + return len(b), nil +} + +// printer wraps a state to implement an xerrors.Printer. +type printer state + +func (s *printer) Print(args ...interface{}) { + if !s.inDetail || s.printDetail { + fmt.Fprint((*state)(s), args...) + } +} + +func (s *printer) Printf(format string, args ...interface{}) { + if !s.inDetail || s.printDetail { + fmt.Fprintf((*state)(s), format, args...) + } +} + +func (s *printer) Detail() bool { + s.inDetail = true + return s.printDetail +} diff --git a/vendor/golang.org/x/xerrors/codereview.cfg b/vendor/golang.org/x/xerrors/codereview.cfg new file mode 100644 index 000000000000..3f8b14b64e83 --- /dev/null +++ b/vendor/golang.org/x/xerrors/codereview.cfg @@ -0,0 +1 @@ +issuerepo: golang/go diff --git a/vendor/golang.org/x/xerrors/doc.go b/vendor/golang.org/x/xerrors/doc.go new file mode 100644 index 000000000000..eef99d9d54d7 --- /dev/null +++ b/vendor/golang.org/x/xerrors/doc.go @@ -0,0 +1,22 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package xerrors implements functions to manipulate errors. +// +// This package is based on the Go 2 proposal for error values: +// https://golang.org/design/29934-error-values +// +// These functions were incorporated into the standard library's errors package +// in Go 1.13: +// - Is +// - As +// - Unwrap +// +// Also, Errorf's %w verb was incorporated into fmt.Errorf. +// +// Use this package to get equivalent behavior in all supported Go versions. +// +// No other features of this package were included in Go 1.13, and at present +// there are no plans to include any of them. +package xerrors // import "golang.org/x/xerrors" diff --git a/vendor/golang.org/x/xerrors/errors.go b/vendor/golang.org/x/xerrors/errors.go new file mode 100644 index 000000000000..e88d3772d861 --- /dev/null +++ b/vendor/golang.org/x/xerrors/errors.go @@ -0,0 +1,33 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package xerrors + +import "fmt" + +// errorString is a trivial implementation of error. +type errorString struct { + s string + frame Frame +} + +// New returns an error that formats as the given text. +// +// The returned error contains a Frame set to the caller's location and +// implements Formatter to show this information when printed with details. +func New(text string) error { + return &errorString{text, Caller(1)} +} + +func (e *errorString) Error() string { + return e.s +} + +func (e *errorString) Format(s fmt.State, v rune) { FormatError(e, s, v) } + +func (e *errorString) FormatError(p Printer) (next error) { + p.Print(e.s) + e.frame.Format(p) + return nil +} diff --git a/vendor/golang.org/x/xerrors/fmt.go b/vendor/golang.org/x/xerrors/fmt.go new file mode 100644 index 000000000000..829862ddf6af --- /dev/null +++ b/vendor/golang.org/x/xerrors/fmt.go @@ -0,0 +1,187 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package xerrors + +import ( + "fmt" + "strings" + "unicode" + "unicode/utf8" + + "golang.org/x/xerrors/internal" +) + +const percentBangString = "%!" + +// Errorf formats according to a format specifier and returns the string as a +// value that satisfies error. +// +// The returned error includes the file and line number of the caller when +// formatted with additional detail enabled. If the last argument is an error +// the returned error's Format method will return it if the format string ends +// with ": %s", ": %v", or ": %w". If the last argument is an error and the +// format string ends with ": %w", the returned error implements an Unwrap +// method returning it. +// +// If the format specifier includes a %w verb with an error operand in a +// position other than at the end, the returned error will still implement an +// Unwrap method returning the operand, but the error's Format method will not +// return the wrapped error. +// +// It is invalid to include more than one %w verb or to supply it with an +// operand that does not implement the error interface. The %w verb is otherwise +// a synonym for %v. +func Errorf(format string, a ...interface{}) error { + format = formatPlusW(format) + // Support a ": %[wsv]" suffix, which works well with xerrors.Formatter. + wrap := strings.HasSuffix(format, ": %w") + idx, format2, ok := parsePercentW(format) + percentWElsewhere := !wrap && idx >= 0 + if !percentWElsewhere && (wrap || strings.HasSuffix(format, ": %s") || strings.HasSuffix(format, ": %v")) { + err := errorAt(a, len(a)-1) + if err == nil { + return &noWrapError{fmt.Sprintf(format, a...), nil, Caller(1)} + } + // TODO: this is not entirely correct. The error value could be + // printed elsewhere in format if it mixes numbered with unnumbered + // substitutions. With relatively small changes to doPrintf we can + // have it optionally ignore extra arguments and pass the argument + // list in its entirety. + msg := fmt.Sprintf(format[:len(format)-len(": %s")], a[:len(a)-1]...) + frame := Frame{} + if internal.EnableTrace { + frame = Caller(1) + } + if wrap { + return &wrapError{msg, err, frame} + } + return &noWrapError{msg, err, frame} + } + // Support %w anywhere. + // TODO: don't repeat the wrapped error's message when %w occurs in the middle. + msg := fmt.Sprintf(format2, a...) + if idx < 0 { + return &noWrapError{msg, nil, Caller(1)} + } + err := errorAt(a, idx) + if !ok || err == nil { + // Too many %ws or argument of %w is not an error. Approximate the Go + // 1.13 fmt.Errorf message. + return &noWrapError{fmt.Sprintf("%sw(%s)", percentBangString, msg), nil, Caller(1)} + } + frame := Frame{} + if internal.EnableTrace { + frame = Caller(1) + } + return &wrapError{msg, err, frame} +} + +func errorAt(args []interface{}, i int) error { + if i < 0 || i >= len(args) { + return nil + } + err, ok := args[i].(error) + if !ok { + return nil + } + return err +} + +// formatPlusW is used to avoid the vet check that will barf at %w. +func formatPlusW(s string) string { + return s +} + +// Return the index of the only %w in format, or -1 if none. +// Also return a rewritten format string with %w replaced by %v, and +// false if there is more than one %w. +// TODO: handle "%[N]w". +func parsePercentW(format string) (idx int, newFormat string, ok bool) { + // Loosely copied from golang.org/x/tools/go/analysis/passes/printf/printf.go. + idx = -1 + ok = true + n := 0 + sz := 0 + var isW bool + for i := 0; i < len(format); i += sz { + if format[i] != '%' { + sz = 1 + continue + } + // "%%" is not a format directive. + if i+1 < len(format) && format[i+1] == '%' { + sz = 2 + continue + } + sz, isW = parsePrintfVerb(format[i:]) + if isW { + if idx >= 0 { + ok = false + } else { + idx = n + } + // "Replace" the last character, the 'w', with a 'v'. + p := i + sz - 1 + format = format[:p] + "v" + format[p+1:] + } + n++ + } + return idx, format, ok +} + +// Parse the printf verb starting with a % at s[0]. +// Return how many bytes it occupies and whether the verb is 'w'. +func parsePrintfVerb(s string) (int, bool) { + // Assume only that the directive is a sequence of non-letters followed by a single letter. + sz := 0 + var r rune + for i := 1; i < len(s); i += sz { + r, sz = utf8.DecodeRuneInString(s[i:]) + if unicode.IsLetter(r) { + return i + sz, r == 'w' + } + } + return len(s), false +} + +type noWrapError struct { + msg string + err error + frame Frame +} + +func (e *noWrapError) Error() string { + return fmt.Sprint(e) +} + +func (e *noWrapError) Format(s fmt.State, v rune) { FormatError(e, s, v) } + +func (e *noWrapError) FormatError(p Printer) (next error) { + p.Print(e.msg) + e.frame.Format(p) + return e.err +} + +type wrapError struct { + msg string + err error + frame Frame +} + +func (e *wrapError) Error() string { + return fmt.Sprint(e) +} + +func (e *wrapError) Format(s fmt.State, v rune) { FormatError(e, s, v) } + +func (e *wrapError) FormatError(p Printer) (next error) { + p.Print(e.msg) + e.frame.Format(p) + return e.err +} + +func (e *wrapError) Unwrap() error { + return e.err +} diff --git a/vendor/golang.org/x/xerrors/format.go b/vendor/golang.org/x/xerrors/format.go new file mode 100644 index 000000000000..1bc9c26b97fd --- /dev/null +++ b/vendor/golang.org/x/xerrors/format.go @@ -0,0 +1,34 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package xerrors + +// A Formatter formats error messages. +type Formatter interface { + error + + // FormatError prints the receiver's first error and returns the next error in + // the error chain, if any. + FormatError(p Printer) (next error) +} + +// A Printer formats error messages. +// +// The most common implementation of Printer is the one provided by package fmt +// during Printf (as of Go 1.13). Localization packages such as golang.org/x/text/message +// typically provide their own implementations. +type Printer interface { + // Print appends args to the message output. + Print(args ...interface{}) + + // Printf writes a formatted string. + Printf(format string, args ...interface{}) + + // Detail reports whether error detail is requested. + // After the first call to Detail, all text written to the Printer + // is formatted as additional detail, or ignored when + // detail has not been requested. + // If Detail returns false, the caller can avoid printing the detail at all. + Detail() bool +} diff --git a/vendor/golang.org/x/xerrors/frame.go b/vendor/golang.org/x/xerrors/frame.go new file mode 100644 index 000000000000..0de628ec501f --- /dev/null +++ b/vendor/golang.org/x/xerrors/frame.go @@ -0,0 +1,56 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package xerrors + +import ( + "runtime" +) + +// A Frame contains part of a call stack. +type Frame struct { + // Make room for three PCs: the one we were asked for, what it called, + // and possibly a PC for skipPleaseUseCallersFrames. See: + // https://go.googlesource.com/go/+/032678e0fb/src/runtime/extern.go#169 + frames [3]uintptr +} + +// Caller returns a Frame that describes a frame on the caller's stack. +// The argument skip is the number of frames to skip over. +// Caller(0) returns the frame for the caller of Caller. +func Caller(skip int) Frame { + var s Frame + runtime.Callers(skip+1, s.frames[:]) + return s +} + +// location reports the file, line, and function of a frame. +// +// The returned function may be "" even if file and line are not. +func (f Frame) location() (function, file string, line int) { + frames := runtime.CallersFrames(f.frames[:]) + if _, ok := frames.Next(); !ok { + return "", "", 0 + } + fr, ok := frames.Next() + if !ok { + return "", "", 0 + } + return fr.Function, fr.File, fr.Line +} + +// Format prints the stack as error detail. +// It should be called from an error's Format implementation +// after printing any other error detail. +func (f Frame) Format(p Printer) { + if p.Detail() { + function, file, line := f.location() + if function != "" { + p.Printf("%s\n ", function) + } + if file != "" { + p.Printf("%s:%d\n", file, line) + } + } +} diff --git a/vendor/golang.org/x/xerrors/go.mod b/vendor/golang.org/x/xerrors/go.mod new file mode 100644 index 000000000000..870d4f612dbf --- /dev/null +++ b/vendor/golang.org/x/xerrors/go.mod @@ -0,0 +1,3 @@ +module golang.org/x/xerrors + +go 1.11 diff --git a/vendor/golang.org/x/xerrors/internal/internal.go b/vendor/golang.org/x/xerrors/internal/internal.go new file mode 100644 index 000000000000..89f4eca5df7b --- /dev/null +++ b/vendor/golang.org/x/xerrors/internal/internal.go @@ -0,0 +1,8 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package internal + +// EnableTrace indicates whether stack information should be recorded in errors. +var EnableTrace = true diff --git a/vendor/golang.org/x/xerrors/wrap.go b/vendor/golang.org/x/xerrors/wrap.go new file mode 100644 index 000000000000..9a3b510374ec --- /dev/null +++ b/vendor/golang.org/x/xerrors/wrap.go @@ -0,0 +1,106 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package xerrors + +import ( + "reflect" +) + +// A Wrapper provides context around another error. +type Wrapper interface { + // Unwrap returns the next error in the error chain. + // If there is no next error, Unwrap returns nil. + Unwrap() error +} + +// Opaque returns an error with the same error formatting as err +// but that does not match err and cannot be unwrapped. +func Opaque(err error) error { + return noWrapper{err} +} + +type noWrapper struct { + error +} + +func (e noWrapper) FormatError(p Printer) (next error) { + if f, ok := e.error.(Formatter); ok { + return f.FormatError(p) + } + p.Print(e.error) + return nil +} + +// Unwrap returns the result of calling the Unwrap method on err, if err implements +// Unwrap. Otherwise, Unwrap returns nil. +func Unwrap(err error) error { + u, ok := err.(Wrapper) + if !ok { + return nil + } + return u.Unwrap() +} + +// Is reports whether any error in err's chain matches target. +// +// An error is considered to match a target if it is equal to that target or if +// it implements a method Is(error) bool such that Is(target) returns true. +func Is(err, target error) bool { + if target == nil { + return err == target + } + + isComparable := reflect.TypeOf(target).Comparable() + for { + if isComparable && err == target { + return true + } + if x, ok := err.(interface{ Is(error) bool }); ok && x.Is(target) { + return true + } + // TODO: consider supporing target.Is(err). This would allow + // user-definable predicates, but also may allow for coping with sloppy + // APIs, thereby making it easier to get away with them. + if err = Unwrap(err); err == nil { + return false + } + } +} + +// As finds the first error in err's chain that matches the type to which target +// points, and if so, sets the target to its value and returns true. An error +// matches a type if it is assignable to the target type, or if it has a method +// As(interface{}) bool such that As(target) returns true. As will panic if target +// is not a non-nil pointer to a type which implements error or is of interface type. +// +// The As method should set the target to its value and return true if err +// matches the type to which target points. +func As(err error, target interface{}) bool { + if target == nil { + panic("errors: target cannot be nil") + } + val := reflect.ValueOf(target) + typ := val.Type() + if typ.Kind() != reflect.Ptr || val.IsNil() { + panic("errors: target must be a non-nil pointer") + } + if e := typ.Elem(); e.Kind() != reflect.Interface && !e.Implements(errorType) { + panic("errors: *target must be interface or implement error") + } + targetType := typ.Elem() + for err != nil { + if reflect.TypeOf(err).AssignableTo(targetType) { + val.Elem().Set(reflect.ValueOf(err)) + return true + } + if x, ok := err.(interface{ As(interface{}) bool }); ok && x.As(target) { + return true + } + err = Unwrap(err) + } + return false +} + +var errorType = reflect.TypeOf((*error)(nil)).Elem() diff --git a/vendor/gopkg.in/yaml.v2/.travis.yml b/vendor/gopkg.in/yaml.v2/.travis.yml index 055480b9ef8e..7348c50c0c3d 100644 --- a/vendor/gopkg.in/yaml.v2/.travis.yml +++ b/vendor/gopkg.in/yaml.v2/.travis.yml @@ -11,6 +11,7 @@ go: - "1.11.x" - "1.12.x" - "1.13.x" + - "1.14.x" - "tip" go_import_path: gopkg.in/yaml.v2 diff --git a/vendor/gopkg.in/yaml.v2/apic.go b/vendor/gopkg.in/yaml.v2/apic.go index d2c2308f1f4f..acf71402cf31 100644 --- a/vendor/gopkg.in/yaml.v2/apic.go +++ b/vendor/gopkg.in/yaml.v2/apic.go @@ -79,6 +79,8 @@ func yaml_parser_set_encoding(parser *yaml_parser_t, encoding yaml_encoding_t) { parser.encoding = encoding } +var disableLineWrapping = false + // Create a new emitter object. func yaml_emitter_initialize(emitter *yaml_emitter_t) { *emitter = yaml_emitter_t{ @@ -86,7 +88,9 @@ func yaml_emitter_initialize(emitter *yaml_emitter_t) { raw_buffer: make([]byte, 0, output_raw_buffer_size), states: make([]yaml_emitter_state_t, 0, initial_stack_size), events: make([]yaml_event_t, 0, initial_queue_size), - best_width: -1, + } + if disableLineWrapping { + emitter.best_width = -1 } } diff --git a/vendor/gopkg.in/yaml.v2/go.mod b/vendor/gopkg.in/yaml.v2/go.mod index 1934e8769450..2cbb85aeacd7 100644 --- a/vendor/gopkg.in/yaml.v2/go.mod +++ b/vendor/gopkg.in/yaml.v2/go.mod @@ -1,5 +1,5 @@ -module "gopkg.in/yaml.v2" +module gopkg.in/yaml.v2 -require ( - "gopkg.in/check.v1" v0.0.0-20161208181325-20d25e280405 -) +go 1.15 + +require gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 diff --git a/vendor/gopkg.in/yaml.v2/yaml.go b/vendor/gopkg.in/yaml.v2/yaml.go index 89650e293ac7..30813884c067 100644 --- a/vendor/gopkg.in/yaml.v2/yaml.go +++ b/vendor/gopkg.in/yaml.v2/yaml.go @@ -175,7 +175,7 @@ func unmarshal(in []byte, out interface{}, strict bool) (err error) { // Zero valued structs will be omitted if all their public // fields are zero, unless they implement an IsZero // method (see the IsZeroer interface type), in which -// case the field will be included if that method returns true. +// case the field will be excluded if IsZero returns true. // // flow Marshal using a flow style (useful for structs, // sequences and maps). @@ -464,3 +464,15 @@ func isZero(v reflect.Value) bool { } return false } + +// FutureLineWrap globally disables line wrapping when encoding long strings. +// This is a temporary and thus deprecated method introduced to faciliate +// migration towards v3, which offers more control of line lengths on +// individual encodings, and has a default matching the behavior introduced +// by this function. +// +// The default formatting of v2 was erroneously changed in v2.3.0 and reverted +// in v2.4.0, at which point this function was introduced to help migration. +func FutureLineWrap() { + disableLineWrapping = true +} diff --git a/vendor/k8s.io/api/admission/v1/BUILD b/vendor/k8s.io/api/admission/v1/BUILD deleted file mode 100644 index b137fcd9446b..000000000000 --- a/vendor/k8s.io/api/admission/v1/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/api/admission/v1", - importpath = "k8s.io/api/admission/v1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/authentication/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/admission/v1/generated.pb.go b/vendor/k8s.io/api/admission/v1/generated.pb.go index 04eb206750d5..f2db634b864b 100644 --- a/vendor/k8s.io/api/admission/v1/generated.pb.go +++ b/vendor/k8s.io/api/admission/v1/generated.pb.go @@ -1196,10 +1196,7 @@ func (m *AdmissionRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1514,7 +1511,7 @@ func (m *AdmissionResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -1563,10 +1560,7 @@ func (m *AdmissionResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1688,10 +1682,7 @@ func (m *AdmissionReview) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/api/admission/v1/register.go b/vendor/k8s.io/api/admission/v1/register.go index b548509ab325..79000535c76a 100644 --- a/vendor/k8s.io/api/admission/v1/register.go +++ b/vendor/k8s.io/api/admission/v1/register.go @@ -33,12 +33,14 @@ func Resource(resource string) schema.GroupResource { return SchemeGroupVersion.WithResource(resource).GroupResource() } +// TODO: move SchemeBuilder with zz_generated.deepcopy.go to k8s.io/api. +// localSchemeBuilder and AddToScheme will stay in k8s.io/kubernetes. var ( - // TODO: move SchemeBuilder with zz_generated.deepcopy.go to k8s.io/api. - // localSchemeBuilder and AddToScheme will stay in k8s.io/kubernetes. + // SchemeBuilder points to a list of functions added to Scheme. SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes) localSchemeBuilder = &SchemeBuilder - AddToScheme = localSchemeBuilder.AddToScheme + // AddToScheme is a common registration function for mapping packaged scoped group & version keys to a scheme. + AddToScheme = localSchemeBuilder.AddToScheme ) // Adds the list of known types to the given scheme. diff --git a/vendor/k8s.io/api/admission/v1beta1/BUILD b/vendor/k8s.io/api/admission/v1beta1/BUILD deleted file mode 100644 index 571142a81927..000000000000 --- a/vendor/k8s.io/api/admission/v1beta1/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - "zz_generated.prerelease-lifecycle.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/api/admission/v1beta1", - importpath = "k8s.io/api/admission/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/authentication/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/admission/v1beta1/generated.pb.go b/vendor/k8s.io/api/admission/v1beta1/generated.pb.go index ae82ff5996e0..c0de5a93b9ea 100644 --- a/vendor/k8s.io/api/admission/v1beta1/generated.pb.go +++ b/vendor/k8s.io/api/admission/v1beta1/generated.pb.go @@ -1196,10 +1196,7 @@ func (m *AdmissionRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1514,7 +1511,7 @@ func (m *AdmissionResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -1563,10 +1560,7 @@ func (m *AdmissionResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1688,10 +1682,7 @@ func (m *AdmissionReview) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/api/admission/v1beta1/register.go b/vendor/k8s.io/api/admission/v1beta1/register.go index 78d21a0c8a7e..1c53e755dd13 100644 --- a/vendor/k8s.io/api/admission/v1beta1/register.go +++ b/vendor/k8s.io/api/admission/v1beta1/register.go @@ -33,12 +33,14 @@ func Resource(resource string) schema.GroupResource { return SchemeGroupVersion.WithResource(resource).GroupResource() } +// TODO: move SchemeBuilder with zz_generated.deepcopy.go to k8s.io/api. +// localSchemeBuilder and AddToScheme will stay in k8s.io/kubernetes. var ( - // TODO: move SchemeBuilder with zz_generated.deepcopy.go to k8s.io/api. - // localSchemeBuilder and AddToScheme will stay in k8s.io/kubernetes. + // SchemeBuilder points to a list of functions added to Scheme. SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes) localSchemeBuilder = &SchemeBuilder - AddToScheme = localSchemeBuilder.AddToScheme + // AddToScheme is a common registration function for mapping packaged scoped group & version keys to a scheme. + AddToScheme = localSchemeBuilder.AddToScheme ) // Adds the list of known types to the given scheme. diff --git a/vendor/k8s.io/api/admissionregistration/v1/BUILD b/vendor/k8s.io/api/admissionregistration/v1/BUILD deleted file mode 100644 index e24139b05ec4..000000000000 --- a/vendor/k8s.io/api/admissionregistration/v1/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/api/admissionregistration/v1", - importpath = "k8s.io/api/admissionregistration/v1", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/api/admissionregistration/v1/generated.pb.go b/vendor/k8s.io/api/admissionregistration/v1/generated.pb.go index adc47be7fabc..bce77c2a1eed 100644 --- a/vendor/k8s.io/api/admissionregistration/v1/generated.pb.go +++ b/vendor/k8s.io/api/admissionregistration/v1/generated.pb.go @@ -1858,10 +1858,7 @@ func (m *MutatingWebhook) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1978,10 +1975,7 @@ func (m *MutatingWebhookConfiguration) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2098,10 +2092,7 @@ func (m *MutatingWebhookConfigurationList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2280,10 +2271,7 @@ func (m *Rule) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2398,10 +2386,7 @@ func (m *RuleWithOperations) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2568,10 +2553,7 @@ func (m *ServiceReference) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2943,10 +2925,7 @@ func (m *ValidatingWebhook) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3063,10 +3042,7 @@ func (m *ValidatingWebhookConfiguration) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3183,10 +3159,7 @@ func (m *ValidatingWebhookConfigurationList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3339,10 +3312,7 @@ func (m *WebhookClientConfig) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/api/admissionregistration/v1/generated.proto b/vendor/k8s.io/api/admissionregistration/v1/generated.proto index 16ab9d5d671b..c23bb4beee8b 100644 --- a/vendor/k8s.io/api/admissionregistration/v1/generated.proto +++ b/vendor/k8s.io/api/admissionregistration/v1/generated.proto @@ -134,7 +134,7 @@ message MutatingWebhook { // SideEffects states whether this webhook has side effects. // Acceptable values are: None, NoneOnDryRun (webhooks created via v1beta1 may also specify Some or Unknown). // Webhooks with side effects MUST implement a reconciliation system, since a request may be - // rejected by a future step in the admission change and the side effects therefore need to be undone. + // rejected by a future step in the admission chain and the side effects therefore need to be undone. // Requests with the dryRun attribute will be auto-rejected if they match a webhook with // sideEffects == Unknown or Some. optional string sideEffects = 6; @@ -384,7 +384,7 @@ message ValidatingWebhook { // SideEffects states whether this webhook has side effects. // Acceptable values are: None, NoneOnDryRun (webhooks created via v1beta1 may also specify Some or Unknown). // Webhooks with side effects MUST implement a reconciliation system, since a request may be - // rejected by a future step in the admission change and the side effects therefore need to be undone. + // rejected by a future step in the admission chain and the side effects therefore need to be undone. // Requests with the dryRun attribute will be auto-rejected if they match a webhook with // sideEffects == Unknown or Some. optional string sideEffects = 6; diff --git a/vendor/k8s.io/api/admissionregistration/v1/register.go b/vendor/k8s.io/api/admissionregistration/v1/register.go index 716ce7fc5d26..e42a8bce3be0 100644 --- a/vendor/k8s.io/api/admissionregistration/v1/register.go +++ b/vendor/k8s.io/api/admissionregistration/v1/register.go @@ -22,6 +22,7 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" ) +// GroupName is the group name for this API. const GroupName = "admissionregistration.k8s.io" // SchemeGroupVersion is group version used to register these objects @@ -32,12 +33,14 @@ func Resource(resource string) schema.GroupResource { return SchemeGroupVersion.WithResource(resource).GroupResource() } +// TODO: move SchemeBuilder with zz_generated.deepcopy.go to k8s.io/api. +// localSchemeBuilder and AddToScheme will stay in k8s.io/kubernetes. var ( - // TODO: move SchemeBuilder with zz_generated.deepcopy.go to k8s.io/api. - // localSchemeBuilder and AddToScheme will stay in k8s.io/kubernetes. + // SchemeBuilder points to a list of functions added to Scheme. SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes) localSchemeBuilder = &SchemeBuilder - AddToScheme = localSchemeBuilder.AddToScheme + // AddToScheme is a common registration function for mapping packaged scoped group & version keys to a scheme. + AddToScheme = localSchemeBuilder.AddToScheme ) // Adds the list of known types to scheme. diff --git a/vendor/k8s.io/api/admissionregistration/v1/types.go b/vendor/k8s.io/api/admissionregistration/v1/types.go index 74b878287472..ff544c3a3cc5 100644 --- a/vendor/k8s.io/api/admissionregistration/v1/types.go +++ b/vendor/k8s.io/api/admissionregistration/v1/types.go @@ -63,6 +63,7 @@ type Rule struct { Scope *ScopeType `json:"scope,omitempty" protobuf:"bytes,4,rep,name=scope"` } +// ScopeType specifies a scope for a Rule. type ScopeType string const ( @@ -75,6 +76,7 @@ const ( AllScopes ScopeType = "*" ) +// FailurePolicyType specifies a failure policy that defines how unrecognized errors from the admission endpoint are handled. type FailurePolicyType string const ( @@ -84,16 +86,17 @@ const ( Fail FailurePolicyType = "Fail" ) -// MatchPolicyType specifies the type of match policy +// MatchPolicyType specifies the type of match policy. type MatchPolicyType string const ( - // Exact means requests should only be sent to the webhook if they exactly match a given rule + // Exact means requests should only be sent to the webhook if they exactly match a given rule. Exact MatchPolicyType = "Exact" // Equivalent means requests should be sent to the webhook if they modify a resource listed in rules via another API group or version. Equivalent MatchPolicyType = "Equivalent" ) +// SideEffectClass specifies the types of side effects a webhook may have. type SideEffectClass string const ( @@ -276,7 +279,7 @@ type ValidatingWebhook struct { // SideEffects states whether this webhook has side effects. // Acceptable values are: None, NoneOnDryRun (webhooks created via v1beta1 may also specify Some or Unknown). // Webhooks with side effects MUST implement a reconciliation system, since a request may be - // rejected by a future step in the admission change and the side effects therefore need to be undone. + // rejected by a future step in the admission chain and the side effects therefore need to be undone. // Requests with the dryRun attribute will be auto-rejected if they match a webhook with // sideEffects == Unknown or Some. SideEffects *SideEffectClass `json:"sideEffects" protobuf:"bytes,6,opt,name=sideEffects,casttype=SideEffectClass"` @@ -405,7 +408,7 @@ type MutatingWebhook struct { // SideEffects states whether this webhook has side effects. // Acceptable values are: None, NoneOnDryRun (webhooks created via v1beta1 may also specify Some or Unknown). // Webhooks with side effects MUST implement a reconciliation system, since a request may be - // rejected by a future step in the admission change and the side effects therefore need to be undone. + // rejected by a future step in the admission chain and the side effects therefore need to be undone. // Requests with the dryRun attribute will be auto-rejected if they match a webhook with // sideEffects == Unknown or Some. SideEffects *SideEffectClass `json:"sideEffects" protobuf:"bytes,6,opt,name=sideEffects,casttype=SideEffectClass"` @@ -472,6 +475,7 @@ type RuleWithOperations struct { Rule `json:",inline" protobuf:"bytes,2,opt,name=rule"` } +// OperationType specifies an operation for a request. type OperationType string // The constants should be kept in sync with those defined in k8s.io/kubernetes/pkg/admission/interface.go. diff --git a/vendor/k8s.io/api/admissionregistration/v1/types_swagger_doc_generated.go b/vendor/k8s.io/api/admissionregistration/v1/types_swagger_doc_generated.go index 5ec59304c5bb..ba92729c3c5a 100644 --- a/vendor/k8s.io/api/admissionregistration/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/admissionregistration/v1/types_swagger_doc_generated.go @@ -36,7 +36,7 @@ var map_MutatingWebhook = map[string]string{ "matchPolicy": "matchPolicy defines how the \"rules\" list is used to match incoming requests. Allowed values are \"Exact\" or \"Equivalent\".\n\n- Exact: match a request only if it exactly matches a specified rule. For example, if deployments can be modified via apps/v1, apps/v1beta1, and extensions/v1beta1, but \"rules\" only included `apiGroups:[\"apps\"], apiVersions:[\"v1\"], resources: [\"deployments\"]`, a request to apps/v1beta1 or extensions/v1beta1 would not be sent to the webhook.\n\n- Equivalent: match a request if modifies a resource listed in rules, even via another API group or version. For example, if deployments can be modified via apps/v1, apps/v1beta1, and extensions/v1beta1, and \"rules\" only included `apiGroups:[\"apps\"], apiVersions:[\"v1\"], resources: [\"deployments\"]`, a request to apps/v1beta1 or extensions/v1beta1 would be converted to apps/v1 and sent to the webhook.\n\nDefaults to \"Equivalent\"", "namespaceSelector": "NamespaceSelector decides whether to run the webhook on an object based on whether the namespace for that object matches the selector. If the object itself is a namespace, the matching is performed on object.metadata.labels. If the object is another cluster scoped resource, it never skips the webhook.\n\nFor example, to run the webhook on any objects whose namespace is not associated with \"runlevel\" of \"0\" or \"1\"; you will set the selector as follows: \"namespaceSelector\": {\n \"matchExpressions\": [\n {\n \"key\": \"runlevel\",\n \"operator\": \"NotIn\",\n \"values\": [\n \"0\",\n \"1\"\n ]\n }\n ]\n}\n\nIf instead you want to only run the webhook on any objects whose namespace is associated with the \"environment\" of \"prod\" or \"staging\"; you will set the selector as follows: \"namespaceSelector\": {\n \"matchExpressions\": [\n {\n \"key\": \"environment\",\n \"operator\": \"In\",\n \"values\": [\n \"prod\",\n \"staging\"\n ]\n }\n ]\n}\n\nSee https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ for more examples of label selectors.\n\nDefault to the empty LabelSelector, which matches everything.", "objectSelector": "ObjectSelector decides whether to run the webhook based on if the object has matching labels. objectSelector is evaluated against both the oldObject and newObject that would be sent to the webhook, and is considered to match if either object matches the selector. A null object (oldObject in the case of create, or newObject in the case of delete) or an object that cannot have labels (like a DeploymentRollback or a PodProxyOptions object) is not considered to match. Use the object selector only if the webhook is opt-in, because end users may skip the admission webhook by setting the labels. Default to the empty LabelSelector, which matches everything.", - "sideEffects": "SideEffects states whether this webhook has side effects. Acceptable values are: None, NoneOnDryRun (webhooks created via v1beta1 may also specify Some or Unknown). Webhooks with side effects MUST implement a reconciliation system, since a request may be rejected by a future step in the admission change and the side effects therefore need to be undone. Requests with the dryRun attribute will be auto-rejected if they match a webhook with sideEffects == Unknown or Some.", + "sideEffects": "SideEffects states whether this webhook has side effects. Acceptable values are: None, NoneOnDryRun (webhooks created via v1beta1 may also specify Some or Unknown). Webhooks with side effects MUST implement a reconciliation system, since a request may be rejected by a future step in the admission chain and the side effects therefore need to be undone. Requests with the dryRun attribute will be auto-rejected if they match a webhook with sideEffects == Unknown or Some.", "timeoutSeconds": "TimeoutSeconds specifies the timeout for this webhook. After the timeout passes, the webhook call will be ignored or the API call will fail based on the failure policy. The timeout value must be between 1 and 30 seconds. Default to 10 seconds.", "admissionReviewVersions": "AdmissionReviewVersions is an ordered list of preferred `AdmissionReview` versions the Webhook expects. API server will try to use first version in the list which it supports. If none of the versions specified in this list supported by API server, validation will fail for this object. If a persisted webhook configuration specifies allowed versions and does not include any versions known to the API Server, calls to the webhook will fail and be subject to the failure policy.", "reinvocationPolicy": "reinvocationPolicy indicates whether this webhook should be called multiple times as part of a single admission evaluation. Allowed values are \"Never\" and \"IfNeeded\".\n\nNever: the webhook will not be called more than once in a single admission evaluation.\n\nIfNeeded: the webhook will be called at least one additional time as part of the admission evaluation if the object being admitted is modified by other admission plugins after the initial webhook call. Webhooks that specify this option *must* be idempotent, able to process objects they previously admitted. Note: * the number of additional invocations is not guaranteed to be exactly one. * if additional invocations result in further modifications to the object, webhooks are not guaranteed to be invoked again. * webhooks that use this option may be reordered to minimize the number of additional invocations. * to validate an object after all mutations are guaranteed complete, use a validating admission webhook instead.\n\nDefaults to \"Never\".", @@ -108,7 +108,7 @@ var map_ValidatingWebhook = map[string]string{ "matchPolicy": "matchPolicy defines how the \"rules\" list is used to match incoming requests. Allowed values are \"Exact\" or \"Equivalent\".\n\n- Exact: match a request only if it exactly matches a specified rule. For example, if deployments can be modified via apps/v1, apps/v1beta1, and extensions/v1beta1, but \"rules\" only included `apiGroups:[\"apps\"], apiVersions:[\"v1\"], resources: [\"deployments\"]`, a request to apps/v1beta1 or extensions/v1beta1 would not be sent to the webhook.\n\n- Equivalent: match a request if modifies a resource listed in rules, even via another API group or version. For example, if deployments can be modified via apps/v1, apps/v1beta1, and extensions/v1beta1, and \"rules\" only included `apiGroups:[\"apps\"], apiVersions:[\"v1\"], resources: [\"deployments\"]`, a request to apps/v1beta1 or extensions/v1beta1 would be converted to apps/v1 and sent to the webhook.\n\nDefaults to \"Equivalent\"", "namespaceSelector": "NamespaceSelector decides whether to run the webhook on an object based on whether the namespace for that object matches the selector. If the object itself is a namespace, the matching is performed on object.metadata.labels. If the object is another cluster scoped resource, it never skips the webhook.\n\nFor example, to run the webhook on any objects whose namespace is not associated with \"runlevel\" of \"0\" or \"1\"; you will set the selector as follows: \"namespaceSelector\": {\n \"matchExpressions\": [\n {\n \"key\": \"runlevel\",\n \"operator\": \"NotIn\",\n \"values\": [\n \"0\",\n \"1\"\n ]\n }\n ]\n}\n\nIf instead you want to only run the webhook on any objects whose namespace is associated with the \"environment\" of \"prod\" or \"staging\"; you will set the selector as follows: \"namespaceSelector\": {\n \"matchExpressions\": [\n {\n \"key\": \"environment\",\n \"operator\": \"In\",\n \"values\": [\n \"prod\",\n \"staging\"\n ]\n }\n ]\n}\n\nSee https://kubernetes.io/docs/concepts/overview/working-with-objects/labels for more examples of label selectors.\n\nDefault to the empty LabelSelector, which matches everything.", "objectSelector": "ObjectSelector decides whether to run the webhook based on if the object has matching labels. objectSelector is evaluated against both the oldObject and newObject that would be sent to the webhook, and is considered to match if either object matches the selector. A null object (oldObject in the case of create, or newObject in the case of delete) or an object that cannot have labels (like a DeploymentRollback or a PodProxyOptions object) is not considered to match. Use the object selector only if the webhook is opt-in, because end users may skip the admission webhook by setting the labels. Default to the empty LabelSelector, which matches everything.", - "sideEffects": "SideEffects states whether this webhook has side effects. Acceptable values are: None, NoneOnDryRun (webhooks created via v1beta1 may also specify Some or Unknown). Webhooks with side effects MUST implement a reconciliation system, since a request may be rejected by a future step in the admission change and the side effects therefore need to be undone. Requests with the dryRun attribute will be auto-rejected if they match a webhook with sideEffects == Unknown or Some.", + "sideEffects": "SideEffects states whether this webhook has side effects. Acceptable values are: None, NoneOnDryRun (webhooks created via v1beta1 may also specify Some or Unknown). Webhooks with side effects MUST implement a reconciliation system, since a request may be rejected by a future step in the admission chain and the side effects therefore need to be undone. Requests with the dryRun attribute will be auto-rejected if they match a webhook with sideEffects == Unknown or Some.", "timeoutSeconds": "TimeoutSeconds specifies the timeout for this webhook. After the timeout passes, the webhook call will be ignored or the API call will fail based on the failure policy. The timeout value must be between 1 and 30 seconds. Default to 10 seconds.", "admissionReviewVersions": "AdmissionReviewVersions is an ordered list of preferred `AdmissionReview` versions the Webhook expects. API server will try to use first version in the list which it supports. If none of the versions specified in this list supported by API server, validation will fail for this object. If a persisted webhook configuration specifies allowed versions and does not include any versions known to the API Server, calls to the webhook will fail and be subject to the failure policy.", } diff --git a/vendor/k8s.io/api/admissionregistration/v1beta1/BUILD b/vendor/k8s.io/api/admissionregistration/v1beta1/BUILD deleted file mode 100644 index 1a119846a558..000000000000 --- a/vendor/k8s.io/api/admissionregistration/v1beta1/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - "zz_generated.prerelease-lifecycle.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/api/admissionregistration/v1beta1", - importpath = "k8s.io/api/admissionregistration/v1beta1", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/api/admissionregistration/v1beta1/generated.pb.go b/vendor/k8s.io/api/admissionregistration/v1beta1/generated.pb.go index c98aa7477b35..d5e802f3b3b4 100644 --- a/vendor/k8s.io/api/admissionregistration/v1beta1/generated.pb.go +++ b/vendor/k8s.io/api/admissionregistration/v1beta1/generated.pb.go @@ -1859,10 +1859,7 @@ func (m *MutatingWebhook) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1979,10 +1976,7 @@ func (m *MutatingWebhookConfiguration) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2099,10 +2093,7 @@ func (m *MutatingWebhookConfigurationList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2281,10 +2272,7 @@ func (m *Rule) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2399,10 +2387,7 @@ func (m *RuleWithOperations) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2569,10 +2554,7 @@ func (m *ServiceReference) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2944,10 +2926,7 @@ func (m *ValidatingWebhook) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3064,10 +3043,7 @@ func (m *ValidatingWebhookConfiguration) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3184,10 +3160,7 @@ func (m *ValidatingWebhookConfigurationList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3340,10 +3313,7 @@ func (m *WebhookClientConfig) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/api/admissionregistration/v1beta1/generated.proto b/vendor/k8s.io/api/admissionregistration/v1beta1/generated.proto index bdae74037669..2752f4faee0f 100644 --- a/vendor/k8s.io/api/admissionregistration/v1beta1/generated.proto +++ b/vendor/k8s.io/api/admissionregistration/v1beta1/generated.proto @@ -134,7 +134,7 @@ message MutatingWebhook { // SideEffects states whether this webhook has side effects. // Acceptable values are: Unknown, None, Some, NoneOnDryRun // Webhooks with side effects MUST implement a reconciliation system, since a request may be - // rejected by a future step in the admission change and the side effects therefore need to be undone. + // rejected by a future step in the admission chain and the side effects therefore need to be undone. // Requests with the dryRun attribute will be auto-rejected if they match a webhook with // sideEffects == Unknown or Some. Defaults to Unknown. // +optional @@ -388,7 +388,7 @@ message ValidatingWebhook { // SideEffects states whether this webhook has side effects. // Acceptable values are: Unknown, None, Some, NoneOnDryRun // Webhooks with side effects MUST implement a reconciliation system, since a request may be - // rejected by a future step in the admission change and the side effects therefore need to be undone. + // rejected by a future step in the admission chain and the side effects therefore need to be undone. // Requests with the dryRun attribute will be auto-rejected if they match a webhook with // sideEffects == Unknown or Some. Defaults to Unknown. // +optional diff --git a/vendor/k8s.io/api/admissionregistration/v1beta1/register.go b/vendor/k8s.io/api/admissionregistration/v1beta1/register.go index d126da9fb719..098744cf634f 100644 --- a/vendor/k8s.io/api/admissionregistration/v1beta1/register.go +++ b/vendor/k8s.io/api/admissionregistration/v1beta1/register.go @@ -22,6 +22,7 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" ) +// GroupName is the group name for this API. const GroupName = "admissionregistration.k8s.io" // SchemeGroupVersion is group version used to register these objects @@ -32,12 +33,14 @@ func Resource(resource string) schema.GroupResource { return SchemeGroupVersion.WithResource(resource).GroupResource() } +// TODO: move SchemeBuilder with zz_generated.deepcopy.go to k8s.io/api. +// localSchemeBuilder and AddToScheme will stay in k8s.io/kubernetes. var ( - // TODO: move SchemeBuilder with zz_generated.deepcopy.go to k8s.io/api. - // localSchemeBuilder and AddToScheme will stay in k8s.io/kubernetes. + // SchemeBuilder points to a list of functions added to Scheme. SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes) localSchemeBuilder = &SchemeBuilder - AddToScheme = localSchemeBuilder.AddToScheme + // AddToScheme is a common registration function for mapping packaged scoped group & version keys to a scheme. + AddToScheme = localSchemeBuilder.AddToScheme ) // Adds the list of known types to scheme. diff --git a/vendor/k8s.io/api/admissionregistration/v1beta1/types.go b/vendor/k8s.io/api/admissionregistration/v1beta1/types.go index 2297b7e130ff..630ea1f57b47 100644 --- a/vendor/k8s.io/api/admissionregistration/v1beta1/types.go +++ b/vendor/k8s.io/api/admissionregistration/v1beta1/types.go @@ -63,6 +63,7 @@ type Rule struct { Scope *ScopeType `json:"scope,omitempty" protobuf:"bytes,4,rep,name=scope"` } +// ScopeType specifies a scope for a Rule. type ScopeType string const ( @@ -75,6 +76,7 @@ const ( AllScopes ScopeType = "*" ) +// FailurePolicyType specifies a failure policy that defines how unrecognized errors from the admission endpoint are handled. type FailurePolicyType string const ( @@ -94,6 +96,7 @@ const ( Equivalent MatchPolicyType = "Equivalent" ) +// SideEffectClass specifies the types of side effects a webhook may have. type SideEffectClass string const ( @@ -294,7 +297,7 @@ type ValidatingWebhook struct { // SideEffects states whether this webhook has side effects. // Acceptable values are: Unknown, None, Some, NoneOnDryRun // Webhooks with side effects MUST implement a reconciliation system, since a request may be - // rejected by a future step in the admission change and the side effects therefore need to be undone. + // rejected by a future step in the admission chain and the side effects therefore need to be undone. // Requests with the dryRun attribute will be auto-rejected if they match a webhook with // sideEffects == Unknown or Some. Defaults to Unknown. // +optional @@ -426,7 +429,7 @@ type MutatingWebhook struct { // SideEffects states whether this webhook has side effects. // Acceptable values are: Unknown, None, Some, NoneOnDryRun // Webhooks with side effects MUST implement a reconciliation system, since a request may be - // rejected by a future step in the admission change and the side effects therefore need to be undone. + // rejected by a future step in the admission chain and the side effects therefore need to be undone. // Requests with the dryRun attribute will be auto-rejected if they match a webhook with // sideEffects == Unknown or Some. Defaults to Unknown. // +optional @@ -496,6 +499,7 @@ type RuleWithOperations struct { Rule `json:",inline" protobuf:"bytes,2,opt,name=rule"` } +// OperationType specifies an operation for a request. type OperationType string // The constants should be kept in sync with those defined in k8s.io/kubernetes/pkg/admission/interface.go. diff --git a/vendor/k8s.io/api/admissionregistration/v1beta1/types_swagger_doc_generated.go b/vendor/k8s.io/api/admissionregistration/v1beta1/types_swagger_doc_generated.go index f682172bba7a..314c3afae062 100644 --- a/vendor/k8s.io/api/admissionregistration/v1beta1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/admissionregistration/v1beta1/types_swagger_doc_generated.go @@ -36,7 +36,7 @@ var map_MutatingWebhook = map[string]string{ "matchPolicy": "matchPolicy defines how the \"rules\" list is used to match incoming requests. Allowed values are \"Exact\" or \"Equivalent\".\n\n- Exact: match a request only if it exactly matches a specified rule. For example, if deployments can be modified via apps/v1, apps/v1beta1, and extensions/v1beta1, but \"rules\" only included `apiGroups:[\"apps\"], apiVersions:[\"v1\"], resources: [\"deployments\"]`, a request to apps/v1beta1 or extensions/v1beta1 would not be sent to the webhook.\n\n- Equivalent: match a request if modifies a resource listed in rules, even via another API group or version. For example, if deployments can be modified via apps/v1, apps/v1beta1, and extensions/v1beta1, and \"rules\" only included `apiGroups:[\"apps\"], apiVersions:[\"v1\"], resources: [\"deployments\"]`, a request to apps/v1beta1 or extensions/v1beta1 would be converted to apps/v1 and sent to the webhook.\n\nDefaults to \"Exact\"", "namespaceSelector": "NamespaceSelector decides whether to run the webhook on an object based on whether the namespace for that object matches the selector. If the object itself is a namespace, the matching is performed on object.metadata.labels. If the object is another cluster scoped resource, it never skips the webhook.\n\nFor example, to run the webhook on any objects whose namespace is not associated with \"runlevel\" of \"0\" or \"1\"; you will set the selector as follows: \"namespaceSelector\": {\n \"matchExpressions\": [\n {\n \"key\": \"runlevel\",\n \"operator\": \"NotIn\",\n \"values\": [\n \"0\",\n \"1\"\n ]\n }\n ]\n}\n\nIf instead you want to only run the webhook on any objects whose namespace is associated with the \"environment\" of \"prod\" or \"staging\"; you will set the selector as follows: \"namespaceSelector\": {\n \"matchExpressions\": [\n {\n \"key\": \"environment\",\n \"operator\": \"In\",\n \"values\": [\n \"prod\",\n \"staging\"\n ]\n }\n ]\n}\n\nSee https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ for more examples of label selectors.\n\nDefault to the empty LabelSelector, which matches everything.", "objectSelector": "ObjectSelector decides whether to run the webhook based on if the object has matching labels. objectSelector is evaluated against both the oldObject and newObject that would be sent to the webhook, and is considered to match if either object matches the selector. A null object (oldObject in the case of create, or newObject in the case of delete) or an object that cannot have labels (like a DeploymentRollback or a PodProxyOptions object) is not considered to match. Use the object selector only if the webhook is opt-in, because end users may skip the admission webhook by setting the labels. Default to the empty LabelSelector, which matches everything.", - "sideEffects": "SideEffects states whether this webhook has side effects. Acceptable values are: Unknown, None, Some, NoneOnDryRun Webhooks with side effects MUST implement a reconciliation system, since a request may be rejected by a future step in the admission change and the side effects therefore need to be undone. Requests with the dryRun attribute will be auto-rejected if they match a webhook with sideEffects == Unknown or Some. Defaults to Unknown.", + "sideEffects": "SideEffects states whether this webhook has side effects. Acceptable values are: Unknown, None, Some, NoneOnDryRun Webhooks with side effects MUST implement a reconciliation system, since a request may be rejected by a future step in the admission chain and the side effects therefore need to be undone. Requests with the dryRun attribute will be auto-rejected if they match a webhook with sideEffects == Unknown or Some. Defaults to Unknown.", "timeoutSeconds": "TimeoutSeconds specifies the timeout for this webhook. After the timeout passes, the webhook call will be ignored or the API call will fail based on the failure policy. The timeout value must be between 1 and 30 seconds. Default to 30 seconds.", "admissionReviewVersions": "AdmissionReviewVersions is an ordered list of preferred `AdmissionReview` versions the Webhook expects. API server will try to use first version in the list which it supports. If none of the versions specified in this list supported by API server, validation will fail for this object. If a persisted webhook configuration specifies allowed versions and does not include any versions known to the API Server, calls to the webhook will fail and be subject to the failure policy. Default to `['v1beta1']`.", "reinvocationPolicy": "reinvocationPolicy indicates whether this webhook should be called multiple times as part of a single admission evaluation. Allowed values are \"Never\" and \"IfNeeded\".\n\nNever: the webhook will not be called more than once in a single admission evaluation.\n\nIfNeeded: the webhook will be called at least one additional time as part of the admission evaluation if the object being admitted is modified by other admission plugins after the initial webhook call. Webhooks that specify this option *must* be idempotent, able to process objects they previously admitted. Note: * the number of additional invocations is not guaranteed to be exactly one. * if additional invocations result in further modifications to the object, webhooks are not guaranteed to be invoked again. * webhooks that use this option may be reordered to minimize the number of additional invocations. * to validate an object after all mutations are guaranteed complete, use a validating admission webhook instead.\n\nDefaults to \"Never\".", @@ -108,7 +108,7 @@ var map_ValidatingWebhook = map[string]string{ "matchPolicy": "matchPolicy defines how the \"rules\" list is used to match incoming requests. Allowed values are \"Exact\" or \"Equivalent\".\n\n- Exact: match a request only if it exactly matches a specified rule. For example, if deployments can be modified via apps/v1, apps/v1beta1, and extensions/v1beta1, but \"rules\" only included `apiGroups:[\"apps\"], apiVersions:[\"v1\"], resources: [\"deployments\"]`, a request to apps/v1beta1 or extensions/v1beta1 would not be sent to the webhook.\n\n- Equivalent: match a request if modifies a resource listed in rules, even via another API group or version. For example, if deployments can be modified via apps/v1, apps/v1beta1, and extensions/v1beta1, and \"rules\" only included `apiGroups:[\"apps\"], apiVersions:[\"v1\"], resources: [\"deployments\"]`, a request to apps/v1beta1 or extensions/v1beta1 would be converted to apps/v1 and sent to the webhook.\n\nDefaults to \"Exact\"", "namespaceSelector": "NamespaceSelector decides whether to run the webhook on an object based on whether the namespace for that object matches the selector. If the object itself is a namespace, the matching is performed on object.metadata.labels. If the object is another cluster scoped resource, it never skips the webhook.\n\nFor example, to run the webhook on any objects whose namespace is not associated with \"runlevel\" of \"0\" or \"1\"; you will set the selector as follows: \"namespaceSelector\": {\n \"matchExpressions\": [\n {\n \"key\": \"runlevel\",\n \"operator\": \"NotIn\",\n \"values\": [\n \"0\",\n \"1\"\n ]\n }\n ]\n}\n\nIf instead you want to only run the webhook on any objects whose namespace is associated with the \"environment\" of \"prod\" or \"staging\"; you will set the selector as follows: \"namespaceSelector\": {\n \"matchExpressions\": [\n {\n \"key\": \"environment\",\n \"operator\": \"In\",\n \"values\": [\n \"prod\",\n \"staging\"\n ]\n }\n ]\n}\n\nSee https://kubernetes.io/docs/concepts/overview/working-with-objects/labels for more examples of label selectors.\n\nDefault to the empty LabelSelector, which matches everything.", "objectSelector": "ObjectSelector decides whether to run the webhook based on if the object has matching labels. objectSelector is evaluated against both the oldObject and newObject that would be sent to the webhook, and is considered to match if either object matches the selector. A null object (oldObject in the case of create, or newObject in the case of delete) or an object that cannot have labels (like a DeploymentRollback or a PodProxyOptions object) is not considered to match. Use the object selector only if the webhook is opt-in, because end users may skip the admission webhook by setting the labels. Default to the empty LabelSelector, which matches everything.", - "sideEffects": "SideEffects states whether this webhook has side effects. Acceptable values are: Unknown, None, Some, NoneOnDryRun Webhooks with side effects MUST implement a reconciliation system, since a request may be rejected by a future step in the admission change and the side effects therefore need to be undone. Requests with the dryRun attribute will be auto-rejected if they match a webhook with sideEffects == Unknown or Some. Defaults to Unknown.", + "sideEffects": "SideEffects states whether this webhook has side effects. Acceptable values are: Unknown, None, Some, NoneOnDryRun Webhooks with side effects MUST implement a reconciliation system, since a request may be rejected by a future step in the admission chain and the side effects therefore need to be undone. Requests with the dryRun attribute will be auto-rejected if they match a webhook with sideEffects == Unknown or Some. Defaults to Unknown.", "timeoutSeconds": "TimeoutSeconds specifies the timeout for this webhook. After the timeout passes, the webhook call will be ignored or the API call will fail based on the failure policy. The timeout value must be between 1 and 30 seconds. Default to 30 seconds.", "admissionReviewVersions": "AdmissionReviewVersions is an ordered list of preferred `AdmissionReview` versions the Webhook expects. API server will try to use first version in the list which it supports. If none of the versions specified in this list supported by API server, validation will fail for this object. If a persisted webhook configuration specifies allowed versions and does not include any versions known to the API Server, calls to the webhook will fail and be subject to the failure policy. Default to `['v1beta1']`.", } diff --git a/vendor/k8s.io/api/apiserverinternal/v1alpha1/BUILD b/vendor/k8s.io/api/apiserverinternal/v1alpha1/BUILD deleted file mode 100644 index 062527ee01a5..000000000000 --- a/vendor/k8s.io/api/apiserverinternal/v1alpha1/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/api/apiserverinternal/v1alpha1", - importpath = "k8s.io/api/apiserverinternal/v1alpha1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/apiserverinternal/v1alpha1/generated.pb.go b/vendor/k8s.io/api/apiserverinternal/v1alpha1/generated.pb.go index 0af1c09d1c6d..ee12c7d0dc99 100644 --- a/vendor/k8s.io/api/apiserverinternal/v1alpha1/generated.pb.go +++ b/vendor/k8s.io/api/apiserverinternal/v1alpha1/generated.pb.go @@ -902,10 +902,7 @@ func (m *ServerStorageVersion) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1054,10 +1051,7 @@ func (m *StorageVersion) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1287,10 +1281,7 @@ func (m *StorageVersionCondition) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1407,10 +1398,7 @@ func (m *StorageVersionList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1460,10 +1448,7 @@ func (m *StorageVersionSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1614,10 +1599,7 @@ func (m *StorageVersionStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/api/apps/v1/BUILD b/vendor/k8s.io/api/apps/v1/BUILD deleted file mode 100644 index 3d7a6bc7b4d9..000000000000 --- a/vendor/k8s.io/api/apps/v1/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/api/apps/v1", - importpath = "k8s.io/api/apps/v1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/apps/v1/generated.pb.go b/vendor/k8s.io/api/apps/v1/generated.pb.go index 6ef25f50f90a..19fe45638867 100644 --- a/vendor/k8s.io/api/apps/v1/generated.pb.go +++ b/vendor/k8s.io/api/apps/v1/generated.pb.go @@ -870,132 +870,132 @@ func init() { var fileDescriptor_e1014cab6f31e43b = []byte{ // 2031 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5a, 0xcd, 0x6f, 0x24, 0x47, - 0x1d, 0x75, 0xcf, 0x87, 0x3d, 0x2e, 0xaf, 0xed, 0xdd, 0xb2, 0xb1, 0x27, 0xbb, 0x64, 0x66, 0x19, + 0x15, 0x77, 0xcf, 0x87, 0x3d, 0x2e, 0xaf, 0xed, 0xdd, 0xb2, 0xb1, 0x27, 0xbb, 0x64, 0x66, 0x19, 0x60, 0xe3, 0x64, 0xb3, 0x3d, 0xec, 0x66, 0x13, 0xa1, 0x2c, 0x02, 0x79, 0xc6, 0x21, 0x84, 0x78, 0x6c, 0x53, 0x5e, 0xef, 0x61, 0x09, 0x12, 0xe5, 0xe9, 0xda, 0x71, 0xc7, 0xfd, 0xa5, 0xee, 0xea, - 0x61, 0x47, 0x5c, 0x10, 0x12, 0x9c, 0x38, 0xf0, 0x9f, 0x20, 0x84, 0xe0, 0x86, 0x22, 0xc4, 0x65, - 0x2f, 0x48, 0x11, 0x17, 0x72, 0xb2, 0xd8, 0xc9, 0x09, 0xa1, 0x1c, 0xb9, 0xe4, 0x02, 0xaa, 0xea, - 0xea, 0xef, 0x6a, 0xcf, 0xd8, 0x9b, 0x38, 0x24, 0xca, 0xcd, 0x53, 0xf5, 0x7e, 0xaf, 0x7f, 0x55, - 0xf5, 0xab, 0x7a, 0xaf, 0xab, 0x0d, 0xee, 0x1d, 0x7f, 0xdb, 0x53, 0x75, 0xbb, 0x7d, 0xec, 0x1f, - 0x12, 0xd7, 0x22, 0x94, 0x78, 0xed, 0x21, 0xb1, 0x34, 0xdb, 0x6d, 0x8b, 0x0e, 0xec, 0xe8, 0x6d, - 0xec, 0x38, 0x5e, 0x7b, 0x78, 0xbb, 0x3d, 0x20, 0x16, 0x71, 0x31, 0x25, 0x9a, 0xea, 0xb8, 0x36, - 0xb5, 0x21, 0x0c, 0x30, 0x2a, 0x76, 0x74, 0x95, 0x61, 0xd4, 0xe1, 0xed, 0xab, 0xb7, 0x06, 0x3a, - 0x3d, 0xf2, 0x0f, 0xd5, 0xbe, 0x6d, 0xb6, 0x07, 0xf6, 0xc0, 0x6e, 0x73, 0xe8, 0xa1, 0xff, 0x88, - 0xff, 0xe2, 0x3f, 0xf8, 0x5f, 0x01, 0xc5, 0xd5, 0x56, 0xe2, 0x31, 0x7d, 0xdb, 0x25, 0x92, 0xc7, - 0x5c, 0xbd, 0x1b, 0x63, 0x4c, 0xdc, 0x3f, 0xd2, 0x2d, 0xe2, 0x8e, 0xda, 0xce, 0xf1, 0x80, 0x35, - 0x78, 0x6d, 0x93, 0x50, 0x2c, 0x8b, 0x6a, 0x17, 0x45, 0xb9, 0xbe, 0x45, 0x75, 0x93, 0xe4, 0x02, - 0x5e, 0x9b, 0x14, 0xe0, 0xf5, 0x8f, 0x88, 0x89, 0x73, 0x71, 0xaf, 0x14, 0xc5, 0xf9, 0x54, 0x37, - 0xda, 0xba, 0x45, 0x3d, 0xea, 0x66, 0x83, 0x5a, 0xff, 0x51, 0x00, 0xec, 0xda, 0x16, 0x75, 0x6d, - 0xc3, 0x20, 0x2e, 0x22, 0x43, 0xdd, 0xd3, 0x6d, 0x0b, 0xfe, 0x14, 0xd4, 0xd8, 0x78, 0x34, 0x4c, - 0x71, 0x5d, 0xb9, 0xae, 0x6c, 0x2c, 0xdc, 0xf9, 0x96, 0x1a, 0x4f, 0x72, 0x44, 0xaf, 0x3a, 0xc7, - 0x03, 0xd6, 0xe0, 0xa9, 0x0c, 0xad, 0x0e, 0x6f, 0xab, 0xbb, 0x87, 0xef, 0x92, 0x3e, 0xed, 0x11, - 0x8a, 0x3b, 0xf0, 0xc9, 0x49, 0x73, 0x66, 0x7c, 0xd2, 0x04, 0x71, 0x1b, 0x8a, 0x58, 0xe1, 0x2e, - 0xa8, 0x70, 0xf6, 0x12, 0x67, 0xbf, 0x55, 0xc8, 0x2e, 0x06, 0xad, 0x22, 0xfc, 0xb3, 0x37, 0x1e, - 0x53, 0x62, 0xb1, 0xf4, 0x3a, 0x97, 0x04, 0x75, 0x65, 0x0b, 0x53, 0x8c, 0x38, 0x11, 0x7c, 0x19, - 0xd4, 0x5c, 0x91, 0x7e, 0xbd, 0x7c, 0x5d, 0xd9, 0x28, 0x77, 0x2e, 0x0b, 0x54, 0x2d, 0x1c, 0x16, - 0x8a, 0x10, 0xad, 0xbf, 0x2a, 0x60, 0x2d, 0x3f, 0xee, 0x6d, 0xdd, 0xa3, 0xf0, 0x9d, 0xdc, 0xd8, - 0xd5, 0xe9, 0xc6, 0xce, 0xa2, 0xf9, 0xc8, 0xa3, 0x07, 0x87, 0x2d, 0x89, 0x71, 0xbf, 0x0d, 0xaa, - 0x3a, 0x25, 0xa6, 0x57, 0x2f, 0x5d, 0x2f, 0x6f, 0x2c, 0xdc, 0xb9, 0xa1, 0xe6, 0x6b, 0x57, 0xcd, - 0x27, 0xd6, 0x59, 0x14, 0x94, 0xd5, 0xb7, 0x58, 0x30, 0x0a, 0x38, 0x5a, 0xff, 0x55, 0xc0, 0xfc, - 0x16, 0x26, 0xa6, 0x6d, 0xed, 0x13, 0x7a, 0x01, 0x8b, 0xd6, 0x05, 0x15, 0xcf, 0x21, 0x7d, 0xb1, - 0x68, 0x5f, 0x93, 0xe5, 0x1e, 0xa5, 0xb3, 0xef, 0x90, 0x7e, 0xbc, 0x50, 0xec, 0x17, 0xe2, 0xc1, - 0xf0, 0x6d, 0x30, 0xeb, 0x51, 0x4c, 0x7d, 0x8f, 0x2f, 0xd3, 0xc2, 0x9d, 0xaf, 0x9f, 0x4e, 0xc3, - 0xa1, 0x9d, 0x25, 0x41, 0x34, 0x1b, 0xfc, 0x46, 0x82, 0xa2, 0xf5, 0xaf, 0x12, 0x80, 0x11, 0xb6, - 0x6b, 0x5b, 0x9a, 0x4e, 0x59, 0xfd, 0xbe, 0x0e, 0x2a, 0x74, 0xe4, 0x10, 0x3e, 0x0d, 0xf3, 0x9d, - 0x1b, 0x61, 0x16, 0xf7, 0x47, 0x0e, 0xf9, 0xf8, 0xa4, 0xb9, 0x96, 0x8f, 0x60, 0x3d, 0x88, 0xc7, - 0xc0, 0xed, 0x28, 0xbf, 0x12, 0x8f, 0xbe, 0x9b, 0x7e, 0xf4, 0xc7, 0x27, 0x4d, 0xc9, 0x61, 0xa1, - 0x46, 0x4c, 0xe9, 0x04, 0xe1, 0x10, 0x40, 0x03, 0x7b, 0xf4, 0xbe, 0x8b, 0x2d, 0x2f, 0x78, 0x92, - 0x6e, 0x12, 0x31, 0xf2, 0x97, 0xa6, 0x5b, 0x1e, 0x16, 0xd1, 0xb9, 0x2a, 0xb2, 0x80, 0xdb, 0x39, - 0x36, 0x24, 0x79, 0x02, 0xbc, 0x01, 0x66, 0x5d, 0x82, 0x3d, 0xdb, 0xaa, 0x57, 0xf8, 0x28, 0xa2, - 0x09, 0x44, 0xbc, 0x15, 0x89, 0x5e, 0xf8, 0x22, 0x98, 0x33, 0x89, 0xe7, 0xe1, 0x01, 0xa9, 0x57, - 0x39, 0x70, 0x59, 0x00, 0xe7, 0x7a, 0x41, 0x33, 0x0a, 0xfb, 0x5b, 0xbf, 0x57, 0xc0, 0x62, 0x34, - 0x73, 0x17, 0xb0, 0x55, 0x3a, 0xe9, 0xad, 0xf2, 0xfc, 0xa9, 0x75, 0x52, 0xb0, 0x43, 0xde, 0x2b, - 0x27, 0x72, 0x66, 0x45, 0x08, 0x7f, 0x02, 0x6a, 0x1e, 0x31, 0x48, 0x9f, 0xda, 0xae, 0xc8, 0xf9, - 0x95, 0x29, 0x73, 0xc6, 0x87, 0xc4, 0xd8, 0x17, 0xa1, 0x9d, 0x4b, 0x2c, 0xe9, 0xf0, 0x17, 0x8a, - 0x28, 0xe1, 0x8f, 0x40, 0x8d, 0x12, 0xd3, 0x31, 0x30, 0x25, 0x62, 0x9b, 0xa4, 0xea, 0x9b, 0x95, - 0x0b, 0x23, 0xdb, 0xb3, 0xb5, 0xfb, 0x02, 0xc6, 0x37, 0x4a, 0x34, 0x0f, 0x61, 0x2b, 0x8a, 0x68, - 0xe0, 0x31, 0x58, 0xf2, 0x1d, 0x8d, 0x21, 0x29, 0x3b, 0xba, 0x07, 0x23, 0x51, 0x3e, 0x37, 0x4f, - 0x9d, 0x90, 0x83, 0x54, 0x48, 0x67, 0x4d, 0x3c, 0x60, 0x29, 0xdd, 0x8e, 0x32, 0xd4, 0x70, 0x13, - 0x2c, 0x9b, 0xba, 0x85, 0x08, 0xd6, 0x46, 0xfb, 0xa4, 0x6f, 0x5b, 0x9a, 0xc7, 0x0b, 0xa8, 0xda, - 0x59, 0x17, 0x04, 0xcb, 0xbd, 0x74, 0x37, 0xca, 0xe2, 0xe1, 0x36, 0x58, 0x0d, 0xcf, 0xd9, 0x1f, - 0xe8, 0x1e, 0xb5, 0xdd, 0xd1, 0xb6, 0x6e, 0xea, 0xb4, 0x3e, 0xcb, 0x79, 0xea, 0xe3, 0x93, 0xe6, - 0x2a, 0x92, 0xf4, 0x23, 0x69, 0x54, 0xeb, 0x37, 0xb3, 0x60, 0x39, 0x73, 0x1a, 0xc0, 0x07, 0x60, - 0xad, 0xef, 0xbb, 0x2e, 0xb1, 0xe8, 0x8e, 0x6f, 0x1e, 0x12, 0x77, 0xbf, 0x7f, 0x44, 0x34, 0xdf, - 0x20, 0x1a, 0x5f, 0xd1, 0x6a, 0xa7, 0x21, 0x72, 0x5d, 0xeb, 0x4a, 0x51, 0xa8, 0x20, 0x1a, 0xfe, - 0x10, 0x40, 0x8b, 0x37, 0xf5, 0x74, 0xcf, 0x8b, 0x38, 0x4b, 0x9c, 0x33, 0xda, 0x80, 0x3b, 0x39, - 0x04, 0x92, 0x44, 0xb1, 0x1c, 0x35, 0xe2, 0xe9, 0x2e, 0xd1, 0xb2, 0x39, 0x96, 0xd3, 0x39, 0x6e, - 0x49, 0x51, 0xa8, 0x20, 0x1a, 0xbe, 0x0a, 0x16, 0x82, 0xa7, 0xf1, 0x39, 0x17, 0x8b, 0xb3, 0x22, - 0xc8, 0x16, 0x76, 0xe2, 0x2e, 0x94, 0xc4, 0xb1, 0xa1, 0xd9, 0x87, 0x1e, 0x71, 0x87, 0x44, 0x7b, - 0x33, 0xf0, 0x00, 0x4c, 0x28, 0xab, 0x5c, 0x28, 0xa3, 0xa1, 0xed, 0xe6, 0x10, 0x48, 0x12, 0xc5, - 0x86, 0x16, 0x54, 0x4d, 0x6e, 0x68, 0xb3, 0xe9, 0xa1, 0x1d, 0x48, 0x51, 0xa8, 0x20, 0x9a, 0xd5, - 0x5e, 0x90, 0xf2, 0xe6, 0x10, 0xeb, 0x06, 0x3e, 0x34, 0x48, 0x7d, 0x2e, 0x5d, 0x7b, 0x3b, 0xe9, - 0x6e, 0x94, 0xc5, 0xc3, 0x37, 0xc1, 0x95, 0xa0, 0xe9, 0xc0, 0xc2, 0x11, 0x49, 0x8d, 0x93, 0x3c, - 0x27, 0x48, 0xae, 0xec, 0x64, 0x01, 0x28, 0x1f, 0x03, 0x5f, 0x07, 0x4b, 0x7d, 0xdb, 0x30, 0x78, - 0x3d, 0x76, 0x6d, 0xdf, 0xa2, 0xf5, 0x79, 0xce, 0x02, 0xd9, 0x1e, 0xea, 0xa6, 0x7a, 0x50, 0x06, - 0x09, 0x1f, 0x02, 0xd0, 0x0f, 0xe5, 0xc0, 0xab, 0x83, 0x62, 0xa1, 0xcf, 0xeb, 0x50, 0x2c, 0xc0, - 0x51, 0x93, 0x87, 0x12, 0x6c, 0xad, 0xf7, 0x14, 0xb0, 0x5e, 0xb0, 0xc7, 0xe1, 0xf7, 0x52, 0xaa, - 0x77, 0x33, 0xa3, 0x7a, 0xd7, 0x0a, 0xc2, 0x12, 0xd2, 0xd7, 0x07, 0x8b, 0xcc, 0x77, 0xe8, 0xd6, - 0x20, 0x80, 0x88, 0x13, 0xec, 0x25, 0x59, 0xee, 0x28, 0x09, 0x8c, 0x8f, 0xe1, 0x2b, 0xe3, 0x93, - 0xe6, 0x62, 0xaa, 0x0f, 0xa5, 0x39, 0x5b, 0xbf, 0x2c, 0x01, 0xb0, 0x45, 0x1c, 0xc3, 0x1e, 0x99, - 0xc4, 0xba, 0x08, 0xd7, 0xb2, 0x95, 0x72, 0x2d, 0x2d, 0xe9, 0x42, 0x44, 0xf9, 0x14, 0xda, 0x96, - 0xed, 0x8c, 0x6d, 0xf9, 0xc6, 0x04, 0x9e, 0xd3, 0x7d, 0xcb, 0x3f, 0xca, 0x60, 0x25, 0x06, 0xc7, - 0xc6, 0xe5, 0x5e, 0x6a, 0x09, 0x5f, 0xc8, 0x2c, 0xe1, 0xba, 0x24, 0xe4, 0x53, 0x73, 0x2e, 0xef, - 0x82, 0x25, 0xe6, 0x2b, 0x82, 0x55, 0xe3, 0xae, 0x65, 0xf6, 0xcc, 0xae, 0x25, 0x52, 0x9d, 0xed, - 0x14, 0x13, 0xca, 0x30, 0x17, 0xb8, 0xa4, 0xb9, 0xcf, 0xa3, 0x4b, 0xfa, 0x83, 0x02, 0x96, 0xe2, - 0x65, 0xba, 0x00, 0x9b, 0xd4, 0x4d, 0xdb, 0xa4, 0xc6, 0xe9, 0x75, 0x59, 0xe0, 0x93, 0xfe, 0x5e, - 0x49, 0x66, 0xcd, 0x8d, 0xd2, 0x06, 0x7b, 0xa1, 0x72, 0x0c, 0xbd, 0x8f, 0x3d, 0x21, 0xab, 0x97, - 0x82, 0x97, 0xa9, 0xa0, 0x0d, 0x45, 0xbd, 0x29, 0x4b, 0x55, 0xfa, 0x74, 0x2d, 0x55, 0xf9, 0x93, - 0xb1, 0x54, 0xf7, 0x41, 0xcd, 0x0b, 0xcd, 0x54, 0x85, 0x53, 0xde, 0x98, 0xb4, 0x9d, 0x85, 0x8f, - 0x8a, 0x58, 0x23, 0x07, 0x15, 0x31, 0xc9, 0xbc, 0x53, 0xf5, 0xb3, 0xf4, 0x4e, 0xac, 0xbc, 0x1d, - 0xec, 0x7b, 0x44, 0xe3, 0x5b, 0xa9, 0x16, 0x97, 0xf7, 0x1e, 0x6f, 0x45, 0xa2, 0x17, 0x1e, 0x80, - 0x75, 0xc7, 0xb5, 0x07, 0x2e, 0xf1, 0xbc, 0x2d, 0x82, 0x35, 0x43, 0xb7, 0x48, 0x38, 0x80, 0x40, - 0xf5, 0xae, 0x8d, 0x4f, 0x9a, 0xeb, 0x7b, 0x72, 0x08, 0x2a, 0x8a, 0x6d, 0xfd, 0xb9, 0x02, 0x2e, - 0x67, 0x4f, 0xc4, 0x02, 0x23, 0xa2, 0x9c, 0xcb, 0x88, 0xbc, 0x9c, 0x28, 0xd1, 0xc0, 0xa5, 0x25, - 0xde, 0xf9, 0x73, 0x65, 0xba, 0x09, 0x96, 0x85, 0xf1, 0x08, 0x3b, 0x85, 0x15, 0x8b, 0x96, 0xe7, - 0x20, 0xdd, 0x8d, 0xb2, 0x78, 0x78, 0x0f, 0x2c, 0xba, 0xdc, 0x5b, 0x85, 0x04, 0x81, 0x3f, 0xf9, - 0x8a, 0x20, 0x58, 0x44, 0xc9, 0x4e, 0x94, 0xc6, 0x32, 0x6f, 0x12, 0x5b, 0x8e, 0x90, 0xa0, 0x92, - 0xf6, 0x26, 0x9b, 0x59, 0x00, 0xca, 0xc7, 0xc0, 0x1e, 0x58, 0xf1, 0xad, 0x3c, 0x55, 0x50, 0x6b, - 0xd7, 0x04, 0xd5, 0xca, 0x41, 0x1e, 0x82, 0x64, 0x71, 0xf0, 0xc7, 0x29, 0xbb, 0x32, 0xcb, 0x4f, - 0x91, 0x17, 0x4e, 0xdf, 0x0e, 0x53, 0xfb, 0x15, 0x89, 0x8f, 0xaa, 0x4d, 0xeb, 0xa3, 0x5a, 0x7f, - 0x52, 0x00, 0xcc, 0x6f, 0xc1, 0x89, 0x2f, 0xf7, 0xb9, 0x88, 0x84, 0x44, 0x6a, 0x72, 0x87, 0x73, - 0x73, 0xb2, 0xc3, 0x89, 0x4f, 0xd0, 0xe9, 0x2c, 0x8e, 0x98, 0xde, 0x8b, 0xb9, 0x98, 0x99, 0xc2, - 0xe2, 0xc4, 0xf9, 0x3c, 0x9b, 0xc5, 0x49, 0xf0, 0x9c, 0x6e, 0x71, 0xfe, 0x5d, 0x02, 0x2b, 0x31, - 0x78, 0x6a, 0x8b, 0x23, 0x09, 0xf9, 0xf2, 0x72, 0x66, 0x3a, 0xdb, 0x11, 0x4f, 0xdd, 0xff, 0x89, - 0xed, 0x88, 0x13, 0x2a, 0xb0, 0x1d, 0xbf, 0x2b, 0x25, 0xb3, 0x3e, 0xa3, 0xed, 0xf8, 0x04, 0xae, - 0x2a, 0x3e, 0x77, 0xce, 0xa5, 0xf5, 0x97, 0x32, 0xb8, 0x9c, 0xdd, 0x82, 0x29, 0x1d, 0x54, 0x26, - 0xea, 0xe0, 0x1e, 0x58, 0x7d, 0xe4, 0x1b, 0xc6, 0x88, 0x8f, 0x21, 0x21, 0x86, 0x81, 0x82, 0x7e, - 0x55, 0x44, 0xae, 0x7e, 0x5f, 0x82, 0x41, 0xd2, 0xc8, 0xbc, 0x2c, 0x56, 0x9e, 0x55, 0x16, 0xab, - 0xe7, 0x90, 0x45, 0xb9, 0xb3, 0x28, 0x9f, 0xcb, 0x59, 0x4c, 0xad, 0x89, 0x92, 0xe3, 0x6a, 0xe2, - 0x3b, 0xfc, 0xaf, 0x15, 0xb0, 0x26, 0x7f, 0x7d, 0x86, 0x06, 0x58, 0x32, 0xf1, 0xe3, 0xe4, 0xe5, - 0xc5, 0x24, 0xc1, 0xf0, 0xa9, 0x6e, 0xa8, 0xc1, 0xd7, 0x1d, 0xf5, 0x2d, 0x8b, 0xee, 0xba, 0xfb, - 0xd4, 0xd5, 0xad, 0x41, 0x20, 0xb0, 0xbd, 0x14, 0x17, 0xca, 0x70, 0xb7, 0x3e, 0x54, 0xc0, 0x7a, - 0x81, 0xca, 0x5d, 0x6c, 0x26, 0xf0, 0x21, 0xa8, 0x99, 0xf8, 0xf1, 0xbe, 0xef, 0x0e, 0x42, 0x49, - 0x3e, 0xfb, 0x73, 0xf8, 0x2e, 0xec, 0x09, 0x16, 0x14, 0xf1, 0xb5, 0x76, 0xc1, 0xf5, 0xd4, 0x20, - 0xd9, 0xa6, 0x21, 0x8f, 0x7c, 0x83, 0xef, 0x1f, 0xe1, 0x29, 0x6e, 0x82, 0x79, 0x07, 0xbb, 0x54, - 0x8f, 0xcc, 0x68, 0xb5, 0xb3, 0x38, 0x3e, 0x69, 0xce, 0xef, 0x85, 0x8d, 0x28, 0xee, 0x6f, 0xfd, - 0xaa, 0x04, 0x16, 0x12, 0x24, 0x17, 0xa0, 0xef, 0x6f, 0xa4, 0xf4, 0x5d, 0xfa, 0xc5, 0x24, 0x39, - 0xaa, 0x22, 0x81, 0xef, 0x65, 0x04, 0xfe, 0x9b, 0x93, 0x88, 0x4e, 0x57, 0xf8, 0x8f, 0x4a, 0x60, - 0x35, 0x81, 0x8e, 0x25, 0xfe, 0x3b, 0x29, 0x89, 0xdf, 0xc8, 0x48, 0x7c, 0x5d, 0x16, 0xf3, 0xa5, - 0xc6, 0x4f, 0xd6, 0xf8, 0x3f, 0x2a, 0x60, 0x39, 0x31, 0x77, 0x17, 0x20, 0xf2, 0x5b, 0x69, 0x91, - 0x6f, 0x4e, 0xa8, 0x97, 0x02, 0x95, 0x7f, 0x52, 0x4d, 0xe5, 0xfd, 0x85, 0xbf, 0x5d, 0xf8, 0x39, - 0x58, 0x1d, 0xda, 0x86, 0x6f, 0x92, 0xae, 0x81, 0x75, 0x33, 0x04, 0x30, 0x55, 0x64, 0x93, 0xf8, - 0xa2, 0x94, 0x9e, 0xb8, 0x9e, 0xee, 0x51, 0x62, 0xd1, 0x07, 0x71, 0x64, 0xac, 0xc5, 0x0f, 0x24, - 0x74, 0x48, 0xfa, 0x10, 0xf8, 0x2a, 0x58, 0x60, 0x6a, 0xa6, 0xf7, 0xc9, 0x0e, 0x36, 0xc3, 0x9a, - 0x8a, 0xbe, 0x0f, 0xec, 0xc7, 0x5d, 0x28, 0x89, 0x83, 0x47, 0x60, 0xc5, 0xb1, 0xb5, 0x1e, 0xb6, - 0xf0, 0x80, 0xb0, 0xf3, 0x7f, 0xcf, 0x36, 0xf4, 0xfe, 0x88, 0xdf, 0x3b, 0xcc, 0x77, 0x5e, 0x0b, - 0xdf, 0x29, 0xf7, 0xf2, 0x10, 0xe6, 0xd9, 0x25, 0xcd, 0x7c, 0x3f, 0xcb, 0x28, 0xa1, 0x99, 0xfb, - 0x9c, 0x35, 0x97, 0xfb, 0x1f, 0x00, 0x59, 0x71, 0x9d, 0xf3, 0x83, 0x56, 0xd1, 0x8d, 0x4a, 0xed, - 0x5c, 0x5f, 0xa3, 0x3e, 0xaa, 0x80, 0x2b, 0xb9, 0x03, 0xf2, 0x33, 0xbc, 0xd3, 0xc8, 0x39, 0xaf, - 0xf2, 0x19, 0x9c, 0xd7, 0x26, 0x58, 0x16, 0x1f, 0xc2, 0x32, 0xc6, 0x2d, 0x32, 0xd0, 0xdd, 0x74, - 0x37, 0xca, 0xe2, 0x65, 0x77, 0x2a, 0xd5, 0x33, 0xde, 0xa9, 0x24, 0xb3, 0x10, 0xff, 0xbf, 0x11, - 0x54, 0x5d, 0x3e, 0x0b, 0xf1, 0x6f, 0x1c, 0x59, 0x3c, 0xfc, 0x6e, 0x58, 0x52, 0x11, 0xc3, 0x1c, - 0x67, 0xc8, 0xd4, 0x48, 0x44, 0x90, 0x41, 0x3f, 0xd3, 0xc7, 0x9e, 0x77, 0x24, 0x1f, 0x7b, 0x36, - 0x26, 0x94, 0xf2, 0xf4, 0x56, 0xf1, 0x6f, 0x0a, 0x78, 0xae, 0x70, 0x0f, 0xc0, 0xcd, 0x94, 0xce, - 0xde, 0xca, 0xe8, 0xec, 0xf3, 0x85, 0x81, 0x09, 0xb1, 0x35, 0xe5, 0x17, 0x22, 0x77, 0x27, 0x5e, - 0x88, 0x48, 0x5c, 0xd4, 0xe4, 0x9b, 0x91, 0xce, 0xc6, 0x93, 0xa7, 0x8d, 0x99, 0xf7, 0x9f, 0x36, - 0x66, 0x3e, 0x78, 0xda, 0x98, 0xf9, 0xc5, 0xb8, 0xa1, 0x3c, 0x19, 0x37, 0x94, 0xf7, 0xc7, 0x0d, - 0xe5, 0x83, 0x71, 0x43, 0xf9, 0xe7, 0xb8, 0xa1, 0xfc, 0xf6, 0xc3, 0xc6, 0xcc, 0xc3, 0xd2, 0xf0, - 0xf6, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0x59, 0xb3, 0x11, 0xc0, 0x12, 0x26, 0x00, 0x00, + 0x61, 0x47, 0x5c, 0x10, 0x12, 0x37, 0x0e, 0xfc, 0x27, 0x08, 0x21, 0xb8, 0xa1, 0x08, 0x71, 0xd9, + 0x0b, 0x52, 0xc4, 0x85, 0x9c, 0x2c, 0x76, 0x72, 0x42, 0x28, 0x47, 0x2e, 0xb9, 0x80, 0xaa, 0xba, + 0xfa, 0xbb, 0xda, 0x33, 0xf6, 0x26, 0xce, 0x87, 0x72, 0xf3, 0x54, 0xfd, 0xde, 0xaf, 0xde, 0xab, + 0x7a, 0x55, 0xef, 0xd7, 0x55, 0x06, 0xf7, 0x8e, 0xbf, 0xeb, 0xa9, 0xba, 0xdd, 0x3e, 0xf6, 0x0f, + 0x89, 0x6b, 0x11, 0x4a, 0xbc, 0xf6, 0x90, 0x58, 0x9a, 0xed, 0xb6, 0x45, 0x07, 0x76, 0xf4, 0x36, + 0x76, 0x1c, 0xaf, 0x3d, 0xbc, 0xdd, 0x1e, 0x10, 0x8b, 0xb8, 0x98, 0x12, 0x4d, 0x75, 0x5c, 0x9b, + 0xda, 0x10, 0x06, 0x18, 0x15, 0x3b, 0xba, 0xca, 0x30, 0xea, 0xf0, 0xf6, 0xd5, 0x5b, 0x03, 0x9d, + 0x1e, 0xf9, 0x87, 0x6a, 0xdf, 0x36, 0xdb, 0x03, 0x7b, 0x60, 0xb7, 0x39, 0xf4, 0xd0, 0x7f, 0xc4, + 0x7f, 0xf1, 0x1f, 0xfc, 0xaf, 0x80, 0xe2, 0x6a, 0x2b, 0x31, 0x4c, 0xdf, 0x76, 0x89, 0x64, 0x98, + 0xab, 0x77, 0x63, 0x8c, 0x89, 0xfb, 0x47, 0xba, 0x45, 0xdc, 0x51, 0xdb, 0x39, 0x1e, 0xb0, 0x06, + 0xaf, 0x6d, 0x12, 0x8a, 0x65, 0x56, 0xed, 0x22, 0x2b, 0xd7, 0xb7, 0xa8, 0x6e, 0x92, 0x9c, 0xc1, + 0x6b, 0x93, 0x0c, 0xbc, 0xfe, 0x11, 0x31, 0x71, 0xce, 0xee, 0x95, 0x22, 0x3b, 0x9f, 0xea, 0x46, + 0x5b, 0xb7, 0xa8, 0x47, 0xdd, 0xac, 0x51, 0xeb, 0xbf, 0x0a, 0x80, 0x5d, 0xdb, 0xa2, 0xae, 0x6d, + 0x18, 0xc4, 0x45, 0x64, 0xa8, 0x7b, 0xba, 0x6d, 0xc1, 0x9f, 0x83, 0x1a, 0x8b, 0x47, 0xc3, 0x14, + 0xd7, 0x95, 0xeb, 0xca, 0xc6, 0xc2, 0x9d, 0xef, 0xa8, 0xf1, 0x24, 0x47, 0xf4, 0xaa, 0x73, 0x3c, + 0x60, 0x0d, 0x9e, 0xca, 0xd0, 0xea, 0xf0, 0xb6, 0xba, 0x7b, 0xf8, 0x2e, 0xe9, 0xd3, 0x1e, 0xa1, + 0xb8, 0x03, 0x9f, 0x9c, 0x34, 0x67, 0xc6, 0x27, 0x4d, 0x10, 0xb7, 0xa1, 0x88, 0x15, 0xee, 0x82, + 0x0a, 0x67, 0x2f, 0x71, 0xf6, 0x5b, 0x85, 0xec, 0x22, 0x68, 0x15, 0xe1, 0x5f, 0xbc, 0xf1, 0x98, + 0x12, 0x8b, 0xb9, 0xd7, 0xb9, 0x24, 0xa8, 0x2b, 0x5b, 0x98, 0x62, 0xc4, 0x89, 0xe0, 0xcb, 0xa0, + 0xe6, 0x0a, 0xf7, 0xeb, 0xe5, 0xeb, 0xca, 0x46, 0xb9, 0x73, 0x59, 0xa0, 0x6a, 0x61, 0x58, 0x28, + 0x42, 0xb4, 0xfe, 0xa6, 0x80, 0xb5, 0x7c, 0xdc, 0xdb, 0xba, 0x47, 0xe1, 0x3b, 0xb9, 0xd8, 0xd5, + 0xe9, 0x62, 0x67, 0xd6, 0x3c, 0xf2, 0x68, 0xe0, 0xb0, 0x25, 0x11, 0xf7, 0xdb, 0xa0, 0xaa, 0x53, + 0x62, 0x7a, 0xf5, 0xd2, 0xf5, 0xf2, 0xc6, 0xc2, 0x9d, 0x1b, 0x6a, 0x3e, 0x77, 0xd5, 0xbc, 0x63, + 0x9d, 0x45, 0x41, 0x59, 0x7d, 0x8b, 0x19, 0xa3, 0x80, 0xa3, 0xf5, 0x3f, 0x05, 0xcc, 0x6f, 0x61, + 0x62, 0xda, 0xd6, 0x3e, 0xa1, 0x17, 0xb0, 0x68, 0x5d, 0x50, 0xf1, 0x1c, 0xd2, 0x17, 0x8b, 0xf6, + 0x0d, 0x99, 0xef, 0x91, 0x3b, 0xfb, 0x0e, 0xe9, 0xc7, 0x0b, 0xc5, 0x7e, 0x21, 0x6e, 0x0c, 0xdf, + 0x06, 0xb3, 0x1e, 0xc5, 0xd4, 0xf7, 0xf8, 0x32, 0x2d, 0xdc, 0xf9, 0xe6, 0xe9, 0x34, 0x1c, 0xda, + 0x59, 0x12, 0x44, 0xb3, 0xc1, 0x6f, 0x24, 0x28, 0x5a, 0xff, 0x2e, 0x01, 0x18, 0x61, 0xbb, 0xb6, + 0xa5, 0xe9, 0x94, 0xe5, 0xef, 0xeb, 0xa0, 0x42, 0x47, 0x0e, 0xe1, 0xd3, 0x30, 0xdf, 0xb9, 0x11, + 0x7a, 0x71, 0x7f, 0xe4, 0x90, 0x8f, 0x4f, 0x9a, 0x6b, 0x79, 0x0b, 0xd6, 0x83, 0xb8, 0x0d, 0xdc, + 0x8e, 0xfc, 0x2b, 0x71, 0xeb, 0xbb, 0xe9, 0xa1, 0x3f, 0x3e, 0x69, 0x4a, 0x0e, 0x0b, 0x35, 0x62, + 0x4a, 0x3b, 0x08, 0x87, 0x00, 0x1a, 0xd8, 0xa3, 0xf7, 0x5d, 0x6c, 0x79, 0xc1, 0x48, 0xba, 0x49, + 0x44, 0xe4, 0x2f, 0x4d, 0xb7, 0x3c, 0xcc, 0xa2, 0x73, 0x55, 0x78, 0x01, 0xb7, 0x73, 0x6c, 0x48, + 0x32, 0x02, 0xbc, 0x01, 0x66, 0x5d, 0x82, 0x3d, 0xdb, 0xaa, 0x57, 0x78, 0x14, 0xd1, 0x04, 0x22, + 0xde, 0x8a, 0x44, 0x2f, 0x7c, 0x11, 0xcc, 0x99, 0xc4, 0xf3, 0xf0, 0x80, 0xd4, 0xab, 0x1c, 0xb8, + 0x2c, 0x80, 0x73, 0xbd, 0xa0, 0x19, 0x85, 0xfd, 0xad, 0x3f, 0x28, 0x60, 0x31, 0x9a, 0xb9, 0x0b, + 0xd8, 0x2a, 0x9d, 0xf4, 0x56, 0x79, 0xfe, 0xd4, 0x3c, 0x29, 0xd8, 0x21, 0xef, 0x95, 0x13, 0x3e, + 0xb3, 0x24, 0x84, 0x3f, 0x03, 0x35, 0x8f, 0x18, 0xa4, 0x4f, 0x6d, 0x57, 0xf8, 0xfc, 0xca, 0x94, + 0x3e, 0xe3, 0x43, 0x62, 0xec, 0x0b, 0xd3, 0xce, 0x25, 0xe6, 0x74, 0xf8, 0x0b, 0x45, 0x94, 0xf0, + 0x27, 0xa0, 0x46, 0x89, 0xe9, 0x18, 0x98, 0x12, 0xb1, 0x4d, 0x52, 0xf9, 0xcd, 0xd2, 0x85, 0x91, + 0xed, 0xd9, 0xda, 0x7d, 0x01, 0xe3, 0x1b, 0x25, 0x9a, 0x87, 0xb0, 0x15, 0x45, 0x34, 0xf0, 0x18, + 0x2c, 0xf9, 0x8e, 0xc6, 0x90, 0x94, 0x1d, 0xdd, 0x83, 0x91, 0x48, 0x9f, 0x9b, 0xa7, 0x4e, 0xc8, + 0x41, 0xca, 0xa4, 0xb3, 0x26, 0x06, 0x58, 0x4a, 0xb7, 0xa3, 0x0c, 0x35, 0xdc, 0x04, 0xcb, 0xa6, + 0x6e, 0x21, 0x82, 0xb5, 0xd1, 0x3e, 0xe9, 0xdb, 0x96, 0xe6, 0xf1, 0x04, 0xaa, 0x76, 0xd6, 0x05, + 0xc1, 0x72, 0x2f, 0xdd, 0x8d, 0xb2, 0x78, 0xb8, 0x0d, 0x56, 0xc3, 0x73, 0xf6, 0x47, 0xba, 0x47, + 0x6d, 0x77, 0xb4, 0xad, 0x9b, 0x3a, 0xad, 0xcf, 0x72, 0x9e, 0xfa, 0xf8, 0xa4, 0xb9, 0x8a, 0x24, + 0xfd, 0x48, 0x6a, 0xd5, 0xfa, 0xed, 0x2c, 0x58, 0xce, 0x9c, 0x06, 0xf0, 0x01, 0x58, 0xeb, 0xfb, + 0xae, 0x4b, 0x2c, 0xba, 0xe3, 0x9b, 0x87, 0xc4, 0xdd, 0xef, 0x1f, 0x11, 0xcd, 0x37, 0x88, 0xc6, + 0x57, 0xb4, 0xda, 0x69, 0x08, 0x5f, 0xd7, 0xba, 0x52, 0x14, 0x2a, 0xb0, 0x86, 0x3f, 0x06, 0xd0, + 0xe2, 0x4d, 0x3d, 0xdd, 0xf3, 0x22, 0xce, 0x12, 0xe7, 0x8c, 0x36, 0xe0, 0x4e, 0x0e, 0x81, 0x24, + 0x56, 0xcc, 0x47, 0x8d, 0x78, 0xba, 0x4b, 0xb4, 0xac, 0x8f, 0xe5, 0xb4, 0x8f, 0x5b, 0x52, 0x14, + 0x2a, 0xb0, 0x86, 0xaf, 0x82, 0x85, 0x60, 0x34, 0x3e, 0xe7, 0x62, 0x71, 0x56, 0x04, 0xd9, 0xc2, + 0x4e, 0xdc, 0x85, 0x92, 0x38, 0x16, 0x9a, 0x7d, 0xe8, 0x11, 0x77, 0x48, 0xb4, 0x37, 0x03, 0x0d, + 0xc0, 0x0a, 0x65, 0x95, 0x17, 0xca, 0x28, 0xb4, 0xdd, 0x1c, 0x02, 0x49, 0xac, 0x58, 0x68, 0x41, + 0xd6, 0xe4, 0x42, 0x9b, 0x4d, 0x87, 0x76, 0x20, 0x45, 0xa1, 0x02, 0x6b, 0x96, 0x7b, 0x81, 0xcb, + 0x9b, 0x43, 0xac, 0x1b, 0xf8, 0xd0, 0x20, 0xf5, 0xb9, 0x74, 0xee, 0xed, 0xa4, 0xbb, 0x51, 0x16, + 0x0f, 0xdf, 0x04, 0x57, 0x82, 0xa6, 0x03, 0x0b, 0x47, 0x24, 0x35, 0x4e, 0xf2, 0x9c, 0x20, 0xb9, + 0xb2, 0x93, 0x05, 0xa0, 0xbc, 0x0d, 0x7c, 0x1d, 0x2c, 0xf5, 0x6d, 0xc3, 0xe0, 0xf9, 0xd8, 0xb5, + 0x7d, 0x8b, 0xd6, 0xe7, 0x39, 0x0b, 0x64, 0x7b, 0xa8, 0x9b, 0xea, 0x41, 0x19, 0x24, 0x7c, 0x08, + 0x40, 0x3f, 0x2c, 0x07, 0x5e, 0x1d, 0x14, 0x17, 0xfa, 0x7c, 0x1d, 0x8a, 0x0b, 0x70, 0xd4, 0xe4, + 0xa1, 0x04, 0x5b, 0xeb, 0x3d, 0x05, 0xac, 0x17, 0xec, 0x71, 0xf8, 0x83, 0x54, 0xd5, 0xbb, 0x99, + 0xa9, 0x7a, 0xd7, 0x0a, 0xcc, 0x12, 0xa5, 0xaf, 0x0f, 0x16, 0x99, 0xee, 0xd0, 0xad, 0x41, 0x00, + 0x11, 0x27, 0xd8, 0x4b, 0x32, 0xdf, 0x51, 0x12, 0x18, 0x1f, 0xc3, 0x57, 0xc6, 0x27, 0xcd, 0xc5, + 0x54, 0x1f, 0x4a, 0x73, 0xb6, 0x7e, 0x5d, 0x02, 0x60, 0x8b, 0x38, 0x86, 0x3d, 0x32, 0x89, 0x75, + 0x11, 0xaa, 0x65, 0x2b, 0xa5, 0x5a, 0x5a, 0xd2, 0x85, 0x88, 0xfc, 0x29, 0x94, 0x2d, 0xdb, 0x19, + 0xd9, 0xf2, 0xad, 0x09, 0x3c, 0xa7, 0xeb, 0x96, 0x7f, 0x96, 0xc1, 0x4a, 0x0c, 0x8e, 0x85, 0xcb, + 0xbd, 0xd4, 0x12, 0xbe, 0x90, 0x59, 0xc2, 0x75, 0x89, 0xc9, 0xa7, 0xa6, 0x5c, 0xde, 0x05, 0x4b, + 0x4c, 0x57, 0x04, 0xab, 0xc6, 0x55, 0xcb, 0xec, 0x99, 0x55, 0x4b, 0x54, 0x75, 0xb6, 0x53, 0x4c, + 0x28, 0xc3, 0x5c, 0xa0, 0x92, 0xe6, 0xbe, 0x88, 0x2a, 0xe9, 0x8f, 0x0a, 0x58, 0x8a, 0x97, 0xe9, + 0x02, 0x64, 0x52, 0x37, 0x2d, 0x93, 0x1a, 0xa7, 0xe7, 0x65, 0x81, 0x4e, 0xfa, 0x47, 0x25, 0xe9, + 0x35, 0x17, 0x4a, 0x1b, 0xec, 0x83, 0xca, 0x31, 0xf4, 0x3e, 0xf6, 0x44, 0x59, 0xbd, 0x14, 0x7c, + 0x4c, 0x05, 0x6d, 0x28, 0xea, 0x4d, 0x49, 0xaa, 0xd2, 0xa7, 0x2b, 0xa9, 0xca, 0x9f, 0x8c, 0xa4, + 0xba, 0x0f, 0x6a, 0x5e, 0x28, 0xa6, 0x2a, 0x9c, 0xf2, 0xc6, 0xa4, 0xed, 0x2c, 0x74, 0x54, 0xc4, + 0x1a, 0x29, 0xa8, 0x88, 0x49, 0xa6, 0x9d, 0xaa, 0x9f, 0xa5, 0x76, 0x62, 0xe9, 0xed, 0x60, 0xdf, + 0x23, 0x1a, 0xdf, 0x4a, 0xb5, 0x38, 0xbd, 0xf7, 0x78, 0x2b, 0x12, 0xbd, 0xf0, 0x00, 0xac, 0x3b, + 0xae, 0x3d, 0x70, 0x89, 0xe7, 0x6d, 0x11, 0xac, 0x19, 0xba, 0x45, 0xc2, 0x00, 0x82, 0xaa, 0x77, + 0x6d, 0x7c, 0xd2, 0x5c, 0xdf, 0x93, 0x43, 0x50, 0x91, 0x6d, 0xeb, 0x2f, 0x15, 0x70, 0x39, 0x7b, + 0x22, 0x16, 0x08, 0x11, 0xe5, 0x5c, 0x42, 0xe4, 0xe5, 0x44, 0x8a, 0x06, 0x2a, 0x2d, 0xf1, 0xcd, + 0x9f, 0x4b, 0xd3, 0x4d, 0xb0, 0x2c, 0x84, 0x47, 0xd8, 0x29, 0xa4, 0x58, 0xb4, 0x3c, 0x07, 0xe9, + 0x6e, 0x94, 0xc5, 0xc3, 0x7b, 0x60, 0xd1, 0xe5, 0xda, 0x2a, 0x24, 0x08, 0xf4, 0xc9, 0xd7, 0x04, + 0xc1, 0x22, 0x4a, 0x76, 0xa2, 0x34, 0x96, 0x69, 0x93, 0x58, 0x72, 0x84, 0x04, 0x95, 0xb4, 0x36, + 0xd9, 0xcc, 0x02, 0x50, 0xde, 0x06, 0xf6, 0xc0, 0x8a, 0x6f, 0xe5, 0xa9, 0x82, 0x5c, 0xbb, 0x26, + 0xa8, 0x56, 0x0e, 0xf2, 0x10, 0x24, 0xb3, 0x83, 0x3f, 0x4d, 0xc9, 0x95, 0x59, 0x7e, 0x8a, 0xbc, + 0x70, 0xfa, 0x76, 0x98, 0x5a, 0xaf, 0x48, 0x74, 0x54, 0x6d, 0x5a, 0x1d, 0xd5, 0xfa, 0xb3, 0x02, + 0x60, 0x7e, 0x0b, 0x4e, 0xfc, 0xb8, 0xcf, 0x59, 0x24, 0x4a, 0xa4, 0x26, 0x57, 0x38, 0x37, 0x27, + 0x2b, 0x9c, 0xf8, 0x04, 0x9d, 0x4e, 0xe2, 0x88, 0xe9, 0xbd, 0x98, 0x8b, 0x99, 0x29, 0x24, 0x4e, + 0xec, 0xcf, 0xb3, 0x49, 0x9c, 0x04, 0xcf, 0xe9, 0x12, 0xe7, 0x3f, 0x25, 0xb0, 0x12, 0x83, 0xa7, + 0x96, 0x38, 0x12, 0x93, 0xaf, 0x2e, 0x67, 0xa6, 0x93, 0x1d, 0xf1, 0xd4, 0x7d, 0x4e, 0x64, 0x47, + 0xec, 0x50, 0x81, 0xec, 0xf8, 0x7d, 0x29, 0xe9, 0xf5, 0x19, 0x65, 0xc7, 0x27, 0x70, 0x55, 0xf1, + 0x85, 0x53, 0x2e, 0xad, 0xbf, 0x96, 0xc1, 0xe5, 0xec, 0x16, 0x4c, 0xd5, 0x41, 0x65, 0x62, 0x1d, + 0xdc, 0x03, 0xab, 0x8f, 0x7c, 0xc3, 0x18, 0xf1, 0x18, 0x12, 0xc5, 0x30, 0xa8, 0xa0, 0x5f, 0x17, + 0x96, 0xab, 0x3f, 0x94, 0x60, 0x90, 0xd4, 0x32, 0x5f, 0x16, 0x2b, 0xcf, 0x5a, 0x16, 0xab, 0xe7, + 0x28, 0x8b, 0x72, 0x65, 0x51, 0x3e, 0x97, 0xb2, 0x98, 0xba, 0x26, 0x4a, 0x8e, 0xab, 0x89, 0xdf, + 0xf0, 0x63, 0x05, 0xac, 0xc9, 0x3f, 0x9f, 0xa1, 0x01, 0x96, 0x4c, 0xfc, 0x38, 0x79, 0x79, 0x31, + 0xa9, 0x60, 0xf8, 0x54, 0x37, 0xd4, 0xe0, 0x75, 0x47, 0x7d, 0xcb, 0xa2, 0xbb, 0xee, 0x3e, 0x75, + 0x75, 0x6b, 0x10, 0x14, 0xd8, 0x5e, 0x8a, 0x0b, 0x65, 0xb8, 0xe1, 0x43, 0x50, 0x33, 0xf1, 0xe3, + 0x7d, 0xdf, 0x1d, 0x84, 0x85, 0xf0, 0xec, 0xe3, 0xf0, 0xdc, 0xef, 0x09, 0x16, 0x14, 0xf1, 0xb5, + 0x3e, 0x54, 0xc0, 0x7a, 0x41, 0x05, 0xfd, 0x12, 0x45, 0xb9, 0x0b, 0xae, 0xa7, 0x82, 0x64, 0x1b, + 0x92, 0x3c, 0xf2, 0x0d, 0xbe, 0x37, 0x85, 0x5e, 0xb9, 0x09, 0xe6, 0x1d, 0xec, 0x52, 0x3d, 0x12, + 0xba, 0xd5, 0xce, 0xe2, 0xf8, 0xa4, 0x39, 0xbf, 0x17, 0x36, 0xa2, 0xb8, 0xbf, 0xf5, 0x9b, 0x12, + 0x58, 0x48, 0x90, 0x5c, 0x80, 0x76, 0x78, 0x23, 0xa5, 0x1d, 0xa4, 0xaf, 0x31, 0xc9, 0xa8, 0x8a, + 0xc4, 0x43, 0x2f, 0x23, 0x1e, 0xbe, 0x3d, 0x89, 0xe8, 0x74, 0xf5, 0xf0, 0x51, 0x09, 0xac, 0x26, + 0xd0, 0xb1, 0x7c, 0xf8, 0x5e, 0x4a, 0x3e, 0x6c, 0x64, 0xe4, 0x43, 0x5d, 0x66, 0xf3, 0x95, 0x7e, + 0x98, 0xac, 0x1f, 0xfe, 0xa4, 0x80, 0xe5, 0xc4, 0xdc, 0x5d, 0x80, 0x80, 0xd8, 0x4a, 0x0b, 0x88, + 0xe6, 0x84, 0x7c, 0x29, 0x50, 0x10, 0x4f, 0xaa, 0x29, 0xbf, 0xbf, 0xf4, 0x37, 0x17, 0xbf, 0x04, + 0xab, 0x43, 0xdb, 0xf0, 0x4d, 0xd2, 0x35, 0xb0, 0x6e, 0x86, 0x00, 0x56, 0x71, 0xd9, 0x24, 0xbe, + 0x28, 0xa5, 0x27, 0xae, 0xa7, 0x7b, 0x94, 0x58, 0xf4, 0x41, 0x6c, 0x19, 0xd7, 0xf9, 0x07, 0x12, + 0x3a, 0x24, 0x1d, 0x04, 0xbe, 0x0a, 0x16, 0x58, 0xa5, 0xd4, 0xfb, 0x64, 0x07, 0x9b, 0x61, 0x4e, + 0x45, 0x6f, 0x0f, 0xfb, 0x71, 0x17, 0x4a, 0xe2, 0xe0, 0x11, 0x58, 0x71, 0x6c, 0xad, 0x87, 0x2d, + 0x3c, 0x20, 0xec, 0xfc, 0xdf, 0xb3, 0x0d, 0xbd, 0x3f, 0xe2, 0x77, 0x1a, 0xf3, 0x9d, 0xd7, 0xc2, + 0xef, 0xd5, 0xbd, 0x3c, 0x84, 0x7d, 0x0f, 0x48, 0x9a, 0xf9, 0x7e, 0x96, 0x51, 0x42, 0x33, 0xf7, + 0x54, 0x36, 0x97, 0xfb, 0xff, 0x02, 0x59, 0x72, 0x9d, 0xf3, 0xb1, 0xac, 0xe8, 0xb6, 0xa6, 0x76, + 0xae, 0x97, 0xae, 0x8f, 0x2a, 0xe0, 0x4a, 0xee, 0x80, 0xfc, 0x0c, 0xef, 0x4b, 0x72, 0xaa, 0xae, + 0x7c, 0x06, 0x55, 0xb7, 0x09, 0x96, 0xc5, 0x23, 0x5b, 0x46, 0x14, 0x46, 0xe2, 0xbc, 0x9b, 0xee, + 0x46, 0x59, 0xbc, 0xec, 0xbe, 0xa6, 0x7a, 0xc6, 0xfb, 0x9a, 0xa4, 0x17, 0xe2, 0x7f, 0x43, 0x82, + 0xac, 0xcb, 0x7b, 0x21, 0xfe, 0x45, 0x24, 0x8b, 0x87, 0xdf, 0x0f, 0x53, 0x2a, 0x62, 0x98, 0xe3, + 0x0c, 0x99, 0x1c, 0x89, 0x08, 0x32, 0xe8, 0x67, 0x7a, 0x48, 0x7a, 0x47, 0xf2, 0x90, 0xb4, 0x31, + 0x21, 0x95, 0xa7, 0x97, 0xa1, 0x7f, 0x57, 0xc0, 0x73, 0x85, 0x7b, 0x00, 0x6e, 0xa6, 0xea, 0xec, + 0xad, 0x4c, 0x9d, 0x7d, 0xbe, 0xd0, 0x30, 0x51, 0x6c, 0x4d, 0xf9, 0x65, 0xcb, 0xdd, 0x89, 0x97, + 0x2d, 0x12, 0x15, 0x35, 0xf9, 0xd6, 0xa5, 0xb3, 0xf1, 0xe4, 0x69, 0x63, 0xe6, 0xfd, 0xa7, 0x8d, + 0x99, 0x0f, 0x9e, 0x36, 0x66, 0x7e, 0x35, 0x6e, 0x28, 0x4f, 0xc6, 0x0d, 0xe5, 0xfd, 0x71, 0x43, + 0xf9, 0x60, 0xdc, 0x50, 0xfe, 0x35, 0x6e, 0x28, 0xbf, 0xfb, 0xb0, 0x31, 0xf3, 0xb0, 0x34, 0xbc, + 0xfd, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xe6, 0xc9, 0x16, 0xd9, 0x6e, 0x26, 0x00, 0x00, } func (m *ControllerRevision) Marshal() (dAtA []byte, err error) { @@ -2035,6 +2035,18 @@ func (m *RollingUpdateDaemonSet) MarshalToSizedBuffer(dAtA []byte) (int, error) _ = i var l int _ = l + if m.MaxSurge != nil { + { + size, err := m.MaxSurge.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } if m.MaxUnavailable != nil { { size, err := m.MaxUnavailable.MarshalToSizedBuffer(dAtA[:i]) @@ -2849,6 +2861,10 @@ func (m *RollingUpdateDaemonSet) Size() (n int) { l = m.MaxUnavailable.Size() n += 1 + l + sovGenerated(uint64(l)) } + if m.MaxSurge != nil { + l = m.MaxSurge.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -3306,6 +3322,7 @@ func (this *RollingUpdateDaemonSet) String() string { } s := strings.Join([]string{`&RollingUpdateDaemonSet{`, `MaxUnavailable:` + strings.Replace(fmt.Sprintf("%v", this.MaxUnavailable), "IntOrString", "intstr.IntOrString", 1) + `,`, + `MaxSurge:` + strings.Replace(fmt.Sprintf("%v", this.MaxSurge), "IntOrString", "intstr.IntOrString", 1) + `,`, `}`, }, "") return s @@ -3557,10 +3574,7 @@ func (m *ControllerRevision) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3677,10 +3691,7 @@ func (m *ControllerRevisionList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3829,10 +3840,7 @@ func (m *DaemonSet) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4043,10 +4051,7 @@ func (m *DaemonSetCondition) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4163,10 +4168,7 @@ func (m *DaemonSetList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4357,10 +4359,7 @@ func (m *DaemonSetSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4616,10 +4615,7 @@ func (m *DaemonSetStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4737,10 +4733,7 @@ func (m *DaemonSetUpdateStrategy) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4889,10 +4882,7 @@ func (m *Deployment) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5136,10 +5126,7 @@ func (m *DeploymentCondition) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5256,10 +5243,7 @@ func (m *DeploymentList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5510,10 +5494,7 @@ func (m *DeploymentSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5731,10 +5712,7 @@ func (m *DeploymentStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5852,10 +5830,7 @@ func (m *DeploymentStrategy) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -6004,10 +5979,7 @@ func (m *ReplicaSet) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -6218,10 +6190,7 @@ func (m *ReplicaSetCondition) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -6338,10 +6307,7 @@ func (m *ReplicaSetList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -6499,10 +6465,7 @@ func (m *ReplicaSetSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -6681,10 +6644,7 @@ func (m *ReplicaSetStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -6764,16 +6724,49 @@ func (m *RollingUpdateDaemonSet) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MaxSurge", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.MaxSurge == nil { + m.MaxSurge = &intstr.IntOrString{} + } + if err := m.MaxSurge.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -6895,10 +6888,7 @@ func (m *RollingUpdateDeployment) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -6968,10 +6958,7 @@ func (m *RollingUpdateStatefulSetStrategy) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -7120,10 +7107,7 @@ func (m *StatefulSet) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -7334,10 +7318,7 @@ func (m *StatefulSetCondition) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -7454,10 +7435,7 @@ func (m *StatefulSetList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -7747,10 +7725,7 @@ func (m *StatefulSetSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -8013,10 +7988,7 @@ func (m *StatefulSetStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -8134,10 +8106,7 @@ func (m *StatefulSetUpdateStrategy) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/api/apps/v1/generated.proto b/vendor/k8s.io/api/apps/v1/generated.proto index 3ee640462d6c..d4689d88b51b 100644 --- a/vendor/k8s.io/api/apps/v1/generated.proto +++ b/vendor/k8s.io/api/apps/v1/generated.proto @@ -479,19 +479,41 @@ message RollingUpdateDaemonSet { // The maximum number of DaemonSet pods that can be unavailable during the // update. Value can be an absolute number (ex: 5) or a percentage of total // number of DaemonSet pods at the start of the update (ex: 10%). Absolute - // number is calculated from percentage by rounding up. - // This cannot be 0. + // number is calculated from percentage by rounding down to a minimum of one. + // This cannot be 0 if MaxSurge is 0 // Default value is 1. // Example: when this is set to 30%, at most 30% of the total number of nodes // that should be running the daemon pod (i.e. status.desiredNumberScheduled) - // can have their pods stopped for an update at any given - // time. The update starts by stopping at most 30% of those DaemonSet pods - // and then brings up new DaemonSet pods in their place. Once the new pods - // are available, it then proceeds onto other DaemonSet pods, thus ensuring - // that at least 70% of original number of DaemonSet pods are available at - // all times during the update. + // can have their pods stopped for an update at any given time. The update + // starts by stopping at most 30% of those DaemonSet pods and then brings + // up new DaemonSet pods in their place. Once the new pods are available, + // it then proceeds onto other DaemonSet pods, thus ensuring that at least + // 70% of original number of DaemonSet pods are available at all times during + // the update. // +optional optional k8s.io.apimachinery.pkg.util.intstr.IntOrString maxUnavailable = 1; + + // The maximum number of nodes with an existing available DaemonSet pod that + // can have an updated DaemonSet pod during during an update. + // Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). + // This can not be 0 if MaxUnavailable is 0. + // Absolute number is calculated from percentage by rounding up to a minimum of 1. + // Default value is 0. + // Example: when this is set to 30%, at most 30% of the total number of nodes + // that should be running the daemon pod (i.e. status.desiredNumberScheduled) + // can have their a new pod created before the old pod is marked as deleted. + // The update starts by launching new pods on 30% of nodes. Once an updated + // pod is available (Ready for at least minReadySeconds) the old DaemonSet pod + // on that node is marked deleted. If the old pod becomes unavailable for any + // reason (Ready transitions to false, is evicted, or is drained) an updated + // pod is immediatedly created on that node without considering surge limits. + // Allowing surge implies the possibility that the resources consumed by the + // daemonset on any given node can double if the readiness check fails, and + // so resource intensive daemonsets should take into account that they may + // cause evictions during disruption. + // This is an alpha field and requires enabling DaemonSetUpdateSurge feature gate. + // +optional + optional k8s.io.apimachinery.pkg.util.intstr.IntOrString maxSurge = 2; } // Spec to control the desired behavior of rolling update. diff --git a/vendor/k8s.io/api/apps/v1/types.go b/vendor/k8s.io/api/apps/v1/types.go index e003a0c4f7c0..48299f18ecbb 100644 --- a/vendor/k8s.io/api/apps/v1/types.go +++ b/vendor/k8s.io/api/apps/v1/types.go @@ -488,19 +488,41 @@ type RollingUpdateDaemonSet struct { // The maximum number of DaemonSet pods that can be unavailable during the // update. Value can be an absolute number (ex: 5) or a percentage of total // number of DaemonSet pods at the start of the update (ex: 10%). Absolute - // number is calculated from percentage by rounding up. - // This cannot be 0. + // number is calculated from percentage by rounding down to a minimum of one. + // This cannot be 0 if MaxSurge is 0 // Default value is 1. // Example: when this is set to 30%, at most 30% of the total number of nodes // that should be running the daemon pod (i.e. status.desiredNumberScheduled) - // can have their pods stopped for an update at any given - // time. The update starts by stopping at most 30% of those DaemonSet pods - // and then brings up new DaemonSet pods in their place. Once the new pods - // are available, it then proceeds onto other DaemonSet pods, thus ensuring - // that at least 70% of original number of DaemonSet pods are available at - // all times during the update. + // can have their pods stopped for an update at any given time. The update + // starts by stopping at most 30% of those DaemonSet pods and then brings + // up new DaemonSet pods in their place. Once the new pods are available, + // it then proceeds onto other DaemonSet pods, thus ensuring that at least + // 70% of original number of DaemonSet pods are available at all times during + // the update. // +optional MaxUnavailable *intstr.IntOrString `json:"maxUnavailable,omitempty" protobuf:"bytes,1,opt,name=maxUnavailable"` + + // The maximum number of nodes with an existing available DaemonSet pod that + // can have an updated DaemonSet pod during during an update. + // Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). + // This can not be 0 if MaxUnavailable is 0. + // Absolute number is calculated from percentage by rounding up to a minimum of 1. + // Default value is 0. + // Example: when this is set to 30%, at most 30% of the total number of nodes + // that should be running the daemon pod (i.e. status.desiredNumberScheduled) + // can have their a new pod created before the old pod is marked as deleted. + // The update starts by launching new pods on 30% of nodes. Once an updated + // pod is available (Ready for at least minReadySeconds) the old DaemonSet pod + // on that node is marked deleted. If the old pod becomes unavailable for any + // reason (Ready transitions to false, is evicted, or is drained) an updated + // pod is immediatedly created on that node without considering surge limits. + // Allowing surge implies the possibility that the resources consumed by the + // daemonset on any given node can double if the readiness check fails, and + // so resource intensive daemonsets should take into account that they may + // cause evictions during disruption. + // This is an alpha field and requires enabling DaemonSetUpdateSurge feature gate. + // +optional + MaxSurge *intstr.IntOrString `json:"maxSurge,omitempty" protobuf:"bytes,2,opt,name=maxSurge"` } // DaemonSetSpec is the specification of a daemon set. diff --git a/vendor/k8s.io/api/apps/v1/types_swagger_doc_generated.go b/vendor/k8s.io/api/apps/v1/types_swagger_doc_generated.go index 3f0299d03335..b9783ad20ed1 100644 --- a/vendor/k8s.io/api/apps/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/apps/v1/types_swagger_doc_generated.go @@ -262,7 +262,8 @@ func (ReplicaSetStatus) SwaggerDoc() map[string]string { var map_RollingUpdateDaemonSet = map[string]string{ "": "Spec to control the desired behavior of daemon set rolling update.", - "maxUnavailable": "The maximum number of DaemonSet pods that can be unavailable during the update. Value can be an absolute number (ex: 5) or a percentage of total number of DaemonSet pods at the start of the update (ex: 10%). Absolute number is calculated from percentage by rounding up. This cannot be 0. Default value is 1. Example: when this is set to 30%, at most 30% of the total number of nodes that should be running the daemon pod (i.e. status.desiredNumberScheduled) can have their pods stopped for an update at any given time. The update starts by stopping at most 30% of those DaemonSet pods and then brings up new DaemonSet pods in their place. Once the new pods are available, it then proceeds onto other DaemonSet pods, thus ensuring that at least 70% of original number of DaemonSet pods are available at all times during the update.", + "maxUnavailable": "The maximum number of DaemonSet pods that can be unavailable during the update. Value can be an absolute number (ex: 5) or a percentage of total number of DaemonSet pods at the start of the update (ex: 10%). Absolute number is calculated from percentage by rounding down to a minimum of one. This cannot be 0 if MaxSurge is 0 Default value is 1. Example: when this is set to 30%, at most 30% of the total number of nodes that should be running the daemon pod (i.e. status.desiredNumberScheduled) can have their pods stopped for an update at any given time. The update starts by stopping at most 30% of those DaemonSet pods and then brings up new DaemonSet pods in their place. Once the new pods are available, it then proceeds onto other DaemonSet pods, thus ensuring that at least 70% of original number of DaemonSet pods are available at all times during the update.", + "maxSurge": "The maximum number of nodes with an existing available DaemonSet pod that can have an updated DaemonSet pod during during an update. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). This can not be 0 if MaxUnavailable is 0. Absolute number is calculated from percentage by rounding up to a minimum of 1. Default value is 0. Example: when this is set to 30%, at most 30% of the total number of nodes that should be running the daemon pod (i.e. status.desiredNumberScheduled) can have their a new pod created before the old pod is marked as deleted. The update starts by launching new pods on 30% of nodes. Once an updated pod is available (Ready for at least minReadySeconds) the old DaemonSet pod on that node is marked deleted. If the old pod becomes unavailable for any reason (Ready transitions to false, is evicted, or is drained) an updated pod is immediatedly created on that node without considering surge limits. Allowing surge implies the possibility that the resources consumed by the daemonset on any given node can double if the readiness check fails, and so resource intensive daemonsets should take into account that they may cause evictions during disruption. This is an alpha field and requires enabling DaemonSetUpdateSurge feature gate.", } func (RollingUpdateDaemonSet) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/api/apps/v1/zz_generated.deepcopy.go b/vendor/k8s.io/api/apps/v1/zz_generated.deepcopy.go index 7b7ff385c622..0c80548521d5 100644 --- a/vendor/k8s.io/api/apps/v1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/apps/v1/zz_generated.deepcopy.go @@ -544,6 +544,11 @@ func (in *RollingUpdateDaemonSet) DeepCopyInto(out *RollingUpdateDaemonSet) { *out = new(intstr.IntOrString) **out = **in } + if in.MaxSurge != nil { + in, out := &in.MaxSurge, &out.MaxSurge + *out = new(intstr.IntOrString) + **out = **in + } return } diff --git a/vendor/k8s.io/api/apps/v1beta1/BUILD b/vendor/k8s.io/api/apps/v1beta1/BUILD deleted file mode 100644 index c25a81b1d611..000000000000 --- a/vendor/k8s.io/api/apps/v1beta1/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - "zz_generated.prerelease-lifecycle.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/api/apps/v1beta1", - importpath = "k8s.io/api/apps/v1beta1", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/api/apps/v1beta1/generated.pb.go b/vendor/k8s.io/api/apps/v1beta1/generated.pb.go index f81b559013e0..6bc56e382aa3 100644 --- a/vendor/k8s.io/api/apps/v1beta1/generated.pb.go +++ b/vendor/k8s.io/api/apps/v1beta1/generated.pb.go @@ -2734,10 +2734,7 @@ func (m *ControllerRevision) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2854,10 +2851,7 @@ func (m *ControllerRevisionList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3006,10 +3000,7 @@ func (m *Deployment) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3253,10 +3244,7 @@ func (m *DeploymentCondition) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3373,10 +3361,7 @@ func (m *DeploymentList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3568,7 +3553,7 @@ func (m *DeploymentRollback) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -3618,10 +3603,7 @@ func (m *DeploymentRollback) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3908,10 +3890,7 @@ func (m *DeploymentSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4129,10 +4108,7 @@ func (m *DeploymentStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4250,10 +4226,7 @@ func (m *DeploymentStrategy) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4322,10 +4295,7 @@ func (m *RollbackConfig) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4447,10 +4417,7 @@ func (m *RollingUpdateDeployment) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4520,10 +4487,7 @@ func (m *RollingUpdateStatefulSetStrategy) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4672,10 +4636,7 @@ func (m *Scale) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4744,10 +4705,7 @@ func (m *ScaleSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4926,7 +4884,7 @@ func (m *ScaleStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -4975,10 +4933,7 @@ func (m *ScaleStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5127,10 +5082,7 @@ func (m *StatefulSet) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5341,10 +5293,7 @@ func (m *StatefulSetCondition) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5461,10 +5410,7 @@ func (m *StatefulSetList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5754,10 +5700,7 @@ func (m *StatefulSetSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -6021,10 +5964,7 @@ func (m *StatefulSetStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -6142,10 +6082,7 @@ func (m *StatefulSetUpdateStrategy) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/api/apps/v1beta2/BUILD b/vendor/k8s.io/api/apps/v1beta2/BUILD deleted file mode 100644 index b8da8a396b28..000000000000 --- a/vendor/k8s.io/api/apps/v1beta2/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - "zz_generated.prerelease-lifecycle.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/api/apps/v1beta2", - importpath = "k8s.io/api/apps/v1beta2", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/api/apps/v1beta2/generated.pb.go b/vendor/k8s.io/api/apps/v1beta2/generated.pb.go index 8a9f20052b33..b2e5c2e97238 100644 --- a/vendor/k8s.io/api/apps/v1beta2/generated.pb.go +++ b/vendor/k8s.io/api/apps/v1beta2/generated.pb.go @@ -957,143 +957,143 @@ func init() { } var fileDescriptor_42fe616264472f7e = []byte{ - // 2171 bytes of a gzipped FileDescriptorProto + // 2169 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5a, 0xcd, 0x6f, 0x1c, 0xb7, 0xf9, 0xd6, 0xec, 0x87, 0xb4, 0xa2, 0x2c, 0xc9, 0xa6, 0xf4, 0x93, 0x36, 0xf2, 0xaf, 0x2b, 0x63, 0x13, 0x38, 0x4a, 0x6c, 0xcd, 0xda, 0xca, 0x07, 0x12, 0xbb, 0x68, 0xab, 0x95, 0x52, 0xdb, 0x81, 0xbe, 0x42, 0x59, 0x06, 0x1a, 0xb4, 0xa8, 0xa9, 0x5d, 0x7a, 0x35, 0xd1, 0x7c, 0x61, 0x86, 0xb3, - 0xf5, 0xa2, 0x97, 0x9e, 0x0a, 0x14, 0x28, 0xd0, 0xf6, 0xda, 0x7f, 0xa2, 0xb7, 0xa2, 0x68, 0x6f, - 0x45, 0x50, 0xf8, 0x52, 0x20, 0xe8, 0x25, 0x39, 0x09, 0xf5, 0xe6, 0x54, 0x14, 0xbd, 0x14, 0xe8, - 0x25, 0x40, 0x81, 0x82, 0x1c, 0xce, 0x07, 0xe7, 0xc3, 0x3b, 0x52, 0x1c, 0xa5, 0x29, 0x72, 0xd3, - 0x92, 0xcf, 0xfb, 0xf0, 0x7d, 0xc9, 0x97, 0x7c, 0x1f, 0x72, 0x04, 0xbe, 0x73, 0xfc, 0x96, 0xab, - 0x6a, 0x56, 0xeb, 0xd8, 0x3b, 0x24, 0x8e, 0x49, 0x28, 0x71, 0x5b, 0x7d, 0x62, 0x76, 0x2d, 0xa7, - 0x25, 0x3a, 0xb0, 0xad, 0xb5, 0xb0, 0x6d, 0xbb, 0xad, 0xfe, 0xcd, 0x43, 0x42, 0xf1, 0x5a, 0xab, - 0x47, 0x4c, 0xe2, 0x60, 0x4a, 0xba, 0xaa, 0xed, 0x58, 0xd4, 0x82, 0x8b, 0x3e, 0x50, 0xc5, 0xb6, - 0xa6, 0x32, 0xa0, 0x2a, 0x80, 0x4b, 0xab, 0x3d, 0x8d, 0x1e, 0x79, 0x87, 0x6a, 0xc7, 0x32, 0x5a, - 0x3d, 0xab, 0x67, 0xb5, 0x38, 0xfe, 0xd0, 0x7b, 0xc4, 0x7f, 0xf1, 0x1f, 0xfc, 0x2f, 0x9f, 0x67, - 0xa9, 0x19, 0x1b, 0xb0, 0x63, 0x39, 0xa4, 0xd5, 0xbf, 0x99, 0x1c, 0x6b, 0xe9, 0xf5, 0x08, 0x63, - 0xe0, 0xce, 0x91, 0x66, 0x12, 0x67, 0xd0, 0xb2, 0x8f, 0x7b, 0xac, 0xc1, 0x6d, 0x19, 0x84, 0xe2, - 0x2c, 0xab, 0x56, 0x9e, 0x95, 0xe3, 0x99, 0x54, 0x33, 0x48, 0xca, 0xe0, 0xcd, 0x51, 0x06, 0x6e, - 0xe7, 0x88, 0x18, 0x38, 0x65, 0xf7, 0x5a, 0x9e, 0x9d, 0x47, 0x35, 0xbd, 0xa5, 0x99, 0xd4, 0xa5, - 0x4e, 0xd2, 0xa8, 0xf9, 0x2f, 0x05, 0xc0, 0x0d, 0xcb, 0xa4, 0x8e, 0xa5, 0xeb, 0xc4, 0x41, 0xa4, - 0xaf, 0xb9, 0x9a, 0x65, 0xc2, 0x87, 0xa0, 0xc6, 0xe2, 0xe9, 0x62, 0x8a, 0xeb, 0xca, 0x15, 0x65, - 0x65, 0x6a, 0xed, 0x86, 0x1a, 0xcd, 0x74, 0x48, 0xaf, 0xda, 0xc7, 0x3d, 0xd6, 0xe0, 0xaa, 0x0c, - 0xad, 0xf6, 0x6f, 0xaa, 0xbb, 0x87, 0x1f, 0x90, 0x0e, 0xdd, 0x26, 0x14, 0xb7, 0xe1, 0x93, 0x93, - 0xe5, 0xb1, 0xe1, 0xc9, 0x32, 0x88, 0xda, 0x50, 0xc8, 0x0a, 0x77, 0x41, 0x85, 0xb3, 0x97, 0x38, - 0xfb, 0x6a, 0x2e, 0xbb, 0x08, 0x5a, 0x45, 0xf8, 0x47, 0xef, 0x3c, 0xa6, 0xc4, 0x64, 0xee, 0xb5, - 0x2f, 0x08, 0xea, 0xca, 0x26, 0xa6, 0x18, 0x71, 0x22, 0x78, 0x1d, 0xd4, 0x1c, 0xe1, 0x7e, 0xbd, - 0x7c, 0x45, 0x59, 0x29, 0xb7, 0x2f, 0x0a, 0x54, 0x2d, 0x08, 0x0b, 0x85, 0x88, 0xe6, 0x13, 0x05, - 0x2c, 0xa4, 0xe3, 0xde, 0xd2, 0x5c, 0x0a, 0xbf, 0x9f, 0x8a, 0x5d, 0x2d, 0x16, 0x3b, 0xb3, 0xe6, - 0x91, 0x87, 0x03, 0x07, 0x2d, 0xb1, 0xb8, 0xf7, 0x40, 0x55, 0xa3, 0xc4, 0x70, 0xeb, 0xa5, 0x2b, - 0xe5, 0x95, 0xa9, 0xb5, 0x6b, 0x6a, 0x4e, 0x02, 0xab, 0x69, 0xef, 0xda, 0xd3, 0x82, 0xb7, 0x7a, - 0x8f, 0x31, 0x20, 0x9f, 0xa8, 0xf9, 0xb3, 0x12, 0x98, 0xdc, 0xc4, 0xc4, 0xb0, 0xcc, 0x7d, 0x42, - 0xcf, 0x61, 0xe5, 0xee, 0x82, 0x8a, 0x6b, 0x93, 0x8e, 0x58, 0xb9, 0xab, 0xb9, 0x01, 0x84, 0x3e, - 0xed, 0xdb, 0xa4, 0x13, 0x2d, 0x19, 0xfb, 0x85, 0x38, 0x03, 0xdc, 0x03, 0xe3, 0x2e, 0xc5, 0xd4, - 0x73, 0xf9, 0x82, 0x4d, 0xad, 0xad, 0x14, 0xe0, 0xe2, 0xf8, 0xf6, 0x8c, 0x60, 0x1b, 0xf7, 0x7f, - 0x23, 0xc1, 0xd3, 0xfc, 0x5b, 0x09, 0xc0, 0x10, 0xbb, 0x61, 0x99, 0x5d, 0x8d, 0xb2, 0x74, 0xbe, - 0x05, 0x2a, 0x74, 0x60, 0x13, 0x3e, 0x21, 0x93, 0xed, 0xab, 0x81, 0x2b, 0xf7, 0x07, 0x36, 0xf9, - 0xec, 0x64, 0x79, 0x21, 0x6d, 0xc1, 0x7a, 0x10, 0xb7, 0x81, 0x5b, 0xa1, 0x93, 0x25, 0x6e, 0xfd, - 0xba, 0x3c, 0xf4, 0x67, 0x27, 0xcb, 0x19, 0x67, 0x87, 0x1a, 0x32, 0xc9, 0x0e, 0xc2, 0x3e, 0x80, - 0x3a, 0x76, 0xe9, 0x7d, 0x07, 0x9b, 0xae, 0x3f, 0x92, 0x66, 0x10, 0x11, 0xfe, 0xab, 0xc5, 0x16, - 0x8a, 0x59, 0xb4, 0x97, 0x84, 0x17, 0x70, 0x2b, 0xc5, 0x86, 0x32, 0x46, 0x80, 0x57, 0xc1, 0xb8, - 0x43, 0xb0, 0x6b, 0x99, 0xf5, 0x0a, 0x8f, 0x22, 0x9c, 0x40, 0xc4, 0x5b, 0x91, 0xe8, 0x85, 0xaf, - 0x80, 0x09, 0x83, 0xb8, 0x2e, 0xee, 0x91, 0x7a, 0x95, 0x03, 0x67, 0x05, 0x70, 0x62, 0xdb, 0x6f, - 0x46, 0x41, 0x7f, 0xf3, 0xb7, 0x0a, 0x98, 0x0e, 0x67, 0xee, 0x1c, 0x76, 0xce, 0x1d, 0x79, 0xe7, - 0x34, 0x47, 0x27, 0x4b, 0xce, 0x86, 0xf9, 0xb0, 0x1c, 0x73, 0x9c, 0xa5, 0x23, 0xfc, 0x01, 0xa8, - 0xb9, 0x44, 0x27, 0x1d, 0x6a, 0x39, 0xc2, 0xf1, 0xd7, 0x0a, 0x3a, 0x8e, 0x0f, 0x89, 0xbe, 0x2f, - 0x4c, 0xdb, 0x17, 0x98, 0xe7, 0xc1, 0x2f, 0x14, 0x52, 0xc2, 0xf7, 0x40, 0x8d, 0x12, 0xc3, 0xd6, - 0x31, 0x25, 0x62, 0xd7, 0xbc, 0x18, 0x77, 0x9e, 0xe5, 0x0c, 0x23, 0xdb, 0xb3, 0xba, 0xf7, 0x05, - 0x8c, 0x6f, 0x99, 0x70, 0x32, 0x82, 0x56, 0x14, 0xd2, 0x40, 0x1b, 0xcc, 0x78, 0x76, 0x97, 0x21, - 0x29, 0x3b, 0xce, 0x7b, 0x03, 0x91, 0x43, 0x37, 0x46, 0xcf, 0xca, 0x81, 0x64, 0xd7, 0x5e, 0x10, - 0xa3, 0xcc, 0xc8, 0xed, 0x28, 0xc1, 0x0f, 0xd7, 0xc1, 0xac, 0xa1, 0x99, 0x88, 0xe0, 0xee, 0x60, - 0x9f, 0x74, 0x2c, 0xb3, 0xeb, 0xf2, 0x54, 0xaa, 0xb6, 0x17, 0x05, 0xc1, 0xec, 0xb6, 0xdc, 0x8d, - 0x92, 0x78, 0xb8, 0x05, 0xe6, 0x83, 0x03, 0xf8, 0xae, 0xe6, 0x52, 0xcb, 0x19, 0x6c, 0x69, 0x86, - 0x46, 0xeb, 0xe3, 0x9c, 0xa7, 0x3e, 0x3c, 0x59, 0x9e, 0x47, 0x19, 0xfd, 0x28, 0xd3, 0xaa, 0xf9, - 0xab, 0x71, 0x30, 0x9b, 0x38, 0x17, 0xe0, 0x03, 0xb0, 0xd0, 0xf1, 0x1c, 0x87, 0x98, 0x74, 0xc7, - 0x33, 0x0e, 0x89, 0xb3, 0xdf, 0x39, 0x22, 0x5d, 0x4f, 0x27, 0x5d, 0xbe, 0xac, 0xd5, 0x76, 0x43, - 0xf8, 0xba, 0xb0, 0x91, 0x89, 0x42, 0x39, 0xd6, 0xf0, 0x5d, 0x00, 0x4d, 0xde, 0xb4, 0xad, 0xb9, - 0x6e, 0xc8, 0x59, 0xe2, 0x9c, 0xe1, 0x56, 0xdc, 0x49, 0x21, 0x50, 0x86, 0x15, 0xf3, 0xb1, 0x4b, - 0x5c, 0xcd, 0x21, 0xdd, 0xa4, 0x8f, 0x65, 0xd9, 0xc7, 0xcd, 0x4c, 0x14, 0xca, 0xb1, 0x86, 0x6f, - 0x80, 0x29, 0x7f, 0x34, 0x3e, 0xe7, 0x62, 0x71, 0xe6, 0x04, 0xd9, 0xd4, 0x4e, 0xd4, 0x85, 0xe2, - 0x38, 0x16, 0x9a, 0x75, 0xe8, 0x12, 0xa7, 0x4f, 0xba, 0x77, 0x7c, 0x71, 0xc0, 0x2a, 0x68, 0x95, - 0x57, 0xd0, 0x30, 0xb4, 0xdd, 0x14, 0x02, 0x65, 0x58, 0xb1, 0xd0, 0xfc, 0xac, 0x49, 0x85, 0x36, - 0x2e, 0x87, 0x76, 0x90, 0x89, 0x42, 0x39, 0xd6, 0x2c, 0xf7, 0x7c, 0x97, 0xd7, 0xfb, 0x58, 0xd3, - 0xf1, 0xa1, 0x4e, 0xea, 0x13, 0x72, 0xee, 0xed, 0xc8, 0xdd, 0x28, 0x89, 0x87, 0x77, 0xc0, 0x25, - 0xbf, 0xe9, 0xc0, 0xc4, 0x21, 0x49, 0x8d, 0x93, 0xbc, 0x20, 0x48, 0x2e, 0xed, 0x24, 0x01, 0x28, - 0x6d, 0x03, 0x6f, 0x81, 0x99, 0x8e, 0xa5, 0xeb, 0x3c, 0x1f, 0x37, 0x2c, 0xcf, 0xa4, 0xf5, 0x49, - 0xce, 0x02, 0xd9, 0x1e, 0xda, 0x90, 0x7a, 0x50, 0x02, 0x09, 0x7f, 0x08, 0x40, 0x27, 0x28, 0x0c, - 0x6e, 0x1d, 0x8c, 0x50, 0x00, 0xe9, 0xb2, 0x14, 0x55, 0xe6, 0xb0, 0xc9, 0x45, 0x31, 0xca, 0xe6, - 0x87, 0x0a, 0x58, 0xcc, 0xd9, 0xe8, 0xf0, 0xdb, 0x52, 0x11, 0xbc, 0x96, 0x28, 0x82, 0x97, 0x73, - 0xcc, 0x62, 0x95, 0xf0, 0x08, 0x4c, 0x33, 0x41, 0xa2, 0x99, 0x3d, 0x1f, 0x22, 0xce, 0xb2, 0x56, - 0x6e, 0x00, 0x28, 0x8e, 0x8e, 0x4e, 0xe5, 0x4b, 0xc3, 0x93, 0xe5, 0x69, 0xa9, 0x0f, 0xc9, 0xc4, - 0xcd, 0x9f, 0x97, 0x00, 0xd8, 0x24, 0xb6, 0x6e, 0x0d, 0x0c, 0x62, 0x9e, 0x87, 0xa6, 0xb9, 0x27, - 0x69, 0x9a, 0x97, 0xf3, 0x97, 0x24, 0x74, 0x2a, 0x57, 0xd4, 0xbc, 0x97, 0x10, 0x35, 0xaf, 0x14, - 0x21, 0x7b, 0xb6, 0xaa, 0xf9, 0xb8, 0x0c, 0xe6, 0x22, 0x70, 0x24, 0x6b, 0x6e, 0x4b, 0x2b, 0xfa, - 0x72, 0x62, 0x45, 0x17, 0x33, 0x4c, 0xbe, 0x30, 0x5d, 0xf3, 0x01, 0x98, 0x61, 0xaa, 0xc3, 0x5f, - 0x3f, 0xae, 0x69, 0xc6, 0x4f, 0xad, 0x69, 0xc2, 0x4a, 0xb4, 0x25, 0x31, 0xa1, 0x04, 0x73, 0x8e, - 0x86, 0x9a, 0xf8, 0x2a, 0x6a, 0xa8, 0xdf, 0x29, 0x60, 0x26, 0x5a, 0xa6, 0x73, 0x10, 0x51, 0x77, - 0x65, 0x11, 0xf5, 0x62, 0x81, 0xe4, 0xcc, 0x51, 0x51, 0x1f, 0x57, 0xe2, 0xae, 0x73, 0x19, 0xb5, - 0xc2, 0xae, 0x60, 0xb6, 0xae, 0x75, 0xb0, 0x2b, 0xea, 0xed, 0x05, 0xff, 0xfa, 0xe5, 0xb7, 0xa1, - 0xb0, 0x57, 0x12, 0x5c, 0xa5, 0x2f, 0x56, 0x70, 0x95, 0x9f, 0x8f, 0xe0, 0xfa, 0x1e, 0xa8, 0xb9, - 0x81, 0xd4, 0xaa, 0x70, 0xca, 0x6b, 0x85, 0x36, 0xb6, 0x50, 0x59, 0x21, 0x75, 0xa8, 0xaf, 0x42, - 0xba, 0x2c, 0x65, 0x55, 0xfd, 0x32, 0x95, 0x15, 0x4b, 0x74, 0x1b, 0x7b, 0x2e, 0xe9, 0xf2, 0x4d, - 0x55, 0x8b, 0x12, 0x7d, 0x8f, 0xb7, 0x22, 0xd1, 0x0b, 0x0f, 0xc0, 0xa2, 0xed, 0x58, 0x3d, 0x87, - 0xb8, 0xee, 0x26, 0xc1, 0x5d, 0x5d, 0x33, 0x49, 0x10, 0x80, 0x5f, 0x13, 0x2f, 0x0f, 0x4f, 0x96, - 0x17, 0xf7, 0xb2, 0x21, 0x28, 0xcf, 0xb6, 0xf9, 0xc7, 0x0a, 0xb8, 0x98, 0x3c, 0x1b, 0x73, 0x64, - 0x8a, 0x72, 0x26, 0x99, 0x72, 0x3d, 0x96, 0xa7, 0xbe, 0x86, 0x8b, 0x3d, 0x15, 0xa4, 0x72, 0x75, - 0x1d, 0xcc, 0x0a, 0x59, 0x12, 0x74, 0x0a, 0xa1, 0x16, 0x2e, 0xcf, 0x81, 0xdc, 0x8d, 0x92, 0x78, - 0x78, 0x1b, 0x4c, 0x3b, 0x5c, 0x79, 0x05, 0x04, 0xbe, 0x7a, 0xf9, 0x3f, 0x41, 0x30, 0x8d, 0xe2, - 0x9d, 0x48, 0xc6, 0x32, 0xe5, 0x12, 0x09, 0x92, 0x80, 0xa0, 0x22, 0x2b, 0x97, 0xf5, 0x24, 0x00, - 0xa5, 0x6d, 0xe0, 0x36, 0x98, 0xf3, 0xcc, 0x34, 0x95, 0x9f, 0x6b, 0x97, 0x05, 0xd5, 0xdc, 0x41, - 0x1a, 0x82, 0xb2, 0xec, 0xe0, 0x43, 0x49, 0xcc, 0x8c, 0xf3, 0xf3, 0xe4, 0x7a, 0x81, 0x3d, 0x51, - 0x58, 0xcd, 0x64, 0x48, 0xad, 0x5a, 0x51, 0xa9, 0xd5, 0xfc, 0x83, 0x02, 0x60, 0x7a, 0x1f, 0x8e, - 0x7c, 0x09, 0x48, 0x59, 0xc4, 0x2a, 0xa6, 0x96, 0xad, 0x7f, 0x6e, 0x14, 0xd4, 0x3f, 0xd1, 0x81, - 0x5a, 0x4c, 0x00, 0x89, 0x89, 0x3e, 0x9f, 0x47, 0x9d, 0xa2, 0x02, 0x28, 0x72, 0xea, 0x39, 0x08, - 0xa0, 0x18, 0xd9, 0xb3, 0x05, 0xd0, 0xdf, 0x4b, 0x60, 0x2e, 0x02, 0x17, 0x16, 0x40, 0x19, 0x26, - 0x5f, 0x3f, 0xec, 0x14, 0x13, 0x25, 0xd1, 0xd4, 0xfd, 0x37, 0x89, 0x92, 0xc8, 0xab, 0x1c, 0x51, - 0xf2, 0x9b, 0x52, 0xdc, 0xf5, 0x53, 0x8a, 0x92, 0xe7, 0xf0, 0xc2, 0xf1, 0x95, 0xd3, 0x35, 0xcd, - 0x3f, 0x95, 0xc1, 0xc5, 0xe4, 0x3e, 0x94, 0x0a, 0xa4, 0x32, 0xb2, 0x40, 0xee, 0x81, 0xf9, 0x47, - 0x9e, 0xae, 0x0f, 0x78, 0x0c, 0xb1, 0x2a, 0xe9, 0x97, 0xd6, 0xff, 0x17, 0x96, 0xf3, 0xdf, 0xcd, - 0xc0, 0xa0, 0x4c, 0xcb, 0x74, 0xbd, 0xac, 0x7c, 0xde, 0x7a, 0x59, 0x3d, 0x43, 0xbd, 0xcc, 0x96, - 0x1c, 0xe5, 0x33, 0x49, 0x8e, 0xd3, 0x15, 0xcb, 0x8c, 0x83, 0x6b, 0xe4, 0xd5, 0xff, 0xa7, 0x0a, - 0x58, 0xc8, 0xbe, 0x70, 0x43, 0x1d, 0xcc, 0x18, 0xf8, 0x71, 0xfc, 0xe1, 0x63, 0x54, 0x11, 0xf1, - 0xa8, 0xa6, 0xab, 0xfe, 0x27, 0x23, 0xf5, 0x9e, 0x49, 0x77, 0x9d, 0x7d, 0xea, 0x68, 0x66, 0xcf, - 0xaf, 0xbc, 0xdb, 0x12, 0x17, 0x4a, 0x70, 0x37, 0x3f, 0x55, 0xc0, 0x62, 0x4e, 0xe5, 0x3b, 0x5f, - 0x4f, 0xe0, 0xfb, 0xa0, 0x66, 0xe0, 0xc7, 0xfb, 0x9e, 0xd3, 0xcb, 0xaa, 0xd5, 0xc5, 0xc6, 0xe1, - 0x5b, 0x71, 0x5b, 0xb0, 0xa0, 0x90, 0xaf, 0xb9, 0x0b, 0xae, 0x48, 0x41, 0xb2, 0x9d, 0x43, 0x1e, - 0x79, 0x3a, 0xdf, 0x44, 0x42, 0x6c, 0x5c, 0x03, 0x93, 0x36, 0x76, 0xa8, 0x16, 0x4a, 0xd5, 0x6a, - 0x7b, 0x7a, 0x78, 0xb2, 0x3c, 0xb9, 0x17, 0x34, 0xa2, 0xa8, 0xbf, 0xf9, 0x6f, 0x05, 0x54, 0xf7, - 0x3b, 0x58, 0x27, 0xe7, 0x50, 0xed, 0x37, 0xa5, 0x6a, 0x9f, 0xff, 0x92, 0xce, 0xfd, 0xc9, 0x2d, - 0xf4, 0x5b, 0x89, 0x42, 0xff, 0xd2, 0x08, 0x9e, 0x67, 0xd7, 0xf8, 0xb7, 0xc1, 0x64, 0x38, 0xdc, - 0xe9, 0x0e, 0xa0, 0xe6, 0xaf, 0x4b, 0x60, 0x2a, 0x36, 0xc4, 0x29, 0x8f, 0xaf, 0x87, 0xd2, 0x99, - 0xcd, 0x36, 0xe6, 0x5a, 0x91, 0x40, 0xd4, 0xe0, 0x7c, 0x7e, 0xc7, 0xa4, 0x4e, 0xfc, 0x82, 0x97, - 0x3e, 0xb6, 0xbf, 0x05, 0x66, 0x28, 0x76, 0x7a, 0x84, 0x06, 0x7d, 0x7c, 0xc2, 0x26, 0xa3, 0x07, - 0x8f, 0xfb, 0x52, 0x2f, 0x4a, 0xa0, 0x97, 0x6e, 0x83, 0x69, 0x69, 0x30, 0x78, 0x11, 0x94, 0x8f, - 0xc9, 0xc0, 0x97, 0x3d, 0x88, 0xfd, 0x09, 0xe7, 0x41, 0xb5, 0x8f, 0x75, 0xcf, 0xcf, 0xf3, 0x49, - 0xe4, 0xff, 0xb8, 0x55, 0x7a, 0x4b, 0x69, 0xfe, 0x82, 0x4d, 0x4e, 0x94, 0x9c, 0xe7, 0x90, 0x5d, - 0xef, 0x4a, 0xd9, 0x95, 0xff, 0x51, 0x2f, 0xbe, 0x65, 0xf2, 0x72, 0x0c, 0x25, 0x72, 0xec, 0xd5, - 0x42, 0x6c, 0xcf, 0xce, 0xb4, 0x7f, 0x94, 0xc0, 0x7c, 0x0c, 0x1d, 0xc9, 0xc9, 0x6f, 0x4a, 0x72, - 0x72, 0x25, 0x21, 0x27, 0xeb, 0x59, 0x36, 0x5f, 0xeb, 0xc9, 0xd1, 0x7a, 0xf2, 0xf7, 0x0a, 0x98, - 0x8d, 0xcd, 0xdd, 0x39, 0x08, 0xca, 0x7b, 0xb2, 0xa0, 0x7c, 0xa9, 0x48, 0xd2, 0xe4, 0x28, 0xca, - 0x3f, 0x57, 0x25, 0xe7, 0xff, 0xe7, 0xdf, 0xb9, 0x7e, 0x0c, 0xe6, 0xfb, 0x96, 0xee, 0x19, 0x64, - 0x43, 0xc7, 0x9a, 0x11, 0x00, 0x98, 0x02, 0x2b, 0x27, 0xef, 0x72, 0x21, 0x3d, 0x71, 0x5c, 0xcd, - 0xa5, 0xc4, 0xa4, 0x0f, 0x22, 0xcb, 0x48, 0xf7, 0x3d, 0xc8, 0xa0, 0x43, 0x99, 0x83, 0xc0, 0x37, - 0xc0, 0x14, 0x53, 0x4e, 0x5a, 0x87, 0xec, 0x60, 0x23, 0x48, 0xac, 0xf0, 0x13, 0xd6, 0x7e, 0xd4, - 0x85, 0xe2, 0x38, 0x78, 0x04, 0xe6, 0x6c, 0xab, 0xbb, 0x8d, 0x4d, 0xdc, 0x23, 0x4c, 0x66, 0xec, - 0x59, 0xba, 0xd6, 0x19, 0xf0, 0xc7, 0xaf, 0xc9, 0xf6, 0x9b, 0xc1, 0xc3, 0xc6, 0x5e, 0x1a, 0xc2, - 0x2e, 0x89, 0x19, 0xcd, 0x7c, 0x53, 0x67, 0x51, 0x42, 0x27, 0xf5, 0xd9, 0xd5, 0x7f, 0x76, 0x5e, - 0x2b, 0x92, 0x61, 0x67, 0xfc, 0xf0, 0x9a, 0xf7, 0xb6, 0x57, 0x3b, 0xd3, 0x57, 0xd3, 0x7f, 0x56, - 0xc0, 0xa5, 0xd4, 0x51, 0xf9, 0x25, 0xbe, 0xae, 0xa5, 0xa4, 0x7e, 0xf9, 0x14, 0x52, 0x7f, 0x1d, - 0xcc, 0x8a, 0x0f, 0xb6, 0x89, 0x9b, 0x42, 0x78, 0x63, 0xdb, 0x90, 0xbb, 0x51, 0x12, 0x9f, 0xf5, - 0xba, 0x57, 0x3d, 0xe5, 0xeb, 0x5e, 0xdc, 0x0b, 0xf1, 0x0f, 0x48, 0x7e, 0xea, 0xa5, 0xbd, 0x10, - 0xff, 0x87, 0x94, 0xc4, 0x33, 0x85, 0xe0, 0xb3, 0x86, 0x0c, 0x13, 0xb2, 0x42, 0x38, 0x90, 0x7a, - 0x51, 0x02, 0xfd, 0xb9, 0x3e, 0x4a, 0xe2, 0x8c, 0x8f, 0x92, 0xab, 0x45, 0xf2, 0xb9, 0xf8, 0xdd, - 0xe4, 0x2f, 0x0a, 0x78, 0x21, 0x77, 0x23, 0xc0, 0x75, 0xa9, 0xec, 0xae, 0x26, 0xca, 0xee, 0x37, - 0x72, 0x0d, 0x63, 0xb5, 0xd7, 0xc9, 0x7e, 0x9a, 0x7b, 0xbb, 0xd8, 0xd3, 0x5c, 0x86, 0x76, 0x1f, - 0xfd, 0x46, 0xd7, 0x5e, 0x7d, 0xf2, 0xb4, 0x31, 0xf6, 0xd1, 0xd3, 0xc6, 0xd8, 0x27, 0x4f, 0x1b, - 0x63, 0x3f, 0x19, 0x36, 0x94, 0x27, 0xc3, 0x86, 0xf2, 0xd1, 0xb0, 0xa1, 0x7c, 0x32, 0x6c, 0x28, - 0x7f, 0x1d, 0x36, 0x94, 0x5f, 0x7e, 0xda, 0x18, 0x7b, 0x7f, 0x42, 0x8c, 0xf8, 0x9f, 0x00, 0x00, - 0x00, 0xff, 0xff, 0x70, 0x2d, 0x26, 0x9d, 0xec, 0x28, 0x00, 0x00, + 0xf5, 0xa2, 0x97, 0x5e, 0x0b, 0x14, 0x68, 0x7b, 0xed, 0x3f, 0xd1, 0x5b, 0x51, 0xb4, 0xb7, 0x22, + 0x28, 0x7c, 0x29, 0x10, 0xf4, 0x92, 0x9c, 0x84, 0x7a, 0x73, 0x2a, 0x8a, 0x5e, 0x0a, 0xf4, 0x12, + 0xa0, 0x40, 0x41, 0x0e, 0xe7, 0x83, 0xf3, 0xe1, 0x1d, 0x29, 0x8e, 0xd2, 0x04, 0xb9, 0x69, 0xc9, + 0xe7, 0x7d, 0xf8, 0xbe, 0xe4, 0x4b, 0xbe, 0x0f, 0x39, 0x02, 0xdf, 0x3b, 0x7e, 0xcb, 0x55, 0x35, + 0xab, 0x75, 0xec, 0x1d, 0x12, 0xc7, 0x24, 0x94, 0xb8, 0xad, 0x3e, 0x31, 0xbb, 0x96, 0xd3, 0x12, + 0x1d, 0xd8, 0xd6, 0x5a, 0xd8, 0xb6, 0xdd, 0x56, 0xff, 0xe6, 0x21, 0xa1, 0x78, 0xad, 0xd5, 0x23, + 0x26, 0x71, 0x30, 0x25, 0x5d, 0xd5, 0x76, 0x2c, 0x6a, 0xc1, 0x45, 0x1f, 0xa8, 0x62, 0x5b, 0x53, + 0x19, 0x50, 0x15, 0xc0, 0xa5, 0xd5, 0x9e, 0x46, 0x8f, 0xbc, 0x43, 0xb5, 0x63, 0x19, 0xad, 0x9e, + 0xd5, 0xb3, 0x5a, 0x1c, 0x7f, 0xe8, 0x3d, 0xe2, 0xbf, 0xf8, 0x0f, 0xfe, 0x97, 0xcf, 0xb3, 0xd4, + 0x8c, 0x0d, 0xd8, 0xb1, 0x1c, 0xd2, 0xea, 0xdf, 0x4c, 0x8e, 0xb5, 0xf4, 0x7a, 0x84, 0x31, 0x70, + 0xe7, 0x48, 0x33, 0x89, 0x33, 0x68, 0xd9, 0xc7, 0x3d, 0xd6, 0xe0, 0xb6, 0x0c, 0x42, 0x71, 0x96, + 0x55, 0x2b, 0xcf, 0xca, 0xf1, 0x4c, 0xaa, 0x19, 0x24, 0x65, 0xf0, 0xe6, 0x28, 0x03, 0xb7, 0x73, + 0x44, 0x0c, 0x9c, 0xb2, 0x7b, 0x2d, 0xcf, 0xce, 0xa3, 0x9a, 0xde, 0xd2, 0x4c, 0xea, 0x52, 0x27, + 0x69, 0xd4, 0xfc, 0xb7, 0x02, 0xe0, 0x86, 0x65, 0x52, 0xc7, 0xd2, 0x75, 0xe2, 0x20, 0xd2, 0xd7, + 0x5c, 0xcd, 0x32, 0xe1, 0x43, 0x50, 0x63, 0xf1, 0x74, 0x31, 0xc5, 0x75, 0xe5, 0x8a, 0xb2, 0x32, + 0xb5, 0x76, 0x43, 0x8d, 0x66, 0x3a, 0xa4, 0x57, 0xed, 0xe3, 0x1e, 0x6b, 0x70, 0x55, 0x86, 0x56, + 0xfb, 0x37, 0xd5, 0xdd, 0xc3, 0x0f, 0x48, 0x87, 0x6e, 0x13, 0x8a, 0xdb, 0xf0, 0xc9, 0xc9, 0xf2, + 0xd8, 0xf0, 0x64, 0x19, 0x44, 0x6d, 0x28, 0x64, 0x85, 0xbb, 0xa0, 0xc2, 0xd9, 0x4b, 0x9c, 0x7d, + 0x35, 0x97, 0x5d, 0x04, 0xad, 0x22, 0xfc, 0x93, 0x77, 0x1e, 0x53, 0x62, 0x32, 0xf7, 0xda, 0x17, + 0x04, 0x75, 0x65, 0x13, 0x53, 0x8c, 0x38, 0x11, 0xbc, 0x0e, 0x6a, 0x8e, 0x70, 0xbf, 0x5e, 0xbe, + 0xa2, 0xac, 0x94, 0xdb, 0x17, 0x05, 0xaa, 0x16, 0x84, 0x85, 0x42, 0x44, 0xf3, 0x89, 0x02, 0x16, + 0xd2, 0x71, 0x6f, 0x69, 0x2e, 0x85, 0x3f, 0x4c, 0xc5, 0xae, 0x16, 0x8b, 0x9d, 0x59, 0xf3, 0xc8, + 0xc3, 0x81, 0x83, 0x96, 0x58, 0xdc, 0x7b, 0xa0, 0xaa, 0x51, 0x62, 0xb8, 0xf5, 0xd2, 0x95, 0xf2, + 0xca, 0xd4, 0xda, 0x35, 0x35, 0x27, 0x81, 0xd5, 0xb4, 0x77, 0xed, 0x69, 0xc1, 0x5b, 0xbd, 0xc7, + 0x18, 0x90, 0x4f, 0xd4, 0xfc, 0x79, 0x09, 0x4c, 0x6e, 0x62, 0x62, 0x58, 0xe6, 0x3e, 0xa1, 0xe7, + 0xb0, 0x72, 0x77, 0x41, 0xc5, 0xb5, 0x49, 0x47, 0xac, 0xdc, 0xd5, 0xdc, 0x00, 0x42, 0x9f, 0xf6, + 0x6d, 0xd2, 0x89, 0x96, 0x8c, 0xfd, 0x42, 0x9c, 0x01, 0xee, 0x81, 0x71, 0x97, 0x62, 0xea, 0xb9, + 0x7c, 0xc1, 0xa6, 0xd6, 0x56, 0x0a, 0x70, 0x71, 0x7c, 0x7b, 0x46, 0xb0, 0x8d, 0xfb, 0xbf, 0x91, + 0xe0, 0x69, 0xfe, 0xbd, 0x04, 0x60, 0x88, 0xdd, 0xb0, 0xcc, 0xae, 0x46, 0x59, 0x3a, 0xdf, 0x02, + 0x15, 0x3a, 0xb0, 0x09, 0x9f, 0x90, 0xc9, 0xf6, 0xd5, 0xc0, 0x95, 0xfb, 0x03, 0x9b, 0x7c, 0x76, + 0xb2, 0xbc, 0x90, 0xb6, 0x60, 0x3d, 0x88, 0xdb, 0xc0, 0xad, 0xd0, 0xc9, 0x12, 0xb7, 0x7e, 0x5d, + 0x1e, 0xfa, 0xb3, 0x93, 0xe5, 0x8c, 0xb3, 0x43, 0x0d, 0x99, 0x64, 0x07, 0x61, 0x1f, 0x40, 0x1d, + 0xbb, 0xf4, 0xbe, 0x83, 0x4d, 0xd7, 0x1f, 0x49, 0x33, 0x88, 0x08, 0xff, 0xd5, 0x62, 0x0b, 0xc5, + 0x2c, 0xda, 0x4b, 0xc2, 0x0b, 0xb8, 0x95, 0x62, 0x43, 0x19, 0x23, 0xc0, 0xab, 0x60, 0xdc, 0x21, + 0xd8, 0xb5, 0xcc, 0x7a, 0x85, 0x47, 0x11, 0x4e, 0x20, 0xe2, 0xad, 0x48, 0xf4, 0xc2, 0x57, 0xc0, + 0x84, 0x41, 0x5c, 0x17, 0xf7, 0x48, 0xbd, 0xca, 0x81, 0xb3, 0x02, 0x38, 0xb1, 0xed, 0x37, 0xa3, + 0xa0, 0xbf, 0xf9, 0x3b, 0x05, 0x4c, 0x87, 0x33, 0x77, 0x0e, 0x3b, 0xe7, 0x8e, 0xbc, 0x73, 0x9a, + 0xa3, 0x93, 0x25, 0x67, 0xc3, 0x7c, 0x58, 0x8e, 0x39, 0xce, 0xd2, 0x11, 0xfe, 0x08, 0xd4, 0x5c, + 0xa2, 0x93, 0x0e, 0xb5, 0x1c, 0xe1, 0xf8, 0x6b, 0x05, 0x1d, 0xc7, 0x87, 0x44, 0xdf, 0x17, 0xa6, + 0xed, 0x0b, 0xcc, 0xf3, 0xe0, 0x17, 0x0a, 0x29, 0xe1, 0x7b, 0xa0, 0x46, 0x89, 0x61, 0xeb, 0x98, + 0x12, 0xb1, 0x6b, 0x5e, 0x8c, 0x3b, 0xcf, 0x72, 0x86, 0x91, 0xed, 0x59, 0xdd, 0xfb, 0x02, 0xc6, + 0xb7, 0x4c, 0x38, 0x19, 0x41, 0x2b, 0x0a, 0x69, 0xa0, 0x0d, 0x66, 0x3c, 0xbb, 0xcb, 0x90, 0x94, + 0x1d, 0xe7, 0xbd, 0x81, 0xc8, 0xa1, 0x1b, 0xa3, 0x67, 0xe5, 0x40, 0xb2, 0x6b, 0x2f, 0x88, 0x51, + 0x66, 0xe4, 0x76, 0x94, 0xe0, 0x87, 0xeb, 0x60, 0xd6, 0xd0, 0x4c, 0x44, 0x70, 0x77, 0xb0, 0x4f, + 0x3a, 0x96, 0xd9, 0x75, 0x79, 0x2a, 0x55, 0xdb, 0x8b, 0x82, 0x60, 0x76, 0x5b, 0xee, 0x46, 0x49, + 0x3c, 0xdc, 0x02, 0xf3, 0xc1, 0x01, 0x7c, 0x57, 0x73, 0xa9, 0xe5, 0x0c, 0xb6, 0x34, 0x43, 0xa3, + 0xf5, 0x71, 0xce, 0x53, 0x1f, 0x9e, 0x2c, 0xcf, 0xa3, 0x8c, 0x7e, 0x94, 0x69, 0xd5, 0xfc, 0xf5, + 0x38, 0x98, 0x4d, 0x9c, 0x0b, 0xf0, 0x01, 0x58, 0xe8, 0x78, 0x8e, 0x43, 0x4c, 0xba, 0xe3, 0x19, + 0x87, 0xc4, 0xd9, 0xef, 0x1c, 0x91, 0xae, 0xa7, 0x93, 0x2e, 0x5f, 0xd6, 0x6a, 0xbb, 0x21, 0x7c, + 0x5d, 0xd8, 0xc8, 0x44, 0xa1, 0x1c, 0x6b, 0xf8, 0x2e, 0x80, 0x26, 0x6f, 0xda, 0xd6, 0x5c, 0x37, + 0xe4, 0x2c, 0x71, 0xce, 0x70, 0x2b, 0xee, 0xa4, 0x10, 0x28, 0xc3, 0x8a, 0xf9, 0xd8, 0x25, 0xae, + 0xe6, 0x90, 0x6e, 0xd2, 0xc7, 0xb2, 0xec, 0xe3, 0x66, 0x26, 0x0a, 0xe5, 0x58, 0xc3, 0x37, 0xc0, + 0x94, 0x3f, 0x1a, 0x9f, 0x73, 0xb1, 0x38, 0x73, 0x82, 0x6c, 0x6a, 0x27, 0xea, 0x42, 0x71, 0x1c, + 0x0b, 0xcd, 0x3a, 0x74, 0x89, 0xd3, 0x27, 0xdd, 0x3b, 0xbe, 0x38, 0x60, 0x15, 0xb4, 0xca, 0x2b, + 0x68, 0x18, 0xda, 0x6e, 0x0a, 0x81, 0x32, 0xac, 0x58, 0x68, 0x7e, 0xd6, 0xa4, 0x42, 0x1b, 0x97, + 0x43, 0x3b, 0xc8, 0x44, 0xa1, 0x1c, 0x6b, 0x96, 0x7b, 0xbe, 0xcb, 0xeb, 0x7d, 0xac, 0xe9, 0xf8, + 0x50, 0x27, 0xf5, 0x09, 0x39, 0xf7, 0x76, 0xe4, 0x6e, 0x94, 0xc4, 0xc3, 0x3b, 0xe0, 0x92, 0xdf, + 0x74, 0x60, 0xe2, 0x90, 0xa4, 0xc6, 0x49, 0x5e, 0x10, 0x24, 0x97, 0x76, 0x92, 0x00, 0x94, 0xb6, + 0x81, 0xb7, 0xc0, 0x4c, 0xc7, 0xd2, 0x75, 0x9e, 0x8f, 0x1b, 0x96, 0x67, 0xd2, 0xfa, 0x24, 0x67, + 0x81, 0x6c, 0x0f, 0x6d, 0x48, 0x3d, 0x28, 0x81, 0x84, 0x3f, 0x06, 0xa0, 0x13, 0x14, 0x06, 0xb7, + 0x0e, 0x46, 0x28, 0x80, 0x74, 0x59, 0x8a, 0x2a, 0x73, 0xd8, 0xe4, 0xa2, 0x18, 0x65, 0xf3, 0x43, + 0x05, 0x2c, 0xe6, 0x6c, 0x74, 0xf8, 0x5d, 0xa9, 0x08, 0x5e, 0x4b, 0x14, 0xc1, 0xcb, 0x39, 0x66, + 0xb1, 0x4a, 0x78, 0x04, 0xa6, 0x99, 0x20, 0xd1, 0xcc, 0x9e, 0x0f, 0x11, 0x67, 0x59, 0x2b, 0x37, + 0x00, 0x14, 0x47, 0x47, 0xa7, 0xf2, 0xa5, 0xe1, 0xc9, 0xf2, 0xb4, 0xd4, 0x87, 0x64, 0xe2, 0xe6, + 0x2f, 0x4a, 0x00, 0x6c, 0x12, 0x5b, 0xb7, 0x06, 0x06, 0x31, 0xcf, 0x43, 0xd3, 0xdc, 0x93, 0x34, + 0xcd, 0xcb, 0xf9, 0x4b, 0x12, 0x3a, 0x95, 0x2b, 0x6a, 0xde, 0x4b, 0x88, 0x9a, 0x57, 0x8a, 0x90, + 0x3d, 0x5b, 0xd5, 0x7c, 0x5c, 0x06, 0x73, 0x11, 0x38, 0x92, 0x35, 0xb7, 0xa5, 0x15, 0x7d, 0x39, + 0xb1, 0xa2, 0x8b, 0x19, 0x26, 0x5f, 0x98, 0xae, 0xf9, 0x00, 0xcc, 0x30, 0xd5, 0xe1, 0xaf, 0x1f, + 0xd7, 0x34, 0xe3, 0xa7, 0xd6, 0x34, 0x61, 0x25, 0xda, 0x92, 0x98, 0x50, 0x82, 0x39, 0x47, 0x43, + 0x4d, 0x7c, 0x15, 0x35, 0xd4, 0xef, 0x15, 0x30, 0x13, 0x2d, 0xd3, 0x39, 0x88, 0xa8, 0xbb, 0xb2, + 0x88, 0x7a, 0xb1, 0x40, 0x72, 0xe6, 0xa8, 0xa8, 0x8f, 0x2b, 0x71, 0xd7, 0xb9, 0x8c, 0x5a, 0x61, + 0x57, 0x30, 0x5b, 0xd7, 0x3a, 0xd8, 0x15, 0xf5, 0xf6, 0x82, 0x7f, 0xfd, 0xf2, 0xdb, 0x50, 0xd8, + 0x2b, 0x09, 0xae, 0xd2, 0x17, 0x2b, 0xb8, 0xca, 0xcf, 0x47, 0x70, 0xfd, 0x00, 0xd4, 0xdc, 0x40, + 0x6a, 0x55, 0x38, 0xe5, 0xb5, 0x42, 0x1b, 0x5b, 0xa8, 0xac, 0x90, 0x3a, 0xd4, 0x57, 0x21, 0x5d, + 0x96, 0xb2, 0xaa, 0x7e, 0x99, 0xca, 0x8a, 0x25, 0xba, 0x8d, 0x3d, 0x97, 0x74, 0xf9, 0xa6, 0xaa, + 0x45, 0x89, 0xbe, 0xc7, 0x5b, 0x91, 0xe8, 0x85, 0x07, 0x60, 0xd1, 0x76, 0xac, 0x9e, 0x43, 0x5c, + 0x77, 0x93, 0xe0, 0xae, 0xae, 0x99, 0x24, 0x08, 0xc0, 0xaf, 0x89, 0x97, 0x87, 0x27, 0xcb, 0x8b, + 0x7b, 0xd9, 0x10, 0x94, 0x67, 0xdb, 0xfc, 0x53, 0x05, 0x5c, 0x4c, 0x9e, 0x8d, 0x39, 0x32, 0x45, + 0x39, 0x93, 0x4c, 0xb9, 0x1e, 0xcb, 0x53, 0x5f, 0xc3, 0xc5, 0x9e, 0x0a, 0x52, 0xb9, 0xba, 0x0e, + 0x66, 0x85, 0x2c, 0x09, 0x3a, 0x85, 0x50, 0x0b, 0x97, 0xe7, 0x40, 0xee, 0x46, 0x49, 0x3c, 0xbc, + 0x0d, 0xa6, 0x1d, 0xae, 0xbc, 0x02, 0x02, 0x5f, 0xbd, 0xfc, 0x9f, 0x20, 0x98, 0x46, 0xf1, 0x4e, + 0x24, 0x63, 0x99, 0x72, 0x89, 0x04, 0x49, 0x40, 0x50, 0x91, 0x95, 0xcb, 0x7a, 0x12, 0x80, 0xd2, + 0x36, 0x70, 0x1b, 0xcc, 0x79, 0x66, 0x9a, 0xca, 0xcf, 0xb5, 0xcb, 0x82, 0x6a, 0xee, 0x20, 0x0d, + 0x41, 0x59, 0x76, 0xf0, 0xa1, 0x24, 0x66, 0xc6, 0xf9, 0x79, 0x72, 0xbd, 0xc0, 0x9e, 0x28, 0xac, + 0x66, 0x32, 0xa4, 0x56, 0xad, 0xa8, 0xd4, 0x6a, 0xfe, 0x51, 0x01, 0x30, 0xbd, 0x0f, 0x47, 0xbe, + 0x04, 0xa4, 0x2c, 0x62, 0x15, 0x53, 0xcb, 0xd6, 0x3f, 0x37, 0x0a, 0xea, 0x9f, 0xe8, 0x40, 0x2d, + 0x26, 0x80, 0xc4, 0x44, 0x9f, 0xcf, 0xa3, 0x4e, 0x51, 0x01, 0x14, 0x39, 0xf5, 0x1c, 0x04, 0x50, + 0x8c, 0xec, 0xd9, 0x02, 0xe8, 0x1f, 0x25, 0x30, 0x17, 0x81, 0x0b, 0x0b, 0xa0, 0x0c, 0x93, 0x6f, + 0x1e, 0x76, 0x8a, 0x89, 0x92, 0x68, 0xea, 0xfe, 0x97, 0x44, 0x49, 0xe4, 0x55, 0x8e, 0x28, 0xf9, + 0x6d, 0x29, 0xee, 0xfa, 0x29, 0x45, 0xc9, 0x73, 0x78, 0xe1, 0xf8, 0xca, 0xe9, 0x9a, 0xe6, 0x9f, + 0xcb, 0xe0, 0x62, 0x72, 0x1f, 0x4a, 0x05, 0x52, 0x19, 0x59, 0x20, 0xf7, 0xc0, 0xfc, 0x23, 0x4f, + 0xd7, 0x07, 0x3c, 0x86, 0x58, 0x95, 0xf4, 0x4b, 0xeb, 0xff, 0x0b, 0xcb, 0xf9, 0xef, 0x67, 0x60, + 0x50, 0xa6, 0x65, 0xba, 0x5e, 0x56, 0x3e, 0x6f, 0xbd, 0xac, 0x9e, 0xa1, 0x5e, 0x66, 0x4b, 0x8e, + 0xf2, 0x99, 0x24, 0xc7, 0xe9, 0x8a, 0x65, 0xc6, 0xc1, 0x35, 0xf2, 0xea, 0x3f, 0x54, 0xc0, 0x42, + 0xf6, 0x85, 0x1b, 0xea, 0x60, 0xc6, 0xc0, 0x8f, 0xe3, 0x0f, 0x1f, 0xa3, 0x8a, 0x88, 0x47, 0x35, + 0x5d, 0xf5, 0x3f, 0x19, 0xa9, 0xf7, 0x4c, 0xba, 0xeb, 0xec, 0x53, 0x47, 0x33, 0x7b, 0x7e, 0xe5, + 0xdd, 0x96, 0xb8, 0x50, 0x82, 0x1b, 0xbe, 0x0f, 0x6a, 0x06, 0x7e, 0xbc, 0xef, 0x39, 0xbd, 0xac, + 0x0a, 0x59, 0x6c, 0x1c, 0xbe, 0x01, 0xb6, 0x05, 0x0b, 0x0a, 0xf9, 0x9a, 0x9f, 0x2a, 0x60, 0x31, + 0xa7, 0xaa, 0x7e, 0x8d, 0xa2, 0xdc, 0x05, 0x57, 0xa4, 0x20, 0xd9, 0xae, 0x24, 0x8f, 0x3c, 0x9d, + 0x6f, 0x50, 0x21, 0x64, 0xae, 0x81, 0x49, 0x1b, 0x3b, 0x54, 0x0b, 0x65, 0x70, 0xb5, 0x3d, 0x3d, + 0x3c, 0x59, 0x9e, 0xdc, 0x0b, 0x1a, 0x51, 0xd4, 0xdf, 0xfc, 0x8f, 0x02, 0xaa, 0xfb, 0x1d, 0xac, + 0x93, 0x73, 0x50, 0x12, 0x9b, 0x92, 0x92, 0xc8, 0x7f, 0xa5, 0xe7, 0xfe, 0xe4, 0x8a, 0x88, 0xad, + 0x84, 0x88, 0x78, 0x69, 0x04, 0xcf, 0xb3, 0xf5, 0xc3, 0xdb, 0x60, 0x32, 0x1c, 0xee, 0x74, 0x87, + 0x5b, 0xf3, 0x37, 0x25, 0x30, 0x15, 0x1b, 0xe2, 0x94, 0x47, 0xe3, 0x43, 0xa9, 0x1e, 0xb0, 0x4d, + 0xbf, 0x56, 0x24, 0x10, 0x35, 0x38, 0xfb, 0xdf, 0x31, 0xa9, 0x13, 0xbf, 0x3c, 0xa6, 0x4b, 0xc2, + 0x77, 0xc0, 0x0c, 0xc5, 0x4e, 0x8f, 0xd0, 0xa0, 0x8f, 0x4f, 0xd8, 0x64, 0xf4, 0x98, 0x72, 0x5f, + 0xea, 0x45, 0x09, 0xf4, 0xd2, 0x6d, 0x30, 0x2d, 0x0d, 0x06, 0x2f, 0x82, 0xf2, 0x31, 0x19, 0xf8, + 0x92, 0x0a, 0xb1, 0x3f, 0xe1, 0x3c, 0xa8, 0xf6, 0xb1, 0xee, 0xf9, 0x79, 0x3e, 0x89, 0xfc, 0x1f, + 0xb7, 0x4a, 0x6f, 0x29, 0xcd, 0x5f, 0xb2, 0xc9, 0x89, 0x92, 0xf3, 0x1c, 0xb2, 0xeb, 0x5d, 0x29, + 0xbb, 0xf2, 0x3f, 0x18, 0xc6, 0xb7, 0x4c, 0x5e, 0x8e, 0xa1, 0x44, 0x8e, 0xbd, 0x5a, 0x88, 0xed, + 0xd9, 0x99, 0xf6, 0xcf, 0x12, 0x98, 0x8f, 0xa1, 0x23, 0xa9, 0xfa, 0x6d, 0x49, 0xaa, 0xae, 0x24, + 0xa4, 0x6a, 0x3d, 0xcb, 0xe6, 0x1b, 0xad, 0x3a, 0x5a, 0xab, 0xfe, 0x41, 0x01, 0xb3, 0xb1, 0xb9, + 0x3b, 0x07, 0xb1, 0x7a, 0x4f, 0x16, 0xab, 0x2f, 0x15, 0x49, 0x9a, 0x1c, 0xb5, 0xfa, 0x97, 0xaa, + 0xe4, 0xfc, 0xd7, 0xfe, 0x0d, 0xed, 0xa7, 0x60, 0xbe, 0x6f, 0xe9, 0x9e, 0x41, 0x36, 0x74, 0xac, + 0x19, 0x01, 0x80, 0xa9, 0xbb, 0x72, 0xf2, 0x9e, 0x18, 0xd2, 0x13, 0xc7, 0xd5, 0x5c, 0x4a, 0x4c, + 0xfa, 0x20, 0xb2, 0x8c, 0x34, 0xe5, 0x83, 0x0c, 0x3a, 0x94, 0x39, 0x08, 0x7c, 0x03, 0x4c, 0x31, + 0x55, 0xa6, 0x75, 0xc8, 0x0e, 0x36, 0x82, 0xc4, 0x0a, 0x3f, 0x8f, 0xed, 0x47, 0x5d, 0x28, 0x8e, + 0x83, 0x47, 0x60, 0xce, 0xb6, 0xba, 0xdb, 0xd8, 0xc4, 0x3d, 0xc2, 0x64, 0xc6, 0x9e, 0xa5, 0x6b, + 0x9d, 0x01, 0x7f, 0x58, 0x9b, 0x6c, 0xbf, 0x19, 0x3c, 0x9a, 0xec, 0xa5, 0x21, 0xec, 0x02, 0x9a, + 0xd1, 0xcc, 0x37, 0x75, 0x16, 0x25, 0x74, 0x52, 0x9f, 0x74, 0xfd, 0x27, 0xed, 0xb5, 0x22, 0x19, + 0x76, 0xc6, 0x8f, 0xba, 0x79, 0xef, 0x86, 0xb5, 0x33, 0x7d, 0x91, 0xfd, 0x57, 0x05, 0x5c, 0x4a, + 0x1d, 0x95, 0x5f, 0xe2, 0xcb, 0x5d, 0xea, 0x1a, 0x51, 0x3e, 0xc5, 0x35, 0x62, 0x1d, 0xcc, 0x8a, + 0x8f, 0xc1, 0x89, 0x5b, 0x48, 0x78, 0x1b, 0xdc, 0x90, 0xbb, 0x51, 0x12, 0x9f, 0xf5, 0x72, 0x58, + 0x3d, 0xe5, 0xcb, 0x61, 0xdc, 0x0b, 0xf1, 0xcf, 0x4d, 0x7e, 0xea, 0xa5, 0xbd, 0x10, 0xff, 0xe3, + 0x94, 0xc4, 0x33, 0x85, 0xe0, 0xb3, 0x86, 0x0c, 0x13, 0xb2, 0x42, 0x38, 0x90, 0x7a, 0x51, 0x02, + 0xfd, 0xb9, 0x3e, 0x78, 0xe2, 0x8c, 0x0f, 0x9e, 0xab, 0x45, 0xf2, 0xb9, 0xf8, 0xbd, 0xe7, 0xaf, + 0x0a, 0x78, 0x21, 0x77, 0x23, 0xc0, 0x75, 0xa9, 0xec, 0xae, 0x26, 0xca, 0xee, 0xb7, 0x72, 0x0d, + 0x63, 0xb5, 0xd7, 0xc9, 0x7e, 0xf6, 0x7b, 0xbb, 0xd8, 0xb3, 0x5f, 0x86, 0x76, 0x1f, 0xfd, 0xfe, + 0xd7, 0x5e, 0x7d, 0xf2, 0xb4, 0x31, 0xf6, 0xd1, 0xd3, 0xc6, 0xd8, 0x27, 0x4f, 0x1b, 0x63, 0x3f, + 0x1b, 0x36, 0x94, 0x27, 0xc3, 0x86, 0xf2, 0xd1, 0xb0, 0xa1, 0x7c, 0x32, 0x6c, 0x28, 0x7f, 0x1b, + 0x36, 0x94, 0x5f, 0x7d, 0xda, 0x18, 0x7b, 0x7f, 0x42, 0x8c, 0xf8, 0xdf, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xd0, 0xf7, 0x24, 0x13, 0x48, 0x29, 0x00, 0x00, } func (m *ControllerRevision) Marshal() (dAtA []byte, err error) { @@ -2133,6 +2133,18 @@ func (m *RollingUpdateDaemonSet) MarshalToSizedBuffer(dAtA []byte) (int, error) _ = i var l int _ = l + if m.MaxSurge != nil { + { + size, err := m.MaxSurge.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } if m.MaxUnavailable != nil { { size, err := m.MaxUnavailable.MarshalToSizedBuffer(dAtA[:i]) @@ -3081,6 +3093,10 @@ func (m *RollingUpdateDaemonSet) Size() (n int) { l = m.MaxUnavailable.Size() n += 1 + l + sovGenerated(uint64(l)) } + if m.MaxSurge != nil { + l = m.MaxSurge.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -3583,6 +3599,7 @@ func (this *RollingUpdateDaemonSet) String() string { } s := strings.Join([]string{`&RollingUpdateDaemonSet{`, `MaxUnavailable:` + strings.Replace(fmt.Sprintf("%v", this.MaxUnavailable), "IntOrString", "intstr.IntOrString", 1) + `,`, + `MaxSurge:` + strings.Replace(fmt.Sprintf("%v", this.MaxSurge), "IntOrString", "intstr.IntOrString", 1) + `,`, `}`, }, "") return s @@ -3878,10 +3895,7 @@ func (m *ControllerRevision) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3998,10 +4012,7 @@ func (m *ControllerRevisionList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4150,10 +4161,7 @@ func (m *DaemonSet) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4364,10 +4372,7 @@ func (m *DaemonSetCondition) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4484,10 +4489,7 @@ func (m *DaemonSetList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4678,10 +4680,7 @@ func (m *DaemonSetSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4937,10 +4936,7 @@ func (m *DaemonSetStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5058,10 +5054,7 @@ func (m *DaemonSetUpdateStrategy) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5210,10 +5203,7 @@ func (m *Deployment) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5457,10 +5447,7 @@ func (m *DeploymentCondition) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5577,10 +5564,7 @@ func (m *DeploymentList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5831,10 +5815,7 @@ func (m *DeploymentSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -6052,10 +6033,7 @@ func (m *DeploymentStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -6173,10 +6151,7 @@ func (m *DeploymentStrategy) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -6325,10 +6300,7 @@ func (m *ReplicaSet) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -6539,10 +6511,7 @@ func (m *ReplicaSetCondition) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -6659,10 +6628,7 @@ func (m *ReplicaSetList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -6820,10 +6786,7 @@ func (m *ReplicaSetSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -7002,10 +6965,7 @@ func (m *ReplicaSetStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -7085,16 +7045,49 @@ func (m *RollingUpdateDaemonSet) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MaxSurge", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.MaxSurge == nil { + m.MaxSurge = &intstr.IntOrString{} + } + if err := m.MaxSurge.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -7216,10 +7209,7 @@ func (m *RollingUpdateDeployment) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -7289,10 +7279,7 @@ func (m *RollingUpdateStatefulSetStrategy) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -7441,10 +7428,7 @@ func (m *Scale) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -7513,10 +7497,7 @@ func (m *ScaleSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -7695,7 +7676,7 @@ func (m *ScaleStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -7744,10 +7725,7 @@ func (m *ScaleStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -7896,10 +7874,7 @@ func (m *StatefulSet) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -8110,10 +8085,7 @@ func (m *StatefulSetCondition) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -8230,10 +8202,7 @@ func (m *StatefulSetList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -8523,10 +8492,7 @@ func (m *StatefulSetSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -8789,10 +8755,7 @@ func (m *StatefulSetStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -8910,10 +8873,7 @@ func (m *StatefulSetUpdateStrategy) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/api/apps/v1beta2/generated.proto b/vendor/k8s.io/api/apps/v1beta2/generated.proto index 1ea7e23a8121..ff306ba6a9a9 100644 --- a/vendor/k8s.io/api/apps/v1beta2/generated.proto +++ b/vendor/k8s.io/api/apps/v1beta2/generated.proto @@ -487,19 +487,41 @@ message RollingUpdateDaemonSet { // The maximum number of DaemonSet pods that can be unavailable during the // update. Value can be an absolute number (ex: 5) or a percentage of total // number of DaemonSet pods at the start of the update (ex: 10%). Absolute - // number is calculated from percentage by rounding up. - // This cannot be 0. + // number is calculated from percentage by rounding down to a minimum of one. + // This cannot be 0 if MaxSurge is 0 // Default value is 1. // Example: when this is set to 30%, at most 30% of the total number of nodes // that should be running the daemon pod (i.e. status.desiredNumberScheduled) - // can have their pods stopped for an update at any given - // time. The update starts by stopping at most 30% of those DaemonSet pods - // and then brings up new DaemonSet pods in their place. Once the new pods - // are available, it then proceeds onto other DaemonSet pods, thus ensuring - // that at least 70% of original number of DaemonSet pods are available at - // all times during the update. + // can have their pods stopped for an update at any given time. The update + // starts by stopping at most 30% of those DaemonSet pods and then brings + // up new DaemonSet pods in their place. Once the new pods are available, + // it then proceeds onto other DaemonSet pods, thus ensuring that at least + // 70% of original number of DaemonSet pods are available at all times during + // the update. // +optional optional k8s.io.apimachinery.pkg.util.intstr.IntOrString maxUnavailable = 1; + + // The maximum number of nodes with an existing available DaemonSet pod that + // can have an updated DaemonSet pod during during an update. + // Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). + // This can not be 0 if MaxUnavailable is 0. + // Absolute number is calculated from percentage by rounding up to a minimum of 1. + // Default value is 0. + // Example: when this is set to 30%, at most 30% of the total number of nodes + // that should be running the daemon pod (i.e. status.desiredNumberScheduled) + // can have their a new pod created before the old pod is marked as deleted. + // The update starts by launching new pods on 30% of nodes. Once an updated + // pod is available (Ready for at least minReadySeconds) the old DaemonSet pod + // on that node is marked deleted. If the old pod becomes unavailable for any + // reason (Ready transitions to false, is evicted, or is drained) an updated + // pod is immediatedly created on that node without considering surge limits. + // Allowing surge implies the possibility that the resources consumed by the + // daemonset on any given node can double if the readiness check fails, and + // so resource intensive daemonsets should take into account that they may + // cause evictions during disruption. + // This is an alpha field and requires enabling DaemonSetUpdateSurge feature gate. + // +optional + optional k8s.io.apimachinery.pkg.util.intstr.IntOrString maxSurge = 2; } // Spec to control the desired behavior of rolling update. diff --git a/vendor/k8s.io/api/apps/v1beta2/types.go b/vendor/k8s.io/api/apps/v1beta2/types.go index fc542ac1c872..316a0ad24d25 100644 --- a/vendor/k8s.io/api/apps/v1beta2/types.go +++ b/vendor/k8s.io/api/apps/v1beta2/types.go @@ -554,19 +554,41 @@ type RollingUpdateDaemonSet struct { // The maximum number of DaemonSet pods that can be unavailable during the // update. Value can be an absolute number (ex: 5) or a percentage of total // number of DaemonSet pods at the start of the update (ex: 10%). Absolute - // number is calculated from percentage by rounding up. - // This cannot be 0. + // number is calculated from percentage by rounding down to a minimum of one. + // This cannot be 0 if MaxSurge is 0 // Default value is 1. // Example: when this is set to 30%, at most 30% of the total number of nodes // that should be running the daemon pod (i.e. status.desiredNumberScheduled) - // can have their pods stopped for an update at any given - // time. The update starts by stopping at most 30% of those DaemonSet pods - // and then brings up new DaemonSet pods in their place. Once the new pods - // are available, it then proceeds onto other DaemonSet pods, thus ensuring - // that at least 70% of original number of DaemonSet pods are available at - // all times during the update. + // can have their pods stopped for an update at any given time. The update + // starts by stopping at most 30% of those DaemonSet pods and then brings + // up new DaemonSet pods in their place. Once the new pods are available, + // it then proceeds onto other DaemonSet pods, thus ensuring that at least + // 70% of original number of DaemonSet pods are available at all times during + // the update. // +optional MaxUnavailable *intstr.IntOrString `json:"maxUnavailable,omitempty" protobuf:"bytes,1,opt,name=maxUnavailable"` + + // The maximum number of nodes with an existing available DaemonSet pod that + // can have an updated DaemonSet pod during during an update. + // Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). + // This can not be 0 if MaxUnavailable is 0. + // Absolute number is calculated from percentage by rounding up to a minimum of 1. + // Default value is 0. + // Example: when this is set to 30%, at most 30% of the total number of nodes + // that should be running the daemon pod (i.e. status.desiredNumberScheduled) + // can have their a new pod created before the old pod is marked as deleted. + // The update starts by launching new pods on 30% of nodes. Once an updated + // pod is available (Ready for at least minReadySeconds) the old DaemonSet pod + // on that node is marked deleted. If the old pod becomes unavailable for any + // reason (Ready transitions to false, is evicted, or is drained) an updated + // pod is immediatedly created on that node without considering surge limits. + // Allowing surge implies the possibility that the resources consumed by the + // daemonset on any given node can double if the readiness check fails, and + // so resource intensive daemonsets should take into account that they may + // cause evictions during disruption. + // This is an alpha field and requires enabling DaemonSetUpdateSurge feature gate. + // +optional + MaxSurge *intstr.IntOrString `json:"maxSurge,omitempty" protobuf:"bytes,2,opt,name=maxSurge"` } // DaemonSetSpec is the specification of a daemon set. diff --git a/vendor/k8s.io/api/apps/v1beta2/types_swagger_doc_generated.go b/vendor/k8s.io/api/apps/v1beta2/types_swagger_doc_generated.go index 822158a186be..51d552234843 100644 --- a/vendor/k8s.io/api/apps/v1beta2/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/apps/v1beta2/types_swagger_doc_generated.go @@ -262,7 +262,8 @@ func (ReplicaSetStatus) SwaggerDoc() map[string]string { var map_RollingUpdateDaemonSet = map[string]string{ "": "Spec to control the desired behavior of daemon set rolling update.", - "maxUnavailable": "The maximum number of DaemonSet pods that can be unavailable during the update. Value can be an absolute number (ex: 5) or a percentage of total number of DaemonSet pods at the start of the update (ex: 10%). Absolute number is calculated from percentage by rounding up. This cannot be 0. Default value is 1. Example: when this is set to 30%, at most 30% of the total number of nodes that should be running the daemon pod (i.e. status.desiredNumberScheduled) can have their pods stopped for an update at any given time. The update starts by stopping at most 30% of those DaemonSet pods and then brings up new DaemonSet pods in their place. Once the new pods are available, it then proceeds onto other DaemonSet pods, thus ensuring that at least 70% of original number of DaemonSet pods are available at all times during the update.", + "maxUnavailable": "The maximum number of DaemonSet pods that can be unavailable during the update. Value can be an absolute number (ex: 5) or a percentage of total number of DaemonSet pods at the start of the update (ex: 10%). Absolute number is calculated from percentage by rounding down to a minimum of one. This cannot be 0 if MaxSurge is 0 Default value is 1. Example: when this is set to 30%, at most 30% of the total number of nodes that should be running the daemon pod (i.e. status.desiredNumberScheduled) can have their pods stopped for an update at any given time. The update starts by stopping at most 30% of those DaemonSet pods and then brings up new DaemonSet pods in their place. Once the new pods are available, it then proceeds onto other DaemonSet pods, thus ensuring that at least 70% of original number of DaemonSet pods are available at all times during the update.", + "maxSurge": "The maximum number of nodes with an existing available DaemonSet pod that can have an updated DaemonSet pod during during an update. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). This can not be 0 if MaxUnavailable is 0. Absolute number is calculated from percentage by rounding up to a minimum of 1. Default value is 0. Example: when this is set to 30%, at most 30% of the total number of nodes that should be running the daemon pod (i.e. status.desiredNumberScheduled) can have their a new pod created before the old pod is marked as deleted. The update starts by launching new pods on 30% of nodes. Once an updated pod is available (Ready for at least minReadySeconds) the old DaemonSet pod on that node is marked deleted. If the old pod becomes unavailable for any reason (Ready transitions to false, is evicted, or is drained) an updated pod is immediatedly created on that node without considering surge limits. Allowing surge implies the possibility that the resources consumed by the daemonset on any given node can double if the readiness check fails, and so resource intensive daemonsets should take into account that they may cause evictions during disruption. This is an alpha field and requires enabling DaemonSetUpdateSurge feature gate.", } func (RollingUpdateDaemonSet) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/api/apps/v1beta2/zz_generated.deepcopy.go b/vendor/k8s.io/api/apps/v1beta2/zz_generated.deepcopy.go index 127bf095f492..0a84d1b08a8a 100644 --- a/vendor/k8s.io/api/apps/v1beta2/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/apps/v1beta2/zz_generated.deepcopy.go @@ -544,6 +544,11 @@ func (in *RollingUpdateDaemonSet) DeepCopyInto(out *RollingUpdateDaemonSet) { *out = new(intstr.IntOrString) **out = **in } + if in.MaxSurge != nil { + in, out := &in.MaxSurge, &out.MaxSurge + *out = new(intstr.IntOrString) + **out = **in + } return } diff --git a/vendor/k8s.io/api/authentication/v1/BUILD b/vendor/k8s.io/api/authentication/v1/BUILD deleted file mode 100644 index de7f94409063..000000000000 --- a/vendor/k8s.io/api/authentication/v1/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/api/authentication/v1", - importpath = "k8s.io/api/authentication/v1", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/api/authentication/v1/generated.pb.go b/vendor/k8s.io/api/authentication/v1/generated.pb.go index 6524f8ca96e3..89e7e920467f 100644 --- a/vendor/k8s.io/api/authentication/v1/generated.pb.go +++ b/vendor/k8s.io/api/authentication/v1/generated.pb.go @@ -316,64 +316,64 @@ func init() { } var fileDescriptor_2953ea822e7ffe1e = []byte{ - // 903 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x55, 0xcf, 0x6f, 0xe3, 0x44, - 0x14, 0x8e, 0xf3, 0xa3, 0x4a, 0x26, 0xdb, 0xd2, 0xce, 0xb2, 0x52, 0x54, 0x20, 0x2e, 0x5e, 0x09, - 0x55, 0xc0, 0xda, 0x9b, 0x08, 0xc1, 0x6a, 0x91, 0x90, 0x6a, 0x1a, 0x41, 0x84, 0x60, 0x57, 0xb3, - 0xdb, 0x82, 0x38, 0x31, 0xb1, 0x5f, 0x53, 0x13, 0x3c, 0x36, 0xf6, 0x38, 0x6c, 0x6e, 0xfb, 0x27, - 0x70, 0x04, 0x89, 0x03, 0x7f, 0x04, 0x12, 0xff, 0x42, 0x8f, 0x2b, 0x4e, 0x3d, 0xa0, 0x88, 0x9a, - 0x2b, 0x47, 0x4e, 0x9c, 0xd0, 0x8c, 0xa7, 0x71, 0x9c, 0xb4, 0x69, 0x4e, 0x7b, 0x8b, 0xdf, 0xfb, - 0xde, 0xf7, 0xde, 0xfb, 0xe6, 0xcb, 0x0c, 0xea, 0x8d, 0x1e, 0xc4, 0xa6, 0x17, 0x58, 0xa3, 0x64, - 0x00, 0x11, 0x03, 0x0e, 0xb1, 0x35, 0x06, 0xe6, 0x06, 0x91, 0xa5, 0x12, 0x34, 0xf4, 0x2c, 0x9a, - 0xf0, 0x53, 0x60, 0xdc, 0x73, 0x28, 0xf7, 0x02, 0x66, 0x8d, 0x3b, 0xd6, 0x10, 0x18, 0x44, 0x94, - 0x83, 0x6b, 0x86, 0x51, 0xc0, 0x03, 0xfc, 0x7a, 0x86, 0x36, 0x69, 0xe8, 0x99, 0x45, 0xb4, 0x39, - 0xee, 0xec, 0xde, 0x1b, 0x7a, 0xfc, 0x34, 0x19, 0x98, 0x4e, 0xe0, 0x5b, 0xc3, 0x60, 0x18, 0x58, - 0xb2, 0x68, 0x90, 0x9c, 0xc8, 0x2f, 0xf9, 0x21, 0x7f, 0x65, 0x64, 0xbb, 0xef, 0xe5, 0xad, 0x7d, - 0xea, 0x9c, 0x7a, 0x0c, 0xa2, 0x89, 0x15, 0x8e, 0x86, 0x22, 0x10, 0x5b, 0x3e, 0x70, 0x7a, 0xc5, - 0x08, 0xbb, 0xd6, 0x75, 0x55, 0x51, 0xc2, 0xb8, 0xe7, 0xc3, 0x52, 0xc1, 0xfb, 0x37, 0x15, 0xc4, - 0xce, 0x29, 0xf8, 0x74, 0xb1, 0xce, 0xf8, 0x43, 0x43, 0xaf, 0xda, 0x41, 0xc2, 0xdc, 0x47, 0x83, - 0x6f, 0xc1, 0xe1, 0x04, 0x4e, 0x20, 0x02, 0xe6, 0x00, 0xde, 0x43, 0xd5, 0x91, 0xc7, 0xdc, 0x96, - 0xb6, 0xa7, 0xed, 0x37, 0xec, 0x5b, 0x67, 0x53, 0xbd, 0x94, 0x4e, 0xf5, 0xea, 0x67, 0x1e, 0x73, - 0x89, 0xcc, 0xe0, 0x2e, 0x42, 0xf4, 0x71, 0xff, 0x18, 0xa2, 0xd8, 0x0b, 0x58, 0xab, 0x2c, 0x71, - 0x58, 0xe1, 0xd0, 0xc1, 0x2c, 0x43, 0xe6, 0x50, 0x82, 0x95, 0x51, 0x1f, 0x5a, 0x95, 0x22, 0xeb, - 0x17, 0xd4, 0x07, 0x22, 0x33, 0xd8, 0x46, 0x95, 0xa4, 0x7f, 0xd8, 0xaa, 0x4a, 0xc0, 0x7d, 0x05, - 0xa8, 0x1c, 0xf5, 0x0f, 0xff, 0x9b, 0xea, 0x6f, 0x5e, 0xb7, 0x24, 0x9f, 0x84, 0x10, 0x9b, 0x47, - 0xfd, 0x43, 0x22, 0x8a, 0x8d, 0x0f, 0x10, 0xea, 0x3d, 0xe3, 0x11, 0x3d, 0xa6, 0xdf, 0x25, 0x80, - 0x75, 0x54, 0xf3, 0x38, 0xf8, 0x71, 0x4b, 0xdb, 0xab, 0xec, 0x37, 0xec, 0x46, 0x3a, 0xd5, 0x6b, - 0x7d, 0x11, 0x20, 0x59, 0xfc, 0x61, 0xfd, 0xa7, 0x5f, 0xf5, 0xd2, 0xf3, 0x3f, 0xf7, 0x4a, 0xc6, - 0x2f, 0x65, 0x74, 0xeb, 0x69, 0x30, 0x02, 0x46, 0xe0, 0xfb, 0x04, 0x62, 0x8e, 0xbf, 0x41, 0x75, - 0x71, 0x44, 0x2e, 0xe5, 0x54, 0x2a, 0xd1, 0xec, 0xde, 0x37, 0x73, 0x77, 0xcc, 0x86, 0x30, 0xc3, - 0xd1, 0x50, 0x04, 0x62, 0x53, 0xa0, 0xcd, 0x71, 0xc7, 0xcc, 0xe4, 0xfc, 0x1c, 0x38, 0xcd, 0x35, - 0xc9, 0x63, 0x64, 0xc6, 0x8a, 0x1f, 0xa3, 0x6a, 0x1c, 0x82, 0x23, 0xf5, 0x6b, 0x76, 0x4d, 0x73, - 0x95, 0xf7, 0xcc, 0xf9, 0xd9, 0x9e, 0x84, 0xe0, 0xe4, 0x0a, 0x8a, 0x2f, 0x22, 0x99, 0xf0, 0x57, - 0x68, 0x23, 0xe6, 0x94, 0x27, 0xb1, 0x54, 0xb9, 0x38, 0xf1, 0x4d, 0x9c, 0xb2, 0xce, 0xde, 0x52, - 0xac, 0x1b, 0xd9, 0x37, 0x51, 0x7c, 0xc6, 0xbf, 0x1a, 0xda, 0x5e, 0x1c, 0x01, 0xbf, 0x83, 0x1a, - 0x34, 0x71, 0x3d, 0x61, 0x9a, 0x4b, 0x89, 0x37, 0xd3, 0xa9, 0xde, 0x38, 0xb8, 0x0c, 0x92, 0x3c, - 0x8f, 0x3f, 0x46, 0x3b, 0xf0, 0x2c, 0xf4, 0x22, 0xd9, 0xfd, 0x09, 0x38, 0x01, 0x73, 0x63, 0x79, - 0xd6, 0x15, 0xfb, 0x4e, 0x3a, 0xd5, 0x77, 0x7a, 0x8b, 0x49, 0xb2, 0x8c, 0xc7, 0x0c, 0x6d, 0x0d, - 0x0a, 0x96, 0x55, 0x8b, 0x76, 0x57, 0x2f, 0x7a, 0x95, 0xcd, 0x6d, 0x9c, 0x4e, 0xf5, 0xad, 0x62, - 0x86, 0x2c, 0xb0, 0x1b, 0xbf, 0x69, 0x08, 0x2f, 0xab, 0x84, 0xef, 0xa2, 0x1a, 0x17, 0x51, 0xf5, - 0x17, 0xd9, 0x54, 0xa2, 0xd5, 0x32, 0x68, 0x96, 0xc3, 0x13, 0x74, 0x3b, 0x5f, 0xe0, 0xa9, 0xe7, - 0x43, 0xcc, 0xa9, 0x1f, 0xaa, 0xd3, 0x7e, 0x7b, 0x3d, 0x2f, 0x89, 0x32, 0xfb, 0x35, 0x45, 0x7f, - 0xbb, 0xb7, 0x4c, 0x47, 0xae, 0xea, 0x61, 0xfc, 0x5c, 0x46, 0x4d, 0x35, 0xf6, 0xd8, 0x83, 0x1f, - 0x5e, 0x82, 0x97, 0x1f, 0x15, 0xbc, 0x7c, 0x6f, 0x2d, 0xdf, 0x89, 0xd1, 0xae, 0xb5, 0xf2, 0x97, - 0x0b, 0x56, 0xb6, 0xd6, 0xa7, 0x5c, 0xed, 0x64, 0x07, 0xbd, 0xb2, 0xd0, 0x7f, 0xbd, 0xe3, 0x2c, - 0x98, 0xbd, 0xbc, 0xda, 0xec, 0xc6, 0x3f, 0x1a, 0xda, 0x59, 0x1a, 0x09, 0x7f, 0x88, 0x36, 0xe7, - 0x26, 0x87, 0xec, 0x86, 0xad, 0xdb, 0x77, 0x54, 0xbf, 0xcd, 0x83, 0xf9, 0x24, 0x29, 0x62, 0xf1, - 0xa7, 0xa8, 0x9a, 0xc4, 0x10, 0x29, 0x85, 0xdf, 0x5a, 0x2d, 0xc7, 0x51, 0x0c, 0x51, 0x9f, 0x9d, - 0x04, 0xb9, 0xb4, 0x22, 0x42, 0x24, 0x43, 0x71, 0x93, 0xea, 0x0d, 0x7f, 0xdb, 0xbb, 0xa8, 0x06, - 0x51, 0x14, 0x44, 0xea, 0xde, 0x9e, 0x69, 0xd3, 0x13, 0x41, 0x92, 0xe5, 0x8c, 0xdf, 0xcb, 0xa8, - 0x7e, 0xd9, 0x12, 0xbf, 0x8b, 0xea, 0xa2, 0x8d, 0xbc, 0xec, 0x33, 0x41, 0xb7, 0x55, 0x91, 0xc4, - 0x88, 0x38, 0x99, 0x21, 0xf0, 0x1b, 0xa8, 0x92, 0x78, 0xae, 0x7a, 0x43, 0x9a, 0x73, 0x97, 0x3e, - 0x11, 0x71, 0x6c, 0xa0, 0x8d, 0x61, 0x14, 0x24, 0xa1, 0xb0, 0x81, 0x18, 0x14, 0x89, 0x13, 0xfd, - 0x44, 0x46, 0x88, 0xca, 0xe0, 0x63, 0x54, 0x03, 0x71, 0xe7, 0xcb, 0x5d, 0x9a, 0xdd, 0xce, 0x7a, - 0xd2, 0x98, 0xf2, 0x9d, 0xe8, 0x31, 0x1e, 0x4d, 0xe6, 0xb6, 0x12, 0x31, 0x92, 0xd1, 0xed, 0x0e, - 0xd4, 0x5b, 0x22, 0x31, 0x78, 0x1b, 0x55, 0x46, 0x30, 0xc9, 0x36, 0x22, 0xe2, 0x27, 0xfe, 0x08, - 0xd5, 0xc6, 0xe2, 0x99, 0x51, 0x47, 0xb2, 0xbf, 0xba, 0x6f, 0xfe, 0x2c, 0x91, 0xac, 0xec, 0x61, - 0xf9, 0x81, 0x66, 0xef, 0x9f, 0x5d, 0xb4, 0x4b, 0x2f, 0x2e, 0xda, 0xa5, 0xf3, 0x8b, 0x76, 0xe9, - 0x79, 0xda, 0xd6, 0xce, 0xd2, 0xb6, 0xf6, 0x22, 0x6d, 0x6b, 0xe7, 0x69, 0x5b, 0xfb, 0x2b, 0x6d, - 0x6b, 0x3f, 0xfe, 0xdd, 0x2e, 0x7d, 0x5d, 0x1e, 0x77, 0xfe, 0x0f, 0x00, 0x00, 0xff, 0xff, 0x8c, - 0x44, 0x87, 0xd0, 0xe2, 0x08, 0x00, 0x00, + // 906 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x55, 0xcf, 0x6f, 0xe3, 0xc4, + 0x17, 0x8f, 0xf3, 0xa3, 0x4a, 0x26, 0xdb, 0x7e, 0xdb, 0xd9, 0xef, 0x4a, 0x51, 0x81, 0xa4, 0x78, + 0x25, 0x54, 0x01, 0x6b, 0x6f, 0x22, 0x04, 0xab, 0x45, 0x42, 0xaa, 0x69, 0x04, 0x11, 0x82, 0x5d, + 0xcd, 0x6e, 0x0b, 0xe2, 0xc4, 0xc4, 0x7e, 0x4d, 0x87, 0xe0, 0xb1, 0xb1, 0xc7, 0x61, 0x73, 0xdb, + 0x3f, 0x81, 0x23, 0x48, 0x1c, 0xf8, 0x23, 0x90, 0xf8, 0x17, 0x7a, 0x5c, 0x71, 0xda, 0x03, 0x8a, + 0xa8, 0xb9, 0x72, 0xe4, 0xc4, 0x09, 0xcd, 0x78, 0x5a, 0xc7, 0x49, 0x9b, 0xe6, 0xc4, 0x2d, 0x7e, + 0xef, 0xf3, 0x3e, 0xef, 0xbd, 0xcf, 0x7c, 0x32, 0x83, 0xfa, 0xe3, 0x07, 0xb1, 0xc5, 0x02, 0x7b, + 0x9c, 0x0c, 0x21, 0xe2, 0x20, 0x20, 0xb6, 0x27, 0xc0, 0xbd, 0x20, 0xb2, 0x75, 0x82, 0x86, 0xcc, + 0xa6, 0x89, 0x38, 0x05, 0x2e, 0x98, 0x4b, 0x05, 0x0b, 0xb8, 0x3d, 0xe9, 0xda, 0x23, 0xe0, 0x10, + 0x51, 0x01, 0x9e, 0x15, 0x46, 0x81, 0x08, 0xf0, 0xab, 0x19, 0xda, 0xa2, 0x21, 0xb3, 0x8a, 0x68, + 0x6b, 0xd2, 0xdd, 0xbd, 0x37, 0x62, 0xe2, 0x34, 0x19, 0x5a, 0x6e, 0xe0, 0xdb, 0xa3, 0x60, 0x14, + 0xd8, 0xaa, 0x68, 0x98, 0x9c, 0xa8, 0x2f, 0xf5, 0xa1, 0x7e, 0x65, 0x64, 0xbb, 0xef, 0xe4, 0xad, + 0x7d, 0xea, 0x9e, 0x32, 0x0e, 0xd1, 0xd4, 0x0e, 0xc7, 0x23, 0x19, 0x88, 0x6d, 0x1f, 0x04, 0xbd, + 0x62, 0x84, 0x5d, 0xfb, 0xba, 0xaa, 0x28, 0xe1, 0x82, 0xf9, 0xb0, 0x54, 0xf0, 0xee, 0x4d, 0x05, + 0xb1, 0x7b, 0x0a, 0x3e, 0x5d, 0xac, 0x33, 0x7f, 0x33, 0xd0, 0xff, 0x9d, 0x20, 0xe1, 0xde, 0xa3, + 0xe1, 0xd7, 0xe0, 0x0a, 0x02, 0x27, 0x10, 0x01, 0x77, 0x01, 0xef, 0xa1, 0xea, 0x98, 0x71, 0xaf, + 0x65, 0xec, 0x19, 0xfb, 0x0d, 0xe7, 0xd6, 0xd9, 0xac, 0x53, 0x4a, 0x67, 0x9d, 0xea, 0x27, 0x8c, + 0x7b, 0x44, 0x65, 0x70, 0x0f, 0x21, 0x1a, 0xb2, 0x63, 0x88, 0x62, 0x16, 0xf0, 0x56, 0x59, 0xe1, + 0xb0, 0xc6, 0xa1, 0x83, 0xc7, 0x03, 0x9d, 0x21, 0x73, 0x28, 0xc9, 0xca, 0xa9, 0x0f, 0xad, 0x4a, + 0x91, 0xf5, 0x33, 0xea, 0x03, 0x51, 0x19, 0xec, 0xa0, 0x4a, 0x32, 0x38, 0x6c, 0x55, 0x15, 0xe0, + 0xbe, 0x06, 0x54, 0x8e, 0x06, 0x87, 0xff, 0xcc, 0x3a, 0xaf, 0x5f, 0xb7, 0xa4, 0x98, 0x86, 0x10, + 0x5b, 0x47, 0x83, 0x43, 0x22, 0x8b, 0xcd, 0xf7, 0x10, 0xea, 0x3f, 0x13, 0x11, 0x3d, 0xa6, 0xdf, + 0x24, 0x80, 0x3b, 0xa8, 0xc6, 0x04, 0xf8, 0x71, 0xcb, 0xd8, 0xab, 0xec, 0x37, 0x9c, 0x46, 0x3a, + 0xeb, 0xd4, 0x06, 0x32, 0x40, 0xb2, 0xf8, 0xc3, 0xfa, 0x0f, 0x3f, 0x77, 0x4a, 0xcf, 0x7f, 0xdf, + 0x2b, 0x99, 0x3f, 0x95, 0xd1, 0xad, 0xa7, 0xc1, 0x18, 0x38, 0x81, 0x6f, 0x13, 0x88, 0x05, 0xfe, + 0x0a, 0xd5, 0xe5, 0x11, 0x79, 0x54, 0x50, 0xa5, 0x44, 0xb3, 0x77, 0xdf, 0xca, 0xdd, 0x71, 0x39, + 0x84, 0x15, 0x8e, 0x47, 0x32, 0x10, 0x5b, 0x12, 0x6d, 0x4d, 0xba, 0x56, 0x26, 0xe7, 0xa7, 0x20, + 0x68, 0xae, 0x49, 0x1e, 0x23, 0x97, 0xac, 0xf8, 0x31, 0xaa, 0xc6, 0x21, 0xb8, 0x4a, 0xbf, 0x66, + 0xcf, 0xb2, 0x56, 0x79, 0xcf, 0x9a, 0x9f, 0xed, 0x49, 0x08, 0x6e, 0xae, 0xa0, 0xfc, 0x22, 0x8a, + 0x09, 0x7f, 0x81, 0x36, 0x62, 0x41, 0x45, 0x12, 0x2b, 0x95, 0x8b, 0x13, 0xdf, 0xc4, 0xa9, 0xea, + 0x9c, 0x2d, 0xcd, 0xba, 0x91, 0x7d, 0x13, 0xcd, 0x67, 0xfe, 0x6d, 0xa0, 0xed, 0xc5, 0x11, 0xf0, + 0x5b, 0xa8, 0x41, 0x13, 0x8f, 0x49, 0xd3, 0x5c, 0x48, 0xbc, 0x99, 0xce, 0x3a, 0x8d, 0x83, 0x8b, + 0x20, 0xc9, 0xf3, 0xf8, 0x43, 0xb4, 0x03, 0xcf, 0x42, 0x16, 0xa9, 0xee, 0x4f, 0xc0, 0x0d, 0xb8, + 0x17, 0xab, 0xb3, 0xae, 0x38, 0x77, 0xd2, 0x59, 0x67, 0xa7, 0xbf, 0x98, 0x24, 0xcb, 0x78, 0xcc, + 0xd1, 0xd6, 0xb0, 0x60, 0x59, 0xbd, 0x68, 0x6f, 0xf5, 0xa2, 0x57, 0xd9, 0xdc, 0xc1, 0xe9, 0xac, + 0xb3, 0x55, 0xcc, 0x90, 0x05, 0x76, 0xf3, 0x17, 0x03, 0xe1, 0x65, 0x95, 0xf0, 0x5d, 0x54, 0x13, + 0x32, 0xaa, 0xff, 0x22, 0x9b, 0x5a, 0xb4, 0x5a, 0x06, 0xcd, 0x72, 0x78, 0x8a, 0x6e, 0xe7, 0x0b, + 0x3c, 0x65, 0x3e, 0xc4, 0x82, 0xfa, 0xa1, 0x3e, 0xed, 0x37, 0xd7, 0xf3, 0x92, 0x2c, 0x73, 0x5e, + 0xd1, 0xf4, 0xb7, 0xfb, 0xcb, 0x74, 0xe4, 0xaa, 0x1e, 0xe6, 0x8f, 0x65, 0xd4, 0xd4, 0x63, 0x4f, + 0x18, 0x7c, 0xf7, 0x1f, 0x78, 0xf9, 0x51, 0xc1, 0xcb, 0xf7, 0xd6, 0xf2, 0x9d, 0x1c, 0xed, 0x5a, + 0x2b, 0x7f, 0xbe, 0x60, 0x65, 0x7b, 0x7d, 0xca, 0xd5, 0x4e, 0x76, 0xd1, 0xff, 0x16, 0xfa, 0xaf, + 0x77, 0x9c, 0x05, 0xb3, 0x97, 0x57, 0x9b, 0xdd, 0xfc, 0xcb, 0x40, 0x3b, 0x4b, 0x23, 0xe1, 0xf7, + 0xd1, 0xe6, 0xdc, 0xe4, 0x90, 0xdd, 0xb0, 0x75, 0xe7, 0x8e, 0xee, 0xb7, 0x79, 0x30, 0x9f, 0x24, + 0x45, 0x2c, 0xfe, 0x18, 0x55, 0x93, 0x18, 0x22, 0xad, 0xf0, 0x1b, 0xab, 0xe5, 0x38, 0x8a, 0x21, + 0x1a, 0xf0, 0x93, 0x20, 0x97, 0x56, 0x46, 0x88, 0x62, 0x28, 0x6e, 0x52, 0xbd, 0xe1, 0x6f, 0x7b, + 0x17, 0xd5, 0x20, 0x8a, 0x82, 0x48, 0xdf, 0xdb, 0x97, 0xda, 0xf4, 0x65, 0x90, 0x64, 0x39, 0xf3, + 0xd7, 0x32, 0xaa, 0x5f, 0xb4, 0xc4, 0x6f, 0xa3, 0xba, 0x6c, 0xa3, 0x2e, 0xfb, 0x4c, 0xd0, 0x6d, + 0x5d, 0xa4, 0x30, 0x32, 0x4e, 0x2e, 0x11, 0xf8, 0x35, 0x54, 0x49, 0x98, 0xa7, 0xdf, 0x90, 0xe6, + 0xdc, 0xa5, 0x4f, 0x64, 0x1c, 0x9b, 0x68, 0x63, 0x14, 0x05, 0x49, 0x28, 0x6d, 0x20, 0x07, 0x45, + 0xf2, 0x44, 0x3f, 0x52, 0x11, 0xa2, 0x33, 0xf8, 0x18, 0xd5, 0x40, 0xde, 0xf9, 0x6a, 0x97, 0x66, + 0xaf, 0xbb, 0x9e, 0x34, 0x96, 0x7a, 0x27, 0xfa, 0x5c, 0x44, 0xd3, 0xb9, 0xad, 0x64, 0x8c, 0x64, + 0x74, 0xbb, 0x43, 0xfd, 0x96, 0x28, 0x0c, 0xde, 0x46, 0x95, 0x31, 0x4c, 0xb3, 0x8d, 0x88, 0xfc, + 0x89, 0x3f, 0x40, 0xb5, 0x89, 0x7c, 0x66, 0xf4, 0x91, 0xec, 0xaf, 0xee, 0x9b, 0x3f, 0x4b, 0x24, + 0x2b, 0x7b, 0x58, 0x7e, 0x60, 0x38, 0xfb, 0x67, 0xe7, 0xed, 0xd2, 0x8b, 0xf3, 0x76, 0xe9, 0xe5, + 0x79, 0xbb, 0xf4, 0x3c, 0x6d, 0x1b, 0x67, 0x69, 0xdb, 0x78, 0x91, 0xb6, 0x8d, 0x97, 0x69, 0xdb, + 0xf8, 0x23, 0x6d, 0x1b, 0xdf, 0xff, 0xd9, 0x2e, 0x7d, 0x59, 0x9e, 0x74, 0xff, 0x0d, 0x00, 0x00, + 0xff, 0xff, 0x51, 0xcc, 0x53, 0x28, 0xe2, 0x08, 0x00, 0x00, } func (m *BoundObjectReference) Marshal() (dAtA []byte, err error) { @@ -1264,10 +1264,7 @@ func (m *BoundObjectReference) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1349,10 +1346,7 @@ func (m *ExtraValue) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1501,10 +1495,7 @@ func (m *TokenRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1642,10 +1633,7 @@ func (m *TokenRequestSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1760,10 +1748,7 @@ func (m *TokenRequestStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1912,10 +1897,7 @@ func (m *TokenReview) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2029,10 +2011,7 @@ func (m *TokenReviewSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2199,10 +2178,7 @@ func (m *TokenReviewStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2460,7 +2436,7 @@ func (m *UserInfo) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -2477,10 +2453,7 @@ func (m *UserInfo) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/api/authentication/v1/generated.proto b/vendor/k8s.io/api/authentication/v1/generated.proto index 2fb124364456..c91fd92a5719 100644 --- a/vendor/k8s.io/api/authentication/v1/generated.proto +++ b/vendor/k8s.io/api/authentication/v1/generated.proto @@ -36,7 +36,7 @@ message BoundObjectReference { // API version of the referent. // +optional - optional string aPIVersion = 2; + optional string apiVersion = 2; // Name of the referent. // +optional diff --git a/vendor/k8s.io/api/authentication/v1/types.go b/vendor/k8s.io/api/authentication/v1/types.go index 668b720380f3..6f5f0ad1a308 100644 --- a/vendor/k8s.io/api/authentication/v1/types.go +++ b/vendor/k8s.io/api/authentication/v1/types.go @@ -178,7 +178,7 @@ type BoundObjectReference struct { Kind string `json:"kind,omitempty" protobuf:"bytes,1,opt,name=kind"` // API version of the referent. // +optional - APIVersion string `json:"apiVersion,omitempty" protobuf:"bytes,2,opt,name=aPIVersion"` + APIVersion string `json:"apiVersion,omitempty" protobuf:"bytes,2,opt,name=apiVersion"` // Name of the referent. // +optional diff --git a/vendor/k8s.io/api/authentication/v1beta1/BUILD b/vendor/k8s.io/api/authentication/v1beta1/BUILD deleted file mode 100644 index 4d6b17fdd1cc..000000000000 --- a/vendor/k8s.io/api/authentication/v1beta1/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - "zz_generated.prerelease-lifecycle.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/api/authentication/v1beta1", - importpath = "k8s.io/api/authentication/v1beta1", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/api/authentication/v1beta1/generated.pb.go b/vendor/k8s.io/api/authentication/v1beta1/generated.pb.go index 6c391dbfa312..3d8f76515043 100644 --- a/vendor/k8s.io/api/authentication/v1beta1/generated.pb.go +++ b/vendor/k8s.io/api/authentication/v1beta1/generated.pb.go @@ -737,10 +737,7 @@ func (m *ExtraValue) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -889,10 +886,7 @@ func (m *TokenReview) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1006,10 +1000,7 @@ func (m *TokenReviewSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1176,10 +1167,7 @@ func (m *TokenReviewStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1437,7 +1425,7 @@ func (m *UserInfo) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -1454,10 +1442,7 @@ func (m *UserInfo) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/api/authorization/v1/BUILD b/vendor/k8s.io/api/authorization/v1/BUILD deleted file mode 100644 index f4b46b084430..000000000000 --- a/vendor/k8s.io/api/authorization/v1/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/api/authorization/v1", - importpath = "k8s.io/api/authorization/v1", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/api/authorization/v1/generated.pb.go b/vendor/k8s.io/api/authorization/v1/generated.pb.go index dbc0bdc71d10..66c7c06ae7d1 100644 --- a/vendor/k8s.io/api/authorization/v1/generated.pb.go +++ b/vendor/k8s.io/api/authorization/v1/generated.pb.go @@ -1793,10 +1793,7 @@ func (m *ExtraValue) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1945,10 +1942,7 @@ func (m *LocalSubjectAccessReview) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2062,10 +2056,7 @@ func (m *NonResourceAttributes) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2179,10 +2170,7 @@ func (m *NonResourceRule) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2456,10 +2444,7 @@ func (m *ResourceAttributes) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2637,10 +2622,7 @@ func (m *ResourceRule) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2789,10 +2771,7 @@ func (m *SelfSubjectAccessReview) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2914,10 +2893,7 @@ func (m *SelfSubjectAccessReviewSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3066,10 +3042,7 @@ func (m *SelfSubjectRulesReview) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3151,10 +3124,7 @@ func (m *SelfSubjectRulesReviewSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3303,10 +3273,7 @@ func (m *SubjectAccessReview) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3604,7 +3571,7 @@ func (m *SubjectAccessReviewSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -3653,10 +3620,7 @@ func (m *SubjectAccessReviewSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3810,10 +3774,7 @@ func (m *SubjectAccessReviewStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3983,10 +3944,7 @@ func (m *SubjectRulesReviewStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/api/authorization/v1beta1/BUILD b/vendor/k8s.io/api/authorization/v1beta1/BUILD deleted file mode 100644 index b28529071875..000000000000 --- a/vendor/k8s.io/api/authorization/v1beta1/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - "zz_generated.prerelease-lifecycle.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/api/authorization/v1beta1", - importpath = "k8s.io/api/authorization/v1beta1", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/api/authorization/v1beta1/generated.pb.go b/vendor/k8s.io/api/authorization/v1beta1/generated.pb.go index 647c0c582b46..4331d3e5b0d5 100644 --- a/vendor/k8s.io/api/authorization/v1beta1/generated.pb.go +++ b/vendor/k8s.io/api/authorization/v1beta1/generated.pb.go @@ -1793,10 +1793,7 @@ func (m *ExtraValue) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1945,10 +1942,7 @@ func (m *LocalSubjectAccessReview) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2062,10 +2056,7 @@ func (m *NonResourceAttributes) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2179,10 +2170,7 @@ func (m *NonResourceRule) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2456,10 +2444,7 @@ func (m *ResourceAttributes) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2637,10 +2622,7 @@ func (m *ResourceRule) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2789,10 +2771,7 @@ func (m *SelfSubjectAccessReview) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2914,10 +2893,7 @@ func (m *SelfSubjectAccessReviewSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3066,10 +3042,7 @@ func (m *SelfSubjectRulesReview) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3151,10 +3124,7 @@ func (m *SelfSubjectRulesReviewSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3303,10 +3273,7 @@ func (m *SubjectAccessReview) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3604,7 +3571,7 @@ func (m *SubjectAccessReviewSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -3653,10 +3620,7 @@ func (m *SubjectAccessReviewSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3810,10 +3774,7 @@ func (m *SubjectAccessReviewStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3983,10 +3944,7 @@ func (m *SubjectRulesReviewStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/api/autoscaling/v1/BUILD b/vendor/k8s.io/api/autoscaling/v1/BUILD deleted file mode 100644 index e0a645e1643f..000000000000 --- a/vendor/k8s.io/api/autoscaling/v1/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/api/autoscaling/v1", - importpath = "k8s.io/api/autoscaling/v1", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/api/autoscaling/v1/generated.pb.go b/vendor/k8s.io/api/autoscaling/v1/generated.pb.go index 1de893f7ee48..a6ff299d73ac 100644 --- a/vendor/k8s.io/api/autoscaling/v1/generated.pb.go +++ b/vendor/k8s.io/api/autoscaling/v1/generated.pb.go @@ -2750,10 +2750,7 @@ func (m *ContainerResourceMetricSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2920,10 +2917,7 @@ func (m *ContainerResourceMetricStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3069,10 +3063,7 @@ func (m *CrossVersionObjectReference) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3262,10 +3253,7 @@ func (m *ExternalMetricSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3452,10 +3440,7 @@ func (m *ExternalMetricStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3604,10 +3589,7 @@ func (m *HorizontalPodAutoscaler) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3818,10 +3800,7 @@ func (m *HorizontalPodAutoscalerCondition) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3938,10 +3917,7 @@ func (m *HorizontalPodAutoscalerList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4083,10 +4059,7 @@ func (m *HorizontalPodAutoscalerSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4250,10 +4223,7 @@ func (m *HorizontalPodAutoscalerStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4515,10 +4485,7 @@ func (m *MetricSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4780,10 +4747,7 @@ func (m *MetricStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5003,10 +4967,7 @@ func (m *ObjectMetricSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5226,10 +5187,7 @@ func (m *ObjectMetricStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5380,10 +5338,7 @@ func (m *PodsMetricSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5534,10 +5489,7 @@ func (m *PodsMetricStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5675,10 +5627,7 @@ func (m *ResourceMetricSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5813,10 +5762,7 @@ func (m *ResourceMetricStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5965,10 +5911,7 @@ func (m *Scale) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -6037,10 +5980,7 @@ func (m *ScaleSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -6141,10 +6081,7 @@ func (m *ScaleStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/api/autoscaling/v2beta1/BUILD b/vendor/k8s.io/api/autoscaling/v2beta1/BUILD deleted file mode 100644 index e22406aa791f..000000000000 --- a/vendor/k8s.io/api/autoscaling/v2beta1/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - "zz_generated.prerelease-lifecycle.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/api/autoscaling/v2beta1", - importpath = "k8s.io/api/autoscaling/v2beta1", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/api/autoscaling/v2beta1/generated.pb.go b/vendor/k8s.io/api/autoscaling/v2beta1/generated.pb.go index 750808f8d216..28832c152da4 100644 --- a/vendor/k8s.io/api/autoscaling/v2beta1/generated.pb.go +++ b/vendor/k8s.io/api/autoscaling/v2beta1/generated.pb.go @@ -2540,10 +2540,7 @@ func (m *ContainerResourceMetricSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2710,10 +2707,7 @@ func (m *ContainerResourceMetricStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2859,10 +2853,7 @@ func (m *CrossVersionObjectReference) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3052,10 +3043,7 @@ func (m *ExternalMetricSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3242,10 +3230,7 @@ func (m *ExternalMetricStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3394,10 +3379,7 @@ func (m *HorizontalPodAutoscaler) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3608,10 +3590,7 @@ func (m *HorizontalPodAutoscalerCondition) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3728,10 +3707,7 @@ func (m *HorizontalPodAutoscalerList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3887,10 +3863,7 @@ func (m *HorizontalPodAutoscalerSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4102,10 +4075,7 @@ func (m *HorizontalPodAutoscalerStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4367,10 +4337,7 @@ func (m *MetricSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4632,10 +4599,7 @@ func (m *MetricStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4855,10 +4819,7 @@ func (m *ObjectMetricSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5078,10 +5039,7 @@ func (m *ObjectMetricStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5232,10 +5190,7 @@ func (m *PodsMetricSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5386,10 +5341,7 @@ func (m *PodsMetricStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5527,10 +5479,7 @@ func (m *ResourceMetricSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5665,10 +5614,7 @@ func (m *ResourceMetricStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/api/autoscaling/v2beta2/BUILD b/vendor/k8s.io/api/autoscaling/v2beta2/BUILD deleted file mode 100644 index 796071d2f13c..000000000000 --- a/vendor/k8s.io/api/autoscaling/v2beta2/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - "zz_generated.prerelease-lifecycle.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/api/autoscaling/v2beta2", - importpath = "k8s.io/api/autoscaling/v2beta2", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/autoscaling/v2beta2/generated.pb.go b/vendor/k8s.io/api/autoscaling/v2beta2/generated.pb.go index 43e06f9eb1f5..cece3c877afd 100644 --- a/vendor/k8s.io/api/autoscaling/v2beta2/generated.pb.go +++ b/vendor/k8s.io/api/autoscaling/v2beta2/generated.pb.go @@ -2995,10 +2995,7 @@ func (m *ContainerResourceMetricSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3145,10 +3142,7 @@ func (m *ContainerResourceMetricStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3294,10 +3288,7 @@ func (m *CrossVersionObjectReference) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3413,10 +3404,7 @@ func (m *ExternalMetricSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3532,10 +3520,7 @@ func (m *ExternalMetricStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3655,10 +3640,7 @@ func (m *HPAScalingPolicy) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3795,10 +3777,7 @@ func (m *HPAScalingRules) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3947,10 +3926,7 @@ func (m *HorizontalPodAutoscaler) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4072,10 +4048,7 @@ func (m *HorizontalPodAutoscalerBehavior) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4286,10 +4259,7 @@ func (m *HorizontalPodAutoscalerCondition) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4406,10 +4376,7 @@ func (m *HorizontalPodAutoscalerList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4601,10 +4568,7 @@ func (m *HorizontalPodAutoscalerSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4816,10 +4780,7 @@ func (m *HorizontalPodAutoscalerStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4937,10 +4898,7 @@ func (m *MetricIdentifier) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5202,10 +5160,7 @@ func (m *MetricSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5467,10 +5422,7 @@ func (m *MetricStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5644,10 +5596,7 @@ func (m *MetricTarget) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5789,10 +5738,7 @@ func (m *MetricValueStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5941,10 +5887,7 @@ func (m *ObjectMetricSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -6093,10 +6036,7 @@ func (m *ObjectMetricStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -6212,10 +6152,7 @@ func (m *PodsMetricSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -6331,10 +6268,7 @@ func (m *PodsMetricStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -6449,10 +6383,7 @@ func (m *ResourceMetricSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -6567,10 +6498,7 @@ func (m *ResourceMetricStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/api/batch/v1/BUILD b/vendor/k8s.io/api/batch/v1/BUILD deleted file mode 100644 index 29e2d2a25cb3..000000000000 --- a/vendor/k8s.io/api/batch/v1/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/api/batch/v1", - importpath = "k8s.io/api/batch/v1", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/api/batch/v1/generated.pb.go b/vendor/k8s.io/api/batch/v1/generated.pb.go index 35944e72670e..1407caebc61f 100644 --- a/vendor/k8s.io/api/batch/v1/generated.pb.go +++ b/vendor/k8s.io/api/batch/v1/generated.pb.go @@ -26,6 +26,7 @@ import ( proto "github.com/gogo/protobuf/proto" k8s_io_api_core_v1 "k8s.io/api/core/v1" + v11 "k8s.io/api/core/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" math "math" @@ -45,10 +46,122 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package +func (m *CronJob) Reset() { *m = CronJob{} } +func (*CronJob) ProtoMessage() {} +func (*CronJob) Descriptor() ([]byte, []int) { + return fileDescriptor_3b52da57c93de713, []int{0} +} +func (m *CronJob) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *CronJob) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *CronJob) XXX_Merge(src proto.Message) { + xxx_messageInfo_CronJob.Merge(m, src) +} +func (m *CronJob) XXX_Size() int { + return m.Size() +} +func (m *CronJob) XXX_DiscardUnknown() { + xxx_messageInfo_CronJob.DiscardUnknown(m) +} + +var xxx_messageInfo_CronJob proto.InternalMessageInfo + +func (m *CronJobList) Reset() { *m = CronJobList{} } +func (*CronJobList) ProtoMessage() {} +func (*CronJobList) Descriptor() ([]byte, []int) { + return fileDescriptor_3b52da57c93de713, []int{1} +} +func (m *CronJobList) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *CronJobList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *CronJobList) XXX_Merge(src proto.Message) { + xxx_messageInfo_CronJobList.Merge(m, src) +} +func (m *CronJobList) XXX_Size() int { + return m.Size() +} +func (m *CronJobList) XXX_DiscardUnknown() { + xxx_messageInfo_CronJobList.DiscardUnknown(m) +} + +var xxx_messageInfo_CronJobList proto.InternalMessageInfo + +func (m *CronJobSpec) Reset() { *m = CronJobSpec{} } +func (*CronJobSpec) ProtoMessage() {} +func (*CronJobSpec) Descriptor() ([]byte, []int) { + return fileDescriptor_3b52da57c93de713, []int{2} +} +func (m *CronJobSpec) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *CronJobSpec) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *CronJobSpec) XXX_Merge(src proto.Message) { + xxx_messageInfo_CronJobSpec.Merge(m, src) +} +func (m *CronJobSpec) XXX_Size() int { + return m.Size() +} +func (m *CronJobSpec) XXX_DiscardUnknown() { + xxx_messageInfo_CronJobSpec.DiscardUnknown(m) +} + +var xxx_messageInfo_CronJobSpec proto.InternalMessageInfo + +func (m *CronJobStatus) Reset() { *m = CronJobStatus{} } +func (*CronJobStatus) ProtoMessage() {} +func (*CronJobStatus) Descriptor() ([]byte, []int) { + return fileDescriptor_3b52da57c93de713, []int{3} +} +func (m *CronJobStatus) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *CronJobStatus) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *CronJobStatus) XXX_Merge(src proto.Message) { + xxx_messageInfo_CronJobStatus.Merge(m, src) +} +func (m *CronJobStatus) XXX_Size() int { + return m.Size() +} +func (m *CronJobStatus) XXX_DiscardUnknown() { + xxx_messageInfo_CronJobStatus.DiscardUnknown(m) +} + +var xxx_messageInfo_CronJobStatus proto.InternalMessageInfo + func (m *Job) Reset() { *m = Job{} } func (*Job) ProtoMessage() {} func (*Job) Descriptor() ([]byte, []int) { - return fileDescriptor_3b52da57c93de713, []int{0} + return fileDescriptor_3b52da57c93de713, []int{4} } func (m *Job) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -76,7 +189,7 @@ var xxx_messageInfo_Job proto.InternalMessageInfo func (m *JobCondition) Reset() { *m = JobCondition{} } func (*JobCondition) ProtoMessage() {} func (*JobCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_3b52da57c93de713, []int{1} + return fileDescriptor_3b52da57c93de713, []int{5} } func (m *JobCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -104,7 +217,7 @@ var xxx_messageInfo_JobCondition proto.InternalMessageInfo func (m *JobList) Reset() { *m = JobList{} } func (*JobList) ProtoMessage() {} func (*JobList) Descriptor() ([]byte, []int) { - return fileDescriptor_3b52da57c93de713, []int{2} + return fileDescriptor_3b52da57c93de713, []int{6} } func (m *JobList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -132,7 +245,7 @@ var xxx_messageInfo_JobList proto.InternalMessageInfo func (m *JobSpec) Reset() { *m = JobSpec{} } func (*JobSpec) ProtoMessage() {} func (*JobSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_3b52da57c93de713, []int{3} + return fileDescriptor_3b52da57c93de713, []int{7} } func (m *JobSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -160,7 +273,7 @@ var xxx_messageInfo_JobSpec proto.InternalMessageInfo func (m *JobStatus) Reset() { *m = JobStatus{} } func (*JobStatus) ProtoMessage() {} func (*JobStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_3b52da57c93de713, []int{4} + return fileDescriptor_3b52da57c93de713, []int{8} } func (m *JobStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -185,12 +298,45 @@ func (m *JobStatus) XXX_DiscardUnknown() { var xxx_messageInfo_JobStatus proto.InternalMessageInfo +func (m *JobTemplateSpec) Reset() { *m = JobTemplateSpec{} } +func (*JobTemplateSpec) ProtoMessage() {} +func (*JobTemplateSpec) Descriptor() ([]byte, []int) { + return fileDescriptor_3b52da57c93de713, []int{9} +} +func (m *JobTemplateSpec) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *JobTemplateSpec) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *JobTemplateSpec) XXX_Merge(src proto.Message) { + xxx_messageInfo_JobTemplateSpec.Merge(m, src) +} +func (m *JobTemplateSpec) XXX_Size() int { + return m.Size() +} +func (m *JobTemplateSpec) XXX_DiscardUnknown() { + xxx_messageInfo_JobTemplateSpec.DiscardUnknown(m) +} + +var xxx_messageInfo_JobTemplateSpec proto.InternalMessageInfo + func init() { + proto.RegisterType((*CronJob)(nil), "k8s.io.api.batch.v1.CronJob") + proto.RegisterType((*CronJobList)(nil), "k8s.io.api.batch.v1.CronJobList") + proto.RegisterType((*CronJobSpec)(nil), "k8s.io.api.batch.v1.CronJobSpec") + proto.RegisterType((*CronJobStatus)(nil), "k8s.io.api.batch.v1.CronJobStatus") proto.RegisterType((*Job)(nil), "k8s.io.api.batch.v1.Job") proto.RegisterType((*JobCondition)(nil), "k8s.io.api.batch.v1.JobCondition") proto.RegisterType((*JobList)(nil), "k8s.io.api.batch.v1.JobList") proto.RegisterType((*JobSpec)(nil), "k8s.io.api.batch.v1.JobSpec") proto.RegisterType((*JobStatus)(nil), "k8s.io.api.batch.v1.JobStatus") + proto.RegisterType((*JobTemplateSpec)(nil), "k8s.io.api.batch.v1.JobTemplateSpec") } func init() { @@ -198,69 +344,92 @@ func init() { } var fileDescriptor_3b52da57c93de713 = []byte{ - // 929 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x54, 0x5d, 0x6f, 0xe3, 0x44, - 0x14, 0xad, 0x9b, 0xa6, 0x4d, 0xa6, 0x1f, 0x5b, 0x06, 0x55, 0x1b, 0x0a, 0xb2, 0x97, 0x20, 0xa1, - 0x82, 0x84, 0x4d, 0x4b, 0x85, 0x10, 0x02, 0xa4, 0x75, 0x51, 0x25, 0xaa, 0x54, 0x5b, 0x26, 0x59, - 0x21, 0x21, 0x90, 0x18, 0xdb, 0x37, 0x89, 0x89, 0xed, 0xb1, 0x3c, 0x93, 0x48, 0x7d, 0xe3, 0x27, - 0xf0, 0x23, 0x10, 0x7f, 0x82, 0x77, 0xd4, 0xc7, 0x7d, 0xdc, 0x27, 0x8b, 0x9a, 0x1f, 0xc0, 0xfb, - 0x3e, 0xa1, 0x19, 0x3b, 0xb6, 0xd3, 0x26, 0xa2, 0xcb, 0x5b, 0xe6, 0xcc, 0x39, 0xe7, 0x5e, 0xcf, - 0x3d, 0xb9, 0xe8, 0x8b, 0xc9, 0x67, 0xdc, 0xf4, 0x99, 0x35, 0x99, 0x3a, 0x90, 0x44, 0x20, 0x80, - 0x5b, 0x33, 0x88, 0x3c, 0x96, 0x58, 0xc5, 0x05, 0x8d, 0x7d, 0xcb, 0xa1, 0xc2, 0x1d, 0x5b, 0xb3, - 0x63, 0x6b, 0x04, 0x11, 0x24, 0x54, 0x80, 0x67, 0xc6, 0x09, 0x13, 0x0c, 0xbf, 0x99, 0x93, 0x4c, - 0x1a, 0xfb, 0xa6, 0x22, 0x99, 0xb3, 0xe3, 0xc3, 0x8f, 0x46, 0xbe, 0x18, 0x4f, 0x1d, 0xd3, 0x65, - 0xa1, 0x35, 0x62, 0x23, 0x66, 0x29, 0xae, 0x33, 0x1d, 0xaa, 0x93, 0x3a, 0xa8, 0x5f, 0xb9, 0xc7, - 0x61, 0xb7, 0x56, 0xc8, 0x65, 0x09, 0x2c, 0xa9, 0x73, 0x78, 0x5a, 0x71, 0x42, 0xea, 0x8e, 0xfd, - 0x08, 0x92, 0x6b, 0x2b, 0x9e, 0x8c, 0x24, 0xc0, 0xad, 0x10, 0x04, 0x5d, 0xa6, 0xb2, 0x56, 0xa9, - 0x92, 0x69, 0x24, 0xfc, 0x10, 0xee, 0x09, 0x3e, 0xfd, 0x2f, 0x01, 0x77, 0xc7, 0x10, 0xd2, 0xbb, - 0xba, 0xee, 0x3f, 0x1a, 0x6a, 0x5c, 0x30, 0x07, 0xff, 0x84, 0x5a, 0xb2, 0x17, 0x8f, 0x0a, 0xda, - 0xd1, 0x9e, 0x68, 0x47, 0xdb, 0x27, 0x1f, 0x9b, 0xd5, 0x0b, 0x95, 0x96, 0x66, 0x3c, 0x19, 0x49, - 0x80, 0x9b, 0x92, 0x6d, 0xce, 0x8e, 0xcd, 0x67, 0xce, 0xcf, 0xe0, 0x8a, 0x4b, 0x10, 0xd4, 0xc6, - 0x37, 0xa9, 0xb1, 0x96, 0xa5, 0x06, 0xaa, 0x30, 0x52, 0xba, 0xe2, 0xaf, 0xd0, 0x06, 0x8f, 0xc1, - 0xed, 0xac, 0x2b, 0xf7, 0x77, 0xcc, 0x25, 0xef, 0x6f, 0x5e, 0x30, 0xa7, 0x1f, 0x83, 0x6b, 0xef, - 0x14, 0x4e, 0x1b, 0xf2, 0x44, 0x94, 0x0e, 0x9f, 0xa3, 0x4d, 0x2e, 0xa8, 0x98, 0xf2, 0x4e, 0x43, - 0x39, 0xe8, 0x2b, 0x1d, 0x14, 0xcb, 0xde, 0x2b, 0x3c, 0x36, 0xf3, 0x33, 0x29, 0xd4, 0xdd, 0x3f, - 0x1b, 0x68, 0xe7, 0x82, 0x39, 0x67, 0x2c, 0xf2, 0x7c, 0xe1, 0xb3, 0x08, 0x9f, 0xa2, 0x0d, 0x71, - 0x1d, 0x83, 0xfa, 0xec, 0xb6, 0xfd, 0x64, 0x5e, 0x7a, 0x70, 0x1d, 0xc3, 0xab, 0xd4, 0xd8, 0xaf, - 0x73, 0x25, 0x46, 0x14, 0x1b, 0xf7, 0xca, 0x76, 0xd6, 0x95, 0xee, 0x74, 0xb1, 0xdc, 0xab, 0xd4, - 0x58, 0x92, 0x0e, 0xb3, 0x74, 0x5a, 0x6c, 0x0a, 0x8f, 0xd0, 0x6e, 0x40, 0xb9, 0xb8, 0x4a, 0x98, - 0x03, 0x03, 0x3f, 0x84, 0xe2, 0x1b, 0x3f, 0x7c, 0xd8, 0x0c, 0xa4, 0xc2, 0x3e, 0x28, 0x1a, 0xd8, - 0xed, 0xd5, 0x8d, 0xc8, 0xa2, 0x2f, 0x9e, 0x21, 0x2c, 0x81, 0x41, 0x42, 0x23, 0x9e, 0x7f, 0x92, - 0xac, 0xb6, 0xf1, 0xda, 0xd5, 0x0e, 0x8b, 0x6a, 0xb8, 0x77, 0xcf, 0x8d, 0x2c, 0xa9, 0x80, 0xdf, - 0x47, 0x9b, 0x09, 0x50, 0xce, 0xa2, 0x4e, 0x53, 0x3d, 0x57, 0x39, 0x1d, 0xa2, 0x50, 0x52, 0xdc, - 0xe2, 0x0f, 0xd0, 0x56, 0x08, 0x9c, 0xd3, 0x11, 0x74, 0x36, 0x15, 0xf1, 0x51, 0x41, 0xdc, 0xba, - 0xcc, 0x61, 0x32, 0xbf, 0xef, 0xfe, 0xae, 0xa1, 0xad, 0x0b, 0xe6, 0xf4, 0x7c, 0x2e, 0xf0, 0x0f, - 0xf7, 0xe2, 0x6b, 0x3e, 0xec, 0x63, 0xa4, 0x5a, 0x85, 0x77, 0xbf, 0xa8, 0xd3, 0x9a, 0x23, 0xb5, - 0xe8, 0x7e, 0x89, 0x9a, 0xbe, 0x80, 0x50, 0x8e, 0xba, 0x71, 0xb4, 0x7d, 0xd2, 0x59, 0x95, 0x3c, - 0x7b, 0xb7, 0x30, 0x69, 0x7e, 0x23, 0xe9, 0x24, 0x57, 0x75, 0xff, 0xd8, 0x50, 0x8d, 0xca, 0x2c, - 0xe3, 0x63, 0xb4, 0x1d, 0xd3, 0x84, 0x06, 0x01, 0x04, 0x3e, 0x0f, 0x55, 0xaf, 0x4d, 0xfb, 0x51, - 0x96, 0x1a, 0xdb, 0x57, 0x15, 0x4c, 0xea, 0x1c, 0x29, 0x71, 0x59, 0x18, 0x07, 0x20, 0x1f, 0x33, - 0x8f, 0x5b, 0x21, 0x39, 0xab, 0x60, 0x52, 0xe7, 0xe0, 0x67, 0xe8, 0x80, 0xba, 0xc2, 0x9f, 0xc1, - 0xd7, 0x40, 0xbd, 0xc0, 0x8f, 0xa0, 0x0f, 0x2e, 0x8b, 0xbc, 0xfc, 0xaf, 0xd3, 0xb0, 0xdf, 0xca, - 0x52, 0xe3, 0xe0, 0xe9, 0x32, 0x02, 0x59, 0xae, 0xc3, 0xa7, 0x68, 0xc7, 0xa1, 0xee, 0x84, 0x0d, - 0x87, 0x3d, 0x3f, 0xf4, 0x45, 0x67, 0x4b, 0x35, 0xb1, 0x9f, 0xa5, 0xc6, 0x8e, 0x5d, 0xc3, 0xc9, - 0x02, 0x0b, 0xff, 0x88, 0x5a, 0x1c, 0x02, 0x70, 0x05, 0x4b, 0x8a, 0x88, 0x7d, 0xf2, 0xc0, 0xa9, - 0x50, 0x07, 0x82, 0x7e, 0x21, 0xb5, 0x77, 0xe4, 0x58, 0xe6, 0x27, 0x52, 0x5a, 0xe2, 0xcf, 0xd1, - 0x5e, 0x48, 0xa3, 0x29, 0x2d, 0x99, 0x2a, 0x5b, 0x2d, 0x1b, 0x67, 0xa9, 0xb1, 0x77, 0xb9, 0x70, - 0x43, 0xee, 0x30, 0xf1, 0xb7, 0xa8, 0x25, 0x20, 0x8c, 0x03, 0x2a, 0xf2, 0xa0, 0x6d, 0x9f, 0xbc, - 0x57, 0x9f, 0xaa, 0xfc, 0xbf, 0xca, 0x46, 0xae, 0x98, 0x37, 0x28, 0x68, 0x6a, 0x31, 0x95, 0x29, - 0x99, 0xa3, 0xa4, 0xb4, 0xc1, 0xcf, 0xd1, 0x63, 0x21, 0x82, 0xe2, 0xc5, 0x9e, 0x0e, 0x05, 0x24, - 0xe7, 0x7e, 0xe4, 0xf3, 0x31, 0x78, 0x9d, 0x96, 0x7a, 0xae, 0xb7, 0xb3, 0xd4, 0x78, 0x3c, 0x18, - 0xf4, 0x96, 0x51, 0xc8, 0x2a, 0x6d, 0xf7, 0xb7, 0x06, 0x6a, 0x97, 0x5b, 0x0d, 0x3f, 0x47, 0xc8, - 0x9d, 0xef, 0x10, 0xde, 0xd1, 0x54, 0x1e, 0xdf, 0x5d, 0x95, 0xc7, 0x72, 0xdb, 0x54, 0xab, 0xb9, - 0x84, 0x38, 0xa9, 0x19, 0xe1, 0xef, 0x50, 0x9b, 0x0b, 0x9a, 0x08, 0xb5, 0x0d, 0xd6, 0x5f, 0x7b, - 0x1b, 0xec, 0x66, 0xa9, 0xd1, 0xee, 0xcf, 0x0d, 0x48, 0xe5, 0x85, 0x87, 0x68, 0xaf, 0x0a, 0xe6, - 0xff, 0xdc, 0x6c, 0x6a, 0x9e, 0x67, 0x0b, 0x2e, 0xe4, 0x8e, 0xab, 0xdc, 0x2f, 0x79, 0x72, 0x55, - 0xd0, 0x9a, 0xd5, 0x7e, 0xc9, 0x63, 0x4e, 0x8a, 0x5b, 0x6c, 0xa1, 0x36, 0x9f, 0xba, 0x2e, 0x80, - 0x07, 0x9e, 0x8a, 0x4b, 0xd3, 0x7e, 0xa3, 0xa0, 0xb6, 0xfb, 0xf3, 0x0b, 0x52, 0x71, 0xa4, 0xf1, - 0x90, 0xfa, 0x01, 0x78, 0x2a, 0x26, 0x35, 0xe3, 0x73, 0x85, 0x92, 0xe2, 0xd6, 0x3e, 0xba, 0xb9, - 0xd5, 0xd7, 0x5e, 0xdc, 0xea, 0x6b, 0x2f, 0x6f, 0xf5, 0xb5, 0x5f, 0x32, 0x5d, 0xbb, 0xc9, 0x74, - 0xed, 0x45, 0xa6, 0x6b, 0x2f, 0x33, 0x5d, 0xfb, 0x2b, 0xd3, 0xb5, 0x5f, 0xff, 0xd6, 0xd7, 0xbe, - 0x5f, 0x9f, 0x1d, 0xff, 0x1b, 0x00, 0x00, 0xff, 0xff, 0xc8, 0x73, 0xe7, 0x7a, 0xb8, 0x08, 0x00, - 0x00, + // 1304 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x56, 0x41, 0x6f, 0x1b, 0x45, + 0x14, 0xce, 0xc6, 0x71, 0x6c, 0x8f, 0x93, 0xd4, 0x9d, 0xd2, 0xd6, 0x98, 0xca, 0x1b, 0x4c, 0x41, + 0x01, 0xc1, 0x9a, 0x94, 0x08, 0x21, 0x04, 0x48, 0xd9, 0x54, 0x15, 0x0d, 0x8e, 0x1a, 0xc6, 0xa9, + 0x90, 0xa0, 0x20, 0xc6, 0xbb, 0x63, 0x67, 0x9b, 0xdd, 0x9d, 0xd5, 0xce, 0xd8, 0x22, 0x37, 0x7e, + 0x02, 0xbf, 0x02, 0x71, 0x42, 0x48, 0xdc, 0x39, 0xa2, 0x1e, 0x7b, 0xec, 0x69, 0x45, 0x97, 0x1b, + 0x17, 0xee, 0xe1, 0x82, 0x76, 0x76, 0xbc, 0xbb, 0xb6, 0x77, 0x43, 0xd3, 0x43, 0xc5, 0xcd, 0xfb, + 0xe6, 0xfb, 0xbe, 0x79, 0x7e, 0xef, 0xcd, 0x7b, 0x0f, 0x7c, 0x74, 0xf2, 0x01, 0xd3, 0x2c, 0xda, + 0x3d, 0x19, 0x0f, 0x88, 0xef, 0x12, 0x4e, 0x58, 0x77, 0x42, 0x5c, 0x93, 0xfa, 0x5d, 0x79, 0x80, + 0x3d, 0xab, 0x3b, 0xc0, 0xdc, 0x38, 0xee, 0x4e, 0xb6, 0xbb, 0x23, 0xe2, 0x12, 0x1f, 0x73, 0x62, + 0x6a, 0x9e, 0x4f, 0x39, 0x85, 0x57, 0x62, 0x90, 0x86, 0x3d, 0x4b, 0x13, 0x20, 0x6d, 0xb2, 0xdd, + 0x7a, 0x67, 0x64, 0xf1, 0xe3, 0xf1, 0x40, 0x33, 0xa8, 0xd3, 0x1d, 0xd1, 0x11, 0xed, 0x0a, 0xec, + 0x60, 0x3c, 0x14, 0x5f, 0xe2, 0x43, 0xfc, 0x8a, 0x35, 0x5a, 0x9d, 0xcc, 0x45, 0x06, 0xf5, 0x49, + 0xce, 0x3d, 0xad, 0x9d, 0x14, 0xe3, 0x60, 0xe3, 0xd8, 0x72, 0x89, 0x7f, 0xda, 0xf5, 0x4e, 0x46, + 0x91, 0x81, 0x75, 0x1d, 0xc2, 0x71, 0x1e, 0xab, 0x5b, 0xc4, 0xf2, 0xc7, 0x2e, 0xb7, 0x1c, 0xb2, + 0x40, 0x78, 0xff, 0xbf, 0x08, 0xcc, 0x38, 0x26, 0x0e, 0x9e, 0xe7, 0x75, 0xfe, 0x51, 0x40, 0x65, + 0xcf, 0xa7, 0xee, 0x3e, 0x1d, 0xc0, 0x6f, 0x41, 0x35, 0xf2, 0xc7, 0xc4, 0x1c, 0x37, 0x95, 0x4d, + 0x65, 0xab, 0x7e, 0xeb, 0x5d, 0x2d, 0x8d, 0x52, 0x22, 0xab, 0x79, 0x27, 0xa3, 0xc8, 0xc0, 0xb4, + 0x08, 0xad, 0x4d, 0xb6, 0xb5, 0x7b, 0x83, 0x87, 0xc4, 0xe0, 0x07, 0x84, 0x63, 0x1d, 0x3e, 0x0a, + 0xd4, 0xa5, 0x30, 0x50, 0x41, 0x6a, 0x43, 0x89, 0x2a, 0xd4, 0xc1, 0x0a, 0xf3, 0x88, 0xd1, 0x5c, + 0x16, 0xea, 0x9b, 0x5a, 0x4e, 0x0e, 0x34, 0xe9, 0x4d, 0xdf, 0x23, 0x86, 0xbe, 0x26, 0xd5, 0x56, + 0xa2, 0x2f, 0x24, 0xb8, 0x70, 0x1f, 0xac, 0x32, 0x8e, 0xf9, 0x98, 0x35, 0x4b, 0x42, 0xa5, 0x73, + 0xae, 0x8a, 0x40, 0xea, 0x1b, 0x52, 0x67, 0x35, 0xfe, 0x46, 0x52, 0xa1, 0xf3, 0xb3, 0x02, 0xea, + 0x12, 0xd9, 0xb3, 0x18, 0x87, 0x0f, 0x16, 0x22, 0xa0, 0x3d, 0x5b, 0x04, 0x22, 0xb6, 0xf8, 0xff, + 0x0d, 0x79, 0x53, 0x75, 0x6a, 0xc9, 0xfc, 0xfb, 0x5d, 0x50, 0xb6, 0x38, 0x71, 0x58, 0x73, 0x79, + 0xb3, 0xb4, 0x55, 0xbf, 0x75, 0xe3, 0x3c, 0xc7, 0xf5, 0x75, 0x29, 0x54, 0xbe, 0x1b, 0x51, 0x50, + 0xcc, 0xec, 0xfc, 0xb4, 0x92, 0x38, 0x1c, 0x85, 0x04, 0xbe, 0x0d, 0xaa, 0x51, 0x62, 0xcd, 0xb1, + 0x4d, 0x84, 0xc3, 0xb5, 0xd4, 0x81, 0xbe, 0xb4, 0xa3, 0x04, 0x01, 0xef, 0x83, 0xeb, 0x8c, 0x63, + 0x9f, 0x5b, 0xee, 0xe8, 0x36, 0xc1, 0xa6, 0x6d, 0xb9, 0xa4, 0x4f, 0x0c, 0xea, 0x9a, 0x4c, 0x64, + 0xa4, 0xa4, 0xbf, 0x12, 0x06, 0xea, 0xf5, 0x7e, 0x3e, 0x04, 0x15, 0x71, 0xe1, 0x03, 0x70, 0xd9, + 0xa0, 0xae, 0x31, 0xf6, 0x7d, 0xe2, 0x1a, 0xa7, 0x87, 0xd4, 0xb6, 0x8c, 0x53, 0x91, 0x9c, 0x9a, + 0xae, 0x49, 0x6f, 0x2e, 0xef, 0xcd, 0x03, 0xce, 0xf2, 0x8c, 0x68, 0x51, 0x08, 0xbe, 0x0e, 0x2a, + 0x6c, 0xcc, 0x3c, 0xe2, 0x9a, 0xcd, 0x95, 0x4d, 0x65, 0xab, 0xaa, 0xd7, 0xc3, 0x40, 0xad, 0xf4, + 0x63, 0x13, 0x9a, 0x9e, 0xc1, 0xaf, 0x40, 0xfd, 0x21, 0x1d, 0x1c, 0x11, 0xc7, 0xb3, 0x31, 0x27, + 0xcd, 0xb2, 0xc8, 0xde, 0xcd, 0xdc, 0x10, 0xef, 0xa7, 0x38, 0x51, 0x65, 0x57, 0xa4, 0x93, 0xf5, + 0xcc, 0x01, 0xca, 0xaa, 0xc1, 0x6f, 0x40, 0x8b, 0x8d, 0x0d, 0x83, 0x30, 0x36, 0x1c, 0xdb, 0xfb, + 0x74, 0xc0, 0x3e, 0xb5, 0x18, 0xa7, 0xfe, 0x69, 0xcf, 0x72, 0x2c, 0xde, 0x5c, 0xdd, 0x54, 0xb6, + 0xca, 0x7a, 0x3b, 0x0c, 0xd4, 0x56, 0xbf, 0x10, 0x85, 0xce, 0x51, 0x80, 0x08, 0x5c, 0x1b, 0x62, + 0xcb, 0x26, 0xe6, 0x82, 0x76, 0x45, 0x68, 0xb7, 0xc2, 0x40, 0xbd, 0x76, 0x27, 0x17, 0x81, 0x0a, + 0x98, 0x9d, 0xdf, 0x96, 0xc1, 0xfa, 0xcc, 0x2b, 0x80, 0x9f, 0x81, 0x55, 0x6c, 0x70, 0x6b, 0x12, + 0x95, 0x4a, 0x54, 0x80, 0xaf, 0x65, 0xa3, 0x13, 0xf5, 0xaf, 0xf4, 0x2d, 0x23, 0x32, 0x24, 0x51, + 0x12, 0x48, 0xfa, 0x74, 0x76, 0x05, 0x15, 0x49, 0x09, 0x68, 0x83, 0x86, 0x8d, 0x19, 0x9f, 0x56, + 0xd9, 0x91, 0xe5, 0x10, 0x91, 0x9f, 0xfa, 0xad, 0xb7, 0x9e, 0xed, 0xc9, 0x44, 0x0c, 0xfd, 0xa5, + 0x30, 0x50, 0x1b, 0xbd, 0x39, 0x1d, 0xb4, 0xa0, 0x0c, 0x7d, 0x00, 0x85, 0x2d, 0x09, 0xa1, 0xb8, + 0xaf, 0x7c, 0xe1, 0xfb, 0xae, 0x85, 0x81, 0x0a, 0x7b, 0x0b, 0x4a, 0x28, 0x47, 0xbd, 0xf3, 0xb7, + 0x02, 0x4a, 0x2f, 0xa6, 0x2d, 0x7e, 0x32, 0xd3, 0x16, 0x6f, 0x14, 0x15, 0x6d, 0x61, 0x4b, 0xbc, + 0x33, 0xd7, 0x12, 0xdb, 0x85, 0x0a, 0xe7, 0xb7, 0xc3, 0xdf, 0x4b, 0x60, 0x6d, 0x9f, 0x0e, 0xf6, + 0xa8, 0x6b, 0x5a, 0xdc, 0xa2, 0x2e, 0xdc, 0x01, 0x2b, 0xfc, 0xd4, 0x9b, 0xb6, 0x96, 0xcd, 0xe9, + 0xd5, 0x47, 0xa7, 0x1e, 0x39, 0x0b, 0xd4, 0x46, 0x16, 0x1b, 0xd9, 0x90, 0x40, 0xc3, 0x5e, 0xe2, + 0xce, 0xb2, 0xe0, 0xed, 0xcc, 0x5e, 0x77, 0x16, 0xa8, 0x39, 0x83, 0x53, 0x4b, 0x94, 0x66, 0x9d, + 0x82, 0x23, 0xb0, 0x1e, 0x25, 0xe7, 0xd0, 0xa7, 0x83, 0xb8, 0xca, 0x4a, 0x17, 0xce, 0xfa, 0x55, + 0xe9, 0xc0, 0x7a, 0x2f, 0x2b, 0x84, 0x66, 0x75, 0xe1, 0x24, 0xae, 0xb1, 0x23, 0x1f, 0xbb, 0x2c, + 0xfe, 0x4b, 0xcf, 0x57, 0xd3, 0x2d, 0x79, 0x9b, 0xa8, 0xb3, 0x59, 0x35, 0x94, 0x73, 0x03, 0x7c, + 0x03, 0xac, 0xfa, 0x04, 0x33, 0xea, 0x8a, 0x7a, 0xae, 0xa5, 0xd9, 0x41, 0xc2, 0x8a, 0xe4, 0x29, + 0x7c, 0x13, 0x54, 0x1c, 0xc2, 0x18, 0x1e, 0x11, 0xd1, 0x71, 0x6a, 0xfa, 0x25, 0x09, 0xac, 0x1c, + 0xc4, 0x66, 0x34, 0x3d, 0xef, 0xfc, 0xa8, 0x80, 0xca, 0x8b, 0x99, 0x69, 0x1f, 0xcf, 0xce, 0xb4, + 0x66, 0x51, 0xe5, 0x15, 0xcc, 0xb3, 0x5f, 0xca, 0xc2, 0x51, 0x31, 0xcb, 0xb6, 0x41, 0xdd, 0xc3, + 0x3e, 0xb6, 0x6d, 0x62, 0x5b, 0xcc, 0x11, 0xbe, 0x96, 0xf5, 0x4b, 0x51, 0x5f, 0x3e, 0x4c, 0xcd, + 0x28, 0x8b, 0x89, 0x28, 0x06, 0x75, 0x3c, 0x9b, 0x44, 0xc1, 0x8c, 0xcb, 0x4d, 0x52, 0xf6, 0x52, + 0x33, 0xca, 0x62, 0xe0, 0x3d, 0x70, 0x35, 0xee, 0x60, 0xf3, 0x13, 0xb0, 0x24, 0x26, 0xe0, 0xcb, + 0x61, 0xa0, 0x5e, 0xdd, 0xcd, 0x03, 0xa0, 0x7c, 0x1e, 0xdc, 0x01, 0x6b, 0x03, 0x6c, 0x9c, 0xd0, + 0xe1, 0x30, 0xdb, 0xb1, 0x1b, 0x61, 0xa0, 0xae, 0xe9, 0x19, 0x3b, 0x9a, 0x41, 0xc1, 0xaf, 0x41, + 0x95, 0x11, 0x9b, 0x18, 0x9c, 0xfa, 0xb2, 0xc4, 0xde, 0x7b, 0xc6, 0xac, 0xe0, 0x01, 0xb1, 0xfb, + 0x92, 0xaa, 0xaf, 0x89, 0x49, 0x2f, 0xbf, 0x50, 0x22, 0x09, 0x3f, 0x04, 0x1b, 0x0e, 0x76, 0xc7, + 0x38, 0x41, 0x8a, 0xda, 0xaa, 0xea, 0x30, 0x0c, 0xd4, 0x8d, 0x83, 0x99, 0x13, 0x34, 0x87, 0x84, + 0x9f, 0x83, 0x2a, 0x9f, 0x8e, 0xd1, 0x55, 0xe1, 0x5a, 0xee, 0xa0, 0x38, 0xa4, 0xe6, 0xcc, 0x14, + 0x4d, 0xaa, 0x24, 0x19, 0xa1, 0x89, 0x4c, 0xb4, 0x78, 0x70, 0x6e, 0xcb, 0x88, 0xed, 0x0e, 0x39, + 0xf1, 0xef, 0x58, 0xae, 0xc5, 0x8e, 0x89, 0xd9, 0xac, 0x8a, 0x70, 0x89, 0xc5, 0xe3, 0xe8, 0xa8, + 0x97, 0x07, 0x41, 0x45, 0x5c, 0xd8, 0x03, 0x1b, 0x69, 0x6a, 0x0f, 0xa8, 0x49, 0x9a, 0x35, 0xf1, + 0x30, 0x6e, 0x46, 0xff, 0x72, 0x6f, 0xe6, 0xe4, 0x6c, 0xc1, 0x82, 0xe6, 0xb8, 0xd9, 0x45, 0x03, + 0x14, 0x2f, 0x1a, 0x9d, 0xbf, 0x4a, 0xa0, 0x96, 0xce, 0xd4, 0xfb, 0x00, 0x18, 0xd3, 0xc6, 0xc5, + 0xe4, 0x5c, 0x7d, 0xb5, 0xe8, 0x11, 0x24, 0x2d, 0x2e, 0x9d, 0x07, 0x89, 0x89, 0xa1, 0x8c, 0x10, + 0xfc, 0x02, 0xd4, 0xc4, 0xb6, 0x25, 0x5a, 0xd0, 0xf2, 0x85, 0x5b, 0xd0, 0x7a, 0x18, 0xa8, 0xb5, + 0xfe, 0x54, 0x00, 0xa5, 0x5a, 0x70, 0x98, 0x0d, 0xd9, 0x73, 0xb6, 0x53, 0x38, 0x1b, 0x5e, 0x71, + 0xc5, 0x9c, 0x6a, 0xd4, 0xd4, 0xe4, 0xae, 0xb1, 0x22, 0x12, 0x5c, 0xb4, 0x46, 0x74, 0x41, 0x4d, + 0xec, 0x45, 0xc4, 0x24, 0xa6, 0xa8, 0xd1, 0xb2, 0x7e, 0x59, 0x42, 0x6b, 0xfd, 0xe9, 0x01, 0x4a, + 0x31, 0x91, 0x70, 0xbc, 0xf0, 0xc8, 0xb5, 0x2b, 0x11, 0x8e, 0xd7, 0x23, 0x24, 0x4f, 0xe1, 0x6d, + 0xd0, 0x90, 0x2e, 0x11, 0xf3, 0xae, 0x6b, 0x92, 0xef, 0x08, 0x13, 0x4f, 0xb3, 0xa6, 0x37, 0x25, + 0xa3, 0xb1, 0x37, 0x77, 0x8e, 0x16, 0x18, 0x9d, 0x5f, 0x15, 0x70, 0x69, 0x6e, 0x5d, 0xfc, 0xff, + 0xef, 0x03, 0xfa, 0xd6, 0xa3, 0xa7, 0xed, 0xa5, 0xc7, 0x4f, 0xdb, 0x4b, 0x4f, 0x9e, 0xb6, 0x97, + 0xbe, 0x0f, 0xdb, 0xca, 0xa3, 0xb0, 0xad, 0x3c, 0x0e, 0xdb, 0xca, 0x93, 0xb0, 0xad, 0xfc, 0x11, + 0xb6, 0x95, 0x1f, 0xfe, 0x6c, 0x2f, 0x7d, 0xb9, 0x3c, 0xd9, 0xfe, 0x37, 0x00, 0x00, 0xff, 0xff, + 0x5a, 0x54, 0xec, 0x5f, 0x44, 0x0f, 0x00, 0x00, } -func (m *Job) Marshal() (dAtA []byte, err error) { +func (m *CronJob) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -270,12 +439,12 @@ func (m *Job) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Job) MarshalTo(dAtA []byte) (int, error) { +func (m *CronJob) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Job) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *CronJob) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -313,70 +482,7 @@ func (m *Job) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *JobCondition) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *JobCondition) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *JobCondition) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - i -= len(m.Message) - copy(dAtA[i:], m.Message) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Message))) - i-- - dAtA[i] = 0x32 - i -= len(m.Reason) - copy(dAtA[i:], m.Reason) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Reason))) - i-- - dAtA[i] = 0x2a - { - size, err := m.LastTransitionTime.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - { - size, err := m.LastProbeTime.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - i -= len(m.Status) - copy(dAtA[i:], m.Status) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Status))) - i-- - dAtA[i] = 0x12 - i -= len(m.Type) - copy(dAtA[i:], m.Type) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Type))) - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *JobList) Marshal() (dAtA []byte, err error) { +func (m *CronJobList) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -386,12 +492,12 @@ func (m *JobList) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *JobList) MarshalTo(dAtA []byte) (int, error) { +func (m *CronJobList) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *JobList) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *CronJobList) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -423,7 +529,7 @@ func (m *JobList) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *JobSpec) Marshal() (dAtA []byte, err error) { +func (m *CronJobSpec) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -433,28 +539,28 @@ func (m *JobSpec) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *JobSpec) MarshalTo(dAtA []byte) (int, error) { +func (m *CronJobSpec) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *JobSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *CronJobSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if m.TTLSecondsAfterFinished != nil { - i = encodeVarintGenerated(dAtA, i, uint64(*m.TTLSecondsAfterFinished)) + if m.FailedJobsHistoryLimit != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.FailedJobsHistoryLimit)) i-- - dAtA[i] = 0x40 + dAtA[i] = 0x38 } - if m.BackoffLimit != nil { - i = encodeVarintGenerated(dAtA, i, uint64(*m.BackoffLimit)) + if m.SuccessfulJobsHistoryLimit != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.SuccessfulJobsHistoryLimit)) i-- - dAtA[i] = 0x38 + dAtA[i] = 0x30 } { - size, err := m.Template.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.JobTemplate.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -462,48 +568,36 @@ func (m *JobSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintGenerated(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x32 - if m.ManualSelector != nil { + dAtA[i] = 0x2a + if m.Suspend != nil { i-- - if *m.ManualSelector { + if *m.Suspend { dAtA[i] = 1 } else { dAtA[i] = 0 } i-- - dAtA[i] = 0x28 - } - if m.Selector != nil { - { - size, err := m.Selector.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - if m.ActiveDeadlineSeconds != nil { - i = encodeVarintGenerated(dAtA, i, uint64(*m.ActiveDeadlineSeconds)) - i-- - dAtA[i] = 0x18 + dAtA[i] = 0x20 } - if m.Completions != nil { - i = encodeVarintGenerated(dAtA, i, uint64(*m.Completions)) + i -= len(m.ConcurrencyPolicy) + copy(dAtA[i:], m.ConcurrencyPolicy) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.ConcurrencyPolicy))) + i-- + dAtA[i] = 0x1a + if m.StartingDeadlineSeconds != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.StartingDeadlineSeconds)) i-- dAtA[i] = 0x10 } - if m.Parallelism != nil { - i = encodeVarintGenerated(dAtA, i, uint64(*m.Parallelism)) - i-- - dAtA[i] = 0x8 - } + i -= len(m.Schedule) + copy(dAtA[i:], m.Schedule) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Schedule))) + i-- + dAtA[i] = 0xa return len(dAtA) - i, nil } -func (m *JobStatus) Marshal() (dAtA []byte, err error) { +func (m *CronJobStatus) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -513,28 +607,19 @@ func (m *JobStatus) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *JobStatus) MarshalTo(dAtA []byte) (int, error) { +func (m *CronJobStatus) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *JobStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *CronJobStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - i = encodeVarintGenerated(dAtA, i, uint64(m.Failed)) - i-- - dAtA[i] = 0x30 - i = encodeVarintGenerated(dAtA, i, uint64(m.Succeeded)) - i-- - dAtA[i] = 0x28 - i = encodeVarintGenerated(dAtA, i, uint64(m.Active)) - i-- - dAtA[i] = 0x20 - if m.CompletionTime != nil { + if m.LastSuccessfulTime != nil { { - size, err := m.CompletionTime.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.LastSuccessfulTime.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -542,11 +627,11 @@ func (m *JobStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintGenerated(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x1a + dAtA[i] = 0x2a } - if m.StartTime != nil { + if m.LastScheduleTime != nil { { - size, err := m.StartTime.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.LastScheduleTime.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -554,12 +639,12 @@ func (m *JobStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintGenerated(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x12 + dAtA[i] = 0x22 } - if len(m.Conditions) > 0 { - for iNdEx := len(m.Conditions) - 1; iNdEx >= 0; iNdEx-- { + if len(m.Active) > 0 { + for iNdEx := len(m.Active) - 1; iNdEx >= 0; iNdEx-- { { - size, err := m.Conditions[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + size, err := m.Active[iNdEx].MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -573,222 +658,1429 @@ func (m *JobStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func encodeVarintGenerated(dAtA []byte, offset int, v uint64) int { - offset -= sovGenerated(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ +func (m *Job) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - dAtA[offset] = uint8(v) - return base + return dAtA[:n], nil } -func (m *Job) Size() (n int) { - if m == nil { - return 0 - } + +func (m *Job) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Job) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - l = m.ObjectMeta.Size() - n += 1 + l + sovGenerated(uint64(l)) - l = m.Spec.Size() - n += 1 + l + sovGenerated(uint64(l)) - l = m.Status.Size() - n += 1 + l + sovGenerated(uint64(l)) - return n + { + size, err := m.Status.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + { + size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil } -func (m *JobCondition) Size() (n int) { - if m == nil { - return 0 +func (m *JobCondition) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *JobCondition) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *JobCondition) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - l = len(m.Type) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Status) - n += 1 + l + sovGenerated(uint64(l)) - l = m.LastProbeTime.Size() - n += 1 + l + sovGenerated(uint64(l)) - l = m.LastTransitionTime.Size() - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Reason) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Message) - n += 1 + l + sovGenerated(uint64(l)) - return n + i -= len(m.Message) + copy(dAtA[i:], m.Message) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Message))) + i-- + dAtA[i] = 0x32 + i -= len(m.Reason) + copy(dAtA[i:], m.Reason) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Reason))) + i-- + dAtA[i] = 0x2a + { + size, err := m.LastTransitionTime.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + { + size, err := m.LastProbeTime.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + i -= len(m.Status) + copy(dAtA[i:], m.Status) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Status))) + i-- + dAtA[i] = 0x12 + i -= len(m.Type) + copy(dAtA[i:], m.Type) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Type))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil } -func (m *JobList) Size() (n int) { - if m == nil { - return 0 +func (m *JobList) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *JobList) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *JobList) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - l = m.ListMeta.Size() - n += 1 + l + sovGenerated(uint64(l)) if len(m.Items) > 0 { - for _, e := range m.Items { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) + for iNdEx := len(m.Items) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Items[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 } } - return n + { + size, err := m.ListMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil } -func (m *JobSpec) Size() (n int) { - if m == nil { - return 0 +func (m *JobSpec) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *JobSpec) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *JobSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - if m.Parallelism != nil { - n += 1 + sovGenerated(uint64(*m.Parallelism)) + if m.Suspend != nil { + i-- + if *m.Suspend { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x50 } - if m.Completions != nil { - n += 1 + sovGenerated(uint64(*m.Completions)) + if m.CompletionMode != nil { + i -= len(*m.CompletionMode) + copy(dAtA[i:], *m.CompletionMode) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.CompletionMode))) + i-- + dAtA[i] = 0x4a } - if m.ActiveDeadlineSeconds != nil { - n += 1 + sovGenerated(uint64(*m.ActiveDeadlineSeconds)) + if m.TTLSecondsAfterFinished != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.TTLSecondsAfterFinished)) + i-- + dAtA[i] = 0x40 } - if m.Selector != nil { - l = m.Selector.Size() - n += 1 + l + sovGenerated(uint64(l)) + if m.BackoffLimit != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.BackoffLimit)) + i-- + dAtA[i] = 0x38 + } + { + size, err := m.Template.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0x32 if m.ManualSelector != nil { - n += 2 + i-- + if *m.ManualSelector { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x28 } - l = m.Template.Size() - n += 1 + l + sovGenerated(uint64(l)) - if m.BackoffLimit != nil { - n += 1 + sovGenerated(uint64(*m.BackoffLimit)) + if m.Selector != nil { + { + size, err := m.Selector.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 } - if m.TTLSecondsAfterFinished != nil { - n += 1 + sovGenerated(uint64(*m.TTLSecondsAfterFinished)) + if m.ActiveDeadlineSeconds != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.ActiveDeadlineSeconds)) + i-- + dAtA[i] = 0x18 } - return n + if m.Completions != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.Completions)) + i-- + dAtA[i] = 0x10 + } + if m.Parallelism != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.Parallelism)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil } -func (m *JobStatus) Size() (n int) { - if m == nil { - return 0 +func (m *JobStatus) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *JobStatus) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *JobStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - if len(m.Conditions) > 0 { - for _, e := range m.Conditions { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) + i -= len(m.CompletedIndexes) + copy(dAtA[i:], m.CompletedIndexes) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.CompletedIndexes))) + i-- + dAtA[i] = 0x3a + i = encodeVarintGenerated(dAtA, i, uint64(m.Failed)) + i-- + dAtA[i] = 0x30 + i = encodeVarintGenerated(dAtA, i, uint64(m.Succeeded)) + i-- + dAtA[i] = 0x28 + i = encodeVarintGenerated(dAtA, i, uint64(m.Active)) + i-- + dAtA[i] = 0x20 + if m.CompletionTime != nil { + { + size, err := m.CompletionTime.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0x1a } if m.StartTime != nil { - l = m.StartTime.Size() - n += 1 + l + sovGenerated(uint64(l)) + { + size, err := m.StartTime.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 } - if m.CompletionTime != nil { - l = m.CompletionTime.Size() - n += 1 + l + sovGenerated(uint64(l)) + if len(m.Conditions) > 0 { + for iNdEx := len(m.Conditions) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Conditions[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } } - n += 1 + sovGenerated(uint64(m.Active)) - n += 1 + sovGenerated(uint64(m.Succeeded)) - n += 1 + sovGenerated(uint64(m.Failed)) - return n + return len(dAtA) - i, nil } -func sovGenerated(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 +func (m *JobTemplateSpec) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil } -func sozGenerated(x uint64) (n int) { - return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63)))) + +func (m *JobTemplateSpec) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) } -func (this *Job) String() string { - if this == nil { - return "nil" + +func (m *JobTemplateSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) } - s := strings.Join([]string{`&Job{`, - `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, - `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "JobSpec", "JobSpec", 1), `&`, ``, 1) + `,`, - `Status:` + strings.Replace(strings.Replace(this.Status.String(), "JobStatus", "JobStatus", 1), `&`, ``, 1) + `,`, - `}`, - }, "") - return s + i-- + dAtA[i] = 0x12 + { + size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil } -func (this *JobCondition) String() string { - if this == nil { - return "nil" + +func encodeVarintGenerated(dAtA []byte, offset int, v uint64) int { + offset -= sovGenerated(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ } - s := strings.Join([]string{`&JobCondition{`, - `Type:` + fmt.Sprintf("%v", this.Type) + `,`, - `Status:` + fmt.Sprintf("%v", this.Status) + `,`, - `LastProbeTime:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.LastProbeTime), "Time", "v1.Time", 1), `&`, ``, 1) + `,`, - `LastTransitionTime:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.LastTransitionTime), "Time", "v1.Time", 1), `&`, ``, 1) + `,`, - `Reason:` + fmt.Sprintf("%v", this.Reason) + `,`, - `Message:` + fmt.Sprintf("%v", this.Message) + `,`, - `}`, - }, "") - return s + dAtA[offset] = uint8(v) + return base } -func (this *JobList) String() string { - if this == nil { - return "nil" +func (m *CronJob) Size() (n int) { + if m == nil { + return 0 } - repeatedStringForItems := "[]Job{" - for _, f := range this.Items { - repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "Job", "Job", 1), `&`, ``, 1) + "," + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Spec.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Status.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *CronJobList) Size() (n int) { + if m == nil { + return 0 } - repeatedStringForItems += "}" - s := strings.Join([]string{`&JobList{`, - `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, - `Items:` + repeatedStringForItems + `,`, - `}`, - }, "") - return s + var l int + _ = l + l = m.ListMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n } -func (this *JobSpec) String() string { - if this == nil { - return "nil" + +func (m *CronJobSpec) Size() (n int) { + if m == nil { + return 0 } - s := strings.Join([]string{`&JobSpec{`, - `Parallelism:` + valueToStringGenerated(this.Parallelism) + `,`, - `Completions:` + valueToStringGenerated(this.Completions) + `,`, - `ActiveDeadlineSeconds:` + valueToStringGenerated(this.ActiveDeadlineSeconds) + `,`, - `Selector:` + strings.Replace(fmt.Sprintf("%v", this.Selector), "LabelSelector", "v1.LabelSelector", 1) + `,`, - `ManualSelector:` + valueToStringGenerated(this.ManualSelector) + `,`, - `Template:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Template), "PodTemplateSpec", "v11.PodTemplateSpec", 1), `&`, ``, 1) + `,`, - `BackoffLimit:` + valueToStringGenerated(this.BackoffLimit) + `,`, - `TTLSecondsAfterFinished:` + valueToStringGenerated(this.TTLSecondsAfterFinished) + `,`, - `}`, - }, "") - return s + var l int + _ = l + l = len(m.Schedule) + n += 1 + l + sovGenerated(uint64(l)) + if m.StartingDeadlineSeconds != nil { + n += 1 + sovGenerated(uint64(*m.StartingDeadlineSeconds)) + } + l = len(m.ConcurrencyPolicy) + n += 1 + l + sovGenerated(uint64(l)) + if m.Suspend != nil { + n += 2 + } + l = m.JobTemplate.Size() + n += 1 + l + sovGenerated(uint64(l)) + if m.SuccessfulJobsHistoryLimit != nil { + n += 1 + sovGenerated(uint64(*m.SuccessfulJobsHistoryLimit)) + } + if m.FailedJobsHistoryLimit != nil { + n += 1 + sovGenerated(uint64(*m.FailedJobsHistoryLimit)) + } + return n } -func (this *JobStatus) String() string { - if this == nil { - return "nil" + +func (m *CronJobStatus) Size() (n int) { + if m == nil { + return 0 } - repeatedStringForConditions := "[]JobCondition{" - for _, f := range this.Conditions { - repeatedStringForConditions += strings.Replace(strings.Replace(f.String(), "JobCondition", "JobCondition", 1), `&`, ``, 1) + "," + var l int + _ = l + if len(m.Active) > 0 { + for _, e := range m.Active { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if m.LastScheduleTime != nil { + l = m.LastScheduleTime.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.LastSuccessfulTime != nil { + l = m.LastSuccessfulTime.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *Job) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Spec.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Status.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *JobCondition) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Type) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Status) + n += 1 + l + sovGenerated(uint64(l)) + l = m.LastProbeTime.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.LastTransitionTime.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Reason) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Message) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *JobList) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ListMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *JobSpec) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Parallelism != nil { + n += 1 + sovGenerated(uint64(*m.Parallelism)) + } + if m.Completions != nil { + n += 1 + sovGenerated(uint64(*m.Completions)) + } + if m.ActiveDeadlineSeconds != nil { + n += 1 + sovGenerated(uint64(*m.ActiveDeadlineSeconds)) + } + if m.Selector != nil { + l = m.Selector.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.ManualSelector != nil { + n += 2 + } + l = m.Template.Size() + n += 1 + l + sovGenerated(uint64(l)) + if m.BackoffLimit != nil { + n += 1 + sovGenerated(uint64(*m.BackoffLimit)) + } + if m.TTLSecondsAfterFinished != nil { + n += 1 + sovGenerated(uint64(*m.TTLSecondsAfterFinished)) + } + if m.CompletionMode != nil { + l = len(*m.CompletionMode) + n += 1 + l + sovGenerated(uint64(l)) + } + if m.Suspend != nil { + n += 2 + } + return n +} + +func (m *JobStatus) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Conditions) > 0 { + for _, e := range m.Conditions { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if m.StartTime != nil { + l = m.StartTime.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.CompletionTime != nil { + l = m.CompletionTime.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + n += 1 + sovGenerated(uint64(m.Active)) + n += 1 + sovGenerated(uint64(m.Succeeded)) + n += 1 + sovGenerated(uint64(m.Failed)) + l = len(m.CompletedIndexes) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *JobTemplateSpec) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Spec.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func sovGenerated(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozGenerated(x uint64) (n int) { + return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (this *CronJob) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&CronJob{`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "CronJobSpec", "CronJobSpec", 1), `&`, ``, 1) + `,`, + `Status:` + strings.Replace(strings.Replace(this.Status.String(), "CronJobStatus", "CronJobStatus", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *CronJobList) String() string { + if this == nil { + return "nil" + } + repeatedStringForItems := "[]CronJob{" + for _, f := range this.Items { + repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "CronJob", "CronJob", 1), `&`, ``, 1) + "," + } + repeatedStringForItems += "}" + s := strings.Join([]string{`&CronJobList{`, + `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, + `Items:` + repeatedStringForItems + `,`, + `}`, + }, "") + return s +} +func (this *CronJobSpec) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&CronJobSpec{`, + `Schedule:` + fmt.Sprintf("%v", this.Schedule) + `,`, + `StartingDeadlineSeconds:` + valueToStringGenerated(this.StartingDeadlineSeconds) + `,`, + `ConcurrencyPolicy:` + fmt.Sprintf("%v", this.ConcurrencyPolicy) + `,`, + `Suspend:` + valueToStringGenerated(this.Suspend) + `,`, + `JobTemplate:` + strings.Replace(strings.Replace(this.JobTemplate.String(), "JobTemplateSpec", "JobTemplateSpec", 1), `&`, ``, 1) + `,`, + `SuccessfulJobsHistoryLimit:` + valueToStringGenerated(this.SuccessfulJobsHistoryLimit) + `,`, + `FailedJobsHistoryLimit:` + valueToStringGenerated(this.FailedJobsHistoryLimit) + `,`, + `}`, + }, "") + return s +} +func (this *CronJobStatus) String() string { + if this == nil { + return "nil" + } + repeatedStringForActive := "[]ObjectReference{" + for _, f := range this.Active { + repeatedStringForActive += fmt.Sprintf("%v", f) + "," + } + repeatedStringForActive += "}" + s := strings.Join([]string{`&CronJobStatus{`, + `Active:` + repeatedStringForActive + `,`, + `LastScheduleTime:` + strings.Replace(fmt.Sprintf("%v", this.LastScheduleTime), "Time", "v1.Time", 1) + `,`, + `LastSuccessfulTime:` + strings.Replace(fmt.Sprintf("%v", this.LastSuccessfulTime), "Time", "v1.Time", 1) + `,`, + `}`, + }, "") + return s +} +func (this *Job) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Job{`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "JobSpec", "JobSpec", 1), `&`, ``, 1) + `,`, + `Status:` + strings.Replace(strings.Replace(this.Status.String(), "JobStatus", "JobStatus", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *JobCondition) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&JobCondition{`, + `Type:` + fmt.Sprintf("%v", this.Type) + `,`, + `Status:` + fmt.Sprintf("%v", this.Status) + `,`, + `LastProbeTime:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.LastProbeTime), "Time", "v1.Time", 1), `&`, ``, 1) + `,`, + `LastTransitionTime:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.LastTransitionTime), "Time", "v1.Time", 1), `&`, ``, 1) + `,`, + `Reason:` + fmt.Sprintf("%v", this.Reason) + `,`, + `Message:` + fmt.Sprintf("%v", this.Message) + `,`, + `}`, + }, "") + return s +} +func (this *JobList) String() string { + if this == nil { + return "nil" + } + repeatedStringForItems := "[]Job{" + for _, f := range this.Items { + repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "Job", "Job", 1), `&`, ``, 1) + "," + } + repeatedStringForItems += "}" + s := strings.Join([]string{`&JobList{`, + `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, + `Items:` + repeatedStringForItems + `,`, + `}`, + }, "") + return s +} +func (this *JobSpec) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&JobSpec{`, + `Parallelism:` + valueToStringGenerated(this.Parallelism) + `,`, + `Completions:` + valueToStringGenerated(this.Completions) + `,`, + `ActiveDeadlineSeconds:` + valueToStringGenerated(this.ActiveDeadlineSeconds) + `,`, + `Selector:` + strings.Replace(fmt.Sprintf("%v", this.Selector), "LabelSelector", "v1.LabelSelector", 1) + `,`, + `ManualSelector:` + valueToStringGenerated(this.ManualSelector) + `,`, + `Template:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Template), "PodTemplateSpec", "v11.PodTemplateSpec", 1), `&`, ``, 1) + `,`, + `BackoffLimit:` + valueToStringGenerated(this.BackoffLimit) + `,`, + `TTLSecondsAfterFinished:` + valueToStringGenerated(this.TTLSecondsAfterFinished) + `,`, + `CompletionMode:` + valueToStringGenerated(this.CompletionMode) + `,`, + `Suspend:` + valueToStringGenerated(this.Suspend) + `,`, + `}`, + }, "") + return s +} +func (this *JobStatus) String() string { + if this == nil { + return "nil" + } + repeatedStringForConditions := "[]JobCondition{" + for _, f := range this.Conditions { + repeatedStringForConditions += strings.Replace(strings.Replace(f.String(), "JobCondition", "JobCondition", 1), `&`, ``, 1) + "," + } + repeatedStringForConditions += "}" + s := strings.Join([]string{`&JobStatus{`, + `Conditions:` + repeatedStringForConditions + `,`, + `StartTime:` + strings.Replace(fmt.Sprintf("%v", this.StartTime), "Time", "v1.Time", 1) + `,`, + `CompletionTime:` + strings.Replace(fmt.Sprintf("%v", this.CompletionTime), "Time", "v1.Time", 1) + `,`, + `Active:` + fmt.Sprintf("%v", this.Active) + `,`, + `Succeeded:` + fmt.Sprintf("%v", this.Succeeded) + `,`, + `Failed:` + fmt.Sprintf("%v", this.Failed) + `,`, + `CompletedIndexes:` + fmt.Sprintf("%v", this.CompletedIndexes) + `,`, + `}`, + }, "") + return s +} +func (this *JobTemplateSpec) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&JobTemplateSpec{`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "JobSpec", "JobSpec", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func valueToStringGenerated(v interface{}) string { + rv := reflect.ValueOf(v) + if rv.IsNil() { + return "nil" + } + pv := reflect.Indirect(rv).Interface() + return fmt.Sprintf("*%v", pv) +} +func (m *CronJob) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CronJob: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CronJob: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CronJobList) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CronJobList: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CronJobList: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Items = append(m.Items, CronJob{}) + if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CronJobSpec) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CronJobSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CronJobSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Schedule", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Schedule = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field StartingDeadlineSeconds", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.StartingDeadlineSeconds = &v + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConcurrencyPolicy", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ConcurrencyPolicy = ConcurrencyPolicy(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Suspend", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.Suspend = &b + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field JobTemplate", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.JobTemplate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SuccessfulJobsHistoryLimit", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.SuccessfulJobsHistoryLimit = &v + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field FailedJobsHistoryLimit", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.FailedJobsHistoryLimit = &v + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CronJobStatus) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CronJobStatus: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CronJobStatus: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Active", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Active = append(m.Active, v11.ObjectReference{}) + if err := m.Active[len(m.Active)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LastScheduleTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.LastScheduleTime == nil { + m.LastScheduleTime = &v1.Time{} + } + if err := m.LastScheduleTime.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LastSuccessfulTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.LastSuccessfulTime == nil { + m.LastSuccessfulTime = &v1.Time{} + } + if err := m.LastSuccessfulTime.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } } - repeatedStringForConditions += "}" - s := strings.Join([]string{`&JobStatus{`, - `Conditions:` + repeatedStringForConditions + `,`, - `StartTime:` + strings.Replace(fmt.Sprintf("%v", this.StartTime), "Time", "v1.Time", 1) + `,`, - `CompletionTime:` + strings.Replace(fmt.Sprintf("%v", this.CompletionTime), "Time", "v1.Time", 1) + `,`, - `Active:` + fmt.Sprintf("%v", this.Active) + `,`, - `Succeeded:` + fmt.Sprintf("%v", this.Succeeded) + `,`, - `Failed:` + fmt.Sprintf("%v", this.Failed) + `,`, - `}`, - }, "") - return s -} -func valueToStringGenerated(v interface{}) string { - rv := reflect.ValueOf(v) - if rv.IsNil() { - return "nil" + + if iNdEx > l { + return io.ErrUnexpectedEOF } - pv := reflect.Indirect(rv).Interface() - return fmt.Sprintf("*%v", pv) + return nil } func (m *Job) Unmarshal(dAtA []byte) error { l := len(dAtA) @@ -924,10 +2216,7 @@ func (m *Job) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1171,10 +2460,7 @@ func (m *JobCondition) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1291,10 +2577,7 @@ func (m *JobList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1528,16 +2811,67 @@ func (m *JobSpec) Unmarshal(dAtA []byte) error { } } m.TTLSecondsAfterFinished = &v + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CompletionMode", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := CompletionMode(dAtA[iNdEx:postIndex]) + m.CompletionMode = &s + iNdEx = postIndex + case 10: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Suspend", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.Suspend = &b default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1744,16 +3078,161 @@ func (m *JobStatus) Unmarshal(dAtA []byte) error { break } } + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CompletedIndexes", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.CompletedIndexes = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *JobTemplateSpec) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: JobTemplateSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: JobTemplateSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { return ErrInvalidLengthGenerated } - if (iNdEx + skippy) < 0 { + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/api/batch/v1/generated.proto b/vendor/k8s.io/api/batch/v1/generated.proto index 7548c04dc190..04f0e7ea7e69 100644 --- a/vendor/k8s.io/api/batch/v1/generated.proto +++ b/vendor/k8s.io/api/batch/v1/generated.proto @@ -29,6 +29,88 @@ import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; // Package-wide variables from generator "generated". option go_package = "v1"; +// CronJob represents the configuration of a single cron job. +message CronJob { + // Standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; + + // Specification of the desired behavior of a cron job, including the schedule. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status + // +optional + optional CronJobSpec spec = 2; + + // Current status of a cron job. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status + // +optional + optional CronJobStatus status = 3; +} + +// CronJobList is a collection of cron jobs. +message CronJobList { + // Standard list metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; + + // items is the list of CronJobs. + repeated CronJob items = 2; +} + +// CronJobSpec describes how the job execution will look like and when it will actually run. +message CronJobSpec { + // The schedule in Cron format, see https://en.wikipedia.org/wiki/Cron. + optional string schedule = 1; + + // Optional deadline in seconds for starting the job if it misses scheduled + // time for any reason. Missed jobs executions will be counted as failed ones. + // +optional + optional int64 startingDeadlineSeconds = 2; + + // Specifies how to treat concurrent executions of a Job. + // Valid values are: + // - "Allow" (default): allows CronJobs to run concurrently; + // - "Forbid": forbids concurrent runs, skipping next run if previous run hasn't finished yet; + // - "Replace": cancels currently running job and replaces it with a new one + // +optional + optional string concurrencyPolicy = 3; + + // This flag tells the controller to suspend subsequent executions, it does + // not apply to already started executions. Defaults to false. + // +optional + optional bool suspend = 4; + + // Specifies the job that will be created when executing a CronJob. + optional JobTemplateSpec jobTemplate = 5; + + // The number of successful finished jobs to retain. Value must be non-negative integer. + // Defaults to 3. + // +optional + optional int32 successfulJobsHistoryLimit = 6; + + // The number of failed finished jobs to retain. Value must be non-negative integer. + // Defaults to 1. + // +optional + optional int32 failedJobsHistoryLimit = 7; +} + +// CronJobStatus represents the current state of a cron job. +message CronJobStatus { + // A list of pointers to currently running jobs. + // +optional + // +listType=atomic + repeated k8s.io.api.core.v1.ObjectReference active = 1; + + // Information when was the last time the job was successfully scheduled. + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.Time lastScheduleTime = 4; + + // Information when was the last time the job successfully completed. + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.Time lastSuccessfulTime = 5; +} + // Job represents the configuration of a single job. message Job { // Standard object's metadata. @@ -102,8 +184,11 @@ message JobSpec { // +optional optional int32 completions = 2; - // Specifies the duration in seconds relative to the startTime that the job may be active - // before the system tries to terminate it; value must be positive integer + // Specifies the duration in seconds relative to the startTime that the job + // may be continuously active before the system tries to terminate it; value + // must be positive integer. If a Job is suspended (at creation or through an + // update), this timer will effectively be stopped and reset when the Job is + // resumed again. // +optional optional int64 activeDeadlineSeconds = 3; @@ -146,21 +231,61 @@ message JobSpec { // TTLAfterFinished feature. // +optional optional int32 ttlSecondsAfterFinished = 8; + + // CompletionMode specifies how Pod completions are tracked. It can be + // `NonIndexed` (default) or `Indexed`. + // + // `NonIndexed` means that the Job is considered complete when there have + // been .spec.completions successfully completed Pods. Each Pod completion is + // homologous to each other. + // + // `Indexed` means that the Pods of a + // Job get an associated completion index from 0 to (.spec.completions - 1), + // available in the annotation batch.kubernetes.io/job-completion-index. + // The Job is considered complete when there is one successfully completed Pod + // for each index. + // When value is `Indexed`, .spec.completions must be specified and + // `.spec.parallelism` must be less than or equal to 10^5. + // + // This field is alpha-level and is only honored by servers that enable the + // IndexedJob feature gate. More completion modes can be added in the future. + // If the Job controller observes a mode that it doesn't recognize, the + // controller skips updates for the Job. + // +optional + optional string completionMode = 9; + + // Suspend specifies whether the Job controller should create Pods or not. If + // a Job is created with suspend set to true, no Pods are created by the Job + // controller. If a Job is suspended after creation (i.e. the flag goes from + // false to true), the Job controller will delete all active Pods associated + // with this Job. Users must design their workload to gracefully handle this. + // Suspending a Job will reset the StartTime field of the Job, effectively + // resetting the ActiveDeadlineSeconds timer too. This is an alpha field and + // requires the SuspendJob feature gate to be enabled; otherwise this field + // may not be set to true. Defaults to false. + // +optional + optional bool suspend = 10; } // JobStatus represents the current state of a Job. message JobStatus { - // The latest available observations of an object's current state. - // When a job fails, one of the conditions will have type == "Failed". + // The latest available observations of an object's current state. When a Job + // fails, one of the conditions will have type "Failed" and status true. When + // a Job is suspended, one of the conditions will have type "Suspended" and + // status true; when the Job is resumed, the status of this condition will + // become false. When a Job is completed, one of the conditions will have + // type "Complete" and status true. // More info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/ // +optional // +patchMergeKey=type // +patchStrategy=merge + // +listType=atomic repeated JobCondition conditions = 1; - // Represents time when the job was acknowledged by the job controller. - // It is not guaranteed to be set in happens-before order across separate operations. - // It is represented in RFC3339 form and is in UTC. + // Represents time when the job controller started processing a job. When a + // Job is created in the suspended state, this field is not set until the + // first time it is resumed. This field is reset every time a Job is resumed + // from suspension. It is represented in RFC3339 form and is in UTC. // +optional optional k8s.io.apimachinery.pkg.apis.meta.v1.Time startTime = 2; @@ -182,5 +307,28 @@ message JobStatus { // The number of pods which reached phase Failed. // +optional optional int32 failed = 6; + + // CompletedIndexes holds the completed indexes when .spec.completionMode = + // "Indexed" in a text format. The indexes are represented as decimal integers + // separated by commas. The numbers are listed in increasing order. Three or + // more consecutive numbers are compressed and represented by the first and + // last element of the series, separated by a hyphen. + // For example, if the completed indexes are 1, 3, 4, 5 and 7, they are + // represented as "1,3-5,7". + // +optional + optional string completedIndexes = 7; +} + +// JobTemplateSpec describes the data a Job should have when created from a template +message JobTemplateSpec { + // Standard object's metadata of the jobs created from this template. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; + + // Specification of the desired behavior of the job. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status + // +optional + optional JobSpec spec = 2; } diff --git a/vendor/k8s.io/api/batch/v1/register.go b/vendor/k8s.io/api/batch/v1/register.go index 32fa51f0e4a3..17029cdf29f8 100644 --- a/vendor/k8s.io/api/batch/v1/register.go +++ b/vendor/k8s.io/api/batch/v1/register.go @@ -46,6 +46,8 @@ func addKnownTypes(scheme *runtime.Scheme) error { scheme.AddKnownTypes(SchemeGroupVersion, &Job{}, &JobList{}, + &CronJob{}, + &CronJobList{}, ) metav1.AddToGroupVersion(scheme, SchemeGroupVersion) return nil diff --git a/vendor/k8s.io/api/batch/v1/types.go b/vendor/k8s.io/api/batch/v1/types.go index fd478874a13d..12f4b04cbd9a 100644 --- a/vendor/k8s.io/api/batch/v1/types.go +++ b/vendor/k8s.io/api/batch/v1/types.go @@ -21,6 +21,8 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) +const JobCompletionIndexAnnotationAlpha = "batch.kubernetes.io/job-completion-index" + // +genclient // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object @@ -57,6 +59,22 @@ type JobList struct { Items []Job `json:"items" protobuf:"bytes,2,rep,name=items"` } +// CompletionMode specifies how Pod completions of a Job are tracked. +type CompletionMode string + +const ( + // NonIndexedCompletion is a Job completion mode. In this mode, the Job is + // considered complete when there have been .spec.completions + // successfully completed Pods. Pod completions are homologous to each other. + NonIndexedCompletion CompletionMode = "NonIndexed" + + // IndexedCompletion is a Job completion mode. In this mode, the Pods of a + // Job get an associated completion index from 0 to (.spec.completions - 1). + // The Job is considered complete when a Pod completes for each completion + // index. + IndexedCompletion CompletionMode = "Indexed" +) + // JobSpec describes how the job execution will look like. type JobSpec struct { @@ -77,8 +95,11 @@ type JobSpec struct { // +optional Completions *int32 `json:"completions,omitempty" protobuf:"varint,2,opt,name=completions"` - // Specifies the duration in seconds relative to the startTime that the job may be active - // before the system tries to terminate it; value must be positive integer + // Specifies the duration in seconds relative to the startTime that the job + // may be continuously active before the system tries to terminate it; value + // must be positive integer. If a Job is suspended (at creation or through an + // update), this timer will effectively be stopped and reset when the Job is + // resumed again. // +optional ActiveDeadlineSeconds *int64 `json:"activeDeadlineSeconds,omitempty" protobuf:"varint,3,opt,name=activeDeadlineSeconds"` @@ -126,21 +147,61 @@ type JobSpec struct { // TTLAfterFinished feature. // +optional TTLSecondsAfterFinished *int32 `json:"ttlSecondsAfterFinished,omitempty" protobuf:"varint,8,opt,name=ttlSecondsAfterFinished"` + + // CompletionMode specifies how Pod completions are tracked. It can be + // `NonIndexed` (default) or `Indexed`. + // + // `NonIndexed` means that the Job is considered complete when there have + // been .spec.completions successfully completed Pods. Each Pod completion is + // homologous to each other. + // + // `Indexed` means that the Pods of a + // Job get an associated completion index from 0 to (.spec.completions - 1), + // available in the annotation batch.kubernetes.io/job-completion-index. + // The Job is considered complete when there is one successfully completed Pod + // for each index. + // When value is `Indexed`, .spec.completions must be specified and + // `.spec.parallelism` must be less than or equal to 10^5. + // + // This field is alpha-level and is only honored by servers that enable the + // IndexedJob feature gate. More completion modes can be added in the future. + // If the Job controller observes a mode that it doesn't recognize, the + // controller skips updates for the Job. + // +optional + CompletionMode *CompletionMode `json:"completionMode,omitempty" protobuf:"bytes,9,opt,name=completionMode,casttype=CompletionMode"` + + // Suspend specifies whether the Job controller should create Pods or not. If + // a Job is created with suspend set to true, no Pods are created by the Job + // controller. If a Job is suspended after creation (i.e. the flag goes from + // false to true), the Job controller will delete all active Pods associated + // with this Job. Users must design their workload to gracefully handle this. + // Suspending a Job will reset the StartTime field of the Job, effectively + // resetting the ActiveDeadlineSeconds timer too. This is an alpha field and + // requires the SuspendJob feature gate to be enabled; otherwise this field + // may not be set to true. Defaults to false. + // +optional + Suspend *bool `json:"suspend,omitempty" protobuf:"varint,10,opt,name=suspend"` } // JobStatus represents the current state of a Job. type JobStatus struct { - // The latest available observations of an object's current state. - // When a job fails, one of the conditions will have type == "Failed". + // The latest available observations of an object's current state. When a Job + // fails, one of the conditions will have type "Failed" and status true. When + // a Job is suspended, one of the conditions will have type "Suspended" and + // status true; when the Job is resumed, the status of this condition will + // become false. When a Job is completed, one of the conditions will have + // type "Complete" and status true. // More info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/ // +optional // +patchMergeKey=type // +patchStrategy=merge + // +listType=atomic Conditions []JobCondition `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type" protobuf:"bytes,1,rep,name=conditions"` - // Represents time when the job was acknowledged by the job controller. - // It is not guaranteed to be set in happens-before order across separate operations. - // It is represented in RFC3339 form and is in UTC. + // Represents time when the job controller started processing a job. When a + // Job is created in the suspended state, this field is not set until the + // first time it is resumed. This field is reset every time a Job is resumed + // from suspension. It is represented in RFC3339 form and is in UTC. // +optional StartTime *metav1.Time `json:"startTime,omitempty" protobuf:"bytes,2,opt,name=startTime"` @@ -162,12 +223,24 @@ type JobStatus struct { // The number of pods which reached phase Failed. // +optional Failed int32 `json:"failed,omitempty" protobuf:"varint,6,opt,name=failed"` + + // CompletedIndexes holds the completed indexes when .spec.completionMode = + // "Indexed" in a text format. The indexes are represented as decimal integers + // separated by commas. The numbers are listed in increasing order. Three or + // more consecutive numbers are compressed and represented by the first and + // last element of the series, separated by a hyphen. + // For example, if the completed indexes are 1, 3, 4, 5 and 7, they are + // represented as "1,3-5,7". + // +optional + CompletedIndexes string `json:"completedIndexes,omitempty" protobuf:"bytes,7,opt,name=completedIndexes"` } type JobConditionType string // These are valid conditions of a job. const ( + // JobSuspended means the job has been suspended. + JobSuspended JobConditionType = "Suspended" // JobComplete means the job has completed its execution. JobComplete JobConditionType = "Complete" // JobFailed means the job has failed its execution. @@ -193,3 +266,125 @@ type JobCondition struct { // +optional Message string `json:"message,omitempty" protobuf:"bytes,6,opt,name=message"` } + +// JobTemplateSpec describes the data a Job should have when created from a template +type JobTemplateSpec struct { + // Standard object's metadata of the jobs created from this template. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +optional + metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + + // Specification of the desired behavior of the job. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status + // +optional + Spec JobSpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"` +} + +// +genclient +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// CronJob represents the configuration of a single cron job. +type CronJob struct { + metav1.TypeMeta `json:",inline"` + // Standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +optional + metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + + // Specification of the desired behavior of a cron job, including the schedule. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status + // +optional + Spec CronJobSpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"` + + // Current status of a cron job. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status + // +optional + Status CronJobStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// CronJobList is a collection of cron jobs. +type CronJobList struct { + metav1.TypeMeta `json:",inline"` + + // Standard list metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +optional + metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + + // items is the list of CronJobs. + Items []CronJob `json:"items" protobuf:"bytes,2,rep,name=items"` +} + +// CronJobSpec describes how the job execution will look like and when it will actually run. +type CronJobSpec struct { + + // The schedule in Cron format, see https://en.wikipedia.org/wiki/Cron. + Schedule string `json:"schedule" protobuf:"bytes,1,opt,name=schedule"` + + // Optional deadline in seconds for starting the job if it misses scheduled + // time for any reason. Missed jobs executions will be counted as failed ones. + // +optional + StartingDeadlineSeconds *int64 `json:"startingDeadlineSeconds,omitempty" protobuf:"varint,2,opt,name=startingDeadlineSeconds"` + + // Specifies how to treat concurrent executions of a Job. + // Valid values are: + // - "Allow" (default): allows CronJobs to run concurrently; + // - "Forbid": forbids concurrent runs, skipping next run if previous run hasn't finished yet; + // - "Replace": cancels currently running job and replaces it with a new one + // +optional + ConcurrencyPolicy ConcurrencyPolicy `json:"concurrencyPolicy,omitempty" protobuf:"bytes,3,opt,name=concurrencyPolicy,casttype=ConcurrencyPolicy"` + + // This flag tells the controller to suspend subsequent executions, it does + // not apply to already started executions. Defaults to false. + // +optional + Suspend *bool `json:"suspend,omitempty" protobuf:"varint,4,opt,name=suspend"` + + // Specifies the job that will be created when executing a CronJob. + JobTemplate JobTemplateSpec `json:"jobTemplate" protobuf:"bytes,5,opt,name=jobTemplate"` + + // The number of successful finished jobs to retain. Value must be non-negative integer. + // Defaults to 3. + // +optional + SuccessfulJobsHistoryLimit *int32 `json:"successfulJobsHistoryLimit,omitempty" protobuf:"varint,6,opt,name=successfulJobsHistoryLimit"` + + // The number of failed finished jobs to retain. Value must be non-negative integer. + // Defaults to 1. + // +optional + FailedJobsHistoryLimit *int32 `json:"failedJobsHistoryLimit,omitempty" protobuf:"varint,7,opt,name=failedJobsHistoryLimit"` +} + +// ConcurrencyPolicy describes how the job will be handled. +// Only one of the following concurrent policies may be specified. +// If none of the following policies is specified, the default one +// is AllowConcurrent. +type ConcurrencyPolicy string + +const ( + // AllowConcurrent allows CronJobs to run concurrently. + AllowConcurrent ConcurrencyPolicy = "Allow" + + // ForbidConcurrent forbids concurrent runs, skipping next run if previous + // hasn't finished yet. + ForbidConcurrent ConcurrencyPolicy = "Forbid" + + // ReplaceConcurrent cancels currently running job and replaces it with a new one. + ReplaceConcurrent ConcurrencyPolicy = "Replace" +) + +// CronJobStatus represents the current state of a cron job. +type CronJobStatus struct { + // A list of pointers to currently running jobs. + // +optional + // +listType=atomic + Active []v1.ObjectReference `json:"active,omitempty" protobuf:"bytes,1,rep,name=active"` + + // Information when was the last time the job was successfully scheduled. + // +optional + LastScheduleTime *metav1.Time `json:"lastScheduleTime,omitempty" protobuf:"bytes,4,opt,name=lastScheduleTime"` + + // Information when was the last time the job successfully completed. + // +optional + LastSuccessfulTime *metav1.Time `json:"lastSuccessfulTime,omitempty" protobuf:"bytes,5,opt,name=lastSuccessfulTime"` +} diff --git a/vendor/k8s.io/api/batch/v1/types_swagger_doc_generated.go b/vendor/k8s.io/api/batch/v1/types_swagger_doc_generated.go index 0d8003a727fb..d98c5edeb1e6 100644 --- a/vendor/k8s.io/api/batch/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/batch/v1/types_swagger_doc_generated.go @@ -27,6 +27,53 @@ package v1 // Those methods can be generated by using hack/update-generated-swagger-docs.sh // AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. +var map_CronJob = map[string]string{ + "": "CronJob represents the configuration of a single cron job.", + "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "Specification of the desired behavior of a cron job, including the schedule. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status", + "status": "Current status of a cron job. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status", +} + +func (CronJob) SwaggerDoc() map[string]string { + return map_CronJob +} + +var map_CronJobList = map[string]string{ + "": "CronJobList is a collection of cron jobs.", + "metadata": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "items": "items is the list of CronJobs.", +} + +func (CronJobList) SwaggerDoc() map[string]string { + return map_CronJobList +} + +var map_CronJobSpec = map[string]string{ + "": "CronJobSpec describes how the job execution will look like and when it will actually run.", + "schedule": "The schedule in Cron format, see https://en.wikipedia.org/wiki/Cron.", + "startingDeadlineSeconds": "Optional deadline in seconds for starting the job if it misses scheduled time for any reason. Missed jobs executions will be counted as failed ones.", + "concurrencyPolicy": "Specifies how to treat concurrent executions of a Job. Valid values are: - \"Allow\" (default): allows CronJobs to run concurrently; - \"Forbid\": forbids concurrent runs, skipping next run if previous run hasn't finished yet; - \"Replace\": cancels currently running job and replaces it with a new one", + "suspend": "This flag tells the controller to suspend subsequent executions, it does not apply to already started executions. Defaults to false.", + "jobTemplate": "Specifies the job that will be created when executing a CronJob.", + "successfulJobsHistoryLimit": "The number of successful finished jobs to retain. Value must be non-negative integer. Defaults to 3.", + "failedJobsHistoryLimit": "The number of failed finished jobs to retain. Value must be non-negative integer. Defaults to 1.", +} + +func (CronJobSpec) SwaggerDoc() map[string]string { + return map_CronJobSpec +} + +var map_CronJobStatus = map[string]string{ + "": "CronJobStatus represents the current state of a cron job.", + "active": "A list of pointers to currently running jobs.", + "lastScheduleTime": "Information when was the last time the job was successfully scheduled.", + "lastSuccessfulTime": "Information when was the last time the job successfully completed.", +} + +func (CronJobStatus) SwaggerDoc() map[string]string { + return map_CronJobStatus +} + var map_Job = map[string]string{ "": "Job represents the configuration of a single job.", "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", @@ -66,12 +113,14 @@ var map_JobSpec = map[string]string{ "": "JobSpec describes how the job execution will look like.", "parallelism": "Specifies the maximum desired number of pods the job should run at any given time. The actual number of pods running in steady state will be less than this number when ((.spec.completions - .status.successful) < .spec.parallelism), i.e. when the work left to do is less than max parallelism. More info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/", "completions": "Specifies the desired number of successfully finished pods the job should be run with. Setting to nil means that the success of any pod signals the success of all pods, and allows parallelism to have any positive value. Setting to 1 means that parallelism is limited to 1 and the success of that pod signals the success of the job. More info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/", - "activeDeadlineSeconds": "Specifies the duration in seconds relative to the startTime that the job may be active before the system tries to terminate it; value must be positive integer", + "activeDeadlineSeconds": "Specifies the duration in seconds relative to the startTime that the job may be continuously active before the system tries to terminate it; value must be positive integer. If a Job is suspended (at creation or through an update), this timer will effectively be stopped and reset when the Job is resumed again.", "backoffLimit": "Specifies the number of retries before marking this job failed. Defaults to 6", "selector": "A label query over pods that should match the pod count. Normally, the system sets this field for you. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors", "manualSelector": "manualSelector controls generation of pod labels and pod selectors. Leave `manualSelector` unset unless you are certain what you are doing. When false or unset, the system pick labels unique to this job and appends those labels to the pod template. When true, the user is responsible for picking unique labels and specifying the selector. Failure to pick a unique label may cause this and other jobs to not function correctly. However, You may see `manualSelector=true` in jobs that were created with the old `extensions/v1beta1` API. More info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/#specifying-your-own-pod-selector", "template": "Describes the pod that will be created when executing a job. More info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/", "ttlSecondsAfterFinished": "ttlSecondsAfterFinished limits the lifetime of a Job that has finished execution (either Complete or Failed). If this field is set, ttlSecondsAfterFinished after the Job finishes, it is eligible to be automatically deleted. When the Job is being deleted, its lifecycle guarantees (e.g. finalizers) will be honored. If this field is unset, the Job won't be automatically deleted. If this field is set to zero, the Job becomes eligible to be deleted immediately after it finishes. This field is alpha-level and is only honored by servers that enable the TTLAfterFinished feature.", + "completionMode": "CompletionMode specifies how Pod completions are tracked. It can be `NonIndexed` (default) or `Indexed`.\n\n`NonIndexed` means that the Job is considered complete when there have been .spec.completions successfully completed Pods. Each Pod completion is homologous to each other.\n\n`Indexed` means that the Pods of a Job get an associated completion index from 0 to (.spec.completions - 1), available in the annotation batch.kubernetes.io/job-completion-index. The Job is considered complete when there is one successfully completed Pod for each index. When value is `Indexed`, .spec.completions must be specified and `.spec.parallelism` must be less than or equal to 10^5.\n\nThis field is alpha-level and is only honored by servers that enable the IndexedJob feature gate. More completion modes can be added in the future. If the Job controller observes a mode that it doesn't recognize, the controller skips updates for the Job.", + "suspend": "Suspend specifies whether the Job controller should create Pods or not. If a Job is created with suspend set to true, no Pods are created by the Job controller. If a Job is suspended after creation (i.e. the flag goes from false to true), the Job controller will delete all active Pods associated with this Job. Users must design their workload to gracefully handle this. Suspending a Job will reset the StartTime field of the Job, effectively resetting the ActiveDeadlineSeconds timer too. This is an alpha field and requires the SuspendJob feature gate to be enabled; otherwise this field may not be set to true. Defaults to false.", } func (JobSpec) SwaggerDoc() map[string]string { @@ -79,17 +128,28 @@ func (JobSpec) SwaggerDoc() map[string]string { } var map_JobStatus = map[string]string{ - "": "JobStatus represents the current state of a Job.", - "conditions": "The latest available observations of an object's current state. When a job fails, one of the conditions will have type == \"Failed\". More info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/", - "startTime": "Represents time when the job was acknowledged by the job controller. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC.", - "completionTime": "Represents time when the job was completed. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. The completion time is only set when the job finishes successfully.", - "active": "The number of actively running pods.", - "succeeded": "The number of pods which reached phase Succeeded.", - "failed": "The number of pods which reached phase Failed.", + "": "JobStatus represents the current state of a Job.", + "conditions": "The latest available observations of an object's current state. When a Job fails, one of the conditions will have type \"Failed\" and status true. When a Job is suspended, one of the conditions will have type \"Suspended\" and status true; when the Job is resumed, the status of this condition will become false. When a Job is completed, one of the conditions will have type \"Complete\" and status true. More info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/", + "startTime": "Represents time when the job controller started processing a job. When a Job is created in the suspended state, this field is not set until the first time it is resumed. This field is reset every time a Job is resumed from suspension. It is represented in RFC3339 form and is in UTC.", + "completionTime": "Represents time when the job was completed. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. The completion time is only set when the job finishes successfully.", + "active": "The number of actively running pods.", + "succeeded": "The number of pods which reached phase Succeeded.", + "failed": "The number of pods which reached phase Failed.", + "completedIndexes": "CompletedIndexes holds the completed indexes when .spec.completionMode = \"Indexed\" in a text format. The indexes are represented as decimal integers separated by commas. The numbers are listed in increasing order. Three or more consecutive numbers are compressed and represented by the first and last element of the series, separated by a hyphen. For example, if the completed indexes are 1, 3, 4, 5 and 7, they are represented as \"1,3-5,7\".", } func (JobStatus) SwaggerDoc() map[string]string { return map_JobStatus } +var map_JobTemplateSpec = map[string]string{ + "": "JobTemplateSpec describes the data a Job should have when created from a template", + "metadata": "Standard object's metadata of the jobs created from this template. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "Specification of the desired behavior of the job. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status", +} + +func (JobTemplateSpec) SwaggerDoc() map[string]string { + return map_JobTemplateSpec +} + // AUTO-GENERATED FUNCTIONS END HERE diff --git a/vendor/k8s.io/api/batch/v1/zz_generated.deepcopy.go b/vendor/k8s.io/api/batch/v1/zz_generated.deepcopy.go index beba55acec66..6018ad1d3c01 100644 --- a/vendor/k8s.io/api/batch/v1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/batch/v1/zz_generated.deepcopy.go @@ -21,10 +21,138 @@ limitations under the License. package v1 import ( + corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" ) +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *CronJob) DeepCopyInto(out *CronJob) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CronJob. +func (in *CronJob) DeepCopy() *CronJob { + if in == nil { + return nil + } + out := new(CronJob) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *CronJob) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *CronJobList) DeepCopyInto(out *CronJobList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]CronJob, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CronJobList. +func (in *CronJobList) DeepCopy() *CronJobList { + if in == nil { + return nil + } + out := new(CronJobList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *CronJobList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *CronJobSpec) DeepCopyInto(out *CronJobSpec) { + *out = *in + if in.StartingDeadlineSeconds != nil { + in, out := &in.StartingDeadlineSeconds, &out.StartingDeadlineSeconds + *out = new(int64) + **out = **in + } + if in.Suspend != nil { + in, out := &in.Suspend, &out.Suspend + *out = new(bool) + **out = **in + } + in.JobTemplate.DeepCopyInto(&out.JobTemplate) + if in.SuccessfulJobsHistoryLimit != nil { + in, out := &in.SuccessfulJobsHistoryLimit, &out.SuccessfulJobsHistoryLimit + *out = new(int32) + **out = **in + } + if in.FailedJobsHistoryLimit != nil { + in, out := &in.FailedJobsHistoryLimit, &out.FailedJobsHistoryLimit + *out = new(int32) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CronJobSpec. +func (in *CronJobSpec) DeepCopy() *CronJobSpec { + if in == nil { + return nil + } + out := new(CronJobSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *CronJobStatus) DeepCopyInto(out *CronJobStatus) { + *out = *in + if in.Active != nil { + in, out := &in.Active, &out.Active + *out = make([]corev1.ObjectReference, len(*in)) + copy(*out, *in) + } + if in.LastScheduleTime != nil { + in, out := &in.LastScheduleTime, &out.LastScheduleTime + *out = (*in).DeepCopy() + } + if in.LastSuccessfulTime != nil { + in, out := &in.LastSuccessfulTime, &out.LastSuccessfulTime + *out = (*in).DeepCopy() + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CronJobStatus. +func (in *CronJobStatus) DeepCopy() *CronJobStatus { + if in == nil { + return nil + } + out := new(CronJobStatus) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Job) DeepCopyInto(out *Job) { *out = *in @@ -143,6 +271,16 @@ func (in *JobSpec) DeepCopyInto(out *JobSpec) { *out = new(int32) **out = **in } + if in.CompletionMode != nil { + in, out := &in.CompletionMode, &out.CompletionMode + *out = new(CompletionMode) + **out = **in + } + if in.Suspend != nil { + in, out := &in.Suspend, &out.Suspend + *out = new(bool) + **out = **in + } return } @@ -186,3 +324,21 @@ func (in *JobStatus) DeepCopy() *JobStatus { in.DeepCopyInto(out) return out } + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *JobTemplateSpec) DeepCopyInto(out *JobTemplateSpec) { + *out = *in + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new JobTemplateSpec. +func (in *JobTemplateSpec) DeepCopy() *JobTemplateSpec { + if in == nil { + return nil + } + out := new(JobTemplateSpec) + in.DeepCopyInto(out) + return out +} diff --git a/vendor/k8s.io/api/batch/v1beta1/BUILD b/vendor/k8s.io/api/batch/v1beta1/BUILD deleted file mode 100644 index 26b35da76b3b..000000000000 --- a/vendor/k8s.io/api/batch/v1beta1/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - "zz_generated.prerelease-lifecycle.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/api/batch/v1beta1", - importpath = "k8s.io/api/batch/v1beta1", - deps = [ - "//staging/src/k8s.io/api/batch/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/api/batch/v1beta1/generated.pb.go b/vendor/k8s.io/api/batch/v1beta1/generated.pb.go index 69c4054bfeb2..93794f0578eb 100644 --- a/vendor/k8s.io/api/batch/v1beta1/generated.pb.go +++ b/vendor/k8s.io/api/batch/v1beta1/generated.pb.go @@ -227,56 +227,57 @@ func init() { } var fileDescriptor_e57b277b05179ae7 = []byte{ - // 771 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x94, 0xcf, 0x6f, 0xe3, 0x44, - 0x14, 0xc7, 0xe3, 0x34, 0xbf, 0x76, 0xc2, 0x42, 0xd7, 0xa0, 0x5d, 0x2b, 0x20, 0x27, 0x64, 0xb5, - 0x22, 0x20, 0x76, 0x4c, 0x2b, 0x84, 0x38, 0x21, 0xad, 0x17, 0x2d, 0x50, 0x8a, 0x16, 0x39, 0x45, - 0x48, 0xa8, 0x42, 0x1d, 0x8f, 0x5f, 0x92, 0x69, 0x6c, 0x8f, 0xe5, 0x19, 0x47, 0xca, 0x8d, 0x0b, - 0x77, 0xfe, 0x11, 0x4e, 0xfc, 0x13, 0x11, 0xa7, 0x1e, 0x7b, 0x8a, 0xa8, 0xf9, 0x2f, 0x38, 0x21, - 0x4f, 0x9c, 0x1f, 0xcd, 0x8f, 0xb6, 0x7b, 0xe9, 0xcd, 0xf3, 0xe6, 0xfb, 0xfd, 0xcc, 0xf3, 0x7b, - 0x6f, 0x06, 0xbd, 0x18, 0x7e, 0x29, 0x30, 0xe3, 0xd6, 0x30, 0x71, 0x21, 0x0e, 0x41, 0x82, 0xb0, - 0x46, 0x10, 0x7a, 0x3c, 0xb6, 0xf2, 0x0d, 0x12, 0x31, 0xcb, 0x25, 0x92, 0x0e, 0xac, 0xd1, 0x81, - 0x0b, 0x92, 0x1c, 0x58, 0x7d, 0x08, 0x21, 0x26, 0x12, 0x3c, 0x1c, 0xc5, 0x5c, 0x72, 0xdd, 0x98, - 0x29, 0x31, 0x89, 0x18, 0x56, 0x4a, 0x9c, 0x2b, 0x1b, 0xcf, 0xfb, 0x4c, 0x0e, 0x12, 0x17, 0x53, - 0x1e, 0x58, 0x7d, 0xde, 0xe7, 0x96, 0x32, 0xb8, 0x49, 0x4f, 0xad, 0xd4, 0x42, 0x7d, 0xcd, 0x40, - 0x8d, 0xa7, 0x5b, 0x8e, 0x5c, 0x3f, 0xad, 0xd1, 0x5e, 0x11, 0x51, 0x1e, 0xc3, 0x36, 0xcd, 0xe7, - 0x4b, 0x4d, 0x40, 0xe8, 0x80, 0x85, 0x10, 0x8f, 0xad, 0x68, 0xd8, 0xcf, 0x02, 0xc2, 0x0a, 0x40, - 0x92, 0x6d, 0x2e, 0x6b, 0x97, 0x2b, 0x4e, 0x42, 0xc9, 0x02, 0xd8, 0x30, 0x7c, 0x71, 0x9b, 0x41, - 0xd0, 0x01, 0x04, 0x64, 0xdd, 0xd7, 0xfe, 0xbd, 0x88, 0xaa, 0x2f, 0x63, 0x1e, 0x1e, 0x71, 0x57, - 0x3f, 0x43, 0xb5, 0x2c, 0x1f, 0x8f, 0x48, 0x62, 0x68, 0x2d, 0xad, 0x53, 0x3f, 0xfc, 0x0c, 0x2f, - 0xeb, 0xb9, 0xc0, 0xe2, 0x68, 0xd8, 0xcf, 0x02, 0x02, 0x67, 0x6a, 0x3c, 0x3a, 0xc0, 0xaf, 0xdd, - 0x73, 0xa0, 0xf2, 0x07, 0x90, 0xc4, 0xd6, 0x27, 0xd3, 0x66, 0x21, 0x9d, 0x36, 0xd1, 0x32, 0xe6, - 0x2c, 0xa8, 0xfa, 0x37, 0xa8, 0x24, 0x22, 0xa0, 0x46, 0x51, 0xd1, 0x9f, 0xe1, 0x5d, 0xdd, 0xc2, - 0x79, 0x4a, 0xdd, 0x08, 0xa8, 0xfd, 0x56, 0x8e, 0x2c, 0x65, 0x2b, 0x47, 0x01, 0xf4, 0xd7, 0xa8, - 0x22, 0x24, 0x91, 0x89, 0x30, 0xf6, 0x14, 0xea, 0xa3, 0xdb, 0x51, 0x4a, 0x6e, 0xbf, 0x9d, 0xc3, - 0x2a, 0xb3, 0xb5, 0x93, 0x63, 0xda, 0x7f, 0x69, 0xa8, 0x9e, 0x2b, 0x8f, 0x99, 0x90, 0xfa, 0xe9, - 0x46, 0x2d, 0xf0, 0xdd, 0x6a, 0x91, 0xb9, 0x55, 0x25, 0xf6, 0xf3, 0x93, 0x6a, 0xf3, 0xc8, 0x4a, - 0x1d, 0x5e, 0xa1, 0x32, 0x93, 0x10, 0x08, 0xa3, 0xd8, 0xda, 0xeb, 0xd4, 0x0f, 0x3f, 0xbc, 0x35, - 0x7b, 0xfb, 0x61, 0x4e, 0x2b, 0x7f, 0x97, 0xf9, 0x9c, 0x99, 0xbd, 0xfd, 0x67, 0x69, 0x91, 0x75, - 0x56, 0x1c, 0xfd, 0x53, 0x54, 0xcb, 0xfa, 0xec, 0x25, 0x3e, 0xa8, 0xac, 0x1f, 0x2c, 0xb3, 0xe8, - 0xe6, 0x71, 0x67, 0xa1, 0xd0, 0x7f, 0x42, 0x4f, 0x84, 0x24, 0xb1, 0x64, 0x61, 0xff, 0x6b, 0x20, - 0x9e, 0xcf, 0x42, 0xe8, 0x02, 0xe5, 0xa1, 0x27, 0x54, 0x83, 0xf6, 0xec, 0xf7, 0xd3, 0x69, 0xf3, - 0x49, 0x77, 0xbb, 0xc4, 0xd9, 0xe5, 0xd5, 0x4f, 0xd1, 0x23, 0xca, 0x43, 0x9a, 0xc4, 0x31, 0x84, - 0x74, 0xfc, 0x23, 0xf7, 0x19, 0x1d, 0xab, 0x36, 0x3d, 0xb0, 0x71, 0x9e, 0xcd, 0xa3, 0x97, 0xeb, - 0x82, 0xff, 0xb6, 0x05, 0x9d, 0x4d, 0x90, 0xfe, 0x0c, 0x55, 0x45, 0x22, 0x22, 0x08, 0x3d, 0xa3, - 0xd4, 0xd2, 0x3a, 0x35, 0xbb, 0x9e, 0x4e, 0x9b, 0xd5, 0xee, 0x2c, 0xe4, 0xcc, 0xf7, 0xf4, 0x33, - 0x54, 0x3f, 0xe7, 0xee, 0x09, 0x04, 0x91, 0x4f, 0x24, 0x18, 0x65, 0xd5, 0xc2, 0x8f, 0x77, 0xd7, - 0xf9, 0x68, 0x29, 0x56, 0x43, 0xf7, 0x6e, 0x9e, 0x69, 0x7d, 0x65, 0xc3, 0x59, 0x45, 0xea, 0xbf, - 0xa2, 0x86, 0x48, 0x28, 0x05, 0x21, 0x7a, 0x89, 0x7f, 0xc4, 0x5d, 0xf1, 0x2d, 0x13, 0x92, 0xc7, - 0xe3, 0x63, 0x16, 0x30, 0x69, 0x54, 0x5a, 0x5a, 0xa7, 0x6c, 0x9b, 0xe9, 0xb4, 0xd9, 0xe8, 0xee, - 0x54, 0x39, 0x37, 0x10, 0x74, 0x07, 0x3d, 0xee, 0x11, 0xe6, 0x83, 0xb7, 0xc1, 0xae, 0x2a, 0x76, - 0x23, 0x9d, 0x36, 0x1f, 0xbf, 0xda, 0xaa, 0x70, 0x76, 0x38, 0xdb, 0x7f, 0x6b, 0xe8, 0xe1, 0xb5, - 0xfb, 0xa0, 0x7f, 0x8f, 0x2a, 0x84, 0x4a, 0x36, 0xca, 0xe6, 0x25, 0x1b, 0xc5, 0xa7, 0xab, 0x25, - 0xca, 0xde, 0xb4, 0xe5, 0xfd, 0x76, 0xa0, 0x07, 0x59, 0x27, 0x60, 0x79, 0x89, 0x5e, 0x28, 0xab, - 0x93, 0x23, 0x74, 0x1f, 0xed, 0xfb, 0x44, 0xc8, 0xf9, 0xa8, 0x9d, 0xb0, 0x00, 0x54, 0x93, 0xea, - 0x87, 0x9f, 0xdc, 0xed, 0xf2, 0x64, 0x0e, 0xfb, 0xbd, 0x74, 0xda, 0xdc, 0x3f, 0x5e, 0xe3, 0x38, - 0x1b, 0xe4, 0xf6, 0x44, 0x43, 0xab, 0xdd, 0xb9, 0x87, 0xe7, 0xeb, 0x67, 0x54, 0x93, 0xf3, 0x89, - 0x2a, 0xbe, 0xe9, 0x44, 0x2d, 0x6e, 0xe2, 0x62, 0x9c, 0x16, 0xb0, 0xec, 0xf5, 0x79, 0x67, 0x4d, - 0x7f, 0x0f, 0xbf, 0xf3, 0xd5, 0xb5, 0xd7, 0xf8, 0x83, 0x6d, 0xbf, 0x82, 0x6f, 0x78, 0x84, 0xed, - 0xe7, 0x93, 0x2b, 0xb3, 0x70, 0x71, 0x65, 0x16, 0x2e, 0xaf, 0xcc, 0xc2, 0x6f, 0xa9, 0xa9, 0x4d, - 0x52, 0x53, 0xbb, 0x48, 0x4d, 0xed, 0x32, 0x35, 0xb5, 0x7f, 0x52, 0x53, 0xfb, 0xe3, 0x5f, 0xb3, - 0xf0, 0x4b, 0x35, 0x2f, 0xc8, 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0xf6, 0x9f, 0xb3, 0xdd, 0xdf, - 0x07, 0x00, 0x00, + // 794 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x95, 0x41, 0x6f, 0x1b, 0x45, + 0x14, 0xc7, 0xbd, 0x4e, 0x1c, 0xbb, 0x63, 0x0a, 0xe9, 0x80, 0x52, 0xcb, 0xa0, 0xdd, 0xe0, 0xaa, + 0x22, 0x20, 0x3a, 0x4b, 0x22, 0x84, 0x38, 0x21, 0x75, 0x8b, 0x0a, 0x84, 0xa0, 0xa2, 0x71, 0x11, + 0x12, 0xaa, 0x50, 0x67, 0x67, 0x5f, 0x9c, 0x69, 0x76, 0x77, 0x56, 0x3b, 0xb3, 0x91, 0x72, 0xe3, + 0xc2, 0x9d, 0x2f, 0xc2, 0x89, 0x3b, 0xe7, 0x1c, 0x7b, 0xec, 0x69, 0x45, 0x96, 0x6f, 0xc1, 0x09, + 0xed, 0x78, 0xbd, 0x76, 0xed, 0x75, 0xd3, 0x5e, 0x72, 0xf3, 0xbc, 0xf9, 0xff, 0x7f, 0xf3, 0xf6, + 0xbd, 0x37, 0x63, 0x74, 0xff, 0xf4, 0x4b, 0x45, 0x84, 0x74, 0x4f, 0x33, 0x1f, 0xd2, 0x18, 0x34, + 0x28, 0xf7, 0x0c, 0xe2, 0x40, 0xa6, 0x6e, 0xb5, 0xc1, 0x12, 0xe1, 0xfa, 0x4c, 0xf3, 0x13, 0xf7, + 0x6c, 0xdf, 0x07, 0xcd, 0xf6, 0xdd, 0x09, 0xc4, 0x90, 0x32, 0x0d, 0x01, 0x49, 0x52, 0xa9, 0x25, + 0x1e, 0x4c, 0x95, 0x84, 0x25, 0x82, 0x18, 0x25, 0xa9, 0x94, 0xc3, 0x7b, 0x13, 0xa1, 0x4f, 0x32, + 0x9f, 0x70, 0x19, 0xb9, 0x13, 0x39, 0x91, 0xae, 0x31, 0xf8, 0xd9, 0xb1, 0x59, 0x99, 0x85, 0xf9, + 0x35, 0x05, 0x0d, 0xef, 0x34, 0x1c, 0xb9, 0x7c, 0xda, 0x70, 0xb4, 0x20, 0xe2, 0x32, 0x85, 0x26, + 0xcd, 0xe7, 0x73, 0x4d, 0xc4, 0xf8, 0x89, 0x88, 0x21, 0x3d, 0x77, 0x93, 0xd3, 0x49, 0x19, 0x50, + 0x6e, 0x04, 0x9a, 0x35, 0xb9, 0xdc, 0x75, 0xae, 0x34, 0x8b, 0xb5, 0x88, 0x60, 0xc5, 0xf0, 0xc5, + 0x55, 0x06, 0xc5, 0x4f, 0x20, 0x62, 0xcb, 0xbe, 0xd1, 0xef, 0x6d, 0xd4, 0x7d, 0x90, 0xca, 0xf8, + 0x50, 0xfa, 0xf8, 0x29, 0xea, 0x95, 0xf9, 0x04, 0x4c, 0xb3, 0x81, 0xb5, 0x6b, 0xed, 0xf5, 0x0f, + 0x3e, 0x23, 0xf3, 0x7a, 0xd6, 0x58, 0x92, 0x9c, 0x4e, 0xca, 0x80, 0x22, 0xa5, 0x9a, 0x9c, 0xed, + 0x93, 0x47, 0xfe, 0x33, 0xe0, 0xfa, 0x07, 0xd0, 0xcc, 0xc3, 0x17, 0xb9, 0xd3, 0x2a, 0x72, 0x07, + 0xcd, 0x63, 0xb4, 0xa6, 0xe2, 0x6f, 0xd0, 0xa6, 0x4a, 0x80, 0x0f, 0xda, 0x86, 0x7e, 0x97, 0xac, + 0xeb, 0x16, 0xa9, 0x52, 0x1a, 0x27, 0xc0, 0xbd, 0xb7, 0x2a, 0xe4, 0x66, 0xb9, 0xa2, 0x06, 0x80, + 0x1f, 0xa1, 0x2d, 0xa5, 0x99, 0xce, 0xd4, 0x60, 0xc3, 0xa0, 0x3e, 0xba, 0x1a, 0x65, 0xe4, 0xde, + 0xdb, 0x15, 0x6c, 0x6b, 0xba, 0xa6, 0x15, 0x66, 0xf4, 0x97, 0x85, 0xfa, 0x95, 0xf2, 0x48, 0x28, + 0x8d, 0x9f, 0xac, 0xd4, 0x82, 0xbc, 0x5e, 0x2d, 0x4a, 0xb7, 0xa9, 0xc4, 0x76, 0x75, 0x52, 0x6f, + 0x16, 0x59, 0xa8, 0xc3, 0x43, 0xd4, 0x11, 0x1a, 0x22, 0x35, 0x68, 0xef, 0x6e, 0xec, 0xf5, 0x0f, + 0x3e, 0xbc, 0x32, 0x7b, 0xef, 0x66, 0x45, 0xeb, 0x7c, 0x57, 0xfa, 0xe8, 0xd4, 0x3e, 0xfa, 0x73, + 0xb3, 0xce, 0xba, 0x2c, 0x0e, 0xfe, 0x14, 0xf5, 0xca, 0x3e, 0x07, 0x59, 0x08, 0x26, 0xeb, 0x1b, + 0xf3, 0x2c, 0xc6, 0x55, 0x9c, 0xd6, 0x0a, 0xfc, 0x13, 0xba, 0xad, 0x34, 0x4b, 0xb5, 0x88, 0x27, + 0x5f, 0x03, 0x0b, 0x42, 0x11, 0xc3, 0x18, 0xb8, 0x8c, 0x03, 0x65, 0x1a, 0xb4, 0xe1, 0xbd, 0x5f, + 0xe4, 0xce, 0xed, 0x71, 0xb3, 0x84, 0xae, 0xf3, 0xe2, 0x27, 0xe8, 0x16, 0x97, 0x31, 0xcf, 0xd2, + 0x14, 0x62, 0x7e, 0xfe, 0xa3, 0x0c, 0x05, 0x3f, 0x37, 0x6d, 0xba, 0xe1, 0x91, 0x2a, 0x9b, 0x5b, + 0x0f, 0x96, 0x05, 0xff, 0x35, 0x05, 0xe9, 0x2a, 0x08, 0xdf, 0x45, 0x5d, 0x95, 0xa9, 0x04, 0xe2, + 0x60, 0xb0, 0xb9, 0x6b, 0xed, 0xf5, 0xbc, 0x7e, 0x91, 0x3b, 0xdd, 0xf1, 0x34, 0x44, 0x67, 0x7b, + 0xf8, 0x29, 0xea, 0x3f, 0x93, 0xfe, 0x63, 0x88, 0x92, 0x90, 0x69, 0x18, 0x74, 0x4c, 0x0b, 0x3f, + 0x5e, 0x5f, 0xe7, 0xc3, 0xb9, 0xd8, 0x0c, 0xdd, 0xbb, 0x55, 0xa6, 0xfd, 0x85, 0x0d, 0xba, 0x88, + 0xc4, 0xbf, 0xa2, 0xa1, 0xca, 0x38, 0x07, 0xa5, 0x8e, 0xb3, 0xf0, 0x50, 0xfa, 0xea, 0x5b, 0xa1, + 0xb4, 0x4c, 0xcf, 0x8f, 0x44, 0x24, 0xf4, 0x60, 0x6b, 0xd7, 0xda, 0xeb, 0x78, 0x76, 0x91, 0x3b, + 0xc3, 0xf1, 0x5a, 0x15, 0x7d, 0x05, 0x01, 0x53, 0xb4, 0x73, 0xcc, 0x44, 0x08, 0xc1, 0x0a, 0xbb, + 0x6b, 0xd8, 0xc3, 0x22, 0x77, 0x76, 0x1e, 0x36, 0x2a, 0xe8, 0x1a, 0xe7, 0xe8, 0xef, 0x36, 0xba, + 0xf9, 0xd2, 0x7d, 0xc0, 0xdf, 0xa3, 0x2d, 0xc6, 0xb5, 0x38, 0x2b, 0xe7, 0xa5, 0x1c, 0xc5, 0x3b, + 0x8b, 0x25, 0x2a, 0xdf, 0xb4, 0xf9, 0xfd, 0xa6, 0x70, 0x0c, 0x65, 0x27, 0x60, 0x7e, 0x89, 0xee, + 0x1b, 0x2b, 0xad, 0x10, 0x38, 0x44, 0xdb, 0x21, 0x53, 0x7a, 0x36, 0x6a, 0x8f, 0x45, 0x04, 0xa6, + 0x49, 0xfd, 0x83, 0x4f, 0x5e, 0xef, 0xf2, 0x94, 0x0e, 0xef, 0xbd, 0x22, 0x77, 0xb6, 0x8f, 0x96, + 0x38, 0x74, 0x85, 0x8c, 0x53, 0x84, 0x4d, 0xac, 0x2e, 0xa1, 0x39, 0xaf, 0xf3, 0xc6, 0xe7, 0xed, + 0x14, 0xb9, 0x83, 0x8f, 0x56, 0x48, 0xb4, 0x81, 0x3e, 0xba, 0xb0, 0xd0, 0xe2, 0x44, 0x5c, 0xc3, + 0x93, 0xf9, 0x33, 0xea, 0xe9, 0xd9, 0x14, 0xb7, 0xdf, 0x74, 0x8a, 0xeb, 0xdb, 0x5f, 0x8f, 0x70, + 0x0d, 0x2b, 0x5f, 0xbc, 0x77, 0x96, 0xf4, 0xd7, 0xf0, 0x39, 0x5f, 0xbd, 0xf4, 0x0f, 0xf0, 0x41, + 0xd3, 0xa7, 0x90, 0x57, 0x3c, 0xfc, 0xde, 0xbd, 0x8b, 0x4b, 0xbb, 0xf5, 0xfc, 0xd2, 0x6e, 0xbd, + 0xb8, 0xb4, 0x5b, 0xbf, 0x15, 0xb6, 0x75, 0x51, 0xd8, 0xd6, 0xf3, 0xc2, 0xb6, 0x5e, 0x14, 0xb6, + 0xf5, 0x4f, 0x61, 0x5b, 0x7f, 0xfc, 0x6b, 0xb7, 0x7e, 0xe9, 0x56, 0x05, 0xf9, 0x3f, 0x00, 0x00, + 0xff, 0xff, 0xe9, 0xe0, 0x40, 0x92, 0x53, 0x08, 0x00, 0x00, } func (m *CronJob) Marshal() (dAtA []byte, err error) { @@ -467,6 +468,18 @@ func (m *CronJobStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.LastSuccessfulTime != nil { + { + size, err := m.LastSuccessfulTime.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + } if m.LastScheduleTime != nil { { size, err := m.LastScheduleTime.MarshalToSizedBuffer(dAtA[:i]) @@ -668,6 +681,10 @@ func (m *CronJobStatus) Size() (n int) { l = m.LastScheduleTime.Size() n += 1 + l + sovGenerated(uint64(l)) } + if m.LastSuccessfulTime != nil { + l = m.LastSuccessfulTime.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -759,6 +776,7 @@ func (this *CronJobStatus) String() string { s := strings.Join([]string{`&CronJobStatus{`, `Active:` + repeatedStringForActive + `,`, `LastScheduleTime:` + strings.Replace(fmt.Sprintf("%v", this.LastScheduleTime), "Time", "v1.Time", 1) + `,`, + `LastSuccessfulTime:` + strings.Replace(fmt.Sprintf("%v", this.LastSuccessfulTime), "Time", "v1.Time", 1) + `,`, `}`, }, "") return s @@ -927,10 +945,7 @@ func (m *CronJob) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1047,10 +1062,7 @@ func (m *CronJobList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1278,10 +1290,7 @@ func (m *CronJobSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1395,16 +1404,49 @@ func (m *CronJobStatus) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LastSuccessfulTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.LastSuccessfulTime == nil { + m.LastSuccessfulTime = &v1.Time{} + } + if err := m.LastSuccessfulTime.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1520,10 +1562,7 @@ func (m *JobTemplate) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1639,10 +1678,7 @@ func (m *JobTemplateSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/api/batch/v1beta1/generated.proto b/vendor/k8s.io/api/batch/v1beta1/generated.proto index 4dab09a52cfb..b4f998c1a4fa 100644 --- a/vendor/k8s.io/api/batch/v1beta1/generated.proto +++ b/vendor/k8s.io/api/batch/v1beta1/generated.proto @@ -102,11 +102,16 @@ message CronJobSpec { message CronJobStatus { // A list of pointers to currently running jobs. // +optional + // +listType=atomic repeated k8s.io.api.core.v1.ObjectReference active = 1; // Information when was the last time the job was successfully scheduled. // +optional optional k8s.io.apimachinery.pkg.apis.meta.v1.Time lastScheduleTime = 4; + + // Information when was the last time the job successfully completed. + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.Time lastSuccessfulTime = 5; } // JobTemplate describes a template for creating copies of a predefined pod. diff --git a/vendor/k8s.io/api/batch/v1beta1/types.go b/vendor/k8s.io/api/batch/v1beta1/types.go index 6f49cc2a3f59..cd9af7a9e7c1 100644 --- a/vendor/k8s.io/api/batch/v1beta1/types.go +++ b/vendor/k8s.io/api/batch/v1beta1/types.go @@ -56,7 +56,9 @@ type JobTemplateSpec struct { // +genclient // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // +k8s:prerelease-lifecycle-gen:introduced=1.8 -// +k8s:prerelease-lifecycle-gen:deprecated=1.22 +// +k8s:prerelease-lifecycle-gen:deprecated=1.21 +// +k8s:prerelease-lifecycle-gen:removed=1.25 +// +k8s:prerelease-lifecycle-gen:replacement=batch,v1,CronJob // CronJob represents the configuration of a single cron job. type CronJob struct { @@ -79,7 +81,9 @@ type CronJob struct { // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // +k8s:prerelease-lifecycle-gen:introduced=1.8 -// +k8s:prerelease-lifecycle-gen:deprecated=1.22 +// +k8s:prerelease-lifecycle-gen:deprecated=1.21 +// +k8s:prerelease-lifecycle-gen:removed=1.25 +// +k8s:prerelease-lifecycle-gen:replacement=batch,v1,CronJobList // CronJobList is a collection of cron jobs. type CronJobList struct { @@ -156,9 +160,14 @@ const ( type CronJobStatus struct { // A list of pointers to currently running jobs. // +optional + // +listType=atomic Active []v1.ObjectReference `json:"active,omitempty" protobuf:"bytes,1,rep,name=active"` // Information when was the last time the job was successfully scheduled. // +optional LastScheduleTime *metav1.Time `json:"lastScheduleTime,omitempty" protobuf:"bytes,4,opt,name=lastScheduleTime"` + + // Information when was the last time the job successfully completed. + // +optional + LastSuccessfulTime *metav1.Time `json:"lastSuccessfulTime,omitempty" protobuf:"bytes,5,opt,name=lastSuccessfulTime"` } diff --git a/vendor/k8s.io/api/batch/v1beta1/types_swagger_doc_generated.go b/vendor/k8s.io/api/batch/v1beta1/types_swagger_doc_generated.go index ecc914446067..9973898122ad 100644 --- a/vendor/k8s.io/api/batch/v1beta1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/batch/v1beta1/types_swagger_doc_generated.go @@ -64,9 +64,10 @@ func (CronJobSpec) SwaggerDoc() map[string]string { } var map_CronJobStatus = map[string]string{ - "": "CronJobStatus represents the current state of a cron job.", - "active": "A list of pointers to currently running jobs.", - "lastScheduleTime": "Information when was the last time the job was successfully scheduled.", + "": "CronJobStatus represents the current state of a cron job.", + "active": "A list of pointers to currently running jobs.", + "lastScheduleTime": "Information when was the last time the job was successfully scheduled.", + "lastSuccessfulTime": "Information when was the last time the job successfully completed.", } func (CronJobStatus) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/api/batch/v1beta1/zz_generated.deepcopy.go b/vendor/k8s.io/api/batch/v1beta1/zz_generated.deepcopy.go index 7c9dcb742740..77244485ba64 100644 --- a/vendor/k8s.io/api/batch/v1beta1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/batch/v1beta1/zz_generated.deepcopy.go @@ -135,6 +135,10 @@ func (in *CronJobStatus) DeepCopyInto(out *CronJobStatus) { in, out := &in.LastScheduleTime, &out.LastScheduleTime *out = (*in).DeepCopy() } + if in.LastSuccessfulTime != nil { + in, out := &in.LastSuccessfulTime, &out.LastSuccessfulTime + *out = (*in).DeepCopy() + } return } diff --git a/vendor/k8s.io/api/batch/v1beta1/zz_generated.prerelease-lifecycle.go b/vendor/k8s.io/api/batch/v1beta1/zz_generated.prerelease-lifecycle.go index 63bae5f1eaf4..5379f896c19d 100644 --- a/vendor/k8s.io/api/batch/v1beta1/zz_generated.prerelease-lifecycle.go +++ b/vendor/k8s.io/api/batch/v1beta1/zz_generated.prerelease-lifecycle.go @@ -20,6 +20,10 @@ limitations under the License. package v1beta1 +import ( + schema "k8s.io/apimachinery/pkg/runtime/schema" +) + // APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. // It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. func (in *CronJob) APILifecycleIntroduced() (major, minor int) { @@ -29,7 +33,13 @@ func (in *CronJob) APILifecycleIntroduced() (major, minor int) { // APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. // It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. func (in *CronJob) APILifecycleDeprecated() (major, minor int) { - return 1, 22 + return 1, 21 +} + +// APILifecycleReplacement is an autogenerated function, returning the group, version, and kind that should be used instead of this deprecated type. +// It is controlled by "k8s:prerelease-lifecycle-gen:replacement=,," tags in types.go. +func (in *CronJob) APILifecycleReplacement() schema.GroupVersionKind { + return schema.GroupVersionKind{Group: "batch", Version: "v1", Kind: "CronJob"} } // APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. @@ -47,7 +57,13 @@ func (in *CronJobList) APILifecycleIntroduced() (major, minor int) { // APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. // It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. func (in *CronJobList) APILifecycleDeprecated() (major, minor int) { - return 1, 22 + return 1, 21 +} + +// APILifecycleReplacement is an autogenerated function, returning the group, version, and kind that should be used instead of this deprecated type. +// It is controlled by "k8s:prerelease-lifecycle-gen:replacement=,," tags in types.go. +func (in *CronJobList) APILifecycleReplacement() schema.GroupVersionKind { + return schema.GroupVersionKind{Group: "batch", Version: "v1", Kind: "CronJobList"} } // APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. diff --git a/vendor/k8s.io/api/batch/v2alpha1/BUILD b/vendor/k8s.io/api/batch/v2alpha1/BUILD deleted file mode 100644 index 6c70e67d0865..000000000000 --- a/vendor/k8s.io/api/batch/v2alpha1/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/api/batch/v2alpha1", - importpath = "k8s.io/api/batch/v2alpha1", - deps = [ - "//staging/src/k8s.io/api/batch/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/api/batch/v2alpha1/doc.go b/vendor/k8s.io/api/batch/v2alpha1/doc.go deleted file mode 100644 index 3044b0c62960..000000000000 --- a/vendor/k8s.io/api/batch/v2alpha1/doc.go +++ /dev/null @@ -1,21 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// +k8s:deepcopy-gen=package -// +k8s:protobuf-gen=package -// +k8s:openapi-gen=true - -package v2alpha1 // import "k8s.io/api/batch/v2alpha1" diff --git a/vendor/k8s.io/api/batch/v2alpha1/generated.pb.go b/vendor/k8s.io/api/batch/v2alpha1/generated.pb.go deleted file mode 100644 index 3e58dbb92a9b..000000000000 --- a/vendor/k8s.io/api/batch/v2alpha1/generated.pb.go +++ /dev/null @@ -1,1743 +0,0 @@ -/* -Copyright The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: k8s.io/kubernetes/vendor/k8s.io/api/batch/v2alpha1/generated.proto - -package v2alpha1 - -import ( - fmt "fmt" - - io "io" - - proto "github.com/gogo/protobuf/proto" - v11 "k8s.io/api/core/v1" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - math "math" - math_bits "math/bits" - reflect "reflect" - strings "strings" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -func (m *CronJob) Reset() { *m = CronJob{} } -func (*CronJob) ProtoMessage() {} -func (*CronJob) Descriptor() ([]byte, []int) { - return fileDescriptor_5495a0550fe29c46, []int{0} -} -func (m *CronJob) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *CronJob) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (m *CronJob) XXX_Merge(src proto.Message) { - xxx_messageInfo_CronJob.Merge(m, src) -} -func (m *CronJob) XXX_Size() int { - return m.Size() -} -func (m *CronJob) XXX_DiscardUnknown() { - xxx_messageInfo_CronJob.DiscardUnknown(m) -} - -var xxx_messageInfo_CronJob proto.InternalMessageInfo - -func (m *CronJobList) Reset() { *m = CronJobList{} } -func (*CronJobList) ProtoMessage() {} -func (*CronJobList) Descriptor() ([]byte, []int) { - return fileDescriptor_5495a0550fe29c46, []int{1} -} -func (m *CronJobList) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *CronJobList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (m *CronJobList) XXX_Merge(src proto.Message) { - xxx_messageInfo_CronJobList.Merge(m, src) -} -func (m *CronJobList) XXX_Size() int { - return m.Size() -} -func (m *CronJobList) XXX_DiscardUnknown() { - xxx_messageInfo_CronJobList.DiscardUnknown(m) -} - -var xxx_messageInfo_CronJobList proto.InternalMessageInfo - -func (m *CronJobSpec) Reset() { *m = CronJobSpec{} } -func (*CronJobSpec) ProtoMessage() {} -func (*CronJobSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_5495a0550fe29c46, []int{2} -} -func (m *CronJobSpec) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *CronJobSpec) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (m *CronJobSpec) XXX_Merge(src proto.Message) { - xxx_messageInfo_CronJobSpec.Merge(m, src) -} -func (m *CronJobSpec) XXX_Size() int { - return m.Size() -} -func (m *CronJobSpec) XXX_DiscardUnknown() { - xxx_messageInfo_CronJobSpec.DiscardUnknown(m) -} - -var xxx_messageInfo_CronJobSpec proto.InternalMessageInfo - -func (m *CronJobStatus) Reset() { *m = CronJobStatus{} } -func (*CronJobStatus) ProtoMessage() {} -func (*CronJobStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_5495a0550fe29c46, []int{3} -} -func (m *CronJobStatus) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *CronJobStatus) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (m *CronJobStatus) XXX_Merge(src proto.Message) { - xxx_messageInfo_CronJobStatus.Merge(m, src) -} -func (m *CronJobStatus) XXX_Size() int { - return m.Size() -} -func (m *CronJobStatus) XXX_DiscardUnknown() { - xxx_messageInfo_CronJobStatus.DiscardUnknown(m) -} - -var xxx_messageInfo_CronJobStatus proto.InternalMessageInfo - -func (m *JobTemplate) Reset() { *m = JobTemplate{} } -func (*JobTemplate) ProtoMessage() {} -func (*JobTemplate) Descriptor() ([]byte, []int) { - return fileDescriptor_5495a0550fe29c46, []int{4} -} -func (m *JobTemplate) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *JobTemplate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (m *JobTemplate) XXX_Merge(src proto.Message) { - xxx_messageInfo_JobTemplate.Merge(m, src) -} -func (m *JobTemplate) XXX_Size() int { - return m.Size() -} -func (m *JobTemplate) XXX_DiscardUnknown() { - xxx_messageInfo_JobTemplate.DiscardUnknown(m) -} - -var xxx_messageInfo_JobTemplate proto.InternalMessageInfo - -func (m *JobTemplateSpec) Reset() { *m = JobTemplateSpec{} } -func (*JobTemplateSpec) ProtoMessage() {} -func (*JobTemplateSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_5495a0550fe29c46, []int{5} -} -func (m *JobTemplateSpec) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *JobTemplateSpec) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (m *JobTemplateSpec) XXX_Merge(src proto.Message) { - xxx_messageInfo_JobTemplateSpec.Merge(m, src) -} -func (m *JobTemplateSpec) XXX_Size() int { - return m.Size() -} -func (m *JobTemplateSpec) XXX_DiscardUnknown() { - xxx_messageInfo_JobTemplateSpec.DiscardUnknown(m) -} - -var xxx_messageInfo_JobTemplateSpec proto.InternalMessageInfo - -func init() { - proto.RegisterType((*CronJob)(nil), "k8s.io.api.batch.v2alpha1.CronJob") - proto.RegisterType((*CronJobList)(nil), "k8s.io.api.batch.v2alpha1.CronJobList") - proto.RegisterType((*CronJobSpec)(nil), "k8s.io.api.batch.v2alpha1.CronJobSpec") - proto.RegisterType((*CronJobStatus)(nil), "k8s.io.api.batch.v2alpha1.CronJobStatus") - proto.RegisterType((*JobTemplate)(nil), "k8s.io.api.batch.v2alpha1.JobTemplate") - proto.RegisterType((*JobTemplateSpec)(nil), "k8s.io.api.batch.v2alpha1.JobTemplateSpec") -} - -func init() { - proto.RegisterFile("k8s.io/kubernetes/vendor/k8s.io/api/batch/v2alpha1/generated.proto", fileDescriptor_5495a0550fe29c46) -} - -var fileDescriptor_5495a0550fe29c46 = []byte{ - // 774 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x94, 0x4d, 0x6f, 0xdb, 0x36, - 0x18, 0xc7, 0x2d, 0xc7, 0x6f, 0xa1, 0x97, 0x2d, 0xd1, 0x86, 0xc4, 0xf3, 0x06, 0xd9, 0x50, 0xb0, - 0xc1, 0x18, 0x36, 0x6a, 0x09, 0x86, 0x61, 0xa7, 0x01, 0x53, 0x86, 0x36, 0x4d, 0x53, 0x34, 0x90, - 0x53, 0xa0, 0x28, 0x82, 0xa2, 0x14, 0x45, 0xdb, 0x8c, 0x25, 0x51, 0x10, 0x29, 0x03, 0xbe, 0xf5, - 0xd6, 0x6b, 0x3f, 0x49, 0x2f, 0xed, 0x87, 0x48, 0x7b, 0xca, 0x31, 0x27, 0xa3, 0x51, 0xbf, 0x45, - 0x4f, 0x85, 0x68, 0xf9, 0x25, 0x7e, 0x49, 0xd2, 0x4b, 0x6e, 0xe2, 0xa3, 0xff, 0xff, 0xc7, 0x87, - 0xcf, 0xf3, 0x90, 0xc0, 0xec, 0xfe, 0xc3, 0x21, 0x65, 0x46, 0x37, 0xb2, 0x49, 0xe8, 0x13, 0x41, - 0xb8, 0xd1, 0x23, 0xbe, 0xc3, 0x42, 0x23, 0xfd, 0x81, 0x02, 0x6a, 0xd8, 0x48, 0xe0, 0x8e, 0xd1, - 0xdb, 0x45, 0x6e, 0xd0, 0x41, 0x3b, 0x46, 0x9b, 0xf8, 0x24, 0x44, 0x82, 0x38, 0x30, 0x08, 0x99, - 0x60, 0xea, 0x8f, 0x43, 0x29, 0x44, 0x01, 0x85, 0x52, 0x0a, 0x47, 0xd2, 0xea, 0x1f, 0x6d, 0x2a, - 0x3a, 0x91, 0x0d, 0x31, 0xf3, 0x8c, 0x36, 0x6b, 0x33, 0x43, 0x3a, 0xec, 0xa8, 0x25, 0x57, 0x72, - 0x21, 0xbf, 0x86, 0xa4, 0xea, 0xf6, 0xfc, 0xa6, 0x73, 0xdb, 0x55, 0xf5, 0x29, 0x11, 0x66, 0x21, - 0x59, 0xa4, 0xf9, 0x6b, 0xa2, 0xf1, 0x10, 0xee, 0x50, 0x9f, 0x84, 0x7d, 0x23, 0xe8, 0xb6, 0x93, - 0x00, 0x37, 0x3c, 0x22, 0xd0, 0x22, 0x97, 0xb1, 0xcc, 0x15, 0x46, 0xbe, 0xa0, 0x1e, 0x99, 0x33, - 0xfc, 0x7d, 0x93, 0x81, 0xe3, 0x0e, 0xf1, 0xd0, 0xac, 0x4f, 0x7f, 0x95, 0x05, 0xc5, 0xbd, 0x90, - 0xf9, 0x07, 0xcc, 0x56, 0x5f, 0x80, 0x52, 0x92, 0x8f, 0x83, 0x04, 0xaa, 0x28, 0x75, 0xa5, 0x51, - 0xde, 0xfd, 0x13, 0x4e, 0x0a, 0x3a, 0xc6, 0xc2, 0xa0, 0xdb, 0x4e, 0x02, 0x1c, 0x26, 0x6a, 0xd8, - 0xdb, 0x81, 0x8f, 0xed, 0x53, 0x82, 0xc5, 0x23, 0x22, 0x90, 0xa9, 0x9e, 0x0d, 0x6a, 0x99, 0x78, - 0x50, 0x03, 0x93, 0x98, 0x35, 0xa6, 0xaa, 0xfb, 0x20, 0xc7, 0x03, 0x82, 0x2b, 0x59, 0x49, 0xff, - 0x15, 0x2e, 0x6d, 0x17, 0x4c, 0x73, 0x6a, 0x06, 0x04, 0x9b, 0xdf, 0xa4, 0xcc, 0x5c, 0xb2, 0xb2, - 0x24, 0x41, 0x3d, 0x02, 0x05, 0x2e, 0x90, 0x88, 0x78, 0x65, 0x45, 0xb2, 0x1a, 0xb7, 0x60, 0x49, - 0xbd, 0xf9, 0x6d, 0x4a, 0x2b, 0x0c, 0xd7, 0x56, 0xca, 0xd1, 0xdf, 0x29, 0xa0, 0x9c, 0x2a, 0x0f, - 0x29, 0x17, 0xea, 0xc9, 0x5c, 0x35, 0xe0, 0xed, 0xaa, 0x91, 0xb8, 0x65, 0x2d, 0xd6, 0xd3, 0x9d, - 0x4a, 0xa3, 0xc8, 0x54, 0x25, 0xee, 0x83, 0x3c, 0x15, 0xc4, 0xe3, 0x95, 0x6c, 0x7d, 0xa5, 0x51, - 0xde, 0xd5, 0x6f, 0x4e, 0xdf, 0x5c, 0x4b, 0x71, 0xf9, 0x07, 0x89, 0xd1, 0x1a, 0xfa, 0xf5, 0x37, - 0xb9, 0x71, 0xda, 0x49, 0x79, 0xd4, 0xdf, 0x41, 0x29, 0x69, 0xb5, 0x13, 0xb9, 0x44, 0xa6, 0xbd, - 0x3a, 0x49, 0xa3, 0x99, 0xc6, 0xad, 0xb1, 0x42, 0x7d, 0x02, 0xb6, 0xb8, 0x40, 0xa1, 0xa0, 0x7e, - 0xfb, 0x7f, 0x82, 0x1c, 0x97, 0xfa, 0xa4, 0x49, 0x30, 0xf3, 0x1d, 0x2e, 0x7b, 0xb4, 0x62, 0xfe, - 0x14, 0x0f, 0x6a, 0x5b, 0xcd, 0xc5, 0x12, 0x6b, 0x99, 0x57, 0x3d, 0x01, 0x1b, 0x98, 0xf9, 0x38, - 0x0a, 0x43, 0xe2, 0xe3, 0xfe, 0x11, 0x73, 0x29, 0xee, 0xcb, 0x46, 0xad, 0x9a, 0x30, 0xcd, 0x66, - 0x63, 0x6f, 0x56, 0xf0, 0x79, 0x51, 0xd0, 0x9a, 0x07, 0xa9, 0xbf, 0x80, 0x22, 0x8f, 0x78, 0x40, - 0x7c, 0xa7, 0x92, 0xab, 0x2b, 0x8d, 0x92, 0x59, 0x8e, 0x07, 0xb5, 0x62, 0x73, 0x18, 0xb2, 0x46, - 0xff, 0x54, 0x04, 0xca, 0xa7, 0xcc, 0x3e, 0x26, 0x5e, 0xe0, 0x22, 0x41, 0x2a, 0x79, 0xd9, 0xc3, - 0xdf, 0xae, 0x29, 0xf4, 0xc1, 0x44, 0x2d, 0xe7, 0xee, 0xfb, 0x34, 0xd5, 0xf2, 0xd4, 0x0f, 0x6b, - 0x9a, 0xa9, 0x3e, 0x07, 0x55, 0x1e, 0x61, 0x4c, 0x38, 0x6f, 0x45, 0xee, 0x01, 0xb3, 0xf9, 0x3e, - 0xe5, 0x82, 0x85, 0xfd, 0x43, 0xea, 0x51, 0x51, 0x29, 0xd4, 0x95, 0x46, 0xde, 0xd4, 0xe2, 0x41, - 0xad, 0xda, 0x5c, 0xaa, 0xb2, 0xae, 0x21, 0xa8, 0x16, 0xd8, 0x6c, 0x21, 0xea, 0x12, 0x67, 0x8e, - 0x5d, 0x94, 0xec, 0x6a, 0x3c, 0xa8, 0x6d, 0xde, 0x5b, 0xa8, 0xb0, 0x96, 0x38, 0xf5, 0x0f, 0x0a, - 0x58, 0xbb, 0x72, 0x23, 0xd4, 0x87, 0xa0, 0x80, 0xb0, 0xa0, 0xbd, 0x64, 0x60, 0x92, 0x61, 0xdc, - 0x9e, 0xae, 0x51, 0xf2, 0xae, 0x4d, 0xee, 0xb8, 0x45, 0x5a, 0x24, 0x69, 0x05, 0x99, 0x5c, 0xa3, - 0xff, 0xa4, 0xd5, 0x4a, 0x11, 0xaa, 0x0b, 0xd6, 0x5d, 0xc4, 0xc5, 0x68, 0xd6, 0x8e, 0xa9, 0x47, - 0x64, 0x97, 0xae, 0x96, 0xfe, 0x9a, 0xeb, 0x93, 0x38, 0xcc, 0x1f, 0xe2, 0x41, 0x6d, 0xfd, 0x70, - 0x86, 0x63, 0xcd, 0x91, 0xf5, 0xf7, 0x0a, 0x98, 0xee, 0xce, 0x1d, 0x3c, 0x61, 0x4f, 0x41, 0x49, - 0x8c, 0x46, 0x2a, 0xfb, 0xd5, 0x23, 0x35, 0xbe, 0x8b, 0xe3, 0x79, 0x1a, 0xd3, 0xf4, 0xb7, 0x0a, - 0xf8, 0x6e, 0x46, 0x7f, 0x07, 0xe7, 0xf9, 0xf7, 0xca, 0x93, 0xfc, 0xf3, 0x82, 0xb3, 0xc8, 0x53, - 0x2c, 0x7b, 0x88, 0x4d, 0x78, 0x76, 0xa9, 0x65, 0xce, 0x2f, 0xb5, 0xcc, 0xc5, 0xa5, 0x96, 0x79, - 0x19, 0x6b, 0xca, 0x59, 0xac, 0x29, 0xe7, 0xb1, 0xa6, 0x5c, 0xc4, 0x9a, 0xf2, 0x31, 0xd6, 0x94, - 0xd7, 0x9f, 0xb4, 0xcc, 0xb3, 0xd2, 0xa8, 0x22, 0x5f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x20, 0x1c, - 0xcf, 0x94, 0xe7, 0x07, 0x00, 0x00, -} - -func (m *CronJob) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *CronJob) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *CronJob) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Status.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - { - size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - { - size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *CronJobList) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *CronJobList) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *CronJobList) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Items) > 0 { - for iNdEx := len(m.Items) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Items[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - { - size, err := m.ListMeta.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *CronJobSpec) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *CronJobSpec) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *CronJobSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.FailedJobsHistoryLimit != nil { - i = encodeVarintGenerated(dAtA, i, uint64(*m.FailedJobsHistoryLimit)) - i-- - dAtA[i] = 0x38 - } - if m.SuccessfulJobsHistoryLimit != nil { - i = encodeVarintGenerated(dAtA, i, uint64(*m.SuccessfulJobsHistoryLimit)) - i-- - dAtA[i] = 0x30 - } - { - size, err := m.JobTemplate.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - if m.Suspend != nil { - i-- - if *m.Suspend { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x20 - } - i -= len(m.ConcurrencyPolicy) - copy(dAtA[i:], m.ConcurrencyPolicy) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.ConcurrencyPolicy))) - i-- - dAtA[i] = 0x1a - if m.StartingDeadlineSeconds != nil { - i = encodeVarintGenerated(dAtA, i, uint64(*m.StartingDeadlineSeconds)) - i-- - dAtA[i] = 0x10 - } - i -= len(m.Schedule) - copy(dAtA[i:], m.Schedule) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Schedule))) - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *CronJobStatus) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *CronJobStatus) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *CronJobStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.LastScheduleTime != nil { - { - size, err := m.LastScheduleTime.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - if len(m.Active) > 0 { - for iNdEx := len(m.Active) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Active[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *JobTemplate) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *JobTemplate) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *JobTemplate) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Template.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - { - size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *JobTemplateSpec) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *JobTemplateSpec) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *JobTemplateSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - { - size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func encodeVarintGenerated(dAtA []byte, offset int, v uint64) int { - offset -= sovGenerated(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *CronJob) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.ObjectMeta.Size() - n += 1 + l + sovGenerated(uint64(l)) - l = m.Spec.Size() - n += 1 + l + sovGenerated(uint64(l)) - l = m.Status.Size() - n += 1 + l + sovGenerated(uint64(l)) - return n -} - -func (m *CronJobList) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.ListMeta.Size() - n += 1 + l + sovGenerated(uint64(l)) - if len(m.Items) > 0 { - for _, e := range m.Items { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - } - return n -} - -func (m *CronJobSpec) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Schedule) - n += 1 + l + sovGenerated(uint64(l)) - if m.StartingDeadlineSeconds != nil { - n += 1 + sovGenerated(uint64(*m.StartingDeadlineSeconds)) - } - l = len(m.ConcurrencyPolicy) - n += 1 + l + sovGenerated(uint64(l)) - if m.Suspend != nil { - n += 2 - } - l = m.JobTemplate.Size() - n += 1 + l + sovGenerated(uint64(l)) - if m.SuccessfulJobsHistoryLimit != nil { - n += 1 + sovGenerated(uint64(*m.SuccessfulJobsHistoryLimit)) - } - if m.FailedJobsHistoryLimit != nil { - n += 1 + sovGenerated(uint64(*m.FailedJobsHistoryLimit)) - } - return n -} - -func (m *CronJobStatus) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Active) > 0 { - for _, e := range m.Active { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - } - if m.LastScheduleTime != nil { - l = m.LastScheduleTime.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - return n -} - -func (m *JobTemplate) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.ObjectMeta.Size() - n += 1 + l + sovGenerated(uint64(l)) - l = m.Template.Size() - n += 1 + l + sovGenerated(uint64(l)) - return n -} - -func (m *JobTemplateSpec) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.ObjectMeta.Size() - n += 1 + l + sovGenerated(uint64(l)) - l = m.Spec.Size() - n += 1 + l + sovGenerated(uint64(l)) - return n -} - -func sovGenerated(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozGenerated(x uint64) (n int) { - return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (this *CronJob) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&CronJob{`, - `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, - `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "CronJobSpec", "CronJobSpec", 1), `&`, ``, 1) + `,`, - `Status:` + strings.Replace(strings.Replace(this.Status.String(), "CronJobStatus", "CronJobStatus", 1), `&`, ``, 1) + `,`, - `}`, - }, "") - return s -} -func (this *CronJobList) String() string { - if this == nil { - return "nil" - } - repeatedStringForItems := "[]CronJob{" - for _, f := range this.Items { - repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "CronJob", "CronJob", 1), `&`, ``, 1) + "," - } - repeatedStringForItems += "}" - s := strings.Join([]string{`&CronJobList{`, - `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, - `Items:` + repeatedStringForItems + `,`, - `}`, - }, "") - return s -} -func (this *CronJobSpec) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&CronJobSpec{`, - `Schedule:` + fmt.Sprintf("%v", this.Schedule) + `,`, - `StartingDeadlineSeconds:` + valueToStringGenerated(this.StartingDeadlineSeconds) + `,`, - `ConcurrencyPolicy:` + fmt.Sprintf("%v", this.ConcurrencyPolicy) + `,`, - `Suspend:` + valueToStringGenerated(this.Suspend) + `,`, - `JobTemplate:` + strings.Replace(strings.Replace(this.JobTemplate.String(), "JobTemplateSpec", "JobTemplateSpec", 1), `&`, ``, 1) + `,`, - `SuccessfulJobsHistoryLimit:` + valueToStringGenerated(this.SuccessfulJobsHistoryLimit) + `,`, - `FailedJobsHistoryLimit:` + valueToStringGenerated(this.FailedJobsHistoryLimit) + `,`, - `}`, - }, "") - return s -} -func (this *CronJobStatus) String() string { - if this == nil { - return "nil" - } - repeatedStringForActive := "[]ObjectReference{" - for _, f := range this.Active { - repeatedStringForActive += fmt.Sprintf("%v", f) + "," - } - repeatedStringForActive += "}" - s := strings.Join([]string{`&CronJobStatus{`, - `Active:` + repeatedStringForActive + `,`, - `LastScheduleTime:` + strings.Replace(fmt.Sprintf("%v", this.LastScheduleTime), "Time", "v1.Time", 1) + `,`, - `}`, - }, "") - return s -} -func (this *JobTemplate) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&JobTemplate{`, - `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, - `Template:` + strings.Replace(strings.Replace(this.Template.String(), "JobTemplateSpec", "JobTemplateSpec", 1), `&`, ``, 1) + `,`, - `}`, - }, "") - return s -} -func (this *JobTemplateSpec) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&JobTemplateSpec{`, - `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, - `Spec:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Spec), "JobSpec", "v12.JobSpec", 1), `&`, ``, 1) + `,`, - `}`, - }, "") - return s -} -func valueToStringGenerated(v interface{}) string { - rv := reflect.ValueOf(v) - if rv.IsNil() { - return "nil" - } - pv := reflect.Indirect(rv).Interface() - return fmt.Sprintf("*%v", pv) -} -func (m *CronJob) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: CronJob: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: CronJob: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *CronJobList) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: CronJobList: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: CronJobList: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Items = append(m.Items, CronJob{}) - if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *CronJobSpec) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: CronJobSpec: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: CronJobSpec: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Schedule", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Schedule = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field StartingDeadlineSeconds", wireType) - } - var v int64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.StartingDeadlineSeconds = &v - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConcurrencyPolicy", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ConcurrencyPolicy = ConcurrencyPolicy(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Suspend", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - b := bool(v != 0) - m.Suspend = &b - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field JobTemplate", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.JobTemplate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 6: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field SuccessfulJobsHistoryLimit", wireType) - } - var v int32 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.SuccessfulJobsHistoryLimit = &v - case 7: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field FailedJobsHistoryLimit", wireType) - } - var v int32 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.FailedJobsHistoryLimit = &v - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *CronJobStatus) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: CronJobStatus: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: CronJobStatus: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Active", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Active = append(m.Active, v11.ObjectReference{}) - if err := m.Active[len(m.Active)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field LastScheduleTime", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.LastScheduleTime == nil { - m.LastScheduleTime = &v1.Time{} - } - if err := m.LastScheduleTime.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *JobTemplate) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: JobTemplate: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: JobTemplate: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Template", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Template.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *JobTemplateSpec) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: JobTemplateSpec: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: JobTemplateSpec: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipGenerated(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowGenerated - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowGenerated - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowGenerated - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthGenerated - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupGenerated - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthGenerated - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthGenerated = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowGenerated = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupGenerated = fmt.Errorf("proto: unexpected end of group") -) diff --git a/vendor/k8s.io/api/batch/v2alpha1/generated.proto b/vendor/k8s.io/api/batch/v2alpha1/generated.proto deleted file mode 100644 index f538d50cd9c3..000000000000 --- a/vendor/k8s.io/api/batch/v2alpha1/generated.proto +++ /dev/null @@ -1,135 +0,0 @@ -/* -Copyright The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -// This file was autogenerated by go-to-protobuf. Do not edit it manually! - -syntax = "proto2"; - -package k8s.io.api.batch.v2alpha1; - -import "k8s.io/api/batch/v1/generated.proto"; -import "k8s.io/api/core/v1/generated.proto"; -import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; -import "k8s.io/apimachinery/pkg/runtime/generated.proto"; -import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; - -// Package-wide variables from generator "generated". -option go_package = "v2alpha1"; - -// CronJob represents the configuration of a single cron job. -message CronJob { - // Standard object's metadata. - // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata - // +optional - optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; - - // Specification of the desired behavior of a cron job, including the schedule. - // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status - // +optional - optional CronJobSpec spec = 2; - - // Current status of a cron job. - // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status - // +optional - optional CronJobStatus status = 3; -} - -// CronJobList is a collection of cron jobs. -message CronJobList { - // Standard list metadata. - // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata - // +optional - optional k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; - - // items is the list of CronJobs. - repeated CronJob items = 2; -} - -// CronJobSpec describes how the job execution will look like and when it will actually run. -message CronJobSpec { - // The schedule in Cron format, see https://en.wikipedia.org/wiki/Cron. - optional string schedule = 1; - - // Optional deadline in seconds for starting the job if it misses scheduled - // time for any reason. Missed jobs executions will be counted as failed ones. - // +optional - optional int64 startingDeadlineSeconds = 2; - - // Specifies how to treat concurrent executions of a Job. - // Valid values are: - // - "Allow" (default): allows CronJobs to run concurrently; - // - "Forbid": forbids concurrent runs, skipping next run if previous run hasn't finished yet; - // - "Replace": cancels currently running job and replaces it with a new one - // +optional - optional string concurrencyPolicy = 3; - - // This flag tells the controller to suspend subsequent executions, it does - // not apply to already started executions. Defaults to false. - // +optional - optional bool suspend = 4; - - // Specifies the job that will be created when executing a CronJob. - optional JobTemplateSpec jobTemplate = 5; - - // The number of successful finished jobs to retain. - // This is a pointer to distinguish between explicit zero and not specified. - // +optional - optional int32 successfulJobsHistoryLimit = 6; - - // The number of failed finished jobs to retain. - // This is a pointer to distinguish between explicit zero and not specified. - // +optional - optional int32 failedJobsHistoryLimit = 7; -} - -// CronJobStatus represents the current state of a cron job. -message CronJobStatus { - // A list of pointers to currently running jobs. - // +optional - repeated k8s.io.api.core.v1.ObjectReference active = 1; - - // Information when was the last time the job was successfully scheduled. - // +optional - optional k8s.io.apimachinery.pkg.apis.meta.v1.Time lastScheduleTime = 4; -} - -// JobTemplate describes a template for creating copies of a predefined pod. -message JobTemplate { - // Standard object's metadata. - // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata - // +optional - optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; - - // Defines jobs that will be created from this template. - // https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status - // +optional - optional JobTemplateSpec template = 2; -} - -// JobTemplateSpec describes the data a Job should have when created from a template -message JobTemplateSpec { - // Standard object's metadata of the jobs created from this template. - // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata - // +optional - optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; - - // Specification of the desired behavior of the job. - // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status - // +optional - optional k8s.io.api.batch.v1.JobSpec spec = 2; -} - diff --git a/vendor/k8s.io/api/batch/v2alpha1/register.go b/vendor/k8s.io/api/batch/v2alpha1/register.go deleted file mode 100644 index ac7fa5087a94..000000000000 --- a/vendor/k8s.io/api/batch/v2alpha1/register.go +++ /dev/null @@ -1,53 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package v2alpha1 - -import ( - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" -) - -// GroupName is the group name use in this package -const GroupName = "batch" - -// SchemeGroupVersion is group version used to register these objects -var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: "v2alpha1"} - -// Resource takes an unqualified resource and returns a Group qualified GroupResource -func Resource(resource string) schema.GroupResource { - return SchemeGroupVersion.WithResource(resource).GroupResource() -} - -var ( - // TODO: move SchemeBuilder with zz_generated.deepcopy.go to k8s.io/api. - // localSchemeBuilder and AddToScheme will stay in k8s.io/kubernetes. - SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes) - localSchemeBuilder = &SchemeBuilder - AddToScheme = localSchemeBuilder.AddToScheme -) - -// Adds the list of known types to the given scheme. -func addKnownTypes(scheme *runtime.Scheme) error { - scheme.AddKnownTypes(SchemeGroupVersion, - &JobTemplate{}, - &CronJob{}, - &CronJobList{}, - ) - metav1.AddToGroupVersion(scheme, SchemeGroupVersion) - return nil -} diff --git a/vendor/k8s.io/api/batch/v2alpha1/types.go b/vendor/k8s.io/api/batch/v2alpha1/types.go deleted file mode 100644 index 465e614aec39..000000000000 --- a/vendor/k8s.io/api/batch/v2alpha1/types.go +++ /dev/null @@ -1,156 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package v2alpha1 - -import ( - batchv1 "k8s.io/api/batch/v1" - "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -// JobTemplate describes a template for creating copies of a predefined pod. -type JobTemplate struct { - metav1.TypeMeta `json:",inline"` - // Standard object's metadata. - // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata - // +optional - metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - - // Defines jobs that will be created from this template. - // https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status - // +optional - Template JobTemplateSpec `json:"template,omitempty" protobuf:"bytes,2,opt,name=template"` -} - -// JobTemplateSpec describes the data a Job should have when created from a template -type JobTemplateSpec struct { - // Standard object's metadata of the jobs created from this template. - // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata - // +optional - metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - - // Specification of the desired behavior of the job. - // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status - // +optional - Spec batchv1.JobSpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"` -} - -// +genclient -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -// CronJob represents the configuration of a single cron job. -type CronJob struct { - metav1.TypeMeta `json:",inline"` - // Standard object's metadata. - // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata - // +optional - metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - - // Specification of the desired behavior of a cron job, including the schedule. - // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status - // +optional - Spec CronJobSpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"` - - // Current status of a cron job. - // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status - // +optional - Status CronJobStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"` -} - -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -// CronJobList is a collection of cron jobs. -type CronJobList struct { - metav1.TypeMeta `json:",inline"` - - // Standard list metadata. - // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata - // +optional - metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - - // items is the list of CronJobs. - Items []CronJob `json:"items" protobuf:"bytes,2,rep,name=items"` -} - -// CronJobSpec describes how the job execution will look like and when it will actually run. -type CronJobSpec struct { - - // The schedule in Cron format, see https://en.wikipedia.org/wiki/Cron. - Schedule string `json:"schedule" protobuf:"bytes,1,opt,name=schedule"` - - // Optional deadline in seconds for starting the job if it misses scheduled - // time for any reason. Missed jobs executions will be counted as failed ones. - // +optional - StartingDeadlineSeconds *int64 `json:"startingDeadlineSeconds,omitempty" protobuf:"varint,2,opt,name=startingDeadlineSeconds"` - - // Specifies how to treat concurrent executions of a Job. - // Valid values are: - // - "Allow" (default): allows CronJobs to run concurrently; - // - "Forbid": forbids concurrent runs, skipping next run if previous run hasn't finished yet; - // - "Replace": cancels currently running job and replaces it with a new one - // +optional - ConcurrencyPolicy ConcurrencyPolicy `json:"concurrencyPolicy,omitempty" protobuf:"bytes,3,opt,name=concurrencyPolicy,casttype=ConcurrencyPolicy"` - - // This flag tells the controller to suspend subsequent executions, it does - // not apply to already started executions. Defaults to false. - // +optional - Suspend *bool `json:"suspend,omitempty" protobuf:"varint,4,opt,name=suspend"` - - // Specifies the job that will be created when executing a CronJob. - JobTemplate JobTemplateSpec `json:"jobTemplate" protobuf:"bytes,5,opt,name=jobTemplate"` - - // The number of successful finished jobs to retain. - // This is a pointer to distinguish between explicit zero and not specified. - // +optional - SuccessfulJobsHistoryLimit *int32 `json:"successfulJobsHistoryLimit,omitempty" protobuf:"varint,6,opt,name=successfulJobsHistoryLimit"` - - // The number of failed finished jobs to retain. - // This is a pointer to distinguish between explicit zero and not specified. - // +optional - FailedJobsHistoryLimit *int32 `json:"failedJobsHistoryLimit,omitempty" protobuf:"varint,7,opt,name=failedJobsHistoryLimit"` -} - -// ConcurrencyPolicy describes how the job will be handled. -// Only one of the following concurrent policies may be specified. -// If none of the following policies is specified, the default one -// is AllowConcurrent. -type ConcurrencyPolicy string - -const ( - // AllowConcurrent allows CronJobs to run concurrently. - AllowConcurrent ConcurrencyPolicy = "Allow" - - // ForbidConcurrent forbids concurrent runs, skipping next run if previous - // hasn't finished yet. - ForbidConcurrent ConcurrencyPolicy = "Forbid" - - // ReplaceConcurrent cancels currently running job and replaces it with a new one. - ReplaceConcurrent ConcurrencyPolicy = "Replace" -) - -// CronJobStatus represents the current state of a cron job. -type CronJobStatus struct { - // A list of pointers to currently running jobs. - // +optional - Active []v1.ObjectReference `json:"active,omitempty" protobuf:"bytes,1,rep,name=active"` - - // Information when was the last time the job was successfully scheduled. - // +optional - LastScheduleTime *metav1.Time `json:"lastScheduleTime,omitempty" protobuf:"bytes,4,opt,name=lastScheduleTime"` -} diff --git a/vendor/k8s.io/api/batch/v2alpha1/types_swagger_doc_generated.go b/vendor/k8s.io/api/batch/v2alpha1/types_swagger_doc_generated.go deleted file mode 100644 index bc80eca48f0d..000000000000 --- a/vendor/k8s.io/api/batch/v2alpha1/types_swagger_doc_generated.go +++ /dev/null @@ -1,96 +0,0 @@ -/* -Copyright The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package v2alpha1 - -// This file contains a collection of methods that can be used from go-restful to -// generate Swagger API documentation for its models. Please read this PR for more -// information on the implementation: https://github.com/emicklei/go-restful/pull/215 -// -// TODOs are ignored from the parser (e.g. TODO(andronat):... || TODO:...) if and only if -// they are on one line! For multiple line or blocks that you want to ignore use ---. -// Any context after a --- is ignored. -// -// Those methods can be generated by using hack/update-generated-swagger-docs.sh - -// AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. -var map_CronJob = map[string]string{ - "": "CronJob represents the configuration of a single cron job.", - "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", - "spec": "Specification of the desired behavior of a cron job, including the schedule. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status", - "status": "Current status of a cron job. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status", -} - -func (CronJob) SwaggerDoc() map[string]string { - return map_CronJob -} - -var map_CronJobList = map[string]string{ - "": "CronJobList is a collection of cron jobs.", - "metadata": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", - "items": "items is the list of CronJobs.", -} - -func (CronJobList) SwaggerDoc() map[string]string { - return map_CronJobList -} - -var map_CronJobSpec = map[string]string{ - "": "CronJobSpec describes how the job execution will look like and when it will actually run.", - "schedule": "The schedule in Cron format, see https://en.wikipedia.org/wiki/Cron.", - "startingDeadlineSeconds": "Optional deadline in seconds for starting the job if it misses scheduled time for any reason. Missed jobs executions will be counted as failed ones.", - "concurrencyPolicy": "Specifies how to treat concurrent executions of a Job. Valid values are: - \"Allow\" (default): allows CronJobs to run concurrently; - \"Forbid\": forbids concurrent runs, skipping next run if previous run hasn't finished yet; - \"Replace\": cancels currently running job and replaces it with a new one", - "suspend": "This flag tells the controller to suspend subsequent executions, it does not apply to already started executions. Defaults to false.", - "jobTemplate": "Specifies the job that will be created when executing a CronJob.", - "successfulJobsHistoryLimit": "The number of successful finished jobs to retain. This is a pointer to distinguish between explicit zero and not specified.", - "failedJobsHistoryLimit": "The number of failed finished jobs to retain. This is a pointer to distinguish between explicit zero and not specified.", -} - -func (CronJobSpec) SwaggerDoc() map[string]string { - return map_CronJobSpec -} - -var map_CronJobStatus = map[string]string{ - "": "CronJobStatus represents the current state of a cron job.", - "active": "A list of pointers to currently running jobs.", - "lastScheduleTime": "Information when was the last time the job was successfully scheduled.", -} - -func (CronJobStatus) SwaggerDoc() map[string]string { - return map_CronJobStatus -} - -var map_JobTemplate = map[string]string{ - "": "JobTemplate describes a template for creating copies of a predefined pod.", - "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", - "template": "Defines jobs that will be created from this template. https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status", -} - -func (JobTemplate) SwaggerDoc() map[string]string { - return map_JobTemplate -} - -var map_JobTemplateSpec = map[string]string{ - "": "JobTemplateSpec describes the data a Job should have when created from a template", - "metadata": "Standard object's metadata of the jobs created from this template. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", - "spec": "Specification of the desired behavior of the job. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status", -} - -func (JobTemplateSpec) SwaggerDoc() map[string]string { - return map_JobTemplateSpec -} - -// AUTO-GENERATED FUNCTIONS END HERE diff --git a/vendor/k8s.io/api/batch/v2alpha1/zz_generated.deepcopy.go b/vendor/k8s.io/api/batch/v2alpha1/zz_generated.deepcopy.go deleted file mode 100644 index 1b03f6745cb6..000000000000 --- a/vendor/k8s.io/api/batch/v2alpha1/zz_generated.deepcopy.go +++ /dev/null @@ -1,194 +0,0 @@ -// +build !ignore_autogenerated - -/* -Copyright The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by deepcopy-gen. DO NOT EDIT. - -package v2alpha1 - -import ( - v1 "k8s.io/api/core/v1" - runtime "k8s.io/apimachinery/pkg/runtime" -) - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *CronJob) DeepCopyInto(out *CronJob) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) - in.Status.DeepCopyInto(&out.Status) - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CronJob. -func (in *CronJob) DeepCopy() *CronJob { - if in == nil { - return nil - } - out := new(CronJob) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *CronJob) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *CronJobList) DeepCopyInto(out *CronJobList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]CronJob, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CronJobList. -func (in *CronJobList) DeepCopy() *CronJobList { - if in == nil { - return nil - } - out := new(CronJobList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *CronJobList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *CronJobSpec) DeepCopyInto(out *CronJobSpec) { - *out = *in - if in.StartingDeadlineSeconds != nil { - in, out := &in.StartingDeadlineSeconds, &out.StartingDeadlineSeconds - *out = new(int64) - **out = **in - } - if in.Suspend != nil { - in, out := &in.Suspend, &out.Suspend - *out = new(bool) - **out = **in - } - in.JobTemplate.DeepCopyInto(&out.JobTemplate) - if in.SuccessfulJobsHistoryLimit != nil { - in, out := &in.SuccessfulJobsHistoryLimit, &out.SuccessfulJobsHistoryLimit - *out = new(int32) - **out = **in - } - if in.FailedJobsHistoryLimit != nil { - in, out := &in.FailedJobsHistoryLimit, &out.FailedJobsHistoryLimit - *out = new(int32) - **out = **in - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CronJobSpec. -func (in *CronJobSpec) DeepCopy() *CronJobSpec { - if in == nil { - return nil - } - out := new(CronJobSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *CronJobStatus) DeepCopyInto(out *CronJobStatus) { - *out = *in - if in.Active != nil { - in, out := &in.Active, &out.Active - *out = make([]v1.ObjectReference, len(*in)) - copy(*out, *in) - } - if in.LastScheduleTime != nil { - in, out := &in.LastScheduleTime, &out.LastScheduleTime - *out = (*in).DeepCopy() - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CronJobStatus. -func (in *CronJobStatus) DeepCopy() *CronJobStatus { - if in == nil { - return nil - } - out := new(CronJobStatus) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *JobTemplate) DeepCopyInto(out *JobTemplate) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Template.DeepCopyInto(&out.Template) - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new JobTemplate. -func (in *JobTemplate) DeepCopy() *JobTemplate { - if in == nil { - return nil - } - out := new(JobTemplate) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *JobTemplate) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *JobTemplateSpec) DeepCopyInto(out *JobTemplateSpec) { - *out = *in - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new JobTemplateSpec. -func (in *JobTemplateSpec) DeepCopy() *JobTemplateSpec { - if in == nil { - return nil - } - out := new(JobTemplateSpec) - in.DeepCopyInto(out) - return out -} diff --git a/vendor/k8s.io/api/certificates/v1/BUILD b/vendor/k8s.io/api/certificates/v1/BUILD deleted file mode 100644 index 65d9af70cbfe..000000000000 --- a/vendor/k8s.io/api/certificates/v1/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/api/certificates/v1", - importpath = "k8s.io/api/certificates/v1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/certificates/v1/generated.pb.go b/vendor/k8s.io/api/certificates/v1/generated.pb.go index d2cf41a25a87..fca7d2115412 100644 --- a/vendor/k8s.io/api/certificates/v1/generated.pb.go +++ b/vendor/k8s.io/api/certificates/v1/generated.pb.go @@ -989,10 +989,7 @@ func (m *CertificateSigningRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1236,10 +1233,7 @@ func (m *CertificateSigningRequestCondition) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1356,10 +1350,7 @@ func (m *CertificateSigningRequestList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1683,7 +1674,7 @@ func (m *CertificateSigningRequestSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -1732,10 +1723,7 @@ func (m *CertificateSigningRequestSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1853,10 +1841,7 @@ func (m *CertificateSigningRequestStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1938,10 +1923,7 @@ func (m *ExtraValue) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/api/certificates/v1beta1/BUILD b/vendor/k8s.io/api/certificates/v1beta1/BUILD deleted file mode 100644 index f731ec6b4b37..000000000000 --- a/vendor/k8s.io/api/certificates/v1beta1/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - "zz_generated.prerelease-lifecycle.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/api/certificates/v1beta1", - importpath = "k8s.io/api/certificates/v1beta1", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/api/certificates/v1beta1/generated.pb.go b/vendor/k8s.io/api/certificates/v1beta1/generated.pb.go index 1729931b82dc..f21256f48449 100644 --- a/vendor/k8s.io/api/certificates/v1beta1/generated.pb.go +++ b/vendor/k8s.io/api/certificates/v1beta1/generated.pb.go @@ -993,10 +993,7 @@ func (m *CertificateSigningRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1240,10 +1237,7 @@ func (m *CertificateSigningRequestCondition) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1360,10 +1354,7 @@ func (m *CertificateSigningRequestList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1687,7 +1678,7 @@ func (m *CertificateSigningRequestSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -1737,10 +1728,7 @@ func (m *CertificateSigningRequestSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1858,10 +1846,7 @@ func (m *CertificateSigningRequestStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1943,10 +1928,7 @@ func (m *ExtraValue) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/api/coordination/v1/BUILD b/vendor/k8s.io/api/coordination/v1/BUILD deleted file mode 100644 index 4dd8cf4be135..000000000000 --- a/vendor/k8s.io/api/coordination/v1/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/api/coordination/v1", - importpath = "k8s.io/api/coordination/v1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/coordination/v1/generated.pb.go b/vendor/k8s.io/api/coordination/v1/generated.pb.go index 22c3d624e2bc..d5ed0f27c5f5 100644 --- a/vendor/k8s.io/api/coordination/v1/generated.pb.go +++ b/vendor/k8s.io/api/coordination/v1/generated.pb.go @@ -554,10 +554,7 @@ func (m *Lease) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -674,10 +671,7 @@ func (m *LeaseList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -872,10 +866,7 @@ func (m *LeaseSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/api/coordination/v1beta1/BUILD b/vendor/k8s.io/api/coordination/v1beta1/BUILD deleted file mode 100644 index 7f54c8179227..000000000000 --- a/vendor/k8s.io/api/coordination/v1beta1/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - "zz_generated.prerelease-lifecycle.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/api/coordination/v1beta1", - importpath = "k8s.io/api/coordination/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/coordination/v1beta1/generated.pb.go b/vendor/k8s.io/api/coordination/v1beta1/generated.pb.go index 57a314cfd78a..bcd00d44540a 100644 --- a/vendor/k8s.io/api/coordination/v1beta1/generated.pb.go +++ b/vendor/k8s.io/api/coordination/v1beta1/generated.pb.go @@ -554,10 +554,7 @@ func (m *Lease) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -674,10 +671,7 @@ func (m *LeaseList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -872,10 +866,7 @@ func (m *LeaseSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/api/core/v1/BUILD b/vendor/k8s.io/api/core/v1/BUILD deleted file mode 100644 index 3fd4f39d55f2..000000000000 --- a/vendor/k8s.io/api/core/v1/BUILD +++ /dev/null @@ -1,61 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "taint_test.go", - "toleration_test.go", - ], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = [ - "annotation_key_constants.go", - "doc.go", - "generated.pb.go", - "lifecycle.go", - "objectreference.go", - "register.go", - "resource.go", - "taint.go", - "toleration.go", - "types.go", - "types_swagger_doc_generated.go", - "well_known_labels.go", - "well_known_taints.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/api/core/v1", - importpath = "k8s.io/api/core/v1", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/api/core/v1/annotation_key_constants.go b/vendor/k8s.io/api/core/v1/annotation_key_constants.go index d3ebf862836a..612f6aa747a6 100644 --- a/vendor/k8s.io/api/core/v1/annotation_key_constants.go +++ b/vendor/k8s.io/api/core/v1/annotation_key_constants.go @@ -123,9 +123,32 @@ const ( // https://github.com/kubernetes/community/blob/master/sig-scalability/slos/network_programming_latency.md EndpointsLastChangeTriggerTime = "endpoints.kubernetes.io/last-change-trigger-time" + // EndpointsOverCapacity will be set on an Endpoints resource when it + // exceeds the maximum capacity of 1000 addresses. Inititially the Endpoints + // controller will set this annotation with a value of "warning". In a + // future release, the controller may set this annotation with a value of + // "truncated" to indicate that any addresses exceeding the limit of 1000 + // have been truncated from the Endpoints resource. + EndpointsOverCapacity = "endpoints.kubernetes.io/over-capacity" + // MigratedPluginsAnnotationKey is the annotation key, set for CSINode objects, that is a comma-separated // list of in-tree plugins that will be serviced by the CSI backend on the Node represented by CSINode. // This annotation is used by the Attach Detach Controller to determine whether to use the in-tree or // CSI Backend for a volume plugin on a specific node. MigratedPluginsAnnotationKey = "storage.alpha.kubernetes.io/migrated-plugins" + + // PodDeletionCost can be used to set to an int32 that represent the cost of deleting + // a pod compared to other pods belonging to the same ReplicaSet. Pods with lower + // deletion cost are preferred to be deleted before pods with higher deletion cost. + // Note that this is honored on a best-effort basis, and so it does not offer guarantees on + // pod deletion order. + // The implicit deletion cost for pods that don't set the annotation is 0, negative values are permitted. + // + // This annotation is alpha-level and is only honored when PodDeletionCost feature is enabled. + PodDeletionCost = "controller.kubernetes.io/pod-deletion-cost" + + // AnnotationTopologyAwareHints can be used to enable or disable Topology + // Aware Hints for a Service. This may be set to "auto" or "disabled". Any + // other value is treated as "disabled". + AnnotationTopologyAwareHints = "service.kubernetes.io/topology-aware-hints" ) diff --git a/vendor/k8s.io/api/core/v1/generated.pb.go b/vendor/k8s.io/api/core/v1/generated.pb.go index 5dcc5eb77a43..27f4f9cb9ecd 100644 --- a/vendor/k8s.io/api/core/v1/generated.pb.go +++ b/vendor/k8s.io/api/core/v1/generated.pb.go @@ -6116,882 +6116,887 @@ func init() { } var fileDescriptor_83c10c24ec417dc9 = []byte{ - // 13999 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6b, 0x70, 0x5c, 0xd7, - 0x79, 0x98, 0xef, 0x2e, 0x5e, 0xfb, 0xe1, 0x7d, 0x40, 0x52, 0x20, 0x24, 0x12, 0xd4, 0x95, 0x4d, - 0x51, 0x96, 0x04, 0x9a, 0x7a, 0xd8, 0x8a, 0x64, 0x2b, 0x06, 0xb0, 0x00, 0xb9, 0x22, 0x01, 0xae, - 0xce, 0x82, 0xa4, 0xed, 0xc8, 0x1e, 0x5f, 0xec, 0x1e, 0x00, 0x57, 0xd8, 0xbd, 0x77, 0x75, 0xef, - 0x5d, 0x90, 0x50, 0x9d, 0x69, 0xea, 0x3c, 0x9d, 0x47, 0xc7, 0xd3, 0xc9, 0xf4, 0x91, 0x64, 0x32, - 0x9d, 0x34, 0x9d, 0xc4, 0x75, 0xdb, 0x69, 0x9a, 0x34, 0x49, 0xe3, 0xb4, 0x49, 0x9b, 0x3e, 0xd2, - 0xfe, 0x48, 0xd3, 0x4c, 0x1b, 0x67, 0x26, 0x53, 0x34, 0x61, 0x3a, 0xcd, 0xf8, 0x47, 0x93, 0xb4, - 0x49, 0x7f, 0x14, 0xcd, 0x34, 0x9d, 0xf3, 0xbc, 0xe7, 0xdc, 0xc7, 0xee, 0x82, 0x02, 0x61, 0xd9, - 0xa3, 0x7f, 0xbb, 0xe7, 0xfb, 0xce, 0x77, 0xce, 0x3d, 0xcf, 0xef, 0x7c, 0x4f, 0x78, 0x65, 0xf7, - 0xa5, 0x70, 0xc1, 0xf5, 0x2f, 0xef, 0x76, 0x36, 0x49, 0xe0, 0x91, 0x88, 0x84, 0x97, 0xf7, 0x88, - 0xd7, 0xf0, 0x83, 0xcb, 0x02, 0xe0, 0xb4, 0xdd, 0xcb, 0x75, 0x3f, 0x20, 0x97, 0xf7, 0xae, 0x5c, - 0xde, 0x26, 0x1e, 0x09, 0x9c, 0x88, 0x34, 0x16, 0xda, 0x81, 0x1f, 0xf9, 0x08, 0x71, 0x9c, 0x05, - 0xa7, 0xed, 0x2e, 0x50, 0x9c, 0x85, 0xbd, 0x2b, 0x73, 0xcf, 0x6e, 0xbb, 0xd1, 0x4e, 0x67, 0x73, - 0xa1, 0xee, 0xb7, 0x2e, 0x6f, 0xfb, 0xdb, 0xfe, 0x65, 0x86, 0xba, 0xd9, 0xd9, 0x62, 0xff, 0xd8, - 0x1f, 0xf6, 0x8b, 0x93, 0x98, 0x7b, 0x21, 0x6e, 0xa6, 0xe5, 0xd4, 0x77, 0x5c, 0x8f, 0x04, 0xfb, - 0x97, 0xdb, 0xbb, 0xdb, 0xac, 0xdd, 0x80, 0x84, 0x7e, 0x27, 0xa8, 0x93, 0x64, 0xc3, 0x5d, 0x6b, - 0x85, 0x97, 0x5b, 0x24, 0x72, 0x32, 0xba, 0x3b, 0x77, 0x39, 0xaf, 0x56, 0xd0, 0xf1, 0x22, 0xb7, - 0x95, 0x6e, 0xe6, 0xc3, 0xbd, 0x2a, 0x84, 0xf5, 0x1d, 0xd2, 0x72, 0x52, 0xf5, 0x9e, 0xcf, 0xab, - 0xd7, 0x89, 0xdc, 0xe6, 0x65, 0xd7, 0x8b, 0xc2, 0x28, 0x48, 0x56, 0xb2, 0xbf, 0x6a, 0xc1, 0x85, - 0xc5, 0x3b, 0xb5, 0x95, 0xa6, 0x13, 0x46, 0x6e, 0x7d, 0xa9, 0xe9, 0xd7, 0x77, 0x6b, 0x91, 0x1f, - 0x90, 0xdb, 0x7e, 0xb3, 0xd3, 0x22, 0x35, 0x36, 0x10, 0xe8, 0x19, 0x18, 0xd9, 0x63, 0xff, 0x2b, - 0xe5, 0x59, 0xeb, 0x82, 0x75, 0xa9, 0xb4, 0x34, 0xf5, 0xeb, 0x07, 0xf3, 0xef, 0xbb, 0x7f, 0x30, - 0x3f, 0x72, 0x5b, 0x94, 0x63, 0x85, 0x81, 0x2e, 0xc2, 0xd0, 0x56, 0xb8, 0xb1, 0xdf, 0x26, 0xb3, - 0x05, 0x86, 0x3b, 0x21, 0x70, 0x87, 0x56, 0x6b, 0xb4, 0x14, 0x0b, 0x28, 0xba, 0x0c, 0xa5, 0xb6, - 0x13, 0x44, 0x6e, 0xe4, 0xfa, 0xde, 0x6c, 0xf1, 0x82, 0x75, 0x69, 0x70, 0x69, 0x5a, 0xa0, 0x96, - 0xaa, 0x12, 0x80, 0x63, 0x1c, 0xda, 0x8d, 0x80, 0x38, 0x8d, 0x9b, 0x5e, 0x73, 0x7f, 0x76, 0xe0, - 0x82, 0x75, 0x69, 0x24, 0xee, 0x06, 0x16, 0xe5, 0x58, 0x61, 0xd8, 0x3f, 0x52, 0x80, 0x91, 0xc5, - 0xad, 0x2d, 0xd7, 0x73, 0xa3, 0x7d, 0x74, 0x1b, 0xc6, 0x3c, 0xbf, 0x41, 0xe4, 0x7f, 0xf6, 0x15, - 0xa3, 0xcf, 0x5d, 0x58, 0x48, 0x2f, 0xa5, 0x85, 0x75, 0x0d, 0x6f, 0x69, 0xea, 0xfe, 0xc1, 0xfc, - 0x98, 0x5e, 0x82, 0x0d, 0x3a, 0x08, 0xc3, 0x68, 0xdb, 0x6f, 0x28, 0xb2, 0x05, 0x46, 0x76, 0x3e, - 0x8b, 0x6c, 0x35, 0x46, 0x5b, 0x9a, 0xbc, 0x7f, 0x30, 0x3f, 0xaa, 0x15, 0x60, 0x9d, 0x08, 0xda, - 0x84, 0x49, 0xfa, 0xd7, 0x8b, 0x5c, 0x45, 0xb7, 0xc8, 0xe8, 0x3e, 0x91, 0x47, 0x57, 0x43, 0x5d, - 0x9a, 0xb9, 0x7f, 0x30, 0x3f, 0x99, 0x28, 0xc4, 0x49, 0x82, 0xf6, 0xdb, 0x30, 0xb1, 0x18, 0x45, - 0x4e, 0x7d, 0x87, 0x34, 0xf8, 0x0c, 0xa2, 0x17, 0x60, 0xc0, 0x73, 0x5a, 0x44, 0xcc, 0xef, 0x05, - 0x31, 0xb0, 0x03, 0xeb, 0x4e, 0x8b, 0x1c, 0x1e, 0xcc, 0x4f, 0xdd, 0xf2, 0xdc, 0xb7, 0x3a, 0x62, - 0x55, 0xd0, 0x32, 0xcc, 0xb0, 0xd1, 0x73, 0x00, 0x0d, 0xb2, 0xe7, 0xd6, 0x49, 0xd5, 0x89, 0x76, - 0xc4, 0x7c, 0x23, 0x51, 0x17, 0xca, 0x0a, 0x82, 0x35, 0x2c, 0xfb, 0x1e, 0x94, 0x16, 0xf7, 0x7c, - 0xb7, 0x51, 0xf5, 0x1b, 0x21, 0xda, 0x85, 0xc9, 0x76, 0x40, 0xb6, 0x48, 0xa0, 0x8a, 0x66, 0xad, - 0x0b, 0xc5, 0x4b, 0xa3, 0xcf, 0x5d, 0xca, 0xfc, 0x58, 0x13, 0x75, 0xc5, 0x8b, 0x82, 0xfd, 0xa5, - 0x47, 0x44, 0x7b, 0x93, 0x09, 0x28, 0x4e, 0x52, 0xb6, 0xff, 0x55, 0x01, 0x4e, 0x2f, 0xbe, 0xdd, - 0x09, 0x48, 0xd9, 0x0d, 0x77, 0x93, 0x2b, 0xbc, 0xe1, 0x86, 0xbb, 0xeb, 0xf1, 0x08, 0xa8, 0xa5, - 0x55, 0x16, 0xe5, 0x58, 0x61, 0xa0, 0x67, 0x61, 0x98, 0xfe, 0xbe, 0x85, 0x2b, 0xe2, 0x93, 0x67, - 0x04, 0xf2, 0x68, 0xd9, 0x89, 0x9c, 0x32, 0x07, 0x61, 0x89, 0x83, 0xd6, 0x60, 0xb4, 0xce, 0x36, - 0xe4, 0xf6, 0x9a, 0xdf, 0x20, 0x6c, 0x32, 0x4b, 0x4b, 0x4f, 0x53, 0xf4, 0xe5, 0xb8, 0xf8, 0xf0, - 0x60, 0x7e, 0x96, 0xf7, 0x4d, 0x90, 0xd0, 0x60, 0x58, 0xaf, 0x8f, 0x6c, 0xb5, 0xbf, 0x06, 0x18, - 0x25, 0xc8, 0xd8, 0x5b, 0x97, 0xb4, 0xad, 0x32, 0xc8, 0xb6, 0xca, 0x58, 0xf6, 0x36, 0x41, 0x57, - 0x60, 0x60, 0xd7, 0xf5, 0x1a, 0xb3, 0x43, 0x8c, 0xd6, 0x39, 0x3a, 0xe7, 0xd7, 0x5d, 0xaf, 0x71, - 0x78, 0x30, 0x3f, 0x6d, 0x74, 0x87, 0x16, 0x62, 0x86, 0x6a, 0xff, 0xa9, 0x05, 0xf3, 0x0c, 0xb6, - 0xea, 0x36, 0x49, 0x95, 0x04, 0xa1, 0x1b, 0x46, 0xc4, 0x8b, 0x8c, 0x01, 0x7d, 0x0e, 0x20, 0x24, - 0xf5, 0x80, 0x44, 0xda, 0x90, 0xaa, 0x85, 0x51, 0x53, 0x10, 0xac, 0x61, 0xd1, 0x03, 0x21, 0xdc, - 0x71, 0x02, 0xb6, 0xbe, 0xc4, 0xc0, 0xaa, 0x03, 0xa1, 0x26, 0x01, 0x38, 0xc6, 0x31, 0x0e, 0x84, - 0x62, 0xaf, 0x03, 0x01, 0x7d, 0x0c, 0x26, 0xe3, 0xc6, 0xc2, 0xb6, 0x53, 0x97, 0x03, 0xc8, 0xb6, - 0x4c, 0xcd, 0x04, 0xe1, 0x24, 0xae, 0xfd, 0xf7, 0x2c, 0xb1, 0x78, 0xe8, 0x57, 0xbf, 0xcb, 0xbf, - 0xd5, 0xfe, 0x45, 0x0b, 0x86, 0x97, 0x5c, 0xaf, 0xe1, 0x7a, 0xdb, 0xe8, 0xb3, 0x30, 0x42, 0xef, - 0xa6, 0x86, 0x13, 0x39, 0xe2, 0xdc, 0xfb, 0x90, 0xb6, 0xb7, 0xd4, 0x55, 0xb1, 0xd0, 0xde, 0xdd, - 0xa6, 0x05, 0xe1, 0x02, 0xc5, 0xa6, 0xbb, 0xed, 0xe6, 0xe6, 0x9b, 0xa4, 0x1e, 0xad, 0x91, 0xc8, - 0x89, 0x3f, 0x27, 0x2e, 0xc3, 0x8a, 0x2a, 0xba, 0x0e, 0x43, 0x91, 0x13, 0x6c, 0x93, 0x48, 0x1c, - 0x80, 0x99, 0x07, 0x15, 0xaf, 0x89, 0xe9, 0x8e, 0x24, 0x5e, 0x9d, 0xc4, 0xd7, 0xc2, 0x06, 0xab, - 0x8a, 0x05, 0x09, 0xfb, 0x87, 0x86, 0xe1, 0xec, 0x72, 0xad, 0x92, 0xb3, 0xae, 0x2e, 0xc2, 0x50, - 0x23, 0x70, 0xf7, 0x48, 0x20, 0xc6, 0x59, 0x51, 0x29, 0xb3, 0x52, 0x2c, 0xa0, 0xe8, 0x25, 0x18, - 0xe3, 0x17, 0xd2, 0x35, 0xc7, 0x6b, 0x34, 0xe5, 0x10, 0x9f, 0x12, 0xd8, 0x63, 0xb7, 0x35, 0x18, - 0x36, 0x30, 0x8f, 0xb8, 0xa8, 0x2e, 0x26, 0x36, 0x63, 0xde, 0x65, 0xf7, 0x05, 0x0b, 0xa6, 0x78, - 0x33, 0x8b, 0x51, 0x14, 0xb8, 0x9b, 0x9d, 0x88, 0x84, 0xb3, 0x83, 0xec, 0xa4, 0x5b, 0xce, 0x1a, - 0xad, 0xdc, 0x11, 0x58, 0xb8, 0x9d, 0xa0, 0xc2, 0x0f, 0xc1, 0x59, 0xd1, 0xee, 0x54, 0x12, 0x8c, - 0x53, 0xcd, 0xa2, 0xef, 0xb4, 0x60, 0xae, 0xee, 0x7b, 0x51, 0xe0, 0x37, 0x9b, 0x24, 0xa8, 0x76, - 0x36, 0x9b, 0x6e, 0xb8, 0xc3, 0xd7, 0x29, 0x26, 0x5b, 0xec, 0x24, 0xc8, 0x99, 0x43, 0x85, 0x24, - 0xe6, 0xf0, 0xfc, 0xfd, 0x83, 0xf9, 0xb9, 0xe5, 0x5c, 0x52, 0xb8, 0x4b, 0x33, 0x68, 0x17, 0x10, - 0xbd, 0x4a, 0x6b, 0x91, 0xb3, 0x4d, 0xe2, 0xc6, 0x87, 0xfb, 0x6f, 0xfc, 0xcc, 0xfd, 0x83, 0x79, - 0xb4, 0x9e, 0x22, 0x81, 0x33, 0xc8, 0xa2, 0xb7, 0xe0, 0x14, 0x2d, 0x4d, 0x7d, 0xeb, 0x48, 0xff, - 0xcd, 0xcd, 0xde, 0x3f, 0x98, 0x3f, 0xb5, 0x9e, 0x41, 0x04, 0x67, 0x92, 0x46, 0xdf, 0x61, 0xc1, - 0xd9, 0xf8, 0xf3, 0x57, 0xee, 0xb5, 0x1d, 0xaf, 0x11, 0x37, 0x5c, 0xea, 0xbf, 0x61, 0x7a, 0x26, - 0x9f, 0x5d, 0xce, 0xa3, 0x84, 0xf3, 0x1b, 0x99, 0x5b, 0x86, 0xd3, 0x99, 0xab, 0x05, 0x4d, 0x41, - 0x71, 0x97, 0x70, 0x2e, 0xa8, 0x84, 0xe9, 0x4f, 0x74, 0x0a, 0x06, 0xf7, 0x9c, 0x66, 0x47, 0x6c, - 0x14, 0xcc, 0xff, 0xbc, 0x5c, 0x78, 0xc9, 0xb2, 0xff, 0x75, 0x11, 0x26, 0x97, 0x6b, 0x95, 0x07, - 0xda, 0x85, 0xfa, 0x35, 0x54, 0xe8, 0x7a, 0x0d, 0xc5, 0x97, 0x5a, 0x31, 0xf7, 0x52, 0xfb, 0xcb, - 0x19, 0x5b, 0x68, 0x80, 0x6d, 0xa1, 0x6f, 0xc9, 0xd9, 0x42, 0xc7, 0xbc, 0x71, 0xf6, 0x72, 0x56, - 0xd1, 0x20, 0x9b, 0xcc, 0x4c, 0x8e, 0xe5, 0x86, 0x5f, 0x77, 0x9a, 0xc9, 0xa3, 0xef, 0x88, 0x4b, - 0xe9, 0x78, 0xe6, 0xb1, 0x0e, 0x63, 0xcb, 0x4e, 0xdb, 0xd9, 0x74, 0x9b, 0x6e, 0xe4, 0x92, 0x10, - 0x3d, 0x09, 0x45, 0xa7, 0xd1, 0x60, 0xdc, 0x56, 0x69, 0xe9, 0xf4, 0xfd, 0x83, 0xf9, 0xe2, 0x62, - 0x83, 0x5e, 0xfb, 0xa0, 0xb0, 0xf6, 0x31, 0xc5, 0x40, 0x1f, 0x84, 0x81, 0x46, 0xe0, 0xb7, 0x67, - 0x0b, 0x0c, 0x93, 0xee, 0xba, 0x81, 0x72, 0xe0, 0xb7, 0x13, 0xa8, 0x0c, 0xc7, 0xfe, 0xd5, 0x02, - 0x3c, 0xb6, 0x4c, 0xda, 0x3b, 0xab, 0xb5, 0x9c, 0xf3, 0xfb, 0x12, 0x8c, 0xb4, 0x7c, 0xcf, 0x8d, - 0xfc, 0x20, 0x14, 0x4d, 0xb3, 0x15, 0xb1, 0x26, 0xca, 0xb0, 0x82, 0xa2, 0x0b, 0x30, 0xd0, 0x8e, - 0x99, 0xca, 0x31, 0xc9, 0x90, 0x32, 0x76, 0x92, 0x41, 0x28, 0x46, 0x27, 0x24, 0x81, 0x58, 0x31, - 0x0a, 0xe3, 0x56, 0x48, 0x02, 0xcc, 0x20, 0xf1, 0xcd, 0x4c, 0xef, 0x6c, 0x71, 0x42, 0x27, 0x6e, - 0x66, 0x0a, 0xc1, 0x1a, 0x16, 0xaa, 0x42, 0x29, 0x4c, 0xcc, 0x6c, 0x5f, 0xdb, 0x74, 0x9c, 0x5d, - 0xdd, 0x6a, 0x26, 0x63, 0x22, 0xc6, 0x8d, 0x32, 0xd4, 0xf3, 0xea, 0xfe, 0x4a, 0x01, 0x10, 0x1f, - 0xc2, 0x6f, 0xb0, 0x81, 0xbb, 0x95, 0x1e, 0xb8, 0xfe, 0xb7, 0xc4, 0x71, 0x8d, 0xde, 0x9f, 0x59, - 0xf0, 0xd8, 0xb2, 0xeb, 0x35, 0x48, 0x90, 0xb3, 0x00, 0x1f, 0xce, 0x5b, 0xf6, 0x68, 0x4c, 0x83, - 0xb1, 0xc4, 0x06, 0x8e, 0x61, 0x89, 0xd9, 0x7f, 0x6c, 0x01, 0xe2, 0x9f, 0xfd, 0xae, 0xfb, 0xd8, - 0x5b, 0xe9, 0x8f, 0x3d, 0x86, 0x65, 0x61, 0xdf, 0x80, 0x89, 0xe5, 0xa6, 0x4b, 0xbc, 0xa8, 0x52, - 0x5d, 0xf6, 0xbd, 0x2d, 0x77, 0x1b, 0xbd, 0x0c, 0x13, 0x91, 0xdb, 0x22, 0x7e, 0x27, 0xaa, 0x91, - 0xba, 0xef, 0xb1, 0x97, 0xa4, 0x75, 0x69, 0x70, 0x09, 0xdd, 0x3f, 0x98, 0x9f, 0xd8, 0x30, 0x20, - 0x38, 0x81, 0x69, 0xff, 0x2e, 0x1d, 0x3f, 0xbf, 0xd5, 0xf6, 0x3d, 0xe2, 0x45, 0xcb, 0xbe, 0xd7, - 0xe0, 0x12, 0x87, 0x97, 0x61, 0x20, 0xa2, 0xe3, 0xc1, 0xc7, 0xee, 0xa2, 0xdc, 0x28, 0x74, 0x14, - 0x0e, 0x0f, 0xe6, 0xcf, 0xa4, 0x6b, 0xb0, 0x71, 0x62, 0x75, 0xd0, 0xb7, 0xc0, 0x50, 0x18, 0x39, - 0x51, 0x27, 0x14, 0xa3, 0xf9, 0xb8, 0x1c, 0xcd, 0x1a, 0x2b, 0x3d, 0x3c, 0x98, 0x9f, 0x54, 0xd5, - 0x78, 0x11, 0x16, 0x15, 0xd0, 0x53, 0x30, 0xdc, 0x22, 0x61, 0xe8, 0x6c, 0xcb, 0xdb, 0x70, 0x52, - 0xd4, 0x1d, 0x5e, 0xe3, 0xc5, 0x58, 0xc2, 0xd1, 0x13, 0x30, 0x48, 0x82, 0xc0, 0x0f, 0xc4, 0x1e, - 0x1d, 0x17, 0x88, 0x83, 0x2b, 0xb4, 0x10, 0x73, 0x98, 0xfd, 0x1f, 0x2c, 0x98, 0x54, 0x7d, 0xe5, - 0x6d, 0x9d, 0xc0, 0xab, 0xe0, 0x53, 0x00, 0x75, 0xf9, 0x81, 0x21, 0xbb, 0x3d, 0x46, 0x9f, 0xbb, - 0x98, 0x79, 0x51, 0xa7, 0x86, 0x31, 0xa6, 0xac, 0x8a, 0x42, 0xac, 0x51, 0xb3, 0xff, 0x99, 0x05, - 0x33, 0x89, 0x2f, 0xba, 0xe1, 0x86, 0x11, 0x7a, 0x23, 0xf5, 0x55, 0x0b, 0xfd, 0x7d, 0x15, 0xad, - 0xcd, 0xbe, 0x49, 0x2d, 0x65, 0x59, 0xa2, 0x7d, 0xd1, 0x35, 0x18, 0x74, 0x23, 0xd2, 0x92, 0x1f, - 0xf3, 0x44, 0xd7, 0x8f, 0xe1, 0xbd, 0x8a, 0x67, 0xa4, 0x42, 0x6b, 0x62, 0x4e, 0xc0, 0xfe, 0xd5, - 0x22, 0x94, 0xf8, 0xb2, 0x5d, 0x73, 0xda, 0x27, 0x30, 0x17, 0x4f, 0x43, 0xc9, 0x6d, 0xb5, 0x3a, - 0x91, 0xb3, 0x29, 0x8e, 0xf3, 0x11, 0xbe, 0xb5, 0x2a, 0xb2, 0x10, 0xc7, 0x70, 0x54, 0x81, 0x01, - 0xd6, 0x15, 0xfe, 0x95, 0x4f, 0x66, 0x7f, 0xa5, 0xe8, 0xfb, 0x42, 0xd9, 0x89, 0x1c, 0xce, 0x49, - 0xa9, 0x7b, 0x84, 0x16, 0x61, 0x46, 0x02, 0x39, 0x00, 0x9b, 0xae, 0xe7, 0x04, 0xfb, 0xb4, 0x6c, - 0xb6, 0xc8, 0x08, 0x3e, 0xdb, 0x9d, 0xe0, 0x92, 0xc2, 0xe7, 0x64, 0xd5, 0x87, 0xc5, 0x00, 0xac, - 0x11, 0x9d, 0xfb, 0x08, 0x94, 0x14, 0xf2, 0x51, 0x18, 0xa2, 0xb9, 0x8f, 0xc1, 0x64, 0xa2, 0xad, - 0x5e, 0xd5, 0xc7, 0x74, 0x7e, 0xea, 0x97, 0xd8, 0x91, 0x21, 0x7a, 0xbd, 0xe2, 0xed, 0x89, 0x23, - 0xf7, 0x6d, 0x38, 0xd5, 0xcc, 0x38, 0xc9, 0xc4, 0xbc, 0xf6, 0x7f, 0xf2, 0x3d, 0x26, 0x3e, 0xfb, - 0x54, 0x16, 0x14, 0x67, 0xb6, 0x41, 0x79, 0x04, 0xbf, 0x4d, 0x37, 0x88, 0xd3, 0xd4, 0xd9, 0xed, - 0x9b, 0xa2, 0x0c, 0x2b, 0x28, 0x3d, 0xef, 0x4e, 0xa9, 0xce, 0x5f, 0x27, 0xfb, 0x35, 0xd2, 0x24, - 0xf5, 0xc8, 0x0f, 0xbe, 0xae, 0xdd, 0x3f, 0xc7, 0x47, 0x9f, 0x1f, 0x97, 0xa3, 0x82, 0x40, 0xf1, - 0x3a, 0xd9, 0xe7, 0x53, 0xa1, 0x7f, 0x5d, 0xb1, 0xeb, 0xd7, 0xfd, 0x8c, 0x05, 0xe3, 0xea, 0xeb, - 0x4e, 0xe0, 0x5c, 0x58, 0x32, 0xcf, 0x85, 0x73, 0x5d, 0x17, 0x78, 0xce, 0x89, 0xf0, 0x95, 0x02, - 0x9c, 0x55, 0x38, 0xf4, 0x6d, 0xc0, 0xff, 0x88, 0x55, 0x75, 0x19, 0x4a, 0x9e, 0x92, 0x5a, 0x59, - 0xa6, 0xb8, 0x28, 0x96, 0x59, 0xc5, 0x38, 0x94, 0xc5, 0xf3, 0x62, 0xd1, 0xd2, 0x98, 0x2e, 0xce, - 0x15, 0xa2, 0xdb, 0x25, 0x28, 0x76, 0xdc, 0x86, 0xb8, 0x60, 0x3e, 0x24, 0x47, 0xfb, 0x56, 0xa5, - 0x7c, 0x78, 0x30, 0xff, 0x78, 0x9e, 0x2a, 0x81, 0xde, 0x6c, 0xe1, 0xc2, 0xad, 0x4a, 0x19, 0xd3, - 0xca, 0x68, 0x11, 0x26, 0xa5, 0xb6, 0xe4, 0x36, 0x65, 0xb7, 0x7c, 0x4f, 0xdc, 0x43, 0x4a, 0x26, - 0x8b, 0x4d, 0x30, 0x4e, 0xe2, 0xa3, 0x32, 0x4c, 0xed, 0x76, 0x36, 0x49, 0x93, 0x44, 0xfc, 0x83, - 0xaf, 0x13, 0x2e, 0xb1, 0x2c, 0xc5, 0x2f, 0xb3, 0xeb, 0x09, 0x38, 0x4e, 0xd5, 0xb0, 0xff, 0x82, - 0xdd, 0x07, 0x62, 0xf4, 0xaa, 0x81, 0x4f, 0x17, 0x16, 0xa5, 0xfe, 0xf5, 0x5c, 0xce, 0xfd, 0xac, - 0x8a, 0xeb, 0x64, 0x7f, 0xc3, 0xa7, 0x9c, 0x79, 0xf6, 0xaa, 0x30, 0xd6, 0xfc, 0x40, 0xd7, 0x35, - 0xff, 0x73, 0x05, 0x38, 0xad, 0x46, 0xc0, 0x60, 0x02, 0xbf, 0xd1, 0xc7, 0xe0, 0x0a, 0x8c, 0x36, - 0xc8, 0x96, 0xd3, 0x69, 0x46, 0x4a, 0x7c, 0x3e, 0xc8, 0x55, 0x28, 0xe5, 0xb8, 0x18, 0xeb, 0x38, - 0x47, 0x18, 0xb6, 0xff, 0x3d, 0xca, 0x2e, 0xe2, 0xc8, 0xa1, 0x6b, 0x5c, 0xed, 0x1a, 0x2b, 0x77, - 0xd7, 0x3c, 0x01, 0x83, 0x6e, 0x8b, 0x32, 0x66, 0x05, 0x93, 0xdf, 0xaa, 0xd0, 0x42, 0xcc, 0x61, - 0xe8, 0x03, 0x30, 0x5c, 0xf7, 0x5b, 0x2d, 0xc7, 0x6b, 0xb0, 0x2b, 0xaf, 0xb4, 0x34, 0x4a, 0x79, - 0xb7, 0x65, 0x5e, 0x84, 0x25, 0x0c, 0x3d, 0x06, 0x03, 0x4e, 0xb0, 0xcd, 0x65, 0x18, 0xa5, 0xa5, - 0x11, 0xda, 0xd2, 0x62, 0xb0, 0x1d, 0x62, 0x56, 0x4a, 0x9f, 0x60, 0x77, 0xfd, 0x60, 0xd7, 0xf5, - 0xb6, 0xcb, 0x6e, 0x20, 0xb6, 0x84, 0xba, 0x0b, 0xef, 0x28, 0x08, 0xd6, 0xb0, 0xd0, 0x2a, 0x0c, - 0xb6, 0xfd, 0x20, 0x0a, 0x67, 0x87, 0xd8, 0x70, 0x3f, 0x9e, 0x73, 0x10, 0xf1, 0xaf, 0xad, 0xfa, - 0x41, 0x14, 0x7f, 0x00, 0xfd, 0x17, 0x62, 0x5e, 0x1d, 0xdd, 0x80, 0x61, 0xe2, 0xed, 0xad, 0x06, - 0x7e, 0x6b, 0x76, 0x26, 0x9f, 0xd2, 0x0a, 0x47, 0xe1, 0xcb, 0x2c, 0xe6, 0x51, 0x45, 0x31, 0x96, - 0x24, 0xd0, 0xb7, 0x40, 0x91, 0x78, 0x7b, 0xb3, 0xc3, 0x8c, 0xd2, 0x5c, 0x0e, 0xa5, 0xdb, 0x4e, - 0x10, 0x9f, 0xf9, 0x2b, 0xde, 0x1e, 0xa6, 0x75, 0xd0, 0x27, 0xa1, 0x24, 0x0f, 0x8c, 0x50, 0x08, - 0xeb, 0x32, 0x17, 0xac, 0x3c, 0x66, 0x30, 0x79, 0xab, 0xe3, 0x06, 0xa4, 0x45, 0xbc, 0x28, 0x8c, - 0x4f, 0x48, 0x09, 0x0d, 0x71, 0x4c, 0x0d, 0x7d, 0x52, 0x4a, 0x88, 0xd7, 0xfc, 0x8e, 0x17, 0x85, - 0xb3, 0x25, 0xd6, 0xbd, 0x4c, 0xdd, 0xdd, 0xed, 0x18, 0x2f, 0x29, 0x42, 0xe6, 0x95, 0xb1, 0x41, - 0x0a, 0x7d, 0x1a, 0xc6, 0xf9, 0x7f, 0xae, 0x01, 0x0b, 0x67, 0x4f, 0x33, 0xda, 0x17, 0xf2, 0x69, - 0x73, 0xc4, 0xa5, 0xd3, 0x82, 0xf8, 0xb8, 0x5e, 0x1a, 0x62, 0x93, 0x1a, 0xc2, 0x30, 0xde, 0x74, - 0xf7, 0x88, 0x47, 0xc2, 0xb0, 0x1a, 0xf8, 0x9b, 0x64, 0x16, 0xd8, 0xc0, 0x9c, 0xcd, 0xd6, 0x98, - 0xf9, 0x9b, 0x64, 0x69, 0x9a, 0xd2, 0xbc, 0xa1, 0xd7, 0xc1, 0x26, 0x09, 0x74, 0x0b, 0x26, 0xe8, - 0x8b, 0xcd, 0x8d, 0x89, 0x8e, 0xf6, 0x22, 0xca, 0xde, 0x55, 0xd8, 0xa8, 0x84, 0x13, 0x44, 0xd0, - 0x4d, 0x18, 0x0b, 0x23, 0x27, 0x88, 0x3a, 0x6d, 0x4e, 0xf4, 0x4c, 0x2f, 0xa2, 0x4c, 0xe1, 0x5a, - 0xd3, 0xaa, 0x60, 0x83, 0x00, 0x7a, 0x0d, 0x4a, 0x4d, 0x77, 0x8b, 0xd4, 0xf7, 0xeb, 0x4d, 0x32, - 0x3b, 0xc6, 0xa8, 0x65, 0x1e, 0x2a, 0x37, 0x24, 0x12, 0xe7, 0x73, 0xd5, 0x5f, 0x1c, 0x57, 0x47, - 0xb7, 0xe1, 0x4c, 0x44, 0x82, 0x96, 0xeb, 0x39, 0xf4, 0x30, 0x10, 0x4f, 0x2b, 0xa6, 0xc8, 0x1c, - 0x67, 0xbb, 0xed, 0xbc, 0x98, 0x8d, 0x33, 0x1b, 0x99, 0x58, 0x38, 0xa7, 0x36, 0xba, 0x07, 0xb3, - 0x19, 0x10, 0xbf, 0xe9, 0xd6, 0xf7, 0x67, 0x4f, 0x31, 0xca, 0x1f, 0x15, 0x94, 0x67, 0x37, 0x72, - 0xf0, 0x0e, 0xbb, 0xc0, 0x70, 0x2e, 0x75, 0x74, 0x13, 0x26, 0xd9, 0x09, 0x54, 0xed, 0x34, 0x9b, - 0xa2, 0xc1, 0x09, 0xd6, 0xe0, 0x07, 0xe4, 0x7d, 0x5c, 0x31, 0xc1, 0x87, 0x07, 0xf3, 0x10, 0xff, - 0xc3, 0xc9, 0xda, 0x68, 0x93, 0xe9, 0xcc, 0x3a, 0x81, 0x1b, 0xed, 0xd3, 0x73, 0x83, 0xdc, 0x8b, - 0x66, 0x27, 0xbb, 0xca, 0x2b, 0x74, 0x54, 0xa5, 0x58, 0xd3, 0x0b, 0x71, 0x92, 0x20, 0x3d, 0x52, - 0xc3, 0xa8, 0xe1, 0x7a, 0xb3, 0x53, 0xfc, 0x5d, 0x22, 0x4f, 0xa4, 0x1a, 0x2d, 0xc4, 0x1c, 0xc6, - 0xf4, 0x65, 0xf4, 0xc7, 0x4d, 0x7a, 0x73, 0x4d, 0x33, 0xc4, 0x58, 0x5f, 0x26, 0x01, 0x38, 0xc6, - 0xa1, 0xcc, 0x64, 0x14, 0xed, 0xcf, 0x22, 0x86, 0xaa, 0x0e, 0x96, 0x8d, 0x8d, 0x4f, 0x62, 0x5a, - 0x6e, 0x6f, 0xc2, 0x84, 0x3a, 0x08, 0xd9, 0x98, 0xa0, 0x79, 0x18, 0x64, 0xec, 0x93, 0x90, 0xae, - 0x95, 0x68, 0x17, 0x18, 0x6b, 0x85, 0x79, 0x39, 0xeb, 0x82, 0xfb, 0x36, 0x59, 0xda, 0x8f, 0x08, - 0x7f, 0xd3, 0x17, 0xb5, 0x2e, 0x48, 0x00, 0x8e, 0x71, 0xec, 0xff, 0xc7, 0xd9, 0xd0, 0xf8, 0xb4, - 0xed, 0xe3, 0x7e, 0x79, 0x06, 0x46, 0x76, 0xfc, 0x30, 0xa2, 0xd8, 0xac, 0x8d, 0xc1, 0x98, 0xf1, - 0xbc, 0x26, 0xca, 0xb1, 0xc2, 0x40, 0xaf, 0xc0, 0x78, 0x5d, 0x6f, 0x40, 0x5c, 0x8e, 0xea, 0x18, - 0x31, 0x5a, 0xc7, 0x26, 0x2e, 0x7a, 0x09, 0x46, 0x98, 0x0d, 0x48, 0xdd, 0x6f, 0x0a, 0xae, 0x4d, - 0xde, 0xf0, 0x23, 0x55, 0x51, 0x7e, 0xa8, 0xfd, 0xc6, 0x0a, 0x1b, 0x5d, 0x84, 0x21, 0xda, 0x85, - 0x4a, 0x55, 0x5c, 0x4b, 0x4a, 0x50, 0x74, 0x8d, 0x95, 0x62, 0x01, 0xb5, 0xff, 0x5a, 0x41, 0x1b, - 0x65, 0xfa, 0x1e, 0x26, 0xa8, 0x0a, 0xc3, 0x77, 0x1d, 0x37, 0x72, 0xbd, 0x6d, 0xc1, 0x7f, 0x3c, - 0xd5, 0xf5, 0x8e, 0x62, 0x95, 0xee, 0xf0, 0x0a, 0xfc, 0x16, 0x15, 0x7f, 0xb0, 0x24, 0x43, 0x29, - 0x06, 0x1d, 0xcf, 0xa3, 0x14, 0x0b, 0xfd, 0x52, 0xc4, 0xbc, 0x02, 0xa7, 0x28, 0xfe, 0x60, 0x49, - 0x06, 0xbd, 0x01, 0x20, 0x77, 0x18, 0x69, 0x08, 0xdb, 0x8b, 0x67, 0x7a, 0x13, 0xdd, 0x50, 0x75, - 0x96, 0x26, 0xe8, 0x1d, 0x1d, 0xff, 0xc7, 0x1a, 0x3d, 0x3b, 0x62, 0x7c, 0x5a, 0xba, 0x33, 0xe8, - 0xdb, 0xe8, 0x12, 0x77, 0x82, 0x88, 0x34, 0x16, 0x23, 0x31, 0x38, 0x1f, 0xec, 0xef, 0x91, 0xb2, - 0xe1, 0xb6, 0x88, 0xbe, 0x1d, 0x04, 0x11, 0x1c, 0xd3, 0xb3, 0x7f, 0xa1, 0x08, 0xb3, 0x79, 0xdd, - 0xa5, 0x8b, 0x8e, 0xdc, 0x73, 0xa3, 0x65, 0xca, 0x5e, 0x59, 0xe6, 0xa2, 0x5b, 0x11, 0xe5, 0x58, - 0x61, 0xd0, 0xd9, 0x0f, 0xdd, 0x6d, 0xf9, 0xc6, 0x1c, 0x8c, 0x67, 0xbf, 0xc6, 0x4a, 0xb1, 0x80, - 0x52, 0xbc, 0x80, 0x38, 0xa1, 0x30, 0xee, 0xd1, 0x56, 0x09, 0x66, 0xa5, 0x58, 0x40, 0x75, 0x69, - 0xd7, 0x40, 0x0f, 0x69, 0x97, 0x31, 0x44, 0x83, 0xc7, 0x3b, 0x44, 0xe8, 0x33, 0x00, 0x5b, 0xae, - 0xe7, 0x86, 0x3b, 0x8c, 0xfa, 0xd0, 0x91, 0xa9, 0x2b, 0xe6, 0x6c, 0x55, 0x51, 0xc1, 0x1a, 0x45, - 0xf4, 0x22, 0x8c, 0xaa, 0x0d, 0x58, 0x29, 0x33, 0x4d, 0xa7, 0x66, 0x39, 0x12, 0x9f, 0x46, 0x65, - 0xac, 0xe3, 0xd9, 0x6f, 0x26, 0xd7, 0x8b, 0xd8, 0x01, 0xda, 0xf8, 0x5a, 0xfd, 0x8e, 0x6f, 0xa1, - 0xfb, 0xf8, 0xda, 0x5f, 0x2b, 0xc2, 0xa4, 0xd1, 0x58, 0x27, 0xec, 0xe3, 0xcc, 0xba, 0x4a, 0x0f, - 0x70, 0x27, 0x22, 0x62, 0xff, 0xd9, 0xbd, 0xb7, 0x8a, 0x7e, 0xc8, 0xd3, 0x1d, 0xc0, 0xeb, 0xa3, - 0xcf, 0x40, 0xa9, 0xe9, 0x84, 0x4c, 0x72, 0x46, 0xc4, 0xbe, 0xeb, 0x87, 0x58, 0xfc, 0x30, 0x71, - 0xc2, 0x48, 0xbb, 0x35, 0x39, 0xed, 0x98, 0x24, 0xbd, 0x69, 0x28, 0x7f, 0x22, 0xad, 0xc7, 0x54, - 0x27, 0x28, 0x13, 0xb3, 0x8f, 0x39, 0x0c, 0xbd, 0x04, 0x63, 0x01, 0x61, 0xab, 0x62, 0x99, 0x72, - 0x73, 0x6c, 0x99, 0x0d, 0xc6, 0x6c, 0x1f, 0xd6, 0x60, 0xd8, 0xc0, 0x8c, 0xdf, 0x06, 0x43, 0x5d, - 0xde, 0x06, 0x4f, 0xc1, 0x30, 0xfb, 0xa1, 0x56, 0x80, 0x9a, 0x8d, 0x0a, 0x2f, 0xc6, 0x12, 0x9e, - 0x5c, 0x30, 0x23, 0xfd, 0x2d, 0x18, 0xfa, 0xfa, 0x10, 0x8b, 0x9a, 0x69, 0x99, 0x47, 0xf8, 0x29, - 0x27, 0x96, 0x3c, 0x96, 0x30, 0xfb, 0x83, 0x30, 0x51, 0x76, 0x48, 0xcb, 0xf7, 0x56, 0xbc, 0x46, - 0xdb, 0x77, 0xbd, 0x08, 0xcd, 0xc2, 0x00, 0xbb, 0x44, 0xf8, 0x11, 0x30, 0x40, 0x1b, 0xc2, 0x03, - 0xf4, 0x41, 0x60, 0x6f, 0xc3, 0xe9, 0xb2, 0x7f, 0xd7, 0xbb, 0xeb, 0x04, 0x8d, 0xc5, 0x6a, 0x45, - 0x7b, 0x5f, 0xaf, 0xcb, 0xf7, 0x1d, 0x37, 0xda, 0xca, 0x3c, 0x7a, 0xb5, 0x9a, 0x9c, 0xad, 0x5d, - 0x75, 0x9b, 0x24, 0x47, 0x0a, 0xf2, 0x37, 0x0a, 0x46, 0x4b, 0x31, 0xbe, 0xd2, 0x6a, 0x59, 0xb9, - 0x5a, 0xad, 0xd7, 0x61, 0x64, 0xcb, 0x25, 0xcd, 0x06, 0x26, 0x5b, 0x62, 0x25, 0x3e, 0x99, 0x6f, - 0x87, 0xb2, 0x4a, 0x31, 0xa5, 0xd4, 0x8b, 0xbf, 0x0e, 0x57, 0x45, 0x65, 0xac, 0xc8, 0xa0, 0x5d, - 0x98, 0x92, 0x0f, 0x06, 0x09, 0x15, 0xeb, 0xf2, 0xa9, 0x6e, 0xaf, 0x10, 0x93, 0xf8, 0xa9, 0xfb, - 0x07, 0xf3, 0x53, 0x38, 0x41, 0x06, 0xa7, 0x08, 0xd3, 0xe7, 0x60, 0x8b, 0x9e, 0xc0, 0x03, 0x6c, - 0xf8, 0xd9, 0x73, 0x90, 0xbd, 0x6c, 0x59, 0xa9, 0xfd, 0x63, 0x16, 0x3c, 0x92, 0x1a, 0x19, 0xf1, - 0xc2, 0x3f, 0xe6, 0x59, 0x48, 0xbe, 0xb8, 0x0b, 0xbd, 0x5f, 0xdc, 0xf6, 0xdf, 0xb7, 0xe0, 0xd4, - 0x4a, 0xab, 0x1d, 0xed, 0x97, 0x5d, 0x53, 0x05, 0xf5, 0x11, 0x18, 0x6a, 0x91, 0x86, 0xdb, 0x69, - 0x89, 0x99, 0x9b, 0x97, 0xa7, 0xd4, 0x1a, 0x2b, 0x3d, 0x3c, 0x98, 0x1f, 0xaf, 0x45, 0x7e, 0xe0, - 0x6c, 0x13, 0x5e, 0x80, 0x05, 0x3a, 0x3b, 0xeb, 0xdd, 0xb7, 0xc9, 0x0d, 0xb7, 0xe5, 0x4a, 0xbb, - 0xa2, 0xae, 0x32, 0xbb, 0x05, 0x39, 0xa0, 0x0b, 0xaf, 0x77, 0x1c, 0x2f, 0x72, 0xa3, 0x7d, 0xa1, - 0x3d, 0x92, 0x44, 0x70, 0x4c, 0xcf, 0xfe, 0xaa, 0x05, 0x93, 0x72, 0xdd, 0x2f, 0x36, 0x1a, 0x01, - 0x09, 0x43, 0x34, 0x07, 0x05, 0xb7, 0x2d, 0x7a, 0x09, 0xa2, 0x97, 0x85, 0x4a, 0x15, 0x17, 0xdc, - 0xb6, 0x64, 0xcb, 0xd8, 0x41, 0x58, 0x34, 0x15, 0x69, 0xd7, 0x44, 0x39, 0x56, 0x18, 0xe8, 0x12, - 0x8c, 0x78, 0x7e, 0x83, 0xdb, 0x76, 0xf1, 0x2b, 0x8d, 0x2d, 0xb0, 0x75, 0x51, 0x86, 0x15, 0x14, - 0x55, 0xa1, 0xc4, 0xcd, 0x9e, 0xe2, 0x45, 0xdb, 0x97, 0xf1, 0x14, 0xfb, 0xb2, 0x0d, 0x59, 0x13, - 0xc7, 0x44, 0xec, 0x5f, 0xb1, 0x60, 0x4c, 0x7e, 0x59, 0x9f, 0x3c, 0x27, 0xdd, 0x5a, 0x31, 0xbf, - 0x19, 0x6f, 0x2d, 0xca, 0x33, 0x32, 0x88, 0xc1, 0x2a, 0x16, 0x8f, 0xc4, 0x2a, 0x5e, 0x81, 0x51, - 0xa7, 0xdd, 0xae, 0x9a, 0x7c, 0x26, 0x5b, 0x4a, 0x8b, 0x71, 0x31, 0xd6, 0x71, 0xec, 0x1f, 0x2d, - 0xc0, 0x84, 0xfc, 0x82, 0x5a, 0x67, 0x33, 0x24, 0x11, 0xda, 0x80, 0x92, 0xc3, 0x67, 0x89, 0xc8, - 0x45, 0xfe, 0x44, 0xb6, 0x1c, 0xc1, 0x98, 0xd2, 0xf8, 0xc2, 0x5f, 0x94, 0xb5, 0x71, 0x4c, 0x08, - 0x35, 0x61, 0xda, 0xf3, 0x23, 0x76, 0xf8, 0x2b, 0x78, 0x37, 0xd5, 0x4e, 0x92, 0xfa, 0x59, 0x41, - 0x7d, 0x7a, 0x3d, 0x49, 0x05, 0xa7, 0x09, 0xa3, 0x15, 0x29, 0x9b, 0x29, 0xe6, 0x0b, 0x03, 0xf4, - 0x89, 0xcb, 0x16, 0xcd, 0xd8, 0xbf, 0x6c, 0x41, 0x49, 0xa2, 0x9d, 0x84, 0x16, 0x6f, 0x0d, 0x86, - 0x43, 0x36, 0x09, 0x72, 0x68, 0xec, 0x6e, 0x1d, 0xe7, 0xf3, 0x15, 0xdf, 0x69, 0xfc, 0x7f, 0x88, - 0x25, 0x0d, 0x26, 0x9a, 0x57, 0xdd, 0x7f, 0x97, 0x88, 0xe6, 0x55, 0x7f, 0x72, 0x2e, 0xa5, 0x3f, - 0x64, 0x7d, 0xd6, 0x64, 0x5d, 0x94, 0xf5, 0x6a, 0x07, 0x64, 0xcb, 0xbd, 0x97, 0x64, 0xbd, 0xaa, - 0xac, 0x14, 0x0b, 0x28, 0x7a, 0x03, 0xc6, 0xea, 0x52, 0x26, 0x1b, 0xef, 0xf0, 0x8b, 0x5d, 0xf5, - 0x03, 0x4a, 0x95, 0xc4, 0x65, 0x21, 0xcb, 0x5a, 0x7d, 0x6c, 0x50, 0x33, 0xcd, 0x08, 0x8a, 0xbd, - 0xcc, 0x08, 0x62, 0xba, 0xf9, 0x4a, 0xf5, 0x1f, 0xb7, 0x60, 0x88, 0xcb, 0xe2, 0xfa, 0x13, 0x85, - 0x6a, 0x9a, 0xb5, 0x78, 0xec, 0x6e, 0xd3, 0x42, 0xa1, 0x29, 0x43, 0x6b, 0x50, 0x62, 0x3f, 0x98, - 0x2c, 0xb1, 0x98, 0x6f, 0x75, 0xcf, 0x5b, 0xd5, 0x3b, 0x78, 0x5b, 0x56, 0xc3, 0x31, 0x05, 0xfb, - 0x87, 0x8b, 0xf4, 0x74, 0x8b, 0x51, 0x8d, 0x4b, 0xdf, 0x7a, 0x78, 0x97, 0x7e, 0xe1, 0x61, 0x5d, - 0xfa, 0xdb, 0x30, 0x59, 0xd7, 0xf4, 0x70, 0xf1, 0x4c, 0x5e, 0xea, 0xba, 0x48, 0x34, 0x95, 0x1d, - 0x97, 0xb2, 0x2c, 0x9b, 0x44, 0x70, 0x92, 0x2a, 0xfa, 0x36, 0x18, 0xe3, 0xf3, 0x2c, 0x5a, 0xe1, - 0x96, 0x18, 0x1f, 0xc8, 0x5f, 0x2f, 0x7a, 0x13, 0x5c, 0x2a, 0xa7, 0x55, 0xc7, 0x06, 0x31, 0xfb, - 0x4f, 0x2c, 0x40, 0x2b, 0xed, 0x1d, 0xd2, 0x22, 0x81, 0xd3, 0x8c, 0xc5, 0xe9, 0xdf, 0x6f, 0xc1, - 0x2c, 0x49, 0x15, 0x2f, 0xfb, 0xad, 0x96, 0x78, 0xb4, 0xe4, 0xbc, 0xab, 0x57, 0x72, 0xea, 0x28, - 0xb7, 0x84, 0xd9, 0x3c, 0x0c, 0x9c, 0xdb, 0x1e, 0x5a, 0x83, 0x19, 0x7e, 0x4b, 0x2a, 0x80, 0x66, - 0x7b, 0xfd, 0xa8, 0x20, 0x3c, 0xb3, 0x91, 0x46, 0xc1, 0x59, 0xf5, 0xec, 0xef, 0x1a, 0x83, 0xdc, - 0x5e, 0xbc, 0xa7, 0x47, 0x78, 0x4f, 0x8f, 0xf0, 0x9e, 0x1e, 0xe1, 0x3d, 0x3d, 0xc2, 0x7b, 0x7a, - 0x84, 0x6f, 0x7a, 0x3d, 0xc2, 0x1f, 0x59, 0x30, 0x93, 0xbe, 0x06, 0x4e, 0x82, 0x31, 0xef, 0xc0, - 0x4c, 0xfa, 0xae, 0xeb, 0x6a, 0x67, 0x97, 0xee, 0x67, 0x7c, 0xef, 0x65, 0x7c, 0x03, 0xce, 0xa2, - 0x6f, 0xff, 0x9a, 0x05, 0xa7, 0x15, 0xb2, 0xf1, 0xd2, 0xff, 0x1c, 0xcc, 0xf0, 0xf3, 0x65, 0xb9, - 0xe9, 0xb8, 0xad, 0x0d, 0xd2, 0x6a, 0x37, 0x9d, 0x48, 0x9a, 0x19, 0x5c, 0xc9, 0xdc, 0xaa, 0x09, - 0x13, 0x5d, 0xa3, 0xe2, 0xd2, 0x23, 0xb4, 0x5f, 0x19, 0x00, 0x9c, 0xd5, 0x8c, 0x61, 0x94, 0x5a, - 0xe8, 0x69, 0x26, 0xfc, 0x0b, 0x23, 0x30, 0xb8, 0xb2, 0x47, 0xbc, 0xe8, 0x04, 0x26, 0xaa, 0x0e, - 0x13, 0xae, 0xb7, 0xe7, 0x37, 0xf7, 0x48, 0x83, 0xc3, 0x8f, 0xf2, 0xd0, 0x3f, 0x23, 0x48, 0x4f, - 0x54, 0x0c, 0x12, 0x38, 0x41, 0xf2, 0x61, 0x08, 0xdb, 0xaf, 0xc2, 0x10, 0xbf, 0xe3, 0x84, 0xa4, - 0x3d, 0xf3, 0x4a, 0x63, 0x83, 0x28, 0x6e, 0xee, 0x58, 0x11, 0xc0, 0xef, 0x50, 0x51, 0x1d, 0xbd, - 0x09, 0x13, 0x5b, 0x6e, 0x10, 0x46, 0x1b, 0x6e, 0x8b, 0x84, 0x91, 0xd3, 0x6a, 0x3f, 0x80, 0x70, - 0x5d, 0x8d, 0xc3, 0xaa, 0x41, 0x09, 0x27, 0x28, 0xa3, 0x6d, 0x18, 0x6f, 0x3a, 0x7a, 0x53, 0xc3, - 0x47, 0x6e, 0x4a, 0x5d, 0x9e, 0x37, 0x74, 0x42, 0xd8, 0xa4, 0x4b, 0x4f, 0x9b, 0x3a, 0x93, 0x0f, - 0x8f, 0x30, 0xa9, 0x89, 0x3a, 0x6d, 0xb8, 0x60, 0x98, 0xc3, 0x28, 0x1f, 0xc8, 0xec, 0x87, 0x4b, - 0x26, 0x1f, 0xa8, 0x59, 0x09, 0x7f, 0x16, 0x4a, 0x84, 0x0e, 0x21, 0x25, 0x2c, 0xee, 0xdf, 0xcb, - 0xfd, 0xf5, 0x75, 0xcd, 0xad, 0x07, 0xbe, 0xa9, 0xd6, 0x58, 0x91, 0x94, 0x70, 0x4c, 0x14, 0x2d, - 0xc3, 0x50, 0x48, 0x02, 0x97, 0x84, 0xe2, 0x26, 0xee, 0x32, 0x8d, 0x0c, 0x8d, 0xbb, 0xde, 0xf0, - 0xdf, 0x58, 0x54, 0xa5, 0xcb, 0xcb, 0x61, 0x12, 0x5f, 0x76, 0x57, 0x6a, 0xcb, 0x6b, 0x91, 0x95, - 0x62, 0x01, 0x45, 0xaf, 0xc1, 0x70, 0x40, 0x9a, 0x4c, 0x6f, 0x36, 0xde, 0xff, 0x22, 0xe7, 0x6a, - 0x38, 0x5e, 0x0f, 0x4b, 0x02, 0xe8, 0x3a, 0xa0, 0x80, 0x50, 0x3e, 0xd2, 0xf5, 0xb6, 0x95, 0x55, - 0xad, 0xb8, 0x87, 0xd4, 0xb9, 0x85, 0x63, 0x0c, 0xe9, 0x05, 0x85, 0x33, 0xaa, 0xa1, 0xab, 0x30, - 0xad, 0x4a, 0x2b, 0x5e, 0x18, 0x39, 0xf4, 0xfc, 0x9f, 0x64, 0xb4, 0x94, 0x18, 0x07, 0x27, 0x11, - 0x70, 0xba, 0x8e, 0xfd, 0x25, 0x0b, 0xf8, 0x38, 0x9f, 0x80, 0xf0, 0xe2, 0x55, 0x53, 0x78, 0x71, - 0x36, 0x77, 0xe6, 0x72, 0x04, 0x17, 0x5f, 0xb2, 0x60, 0x54, 0x9b, 0xd9, 0x78, 0xcd, 0x5a, 0x5d, - 0xd6, 0x6c, 0x07, 0xa6, 0xe8, 0x4a, 0xbf, 0xb9, 0x19, 0x92, 0x60, 0x8f, 0x34, 0xd8, 0xc2, 0x2c, - 0x3c, 0xd8, 0xc2, 0x54, 0x16, 0x7c, 0x37, 0x12, 0x04, 0x71, 0xaa, 0x09, 0xfb, 0xb3, 0xb2, 0xab, - 0xca, 0xe0, 0xb1, 0xae, 0xe6, 0x3c, 0x61, 0xf0, 0xa8, 0x66, 0x15, 0xc7, 0x38, 0x74, 0xab, 0xed, - 0xf8, 0x61, 0x94, 0x34, 0x78, 0xbc, 0xe6, 0x87, 0x11, 0x66, 0x10, 0xfb, 0x79, 0x80, 0x95, 0x7b, - 0xa4, 0xce, 0x57, 0xac, 0xfe, 0xb6, 0xb2, 0xf2, 0xdf, 0x56, 0xf6, 0x6f, 0x59, 0x30, 0xb1, 0xba, - 0x6c, 0xdc, 0x73, 0x0b, 0x00, 0xfc, 0x41, 0x78, 0xe7, 0xce, 0xba, 0xb4, 0x16, 0xe0, 0x0a, 0x5f, - 0x55, 0x8a, 0x35, 0x0c, 0x74, 0x16, 0x8a, 0xcd, 0x8e, 0x27, 0xa4, 0xab, 0xc3, 0x94, 0x7b, 0xb8, - 0xd1, 0xf1, 0x30, 0x2d, 0xd3, 0x3c, 0x2e, 0x8a, 0x7d, 0x7b, 0x5c, 0xf4, 0x8c, 0x7c, 0x80, 0xe6, - 0x61, 0xf0, 0xee, 0x5d, 0xb7, 0xc1, 0xfd, 0x4b, 0x85, 0x25, 0xc3, 0x9d, 0x3b, 0x95, 0x72, 0x88, - 0x79, 0xb9, 0xfd, 0xc5, 0x22, 0xcc, 0xad, 0x36, 0xc9, 0xbd, 0x77, 0xe8, 0x63, 0xdb, 0xaf, 0xbf, - 0xc8, 0xd1, 0xe4, 0x54, 0x47, 0xf5, 0x09, 0xea, 0x3d, 0x1e, 0x5b, 0x30, 0xcc, 0xed, 0xfd, 0xa4, - 0xc7, 0xed, 0x2b, 0x59, 0xad, 0xe7, 0x0f, 0xc8, 0x02, 0xb7, 0x1b, 0x14, 0x0e, 0x83, 0xea, 0xc2, - 0x14, 0xa5, 0x58, 0x12, 0x9f, 0x7b, 0x19, 0xc6, 0x74, 0xcc, 0x23, 0x79, 0xe7, 0xfd, 0x95, 0x22, - 0x4c, 0xd1, 0x1e, 0x3c, 0xd4, 0x89, 0xb8, 0x95, 0x9e, 0x88, 0xe3, 0xf6, 0xd0, 0xea, 0x3d, 0x1b, - 0x6f, 0x24, 0x67, 0xe3, 0x4a, 0xde, 0x6c, 0x9c, 0xf4, 0x1c, 0x7c, 0xa7, 0x05, 0x33, 0xab, 0x4d, - 0xbf, 0xbe, 0x9b, 0xf0, 0xa2, 0x7a, 0x11, 0x46, 0xe9, 0x71, 0x1c, 0x1a, 0x0e, 0xfe, 0x46, 0xc8, - 0x07, 0x01, 0xc2, 0x3a, 0x9e, 0x56, 0xed, 0xd6, 0xad, 0x4a, 0x39, 0x2b, 0x52, 0x84, 0x00, 0x61, - 0x1d, 0xcf, 0xfe, 0x0d, 0x0b, 0xce, 0x5d, 0x5d, 0x5e, 0x89, 0x97, 0x62, 0x2a, 0x58, 0xc5, 0x45, - 0x18, 0x6a, 0x37, 0xb4, 0xae, 0xc4, 0xd2, 0xe7, 0x32, 0xeb, 0x85, 0x80, 0xbe, 0x5b, 0x02, 0xb1, - 0xfc, 0xb4, 0x05, 0x33, 0x57, 0xdd, 0x88, 0xde, 0xae, 0xc9, 0xb0, 0x09, 0xf4, 0x7a, 0x0d, 0xdd, - 0xc8, 0x0f, 0xf6, 0x93, 0x61, 0x13, 0xb0, 0x82, 0x60, 0x0d, 0x8b, 0xb7, 0xbc, 0xe7, 0x32, 0x4b, - 0xf3, 0x82, 0xa9, 0x87, 0xc3, 0xa2, 0x1c, 0x2b, 0x0c, 0xfa, 0x61, 0x0d, 0x37, 0x60, 0x22, 0xcc, - 0x7d, 0x71, 0xc2, 0xaa, 0x0f, 0x2b, 0x4b, 0x00, 0x8e, 0x71, 0xe8, 0x6b, 0x6e, 0xfe, 0x6a, 0xb3, - 0x13, 0x46, 0x24, 0xd8, 0x0a, 0x73, 0x4e, 0xc7, 0xe7, 0xa1, 0x44, 0xa4, 0xc2, 0x40, 0xf4, 0x5a, - 0x71, 0x8c, 0x4a, 0x93, 0xc0, 0xa3, 0x37, 0x28, 0xbc, 0x3e, 0x7c, 0x32, 0x8f, 0xe6, 0x54, 0xb7, - 0x0a, 0x88, 0xe8, 0x6d, 0xe9, 0xe1, 0x2c, 0x98, 0x5f, 0xfc, 0x4a, 0x0a, 0x8a, 0x33, 0x6a, 0xd8, - 0x3f, 0x66, 0xc1, 0x69, 0xf5, 0xc1, 0xef, 0xba, 0xcf, 0xb4, 0x7f, 0xb6, 0x00, 0xe3, 0xd7, 0x36, - 0x36, 0xaa, 0x57, 0x49, 0x24, 0xae, 0xed, 0xde, 0x66, 0x00, 0x58, 0xd3, 0x66, 0x76, 0x7b, 0xcc, - 0x75, 0x22, 0xb7, 0xb9, 0xc0, 0xa3, 0x22, 0x2d, 0x54, 0xbc, 0xe8, 0x66, 0x50, 0x8b, 0x02, 0xd7, - 0xdb, 0xce, 0xd4, 0x7f, 0x4a, 0xe6, 0xa2, 0x98, 0xc7, 0x5c, 0xa0, 0xe7, 0x61, 0x88, 0x85, 0x65, - 0x92, 0x93, 0xf0, 0xa8, 0x7a, 0x0b, 0xb1, 0xd2, 0xc3, 0x83, 0xf9, 0xd2, 0x2d, 0x5c, 0xe1, 0x7f, - 0xb0, 0x40, 0x45, 0xb7, 0x60, 0x74, 0x27, 0x8a, 0xda, 0xd7, 0x88, 0xd3, 0xa0, 0x4f, 0x77, 0x7e, - 0x1c, 0x9e, 0xcf, 0x3a, 0x0e, 0xe9, 0x20, 0x70, 0xb4, 0xf8, 0x04, 0x89, 0xcb, 0x42, 0xac, 0xd3, - 0xb1, 0x6b, 0x00, 0x31, 0xec, 0x98, 0x14, 0x39, 0xf6, 0x1f, 0x58, 0x30, 0xcc, 0x23, 0x64, 0x04, - 0xe8, 0xa3, 0x30, 0x40, 0xee, 0x91, 0xba, 0xe0, 0x78, 0x33, 0x3b, 0x1c, 0x73, 0x5a, 0x5c, 0x20, - 0x4d, 0xff, 0x63, 0x56, 0x0b, 0x5d, 0x83, 0x61, 0xda, 0xdb, 0xab, 0x2a, 0x5c, 0xc8, 0xe3, 0x79, - 0x5f, 0xac, 0xa6, 0x9d, 0x33, 0x67, 0xa2, 0x08, 0xcb, 0xea, 0x4c, 0x7b, 0x5e, 0x6f, 0xd7, 0xe8, - 0x89, 0x1d, 0x75, 0x63, 0x2c, 0x36, 0x96, 0xab, 0x1c, 0x49, 0x50, 0xe3, 0xda, 0x73, 0x59, 0x88, - 0x63, 0x22, 0xf6, 0x06, 0x94, 0xe8, 0xa4, 0x2e, 0x36, 0x5d, 0xa7, 0xbb, 0x41, 0xc0, 0xd3, 0x50, - 0x92, 0xea, 0xfe, 0x50, 0x78, 0xc6, 0x33, 0xaa, 0xd2, 0x1a, 0x20, 0xc4, 0x31, 0xdc, 0xde, 0x82, - 0x53, 0xcc, 0x78, 0xd3, 0x89, 0x76, 0x8c, 0x3d, 0xd6, 0x7b, 0x31, 0x3f, 0x23, 0x1e, 0x90, 0x7c, - 0x66, 0x66, 0x35, 0xe7, 0xd3, 0x31, 0x49, 0x31, 0x7e, 0x4c, 0xda, 0x5f, 0x1b, 0x80, 0x47, 0x2b, - 0xb5, 0xfc, 0xe0, 0x29, 0x2f, 0xc1, 0x18, 0xe7, 0x4b, 0xe9, 0xd2, 0x76, 0x9a, 0xa2, 0x5d, 0x25, - 0x89, 0xde, 0xd0, 0x60, 0xd8, 0xc0, 0x44, 0xe7, 0xa0, 0xe8, 0xbe, 0xe5, 0x25, 0x5d, 0xb3, 0x2a, - 0xaf, 0xaf, 0x63, 0x5a, 0x4e, 0xc1, 0x94, 0xc5, 0xe5, 0x77, 0x87, 0x02, 0x2b, 0x36, 0xf7, 0x55, - 0x98, 0x70, 0xc3, 0x7a, 0xe8, 0x56, 0x3c, 0x7a, 0xce, 0x68, 0x27, 0x95, 0x12, 0x6e, 0xd0, 0x4e, - 0x2b, 0x28, 0x4e, 0x60, 0x6b, 0x17, 0xd9, 0x60, 0xdf, 0x6c, 0x72, 0x4f, 0x57, 0x71, 0xfa, 0x02, - 0x68, 0xb3, 0xaf, 0x0b, 0x99, 0x4a, 0x41, 0xbc, 0x00, 0xf8, 0x07, 0x87, 0x58, 0xc2, 0xe8, 0xcb, - 0xb1, 0xbe, 0xe3, 0xb4, 0x17, 0x3b, 0xd1, 0x4e, 0xd9, 0x0d, 0xeb, 0xfe, 0x1e, 0x09, 0xf6, 0xd9, - 0xa3, 0x7f, 0x24, 0x7e, 0x39, 0x2a, 0xc0, 0xf2, 0xb5, 0xc5, 0x2a, 0xc5, 0xc4, 0xe9, 0x3a, 0x68, - 0x11, 0x26, 0x65, 0x61, 0x8d, 0x84, 0xec, 0x0a, 0x1b, 0x65, 0x64, 0x94, 0xb3, 0x94, 0x28, 0x56, - 0x44, 0x92, 0xf8, 0x26, 0x27, 0x0d, 0xc7, 0xc1, 0x49, 0x7f, 0x04, 0xc6, 0x5d, 0xcf, 0x8d, 0x5c, - 0x27, 0xf2, 0xb9, 0x3e, 0x8c, 0xbf, 0xef, 0x99, 0xa0, 0xbf, 0xa2, 0x03, 0xb0, 0x89, 0x67, 0xff, - 0xb7, 0x01, 0x98, 0x66, 0xd3, 0xf6, 0xde, 0x0a, 0xfb, 0x66, 0x5a, 0x61, 0xb7, 0xd2, 0x2b, 0xec, - 0x38, 0x9e, 0x08, 0x0f, 0xbc, 0xcc, 0xde, 0x84, 0x92, 0xf2, 0x0f, 0x93, 0x0e, 0xa2, 0x56, 0x8e, - 0x83, 0x68, 0x6f, 0xee, 0x43, 0x9a, 0xd8, 0x15, 0x33, 0x4d, 0xec, 0xfe, 0x96, 0x05, 0xb1, 0x82, - 0x07, 0x5d, 0x83, 0x52, 0xdb, 0x67, 0x96, 0xa3, 0x81, 0x34, 0xc7, 0x7e, 0x34, 0xf3, 0xa2, 0xe2, - 0x97, 0x22, 0xff, 0xf8, 0xaa, 0xac, 0x81, 0xe3, 0xca, 0x68, 0x09, 0x86, 0xdb, 0x01, 0xa9, 0x45, - 0x2c, 0x86, 0x4a, 0x4f, 0x3a, 0x7c, 0x8d, 0x70, 0x7c, 0x2c, 0x2b, 0xda, 0x3f, 0x67, 0x01, 0x70, - 0x2b, 0x36, 0xc7, 0xdb, 0x26, 0x27, 0x20, 0xb5, 0x2e, 0xc3, 0x40, 0xd8, 0x26, 0xf5, 0x6e, 0x36, - 0xbd, 0x71, 0x7f, 0x6a, 0x6d, 0x52, 0x8f, 0x07, 0x9c, 0xfe, 0xc3, 0xac, 0xb6, 0xfd, 0xdd, 0x00, - 0x13, 0x31, 0x5a, 0x25, 0x22, 0x2d, 0xf4, 0xac, 0x11, 0x53, 0xe1, 0x6c, 0x22, 0xa6, 0x42, 0x89, - 0x61, 0x6b, 0x02, 0xd2, 0x37, 0xa1, 0xd8, 0x72, 0xee, 0x09, 0x09, 0xd8, 0xd3, 0xdd, 0xbb, 0x41, - 0xe9, 0x2f, 0xac, 0x39, 0xf7, 0xf8, 0x23, 0xf1, 0x69, 0xb9, 0x40, 0xd6, 0x9c, 0x7b, 0x87, 0xdc, - 0x72, 0x97, 0x1d, 0x52, 0x37, 0xdc, 0x30, 0xfa, 0xfc, 0x7f, 0x8d, 0xff, 0xb3, 0x65, 0x47, 0x1b, - 0x61, 0x6d, 0xb9, 0x9e, 0x30, 0xd0, 0xea, 0xab, 0x2d, 0xd7, 0x4b, 0xb6, 0xe5, 0x7a, 0x7d, 0xb4, - 0xe5, 0x7a, 0xe8, 0x6d, 0x18, 0x16, 0xf6, 0x93, 0x22, 0x86, 0xd1, 0xe5, 0x3e, 0xda, 0x13, 0xe6, - 0x97, 0xbc, 0xcd, 0xcb, 0xf2, 0x11, 0x2c, 0x4a, 0x7b, 0xb6, 0x2b, 0x1b, 0x44, 0x7f, 0xdd, 0x82, - 0x09, 0xf1, 0x1b, 0x93, 0xb7, 0x3a, 0x24, 0x8c, 0x04, 0xef, 0xf9, 0xe1, 0xfe, 0xfb, 0x20, 0x2a, - 0xf2, 0xae, 0x7c, 0x58, 0x1e, 0xb3, 0x26, 0xb0, 0x67, 0x8f, 0x12, 0xbd, 0x40, 0xff, 0xd0, 0x82, - 0x53, 0x2d, 0xe7, 0x1e, 0x6f, 0x91, 0x97, 0x61, 0x27, 0x72, 0x7d, 0x61, 0x87, 0xf0, 0xd1, 0xfe, - 0xa6, 0x3f, 0x55, 0x9d, 0x77, 0x52, 0x2a, 0x4b, 0x4f, 0x65, 0xa1, 0xf4, 0xec, 0x6a, 0x66, 0xbf, - 0xe6, 0xb6, 0x60, 0x44, 0xae, 0xb7, 0x0c, 0x51, 0x43, 0x59, 0x67, 0xac, 0x8f, 0x6c, 0xbe, 0xaa, - 0xc7, 0x2a, 0xa0, 0xed, 0x88, 0xb5, 0xf6, 0x50, 0xdb, 0x79, 0x13, 0xc6, 0xf4, 0x35, 0xf6, 0x50, - 0xdb, 0x7a, 0x0b, 0x66, 0x32, 0xd6, 0xd2, 0x43, 0x6d, 0xf2, 0x2e, 0x9c, 0xcd, 0x5d, 0x1f, 0x0f, - 0xb3, 0x61, 0xfb, 0x67, 0x2d, 0xfd, 0x1c, 0x3c, 0x01, 0xd5, 0xc1, 0xb2, 0xa9, 0x3a, 0x38, 0xdf, - 0x7d, 0xe7, 0xe4, 0xe8, 0x0f, 0xde, 0xd0, 0x3b, 0x4d, 0x4f, 0x75, 0xf4, 0x1a, 0x0c, 0x35, 0x69, - 0x89, 0xb4, 0xc2, 0xb5, 0x7b, 0xef, 0xc8, 0x98, 0x97, 0x62, 0xe5, 0x21, 0x16, 0x14, 0xec, 0x5f, - 0xb4, 0x60, 0xe0, 0x04, 0x46, 0x02, 0x9b, 0x23, 0xf1, 0x6c, 0x2e, 0x69, 0x11, 0x5e, 0x79, 0x01, - 0x3b, 0x77, 0x57, 0xee, 0x45, 0xc4, 0x0b, 0xd9, 0x53, 0x31, 0x73, 0x60, 0x7e, 0xd2, 0x82, 0x99, - 0x1b, 0xbe, 0xd3, 0x58, 0x72, 0x9a, 0x8e, 0x57, 0x27, 0x41, 0xc5, 0xdb, 0x3e, 0x92, 0x09, 0x79, - 0xa1, 0xa7, 0x09, 0xf9, 0xb2, 0xb4, 0xc0, 0x1a, 0xc8, 0x9f, 0x3f, 0xca, 0x48, 0x26, 0xa3, 0xcc, - 0x18, 0xb6, 0xc2, 0x3b, 0x80, 0xf4, 0x5e, 0x0a, 0x87, 0x1e, 0x0c, 0xc3, 0x2e, 0xef, 0xaf, 0x98, - 0xc4, 0x27, 0xb3, 0x19, 0xbc, 0xd4, 0xe7, 0x69, 0xae, 0x2a, 0xbc, 0x00, 0x4b, 0x42, 0xf6, 0x4b, - 0x90, 0x19, 0x15, 0xa0, 0xb7, 0xf0, 0xc1, 0xfe, 0x24, 0x4c, 0xb3, 0x9a, 0x47, 0x7c, 0x18, 0xdb, - 0x09, 0xd9, 0x66, 0x46, 0xbc, 0x40, 0xfb, 0x0b, 0x16, 0x4c, 0xae, 0x27, 0xc2, 0xa8, 0x5d, 0x64, - 0xda, 0xd0, 0x0c, 0x91, 0x7a, 0x8d, 0x95, 0x62, 0x01, 0x3d, 0x76, 0x49, 0xd6, 0x5f, 0x58, 0x10, - 0x07, 0xea, 0x38, 0x01, 0xf6, 0x6d, 0xd9, 0x60, 0xdf, 0x32, 0x25, 0x2c, 0xaa, 0x3b, 0x79, 0xdc, - 0x1b, 0xba, 0xae, 0x42, 0x58, 0x75, 0x11, 0xae, 0xc4, 0x64, 0xf8, 0x52, 0x9c, 0x30, 0xe3, 0x5c, - 0xc9, 0xa0, 0x56, 0xf6, 0x6f, 0x17, 0x00, 0x29, 0xdc, 0xbe, 0x43, 0x6c, 0xa5, 0x6b, 0x1c, 0x4f, - 0x88, 0xad, 0x3d, 0x40, 0x4c, 0x9f, 0x1f, 0x38, 0x5e, 0xc8, 0xc9, 0xba, 0x42, 0x76, 0x77, 0x34, - 0x63, 0x81, 0x39, 0xd1, 0x24, 0xba, 0x91, 0xa2, 0x86, 0x33, 0x5a, 0xd0, 0xec, 0x34, 0x06, 0xfb, - 0xb5, 0xd3, 0x18, 0xea, 0xe1, 0xb4, 0xf7, 0x33, 0x16, 0x8c, 0xab, 0x61, 0x7a, 0x97, 0x98, 0xd4, - 0xab, 0xfe, 0xe4, 0x1c, 0xa0, 0x55, 0xad, 0xcb, 0xec, 0x62, 0xf9, 0x56, 0xe6, 0x7c, 0xe9, 0x34, - 0xdd, 0xb7, 0x89, 0x0a, 0x70, 0x38, 0x2f, 0x9c, 0x29, 0x45, 0xe9, 0xe1, 0xc1, 0xfc, 0xb8, 0xfa, - 0xc7, 0x03, 0x2a, 0xc7, 0x55, 0xe8, 0x91, 0x3c, 0x99, 0x58, 0x8a, 0xe8, 0x45, 0x18, 0x6c, 0xef, - 0x38, 0x21, 0x49, 0xb8, 0x1e, 0x0d, 0x56, 0x69, 0xe1, 0xe1, 0xc1, 0xfc, 0x84, 0xaa, 0xc0, 0x4a, - 0x30, 0xc7, 0xee, 0x3f, 0x70, 0x59, 0x7a, 0x71, 0xf6, 0x0c, 0x5c, 0xf6, 0x27, 0x16, 0x0c, 0xac, - 0xfb, 0x8d, 0x93, 0x38, 0x02, 0x5e, 0x35, 0x8e, 0x80, 0xc7, 0xf2, 0x62, 0xdd, 0xe7, 0xee, 0xfe, - 0xd5, 0xc4, 0xee, 0x3f, 0x9f, 0x4b, 0xa1, 0xfb, 0xc6, 0x6f, 0xc1, 0x28, 0x8b, 0xa0, 0x2f, 0xdc, - 0xac, 0x9e, 0x37, 0x36, 0xfc, 0x7c, 0x62, 0xc3, 0x4f, 0x6a, 0xa8, 0xda, 0x4e, 0x7f, 0x0a, 0x86, - 0x85, 0xdf, 0x4e, 0xd2, 0x87, 0x55, 0xe0, 0x62, 0x09, 0xb7, 0x7f, 0xbc, 0x08, 0x46, 0xc4, 0x7e, - 0xf4, 0xcb, 0x16, 0x2c, 0x04, 0xdc, 0x9e, 0xb7, 0x51, 0xee, 0x04, 0xae, 0xb7, 0x5d, 0xab, 0xef, - 0x90, 0x46, 0xa7, 0xe9, 0x7a, 0xdb, 0x95, 0x6d, 0xcf, 0x57, 0xc5, 0x2b, 0xf7, 0x48, 0xbd, 0xc3, - 0x94, 0x60, 0x3d, 0xd2, 0x03, 0x28, 0xbb, 0xf8, 0xe7, 0xee, 0x1f, 0xcc, 0x2f, 0xe0, 0x23, 0xd1, - 0xc6, 0x47, 0xec, 0x0b, 0xfa, 0x0d, 0x0b, 0x2e, 0xf3, 0x40, 0xf6, 0xfd, 0xf7, 0xbf, 0xcb, 0x6b, - 0xb9, 0x2a, 0x49, 0xc5, 0x44, 0x36, 0x48, 0xd0, 0x5a, 0xfa, 0x88, 0x18, 0xd0, 0xcb, 0xd5, 0xa3, - 0xb5, 0x85, 0x8f, 0xda, 0x39, 0xfb, 0x5f, 0x14, 0x61, 0x5c, 0x04, 0xb8, 0x12, 0x77, 0xc0, 0x8b, - 0xc6, 0x92, 0x78, 0x3c, 0xb1, 0x24, 0xa6, 0x0d, 0xe4, 0xe3, 0x39, 0xfe, 0x43, 0x98, 0xa6, 0x87, - 0xf3, 0x35, 0xe2, 0x04, 0xd1, 0x26, 0x71, 0xb8, 0xf9, 0x55, 0xf1, 0xc8, 0xa7, 0xbf, 0x12, 0xcf, - 0xdd, 0x48, 0x12, 0xc3, 0x69, 0xfa, 0xdf, 0x4c, 0x77, 0x8e, 0x07, 0x53, 0xa9, 0x18, 0x65, 0x9f, - 0x82, 0x92, 0x72, 0x3a, 0x11, 0x87, 0x4e, 0xf7, 0x50, 0x7f, 0x49, 0x0a, 0x5c, 0x84, 0x16, 0x3b, - 0x3c, 0xc5, 0xe4, 0xec, 0x7f, 0x54, 0x30, 0x1a, 0xe4, 0x93, 0xb8, 0x0e, 0x23, 0x4e, 0x18, 0xba, - 0xdb, 0x1e, 0x69, 0x88, 0x1d, 0xfb, 0xfe, 0xbc, 0x1d, 0x6b, 0x34, 0xc3, 0x1c, 0x7f, 0x16, 0x45, - 0x4d, 0xac, 0x68, 0xa0, 0x6b, 0xdc, 0xc8, 0x6d, 0x4f, 0xbe, 0xf7, 0xfa, 0xa3, 0x06, 0xd2, 0x0c, - 0x6e, 0x8f, 0x60, 0x51, 0x1f, 0x7d, 0x9a, 0x5b, 0x21, 0x5e, 0xf7, 0xfc, 0xbb, 0xde, 0x55, 0xdf, - 0x97, 0x41, 0x24, 0xfa, 0x23, 0x38, 0x2d, 0x6d, 0x0f, 0x55, 0x75, 0x6c, 0x52, 0xeb, 0x2f, 0xe8, - 0xe7, 0xe7, 0x60, 0x86, 0x92, 0x36, 0x7d, 0xbc, 0x43, 0x44, 0x60, 0x52, 0x44, 0x4f, 0x93, 0x65, - 0x62, 0xec, 0x32, 0x9f, 0x72, 0x66, 0xed, 0x58, 0x8e, 0x7c, 0xdd, 0x24, 0x81, 0x93, 0x34, 0xed, - 0x9f, 0xb2, 0x80, 0xf9, 0xbb, 0x9e, 0x00, 0x3f, 0xf2, 0x31, 0x93, 0x1f, 0x99, 0xcd, 0x1b, 0xe4, - 0x1c, 0x56, 0xe4, 0x05, 0xbe, 0xb2, 0xaa, 0x81, 0x7f, 0x6f, 0x5f, 0x98, 0x8e, 0xf4, 0x7e, 0x7f, - 0xd8, 0xff, 0xd7, 0xe2, 0x87, 0x98, 0x72, 0x09, 0x41, 0xdf, 0x0e, 0x23, 0x75, 0xa7, 0xed, 0xd4, - 0x79, 0x7a, 0x99, 0x5c, 0x89, 0x9e, 0x51, 0x69, 0x61, 0x59, 0xd4, 0xe0, 0x12, 0x2a, 0x19, 0x85, - 0x6f, 0x44, 0x16, 0xf7, 0x94, 0x4a, 0xa9, 0x26, 0xe7, 0x76, 0x61, 0xdc, 0x20, 0xf6, 0x50, 0xc5, - 0x19, 0xdf, 0xce, 0xaf, 0x58, 0x15, 0x35, 0xb2, 0x05, 0xd3, 0x9e, 0xf6, 0x9f, 0x5e, 0x28, 0xf2, - 0x71, 0xf9, 0xfe, 0x5e, 0x97, 0x28, 0xbb, 0x7d, 0x34, 0x57, 0xda, 0x04, 0x19, 0x9c, 0xa6, 0x6c, - 0xff, 0x84, 0x05, 0x8f, 0xe8, 0x88, 0x9a, 0xb7, 0x4e, 0x2f, 0x1d, 0x41, 0x19, 0x46, 0xfc, 0x36, - 0x09, 0x9c, 0xc8, 0x0f, 0xc4, 0xad, 0x71, 0x49, 0x0e, 0xfa, 0x4d, 0x51, 0x7e, 0x28, 0x82, 0xb3, - 0x4b, 0xea, 0xb2, 0x1c, 0xab, 0x9a, 0xf4, 0xf5, 0xc9, 0x06, 0x23, 0x14, 0x7e, 0x59, 0xec, 0x0c, - 0x60, 0xea, 0xf2, 0x10, 0x0b, 0x88, 0xfd, 0x35, 0x8b, 0x2f, 0x2c, 0xbd, 0xeb, 0xe8, 0x2d, 0x98, - 0x6a, 0x39, 0x51, 0x7d, 0x67, 0xe5, 0x5e, 0x3b, 0xe0, 0x1a, 0x17, 0x39, 0x4e, 0x4f, 0xf7, 0x1a, - 0x27, 0xed, 0x23, 0x63, 0xc3, 0xca, 0xb5, 0x04, 0x31, 0x9c, 0x22, 0x8f, 0x36, 0x61, 0x94, 0x95, - 0x31, 0x97, 0xc3, 0xb0, 0x1b, 0x6b, 0x90, 0xd7, 0x9a, 0xb2, 0x38, 0x58, 0x8b, 0xe9, 0x60, 0x9d, - 0xa8, 0xfd, 0xe5, 0x22, 0xdf, 0xed, 0x8c, 0x95, 0x7f, 0x0a, 0x86, 0xdb, 0x7e, 0x63, 0xb9, 0x52, - 0xc6, 0x62, 0x16, 0xd4, 0x35, 0x52, 0xe5, 0xc5, 0x58, 0xc2, 0xd1, 0x25, 0x18, 0x11, 0x3f, 0xa5, - 0x86, 0x8c, 0x9d, 0xcd, 0x02, 0x2f, 0xc4, 0x0a, 0x8a, 0x9e, 0x03, 0x68, 0x07, 0xfe, 0x9e, 0xdb, - 0x60, 0xa1, 0x30, 0x8a, 0xa6, 0xb1, 0x50, 0x55, 0x41, 0xb0, 0x86, 0x85, 0x5e, 0x81, 0xf1, 0x8e, - 0x17, 0x72, 0x76, 0x44, 0x0b, 0x7c, 0xab, 0xcc, 0x58, 0x6e, 0xe9, 0x40, 0x6c, 0xe2, 0xa2, 0x45, - 0x18, 0x8a, 0x1c, 0x66, 0xfc, 0x32, 0x98, 0x6f, 0x7c, 0xbb, 0x41, 0x31, 0xf4, 0x4c, 0x26, 0xb4, - 0x02, 0x16, 0x15, 0xd1, 0xa7, 0xa4, 0xf7, 0x2f, 0x3f, 0xd8, 0x85, 0xd5, 0x7b, 0x7f, 0x97, 0x80, - 0xe6, 0xfb, 0x2b, 0xac, 0xe9, 0x0d, 0x5a, 0xe8, 0x65, 0x00, 0x72, 0x2f, 0x22, 0x81, 0xe7, 0x34, - 0x95, 0x6d, 0x99, 0xe2, 0x0b, 0xca, 0xfe, 0xba, 0x1f, 0xdd, 0x0a, 0xc9, 0x8a, 0xc2, 0xc0, 0x1a, - 0xb6, 0xfd, 0x1b, 0x25, 0x80, 0x98, 0x6f, 0x47, 0x6f, 0xa7, 0x0e, 0xae, 0x67, 0xba, 0x73, 0xfa, - 0xc7, 0x77, 0x6a, 0xa1, 0xef, 0xb1, 0x60, 0xd4, 0x69, 0x36, 0xfd, 0xba, 0xc3, 0x43, 0x13, 0x17, - 0xba, 0x1f, 0x9c, 0xa2, 0xfd, 0xc5, 0xb8, 0x06, 0xef, 0xc2, 0xf3, 0x72, 0x85, 0x6a, 0x90, 0x9e, - 0xbd, 0xd0, 0x1b, 0x46, 0x1f, 0x92, 0x4f, 0xc5, 0xa2, 0x31, 0x94, 0xea, 0xa9, 0x58, 0x62, 0x77, - 0x84, 0xfe, 0x4a, 0xbc, 0x65, 0xbc, 0x12, 0x07, 0xf2, 0xdd, 0x1b, 0x0d, 0xf6, 0xb5, 0xd7, 0x03, - 0x11, 0x55, 0xf5, 0x50, 0x07, 0x83, 0xf9, 0xbe, 0x84, 0xda, 0x3b, 0xa9, 0x47, 0x98, 0x83, 0x37, - 0x61, 0xb2, 0x61, 0x32, 0x01, 0x62, 0x25, 0x3e, 0x99, 0x47, 0x37, 0xc1, 0x33, 0xc4, 0xd7, 0x7e, - 0x02, 0x80, 0x93, 0x84, 0x51, 0x95, 0x47, 0xbe, 0xa8, 0x78, 0x5b, 0xbe, 0xf0, 0xbc, 0xb0, 0x73, - 0xe7, 0x72, 0x3f, 0x8c, 0x48, 0x8b, 0x62, 0xc6, 0xb7, 0xfb, 0xba, 0xa8, 0x8b, 0x15, 0x15, 0xf4, - 0x1a, 0x0c, 0x31, 0x67, 0xb2, 0x70, 0x76, 0x24, 0x5f, 0xe2, 0x6c, 0x86, 0x72, 0x8b, 0x37, 0x24, - 0xfb, 0x1b, 0x62, 0x41, 0x01, 0x5d, 0x93, 0xae, 0x9a, 0x61, 0xc5, 0xbb, 0x15, 0x12, 0xe6, 0xaa, - 0x59, 0x5a, 0x7a, 0x7f, 0xec, 0x85, 0xc9, 0xcb, 0x33, 0xf3, 0x9d, 0x19, 0x35, 0x29, 0x17, 0x25, - 0xfe, 0xcb, 0x34, 0x6a, 0xb3, 0x90, 0xdf, 0x3d, 0x33, 0xd5, 0x5a, 0x3c, 0x9c, 0xb7, 0x4d, 0x12, - 0x38, 0x49, 0x93, 0x72, 0xa4, 0x7c, 0xd7, 0x0b, 0xdf, 0x8d, 0x5e, 0x67, 0x07, 0x7f, 0x88, 0xb3, - 0xdb, 0x88, 0x97, 0x60, 0x51, 0xff, 0x44, 0xd9, 0x83, 0x39, 0x0f, 0xa6, 0x92, 0x5b, 0xf4, 0xa1, - 0xb2, 0x23, 0x7f, 0x30, 0x00, 0x13, 0xe6, 0x92, 0x42, 0x97, 0xa1, 0x24, 0x88, 0xa8, 0xd4, 0x07, - 0x6a, 0x97, 0xac, 0x49, 0x00, 0x8e, 0x71, 0x58, 0xc6, 0x0b, 0x56, 0x5d, 0x33, 0xd6, 0x8d, 0x33, - 0x5e, 0x28, 0x08, 0xd6, 0xb0, 0xe8, 0xc3, 0x6a, 0xd3, 0xf7, 0x23, 0x75, 0x21, 0xa9, 0x75, 0xb7, - 0xc4, 0x4a, 0xb1, 0x80, 0xd2, 0x8b, 0x68, 0x97, 0x04, 0x1e, 0x69, 0x9a, 0x41, 0x92, 0xd5, 0x45, - 0x74, 0x5d, 0x07, 0x62, 0x13, 0x97, 0x5e, 0xa7, 0x7e, 0xc8, 0x16, 0xb2, 0x78, 0xbe, 0xc5, 0xc6, - 0xcf, 0x35, 0xee, 0x2d, 0x2e, 0xe1, 0xe8, 0x93, 0xf0, 0x88, 0x0a, 0x04, 0x85, 0xb9, 0x36, 0x43, - 0xb6, 0x38, 0x64, 0x48, 0x5b, 0x1e, 0x59, 0xce, 0x46, 0xc3, 0x79, 0xf5, 0xd1, 0xab, 0x30, 0x21, - 0x58, 0x7c, 0x49, 0x71, 0xd8, 0x34, 0xb0, 0xb9, 0x6e, 0x40, 0x71, 0x02, 0x5b, 0x86, 0x79, 0x66, - 0x5c, 0xb6, 0xa4, 0x30, 0x92, 0x0e, 0xf3, 0xac, 0xc3, 0x71, 0xaa, 0x06, 0x5a, 0x84, 0x49, 0xce, - 0x83, 0xb9, 0xde, 0x36, 0x9f, 0x13, 0xe1, 0x5a, 0xa5, 0xb6, 0xd4, 0x4d, 0x13, 0x8c, 0x93, 0xf8, - 0xe8, 0x25, 0x18, 0x73, 0x82, 0xfa, 0x8e, 0x1b, 0x91, 0x7a, 0xd4, 0x09, 0xb8, 0xcf, 0x95, 0x66, - 0xa1, 0xb4, 0xa8, 0xc1, 0xb0, 0x81, 0x69, 0xbf, 0x0d, 0x33, 0x19, 0x61, 0x24, 0xe8, 0xc2, 0x71, - 0xda, 0xae, 0xfc, 0xa6, 0x84, 0x19, 0xf3, 0x62, 0xb5, 0x22, 0xbf, 0x46, 0xc3, 0xa2, 0xab, 0x93, - 0x85, 0x9b, 0xd0, 0xb2, 0x26, 0xaa, 0xd5, 0xb9, 0x2a, 0x01, 0x38, 0xc6, 0xb1, 0xff, 0x57, 0x01, - 0x26, 0x33, 0x74, 0x2b, 0x2c, 0x73, 0x5f, 0xe2, 0x91, 0x12, 0x27, 0xea, 0x33, 0xa3, 0x86, 0x17, - 0x8e, 0x10, 0x35, 0xbc, 0xd8, 0x2b, 0x6a, 0xf8, 0xc0, 0x3b, 0x89, 0x1a, 0x6e, 0x8e, 0xd8, 0x60, - 0x5f, 0x23, 0x96, 0x11, 0x69, 0x7c, 0xe8, 0x88, 0x91, 0xc6, 0x8d, 0x41, 0x1f, 0xee, 0x63, 0xd0, - 0x7f, 0xb8, 0x00, 0x53, 0x49, 0x4b, 0xca, 0x13, 0x90, 0xdb, 0xbe, 0x66, 0xc8, 0x6d, 0x2f, 0xf5, - 0xe3, 0x38, 0x9b, 0x2b, 0xc3, 0xc5, 0x09, 0x19, 0xee, 0x07, 0xfb, 0xa2, 0xd6, 0x5d, 0x9e, 0xfb, - 0x77, 0x0a, 0x70, 0x3a, 0xd3, 0x73, 0xf7, 0x04, 0xc6, 0xe6, 0xa6, 0x31, 0x36, 0xcf, 0xf6, 0xed, - 0x54, 0x9c, 0x3b, 0x40, 0x77, 0x12, 0x03, 0x74, 0xb9, 0x7f, 0x92, 0xdd, 0x47, 0xe9, 0xab, 0x45, - 0x38, 0x9f, 0x59, 0x2f, 0x16, 0x7b, 0xae, 0x1a, 0x62, 0xcf, 0xe7, 0x12, 0x62, 0x4f, 0xbb, 0x7b, - 0xed, 0xe3, 0x91, 0x83, 0x0a, 0x77, 0x59, 0x16, 0x13, 0xe1, 0x01, 0x65, 0xa0, 0x86, 0xbb, 0xac, - 0x22, 0x84, 0x4d, 0xba, 0xdf, 0x4c, 0xb2, 0xcf, 0x7f, 0x67, 0xc1, 0xd9, 0xcc, 0xb9, 0x39, 0x01, - 0x59, 0xd7, 0xba, 0x29, 0xeb, 0x7a, 0xaa, 0xef, 0xd5, 0x9a, 0x23, 0xfc, 0xfa, 0xb5, 0x81, 0x9c, - 0x6f, 0x61, 0x2f, 0xf9, 0x9b, 0x30, 0xea, 0xd4, 0xeb, 0x24, 0x0c, 0xd7, 0xfc, 0x86, 0x0a, 0x8c, - 0xfc, 0x2c, 0x7b, 0x67, 0xc5, 0xc5, 0x87, 0x07, 0xf3, 0x73, 0x49, 0x12, 0x31, 0x18, 0xeb, 0x14, - 0xd0, 0xa7, 0x61, 0x24, 0x14, 0xf7, 0xa6, 0x98, 0xfb, 0xe7, 0xfb, 0x1c, 0x1c, 0x67, 0x93, 0x34, - 0xcd, 0xc8, 0x4d, 0x4a, 0x52, 0xa1, 0x48, 0x9a, 0x51, 0x5e, 0x0a, 0xc7, 0x1a, 0xe5, 0xe5, 0x39, - 0x80, 0x3d, 0xf5, 0x18, 0x48, 0xca, 0x1f, 0xb4, 0x67, 0x82, 0x86, 0x85, 0x3e, 0x0e, 0x53, 0x21, - 0x0f, 0x6d, 0xb8, 0xdc, 0x74, 0x42, 0xe6, 0x2c, 0x23, 0x56, 0x21, 0x8b, 0x0e, 0x55, 0x4b, 0xc0, - 0x70, 0x0a, 0x1b, 0xad, 0xca, 0x56, 0x59, 0x1c, 0x46, 0xbe, 0x30, 0x2f, 0xc6, 0x2d, 0x8a, 0xbc, - 0xc1, 0xa7, 0x92, 0xc3, 0xcf, 0x06, 0x5e, 0xab, 0x89, 0x3e, 0x0d, 0x40, 0x97, 0x8f, 0x90, 0x43, - 0x0c, 0xe7, 0x1f, 0x9e, 0xf4, 0x54, 0x69, 0x64, 0xda, 0xf6, 0x32, 0x0f, 0xd7, 0xb2, 0x22, 0x82, - 0x35, 0x82, 0xf6, 0x0f, 0x0f, 0xc0, 0xa3, 0x5d, 0xce, 0x48, 0xb4, 0x68, 0xea, 0x61, 0x9f, 0x4e, - 0x3e, 0xae, 0xe7, 0x32, 0x2b, 0x1b, 0xaf, 0xed, 0xc4, 0x52, 0x2c, 0xbc, 0xe3, 0xa5, 0xf8, 0x03, - 0x96, 0x26, 0xf6, 0xe0, 0x16, 0x9f, 0x1f, 0x3b, 0xe2, 0xd9, 0x7f, 0x8c, 0x72, 0x90, 0xad, 0x0c, - 0x61, 0xc2, 0x73, 0x7d, 0x77, 0xa7, 0x6f, 0xe9, 0xc2, 0xc9, 0x4a, 0x89, 0x7f, 0xcb, 0x82, 0x73, - 0x5d, 0x43, 0x7c, 0x7c, 0x03, 0x32, 0x0c, 0xf6, 0xe7, 0x2d, 0x78, 0x3c, 0xb3, 0x86, 0x61, 0x66, - 0x74, 0x19, 0x4a, 0x75, 0x5a, 0xa8, 0x79, 0x69, 0xc6, 0xee, 0xeb, 0x12, 0x80, 0x63, 0x9c, 0x23, - 0x86, 0x2f, 0xf9, 0x15, 0x0b, 0x52, 0x9b, 0xfe, 0x04, 0x6e, 0x9f, 0x8a, 0x79, 0xfb, 0xbc, 0xbf, - 0x9f, 0xd1, 0xcc, 0xb9, 0x78, 0xfe, 0x78, 0x12, 0xce, 0xe4, 0x78, 0x29, 0xed, 0xc1, 0xf4, 0x76, - 0x9d, 0x98, 0xfe, 0xaf, 0xdd, 0xa2, 0xc8, 0x74, 0x75, 0x96, 0x65, 0x99, 0x4d, 0xa7, 0x53, 0x28, - 0x38, 0xdd, 0x04, 0xfa, 0xbc, 0x05, 0xa7, 0x9c, 0xbb, 0xe1, 0x0a, 0xe5, 0x22, 0xdc, 0xfa, 0x52, - 0xd3, 0xaf, 0xef, 0xd2, 0x23, 0x5a, 0x6e, 0x84, 0x17, 0x32, 0x25, 0x3b, 0x77, 0x6a, 0x29, 0x7c, - 0xa3, 0x79, 0x96, 0xea, 0x35, 0x0b, 0x0b, 0x67, 0xb6, 0x85, 0xb0, 0x88, 0xff, 0x4f, 0xdf, 0x28, - 0x5d, 0x3c, 0xb4, 0xb3, 0xdc, 0xc9, 0xf8, 0xb5, 0x28, 0x21, 0x58, 0xd1, 0x41, 0x9f, 0x85, 0xd2, - 0xb6, 0xf4, 0xf1, 0xcc, 0xb8, 0x76, 0xe3, 0x81, 0xec, 0xee, 0xf9, 0xca, 0xd5, 0xb3, 0x0a, 0x09, - 0xc7, 0x44, 0xd1, 0xab, 0x50, 0xf4, 0xb6, 0xc2, 0x6e, 0xd9, 0x52, 0x13, 0x76, 0x78, 0x3c, 0x0e, - 0xc2, 0xfa, 0x6a, 0x0d, 0xd3, 0x8a, 0xe8, 0x1a, 0x14, 0x83, 0xcd, 0x86, 0x10, 0x4b, 0x66, 0x6e, - 0x52, 0xbc, 0x54, 0xce, 0xe9, 0x15, 0xa3, 0x84, 0x97, 0xca, 0x98, 0x92, 0x40, 0x55, 0x18, 0x64, - 0xae, 0x3d, 0xe2, 0x92, 0xcb, 0x64, 0xe7, 0xbb, 0xb8, 0xc8, 0xf1, 0x60, 0x09, 0x0c, 0x01, 0x73, - 0x42, 0x68, 0x03, 0x86, 0xea, 0x2c, 0xb3, 0xa6, 0x88, 0x1b, 0xf7, 0xa1, 0x4c, 0x01, 0x64, 0x97, - 0x94, 0xa3, 0x42, 0x1e, 0xc7, 0x30, 0xb0, 0xa0, 0xc5, 0xa8, 0x92, 0xf6, 0xce, 0x56, 0x28, 0x32, - 0x41, 0x67, 0x53, 0xed, 0x92, 0x49, 0x57, 0x50, 0x65, 0x18, 0x58, 0xd0, 0x42, 0x2f, 0x43, 0x61, - 0xab, 0x2e, 0xdc, 0x76, 0x32, 0x25, 0x91, 0x66, 0x28, 0x8b, 0xa5, 0xa1, 0xfb, 0x07, 0xf3, 0x85, - 0xd5, 0x65, 0x5c, 0xd8, 0xaa, 0xa3, 0x75, 0x18, 0xde, 0xe2, 0xce, 0xef, 0x42, 0xd8, 0xf8, 0x64, - 0xb6, 0x5f, 0x7e, 0xca, 0x3f, 0x9e, 0x7b, 0xac, 0x08, 0x00, 0x96, 0x44, 0x58, 0x38, 0x7d, 0xe5, - 0xc4, 0x2f, 0x42, 0xac, 0x2d, 0x1c, 0x2d, 0xf0, 0x02, 0x67, 0x3a, 0xe2, 0x50, 0x00, 0x58, 0xa3, - 0x48, 0x57, 0xb5, 0x23, 0xd3, 0xf1, 0x8b, 0x60, 0x33, 0x99, 0xab, 0x5a, 0xe5, 0xec, 0xef, 0xb6, - 0xaa, 0x15, 0x12, 0x8e, 0x89, 0xa2, 0x5d, 0x18, 0xdf, 0x0b, 0xdb, 0x3b, 0x44, 0x6e, 0x69, 0x16, - 0x7b, 0x26, 0xe7, 0x5e, 0xbe, 0x2d, 0x10, 0xdd, 0x20, 0xea, 0x38, 0xcd, 0xd4, 0x29, 0xc4, 0x74, - 0xfa, 0xb7, 0x75, 0x62, 0xd8, 0xa4, 0x4d, 0x87, 0xff, 0xad, 0x8e, 0xbf, 0xb9, 0x1f, 0x11, 0x11, - 0x19, 0x2d, 0x73, 0xf8, 0x5f, 0xe7, 0x28, 0xe9, 0xe1, 0x17, 0x00, 0x2c, 0x89, 0xa0, 0xdb, 0x62, - 0x78, 0xd8, 0xe9, 0x39, 0x95, 0x1f, 0xbe, 0x74, 0x51, 0x22, 0xe5, 0x0c, 0x0a, 0x3b, 0x2d, 0x63, - 0x52, 0xec, 0x94, 0x6c, 0xef, 0xf8, 0x91, 0xef, 0x25, 0x4e, 0xe8, 0xe9, 0xfc, 0x53, 0xb2, 0x9a, - 0x81, 0x9f, 0x3e, 0x25, 0xb3, 0xb0, 0x70, 0x66, 0x5b, 0xa8, 0x01, 0x13, 0x6d, 0x3f, 0x88, 0xee, - 0xfa, 0x81, 0x5c, 0x5f, 0xa8, 0x8b, 0xb0, 0xc4, 0xc0, 0x14, 0x2d, 0xb2, 0xa0, 0x83, 0x26, 0x04, - 0x27, 0x68, 0xa2, 0x4f, 0xc0, 0x70, 0x58, 0x77, 0x9a, 0xa4, 0x72, 0x73, 0x76, 0x26, 0xff, 0xfa, - 0xa9, 0x71, 0x94, 0x9c, 0xd5, 0xc5, 0x63, 0xef, 0x73, 0x14, 0x2c, 0xc9, 0xa1, 0x55, 0x18, 0x64, - 0xe9, 0xd2, 0x58, 0x18, 0xbf, 0x9c, 0x28, 0xac, 0x29, 0xab, 0x68, 0x7e, 0x36, 0xb1, 0x62, 0xcc, - 0xab, 0xd3, 0x3d, 0x20, 0xde, 0x0c, 0x7e, 0x38, 0x7b, 0x3a, 0x7f, 0x0f, 0x88, 0xa7, 0xc6, 0xcd, - 0x5a, 0xb7, 0x3d, 0xa0, 0x90, 0x70, 0x4c, 0x94, 0x9e, 0xcc, 0xf4, 0x34, 0x3d, 0xd3, 0xc5, 0x9c, - 0x27, 0xf7, 0x2c, 0x65, 0x27, 0x33, 0x3d, 0x49, 0x29, 0x09, 0xfb, 0xf7, 0x86, 0xd3, 0x3c, 0x0b, - 0x7b, 0x65, 0x7e, 0x97, 0x95, 0x52, 0x40, 0x7e, 0xb8, 0x5f, 0xa1, 0xd7, 0x31, 0xb2, 0xe0, 0x9f, - 0xb7, 0xe0, 0x4c, 0x3b, 0xf3, 0x43, 0x04, 0x03, 0xd0, 0x9f, 0xec, 0x8c, 0x7f, 0xba, 0x0a, 0xf9, - 0x98, 0x0d, 0xc7, 0x39, 0x2d, 0x25, 0x9f, 0x39, 0xc5, 0x77, 0xfc, 0xcc, 0x59, 0x83, 0x11, 0xc6, - 0x64, 0xf6, 0xc8, 0x34, 0x9d, 0x7c, 0xed, 0x31, 0x56, 0x62, 0x59, 0x54, 0xc4, 0x8a, 0x04, 0xfa, - 0x41, 0x0b, 0xce, 0x25, 0xbb, 0x8e, 0x09, 0x03, 0x8b, 0x38, 0x91, 0xfc, 0x81, 0xbb, 0x2a, 0xbe, - 0x3f, 0xc5, 0xff, 0x1b, 0xc8, 0x87, 0xbd, 0x10, 0x70, 0xf7, 0xc6, 0x50, 0x39, 0xe3, 0x85, 0x3d, - 0x64, 0x6a, 0x15, 0xfa, 0x78, 0x65, 0xbf, 0x00, 0x63, 0x2d, 0xbf, 0xe3, 0x45, 0xc2, 0xfa, 0x47, - 0x58, 0x22, 0x30, 0x0d, 0xfc, 0x9a, 0x56, 0x8e, 0x0d, 0xac, 0xc4, 0xdb, 0x7c, 0xe4, 0x81, 0xdf, - 0xe6, 0x6f, 0xc0, 0x98, 0xa7, 0x99, 0xab, 0x0a, 0x7e, 0xe0, 0x62, 0x7e, 0x8c, 0x57, 0xdd, 0xb8, - 0x95, 0xf7, 0x52, 0x2f, 0xc1, 0x06, 0xb5, 0x93, 0x7d, 0xf0, 0x7d, 0xc9, 0xca, 0x60, 0xea, 0xb9, - 0x08, 0xe0, 0xa3, 0xa6, 0x08, 0xe0, 0x62, 0x52, 0x04, 0x90, 0x92, 0x28, 0x1b, 0xaf, 0xff, 0xfe, - 0x53, 0xd8, 0xf4, 0x1b, 0x08, 0xd1, 0x6e, 0xc2, 0x85, 0x5e, 0xd7, 0x12, 0x33, 0x03, 0x6b, 0x28, - 0xfd, 0x61, 0x6c, 0x06, 0xd6, 0xa8, 0x94, 0x31, 0x83, 0xf4, 0x1b, 0x62, 0xc7, 0xfe, 0x1f, 0x16, - 0x14, 0xab, 0x7e, 0xe3, 0x04, 0x1e, 0xbc, 0x1f, 0x33, 0x1e, 0xbc, 0x8f, 0x66, 0x5f, 0x88, 0x8d, - 0x5c, 0x79, 0xf8, 0x4a, 0x42, 0x1e, 0x7e, 0x2e, 0x8f, 0x40, 0x77, 0xe9, 0xf7, 0x4f, 0x16, 0x61, - 0xb4, 0xea, 0x37, 0x94, 0x0d, 0xf6, 0xaf, 0x3d, 0x88, 0x0d, 0x76, 0x6e, 0x22, 0x06, 0x8d, 0x32, - 0xb3, 0x1e, 0x93, 0xee, 0xa7, 0xdf, 0x60, 0xa6, 0xd8, 0x77, 0x88, 0xbb, 0xbd, 0x13, 0x91, 0x46, - 0xf2, 0x73, 0x4e, 0xce, 0x14, 0xfb, 0xbf, 0x5b, 0x30, 0x99, 0x68, 0x1d, 0x35, 0x61, 0xbc, 0xa9, - 0x4b, 0x5b, 0xc5, 0x3a, 0x7d, 0x20, 0x41, 0xad, 0x30, 0x65, 0xd5, 0x8a, 0xb0, 0x49, 0x1c, 0x2d, - 0x00, 0x28, 0xf5, 0xa3, 0x14, 0xeb, 0x31, 0xae, 0x5f, 0xe9, 0x27, 0x43, 0xac, 0x61, 0xa0, 0x17, - 0x61, 0x34, 0xf2, 0xdb, 0x7e, 0xd3, 0xdf, 0xde, 0xbf, 0x4e, 0x64, 0x50, 0x27, 0x65, 0xa0, 0xb6, - 0x11, 0x83, 0xb0, 0x8e, 0x67, 0xff, 0x74, 0x91, 0x7f, 0xa8, 0x17, 0xb9, 0xef, 0xad, 0xc9, 0x77, - 0xf7, 0x9a, 0xfc, 0xaa, 0x05, 0x53, 0xb4, 0x75, 0x66, 0x03, 0x23, 0x2f, 0x5b, 0x15, 0xdb, 0xd9, - 0xea, 0x12, 0xdb, 0xf9, 0x22, 0x3d, 0xbb, 0x1a, 0x7e, 0x27, 0x12, 0x12, 0x34, 0xed, 0x70, 0xa2, - 0xa5, 0x58, 0x40, 0x05, 0x1e, 0x09, 0x02, 0xe1, 0xb7, 0xa7, 0xe3, 0x91, 0x20, 0xc0, 0x02, 0x2a, - 0x43, 0x3f, 0x0f, 0x64, 0x87, 0x7e, 0xe6, 0x21, 0x2a, 0x85, 0xb5, 0x84, 0x60, 0x7b, 0xb4, 0x10, - 0x95, 0xd2, 0x8c, 0x22, 0xc6, 0xb1, 0x7f, 0xb6, 0x08, 0x63, 0x55, 0xbf, 0x11, 0x2b, 0x00, 0x5f, - 0x30, 0x14, 0x80, 0x17, 0x12, 0x0a, 0xc0, 0x29, 0x1d, 0xf7, 0x3d, 0x75, 0xdf, 0xd7, 0x4b, 0xdd, - 0xf7, 0xcf, 0x2d, 0x36, 0x6b, 0xe5, 0xf5, 0x1a, 0x37, 0xa9, 0x42, 0x57, 0x60, 0x94, 0x1d, 0x48, - 0xcc, 0x51, 0x54, 0x6a, 0xc5, 0x58, 0x4a, 0xa3, 0xf5, 0xb8, 0x18, 0xeb, 0x38, 0xe8, 0x12, 0x8c, - 0x84, 0xc4, 0x09, 0xea, 0x3b, 0xea, 0x8c, 0x13, 0x2a, 0x2c, 0x5e, 0x86, 0x15, 0x14, 0xbd, 0x1e, - 0x47, 0x47, 0x2c, 0xe6, 0x3b, 0x9e, 0xe9, 0xfd, 0xe1, 0x5b, 0x24, 0x3f, 0x24, 0xa2, 0x7d, 0x07, - 0x50, 0x1a, 0xbf, 0x8f, 0xb0, 0x60, 0xf3, 0x66, 0x58, 0xb0, 0x52, 0x2a, 0x24, 0xd8, 0x9f, 0x5b, - 0x30, 0x51, 0xf5, 0x1b, 0x74, 0xeb, 0x7e, 0x33, 0xed, 0x53, 0x3d, 0x34, 0xec, 0x50, 0x97, 0xd0, - 0xb0, 0x4f, 0xc0, 0x60, 0xd5, 0x6f, 0x54, 0xaa, 0xdd, 0xbc, 0xbe, 0xed, 0xbf, 0x6b, 0xc1, 0x70, - 0xd5, 0x6f, 0x9c, 0x80, 0x70, 0xfe, 0xa3, 0xa6, 0x70, 0xfe, 0x91, 0x9c, 0x75, 0x93, 0x23, 0x8f, - 0xff, 0xdb, 0x03, 0x30, 0x4e, 0xfb, 0xe9, 0x6f, 0xcb, 0xa9, 0x34, 0x86, 0xcd, 0xea, 0x63, 0xd8, - 0x28, 0x2f, 0xec, 0x37, 0x9b, 0xfe, 0xdd, 0xe4, 0xb4, 0xae, 0xb2, 0x52, 0x2c, 0xa0, 0xe8, 0x19, - 0x18, 0x69, 0x07, 0x64, 0xcf, 0xf5, 0x05, 0x93, 0xa9, 0xa9, 0x3a, 0xaa, 0xa2, 0x1c, 0x2b, 0x0c, - 0xfa, 0x38, 0x0b, 0x5d, 0xaf, 0x4e, 0x6a, 0xa4, 0xee, 0x7b, 0x0d, 0x2e, 0xbf, 0x2e, 0x8a, 0xf4, - 0x0e, 0x5a, 0x39, 0x36, 0xb0, 0xd0, 0x1d, 0x28, 0xb1, 0xff, 0xec, 0xd8, 0x39, 0x7a, 0xa2, 0x50, - 0x91, 0x38, 0x4e, 0x10, 0xc0, 0x31, 0x2d, 0xf4, 0x1c, 0x40, 0x24, 0x63, 0x80, 0x87, 0x22, 0x04, - 0x94, 0x62, 0xc8, 0x55, 0x74, 0xf0, 0x10, 0x6b, 0x58, 0xe8, 0x69, 0x28, 0x45, 0x8e, 0xdb, 0xbc, - 0xe1, 0x7a, 0x24, 0x64, 0x72, 0xe9, 0xa2, 0xcc, 0xdf, 0x26, 0x0a, 0x71, 0x0c, 0xa7, 0x0c, 0x11, - 0x8b, 0x8f, 0xc0, 0xd3, 0x0c, 0x8f, 0x30, 0x6c, 0xc6, 0x10, 0xdd, 0x50, 0xa5, 0x58, 0xc3, 0x40, - 0x3b, 0xf0, 0x98, 0xeb, 0xb1, 0x54, 0x08, 0xa4, 0xb6, 0xeb, 0xb6, 0x37, 0x6e, 0xd4, 0x6e, 0x93, - 0xc0, 0xdd, 0xda, 0x5f, 0x72, 0xea, 0xbb, 0xc4, 0x93, 0x29, 0x20, 0xdf, 0x2f, 0xba, 0xf8, 0x58, - 0xa5, 0x0b, 0x2e, 0xee, 0x4a, 0xc9, 0x7e, 0x09, 0x4e, 0x57, 0xfd, 0x46, 0xd5, 0x0f, 0xa2, 0x55, - 0x3f, 0xb8, 0xeb, 0x04, 0x0d, 0xb9, 0x52, 0xe6, 0x65, 0xac, 0x02, 0x7a, 0x14, 0x0e, 0xf2, 0x83, - 0xc2, 0x88, 0x43, 0xf0, 0x3c, 0x63, 0xbe, 0x8e, 0xe8, 0x61, 0x53, 0x67, 0x6c, 0x80, 0xca, 0x0b, - 0x72, 0xd5, 0x89, 0x08, 0xba, 0xc9, 0xf2, 0x1d, 0xc7, 0x37, 0xa2, 0xa8, 0xfe, 0x94, 0x96, 0xef, - 0x38, 0x06, 0x66, 0x5e, 0xa1, 0x66, 0x7d, 0xfb, 0x7f, 0x0e, 0xb2, 0xc3, 0x31, 0x91, 0x5b, 0x02, - 0x7d, 0x06, 0x26, 0x42, 0x72, 0xc3, 0xf5, 0x3a, 0xf7, 0xa4, 0x4c, 0xa0, 0x8b, 0x8f, 0x54, 0x6d, - 0x45, 0xc7, 0xe4, 0x92, 0x45, 0xb3, 0x0c, 0x27, 0xa8, 0xa1, 0x16, 0x4c, 0xdc, 0x75, 0xbd, 0x86, - 0x7f, 0x37, 0x94, 0xf4, 0x47, 0xf2, 0x05, 0x8c, 0x77, 0x38, 0x66, 0xa2, 0x8f, 0x46, 0x73, 0x77, - 0x0c, 0x62, 0x38, 0x41, 0x9c, 0x2e, 0xc0, 0xa0, 0xe3, 0x2d, 0x86, 0xb7, 0x42, 0x12, 0x88, 0xcc, - 0xd5, 0x6c, 0x01, 0x62, 0x59, 0x88, 0x63, 0x38, 0x5d, 0x80, 0xec, 0xcf, 0xd5, 0xc0, 0xef, 0xf0, - 0x48, 0xfd, 0x62, 0x01, 0x62, 0x55, 0x8a, 0x35, 0x0c, 0xba, 0x41, 0xd9, 0xbf, 0x75, 0xdf, 0xc3, - 0xbe, 0x1f, 0xc9, 0x2d, 0xcd, 0x72, 0xa5, 0x6a, 0xe5, 0xd8, 0xc0, 0x42, 0xab, 0x80, 0xc2, 0x4e, - 0xbb, 0xdd, 0x64, 0xc6, 0x17, 0x4e, 0x93, 0x91, 0xe2, 0x8a, 0xef, 0x22, 0x0f, 0x60, 0x5a, 0x4b, - 0x41, 0x71, 0x46, 0x0d, 0x7a, 0x56, 0x6f, 0x89, 0xae, 0x0e, 0xb2, 0xae, 0x72, 0x65, 0x44, 0x8d, - 0xf7, 0x53, 0xc2, 0xd0, 0x0a, 0x0c, 0x87, 0xfb, 0x61, 0x3d, 0x12, 0x91, 0xd8, 0x72, 0xd2, 0x07, - 0xd5, 0x18, 0x8a, 0x96, 0xbd, 0x8e, 0x57, 0xc1, 0xb2, 0x2e, 0xaa, 0xc3, 0x8c, 0xa0, 0xb8, 0xbc, - 0xe3, 0x78, 0x2a, 0x19, 0x0b, 0xb7, 0x41, 0xbd, 0x72, 0xff, 0x60, 0x7e, 0x46, 0xb4, 0xac, 0x83, - 0x0f, 0x0f, 0xe6, 0xcf, 0x54, 0xfd, 0x46, 0x06, 0x04, 0x67, 0x51, 0xe3, 0x8b, 0xaf, 0x5e, 0xf7, - 0x5b, 0xed, 0x6a, 0xe0, 0x6f, 0xb9, 0x4d, 0xd2, 0x4d, 0xa1, 0x53, 0x33, 0x30, 0xc5, 0xe2, 0x33, - 0xca, 0x70, 0x82, 0x9a, 0xfd, 0xed, 0x8c, 0x9f, 0x61, 0xc9, 0x9a, 0xa3, 0x4e, 0x40, 0x50, 0x0b, - 0xc6, 0xdb, 0x6c, 0x9b, 0x88, 0xf8, 0xf9, 0x62, 0xad, 0xbf, 0xd0, 0xa7, 0x60, 0xe2, 0x2e, 0xbd, - 0x06, 0x94, 0xe0, 0x90, 0xbd, 0xf8, 0xaa, 0x3a, 0x39, 0x6c, 0x52, 0xb7, 0x7f, 0xec, 0x11, 0x76, - 0x23, 0xd6, 0xb8, 0xb4, 0x61, 0x58, 0x98, 0xbc, 0x8b, 0xa7, 0xd5, 0x5c, 0xbe, 0xd8, 0x2b, 0x9e, - 0x16, 0x61, 0x36, 0x8f, 0x65, 0x5d, 0xf4, 0x69, 0x98, 0xa0, 0x2f, 0x15, 0x2d, 0x0b, 0xca, 0xa9, - 0xfc, 0xd0, 0x04, 0x71, 0xf2, 0x13, 0x2d, 0xb7, 0x86, 0x5e, 0x19, 0x27, 0x88, 0xa1, 0xd7, 0x99, - 0x71, 0x86, 0x99, 0x60, 0xa5, 0x07, 0x69, 0xdd, 0x0e, 0x43, 0x92, 0xd5, 0x88, 0xe4, 0x25, 0x6f, - 0xb1, 0x1f, 0x6e, 0xf2, 0x16, 0x74, 0x03, 0xc6, 0x45, 0xc6, 0x62, 0xb1, 0x72, 0x8b, 0x86, 0x34, - 0x6e, 0x1c, 0xeb, 0xc0, 0xc3, 0x64, 0x01, 0x36, 0x2b, 0xa3, 0x6d, 0x38, 0xa7, 0x65, 0x10, 0xba, - 0x1a, 0x38, 0x4c, 0xa5, 0xee, 0xb2, 0xe3, 0x54, 0xbb, 0xab, 0x1f, 0xbf, 0x7f, 0x30, 0x7f, 0x6e, - 0xa3, 0x1b, 0x22, 0xee, 0x4e, 0x07, 0xdd, 0x84, 0xd3, 0xdc, 0xb1, 0xb6, 0x4c, 0x9c, 0x46, 0xd3, - 0xf5, 0x14, 0x33, 0xc0, 0xb7, 0xfc, 0xd9, 0xfb, 0x07, 0xf3, 0xa7, 0x17, 0xb3, 0x10, 0x70, 0x76, - 0x3d, 0xf4, 0x51, 0x28, 0x35, 0xbc, 0x50, 0x8c, 0xc1, 0x90, 0x91, 0xa4, 0xa9, 0x54, 0x5e, 0xaf, - 0xa9, 0xef, 0x8f, 0xff, 0xe0, 0xb8, 0x02, 0xda, 0xe6, 0x12, 0x5b, 0x25, 0x20, 0x19, 0x4e, 0x05, - 0x16, 0x4a, 0x8a, 0xda, 0x0c, 0xd7, 0x3a, 0xae, 0xaa, 0x50, 0x16, 0xe7, 0x86, 0xd7, 0x9d, 0x41, - 0x18, 0xbd, 0x06, 0x88, 0xbe, 0x20, 0xdc, 0x3a, 0x59, 0xac, 0xb3, 0xe4, 0x0c, 0x4c, 0xc0, 0x3d, - 0x62, 0x3a, 0x7b, 0xd5, 0x52, 0x18, 0x38, 0xa3, 0x16, 0xba, 0x46, 0x4f, 0x15, 0xbd, 0x54, 0x9c, - 0x5a, 0x2a, 0xa5, 0x5e, 0x99, 0xb4, 0x03, 0x52, 0x77, 0x22, 0xd2, 0x30, 0x29, 0xe2, 0x44, 0x3d, - 0xd4, 0x80, 0xc7, 0x9c, 0x4e, 0xe4, 0x33, 0x61, 0xb8, 0x89, 0xba, 0xe1, 0xef, 0x12, 0x8f, 0xe9, - 0xa1, 0x46, 0x96, 0x2e, 0x50, 0x6e, 0x63, 0xb1, 0x0b, 0x1e, 0xee, 0x4a, 0x85, 0x72, 0x89, 0x2a, - 0x87, 0x2e, 0x98, 0xe1, 0x92, 0x32, 0xf2, 0xe8, 0xbe, 0x08, 0xa3, 0x3b, 0x7e, 0x18, 0xad, 0x93, - 0xe8, 0xae, 0x1f, 0xec, 0x8a, 0xa8, 0x97, 0x71, 0xa4, 0xe4, 0x18, 0x84, 0x75, 0x3c, 0xfa, 0x0c, - 0x64, 0x56, 0x12, 0x95, 0x32, 0x53, 0x50, 0x8f, 0xc4, 0x67, 0xcc, 0x35, 0x5e, 0x8c, 0x25, 0x5c, - 0xa2, 0x56, 0xaa, 0xcb, 0x4c, 0xd9, 0x9c, 0x40, 0xad, 0x54, 0x97, 0xb1, 0x84, 0xd3, 0xe5, 0x1a, - 0xee, 0x38, 0x01, 0xa9, 0x06, 0x7e, 0x9d, 0x84, 0x5a, 0x7c, 0xee, 0x47, 0x79, 0x4c, 0x4f, 0xba, - 0x5c, 0x6b, 0x59, 0x08, 0x38, 0xbb, 0x1e, 0x22, 0xe9, 0xec, 0x59, 0x13, 0xf9, 0x5a, 0x82, 0x34, - 0x3f, 0xd3, 0x67, 0x02, 0x2d, 0x0f, 0xa6, 0x54, 0xde, 0x2e, 0x1e, 0xc5, 0x33, 0x9c, 0x9d, 0x64, - 0x6b, 0xbb, 0xff, 0x10, 0xa0, 0x4a, 0xef, 0x52, 0x49, 0x50, 0xc2, 0x29, 0xda, 0x46, 0x44, 0xac, - 0xa9, 0x9e, 0x11, 0xb1, 0x2e, 0x43, 0x29, 0xec, 0x6c, 0x36, 0xfc, 0x96, 0xe3, 0x7a, 0x4c, 0xd9, - 0xac, 0xbd, 0x47, 0x6a, 0x12, 0x80, 0x63, 0x1c, 0xb4, 0x0a, 0x23, 0x8e, 0x54, 0xaa, 0xa0, 0xfc, - 0x18, 0x28, 0x4a, 0x95, 0xc2, 0xc3, 0x02, 0x48, 0x35, 0x8a, 0xaa, 0x8b, 0x5e, 0x81, 0x71, 0xe1, - 0x18, 0x2a, 0x52, 0x46, 0xce, 0x98, 0xde, 0x3b, 0x35, 0x1d, 0x88, 0x4d, 0x5c, 0x74, 0x0b, 0x46, - 0x23, 0xbf, 0xc9, 0x5c, 0x50, 0x28, 0x9b, 0x77, 0x26, 0x3f, 0x9a, 0xd7, 0x86, 0x42, 0xd3, 0xe5, - 0x99, 0xaa, 0x2a, 0xd6, 0xe9, 0xa0, 0x0d, 0xbe, 0xde, 0x59, 0x9c, 0x6a, 0x12, 0xce, 0x3e, 0x92, - 0x7f, 0x27, 0xa9, 0x70, 0xd6, 0xe6, 0x76, 0x10, 0x35, 0xb1, 0x4e, 0x06, 0x5d, 0x85, 0xe9, 0x76, - 0xe0, 0xfa, 0x6c, 0x4d, 0x28, 0x7d, 0xda, 0xac, 0x99, 0x24, 0xa7, 0x9a, 0x44, 0xc0, 0xe9, 0x3a, - 0xcc, 0xaf, 0x57, 0x14, 0xce, 0x9e, 0xe5, 0x59, 0xa5, 0xf9, 0xf3, 0x8e, 0x97, 0x61, 0x05, 0x45, - 0x6b, 0xec, 0x24, 0xe6, 0x92, 0x89, 0xd9, 0xb9, 0xfc, 0xb0, 0x2b, 0xba, 0x04, 0x83, 0x33, 0xaf, - 0xea, 0x2f, 0x8e, 0x29, 0xa0, 0x86, 0x96, 0x7e, 0x90, 0xbe, 0x18, 0xc2, 0xd9, 0xc7, 0xba, 0x98, - 0xaa, 0x25, 0x9e, 0x17, 0x31, 0x43, 0x60, 0x14, 0x87, 0x38, 0x41, 0x13, 0x7d, 0x1c, 0xa6, 0x44, - 0xb0, 0xb8, 0x78, 0x98, 0xce, 0xc5, 0x86, 0xbd, 0x38, 0x01, 0xc3, 0x29, 0x6c, 0x1e, 0xbf, 0xdf, - 0xd9, 0x6c, 0x12, 0x71, 0xf4, 0xdd, 0x70, 0xbd, 0xdd, 0x70, 0xf6, 0x3c, 0x3b, 0x1f, 0x44, 0xfc, - 0xfe, 0x24, 0x14, 0x67, 0xd4, 0x40, 0x1b, 0x30, 0xd5, 0x0e, 0x08, 0x69, 0x31, 0x46, 0x5f, 0xdc, - 0x67, 0xf3, 0xdc, 0xad, 0x9d, 0xf6, 0xa4, 0x9a, 0x80, 0x1d, 0x66, 0x94, 0xe1, 0x14, 0x05, 0x74, - 0x17, 0x46, 0xfc, 0x3d, 0x12, 0xec, 0x10, 0xa7, 0x31, 0x7b, 0xa1, 0x8b, 0xa1, 0xb9, 0xb8, 0xdc, - 0x6e, 0x0a, 0xdc, 0x84, 0x0e, 0x5e, 0x16, 0xf7, 0xd6, 0xc1, 0xcb, 0xc6, 0xd0, 0x0f, 0x59, 0x70, - 0x56, 0x8a, 0xed, 0x6b, 0x6d, 0x3a, 0xea, 0xcb, 0xbe, 0x17, 0x46, 0x01, 0x77, 0xc4, 0x7e, 0x3c, - 0xdf, 0x39, 0x79, 0x23, 0xa7, 0x92, 0x12, 0x8e, 0x9e, 0xcd, 0xc3, 0x08, 0x71, 0x7e, 0x8b, 0x68, - 0x19, 0xa6, 0x43, 0x12, 0xc9, 0xc3, 0x68, 0x31, 0x5c, 0x7d, 0xbd, 0xbc, 0x3e, 0xfb, 0x04, 0xf7, - 0x22, 0xa7, 0x9b, 0xa1, 0x96, 0x04, 0xe2, 0x34, 0xfe, 0xdc, 0xb7, 0xc2, 0x74, 0xea, 0xfa, 0x3f, - 0x4a, 0x5e, 0x92, 0xb9, 0x5d, 0x18, 0x37, 0x86, 0xf8, 0xa1, 0xea, 0x70, 0xff, 0xcd, 0x30, 0x94, - 0x94, 0x7e, 0x0f, 0x5d, 0x36, 0xd5, 0xb6, 0x67, 0x93, 0x6a, 0xdb, 0x11, 0xfa, 0xae, 0xd7, 0x35, - 0xb5, 0x1b, 0x19, 0xb1, 0xb3, 0xf2, 0x36, 0x74, 0xff, 0x4e, 0xd1, 0x9a, 0xb8, 0xb6, 0xd8, 0xb7, - 0xfe, 0x77, 0xa0, 0xab, 0x04, 0xf8, 0x2a, 0x4c, 0x7b, 0x3e, 0xe3, 0x39, 0x49, 0x43, 0x32, 0x14, - 0x8c, 0x6f, 0x28, 0xe9, 0xc1, 0x28, 0x12, 0x08, 0x38, 0x5d, 0x87, 0x36, 0xc8, 0x2f, 0xfe, 0xa4, - 0xc8, 0x99, 0xf3, 0x05, 0x58, 0x40, 0xd1, 0x13, 0x30, 0xd8, 0xf6, 0x1b, 0x95, 0xaa, 0xe0, 0x37, - 0xb5, 0x88, 0x8d, 0x8d, 0x4a, 0x15, 0x73, 0x18, 0x5a, 0x84, 0x21, 0xf6, 0x23, 0x9c, 0x1d, 0xcb, - 0x8f, 0x3a, 0xc0, 0x6a, 0x68, 0x59, 0x5f, 0x58, 0x05, 0x2c, 0x2a, 0x32, 0xd1, 0x17, 0x65, 0xd2, - 0x99, 0xe8, 0x6b, 0xf8, 0x01, 0x45, 0x5f, 0x92, 0x00, 0x8e, 0x69, 0xa1, 0x7b, 0x70, 0xda, 0x78, - 0x18, 0xf1, 0x25, 0x42, 0x42, 0xe1, 0xf9, 0xfc, 0x44, 0xd7, 0x17, 0x91, 0xd0, 0x17, 0x9f, 0x13, - 0x9d, 0x3e, 0x5d, 0xc9, 0xa2, 0x84, 0xb3, 0x1b, 0x40, 0x4d, 0x98, 0xae, 0xa7, 0x5a, 0x1d, 0xe9, - 0xbf, 0x55, 0x35, 0xa1, 0xe9, 0x16, 0xd3, 0x84, 0xd1, 0x2b, 0x30, 0xf2, 0x96, 0x1f, 0xb2, 0xb3, - 0x5a, 0xf0, 0xc8, 0xd2, 0x6d, 0x76, 0xe4, 0xf5, 0x9b, 0x35, 0x56, 0x7e, 0x78, 0x30, 0x3f, 0x5a, - 0xf5, 0x1b, 0xf2, 0x2f, 0x56, 0x15, 0xd0, 0xf7, 0x5a, 0x30, 0x97, 0x7e, 0x79, 0xa9, 0x4e, 0x8f, - 0xf7, 0xdf, 0x69, 0x5b, 0x34, 0x3a, 0xb7, 0x92, 0x4b, 0x0e, 0x77, 0x69, 0xca, 0xfe, 0x25, 0xae, - 0xdb, 0x15, 0x1a, 0x20, 0x12, 0x76, 0x9a, 0x27, 0x91, 0xec, 0x72, 0xc5, 0x50, 0x4e, 0x3d, 0xb0, - 0xfd, 0xc0, 0xbf, 0xb4, 0x98, 0xfd, 0xc0, 0x09, 0x3a, 0x0a, 0xbc, 0x0e, 0x23, 0x91, 0x4c, 0x59, - 0xda, 0x25, 0x3f, 0xa7, 0xd6, 0x29, 0x66, 0x43, 0xa1, 0x38, 0x56, 0x95, 0x9d, 0x54, 0x91, 0xb1, - 0xff, 0x09, 0x9f, 0x01, 0x09, 0x39, 0x01, 0x1d, 0x40, 0xd9, 0xd4, 0x01, 0xcc, 0xf7, 0xf8, 0x82, - 0x1c, 0x5d, 0xc0, 0x3f, 0x36, 0xfb, 0xcd, 0x24, 0x35, 0xef, 0x76, 0xc3, 0x15, 0xfb, 0x0b, 0x16, - 0x40, 0x1c, 0x10, 0x97, 0xc9, 0x97, 0xfd, 0x40, 0x66, 0x3a, 0xcc, 0xca, 0xe9, 0xf3, 0x12, 0xe5, - 0x51, 0xfd, 0xc8, 0xaf, 0xfb, 0x4d, 0xa1, 0xe1, 0x7a, 0x2c, 0x56, 0x43, 0xf0, 0xf2, 0x43, 0xed, - 0x37, 0x56, 0xd8, 0x68, 0x5e, 0x86, 0xdf, 0x2a, 0xc6, 0x8a, 0x31, 0x23, 0xf4, 0xd6, 0x8f, 0x58, - 0x70, 0x2a, 0xcb, 0xea, 0x94, 0xbe, 0x78, 0xb8, 0xcc, 0x4a, 0x19, 0x15, 0xa9, 0xd9, 0xbc, 0x2d, - 0xca, 0xb1, 0xc2, 0xe8, 0x3b, 0x7f, 0xd7, 0xd1, 0x22, 0xd1, 0xde, 0x84, 0xf1, 0x6a, 0x40, 0xb4, - 0xcb, 0xf5, 0x55, 0xee, 0xd2, 0xcd, 0xfb, 0xf3, 0xcc, 0x91, 0xdd, 0xb9, 0xed, 0x2f, 0x17, 0xe0, - 0x14, 0xb7, 0x0a, 0x58, 0xdc, 0xf3, 0xdd, 0x46, 0xd5, 0x6f, 0x88, 0xdc, 0x6b, 0x9f, 0x82, 0xb1, - 0xb6, 0x26, 0x68, 0xec, 0x16, 0x55, 0x51, 0x17, 0x48, 0xc6, 0xa2, 0x11, 0xbd, 0x14, 0x1b, 0xb4, - 0x50, 0x03, 0xc6, 0xc8, 0x9e, 0x5b, 0x57, 0xaa, 0xe5, 0xc2, 0x91, 0x2f, 0x3a, 0xd5, 0xca, 0x8a, - 0x46, 0x07, 0x1b, 0x54, 0x1f, 0x42, 0x56, 0x5d, 0xfb, 0x47, 0x2d, 0x78, 0x24, 0x27, 0x06, 0x23, - 0x6d, 0xee, 0x2e, 0xb3, 0xbf, 0x10, 0xcb, 0x56, 0x35, 0xc7, 0xad, 0x32, 0xb0, 0x80, 0xa2, 0x4f, - 0x00, 0x70, 0xab, 0x0a, 0xfa, 0xe4, 0xee, 0x15, 0xac, 0xce, 0x88, 0xb3, 0xa5, 0x85, 0x4c, 0x92, - 0xf5, 0xb1, 0x46, 0xcb, 0xfe, 0xa9, 0x22, 0x0c, 0xf2, 0x04, 0xe9, 0xab, 0x30, 0xbc, 0xc3, 0x33, - 0x52, 0xf4, 0x93, 0xfc, 0x22, 0x16, 0x86, 0xf0, 0x02, 0x2c, 0x2b, 0xa3, 0x35, 0x98, 0xe1, 0x19, - 0x3d, 0x9a, 0x65, 0xd2, 0x74, 0xf6, 0xa5, 0xe4, 0x8e, 0x67, 0xc3, 0x54, 0x12, 0xcc, 0x4a, 0x1a, - 0x05, 0x67, 0xd5, 0x43, 0xaf, 0xc2, 0x04, 0x7d, 0x49, 0xf9, 0x9d, 0x48, 0x52, 0xe2, 0xb9, 0x3c, - 0xd4, 0xd3, 0x6d, 0xc3, 0x80, 0xe2, 0x04, 0x36, 0x7d, 0xcc, 0xb7, 0x53, 0x32, 0xca, 0xc1, 0xf8, - 0x31, 0x6f, 0xca, 0x25, 0x4d, 0x5c, 0x66, 0x6e, 0xda, 0x61, 0xc6, 0xb5, 0x1b, 0x3b, 0x01, 0x09, - 0x77, 0xfc, 0x66, 0x83, 0x31, 0x7d, 0x83, 0x9a, 0xb9, 0x69, 0x02, 0x8e, 0x53, 0x35, 0x28, 0x95, - 0x2d, 0xc7, 0x6d, 0x76, 0x02, 0x12, 0x53, 0x19, 0x32, 0xa9, 0xac, 0x26, 0xe0, 0x38, 0x55, 0x83, - 0xae, 0xa3, 0xd3, 0xd5, 0xc0, 0xa7, 0x07, 0xa9, 0x0c, 0x2c, 0xa3, 0x6c, 0x88, 0x87, 0xa5, 0x0f, - 0x6c, 0x97, 0x10, 0x6c, 0xc2, 0xca, 0x92, 0x53, 0x30, 0x0c, 0x08, 0x6a, 0xc2, 0xfb, 0x55, 0x52, - 0x41, 0x57, 0x60, 0x54, 0xe4, 0x69, 0x60, 0xa6, 0xae, 0x7c, 0xea, 0x98, 0xc1, 0x43, 0x39, 0x2e, - 0xc6, 0x3a, 0x8e, 0xfd, 0x7d, 0x05, 0x98, 0xc9, 0xf0, 0x55, 0xe0, 0x47, 0xd5, 0xb6, 0x1b, 0x46, - 0x2a, 0xe3, 0x9f, 0x76, 0x54, 0xf1, 0x72, 0xac, 0x30, 0xe8, 0x7e, 0xe0, 0x87, 0x61, 0xf2, 0x00, - 0x14, 0xb6, 0xc0, 0x02, 0x7a, 0xc4, 0xdc, 0x79, 0x17, 0x60, 0xa0, 0x13, 0x12, 0x19, 0x3c, 0x51, - 0x5d, 0x0d, 0x4c, 0x0f, 0xc6, 0x20, 0x94, 0x55, 0xdf, 0x56, 0x2a, 0x25, 0x8d, 0x55, 0xe7, 0x4a, - 0x25, 0x0e, 0xa3, 0x9d, 0x8b, 0x88, 0xe7, 0x78, 0x91, 0x60, 0xe8, 0xe3, 0x28, 0x60, 0xac, 0x14, - 0x0b, 0xa8, 0xfd, 0xc5, 0x22, 0x9c, 0xcd, 0xf5, 0x5e, 0xa2, 0x5d, 0x6f, 0xf9, 0x9e, 0x1b, 0xf9, - 0xca, 0x92, 0x84, 0x47, 0xfe, 0x22, 0xed, 0x9d, 0x35, 0x51, 0x8e, 0x15, 0x06, 0xba, 0x08, 0x83, - 0x4c, 0x8a, 0x96, 0xca, 0x7d, 0xb8, 0x54, 0xe6, 0xa1, 0x60, 0x38, 0xb8, 0xef, 0xbc, 0xb2, 0x4f, - 0xd0, 0x5b, 0xd2, 0x6f, 0x26, 0x0f, 0x2d, 0xda, 0x5d, 0xdf, 0x6f, 0x62, 0x06, 0x44, 0x1f, 0x10, - 0xe3, 0x95, 0x30, 0x9d, 0xc0, 0x4e, 0xc3, 0x0f, 0xb5, 0x41, 0x7b, 0x0a, 0x86, 0x77, 0xc9, 0x7e, - 0xe0, 0x7a, 0xdb, 0x49, 0x93, 0x9a, 0xeb, 0xbc, 0x18, 0x4b, 0xb8, 0x99, 0xc6, 0x6a, 0xf8, 0xb8, - 0x13, 0xc2, 0x8e, 0xf4, 0xbc, 0x02, 0x7f, 0xa0, 0x08, 0x93, 0x78, 0xa9, 0xfc, 0xde, 0x44, 0xdc, - 0x4a, 0x4f, 0xc4, 0x71, 0x27, 0x84, 0xed, 0x3d, 0x1b, 0x3f, 0x6f, 0xc1, 0x24, 0xcb, 0x16, 0x21, - 0x62, 0x46, 0xb9, 0xbe, 0x77, 0x02, 0xec, 0xe6, 0x13, 0x30, 0x18, 0xd0, 0x46, 0x93, 0x49, 0x0f, - 0x59, 0x4f, 0x30, 0x87, 0xa1, 0xc7, 0x60, 0x80, 0x75, 0x81, 0x4e, 0xde, 0x18, 0xcf, 0x17, 0x55, - 0x76, 0x22, 0x07, 0xb3, 0x52, 0x16, 0x08, 0x05, 0x93, 0x76, 0xd3, 0xe5, 0x9d, 0x8e, 0x75, 0x9c, - 0xef, 0x0e, 0xbf, 0xe6, 0xcc, 0xae, 0xbd, 0xb3, 0x40, 0x28, 0xd9, 0x24, 0xbb, 0x3f, 0xe5, 0xfe, - 0xa8, 0x00, 0xe7, 0x33, 0xeb, 0xf5, 0x1d, 0x08, 0xa5, 0x7b, 0xed, 0x87, 0x99, 0x0f, 0xa0, 0x78, - 0x82, 0x06, 0x8b, 0x03, 0xfd, 0x72, 0x98, 0x83, 0x7d, 0xc4, 0x27, 0xc9, 0x1c, 0xb2, 0x77, 0x49, - 0x7c, 0x92, 0xcc, 0xbe, 0xe5, 0x3c, 0x45, 0xff, 0xa2, 0x90, 0xf3, 0x2d, 0xec, 0x51, 0x7a, 0x89, - 0x9e, 0x33, 0x0c, 0x18, 0xca, 0x87, 0x1e, 0x3f, 0x63, 0x78, 0x19, 0x56, 0x50, 0xb4, 0x08, 0x93, - 0x2d, 0xd7, 0xa3, 0x87, 0xcf, 0xbe, 0xc9, 0xf8, 0xa9, 0xf0, 0x51, 0x6b, 0x26, 0x18, 0x27, 0xf1, - 0x91, 0xab, 0xc5, 0x2e, 0x29, 0xe4, 0xa7, 0x11, 0xcf, 0xed, 0xed, 0x82, 0xa9, 0xff, 0x55, 0xa3, - 0x98, 0x11, 0xc7, 0x64, 0x4d, 0x93, 0x45, 0x14, 0xfb, 0x97, 0x45, 0x8c, 0x65, 0xcb, 0x21, 0xe6, - 0x5e, 0x81, 0xf1, 0x07, 0x16, 0x3e, 0xdb, 0x5f, 0x2d, 0xc2, 0xa3, 0x5d, 0xb6, 0x3d, 0x3f, 0xeb, - 0x8d, 0x39, 0xd0, 0xce, 0xfa, 0xd4, 0x3c, 0x54, 0xe1, 0xd4, 0x56, 0xa7, 0xd9, 0xdc, 0x67, 0x3e, - 0x01, 0xa4, 0x21, 0x31, 0x04, 0x4f, 0x29, 0x1f, 0xe0, 0xa7, 0x56, 0x33, 0x70, 0x70, 0x66, 0x4d, - 0xca, 0xd0, 0xd3, 0x9b, 0x64, 0x5f, 0x91, 0x4a, 0x30, 0xf4, 0x58, 0x07, 0x62, 0x13, 0x17, 0x5d, - 0x85, 0x69, 0x67, 0xcf, 0x71, 0x79, 0x00, 0x58, 0x49, 0x80, 0x73, 0xf4, 0x4a, 0x66, 0xb8, 0x98, - 0x44, 0xc0, 0xe9, 0x3a, 0xe8, 0x35, 0x40, 0xfe, 0x26, 0xb3, 0xf6, 0x6d, 0x5c, 0x25, 0x9e, 0x50, - 0xd3, 0xb1, 0xb9, 0x2b, 0xc6, 0x47, 0xc2, 0xcd, 0x14, 0x06, 0xce, 0xa8, 0x95, 0x88, 0x05, 0x32, - 0x94, 0x1f, 0x0b, 0xa4, 0xfb, 0xb9, 0xd8, 0x33, 0x15, 0xc5, 0x7f, 0xb1, 0xe8, 0xf5, 0xc5, 0x99, - 0x7c, 0x33, 0xa4, 0xdd, 0x2b, 0xcc, 0xcc, 0x8e, 0xcb, 0x13, 0xb5, 0x08, 0x16, 0xa7, 0x35, 0x33, - 0xbb, 0x18, 0x88, 0x4d, 0x5c, 0xbe, 0x20, 0xc2, 0xd8, 0x71, 0xd2, 0x60, 0xf1, 0x45, 0xdc, 0x1d, - 0x85, 0x81, 0x3e, 0x09, 0xc3, 0x0d, 0x77, 0xcf, 0x0d, 0x85, 0x34, 0xe5, 0xc8, 0xaa, 0x8b, 0xf8, - 0x1c, 0x2c, 0x73, 0x32, 0x58, 0xd2, 0xb3, 0x7f, 0xa0, 0x00, 0xe3, 0xb2, 0xc5, 0xd7, 0x3b, 0x7e, - 0xe4, 0x9c, 0xc0, 0xb5, 0x7c, 0xd5, 0xb8, 0x96, 0x3f, 0xd0, 0x2d, 0xf8, 0x10, 0xeb, 0x52, 0xee, - 0x75, 0x7c, 0x33, 0x71, 0x1d, 0x3f, 0xd9, 0x9b, 0x54, 0xf7, 0x6b, 0xf8, 0x9f, 0x5a, 0x30, 0x6d, - 0xe0, 0x9f, 0xc0, 0x6d, 0xb0, 0x6a, 0xde, 0x06, 0x8f, 0xf7, 0xfc, 0x86, 0x9c, 0x5b, 0xe0, 0xbb, - 0x8b, 0x89, 0xbe, 0xb3, 0xd3, 0xff, 0x2d, 0x18, 0xd8, 0x71, 0x82, 0x46, 0xb7, 0x60, 0xeb, 0xa9, - 0x4a, 0x0b, 0xd7, 0x9c, 0x40, 0xe8, 0x29, 0x9f, 0x51, 0x59, 0xbc, 0x9d, 0xa0, 0xb7, 0x8e, 0x92, - 0x35, 0x85, 0x5e, 0x82, 0xa1, 0xb0, 0xee, 0xb7, 0x95, 0x15, 0xff, 0x05, 0x9e, 0xe1, 0x9b, 0x96, - 0x1c, 0x1e, 0xcc, 0x23, 0xb3, 0x39, 0x5a, 0x8c, 0x05, 0x3e, 0xfa, 0x14, 0x8c, 0xb3, 0x5f, 0xca, - 0x68, 0xa8, 0x98, 0x9f, 0x98, 0xa9, 0xa6, 0x23, 0x72, 0x8b, 0x3a, 0xa3, 0x08, 0x9b, 0xa4, 0xe6, - 0xb6, 0xa1, 0xa4, 0x3e, 0xeb, 0xa1, 0xea, 0x06, 0xff, 0x63, 0x11, 0x66, 0x32, 0xd6, 0x1c, 0x0a, - 0x8d, 0x99, 0xb8, 0xd2, 0xe7, 0x52, 0x7d, 0x87, 0x73, 0x11, 0xb2, 0xd7, 0x50, 0x43, 0xac, 0xad, - 0xbe, 0x1b, 0xbd, 0x15, 0x92, 0x64, 0xa3, 0xb4, 0xa8, 0x77, 0xa3, 0xb4, 0xb1, 0x13, 0x1b, 0x6a, - 0xda, 0x90, 0xea, 0xe9, 0x43, 0x9d, 0xd3, 0x3f, 0x2d, 0xc2, 0xa9, 0xac, 0x78, 0x68, 0xe8, 0x73, - 0x89, 0x54, 0x7f, 0x2f, 0xf4, 0x1b, 0x49, 0x8d, 0xe7, 0xff, 0xe3, 0x32, 0xe0, 0xa5, 0x05, 0x33, - 0xf9, 0x5f, 0xcf, 0x61, 0x16, 0x6d, 0xb2, 0xa0, 0x00, 0x01, 0x4f, 0xd1, 0x28, 0x8f, 0x8f, 0x0f, - 0xf7, 0xdd, 0x01, 0x91, 0xdb, 0x31, 0x4c, 0x18, 0x24, 0xc8, 0xe2, 0xde, 0x06, 0x09, 0xb2, 0xe5, - 0x39, 0x17, 0x46, 0xb5, 0xaf, 0x79, 0xa8, 0x33, 0xbe, 0x4b, 0x6f, 0x2b, 0xad, 0xdf, 0x0f, 0x75, - 0xd6, 0x7f, 0xd4, 0x82, 0x84, 0x8d, 0xba, 0x12, 0x8b, 0x59, 0xb9, 0x62, 0xb1, 0x0b, 0x30, 0x10, - 0xf8, 0x4d, 0x92, 0xcc, 0x89, 0x87, 0xfd, 0x26, 0xc1, 0x0c, 0x42, 0x31, 0xa2, 0x58, 0xd8, 0x31, - 0xa6, 0x3f, 0xe4, 0xc4, 0x13, 0xed, 0x09, 0x18, 0x6c, 0x92, 0x3d, 0xd2, 0x4c, 0xa6, 0x2e, 0xb9, - 0x41, 0x0b, 0x31, 0x87, 0xd9, 0x3f, 0x3f, 0x00, 0xe7, 0xba, 0x86, 0xd5, 0xa0, 0xcf, 0xa1, 0x6d, - 0x27, 0x22, 0x77, 0x9d, 0xfd, 0x64, 0x8e, 0x81, 0xab, 0xbc, 0x18, 0x4b, 0x38, 0xf3, 0x22, 0xe2, - 0xa1, 0x82, 0x13, 0x42, 0x44, 0x11, 0x21, 0x58, 0x40, 0x4d, 0xa1, 0x54, 0xf1, 0x38, 0x84, 0x52, - 0xcf, 0x01, 0x84, 0x61, 0x93, 0x5b, 0xf2, 0x34, 0x84, 0x7b, 0x52, 0x1c, 0x52, 0xba, 0x76, 0x43, - 0x40, 0xb0, 0x86, 0x85, 0xca, 0x30, 0xd5, 0x0e, 0xfc, 0x88, 0xcb, 0x64, 0xcb, 0xdc, 0xd8, 0x6d, - 0xd0, 0x8c, 0x68, 0x50, 0x4d, 0xc0, 0x71, 0xaa, 0x06, 0x7a, 0x11, 0x46, 0x45, 0x94, 0x83, 0xaa, - 0xef, 0x37, 0x85, 0x18, 0x48, 0xd9, 0x7f, 0xd5, 0x62, 0x10, 0xd6, 0xf1, 0xb4, 0x6a, 0x4c, 0xd0, - 0x3b, 0x9c, 0x59, 0x8d, 0x0b, 0x7b, 0x35, 0xbc, 0x44, 0x6c, 0xc4, 0x91, 0xbe, 0x62, 0x23, 0xc6, - 0x82, 0xb1, 0x52, 0xdf, 0xba, 0x2d, 0xe8, 0x29, 0x4a, 0xfa, 0x99, 0x01, 0x98, 0x11, 0x0b, 0xe7, - 0x61, 0x2f, 0x97, 0x5b, 0xe9, 0xe5, 0x72, 0x1c, 0xa2, 0xb3, 0xf7, 0xd6, 0xcc, 0x49, 0xaf, 0x99, - 0x1f, 0xb4, 0xc0, 0x64, 0xaf, 0xd0, 0x5f, 0xca, 0x4d, 0xd2, 0xf2, 0x62, 0x2e, 0xbb, 0xd6, 0x90, - 0x17, 0xc8, 0x3b, 0x4c, 0xd7, 0x62, 0xff, 0x67, 0x0b, 0x1e, 0xef, 0x49, 0x11, 0xad, 0x40, 0x89, - 0xf1, 0x80, 0xda, 0xeb, 0xec, 0x49, 0x65, 0x0c, 0x2b, 0x01, 0x39, 0x2c, 0x69, 0x5c, 0x13, 0xad, - 0xa4, 0xb2, 0xe1, 0x3c, 0x95, 0x91, 0x0d, 0xe7, 0xb4, 0x31, 0x3c, 0x0f, 0x98, 0x0e, 0xe7, 0xfb, - 0xe9, 0x8d, 0x63, 0x38, 0xa2, 0xa0, 0x0f, 0x1b, 0x62, 0x3f, 0x3b, 0x21, 0xf6, 0x43, 0x26, 0xb6, - 0x76, 0x87, 0x7c, 0x1c, 0xa6, 0x58, 0xf8, 0x23, 0x66, 0x9a, 0x2d, 0x5c, 0x64, 0x0a, 0xb1, 0xf9, - 0xe5, 0x8d, 0x04, 0x0c, 0xa7, 0xb0, 0xed, 0x3f, 0x2c, 0xc2, 0x10, 0xdf, 0x7e, 0x27, 0xf0, 0x26, - 0x7c, 0x1a, 0x4a, 0x6e, 0xab, 0xd5, 0xe1, 0x09, 0x4e, 0x06, 0xb9, 0x5f, 0x2c, 0x9d, 0xa7, 0x8a, - 0x2c, 0xc4, 0x31, 0x1c, 0xad, 0x0a, 0x89, 0x73, 0x97, 0x08, 0x8b, 0xbc, 0xe3, 0x0b, 0x65, 0x27, - 0x72, 0x38, 0x83, 0xa3, 0xee, 0xd9, 0x58, 0x36, 0x8d, 0x3e, 0x03, 0x10, 0x46, 0x81, 0xeb, 0x6d, - 0xd3, 0x32, 0x11, 0x50, 0xf4, 0x83, 0x5d, 0xa8, 0xd5, 0x14, 0x32, 0xa7, 0x19, 0x9f, 0x39, 0x0a, - 0x80, 0x35, 0x8a, 0x68, 0xc1, 0xb8, 0xe9, 0xe7, 0x12, 0x73, 0x07, 0x9c, 0x6a, 0x3c, 0x67, 0x73, - 0x1f, 0x81, 0x92, 0x22, 0xde, 0x4b, 0xfe, 0x34, 0xa6, 0xb3, 0x45, 0x1f, 0x83, 0xc9, 0x44, 0xdf, - 0x8e, 0x24, 0xbe, 0xfa, 0x05, 0x0b, 0x26, 0x79, 0x67, 0x56, 0xbc, 0x3d, 0x71, 0x1b, 0xbc, 0x0d, - 0xa7, 0x9a, 0x19, 0xa7, 0xb2, 0x98, 0xfe, 0xfe, 0x4f, 0x71, 0x25, 0xae, 0xca, 0x82, 0xe2, 0xcc, - 0x36, 0xd0, 0x25, 0xba, 0xe3, 0xe8, 0xa9, 0xeb, 0x34, 0x85, 0x9b, 0xec, 0x18, 0xdf, 0x6d, 0xbc, - 0x0c, 0x2b, 0xa8, 0xfd, 0x3b, 0x16, 0x4c, 0xf3, 0x9e, 0x5f, 0x27, 0xfb, 0xea, 0x6c, 0xfa, 0x7a, - 0xf6, 0x5d, 0xa4, 0xd6, 0x2a, 0xe4, 0xa4, 0xd6, 0xd2, 0x3f, 0xad, 0xd8, 0xf5, 0xd3, 0xbe, 0x6c, - 0x81, 0x58, 0x21, 0x27, 0x20, 0x84, 0xf8, 0x56, 0x53, 0x08, 0x31, 0x97, 0xbf, 0x09, 0x72, 0xa4, - 0x0f, 0x7f, 0x6e, 0xc1, 0x14, 0x47, 0x88, 0xb5, 0xe5, 0x5f, 0xd7, 0x79, 0xe8, 0x27, 0x01, 0xef, - 0x75, 0xb2, 0xbf, 0xe1, 0x57, 0x9d, 0x68, 0x27, 0xfb, 0xa3, 0x8c, 0xc9, 0x1a, 0xe8, 0x3a, 0x59, - 0x0d, 0xb9, 0x81, 0x8e, 0x90, 0xd5, 0xfb, 0xc8, 0x99, 0x27, 0xec, 0xaf, 0x59, 0x80, 0x78, 0x33, - 0x06, 0xe3, 0x46, 0xd9, 0x21, 0x56, 0xaa, 0x5d, 0x74, 0xf1, 0xd1, 0xa4, 0x20, 0x58, 0xc3, 0x3a, - 0x96, 0xe1, 0x49, 0x98, 0x3c, 0x14, 0x7b, 0x9b, 0x3c, 0x1c, 0x61, 0x44, 0xff, 0xed, 0x10, 0x24, - 0x9d, 0x71, 0xd0, 0x6d, 0x18, 0xab, 0x3b, 0x6d, 0x67, 0xd3, 0x6d, 0xba, 0x91, 0x4b, 0xc2, 0x6e, - 0xb6, 0x52, 0xcb, 0x1a, 0x9e, 0x50, 0x52, 0x6b, 0x25, 0xd8, 0xa0, 0x83, 0x16, 0x00, 0xda, 0x81, - 0xbb, 0xe7, 0x36, 0xc9, 0x36, 0x93, 0x95, 0x30, 0xc7, 0x7c, 0x6e, 0x00, 0x24, 0x4b, 0xb1, 0x86, - 0x91, 0xe1, 0xf9, 0x5c, 0x7c, 0xc8, 0x9e, 0xcf, 0x70, 0x62, 0x9e, 0xcf, 0x03, 0x47, 0xf2, 0x7c, - 0x1e, 0x39, 0xb2, 0xe7, 0xf3, 0x60, 0x5f, 0x9e, 0xcf, 0x18, 0xce, 0x48, 0xde, 0x93, 0xfe, 0x5f, - 0x75, 0x9b, 0x44, 0x3c, 0x38, 0x78, 0x34, 0x81, 0xb9, 0xfb, 0x07, 0xf3, 0x67, 0x70, 0x26, 0x06, - 0xce, 0xa9, 0x89, 0x3e, 0x01, 0xb3, 0x4e, 0xb3, 0xe9, 0xdf, 0x55, 0x93, 0xba, 0x12, 0xd6, 0x9d, - 0x26, 0x57, 0x42, 0x0c, 0x33, 0xaa, 0x8f, 0xdd, 0x3f, 0x98, 0x9f, 0x5d, 0xcc, 0xc1, 0xc1, 0xb9, - 0xb5, 0xd1, 0x47, 0xa1, 0xd4, 0x0e, 0xfc, 0xfa, 0x9a, 0xe6, 0x31, 0x78, 0x9e, 0x0e, 0x60, 0x55, - 0x16, 0x1e, 0x1e, 0xcc, 0x8f, 0xab, 0x3f, 0xec, 0xc2, 0x8f, 0x2b, 0x64, 0xb8, 0x32, 0x8f, 0x1e, - 0xab, 0x2b, 0xf3, 0x2e, 0xcc, 0xd4, 0x48, 0xe0, 0xb2, 0x1c, 0xe0, 0x8d, 0xf8, 0x7c, 0xda, 0x80, - 0x52, 0x90, 0x38, 0x91, 0xfb, 0x8a, 0x7a, 0xa8, 0xa5, 0x00, 0x90, 0x27, 0x70, 0x4c, 0xc8, 0xfe, - 0x3f, 0x16, 0x0c, 0x0b, 0xe7, 0x9b, 0x13, 0xe0, 0x1a, 0x17, 0x0d, 0x4d, 0xc2, 0x7c, 0xf6, 0x80, - 0xb1, 0xce, 0xe4, 0xea, 0x10, 0x2a, 0x09, 0x1d, 0xc2, 0xe3, 0xdd, 0x88, 0x74, 0xd7, 0x1e, 0xfc, - 0xcd, 0x22, 0xe5, 0xde, 0x0d, 0x37, 0xd0, 0x87, 0x3f, 0x04, 0xeb, 0x30, 0x1c, 0x0a, 0x37, 0xc4, - 0x42, 0xbe, 0xdd, 0x7c, 0x72, 0x12, 0x63, 0x3b, 0x36, 0xe1, 0x78, 0x28, 0x89, 0x64, 0xfa, 0x37, - 0x16, 0x1f, 0xa2, 0x7f, 0x63, 0x2f, 0x47, 0xd9, 0x81, 0xe3, 0x70, 0x94, 0xb5, 0xbf, 0xc2, 0x6e, - 0x4e, 0xbd, 0xfc, 0x04, 0x98, 0xaa, 0xab, 0xe6, 0x1d, 0x6b, 0x77, 0x59, 0x59, 0xa2, 0x53, 0x39, - 0xcc, 0xd5, 0xcf, 0x59, 0x70, 0x2e, 0xe3, 0xab, 0x34, 0x4e, 0xeb, 0x19, 0x18, 0x71, 0x3a, 0x0d, - 0x57, 0xed, 0x65, 0x4d, 0x9f, 0xb8, 0x28, 0xca, 0xb1, 0xc2, 0x40, 0xcb, 0x30, 0x4d, 0xee, 0xb5, - 0x5d, 0xae, 0x4a, 0xd5, 0x8d, 0x4d, 0x8b, 0xdc, 0x63, 0x6b, 0x25, 0x09, 0xc4, 0x69, 0x7c, 0x15, - 0x9c, 0xa4, 0x98, 0x1b, 0x9c, 0xe4, 0x1f, 0x58, 0x30, 0xaa, 0x1c, 0xf1, 0x1e, 0xfa, 0x68, 0x7f, - 0xdc, 0x1c, 0xed, 0x47, 0xbb, 0x8c, 0x76, 0xce, 0x30, 0xff, 0x56, 0x41, 0xf5, 0xb7, 0xea, 0x07, - 0x51, 0x1f, 0x1c, 0xdc, 0x83, 0x9b, 0xc7, 0x5f, 0x81, 0x51, 0xa7, 0xdd, 0x96, 0x00, 0x69, 0x83, - 0xc6, 0x62, 0xd8, 0xc6, 0xc5, 0x58, 0xc7, 0x51, 0xd6, 0xfa, 0xc5, 0x5c, 0x6b, 0xfd, 0x06, 0x40, - 0xe4, 0x04, 0xdb, 0x24, 0xa2, 0x65, 0x22, 0x90, 0x58, 0xfe, 0x79, 0xd3, 0x89, 0xdc, 0xe6, 0x82, - 0xeb, 0x45, 0x61, 0x14, 0x2c, 0x54, 0xbc, 0xe8, 0x66, 0xc0, 0x9f, 0x90, 0x5a, 0xa4, 0x1e, 0x45, - 0x0b, 0x6b, 0x74, 0xa5, 0xd3, 0x39, 0x6b, 0x63, 0xd0, 0x34, 0x66, 0x58, 0x17, 0xe5, 0x58, 0x61, - 0xd8, 0x1f, 0x61, 0xb7, 0x0f, 0x1b, 0xd3, 0xa3, 0x85, 0xb6, 0xf9, 0xf2, 0xa8, 0x9a, 0x0d, 0xa6, - 0xc9, 0x2c, 0xeb, 0x01, 0x74, 0xba, 0x1f, 0xf6, 0xb4, 0x61, 0xdd, 0x77, 0x2c, 0x8e, 0xb2, 0x83, - 0xbe, 0x2d, 0x65, 0xa0, 0xf2, 0x6c, 0x8f, 0x5b, 0xe3, 0x08, 0x26, 0x29, 0x2c, 0xa1, 0x05, 0x0b, - 0xf7, 0x5f, 0xa9, 0x8a, 0x7d, 0xa1, 0x25, 0xb4, 0x10, 0x00, 0x1c, 0xe3, 0x50, 0x66, 0x4a, 0xfd, - 0x09, 0x67, 0x51, 0x1c, 0xd8, 0x51, 0x61, 0x87, 0x58, 0xc3, 0x40, 0x97, 0x85, 0x40, 0x81, 0xeb, - 0x05, 0x1e, 0x4d, 0x08, 0x14, 0xe4, 0x70, 0x69, 0x52, 0xa0, 0x2b, 0x30, 0xaa, 0x72, 0xda, 0x56, - 0x79, 0xaa, 0x54, 0xb1, 0xcc, 0x56, 0xe2, 0x62, 0xac, 0xe3, 0xa0, 0x0d, 0x98, 0x0c, 0xb9, 0x9c, - 0x4d, 0x45, 0xdb, 0xe5, 0xf2, 0xca, 0x0f, 0x4a, 0x2b, 0xa0, 0x9a, 0x09, 0x3e, 0x64, 0x45, 0xfc, - 0x74, 0x92, 0x8e, 0xe1, 0x49, 0x12, 0xe8, 0x55, 0x98, 0x68, 0xfa, 0x4e, 0x63, 0xc9, 0x69, 0x3a, - 0x5e, 0x9d, 0x8d, 0xcf, 0x88, 0x99, 0x1a, 0xf1, 0x86, 0x01, 0xc5, 0x09, 0x6c, 0xca, 0xbc, 0xe9, - 0x25, 0x22, 0x42, 0xb4, 0xe3, 0x6d, 0x93, 0x50, 0x64, 0x28, 0x65, 0xcc, 0xdb, 0x8d, 0x1c, 0x1c, - 0x9c, 0x5b, 0x1b, 0xbd, 0x04, 0x63, 0xf2, 0xf3, 0xb5, 0x38, 0x0a, 0xb1, 0xe3, 0x83, 0x06, 0xc3, - 0x06, 0x26, 0xba, 0x0b, 0xa7, 0xe5, 0xff, 0x8d, 0xc0, 0xd9, 0xda, 0x72, 0xeb, 0xc2, 0xb9, 0x98, - 0x7b, 0x48, 0x2e, 0x4a, 0x37, 0xbe, 0x95, 0x2c, 0xa4, 0xc3, 0x83, 0xf9, 0x0b, 0x62, 0xd4, 0x32, - 0xe1, 0x6c, 0x12, 0xb3, 0xe9, 0xa3, 0x35, 0x98, 0xd9, 0x21, 0x4e, 0x33, 0xda, 0x59, 0xde, 0x21, - 0xf5, 0x5d, 0xb9, 0xe9, 0x58, 0x74, 0x06, 0xcd, 0x5d, 0xe0, 0x5a, 0x1a, 0x05, 0x67, 0xd5, 0x43, - 0x6f, 0xc0, 0x6c, 0xbb, 0xb3, 0xd9, 0x74, 0xc3, 0x9d, 0x75, 0x3f, 0x62, 0xa6, 0x40, 0x2a, 0x45, - 0xae, 0x08, 0xe3, 0xa0, 0xe2, 0x5f, 0x54, 0x73, 0xf0, 0x70, 0x2e, 0x05, 0xf4, 0x36, 0x9c, 0x4e, - 0x2c, 0x06, 0xe1, 0xc8, 0x3e, 0x91, 0x1f, 0x6f, 0xbf, 0x96, 0x55, 0x41, 0xc4, 0x84, 0xc8, 0x02, - 0xe1, 0xec, 0x26, 0xe8, 0xe3, 0x43, 0x0b, 0x70, 0x1a, 0xce, 0x4e, 0xc5, 0x36, 0xcb, 0x5a, 0x14, - 0xd4, 0x10, 0x1b, 0x58, 0xe8, 0x65, 0x00, 0xb7, 0xbd, 0xea, 0xb4, 0xdc, 0x26, 0x7d, 0x64, 0xce, - 0xb0, 0x3a, 0xf4, 0xc1, 0x01, 0x95, 0xaa, 0x2c, 0xa5, 0xa7, 0xba, 0xf8, 0xb7, 0x8f, 0x35, 0x6c, - 0x54, 0x85, 0x09, 0xf1, 0x6f, 0x5f, 0x2c, 0x86, 0x69, 0xe5, 0x69, 0x3e, 0x21, 0x6b, 0xa8, 0x15, - 0x80, 0xcc, 0x12, 0x36, 0xe7, 0x89, 0xfa, 0x68, 0x1b, 0xce, 0x89, 0x1c, 0xcc, 0x44, 0x5f, 0xdd, - 0x72, 0xf6, 0x42, 0x16, 0x1e, 0x7f, 0x84, 0x07, 0x90, 0x59, 0xec, 0x86, 0x88, 0xbb, 0xd3, 0x79, - 0x67, 0x16, 0x70, 0xbf, 0x6d, 0xd1, 0xda, 0x1a, 0x97, 0x8c, 0x3e, 0x0b, 0x63, 0xfa, 0x9e, 0x13, - 0x37, 0xfe, 0xc5, 0x6c, 0x26, 0x52, 0xdb, 0x9b, 0x9c, 0xc7, 0x56, 0xfb, 0x4f, 0x87, 0x61, 0x83, - 0x22, 0xaa, 0x67, 0xb8, 0x51, 0x5f, 0xee, 0x8f, 0xa3, 0xe8, 0xdf, 0x00, 0x8c, 0x40, 0xf6, 0x92, - 0x43, 0x37, 0x60, 0xa4, 0xde, 0x74, 0x89, 0x17, 0x55, 0xaa, 0xdd, 0x02, 0x9f, 0x2d, 0x0b, 0x1c, - 0xb1, 0x86, 0x45, 0xcc, 0x78, 0x5e, 0x86, 0x15, 0x05, 0xfb, 0x57, 0x0b, 0x30, 0xdf, 0x23, 0x01, - 0x41, 0x42, 0x1d, 0x64, 0xf5, 0xa5, 0x0e, 0x5a, 0x94, 0x39, 0x98, 0xd7, 0x13, 0x92, 0xa6, 0x44, - 0x7e, 0xe5, 0x58, 0xde, 0x94, 0xc4, 0xef, 0xdb, 0x3c, 0x5f, 0xd7, 0x28, 0x0d, 0xf4, 0x74, 0x30, - 0x31, 0x34, 0xc9, 0x83, 0xfd, 0x3f, 0x3f, 0x73, 0xb5, 0x82, 0xf6, 0x57, 0x0a, 0x70, 0x5a, 0x0d, - 0xe1, 0x37, 0xef, 0xc0, 0xdd, 0x4a, 0x0f, 0xdc, 0x31, 0xe8, 0x54, 0xed, 0x9b, 0x30, 0xc4, 0x23, - 0xb9, 0xf5, 0xc1, 0xf6, 0x3e, 0x61, 0x06, 0x3d, 0x55, 0x9c, 0x96, 0x11, 0xf8, 0xf4, 0x7b, 0x2d, - 0x98, 0xdc, 0x58, 0xae, 0xd6, 0xfc, 0xfa, 0x2e, 0x89, 0x16, 0xf9, 0x33, 0x05, 0x6b, 0x0e, 0xa7, - 0x0f, 0xc2, 0x9a, 0x66, 0x31, 0xbd, 0x17, 0x60, 0x60, 0xc7, 0x0f, 0xa3, 0xa4, 0xc1, 0xc5, 0x35, - 0x3f, 0x8c, 0x30, 0x83, 0xd8, 0xbf, 0x6b, 0xc1, 0xe0, 0x86, 0xe3, 0x7a, 0x91, 0x14, 0xce, 0x5b, - 0x39, 0xc2, 0xf9, 0x7e, 0xbe, 0x0b, 0xbd, 0x08, 0x43, 0x64, 0x6b, 0x8b, 0xd4, 0x23, 0x31, 0xab, - 0xd2, 0x5b, 0x7f, 0x68, 0x85, 0x95, 0x52, 0x3e, 0x8c, 0x35, 0xc6, 0xff, 0x62, 0x81, 0x8c, 0xee, - 0x40, 0x29, 0x72, 0x5b, 0x64, 0xb1, 0xd1, 0x10, 0x2a, 0xeb, 0x07, 0x88, 0x38, 0xb0, 0x21, 0x09, - 0xe0, 0x98, 0x96, 0xfd, 0xc5, 0x02, 0x40, 0x1c, 0x02, 0xa7, 0xd7, 0x27, 0x2e, 0xa5, 0x94, 0x99, - 0x17, 0x33, 0x94, 0x99, 0x28, 0x26, 0x98, 0xa1, 0xc9, 0x54, 0xc3, 0x54, 0xec, 0x6b, 0x98, 0x06, - 0x8e, 0x32, 0x4c, 0xcb, 0x30, 0x1d, 0x87, 0xf0, 0x31, 0x23, 0x98, 0xb1, 0xa7, 0xe9, 0x46, 0x12, - 0x88, 0xd3, 0xf8, 0x36, 0x81, 0x0b, 0x2a, 0x92, 0x89, 0xb8, 0xd1, 0x98, 0x45, 0xb4, 0xae, 0x1c, - 0xee, 0x31, 0x4e, 0xb1, 0xb6, 0xb6, 0x90, 0xab, 0xad, 0xfd, 0x09, 0x0b, 0x4e, 0x25, 0xdb, 0x61, - 0x2e, 0xaa, 0x5f, 0xb0, 0xe0, 0x34, 0xd3, 0x59, 0xb3, 0x56, 0xd3, 0x1a, 0xf2, 0x17, 0xba, 0x46, - 0x67, 0xc9, 0xe9, 0x71, 0x1c, 0x16, 0x62, 0x2d, 0x8b, 0x34, 0xce, 0x6e, 0xd1, 0xfe, 0x4f, 0x05, - 0x98, 0xcd, 0x0b, 0xeb, 0xc2, 0x1c, 0x26, 0x9c, 0x7b, 0xb5, 0x5d, 0x72, 0x57, 0x98, 0xa5, 0xc7, - 0x0e, 0x13, 0xbc, 0x18, 0x4b, 0x78, 0x32, 0xa6, 0x7c, 0xa1, 0xbf, 0x98, 0xf2, 0x68, 0x07, 0xa6, - 0xef, 0xee, 0x10, 0xef, 0x96, 0x17, 0x3a, 0x91, 0x1b, 0x6e, 0xb9, 0x4c, 0xbf, 0xcb, 0xd7, 0xcd, - 0xcb, 0xd2, 0x78, 0xfc, 0x4e, 0x12, 0xe1, 0xf0, 0x60, 0xfe, 0x9c, 0x51, 0x10, 0x77, 0x99, 0x1f, - 0x24, 0x38, 0x4d, 0x34, 0x1d, 0x92, 0x7f, 0xe0, 0x21, 0x86, 0xe4, 0xb7, 0xbf, 0x60, 0xc1, 0xd9, - 0xdc, 0x3c, 0xa0, 0xe8, 0x12, 0x8c, 0x38, 0x6d, 0x97, 0x8b, 0xc8, 0xc5, 0x31, 0xca, 0x44, 0x31, - 0xd5, 0x0a, 0x17, 0x90, 0x2b, 0xa8, 0xca, 0x4f, 0x5e, 0xc8, 0xcd, 0x4f, 0xde, 0x33, 0xdd, 0xb8, - 0xfd, 0x3d, 0x16, 0x08, 0x67, 0xcf, 0x3e, 0xce, 0xee, 0x4f, 0xc1, 0xd8, 0x5e, 0x3a, 0x6d, 0xcf, - 0x85, 0x7c, 0xef, 0x57, 0x91, 0xac, 0x47, 0x31, 0x64, 0x46, 0x8a, 0x1e, 0x83, 0x96, 0xdd, 0x00, - 0x01, 0x2d, 0x13, 0x26, 0x00, 0xee, 0xdd, 0x9b, 0xe7, 0x00, 0x1a, 0x0c, 0x57, 0x4b, 0xf2, 0xae, - 0x6e, 0xe6, 0xb2, 0x82, 0x60, 0x0d, 0xcb, 0xfe, 0xf7, 0x05, 0x18, 0x95, 0x69, 0x62, 0x3a, 0x5e, - 0x3f, 0x62, 0x9a, 0x23, 0xe5, 0x8d, 0xa4, 0xaf, 0x78, 0x26, 0x47, 0xac, 0xc6, 0xd2, 0x2d, 0xf5, - 0x8a, 0x5f, 0x93, 0x00, 0x1c, 0xe3, 0xd0, 0x5d, 0x14, 0x76, 0x36, 0x19, 0x7a, 0xc2, 0x35, 0xb1, - 0xc6, 0x8b, 0xb1, 0x84, 0xa3, 0x4f, 0xc0, 0x14, 0xaf, 0x17, 0xf8, 0x6d, 0x67, 0x9b, 0xeb, 0x1e, - 0x06, 0x55, 0x4c, 0x81, 0xa9, 0xb5, 0x04, 0xec, 0xf0, 0x60, 0xfe, 0x54, 0xb2, 0x8c, 0x29, 0xd5, - 0x52, 0x54, 0x98, 0x89, 0x11, 0x6f, 0x84, 0xee, 0xfe, 0x94, 0x65, 0x52, 0x0c, 0xc2, 0x3a, 0x9e, - 0xfd, 0x59, 0x40, 0xe9, 0x84, 0x39, 0xe8, 0x35, 0x6e, 0x57, 0xea, 0x06, 0xa4, 0xd1, 0x4d, 0xc9, - 0xa6, 0x7b, 0xce, 0x4b, 0xaf, 0x22, 0x5e, 0x0b, 0xab, 0xfa, 0xf6, 0x5f, 0x2d, 0xc2, 0x54, 0xd2, - 0x8f, 0x1a, 0x5d, 0x83, 0x21, 0xce, 0x7a, 0x08, 0xf2, 0x5d, 0x6c, 0x38, 0x34, 0xef, 0x6b, 0x76, - 0x08, 0x0b, 0xee, 0x45, 0xd4, 0x47, 0x6f, 0xc0, 0x68, 0xc3, 0xbf, 0xeb, 0xdd, 0x75, 0x82, 0xc6, - 0x62, 0xb5, 0x22, 0x96, 0x73, 0xe6, 0xa3, 0xb2, 0x1c, 0xa3, 0xe9, 0x1e, 0xdd, 0x4c, 0x5f, 0x19, - 0x83, 0xb0, 0x4e, 0x0e, 0x6d, 0xb0, 0xf8, 0xde, 0x5b, 0xee, 0xf6, 0x9a, 0xd3, 0xee, 0xe6, 0x64, - 0xb0, 0x2c, 0x91, 0x34, 0xca, 0xe3, 0x22, 0x08, 0x38, 0x07, 0xe0, 0x98, 0x10, 0xfa, 0x1c, 0xcc, - 0x84, 0x39, 0xa2, 0xee, 0xbc, 0xfc, 0x69, 0xdd, 0xa4, 0xbf, 0x4b, 0x8f, 0xd0, 0xe7, 0x7e, 0x96, - 0x50, 0x3c, 0xab, 0x19, 0xfb, 0x47, 0x4e, 0x81, 0xb1, 0x89, 0x8d, 0x74, 0x9a, 0xd6, 0x31, 0xa5, - 0xd3, 0xc4, 0x30, 0x42, 0x5a, 0xed, 0x68, 0xbf, 0xec, 0x06, 0xdd, 0x92, 0x4c, 0xaf, 0x08, 0x9c, - 0x34, 0x4d, 0x09, 0xc1, 0x8a, 0x4e, 0x76, 0xce, 0xd3, 0xe2, 0xd7, 0x31, 0xe7, 0xe9, 0xc0, 0x09, - 0xe6, 0x3c, 0x5d, 0x87, 0xe1, 0x6d, 0x37, 0xc2, 0xa4, 0xed, 0x0b, 0xa6, 0x3f, 0x73, 0x1d, 0x5e, - 0xe5, 0x28, 0xe9, 0xec, 0x7a, 0x02, 0x80, 0x25, 0x11, 0xf4, 0x9a, 0xda, 0x81, 0x43, 0xf9, 0x0f, - 0xf3, 0xb4, 0xb1, 0x41, 0xe6, 0x1e, 0x14, 0x99, 0x4d, 0x87, 0x1f, 0x34, 0xb3, 0xe9, 0xaa, 0xcc, - 0x47, 0x3a, 0x92, 0xef, 0x11, 0xc4, 0xd2, 0x8d, 0xf6, 0xc8, 0x42, 0x7a, 0x5b, 0xcf, 0xe1, 0x5a, - 0xca, 0x3f, 0x09, 0x54, 0x7a, 0xd6, 0x3e, 0x33, 0xb7, 0x7e, 0x8f, 0x05, 0xa7, 0xdb, 0x59, 0xe9, - 0x8c, 0x85, 0x5e, 0xfe, 0xc5, 0xbe, 0x33, 0x26, 0x1b, 0x0d, 0x32, 0x79, 0x56, 0x26, 0x1a, 0xce, - 0x6e, 0x8e, 0x0e, 0x74, 0xb0, 0xd9, 0x10, 0xfa, 0xe1, 0x27, 0x72, 0x52, 0xc0, 0x76, 0x49, 0xfc, - 0xba, 0x91, 0x91, 0x6e, 0xf4, 0xfd, 0x79, 0xe9, 0x46, 0xfb, 0x4e, 0x32, 0xfa, 0x9a, 0x4a, 0xfe, - 0x3a, 0x9e, 0xbf, 0x94, 0x78, 0x6a, 0xd7, 0x9e, 0x29, 0x5f, 0x5f, 0x53, 0x29, 0x5f, 0xbb, 0x04, - 0x6f, 0xe5, 0x09, 0x5d, 0x7b, 0x26, 0x7a, 0xd5, 0x92, 0xb5, 0x4e, 0x1e, 0x4f, 0xb2, 0x56, 0xe3, - 0xaa, 0xe1, 0xf9, 0x42, 0x9f, 0xee, 0x71, 0xd5, 0x18, 0x74, 0xbb, 0x5f, 0x36, 0x3c, 0x31, 0xed, - 0xf4, 0x03, 0x25, 0xa6, 0xbd, 0xad, 0x27, 0x7a, 0x45, 0x3d, 0x32, 0x99, 0x52, 0xa4, 0x3e, 0xd3, - 0xbb, 0xde, 0xd6, 0x2f, 0xc0, 0x99, 0x7c, 0xba, 0xea, 0x9e, 0x4b, 0xd3, 0xcd, 0xbc, 0x02, 0x53, - 0x69, 0x63, 0x4f, 0x9d, 0x4c, 0xda, 0xd8, 0xd3, 0xc7, 0x9e, 0x36, 0xf6, 0xcc, 0x09, 0xa4, 0x8d, - 0x7d, 0xe4, 0x04, 0xd3, 0xc6, 0xde, 0x66, 0xc6, 0x2c, 0x3c, 0x64, 0x8e, 0x08, 0x36, 0x9b, 0x1d, - 0xd8, 0x34, 0x2b, 0xae, 0x0e, 0xff, 0x38, 0x05, 0xc2, 0x31, 0xa9, 0x8c, 0x74, 0xb4, 0xb3, 0x0f, - 0x21, 0x1d, 0xed, 0x7a, 0x9c, 0x8e, 0xf6, 0x6c, 0xfe, 0x54, 0x67, 0xb8, 0x3f, 0xe4, 0x24, 0xa1, - 0xbd, 0xad, 0x27, 0x8f, 0x7d, 0xb4, 0x8b, 0xc6, 0x22, 0x4b, 0xf0, 0xd8, 0x25, 0x65, 0xec, 0xab, - 0x3c, 0x65, 0xec, 0x63, 0xf9, 0x27, 0x79, 0xf2, 0xba, 0x33, 0x12, 0xc5, 0xd2, 0x7e, 0xa9, 0xb0, - 0x86, 0x2c, 0xac, 0x6e, 0x4e, 0xbf, 0x54, 0x5c, 0xc4, 0x74, 0xbf, 0x14, 0x08, 0xc7, 0xa4, 0xec, - 0xef, 0x2b, 0xc0, 0xf9, 0xee, 0xfb, 0x2d, 0x96, 0xa6, 0x56, 0x63, 0x05, 0x6e, 0x42, 0x9a, 0xca, - 0xdf, 0x6c, 0x31, 0x56, 0xdf, 0x51, 0xda, 0xae, 0xc2, 0xb4, 0xf2, 0x9b, 0x68, 0xba, 0xf5, 0xfd, - 0xf5, 0xf8, 0xe5, 0xab, 0x7c, 0xcd, 0x6b, 0x49, 0x04, 0x9c, 0xae, 0x83, 0x16, 0x61, 0xd2, 0x28, - 0xac, 0x94, 0xc5, 0xdb, 0x4c, 0x89, 0x6f, 0x6b, 0x26, 0x18, 0x27, 0xf1, 0xed, 0x2f, 0x59, 0xf0, - 0x48, 0x4e, 0xa6, 0xb7, 0xbe, 0x83, 0x90, 0x6d, 0xc1, 0x64, 0xdb, 0xac, 0xda, 0x23, 0x6e, 0xa2, - 0x91, 0x4f, 0x4e, 0xf5, 0x35, 0x01, 0xc0, 0x49, 0xa2, 0xf6, 0x9f, 0x59, 0x70, 0xae, 0xab, 0x21, - 0x20, 0xc2, 0x70, 0x66, 0xbb, 0x15, 0x3a, 0xcb, 0x01, 0x69, 0x10, 0x2f, 0x72, 0x9d, 0x66, 0xad, - 0x4d, 0xea, 0x9a, 0x3c, 0x9c, 0x59, 0xd4, 0x5d, 0x5d, 0xab, 0x2d, 0xa6, 0x31, 0x70, 0x4e, 0x4d, - 0xb4, 0x0a, 0x28, 0x0d, 0x11, 0x33, 0xcc, 0x02, 0x34, 0xa7, 0xe9, 0xe1, 0x8c, 0x1a, 0xe8, 0x23, - 0x30, 0xae, 0x0c, 0x0c, 0xb5, 0x19, 0x67, 0x07, 0x3b, 0xd6, 0x01, 0xd8, 0xc4, 0x5b, 0xba, 0xf4, - 0xeb, 0xbf, 0x7f, 0xfe, 0x7d, 0xbf, 0xf9, 0xfb, 0xe7, 0xdf, 0xf7, 0x3b, 0xbf, 0x7f, 0xfe, 0x7d, - 0xdf, 0x71, 0xff, 0xbc, 0xf5, 0xeb, 0xf7, 0xcf, 0x5b, 0xbf, 0x79, 0xff, 0xbc, 0xf5, 0x3b, 0xf7, - 0xcf, 0x5b, 0xbf, 0x77, 0xff, 0xbc, 0xf5, 0xc5, 0x3f, 0x38, 0xff, 0xbe, 0x4f, 0x15, 0xf6, 0xae, - 0xfc, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xad, 0xf2, 0xaa, 0x3b, 0x4d, 0x03, 0x01, 0x00, + // 14068 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6b, 0x70, 0x1c, 0xd9, + 0x75, 0x18, 0xac, 0x9e, 0xc1, 0x6b, 0x0e, 0xde, 0x17, 0x24, 0x17, 0xc4, 0x2e, 0x09, 0x6e, 0x53, + 0xe2, 0x72, 0xb5, 0xbb, 0xa0, 0xb8, 0x0f, 0x69, 0xbd, 0x2b, 0xad, 0x05, 0x60, 0x00, 0x72, 0x96, + 0x04, 0x38, 0x7b, 0x07, 0x24, 0x25, 0x79, 0xa5, 0x52, 0x63, 0xe6, 0x02, 0x68, 0x61, 0xa6, 0x7b, + 0xb6, 0xbb, 0x07, 0x24, 0xf6, 0x93, 0xeb, 0xf3, 0x27, 0x3f, 0xe5, 0xc7, 0x57, 0xaa, 0x94, 0xf3, + 0xb2, 0x5d, 0xae, 0x94, 0xe3, 0x54, 0xac, 0x38, 0x49, 0xc5, 0xb1, 0x63, 0x3b, 0x96, 0x13, 0x3b, + 0x71, 0x1e, 0x4e, 0x7e, 0x38, 0x8e, 0x2b, 0xb1, 0x5c, 0xe5, 0x0a, 0x62, 0xd3, 0x49, 0xb9, 0xf4, + 0x23, 0xb6, 0x13, 0x3b, 0x3f, 0x82, 0xb8, 0xe2, 0xd4, 0x7d, 0xf6, 0xbd, 0xfd, 0x98, 0x19, 0x70, + 0x41, 0x68, 0xa5, 0xda, 0x7f, 0x33, 0xf7, 0x9c, 0x7b, 0xee, 0xed, 0xfb, 0x3c, 0xf7, 0x3c, 0xe1, + 0xd5, 0xdd, 0x97, 0xc3, 0x05, 0xd7, 0xbf, 0xb2, 0xdb, 0xd9, 0x24, 0x81, 0x47, 0x22, 0x12, 0x5e, + 0xd9, 0x23, 0x5e, 0xc3, 0x0f, 0xae, 0x08, 0x80, 0xd3, 0x76, 0xaf, 0xd4, 0xfd, 0x80, 0x5c, 0xd9, + 0xbb, 0x7a, 0x65, 0x9b, 0x78, 0x24, 0x70, 0x22, 0xd2, 0x58, 0x68, 0x07, 0x7e, 0xe4, 0x23, 0xc4, + 0x71, 0x16, 0x9c, 0xb6, 0xbb, 0x40, 0x71, 0x16, 0xf6, 0xae, 0xce, 0x3d, 0xb7, 0xed, 0x46, 0x3b, + 0x9d, 0xcd, 0x85, 0xba, 0xdf, 0xba, 0xb2, 0xed, 0x6f, 0xfb, 0x57, 0x18, 0xea, 0x66, 0x67, 0x8b, + 0xfd, 0x63, 0x7f, 0xd8, 0x2f, 0x4e, 0x62, 0xee, 0xc5, 0xb8, 0x99, 0x96, 0x53, 0xdf, 0x71, 0x3d, + 0x12, 0xec, 0x5f, 0x69, 0xef, 0x6e, 0xb3, 0x76, 0x03, 0x12, 0xfa, 0x9d, 0xa0, 0x4e, 0x92, 0x0d, + 0x77, 0xad, 0x15, 0x5e, 0x69, 0x91, 0xc8, 0xc9, 0xe8, 0xee, 0xdc, 0x95, 0xbc, 0x5a, 0x41, 0xc7, + 0x8b, 0xdc, 0x56, 0xba, 0x99, 0x0f, 0xf7, 0xaa, 0x10, 0xd6, 0x77, 0x48, 0xcb, 0x49, 0xd5, 0x7b, + 0x21, 0xaf, 0x5e, 0x27, 0x72, 0x9b, 0x57, 0x5c, 0x2f, 0x0a, 0xa3, 0x20, 0x59, 0xc9, 0xfe, 0xaa, + 0x05, 0x17, 0x16, 0xef, 0xd6, 0x56, 0x9a, 0x4e, 0x18, 0xb9, 0xf5, 0xa5, 0xa6, 0x5f, 0xdf, 0xad, + 0x45, 0x7e, 0x40, 0xee, 0xf8, 0xcd, 0x4e, 0x8b, 0xd4, 0xd8, 0x40, 0xa0, 0x67, 0x61, 0x64, 0x8f, + 0xfd, 0xaf, 0x94, 0x67, 0xad, 0x0b, 0xd6, 0xe5, 0xd2, 0xd2, 0xd4, 0xaf, 0x1f, 0xcc, 0xbf, 0xef, + 0xc1, 0xc1, 0xfc, 0xc8, 0x1d, 0x51, 0x8e, 0x15, 0x06, 0xba, 0x04, 0x43, 0x5b, 0xe1, 0xc6, 0x7e, + 0x9b, 0xcc, 0x16, 0x18, 0xee, 0x84, 0xc0, 0x1d, 0x5a, 0xad, 0xd1, 0x52, 0x2c, 0xa0, 0xe8, 0x0a, + 0x94, 0xda, 0x4e, 0x10, 0xb9, 0x91, 0xeb, 0x7b, 0xb3, 0xc5, 0x0b, 0xd6, 0xe5, 0xc1, 0xa5, 0x69, + 0x81, 0x5a, 0xaa, 0x4a, 0x00, 0x8e, 0x71, 0x68, 0x37, 0x02, 0xe2, 0x34, 0x6e, 0x79, 0xcd, 0xfd, + 0xd9, 0x81, 0x0b, 0xd6, 0xe5, 0x91, 0xb8, 0x1b, 0x58, 0x94, 0x63, 0x85, 0x61, 0xff, 0x48, 0x01, + 0x46, 0x16, 0xb7, 0xb6, 0x5c, 0xcf, 0x8d, 0xf6, 0xd1, 0x1d, 0x18, 0xf3, 0xfc, 0x06, 0x91, 0xff, + 0xd9, 0x57, 0x8c, 0x3e, 0x7f, 0x61, 0x21, 0xbd, 0x94, 0x16, 0xd6, 0x35, 0xbc, 0xa5, 0xa9, 0x07, + 0x07, 0xf3, 0x63, 0x7a, 0x09, 0x36, 0xe8, 0x20, 0x0c, 0xa3, 0x6d, 0xbf, 0xa1, 0xc8, 0x16, 0x18, + 0xd9, 0xf9, 0x2c, 0xb2, 0xd5, 0x18, 0x6d, 0x69, 0xf2, 0xc1, 0xc1, 0xfc, 0xa8, 0x56, 0x80, 0x75, + 0x22, 0x68, 0x13, 0x26, 0xe9, 0x5f, 0x2f, 0x72, 0x15, 0xdd, 0x22, 0xa3, 0x7b, 0x31, 0x8f, 0xae, + 0x86, 0xba, 0x34, 0xf3, 0xe0, 0x60, 0x7e, 0x32, 0x51, 0x88, 0x93, 0x04, 0xed, 0xb7, 0x61, 0x62, + 0x31, 0x8a, 0x9c, 0xfa, 0x0e, 0x69, 0xf0, 0x19, 0x44, 0x2f, 0xc2, 0x80, 0xe7, 0xb4, 0x88, 0x98, + 0xdf, 0x0b, 0x62, 0x60, 0x07, 0xd6, 0x9d, 0x16, 0x39, 0x3c, 0x98, 0x9f, 0xba, 0xed, 0xb9, 0x6f, + 0x75, 0xc4, 0xaa, 0xa0, 0x65, 0x98, 0x61, 0xa3, 0xe7, 0x01, 0x1a, 0x64, 0xcf, 0xad, 0x93, 0xaa, + 0x13, 0xed, 0x88, 0xf9, 0x46, 0xa2, 0x2e, 0x94, 0x15, 0x04, 0x6b, 0x58, 0xf6, 0x7d, 0x28, 0x2d, + 0xee, 0xf9, 0x6e, 0xa3, 0xea, 0x37, 0x42, 0xb4, 0x0b, 0x93, 0xed, 0x80, 0x6c, 0x91, 0x40, 0x15, + 0xcd, 0x5a, 0x17, 0x8a, 0x97, 0x47, 0x9f, 0xbf, 0x9c, 0xf9, 0xb1, 0x26, 0xea, 0x8a, 0x17, 0x05, + 0xfb, 0x4b, 0x8f, 0x89, 0xf6, 0x26, 0x13, 0x50, 0x9c, 0xa4, 0x6c, 0xff, 0x8b, 0x02, 0x9c, 0x5e, + 0x7c, 0xbb, 0x13, 0x90, 0xb2, 0x1b, 0xee, 0x26, 0x57, 0x78, 0xc3, 0x0d, 0x77, 0xd7, 0xe3, 0x11, + 0x50, 0x4b, 0xab, 0x2c, 0xca, 0xb1, 0xc2, 0x40, 0xcf, 0xc1, 0x30, 0xfd, 0x7d, 0x1b, 0x57, 0xc4, + 0x27, 0xcf, 0x08, 0xe4, 0xd1, 0xb2, 0x13, 0x39, 0x65, 0x0e, 0xc2, 0x12, 0x07, 0xad, 0xc1, 0x68, + 0x9d, 0x6d, 0xc8, 0xed, 0x35, 0xbf, 0x41, 0xd8, 0x64, 0x96, 0x96, 0x9e, 0xa1, 0xe8, 0xcb, 0x71, + 0xf1, 0xe1, 0xc1, 0xfc, 0x2c, 0xef, 0x9b, 0x20, 0xa1, 0xc1, 0xb0, 0x5e, 0x1f, 0xd9, 0x6a, 0x7f, + 0x0d, 0x30, 0x4a, 0x90, 0xb1, 0xb7, 0x2e, 0x6b, 0x5b, 0x65, 0x90, 0x6d, 0x95, 0xb1, 0xec, 0x6d, + 0x82, 0xae, 0xc2, 0xc0, 0xae, 0xeb, 0x35, 0x66, 0x87, 0x18, 0xad, 0x73, 0x74, 0xce, 0x6f, 0xb8, + 0x5e, 0xe3, 0xf0, 0x60, 0x7e, 0xda, 0xe8, 0x0e, 0x2d, 0xc4, 0x0c, 0xd5, 0xfe, 0x53, 0x0b, 0xe6, + 0x19, 0x6c, 0xd5, 0x6d, 0x92, 0x2a, 0x09, 0x42, 0x37, 0x8c, 0x88, 0x17, 0x19, 0x03, 0xfa, 0x3c, + 0x40, 0x48, 0xea, 0x01, 0x89, 0xb4, 0x21, 0x55, 0x0b, 0xa3, 0xa6, 0x20, 0x58, 0xc3, 0xa2, 0x07, + 0x42, 0xb8, 0xe3, 0x04, 0x6c, 0x7d, 0x89, 0x81, 0x55, 0x07, 0x42, 0x4d, 0x02, 0x70, 0x8c, 0x63, + 0x1c, 0x08, 0xc5, 0x5e, 0x07, 0x02, 0xfa, 0x18, 0x4c, 0xc6, 0x8d, 0x85, 0x6d, 0xa7, 0x2e, 0x07, + 0x90, 0x6d, 0x99, 0x9a, 0x09, 0xc2, 0x49, 0x5c, 0xfb, 0xef, 0x58, 0x62, 0xf1, 0xd0, 0xaf, 0x7e, + 0x97, 0x7f, 0xab, 0xfd, 0x8b, 0x16, 0x0c, 0x2f, 0xb9, 0x5e, 0xc3, 0xf5, 0xb6, 0xd1, 0x67, 0x61, + 0x84, 0xde, 0x4d, 0x0d, 0x27, 0x72, 0xc4, 0xb9, 0xf7, 0x21, 0x6d, 0x6f, 0xa9, 0xab, 0x62, 0xa1, + 0xbd, 0xbb, 0x4d, 0x0b, 0xc2, 0x05, 0x8a, 0x4d, 0x77, 0xdb, 0xad, 0xcd, 0xcf, 0x91, 0x7a, 0xb4, + 0x46, 0x22, 0x27, 0xfe, 0x9c, 0xb8, 0x0c, 0x2b, 0xaa, 0xe8, 0x06, 0x0c, 0x45, 0x4e, 0xb0, 0x4d, + 0x22, 0x71, 0x00, 0x66, 0x1e, 0x54, 0xbc, 0x26, 0xa6, 0x3b, 0x92, 0x78, 0x75, 0x12, 0x5f, 0x0b, + 0x1b, 0xac, 0x2a, 0x16, 0x24, 0xec, 0x1f, 0x1a, 0x86, 0xb3, 0xcb, 0xb5, 0x4a, 0xce, 0xba, 0xba, + 0x04, 0x43, 0x8d, 0xc0, 0xdd, 0x23, 0x81, 0x18, 0x67, 0x45, 0xa5, 0xcc, 0x4a, 0xb1, 0x80, 0xa2, + 0x97, 0x61, 0x8c, 0x5f, 0x48, 0xd7, 0x1d, 0xaf, 0xd1, 0x94, 0x43, 0x7c, 0x4a, 0x60, 0x8f, 0xdd, + 0xd1, 0x60, 0xd8, 0xc0, 0x3c, 0xe2, 0xa2, 0xba, 0x94, 0xd8, 0x8c, 0x79, 0x97, 0xdd, 0x17, 0x2d, + 0x98, 0xe2, 0xcd, 0x2c, 0x46, 0x51, 0xe0, 0x6e, 0x76, 0x22, 0x12, 0xce, 0x0e, 0xb2, 0x93, 0x6e, + 0x39, 0x6b, 0xb4, 0x72, 0x47, 0x60, 0xe1, 0x4e, 0x82, 0x0a, 0x3f, 0x04, 0x67, 0x45, 0xbb, 0x53, + 0x49, 0x30, 0x4e, 0x35, 0x8b, 0xbe, 0xd3, 0x82, 0xb9, 0xba, 0xef, 0x45, 0x81, 0xdf, 0x6c, 0x92, + 0xa0, 0xda, 0xd9, 0x6c, 0xba, 0xe1, 0x0e, 0x5f, 0xa7, 0x98, 0x6c, 0xb1, 0x93, 0x20, 0x67, 0x0e, + 0x15, 0x92, 0x98, 0xc3, 0xf3, 0x0f, 0x0e, 0xe6, 0xe7, 0x96, 0x73, 0x49, 0xe1, 0x2e, 0xcd, 0xa0, + 0x5d, 0x40, 0xf4, 0x2a, 0xad, 0x45, 0xce, 0x36, 0x89, 0x1b, 0x1f, 0xee, 0xbf, 0xf1, 0x33, 0x0f, + 0x0e, 0xe6, 0xd1, 0x7a, 0x8a, 0x04, 0xce, 0x20, 0x8b, 0xde, 0x82, 0x53, 0xb4, 0x34, 0xf5, 0xad, + 0x23, 0xfd, 0x37, 0x37, 0xfb, 0xe0, 0x60, 0xfe, 0xd4, 0x7a, 0x06, 0x11, 0x9c, 0x49, 0x1a, 0x7d, + 0x87, 0x05, 0x67, 0xe3, 0xcf, 0x5f, 0xb9, 0xdf, 0x76, 0xbc, 0x46, 0xdc, 0x70, 0xa9, 0xff, 0x86, + 0xe9, 0x99, 0x7c, 0x76, 0x39, 0x8f, 0x12, 0xce, 0x6f, 0x64, 0x6e, 0x19, 0x4e, 0x67, 0xae, 0x16, + 0x34, 0x05, 0xc5, 0x5d, 0xc2, 0xb9, 0xa0, 0x12, 0xa6, 0x3f, 0xd1, 0x29, 0x18, 0xdc, 0x73, 0x9a, + 0x1d, 0xb1, 0x51, 0x30, 0xff, 0xf3, 0x4a, 0xe1, 0x65, 0xcb, 0xfe, 0x97, 0x45, 0x98, 0x5c, 0xae, + 0x55, 0x1e, 0x6a, 0x17, 0xea, 0xd7, 0x50, 0xa1, 0xeb, 0x35, 0x14, 0x5f, 0x6a, 0xc5, 0xdc, 0x4b, + 0xed, 0xff, 0xcd, 0xd8, 0x42, 0x03, 0x6c, 0x0b, 0x7d, 0x4b, 0xce, 0x16, 0x3a, 0xe6, 0x8d, 0xb3, + 0x97, 0xb3, 0x8a, 0x06, 0xd9, 0x64, 0x66, 0x72, 0x2c, 0x37, 0xfd, 0xba, 0xd3, 0x4c, 0x1e, 0x7d, + 0x47, 0x5c, 0x4a, 0xc7, 0x33, 0x8f, 0x75, 0x18, 0x5b, 0x76, 0xda, 0xce, 0xa6, 0xdb, 0x74, 0x23, + 0x97, 0x84, 0xe8, 0x29, 0x28, 0x3a, 0x8d, 0x06, 0xe3, 0xb6, 0x4a, 0x4b, 0xa7, 0x1f, 0x1c, 0xcc, + 0x17, 0x17, 0x1b, 0xf4, 0xda, 0x07, 0x85, 0xb5, 0x8f, 0x29, 0x06, 0xfa, 0x20, 0x0c, 0x34, 0x02, + 0xbf, 0x3d, 0x5b, 0x60, 0x98, 0x74, 0xd7, 0x0d, 0x94, 0x03, 0xbf, 0x9d, 0x40, 0x65, 0x38, 0xf6, + 0xaf, 0x16, 0xe0, 0x89, 0x65, 0xd2, 0xde, 0x59, 0xad, 0xe5, 0x9c, 0xdf, 0x97, 0x61, 0xa4, 0xe5, + 0x7b, 0x6e, 0xe4, 0x07, 0xa1, 0x68, 0x9a, 0xad, 0x88, 0x35, 0x51, 0x86, 0x15, 0x14, 0x5d, 0x80, + 0x81, 0x76, 0xcc, 0x54, 0x8e, 0x49, 0x86, 0x94, 0xb1, 0x93, 0x0c, 0x42, 0x31, 0x3a, 0x21, 0x09, + 0xc4, 0x8a, 0x51, 0x18, 0xb7, 0x43, 0x12, 0x60, 0x06, 0x89, 0x6f, 0x66, 0x7a, 0x67, 0x8b, 0x13, + 0x3a, 0x71, 0x33, 0x53, 0x08, 0xd6, 0xb0, 0x50, 0x15, 0x4a, 0x61, 0x62, 0x66, 0xfb, 0xda, 0xa6, + 0xe3, 0xec, 0xea, 0x56, 0x33, 0x19, 0x13, 0x31, 0x6e, 0x94, 0xa1, 0x9e, 0x57, 0xf7, 0x57, 0x0a, + 0x80, 0xf8, 0x10, 0x7e, 0x83, 0x0d, 0xdc, 0xed, 0xf4, 0xc0, 0xf5, 0xbf, 0x25, 0x8e, 0x6b, 0xf4, + 0xfe, 0xcc, 0x82, 0x27, 0x96, 0x5d, 0xaf, 0x41, 0x82, 0x9c, 0x05, 0xf8, 0x68, 0xde, 0xb2, 0x47, + 0x63, 0x1a, 0x8c, 0x25, 0x36, 0x70, 0x0c, 0x4b, 0xcc, 0xfe, 0x63, 0x0b, 0x10, 0xff, 0xec, 0x77, + 0xdd, 0xc7, 0xde, 0x4e, 0x7f, 0xec, 0x31, 0x2c, 0x0b, 0xfb, 0x26, 0x4c, 0x2c, 0x37, 0x5d, 0xe2, + 0x45, 0x95, 0xea, 0xb2, 0xef, 0x6d, 0xb9, 0xdb, 0xe8, 0x15, 0x98, 0x88, 0xdc, 0x16, 0xf1, 0x3b, + 0x51, 0x8d, 0xd4, 0x7d, 0x8f, 0xbd, 0x24, 0xad, 0xcb, 0x83, 0x4b, 0xe8, 0xc1, 0xc1, 0xfc, 0xc4, + 0x86, 0x01, 0xc1, 0x09, 0x4c, 0xfb, 0x77, 0xe9, 0xf8, 0xf9, 0xad, 0xb6, 0xef, 0x11, 0x2f, 0x5a, + 0xf6, 0xbd, 0x06, 0x97, 0x38, 0xbc, 0x02, 0x03, 0x11, 0x1d, 0x0f, 0x3e, 0x76, 0x97, 0xe4, 0x46, + 0xa1, 0xa3, 0x70, 0x78, 0x30, 0x7f, 0x26, 0x5d, 0x83, 0x8d, 0x13, 0xab, 0x83, 0xbe, 0x05, 0x86, + 0xc2, 0xc8, 0x89, 0x3a, 0xa1, 0x18, 0xcd, 0x27, 0xe5, 0x68, 0xd6, 0x58, 0xe9, 0xe1, 0xc1, 0xfc, + 0xa4, 0xaa, 0xc6, 0x8b, 0xb0, 0xa8, 0x80, 0x9e, 0x86, 0xe1, 0x16, 0x09, 0x43, 0x67, 0x5b, 0xde, + 0x86, 0x93, 0xa2, 0xee, 0xf0, 0x1a, 0x2f, 0xc6, 0x12, 0x8e, 0x2e, 0xc2, 0x20, 0x09, 0x02, 0x3f, + 0x10, 0x7b, 0x74, 0x5c, 0x20, 0x0e, 0xae, 0xd0, 0x42, 0xcc, 0x61, 0xf6, 0xbf, 0xb3, 0x60, 0x52, + 0xf5, 0x95, 0xb7, 0x75, 0x02, 0xaf, 0x82, 0x4f, 0x01, 0xd4, 0xe5, 0x07, 0x86, 0xec, 0xf6, 0x18, + 0x7d, 0xfe, 0x52, 0xe6, 0x45, 0x9d, 0x1a, 0xc6, 0x98, 0xb2, 0x2a, 0x0a, 0xb1, 0x46, 0xcd, 0xfe, + 0x27, 0x16, 0xcc, 0x24, 0xbe, 0xe8, 0xa6, 0x1b, 0x46, 0xe8, 0xcd, 0xd4, 0x57, 0x2d, 0xf4, 0xf7, + 0x55, 0xb4, 0x36, 0xfb, 0x26, 0xb5, 0x94, 0x65, 0x89, 0xf6, 0x45, 0xd7, 0x61, 0xd0, 0x8d, 0x48, + 0x4b, 0x7e, 0xcc, 0xc5, 0xae, 0x1f, 0xc3, 0x7b, 0x15, 0xcf, 0x48, 0x85, 0xd6, 0xc4, 0x9c, 0x80, + 0xfd, 0xab, 0x45, 0x28, 0xf1, 0x65, 0xbb, 0xe6, 0xb4, 0x4f, 0x60, 0x2e, 0x9e, 0x81, 0x92, 0xdb, + 0x6a, 0x75, 0x22, 0x67, 0x53, 0x1c, 0xe7, 0x23, 0x7c, 0x6b, 0x55, 0x64, 0x21, 0x8e, 0xe1, 0xa8, + 0x02, 0x03, 0xac, 0x2b, 0xfc, 0x2b, 0x9f, 0xca, 0xfe, 0x4a, 0xd1, 0xf7, 0x85, 0xb2, 0x13, 0x39, + 0x9c, 0x93, 0x52, 0xf7, 0x08, 0x2d, 0xc2, 0x8c, 0x04, 0x72, 0x00, 0x36, 0x5d, 0xcf, 0x09, 0xf6, + 0x69, 0xd9, 0x6c, 0x91, 0x11, 0x7c, 0xae, 0x3b, 0xc1, 0x25, 0x85, 0xcf, 0xc9, 0xaa, 0x0f, 0x8b, + 0x01, 0x58, 0x23, 0x3a, 0xf7, 0x11, 0x28, 0x29, 0xe4, 0xa3, 0x30, 0x44, 0x73, 0x1f, 0x83, 0xc9, + 0x44, 0x5b, 0xbd, 0xaa, 0x8f, 0xe9, 0xfc, 0xd4, 0x2f, 0xb1, 0x23, 0x43, 0xf4, 0x7a, 0xc5, 0xdb, + 0x13, 0x47, 0xee, 0xdb, 0x70, 0xaa, 0x99, 0x71, 0x92, 0x89, 0x79, 0xed, 0xff, 0xe4, 0x7b, 0x42, + 0x7c, 0xf6, 0xa9, 0x2c, 0x28, 0xce, 0x6c, 0x83, 0xf2, 0x08, 0x7e, 0x9b, 0x6e, 0x10, 0xa7, 0xa9, + 0xb3, 0xdb, 0xb7, 0x44, 0x19, 0x56, 0x50, 0x7a, 0xde, 0x9d, 0x52, 0x9d, 0xbf, 0x41, 0xf6, 0x6b, + 0xa4, 0x49, 0xea, 0x91, 0x1f, 0x7c, 0x5d, 0xbb, 0x7f, 0x8e, 0x8f, 0x3e, 0x3f, 0x2e, 0x47, 0x05, + 0x81, 0xe2, 0x0d, 0xb2, 0xcf, 0xa7, 0x42, 0xff, 0xba, 0x62, 0xd7, 0xaf, 0xfb, 0x19, 0x0b, 0xc6, + 0xd5, 0xd7, 0x9d, 0xc0, 0xb9, 0xb0, 0x64, 0x9e, 0x0b, 0xe7, 0xba, 0x2e, 0xf0, 0x9c, 0x13, 0xe1, + 0x2b, 0x05, 0x38, 0xab, 0x70, 0xe8, 0xdb, 0x80, 0xff, 0x11, 0xab, 0xea, 0x0a, 0x94, 0x3c, 0x25, + 0xb5, 0xb2, 0x4c, 0x71, 0x51, 0x2c, 0xb3, 0x8a, 0x71, 0x28, 0x8b, 0xe7, 0xc5, 0xa2, 0xa5, 0x31, + 0x5d, 0x9c, 0x2b, 0x44, 0xb7, 0x4b, 0x50, 0xec, 0xb8, 0x0d, 0x71, 0xc1, 0x7c, 0x48, 0x8e, 0xf6, + 0xed, 0x4a, 0xf9, 0xf0, 0x60, 0xfe, 0xc9, 0x3c, 0x55, 0x02, 0xbd, 0xd9, 0xc2, 0x85, 0xdb, 0x95, + 0x32, 0xa6, 0x95, 0xd1, 0x22, 0x4c, 0x4a, 0x6d, 0xc9, 0x1d, 0xca, 0x6e, 0xf9, 0x9e, 0xb8, 0x87, + 0x94, 0x4c, 0x16, 0x9b, 0x60, 0x9c, 0xc4, 0x47, 0x65, 0x98, 0xda, 0xed, 0x6c, 0x92, 0x26, 0x89, + 0xf8, 0x07, 0xdf, 0x20, 0x5c, 0x62, 0x59, 0x8a, 0x5f, 0x66, 0x37, 0x12, 0x70, 0x9c, 0xaa, 0x61, + 0xff, 0x05, 0xbb, 0x0f, 0xc4, 0xe8, 0x55, 0x03, 0x9f, 0x2e, 0x2c, 0x4a, 0xfd, 0xeb, 0xb9, 0x9c, + 0xfb, 0x59, 0x15, 0x37, 0xc8, 0xfe, 0x86, 0x4f, 0x39, 0xf3, 0xec, 0x55, 0x61, 0xac, 0xf9, 0x81, + 0xae, 0x6b, 0xfe, 0xe7, 0x0a, 0x70, 0x5a, 0x8d, 0x80, 0xc1, 0x04, 0x7e, 0xa3, 0x8f, 0xc1, 0x55, + 0x18, 0x6d, 0x90, 0x2d, 0xa7, 0xd3, 0x8c, 0x94, 0xf8, 0x7c, 0x90, 0xab, 0x50, 0xca, 0x71, 0x31, + 0xd6, 0x71, 0x8e, 0x30, 0x6c, 0xff, 0x73, 0x94, 0x5d, 0xc4, 0x91, 0x43, 0xd7, 0xb8, 0xda, 0x35, + 0x56, 0xee, 0xae, 0xb9, 0x08, 0x83, 0x6e, 0x8b, 0x32, 0x66, 0x05, 0x93, 0xdf, 0xaa, 0xd0, 0x42, + 0xcc, 0x61, 0xe8, 0x03, 0x30, 0x5c, 0xf7, 0x5b, 0x2d, 0xc7, 0x6b, 0xb0, 0x2b, 0xaf, 0xb4, 0x34, + 0x4a, 0x79, 0xb7, 0x65, 0x5e, 0x84, 0x25, 0x0c, 0x3d, 0x01, 0x03, 0x4e, 0xb0, 0xcd, 0x65, 0x18, + 0xa5, 0xa5, 0x11, 0xda, 0xd2, 0x62, 0xb0, 0x1d, 0x62, 0x56, 0x4a, 0x9f, 0x60, 0xf7, 0xfc, 0x60, + 0xd7, 0xf5, 0xb6, 0xcb, 0x6e, 0x20, 0xb6, 0x84, 0xba, 0x0b, 0xef, 0x2a, 0x08, 0xd6, 0xb0, 0xd0, + 0x2a, 0x0c, 0xb6, 0xfd, 0x20, 0x0a, 0x67, 0x87, 0xd8, 0x70, 0x3f, 0x99, 0x73, 0x10, 0xf1, 0xaf, + 0xad, 0xfa, 0x41, 0x14, 0x7f, 0x00, 0xfd, 0x17, 0x62, 0x5e, 0x1d, 0xdd, 0x84, 0x61, 0xe2, 0xed, + 0xad, 0x06, 0x7e, 0x6b, 0x76, 0x26, 0x9f, 0xd2, 0x0a, 0x47, 0xe1, 0xcb, 0x2c, 0xe6, 0x51, 0x45, + 0x31, 0x96, 0x24, 0xd0, 0xb7, 0x40, 0x91, 0x78, 0x7b, 0xb3, 0xc3, 0x8c, 0xd2, 0x5c, 0x0e, 0xa5, + 0x3b, 0x4e, 0x10, 0x9f, 0xf9, 0x2b, 0xde, 0x1e, 0xa6, 0x75, 0xd0, 0x27, 0xa1, 0x24, 0x0f, 0x8c, + 0x50, 0x08, 0xeb, 0x32, 0x17, 0xac, 0x3c, 0x66, 0x30, 0x79, 0xab, 0xe3, 0x06, 0xa4, 0x45, 0xbc, + 0x28, 0x8c, 0x4f, 0x48, 0x09, 0x0d, 0x71, 0x4c, 0x0d, 0x7d, 0x52, 0x4a, 0x88, 0xd7, 0xfc, 0x8e, + 0x17, 0x85, 0xb3, 0x25, 0xd6, 0xbd, 0x4c, 0xdd, 0xdd, 0x9d, 0x18, 0x2f, 0x29, 0x42, 0xe6, 0x95, + 0xb1, 0x41, 0x0a, 0x7d, 0x1a, 0xc6, 0xf9, 0x7f, 0xae, 0x01, 0x0b, 0x67, 0x4f, 0x33, 0xda, 0x17, + 0xf2, 0x69, 0x73, 0xc4, 0xa5, 0xd3, 0x82, 0xf8, 0xb8, 0x5e, 0x1a, 0x62, 0x93, 0x1a, 0xc2, 0x30, + 0xde, 0x74, 0xf7, 0x88, 0x47, 0xc2, 0xb0, 0x1a, 0xf8, 0x9b, 0x64, 0x16, 0xd8, 0xc0, 0x9c, 0xcd, + 0xd6, 0x98, 0xf9, 0x9b, 0x64, 0x69, 0x9a, 0xd2, 0xbc, 0xa9, 0xd7, 0xc1, 0x26, 0x09, 0x74, 0x1b, + 0x26, 0xe8, 0x8b, 0xcd, 0x8d, 0x89, 0x8e, 0xf6, 0x22, 0xca, 0xde, 0x55, 0xd8, 0xa8, 0x84, 0x13, + 0x44, 0xd0, 0x2d, 0x18, 0x0b, 0x23, 0x27, 0x88, 0x3a, 0x6d, 0x4e, 0xf4, 0x4c, 0x2f, 0xa2, 0x4c, + 0xe1, 0x5a, 0xd3, 0xaa, 0x60, 0x83, 0x00, 0x7a, 0x1d, 0x4a, 0x4d, 0x77, 0x8b, 0xd4, 0xf7, 0xeb, + 0x4d, 0x32, 0x3b, 0xc6, 0xa8, 0x65, 0x1e, 0x2a, 0x37, 0x25, 0x12, 0xe7, 0x73, 0xd5, 0x5f, 0x1c, + 0x57, 0x47, 0x77, 0xe0, 0x4c, 0x44, 0x82, 0x96, 0xeb, 0x39, 0xf4, 0x30, 0x10, 0x4f, 0x2b, 0xa6, + 0xc8, 0x1c, 0x67, 0xbb, 0xed, 0xbc, 0x98, 0x8d, 0x33, 0x1b, 0x99, 0x58, 0x38, 0xa7, 0x36, 0xba, + 0x0f, 0xb3, 0x19, 0x10, 0xbf, 0xe9, 0xd6, 0xf7, 0x67, 0x4f, 0x31, 0xca, 0x1f, 0x15, 0x94, 0x67, + 0x37, 0x72, 0xf0, 0x0e, 0xbb, 0xc0, 0x70, 0x2e, 0x75, 0x74, 0x0b, 0x26, 0xd9, 0x09, 0x54, 0xed, + 0x34, 0x9b, 0xa2, 0xc1, 0x09, 0xd6, 0xe0, 0x07, 0xe4, 0x7d, 0x5c, 0x31, 0xc1, 0x87, 0x07, 0xf3, + 0x10, 0xff, 0xc3, 0xc9, 0xda, 0x68, 0x93, 0xe9, 0xcc, 0x3a, 0x81, 0x1b, 0xed, 0xd3, 0x73, 0x83, + 0xdc, 0x8f, 0x66, 0x27, 0xbb, 0xca, 0x2b, 0x74, 0x54, 0xa5, 0x58, 0xd3, 0x0b, 0x71, 0x92, 0x20, + 0x3d, 0x52, 0xc3, 0xa8, 0xe1, 0x7a, 0xb3, 0x53, 0xfc, 0x5d, 0x22, 0x4f, 0xa4, 0x1a, 0x2d, 0xc4, + 0x1c, 0xc6, 0xf4, 0x65, 0xf4, 0xc7, 0x2d, 0x7a, 0x73, 0x4d, 0x33, 0xc4, 0x58, 0x5f, 0x26, 0x01, + 0x38, 0xc6, 0xa1, 0xcc, 0x64, 0x14, 0xed, 0xcf, 0x22, 0x86, 0xaa, 0x0e, 0x96, 0x8d, 0x8d, 0x4f, + 0x62, 0x5a, 0x6e, 0x6f, 0xc2, 0x84, 0x3a, 0x08, 0xd9, 0x98, 0xa0, 0x79, 0x18, 0x64, 0xec, 0x93, + 0x90, 0xae, 0x95, 0x68, 0x17, 0x18, 0x6b, 0x85, 0x79, 0x39, 0xeb, 0x82, 0xfb, 0x36, 0x59, 0xda, + 0x8f, 0x08, 0x7f, 0xd3, 0x17, 0xb5, 0x2e, 0x48, 0x00, 0x8e, 0x71, 0xec, 0xff, 0xc3, 0xd9, 0xd0, + 0xf8, 0xb4, 0xed, 0xe3, 0x7e, 0x79, 0x16, 0x46, 0x76, 0xfc, 0x30, 0xa2, 0xd8, 0xac, 0x8d, 0xc1, + 0x98, 0xf1, 0xbc, 0x2e, 0xca, 0xb1, 0xc2, 0x40, 0xaf, 0xc2, 0x78, 0x5d, 0x6f, 0x40, 0x5c, 0x8e, + 0xea, 0x18, 0x31, 0x5a, 0xc7, 0x26, 0x2e, 0x7a, 0x19, 0x46, 0x98, 0x0d, 0x48, 0xdd, 0x6f, 0x0a, + 0xae, 0x4d, 0xde, 0xf0, 0x23, 0x55, 0x51, 0x7e, 0xa8, 0xfd, 0xc6, 0x0a, 0x1b, 0x5d, 0x82, 0x21, + 0xda, 0x85, 0x4a, 0x55, 0x5c, 0x4b, 0x4a, 0x50, 0x74, 0x9d, 0x95, 0x62, 0x01, 0xb5, 0xff, 0x52, + 0x41, 0x1b, 0x65, 0xfa, 0x1e, 0x26, 0xa8, 0x0a, 0xc3, 0xf7, 0x1c, 0x37, 0x72, 0xbd, 0x6d, 0xc1, + 0x7f, 0x3c, 0xdd, 0xf5, 0x8e, 0x62, 0x95, 0xee, 0xf2, 0x0a, 0xfc, 0x16, 0x15, 0x7f, 0xb0, 0x24, + 0x43, 0x29, 0x06, 0x1d, 0xcf, 0xa3, 0x14, 0x0b, 0xfd, 0x52, 0xc4, 0xbc, 0x02, 0xa7, 0x28, 0xfe, + 0x60, 0x49, 0x06, 0xbd, 0x09, 0x20, 0x77, 0x18, 0x69, 0x08, 0xdb, 0x8b, 0x67, 0x7b, 0x13, 0xdd, + 0x50, 0x75, 0x96, 0x26, 0xe8, 0x1d, 0x1d, 0xff, 0xc7, 0x1a, 0x3d, 0x3b, 0x62, 0x7c, 0x5a, 0xba, + 0x33, 0xe8, 0xdb, 0xe8, 0x12, 0x77, 0x82, 0x88, 0x34, 0x16, 0x23, 0x31, 0x38, 0x1f, 0xec, 0xef, + 0x91, 0xb2, 0xe1, 0xb6, 0x88, 0xbe, 0x1d, 0x04, 0x11, 0x1c, 0xd3, 0xb3, 0x7f, 0xa1, 0x08, 0xb3, + 0x79, 0xdd, 0xa5, 0x8b, 0x8e, 0xdc, 0x77, 0xa3, 0x65, 0xca, 0x5e, 0x59, 0xe6, 0xa2, 0x5b, 0x11, + 0xe5, 0x58, 0x61, 0xd0, 0xd9, 0x0f, 0xdd, 0x6d, 0xf9, 0xc6, 0x1c, 0x8c, 0x67, 0xbf, 0xc6, 0x4a, + 0xb1, 0x80, 0x52, 0xbc, 0x80, 0x38, 0xa1, 0x30, 0xee, 0xd1, 0x56, 0x09, 0x66, 0xa5, 0x58, 0x40, + 0x75, 0x69, 0xd7, 0x40, 0x0f, 0x69, 0x97, 0x31, 0x44, 0x83, 0xc7, 0x3b, 0x44, 0xe8, 0x33, 0x00, + 0x5b, 0xae, 0xe7, 0x86, 0x3b, 0x8c, 0xfa, 0xd0, 0x91, 0xa9, 0x2b, 0xe6, 0x6c, 0x55, 0x51, 0xc1, + 0x1a, 0x45, 0xf4, 0x12, 0x8c, 0xaa, 0x0d, 0x58, 0x29, 0x33, 0x4d, 0xa7, 0x66, 0x39, 0x12, 0x9f, + 0x46, 0x65, 0xac, 0xe3, 0xd9, 0x9f, 0x4b, 0xae, 0x17, 0xb1, 0x03, 0xb4, 0xf1, 0xb5, 0xfa, 0x1d, + 0xdf, 0x42, 0xf7, 0xf1, 0xb5, 0xbf, 0x56, 0x84, 0x49, 0xa3, 0xb1, 0x4e, 0xd8, 0xc7, 0x99, 0x75, + 0x8d, 0x1e, 0xe0, 0x4e, 0x44, 0xc4, 0xfe, 0xb3, 0x7b, 0x6f, 0x15, 0xfd, 0x90, 0xa7, 0x3b, 0x80, + 0xd7, 0x47, 0x9f, 0x81, 0x52, 0xd3, 0x09, 0x99, 0xe4, 0x8c, 0x88, 0x7d, 0xd7, 0x0f, 0xb1, 0xf8, + 0x61, 0xe2, 0x84, 0x91, 0x76, 0x6b, 0x72, 0xda, 0x31, 0x49, 0x7a, 0xd3, 0x50, 0xfe, 0x44, 0x5a, + 0x8f, 0xa9, 0x4e, 0x50, 0x26, 0x66, 0x1f, 0x73, 0x18, 0x7a, 0x19, 0xc6, 0x02, 0xc2, 0x56, 0xc5, + 0x32, 0xe5, 0xe6, 0xd8, 0x32, 0x1b, 0x8c, 0xd9, 0x3e, 0xac, 0xc1, 0xb0, 0x81, 0x19, 0xbf, 0x0d, + 0x86, 0xba, 0xbc, 0x0d, 0x9e, 0x86, 0x61, 0xf6, 0x43, 0xad, 0x00, 0x35, 0x1b, 0x15, 0x5e, 0x8c, + 0x25, 0x3c, 0xb9, 0x60, 0x46, 0xfa, 0x5b, 0x30, 0xf4, 0xf5, 0x21, 0x16, 0x35, 0xd3, 0x32, 0x8f, + 0xf0, 0x53, 0x4e, 0x2c, 0x79, 0x2c, 0x61, 0xf6, 0x07, 0x61, 0xa2, 0xec, 0x90, 0x96, 0xef, 0xad, + 0x78, 0x8d, 0xb6, 0xef, 0x7a, 0x11, 0x9a, 0x85, 0x01, 0x76, 0x89, 0xf0, 0x23, 0x60, 0x80, 0x36, + 0x84, 0x07, 0xe8, 0x83, 0xc0, 0xde, 0x86, 0xd3, 0x65, 0xff, 0x9e, 0x77, 0xcf, 0x09, 0x1a, 0x8b, + 0xd5, 0x8a, 0xf6, 0xbe, 0x5e, 0x97, 0xef, 0x3b, 0x6e, 0xb4, 0x95, 0x79, 0xf4, 0x6a, 0x35, 0x39, + 0x5b, 0xbb, 0xea, 0x36, 0x49, 0x8e, 0x14, 0xe4, 0xaf, 0x16, 0x8c, 0x96, 0x62, 0x7c, 0xa5, 0xd5, + 0xb2, 0x72, 0xb5, 0x5a, 0x6f, 0xc0, 0xc8, 0x96, 0x4b, 0x9a, 0x0d, 0x4c, 0xb6, 0xc4, 0x4a, 0x7c, + 0x2a, 0xdf, 0x0e, 0x65, 0x95, 0x62, 0x4a, 0xa9, 0x17, 0x7f, 0x1d, 0xae, 0x8a, 0xca, 0x58, 0x91, + 0x41, 0xbb, 0x30, 0x25, 0x1f, 0x0c, 0x12, 0x2a, 0xd6, 0xe5, 0xd3, 0xdd, 0x5e, 0x21, 0x26, 0xf1, + 0x53, 0x0f, 0x0e, 0xe6, 0xa7, 0x70, 0x82, 0x0c, 0x4e, 0x11, 0xa6, 0xcf, 0xc1, 0x16, 0x3d, 0x81, + 0x07, 0xd8, 0xf0, 0xb3, 0xe7, 0x20, 0x7b, 0xd9, 0xb2, 0x52, 0xfb, 0xc7, 0x2c, 0x78, 0x2c, 0x35, + 0x32, 0xe2, 0x85, 0x7f, 0xcc, 0xb3, 0x90, 0x7c, 0x71, 0x17, 0x7a, 0xbf, 0xb8, 0xed, 0xbf, 0x6b, + 0xc1, 0xa9, 0x95, 0x56, 0x3b, 0xda, 0x2f, 0xbb, 0xa6, 0x0a, 0xea, 0x23, 0x30, 0xd4, 0x22, 0x0d, + 0xb7, 0xd3, 0x12, 0x33, 0x37, 0x2f, 0x4f, 0xa9, 0x35, 0x56, 0x7a, 0x78, 0x30, 0x3f, 0x5e, 0x8b, + 0xfc, 0xc0, 0xd9, 0x26, 0xbc, 0x00, 0x0b, 0x74, 0x76, 0xd6, 0xbb, 0x6f, 0x93, 0x9b, 0x6e, 0xcb, + 0x95, 0x76, 0x45, 0x5d, 0x65, 0x76, 0x0b, 0x72, 0x40, 0x17, 0xde, 0xe8, 0x38, 0x5e, 0xe4, 0x46, + 0xfb, 0x42, 0x7b, 0x24, 0x89, 0xe0, 0x98, 0x9e, 0xfd, 0x55, 0x0b, 0x26, 0xe5, 0xba, 0x5f, 0x6c, + 0x34, 0x02, 0x12, 0x86, 0x68, 0x0e, 0x0a, 0x6e, 0x5b, 0xf4, 0x12, 0x44, 0x2f, 0x0b, 0x95, 0x2a, + 0x2e, 0xb8, 0x6d, 0xc9, 0x96, 0xb1, 0x83, 0xb0, 0x68, 0x2a, 0xd2, 0xae, 0x8b, 0x72, 0xac, 0x30, + 0xd0, 0x65, 0x18, 0xf1, 0xfc, 0x06, 0xb7, 0xed, 0xe2, 0x57, 0x1a, 0x5b, 0x60, 0xeb, 0xa2, 0x0c, + 0x2b, 0x28, 0xaa, 0x42, 0x89, 0x9b, 0x3d, 0xc5, 0x8b, 0xb6, 0x2f, 0xe3, 0x29, 0xf6, 0x65, 0x1b, + 0xb2, 0x26, 0x8e, 0x89, 0xd8, 0xbf, 0x62, 0xc1, 0x98, 0xfc, 0xb2, 0x3e, 0x79, 0x4e, 0xba, 0xb5, + 0x62, 0x7e, 0x33, 0xde, 0x5a, 0x94, 0x67, 0x64, 0x10, 0x83, 0x55, 0x2c, 0x1e, 0x89, 0x55, 0xbc, + 0x0a, 0xa3, 0x4e, 0xbb, 0x5d, 0x35, 0xf9, 0x4c, 0xb6, 0x94, 0x16, 0xe3, 0x62, 0xac, 0xe3, 0xd8, + 0x3f, 0x5a, 0x80, 0x09, 0xf9, 0x05, 0xb5, 0xce, 0x66, 0x48, 0x22, 0xb4, 0x01, 0x25, 0x87, 0xcf, + 0x12, 0x91, 0x8b, 0xfc, 0x62, 0xb6, 0x1c, 0xc1, 0x98, 0xd2, 0xf8, 0xc2, 0x5f, 0x94, 0xb5, 0x71, + 0x4c, 0x08, 0x35, 0x61, 0xda, 0xf3, 0x23, 0x76, 0xf8, 0x2b, 0x78, 0x37, 0xd5, 0x4e, 0x92, 0xfa, + 0x59, 0x41, 0x7d, 0x7a, 0x3d, 0x49, 0x05, 0xa7, 0x09, 0xa3, 0x15, 0x29, 0x9b, 0x29, 0xe6, 0x0b, + 0x03, 0xf4, 0x89, 0xcb, 0x16, 0xcd, 0xd8, 0xbf, 0x6c, 0x41, 0x49, 0xa2, 0x9d, 0x84, 0x16, 0x6f, + 0x0d, 0x86, 0x43, 0x36, 0x09, 0x72, 0x68, 0xec, 0x6e, 0x1d, 0xe7, 0xf3, 0x15, 0xdf, 0x69, 0xfc, + 0x7f, 0x88, 0x25, 0x0d, 0x26, 0x9a, 0x57, 0xdd, 0x7f, 0x97, 0x88, 0xe6, 0x55, 0x7f, 0x72, 0x2e, + 0xa5, 0x3f, 0x64, 0x7d, 0xd6, 0x64, 0x5d, 0x94, 0xf5, 0x6a, 0x07, 0x64, 0xcb, 0xbd, 0x9f, 0x64, + 0xbd, 0xaa, 0xac, 0x14, 0x0b, 0x28, 0x7a, 0x13, 0xc6, 0xea, 0x52, 0x26, 0x1b, 0xef, 0xf0, 0x4b, + 0x5d, 0xf5, 0x03, 0x4a, 0x95, 0xc4, 0x65, 0x21, 0xcb, 0x5a, 0x7d, 0x6c, 0x50, 0x33, 0xcd, 0x08, + 0x8a, 0xbd, 0xcc, 0x08, 0x62, 0xba, 0xf9, 0x4a, 0xf5, 0x1f, 0xb7, 0x60, 0x88, 0xcb, 0xe2, 0xfa, + 0x13, 0x85, 0x6a, 0x9a, 0xb5, 0x78, 0xec, 0xee, 0xd0, 0x42, 0xa1, 0x29, 0x43, 0x6b, 0x50, 0x62, + 0x3f, 0x98, 0x2c, 0xb1, 0x98, 0x6f, 0x75, 0xcf, 0x5b, 0xd5, 0x3b, 0x78, 0x47, 0x56, 0xc3, 0x31, + 0x05, 0xfb, 0x87, 0x8b, 0xf4, 0x74, 0x8b, 0x51, 0x8d, 0x4b, 0xdf, 0x7a, 0x74, 0x97, 0x7e, 0xe1, + 0x51, 0x5d, 0xfa, 0xdb, 0x30, 0x59, 0xd7, 0xf4, 0x70, 0xf1, 0x4c, 0x5e, 0xee, 0xba, 0x48, 0x34, + 0x95, 0x1d, 0x97, 0xb2, 0x2c, 0x9b, 0x44, 0x70, 0x92, 0x2a, 0xfa, 0x36, 0x18, 0xe3, 0xf3, 0x2c, + 0x5a, 0xe1, 0x96, 0x18, 0x1f, 0xc8, 0x5f, 0x2f, 0x7a, 0x13, 0x5c, 0x2a, 0xa7, 0x55, 0xc7, 0x06, + 0x31, 0xfb, 0x4f, 0x2c, 0x40, 0x2b, 0xed, 0x1d, 0xd2, 0x22, 0x81, 0xd3, 0x8c, 0xc5, 0xe9, 0xdf, + 0x6f, 0xc1, 0x2c, 0x49, 0x15, 0x2f, 0xfb, 0xad, 0x96, 0x78, 0xb4, 0xe4, 0xbc, 0xab, 0x57, 0x72, + 0xea, 0x28, 0xb7, 0x84, 0xd9, 0x3c, 0x0c, 0x9c, 0xdb, 0x1e, 0x5a, 0x83, 0x19, 0x7e, 0x4b, 0x2a, + 0x80, 0x66, 0x7b, 0xfd, 0xb8, 0x20, 0x3c, 0xb3, 0x91, 0x46, 0xc1, 0x59, 0xf5, 0xec, 0xef, 0x1a, + 0x83, 0xdc, 0x5e, 0xbc, 0xa7, 0x47, 0x78, 0x4f, 0x8f, 0xf0, 0x9e, 0x1e, 0xe1, 0x3d, 0x3d, 0xc2, + 0x7b, 0x7a, 0x84, 0x6f, 0x7a, 0x3d, 0xc2, 0x1f, 0x59, 0x30, 0x93, 0xbe, 0x06, 0x4e, 0x82, 0x31, + 0xef, 0xc0, 0x4c, 0xfa, 0xae, 0xeb, 0x6a, 0x67, 0x97, 0xee, 0x67, 0x7c, 0xef, 0x65, 0x7c, 0x03, + 0xce, 0xa2, 0x6f, 0xff, 0x65, 0x0b, 0x4e, 0x2b, 0x64, 0xe3, 0xa5, 0xff, 0x79, 0x98, 0xe1, 0xe7, + 0xcb, 0x72, 0xd3, 0x71, 0x5b, 0x1b, 0xa4, 0xd5, 0x6e, 0x3a, 0x91, 0x34, 0x33, 0xb8, 0x9a, 0xb9, + 0x55, 0x13, 0x26, 0xba, 0x46, 0xc5, 0xa5, 0xc7, 0x68, 0xbf, 0x32, 0x00, 0x38, 0xab, 0x19, 0xfb, + 0x17, 0x46, 0x60, 0x70, 0x65, 0x8f, 0x78, 0xd1, 0x09, 0x0c, 0x7d, 0x1d, 0x26, 0x5c, 0x6f, 0xcf, + 0x6f, 0xee, 0x91, 0x06, 0x87, 0x1f, 0xe5, 0xe9, 0x7e, 0x46, 0x90, 0x9e, 0xa8, 0x18, 0x24, 0x70, + 0x82, 0xe4, 0xa3, 0x10, 0x9f, 0x5f, 0x83, 0x21, 0x7e, 0x6b, 0x09, 0xd9, 0x79, 0xe6, 0x25, 0xc5, + 0x06, 0x51, 0xdc, 0xc5, 0xb1, 0x68, 0x9f, 0xdf, 0x8a, 0xa2, 0x3a, 0xfa, 0x1c, 0x4c, 0x6c, 0xb9, + 0x41, 0x18, 0x6d, 0xb8, 0x2d, 0x12, 0x46, 0x4e, 0xab, 0xfd, 0x10, 0xe2, 0x72, 0x35, 0x0e, 0xab, + 0x06, 0x25, 0x9c, 0xa0, 0x8c, 0xb6, 0x61, 0xbc, 0xe9, 0xe8, 0x4d, 0x0d, 0x1f, 0xb9, 0x29, 0x75, + 0x1d, 0xde, 0xd4, 0x09, 0x61, 0x93, 0x2e, 0x3d, 0x3f, 0xea, 0x4c, 0xe2, 0x3b, 0xc2, 0xe4, 0x20, + 0xea, 0xfc, 0xe0, 0xa2, 0x5e, 0x0e, 0xa3, 0x9c, 0x1d, 0xb3, 0x08, 0x2e, 0x99, 0x9c, 0x9d, 0x66, + 0xf7, 0xfb, 0x59, 0x28, 0x11, 0x3a, 0x84, 0x94, 0xb0, 0xb8, 0x51, 0xaf, 0xf4, 0xd7, 0xd7, 0x35, + 0xb7, 0x1e, 0xf8, 0xa6, 0xa2, 0x62, 0x45, 0x52, 0xc2, 0x31, 0x51, 0xb4, 0x0c, 0x43, 0x21, 0x09, + 0x5c, 0x12, 0x8a, 0xbb, 0xb5, 0xcb, 0x34, 0x32, 0x34, 0xee, 0x4c, 0xc3, 0x7f, 0x63, 0x51, 0x95, + 0x2e, 0x2f, 0x87, 0xc9, 0x70, 0xd9, 0xed, 0xa7, 0x2d, 0xaf, 0x45, 0x56, 0x8a, 0x05, 0x14, 0xbd, + 0x0e, 0xc3, 0x01, 0x69, 0x32, 0x4d, 0xd8, 0x78, 0xff, 0x8b, 0x9c, 0x2b, 0xd6, 0x78, 0x3d, 0x2c, + 0x09, 0xa0, 0x1b, 0x80, 0x02, 0x42, 0x39, 0x43, 0xd7, 0xdb, 0x56, 0x76, 0xb2, 0xe2, 0x66, 0x51, + 0x27, 0x11, 0x8e, 0x31, 0xa4, 0x5f, 0x13, 0xce, 0xa8, 0x86, 0xae, 0xc1, 0xb4, 0x2a, 0xad, 0x78, + 0x61, 0xe4, 0xd0, 0x13, 0x7d, 0x92, 0xd1, 0x52, 0x82, 0x19, 0x9c, 0x44, 0xc0, 0xe9, 0x3a, 0xf6, + 0x97, 0x2d, 0xe0, 0xe3, 0x7c, 0x02, 0xe2, 0x88, 0xd7, 0x4c, 0x71, 0xc4, 0xd9, 0xdc, 0x99, 0xcb, + 0x11, 0x45, 0x7c, 0xd9, 0x82, 0x51, 0x6d, 0x66, 0xe3, 0x35, 0x6b, 0x75, 0x59, 0xb3, 0x1d, 0x98, + 0xa2, 0x2b, 0xfd, 0xd6, 0x66, 0x48, 0x82, 0x3d, 0xd2, 0x60, 0x0b, 0xb3, 0xf0, 0x70, 0x0b, 0x53, + 0xd9, 0xe4, 0xdd, 0x4c, 0x10, 0xc4, 0xa9, 0x26, 0xec, 0xcf, 0xca, 0xae, 0x2a, 0x13, 0xc6, 0xba, + 0x9a, 0xf3, 0x84, 0x09, 0xa3, 0x9a, 0x55, 0x1c, 0xe3, 0xd0, 0xad, 0xb6, 0xe3, 0x87, 0x51, 0xd2, + 0x84, 0xf1, 0xba, 0x1f, 0x46, 0x98, 0x41, 0xec, 0x17, 0x00, 0x56, 0xee, 0x93, 0x3a, 0x5f, 0xb1, + 0xfa, 0x6b, 0xc9, 0xca, 0x7f, 0x2d, 0xd9, 0xbf, 0x65, 0xc1, 0xc4, 0xea, 0xb2, 0x71, 0x73, 0x2d, + 0x00, 0xf0, 0x27, 0xde, 0xdd, 0xbb, 0xeb, 0x52, 0xff, 0xcf, 0x55, 0xb8, 0xaa, 0x14, 0x6b, 0x18, + 0xe8, 0x2c, 0x14, 0x9b, 0x1d, 0x4f, 0xc8, 0x4b, 0x87, 0x29, 0x3f, 0x70, 0xb3, 0xe3, 0x61, 0x5a, + 0xa6, 0xf9, 0x50, 0x14, 0xfb, 0xf6, 0xa1, 0xe8, 0x19, 0xcb, 0x00, 0xcd, 0xc3, 0xe0, 0xbd, 0x7b, + 0x6e, 0x83, 0x7b, 0x8c, 0x0a, 0xdb, 0x84, 0xbb, 0x77, 0x2b, 0xe5, 0x10, 0xf3, 0x72, 0xfb, 0x4b, + 0x45, 0x98, 0x5b, 0x6d, 0x92, 0xfb, 0xef, 0xd0, 0x6b, 0xb6, 0x5f, 0x0f, 0x90, 0xa3, 0x49, 0x9e, + 0x8e, 0xea, 0xe5, 0xd3, 0x7b, 0x3c, 0xb6, 0x60, 0x98, 0x5b, 0xf0, 0x49, 0x1f, 0xda, 0x57, 0xb3, + 0x5a, 0xcf, 0x1f, 0x90, 0x05, 0x6e, 0x09, 0x28, 0x5c, 0x00, 0xd5, 0x85, 0x29, 0x4a, 0xb1, 0x24, + 0x3e, 0xf7, 0x0a, 0x8c, 0xe9, 0x98, 0x47, 0xf2, 0xb7, 0xfb, 0xff, 0x8a, 0x30, 0x45, 0x7b, 0xf0, + 0x48, 0x27, 0xe2, 0x76, 0x7a, 0x22, 0x8e, 0xdb, 0xe7, 0xaa, 0xf7, 0x6c, 0xbc, 0x99, 0x9c, 0x8d, + 0xab, 0x79, 0xb3, 0x71, 0xd2, 0x73, 0xf0, 0x9d, 0x16, 0xcc, 0xac, 0x36, 0xfd, 0xfa, 0x6e, 0xc2, + 0x2f, 0xea, 0x25, 0x18, 0xa5, 0xc7, 0x71, 0x68, 0xb8, 0xec, 0x1b, 0x41, 0x1c, 0x04, 0x08, 0xeb, + 0x78, 0x5a, 0xb5, 0xdb, 0xb7, 0x2b, 0xe5, 0xac, 0xd8, 0x0f, 0x02, 0x84, 0x75, 0x3c, 0xfb, 0x37, + 0x2c, 0x38, 0x77, 0x6d, 0x79, 0x25, 0x5e, 0x8a, 0xa9, 0xf0, 0x13, 0x97, 0x60, 0xa8, 0xdd, 0xd0, + 0xba, 0x12, 0xcb, 0x93, 0xcb, 0xac, 0x17, 0x02, 0xfa, 0x6e, 0x09, 0xad, 0xf2, 0x53, 0x16, 0xcc, + 0x5c, 0x73, 0x23, 0x7a, 0xbb, 0x26, 0x03, 0x21, 0xd0, 0xeb, 0x35, 0x74, 0x23, 0x3f, 0xd8, 0x4f, + 0x06, 0x42, 0xc0, 0x0a, 0x82, 0x35, 0x2c, 0xde, 0xf2, 0x9e, 0xcb, 0x6c, 0xc7, 0x0b, 0xa6, 0x66, + 0x0d, 0x8b, 0x72, 0xac, 0x30, 0xe8, 0x87, 0x35, 0xdc, 0x80, 0x09, 0x25, 0xf7, 0xc5, 0x09, 0xab, + 0x3e, 0xac, 0x2c, 0x01, 0x38, 0xc6, 0xa1, 0xef, 0xb3, 0xf9, 0x6b, 0xcd, 0x4e, 0x18, 0x91, 0x60, + 0x2b, 0xcc, 0x39, 0x1d, 0x5f, 0x80, 0x12, 0x91, 0x2a, 0x00, 0xd1, 0x6b, 0xc5, 0x31, 0x2a, 0xdd, + 0x00, 0x8f, 0xc7, 0xa0, 0xf0, 0xfa, 0xf0, 0xb2, 0x3c, 0x9a, 0x9b, 0xdc, 0x2a, 0x20, 0xa2, 0xb7, + 0xa5, 0x07, 0xa8, 0x60, 0x9e, 0xee, 0x2b, 0x29, 0x28, 0xce, 0xa8, 0x61, 0xff, 0x98, 0x05, 0xa7, + 0xd5, 0x07, 0xbf, 0xeb, 0x3e, 0xd3, 0xfe, 0xd9, 0x02, 0x8c, 0x5f, 0xdf, 0xd8, 0xa8, 0x5e, 0x23, + 0x91, 0xb8, 0xb6, 0x7b, 0x2b, 0xf6, 0xb1, 0xa6, 0x9f, 0xec, 0xf6, 0x98, 0xeb, 0x44, 0x6e, 0x73, + 0x81, 0xc7, 0x39, 0x5a, 0xa8, 0x78, 0xd1, 0xad, 0xa0, 0x16, 0x05, 0xae, 0xb7, 0x9d, 0xa9, 0xd1, + 0x94, 0xcc, 0x45, 0x31, 0x8f, 0xb9, 0x40, 0x2f, 0xc0, 0x10, 0x0b, 0xb4, 0x24, 0x27, 0xe1, 0x71, + 0xf5, 0x16, 0x62, 0xa5, 0x87, 0x07, 0xf3, 0xa5, 0xdb, 0xb8, 0xc2, 0xff, 0x60, 0x81, 0x8a, 0x6e, + 0xc3, 0xe8, 0x4e, 0x14, 0xb5, 0xaf, 0x13, 0xa7, 0x41, 0x1f, 0xe3, 0xfc, 0x38, 0x3c, 0x9f, 0x75, + 0x1c, 0xd2, 0x41, 0xe0, 0x68, 0xf1, 0x09, 0x12, 0x97, 0x85, 0x58, 0xa7, 0x63, 0xd7, 0x00, 0x62, + 0xd8, 0x31, 0xa9, 0x66, 0xec, 0x3f, 0xb0, 0x60, 0x98, 0xc7, 0xbc, 0x08, 0xd0, 0x47, 0x61, 0x80, + 0xdc, 0x27, 0x75, 0xc1, 0xf1, 0x66, 0x76, 0x38, 0xe6, 0xb4, 0xb8, 0x88, 0x99, 0xfe, 0xc7, 0xac, + 0x16, 0xba, 0x0e, 0xc3, 0xb4, 0xb7, 0xd7, 0x54, 0x00, 0x90, 0x27, 0xf3, 0xbe, 0x58, 0x4d, 0x3b, + 0x67, 0xce, 0x44, 0x11, 0x96, 0xd5, 0x99, 0x3e, 0xbc, 0xde, 0xae, 0xd1, 0x13, 0x3b, 0xea, 0xc6, + 0x58, 0x6c, 0x2c, 0x57, 0x39, 0x92, 0xa0, 0xc6, 0xf5, 0xe1, 0xb2, 0x10, 0xc7, 0x44, 0xec, 0x0d, + 0x28, 0xd1, 0x49, 0x5d, 0x6c, 0xba, 0x4e, 0x77, 0x15, 0xff, 0x33, 0x50, 0x92, 0x0a, 0xfc, 0x50, + 0xf8, 0xba, 0x33, 0xaa, 0x52, 0xbf, 0x1f, 0xe2, 0x18, 0x6e, 0x6f, 0xc1, 0x29, 0x66, 0x8e, 0xe9, + 0x44, 0x3b, 0xc6, 0x1e, 0xeb, 0xbd, 0x98, 0x9f, 0x15, 0x0f, 0x48, 0x3e, 0x33, 0xb3, 0x9a, 0x3b, + 0xe9, 0x98, 0xa4, 0x18, 0x3f, 0x26, 0xed, 0xaf, 0x0d, 0xc0, 0xe3, 0x95, 0x5a, 0x7e, 0x38, 0x94, + 0x97, 0x61, 0x8c, 0xf3, 0xa5, 0x74, 0x69, 0x3b, 0x4d, 0xd1, 0xae, 0x92, 0x2d, 0x6f, 0x68, 0x30, + 0x6c, 0x60, 0xa2, 0x73, 0x50, 0x74, 0xdf, 0xf2, 0x92, 0xce, 0x56, 0x95, 0x37, 0xd6, 0x31, 0x2d, + 0xa7, 0x60, 0xca, 0xe2, 0xf2, 0xbb, 0x43, 0x81, 0x15, 0x9b, 0xfb, 0x1a, 0x4c, 0xb8, 0x61, 0x3d, + 0x74, 0x2b, 0x1e, 0x3d, 0x67, 0xb4, 0x93, 0x4a, 0x09, 0x37, 0x68, 0xa7, 0x15, 0x14, 0x27, 0xb0, + 0xb5, 0x8b, 0x6c, 0xb0, 0x6f, 0x36, 0xb9, 0xa7, 0xf3, 0x37, 0x7d, 0x01, 0xb4, 0xd9, 0xd7, 0x85, + 0x4c, 0x49, 0x20, 0x5e, 0x00, 0xfc, 0x83, 0x43, 0x2c, 0x61, 0xf4, 0xe5, 0x58, 0xdf, 0x71, 0xda, + 0x8b, 0x9d, 0x68, 0xa7, 0xec, 0x86, 0x75, 0x7f, 0x8f, 0x04, 0xfb, 0xec, 0xd1, 0x3f, 0x12, 0xbf, + 0x1c, 0x15, 0x60, 0xf9, 0xfa, 0x62, 0x95, 0x62, 0xe2, 0x74, 0x1d, 0xb4, 0x08, 0x93, 0xb2, 0xb0, + 0x46, 0x42, 0x76, 0x85, 0x8d, 0x32, 0x32, 0xca, 0xfd, 0x49, 0x14, 0x2b, 0x22, 0x49, 0x7c, 0x93, + 0x93, 0x86, 0xe3, 0xe0, 0xa4, 0x3f, 0x02, 0xe3, 0xae, 0xe7, 0x46, 0xae, 0x13, 0xf9, 0x5c, 0xc3, + 0xc5, 0xdf, 0xf7, 0x4c, 0x74, 0x5f, 0xd1, 0x01, 0xd8, 0xc4, 0xb3, 0xff, 0xcb, 0x00, 0x4c, 0xb3, + 0x69, 0x7b, 0x6f, 0x85, 0x7d, 0x33, 0xad, 0xb0, 0xdb, 0xe9, 0x15, 0x76, 0x1c, 0x4f, 0x84, 0x87, + 0x5e, 0x66, 0x9f, 0x83, 0x92, 0xf2, 0xf8, 0x92, 0x2e, 0x9f, 0x56, 0x8e, 0xcb, 0x67, 0x6f, 0xee, + 0x43, 0x1a, 0xcd, 0x15, 0x33, 0x8d, 0xe6, 0xfe, 0xba, 0x05, 0xb1, 0xca, 0x06, 0x5d, 0x87, 0x52, + 0xdb, 0x67, 0xb6, 0xa0, 0x81, 0x34, 0xb0, 0x7e, 0x3c, 0xf3, 0xa2, 0xe2, 0x97, 0x22, 0xff, 0xf8, + 0xaa, 0xac, 0x81, 0xe3, 0xca, 0x68, 0x09, 0x86, 0xdb, 0x01, 0xa9, 0x45, 0x2c, 0x2a, 0x4a, 0x4f, + 0x3a, 0x7c, 0x8d, 0x70, 0x7c, 0x2c, 0x2b, 0xda, 0x3f, 0x67, 0x01, 0x70, 0xbb, 0x34, 0xc7, 0xdb, + 0x26, 0x27, 0x20, 0xb5, 0x2e, 0xc3, 0x40, 0xd8, 0x26, 0xf5, 0x6e, 0x56, 0xba, 0x71, 0x7f, 0x6a, + 0x6d, 0x52, 0x8f, 0x07, 0x9c, 0xfe, 0xc3, 0xac, 0xb6, 0xfd, 0xdd, 0x00, 0x13, 0x31, 0x5a, 0x25, + 0x22, 0x2d, 0xf4, 0x9c, 0x11, 0x25, 0xe1, 0x6c, 0x22, 0x4a, 0x42, 0x89, 0x61, 0x6b, 0x02, 0xd2, + 0xcf, 0x41, 0xb1, 0xe5, 0xdc, 0x17, 0x12, 0xb0, 0x67, 0xba, 0x77, 0x83, 0xd2, 0x5f, 0x58, 0x73, + 0xee, 0xf3, 0x47, 0xe2, 0x33, 0x72, 0x81, 0xac, 0x39, 0xf7, 0x0f, 0xb9, 0x2d, 0x2e, 0x3b, 0xa4, + 0x6e, 0xba, 0x61, 0xf4, 0x85, 0xff, 0x1c, 0xff, 0x67, 0xcb, 0x8e, 0x36, 0xc2, 0xda, 0x72, 0x3d, + 0x61, 0x72, 0xd5, 0x57, 0x5b, 0xae, 0x97, 0x6c, 0xcb, 0xf5, 0xfa, 0x68, 0xcb, 0xf5, 0xd0, 0xdb, + 0x30, 0x2c, 0x2c, 0x22, 0x45, 0x54, 0xa2, 0x2b, 0x7d, 0xb4, 0x27, 0x0c, 0x2a, 0x79, 0x9b, 0x57, + 0xe4, 0x23, 0x58, 0x94, 0xf6, 0x6c, 0x57, 0x36, 0x88, 0xfe, 0x8a, 0x05, 0x13, 0xe2, 0x37, 0x26, + 0x6f, 0x75, 0x48, 0x18, 0x09, 0xde, 0xf3, 0xc3, 0xfd, 0xf7, 0x41, 0x54, 0xe4, 0x5d, 0xf9, 0xb0, + 0x3c, 0x66, 0x4d, 0x60, 0xcf, 0x1e, 0x25, 0x7a, 0x81, 0xfe, 0xbe, 0x05, 0xa7, 0x5a, 0xce, 0x7d, + 0xde, 0x22, 0x2f, 0xc3, 0x4e, 0xe4, 0xfa, 0xc2, 0xb2, 0xe0, 0xa3, 0xfd, 0x4d, 0x7f, 0xaa, 0x3a, + 0xef, 0xa4, 0x54, 0x7f, 0x9e, 0xca, 0x42, 0xe9, 0xd9, 0xd5, 0xcc, 0x7e, 0xcd, 0x6d, 0xc1, 0x88, + 0x5c, 0x6f, 0x19, 0xa2, 0x86, 0xb2, 0xce, 0x58, 0x1f, 0xd9, 0x20, 0x55, 0x8f, 0x3e, 0x40, 0xdb, + 0x11, 0x6b, 0xed, 0x91, 0xb6, 0xf3, 0x39, 0x18, 0xd3, 0xd7, 0xd8, 0x23, 0x6d, 0xeb, 0x2d, 0x98, + 0xc9, 0x58, 0x4b, 0x8f, 0xb4, 0xc9, 0x7b, 0x70, 0x36, 0x77, 0x7d, 0x3c, 0xca, 0x86, 0xed, 0x9f, + 0xb5, 0xf4, 0x73, 0xf0, 0x04, 0x54, 0x07, 0xcb, 0xa6, 0xea, 0xe0, 0x7c, 0xf7, 0x9d, 0x93, 0xa3, + 0x3f, 0x78, 0x53, 0xef, 0x34, 0x3d, 0xd5, 0xd1, 0xeb, 0x30, 0xd4, 0xa4, 0x25, 0xd2, 0xae, 0xd6, + 0xee, 0xbd, 0x23, 0x63, 0x5e, 0x8a, 0x95, 0x87, 0x58, 0x50, 0xb0, 0x7f, 0xd1, 0x82, 0x81, 0x13, + 0x18, 0x09, 0x6c, 0x8e, 0xc4, 0x73, 0xb9, 0xa4, 0x45, 0xc0, 0xe4, 0x05, 0xec, 0xdc, 0x5b, 0xb9, + 0x1f, 0x11, 0x2f, 0x64, 0x4f, 0xc5, 0xcc, 0x81, 0xf9, 0x49, 0x0b, 0x66, 0x6e, 0xfa, 0x4e, 0x63, + 0xc9, 0x69, 0x3a, 0x5e, 0x9d, 0x04, 0x15, 0x6f, 0xfb, 0x48, 0x46, 0xe1, 0x85, 0x9e, 0x46, 0xe1, + 0xcb, 0xd2, 0xa6, 0x6a, 0x20, 0x7f, 0xfe, 0x28, 0x23, 0x99, 0x8c, 0x1b, 0x63, 0x58, 0xff, 0xee, + 0x00, 0xd2, 0x7b, 0x29, 0x5c, 0x74, 0x30, 0x0c, 0xbb, 0xbc, 0xbf, 0x62, 0x12, 0x9f, 0xca, 0x66, + 0xf0, 0x52, 0x9f, 0xa7, 0x39, 0x9f, 0xf0, 0x02, 0x2c, 0x09, 0xd9, 0x2f, 0x43, 0xa6, 0x9f, 0x7f, + 0x6f, 0xe1, 0x83, 0xfd, 0x49, 0x98, 0x66, 0x35, 0x8f, 0xf8, 0x30, 0xb6, 0x13, 0xb2, 0xcd, 0x8c, + 0x08, 0x80, 0xf6, 0x17, 0x2d, 0x98, 0x5c, 0x4f, 0x04, 0x46, 0xbb, 0xc4, 0xb4, 0xa1, 0x19, 0x22, + 0xf5, 0x1a, 0x2b, 0xc5, 0x02, 0x7a, 0xec, 0x92, 0xac, 0xbf, 0xb0, 0x20, 0x0e, 0xbd, 0x71, 0x02, + 0xec, 0xdb, 0xb2, 0xc1, 0xbe, 0x65, 0x4a, 0x58, 0x54, 0x77, 0xf2, 0xb8, 0x37, 0x74, 0x43, 0x05, + 0xa5, 0xea, 0x22, 0x5c, 0x89, 0xc9, 0xf0, 0xa5, 0x38, 0x61, 0x46, 0xae, 0x92, 0x61, 0xaa, 0xec, + 0xdf, 0x2e, 0x00, 0x52, 0xb8, 0x7d, 0x07, 0xcd, 0x4a, 0xd7, 0x38, 0x9e, 0xa0, 0x59, 0x7b, 0x80, + 0x98, 0x3e, 0x3f, 0x70, 0xbc, 0x90, 0x93, 0x75, 0x85, 0xec, 0xee, 0x68, 0xc6, 0x02, 0x73, 0xa2, + 0x49, 0x74, 0x33, 0x45, 0x0d, 0x67, 0xb4, 0xa0, 0xd9, 0x69, 0x0c, 0xf6, 0x6b, 0xa7, 0x31, 0xd4, + 0xc3, 0x0d, 0xef, 0x67, 0x2c, 0x18, 0x57, 0xc3, 0xf4, 0x2e, 0x31, 0x92, 0x57, 0xfd, 0xc9, 0x39, + 0x40, 0xab, 0x5a, 0x97, 0xd9, 0xc5, 0xf2, 0xad, 0xcc, 0x9d, 0xd2, 0x69, 0xba, 0x6f, 0x13, 0x15, + 0xb2, 0x70, 0x5e, 0xb8, 0x47, 0x8a, 0xd2, 0xc3, 0x83, 0xf9, 0x71, 0xf5, 0x8f, 0x87, 0x48, 0x8e, + 0xab, 0xd0, 0x23, 0x79, 0x32, 0xb1, 0x14, 0xd1, 0x4b, 0x30, 0xd8, 0xde, 0x71, 0x42, 0x92, 0x70, + 0x26, 0x1a, 0xac, 0xd2, 0xc2, 0xc3, 0x83, 0xf9, 0x09, 0x55, 0x81, 0x95, 0x60, 0x8e, 0xdd, 0x7f, + 0x28, 0xb2, 0xf4, 0xe2, 0xec, 0x19, 0x8a, 0xec, 0x4f, 0x2c, 0x18, 0x58, 0xf7, 0x1b, 0x27, 0x71, + 0x04, 0xbc, 0x66, 0x1c, 0x01, 0x4f, 0xe4, 0x45, 0xaf, 0xcf, 0xdd, 0xfd, 0xab, 0x89, 0xdd, 0x7f, + 0x3e, 0x97, 0x42, 0xf7, 0x8d, 0xdf, 0x82, 0x51, 0x16, 0x13, 0x5f, 0x38, 0x4e, 0xbd, 0x60, 0x6c, + 0xf8, 0xf9, 0xc4, 0x86, 0x9f, 0xd4, 0x50, 0xb5, 0x9d, 0xfe, 0x34, 0x0c, 0x0b, 0x4f, 0x9c, 0xa4, + 0x57, 0xaa, 0xc0, 0xc5, 0x12, 0x6e, 0xff, 0x78, 0x11, 0x8c, 0x18, 0xfc, 0xe8, 0x97, 0x2d, 0x58, + 0x08, 0xb8, 0x85, 0x6e, 0xa3, 0xdc, 0x09, 0x5c, 0x6f, 0xbb, 0x56, 0xdf, 0x21, 0x8d, 0x4e, 0xd3, + 0xf5, 0xb6, 0x2b, 0xdb, 0x9e, 0xaf, 0x8a, 0x57, 0xee, 0x93, 0x7a, 0x87, 0x29, 0xc1, 0x7a, 0x04, + 0xfc, 0x57, 0x96, 0xee, 0xcf, 0x3f, 0x38, 0x98, 0x5f, 0xc0, 0x47, 0xa2, 0x8d, 0x8f, 0xd8, 0x17, + 0xf4, 0x1b, 0x16, 0x5c, 0xe1, 0xa1, 0xe9, 0xfb, 0xef, 0x7f, 0x97, 0xd7, 0x72, 0x55, 0x92, 0x8a, + 0x89, 0x6c, 0x90, 0xa0, 0xb5, 0xf4, 0x11, 0x31, 0xa0, 0x57, 0xaa, 0x47, 0x6b, 0x0b, 0x1f, 0xb5, + 0x73, 0xf6, 0x3f, 0x2b, 0xc2, 0xb8, 0x08, 0x59, 0x25, 0xee, 0x80, 0x97, 0x8c, 0x25, 0xf1, 0x64, + 0x62, 0x49, 0x4c, 0x1b, 0xc8, 0xc7, 0x73, 0xfc, 0x87, 0x30, 0x4d, 0x0f, 0xe7, 0xeb, 0xc4, 0x09, + 0xa2, 0x4d, 0xe2, 0x70, 0xf3, 0xab, 0xe2, 0x91, 0x4f, 0x7f, 0x25, 0x9e, 0xbb, 0x99, 0x24, 0x86, + 0xd3, 0xf4, 0xbf, 0x99, 0xee, 0x1c, 0x0f, 0xa6, 0x52, 0x51, 0xc7, 0x3e, 0x05, 0x25, 0xe5, 0x46, + 0x22, 0x0e, 0x9d, 0xee, 0xc1, 0xfb, 0x92, 0x14, 0xb8, 0x08, 0x2d, 0x76, 0x61, 0x8a, 0xc9, 0xd9, + 0xff, 0xa0, 0x60, 0x34, 0xc8, 0x27, 0x71, 0x1d, 0x46, 0x9c, 0x30, 0x74, 0xb7, 0x3d, 0xd2, 0x10, + 0x3b, 0xf6, 0xfd, 0x79, 0x3b, 0xd6, 0x68, 0x86, 0xb9, 0xf2, 0x2c, 0x8a, 0x9a, 0x58, 0xd1, 0x40, + 0xd7, 0xb9, 0x91, 0xdb, 0x9e, 0x7c, 0xef, 0xf5, 0x47, 0x0d, 0xa4, 0x19, 0xdc, 0x1e, 0xc1, 0xa2, + 0x3e, 0xfa, 0x34, 0xb7, 0x42, 0xbc, 0xe1, 0xf9, 0xf7, 0xbc, 0x6b, 0xbe, 0x2f, 0xc3, 0x42, 0xf4, + 0x47, 0x70, 0x5a, 0xda, 0x1e, 0xaa, 0xea, 0xd8, 0xa4, 0xd6, 0x5f, 0x18, 0xcf, 0xcf, 0xc3, 0x0c, + 0x25, 0x6d, 0x7a, 0x6d, 0x87, 0x88, 0xc0, 0xa4, 0x88, 0x87, 0x26, 0xcb, 0xc4, 0xd8, 0x65, 0x3e, + 0xe5, 0xcc, 0xda, 0xb1, 0x1c, 0xf9, 0x86, 0x49, 0x02, 0x27, 0x69, 0xda, 0x7f, 0xdb, 0x02, 0xe6, + 0xc1, 0x7a, 0x02, 0xfc, 0xc8, 0xc7, 0x4c, 0x7e, 0x64, 0x36, 0x6f, 0x90, 0x73, 0x58, 0x91, 0x17, + 0xf9, 0xca, 0xaa, 0x06, 0xfe, 0xfd, 0x7d, 0x61, 0x3a, 0xd2, 0xfb, 0xfd, 0x61, 0xff, 0x6f, 0x8b, + 0x1f, 0x62, 0xca, 0xc9, 0x03, 0x7d, 0x3b, 0x8c, 0xd4, 0x9d, 0xb6, 0x53, 0xe7, 0x09, 0x63, 0x72, + 0x25, 0x7a, 0x46, 0xa5, 0x85, 0x65, 0x51, 0x83, 0x4b, 0xa8, 0x64, 0x5c, 0xbd, 0x11, 0x59, 0xdc, + 0x53, 0x2a, 0xa5, 0x9a, 0x9c, 0xdb, 0x85, 0x71, 0x83, 0xd8, 0x23, 0x15, 0x67, 0x7c, 0x3b, 0xbf, + 0x62, 0x55, 0x1c, 0xc8, 0x16, 0x4c, 0x7b, 0xda, 0x7f, 0x7a, 0xa1, 0xc8, 0xc7, 0xe5, 0xfb, 0x7b, + 0x5d, 0xa2, 0xec, 0xf6, 0xd1, 0x9c, 0x63, 0x13, 0x64, 0x70, 0x9a, 0xb2, 0xfd, 0x13, 0x16, 0x3c, + 0xa6, 0x23, 0x6a, 0xfe, 0x37, 0xbd, 0x74, 0x04, 0x65, 0x18, 0xf1, 0xdb, 0x24, 0x70, 0x22, 0x3f, + 0x10, 0xb7, 0xc6, 0x65, 0x39, 0xe8, 0xb7, 0x44, 0xf9, 0xa1, 0x08, 0xb7, 0x2e, 0xa9, 0xcb, 0x72, + 0xac, 0x6a, 0xd2, 0xd7, 0x27, 0x1b, 0x8c, 0x50, 0x78, 0x5a, 0xb1, 0x33, 0x80, 0xa9, 0xcb, 0x43, + 0x2c, 0x20, 0xf6, 0xd7, 0x2c, 0xbe, 0xb0, 0xf4, 0xae, 0xa3, 0xb7, 0x60, 0xaa, 0xe5, 0x44, 0xf5, + 0x9d, 0x95, 0xfb, 0xed, 0x80, 0x6b, 0x5c, 0xe4, 0x38, 0x3d, 0xd3, 0x6b, 0x9c, 0xb4, 0x8f, 0x8c, + 0x0d, 0x2b, 0xd7, 0x12, 0xc4, 0x70, 0x8a, 0x3c, 0xda, 0x84, 0x51, 0x56, 0xc6, 0x9c, 0x08, 0xc3, + 0x6e, 0xac, 0x41, 0x5e, 0x6b, 0xca, 0xe2, 0x60, 0x2d, 0xa6, 0x83, 0x75, 0xa2, 0xf6, 0x4f, 0x17, + 0xf9, 0x6e, 0x67, 0xac, 0xfc, 0xd3, 0x30, 0xdc, 0xf6, 0x1b, 0xcb, 0x95, 0x32, 0x16, 0xb3, 0xa0, + 0xae, 0x91, 0x2a, 0x2f, 0xc6, 0x12, 0x8e, 0x2e, 0xc3, 0x88, 0xf8, 0x29, 0x35, 0x64, 0xec, 0x6c, + 0x16, 0x78, 0x21, 0x56, 0x50, 0xf4, 0x3c, 0x40, 0x3b, 0xf0, 0xf7, 0xdc, 0x06, 0x0b, 0x6e, 0x51, + 0x34, 0x8d, 0x85, 0xaa, 0x0a, 0x82, 0x35, 0x2c, 0xf4, 0x2a, 0x8c, 0x77, 0xbc, 0x90, 0xb3, 0x23, + 0x5a, 0x28, 0x5b, 0x65, 0xc6, 0x72, 0x5b, 0x07, 0x62, 0x13, 0x17, 0x2d, 0xc2, 0x50, 0xe4, 0x30, + 0xe3, 0x97, 0xc1, 0x7c, 0xe3, 0xdb, 0x0d, 0x8a, 0xa1, 0xe7, 0x26, 0xa1, 0x15, 0xb0, 0xa8, 0x88, + 0x3e, 0x25, 0xfd, 0x79, 0xf9, 0xc1, 0x2e, 0xac, 0xde, 0xfb, 0xbb, 0x04, 0x34, 0x6f, 0x5e, 0x61, + 0x4d, 0x6f, 0xd0, 0x42, 0xaf, 0x00, 0x90, 0xfb, 0x11, 0x09, 0x3c, 0xa7, 0xa9, 0x6c, 0xcb, 0x14, + 0x5f, 0x50, 0xf6, 0xd7, 0xfd, 0xe8, 0x76, 0x48, 0x56, 0x14, 0x06, 0xd6, 0xb0, 0xed, 0xdf, 0x28, + 0x01, 0xc4, 0x7c, 0x3b, 0x7a, 0x3b, 0x75, 0x70, 0x3d, 0xdb, 0x9d, 0xd3, 0x3f, 0xbe, 0x53, 0x0b, + 0x7d, 0x8f, 0x05, 0xa3, 0x4e, 0xb3, 0xe9, 0xd7, 0x1d, 0x1e, 0x6c, 0xb8, 0xd0, 0xfd, 0xe0, 0x14, + 0xed, 0x2f, 0xc6, 0x35, 0x78, 0x17, 0x5e, 0x90, 0x2b, 0x54, 0x83, 0xf4, 0xec, 0x85, 0xde, 0x30, + 0xfa, 0x90, 0x7c, 0x2a, 0x16, 0x8d, 0xa1, 0x54, 0x4f, 0xc5, 0x12, 0xbb, 0x23, 0xf4, 0x57, 0xe2, + 0x6d, 0xe3, 0x95, 0x38, 0x90, 0xef, 0xb0, 0x68, 0xb0, 0xaf, 0xbd, 0x1e, 0x88, 0xa8, 0xaa, 0x07, + 0x2f, 0x18, 0xcc, 0xf7, 0x0e, 0xd4, 0xde, 0x49, 0x3d, 0x02, 0x17, 0x7c, 0x0e, 0x26, 0x1b, 0x26, + 0x13, 0x20, 0x56, 0xe2, 0x53, 0x79, 0x74, 0x13, 0x3c, 0x43, 0x7c, 0xed, 0x27, 0x00, 0x38, 0x49, + 0x18, 0x55, 0x79, 0x2c, 0x8b, 0x8a, 0xb7, 0xe5, 0x0b, 0xcf, 0x0b, 0x3b, 0x77, 0x2e, 0xf7, 0xc3, + 0x88, 0xb4, 0x28, 0x66, 0x7c, 0xbb, 0xaf, 0x8b, 0xba, 0x58, 0x51, 0x41, 0xaf, 0xc3, 0x10, 0x73, + 0x0f, 0x0b, 0x67, 0x47, 0xf2, 0x25, 0xce, 0x66, 0x70, 0xb6, 0x78, 0x43, 0xb2, 0xbf, 0x21, 0x16, + 0x14, 0xd0, 0x75, 0xe9, 0x7c, 0x19, 0x56, 0xbc, 0xdb, 0x21, 0x61, 0xce, 0x97, 0xa5, 0xa5, 0xf7, + 0xc7, 0x7e, 0x95, 0xbc, 0x3c, 0x33, 0x83, 0x99, 0x51, 0x93, 0x72, 0x51, 0xe2, 0xbf, 0x4c, 0x8c, + 0x36, 0x0b, 0xf9, 0xdd, 0x33, 0x93, 0xa7, 0xc5, 0xc3, 0x79, 0xc7, 0x24, 0x81, 0x93, 0x34, 0x29, + 0x47, 0xca, 0x77, 0xbd, 0xf0, 0xdd, 0xe8, 0x75, 0x76, 0xf0, 0x87, 0x38, 0xbb, 0x8d, 0x78, 0x09, + 0x16, 0xf5, 0x4f, 0x94, 0x3d, 0x98, 0xf3, 0x60, 0x2a, 0xb9, 0x45, 0x1f, 0x29, 0x3b, 0xf2, 0x07, + 0x03, 0x30, 0x61, 0x2e, 0x29, 0x74, 0x05, 0x4a, 0x82, 0x88, 0x4a, 0x66, 0xa0, 0x76, 0xc9, 0x9a, + 0x04, 0xe0, 0x18, 0x87, 0xe5, 0xb0, 0x60, 0xd5, 0x35, 0x63, 0xdd, 0x38, 0x87, 0x85, 0x82, 0x60, + 0x0d, 0x8b, 0x3e, 0xac, 0x36, 0x7d, 0x3f, 0x52, 0x17, 0x92, 0x5a, 0x77, 0x4b, 0xac, 0x14, 0x0b, + 0x28, 0xbd, 0x88, 0x76, 0x49, 0xe0, 0x91, 0xa6, 0x19, 0xf6, 0x58, 0x5d, 0x44, 0x37, 0x74, 0x20, + 0x36, 0x71, 0xe9, 0x75, 0xea, 0x87, 0x6c, 0x21, 0x8b, 0xe7, 0x5b, 0x6c, 0xfc, 0x5c, 0xe3, 0xfe, + 0xdf, 0x12, 0x8e, 0x3e, 0x09, 0x8f, 0xa9, 0xd0, 0x4e, 0x98, 0x6b, 0x33, 0x64, 0x8b, 0x43, 0x86, + 0xb4, 0xe5, 0xb1, 0xe5, 0x6c, 0x34, 0x9c, 0x57, 0x1f, 0xbd, 0x06, 0x13, 0x82, 0xc5, 0x97, 0x14, + 0x87, 0x4d, 0x03, 0x9b, 0x1b, 0x06, 0x14, 0x27, 0xb0, 0x65, 0xe0, 0x66, 0xc6, 0x65, 0x4b, 0x0a, + 0x23, 0xe9, 0xc0, 0xcd, 0x3a, 0x1c, 0xa7, 0x6a, 0xa0, 0x45, 0x98, 0xe4, 0x3c, 0x98, 0xeb, 0x6d, + 0xf3, 0x39, 0x11, 0xae, 0x55, 0x6a, 0x4b, 0xdd, 0x32, 0xc1, 0x38, 0x89, 0x8f, 0x5e, 0x86, 0x31, + 0x27, 0xa8, 0xef, 0xb8, 0x11, 0xa9, 0x47, 0x9d, 0x80, 0xfb, 0x5c, 0x69, 0x16, 0x4a, 0x8b, 0x1a, + 0x0c, 0x1b, 0x98, 0xf6, 0xdb, 0x30, 0x93, 0x11, 0x18, 0x82, 0x2e, 0x1c, 0xa7, 0xed, 0xca, 0x6f, + 0x4a, 0x98, 0x31, 0x2f, 0x56, 0x2b, 0xf2, 0x6b, 0x34, 0x2c, 0xba, 0x3a, 0x59, 0x00, 0x09, 0x2d, + 0x0f, 0xa2, 0x5a, 0x9d, 0xab, 0x12, 0x80, 0x63, 0x1c, 0xfb, 0x7f, 0x14, 0x60, 0x32, 0x43, 0xb7, + 0xc2, 0x72, 0xf1, 0x25, 0x1e, 0x29, 0x71, 0xea, 0x3d, 0x33, 0x0e, 0x78, 0xe1, 0x08, 0x71, 0xc0, + 0x8b, 0xbd, 0xe2, 0x80, 0x0f, 0xbc, 0x93, 0x38, 0xe0, 0xe6, 0x88, 0x0d, 0xf6, 0x35, 0x62, 0x19, + 0xb1, 0xc3, 0x87, 0x8e, 0x18, 0x3b, 0xdc, 0x18, 0xf4, 0xe1, 0x3e, 0x06, 0xfd, 0x87, 0x0b, 0x30, + 0x95, 0xb4, 0xa4, 0x3c, 0x01, 0xb9, 0xed, 0xeb, 0x86, 0xdc, 0xf6, 0x72, 0x3f, 0xae, 0xb0, 0xb9, + 0x32, 0x5c, 0x9c, 0x90, 0xe1, 0x7e, 0xb0, 0x2f, 0x6a, 0xdd, 0xe5, 0xb9, 0x7f, 0xb3, 0x00, 0xa7, + 0x33, 0x7d, 0x71, 0x4f, 0x60, 0x6c, 0x6e, 0x19, 0x63, 0xf3, 0x5c, 0xdf, 0x6e, 0xc2, 0xb9, 0x03, + 0x74, 0x37, 0x31, 0x40, 0x57, 0xfa, 0x27, 0xd9, 0x7d, 0x94, 0xbe, 0x5a, 0x84, 0xf3, 0x99, 0xf5, + 0x62, 0xb1, 0xe7, 0xaa, 0x21, 0xf6, 0x7c, 0x3e, 0x21, 0xf6, 0xb4, 0xbb, 0xd7, 0x3e, 0x1e, 0x39, + 0xa8, 0x70, 0x97, 0x65, 0x51, 0x0e, 0x1e, 0x52, 0x06, 0x6a, 0xb8, 0xcb, 0x2a, 0x42, 0xd8, 0xa4, + 0xfb, 0xcd, 0x24, 0xfb, 0xfc, 0x37, 0x16, 0x9c, 0xcd, 0x9c, 0x9b, 0x13, 0x90, 0x75, 0xad, 0x9b, + 0xb2, 0xae, 0xa7, 0xfb, 0x5e, 0xad, 0x39, 0xc2, 0xaf, 0x5f, 0x1b, 0xc8, 0xf9, 0x16, 0xf6, 0x92, + 0xbf, 0x05, 0xa3, 0x4e, 0xbd, 0x4e, 0xc2, 0x70, 0xcd, 0x6f, 0xa8, 0x50, 0xc7, 0xcf, 0xb1, 0x77, + 0x56, 0x5c, 0x7c, 0x78, 0x30, 0x3f, 0x97, 0x24, 0x11, 0x83, 0xb1, 0x4e, 0x01, 0x7d, 0x1a, 0x46, + 0x42, 0x71, 0x6f, 0x8a, 0xb9, 0x7f, 0xa1, 0xcf, 0xc1, 0x71, 0x36, 0x49, 0xd3, 0x8c, 0xc5, 0xa4, + 0x24, 0x15, 0x8a, 0xa4, 0x19, 0xb7, 0xa5, 0x70, 0xac, 0x71, 0x5b, 0x9e, 0x07, 0xd8, 0x53, 0x8f, + 0x81, 0xa4, 0xfc, 0x41, 0x7b, 0x26, 0x68, 0x58, 0xe8, 0xe3, 0x30, 0x15, 0xf2, 0x60, 0x85, 0xcb, + 0x4d, 0x27, 0x64, 0xce, 0x32, 0x62, 0x15, 0xb2, 0x78, 0x4f, 0xb5, 0x04, 0x0c, 0xa7, 0xb0, 0xd1, + 0xaa, 0x6c, 0x95, 0x45, 0x56, 0xe4, 0x0b, 0xf3, 0x52, 0xdc, 0xa2, 0xc8, 0x04, 0x7c, 0x2a, 0x39, + 0xfc, 0x6c, 0xe0, 0xb5, 0x9a, 0xe8, 0xd3, 0x00, 0x74, 0xf9, 0x08, 0x39, 0xc4, 0x70, 0xfe, 0xe1, + 0x49, 0x4f, 0x95, 0x46, 0xa6, 0x6d, 0x2f, 0xf3, 0x70, 0x2d, 0x2b, 0x22, 0x58, 0x23, 0x68, 0xff, + 0xf0, 0x00, 0x3c, 0xde, 0xe5, 0x8c, 0x44, 0x8b, 0xa6, 0x1e, 0xf6, 0x99, 0xe4, 0xe3, 0x7a, 0x2e, + 0xb3, 0xb2, 0xf1, 0xda, 0x4e, 0x2c, 0xc5, 0xc2, 0x3b, 0x5e, 0x8a, 0x3f, 0x60, 0x69, 0x62, 0x0f, + 0x6e, 0xf1, 0xf9, 0xb1, 0x23, 0x9e, 0xfd, 0xc7, 0x28, 0x07, 0xd9, 0xca, 0x10, 0x26, 0x3c, 0xdf, + 0x77, 0x77, 0xfa, 0x96, 0x2e, 0x9c, 0xac, 0x94, 0xf8, 0xb7, 0x2c, 0x38, 0xd7, 0x35, 0x68, 0xc7, + 0x37, 0x20, 0xc3, 0x60, 0x7f, 0xc1, 0x82, 0x27, 0x33, 0x6b, 0x18, 0x66, 0x46, 0x57, 0xa0, 0x54, + 0xa7, 0x85, 0x9a, 0x97, 0x66, 0xec, 0xbe, 0x2e, 0x01, 0x38, 0xc6, 0x31, 0xac, 0x89, 0x0a, 0x3d, + 0xad, 0x89, 0x7e, 0xc5, 0x82, 0xd4, 0xa6, 0x3f, 0x81, 0xdb, 0xa7, 0x62, 0xde, 0x3e, 0xef, 0xef, + 0x67, 0x34, 0x73, 0x2e, 0x9e, 0x3f, 0x9e, 0x84, 0x33, 0x39, 0x5e, 0x4a, 0x7b, 0x30, 0xbd, 0x5d, + 0x27, 0xa6, 0xff, 0x6b, 0xb7, 0xb8, 0x30, 0x5d, 0x9d, 0x65, 0x59, 0xae, 0xd2, 0xe9, 0x14, 0x0a, + 0x4e, 0x37, 0x81, 0xbe, 0x60, 0xc1, 0x29, 0xe7, 0x5e, 0xb8, 0x42, 0xb9, 0x08, 0xb7, 0xbe, 0xd4, + 0xf4, 0xeb, 0xbb, 0xf4, 0x88, 0x96, 0x1b, 0xe1, 0xc5, 0x4c, 0xc9, 0xce, 0xdd, 0x5a, 0x0a, 0xdf, + 0x68, 0x9e, 0x25, 0x6f, 0xcd, 0xc2, 0xc2, 0x99, 0x6d, 0x21, 0x2c, 0x22, 0xfa, 0xd3, 0x37, 0x4a, + 0x17, 0x0f, 0xed, 0x2c, 0x77, 0x32, 0x7e, 0x2d, 0x4a, 0x08, 0x56, 0x74, 0xd0, 0x67, 0xa1, 0xb4, + 0x2d, 0x7d, 0x3c, 0x33, 0xae, 0xdd, 0x78, 0x20, 0xbb, 0x7b, 0xbe, 0x72, 0xf5, 0xac, 0x42, 0xc2, + 0x31, 0x51, 0xf4, 0x1a, 0x14, 0xbd, 0xad, 0xb0, 0x5b, 0xfe, 0xd3, 0x84, 0x1d, 0x1e, 0x8f, 0x83, + 0xb0, 0xbe, 0x5a, 0xc3, 0xb4, 0x22, 0xba, 0x0e, 0xc5, 0x60, 0xb3, 0x21, 0xc4, 0x92, 0x99, 0x9b, + 0x14, 0x2f, 0x95, 0x73, 0x7a, 0xc5, 0x28, 0xe1, 0xa5, 0x32, 0xa6, 0x24, 0x50, 0x15, 0x06, 0x99, + 0x6b, 0x8f, 0xb8, 0xe4, 0x32, 0xd9, 0xf9, 0x2e, 0x2e, 0x72, 0x3c, 0x58, 0x02, 0x43, 0xc0, 0x9c, + 0x10, 0xda, 0x80, 0xa1, 0x3a, 0xcb, 0x95, 0x29, 0x22, 0xc1, 0x7d, 0x28, 0x53, 0x00, 0xd9, 0x25, + 0x89, 0xa8, 0x90, 0xc7, 0x31, 0x0c, 0x2c, 0x68, 0x31, 0xaa, 0xa4, 0xbd, 0xb3, 0x15, 0x8a, 0xdc, + 0xce, 0xd9, 0x54, 0xbb, 0xe4, 0xc6, 0x15, 0x54, 0x19, 0x06, 0x16, 0xb4, 0xd0, 0x2b, 0x50, 0xd8, + 0xaa, 0x0b, 0xb7, 0x9d, 0x4c, 0x49, 0xa4, 0x19, 0xca, 0x62, 0x69, 0xe8, 0xc1, 0xc1, 0x7c, 0x61, + 0x75, 0x19, 0x17, 0xb6, 0xea, 0x68, 0x1d, 0x86, 0xb7, 0xb8, 0xf3, 0xbb, 0x10, 0x36, 0x3e, 0x95, + 0xed, 0x97, 0x9f, 0xf2, 0x8f, 0xe7, 0x1e, 0x2b, 0x02, 0x80, 0x25, 0x11, 0x16, 0x20, 0x5f, 0x39, + 0xf1, 0x8b, 0xa0, 0x69, 0x0b, 0x47, 0x0b, 0xbc, 0xc0, 0x99, 0x8e, 0x38, 0x14, 0x00, 0xd6, 0x28, + 0xd2, 0x55, 0xed, 0xc8, 0x04, 0xfb, 0x22, 0xd8, 0x4c, 0xe6, 0xaa, 0x56, 0x59, 0xf8, 0xbb, 0xad, + 0x6a, 0x85, 0x84, 0x63, 0xa2, 0x68, 0x17, 0xc6, 0xf7, 0xc2, 0xf6, 0x0e, 0x91, 0x5b, 0x9a, 0xc5, + 0x9e, 0xc9, 0xb9, 0x97, 0xef, 0x08, 0x44, 0x37, 0x88, 0x3a, 0x4e, 0x33, 0x75, 0x0a, 0x31, 0x9d, + 0xfe, 0x1d, 0x9d, 0x18, 0x36, 0x69, 0xd3, 0xe1, 0x7f, 0xab, 0xe3, 0x6f, 0xee, 0x47, 0x44, 0xc4, + 0x3a, 0xcb, 0x1c, 0xfe, 0x37, 0x38, 0x4a, 0x7a, 0xf8, 0x05, 0x00, 0x4b, 0x22, 0xe8, 0x8e, 0x18, + 0x1e, 0x76, 0x7a, 0x4e, 0xe5, 0x07, 0x24, 0x5d, 0x94, 0x48, 0x39, 0x83, 0xc2, 0x4e, 0xcb, 0x98, + 0x14, 0x3b, 0x25, 0xdb, 0x3b, 0x7e, 0xe4, 0x7b, 0x89, 0x13, 0x7a, 0x3a, 0xff, 0x94, 0xac, 0x66, + 0xe0, 0xa7, 0x4f, 0xc9, 0x2c, 0x2c, 0x9c, 0xd9, 0x16, 0x6a, 0xc0, 0x44, 0xdb, 0x0f, 0xa2, 0x7b, + 0x7e, 0x20, 0xd7, 0x17, 0xea, 0x22, 0x2c, 0x31, 0x30, 0x45, 0x8b, 0x2c, 0x8c, 0xa0, 0x09, 0xc1, + 0x09, 0x9a, 0xe8, 0x13, 0x30, 0x1c, 0xd6, 0x9d, 0x26, 0xa9, 0xdc, 0x9a, 0x9d, 0xc9, 0xbf, 0x7e, + 0x6a, 0x1c, 0x25, 0x67, 0x75, 0xf1, 0x68, 0xfa, 0x1c, 0x05, 0x4b, 0x72, 0x68, 0x15, 0x06, 0x59, + 0x02, 0x34, 0x16, 0x98, 0x2f, 0x27, 0xae, 0x6a, 0xca, 0x2a, 0x9a, 0x9f, 0x4d, 0xac, 0x18, 0xf3, + 0xea, 0x74, 0x0f, 0x88, 0x37, 0x83, 0x1f, 0xce, 0x9e, 0xce, 0xdf, 0x03, 0xe2, 0xa9, 0x71, 0xab, + 0xd6, 0x6d, 0x0f, 0x28, 0x24, 0x1c, 0x13, 0xa5, 0x27, 0x33, 0x3d, 0x4d, 0xcf, 0x74, 0x31, 0xe7, + 0xc9, 0x3d, 0x4b, 0xd9, 0xc9, 0x4c, 0x4f, 0x52, 0x4a, 0xc2, 0xfe, 0xbd, 0xe1, 0x34, 0xcf, 0xc2, + 0x5e, 0x99, 0xdf, 0x65, 0xa5, 0x14, 0x90, 0x1f, 0xee, 0x57, 0xe8, 0x75, 0x8c, 0x2c, 0xf8, 0x17, + 0x2c, 0x38, 0xd3, 0xce, 0xfc, 0x10, 0xc1, 0x00, 0xf4, 0x27, 0x3b, 0xe3, 0x9f, 0xae, 0x82, 0x38, + 0x66, 0xc3, 0x71, 0x4e, 0x4b, 0xc9, 0x67, 0x4e, 0xf1, 0x1d, 0x3f, 0x73, 0xd6, 0x60, 0x84, 0x31, + 0x99, 0x3d, 0x72, 0x47, 0x27, 0x5f, 0x7b, 0x8c, 0x95, 0x58, 0x16, 0x15, 0xb1, 0x22, 0x81, 0x7e, + 0xd0, 0x82, 0x73, 0xc9, 0xae, 0x63, 0xc2, 0xc0, 0x22, 0xf2, 0x23, 0x7f, 0xe0, 0xae, 0x8a, 0xef, + 0x4f, 0xf1, 0xff, 0x06, 0xf2, 0x61, 0x2f, 0x04, 0xdc, 0xbd, 0x31, 0x54, 0xce, 0x78, 0x61, 0x0f, + 0x99, 0x5a, 0x85, 0x3e, 0x5e, 0xd9, 0x2f, 0xc2, 0x58, 0xcb, 0xef, 0x78, 0x91, 0xb0, 0xfe, 0x11, + 0x96, 0x08, 0x4c, 0x03, 0xbf, 0xa6, 0x95, 0x63, 0x03, 0x2b, 0xf1, 0x36, 0x1f, 0x79, 0xe8, 0xb7, + 0xf9, 0x9b, 0x30, 0xe6, 0x69, 0xe6, 0xaa, 0x82, 0x1f, 0xb8, 0x94, 0x1f, 0xb5, 0x55, 0x37, 0x6e, + 0xe5, 0xbd, 0xd4, 0x4b, 0xb0, 0x41, 0xed, 0x64, 0x1f, 0x7c, 0x5f, 0xb6, 0x32, 0x98, 0x7a, 0x2e, + 0x02, 0xf8, 0xa8, 0x29, 0x02, 0xb8, 0x94, 0x14, 0x01, 0xa4, 0x24, 0xca, 0xc6, 0xeb, 0xbf, 0xff, + 0xa4, 0x34, 0xfd, 0x06, 0x42, 0xb4, 0x9b, 0x70, 0xa1, 0xd7, 0xb5, 0xc4, 0xcc, 0xc0, 0x1a, 0x4a, + 0x7f, 0x18, 0x9b, 0x81, 0x35, 0x2a, 0x65, 0xcc, 0x20, 0xfd, 0x86, 0xd8, 0xb1, 0xff, 0x9b, 0x05, + 0xc5, 0xaa, 0xdf, 0x38, 0x81, 0x07, 0xef, 0xc7, 0x8c, 0x07, 0xef, 0xe3, 0xd9, 0x17, 0x62, 0x23, + 0x57, 0x1e, 0xbe, 0x92, 0x90, 0x87, 0x9f, 0xcb, 0x23, 0xd0, 0x5d, 0xfa, 0xfd, 0x93, 0x45, 0x18, + 0xad, 0xfa, 0x0d, 0x65, 0x83, 0xfd, 0x6b, 0x0f, 0x63, 0x83, 0x9d, 0x9b, 0x5a, 0x41, 0xa3, 0xcc, + 0xac, 0xc7, 0xa4, 0xfb, 0xe9, 0x37, 0x98, 0x29, 0xf6, 0x5d, 0xe2, 0x6e, 0xef, 0x44, 0xa4, 0x91, + 0xfc, 0x9c, 0x93, 0x33, 0xc5, 0xfe, 0xbd, 0x02, 0x4c, 0x26, 0x5a, 0x47, 0x4d, 0x18, 0x6f, 0xea, + 0xd2, 0x56, 0xb1, 0x4e, 0x1f, 0x4a, 0x50, 0x2b, 0x4c, 0x59, 0xb5, 0x22, 0x6c, 0x12, 0x47, 0x0b, + 0x00, 0x4a, 0xfd, 0x28, 0xc5, 0x7a, 0x8c, 0xeb, 0x57, 0xfa, 0xc9, 0x10, 0x6b, 0x18, 0xe8, 0x25, + 0x18, 0x8d, 0xfc, 0xb6, 0xdf, 0xf4, 0xb7, 0xf7, 0x6f, 0x10, 0x19, 0xd4, 0x49, 0x19, 0xa8, 0x6d, + 0xc4, 0x20, 0xac, 0xe3, 0xa1, 0xfb, 0x30, 0xad, 0x88, 0xd4, 0x8e, 0x41, 0x02, 0xcd, 0xa4, 0x0a, + 0xeb, 0x49, 0x8a, 0x38, 0xdd, 0x88, 0xfd, 0x53, 0x45, 0x3e, 0xc4, 0x5e, 0xe4, 0xbe, 0xb7, 0x1b, + 0xde, 0xdd, 0xbb, 0xe1, 0xab, 0x16, 0x4c, 0xd1, 0xd6, 0x99, 0xf5, 0x8d, 0xbc, 0xe6, 0x55, 0x9c, + 0x68, 0xab, 0x4b, 0x9c, 0xe8, 0x4b, 0xf4, 0xd4, 0x6c, 0xf8, 0x9d, 0x48, 0xc8, 0xee, 0xb4, 0x63, + 0x91, 0x96, 0x62, 0x01, 0x15, 0x78, 0x24, 0x08, 0x84, 0xc7, 0xa0, 0x8e, 0x47, 0x82, 0x00, 0x0b, + 0xa8, 0x0c, 0x23, 0x3d, 0x90, 0x1d, 0x46, 0x9a, 0x07, 0xc7, 0x14, 0x76, 0x1a, 0x82, 0xe1, 0xd2, + 0x82, 0x63, 0x4a, 0x03, 0x8e, 0x18, 0xc7, 0xfe, 0xd9, 0x22, 0x8c, 0x55, 0xfd, 0x46, 0xac, 0x7a, + 0x7c, 0xd1, 0x50, 0x3d, 0x5e, 0x48, 0xa8, 0x1e, 0xa7, 0x74, 0xdc, 0xf7, 0x14, 0x8d, 0x5f, 0x2f, + 0x45, 0xe3, 0x3f, 0xb5, 0xd8, 0xac, 0x95, 0xd7, 0x6b, 0xdc, 0x98, 0x0b, 0x5d, 0x85, 0x51, 0x76, + 0xc0, 0x30, 0x17, 0x55, 0xa9, 0x8f, 0x63, 0xe9, 0x91, 0xd6, 0xe3, 0x62, 0xac, 0xe3, 0xa0, 0xcb, + 0x30, 0x12, 0x12, 0x27, 0xa8, 0xef, 0xa8, 0xd3, 0x55, 0x28, 0xcf, 0x78, 0x19, 0x56, 0x50, 0xf4, + 0x46, 0x1c, 0x97, 0xb1, 0x98, 0xef, 0xf2, 0xa6, 0xf7, 0x87, 0x6f, 0x91, 0xfc, 0x60, 0x8c, 0xf6, + 0x5d, 0x40, 0x69, 0xfc, 0x3e, 0x02, 0x92, 0xcd, 0x9b, 0x01, 0xc9, 0x4a, 0xa9, 0x60, 0x64, 0x7f, + 0x6e, 0xc1, 0x44, 0xd5, 0x6f, 0xd0, 0xad, 0xfb, 0xcd, 0xb4, 0x4f, 0xf5, 0xa0, 0xb4, 0x43, 0x5d, + 0x82, 0xd2, 0x5e, 0x84, 0xc1, 0xaa, 0xdf, 0xa8, 0x54, 0xbb, 0xf9, 0x9b, 0xdb, 0x7f, 0xcb, 0x82, + 0xe1, 0xaa, 0xdf, 0x38, 0x01, 0xb5, 0xc0, 0x47, 0x4d, 0xb5, 0xc0, 0x63, 0x39, 0xeb, 0x26, 0x47, + 0x13, 0xf0, 0x37, 0x06, 0x60, 0x9c, 0xf6, 0xd3, 0xdf, 0x96, 0x53, 0x69, 0x0c, 0x9b, 0xd5, 0xc7, + 0xb0, 0x51, 0x2e, 0xdc, 0x6f, 0x36, 0xfd, 0x7b, 0xc9, 0x69, 0x5d, 0x65, 0xa5, 0x58, 0x40, 0xd1, + 0xb3, 0x30, 0xd2, 0x0e, 0xc8, 0x9e, 0xeb, 0x0b, 0xf6, 0x56, 0x53, 0xb2, 0x54, 0x45, 0x39, 0x56, + 0x18, 0xf4, 0x59, 0x18, 0xba, 0x1e, 0xbd, 0xca, 0xeb, 0xbe, 0xd7, 0xe0, 0x92, 0xf3, 0xa2, 0x48, + 0x15, 0xa1, 0x95, 0x63, 0x03, 0x0b, 0xdd, 0x85, 0x12, 0xfb, 0xcf, 0x8e, 0x9d, 0xa3, 0x27, 0x1d, + 0x15, 0x49, 0xe8, 0x04, 0x01, 0x1c, 0xd3, 0x42, 0xcf, 0x03, 0x44, 0x32, 0xfa, 0x78, 0x28, 0x82, + 0x4f, 0xa9, 0xa7, 0x80, 0x8a, 0x4b, 0x1e, 0x62, 0x0d, 0x0b, 0x3d, 0x03, 0xa5, 0xc8, 0x71, 0x9b, + 0x37, 0x5d, 0x8f, 0x84, 0x4c, 0x22, 0x5e, 0x94, 0xb9, 0xe0, 0x44, 0x21, 0x8e, 0xe1, 0x94, 0x15, + 0x63, 0x91, 0x19, 0x78, 0xca, 0xe2, 0x11, 0x86, 0xcd, 0x58, 0xb1, 0x9b, 0xaa, 0x14, 0x6b, 0x18, + 0x68, 0x07, 0x9e, 0x70, 0x3d, 0x96, 0x56, 0x81, 0xd4, 0x76, 0xdd, 0xf6, 0xc6, 0xcd, 0xda, 0x1d, + 0x12, 0xb8, 0x5b, 0xfb, 0x4b, 0x4e, 0x7d, 0x97, 0x78, 0x32, 0x9d, 0xe4, 0xfb, 0x45, 0x17, 0x9f, + 0xa8, 0x74, 0xc1, 0xc5, 0x5d, 0x29, 0xd9, 0x2f, 0xc3, 0xe9, 0xaa, 0xdf, 0xa8, 0xfa, 0x41, 0xb4, + 0xea, 0x07, 0xf7, 0x9c, 0xa0, 0x21, 0x57, 0xca, 0xbc, 0x8c, 0x92, 0x40, 0x8f, 0xc2, 0x41, 0x7e, + 0x50, 0x18, 0x11, 0x10, 0x5e, 0x60, 0xcc, 0xd7, 0x11, 0x7d, 0x7b, 0xea, 0x8c, 0x0d, 0x50, 0x39, + 0x46, 0xae, 0x39, 0x11, 0x41, 0xb7, 0x58, 0xee, 0xe4, 0xf8, 0x46, 0x14, 0xd5, 0x9f, 0xd6, 0x72, + 0x27, 0xc7, 0xc0, 0xcc, 0x2b, 0xd4, 0xac, 0x6f, 0xff, 0xf7, 0x41, 0x76, 0x38, 0x26, 0xf2, 0x54, + 0xa0, 0xcf, 0xc0, 0x44, 0x48, 0x6e, 0xba, 0x5e, 0xe7, 0xbe, 0x94, 0x46, 0x74, 0xf1, 0xce, 0xaa, + 0xad, 0xe8, 0x98, 0x5c, 0xa6, 0x69, 0x96, 0xe1, 0x04, 0x35, 0xd4, 0x82, 0x89, 0x7b, 0xae, 0xd7, + 0xf0, 0xef, 0x85, 0x92, 0xfe, 0x48, 0xbe, 0x68, 0xf3, 0x2e, 0xc7, 0x4c, 0xf4, 0xd1, 0x68, 0xee, + 0xae, 0x41, 0x0c, 0x27, 0x88, 0xd3, 0x05, 0x18, 0x74, 0xbc, 0xc5, 0xf0, 0x76, 0x48, 0x02, 0x91, + 0x05, 0x9b, 0x2d, 0x40, 0x2c, 0x0b, 0x71, 0x0c, 0xa7, 0x0b, 0x90, 0xfd, 0xb9, 0x16, 0xf8, 0x1d, + 0x9e, 0x23, 0x40, 0x2c, 0x40, 0xac, 0x4a, 0xb1, 0x86, 0x41, 0x37, 0x28, 0xfb, 0xb7, 0xee, 0x7b, + 0xd8, 0xf7, 0x23, 0xb9, 0xa5, 0x59, 0xde, 0x55, 0xad, 0x1c, 0x1b, 0x58, 0x68, 0x15, 0x50, 0xd8, + 0x69, 0xb7, 0x9b, 0xcc, 0xec, 0xc3, 0x69, 0x32, 0x52, 0x5c, 0xe5, 0x5e, 0xe4, 0xa1, 0x53, 0x6b, + 0x29, 0x28, 0xce, 0xa8, 0x41, 0xcf, 0xea, 0x2d, 0xd1, 0xd5, 0x41, 0xd6, 0x55, 0xae, 0x06, 0xa9, + 0xf1, 0x7e, 0x4a, 0x18, 0x5a, 0x81, 0xe1, 0x70, 0x3f, 0xac, 0x47, 0x22, 0x06, 0x5c, 0x4e, 0x2a, + 0xa2, 0x1a, 0x43, 0xd1, 0x32, 0xe1, 0xf1, 0x2a, 0x58, 0xd6, 0x45, 0x75, 0x98, 0x11, 0x14, 0x97, + 0x77, 0x1c, 0x4f, 0x25, 0x76, 0xe1, 0xd6, 0xaf, 0x57, 0x1f, 0x1c, 0xcc, 0xcf, 0x88, 0x96, 0x75, + 0xf0, 0xe1, 0xc1, 0xfc, 0x99, 0xaa, 0xdf, 0xc8, 0x80, 0xe0, 0x2c, 0x6a, 0x7c, 0xf1, 0xd5, 0xeb, + 0x7e, 0xab, 0x5d, 0x0d, 0xfc, 0x2d, 0xb7, 0x49, 0xba, 0xa9, 0x92, 0x6a, 0x06, 0xa6, 0x58, 0x7c, + 0x46, 0x19, 0x4e, 0x50, 0xb3, 0xbf, 0x9d, 0xf1, 0x33, 0x2c, 0xf1, 0x73, 0xd4, 0x09, 0x08, 0x6a, + 0xc1, 0x78, 0x9b, 0x6d, 0x13, 0x11, 0xb9, 0x5f, 0xac, 0xf5, 0x17, 0xfb, 0x14, 0x89, 0xdc, 0xa3, + 0xd7, 0x80, 0x12, 0x59, 0xb2, 0xb7, 0x66, 0x55, 0x27, 0x87, 0x4d, 0xea, 0xf6, 0x8f, 0x3d, 0xc6, + 0x6e, 0xc4, 0x1a, 0x97, 0x73, 0x0c, 0x0b, 0x63, 0x7b, 0xf1, 0xb4, 0x9a, 0xcb, 0x17, 0xb8, 0xc5, + 0xd3, 0x22, 0x0c, 0xf6, 0xb1, 0xac, 0x8b, 0x3e, 0x0d, 0x13, 0xf4, 0xa5, 0xa2, 0x65, 0x54, 0x39, + 0x95, 0x1f, 0x14, 0x21, 0x4e, 0xa4, 0xa2, 0x65, 0xf5, 0xd0, 0x2b, 0xe3, 0x04, 0x31, 0xf4, 0x06, + 0x33, 0x0b, 0x31, 0x93, 0xb5, 0xf4, 0x20, 0xad, 0x5b, 0x80, 0x48, 0xb2, 0x1a, 0x91, 0xbc, 0x44, + 0x30, 0xf6, 0xa3, 0x4d, 0x04, 0x83, 0x6e, 0xc2, 0xb8, 0xc8, 0x7e, 0x2c, 0x56, 0x6e, 0xd1, 0x90, + 0x03, 0x8e, 0x63, 0x1d, 0x78, 0x98, 0x2c, 0xc0, 0x66, 0x65, 0xb4, 0x0d, 0xe7, 0xb4, 0x6c, 0x44, + 0xd7, 0x02, 0x87, 0x29, 0xf3, 0x5d, 0x76, 0x9c, 0x6a, 0x77, 0xf5, 0x93, 0x0f, 0x0e, 0xe6, 0xcf, + 0x6d, 0x74, 0x43, 0xc4, 0xdd, 0xe9, 0xa0, 0x5b, 0x70, 0x9a, 0xbb, 0xf4, 0x96, 0x89, 0xd3, 0x68, + 0xba, 0x9e, 0x62, 0x06, 0xf8, 0x96, 0x3f, 0xfb, 0xe0, 0x60, 0xfe, 0xf4, 0x62, 0x16, 0x02, 0xce, + 0xae, 0x87, 0x3e, 0x0a, 0xa5, 0x86, 0x17, 0x8a, 0x31, 0x18, 0x32, 0x12, 0x3e, 0x95, 0xca, 0xeb, + 0x35, 0xf5, 0xfd, 0xf1, 0x1f, 0x1c, 0x57, 0x40, 0xdb, 0x5c, 0x56, 0xac, 0x24, 0x18, 0xc3, 0xa9, + 0x90, 0x46, 0x49, 0x21, 0x9f, 0xe1, 0xd4, 0xc7, 0x95, 0x24, 0xca, 0xd6, 0xdd, 0xf0, 0xf7, 0x33, + 0x08, 0xa3, 0xd7, 0x01, 0xd1, 0x17, 0x84, 0x5b, 0x27, 0x8b, 0x75, 0x96, 0x16, 0x82, 0x89, 0xd6, + 0x47, 0x4c, 0x37, 0xb3, 0x5a, 0x0a, 0x03, 0x67, 0xd4, 0x42, 0xd7, 0xe9, 0xa9, 0xa2, 0x97, 0x8a, + 0x53, 0x4b, 0xa5, 0xe7, 0x2b, 0x93, 0x76, 0x40, 0xea, 0x4e, 0x44, 0x1a, 0x26, 0x45, 0x9c, 0xa8, + 0x87, 0x1a, 0xf0, 0x84, 0xd3, 0x89, 0x7c, 0x26, 0x86, 0x37, 0x51, 0x37, 0xfc, 0x5d, 0xe2, 0x31, + 0x0d, 0xd8, 0xc8, 0xd2, 0x05, 0xca, 0x6d, 0x2c, 0x76, 0xc1, 0xc3, 0x5d, 0xa9, 0x50, 0x2e, 0x51, + 0xe5, 0xe3, 0x05, 0x33, 0x50, 0x53, 0x46, 0x4e, 0xde, 0x97, 0x60, 0x74, 0xc7, 0x0f, 0xa3, 0x75, + 0x12, 0xdd, 0xf3, 0x83, 0x5d, 0x11, 0x6f, 0x33, 0x8e, 0xd1, 0x1c, 0x83, 0xb0, 0x8e, 0x47, 0x9f, + 0x81, 0xcc, 0x3e, 0xa3, 0x52, 0x66, 0xaa, 0xf1, 0x91, 0xf8, 0x8c, 0xb9, 0xce, 0x8b, 0xb1, 0x84, + 0x4b, 0xd4, 0x4a, 0x75, 0x99, 0xa9, 0xb9, 0x13, 0xa8, 0x95, 0xea, 0x32, 0x96, 0x70, 0xba, 0x5c, + 0xc3, 0x1d, 0x27, 0x20, 0xd5, 0xc0, 0xaf, 0x93, 0x50, 0x8b, 0x0c, 0xfe, 0x38, 0x8f, 0x26, 0x4a, + 0x97, 0x6b, 0x2d, 0x0b, 0x01, 0x67, 0xd7, 0x43, 0x24, 0x9d, 0x89, 0x6b, 0x22, 0x5f, 0x3f, 0x91, + 0xe6, 0x67, 0xfa, 0x4c, 0xc6, 0xe5, 0xc1, 0x94, 0xca, 0x01, 0xc6, 0xe3, 0x87, 0x86, 0xb3, 0x93, + 0x6c, 0x6d, 0xf7, 0x1f, 0x7c, 0x54, 0x69, 0x7c, 0x2a, 0x09, 0x4a, 0x38, 0x45, 0xdb, 0x88, 0xc5, + 0x35, 0xd5, 0x33, 0x16, 0xd7, 0x15, 0x28, 0x85, 0x9d, 0xcd, 0x86, 0xdf, 0x72, 0x5c, 0x8f, 0xa9, + 0xb9, 0xb5, 0xf7, 0x48, 0x4d, 0x02, 0x70, 0x8c, 0x83, 0x56, 0x61, 0xc4, 0x91, 0xea, 0x1c, 0x94, + 0x1f, 0x7d, 0x45, 0x29, 0x71, 0x78, 0x40, 0x02, 0xa9, 0xc0, 0x51, 0x75, 0xd1, 0xab, 0x30, 0x2e, + 0x5c, 0x52, 0x45, 0xfa, 0xc9, 0x19, 0xd3, 0x6f, 0xa8, 0xa6, 0x03, 0xb1, 0x89, 0x8b, 0x6e, 0xc3, + 0x68, 0xe4, 0x37, 0x99, 0xf3, 0x0b, 0x65, 0xf3, 0xce, 0xe4, 0xc7, 0x11, 0xdb, 0x50, 0x68, 0xba, + 0x24, 0x55, 0x55, 0xc5, 0x3a, 0x1d, 0xb4, 0xc1, 0xd7, 0x3b, 0x8b, 0x90, 0x4d, 0xc2, 0xd9, 0xc7, + 0xf2, 0xef, 0x24, 0x15, 0x48, 0xdb, 0xdc, 0x0e, 0xa2, 0x26, 0xd6, 0xc9, 0xa0, 0x6b, 0x30, 0xdd, + 0x0e, 0x5c, 0x9f, 0xad, 0x09, 0xa5, 0xc9, 0x9b, 0x35, 0xd3, 0xf3, 0x54, 0x93, 0x08, 0x38, 0x5d, + 0x87, 0x79, 0x14, 0x8b, 0xc2, 0xd9, 0xb3, 0x3c, 0x43, 0x35, 0x7f, 0xde, 0xf1, 0x32, 0xac, 0xa0, + 0x68, 0x8d, 0x9d, 0xc4, 0x5c, 0x32, 0x31, 0x3b, 0x97, 0x1f, 0xf0, 0x45, 0x97, 0x60, 0x70, 0xe6, + 0x55, 0xfd, 0xc5, 0x31, 0x05, 0xd4, 0xd0, 0x52, 0x19, 0xd2, 0x17, 0x43, 0x38, 0xfb, 0x44, 0x17, + 0x23, 0xb9, 0xc4, 0xf3, 0x22, 0x66, 0x08, 0x8c, 0xe2, 0x10, 0x27, 0x68, 0xa2, 0x8f, 0xc3, 0x94, + 0x08, 0x53, 0x17, 0x0f, 0xd3, 0xb9, 0xd8, 0xa4, 0x18, 0x27, 0x60, 0x38, 0x85, 0xcd, 0x33, 0x07, + 0x38, 0x9b, 0x4d, 0x22, 0x8e, 0xbe, 0x9b, 0xae, 0xb7, 0x1b, 0xce, 0x9e, 0x67, 0xe7, 0x83, 0xc8, + 0x1c, 0x90, 0x84, 0xe2, 0x8c, 0x1a, 0x68, 0x03, 0xa6, 0xda, 0x01, 0x21, 0x2d, 0xc6, 0xe8, 0x8b, + 0xfb, 0x6c, 0x9e, 0x3b, 0xd4, 0xd3, 0x9e, 0x54, 0x13, 0xb0, 0xc3, 0x8c, 0x32, 0x9c, 0xa2, 0x80, + 0xee, 0xc1, 0x88, 0xbf, 0x47, 0x82, 0x1d, 0xe2, 0x34, 0x66, 0x2f, 0x74, 0x31, 0x71, 0x17, 0x97, + 0xdb, 0x2d, 0x81, 0x9b, 0xd0, 0xfe, 0xcb, 0xe2, 0xde, 0xda, 0x7f, 0xd9, 0x18, 0xfa, 0x21, 0x0b, + 0xce, 0x4a, 0x85, 0x41, 0xad, 0x4d, 0x47, 0x7d, 0xd9, 0xf7, 0xc2, 0x28, 0xe0, 0x2e, 0xe0, 0x4f, + 0xe6, 0xbb, 0x45, 0x6f, 0xe4, 0x54, 0x52, 0xc2, 0xd1, 0xb3, 0x79, 0x18, 0x21, 0xce, 0x6f, 0x11, + 0x2d, 0xc3, 0x74, 0x48, 0x22, 0x79, 0x18, 0x2d, 0x86, 0xab, 0x6f, 0x94, 0xd7, 0x67, 0x2f, 0x72, + 0xff, 0x75, 0xba, 0x19, 0x6a, 0x49, 0x20, 0x4e, 0xe3, 0xcf, 0x7d, 0x2b, 0x4c, 0xa7, 0xae, 0xff, + 0xa3, 0x64, 0x44, 0x99, 0xdb, 0x85, 0x71, 0x63, 0x88, 0x1f, 0xa9, 0xf6, 0xf8, 0x5f, 0x0d, 0x43, + 0x49, 0x69, 0x16, 0xd1, 0x15, 0x53, 0x61, 0x7c, 0x36, 0xa9, 0x30, 0x1e, 0xa1, 0xef, 0x7a, 0x5d, + 0x47, 0xbc, 0x91, 0x11, 0xb5, 0x2b, 0x6f, 0x43, 0xf7, 0xef, 0x8e, 0xad, 0x89, 0x6b, 0x8b, 0x7d, + 0x6b, 0x9e, 0x07, 0xba, 0x4a, 0x80, 0xaf, 0xc1, 0xb4, 0xe7, 0x33, 0x9e, 0x93, 0x34, 0x24, 0x43, + 0xc1, 0xf8, 0x86, 0x92, 0x1e, 0x06, 0x23, 0x81, 0x80, 0xd3, 0x75, 0x68, 0x83, 0xfc, 0xe2, 0x4f, + 0x8a, 0x9c, 0x39, 0x5f, 0x80, 0x05, 0x14, 0x5d, 0x84, 0xc1, 0xb6, 0xdf, 0xa8, 0x54, 0x05, 0xbf, + 0xa9, 0xc5, 0x8a, 0x6c, 0x54, 0xaa, 0x98, 0xc3, 0xd0, 0x22, 0x0c, 0xb1, 0x1f, 0xe1, 0xec, 0x58, + 0x7e, 0xbc, 0x03, 0x56, 0x43, 0xcb, 0x37, 0xc3, 0x2a, 0x60, 0x51, 0x91, 0x89, 0xbe, 0x28, 0x93, + 0xce, 0x44, 0x5f, 0xc3, 0x0f, 0x29, 0xfa, 0x92, 0x04, 0x70, 0x4c, 0x0b, 0xdd, 0x87, 0xd3, 0xc6, + 0xc3, 0x88, 0x2f, 0x11, 0x12, 0x0a, 0x9f, 0xeb, 0x8b, 0x5d, 0x5f, 0x44, 0x42, 0x53, 0x7d, 0x4e, + 0x74, 0xfa, 0x74, 0x25, 0x8b, 0x12, 0xce, 0x6e, 0x00, 0x35, 0x61, 0xba, 0x9e, 0x6a, 0x75, 0xa4, + 0xff, 0x56, 0xd5, 0x84, 0xa6, 0x5b, 0x4c, 0x13, 0x46, 0xaf, 0xc2, 0xc8, 0x5b, 0x7e, 0xc8, 0xce, + 0x6a, 0xc1, 0x23, 0x4b, 0x87, 0xdd, 0x91, 0x37, 0x6e, 0xd5, 0x58, 0xf9, 0xe1, 0xc1, 0xfc, 0x68, + 0xd5, 0x6f, 0xc8, 0xbf, 0x58, 0x55, 0x40, 0xdf, 0x6b, 0xc1, 0x5c, 0xfa, 0xe5, 0xa5, 0x3a, 0x3d, + 0xde, 0x7f, 0xa7, 0x6d, 0xd1, 0xe8, 0xdc, 0x4a, 0x2e, 0x39, 0xdc, 0xa5, 0x29, 0xfb, 0x97, 0x2c, + 0x26, 0x75, 0x13, 0x1a, 0x20, 0x12, 0x76, 0x9a, 0x27, 0x91, 0x66, 0x73, 0xc5, 0x50, 0x4e, 0x3d, + 0xb4, 0xe5, 0xc2, 0x3f, 0xb7, 0x98, 0xe5, 0xc2, 0x09, 0xba, 0x28, 0xbc, 0x01, 0x23, 0x91, 0x4c, + 0x7f, 0xda, 0x25, 0x33, 0xa8, 0xd6, 0x29, 0x66, 0xbd, 0xa1, 0x38, 0x56, 0x95, 0xe9, 0x54, 0x91, + 0xb1, 0xff, 0x11, 0x9f, 0x01, 0x09, 0x39, 0x01, 0x1d, 0x40, 0xd9, 0xd4, 0x01, 0xcc, 0xf7, 0xf8, + 0x82, 0x1c, 0x5d, 0xc0, 0x3f, 0x34, 0xfb, 0xcd, 0x24, 0x35, 0xef, 0x76, 0x93, 0x19, 0xfb, 0x8b, + 0x16, 0x40, 0x1c, 0x8a, 0x97, 0xc9, 0x97, 0xfd, 0x40, 0xe6, 0x58, 0xcc, 0xca, 0x26, 0xf4, 0x32, + 0xe5, 0x51, 0xfd, 0xc8, 0xaf, 0xfb, 0x4d, 0xa1, 0xe1, 0x7a, 0x22, 0x56, 0x43, 0xf0, 0xf2, 0x43, + 0xed, 0x37, 0x56, 0xd8, 0x68, 0x5e, 0x06, 0xfe, 0x2a, 0xc6, 0x8a, 0x31, 0x23, 0xe8, 0xd7, 0x8f, + 0x58, 0x70, 0x2a, 0xcb, 0xde, 0x95, 0xbe, 0x78, 0xb8, 0xcc, 0x4a, 0x99, 0x33, 0xa9, 0xd9, 0xbc, + 0x23, 0xca, 0xb1, 0xc2, 0xe8, 0x3b, 0x73, 0xd8, 0xd1, 0x62, 0xe0, 0xde, 0x82, 0xf1, 0x6a, 0x40, + 0xb4, 0xcb, 0xf5, 0x35, 0xee, 0x4c, 0xce, 0xfb, 0xf3, 0xec, 0x91, 0x1d, 0xc9, 0xed, 0x9f, 0x2e, + 0xc0, 0x29, 0x6e, 0x15, 0xb0, 0xb8, 0xe7, 0xbb, 0x8d, 0xaa, 0xdf, 0x10, 0x59, 0xdf, 0x3e, 0x05, + 0x63, 0x6d, 0x4d, 0xd0, 0xd8, 0x2d, 0x9e, 0xa3, 0x2e, 0x90, 0x8c, 0x45, 0x23, 0x7a, 0x29, 0x36, + 0x68, 0xa1, 0x06, 0x8c, 0x91, 0x3d, 0xb7, 0xae, 0x54, 0xcb, 0x85, 0x23, 0x5f, 0x74, 0xaa, 0x95, + 0x15, 0x8d, 0x0e, 0x36, 0xa8, 0x3e, 0x82, 0x7c, 0xbe, 0xf6, 0x8f, 0x5a, 0xf0, 0x58, 0x4e, 0xf4, + 0x47, 0xda, 0xdc, 0x3d, 0x66, 0x7f, 0x21, 0x96, 0xad, 0x6a, 0x8e, 0x5b, 0x65, 0x60, 0x01, 0x45, + 0x9f, 0x00, 0xe0, 0x56, 0x15, 0xf4, 0xc9, 0xdd, 0x2b, 0x4c, 0x9e, 0x11, 0xe1, 0x4b, 0x0b, 0xd6, + 0x24, 0xeb, 0x63, 0x8d, 0x96, 0xfd, 0xa5, 0x01, 0x18, 0xe4, 0xc9, 0xd6, 0x57, 0x61, 0x78, 0x87, + 0xe7, 0xc2, 0xe8, 0x27, 0xed, 0x46, 0x2c, 0x0c, 0xe1, 0x05, 0x58, 0x56, 0x46, 0x6b, 0x30, 0xc3, + 0x73, 0x89, 0x34, 0xcb, 0xa4, 0xe9, 0xec, 0x4b, 0xc9, 0x1d, 0xcf, 0xc3, 0xa9, 0x24, 0x98, 0x95, + 0x34, 0x0a, 0xce, 0xaa, 0x87, 0x5e, 0x83, 0x09, 0xfa, 0x92, 0xf2, 0x3b, 0x91, 0xa4, 0xc4, 0xb3, + 0x88, 0xa8, 0xa7, 0xdb, 0x86, 0x01, 0xc5, 0x09, 0x6c, 0xfa, 0x98, 0x6f, 0xa7, 0x64, 0x94, 0x83, + 0xf1, 0x63, 0xde, 0x94, 0x4b, 0x9a, 0xb8, 0xcc, 0xd0, 0xb5, 0xc3, 0xcc, 0x7a, 0x37, 0x76, 0x02, + 0x12, 0xee, 0xf8, 0xcd, 0x06, 0x63, 0xfa, 0x06, 0x35, 0x43, 0xd7, 0x04, 0x1c, 0xa7, 0x6a, 0x50, + 0x2a, 0x5b, 0x8e, 0xdb, 0xec, 0x04, 0x24, 0xa6, 0x32, 0x64, 0x52, 0x59, 0x4d, 0xc0, 0x71, 0xaa, + 0x46, 0x6f, 0xe1, 0xeb, 0xf0, 0xf1, 0x08, 0x5f, 0xe9, 0x82, 0x3d, 0x5d, 0x0d, 0x7c, 0x7a, 0x62, + 0xcb, 0xd8, 0x39, 0xca, 0x4c, 0x7a, 0x58, 0xba, 0xf9, 0x76, 0x89, 0x32, 0x27, 0x0c, 0x49, 0x39, + 0x05, 0xc3, 0x52, 0xa1, 0x26, 0x1c, 0x7c, 0x25, 0x15, 0x74, 0x15, 0x46, 0x45, 0x2a, 0x0a, 0x66, + 0xcd, 0xcb, 0xd7, 0x08, 0xb3, 0xac, 0x28, 0xc7, 0xc5, 0x58, 0xc7, 0xb1, 0xbf, 0xaf, 0x00, 0x33, + 0x19, 0xee, 0x18, 0xfc, 0x4c, 0xdc, 0x76, 0xc3, 0x48, 0x25, 0x35, 0xd4, 0xce, 0x44, 0x5e, 0x8e, + 0x15, 0x06, 0xdd, 0x78, 0xfc, 0xd4, 0x4d, 0x9e, 0xb4, 0xc2, 0xdc, 0x59, 0x40, 0x8f, 0x98, 0x1e, + 0xf0, 0x02, 0x0c, 0x74, 0x42, 0x22, 0xe3, 0x43, 0xaa, 0x3b, 0x88, 0x29, 0xdc, 0x18, 0x84, 0xbe, + 0x09, 0xb6, 0x95, 0xee, 0x4a, 0x7b, 0x13, 0x70, 0xed, 0x15, 0x87, 0xd1, 0xce, 0x45, 0xc4, 0x73, + 0xbc, 0x48, 0xbc, 0x1c, 0xe2, 0x40, 0x67, 0xac, 0x14, 0x0b, 0xa8, 0xfd, 0xa5, 0x22, 0x9c, 0xcd, + 0x75, 0xd0, 0xa2, 0x5d, 0x6f, 0xf9, 0x9e, 0x1b, 0xf9, 0xca, 0x64, 0x85, 0x07, 0x37, 0x23, 0xed, + 0x9d, 0x35, 0x51, 0x8e, 0x15, 0x06, 0xba, 0x04, 0x83, 0x4c, 0x5c, 0x97, 0x4a, 0xef, 0xb8, 0x54, + 0xe6, 0xd1, 0x6e, 0x38, 0xb8, 0xef, 0xd4, 0xb9, 0x17, 0xe9, 0x75, 0xec, 0x37, 0x93, 0xa7, 0x23, + 0xed, 0xae, 0xef, 0x37, 0x31, 0x03, 0xa2, 0x0f, 0x88, 0xf1, 0x4a, 0xd8, 0x68, 0x60, 0xa7, 0xe1, + 0x87, 0xda, 0xa0, 0x3d, 0x0d, 0xc3, 0xbb, 0x64, 0x3f, 0x70, 0xbd, 0xed, 0xa4, 0xed, 0xce, 0x0d, + 0x5e, 0x8c, 0x25, 0xdc, 0xcc, 0xd4, 0x35, 0x7c, 0xdc, 0x39, 0x6f, 0x47, 0x7a, 0xde, 0xb5, 0x3f, + 0x50, 0x84, 0x49, 0xbc, 0x54, 0x7e, 0x6f, 0x22, 0x6e, 0xa7, 0x27, 0xe2, 0xb8, 0x73, 0xde, 0xf6, + 0x9e, 0x8d, 0x9f, 0xb7, 0x60, 0x92, 0x25, 0xc4, 0x10, 0x61, 0xb1, 0x5c, 0xdf, 0x3b, 0x01, 0xbe, + 0xf6, 0x22, 0x0c, 0x06, 0xb4, 0xd1, 0x64, 0x5e, 0x47, 0xd6, 0x13, 0xcc, 0x61, 0xe8, 0x09, 0x18, + 0x60, 0x5d, 0xa0, 0x93, 0x37, 0xc6, 0x53, 0x62, 0x95, 0x9d, 0xc8, 0xc1, 0xac, 0x94, 0xc5, 0x7a, + 0xc1, 0xa4, 0xdd, 0x74, 0x79, 0xa7, 0x63, 0x65, 0xea, 0xbb, 0xc3, 0x75, 0x3b, 0xb3, 0x6b, 0xef, + 0x2c, 0xd6, 0x4b, 0x36, 0xc9, 0xee, 0x6f, 0xc6, 0x3f, 0x2a, 0xc0, 0xf9, 0xcc, 0x7a, 0x7d, 0xc7, + 0x7a, 0xe9, 0x5e, 0xfb, 0x51, 0xa6, 0x3c, 0x28, 0x9e, 0xa0, 0x65, 0xe4, 0x40, 0xbf, 0xac, 0xec, + 0x60, 0x1f, 0x21, 0x58, 0x32, 0x87, 0xec, 0x5d, 0x12, 0x82, 0x25, 0xb3, 0x6f, 0x39, 0x6f, 0xde, + 0xbf, 0x28, 0xe4, 0x7c, 0x0b, 0x7b, 0xfd, 0x5e, 0xa6, 0xe7, 0x0c, 0x03, 0x86, 0xf2, 0x45, 0xc9, + 0xcf, 0x18, 0x5e, 0x86, 0x15, 0x14, 0x2d, 0xc2, 0x64, 0xcb, 0xf5, 0xe8, 0xe1, 0xb3, 0x6f, 0x72, + 0x98, 0x2a, 0x42, 0xd6, 0x9a, 0x09, 0xc6, 0x49, 0x7c, 0xe4, 0x6a, 0xe1, 0x59, 0x0a, 0xf9, 0x99, + 0xd2, 0x73, 0x7b, 0xbb, 0x60, 0x2a, 0x9a, 0xd5, 0x28, 0x66, 0x84, 0x6a, 0x59, 0xd3, 0x84, 0x1e, + 0xc5, 0xfe, 0x85, 0x1e, 0x63, 0xd9, 0x02, 0x8f, 0xb9, 0x57, 0x61, 0xfc, 0xa1, 0xa5, 0xdc, 0xf6, + 0x57, 0x8b, 0xf0, 0x78, 0x97, 0x6d, 0xcf, 0xcf, 0x7a, 0x63, 0x0e, 0xb4, 0xb3, 0x3e, 0x35, 0x0f, + 0x55, 0x38, 0xb5, 0xd5, 0x69, 0x36, 0xf7, 0x99, 0xc3, 0x00, 0x69, 0x48, 0x0c, 0xc1, 0x53, 0xca, + 0x97, 0xfe, 0xa9, 0xd5, 0x0c, 0x1c, 0x9c, 0x59, 0x93, 0xbe, 0x1c, 0xe8, 0x4d, 0xb2, 0xaf, 0x48, + 0x25, 0x5e, 0x0e, 0x58, 0x07, 0x62, 0x13, 0x17, 0x5d, 0x83, 0x69, 0x67, 0xcf, 0x71, 0x79, 0x8c, + 0x5b, 0x49, 0x80, 0x3f, 0x1d, 0x94, 0x70, 0x72, 0x31, 0x89, 0x80, 0xd3, 0x75, 0xd0, 0xeb, 0x80, + 0xfc, 0x4d, 0x66, 0x56, 0xdc, 0xb8, 0x46, 0x3c, 0xa1, 0x0f, 0x64, 0x73, 0x57, 0x8c, 0x8f, 0x84, + 0x5b, 0x29, 0x0c, 0x9c, 0x51, 0x2b, 0x11, 0xee, 0x64, 0x28, 0x3f, 0xdc, 0x49, 0xf7, 0x73, 0xb1, + 0x67, 0xb6, 0x8d, 0xff, 0x64, 0xd1, 0xeb, 0x8b, 0x33, 0xf9, 0x66, 0xd4, 0xbe, 0x57, 0x99, 0x3d, + 0x1f, 0x17, 0x5c, 0x6a, 0x41, 0x3a, 0x4e, 0x6b, 0xf6, 0x7c, 0x31, 0x10, 0x9b, 0xb8, 0x7c, 0x41, + 0x84, 0xb1, 0x6f, 0xa8, 0xc1, 0xe2, 0x8b, 0xd0, 0x42, 0x0a, 0x03, 0x7d, 0x12, 0x86, 0x1b, 0xee, + 0x9e, 0x1b, 0x0a, 0xb1, 0xcd, 0x91, 0x75, 0x24, 0xf1, 0x39, 0x58, 0xe6, 0x64, 0xb0, 0xa4, 0x67, + 0xff, 0x40, 0x01, 0xc6, 0x65, 0x8b, 0x6f, 0x74, 0xfc, 0xc8, 0x39, 0x81, 0x6b, 0xf9, 0x9a, 0x71, + 0x2d, 0x7f, 0xa0, 0x5b, 0x7c, 0x25, 0xd6, 0xa5, 0xdc, 0xeb, 0xf8, 0x56, 0xe2, 0x3a, 0x7e, 0xaa, + 0x37, 0xa9, 0xee, 0xd7, 0xf0, 0x3f, 0xb6, 0x60, 0xda, 0xc0, 0x3f, 0x81, 0xdb, 0x60, 0xd5, 0xbc, + 0x0d, 0x9e, 0xec, 0xf9, 0x0d, 0x39, 0xb7, 0xc0, 0x77, 0x17, 0x13, 0x7d, 0x67, 0xa7, 0xff, 0x5b, + 0x30, 0xb0, 0xe3, 0x04, 0x8d, 0x6e, 0xf1, 0xe4, 0x53, 0x95, 0x16, 0xae, 0x3b, 0x81, 0x50, 0x88, + 0x3e, 0xab, 0x12, 0x95, 0x3b, 0x41, 0x6f, 0x65, 0x28, 0x6b, 0x0a, 0xbd, 0x0c, 0x43, 0x61, 0xdd, + 0x6f, 0x2b, 0x77, 0x81, 0x0b, 0x3c, 0x89, 0x39, 0x2d, 0x39, 0x3c, 0x98, 0x47, 0x66, 0x73, 0xb4, + 0x18, 0x0b, 0x7c, 0xf4, 0x29, 0x18, 0x67, 0xbf, 0x94, 0x75, 0x52, 0x31, 0x3f, 0xf7, 0x54, 0x4d, + 0x47, 0xe4, 0xa6, 0x7b, 0x46, 0x11, 0x36, 0x49, 0xcd, 0x6d, 0x43, 0x49, 0x7d, 0xd6, 0x23, 0x55, + 0x42, 0xfe, 0xfb, 0x22, 0xcc, 0x64, 0xac, 0x39, 0x14, 0x1a, 0x33, 0x71, 0xb5, 0xcf, 0xa5, 0xfa, + 0x0e, 0xe7, 0x22, 0x64, 0xaf, 0xa1, 0x86, 0x58, 0x5b, 0x7d, 0x37, 0x7a, 0x3b, 0x24, 0xc9, 0x46, + 0x69, 0x51, 0xef, 0x46, 0x69, 0x63, 0x27, 0x36, 0xd4, 0xb4, 0x21, 0xd5, 0xd3, 0x47, 0x3a, 0xa7, + 0x7f, 0x5a, 0x84, 0x53, 0x59, 0x21, 0xdf, 0xd0, 0xe7, 0x13, 0xd9, 0x0c, 0x5f, 0xec, 0x37, 0x58, + 0x1c, 0x4f, 0x71, 0xc8, 0x85, 0xcd, 0x4b, 0x0b, 0x66, 0x7e, 0xc3, 0x9e, 0xc3, 0x2c, 0xda, 0x64, + 0x71, 0x0f, 0x02, 0x9e, 0x85, 0x52, 0x1e, 0x1f, 0x1f, 0xee, 0xbb, 0x03, 0x22, 0x7d, 0x65, 0x98, + 0xb0, 0x7c, 0x90, 0xc5, 0xbd, 0x2d, 0x1f, 0x64, 0xcb, 0x73, 0x2e, 0x8c, 0x6a, 0x5f, 0xf3, 0x48, + 0x67, 0x7c, 0x97, 0xde, 0x56, 0x5a, 0xbf, 0x1f, 0xe9, 0xac, 0xff, 0xa8, 0x05, 0x09, 0x63, 0x78, + 0x25, 0x16, 0xb3, 0x72, 0xc5, 0x62, 0x17, 0x60, 0x20, 0xf0, 0x9b, 0x24, 0x99, 0xf6, 0x0f, 0xfb, + 0x4d, 0x82, 0x19, 0x84, 0x62, 0x44, 0xb1, 0xb0, 0x63, 0x4c, 0x7f, 0xc8, 0x89, 0x27, 0xda, 0x45, + 0x18, 0x6c, 0x92, 0x3d, 0xd2, 0x4c, 0x66, 0x67, 0xb9, 0x49, 0x0b, 0x31, 0x87, 0xd9, 0x3f, 0x3f, + 0x00, 0xe7, 0xba, 0x46, 0x0e, 0xa1, 0xcf, 0xa1, 0x6d, 0x27, 0x22, 0xf7, 0x9c, 0xfd, 0x64, 0x1a, + 0x85, 0x6b, 0xbc, 0x18, 0x4b, 0x38, 0x73, 0x57, 0xe2, 0xd1, 0x90, 0x13, 0x42, 0x44, 0x11, 0x04, + 0x59, 0x40, 0x4d, 0xa1, 0x54, 0xf1, 0x38, 0x84, 0x52, 0xcf, 0x03, 0x84, 0x61, 0x93, 0x9b, 0x0c, + 0x35, 0x84, 0x1f, 0x54, 0x1c, 0x35, 0xbb, 0x76, 0x53, 0x40, 0xb0, 0x86, 0x85, 0xca, 0x30, 0xd5, + 0x0e, 0xfc, 0x88, 0xcb, 0x64, 0xcb, 0xdc, 0xaa, 0x6e, 0xd0, 0x0c, 0xda, 0x50, 0x4d, 0xc0, 0x71, + 0xaa, 0x06, 0x7a, 0x09, 0x46, 0x45, 0x20, 0x87, 0xaa, 0xef, 0x37, 0x85, 0x18, 0x48, 0x19, 0x9a, + 0xd5, 0x62, 0x10, 0xd6, 0xf1, 0xb4, 0x6a, 0x4c, 0xd0, 0x3b, 0x9c, 0x59, 0x8d, 0x0b, 0x7b, 0x35, + 0xbc, 0x44, 0xf8, 0xc7, 0x91, 0xbe, 0xc2, 0x3f, 0xc6, 0x82, 0xb1, 0x52, 0xdf, 0x4a, 0x34, 0xe8, + 0x29, 0x4a, 0xfa, 0x99, 0x01, 0x98, 0x11, 0x0b, 0xe7, 0x51, 0x2f, 0x97, 0xdb, 0xe9, 0xe5, 0x72, + 0x1c, 0xa2, 0xb3, 0xf7, 0xd6, 0xcc, 0x49, 0xaf, 0x99, 0x1f, 0xb4, 0xc0, 0x64, 0xaf, 0xd0, 0xff, + 0x93, 0x9b, 0x87, 0xe6, 0xa5, 0x5c, 0x76, 0xad, 0x21, 0x2f, 0x90, 0x77, 0x98, 0x91, 0xc6, 0xfe, + 0x8f, 0x16, 0x3c, 0xd9, 0x93, 0x22, 0x5a, 0x81, 0x12, 0xe3, 0x01, 0xb5, 0xd7, 0xd9, 0x53, 0xca, + 0xea, 0x56, 0x02, 0x72, 0x58, 0xd2, 0xb8, 0x26, 0x5a, 0x49, 0x25, 0xfc, 0x79, 0x3a, 0x23, 0xe1, + 0xcf, 0x69, 0x63, 0x78, 0x1e, 0x32, 0xe3, 0xcf, 0xf7, 0xd3, 0x1b, 0xc7, 0xf0, 0x78, 0x41, 0x1f, + 0x36, 0xc4, 0x7e, 0x76, 0x42, 0xec, 0x87, 0x4c, 0x6c, 0xed, 0x0e, 0xf9, 0x38, 0x4c, 0xb1, 0x08, + 0x4f, 0xcc, 0x06, 0x5c, 0xf8, 0xe2, 0x14, 0x62, 0x3b, 0xcf, 0x9b, 0x09, 0x18, 0x4e, 0x61, 0xdb, + 0x7f, 0x58, 0x84, 0x21, 0xbe, 0xfd, 0x4e, 0xe0, 0x4d, 0xf8, 0x0c, 0x94, 0xdc, 0x56, 0xab, 0xc3, + 0x73, 0xb8, 0x0c, 0x72, 0x07, 0x5c, 0x3a, 0x4f, 0x15, 0x59, 0x88, 0x63, 0x38, 0x5a, 0x15, 0x12, + 0xe7, 0x2e, 0x41, 0x24, 0x79, 0xc7, 0x17, 0xca, 0x4e, 0xe4, 0x70, 0x06, 0x47, 0xdd, 0xb3, 0xb1, + 0x6c, 0x1a, 0x7d, 0x06, 0x20, 0x8c, 0x02, 0xd7, 0xdb, 0xa6, 0x65, 0x22, 0x66, 0xea, 0x07, 0xbb, + 0x50, 0xab, 0x29, 0x64, 0x4e, 0x33, 0x3e, 0x73, 0x14, 0x00, 0x6b, 0x14, 0xd1, 0x82, 0x71, 0xd3, + 0xcf, 0x25, 0xe6, 0x0e, 0x38, 0xd5, 0x78, 0xce, 0xe6, 0x3e, 0x02, 0x25, 0x45, 0xbc, 0x97, 0xfc, + 0x69, 0x4c, 0x67, 0x8b, 0x3e, 0x06, 0x93, 0x89, 0xbe, 0x1d, 0x49, 0x7c, 0xf5, 0x0b, 0x16, 0x4c, + 0xf2, 0xce, 0xac, 0x78, 0x7b, 0xe2, 0x36, 0x78, 0x1b, 0x4e, 0x35, 0x33, 0x4e, 0x65, 0x31, 0xfd, + 0xfd, 0x9f, 0xe2, 0x4a, 0x5c, 0x95, 0x05, 0xc5, 0x99, 0x6d, 0xa0, 0xcb, 0x74, 0xc7, 0xd1, 0x53, + 0xd7, 0x69, 0x0a, 0x7f, 0xdc, 0x31, 0xbe, 0xdb, 0x78, 0x19, 0x56, 0x50, 0xfb, 0x77, 0x2c, 0x98, + 0xe6, 0x3d, 0xbf, 0x41, 0xf6, 0xd5, 0xd9, 0xf4, 0xf5, 0xec, 0xbb, 0xc8, 0x1e, 0x56, 0xc8, 0xc9, + 0x1e, 0xa6, 0x7f, 0x5a, 0xb1, 0xeb, 0xa7, 0xfd, 0xb4, 0x05, 0x62, 0x85, 0x9c, 0x80, 0x10, 0xe2, + 0x5b, 0x4d, 0x21, 0xc4, 0x5c, 0xfe, 0x26, 0xc8, 0x91, 0x3e, 0xfc, 0xb9, 0x05, 0x53, 0x1c, 0x21, + 0xd6, 0x96, 0x7f, 0x5d, 0xe7, 0xa1, 0x9f, 0x1c, 0xc3, 0x37, 0xc8, 0xfe, 0x86, 0x5f, 0x75, 0xa2, + 0x9d, 0xec, 0x8f, 0x32, 0x26, 0x6b, 0xa0, 0xeb, 0x64, 0x35, 0xe4, 0x06, 0x3a, 0x42, 0xe2, 0xf2, + 0x23, 0x27, 0xd7, 0xb0, 0xbf, 0x66, 0x01, 0xe2, 0xcd, 0x18, 0x8c, 0x1b, 0x65, 0x87, 0x58, 0xa9, + 0x76, 0xd1, 0xc5, 0x47, 0x93, 0x82, 0x60, 0x0d, 0xeb, 0x58, 0x86, 0x27, 0x61, 0xf2, 0x50, 0xec, + 0x6d, 0xf2, 0x70, 0x84, 0x11, 0xfd, 0xd7, 0x43, 0x90, 0xf4, 0xfa, 0x41, 0x77, 0x60, 0xac, 0xee, + 0xb4, 0x9d, 0x4d, 0xb7, 0xe9, 0x46, 0x2e, 0x09, 0xbb, 0x19, 0x65, 0x2d, 0x6b, 0x78, 0x42, 0x49, + 0xad, 0x95, 0x60, 0x83, 0x0e, 0x5a, 0x00, 0x68, 0x07, 0xee, 0x9e, 0xdb, 0x24, 0xdb, 0x4c, 0x56, + 0xc2, 0x22, 0x00, 0x70, 0x4b, 0x23, 0x59, 0x8a, 0x35, 0x8c, 0x0c, 0x17, 0xeb, 0xe2, 0x23, 0x76, + 0xb1, 0x86, 0x13, 0x73, 0xb1, 0x1e, 0x38, 0x92, 0x8b, 0xf5, 0xc8, 0x91, 0x5d, 0xac, 0x07, 0xfb, + 0x72, 0xb1, 0xc6, 0x70, 0x46, 0xf2, 0x9e, 0xf4, 0xff, 0xaa, 0xdb, 0x24, 0xe2, 0xc1, 0xc1, 0xc3, + 0x16, 0xcc, 0x3d, 0x38, 0x98, 0x3f, 0x83, 0x33, 0x31, 0x70, 0x4e, 0x4d, 0xf4, 0x09, 0x98, 0x75, + 0x9a, 0x4d, 0xff, 0x9e, 0x9a, 0xd4, 0x95, 0xb0, 0xee, 0x34, 0xb9, 0x12, 0x62, 0x98, 0x51, 0x7d, + 0xe2, 0xc1, 0xc1, 0xfc, 0xec, 0x62, 0x0e, 0x0e, 0xce, 0xad, 0x8d, 0x3e, 0x0a, 0xa5, 0x76, 0xe0, + 0xd7, 0xd7, 0x34, 0xd7, 0xc4, 0xf3, 0x74, 0x00, 0xab, 0xb2, 0xf0, 0xf0, 0x60, 0x7e, 0x5c, 0xfd, + 0x61, 0x17, 0x7e, 0x5c, 0x21, 0xc3, 0x67, 0x7a, 0xf4, 0x58, 0x7d, 0xa6, 0x77, 0x61, 0xa6, 0x46, + 0x02, 0x97, 0xa5, 0x39, 0x6f, 0xc4, 0xe7, 0xd3, 0x06, 0x94, 0x82, 0xc4, 0x89, 0xdc, 0x57, 0x60, + 0x47, 0x2d, 0xcb, 0x81, 0x3c, 0x81, 0x63, 0x42, 0xf6, 0xff, 0xb2, 0x60, 0x58, 0x78, 0xf9, 0x9c, + 0x00, 0xd7, 0xb8, 0x68, 0x68, 0x12, 0xe6, 0xb3, 0x07, 0x8c, 0x75, 0x26, 0x57, 0x87, 0x50, 0x49, + 0xe8, 0x10, 0x9e, 0xec, 0x46, 0xa4, 0xbb, 0xf6, 0xe0, 0xaf, 0x15, 0x29, 0xf7, 0x6e, 0xf8, 0x9b, + 0x3e, 0xfa, 0x21, 0x58, 0x87, 0xe1, 0x50, 0xf8, 0x3b, 0x16, 0xf2, 0x0d, 0xf4, 0x93, 0x93, 0x18, + 0xdb, 0xb1, 0x09, 0x0f, 0x47, 0x49, 0x24, 0xd3, 0x91, 0xb2, 0xf8, 0x08, 0x1d, 0x29, 0x7b, 0x79, + 0xe4, 0x0e, 0x1c, 0x87, 0x47, 0xae, 0xfd, 0x15, 0x76, 0x73, 0xea, 0xe5, 0x27, 0xc0, 0x54, 0x5d, + 0x33, 0xef, 0x58, 0xbb, 0xcb, 0xca, 0x12, 0x9d, 0xca, 0x61, 0xae, 0x7e, 0xce, 0x82, 0x73, 0x19, + 0x5f, 0xa5, 0x71, 0x5a, 0xcf, 0xc2, 0x88, 0xd3, 0x69, 0xb8, 0x6a, 0x2f, 0x6b, 0xfa, 0xc4, 0x45, + 0x51, 0x8e, 0x15, 0x06, 0x5a, 0x86, 0x69, 0x72, 0xbf, 0xed, 0x72, 0x55, 0xaa, 0x6e, 0xd5, 0x5a, + 0xe4, 0xae, 0x61, 0x2b, 0x49, 0x20, 0x4e, 0xe3, 0xab, 0x28, 0x28, 0xc5, 0xdc, 0x28, 0x28, 0x7f, + 0xcf, 0x82, 0x51, 0xe5, 0xf1, 0xf7, 0xc8, 0x47, 0xfb, 0xe3, 0xe6, 0x68, 0x3f, 0xde, 0x65, 0xb4, + 0x73, 0x86, 0xf9, 0xb7, 0x0a, 0xaa, 0xbf, 0x55, 0x3f, 0x88, 0xfa, 0xe0, 0xe0, 0x1e, 0xde, 0x0e, + 0xff, 0x2a, 0x8c, 0x3a, 0xed, 0xb6, 0x04, 0x48, 0x1b, 0x34, 0x16, 0xa6, 0x37, 0x2e, 0xc6, 0x3a, + 0x8e, 0x72, 0x0b, 0x28, 0xe6, 0xba, 0x05, 0x34, 0x00, 0x22, 0x27, 0xd8, 0x26, 0x11, 0x2d, 0x13, + 0x11, 0xcb, 0xf2, 0xcf, 0x9b, 0x4e, 0xe4, 0x36, 0x17, 0x5c, 0x2f, 0x0a, 0xa3, 0x60, 0xa1, 0xe2, + 0x45, 0xb7, 0x02, 0xfe, 0x84, 0xd4, 0x42, 0x02, 0x29, 0x5a, 0x58, 0xa3, 0x2b, 0xbd, 0xdb, 0x59, + 0x1b, 0x83, 0xa6, 0x31, 0xc3, 0xba, 0x28, 0xc7, 0x0a, 0xc3, 0xfe, 0x08, 0xbb, 0x7d, 0xd8, 0x98, + 0x1e, 0x2d, 0x86, 0xce, 0x7f, 0x1d, 0x53, 0xb3, 0xc1, 0x34, 0x99, 0x65, 0x3d, 0x52, 0x4f, 0xf7, + 0xc3, 0x9e, 0x36, 0xac, 0x3b, 0xa9, 0xc5, 0xe1, 0x7c, 0xd0, 0xb7, 0xa5, 0x0c, 0x54, 0x9e, 0xeb, + 0x71, 0x6b, 0x1c, 0xc1, 0x24, 0x85, 0xe5, 0xec, 0x60, 0x19, 0x0d, 0x2a, 0x55, 0xb1, 0x2f, 0xb4, + 0x9c, 0x1d, 0x02, 0x80, 0x63, 0x1c, 0xca, 0x4c, 0xa9, 0x3f, 0xe1, 0x2c, 0x8a, 0x63, 0x57, 0x2a, + 0xec, 0x10, 0x6b, 0x18, 0xe8, 0x8a, 0x10, 0x28, 0x70, 0xbd, 0xc0, 0xe3, 0x09, 0x81, 0x82, 0x1c, + 0x2e, 0x4d, 0x0a, 0x74, 0x15, 0x46, 0x55, 0xda, 0xde, 0x2a, 0xcf, 0x06, 0x2b, 0x96, 0xd9, 0x4a, + 0x5c, 0x8c, 0x75, 0x1c, 0xb4, 0x01, 0x93, 0x21, 0x97, 0xb3, 0xa9, 0x80, 0xc2, 0x5c, 0x5e, 0xf9, + 0x41, 0x69, 0x05, 0x54, 0x33, 0xc1, 0x87, 0xac, 0x88, 0x9f, 0x4e, 0xd2, 0x03, 0x3d, 0x49, 0x02, + 0xbd, 0x06, 0x13, 0x4d, 0xdf, 0x69, 0x2c, 0x39, 0x4d, 0xc7, 0xab, 0xb3, 0xf1, 0x19, 0x31, 0xb3, + 0x3f, 0xde, 0x34, 0xa0, 0x38, 0x81, 0x4d, 0x99, 0x37, 0xbd, 0x44, 0x04, 0xc1, 0x76, 0xbc, 0x6d, + 0x12, 0x8a, 0x24, 0xac, 0x8c, 0x79, 0xbb, 0x99, 0x83, 0x83, 0x73, 0x6b, 0xa3, 0x97, 0x61, 0x4c, + 0x7e, 0xbe, 0x16, 0xb0, 0x21, 0xf6, 0xb0, 0xd0, 0x60, 0xd8, 0xc0, 0x44, 0xf7, 0xe0, 0xb4, 0xfc, + 0xbf, 0x11, 0x38, 0x5b, 0x5b, 0x6e, 0x5d, 0x78, 0x31, 0x73, 0x57, 0xcc, 0x45, 0xe9, 0x2f, 0xb8, + 0x92, 0x85, 0x74, 0x78, 0x30, 0x7f, 0x41, 0x8c, 0x5a, 0x26, 0x9c, 0x4d, 0x62, 0x36, 0x7d, 0xb4, + 0x06, 0x33, 0x3b, 0xc4, 0x69, 0x46, 0x3b, 0xcb, 0x3b, 0xa4, 0xbe, 0x2b, 0x37, 0x1d, 0x0b, 0x03, + 0xa1, 0xf9, 0x25, 0x5c, 0x4f, 0xa3, 0xe0, 0xac, 0x7a, 0xe8, 0x4d, 0x98, 0x6d, 0x77, 0x36, 0x9b, + 0x6e, 0xb8, 0xb3, 0xee, 0x47, 0xcc, 0x14, 0x48, 0x65, 0x01, 0x16, 0xf1, 0x22, 0x54, 0xa0, 0x8d, + 0x6a, 0x0e, 0x1e, 0xce, 0xa5, 0x80, 0xde, 0x86, 0xd3, 0x89, 0xc5, 0x20, 0x3c, 0xe6, 0x27, 0xf2, + 0x53, 0x0a, 0xd4, 0xb2, 0x2a, 0x88, 0xe0, 0x13, 0x59, 0x20, 0x9c, 0xdd, 0x04, 0x7d, 0x7c, 0x68, + 0x31, 0x5c, 0xc3, 0xd9, 0xa9, 0xd8, 0x66, 0x59, 0x0b, 0xf4, 0x1a, 0x62, 0x03, 0x0b, 0xbd, 0x02, + 0xe0, 0xb6, 0x57, 0x9d, 0x96, 0xdb, 0xa4, 0x8f, 0xcc, 0x19, 0x56, 0x87, 0x3e, 0x38, 0xa0, 0x52, + 0x95, 0xa5, 0xf4, 0x54, 0x17, 0xff, 0xf6, 0xb1, 0x86, 0x8d, 0xaa, 0x30, 0x21, 0xfe, 0xed, 0x8b, + 0xc5, 0x30, 0xad, 0x5c, 0xda, 0x27, 0x64, 0x0d, 0xb5, 0x02, 0x90, 0x59, 0xc2, 0xe6, 0x3c, 0x51, + 0x1f, 0x6d, 0xc3, 0x39, 0x91, 0x66, 0x9a, 0xe8, 0xab, 0x5b, 0xce, 0x5e, 0xc8, 0x32, 0x00, 0x8c, + 0x70, 0x67, 0x89, 0xc5, 0x6e, 0x88, 0xb8, 0x3b, 0x1d, 0xca, 0x15, 0xe8, 0x9b, 0x84, 0x3b, 0x91, + 0x9e, 0xe6, 0x46, 0x4d, 0x94, 0x2b, 0xb8, 0x99, 0x04, 0xe2, 0x34, 0x3e, 0x0a, 0xe1, 0xb4, 0xeb, + 0x65, 0xed, 0x89, 0x33, 0x8c, 0xd0, 0xc7, 0xb8, 0xff, 0x6c, 0xf7, 0xfd, 0x90, 0x09, 0xe7, 0xfb, + 0x21, 0x93, 0xf6, 0x3b, 0xb3, 0xdd, 0xfb, 0x6d, 0x8b, 0xd6, 0xd6, 0xf8, 0x7b, 0xf4, 0x59, 0x18, + 0xd3, 0x3f, 0x4c, 0xf0, 0x2a, 0x97, 0xb2, 0xd9, 0x5f, 0xed, 0x54, 0xe1, 0xaf, 0x03, 0x75, 0x72, + 0xe8, 0x30, 0x6c, 0x50, 0x44, 0xf5, 0x0c, 0x4f, 0xf3, 0x2b, 0xfd, 0xf1, 0x42, 0xfd, 0x9b, 0xae, + 0x11, 0xc8, 0xde, 0x2c, 0xe8, 0x26, 0x8c, 0xd4, 0x9b, 0x2e, 0xf1, 0xa2, 0x4a, 0xb5, 0x5b, 0x6c, + 0xb8, 0x65, 0x81, 0x23, 0x76, 0x9f, 0x08, 0xe8, 0xcf, 0xcb, 0xb0, 0xa2, 0x60, 0xff, 0x6a, 0x01, + 0xe6, 0x7b, 0x64, 0x87, 0x48, 0x28, 0xb2, 0xac, 0xbe, 0x14, 0x59, 0x8b, 0x32, 0x41, 0xf6, 0x7a, + 0x42, 0x46, 0x96, 0x48, 0x7e, 0x1d, 0x4b, 0xca, 0x92, 0xf8, 0x7d, 0x3b, 0x16, 0xe8, 0xba, 0xb0, + 0x81, 0x9e, 0xae, 0x31, 0x86, 0x0e, 0x7c, 0xb0, 0xff, 0x87, 0x73, 0xae, 0x3e, 0xd3, 0xfe, 0x4a, + 0x01, 0x4e, 0xab, 0x21, 0xfc, 0xe6, 0x1d, 0xb8, 0xdb, 0xe9, 0x81, 0x3b, 0x06, 0x6d, 0xb0, 0x7d, + 0x0b, 0x86, 0x78, 0xb0, 0xbb, 0x3e, 0x18, 0xf6, 0x8b, 0x66, 0x5c, 0x58, 0xc5, 0x23, 0x1a, 0xb1, + 0x61, 0xbf, 0xd7, 0x82, 0xc9, 0x8d, 0xe5, 0x6a, 0xcd, 0xaf, 0xef, 0x92, 0x68, 0x91, 0x3f, 0xb0, + 0xb0, 0xe6, 0x93, 0xfb, 0x30, 0x4c, 0x75, 0x16, 0xbb, 0x7e, 0x01, 0x06, 0x76, 0xfc, 0x30, 0x4a, + 0x9a, 0x8a, 0x5c, 0xf7, 0xc3, 0x08, 0x33, 0x88, 0xfd, 0xbb, 0x16, 0x0c, 0x6e, 0x38, 0xae, 0x17, + 0x49, 0xb5, 0x82, 0x95, 0xa3, 0x56, 0xe8, 0xe7, 0xbb, 0xd0, 0x4b, 0x30, 0x44, 0xb6, 0xb6, 0x48, + 0x3d, 0x12, 0xb3, 0x2a, 0x03, 0x1a, 0x0c, 0xad, 0xb0, 0x52, 0xca, 0x41, 0xb2, 0xc6, 0xf8, 0x5f, + 0x2c, 0x90, 0xd1, 0x5d, 0x28, 0x45, 0x6e, 0x8b, 0x2c, 0x36, 0x1a, 0x42, 0xd9, 0xfe, 0x10, 0x41, + 0x19, 0x36, 0x24, 0x01, 0x1c, 0xd3, 0xb2, 0xbf, 0x54, 0x00, 0x88, 0xa3, 0x04, 0xf5, 0xfa, 0xc4, + 0xa5, 0x94, 0x1a, 0xf6, 0x52, 0x86, 0x1a, 0x16, 0xc5, 0x04, 0x33, 0x74, 0xb0, 0x6a, 0x98, 0x8a, + 0x7d, 0x0d, 0xd3, 0xc0, 0x51, 0x86, 0x69, 0x19, 0xa6, 0xe3, 0x28, 0x47, 0x66, 0x90, 0x37, 0x76, + 0x7d, 0x6e, 0x24, 0x81, 0x38, 0x8d, 0x6f, 0x13, 0xb8, 0xa0, 0x82, 0xbd, 0x88, 0x1b, 0x8d, 0xd9, + 0x72, 0xeb, 0x6a, 0xed, 0x1e, 0xe3, 0x14, 0xeb, 0x99, 0x0b, 0xb9, 0x7a, 0xe6, 0x9f, 0xb0, 0xe0, + 0x54, 0xb2, 0x1d, 0xe6, 0xc5, 0xfb, 0x45, 0x0b, 0x4e, 0x33, 0x6d, 0x3b, 0x6b, 0x35, 0xad, 0xdb, + 0x7f, 0xb1, 0x6b, 0x00, 0x9b, 0x9c, 0x1e, 0xc7, 0x91, 0x33, 0xd6, 0xb2, 0x48, 0xe3, 0xec, 0x16, + 0xed, 0xff, 0x50, 0x80, 0xd9, 0xbc, 0xc8, 0x37, 0xcc, 0xd5, 0xc3, 0xb9, 0x5f, 0xdb, 0x25, 0xf7, + 0x84, 0x41, 0x7d, 0xec, 0xea, 0xc1, 0x8b, 0xb1, 0x84, 0x27, 0x03, 0xfe, 0x17, 0xfa, 0x0c, 0xf8, + 0xbf, 0x03, 0xd3, 0xf7, 0x76, 0x88, 0x77, 0xdb, 0x0b, 0x9d, 0xc8, 0x0d, 0xb7, 0x5c, 0xa6, 0x99, + 0xe6, 0xeb, 0xe6, 0x15, 0x69, 0xf6, 0x7e, 0x37, 0x89, 0x70, 0x78, 0x30, 0x7f, 0xce, 0x28, 0x88, + 0xbb, 0xcc, 0x0f, 0x12, 0x9c, 0x26, 0x9a, 0xce, 0x97, 0x30, 0xf0, 0x08, 0xf3, 0x25, 0xd8, 0x5f, + 0xb4, 0xe0, 0x6c, 0x6e, 0x92, 0x56, 0x74, 0x19, 0x46, 0x9c, 0xb6, 0xcb, 0x85, 0xfb, 0xe2, 0x18, + 0x65, 0x42, 0xa4, 0x6a, 0x85, 0x8b, 0xf6, 0x15, 0x54, 0x25, 0x8f, 0x2f, 0xe4, 0x26, 0x8f, 0xef, + 0x99, 0x0b, 0xde, 0xfe, 0x1e, 0x0b, 0x84, 0x9b, 0x6a, 0x1f, 0x67, 0xf7, 0xa7, 0x60, 0x6c, 0x2f, + 0x9d, 0x53, 0xe9, 0x42, 0xbe, 0xdf, 0xae, 0xc8, 0xa4, 0xa4, 0x18, 0x32, 0x23, 0x7f, 0x92, 0x41, + 0xcb, 0x6e, 0x80, 0x80, 0x96, 0x09, 0x13, 0x5d, 0xf7, 0xee, 0xcd, 0xf3, 0x00, 0x0d, 0x86, 0xab, + 0x65, 0xe0, 0x57, 0x37, 0x73, 0x59, 0x41, 0xb0, 0x86, 0x65, 0xff, 0xdb, 0x02, 0x8c, 0xca, 0x1c, + 0x3e, 0x1d, 0xaf, 0x1f, 0x01, 0xd3, 0x91, 0x92, 0x7a, 0xa2, 0x2b, 0x50, 0x62, 0x12, 0xd0, 0x6a, + 0x2c, 0x97, 0x53, 0xf2, 0x87, 0x35, 0x09, 0xc0, 0x31, 0x0e, 0xdd, 0x45, 0x61, 0x67, 0x93, 0xa1, + 0x27, 0x9c, 0x2a, 0x6b, 0xbc, 0x18, 0x4b, 0x38, 0xfa, 0x04, 0x4c, 0xf1, 0x7a, 0x81, 0xdf, 0x76, + 0xb6, 0xb9, 0xd6, 0x64, 0x50, 0x85, 0x5d, 0x98, 0x5a, 0x4b, 0xc0, 0x0e, 0x0f, 0xe6, 0x4f, 0x25, + 0xcb, 0x98, 0x3a, 0x30, 0x45, 0x85, 0x19, 0x47, 0xf1, 0x46, 0xe8, 0xee, 0x4f, 0xd9, 0x54, 0xc5, + 0x20, 0xac, 0xe3, 0xd9, 0x9f, 0x05, 0x94, 0xce, 0x66, 0x84, 0x5e, 0xe7, 0x16, 0xb1, 0x6e, 0x40, + 0x1a, 0xdd, 0xd4, 0x83, 0x7a, 0x70, 0x01, 0xe9, 0x0f, 0xc5, 0x6b, 0x61, 0x55, 0xdf, 0xfe, 0xff, + 0x8b, 0x30, 0x95, 0xf4, 0x00, 0x47, 0xd7, 0x61, 0x88, 0xb3, 0x1e, 0x82, 0x7c, 0x17, 0xeb, 0x13, + 0xcd, 0x6f, 0x9c, 0x1d, 0xc2, 0x82, 0x7b, 0x11, 0xf5, 0xd1, 0x9b, 0x30, 0xda, 0xf0, 0xef, 0x79, + 0xf7, 0x9c, 0xa0, 0xb1, 0x58, 0xad, 0x88, 0xe5, 0x9c, 0xf9, 0x1c, 0x2e, 0xc7, 0x68, 0xba, 0x2f, + 0x3a, 0xd3, 0xb4, 0xc6, 0x20, 0xac, 0x93, 0x43, 0x1b, 0x2c, 0x04, 0xfa, 0x96, 0xbb, 0xbd, 0xe6, + 0xb4, 0xbb, 0xb9, 0x47, 0x2c, 0x4b, 0x24, 0x8d, 0xf2, 0xb8, 0x88, 0x93, 0xce, 0x01, 0x38, 0x26, + 0x84, 0x3e, 0x0f, 0x33, 0x61, 0x8e, 0x90, 0x3e, 0x2f, 0xb9, 0x5d, 0x37, 0xb9, 0xf5, 0xd2, 0x63, + 0x0f, 0x0e, 0xe6, 0x67, 0xb2, 0xc4, 0xf9, 0x59, 0xcd, 0xd8, 0x3f, 0x72, 0x0a, 0x8c, 0x4d, 0x6c, + 0xe4, 0x3a, 0xb5, 0x8e, 0x29, 0xd7, 0x29, 0x86, 0x11, 0xd2, 0x6a, 0x47, 0xfb, 0x65, 0x37, 0xe8, + 0x96, 0x01, 0x7c, 0x45, 0xe0, 0xa4, 0x69, 0x4a, 0x08, 0x56, 0x74, 0xb2, 0x13, 0xd2, 0x16, 0xbf, + 0x8e, 0x09, 0x69, 0x07, 0x4e, 0x30, 0x21, 0xed, 0x3a, 0x0c, 0x6f, 0xbb, 0x11, 0x26, 0x6d, 0x5f, + 0x30, 0xfd, 0x99, 0xeb, 0xf0, 0x1a, 0x47, 0x49, 0xa7, 0x3e, 0x14, 0x00, 0x2c, 0x89, 0xa0, 0xd7, + 0xd5, 0x0e, 0x1c, 0xca, 0x7f, 0x98, 0xa7, 0xcd, 0x24, 0x32, 0xf7, 0xa0, 0x48, 0x3b, 0x3b, 0xfc, + 0xb0, 0x69, 0x67, 0x57, 0x65, 0xb2, 0xd8, 0x91, 0x7c, 0x5f, 0x26, 0x96, 0x0b, 0xb6, 0x47, 0x8a, + 0xd8, 0x3b, 0x7a, 0x82, 0xdd, 0x52, 0xfe, 0x49, 0xa0, 0x72, 0xe7, 0xf6, 0x99, 0x56, 0xf7, 0x7b, + 0x2c, 0x38, 0xdd, 0xce, 0xca, 0x35, 0x2d, 0x2c, 0x0a, 0x5e, 0xea, 0x3b, 0x9d, 0xb5, 0xd1, 0x20, + 0x93, 0xc4, 0x65, 0xa2, 0xe1, 0xec, 0xe6, 0xe8, 0x40, 0x07, 0x9b, 0x0d, 0xa1, 0xd9, 0xbe, 0x98, + 0x93, 0x9f, 0xb7, 0x4b, 0x56, 0xde, 0x8d, 0x8c, 0x5c, 0xb0, 0xef, 0xcf, 0xcb, 0x05, 0xdb, 0x77, + 0x06, 0xd8, 0xd7, 0x55, 0x66, 0xde, 0xf1, 0xfc, 0xa5, 0xc4, 0xf3, 0xee, 0xf6, 0xcc, 0xc7, 0xfb, + 0xba, 0xca, 0xc7, 0xdb, 0x25, 0xbe, 0x2d, 0xcf, 0xb6, 0xdb, 0x33, 0x0b, 0xaf, 0x96, 0x49, 0x77, + 0xf2, 0x78, 0x32, 0xe9, 0x1a, 0x57, 0x0d, 0x4f, 0xe6, 0xfa, 0x4c, 0x8f, 0xab, 0xc6, 0xa0, 0xdb, + 0xfd, 0xb2, 0xe1, 0x59, 0x83, 0xa7, 0x1f, 0x2a, 0x6b, 0xf0, 0x1d, 0x3d, 0x0b, 0x2f, 0xea, 0x91, + 0x66, 0x96, 0x22, 0xf5, 0x99, 0x7b, 0xf7, 0x8e, 0x7e, 0x01, 0xce, 0xe4, 0xd3, 0x55, 0xf7, 0x5c, + 0x9a, 0x6e, 0xe6, 0x15, 0x98, 0xca, 0xe9, 0x7b, 0xea, 0x64, 0x72, 0xfa, 0x9e, 0x3e, 0xf6, 0x9c, + 0xbe, 0x67, 0x4e, 0x20, 0xa7, 0xef, 0x63, 0x27, 0x98, 0xd3, 0xf7, 0x0e, 0x33, 0xc3, 0xe1, 0xc1, + 0x7e, 0x44, 0x3c, 0xde, 0xec, 0xd8, 0xaf, 0x59, 0x11, 0x81, 0xf8, 0xc7, 0x29, 0x10, 0x8e, 0x49, + 0x65, 0xe4, 0x0a, 0x9e, 0x7d, 0x04, 0xb9, 0x82, 0xd7, 0xe3, 0x5c, 0xc1, 0x67, 0xf3, 0xa7, 0x3a, + 0xc3, 0x71, 0x23, 0x27, 0x43, 0xf0, 0x1d, 0x3d, 0xb3, 0xef, 0xe3, 0x5d, 0x74, 0x2d, 0x59, 0x82, + 0xc7, 0x2e, 0xf9, 0x7c, 0x5f, 0xe3, 0xf9, 0x7c, 0x9f, 0xc8, 0x3f, 0xc9, 0x93, 0xd7, 0x9d, 0x91, + 0xc5, 0x97, 0xf6, 0x4b, 0x45, 0x7e, 0x64, 0x91, 0x87, 0x73, 0xfa, 0xa5, 0x42, 0x47, 0xa6, 0xfb, + 0xa5, 0x40, 0x38, 0x26, 0x65, 0x7f, 0x5f, 0x01, 0xce, 0x77, 0xdf, 0x6f, 0xb1, 0x34, 0xb5, 0x1a, + 0xab, 0x9e, 0x13, 0xd2, 0x54, 0xfe, 0x66, 0x8b, 0xb1, 0xfa, 0x0e, 0x64, 0x77, 0x0d, 0xa6, 0x95, + 0xc7, 0x47, 0xd3, 0xad, 0xef, 0xaf, 0xc7, 0x2f, 0x5f, 0xe5, 0x25, 0x5f, 0x4b, 0x22, 0xe0, 0x74, + 0x1d, 0xb4, 0x08, 0x93, 0x46, 0x61, 0xa5, 0x2c, 0xde, 0x66, 0x4a, 0x7c, 0x5b, 0x33, 0xc1, 0x38, + 0x89, 0x6f, 0x7f, 0xd9, 0x82, 0xc7, 0x72, 0x92, 0xe1, 0xf5, 0x1d, 0xa7, 0x6d, 0x0b, 0x26, 0xdb, + 0x66, 0xd5, 0x1e, 0xa1, 0x25, 0x8d, 0x94, 0x7b, 0xaa, 0xaf, 0x09, 0x00, 0x4e, 0x12, 0xb5, 0xff, + 0xcc, 0x82, 0x73, 0x5d, 0x4d, 0x18, 0x11, 0x86, 0x33, 0xdb, 0xad, 0xd0, 0x59, 0x0e, 0x48, 0x83, + 0x78, 0x91, 0xeb, 0x34, 0x6b, 0x6d, 0x52, 0xd7, 0xe4, 0xe1, 0xcc, 0x16, 0xf0, 0xda, 0x5a, 0x6d, + 0x31, 0x8d, 0x81, 0x73, 0x6a, 0xa2, 0x55, 0x40, 0x69, 0x88, 0x98, 0x61, 0x16, 0xc3, 0x3a, 0x4d, + 0x0f, 0x67, 0xd4, 0x40, 0x1f, 0x81, 0x71, 0x65, 0x1a, 0xa9, 0xcd, 0x38, 0x3b, 0xd8, 0xb1, 0x0e, + 0xc0, 0x26, 0xde, 0xd2, 0xe5, 0x5f, 0xff, 0xfd, 0xf3, 0xef, 0xfb, 0xcd, 0xdf, 0x3f, 0xff, 0xbe, + 0xdf, 0xf9, 0xfd, 0xf3, 0xef, 0xfb, 0x8e, 0x07, 0xe7, 0xad, 0x5f, 0x7f, 0x70, 0xde, 0xfa, 0xcd, + 0x07, 0xe7, 0xad, 0xdf, 0x79, 0x70, 0xde, 0xfa, 0xbd, 0x07, 0xe7, 0xad, 0x2f, 0xfd, 0xc1, 0xf9, + 0xf7, 0x7d, 0xaa, 0xb0, 0x77, 0xf5, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0xc8, 0x2e, 0x0b, 0xd2, + 0xbc, 0x04, 0x01, 0x00, } func (m *AWSElasticBlockStoreVolumeSource) Marshal() (dAtA []byte, err error) { @@ -9985,14 +9990,6 @@ func (m *EphemeralVolumeSource) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - i-- - if m.ReadOnly { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x10 if m.VolumeClaimTemplate != nil { { size, err := m.VolumeClaimTemplate.MarshalToSizedBuffer(dAtA[:i]) @@ -14121,6 +14118,18 @@ func (m *PodAffinityTerm) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.NamespaceSelector != nil { + { + size, err := m.NamespaceSelector.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } i -= len(m.TopologyKey) copy(dAtA[i:], m.TopologyKey) i = encodeVarintGenerated(dAtA, i, uint64(len(m.TopologyKey))) @@ -15828,6 +15837,11 @@ func (m *Probe) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.TerminationGracePeriodSeconds != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.TerminationGracePeriodSeconds)) + i-- + dAtA[i] = 0x38 + } i = encodeVarintGenerated(dAtA, i, uint64(m.FailureThreshold)) i-- dAtA[i] = 0x30 @@ -18036,6 +18050,24 @@ func (m *ServiceSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.InternalTrafficPolicy != nil { + i -= len(*m.InternalTrafficPolicy) + copy(dAtA[i:], *m.InternalTrafficPolicy) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.InternalTrafficPolicy))) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xb2 + } + if m.LoadBalancerClass != nil { + i -= len(*m.LoadBalancerClass) + copy(dAtA[i:], *m.LoadBalancerClass) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.LoadBalancerClass))) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xaa + } if m.AllocateLoadBalancerNodePorts != nil { i-- if *m.AllocateLoadBalancerNodePorts { @@ -20603,7 +20635,6 @@ func (m *EphemeralVolumeSource) Size() (n int) { l = m.VolumeClaimTemplate.Size() n += 1 + l + sovGenerated(uint64(l)) } - n += 2 return n } @@ -22111,6 +22142,10 @@ func (m *PodAffinityTerm) Size() (n int) { } l = len(m.TopologyKey) n += 1 + l + sovGenerated(uint64(l)) + if m.NamespaceSelector != nil { + l = m.NamespaceSelector.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -22727,6 +22762,9 @@ func (m *Probe) Size() (n int) { n += 1 + sovGenerated(uint64(m.PeriodSeconds)) n += 1 + sovGenerated(uint64(m.SuccessThreshold)) n += 1 + sovGenerated(uint64(m.FailureThreshold)) + if m.TerminationGracePeriodSeconds != nil { + n += 1 + sovGenerated(uint64(*m.TerminationGracePeriodSeconds)) + } return n } @@ -23589,6 +23627,14 @@ func (m *ServiceSpec) Size() (n int) { if m.AllocateLoadBalancerNodePorts != nil { n += 3 } + if m.LoadBalancerClass != nil { + l = len(*m.LoadBalancerClass) + n += 2 + l + sovGenerated(uint64(l)) + } + if m.InternalTrafficPolicy != nil { + l = len(*m.InternalTrafficPolicy) + n += 2 + l + sovGenerated(uint64(l)) + } return n } @@ -24882,7 +24928,6 @@ func (this *EphemeralVolumeSource) String() string { } s := strings.Join([]string{`&EphemeralVolumeSource{`, `VolumeClaimTemplate:` + strings.Replace(this.VolumeClaimTemplate.String(), "PersistentVolumeClaimTemplate", "PersistentVolumeClaimTemplate", 1) + `,`, - `ReadOnly:` + fmt.Sprintf("%v", this.ReadOnly) + `,`, `}`, }, "") return s @@ -26033,6 +26078,7 @@ func (this *PodAffinityTerm) String() string { `LabelSelector:` + strings.Replace(fmt.Sprintf("%v", this.LabelSelector), "LabelSelector", "v1.LabelSelector", 1) + `,`, `Namespaces:` + fmt.Sprintf("%v", this.Namespaces) + `,`, `TopologyKey:` + fmt.Sprintf("%v", this.TopologyKey) + `,`, + `NamespaceSelector:` + strings.Replace(fmt.Sprintf("%v", this.NamespaceSelector), "LabelSelector", "v1.LabelSelector", 1) + `,`, `}`, }, "") return s @@ -26512,6 +26558,7 @@ func (this *Probe) String() string { `PeriodSeconds:` + fmt.Sprintf("%v", this.PeriodSeconds) + `,`, `SuccessThreshold:` + fmt.Sprintf("%v", this.SuccessThreshold) + `,`, `FailureThreshold:` + fmt.Sprintf("%v", this.FailureThreshold) + `,`, + `TerminationGracePeriodSeconds:` + valueToStringGenerated(this.TerminationGracePeriodSeconds) + `,`, `}`, }, "") return s @@ -27182,6 +27229,8 @@ func (this *ServiceSpec) String() string { `ClusterIPs:` + fmt.Sprintf("%v", this.ClusterIPs) + `,`, `IPFamilies:` + fmt.Sprintf("%v", this.IPFamilies) + `,`, `AllocateLoadBalancerNodePorts:` + valueToStringGenerated(this.AllocateLoadBalancerNodePorts) + `,`, + `LoadBalancerClass:` + valueToStringGenerated(this.LoadBalancerClass) + `,`, + `InternalTrafficPolicy:` + valueToStringGenerated(this.InternalTrafficPolicy) + `,`, `}`, }, "") return s @@ -27620,10 +27669,7 @@ func (m *AWSElasticBlockStoreVolumeSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -27781,10 +27827,7 @@ func (m *Affinity) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -27898,10 +27941,7 @@ func (m *AttachedVolume) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -27985,10 +28025,7 @@ func (m *AvoidPods) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -28222,10 +28259,7 @@ func (m *AzureDiskVolumeSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -28392,10 +28426,7 @@ func (m *AzureFilePersistentVolumeSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -28529,10 +28560,7 @@ func (m *AzureFileVolumeSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -28648,10 +28676,7 @@ func (m *Binding) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -28927,7 +28952,7 @@ func (m *CSIPersistentVolumeSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -29088,10 +29113,7 @@ func (m *CSIPersistentVolumeSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -29337,7 +29359,7 @@ func (m *CSIVolumeSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -29390,10 +29412,7 @@ func (m *CSIVolumeSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -29507,10 +29526,7 @@ func (m *Capabilities) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -29744,10 +29760,7 @@ func (m *CephFSPersistentVolumeSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -29981,10 +29994,7 @@ func (m *CephFSVolumeSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -30154,10 +30164,7 @@ func (m *CinderPersistentVolumeSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -30327,10 +30334,7 @@ func (m *CinderVolumeSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -30400,10 +30404,7 @@ func (m *ClientIPConfig) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -30581,10 +30582,7 @@ func (m *ComponentCondition) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -30701,10 +30699,7 @@ func (m *ComponentStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -30821,10 +30816,7 @@ func (m *ComponentStatusList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -31017,7 +31009,7 @@ func (m *ConfigMap) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -31145,7 +31137,7 @@ func (m *ConfigMap) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -31183,10 +31175,7 @@ func (m *ConfigMap) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -31290,10 +31279,7 @@ func (m *ConfigMapEnvSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -31429,10 +31415,7 @@ func (m *ConfigMapKeySelector) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -31549,10 +31532,7 @@ func (m *ConfigMapList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -31762,10 +31742,7 @@ func (m *ConfigMapNodeConfigSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -31903,10 +31880,7 @@ func (m *ConfigMapProjection) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -32064,10 +32038,7 @@ func (m *ConfigMapVolumeSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -32816,10 +32787,7 @@ func (m *Container) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -32920,10 +32888,7 @@ func (m *ContainerImage) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -33107,10 +33072,7 @@ func (m *ContainerPort) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -33268,10 +33230,7 @@ func (m *ContainerState) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -33354,10 +33313,7 @@ func (m *ContainerStateRunning) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -33607,10 +33563,7 @@ func (m *ContainerStateTerminated) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -33724,10 +33677,7 @@ func (m *ContainerStateWaiting) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -34031,10 +33981,7 @@ func (m *ContainerStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -34103,10 +34050,7 @@ func (m *DaemonEndpoint) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -34190,10 +34134,7 @@ func (m *DownwardAPIProjection) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -34367,10 +34308,7 @@ func (m *DownwardAPIVolumeFile) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -34474,10 +34412,7 @@ func (m *DownwardAPIVolumeSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -34595,10 +34530,7 @@ func (m *EmptyDirVolumeSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -34781,10 +34713,7 @@ func (m *EndpointAddress) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -34950,10 +34879,7 @@ func (m *EndpointPort) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -35105,10 +35031,7 @@ func (m *EndpointSubset) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -35225,10 +35148,7 @@ func (m *Endpoints) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -35345,10 +35265,7 @@ func (m *EndpointsList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -35502,10 +35419,7 @@ func (m *EnvFromSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -35655,10 +35569,7 @@ func (m *EnvVar) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -35852,10 +35763,7 @@ func (m *EnvVarSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -35970,10 +35878,7 @@ func (m *EphemeralContainer) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -36722,10 +36627,7 @@ func (m *EphemeralContainerCommon) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -36842,10 +36744,7 @@ func (m *EphemeralContainers) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -36925,36 +36824,13 @@ func (m *EphemeralVolumeSource) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ReadOnly", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.ReadOnly = bool(v != 0) default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -37485,10 +37361,7 @@ func (m *Event) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -37605,10 +37478,7 @@ func (m *EventList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -37710,10 +37580,7 @@ func (m *EventSeries) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -37827,10 +37694,7 @@ func (m *EventSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -37912,10 +37776,7 @@ func (m *ExecAction) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -38101,10 +37962,7 @@ func (m *FCVolumeSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -38384,7 +38242,7 @@ func (m *FlexPersistentVolumeSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -38401,10 +38259,7 @@ func (m *FlexPersistentVolumeSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -38684,7 +38539,7 @@ func (m *FlexVolumeSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -38701,10 +38556,7 @@ func (m *FlexVolumeSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -38818,10 +38670,7 @@ func (m *FlockerVolumeSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -38974,10 +38823,7 @@ func (m *GCEPersistentDiskVolumeSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -39123,10 +38969,7 @@ func (m *GitRepoVolumeSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -39293,10 +39136,7 @@ func (m *GlusterfsPersistentVolumeSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -39430,10 +39270,7 @@ func (m *GlusterfsVolumeSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -39646,10 +39483,7 @@ func (m *HTTPGetAction) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -39763,10 +39597,7 @@ func (m *HTTPHeader) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -39924,10 +39755,7 @@ func (m *Handler) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -40041,10 +39869,7 @@ func (m *HostAlias) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -40159,10 +39984,7 @@ func (m *HostPathVolumeSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -40520,10 +40342,7 @@ func (m *ISCSIPersistentVolumeSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -40881,10 +40700,7 @@ func (m *ISCSIVolumeSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -41018,10 +40834,7 @@ func (m *KeyToPath) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -41143,10 +40956,7 @@ func (m *Lifecycle) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -41262,10 +41072,7 @@ func (m *LimitRange) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -41459,7 +41266,7 @@ func (m *LimitRangeItem) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -41588,7 +41395,7 @@ func (m *LimitRangeItem) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -41717,7 +41524,7 @@ func (m *LimitRangeItem) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -41846,7 +41653,7 @@ func (m *LimitRangeItem) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -41975,7 +41782,7 @@ func (m *LimitRangeItem) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -41992,10 +41799,7 @@ func (m *LimitRangeItem) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -42112,10 +41916,7 @@ func (m *LimitRangeList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -42199,10 +42000,7 @@ func (m *LimitRangeSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -42319,10 +42117,7 @@ func (m *List) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -42470,10 +42265,7 @@ func (m *LoadBalancerIngress) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -42557,10 +42349,7 @@ func (m *LoadBalancerStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -42642,10 +42431,7 @@ func (m *LocalObjectReference) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -42760,10 +42546,7 @@ func (m *LocalVolumeSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -42897,10 +42680,7 @@ func (m *NFSVolumeSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -43049,10 +42829,7 @@ func (m *Namespace) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -43263,10 +43040,7 @@ func (m *NamespaceCondition) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -43383,10 +43157,7 @@ func (m *NamespaceList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -43468,10 +43239,7 @@ func (m *NamespaceSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -43587,10 +43355,7 @@ func (m *NamespaceStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -43739,10 +43504,7 @@ func (m *Node) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -43856,10 +43618,7 @@ func (m *NodeAddress) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -43979,10 +43738,7 @@ func (m *NodeAffinity) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -44226,10 +43982,7 @@ func (m *NodeCondition) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -44315,10 +44068,7 @@ func (m *NodeConfigSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -44508,10 +44258,7 @@ func (m *NodeConfigStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -44594,10 +44341,7 @@ func (m *NodeDaemonEndpoints) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -44714,10 +44458,7 @@ func (m *NodeList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -44799,10 +44540,7 @@ func (m *NodeProxyOptions) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -44964,7 +44702,7 @@ func (m *NodeResources) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -44981,10 +44719,7 @@ func (m *NodeResources) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -45068,10 +44803,7 @@ func (m *NodeSelector) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -45217,10 +44949,7 @@ func (m *NodeSelectorRequirement) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -45338,10 +45067,7 @@ func (m *NodeSelectorTerm) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -45609,10 +45335,7 @@ func (m *NodeSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -45774,7 +45497,7 @@ func (m *NodeStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -45903,7 +45626,7 @@ func (m *NodeStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -46222,10 +45945,7 @@ func (m *NodeStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -46595,10 +46315,7 @@ func (m *NodeSystemInfo) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -46712,10 +46429,7 @@ func (m *ObjectFieldSelector) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -46989,10 +46703,7 @@ func (m *ObjectReference) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -47141,10 +46852,7 @@ func (m *PersistentVolume) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -47293,10 +47001,7 @@ func (m *PersistentVolumeClaim) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -47540,10 +47245,7 @@ func (m *PersistentVolumeClaimCondition) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -47660,10 +47362,7 @@ func (m *PersistentVolumeClaimList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -47948,10 +47647,7 @@ func (m *PersistentVolumeClaimSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -48177,7 +47873,7 @@ func (m *PersistentVolumeClaimStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -48228,10 +47924,7 @@ func (m *PersistentVolumeClaimStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -48347,10 +48040,7 @@ func (m *PersistentVolumeClaimTemplate) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -48452,10 +48142,7 @@ func (m *PersistentVolumeClaimVolumeSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -48572,10 +48259,7 @@ func (m *PersistentVolumeList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -49417,10 +49101,7 @@ func (m *PersistentVolumeSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -49582,7 +49263,7 @@ func (m *PersistentVolumeSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -49865,10 +49546,7 @@ func (m *PersistentVolumeSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -50014,10 +49692,7 @@ func (m *PersistentVolumeStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -50131,10 +49806,7 @@ func (m *PhotonPersistentDiskVolumeSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -50283,10 +49955,7 @@ func (m *Pod) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -50404,10 +50073,7 @@ func (m *PodAffinity) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -50551,16 +50217,49 @@ func (m *PodAffinityTerm) Unmarshal(dAtA []byte) error { } m.TopologyKey = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NamespaceSelector", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.NamespaceSelector == nil { + m.NamespaceSelector = &v1.LabelSelector{} + } + if err := m.NamespaceSelector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -50678,10 +50377,7 @@ func (m *PodAntiAffinity) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -50843,10 +50539,7 @@ func (m *PodAttachOptions) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -51090,10 +50783,7 @@ func (m *PodCondition) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -51241,10 +50931,7 @@ func (m *PodDNSConfig) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -51359,10 +51046,7 @@ func (m *PodDNSConfigOption) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -51556,10 +51240,7 @@ func (m *PodExecOptions) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -51641,10 +51322,7 @@ func (m *PodIP) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -51761,10 +51439,7 @@ func (m *PodList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -52022,10 +51697,7 @@ func (m *PodLogOptions) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -52151,10 +51823,7 @@ func (m *PodPortForwardOptions) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -52236,10 +51905,7 @@ func (m *PodProxyOptions) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -52321,10 +51987,7 @@ func (m *PodReadinessGate) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -52706,10 +52369,7 @@ func (m *PodSecurityContext) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -52795,10 +52455,7 @@ func (m *PodSignature) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -53130,7 +52787,7 @@ func (m *PodSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -53970,7 +53627,7 @@ func (m *PodSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -54076,10 +53733,7 @@ func (m *PodSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -54559,10 +54213,7 @@ func (m *PodStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -54678,10 +54329,7 @@ func (m *PodStatusResult) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -54797,10 +54445,7 @@ func (m *PodTemplate) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -54917,10 +54562,7 @@ func (m *PodTemplateList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -55036,10 +54678,7 @@ func (m *PodTemplateSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -55173,10 +54812,7 @@ func (m *PortStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -55310,10 +54946,7 @@ func (m *PortworxVolumeSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -55396,10 +55029,7 @@ func (m *Preconditions) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -55579,10 +55209,7 @@ func (m *PreferAvoidPodsEntry) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -55684,10 +55311,7 @@ func (m *PreferredSchedulingTerm) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -55859,16 +55483,33 @@ func (m *Probe) Unmarshal(dAtA []byte) error { break } } + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TerminationGracePeriodSeconds", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.TerminationGracePeriodSeconds = &v default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -55972,10 +55613,7 @@ func (m *ProjectedVolumeSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -56205,10 +55843,7 @@ func (m *QuobyteVolumeSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -56506,10 +56141,7 @@ func (m *RBDPersistentVolumeSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -56807,10 +56439,7 @@ func (m *RBDVolumeSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -56959,10 +56588,7 @@ func (m *RangeAllocation) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -57111,10 +56737,7 @@ func (m *ReplicationController) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -57325,10 +56948,7 @@ func (m *ReplicationControllerCondition) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -57445,10 +57065,7 @@ func (m *ReplicationControllerList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -57628,7 +57245,7 @@ func (m *ReplicationControllerSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -57700,10 +57317,7 @@ func (m *ReplicationControllerSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -57882,10 +57496,7 @@ func (m *ReplicationControllerStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -58032,10 +57643,7 @@ func (m *ResourceFieldSelector) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -58184,10 +57792,7 @@ func (m *ResourceQuota) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -58304,10 +57909,7 @@ func (m *ResourceQuotaList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -58469,7 +58071,7 @@ func (m *ResourceQuotaSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -58554,10 +58156,7 @@ func (m *ResourceQuotaSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -58719,7 +58318,7 @@ func (m *ResourceQuotaStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -58848,7 +58447,7 @@ func (m *ResourceQuotaStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -58865,10 +58464,7 @@ func (m *ResourceQuotaStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -59030,7 +58626,7 @@ func (m *ResourceRequirements) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -59159,7 +58755,7 @@ func (m *ResourceRequirements) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -59176,10 +58772,7 @@ func (m *ResourceRequirements) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -59357,10 +58950,7 @@ func (m *SELinuxOptions) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -59710,10 +59300,7 @@ func (m *ScaleIOPersistentVolumeSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -60063,10 +59650,7 @@ func (m *ScaleIOVolumeSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -60150,10 +59734,7 @@ func (m *ScopeSelector) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -60299,10 +59880,7 @@ func (m *ScopedResourceSelectorRequirement) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -60417,10 +59995,7 @@ func (m *SeccompProfile) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -60614,7 +60189,7 @@ func (m *Secret) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -60773,7 +60348,7 @@ func (m *Secret) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -60811,10 +60386,7 @@ func (m *Secret) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -60918,10 +60490,7 @@ func (m *SecretEnvSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -61057,10 +60626,7 @@ func (m *SecretKeySelector) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -61177,10 +60743,7 @@ func (m *SecretList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -61318,10 +60881,7 @@ func (m *SecretProjection) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -61435,10 +60995,7 @@ func (m *SecretReference) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -61595,10 +61152,7 @@ func (m *SecretVolumeSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -61949,10 +61503,7 @@ func (m *SecurityContext) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -62035,10 +61586,7 @@ func (m *SerializedReference) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -62187,10 +61735,7 @@ func (m *Service) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -62362,10 +61907,7 @@ func (m *ServiceAccount) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -62482,10 +62024,7 @@ func (m *ServiceAccountList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -62619,10 +62158,7 @@ func (m *ServiceAccountTokenProjection) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -62739,10 +62275,7 @@ func (m *ServiceList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -62960,10 +62493,7 @@ func (m *ServicePort) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -63045,10 +62575,7 @@ func (m *ServiceProxyOptions) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -63242,7 +62769,7 @@ func (m *ServiceSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -63734,16 +63261,79 @@ func (m *ServiceSpec) Unmarshal(dAtA []byte) error { } b := bool(v != 0) m.AllocateLoadBalancerNodePorts = &b + case 21: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LoadBalancerClass", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.LoadBalancerClass = &s + iNdEx = postIndex + case 22: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field InternalTrafficPolicy", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := ServiceInternalTrafficPolicyType(dAtA[iNdEx:postIndex]) + m.InternalTrafficPolicy = &s + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -63860,10 +63450,7 @@ func (m *ServiceStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -63949,10 +63536,7 @@ func (m *SessionAffinityConfig) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -64154,10 +63738,7 @@ func (m *StorageOSPersistentVolumeSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -64359,10 +63940,7 @@ func (m *StorageOSVolumeSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -64476,10 +64054,7 @@ func (m *Sysctl) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -64594,10 +64169,7 @@ func (m *TCPSocketAction) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -64779,10 +64351,7 @@ func (m *Taint) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -64980,10 +64549,7 @@ func (m *Toleration) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -65097,10 +64663,7 @@ func (m *TopologySelectorLabelRequirement) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -65184,10 +64747,7 @@ func (m *TopologySelectorTerm) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -65356,10 +64916,7 @@ func (m *TopologySpreadConstraint) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -65506,10 +65063,7 @@ func (m *TypedLocalObjectReference) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -65624,10 +65178,7 @@ func (m *Volume) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -65741,10 +65292,7 @@ func (m *VolumeDevice) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -65975,10 +65523,7 @@ func (m *VolumeMount) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -66064,10 +65609,7 @@ func (m *VolumeNodeAffinity) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -66261,10 +65803,7 @@ func (m *VolumeProjection) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -67358,10 +66897,7 @@ func (m *VolumeSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -67539,10 +67075,7 @@ func (m *VsphereVirtualDiskVolumeSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -67644,10 +67177,7 @@ func (m *WeightedPodAffinityTerm) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -67796,10 +67326,7 @@ func (m *WindowsSecurityContextOptions) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/api/core/v1/generated.proto b/vendor/k8s.io/api/core/v1/generated.proto index 3a13c53fa385..152ea29fd05b 100644 --- a/vendor/k8s.io/api/core/v1/generated.proto +++ b/vendor/k8s.io/api/core/v1/generated.proto @@ -461,7 +461,6 @@ message ConfigMap { // be updated (only object metadata can be modified). // If not set to true, the field can be modified at any time. // Defaulted to nil. - // This is a beta field enabled by ImmutableEphemeralVolumes feature gate. // +optional optional bool immutable = 4; @@ -681,7 +680,7 @@ message Container { // Compute Resources required by this container. // Cannot be updated. - // More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/ + // More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ // +optional optional ResourceRequirements resources = 8; @@ -1397,11 +1396,6 @@ message EphemeralVolumeSource { // // Required, must not be nil. optional PersistentVolumeClaimTemplate volumeClaimTemplate = 1; - - // Specifies a read-only configuration for the volume. - // Defaults to false (read/write). - // +optional - optional bool readOnly = 2; } // Event is a report of an event somewhere in the cluster. Events @@ -2004,7 +1998,7 @@ message LimitRangeList { optional k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; // Items is a list of LimitRange objects. - // More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/ + // More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ repeated LimitRange items = 2; } @@ -3011,8 +3005,10 @@ message PodAffinityTerm { // +optional optional k8s.io.apimachinery.pkg.apis.meta.v1.LabelSelector labelSelector = 1; - // namespaces specifies which namespaces the labelSelector applies to (matches against); - // null or empty list means "this pod's namespace" + // namespaces specifies a static list of namespace names that the term applies to. + // The term is applied to the union of the namespaces listed in this field + // and the ones selected by namespaceSelector. + // null or empty namespaces list and null namespaceSelector means "this pod's namespace" // +optional repeated string namespaces = 2; @@ -3022,6 +3018,15 @@ message PodAffinityTerm { // selected pods is running. // Empty topologyKey is not allowed. optional string topologyKey = 3; + + // A label query over the set of namespaces that the term applies to. + // The term is applied to the union of the namespaces selected by this field + // and the ones listed in the namespaces field. + // null selector and null or empty namespaces list means "this pod's namespace". + // An empty selector ({}) matches all namespaces. + // This field is alpha-level and is only honored when PodAffinityNamespaceSelector feature is enabled. + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.LabelSelector namespaceSelector = 4; } // Pod anti affinity is a group of inter pod anti affinity scheduling rules. @@ -3416,7 +3421,8 @@ message PodSpec { optional string restartPolicy = 3; // Optional duration in seconds the pod needs to terminate gracefully. May be decreased in delete request. - // Value must be non-negative integer. The value zero indicates delete immediately. + // Value must be non-negative integer. The value zero indicates stop immediately via + // the kill signal (no opportunity to shut down). // If this value is nil, the default grace period will be used instead. // The grace period is the duration in seconds after the processes running in the pod are sent // a termination signal and the time when the processes are forcibly halted with a kill signal. @@ -3878,6 +3884,18 @@ message Probe { // Defaults to 3. Minimum value is 1. // +optional optional int32 failureThreshold = 6; + + // Optional duration in seconds the pod needs to terminate gracefully upon probe failure. + // The grace period is the duration in seconds after the processes running in the pod are sent + // a termination signal and the time when the processes are forcibly halted with a kill signal. + // Set this value longer than the expected cleanup time for your process. + // If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this + // value overrides the value provided by the pod spec. + // Value must be non-negative integer. The value zero indicates stop immediately via + // the kill signal (no opportunity to shut down). + // This is an alpha field and requires enabling ProbeTerminationGracePeriod feature gate. + // +optional + optional int64 terminationGracePeriodSeconds = 7; } // Represents a projected volume source @@ -4237,14 +4255,14 @@ message ResourceQuotaStatus { // ResourceRequirements describes the compute resource requirements. message ResourceRequirements { // Limits describes the maximum amount of compute resources allowed. - // More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/ + // More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ // +optional map limits = 1; // Requests describes the minimum amount of compute resources required. // If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, // otherwise to an implementation-defined value. - // More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/ + // More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ // +optional map requests = 2; } @@ -4419,7 +4437,6 @@ message Secret { // be updated (only object metadata can be modified). // If not set to true, the field can be modified at any time. // Defaulted to nil. - // This is a beta field enabled by ImmutableEphemeralVolumes feature gate. // +optional optional bool immutable = 5; @@ -4431,9 +4448,9 @@ message Secret { map data = 2; // stringData allows specifying non-binary secret data in string form. - // It is provided as a write-only convenience method. + // It is provided as a write-only input field for convenience. // All keys and values are merged into the data field on write, overwriting any existing values. - // It is never output when reading from the API. + // The stringData field is never output when reading from the API. // +k8s:conversion-gen=false // +optional map stringData = 4; @@ -4753,6 +4770,7 @@ message ServicePort { // The IP protocol for this port. Supports "TCP", "UDP", and "SCTP". // Default is TCP. + // +default="TCP" // +optional optional string protocol = 2; @@ -4926,7 +4944,7 @@ message ServiceSpec { // externalName is the external reference that discovery mechanisms will // return as an alias for this service (e.g. a DNS CNAME record). No // proxying will be involved. Must be a lowercase RFC-1123 hostname - // (https://tools.ietf.org/html/rfc1123) and requires Type to be + // (https://tools.ietf.org/html/rfc1123) and requires `type` to be "ExternalName". // +optional optional string externalName = 10; @@ -4979,6 +4997,7 @@ message ServiceSpec { // value, if used, only makes sense as the last value in the list. // If this is not specified or empty, no topology constraints will be applied. // This field is alpha-level and is only honored by servers that enable the ServiceTopology feature. + // This field is deprecated and will be removed in a future version. // +optional repeated string topologyKeys = 16; @@ -5023,6 +5042,30 @@ message ServiceSpec { // This field is alpha-level and is only honored by servers that enable the ServiceLBNodePortControl feature. // +optional optional bool allocateLoadBalancerNodePorts = 20; + + // loadBalancerClass is the class of the load balancer implementation this Service belongs to. + // If specified, the value of this field must be a label-style identifier, with an optional prefix, + // e.g. "internal-vip" or "example.com/internal-vip". Unprefixed names are reserved for end-users. + // This field can only be set when the Service type is 'LoadBalancer'. If not set, the default load + // balancer implementation is used, today this is typically done through the cloud provider integration, + // but should apply for any default implementation. If set, it is assumed that a load balancer + // implementation is watching for Services with a matching class. Any default load balancer + // implementation (e.g. cloud providers) should ignore Services that set this field. + // This field can only be set when creating or updating a Service to type 'LoadBalancer'. + // Once set, it can not be changed. This field will be wiped when a service is updated to a non 'LoadBalancer' type. + // +featureGate=LoadBalancerClass + // +optional + optional string loadBalancerClass = 21; + + // InternalTrafficPolicy specifies if the cluster internal traffic + // should be routed to all endpoints or node-local endpoints only. + // "Cluster" routes internal traffic to a Service to all endpoints. + // "Local" routes traffic to node-local endpoints only, traffic is + // dropped if no node-local endpoints are ready. + // The default value is "Cluster". + // +featureGate=ServiceInternalTrafficPolicy + // +optional + optional string internalTrafficPolicy = 22; } // ServiceStatus represents the current status of a service. @@ -5502,7 +5545,7 @@ message VolumeSource { // +optional optional CSIVolumeSource csi = 28; - // Ephemeral represents a volume that is handled by a cluster storage driver (Alpha feature). + // Ephemeral represents a volume that is handled by a cluster storage driver. // The volume's lifecycle is tied to the pod that defines it - it will be created before the pod starts, // and deleted when the pod is removed. // @@ -5527,6 +5570,9 @@ message VolumeSource { // A pod can use both types of ephemeral volumes and // persistent volumes at the same time. // + // This is a beta feature and only available when the GenericEphemeralVolume + // feature gate is enabled. + // // +optional optional EphemeralVolumeSource ephemeral = 29; } diff --git a/vendor/k8s.io/api/core/v1/types.go b/vendor/k8s.io/api/core/v1/types.go index 2bba97251925..3eadb45674c9 100644 --- a/vendor/k8s.io/api/core/v1/types.go +++ b/vendor/k8s.io/api/core/v1/types.go @@ -156,7 +156,7 @@ type VolumeSource struct { // CSI (Container Storage Interface) represents ephemeral storage that is handled by certain external CSI drivers (Beta feature). // +optional CSI *CSIVolumeSource `json:"csi,omitempty" protobuf:"bytes,28,opt,name=csi"` - // Ephemeral represents a volume that is handled by a cluster storage driver (Alpha feature). + // Ephemeral represents a volume that is handled by a cluster storage driver. // The volume's lifecycle is tied to the pod that defines it - it will be created before the pod starts, // and deleted when the pod is removed. // @@ -181,6 +181,9 @@ type VolumeSource struct { // A pod can use both types of ephemeral volumes and // persistent volumes at the same time. // + // This is a beta feature and only available when the GenericEphemeralVolume + // feature gate is enabled. + // // +optional Ephemeral *EphemeralVolumeSource `json:"ephemeral,omitempty" protobuf:"bytes,29,opt,name=ephemeral"` } @@ -1795,10 +1798,8 @@ type EphemeralVolumeSource struct { // Required, must not be nil. VolumeClaimTemplate *PersistentVolumeClaimTemplate `json:"volumeClaimTemplate,omitempty" protobuf:"bytes,1,opt,name=volumeClaimTemplate"` - // Specifies a read-only configuration for the volume. - // Defaults to false (read/write). - // +optional - ReadOnly bool `json:"readOnly,omitempty" protobuf:"varint,2,opt,name=readOnly"` + // ReadOnly is tombstoned to show why 2 is a reserved protobuf tag. + // ReadOnly bool `json:"readOnly,omitempty" protobuf:"varint,2,opt,name=readOnly"` } // PersistentVolumeClaimTemplate is used to produce @@ -2116,6 +2117,17 @@ type Probe struct { // Defaults to 3. Minimum value is 1. // +optional FailureThreshold int32 `json:"failureThreshold,omitempty" protobuf:"varint,6,opt,name=failureThreshold"` + // Optional duration in seconds the pod needs to terminate gracefully upon probe failure. + // The grace period is the duration in seconds after the processes running in the pod are sent + // a termination signal and the time when the processes are forcibly halted with a kill signal. + // Set this value longer than the expected cleanup time for your process. + // If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this + // value overrides the value provided by the pod spec. + // Value must be non-negative integer. The value zero indicates stop immediately via + // the kill signal (no opportunity to shut down). + // This is an alpha field and requires enabling ProbeTerminationGracePeriod feature gate. + // +optional + TerminationGracePeriodSeconds *int64 `json:"terminationGracePeriodSeconds,omitempty" protobuf:"varint,7,opt,name=terminationGracePeriodSeconds"` } // PullPolicy describes a policy for if/when to pull a container image @@ -2169,13 +2181,13 @@ type Capabilities struct { // ResourceRequirements describes the compute resource requirements. type ResourceRequirements struct { // Limits describes the maximum amount of compute resources allowed. - // More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/ + // More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ // +optional Limits ResourceList `json:"limits,omitempty" protobuf:"bytes,1,rep,name=limits,casttype=ResourceList,castkey=ResourceName"` // Requests describes the minimum amount of compute resources required. // If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, // otherwise to an implementation-defined value. - // More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/ + // More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ // +optional Requests ResourceList `json:"requests,omitempty" protobuf:"bytes,2,rep,name=requests,casttype=ResourceList,castkey=ResourceName"` } @@ -2253,7 +2265,7 @@ type Container struct { Env []EnvVar `json:"env,omitempty" patchStrategy:"merge" patchMergeKey:"name" protobuf:"bytes,7,rep,name=env"` // Compute Resources required by this container. // Cannot be updated. - // More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/ + // More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ // +optional Resources ResourceRequirements `json:"resources,omitempty" protobuf:"bytes,8,opt,name=resources"` // Pod volumes to mount into the container's filesystem. @@ -2774,8 +2786,10 @@ type PodAffinityTerm struct { // A label query over a set of resources, in this case pods. // +optional LabelSelector *metav1.LabelSelector `json:"labelSelector,omitempty" protobuf:"bytes,1,opt,name=labelSelector"` - // namespaces specifies which namespaces the labelSelector applies to (matches against); - // null or empty list means "this pod's namespace" + // namespaces specifies a static list of namespace names that the term applies to. + // The term is applied to the union of the namespaces listed in this field + // and the ones selected by namespaceSelector. + // null or empty namespaces list and null namespaceSelector means "this pod's namespace" // +optional Namespaces []string `json:"namespaces,omitempty" protobuf:"bytes,2,rep,name=namespaces"` // This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching @@ -2784,6 +2798,14 @@ type PodAffinityTerm struct { // selected pods is running. // Empty topologyKey is not allowed. TopologyKey string `json:"topologyKey" protobuf:"bytes,3,opt,name=topologyKey"` + // A label query over the set of namespaces that the term applies to. + // The term is applied to the union of the namespaces selected by this field + // and the ones listed in the namespaces field. + // null selector and null or empty namespaces list means "this pod's namespace". + // An empty selector ({}) matches all namespaces. + // This field is alpha-level and is only honored when PodAffinityNamespaceSelector feature is enabled. + // +optional + NamespaceSelector *metav1.LabelSelector `json:"namespaceSelector,omitempty" protobuf:"bytes,4,opt,name=namespaceSelector"` } // Node affinity is a group of node affinity scheduling rules. @@ -2957,7 +2979,8 @@ type PodSpec struct { // +optional RestartPolicy RestartPolicy `json:"restartPolicy,omitempty" protobuf:"bytes,3,opt,name=restartPolicy,casttype=RestartPolicy"` // Optional duration in seconds the pod needs to terminate gracefully. May be decreased in delete request. - // Value must be non-negative integer. The value zero indicates delete immediately. + // Value must be non-negative integer. The value zero indicates stop immediately via + // the kill signal (no opportunity to shut down). // If this value is nil, the default grace period will be used instead. // The grace period is the duration in seconds after the processes running in the pod are sent // a termination signal and the time when the processes are forcibly halted with a kill signal. @@ -3930,6 +3953,19 @@ const ( ServiceTypeExternalName ServiceType = "ExternalName" ) +// ServiceInternalTrafficPolicyType describes the type of traffic routing for +// internal traffic +type ServiceInternalTrafficPolicyType string + +const ( + // ServiceInternalTrafficPolicyCluster routes traffic to all endpoints + ServiceInternalTrafficPolicyCluster ServiceInternalTrafficPolicyType = "Cluster" + + // ServiceInternalTrafficPolicyLocal only routes to node-local + // endpoints, otherwise drops the traffic + ServiceInternalTrafficPolicyLocal ServiceInternalTrafficPolicyType = "Local" +) + // Service External Traffic Policy Type string type ServiceExternalTrafficPolicyType string @@ -4150,7 +4186,7 @@ type ServiceSpec struct { // externalName is the external reference that discovery mechanisms will // return as an alias for this service (e.g. a DNS CNAME record). No // proxying will be involved. Must be a lowercase RFC-1123 hostname - // (https://tools.ietf.org/html/rfc1123) and requires Type to be + // (https://tools.ietf.org/html/rfc1123) and requires `type` to be "ExternalName". // +optional ExternalName string `json:"externalName,omitempty" protobuf:"bytes,10,opt,name=externalName"` @@ -4203,6 +4239,7 @@ type ServiceSpec struct { // value, if used, only makes sense as the last value in the list. // If this is not specified or empty, no topology constraints will be applied. // This field is alpha-level and is only honored by servers that enable the ServiceTopology feature. + // This field is deprecated and will be removed in a future version. // +optional TopologyKeys []string `json:"topologyKeys,omitempty" protobuf:"bytes,16,opt,name=topologyKeys"` @@ -4250,6 +4287,30 @@ type ServiceSpec struct { // This field is alpha-level and is only honored by servers that enable the ServiceLBNodePortControl feature. // +optional AllocateLoadBalancerNodePorts *bool `json:"allocateLoadBalancerNodePorts,omitempty" protobuf:"bytes,20,opt,name=allocateLoadBalancerNodePorts"` + + // loadBalancerClass is the class of the load balancer implementation this Service belongs to. + // If specified, the value of this field must be a label-style identifier, with an optional prefix, + // e.g. "internal-vip" or "example.com/internal-vip". Unprefixed names are reserved for end-users. + // This field can only be set when the Service type is 'LoadBalancer'. If not set, the default load + // balancer implementation is used, today this is typically done through the cloud provider integration, + // but should apply for any default implementation. If set, it is assumed that a load balancer + // implementation is watching for Services with a matching class. Any default load balancer + // implementation (e.g. cloud providers) should ignore Services that set this field. + // This field can only be set when creating or updating a Service to type 'LoadBalancer'. + // Once set, it can not be changed. This field will be wiped when a service is updated to a non 'LoadBalancer' type. + // +featureGate=LoadBalancerClass + // +optional + LoadBalancerClass *string `json:"loadBalancerClass,omitempty" protobuf:"bytes,21,opt,name=loadBalancerClass"` + + // InternalTrafficPolicy specifies if the cluster internal traffic + // should be routed to all endpoints or node-local endpoints only. + // "Cluster" routes internal traffic to a Service to all endpoints. + // "Local" routes traffic to node-local endpoints only, traffic is + // dropped if no node-local endpoints are ready. + // The default value is "Cluster". + // +featureGate=ServiceInternalTrafficPolicy + // +optional + InternalTrafficPolicy *ServiceInternalTrafficPolicyType `json:"internalTrafficPolicy,omitempty" protobuf:"bytes,22,opt,name=internalTrafficPolicy"` } // ServicePort contains information on service's port. @@ -4264,6 +4325,7 @@ type ServicePort struct { // The IP protocol for this port. Supports "TCP", "UDP", and "SCTP". // Default is TCP. + // +default="TCP" // +optional Protocol Protocol `json:"protocol,omitempty" protobuf:"bytes,2,opt,name=protocol,casttype=Protocol"` @@ -5560,7 +5622,7 @@ type LimitRangeList struct { metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` // Items is a list of LimitRange objects. - // More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/ + // More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ Items []LimitRange `json:"items" protobuf:"bytes,2,rep,name=items"` } @@ -5613,9 +5675,9 @@ const ( type ResourceQuotaScope string const ( - // Match all pod objects where spec.activeDeadlineSeconds + // Match all pod objects where spec.activeDeadlineSeconds >=0 ResourceQuotaScopeTerminating ResourceQuotaScope = "Terminating" - // Match all pod objects where !spec.activeDeadlineSeconds + // Match all pod objects where spec.activeDeadlineSeconds is nil ResourceQuotaScopeNotTerminating ResourceQuotaScope = "NotTerminating" // Match all pod objects that have best effort quality of service ResourceQuotaScopeBestEffort ResourceQuotaScope = "BestEffort" @@ -5623,6 +5685,9 @@ const ( ResourceQuotaScopeNotBestEffort ResourceQuotaScope = "NotBestEffort" // Match all pod objects that have priority class mentioned ResourceQuotaScopePriorityClass ResourceQuotaScope = "PriorityClass" + // Match all pod objects that have cross-namespace pod (anti)affinity mentioned. + // This is an alpha feature enabled by the PodAffinityNamespaceSelector feature flag. + ResourceQuotaScopeCrossNamespacePodAffinity ResourceQuotaScope = "CrossNamespacePodAffinity" ) // ResourceQuotaSpec defines the desired hard limits to enforce for Quota. @@ -5741,7 +5806,6 @@ type Secret struct { // be updated (only object metadata can be modified). // If not set to true, the field can be modified at any time. // Defaulted to nil. - // This is a beta field enabled by ImmutableEphemeralVolumes feature gate. // +optional Immutable *bool `json:"immutable,omitempty" protobuf:"varint,5,opt,name=immutable"` @@ -5753,9 +5817,9 @@ type Secret struct { Data map[string][]byte `json:"data,omitempty" protobuf:"bytes,2,rep,name=data"` // stringData allows specifying non-binary secret data in string form. - // It is provided as a write-only convenience method. + // It is provided as a write-only input field for convenience. // All keys and values are merged into the data field on write, overwriting any existing values. - // It is never output when reading from the API. + // The stringData field is never output when reading from the API. // +k8s:conversion-gen=false // +optional StringData map[string]string `json:"stringData,omitempty" protobuf:"bytes,4,rep,name=stringData"` @@ -5882,7 +5946,6 @@ type ConfigMap struct { // be updated (only object metadata can be modified). // If not set to true, the field can be modified at any time. // Defaulted to nil. - // This is a beta field enabled by ImmutableEphemeralVolumes feature gate. // +optional Immutable *bool `json:"immutable,omitempty" protobuf:"varint,4,opt,name=immutable"` @@ -6168,7 +6231,7 @@ type RangeAllocation struct { } const ( - // "default-scheduler" is the name of default scheduler. + // DefaultSchedulerName defines the name of default scheduler. DefaultSchedulerName = "default-scheduler" // RequiredDuringScheduling affinity is not symmetric, but there is an implicit PreferredDuringScheduling affinity rule diff --git a/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go b/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go index c58d8ac56635..0892b9b5ecbb 100644 --- a/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go @@ -252,7 +252,7 @@ func (ComponentStatusList) SwaggerDoc() map[string]string { var map_ConfigMap = map[string]string{ "": "ConfigMap holds configuration data for pods to consume.", "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", - "immutable": "Immutable, if set to true, ensures that data stored in the ConfigMap cannot be updated (only object metadata can be modified). If not set to true, the field can be modified at any time. Defaulted to nil. This is a beta field enabled by ImmutableEphemeralVolumes feature gate.", + "immutable": "Immutable, if set to true, ensures that data stored in the ConfigMap cannot be updated (only object metadata can be modified). If not set to true, the field can be modified at any time. Defaulted to nil.", "data": "Data contains the configuration data. Each key must consist of alphanumeric characters, '-', '_' or '.'. Values with non-UTF-8 byte sequences must use the BinaryData field. The keys stored in Data must not overlap with the keys in the BinaryData field, this is enforced during validation process.", "binaryData": "BinaryData contains the binary data. Each key must consist of alphanumeric characters, '-', '_' or '.'. BinaryData can contain byte sequences that are not in the UTF-8 range. The keys stored in BinaryData must not overlap with the ones in the Data field, this is enforced during validation process. Using this field will require 1.10+ apiserver and kubelet.", } @@ -334,7 +334,7 @@ var map_Container = map[string]string{ "ports": "List of ports to expose from the container. Exposing a port here gives the system additional information about the network connections a container uses, but is primarily informational. Not specifying a port here DOES NOT prevent that port from being exposed. Any port which is listening on the default \"0.0.0.0\" address inside a container will be accessible from the network. Cannot be updated.", "envFrom": "List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", "env": "List of environment variables to set in the container. Cannot be updated.", - "resources": "Compute Resources required by this container. Cannot be updated. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/", + "resources": "Compute Resources required by this container. Cannot be updated. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/", "volumeMounts": "Pod volumes to mount into the container's filesystem. Cannot be updated.", "volumeDevices": "volumeDevices is the list of block devices to be used by the container.", "livenessProbe": "Periodic probe of container liveness. Container will be restarted if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes", @@ -629,7 +629,6 @@ func (EphemeralContainers) SwaggerDoc() map[string]string { var map_EphemeralVolumeSource = map[string]string{ "": "Represents an ephemeral volume that is handled by a normal storage driver.", "volumeClaimTemplate": "Will be used to create a stand-alone PVC to provision the volume. The pod in which this EphemeralVolumeSource is embedded will be the owner of the PVC, i.e. the PVC will be deleted together with the pod. The name of the PVC will be `-` where `` is the name from the `PodSpec.Volumes` array entry. Pod validation will reject the pod if the concatenated name is not valid for a PVC (for example, too long).\n\nAn existing PVC with that name that is not owned by the pod will *not* be used for the pod to avoid using an unrelated volume by mistake. Starting the pod is then blocked until the unrelated PVC is removed. If such a pre-created PVC is meant to be used by the pod, the PVC has to updated with an owner reference to the pod once the pod exists. Normally this should not be necessary, but it may be useful when manually reconstructing a broken cluster.\n\nThis field is read-only and no changes will be made by Kubernetes to the PVC after it has been created.\n\nRequired, must not be nil.", - "readOnly": "Specifies a read-only configuration for the volume. Defaults to false (read/write).", } func (EphemeralVolumeSource) SwaggerDoc() map[string]string { @@ -933,7 +932,7 @@ func (LimitRangeItem) SwaggerDoc() map[string]string { var map_LimitRangeList = map[string]string{ "": "LimitRangeList is a list of LimitRange items.", "metadata": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", - "items": "Items is a list of LimitRange objects. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/", + "items": "Items is a list of LimitRange objects. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/", } func (LimitRangeList) SwaggerDoc() map[string]string { @@ -1449,10 +1448,11 @@ func (PodAffinity) SwaggerDoc() map[string]string { } var map_PodAffinityTerm = map[string]string{ - "": "Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key matches that of any node on which a pod of the set of pods is running", - "labelSelector": "A label query over a set of resources, in this case pods.", - "namespaces": "namespaces specifies which namespaces the labelSelector applies to (matches against); null or empty list means \"this pod's namespace\"", - "topologyKey": "This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.", + "": "Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key matches that of any node on which a pod of the set of pods is running", + "labelSelector": "A label query over a set of resources, in this case pods.", + "namespaces": "namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means \"this pod's namespace\"", + "topologyKey": "This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.", + "namespaceSelector": "A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means \"this pod's namespace\". An empty selector ({}) matches all namespaces. This field is alpha-level and is only honored when PodAffinityNamespaceSelector feature is enabled.", } func (PodAffinityTerm) SwaggerDoc() map[string]string { @@ -1627,7 +1627,7 @@ var map_PodSpec = map[string]string{ "containers": "List of containers belonging to the pod. Containers cannot currently be added or removed. There must be at least one container in a Pod. Cannot be updated.", "ephemeralContainers": "List of ephemeral containers run in this pod. Ephemeral containers may be run in an existing pod to perform user-initiated actions such as debugging. This list cannot be specified when creating a pod, and it cannot be modified by updating the pod spec. In order to add an ephemeral container to an existing pod, use the pod's ephemeralcontainers subresource. This field is alpha-level and is only honored by servers that enable the EphemeralContainers feature.", "restartPolicy": "Restart policy for all containers within the pod. One of Always, OnFailure, Never. Default to Always. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy", - "terminationGracePeriodSeconds": "Optional duration in seconds the pod needs to terminate gracefully. May be decreased in delete request. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period will be used instead. The grace period is the duration in seconds after the processes running in the pod are sent a termination signal and the time when the processes are forcibly halted with a kill signal. Set this value longer than the expected cleanup time for your process. Defaults to 30 seconds.", + "terminationGracePeriodSeconds": "Optional duration in seconds the pod needs to terminate gracefully. May be decreased in delete request. Value must be non-negative integer. The value zero indicates stop immediately via the kill signal (no opportunity to shut down). If this value is nil, the default grace period will be used instead. The grace period is the duration in seconds after the processes running in the pod are sent a termination signal and the time when the processes are forcibly halted with a kill signal. Set this value longer than the expected cleanup time for your process. Defaults to 30 seconds.", "activeDeadlineSeconds": "Optional duration in seconds the pod may be active on the node relative to StartTime before the system will actively try to mark it failed and kill associated containers. Value must be a positive integer.", "dnsPolicy": "Set DNS policy for the pod. Defaults to \"ClusterFirst\". Valid values are 'ClusterFirstWithHostNet', 'ClusterFirst', 'Default' or 'None'. DNS parameters given in DNSConfig will be merged with the policy selected with DNSPolicy. To have DNS options set along with hostNetwork, you have to specify DNS policy explicitly to 'ClusterFirstWithHostNet'.", "nodeSelector": "NodeSelector is a selector which must be true for the pod to fit on a node. Selector which must match a node's labels for the pod to be scheduled on that node. More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/", @@ -1777,12 +1777,13 @@ func (PreferredSchedulingTerm) SwaggerDoc() map[string]string { } var map_Probe = map[string]string{ - "": "Probe describes a health check to be performed against a container to determine whether it is alive or ready to receive traffic.", - "initialDelaySeconds": "Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes", - "timeoutSeconds": "Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes", - "periodSeconds": "How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1.", - "successThreshold": "Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.", - "failureThreshold": "Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1.", + "": "Probe describes a health check to be performed against a container to determine whether it is alive or ready to receive traffic.", + "initialDelaySeconds": "Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes", + "timeoutSeconds": "Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes", + "periodSeconds": "How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1.", + "successThreshold": "Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.", + "failureThreshold": "Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1.", + "terminationGracePeriodSeconds": "Optional duration in seconds the pod needs to terminate gracefully upon probe failure. The grace period is the duration in seconds after the processes running in the pod are sent a termination signal and the time when the processes are forcibly halted with a kill signal. Set this value longer than the expected cleanup time for your process. If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this value overrides the value provided by the pod spec. Value must be non-negative integer. The value zero indicates stop immediately via the kill signal (no opportunity to shut down). This is an alpha field and requires enabling ProbeTerminationGracePeriod feature gate.", } func (Probe) SwaggerDoc() map[string]string { @@ -1971,8 +1972,8 @@ func (ResourceQuotaStatus) SwaggerDoc() map[string]string { var map_ResourceRequirements = map[string]string{ "": "ResourceRequirements describes the compute resource requirements.", - "limits": "Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/", - "requests": "Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/", + "limits": "Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/", + "requests": "Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/", } func (ResourceRequirements) SwaggerDoc() map[string]string { @@ -2060,9 +2061,9 @@ func (SeccompProfile) SwaggerDoc() map[string]string { var map_Secret = map[string]string{ "": "Secret holds secret data of a certain type. The total bytes of the values in the Data field must be less than MaxSecretSize bytes.", "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", - "immutable": "Immutable, if set to true, ensures that data stored in the Secret cannot be updated (only object metadata can be modified). If not set to true, the field can be modified at any time. Defaulted to nil. This is a beta field enabled by ImmutableEphemeralVolumes feature gate.", + "immutable": "Immutable, if set to true, ensures that data stored in the Secret cannot be updated (only object metadata can be modified). If not set to true, the field can be modified at any time. Defaulted to nil.", "data": "Data contains the secret data. Each key must consist of alphanumeric characters, '-', '_' or '.'. The serialized form of the secret data is a base64 encoded string, representing the arbitrary (possibly non-string) data value here. Described in https://tools.ietf.org/html/rfc4648#section-4", - "stringData": "stringData allows specifying non-binary secret data in string form. It is provided as a write-only convenience method. All keys and values are merged into the data field on write, overwriting any existing values. It is never output when reading from the API.", + "stringData": "stringData allows specifying non-binary secret data in string form. It is provided as a write-only input field for convenience. All keys and values are merged into the data field on write, overwriting any existing values. The stringData field is never output when reading from the API.", "type": "Used to facilitate programmatic handling of secret data.", } @@ -2247,15 +2248,17 @@ var map_ServiceSpec = map[string]string{ "sessionAffinity": "Supports \"ClientIP\" and \"None\". Used to maintain session affinity. Enable client IP based session affinity. Must be ClientIP or None. Defaults to None. More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies", "loadBalancerIP": "Only applies to Service Type: LoadBalancer LoadBalancer will get created with the IP specified in this field. This feature depends on whether the underlying cloud-provider supports specifying the loadBalancerIP when a load balancer is created. This field will be ignored if the cloud-provider does not support the feature.", "loadBalancerSourceRanges": "If specified and supported by the platform, this will restrict traffic through the cloud-provider load-balancer will be restricted to the specified client IPs. This field will be ignored if the cloud-provider does not support the feature.\" More info: https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/", - "externalName": "externalName is the external reference that discovery mechanisms will return as an alias for this service (e.g. a DNS CNAME record). No proxying will be involved. Must be a lowercase RFC-1123 hostname (https://tools.ietf.org/html/rfc1123) and requires Type to be", + "externalName": "externalName is the external reference that discovery mechanisms will return as an alias for this service (e.g. a DNS CNAME record). No proxying will be involved. Must be a lowercase RFC-1123 hostname (https://tools.ietf.org/html/rfc1123) and requires `type` to be \"ExternalName\".", "externalTrafficPolicy": "externalTrafficPolicy denotes if this Service desires to route external traffic to node-local or cluster-wide endpoints. \"Local\" preserves the client source IP and avoids a second hop for LoadBalancer and Nodeport type services, but risks potentially imbalanced traffic spreading. \"Cluster\" obscures the client source IP and may cause a second hop to another node, but should have good overall load-spreading.", "healthCheckNodePort": "healthCheckNodePort specifies the healthcheck nodePort for the service. This only applies when type is set to LoadBalancer and externalTrafficPolicy is set to Local. If a value is specified, is in-range, and is not in use, it will be used. If not specified, a value will be automatically allocated. External systems (e.g. load-balancers) can use this port to determine if a given node holds endpoints for this service or not. If this field is specified when creating a Service which does not need it, creation will fail. This field will be wiped when updating a Service to no longer need it (e.g. changing type).", "publishNotReadyAddresses": "publishNotReadyAddresses indicates that any agent which deals with endpoints for this Service should disregard any indications of ready/not-ready. The primary use case for setting this field is for a StatefulSet's Headless Service to propagate SRV DNS records for its Pods for the purpose of peer discovery. The Kubernetes controllers that generate Endpoints and EndpointSlice resources for Services interpret this to mean that all endpoints are considered \"ready\" even if the Pods themselves are not. Agents which consume only Kubernetes generated endpoints through the Endpoints or EndpointSlice resources can safely assume this behavior.", "sessionAffinityConfig": "sessionAffinityConfig contains the configurations of session affinity.", - "topologyKeys": "topologyKeys is a preference-order list of topology keys which implementations of services should use to preferentially sort endpoints when accessing this Service, it can not be used at the same time as externalTrafficPolicy=Local. Topology keys must be valid label keys and at most 16 keys may be specified. Endpoints are chosen based on the first topology key with available backends. If this field is specified and all entries have no backends that match the topology of the client, the service has no backends for that client and connections should fail. The special value \"*\" may be used to mean \"any topology\". This catch-all value, if used, only makes sense as the last value in the list. If this is not specified or empty, no topology constraints will be applied. This field is alpha-level and is only honored by servers that enable the ServiceTopology feature.", + "topologyKeys": "topologyKeys is a preference-order list of topology keys which implementations of services should use to preferentially sort endpoints when accessing this Service, it can not be used at the same time as externalTrafficPolicy=Local. Topology keys must be valid label keys and at most 16 keys may be specified. Endpoints are chosen based on the first topology key with available backends. If this field is specified and all entries have no backends that match the topology of the client, the service has no backends for that client and connections should fail. The special value \"*\" may be used to mean \"any topology\". This catch-all value, if used, only makes sense as the last value in the list. If this is not specified or empty, no topology constraints will be applied. This field is alpha-level and is only honored by servers that enable the ServiceTopology feature. This field is deprecated and will be removed in a future version.", "ipFamilies": "IPFamilies is a list of IP families (e.g. IPv4, IPv6) assigned to this service, and is gated by the \"IPv6DualStack\" feature gate. This field is usually assigned automatically based on cluster configuration and the ipFamilyPolicy field. If this field is specified manually, the requested family is available in the cluster, and ipFamilyPolicy allows it, it will be used; otherwise creation of the service will fail. This field is conditionally mutable: it allows for adding or removing a secondary IP family, but it does not allow changing the primary IP family of the Service. Valid values are \"IPv4\" and \"IPv6\". This field only applies to Services of types ClusterIP, NodePort, and LoadBalancer, and does apply to \"headless\" services. This field will be wiped when updating a Service to type ExternalName.\n\nThis field may hold a maximum of two entries (dual-stack families, in either order). These families must correspond to the values of the clusterIPs field, if specified. Both clusterIPs and ipFamilies are governed by the ipFamilyPolicy field.", "ipFamilyPolicy": "IPFamilyPolicy represents the dual-stack-ness requested or required by this Service, and is gated by the \"IPv6DualStack\" feature gate. If there is no value provided, then this field will be set to SingleStack. Services can be \"SingleStack\" (a single IP family), \"PreferDualStack\" (two IP families on dual-stack configured clusters or a single IP family on single-stack clusters), or \"RequireDualStack\" (two IP families on dual-stack configured clusters, otherwise fail). The ipFamilies and clusterIPs fields depend on the value of this field. This field will be wiped when updating a service to type ExternalName.", "allocateLoadBalancerNodePorts": "allocateLoadBalancerNodePorts defines if NodePorts will be automatically allocated for services with type LoadBalancer. Default is \"true\". It may be set to \"false\" if the cluster load-balancer does not rely on NodePorts. allocateLoadBalancerNodePorts may only be set for services with type LoadBalancer and will be cleared if the type is changed to any other type. This field is alpha-level and is only honored by servers that enable the ServiceLBNodePortControl feature.", + "loadBalancerClass": "loadBalancerClass is the class of the load balancer implementation this Service belongs to. If specified, the value of this field must be a label-style identifier, with an optional prefix, e.g. \"internal-vip\" or \"example.com/internal-vip\". Unprefixed names are reserved for end-users. This field can only be set when the Service type is 'LoadBalancer'. If not set, the default load balancer implementation is used, today this is typically done through the cloud provider integration, but should apply for any default implementation. If set, it is assumed that a load balancer implementation is watching for Services with a matching class. Any default load balancer implementation (e.g. cloud providers) should ignore Services that set this field. This field can only be set when creating or updating a Service to type 'LoadBalancer'. Once set, it can not be changed. This field will be wiped when a service is updated to a non 'LoadBalancer' type.", + "internalTrafficPolicy": "InternalTrafficPolicy specifies if the cluster internal traffic should be routed to all endpoints or node-local endpoints only. \"Cluster\" routes internal traffic to a Service to all endpoints. \"Local\" routes traffic to node-local endpoints only, traffic is dropped if no node-local endpoints are ready. The default value is \"Cluster\".", } func (ServiceSpec) SwaggerDoc() map[string]string { @@ -2478,7 +2481,7 @@ var map_VolumeSource = map[string]string{ "scaleIO": "ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes.", "storageos": "StorageOS represents a StorageOS volume attached and mounted on Kubernetes nodes.", "csi": "CSI (Container Storage Interface) represents ephemeral storage that is handled by certain external CSI drivers (Beta feature).", - "ephemeral": "Ephemeral represents a volume that is handled by a cluster storage driver (Alpha feature). The volume's lifecycle is tied to the pod that defines it - it will be created before the pod starts, and deleted when the pod is removed.\n\nUse this if: a) the volume is only needed while the pod runs, b) features of normal volumes like restoring from snapshot or capacity\n tracking are needed,\nc) the storage driver is specified through a storage class, and d) the storage driver supports dynamic volume provisioning through\n a PersistentVolumeClaim (see EphemeralVolumeSource for more\n information on the connection between this volume type\n and PersistentVolumeClaim).\n\nUse PersistentVolumeClaim or one of the vendor-specific APIs for volumes that persist for longer than the lifecycle of an individual pod.\n\nUse CSI for light-weight local ephemeral volumes if the CSI driver is meant to be used that way - see the documentation of the driver for more information.\n\nA pod can use both types of ephemeral volumes and persistent volumes at the same time.", + "ephemeral": "Ephemeral represents a volume that is handled by a cluster storage driver. The volume's lifecycle is tied to the pod that defines it - it will be created before the pod starts, and deleted when the pod is removed.\n\nUse this if: a) the volume is only needed while the pod runs, b) features of normal volumes like restoring from snapshot or capacity\n tracking are needed,\nc) the storage driver is specified through a storage class, and d) the storage driver supports dynamic volume provisioning through\n a PersistentVolumeClaim (see EphemeralVolumeSource for more\n information on the connection between this volume type\n and PersistentVolumeClaim).\n\nUse PersistentVolumeClaim or one of the vendor-specific APIs for volumes that persist for longer than the lifecycle of an individual pod.\n\nUse CSI for light-weight local ephemeral volumes if the CSI driver is meant to be used that way - see the documentation of the driver for more information.\n\nA pod can use both types of ephemeral volumes and persistent volumes at the same time.\n\nThis is a beta feature and only available when the GenericEphemeralVolume feature gate is enabled.", } func (VolumeSource) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/api/core/v1/well_known_labels.go b/vendor/k8s.io/api/core/v1/well_known_labels.go index a506f17f65b9..5cf82a981755 100644 --- a/vendor/k8s.io/api/core/v1/well_known_labels.go +++ b/vendor/k8s.io/api/core/v1/well_known_labels.go @@ -19,16 +19,21 @@ package v1 const ( LabelHostname = "kubernetes.io/hostname" - LabelFailureDomainBetaZone = "failure-domain.beta.kubernetes.io/zone" - LabelFailureDomainBetaRegion = "failure-domain.beta.kubernetes.io/region" - LabelTopologyZone = "topology.kubernetes.io/zone" - LabelTopologyRegion = "topology.kubernetes.io/region" + LabelTopologyZone = "topology.kubernetes.io/zone" + LabelTopologyRegion = "topology.kubernetes.io/region" - // Legacy names for compat. - LabelZoneFailureDomain = LabelFailureDomainBetaZone // deprecated, remove after 1.20 - LabelZoneRegion = LabelFailureDomainBetaRegion // deprecated, remove after 1.20 - LabelZoneFailureDomainStable = LabelTopologyZone - LabelZoneRegionStable = LabelTopologyRegion + // These label have been deprecated since 1.17, but will be supported for + // the foreseeable future, to accommodate things like long-lived PVs that + // use them. New users should prefer the "topology.kubernetes.io/*" + // equivalents. + LabelFailureDomainBetaZone = "failure-domain.beta.kubernetes.io/zone" // deprecated + LabelFailureDomainBetaRegion = "failure-domain.beta.kubernetes.io/region" // deprecated + + // Retained for compat when vendored. Do not use these consts in new code. + LabelZoneFailureDomain = LabelFailureDomainBetaZone // deprecated + LabelZoneRegion = LabelFailureDomainBetaRegion // deprecated + LabelZoneFailureDomainStable = LabelTopologyZone // deprecated + LabelZoneRegionStable = LabelTopologyRegion // deprecated LabelInstanceType = "beta.kubernetes.io/instance-type" LabelInstanceTypeStable = "node.kubernetes.io/instance-type" @@ -53,4 +58,13 @@ const ( // controllers and kube-proxy to check if the Endpoint objects should be replicated when // using Headless Services IsHeadlessService = "service.kubernetes.io/headless" + + // LabelNodeExcludeBalancers specifies that the node should not be considered as a target + // for external load-balancers which use nodes as a second hop (e.g. many cloud LBs which only + // understand nodes). For services that use externalTrafficPolicy=Local, this may mean that + // any backends on excluded nodes are not reachable by those external load-balancers. + // Implementations of this exclusion may vary based on provider. + LabelNodeExcludeBalancers = "node.kubernetes.io/exclude-from-external-load-balancers" + // LabelMetadataName is the label name which, in-tree, is used to automatically label namespaces, so they can be selected easily by tools which require definitive labels + LabelMetadataName = "kubernetes.io/metadata.name" ) diff --git a/vendor/k8s.io/api/core/v1/well_known_taints.go b/vendor/k8s.io/api/core/v1/well_known_taints.go index e1a8f6291baf..84d268197c6a 100644 --- a/vendor/k8s.io/api/core/v1/well_known_taints.go +++ b/vendor/k8s.io/api/core/v1/well_known_taints.go @@ -27,7 +27,7 @@ const ( TaintNodeUnreachable = "node.kubernetes.io/unreachable" // TaintNodeUnschedulable will be added when node becomes unschedulable - // and removed when node becomes scheduable. + // and removed when node becomes schedulable. TaintNodeUnschedulable = "node.kubernetes.io/unschedulable" // TaintNodeMemoryPressure will be added when node has memory pressure @@ -43,6 +43,6 @@ const ( TaintNodeNetworkUnavailable = "node.kubernetes.io/network-unavailable" // TaintNodePIDPressure will be added when node has pid pressure - // and removed when node has enough disk. + // and removed when node has enough pid. TaintNodePIDPressure = "node.kubernetes.io/pid-pressure" ) diff --git a/vendor/k8s.io/api/core/v1/zz_generated.deepcopy.go b/vendor/k8s.io/api/core/v1/zz_generated.deepcopy.go index b868f9ba5b95..b60baa665610 100644 --- a/vendor/k8s.io/api/core/v1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/core/v1/zz_generated.deepcopy.go @@ -3360,6 +3360,11 @@ func (in *PodAffinityTerm) DeepCopyInto(out *PodAffinityTerm) { *out = make([]string, len(*in)) copy(*out, *in) } + if in.NamespaceSelector != nil { + in, out := &in.NamespaceSelector, &out.NamespaceSelector + *out = new(metav1.LabelSelector) + (*in).DeepCopyInto(*out) + } return } @@ -4185,6 +4190,11 @@ func (in *PreferredSchedulingTerm) DeepCopy() *PreferredSchedulingTerm { func (in *Probe) DeepCopyInto(out *Probe) { *out = *in in.Handler.DeepCopyInto(&out.Handler) + if in.TerminationGracePeriodSeconds != nil { + in, out := &in.TerminationGracePeriodSeconds, &out.TerminationGracePeriodSeconds + *out = new(int64) + **out = **in + } return } @@ -5340,6 +5350,16 @@ func (in *ServiceSpec) DeepCopyInto(out *ServiceSpec) { *out = new(bool) **out = **in } + if in.LoadBalancerClass != nil { + in, out := &in.LoadBalancerClass, &out.LoadBalancerClass + *out = new(string) + **out = **in + } + if in.InternalTrafficPolicy != nil { + in, out := &in.InternalTrafficPolicy, &out.InternalTrafficPolicy + *out = new(ServiceInternalTrafficPolicyType) + **out = **in + } return } diff --git a/vendor/k8s.io/api/discovery/v1/doc.go b/vendor/k8s.io/api/discovery/v1/doc.go new file mode 100644 index 000000000000..96ae531ce711 --- /dev/null +++ b/vendor/k8s.io/api/discovery/v1/doc.go @@ -0,0 +1,22 @@ +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// +k8s:deepcopy-gen=package +// +k8s:protobuf-gen=package +// +k8s:openapi-gen=true +// +groupName=discovery.k8s.io + +package v1 // import "k8s.io/api/discovery/v1" diff --git a/vendor/k8s.io/api/discovery/v1/generated.pb.go b/vendor/k8s.io/api/discovery/v1/generated.pb.go new file mode 100644 index 000000000000..38bdb02a52bb --- /dev/null +++ b/vendor/k8s.io/api/discovery/v1/generated.pb.go @@ -0,0 +1,2251 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: k8s.io/kubernetes/vendor/k8s.io/api/discovery/v1/generated.proto + +package v1 + +import ( + fmt "fmt" + + io "io" + + proto "github.com/gogo/protobuf/proto" + github_com_gogo_protobuf_sortkeys "github.com/gogo/protobuf/sortkeys" + k8s_io_api_core_v1 "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" + + math "math" + math_bits "math/bits" + reflect "reflect" + strings "strings" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +func (m *Endpoint) Reset() { *m = Endpoint{} } +func (*Endpoint) ProtoMessage() {} +func (*Endpoint) Descriptor() ([]byte, []int) { + return fileDescriptor_3a5d310fb1396ddf, []int{0} +} +func (m *Endpoint) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Endpoint) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *Endpoint) XXX_Merge(src proto.Message) { + xxx_messageInfo_Endpoint.Merge(m, src) +} +func (m *Endpoint) XXX_Size() int { + return m.Size() +} +func (m *Endpoint) XXX_DiscardUnknown() { + xxx_messageInfo_Endpoint.DiscardUnknown(m) +} + +var xxx_messageInfo_Endpoint proto.InternalMessageInfo + +func (m *EndpointConditions) Reset() { *m = EndpointConditions{} } +func (*EndpointConditions) ProtoMessage() {} +func (*EndpointConditions) Descriptor() ([]byte, []int) { + return fileDescriptor_3a5d310fb1396ddf, []int{1} +} +func (m *EndpointConditions) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *EndpointConditions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *EndpointConditions) XXX_Merge(src proto.Message) { + xxx_messageInfo_EndpointConditions.Merge(m, src) +} +func (m *EndpointConditions) XXX_Size() int { + return m.Size() +} +func (m *EndpointConditions) XXX_DiscardUnknown() { + xxx_messageInfo_EndpointConditions.DiscardUnknown(m) +} + +var xxx_messageInfo_EndpointConditions proto.InternalMessageInfo + +func (m *EndpointHints) Reset() { *m = EndpointHints{} } +func (*EndpointHints) ProtoMessage() {} +func (*EndpointHints) Descriptor() ([]byte, []int) { + return fileDescriptor_3a5d310fb1396ddf, []int{2} +} +func (m *EndpointHints) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *EndpointHints) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *EndpointHints) XXX_Merge(src proto.Message) { + xxx_messageInfo_EndpointHints.Merge(m, src) +} +func (m *EndpointHints) XXX_Size() int { + return m.Size() +} +func (m *EndpointHints) XXX_DiscardUnknown() { + xxx_messageInfo_EndpointHints.DiscardUnknown(m) +} + +var xxx_messageInfo_EndpointHints proto.InternalMessageInfo + +func (m *EndpointPort) Reset() { *m = EndpointPort{} } +func (*EndpointPort) ProtoMessage() {} +func (*EndpointPort) Descriptor() ([]byte, []int) { + return fileDescriptor_3a5d310fb1396ddf, []int{3} +} +func (m *EndpointPort) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *EndpointPort) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *EndpointPort) XXX_Merge(src proto.Message) { + xxx_messageInfo_EndpointPort.Merge(m, src) +} +func (m *EndpointPort) XXX_Size() int { + return m.Size() +} +func (m *EndpointPort) XXX_DiscardUnknown() { + xxx_messageInfo_EndpointPort.DiscardUnknown(m) +} + +var xxx_messageInfo_EndpointPort proto.InternalMessageInfo + +func (m *EndpointSlice) Reset() { *m = EndpointSlice{} } +func (*EndpointSlice) ProtoMessage() {} +func (*EndpointSlice) Descriptor() ([]byte, []int) { + return fileDescriptor_3a5d310fb1396ddf, []int{4} +} +func (m *EndpointSlice) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *EndpointSlice) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *EndpointSlice) XXX_Merge(src proto.Message) { + xxx_messageInfo_EndpointSlice.Merge(m, src) +} +func (m *EndpointSlice) XXX_Size() int { + return m.Size() +} +func (m *EndpointSlice) XXX_DiscardUnknown() { + xxx_messageInfo_EndpointSlice.DiscardUnknown(m) +} + +var xxx_messageInfo_EndpointSlice proto.InternalMessageInfo + +func (m *EndpointSliceList) Reset() { *m = EndpointSliceList{} } +func (*EndpointSliceList) ProtoMessage() {} +func (*EndpointSliceList) Descriptor() ([]byte, []int) { + return fileDescriptor_3a5d310fb1396ddf, []int{5} +} +func (m *EndpointSliceList) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *EndpointSliceList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *EndpointSliceList) XXX_Merge(src proto.Message) { + xxx_messageInfo_EndpointSliceList.Merge(m, src) +} +func (m *EndpointSliceList) XXX_Size() int { + return m.Size() +} +func (m *EndpointSliceList) XXX_DiscardUnknown() { + xxx_messageInfo_EndpointSliceList.DiscardUnknown(m) +} + +var xxx_messageInfo_EndpointSliceList proto.InternalMessageInfo + +func (m *ForZone) Reset() { *m = ForZone{} } +func (*ForZone) ProtoMessage() {} +func (*ForZone) Descriptor() ([]byte, []int) { + return fileDescriptor_3a5d310fb1396ddf, []int{6} +} +func (m *ForZone) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ForZone) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ForZone) XXX_Merge(src proto.Message) { + xxx_messageInfo_ForZone.Merge(m, src) +} +func (m *ForZone) XXX_Size() int { + return m.Size() +} +func (m *ForZone) XXX_DiscardUnknown() { + xxx_messageInfo_ForZone.DiscardUnknown(m) +} + +var xxx_messageInfo_ForZone proto.InternalMessageInfo + +func init() { + proto.RegisterType((*Endpoint)(nil), "k8s.io.api.discovery.v1.Endpoint") + proto.RegisterMapType((map[string]string)(nil), "k8s.io.api.discovery.v1.Endpoint.DeprecatedTopologyEntry") + proto.RegisterType((*EndpointConditions)(nil), "k8s.io.api.discovery.v1.EndpointConditions") + proto.RegisterType((*EndpointHints)(nil), "k8s.io.api.discovery.v1.EndpointHints") + proto.RegisterType((*EndpointPort)(nil), "k8s.io.api.discovery.v1.EndpointPort") + proto.RegisterType((*EndpointSlice)(nil), "k8s.io.api.discovery.v1.EndpointSlice") + proto.RegisterType((*EndpointSliceList)(nil), "k8s.io.api.discovery.v1.EndpointSliceList") + proto.RegisterType((*ForZone)(nil), "k8s.io.api.discovery.v1.ForZone") +} + +func init() { + proto.RegisterFile("k8s.io/kubernetes/vendor/k8s.io/api/discovery/v1/generated.proto", fileDescriptor_3a5d310fb1396ddf) +} + +var fileDescriptor_3a5d310fb1396ddf = []byte{ + // 889 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x54, 0x4d, 0x6f, 0xe3, 0x44, + 0x18, 0x8e, 0x9b, 0x86, 0xda, 0x93, 0x56, 0xec, 0x8e, 0x90, 0x36, 0x0a, 0x28, 0x0e, 0x46, 0x8b, + 0x22, 0x55, 0xd8, 0xb4, 0x42, 0x68, 0xe1, 0x44, 0xcd, 0x96, 0x5d, 0xbe, 0x4a, 0x35, 0xdb, 0xd3, + 0x0a, 0x69, 0x71, 0xed, 0xb7, 0x8e, 0x49, 0x33, 0x63, 0xcd, 0x4c, 0x22, 0x85, 0x13, 0x17, 0xce, + 0xf0, 0x8b, 0x38, 0xa2, 0x1e, 0xf7, 0xc6, 0x9e, 0x2c, 0x6a, 0xfe, 0x02, 0xa7, 0x3d, 0xa1, 0x19, + 0x7f, 0x96, 0xb4, 0x0a, 0xb7, 0x99, 0x67, 0x9e, 0xe7, 0xfd, 0x78, 0x66, 0xe6, 0x45, 0x9f, 0xcd, + 0x1e, 0x09, 0x37, 0x61, 0xde, 0x6c, 0x71, 0x0e, 0x9c, 0x82, 0x04, 0xe1, 0x2d, 0x81, 0x46, 0x8c, + 0x7b, 0xe5, 0x41, 0x90, 0x26, 0x5e, 0x94, 0x88, 0x90, 0x2d, 0x81, 0xaf, 0xbc, 0xe5, 0x81, 0x17, + 0x03, 0x05, 0x1e, 0x48, 0x88, 0xdc, 0x94, 0x33, 0xc9, 0xf0, 0x83, 0x82, 0xe8, 0x06, 0x69, 0xe2, + 0xd6, 0x44, 0x77, 0x79, 0x30, 0xfc, 0x20, 0x4e, 0xe4, 0x74, 0x71, 0xee, 0x86, 0x6c, 0xee, 0xc5, + 0x2c, 0x66, 0x9e, 0xe6, 0x9f, 0x2f, 0x2e, 0xf4, 0x4e, 0x6f, 0xf4, 0xaa, 0x88, 0x33, 0x74, 0x5a, + 0x09, 0x43, 0xc6, 0xe1, 0x96, 0x5c, 0xc3, 0x8f, 0x1a, 0xce, 0x3c, 0x08, 0xa7, 0x09, 0x55, 0x35, + 0xa5, 0xb3, 0x58, 0x01, 0xc2, 0x9b, 0x83, 0x0c, 0x6e, 0x53, 0x79, 0x77, 0xa9, 0xf8, 0x82, 0xca, + 0x64, 0x0e, 0x6b, 0x82, 0x8f, 0x37, 0x09, 0x44, 0x38, 0x85, 0x79, 0xf0, 0x5f, 0x9d, 0xf3, 0xcf, + 0x36, 0x32, 0x8f, 0x69, 0x94, 0xb2, 0x84, 0x4a, 0xbc, 0x8f, 0xac, 0x20, 0x8a, 0x38, 0x08, 0x01, + 0x62, 0x60, 0x8c, 0xbb, 0x13, 0xcb, 0xdf, 0xcb, 0x33, 0xdb, 0x3a, 0xaa, 0x40, 0xd2, 0x9c, 0xe3, + 0x17, 0x08, 0x85, 0x8c, 0x46, 0x89, 0x4c, 0x18, 0x15, 0x83, 0xad, 0xb1, 0x31, 0xe9, 0x1f, 0xee, + 0xbb, 0x77, 0x38, 0xeb, 0x56, 0x39, 0x3e, 0xaf, 0x25, 0x3e, 0xbe, 0xca, 0xec, 0x4e, 0x9e, 0xd9, + 0xa8, 0xc1, 0x48, 0x2b, 0x24, 0x9e, 0x20, 0x73, 0xca, 0x84, 0xa4, 0xc1, 0x1c, 0x06, 0xdd, 0xb1, + 0x31, 0xb1, 0xfc, 0xdd, 0x3c, 0xb3, 0xcd, 0xa7, 0x25, 0x46, 0xea, 0x53, 0x7c, 0x8a, 0x2c, 0x19, + 0xf0, 0x18, 0x24, 0x81, 0x8b, 0xc1, 0xb6, 0xae, 0xe4, 0xbd, 0x76, 0x25, 0xea, 0x6e, 0x54, 0x11, + 0xdf, 0x9d, 0xff, 0x08, 0xa1, 0x22, 0x01, 0x07, 0x1a, 0x42, 0xd1, 0xdc, 0x59, 0xa5, 0x24, 0x4d, + 0x10, 0xfc, 0x8b, 0x81, 0x70, 0x04, 0x29, 0x87, 0x50, 0x79, 0x75, 0xc6, 0x52, 0x76, 0xc9, 0xe2, + 0xd5, 0xa0, 0x37, 0xee, 0x4e, 0xfa, 0x87, 0x9f, 0x6c, 0xec, 0xd2, 0x7d, 0xbc, 0xa6, 0x3d, 0xa6, + 0x92, 0xaf, 0xfc, 0x61, 0xd9, 0x33, 0x5e, 0x27, 0x90, 0x5b, 0x12, 0x2a, 0x0f, 0x28, 0x8b, 0xe0, + 0x44, 0x79, 0xf0, 0x46, 0xe3, 0xc1, 0x49, 0x89, 0x91, 0xfa, 0x14, 0xbf, 0x83, 0xb6, 0x7f, 0x62, + 0x14, 0x06, 0x3b, 0x9a, 0x65, 0xe6, 0x99, 0xbd, 0xfd, 0x9c, 0x51, 0x20, 0x1a, 0xc5, 0x4f, 0x50, + 0x6f, 0x9a, 0x50, 0x29, 0x06, 0xa6, 0x76, 0xe7, 0xfd, 0x8d, 0x1d, 0x3c, 0x55, 0x6c, 0xdf, 0xca, + 0x33, 0xbb, 0xa7, 0x97, 0xa4, 0xd0, 0x0f, 0x8f, 0xd1, 0x83, 0x3b, 0x7a, 0xc3, 0xf7, 0x50, 0x77, + 0x06, 0xab, 0x81, 0xa1, 0x0a, 0x20, 0x6a, 0x89, 0xdf, 0x42, 0xbd, 0x65, 0x70, 0xb9, 0x00, 0xfd, + 0x3a, 0x2c, 0x52, 0x6c, 0x3e, 0xdd, 0x7a, 0x64, 0x38, 0xbf, 0x1a, 0x08, 0xaf, 0x3f, 0x09, 0x6c, + 0xa3, 0x1e, 0x87, 0x20, 0x2a, 0x82, 0x98, 0x45, 0x7a, 0xa2, 0x00, 0x52, 0xe0, 0xf8, 0x21, 0xda, + 0x11, 0xc0, 0x97, 0x09, 0x8d, 0x75, 0x4c, 0xd3, 0xef, 0xe7, 0x99, 0xbd, 0xf3, 0xac, 0x80, 0x48, + 0x75, 0x86, 0x0f, 0x50, 0x5f, 0x02, 0x9f, 0x27, 0x34, 0x90, 0x8a, 0xda, 0xd5, 0xd4, 0x37, 0xf3, + 0xcc, 0xee, 0x9f, 0x35, 0x30, 0x69, 0x73, 0x9c, 0x17, 0x68, 0xef, 0x46, 0xef, 0xf8, 0x04, 0x99, + 0x17, 0x8c, 0x2b, 0x0f, 0x8b, 0xbf, 0xd0, 0x3f, 0x1c, 0xdf, 0xe9, 0xda, 0x17, 0x05, 0xd1, 0xbf, + 0x57, 0x5e, 0xaf, 0x59, 0x02, 0x82, 0xd4, 0x31, 0x9c, 0x3f, 0x0c, 0xb4, 0x5b, 0x65, 0x38, 0x65, + 0x5c, 0xaa, 0x1b, 0xd3, 0x6f, 0xdb, 0x68, 0x6e, 0x4c, 0xdf, 0xa9, 0x46, 0xf1, 0x13, 0x64, 0xea, + 0x1f, 0x1a, 0xb2, 0xcb, 0xc2, 0x3e, 0x7f, 0x5f, 0x05, 0x3e, 0x2d, 0xb1, 0xd7, 0x99, 0xfd, 0xf6, + 0xfa, 0xf4, 0x71, 0xab, 0x63, 0x52, 0x8b, 0x55, 0x9a, 0x94, 0x71, 0xa9, 0x4d, 0xe8, 0x15, 0x69, + 0x54, 0x7a, 0xa2, 0x51, 0xe5, 0x54, 0x90, 0xa6, 0x95, 0x4c, 0x7f, 0x1e, 0xab, 0x70, 0xea, 0xa8, + 0x81, 0x49, 0x9b, 0xe3, 0xfc, 0xb9, 0xd5, 0x58, 0xf5, 0xec, 0x32, 0x09, 0x01, 0xff, 0x80, 0x4c, + 0x35, 0xc8, 0xa2, 0x40, 0x06, 0xba, 0x9b, 0xfe, 0xe1, 0x87, 0x2d, 0xab, 0xea, 0x79, 0xe4, 0xa6, + 0xb3, 0x58, 0x01, 0xc2, 0x55, 0xec, 0xe6, 0x43, 0x7e, 0x0b, 0x32, 0x68, 0xa6, 0x41, 0x83, 0x91, + 0x3a, 0x2a, 0x7e, 0x8c, 0xfa, 0xe5, 0xe4, 0x39, 0x5b, 0xa5, 0x50, 0x96, 0xe9, 0x94, 0x92, 0xfe, + 0x51, 0x73, 0xf4, 0xfa, 0xe6, 0x96, 0xb4, 0x65, 0x98, 0x20, 0x0b, 0xca, 0xc2, 0xd5, 0xc4, 0x52, + 0x77, 0xfa, 0xee, 0xc6, 0x9f, 0xe0, 0xdf, 0x2f, 0xd3, 0x58, 0x15, 0x22, 0x48, 0x13, 0x06, 0x7f, + 0x85, 0x7a, 0xca, 0x48, 0x31, 0xe8, 0xea, 0x78, 0x0f, 0x37, 0xc6, 0x53, 0xe6, 0xfb, 0x7b, 0x65, + 0xcc, 0x9e, 0xda, 0x09, 0x52, 0x84, 0x70, 0x7e, 0x37, 0xd0, 0xfd, 0x1b, 0xce, 0x7e, 0x93, 0x08, + 0x89, 0xbf, 0x5f, 0x73, 0xd7, 0xfd, 0x7f, 0xee, 0x2a, 0xb5, 0xf6, 0xb6, 0x7e, 0x96, 0x15, 0xd2, + 0x72, 0xf6, 0x6b, 0xd4, 0x4b, 0x24, 0xcc, 0x2b, 0x3f, 0x36, 0x4f, 0x06, 0x5d, 0x58, 0xd3, 0xc0, + 0x97, 0x4a, 0x4c, 0x8a, 0x18, 0xce, 0x3e, 0xda, 0x29, 0x5f, 0x3e, 0x1e, 0xdf, 0x78, 0xdd, 0xbb, + 0x25, 0xbd, 0xf5, 0xc2, 0xfd, 0xc9, 0xd5, 0xf5, 0xa8, 0xf3, 0xf2, 0x7a, 0xd4, 0x79, 0x75, 0x3d, + 0xea, 0xfc, 0x9c, 0x8f, 0x8c, 0xab, 0x7c, 0x64, 0xbc, 0xcc, 0x47, 0xc6, 0xab, 0x7c, 0x64, 0xfc, + 0x95, 0x8f, 0x8c, 0xdf, 0xfe, 0x1e, 0x75, 0x9e, 0x6f, 0x2d, 0x0f, 0xfe, 0x0d, 0x00, 0x00, 0xff, + 0xff, 0x66, 0x0f, 0x26, 0x7b, 0xf2, 0x07, 0x00, 0x00, +} + +func (m *Endpoint) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Endpoint) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Endpoint) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Hints != nil { + { + size, err := m.Hints.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x42 + } + if m.Zone != nil { + i -= len(*m.Zone) + copy(dAtA[i:], *m.Zone) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.Zone))) + i-- + dAtA[i] = 0x3a + } + if m.NodeName != nil { + i -= len(*m.NodeName) + copy(dAtA[i:], *m.NodeName) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.NodeName))) + i-- + dAtA[i] = 0x32 + } + if len(m.DeprecatedTopology) > 0 { + keysForDeprecatedTopology := make([]string, 0, len(m.DeprecatedTopology)) + for k := range m.DeprecatedTopology { + keysForDeprecatedTopology = append(keysForDeprecatedTopology, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForDeprecatedTopology) + for iNdEx := len(keysForDeprecatedTopology) - 1; iNdEx >= 0; iNdEx-- { + v := m.DeprecatedTopology[string(keysForDeprecatedTopology[iNdEx])] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintGenerated(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(keysForDeprecatedTopology[iNdEx]) + copy(dAtA[i:], keysForDeprecatedTopology[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(keysForDeprecatedTopology[iNdEx]))) + i-- + dAtA[i] = 0xa + i = encodeVarintGenerated(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x2a + } + } + if m.TargetRef != nil { + { + size, err := m.TargetRef.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + if m.Hostname != nil { + i -= len(*m.Hostname) + copy(dAtA[i:], *m.Hostname) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.Hostname))) + i-- + dAtA[i] = 0x1a + } + { + size, err := m.Conditions.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + if len(m.Addresses) > 0 { + for iNdEx := len(m.Addresses) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Addresses[iNdEx]) + copy(dAtA[i:], m.Addresses[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Addresses[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *EndpointConditions) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *EndpointConditions) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EndpointConditions) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Terminating != nil { + i-- + if *m.Terminating { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x18 + } + if m.Serving != nil { + i-- + if *m.Serving { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + } + if m.Ready != nil { + i-- + if *m.Ready { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *EndpointHints) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *EndpointHints) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EndpointHints) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.ForZones) > 0 { + for iNdEx := len(m.ForZones) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.ForZones[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *EndpointPort) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *EndpointPort) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EndpointPort) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.AppProtocol != nil { + i -= len(*m.AppProtocol) + copy(dAtA[i:], *m.AppProtocol) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.AppProtocol))) + i-- + dAtA[i] = 0x22 + } + if m.Port != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.Port)) + i-- + dAtA[i] = 0x18 + } + if m.Protocol != nil { + i -= len(*m.Protocol) + copy(dAtA[i:], *m.Protocol) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.Protocol))) + i-- + dAtA[i] = 0x12 + } + if m.Name != nil { + i -= len(*m.Name) + copy(dAtA[i:], *m.Name) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.Name))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *EndpointSlice) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *EndpointSlice) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EndpointSlice) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.AddressType) + copy(dAtA[i:], m.AddressType) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.AddressType))) + i-- + dAtA[i] = 0x22 + if len(m.Ports) > 0 { + for iNdEx := len(m.Ports) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Ports[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + if len(m.Endpoints) > 0 { + for iNdEx := len(m.Endpoints) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Endpoints[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + { + size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *EndpointSliceList) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *EndpointSliceList) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EndpointSliceList) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Items) > 0 { + for iNdEx := len(m.Items) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Items[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + { + size, err := m.ListMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *ForZone) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ForZone) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ForZone) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func encodeVarintGenerated(dAtA []byte, offset int, v uint64) int { + offset -= sovGenerated(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *Endpoint) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Addresses) > 0 { + for _, s := range m.Addresses { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + l = m.Conditions.Size() + n += 1 + l + sovGenerated(uint64(l)) + if m.Hostname != nil { + l = len(*m.Hostname) + n += 1 + l + sovGenerated(uint64(l)) + } + if m.TargetRef != nil { + l = m.TargetRef.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if len(m.DeprecatedTopology) > 0 { + for k, v := range m.DeprecatedTopology { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + len(v) + sovGenerated(uint64(len(v))) + n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) + } + } + if m.NodeName != nil { + l = len(*m.NodeName) + n += 1 + l + sovGenerated(uint64(l)) + } + if m.Zone != nil { + l = len(*m.Zone) + n += 1 + l + sovGenerated(uint64(l)) + } + if m.Hints != nil { + l = m.Hints.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *EndpointConditions) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Ready != nil { + n += 2 + } + if m.Serving != nil { + n += 2 + } + if m.Terminating != nil { + n += 2 + } + return n +} + +func (m *EndpointHints) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.ForZones) > 0 { + for _, e := range m.ForZones { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *EndpointPort) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Name != nil { + l = len(*m.Name) + n += 1 + l + sovGenerated(uint64(l)) + } + if m.Protocol != nil { + l = len(*m.Protocol) + n += 1 + l + sovGenerated(uint64(l)) + } + if m.Port != nil { + n += 1 + sovGenerated(uint64(*m.Port)) + } + if m.AppProtocol != nil { + l = len(*m.AppProtocol) + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *EndpointSlice) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Endpoints) > 0 { + for _, e := range m.Endpoints { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if len(m.Ports) > 0 { + for _, e := range m.Ports { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + l = len(m.AddressType) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *EndpointSliceList) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ListMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *ForZone) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func sovGenerated(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozGenerated(x uint64) (n int) { + return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (this *Endpoint) String() string { + if this == nil { + return "nil" + } + keysForDeprecatedTopology := make([]string, 0, len(this.DeprecatedTopology)) + for k := range this.DeprecatedTopology { + keysForDeprecatedTopology = append(keysForDeprecatedTopology, k) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForDeprecatedTopology) + mapStringForDeprecatedTopology := "map[string]string{" + for _, k := range keysForDeprecatedTopology { + mapStringForDeprecatedTopology += fmt.Sprintf("%v: %v,", k, this.DeprecatedTopology[k]) + } + mapStringForDeprecatedTopology += "}" + s := strings.Join([]string{`&Endpoint{`, + `Addresses:` + fmt.Sprintf("%v", this.Addresses) + `,`, + `Conditions:` + strings.Replace(strings.Replace(this.Conditions.String(), "EndpointConditions", "EndpointConditions", 1), `&`, ``, 1) + `,`, + `Hostname:` + valueToStringGenerated(this.Hostname) + `,`, + `TargetRef:` + strings.Replace(fmt.Sprintf("%v", this.TargetRef), "ObjectReference", "v1.ObjectReference", 1) + `,`, + `DeprecatedTopology:` + mapStringForDeprecatedTopology + `,`, + `NodeName:` + valueToStringGenerated(this.NodeName) + `,`, + `Zone:` + valueToStringGenerated(this.Zone) + `,`, + `Hints:` + strings.Replace(this.Hints.String(), "EndpointHints", "EndpointHints", 1) + `,`, + `}`, + }, "") + return s +} +func (this *EndpointConditions) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&EndpointConditions{`, + `Ready:` + valueToStringGenerated(this.Ready) + `,`, + `Serving:` + valueToStringGenerated(this.Serving) + `,`, + `Terminating:` + valueToStringGenerated(this.Terminating) + `,`, + `}`, + }, "") + return s +} +func (this *EndpointHints) String() string { + if this == nil { + return "nil" + } + repeatedStringForForZones := "[]ForZone{" + for _, f := range this.ForZones { + repeatedStringForForZones += strings.Replace(strings.Replace(f.String(), "ForZone", "ForZone", 1), `&`, ``, 1) + "," + } + repeatedStringForForZones += "}" + s := strings.Join([]string{`&EndpointHints{`, + `ForZones:` + repeatedStringForForZones + `,`, + `}`, + }, "") + return s +} +func (this *EndpointPort) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&EndpointPort{`, + `Name:` + valueToStringGenerated(this.Name) + `,`, + `Protocol:` + valueToStringGenerated(this.Protocol) + `,`, + `Port:` + valueToStringGenerated(this.Port) + `,`, + `AppProtocol:` + valueToStringGenerated(this.AppProtocol) + `,`, + `}`, + }, "") + return s +} +func (this *EndpointSlice) String() string { + if this == nil { + return "nil" + } + repeatedStringForEndpoints := "[]Endpoint{" + for _, f := range this.Endpoints { + repeatedStringForEndpoints += strings.Replace(strings.Replace(f.String(), "Endpoint", "Endpoint", 1), `&`, ``, 1) + "," + } + repeatedStringForEndpoints += "}" + repeatedStringForPorts := "[]EndpointPort{" + for _, f := range this.Ports { + repeatedStringForPorts += strings.Replace(strings.Replace(f.String(), "EndpointPort", "EndpointPort", 1), `&`, ``, 1) + "," + } + repeatedStringForPorts += "}" + s := strings.Join([]string{`&EndpointSlice{`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v11.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Endpoints:` + repeatedStringForEndpoints + `,`, + `Ports:` + repeatedStringForPorts + `,`, + `AddressType:` + fmt.Sprintf("%v", this.AddressType) + `,`, + `}`, + }, "") + return s +} +func (this *EndpointSliceList) String() string { + if this == nil { + return "nil" + } + repeatedStringForItems := "[]EndpointSlice{" + for _, f := range this.Items { + repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "EndpointSlice", "EndpointSlice", 1), `&`, ``, 1) + "," + } + repeatedStringForItems += "}" + s := strings.Join([]string{`&EndpointSliceList{`, + `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v11.ListMeta", 1), `&`, ``, 1) + `,`, + `Items:` + repeatedStringForItems + `,`, + `}`, + }, "") + return s +} +func (this *ForZone) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ForZone{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `}`, + }, "") + return s +} +func valueToStringGenerated(v interface{}) string { + rv := reflect.ValueOf(v) + if rv.IsNil() { + return "nil" + } + pv := reflect.Indirect(rv).Interface() + return fmt.Sprintf("*%v", pv) +} +func (m *Endpoint) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Endpoint: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Endpoint: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Addresses", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Addresses = append(m.Addresses, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Conditions", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Conditions.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Hostname", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Hostname = &s + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TargetRef", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.TargetRef == nil { + m.TargetRef = &v1.ObjectReference{} + } + if err := m.TargetRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DeprecatedTopology", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.DeprecatedTopology == nil { + m.DeprecatedTopology = make(map[string]string) + } + var mapkey string + var mapvalue string + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthGenerated + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var stringLenmapvalue uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapvalue |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapvalue := int(stringLenmapvalue) + if intStringLenmapvalue < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return ErrInvalidLengthGenerated + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.DeprecatedTopology[mapkey] = mapvalue + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NodeName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.NodeName = &s + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Zone", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Zone = &s + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Hints", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Hints == nil { + m.Hints = &EndpointHints{} + } + if err := m.Hints.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *EndpointConditions) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: EndpointConditions: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: EndpointConditions: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Ready", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.Ready = &b + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Serving", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.Serving = &b + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Terminating", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.Terminating = &b + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *EndpointHints) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: EndpointHints: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: EndpointHints: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ForZones", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ForZones = append(m.ForZones, ForZone{}) + if err := m.ForZones[len(m.ForZones)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *EndpointPort) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: EndpointPort: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: EndpointPort: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Name = &s + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Protocol", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := k8s_io_api_core_v1.Protocol(dAtA[iNdEx:postIndex]) + m.Protocol = &s + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Port", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Port = &v + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AppProtocol", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.AppProtocol = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *EndpointSlice) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: EndpointSlice: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: EndpointSlice: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Endpoints", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Endpoints = append(m.Endpoints, Endpoint{}) + if err := m.Endpoints[len(m.Endpoints)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Ports", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Ports = append(m.Ports, EndpointPort{}) + if err := m.Ports[len(m.Ports)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AddressType", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AddressType = AddressType(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *EndpointSliceList) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: EndpointSliceList: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: EndpointSliceList: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Items = append(m.Items, EndpointSlice{}) + if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ForZone) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ForZone: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ForZone: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipGenerated(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenerated + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenerated + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenerated + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthGenerated + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupGenerated + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthGenerated + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthGenerated = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowGenerated = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupGenerated = fmt.Errorf("proto: unexpected end of group") +) diff --git a/vendor/k8s.io/api/discovery/v1/generated.proto b/vendor/k8s.io/api/discovery/v1/generated.proto new file mode 100644 index 000000000000..5844965d0951 --- /dev/null +++ b/vendor/k8s.io/api/discovery/v1/generated.proto @@ -0,0 +1,196 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + + +// This file was autogenerated by go-to-protobuf. Do not edit it manually! + +syntax = "proto2"; + +package k8s.io.api.discovery.v1; + +import "k8s.io/api/core/v1/generated.proto"; +import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; +import "k8s.io/apimachinery/pkg/runtime/generated.proto"; +import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; + +// Package-wide variables from generator "generated". +option go_package = "v1"; + +// Endpoint represents a single logical "backend" implementing a service. +message Endpoint { + // addresses of this endpoint. The contents of this field are interpreted + // according to the corresponding EndpointSlice addressType field. Consumers + // must handle different types of addresses in the context of their own + // capabilities. This must contain at least one address but no more than + // 100. + // +listType=set + repeated string addresses = 1; + + // conditions contains information about the current status of the endpoint. + optional EndpointConditions conditions = 2; + + // hostname of this endpoint. This field may be used by consumers of + // endpoints to distinguish endpoints from each other (e.g. in DNS names). + // Multiple endpoints which use the same hostname should be considered + // fungible (e.g. multiple A values in DNS). Must be lowercase and pass DNS + // Label (RFC 1123) validation. + // +optional + optional string hostname = 3; + + // targetRef is a reference to a Kubernetes object that represents this + // endpoint. + // +optional + optional k8s.io.api.core.v1.ObjectReference targetRef = 4; + + // deprecatedTopology contains topology information part of the v1beta1 + // API. This field is deprecated, and will be removed when the v1beta1 + // API is removed (no sooner than kubernetes v1.24). While this field can + // hold values, it is not writable through the v1 API, and any attempts to + // write to it will be silently ignored. Topology information can be found + // in the zone and nodeName fields instead. + // +optional + map deprecatedTopology = 5; + + // nodeName represents the name of the Node hosting this endpoint. This can + // be used to determine endpoints local to a Node. This field can be enabled + // with the EndpointSliceNodeName feature gate. + // +optional + optional string nodeName = 6; + + // zone is the name of the Zone this endpoint exists in. + // +optional + optional string zone = 7; + + // hints contains information associated with how an endpoint should be + // consumed. + // +optional + optional EndpointHints hints = 8; +} + +// EndpointConditions represents the current condition of an endpoint. +message EndpointConditions { + // ready indicates that this endpoint is prepared to receive traffic, + // according to whatever system is managing the endpoint. A nil value + // indicates an unknown state. In most cases consumers should interpret this + // unknown state as ready. For compatibility reasons, ready should never be + // "true" for terminating endpoints. + // +optional + optional bool ready = 1; + + // serving is identical to ready except that it is set regardless of the + // terminating state of endpoints. This condition should be set to true for + // a ready endpoint that is terminating. If nil, consumers should defer to + // the ready condition. This field can be enabled with the + // EndpointSliceTerminatingCondition feature gate. + // +optional + optional bool serving = 2; + + // terminating indicates that this endpoint is terminating. A nil value + // indicates an unknown state. Consumers should interpret this unknown state + // to mean that the endpoint is not terminating. This field can be enabled + // with the EndpointSliceTerminatingCondition feature gate. + // +optional + optional bool terminating = 3; +} + +// EndpointHints provides hints describing how an endpoint should be consumed. +message EndpointHints { + // forZones indicates the zone(s) this endpoint should be consumed by to + // enable topology aware routing. + // +listType=atomic + repeated ForZone forZones = 1; +} + +// EndpointPort represents a Port used by an EndpointSlice +message EndpointPort { + // The name of this port. All ports in an EndpointSlice must have a unique + // name. If the EndpointSlice is dervied from a Kubernetes service, this + // corresponds to the Service.ports[].name. + // Name must either be an empty string or pass DNS_LABEL validation: + // * must be no more than 63 characters long. + // * must consist of lower case alphanumeric characters or '-'. + // * must start and end with an alphanumeric character. + // Default is empty string. + optional string name = 1; + + // The IP protocol for this port. + // Must be UDP, TCP, or SCTP. + // Default is TCP. + optional string protocol = 2; + + // The port number of the endpoint. + // If this is not specified, ports are not restricted and must be + // interpreted in the context of the specific consumer. + optional int32 port = 3; + + // The application protocol for this port. + // This field follows standard Kubernetes label syntax. + // Un-prefixed names are reserved for IANA standard service names (as per + // RFC-6335 and http://www.iana.org/assignments/service-names). + // Non-standard protocols should use prefixed names such as + // mycompany.com/my-custom-protocol. + // +optional + optional string appProtocol = 4; +} + +// EndpointSlice represents a subset of the endpoints that implement a service. +// For a given service there may be multiple EndpointSlice objects, selected by +// labels, which must be joined to produce the full set of endpoints. +message EndpointSlice { + // Standard object's metadata. + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; + + // addressType specifies the type of address carried by this EndpointSlice. + // All addresses in this slice must be the same type. This field is + // immutable after creation. The following address types are currently + // supported: + // * IPv4: Represents an IPv4 Address. + // * IPv6: Represents an IPv6 Address. + // * FQDN: Represents a Fully Qualified Domain Name. + optional string addressType = 4; + + // endpoints is a list of unique endpoints in this slice. Each slice may + // include a maximum of 1000 endpoints. + // +listType=atomic + repeated Endpoint endpoints = 2; + + // ports specifies the list of network ports exposed by each endpoint in + // this slice. Each port must have a unique name. When ports is empty, it + // indicates that there are no defined ports. When a port is defined with a + // nil port value, it indicates "all ports". Each slice may include a + // maximum of 100 ports. + // +optional + // +listType=atomic + repeated EndpointPort ports = 3; +} + +// EndpointSliceList represents a list of endpoint slices +message EndpointSliceList { + // Standard list metadata. + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; + + // List of endpoint slices + repeated EndpointSlice items = 2; +} + +// ForZone provides information about which zones should consume this endpoint. +message ForZone { + // name represents the name of the zone. + optional string name = 1; +} + diff --git a/vendor/k8s.io/api/discovery/v1/register.go b/vendor/k8s.io/api/discovery/v1/register.go new file mode 100644 index 000000000000..3eb8f38a37cb --- /dev/null +++ b/vendor/k8s.io/api/discovery/v1/register.go @@ -0,0 +1,56 @@ +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" +) + +// GroupName is the group name used in this package +const GroupName = "discovery.k8s.io" + +// SchemeGroupVersion is group version used to register these objects +var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: "v1"} + +// Kind takes an unqualified kind and returns a Group qualified GroupKind +func Kind(kind string) schema.GroupKind { + return SchemeGroupVersion.WithKind(kind).GroupKind() +} + +// Resource takes an unqualified resource and returns a Group qualified GroupResource +func Resource(resource string) schema.GroupResource { + return SchemeGroupVersion.WithResource(resource).GroupResource() +} + +var ( + // SchemeBuilder is the scheme builder with scheme init functions to run for this API package + SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes) + // AddToScheme is a common registration function for mapping packaged scoped group & version keys to a scheme + AddToScheme = SchemeBuilder.AddToScheme +) + +// Adds the list of known types to the given scheme. +func addKnownTypes(scheme *runtime.Scheme) error { + scheme.AddKnownTypes(SchemeGroupVersion, + &EndpointSlice{}, + &EndpointSliceList{}, + ) + metav1.AddToGroupVersion(scheme, SchemeGroupVersion) + return nil +} diff --git a/vendor/k8s.io/api/discovery/v1/types.go b/vendor/k8s.io/api/discovery/v1/types.go new file mode 100644 index 000000000000..fa990efdb73b --- /dev/null +++ b/vendor/k8s.io/api/discovery/v1/types.go @@ -0,0 +1,194 @@ +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1 + +import ( + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// +genclient +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// EndpointSlice represents a subset of the endpoints that implement a service. +// For a given service there may be multiple EndpointSlice objects, selected by +// labels, which must be joined to produce the full set of endpoints. +type EndpointSlice struct { + metav1.TypeMeta `json:",inline"` + // Standard object's metadata. + // +optional + metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + // addressType specifies the type of address carried by this EndpointSlice. + // All addresses in this slice must be the same type. This field is + // immutable after creation. The following address types are currently + // supported: + // * IPv4: Represents an IPv4 Address. + // * IPv6: Represents an IPv6 Address. + // * FQDN: Represents a Fully Qualified Domain Name. + AddressType AddressType `json:"addressType" protobuf:"bytes,4,rep,name=addressType"` + // endpoints is a list of unique endpoints in this slice. Each slice may + // include a maximum of 1000 endpoints. + // +listType=atomic + Endpoints []Endpoint `json:"endpoints" protobuf:"bytes,2,rep,name=endpoints"` + // ports specifies the list of network ports exposed by each endpoint in + // this slice. Each port must have a unique name. When ports is empty, it + // indicates that there are no defined ports. When a port is defined with a + // nil port value, it indicates "all ports". Each slice may include a + // maximum of 100 ports. + // +optional + // +listType=atomic + Ports []EndpointPort `json:"ports" protobuf:"bytes,3,rep,name=ports"` +} + +// AddressType represents the type of address referred to by an endpoint. +type AddressType string + +const ( + // AddressTypeIPv4 represents an IPv4 Address. + AddressTypeIPv4 = AddressType(v1.IPv4Protocol) + // AddressTypeIPv6 represents an IPv6 Address. + AddressTypeIPv6 = AddressType(v1.IPv6Protocol) + // AddressTypeFQDN represents a FQDN. + AddressTypeFQDN = AddressType("FQDN") +) + +// Endpoint represents a single logical "backend" implementing a service. +type Endpoint struct { + // addresses of this endpoint. The contents of this field are interpreted + // according to the corresponding EndpointSlice addressType field. Consumers + // must handle different types of addresses in the context of their own + // capabilities. This must contain at least one address but no more than + // 100. + // +listType=set + Addresses []string `json:"addresses" protobuf:"bytes,1,rep,name=addresses"` + // conditions contains information about the current status of the endpoint. + Conditions EndpointConditions `json:"conditions,omitempty" protobuf:"bytes,2,opt,name=conditions"` + // hostname of this endpoint. This field may be used by consumers of + // endpoints to distinguish endpoints from each other (e.g. in DNS names). + // Multiple endpoints which use the same hostname should be considered + // fungible (e.g. multiple A values in DNS). Must be lowercase and pass DNS + // Label (RFC 1123) validation. + // +optional + Hostname *string `json:"hostname,omitempty" protobuf:"bytes,3,opt,name=hostname"` + // targetRef is a reference to a Kubernetes object that represents this + // endpoint. + // +optional + TargetRef *v1.ObjectReference `json:"targetRef,omitempty" protobuf:"bytes,4,opt,name=targetRef"` + + // deprecatedTopology contains topology information part of the v1beta1 + // API. This field is deprecated, and will be removed when the v1beta1 + // API is removed (no sooner than kubernetes v1.24). While this field can + // hold values, it is not writable through the v1 API, and any attempts to + // write to it will be silently ignored. Topology information can be found + // in the zone and nodeName fields instead. + // +optional + DeprecatedTopology map[string]string `json:"deprecatedTopology,omitempty" protobuf:"bytes,5,opt,name=deprecatedTopology"` + + // nodeName represents the name of the Node hosting this endpoint. This can + // be used to determine endpoints local to a Node. This field can be enabled + // with the EndpointSliceNodeName feature gate. + // +optional + NodeName *string `json:"nodeName,omitempty" protobuf:"bytes,6,opt,name=nodeName"` + // zone is the name of the Zone this endpoint exists in. + // +optional + Zone *string `json:"zone,omitempty" protobuf:"bytes,7,opt,name=zone"` + // hints contains information associated with how an endpoint should be + // consumed. + // +optional + Hints *EndpointHints `json:"hints,omitempty" protobuf:"bytes,8,opt,name=hints"` +} + +// EndpointConditions represents the current condition of an endpoint. +type EndpointConditions struct { + // ready indicates that this endpoint is prepared to receive traffic, + // according to whatever system is managing the endpoint. A nil value + // indicates an unknown state. In most cases consumers should interpret this + // unknown state as ready. For compatibility reasons, ready should never be + // "true" for terminating endpoints. + // +optional + Ready *bool `json:"ready,omitempty" protobuf:"bytes,1,name=ready"` + + // serving is identical to ready except that it is set regardless of the + // terminating state of endpoints. This condition should be set to true for + // a ready endpoint that is terminating. If nil, consumers should defer to + // the ready condition. This field can be enabled with the + // EndpointSliceTerminatingCondition feature gate. + // +optional + Serving *bool `json:"serving,omitempty" protobuf:"bytes,2,name=serving"` + + // terminating indicates that this endpoint is terminating. A nil value + // indicates an unknown state. Consumers should interpret this unknown state + // to mean that the endpoint is not terminating. This field can be enabled + // with the EndpointSliceTerminatingCondition feature gate. + // +optional + Terminating *bool `json:"terminating,omitempty" protobuf:"bytes,3,name=terminating"` +} + +// EndpointHints provides hints describing how an endpoint should be consumed. +type EndpointHints struct { + // forZones indicates the zone(s) this endpoint should be consumed by to + // enable topology aware routing. + // +listType=atomic + ForZones []ForZone `json:"forZones,omitempty" protobuf:"bytes,1,name=forZones"` +} + +// ForZone provides information about which zones should consume this endpoint. +type ForZone struct { + // name represents the name of the zone. + Name string `json:"name" protobuf:"bytes,1,name=name"` +} + +// EndpointPort represents a Port used by an EndpointSlice +type EndpointPort struct { + // The name of this port. All ports in an EndpointSlice must have a unique + // name. If the EndpointSlice is dervied from a Kubernetes service, this + // corresponds to the Service.ports[].name. + // Name must either be an empty string or pass DNS_LABEL validation: + // * must be no more than 63 characters long. + // * must consist of lower case alphanumeric characters or '-'. + // * must start and end with an alphanumeric character. + // Default is empty string. + Name *string `json:"name,omitempty" protobuf:"bytes,1,name=name"` + // The IP protocol for this port. + // Must be UDP, TCP, or SCTP. + // Default is TCP. + Protocol *v1.Protocol `json:"protocol,omitempty" protobuf:"bytes,2,name=protocol"` + // The port number of the endpoint. + // If this is not specified, ports are not restricted and must be + // interpreted in the context of the specific consumer. + Port *int32 `json:"port,omitempty" protobuf:"bytes,3,opt,name=port"` + // The application protocol for this port. + // This field follows standard Kubernetes label syntax. + // Un-prefixed names are reserved for IANA standard service names (as per + // RFC-6335 and http://www.iana.org/assignments/service-names). + // Non-standard protocols should use prefixed names such as + // mycompany.com/my-custom-protocol. + // +optional + AppProtocol *string `json:"appProtocol,omitempty" protobuf:"bytes,4,name=appProtocol"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// EndpointSliceList represents a list of endpoint slices +type EndpointSliceList struct { + metav1.TypeMeta `json:",inline"` + // Standard list metadata. + // +optional + metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + // List of endpoint slices + Items []EndpointSlice `json:"items" protobuf:"bytes,2,rep,name=items"` +} diff --git a/vendor/k8s.io/api/discovery/v1/types_swagger_doc_generated.go b/vendor/k8s.io/api/discovery/v1/types_swagger_doc_generated.go new file mode 100644 index 000000000000..b424a1cf0466 --- /dev/null +++ b/vendor/k8s.io/api/discovery/v1/types_swagger_doc_generated.go @@ -0,0 +1,109 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1 + +// This file contains a collection of methods that can be used from go-restful to +// generate Swagger API documentation for its models. Please read this PR for more +// information on the implementation: https://github.com/emicklei/go-restful/pull/215 +// +// TODOs are ignored from the parser (e.g. TODO(andronat):... || TODO:...) if and only if +// they are on one line! For multiple line or blocks that you want to ignore use ---. +// Any context after a --- is ignored. +// +// Those methods can be generated by using hack/update-generated-swagger-docs.sh + +// AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. +var map_Endpoint = map[string]string{ + "": "Endpoint represents a single logical \"backend\" implementing a service.", + "addresses": "addresses of this endpoint. The contents of this field are interpreted according to the corresponding EndpointSlice addressType field. Consumers must handle different types of addresses in the context of their own capabilities. This must contain at least one address but no more than 100.", + "conditions": "conditions contains information about the current status of the endpoint.", + "hostname": "hostname of this endpoint. This field may be used by consumers of endpoints to distinguish endpoints from each other (e.g. in DNS names). Multiple endpoints which use the same hostname should be considered fungible (e.g. multiple A values in DNS). Must be lowercase and pass DNS Label (RFC 1123) validation.", + "targetRef": "targetRef is a reference to a Kubernetes object that represents this endpoint.", + "deprecatedTopology": "deprecatedTopology contains topology information part of the v1beta1 API. This field is deprecated, and will be removed when the v1beta1 API is removed (no sooner than kubernetes v1.24). While this field can hold values, it is not writable through the v1 API, and any attempts to write to it will be silently ignored. Topology information can be found in the zone and nodeName fields instead.", + "nodeName": "nodeName represents the name of the Node hosting this endpoint. This can be used to determine endpoints local to a Node. This field can be enabled with the EndpointSliceNodeName feature gate.", + "zone": "zone is the name of the Zone this endpoint exists in.", + "hints": "hints contains information associated with how an endpoint should be consumed.", +} + +func (Endpoint) SwaggerDoc() map[string]string { + return map_Endpoint +} + +var map_EndpointConditions = map[string]string{ + "": "EndpointConditions represents the current condition of an endpoint.", + "ready": "ready indicates that this endpoint is prepared to receive traffic, according to whatever system is managing the endpoint. A nil value indicates an unknown state. In most cases consumers should interpret this unknown state as ready. For compatibility reasons, ready should never be \"true\" for terminating endpoints.", + "serving": "serving is identical to ready except that it is set regardless of the terminating state of endpoints. This condition should be set to true for a ready endpoint that is terminating. If nil, consumers should defer to the ready condition. This field can be enabled with the EndpointSliceTerminatingCondition feature gate.", + "terminating": "terminating indicates that this endpoint is terminating. A nil value indicates an unknown state. Consumers should interpret this unknown state to mean that the endpoint is not terminating. This field can be enabled with the EndpointSliceTerminatingCondition feature gate.", +} + +func (EndpointConditions) SwaggerDoc() map[string]string { + return map_EndpointConditions +} + +var map_EndpointHints = map[string]string{ + "": "EndpointHints provides hints describing how an endpoint should be consumed.", + "forZones": "forZones indicates the zone(s) this endpoint should be consumed by to enable topology aware routing.", +} + +func (EndpointHints) SwaggerDoc() map[string]string { + return map_EndpointHints +} + +var map_EndpointPort = map[string]string{ + "": "EndpointPort represents a Port used by an EndpointSlice", + "name": "The name of this port. All ports in an EndpointSlice must have a unique name. If the EndpointSlice is dervied from a Kubernetes service, this corresponds to the Service.ports[].name. Name must either be an empty string or pass DNS_LABEL validation: * must be no more than 63 characters long. * must consist of lower case alphanumeric characters or '-'. * must start and end with an alphanumeric character. Default is empty string.", + "protocol": "The IP protocol for this port. Must be UDP, TCP, or SCTP. Default is TCP.", + "port": "The port number of the endpoint. If this is not specified, ports are not restricted and must be interpreted in the context of the specific consumer.", + "appProtocol": "The application protocol for this port. This field follows standard Kubernetes label syntax. Un-prefixed names are reserved for IANA standard service names (as per RFC-6335 and http://www.iana.org/assignments/service-names). Non-standard protocols should use prefixed names such as mycompany.com/my-custom-protocol.", +} + +func (EndpointPort) SwaggerDoc() map[string]string { + return map_EndpointPort +} + +var map_EndpointSlice = map[string]string{ + "": "EndpointSlice represents a subset of the endpoints that implement a service. For a given service there may be multiple EndpointSlice objects, selected by labels, which must be joined to produce the full set of endpoints.", + "metadata": "Standard object's metadata.", + "addressType": "addressType specifies the type of address carried by this EndpointSlice. All addresses in this slice must be the same type. This field is immutable after creation. The following address types are currently supported: * IPv4: Represents an IPv4 Address. * IPv6: Represents an IPv6 Address. * FQDN: Represents a Fully Qualified Domain Name.", + "endpoints": "endpoints is a list of unique endpoints in this slice. Each slice may include a maximum of 1000 endpoints.", + "ports": "ports specifies the list of network ports exposed by each endpoint in this slice. Each port must have a unique name. When ports is empty, it indicates that there are no defined ports. When a port is defined with a nil port value, it indicates \"all ports\". Each slice may include a maximum of 100 ports.", +} + +func (EndpointSlice) SwaggerDoc() map[string]string { + return map_EndpointSlice +} + +var map_EndpointSliceList = map[string]string{ + "": "EndpointSliceList represents a list of endpoint slices", + "metadata": "Standard list metadata.", + "items": "List of endpoint slices", +} + +func (EndpointSliceList) SwaggerDoc() map[string]string { + return map_EndpointSliceList +} + +var map_ForZone = map[string]string{ + "": "ForZone provides information about which zones should consume this endpoint.", + "name": "name represents the name of the zone.", +} + +func (ForZone) SwaggerDoc() map[string]string { + return map_ForZone +} + +// AUTO-GENERATED FUNCTIONS END HERE diff --git a/vendor/k8s.io/api/discovery/v1alpha1/well_known_labels.go b/vendor/k8s.io/api/discovery/v1/well_known_labels.go similarity index 81% rename from vendor/k8s.io/api/discovery/v1alpha1/well_known_labels.go rename to vendor/k8s.io/api/discovery/v1/well_known_labels.go index 8f9c72f088e5..d949b5f1a7f1 100644 --- a/vendor/k8s.io/api/discovery/v1alpha1/well_known_labels.go +++ b/vendor/k8s.io/api/discovery/v1/well_known_labels.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package v1alpha1 +package v1 const ( // LabelServiceName is used to indicate the name of a Kubernetes service. @@ -25,4 +25,8 @@ const ( // same cluster. It is highly recommended to configure this label for all // EndpointSlices. LabelManagedBy = "endpointslice.kubernetes.io/managed-by" + // LabelSkipMirror can be set to true on an Endpoints resource to indicate + // that the EndpointSliceMirroring controller should not mirror this + // resource with EndpointSlices. + LabelSkipMirror = "endpointslice.kubernetes.io/skip-mirror" ) diff --git a/vendor/k8s.io/api/discovery/v1/zz_generated.deepcopy.go b/vendor/k8s.io/api/discovery/v1/zz_generated.deepcopy.go new file mode 100644 index 000000000000..31a912386f19 --- /dev/null +++ b/vendor/k8s.io/api/discovery/v1/zz_generated.deepcopy.go @@ -0,0 +1,257 @@ +// +build !ignore_autogenerated + +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by deepcopy-gen. DO NOT EDIT. + +package v1 + +import ( + corev1 "k8s.io/api/core/v1" + runtime "k8s.io/apimachinery/pkg/runtime" +) + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Endpoint) DeepCopyInto(out *Endpoint) { + *out = *in + if in.Addresses != nil { + in, out := &in.Addresses, &out.Addresses + *out = make([]string, len(*in)) + copy(*out, *in) + } + in.Conditions.DeepCopyInto(&out.Conditions) + if in.Hostname != nil { + in, out := &in.Hostname, &out.Hostname + *out = new(string) + **out = **in + } + if in.TargetRef != nil { + in, out := &in.TargetRef, &out.TargetRef + *out = new(corev1.ObjectReference) + **out = **in + } + if in.DeprecatedTopology != nil { + in, out := &in.DeprecatedTopology, &out.DeprecatedTopology + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } + if in.NodeName != nil { + in, out := &in.NodeName, &out.NodeName + *out = new(string) + **out = **in + } + if in.Zone != nil { + in, out := &in.Zone, &out.Zone + *out = new(string) + **out = **in + } + if in.Hints != nil { + in, out := &in.Hints, &out.Hints + *out = new(EndpointHints) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Endpoint. +func (in *Endpoint) DeepCopy() *Endpoint { + if in == nil { + return nil + } + out := new(Endpoint) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *EndpointConditions) DeepCopyInto(out *EndpointConditions) { + *out = *in + if in.Ready != nil { + in, out := &in.Ready, &out.Ready + *out = new(bool) + **out = **in + } + if in.Serving != nil { + in, out := &in.Serving, &out.Serving + *out = new(bool) + **out = **in + } + if in.Terminating != nil { + in, out := &in.Terminating, &out.Terminating + *out = new(bool) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EndpointConditions. +func (in *EndpointConditions) DeepCopy() *EndpointConditions { + if in == nil { + return nil + } + out := new(EndpointConditions) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *EndpointHints) DeepCopyInto(out *EndpointHints) { + *out = *in + if in.ForZones != nil { + in, out := &in.ForZones, &out.ForZones + *out = make([]ForZone, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EndpointHints. +func (in *EndpointHints) DeepCopy() *EndpointHints { + if in == nil { + return nil + } + out := new(EndpointHints) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *EndpointPort) DeepCopyInto(out *EndpointPort) { + *out = *in + if in.Name != nil { + in, out := &in.Name, &out.Name + *out = new(string) + **out = **in + } + if in.Protocol != nil { + in, out := &in.Protocol, &out.Protocol + *out = new(corev1.Protocol) + **out = **in + } + if in.Port != nil { + in, out := &in.Port, &out.Port + *out = new(int32) + **out = **in + } + if in.AppProtocol != nil { + in, out := &in.AppProtocol, &out.AppProtocol + *out = new(string) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EndpointPort. +func (in *EndpointPort) DeepCopy() *EndpointPort { + if in == nil { + return nil + } + out := new(EndpointPort) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *EndpointSlice) DeepCopyInto(out *EndpointSlice) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + if in.Endpoints != nil { + in, out := &in.Endpoints, &out.Endpoints + *out = make([]Endpoint, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.Ports != nil { + in, out := &in.Ports, &out.Ports + *out = make([]EndpointPort, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EndpointSlice. +func (in *EndpointSlice) DeepCopy() *EndpointSlice { + if in == nil { + return nil + } + out := new(EndpointSlice) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *EndpointSlice) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *EndpointSliceList) DeepCopyInto(out *EndpointSliceList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]EndpointSlice, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EndpointSliceList. +func (in *EndpointSliceList) DeepCopy() *EndpointSliceList { + if in == nil { + return nil + } + out := new(EndpointSliceList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *EndpointSliceList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ForZone) DeepCopyInto(out *ForZone) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ForZone. +func (in *ForZone) DeepCopy() *ForZone { + if in == nil { + return nil + } + out := new(ForZone) + in.DeepCopyInto(out) + return out +} diff --git a/vendor/k8s.io/api/discovery/v1alpha1/BUILD b/vendor/k8s.io/api/discovery/v1alpha1/BUILD deleted file mode 100644 index 283479e10c0e..000000000000 --- a/vendor/k8s.io/api/discovery/v1alpha1/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "well_known_labels.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/api/discovery/v1alpha1", - importpath = "k8s.io/api/discovery/v1alpha1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/discovery/v1alpha1/doc.go b/vendor/k8s.io/api/discovery/v1alpha1/doc.go deleted file mode 100644 index ffd6b0b54d45..000000000000 --- a/vendor/k8s.io/api/discovery/v1alpha1/doc.go +++ /dev/null @@ -1,22 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// +k8s:deepcopy-gen=package -// +k8s:protobuf-gen=package -// +k8s:openapi-gen=true -// +groupName=discovery.k8s.io - -package v1alpha1 // import "k8s.io/api/discovery/v1alpha1" diff --git a/vendor/k8s.io/api/discovery/v1alpha1/generated.pb.go b/vendor/k8s.io/api/discovery/v1alpha1/generated.pb.go deleted file mode 100644 index 5cbee6168c15..000000000000 --- a/vendor/k8s.io/api/discovery/v1alpha1/generated.pb.go +++ /dev/null @@ -1,1823 +0,0 @@ -/* -Copyright The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: k8s.io/kubernetes/vendor/k8s.io/api/discovery/v1alpha1/generated.proto - -package v1alpha1 - -import ( - fmt "fmt" - - io "io" - - proto "github.com/gogo/protobuf/proto" - github_com_gogo_protobuf_sortkeys "github.com/gogo/protobuf/sortkeys" - k8s_io_api_core_v1 "k8s.io/api/core/v1" - v1 "k8s.io/api/core/v1" - - math "math" - math_bits "math/bits" - reflect "reflect" - strings "strings" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -func (m *Endpoint) Reset() { *m = Endpoint{} } -func (*Endpoint) ProtoMessage() {} -func (*Endpoint) Descriptor() ([]byte, []int) { - return fileDescriptor_772f83c5b34e07a5, []int{0} -} -func (m *Endpoint) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Endpoint) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (m *Endpoint) XXX_Merge(src proto.Message) { - xxx_messageInfo_Endpoint.Merge(m, src) -} -func (m *Endpoint) XXX_Size() int { - return m.Size() -} -func (m *Endpoint) XXX_DiscardUnknown() { - xxx_messageInfo_Endpoint.DiscardUnknown(m) -} - -var xxx_messageInfo_Endpoint proto.InternalMessageInfo - -func (m *EndpointConditions) Reset() { *m = EndpointConditions{} } -func (*EndpointConditions) ProtoMessage() {} -func (*EndpointConditions) Descriptor() ([]byte, []int) { - return fileDescriptor_772f83c5b34e07a5, []int{1} -} -func (m *EndpointConditions) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *EndpointConditions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (m *EndpointConditions) XXX_Merge(src proto.Message) { - xxx_messageInfo_EndpointConditions.Merge(m, src) -} -func (m *EndpointConditions) XXX_Size() int { - return m.Size() -} -func (m *EndpointConditions) XXX_DiscardUnknown() { - xxx_messageInfo_EndpointConditions.DiscardUnknown(m) -} - -var xxx_messageInfo_EndpointConditions proto.InternalMessageInfo - -func (m *EndpointPort) Reset() { *m = EndpointPort{} } -func (*EndpointPort) ProtoMessage() {} -func (*EndpointPort) Descriptor() ([]byte, []int) { - return fileDescriptor_772f83c5b34e07a5, []int{2} -} -func (m *EndpointPort) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *EndpointPort) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (m *EndpointPort) XXX_Merge(src proto.Message) { - xxx_messageInfo_EndpointPort.Merge(m, src) -} -func (m *EndpointPort) XXX_Size() int { - return m.Size() -} -func (m *EndpointPort) XXX_DiscardUnknown() { - xxx_messageInfo_EndpointPort.DiscardUnknown(m) -} - -var xxx_messageInfo_EndpointPort proto.InternalMessageInfo - -func (m *EndpointSlice) Reset() { *m = EndpointSlice{} } -func (*EndpointSlice) ProtoMessage() {} -func (*EndpointSlice) Descriptor() ([]byte, []int) { - return fileDescriptor_772f83c5b34e07a5, []int{3} -} -func (m *EndpointSlice) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *EndpointSlice) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (m *EndpointSlice) XXX_Merge(src proto.Message) { - xxx_messageInfo_EndpointSlice.Merge(m, src) -} -func (m *EndpointSlice) XXX_Size() int { - return m.Size() -} -func (m *EndpointSlice) XXX_DiscardUnknown() { - xxx_messageInfo_EndpointSlice.DiscardUnknown(m) -} - -var xxx_messageInfo_EndpointSlice proto.InternalMessageInfo - -func (m *EndpointSliceList) Reset() { *m = EndpointSliceList{} } -func (*EndpointSliceList) ProtoMessage() {} -func (*EndpointSliceList) Descriptor() ([]byte, []int) { - return fileDescriptor_772f83c5b34e07a5, []int{4} -} -func (m *EndpointSliceList) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *EndpointSliceList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (m *EndpointSliceList) XXX_Merge(src proto.Message) { - xxx_messageInfo_EndpointSliceList.Merge(m, src) -} -func (m *EndpointSliceList) XXX_Size() int { - return m.Size() -} -func (m *EndpointSliceList) XXX_DiscardUnknown() { - xxx_messageInfo_EndpointSliceList.DiscardUnknown(m) -} - -var xxx_messageInfo_EndpointSliceList proto.InternalMessageInfo - -func init() { - proto.RegisterType((*Endpoint)(nil), "k8s.io.api.discovery.v1alpha1.Endpoint") - proto.RegisterMapType((map[string]string)(nil), "k8s.io.api.discovery.v1alpha1.Endpoint.TopologyEntry") - proto.RegisterType((*EndpointConditions)(nil), "k8s.io.api.discovery.v1alpha1.EndpointConditions") - proto.RegisterType((*EndpointPort)(nil), "k8s.io.api.discovery.v1alpha1.EndpointPort") - proto.RegisterType((*EndpointSlice)(nil), "k8s.io.api.discovery.v1alpha1.EndpointSlice") - proto.RegisterType((*EndpointSliceList)(nil), "k8s.io.api.discovery.v1alpha1.EndpointSliceList") -} - -func init() { - proto.RegisterFile("k8s.io/kubernetes/vendor/k8s.io/api/discovery/v1alpha1/generated.proto", fileDescriptor_772f83c5b34e07a5) -} - -var fileDescriptor_772f83c5b34e07a5 = []byte{ - // 801 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x53, 0x4d, 0x8f, 0xe3, 0x44, - 0x10, 0x8d, 0x27, 0x13, 0xd6, 0xee, 0xec, 0x88, 0xdd, 0x16, 0x87, 0x68, 0x00, 0x7b, 0x14, 0x84, - 0x88, 0x34, 0xd0, 0x26, 0x23, 0x40, 0x2b, 0x38, 0x8d, 0x61, 0xf9, 0x90, 0x60, 0x19, 0x7a, 0xe7, - 0x80, 0x10, 0x07, 0x7a, 0xec, 0x5a, 0xc7, 0x24, 0x76, 0x5b, 0xdd, 0x9d, 0x48, 0xb9, 0xf1, 0x0f, - 0xe0, 0x47, 0x21, 0x34, 0xc7, 0x3d, 0xee, 0xc9, 0x62, 0xbc, 0x12, 0x3f, 0x62, 0x4f, 0xa8, 0xdb, - 0x9f, 0x43, 0x80, 0xcd, 0xcd, 0xfd, 0xaa, 0xde, 0xab, 0x7a, 0xe5, 0x2a, 0xf4, 0xf9, 0xf2, 0x81, - 0x24, 0x09, 0xf7, 0x97, 0xeb, 0x2b, 0x10, 0x19, 0x28, 0x90, 0xfe, 0x06, 0xb2, 0x88, 0x0b, 0xbf, - 0x0e, 0xb0, 0x3c, 0xf1, 0xa3, 0x44, 0x86, 0x7c, 0x03, 0x62, 0xeb, 0x6f, 0xe6, 0x6c, 0x95, 0x2f, - 0xd8, 0xdc, 0x8f, 0x21, 0x03, 0xc1, 0x14, 0x44, 0x24, 0x17, 0x5c, 0x71, 0xfc, 0x66, 0x95, 0x4e, - 0x58, 0x9e, 0x90, 0x36, 0x9d, 0x34, 0xe9, 0xc7, 0xef, 0xc5, 0x89, 0x5a, 0xac, 0xaf, 0x48, 0xc8, - 0x53, 0x3f, 0xe6, 0x31, 0xf7, 0x0d, 0xeb, 0x6a, 0xfd, 0xc4, 0xbc, 0xcc, 0xc3, 0x7c, 0x55, 0x6a, - 0xc7, 0xd3, 0x5e, 0xf1, 0x90, 0x0b, 0xf0, 0x37, 0x3b, 0x15, 0x8f, 0x3f, 0xe8, 0x72, 0x52, 0x16, - 0x2e, 0x92, 0x4c, 0xf7, 0x97, 0x2f, 0x63, 0x0d, 0x48, 0x3f, 0x05, 0xc5, 0xfe, 0x8d, 0xe5, 0xff, - 0x17, 0x4b, 0xac, 0x33, 0x95, 0xa4, 0xb0, 0x43, 0xf8, 0xe8, 0x65, 0x04, 0x19, 0x2e, 0x20, 0x65, - 0xff, 0xe4, 0x4d, 0xff, 0x1a, 0x22, 0xfb, 0x61, 0x16, 0xe5, 0x3c, 0xc9, 0x14, 0x3e, 0x45, 0x0e, - 0x8b, 0x22, 0x01, 0x52, 0x82, 0x9c, 0x58, 0x27, 0xc3, 0x99, 0x13, 0x1c, 0x95, 0x85, 0xe7, 0x9c, - 0x37, 0x20, 0xed, 0xe2, 0x18, 0x10, 0x0a, 0x79, 0x16, 0x25, 0x2a, 0xe1, 0x99, 0x9c, 0x1c, 0x9c, - 0x58, 0xb3, 0xf1, 0xd9, 0x9c, 0xfc, 0xef, 0x7c, 0x49, 0x53, 0xe9, 0xd3, 0x96, 0x18, 0xe0, 0xeb, - 0xc2, 0x1b, 0x94, 0x85, 0x87, 0x3a, 0x8c, 0xf6, 0x84, 0xf1, 0x0c, 0xd9, 0x0b, 0x2e, 0x55, 0xc6, - 0x52, 0x98, 0x0c, 0x4f, 0xac, 0x99, 0x13, 0xdc, 0x2d, 0x0b, 0xcf, 0xfe, 0xb2, 0xc6, 0x68, 0x1b, - 0xc5, 0x17, 0xc8, 0x51, 0x4c, 0xc4, 0xa0, 0x28, 0x3c, 0x99, 0x1c, 0x9a, 0x7e, 0xde, 0xea, 0xf7, - 0xa3, 0xff, 0x10, 0xd9, 0xcc, 0xc9, 0xb7, 0x57, 0x3f, 0x43, 0xa8, 0x93, 0x40, 0x40, 0x16, 0x42, - 0x65, 0xf1, 0xb2, 0x61, 0xd2, 0x4e, 0x04, 0x87, 0xc8, 0x56, 0x3c, 0xe7, 0x2b, 0x1e, 0x6f, 0x27, - 0xa3, 0x93, 0xe1, 0x6c, 0x7c, 0xf6, 0xe1, 0x9e, 0x06, 0xc9, 0x65, 0xcd, 0x7b, 0x98, 0x29, 0xb1, - 0x0d, 0xee, 0xd5, 0x26, 0xed, 0x06, 0xa6, 0xad, 0xb0, 0x36, 0x98, 0xf1, 0x08, 0x1e, 0x69, 0x83, - 0xaf, 0x74, 0x06, 0x1f, 0xd5, 0x18, 0x6d, 0xa3, 0xc7, 0x9f, 0xa0, 0xa3, 0x5b, 0xb2, 0xf8, 0x1e, - 0x1a, 0x2e, 0x61, 0x3b, 0xb1, 0x34, 0x8b, 0xea, 0x4f, 0xfc, 0x1a, 0x1a, 0x6d, 0xd8, 0x6a, 0x0d, - 0xe6, 0x7f, 0x38, 0xb4, 0x7a, 0x7c, 0x7c, 0xf0, 0xc0, 0x9a, 0xfe, 0x6a, 0x21, 0xbc, 0x3b, 0x7e, - 0xec, 0xa1, 0x91, 0x00, 0x16, 0x55, 0x22, 0x76, 0xe0, 0x94, 0x85, 0x37, 0xa2, 0x1a, 0xa0, 0x15, - 0x8e, 0xdf, 0x46, 0x77, 0x24, 0x88, 0x4d, 0x92, 0xc5, 0x46, 0xd3, 0x0e, 0xc6, 0x65, 0xe1, 0xdd, - 0x79, 0x5c, 0x41, 0xb4, 0x89, 0xe1, 0x39, 0x1a, 0x2b, 0x10, 0x69, 0x92, 0x31, 0xa5, 0x53, 0x87, - 0x26, 0xf5, 0xd5, 0xb2, 0xf0, 0xc6, 0x97, 0x1d, 0x4c, 0xfb, 0x39, 0xd3, 0x3f, 0x2c, 0x74, 0xb7, - 0xe9, 0xe8, 0x82, 0x0b, 0x85, 0xdf, 0x40, 0x87, 0xe6, 0x37, 0x1b, 0x3f, 0x81, 0x5d, 0x16, 0xde, - 0xa1, 0x99, 0x80, 0x41, 0xf1, 0x17, 0xc8, 0x36, 0x2b, 0x1b, 0xf2, 0x55, 0xe5, 0x2e, 0x38, 0xd5, - 0x73, 0xba, 0xa8, 0xb1, 0x17, 0x85, 0xf7, 0xfa, 0xee, 0x39, 0x92, 0x26, 0x4c, 0x5b, 0xb2, 0x2e, - 0x93, 0x73, 0xa1, 0x4c, 0x8f, 0xa3, 0xaa, 0x8c, 0x2e, 0x4f, 0x0d, 0xaa, 0x8d, 0xb0, 0x3c, 0x6f, - 0x68, 0x66, 0x8f, 0x9c, 0xca, 0xc8, 0x79, 0x07, 0xd3, 0x7e, 0xce, 0xf4, 0xf9, 0x01, 0x3a, 0x6a, - 0x8c, 0x3c, 0x5e, 0x25, 0x21, 0xe0, 0x9f, 0x90, 0xad, 0x2f, 0x3b, 0x62, 0x8a, 0x19, 0x37, 0xe3, - 0xb3, 0xf7, 0x7b, 0x8b, 0xd3, 0x1e, 0x28, 0xc9, 0x97, 0xb1, 0x06, 0x24, 0xd1, 0xd9, 0xdd, 0x6e, - 0x7e, 0x03, 0x8a, 0x75, 0x87, 0xd1, 0x61, 0xb4, 0x55, 0xc5, 0x9f, 0xa1, 0x71, 0x7d, 0x8a, 0x97, - 0xdb, 0x1c, 0xea, 0x36, 0xa7, 0x35, 0x65, 0x7c, 0xde, 0x85, 0x5e, 0xdc, 0x7e, 0xd2, 0x3e, 0x0d, - 0x7f, 0x8f, 0x1c, 0xa8, 0x1b, 0xd7, 0x27, 0xac, 0x37, 0xfc, 0x9d, 0x3d, 0x37, 0x3c, 0xb8, 0x5f, - 0x17, 0x73, 0x1a, 0x44, 0xd2, 0x4e, 0x0c, 0x5f, 0xa0, 0x91, 0x1e, 0xa7, 0x9c, 0x0c, 0x8d, 0xea, - 0xe9, 0x9e, 0xaa, 0xfa, 0x47, 0x04, 0x47, 0xb5, 0xf2, 0x48, 0xbf, 0x24, 0xad, 0x84, 0xa6, 0xbf, - 0x5b, 0xe8, 0xfe, 0xad, 0x29, 0x7f, 0x9d, 0x48, 0x85, 0x7f, 0xdc, 0x99, 0x34, 0xd9, 0x6f, 0xd2, - 0x9a, 0x6d, 0xe6, 0xdc, 0xde, 0x66, 0x83, 0xf4, 0xa6, 0xfc, 0x1d, 0x1a, 0x25, 0x0a, 0xd2, 0x66, - 0x36, 0xef, 0xee, 0xe9, 0xc2, 0xb4, 0xd7, 0xd9, 0xf8, 0x4a, 0x4b, 0xd0, 0x4a, 0x29, 0x20, 0xd7, - 0x37, 0xee, 0xe0, 0xe9, 0x8d, 0x3b, 0x78, 0x76, 0xe3, 0x0e, 0x7e, 0x29, 0x5d, 0xeb, 0xba, 0x74, - 0xad, 0xa7, 0xa5, 0x6b, 0x3d, 0x2b, 0x5d, 0xeb, 0xcf, 0xd2, 0xb5, 0x7e, 0x7b, 0xee, 0x0e, 0x7e, - 0xb0, 0x1b, 0xcd, 0xbf, 0x03, 0x00, 0x00, 0xff, 0xff, 0x03, 0x95, 0x92, 0xa5, 0xfa, 0x06, 0x00, - 0x00, -} - -func (m *Endpoint) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Endpoint) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Endpoint) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.NodeName != nil { - i -= len(*m.NodeName) - copy(dAtA[i:], *m.NodeName) - i = encodeVarintGenerated(dAtA, i, uint64(len(*m.NodeName))) - i-- - dAtA[i] = 0x32 - } - if len(m.Topology) > 0 { - keysForTopology := make([]string, 0, len(m.Topology)) - for k := range m.Topology { - keysForTopology = append(keysForTopology, string(k)) - } - github_com_gogo_protobuf_sortkeys.Strings(keysForTopology) - for iNdEx := len(keysForTopology) - 1; iNdEx >= 0; iNdEx-- { - v := m.Topology[string(keysForTopology[iNdEx])] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintGenerated(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(keysForTopology[iNdEx]) - copy(dAtA[i:], keysForTopology[iNdEx]) - i = encodeVarintGenerated(dAtA, i, uint64(len(keysForTopology[iNdEx]))) - i-- - dAtA[i] = 0xa - i = encodeVarintGenerated(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x2a - } - } - if m.TargetRef != nil { - { - size, err := m.TargetRef.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - if m.Hostname != nil { - i -= len(*m.Hostname) - copy(dAtA[i:], *m.Hostname) - i = encodeVarintGenerated(dAtA, i, uint64(len(*m.Hostname))) - i-- - dAtA[i] = 0x1a - } - { - size, err := m.Conditions.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - if len(m.Addresses) > 0 { - for iNdEx := len(m.Addresses) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Addresses[iNdEx]) - copy(dAtA[i:], m.Addresses[iNdEx]) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Addresses[iNdEx]))) - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *EndpointConditions) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *EndpointConditions) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EndpointConditions) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Terminating != nil { - i-- - if *m.Terminating { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x18 - } - if m.Serving != nil { - i-- - if *m.Serving { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x10 - } - if m.Ready != nil { - i-- - if *m.Ready { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *EndpointPort) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *EndpointPort) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EndpointPort) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.AppProtocol != nil { - i -= len(*m.AppProtocol) - copy(dAtA[i:], *m.AppProtocol) - i = encodeVarintGenerated(dAtA, i, uint64(len(*m.AppProtocol))) - i-- - dAtA[i] = 0x22 - } - if m.Port != nil { - i = encodeVarintGenerated(dAtA, i, uint64(*m.Port)) - i-- - dAtA[i] = 0x18 - } - if m.Protocol != nil { - i -= len(*m.Protocol) - copy(dAtA[i:], *m.Protocol) - i = encodeVarintGenerated(dAtA, i, uint64(len(*m.Protocol))) - i-- - dAtA[i] = 0x12 - } - if m.Name != nil { - i -= len(*m.Name) - copy(dAtA[i:], *m.Name) - i = encodeVarintGenerated(dAtA, i, uint64(len(*m.Name))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *EndpointSlice) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *EndpointSlice) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EndpointSlice) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - i -= len(m.AddressType) - copy(dAtA[i:], m.AddressType) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.AddressType))) - i-- - dAtA[i] = 0x22 - if len(m.Ports) > 0 { - for iNdEx := len(m.Ports) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Ports[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - } - if len(m.Endpoints) > 0 { - for iNdEx := len(m.Endpoints) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Endpoints[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - { - size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *EndpointSliceList) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *EndpointSliceList) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EndpointSliceList) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Items) > 0 { - for iNdEx := len(m.Items) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Items[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - { - size, err := m.ListMeta.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func encodeVarintGenerated(dAtA []byte, offset int, v uint64) int { - offset -= sovGenerated(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *Endpoint) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Addresses) > 0 { - for _, s := range m.Addresses { - l = len(s) - n += 1 + l + sovGenerated(uint64(l)) - } - } - l = m.Conditions.Size() - n += 1 + l + sovGenerated(uint64(l)) - if m.Hostname != nil { - l = len(*m.Hostname) - n += 1 + l + sovGenerated(uint64(l)) - } - if m.TargetRef != nil { - l = m.TargetRef.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - if len(m.Topology) > 0 { - for k, v := range m.Topology { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + len(v) + sovGenerated(uint64(len(v))) - n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) - } - } - if m.NodeName != nil { - l = len(*m.NodeName) - n += 1 + l + sovGenerated(uint64(l)) - } - return n -} - -func (m *EndpointConditions) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Ready != nil { - n += 2 - } - if m.Serving != nil { - n += 2 - } - if m.Terminating != nil { - n += 2 - } - return n -} - -func (m *EndpointPort) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Name != nil { - l = len(*m.Name) - n += 1 + l + sovGenerated(uint64(l)) - } - if m.Protocol != nil { - l = len(*m.Protocol) - n += 1 + l + sovGenerated(uint64(l)) - } - if m.Port != nil { - n += 1 + sovGenerated(uint64(*m.Port)) - } - if m.AppProtocol != nil { - l = len(*m.AppProtocol) - n += 1 + l + sovGenerated(uint64(l)) - } - return n -} - -func (m *EndpointSlice) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.ObjectMeta.Size() - n += 1 + l + sovGenerated(uint64(l)) - if len(m.Endpoints) > 0 { - for _, e := range m.Endpoints { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - } - if len(m.Ports) > 0 { - for _, e := range m.Ports { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - } - l = len(m.AddressType) - n += 1 + l + sovGenerated(uint64(l)) - return n -} - -func (m *EndpointSliceList) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.ListMeta.Size() - n += 1 + l + sovGenerated(uint64(l)) - if len(m.Items) > 0 { - for _, e := range m.Items { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - } - return n -} - -func sovGenerated(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozGenerated(x uint64) (n int) { - return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (this *Endpoint) String() string { - if this == nil { - return "nil" - } - keysForTopology := make([]string, 0, len(this.Topology)) - for k := range this.Topology { - keysForTopology = append(keysForTopology, k) - } - github_com_gogo_protobuf_sortkeys.Strings(keysForTopology) - mapStringForTopology := "map[string]string{" - for _, k := range keysForTopology { - mapStringForTopology += fmt.Sprintf("%v: %v,", k, this.Topology[k]) - } - mapStringForTopology += "}" - s := strings.Join([]string{`&Endpoint{`, - `Addresses:` + fmt.Sprintf("%v", this.Addresses) + `,`, - `Conditions:` + strings.Replace(strings.Replace(this.Conditions.String(), "EndpointConditions", "EndpointConditions", 1), `&`, ``, 1) + `,`, - `Hostname:` + valueToStringGenerated(this.Hostname) + `,`, - `TargetRef:` + strings.Replace(fmt.Sprintf("%v", this.TargetRef), "ObjectReference", "v1.ObjectReference", 1) + `,`, - `Topology:` + mapStringForTopology + `,`, - `NodeName:` + valueToStringGenerated(this.NodeName) + `,`, - `}`, - }, "") - return s -} -func (this *EndpointConditions) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&EndpointConditions{`, - `Ready:` + valueToStringGenerated(this.Ready) + `,`, - `Serving:` + valueToStringGenerated(this.Serving) + `,`, - `Terminating:` + valueToStringGenerated(this.Terminating) + `,`, - `}`, - }, "") - return s -} -func (this *EndpointPort) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&EndpointPort{`, - `Name:` + valueToStringGenerated(this.Name) + `,`, - `Protocol:` + valueToStringGenerated(this.Protocol) + `,`, - `Port:` + valueToStringGenerated(this.Port) + `,`, - `AppProtocol:` + valueToStringGenerated(this.AppProtocol) + `,`, - `}`, - }, "") - return s -} -func (this *EndpointSlice) String() string { - if this == nil { - return "nil" - } - repeatedStringForEndpoints := "[]Endpoint{" - for _, f := range this.Endpoints { - repeatedStringForEndpoints += strings.Replace(strings.Replace(f.String(), "Endpoint", "Endpoint", 1), `&`, ``, 1) + "," - } - repeatedStringForEndpoints += "}" - repeatedStringForPorts := "[]EndpointPort{" - for _, f := range this.Ports { - repeatedStringForPorts += strings.Replace(strings.Replace(f.String(), "EndpointPort", "EndpointPort", 1), `&`, ``, 1) + "," - } - repeatedStringForPorts += "}" - s := strings.Join([]string{`&EndpointSlice{`, - `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v11.ObjectMeta", 1), `&`, ``, 1) + `,`, - `Endpoints:` + repeatedStringForEndpoints + `,`, - `Ports:` + repeatedStringForPorts + `,`, - `AddressType:` + fmt.Sprintf("%v", this.AddressType) + `,`, - `}`, - }, "") - return s -} -func (this *EndpointSliceList) String() string { - if this == nil { - return "nil" - } - repeatedStringForItems := "[]EndpointSlice{" - for _, f := range this.Items { - repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "EndpointSlice", "EndpointSlice", 1), `&`, ``, 1) + "," - } - repeatedStringForItems += "}" - s := strings.Join([]string{`&EndpointSliceList{`, - `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v11.ListMeta", 1), `&`, ``, 1) + `,`, - `Items:` + repeatedStringForItems + `,`, - `}`, - }, "") - return s -} -func valueToStringGenerated(v interface{}) string { - rv := reflect.ValueOf(v) - if rv.IsNil() { - return "nil" - } - pv := reflect.Indirect(rv).Interface() - return fmt.Sprintf("*%v", pv) -} -func (m *Endpoint) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Endpoint: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Endpoint: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Addresses", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Addresses = append(m.Addresses, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Conditions", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Conditions.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Hostname", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - s := string(dAtA[iNdEx:postIndex]) - m.Hostname = &s - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TargetRef", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.TargetRef == nil { - m.TargetRef = &v1.ObjectReference{} - } - if err := m.TargetRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Topology", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Topology == nil { - m.Topology = make(map[string]string) - } - var mapkey string - var mapvalue string - for iNdEx < postIndex { - entryPreIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - if fieldNum == 1 { - var stringLenmapkey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLenmapkey |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLenmapkey := int(stringLenmapkey) - if intStringLenmapkey < 0 { - return ErrInvalidLengthGenerated - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthGenerated - } - if postStringIndexmapkey > l { - return io.ErrUnexpectedEOF - } - mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) - iNdEx = postStringIndexmapkey - } else if fieldNum == 2 { - var stringLenmapvalue uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLenmapvalue |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLenmapvalue := int(stringLenmapvalue) - if intStringLenmapvalue < 0 { - return ErrInvalidLengthGenerated - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthGenerated - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.Topology[mapkey] = mapvalue - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field NodeName", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - s := string(dAtA[iNdEx:postIndex]) - m.NodeName = &s - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *EndpointConditions) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: EndpointConditions: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: EndpointConditions: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Ready", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - b := bool(v != 0) - m.Ready = &b - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Serving", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - b := bool(v != 0) - m.Serving = &b - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Terminating", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - b := bool(v != 0) - m.Terminating = &b - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *EndpointPort) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: EndpointPort: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: EndpointPort: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - s := string(dAtA[iNdEx:postIndex]) - m.Name = &s - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Protocol", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - s := k8s_io_api_core_v1.Protocol(dAtA[iNdEx:postIndex]) - m.Protocol = &s - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Port", wireType) - } - var v int32 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Port = &v - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AppProtocol", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - s := string(dAtA[iNdEx:postIndex]) - m.AppProtocol = &s - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *EndpointSlice) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: EndpointSlice: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: EndpointSlice: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Endpoints", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Endpoints = append(m.Endpoints, Endpoint{}) - if err := m.Endpoints[len(m.Endpoints)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Ports", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Ports = append(m.Ports, EndpointPort{}) - if err := m.Ports[len(m.Ports)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AddressType", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.AddressType = AddressType(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *EndpointSliceList) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: EndpointSliceList: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: EndpointSliceList: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Items = append(m.Items, EndpointSlice{}) - if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipGenerated(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowGenerated - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowGenerated - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowGenerated - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthGenerated - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupGenerated - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthGenerated - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthGenerated = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowGenerated = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupGenerated = fmt.Errorf("proto: unexpected end of group") -) diff --git a/vendor/k8s.io/api/discovery/v1alpha1/generated.proto b/vendor/k8s.io/api/discovery/v1alpha1/generated.proto deleted file mode 100644 index 4b66a6c57bfa..000000000000 --- a/vendor/k8s.io/api/discovery/v1alpha1/generated.proto +++ /dev/null @@ -1,179 +0,0 @@ -/* -Copyright The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -// This file was autogenerated by go-to-protobuf. Do not edit it manually! - -syntax = "proto2"; - -package k8s.io.api.discovery.v1alpha1; - -import "k8s.io/api/core/v1/generated.proto"; -import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; -import "k8s.io/apimachinery/pkg/runtime/generated.proto"; -import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; - -// Package-wide variables from generator "generated". -option go_package = "v1alpha1"; - -// Endpoint represents a single logical "backend" implementing a service. -message Endpoint { - // addresses of this endpoint. The contents of this field are interpreted - // according to the corresponding EndpointSlice addressType field. Consumers - // must handle different types of addresses in the context of their own - // capabilities. This must contain at least one address but no more than - // 100. - // +listType=set - repeated string addresses = 1; - - // conditions contains information about the current status of the endpoint. - optional EndpointConditions conditions = 2; - - // hostname of this endpoint. This field may be used by consumers of - // endpoints to distinguish endpoints from each other (e.g. in DNS names). - // Multiple endpoints which use the same hostname should be considered - // fungible (e.g. multiple A values in DNS). Must be lowercase and pass - // DNS label (RFC 1123) validation. - // +optional - optional string hostname = 3; - - // targetRef is a reference to a Kubernetes object that represents this - // endpoint. - // +optional - optional k8s.io.api.core.v1.ObjectReference targetRef = 4; - - // topology contains arbitrary topology information associated with the - // endpoint. These key/value pairs must conform with the label format. - // https://kubernetes.io/docs/concepts/overview/working-with-objects/labels - // Topology may include a maximum of 16 key/value pairs. This includes, but - // is not limited to the following well known keys: - // * kubernetes.io/hostname: the value indicates the hostname of the node - // where the endpoint is located. This should match the corresponding - // node label. - // * topology.kubernetes.io/zone: the value indicates the zone where the - // endpoint is located. This should match the corresponding node label. - // * topology.kubernetes.io/region: the value indicates the region where the - // endpoint is located. This should match the corresponding node label. - // This field is deprecated and will be removed in future api versions. - // +optional - map topology = 5; - - // nodeName represents the name of the Node hosting this endpoint. This can - // be used to determine endpoints local to a Node. This field can be enabled - // with the EndpointSliceNodeName feature gate. - // +optional - optional string nodeName = 6; -} - -// EndpointConditions represents the current condition of an endpoint. -message EndpointConditions { - // ready indicates that this endpoint is prepared to receive traffic, - // according to whatever system is managing the endpoint. A nil value - // indicates an unknown state. In most cases consumers should interpret this - // unknown state as ready. For compatibility reasons, ready should never be - // "true" for terminating endpoints. - // +optional - optional bool ready = 1; - - // serving is identical to ready except that it is set regardless of the - // terminating state of endpoints. This condition should be set to true for - // a ready endpoint that is terminating. If nil, consumers should defer to - // the ready condition. This field can be enabled with the - // EndpointSliceTerminatingCondition feature gate. - // +optional - optional bool serving = 2; - - // terminating indicates that this endpoint is terminating. A nil value - // indicates an unknown state. Consumers should interpret this unknown state - // to mean that the endpoint is not terminating. This field can be enabled - // with the EndpointSliceTerminatingCondition feature gate. - // +optional - optional bool terminating = 3; -} - -// EndpointPort represents a Port used by an EndpointSlice -message EndpointPort { - // The name of this port. All ports in an EndpointSlice must have a unique - // name. If the EndpointSlice is dervied from a Kubernetes service, this - // corresponds to the Service.ports[].name. - // Name must either be an empty string or pass DNS_LABEL validation: - // * must be no more than 63 characters long. - // * must consist of lower case alphanumeric characters or '-'. - // * must start and end with an alphanumeric character. - // Default is empty string. - optional string name = 1; - - // The IP protocol for this port. - // Must be UDP, TCP, or SCTP. - // Default is TCP. - optional string protocol = 2; - - // The port number of the endpoint. - // If this is not specified, ports are not restricted and must be - // interpreted in the context of the specific consumer. - optional int32 port = 3; - - // The application protocol for this port. - // This field follows standard Kubernetes label syntax. - // Un-prefixed names are reserved for IANA standard service names (as per - // RFC-6335 and http://www.iana.org/assignments/service-names). - // Non-standard protocols should use prefixed names. - // Default is empty string. - optional string appProtocol = 4; -} - -// EndpointSlice represents a subset of the endpoints that implement a service. -// For a given service there may be multiple EndpointSlice objects, selected by -// labels, which must be joined to produce the full set of endpoints. -message EndpointSlice { - // Standard object's metadata. - // +optional - optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; - - // addressType specifies the type of address carried by this EndpointSlice. - // All addresses in this slice must be the same type. This field is - // immutable after creation. The following address types are currently - // supported: - // * IPv4: Represents an IPv4 Address. - // * IPv6: Represents an IPv6 Address. - // * FQDN: Represents a Fully Qualified Domain Name. - optional string addressType = 4; - - // endpoints is a list of unique endpoints in this slice. Each slice may - // include a maximum of 1000 endpoints. - // +listType=atomic - repeated Endpoint endpoints = 2; - - // ports specifies the list of network ports exposed by each endpoint in - // this slice. Each port must have a unique name. When ports is empty, it - // indicates that there are no defined ports. When a port is defined with a - // nil port value, it indicates "all ports". Each slice may include a - // maximum of 100 ports. - // +optional - // +listType=atomic - repeated EndpointPort ports = 3; -} - -// EndpointSliceList represents a list of endpoint slices -message EndpointSliceList { - // Standard list metadata. - // +optional - optional k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; - - // List of endpoint slices - repeated EndpointSlice items = 2; -} - diff --git a/vendor/k8s.io/api/discovery/v1alpha1/register.go b/vendor/k8s.io/api/discovery/v1alpha1/register.go deleted file mode 100644 index 55b73f992f86..000000000000 --- a/vendor/k8s.io/api/discovery/v1alpha1/register.go +++ /dev/null @@ -1,56 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package v1alpha1 - -import ( - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" -) - -// GroupName is the group name used in this package -const GroupName = "discovery.k8s.io" - -// SchemeGroupVersion is group version used to register these objects -var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: "v1alpha1"} - -// Kind takes an unqualified kind and returns a Group qualified GroupKind -func Kind(kind string) schema.GroupKind { - return SchemeGroupVersion.WithKind(kind).GroupKind() -} - -// Resource takes an unqualified resource and returns a Group qualified GroupResource -func Resource(resource string) schema.GroupResource { - return SchemeGroupVersion.WithResource(resource).GroupResource() -} - -var ( - // SchemeBuilder is the scheme builder with scheme init functions to run for this API package - SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes) - // AddToScheme is a common registration function for mapping packaged scoped group & version keys to a scheme - AddToScheme = SchemeBuilder.AddToScheme -) - -// Adds the list of known types to the given scheme. -func addKnownTypes(scheme *runtime.Scheme) error { - scheme.AddKnownTypes(SchemeGroupVersion, - &EndpointSlice{}, - &EndpointSliceList{}, - ) - metav1.AddToGroupVersion(scheme, SchemeGroupVersion) - return nil -} diff --git a/vendor/k8s.io/api/discovery/v1alpha1/types.go b/vendor/k8s.io/api/discovery/v1alpha1/types.go deleted file mode 100644 index 34b706ea897d..000000000000 --- a/vendor/k8s.io/api/discovery/v1alpha1/types.go +++ /dev/null @@ -1,183 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package v1alpha1 - -import ( - v1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -// +genclient -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -// EndpointSlice represents a subset of the endpoints that implement a service. -// For a given service there may be multiple EndpointSlice objects, selected by -// labels, which must be joined to produce the full set of endpoints. -type EndpointSlice struct { - metav1.TypeMeta `json:",inline"` - // Standard object's metadata. - // +optional - metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - // addressType specifies the type of address carried by this EndpointSlice. - // All addresses in this slice must be the same type. This field is - // immutable after creation. The following address types are currently - // supported: - // * IPv4: Represents an IPv4 Address. - // * IPv6: Represents an IPv6 Address. - // * FQDN: Represents a Fully Qualified Domain Name. - AddressType AddressType `json:"addressType" protobuf:"bytes,4,rep,name=addressType"` - // endpoints is a list of unique endpoints in this slice. Each slice may - // include a maximum of 1000 endpoints. - // +listType=atomic - Endpoints []Endpoint `json:"endpoints" protobuf:"bytes,2,rep,name=endpoints"` - // ports specifies the list of network ports exposed by each endpoint in - // this slice. Each port must have a unique name. When ports is empty, it - // indicates that there are no defined ports. When a port is defined with a - // nil port value, it indicates "all ports". Each slice may include a - // maximum of 100 ports. - // +optional - // +listType=atomic - Ports []EndpointPort `json:"ports" protobuf:"bytes,3,rep,name=ports"` -} - -// AddressType represents the type of address referred to by an endpoint. -type AddressType string - -const ( - // AddressTypeIP represents an IP Address. - // This address type has been deprecated and has been replaced by the IPv4 - // and IPv6 adddress types. New resources with this address type will be - // considered invalid. This will be fully removed in 1.18. - // +deprecated - AddressTypeIP = AddressType("IP") - // AddressTypeIPv4 represents an IPv4 Address. - AddressTypeIPv4 = AddressType(v1.IPv4Protocol) - // AddressTypeIPv6 represents an IPv6 Address. - AddressTypeIPv6 = AddressType(v1.IPv6Protocol) - // AddressTypeFQDN represents a FQDN. - AddressTypeFQDN = AddressType("FQDN") -) - -// Endpoint represents a single logical "backend" implementing a service. -type Endpoint struct { - // addresses of this endpoint. The contents of this field are interpreted - // according to the corresponding EndpointSlice addressType field. Consumers - // must handle different types of addresses in the context of their own - // capabilities. This must contain at least one address but no more than - // 100. - // +listType=set - Addresses []string `json:"addresses" protobuf:"bytes,1,rep,name=addresses"` - // conditions contains information about the current status of the endpoint. - Conditions EndpointConditions `json:"conditions,omitempty" protobuf:"bytes,2,opt,name=conditions"` - // hostname of this endpoint. This field may be used by consumers of - // endpoints to distinguish endpoints from each other (e.g. in DNS names). - // Multiple endpoints which use the same hostname should be considered - // fungible (e.g. multiple A values in DNS). Must be lowercase and pass - // DNS label (RFC 1123) validation. - // +optional - Hostname *string `json:"hostname,omitempty" protobuf:"bytes,3,opt,name=hostname"` - // targetRef is a reference to a Kubernetes object that represents this - // endpoint. - // +optional - TargetRef *v1.ObjectReference `json:"targetRef,omitempty" protobuf:"bytes,4,opt,name=targetRef"` - // topology contains arbitrary topology information associated with the - // endpoint. These key/value pairs must conform with the label format. - // https://kubernetes.io/docs/concepts/overview/working-with-objects/labels - // Topology may include a maximum of 16 key/value pairs. This includes, but - // is not limited to the following well known keys: - // * kubernetes.io/hostname: the value indicates the hostname of the node - // where the endpoint is located. This should match the corresponding - // node label. - // * topology.kubernetes.io/zone: the value indicates the zone where the - // endpoint is located. This should match the corresponding node label. - // * topology.kubernetes.io/region: the value indicates the region where the - // endpoint is located. This should match the corresponding node label. - // This field is deprecated and will be removed in future api versions. - // +optional - Topology map[string]string `json:"topology,omitempty" protobuf:"bytes,5,opt,name=topology"` - // nodeName represents the name of the Node hosting this endpoint. This can - // be used to determine endpoints local to a Node. This field can be enabled - // with the EndpointSliceNodeName feature gate. - // +optional - NodeName *string `json:"nodeName,omitempty" protobuf:"bytes,6,opt,name=nodeName"` -} - -// EndpointConditions represents the current condition of an endpoint. -type EndpointConditions struct { - // ready indicates that this endpoint is prepared to receive traffic, - // according to whatever system is managing the endpoint. A nil value - // indicates an unknown state. In most cases consumers should interpret this - // unknown state as ready. For compatibility reasons, ready should never be - // "true" for terminating endpoints. - // +optional - Ready *bool `json:"ready,omitempty" protobuf:"bytes,1,name=ready"` - - // serving is identical to ready except that it is set regardless of the - // terminating state of endpoints. This condition should be set to true for - // a ready endpoint that is terminating. If nil, consumers should defer to - // the ready condition. This field can be enabled with the - // EndpointSliceTerminatingCondition feature gate. - // +optional - Serving *bool `json:"serving,omitempty" protobuf:"bytes,2,name=serving"` - - // terminating indicates that this endpoint is terminating. A nil value - // indicates an unknown state. Consumers should interpret this unknown state - // to mean that the endpoint is not terminating. This field can be enabled - // with the EndpointSliceTerminatingCondition feature gate. - // +optional - Terminating *bool `json:"terminating,omitempty" protobuf:"bytes,3,name=terminating"` -} - -// EndpointPort represents a Port used by an EndpointSlice -type EndpointPort struct { - // The name of this port. All ports in an EndpointSlice must have a unique - // name. If the EndpointSlice is dervied from a Kubernetes service, this - // corresponds to the Service.ports[].name. - // Name must either be an empty string or pass DNS_LABEL validation: - // * must be no more than 63 characters long. - // * must consist of lower case alphanumeric characters or '-'. - // * must start and end with an alphanumeric character. - // Default is empty string. - Name *string `json:"name,omitempty" protobuf:"bytes,1,name=name"` - // The IP protocol for this port. - // Must be UDP, TCP, or SCTP. - // Default is TCP. - Protocol *v1.Protocol `json:"protocol,omitempty" protobuf:"bytes,2,name=protocol"` - // The port number of the endpoint. - // If this is not specified, ports are not restricted and must be - // interpreted in the context of the specific consumer. - Port *int32 `json:"port,omitempty" protobuf:"bytes,3,opt,name=port"` - // The application protocol for this port. - // This field follows standard Kubernetes label syntax. - // Un-prefixed names are reserved for IANA standard service names (as per - // RFC-6335 and http://www.iana.org/assignments/service-names). - // Non-standard protocols should use prefixed names. - // Default is empty string. - AppProtocol *string `json:"appProtocol,omitempty" protobuf:"bytes,4,name=appProtocol"` -} - -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -// EndpointSliceList represents a list of endpoint slices -type EndpointSliceList struct { - metav1.TypeMeta `json:",inline"` - // Standard list metadata. - // +optional - metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - // List of endpoint slices - Items []EndpointSlice `json:"items" protobuf:"bytes,2,rep,name=items"` -} diff --git a/vendor/k8s.io/api/discovery/v1alpha1/types_swagger_doc_generated.go b/vendor/k8s.io/api/discovery/v1alpha1/types_swagger_doc_generated.go deleted file mode 100644 index f6c983689a19..000000000000 --- a/vendor/k8s.io/api/discovery/v1alpha1/types_swagger_doc_generated.go +++ /dev/null @@ -1,89 +0,0 @@ -/* -Copyright The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package v1alpha1 - -// This file contains a collection of methods that can be used from go-restful to -// generate Swagger API documentation for its models. Please read this PR for more -// information on the implementation: https://github.com/emicklei/go-restful/pull/215 -// -// TODOs are ignored from the parser (e.g. TODO(andronat):... || TODO:...) if and only if -// they are on one line! For multiple line or blocks that you want to ignore use ---. -// Any context after a --- is ignored. -// -// Those methods can be generated by using hack/update-generated-swagger-docs.sh - -// AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. -var map_Endpoint = map[string]string{ - "": "Endpoint represents a single logical \"backend\" implementing a service.", - "addresses": "addresses of this endpoint. The contents of this field are interpreted according to the corresponding EndpointSlice addressType field. Consumers must handle different types of addresses in the context of their own capabilities. This must contain at least one address but no more than 100.", - "conditions": "conditions contains information about the current status of the endpoint.", - "hostname": "hostname of this endpoint. This field may be used by consumers of endpoints to distinguish endpoints from each other (e.g. in DNS names). Multiple endpoints which use the same hostname should be considered fungible (e.g. multiple A values in DNS). Must be lowercase and pass DNS label (RFC 1123) validation.", - "targetRef": "targetRef is a reference to a Kubernetes object that represents this endpoint.", - "topology": "topology contains arbitrary topology information associated with the endpoint. These key/value pairs must conform with the label format. https://kubernetes.io/docs/concepts/overview/working-with-objects/labels Topology may include a maximum of 16 key/value pairs. This includes, but is not limited to the following well known keys: * kubernetes.io/hostname: the value indicates the hostname of the node\n where the endpoint is located. This should match the corresponding\n node label.\n* topology.kubernetes.io/zone: the value indicates the zone where the\n endpoint is located. This should match the corresponding node label.\n* topology.kubernetes.io/region: the value indicates the region where the\n endpoint is located. This should match the corresponding node label.\nThis field is deprecated and will be removed in future api versions.", - "nodeName": "nodeName represents the name of the Node hosting this endpoint. This can be used to determine endpoints local to a Node. This field can be enabled with the EndpointSliceNodeName feature gate.", -} - -func (Endpoint) SwaggerDoc() map[string]string { - return map_Endpoint -} - -var map_EndpointConditions = map[string]string{ - "": "EndpointConditions represents the current condition of an endpoint.", - "ready": "ready indicates that this endpoint is prepared to receive traffic, according to whatever system is managing the endpoint. A nil value indicates an unknown state. In most cases consumers should interpret this unknown state as ready. For compatibility reasons, ready should never be \"true\" for terminating endpoints.", - "serving": "serving is identical to ready except that it is set regardless of the terminating state of endpoints. This condition should be set to true for a ready endpoint that is terminating. If nil, consumers should defer to the ready condition. This field can be enabled with the EndpointSliceTerminatingCondition feature gate.", - "terminating": "terminating indicates that this endpoint is terminating. A nil value indicates an unknown state. Consumers should interpret this unknown state to mean that the endpoint is not terminating. This field can be enabled with the EndpointSliceTerminatingCondition feature gate.", -} - -func (EndpointConditions) SwaggerDoc() map[string]string { - return map_EndpointConditions -} - -var map_EndpointPort = map[string]string{ - "": "EndpointPort represents a Port used by an EndpointSlice", - "name": "The name of this port. All ports in an EndpointSlice must have a unique name. If the EndpointSlice is dervied from a Kubernetes service, this corresponds to the Service.ports[].name. Name must either be an empty string or pass DNS_LABEL validation: * must be no more than 63 characters long. * must consist of lower case alphanumeric characters or '-'. * must start and end with an alphanumeric character. Default is empty string.", - "protocol": "The IP protocol for this port. Must be UDP, TCP, or SCTP. Default is TCP.", - "port": "The port number of the endpoint. If this is not specified, ports are not restricted and must be interpreted in the context of the specific consumer.", - "appProtocol": "The application protocol for this port. This field follows standard Kubernetes label syntax. Un-prefixed names are reserved for IANA standard service names (as per RFC-6335 and http://www.iana.org/assignments/service-names). Non-standard protocols should use prefixed names. Default is empty string.", -} - -func (EndpointPort) SwaggerDoc() map[string]string { - return map_EndpointPort -} - -var map_EndpointSlice = map[string]string{ - "": "EndpointSlice represents a subset of the endpoints that implement a service. For a given service there may be multiple EndpointSlice objects, selected by labels, which must be joined to produce the full set of endpoints.", - "metadata": "Standard object's metadata.", - "addressType": "addressType specifies the type of address carried by this EndpointSlice. All addresses in this slice must be the same type. This field is immutable after creation. The following address types are currently supported: * IPv4: Represents an IPv4 Address. * IPv6: Represents an IPv6 Address. * FQDN: Represents a Fully Qualified Domain Name.", - "endpoints": "endpoints is a list of unique endpoints in this slice. Each slice may include a maximum of 1000 endpoints.", - "ports": "ports specifies the list of network ports exposed by each endpoint in this slice. Each port must have a unique name. When ports is empty, it indicates that there are no defined ports. When a port is defined with a nil port value, it indicates \"all ports\". Each slice may include a maximum of 100 ports.", -} - -func (EndpointSlice) SwaggerDoc() map[string]string { - return map_EndpointSlice -} - -var map_EndpointSliceList = map[string]string{ - "": "EndpointSliceList represents a list of endpoint slices", - "metadata": "Standard list metadata.", - "items": "List of endpoint slices", -} - -func (EndpointSliceList) SwaggerDoc() map[string]string { - return map_EndpointSliceList -} - -// AUTO-GENERATED FUNCTIONS END HERE diff --git a/vendor/k8s.io/api/discovery/v1alpha1/zz_generated.deepcopy.go b/vendor/k8s.io/api/discovery/v1alpha1/zz_generated.deepcopy.go deleted file mode 100644 index 13e54d50071a..000000000000 --- a/vendor/k8s.io/api/discovery/v1alpha1/zz_generated.deepcopy.go +++ /dev/null @@ -1,210 +0,0 @@ -// +build !ignore_autogenerated - -/* -Copyright The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by deepcopy-gen. DO NOT EDIT. - -package v1alpha1 - -import ( - v1 "k8s.io/api/core/v1" - runtime "k8s.io/apimachinery/pkg/runtime" -) - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Endpoint) DeepCopyInto(out *Endpoint) { - *out = *in - if in.Addresses != nil { - in, out := &in.Addresses, &out.Addresses - *out = make([]string, len(*in)) - copy(*out, *in) - } - in.Conditions.DeepCopyInto(&out.Conditions) - if in.Hostname != nil { - in, out := &in.Hostname, &out.Hostname - *out = new(string) - **out = **in - } - if in.TargetRef != nil { - in, out := &in.TargetRef, &out.TargetRef - *out = new(v1.ObjectReference) - **out = **in - } - if in.Topology != nil { - in, out := &in.Topology, &out.Topology - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } - if in.NodeName != nil { - in, out := &in.NodeName, &out.NodeName - *out = new(string) - **out = **in - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Endpoint. -func (in *Endpoint) DeepCopy() *Endpoint { - if in == nil { - return nil - } - out := new(Endpoint) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *EndpointConditions) DeepCopyInto(out *EndpointConditions) { - *out = *in - if in.Ready != nil { - in, out := &in.Ready, &out.Ready - *out = new(bool) - **out = **in - } - if in.Serving != nil { - in, out := &in.Serving, &out.Serving - *out = new(bool) - **out = **in - } - if in.Terminating != nil { - in, out := &in.Terminating, &out.Terminating - *out = new(bool) - **out = **in - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EndpointConditions. -func (in *EndpointConditions) DeepCopy() *EndpointConditions { - if in == nil { - return nil - } - out := new(EndpointConditions) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *EndpointPort) DeepCopyInto(out *EndpointPort) { - *out = *in - if in.Name != nil { - in, out := &in.Name, &out.Name - *out = new(string) - **out = **in - } - if in.Protocol != nil { - in, out := &in.Protocol, &out.Protocol - *out = new(v1.Protocol) - **out = **in - } - if in.Port != nil { - in, out := &in.Port, &out.Port - *out = new(int32) - **out = **in - } - if in.AppProtocol != nil { - in, out := &in.AppProtocol, &out.AppProtocol - *out = new(string) - **out = **in - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EndpointPort. -func (in *EndpointPort) DeepCopy() *EndpointPort { - if in == nil { - return nil - } - out := new(EndpointPort) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *EndpointSlice) DeepCopyInto(out *EndpointSlice) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - if in.Endpoints != nil { - in, out := &in.Endpoints, &out.Endpoints - *out = make([]Endpoint, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - if in.Ports != nil { - in, out := &in.Ports, &out.Ports - *out = make([]EndpointPort, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EndpointSlice. -func (in *EndpointSlice) DeepCopy() *EndpointSlice { - if in == nil { - return nil - } - out := new(EndpointSlice) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *EndpointSlice) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *EndpointSliceList) DeepCopyInto(out *EndpointSliceList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]EndpointSlice, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EndpointSliceList. -func (in *EndpointSliceList) DeepCopy() *EndpointSliceList { - if in == nil { - return nil - } - out := new(EndpointSliceList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *EndpointSliceList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} diff --git a/vendor/k8s.io/api/discovery/v1beta1/BUILD b/vendor/k8s.io/api/discovery/v1beta1/BUILD deleted file mode 100644 index 741e88938ddd..000000000000 --- a/vendor/k8s.io/api/discovery/v1beta1/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "well_known_labels.go", - "zz_generated.deepcopy.go", - "zz_generated.prerelease-lifecycle.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/api/discovery/v1beta1", - importpath = "k8s.io/api/discovery/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/discovery/v1beta1/generated.pb.go b/vendor/k8s.io/api/discovery/v1beta1/generated.pb.go index 6caab402ca3d..e024cc0a16db 100644 --- a/vendor/k8s.io/api/discovery/v1beta1/generated.pb.go +++ b/vendor/k8s.io/api/discovery/v1beta1/generated.pb.go @@ -102,10 +102,38 @@ func (m *EndpointConditions) XXX_DiscardUnknown() { var xxx_messageInfo_EndpointConditions proto.InternalMessageInfo +func (m *EndpointHints) Reset() { *m = EndpointHints{} } +func (*EndpointHints) ProtoMessage() {} +func (*EndpointHints) Descriptor() ([]byte, []int) { + return fileDescriptor_ece80bbc872d519b, []int{2} +} +func (m *EndpointHints) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *EndpointHints) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *EndpointHints) XXX_Merge(src proto.Message) { + xxx_messageInfo_EndpointHints.Merge(m, src) +} +func (m *EndpointHints) XXX_Size() int { + return m.Size() +} +func (m *EndpointHints) XXX_DiscardUnknown() { + xxx_messageInfo_EndpointHints.DiscardUnknown(m) +} + +var xxx_messageInfo_EndpointHints proto.InternalMessageInfo + func (m *EndpointPort) Reset() { *m = EndpointPort{} } func (*EndpointPort) ProtoMessage() {} func (*EndpointPort) Descriptor() ([]byte, []int) { - return fileDescriptor_ece80bbc872d519b, []int{2} + return fileDescriptor_ece80bbc872d519b, []int{3} } func (m *EndpointPort) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -133,7 +161,7 @@ var xxx_messageInfo_EndpointPort proto.InternalMessageInfo func (m *EndpointSlice) Reset() { *m = EndpointSlice{} } func (*EndpointSlice) ProtoMessage() {} func (*EndpointSlice) Descriptor() ([]byte, []int) { - return fileDescriptor_ece80bbc872d519b, []int{3} + return fileDescriptor_ece80bbc872d519b, []int{4} } func (m *EndpointSlice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -161,7 +189,7 @@ var xxx_messageInfo_EndpointSlice proto.InternalMessageInfo func (m *EndpointSliceList) Reset() { *m = EndpointSliceList{} } func (*EndpointSliceList) ProtoMessage() {} func (*EndpointSliceList) Descriptor() ([]byte, []int) { - return fileDescriptor_ece80bbc872d519b, []int{4} + return fileDescriptor_ece80bbc872d519b, []int{5} } func (m *EndpointSliceList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -186,13 +214,43 @@ func (m *EndpointSliceList) XXX_DiscardUnknown() { var xxx_messageInfo_EndpointSliceList proto.InternalMessageInfo +func (m *ForZone) Reset() { *m = ForZone{} } +func (*ForZone) ProtoMessage() {} +func (*ForZone) Descriptor() ([]byte, []int) { + return fileDescriptor_ece80bbc872d519b, []int{6} +} +func (m *ForZone) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ForZone) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ForZone) XXX_Merge(src proto.Message) { + xxx_messageInfo_ForZone.Merge(m, src) +} +func (m *ForZone) XXX_Size() int { + return m.Size() +} +func (m *ForZone) XXX_DiscardUnknown() { + xxx_messageInfo_ForZone.DiscardUnknown(m) +} + +var xxx_messageInfo_ForZone proto.InternalMessageInfo + func init() { proto.RegisterType((*Endpoint)(nil), "k8s.io.api.discovery.v1beta1.Endpoint") proto.RegisterMapType((map[string]string)(nil), "k8s.io.api.discovery.v1beta1.Endpoint.TopologyEntry") proto.RegisterType((*EndpointConditions)(nil), "k8s.io.api.discovery.v1beta1.EndpointConditions") + proto.RegisterType((*EndpointHints)(nil), "k8s.io.api.discovery.v1beta1.EndpointHints") proto.RegisterType((*EndpointPort)(nil), "k8s.io.api.discovery.v1beta1.EndpointPort") proto.RegisterType((*EndpointSlice)(nil), "k8s.io.api.discovery.v1beta1.EndpointSlice") proto.RegisterType((*EndpointSliceList)(nil), "k8s.io.api.discovery.v1beta1.EndpointSliceList") + proto.RegisterType((*ForZone)(nil), "k8s.io.api.discovery.v1beta1.ForZone") } func init() { @@ -200,57 +258,62 @@ func init() { } var fileDescriptor_ece80bbc872d519b = []byte{ - // 798 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x53, 0x4d, 0x8f, 0xe3, 0x44, - 0x10, 0x8d, 0x27, 0x63, 0xc6, 0xee, 0xec, 0x88, 0xdd, 0x16, 0x87, 0x68, 0x58, 0xd9, 0xa3, 0x20, - 0x50, 0xc4, 0x68, 0x6d, 0x66, 0xb5, 0x42, 0x2b, 0x38, 0x8d, 0x61, 0x04, 0x48, 0xb0, 0x1b, 0xf5, - 0x46, 0x42, 0x42, 0x1c, 0xe8, 0xd8, 0xb5, 0x8e, 0x49, 0xec, 0xb6, 0xba, 0x3b, 0x91, 0x72, 0xe3, - 0x1f, 0xc0, 0x7f, 0x42, 0x42, 0x73, 0xdc, 0xe3, 0x9e, 0x2c, 0x62, 0xf8, 0x15, 0x7b, 0x42, 0xdd, - 0xfe, 0x4a, 0x08, 0x1f, 0xb9, 0x75, 0xbf, 0xaa, 0xf7, 0xaa, 0x5e, 0x75, 0x17, 0xba, 0x5d, 0x3c, - 0x15, 0x5e, 0xc2, 0xfc, 0xc5, 0x6a, 0x06, 0x3c, 0x03, 0x09, 0xc2, 0x5f, 0x43, 0x16, 0x31, 0xee, - 0xd7, 0x01, 0x9a, 0x27, 0x7e, 0x94, 0x88, 0x90, 0xad, 0x81, 0x6f, 0xfc, 0xf5, 0xf5, 0x0c, 0x24, - 0xbd, 0xf6, 0x63, 0xc8, 0x80, 0x53, 0x09, 0x91, 0x97, 0x73, 0x26, 0x19, 0x7e, 0x58, 0x65, 0x7b, - 0x34, 0x4f, 0xbc, 0x36, 0xdb, 0xab, 0xb3, 0x2f, 0x1e, 0xc5, 0x89, 0x9c, 0xaf, 0x66, 0x5e, 0xc8, - 0x52, 0x3f, 0x66, 0x31, 0xf3, 0x35, 0x69, 0xb6, 0x7a, 0xa9, 0x6f, 0xfa, 0xa2, 0x4f, 0x95, 0xd8, - 0xc5, 0x68, 0xa7, 0x74, 0xc8, 0x38, 0xf8, 0xeb, 0x83, 0x82, 0x17, 0x4f, 0xba, 0x9c, 0x94, 0x86, - 0xf3, 0x24, 0x53, 0xdd, 0xe5, 0x8b, 0x58, 0x01, 0xc2, 0x4f, 0x41, 0xd2, 0x7f, 0x62, 0xf9, 0xff, - 0xc6, 0xe2, 0xab, 0x4c, 0x26, 0x29, 0x1c, 0x10, 0x3e, 0xfe, 0x3f, 0x82, 0x08, 0xe7, 0x90, 0xd2, - 0xbf, 0xf3, 0x46, 0x7f, 0xf6, 0x91, 0x75, 0x9b, 0x45, 0x39, 0x4b, 0x32, 0x89, 0xaf, 0x90, 0x4d, - 0xa3, 0x88, 0x83, 0x10, 0x20, 0x86, 0xc6, 0x65, 0x7f, 0x6c, 0x07, 0xe7, 0x65, 0xe1, 0xda, 0x37, - 0x0d, 0x48, 0xba, 0x38, 0x8e, 0x10, 0x0a, 0x59, 0x16, 0x25, 0x32, 0x61, 0x99, 0x18, 0x9e, 0x5c, - 0x1a, 0xe3, 0xc1, 0xe3, 0x8f, 0xbc, 0xff, 0x1a, 0xaf, 0xd7, 0x14, 0xfa, 0xac, 0xe5, 0x05, 0xf8, - 0xae, 0x70, 0x7b, 0x65, 0xe1, 0xa2, 0x0e, 0x23, 0x3b, 0xba, 0x78, 0x8c, 0xac, 0x39, 0x13, 0x32, - 0xa3, 0x29, 0x0c, 0xfb, 0x97, 0xc6, 0xd8, 0x0e, 0xee, 0x95, 0x85, 0x6b, 0x7d, 0x59, 0x63, 0xa4, - 0x8d, 0xe2, 0x09, 0xb2, 0x25, 0xe5, 0x31, 0x48, 0x02, 0x2f, 0x87, 0xa7, 0xba, 0x9d, 0xf7, 0x76, - 0xdb, 0x51, 0x0f, 0xe4, 0xad, 0xaf, 0xbd, 0xe7, 0xb3, 0x1f, 0x21, 0x54, 0x49, 0xc0, 0x21, 0x0b, - 0xa1, 0x72, 0x38, 0x6d, 0x98, 0xa4, 0x13, 0xc1, 0x33, 0x64, 0x49, 0x96, 0xb3, 0x25, 0x8b, 0x37, - 0x43, 0xf3, 0xb2, 0x3f, 0x1e, 0x3c, 0x7e, 0x72, 0x9c, 0x3f, 0x6f, 0x5a, 0xd3, 0x6e, 0x33, 0xc9, - 0x37, 0xc1, 0xfd, 0xda, 0xa3, 0xd5, 0xc0, 0xa4, 0xd5, 0x55, 0xfe, 0x32, 0x16, 0xc1, 0x33, 0xe5, - 0xef, 0xad, 0xce, 0xdf, 0xb3, 0x1a, 0x23, 0x6d, 0xf4, 0xe2, 0x53, 0x74, 0xbe, 0x27, 0x8b, 0xef, - 0xa3, 0xfe, 0x02, 0x36, 0x43, 0x43, 0xb1, 0x88, 0x3a, 0xe2, 0x77, 0x90, 0xb9, 0xa6, 0xcb, 0x15, - 0xe8, 0xd7, 0xb0, 0x49, 0x75, 0xf9, 0xe4, 0xe4, 0xa9, 0x31, 0xfa, 0xd9, 0x40, 0xf8, 0x70, 0xfa, - 0xd8, 0x45, 0x26, 0x07, 0x1a, 0x55, 0x22, 0x56, 0x60, 0x97, 0x85, 0x6b, 0x12, 0x05, 0x90, 0x0a, - 0xc7, 0xef, 0xa3, 0x33, 0x01, 0x7c, 0x9d, 0x64, 0xb1, 0xd6, 0xb4, 0x82, 0x41, 0x59, 0xb8, 0x67, - 0x2f, 0x2a, 0x88, 0x34, 0x31, 0x7c, 0x8d, 0x06, 0x12, 0x78, 0x9a, 0x64, 0x54, 0xaa, 0xd4, 0xbe, - 0x4e, 0x7d, 0xbb, 0x2c, 0xdc, 0xc1, 0xb4, 0x83, 0xc9, 0x6e, 0xce, 0xe8, 0x37, 0x03, 0xdd, 0x6b, - 0x3a, 0x9a, 0x30, 0x2e, 0xf1, 0x43, 0x74, 0xaa, 0x5f, 0x59, 0xfb, 0x09, 0xac, 0xb2, 0x70, 0x4f, - 0xf5, 0x04, 0x34, 0x8a, 0xbf, 0x40, 0x96, 0xfe, 0xb0, 0x21, 0x5b, 0x56, 0xee, 0x82, 0x2b, 0x35, - 0xa7, 0x49, 0x8d, 0xbd, 0x29, 0xdc, 0x77, 0x0f, 0x97, 0xd1, 0x6b, 0xc2, 0xa4, 0x25, 0xab, 0x32, - 0x39, 0xe3, 0x52, 0xf7, 0x68, 0x56, 0x65, 0x54, 0x79, 0xa2, 0x51, 0x65, 0x84, 0xe6, 0x79, 0x43, - 0xd3, 0xdf, 0xc8, 0xae, 0x8c, 0xdc, 0x74, 0x30, 0xd9, 0xcd, 0x19, 0x6d, 0x4f, 0xd0, 0x79, 0x63, - 0xe4, 0xc5, 0x32, 0x09, 0x01, 0xff, 0x80, 0x2c, 0xb5, 0xd7, 0x11, 0x95, 0x54, 0xbb, 0xd9, 0xdf, - 0x8b, 0x76, 0x3d, 0xbd, 0x7c, 0x11, 0x2b, 0x40, 0x78, 0x2a, 0xbb, 0xfb, 0x9a, 0xdf, 0x80, 0xa4, - 0xdd, 0x5e, 0x74, 0x18, 0x69, 0x55, 0xf1, 0xe7, 0x68, 0x50, 0x2f, 0xe2, 0x74, 0x93, 0x43, 0xdd, - 0xe6, 0xa8, 0xa6, 0x0c, 0x6e, 0xba, 0xd0, 0x9b, 0xfd, 0x2b, 0xd9, 0xa5, 0xe1, 0x6f, 0x91, 0x0d, - 0x75, 0xe3, 0x6a, 0x81, 0xd5, 0x07, 0xff, 0xe0, 0xb8, 0x0f, 0x1e, 0x3c, 0xa8, 0x6b, 0xd9, 0x0d, - 0x22, 0x48, 0xa7, 0x85, 0x9f, 0x23, 0x53, 0x4d, 0x53, 0x0c, 0xfb, 0x5a, 0xf4, 0xc3, 0xe3, 0x44, - 0xd5, 0x33, 0x04, 0xe7, 0xb5, 0xb0, 0xa9, 0x6e, 0x82, 0x54, 0x3a, 0xa3, 0x5f, 0x0d, 0xf4, 0x60, - 0x6f, 0xc6, 0x5f, 0x27, 0x42, 0xe2, 0xef, 0x0f, 0xe6, 0xec, 0x1d, 0x37, 0x67, 0xc5, 0xd6, 0x53, - 0x6e, 0x37, 0xb3, 0x41, 0x76, 0x66, 0x3c, 0x41, 0x66, 0x22, 0x21, 0x6d, 0x26, 0x73, 0x75, 0x9c, - 0x09, 0xdd, 0x5d, 0xe7, 0xe2, 0x2b, 0xa5, 0x40, 0x2a, 0xa1, 0xe0, 0xd1, 0xdd, 0xd6, 0xe9, 0xbd, - 0xda, 0x3a, 0xbd, 0xd7, 0x5b, 0xa7, 0xf7, 0x53, 0xe9, 0x18, 0x77, 0xa5, 0x63, 0xbc, 0x2a, 0x1d, - 0xe3, 0x75, 0xe9, 0x18, 0xbf, 0x97, 0x8e, 0xf1, 0xcb, 0x1f, 0x4e, 0xef, 0xbb, 0xb3, 0x5a, 0xf2, - 0xaf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xa6, 0x35, 0xe6, 0xf5, 0xf2, 0x06, 0x00, 0x00, + // 870 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x54, 0x41, 0x8f, 0xe3, 0x34, + 0x14, 0x6e, 0xa6, 0x53, 0x9a, 0xb8, 0x33, 0x62, 0xd7, 0xe2, 0x50, 0x0d, 0xab, 0xa4, 0x0a, 0x5a, + 0x54, 0x31, 0xda, 0x84, 0x19, 0xad, 0xd0, 0x0a, 0x4e, 0x13, 0x18, 0x58, 0xa4, 0x65, 0x77, 0xe4, + 0x19, 0x09, 0x69, 0xc5, 0x01, 0x37, 0xf1, 0xa4, 0xa1, 0x53, 0x3b, 0xb2, 0xdd, 0x4a, 0xbd, 0xf1, + 0x0f, 0xe0, 0xb7, 0xf0, 0x17, 0x90, 0xd0, 0x1c, 0xf7, 0xb8, 0xa7, 0x88, 0x09, 0xff, 0x62, 0x4f, + 0xc8, 0x8e, 0x93, 0xb4, 0x14, 0x86, 0xde, 0xec, 0xcf, 0xef, 0xfb, 0xde, 0x7b, 0xdf, 0xb3, 0x0d, + 0xce, 0x67, 0xcf, 0x44, 0x90, 0xb1, 0x70, 0xb6, 0x98, 0x10, 0x4e, 0x89, 0x24, 0x22, 0x5c, 0x12, + 0x9a, 0x30, 0x1e, 0x9a, 0x03, 0x9c, 0x67, 0x61, 0x92, 0x89, 0x98, 0x2d, 0x09, 0x5f, 0x85, 0xcb, + 0x93, 0x09, 0x91, 0xf8, 0x24, 0x4c, 0x09, 0x25, 0x1c, 0x4b, 0x92, 0x04, 0x39, 0x67, 0x92, 0xc1, + 0x47, 0x55, 0x74, 0x80, 0xf3, 0x2c, 0x68, 0xa2, 0x03, 0x13, 0x7d, 0xf4, 0x24, 0xcd, 0xe4, 0x74, + 0x31, 0x09, 0x62, 0x36, 0x0f, 0x53, 0x96, 0xb2, 0x50, 0x93, 0x26, 0x8b, 0x6b, 0xbd, 0xd3, 0x1b, + 0xbd, 0xaa, 0xc4, 0x8e, 0xfc, 0xb5, 0xd4, 0x31, 0xe3, 0x24, 0x5c, 0x6e, 0x25, 0x3c, 0x7a, 0xda, + 0xc6, 0xcc, 0x71, 0x3c, 0xcd, 0xa8, 0xaa, 0x2e, 0x9f, 0xa5, 0x0a, 0x10, 0xe1, 0x9c, 0x48, 0xfc, + 0x6f, 0xac, 0xf0, 0xbf, 0x58, 0x7c, 0x41, 0x65, 0x36, 0x27, 0x5b, 0x84, 0xcf, 0xfe, 0x8f, 0x20, + 0xe2, 0x29, 0x99, 0xe3, 0x7f, 0xf2, 0xfc, 0xdf, 0xf6, 0x81, 0x7d, 0x4e, 0x93, 0x9c, 0x65, 0x54, + 0xc2, 0x63, 0xe0, 0xe0, 0x24, 0xe1, 0x44, 0x08, 0x22, 0x86, 0xd6, 0xa8, 0x3b, 0x76, 0xa2, 0xc3, + 0xb2, 0xf0, 0x9c, 0xb3, 0x1a, 0x44, 0xed, 0x39, 0x4c, 0x00, 0x88, 0x19, 0x4d, 0x32, 0x99, 0x31, + 0x2a, 0x86, 0x7b, 0x23, 0x6b, 0x3c, 0x38, 0xfd, 0x34, 0xb8, 0xcf, 0xde, 0xa0, 0x4e, 0xf4, 0x65, + 0xc3, 0x8b, 0xe0, 0x6d, 0xe1, 0x75, 0xca, 0xc2, 0x03, 0x2d, 0x86, 0xd6, 0x74, 0xe1, 0x18, 0xd8, + 0x53, 0x26, 0x24, 0xc5, 0x73, 0x32, 0xec, 0x8e, 0xac, 0xb1, 0x13, 0x1d, 0x94, 0x85, 0x67, 0x3f, + 0x37, 0x18, 0x6a, 0x4e, 0xe1, 0x05, 0x70, 0x24, 0xe6, 0x29, 0x91, 0x88, 0x5c, 0x0f, 0xf7, 0x75, + 0x39, 0x1f, 0xad, 0x97, 0xa3, 0x06, 0x14, 0x2c, 0x4f, 0x82, 0x57, 0x93, 0x9f, 0x48, 0xac, 0x82, + 0x08, 0x27, 0x34, 0x26, 0x55, 0x87, 0x57, 0x35, 0x13, 0xb5, 0x22, 0x70, 0x02, 0x6c, 0xc9, 0x72, + 0x76, 0xc3, 0xd2, 0xd5, 0xb0, 0x37, 0xea, 0x8e, 0x07, 0xa7, 0x4f, 0x77, 0xeb, 0x2f, 0xb8, 0x32, + 0xb4, 0x73, 0x2a, 0xf9, 0x2a, 0x7a, 0x60, 0x7a, 0xb4, 0x6b, 0x18, 0x35, 0xba, 0xaa, 0x3f, 0xca, + 0x12, 0xf2, 0x52, 0xf5, 0xf7, 0x5e, 0xdb, 0xdf, 0x4b, 0x83, 0xa1, 0xe6, 0x14, 0xbe, 0x00, 0xbd, + 0x69, 0x46, 0xa5, 0x18, 0xf6, 0x75, 0x6f, 0xc7, 0xbb, 0x95, 0xf2, 0x5c, 0x51, 0x22, 0xa7, 0x2c, + 0xbc, 0x9e, 0x5e, 0xa2, 0x4a, 0xe4, 0xe8, 0x0b, 0x70, 0xb8, 0x51, 0x24, 0x7c, 0x00, 0xba, 0x33, + 0xb2, 0x1a, 0x5a, 0xaa, 0x06, 0xa4, 0x96, 0xf0, 0x03, 0xd0, 0x5b, 0xe2, 0x9b, 0x05, 0xd1, 0xb3, + 0x75, 0x50, 0xb5, 0xf9, 0x7c, 0xef, 0x99, 0xe5, 0xff, 0x62, 0x01, 0xb8, 0x3d, 0x4b, 0xe8, 0x81, + 0x1e, 0x27, 0x38, 0xa9, 0x44, 0xec, 0x2a, 0x29, 0x52, 0x00, 0xaa, 0x70, 0xf8, 0x18, 0xf4, 0x05, + 0xe1, 0xcb, 0x8c, 0xa6, 0x5a, 0xd3, 0x8e, 0x06, 0x65, 0xe1, 0xf5, 0x2f, 0x2b, 0x08, 0xd5, 0x67, + 0xf0, 0x04, 0x0c, 0x24, 0xe1, 0xf3, 0x8c, 0x62, 0xa9, 0x42, 0xbb, 0x3a, 0xf4, 0xfd, 0xb2, 0xf0, + 0x06, 0x57, 0x2d, 0x8c, 0xd6, 0x63, 0xfc, 0x04, 0x1c, 0x6e, 0x74, 0x0c, 0x2f, 0x81, 0x7d, 0xcd, + 0xf8, 0x6b, 0x46, 0xcd, 0x4d, 0x1e, 0x9c, 0x3e, 0xbe, 0xdf, 0xb0, 0xaf, 0xab, 0xe8, 0x76, 0x58, + 0x06, 0x10, 0xa8, 0x11, 0xf2, 0xff, 0xb0, 0xc0, 0x41, 0x9d, 0xe6, 0x82, 0x71, 0x09, 0x1f, 0x81, + 0x7d, 0x7d, 0x33, 0xb5, 0x6b, 0x91, 0x5d, 0x16, 0xde, 0xbe, 0x9e, 0x9a, 0x46, 0xe1, 0x37, 0xc0, + 0xd6, 0x8f, 0x2c, 0x66, 0x37, 0x95, 0x87, 0xd1, 0xb1, 0x12, 0xbe, 0x30, 0xd8, 0xbb, 0xc2, 0xfb, + 0x70, 0xfb, 0x03, 0x09, 0xea, 0x63, 0xd4, 0x90, 0x55, 0x9a, 0x9c, 0x71, 0xa9, 0x9d, 0xe8, 0x55, + 0x69, 0x54, 0x7a, 0xa4, 0x51, 0x65, 0x17, 0xce, 0xf3, 0x9a, 0xa6, 0xaf, 0xbe, 0x53, 0xd9, 0x75, + 0xd6, 0xc2, 0x68, 0x3d, 0xc6, 0xbf, 0xdb, 0x6b, 0xfd, 0xba, 0xbc, 0xc9, 0x62, 0x02, 0x7f, 0x04, + 0xb6, 0xfa, 0x8b, 0x12, 0x2c, 0xb1, 0xee, 0x66, 0xf3, 0x2d, 0x37, 0x5f, 0x4a, 0x90, 0xcf, 0x52, + 0x05, 0x88, 0x40, 0x45, 0xb7, 0xcf, 0xe9, 0x3b, 0x22, 0x71, 0xfb, 0x96, 0x5b, 0x0c, 0x35, 0xaa, + 0xf0, 0x2b, 0x30, 0x30, 0x9f, 0xc7, 0xd5, 0x2a, 0x27, 0xa6, 0x4c, 0xdf, 0x50, 0x06, 0x67, 0xed, + 0xd1, 0xbb, 0xcd, 0x2d, 0x5a, 0xa7, 0xc1, 0xef, 0x81, 0x43, 0x4c, 0xe1, 0xea, 0xd3, 0x51, 0x83, + 0xfd, 0x78, 0xb7, 0x97, 0x10, 0x3d, 0x34, 0xb9, 0x9c, 0x1a, 0x11, 0xa8, 0xd5, 0x82, 0xaf, 0x40, + 0x4f, 0xb9, 0x29, 0x86, 0x5d, 0x2d, 0xfa, 0xc9, 0x6e, 0xa2, 0x6a, 0x0c, 0xd1, 0xa1, 0x11, 0xee, + 0xa9, 0x9d, 0x40, 0x95, 0x8e, 0xff, 0xbb, 0x05, 0x1e, 0x6e, 0x78, 0xfc, 0x22, 0x13, 0x12, 0xfe, + 0xb0, 0xe5, 0x73, 0xb0, 0x9b, 0xcf, 0x8a, 0xad, 0x5d, 0x6e, 0x2e, 0x68, 0x8d, 0xac, 0x79, 0x7c, + 0x01, 0x7a, 0x99, 0x24, 0xf3, 0xda, 0x99, 0x1d, 0xff, 0x08, 0x5d, 0x5d, 0xdb, 0xc5, 0xb7, 0x4a, + 0x01, 0x55, 0x42, 0xfe, 0x31, 0xe8, 0x9b, 0x87, 0x00, 0x47, 0x1b, 0x97, 0xfd, 0xc0, 0x84, 0xaf, + 0x5d, 0xf8, 0xe8, 0xc9, 0xed, 0x9d, 0xdb, 0x79, 0x73, 0xe7, 0x76, 0xde, 0xde, 0xb9, 0x9d, 0x9f, + 0x4b, 0xd7, 0xba, 0x2d, 0x5d, 0xeb, 0x4d, 0xe9, 0x5a, 0x6f, 0x4b, 0xd7, 0xfa, 0xb3, 0x74, 0xad, + 0x5f, 0xff, 0x72, 0x3b, 0xaf, 0xfb, 0x26, 0xff, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, 0xf7, 0x0d, + 0x6f, 0x98, 0xd3, 0x07, 0x00, 0x00, } func (m *Endpoint) Marshal() (dAtA []byte, err error) { @@ -273,6 +336,18 @@ func (m *Endpoint) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.Hints != nil { + { + size, err := m.Hints.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a + } if m.NodeName != nil { i -= len(*m.NodeName) copy(dAtA[i:], *m.NodeName) @@ -398,6 +473,43 @@ func (m *EndpointConditions) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *EndpointHints) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *EndpointHints) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EndpointHints) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.ForZones) > 0 { + for iNdEx := len(m.ForZones) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.ForZones[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + func (m *EndpointPort) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -560,6 +672,34 @@ func (m *EndpointSliceList) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *ForZone) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ForZone) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ForZone) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func encodeVarintGenerated(dAtA []byte, offset int, v uint64) int { offset -= sovGenerated(v) base := offset @@ -605,6 +745,10 @@ func (m *Endpoint) Size() (n int) { l = len(*m.NodeName) n += 1 + l + sovGenerated(uint64(l)) } + if m.Hints != nil { + l = m.Hints.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -626,6 +770,21 @@ func (m *EndpointConditions) Size() (n int) { return n } +func (m *EndpointHints) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.ForZones) > 0 { + for _, e := range m.ForZones { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + func (m *EndpointPort) Size() (n int) { if m == nil { return 0 @@ -692,6 +851,17 @@ func (m *EndpointSliceList) Size() (n int) { return n } +func (m *ForZone) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + func sovGenerated(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -719,6 +889,7 @@ func (this *Endpoint) String() string { `TargetRef:` + strings.Replace(fmt.Sprintf("%v", this.TargetRef), "ObjectReference", "v1.ObjectReference", 1) + `,`, `Topology:` + mapStringForTopology + `,`, `NodeName:` + valueToStringGenerated(this.NodeName) + `,`, + `Hints:` + strings.Replace(this.Hints.String(), "EndpointHints", "EndpointHints", 1) + `,`, `}`, }, "") return s @@ -735,6 +906,21 @@ func (this *EndpointConditions) String() string { }, "") return s } +func (this *EndpointHints) String() string { + if this == nil { + return "nil" + } + repeatedStringForForZones := "[]ForZone{" + for _, f := range this.ForZones { + repeatedStringForForZones += strings.Replace(strings.Replace(f.String(), "ForZone", "ForZone", 1), `&`, ``, 1) + "," + } + repeatedStringForForZones += "}" + s := strings.Join([]string{`&EndpointHints{`, + `ForZones:` + repeatedStringForForZones + `,`, + `}`, + }, "") + return s +} func (this *EndpointPort) String() string { if this == nil { return "nil" @@ -787,6 +973,16 @@ func (this *EndpointSliceList) String() string { }, "") return s } +func (this *ForZone) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ForZone{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `}`, + }, "") + return s +} func valueToStringGenerated(v interface{}) string { rv := reflect.ValueOf(v) if rv.IsNil() { @@ -1074,7 +1270,7 @@ func (m *Endpoint) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -1118,16 +1314,49 @@ func (m *Endpoint) Unmarshal(dAtA []byte) error { s := string(dAtA[iNdEx:postIndex]) m.NodeName = &s iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Hints", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Hints == nil { + m.Hints = &EndpointHints{} + } + if err := m.Hints.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1240,10 +1469,91 @@ func (m *EndpointConditions) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } - if (iNdEx + skippy) < 0 { + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *EndpointHints) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: EndpointHints: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: EndpointHints: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ForZones", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ForZones = append(m.ForZones, ForZone{}) + if err := m.ForZones[len(m.ForZones)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1412,10 +1722,7 @@ func (m *EndpointPort) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1598,10 +1905,7 @@ func (m *EndpointSlice) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1718,10 +2022,89 @@ func (m *EndpointSliceList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } - if (iNdEx + skippy) < 0 { + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ForZone) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ForZone: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ForZone: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/api/discovery/v1beta1/generated.proto b/vendor/k8s.io/api/discovery/v1beta1/generated.proto index e5d21caadf29..6925f7ce3b09 100644 --- a/vendor/k8s.io/api/discovery/v1beta1/generated.proto +++ b/vendor/k8s.io/api/discovery/v1beta1/generated.proto @@ -76,6 +76,12 @@ message Endpoint { // with the EndpointSliceNodeName feature gate. // +optional optional string nodeName = 6; + + // hints contains information associated with how an endpoint should be + // consumed. + // +featureGate=TopologyAwareHints + // +optional + optional EndpointHints hints = 7; } // EndpointConditions represents the current condition of an endpoint. @@ -104,6 +110,14 @@ message EndpointConditions { optional bool terminating = 3; } +// EndpointHints provides hints describing how an endpoint should be consumed. +message EndpointHints { + // forZones indicates the zone(s) this endpoint should be consumed by to + // enable topology aware routing. May contain a maximum of 8 entries. + // +listType=atomic + repeated ForZone forZones = 1; +} + // EndpointPort represents a Port used by an EndpointSlice message EndpointPort { // The name of this port. All ports in an EndpointSlice must have a unique @@ -178,3 +192,9 @@ message EndpointSliceList { repeated EndpointSlice items = 2; } +// ForZone provides information about which zones should consume this endpoint. +message ForZone { + // name represents the name of the zone. + optional string name = 1; +} + diff --git a/vendor/k8s.io/api/discovery/v1beta1/types.go b/vendor/k8s.io/api/discovery/v1beta1/types.go index e14088e8b2ce..eeb46e175a14 100644 --- a/vendor/k8s.io/api/discovery/v1beta1/types.go +++ b/vendor/k8s.io/api/discovery/v1beta1/types.go @@ -24,7 +24,9 @@ import ( // +genclient // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // +k8s:prerelease-lifecycle-gen:introduced=1.16 -// +k8s:prerelease-lifecycle-gen:deprecated=1.22 +// +k8s:prerelease-lifecycle-gen:deprecated=1.21 +// +k8s:prerelease-lifecycle-gen:removed=1.25 +// +k8s:prerelease-lifecycle-gen:replacement=discovery.k8s.io,v1,EndpointSlice // EndpointSlice represents a subset of the endpoints that implement a service. // For a given service there may be multiple EndpointSlice objects, selected by @@ -110,6 +112,11 @@ type Endpoint struct { // with the EndpointSliceNodeName feature gate. // +optional NodeName *string `json:"nodeName,omitempty" protobuf:"bytes,6,opt,name=nodeName"` + // hints contains information associated with how an endpoint should be + // consumed. + // +featureGate=TopologyAwareHints + // +optional + Hints *EndpointHints `json:"hints,omitempty" protobuf:"bytes,7,opt,name=hints"` } // EndpointConditions represents the current condition of an endpoint. @@ -138,6 +145,20 @@ type EndpointConditions struct { Terminating *bool `json:"terminating,omitempty" protobuf:"bytes,3,name=terminating"` } +// EndpointHints provides hints describing how an endpoint should be consumed. +type EndpointHints struct { + // forZones indicates the zone(s) this endpoint should be consumed by to + // enable topology aware routing. May contain a maximum of 8 entries. + // +listType=atomic + ForZones []ForZone `json:"forZones,omitempty" protobuf:"bytes,1,name=forZones"` +} + +// ForZone provides information about which zones should consume this endpoint. +type ForZone struct { + // name represents the name of the zone. + Name string `json:"name" protobuf:"bytes,1,name=name"` +} + // EndpointPort represents a Port used by an EndpointSlice type EndpointPort struct { // The name of this port. All ports in an EndpointSlice must have a unique @@ -169,7 +190,9 @@ type EndpointPort struct { // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // +k8s:prerelease-lifecycle-gen:introduced=1.16 -// +k8s:prerelease-lifecycle-gen:deprecated=1.22 +// +k8s:prerelease-lifecycle-gen:deprecated=1.21 +// +k8s:prerelease-lifecycle-gen:removed=1.25 +// +k8s:prerelease-lifecycle-gen:replacement=discovery.k8s.io,v1,EndpointSlice // EndpointSliceList represents a list of endpoint slices type EndpointSliceList struct { diff --git a/vendor/k8s.io/api/discovery/v1beta1/types_swagger_doc_generated.go b/vendor/k8s.io/api/discovery/v1beta1/types_swagger_doc_generated.go index d48b93d8b502..b4c221999ada 100644 --- a/vendor/k8s.io/api/discovery/v1beta1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/discovery/v1beta1/types_swagger_doc_generated.go @@ -35,6 +35,7 @@ var map_Endpoint = map[string]string{ "targetRef": "targetRef is a reference to a Kubernetes object that represents this endpoint.", "topology": "topology contains arbitrary topology information associated with the endpoint. These key/value pairs must conform with the label format. https://kubernetes.io/docs/concepts/overview/working-with-objects/labels Topology may include a maximum of 16 key/value pairs. This includes, but is not limited to the following well known keys: * kubernetes.io/hostname: the value indicates the hostname of the node\n where the endpoint is located. This should match the corresponding\n node label.\n* topology.kubernetes.io/zone: the value indicates the zone where the\n endpoint is located. This should match the corresponding node label.\n* topology.kubernetes.io/region: the value indicates the region where the\n endpoint is located. This should match the corresponding node label.\nThis field is deprecated and will be removed in future api versions.", "nodeName": "nodeName represents the name of the Node hosting this endpoint. This can be used to determine endpoints local to a Node. This field can be enabled with the EndpointSliceNodeName feature gate.", + "hints": "hints contains information associated with how an endpoint should be consumed.", } func (Endpoint) SwaggerDoc() map[string]string { @@ -52,6 +53,15 @@ func (EndpointConditions) SwaggerDoc() map[string]string { return map_EndpointConditions } +var map_EndpointHints = map[string]string{ + "": "EndpointHints provides hints describing how an endpoint should be consumed.", + "forZones": "forZones indicates the zone(s) this endpoint should be consumed by to enable topology aware routing. May contain a maximum of 8 entries.", +} + +func (EndpointHints) SwaggerDoc() map[string]string { + return map_EndpointHints +} + var map_EndpointPort = map[string]string{ "": "EndpointPort represents a Port used by an EndpointSlice", "name": "The name of this port. All ports in an EndpointSlice must have a unique name. If the EndpointSlice is dervied from a Kubernetes service, this corresponds to the Service.ports[].name. Name must either be an empty string or pass DNS_LABEL validation: * must be no more than 63 characters long. * must consist of lower case alphanumeric characters or '-'. * must start and end with an alphanumeric character. Default is empty string.", @@ -86,4 +96,13 @@ func (EndpointSliceList) SwaggerDoc() map[string]string { return map_EndpointSliceList } +var map_ForZone = map[string]string{ + "": "ForZone provides information about which zones should consume this endpoint.", + "name": "name represents the name of the zone.", +} + +func (ForZone) SwaggerDoc() map[string]string { + return map_ForZone +} + // AUTO-GENERATED FUNCTIONS END HERE diff --git a/vendor/k8s.io/api/discovery/v1beta1/zz_generated.deepcopy.go b/vendor/k8s.io/api/discovery/v1beta1/zz_generated.deepcopy.go index 7076553d291b..f13536b4bc6e 100644 --- a/vendor/k8s.io/api/discovery/v1beta1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/discovery/v1beta1/zz_generated.deepcopy.go @@ -56,6 +56,11 @@ func (in *Endpoint) DeepCopyInto(out *Endpoint) { *out = new(string) **out = **in } + if in.Hints != nil { + in, out := &in.Hints, &out.Hints + *out = new(EndpointHints) + (*in).DeepCopyInto(*out) + } return } @@ -100,6 +105,27 @@ func (in *EndpointConditions) DeepCopy() *EndpointConditions { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *EndpointHints) DeepCopyInto(out *EndpointHints) { + *out = *in + if in.ForZones != nil { + in, out := &in.ForZones, &out.ForZones + *out = make([]ForZone, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EndpointHints. +func (in *EndpointHints) DeepCopy() *EndpointHints { + if in == nil { + return nil + } + out := new(EndpointHints) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *EndpointPort) DeepCopyInto(out *EndpointPort) { *out = *in @@ -208,3 +234,19 @@ func (in *EndpointSliceList) DeepCopyObject() runtime.Object { } return nil } + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ForZone) DeepCopyInto(out *ForZone) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ForZone. +func (in *ForZone) DeepCopy() *ForZone { + if in == nil { + return nil + } + out := new(ForZone) + in.DeepCopyInto(out) + return out +} diff --git a/vendor/k8s.io/api/discovery/v1beta1/zz_generated.prerelease-lifecycle.go b/vendor/k8s.io/api/discovery/v1beta1/zz_generated.prerelease-lifecycle.go index 09e94d0e8bb0..c0f2c63f09ac 100644 --- a/vendor/k8s.io/api/discovery/v1beta1/zz_generated.prerelease-lifecycle.go +++ b/vendor/k8s.io/api/discovery/v1beta1/zz_generated.prerelease-lifecycle.go @@ -20,6 +20,10 @@ limitations under the License. package v1beta1 +import ( + schema "k8s.io/apimachinery/pkg/runtime/schema" +) + // APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. // It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. func (in *EndpointSlice) APILifecycleIntroduced() (major, minor int) { @@ -29,7 +33,13 @@ func (in *EndpointSlice) APILifecycleIntroduced() (major, minor int) { // APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. // It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. func (in *EndpointSlice) APILifecycleDeprecated() (major, minor int) { - return 1, 22 + return 1, 21 +} + +// APILifecycleReplacement is an autogenerated function, returning the group, version, and kind that should be used instead of this deprecated type. +// It is controlled by "k8s:prerelease-lifecycle-gen:replacement=,," tags in types.go. +func (in *EndpointSlice) APILifecycleReplacement() schema.GroupVersionKind { + return schema.GroupVersionKind{Group: "discovery.k8s.io", Version: "v1", Kind: "EndpointSlice"} } // APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. @@ -47,7 +57,13 @@ func (in *EndpointSliceList) APILifecycleIntroduced() (major, minor int) { // APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. // It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. func (in *EndpointSliceList) APILifecycleDeprecated() (major, minor int) { - return 1, 22 + return 1, 21 +} + +// APILifecycleReplacement is an autogenerated function, returning the group, version, and kind that should be used instead of this deprecated type. +// It is controlled by "k8s:prerelease-lifecycle-gen:replacement=,," tags in types.go. +func (in *EndpointSliceList) APILifecycleReplacement() schema.GroupVersionKind { + return schema.GroupVersionKind{Group: "discovery.k8s.io", Version: "v1", Kind: "EndpointSlice"} } // APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. diff --git a/vendor/k8s.io/api/events/v1/BUILD b/vendor/k8s.io/api/events/v1/BUILD deleted file mode 100644 index 15ecf48bbd82..000000000000 --- a/vendor/k8s.io/api/events/v1/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/api/events/v1", - importpath = "k8s.io/api/events/v1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/events/v1/generated.pb.go b/vendor/k8s.io/api/events/v1/generated.pb.go index 717137cffe58..70ad588a6280 100644 --- a/vendor/k8s.io/api/events/v1/generated.pb.go +++ b/vendor/k8s.io/api/events/v1/generated.pb.go @@ -1077,10 +1077,7 @@ func (m *Event) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1197,10 +1194,7 @@ func (m *EventList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1302,10 +1296,7 @@ func (m *EventSeries) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/api/events/v1/generated.proto b/vendor/k8s.io/api/events/v1/generated.proto index 690c99e4c5a7..04df31b0c1cf 100644 --- a/vendor/k8s.io/api/events/v1/generated.proto +++ b/vendor/k8s.io/api/events/v1/generated.proto @@ -36,6 +36,9 @@ option go_package = "v1"; // continued existence of events with that Reason. Events should be // treated as informative, best-effort, supplemental data. message Event { + // Standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +optional optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; // eventTime is the time when this Event was first observed. It is required. diff --git a/vendor/k8s.io/api/events/v1/types.go b/vendor/k8s.io/api/events/v1/types.go index 4bf715872ab5..e01a2b21e73a 100644 --- a/vendor/k8s.io/api/events/v1/types.go +++ b/vendor/k8s.io/api/events/v1/types.go @@ -33,6 +33,9 @@ import ( type Event struct { metav1.TypeMeta `json:",inline"` + // Standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +optional metav1.ObjectMeta `json:"metadata" protobuf:"bytes,1,opt,name=metadata"` // eventTime is the time when this Event was first observed. It is required. diff --git a/vendor/k8s.io/api/events/v1/types_swagger_doc_generated.go b/vendor/k8s.io/api/events/v1/types_swagger_doc_generated.go index 7255727bb498..797da63bb722 100644 --- a/vendor/k8s.io/api/events/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/events/v1/types_swagger_doc_generated.go @@ -29,6 +29,7 @@ package v1 // AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. var map_Event = map[string]string{ "": "Event is a report of an event somewhere in the cluster. It generally denotes some state change in the system. Events have a limited retention time and triggers and messages may evolve with time. Event consumers should not rely on the timing of an event with a given Reason reflecting a consistent underlying trigger, or the continued existence of events with that Reason. Events should be treated as informative, best-effort, supplemental data.", + "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", "eventTime": "eventTime is the time when this Event was first observed. It is required.", "series": "series is data about the Event series this event represents or nil if it's a singleton Event.", "reportingController": "reportingController is the name of the controller that emitted this Event, e.g. `kubernetes.io/kubelet`. This field cannot be empty for new Events.", diff --git a/vendor/k8s.io/api/events/v1beta1/BUILD b/vendor/k8s.io/api/events/v1beta1/BUILD deleted file mode 100644 index 7e5bbf2449dc..000000000000 --- a/vendor/k8s.io/api/events/v1beta1/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - "zz_generated.prerelease-lifecycle.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/api/events/v1beta1", - importpath = "k8s.io/api/events/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/events/v1beta1/generated.pb.go b/vendor/k8s.io/api/events/v1beta1/generated.pb.go index 3709ef633a7a..d92411bc8ab2 100644 --- a/vendor/k8s.io/api/events/v1beta1/generated.pb.go +++ b/vendor/k8s.io/api/events/v1beta1/generated.pb.go @@ -1077,10 +1077,7 @@ func (m *Event) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1197,10 +1194,7 @@ func (m *EventList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1302,10 +1296,7 @@ func (m *EventSeries) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/api/events/v1beta1/generated.proto b/vendor/k8s.io/api/events/v1beta1/generated.proto index 90b57d8d08ab..57e95b9648f6 100644 --- a/vendor/k8s.io/api/events/v1beta1/generated.proto +++ b/vendor/k8s.io/api/events/v1beta1/generated.proto @@ -36,6 +36,9 @@ option go_package = "v1beta1"; // continued existence of events with that Reason. Events should be // treated as informative, best-effort, supplemental data. message Event { + // Standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +optional optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; // eventTime is the time when this Event was first observed. It is required. diff --git a/vendor/k8s.io/api/events/v1beta1/types.go b/vendor/k8s.io/api/events/v1beta1/types.go index 796e56ea7daf..5bb6f92b22f6 100644 --- a/vendor/k8s.io/api/events/v1beta1/types.go +++ b/vendor/k8s.io/api/events/v1beta1/types.go @@ -35,6 +35,9 @@ import ( type Event struct { metav1.TypeMeta `json:",inline"` + // Standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +optional metav1.ObjectMeta `json:"metadata" protobuf:"bytes,1,opt,name=metadata"` // eventTime is the time when this Event was first observed. It is required. diff --git a/vendor/k8s.io/api/events/v1beta1/types_swagger_doc_generated.go b/vendor/k8s.io/api/events/v1beta1/types_swagger_doc_generated.go index 7f8e162cdd4b..0e6bd5a83c54 100644 --- a/vendor/k8s.io/api/events/v1beta1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/events/v1beta1/types_swagger_doc_generated.go @@ -29,6 +29,7 @@ package v1beta1 // AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. var map_Event = map[string]string{ "": "Event is a report of an event somewhere in the cluster. It generally denotes some state change in the system. Events have a limited retention time and triggers and messages may evolve with time. Event consumers should not rely on the timing of an event with a given Reason reflecting a consistent underlying trigger, or the continued existence of events with that Reason. Events should be treated as informative, best-effort, supplemental data.", + "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", "eventTime": "eventTime is the time when this Event was first observed. It is required.", "series": "series is data about the Event series this event represents or nil if it's a singleton Event.", "reportingController": "reportingController is the name of the controller that emitted this Event, e.g. `kubernetes.io/kubelet`. This field cannot be empty for new Events.", diff --git a/vendor/k8s.io/api/extensions/v1beta1/BUILD b/vendor/k8s.io/api/extensions/v1beta1/BUILD deleted file mode 100644 index 59e2564b2b0c..000000000000 --- a/vendor/k8s.io/api/extensions/v1beta1/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - "zz_generated.prerelease-lifecycle.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/api/extensions/v1beta1", - importpath = "k8s.io/api/extensions/v1beta1", - deps = [ - "//staging/src/k8s.io/api/apps/v1beta1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/api/extensions/v1beta1/generated.pb.go b/vendor/k8s.io/api/extensions/v1beta1/generated.pb.go index bd37f432c46c..20b3b2a00680 100644 --- a/vendor/k8s.io/api/extensions/v1beta1/generated.pb.go +++ b/vendor/k8s.io/api/extensions/v1beta1/generated.pb.go @@ -1683,241 +1683,243 @@ func init() { } var fileDescriptor_cdc93917efc28165 = []byte{ - // 3743 bytes of a gzipped FileDescriptorProto + // 3761 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5b, 0x4d, 0x6c, 0x1c, 0xc7, 0x72, 0xd6, 0xec, 0x2e, 0xb9, 0xcb, 0xe2, 0x7f, 0x93, 0x22, 0xf7, 0x49, 0x4f, 0x5c, 0xbd, 0x31, - 0xa0, 0xc8, 0x8e, 0xb4, 0x6b, 0xc9, 0x92, 0x9e, 0x22, 0x21, 0xef, 0x99, 0x4b, 0x8a, 0x12, 0x5f, + 0xa2, 0xc8, 0x8e, 0xb4, 0x6b, 0xc9, 0x92, 0x9e, 0x22, 0x21, 0xef, 0x99, 0x4b, 0x8a, 0x12, 0x5f, 0xf8, 0xb3, 0xee, 0x25, 0x65, 0xc3, 0x88, 0x1d, 0x0f, 0x77, 0x9b, 0xcb, 0x11, 0x67, 0x67, 0xc6, - 0xd3, 0xb3, 0x34, 0x17, 0xc8, 0x21, 0x87, 0x20, 0x80, 0x81, 0x00, 0xc9, 0xc5, 0x49, 0x8e, 0x31, - 0x02, 0xe4, 0x94, 0x20, 0xc7, 0xe4, 0x60, 0x18, 0x09, 0xe2, 0x00, 0x42, 0xe0, 0x04, 0xbe, 0xc5, - 0x27, 0x22, 0xa6, 0x4f, 0x41, 0x4e, 0xb9, 0x05, 0x3a, 0x05, 0xdd, 0xd3, 0xf3, 0x3f, 0xc3, 0x1d, - 0xd2, 0x12, 0x11, 0x03, 0xef, 0x24, 0x6e, 0x57, 0xd5, 0x57, 0xd5, 0xdd, 0xd5, 0x55, 0xd5, 0x3d, - 0x25, 0x58, 0xd9, 0xbf, 0x4f, 0xab, 0xaa, 0x51, 0xdb, 0xef, 0xed, 0x10, 0x4b, 0x27, 0x36, 0xa1, - 0xb5, 0x03, 0xa2, 0xb7, 0x0d, 0xab, 0x26, 0x08, 0x8a, 0xa9, 0xd6, 0xc8, 0xa1, 0x4d, 0x74, 0xaa, - 0x1a, 0x3a, 0xad, 0x1d, 0xdc, 0xda, 0x21, 0xb6, 0x72, 0xab, 0xd6, 0x21, 0x3a, 0xb1, 0x14, 0x9b, - 0xb4, 0xab, 0xa6, 0x65, 0xd8, 0x06, 0xba, 0xe2, 0xb0, 0x57, 0x15, 0x53, 0xad, 0xfa, 0xec, 0x55, - 0xc1, 0x7e, 0xe9, 0x66, 0x47, 0xb5, 0xf7, 0x7a, 0x3b, 0xd5, 0x96, 0xd1, 0xad, 0x75, 0x8c, 0x8e, - 0x51, 0xe3, 0x52, 0x3b, 0xbd, 0x5d, 0xfe, 0x8b, 0xff, 0xe0, 0x7f, 0x39, 0x68, 0x97, 0xe4, 0x80, - 0xf2, 0x96, 0x61, 0x91, 0xda, 0x41, 0x4c, 0xe3, 0xa5, 0x3b, 0x3e, 0x4f, 0x57, 0x69, 0xed, 0xa9, - 0x3a, 0xb1, 0xfa, 0x35, 0x73, 0xbf, 0xc3, 0x06, 0x68, 0xad, 0x4b, 0x6c, 0x25, 0x49, 0xaa, 0x96, - 0x26, 0x65, 0xf5, 0x74, 0x5b, 0xed, 0x92, 0x98, 0xc0, 0xbd, 0x41, 0x02, 0xb4, 0xb5, 0x47, 0xba, - 0x4a, 0x4c, 0xee, 0xad, 0x34, 0xb9, 0x9e, 0xad, 0x6a, 0x35, 0x55, 0xb7, 0xa9, 0x6d, 0x45, 0x85, - 0xe4, 0x3b, 0x30, 0xb5, 0xa8, 0x69, 0xc6, 0x27, 0xa4, 0xbd, 0xd4, 0x5c, 0x5d, 0xb6, 0xd4, 0x03, - 0x62, 0xa1, 0xab, 0x50, 0xd0, 0x95, 0x2e, 0x29, 0x4b, 0x57, 0xa5, 0xeb, 0x23, 0xf5, 0xb1, 0xe7, - 0x47, 0x95, 0x0b, 0xc7, 0x47, 0x95, 0xc2, 0x86, 0xd2, 0x25, 0x98, 0x53, 0xe4, 0x87, 0x30, 0x2d, - 0xa4, 0x56, 0x34, 0x72, 0xf8, 0xd4, 0xd0, 0x7a, 0x5d, 0x82, 0xae, 0xc1, 0x70, 0x9b, 0x03, 0x08, - 0xc1, 0x09, 0x21, 0x38, 0xec, 0xc0, 0x62, 0x41, 0x95, 0x29, 0x4c, 0x0a, 0xe1, 0x27, 0x06, 0xb5, - 0x1b, 0x8a, 0xbd, 0x87, 0x6e, 0x03, 0x98, 0x8a, 0xbd, 0xd7, 0xb0, 0xc8, 0xae, 0x7a, 0x28, 0xc4, - 0x91, 0x10, 0x87, 0x86, 0x47, 0xc1, 0x01, 0x2e, 0x74, 0x03, 0x4a, 0x16, 0x51, 0xda, 0x9b, 0xba, - 0xd6, 0x2f, 0xe7, 0xae, 0x4a, 0xd7, 0x4b, 0xf5, 0x29, 0x21, 0x51, 0xc2, 0x62, 0x1c, 0x7b, 0x1c, - 0xf2, 0x67, 0x39, 0x18, 0x59, 0x56, 0x48, 0xd7, 0xd0, 0x9b, 0xc4, 0x46, 0x1f, 0x41, 0x89, 0x6d, - 0x57, 0x5b, 0xb1, 0x15, 0xae, 0x6d, 0xf4, 0xf6, 0x9b, 0x55, 0xdf, 0x9d, 0xbc, 0xd5, 0xab, 0x9a, - 0xfb, 0x1d, 0x36, 0x40, 0xab, 0x8c, 0xbb, 0x7a, 0x70, 0xab, 0xba, 0xb9, 0xf3, 0x8c, 0xb4, 0xec, - 0x75, 0x62, 0x2b, 0xbe, 0x7d, 0xfe, 0x18, 0xf6, 0x50, 0xd1, 0x06, 0x14, 0xa8, 0x49, 0x5a, 0xdc, - 0xb2, 0xd1, 0xdb, 0x37, 0xaa, 0x27, 0x3a, 0x6b, 0xd5, 0xb3, 0xac, 0x69, 0x92, 0x96, 0xbf, 0xe2, - 0xec, 0x17, 0xe6, 0x38, 0xe8, 0x29, 0x0c, 0x53, 0x5b, 0xb1, 0x7b, 0xb4, 0x9c, 0xe7, 0x88, 0xd5, - 0xcc, 0x88, 0x5c, 0xca, 0xdf, 0x0c, 0xe7, 0x37, 0x16, 0x68, 0xf2, 0x7f, 0xe5, 0x00, 0x79, 0xbc, - 0x4b, 0x86, 0xde, 0x56, 0x6d, 0xd5, 0xd0, 0xd1, 0x03, 0x28, 0xd8, 0x7d, 0xd3, 0x75, 0x81, 0x6b, - 0xae, 0x41, 0x5b, 0x7d, 0x93, 0xbc, 0x38, 0xaa, 0xcc, 0xc5, 0x25, 0x18, 0x05, 0x73, 0x19, 0xb4, - 0xe6, 0x99, 0x9a, 0xe3, 0xd2, 0x77, 0xc2, 0xaa, 0x5f, 0x1c, 0x55, 0x12, 0x0e, 0x5b, 0xd5, 0x43, - 0x0a, 0x1b, 0x88, 0x0e, 0x00, 0x69, 0x0a, 0xb5, 0xb7, 0x2c, 0x45, 0xa7, 0x8e, 0x26, 0xb5, 0x4b, - 0xc4, 0x22, 0xbc, 0x91, 0x6d, 0xd3, 0x98, 0x44, 0xfd, 0x92, 0xb0, 0x02, 0xad, 0xc5, 0xd0, 0x70, - 0x82, 0x06, 0xe6, 0xcd, 0x16, 0x51, 0xa8, 0xa1, 0x97, 0x0b, 0x61, 0x6f, 0xc6, 0x7c, 0x14, 0x0b, - 0x2a, 0x7a, 0x1d, 0x8a, 0x5d, 0x42, 0xa9, 0xd2, 0x21, 0xe5, 0x21, 0xce, 0x38, 0x29, 0x18, 0x8b, - 0xeb, 0xce, 0x30, 0x76, 0xe9, 0xf2, 0x17, 0x12, 0x8c, 0x7b, 0x2b, 0xb7, 0xa6, 0x52, 0x1b, 0xfd, - 0x6e, 0xcc, 0x0f, 0xab, 0xd9, 0xa6, 0xc4, 0xa4, 0xb9, 0x17, 0x7a, 0x3e, 0xef, 0x8e, 0x04, 0x7c, - 0x70, 0x1d, 0x86, 0x54, 0x9b, 0x74, 0xd9, 0x3e, 0xe4, 0xaf, 0x8f, 0xde, 0xbe, 0x9e, 0xd5, 0x65, - 0xea, 0xe3, 0x02, 0x74, 0x68, 0x95, 0x89, 0x63, 0x07, 0x45, 0xfe, 0xb3, 0x42, 0xc0, 0x7c, 0xe6, - 0x9a, 0xe8, 0x03, 0x28, 0x51, 0xa2, 0x91, 0x96, 0x6d, 0x58, 0xc2, 0xfc, 0xb7, 0x32, 0x9a, 0xaf, - 0xec, 0x10, 0xad, 0x29, 0x44, 0xeb, 0x63, 0xcc, 0x7e, 0xf7, 0x17, 0xf6, 0x20, 0xd1, 0x3b, 0x50, - 0xb2, 0x49, 0xd7, 0xd4, 0x14, 0x9b, 0x88, 0x73, 0xf4, 0x5a, 0x70, 0x0a, 0xcc, 0x73, 0x18, 0x58, - 0xc3, 0x68, 0x6f, 0x09, 0x36, 0x7e, 0x7c, 0xbc, 0x25, 0x71, 0x47, 0xb1, 0x07, 0x83, 0x0e, 0x60, - 0xa2, 0x67, 0xb6, 0x19, 0xa7, 0xcd, 0xa2, 0x60, 0xa7, 0x2f, 0x3c, 0xe9, 0x5e, 0xd6, 0xb5, 0xd9, - 0x0e, 0x49, 0xd7, 0xe7, 0x84, 0xae, 0x89, 0xf0, 0x38, 0x8e, 0x68, 0x41, 0x8b, 0x30, 0xd9, 0x55, - 0x75, 0x16, 0x97, 0xfa, 0x4d, 0xd2, 0x32, 0xf4, 0x36, 0xe5, 0x6e, 0x35, 0x54, 0x9f, 0x17, 0x00, - 0x93, 0xeb, 0x61, 0x32, 0x8e, 0xf2, 0xa3, 0x5f, 0x01, 0x72, 0xa7, 0xf1, 0xd8, 0x09, 0xe2, 0xaa, - 0xa1, 0x73, 0x9f, 0xcb, 0xfb, 0xce, 0xbd, 0x15, 0xe3, 0xc0, 0x09, 0x52, 0x68, 0x0d, 0x66, 0x2d, - 0x72, 0xa0, 0xb2, 0x39, 0x3e, 0x51, 0xa9, 0x6d, 0x58, 0xfd, 0x35, 0xb5, 0xab, 0xda, 0xe5, 0x61, - 0x6e, 0x53, 0xf9, 0xf8, 0xa8, 0x32, 0x8b, 0x13, 0xe8, 0x38, 0x51, 0x4a, 0xfe, 0xf3, 0x61, 0x98, - 0x8c, 0xc4, 0x1b, 0xf4, 0x14, 0xe6, 0x5a, 0x3d, 0xcb, 0x22, 0xba, 0xbd, 0xd1, 0xeb, 0xee, 0x10, - 0xab, 0xd9, 0xda, 0x23, 0xed, 0x9e, 0x46, 0xda, 0xdc, 0x51, 0x86, 0xea, 0x0b, 0xc2, 0xe2, 0xb9, - 0xa5, 0x44, 0x2e, 0x9c, 0x22, 0xcd, 0x56, 0x41, 0xe7, 0x43, 0xeb, 0x2a, 0xa5, 0x1e, 0x66, 0x8e, - 0x63, 0x7a, 0xab, 0xb0, 0x11, 0xe3, 0xc0, 0x09, 0x52, 0xcc, 0xc6, 0x36, 0xa1, 0xaa, 0x45, 0xda, - 0x51, 0x1b, 0xf3, 0x61, 0x1b, 0x97, 0x13, 0xb9, 0x70, 0x8a, 0x34, 0xba, 0x0b, 0xa3, 0x8e, 0x36, - 0xbe, 0x7f, 0x62, 0xa3, 0x67, 0x04, 0xd8, 0xe8, 0x86, 0x4f, 0xc2, 0x41, 0x3e, 0x36, 0x35, 0x63, - 0x87, 0x12, 0xeb, 0x80, 0xb4, 0xd3, 0x37, 0x78, 0x33, 0xc6, 0x81, 0x13, 0xa4, 0xd8, 0xd4, 0x1c, - 0x0f, 0x8c, 0x4d, 0x6d, 0x38, 0x3c, 0xb5, 0xed, 0x44, 0x2e, 0x9c, 0x22, 0xcd, 0xfc, 0xd8, 0x31, - 0x79, 0xf1, 0x40, 0x51, 0x35, 0x65, 0x47, 0x23, 0xe5, 0x62, 0xd8, 0x8f, 0x37, 0xc2, 0x64, 0x1c, - 0xe5, 0x47, 0x8f, 0x61, 0xda, 0x19, 0xda, 0xd6, 0x15, 0x0f, 0xa4, 0xc4, 0x41, 0x7e, 0x22, 0x40, - 0xa6, 0x37, 0xa2, 0x0c, 0x38, 0x2e, 0x83, 0x1e, 0xc0, 0x44, 0xcb, 0xd0, 0x34, 0xee, 0x8f, 0x4b, - 0x46, 0x4f, 0xb7, 0xcb, 0x23, 0x1c, 0x05, 0xb1, 0xf3, 0xb8, 0x14, 0xa2, 0xe0, 0x08, 0x27, 0x22, - 0x00, 0x2d, 0x37, 0xe1, 0xd0, 0x32, 0xf0, 0xf8, 0x78, 0x2b, 0x6b, 0x0c, 0xf0, 0x52, 0x95, 0x5f, - 0x03, 0x78, 0x43, 0x14, 0x07, 0x80, 0xe5, 0x7f, 0x95, 0x60, 0x3e, 0x25, 0x74, 0xa0, 0x5f, 0x86, - 0x52, 0xec, 0x6f, 0x46, 0x52, 0xec, 0xe5, 0x14, 0xb1, 0x40, 0x9e, 0xd5, 0x61, 0xdc, 0x62, 0xb3, - 0xd2, 0x3b, 0x0e, 0x8b, 0x88, 0x91, 0x77, 0x07, 0x4c, 0x03, 0x07, 0x65, 0xfc, 0x98, 0x3f, 0x7d, - 0x7c, 0x54, 0x19, 0x0f, 0xd1, 0x70, 0x18, 0x5e, 0xfe, 0x8b, 0x1c, 0xc0, 0x32, 0x31, 0x35, 0xa3, - 0xdf, 0x25, 0xfa, 0x79, 0xd4, 0x50, 0x9b, 0xa1, 0x1a, 0xea, 0xe6, 0xa0, 0xed, 0xf1, 0x4c, 0x4b, - 0x2d, 0xa2, 0xde, 0x8d, 0x14, 0x51, 0xb5, 0xec, 0x90, 0x27, 0x57, 0x51, 0xff, 0x91, 0x87, 0x19, - 0x9f, 0xd9, 0x2f, 0xa3, 0x1e, 0x86, 0xf6, 0xf8, 0x37, 0x22, 0x7b, 0x3c, 0x9f, 0x20, 0xf2, 0xca, - 0xea, 0xa8, 0x67, 0x30, 0xc1, 0xaa, 0x1c, 0x67, 0x2f, 0x79, 0x0d, 0x35, 0x7c, 0xea, 0x1a, 0xca, - 0xcb, 0x76, 0x6b, 0x21, 0x24, 0x1c, 0x41, 0x4e, 0xa9, 0xd9, 0x8a, 0x3f, 0xc6, 0x9a, 0xed, 0x4b, - 0x09, 0x26, 0xfc, 0x6d, 0x3a, 0x87, 0xa2, 0x6d, 0x23, 0x5c, 0xb4, 0xbd, 0x9e, 0xd9, 0x45, 0x53, - 0xaa, 0xb6, 0xff, 0x65, 0x05, 0xbe, 0xc7, 0xc4, 0x0e, 0xf8, 0x8e, 0xd2, 0xda, 0x1f, 0x7c, 0xc7, - 0x43, 0x9f, 0x49, 0x80, 0x44, 0x16, 0x58, 0xd4, 0x75, 0xc3, 0x56, 0x9c, 0x58, 0xe9, 0x98, 0xb5, - 0x9a, 0xd9, 0x2c, 0x57, 0x63, 0x75, 0x3b, 0x86, 0xf5, 0x48, 0xb7, 0xad, 0xbe, 0xbf, 0xc9, 0x71, - 0x06, 0x9c, 0x60, 0x00, 0x52, 0x00, 0x2c, 0x81, 0xb9, 0x65, 0x88, 0x83, 0x7c, 0x33, 0x43, 0xcc, - 0x63, 0x02, 0x4b, 0x86, 0xbe, 0xab, 0x76, 0xfc, 0xb0, 0x83, 0x3d, 0x20, 0x1c, 0x00, 0xbd, 0xf4, - 0x08, 0xe6, 0x53, 0xac, 0x45, 0x53, 0x90, 0xdf, 0x27, 0x7d, 0x67, 0xd9, 0x30, 0xfb, 0x13, 0xcd, - 0xc2, 0xd0, 0x81, 0xa2, 0xf5, 0x9c, 0xf0, 0x3b, 0x82, 0x9d, 0x1f, 0x0f, 0x72, 0xf7, 0x25, 0xf9, - 0x8b, 0xa1, 0xa0, 0xef, 0xf0, 0x8a, 0xf9, 0x3a, 0xbb, 0xb4, 0x9a, 0x9a, 0xda, 0x52, 0xa8, 0x28, - 0x84, 0xc6, 0x9c, 0x0b, 0xab, 0x33, 0x86, 0x3d, 0x6a, 0xa8, 0xb6, 0xce, 0xbd, 0xda, 0xda, 0x3a, - 0xff, 0x72, 0x6a, 0xeb, 0xdf, 0x83, 0x12, 0x75, 0xab, 0xea, 0x02, 0x87, 0xbc, 0x75, 0x8a, 0xf8, - 0x2a, 0x0a, 0x6a, 0x4f, 0x81, 0x57, 0x4a, 0x7b, 0xa0, 0x49, 0x45, 0xf4, 0xd0, 0x29, 0x8b, 0xe8, - 0x97, 0x5a, 0xf8, 0xb2, 0x78, 0x63, 0x2a, 0x3d, 0x4a, 0xda, 0x3c, 0xb6, 0x95, 0xfc, 0x78, 0xd3, - 0xe0, 0xa3, 0x58, 0x50, 0xd1, 0x07, 0x21, 0x97, 0x2d, 0x9d, 0xc5, 0x65, 0x27, 0xd2, 0xdd, 0x15, - 0x6d, 0xc3, 0xbc, 0x69, 0x19, 0x1d, 0x8b, 0x50, 0xba, 0x4c, 0x94, 0xb6, 0xa6, 0xea, 0xc4, 0x5d, - 0x1f, 0xa7, 0x22, 0xba, 0x7c, 0x7c, 0x54, 0x99, 0x6f, 0x24, 0xb3, 0xe0, 0x34, 0x59, 0xf9, 0x79, - 0x01, 0xa6, 0xa2, 0x19, 0x30, 0xa5, 0x48, 0x95, 0xce, 0x54, 0xa4, 0xde, 0x08, 0x1c, 0x06, 0xa7, - 0x82, 0x0f, 0xbc, 0xe0, 0xc4, 0x0e, 0xc4, 0x22, 0x4c, 0x8a, 0x68, 0xe0, 0x12, 0x45, 0x99, 0xee, - 0xed, 0xfe, 0x76, 0x98, 0x8c, 0xa3, 0xfc, 0xe8, 0x21, 0x8c, 0x5b, 0xbc, 0xee, 0x76, 0x01, 0x9c, - 0xda, 0xf5, 0xa2, 0x00, 0x18, 0xc7, 0x41, 0x22, 0x0e, 0xf3, 0xb2, 0xba, 0xd5, 0x2f, 0x47, 0x5d, - 0x80, 0x42, 0xb8, 0x6e, 0x5d, 0x8c, 0x32, 0xe0, 0xb8, 0x0c, 0x5a, 0x87, 0x99, 0x9e, 0x1e, 0x87, - 0x72, 0x5c, 0xf9, 0xb2, 0x80, 0x9a, 0xd9, 0x8e, 0xb3, 0xe0, 0x24, 0x39, 0xb4, 0x1b, 0x2a, 0x65, - 0x87, 0x79, 0x78, 0xbe, 0x9d, 0xf9, 0xe0, 0x65, 0xae, 0x65, 0x13, 0xca, 0xed, 0x52, 0xd6, 0x72, - 0x5b, 0xfe, 0x27, 0x29, 0x98, 0x84, 0xbc, 0x12, 0x78, 0xd0, 0x2b, 0x53, 0x4c, 0x22, 0x50, 0x1d, - 0x19, 0xc9, 0xd5, 0xef, 0xbd, 0x53, 0x55, 0xbf, 0x7e, 0xf2, 0x1c, 0x5c, 0xfe, 0x7e, 0x2e, 0xc1, - 0xdc, 0x4a, 0xf3, 0xb1, 0x65, 0xf4, 0x4c, 0xd7, 0x9c, 0x4d, 0xd3, 0x59, 0x9a, 0x9f, 0x43, 0xc1, - 0xea, 0x69, 0xee, 0x3c, 0x5e, 0x73, 0xe7, 0x81, 0x7b, 0x1a, 0x9b, 0xc7, 0x4c, 0x44, 0xca, 0x99, - 0x04, 0x13, 0x40, 0x1b, 0x30, 0x6c, 0x29, 0x7a, 0x87, 0xb8, 0x69, 0xf5, 0xda, 0x00, 0xeb, 0x57, - 0x97, 0x31, 0x63, 0x0f, 0x14, 0x36, 0x5c, 0x1a, 0x0b, 0x14, 0xf9, 0x9f, 0x25, 0x98, 0x7c, 0xb2, - 0xb5, 0xd5, 0x58, 0xd5, 0xf9, 0x89, 0xe6, 0x6f, 0xab, 0x57, 0xa1, 0x60, 0x2a, 0xf6, 0x5e, 0x34, - 0xd3, 0x33, 0x1a, 0xe6, 0x14, 0x74, 0x07, 0x4a, 0xec, 0x5f, 0x66, 0x17, 0x3f, 0x52, 0x23, 0x3c, - 0x10, 0x96, 0x1a, 0x62, 0xec, 0x45, 0xe0, 0x6f, 0xec, 0x71, 0xa2, 0xf7, 0xa0, 0xc8, 0xe2, 0x0f, - 0xd1, 0xdb, 0x19, 0x0b, 0x74, 0x61, 0x54, 0xdd, 0x11, 0xf2, 0x6b, 0x2e, 0x31, 0x80, 0x5d, 0x38, - 0x79, 0x1f, 0x66, 0x03, 0x93, 0x60, 0xab, 0xf8, 0x94, 0xe5, 0x54, 0xd4, 0x84, 0x21, 0xa6, 0x9d, - 0x65, 0xce, 0x7c, 0x86, 0x27, 0xd0, 0xc8, 0x42, 0xf8, 0xf5, 0x11, 0xfb, 0x45, 0xb1, 0x83, 0x25, - 0xaf, 0xc3, 0x38, 0x7f, 0x86, 0x36, 0x2c, 0x9b, 0x2f, 0x26, 0xba, 0x02, 0xf9, 0xae, 0xaa, 0x8b, - 0xec, 0x3c, 0x2a, 0x64, 0xf2, 0x2c, 0xb3, 0xb0, 0x71, 0x4e, 0x56, 0x0e, 0x45, 0xbc, 0xf2, 0xc9, - 0xca, 0x21, 0x66, 0xe3, 0xf2, 0x63, 0x28, 0x8a, 0x4d, 0x0a, 0x02, 0xe5, 0x4f, 0x06, 0xca, 0x27, - 0x00, 0x6d, 0x42, 0x71, 0xb5, 0x51, 0xd7, 0x0c, 0xa7, 0x56, 0x6b, 0xa9, 0x6d, 0x2b, 0xba, 0x83, - 0x4b, 0xab, 0xcb, 0x18, 0x73, 0x0a, 0x92, 0x61, 0x98, 0x1c, 0xb6, 0x88, 0x69, 0x73, 0x3f, 0x1a, - 0xa9, 0x03, 0xf3, 0x8d, 0x47, 0x7c, 0x04, 0x0b, 0x8a, 0xfc, 0x27, 0x39, 0x28, 0x8a, 0xe5, 0x38, - 0x87, 0xbb, 0xdb, 0x5a, 0xe8, 0xee, 0xf6, 0x46, 0x36, 0xd7, 0x48, 0xbd, 0xb8, 0x6d, 0x45, 0x2e, - 0x6e, 0x37, 0x32, 0xe2, 0x9d, 0x7c, 0x6b, 0xfb, 0x34, 0x07, 0x13, 0x61, 0xa7, 0x44, 0x77, 0x61, - 0x94, 0xa5, 0x29, 0xb5, 0x45, 0x36, 0xfc, 0xea, 0xd8, 0x7b, 0xba, 0x69, 0xfa, 0x24, 0x1c, 0xe4, - 0x43, 0x1d, 0x4f, 0x8c, 0xf9, 0x91, 0x98, 0x74, 0xfa, 0x92, 0xf6, 0x6c, 0x55, 0xab, 0x3a, 0x1f, - 0x64, 0xaa, 0xab, 0xba, 0xbd, 0x69, 0x35, 0x6d, 0x4b, 0xd5, 0x3b, 0x31, 0x45, 0xdc, 0x29, 0x83, - 0xc8, 0xe8, 0x5d, 0x96, 0x32, 0xa9, 0xd1, 0xb3, 0x5a, 0x24, 0xa9, 0xf4, 0x75, 0xcb, 0x36, 0x76, - 0x40, 0xdb, 0x6b, 0x46, 0x4b, 0xd1, 0x9c, 0xcd, 0xc1, 0x64, 0x97, 0x58, 0x44, 0x6f, 0x11, 0xb7, - 0xdc, 0x74, 0x20, 0xb0, 0x07, 0x26, 0xff, 0x83, 0x04, 0xa3, 0x62, 0x2d, 0xce, 0xe1, 0x92, 0xf3, - 0x3b, 0xe1, 0x4b, 0xce, 0xb5, 0x8c, 0x91, 0x23, 0xf9, 0x86, 0xf3, 0xd7, 0xbe, 0xe9, 0x2c, 0x56, - 0xb0, 0xe3, 0xb2, 0x67, 0x50, 0x3b, 0x7a, 0x5c, 0xd8, 0x29, 0xc7, 0x9c, 0x82, 0x7a, 0x30, 0xa5, - 0x46, 0x82, 0x8b, 0xd8, 0xb3, 0x5a, 0x36, 0x4b, 0x3c, 0xb1, 0x7a, 0x59, 0xc0, 0x4f, 0x45, 0x29, - 0x38, 0xa6, 0x42, 0x26, 0x10, 0xe3, 0x42, 0xef, 0x40, 0x61, 0xcf, 0xb6, 0xcd, 0x84, 0xe7, 0xf3, - 0x01, 0x21, 0xcd, 0x37, 0xa1, 0xc4, 0x67, 0xb7, 0xb5, 0xd5, 0xc0, 0x1c, 0x4a, 0xfe, 0xc7, 0x9c, - 0xb7, 0x1e, 0xfc, 0xce, 0xf1, 0xb6, 0x37, 0xdb, 0x25, 0x4d, 0xa1, 0x94, 0x3b, 0xb6, 0x73, 0x3f, - 0x9e, 0x0d, 0x18, 0xee, 0xd1, 0x70, 0x8c, 0x1b, 0x6d, 0xf9, 0xa1, 0x5e, 0x3a, 0x4b, 0xa8, 0x1f, - 0x4d, 0x0a, 0xf3, 0xe8, 0x09, 0xe4, 0x6d, 0x2d, 0xeb, 0x3d, 0x57, 0x20, 0x6e, 0xad, 0x35, 0xfd, - 0x58, 0xb9, 0xb5, 0xd6, 0xc4, 0x0c, 0x02, 0x6d, 0xc2, 0x10, 0x4b, 0xa7, 0x2c, 0x3a, 0xe4, 0xb3, - 0x47, 0x1b, 0xb6, 0x82, 0xbe, 0x4b, 0xb1, 0x5f, 0x14, 0x3b, 0x38, 0xf2, 0xc7, 0x30, 0x1e, 0x0a, - 0x21, 0xe8, 0x23, 0x18, 0xd3, 0x0c, 0xa5, 0x5d, 0x57, 0x34, 0x45, 0x6f, 0x11, 0xf7, 0x6b, 0xc7, - 0xb5, 0xa4, 0xb3, 0xb7, 0x16, 0xe0, 0x13, 0x01, 0x68, 0x56, 0x28, 0x19, 0x0b, 0xd2, 0x70, 0x08, - 0x51, 0x56, 0x00, 0xfc, 0x39, 0xa2, 0x0a, 0x0c, 0x31, 0x4f, 0x75, 0x52, 0xdd, 0x48, 0x7d, 0x84, - 0x59, 0xc8, 0x1c, 0x98, 0x62, 0x67, 0x1c, 0xdd, 0x06, 0xa0, 0xa4, 0x65, 0x11, 0x9b, 0x6f, 0x67, - 0x2e, 0xfc, 0xc5, 0xb4, 0xe9, 0x51, 0x70, 0x80, 0x4b, 0xfe, 0x17, 0x09, 0xc6, 0x37, 0x88, 0xfd, - 0x89, 0x61, 0xed, 0x37, 0x0c, 0x4d, 0x6d, 0xf5, 0xcf, 0x21, 0x0f, 0xe0, 0x50, 0x1e, 0x78, 0x73, - 0xc0, 0xce, 0x84, 0xac, 0x4b, 0xcb, 0x06, 0xf2, 0x97, 0x12, 0xcc, 0x87, 0x38, 0x1f, 0xf9, 0x87, - 0x7f, 0x1b, 0x86, 0x4c, 0xc3, 0xb2, 0xdd, 0x1a, 0xe1, 0x54, 0x0a, 0x59, 0x84, 0x0d, 0x54, 0x09, - 0x0c, 0x06, 0x3b, 0x68, 0x68, 0x0d, 0x72, 0xb6, 0x21, 0x5c, 0xf5, 0x74, 0x98, 0x84, 0x58, 0x75, - 0x10, 0x98, 0xb9, 0x2d, 0x03, 0xe7, 0x6c, 0x83, 0x6d, 0x44, 0x39, 0xc4, 0x15, 0x0c, 0x5f, 0xaf, - 0x68, 0x06, 0x18, 0x0a, 0xbb, 0x96, 0xd1, 0x3d, 0xf3, 0x1c, 0xbc, 0x8d, 0x58, 0xb1, 0x8c, 0x2e, - 0xe6, 0x58, 0xf2, 0x57, 0x12, 0x4c, 0x87, 0x38, 0xcf, 0x21, 0x75, 0xbc, 0x13, 0x4e, 0x1d, 0x37, - 0x4e, 0x33, 0x91, 0x94, 0x04, 0xf2, 0x55, 0x2e, 0x32, 0x0d, 0x36, 0x61, 0xb4, 0x0b, 0xa3, 0xa6, - 0xd1, 0x6e, 0xbe, 0x84, 0xef, 0x9b, 0x93, 0x2c, 0xa5, 0x37, 0x7c, 0x2c, 0x1c, 0x04, 0x46, 0x87, - 0x30, 0xad, 0x2b, 0x5d, 0x42, 0x4d, 0xa5, 0x45, 0x9a, 0x2f, 0xe1, 0xc5, 0xe7, 0x22, 0xff, 0x80, - 0x12, 0x45, 0xc4, 0x71, 0x25, 0x68, 0x1d, 0x8a, 0xaa, 0xc9, 0x4b, 0x4c, 0x51, 0x4b, 0x0c, 0xcc, - 0xc3, 0x4e, 0x41, 0xea, 0xc4, 0x73, 0xf1, 0x03, 0xbb, 0x18, 0xf2, 0xdf, 0x44, 0xbd, 0x81, 0x57, - 0x2c, 0x8f, 0xa1, 0xc4, 0x3b, 0x4d, 0x5a, 0x86, 0xe6, 0x7e, 0xea, 0xe0, 0x97, 0x0b, 0x31, 0xf6, - 0xe2, 0xa8, 0x72, 0x39, 0xe1, 0x15, 0xdb, 0x25, 0x63, 0x4f, 0x18, 0x6d, 0x40, 0xc1, 0xfc, 0x21, - 0xc5, 0x15, 0x4f, 0x93, 0xbc, 0xa2, 0xe2, 0x38, 0xf2, 0x1f, 0xe6, 0x23, 0xe6, 0xf2, 0x64, 0xf9, - 0xec, 0xa5, 0xed, 0xba, 0x57, 0xcc, 0xa5, 0xee, 0xfc, 0x0e, 0x14, 0x45, 0xaa, 0x15, 0xce, 0xfc, - 0xf3, 0xd3, 0x38, 0x73, 0x30, 0x8b, 0x79, 0x77, 0x29, 0x77, 0xd0, 0x05, 0x46, 0x1f, 0xc2, 0x30, - 0x71, 0x54, 0x38, 0xb9, 0xf1, 0xde, 0x69, 0x54, 0xf8, 0x71, 0xd5, 0xaf, 0xa1, 0xc5, 0x98, 0x40, - 0x45, 0xbf, 0x64, 0xeb, 0xc5, 0x78, 0x59, 0xc9, 0x49, 0xcb, 0x05, 0x9e, 0xae, 0xae, 0x38, 0xd3, - 0xf6, 0x86, 0x5f, 0x1c, 0x55, 0xc0, 0xff, 0x89, 0x83, 0x12, 0xf2, 0xbf, 0x49, 0x30, 0xcd, 0x57, - 0xa8, 0xd5, 0xb3, 0x54, 0xbb, 0x7f, 0x6e, 0x89, 0xe9, 0x69, 0x28, 0x31, 0xdd, 0x19, 0xb0, 0x2c, - 0x31, 0x0b, 0x53, 0x93, 0xd3, 0xd7, 0x12, 0x5c, 0x8c, 0x71, 0x9f, 0x43, 0x5c, 0xdc, 0x0e, 0xc7, - 0xc5, 0x37, 0x4f, 0x3b, 0xa1, 0x94, 0xd8, 0xf8, 0x3f, 0xd3, 0x09, 0xd3, 0xe1, 0x27, 0xe5, 0x36, - 0x80, 0x69, 0xa9, 0x07, 0xaa, 0x46, 0x3a, 0xe2, 0xab, 0x7e, 0x29, 0xd0, 0xb3, 0xe5, 0x51, 0x70, - 0x80, 0x0b, 0x51, 0x98, 0x6b, 0x93, 0x5d, 0xa5, 0xa7, 0xd9, 0x8b, 0xed, 0xf6, 0x92, 0x62, 0x2a, - 0x3b, 0xaa, 0xa6, 0xda, 0xaa, 0x78, 0xff, 0x18, 0xa9, 0x3f, 0x74, 0xbe, 0xb6, 0x27, 0x71, 0xbc, - 0x38, 0xaa, 0x5c, 0x49, 0xfa, 0xdc, 0xe5, 0xb2, 0xf4, 0x71, 0x0a, 0x34, 0xea, 0x43, 0xd9, 0x22, - 0x1f, 0xf7, 0x54, 0x8b, 0xb4, 0x97, 0x2d, 0xc3, 0x0c, 0xa9, 0xcd, 0x73, 0xb5, 0xbf, 0x7d, 0x7c, - 0x54, 0x29, 0xe3, 0x14, 0x9e, 0xc1, 0x8a, 0x53, 0xe1, 0xd1, 0x33, 0x98, 0x51, 0x44, 0x77, 0x5d, - 0x50, 0xab, 0x73, 0x4a, 0xee, 0x1f, 0x1f, 0x55, 0x66, 0x16, 0xe3, 0xe4, 0xc1, 0x0a, 0x93, 0x40, - 0x51, 0x0d, 0x8a, 0x07, 0xbc, 0x11, 0x8f, 0x96, 0x87, 0x38, 0x3e, 0x4b, 0x04, 0x45, 0xa7, 0x37, - 0x8f, 0x61, 0x0e, 0xaf, 0x34, 0xf9, 0xe9, 0x73, 0xb9, 0xd8, 0x5d, 0x97, 0xd5, 0x92, 0xe2, 0xc4, - 0xf3, 0x27, 0xf0, 0x92, 0x1f, 0xb5, 0x9e, 0xf8, 0x24, 0x1c, 0xe4, 0x43, 0x1f, 0xc0, 0xc8, 0x9e, - 0x78, 0x30, 0xa1, 0xe5, 0x62, 0xa6, 0x24, 0x1c, 0x7a, 0x60, 0xa9, 0x4f, 0x0b, 0x15, 0x23, 0xee, - 0x30, 0xc5, 0x3e, 0x22, 0x7a, 0x1d, 0x8a, 0xfc, 0xc7, 0xea, 0x32, 0x7f, 0x5f, 0x2c, 0xf9, 0xb1, - 0xed, 0x89, 0x33, 0x8c, 0x5d, 0xba, 0xcb, 0xba, 0xda, 0x58, 0xe2, 0xef, 0xdc, 0x11, 0xd6, 0xd5, - 0xc6, 0x12, 0x76, 0xe9, 0xe8, 0x23, 0x28, 0x52, 0xb2, 0xa6, 0xea, 0xbd, 0xc3, 0x32, 0x64, 0xfa, - 0x4a, 0xde, 0x7c, 0xc4, 0xb9, 0x23, 0x2f, 0x7d, 0xbe, 0x06, 0x41, 0xc7, 0x2e, 0x2c, 0xda, 0x83, - 0x11, 0xab, 0xa7, 0x2f, 0xd2, 0x6d, 0x4a, 0xac, 0xf2, 0x28, 0xd7, 0x31, 0x28, 0x9c, 0x63, 0x97, - 0x3f, 0xaa, 0xc5, 0x5b, 0x21, 0x8f, 0x03, 0xfb, 0xe0, 0x68, 0x0f, 0x80, 0xff, 0xe0, 0x8f, 0x8a, - 0xe5, 0x39, 0xae, 0xea, 0x7e, 0x16, 0x55, 0x49, 0x6f, 0x97, 0xe2, 0xc3, 0x82, 0x47, 0xc6, 0x01, - 0x6c, 0xf4, 0xc7, 0x12, 0x20, 0xda, 0x33, 0x4d, 0x8d, 0x74, 0x89, 0x6e, 0x2b, 0x1a, 0x1f, 0xa5, - 0xe5, 0x31, 0xae, 0xf2, 0xed, 0x41, 0x2b, 0x18, 0x13, 0x8c, 0xaa, 0xf6, 0xbe, 0x17, 0xc4, 0x59, - 0x71, 0x82, 0x5e, 0xb6, 0x89, 0xbb, 0x62, 0xd6, 0xe3, 0x99, 0x36, 0x31, 0xf9, 0xb9, 0xd6, 0xdf, - 0x44, 0x41, 0xc7, 0x2e, 0x2c, 0x7a, 0x0a, 0x73, 0x6e, 0xc7, 0x28, 0x36, 0x0c, 0x7b, 0x45, 0xd5, - 0x08, 0xed, 0x53, 0x9b, 0x74, 0xcb, 0x13, 0xdc, 0xc1, 0xbc, 0xb6, 0x19, 0x9c, 0xc8, 0x85, 0x53, - 0xa4, 0x51, 0x17, 0x2a, 0x6e, 0x70, 0x62, 0x27, 0xd7, 0x8b, 0x8e, 0x8f, 0x68, 0x4b, 0xd1, 0x9c, - 0x4f, 0x28, 0x93, 0x5c, 0xc1, 0x6b, 0xc7, 0x47, 0x95, 0xca, 0xf2, 0xc9, 0xac, 0x78, 0x10, 0x16, - 0x7a, 0x0f, 0xca, 0x4a, 0x9a, 0x9e, 0x29, 0xae, 0xe7, 0xa7, 0x2c, 0xe2, 0xa5, 0x2a, 0x48, 0x95, - 0x46, 0x36, 0x4c, 0x29, 0xe1, 0xde, 0x5d, 0x5a, 0x9e, 0xce, 0xf4, 0x1a, 0x1b, 0x69, 0xf9, 0xf5, - 0x1f, 0x4e, 0x22, 0x04, 0x8a, 0x63, 0x1a, 0xd0, 0xef, 0x03, 0x52, 0xa2, 0xed, 0xc6, 0xb4, 0x8c, - 0x32, 0x25, 0xba, 0x58, 0x9f, 0xb2, 0xef, 0x76, 0x31, 0x12, 0xc5, 0x09, 0x7a, 0x58, 0x81, 0xae, - 0x44, 0x5a, 0xa4, 0x69, 0x79, 0x9e, 0x2b, 0xaf, 0x65, 0x53, 0xee, 0xc9, 0x05, 0xbe, 0x14, 0x45, - 0x11, 0x71, 0x5c, 0x09, 0x5a, 0x83, 0x59, 0x31, 0xb8, 0xad, 0x53, 0x65, 0x97, 0x34, 0xfb, 0xb4, - 0x65, 0x6b, 0xb4, 0x3c, 0xc3, 0xe3, 0x3b, 0xff, 0x5a, 0xb9, 0x98, 0x40, 0xc7, 0x89, 0x52, 0xe8, - 0x6d, 0x98, 0xda, 0x35, 0xac, 0x1d, 0xb5, 0xdd, 0x26, 0xba, 0x8b, 0x34, 0xcb, 0x91, 0xf8, 0x3b, - 0xd0, 0x4a, 0x84, 0x86, 0x63, 0xdc, 0x88, 0xc2, 0x45, 0x81, 0xdc, 0xb0, 0x8c, 0xd6, 0xba, 0xd1, - 0xd3, 0x6d, 0xa7, 0xec, 0xbb, 0xe8, 0xa5, 0xd1, 0x8b, 0x8b, 0x49, 0x0c, 0x2f, 0x8e, 0x2a, 0x57, - 0x93, 0xab, 0x7c, 0x9f, 0x09, 0x27, 0x63, 0x23, 0x13, 0xc6, 0x44, 0xe3, 0x3b, 0x7f, 0x90, 0x2a, - 0x97, 0xf9, 0xd1, 0x7f, 0x30, 0x38, 0xe0, 0x79, 0x22, 0xd1, 0xf3, 0x3f, 0x75, 0x7c, 0x54, 0x19, - 0x0b, 0x32, 0xe0, 0x90, 0x06, 0xde, 0xe8, 0x24, 0x3e, 0xaf, 0x9d, 0x4f, 0xb3, 0xf8, 0xe9, 0x1a, - 0x9d, 0x7c, 0xd3, 0x5e, 0x5a, 0xa3, 0x53, 0x00, 0xf2, 0xe4, 0x27, 0xf3, 0xff, 0xce, 0xc1, 0x8c, - 0xcf, 0x9c, 0xb9, 0xd1, 0x29, 0x41, 0xe4, 0xd7, 0x0d, 0xe3, 0xd9, 0x9a, 0x8f, 0xfc, 0xa5, 0xfb, - 0xff, 0xd7, 0x7c, 0xe4, 0xdb, 0x96, 0x72, 0x7b, 0xf8, 0xbb, 0x5c, 0x70, 0x02, 0xa7, 0xec, 0x80, - 0x79, 0x09, 0x3d, 0xd3, 0x3f, 0xba, 0x26, 0x1a, 0xf9, 0xeb, 0x3c, 0x4c, 0x45, 0x4f, 0x63, 0xa8, - 0x51, 0x42, 0x1a, 0xd8, 0x28, 0xd1, 0x80, 0xd9, 0xdd, 0x9e, 0xa6, 0xf5, 0xf9, 0x1c, 0x02, 0xdd, - 0x12, 0xce, 0x27, 0xcb, 0x9f, 0x0a, 0xc9, 0xd9, 0x95, 0x04, 0x1e, 0x9c, 0x28, 0x19, 0xef, 0x9b, - 0x28, 0xfc, 0xd0, 0xbe, 0x89, 0xa1, 0x33, 0xf4, 0x4d, 0x24, 0xb7, 0x9e, 0xe4, 0xcf, 0xd4, 0x7a, - 0x72, 0x96, 0xa6, 0x89, 0x84, 0x20, 0x36, 0xb0, 0x01, 0xf8, 0x17, 0x30, 0x11, 0x6e, 0xe4, 0x71, - 0xf6, 0xd2, 0xe9, 0x25, 0x12, 0x9f, 0x86, 0x03, 0x7b, 0xe9, 0x8c, 0x63, 0x8f, 0x43, 0xfe, 0x23, - 0x09, 0xe6, 0x92, 0x1b, 0x76, 0x91, 0x06, 0x13, 0x5d, 0xe5, 0x30, 0xd8, 0x44, 0x2d, 0x9d, 0xf1, - 0x65, 0x8c, 0x77, 0x70, 0xac, 0x87, 0xb0, 0x70, 0x04, 0x5b, 0xfe, 0x5e, 0x82, 0xf9, 0x94, 0xde, - 0x89, 0xf3, 0xb5, 0x04, 0xbd, 0x0f, 0xa5, 0xae, 0x72, 0xd8, 0xec, 0x59, 0x1d, 0x72, 0xe6, 0xb7, - 0x40, 0x7e, 0xa0, 0xd7, 0x05, 0x0a, 0xf6, 0xf0, 0xe4, 0xbf, 0x92, 0xe0, 0x27, 0xa9, 0x57, 0x25, - 0x74, 0x2f, 0xd4, 0xe6, 0x21, 0x47, 0xda, 0x3c, 0x50, 0x5c, 0xf0, 0x15, 0x75, 0x79, 0x7c, 0x2e, - 0x41, 0x39, 0xed, 0xee, 0x88, 0xee, 0x86, 0x8c, 0xfc, 0x59, 0xc4, 0xc8, 0xe9, 0x98, 0xdc, 0x2b, - 0xb2, 0xf1, 0xdf, 0x25, 0xb8, 0x7c, 0x42, 0x0d, 0xe6, 0x5d, 0x51, 0x48, 0x3b, 0xc8, 0xc5, 0x9f, - 0xad, 0xc5, 0x37, 0x2f, 0xff, 0x8a, 0x92, 0xc0, 0x83, 0x53, 0xa5, 0xd1, 0x36, 0xcc, 0x8b, 0xfb, - 0x51, 0x94, 0x26, 0xca, 0x0b, 0xde, 0x0d, 0xb7, 0x9c, 0xcc, 0x82, 0xd3, 0x64, 0xe5, 0xbf, 0x95, - 0x60, 0x2e, 0xf9, 0x51, 0x00, 0xbd, 0x15, 0x5a, 0xf2, 0x4a, 0x64, 0xc9, 0x27, 0x23, 0x52, 0x62, - 0xc1, 0x3f, 0x84, 0x09, 0xf1, 0x74, 0x20, 0x60, 0x84, 0x33, 0xcb, 0x49, 0x19, 0x44, 0x40, 0xb8, - 0x05, 0x2c, 0x3f, 0x26, 0xe1, 0x31, 0x1c, 0x41, 0x93, 0x3f, 0xcd, 0xc1, 0x50, 0xb3, 0xa5, 0x68, - 0xe4, 0x1c, 0xea, 0xd7, 0x5f, 0x85, 0xea, 0xd7, 0x41, 0xff, 0xcf, 0x8c, 0x5b, 0x95, 0x5a, 0xba, - 0xe2, 0x48, 0xe9, 0xfa, 0x46, 0x26, 0xb4, 0x93, 0xab, 0xd6, 0xdf, 0x82, 0x11, 0x4f, 0xe9, 0xe9, - 0x92, 0xa9, 0xfc, 0x97, 0x39, 0x18, 0x0d, 0xa8, 0x38, 0x65, 0x2a, 0xde, 0x0d, 0xd5, 0x1f, 0xf9, - 0x0c, 0x0f, 0x35, 0x01, 0x5d, 0x55, 0xb7, 0xe2, 0x70, 0xfa, 0xa4, 0xfd, 0xce, 0xd8, 0x78, 0x21, - 0xf2, 0x0b, 0x98, 0xb0, 0x15, 0xab, 0x43, 0x6c, 0xef, 0xc3, 0x85, 0xd3, 0xc7, 0xe5, 0x35, 0xec, - 0x6f, 0x85, 0xa8, 0x38, 0xc2, 0x7d, 0xe9, 0x21, 0x8c, 0x87, 0x94, 0x9d, 0xaa, 0xcd, 0xf9, 0xef, - 0x25, 0xf8, 0xd9, 0xc0, 0xc7, 0x1e, 0x54, 0x0f, 0x1d, 0x92, 0x6a, 0xe4, 0x90, 0x2c, 0xa4, 0x03, - 0xbc, 0xba, 0x76, 0xb9, 0xfa, 0xcd, 0xe7, 0xdf, 0x2d, 0x5c, 0xf8, 0xe6, 0xbb, 0x85, 0x0b, 0xdf, - 0x7e, 0xb7, 0x70, 0xe1, 0x0f, 0x8e, 0x17, 0xa4, 0xe7, 0xc7, 0x0b, 0xd2, 0x37, 0xc7, 0x0b, 0xd2, - 0xb7, 0xc7, 0x0b, 0xd2, 0x7f, 0x1e, 0x2f, 0x48, 0x7f, 0xfa, 0xfd, 0xc2, 0x85, 0xf7, 0x8b, 0x02, - 0xee, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0x98, 0xf4, 0xad, 0x8a, 0xba, 0x3e, 0x00, 0x00, + 0xd3, 0xb3, 0x34, 0x17, 0xc8, 0x21, 0x87, 0x5c, 0x0c, 0x04, 0x48, 0x2e, 0x4e, 0x72, 0x8c, 0x11, + 0x20, 0xb7, 0x20, 0xc7, 0xe4, 0x60, 0x18, 0x09, 0xe2, 0x00, 0x42, 0xe0, 0x04, 0x06, 0x72, 0x88, + 0x4f, 0x44, 0x4c, 0x9f, 0x82, 0x9c, 0x72, 0x0b, 0x74, 0x0a, 0xba, 0xa7, 0xe7, 0x7f, 0x86, 0x3b, + 0xa4, 0x25, 0x22, 0x0e, 0x72, 0x12, 0xb7, 0xab, 0xea, 0xab, 0xea, 0xee, 0xea, 0xaa, 0xea, 0x9e, + 0x12, 0xac, 0xec, 0xdf, 0xa7, 0x55, 0xd5, 0xa8, 0xed, 0xf7, 0x76, 0x88, 0xa5, 0x13, 0x9b, 0xd0, + 0xda, 0x01, 0xd1, 0xdb, 0x86, 0x55, 0x13, 0x04, 0xc5, 0x54, 0x6b, 0xe4, 0xd0, 0x26, 0x3a, 0x55, + 0x0d, 0x9d, 0xd6, 0x0e, 0x6e, 0xed, 0x10, 0x5b, 0xb9, 0x55, 0xeb, 0x10, 0x9d, 0x58, 0x8a, 0x4d, + 0xda, 0x55, 0xd3, 0x32, 0x6c, 0x03, 0x5d, 0x71, 0xd8, 0xab, 0x8a, 0xa9, 0x56, 0x7d, 0xf6, 0xaa, + 0x60, 0xbf, 0x74, 0xb3, 0xa3, 0xda, 0x7b, 0xbd, 0x9d, 0x6a, 0xcb, 0xe8, 0xd6, 0x3a, 0x46, 0xc7, + 0xa8, 0x71, 0xa9, 0x9d, 0xde, 0x2e, 0xff, 0xc5, 0x7f, 0xf0, 0xbf, 0x1c, 0xb4, 0x4b, 0x72, 0x40, + 0x79, 0xcb, 0xb0, 0x48, 0xed, 0x20, 0xa6, 0xf1, 0xd2, 0x1d, 0x9f, 0xa7, 0xab, 0xb4, 0xf6, 0x54, + 0x9d, 0x58, 0xfd, 0x9a, 0xb9, 0xdf, 0x61, 0x03, 0xb4, 0xd6, 0x25, 0xb6, 0x92, 0x24, 0x55, 0x4b, + 0x93, 0xb2, 0x7a, 0xba, 0xad, 0x76, 0x49, 0x4c, 0xe0, 0xde, 0x20, 0x01, 0xda, 0xda, 0x23, 0x5d, + 0x25, 0x26, 0xf7, 0x56, 0x9a, 0x5c, 0xcf, 0x56, 0xb5, 0x9a, 0xaa, 0xdb, 0xd4, 0xb6, 0xa2, 0x42, + 0xf2, 0x1d, 0x98, 0x5a, 0xd4, 0x34, 0xe3, 0x13, 0xd2, 0x5e, 0x6a, 0xae, 0x2e, 0x5b, 0xea, 0x01, + 0xb1, 0xd0, 0x55, 0x28, 0xe8, 0x4a, 0x97, 0x94, 0xa5, 0xab, 0xd2, 0xf5, 0x91, 0xfa, 0xd8, 0xf3, + 0xa3, 0xca, 0x85, 0xe3, 0xa3, 0x4a, 0x61, 0x43, 0xe9, 0x12, 0xcc, 0x29, 0xf2, 0x43, 0x98, 0x16, + 0x52, 0x2b, 0x1a, 0x39, 0x7c, 0x6a, 0x68, 0xbd, 0x2e, 0x41, 0xd7, 0x60, 0xb8, 0xcd, 0x01, 0x84, + 0xe0, 0x84, 0x10, 0x1c, 0x76, 0x60, 0xb1, 0xa0, 0xca, 0x14, 0x26, 0x85, 0xf0, 0x13, 0x83, 0xda, + 0x0d, 0xc5, 0xde, 0x43, 0xb7, 0x01, 0x4c, 0xc5, 0xde, 0x6b, 0x58, 0x64, 0x57, 0x3d, 0x14, 0xe2, + 0x48, 0x88, 0x43, 0xc3, 0xa3, 0xe0, 0x00, 0x17, 0xba, 0x01, 0x25, 0x8b, 0x28, 0xed, 0x4d, 0x5d, + 0xeb, 0x97, 0x73, 0x57, 0xa5, 0xeb, 0xa5, 0xfa, 0x94, 0x90, 0x28, 0x61, 0x31, 0x8e, 0x3d, 0x0e, + 0xf9, 0xb3, 0x1c, 0x8c, 0x2c, 0x2b, 0xa4, 0x6b, 0xe8, 0x4d, 0x62, 0xa3, 0x8f, 0xa0, 0xc4, 0xb6, + 0xab, 0xad, 0xd8, 0x0a, 0xd7, 0x36, 0x7a, 0xfb, 0xcd, 0xaa, 0xef, 0x4e, 0xde, 0xea, 0x55, 0xcd, + 0xfd, 0x0e, 0x1b, 0xa0, 0x55, 0xc6, 0x5d, 0x3d, 0xb8, 0x55, 0xdd, 0xdc, 0x79, 0x46, 0x5a, 0xf6, + 0x3a, 0xb1, 0x15, 0xdf, 0x3e, 0x7f, 0x0c, 0x7b, 0xa8, 0x68, 0x03, 0x0a, 0xd4, 0x24, 0x2d, 0x6e, + 0xd9, 0xe8, 0xed, 0x1b, 0xd5, 0x13, 0x9d, 0xb5, 0xea, 0x59, 0xd6, 0x34, 0x49, 0xcb, 0x5f, 0x71, + 0xf6, 0x0b, 0x73, 0x1c, 0xf4, 0x14, 0x86, 0xa9, 0xad, 0xd8, 0x3d, 0x5a, 0xce, 0x73, 0xc4, 0x6a, + 0x66, 0x44, 0x2e, 0xe5, 0x6f, 0x86, 0xf3, 0x1b, 0x0b, 0x34, 0xf9, 0x3f, 0x72, 0x80, 0x3c, 0xde, + 0x25, 0x43, 0x6f, 0xab, 0xb6, 0x6a, 0xe8, 0xe8, 0x01, 0x14, 0xec, 0xbe, 0xe9, 0xba, 0xc0, 0x35, + 0xd7, 0xa0, 0xad, 0xbe, 0x49, 0x5e, 0x1c, 0x55, 0xe6, 0xe2, 0x12, 0x8c, 0x82, 0xb9, 0x0c, 0x5a, + 0xf3, 0x4c, 0xcd, 0x71, 0xe9, 0x3b, 0x61, 0xd5, 0x2f, 0x8e, 0x2a, 0x09, 0x87, 0xad, 0xea, 0x21, + 0x85, 0x0d, 0x44, 0x07, 0x80, 0x34, 0x85, 0xda, 0x5b, 0x96, 0xa2, 0x53, 0x47, 0x93, 0xda, 0x25, + 0x62, 0x11, 0xde, 0xc8, 0xb6, 0x69, 0x4c, 0xa2, 0x7e, 0x49, 0x58, 0x81, 0xd6, 0x62, 0x68, 0x38, + 0x41, 0x03, 0xf3, 0x66, 0x8b, 0x28, 0xd4, 0xd0, 0xcb, 0x85, 0xb0, 0x37, 0x63, 0x3e, 0x8a, 0x05, + 0x15, 0xbd, 0x0e, 0xc5, 0x2e, 0xa1, 0x54, 0xe9, 0x90, 0xf2, 0x10, 0x67, 0x9c, 0x14, 0x8c, 0xc5, + 0x75, 0x67, 0x18, 0xbb, 0x74, 0xf9, 0x0b, 0x09, 0xc6, 0xbd, 0x95, 0x5b, 0x53, 0xa9, 0x8d, 0x7e, + 0x27, 0xe6, 0x87, 0xd5, 0x6c, 0x53, 0x62, 0xd2, 0xdc, 0x0b, 0x3d, 0x9f, 0x77, 0x47, 0x02, 0x3e, + 0xb8, 0x0e, 0x43, 0xaa, 0x4d, 0xba, 0x6c, 0x1f, 0xf2, 0xd7, 0x47, 0x6f, 0x5f, 0xcf, 0xea, 0x32, + 0xf5, 0x71, 0x01, 0x3a, 0xb4, 0xca, 0xc4, 0xb1, 0x83, 0x22, 0xff, 0x49, 0x21, 0x60, 0x3e, 0x73, + 0x4d, 0xf4, 0x01, 0x94, 0x28, 0xd1, 0x48, 0xcb, 0x36, 0x2c, 0x61, 0xfe, 0x5b, 0x19, 0xcd, 0x57, + 0x76, 0x88, 0xd6, 0x14, 0xa2, 0xf5, 0x31, 0x66, 0xbf, 0xfb, 0x0b, 0x7b, 0x90, 0xe8, 0x1d, 0x28, + 0xd9, 0xa4, 0x6b, 0x6a, 0x8a, 0x4d, 0xc4, 0x39, 0x7a, 0x2d, 0x38, 0x05, 0xe6, 0x39, 0x0c, 0xac, + 0x61, 0xb4, 0xb7, 0x04, 0x1b, 0x3f, 0x3e, 0xde, 0x92, 0xb8, 0xa3, 0xd8, 0x83, 0x41, 0x07, 0x30, + 0xd1, 0x33, 0xdb, 0x8c, 0xd3, 0x66, 0x51, 0xb0, 0xd3, 0x17, 0x9e, 0x74, 0x2f, 0xeb, 0xda, 0x6c, + 0x87, 0xa4, 0xeb, 0x73, 0x42, 0xd7, 0x44, 0x78, 0x1c, 0x47, 0xb4, 0xa0, 0x45, 0x98, 0xec, 0xaa, + 0x3a, 0x8b, 0x4b, 0xfd, 0x26, 0x69, 0x19, 0x7a, 0x9b, 0x72, 0xb7, 0x1a, 0xaa, 0xcf, 0x0b, 0x80, + 0xc9, 0xf5, 0x30, 0x19, 0x47, 0xf9, 0xd1, 0xaf, 0x00, 0xb9, 0xd3, 0x78, 0xec, 0x04, 0x71, 0xd5, + 0xd0, 0xb9, 0xcf, 0xe5, 0x7d, 0xe7, 0xde, 0x8a, 0x71, 0xe0, 0x04, 0x29, 0xb4, 0x06, 0xb3, 0x16, + 0x39, 0x50, 0xd9, 0x1c, 0x9f, 0xa8, 0xd4, 0x36, 0xac, 0xfe, 0x9a, 0xda, 0x55, 0xed, 0xf2, 0x30, + 0xb7, 0xa9, 0x7c, 0x7c, 0x54, 0x99, 0xc5, 0x09, 0x74, 0x9c, 0x28, 0x25, 0xff, 0xe9, 0x30, 0x4c, + 0x46, 0xe2, 0x0d, 0x7a, 0x0a, 0x73, 0xad, 0x9e, 0x65, 0x11, 0xdd, 0xde, 0xe8, 0x75, 0x77, 0x88, + 0xd5, 0x6c, 0xed, 0x91, 0x76, 0x4f, 0x23, 0x6d, 0xee, 0x28, 0x43, 0xf5, 0x05, 0x61, 0xf1, 0xdc, + 0x52, 0x22, 0x17, 0x4e, 0x91, 0x66, 0xab, 0xa0, 0xf3, 0xa1, 0x75, 0x95, 0x52, 0x0f, 0x33, 0xc7, + 0x31, 0xbd, 0x55, 0xd8, 0x88, 0x71, 0xe0, 0x04, 0x29, 0x66, 0x63, 0x9b, 0x50, 0xd5, 0x22, 0xed, + 0xa8, 0x8d, 0xf9, 0xb0, 0x8d, 0xcb, 0x89, 0x5c, 0x38, 0x45, 0x1a, 0xdd, 0x85, 0x51, 0x47, 0x1b, + 0xdf, 0x3f, 0xb1, 0xd1, 0x33, 0x02, 0x6c, 0x74, 0xc3, 0x27, 0xe1, 0x20, 0x1f, 0x9b, 0x9a, 0xb1, + 0x43, 0x89, 0x75, 0x40, 0xda, 0xe9, 0x1b, 0xbc, 0x19, 0xe3, 0xc0, 0x09, 0x52, 0x6c, 0x6a, 0x8e, + 0x07, 0xc6, 0xa6, 0x36, 0x1c, 0x9e, 0xda, 0x76, 0x22, 0x17, 0x4e, 0x91, 0x66, 0x7e, 0xec, 0x98, + 0xbc, 0x78, 0xa0, 0xa8, 0x9a, 0xb2, 0xa3, 0x91, 0x72, 0x31, 0xec, 0xc7, 0x1b, 0x61, 0x32, 0x8e, + 0xf2, 0xa3, 0xc7, 0x30, 0xed, 0x0c, 0x6d, 0xeb, 0x8a, 0x07, 0x52, 0xe2, 0x20, 0x3f, 0x11, 0x20, + 0xd3, 0x1b, 0x51, 0x06, 0x1c, 0x97, 0x41, 0x0f, 0x60, 0xa2, 0x65, 0x68, 0x1a, 0xf7, 0xc7, 0x25, + 0xa3, 0xa7, 0xdb, 0xe5, 0x11, 0x8e, 0x82, 0xd8, 0x79, 0x5c, 0x0a, 0x51, 0x70, 0x84, 0x13, 0x11, + 0x80, 0x96, 0x9b, 0x70, 0x68, 0x19, 0x78, 0x7c, 0xbc, 0x95, 0x35, 0x06, 0x78, 0xa9, 0xca, 0xaf, + 0x01, 0xbc, 0x21, 0x8a, 0x03, 0xc0, 0xf2, 0x3f, 0x49, 0x30, 0x9f, 0x12, 0x3a, 0xd0, 0x2f, 0x43, + 0x29, 0xf6, 0x37, 0x22, 0x29, 0xf6, 0x72, 0x8a, 0x58, 0x20, 0xcf, 0xea, 0x30, 0x6e, 0xb1, 0x59, + 0xe9, 0x1d, 0x87, 0x45, 0xc4, 0xc8, 0xbb, 0x03, 0xa6, 0x81, 0x83, 0x32, 0x7e, 0xcc, 0x9f, 0x3e, + 0x3e, 0xaa, 0x8c, 0x87, 0x68, 0x38, 0x0c, 0x2f, 0xff, 0x59, 0x0e, 0x60, 0x99, 0x98, 0x9a, 0xd1, + 0xef, 0x12, 0xfd, 0x3c, 0x6a, 0xa8, 0xcd, 0x50, 0x0d, 0x75, 0x73, 0xd0, 0xf6, 0x78, 0xa6, 0xa5, + 0x16, 0x51, 0xef, 0x46, 0x8a, 0xa8, 0x5a, 0x76, 0xc8, 0x93, 0xab, 0xa8, 0x7f, 0xcb, 0xc3, 0x8c, + 0xcf, 0xec, 0x97, 0x51, 0x0f, 0x43, 0x7b, 0xfc, 0xeb, 0x91, 0x3d, 0x9e, 0x4f, 0x10, 0x79, 0x65, + 0x75, 0xd4, 0x33, 0x98, 0x60, 0x55, 0x8e, 0xb3, 0x97, 0xbc, 0x86, 0x1a, 0x3e, 0x75, 0x0d, 0xe5, + 0x65, 0xbb, 0xb5, 0x10, 0x12, 0x8e, 0x20, 0xa7, 0xd4, 0x6c, 0xc5, 0x1f, 0x63, 0xcd, 0xf6, 0xa5, + 0x04, 0x13, 0xfe, 0x36, 0x9d, 0x43, 0xd1, 0xb6, 0x11, 0x2e, 0xda, 0x5e, 0xcf, 0xec, 0xa2, 0x29, + 0x55, 0xdb, 0x7f, 0xb3, 0x02, 0xdf, 0x63, 0x62, 0x07, 0x7c, 0x47, 0x69, 0xed, 0x0f, 0xbe, 0xe3, + 0xa1, 0xcf, 0x24, 0x40, 0x22, 0x0b, 0x2c, 0xea, 0xba, 0x61, 0x2b, 0x4e, 0xac, 0x74, 0xcc, 0x5a, + 0xcd, 0x6c, 0x96, 0xab, 0xb1, 0xba, 0x1d, 0xc3, 0x7a, 0xa4, 0xdb, 0x56, 0xdf, 0xdf, 0xe4, 0x38, + 0x03, 0x4e, 0x30, 0x00, 0x29, 0x00, 0x96, 0xc0, 0xdc, 0x32, 0xc4, 0x41, 0xbe, 0x99, 0x21, 0xe6, + 0x31, 0x81, 0x25, 0x43, 0xdf, 0x55, 0x3b, 0x7e, 0xd8, 0xc1, 0x1e, 0x10, 0x0e, 0x80, 0x5e, 0x7a, + 0x04, 0xf3, 0x29, 0xd6, 0xa2, 0x29, 0xc8, 0xef, 0x93, 0xbe, 0xb3, 0x6c, 0x98, 0xfd, 0x89, 0x66, + 0x61, 0xe8, 0x40, 0xd1, 0x7a, 0x4e, 0xf8, 0x1d, 0xc1, 0xce, 0x8f, 0x07, 0xb9, 0xfb, 0x92, 0xfc, + 0xc5, 0x50, 0xd0, 0x77, 0x78, 0xc5, 0x7c, 0x9d, 0x5d, 0x5a, 0x4d, 0x4d, 0x6d, 0x29, 0x54, 0x14, + 0x42, 0x63, 0xce, 0x85, 0xd5, 0x19, 0xc3, 0x1e, 0x35, 0x54, 0x5b, 0xe7, 0x5e, 0x6d, 0x6d, 0x9d, + 0x7f, 0x39, 0xb5, 0xf5, 0xef, 0x42, 0x89, 0xba, 0x55, 0x75, 0x81, 0x43, 0xde, 0x3a, 0x45, 0x7c, + 0x15, 0x05, 0xb5, 0xa7, 0xc0, 0x2b, 0xa5, 0x3d, 0xd0, 0xa4, 0x22, 0x7a, 0xe8, 0x94, 0x45, 0xf4, + 0x4b, 0x2d, 0x7c, 0x59, 0xbc, 0x31, 0x95, 0x1e, 0x25, 0x6d, 0x1e, 0xdb, 0x4a, 0x7e, 0xbc, 0x69, + 0xf0, 0x51, 0x2c, 0xa8, 0xe8, 0x83, 0x90, 0xcb, 0x96, 0xce, 0xe2, 0xb2, 0x13, 0xe9, 0xee, 0x8a, + 0xb6, 0x61, 0xde, 0xb4, 0x8c, 0x8e, 0x45, 0x28, 0x5d, 0x26, 0x4a, 0x5b, 0x53, 0x75, 0xe2, 0xae, + 0x8f, 0x53, 0x11, 0x5d, 0x3e, 0x3e, 0xaa, 0xcc, 0x37, 0x92, 0x59, 0x70, 0x9a, 0xac, 0xfc, 0xbc, + 0x00, 0x53, 0xd1, 0x0c, 0x98, 0x52, 0xa4, 0x4a, 0x67, 0x2a, 0x52, 0x6f, 0x04, 0x0e, 0x83, 0x53, + 0xc1, 0x07, 0x5e, 0x70, 0x62, 0x07, 0x62, 0x11, 0x26, 0x45, 0x34, 0x70, 0x89, 0xa2, 0x4c, 0xf7, + 0x76, 0x7f, 0x3b, 0x4c, 0xc6, 0x51, 0x7e, 0xf4, 0x10, 0xc6, 0x2d, 0x5e, 0x77, 0xbb, 0x00, 0x4e, + 0xed, 0x7a, 0x51, 0x00, 0x8c, 0xe3, 0x20, 0x11, 0x87, 0x79, 0x59, 0xdd, 0xea, 0x97, 0xa3, 0x2e, + 0x40, 0x21, 0x5c, 0xb7, 0x2e, 0x46, 0x19, 0x70, 0x5c, 0x06, 0xad, 0xc3, 0x4c, 0x4f, 0x8f, 0x43, + 0x39, 0xae, 0x7c, 0x59, 0x40, 0xcd, 0x6c, 0xc7, 0x59, 0x70, 0x92, 0x1c, 0xda, 0x0d, 0x95, 0xb2, + 0xc3, 0x3c, 0x3c, 0xdf, 0xce, 0x7c, 0xf0, 0x32, 0xd7, 0xb2, 0x09, 0xe5, 0x76, 0x29, 0x6b, 0xb9, + 0x2d, 0xff, 0xbd, 0x14, 0x4c, 0x42, 0x5e, 0x09, 0x3c, 0xe8, 0x95, 0x29, 0x26, 0x11, 0xa8, 0x8e, + 0x8c, 0xe4, 0xea, 0xf7, 0xde, 0xa9, 0xaa, 0x5f, 0x3f, 0x79, 0x0e, 0x2e, 0x7f, 0x3f, 0x97, 0x60, + 0x6e, 0xa5, 0xf9, 0xd8, 0x32, 0x7a, 0xa6, 0x6b, 0xce, 0xa6, 0xe9, 0x2c, 0xcd, 0xcf, 0xa1, 0x60, + 0xf5, 0x34, 0x77, 0x1e, 0xaf, 0xb9, 0xf3, 0xc0, 0x3d, 0x8d, 0xcd, 0x63, 0x26, 0x22, 0xe5, 0x4c, + 0x82, 0x09, 0xa0, 0x0d, 0x18, 0xb6, 0x14, 0xbd, 0x43, 0xdc, 0xb4, 0x7a, 0x6d, 0x80, 0xf5, 0xab, + 0xcb, 0x98, 0xb1, 0x07, 0x0a, 0x1b, 0x2e, 0x8d, 0x05, 0x8a, 0xfc, 0x0f, 0x12, 0x4c, 0x3e, 0xd9, + 0xda, 0x6a, 0xac, 0xea, 0xfc, 0x44, 0xf3, 0xb7, 0xd5, 0xab, 0x50, 0x30, 0x15, 0x7b, 0x2f, 0x9a, + 0xe9, 0x19, 0x0d, 0x73, 0x0a, 0xba, 0x03, 0x25, 0xf6, 0x2f, 0xb3, 0x8b, 0x1f, 0xa9, 0x11, 0x1e, + 0x08, 0x4b, 0x0d, 0x31, 0xf6, 0x22, 0xf0, 0x37, 0xf6, 0x38, 0xd1, 0x7b, 0x50, 0x64, 0xf1, 0x87, + 0xe8, 0xed, 0x8c, 0x05, 0xba, 0x30, 0xaa, 0xee, 0x08, 0xf9, 0x35, 0x97, 0x18, 0xc0, 0x2e, 0x9c, + 0xbc, 0x0f, 0xb3, 0x81, 0x49, 0xb0, 0x55, 0x7c, 0xca, 0x72, 0x2a, 0x6a, 0xc2, 0x10, 0xd3, 0xce, + 0x32, 0x67, 0x3e, 0xc3, 0x13, 0x68, 0x64, 0x21, 0xfc, 0xfa, 0x88, 0xfd, 0xa2, 0xd8, 0xc1, 0x92, + 0xd7, 0x61, 0x9c, 0x3f, 0x43, 0x1b, 0x96, 0xcd, 0x17, 0x13, 0x5d, 0x81, 0x7c, 0x57, 0xd5, 0x45, + 0x76, 0x1e, 0x15, 0x32, 0x79, 0x96, 0x59, 0xd8, 0x38, 0x27, 0x2b, 0x87, 0x22, 0x5e, 0xf9, 0x64, + 0xe5, 0x10, 0xb3, 0x71, 0xf9, 0x31, 0x14, 0xc5, 0x26, 0x05, 0x81, 0xf2, 0x27, 0x03, 0xe5, 0x13, + 0x80, 0x36, 0xa1, 0xb8, 0xda, 0xa8, 0x6b, 0x86, 0x53, 0xab, 0xb5, 0xd4, 0xb6, 0x15, 0xdd, 0xc1, + 0xa5, 0xd5, 0x65, 0x8c, 0x39, 0x05, 0xc9, 0x30, 0x4c, 0x0e, 0x5b, 0xc4, 0xb4, 0xb9, 0x1f, 0x8d, + 0xd4, 0x81, 0xf9, 0xc6, 0x23, 0x3e, 0x82, 0x05, 0x45, 0xfe, 0xa3, 0x1c, 0x14, 0xc5, 0x72, 0x9c, + 0xc3, 0xdd, 0x6d, 0x2d, 0x74, 0x77, 0x7b, 0x23, 0x9b, 0x6b, 0xa4, 0x5e, 0xdc, 0xb6, 0x22, 0x17, + 0xb7, 0x1b, 0x19, 0xf1, 0x4e, 0xbe, 0xb5, 0x7d, 0x9a, 0x83, 0x89, 0xb0, 0x53, 0xa2, 0xbb, 0x30, + 0xca, 0xd2, 0x94, 0xda, 0x22, 0x1b, 0x7e, 0x75, 0xec, 0x3d, 0xdd, 0x34, 0x7d, 0x12, 0x0e, 0xf2, + 0xa1, 0x8e, 0x27, 0xc6, 0xfc, 0x48, 0x4c, 0x3a, 0x7d, 0x49, 0x7b, 0xb6, 0xaa, 0x55, 0x9d, 0x0f, + 0x32, 0xd5, 0x55, 0xdd, 0xde, 0xb4, 0x9a, 0xb6, 0xa5, 0xea, 0x9d, 0x98, 0x22, 0xee, 0x94, 0x41, + 0x64, 0xf4, 0x2e, 0x4b, 0x99, 0xd4, 0xe8, 0x59, 0x2d, 0x92, 0x54, 0xfa, 0xba, 0x65, 0x1b, 0x3b, + 0xa0, 0xed, 0x35, 0xa3, 0xa5, 0x68, 0xce, 0xe6, 0x60, 0xb2, 0x4b, 0x2c, 0xa2, 0xb7, 0x88, 0x5b, + 0x6e, 0x3a, 0x10, 0xd8, 0x03, 0x93, 0xff, 0x56, 0x82, 0x51, 0xb1, 0x16, 0xe7, 0x70, 0xc9, 0xf9, + 0xed, 0xf0, 0x25, 0xe7, 0x5a, 0xc6, 0xc8, 0x91, 0x7c, 0xc3, 0xf9, 0x4b, 0xdf, 0x74, 0x16, 0x2b, + 0xd8, 0x71, 0xd9, 0x33, 0xa8, 0x1d, 0x3d, 0x2e, 0xec, 0x94, 0x63, 0x4e, 0x41, 0x3d, 0x98, 0x52, + 0x23, 0xc1, 0x45, 0xec, 0x59, 0x2d, 0x9b, 0x25, 0x9e, 0x58, 0xbd, 0x2c, 0xe0, 0xa7, 0xa2, 0x14, + 0x1c, 0x53, 0x21, 0x13, 0x88, 0x71, 0xa1, 0x77, 0xa0, 0xb0, 0x67, 0xdb, 0x66, 0xc2, 0xf3, 0xf9, + 0x80, 0x90, 0xe6, 0x9b, 0x50, 0xe2, 0xb3, 0xdb, 0xda, 0x6a, 0x60, 0x0e, 0x25, 0xff, 0x5d, 0xce, + 0x5b, 0x0f, 0x7e, 0xe7, 0x78, 0xdb, 0x9b, 0xed, 0x92, 0xa6, 0x50, 0xca, 0x1d, 0xdb, 0xb9, 0x1f, + 0xcf, 0x06, 0x0c, 0xf7, 0x68, 0x38, 0xc6, 0x8d, 0xb6, 0xfc, 0x50, 0x2f, 0x9d, 0x25, 0xd4, 0x8f, + 0x26, 0x85, 0x79, 0xf4, 0x04, 0xf2, 0xb6, 0x96, 0xf5, 0x9e, 0x2b, 0x10, 0xb7, 0xd6, 0x9a, 0x7e, + 0xac, 0xdc, 0x5a, 0x6b, 0x62, 0x06, 0x81, 0x36, 0x61, 0x88, 0xa5, 0x53, 0x16, 0x1d, 0xf2, 0xd9, + 0xa3, 0x0d, 0x5b, 0x41, 0xdf, 0xa5, 0xd8, 0x2f, 0x8a, 0x1d, 0x1c, 0xf9, 0x63, 0x18, 0x0f, 0x85, + 0x10, 0xf4, 0x11, 0x8c, 0x69, 0x86, 0xd2, 0xae, 0x2b, 0x9a, 0xa2, 0xb7, 0x88, 0xfb, 0xb5, 0xe3, + 0x5a, 0xd2, 0xd9, 0x5b, 0x0b, 0xf0, 0x89, 0x00, 0x34, 0x2b, 0x94, 0x8c, 0x05, 0x69, 0x38, 0x84, + 0x28, 0x2b, 0x00, 0xfe, 0x1c, 0x51, 0x05, 0x86, 0x98, 0xa7, 0x3a, 0xa9, 0x6e, 0xa4, 0x3e, 0xc2, + 0x2c, 0x64, 0x0e, 0x4c, 0xb1, 0x33, 0x8e, 0x6e, 0x03, 0x50, 0xd2, 0xb2, 0x88, 0xcd, 0xb7, 0x33, + 0x17, 0xfe, 0x62, 0xda, 0xf4, 0x28, 0x38, 0xc0, 0x25, 0xff, 0xa3, 0x04, 0xe3, 0x1b, 0xc4, 0xfe, + 0xc4, 0xb0, 0xf6, 0x1b, 0x86, 0xa6, 0xb6, 0xfa, 0xe7, 0x90, 0x07, 0x70, 0x28, 0x0f, 0xbc, 0x39, + 0x60, 0x67, 0x42, 0xd6, 0xa5, 0x65, 0x03, 0xf9, 0x4b, 0x09, 0xe6, 0x43, 0x9c, 0x8f, 0xfc, 0xc3, + 0xbf, 0x0d, 0x43, 0xa6, 0x61, 0xd9, 0x6e, 0x8d, 0x70, 0x2a, 0x85, 0x2c, 0xc2, 0x06, 0xaa, 0x04, + 0x06, 0x83, 0x1d, 0x34, 0xb4, 0x06, 0x39, 0xdb, 0x10, 0xae, 0x7a, 0x3a, 0x4c, 0x42, 0xac, 0x3a, + 0x08, 0xcc, 0xdc, 0x96, 0x81, 0x73, 0xb6, 0xc1, 0x36, 0xa2, 0x1c, 0xe2, 0x0a, 0x86, 0xaf, 0x57, + 0x34, 0x03, 0x0c, 0x85, 0x5d, 0xcb, 0xe8, 0x9e, 0x79, 0x0e, 0xde, 0x46, 0xac, 0x58, 0x46, 0x17, + 0x73, 0x2c, 0xf9, 0x2b, 0x09, 0xa6, 0x43, 0x9c, 0xe7, 0x90, 0x3a, 0xde, 0x09, 0xa7, 0x8e, 0x1b, + 0xa7, 0x99, 0x48, 0x4a, 0x02, 0xf9, 0x2a, 0x17, 0x99, 0x06, 0x9b, 0x30, 0xda, 0x85, 0x51, 0xd3, + 0x68, 0x37, 0x5f, 0xc2, 0xf7, 0xcd, 0x49, 0x96, 0xd2, 0x1b, 0x3e, 0x16, 0x0e, 0x02, 0xa3, 0x43, + 0x98, 0xd6, 0x95, 0x2e, 0xa1, 0xa6, 0xd2, 0x22, 0xcd, 0x97, 0xf0, 0xe2, 0x73, 0x91, 0x7f, 0x40, + 0x89, 0x22, 0xe2, 0xb8, 0x12, 0xb4, 0x0e, 0x45, 0xd5, 0xe4, 0x25, 0xa6, 0xa8, 0x25, 0x06, 0xe6, + 0x61, 0xa7, 0x20, 0x75, 0xe2, 0xb9, 0xf8, 0x81, 0x5d, 0x0c, 0xf9, 0x5f, 0xa3, 0xde, 0xc0, 0x2b, + 0x96, 0xc7, 0x50, 0xe2, 0x9d, 0x26, 0x2d, 0x43, 0x73, 0x3f, 0x75, 0xf0, 0xcb, 0x85, 0x18, 0x7b, + 0x71, 0x54, 0xb9, 0x9c, 0xf0, 0x8a, 0xed, 0x92, 0xb1, 0x27, 0x8c, 0x36, 0xa0, 0x60, 0xfe, 0x90, + 0xe2, 0x8a, 0xa7, 0x49, 0x5e, 0x51, 0x71, 0x1c, 0xf4, 0x6b, 0x50, 0x24, 0x7a, 0x9b, 0xd7, 0x6b, + 0xce, 0x3b, 0x02, 0x9f, 0xd5, 0x23, 0x67, 0x08, 0xbb, 0x34, 0xf9, 0x0f, 0xf2, 0x91, 0x59, 0xf1, + 0x9c, 0xfa, 0xec, 0xa5, 0x39, 0x87, 0x57, 0xf3, 0xa5, 0x3a, 0xc8, 0x0e, 0x14, 0x45, 0x46, 0x16, + 0x3e, 0xff, 0xf3, 0xd3, 0xf8, 0x7c, 0x30, 0xd9, 0x79, 0x57, 0x2e, 0x77, 0xd0, 0x05, 0x46, 0x1f, + 0xc2, 0x30, 0x71, 0x54, 0x38, 0x29, 0xf4, 0xde, 0x69, 0x54, 0xf8, 0xe1, 0xd7, 0x2f, 0xb5, 0xc5, + 0x98, 0x40, 0x45, 0xbf, 0x64, 0xeb, 0xc5, 0x78, 0x59, 0x65, 0x4a, 0xcb, 0x05, 0x9e, 0xd5, 0xae, + 0x38, 0xd3, 0xf6, 0x86, 0x5f, 0x1c, 0x55, 0xc0, 0xff, 0x89, 0x83, 0x12, 0xf2, 0x3f, 0x4b, 0x30, + 0xcd, 0x57, 0xa8, 0xd5, 0xb3, 0x54, 0xbb, 0x7f, 0x6e, 0xf9, 0xeb, 0x69, 0x28, 0x7f, 0xdd, 0x19, + 0xb0, 0x2c, 0x31, 0x0b, 0x53, 0x73, 0xd8, 0xd7, 0x12, 0x5c, 0x8c, 0x71, 0x9f, 0x43, 0xf8, 0xdc, + 0x0e, 0x87, 0xcf, 0x37, 0x4f, 0x3b, 0xa1, 0x94, 0x10, 0xfa, 0x5f, 0xd3, 0x09, 0xd3, 0xe1, 0x27, + 0xe5, 0x36, 0x80, 0x69, 0xa9, 0x07, 0xaa, 0x46, 0x3a, 0xe2, 0xe3, 0x7f, 0x29, 0xd0, 0xda, 0xe5, + 0x51, 0x70, 0x80, 0x0b, 0x51, 0x98, 0x6b, 0x93, 0x5d, 0xa5, 0xa7, 0xd9, 0x8b, 0xed, 0xf6, 0x92, + 0x62, 0x2a, 0x3b, 0xaa, 0xa6, 0xda, 0xaa, 0x78, 0x26, 0x19, 0xa9, 0x3f, 0x74, 0x3e, 0xca, 0x27, + 0x71, 0xbc, 0x38, 0xaa, 0x5c, 0x49, 0xfa, 0x2a, 0xe6, 0xb2, 0xf4, 0x71, 0x0a, 0x34, 0xea, 0x43, + 0xd9, 0x22, 0x1f, 0xf7, 0x54, 0x8b, 0xb4, 0x97, 0x2d, 0xc3, 0x0c, 0xa9, 0xcd, 0x73, 0xb5, 0xbf, + 0x75, 0x7c, 0x54, 0x29, 0xe3, 0x14, 0x9e, 0xc1, 0x8a, 0x53, 0xe1, 0xd1, 0x33, 0x98, 0x51, 0x44, + 0x13, 0x5e, 0x50, 0xab, 0x73, 0x4a, 0xee, 0x1f, 0x1f, 0x55, 0x66, 0x16, 0xe3, 0xe4, 0xc1, 0x0a, + 0x93, 0x40, 0x51, 0x0d, 0x8a, 0x07, 0xbc, 0x5f, 0x8f, 0x96, 0x87, 0x38, 0x3e, 0xcb, 0x17, 0x45, + 0xa7, 0x85, 0x8f, 0x61, 0x0e, 0xaf, 0x34, 0xf9, 0xe9, 0x73, 0xb9, 0xd8, 0x95, 0x98, 0x95, 0x9c, + 0xe2, 0xc4, 0xf3, 0x97, 0xf2, 0x92, 0x1f, 0xb5, 0x9e, 0xf8, 0x24, 0x1c, 0xe4, 0x43, 0x1f, 0xc0, + 0xc8, 0x9e, 0x78, 0x57, 0xa1, 0xe5, 0x62, 0xa6, 0x5c, 0x1d, 0x7a, 0x87, 0xa9, 0x4f, 0x0b, 0x15, + 0x23, 0xee, 0x30, 0xc5, 0x3e, 0x22, 0x7a, 0x1d, 0x8a, 0xfc, 0xc7, 0xea, 0x32, 0x7f, 0x86, 0x2c, + 0xf9, 0xb1, 0xed, 0x89, 0x33, 0x8c, 0x5d, 0xba, 0xcb, 0xba, 0xda, 0x58, 0xe2, 0xcf, 0xe1, 0x11, + 0xd6, 0xd5, 0xc6, 0x12, 0x76, 0xe9, 0xe8, 0x23, 0x28, 0x52, 0xb2, 0xa6, 0xea, 0xbd, 0xc3, 0x32, + 0x64, 0xfa, 0x98, 0xde, 0x7c, 0xc4, 0xb9, 0x23, 0x0f, 0x82, 0xbe, 0x06, 0x41, 0xc7, 0x2e, 0x2c, + 0xda, 0x83, 0x11, 0xab, 0xa7, 0x2f, 0xd2, 0x6d, 0x4a, 0xac, 0xf2, 0x28, 0xd7, 0x31, 0x28, 0x9c, + 0x63, 0x97, 0x3f, 0xaa, 0xc5, 0x5b, 0x21, 0x8f, 0x03, 0xfb, 0xe0, 0x68, 0x0f, 0x80, 0xff, 0xe0, + 0x6f, 0x8f, 0xe5, 0x39, 0xae, 0xea, 0x7e, 0x16, 0x55, 0x49, 0x4f, 0x9c, 0xe2, 0xfb, 0x83, 0x47, + 0xc6, 0x01, 0x6c, 0xf4, 0x87, 0x12, 0x20, 0xda, 0x33, 0x4d, 0x8d, 0x74, 0x89, 0x6e, 0x2b, 0x1a, + 0x1f, 0xa5, 0xe5, 0x31, 0xae, 0xf2, 0xed, 0x41, 0x2b, 0x18, 0x13, 0x8c, 0xaa, 0xf6, 0x3e, 0x2b, + 0xc4, 0x59, 0x71, 0x82, 0x5e, 0xb6, 0x89, 0xbb, 0x62, 0xd6, 0xe3, 0x99, 0x36, 0x31, 0xf9, 0x55, + 0xd7, 0xdf, 0x44, 0x41, 0xc7, 0x2e, 0x2c, 0x7a, 0x0a, 0x73, 0x6e, 0x63, 0x29, 0x36, 0x0c, 0x7b, + 0x45, 0xd5, 0x08, 0xed, 0x53, 0x9b, 0x74, 0xcb, 0x13, 0xdc, 0xc1, 0xbc, 0xee, 0x1a, 0x9c, 0xc8, + 0x85, 0x53, 0xa4, 0x51, 0x17, 0x2a, 0x6e, 0x70, 0x62, 0x27, 0xd7, 0x8b, 0x8e, 0x8f, 0x68, 0x4b, + 0xd1, 0x9c, 0x2f, 0x2d, 0x93, 0x5c, 0xc1, 0x6b, 0xc7, 0x47, 0x95, 0xca, 0xf2, 0xc9, 0xac, 0x78, + 0x10, 0x16, 0x7a, 0x0f, 0xca, 0x4a, 0x9a, 0x9e, 0x29, 0xae, 0xe7, 0xa7, 0x2c, 0xe2, 0xa5, 0x2a, + 0x48, 0x95, 0x46, 0x36, 0x4c, 0x29, 0xe1, 0x16, 0x5f, 0x5a, 0x9e, 0xce, 0xf4, 0x68, 0x1b, 0xe9, + 0x0c, 0xf6, 0xdf, 0x57, 0x22, 0x04, 0x8a, 0x63, 0x1a, 0xd0, 0xef, 0x01, 0x52, 0xa2, 0x5d, 0xc9, + 0xb4, 0x8c, 0x32, 0x25, 0xba, 0x58, 0x3b, 0xb3, 0xef, 0x76, 0x31, 0x12, 0xc5, 0x09, 0x7a, 0x58, + 0x1d, 0xaf, 0x44, 0x3a, 0xa9, 0x69, 0x79, 0x9e, 0x2b, 0xaf, 0x65, 0x53, 0xee, 0xc9, 0x05, 0x3e, + 0x28, 0x45, 0x11, 0x71, 0x5c, 0x09, 0x5a, 0x83, 0x59, 0x31, 0xb8, 0xad, 0x53, 0x65, 0x97, 0x34, + 0xfb, 0xb4, 0x65, 0x6b, 0xb4, 0x3c, 0xc3, 0xe3, 0x3b, 0xff, 0xa8, 0xb9, 0x98, 0x40, 0xc7, 0x89, + 0x52, 0xe8, 0x6d, 0x98, 0xda, 0x35, 0xac, 0x1d, 0xb5, 0xdd, 0x26, 0xba, 0x8b, 0x34, 0xcb, 0x91, + 0xf8, 0x73, 0xd1, 0x4a, 0x84, 0x86, 0x63, 0xdc, 0x88, 0xc2, 0x45, 0x81, 0xdc, 0xb0, 0x8c, 0xd6, + 0xba, 0xd1, 0xd3, 0x6d, 0xa7, 0xec, 0xbb, 0xe8, 0xa5, 0xd1, 0x8b, 0x8b, 0x49, 0x0c, 0x2f, 0x8e, + 0x2a, 0x57, 0x93, 0x2f, 0x03, 0x3e, 0x13, 0x4e, 0xc6, 0x46, 0x26, 0x8c, 0x89, 0xfe, 0x78, 0xfe, + 0x6e, 0x55, 0x2e, 0xf3, 0xa3, 0xff, 0x60, 0x70, 0xc0, 0xf3, 0x44, 0xa2, 0xe7, 0x7f, 0xea, 0xf8, + 0xa8, 0x32, 0x16, 0x64, 0xc0, 0x21, 0x0d, 0xbc, 0x1f, 0x4a, 0x7c, 0x85, 0x3b, 0x9f, 0x9e, 0xf2, + 0xd3, 0xf5, 0x43, 0xf9, 0xa6, 0xbd, 0xb4, 0x7e, 0xa8, 0x00, 0xe4, 0xc9, 0x2f, 0xeb, 0xff, 0x99, + 0x83, 0x19, 0x9f, 0x39, 0x73, 0x3f, 0x54, 0x82, 0xc8, 0xff, 0xf7, 0x95, 0x67, 0xeb, 0x51, 0xf2, + 0x97, 0xee, 0x7f, 0x5f, 0x8f, 0x92, 0x6f, 0x5b, 0xca, 0xed, 0xe1, 0xaf, 0x73, 0xc1, 0x09, 0x9c, + 0xb2, 0x51, 0xe6, 0x25, 0xb4, 0x56, 0xff, 0xe8, 0x7a, 0x6d, 0xe4, 0xaf, 0xf3, 0x30, 0x15, 0x3d, + 0x8d, 0xa1, 0x7e, 0x0a, 0x69, 0x60, 0x3f, 0x45, 0x03, 0x66, 0x77, 0x7b, 0x9a, 0xd6, 0xe7, 0x73, + 0x08, 0x34, 0x55, 0x38, 0x5f, 0x36, 0x7f, 0x2a, 0x24, 0x67, 0x57, 0x12, 0x78, 0x70, 0xa2, 0x64, + 0xbc, 0xbd, 0xa2, 0xf0, 0x43, 0xdb, 0x2b, 0x86, 0xce, 0xd0, 0x5e, 0x91, 0xdc, 0xa1, 0x92, 0x3f, + 0x53, 0x87, 0xca, 0x59, 0x7a, 0x2b, 0x12, 0x82, 0xd8, 0xc0, 0x3e, 0xe1, 0x5f, 0xc0, 0x44, 0xb8, + 0xdf, 0xc7, 0xd9, 0x4b, 0xa7, 0xe5, 0x48, 0x7c, 0x41, 0x0e, 0xec, 0xa5, 0x33, 0x8e, 0x3d, 0x0e, + 0xf9, 0x58, 0x82, 0xb9, 0xe4, 0xbe, 0x5e, 0xa4, 0xc1, 0x44, 0x57, 0x39, 0x0c, 0xf6, 0x5a, 0x4b, + 0x67, 0x7c, 0x40, 0xe3, 0x8d, 0x1e, 0xeb, 0x21, 0x2c, 0x1c, 0xc1, 0x46, 0xef, 0x43, 0xa9, 0xab, + 0x1c, 0x36, 0x7b, 0x56, 0x87, 0x9c, 0xf9, 0xa1, 0x8e, 0x1f, 0xa3, 0x75, 0x81, 0x82, 0x3d, 0x3c, + 0xf9, 0x7b, 0x09, 0xe6, 0x53, 0xda, 0x37, 0xfe, 0x0f, 0xcd, 0xf2, 0x2f, 0x24, 0xf8, 0x49, 0xea, + 0x35, 0x0c, 0xdd, 0x0b, 0x75, 0x9a, 0xc8, 0x91, 0x4e, 0x13, 0x14, 0x17, 0x7c, 0x45, 0x8d, 0x26, + 0x9f, 0x4b, 0x50, 0x4e, 0xbb, 0x97, 0xa2, 0xbb, 0x21, 0x23, 0x7f, 0x16, 0x31, 0x72, 0x3a, 0x26, + 0xf7, 0x8a, 0x6c, 0xfc, 0x17, 0x09, 0x2e, 0x9f, 0x50, 0xdf, 0x79, 0xd7, 0x1f, 0xd2, 0x0e, 0x72, + 0xf1, 0x97, 0x73, 0xf1, 0xd9, 0xcd, 0xbf, 0xfe, 0x24, 0xf0, 0xe0, 0x54, 0x69, 0xb4, 0x0d, 0xf3, + 0xe2, 0xee, 0x15, 0xa5, 0x89, 0xd2, 0x85, 0x37, 0xe4, 0x2d, 0x27, 0xb3, 0xe0, 0x34, 0x59, 0xf9, + 0xaf, 0x24, 0x98, 0x4b, 0x7e, 0x70, 0x40, 0x6f, 0x85, 0x96, 0xbc, 0x12, 0x59, 0xf2, 0xc9, 0x88, + 0x94, 0x58, 0xf0, 0x0f, 0x61, 0x42, 0x3c, 0x4b, 0x08, 0x18, 0xe1, 0xcc, 0x72, 0x52, 0x76, 0x12, + 0x10, 0x6e, 0x71, 0xcc, 0x8f, 0x49, 0x78, 0x0c, 0x47, 0xd0, 0xe4, 0x4f, 0x73, 0x30, 0xd4, 0x6c, + 0x29, 0x1a, 0x39, 0x87, 0xda, 0xf8, 0x57, 0xa1, 0xda, 0x78, 0xd0, 0x7f, 0x75, 0xe3, 0x56, 0xa5, + 0x96, 0xc5, 0x38, 0x52, 0x16, 0xbf, 0x91, 0x09, 0xed, 0xe4, 0x8a, 0xf8, 0x37, 0x61, 0xc4, 0x53, + 0x7a, 0xba, 0x44, 0x2d, 0xff, 0x79, 0x0e, 0x46, 0x03, 0x2a, 0x4e, 0x99, 0xe6, 0x77, 0x43, 0xb5, + 0x4d, 0x3e, 0xc3, 0x23, 0x50, 0x40, 0x57, 0xd5, 0xad, 0x66, 0x9c, 0x56, 0x6d, 0xbf, 0x39, 0x37, + 0x5e, 0xe4, 0xfc, 0x02, 0x26, 0x6c, 0xc5, 0xea, 0x10, 0xdb, 0xfb, 0x28, 0xe2, 0xb4, 0x92, 0x79, + 0xff, 0x67, 0x60, 0x2b, 0x44, 0xc5, 0x11, 0xee, 0x4b, 0x0f, 0x61, 0x3c, 0xa4, 0xec, 0x54, 0x9d, + 0xd6, 0x7f, 0x23, 0xc1, 0xcf, 0x06, 0x3e, 0x24, 0xa1, 0x7a, 0xe8, 0x90, 0x54, 0x23, 0x87, 0x64, + 0x21, 0x1d, 0xe0, 0xd5, 0x75, 0xec, 0xd5, 0x6f, 0x3e, 0xff, 0x6e, 0xe1, 0xc2, 0x37, 0xdf, 0x2d, + 0x5c, 0xf8, 0xf6, 0xbb, 0x85, 0x0b, 0xbf, 0x7f, 0xbc, 0x20, 0x3d, 0x3f, 0x5e, 0x90, 0xbe, 0x39, + 0x5e, 0x90, 0xbe, 0x3d, 0x5e, 0x90, 0xfe, 0xfd, 0x78, 0x41, 0xfa, 0xe3, 0xef, 0x17, 0x2e, 0xbc, + 0x5f, 0x14, 0x70, 0xff, 0x13, 0x00, 0x00, 0xff, 0xff, 0x2f, 0x9d, 0xa0, 0x1e, 0x3d, 0x3f, 0x00, + 0x00, } func (m *AllowedCSIDriver) Marshal() (dAtA []byte, err error) { @@ -3608,6 +3610,11 @@ func (m *NetworkPolicyPort) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.EndPort != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.EndPort)) + i-- + dAtA[i] = 0x18 + } if m.Port != nil { { size, err := m.Port.MarshalToSizedBuffer(dAtA[:i]) @@ -4378,6 +4385,18 @@ func (m *RollingUpdateDaemonSet) MarshalToSizedBuffer(dAtA []byte) (int, error) _ = i var l int _ = l + if m.MaxSurge != nil { + { + size, err := m.MaxSurge.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } if m.MaxUnavailable != nil { { size, err := m.MaxUnavailable.MarshalToSizedBuffer(dAtA[:i]) @@ -5410,6 +5429,9 @@ func (m *NetworkPolicyPort) Size() (n int) { l = m.Port.Size() n += 1 + l + sovGenerated(uint64(l)) } + if m.EndPort != nil { + n += 1 + sovGenerated(uint64(*m.EndPort)) + } return n } @@ -5684,6 +5706,10 @@ func (m *RollingUpdateDaemonSet) Size() (n int) { l = m.MaxUnavailable.Size() n += 1 + l + sovGenerated(uint64(l)) } + if m.MaxSurge != nil { + l = m.MaxSurge.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -6348,6 +6374,7 @@ func (this *NetworkPolicyPort) String() string { s := strings.Join([]string{`&NetworkPolicyPort{`, `Protocol:` + valueToStringGenerated(this.Protocol) + `,`, `Port:` + strings.Replace(fmt.Sprintf("%v", this.Port), "IntOrString", "intstr.IntOrString", 1) + `,`, + `EndPort:` + valueToStringGenerated(this.EndPort) + `,`, `}`, }, "") return s @@ -6546,6 +6573,7 @@ func (this *RollingUpdateDaemonSet) String() string { } s := strings.Join([]string{`&RollingUpdateDaemonSet{`, `MaxUnavailable:` + strings.Replace(fmt.Sprintf("%v", this.MaxUnavailable), "IntOrString", "intstr.IntOrString", 1) + `,`, + `MaxSurge:` + strings.Replace(fmt.Sprintf("%v", this.MaxSurge), "IntOrString", "intstr.IntOrString", 1) + `,`, `}`, }, "") return s @@ -6750,10 +6778,7 @@ func (m *AllowedCSIDriver) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -6835,10 +6860,7 @@ func (m *AllowedFlexVolume) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -6940,10 +6962,7 @@ func (m *AllowedHostPath) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -7092,10 +7111,7 @@ func (m *DaemonSet) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -7306,10 +7322,7 @@ func (m *DaemonSetCondition) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -7426,10 +7439,7 @@ func (m *DaemonSetList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -7639,10 +7649,7 @@ func (m *DaemonSetSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -7898,10 +7905,7 @@ func (m *DaemonSetStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -8019,10 +8023,7 @@ func (m *DaemonSetUpdateStrategy) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -8171,10 +8172,7 @@ func (m *Deployment) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -8418,10 +8416,7 @@ func (m *DeploymentCondition) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -8538,10 +8533,7 @@ func (m *DeploymentList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -8733,7 +8725,7 @@ func (m *DeploymentRollback) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -8783,10 +8775,7 @@ func (m *DeploymentRollback) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -9073,10 +9062,7 @@ func (m *DeploymentSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -9294,10 +9280,7 @@ func (m *DeploymentStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -9415,10 +9398,7 @@ func (m *DeploymentStrategy) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -9534,10 +9514,7 @@ func (m *FSGroupStrategyOptions) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -9685,10 +9662,7 @@ func (m *HTTPIngressPath) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -9772,10 +9746,7 @@ func (m *HTTPIngressRuleValue) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -9863,10 +9834,7 @@ func (m *HostPortRange) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -9954,10 +9922,7 @@ func (m *IDRange) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -10071,10 +10036,7 @@ func (m *IPBlock) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -10223,10 +10185,7 @@ func (m *Ingress) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -10377,10 +10336,7 @@ func (m *IngressBackend) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -10497,10 +10453,7 @@ func (m *IngressList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -10615,10 +10568,7 @@ func (m *IngressRule) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -10704,10 +10654,7 @@ func (m *IngressRuleValue) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -10894,10 +10841,7 @@ func (m *IngressSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -10980,10 +10924,7 @@ func (m *IngressStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -11097,10 +11038,7 @@ func (m *IngressTLS) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -11216,10 +11154,7 @@ func (m *NetworkPolicy) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -11337,10 +11272,7 @@ func (m *NetworkPolicyEgressRule) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -11458,10 +11390,7 @@ func (m *NetworkPolicyIngressRule) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -11578,10 +11507,7 @@ func (m *NetworkPolicyList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -11739,10 +11665,7 @@ func (m *NetworkPolicyPeer) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -11855,16 +11778,33 @@ func (m *NetworkPolicyPort) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field EndPort", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.EndPort = &v default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -12047,10 +11987,7 @@ func (m *NetworkPolicySpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -12166,10 +12103,7 @@ func (m *PodSecurityPolicy) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -12286,10 +12220,7 @@ func (m *PodSecurityPolicyList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -13045,10 +12976,7 @@ func (m *PodSecurityPolicySpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -13197,10 +13125,7 @@ func (m *ReplicaSet) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -13411,10 +13336,7 @@ func (m *ReplicaSetCondition) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -13531,10 +13453,7 @@ func (m *ReplicaSetList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -13692,10 +13611,7 @@ func (m *ReplicaSetSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -13874,10 +13790,7 @@ func (m *ReplicaSetStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -13946,10 +13859,7 @@ func (m *RollbackConfig) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -14029,16 +13939,49 @@ func (m *RollingUpdateDaemonSet) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MaxSurge", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.MaxSurge == nil { + m.MaxSurge = &intstr.IntOrString{} + } + if err := m.MaxSurge.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -14160,10 +14103,7 @@ func (m *RollingUpdateDeployment) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -14279,10 +14219,7 @@ func (m *RunAsGroupStrategyOptions) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -14398,10 +14335,7 @@ func (m *RunAsUserStrategyOptions) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -14516,10 +14450,7 @@ func (m *RuntimeClassStrategyOptions) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -14637,10 +14568,7 @@ func (m *SELinuxStrategyOptions) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -14789,10 +14717,7 @@ func (m *Scale) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -14861,10 +14786,7 @@ func (m *ScaleSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -15043,7 +14965,7 @@ func (m *ScaleStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -15092,10 +15014,7 @@ func (m *ScaleStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -15211,10 +15130,7 @@ func (m *SupplementalGroupsStrategyOptions) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/api/extensions/v1beta1/generated.proto b/vendor/k8s.io/api/extensions/v1beta1/generated.proto index a4ca5b563ae3..5e3d165ebe6a 100644 --- a/vendor/k8s.io/api/extensions/v1beta1/generated.proto +++ b/vendor/k8s.io/api/extensions/v1beta1/generated.proto @@ -745,13 +745,21 @@ message NetworkPolicyPort { // +optional optional string protocol = 1; - // If specified, the port on the given protocol. This can - // either be a numerical or named port on a pod. If this field is not provided, - // this matches all port names and numbers. - // If present, only traffic on the specified protocol AND port - // will be matched. + // The port on the given protocol. This can either be a numerical or named + // port on a pod. If this field is not provided, this matches all port names and + // numbers. + // If present, only traffic on the specified protocol AND port will be matched. // +optional optional k8s.io.apimachinery.pkg.util.intstr.IntOrString port = 2; + + // If set, indicates that the range of ports from port to endPort, inclusive, + // should be allowed by the policy. This field cannot be defined if the port field + // is not defined or if the port field is defined as a named (string) port. + // The endPort must be equal or greater than port. + // This feature is in Alpha state and should be enabled using the Feature Gate + // "NetworkPolicyEndPort". + // +optional + optional int32 endPort = 3; } // DEPRECATED 1.9 - This group version of NetworkPolicySpec is deprecated by networking/v1/NetworkPolicySpec. @@ -784,7 +792,7 @@ message NetworkPolicySpec { repeated NetworkPolicyEgressRule egress = 3; // List of rule types that the NetworkPolicy relates to. - // Valid options are "Ingress", "Egress", or "Ingress,Egress". + // Valid options are ["Ingress"], ["Egress"], or ["Ingress", "Egress"]. // If this field is not specified, it will default based on the existence of Ingress or Egress rules; // policies that contain an Egress section are assumed to affect Egress, and all policies // (whether or not they contain an Ingress section) are assumed to affect Ingress. @@ -1082,19 +1090,41 @@ message RollingUpdateDaemonSet { // The maximum number of DaemonSet pods that can be unavailable during the // update. Value can be an absolute number (ex: 5) or a percentage of total // number of DaemonSet pods at the start of the update (ex: 10%). Absolute - // number is calculated from percentage by rounding up. - // This cannot be 0. + // number is calculated from percentage by rounding down to a minimum of one. + // This cannot be 0 if MaxSurge is 0 // Default value is 1. // Example: when this is set to 30%, at most 30% of the total number of nodes // that should be running the daemon pod (i.e. status.desiredNumberScheduled) - // can have their pods stopped for an update at any given - // time. The update starts by stopping at most 30% of those DaemonSet pods - // and then brings up new DaemonSet pods in their place. Once the new pods - // are available, it then proceeds onto other DaemonSet pods, thus ensuring - // that at least 70% of original number of DaemonSet pods are available at - // all times during the update. + // can have their pods stopped for an update at any given time. The update + // starts by stopping at most 30% of those DaemonSet pods and then brings + // up new DaemonSet pods in their place. Once the new pods are available, + // it then proceeds onto other DaemonSet pods, thus ensuring that at least + // 70% of original number of DaemonSet pods are available at all times during + // the update. // +optional optional k8s.io.apimachinery.pkg.util.intstr.IntOrString maxUnavailable = 1; + + // The maximum number of nodes with an existing available DaemonSet pod that + // can have an updated DaemonSet pod during during an update. + // Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). + // This can not be 0 if MaxUnavailable is 0. + // Absolute number is calculated from percentage by rounding up to a minimum of 1. + // Default value is 0. + // Example: when this is set to 30%, at most 30% of the total number of nodes + // that should be running the daemon pod (i.e. status.desiredNumberScheduled) + // can have their a new pod created before the old pod is marked as deleted. + // The update starts by launching new pods on 30% of nodes. Once an updated + // pod is available (Ready for at least minReadySeconds) the old DaemonSet pod + // on that node is marked deleted. If the old pod becomes unavailable for any + // reason (Ready transitions to false, is evicted, or is drained) an updated + // pod is immediatedly created on that node without considering surge limits. + // Allowing surge implies the possibility that the resources consumed by the + // daemonset on any given node can double if the readiness check fails, and + // so resource intensive daemonsets should take into account that they may + // cause evictions during disruption. + // This is an alpha field and requires enabling DaemonSetUpdateSurge feature gate. + // +optional + optional k8s.io.apimachinery.pkg.util.intstr.IntOrString maxSurge = 2; } // Spec to control the desired behavior of rolling update. diff --git a/vendor/k8s.io/api/extensions/v1beta1/types.go b/vendor/k8s.io/api/extensions/v1beta1/types.go index bd75c51bcca7..f3479713c537 100644 --- a/vendor/k8s.io/api/extensions/v1beta1/types.go +++ b/vendor/k8s.io/api/extensions/v1beta1/types.go @@ -357,19 +357,41 @@ type RollingUpdateDaemonSet struct { // The maximum number of DaemonSet pods that can be unavailable during the // update. Value can be an absolute number (ex: 5) or a percentage of total // number of DaemonSet pods at the start of the update (ex: 10%). Absolute - // number is calculated from percentage by rounding up. - // This cannot be 0. + // number is calculated from percentage by rounding down to a minimum of one. + // This cannot be 0 if MaxSurge is 0 // Default value is 1. // Example: when this is set to 30%, at most 30% of the total number of nodes // that should be running the daemon pod (i.e. status.desiredNumberScheduled) - // can have their pods stopped for an update at any given - // time. The update starts by stopping at most 30% of those DaemonSet pods - // and then brings up new DaemonSet pods in their place. Once the new pods - // are available, it then proceeds onto other DaemonSet pods, thus ensuring - // that at least 70% of original number of DaemonSet pods are available at - // all times during the update. + // can have their pods stopped for an update at any given time. The update + // starts by stopping at most 30% of those DaemonSet pods and then brings + // up new DaemonSet pods in their place. Once the new pods are available, + // it then proceeds onto other DaemonSet pods, thus ensuring that at least + // 70% of original number of DaemonSet pods are available at all times during + // the update. // +optional MaxUnavailable *intstr.IntOrString `json:"maxUnavailable,omitempty" protobuf:"bytes,1,opt,name=maxUnavailable"` + + // The maximum number of nodes with an existing available DaemonSet pod that + // can have an updated DaemonSet pod during during an update. + // Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). + // This can not be 0 if MaxUnavailable is 0. + // Absolute number is calculated from percentage by rounding up to a minimum of 1. + // Default value is 0. + // Example: when this is set to 30%, at most 30% of the total number of nodes + // that should be running the daemon pod (i.e. status.desiredNumberScheduled) + // can have their a new pod created before the old pod is marked as deleted. + // The update starts by launching new pods on 30% of nodes. Once an updated + // pod is available (Ready for at least minReadySeconds) the old DaemonSet pod + // on that node is marked deleted. If the old pod becomes unavailable for any + // reason (Ready transitions to false, is evicted, or is drained) an updated + // pod is immediatedly created on that node without considering surge limits. + // Allowing surge implies the possibility that the resources consumed by the + // daemonset on any given node can double if the readiness check fails, and + // so resource intensive daemonsets should take into account that they may + // cause evictions during disruption. + // This is an alpha field and requires enabling DaemonSetUpdateSurge feature gate. + // +optional + MaxSurge *intstr.IntOrString `json:"maxSurge,omitempty" protobuf:"bytes,2,opt,name=maxSurge"` } // DaemonSetSpec is the specification of a daemon set. @@ -1387,7 +1409,7 @@ type NetworkPolicySpec struct { Egress []NetworkPolicyEgressRule `json:"egress,omitempty" protobuf:"bytes,3,rep,name=egress"` // List of rule types that the NetworkPolicy relates to. - // Valid options are "Ingress", "Egress", or "Ingress,Egress". + // Valid options are ["Ingress"], ["Egress"], or ["Ingress", "Egress"]. // If this field is not specified, it will default based on the existence of Ingress or Egress rules; // policies that contain an Egress section are assumed to affect Egress, and all policies // (whether or not they contain an Ingress section) are assumed to affect Ingress. @@ -1449,13 +1471,21 @@ type NetworkPolicyPort struct { // +optional Protocol *v1.Protocol `json:"protocol,omitempty" protobuf:"bytes,1,opt,name=protocol,casttype=k8s.io/api/core/v1.Protocol"` - // If specified, the port on the given protocol. This can - // either be a numerical or named port on a pod. If this field is not provided, - // this matches all port names and numbers. - // If present, only traffic on the specified protocol AND port - // will be matched. + // The port on the given protocol. This can either be a numerical or named + // port on a pod. If this field is not provided, this matches all port names and + // numbers. + // If present, only traffic on the specified protocol AND port will be matched. // +optional Port *intstr.IntOrString `json:"port,omitempty" protobuf:"bytes,2,opt,name=port"` + + // If set, indicates that the range of ports from port to endPort, inclusive, + // should be allowed by the policy. This field cannot be defined if the port field + // is not defined or if the port field is defined as a named (string) port. + // The endPort must be equal or greater than port. + // This feature is in Alpha state and should be enabled using the Feature Gate + // "NetworkPolicyEndPort". + // +optional + EndPort *int32 `json:"endPort,omitempty" protobuf:"bytes,3,opt,name=endPort"` } // DEPRECATED 1.9 - This group version of IPBlock is deprecated by networking/v1/IPBlock. diff --git a/vendor/k8s.io/api/extensions/v1beta1/types_swagger_doc_generated.go b/vendor/k8s.io/api/extensions/v1beta1/types_swagger_doc_generated.go index 0ef3c00593e1..870b607a72bd 100644 --- a/vendor/k8s.io/api/extensions/v1beta1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/extensions/v1beta1/types_swagger_doc_generated.go @@ -413,7 +413,8 @@ func (NetworkPolicyPeer) SwaggerDoc() map[string]string { var map_NetworkPolicyPort = map[string]string{ "": "DEPRECATED 1.9 - This group version of NetworkPolicyPort is deprecated by networking/v1/NetworkPolicyPort.", "protocol": "Optional. The protocol (TCP, UDP, or SCTP) which traffic must match. If not specified, this field defaults to TCP.", - "port": "If specified, the port on the given protocol. This can either be a numerical or named port on a pod. If this field is not provided, this matches all port names and numbers. If present, only traffic on the specified protocol AND port will be matched.", + "port": "The port on the given protocol. This can either be a numerical or named port on a pod. If this field is not provided, this matches all port names and numbers. If present, only traffic on the specified protocol AND port will be matched.", + "endPort": "If set, indicates that the range of ports from port to endPort, inclusive, should be allowed by the policy. This field cannot be defined if the port field is not defined or if the port field is defined as a named (string) port. The endPort must be equal or greater than port. This feature is in Alpha state and should be enabled using the Feature Gate \"NetworkPolicyEndPort\".", } func (NetworkPolicyPort) SwaggerDoc() map[string]string { @@ -425,7 +426,7 @@ var map_NetworkPolicySpec = map[string]string{ "podSelector": "Selects the pods to which this NetworkPolicy object applies. The array of ingress rules is applied to any pods selected by this field. Multiple network policies can select the same set of pods. In this case, the ingress rules for each are combined additively. This field is NOT optional and follows standard label selector semantics. An empty podSelector matches all pods in this namespace.", "ingress": "List of ingress rules to be applied to the selected pods. Traffic is allowed to a pod if there are no NetworkPolicies selecting the pod OR if the traffic source is the pod's local node, OR if the traffic matches at least one ingress rule across all of the NetworkPolicy objects whose podSelector matches the pod. If this field is empty then this NetworkPolicy does not allow any traffic (and serves solely to ensure that the pods it selects are isolated by default).", "egress": "List of egress rules to be applied to the selected pods. Outgoing traffic is allowed if there are no NetworkPolicies selecting the pod (and cluster policy otherwise allows the traffic), OR if the traffic matches at least one egress rule across all of the NetworkPolicy objects whose podSelector matches the pod. If this field is empty then this NetworkPolicy limits all outgoing traffic (and serves solely to ensure that the pods it selects are isolated by default). This field is beta-level in 1.8", - "policyTypes": "List of rule types that the NetworkPolicy relates to. Valid options are \"Ingress\", \"Egress\", or \"Ingress,Egress\". If this field is not specified, it will default based on the existence of Ingress or Egress rules; policies that contain an Egress section are assumed to affect Egress, and all policies (whether or not they contain an Ingress section) are assumed to affect Ingress. If you want to write an egress-only policy, you must explicitly specify policyTypes [ \"Egress\" ]. Likewise, if you want to write a policy that specifies that no egress is allowed, you must specify a policyTypes value that include \"Egress\" (since such a policy would not include an Egress section and would otherwise default to just [ \"Ingress\" ]). This field is beta-level in 1.8", + "policyTypes": "List of rule types that the NetworkPolicy relates to. Valid options are [\"Ingress\"], [\"Egress\"], or [\"Ingress\", \"Egress\"]. If this field is not specified, it will default based on the existence of Ingress or Egress rules; policies that contain an Egress section are assumed to affect Egress, and all policies (whether or not they contain an Ingress section) are assumed to affect Ingress. If you want to write an egress-only policy, you must explicitly specify policyTypes [ \"Egress\" ]. Likewise, if you want to write a policy that specifies that no egress is allowed, you must specify a policyTypes value that include \"Egress\" (since such a policy would not include an Egress section and would otherwise default to just [ \"Ingress\" ]). This field is beta-level in 1.8", } func (NetworkPolicySpec) SwaggerDoc() map[string]string { @@ -555,7 +556,8 @@ func (RollbackConfig) SwaggerDoc() map[string]string { var map_RollingUpdateDaemonSet = map[string]string{ "": "Spec to control the desired behavior of daemon set rolling update.", - "maxUnavailable": "The maximum number of DaemonSet pods that can be unavailable during the update. Value can be an absolute number (ex: 5) or a percentage of total number of DaemonSet pods at the start of the update (ex: 10%). Absolute number is calculated from percentage by rounding up. This cannot be 0. Default value is 1. Example: when this is set to 30%, at most 30% of the total number of nodes that should be running the daemon pod (i.e. status.desiredNumberScheduled) can have their pods stopped for an update at any given time. The update starts by stopping at most 30% of those DaemonSet pods and then brings up new DaemonSet pods in their place. Once the new pods are available, it then proceeds onto other DaemonSet pods, thus ensuring that at least 70% of original number of DaemonSet pods are available at all times during the update.", + "maxUnavailable": "The maximum number of DaemonSet pods that can be unavailable during the update. Value can be an absolute number (ex: 5) or a percentage of total number of DaemonSet pods at the start of the update (ex: 10%). Absolute number is calculated from percentage by rounding down to a minimum of one. This cannot be 0 if MaxSurge is 0 Default value is 1. Example: when this is set to 30%, at most 30% of the total number of nodes that should be running the daemon pod (i.e. status.desiredNumberScheduled) can have their pods stopped for an update at any given time. The update starts by stopping at most 30% of those DaemonSet pods and then brings up new DaemonSet pods in their place. Once the new pods are available, it then proceeds onto other DaemonSet pods, thus ensuring that at least 70% of original number of DaemonSet pods are available at all times during the update.", + "maxSurge": "The maximum number of nodes with an existing available DaemonSet pod that can have an updated DaemonSet pod during during an update. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). This can not be 0 if MaxUnavailable is 0. Absolute number is calculated from percentage by rounding up to a minimum of 1. Default value is 0. Example: when this is set to 30%, at most 30% of the total number of nodes that should be running the daemon pod (i.e. status.desiredNumberScheduled) can have their a new pod created before the old pod is marked as deleted. The update starts by launching new pods on 30% of nodes. Once an updated pod is available (Ready for at least minReadySeconds) the old DaemonSet pod on that node is marked deleted. If the old pod becomes unavailable for any reason (Ready transitions to false, is evicted, or is drained) an updated pod is immediatedly created on that node without considering surge limits. Allowing surge implies the possibility that the resources consumed by the daemonset on any given node can double if the readiness check fails, and so resource intensive daemonsets should take into account that they may cause evictions during disruption. This is an alpha field and requires enabling DaemonSetUpdateSurge feature gate.", } func (RollingUpdateDaemonSet) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/api/extensions/v1beta1/zz_generated.deepcopy.go b/vendor/k8s.io/api/extensions/v1beta1/zz_generated.deepcopy.go index 913f48514536..838315610942 100644 --- a/vendor/k8s.io/api/extensions/v1beta1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/extensions/v1beta1/zz_generated.deepcopy.go @@ -916,6 +916,11 @@ func (in *NetworkPolicyPort) DeepCopyInto(out *NetworkPolicyPort) { *out = new(intstr.IntOrString) **out = **in } + if in.EndPort != nil { + in, out := &in.EndPort, &out.EndPort + *out = new(int32) + **out = **in + } return } @@ -1272,6 +1277,11 @@ func (in *RollingUpdateDaemonSet) DeepCopyInto(out *RollingUpdateDaemonSet) { *out = new(intstr.IntOrString) **out = **in } + if in.MaxSurge != nil { + in, out := &in.MaxSurge, &out.MaxSurge + *out = new(intstr.IntOrString) + **out = **in + } return } diff --git a/vendor/k8s.io/api/flowcontrol/v1alpha1/BUILD b/vendor/k8s.io/api/flowcontrol/v1alpha1/BUILD deleted file mode 100644 index b248af0d277a..000000000000 --- a/vendor/k8s.io/api/flowcontrol/v1alpha1/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - "zz_generated.prerelease-lifecycle.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/api/flowcontrol/v1alpha1", - importpath = "k8s.io/api/flowcontrol/v1alpha1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/flowcontrol/v1alpha1/generated.pb.go b/vendor/k8s.io/api/flowcontrol/v1alpha1/generated.pb.go index 86c8612049e8..7f0687ac043c 100644 --- a/vendor/k8s.io/api/flowcontrol/v1alpha1/generated.pb.go +++ b/vendor/k8s.io/api/flowcontrol/v1alpha1/generated.pb.go @@ -2513,10 +2513,7 @@ func (m *FlowDistinguisherMethod) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2665,10 +2662,7 @@ func (m *FlowSchema) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2879,10 +2873,7 @@ func (m *FlowSchemaCondition) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2999,10 +2990,7 @@ func (m *FlowSchemaList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3174,10 +3162,7 @@ func (m *FlowSchemaSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3261,10 +3246,7 @@ func (m *FlowSchemaStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3346,10 +3328,7 @@ func (m *GroupSubject) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3467,10 +3446,7 @@ func (m *LimitResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3572,10 +3548,7 @@ func (m *LimitedPriorityLevelConfiguration) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3689,10 +3662,7 @@ func (m *NonResourcePolicyRule) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3844,10 +3814,7 @@ func (m *PolicyRulesWithSubjects) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3996,10 +3963,7 @@ func (m *PriorityLevelConfiguration) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4210,10 +4174,7 @@ func (m *PriorityLevelConfigurationCondition) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4330,10 +4291,7 @@ func (m *PriorityLevelConfigurationList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4415,10 +4373,7 @@ func (m *PriorityLevelConfigurationReference) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4536,10 +4491,7 @@ func (m *PriorityLevelConfigurationSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4623,10 +4575,7 @@ func (m *PriorityLevelConfigurationStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4733,10 +4682,7 @@ func (m *QueuingConfiguration) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4934,10 +4880,7 @@ func (m *ResourcePolicyRule) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5051,10 +4994,7 @@ func (m *ServiceAccountSubject) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5244,10 +5184,7 @@ func (m *Subject) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5329,10 +5266,7 @@ func (m *UserSubject) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/api/flowcontrol/v1beta1/BUILD b/vendor/k8s.io/api/flowcontrol/v1beta1/BUILD deleted file mode 100644 index 7e6e6a1a8fca..000000000000 --- a/vendor/k8s.io/api/flowcontrol/v1beta1/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - "zz_generated.prerelease-lifecycle.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/api/flowcontrol/v1beta1", - importpath = "k8s.io/api/flowcontrol/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/flowcontrol/v1beta1/generated.pb.go b/vendor/k8s.io/api/flowcontrol/v1beta1/generated.pb.go index 5a0c7556065d..cb06fe5e77bc 100644 --- a/vendor/k8s.io/api/flowcontrol/v1beta1/generated.pb.go +++ b/vendor/k8s.io/api/flowcontrol/v1beta1/generated.pb.go @@ -2513,10 +2513,7 @@ func (m *FlowDistinguisherMethod) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2665,10 +2662,7 @@ func (m *FlowSchema) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2879,10 +2873,7 @@ func (m *FlowSchemaCondition) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2999,10 +2990,7 @@ func (m *FlowSchemaList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3174,10 +3162,7 @@ func (m *FlowSchemaSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3261,10 +3246,7 @@ func (m *FlowSchemaStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3346,10 +3328,7 @@ func (m *GroupSubject) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3467,10 +3446,7 @@ func (m *LimitResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3572,10 +3548,7 @@ func (m *LimitedPriorityLevelConfiguration) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3689,10 +3662,7 @@ func (m *NonResourcePolicyRule) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3844,10 +3814,7 @@ func (m *PolicyRulesWithSubjects) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3996,10 +3963,7 @@ func (m *PriorityLevelConfiguration) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4210,10 +4174,7 @@ func (m *PriorityLevelConfigurationCondition) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4330,10 +4291,7 @@ func (m *PriorityLevelConfigurationList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4415,10 +4373,7 @@ func (m *PriorityLevelConfigurationReference) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4536,10 +4491,7 @@ func (m *PriorityLevelConfigurationSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4623,10 +4575,7 @@ func (m *PriorityLevelConfigurationStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4733,10 +4682,7 @@ func (m *QueuingConfiguration) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4934,10 +4880,7 @@ func (m *ResourcePolicyRule) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5051,10 +4994,7 @@ func (m *ServiceAccountSubject) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5244,10 +5184,7 @@ func (m *Subject) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5329,10 +5266,7 @@ func (m *UserSubject) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/api/imagepolicy/v1alpha1/BUILD b/vendor/k8s.io/api/imagepolicy/v1alpha1/BUILD deleted file mode 100644 index 80da701e80ba..000000000000 --- a/vendor/k8s.io/api/imagepolicy/v1alpha1/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/api/imagepolicy/v1alpha1", - importpath = "k8s.io/api/imagepolicy/v1alpha1", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/api/imagepolicy/v1alpha1/generated.pb.go b/vendor/k8s.io/api/imagepolicy/v1alpha1/generated.pb.go index e5688513e2c5..1d7bb7990442 100644 --- a/vendor/k8s.io/api/imagepolicy/v1alpha1/generated.pb.go +++ b/vendor/k8s.io/api/imagepolicy/v1alpha1/generated.pb.go @@ -719,10 +719,7 @@ func (m *ImageReview) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -804,10 +801,7 @@ func (m *ImageReviewContainerSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1001,7 +995,7 @@ func (m *ImageReviewSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -1050,10 +1044,7 @@ func (m *ImageReviewSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1265,7 +1256,7 @@ func (m *ImageReviewStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -1282,10 +1273,7 @@ func (m *ImageReviewStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/api/networking/v1/BUILD b/vendor/k8s.io/api/networking/v1/BUILD deleted file mode 100644 index 4064c41e8f38..000000000000 --- a/vendor/k8s.io/api/networking/v1/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/api/networking/v1", - importpath = "k8s.io/api/networking/v1", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/api/networking/v1/generated.pb.go b/vendor/k8s.io/api/networking/v1/generated.pb.go index 4e03b54381d8..719861b96ca5 100644 --- a/vendor/k8s.io/api/networking/v1/generated.pb.go +++ b/vendor/k8s.io/api/networking/v1/generated.pb.go @@ -244,10 +244,38 @@ func (m *IngressClassList) XXX_DiscardUnknown() { var xxx_messageInfo_IngressClassList proto.InternalMessageInfo +func (m *IngressClassParametersReference) Reset() { *m = IngressClassParametersReference{} } +func (*IngressClassParametersReference) ProtoMessage() {} +func (*IngressClassParametersReference) Descriptor() ([]byte, []int) { + return fileDescriptor_1c72867a70a7cc90, []int{7} +} +func (m *IngressClassParametersReference) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *IngressClassParametersReference) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *IngressClassParametersReference) XXX_Merge(src proto.Message) { + xxx_messageInfo_IngressClassParametersReference.Merge(m, src) +} +func (m *IngressClassParametersReference) XXX_Size() int { + return m.Size() +} +func (m *IngressClassParametersReference) XXX_DiscardUnknown() { + xxx_messageInfo_IngressClassParametersReference.DiscardUnknown(m) +} + +var xxx_messageInfo_IngressClassParametersReference proto.InternalMessageInfo + func (m *IngressClassSpec) Reset() { *m = IngressClassSpec{} } func (*IngressClassSpec) ProtoMessage() {} func (*IngressClassSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_1c72867a70a7cc90, []int{7} + return fileDescriptor_1c72867a70a7cc90, []int{8} } func (m *IngressClassSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -275,7 +303,7 @@ var xxx_messageInfo_IngressClassSpec proto.InternalMessageInfo func (m *IngressList) Reset() { *m = IngressList{} } func (*IngressList) ProtoMessage() {} func (*IngressList) Descriptor() ([]byte, []int) { - return fileDescriptor_1c72867a70a7cc90, []int{8} + return fileDescriptor_1c72867a70a7cc90, []int{9} } func (m *IngressList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -303,7 +331,7 @@ var xxx_messageInfo_IngressList proto.InternalMessageInfo func (m *IngressRule) Reset() { *m = IngressRule{} } func (*IngressRule) ProtoMessage() {} func (*IngressRule) Descriptor() ([]byte, []int) { - return fileDescriptor_1c72867a70a7cc90, []int{9} + return fileDescriptor_1c72867a70a7cc90, []int{10} } func (m *IngressRule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -331,7 +359,7 @@ var xxx_messageInfo_IngressRule proto.InternalMessageInfo func (m *IngressRuleValue) Reset() { *m = IngressRuleValue{} } func (*IngressRuleValue) ProtoMessage() {} func (*IngressRuleValue) Descriptor() ([]byte, []int) { - return fileDescriptor_1c72867a70a7cc90, []int{10} + return fileDescriptor_1c72867a70a7cc90, []int{11} } func (m *IngressRuleValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -359,7 +387,7 @@ var xxx_messageInfo_IngressRuleValue proto.InternalMessageInfo func (m *IngressServiceBackend) Reset() { *m = IngressServiceBackend{} } func (*IngressServiceBackend) ProtoMessage() {} func (*IngressServiceBackend) Descriptor() ([]byte, []int) { - return fileDescriptor_1c72867a70a7cc90, []int{11} + return fileDescriptor_1c72867a70a7cc90, []int{12} } func (m *IngressServiceBackend) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -387,7 +415,7 @@ var xxx_messageInfo_IngressServiceBackend proto.InternalMessageInfo func (m *IngressSpec) Reset() { *m = IngressSpec{} } func (*IngressSpec) ProtoMessage() {} func (*IngressSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_1c72867a70a7cc90, []int{12} + return fileDescriptor_1c72867a70a7cc90, []int{13} } func (m *IngressSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -415,7 +443,7 @@ var xxx_messageInfo_IngressSpec proto.InternalMessageInfo func (m *IngressStatus) Reset() { *m = IngressStatus{} } func (*IngressStatus) ProtoMessage() {} func (*IngressStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_1c72867a70a7cc90, []int{13} + return fileDescriptor_1c72867a70a7cc90, []int{14} } func (m *IngressStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -443,7 +471,7 @@ var xxx_messageInfo_IngressStatus proto.InternalMessageInfo func (m *IngressTLS) Reset() { *m = IngressTLS{} } func (*IngressTLS) ProtoMessage() {} func (*IngressTLS) Descriptor() ([]byte, []int) { - return fileDescriptor_1c72867a70a7cc90, []int{14} + return fileDescriptor_1c72867a70a7cc90, []int{15} } func (m *IngressTLS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -471,7 +499,7 @@ var xxx_messageInfo_IngressTLS proto.InternalMessageInfo func (m *NetworkPolicy) Reset() { *m = NetworkPolicy{} } func (*NetworkPolicy) ProtoMessage() {} func (*NetworkPolicy) Descriptor() ([]byte, []int) { - return fileDescriptor_1c72867a70a7cc90, []int{15} + return fileDescriptor_1c72867a70a7cc90, []int{16} } func (m *NetworkPolicy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -499,7 +527,7 @@ var xxx_messageInfo_NetworkPolicy proto.InternalMessageInfo func (m *NetworkPolicyEgressRule) Reset() { *m = NetworkPolicyEgressRule{} } func (*NetworkPolicyEgressRule) ProtoMessage() {} func (*NetworkPolicyEgressRule) Descriptor() ([]byte, []int) { - return fileDescriptor_1c72867a70a7cc90, []int{16} + return fileDescriptor_1c72867a70a7cc90, []int{17} } func (m *NetworkPolicyEgressRule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -527,7 +555,7 @@ var xxx_messageInfo_NetworkPolicyEgressRule proto.InternalMessageInfo func (m *NetworkPolicyIngressRule) Reset() { *m = NetworkPolicyIngressRule{} } func (*NetworkPolicyIngressRule) ProtoMessage() {} func (*NetworkPolicyIngressRule) Descriptor() ([]byte, []int) { - return fileDescriptor_1c72867a70a7cc90, []int{17} + return fileDescriptor_1c72867a70a7cc90, []int{18} } func (m *NetworkPolicyIngressRule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -555,7 +583,7 @@ var xxx_messageInfo_NetworkPolicyIngressRule proto.InternalMessageInfo func (m *NetworkPolicyList) Reset() { *m = NetworkPolicyList{} } func (*NetworkPolicyList) ProtoMessage() {} func (*NetworkPolicyList) Descriptor() ([]byte, []int) { - return fileDescriptor_1c72867a70a7cc90, []int{18} + return fileDescriptor_1c72867a70a7cc90, []int{19} } func (m *NetworkPolicyList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -583,7 +611,7 @@ var xxx_messageInfo_NetworkPolicyList proto.InternalMessageInfo func (m *NetworkPolicyPeer) Reset() { *m = NetworkPolicyPeer{} } func (*NetworkPolicyPeer) ProtoMessage() {} func (*NetworkPolicyPeer) Descriptor() ([]byte, []int) { - return fileDescriptor_1c72867a70a7cc90, []int{19} + return fileDescriptor_1c72867a70a7cc90, []int{20} } func (m *NetworkPolicyPeer) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -611,7 +639,7 @@ var xxx_messageInfo_NetworkPolicyPeer proto.InternalMessageInfo func (m *NetworkPolicyPort) Reset() { *m = NetworkPolicyPort{} } func (*NetworkPolicyPort) ProtoMessage() {} func (*NetworkPolicyPort) Descriptor() ([]byte, []int) { - return fileDescriptor_1c72867a70a7cc90, []int{20} + return fileDescriptor_1c72867a70a7cc90, []int{21} } func (m *NetworkPolicyPort) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -639,7 +667,7 @@ var xxx_messageInfo_NetworkPolicyPort proto.InternalMessageInfo func (m *NetworkPolicySpec) Reset() { *m = NetworkPolicySpec{} } func (*NetworkPolicySpec) ProtoMessage() {} func (*NetworkPolicySpec) Descriptor() ([]byte, []int) { - return fileDescriptor_1c72867a70a7cc90, []int{21} + return fileDescriptor_1c72867a70a7cc90, []int{22} } func (m *NetworkPolicySpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -667,7 +695,7 @@ var xxx_messageInfo_NetworkPolicySpec proto.InternalMessageInfo func (m *ServiceBackendPort) Reset() { *m = ServiceBackendPort{} } func (*ServiceBackendPort) ProtoMessage() {} func (*ServiceBackendPort) Descriptor() ([]byte, []int) { - return fileDescriptor_1c72867a70a7cc90, []int{22} + return fileDescriptor_1c72867a70a7cc90, []int{23} } func (m *ServiceBackendPort) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -700,6 +728,7 @@ func init() { proto.RegisterType((*IngressBackend)(nil), "k8s.io.api.networking.v1.IngressBackend") proto.RegisterType((*IngressClass)(nil), "k8s.io.api.networking.v1.IngressClass") proto.RegisterType((*IngressClassList)(nil), "k8s.io.api.networking.v1.IngressClassList") + proto.RegisterType((*IngressClassParametersReference)(nil), "k8s.io.api.networking.v1.IngressClassParametersReference") proto.RegisterType((*IngressClassSpec)(nil), "k8s.io.api.networking.v1.IngressClassSpec") proto.RegisterType((*IngressList)(nil), "k8s.io.api.networking.v1.IngressList") proto.RegisterType((*IngressRule)(nil), "k8s.io.api.networking.v1.IngressRule") @@ -723,98 +752,104 @@ func init() { } var fileDescriptor_1c72867a70a7cc90 = []byte{ - // 1441 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x57, 0xcd, 0x6f, 0x1b, 0x45, - 0x1b, 0xcf, 0x3a, 0x71, 0xec, 0x8c, 0xd3, 0x34, 0x9d, 0xb7, 0xd5, 0x6b, 0xf5, 0xd5, 0x6b, 0xe7, - 0x5d, 0xbd, 0xb4, 0x81, 0xd2, 0x35, 0x71, 0x2b, 0xc4, 0x0d, 0xd8, 0xf4, 0x2b, 0xe0, 0x26, 0xd6, - 0xd8, 0x2a, 0x02, 0x51, 0xd4, 0xf1, 0x7a, 0x62, 0x6f, 0xbd, 0xde, 0x59, 0x66, 0xc7, 0xa1, 0xbd, - 0x71, 0xe1, 0xc0, 0x8d, 0x7f, 0x81, 0x03, 0x37, 0x6e, 0x70, 0x43, 0x50, 0xb8, 0xa0, 0x1e, 0x7b, - 0xec, 0xc9, 0xa2, 0xe6, 0xbf, 0xc8, 0x09, 0xcd, 0xec, 0xec, 0xa7, 0x63, 0x6c, 0xaa, 0x2a, 0x27, - 0x7b, 0x9f, 0x8f, 0xdf, 0xf3, 0x39, 0xcf, 0x33, 0x03, 0xde, 0x1f, 0xbc, 0xe3, 0x1b, 0x36, 0xad, - 0x0d, 0x46, 0x1d, 0xc2, 0x5c, 0xc2, 0x89, 0x5f, 0x3b, 0x22, 0x6e, 0x97, 0xb2, 0x9a, 0x62, 0x60, - 0xcf, 0xae, 0xb9, 0x84, 0x7f, 0x41, 0xd9, 0xc0, 0x76, 0x7b, 0xb5, 0xa3, 0x9d, 0x5a, 0x8f, 0xb8, - 0x84, 0x61, 0x4e, 0xba, 0x86, 0xc7, 0x28, 0xa7, 0xb0, 0x1c, 0x48, 0x1a, 0xd8, 0xb3, 0x8d, 0x58, - 0xd2, 0x38, 0xda, 0xb9, 0x78, 0xb5, 0x67, 0xf3, 0xfe, 0xa8, 0x63, 0x58, 0x74, 0x58, 0xeb, 0xd1, - 0x1e, 0xad, 0x49, 0x85, 0xce, 0xe8, 0x50, 0x7e, 0xc9, 0x0f, 0xf9, 0x2f, 0x00, 0xba, 0xa8, 0x27, - 0x4c, 0x5a, 0x94, 0x91, 0x13, 0x8c, 0x5d, 0xbc, 0x1e, 0xcb, 0x0c, 0xb1, 0xd5, 0xb7, 0x5d, 0xc2, - 0x1e, 0xd7, 0xbc, 0x41, 0x4f, 0x10, 0xfc, 0xda, 0x90, 0x70, 0x7c, 0x92, 0x56, 0x6d, 0x96, 0x16, - 0x1b, 0xb9, 0xdc, 0x1e, 0x92, 0x29, 0x85, 0xb7, 0xe7, 0x29, 0xf8, 0x56, 0x9f, 0x0c, 0xf1, 0x94, - 0xde, 0xb5, 0x59, 0x7a, 0x23, 0x6e, 0x3b, 0x35, 0xdb, 0xe5, 0x3e, 0x67, 0x59, 0x25, 0xfd, 0x17, - 0x0d, 0x9c, 0xbd, 0xd3, 0x6e, 0x37, 0xf7, 0xdc, 0x1e, 0x23, 0xbe, 0xdf, 0xc4, 0xbc, 0x0f, 0xb7, - 0xc0, 0x8a, 0x87, 0x79, 0xbf, 0xac, 0x6d, 0x69, 0xdb, 0x6b, 0xe6, 0xfa, 0xd3, 0x71, 0x75, 0x69, - 0x32, 0xae, 0xae, 0x08, 0x1e, 0x92, 0x1c, 0x78, 0x1d, 0x14, 0xc5, 0x6f, 0xfb, 0xb1, 0x47, 0xca, - 0xcb, 0x52, 0xaa, 0x3c, 0x19, 0x57, 0x8b, 0x4d, 0x45, 0x3b, 0x4e, 0xfc, 0x47, 0x91, 0x24, 0x6c, - 0x81, 0x42, 0x07, 0x5b, 0x03, 0xe2, 0x76, 0xcb, 0xb9, 0x2d, 0x6d, 0xbb, 0x54, 0xdf, 0x36, 0x66, - 0x95, 0xcf, 0x50, 0xfe, 0x98, 0x81, 0xbc, 0x79, 0x56, 0x39, 0x51, 0x50, 0x04, 0x14, 0x22, 0xe9, - 0x87, 0xe0, 0x7c, 0xc2, 0x7f, 0x34, 0x72, 0xc8, 0x3d, 0xec, 0x8c, 0x08, 0xdc, 0x07, 0x79, 0x61, - 0xd8, 0x2f, 0x6b, 0x5b, 0xcb, 0xdb, 0xa5, 0xfa, 0xeb, 0xb3, 0x4d, 0x65, 0xc2, 0x37, 0xcf, 0x28, - 0x5b, 0x79, 0xf1, 0xe5, 0xa3, 0x00, 0x46, 0x3f, 0x00, 0x85, 0xbd, 0xa6, 0xe9, 0x50, 0x6b, 0x20, - 0xf2, 0x63, 0xd9, 0x5d, 0x96, 0xcd, 0xcf, 0xee, 0xde, 0x0d, 0x84, 0x24, 0x07, 0xea, 0x60, 0x95, - 0x3c, 0xb2, 0x88, 0xc7, 0xcb, 0xb9, 0xad, 0xe5, 0xed, 0x35, 0x13, 0x4c, 0xc6, 0xd5, 0xd5, 0x9b, - 0x92, 0x82, 0x14, 0x47, 0xff, 0x2a, 0x07, 0x0a, 0xca, 0x2c, 0x7c, 0x00, 0x8a, 0xa2, 0x7d, 0xba, - 0x98, 0x63, 0x89, 0x5a, 0xaa, 0xbf, 0x95, 0xf0, 0x37, 0xaa, 0xa6, 0xe1, 0x0d, 0x7a, 0x82, 0xe0, - 0x1b, 0x42, 0x5a, 0xf8, 0x7e, 0xd0, 0x79, 0x48, 0x2c, 0x7e, 0x97, 0x70, 0x6c, 0x42, 0xe5, 0x07, - 0x88, 0x69, 0x28, 0x42, 0x85, 0xb7, 0xc1, 0x8a, 0xef, 0x11, 0x4b, 0x25, 0xfe, 0xb5, 0xb9, 0x89, - 0x6f, 0x79, 0xc4, 0x8a, 0x43, 0x13, 0x5f, 0x48, 0x02, 0xc0, 0x03, 0xb0, 0xea, 0x73, 0xcc, 0x47, - 0xbe, 0x2c, 0x7c, 0xa9, 0x7e, 0x79, 0x3e, 0x94, 0x14, 0x37, 0x37, 0x14, 0xd8, 0x6a, 0xf0, 0x8d, - 0x14, 0x8c, 0xfe, 0x9b, 0x06, 0x36, 0xd2, 0xd5, 0x86, 0xf7, 0x40, 0xc1, 0x27, 0xec, 0xc8, 0xb6, - 0x48, 0x79, 0x45, 0x1a, 0xa9, 0xcd, 0x37, 0x12, 0xc8, 0x87, 0xfd, 0x52, 0x12, 0xbd, 0xa2, 0x68, - 0x28, 0x04, 0x83, 0x1f, 0x81, 0x22, 0x23, 0x3e, 0x1d, 0x31, 0x8b, 0x28, 0xef, 0xaf, 0x26, 0x81, - 0xc5, 0xb9, 0x17, 0x90, 0xa2, 0x59, 0xbb, 0x0d, 0x6a, 0x61, 0x27, 0x48, 0x25, 0x22, 0x87, 0x84, - 0x11, 0xd7, 0x22, 0xe6, 0xba, 0xe8, 0x72, 0xa4, 0x20, 0x50, 0x04, 0x26, 0x4e, 0xd1, 0xba, 0x72, - 0x64, 0xd7, 0xc1, 0xa7, 0x52, 0xd0, 0x46, 0xaa, 0xa0, 0x6f, 0xcc, 0x4d, 0x90, 0xf4, 0x6b, 0x56, - 0x55, 0xf5, 0x9f, 0x35, 0xb0, 0x99, 0x14, 0x6c, 0xd8, 0x3e, 0x87, 0x9f, 0x4e, 0x05, 0x61, 0x2c, - 0x16, 0x84, 0xd0, 0x96, 0x21, 0x6c, 0x2a, 0x53, 0xc5, 0x90, 0x92, 0x08, 0xe0, 0x43, 0x90, 0xb7, - 0x39, 0x19, 0xfa, 0xf2, 0x88, 0x94, 0xea, 0x97, 0x16, 0x8b, 0x20, 0x3e, 0x9d, 0x7b, 0x42, 0x19, - 0x05, 0x18, 0xfa, 0x77, 0x19, 0xff, 0x45, 0x68, 0xb0, 0x0e, 0x80, 0x45, 0x5d, 0xce, 0xa8, 0xe3, - 0x90, 0xf0, 0xb4, 0x46, 0x49, 0xdd, 0x8d, 0x38, 0x28, 0x21, 0x05, 0xef, 0x03, 0xe0, 0x61, 0x86, - 0x87, 0x84, 0x13, 0xe6, 0xab, 0xe4, 0xfe, 0xc3, 0x26, 0xd9, 0x10, 0xf0, 0xcd, 0x08, 0x04, 0x25, - 0x00, 0xf5, 0x1f, 0x34, 0x50, 0x52, 0x7e, 0x9e, 0x42, 0x8a, 0x6f, 0xa5, 0x53, 0xfc, 0xbf, 0xf9, - 0xe3, 0xf6, 0xe4, 0xec, 0x7e, 0x1b, 0x7b, 0x2d, 0x06, 0xac, 0x18, 0x80, 0x7d, 0xea, 0xf3, 0xec, - 0x00, 0xbc, 0x43, 0x7d, 0x8e, 0x24, 0x07, 0x7a, 0x60, 0xd3, 0xce, 0x4c, 0xe4, 0x85, 0x3b, 0x35, - 0xd2, 0x30, 0xcb, 0x0a, 0x79, 0x33, 0xcb, 0x41, 0x53, 0xe8, 0xfa, 0x03, 0x30, 0x25, 0x25, 0xce, - 0x48, 0x9f, 0x73, 0xef, 0x84, 0xcc, 0xce, 0x5e, 0x01, 0xb1, 0xf5, 0xa2, 0x8c, 0xa9, 0xdd, 0x6e, - 0x22, 0x89, 0xa2, 0x7f, 0xad, 0x81, 0x0b, 0x27, 0x4e, 0x1b, 0x91, 0x0f, 0x17, 0x0f, 0x49, 0x36, - 0x1f, 0xfb, 0x78, 0x48, 0x90, 0xe4, 0xc0, 0x7d, 0xb0, 0xe2, 0x51, 0xc6, 0x55, 0x0e, 0xde, 0x9c, - 0xed, 0x49, 0x1a, 0xb9, 0x49, 0x19, 0x4f, 0x2c, 0x60, 0xca, 0x38, 0x92, 0x38, 0xfa, 0xef, 0xb9, - 0xa8, 0x22, 0xb2, 0xd5, 0xdf, 0x8b, 0xf2, 0x2d, 0xdb, 0x5f, 0x58, 0x96, 0xa3, 0x73, 0xcd, 0x3c, - 0x9f, 0xc8, 0x5f, 0xc4, 0x43, 0x53, 0xd2, 0xb0, 0x0b, 0x36, 0xba, 0xe4, 0x10, 0x8f, 0x1c, 0xae, - 0x6c, 0xab, 0xac, 0x2d, 0xbe, 0xa3, 0xe1, 0x64, 0x5c, 0xdd, 0xb8, 0x91, 0xc2, 0x40, 0x19, 0x4c, - 0xb8, 0x0b, 0x96, 0xb9, 0x13, 0xf6, 0xe3, 0xff, 0xe7, 0x42, 0xb7, 0x1b, 0x2d, 0xb3, 0xa4, 0xc2, - 0x5f, 0x6e, 0x37, 0x5a, 0x48, 0x68, 0xc3, 0x0f, 0x40, 0x9e, 0x8d, 0x1c, 0x22, 0x36, 0xd0, 0xf2, - 0x42, 0xcb, 0x4c, 0xd4, 0x34, 0x6e, 0x6d, 0xf1, 0xe5, 0xa3, 0x00, 0x42, 0xff, 0x1c, 0x9c, 0x49, - 0xad, 0x29, 0xf8, 0x00, 0xac, 0x3b, 0x14, 0x77, 0x4d, 0xec, 0x60, 0xd7, 0x52, 0x63, 0x23, 0x33, - 0x9d, 0xc2, 0x11, 0xd0, 0x48, 0xc8, 0xa9, 0x25, 0x77, 0x5e, 0x19, 0x59, 0x4f, 0xf2, 0x50, 0x0a, - 0x51, 0xc7, 0x00, 0xc4, 0xe1, 0xc1, 0x2a, 0xc8, 0x8b, 0x13, 0x13, 0xdc, 0x53, 0xd6, 0xcc, 0x35, - 0xe1, 0xa1, 0x38, 0x48, 0x3e, 0x0a, 0xe8, 0x62, 0x8a, 0xf9, 0xc4, 0x62, 0x84, 0xcb, 0xa2, 0xe6, - 0xd2, 0x53, 0xac, 0x15, 0x71, 0x50, 0x42, 0x4a, 0xff, 0x55, 0x03, 0x67, 0xf6, 0x83, 0x4c, 0x34, - 0xa9, 0x63, 0x5b, 0x8f, 0x4f, 0x61, 0x21, 0xdd, 0x4d, 0x2d, 0xa4, 0x2b, 0xb3, 0x8b, 0x92, 0x72, - 0x6c, 0xe6, 0x46, 0xfa, 0x51, 0x03, 0xff, 0x4e, 0x49, 0xde, 0x8c, 0xe7, 0x4f, 0x13, 0xe4, 0xc5, - 0x29, 0x08, 0xef, 0x76, 0x8b, 0xda, 0x92, 0xa7, 0x29, 0xbe, 0xdd, 0x09, 0x04, 0x14, 0x00, 0xc1, - 0xdb, 0x20, 0xc7, 0xa9, 0x6a, 0xcb, 0x85, 0xe1, 0x08, 0x61, 0x26, 0x50, 0x70, 0xb9, 0x36, 0x45, - 0x39, 0x4e, 0xf5, 0x9f, 0x34, 0x50, 0x4e, 0x49, 0x25, 0xe7, 0xe6, 0xab, 0xf7, 0xfb, 0x2e, 0x58, - 0x39, 0x64, 0x74, 0xf8, 0x32, 0x9e, 0x47, 0x49, 0xbf, 0xc5, 0xe8, 0x10, 0x49, 0x18, 0xfd, 0x89, - 0x06, 0xce, 0xa5, 0x24, 0x4f, 0x61, 0x49, 0x35, 0xd2, 0x4b, 0xea, 0xf2, 0x82, 0x31, 0xcc, 0x58, - 0x55, 0x4f, 0x72, 0x99, 0x08, 0x44, 0xac, 0xf0, 0x10, 0x94, 0x3c, 0xda, 0x6d, 0x11, 0x87, 0x58, - 0x9c, 0x86, 0x67, 0xfa, 0xda, 0x82, 0x41, 0xe0, 0x0e, 0x71, 0x42, 0x55, 0xf3, 0xec, 0x64, 0x5c, - 0x2d, 0x35, 0x63, 0x2c, 0x94, 0x04, 0x86, 0x8f, 0xc0, 0x39, 0x31, 0xee, 0x7d, 0x0f, 0x5b, 0x24, - 0xb2, 0x96, 0x7b, 0x79, 0x6b, 0x17, 0x26, 0xe3, 0xea, 0xb9, 0xfd, 0x2c, 0x22, 0x9a, 0x36, 0x02, - 0xef, 0x80, 0x82, 0xed, 0xc9, 0xe7, 0x89, 0xba, 0xd9, 0xfe, 0xdd, 0xb2, 0x0f, 0xde, 0x31, 0xc1, - 0x25, 0x59, 0x7d, 0xa0, 0x50, 0x5d, 0xff, 0x3e, 0xdb, 0x03, 0xa2, 0xe1, 0xe0, 0x6d, 0x50, 0x94, - 0x0f, 0x46, 0x8b, 0x3a, 0x6a, 0xcd, 0x5d, 0x91, 0x2f, 0x3e, 0x45, 0x3b, 0x1e, 0x57, 0xff, 0x33, - 0xfd, 0x82, 0x36, 0x42, 0x36, 0x8a, 0x94, 0x33, 0x9b, 0x70, 0xf6, 0x10, 0x12, 0x8f, 0x56, 0x23, - 0x78, 0xb4, 0x1a, 0x7b, 0x2e, 0x3f, 0x60, 0x2d, 0xce, 0x6c, 0xb7, 0x17, 0x6c, 0xe5, 0xc4, 0x26, - 0x3c, 0xce, 0x16, 0x5c, 0xee, 0xc3, 0x87, 0xaf, 0xac, 0xe0, 0xff, 0x52, 0x6d, 0x36, 0xbb, 0xe8, - 0xf7, 0x41, 0x41, 0x6d, 0x53, 0xd5, 0xc2, 0xf5, 0x05, 0x5b, 0x38, 0xb9, 0x9d, 0xa2, 0x07, 0x6e, - 0x48, 0x0c, 0x31, 0xe1, 0xc7, 0x60, 0x95, 0x04, 0xe8, 0xc1, 0xba, 0xdb, 0x59, 0x10, 0x3d, 0x9e, - 0x97, 0xf1, 0xd3, 0x4b, 0xd1, 0x14, 0x20, 0x7c, 0x57, 0x64, 0x49, 0xc8, 0x8a, 0xcb, 0xac, 0x5f, - 0x5e, 0x91, 0x1b, 0xe8, 0xbf, 0x41, 0xb0, 0x11, 0xf9, 0x58, 0xdc, 0x66, 0xa3, 0x4f, 0x94, 0xd4, - 0xd0, 0x3f, 0x03, 0x70, 0xfa, 0xc2, 0xb2, 0xc0, 0x75, 0xe8, 0x12, 0x58, 0x75, 0x47, 0xc3, 0x0e, - 0x09, 0x0e, 0x47, 0x3e, 0x76, 0x70, 0x5f, 0x52, 0x91, 0xe2, 0x9a, 0xdb, 0x4f, 0x5f, 0x54, 0x96, - 0x9e, 0xbd, 0xa8, 0x2c, 0x3d, 0x7f, 0x51, 0x59, 0xfa, 0x72, 0x52, 0xd1, 0x9e, 0x4e, 0x2a, 0xda, - 0xb3, 0x49, 0x45, 0x7b, 0x3e, 0xa9, 0x68, 0x7f, 0x4c, 0x2a, 0xda, 0x37, 0x7f, 0x56, 0x96, 0x3e, - 0xc9, 0x1d, 0xed, 0xfc, 0x15, 0x00, 0x00, 0xff, 0xff, 0xc5, 0x87, 0xf6, 0x28, 0x4c, 0x12, 0x00, - 0x00, + // 1545 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x58, 0xcd, 0x6f, 0x1b, 0x45, + 0x1b, 0xcf, 0x3a, 0x71, 0xec, 0x3c, 0x4e, 0xd2, 0x74, 0xde, 0x56, 0xaf, 0xd5, 0x57, 0xaf, 0x1d, + 0x56, 0xb4, 0x0d, 0x94, 0xda, 0x24, 0xad, 0x10, 0x9c, 0xa0, 0x9b, 0xb6, 0x69, 0x68, 0x9a, 0x58, + 0x63, 0xab, 0x08, 0x04, 0xa8, 0x93, 0xf5, 0xc4, 0xd9, 0x7a, 0xbd, 0xb3, 0xcc, 0x8e, 0x43, 0x7b, + 0xe3, 0xc2, 0x81, 0x1b, 0xff, 0x02, 0x7f, 0x02, 0x82, 0x1b, 0x82, 0xc2, 0x05, 0xf5, 0x58, 0x89, + 0x4b, 0x2f, 0x58, 0xd4, 0xfc, 0x17, 0x39, 0xa1, 0x99, 0x9d, 0xfd, 0xb0, 0x1d, 0x63, 0xab, 0xaa, + 0x72, 0x8a, 0xf7, 0xf9, 0xf8, 0x3d, 0x1f, 0xf3, 0x7c, 0xcc, 0x04, 0x6e, 0xb4, 0xdf, 0x0d, 0x2a, + 0x0e, 0xab, 0xb6, 0xbb, 0xfb, 0x94, 0x7b, 0x54, 0xd0, 0xa0, 0x7a, 0x44, 0xbd, 0x26, 0xe3, 0x55, + 0xcd, 0x20, 0xbe, 0x53, 0xf5, 0xa8, 0xf8, 0x92, 0xf1, 0xb6, 0xe3, 0xb5, 0xaa, 0x47, 0xeb, 0xd5, + 0x16, 0xf5, 0x28, 0x27, 0x82, 0x36, 0x2b, 0x3e, 0x67, 0x82, 0xa1, 0x62, 0x28, 0x59, 0x21, 0xbe, + 0x53, 0x49, 0x24, 0x2b, 0x47, 0xeb, 0x17, 0xae, 0xb6, 0x1c, 0x71, 0xd8, 0xdd, 0xaf, 0xd8, 0xac, + 0x53, 0x6d, 0xb1, 0x16, 0xab, 0x2a, 0x85, 0xfd, 0xee, 0x81, 0xfa, 0x52, 0x1f, 0xea, 0x57, 0x08, + 0x74, 0xc1, 0x4c, 0x99, 0xb4, 0x19, 0xa7, 0x27, 0x18, 0xbb, 0x70, 0x3d, 0x91, 0xe9, 0x10, 0xfb, + 0xd0, 0xf1, 0x28, 0x7f, 0x5c, 0xf5, 0xdb, 0x2d, 0x49, 0x08, 0xaa, 0x1d, 0x2a, 0xc8, 0x49, 0x5a, + 0xd5, 0x71, 0x5a, 0xbc, 0xeb, 0x09, 0xa7, 0x43, 0x47, 0x14, 0xde, 0x99, 0xa4, 0x10, 0xd8, 0x87, + 0xb4, 0x43, 0x46, 0xf4, 0xae, 0x8d, 0xd3, 0xeb, 0x0a, 0xc7, 0xad, 0x3a, 0x9e, 0x08, 0x04, 0x1f, + 0x56, 0x32, 0x7f, 0x31, 0xe0, 0xcc, 0x9d, 0x46, 0xa3, 0xb6, 0xed, 0xb5, 0x38, 0x0d, 0x82, 0x1a, + 0x11, 0x87, 0x68, 0x15, 0xe6, 0x7c, 0x22, 0x0e, 0x8b, 0xc6, 0xaa, 0xb1, 0xb6, 0x60, 0x2d, 0x3e, + 0xed, 0x95, 0x67, 0xfa, 0xbd, 0xf2, 0x9c, 0xe4, 0x61, 0xc5, 0x41, 0xd7, 0x21, 0x2f, 0xff, 0x36, + 0x1e, 0xfb, 0xb4, 0x38, 0xab, 0xa4, 0x8a, 0xfd, 0x5e, 0x39, 0x5f, 0xd3, 0xb4, 0xe3, 0xd4, 0x6f, + 0x1c, 0x4b, 0xa2, 0x3a, 0xe4, 0xf6, 0x89, 0xdd, 0xa6, 0x5e, 0xb3, 0x98, 0x59, 0x35, 0xd6, 0x0a, + 0x1b, 0x6b, 0x95, 0x71, 0xc7, 0x57, 0xd1, 0xfe, 0x58, 0xa1, 0xbc, 0x75, 0x46, 0x3b, 0x91, 0xd3, + 0x04, 0x1c, 0x21, 0x99, 0x07, 0x70, 0x2e, 0xe5, 0x3f, 0xee, 0xba, 0xf4, 0x3e, 0x71, 0xbb, 0x14, + 0xed, 0x42, 0x56, 0x1a, 0x0e, 0x8a, 0xc6, 0xea, 0xec, 0x5a, 0x61, 0xe3, 0x8d, 0xf1, 0xa6, 0x86, + 0xc2, 0xb7, 0x96, 0xb4, 0xad, 0xac, 0xfc, 0x0a, 0x70, 0x08, 0x63, 0xee, 0x41, 0x6e, 0xbb, 0x66, + 0xb9, 0xcc, 0x6e, 0xcb, 0xfc, 0xd8, 0x4e, 0x93, 0x0f, 0xe7, 0x67, 0x73, 0xfb, 0x26, 0xc6, 0x8a, + 0x83, 0x4c, 0x98, 0xa7, 0x8f, 0x6c, 0xea, 0x8b, 0x62, 0x66, 0x75, 0x76, 0x6d, 0xc1, 0x82, 0x7e, + 0xaf, 0x3c, 0x7f, 0x4b, 0x51, 0xb0, 0xe6, 0x98, 0x5f, 0x67, 0x20, 0xa7, 0xcd, 0xa2, 0x07, 0x90, + 0x97, 0xe5, 0xd3, 0x24, 0x82, 0x28, 0xd4, 0xc2, 0xc6, 0xdb, 0x29, 0x7f, 0xe3, 0xd3, 0xac, 0xf8, + 0xed, 0x96, 0x24, 0x04, 0x15, 0x29, 0x2d, 0x7d, 0xdf, 0xdb, 0x7f, 0x48, 0x6d, 0x71, 0x8f, 0x0a, + 0x62, 0x21, 0xed, 0x07, 0x24, 0x34, 0x1c, 0xa3, 0xa2, 0x2d, 0x98, 0x0b, 0x7c, 0x6a, 0xeb, 0xc4, + 0x5f, 0x9c, 0x98, 0xf8, 0xba, 0x4f, 0xed, 0x24, 0x34, 0xf9, 0x85, 0x15, 0x00, 0xda, 0x83, 0xf9, + 0x40, 0x10, 0xd1, 0x0d, 0xd4, 0xc1, 0x17, 0x36, 0x2e, 0x4f, 0x86, 0x52, 0xe2, 0xd6, 0xb2, 0x06, + 0x9b, 0x0f, 0xbf, 0xb1, 0x86, 0x31, 0x7f, 0x33, 0x60, 0x79, 0xf0, 0xb4, 0xd1, 0x7d, 0xc8, 0x05, + 0x94, 0x1f, 0x39, 0x36, 0x2d, 0xce, 0x29, 0x23, 0xd5, 0xc9, 0x46, 0x42, 0xf9, 0xa8, 0x5e, 0x0a, + 0xb2, 0x56, 0x34, 0x0d, 0x47, 0x60, 0xe8, 0x23, 0xc8, 0x73, 0x1a, 0xb0, 0x2e, 0xb7, 0xa9, 0xf6, + 0xfe, 0x6a, 0x1a, 0x58, 0xf6, 0xbd, 0x84, 0x94, 0xc5, 0xda, 0xdc, 0x61, 0x36, 0x71, 0xc3, 0x54, + 0x62, 0x7a, 0x40, 0x39, 0xf5, 0x6c, 0x6a, 0x2d, 0xca, 0x2a, 0xc7, 0x1a, 0x02, 0xc7, 0x60, 0xb2, + 0x8b, 0x16, 0xb5, 0x23, 0x9b, 0x2e, 0x39, 0x95, 0x03, 0xdd, 0x19, 0x38, 0xd0, 0x37, 0x27, 0x26, + 0x48, 0xf9, 0x35, 0xee, 0x54, 0xcd, 0x9f, 0x0d, 0x58, 0x49, 0x0b, 0xee, 0x38, 0x81, 0x40, 0x9f, + 0x8e, 0x04, 0x51, 0x99, 0x2e, 0x08, 0xa9, 0xad, 0x42, 0x58, 0xd1, 0xa6, 0xf2, 0x11, 0x25, 0x15, + 0xc0, 0x5d, 0xc8, 0x3a, 0x82, 0x76, 0x02, 0xd5, 0x22, 0x85, 0x8d, 0x4b, 0xd3, 0x45, 0x90, 0x74, + 0xe7, 0xb6, 0x54, 0xc6, 0x21, 0x86, 0xf9, 0xa7, 0x01, 0xe5, 0xb4, 0x58, 0x8d, 0x70, 0xd2, 0xa1, + 0x82, 0xf2, 0x20, 0x3e, 0x3c, 0xb4, 0x06, 0x79, 0x52, 0xdb, 0xde, 0xe2, 0xac, 0xeb, 0x47, 0xad, + 0x2b, 0x5d, 0xbb, 0xa1, 0x69, 0x38, 0xe6, 0xca, 0x06, 0x6f, 0x3b, 0x7a, 0x4a, 0xa5, 0x1a, 0xfc, + 0xae, 0xe3, 0x35, 0xb1, 0xe2, 0x48, 0x09, 0x8f, 0x74, 0xa2, 0xe1, 0x17, 0x4b, 0xec, 0x92, 0x0e, + 0xc5, 0x8a, 0x83, 0xca, 0x90, 0x0d, 0x6c, 0xe6, 0x87, 0x15, 0xbc, 0x60, 0x2d, 0x48, 0x97, 0xeb, + 0x92, 0x80, 0x43, 0x3a, 0xba, 0x02, 0x0b, 0x52, 0x30, 0xf0, 0x89, 0x4d, 0x8b, 0x59, 0x25, 0xb4, + 0xd4, 0xef, 0x95, 0x17, 0x76, 0x23, 0x22, 0x4e, 0xf8, 0xe6, 0xf7, 0x43, 0xe7, 0x23, 0x8f, 0x0e, + 0x6d, 0x00, 0xd8, 0xcc, 0x13, 0x9c, 0xb9, 0x2e, 0x8d, 0xa6, 0x51, 0x5c, 0x34, 0x9b, 0x31, 0x07, + 0xa7, 0xa4, 0x90, 0x03, 0xe0, 0xc7, 0xb9, 0xd1, 0xc5, 0xf3, 0xde, 0x74, 0xa9, 0x3f, 0x21, 0xa7, + 0xd6, 0xb2, 0x34, 0x95, 0x62, 0xa4, 0xc0, 0xcd, 0x1f, 0x0c, 0x28, 0x68, 0xfd, 0x53, 0x28, 0xa7, + 0xdb, 0x83, 0xe5, 0xf4, 0xda, 0xe4, 0xd5, 0x72, 0x72, 0x25, 0x7d, 0x97, 0x78, 0x2d, 0x97, 0x89, + 0x3c, 0xe9, 0x43, 0x16, 0x88, 0xe1, 0x61, 0x7f, 0x87, 0x05, 0x02, 0x2b, 0x0e, 0xf2, 0x61, 0xc5, + 0x19, 0xda, 0x3e, 0x53, 0x77, 0x65, 0xac, 0x61, 0x15, 0x35, 0xf2, 0xca, 0x30, 0x07, 0x8f, 0xa0, + 0x9b, 0x0f, 0x60, 0x44, 0x4a, 0xce, 0x83, 0x43, 0x21, 0xfc, 0x13, 0x32, 0x3b, 0x7e, 0xdd, 0x25, + 0xd6, 0xf3, 0x2a, 0xa6, 0x46, 0xa3, 0x86, 0x15, 0x8a, 0xf9, 0x8d, 0x01, 0xe7, 0x4f, 0x9c, 0xac, + 0x71, 0xe5, 0x1b, 0x63, 0x2b, 0x7f, 0x17, 0xe6, 0x7c, 0xc6, 0x85, 0xce, 0xc1, 0x5b, 0xe3, 0x3d, + 0x19, 0x44, 0xae, 0x31, 0x2e, 0x52, 0x97, 0x0d, 0xc6, 0x05, 0x56, 0x38, 0xe6, 0xef, 0x99, 0xf8, + 0x44, 0x54, 0xd9, 0x7f, 0x10, 0xe7, 0x5b, 0x95, 0xa5, 0xb4, 0xac, 0x9b, 0xec, 0x5c, 0x2a, 0x7f, + 0x31, 0x0f, 0x8f, 0x48, 0xa3, 0x26, 0x2c, 0x37, 0xe9, 0x01, 0xe9, 0xba, 0x42, 0xdb, 0xd6, 0x59, + 0x9b, 0xfe, 0x3e, 0x82, 0xfa, 0xbd, 0xf2, 0xf2, 0xcd, 0x01, 0x0c, 0x3c, 0x84, 0x89, 0x36, 0x61, + 0x56, 0xb8, 0x51, 0x3d, 0xbe, 0x3e, 0x11, 0xba, 0xb1, 0x53, 0xb7, 0x0a, 0x3a, 0xfc, 0xd9, 0xc6, + 0x4e, 0x1d, 0x4b, 0x6d, 0xf4, 0x21, 0x64, 0x79, 0xd7, 0xa5, 0x72, 0xdb, 0xce, 0x4e, 0xb5, 0xb8, + 0xe5, 0x99, 0x26, 0xa5, 0x2d, 0xbf, 0x02, 0x1c, 0x42, 0x98, 0x5f, 0xc0, 0xd2, 0xc0, 0x4a, 0x46, + 0x0f, 0x60, 0xd1, 0x65, 0xa4, 0x69, 0x11, 0x97, 0x78, 0xb6, 0x1e, 0x21, 0x43, 0x93, 0x38, 0xda, + 0x89, 0x3b, 0x29, 0x39, 0xbd, 0xd0, 0xcf, 0x69, 0x23, 0x8b, 0x69, 0x1e, 0x1e, 0x40, 0x34, 0x09, + 0x40, 0x12, 0x9e, 0x9c, 0x89, 0xb2, 0x63, 0xc2, 0x3b, 0x99, 0x9e, 0x89, 0xb2, 0x91, 0x02, 0x1c, + 0xd2, 0xe5, 0x44, 0x0b, 0xa8, 0xcd, 0xa9, 0x50, 0x87, 0x9a, 0x19, 0x9c, 0x68, 0xf5, 0x98, 0x83, + 0x53, 0x52, 0xe6, 0xaf, 0x06, 0x2c, 0xed, 0x86, 0x99, 0xa8, 0x31, 0xd7, 0xb1, 0x1f, 0x9f, 0xc2, + 0xf2, 0xbd, 0x37, 0xb0, 0x7c, 0xaf, 0x8c, 0x3f, 0x94, 0x01, 0xc7, 0xc6, 0x6e, 0xdf, 0x1f, 0x0d, + 0xf8, 0xef, 0x80, 0xe4, 0xad, 0x64, 0xfe, 0xd4, 0x20, 0x2b, 0xbb, 0x20, 0xba, 0xc7, 0x4e, 0x6b, + 0x4b, 0x75, 0x53, 0x72, 0x93, 0x95, 0x08, 0x38, 0x04, 0x42, 0x5b, 0x90, 0x11, 0x4c, 0x97, 0xe5, + 0xd4, 0x70, 0x94, 0x72, 0x0b, 0x34, 0x5c, 0xa6, 0xc1, 0x70, 0x46, 0x30, 0xf3, 0x27, 0x03, 0x8a, + 0x03, 0x52, 0xe9, 0xb9, 0xf9, 0xea, 0xfd, 0xbe, 0x07, 0x73, 0x07, 0x9c, 0x75, 0x5e, 0xc6, 0xf3, + 0x38, 0xe9, 0xb7, 0x39, 0xeb, 0x60, 0x05, 0x63, 0x3e, 0x31, 0xe0, 0xec, 0x80, 0xe4, 0x29, 0x2c, + 0xa9, 0x9d, 0xc1, 0x25, 0x75, 0x79, 0xca, 0x18, 0xc6, 0xac, 0xaa, 0x27, 0x99, 0xa1, 0x08, 0x64, + 0xac, 0xe8, 0x00, 0x0a, 0x3e, 0x6b, 0xd6, 0xa9, 0x4b, 0x6d, 0xc1, 0xa2, 0x9e, 0xbe, 0x36, 0x65, + 0x10, 0x64, 0x9f, 0xba, 0x91, 0xaa, 0x75, 0xa6, 0xdf, 0x2b, 0x17, 0x6a, 0x09, 0x16, 0x4e, 0x03, + 0xa3, 0x47, 0x70, 0x36, 0xbe, 0x9f, 0xc4, 0xd6, 0x32, 0x2f, 0x6f, 0xed, 0x7c, 0xbf, 0x57, 0x3e, + 0xbb, 0x3b, 0x8c, 0x88, 0x47, 0x8d, 0xa0, 0x3b, 0x90, 0x73, 0x7c, 0xf5, 0x14, 0xd3, 0xb7, 0xf8, + 0x7f, 0x5b, 0xf6, 0xe1, 0x9b, 0x2d, 0x7c, 0x10, 0xe8, 0x0f, 0x1c, 0xa9, 0x9b, 0x7f, 0x0c, 0xd7, + 0x80, 0x2c, 0x38, 0xb4, 0x05, 0x79, 0xf5, 0x38, 0xb6, 0x99, 0xab, 0xd7, 0xdc, 0x15, 0xf5, 0xba, + 0xd5, 0xb4, 0xe3, 0x5e, 0xf9, 0x7f, 0xa3, 0xff, 0x2d, 0xa8, 0x44, 0x6c, 0x1c, 0x2b, 0x0f, 0x6d, + 0xc2, 0xf1, 0x43, 0x48, 0x3e, 0xd0, 0x2b, 0xe1, 0x03, 0xbd, 0xb2, 0xed, 0x89, 0x3d, 0x5e, 0x17, + 0xdc, 0xf1, 0x5a, 0xe1, 0x56, 0x4e, 0x36, 0x21, 0xba, 0x08, 0x39, 0xbd, 0x28, 0x55, 0xe0, 0xd9, + 0x30, 0xaa, 0x5b, 0x21, 0x09, 0x47, 0x3c, 0xf3, 0x78, 0xb8, 0x2e, 0xd4, 0xda, 0x7c, 0xf8, 0xca, + 0xea, 0xe2, 0x3f, 0xba, 0x1a, 0xc7, 0xd7, 0xc6, 0x67, 0x90, 0xd3, 0x4b, 0x57, 0x57, 0xfa, 0xc6, + 0x94, 0x95, 0x9e, 0x5e, 0x62, 0xf1, 0x9b, 0x3f, 0x22, 0x46, 0x98, 0xe8, 0x63, 0x98, 0xa7, 0x21, + 0x7a, 0xb8, 0x15, 0xd7, 0xa7, 0x44, 0x4f, 0xc6, 0x6a, 0xf2, 0x1a, 0xd5, 0x34, 0x0d, 0x88, 0xde, + 0x97, 0x59, 0x92, 0xb2, 0xf2, 0x11, 0x18, 0x14, 0xe7, 0xd4, 0xa2, 0xfa, 0x7f, 0x18, 0x6c, 0x4c, + 0x3e, 0x96, 0x97, 0xde, 0xf8, 0x13, 0xa7, 0x35, 0xcc, 0xcf, 0x01, 0x8d, 0xde, 0x6b, 0xa6, 0xb8, + 0x35, 0x5d, 0x82, 0x79, 0xaf, 0xdb, 0xd9, 0xa7, 0x61, 0x0f, 0x65, 0x13, 0x07, 0x77, 0x15, 0x15, + 0x6b, 0xae, 0xb5, 0xf6, 0xf4, 0x45, 0x69, 0xe6, 0xd9, 0x8b, 0xd2, 0xcc, 0xf3, 0x17, 0xa5, 0x99, + 0xaf, 0xfa, 0x25, 0xe3, 0x69, 0xbf, 0x64, 0x3c, 0xeb, 0x97, 0x8c, 0xe7, 0xfd, 0x92, 0xf1, 0x57, + 0xbf, 0x64, 0x7c, 0xfb, 0x77, 0x69, 0xe6, 0x93, 0xcc, 0xd1, 0xfa, 0x3f, 0x01, 0x00, 0x00, 0xff, + 0xff, 0xe9, 0x15, 0xcc, 0xab, 0x5f, 0x13, 0x00, 0x00, } func (m *HTTPIngressPath) Marshal() (dAtA []byte, err error) { @@ -1126,6 +1161,60 @@ func (m *IngressClassList) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *IngressClassParametersReference) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *IngressClassParametersReference) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *IngressClassParametersReference) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Namespace != nil { + i -= len(*m.Namespace) + copy(dAtA[i:], *m.Namespace) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.Namespace))) + i-- + dAtA[i] = 0x2a + } + if m.Scope != nil { + i -= len(*m.Scope) + copy(dAtA[i:], *m.Scope) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.Scope))) + i-- + dAtA[i] = 0x22 + } + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0x1a + i -= len(m.Kind) + copy(dAtA[i:], m.Kind) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Kind))) + i-- + dAtA[i] = 0x12 + if m.APIGroup != nil { + i -= len(*m.APIGroup) + copy(dAtA[i:], *m.APIGroup) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.APIGroup))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *IngressClassSpec) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1735,6 +1824,11 @@ func (m *NetworkPolicyPort) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.EndPort != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.EndPort)) + i-- + dAtA[i] = 0x18 + } if m.Port != nil { { size, err := m.Port.MarshalToSizedBuffer(dAtA[:i]) @@ -1980,6 +2074,31 @@ func (m *IngressClassList) Size() (n int) { return n } +func (m *IngressClassParametersReference) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.APIGroup != nil { + l = len(*m.APIGroup) + n += 1 + l + sovGenerated(uint64(l)) + } + l = len(m.Kind) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + if m.Scope != nil { + l = len(*m.Scope) + n += 1 + l + sovGenerated(uint64(l)) + } + if m.Namespace != nil { + l = len(*m.Namespace) + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + func (m *IngressClassSpec) Size() (n int) { if m == nil { return 0 @@ -2215,6 +2334,9 @@ func (m *NetworkPolicyPort) Size() (n int) { l = m.Port.Size() n += 1 + l + sovGenerated(uint64(l)) } + if m.EndPort != nil { + n += 1 + sovGenerated(uint64(*m.EndPort)) + } return n } @@ -2353,13 +2475,27 @@ func (this *IngressClassList) String() string { }, "") return s } +func (this *IngressClassParametersReference) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&IngressClassParametersReference{`, + `APIGroup:` + valueToStringGenerated(this.APIGroup) + `,`, + `Kind:` + fmt.Sprintf("%v", this.Kind) + `,`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Scope:` + valueToStringGenerated(this.Scope) + `,`, + `Namespace:` + valueToStringGenerated(this.Namespace) + `,`, + `}`, + }, "") + return s +} func (this *IngressClassSpec) String() string { if this == nil { return "nil" } s := strings.Join([]string{`&IngressClassSpec{`, `Controller:` + fmt.Sprintf("%v", this.Controller) + `,`, - `Parameters:` + strings.Replace(fmt.Sprintf("%v", this.Parameters), "TypedLocalObjectReference", "v11.TypedLocalObjectReference", 1) + `,`, + `Parameters:` + strings.Replace(this.Parameters.String(), "IngressClassParametersReference", "IngressClassParametersReference", 1) + `,`, `}`, }, "") return s @@ -2544,6 +2680,7 @@ func (this *NetworkPolicyPort) String() string { s := strings.Join([]string{`&NetworkPolicyPort{`, `Protocol:` + valueToStringGenerated(this.Protocol) + `,`, `Port:` + strings.Replace(fmt.Sprintf("%v", this.Port), "IntOrString", "intstr.IntOrString", 1) + `,`, + `EndPort:` + valueToStringGenerated(this.EndPort) + `,`, `}`, }, "") return s @@ -2723,10 +2860,7 @@ func (m *HTTPIngressPath) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2810,10 +2944,7 @@ func (m *HTTPIngressRuleValue) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2927,10 +3058,7 @@ func (m *IPBlock) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3079,10 +3207,7 @@ func (m *Ingress) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3204,10 +3329,7 @@ func (m *IngressBackend) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3323,10 +3445,7 @@ func (m *IngressClass) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3443,10 +3562,220 @@ func (m *IngressClassList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *IngressClassParametersReference) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: IngressClassParametersReference: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: IngressClassParametersReference: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field APIGroup", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { return ErrInvalidLengthGenerated } - if (iNdEx + skippy) < 0 { + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.APIGroup = &s + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Kind", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Kind = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Scope", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Scope = &s + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Namespace", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Namespace = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3552,7 +3881,7 @@ func (m *IngressClassSpec) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.Parameters == nil { - m.Parameters = &v11.TypedLocalObjectReference{} + m.Parameters = &IngressClassParametersReference{} } if err := m.Parameters.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -3564,10 +3893,7 @@ func (m *IngressClassSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3684,10 +4010,7 @@ func (m *IngressList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3802,10 +4125,7 @@ func (m *IngressRule) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3891,10 +4211,7 @@ func (m *IngressRuleValue) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4009,10 +4326,7 @@ func (m *IngressServiceBackend) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4199,10 +4513,7 @@ func (m *IngressSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4285,10 +4596,7 @@ func (m *IngressStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4402,10 +4710,7 @@ func (m *IngressTLS) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4521,10 +4826,7 @@ func (m *NetworkPolicy) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4642,10 +4944,7 @@ func (m *NetworkPolicyEgressRule) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4763,10 +5062,7 @@ func (m *NetworkPolicyIngressRule) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4883,10 +5179,7 @@ func (m *NetworkPolicyList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5044,10 +5337,7 @@ func (m *NetworkPolicyPeer) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5160,16 +5450,33 @@ func (m *NetworkPolicyPort) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field EndPort", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.EndPort = &v default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5352,10 +5659,7 @@ func (m *NetworkPolicySpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5456,10 +5760,7 @@ func (m *ServiceBackendPort) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/api/networking/v1/generated.proto b/vendor/k8s.io/api/networking/v1/generated.proto index 74737098b984..8f23477d8fbc 100644 --- a/vendor/k8s.io/api/networking/v1/generated.proto +++ b/vendor/k8s.io/api/networking/v1/generated.proto @@ -150,6 +150,36 @@ message IngressClassList { repeated IngressClass items = 2; } +// IngressClassParametersReference identifies an API object. This can be used +// to specify a cluster or namespace-scoped resource. +message IngressClassParametersReference { + // APIGroup is the group for the resource being referenced. If APIGroup is + // not specified, the specified Kind must be in the core API group. For any + // other third-party types, APIGroup is required. + // +optional + optional string aPIGroup = 1; + + // Kind is the type of resource being referenced. + optional string kind = 2; + + // Name is the name of resource being referenced. + optional string name = 3; + + // Scope represents if this refers to a cluster or namespace scoped resource. + // This may be set to "Cluster" (default) or "Namespace". + // Field can be enabled with IngressClassNamespacedParams feature gate. + // +optional + // +featureGate=IngressClassNamespacedParams + optional string scope = 4; + + // Namespace is the namespace of the resource being referenced. This field is + // required when scope is set to "Namespace" and must be unset when scope is set to + // "Cluster". + // +optional + // +featureGate=IngressClassNamespacedParams + optional string namespace = 5; +} + // IngressClassSpec provides information about the class of an Ingress. message IngressClassSpec { // Controller refers to the name of the controller that should handle this @@ -164,7 +194,7 @@ message IngressClassSpec { // configuration for the controller. This is optional if the controller does // not require extra parameters. // +optional - optional k8s.io.api.core.v1.TypedLocalObjectReference parameters = 2; + optional IngressClassParametersReference parameters = 2; } // IngressList is a collection of Ingress. @@ -398,10 +428,21 @@ message NetworkPolicyPort { // +optional optional string protocol = 1; - // The port on the given protocol. This can either be a numerical or named port on - // a pod. If this field is not provided, this matches all port names and numbers. + // The port on the given protocol. This can either be a numerical or named + // port on a pod. If this field is not provided, this matches all port names and + // numbers. + // If present, only traffic on the specified protocol AND port will be matched. // +optional optional k8s.io.apimachinery.pkg.util.intstr.IntOrString port = 2; + + // If set, indicates that the range of ports from port to endPort, inclusive, + // should be allowed by the policy. This field cannot be defined if the port field + // is not defined or if the port field is defined as a named (string) port. + // The endPort must be equal or greater than port. + // This feature is in Alpha state and should be enabled using the Feature Gate + // "NetworkPolicyEndPort". + // +optional + optional int32 endPort = 3; } // NetworkPolicySpec provides the specification of a NetworkPolicy @@ -435,7 +476,7 @@ message NetworkPolicySpec { repeated NetworkPolicyEgressRule egress = 3; // List of rule types that the NetworkPolicy relates to. - // Valid options are "Ingress", "Egress", or "Ingress,Egress". + // Valid options are ["Ingress"], ["Egress"], or ["Ingress", "Egress"]. // If this field is not specified, it will default based on the existence of Ingress or Egress rules; // policies that contain an Egress section are assumed to affect Egress, and all policies // (whether or not they contain an Ingress section) are assumed to affect Ingress. diff --git a/vendor/k8s.io/api/networking/v1/types.go b/vendor/k8s.io/api/networking/v1/types.go index df2569089c7a..6cc210b8940f 100644 --- a/vendor/k8s.io/api/networking/v1/types.go +++ b/vendor/k8s.io/api/networking/v1/types.go @@ -17,7 +17,7 @@ limitations under the License. package v1 import ( - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/intstr" ) @@ -38,7 +38,7 @@ type NetworkPolicy struct { Spec NetworkPolicySpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"` } -// Policy Type string describes the NetworkPolicy type +// PolicyType string describes the NetworkPolicy type // This type is beta-level in 1.8 type PolicyType string @@ -80,7 +80,7 @@ type NetworkPolicySpec struct { Egress []NetworkPolicyEgressRule `json:"egress,omitempty" protobuf:"bytes,3,rep,name=egress"` // List of rule types that the NetworkPolicy relates to. - // Valid options are "Ingress", "Egress", or "Ingress,Egress". + // Valid options are ["Ingress"], ["Egress"], or ["Ingress", "Egress"]. // If this field is not specified, it will default based on the existence of Ingress or Egress rules; // policies that contain an Egress section are assumed to affect Egress, and all policies // (whether or not they contain an Ingress section) are assumed to affect Ingress. @@ -141,10 +141,21 @@ type NetworkPolicyPort struct { // +optional Protocol *v1.Protocol `json:"protocol,omitempty" protobuf:"bytes,1,opt,name=protocol,casttype=k8s.io/api/core/v1.Protocol"` - // The port on the given protocol. This can either be a numerical or named port on - // a pod. If this field is not provided, this matches all port names and numbers. + // The port on the given protocol. This can either be a numerical or named + // port on a pod. If this field is not provided, this matches all port names and + // numbers. + // If present, only traffic on the specified protocol AND port will be matched. // +optional Port *intstr.IntOrString `json:"port,omitempty" protobuf:"bytes,2,opt,name=port"` + + // If set, indicates that the range of ports from port to endPort, inclusive, + // should be allowed by the policy. This field cannot be defined if the port field + // is not defined or if the port field is defined as a named (string) port. + // The endPort must be equal or greater than port. + // This feature is in Alpha state and should be enabled using the Feature Gate + // "NetworkPolicyEndPort". + // +optional + EndPort *int32 `json:"endPort,omitempty" protobuf:"bytes,3,opt,name=endPort"` } // IPBlock describes a particular CIDR (Ex. "192.168.1.1/24","2001:db9::/64") that is allowed @@ -497,7 +508,42 @@ type IngressClassSpec struct { // configuration for the controller. This is optional if the controller does // not require extra parameters. // +optional - Parameters *v1.TypedLocalObjectReference `json:"parameters,omitempty" protobuf:"bytes,2,opt,name=parameters"` + Parameters *IngressClassParametersReference `json:"parameters,omitempty" protobuf:"bytes,2,opt,name=parameters"` +} + +const ( + // IngressClassParametersReferenceScopeNamespace indicates that the + // referenced Parameters resource is namespace-scoped. + IngressClassParametersReferenceScopeNamespace = "Namespace" + // IngressClassParametersReferenceScopeNamespace indicates that the + // referenced Parameters resource is cluster-scoped. + IngressClassParametersReferenceScopeCluster = "Cluster" +) + +// IngressClassParametersReference identifies an API object. This can be used +// to specify a cluster or namespace-scoped resource. +type IngressClassParametersReference struct { + // APIGroup is the group for the resource being referenced. If APIGroup is + // not specified, the specified Kind must be in the core API group. For any + // other third-party types, APIGroup is required. + // +optional + APIGroup *string `json:"apiGroup,omitempty" protobuf:"bytes,1,opt,name=aPIGroup"` + // Kind is the type of resource being referenced. + Kind string `json:"kind" protobuf:"bytes,2,opt,name=kind"` + // Name is the name of resource being referenced. + Name string `json:"name" protobuf:"bytes,3,opt,name=name"` + // Scope represents if this refers to a cluster or namespace scoped resource. + // This may be set to "Cluster" (default) or "Namespace". + // Field can be enabled with IngressClassNamespacedParams feature gate. + // +optional + // +featureGate=IngressClassNamespacedParams + Scope *string `json:"scope" protobuf:"bytes,4,opt,name=scope"` + // Namespace is the namespace of the resource being referenced. This field is + // required when scope is set to "Namespace" and must be unset when scope is set to + // "Cluster". + // +optional + // +featureGate=IngressClassNamespacedParams + Namespace *string `json:"namespace,omitempty" protobuf:"bytes,5,opt,name=namespace"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object diff --git a/vendor/k8s.io/api/networking/v1/types_swagger_doc_generated.go b/vendor/k8s.io/api/networking/v1/types_swagger_doc_generated.go index 41b9b3fb6bda..88f9a8f130b2 100644 --- a/vendor/k8s.io/api/networking/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/networking/v1/types_swagger_doc_generated.go @@ -98,6 +98,19 @@ func (IngressClassList) SwaggerDoc() map[string]string { return map_IngressClassList } +var map_IngressClassParametersReference = map[string]string{ + "": "IngressClassParametersReference identifies an API object. This can be used to specify a cluster or namespace-scoped resource.", + "apiGroup": "APIGroup is the group for the resource being referenced. If APIGroup is not specified, the specified Kind must be in the core API group. For any other third-party types, APIGroup is required.", + "kind": "Kind is the type of resource being referenced.", + "name": "Name is the name of resource being referenced.", + "scope": "Scope represents if this refers to a cluster or namespace scoped resource. This may be set to \"Cluster\" (default) or \"Namespace\". Field can be enabled with IngressClassNamespacedParams feature gate.", + "namespace": "Namespace is the namespace of the resource being referenced. This field is required when scope is set to \"Namespace\" and must be unset when scope is set to \"Cluster\".", +} + +func (IngressClassParametersReference) SwaggerDoc() map[string]string { + return map_IngressClassParametersReference +} + var map_IngressClassSpec = map[string]string{ "": "IngressClassSpec provides information about the class of an Ingress.", "controller": "Controller refers to the name of the controller that should handle this class. This allows for different \"flavors\" that are controlled by the same controller. For example, you may have different Parameters for the same implementing controller. This should be specified as a domain-prefixed path no more than 250 characters in length, e.g. \"acme.io/ingress-controller\". This field is immutable.", @@ -230,7 +243,8 @@ func (NetworkPolicyPeer) SwaggerDoc() map[string]string { var map_NetworkPolicyPort = map[string]string{ "": "NetworkPolicyPort describes a port to allow traffic on", "protocol": "The protocol (TCP, UDP, or SCTP) which traffic must match. If not specified, this field defaults to TCP.", - "port": "The port on the given protocol. This can either be a numerical or named port on a pod. If this field is not provided, this matches all port names and numbers.", + "port": "The port on the given protocol. This can either be a numerical or named port on a pod. If this field is not provided, this matches all port names and numbers. If present, only traffic on the specified protocol AND port will be matched.", + "endPort": "If set, indicates that the range of ports from port to endPort, inclusive, should be allowed by the policy. This field cannot be defined if the port field is not defined or if the port field is defined as a named (string) port. The endPort must be equal or greater than port. This feature is in Alpha state and should be enabled using the Feature Gate \"NetworkPolicyEndPort\".", } func (NetworkPolicyPort) SwaggerDoc() map[string]string { @@ -242,7 +256,7 @@ var map_NetworkPolicySpec = map[string]string{ "podSelector": "Selects the pods to which this NetworkPolicy object applies. The array of ingress rules is applied to any pods selected by this field. Multiple network policies can select the same set of pods. In this case, the ingress rules for each are combined additively. This field is NOT optional and follows standard label selector semantics. An empty podSelector matches all pods in this namespace.", "ingress": "List of ingress rules to be applied to the selected pods. Traffic is allowed to a pod if there are no NetworkPolicies selecting the pod (and cluster policy otherwise allows the traffic), OR if the traffic source is the pod's local node, OR if the traffic matches at least one ingress rule across all of the NetworkPolicy objects whose podSelector matches the pod. If this field is empty then this NetworkPolicy does not allow any traffic (and serves solely to ensure that the pods it selects are isolated by default)", "egress": "List of egress rules to be applied to the selected pods. Outgoing traffic is allowed if there are no NetworkPolicies selecting the pod (and cluster policy otherwise allows the traffic), OR if the traffic matches at least one egress rule across all of the NetworkPolicy objects whose podSelector matches the pod. If this field is empty then this NetworkPolicy limits all outgoing traffic (and serves solely to ensure that the pods it selects are isolated by default). This field is beta-level in 1.8", - "policyTypes": "List of rule types that the NetworkPolicy relates to. Valid options are \"Ingress\", \"Egress\", or \"Ingress,Egress\". If this field is not specified, it will default based on the existence of Ingress or Egress rules; policies that contain an Egress section are assumed to affect Egress, and all policies (whether or not they contain an Ingress section) are assumed to affect Ingress. If you want to write an egress-only policy, you must explicitly specify policyTypes [ \"Egress\" ]. Likewise, if you want to write a policy that specifies that no egress is allowed, you must specify a policyTypes value that include \"Egress\" (since such a policy would not include an Egress section and would otherwise default to just [ \"Ingress\" ]). This field is beta-level in 1.8", + "policyTypes": "List of rule types that the NetworkPolicy relates to. Valid options are [\"Ingress\"], [\"Egress\"], or [\"Ingress\", \"Egress\"]. If this field is not specified, it will default based on the existence of Ingress or Egress rules; policies that contain an Egress section are assumed to affect Egress, and all policies (whether or not they contain an Ingress section) are assumed to affect Ingress. If you want to write an egress-only policy, you must explicitly specify policyTypes [ \"Egress\" ]. Likewise, if you want to write a policy that specifies that no egress is allowed, you must specify a policyTypes value that include \"Egress\" (since such a policy would not include an Egress section and would otherwise default to just [ \"Ingress\" ]). This field is beta-level in 1.8", } func (NetworkPolicySpec) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/api/networking/v1/zz_generated.deepcopy.go b/vendor/k8s.io/api/networking/v1/zz_generated.deepcopy.go index b17e78927718..76e339aed9eb 100644 --- a/vendor/k8s.io/api/networking/v1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/networking/v1/zz_generated.deepcopy.go @@ -207,12 +207,43 @@ func (in *IngressClassList) DeepCopyObject() runtime.Object { return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *IngressClassParametersReference) DeepCopyInto(out *IngressClassParametersReference) { + *out = *in + if in.APIGroup != nil { + in, out := &in.APIGroup, &out.APIGroup + *out = new(string) + **out = **in + } + if in.Scope != nil { + in, out := &in.Scope, &out.Scope + *out = new(string) + **out = **in + } + if in.Namespace != nil { + in, out := &in.Namespace, &out.Namespace + *out = new(string) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IngressClassParametersReference. +func (in *IngressClassParametersReference) DeepCopy() *IngressClassParametersReference { + if in == nil { + return nil + } + out := new(IngressClassParametersReference) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *IngressClassSpec) DeepCopyInto(out *IngressClassSpec) { *out = *in if in.Parameters != nil { in, out := &in.Parameters, &out.Parameters - *out = new(corev1.TypedLocalObjectReference) + *out = new(IngressClassParametersReference) (*in).DeepCopyInto(*out) } return @@ -558,6 +589,11 @@ func (in *NetworkPolicyPort) DeepCopyInto(out *NetworkPolicyPort) { *out = new(intstr.IntOrString) **out = **in } + if in.EndPort != nil { + in, out := &in.EndPort, &out.EndPort + *out = new(int32) + **out = **in + } return } diff --git a/vendor/k8s.io/api/networking/v1beta1/BUILD b/vendor/k8s.io/api/networking/v1beta1/BUILD deleted file mode 100644 index 5f3cfa193016..000000000000 --- a/vendor/k8s.io/api/networking/v1beta1/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "well_known_annotations.go", - "zz_generated.deepcopy.go", - "zz_generated.prerelease-lifecycle.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/api/networking/v1beta1", - importpath = "k8s.io/api/networking/v1beta1", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/api/networking/v1beta1/generated.pb.go b/vendor/k8s.io/api/networking/v1beta1/generated.pb.go index 6f51df864b9a..cda115147257 100644 --- a/vendor/k8s.io/api/networking/v1beta1/generated.pb.go +++ b/vendor/k8s.io/api/networking/v1beta1/generated.pb.go @@ -212,10 +212,38 @@ func (m *IngressClassList) XXX_DiscardUnknown() { var xxx_messageInfo_IngressClassList proto.InternalMessageInfo +func (m *IngressClassParametersReference) Reset() { *m = IngressClassParametersReference{} } +func (*IngressClassParametersReference) ProtoMessage() {} +func (*IngressClassParametersReference) Descriptor() ([]byte, []int) { + return fileDescriptor_5bea11de0ceb8f53, []int{6} +} +func (m *IngressClassParametersReference) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *IngressClassParametersReference) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *IngressClassParametersReference) XXX_Merge(src proto.Message) { + xxx_messageInfo_IngressClassParametersReference.Merge(m, src) +} +func (m *IngressClassParametersReference) XXX_Size() int { + return m.Size() +} +func (m *IngressClassParametersReference) XXX_DiscardUnknown() { + xxx_messageInfo_IngressClassParametersReference.DiscardUnknown(m) +} + +var xxx_messageInfo_IngressClassParametersReference proto.InternalMessageInfo + func (m *IngressClassSpec) Reset() { *m = IngressClassSpec{} } func (*IngressClassSpec) ProtoMessage() {} func (*IngressClassSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_5bea11de0ceb8f53, []int{6} + return fileDescriptor_5bea11de0ceb8f53, []int{7} } func (m *IngressClassSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -243,7 +271,7 @@ var xxx_messageInfo_IngressClassSpec proto.InternalMessageInfo func (m *IngressList) Reset() { *m = IngressList{} } func (*IngressList) ProtoMessage() {} func (*IngressList) Descriptor() ([]byte, []int) { - return fileDescriptor_5bea11de0ceb8f53, []int{7} + return fileDescriptor_5bea11de0ceb8f53, []int{8} } func (m *IngressList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -271,7 +299,7 @@ var xxx_messageInfo_IngressList proto.InternalMessageInfo func (m *IngressRule) Reset() { *m = IngressRule{} } func (*IngressRule) ProtoMessage() {} func (*IngressRule) Descriptor() ([]byte, []int) { - return fileDescriptor_5bea11de0ceb8f53, []int{8} + return fileDescriptor_5bea11de0ceb8f53, []int{9} } func (m *IngressRule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -299,7 +327,7 @@ var xxx_messageInfo_IngressRule proto.InternalMessageInfo func (m *IngressRuleValue) Reset() { *m = IngressRuleValue{} } func (*IngressRuleValue) ProtoMessage() {} func (*IngressRuleValue) Descriptor() ([]byte, []int) { - return fileDescriptor_5bea11de0ceb8f53, []int{9} + return fileDescriptor_5bea11de0ceb8f53, []int{10} } func (m *IngressRuleValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -327,7 +355,7 @@ var xxx_messageInfo_IngressRuleValue proto.InternalMessageInfo func (m *IngressSpec) Reset() { *m = IngressSpec{} } func (*IngressSpec) ProtoMessage() {} func (*IngressSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_5bea11de0ceb8f53, []int{10} + return fileDescriptor_5bea11de0ceb8f53, []int{11} } func (m *IngressSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -355,7 +383,7 @@ var xxx_messageInfo_IngressSpec proto.InternalMessageInfo func (m *IngressStatus) Reset() { *m = IngressStatus{} } func (*IngressStatus) ProtoMessage() {} func (*IngressStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_5bea11de0ceb8f53, []int{11} + return fileDescriptor_5bea11de0ceb8f53, []int{12} } func (m *IngressStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -383,7 +411,7 @@ var xxx_messageInfo_IngressStatus proto.InternalMessageInfo func (m *IngressTLS) Reset() { *m = IngressTLS{} } func (*IngressTLS) ProtoMessage() {} func (*IngressTLS) Descriptor() ([]byte, []int) { - return fileDescriptor_5bea11de0ceb8f53, []int{12} + return fileDescriptor_5bea11de0ceb8f53, []int{13} } func (m *IngressTLS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -415,6 +443,7 @@ func init() { proto.RegisterType((*IngressBackend)(nil), "k8s.io.api.networking.v1beta1.IngressBackend") proto.RegisterType((*IngressClass)(nil), "k8s.io.api.networking.v1beta1.IngressClass") proto.RegisterType((*IngressClassList)(nil), "k8s.io.api.networking.v1beta1.IngressClassList") + proto.RegisterType((*IngressClassParametersReference)(nil), "k8s.io.api.networking.v1beta1.IngressClassParametersReference") proto.RegisterType((*IngressClassSpec)(nil), "k8s.io.api.networking.v1beta1.IngressClassSpec") proto.RegisterType((*IngressList)(nil), "k8s.io.api.networking.v1beta1.IngressList") proto.RegisterType((*IngressRule)(nil), "k8s.io.api.networking.v1beta1.IngressRule") @@ -429,69 +458,75 @@ func init() { } var fileDescriptor_5bea11de0ceb8f53 = []byte{ - // 990 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x56, 0x4f, 0x6f, 0xe3, 0x44, - 0x14, 0xaf, 0x93, 0x66, 0x9b, 0x4e, 0xb2, 0xdd, 0x6a, 0xe8, 0x21, 0xaa, 0x84, 0x5b, 0xf9, 0x80, - 0xca, 0x9f, 0xda, 0x34, 0xbb, 0x20, 0x8e, 0xc8, 0x2b, 0xa1, 0x56, 0x04, 0x1a, 0x26, 0x16, 0x20, - 0x04, 0xd2, 0x4e, 0x9c, 0xb7, 0x8e, 0x89, 0x63, 0x9b, 0x99, 0x71, 0xd0, 0xde, 0xb8, 0x72, 0x82, - 0x2f, 0x01, 0x9f, 0x81, 0x23, 0x82, 0x4b, 0x8f, 0x7b, 0xdc, 0x53, 0x45, 0xc3, 0xb7, 0xe0, 0x84, - 0x66, 0x3c, 0xb5, 0x9d, 0xa4, 0xa5, 0x59, 0x0e, 0x7b, 0x8a, 0x67, 0xde, 0x7b, 0xbf, 0x37, 0xef, - 0xf7, 0x7e, 0x33, 0x2f, 0xe8, 0xa3, 0xc9, 0x07, 0xdc, 0x0e, 0x13, 0x67, 0x92, 0x0d, 0x81, 0xc5, - 0x20, 0x80, 0x3b, 0x33, 0x88, 0x47, 0x09, 0x73, 0xb4, 0x81, 0xa6, 0xa1, 0x13, 0x83, 0xf8, 0x3e, - 0x61, 0x93, 0x30, 0x0e, 0x9c, 0xd9, 0xc9, 0x10, 0x04, 0x3d, 0x71, 0x02, 0x88, 0x81, 0x51, 0x01, - 0x23, 0x3b, 0x65, 0x89, 0x48, 0xf0, 0xeb, 0xb9, 0xbb, 0x4d, 0xd3, 0xd0, 0x2e, 0xdd, 0x6d, 0xed, - 0xbe, 0x7f, 0x1c, 0x84, 0x62, 0x9c, 0x0d, 0x6d, 0x3f, 0x99, 0x3a, 0x41, 0x12, 0x24, 0x8e, 0x8a, - 0x1a, 0x66, 0x4f, 0xd5, 0x4a, 0x2d, 0xd4, 0x57, 0x8e, 0xb6, 0x6f, 0x55, 0x92, 0xfb, 0x09, 0x03, - 0x67, 0xb6, 0x92, 0x71, 0xff, 0x51, 0xe9, 0x33, 0xa5, 0xfe, 0x38, 0x8c, 0x81, 0x3d, 0x73, 0xd2, - 0x49, 0x20, 0x37, 0xb8, 0x33, 0x05, 0x41, 0x6f, 0x8a, 0x72, 0x6e, 0x8b, 0x62, 0x59, 0x2c, 0xc2, - 0x29, 0xac, 0x04, 0xbc, 0x7f, 0x57, 0x00, 0xf7, 0xc7, 0x30, 0xa5, 0x2b, 0x71, 0x0f, 0x6f, 0x8b, - 0xcb, 0x44, 0x18, 0x39, 0x61, 0x2c, 0xb8, 0x60, 0xcb, 0x41, 0xd6, 0x9f, 0x06, 0x7a, 0x70, 0xea, - 0x79, 0xfd, 0xb3, 0x38, 0x60, 0xc0, 0x79, 0x9f, 0x8a, 0x31, 0x3e, 0x44, 0x9b, 0x29, 0x15, 0xe3, - 0x8e, 0x71, 0x68, 0x1c, 0x6d, 0xbb, 0xed, 0x8b, 0xcb, 0x83, 0x8d, 0xf9, 0xe5, 0xc1, 0xa6, 0xb4, - 0x11, 0x65, 0xc1, 0x8f, 0x50, 0x53, 0xfe, 0x7a, 0xcf, 0x52, 0xe8, 0xd4, 0x95, 0x57, 0x67, 0x7e, - 0x79, 0xd0, 0xec, 0xeb, 0xbd, 0x7f, 0x2a, 0xdf, 0xa4, 0xf0, 0xc4, 0x5f, 0xa2, 0xad, 0x21, 0xf5, - 0x27, 0x10, 0x8f, 0x3a, 0xb5, 0x43, 0xe3, 0xa8, 0xd5, 0x3d, 0xb6, 0xff, 0xb3, 0x87, 0xb6, 0x3e, - 0x94, 0x9b, 0x07, 0xb9, 0x0f, 0xf4, 0x49, 0xb6, 0xf4, 0x06, 0xb9, 0x86, 0xb3, 0x26, 0x68, 0xaf, - 0x52, 0x04, 0xc9, 0x22, 0xf8, 0x9c, 0x46, 0x19, 0xe0, 0x01, 0x6a, 0xc8, 0xec, 0xbc, 0x63, 0x1c, - 0xd6, 0x8f, 0x5a, 0x5d, 0xfb, 0x8e, 0x7c, 0x4b, 0x44, 0xb8, 0xf7, 0x75, 0xc2, 0x86, 0x5c, 0x71, - 0x92, 0x63, 0x59, 0x3f, 0xd5, 0xd0, 0x96, 0xf6, 0xc2, 0x4f, 0x50, 0x53, 0xf6, 0x7d, 0x44, 0x05, - 0x55, 0x74, 0xb5, 0xba, 0xef, 0x56, 0x72, 0x14, 0x6d, 0xb0, 0xd3, 0x49, 0x20, 0x37, 0xb8, 0x2d, - 0xbd, 0xed, 0xd9, 0x89, 0x7d, 0x3e, 0xfc, 0x16, 0x7c, 0xf1, 0x09, 0x08, 0xea, 0x62, 0x9d, 0x05, - 0x95, 0x7b, 0xa4, 0x40, 0xc5, 0x3d, 0xb4, 0xc9, 0x53, 0xf0, 0x35, 0x63, 0x6f, 0xad, 0xc7, 0xd8, - 0x20, 0x05, 0xbf, 0x6c, 0x9c, 0x5c, 0x11, 0x85, 0x82, 0x3d, 0x74, 0x8f, 0x0b, 0x2a, 0x32, 0xae, - 0xda, 0xd6, 0xea, 0xbe, 0xb3, 0x26, 0x9e, 0x8a, 0x71, 0x77, 0x34, 0xe2, 0xbd, 0x7c, 0x4d, 0x34, - 0x96, 0xf5, 0x63, 0x0d, 0xed, 0x2c, 0xf6, 0x0a, 0xbf, 0x87, 0x5a, 0x1c, 0xd8, 0x2c, 0xf4, 0xe1, - 0x53, 0x3a, 0x05, 0x2d, 0xa5, 0xd7, 0x74, 0x7c, 0x6b, 0x50, 0x9a, 0x48, 0xd5, 0x0f, 0x07, 0x45, - 0x58, 0x3f, 0x61, 0x42, 0x17, 0x7d, 0x3b, 0xa5, 0x52, 0xd9, 0x76, 0xae, 0x6c, 0xfb, 0x2c, 0x16, - 0xe7, 0x6c, 0x20, 0x58, 0x18, 0x07, 0x2b, 0x89, 0x24, 0x18, 0xa9, 0x22, 0xe3, 0x2f, 0x50, 0x93, - 0x01, 0x4f, 0x32, 0xe6, 0x83, 0xa6, 0x62, 0x41, 0x8c, 0xf2, 0x09, 0x90, 0x6d, 0x92, 0xba, 0x1d, - 0xf5, 0x12, 0x9f, 0x46, 0x79, 0x73, 0x08, 0x3c, 0x05, 0x06, 0xb1, 0x0f, 0x6e, 0x5b, 0x0a, 0x9e, - 0x68, 0x08, 0x52, 0x80, 0xc9, 0x0b, 0xd5, 0xd6, 0x5c, 0x3c, 0x8e, 0xe8, 0x2b, 0x91, 0xc8, 0x67, - 0x0b, 0x12, 0x71, 0xd6, 0x6b, 0xa9, 0x3a, 0xdc, 0x6d, 0x3a, 0xb1, 0xfe, 0x30, 0xd0, 0x6e, 0xd5, - 0xb1, 0x17, 0x72, 0x81, 0xbf, 0x5e, 0xa9, 0xc4, 0x5e, 0xaf, 0x12, 0x19, 0xad, 0xea, 0xd8, 0xd5, - 0xa9, 0x9a, 0xd7, 0x3b, 0x95, 0x2a, 0xfa, 0xa8, 0x11, 0x0a, 0x98, 0xf2, 0x4e, 0x4d, 0xdd, 0xd5, - 0xb7, 0x5f, 0xa2, 0x8c, 0xf2, 0xa2, 0x9e, 0x49, 0x04, 0x92, 0x03, 0x59, 0xbf, 0x2c, 0x15, 0x21, - 0xeb, 0xc3, 0x5d, 0x84, 0xfc, 0x24, 0x16, 0x2c, 0x89, 0x22, 0x60, 0x5a, 0x97, 0x05, 0xbd, 0x8f, - 0x0b, 0x0b, 0xa9, 0x78, 0xe1, 0x6f, 0x10, 0x4a, 0x29, 0xa3, 0x53, 0x10, 0xc0, 0xf8, 0x4d, 0x6f, - 0xd7, 0xdd, 0x72, 0xd9, 0x91, 0xf0, 0xfd, 0x02, 0x84, 0x54, 0x00, 0xad, 0xdf, 0x0c, 0xd4, 0xd2, - 0xe7, 0x7c, 0x05, 0x3c, 0x7f, 0xbc, 0xc8, 0xf3, 0x1b, 0x6b, 0xbe, 0xc1, 0x37, 0x53, 0xfc, 0x6b, - 0x79, 0x74, 0xf9, 0xea, 0xca, 0xd1, 0x31, 0x4e, 0xb8, 0x58, 0x1e, 0x1d, 0xa7, 0x09, 0x17, 0x44, - 0x59, 0x70, 0x86, 0x76, 0xc3, 0xa5, 0x67, 0xfa, 0xe5, 0x84, 0x5b, 0x84, 0xb9, 0x1d, 0x0d, 0xbf, - 0xbb, 0x6c, 0x21, 0x2b, 0x29, 0x2c, 0x40, 0x2b, 0x5e, 0xf2, 0xde, 0x8c, 0x85, 0x48, 0x35, 0xc7, - 0x0f, 0xd7, 0x1f, 0x0e, 0xe5, 0x11, 0x9a, 0xaa, 0x3a, 0xcf, 0xeb, 0x13, 0x05, 0x65, 0xfd, 0x5e, - 0x2b, 0xf8, 0x50, 0x6a, 0xfb, 0xb0, 0xa8, 0x56, 0x29, 0x50, 0xbd, 0x85, 0x9b, 0x8a, 0x9b, 0xbd, - 0xca, 0xc1, 0x0b, 0x1b, 0x59, 0xf1, 0xc6, 0x5e, 0x39, 0x34, 0x8d, 0xff, 0x33, 0x34, 0x5b, 0x37, - 0x0d, 0x4c, 0x7c, 0x8a, 0xea, 0x22, 0xba, 0x96, 0xc0, 0x9b, 0xeb, 0x21, 0x7a, 0xbd, 0x81, 0xdb, - 0xd2, 0x94, 0xd7, 0xbd, 0xde, 0x80, 0x48, 0x08, 0x7c, 0x8e, 0x1a, 0x2c, 0x8b, 0x40, 0x0e, 0x94, - 0xfa, 0xfa, 0x03, 0x4a, 0x32, 0x58, 0x4a, 0x4a, 0xae, 0x38, 0xc9, 0x71, 0xac, 0xef, 0xd0, 0xfd, - 0x85, 0xa9, 0x83, 0x9f, 0xa0, 0x76, 0x94, 0xd0, 0x91, 0x4b, 0x23, 0x1a, 0xfb, 0xfa, 0xce, 0x2e, - 0xe9, 0xf6, 0xfa, 0xfe, 0xf5, 0x2a, 0x7e, 0x7a, 0x66, 0xed, 0xe9, 0x24, 0xed, 0xaa, 0x8d, 0x2c, - 0x20, 0x5a, 0x14, 0xa1, 0xb2, 0x46, 0x7c, 0x80, 0x1a, 0x52, 0xa9, 0xf9, 0x9f, 0x86, 0x6d, 0x77, - 0x5b, 0x9e, 0x50, 0x0a, 0x98, 0x93, 0x7c, 0x5f, 0x3e, 0x21, 0x1c, 0x7c, 0x06, 0x42, 0xb5, 0xb3, - 0xb6, 0xf8, 0x84, 0x0c, 0x0a, 0x0b, 0xa9, 0x78, 0xb9, 0xc7, 0x17, 0x57, 0xe6, 0xc6, 0xf3, 0x2b, - 0x73, 0xe3, 0xc5, 0x95, 0xb9, 0xf1, 0xc3, 0xdc, 0x34, 0x2e, 0xe6, 0xa6, 0xf1, 0x7c, 0x6e, 0x1a, - 0x2f, 0xe6, 0xa6, 0xf1, 0xd7, 0xdc, 0x34, 0x7e, 0xfe, 0xdb, 0xdc, 0xf8, 0x6a, 0x4b, 0xd3, 0xf4, - 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x6e, 0x54, 0x4d, 0x9d, 0x25, 0x0b, 0x00, 0x00, + // 1085 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x56, 0x41, 0x6f, 0xe3, 0x44, + 0x14, 0xae, 0x93, 0x66, 0x9b, 0x4e, 0xd2, 0x6e, 0x35, 0xf4, 0x10, 0x55, 0x22, 0xa9, 0x7c, 0x40, + 0x85, 0xa5, 0x36, 0xcd, 0x2e, 0x88, 0x13, 0x02, 0xaf, 0x04, 0xad, 0x36, 0x6c, 0xc3, 0x24, 0x02, + 0x84, 0x38, 0xec, 0xc4, 0x79, 0xeb, 0x98, 0x38, 0xb6, 0x99, 0x19, 0x07, 0xed, 0x8d, 0x2b, 0x27, + 0xf8, 0x15, 0xfc, 0x04, 0xc4, 0x11, 0xc1, 0xa5, 0xc7, 0x3d, 0xee, 0x85, 0x8a, 0x86, 0x7f, 0xc1, + 0x09, 0xcd, 0x78, 0x62, 0x3b, 0x49, 0xcb, 0xa6, 0x1c, 0xf6, 0x94, 0xcc, 0x7b, 0xdf, 0x7b, 0x6f, + 0xde, 0x7b, 0xdf, 0xbc, 0x67, 0xf4, 0xf1, 0xf8, 0x7d, 0x6e, 0xf9, 0x91, 0x3d, 0x4e, 0x06, 0xc0, + 0x42, 0x10, 0xc0, 0xed, 0x29, 0x84, 0xc3, 0x88, 0xd9, 0x5a, 0x41, 0x63, 0xdf, 0x0e, 0x41, 0x7c, + 0x17, 0xb1, 0xb1, 0x1f, 0x7a, 0xf6, 0xf4, 0x64, 0x00, 0x82, 0x9e, 0xd8, 0x1e, 0x84, 0xc0, 0xa8, + 0x80, 0xa1, 0x15, 0xb3, 0x48, 0x44, 0xf8, 0xf5, 0x14, 0x6e, 0xd1, 0xd8, 0xb7, 0x72, 0xb8, 0xa5, + 0xe1, 0x07, 0xc7, 0x9e, 0x2f, 0x46, 0xc9, 0xc0, 0x72, 0xa3, 0x89, 0xed, 0x45, 0x5e, 0x64, 0x2b, + 0xab, 0x41, 0xf2, 0x54, 0x9d, 0xd4, 0x41, 0xfd, 0x4b, 0xbd, 0x1d, 0x98, 0x85, 0xe0, 0x6e, 0xc4, + 0xc0, 0x9e, 0xae, 0x44, 0x3c, 0x78, 0x90, 0x63, 0x26, 0xd4, 0x1d, 0xf9, 0x21, 0xb0, 0x67, 0x76, + 0x3c, 0xf6, 0xa4, 0x80, 0xdb, 0x13, 0x10, 0xf4, 0x3a, 0x2b, 0xfb, 0x26, 0x2b, 0x96, 0x84, 0xc2, + 0x9f, 0xc0, 0x8a, 0xc1, 0x7b, 0x2f, 0x33, 0xe0, 0xee, 0x08, 0x26, 0x74, 0xc5, 0xee, 0xfe, 0x4d, + 0x76, 0x89, 0xf0, 0x03, 0xdb, 0x0f, 0x05, 0x17, 0x6c, 0xd9, 0xc8, 0xfc, 0xc3, 0x40, 0x77, 0x4f, + 0xfb, 0xfd, 0xee, 0x59, 0xe8, 0x31, 0xe0, 0xbc, 0x4b, 0xc5, 0x08, 0x1f, 0xa2, 0xcd, 0x98, 0x8a, + 0x51, 0xc3, 0x38, 0x34, 0x8e, 0xb6, 0x9d, 0xfa, 0xc5, 0x65, 0x6b, 0x63, 0x76, 0xd9, 0xda, 0x94, + 0x3a, 0xa2, 0x34, 0xf8, 0x01, 0xaa, 0xca, 0xdf, 0xfe, 0xb3, 0x18, 0x1a, 0x65, 0x85, 0x6a, 0xcc, + 0x2e, 0x5b, 0xd5, 0xae, 0x96, 0xfd, 0x53, 0xf8, 0x4f, 0x32, 0x24, 0xfe, 0x12, 0x6d, 0x0d, 0xa8, + 0x3b, 0x86, 0x70, 0xd8, 0x28, 0x1d, 0x1a, 0x47, 0xb5, 0xf6, 0xb1, 0xf5, 0x9f, 0x3d, 0xb4, 0xf4, + 0xa5, 0x9c, 0xd4, 0xc8, 0xb9, 0xab, 0x6f, 0xb2, 0xa5, 0x05, 0x64, 0xee, 0xce, 0x1c, 0xa3, 0xfd, + 0x42, 0x12, 0x24, 0x09, 0xe0, 0x73, 0x1a, 0x24, 0x80, 0x7b, 0xa8, 0x22, 0xa3, 0xf3, 0x86, 0x71, + 0x58, 0x3e, 0xaa, 0xb5, 0xad, 0x97, 0xc4, 0x5b, 0x2a, 0x84, 0xb3, 0xa3, 0x03, 0x56, 0xe4, 0x89, + 0x93, 0xd4, 0x97, 0xf9, 0x63, 0x09, 0x6d, 0x69, 0x14, 0x7e, 0x82, 0xaa, 0xb2, 0xef, 0x43, 0x2a, + 0xa8, 0x2a, 0x57, 0xad, 0xfd, 0x4e, 0x21, 0x46, 0xd6, 0x06, 0x2b, 0x1e, 0x7b, 0x52, 0xc0, 0x2d, + 0x89, 0xb6, 0xa6, 0x27, 0xd6, 0xf9, 0xe0, 0x1b, 0x70, 0xc5, 0xa7, 0x20, 0xa8, 0x83, 0x75, 0x14, + 0x94, 0xcb, 0x48, 0xe6, 0x15, 0x77, 0xd0, 0x26, 0x8f, 0xc1, 0xd5, 0x15, 0x7b, 0x6b, 0xbd, 0x8a, + 0xf5, 0x62, 0x70, 0xf3, 0xc6, 0xc9, 0x13, 0x51, 0x5e, 0x70, 0x1f, 0xdd, 0xe1, 0x82, 0x8a, 0x84, + 0xab, 0xb6, 0xd5, 0xda, 0x6f, 0xaf, 0xe9, 0x4f, 0xd9, 0x38, 0xbb, 0xda, 0xe3, 0x9d, 0xf4, 0x4c, + 0xb4, 0x2f, 0xf3, 0x87, 0x12, 0xda, 0x5d, 0xec, 0x15, 0x7e, 0x17, 0xd5, 0x38, 0xb0, 0xa9, 0xef, + 0xc2, 0x63, 0x3a, 0x01, 0x4d, 0xa5, 0xd7, 0xb4, 0x7d, 0xad, 0x97, 0xab, 0x48, 0x11, 0x87, 0xbd, + 0xcc, 0xac, 0x1b, 0x31, 0xa1, 0x93, 0xbe, 0xb9, 0xa4, 0x92, 0xd9, 0x56, 0xca, 0x6c, 0xeb, 0x2c, + 0x14, 0xe7, 0xac, 0x27, 0x98, 0x1f, 0x7a, 0x2b, 0x81, 0xa4, 0x33, 0x52, 0xf4, 0x8c, 0xbf, 0x40, + 0x55, 0x06, 0x3c, 0x4a, 0x98, 0x0b, 0xba, 0x14, 0x0b, 0x64, 0x94, 0x23, 0x40, 0xb6, 0x49, 0xf2, + 0x76, 0xd8, 0x89, 0x5c, 0x1a, 0xa4, 0xcd, 0x21, 0xf0, 0x14, 0x18, 0x84, 0x2e, 0x38, 0x75, 0x49, + 0x78, 0xa2, 0x5d, 0x90, 0xcc, 0x99, 0x7c, 0x50, 0x75, 0x5d, 0x8b, 0x87, 0x01, 0x7d, 0x25, 0x14, + 0xf9, 0x6c, 0x81, 0x22, 0xf6, 0x7a, 0x2d, 0x55, 0x97, 0xbb, 0x89, 0x27, 0xe6, 0xef, 0x06, 0xda, + 0x2b, 0x02, 0x3b, 0x3e, 0x17, 0xf8, 0xeb, 0x95, 0x4c, 0xac, 0xf5, 0x32, 0x91, 0xd6, 0x2a, 0x8f, + 0x3d, 0x1d, 0xaa, 0x3a, 0x97, 0x14, 0xb2, 0xe8, 0xa2, 0x8a, 0x2f, 0x60, 0xc2, 0x1b, 0x25, 0xf5, + 0x56, 0xef, 0xdd, 0x22, 0x8d, 0xfc, 0xa1, 0x9e, 0x49, 0x0f, 0x24, 0x75, 0x64, 0xfe, 0x69, 0xa0, + 0x56, 0x11, 0xd6, 0xa5, 0x8c, 0x4e, 0x40, 0x00, 0xe3, 0x59, 0x1b, 0xf1, 0x11, 0xaa, 0xd2, 0xee, + 0xd9, 0x27, 0x2c, 0x4a, 0xe2, 0xf9, 0xbc, 0x93, 0xf7, 0xfb, 0x48, 0xcb, 0x48, 0xa6, 0x95, 0x53, + 0x71, 0xec, 0xeb, 0xd1, 0x55, 0x98, 0x8a, 0x8f, 0xfc, 0x70, 0x48, 0x94, 0x46, 0x22, 0x42, 0x49, + 0xf6, 0xf2, 0x22, 0x42, 0xb1, 0x5c, 0x69, 0x70, 0x0b, 0x55, 0xb8, 0x1b, 0xc5, 0xd0, 0xd8, 0x54, + 0x90, 0x6d, 0x79, 0xe5, 0x9e, 0x14, 0x90, 0x54, 0x8e, 0xef, 0xa1, 0x6d, 0x09, 0xe4, 0x31, 0x75, + 0xa1, 0x51, 0x51, 0xa0, 0x9d, 0xd9, 0x65, 0x6b, 0xfb, 0xf1, 0x5c, 0x48, 0x72, 0xbd, 0xf9, 0xcb, + 0x52, 0x93, 0x64, 0xff, 0x70, 0x1b, 0x21, 0x37, 0x0a, 0x05, 0x8b, 0x82, 0x00, 0x98, 0x4e, 0x29, + 0xa3, 0xcf, 0xc3, 0x4c, 0x43, 0x0a, 0x28, 0x1c, 0x22, 0x14, 0x67, 0xb5, 0xd1, 0x34, 0xfa, 0xe0, + 0x16, 0xf5, 0xbf, 0xa6, 0xb0, 0xce, 0xae, 0x8c, 0x57, 0x50, 0x14, 0x22, 0x98, 0xbf, 0x1a, 0xa8, + 0xa6, 0xed, 0x5f, 0x01, 0xb1, 0x1e, 0x2d, 0x12, 0xeb, 0x8d, 0x35, 0x97, 0xce, 0xf5, 0x9c, 0xfa, + 0x39, 0xbf, 0xba, 0x5c, 0x33, 0xb2, 0xe7, 0xa3, 0x88, 0x8b, 0xe5, 0x5d, 0x79, 0x1a, 0x71, 0x41, + 0x94, 0x06, 0x27, 0x68, 0xcf, 0x5f, 0xda, 0x4b, 0xb7, 0x7b, 0xa9, 0x99, 0x99, 0xd3, 0xd0, 0xee, + 0xf7, 0x96, 0x35, 0x64, 0x25, 0x84, 0x09, 0x68, 0x05, 0x25, 0x07, 0xc5, 0x48, 0x88, 0x58, 0xd7, + 0xf8, 0xfe, 0xfa, 0xdb, 0x30, 0xbf, 0x42, 0x55, 0x65, 0xd7, 0xef, 0x77, 0x89, 0x72, 0x65, 0xfe, + 0x56, 0xca, 0xea, 0xa1, 0xe8, 0xf7, 0x61, 0x96, 0xad, 0x62, 0x86, 0x1a, 0xfe, 0x29, 0xd9, 0xf7, + 0x0b, 0x17, 0xcf, 0x74, 0x64, 0x05, 0x8d, 0xfb, 0xf9, 0x57, 0x82, 0xf1, 0x7f, 0xbe, 0x12, 0x6a, + 0xd7, 0x7d, 0x21, 0xe0, 0x53, 0x54, 0x16, 0xc1, 0x9c, 0x02, 0x6f, 0xae, 0xe7, 0xb1, 0xdf, 0xe9, + 0x39, 0x35, 0x5d, 0xf2, 0x72, 0xbf, 0xd3, 0x23, 0xd2, 0x05, 0x3e, 0x47, 0x15, 0x96, 0x04, 0x20, + 0x37, 0x68, 0x79, 0xfd, 0x8d, 0x2c, 0x2b, 0x98, 0x53, 0x4a, 0x9e, 0x38, 0x49, 0xfd, 0x98, 0xdf, + 0xa2, 0x9d, 0x85, 0x35, 0x8b, 0x9f, 0xa0, 0x7a, 0x10, 0xd1, 0xa1, 0x43, 0x03, 0x1a, 0xba, 0xfa, + 0x11, 0x2f, 0xf1, 0x76, 0xbe, 0x9f, 0x3a, 0x05, 0x9c, 0x5e, 0xd2, 0xfb, 0x3a, 0x48, 0xbd, 0xa8, + 0x23, 0x0b, 0x1e, 0x4d, 0x8a, 0x50, 0x9e, 0xa3, 0x9c, 0x4a, 0x92, 0xa9, 0xe9, 0x57, 0x92, 0x9e, + 0x4a, 0x92, 0xc0, 0x9c, 0xa4, 0x72, 0x39, 0x53, 0x38, 0xb8, 0x0c, 0x84, 0x6a, 0x67, 0x69, 0x71, + 0xa6, 0xf4, 0x32, 0x0d, 0x29, 0xa0, 0x9c, 0xe3, 0x8b, 0xab, 0xe6, 0xc6, 0xf3, 0xab, 0xe6, 0xc6, + 0x8b, 0xab, 0xe6, 0xc6, 0xf7, 0xb3, 0xa6, 0x71, 0x31, 0x6b, 0x1a, 0xcf, 0x67, 0x4d, 0xe3, 0xc5, + 0xac, 0x69, 0xfc, 0x35, 0x6b, 0x1a, 0x3f, 0xfd, 0xdd, 0xdc, 0xf8, 0x6a, 0x4b, 0x97, 0xe9, 0xdf, + 0x00, 0x00, 0x00, 0xff, 0xff, 0x3f, 0x8b, 0x3b, 0x2e, 0x16, 0x0c, 0x00, 0x00, } func (m *HTTPIngressPath) Marshal() (dAtA []byte, err error) { @@ -769,6 +804,60 @@ func (m *IngressClassList) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *IngressClassParametersReference) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *IngressClassParametersReference) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *IngressClassParametersReference) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Namespace != nil { + i -= len(*m.Namespace) + copy(dAtA[i:], *m.Namespace) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.Namespace))) + i-- + dAtA[i] = 0x2a + } + if m.Scope != nil { + i -= len(*m.Scope) + copy(dAtA[i:], *m.Scope) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.Scope))) + i-- + dAtA[i] = 0x22 + } + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0x1a + i -= len(m.Kind) + copy(dAtA[i:], m.Kind) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Kind))) + i-- + dAtA[i] = 0x12 + if m.APIGroup != nil { + i -= len(*m.APIGroup) + copy(dAtA[i:], *m.APIGroup) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.APIGroup))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *IngressClassSpec) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1174,6 +1263,31 @@ func (m *IngressClassList) Size() (n int) { return n } +func (m *IngressClassParametersReference) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.APIGroup != nil { + l = len(*m.APIGroup) + n += 1 + l + sovGenerated(uint64(l)) + } + l = len(m.Kind) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + if m.Scope != nil { + l = len(*m.Scope) + n += 1 + l + sovGenerated(uint64(l)) + } + if m.Namespace != nil { + l = len(*m.Namespace) + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + func (m *IngressClassSpec) Size() (n int) { if m == nil { return 0 @@ -1373,13 +1487,27 @@ func (this *IngressClassList) String() string { }, "") return s } +func (this *IngressClassParametersReference) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&IngressClassParametersReference{`, + `APIGroup:` + valueToStringGenerated(this.APIGroup) + `,`, + `Kind:` + fmt.Sprintf("%v", this.Kind) + `,`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Scope:` + valueToStringGenerated(this.Scope) + `,`, + `Namespace:` + valueToStringGenerated(this.Namespace) + `,`, + `}`, + }, "") + return s +} func (this *IngressClassSpec) String() string { if this == nil { return "nil" } s := strings.Join([]string{`&IngressClassSpec{`, `Controller:` + fmt.Sprintf("%v", this.Controller) + `,`, - `Parameters:` + strings.Replace(fmt.Sprintf("%v", this.Parameters), "TypedLocalObjectReference", "v11.TypedLocalObjectReference", 1) + `,`, + `Parameters:` + strings.Replace(this.Parameters.String(), "IngressClassParametersReference", "IngressClassParametersReference", 1) + `,`, `}`, }, "") return s @@ -1606,10 +1734,7 @@ func (m *HTTPIngressPath) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1693,10 +1818,7 @@ func (m *HTTPIngressRuleValue) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1845,10 +1967,7 @@ func (m *Ingress) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1999,10 +2118,7 @@ func (m *IngressBackend) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2118,10 +2234,7 @@ func (m *IngressClass) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2238,10 +2351,220 @@ func (m *IngressClassList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *IngressClassParametersReference) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: IngressClassParametersReference: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: IngressClassParametersReference: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field APIGroup", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthGenerated } - if (iNdEx + skippy) < 0 { + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.APIGroup = &s + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Kind", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Kind = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Scope", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Scope = &s + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Namespace", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Namespace = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2347,7 +2670,7 @@ func (m *IngressClassSpec) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.Parameters == nil { - m.Parameters = &v11.TypedLocalObjectReference{} + m.Parameters = &IngressClassParametersReference{} } if err := m.Parameters.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -2359,10 +2682,7 @@ func (m *IngressClassSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2479,10 +2799,7 @@ func (m *IngressList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2597,10 +2914,7 @@ func (m *IngressRule) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2686,10 +3000,7 @@ func (m *IngressRuleValue) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2876,10 +3187,7 @@ func (m *IngressSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2962,10 +3270,7 @@ func (m *IngressStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3079,10 +3384,7 @@ func (m *IngressTLS) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/api/networking/v1beta1/generated.proto b/vendor/k8s.io/api/networking/v1beta1/generated.proto index 251bbafecf15..acb6e859cfcf 100644 --- a/vendor/k8s.io/api/networking/v1beta1/generated.proto +++ b/vendor/k8s.io/api/networking/v1beta1/generated.proto @@ -137,6 +137,36 @@ message IngressClassList { repeated IngressClass items = 2; } +// IngressClassParametersReference identifies an API object. This can be used +// to specify a cluster or namespace-scoped resource. +message IngressClassParametersReference { + // APIGroup is the group for the resource being referenced. If APIGroup is + // not specified, the specified Kind must be in the core API group. For any + // other third-party types, APIGroup is required. + // +optional + optional string aPIGroup = 1; + + // Kind is the type of resource being referenced. + optional string kind = 2; + + // Name is the name of resource being referenced. + optional string name = 3; + + // Scope represents if this refers to a cluster or namespace scoped resource. + // This may be set to "Cluster" (default) or "Namespace". + // Field can be enabled with IngressClassNamespacedParams feature gate. + // +optional + // +featureGate=IngressClassNamespacedParams + optional string scope = 4; + + // Namespace is the namespace of the resource being referenced. This field is + // required when scope is set to "Namespace" and must be unset when scope is set to + // "Cluster". + // +optional + // +featureGate=IngressClassNamespacedParams + optional string namespace = 5; +} + // IngressClassSpec provides information about the class of an Ingress. message IngressClassSpec { // Controller refers to the name of the controller that should handle this @@ -151,7 +181,7 @@ message IngressClassSpec { // configuration for the controller. This is optional if the controller does // not require extra parameters. // +optional - optional k8s.io.api.core.v1.TypedLocalObjectReference parameters = 2; + optional IngressClassParametersReference parameters = 2; } // IngressList is a collection of Ingress. diff --git a/vendor/k8s.io/api/networking/v1beta1/types.go b/vendor/k8s.io/api/networking/v1beta1/types.go index ef9bd4d67d67..09279d6938f5 100644 --- a/vendor/k8s.io/api/networking/v1beta1/types.go +++ b/vendor/k8s.io/api/networking/v1beta1/types.go @@ -311,7 +311,42 @@ type IngressClassSpec struct { // configuration for the controller. This is optional if the controller does // not require extra parameters. // +optional - Parameters *v1.TypedLocalObjectReference `json:"parameters,omitempty" protobuf:"bytes,2,opt,name=parameters"` + Parameters *IngressClassParametersReference `json:"parameters,omitempty" protobuf:"bytes,2,opt,name=parameters"` +} + +const ( + // IngressClassParametersReferenceScopeNamespace indicates that the + // referenced Parameters resource is namespace-scoped. + IngressClassParametersReferenceScopeNamespace = "Namespace" + // IngressClassParametersReferenceScopeNamespace indicates that the + // referenced Parameters resource is cluster-scoped. + IngressClassParametersReferenceScopeCluster = "Cluster" +) + +// IngressClassParametersReference identifies an API object. This can be used +// to specify a cluster or namespace-scoped resource. +type IngressClassParametersReference struct { + // APIGroup is the group for the resource being referenced. If APIGroup is + // not specified, the specified Kind must be in the core API group. For any + // other third-party types, APIGroup is required. + // +optional + APIGroup *string `json:"apiGroup,omitempty" protobuf:"bytes,1,opt,name=aPIGroup"` + // Kind is the type of resource being referenced. + Kind string `json:"kind" protobuf:"bytes,2,opt,name=kind"` + // Name is the name of resource being referenced. + Name string `json:"name" protobuf:"bytes,3,opt,name=name"` + // Scope represents if this refers to a cluster or namespace scoped resource. + // This may be set to "Cluster" (default) or "Namespace". + // Field can be enabled with IngressClassNamespacedParams feature gate. + // +optional + // +featureGate=IngressClassNamespacedParams + Scope *string `json:"scope" protobuf:"bytes,4,opt,name=scope"` + // Namespace is the namespace of the resource being referenced. This field is + // required when scope is set to "Namespace" and must be unset when scope is set to + // "Cluster". + // +optional + // +featureGate=IngressClassNamespacedParams + Namespace *string `json:"namespace,omitempty" protobuf:"bytes,5,opt,name=namespace"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object diff --git a/vendor/k8s.io/api/networking/v1beta1/types_swagger_doc_generated.go b/vendor/k8s.io/api/networking/v1beta1/types_swagger_doc_generated.go index c774249d8ecb..84337ad3ea84 100644 --- a/vendor/k8s.io/api/networking/v1beta1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/networking/v1beta1/types_swagger_doc_generated.go @@ -89,6 +89,19 @@ func (IngressClassList) SwaggerDoc() map[string]string { return map_IngressClassList } +var map_IngressClassParametersReference = map[string]string{ + "": "IngressClassParametersReference identifies an API object. This can be used to specify a cluster or namespace-scoped resource.", + "apiGroup": "APIGroup is the group for the resource being referenced. If APIGroup is not specified, the specified Kind must be in the core API group. For any other third-party types, APIGroup is required.", + "kind": "Kind is the type of resource being referenced.", + "name": "Name is the name of resource being referenced.", + "scope": "Scope represents if this refers to a cluster or namespace scoped resource. This may be set to \"Cluster\" (default) or \"Namespace\". Field can be enabled with IngressClassNamespacedParams feature gate.", + "namespace": "Namespace is the namespace of the resource being referenced. This field is required when scope is set to \"Namespace\" and must be unset when scope is set to \"Cluster\".", +} + +func (IngressClassParametersReference) SwaggerDoc() map[string]string { + return map_IngressClassParametersReference +} + var map_IngressClassSpec = map[string]string{ "": "IngressClassSpec provides information about the class of an Ingress.", "controller": "Controller refers to the name of the controller that should handle this class. This allows for different \"flavors\" that are controlled by the same controller. For example, you may have different Parameters for the same implementing controller. This should be specified as a domain-prefixed path no more than 250 characters in length, e.g. \"acme.io/ingress-controller\". This field is immutable.", diff --git a/vendor/k8s.io/api/networking/v1beta1/zz_generated.deepcopy.go b/vendor/k8s.io/api/networking/v1beta1/zz_generated.deepcopy.go index d55ccde683d2..e1b4543d30a7 100644 --- a/vendor/k8s.io/api/networking/v1beta1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/networking/v1beta1/zz_generated.deepcopy.go @@ -180,12 +180,43 @@ func (in *IngressClassList) DeepCopyObject() runtime.Object { return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *IngressClassParametersReference) DeepCopyInto(out *IngressClassParametersReference) { + *out = *in + if in.APIGroup != nil { + in, out := &in.APIGroup, &out.APIGroup + *out = new(string) + **out = **in + } + if in.Scope != nil { + in, out := &in.Scope, &out.Scope + *out = new(string) + **out = **in + } + if in.Namespace != nil { + in, out := &in.Namespace, &out.Namespace + *out = new(string) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IngressClassParametersReference. +func (in *IngressClassParametersReference) DeepCopy() *IngressClassParametersReference { + if in == nil { + return nil + } + out := new(IngressClassParametersReference) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *IngressClassSpec) DeepCopyInto(out *IngressClassSpec) { *out = *in if in.Parameters != nil { in, out := &in.Parameters, &out.Parameters - *out = new(v1.TypedLocalObjectReference) + *out = new(IngressClassParametersReference) (*in).DeepCopyInto(*out) } return diff --git a/vendor/k8s.io/api/node/v1/BUILD b/vendor/k8s.io/api/node/v1/BUILD deleted file mode 100644 index 699116358b3f..000000000000 --- a/vendor/k8s.io/api/node/v1/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/api/node/v1", - importpath = "k8s.io/api/node/v1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/node/v1/generated.pb.go b/vendor/k8s.io/api/node/v1/generated.pb.go index 775ade381634..d930f63b2450 100644 --- a/vendor/k8s.io/api/node/v1/generated.pb.go +++ b/vendor/k8s.io/api/node/v1/generated.pb.go @@ -766,7 +766,7 @@ func (m *Overhead) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -783,10 +783,7 @@ func (m *Overhead) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -973,10 +970,7 @@ func (m *RuntimeClass) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1093,10 +1087,7 @@ func (m *RuntimeClassList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1256,7 +1247,7 @@ func (m *Scheduling) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -1307,10 +1298,7 @@ func (m *Scheduling) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/api/node/v1alpha1/BUILD b/vendor/k8s.io/api/node/v1alpha1/BUILD deleted file mode 100644 index cef258bcbcc8..000000000000 --- a/vendor/k8s.io/api/node/v1alpha1/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/api/node/v1alpha1", - importpath = "k8s.io/api/node/v1alpha1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/node/v1alpha1/generated.pb.go b/vendor/k8s.io/api/node/v1alpha1/generated.pb.go index e6658a96fb82..abd2c09b6b39 100644 --- a/vendor/k8s.io/api/node/v1alpha1/generated.pb.go +++ b/vendor/k8s.io/api/node/v1alpha1/generated.pb.go @@ -852,7 +852,7 @@ func (m *Overhead) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -869,10 +869,7 @@ func (m *Overhead) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -988,10 +985,7 @@ func (m *RuntimeClass) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1108,10 +1102,7 @@ func (m *RuntimeClassList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1265,10 +1256,7 @@ func (m *RuntimeClassSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1428,7 +1416,7 @@ func (m *Scheduling) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -1479,10 +1467,7 @@ func (m *Scheduling) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/api/node/v1beta1/BUILD b/vendor/k8s.io/api/node/v1beta1/BUILD deleted file mode 100644 index def962d16ec8..000000000000 --- a/vendor/k8s.io/api/node/v1beta1/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - "zz_generated.prerelease-lifecycle.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/api/node/v1beta1", - importpath = "k8s.io/api/node/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/node/v1beta1/generated.pb.go b/vendor/k8s.io/api/node/v1beta1/generated.pb.go index b85cbd295e5a..4bfdd5df304d 100644 --- a/vendor/k8s.io/api/node/v1beta1/generated.pb.go +++ b/vendor/k8s.io/api/node/v1beta1/generated.pb.go @@ -767,7 +767,7 @@ func (m *Overhead) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -784,10 +784,7 @@ func (m *Overhead) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -974,10 +971,7 @@ func (m *RuntimeClass) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1094,10 +1088,7 @@ func (m *RuntimeClassList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1257,7 +1248,7 @@ func (m *Scheduling) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -1308,10 +1299,7 @@ func (m *Scheduling) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/api/policy/v1/doc.go b/vendor/k8s.io/api/policy/v1/doc.go new file mode 100644 index 000000000000..b46af58e43c4 --- /dev/null +++ b/vendor/k8s.io/api/policy/v1/doc.go @@ -0,0 +1,24 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// +k8s:deepcopy-gen=package +// +k8s:protobuf-gen=package +// +k8s:openapi-gen=true + +// Package policy is for any kind of policy object. Suitable examples, even if +// they aren't all here, are PodDisruptionBudget, PodSecurityPolicy, +// NetworkPolicy, etc. +package v1 // import "k8s.io/api/policy/v1" diff --git a/vendor/k8s.io/api/policy/v1/generated.pb.go b/vendor/k8s.io/api/policy/v1/generated.pb.go new file mode 100644 index 000000000000..9a9f73c124dd --- /dev/null +++ b/vendor/k8s.io/api/policy/v1/generated.pb.go @@ -0,0 +1,1459 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: k8s.io/kubernetes/vendor/k8s.io/api/policy/v1/generated.proto + +package v1 + +import ( + fmt "fmt" + + io "io" + + proto "github.com/gogo/protobuf/proto" + github_com_gogo_protobuf_sortkeys "github.com/gogo/protobuf/sortkeys" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + math "math" + math_bits "math/bits" + reflect "reflect" + strings "strings" + + intstr "k8s.io/apimachinery/pkg/util/intstr" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +func (m *PodDisruptionBudget) Reset() { *m = PodDisruptionBudget{} } +func (*PodDisruptionBudget) ProtoMessage() {} +func (*PodDisruptionBudget) Descriptor() ([]byte, []int) { + return fileDescriptor_2d50488813b2d18e, []int{0} +} +func (m *PodDisruptionBudget) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PodDisruptionBudget) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *PodDisruptionBudget) XXX_Merge(src proto.Message) { + xxx_messageInfo_PodDisruptionBudget.Merge(m, src) +} +func (m *PodDisruptionBudget) XXX_Size() int { + return m.Size() +} +func (m *PodDisruptionBudget) XXX_DiscardUnknown() { + xxx_messageInfo_PodDisruptionBudget.DiscardUnknown(m) +} + +var xxx_messageInfo_PodDisruptionBudget proto.InternalMessageInfo + +func (m *PodDisruptionBudgetList) Reset() { *m = PodDisruptionBudgetList{} } +func (*PodDisruptionBudgetList) ProtoMessage() {} +func (*PodDisruptionBudgetList) Descriptor() ([]byte, []int) { + return fileDescriptor_2d50488813b2d18e, []int{1} +} +func (m *PodDisruptionBudgetList) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PodDisruptionBudgetList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *PodDisruptionBudgetList) XXX_Merge(src proto.Message) { + xxx_messageInfo_PodDisruptionBudgetList.Merge(m, src) +} +func (m *PodDisruptionBudgetList) XXX_Size() int { + return m.Size() +} +func (m *PodDisruptionBudgetList) XXX_DiscardUnknown() { + xxx_messageInfo_PodDisruptionBudgetList.DiscardUnknown(m) +} + +var xxx_messageInfo_PodDisruptionBudgetList proto.InternalMessageInfo + +func (m *PodDisruptionBudgetSpec) Reset() { *m = PodDisruptionBudgetSpec{} } +func (*PodDisruptionBudgetSpec) ProtoMessage() {} +func (*PodDisruptionBudgetSpec) Descriptor() ([]byte, []int) { + return fileDescriptor_2d50488813b2d18e, []int{2} +} +func (m *PodDisruptionBudgetSpec) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PodDisruptionBudgetSpec) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *PodDisruptionBudgetSpec) XXX_Merge(src proto.Message) { + xxx_messageInfo_PodDisruptionBudgetSpec.Merge(m, src) +} +func (m *PodDisruptionBudgetSpec) XXX_Size() int { + return m.Size() +} +func (m *PodDisruptionBudgetSpec) XXX_DiscardUnknown() { + xxx_messageInfo_PodDisruptionBudgetSpec.DiscardUnknown(m) +} + +var xxx_messageInfo_PodDisruptionBudgetSpec proto.InternalMessageInfo + +func (m *PodDisruptionBudgetStatus) Reset() { *m = PodDisruptionBudgetStatus{} } +func (*PodDisruptionBudgetStatus) ProtoMessage() {} +func (*PodDisruptionBudgetStatus) Descriptor() ([]byte, []int) { + return fileDescriptor_2d50488813b2d18e, []int{3} +} +func (m *PodDisruptionBudgetStatus) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PodDisruptionBudgetStatus) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *PodDisruptionBudgetStatus) XXX_Merge(src proto.Message) { + xxx_messageInfo_PodDisruptionBudgetStatus.Merge(m, src) +} +func (m *PodDisruptionBudgetStatus) XXX_Size() int { + return m.Size() +} +func (m *PodDisruptionBudgetStatus) XXX_DiscardUnknown() { + xxx_messageInfo_PodDisruptionBudgetStatus.DiscardUnknown(m) +} + +var xxx_messageInfo_PodDisruptionBudgetStatus proto.InternalMessageInfo + +func init() { + proto.RegisterType((*PodDisruptionBudget)(nil), "k8s.io.api.policy.v1.PodDisruptionBudget") + proto.RegisterType((*PodDisruptionBudgetList)(nil), "k8s.io.api.policy.v1.PodDisruptionBudgetList") + proto.RegisterType((*PodDisruptionBudgetSpec)(nil), "k8s.io.api.policy.v1.PodDisruptionBudgetSpec") + proto.RegisterType((*PodDisruptionBudgetStatus)(nil), "k8s.io.api.policy.v1.PodDisruptionBudgetStatus") + proto.RegisterMapType((map[string]v1.Time)(nil), "k8s.io.api.policy.v1.PodDisruptionBudgetStatus.DisruptedPodsEntry") +} + +func init() { + proto.RegisterFile("k8s.io/kubernetes/vendor/k8s.io/api/policy/v1/generated.proto", fileDescriptor_2d50488813b2d18e) +} + +var fileDescriptor_2d50488813b2d18e = []byte{ + // 766 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x94, 0xdf, 0x6e, 0xe3, 0x44, + 0x14, 0xc6, 0xe3, 0xa4, 0x29, 0x65, 0x36, 0x8d, 0xaa, 0x61, 0x81, 0x90, 0x0b, 0x77, 0xd5, 0xab, + 0x82, 0xb4, 0x63, 0xba, 0x8b, 0x50, 0x85, 0x04, 0x62, 0xbd, 0x59, 0xc1, 0x22, 0x4a, 0x56, 0x53, + 0x10, 0x12, 0x02, 0x89, 0x89, 0x7d, 0xd6, 0x19, 0x62, 0x7b, 0xac, 0x99, 0xb1, 0xd9, 0x5c, 0xc1, + 0x23, 0xf0, 0x0a, 0x3c, 0x0a, 0x57, 0xf4, 0x0a, 0xed, 0xe5, 0x5e, 0x45, 0xd4, 0xbc, 0x08, 0xf2, + 0xd8, 0xf9, 0xe3, 0x24, 0x55, 0x03, 0x77, 0x99, 0x39, 0xe7, 0xfb, 0x9d, 0x39, 0xdf, 0x39, 0x0e, + 0xfa, 0x78, 0x72, 0xae, 0x08, 0x17, 0xce, 0x24, 0x1d, 0x81, 0x8c, 0x41, 0x83, 0x72, 0x32, 0x88, + 0x7d, 0x21, 0x9d, 0x2a, 0xc0, 0x12, 0xee, 0x24, 0x22, 0xe4, 0xde, 0xd4, 0xc9, 0xce, 0x9c, 0x00, + 0x62, 0x90, 0x4c, 0x83, 0x4f, 0x12, 0x29, 0xb4, 0xc0, 0x77, 0xcb, 0x2c, 0xc2, 0x12, 0x4e, 0xca, + 0x2c, 0x92, 0x9d, 0xf5, 0xef, 0x07, 0x5c, 0x8f, 0xd3, 0x11, 0xf1, 0x44, 0xe4, 0x04, 0x22, 0x10, + 0x8e, 0x49, 0x1e, 0xa5, 0xcf, 0xcd, 0xc9, 0x1c, 0xcc, 0xaf, 0x12, 0xd2, 0xff, 0x60, 0x59, 0x2a, + 0x62, 0xde, 0x98, 0xc7, 0x20, 0xa7, 0x4e, 0x32, 0x09, 0x8a, 0x0b, 0xe5, 0x44, 0xa0, 0xd9, 0x96, + 0xd2, 0x7d, 0xe7, 0x26, 0x95, 0x4c, 0x63, 0xcd, 0x23, 0xd8, 0x10, 0x7c, 0x78, 0x9b, 0x40, 0x79, + 0x63, 0x88, 0xd8, 0x86, 0xee, 0xe1, 0x4d, 0xba, 0x54, 0xf3, 0xd0, 0xe1, 0xb1, 0x56, 0x5a, 0xae, + 0x8b, 0x4e, 0x7e, 0x6f, 0xa2, 0x37, 0x9e, 0x09, 0x7f, 0xc0, 0x95, 0x4c, 0x13, 0xcd, 0x45, 0xec, + 0xa6, 0x7e, 0x00, 0x1a, 0xff, 0x88, 0x0e, 0x8a, 0x86, 0x7c, 0xa6, 0x59, 0xcf, 0xba, 0x67, 0x9d, + 0xde, 0x79, 0xf0, 0x3e, 0x59, 0x7a, 0xb8, 0xe0, 0x93, 0x64, 0x12, 0x14, 0x17, 0x8a, 0x14, 0xd9, + 0x24, 0x3b, 0x23, 0xc3, 0xd1, 0x4f, 0xe0, 0xe9, 0x0b, 0xd0, 0xcc, 0xc5, 0x57, 0xb3, 0xe3, 0x46, + 0x3e, 0x3b, 0x46, 0xcb, 0x3b, 0xba, 0xa0, 0xe2, 0x21, 0xda, 0x53, 0x09, 0x78, 0xbd, 0xa6, 0xa1, + 0xdf, 0x27, 0xdb, 0x26, 0x44, 0xb6, 0x3c, 0xed, 0x32, 0x01, 0xcf, 0xed, 0x54, 0xe8, 0xbd, 0xe2, + 0x44, 0x0d, 0x08, 0x7f, 0x8b, 0xf6, 0x95, 0x66, 0x3a, 0x55, 0xbd, 0x96, 0x41, 0x3a, 0xbb, 0x23, + 0x8d, 0xcc, 0xed, 0x56, 0xd0, 0xfd, 0xf2, 0x4c, 0x2b, 0xdc, 0xc9, 0x9f, 0x16, 0x7a, 0x7b, 0x8b, + 0xea, 0x4b, 0xae, 0x34, 0xfe, 0x7e, 0xc3, 0x27, 0xb2, 0x9b, 0x4f, 0x85, 0xda, 0xb8, 0x74, 0x54, + 0x55, 0x3d, 0x98, 0xdf, 0xac, 0x78, 0xf4, 0x15, 0x6a, 0x73, 0x0d, 0x91, 0xea, 0x35, 0xef, 0xb5, + 0x4e, 0xef, 0x3c, 0x78, 0x77, 0xe7, 0x8e, 0xdc, 0xc3, 0x8a, 0xda, 0x7e, 0x5a, 0xe8, 0x69, 0x89, + 0x39, 0xf9, 0xab, 0xb9, 0xb5, 0x93, 0xc2, 0x44, 0xfc, 0x1c, 0x75, 0x22, 0x1e, 0x3f, 0xca, 0x18, + 0x0f, 0xd9, 0x28, 0x84, 0x5b, 0xa7, 0x5e, 0x6c, 0x15, 0x29, 0xb7, 0x8a, 0x3c, 0x8d, 0xf5, 0x50, + 0x5e, 0x6a, 0xc9, 0xe3, 0xc0, 0x3d, 0xca, 0x67, 0xc7, 0x9d, 0x8b, 0x15, 0x12, 0xad, 0x71, 0xf1, + 0x0f, 0xe8, 0x40, 0x41, 0x08, 0x9e, 0x16, 0xb2, 0x9a, 0xfd, 0xc3, 0x1d, 0x1d, 0x63, 0x23, 0x08, + 0x2f, 0x2b, 0xa9, 0xdb, 0x29, 0x2c, 0x9b, 0x9f, 0xe8, 0x02, 0x89, 0x43, 0xd4, 0x8d, 0xd8, 0x8b, + 0x6f, 0x62, 0xb6, 0x68, 0xa4, 0xf5, 0x3f, 0x1b, 0xc1, 0xf9, 0xec, 0xb8, 0x7b, 0x51, 0x63, 0xd1, + 0x35, 0xf6, 0xc9, 0x1f, 0x6d, 0xf4, 0xce, 0x8d, 0x0b, 0x85, 0xbf, 0x40, 0x58, 0x8c, 0x14, 0xc8, + 0x0c, 0xfc, 0xcf, 0xca, 0xef, 0x8e, 0x8b, 0xd8, 0x18, 0xdb, 0x72, 0xfb, 0xd5, 0x80, 0xf0, 0x70, + 0x23, 0x83, 0x6e, 0x51, 0xe1, 0x5f, 0xd0, 0xa1, 0x5f, 0x56, 0x01, 0xff, 0x99, 0xf0, 0xe7, 0x2b, + 0xe1, 0xfe, 0xc7, 0x25, 0x27, 0x83, 0x55, 0xc8, 0x93, 0x58, 0xcb, 0xa9, 0xfb, 0x66, 0xf5, 0x94, + 0xc3, 0x5a, 0x8c, 0xd6, 0xeb, 0x15, 0xcd, 0xf8, 0x0b, 0xa4, 0x7a, 0x14, 0x86, 0xe2, 0x67, 0xf0, + 0x8d, 0xb9, 0xed, 0x65, 0x33, 0x83, 0x8d, 0x0c, 0xba, 0x45, 0x85, 0x3f, 0x41, 0x5d, 0x2f, 0x95, + 0x12, 0x62, 0xfd, 0x39, 0xb0, 0x50, 0x8f, 0xa7, 0xbd, 0x3d, 0xc3, 0x79, 0xab, 0xe2, 0x74, 0x1f, + 0xd7, 0xa2, 0x74, 0x2d, 0xbb, 0xd0, 0xfb, 0xa0, 0xb8, 0x04, 0x7f, 0xae, 0x6f, 0xd7, 0xf5, 0x83, + 0x5a, 0x94, 0xae, 0x65, 0xe3, 0x73, 0xd4, 0x81, 0x17, 0x09, 0x78, 0x73, 0x2f, 0xf7, 0x8d, 0xfa, + 0x6e, 0xa5, 0xee, 0x3c, 0x59, 0x89, 0xd1, 0x5a, 0x26, 0xf6, 0x10, 0xf2, 0x44, 0xec, 0x73, 0xd3, + 0x4e, 0xef, 0x35, 0x33, 0x03, 0x67, 0xb7, 0xfd, 0x7d, 0x3c, 0xd7, 0x2d, 0xff, 0x18, 0x17, 0x57, + 0x8a, 0xae, 0x60, 0xfb, 0x21, 0xc2, 0x9b, 0x63, 0xc2, 0x47, 0xa8, 0x35, 0x81, 0xa9, 0x59, 0x9f, + 0xd7, 0x69, 0xf1, 0x13, 0x7f, 0x8a, 0xda, 0x19, 0x0b, 0x53, 0xa8, 0xbe, 0xa3, 0xf7, 0x76, 0x7b, + 0xc7, 0xd7, 0x3c, 0x02, 0x5a, 0x0a, 0x3f, 0x6a, 0x9e, 0x5b, 0xee, 0xe9, 0xd5, 0xb5, 0xdd, 0x78, + 0x79, 0x6d, 0x37, 0x5e, 0x5d, 0xdb, 0x8d, 0x5f, 0x73, 0xdb, 0xba, 0xca, 0x6d, 0xeb, 0x65, 0x6e, + 0x5b, 0xaf, 0x72, 0xdb, 0xfa, 0x3b, 0xb7, 0xad, 0xdf, 0xfe, 0xb1, 0x1b, 0xdf, 0x35, 0xb3, 0xb3, + 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0xca, 0x04, 0x93, 0xc0, 0x85, 0x07, 0x00, 0x00, +} + +func (m *PodDisruptionBudget) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PodDisruptionBudget) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PodDisruptionBudget) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Status.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + { + size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *PodDisruptionBudgetList) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PodDisruptionBudgetList) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PodDisruptionBudgetList) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Items) > 0 { + for iNdEx := len(m.Items) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Items[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + { + size, err := m.ListMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *PodDisruptionBudgetSpec) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PodDisruptionBudgetSpec) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PodDisruptionBudgetSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.MaxUnavailable != nil { + { + size, err := m.MaxUnavailable.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + if m.Selector != nil { + { + size, err := m.Selector.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if m.MinAvailable != nil { + { + size, err := m.MinAvailable.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *PodDisruptionBudgetStatus) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PodDisruptionBudgetStatus) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PodDisruptionBudgetStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Conditions) > 0 { + for iNdEx := len(m.Conditions) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Conditions[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a + } + } + i = encodeVarintGenerated(dAtA, i, uint64(m.ExpectedPods)) + i-- + dAtA[i] = 0x30 + i = encodeVarintGenerated(dAtA, i, uint64(m.DesiredHealthy)) + i-- + dAtA[i] = 0x28 + i = encodeVarintGenerated(dAtA, i, uint64(m.CurrentHealthy)) + i-- + dAtA[i] = 0x20 + i = encodeVarintGenerated(dAtA, i, uint64(m.DisruptionsAllowed)) + i-- + dAtA[i] = 0x18 + if len(m.DisruptedPods) > 0 { + keysForDisruptedPods := make([]string, 0, len(m.DisruptedPods)) + for k := range m.DisruptedPods { + keysForDisruptedPods = append(keysForDisruptedPods, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForDisruptedPods) + for iNdEx := len(keysForDisruptedPods) - 1; iNdEx >= 0; iNdEx-- { + v := m.DisruptedPods[string(keysForDisruptedPods[iNdEx])] + baseI := i + { + size, err := (&v).MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + i -= len(keysForDisruptedPods[iNdEx]) + copy(dAtA[i:], keysForDisruptedPods[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(keysForDisruptedPods[iNdEx]))) + i-- + dAtA[i] = 0xa + i = encodeVarintGenerated(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x12 + } + } + i = encodeVarintGenerated(dAtA, i, uint64(m.ObservedGeneration)) + i-- + dAtA[i] = 0x8 + return len(dAtA) - i, nil +} + +func encodeVarintGenerated(dAtA []byte, offset int, v uint64) int { + offset -= sovGenerated(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *PodDisruptionBudget) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Spec.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Status.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *PodDisruptionBudgetList) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ListMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *PodDisruptionBudgetSpec) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.MinAvailable != nil { + l = m.MinAvailable.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.Selector != nil { + l = m.Selector.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.MaxUnavailable != nil { + l = m.MaxUnavailable.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *PodDisruptionBudgetStatus) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + n += 1 + sovGenerated(uint64(m.ObservedGeneration)) + if len(m.DisruptedPods) > 0 { + for k, v := range m.DisruptedPods { + _ = k + _ = v + l = v.Size() + mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + l + sovGenerated(uint64(l)) + n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) + } + } + n += 1 + sovGenerated(uint64(m.DisruptionsAllowed)) + n += 1 + sovGenerated(uint64(m.CurrentHealthy)) + n += 1 + sovGenerated(uint64(m.DesiredHealthy)) + n += 1 + sovGenerated(uint64(m.ExpectedPods)) + if len(m.Conditions) > 0 { + for _, e := range m.Conditions { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func sovGenerated(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozGenerated(x uint64) (n int) { + return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (this *PodDisruptionBudget) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&PodDisruptionBudget{`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "PodDisruptionBudgetSpec", "PodDisruptionBudgetSpec", 1), `&`, ``, 1) + `,`, + `Status:` + strings.Replace(strings.Replace(this.Status.String(), "PodDisruptionBudgetStatus", "PodDisruptionBudgetStatus", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *PodDisruptionBudgetList) String() string { + if this == nil { + return "nil" + } + repeatedStringForItems := "[]PodDisruptionBudget{" + for _, f := range this.Items { + repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "PodDisruptionBudget", "PodDisruptionBudget", 1), `&`, ``, 1) + "," + } + repeatedStringForItems += "}" + s := strings.Join([]string{`&PodDisruptionBudgetList{`, + `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, + `Items:` + repeatedStringForItems + `,`, + `}`, + }, "") + return s +} +func (this *PodDisruptionBudgetSpec) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&PodDisruptionBudgetSpec{`, + `MinAvailable:` + strings.Replace(fmt.Sprintf("%v", this.MinAvailable), "IntOrString", "intstr.IntOrString", 1) + `,`, + `Selector:` + strings.Replace(fmt.Sprintf("%v", this.Selector), "LabelSelector", "v1.LabelSelector", 1) + `,`, + `MaxUnavailable:` + strings.Replace(fmt.Sprintf("%v", this.MaxUnavailable), "IntOrString", "intstr.IntOrString", 1) + `,`, + `}`, + }, "") + return s +} +func (this *PodDisruptionBudgetStatus) String() string { + if this == nil { + return "nil" + } + repeatedStringForConditions := "[]Condition{" + for _, f := range this.Conditions { + repeatedStringForConditions += fmt.Sprintf("%v", f) + "," + } + repeatedStringForConditions += "}" + keysForDisruptedPods := make([]string, 0, len(this.DisruptedPods)) + for k := range this.DisruptedPods { + keysForDisruptedPods = append(keysForDisruptedPods, k) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForDisruptedPods) + mapStringForDisruptedPods := "map[string]v1.Time{" + for _, k := range keysForDisruptedPods { + mapStringForDisruptedPods += fmt.Sprintf("%v: %v,", k, this.DisruptedPods[k]) + } + mapStringForDisruptedPods += "}" + s := strings.Join([]string{`&PodDisruptionBudgetStatus{`, + `ObservedGeneration:` + fmt.Sprintf("%v", this.ObservedGeneration) + `,`, + `DisruptedPods:` + mapStringForDisruptedPods + `,`, + `DisruptionsAllowed:` + fmt.Sprintf("%v", this.DisruptionsAllowed) + `,`, + `CurrentHealthy:` + fmt.Sprintf("%v", this.CurrentHealthy) + `,`, + `DesiredHealthy:` + fmt.Sprintf("%v", this.DesiredHealthy) + `,`, + `ExpectedPods:` + fmt.Sprintf("%v", this.ExpectedPods) + `,`, + `Conditions:` + repeatedStringForConditions + `,`, + `}`, + }, "") + return s +} +func valueToStringGenerated(v interface{}) string { + rv := reflect.ValueOf(v) + if rv.IsNil() { + return "nil" + } + pv := reflect.Indirect(rv).Interface() + return fmt.Sprintf("*%v", pv) +} +func (m *PodDisruptionBudget) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PodDisruptionBudget: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PodDisruptionBudget: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PodDisruptionBudgetList) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PodDisruptionBudgetList: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PodDisruptionBudgetList: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Items = append(m.Items, PodDisruptionBudget{}) + if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PodDisruptionBudgetSpec) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PodDisruptionBudgetSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PodDisruptionBudgetSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MinAvailable", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.MinAvailable == nil { + m.MinAvailable = &intstr.IntOrString{} + } + if err := m.MinAvailable.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Selector", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Selector == nil { + m.Selector = &v1.LabelSelector{} + } + if err := m.Selector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MaxUnavailable", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.MaxUnavailable == nil { + m.MaxUnavailable = &intstr.IntOrString{} + } + if err := m.MaxUnavailable.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PodDisruptionBudgetStatus) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PodDisruptionBudgetStatus: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PodDisruptionBudgetStatus: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ObservedGeneration", wireType) + } + m.ObservedGeneration = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ObservedGeneration |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DisruptedPods", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.DisruptedPods == nil { + m.DisruptedPods = make(map[string]v1.Time) + } + var mapkey string + mapvalue := &v1.Time{} + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthGenerated + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var mapmsglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapmsglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if mapmsglen < 0 { + return ErrInvalidLengthGenerated + } + postmsgIndex := iNdEx + mapmsglen + if postmsgIndex < 0 { + return ErrInvalidLengthGenerated + } + if postmsgIndex > l { + return io.ErrUnexpectedEOF + } + mapvalue = &v1.Time{} + if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil { + return err + } + iNdEx = postmsgIndex + } else { + iNdEx = entryPreIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.DisruptedPods[mapkey] = *mapvalue + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DisruptionsAllowed", wireType) + } + m.DisruptionsAllowed = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.DisruptionsAllowed |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CurrentHealthy", wireType) + } + m.CurrentHealthy = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.CurrentHealthy |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DesiredHealthy", wireType) + } + m.DesiredHealthy = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.DesiredHealthy |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ExpectedPods", wireType) + } + m.ExpectedPods = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ExpectedPods |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Conditions", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Conditions = append(m.Conditions, v1.Condition{}) + if err := m.Conditions[len(m.Conditions)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipGenerated(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenerated + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenerated + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenerated + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthGenerated + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupGenerated + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthGenerated + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthGenerated = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowGenerated = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupGenerated = fmt.Errorf("proto: unexpected end of group") +) diff --git a/vendor/k8s.io/api/policy/v1/generated.proto b/vendor/k8s.io/api/policy/v1/generated.proto new file mode 100644 index 000000000000..f57514112a09 --- /dev/null +++ b/vendor/k8s.io/api/policy/v1/generated.proto @@ -0,0 +1,138 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + + +// This file was autogenerated by go-to-protobuf. Do not edit it manually! + +syntax = "proto2"; + +package k8s.io.api.policy.v1; + +import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; +import "k8s.io/apimachinery/pkg/runtime/generated.proto"; +import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; +import "k8s.io/apimachinery/pkg/util/intstr/generated.proto"; + +// Package-wide variables from generator "generated". +option go_package = "v1"; + +// PodDisruptionBudget is an object to define the max disruption that can be caused to a collection of pods +message PodDisruptionBudget { + // Standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; + + // Specification of the desired behavior of the PodDisruptionBudget. + // +optional + optional PodDisruptionBudgetSpec spec = 2; + + // Most recently observed status of the PodDisruptionBudget. + // +optional + optional PodDisruptionBudgetStatus status = 3; +} + +// PodDisruptionBudgetList is a collection of PodDisruptionBudgets. +message PodDisruptionBudgetList { + // Standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; + + // Items is a list of PodDisruptionBudgets + repeated PodDisruptionBudget items = 2; +} + +// PodDisruptionBudgetSpec is a description of a PodDisruptionBudget. +message PodDisruptionBudgetSpec { + // An eviction is allowed if at least "minAvailable" pods selected by + // "selector" will still be available after the eviction, i.e. even in the + // absence of the evicted pod. So for example you can prevent all voluntary + // evictions by specifying "100%". + // +optional + optional k8s.io.apimachinery.pkg.util.intstr.IntOrString minAvailable = 1; + + // Label query over pods whose evictions are managed by the disruption + // budget. + // A null selector will match no pods, while an empty ({}) selector will select + // all pods within the namespace. + // +patchStrategy=replace + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.LabelSelector selector = 2; + + // An eviction is allowed if at most "maxUnavailable" pods selected by + // "selector" are unavailable after the eviction, i.e. even in absence of + // the evicted pod. For example, one can prevent all voluntary evictions + // by specifying 0. This is a mutually exclusive setting with "minAvailable". + // +optional + optional k8s.io.apimachinery.pkg.util.intstr.IntOrString maxUnavailable = 3; +} + +// PodDisruptionBudgetStatus represents information about the status of a +// PodDisruptionBudget. Status may trail the actual state of a system. +message PodDisruptionBudgetStatus { + // Most recent generation observed when updating this PDB status. DisruptionsAllowed and other + // status information is valid only if observedGeneration equals to PDB's object generation. + // +optional + optional int64 observedGeneration = 1; + + // DisruptedPods contains information about pods whose eviction was + // processed by the API server eviction subresource handler but has not + // yet been observed by the PodDisruptionBudget controller. + // A pod will be in this map from the time when the API server processed the + // eviction request to the time when the pod is seen by PDB controller + // as having been marked for deletion (or after a timeout). The key in the map is the name of the pod + // and the value is the time when the API server processed the eviction request. If + // the deletion didn't occur and a pod is still there it will be removed from + // the list automatically by PodDisruptionBudget controller after some time. + // If everything goes smooth this map should be empty for the most of the time. + // Large number of entries in the map may indicate problems with pod deletions. + // +optional + map disruptedPods = 2; + + // Number of pod disruptions that are currently allowed. + optional int32 disruptionsAllowed = 3; + + // current number of healthy pods + optional int32 currentHealthy = 4; + + // minimum desired number of healthy pods + optional int32 desiredHealthy = 5; + + // total number of pods counted by this disruption budget + optional int32 expectedPods = 6; + + // Conditions contain conditions for PDB. The disruption controller sets the + // DisruptionAllowed condition. The following are known values for the reason field + // (additional reasons could be added in the future): + // - SyncFailed: The controller encountered an error and wasn't able to compute + // the number of allowed disruptions. Therefore no disruptions are + // allowed and the status of the condition will be False. + // - InsufficientPods: The number of pods are either at or below the number + // required by the PodDisruptionBudget. No disruptions are + // allowed and the status of the condition will be False. + // - SufficientPods: There are more pods than required by the PodDisruptionBudget. + // The condition will be True, and the number of allowed + // disruptions are provided by the disruptionsAllowed property. + // + // +optional + // +patchMergeKey=type + // +patchStrategy=merge + // +listType=map + // +listMapKey=type + repeated k8s.io.apimachinery.pkg.apis.meta.v1.Condition conditions = 7; +} + diff --git a/vendor/k8s.io/api/policy/v1/register.go b/vendor/k8s.io/api/policy/v1/register.go new file mode 100644 index 000000000000..603c49b9cefc --- /dev/null +++ b/vendor/k8s.io/api/policy/v1/register.go @@ -0,0 +1,51 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" +) + +// GroupName is the group name use in this package +const GroupName = "policy" + +// SchemeGroupVersion is group version used to register these objects +var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: "v1"} + +// Resource takes an unqualified resource and returns a Group qualified GroupResource +func Resource(resource string) schema.GroupResource { + return SchemeGroupVersion.WithResource(resource).GroupResource() +} + +var ( + SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes) + localSchemeBuilder = &SchemeBuilder + AddToScheme = localSchemeBuilder.AddToScheme +) + +// Adds the list of known types to the given scheme. +func addKnownTypes(scheme *runtime.Scheme) error { + scheme.AddKnownTypes(SchemeGroupVersion, + &PodDisruptionBudget{}, + &PodDisruptionBudgetList{}, + ) + // Add the watch version that applies + metav1.AddToGroupVersion(scheme, SchemeGroupVersion) + return nil +} diff --git a/vendor/k8s.io/api/policy/v1/types.go b/vendor/k8s.io/api/policy/v1/types.go new file mode 100644 index 000000000000..65bf768d8669 --- /dev/null +++ b/vendor/k8s.io/api/policy/v1/types.go @@ -0,0 +1,150 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/intstr" +) + +// PodDisruptionBudgetSpec is a description of a PodDisruptionBudget. +type PodDisruptionBudgetSpec struct { + // An eviction is allowed if at least "minAvailable" pods selected by + // "selector" will still be available after the eviction, i.e. even in the + // absence of the evicted pod. So for example you can prevent all voluntary + // evictions by specifying "100%". + // +optional + MinAvailable *intstr.IntOrString `json:"minAvailable,omitempty" protobuf:"bytes,1,opt,name=minAvailable"` + + // Label query over pods whose evictions are managed by the disruption + // budget. + // A null selector will match no pods, while an empty ({}) selector will select + // all pods within the namespace. + // +patchStrategy=replace + // +optional + Selector *metav1.LabelSelector `json:"selector,omitempty" patchStrategy:"replace" protobuf:"bytes,2,opt,name=selector"` + + // An eviction is allowed if at most "maxUnavailable" pods selected by + // "selector" are unavailable after the eviction, i.e. even in absence of + // the evicted pod. For example, one can prevent all voluntary evictions + // by specifying 0. This is a mutually exclusive setting with "minAvailable". + // +optional + MaxUnavailable *intstr.IntOrString `json:"maxUnavailable,omitempty" protobuf:"bytes,3,opt,name=maxUnavailable"` +} + +// PodDisruptionBudgetStatus represents information about the status of a +// PodDisruptionBudget. Status may trail the actual state of a system. +type PodDisruptionBudgetStatus struct { + // Most recent generation observed when updating this PDB status. DisruptionsAllowed and other + // status information is valid only if observedGeneration equals to PDB's object generation. + // +optional + ObservedGeneration int64 `json:"observedGeneration,omitempty" protobuf:"varint,1,opt,name=observedGeneration"` + + // DisruptedPods contains information about pods whose eviction was + // processed by the API server eviction subresource handler but has not + // yet been observed by the PodDisruptionBudget controller. + // A pod will be in this map from the time when the API server processed the + // eviction request to the time when the pod is seen by PDB controller + // as having been marked for deletion (or after a timeout). The key in the map is the name of the pod + // and the value is the time when the API server processed the eviction request. If + // the deletion didn't occur and a pod is still there it will be removed from + // the list automatically by PodDisruptionBudget controller after some time. + // If everything goes smooth this map should be empty for the most of the time. + // Large number of entries in the map may indicate problems with pod deletions. + // +optional + DisruptedPods map[string]metav1.Time `json:"disruptedPods,omitempty" protobuf:"bytes,2,rep,name=disruptedPods"` + + // Number of pod disruptions that are currently allowed. + DisruptionsAllowed int32 `json:"disruptionsAllowed" protobuf:"varint,3,opt,name=disruptionsAllowed"` + + // current number of healthy pods + CurrentHealthy int32 `json:"currentHealthy" protobuf:"varint,4,opt,name=currentHealthy"` + + // minimum desired number of healthy pods + DesiredHealthy int32 `json:"desiredHealthy" protobuf:"varint,5,opt,name=desiredHealthy"` + + // total number of pods counted by this disruption budget + ExpectedPods int32 `json:"expectedPods" protobuf:"varint,6,opt,name=expectedPods"` + + // Conditions contain conditions for PDB. The disruption controller sets the + // DisruptionAllowed condition. The following are known values for the reason field + // (additional reasons could be added in the future): + // - SyncFailed: The controller encountered an error and wasn't able to compute + // the number of allowed disruptions. Therefore no disruptions are + // allowed and the status of the condition will be False. + // - InsufficientPods: The number of pods are either at or below the number + // required by the PodDisruptionBudget. No disruptions are + // allowed and the status of the condition will be False. + // - SufficientPods: There are more pods than required by the PodDisruptionBudget. + // The condition will be True, and the number of allowed + // disruptions are provided by the disruptionsAllowed property. + // + // +optional + // +patchMergeKey=type + // +patchStrategy=merge + // +listType=map + // +listMapKey=type + Conditions []metav1.Condition `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type" protobuf:"bytes,7,rep,name=conditions"` +} + +const ( + // DisruptionAllowedCondition is a condition set by the disruption controller + // that signal whether any of the pods covered by the PDB can be disrupted. + DisruptionAllowedCondition = "DisruptionAllowed" + + // SyncFailedReason is set on the DisruptionAllowed condition if reconcile + // of the PDB failed and therefore disruption of pods are not allowed. + SyncFailedReason = "SyncFailed" + // SufficientPodsReason is set on the DisruptionAllowed condition if there are + // more pods covered by the PDB than required and at least one can be disrupted. + SufficientPodsReason = "SufficientPods" + // InsufficientPodsReason is set on the DisruptionAllowed condition if the number + // of pods are equal to or fewer than required by the PDB. + InsufficientPodsReason = "InsufficientPods" +) + +// +genclient +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// PodDisruptionBudget is an object to define the max disruption that can be caused to a collection of pods +type PodDisruptionBudget struct { + metav1.TypeMeta `json:",inline"` + // Standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +optional + metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + + // Specification of the desired behavior of the PodDisruptionBudget. + // +optional + Spec PodDisruptionBudgetSpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"` + // Most recently observed status of the PodDisruptionBudget. + // +optional + Status PodDisruptionBudgetStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// PodDisruptionBudgetList is a collection of PodDisruptionBudgets. +type PodDisruptionBudgetList struct { + metav1.TypeMeta `json:",inline"` + // Standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +optional + metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + // Items is a list of PodDisruptionBudgets + Items []PodDisruptionBudget `json:"items" protobuf:"bytes,2,rep,name=items"` +} diff --git a/vendor/k8s.io/api/policy/v1/types_swagger_doc_generated.go b/vendor/k8s.io/api/policy/v1/types_swagger_doc_generated.go new file mode 100644 index 000000000000..0b80a1dccf10 --- /dev/null +++ b/vendor/k8s.io/api/policy/v1/types_swagger_doc_generated.go @@ -0,0 +1,77 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1 + +// This file contains a collection of methods that can be used from go-restful to +// generate Swagger API documentation for its models. Please read this PR for more +// information on the implementation: https://github.com/emicklei/go-restful/pull/215 +// +// TODOs are ignored from the parser (e.g. TODO(andronat):... || TODO:...) if and only if +// they are on one line! For multiple line or blocks that you want to ignore use ---. +// Any context after a --- is ignored. +// +// Those methods can be generated by using hack/update-generated-swagger-docs.sh + +// AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. +var map_PodDisruptionBudget = map[string]string{ + "": "PodDisruptionBudget is an object to define the max disruption that can be caused to a collection of pods", + "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "Specification of the desired behavior of the PodDisruptionBudget.", + "status": "Most recently observed status of the PodDisruptionBudget.", +} + +func (PodDisruptionBudget) SwaggerDoc() map[string]string { + return map_PodDisruptionBudget +} + +var map_PodDisruptionBudgetList = map[string]string{ + "": "PodDisruptionBudgetList is a collection of PodDisruptionBudgets.", + "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "items": "Items is a list of PodDisruptionBudgets", +} + +func (PodDisruptionBudgetList) SwaggerDoc() map[string]string { + return map_PodDisruptionBudgetList +} + +var map_PodDisruptionBudgetSpec = map[string]string{ + "": "PodDisruptionBudgetSpec is a description of a PodDisruptionBudget.", + "minAvailable": "An eviction is allowed if at least \"minAvailable\" pods selected by \"selector\" will still be available after the eviction, i.e. even in the absence of the evicted pod. So for example you can prevent all voluntary evictions by specifying \"100%\".", + "selector": "Label query over pods whose evictions are managed by the disruption budget. A null selector will match no pods, while an empty ({}) selector will select all pods within the namespace.", + "maxUnavailable": "An eviction is allowed if at most \"maxUnavailable\" pods selected by \"selector\" are unavailable after the eviction, i.e. even in absence of the evicted pod. For example, one can prevent all voluntary evictions by specifying 0. This is a mutually exclusive setting with \"minAvailable\".", +} + +func (PodDisruptionBudgetSpec) SwaggerDoc() map[string]string { + return map_PodDisruptionBudgetSpec +} + +var map_PodDisruptionBudgetStatus = map[string]string{ + "": "PodDisruptionBudgetStatus represents information about the status of a PodDisruptionBudget. Status may trail the actual state of a system.", + "observedGeneration": "Most recent generation observed when updating this PDB status. DisruptionsAllowed and other status information is valid only if observedGeneration equals to PDB's object generation.", + "disruptedPods": "DisruptedPods contains information about pods whose eviction was processed by the API server eviction subresource handler but has not yet been observed by the PodDisruptionBudget controller. A pod will be in this map from the time when the API server processed the eviction request to the time when the pod is seen by PDB controller as having been marked for deletion (or after a timeout). The key in the map is the name of the pod and the value is the time when the API server processed the eviction request. If the deletion didn't occur and a pod is still there it will be removed from the list automatically by PodDisruptionBudget controller after some time. If everything goes smooth this map should be empty for the most of the time. Large number of entries in the map may indicate problems with pod deletions.", + "disruptionsAllowed": "Number of pod disruptions that are currently allowed.", + "currentHealthy": "current number of healthy pods", + "desiredHealthy": "minimum desired number of healthy pods", + "expectedPods": "total number of pods counted by this disruption budget", + "conditions": "Conditions contain conditions for PDB. The disruption controller sets the DisruptionAllowed condition. The following are known values for the reason field (additional reasons could be added in the future): - SyncFailed: The controller encountered an error and wasn't able to compute\n the number of allowed disruptions. Therefore no disruptions are\n allowed and the status of the condition will be False.\n- InsufficientPods: The number of pods are either at or below the number\n required by the PodDisruptionBudget. No disruptions are\n allowed and the status of the condition will be False.\n- SufficientPods: There are more pods than required by the PodDisruptionBudget.\n The condition will be True, and the number of allowed\n disruptions are provided by the disruptionsAllowed property.", +} + +func (PodDisruptionBudgetStatus) SwaggerDoc() map[string]string { + return map_PodDisruptionBudgetStatus +} + +// AUTO-GENERATED FUNCTIONS END HERE diff --git a/vendor/k8s.io/api/policy/v1/zz_generated.deepcopy.go b/vendor/k8s.io/api/policy/v1/zz_generated.deepcopy.go new file mode 100644 index 000000000000..78c0adbd705a --- /dev/null +++ b/vendor/k8s.io/api/policy/v1/zz_generated.deepcopy.go @@ -0,0 +1,149 @@ +// +build !ignore_autogenerated + +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by deepcopy-gen. DO NOT EDIT. + +package v1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + intstr "k8s.io/apimachinery/pkg/util/intstr" +) + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PodDisruptionBudget) DeepCopyInto(out *PodDisruptionBudget) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodDisruptionBudget. +func (in *PodDisruptionBudget) DeepCopy() *PodDisruptionBudget { + if in == nil { + return nil + } + out := new(PodDisruptionBudget) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *PodDisruptionBudget) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PodDisruptionBudgetList) DeepCopyInto(out *PodDisruptionBudgetList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]PodDisruptionBudget, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodDisruptionBudgetList. +func (in *PodDisruptionBudgetList) DeepCopy() *PodDisruptionBudgetList { + if in == nil { + return nil + } + out := new(PodDisruptionBudgetList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *PodDisruptionBudgetList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PodDisruptionBudgetSpec) DeepCopyInto(out *PodDisruptionBudgetSpec) { + *out = *in + if in.MinAvailable != nil { + in, out := &in.MinAvailable, &out.MinAvailable + *out = new(intstr.IntOrString) + **out = **in + } + if in.Selector != nil { + in, out := &in.Selector, &out.Selector + *out = new(metav1.LabelSelector) + (*in).DeepCopyInto(*out) + } + if in.MaxUnavailable != nil { + in, out := &in.MaxUnavailable, &out.MaxUnavailable + *out = new(intstr.IntOrString) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodDisruptionBudgetSpec. +func (in *PodDisruptionBudgetSpec) DeepCopy() *PodDisruptionBudgetSpec { + if in == nil { + return nil + } + out := new(PodDisruptionBudgetSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PodDisruptionBudgetStatus) DeepCopyInto(out *PodDisruptionBudgetStatus) { + *out = *in + if in.DisruptedPods != nil { + in, out := &in.DisruptedPods, &out.DisruptedPods + *out = make(map[string]metav1.Time, len(*in)) + for key, val := range *in { + (*out)[key] = *val.DeepCopy() + } + } + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]metav1.Condition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodDisruptionBudgetStatus. +func (in *PodDisruptionBudgetStatus) DeepCopy() *PodDisruptionBudgetStatus { + if in == nil { + return nil + } + out := new(PodDisruptionBudgetStatus) + in.DeepCopyInto(out) + return out +} diff --git a/vendor/k8s.io/api/policy/v1beta1/BUILD b/vendor/k8s.io/api/policy/v1beta1/BUILD deleted file mode 100644 index 95c1333f67f4..000000000000 --- a/vendor/k8s.io/api/policy/v1beta1/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - "zz_generated.prerelease-lifecycle.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/api/policy/v1beta1", - importpath = "k8s.io/api/policy/v1beta1", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/api/policy/v1beta1/generated.pb.go b/vendor/k8s.io/api/policy/v1beta1/generated.pb.go index 40ec7ef7fbf6..9cce671dffae 100644 --- a/vendor/k8s.io/api/policy/v1beta1/generated.pb.go +++ b/vendor/k8s.io/api/policy/v1beta1/generated.pb.go @@ -609,125 +609,126 @@ func init() { } var fileDescriptor_014060e454a820dc = []byte{ - // 1878 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x58, 0xdd, 0x6e, 0x1b, 0xc7, - 0x15, 0xd6, 0x9a, 0xfa, 0xa1, 0x46, 0x3f, 0x16, 0x47, 0x3f, 0x5e, 0x2b, 0x0d, 0xd7, 0xd9, 0x00, - 0x85, 0x9b, 0x26, 0xcb, 0x58, 0x76, 0x5c, 0xa3, 0x69, 0x8b, 0x68, 0x45, 0xc9, 0x56, 0x60, 0x59, - 0xec, 0xd0, 0x0e, 0xda, 0xc2, 0x2d, 0x3a, 0xe4, 0x8e, 0xa8, 0x8d, 0x96, 0xbb, 0xdb, 0x99, 0x59, - 0x46, 0xbc, 0xeb, 0x45, 0x2f, 0x7a, 0xd9, 0x17, 0x08, 0xfa, 0x00, 0x45, 0xaf, 0xfa, 0x12, 0x0e, - 0x50, 0x04, 0xb9, 0x0c, 0x7a, 0x41, 0xd4, 0xec, 0x5b, 0xf8, 0xaa, 0xd8, 0xe1, 0xec, 0x92, 0xfb, - 0x47, 0x5a, 0x01, 0xec, 0x3b, 0xee, 0x9c, 0xef, 0xfb, 0xce, 0xcc, 0x99, 0x33, 0x67, 0x0e, 0x07, - 0x98, 0x17, 0x0f, 0x98, 0x61, 0x7b, 0xb5, 0x8b, 0xa0, 0x45, 0xa8, 0x4b, 0x38, 0x61, 0xb5, 0x1e, - 0x71, 0x2d, 0x8f, 0xd6, 0xa4, 0x01, 0xfb, 0x76, 0xcd, 0xf7, 0x1c, 0xbb, 0xdd, 0xaf, 0xf5, 0xee, - 0xb4, 0x08, 0xc7, 0x77, 0x6a, 0x1d, 0xe2, 0x12, 0x8a, 0x39, 0xb1, 0x0c, 0x9f, 0x7a, 0xdc, 0x83, - 0x37, 0x47, 0x50, 0x03, 0xfb, 0xb6, 0x31, 0x82, 0x1a, 0x12, 0xba, 0xfb, 0x51, 0xc7, 0xe6, 0xe7, - 0x41, 0xcb, 0x68, 0x7b, 0xdd, 0x5a, 0xc7, 0xeb, 0x78, 0x35, 0xc1, 0x68, 0x05, 0x67, 0xe2, 0x4b, - 0x7c, 0x88, 0x5f, 0x23, 0xa5, 0x5d, 0x7d, 0xc2, 0x69, 0xdb, 0xa3, 0xa4, 0xd6, 0xcb, 0x78, 0xdb, - 0xbd, 0x37, 0xc6, 0x74, 0x71, 0xfb, 0xdc, 0x76, 0x09, 0xed, 0xd7, 0xfc, 0x8b, 0x4e, 0x38, 0xc0, - 0x6a, 0x5d, 0xc2, 0x71, 0x1e, 0xab, 0x56, 0xc4, 0xa2, 0x81, 0xcb, 0xed, 0x2e, 0xc9, 0x10, 0xee, - 0xcf, 0x22, 0xb0, 0xf6, 0x39, 0xe9, 0xe2, 0x0c, 0xef, 0x6e, 0x11, 0x2f, 0xe0, 0xb6, 0x53, 0xb3, - 0x5d, 0xce, 0x38, 0x4d, 0x93, 0xf4, 0x7b, 0x60, 0x63, 0xdf, 0x71, 0xbc, 0xaf, 0x88, 0x75, 0xd0, - 0x3c, 0xae, 0x53, 0xbb, 0x47, 0x28, 0xbc, 0x05, 0xe6, 0x5d, 0xdc, 0x25, 0xaa, 0x72, 0x4b, 0xb9, - 0xbd, 0x6c, 0xae, 0xbe, 0x18, 0x68, 0x73, 0xc3, 0x81, 0x36, 0xff, 0x04, 0x77, 0x09, 0x12, 0x16, - 0xfd, 0x53, 0x50, 0x91, 0xac, 0x23, 0x87, 0x5c, 0x7e, 0xe1, 0x39, 0x41, 0x97, 0xc0, 0x1f, 0x83, - 0x45, 0x4b, 0x08, 0x48, 0xe2, 0xba, 0x24, 0x2e, 0x8e, 0x64, 0x91, 0xb4, 0xea, 0x0c, 0x5c, 0x97, - 0xe4, 0x47, 0x1e, 0xe3, 0x0d, 0xcc, 0xcf, 0xe1, 0x1e, 0x00, 0x3e, 0xe6, 0xe7, 0x0d, 0x4a, 0xce, - 0xec, 0x4b, 0x49, 0x87, 0x92, 0x0e, 0x1a, 0xb1, 0x05, 0x4d, 0xa0, 0xe0, 0x87, 0xa0, 0x4c, 0x09, - 0xb6, 0x4e, 0x5d, 0xa7, 0xaf, 0x5e, 0xbb, 0xa5, 0xdc, 0x2e, 0x9b, 0x1b, 0x92, 0x51, 0x46, 0x72, - 0x1c, 0xc5, 0x08, 0xfd, 0x3f, 0x0a, 0x28, 0x1f, 0xf6, 0xec, 0x36, 0xb7, 0x3d, 0x17, 0xfe, 0x11, - 0x94, 0xc3, 0xdd, 0xb2, 0x30, 0xc7, 0xc2, 0xd9, 0xca, 0xde, 0xc7, 0xc6, 0x38, 0x93, 0xe2, 0xe0, - 0x19, 0xfe, 0x45, 0x27, 0x1c, 0x60, 0x46, 0x88, 0x36, 0x7a, 0x77, 0x8c, 0xd3, 0xd6, 0x97, 0xa4, - 0xcd, 0x4f, 0x08, 0xc7, 0xe3, 0xe9, 0x8d, 0xc7, 0x50, 0xac, 0x0a, 0x1d, 0xb0, 0x66, 0x11, 0x87, - 0x70, 0x72, 0xea, 0x87, 0x1e, 0x99, 0x98, 0xe1, 0xca, 0xde, 0xdd, 0xd7, 0x73, 0x53, 0x9f, 0xa4, - 0x9a, 0x95, 0xe1, 0x40, 0x5b, 0x4b, 0x0c, 0xa1, 0xa4, 0xb8, 0xfe, 0xb5, 0x02, 0x76, 0x8e, 0x9a, - 0x0f, 0xa9, 0x17, 0xf8, 0x4d, 0x1e, 0xee, 0x6e, 0xa7, 0x2f, 0x4d, 0xf0, 0x67, 0x60, 0x9e, 0x06, - 0x4e, 0xb4, 0x97, 0xef, 0x47, 0x7b, 0x89, 0x02, 0x87, 0xbc, 0x1a, 0x68, 0x9b, 0x29, 0xd6, 0xd3, - 0xbe, 0x4f, 0x90, 0x20, 0xc0, 0xcf, 0xc1, 0x22, 0xc5, 0x6e, 0x87, 0x84, 0x53, 0x2f, 0xdd, 0x5e, - 0xd9, 0xd3, 0x8d, 0xc2, 0xb3, 0x66, 0x1c, 0xd7, 0x51, 0x08, 0x1d, 0xef, 0xb8, 0xf8, 0x64, 0x48, - 0x2a, 0xe8, 0x27, 0x60, 0x4d, 0x6c, 0xb5, 0x47, 0xb9, 0xb0, 0xc0, 0x77, 0x41, 0xa9, 0x6b, 0xbb, - 0x62, 0x52, 0x0b, 0xe6, 0x8a, 0x64, 0x95, 0x4e, 0x6c, 0x17, 0x85, 0xe3, 0xc2, 0x8c, 0x2f, 0x45, - 0xcc, 0x26, 0xcd, 0xf8, 0x12, 0x85, 0xe3, 0xfa, 0x43, 0xb0, 0x24, 0x3d, 0x4e, 0x0a, 0x95, 0xa6, - 0x0b, 0x95, 0x72, 0x84, 0xfe, 0x71, 0x0d, 0x6c, 0x36, 0x3c, 0xab, 0x6e, 0x33, 0x1a, 0x88, 0x78, - 0x99, 0x81, 0xd5, 0x21, 0xfc, 0x2d, 0xe4, 0xc7, 0x53, 0x30, 0xcf, 0x7c, 0xd2, 0x96, 0x69, 0xb1, - 0x37, 0x25, 0xb6, 0x39, 0xf3, 0x6b, 0xfa, 0xa4, 0x3d, 0x3e, 0x96, 0xe1, 0x17, 0x12, 0x6a, 0xf0, - 0x39, 0x58, 0x64, 0x1c, 0xf3, 0x80, 0xa9, 0x25, 0xa1, 0x7b, 0xef, 0x8a, 0xba, 0x82, 0x3b, 0xde, - 0xc5, 0xd1, 0x37, 0x92, 0x9a, 0xfa, 0xbf, 0x15, 0x70, 0x23, 0x87, 0xf5, 0xd8, 0x66, 0x1c, 0x3e, - 0xcf, 0x44, 0xcc, 0x78, 0xbd, 0x88, 0x85, 0x6c, 0x11, 0xaf, 0xf8, 0xf0, 0x46, 0x23, 0x13, 0xd1, - 0x6a, 0x82, 0x05, 0x9b, 0x93, 0x6e, 0x94, 0x8a, 0xc6, 0xd5, 0x96, 0x65, 0xae, 0x49, 0xe9, 0x85, - 0xe3, 0x50, 0x04, 0x8d, 0xb4, 0xf4, 0x6f, 0xaf, 0xe5, 0x2e, 0x27, 0x0c, 0x27, 0x3c, 0x03, 0xab, - 0x5d, 0xdb, 0xdd, 0xef, 0x61, 0xdb, 0xc1, 0x2d, 0x79, 0x7a, 0xa6, 0x25, 0x41, 0x58, 0x61, 0x8d, - 0x51, 0x85, 0x35, 0x8e, 0x5d, 0x7e, 0x4a, 0x9b, 0x9c, 0xda, 0x6e, 0xc7, 0xdc, 0x18, 0x0e, 0xb4, - 0xd5, 0x93, 0x09, 0x25, 0x94, 0xd0, 0x85, 0xbf, 0x07, 0x65, 0x46, 0x1c, 0xd2, 0xe6, 0x1e, 0xbd, - 0x5a, 0x85, 0x78, 0x8c, 0x5b, 0xc4, 0x69, 0x4a, 0xaa, 0xb9, 0x1a, 0xc6, 0x2d, 0xfa, 0x42, 0xb1, - 0x24, 0x74, 0xc0, 0x7a, 0x17, 0x5f, 0x3e, 0x73, 0x71, 0xbc, 0x90, 0xd2, 0x0f, 0x5c, 0x08, 0x1c, - 0x0e, 0xb4, 0xf5, 0x93, 0x84, 0x16, 0x4a, 0x69, 0xeb, 0xc3, 0x79, 0x70, 0xb3, 0x30, 0xab, 0xe0, - 0xe7, 0x00, 0x7a, 0x2d, 0x46, 0x68, 0x8f, 0x58, 0x0f, 0x47, 0x77, 0x90, 0xed, 0x45, 0x07, 0x77, - 0x57, 0x6e, 0x10, 0x3c, 0xcd, 0x20, 0x50, 0x0e, 0x0b, 0xfe, 0x45, 0x01, 0x6b, 0xd6, 0xc8, 0x0d, - 0xb1, 0x1a, 0x9e, 0x15, 0x25, 0xc6, 0xc3, 0x1f, 0x92, 0xef, 0x46, 0x7d, 0x52, 0xe9, 0xd0, 0xe5, - 0xb4, 0x6f, 0x6e, 0xcb, 0x09, 0xad, 0x25, 0x6c, 0x28, 0xe9, 0x34, 0x5c, 0x92, 0x15, 0x4b, 0x32, - 0x79, 0xa7, 0x89, 0x10, 0x2f, 0x8c, 0x97, 0x54, 0xcf, 0x20, 0x50, 0x0e, 0x0b, 0xfe, 0x0a, 0xac, - 0xb7, 0x03, 0x4a, 0x89, 0xcb, 0x1f, 0x11, 0xec, 0xf0, 0xf3, 0xbe, 0x3a, 0x2f, 0x74, 0x76, 0xa4, - 0xce, 0xfa, 0x41, 0xc2, 0x8a, 0x52, 0xe8, 0x90, 0x6f, 0x11, 0x66, 0x53, 0x62, 0x45, 0xfc, 0x85, - 0x24, 0xbf, 0x9e, 0xb0, 0xa2, 0x14, 0x1a, 0x3e, 0x00, 0xab, 0xe4, 0xd2, 0x27, 0xed, 0x28, 0xa0, - 0x8b, 0x82, 0xbd, 0x25, 0xd9, 0xab, 0x87, 0x13, 0x36, 0x94, 0x40, 0xee, 0x3a, 0x00, 0x66, 0x23, - 0x08, 0x37, 0x40, 0xe9, 0x82, 0xf4, 0x47, 0xd7, 0x0e, 0x0a, 0x7f, 0xc2, 0xcf, 0xc0, 0x42, 0x0f, - 0x3b, 0x01, 0x91, 0x89, 0xfe, 0xc1, 0xeb, 0x25, 0xfa, 0x53, 0xbb, 0x4b, 0xd0, 0x88, 0xf8, 0xf3, - 0x6b, 0x0f, 0x14, 0xfd, 0x1b, 0x05, 0x54, 0x1a, 0x9e, 0xd5, 0x24, 0xed, 0x80, 0xda, 0xbc, 0xdf, - 0x10, 0x9b, 0xfc, 0x16, 0x0a, 0x36, 0x4a, 0x14, 0xec, 0x8f, 0xa7, 0x27, 0x5a, 0x72, 0x76, 0x45, - 0xe5, 0x5a, 0x7f, 0xa1, 0x80, 0xed, 0x0c, 0xfa, 0x2d, 0x94, 0xd3, 0x5f, 0x27, 0xcb, 0xe9, 0x87, - 0x57, 0x59, 0x4c, 0x41, 0x31, 0xfd, 0xa6, 0x92, 0xb3, 0x14, 0x51, 0x4a, 0xc3, 0xd6, 0x8e, 0xda, - 0x3d, 0xdb, 0x21, 0x1d, 0x62, 0x89, 0xc5, 0x94, 0x27, 0x5a, 0xbb, 0xd8, 0x82, 0x26, 0x50, 0x90, - 0x81, 0x1d, 0x8b, 0x9c, 0xe1, 0xc0, 0xe1, 0xfb, 0x96, 0x75, 0x80, 0x7d, 0xdc, 0xb2, 0x1d, 0x9b, - 0xdb, 0xb2, 0x17, 0x59, 0x36, 0x3f, 0x1d, 0x0e, 0xb4, 0x9d, 0x7a, 0x2e, 0xe2, 0xd5, 0x40, 0x7b, - 0x37, 0xdb, 0xca, 0x1b, 0x31, 0xa4, 0x8f, 0x0a, 0xa4, 0x61, 0x1f, 0xa8, 0x94, 0xfc, 0x29, 0x08, - 0x0f, 0x45, 0x9d, 0x7a, 0x7e, 0xc2, 0x6d, 0x49, 0xb8, 0xfd, 0xe5, 0x70, 0xa0, 0xa9, 0xa8, 0x00, - 0x33, 0xdb, 0x71, 0xa1, 0x3c, 0xfc, 0x12, 0x6c, 0x62, 0xd9, 0x84, 0x4f, 0x7a, 0x9d, 0x17, 0x5e, - 0x1f, 0x0c, 0x07, 0xda, 0xe6, 0x7e, 0xd6, 0x3c, 0xdb, 0x61, 0x9e, 0x28, 0xac, 0x81, 0xa5, 0x9e, - 0xe8, 0xd7, 0x99, 0xba, 0x20, 0xf4, 0xb7, 0x87, 0x03, 0x6d, 0x69, 0xd4, 0xc2, 0x87, 0x9a, 0x8b, - 0x47, 0x4d, 0xd1, 0x05, 0x46, 0x28, 0xf8, 0x09, 0x58, 0x39, 0xf7, 0x18, 0x7f, 0x42, 0xf8, 0x57, - 0x1e, 0xbd, 0x10, 0x85, 0xa1, 0x6c, 0x6e, 0xca, 0x1d, 0x5c, 0x79, 0x34, 0x36, 0xa1, 0x49, 0x1c, - 0xfc, 0x2d, 0x58, 0x3e, 0x97, 0x3d, 0x1f, 0x53, 0x97, 0x44, 0xa2, 0xdd, 0x9e, 0x92, 0x68, 0x89, - 0xfe, 0xd0, 0xac, 0x48, 0xf9, 0xe5, 0x68, 0x98, 0xa1, 0xb1, 0x1a, 0xfc, 0x09, 0x58, 0x12, 0x1f, - 0xc7, 0x75, 0xb5, 0x2c, 0x66, 0x73, 0x5d, 0xc2, 0x97, 0x1e, 0x8d, 0x86, 0x51, 0x64, 0x8f, 0xa0, - 0xc7, 0x8d, 0x03, 0x75, 0x39, 0x0b, 0x3d, 0x6e, 0x1c, 0xa0, 0xc8, 0x0e, 0x9f, 0x83, 0x25, 0x46, - 0x1e, 0xdb, 0x6e, 0x70, 0xa9, 0x02, 0x71, 0xe4, 0xee, 0x4c, 0x99, 0x6e, 0xf3, 0x50, 0x20, 0x53, - 0xdd, 0xf6, 0x58, 0x5d, 0xda, 0x51, 0x24, 0x09, 0x2d, 0xb0, 0x4c, 0x03, 0x77, 0x9f, 0x3d, 0x63, - 0x84, 0xaa, 0x2b, 0x99, 0xab, 0x3e, 0xad, 0x8f, 0x22, 0x6c, 0xda, 0x43, 0x1c, 0x99, 0x18, 0x81, - 0xc6, 0xc2, 0xd0, 0x02, 0x40, 0x7c, 0x88, 0xa6, 0x5e, 0xdd, 0x99, 0xd9, 0x04, 0xa2, 0x18, 0x9c, - 0xf6, 0xb3, 0x1e, 0x1e, 0xcf, 0xb1, 0x19, 0x4d, 0xe8, 0xc2, 0xbf, 0x2a, 0x00, 0xb2, 0xc0, 0xf7, - 0x1d, 0xd2, 0x25, 0x2e, 0xc7, 0x8e, 0x18, 0x65, 0xea, 0xaa, 0x70, 0xf7, 0x8b, 0x69, 0x51, 0xcb, - 0x90, 0xd2, 0x6e, 0xe3, 0x6b, 0x33, 0x0b, 0x45, 0x39, 0x3e, 0xc3, 0x4d, 0x3b, 0x93, 0xab, 0x5d, - 0x9b, 0xb9, 0x69, 0xf9, 0x7f, 0x91, 0xc6, 0x9b, 0x26, 0xed, 0x28, 0x92, 0x84, 0x5f, 0x80, 0x9d, - 0xe8, 0x0f, 0x24, 0xf2, 0x3c, 0x7e, 0x64, 0x3b, 0x84, 0xf5, 0x19, 0x27, 0x5d, 0x75, 0x5d, 0x24, - 0x53, 0x55, 0x32, 0x77, 0x50, 0x2e, 0x0a, 0x15, 0xb0, 0x61, 0x17, 0x68, 0x51, 0x11, 0x0a, 0x4f, - 0x68, 0x5c, 0x05, 0x0f, 0x59, 0x1b, 0x3b, 0xa3, 0xc6, 0xe8, 0xba, 0x70, 0xf0, 0xfe, 0x70, 0xa0, - 0x69, 0xf5, 0xe9, 0x50, 0x34, 0x4b, 0x0b, 0xfe, 0x06, 0xa8, 0xb8, 0xc8, 0xcf, 0x86, 0xf0, 0xf3, - 0xa3, 0xb0, 0xb2, 0x15, 0x3a, 0x28, 0x64, 0x43, 0x1f, 0x6c, 0xe0, 0xe4, 0x5f, 0x79, 0xa6, 0x56, - 0xc4, 0x59, 0xff, 0x60, 0xca, 0x3e, 0xa4, 0xfe, 0xfd, 0x9b, 0xaa, 0x0c, 0xe3, 0x46, 0xca, 0xc0, - 0x50, 0x46, 0x1d, 0x5e, 0x02, 0x88, 0xd3, 0x2f, 0x0f, 0x4c, 0x85, 0x33, 0x2f, 0xb2, 0xcc, 0x73, - 0xc5, 0x38, 0xd5, 0x32, 0x26, 0x86, 0x72, 0x7c, 0x40, 0x0e, 0x2a, 0x38, 0xf5, 0x52, 0xc2, 0xd4, - 0x1b, 0xc2, 0xf1, 0x4f, 0x67, 0x3b, 0x8e, 0x39, 0xe6, 0x4d, 0xe9, 0xb7, 0x92, 0xb6, 0x30, 0x94, - 0x75, 0x00, 0x1f, 0x83, 0x2d, 0x39, 0xf8, 0xcc, 0x65, 0xf8, 0x8c, 0x34, 0xfb, 0xac, 0xcd, 0x1d, - 0xa6, 0x6e, 0x8a, 0xda, 0xad, 0x0e, 0x07, 0xda, 0xd6, 0x7e, 0x8e, 0x1d, 0xe5, 0xb2, 0xe0, 0x67, - 0x60, 0xe3, 0xcc, 0xa3, 0x2d, 0xdb, 0xb2, 0x88, 0x1b, 0x29, 0x6d, 0x09, 0xa5, 0xad, 0x30, 0xfe, - 0x47, 0x29, 0x1b, 0xca, 0xa0, 0x21, 0x03, 0xdb, 0x52, 0xb9, 0x41, 0xbd, 0xf6, 0x89, 0x17, 0xb8, - 0x3c, 0xbc, 0x2e, 0x98, 0xba, 0x1d, 0x5f, 0x91, 0xdb, 0xfb, 0x79, 0x80, 0x57, 0x03, 0xed, 0x56, - 0xce, 0x75, 0x95, 0x00, 0xa1, 0x7c, 0x6d, 0xe8, 0x80, 0x55, 0xf9, 0xf6, 0x75, 0xe0, 0x60, 0xc6, - 0x54, 0x55, 0x1c, 0xf5, 0xfb, 0xd3, 0x0b, 0x5b, 0x0c, 0x4f, 0x9f, 0x77, 0xf1, 0xa7, 0x6c, 0x12, - 0x80, 0x12, 0xea, 0xfa, 0xdf, 0x15, 0x70, 0xb3, 0xb0, 0x30, 0xc2, 0xfb, 0x89, 0x07, 0x15, 0x3d, - 0xf5, 0xa0, 0x02, 0xb3, 0xc4, 0x37, 0xf0, 0x9e, 0xf2, 0xb5, 0x02, 0xd4, 0xa2, 0x1b, 0x02, 0x7e, - 0x92, 0x98, 0xe0, 0x7b, 0xa9, 0x09, 0x56, 0x32, 0xbc, 0x37, 0x30, 0xbf, 0x6f, 0x15, 0xf0, 0xce, - 0x94, 0x1d, 0x88, 0x0b, 0x12, 0xb1, 0x26, 0x51, 0x4f, 0x70, 0x78, 0x94, 0x15, 0x91, 0x47, 0xe3, - 0x82, 0x94, 0x83, 0x41, 0x85, 0x6c, 0xf8, 0x0c, 0xdc, 0x90, 0xd5, 0x30, 0x6d, 0x13, 0x9d, 0xfb, - 0xb2, 0xf9, 0xce, 0x70, 0xa0, 0xdd, 0xa8, 0xe7, 0x43, 0x50, 0x11, 0x57, 0xff, 0xa7, 0x02, 0x76, - 0xf2, 0xaf, 0x7c, 0x78, 0x37, 0x11, 0x6e, 0x2d, 0x15, 0xee, 0xeb, 0x29, 0x96, 0x0c, 0xf6, 0x1f, - 0xc0, 0xba, 0x6c, 0x0c, 0x92, 0xef, 0x83, 0x89, 0xa0, 0x87, 0x47, 0x24, 0xec, 0xe9, 0xa5, 0x44, - 0x94, 0xbe, 0xe2, 0xaf, 0x78, 0x72, 0x0c, 0xa5, 0xd4, 0xf4, 0x7f, 0x29, 0xe0, 0xbd, 0x99, 0x97, - 0x2d, 0x34, 0x13, 0x53, 0x37, 0x52, 0x53, 0xaf, 0x16, 0x0b, 0xbc, 0x99, 0x67, 0x42, 0xf3, 0xa3, - 0x17, 0x2f, 0xab, 0x73, 0xdf, 0xbd, 0xac, 0xce, 0x7d, 0xff, 0xb2, 0x3a, 0xf7, 0xe7, 0x61, 0x55, - 0x79, 0x31, 0xac, 0x2a, 0xdf, 0x0d, 0xab, 0xca, 0xf7, 0xc3, 0xaa, 0xf2, 0xdf, 0x61, 0x55, 0xf9, - 0xdb, 0xff, 0xaa, 0x73, 0xbf, 0x5b, 0x92, 0x72, 0xff, 0x0f, 0x00, 0x00, 0xff, 0xff, 0x5d, 0xe0, - 0x55, 0x1c, 0x41, 0x18, 0x00, 0x00, + // 1904 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x58, 0x5b, 0x6f, 0xdc, 0xc6, + 0x15, 0x16, 0xbd, 0xba, 0xac, 0x46, 0x17, 0x6b, 0x47, 0x17, 0xd3, 0x4a, 0xb3, 0x74, 0x18, 0xa0, + 0x70, 0xd3, 0x84, 0x1b, 0xcb, 0x8e, 0x6b, 0x34, 0x6d, 0x11, 0x51, 0x2b, 0xd9, 0x0a, 0x2c, 0x6b, + 0x3b, 0x6b, 0x07, 0x6d, 0xe1, 0x16, 0x9d, 0x25, 0x47, 0x2b, 0x46, 0x5c, 0x92, 0xe5, 0x0c, 0x37, + 0xda, 0xb7, 0x3e, 0xf4, 0xa1, 0x8f, 0xfd, 0x03, 0x41, 0x7f, 0x40, 0xd1, 0xa7, 0xfe, 0x88, 0x3a, + 0x40, 0x11, 0xe4, 0x31, 0xe8, 0xc3, 0xa2, 0xde, 0xfe, 0x0b, 0x3f, 0x05, 0x9c, 0x1d, 0x72, 0x79, + 0xdd, 0xb5, 0x0d, 0xd8, 0x6f, 0xe4, 0x9c, 0xef, 0xfb, 0xce, 0xcc, 0x99, 0x33, 0x67, 0x2e, 0x40, + 0xbf, 0xb8, 0x47, 0x35, 0xcb, 0x6d, 0x5c, 0x04, 0x1d, 0xe2, 0x3b, 0x84, 0x11, 0xda, 0xe8, 0x13, + 0xc7, 0x74, 0xfd, 0x86, 0x30, 0x60, 0xcf, 0x6a, 0x78, 0xae, 0x6d, 0x19, 0x83, 0x46, 0xff, 0x56, + 0x87, 0x30, 0x7c, 0xab, 0xd1, 0x25, 0x0e, 0xf1, 0x31, 0x23, 0xa6, 0xe6, 0xf9, 0x2e, 0x73, 0xe1, + 0xf5, 0x31, 0x54, 0xc3, 0x9e, 0xa5, 0x8d, 0xa1, 0x9a, 0x80, 0xee, 0x7e, 0xd4, 0xb5, 0xd8, 0x79, + 0xd0, 0xd1, 0x0c, 0xb7, 0xd7, 0xe8, 0xba, 0x5d, 0xb7, 0xc1, 0x19, 0x9d, 0xe0, 0x8c, 0xff, 0xf1, + 0x1f, 0xfe, 0x35, 0x56, 0xda, 0x55, 0x13, 0x4e, 0x0d, 0xd7, 0x27, 0x8d, 0x7e, 0xce, 0xdb, 0xee, + 0x9d, 0x09, 0xa6, 0x87, 0x8d, 0x73, 0xcb, 0x21, 0xfe, 0xa0, 0xe1, 0x5d, 0x74, 0xc3, 0x06, 0xda, + 0xe8, 0x11, 0x86, 0x8b, 0x58, 0x8d, 0x32, 0x96, 0x1f, 0x38, 0xcc, 0xea, 0x91, 0x1c, 0xe1, 0xee, + 0x2c, 0x02, 0x35, 0xce, 0x49, 0x0f, 0xe7, 0x78, 0xb7, 0xcb, 0x78, 0x01, 0xb3, 0xec, 0x86, 0xe5, + 0x30, 0xca, 0xfc, 0x2c, 0x49, 0xbd, 0x03, 0x36, 0xf6, 0x6d, 0xdb, 0xfd, 0x8a, 0x98, 0x07, 0xed, + 0xe3, 0xa6, 0x6f, 0xf5, 0x89, 0x0f, 0x6f, 0x80, 0x79, 0x07, 0xf7, 0x88, 0x2c, 0xdd, 0x90, 0x6e, + 0x2e, 0xeb, 0xab, 0xcf, 0x86, 0xca, 0xdc, 0x68, 0xa8, 0xcc, 0x3f, 0xc2, 0x3d, 0x82, 0xb8, 0x45, + 0xfd, 0x14, 0xd4, 0x04, 0xeb, 0xc8, 0x26, 0x97, 0x5f, 0xb8, 0x76, 0xd0, 0x23, 0xf0, 0xc7, 0x60, + 0xd1, 0xe4, 0x02, 0x82, 0xb8, 0x2e, 0x88, 0x8b, 0x63, 0x59, 0x24, 0xac, 0x2a, 0x05, 0x57, 0x05, + 0xf9, 0x81, 0x4b, 0x59, 0x0b, 0xb3, 0x73, 0xb8, 0x07, 0x80, 0x87, 0xd9, 0x79, 0xcb, 0x27, 0x67, + 0xd6, 0xa5, 0xa0, 0x43, 0x41, 0x07, 0xad, 0xd8, 0x82, 0x12, 0x28, 0xf8, 0x21, 0xa8, 0xfa, 0x04, + 0x9b, 0xa7, 0x8e, 0x3d, 0x90, 0xaf, 0xdc, 0x90, 0x6e, 0x56, 0xf5, 0x0d, 0xc1, 0xa8, 0x22, 0xd1, + 0x8e, 0x62, 0x84, 0xfa, 0x5f, 0x09, 0x54, 0x0f, 0xfb, 0x96, 0xc1, 0x2c, 0xd7, 0x81, 0x7f, 0x04, + 0xd5, 0x70, 0xb6, 0x4c, 0xcc, 0x30, 0x77, 0xb6, 0xb2, 0xf7, 0xb1, 0x36, 0xc9, 0xa4, 0x38, 0x78, + 0x9a, 0x77, 0xd1, 0x0d, 0x1b, 0xa8, 0x16, 0xa2, 0xb5, 0xfe, 0x2d, 0xed, 0xb4, 0xf3, 0x25, 0x31, + 0xd8, 0x09, 0x61, 0x78, 0xd2, 0xbd, 0x49, 0x1b, 0x8a, 0x55, 0xa1, 0x0d, 0xd6, 0x4c, 0x62, 0x13, + 0x46, 0x4e, 0xbd, 0xd0, 0x23, 0xe5, 0x3d, 0x5c, 0xd9, 0xbb, 0xfd, 0x72, 0x6e, 0x9a, 0x49, 0xaa, + 0x5e, 0x1b, 0x0d, 0x95, 0xb5, 0x54, 0x13, 0x4a, 0x8b, 0xab, 0x5f, 0x4b, 0x60, 0xe7, 0xa8, 0x7d, + 0xdf, 0x77, 0x03, 0xaf, 0xcd, 0xc2, 0xd9, 0xed, 0x0e, 0x84, 0x09, 0xfe, 0x0c, 0xcc, 0xfb, 0x81, + 0x1d, 0xcd, 0xe5, 0xfb, 0xd1, 0x5c, 0xa2, 0xc0, 0x26, 0x2f, 0x86, 0xca, 0x66, 0x86, 0xf5, 0x78, + 0xe0, 0x11, 0xc4, 0x09, 0xf0, 0x73, 0xb0, 0xe8, 0x63, 0xa7, 0x4b, 0xc2, 0xae, 0x57, 0x6e, 0xae, + 0xec, 0xa9, 0x5a, 0xe9, 0x5a, 0xd3, 0x8e, 0x9b, 0x28, 0x84, 0x4e, 0x66, 0x9c, 0xff, 0x52, 0x24, + 0x14, 0xd4, 0x13, 0xb0, 0xc6, 0xa7, 0xda, 0xf5, 0x19, 0xb7, 0xc0, 0x77, 0x41, 0xa5, 0x67, 0x39, + 0xbc, 0x53, 0x0b, 0xfa, 0x8a, 0x60, 0x55, 0x4e, 0x2c, 0x07, 0x85, 0xed, 0xdc, 0x8c, 0x2f, 0x79, + 0xcc, 0x92, 0x66, 0x7c, 0x89, 0xc2, 0x76, 0xf5, 0x3e, 0x58, 0x12, 0x1e, 0x93, 0x42, 0x95, 0xe9, + 0x42, 0x95, 0x02, 0xa1, 0x7f, 0x5c, 0x01, 0x9b, 0x2d, 0xd7, 0x6c, 0x5a, 0xd4, 0x0f, 0x78, 0xbc, + 0xf4, 0xc0, 0xec, 0x12, 0xf6, 0x16, 0xf2, 0xe3, 0x31, 0x98, 0xa7, 0x1e, 0x31, 0x44, 0x5a, 0xec, + 0x4d, 0x89, 0x6d, 0x41, 0xff, 0xda, 0x1e, 0x31, 0x26, 0xcb, 0x32, 0xfc, 0x43, 0x5c, 0x0d, 0x3e, + 0x05, 0x8b, 0x94, 0x61, 0x16, 0x50, 0xb9, 0xc2, 0x75, 0xef, 0xbc, 0xa2, 0x2e, 0xe7, 0x4e, 0x66, + 0x71, 0xfc, 0x8f, 0x84, 0xa6, 0xfa, 0x1f, 0x09, 0x5c, 0x2b, 0x60, 0x3d, 0xb4, 0x28, 0x83, 0x4f, + 0x73, 0x11, 0xd3, 0x5e, 0x2e, 0x62, 0x21, 0x9b, 0xc7, 0x2b, 0x5e, 0xbc, 0x51, 0x4b, 0x22, 0x5a, + 0x6d, 0xb0, 0x60, 0x31, 0xd2, 0x8b, 0x52, 0x51, 0x7b, 0xb5, 0x61, 0xe9, 0x6b, 0x42, 0x7a, 0xe1, + 0x38, 0x14, 0x41, 0x63, 0x2d, 0xf5, 0xdb, 0x2b, 0x85, 0xc3, 0x09, 0xc3, 0x09, 0xcf, 0xc0, 0x6a, + 0xcf, 0x72, 0xf6, 0xfb, 0xd8, 0xb2, 0x71, 0x47, 0xac, 0x9e, 0x69, 0x49, 0x10, 0x56, 0x58, 0x6d, + 0x5c, 0x61, 0xb5, 0x63, 0x87, 0x9d, 0xfa, 0x6d, 0xe6, 0x5b, 0x4e, 0x57, 0xdf, 0x18, 0x0d, 0x95, + 0xd5, 0x93, 0x84, 0x12, 0x4a, 0xe9, 0xc2, 0xdf, 0x83, 0x2a, 0x25, 0x36, 0x31, 0x98, 0xeb, 0xbf, + 0x5a, 0x85, 0x78, 0x88, 0x3b, 0xc4, 0x6e, 0x0b, 0xaa, 0xbe, 0x1a, 0xc6, 0x2d, 0xfa, 0x43, 0xb1, + 0x24, 0xb4, 0xc1, 0x7a, 0x0f, 0x5f, 0x3e, 0x71, 0x70, 0x3c, 0x90, 0xca, 0x6b, 0x0e, 0x04, 0x8e, + 0x86, 0xca, 0xfa, 0x49, 0x4a, 0x0b, 0x65, 0xb4, 0xd5, 0x7f, 0x2f, 0x80, 0xeb, 0xa5, 0x59, 0x05, + 0x3f, 0x07, 0xd0, 0xed, 0x50, 0xe2, 0xf7, 0x89, 0x79, 0x7f, 0xbc, 0x07, 0x59, 0x6e, 0xb4, 0x70, + 0x77, 0xc5, 0x04, 0xc1, 0xd3, 0x1c, 0x02, 0x15, 0xb0, 0xe0, 0x5f, 0x24, 0xb0, 0x66, 0x8e, 0xdd, + 0x10, 0xb3, 0xe5, 0x9a, 0x51, 0x62, 0xdc, 0x7f, 0x9d, 0x7c, 0xd7, 0x9a, 0x49, 0xa5, 0x43, 0x87, + 0xf9, 0x03, 0x7d, 0x5b, 0x74, 0x68, 0x2d, 0x65, 0x43, 0x69, 0xa7, 0xe1, 0x90, 0xcc, 0x58, 0x92, + 0x8a, 0x3d, 0x8d, 0x87, 0x78, 0x61, 0x32, 0xa4, 0x66, 0x0e, 0x81, 0x0a, 0x58, 0xf0, 0x57, 0x60, + 0xdd, 0x08, 0x7c, 0x9f, 0x38, 0xec, 0x01, 0xc1, 0x36, 0x3b, 0x1f, 0xc8, 0xf3, 0x5c, 0x67, 0x47, + 0xe8, 0xac, 0x1f, 0xa4, 0xac, 0x28, 0x83, 0x0e, 0xf9, 0x26, 0xa1, 0x96, 0x4f, 0xcc, 0x88, 0xbf, + 0x90, 0xe6, 0x37, 0x53, 0x56, 0x94, 0x41, 0xc3, 0x7b, 0x60, 0x95, 0x5c, 0x7a, 0xc4, 0x88, 0x02, + 0xba, 0xc8, 0xd9, 0x5b, 0x82, 0xbd, 0x7a, 0x98, 0xb0, 0xa1, 0x14, 0x12, 0x1a, 0x00, 0x18, 0xae, + 0x63, 0x5a, 0xe3, 0x7d, 0x6e, 0x89, 0x4f, 0x44, 0xe3, 0xe5, 0xb2, 0xf8, 0x20, 0xe2, 0x4d, 0xaa, + 0x65, 0xdc, 0x44, 0x51, 0x42, 0x76, 0xd7, 0x06, 0x30, 0x3f, 0x4d, 0x70, 0x03, 0x54, 0x2e, 0xc8, + 0x60, 0xbc, 0xb7, 0xa1, 0xf0, 0x13, 0x7e, 0x06, 0x16, 0xfa, 0xd8, 0x0e, 0x88, 0x58, 0x4d, 0x1f, + 0xbc, 0x5c, 0x3f, 0x1e, 0x5b, 0x3d, 0x82, 0xc6, 0xc4, 0x9f, 0x5f, 0xb9, 0x27, 0xa9, 0xdf, 0x48, + 0xa0, 0xd6, 0x72, 0xcd, 0x36, 0x31, 0x02, 0xdf, 0x62, 0x83, 0x16, 0xcf, 0xa4, 0xb7, 0xb0, 0x2b, + 0xa0, 0xd4, 0xae, 0xf0, 0xf1, 0xf4, 0x6c, 0x4e, 0xf7, 0xae, 0x6c, 0x4f, 0x50, 0x9f, 0x49, 0x60, + 0x3b, 0x87, 0x7e, 0x0b, 0x35, 0xfb, 0xd7, 0xe9, 0x9a, 0xfd, 0xe1, 0xab, 0x0c, 0xa6, 0xa4, 0x62, + 0x7f, 0x53, 0x2b, 0x18, 0x0a, 0xaf, 0xd7, 0xe1, 0xf9, 0xd1, 0xb7, 0xfa, 0x96, 0x4d, 0xba, 0xc4, + 0xe4, 0x83, 0xa9, 0x26, 0xce, 0x8f, 0xb1, 0x05, 0x25, 0x50, 0x90, 0x82, 0x1d, 0x93, 0x9c, 0xe1, + 0xc0, 0x66, 0xfb, 0xa6, 0x79, 0x80, 0x3d, 0xdc, 0xb1, 0x6c, 0x8b, 0x59, 0xe2, 0xc0, 0xb3, 0xac, + 0x7f, 0x3a, 0x1a, 0x2a, 0x3b, 0xcd, 0x42, 0xc4, 0x8b, 0xa1, 0xf2, 0x6e, 0xfe, 0xbe, 0xa0, 0xc5, + 0x90, 0x01, 0x2a, 0x91, 0x86, 0x03, 0x20, 0xfb, 0xe4, 0x4f, 0x41, 0xb8, 0xf2, 0x9a, 0xbe, 0xeb, + 0xa5, 0xdc, 0x56, 0xb8, 0xdb, 0x5f, 0x8e, 0x86, 0x8a, 0x8c, 0x4a, 0x30, 0xb3, 0x1d, 0x97, 0xca, + 0xc3, 0x2f, 0xc1, 0x26, 0x16, 0x27, 0xfd, 0xa4, 0xd7, 0x79, 0xee, 0xf5, 0xde, 0x68, 0xa8, 0x6c, + 0xee, 0xe7, 0xcd, 0xb3, 0x1d, 0x16, 0x89, 0xc2, 0x06, 0x58, 0xea, 0xf3, 0x4b, 0x01, 0x95, 0x17, + 0xb8, 0xfe, 0xf6, 0x68, 0xa8, 0x2c, 0x8d, 0xef, 0x09, 0xa1, 0xe6, 0xe2, 0x51, 0x9b, 0x1f, 0x35, + 0x23, 0x14, 0xfc, 0x04, 0xac, 0x9c, 0xbb, 0x94, 0x3d, 0x22, 0xec, 0x2b, 0xd7, 0xbf, 0xe0, 0xd5, + 0xa7, 0xaa, 0x6f, 0x8a, 0x19, 0x5c, 0x79, 0x30, 0x31, 0xa1, 0x24, 0x0e, 0xfe, 0x16, 0x2c, 0x9f, + 0x8b, 0x83, 0x65, 0x54, 0x7a, 0x6e, 0x4e, 0x49, 0xb4, 0xd4, 0x21, 0x54, 0xaf, 0x09, 0xf9, 0xe5, + 0xa8, 0x99, 0xa2, 0x89, 0x1a, 0xfc, 0x09, 0x58, 0xe2, 0x3f, 0xc7, 0x4d, 0xb9, 0xca, 0x7b, 0x73, + 0x55, 0xc0, 0x97, 0x1e, 0x8c, 0x9b, 0x51, 0x64, 0x8f, 0xa0, 0xc7, 0xad, 0x03, 0x79, 0x39, 0x0f, + 0x3d, 0x6e, 0x1d, 0xa0, 0xc8, 0x0e, 0x9f, 0x82, 0x25, 0x4a, 0x1e, 0x5a, 0x4e, 0x70, 0x29, 0x03, + 0xbe, 0xe4, 0x6e, 0x4d, 0xe9, 0x6e, 0xfb, 0x90, 0x23, 0x33, 0x47, 0xfa, 0x89, 0xba, 0xb0, 0xa3, + 0x48, 0x12, 0x9a, 0x60, 0xd9, 0x0f, 0x9c, 0x7d, 0xfa, 0x84, 0x12, 0x5f, 0x5e, 0xc9, 0x9d, 0x27, + 0xb2, 0xfa, 0x28, 0xc2, 0x66, 0x3d, 0xc4, 0x91, 0x89, 0x11, 0x68, 0x22, 0x0c, 0x4d, 0x00, 0xf8, + 0x0f, 0xbf, 0x39, 0xc8, 0x3b, 0x33, 0x4f, 0x9a, 0x28, 0x06, 0x67, 0xfd, 0xac, 0x87, 0xcb, 0x73, + 0x62, 0x46, 0x09, 0x5d, 0xf8, 0x57, 0x09, 0x40, 0x1a, 0x78, 0x9e, 0x4d, 0x7a, 0xc4, 0x61, 0xd8, + 0xe6, 0xad, 0x54, 0x5e, 0xe5, 0xee, 0x7e, 0x31, 0x2d, 0x6a, 0x39, 0x52, 0xd6, 0x6d, 0xbc, 0x37, + 0xe7, 0xa1, 0xa8, 0xc0, 0x67, 0x38, 0x69, 0x67, 0x62, 0xb4, 0x6b, 0x33, 0x27, 0xad, 0xf8, 0x1e, + 0x36, 0x99, 0x34, 0x61, 0x47, 0x91, 0x24, 0xfc, 0x02, 0xec, 0x44, 0xb7, 0x54, 0xe4, 0xba, 0xec, + 0xc8, 0xb2, 0x09, 0x1d, 0x50, 0x46, 0x7a, 0xf2, 0x3a, 0x4f, 0xa6, 0xba, 0x60, 0xee, 0xa0, 0x42, + 0x14, 0x2a, 0x61, 0xc3, 0x1e, 0x50, 0xa2, 0x22, 0x14, 0xae, 0xd0, 0xb8, 0x0a, 0x1e, 0x52, 0x03, + 0xdb, 0xe3, 0xd3, 0xd7, 0x55, 0xee, 0xe0, 0xfd, 0xd1, 0x50, 0x51, 0x9a, 0xd3, 0xa1, 0x68, 0x96, + 0x16, 0xfc, 0x0d, 0x90, 0x71, 0x99, 0x9f, 0x0d, 0xee, 0xe7, 0x47, 0x61, 0x65, 0x2b, 0x75, 0x50, + 0xca, 0x86, 0x1e, 0xd8, 0xc0, 0xe9, 0xf7, 0x02, 0x2a, 0xd7, 0xf8, 0x5a, 0xff, 0x60, 0xca, 0x3c, + 0x64, 0x9e, 0x18, 0x74, 0x59, 0x84, 0x71, 0x23, 0x63, 0xa0, 0x28, 0xa7, 0x0e, 0x2f, 0x01, 0xc4, + 0xd9, 0xe7, 0x0d, 0x2a, 0xc3, 0x99, 0x1b, 0x59, 0xee, 0x4d, 0x64, 0x92, 0x6a, 0x39, 0x13, 0x45, + 0x05, 0x3e, 0x20, 0x03, 0x35, 0x9c, 0x79, 0x8e, 0xa1, 0xf2, 0x35, 0xee, 0xf8, 0xa7, 0xb3, 0x1d, + 0xc7, 0x1c, 0xfd, 0xba, 0xf0, 0x5b, 0xcb, 0x5a, 0x28, 0xca, 0x3b, 0x80, 0x0f, 0xc1, 0x96, 0x68, + 0x7c, 0xe2, 0x50, 0x7c, 0x46, 0xda, 0x03, 0x6a, 0x30, 0x9b, 0xca, 0x9b, 0xbc, 0x76, 0xcb, 0xa3, + 0xa1, 0xb2, 0xb5, 0x5f, 0x60, 0x47, 0x85, 0x2c, 0xf8, 0x19, 0xd8, 0x38, 0x73, 0xfd, 0x8e, 0x65, + 0x9a, 0xc4, 0x89, 0x94, 0xb6, 0xb8, 0xd2, 0x56, 0x18, 0xff, 0xa3, 0x8c, 0x0d, 0xe5, 0xd0, 0x90, + 0x82, 0x6d, 0xa1, 0xdc, 0xf2, 0x5d, 0xe3, 0xc4, 0x0d, 0x1c, 0x16, 0x6e, 0x17, 0x54, 0xde, 0x8e, + 0xb7, 0xc8, 0xed, 0xfd, 0x22, 0xc0, 0x8b, 0xa1, 0x72, 0xa3, 0x60, 0xbb, 0x4a, 0x81, 0x50, 0xb1, + 0x36, 0xb4, 0xc1, 0xaa, 0x78, 0x60, 0x3b, 0xb0, 0x31, 0xa5, 0xb2, 0xcc, 0x97, 0xfa, 0xdd, 0xe9, + 0x85, 0x2d, 0x86, 0x67, 0xd7, 0x3b, 0xbf, 0xf9, 0x25, 0x01, 0x28, 0xa5, 0xae, 0xfe, 0x5d, 0x02, + 0xd7, 0x4b, 0x0b, 0x23, 0xbc, 0x9b, 0x7a, 0xb5, 0x51, 0x33, 0xaf, 0x36, 0x30, 0x4f, 0x7c, 0x03, + 0x8f, 0x36, 0x5f, 0x4b, 0x40, 0x2e, 0xdb, 0x21, 0xe0, 0x27, 0xa9, 0x0e, 0xbe, 0x97, 0xe9, 0x60, + 0x2d, 0xc7, 0x7b, 0x03, 0xfd, 0xfb, 0x56, 0x02, 0xef, 0x4c, 0x99, 0x81, 0xb8, 0x20, 0x11, 0x33, + 0x89, 0x7a, 0x84, 0xc3, 0xa5, 0x2c, 0xf1, 0x3c, 0x9a, 0x14, 0xa4, 0x02, 0x0c, 0x2a, 0x65, 0xc3, + 0x27, 0xe0, 0x9a, 0xa8, 0x86, 0x59, 0x1b, 0x3f, 0xb9, 0x2f, 0xeb, 0xef, 0x8c, 0x86, 0xca, 0xb5, + 0x66, 0x31, 0x04, 0x95, 0x71, 0xd5, 0x7f, 0x4a, 0x60, 0xa7, 0x78, 0xcb, 0x87, 0xb7, 0x53, 0xe1, + 0x56, 0x32, 0xe1, 0xbe, 0x9a, 0x61, 0x89, 0x60, 0xff, 0x01, 0xac, 0x8b, 0x83, 0x41, 0xfa, 0x11, + 0x32, 0x15, 0xf4, 0x70, 0x89, 0x84, 0x67, 0x7a, 0x21, 0x11, 0xa5, 0x2f, 0xbf, 0xef, 0xa7, 0xdb, + 0x50, 0x46, 0x4d, 0xfd, 0x97, 0x04, 0xde, 0x9b, 0xb9, 0xd9, 0x42, 0x3d, 0xd5, 0x75, 0x2d, 0xd3, + 0xf5, 0x7a, 0xb9, 0xc0, 0x9b, 0x79, 0x8b, 0xd4, 0x3f, 0x7a, 0xf6, 0xbc, 0x3e, 0xf7, 0xdd, 0xf3, + 0xfa, 0xdc, 0xf7, 0xcf, 0xeb, 0x73, 0x7f, 0x1e, 0xd5, 0xa5, 0x67, 0xa3, 0xba, 0xf4, 0xdd, 0xa8, + 0x2e, 0x7d, 0x3f, 0xaa, 0x4b, 0xff, 0x1b, 0xd5, 0xa5, 0xbf, 0xfd, 0xbf, 0x3e, 0xf7, 0xbb, 0x25, + 0x21, 0xf7, 0x43, 0x00, 0x00, 0x00, 0xff, 0xff, 0xde, 0x4e, 0x7c, 0x8c, 0xa6, 0x18, 0x00, 0x00, } func (m *AllowedCSIDriver) Marshal() (dAtA []byte, err error) { @@ -1146,6 +1147,20 @@ func (m *PodDisruptionBudgetStatus) MarshalToSizedBuffer(dAtA []byte) (int, erro _ = i var l int _ = l + if len(m.Conditions) > 0 { + for iNdEx := len(m.Conditions) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Conditions[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a + } + } i = encodeVarintGenerated(dAtA, i, uint64(m.ExpectedPods)) i-- dAtA[i] = 0x30 @@ -1944,6 +1959,12 @@ func (m *PodDisruptionBudgetStatus) Size() (n int) { n += 1 + sovGenerated(uint64(m.CurrentHealthy)) n += 1 + sovGenerated(uint64(m.DesiredHealthy)) n += 1 + sovGenerated(uint64(m.ExpectedPods)) + if len(m.Conditions) > 0 { + for _, e := range m.Conditions { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } return n } @@ -2294,6 +2315,11 @@ func (this *PodDisruptionBudgetStatus) String() string { if this == nil { return "nil" } + repeatedStringForConditions := "[]Condition{" + for _, f := range this.Conditions { + repeatedStringForConditions += fmt.Sprintf("%v", f) + "," + } + repeatedStringForConditions += "}" keysForDisruptedPods := make([]string, 0, len(this.DisruptedPods)) for k := range this.DisruptedPods { keysForDisruptedPods = append(keysForDisruptedPods, k) @@ -2311,6 +2337,7 @@ func (this *PodDisruptionBudgetStatus) String() string { `CurrentHealthy:` + fmt.Sprintf("%v", this.CurrentHealthy) + `,`, `DesiredHealthy:` + fmt.Sprintf("%v", this.DesiredHealthy) + `,`, `ExpectedPods:` + fmt.Sprintf("%v", this.ExpectedPods) + `,`, + `Conditions:` + repeatedStringForConditions + `,`, `}`, }, "") return s @@ -2540,10 +2567,7 @@ func (m *AllowedCSIDriver) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2625,10 +2649,7 @@ func (m *AllowedFlexVolume) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2730,10 +2751,7 @@ func (m *AllowedHostPath) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2852,10 +2870,7 @@ func (m *Eviction) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2971,10 +2986,7 @@ func (m *FSGroupStrategyOptions) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3062,10 +3074,7 @@ func (m *HostPortRange) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3153,10 +3162,7 @@ func (m *IDRange) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3305,10 +3311,7 @@ func (m *PodDisruptionBudget) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3425,10 +3428,7 @@ func (m *PodDisruptionBudgetList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3586,10 +3586,7 @@ func (m *PodDisruptionBudgetSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3770,7 +3767,7 @@ func (m *PodDisruptionBudgetStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -3857,16 +3854,47 @@ func (m *PodDisruptionBudgetStatus) Unmarshal(dAtA []byte) error { break } } + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Conditions", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Conditions = append(m.Conditions, v1.Condition{}) + if err := m.Conditions[len(m.Conditions)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3982,10 +4010,7 @@ func (m *PodSecurityPolicy) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4102,10 +4127,7 @@ func (m *PodSecurityPolicyList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4861,10 +4883,7 @@ func (m *PodSecurityPolicySpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4980,10 +4999,7 @@ func (m *RunAsGroupStrategyOptions) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5099,10 +5115,7 @@ func (m *RunAsUserStrategyOptions) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5217,10 +5230,7 @@ func (m *RuntimeClassStrategyOptions) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5338,10 +5348,7 @@ func (m *SELinuxStrategyOptions) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5457,10 +5464,7 @@ func (m *SupplementalGroupsStrategyOptions) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/api/policy/v1beta1/generated.proto b/vendor/k8s.io/api/policy/v1beta1/generated.proto index 18a1c657864c..a47212142dc7 100644 --- a/vendor/k8s.io/api/policy/v1beta1/generated.proto +++ b/vendor/k8s.io/api/policy/v1beta1/generated.proto @@ -136,6 +136,10 @@ message PodDisruptionBudgetSpec { // Label query over pods whose evictions are managed by the disruption // budget. + // A null selector selects no pods. + // An empty selector ({}) also selects no pods, which differs from standard behavior of selecting all pods. + // In policy/v1, an empty selector will select all pods in the namespace. + // +patchStrategy=replace // +optional optional k8s.io.apimachinery.pkg.apis.meta.v1.LabelSelector selector = 2; @@ -180,10 +184,31 @@ message PodDisruptionBudgetStatus { // total number of pods counted by this disruption budget optional int32 expectedPods = 6; + + // Conditions contain conditions for PDB. The disruption controller sets the + // DisruptionAllowed condition. The following are known values for the reason field + // (additional reasons could be added in the future): + // - SyncFailed: The controller encountered an error and wasn't able to compute + // the number of allowed disruptions. Therefore no disruptions are + // allowed and the status of the condition will be False. + // - InsufficientPods: The number of pods are either at or below the number + // required by the PodDisruptionBudget. No disruptions are + // allowed and the status of the condition will be False. + // - SufficientPods: There are more pods than required by the PodDisruptionBudget. + // The condition will be True, and the number of allowed + // disruptions are provided by the disruptionsAllowed property. + // + // +optional + // +patchMergeKey=type + // +patchStrategy=merge + // +listType=map + // +listMapKey=type + repeated k8s.io.apimachinery.pkg.apis.meta.v1.Condition conditions = 7; } // PodSecurityPolicy governs the ability to make requests that affect the Security Context // that will be applied to a pod and container. +// Deprecated in 1.21. message PodSecurityPolicy { // Standard object's metadata. // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata diff --git a/vendor/k8s.io/api/policy/v1beta1/types.go b/vendor/k8s.io/api/policy/v1beta1/types.go index 711afc80c738..2811044518e2 100644 --- a/vendor/k8s.io/api/policy/v1beta1/types.go +++ b/vendor/k8s.io/api/policy/v1beta1/types.go @@ -33,8 +33,12 @@ type PodDisruptionBudgetSpec struct { // Label query over pods whose evictions are managed by the disruption // budget. + // A null selector selects no pods. + // An empty selector ({}) also selects no pods, which differs from standard behavior of selecting all pods. + // In policy/v1, an empty selector will select all pods in the namespace. + // +patchStrategy=replace // +optional - Selector *metav1.LabelSelector `json:"selector,omitempty" protobuf:"bytes,2,opt,name=selector"` + Selector *metav1.LabelSelector `json:"selector,omitempty" patchStrategy:"replace" protobuf:"bytes,2,opt,name=selector"` // An eviction is allowed if at most "maxUnavailable" pods selected by // "selector" are unavailable after the eviction, i.e. even in absence of @@ -77,12 +81,50 @@ type PodDisruptionBudgetStatus struct { // total number of pods counted by this disruption budget ExpectedPods int32 `json:"expectedPods" protobuf:"varint,6,opt,name=expectedPods"` + + // Conditions contain conditions for PDB. The disruption controller sets the + // DisruptionAllowed condition. The following are known values for the reason field + // (additional reasons could be added in the future): + // - SyncFailed: The controller encountered an error and wasn't able to compute + // the number of allowed disruptions. Therefore no disruptions are + // allowed and the status of the condition will be False. + // - InsufficientPods: The number of pods are either at or below the number + // required by the PodDisruptionBudget. No disruptions are + // allowed and the status of the condition will be False. + // - SufficientPods: There are more pods than required by the PodDisruptionBudget. + // The condition will be True, and the number of allowed + // disruptions are provided by the disruptionsAllowed property. + // + // +optional + // +patchMergeKey=type + // +patchStrategy=merge + // +listType=map + // +listMapKey=type + Conditions []metav1.Condition `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type" protobuf:"bytes,7,rep,name=conditions"` } +const ( + // DisruptionAllowedCondition is a condition set by the disruption controller + // that signal whether any of the pods covered by the PDB can be disrupted. + DisruptionAllowedCondition = "DisruptionAllowed" + + // SyncFailedReason is set on the DisruptionAllowed condition if reconcile + // of the PDB failed and therefore disruption of pods are not allowed. + SyncFailedReason = "SyncFailed" + // SufficientPodsReason is set on the DisruptionAllowed condition if there are + // more pods covered by the PDB than required and at least one can be disrupted. + SufficientPodsReason = "SufficientPods" + // InsufficientPodsReason is set on the DisruptionAllowed condition if the number + // of pods are equal to or fewer than required by the PDB. + InsufficientPodsReason = "InsufficientPods" +) + // +genclient // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // +k8s:prerelease-lifecycle-gen:introduced=1.5 -// +k8s:prerelease-lifecycle-gen:deprecated=1.22 +// +k8s:prerelease-lifecycle-gen:deprecated=1.21 +// +k8s:prerelease-lifecycle-gen:removed=1.25 +// +k8s:prerelease-lifecycle-gen:replacement=policy,v1,PodDisruptionBudget // PodDisruptionBudget is an object to define the max disruption that can be caused to a collection of pods type PodDisruptionBudget struct { @@ -100,7 +142,9 @@ type PodDisruptionBudget struct { // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // +k8s:prerelease-lifecycle-gen:introduced=1.5 -// +k8s:prerelease-lifecycle-gen:deprecated=1.22 +// +k8s:prerelease-lifecycle-gen:deprecated=1.21 +// +k8s:prerelease-lifecycle-gen:removed=1.25 +// +k8s:prerelease-lifecycle-gen:replacement=policy,v1,PodDisruptionBudgetList // PodDisruptionBudgetList is a collection of PodDisruptionBudgets. type PodDisruptionBudgetList struct { @@ -135,10 +179,12 @@ type Eviction struct { // +genclient:nonNamespaced // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // +k8s:prerelease-lifecycle-gen:introduced=1.10 -// +k8s:prerelease-lifecycle-gen:deprecated=1.22 +// +k8s:prerelease-lifecycle-gen:deprecated=1.21 +// +k8s:prerelease-lifecycle-gen:removed=1.25 // PodSecurityPolicy governs the ability to make requests that affect the Security Context // that will be applied to a pod and container. +// Deprecated in 1.21. type PodSecurityPolicy struct { metav1.TypeMeta `json:",inline"` // Standard object's metadata. @@ -485,7 +531,8 @@ const AllowAllRuntimeClassNames = "*" // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // +k8s:prerelease-lifecycle-gen:introduced=1.10 -// +k8s:prerelease-lifecycle-gen:deprecated=1.22 +// +k8s:prerelease-lifecycle-gen:deprecated=1.21 +// +k8s:prerelease-lifecycle-gen:removed=1.25 // PodSecurityPolicyList is a list of PodSecurityPolicy objects. type PodSecurityPolicyList struct { diff --git a/vendor/k8s.io/api/policy/v1beta1/types_swagger_doc_generated.go b/vendor/k8s.io/api/policy/v1beta1/types_swagger_doc_generated.go index 05a503667f02..0853a5e99669 100644 --- a/vendor/k8s.io/api/policy/v1beta1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/policy/v1beta1/types_swagger_doc_generated.go @@ -116,7 +116,7 @@ func (PodDisruptionBudgetList) SwaggerDoc() map[string]string { var map_PodDisruptionBudgetSpec = map[string]string{ "": "PodDisruptionBudgetSpec is a description of a PodDisruptionBudget.", "minAvailable": "An eviction is allowed if at least \"minAvailable\" pods selected by \"selector\" will still be available after the eviction, i.e. even in the absence of the evicted pod. So for example you can prevent all voluntary evictions by specifying \"100%\".", - "selector": "Label query over pods whose evictions are managed by the disruption budget.", + "selector": "Label query over pods whose evictions are managed by the disruption budget. A null selector selects no pods. An empty selector ({}) also selects no pods, which differs from standard behavior of selecting all pods. In policy/v1, an empty selector will select all pods in the namespace.", "maxUnavailable": "An eviction is allowed if at most \"maxUnavailable\" pods selected by \"selector\" are unavailable after the eviction, i.e. even in absence of the evicted pod. For example, one can prevent all voluntary evictions by specifying 0. This is a mutually exclusive setting with \"minAvailable\".", } @@ -132,6 +132,7 @@ var map_PodDisruptionBudgetStatus = map[string]string{ "currentHealthy": "current number of healthy pods", "desiredHealthy": "minimum desired number of healthy pods", "expectedPods": "total number of pods counted by this disruption budget", + "conditions": "Conditions contain conditions for PDB. The disruption controller sets the DisruptionAllowed condition. The following are known values for the reason field (additional reasons could be added in the future): - SyncFailed: The controller encountered an error and wasn't able to compute\n the number of allowed disruptions. Therefore no disruptions are\n allowed and the status of the condition will be False.\n- InsufficientPods: The number of pods are either at or below the number\n required by the PodDisruptionBudget. No disruptions are\n allowed and the status of the condition will be False.\n- SufficientPods: There are more pods than required by the PodDisruptionBudget.\n The condition will be True, and the number of allowed\n disruptions are provided by the disruptionsAllowed property.", } func (PodDisruptionBudgetStatus) SwaggerDoc() map[string]string { @@ -139,7 +140,7 @@ func (PodDisruptionBudgetStatus) SwaggerDoc() map[string]string { } var map_PodSecurityPolicy = map[string]string{ - "": "PodSecurityPolicy governs the ability to make requests that affect the Security Context that will be applied to a pod and container.", + "": "PodSecurityPolicy governs the ability to make requests that affect the Security Context that will be applied to a pod and container. Deprecated in 1.21.", "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", "spec": "spec defines the policy enforced.", } diff --git a/vendor/k8s.io/api/policy/v1beta1/zz_generated.deepcopy.go b/vendor/k8s.io/api/policy/v1beta1/zz_generated.deepcopy.go index 75851e124a18..02d8a85cf704 100644 --- a/vendor/k8s.io/api/policy/v1beta1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/policy/v1beta1/zz_generated.deepcopy.go @@ -261,6 +261,13 @@ func (in *PodDisruptionBudgetStatus) DeepCopyInto(out *PodDisruptionBudgetStatus (*out)[key] = *val.DeepCopy() } } + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]v1.Condition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } return } diff --git a/vendor/k8s.io/api/policy/v1beta1/zz_generated.prerelease-lifecycle.go b/vendor/k8s.io/api/policy/v1beta1/zz_generated.prerelease-lifecycle.go index fca0a2a2ff15..8bda4b00f24f 100644 --- a/vendor/k8s.io/api/policy/v1beta1/zz_generated.prerelease-lifecycle.go +++ b/vendor/k8s.io/api/policy/v1beta1/zz_generated.prerelease-lifecycle.go @@ -20,6 +20,10 @@ limitations under the License. package v1beta1 +import ( + schema "k8s.io/apimachinery/pkg/runtime/schema" +) + // APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. // It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. func (in *Eviction) APILifecycleIntroduced() (major, minor int) { @@ -47,7 +51,13 @@ func (in *PodDisruptionBudget) APILifecycleIntroduced() (major, minor int) { // APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. // It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. func (in *PodDisruptionBudget) APILifecycleDeprecated() (major, minor int) { - return 1, 22 + return 1, 21 +} + +// APILifecycleReplacement is an autogenerated function, returning the group, version, and kind that should be used instead of this deprecated type. +// It is controlled by "k8s:prerelease-lifecycle-gen:replacement=,," tags in types.go. +func (in *PodDisruptionBudget) APILifecycleReplacement() schema.GroupVersionKind { + return schema.GroupVersionKind{Group: "policy", Version: "v1", Kind: "PodDisruptionBudget"} } // APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. @@ -65,7 +75,13 @@ func (in *PodDisruptionBudgetList) APILifecycleIntroduced() (major, minor int) { // APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. // It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. func (in *PodDisruptionBudgetList) APILifecycleDeprecated() (major, minor int) { - return 1, 22 + return 1, 21 +} + +// APILifecycleReplacement is an autogenerated function, returning the group, version, and kind that should be used instead of this deprecated type. +// It is controlled by "k8s:prerelease-lifecycle-gen:replacement=,," tags in types.go. +func (in *PodDisruptionBudgetList) APILifecycleReplacement() schema.GroupVersionKind { + return schema.GroupVersionKind{Group: "policy", Version: "v1", Kind: "PodDisruptionBudgetList"} } // APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. @@ -83,7 +99,7 @@ func (in *PodSecurityPolicy) APILifecycleIntroduced() (major, minor int) { // APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. // It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. func (in *PodSecurityPolicy) APILifecycleDeprecated() (major, minor int) { - return 1, 22 + return 1, 21 } // APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. @@ -101,7 +117,7 @@ func (in *PodSecurityPolicyList) APILifecycleIntroduced() (major, minor int) { // APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. // It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. func (in *PodSecurityPolicyList) APILifecycleDeprecated() (major, minor int) { - return 1, 22 + return 1, 21 } // APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. diff --git a/vendor/k8s.io/api/rbac/v1/BUILD b/vendor/k8s.io/api/rbac/v1/BUILD deleted file mode 100644 index 8b8094de0045..000000000000 --- a/vendor/k8s.io/api/rbac/v1/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/api/rbac/v1", - importpath = "k8s.io/api/rbac/v1", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/api/rbac/v1/generated.pb.go b/vendor/k8s.io/api/rbac/v1/generated.pb.go index ba6872d624cc..678c00512e87 100644 --- a/vendor/k8s.io/api/rbac/v1/generated.pb.go +++ b/vendor/k8s.io/api/rbac/v1/generated.pb.go @@ -1557,10 +1557,7 @@ func (m *AggregationRule) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1713,10 +1710,7 @@ func (m *ClusterRole) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1866,10 +1860,7 @@ func (m *ClusterRoleBinding) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1986,10 +1977,7 @@ func (m *ClusterRoleBindingList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2106,10 +2094,7 @@ func (m *ClusterRoleList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2319,10 +2304,7 @@ func (m *PolicyRule) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2439,10 +2421,7 @@ func (m *Role) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2592,10 +2571,7 @@ func (m *RoleBinding) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2712,10 +2688,7 @@ func (m *RoleBindingList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2832,10 +2805,7 @@ func (m *RoleList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2981,10 +2951,7 @@ func (m *RoleRef) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3162,10 +3129,7 @@ func (m *Subject) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/api/rbac/v1alpha1/BUILD b/vendor/k8s.io/api/rbac/v1alpha1/BUILD deleted file mode 100644 index 6c36134c5e7b..000000000000 --- a/vendor/k8s.io/api/rbac/v1alpha1/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/api/rbac/v1alpha1", - importpath = "k8s.io/api/rbac/v1alpha1", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/api/rbac/v1alpha1/generated.pb.go b/vendor/k8s.io/api/rbac/v1alpha1/generated.pb.go index 3b12526da9a5..94c1bef8bb4d 100644 --- a/vendor/k8s.io/api/rbac/v1alpha1/generated.pb.go +++ b/vendor/k8s.io/api/rbac/v1alpha1/generated.pb.go @@ -1558,10 +1558,7 @@ func (m *AggregationRule) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1714,10 +1711,7 @@ func (m *ClusterRole) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1867,10 +1861,7 @@ func (m *ClusterRoleBinding) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1987,10 +1978,7 @@ func (m *ClusterRoleBindingList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2107,10 +2095,7 @@ func (m *ClusterRoleList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2320,10 +2305,7 @@ func (m *PolicyRule) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2440,10 +2422,7 @@ func (m *Role) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2593,10 +2572,7 @@ func (m *RoleBinding) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2713,10 +2689,7 @@ func (m *RoleBindingList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2833,10 +2806,7 @@ func (m *RoleList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2982,10 +2952,7 @@ func (m *RoleRef) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3163,10 +3130,7 @@ func (m *Subject) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/api/rbac/v1beta1/BUILD b/vendor/k8s.io/api/rbac/v1beta1/BUILD deleted file mode 100644 index 3dff5ea38ea2..000000000000 --- a/vendor/k8s.io/api/rbac/v1beta1/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - "zz_generated.prerelease-lifecycle.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/api/rbac/v1beta1", - importpath = "k8s.io/api/rbac/v1beta1", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/api/rbac/v1beta1/generated.pb.go b/vendor/k8s.io/api/rbac/v1beta1/generated.pb.go index 53d36320e4b3..ad5d7cb05f38 100644 --- a/vendor/k8s.io/api/rbac/v1beta1/generated.pb.go +++ b/vendor/k8s.io/api/rbac/v1beta1/generated.pb.go @@ -1557,10 +1557,7 @@ func (m *AggregationRule) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1713,10 +1710,7 @@ func (m *ClusterRole) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1866,10 +1860,7 @@ func (m *ClusterRoleBinding) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1986,10 +1977,7 @@ func (m *ClusterRoleBindingList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2106,10 +2094,7 @@ func (m *ClusterRoleList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2319,10 +2304,7 @@ func (m *PolicyRule) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2439,10 +2421,7 @@ func (m *Role) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2592,10 +2571,7 @@ func (m *RoleBinding) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2712,10 +2688,7 @@ func (m *RoleBindingList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2832,10 +2805,7 @@ func (m *RoleList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2981,10 +2951,7 @@ func (m *RoleRef) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3162,10 +3129,7 @@ func (m *Subject) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/api/scheduling/v1/BUILD b/vendor/k8s.io/api/scheduling/v1/BUILD deleted file mode 100644 index 9343d81e6e9e..000000000000 --- a/vendor/k8s.io/api/scheduling/v1/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/api/scheduling/v1", - importpath = "k8s.io/api/scheduling/v1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/scheduling/v1/generated.pb.go b/vendor/k8s.io/api/scheduling/v1/generated.pb.go index efc3102efea8..c5ef2f50ec9e 100644 --- a/vendor/k8s.io/api/scheduling/v1/generated.pb.go +++ b/vendor/k8s.io/api/scheduling/v1/generated.pb.go @@ -511,10 +511,7 @@ func (m *PriorityClass) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -631,10 +628,7 @@ func (m *PriorityClassList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/api/scheduling/v1alpha1/BUILD b/vendor/k8s.io/api/scheduling/v1alpha1/BUILD deleted file mode 100644 index 4a7c618f527e..000000000000 --- a/vendor/k8s.io/api/scheduling/v1alpha1/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/api/scheduling/v1alpha1", - importpath = "k8s.io/api/scheduling/v1alpha1", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/api/scheduling/v1alpha1/generated.pb.go b/vendor/k8s.io/api/scheduling/v1alpha1/generated.pb.go index 8a62104dbe73..16f3c7cb4c36 100644 --- a/vendor/k8s.io/api/scheduling/v1alpha1/generated.pb.go +++ b/vendor/k8s.io/api/scheduling/v1alpha1/generated.pb.go @@ -511,10 +511,7 @@ func (m *PriorityClass) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -631,10 +628,7 @@ func (m *PriorityClassList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/api/scheduling/v1beta1/BUILD b/vendor/k8s.io/api/scheduling/v1beta1/BUILD deleted file mode 100644 index 6d30a2ecbbfd..000000000000 --- a/vendor/k8s.io/api/scheduling/v1beta1/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - "zz_generated.prerelease-lifecycle.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/api/scheduling/v1beta1", - importpath = "k8s.io/api/scheduling/v1beta1", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/api/scheduling/v1beta1/generated.pb.go b/vendor/k8s.io/api/scheduling/v1beta1/generated.pb.go index b89af56b3b6f..64b1c15057fa 100644 --- a/vendor/k8s.io/api/scheduling/v1beta1/generated.pb.go +++ b/vendor/k8s.io/api/scheduling/v1beta1/generated.pb.go @@ -511,10 +511,7 @@ func (m *PriorityClass) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -631,10 +628,7 @@ func (m *PriorityClassList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/api/storage/v1/BUILD b/vendor/k8s.io/api/storage/v1/BUILD deleted file mode 100644 index 918cbfa695cd..000000000000 --- a/vendor/k8s.io/api/storage/v1/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/api/storage/v1", - importpath = "k8s.io/api/storage/v1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/storage/v1/generated.pb.go b/vendor/k8s.io/api/storage/v1/generated.pb.go index f6b97e013c5f..34a3c34dc248 100644 --- a/vendor/k8s.io/api/storage/v1/generated.pb.go +++ b/vendor/k8s.io/api/storage/v1/generated.pb.go @@ -2237,10 +2237,7 @@ func (m *CSIDriver) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2357,10 +2354,7 @@ func (m *CSIDriverList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2593,10 +2587,7 @@ func (m *CSIDriverSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2712,10 +2703,7 @@ func (m *CSINode) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2897,10 +2885,7 @@ func (m *CSINodeDriver) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3017,10 +3002,7 @@ func (m *CSINodeList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3104,10 +3086,7 @@ func (m *CSINodeSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3332,7 +3311,7 @@ func (m *StorageClass) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -3502,10 +3481,7 @@ func (m *StorageClass) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3622,10 +3598,7 @@ func (m *StorageClassList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3727,10 +3700,7 @@ func (m *TokenRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3879,10 +3849,7 @@ func (m *VolumeAttachment) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3999,10 +3966,7 @@ func (m *VolumeAttachmentList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4121,10 +4085,7 @@ func (m *VolumeAttachmentSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4271,10 +4232,7 @@ func (m *VolumeAttachmentSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4454,7 +4412,7 @@ func (m *VolumeAttachmentStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -4543,10 +4501,7 @@ func (m *VolumeAttachmentStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4661,10 +4616,7 @@ func (m *VolumeError) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4734,10 +4686,7 @@ func (m *VolumeNodeResources) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/api/storage/v1/generated.proto b/vendor/k8s.io/api/storage/v1/generated.proto index d6b4d9cbd0f9..0e9a2e1da3f9 100644 --- a/vendor/k8s.io/api/storage/v1/generated.proto +++ b/vendor/k8s.io/api/storage/v1/generated.proto @@ -72,6 +72,9 @@ message CSIDriverSpec { // If the CSIDriverRegistry feature gate is enabled and the value is // specified to false, the attach operation will be skipped. // Otherwise the attach operation will be called. + // + // This field is immutable. + // // +optional optional bool attachRequired = 1; @@ -90,7 +93,7 @@ message CSIDriverSpec { // "csi.storage.k8s.io/pod.name": pod.Name // "csi.storage.k8s.io/pod.namespace": pod.Namespace // "csi.storage.k8s.io/pod.uid": string(pod.UID) - // "csi.storage.k8s.io/ephemeral": "true" iff the volume is an ephemeral inline volume + // "csi.storage.k8s.io/ephemeral": "true" if the volume is an ephemeral inline volume // defined by a CSIVolumeSource, otherwise "false" // // "csi.storage.k8s.io/ephemeral" is a new feature in Kubernetes 1.16. It is only @@ -99,6 +102,9 @@ message CSIDriverSpec { // As Kubernetes 1.15 doesn't support this field, drivers can only support one mode when // deployed on such a cluster and the deployment determines which mode that is, for example // via a command line parameter of the driver. + // + // This field is immutable. + // // +optional optional bool podInfoOnMount = 2; @@ -115,6 +121,9 @@ message CSIDriverSpec { // A driver can support one or more of these modes and // more modes may be added in the future. // This field is beta. + // + // This field is immutable. + // // +optional // +listType=set repeated string volumeLifecycleModes = 3; @@ -133,10 +142,13 @@ message CSIDriverSpec { // unset or false and it can be flipped later when storage // capacity information has been published. // - // This is an alpha field and only available when the CSIStorageCapacity + // This field is immutable. + // + // This is a beta field and only available when the CSIStorageCapacity // feature is enabled. The default is false. // // +optional + // +featureGate=CSIStorageCapacity optional bool storageCapacity = 4; // Defines if the underlying volume supports changing ownership and @@ -144,6 +156,9 @@ message CSIDriverSpec { // Refer to the specific FSGroupPolicy values for additional details. // This field is alpha-level, and is only honored by servers // that enable the CSIVolumeFSGroupPolicy feature gate. + // + // This field is immutable. + // // +optional optional string fsGroupPolicy = 5; @@ -163,7 +178,7 @@ message CSIDriverSpec { // most one token is empty string. To receive a new token after expiry, // RequiresRepublish can be used to trigger NodePublishVolume periodically. // - // This is an alpha feature and only available when the + // This is a beta feature and only available when the // CSIServiceAccountToken feature is enabled. // // +optional @@ -178,7 +193,7 @@ message CSIDriverSpec { // to NodePublishVolume should only update the contents of the volume. New // mount points will not be seen by a running container. // - // This is an alpha feature and only available when the + // This is a beta feature and only available when the // CSIServiceAccountToken feature is enabled. // // +optional @@ -376,7 +391,7 @@ message VolumeAttachmentSource { // a persistent volume defined by a pod's inline VolumeSource. This field // is populated only for the CSIMigration feature. It contains // translated fields from a pod's inline VolumeSource to a - // PersistentVolumeSpec. This field is alpha-level and is only + // PersistentVolumeSpec. This field is beta-level and is only // honored by servers that enabled the CSIMigration feature. // +optional optional k8s.io.api.core.v1.PersistentVolumeSpec inlineVolumeSpec = 2; diff --git a/vendor/k8s.io/api/storage/v1/types.go b/vendor/k8s.io/api/storage/v1/types.go index 18d0fb8772c0..6a7bf492920a 100644 --- a/vendor/k8s.io/api/storage/v1/types.go +++ b/vendor/k8s.io/api/storage/v1/types.go @@ -170,7 +170,7 @@ type VolumeAttachmentSource struct { // a persistent volume defined by a pod's inline VolumeSource. This field // is populated only for the CSIMigration feature. It contains // translated fields from a pod's inline VolumeSource to a - // PersistentVolumeSpec. This field is alpha-level and is only + // PersistentVolumeSpec. This field is beta-level and is only // honored by servers that enabled the CSIMigration feature. // +optional InlineVolumeSpec *v1.PersistentVolumeSpec `json:"inlineVolumeSpec,omitempty" protobuf:"bytes,2,opt,name=inlineVolumeSpec"` @@ -270,6 +270,9 @@ type CSIDriverSpec struct { // If the CSIDriverRegistry feature gate is enabled and the value is // specified to false, the attach operation will be skipped. // Otherwise the attach operation will be called. + // + // This field is immutable. + // // +optional AttachRequired *bool `json:"attachRequired,omitempty" protobuf:"varint,1,opt,name=attachRequired"` @@ -288,7 +291,7 @@ type CSIDriverSpec struct { // "csi.storage.k8s.io/pod.name": pod.Name // "csi.storage.k8s.io/pod.namespace": pod.Namespace // "csi.storage.k8s.io/pod.uid": string(pod.UID) - // "csi.storage.k8s.io/ephemeral": "true" iff the volume is an ephemeral inline volume + // "csi.storage.k8s.io/ephemeral": "true" if the volume is an ephemeral inline volume // defined by a CSIVolumeSource, otherwise "false" // // "csi.storage.k8s.io/ephemeral" is a new feature in Kubernetes 1.16. It is only @@ -297,6 +300,9 @@ type CSIDriverSpec struct { // As Kubernetes 1.15 doesn't support this field, drivers can only support one mode when // deployed on such a cluster and the deployment determines which mode that is, for example // via a command line parameter of the driver. + // + // This field is immutable. + // // +optional PodInfoOnMount *bool `json:"podInfoOnMount,omitempty" protobuf:"bytes,2,opt,name=podInfoOnMount"` @@ -313,6 +319,9 @@ type CSIDriverSpec struct { // A driver can support one or more of these modes and // more modes may be added in the future. // This field is beta. + // + // This field is immutable. + // // +optional // +listType=set VolumeLifecycleModes []VolumeLifecycleMode `json:"volumeLifecycleModes,omitempty" protobuf:"bytes,3,opt,name=volumeLifecycleModes"` @@ -331,10 +340,13 @@ type CSIDriverSpec struct { // unset or false and it can be flipped later when storage // capacity information has been published. // - // This is an alpha field and only available when the CSIStorageCapacity + // This field is immutable. + // + // This is a beta field and only available when the CSIStorageCapacity // feature is enabled. The default is false. // // +optional + // +featureGate=CSIStorageCapacity StorageCapacity *bool `json:"storageCapacity,omitempty" protobuf:"bytes,4,opt,name=storageCapacity"` // Defines if the underlying volume supports changing ownership and @@ -342,6 +354,9 @@ type CSIDriverSpec struct { // Refer to the specific FSGroupPolicy values for additional details. // This field is alpha-level, and is only honored by servers // that enable the CSIVolumeFSGroupPolicy feature gate. + // + // This field is immutable. + // // +optional FSGroupPolicy *FSGroupPolicy `json:"fsGroupPolicy,omitempty" protobuf:"bytes,5,opt,name=fsGroupPolicy"` @@ -361,7 +376,7 @@ type CSIDriverSpec struct { // most one token is empty string. To receive a new token after expiry, // RequiresRepublish can be used to trigger NodePublishVolume periodically. // - // This is an alpha feature and only available when the + // This is a beta feature and only available when the // CSIServiceAccountToken feature is enabled. // // +optional @@ -376,7 +391,7 @@ type CSIDriverSpec struct { // to NodePublishVolume should only update the contents of the volume. New // mount points will not be seen by a running container. // - // This is an alpha feature and only available when the + // This is a beta feature and only available when the // CSIServiceAccountToken feature is enabled. // // +optional diff --git a/vendor/k8s.io/api/storage/v1/types_swagger_doc_generated.go b/vendor/k8s.io/api/storage/v1/types_swagger_doc_generated.go index 0e28b1d2f1d0..a9c7cc9afddb 100644 --- a/vendor/k8s.io/api/storage/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/storage/v1/types_swagger_doc_generated.go @@ -49,13 +49,13 @@ func (CSIDriverList) SwaggerDoc() map[string]string { var map_CSIDriverSpec = map[string]string{ "": "CSIDriverSpec is the specification of a CSIDriver.", - "attachRequired": "attachRequired indicates this CSI volume driver requires an attach operation (because it implements the CSI ControllerPublishVolume() method), and that the Kubernetes attach detach controller should call the attach volume interface which checks the volumeattachment status and waits until the volume is attached before proceeding to mounting. The CSI external-attacher coordinates with CSI volume driver and updates the volumeattachment status when the attach operation is complete. If the CSIDriverRegistry feature gate is enabled and the value is specified to false, the attach operation will be skipped. Otherwise the attach operation will be called.", - "podInfoOnMount": "If set to true, podInfoOnMount indicates this CSI volume driver requires additional pod information (like podName, podUID, etc.) during mount operations. If set to false, pod information will not be passed on mount. Default is false. The CSI driver specifies podInfoOnMount as part of driver deployment. If true, Kubelet will pass pod information as VolumeContext in the CSI NodePublishVolume() calls. The CSI driver is responsible for parsing and validating the information passed in as VolumeContext. The following VolumeConext will be passed if podInfoOnMount is set to true. This list might grow, but the prefix will be used. \"csi.storage.k8s.io/pod.name\": pod.Name \"csi.storage.k8s.io/pod.namespace\": pod.Namespace \"csi.storage.k8s.io/pod.uid\": string(pod.UID) \"csi.storage.k8s.io/ephemeral\": \"true\" iff the volume is an ephemeral inline volume\n defined by a CSIVolumeSource, otherwise \"false\"\n\n\"csi.storage.k8s.io/ephemeral\" is a new feature in Kubernetes 1.16. It is only required for drivers which support both the \"Persistent\" and \"Ephemeral\" VolumeLifecycleMode. Other drivers can leave pod info disabled and/or ignore this field. As Kubernetes 1.15 doesn't support this field, drivers can only support one mode when deployed on such a cluster and the deployment determines which mode that is, for example via a command line parameter of the driver.", - "volumeLifecycleModes": "volumeLifecycleModes defines what kind of volumes this CSI volume driver supports. The default if the list is empty is \"Persistent\", which is the usage defined by the CSI specification and implemented in Kubernetes via the usual PV/PVC mechanism. The other mode is \"Ephemeral\". In this mode, volumes are defined inline inside the pod spec with CSIVolumeSource and their lifecycle is tied to the lifecycle of that pod. A driver has to be aware of this because it is only going to get a NodePublishVolume call for such a volume. For more information about implementing this mode, see https://kubernetes-csi.github.io/docs/ephemeral-local-volumes.html A driver can support one or more of these modes and more modes may be added in the future. This field is beta.", - "storageCapacity": "If set to true, storageCapacity indicates that the CSI volume driver wants pod scheduling to consider the storage capacity that the driver deployment will report by creating CSIStorageCapacity objects with capacity information.\n\nThe check can be enabled immediately when deploying a driver. In that case, provisioning new volumes with late binding will pause until the driver deployment has published some suitable CSIStorageCapacity object.\n\nAlternatively, the driver can be deployed with the field unset or false and it can be flipped later when storage capacity information has been published.\n\nThis is an alpha field and only available when the CSIStorageCapacity feature is enabled. The default is false.", - "fsGroupPolicy": "Defines if the underlying volume supports changing ownership and permission of the volume before being mounted. Refer to the specific FSGroupPolicy values for additional details. This field is alpha-level, and is only honored by servers that enable the CSIVolumeFSGroupPolicy feature gate.", - "tokenRequests": "TokenRequests indicates the CSI driver needs pods' service account tokens it is mounting volume for to do necessary authentication. Kubelet will pass the tokens in VolumeContext in the CSI NodePublishVolume calls. The CSI driver should parse and validate the following VolumeContext: \"csi.storage.k8s.io/serviceAccount.tokens\": {\n \"\": {\n \"token\": ,\n \"expirationTimestamp\": ,\n },\n ...\n}\n\nNote: Audience in each TokenRequest should be different and at most one token is empty string. To receive a new token after expiry, RequiresRepublish can be used to trigger NodePublishVolume periodically.\n\nThis is an alpha feature and only available when the CSIServiceAccountToken feature is enabled.", - "requiresRepublish": "RequiresRepublish indicates the CSI driver wants `NodePublishVolume` being periodically called to reflect any possible change in the mounted volume. This field defaults to false.\n\nNote: After a successful initial NodePublishVolume call, subsequent calls to NodePublishVolume should only update the contents of the volume. New mount points will not be seen by a running container.\n\nThis is an alpha feature and only available when the CSIServiceAccountToken feature is enabled.", + "attachRequired": "attachRequired indicates this CSI volume driver requires an attach operation (because it implements the CSI ControllerPublishVolume() method), and that the Kubernetes attach detach controller should call the attach volume interface which checks the volumeattachment status and waits until the volume is attached before proceeding to mounting. The CSI external-attacher coordinates with CSI volume driver and updates the volumeattachment status when the attach operation is complete. If the CSIDriverRegistry feature gate is enabled and the value is specified to false, the attach operation will be skipped. Otherwise the attach operation will be called.\n\nThis field is immutable.", + "podInfoOnMount": "If set to true, podInfoOnMount indicates this CSI volume driver requires additional pod information (like podName, podUID, etc.) during mount operations. If set to false, pod information will not be passed on mount. Default is false. The CSI driver specifies podInfoOnMount as part of driver deployment. If true, Kubelet will pass pod information as VolumeContext in the CSI NodePublishVolume() calls. The CSI driver is responsible for parsing and validating the information passed in as VolumeContext. The following VolumeConext will be passed if podInfoOnMount is set to true. This list might grow, but the prefix will be used. \"csi.storage.k8s.io/pod.name\": pod.Name \"csi.storage.k8s.io/pod.namespace\": pod.Namespace \"csi.storage.k8s.io/pod.uid\": string(pod.UID) \"csi.storage.k8s.io/ephemeral\": \"true\" if the volume is an ephemeral inline volume\n defined by a CSIVolumeSource, otherwise \"false\"\n\n\"csi.storage.k8s.io/ephemeral\" is a new feature in Kubernetes 1.16. It is only required for drivers which support both the \"Persistent\" and \"Ephemeral\" VolumeLifecycleMode. Other drivers can leave pod info disabled and/or ignore this field. As Kubernetes 1.15 doesn't support this field, drivers can only support one mode when deployed on such a cluster and the deployment determines which mode that is, for example via a command line parameter of the driver.\n\nThis field is immutable.", + "volumeLifecycleModes": "volumeLifecycleModes defines what kind of volumes this CSI volume driver supports. The default if the list is empty is \"Persistent\", which is the usage defined by the CSI specification and implemented in Kubernetes via the usual PV/PVC mechanism. The other mode is \"Ephemeral\". In this mode, volumes are defined inline inside the pod spec with CSIVolumeSource and their lifecycle is tied to the lifecycle of that pod. A driver has to be aware of this because it is only going to get a NodePublishVolume call for such a volume. For more information about implementing this mode, see https://kubernetes-csi.github.io/docs/ephemeral-local-volumes.html A driver can support one or more of these modes and more modes may be added in the future. This field is beta.\n\nThis field is immutable.", + "storageCapacity": "If set to true, storageCapacity indicates that the CSI volume driver wants pod scheduling to consider the storage capacity that the driver deployment will report by creating CSIStorageCapacity objects with capacity information.\n\nThe check can be enabled immediately when deploying a driver. In that case, provisioning new volumes with late binding will pause until the driver deployment has published some suitable CSIStorageCapacity object.\n\nAlternatively, the driver can be deployed with the field unset or false and it can be flipped later when storage capacity information has been published.\n\nThis field is immutable.\n\nThis is a beta field and only available when the CSIStorageCapacity feature is enabled. The default is false.", + "fsGroupPolicy": "Defines if the underlying volume supports changing ownership and permission of the volume before being mounted. Refer to the specific FSGroupPolicy values for additional details. This field is alpha-level, and is only honored by servers that enable the CSIVolumeFSGroupPolicy feature gate.\n\nThis field is immutable.", + "tokenRequests": "TokenRequests indicates the CSI driver needs pods' service account tokens it is mounting volume for to do necessary authentication. Kubelet will pass the tokens in VolumeContext in the CSI NodePublishVolume calls. The CSI driver should parse and validate the following VolumeContext: \"csi.storage.k8s.io/serviceAccount.tokens\": {\n \"\": {\n \"token\": ,\n \"expirationTimestamp\": ,\n },\n ...\n}\n\nNote: Audience in each TokenRequest should be different and at most one token is empty string. To receive a new token after expiry, RequiresRepublish can be used to trigger NodePublishVolume periodically.\n\nThis is a beta feature and only available when the CSIServiceAccountToken feature is enabled.", + "requiresRepublish": "RequiresRepublish indicates the CSI driver wants `NodePublishVolume` being periodically called to reflect any possible change in the mounted volume. This field defaults to false.\n\nNote: After a successful initial NodePublishVolume call, subsequent calls to NodePublishVolume should only update the contents of the volume. New mount points will not be seen by a running container.\n\nThis is a beta feature and only available when the CSIServiceAccountToken feature is enabled.", } func (CSIDriverSpec) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/api/storage/v1alpha1/BUILD b/vendor/k8s.io/api/storage/v1alpha1/BUILD deleted file mode 100644 index c8c9cda81bba..000000000000 --- a/vendor/k8s.io/api/storage/v1alpha1/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/api/storage/v1alpha1", - importpath = "k8s.io/api/storage/v1alpha1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/storage/v1alpha1/doc.go b/vendor/k8s.io/api/storage/v1alpha1/doc.go index 6f7ad7e732d1..87440b47aef7 100644 --- a/vendor/k8s.io/api/storage/v1alpha1/doc.go +++ b/vendor/k8s.io/api/storage/v1alpha1/doc.go @@ -18,5 +18,6 @@ limitations under the License. // +k8s:protobuf-gen=package // +groupName=storage.k8s.io // +k8s:openapi-gen=true +// +k8s:prerelease-lifecycle-gen=true package v1alpha1 // import "k8s.io/api/storage/v1alpha1" diff --git a/vendor/k8s.io/api/storage/v1alpha1/generated.pb.go b/vendor/k8s.io/api/storage/v1alpha1/generated.pb.go index 1b7767fdccc1..0c82ddad325c 100644 --- a/vendor/k8s.io/api/storage/v1alpha1/generated.pb.go +++ b/vendor/k8s.io/api/storage/v1alpha1/generated.pb.go @@ -288,63 +288,65 @@ func init() { } var fileDescriptor_10f856db1e670dc4 = []byte{ - // 895 bytes of a gzipped FileDescriptorProto + // 923 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x56, 0x4f, 0x6f, 0xe3, 0x44, - 0x14, 0x8f, 0x9b, 0x74, 0x37, 0x3b, 0x29, 0x10, 0x8d, 0xa2, 0x25, 0x0a, 0x92, 0x53, 0xe5, 0x14, - 0x10, 0x3b, 0xa6, 0x0b, 0x42, 0x2b, 0x6e, 0x75, 0xdb, 0x43, 0x45, 0x5b, 0x60, 0x52, 0x21, 0x04, - 0x1c, 0x98, 0x38, 0x0f, 0xc7, 0x4d, 0xfc, 0x47, 0x33, 0xe3, 0x4a, 0xb9, 0xc1, 0x85, 0x33, 0x37, - 0xbe, 0x01, 0x9f, 0xa5, 0x07, 0x24, 0x56, 0x9c, 0xf6, 0x14, 0x51, 0xf3, 0x2d, 0xb8, 0x80, 0x3c, - 0x9e, 0x38, 0x6e, 0x9c, 0x74, 0xb3, 0x7b, 0xd8, 0x9b, 0xe7, 0xcd, 0x7b, 0xbf, 0xdf, 0xfb, 0xf3, - 0x9b, 0x27, 0xa3, 0xe3, 0xc9, 0x33, 0x41, 0xbc, 0xd0, 0x9a, 0xc4, 0x43, 0xe0, 0x01, 0x48, 0x10, - 0xd6, 0x35, 0x04, 0xa3, 0x90, 0x5b, 0xfa, 0x82, 0x45, 0x9e, 0x25, 0x64, 0xc8, 0x99, 0x0b, 0xd6, - 0xf5, 0x01, 0x9b, 0x46, 0x63, 0x76, 0x60, 0xb9, 0x10, 0x00, 0x67, 0x12, 0x46, 0x24, 0xe2, 0xa1, - 0x0c, 0xf1, 0x7b, 0x99, 0x33, 0x61, 0x91, 0x47, 0xb4, 0x33, 0x59, 0x38, 0x77, 0x9e, 0xb8, 0x9e, - 0x1c, 0xc7, 0x43, 0xe2, 0x84, 0xbe, 0xe5, 0x86, 0x6e, 0x68, 0xa9, 0x98, 0x61, 0xfc, 0xa3, 0x3a, - 0xa9, 0x83, 0xfa, 0xca, 0xb0, 0x3a, 0xbd, 0x02, 0xb1, 0x13, 0xf2, 0x94, 0x75, 0x95, 0xaf, 0xf3, - 0xc9, 0xd2, 0xc7, 0x67, 0xce, 0xd8, 0x0b, 0x80, 0xcf, 0xac, 0x68, 0xe2, 0xaa, 0x20, 0x0e, 0x22, - 0x8c, 0xb9, 0x03, 0xaf, 0x14, 0x25, 0x2c, 0x1f, 0x24, 0x5b, 0xc7, 0x65, 0x6d, 0x8a, 0xe2, 0x71, - 0x20, 0x3d, 0xbf, 0x4c, 0xf3, 0xe9, 0xcb, 0x02, 0x84, 0x33, 0x06, 0x9f, 0xad, 0xc6, 0xf5, 0x7e, - 0xae, 0x22, 0x7c, 0x34, 0x38, 0x1d, 0x64, 0xfd, 0x3b, 0x62, 0x11, 0x73, 0x3c, 0x39, 0xc3, 0x3f, - 0xa0, 0x7a, 0x9a, 0xda, 0x88, 0x49, 0xd6, 0x36, 0xf6, 0x8d, 0x7e, 0xe3, 0xe9, 0x47, 0x64, 0xd9, - 0xee, 0x9c, 0x81, 0x44, 0x13, 0x37, 0x35, 0x08, 0x92, 0x7a, 0x93, 0xeb, 0x03, 0xf2, 0xc5, 0xf0, - 0x0a, 0x1c, 0x79, 0x0e, 0x92, 0xd9, 0xf8, 0x66, 0xde, 0xad, 0x24, 0xf3, 0x2e, 0x5a, 0xda, 0x68, - 0x8e, 0x8a, 0x3d, 0xb4, 0x17, 0x84, 0x23, 0xb8, 0x0c, 0xa3, 0x70, 0x1a, 0xba, 0xb3, 0xf6, 0x8e, - 0x62, 0xf9, 0x78, 0x3b, 0x96, 0x33, 0x36, 0x84, 0xe9, 0x00, 0xa6, 0xe0, 0xc8, 0x90, 0xdb, 0xcd, - 0x64, 0xde, 0xdd, 0xbb, 0x28, 0x80, 0xd1, 0x3b, 0xd0, 0xf8, 0x18, 0x35, 0xb5, 0x3e, 0x8e, 0xa6, - 0x4c, 0x88, 0x0b, 0xe6, 0x43, 0xbb, 0xba, 0x6f, 0xf4, 0x1f, 0xd9, 0x6d, 0x9d, 0x62, 0x73, 0xb0, - 0x72, 0x4f, 0x4b, 0x11, 0xf8, 0x1b, 0x54, 0x77, 0x74, 0x7b, 0xda, 0x35, 0x95, 0x2c, 0xb9, 0x2f, - 0x59, 0xb2, 0x50, 0x04, 0xf9, 0x2a, 0x66, 0x81, 0xf4, 0xe4, 0xcc, 0xde, 0x4b, 0xe6, 0xdd, 0xfa, - 0xa2, 0xc5, 0x34, 0x47, 0xeb, 0xfd, 0x61, 0xa0, 0xc7, 0xe5, 0x19, 0x9c, 0x79, 0x42, 0xe2, 0xef, - 0x4b, 0x73, 0x20, 0x5b, 0x76, 0xc8, 0x13, 0xd9, 0x14, 0x9a, 0xba, 0xc4, 0xfa, 0xc2, 0x52, 0x98, - 0xc1, 0x25, 0xda, 0xf5, 0x24, 0xf8, 0xa2, 0xbd, 0xb3, 0x5f, 0xed, 0x37, 0x9e, 0x5a, 0xe4, 0x9e, - 0x17, 0x45, 0xca, 0x19, 0xda, 0x6f, 0x69, 0xec, 0xdd, 0xd3, 0x14, 0x85, 0x66, 0x60, 0xbd, 0xdf, - 0x77, 0x50, 0xf3, 0xeb, 0x70, 0x1a, 0xfb, 0x70, 0x28, 0x25, 0x73, 0xc6, 0x3e, 0x04, 0xf2, 0x0d, - 0x08, 0x6a, 0x80, 0x6a, 0x22, 0x02, 0x47, 0x0b, 0xe9, 0xe0, 0xde, 0x5a, 0x56, 0xd3, 0x1b, 0x44, - 0xe0, 0xd8, 0x7b, 0x1a, 0xbe, 0x96, 0x9e, 0xa8, 0x02, 0xc3, 0xdf, 0xa1, 0x07, 0x42, 0x32, 0x19, - 0x0b, 0x25, 0x98, 0xbb, 0xfa, 0xdc, 0x02, 0x56, 0x85, 0xda, 0x6f, 0x6b, 0xe0, 0x07, 0xd9, 0x99, - 0x6a, 0xc8, 0xde, 0x8d, 0x81, 0x5a, 0xab, 0x21, 0x6f, 0x60, 0xea, 0xf4, 0xee, 0xd4, 0x9f, 0xbc, - 0x52, 0x49, 0x1b, 0x66, 0xfe, 0x97, 0x81, 0x1e, 0x97, 0xaa, 0x57, 0xf2, 0xc7, 0x67, 0xa8, 0x15, - 0x01, 0x17, 0x9e, 0x90, 0x10, 0xc8, 0xcc, 0x47, 0xbd, 0x40, 0x23, 0x7b, 0x81, 0xc9, 0xbc, 0xdb, - 0xfa, 0x72, 0xcd, 0x3d, 0x5d, 0x1b, 0x85, 0xaf, 0x50, 0xd3, 0x0b, 0xa6, 0x5e, 0x00, 0x99, 0x6d, - 0xb0, 0x9c, 0x78, 0xbf, 0x58, 0x47, 0xba, 0xc3, 0xd3, 0x86, 0xac, 0x22, 0xab, 0x41, 0xb7, 0xd2, - 0x17, 0x7f, 0xba, 0x82, 0x42, 0x4b, 0xb8, 0xbd, 0x3f, 0xd7, 0xcc, 0x27, 0xbd, 0xc0, 0x1f, 0xa2, - 0x3a, 0x53, 0x16, 0xe0, 0xba, 0x8c, 0xbc, 0xdf, 0x87, 0xda, 0x4e, 0x73, 0x0f, 0xa5, 0x21, 0xd5, - 0x8a, 0x35, 0x3b, 0x6e, 0x0b, 0x0d, 0xa9, 0xd0, 0x82, 0x86, 0xd4, 0x99, 0x6a, 0xc8, 0x34, 0x95, - 0x74, 0xd7, 0x15, 0x76, 0x5a, 0x9e, 0xca, 0x85, 0xb6, 0xd3, 0xdc, 0xa3, 0xf7, 0x5f, 0x75, 0xcd, - 0x98, 0x94, 0x18, 0x0b, 0x35, 0x8d, 0x54, 0x4d, 0xf5, 0x52, 0x4d, 0xa3, 0xbc, 0xa6, 0x11, 0xfe, - 0xcd, 0x40, 0x98, 0xe5, 0x10, 0xe7, 0x0b, 0xb1, 0x66, 0x8a, 0xfa, 0xfc, 0x35, 0x1e, 0x09, 0x39, - 0x2c, 0xa1, 0x9d, 0x04, 0x92, 0xcf, 0xec, 0x8e, 0xce, 0x02, 0x97, 0x1d, 0xe8, 0x9a, 0x14, 0xf0, - 0x15, 0x6a, 0x64, 0xd6, 0x13, 0xce, 0x43, 0xae, 0x9f, 0x6d, 0x7f, 0x8b, 0x8c, 0x94, 0xbf, 0x6d, - 0x26, 0xf3, 0x6e, 0xe3, 0x70, 0x09, 0xf0, 0xef, 0xbc, 0xdb, 0x28, 0xdc, 0xd3, 0x22, 0x78, 0xca, - 0x35, 0x82, 0x25, 0x57, 0xed, 0x75, 0xb8, 0x8e, 0x61, 0x33, 0x57, 0x01, 0xbc, 0x73, 0x82, 0xde, - 0xdd, 0xd0, 0x22, 0xdc, 0x44, 0xd5, 0x09, 0xcc, 0x32, 0x25, 0xd2, 0xf4, 0x13, 0xb7, 0xd0, 0xee, - 0x35, 0x9b, 0xc6, 0x99, 0xe2, 0x1e, 0xd1, 0xec, 0xf0, 0xd9, 0xce, 0x33, 0xa3, 0xf7, 0x8b, 0x81, - 0x8a, 0x1c, 0xf8, 0x0c, 0xd5, 0xd2, 0xdf, 0x03, 0xbd, 0x66, 0x3e, 0xd8, 0x6e, 0xcd, 0x5c, 0x7a, - 0x3e, 0x2c, 0xd7, 0x65, 0x7a, 0xa2, 0x0a, 0x05, 0xbf, 0x8f, 0x1e, 0xfa, 0x20, 0x04, 0x73, 0x35, - 0xb3, 0xfd, 0x8e, 0x76, 0x7a, 0x78, 0x9e, 0x99, 0xe9, 0xe2, 0xde, 0x26, 0x37, 0xb7, 0x66, 0xe5, - 0xf9, 0xad, 0x59, 0x79, 0x71, 0x6b, 0x56, 0x7e, 0x4a, 0x4c, 0xe3, 0x26, 0x31, 0x8d, 0xe7, 0x89, - 0x69, 0xbc, 0x48, 0x4c, 0xe3, 0xef, 0xc4, 0x34, 0x7e, 0xfd, 0xc7, 0xac, 0x7c, 0x5b, 0x5f, 0x34, - 0xee, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x6e, 0xb9, 0x9d, 0xb3, 0x34, 0x0a, 0x00, 0x00, + 0x14, 0x8f, 0x9b, 0x74, 0x37, 0x3b, 0x29, 0x90, 0x1d, 0x85, 0x25, 0x0a, 0x92, 0xb3, 0xca, 0x29, + 0x20, 0x76, 0x4c, 0x17, 0x84, 0x56, 0xdc, 0xea, 0xb6, 0x87, 0x8a, 0xb6, 0xc0, 0xa4, 0x42, 0x08, + 0x38, 0x30, 0x71, 0x1e, 0xce, 0x34, 0xf1, 0x1f, 0x79, 0xc6, 0x15, 0xe1, 0xc4, 0x89, 0x33, 0x37, + 0xbe, 0x01, 0x9f, 0xa5, 0x07, 0x24, 0x56, 0x9c, 0xf6, 0x14, 0x51, 0xf3, 0x1d, 0x38, 0x70, 0x01, + 0x79, 0x3c, 0x71, 0xdc, 0x38, 0x2d, 0xd9, 0x1e, 0xf6, 0xe6, 0xf7, 0xe6, 0xbd, 0xdf, 0xef, 0xfd, + 0x4f, 0xd0, 0xc1, 0xe4, 0x99, 0x20, 0x3c, 0xb0, 0x26, 0xf1, 0x10, 0x22, 0x1f, 0x24, 0x08, 0xeb, + 0x02, 0xfc, 0x51, 0x10, 0x59, 0xfa, 0x81, 0x85, 0xdc, 0x12, 0x32, 0x88, 0x98, 0x0b, 0xd6, 0xc5, + 0x2e, 0x9b, 0x86, 0x63, 0xb6, 0x6b, 0xb9, 0xe0, 0x43, 0xc4, 0x24, 0x8c, 0x48, 0x18, 0x05, 0x32, + 0xc0, 0x6f, 0x67, 0xc6, 0x84, 0x85, 0x9c, 0x68, 0x63, 0xb2, 0x30, 0xee, 0x3c, 0x71, 0xb9, 0x1c, + 0xc7, 0x43, 0xe2, 0x04, 0x9e, 0xe5, 0x06, 0x6e, 0x60, 0x29, 0x9f, 0x61, 0xfc, 0x9d, 0x92, 0x94, + 0xa0, 0xbe, 0x32, 0xac, 0x4e, 0xaf, 0x40, 0xec, 0x04, 0x51, 0xca, 0xba, 0xca, 0xd7, 0xf9, 0x70, + 0x69, 0xe3, 0x31, 0x67, 0xcc, 0x7d, 0x88, 0x66, 0x56, 0x38, 0x71, 0x95, 0x53, 0x04, 0x22, 0x88, + 0x23, 0x07, 0x5e, 0xca, 0x4b, 0x58, 0x1e, 0x48, 0xb6, 0x8e, 0xcb, 0xba, 0xc9, 0x2b, 0x8a, 0x7d, + 0xc9, 0xbd, 0x32, 0xcd, 0x47, 0xff, 0xe7, 0x20, 0x9c, 0x31, 0x78, 0x6c, 0xd5, 0xaf, 0xf7, 0x77, + 0x15, 0xe1, 0xfd, 0xc1, 0xd1, 0x20, 0xab, 0xdf, 0x3e, 0x0b, 0x99, 0xc3, 0xe5, 0x0c, 0x7f, 0x8b, + 0xea, 0x69, 0x68, 0x23, 0x26, 0x59, 0xdb, 0x78, 0x6c, 0xf4, 0x1b, 0x4f, 0xdf, 0x27, 0xcb, 0x72, + 0xe7, 0x0c, 0x24, 0x9c, 0xb8, 0xa9, 0x42, 0x90, 0xd4, 0x9a, 0x5c, 0xec, 0x92, 0x4f, 0x87, 0xe7, + 0xe0, 0xc8, 0x13, 0x90, 0xcc, 0xc6, 0x97, 0xf3, 0x6e, 0x25, 0x99, 0x77, 0xd1, 0x52, 0x47, 0x73, + 0x54, 0xcc, 0xd1, 0x8e, 0x1f, 0x8c, 0xe0, 0x2c, 0x08, 0x83, 0x69, 0xe0, 0xce, 0xda, 0x5b, 0x8a, + 0xe5, 0x83, 0xcd, 0x58, 0x8e, 0xd9, 0x10, 0xa6, 0x03, 0x98, 0x82, 0x23, 0x83, 0xc8, 0x6e, 0x26, + 0xf3, 0xee, 0xce, 0x69, 0x01, 0x8c, 0x5e, 0x83, 0xc6, 0x07, 0xa8, 0xa9, 0xe7, 0x63, 0x7f, 0xca, + 0x84, 0x38, 0x65, 0x1e, 0xb4, 0xab, 0x8f, 0x8d, 0xfe, 0x03, 0xbb, 0xad, 0x43, 0x6c, 0x0e, 0x56, + 0xde, 0x69, 0xc9, 0x03, 0x7f, 0x89, 0xea, 0x8e, 0x2e, 0x4f, 0xbb, 0xa6, 0x82, 0x25, 0xb7, 0x05, + 0x4b, 0x16, 0x13, 0x41, 0x3e, 0x8f, 0x99, 0x2f, 0xb9, 0x9c, 0xd9, 0x3b, 0xc9, 0xbc, 0x5b, 0x5f, + 0x94, 0x98, 0xe6, 0x68, 0x58, 0xa0, 0x87, 0x1e, 0xfb, 0x9e, 0x7b, 0xb1, 0xf7, 0x45, 0x30, 0x8d, + 0x3d, 0x18, 0xf0, 0x1f, 0xa0, 0xbd, 0x7d, 0x27, 0x8a, 0x37, 0x93, 0x79, 0xf7, 0xe1, 0xc9, 0x2a, + 0x18, 0x2d, 0xe3, 0xf7, 0x7e, 0x33, 0xd0, 0xa3, 0x72, 0xe3, 0x8f, 0xb9, 0x90, 0xf8, 0x9b, 0x52, + 0xf3, 0xc9, 0x86, 0x6d, 0xe1, 0x22, 0x6b, 0x7d, 0x53, 0xd7, 0xb5, 0xbe, 0xd0, 0x14, 0x1a, 0x7f, + 0x86, 0xb6, 0xb9, 0x04, 0x4f, 0xb4, 0xb7, 0x1e, 0x57, 0xfb, 0x8d, 0xa7, 0x16, 0xb9, 0x65, 0x8d, + 0x49, 0x39, 0x42, 0xfb, 0x35, 0x8d, 0xbd, 0x7d, 0x94, 0xa2, 0xd0, 0x0c, 0xac, 0xf7, 0xeb, 0x16, + 0x6a, 0x66, 0xd9, 0xed, 0x49, 0xc9, 0x9c, 0xb1, 0x07, 0xbe, 0x7c, 0x05, 0x53, 0x3c, 0x40, 0x35, + 0x11, 0x82, 0xa3, 0xa7, 0x77, 0xf7, 0xd6, 0x5c, 0x56, 0xc3, 0x1b, 0x84, 0xe0, 0xd8, 0x3b, 0x1a, + 0xbe, 0x96, 0x4a, 0x54, 0x81, 0xe1, 0xaf, 0xd1, 0x3d, 0x21, 0x99, 0x8c, 0x85, 0x9a, 0xd2, 0xeb, + 0x4b, 0xb1, 0x01, 0xac, 0x72, 0xb5, 0x5f, 0xd7, 0xc0, 0xf7, 0x32, 0x99, 0x6a, 0xc8, 0xde, 0xa5, + 0x81, 0x5a, 0xab, 0x2e, 0xaf, 0xa0, 0xeb, 0xf4, 0x7a, 0xd7, 0x9f, 0xbc, 0x54, 0x4a, 0x37, 0xf4, + 0xfc, 0x0f, 0x03, 0x3d, 0x2a, 0x65, 0xaf, 0x16, 0x02, 0x1f, 0xa3, 0x56, 0x08, 0x91, 0xe0, 0x42, + 0x82, 0x2f, 0x33, 0x1b, 0xb5, 0xf6, 0x46, 0xb6, 0xf6, 0xc9, 0xbc, 0xdb, 0xfa, 0x6c, 0xcd, 0x3b, + 0x5d, 0xeb, 0x85, 0xcf, 0x51, 0x93, 0xfb, 0x53, 0xee, 0x83, 0xde, 0x9f, 0x65, 0xc7, 0xfb, 0xc5, + 0x3c, 0xd2, 0x1f, 0x8e, 0xb4, 0x20, 0xab, 0xc8, 0xaa, 0xd1, 0xad, 0xf4, 0xcc, 0x1c, 0xad, 0xa0, + 0xd0, 0x12, 0x6e, 0xef, 0xf7, 0x35, 0xfd, 0x49, 0x1f, 0xf0, 0x7b, 0xa8, 0xce, 0x94, 0x06, 0x22, + 0x9d, 0x46, 0x5e, 0xef, 0x3d, 0xad, 0xa7, 0xb9, 0x85, 0x9a, 0x21, 0x55, 0x8a, 0x35, 0x87, 0x75, + 0x83, 0x19, 0x52, 0xae, 0x85, 0x19, 0x52, 0x32, 0xd5, 0x90, 0x69, 0x28, 0xe9, 0x81, 0x2d, 0x1c, + 0xd2, 0x3c, 0x94, 0x53, 0xad, 0xa7, 0xb9, 0x45, 0xef, 0xdf, 0xea, 0x9a, 0x36, 0xa9, 0x61, 0x2c, + 0xe4, 0x34, 0x52, 0x39, 0xd5, 0x4b, 0x39, 0x8d, 0xf2, 0x9c, 0x46, 0xf8, 0x17, 0x03, 0x61, 0x96, + 0x43, 0x9c, 0x2c, 0x86, 0x35, 0x9b, 0xa8, 0x4f, 0xee, 0xb0, 0x24, 0x64, 0xaf, 0x84, 0x76, 0xe8, + 0xcb, 0x68, 0x66, 0x77, 0x74, 0x14, 0xb8, 0x6c, 0x40, 0xd7, 0x84, 0x80, 0xcf, 0x51, 0x23, 0xd3, + 0x1e, 0x46, 0x51, 0x10, 0xe9, 0xb5, 0xed, 0x6f, 0x10, 0x91, 0xb2, 0xb7, 0xcd, 0x64, 0xde, 0x6d, + 0xec, 0x2d, 0x01, 0xfe, 0x99, 0x77, 0x1b, 0x85, 0x77, 0x5a, 0x04, 0x4f, 0xb9, 0x46, 0xb0, 0xe4, + 0xaa, 0xdd, 0x85, 0xeb, 0x00, 0x6e, 0xe6, 0x2a, 0x80, 0x77, 0x0e, 0xd1, 0x5b, 0x37, 0x94, 0x08, + 0x37, 0x51, 0x75, 0x02, 0xb3, 0x6c, 0x12, 0x69, 0xfa, 0x89, 0x5b, 0x68, 0xfb, 0x82, 0x4d, 0xe3, + 0x6c, 0xe2, 0x1e, 0xd0, 0x4c, 0xf8, 0x78, 0xeb, 0x99, 0xd1, 0xfb, 0xc9, 0x40, 0x45, 0x0e, 0x7c, + 0x8c, 0x6a, 0xe9, 0x7f, 0x12, 0x7d, 0x66, 0xde, 0xdd, 0xec, 0xcc, 0x9c, 0x71, 0x0f, 0x96, 0xe7, + 0x32, 0x95, 0xa8, 0x42, 0xc1, 0xef, 0xa0, 0xfb, 0x1e, 0x08, 0xc1, 0x5c, 0xcd, 0x6c, 0xbf, 0xa1, + 0x8d, 0xee, 0x9f, 0x64, 0x6a, 0xba, 0x78, 0xb7, 0xc9, 0xe5, 0x95, 0x59, 0x79, 0x7e, 0x65, 0x56, + 0x5e, 0x5c, 0x99, 0x95, 0x1f, 0x13, 0xd3, 0xb8, 0x4c, 0x4c, 0xe3, 0x79, 0x62, 0x1a, 0x2f, 0x12, + 0xd3, 0xf8, 0x33, 0x31, 0x8d, 0x9f, 0xff, 0x32, 0x2b, 0x5f, 0xd5, 0x17, 0x85, 0xfb, 0x2f, 0x00, + 0x00, 0xff, 0xff, 0x95, 0x04, 0x69, 0x56, 0xa9, 0x0a, 0x00, 0x00, } func (m *CSIStorageCapacity) Marshal() (dAtA []byte, err error) { @@ -367,6 +369,18 @@ func (m *CSIStorageCapacity) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.MaximumVolumeSize != nil { + { + size, err := m.MaximumVolumeSize.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + } if m.Capacity != nil { { size, err := m.Capacity.MarshalToSizedBuffer(dAtA[:i]) @@ -787,6 +801,10 @@ func (m *CSIStorageCapacity) Size() (n int) { l = m.Capacity.Size() n += 1 + l + sovGenerated(uint64(l)) } + if m.MaximumVolumeSize != nil { + l = m.MaximumVolumeSize.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -925,6 +943,7 @@ func (this *CSIStorageCapacity) String() string { `NodeTopology:` + strings.Replace(fmt.Sprintf("%v", this.NodeTopology), "LabelSelector", "v1.LabelSelector", 1) + `,`, `StorageClassName:` + fmt.Sprintf("%v", this.StorageClassName) + `,`, `Capacity:` + strings.Replace(fmt.Sprintf("%v", this.Capacity), "Quantity", "resource.Quantity", 1) + `,`, + `MaximumVolumeSize:` + strings.Replace(fmt.Sprintf("%v", this.MaximumVolumeSize), "Quantity", "resource.Quantity", 1) + `,`, `}`, }, "") return s @@ -1204,16 +1223,49 @@ func (m *CSIStorageCapacity) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MaximumVolumeSize", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.MaximumVolumeSize == nil { + m.MaximumVolumeSize = &resource.Quantity{} + } + if err := m.MaximumVolumeSize.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1330,10 +1382,7 @@ func (m *CSIStorageCapacityList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1482,10 +1531,7 @@ func (m *VolumeAttachment) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1602,10 +1648,7 @@ func (m *VolumeAttachmentList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1724,10 +1767,7 @@ func (m *VolumeAttachmentSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1874,10 +1914,7 @@ func (m *VolumeAttachmentSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2057,7 +2094,7 @@ func (m *VolumeAttachmentStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -2146,10 +2183,7 @@ func (m *VolumeAttachmentStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2264,10 +2298,7 @@ func (m *VolumeError) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/api/storage/v1alpha1/generated.proto b/vendor/k8s.io/api/storage/v1alpha1/generated.proto index d64345333d98..78cd16df2339 100644 --- a/vendor/k8s.io/api/storage/v1alpha1/generated.proto +++ b/vendor/k8s.io/api/storage/v1alpha1/generated.proto @@ -47,7 +47,9 @@ option go_package = "v1alpha1"; // // The producer of these objects can decide which approach is more suitable. // -// This is an alpha feature and only available when the CSIStorageCapacity feature is enabled. +// They are consumed by the kube-scheduler if the CSIStorageCapacity beta feature gate +// is enabled there and a CSI driver opts into capacity-aware scheduling with +// CSIDriver.StorageCapacity. message CSIStorageCapacity { // Standard object's metadata. The name has no particular meaning. It must be // be a DNS subdomain (dots allowed, 253 characters). To ensure that @@ -89,6 +91,20 @@ message CSIStorageCapacity { // // +optional optional k8s.io.apimachinery.pkg.api.resource.Quantity capacity = 4; + + // MaximumVolumeSize is the value reported by the CSI driver in its GetCapacityResponse + // for a GetCapacityRequest with topology and parameters that match the + // previous fields. + // + // This is defined since CSI spec 1.4.0 as the largest size + // that may be used in a + // CreateVolumeRequest.capacity_range.required_bytes field to + // create a volume with the same parameters as those in + // GetCapacityRequest. The corresponding value in the Kubernetes + // API is ResourceRequirements.Requests in a volume claim. + // + // +optional + optional k8s.io.apimachinery.pkg.api.resource.Quantity maximumVolumeSize = 5; } // CSIStorageCapacityList is a collection of CSIStorageCapacity objects. diff --git a/vendor/k8s.io/api/storage/v1alpha1/types.go b/vendor/k8s.io/api/storage/v1alpha1/types.go index 5e65bcebcf9f..afb0495db541 100644 --- a/vendor/k8s.io/api/storage/v1alpha1/types.go +++ b/vendor/k8s.io/api/storage/v1alpha1/types.go @@ -25,6 +25,9 @@ import ( // +genclient // +genclient:nonNamespaced // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +k8s:prerelease-lifecycle-gen:introduced=1.9 +// +k8s:prerelease-lifecycle-gen:deprecated=1.21 +// +k8s:prerelease-lifecycle-gen:replacement=storage.k8s.io,v1,VolumeAttachment // VolumeAttachment captures the intent to attach or detach the specified volume // to/from the specified node. @@ -50,6 +53,9 @@ type VolumeAttachment struct { } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +k8s:prerelease-lifecycle-gen:introduced=1.9 +// +k8s:prerelease-lifecycle-gen:deprecated=1.21 +// +k8s:prerelease-lifecycle-gen:replacement=storage.k8s.io,v1,VolumeAttachmentList // VolumeAttachmentList is a collection of VolumeAttachment objects. type VolumeAttachmentList struct { @@ -138,6 +144,9 @@ type VolumeError struct { // +genclient // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +k8s:prerelease-lifecycle-gen:introduced=1.19 +// +k8s:prerelease-lifecycle-gen:deprecated=1.21 +// +k8s:prerelease-lifecycle-gen:replacement=storage.k8s.io,v1beta1,CSIStorageCapacity // CSIStorageCapacity stores the result of one CSI GetCapacity call. // For a given StorageClass, this describes the available capacity in a @@ -156,7 +165,9 @@ type VolumeError struct { // // The producer of these objects can decide which approach is more suitable. // -// This is an alpha feature and only available when the CSIStorageCapacity feature is enabled. +// They are consumed by the kube-scheduler if the CSIStorageCapacity beta feature gate +// is enabled there and a CSI driver opts into capacity-aware scheduling with +// CSIDriver.StorageCapacity. type CSIStorageCapacity struct { metav1.TypeMeta `json:",inline"` // Standard object's metadata. The name has no particular meaning. It must be @@ -199,9 +210,26 @@ type CSIStorageCapacity struct { // // +optional Capacity *resource.Quantity `json:"capacity,omitempty" protobuf:"bytes,4,opt,name=capacity"` + + // MaximumVolumeSize is the value reported by the CSI driver in its GetCapacityResponse + // for a GetCapacityRequest with topology and parameters that match the + // previous fields. + // + // This is defined since CSI spec 1.4.0 as the largest size + // that may be used in a + // CreateVolumeRequest.capacity_range.required_bytes field to + // create a volume with the same parameters as those in + // GetCapacityRequest. The corresponding value in the Kubernetes + // API is ResourceRequirements.Requests in a volume claim. + // + // +optional + MaximumVolumeSize *resource.Quantity `json:"maximumVolumeSize,omitempty" protobuf:"bytes,5,opt,name=maximumVolumeSize"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +k8s:prerelease-lifecycle-gen:introduced=1.19 +// +k8s:prerelease-lifecycle-gen:deprecated=1.21 +// +k8s:prerelease-lifecycle-gen:replacement=storage.k8s.io,v1beta1,CSIStorageCapacityList // CSIStorageCapacityList is a collection of CSIStorageCapacity objects. type CSIStorageCapacityList struct { diff --git a/vendor/k8s.io/api/storage/v1alpha1/types_swagger_doc_generated.go b/vendor/k8s.io/api/storage/v1alpha1/types_swagger_doc_generated.go index 51778d183d6f..fa50e02896b1 100644 --- a/vendor/k8s.io/api/storage/v1alpha1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/storage/v1alpha1/types_swagger_doc_generated.go @@ -28,11 +28,12 @@ package v1alpha1 // AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. var map_CSIStorageCapacity = map[string]string{ - "": "CSIStorageCapacity stores the result of one CSI GetCapacity call. For a given StorageClass, this describes the available capacity in a particular topology segment. This can be used when considering where to instantiate new PersistentVolumes.\n\nFor example this can express things like: - StorageClass \"standard\" has \"1234 GiB\" available in \"topology.kubernetes.io/zone=us-east1\" - StorageClass \"localssd\" has \"10 GiB\" available in \"kubernetes.io/hostname=knode-abc123\"\n\nThe following three cases all imply that no capacity is available for a certain combination: - no object exists with suitable topology and storage class name - such an object exists, but the capacity is unset - such an object exists, but the capacity is zero\n\nThe producer of these objects can decide which approach is more suitable.\n\nThis is an alpha feature and only available when the CSIStorageCapacity feature is enabled.", - "metadata": "Standard object's metadata. The name has no particular meaning. It must be be a DNS subdomain (dots allowed, 253 characters). To ensure that there are no conflicts with other CSI drivers on the cluster, the recommendation is to use csisc-, a generated name, or a reverse-domain name which ends with the unique CSI driver name.\n\nObjects are namespaced.\n\nMore info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", - "nodeTopology": "NodeTopology defines which nodes have access to the storage for which capacity was reported. If not set, the storage is not accessible from any node in the cluster. If empty, the storage is accessible from all nodes. This field is immutable.", - "storageClassName": "The name of the StorageClass that the reported capacity applies to. It must meet the same requirements as the name of a StorageClass object (non-empty, DNS subdomain). If that object no longer exists, the CSIStorageCapacity object is obsolete and should be removed by its creator. This field is immutable.", - "capacity": "Capacity is the value reported by the CSI driver in its GetCapacityResponse for a GetCapacityRequest with topology and parameters that match the previous fields.\n\nThe semantic is currently (CSI spec 1.2) defined as: The available capacity, in bytes, of the storage that can be used to provision volumes. If not set, that information is currently unavailable and treated like zero capacity.", + "": "CSIStorageCapacity stores the result of one CSI GetCapacity call. For a given StorageClass, this describes the available capacity in a particular topology segment. This can be used when considering where to instantiate new PersistentVolumes.\n\nFor example this can express things like: - StorageClass \"standard\" has \"1234 GiB\" available in \"topology.kubernetes.io/zone=us-east1\" - StorageClass \"localssd\" has \"10 GiB\" available in \"kubernetes.io/hostname=knode-abc123\"\n\nThe following three cases all imply that no capacity is available for a certain combination: - no object exists with suitable topology and storage class name - such an object exists, but the capacity is unset - such an object exists, but the capacity is zero\n\nThe producer of these objects can decide which approach is more suitable.\n\nThey are consumed by the kube-scheduler if the CSIStorageCapacity beta feature gate is enabled there and a CSI driver opts into capacity-aware scheduling with CSIDriver.StorageCapacity.", + "metadata": "Standard object's metadata. The name has no particular meaning. It must be be a DNS subdomain (dots allowed, 253 characters). To ensure that there are no conflicts with other CSI drivers on the cluster, the recommendation is to use csisc-, a generated name, or a reverse-domain name which ends with the unique CSI driver name.\n\nObjects are namespaced.\n\nMore info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "nodeTopology": "NodeTopology defines which nodes have access to the storage for which capacity was reported. If not set, the storage is not accessible from any node in the cluster. If empty, the storage is accessible from all nodes. This field is immutable.", + "storageClassName": "The name of the StorageClass that the reported capacity applies to. It must meet the same requirements as the name of a StorageClass object (non-empty, DNS subdomain). If that object no longer exists, the CSIStorageCapacity object is obsolete and should be removed by its creator. This field is immutable.", + "capacity": "Capacity is the value reported by the CSI driver in its GetCapacityResponse for a GetCapacityRequest with topology and parameters that match the previous fields.\n\nThe semantic is currently (CSI spec 1.2) defined as: The available capacity, in bytes, of the storage that can be used to provision volumes. If not set, that information is currently unavailable and treated like zero capacity.", + "maximumVolumeSize": "MaximumVolumeSize is the value reported by the CSI driver in its GetCapacityResponse for a GetCapacityRequest with topology and parameters that match the previous fields.\n\nThis is defined since CSI spec 1.4.0 as the largest size that may be used in a CreateVolumeRequest.capacity_range.required_bytes field to create a volume with the same parameters as those in GetCapacityRequest. The corresponding value in the Kubernetes API is ResourceRequirements.Requests in a volume claim.", } func (CSIStorageCapacity) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/api/storage/v1alpha1/zz_generated.deepcopy.go b/vendor/k8s.io/api/storage/v1alpha1/zz_generated.deepcopy.go index 7f3b357ba8e0..64a34670b37e 100644 --- a/vendor/k8s.io/api/storage/v1alpha1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/storage/v1alpha1/zz_generated.deepcopy.go @@ -41,6 +41,11 @@ func (in *CSIStorageCapacity) DeepCopyInto(out *CSIStorageCapacity) { x := (*in).DeepCopy() *out = &x } + if in.MaximumVolumeSize != nil { + in, out := &in.MaximumVolumeSize, &out.MaximumVolumeSize + x := (*in).DeepCopy() + *out = &x + } return } diff --git a/vendor/k8s.io/api/storage/v1alpha1/zz_generated.prerelease-lifecycle.go b/vendor/k8s.io/api/storage/v1alpha1/zz_generated.prerelease-lifecycle.go new file mode 100644 index 000000000000..44311b4bbf66 --- /dev/null +++ b/vendor/k8s.io/api/storage/v1alpha1/zz_generated.prerelease-lifecycle.go @@ -0,0 +1,121 @@ +// +build !ignore_autogenerated + +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by prerelease-lifecycle-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + schema "k8s.io/apimachinery/pkg/runtime/schema" +) + +// APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. +func (in *CSIStorageCapacity) APILifecycleIntroduced() (major, minor int) { + return 1, 19 +} + +// APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. +func (in *CSIStorageCapacity) APILifecycleDeprecated() (major, minor int) { + return 1, 21 +} + +// APILifecycleReplacement is an autogenerated function, returning the group, version, and kind that should be used instead of this deprecated type. +// It is controlled by "k8s:prerelease-lifecycle-gen:replacement=,," tags in types.go. +func (in *CSIStorageCapacity) APILifecycleReplacement() schema.GroupVersionKind { + return schema.GroupVersionKind{Group: "storage.k8s.io", Version: "v1beta1", Kind: "CSIStorageCapacity"} +} + +// APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:removed" tags in types.go or "k8s:prerelease-lifecycle-gen:deprecated" plus three minor. +func (in *CSIStorageCapacity) APILifecycleRemoved() (major, minor int) { + return 1, 24 +} + +// APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. +func (in *CSIStorageCapacityList) APILifecycleIntroduced() (major, minor int) { + return 1, 19 +} + +// APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. +func (in *CSIStorageCapacityList) APILifecycleDeprecated() (major, minor int) { + return 1, 21 +} + +// APILifecycleReplacement is an autogenerated function, returning the group, version, and kind that should be used instead of this deprecated type. +// It is controlled by "k8s:prerelease-lifecycle-gen:replacement=,," tags in types.go. +func (in *CSIStorageCapacityList) APILifecycleReplacement() schema.GroupVersionKind { + return schema.GroupVersionKind{Group: "storage.k8s.io", Version: "v1beta1", Kind: "CSIStorageCapacityList"} +} + +// APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:removed" tags in types.go or "k8s:prerelease-lifecycle-gen:deprecated" plus three minor. +func (in *CSIStorageCapacityList) APILifecycleRemoved() (major, minor int) { + return 1, 24 +} + +// APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. +func (in *VolumeAttachment) APILifecycleIntroduced() (major, minor int) { + return 1, 9 +} + +// APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. +func (in *VolumeAttachment) APILifecycleDeprecated() (major, minor int) { + return 1, 21 +} + +// APILifecycleReplacement is an autogenerated function, returning the group, version, and kind that should be used instead of this deprecated type. +// It is controlled by "k8s:prerelease-lifecycle-gen:replacement=,," tags in types.go. +func (in *VolumeAttachment) APILifecycleReplacement() schema.GroupVersionKind { + return schema.GroupVersionKind{Group: "storage.k8s.io", Version: "v1", Kind: "VolumeAttachment"} +} + +// APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:removed" tags in types.go or "k8s:prerelease-lifecycle-gen:deprecated" plus three minor. +func (in *VolumeAttachment) APILifecycleRemoved() (major, minor int) { + return 1, 24 +} + +// APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. +func (in *VolumeAttachmentList) APILifecycleIntroduced() (major, minor int) { + return 1, 9 +} + +// APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. +func (in *VolumeAttachmentList) APILifecycleDeprecated() (major, minor int) { + return 1, 21 +} + +// APILifecycleReplacement is an autogenerated function, returning the group, version, and kind that should be used instead of this deprecated type. +// It is controlled by "k8s:prerelease-lifecycle-gen:replacement=,," tags in types.go. +func (in *VolumeAttachmentList) APILifecycleReplacement() schema.GroupVersionKind { + return schema.GroupVersionKind{Group: "storage.k8s.io", Version: "v1", Kind: "VolumeAttachmentList"} +} + +// APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:removed" tags in types.go or "k8s:prerelease-lifecycle-gen:deprecated" plus three minor. +func (in *VolumeAttachmentList) APILifecycleRemoved() (major, minor int) { + return 1, 24 +} diff --git a/vendor/k8s.io/api/storage/v1beta1/BUILD b/vendor/k8s.io/api/storage/v1beta1/BUILD deleted file mode 100644 index 674247c00ee8..000000000000 --- a/vendor/k8s.io/api/storage/v1beta1/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - "zz_generated.prerelease-lifecycle.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/api/storage/v1beta1", - importpath = "k8s.io/api/storage/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/storage/v1beta1/generated.pb.go b/vendor/k8s.io/api/storage/v1beta1/generated.pb.go index 21f664094e2f..72b04d2733dc 100644 --- a/vendor/k8s.io/api/storage/v1beta1/generated.pb.go +++ b/vendor/k8s.io/api/storage/v1beta1/generated.pb.go @@ -28,6 +28,8 @@ import ( github_com_gogo_protobuf_sortkeys "github.com/gogo/protobuf/sortkeys" k8s_io_api_core_v1 "k8s.io/api/core/v1" v11 "k8s.io/api/core/v1" + resource "k8s.io/apimachinery/pkg/api/resource" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" math "math" math_bits "math/bits" @@ -242,10 +244,66 @@ func (m *CSINodeSpec) XXX_DiscardUnknown() { var xxx_messageInfo_CSINodeSpec proto.InternalMessageInfo +func (m *CSIStorageCapacity) Reset() { *m = CSIStorageCapacity{} } +func (*CSIStorageCapacity) ProtoMessage() {} +func (*CSIStorageCapacity) Descriptor() ([]byte, []int) { + return fileDescriptor_7d2980599fd0de80, []int{7} +} +func (m *CSIStorageCapacity) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *CSIStorageCapacity) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *CSIStorageCapacity) XXX_Merge(src proto.Message) { + xxx_messageInfo_CSIStorageCapacity.Merge(m, src) +} +func (m *CSIStorageCapacity) XXX_Size() int { + return m.Size() +} +func (m *CSIStorageCapacity) XXX_DiscardUnknown() { + xxx_messageInfo_CSIStorageCapacity.DiscardUnknown(m) +} + +var xxx_messageInfo_CSIStorageCapacity proto.InternalMessageInfo + +func (m *CSIStorageCapacityList) Reset() { *m = CSIStorageCapacityList{} } +func (*CSIStorageCapacityList) ProtoMessage() {} +func (*CSIStorageCapacityList) Descriptor() ([]byte, []int) { + return fileDescriptor_7d2980599fd0de80, []int{8} +} +func (m *CSIStorageCapacityList) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *CSIStorageCapacityList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *CSIStorageCapacityList) XXX_Merge(src proto.Message) { + xxx_messageInfo_CSIStorageCapacityList.Merge(m, src) +} +func (m *CSIStorageCapacityList) XXX_Size() int { + return m.Size() +} +func (m *CSIStorageCapacityList) XXX_DiscardUnknown() { + xxx_messageInfo_CSIStorageCapacityList.DiscardUnknown(m) +} + +var xxx_messageInfo_CSIStorageCapacityList proto.InternalMessageInfo + func (m *StorageClass) Reset() { *m = StorageClass{} } func (*StorageClass) ProtoMessage() {} func (*StorageClass) Descriptor() ([]byte, []int) { - return fileDescriptor_7d2980599fd0de80, []int{7} + return fileDescriptor_7d2980599fd0de80, []int{9} } func (m *StorageClass) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -273,7 +331,7 @@ var xxx_messageInfo_StorageClass proto.InternalMessageInfo func (m *StorageClassList) Reset() { *m = StorageClassList{} } func (*StorageClassList) ProtoMessage() {} func (*StorageClassList) Descriptor() ([]byte, []int) { - return fileDescriptor_7d2980599fd0de80, []int{8} + return fileDescriptor_7d2980599fd0de80, []int{10} } func (m *StorageClassList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -301,7 +359,7 @@ var xxx_messageInfo_StorageClassList proto.InternalMessageInfo func (m *TokenRequest) Reset() { *m = TokenRequest{} } func (*TokenRequest) ProtoMessage() {} func (*TokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_7d2980599fd0de80, []int{9} + return fileDescriptor_7d2980599fd0de80, []int{11} } func (m *TokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -329,7 +387,7 @@ var xxx_messageInfo_TokenRequest proto.InternalMessageInfo func (m *VolumeAttachment) Reset() { *m = VolumeAttachment{} } func (*VolumeAttachment) ProtoMessage() {} func (*VolumeAttachment) Descriptor() ([]byte, []int) { - return fileDescriptor_7d2980599fd0de80, []int{10} + return fileDescriptor_7d2980599fd0de80, []int{12} } func (m *VolumeAttachment) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -357,7 +415,7 @@ var xxx_messageInfo_VolumeAttachment proto.InternalMessageInfo func (m *VolumeAttachmentList) Reset() { *m = VolumeAttachmentList{} } func (*VolumeAttachmentList) ProtoMessage() {} func (*VolumeAttachmentList) Descriptor() ([]byte, []int) { - return fileDescriptor_7d2980599fd0de80, []int{11} + return fileDescriptor_7d2980599fd0de80, []int{13} } func (m *VolumeAttachmentList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -385,7 +443,7 @@ var xxx_messageInfo_VolumeAttachmentList proto.InternalMessageInfo func (m *VolumeAttachmentSource) Reset() { *m = VolumeAttachmentSource{} } func (*VolumeAttachmentSource) ProtoMessage() {} func (*VolumeAttachmentSource) Descriptor() ([]byte, []int) { - return fileDescriptor_7d2980599fd0de80, []int{12} + return fileDescriptor_7d2980599fd0de80, []int{14} } func (m *VolumeAttachmentSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -413,7 +471,7 @@ var xxx_messageInfo_VolumeAttachmentSource proto.InternalMessageInfo func (m *VolumeAttachmentSpec) Reset() { *m = VolumeAttachmentSpec{} } func (*VolumeAttachmentSpec) ProtoMessage() {} func (*VolumeAttachmentSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_7d2980599fd0de80, []int{13} + return fileDescriptor_7d2980599fd0de80, []int{15} } func (m *VolumeAttachmentSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -441,7 +499,7 @@ var xxx_messageInfo_VolumeAttachmentSpec proto.InternalMessageInfo func (m *VolumeAttachmentStatus) Reset() { *m = VolumeAttachmentStatus{} } func (*VolumeAttachmentStatus) ProtoMessage() {} func (*VolumeAttachmentStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_7d2980599fd0de80, []int{14} + return fileDescriptor_7d2980599fd0de80, []int{16} } func (m *VolumeAttachmentStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -469,7 +527,7 @@ var xxx_messageInfo_VolumeAttachmentStatus proto.InternalMessageInfo func (m *VolumeError) Reset() { *m = VolumeError{} } func (*VolumeError) ProtoMessage() {} func (*VolumeError) Descriptor() ([]byte, []int) { - return fileDescriptor_7d2980599fd0de80, []int{15} + return fileDescriptor_7d2980599fd0de80, []int{17} } func (m *VolumeError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -497,7 +555,7 @@ var xxx_messageInfo_VolumeError proto.InternalMessageInfo func (m *VolumeNodeResources) Reset() { *m = VolumeNodeResources{} } func (*VolumeNodeResources) ProtoMessage() {} func (*VolumeNodeResources) Descriptor() ([]byte, []int) { - return fileDescriptor_7d2980599fd0de80, []int{16} + return fileDescriptor_7d2980599fd0de80, []int{18} } func (m *VolumeNodeResources) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -530,6 +588,8 @@ func init() { proto.RegisterType((*CSINodeDriver)(nil), "k8s.io.api.storage.v1beta1.CSINodeDriver") proto.RegisterType((*CSINodeList)(nil), "k8s.io.api.storage.v1beta1.CSINodeList") proto.RegisterType((*CSINodeSpec)(nil), "k8s.io.api.storage.v1beta1.CSINodeSpec") + proto.RegisterType((*CSIStorageCapacity)(nil), "k8s.io.api.storage.v1beta1.CSIStorageCapacity") + proto.RegisterType((*CSIStorageCapacityList)(nil), "k8s.io.api.storage.v1beta1.CSIStorageCapacityList") proto.RegisterType((*StorageClass)(nil), "k8s.io.api.storage.v1beta1.StorageClass") proto.RegisterMapType((map[string]string)(nil), "k8s.io.api.storage.v1beta1.StorageClass.ParametersEntry") proto.RegisterType((*StorageClassList)(nil), "k8s.io.api.storage.v1beta1.StorageClassList") @@ -549,102 +609,111 @@ func init() { } var fileDescriptor_7d2980599fd0de80 = []byte{ - // 1508 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x57, 0xbd, 0x6f, 0x1b, 0x47, - 0x16, 0xd7, 0x8a, 0xd4, 0xd7, 0x50, 0xb2, 0xa4, 0x91, 0x7c, 0xc7, 0x53, 0x41, 0x0a, 0x3c, 0xdc, - 0x59, 0x36, 0xec, 0xa5, 0x2d, 0xf8, 0x0c, 0xc3, 0x80, 0x0b, 0xad, 0xac, 0x3b, 0xcb, 0x96, 0x64, - 0xdd, 0x50, 0x30, 0x0e, 0xc6, 0x15, 0x19, 0xee, 0x3e, 0x51, 0x6b, 0x71, 0x77, 0xd6, 0x3b, 0x43, - 0xc5, 0xec, 0x92, 0x26, 0x75, 0x90, 0x22, 0x7d, 0x80, 0xfc, 0x0b, 0x09, 0x90, 0x34, 0x29, 0xe3, - 0x2a, 0x30, 0x52, 0xb9, 0x22, 0x62, 0xe6, 0x4f, 0x48, 0x27, 0xa4, 0x08, 0x66, 0x76, 0xc8, 0xfd, - 0x20, 0x69, 0x49, 0x29, 0xd4, 0x71, 0xde, 0xc7, 0xef, 0xbd, 0x79, 0xef, 0xcd, 0xef, 0x2d, 0xd1, - 0xe6, 0xf1, 0x7d, 0x6e, 0xba, 0xac, 0x7a, 0xdc, 0xaa, 0x43, 0xe8, 0x83, 0x00, 0x5e, 0x3d, 0x01, - 0xdf, 0x61, 0x61, 0x55, 0x2b, 0x68, 0xe0, 0x56, 0xb9, 0x60, 0x21, 0x6d, 0x40, 0xf5, 0xe4, 0x4e, - 0x1d, 0x04, 0xbd, 0x53, 0x6d, 0x80, 0x0f, 0x21, 0x15, 0xe0, 0x98, 0x41, 0xc8, 0x04, 0xc3, 0x2b, - 0x91, 0xad, 0x49, 0x03, 0xd7, 0xd4, 0xb6, 0xa6, 0xb6, 0x5d, 0xb9, 0xd5, 0x70, 0xc5, 0x51, 0xab, - 0x6e, 0xda, 0xcc, 0xab, 0x36, 0x58, 0x83, 0x55, 0x95, 0x4b, 0xbd, 0x75, 0xa8, 0x4e, 0xea, 0xa0, - 0x7e, 0x45, 0x50, 0x2b, 0x95, 0x44, 0x58, 0x9b, 0x85, 0x32, 0x66, 0x36, 0xdc, 0xca, 0xdd, 0xd8, - 0xc6, 0xa3, 0xf6, 0x91, 0xeb, 0x43, 0xd8, 0xae, 0x06, 0xc7, 0x0d, 0x29, 0xe0, 0x55, 0x0f, 0x04, - 0x1d, 0xe6, 0x55, 0x1d, 0xe5, 0x15, 0xb6, 0x7c, 0xe1, 0x7a, 0x30, 0xe0, 0x70, 0xef, 0x2c, 0x07, - 0x6e, 0x1f, 0x81, 0x47, 0xb3, 0x7e, 0x95, 0xef, 0x0d, 0x34, 0xb3, 0x59, 0xdb, 0x7e, 0x14, 0xba, - 0x27, 0x10, 0xe2, 0x8f, 0xd0, 0xb4, 0xcc, 0xc8, 0xa1, 0x82, 0x16, 0x8d, 0x55, 0x63, 0xad, 0xb0, - 0x7e, 0xdb, 0x8c, 0xcb, 0xd5, 0x07, 0x36, 0x83, 0xe3, 0x86, 0x14, 0x70, 0x53, 0x5a, 0x9b, 0x27, - 0x77, 0xcc, 0x67, 0xf5, 0x97, 0x60, 0x8b, 0x5d, 0x10, 0xd4, 0xc2, 0x6f, 0x3a, 0xe5, 0xb1, 0x6e, - 0xa7, 0x8c, 0x62, 0x19, 0xe9, 0xa3, 0xe2, 0xa7, 0x28, 0xcf, 0x03, 0xb0, 0x8b, 0xe3, 0x0a, 0xfd, - 0xba, 0x39, 0xba, 0x19, 0x66, 0x3f, 0xad, 0x5a, 0x00, 0xb6, 0x35, 0xab, 0x61, 0xf3, 0xf2, 0x44, - 0x14, 0x48, 0xe5, 0x3b, 0x03, 0xcd, 0xf5, 0xad, 0x76, 0x5c, 0x2e, 0xf0, 0xff, 0x07, 0x2e, 0x60, - 0x9e, 0xef, 0x02, 0xd2, 0x5b, 0xa5, 0xbf, 0xa0, 0xe3, 0x4c, 0xf7, 0x24, 0x89, 0xe4, 0x9f, 0xa0, - 0x09, 0x57, 0x80, 0xc7, 0x8b, 0xe3, 0xab, 0xb9, 0xb5, 0xc2, 0xfa, 0x3f, 0xce, 0x95, 0xbd, 0x35, - 0xa7, 0x11, 0x27, 0xb6, 0xa5, 0x2f, 0x89, 0x20, 0x2a, 0x5f, 0xe5, 0x13, 0xb9, 0xcb, 0x3b, 0xe1, - 0x07, 0xe8, 0x0a, 0x15, 0x82, 0xda, 0x47, 0x04, 0x5e, 0xb5, 0xdc, 0x10, 0x1c, 0x75, 0x83, 0x69, - 0x0b, 0x77, 0x3b, 0xe5, 0x2b, 0x1b, 0x29, 0x0d, 0xc9, 0x58, 0x4a, 0xdf, 0x80, 0x39, 0xdb, 0xfe, - 0x21, 0x7b, 0xe6, 0xef, 0xb2, 0x96, 0x2f, 0x54, 0x81, 0xb5, 0xef, 0x7e, 0x4a, 0x43, 0x32, 0x96, - 0xd8, 0x46, 0xcb, 0x27, 0xac, 0xd9, 0xf2, 0x60, 0xc7, 0x3d, 0x04, 0xbb, 0x6d, 0x37, 0x61, 0x97, - 0x39, 0xc0, 0x8b, 0xb9, 0xd5, 0xdc, 0xda, 0x8c, 0x55, 0xed, 0x76, 0xca, 0xcb, 0xcf, 0x87, 0xe8, - 0x4f, 0x3b, 0xe5, 0xa5, 0x21, 0x72, 0x32, 0x14, 0x0c, 0x3f, 0x44, 0xf3, 0xba, 0x42, 0x9b, 0x34, - 0xa0, 0xb6, 0x2b, 0xda, 0xc5, 0xbc, 0xca, 0x70, 0xa9, 0xdb, 0x29, 0xcf, 0xd7, 0xd2, 0x2a, 0x92, - 0xb5, 0xc5, 0x8f, 0xd1, 0xdc, 0x21, 0xff, 0x4f, 0xc8, 0x5a, 0xc1, 0x3e, 0x6b, 0xba, 0x76, 0xbb, - 0x38, 0xb1, 0x6a, 0xac, 0xcd, 0x58, 0x95, 0x6e, 0xa7, 0x3c, 0xf7, 0xef, 0x5a, 0x42, 0x71, 0x9a, - 0x15, 0x90, 0xb4, 0x23, 0x06, 0x34, 0x27, 0xd8, 0x31, 0xf8, 0xb2, 0x74, 0xc0, 0x05, 0x2f, 0x4e, - 0xaa, 0x5e, 0xae, 0x7d, 0xa8, 0x97, 0x07, 0x09, 0x07, 0xeb, 0xaa, 0x6e, 0xe7, 0x5c, 0x52, 0xca, - 0x49, 0x1a, 0x15, 0x6f, 0xa2, 0xc5, 0x30, 0x6a, 0x0e, 0x27, 0x10, 0xb4, 0xea, 0x4d, 0x97, 0x1f, - 0x15, 0xa7, 0xd4, 0x8d, 0xaf, 0x76, 0x3b, 0xe5, 0x45, 0x92, 0x55, 0x92, 0x41, 0xfb, 0xca, 0xb7, - 0x06, 0x9a, 0xda, 0xac, 0x6d, 0xef, 0x31, 0x07, 0x2e, 0xe1, 0x69, 0x6e, 0xa7, 0x9e, 0xe6, 0xb5, - 0x33, 0x86, 0x5b, 0x26, 0x35, 0xf2, 0x61, 0xfe, 0x16, 0x3d, 0x4c, 0x69, 0xa3, 0x99, 0x65, 0x15, - 0xe5, 0x7d, 0xea, 0x81, 0x4a, 0x7d, 0x26, 0xf6, 0xd9, 0xa3, 0x1e, 0x10, 0xa5, 0xc1, 0xff, 0x44, - 0x93, 0x3e, 0x73, 0x60, 0xfb, 0x91, 0x4a, 0x60, 0xc6, 0xba, 0xa2, 0x6d, 0x26, 0xf7, 0x94, 0x94, - 0x68, 0x2d, 0xbe, 0x8b, 0x66, 0x05, 0x0b, 0x58, 0x93, 0x35, 0xda, 0x4f, 0xa1, 0xdd, 0x1b, 0xd3, - 0x85, 0x6e, 0xa7, 0x3c, 0x7b, 0x90, 0x90, 0x93, 0x94, 0x15, 0xae, 0xa3, 0x02, 0x6d, 0x36, 0x99, - 0x4d, 0x05, 0xad, 0x37, 0x41, 0xcd, 0x5e, 0x61, 0xbd, 0xfa, 0xa1, 0x3b, 0x46, 0xb3, 0x2d, 0x83, - 0x13, 0xe0, 0xac, 0x15, 0xda, 0xc0, 0xad, 0xf9, 0x6e, 0xa7, 0x5c, 0xd8, 0x88, 0x71, 0x48, 0x12, - 0xb4, 0xf2, 0x8d, 0x81, 0x0a, 0xfa, 0xd6, 0x97, 0x40, 0x46, 0x8f, 0xd3, 0x64, 0xf4, 0xf7, 0x73, - 0xf4, 0x6b, 0x04, 0x15, 0xd9, 0xfd, 0xb4, 0x15, 0x0f, 0x1d, 0xa0, 0x29, 0x47, 0x35, 0x8d, 0x17, - 0x0d, 0x05, 0x7d, 0xfd, 0x1c, 0xd0, 0x9a, 0xeb, 0xe6, 0x75, 0x80, 0xa9, 0xe8, 0xcc, 0x49, 0x0f, - 0xaa, 0xf2, 0xc5, 0x24, 0x9a, 0xed, 0x3d, 0xf3, 0x26, 0xe5, 0xfc, 0x12, 0x06, 0xfa, 0x5f, 0xa8, - 0x10, 0x84, 0xec, 0xc4, 0xe5, 0x2e, 0xf3, 0x21, 0xd4, 0x63, 0xb5, 0xa4, 0x5d, 0x0a, 0xfb, 0xb1, - 0x8a, 0x24, 0xed, 0x70, 0x13, 0xa1, 0x80, 0x86, 0xd4, 0x03, 0x21, 0x4b, 0x90, 0x53, 0x25, 0xb8, - 0xff, 0xa1, 0x12, 0x24, 0xaf, 0x65, 0xee, 0xf7, 0x5d, 0xb7, 0x7c, 0x11, 0xb6, 0xe3, 0x14, 0x63, - 0x05, 0x49, 0xe0, 0xe3, 0x63, 0x34, 0x17, 0x82, 0xdd, 0xa4, 0xae, 0xa7, 0x99, 0x2d, 0xaf, 0xd2, - 0xdc, 0x92, 0x0c, 0x43, 0x92, 0x8a, 0xd3, 0x4e, 0xf9, 0xf6, 0xe0, 0xf7, 0x86, 0xb9, 0x0f, 0x21, - 0x77, 0xb9, 0x00, 0x5f, 0x44, 0x03, 0x9b, 0xf2, 0x21, 0x69, 0x6c, 0xf9, 0x76, 0x3c, 0xc9, 0xf9, - 0xcf, 0x02, 0xe1, 0x32, 0x9f, 0x17, 0x27, 0xe2, 0xb7, 0xb3, 0x9b, 0x90, 0x93, 0x94, 0x15, 0xde, - 0x41, 0xcb, 0x72, 0xcc, 0x3f, 0x8e, 0x02, 0x6c, 0xbd, 0x0e, 0xa8, 0x2f, 0x4b, 0x55, 0x9c, 0x54, - 0x74, 0x56, 0x94, 0x0b, 0x62, 0x63, 0x88, 0x9e, 0x0c, 0xf5, 0xc2, 0xff, 0x43, 0x8b, 0xd1, 0x86, - 0xb0, 0x5c, 0xdf, 0x71, 0xfd, 0x86, 0xdc, 0x0f, 0x8a, 0x19, 0x67, 0xac, 0x1b, 0x92, 0x19, 0x9f, - 0x67, 0x95, 0xa7, 0xc3, 0x84, 0x64, 0x10, 0x04, 0xbf, 0x42, 0x8b, 0x2a, 0x22, 0x38, 0x9a, 0x08, - 0x5c, 0xe0, 0xc5, 0xe9, 0x41, 0x7a, 0x97, 0xa5, 0x93, 0x83, 0xd4, 0xa3, 0x8b, 0x1a, 0x34, 0xc1, - 0x16, 0x2c, 0x3c, 0x80, 0xd0, 0xb3, 0xfe, 0xa6, 0xfb, 0xb5, 0xb8, 0x91, 0x85, 0x22, 0x83, 0xe8, - 0x2b, 0x0f, 0xd1, 0x7c, 0xa6, 0xe1, 0x78, 0x01, 0xe5, 0x8e, 0xa1, 0x1d, 0x11, 0x1d, 0x91, 0x3f, - 0xf1, 0x32, 0x9a, 0x38, 0xa1, 0xcd, 0x16, 0x44, 0x13, 0x48, 0xa2, 0xc3, 0x83, 0xf1, 0xfb, 0x46, - 0xe5, 0x07, 0x03, 0x2d, 0x24, 0xa7, 0xe7, 0x12, 0x68, 0x63, 0x37, 0x4d, 0x1b, 0x6b, 0xe7, 0x1d, - 0xec, 0x11, 0xdc, 0xf1, 0xa9, 0x81, 0x66, 0x93, 0x8b, 0x10, 0xdf, 0x44, 0xd3, 0xb4, 0xe5, 0xb8, - 0xe0, 0xdb, 0x3d, 0xb2, 0xef, 0x67, 0xb3, 0xa1, 0xe5, 0xa4, 0x6f, 0x21, 0xd7, 0x24, 0xbc, 0x0e, - 0xdc, 0x90, 0xca, 0x49, 0xab, 0x81, 0xcd, 0x7c, 0x87, 0xab, 0x32, 0xe5, 0xa2, 0x35, 0xb9, 0x95, - 0x55, 0x92, 0x41, 0xfb, 0xca, 0xd7, 0xe3, 0x68, 0x21, 0x1a, 0x90, 0xe8, 0x2b, 0xc9, 0x03, 0x5f, - 0x5c, 0x02, 0xbd, 0x90, 0xd4, 0xbe, 0xbc, 0x7d, 0xf6, 0x2e, 0x89, 0xb3, 0x1b, 0xb5, 0x38, 0xf1, - 0x0b, 0x34, 0xc9, 0x05, 0x15, 0x2d, 0xc9, 0x3b, 0x12, 0x75, 0xfd, 0x42, 0xa8, 0xca, 0x33, 0x5e, - 0x9c, 0xd1, 0x99, 0x68, 0xc4, 0xca, 0x8f, 0x06, 0x5a, 0xce, 0xba, 0x5c, 0xc2, 0xc0, 0xfd, 0x37, - 0x3d, 0x70, 0x37, 0x2f, 0x72, 0xa3, 0x11, 0x43, 0xf7, 0xb3, 0x81, 0xfe, 0x32, 0x70, 0x79, 0xb5, - 0xa2, 0x25, 0x57, 0x05, 0x19, 0x46, 0xdc, 0x8b, 0xbf, 0x3b, 0x14, 0x57, 0xed, 0x0f, 0xd1, 0x93, - 0xa1, 0x5e, 0xf8, 0x25, 0x5a, 0x70, 0xfd, 0xa6, 0xeb, 0x43, 0x24, 0xab, 0xc5, 0xed, 0x1e, 0x4a, - 0x28, 0x59, 0x64, 0xd5, 0xe6, 0xe5, 0x6e, 0xa7, 0xbc, 0xb0, 0x9d, 0x41, 0x21, 0x03, 0xb8, 0x95, - 0x9f, 0x86, 0xb4, 0x47, 0xed, 0x63, 0xf9, 0xa2, 0x94, 0x04, 0xc2, 0x81, 0x17, 0xa5, 0xe5, 0xa4, - 0x6f, 0xa1, 0x26, 0x48, 0x95, 0x42, 0x27, 0x7a, 0xb1, 0x09, 0x52, 0x9e, 0x89, 0x09, 0x52, 0x67, - 0xa2, 0x11, 0x65, 0x26, 0xf2, 0x23, 0x4c, 0x15, 0x34, 0x97, 0xce, 0x64, 0x4f, 0xcb, 0x49, 0xdf, - 0xa2, 0xf2, 0x7b, 0x6e, 0x48, 0x97, 0xd4, 0x28, 0x26, 0xae, 0xd4, 0xfb, 0x93, 0x93, 0xbd, 0x92, - 0xd3, 0xbf, 0x92, 0x83, 0xbf, 0x34, 0x10, 0xa6, 0x7d, 0x88, 0xdd, 0xde, 0xa8, 0x46, 0xf3, 0xf4, - 0xe4, 0xe2, 0x2f, 0xc4, 0xdc, 0x18, 0x00, 0x8b, 0x76, 0xf5, 0x8a, 0x4e, 0x02, 0x0f, 0x1a, 0x90, - 0x21, 0x19, 0x60, 0x17, 0x15, 0x22, 0xe9, 0x56, 0x18, 0xb2, 0x50, 0x3f, 0xd9, 0x6b, 0x67, 0x27, - 0xa4, 0xcc, 0xad, 0x92, 0xfa, 0x98, 0x8c, 0xfd, 0x4f, 0x3b, 0xe5, 0x42, 0x42, 0x4f, 0x92, 0xd8, - 0x32, 0x94, 0x03, 0x71, 0xa8, 0xfc, 0x9f, 0x08, 0xf5, 0x08, 0x46, 0x87, 0x4a, 0x60, 0xaf, 0x6c, - 0xa1, 0xbf, 0x8e, 0x28, 0xd0, 0x85, 0x76, 0xdb, 0x67, 0x06, 0x4a, 0xc6, 0xc0, 0x3b, 0x28, 0x2f, - 0x5c, 0xfd, 0x12, 0x0b, 0xeb, 0x37, 0xce, 0xc7, 0x30, 0x07, 0xae, 0x07, 0x31, 0x51, 0xca, 0x13, - 0x51, 0x28, 0xf8, 0x3a, 0x9a, 0xf2, 0x80, 0x73, 0xda, 0xd0, 0x91, 0xe3, 0x2f, 0xcf, 0xdd, 0x48, - 0x4c, 0x7a, 0xfa, 0xca, 0x3d, 0xb4, 0x34, 0xe4, 0x5b, 0x1e, 0x97, 0xd1, 0x84, 0xad, 0xfe, 0x29, - 0xcb, 0x84, 0x26, 0xac, 0x19, 0xc9, 0x32, 0x9b, 0xea, 0x0f, 0x72, 0x24, 0xb7, 0x6e, 0xbd, 0x79, - 0x5f, 0x1a, 0x7b, 0xfb, 0xbe, 0x34, 0xf6, 0xee, 0x7d, 0x69, 0xec, 0x93, 0x6e, 0xc9, 0x78, 0xd3, - 0x2d, 0x19, 0x6f, 0xbb, 0x25, 0xe3, 0x5d, 0xb7, 0x64, 0xfc, 0xd2, 0x2d, 0x19, 0x9f, 0xff, 0x5a, - 0x1a, 0x7b, 0x31, 0xa5, 0xeb, 0xfd, 0x47, 0x00, 0x00, 0x00, 0xff, 0xff, 0x6a, 0xb1, 0x9d, 0x65, - 0x9d, 0x12, 0x00, 0x00, + // 1651 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x58, 0x3b, 0x6f, 0x1b, 0xc7, + 0x16, 0xd6, 0x8a, 0xd4, 0x6b, 0x28, 0x59, 0xd2, 0x48, 0xf6, 0xe5, 0x55, 0x41, 0x0a, 0xbc, 0xb8, + 0xd7, 0xb2, 0x61, 0x2f, 0x6d, 0x5d, 0xc7, 0x30, 0x0c, 0xb8, 0xd0, 0x4a, 0x4a, 0x4c, 0x5b, 0x94, + 0xe5, 0xa1, 0x60, 0x18, 0x46, 0x8a, 0x0c, 0x77, 0x47, 0xd4, 0x58, 0xdc, 0x87, 0x77, 0x86, 0x8a, + 0x99, 0x2a, 0x69, 0x52, 0x07, 0x29, 0xd2, 0x07, 0xc8, 0x5f, 0x48, 0x80, 0xa4, 0x49, 0x19, 0x03, + 0x01, 0x02, 0x23, 0x95, 0x2b, 0x22, 0x66, 0x7e, 0x42, 0x80, 0x14, 0x42, 0x8a, 0x60, 0x66, 0x87, + 0xdc, 0x17, 0x69, 0x49, 0x29, 0xd8, 0x69, 0xcf, 0xe3, 0x3b, 0x67, 0xe6, 0x7c, 0xe7, 0xcc, 0xa1, + 0xc0, 0xe6, 0xd1, 0x1d, 0xa6, 0x53, 0xb7, 0x7c, 0xd4, 0xaa, 0x13, 0xdf, 0x21, 0x9c, 0xb0, 0xf2, + 0x31, 0x71, 0x2c, 0xd7, 0x2f, 0x2b, 0x05, 0xf6, 0x68, 0x99, 0x71, 0xd7, 0xc7, 0x0d, 0x52, 0x3e, + 0xbe, 0x59, 0x27, 0x1c, 0xdf, 0x2c, 0x37, 0x88, 0x43, 0x7c, 0xcc, 0x89, 0xa5, 0x7b, 0xbe, 0xcb, + 0x5d, 0xb8, 0x12, 0xd8, 0xea, 0xd8, 0xa3, 0xba, 0xb2, 0xd5, 0x95, 0xed, 0xca, 0xf5, 0x06, 0xe5, + 0x87, 0xad, 0xba, 0x6e, 0xba, 0x76, 0xb9, 0xe1, 0x36, 0xdc, 0xb2, 0x74, 0xa9, 0xb7, 0x0e, 0xe4, + 0x97, 0xfc, 0x90, 0x7f, 0x05, 0x50, 0x2b, 0xa5, 0x48, 0x58, 0xd3, 0xf5, 0x45, 0xcc, 0x64, 0xb8, + 0x95, 0x5b, 0xa1, 0x8d, 0x8d, 0xcd, 0x43, 0xea, 0x10, 0xbf, 0x5d, 0xf6, 0x8e, 0x1a, 0xd2, 0xc9, + 0x27, 0xcc, 0x6d, 0xf9, 0x26, 0x39, 0x97, 0x17, 0x2b, 0xdb, 0x84, 0xe3, 0x41, 0xb1, 0xca, 0xc3, + 0xbc, 0xfc, 0x96, 0xc3, 0xa9, 0x9d, 0x0e, 0x73, 0xfb, 0x34, 0x07, 0x66, 0x1e, 0x12, 0x1b, 0x27, + 0xfd, 0x4a, 0x3f, 0x68, 0x60, 0x66, 0xb3, 0x56, 0xd9, 0xf2, 0xe9, 0x31, 0xf1, 0xe1, 0x47, 0x60, + 0x5a, 0x64, 0x64, 0x61, 0x8e, 0xf3, 0xda, 0xaa, 0xb6, 0x96, 0x5b, 0xbf, 0xa1, 0x87, 0x97, 0xdc, + 0x07, 0xd6, 0xbd, 0xa3, 0x86, 0x10, 0x30, 0x5d, 0x58, 0xeb, 0xc7, 0x37, 0xf5, 0x47, 0xf5, 0xe7, + 0xc4, 0xe4, 0x55, 0xc2, 0xb1, 0x01, 0x5f, 0x75, 0x8a, 0x63, 0xdd, 0x4e, 0x11, 0x84, 0x32, 0xd4, + 0x47, 0x85, 0x0f, 0x41, 0x96, 0x79, 0xc4, 0xcc, 0x8f, 0x4b, 0xf4, 0x2b, 0xfa, 0xf0, 0x12, 0xea, + 0xfd, 0xb4, 0x6a, 0x1e, 0x31, 0x8d, 0x59, 0x05, 0x9b, 0x15, 0x5f, 0x48, 0x82, 0x94, 0xbe, 0xd7, + 0xc0, 0x5c, 0xdf, 0x6a, 0x87, 0x32, 0x0e, 0x3f, 0x4c, 0x1d, 0x40, 0x3f, 0xdb, 0x01, 0x84, 0xb7, + 0x4c, 0x7f, 0x41, 0xc5, 0x99, 0xee, 0x49, 0x22, 0xc9, 0x3f, 0x00, 0x13, 0x94, 0x13, 0x9b, 0xe5, + 0xc7, 0x57, 0x33, 0x6b, 0xb9, 0xf5, 0xff, 0x9e, 0x29, 0x7b, 0x63, 0x4e, 0x21, 0x4e, 0x54, 0x84, + 0x2f, 0x0a, 0x20, 0x4a, 0x5f, 0x67, 0x23, 0xb9, 0x8b, 0x33, 0xc1, 0xbb, 0xe0, 0x02, 0xe6, 0x1c, + 0x9b, 0x87, 0x88, 0xbc, 0x68, 0x51, 0x9f, 0x58, 0xf2, 0x04, 0xd3, 0x06, 0xec, 0x76, 0x8a, 0x17, + 0x36, 0x62, 0x1a, 0x94, 0xb0, 0x14, 0xbe, 0x9e, 0x6b, 0x55, 0x9c, 0x03, 0xf7, 0x91, 0x53, 0x75, + 0x5b, 0x0e, 0x97, 0x17, 0xac, 0x7c, 0xf7, 0x62, 0x1a, 0x94, 0xb0, 0x84, 0x26, 0x58, 0x3e, 0x76, + 0x9b, 0x2d, 0x9b, 0xec, 0xd0, 0x03, 0x62, 0xb6, 0xcd, 0x26, 0xa9, 0xba, 0x16, 0x61, 0xf9, 0xcc, + 0x6a, 0x66, 0x6d, 0xc6, 0x28, 0x77, 0x3b, 0xc5, 0xe5, 0x27, 0x03, 0xf4, 0x27, 0x9d, 0xe2, 0xd2, + 0x00, 0x39, 0x1a, 0x08, 0x06, 0xef, 0x81, 0x79, 0x75, 0x43, 0x9b, 0xd8, 0xc3, 0x26, 0xe5, 0xed, + 0x7c, 0x56, 0x66, 0xb8, 0xd4, 0xed, 0x14, 0xe7, 0x6b, 0x71, 0x15, 0x4a, 0xda, 0xc2, 0xfb, 0x60, + 0xee, 0x80, 0x7d, 0xe0, 0xbb, 0x2d, 0x6f, 0xcf, 0x6d, 0x52, 0xb3, 0x9d, 0x9f, 0x58, 0xd5, 0xd6, + 0x66, 0x8c, 0x52, 0xb7, 0x53, 0x9c, 0x7b, 0xbf, 0x16, 0x51, 0x9c, 0x24, 0x05, 0x28, 0xee, 0x08, + 0x09, 0x98, 0xe3, 0xee, 0x11, 0x71, 0xc4, 0xd5, 0x11, 0xc6, 0x59, 0x7e, 0x52, 0xd6, 0x72, 0xed, + 0x5d, 0xb5, 0xdc, 0x8f, 0x38, 0x18, 0x17, 0x55, 0x39, 0xe7, 0xa2, 0x52, 0x86, 0xe2, 0xa8, 0x70, + 0x13, 0x2c, 0xfa, 0x41, 0x71, 0x18, 0x22, 0x5e, 0xab, 0xde, 0xa4, 0xec, 0x30, 0x3f, 0x25, 0x4f, + 0x7c, 0xb1, 0xdb, 0x29, 0x2e, 0xa2, 0xa4, 0x12, 0xa5, 0xed, 0x4b, 0xdf, 0x69, 0x60, 0x6a, 0xb3, + 0x56, 0xd9, 0x75, 0x2d, 0x32, 0x82, 0xd6, 0xac, 0xc4, 0x5a, 0xf3, 0xf2, 0x29, 0xe4, 0x16, 0x49, + 0x0d, 0x6d, 0xcc, 0x3f, 0x82, 0xc6, 0x14, 0x36, 0x6a, 0xb2, 0xac, 0x82, 0xac, 0x83, 0x6d, 0x22, + 0x53, 0x9f, 0x09, 0x7d, 0x76, 0xb1, 0x4d, 0x90, 0xd4, 0xc0, 0xff, 0x81, 0x49, 0xc7, 0xb5, 0x48, + 0x65, 0x4b, 0x26, 0x30, 0x63, 0x5c, 0x50, 0x36, 0x93, 0xbb, 0x52, 0x8a, 0x94, 0x16, 0xde, 0x02, + 0xb3, 0xdc, 0xf5, 0xdc, 0xa6, 0xdb, 0x68, 0x3f, 0x24, 0xed, 0x1e, 0x4d, 0x17, 0xba, 0x9d, 0xe2, + 0xec, 0x7e, 0x44, 0x8e, 0x62, 0x56, 0xb0, 0x0e, 0x72, 0xb8, 0xd9, 0x74, 0x4d, 0xcc, 0x71, 0xbd, + 0x49, 0x24, 0xf7, 0x72, 0xeb, 0xe5, 0x77, 0x9d, 0x31, 0xe0, 0xb6, 0x08, 0x8e, 0xd4, 0x6c, 0x67, + 0xc6, 0x7c, 0xb7, 0x53, 0xcc, 0x6d, 0x84, 0x38, 0x28, 0x0a, 0x5a, 0xfa, 0x56, 0x03, 0x39, 0x75, + 0xea, 0x11, 0x0c, 0xa3, 0xfb, 0xf1, 0x61, 0xf4, 0x9f, 0x33, 0xd4, 0x6b, 0xc8, 0x28, 0x32, 0xfb, + 0x69, 0xcb, 0x39, 0xb4, 0x0f, 0xa6, 0x2c, 0x59, 0x34, 0x96, 0xd7, 0x24, 0xf4, 0x95, 0x33, 0x40, + 0xab, 0x59, 0x37, 0xaf, 0x02, 0x4c, 0x05, 0xdf, 0x0c, 0xf5, 0xa0, 0x4a, 0x7f, 0x66, 0x00, 0xdc, + 0xac, 0x55, 0x12, 0x9d, 0x3e, 0x02, 0x5a, 0x53, 0x30, 0x2b, 0x98, 0xd3, 0xe3, 0x86, 0xa2, 0xf7, + 0xff, 0xcf, 0x58, 0x09, 0x5c, 0x27, 0xcd, 0x1a, 0x69, 0x12, 0x93, 0xbb, 0x7e, 0x40, 0xb2, 0xdd, + 0x08, 0x18, 0x8a, 0x41, 0xc3, 0x2d, 0xb0, 0xd0, 0x1b, 0x5c, 0x4d, 0xcc, 0x98, 0x20, 0x77, 0x3e, + 0x23, 0xc9, 0x9c, 0x57, 0x29, 0x2e, 0xd4, 0x12, 0x7a, 0x94, 0xf2, 0x80, 0x4f, 0xc1, 0xb4, 0x19, + 0x9d, 0x91, 0xa7, 0xd0, 0x46, 0xef, 0xad, 0x1e, 0xfa, 0xe3, 0x16, 0x76, 0x38, 0xe5, 0x6d, 0x63, + 0x56, 0x50, 0xa6, 0x3f, 0x4c, 0xfb, 0x68, 0x90, 0x81, 0x45, 0x1b, 0xbf, 0xa4, 0x76, 0xcb, 0x0e, + 0xc8, 0x5d, 0xa3, 0x9f, 0x10, 0x39, 0x49, 0xcf, 0x1f, 0x42, 0x0e, 0xb1, 0x6a, 0x12, 0x0c, 0xa5, + 0xf1, 0x4b, 0x3f, 0x6b, 0xe0, 0x52, 0xba, 0xf0, 0x23, 0x68, 0x90, 0x5a, 0xbc, 0x41, 0xf4, 0x53, + 0x58, 0x9c, 0x48, 0x70, 0x48, 0xaf, 0x7c, 0x39, 0x09, 0x66, 0xa3, 0x35, 0x1c, 0x01, 0x81, 0xdf, + 0x03, 0x39, 0xcf, 0x77, 0x8f, 0x29, 0xa3, 0xae, 0x43, 0x7c, 0x35, 0x1d, 0x97, 0x94, 0x4b, 0x6e, + 0x2f, 0x54, 0xa1, 0xa8, 0x1d, 0x6c, 0x02, 0xe0, 0x61, 0x1f, 0xdb, 0x84, 0x8b, 0x4e, 0xce, 0xc8, + 0x3b, 0xb8, 0xf3, 0xae, 0x3b, 0x88, 0x1e, 0x4b, 0xdf, 0xeb, 0xbb, 0x6e, 0x3b, 0xdc, 0x6f, 0x87, + 0x29, 0x86, 0x0a, 0x14, 0xc1, 0x87, 0x47, 0x60, 0xce, 0x27, 0x66, 0x13, 0x53, 0x5b, 0x3d, 0xd0, + 0x59, 0x99, 0xe6, 0xb6, 0x78, 0x28, 0x51, 0x54, 0x71, 0xd2, 0x29, 0xde, 0x48, 0x2f, 0xdb, 0xfa, + 0x1e, 0xf1, 0x19, 0x65, 0x9c, 0x38, 0x3c, 0xa0, 0x4e, 0xcc, 0x07, 0xc5, 0xb1, 0xc5, 0x13, 0x60, + 0x8b, 0xd5, 0xe5, 0x91, 0xc7, 0xa9, 0xeb, 0xb0, 0xfc, 0x44, 0xf8, 0x04, 0x54, 0x23, 0x72, 0x14, + 0xb3, 0x82, 0x3b, 0x60, 0x59, 0x4c, 0xeb, 0x8f, 0x83, 0x00, 0xdb, 0x2f, 0x3d, 0xec, 0x88, 0xab, + 0xca, 0x4f, 0xca, 0x57, 0x39, 0x2f, 0xf6, 0x9c, 0x8d, 0x01, 0x7a, 0x34, 0xd0, 0x0b, 0x3e, 0x05, + 0x8b, 0xc1, 0xa2, 0x63, 0x50, 0xc7, 0xa2, 0x4e, 0x43, 0xac, 0x39, 0xf2, 0x81, 0x9f, 0x31, 0xae, + 0x8a, 0xde, 0x78, 0x92, 0x54, 0x9e, 0x0c, 0x12, 0xa2, 0x34, 0x08, 0x7c, 0x01, 0x16, 0x65, 0x44, + 0x62, 0xa9, 0xc1, 0x42, 0x09, 0xcb, 0x4f, 0xa7, 0xb7, 0x14, 0x71, 0x75, 0x82, 0x48, 0xbd, 0xf1, + 0xd3, 0x1b, 0x53, 0xfb, 0xc4, 0xb7, 0x8d, 0x7f, 0xab, 0x7a, 0x2d, 0x6e, 0x24, 0xa1, 0x50, 0x1a, + 0x7d, 0xe5, 0x1e, 0x98, 0x4f, 0x14, 0x1c, 0x2e, 0x80, 0xcc, 0x11, 0x69, 0x07, 0xef, 0x35, 0x12, + 0x7f, 0xc2, 0x65, 0x30, 0x71, 0x8c, 0x9b, 0x2d, 0x12, 0x30, 0x10, 0x05, 0x1f, 0x77, 0xc7, 0xef, + 0x68, 0xa5, 0x1f, 0x35, 0x10, 0x1b, 0x6c, 0x23, 0x68, 0xee, 0x6a, 0xbc, 0xb9, 0xd7, 0xce, 0x4a, + 0xec, 0x21, 0x6d, 0xfd, 0x99, 0x06, 0x66, 0xa3, 0xfb, 0x1c, 0xbc, 0x06, 0xa6, 0x71, 0xcb, 0xa2, + 0xc4, 0x31, 0x7b, 0x3b, 0x4b, 0x3f, 0x9b, 0x0d, 0x25, 0x47, 0x7d, 0x0b, 0xb1, 0xed, 0x91, 0x97, + 0x1e, 0xf5, 0xb1, 0x60, 0x5a, 0x8d, 0x98, 0xae, 0x63, 0x31, 0x79, 0x4d, 0x99, 0x60, 0x50, 0x6e, + 0x27, 0x95, 0x28, 0x6d, 0x5f, 0xfa, 0x66, 0x1c, 0x2c, 0x04, 0x04, 0x09, 0x96, 0x7d, 0x9b, 0x38, + 0x7c, 0x04, 0xe3, 0x05, 0xc5, 0xd6, 0xbe, 0x1b, 0xa7, 0xaf, 0x44, 0x61, 0x76, 0xc3, 0xf6, 0x3f, + 0xf8, 0x0c, 0x4c, 0x32, 0x8e, 0x79, 0x8b, 0xc9, 0xe7, 0x2f, 0xb7, 0xbe, 0x7e, 0x2e, 0x54, 0xe9, + 0x19, 0xee, 0x7f, 0xc1, 0x37, 0x52, 0x88, 0xa5, 0x9f, 0x34, 0xb0, 0x9c, 0x74, 0x19, 0x01, 0xe1, + 0x1e, 0xc7, 0x09, 0x77, 0xed, 0x3c, 0x27, 0x1a, 0x42, 0xba, 0x5f, 0x35, 0x70, 0x29, 0x75, 0x78, + 0xf9, 0xce, 0x8a, 0x59, 0xe5, 0x25, 0x26, 0xe2, 0x6e, 0xb8, 0x3e, 0xcb, 0x59, 0xb5, 0x37, 0x40, + 0x8f, 0x06, 0x7a, 0xc1, 0xe7, 0x60, 0x81, 0x3a, 0x4d, 0xea, 0x10, 0xf5, 0x2c, 0x87, 0xe5, 0x1e, + 0x38, 0x50, 0x92, 0xc8, 0xb2, 0xcc, 0xcb, 0x62, 0x7b, 0xa9, 0x24, 0x50, 0x50, 0x0a, 0xb7, 0xf4, + 0xcb, 0x80, 0xf2, 0xc8, 0xb5, 0x52, 0x74, 0x94, 0x94, 0x10, 0x3f, 0xd5, 0x51, 0x4a, 0x8e, 0xfa, + 0x16, 0x92, 0x41, 0xf2, 0x2a, 0x54, 0xa2, 0xe7, 0x63, 0x90, 0xf4, 0x8c, 0x30, 0x48, 0x7e, 0x23, + 0x85, 0x28, 0x32, 0x11, 0x6b, 0x5b, 0x64, 0x3d, 0xeb, 0x67, 0xb2, 0xab, 0xe4, 0xa8, 0x6f, 0x51, + 0xfa, 0x2b, 0x33, 0xa0, 0x4a, 0x92, 0x8a, 0x91, 0x23, 0xf5, 0x7e, 0xab, 0x27, 0x8f, 0x64, 0xf5, + 0x8f, 0x64, 0xc1, 0xaf, 0x34, 0x00, 0x71, 0x1f, 0xa2, 0xda, 0xa3, 0x6a, 0xc0, 0xa7, 0x07, 0xe7, + 0xef, 0x10, 0x7d, 0x23, 0x05, 0x16, 0xbc, 0xd5, 0x2b, 0x2a, 0x09, 0x98, 0x36, 0x40, 0x03, 0x32, + 0x80, 0x14, 0xe4, 0x02, 0xe9, 0xb6, 0xef, 0xbb, 0xbe, 0x6a, 0xd9, 0xcb, 0xa7, 0x27, 0x24, 0xcd, + 0x8d, 0x82, 0xfc, 0x4d, 0x14, 0xfa, 0x9f, 0x74, 0x8a, 0xb9, 0x88, 0x1e, 0x45, 0xb1, 0x45, 0x28, + 0x8b, 0x84, 0xa1, 0xb2, 0xff, 0x20, 0xd4, 0x16, 0x19, 0x1e, 0x2a, 0x82, 0xbd, 0xb2, 0x0d, 0xfe, + 0x35, 0xe4, 0x82, 0xce, 0xf5, 0xb6, 0x7d, 0xae, 0x81, 0x68, 0x0c, 0xb8, 0x03, 0xb2, 0x9c, 0xaa, + 0x4e, 0xcc, 0xad, 0x5f, 0x3d, 0xdb, 0x84, 0xd9, 0xa7, 0x36, 0x09, 0x07, 0xa5, 0xf8, 0x42, 0x12, + 0x05, 0x5e, 0x01, 0x53, 0x36, 0x61, 0x0c, 0x37, 0x54, 0xe4, 0xf0, 0x07, 0x54, 0x35, 0x10, 0xa3, + 0x9e, 0xbe, 0x74, 0x1b, 0x2c, 0x0d, 0xf8, 0x49, 0x0a, 0x8b, 0x60, 0xc2, 0x94, 0xff, 0xf0, 0x11, + 0x09, 0x4d, 0x18, 0x33, 0x62, 0xca, 0x6c, 0xca, 0xff, 0xf3, 0x04, 0x72, 0xe3, 0xfa, 0xab, 0xb7, + 0x85, 0xb1, 0xd7, 0x6f, 0x0b, 0x63, 0x6f, 0xde, 0x16, 0xc6, 0x3e, 0xed, 0x16, 0xb4, 0x57, 0xdd, + 0x82, 0xf6, 0xba, 0x5b, 0xd0, 0xde, 0x74, 0x0b, 0xda, 0x6f, 0xdd, 0x82, 0xf6, 0xc5, 0xef, 0x85, + 0xb1, 0x67, 0x53, 0xea, 0xbe, 0xff, 0x0e, 0x00, 0x00, 0xff, 0xff, 0xce, 0xa8, 0xf1, 0x40, 0x9a, + 0x15, 0x00, 0x00, } func (m *CSIDriver) Marshal() (dAtA []byte, err error) { @@ -1011,6 +1080,127 @@ func (m *CSINodeSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *CSIStorageCapacity) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CSIStorageCapacity) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CSIStorageCapacity) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.MaximumVolumeSize != nil { + { + size, err := m.MaximumVolumeSize.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + } + if m.Capacity != nil { + { + size, err := m.Capacity.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + i -= len(m.StorageClassName) + copy(dAtA[i:], m.StorageClassName) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.StorageClassName))) + i-- + dAtA[i] = 0x1a + if m.NodeTopology != nil { + { + size, err := m.NodeTopology.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + { + size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *CSIStorageCapacityList) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CSIStorageCapacityList) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CSIStorageCapacityList) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Items) > 0 { + for iNdEx := len(m.Items) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Items[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + { + size, err := m.ListMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func (m *StorageClass) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1676,6 +1866,48 @@ func (m *CSINodeSpec) Size() (n int) { return n } +func (m *CSIStorageCapacity) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if m.NodeTopology != nil { + l = m.NodeTopology.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + l = len(m.StorageClassName) + n += 1 + l + sovGenerated(uint64(l)) + if m.Capacity != nil { + l = m.Capacity.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.MaximumVolumeSize != nil { + l = m.MaximumVolumeSize.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *CSIStorageCapacityList) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ListMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + func (m *StorageClass) Size() (n int) { if m == nil { return 0 @@ -1975,6 +2207,36 @@ func (this *CSINodeSpec) String() string { }, "") return s } +func (this *CSIStorageCapacity) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&CSIStorageCapacity{`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `NodeTopology:` + strings.Replace(fmt.Sprintf("%v", this.NodeTopology), "LabelSelector", "v1.LabelSelector", 1) + `,`, + `StorageClassName:` + fmt.Sprintf("%v", this.StorageClassName) + `,`, + `Capacity:` + strings.Replace(fmt.Sprintf("%v", this.Capacity), "Quantity", "resource.Quantity", 1) + `,`, + `MaximumVolumeSize:` + strings.Replace(fmt.Sprintf("%v", this.MaximumVolumeSize), "Quantity", "resource.Quantity", 1) + `,`, + `}`, + }, "") + return s +} +func (this *CSIStorageCapacityList) String() string { + if this == nil { + return "nil" + } + repeatedStringForItems := "[]CSIStorageCapacity{" + for _, f := range this.Items { + repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "CSIStorageCapacity", "CSIStorageCapacity", 1), `&`, ``, 1) + "," + } + repeatedStringForItems += "}" + s := strings.Join([]string{`&CSIStorageCapacityList{`, + `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, + `Items:` + repeatedStringForItems + `,`, + `}`, + }, "") + return s +} func (this *StorageClass) String() string { if this == nil { return "nil" @@ -2238,10 +2500,7 @@ func (m *CSIDriver) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2358,10 +2617,7 @@ func (m *CSIDriverList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2594,10 +2850,7 @@ func (m *CSIDriverSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2713,10 +2966,7 @@ func (m *CSINode) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2898,10 +3148,7 @@ func (m *CSINodeDriver) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3018,10 +3265,7 @@ func (m *CSINodeList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3105,10 +3349,7 @@ func (m *CSINodeSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3123,7 +3364,7 @@ func (m *CSINodeSpec) Unmarshal(dAtA []byte) error { } return nil } -func (m *StorageClass) Unmarshal(dAtA []byte) error { +func (m *CSIStorageCapacity) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -3146,10 +3387,10 @@ func (m *StorageClass) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: StorageClass: wiretype end group for non-group") + return fmt.Errorf("proto: CSIStorageCapacity: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: StorageClass: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: CSIStorageCapacity: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -3187,9 +3428,9 @@ func (m *StorageClass) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Provisioner", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field NodeTopology", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -3199,29 +3440,33 @@ func (m *StorageClass) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - m.Provisioner = string(dAtA[iNdEx:postIndex]) + if m.NodeTopology == nil { + m.NodeTopology = &v1.LabelSelector{} + } + if err := m.NodeTopology.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Parameters", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field StorageClassName", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -3231,25 +3476,361 @@ func (m *StorageClass) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - if m.Parameters == nil { - m.Parameters = make(map[string]string) - } - var mapkey string + m.StorageClassName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Capacity", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Capacity == nil { + m.Capacity = &resource.Quantity{} + } + if err := m.Capacity.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MaximumVolumeSize", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.MaximumVolumeSize == nil { + m.MaximumVolumeSize = &resource.Quantity{} + } + if err := m.MaximumVolumeSize.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CSIStorageCapacityList) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CSIStorageCapacityList: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CSIStorageCapacityList: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Items = append(m.Items, CSIStorageCapacity{}) + if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *StorageClass) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: StorageClass: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: StorageClass: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Provisioner", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Provisioner = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Parameters", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Parameters == nil { + m.Parameters = make(map[string]string) + } + var mapkey string var mapvalue string for iNdEx < postIndex { entryPreIndex := iNdEx @@ -3333,7 +3914,7 @@ func (m *StorageClass) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -3503,10 +4084,7 @@ func (m *StorageClass) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3623,10 +4201,7 @@ func (m *StorageClassList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3728,10 +4303,7 @@ func (m *TokenRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3880,10 +4452,7 @@ func (m *VolumeAttachment) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4000,10 +4569,7 @@ func (m *VolumeAttachmentList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4122,10 +4688,7 @@ func (m *VolumeAttachmentSource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4272,10 +4835,7 @@ func (m *VolumeAttachmentSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4455,7 +5015,7 @@ func (m *VolumeAttachmentStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -4544,10 +5104,7 @@ func (m *VolumeAttachmentStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4662,10 +5219,7 @@ func (m *VolumeError) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4735,10 +5289,7 @@ func (m *VolumeNodeResources) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/api/storage/v1beta1/generated.proto b/vendor/k8s.io/api/storage/v1beta1/generated.proto index 1eb4e1f88c4f..5ed6413ec0e0 100644 --- a/vendor/k8s.io/api/storage/v1beta1/generated.proto +++ b/vendor/k8s.io/api/storage/v1beta1/generated.proto @@ -22,6 +22,7 @@ syntax = "proto2"; package k8s.io.api.storage.v1beta1; import "k8s.io/api/core/v1/generated.proto"; +import "k8s.io/apimachinery/pkg/api/resource/generated.proto"; import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; @@ -75,6 +76,9 @@ message CSIDriverSpec { // If the CSIDriverRegistry feature gate is enabled and the value is // specified to false, the attach operation will be skipped. // Otherwise the attach operation will be called. + // + // This field is immutable. + // // +optional optional bool attachRequired = 1; @@ -93,7 +97,7 @@ message CSIDriverSpec { // "csi.storage.k8s.io/pod.name": pod.Name // "csi.storage.k8s.io/pod.namespace": pod.Namespace // "csi.storage.k8s.io/pod.uid": string(pod.UID) - // "csi.storage.k8s.io/ephemeral": "true" iff the volume is an ephemeral inline volume + // "csi.storage.k8s.io/ephemeral": "true" if the volume is an ephemeral inline volume // defined by a CSIVolumeSource, otherwise "false" // // "csi.storage.k8s.io/ephemeral" is a new feature in Kubernetes 1.16. It is only @@ -102,6 +106,9 @@ message CSIDriverSpec { // As Kubernetes 1.15 doesn't support this field, drivers can only support one mode when // deployed on such a cluster and the deployment determines which mode that is, for example // via a command line parameter of the driver. + // + // This field is immutable. + // // +optional optional bool podInfoOnMount = 2; @@ -117,6 +124,9 @@ message CSIDriverSpec { // https://kubernetes-csi.github.io/docs/ephemeral-local-volumes.html // A driver can support one or more of these modes and // more modes may be added in the future. + // + // This field is immutable. + // // +optional repeated string volumeLifecycleModes = 3; @@ -134,10 +144,13 @@ message CSIDriverSpec { // unset or false and it can be flipped later when storage // capacity information has been published. // - // This is an alpha field and only available when the CSIStorageCapacity + // This field is immutable. + // + // This is a beta field and only available when the CSIStorageCapacity // feature is enabled. The default is false. // // +optional + // +featureGate=CSIStorageCapacity optional bool storageCapacity = 4; // Defines if the underlying volume supports changing ownership and @@ -145,6 +158,9 @@ message CSIDriverSpec { // Refer to the specific FSGroupPolicy values for additional details. // This field is alpha-level, and is only honored by servers // that enable the CSIVolumeFSGroupPolicy feature gate. + // + // This field is immutable. + // // +optional optional string fsGroupPolicy = 5; @@ -164,7 +180,7 @@ message CSIDriverSpec { // most one token is empty string. To receive a new token after expiry, // RequiresRepublish can be used to trigger NodePublishVolume periodically. // - // This is an alpha feature and only available when the + // This is a beta feature and only available when the // CSIServiceAccountToken feature is enabled. // // +optional @@ -179,7 +195,7 @@ message CSIDriverSpec { // to NodePublishVolume should only update the contents of the volume. New // mount points will not be seen by a running container. // - // This is an alpha feature and only available when the + // This is a beta feature and only available when the // CSIServiceAccountToken feature is enabled. // // +optional @@ -261,6 +277,96 @@ message CSINodeSpec { repeated CSINodeDriver drivers = 1; } +// CSIStorageCapacity stores the result of one CSI GetCapacity call. +// For a given StorageClass, this describes the available capacity in a +// particular topology segment. This can be used when considering where to +// instantiate new PersistentVolumes. +// +// For example this can express things like: +// - StorageClass "standard" has "1234 GiB" available in "topology.kubernetes.io/zone=us-east1" +// - StorageClass "localssd" has "10 GiB" available in "kubernetes.io/hostname=knode-abc123" +// +// The following three cases all imply that no capacity is available for +// a certain combination: +// - no object exists with suitable topology and storage class name +// - such an object exists, but the capacity is unset +// - such an object exists, but the capacity is zero +// +// The producer of these objects can decide which approach is more suitable. +// +// They are consumed by the kube-scheduler if the CSIStorageCapacity beta feature gate +// is enabled there and a CSI driver opts into capacity-aware scheduling with +// CSIDriver.StorageCapacity. +message CSIStorageCapacity { + // Standard object's metadata. The name has no particular meaning. It must be + // be a DNS subdomain (dots allowed, 253 characters). To ensure that + // there are no conflicts with other CSI drivers on the cluster, the recommendation + // is to use csisc-, a generated name, or a reverse-domain name which ends + // with the unique CSI driver name. + // + // Objects are namespaced. + // + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; + + // NodeTopology defines which nodes have access to the storage + // for which capacity was reported. If not set, the storage is + // not accessible from any node in the cluster. If empty, the + // storage is accessible from all nodes. This field is + // immutable. + // + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.LabelSelector nodeTopology = 2; + + // The name of the StorageClass that the reported capacity applies to. + // It must meet the same requirements as the name of a StorageClass + // object (non-empty, DNS subdomain). If that object no longer exists, + // the CSIStorageCapacity object is obsolete and should be removed by its + // creator. + // This field is immutable. + optional string storageClassName = 3; + + // Capacity is the value reported by the CSI driver in its GetCapacityResponse + // for a GetCapacityRequest with topology and parameters that match the + // previous fields. + // + // The semantic is currently (CSI spec 1.2) defined as: + // The available capacity, in bytes, of the storage that can be used + // to provision volumes. If not set, that information is currently + // unavailable and treated like zero capacity. + // + // +optional + optional k8s.io.apimachinery.pkg.api.resource.Quantity capacity = 4; + + // MaximumVolumeSize is the value reported by the CSI driver in its GetCapacityResponse + // for a GetCapacityRequest with topology and parameters that match the + // previous fields. + // + // This is defined since CSI spec 1.4.0 as the largest size + // that may be used in a + // CreateVolumeRequest.capacity_range.required_bytes field to + // create a volume with the same parameters as those in + // GetCapacityRequest. The corresponding value in the Kubernetes + // API is ResourceRequirements.Requests in a volume claim. + // + // +optional + optional k8s.io.apimachinery.pkg.api.resource.Quantity maximumVolumeSize = 5; +} + +// CSIStorageCapacityList is a collection of CSIStorageCapacity objects. +message CSIStorageCapacityList { + // Standard list metadata + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; + + // Items is the list of CSIStorageCapacity objects. + // +listType=map + // +listMapKey=name + repeated CSIStorageCapacity items = 2; +} + // StorageClass describes the parameters for a class of storage for // which PersistentVolumes can be dynamically provisioned. // @@ -378,7 +484,7 @@ message VolumeAttachmentSource { // a persistent volume defined by a pod's inline VolumeSource. This field // is populated only for the CSIMigration feature. It contains // translated fields from a pod's inline VolumeSource to a - // PersistentVolumeSpec. This field is alpha-level and is only + // PersistentVolumeSpec. This field is beta-level and is only // honored by servers that enabled the CSIMigration feature. // +optional optional k8s.io.api.core.v1.PersistentVolumeSpec inlineVolumeSpec = 2; diff --git a/vendor/k8s.io/api/storage/v1beta1/register.go b/vendor/k8s.io/api/storage/v1beta1/register.go index c270ace57d65..a281d0f26ecb 100644 --- a/vendor/k8s.io/api/storage/v1beta1/register.go +++ b/vendor/k8s.io/api/storage/v1beta1/register.go @@ -55,6 +55,9 @@ func addKnownTypes(scheme *runtime.Scheme) error { &CSINode{}, &CSINodeList{}, + + &CSIStorageCapacity{}, + &CSIStorageCapacityList{}, ) metav1.AddToGroupVersion(scheme, SchemeGroupVersion) diff --git a/vendor/k8s.io/api/storage/v1beta1/types.go b/vendor/k8s.io/api/storage/v1beta1/types.go index 10df2baa7a59..d1ffe7a0ec59 100644 --- a/vendor/k8s.io/api/storage/v1beta1/types.go +++ b/vendor/k8s.io/api/storage/v1beta1/types.go @@ -18,6 +18,7 @@ package v1beta1 import ( v1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -182,7 +183,7 @@ type VolumeAttachmentSource struct { // a persistent volume defined by a pod's inline VolumeSource. This field // is populated only for the CSIMigration feature. It contains // translated fields from a pod's inline VolumeSource to a - // PersistentVolumeSpec. This field is alpha-level and is only + // PersistentVolumeSpec. This field is beta-level and is only // honored by servers that enabled the CSIMigration feature. // +optional InlineVolumeSpec *v1.PersistentVolumeSpec `json:"inlineVolumeSpec,omitempty" protobuf:"bytes,2,opt,name=inlineVolumeSpec"` @@ -291,6 +292,9 @@ type CSIDriverSpec struct { // If the CSIDriverRegistry feature gate is enabled and the value is // specified to false, the attach operation will be skipped. // Otherwise the attach operation will be called. + // + // This field is immutable. + // // +optional AttachRequired *bool `json:"attachRequired,omitempty" protobuf:"varint,1,opt,name=attachRequired"` @@ -309,7 +313,7 @@ type CSIDriverSpec struct { // "csi.storage.k8s.io/pod.name": pod.Name // "csi.storage.k8s.io/pod.namespace": pod.Namespace // "csi.storage.k8s.io/pod.uid": string(pod.UID) - // "csi.storage.k8s.io/ephemeral": "true" iff the volume is an ephemeral inline volume + // "csi.storage.k8s.io/ephemeral": "true" if the volume is an ephemeral inline volume // defined by a CSIVolumeSource, otherwise "false" // // "csi.storage.k8s.io/ephemeral" is a new feature in Kubernetes 1.16. It is only @@ -318,6 +322,9 @@ type CSIDriverSpec struct { // As Kubernetes 1.15 doesn't support this field, drivers can only support one mode when // deployed on such a cluster and the deployment determines which mode that is, for example // via a command line parameter of the driver. + // + // This field is immutable. + // // +optional PodInfoOnMount *bool `json:"podInfoOnMount,omitempty" protobuf:"bytes,2,opt,name=podInfoOnMount"` @@ -333,6 +340,9 @@ type CSIDriverSpec struct { // https://kubernetes-csi.github.io/docs/ephemeral-local-volumes.html // A driver can support one or more of these modes and // more modes may be added in the future. + // + // This field is immutable. + // // +optional VolumeLifecycleModes []VolumeLifecycleMode `json:"volumeLifecycleModes,omitempty" protobuf:"bytes,3,opt,name=volumeLifecycleModes"` @@ -351,10 +361,13 @@ type CSIDriverSpec struct { // unset or false and it can be flipped later when storage // capacity information has been published. // - // This is an alpha field and only available when the CSIStorageCapacity + // This field is immutable. + // + // This is a beta field and only available when the CSIStorageCapacity // feature is enabled. The default is false. // // +optional + // +featureGate=CSIStorageCapacity StorageCapacity *bool `json:"storageCapacity,omitempty" protobuf:"bytes,4,opt,name=storageCapacity"` // Defines if the underlying volume supports changing ownership and @@ -362,6 +375,9 @@ type CSIDriverSpec struct { // Refer to the specific FSGroupPolicy values for additional details. // This field is alpha-level, and is only honored by servers // that enable the CSIVolumeFSGroupPolicy feature gate. + // + // This field is immutable. + // // +optional FSGroupPolicy *FSGroupPolicy `json:"fsGroupPolicy,omitempty" protobuf:"bytes,5,opt,name=fsGroupPolicy"` @@ -381,7 +397,7 @@ type CSIDriverSpec struct { // most one token is empty string. To receive a new token after expiry, // RequiresRepublish can be used to trigger NodePublishVolume periodically. // - // This is an alpha feature and only available when the + // This is a beta feature and only available when the // CSIServiceAccountToken feature is enabled. // // +optional @@ -396,7 +412,7 @@ type CSIDriverSpec struct { // to NodePublishVolume should only update the contents of the volume. New // mount points will not be seen by a running container. // - // This is an alpha feature and only available when the + // This is a beta feature and only available when the // CSIServiceAccountToken feature is enabled. // // +optional @@ -569,3 +585,102 @@ type CSINodeList struct { // items is the list of CSINode Items []CSINode `json:"items" protobuf:"bytes,2,rep,name=items"` } + +// +genclient +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +k8s:prerelease-lifecycle-gen:introduced=1.21 + +// CSIStorageCapacity stores the result of one CSI GetCapacity call. +// For a given StorageClass, this describes the available capacity in a +// particular topology segment. This can be used when considering where to +// instantiate new PersistentVolumes. +// +// For example this can express things like: +// - StorageClass "standard" has "1234 GiB" available in "topology.kubernetes.io/zone=us-east1" +// - StorageClass "localssd" has "10 GiB" available in "kubernetes.io/hostname=knode-abc123" +// +// The following three cases all imply that no capacity is available for +// a certain combination: +// - no object exists with suitable topology and storage class name +// - such an object exists, but the capacity is unset +// - such an object exists, but the capacity is zero +// +// The producer of these objects can decide which approach is more suitable. +// +// They are consumed by the kube-scheduler if the CSIStorageCapacity beta feature gate +// is enabled there and a CSI driver opts into capacity-aware scheduling with +// CSIDriver.StorageCapacity. +type CSIStorageCapacity struct { + metav1.TypeMeta `json:",inline"` + // Standard object's metadata. The name has no particular meaning. It must be + // be a DNS subdomain (dots allowed, 253 characters). To ensure that + // there are no conflicts with other CSI drivers on the cluster, the recommendation + // is to use csisc-, a generated name, or a reverse-domain name which ends + // with the unique CSI driver name. + // + // Objects are namespaced. + // + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +optional + metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + + // NodeTopology defines which nodes have access to the storage + // for which capacity was reported. If not set, the storage is + // not accessible from any node in the cluster. If empty, the + // storage is accessible from all nodes. This field is + // immutable. + // + // +optional + NodeTopology *metav1.LabelSelector `json:"nodeTopology,omitempty" protobuf:"bytes,2,opt,name=nodeTopology"` + + // The name of the StorageClass that the reported capacity applies to. + // It must meet the same requirements as the name of a StorageClass + // object (non-empty, DNS subdomain). If that object no longer exists, + // the CSIStorageCapacity object is obsolete and should be removed by its + // creator. + // This field is immutable. + StorageClassName string `json:"storageClassName" protobuf:"bytes,3,name=storageClassName"` + + // Capacity is the value reported by the CSI driver in its GetCapacityResponse + // for a GetCapacityRequest with topology and parameters that match the + // previous fields. + // + // The semantic is currently (CSI spec 1.2) defined as: + // The available capacity, in bytes, of the storage that can be used + // to provision volumes. If not set, that information is currently + // unavailable and treated like zero capacity. + // + // +optional + Capacity *resource.Quantity `json:"capacity,omitempty" protobuf:"bytes,4,opt,name=capacity"` + + // MaximumVolumeSize is the value reported by the CSI driver in its GetCapacityResponse + // for a GetCapacityRequest with topology and parameters that match the + // previous fields. + // + // This is defined since CSI spec 1.4.0 as the largest size + // that may be used in a + // CreateVolumeRequest.capacity_range.required_bytes field to + // create a volume with the same parameters as those in + // GetCapacityRequest. The corresponding value in the Kubernetes + // API is ResourceRequirements.Requests in a volume claim. + // + // +optional + MaximumVolumeSize *resource.Quantity `json:"maximumVolumeSize,omitempty" protobuf:"bytes,5,opt,name=maximumVolumeSize"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +k8s:prerelease-lifecycle-gen:introduced=1.21 + +// CSIStorageCapacityList is a collection of CSIStorageCapacity objects. +type CSIStorageCapacityList struct { + metav1.TypeMeta `json:",inline"` + // Standard list metadata + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +optional + metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + + // Items is the list of CSIStorageCapacity objects. + // +listType=map + // +listMapKey=name + Items []CSIStorageCapacity `json:"items" protobuf:"bytes,2,rep,name=items"` +} diff --git a/vendor/k8s.io/api/storage/v1beta1/types_swagger_doc_generated.go b/vendor/k8s.io/api/storage/v1beta1/types_swagger_doc_generated.go index c51950d7c87f..0d03a30b4f71 100644 --- a/vendor/k8s.io/api/storage/v1beta1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/storage/v1beta1/types_swagger_doc_generated.go @@ -49,13 +49,13 @@ func (CSIDriverList) SwaggerDoc() map[string]string { var map_CSIDriverSpec = map[string]string{ "": "CSIDriverSpec is the specification of a CSIDriver.", - "attachRequired": "attachRequired indicates this CSI volume driver requires an attach operation (because it implements the CSI ControllerPublishVolume() method), and that the Kubernetes attach detach controller should call the attach volume interface which checks the volumeattachment status and waits until the volume is attached before proceeding to mounting. The CSI external-attacher coordinates with CSI volume driver and updates the volumeattachment status when the attach operation is complete. If the CSIDriverRegistry feature gate is enabled and the value is specified to false, the attach operation will be skipped. Otherwise the attach operation will be called.", - "podInfoOnMount": "If set to true, podInfoOnMount indicates this CSI volume driver requires additional pod information (like podName, podUID, etc.) during mount operations. If set to false, pod information will not be passed on mount. Default is false. The CSI driver specifies podInfoOnMount as part of driver deployment. If true, Kubelet will pass pod information as VolumeContext in the CSI NodePublishVolume() calls. The CSI driver is responsible for parsing and validating the information passed in as VolumeContext. The following VolumeConext will be passed if podInfoOnMount is set to true. This list might grow, but the prefix will be used. \"csi.storage.k8s.io/pod.name\": pod.Name \"csi.storage.k8s.io/pod.namespace\": pod.Namespace \"csi.storage.k8s.io/pod.uid\": string(pod.UID) \"csi.storage.k8s.io/ephemeral\": \"true\" iff the volume is an ephemeral inline volume\n defined by a CSIVolumeSource, otherwise \"false\"\n\n\"csi.storage.k8s.io/ephemeral\" is a new feature in Kubernetes 1.16. It is only required for drivers which support both the \"Persistent\" and \"Ephemeral\" VolumeLifecycleMode. Other drivers can leave pod info disabled and/or ignore this field. As Kubernetes 1.15 doesn't support this field, drivers can only support one mode when deployed on such a cluster and the deployment determines which mode that is, for example via a command line parameter of the driver.", - "volumeLifecycleModes": "VolumeLifecycleModes defines what kind of volumes this CSI volume driver supports. The default if the list is empty is \"Persistent\", which is the usage defined by the CSI specification and implemented in Kubernetes via the usual PV/PVC mechanism. The other mode is \"Ephemeral\". In this mode, volumes are defined inline inside the pod spec with CSIVolumeSource and their lifecycle is tied to the lifecycle of that pod. A driver has to be aware of this because it is only going to get a NodePublishVolume call for such a volume. For more information about implementing this mode, see https://kubernetes-csi.github.io/docs/ephemeral-local-volumes.html A driver can support one or more of these modes and more modes may be added in the future.", - "storageCapacity": "If set to true, storageCapacity indicates that the CSI volume driver wants pod scheduling to consider the storage capacity that the driver deployment will report by creating CSIStorageCapacity objects with capacity information.\n\nThe check can be enabled immediately when deploying a driver. In that case, provisioning new volumes with late binding will pause until the driver deployment has published some suitable CSIStorageCapacity object.\n\nAlternatively, the driver can be deployed with the field unset or false and it can be flipped later when storage capacity information has been published.\n\nThis is an alpha field and only available when the CSIStorageCapacity feature is enabled. The default is false.", - "fsGroupPolicy": "Defines if the underlying volume supports changing ownership and permission of the volume before being mounted. Refer to the specific FSGroupPolicy values for additional details. This field is alpha-level, and is only honored by servers that enable the CSIVolumeFSGroupPolicy feature gate.", - "tokenRequests": "TokenRequests indicates the CSI driver needs pods' service account tokens it is mounting volume for to do necessary authentication. Kubelet will pass the tokens in VolumeContext in the CSI NodePublishVolume calls. The CSI driver should parse and validate the following VolumeContext: \"csi.storage.k8s.io/serviceAccount.tokens\": {\n \"\": {\n \"token\": ,\n \"expirationTimestamp\": ,\n },\n ...\n}\n\nNote: Audience in each TokenRequest should be different and at most one token is empty string. To receive a new token after expiry, RequiresRepublish can be used to trigger NodePublishVolume periodically.\n\nThis is an alpha feature and only available when the CSIServiceAccountToken feature is enabled.", - "requiresRepublish": "RequiresRepublish indicates the CSI driver wants `NodePublishVolume` being periodically called to reflect any possible change in the mounted volume. This field defaults to false.\n\nNote: After a successful initial NodePublishVolume call, subsequent calls to NodePublishVolume should only update the contents of the volume. New mount points will not be seen by a running container.\n\nThis is an alpha feature and only available when the CSIServiceAccountToken feature is enabled.", + "attachRequired": "attachRequired indicates this CSI volume driver requires an attach operation (because it implements the CSI ControllerPublishVolume() method), and that the Kubernetes attach detach controller should call the attach volume interface which checks the volumeattachment status and waits until the volume is attached before proceeding to mounting. The CSI external-attacher coordinates with CSI volume driver and updates the volumeattachment status when the attach operation is complete. If the CSIDriverRegistry feature gate is enabled and the value is specified to false, the attach operation will be skipped. Otherwise the attach operation will be called.\n\nThis field is immutable.", + "podInfoOnMount": "If set to true, podInfoOnMount indicates this CSI volume driver requires additional pod information (like podName, podUID, etc.) during mount operations. If set to false, pod information will not be passed on mount. Default is false. The CSI driver specifies podInfoOnMount as part of driver deployment. If true, Kubelet will pass pod information as VolumeContext in the CSI NodePublishVolume() calls. The CSI driver is responsible for parsing and validating the information passed in as VolumeContext. The following VolumeConext will be passed if podInfoOnMount is set to true. This list might grow, but the prefix will be used. \"csi.storage.k8s.io/pod.name\": pod.Name \"csi.storage.k8s.io/pod.namespace\": pod.Namespace \"csi.storage.k8s.io/pod.uid\": string(pod.UID) \"csi.storage.k8s.io/ephemeral\": \"true\" if the volume is an ephemeral inline volume\n defined by a CSIVolumeSource, otherwise \"false\"\n\n\"csi.storage.k8s.io/ephemeral\" is a new feature in Kubernetes 1.16. It is only required for drivers which support both the \"Persistent\" and \"Ephemeral\" VolumeLifecycleMode. Other drivers can leave pod info disabled and/or ignore this field. As Kubernetes 1.15 doesn't support this field, drivers can only support one mode when deployed on such a cluster and the deployment determines which mode that is, for example via a command line parameter of the driver.\n\nThis field is immutable.", + "volumeLifecycleModes": "VolumeLifecycleModes defines what kind of volumes this CSI volume driver supports. The default if the list is empty is \"Persistent\", which is the usage defined by the CSI specification and implemented in Kubernetes via the usual PV/PVC mechanism. The other mode is \"Ephemeral\". In this mode, volumes are defined inline inside the pod spec with CSIVolumeSource and their lifecycle is tied to the lifecycle of that pod. A driver has to be aware of this because it is only going to get a NodePublishVolume call for such a volume. For more information about implementing this mode, see https://kubernetes-csi.github.io/docs/ephemeral-local-volumes.html A driver can support one or more of these modes and more modes may be added in the future.\n\nThis field is immutable.", + "storageCapacity": "If set to true, storageCapacity indicates that the CSI volume driver wants pod scheduling to consider the storage capacity that the driver deployment will report by creating CSIStorageCapacity objects with capacity information.\n\nThe check can be enabled immediately when deploying a driver. In that case, provisioning new volumes with late binding will pause until the driver deployment has published some suitable CSIStorageCapacity object.\n\nAlternatively, the driver can be deployed with the field unset or false and it can be flipped later when storage capacity information has been published.\n\nThis field is immutable.\n\nThis is a beta field and only available when the CSIStorageCapacity feature is enabled. The default is false.", + "fsGroupPolicy": "Defines if the underlying volume supports changing ownership and permission of the volume before being mounted. Refer to the specific FSGroupPolicy values for additional details. This field is alpha-level, and is only honored by servers that enable the CSIVolumeFSGroupPolicy feature gate.\n\nThis field is immutable.", + "tokenRequests": "TokenRequests indicates the CSI driver needs pods' service account tokens it is mounting volume for to do necessary authentication. Kubelet will pass the tokens in VolumeContext in the CSI NodePublishVolume calls. The CSI driver should parse and validate the following VolumeContext: \"csi.storage.k8s.io/serviceAccount.tokens\": {\n \"\": {\n \"token\": ,\n \"expirationTimestamp\": ,\n },\n ...\n}\n\nNote: Audience in each TokenRequest should be different and at most one token is empty string. To receive a new token after expiry, RequiresRepublish can be used to trigger NodePublishVolume periodically.\n\nThis is a beta feature and only available when the CSIServiceAccountToken feature is enabled.", + "requiresRepublish": "RequiresRepublish indicates the CSI driver wants `NodePublishVolume` being periodically called to reflect any possible change in the mounted volume. This field defaults to false.\n\nNote: After a successful initial NodePublishVolume call, subsequent calls to NodePublishVolume should only update the contents of the volume. New mount points will not be seen by a running container.\n\nThis is a beta feature and only available when the CSIServiceAccountToken feature is enabled.", } func (CSIDriverSpec) SwaggerDoc() map[string]string { @@ -103,6 +103,29 @@ func (CSINodeSpec) SwaggerDoc() map[string]string { return map_CSINodeSpec } +var map_CSIStorageCapacity = map[string]string{ + "": "CSIStorageCapacity stores the result of one CSI GetCapacity call. For a given StorageClass, this describes the available capacity in a particular topology segment. This can be used when considering where to instantiate new PersistentVolumes.\n\nFor example this can express things like: - StorageClass \"standard\" has \"1234 GiB\" available in \"topology.kubernetes.io/zone=us-east1\" - StorageClass \"localssd\" has \"10 GiB\" available in \"kubernetes.io/hostname=knode-abc123\"\n\nThe following three cases all imply that no capacity is available for a certain combination: - no object exists with suitable topology and storage class name - such an object exists, but the capacity is unset - such an object exists, but the capacity is zero\n\nThe producer of these objects can decide which approach is more suitable.\n\nThey are consumed by the kube-scheduler if the CSIStorageCapacity beta feature gate is enabled there and a CSI driver opts into capacity-aware scheduling with CSIDriver.StorageCapacity.", + "metadata": "Standard object's metadata. The name has no particular meaning. It must be be a DNS subdomain (dots allowed, 253 characters). To ensure that there are no conflicts with other CSI drivers on the cluster, the recommendation is to use csisc-, a generated name, or a reverse-domain name which ends with the unique CSI driver name.\n\nObjects are namespaced.\n\nMore info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "nodeTopology": "NodeTopology defines which nodes have access to the storage for which capacity was reported. If not set, the storage is not accessible from any node in the cluster. If empty, the storage is accessible from all nodes. This field is immutable.", + "storageClassName": "The name of the StorageClass that the reported capacity applies to. It must meet the same requirements as the name of a StorageClass object (non-empty, DNS subdomain). If that object no longer exists, the CSIStorageCapacity object is obsolete and should be removed by its creator. This field is immutable.", + "capacity": "Capacity is the value reported by the CSI driver in its GetCapacityResponse for a GetCapacityRequest with topology and parameters that match the previous fields.\n\nThe semantic is currently (CSI spec 1.2) defined as: The available capacity, in bytes, of the storage that can be used to provision volumes. If not set, that information is currently unavailable and treated like zero capacity.", + "maximumVolumeSize": "MaximumVolumeSize is the value reported by the CSI driver in its GetCapacityResponse for a GetCapacityRequest with topology and parameters that match the previous fields.\n\nThis is defined since CSI spec 1.4.0 as the largest size that may be used in a CreateVolumeRequest.capacity_range.required_bytes field to create a volume with the same parameters as those in GetCapacityRequest. The corresponding value in the Kubernetes API is ResourceRequirements.Requests in a volume claim.", +} + +func (CSIStorageCapacity) SwaggerDoc() map[string]string { + return map_CSIStorageCapacity +} + +var map_CSIStorageCapacityList = map[string]string{ + "": "CSIStorageCapacityList is a collection of CSIStorageCapacity objects.", + "metadata": "Standard list metadata More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "items": "Items is the list of CSIStorageCapacity objects.", +} + +func (CSIStorageCapacityList) SwaggerDoc() map[string]string { + return map_CSIStorageCapacityList +} + var map_StorageClass = map[string]string{ "": "StorageClass describes the parameters for a class of storage for which PersistentVolumes can be dynamically provisioned.\n\nStorageClasses are non-namespaced; the name of the storage class according to etcd is in ObjectMeta.Name.", "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", diff --git a/vendor/k8s.io/api/storage/v1beta1/zz_generated.deepcopy.go b/vendor/k8s.io/api/storage/v1beta1/zz_generated.deepcopy.go index 89a102901cad..9b7e675ee6ff 100644 --- a/vendor/k8s.io/api/storage/v1beta1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/storage/v1beta1/zz_generated.deepcopy.go @@ -21,7 +21,8 @@ limitations under the License. package v1beta1 import ( - v1 "k8s.io/api/core/v1" + corev1 "k8s.io/api/core/v1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" ) @@ -247,6 +248,80 @@ func (in *CSINodeSpec) DeepCopy() *CSINodeSpec { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *CSIStorageCapacity) DeepCopyInto(out *CSIStorageCapacity) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + if in.NodeTopology != nil { + in, out := &in.NodeTopology, &out.NodeTopology + *out = new(v1.LabelSelector) + (*in).DeepCopyInto(*out) + } + if in.Capacity != nil { + in, out := &in.Capacity, &out.Capacity + x := (*in).DeepCopy() + *out = &x + } + if in.MaximumVolumeSize != nil { + in, out := &in.MaximumVolumeSize, &out.MaximumVolumeSize + x := (*in).DeepCopy() + *out = &x + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CSIStorageCapacity. +func (in *CSIStorageCapacity) DeepCopy() *CSIStorageCapacity { + if in == nil { + return nil + } + out := new(CSIStorageCapacity) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *CSIStorageCapacity) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *CSIStorageCapacityList) DeepCopyInto(out *CSIStorageCapacityList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]CSIStorageCapacity, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CSIStorageCapacityList. +func (in *CSIStorageCapacityList) DeepCopy() *CSIStorageCapacityList { + if in == nil { + return nil + } + out := new(CSIStorageCapacityList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *CSIStorageCapacityList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *StorageClass) DeepCopyInto(out *StorageClass) { *out = *in @@ -261,7 +336,7 @@ func (in *StorageClass) DeepCopyInto(out *StorageClass) { } if in.ReclaimPolicy != nil { in, out := &in.ReclaimPolicy, &out.ReclaimPolicy - *out = new(v1.PersistentVolumeReclaimPolicy) + *out = new(corev1.PersistentVolumeReclaimPolicy) **out = **in } if in.MountOptions != nil { @@ -281,7 +356,7 @@ func (in *StorageClass) DeepCopyInto(out *StorageClass) { } if in.AllowedTopologies != nil { in, out := &in.AllowedTopologies, &out.AllowedTopologies - *out = make([]v1.TopologySelectorTerm, len(*in)) + *out = make([]corev1.TopologySelectorTerm, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -432,7 +507,7 @@ func (in *VolumeAttachmentSource) DeepCopyInto(out *VolumeAttachmentSource) { } if in.InlineVolumeSpec != nil { in, out := &in.InlineVolumeSpec, &out.InlineVolumeSpec - *out = new(v1.PersistentVolumeSpec) + *out = new(corev1.PersistentVolumeSpec) (*in).DeepCopyInto(*out) } return diff --git a/vendor/k8s.io/api/storage/v1beta1/zz_generated.prerelease-lifecycle.go b/vendor/k8s.io/api/storage/v1beta1/zz_generated.prerelease-lifecycle.go index 8bb3de20751b..275b5d5dbed3 100644 --- a/vendor/k8s.io/api/storage/v1beta1/zz_generated.prerelease-lifecycle.go +++ b/vendor/k8s.io/api/storage/v1beta1/zz_generated.prerelease-lifecycle.go @@ -120,6 +120,42 @@ func (in *CSINodeList) APILifecycleRemoved() (major, minor int) { return 1, 22 } +// APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. +func (in *CSIStorageCapacity) APILifecycleIntroduced() (major, minor int) { + return 1, 21 +} + +// APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. +func (in *CSIStorageCapacity) APILifecycleDeprecated() (major, minor int) { + return 1, 24 +} + +// APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:removed" tags in types.go or "k8s:prerelease-lifecycle-gen:deprecated" plus three minor. +func (in *CSIStorageCapacity) APILifecycleRemoved() (major, minor int) { + return 1, 27 +} + +// APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. +func (in *CSIStorageCapacityList) APILifecycleIntroduced() (major, minor int) { + return 1, 21 +} + +// APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. +func (in *CSIStorageCapacityList) APILifecycleDeprecated() (major, minor int) { + return 1, 24 +} + +// APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:removed" tags in types.go or "k8s:prerelease-lifecycle-gen:deprecated" plus three minor. +func (in *CSIStorageCapacityList) APILifecycleRemoved() (major, minor int) { + return 1, 27 +} + // APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. // It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. func (in *StorageClass) APILifecycleIntroduced() (major, minor int) { diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apihelpers/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/apihelpers/BUILD deleted file mode 100644 index 84e1338c1cbe..000000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apihelpers/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["helpers.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver/pkg/apihelpers", - importpath = "k8s.io/apiextensions-apiserver/pkg/apihelpers", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["helpers_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/BUILD deleted file mode 100644 index adecb6e0458d..000000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/BUILD +++ /dev/null @@ -1,54 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "deepcopy.go", - "doc.go", - "helpers.go", - "register.go", - "types.go", - "types_jsonschema.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions", - importpath = "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["helpers_test.go"], - embed = [":go_default_library"], - deps = ["//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/fuzzer:all-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install:all-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:all-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:all-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install/BUILD deleted file mode 100644 index ef249dcb4968..000000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["roundtrip_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/fuzzer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/apitesting/roundtrip:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["install.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install", - importpath = "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install", - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/types.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/types.go index ee77a4229de3..b1c5f6f4c09f 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/types.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/types.go @@ -326,6 +326,8 @@ type CustomResourceDefinitionCondition struct { // CustomResourceDefinitionStatus indicates the state of the CustomResourceDefinition type CustomResourceDefinitionStatus struct { // Conditions indicate state for particular aspects of a CustomResourceDefinition + // +listType=map + // +listMapKey=type Conditions []CustomResourceDefinitionCondition // AcceptedNames are the names that are actually being used to serve discovery diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/BUILD deleted file mode 100644 index b1f9b4eb1bd3..000000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/BUILD +++ /dev/null @@ -1,70 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "deepcopy.go", - "defaults.go", - "doc.go", - "generated.pb.go", - "marshal.go", - "register.go", - "types.go", - "types_jsonschema.go", - "zz_generated.conversion.go", - "zz_generated.deepcopy.go", - "zz_generated.defaults.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1", - importpath = "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1", - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/json:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = [ - "conversion_test.go", - "defaults_test.go", - "marshal_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/github.com/google/go-cmp/cmp:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/generated.pb.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/generated.pb.go index d6f0c35fe26d..f3388ffe8511 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/generated.pb.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/generated.pb.go @@ -3863,10 +3863,7 @@ func (m *ConversionRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4015,10 +4012,7 @@ func (m *ConversionResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4140,10 +4134,7 @@ func (m *ConversionReview) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4372,10 +4363,7 @@ func (m *CustomResourceColumnDefinition) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4493,10 +4481,7 @@ func (m *CustomResourceConversion) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4645,10 +4630,7 @@ func (m *CustomResourceDefinition) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4859,10 +4841,7 @@ func (m *CustomResourceDefinitionCondition) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4979,10 +4958,7 @@ func (m *CustomResourceDefinitionList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5224,10 +5200,7 @@ func (m *CustomResourceDefinitionNames) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5464,10 +5437,7 @@ func (m *CustomResourceDefinitionSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5616,10 +5586,7 @@ func (m *CustomResourceDefinitionStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5900,10 +5867,7 @@ func (m *CustomResourceDefinitionVersion) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -6050,10 +6014,7 @@ func (m *CustomResourceSubresourceScale) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -6103,10 +6064,7 @@ func (m *CustomResourceSubresourceStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -6228,10 +6186,7 @@ func (m *CustomResourceSubresources) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -6317,10 +6272,7 @@ func (m *CustomResourceValidation) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -6434,10 +6386,7 @@ func (m *ExternalDocumentation) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -6521,10 +6470,7 @@ func (m *JSON) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -7435,7 +7381,7 @@ func (m *JSONSchemaProps) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -7600,7 +7546,7 @@ func (m *JSONSchemaProps) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -7729,7 +7675,7 @@ func (m *JSONSchemaProps) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -7894,7 +7840,7 @@ func (m *JSONSchemaProps) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -8162,10 +8108,7 @@ func (m *JSONSchemaProps) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -8285,10 +8228,7 @@ func (m *JSONSchemaPropsOrArray) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -8394,10 +8334,7 @@ func (m *JSONSchemaPropsOrBool) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -8515,10 +8452,7 @@ func (m *JSONSchemaPropsOrStringArray) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -8685,10 +8619,7 @@ func (m *ServiceReference) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -8841,10 +8772,7 @@ func (m *WebhookClientConfig) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -8962,10 +8890,7 @@ func (m *WebhookConversion) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/generated.proto b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/generated.proto index 3494a31ba064..a82824ae71ec 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/generated.proto +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/generated.proto @@ -234,6 +234,8 @@ message CustomResourceDefinitionSpec { message CustomResourceDefinitionStatus { // conditions indicate state for particular aspects of a CustomResourceDefinition // +optional + // +listType=map + // +listMapKey=type repeated CustomResourceDefinitionCondition conditions = 1; // acceptedNames are the names that are actually being used to serve discovery. diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/types.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/types.go index 02922c593e68..a55dd5b1b739 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/types.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/types.go @@ -329,6 +329,8 @@ type CustomResourceDefinitionCondition struct { type CustomResourceDefinitionStatus struct { // conditions indicate state for particular aspects of a CustomResourceDefinition // +optional + // +listType=map + // +listMapKey=type Conditions []CustomResourceDefinitionCondition `json:"conditions" protobuf:"bytes,1,opt,name=conditions"` // acceptedNames are the names that are actually being used to serve discovery. diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/BUILD deleted file mode 100644 index 6cfa49ae06f1..000000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/BUILD +++ /dev/null @@ -1,70 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "deepcopy.go", - "defaults.go", - "doc.go", - "generated.pb.go", - "marshal.go", - "register.go", - "types.go", - "types_jsonschema.go", - "zz_generated.conversion.go", - "zz_generated.deepcopy.go", - "zz_generated.defaults.go", - "zz_generated.prerelease-lifecycle.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1", - importpath = "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1", - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/json:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = [ - "conversion_test.go", - "defaults_test.go", - "marshal_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/github.com/google/go-cmp/cmp:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/generated.pb.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/generated.pb.go index 0382b044585c..2c53cd916a92 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/generated.pb.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/generated.pb.go @@ -3850,10 +3850,7 @@ func (m *ConversionRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4002,10 +3999,7 @@ func (m *ConversionResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4127,10 +4121,7 @@ func (m *ConversionReview) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4359,10 +4350,7 @@ func (m *CustomResourceColumnDefinition) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4512,10 +4500,7 @@ func (m *CustomResourceConversion) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4664,10 +4649,7 @@ func (m *CustomResourceDefinition) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4878,10 +4860,7 @@ func (m *CustomResourceDefinitionCondition) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4998,10 +4977,7 @@ func (m *CustomResourceDefinitionList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5243,10 +5219,7 @@ func (m *CustomResourceDefinitionNames) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5622,10 +5595,7 @@ func (m *CustomResourceDefinitionSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5774,10 +5744,7 @@ func (m *CustomResourceDefinitionStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -6058,10 +6025,7 @@ func (m *CustomResourceDefinitionVersion) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -6208,10 +6172,7 @@ func (m *CustomResourceSubresourceScale) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -6261,10 +6222,7 @@ func (m *CustomResourceSubresourceStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -6386,10 +6344,7 @@ func (m *CustomResourceSubresources) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -6475,10 +6430,7 @@ func (m *CustomResourceValidation) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -6592,10 +6544,7 @@ func (m *ExternalDocumentation) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -6679,10 +6628,7 @@ func (m *JSON) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -7593,7 +7539,7 @@ func (m *JSONSchemaProps) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -7758,7 +7704,7 @@ func (m *JSONSchemaProps) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -7887,7 +7833,7 @@ func (m *JSONSchemaProps) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -8052,7 +7998,7 @@ func (m *JSONSchemaProps) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -8320,10 +8266,7 @@ func (m *JSONSchemaProps) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -8443,10 +8386,7 @@ func (m *JSONSchemaPropsOrArray) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -8552,10 +8492,7 @@ func (m *JSONSchemaPropsOrBool) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -8673,10 +8610,7 @@ func (m *JSONSchemaPropsOrStringArray) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -8843,10 +8777,7 @@ func (m *ServiceReference) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -8999,10 +8930,7 @@ func (m *WebhookClientConfig) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/generated.proto b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/generated.proto index 40635aff379c..e738f423c85f 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/generated.proto +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/generated.proto @@ -280,6 +280,8 @@ message CustomResourceDefinitionSpec { message CustomResourceDefinitionStatus { // conditions indicate state for particular aspects of a CustomResourceDefinition // +optional + // +listType=map + // +listMapKey=type repeated CustomResourceDefinitionCondition conditions = 1; // acceptedNames are the names that are actually being used to serve discovery. diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/types.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/types.go index 806c68aa6c10..671869b9f7f5 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/types.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/types.go @@ -361,6 +361,8 @@ type CustomResourceDefinitionCondition struct { type CustomResourceDefinitionStatus struct { // conditions indicate state for particular aspects of a CustomResourceDefinition // +optional + // +listType=map + // +listMapKey=type Conditions []CustomResourceDefinitionCondition `json:"conditions" protobuf:"bytes,1,opt,name=conditions"` // acceptedNames are the names that are actually being used to serve discovery. diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/BUILD deleted file mode 100644 index cef98b9da581..000000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/BUILD +++ /dev/null @@ -1,63 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["validation.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation", - importpath = "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation", - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apihelpers:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/defaulting:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/webhook:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["validation_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/fuzzer:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/apitesting/fuzzer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/json:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation.go index e25dd1e7a72d..32ae5e994365 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation.go @@ -1409,7 +1409,7 @@ func validateAPIApproval(newCRD, oldCRD *apiextensions.CustomResourceDefinition, var oldApprovalState *apihelpers.APIApprovalState if oldCRD != nil { t, _ := apihelpers.GetAPIApprovalState(oldCRD.Annotations) - oldApprovalState = &t + oldApprovalState = &t // +k8s:verify-mutation:reason=clone } newApprovalState, reason := apihelpers.GetAPIApprovalState(newCRD.Annotations) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/BUILD deleted file mode 100644 index 47bc09f8316e..000000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/BUILD +++ /dev/null @@ -1,150 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "apiserver.go", - "customresource_discovery.go", - "customresource_discovery_controller.go", - "customresource_handler.go", - "helpers.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver", - importpath = "k8s.io/apiextensions-apiserver/pkg/apiserver", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apihelpers:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/conversion:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/defaulting:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/objectmeta:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/pruning:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/validation:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/controller/apiapproval:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/controller/establish:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/controller/finalizer:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/controller/nonstructuralschema:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/controller/openapi:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/controller/openapi/builder:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/controller/status:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/crdserverscheme:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresource:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresource/tableconvertor:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/json:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/protobuf:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/versioning:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/waitgroup:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/version:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/discovery:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/handlers:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/metrics:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/features:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/filters:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/storage:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/storagebackend:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/openapi:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/webhook:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/warning:go_default_library", - "//staging/src/k8s.io/client-go/scale:go_default_library", - "//staging/src/k8s.io/client-go/scale/scheme/autoscalingv1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/util/workqueue:go_default_library", - "//vendor/github.com/go-openapi/spec:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/util/proto:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/validation/spec:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/validation/strfmt:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/validation/validate:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["customresource_handler_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/conversion:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/fake:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/controller/establish:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/protobuf:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/discovery:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/options:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/testing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/webhook:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//vendor/sigs.k8s.io/yaml:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/conversion:all-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema:all-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/validation:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/apiserver.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/apiserver.go index 65adf66194b6..ece52922ee90 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/apiserver.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/apiserver.go @@ -135,9 +135,15 @@ func (c completedConfig) New(delegationTarget genericapiserver.DelegationTarget) GenericAPIServer: genericServer, } + // used later to filter the served resource by those that have expired. + resourceExpirationEvaluator, err := genericapiserver.NewResourceExpirationEvaluator(*c.GenericConfig.Version) + if err != nil { + return nil, err + } + apiResourceConfig := c.GenericConfig.MergedResourceConfig apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(apiextensions.GroupName, Scheme, metav1.ParameterCodec, Codecs) - if apiResourceConfig.VersionEnabled(v1beta1.SchemeGroupVersion) { + if resourceExpirationEvaluator.ShouldServeForVersion(1, 22) && apiResourceConfig.VersionEnabled(v1beta1.SchemeGroupVersion) { storage := map[string]rest.Storage{} // customresourcedefinitions customResourceDefinitionStorage, err := customresourcedefinition.NewREST(Scheme, c.GenericConfig.RESTOptionsGetter) @@ -152,12 +158,12 @@ func (c completedConfig) New(delegationTarget genericapiserver.DelegationTarget) if apiResourceConfig.VersionEnabled(v1.SchemeGroupVersion) { storage := map[string]rest.Storage{} // customresourcedefinitions - customResourceDefintionStorage, err := customresourcedefinition.NewREST(Scheme, c.GenericConfig.RESTOptionsGetter) + customResourceDefinitionStorage, err := customresourcedefinition.NewREST(Scheme, c.GenericConfig.RESTOptionsGetter) if err != nil { return nil, err } - storage["customresourcedefinitions"] = customResourceDefintionStorage - storage["customresourcedefinitions/status"] = customresourcedefinition.NewStatusREST(Scheme, customResourceDefintionStorage) + storage["customresourcedefinitions"] = customResourceDefinitionStorage + storage["customresourcedefinitions/status"] = customresourcedefinition.NewStatusREST(Scheme, customResourceDefinitionStorage) apiGroupInfo.VersionedResourcesStorageMap[v1.SchemeGroupVersion.Version] = storage } diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/conversion/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/conversion/BUILD deleted file mode 100644 index f1a6b656c0e5..000000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/conversion/BUILD +++ /dev/null @@ -1,69 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "converter.go", - "metrics.go", - "nop_converter.go", - "webhook_converter.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/conversion", - importpath = "k8s.io/apiextensions-apiserver/pkg/apiserver/conversion", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/webhook:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - "//vendor/k8s.io/utils/trace:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = [ - "converter_test.go", - "webhook_converter_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/webhook:go_default_library", - "//vendor/github.com/google/go-cmp/cmp:go_default_library", - ], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_discovery_controller.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_discovery_controller.go index 090274c6330f..aad0482633d2 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_discovery_controller.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_discovery_controller.go @@ -204,9 +204,9 @@ func sortGroupDiscoveryByKubeAwareVersion(gd []metav1.GroupVersionForDiscovery) func (c *DiscoveryController) Run(stopCh <-chan struct{}, synchedCh chan<- struct{}) { defer utilruntime.HandleCrash() defer c.queue.ShutDown() - defer klog.Infof("Shutting down DiscoveryController") + defer klog.Info("Shutting down DiscoveryController") - klog.Infof("Starting DiscoveryController") + klog.Info("Starting DiscoveryController") if !cache.WaitForCacheSync(stopCh, c.crdsSynced) { utilruntime.HandleError(fmt.Errorf("timed out waiting for caches to sync")) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler.go index d3eddb8c6f16..b264b5ab5596 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler.go @@ -27,6 +27,7 @@ import ( "time" goopenapispec "github.com/go-openapi/spec" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" apiextensionshelpers "k8s.io/apiextensions-apiserver/pkg/apihelpers" apiextensionsinternal "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions" @@ -366,7 +367,7 @@ func (r *crdHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) { case subresource == "scale" && subresources != nil && subresources.Scale != nil: handlerFunc = r.serveScale(w, req, requestInfo, crdInfo, terminating, supportedTypes) case len(subresource) == 0: - handlerFunc = r.serveResource(w, req, requestInfo, crdInfo, terminating, supportedTypes) + handlerFunc = r.serveResource(w, req, requestInfo, crdInfo, crd, terminating, supportedTypes) default: responsewriters.ErrorNegotiated( apierrors.NewNotFound(schema.GroupResource{Group: requestInfo.APIGroup, Resource: requestInfo.Resource}, requestInfo.Name), @@ -382,13 +383,13 @@ func (r *crdHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) { } } -func (r *crdHandler) serveResource(w http.ResponseWriter, req *http.Request, requestInfo *apirequest.RequestInfo, crdInfo *crdInfo, terminating bool, supportedTypes []string) http.HandlerFunc { +func (r *crdHandler) serveResource(w http.ResponseWriter, req *http.Request, requestInfo *apirequest.RequestInfo, crdInfo *crdInfo, crd *apiextensionsv1.CustomResourceDefinition, terminating bool, supportedTypes []string) http.HandlerFunc { requestScope := crdInfo.requestScopes[requestInfo.APIVersion] storage := crdInfo.storages[requestInfo.APIVersion].CustomResource switch requestInfo.Verb { case "get": - return handlers.GetResource(storage, storage, requestScope) + return handlers.GetResource(storage, requestScope) case "list": forceWatch := false return handlers.ListResource(storage, storage, requestScope, forceWatch, r.minRequestTimeout) @@ -396,6 +397,13 @@ func (r *crdHandler) serveResource(w http.ResponseWriter, req *http.Request, req forceWatch := true return handlers.ListResource(storage, storage, requestScope, forceWatch, r.minRequestTimeout) case "create": + // we want to track recently created CRDs so that in HA environments we don't have server A allow a create and server B + // not have observed the established, so a followup get,update,delete results in a 404. We've observed about 800ms + // delay in some CI environments. Two seconds looks long enough and reasonably short for hot retriers. + justCreated := time.Since(apiextensionshelpers.FindCRDCondition(crd, apiextensionsv1.Established).LastTransitionTime.Time) < 2*time.Second + if justCreated { + time.Sleep(2 * time.Second) + } if terminating { err := apierrors.NewMethodNotSupported(schema.GroupResource{Group: requestInfo.APIGroup, Resource: requestInfo.Resource}, requestInfo.Verb) err.ErrStatus.Message = fmt.Sprintf("%v not allowed while custom resource definition is terminating", requestInfo.Verb) @@ -428,7 +436,7 @@ func (r *crdHandler) serveStatus(w http.ResponseWriter, req *http.Request, reque switch requestInfo.Verb { case "get": - return handlers.GetResource(storage, nil, requestScope) + return handlers.GetResource(storage, requestScope) case "update": return handlers.UpdateResource(storage, requestScope, r.admission) case "patch": @@ -448,7 +456,7 @@ func (r *crdHandler) serveScale(w http.ResponseWriter, req *http.Request, reques switch requestInfo.Verb { case "get": - return handlers.GetResource(storage, nil, requestScope) + return handlers.GetResource(storage, requestScope) case "update": return handlers.UpdateResource(storage, requestScope, r.admission) case "patch": @@ -468,6 +476,16 @@ func (r *crdHandler) createCustomResourceDefinition(obj interface{}) { r.customStorageLock.Lock() defer r.customStorageLock.Unlock() // this could happen if the create event is merged from create-update events + storageMap := r.customStorage.Load().(crdStorageMap) + oldInfo, found := storageMap[crd.UID] + if !found { + return + } + if apiequality.Semantic.DeepEqual(&crd.Spec, oldInfo.spec) && apiequality.Semantic.DeepEqual(&crd.Status.AcceptedNames, oldInfo.acceptedNames) { + klog.V(6).Infof("Ignoring customresourcedefinition %s create event because a storage with the same spec and accepted names exists", + crd.Name) + return + } r.removeStorage_locked(crd.UID) } @@ -688,7 +706,6 @@ func (r *crdHandler) getOrCreateServingInfoFor(uid types.UID, name string) (*crd parameterScheme := runtime.NewScheme() parameterScheme.AddUnversionedTypes(schema.GroupVersion{Group: crd.Spec.Group, Version: v.Name}, &metav1.ListOptions{}, - &metav1.ExportOptions{}, &metav1.GetOptions{}, &metav1.DeleteOptions{}, ) @@ -849,14 +866,12 @@ func (r *crdHandler) getOrCreateServingInfoFor(uid types.UID, name string) (*crd MaxRequestBodyBytes: r.maxRequestBodyBytes, } if utilfeature.DefaultFeatureGate.Enabled(features.ServerSideApply) { + resetFields := storages[v.Name].CustomResource.GetResetFields() reqScope := *requestScopes[v.Name] - reqScope.FieldManager, err = fieldmanager.NewDefaultCRDFieldManager( + reqScope, err = scopeWithFieldManager( typeConverter, - reqScope.Convertor, - reqScope.Defaulter, - reqScope.Creater, - reqScope.Kind, - reqScope.HubGroupVersion, + reqScope, + resetFields, false, ) if err != nil { @@ -885,20 +900,6 @@ func (r *crdHandler) getOrCreateServingInfoFor(uid types.UID, name string) (*crd // override status subresource values // shallow copy statusScope := *requestScopes[v.Name] - if utilfeature.DefaultFeatureGate.Enabled(features.ServerSideApply) { - statusScope.FieldManager, err = fieldmanager.NewDefaultCRDFieldManager( - typeConverter, - statusScope.Convertor, - statusScope.Defaulter, - statusScope.Creater, - statusScope.Kind, - statusScope.HubGroupVersion, - true, - ) - if err != nil { - return nil, err - } - } statusScope.Subresource = "status" statusScope.Namer = handlers.ContextBasedNaming{ SelfLinker: meta.NewAccessor(), @@ -906,6 +907,20 @@ func (r *crdHandler) getOrCreateServingInfoFor(uid types.UID, name string) (*crd SelfLinkPathPrefix: selfLinkPrefix, SelfLinkPathSuffix: "/status", } + + if utilfeature.DefaultFeatureGate.Enabled(features.ServerSideApply) && subresources != nil && subresources.Status != nil { + resetFields := storages[v.Name].Status.GetResetFields() + statusScope, err = scopeWithFieldManager( + typeConverter, + statusScope, + resetFields, + true, + ) + if err != nil { + return nil, err + } + } + statusScopes[v.Name] = &statusScope if v.Deprecated { @@ -943,6 +958,24 @@ func (r *crdHandler) getOrCreateServingInfoFor(uid types.UID, name string) (*crd return ret, nil } +func scopeWithFieldManager(typeConverter fieldmanager.TypeConverter, reqScope handlers.RequestScope, resetFields map[fieldpath.APIVersion]*fieldpath.Set, ignoreManagedFieldsFromRequestObject bool) (handlers.RequestScope, error) { + fieldManager, err := fieldmanager.NewDefaultCRDFieldManager( + typeConverter, + reqScope.Convertor, + reqScope.Defaulter, + reqScope.Creater, + reqScope.Kind, + reqScope.HubGroupVersion, + ignoreManagedFieldsFromRequestObject, + resetFields, + ) + if err != nil { + return handlers.RequestScope{}, err + } + reqScope.FieldManager = fieldManager + return reqScope, nil +} + func defaultDeprecationWarning(deprecatedVersion string, crd apiextensionsv1.CustomResourceDefinitionSpec) string { msg := fmt.Sprintf("%s/%s %s is deprecated", crd.Group, deprecatedVersion, crd.Names.Kind) @@ -1321,7 +1354,7 @@ func buildOpenAPIModelsForApply(staticOpenAPISpec *goopenapispec.Swagger, crd *a specs := []*goopenapispec.Swagger{} for _, v := range crd.Spec.Versions { // Defaults are not pruned here, but before being served. - s, err := builder.BuildSwagger(crd, v.Name, builder.Options{V2: false, StripValueValidation: true, StripNullable: true, AllowNonStructural: true}) + s, err := builder.BuildSwagger(crd, v.Name, builder.Options{V2: false, StripValueValidation: true, StripNullable: true, AllowNonStructural: false}) if err != nil { return nil, err } diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/BUILD deleted file mode 100644 index 116b3cc9030f..000000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/BUILD +++ /dev/null @@ -1,66 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "complete.go", - "convert.go", - "goopenapi.go", - "kubeopenapi.go", - "skeleton.go", - "structural.go", - "unfold.go", - "validation.go", - "visitor.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema", - importpath = "k8s.io/apiextensions-apiserver/pkg/apiserver/schema", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//vendor/github.com/go-openapi/spec:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/validation/spec:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/defaulting:all-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/listtype:all-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/objectmeta:all-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/pruning:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = [ - "convert_test.go", - "goopenapi_test.go", - "kubeopenapi_test.go", - "unfold_test.go", - "validation_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/json:go_default_library", - "//vendor/github.com/google/gofuzz:go_default_library", - ], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/defaulting/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/defaulting/BUILD deleted file mode 100644 index 8c0da5f4cea3..000000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/defaulting/BUILD +++ /dev/null @@ -1,53 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "algorithm.go", - "prune.go", - "prunenulls.go", - "surroundingobject.go", - "validation.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/defaulting", - importpath = "k8s.io/apiextensions-apiserver/pkg/apiserver/schema/defaulting", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/objectmeta:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/pruning:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/validation/strfmt:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/validation/validate:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "algorithm_test.go", - "prunenulls_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/json:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/listtype/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/listtype/BUILD deleted file mode 100644 index 10339075eda8..000000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/listtype/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["validation.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/listtype", - importpath = "k8s.io/apiextensions-apiserver/pkg/apiserver/schema/listtype", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/json:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["validation_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/objectmeta/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/objectmeta/BUILD deleted file mode 100644 index 63de0c4fc1ec..000000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/objectmeta/BUILD +++ /dev/null @@ -1,66 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "algorithm.go", - "coerce.go", - "validation.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/objectmeta", - importpath = "k8s.io/apiextensions-apiserver/pkg/apiserver/schema/objectmeta", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/validation/path:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/json:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "algorithm_test.go", - "coerce_test.go", - "jsonpath_test.go", - "validation_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/apitesting/fuzzer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/fuzzer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/json:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/json:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/pruning/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/pruning/BUILD deleted file mode 100644 index 2332eb344bcf..000000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/pruning/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["algorithm.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/pruning", - importpath = "k8s.io/apiextensions-apiserver/pkg/apiserver/schema/pruning", - visibility = ["//visibility:public"], - deps = ["//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema:go_default_library"], -) - -go_test( - name = "go_default_test", - srcs = ["algorithm_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/json:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/validation/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/validation/BUILD deleted file mode 100644 index 93edbdfcf8dc..000000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/validation/BUILD +++ /dev/null @@ -1,61 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "formats.go", - "validation.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/validation", - importpath = "k8s.io/apiextensions-apiserver/pkg/apiserver/validation", - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/validation/errors:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/validation/spec:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/validation/strfmt:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/validation/validate:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = [ - "formats_test.go", - "validation_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/fuzzer:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/apitesting/fuzzer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/json:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/validation/spec:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/validation/strfmt:go_default_library", - ], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/BUILD deleted file mode 100644 index 0e2f24383cbc..000000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "clientset.go", - "doc.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset", - importpath = "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset", - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/discovery:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/fake:all-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme:all-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1:all-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme/BUILD deleted file mode 100644 index 9b262d3a44d2..000000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme", - importpath = "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme", - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1/BUILD deleted file mode 100644 index 1650af5a7a81..000000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "apiextensions_client.go", - "customresourcedefinition.go", - "doc.go", - "generated_expansion.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1", - importpath = "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1/fake:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/BUILD deleted file mode 100644 index a8884d426576..000000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "apiextensions_client.go", - "customresourcedefinition.go", - "doc.go", - "generated_expansion.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1", - importpath = "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1", - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/BUILD deleted file mode 100644 index 242ea0567b7a..000000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "factory.go", - "generic.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions", - importpath = "k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions", - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/internalinterfaces:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions:all-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/internalinterfaces:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/BUILD deleted file mode 100644 index 5d0e7c3e2212..000000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["interface.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions", - importpath = "k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions", - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1beta1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/internalinterfaces:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1:all-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1beta1:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1/BUILD deleted file mode 100644 index 18c62ec0cbd5..000000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "customresourcedefinition.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1", - importpath = "k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/internalinterfaces:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1beta1/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1beta1/BUILD deleted file mode 100644 index e3cae4030b8e..000000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1beta1/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "customresourcedefinition.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1beta1", - importpath = "k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1beta1", - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/internalinterfaces:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/internalinterfaces/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/internalinterfaces/BUILD deleted file mode 100644 index 8825e80aa243..000000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/internalinterfaces/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["factory_interfaces.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/internalinterfaces", - importpath = "k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/internalinterfaces", - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1/BUILD deleted file mode 100644 index e4ab4a5577d8..000000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "customresourcedefinition.go", - "expansion_generated.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1", - importpath = "k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1beta1/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1beta1/BUILD deleted file mode 100644 index a503d638546b..000000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1beta1/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "customresourcedefinition.go", - "expansion_generated.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1beta1", - importpath = "k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1beta1", - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/cmd/server/options/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/cmd/server/options/BUILD deleted file mode 100644 index 40710a172914..000000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/cmd/server/options/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["options.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver/pkg/cmd/server/options", - importpath = "k8s.io/apiextensions-apiserver/pkg/cmd/server/options", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/options:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/proxy:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/webhook:go_default_library", - "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", - "//vendor/github.com/spf13/pflag:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/cmd/server/testing/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/cmd/server/testing/BUILD deleted file mode 100644 index 212d3161d1f5..000000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/cmd/server/testing/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["testserver.go"], - data = glob(["testdata/**"]), - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver/pkg/cmd/server/testing", - importpath = "k8s.io/apiextensions-apiserver/pkg/cmd/server/testing", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/cmd/server/options:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/storagebackend:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//vendor/github.com/spf13/pflag:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/controller/apiapproval/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/controller/apiapproval/BUILD deleted file mode 100644 index 66189d0490af..000000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/controller/apiapproval/BUILD +++ /dev/null @@ -1,47 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["apiapproval_controller.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver/pkg/controller/apiapproval", - importpath = "k8s.io/apiextensions-apiserver/pkg/controller/apiapproval", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apihelpers:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/util/workqueue:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["apiapproval_controller_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/controller/establish/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/controller/establish/BUILD deleted file mode 100644 index 423d7725bcee..000000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/controller/establish/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["establishing_controller.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver/pkg/controller/establish", - importpath = "k8s.io/apiextensions-apiserver/pkg/controller/establish", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apihelpers:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/util/workqueue:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/controller/establish/establishing_controller.go b/vendor/k8s.io/apiextensions-apiserver/pkg/controller/establish/establishing_controller.go index 5899a5625a4b..c2d7d55718fc 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/controller/establish/establishing_controller.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/controller/establish/establishing_controller.go @@ -73,8 +73,8 @@ func (ec *EstablishingController) Run(stopCh <-chan struct{}) { defer utilruntime.HandleCrash() defer ec.queue.ShutDown() - klog.Infof("Starting EstablishingController") - defer klog.Infof("Shutting down EstablishingController") + klog.Info("Starting EstablishingController") + defer klog.Info("Shutting down EstablishingController") if !cache.WaitForCacheSync(stopCh, ec.crdSynced) { return diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/controller/finalizer/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/controller/finalizer/BUILD deleted file mode 100644 index acb77b3c4a1e..000000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/controller/finalizer/BUILD +++ /dev/null @@ -1,47 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["crd_finalizer.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver/pkg/controller/finalizer", - importpath = "k8s.io/apiextensions-apiserver/pkg/controller/finalizer", - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apihelpers:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/util/workqueue:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/controller/finalizer/crd_finalizer.go b/vendor/k8s.io/apiextensions-apiserver/pkg/controller/finalizer/crd_finalizer.go index 4ccd33cd3368..d559dca45d8f 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/controller/finalizer/crd_finalizer.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/controller/finalizer/crd_finalizer.go @@ -263,8 +263,8 @@ func (c *CRDFinalizer) Run(workers int, stopCh <-chan struct{}) { defer utilruntime.HandleCrash() defer c.queue.ShutDown() - klog.Infof("Starting CRDFinalizer") - defer klog.Infof("Shutting down CRDFinalizer") + klog.Info("Starting CRDFinalizer") + defer klog.Info("Shutting down CRDFinalizer") if !cache.WaitForCacheSync(stopCh, c.crdSynced) { return diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/controller/nonstructuralschema/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/controller/nonstructuralschema/BUILD deleted file mode 100644 index 9c0afced1c65..000000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/controller/nonstructuralschema/BUILD +++ /dev/null @@ -1,50 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["nonstructuralschema_controller.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver/pkg/controller/nonstructuralschema", - importpath = "k8s.io/apiextensions-apiserver/pkg/controller/nonstructuralschema", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apihelpers:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/util/workqueue:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["nonstructuralschema_controller_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/controller/openapi/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/controller/openapi/BUILD deleted file mode 100644 index c74e0752bcab..000000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/controller/openapi/BUILD +++ /dev/null @@ -1,48 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "controller.go", - "metrics.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver/pkg/controller/openapi", - importpath = "k8s.io/apiextensions-apiserver/pkg/controller/openapi", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apihelpers:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/controller/openapi/builder:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/util/workqueue:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - "//vendor/github.com/go-openapi/spec:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/handler:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/controller/openapi/builder:all-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/controller/openapi/v2:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/controller/openapi/builder/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/controller/openapi/builder/BUILD deleted file mode 100644 index 883b9358bc81..000000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/controller/openapi/builder/BUILD +++ /dev/null @@ -1,72 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "builder.go", - "merge.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver/pkg/controller/openapi/builder", - importpath = "k8s.io/apiextensions-apiserver/pkg/controller/openapi/builder", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apihelpers:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/controller/openapi/v2:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/generated/openapi:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/openapi:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/features:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/github.com/emicklei/go-restful:go_default_library", - "//vendor/github.com/go-openapi/spec:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/aggregator:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/builder:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/common:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/util:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["builder_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/json:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/features:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/github.com/go-openapi/spec:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/controller/openapi/builder/builder.go b/vendor/k8s.io/apiextensions-apiserver/pkg/controller/openapi/builder/builder.go index 62b0949735e1..234d785a5b3c 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/controller/openapi/builder/builder.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/controller/openapi/builder/builder.go @@ -103,14 +103,15 @@ func BuildSwagger(crd *apiextensionsv1.CustomResourceDefinition, version string, if opts.AllowNonStructural || len(structuralschema.ValidateStructural(nil, ss)) == 0 { schema = ss + // This adds ValueValidation fields (anyOf, allOf) which may be stripped below if opts.StripValueValidation is true + schema = schema.Unfold() + if opts.StripValueValidation { schema = schema.StripValueValidations() } if opts.StripNullable { schema = schema.StripNullable() } - - schema = schema.Unfold() } } } diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/controller/openapi/v2/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/controller/openapi/v2/BUILD deleted file mode 100644 index 4751762545bb..000000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/controller/openapi/v2/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["conversion.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver/pkg/controller/openapi/v2", - importpath = "k8s.io/apiextensions-apiserver/pkg/controller/openapi/v2", - visibility = ["//visibility:public"], - deps = ["//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema:go_default_library"], -) - -go_test( - name = "go_default_test", - srcs = ["conversion_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema:go_default_library", - "//vendor/github.com/go-openapi/spec:go_default_library", - "//vendor/github.com/google/go-cmp/cmp:go_default_library", - "//vendor/github.com/google/gofuzz:go_default_library", - "//vendor/github.com/googleapis/gnostic/compiler:go_default_library", - "//vendor/github.com/googleapis/gnostic/openapiv2:go_default_library", - "//vendor/gopkg.in/yaml.v2:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/util/proto:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/controller/status/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/controller/status/BUILD deleted file mode 100644 index 702ae9aab835..000000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/controller/status/BUILD +++ /dev/null @@ -1,58 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["naming_controller_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apihelpers:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["naming_controller.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver/pkg/controller/status", - importpath = "k8s.io/apiextensions-apiserver/pkg/controller/status", - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apihelpers:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/util/workqueue:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/controller/status/naming_controller.go b/vendor/k8s.io/apiextensions-apiserver/pkg/controller/status/naming_controller.go index 170304ead0a3..d4165a094577 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/controller/status/naming_controller.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/controller/status/naming_controller.go @@ -288,8 +288,8 @@ func (c *NamingConditionController) Run(stopCh <-chan struct{}) { defer utilruntime.HandleCrash() defer c.queue.ShutDown() - klog.Infof("Starting NamingConditionController") - defer klog.Infof("Shutting down NamingConditionController") + klog.Info("Starting NamingConditionController") + defer klog.Info("Shutting down NamingConditionController") if !cache.WaitForCacheSync(stopCh, c.crdSynced) { return diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/crdserverscheme/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/crdserverscheme/BUILD deleted file mode 100644 index ce6d2cf9e603..000000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/crdserverscheme/BUILD +++ /dev/null @@ -1,27 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["unstructured.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver/pkg/crdserverscheme", - importpath = "k8s.io/apiextensions-apiserver/pkg/crdserverscheme", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/generated/openapi/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/generated/openapi/BUILD deleted file mode 100644 index 473b65dc5523..000000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/generated/openapi/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load("//build:code_generation.bzl", "gen_openapi", "openapi_deps") -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -gen_openapi( - outs = ["zz_generated.openapi.go"], - output_pkg = "k8s.io/apiextensions-apiserver/pkg/generated/openapi", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "zz_generated.openapi.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver/pkg/generated/openapi", - importpath = "k8s.io/apiextensions-apiserver/pkg/generated/openapi", - deps = openapi_deps(), # keep -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/generated/openapi/zz_generated.openapi.go b/vendor/k8s.io/apiextensions-apiserver/pkg/generated/openapi/zz_generated.openapi.go index 4a1d1abd4470..24390d4f35c8 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/generated/openapi/zz_generated.openapi.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/generated/openapi/zz_generated.openapi.go @@ -56,11 +56,11 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "k8s.io/apimachinery/pkg/apis/meta/v1.APIResource": schema_pkg_apis_meta_v1_APIResource(ref), "k8s.io/apimachinery/pkg/apis/meta/v1.APIResourceList": schema_pkg_apis_meta_v1_APIResourceList(ref), "k8s.io/apimachinery/pkg/apis/meta/v1.APIVersions": schema_pkg_apis_meta_v1_APIVersions(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.ApplyOptions": schema_pkg_apis_meta_v1_ApplyOptions(ref), "k8s.io/apimachinery/pkg/apis/meta/v1.Condition": schema_pkg_apis_meta_v1_Condition(ref), "k8s.io/apimachinery/pkg/apis/meta/v1.CreateOptions": schema_pkg_apis_meta_v1_CreateOptions(ref), "k8s.io/apimachinery/pkg/apis/meta/v1.DeleteOptions": schema_pkg_apis_meta_v1_DeleteOptions(ref), "k8s.io/apimachinery/pkg/apis/meta/v1.Duration": schema_pkg_apis_meta_v1_Duration(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.ExportOptions": schema_pkg_apis_meta_v1_ExportOptions(ref), "k8s.io/apimachinery/pkg/apis/meta/v1.FieldsV1": schema_pkg_apis_meta_v1_FieldsV1(ref), "k8s.io/apimachinery/pkg/apis/meta/v1.GetOptions": schema_pkg_apis_meta_v1_GetOptions(ref), "k8s.io/apimachinery/pkg/apis/meta/v1.GroupKind": schema_pkg_apis_meta_v1_GroupKind(ref), @@ -1366,6 +1366,65 @@ func schema_pkg_apis_meta_v1_APIVersions(ref common.ReferenceCallback) common.Op } } +func schema_pkg_apis_meta_v1_ApplyOptions(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "ApplyOptions may be provided when applying an API object. FieldManager is required for apply requests. ApplyOptions is equivalent to PatchOptions. It is provided as a convenience with documentation that speaks specifically to how the options fields relate to apply.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "kind": { + SchemaProps: spec.SchemaProps{ + Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + Type: []string{"string"}, + Format: "", + }, + }, + "apiVersion": { + SchemaProps: spec.SchemaProps{ + Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + Type: []string{"string"}, + Format: "", + }, + }, + "dryRun": { + SchemaProps: spec.SchemaProps{ + Description: "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + "force": { + SchemaProps: spec.SchemaProps{ + Description: "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people.", + Default: false, + Type: []string{"boolean"}, + Format: "", + }, + }, + "fieldManager": { + SchemaProps: spec.SchemaProps{ + Description: "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required.", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + Required: []string{"force", "fieldManager"}, + }, + }, + } +} + func schema_pkg_apis_meta_v1_Condition(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -1560,50 +1619,6 @@ func schema_pkg_apis_meta_v1_Duration(ref common.ReferenceCallback) common.OpenA } } -func schema_pkg_apis_meta_v1_ExportOptions(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "ExportOptions is the query options to the standard REST get call. Deprecated. Planned for removal in 1.18.", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "kind": { - SchemaProps: spec.SchemaProps{ - Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", - Type: []string{"string"}, - Format: "", - }, - }, - "apiVersion": { - SchemaProps: spec.SchemaProps{ - Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", - Type: []string{"string"}, - Format: "", - }, - }, - "export": { - SchemaProps: spec.SchemaProps{ - Description: "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", - Default: false, - Type: []string{"boolean"}, - Format: "", - }, - }, - "exact": { - SchemaProps: spec.SchemaProps{ - Description: "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", - Default: false, - Type: []string{"boolean"}, - Format: "", - }, - }, - }, - Required: []string{"export", "exact"}, - }, - }, - } -} - func schema_pkg_apis_meta_v1_FieldsV1(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/BUILD deleted file mode 100644 index edd2afb9a362..000000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/BUILD +++ /dev/null @@ -1,92 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "etcd.go", - "status_strategy.go", - "strategy.go", - "validator.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource", - importpath = "k8s.io/apiextensions-apiserver/pkg/registry/customresource", - deps = [ - "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/listtype:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/objectmeta:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/validation/validate:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresource/tableconvertor:all-srcs", - ], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = [ - "etcd_test.go", - "status_strategy_test.go", - "strategy_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/crdserverscheme:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresource/tableconvertor:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/testing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/testing:go_default_library", - ], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/etcd.go b/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/etcd.go index a2e7557449a1..2b51d64c3c09 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/etcd.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/etcd.go @@ -31,6 +31,7 @@ import ( "k8s.io/apiserver/pkg/registry/generic" genericregistry "k8s.io/apiserver/pkg/registry/generic/registry" "k8s.io/apiserver/pkg/registry/rest" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // CustomResourceStorage includes dummy storage for CustomResources, and their Status and Scale subresources. @@ -92,9 +93,10 @@ func newREST(resource schema.GroupResource, kind, listKind schema.GroupVersionKi PredicateFunc: strategy.MatchCustomResourceDefinitionStorage, DefaultQualifiedResource: resource, - CreateStrategy: strategy, - UpdateStrategy: strategy, - DeleteStrategy: strategy, + CreateStrategy: strategy, + UpdateStrategy: strategy, + DeleteStrategy: strategy, + ResetFieldsStrategy: strategy, TableConvertor: tableConvertor, } @@ -104,7 +106,9 @@ func newREST(resource schema.GroupResource, kind, listKind schema.GroupVersionKi } statusStore := *store - statusStore.UpdateStrategy = NewStatusStrategy(strategy) + statusStrategy := NewStatusStrategy(strategy) + statusStore.UpdateStrategy = statusStrategy + statusStore.ResetFieldsStrategy = statusStrategy return &REST{store, categories}, &StatusREST{store: &statusStore} } @@ -199,6 +203,11 @@ func (r *StatusREST) Update(ctx context.Context, name string, objInfo rest.Updat return r.store.Update(ctx, name, objInfo, createValidation, updateValidation, false, options) } +// GetResetFields implements rest.ResetFieldsStrategy +func (r *StatusREST) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + return r.store.GetResetFields() +} + type ScaleREST struct { store *genericregistry.Store specReplicasPath string diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/status_strategy.go b/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/status_strategy.go index b31b627039fa..a2ff535187b5 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/status_strategy.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/status_strategy.go @@ -22,6 +22,7 @@ import ( "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) type statusStrategy struct { @@ -32,6 +33,26 @@ func NewStatusStrategy(strategy customResourceStrategy) statusStrategy { return statusStrategy{strategy} } +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (a statusStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + fields := map[fieldpath.APIVersion]*fieldpath.Set{ + fieldpath.APIVersion(a.customResourceStrategy.kind.GroupVersion().String()): fieldpath.NewSet( + // Note that if there are other top level fields unique to CRDs, + // those will also get removed by the apiserver prior to persisting, + // but wont be added to the resetFields set. + + // This isn't an issue now, but if it becomes an issue in the future + // we might need a mechanism that is the inverse of resetFields where + // you specify only the fields to be kept rather than the fields to be wiped + // that way you could wipe everything but the status in this case. + fieldpath.MakePathOrDie("spec"), + ), + } + + return fields +} + func (a statusStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object) { // update is only allowed to set status newCustomResourceObject := obj.(*unstructured.Unstructured) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/strategy.go b/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/strategy.go index a65595dc141c..3025a605f091 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/strategy.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/strategy.go @@ -36,6 +36,7 @@ import ( structuralschema "k8s.io/apiextensions-apiserver/pkg/apiserver/schema" structurallisttype "k8s.io/apiextensions-apiserver/pkg/apiserver/schema/listtype" schemaobjectmeta "k8s.io/apiextensions-apiserver/pkg/apiserver/schema/objectmeta" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // customResourceStrategy implements behavior for CustomResources. @@ -48,6 +49,7 @@ type customResourceStrategy struct { structuralSchemas map[string]*structuralschema.Structural status *apiextensions.CustomResourceSubresourceStatus scale *apiextensions.CustomResourceSubresourceScale + kind schema.GroupVersionKind } func NewStrategy(typer runtime.ObjectTyper, namespaceScoped bool, kind schema.GroupVersionKind, schemaValidator, statusSchemaValidator *validate.SchemaValidator, structuralSchemas map[string]*structuralschema.Structural, status *apiextensions.CustomResourceSubresourceStatus, scale *apiextensions.CustomResourceSubresourceScale) customResourceStrategy { @@ -64,6 +66,7 @@ func NewStrategy(typer runtime.ObjectTyper, namespaceScoped bool, kind schema.Gr statusSchemaValidator: statusSchemaValidator, }, structuralSchemas: structuralSchemas, + kind: kind, } } @@ -71,6 +74,20 @@ func (a customResourceStrategy) NamespaceScoped() bool { return a.namespaceScoped } +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (a customResourceStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + fields := map[fieldpath.APIVersion]*fieldpath.Set{} + + if a.status != nil { + fields[fieldpath.APIVersion(a.kind.GroupVersion().String())] = fieldpath.NewSet( + fieldpath.MakePathOrDie("status"), + ) + } + + return fields +} + // PrepareForCreate clears the status of a CustomResource before creation. func (a customResourceStrategy) PrepareForCreate(ctx context.Context, obj runtime.Object) { if a.status != nil { diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/tableconvertor/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/tableconvertor/BUILD deleted file mode 100644 index 01cdba16bc90..000000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/tableconvertor/BUILD +++ /dev/null @@ -1,46 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["tableconvertor.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/tableconvertor", - importpath = "k8s.io/apiextensions-apiserver/pkg/registry/customresource/tableconvertor", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta/table:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/client-go/util/jsonpath:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["tableconvertor_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/client-go/util/jsonpath:go_default_library", - ], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/BUILD deleted file mode 100644 index 1429d3d384d3..000000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/BUILD +++ /dev/null @@ -1,61 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "etcd.go", - "strategy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition", - importpath = "k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition", - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/errors:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/dryrun:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["strategy_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/etcd.go b/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/etcd.go index be857ecd2fe1..2eb7a246399d 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/etcd.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/etcd.go @@ -30,6 +30,7 @@ import ( "k8s.io/apiserver/pkg/storage" storageerr "k8s.io/apiserver/pkg/storage/errors" "k8s.io/apiserver/pkg/util/dryrun" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // rest implements a RESTStorage for API services against etcd @@ -47,9 +48,10 @@ func NewREST(scheme *runtime.Scheme, optsGetter generic.RESTOptionsGetter) (*RES PredicateFunc: MatchCustomResourceDefinition, DefaultQualifiedResource: apiextensions.Resource("customresourcedefinitions"), - CreateStrategy: strategy, - UpdateStrategy: strategy, - DeleteStrategy: strategy, + CreateStrategy: strategy, + UpdateStrategy: strategy, + DeleteStrategy: strategy, + ResetFieldsStrategy: strategy, // TODO: define table converter that exposes more than name/creation timestamp TableConvertor: rest.NewDefaultTableConvertor(apiextensions.Resource("customresourcedefinitions")), @@ -177,7 +179,9 @@ func NewStatusREST(scheme *runtime.Scheme, rest *REST) *StatusREST { statusStore := *rest.Store statusStore.CreateStrategy = nil statusStore.DeleteStrategy = nil - statusStore.UpdateStrategy = NewStatusStrategy(scheme) + statusStrategy := NewStatusStrategy(scheme) + statusStore.UpdateStrategy = statusStrategy + statusStore.ResetFieldsStrategy = statusStrategy return &StatusREST{store: &statusStore} } @@ -202,3 +206,8 @@ func (r *StatusREST) Update(ctx context.Context, name string, objInfo rest.Updat // subresources should never allow create on update. return r.store.Update(ctx, name, objInfo, createValidation, updateValidation, false, options) } + +// GetResetFields implements rest.ResetFieldsStrategy +func (r *StatusREST) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + return r.store.GetResetFields() +} diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/strategy.go b/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/strategy.go index 6702bcb6e690..e1ab194fb062 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/strategy.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/strategy.go @@ -23,6 +23,7 @@ import ( "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions" "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation" apiequality "k8s.io/apimachinery/pkg/api/equality" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" @@ -32,6 +33,7 @@ import ( "k8s.io/apiserver/pkg/registry/generic" "k8s.io/apiserver/pkg/storage" "k8s.io/apiserver/pkg/storage/names" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // strategy implements behavior for CustomResources. @@ -48,6 +50,21 @@ func (strategy) NamespaceScoped() bool { return false } +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (strategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + fields := map[fieldpath.APIVersion]*fieldpath.Set{ + "apiextensions.k8s.io/v1": fieldpath.NewSet( + fieldpath.MakePathOrDie("status"), + ), + "apiextensions.k8s.io/v1beta1": fieldpath.NewSet( + fieldpath.MakePathOrDie("status"), + ), + } + + return fields +} + // PrepareForCreate clears the status of a CustomResourceDefinition before creation. func (strategy) PrepareForCreate(ctx context.Context, obj runtime.Object) { crd := obj.(*apiextensions.CustomResourceDefinition) @@ -140,18 +157,30 @@ func (statusStrategy) NamespaceScoped() bool { return false } +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (statusStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + fields := map[fieldpath.APIVersion]*fieldpath.Set{ + "apiextensions.k8s.io/v1": fieldpath.NewSet( + fieldpath.MakePathOrDie("metadata"), + fieldpath.MakePathOrDie("spec"), + ), + "apiextensions.k8s.io/v1beta1": fieldpath.NewSet( + fieldpath.MakePathOrDie("metadata"), + fieldpath.MakePathOrDie("spec"), + ), + } + + return fields +} + func (statusStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object) { newObj := obj.(*apiextensions.CustomResourceDefinition) oldObj := old.(*apiextensions.CustomResourceDefinition) newObj.Spec = oldObj.Spec // Status updates are for only for updating status, not objectmeta. - // TODO: Update after ResetObjectMetaForStatus is added to meta/v1. - newObj.Labels = oldObj.Labels - newObj.Annotations = oldObj.Annotations - newObj.OwnerReferences = oldObj.OwnerReferences - newObj.Generation = oldObj.Generation - newObj.SelfLink = oldObj.SelfLink + metav1.ResetObjectMetaForStatus(&newObj.ObjectMeta, &newObj.ObjectMeta) } func (statusStrategy) AllowCreateOnUpdate() bool { diff --git a/vendor/k8s.io/apiextensions-apiserver/test/integration/BUILD b/vendor/k8s.io/apiextensions-apiserver/test/integration/BUILD deleted file mode 100644 index 48662e3149b2..000000000000 --- a/vendor/k8s.io/apiextensions-apiserver/test/integration/BUILD +++ /dev/null @@ -1,107 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "apiapproval_test.go", - "apply_test.go", - "basic_test.go", - "change_test.go", - "defaulting_test.go", - "deprecation_test.go", - "finalization_test.go", - "limit_test.go", - "listtype_test.go", - "objectmeta_test.go", - "pruning_test.go", - "registration_test.go", - "scope_test.go", - "subresources_test.go", - "table_test.go", - "validation_test.go", - "versioning_test.go", - "yaml_test.go", - ], - embed = [":go_default_library"], - tags = ["integration"], - deps = [ - "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/cmd/server/options:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/test/integration/fixtures:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/test/integration/storage:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/json:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/yaml:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/features:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/dynamic:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/util/retry:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - "//vendor/go.etcd.io/etcd/clientv3:go_default_library", - "//vendor/go.etcd.io/etcd/pkg/transport:go_default_library", - "//vendor/google.golang.org/grpc:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - "//vendor/sigs.k8s.io/yaml:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/test/integration/conversion:all-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/test/integration/fixtures:all-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/test/integration/storage:all-srcs", - ], - tags = ["automanaged"], -) - -go_library( - name = "go_default_library", - srcs = ["helpers.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver/test/integration", - importpath = "k8s.io/apiextensions-apiserver/test/integration", - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/client-go/dynamic:go_default_library", - ], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/test/integration/fixtures/BUILD b/vendor/k8s.io/apiextensions-apiserver/test/integration/fixtures/BUILD deleted file mode 100644 index 5a971f80c383..000000000000 --- a/vendor/k8s.io/apiextensions-apiserver/test/integration/fixtures/BUILD +++ /dev/null @@ -1,50 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "resources.go", - "server.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver/test/integration/fixtures", - importpath = "k8s.io/apiextensions-apiserver/test/integration/fixtures", - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/cmd/server/options:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/cmd/server/testing:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - "//staging/src/k8s.io/client-go/discovery:go_default_library", - "//staging/src/k8s.io/client-go/dynamic:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/restmapper:go_default_library", - "//staging/src/k8s.io/client-go/scale:go_default_library", - "//vendor/github.com/google/uuid:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/test/integration/fixtures/etcd.go b/vendor/k8s.io/apiextensions-apiserver/test/integration/fixtures/etcd.go new file mode 100644 index 000000000000..5dcedcf55f4c --- /dev/null +++ b/vendor/k8s.io/apiextensions-apiserver/test/integration/fixtures/etcd.go @@ -0,0 +1,55 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package fixtures + +import ( + "context" + "encoding/json" + "path" + + "go.etcd.io/etcd/clientv3" + apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" + apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" + "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + genericapirequest "k8s.io/apiserver/pkg/endpoints/request" + "k8s.io/client-go/dynamic" +) + +// CreateCRDUsingRemovedAPI creates a CRD directly using etcd. This is must *ONLY* be used for checks of compatibility +// with removed data. Do not use this just because you don't want to update your test to use v1. Only use this +// when it actually matters. +func CreateCRDUsingRemovedAPI(etcdClient *clientv3.Client, etcdStoragePrefix string, betaCRD *apiextensionsv1beta1.CustomResourceDefinition, apiExtensionsClient clientset.Interface, dynamicClientSet dynamic.Interface) (*apiextensionsv1.CustomResourceDefinition, error) { + // attempt defaulting, best effort + apiextensionsv1beta1.SetDefaults_CustomResourceDefinition(betaCRD) + betaCRD.Kind = "CustomResourceDefinition" + betaCRD.APIVersion = apiextensionsv1beta1.SchemeGroupVersion.Group + "/" + apiextensionsv1beta1.SchemeGroupVersion.Version + + ctx := genericapirequest.WithNamespace(genericapirequest.NewContext(), metav1.NamespaceNone) + key := path.Join("/", etcdStoragePrefix, "apiextensions.k8s.io", "customresourcedefinitions", betaCRD.Name) + val, _ := json.Marshal(betaCRD) + if _, err := etcdClient.Put(ctx, key, string(val)); err != nil { + return nil, err + } + + crd, err := apiExtensionsClient.ApiextensionsV1().CustomResourceDefinitions().Get(context.TODO(), betaCRD.Name, metav1.GetOptions{}) + if err != nil { + return nil, err + } + + return waitForCRDReady(crd, apiExtensionsClient, dynamicClientSet) +} diff --git a/vendor/k8s.io/apiextensions-apiserver/test/integration/fixtures/resources.go b/vendor/k8s.io/apiextensions-apiserver/test/integration/fixtures/resources.go index 9e723ad1eb5c..73dc41751e8a 100644 --- a/vendor/k8s.io/apiextensions-apiserver/test/integration/fixtures/resources.go +++ b/vendor/k8s.io/apiextensions-apiserver/test/integration/fixtures/resources.go @@ -24,7 +24,6 @@ import ( "k8s.io/utils/pointer" apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" - apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -44,6 +43,16 @@ const ( noxuInstanceNum int64 = 9223372036854775807 ) +// AllowAllSchema doesn't enforce any schema restrictions +func AllowAllSchema() *apiextensionsv1.CustomResourceValidation { + return &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ + XPreserveUnknownFields: pointer.BoolPtr(true), + Type: "object", + }, + } +} + // NewRandomNameV1CustomResourceDefinition generates a CRD with random name to avoid name conflict in e2e tests func NewRandomNameV1CustomResourceDefinition(scope apiextensionsv1.ResourceScope) *apiextensionsv1.CustomResourceDefinition { // ensure the singular doesn't end in an s for now @@ -57,12 +66,7 @@ func NewRandomNameV1CustomResourceDefinition(scope apiextensionsv1.ResourceScope Name: "v1beta1", Served: true, Storage: true, - Schema: &apiextensionsv1.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ - XPreserveUnknownFields: pointer.BoolPtr(true), - Type: "object", - }, - }, + Schema: AllowAllSchema(), }, }, Names: apiextensionsv1.CustomResourceDefinitionNames{ @@ -76,16 +80,35 @@ func NewRandomNameV1CustomResourceDefinition(scope apiextensionsv1.ResourceScope } } -// NewRandomNameCustomResourceDefinition generates a CRD with random name to avoid name conflict in e2e tests -func NewRandomNameCustomResourceDefinition(scope apiextensionsv1beta1.ResourceScope) *apiextensionsv1beta1.CustomResourceDefinition { +// NewRandomNameMultipleCustomResourceDefinition generates a multi version CRD with random name to avoid name conflict in e2e tests +func NewRandomNameMultipleVersionCustomResourceDefinition(scope apiextensionsv1.ResourceScope) *apiextensionsv1.CustomResourceDefinition { // ensure the singular doesn't end in an s for now gName := names.SimpleNameGenerator.GenerateName("foo") + "a" - return &apiextensionsv1beta1.CustomResourceDefinition{ + return &apiextensionsv1.CustomResourceDefinition{ ObjectMeta: metav1.ObjectMeta{Name: gName + "s.mygroup.example.com"}, - Spec: apiextensionsv1beta1.CustomResourceDefinitionSpec{ - Group: "mygroup.example.com", - Version: "v1beta1", - Names: apiextensionsv1beta1.CustomResourceDefinitionNames{ + Spec: apiextensionsv1.CustomResourceDefinitionSpec{ + Group: "mygroup.example.com", + Versions: []apiextensionsv1.CustomResourceDefinitionVersion{ + { + Name: "v1beta1", + Served: true, + Storage: false, + Subresources: &apiextensionsv1.CustomResourceSubresources{ + Status: &apiextensionsv1.CustomResourceSubresourceStatus{}, + }, + Schema: AllowAllSchema(), + }, + { + Name: "v1", + Served: true, + Storage: true, + Subresources: &apiextensionsv1.CustomResourceSubresources{ + Status: &apiextensionsv1.CustomResourceSubresourceStatus{}, + }, + Schema: AllowAllSchema(), + }, + }, + Names: apiextensionsv1.CustomResourceDefinitionNames{ Plural: gName + "s", Singular: gName, Kind: gName, @@ -96,26 +119,6 @@ func NewRandomNameCustomResourceDefinition(scope apiextensionsv1beta1.ResourceSc } } -// NewNoxuCustomResourceDefinition returns a WishIHadChosenNoxu CRD. -func NewNoxuCustomResourceDefinition(scope apiextensionsv1beta1.ResourceScope) *apiextensionsv1beta1.CustomResourceDefinition { - return &apiextensionsv1beta1.CustomResourceDefinition{ - ObjectMeta: metav1.ObjectMeta{Name: "noxus.mygroup.example.com"}, - Spec: apiextensionsv1beta1.CustomResourceDefinitionSpec{ - Group: "mygroup.example.com", - Version: "v1beta1", - Names: apiextensionsv1beta1.CustomResourceDefinitionNames{ - Plural: "noxus", - Singular: "nonenglishnoxu", - Kind: "WishIHadChosenNoxu", - ShortNames: []string{"foo", "bar", "abc", "def"}, - ListKind: "NoxuItemList", - Categories: []string{"all"}, - }, - Scope: scope, - }, - } -} - // NewNoxuV1CustomResourceDefinition returns a WishIHadChosenNoxu CRD. func NewNoxuV1CustomResourceDefinition(scope apiextensionsv1.ResourceScope) *apiextensionsv1.CustomResourceDefinition { return &apiextensionsv1.CustomResourceDefinition{ @@ -126,12 +129,7 @@ func NewNoxuV1CustomResourceDefinition(scope apiextensionsv1.ResourceScope) *api Name: "v1beta1", Served: true, Storage: true, - Schema: &apiextensionsv1.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ - XPreserveUnknownFields: pointer.BoolPtr(true), - Type: "object", - }, - }, + Schema: AllowAllSchema(), }}, Names: apiextensionsv1.CustomResourceDefinitionNames{ Plural: "noxus", @@ -173,13 +171,12 @@ func NewNoxuInstance(namespace, name string) *unstructured.Unstructured { } // NewMultipleVersionNoxuCRD returns a WishIHadChosenNoxu with multiple versions. -func NewMultipleVersionNoxuCRD(scope apiextensionsv1beta1.ResourceScope) *apiextensionsv1beta1.CustomResourceDefinition { - return &apiextensionsv1beta1.CustomResourceDefinition{ +func NewMultipleVersionNoxuCRD(scope apiextensionsv1.ResourceScope) *apiextensionsv1.CustomResourceDefinition { + return &apiextensionsv1.CustomResourceDefinition{ ObjectMeta: metav1.ObjectMeta{Name: "noxus.mygroup.example.com"}, - Spec: apiextensionsv1beta1.CustomResourceDefinitionSpec{ - Group: "mygroup.example.com", - Version: "v1beta1", - Names: apiextensionsv1beta1.CustomResourceDefinitionNames{ + Spec: apiextensionsv1.CustomResourceDefinitionSpec{ + Group: "mygroup.example.com", + Names: apiextensionsv1.CustomResourceDefinitionNames{ Plural: "noxus", Singular: "nonenglishnoxu", Kind: "WishIHadChosenNoxu", @@ -188,38 +185,52 @@ func NewMultipleVersionNoxuCRD(scope apiextensionsv1beta1.ResourceScope) *apiext Categories: []string{"all"}, }, Scope: scope, - Versions: []apiextensionsv1beta1.CustomResourceDefinitionVersion{ + Versions: []apiextensionsv1.CustomResourceDefinitionVersion{ { Name: "v1beta1", Served: true, Storage: false, + Subresources: &apiextensionsv1.CustomResourceSubresources{ + Status: &apiextensionsv1.CustomResourceSubresourceStatus{}, + }, + Schema: AllowAllSchema(), }, { Name: "v1beta2", Served: true, Storage: true, + Subresources: &apiextensionsv1.CustomResourceSubresources{ + Status: &apiextensionsv1.CustomResourceSubresourceStatus{}, + }, + Schema: AllowAllSchema(), }, { Name: "v0", Served: false, Storage: false, + Subresources: &apiextensionsv1.CustomResourceSubresources{ + Status: &apiextensionsv1.CustomResourceSubresourceStatus{}, + }, + Schema: AllowAllSchema(), }, }, - Subresources: &apiextensionsv1beta1.CustomResourceSubresources{ - Status: &apiextensionsv1beta1.CustomResourceSubresourceStatus{}, - }, }, } } // NewNoxu2CustomResourceDefinition returns a WishIHadChosenNoxu2 CRD. -func NewNoxu2CustomResourceDefinition(scope apiextensionsv1beta1.ResourceScope) *apiextensionsv1beta1.CustomResourceDefinition { - return &apiextensionsv1beta1.CustomResourceDefinition{ +func NewNoxu2CustomResourceDefinition(scope apiextensionsv1.ResourceScope) *apiextensionsv1.CustomResourceDefinition { + return &apiextensionsv1.CustomResourceDefinition{ ObjectMeta: metav1.ObjectMeta{Name: "noxus2.mygroup.example.com"}, - Spec: apiextensionsv1beta1.CustomResourceDefinitionSpec{ - Group: "mygroup.example.com", - Version: "v1alpha1", - Names: apiextensionsv1beta1.CustomResourceDefinitionNames{ + Spec: apiextensionsv1.CustomResourceDefinitionSpec{ + Group: "mygroup.example.com", + Versions: []apiextensionsv1.CustomResourceDefinitionVersion{{ + Name: "v1alpha1", + Served: true, + Storage: true, + Schema: AllowAllSchema(), + }}, + Names: apiextensionsv1.CustomResourceDefinitionNames{ Plural: "noxus2", Singular: "nonenglishnoxu2", Kind: "WishIHadChosenNoxu2", @@ -231,14 +242,21 @@ func NewNoxu2CustomResourceDefinition(scope apiextensionsv1beta1.ResourceScope) } } -// NewCurletCustomResourceDefinition returns a Curlet CRD. -func NewCurletCustomResourceDefinition(scope apiextensionsv1beta1.ResourceScope) *apiextensionsv1beta1.CustomResourceDefinition { - return &apiextensionsv1beta1.CustomResourceDefinition{ +// NewCurletV1CustomResourceDefinition returns a Curlet CRD. +func NewCurletV1CustomResourceDefinition(scope apiextensionsv1.ResourceScope) *apiextensionsv1.CustomResourceDefinition { + return &apiextensionsv1.CustomResourceDefinition{ ObjectMeta: metav1.ObjectMeta{Name: "curlets.mygroup.example.com"}, - Spec: apiextensionsv1beta1.CustomResourceDefinitionSpec{ - Group: "mygroup.example.com", - Version: "v1beta1", - Names: apiextensionsv1beta1.CustomResourceDefinitionNames{ + Spec: apiextensionsv1.CustomResourceDefinitionSpec{ + Group: "mygroup.example.com", + Versions: []apiextensionsv1.CustomResourceDefinitionVersion{ + { + Name: "v1beta1", + Served: true, + Storage: true, + Schema: AllowAllSchema(), + }, + }, + Names: apiextensionsv1.CustomResourceDefinitionNames{ Plural: "curlets", Singular: "curlet", Kind: "Curlet", @@ -266,19 +284,6 @@ func NewCurletInstance(namespace, name string) *unstructured.Unstructured { } } -func servedVersions(crd *apiextensionsv1beta1.CustomResourceDefinition) []string { - if len(crd.Spec.Versions) == 0 { - return []string{crd.Spec.Version} - } - var versions []string - for _, v := range crd.Spec.Versions { - if v.Served { - versions = append(versions, v.Name) - } - } - return versions -} - func servedV1Versions(crd *apiextensionsv1.CustomResourceDefinition) []string { if len(crd.Spec.Versions) == 0 { return []string{} @@ -292,22 +297,6 @@ func servedV1Versions(crd *apiextensionsv1.CustomResourceDefinition) []string { return versions } -func existsInDiscovery(crd *apiextensionsv1beta1.CustomResourceDefinition, apiExtensionsClient clientset.Interface, version string) (bool, error) { - groupResource, err := apiExtensionsClient.Discovery().ServerResourcesForGroupVersion(crd.Spec.Group + "/" + version) - if err != nil { - if errors.IsNotFound(err) { - return false, nil - } - return false, err - } - for _, g := range groupResource.APIResources { - if g.Name == crd.Spec.Names.Plural { - return true, nil - } - } - return false, nil -} - func existsInDiscoveryV1(crd *apiextensionsv1.CustomResourceDefinition, apiExtensionsClient clientset.Interface, version string) (bool, error) { groupResource, err := apiExtensionsClient.Discovery().ServerResourcesForGroupVersion(crd.Spec.Group + "/" + version) if err != nil { @@ -324,37 +313,27 @@ func existsInDiscoveryV1(crd *apiextensionsv1.CustomResourceDefinition, apiExten return false, nil } -// CreateNewCustomResourceDefinitionWatchUnsafe creates the CRD and makes sure +// waitForCRDReadyWatchUnsafe creates the CRD and makes sure // the apiextension apiserver has installed the CRD. But it's not safe to watch -// the created CR. Please call CreateNewCustomResourceDefinition if you need to +// the created CR. Please call CreateCRDUsingRemovedAPI if you need to // watch the CR. -func CreateNewCustomResourceDefinitionWatchUnsafe(crd *apiextensionsv1beta1.CustomResourceDefinition, apiExtensionsClient clientset.Interface) (*apiextensionsv1beta1.CustomResourceDefinition, error) { - crd, err := apiExtensionsClient.ApiextensionsV1beta1().CustomResourceDefinitions().Create(context.TODO(), crd, metav1.CreateOptions{}) - if err != nil { - return nil, err - } - +func waitForCRDReadyWatchUnsafe(crd *apiextensionsv1.CustomResourceDefinition, apiExtensionsClient clientset.Interface) (*apiextensionsv1.CustomResourceDefinition, error) { // wait until all resources appears in discovery - for _, version := range servedVersions(crd) { + for _, version := range servedV1Versions(crd) { err := wait.PollImmediate(500*time.Millisecond, 30*time.Second, func() (bool, error) { - return existsInDiscovery(crd, apiExtensionsClient, version) + return existsInDiscoveryV1(crd, apiExtensionsClient, version) }) if err != nil { return nil, err } } - return crd, err + return crd, nil } -// CreateNewCustomResourceDefinition creates the given CRD and makes sure its watch cache is primed on the server. -func CreateNewCustomResourceDefinition(crd *apiextensionsv1beta1.CustomResourceDefinition, apiExtensionsClient clientset.Interface, dynamicClientSet dynamic.Interface) (*apiextensionsv1beta1.CustomResourceDefinition, error) { - crd, err := CreateNewCustomResourceDefinitionWatchUnsafe(crd, apiExtensionsClient) - if err != nil { - return nil, err - } - - v1CRD, err := apiExtensionsClient.ApiextensionsV1().CustomResourceDefinitions().Get(context.TODO(), crd.Name, metav1.GetOptions{}) +// waitForCRDReady creates the given CRD and makes sure its watch cache is primed on the server. +func waitForCRDReady(crd *apiextensionsv1.CustomResourceDefinition, apiExtensionsClient clientset.Interface, dynamicClientSet dynamic.Interface) (*apiextensionsv1.CustomResourceDefinition, error) { + v1CRD, err := waitForCRDReadyWatchUnsafe(crd, apiExtensionsClient) if err != nil { return nil, err } @@ -375,7 +354,7 @@ func CreateNewCustomResourceDefinition(crd *apiextensionsv1beta1.CustomResourceD if err != nil { return nil, err } - return crd, nil + return v1CRD, err } // CreateNewV1CustomResourceDefinitionWatchUnsafe creates the CRD and makes sure @@ -439,7 +418,7 @@ func resourceClientForVersion(crd *apiextensionsv1.CustomResourceDefinition, dyn func isWatchCachePrimed(crd *apiextensionsv1.CustomResourceDefinition, dynamicClientSet dynamic.Interface) (bool, error) { ns := "" if crd.Spec.Scope != apiextensionsv1.ClusterScoped { - ns = "aval" + ns = "default" } versions := servedV1Versions(crd) @@ -506,23 +485,6 @@ func isWatchCachePrimed(crd *apiextensionsv1.CustomResourceDefinition, dynamicCl return true, nil } -// DeleteCustomResourceDefinition deletes a CRD and waits until it disappears from discovery. -func DeleteCustomResourceDefinition(crd *apiextensionsv1beta1.CustomResourceDefinition, apiExtensionsClient clientset.Interface) error { - if err := apiExtensionsClient.ApiextensionsV1beta1().CustomResourceDefinitions().Delete(context.TODO(), crd.Name, metav1.DeleteOptions{}); err != nil { - return err - } - for _, version := range servedVersions(crd) { - err := wait.PollImmediate(500*time.Millisecond, 30*time.Second, func() (bool, error) { - exists, err := existsInDiscovery(crd, apiExtensionsClient, version) - return !exists, err - }) - if err != nil { - return err - } - } - return nil -} - // DeleteV1CustomResourceDefinition deletes a CRD and waits until it disappears from discovery. func DeleteV1CustomResourceDefinition(crd *apiextensionsv1.CustomResourceDefinition, apiExtensionsClient clientset.Interface) error { if err := apiExtensionsClient.ApiextensionsV1().CustomResourceDefinitions().Delete(context.TODO(), crd.Name, metav1.DeleteOptions{}); err != nil { @@ -564,7 +526,7 @@ func DeleteV1CustomResourceDefinitions(deleteListOpts metav1.ListOptions, apiExt } // CreateNewVersionedScaleClient returns a scale client. -func CreateNewVersionedScaleClient(crd *apiextensionsv1beta1.CustomResourceDefinition, config *rest.Config, version string) (scale.ScalesGetter, error) { +func CreateNewVersionedScaleClient(crd *apiextensionsv1.CustomResourceDefinition, config *rest.Config, version string) (scale.ScalesGetter, error) { discoveryClient, err := discovery.NewDiscoveryClientForConfig(config) if err != nil { return nil, err diff --git a/vendor/k8s.io/apiextensions-apiserver/test/integration/fixtures/server.go b/vendor/k8s.io/apiextensions-apiserver/test/integration/fixtures/server.go index 63eaa80cc0f3..93dbea1697a1 100644 --- a/vendor/k8s.io/apiextensions-apiserver/test/integration/fixtures/server.go +++ b/vendor/k8s.io/apiextensions-apiserver/test/integration/fixtures/server.go @@ -20,9 +20,15 @@ import ( "io/ioutil" "os" "strings" + "time" "github.com/google/uuid" + "go.etcd.io/etcd/clientv3" + "go.etcd.io/etcd/pkg/transport" + "google.golang.org/grpc" "k8s.io/apiextensions-apiserver/pkg/cmd/server/options" + serveroptions "k8s.io/apiextensions-apiserver/pkg/cmd/server/options" + "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset" servertesting "k8s.io/apiextensions-apiserver/pkg/cmd/server/testing" @@ -103,6 +109,55 @@ func StartDefaultServerWithClients(t servertesting.Logger, extraFlags ...string) return tearDown, apiExtensionsClient, dynamicClient, nil } +// StartDefaultServerWithClientsAndEtcd starts a test server and returns clients for it. +func StartDefaultServerWithClientsAndEtcd(t servertesting.Logger, extraFlags ...string) (func(), clientset.Interface, dynamic.Interface, *clientv3.Client, string, error) { + tearDown, config, options, err := StartDefaultServer(t, extraFlags...) + if err != nil { + return nil, nil, nil, nil, "", err + } + + apiExtensionsClient, err := clientset.NewForConfig(config) + if err != nil { + tearDown() + return nil, nil, nil, nil, "", err + } + + dynamicClient, err := dynamic.NewForConfig(config) + if err != nil { + tearDown() + return nil, nil, nil, nil, "", err + } + + RESTOptionsGetter := serveroptions.NewCRDRESTOptionsGetter(*options.RecommendedOptions.Etcd) + restOptions, err := RESTOptionsGetter.GetRESTOptions(schema.GroupResource{Group: "hopefully-ignored-group", Resource: "hopefully-ignored-resources"}) + if err != nil { + return nil, nil, nil, nil, "", err + } + tlsInfo := transport.TLSInfo{ + CertFile: restOptions.StorageConfig.Transport.CertFile, + KeyFile: restOptions.StorageConfig.Transport.KeyFile, + TrustedCAFile: restOptions.StorageConfig.Transport.TrustedCAFile, + } + tlsConfig, err := tlsInfo.ClientConfig() + if err != nil { + return nil, nil, nil, nil, "", err + } + etcdConfig := clientv3.Config{ + Endpoints: restOptions.StorageConfig.Transport.ServerList, + DialTimeout: 20 * time.Second, + DialOptions: []grpc.DialOption{ + grpc.WithBlock(), // block until the underlying connection is up + }, + TLS: tlsConfig, + } + etcdclient, err := clientv3.New(etcdConfig) + if err != nil { + return nil, nil, nil, nil, "", err + } + + return tearDown, apiExtensionsClient, dynamicClient, etcdclient, restOptions.StorageConfig.Prefix, nil +} + // IntegrationEtcdServers returns etcd server URLs. func IntegrationEtcdServers() []string { if etcdURL, ok := os.LookupEnv("KUBE_INTEGRATION_ETCD_URL"); ok { diff --git a/vendor/k8s.io/apiextensions-apiserver/test/integration/helpers.go b/vendor/k8s.io/apiextensions-apiserver/test/integration/helpers.go index c53a8669cbb4..59134f7768ca 100644 --- a/vendor/k8s.io/apiextensions-apiserver/test/integration/helpers.go +++ b/vendor/k8s.io/apiextensions-apiserver/test/integration/helpers.go @@ -22,7 +22,6 @@ import ( "testing" apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" - apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset" "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/meta" @@ -34,11 +33,11 @@ import ( var swaggerMetadataDescriptions = metav1.ObjectMeta{}.SwaggerDoc() -func instantiateCustomResource(t *testing.T, instanceToCreate *unstructured.Unstructured, client dynamic.ResourceInterface, definition *apiextensionsv1beta1.CustomResourceDefinition) (*unstructured.Unstructured, error) { +func instantiateCustomResource(t *testing.T, instanceToCreate *unstructured.Unstructured, client dynamic.ResourceInterface, definition *apiextensionsv1.CustomResourceDefinition) (*unstructured.Unstructured, error) { return instantiateVersionedCustomResource(t, instanceToCreate, client, definition, definition.Spec.Versions[0].Name) } -func instantiateVersionedCustomResource(t *testing.T, instanceToCreate *unstructured.Unstructured, client dynamic.ResourceInterface, definition *apiextensionsv1beta1.CustomResourceDefinition, version string) (*unstructured.Unstructured, error) { +func instantiateVersionedCustomResource(t *testing.T, instanceToCreate *unstructured.Unstructured, client dynamic.ResourceInterface, definition *apiextensionsv1.CustomResourceDefinition, version string) (*unstructured.Unstructured, error) { createdInstance, err := client.Create(context.TODO(), instanceToCreate, metav1.CreateOptions{}) if err != nil { t.Logf("%#v", createdInstance) @@ -65,28 +64,28 @@ func instantiateVersionedCustomResource(t *testing.T, instanceToCreate *unstruct return createdInstance, nil } -func newNamespacedCustomResourceVersionedClient(ns string, client dynamic.Interface, crd *apiextensionsv1beta1.CustomResourceDefinition, version string) dynamic.ResourceInterface { +func newNamespacedCustomResourceVersionedClient(ns string, client dynamic.Interface, crd *apiextensionsv1.CustomResourceDefinition, version string) dynamic.ResourceInterface { gvr := schema.GroupVersionResource{Group: crd.Spec.Group, Version: version, Resource: crd.Spec.Names.Plural} - if crd.Spec.Scope != apiextensionsv1beta1.ClusterScoped { + if crd.Spec.Scope != apiextensionsv1.ClusterScoped { return client.Resource(gvr).Namespace(ns) } return client.Resource(gvr) } -func newNamespacedCustomResourceClient(ns string, client dynamic.Interface, crd *apiextensionsv1beta1.CustomResourceDefinition) dynamic.ResourceInterface { +func newNamespacedCustomResourceClient(ns string, client dynamic.Interface, crd *apiextensionsv1.CustomResourceDefinition) dynamic.ResourceInterface { return newNamespacedCustomResourceVersionedClient(ns, client, crd, crd.Spec.Versions[0].Name) } // UpdateCustomResourceDefinitionWithRetry updates a CRD, retrying up to 5 times on version conflict errors. -func UpdateCustomResourceDefinitionWithRetry(client clientset.Interface, name string, update func(*apiextensionsv1beta1.CustomResourceDefinition)) (*apiextensionsv1beta1.CustomResourceDefinition, error) { +func UpdateCustomResourceDefinitionWithRetry(client clientset.Interface, name string, update func(*apiextensionsv1.CustomResourceDefinition)) (*apiextensionsv1.CustomResourceDefinition, error) { for i := 0; i < 5; i++ { - crd, err := client.ApiextensionsV1beta1().CustomResourceDefinitions().Get(context.TODO(), name, metav1.GetOptions{}) + crd, err := client.ApiextensionsV1().CustomResourceDefinitions().Get(context.TODO(), name, metav1.GetOptions{}) if err != nil { return nil, fmt.Errorf("failed to get CustomResourceDefinition %q: %v", name, err) } update(crd) - crd, err = client.ApiextensionsV1beta1().CustomResourceDefinitions().Update(context.TODO(), crd, metav1.UpdateOptions{}) + crd, err = client.ApiextensionsV1().CustomResourceDefinitions().Update(context.TODO(), crd, metav1.UpdateOptions{}) if err == nil { return crd, nil } @@ -117,13 +116,7 @@ func UpdateV1CustomResourceDefinitionWithRetry(client clientset.Interface, name } // getSchemaForVersion returns the validation schema for given version in given CRD. -func getSchemaForVersion(crd *apiextensionsv1beta1.CustomResourceDefinition, version string) (*apiextensionsv1beta1.CustomResourceValidation, error) { - if !hasPerVersionSchema(crd.Spec.Versions) { - return crd.Spec.Validation, nil - } - if crd.Spec.Validation != nil { - return nil, fmt.Errorf("malformed CustomResourceDefinition %s version %s: top-level and per-version schemas must be mutual exclusive", crd.Name, version) - } +func getSchemaForVersion(crd *apiextensionsv1.CustomResourceDefinition, version string) (*apiextensionsv1.CustomResourceValidation, error) { for _, v := range crd.Spec.Versions { if version == v.Name { return v.Schema, nil @@ -133,13 +126,7 @@ func getSchemaForVersion(crd *apiextensionsv1beta1.CustomResourceDefinition, ver } // getSubresourcesForVersion returns the subresources for given version in given CRD. -func getSubresourcesForVersion(crd *apiextensionsv1beta1.CustomResourceDefinition, version string) (*apiextensionsv1beta1.CustomResourceSubresources, error) { - if !hasPerVersionSubresources(crd.Spec.Versions) { - return crd.Spec.Subresources, nil - } - if crd.Spec.Subresources != nil { - return nil, fmt.Errorf("malformed CustomResourceDefinition %s version %s: top-level and per-version subresources must be mutual exclusive", crd.Name, version) - } +func getSubresourcesForVersion(crd *apiextensionsv1.CustomResourceDefinition, version string) (*apiextensionsv1.CustomResourceSubresources, error) { for _, v := range crd.Spec.Versions { if version == v.Name { return v.Subresources, nil @@ -152,13 +139,7 @@ func getSubresourcesForVersion(crd *apiextensionsv1beta1.CustomResourceDefinitio // NOTE: the newly logically-defaulted columns is not pointing to the original CRD object. // One cannot mutate the original CRD columns using the logically-defaulted columns. Please iterate through // the original CRD object instead. -func getColumnsForVersion(crd *apiextensionsv1beta1.CustomResourceDefinition, version string) ([]apiextensionsv1beta1.CustomResourceColumnDefinition, error) { - if !hasPerVersionColumns(crd.Spec.Versions) { - return serveDefaultColumnsIfEmpty(crd.Spec.AdditionalPrinterColumns), nil - } - if len(crd.Spec.AdditionalPrinterColumns) > 0 { - return nil, fmt.Errorf("malformed CustomResourceDefinition %s version %s: top-level and per-version additionalPrinterColumns must be mutual exclusive", crd.Name, version) - } +func getColumnsForVersion(crd *apiextensionsv1.CustomResourceDefinition, version string) ([]apiextensionsv1.CustomResourceColumnDefinition, error) { for _, v := range crd.Spec.Versions { if version == v.Name { return serveDefaultColumnsIfEmpty(v.AdditionalPrinterColumns), nil @@ -171,41 +152,11 @@ func getColumnsForVersion(crd *apiextensionsv1beta1.CustomResourceDefinition, ve // NOTE: in this way, the newly logically-defaulted columns is not pointing to the original CRD object. // One cannot mutate the original CRD columns using the logically-defaulted columns. Please iterate through // the original CRD object instead. -func serveDefaultColumnsIfEmpty(columns []apiextensionsv1beta1.CustomResourceColumnDefinition) []apiextensionsv1beta1.CustomResourceColumnDefinition { +func serveDefaultColumnsIfEmpty(columns []apiextensionsv1.CustomResourceColumnDefinition) []apiextensionsv1.CustomResourceColumnDefinition { if len(columns) > 0 { return columns } - return []apiextensionsv1beta1.CustomResourceColumnDefinition{ + return []apiextensionsv1.CustomResourceColumnDefinition{ {Name: "Age", Type: "date", Description: swaggerMetadataDescriptions["creationTimestamp"], JSONPath: ".metadata.creationTimestamp"}, } } - -// hasPerVersionSchema returns true if a CRD uses per-version schema. -func hasPerVersionSchema(versions []apiextensionsv1beta1.CustomResourceDefinitionVersion) bool { - for _, v := range versions { - if v.Schema != nil { - return true - } - } - return false -} - -// hasPerVersionSubresources returns true if a CRD uses per-version subresources. -func hasPerVersionSubresources(versions []apiextensionsv1beta1.CustomResourceDefinitionVersion) bool { - for _, v := range versions { - if v.Subresources != nil { - return true - } - } - return false -} - -// hasPerVersionColumns returns true if a CRD uses per-version columns. -func hasPerVersionColumns(versions []apiextensionsv1beta1.CustomResourceDefinitionVersion) bool { - for _, v := range versions { - if len(v.AdditionalPrinterColumns) > 0 { - return true - } - } - return false -} diff --git a/vendor/k8s.io/apimachinery/pkg/api/apitesting/BUILD b/vendor/k8s.io/apimachinery/pkg/api/apitesting/BUILD deleted file mode 100644 index 6144d9be6e45..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/api/apitesting/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["codec.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/api/apitesting", - importpath = "k8s.io/apimachinery/pkg/api/apitesting", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/recognizer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apimachinery/pkg/api/apitesting/fuzzer:all-srcs", - "//staging/src/k8s.io/apimachinery/pkg/api/apitesting/naming:all-srcs", - "//staging/src/k8s.io/apimachinery/pkg/api/apitesting/roundtrip:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/api/equality/BUILD b/vendor/k8s.io/apimachinery/pkg/api/equality/BUILD deleted file mode 100644 index d526b508acf9..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/api/equality/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["semantic.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/api/equality", - importpath = "k8s.io/apimachinery/pkg/api/equality", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/api/errors/BUILD b/vendor/k8s.io/apimachinery/pkg/api/errors/BUILD deleted file mode 100644 index 865a64fc583d..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/api/errors/BUILD +++ /dev/null @@ -1,48 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["errors_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "errors.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/api/errors", - importpath = "k8s.io/apimachinery/pkg/api/errors", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/api/errors/OWNERS b/vendor/k8s.io/apimachinery/pkg/api/errors/OWNERS index d18a17885b60..4ba4022b6ea5 100644 --- a/vendor/k8s.io/apimachinery/pkg/api/errors/OWNERS +++ b/vendor/k8s.io/apimachinery/pkg/api/errors/OWNERS @@ -11,8 +11,6 @@ reviewers: - caesarxuchao - mikedanese - liggitt -- nikhiljindal -- gmarek - erictune - saad-ali - janetkuo diff --git a/vendor/k8s.io/apimachinery/pkg/api/meta/BUILD b/vendor/k8s.io/apimachinery/pkg/api/meta/BUILD deleted file mode 100644 index 9d8aa0c2454d..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/api/meta/BUILD +++ /dev/null @@ -1,72 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "conditions_test.go", - "meta_test.go", - "multirestmapper_test.go", - "priority_test.go", - "restmapper_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//vendor/github.com/google/gofuzz:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "conditions.go", - "doc.go", - "errors.go", - "firsthit_restmapper.go", - "help.go", - "interfaces.go", - "lazy.go", - "meta.go", - "multirestmapper.go", - "priority.go", - "restmapper.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/api/meta", - importpath = "k8s.io/apimachinery/pkg/api/meta", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apimachinery/pkg/api/meta/table:all-srcs", - "//staging/src/k8s.io/apimachinery/pkg/api/meta/testrestmapper:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/api/meta/OWNERS b/vendor/k8s.io/apimachinery/pkg/api/meta/OWNERS index 68b8d353ca90..f929e061d2d7 100644 --- a/vendor/k8s.io/apimachinery/pkg/api/meta/OWNERS +++ b/vendor/k8s.io/apimachinery/pkg/api/meta/OWNERS @@ -10,12 +10,9 @@ reviewers: - caesarxuchao - mikedanese - liggitt -- nikhiljindal -- gmarek - janetkuo - ncdc - dims - krousey - resouer - mfojtik -- jianhuiz diff --git a/vendor/k8s.io/apimachinery/pkg/api/meta/conditions.go b/vendor/k8s.io/apimachinery/pkg/api/meta/conditions.go index 343a6f550e96..00874f89cc68 100644 --- a/vendor/k8s.io/apimachinery/pkg/api/meta/conditions.go +++ b/vendor/k8s.io/apimachinery/pkg/api/meta/conditions.go @@ -57,7 +57,7 @@ func SetStatusCondition(conditions *[]metav1.Condition, newCondition metav1.Cond // RemoveStatusCondition removes the corresponding conditionType from conditions. // conditions must be non-nil. func RemoveStatusCondition(conditions *[]metav1.Condition, conditionType string) { - if conditions == nil { + if conditions == nil || len(*conditions) == 0 { return } newConditions := make([]metav1.Condition, 0, len(*conditions)-1) diff --git a/vendor/k8s.io/apimachinery/pkg/api/meta/table/BUILD b/vendor/k8s.io/apimachinery/pkg/api/meta/table/BUILD deleted file mode 100644 index ed0ee956fbc8..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/api/meta/table/BUILD +++ /dev/null @@ -1,29 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["table.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/api/meta/table", - importpath = "k8s.io/apimachinery/pkg/api/meta/table", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/duration:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/api/resource/BUILD b/vendor/k8s.io/apimachinery/pkg/api/resource/BUILD deleted file mode 100644 index eb1ba72a5526..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/api/resource/BUILD +++ /dev/null @@ -1,57 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "amount_test.go", - "math_test.go", - "quantity_example_test.go", - "quantity_proto_test.go", - "quantity_test.go", - "scale_int_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//vendor/github.com/google/gofuzz:go_default_library", - "//vendor/gopkg.in/inf.v0:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "amount.go", - "generated.pb.go", - "math.go", - "quantity.go", - "quantity_proto.go", - "scale_int.go", - "suffix.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/api/resource", - importpath = "k8s.io/apimachinery/pkg/api/resource", - deps = [ - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/gopkg.in/inf.v0:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/api/resource/OWNERS b/vendor/k8s.io/apimachinery/pkg/api/resource/OWNERS index 7ac0fe11a1fa..15bded17af86 100644 --- a/vendor/k8s.io/apimachinery/pkg/api/resource/OWNERS +++ b/vendor/k8s.io/apimachinery/pkg/api/resource/OWNERS @@ -10,4 +10,3 @@ reviewers: - saad-ali - janetkuo - xiang90 -- mbohlool diff --git a/vendor/k8s.io/apimachinery/pkg/api/resource/quantity_proto.go b/vendor/k8s.io/apimachinery/pkg/api/resource/quantity_proto.go index f89ca163cd39..3e0cdb10d409 100644 --- a/vendor/k8s.io/apimachinery/pkg/api/resource/quantity_proto.go +++ b/vendor/k8s.io/apimachinery/pkg/api/resource/quantity_proto.go @@ -166,7 +166,7 @@ func (m *Quantity) Unmarshal(data []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/apimachinery/pkg/api/validation/BUILD b/vendor/k8s.io/apimachinery/pkg/api/validation/BUILD deleted file mode 100644 index a1942396d8d5..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/api/validation/BUILD +++ /dev/null @@ -1,54 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["objectmeta_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generic.go", - "objectmeta.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/api/validation", - importpath = "k8s.io/apimachinery/pkg/api/validation", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apimachinery/pkg/api/validation/path:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/api/validation/objectmeta.go b/vendor/k8s.io/apimachinery/pkg/api/validation/objectmeta.go index 889ec69aab86..3e234eb11dca 100644 --- a/vendor/k8s.io/apimachinery/pkg/api/validation/objectmeta.go +++ b/vendor/k8s.io/apimachinery/pkg/api/validation/objectmeta.go @@ -180,9 +180,7 @@ func ValidateObjectMetaAccessor(meta metav1.Object, requiresNamespace bool, name allErrs = append(allErrs, field.Invalid(fldPath.Child("clusterName"), meta.GetClusterName(), msg)) } } - for _, entry := range meta.GetManagedFields() { - allErrs = append(allErrs, v1validation.ValidateFieldManager(entry.Manager, fldPath.Child("fieldManager"))...) - } + allErrs = append(allErrs, ValidateNonnegativeField(meta.GetGeneration(), fldPath.Child("generation"))...) allErrs = append(allErrs, v1validation.ValidateLabels(meta.GetLabels(), fldPath.Child("labels"))...) allErrs = append(allErrs, ValidateAnnotations(meta.GetAnnotations(), fldPath.Child("annotations"))...) @@ -248,9 +246,6 @@ func ValidateObjectMetaAccessorUpdate(newMeta, oldMeta metav1.Object, fldPath *f allErrs = append(allErrs, field.Invalid(fldPath.Child("generation"), newMeta.GetGeneration(), "must not be decremented")) } - for _, entry := range newMeta.GetManagedFields() { - allErrs = append(allErrs, v1validation.ValidateFieldManager(entry.Manager, fldPath.Child("fieldManager"))...) - } allErrs = append(allErrs, ValidateImmutableField(newMeta.GetName(), oldMeta.GetName(), fldPath.Child("name"))...) allErrs = append(allErrs, ValidateImmutableField(newMeta.GetNamespace(), oldMeta.GetNamespace(), fldPath.Child("namespace"))...) allErrs = append(allErrs, ValidateImmutableField(newMeta.GetUID(), oldMeta.GetUID(), fldPath.Child("uid"))...) diff --git a/vendor/k8s.io/apimachinery/pkg/api/validation/path/BUILD b/vendor/k8s.io/apimachinery/pkg/api/validation/path/BUILD deleted file mode 100644 index 0bd49a4841fc..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/api/validation/path/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["name_test.go"], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = ["name.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/api/validation/path", - importpath = "k8s.io/apimachinery/pkg/api/validation/path", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/BUILD b/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/BUILD deleted file mode 100644 index ffd176b28a78..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "types.go", - "zz_generated.conversion.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion", - importpath = "k8s.io/apimachinery/pkg/apis/meta/internalversion", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/internalversion/scheme:all-srcs", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/internalversion/validation:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/register.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/register.go index ae39b74eb243..a59ac71268b7 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/register.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/register.go @@ -52,7 +52,6 @@ func addToGroupVersion(scheme *runtime.Scheme) error { scheme.AddKnownTypes(SchemeGroupVersion, &ListOptions{}, &metav1.GetOptions{}, - &metav1.ExportOptions{}, &metav1.DeleteOptions{}, &metav1.CreateOptions{}, &metav1.UpdateOptions{}, diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/scheme/BUILD b/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/scheme/BUILD deleted file mode 100644 index 53e7cd79c908..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/scheme/BUILD +++ /dev/null @@ -1,48 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/scheme", - importpath = "k8s.io/apimachinery/pkg/apis/meta/internalversion/scheme", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = [ - "register_test.go", - "roundtrip_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/apitesting/roundtrip:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/fuzzer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - ], -) diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/validation/BUILD b/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/validation/BUILD deleted file mode 100644 index f18b5418e915..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/validation/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["validation.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/validation", - importpath = "k8s.io/apimachinery/pkg/apis/meta/internalversion/validation", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["validation_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/BUILD b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/BUILD deleted file mode 100644 index 16eb6d304c3f..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/BUILD +++ /dev/null @@ -1,98 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "controller_ref_test.go", - "conversion_test.go", - "duration_test.go", - "group_version_test.go", - "helpers_test.go", - "labels_test.go", - "micro_time_test.go", - "options_test.go", - "time_test.go", - "types_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/json:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//vendor/github.com/google/gofuzz:go_default_library", - "//vendor/sigs.k8s.io/yaml:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "controller_ref.go", - "conversion.go", - "deepcopy.go", - "doc.go", - "duration.go", - "generated.pb.go", - "group_version.go", - "helpers.go", - "labels.go", - "meta.go", - "micro_time.go", - "micro_time_fuzz.go", - "micro_time_proto.go", - "register.go", - "time.go", - "time_fuzz.go", - "time_proto.go", - "types.go", - "types_swagger_doc_generated.go", - "watch.go", - "zz_generated.conversion.go", - "zz_generated.deepcopy.go", - "zz_generated.defaults.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/apis/meta/v1", - importpath = "k8s.io/apimachinery/pkg/apis/meta/v1", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/selection:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - "//vendor/github.com/google/gofuzz:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:all-srcs", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/validation:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/OWNERS b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/OWNERS index 40018601c08a..579af62ba76a 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/OWNERS +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/OWNERS @@ -8,8 +8,6 @@ reviewers: - brendandburns - caesarxuchao - liggitt -- nikhiljindal -- gmarek - erictune - davidopp - sttts @@ -20,11 +18,8 @@ reviewers: - ncdc - soltysh - dims -- madhusudancs - hongchaodeng - krousey - mml -- mbohlool - therc - kevin-wangzefeng -- jianhuiz diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.pb.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.pb.go index e74a51099d25..7eec2a6e2de9 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.pb.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.pb.go @@ -189,10 +189,38 @@ func (m *APIVersions) XXX_DiscardUnknown() { var xxx_messageInfo_APIVersions proto.InternalMessageInfo +func (m *ApplyOptions) Reset() { *m = ApplyOptions{} } +func (*ApplyOptions) ProtoMessage() {} +func (*ApplyOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_cf52fa777ced5367, []int{5} +} +func (m *ApplyOptions) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ApplyOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ApplyOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_ApplyOptions.Merge(m, src) +} +func (m *ApplyOptions) XXX_Size() int { + return m.Size() +} +func (m *ApplyOptions) XXX_DiscardUnknown() { + xxx_messageInfo_ApplyOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_ApplyOptions proto.InternalMessageInfo + func (m *Condition) Reset() { *m = Condition{} } func (*Condition) ProtoMessage() {} func (*Condition) Descriptor() ([]byte, []int) { - return fileDescriptor_cf52fa777ced5367, []int{5} + return fileDescriptor_cf52fa777ced5367, []int{6} } func (m *Condition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -220,7 +248,7 @@ var xxx_messageInfo_Condition proto.InternalMessageInfo func (m *CreateOptions) Reset() { *m = CreateOptions{} } func (*CreateOptions) ProtoMessage() {} func (*CreateOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_cf52fa777ced5367, []int{6} + return fileDescriptor_cf52fa777ced5367, []int{7} } func (m *CreateOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -248,7 +276,7 @@ var xxx_messageInfo_CreateOptions proto.InternalMessageInfo func (m *DeleteOptions) Reset() { *m = DeleteOptions{} } func (*DeleteOptions) ProtoMessage() {} func (*DeleteOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_cf52fa777ced5367, []int{7} + return fileDescriptor_cf52fa777ced5367, []int{8} } func (m *DeleteOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -276,7 +304,7 @@ var xxx_messageInfo_DeleteOptions proto.InternalMessageInfo func (m *Duration) Reset() { *m = Duration{} } func (*Duration) ProtoMessage() {} func (*Duration) Descriptor() ([]byte, []int) { - return fileDescriptor_cf52fa777ced5367, []int{8} + return fileDescriptor_cf52fa777ced5367, []int{9} } func (m *Duration) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -301,34 +329,6 @@ func (m *Duration) XXX_DiscardUnknown() { var xxx_messageInfo_Duration proto.InternalMessageInfo -func (m *ExportOptions) Reset() { *m = ExportOptions{} } -func (*ExportOptions) ProtoMessage() {} -func (*ExportOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_cf52fa777ced5367, []int{9} -} -func (m *ExportOptions) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ExportOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (m *ExportOptions) XXX_Merge(src proto.Message) { - xxx_messageInfo_ExportOptions.Merge(m, src) -} -func (m *ExportOptions) XXX_Size() int { - return m.Size() -} -func (m *ExportOptions) XXX_DiscardUnknown() { - xxx_messageInfo_ExportOptions.DiscardUnknown(m) -} - -var xxx_messageInfo_ExportOptions proto.InternalMessageInfo - func (m *FieldsV1) Reset() { *m = FieldsV1{} } func (*FieldsV1) ProtoMessage() {} func (*FieldsV1) Descriptor() ([]byte, []int) { @@ -1277,11 +1277,11 @@ func init() { proto.RegisterType((*APIResource)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.APIResource") proto.RegisterType((*APIResourceList)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.APIResourceList") proto.RegisterType((*APIVersions)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.APIVersions") + proto.RegisterType((*ApplyOptions)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.ApplyOptions") proto.RegisterType((*Condition)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.Condition") proto.RegisterType((*CreateOptions)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.CreateOptions") proto.RegisterType((*DeleteOptions)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.DeleteOptions") proto.RegisterType((*Duration)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.Duration") - proto.RegisterType((*ExportOptions)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.ExportOptions") proto.RegisterType((*FieldsV1)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.FieldsV1") proto.RegisterType((*GetOptions)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.GetOptions") proto.RegisterType((*GroupKind)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.GroupKind") @@ -1326,184 +1326,183 @@ func init() { } var fileDescriptor_cf52fa777ced5367 = []byte{ - // 2832 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x1a, 0xcd, 0x6f, 0x23, 0x57, - 0x3d, 0x63, 0xc7, 0x89, 0xfd, 0x73, 0x9c, 0x8f, 0xb7, 0x59, 0xf0, 0x06, 0x11, 0xa7, 0x53, 0xb4, - 0xda, 0x42, 0xeb, 0x34, 0x4b, 0xa9, 0xb6, 0x5b, 0x5a, 0x88, 0xe3, 0x64, 0x1b, 0x9a, 0x34, 0xd1, - 0xcb, 0xee, 0x02, 0xa5, 0x42, 0x9d, 0x78, 0x5e, 0x9c, 0x21, 0xe3, 0x19, 0xf7, 0xbd, 0x71, 0xb2, - 0x86, 0x03, 0x3d, 0x80, 0x00, 0x09, 0xaa, 0x1e, 0x11, 0x07, 0xd4, 0x0a, 0xfe, 0x02, 0x2e, 0xf0, - 0x07, 0x20, 0xd1, 0x63, 0x25, 0x2e, 0x95, 0x40, 0x56, 0x37, 0x1c, 0x38, 0x22, 0xae, 0xb9, 0x80, - 0xde, 0xc7, 0xcc, 0xbc, 0xf1, 0xc7, 0x66, 0xdc, 0x2d, 0x15, 0x37, 0xcf, 0xef, 0xfb, 0xbd, 0xf7, - 0x7b, 0xbf, 0xaf, 0x67, 0xd8, 0x3d, 0xb9, 0xc5, 0xaa, 0x8e, 0xbf, 0x7a, 0xd2, 0x39, 0x24, 0xd4, - 0x23, 0x01, 0x61, 0xab, 0xa7, 0xc4, 0xb3, 0x7d, 0xba, 0xaa, 0x10, 0x56, 0xdb, 0x69, 0x59, 0x8d, - 0x63, 0xc7, 0x23, 0xb4, 0xbb, 0xda, 0x3e, 0x69, 0x72, 0x00, 0x5b, 0x6d, 0x91, 0xc0, 0x5a, 0x3d, - 0x5d, 0x5b, 0x6d, 0x12, 0x8f, 0x50, 0x2b, 0x20, 0x76, 0xb5, 0x4d, 0xfd, 0xc0, 0x47, 0x5f, 0x92, - 0x5c, 0x55, 0x9d, 0xab, 0xda, 0x3e, 0x69, 0x72, 0x00, 0xab, 0x72, 0xae, 0xea, 0xe9, 0xda, 0xd2, - 0x33, 0x4d, 0x27, 0x38, 0xee, 0x1c, 0x56, 0x1b, 0x7e, 0x6b, 0xb5, 0xe9, 0x37, 0xfd, 0x55, 0xc1, - 0x7c, 0xd8, 0x39, 0x12, 0x5f, 0xe2, 0x43, 0xfc, 0x92, 0x42, 0x97, 0x46, 0x9a, 0x42, 0x3b, 0x5e, - 0xe0, 0xb4, 0x48, 0xbf, 0x15, 0x4b, 0xcf, 0x5f, 0xc6, 0xc0, 0x1a, 0xc7, 0xa4, 0x65, 0xf5, 0xf3, - 0x99, 0x7f, 0xc9, 0x42, 0x7e, 0x7d, 0x7f, 0xfb, 0x0e, 0xf5, 0x3b, 0x6d, 0xb4, 0x02, 0x93, 0x9e, - 0xd5, 0x22, 0x65, 0x63, 0xc5, 0xb8, 0x51, 0xa8, 0xcd, 0x7c, 0xd0, 0xab, 0x4c, 0x9c, 0xf7, 0x2a, - 0x93, 0xaf, 0x59, 0x2d, 0x82, 0x05, 0x06, 0xb9, 0x90, 0x3f, 0x25, 0x94, 0x39, 0xbe, 0xc7, 0xca, - 0x99, 0x95, 0xec, 0x8d, 0xe2, 0xcd, 0x97, 0xab, 0x69, 0xd6, 0x5f, 0x15, 0x0a, 0xee, 0x4b, 0xd6, - 0x2d, 0x9f, 0xd6, 0x1d, 0xd6, 0xf0, 0x4f, 0x09, 0xed, 0xd6, 0xe6, 0x95, 0x96, 0xbc, 0x42, 0x32, - 0x1c, 0x69, 0x40, 0x3f, 0x31, 0x60, 0xbe, 0x4d, 0xc9, 0x11, 0xa1, 0x94, 0xd8, 0x0a, 0x5f, 0xce, - 0xae, 0x18, 0x9f, 0x82, 0xda, 0xb2, 0x52, 0x3b, 0xbf, 0xdf, 0x27, 0x1f, 0x0f, 0x68, 0x44, 0xbf, - 0x33, 0x60, 0x89, 0x11, 0x7a, 0x4a, 0xe8, 0xba, 0x6d, 0x53, 0xc2, 0x58, 0xad, 0xbb, 0xe1, 0x3a, - 0xc4, 0x0b, 0x36, 0xb6, 0xeb, 0x98, 0x95, 0x27, 0xc5, 0x3e, 0x7c, 0x23, 0x9d, 0x41, 0x07, 0xa3, - 0xe4, 0xd4, 0x4c, 0x65, 0xd1, 0xd2, 0x48, 0x12, 0x86, 0x1f, 0x61, 0x86, 0x79, 0x04, 0x33, 0xe1, - 0x41, 0xee, 0x38, 0x2c, 0x40, 0xf7, 0x61, 0xaa, 0xc9, 0x3f, 0x58, 0xd9, 0x10, 0x06, 0x56, 0xd3, - 0x19, 0x18, 0xca, 0xa8, 0xcd, 0x2a, 0x7b, 0xa6, 0xc4, 0x27, 0xc3, 0x4a, 0x9a, 0xf9, 0x8b, 0x49, - 0x28, 0xae, 0xef, 0x6f, 0x63, 0xc2, 0xfc, 0x0e, 0x6d, 0x90, 0x14, 0x4e, 0x73, 0x0b, 0x66, 0x98, - 0xe3, 0x35, 0x3b, 0xae, 0x45, 0x39, 0xb4, 0x3c, 0x25, 0x28, 0x17, 0x15, 0xe5, 0xcc, 0x81, 0x86, - 0xc3, 0x09, 0x4a, 0x74, 0x13, 0x80, 0x4b, 0x60, 0x6d, 0xab, 0x41, 0xec, 0x72, 0x66, 0xc5, 0xb8, - 0x91, 0xaf, 0x21, 0xc5, 0x07, 0xaf, 0x45, 0x18, 0xac, 0x51, 0xa1, 0x27, 0x21, 0x27, 0x2c, 0x2d, - 0xe7, 0x85, 0x9a, 0x92, 0x22, 0xcf, 0x89, 0x65, 0x60, 0x89, 0x43, 0x4f, 0xc1, 0xb4, 0xf2, 0xb2, - 0x72, 0x41, 0x90, 0xcd, 0x29, 0xb2, 0xe9, 0xd0, 0x0d, 0x42, 0x3c, 0x5f, 0xdf, 0x89, 0xe3, 0xd9, - 0xc2, 0xef, 0xb4, 0xf5, 0xbd, 0xea, 0x78, 0x36, 0x16, 0x18, 0xb4, 0x03, 0xb9, 0x53, 0x42, 0x0f, - 0xb9, 0x27, 0x70, 0xd7, 0xfc, 0x4a, 0xba, 0x8d, 0xbe, 0xcf, 0x59, 0x6a, 0x05, 0x6e, 0x9a, 0xf8, - 0x89, 0xa5, 0x10, 0x54, 0x05, 0x60, 0xc7, 0x3e, 0x0d, 0xc4, 0xf2, 0xca, 0xb9, 0x95, 0xec, 0x8d, - 0x42, 0x6d, 0x96, 0xaf, 0xf7, 0x20, 0x82, 0x62, 0x8d, 0x82, 0xd3, 0x37, 0xac, 0x80, 0x34, 0x7d, - 0xea, 0x10, 0x56, 0x9e, 0x8e, 0xe9, 0x37, 0x22, 0x28, 0xd6, 0x28, 0xd0, 0xb7, 0x00, 0xb1, 0xc0, - 0xa7, 0x56, 0x93, 0xa8, 0xa5, 0xbe, 0x62, 0xb1, 0xe3, 0x32, 0x88, 0xd5, 0x2d, 0xa9, 0xd5, 0xa1, - 0x83, 0x01, 0x0a, 0x3c, 0x84, 0xcb, 0xfc, 0x83, 0x01, 0x73, 0x9a, 0x2f, 0x08, 0xbf, 0xbb, 0x05, - 0x33, 0x4d, 0xed, 0xd6, 0x29, 0xbf, 0x88, 0x4e, 0x5b, 0xbf, 0x91, 0x38, 0x41, 0x89, 0x08, 0x14, - 0xa8, 0x92, 0x14, 0x46, 0x97, 0xb5, 0xd4, 0x4e, 0x1b, 0xda, 0x10, 0x6b, 0xd2, 0x80, 0x0c, 0xc7, - 0x92, 0xcd, 0x7f, 0x1a, 0xc2, 0x81, 0xc3, 0x78, 0x83, 0x6e, 0x68, 0x31, 0xcd, 0x10, 0xdb, 0x37, - 0x33, 0x22, 0x1e, 0x5d, 0x12, 0x08, 0x32, 0xff, 0x17, 0x81, 0xe0, 0x76, 0xfe, 0xd7, 0xef, 0x55, - 0x26, 0xde, 0xfe, 0xfb, 0xca, 0x84, 0xf9, 0x9f, 0x0c, 0x14, 0x36, 0x7c, 0xcf, 0x76, 0x02, 0xe5, - 0xc8, 0x41, 0xb7, 0x3d, 0x70, 0x51, 0xef, 0x76, 0xdb, 0x04, 0x0b, 0x0c, 0x7a, 0x01, 0xa6, 0x58, - 0x60, 0x05, 0x1d, 0x26, 0xae, 0x5a, 0xa1, 0xf6, 0x44, 0x18, 0x02, 0x0e, 0x04, 0xf4, 0xa2, 0x57, - 0x99, 0x8b, 0xc4, 0x49, 0x10, 0x56, 0x0c, 0xdc, 0xab, 0xfc, 0x43, 0x61, 0x94, 0x7d, 0x47, 0xa6, - 0x98, 0x30, 0x56, 0x67, 0x63, 0xaf, 0xda, 0x1b, 0xa0, 0xc0, 0x43, 0xb8, 0xd0, 0x29, 0x20, 0xd7, - 0x62, 0xc1, 0x5d, 0x6a, 0x79, 0x4c, 0xe8, 0xba, 0xeb, 0xb4, 0x88, 0xba, 0x5c, 0x5f, 0x4e, 0xb7, - 0xbb, 0x9c, 0x23, 0xd6, 0xbb, 0x33, 0x20, 0x0d, 0x0f, 0xd1, 0x80, 0xae, 0xc3, 0x14, 0x25, 0x16, - 0xf3, 0xbd, 0x72, 0x4e, 0x2c, 0x3f, 0x8a, 0x80, 0x58, 0x40, 0xb1, 0xc2, 0xf2, 0xe0, 0xd1, 0x22, - 0x8c, 0x59, 0xcd, 0x30, 0x94, 0x45, 0xc1, 0x63, 0x57, 0x82, 0x71, 0x88, 0x37, 0x5b, 0x50, 0xda, - 0xa0, 0xc4, 0x0a, 0xc8, 0x5e, 0x3b, 0x10, 0x2e, 0x64, 0xc2, 0x94, 0x4d, 0xbb, 0xb8, 0xe3, 0x29, - 0x57, 0x03, 0x2e, 0xbf, 0x2e, 0x20, 0x58, 0x61, 0xf8, 0x0d, 0x3a, 0x72, 0x88, 0x6b, 0xef, 0x5a, - 0x9e, 0xd5, 0x24, 0x54, 0x45, 0x9e, 0xc8, 0xaf, 0xb7, 0x34, 0x1c, 0x4e, 0x50, 0x9a, 0x3f, 0xcb, - 0x42, 0xa9, 0x4e, 0x5c, 0x12, 0xeb, 0xdb, 0x02, 0xd4, 0xa4, 0x56, 0x83, 0xec, 0x13, 0xea, 0xf8, - 0xf6, 0x01, 0x69, 0xf8, 0x9e, 0xcd, 0x84, 0x0b, 0x64, 0x6b, 0x9f, 0xe3, 0x7b, 0x73, 0x67, 0x00, - 0x8b, 0x87, 0x70, 0x20, 0x17, 0x4a, 0x6d, 0x2a, 0x7e, 0x8b, 0xfd, 0x92, 0x1e, 0x52, 0xbc, 0xf9, - 0xd5, 0x74, 0xc7, 0xb1, 0xaf, 0xb3, 0xd6, 0x16, 0xce, 0x7b, 0x95, 0x52, 0x02, 0x84, 0x93, 0xc2, - 0xd1, 0x37, 0x61, 0xde, 0xa7, 0xed, 0x63, 0xcb, 0xab, 0x93, 0x36, 0xf1, 0x6c, 0xe2, 0x05, 0x4c, - 0xec, 0x42, 0xbe, 0xb6, 0xc8, 0x73, 0xf6, 0x5e, 0x1f, 0x0e, 0x0f, 0x50, 0xa3, 0xd7, 0x61, 0xa1, - 0x4d, 0xfd, 0xb6, 0xd5, 0x14, 0x2e, 0xb5, 0xef, 0xbb, 0x4e, 0xa3, 0x2b, 0x5c, 0xa8, 0x50, 0x7b, - 0xfa, 0xbc, 0x57, 0x59, 0xd8, 0xef, 0x47, 0x5e, 0xf4, 0x2a, 0x57, 0xc4, 0xd6, 0x71, 0x48, 0x8c, - 0xc4, 0x83, 0x62, 0xb4, 0x33, 0xcc, 0x8d, 0x3a, 0x43, 0x73, 0x1b, 0xf2, 0xf5, 0x8e, 0xf2, 0xe7, - 0x97, 0x20, 0x6f, 0xab, 0xdf, 0x6a, 0xe7, 0xc3, 0x8b, 0x15, 0xd1, 0x5c, 0xf4, 0x2a, 0x25, 0x5e, - 0xa6, 0x55, 0x43, 0x00, 0x8e, 0x58, 0xcc, 0x37, 0xa0, 0xb4, 0xf9, 0xa0, 0xed, 0xd3, 0x20, 0x3c, - 0xd3, 0xeb, 0x30, 0x45, 0x04, 0x40, 0x48, 0xcb, 0xc7, 0x7e, 0x2a, 0xc9, 0xb0, 0xc2, 0xf2, 0x4c, - 0x48, 0x1e, 0x58, 0x8d, 0x40, 0x25, 0xce, 0x28, 0x13, 0x6e, 0x72, 0x20, 0x96, 0x38, 0xf3, 0x3a, - 0xe4, 0x85, 0x43, 0xb1, 0xfb, 0x6b, 0x68, 0x1e, 0xb2, 0xd8, 0x3a, 0x13, 0x52, 0x67, 0x70, 0x96, - 0x5a, 0x67, 0x5a, 0x2c, 0xd9, 0x03, 0xb8, 0x43, 0x22, 0x13, 0xd6, 0x61, 0x2e, 0x0c, 0xa8, 0xc9, - 0x38, 0xff, 0x79, 0xa5, 0x64, 0x0e, 0x27, 0xd1, 0xb8, 0x9f, 0xde, 0x7c, 0x03, 0x0a, 0x22, 0x17, - 0xf0, 0x44, 0x1a, 0x27, 0x6d, 0xe3, 0x11, 0x49, 0x3b, 0xcc, 0xc4, 0x99, 0x51, 0x99, 0x58, 0x33, - 0xd7, 0x85, 0x92, 0xe4, 0x0d, 0xcb, 0x94, 0x54, 0x1a, 0x9e, 0x86, 0x7c, 0x68, 0xa6, 0xd2, 0x12, - 0x95, 0xa7, 0xa1, 0x20, 0x1c, 0x51, 0x68, 0xda, 0x8e, 0x21, 0x91, 0xd7, 0xd2, 0x29, 0xd3, 0x6a, - 0x90, 0xcc, 0xa3, 0x6b, 0x10, 0x4d, 0xd3, 0x8f, 0xa1, 0x3c, 0xaa, 0xa6, 0x7d, 0x8c, 0xcc, 0x9b, - 0xde, 0x14, 0xf3, 0x1d, 0x03, 0xe6, 0x75, 0x49, 0xe9, 0x8f, 0x2f, 0xbd, 0x92, 0xcb, 0x6b, 0x2e, - 0x6d, 0x47, 0x7e, 0x6b, 0xc0, 0x62, 0x62, 0x69, 0x63, 0x9d, 0xf8, 0x18, 0x46, 0xe9, 0xce, 0x91, - 0x1d, 0xc3, 0x39, 0xfe, 0x9a, 0x81, 0xd2, 0x8e, 0x75, 0x48, 0xdc, 0x03, 0xe2, 0x92, 0x46, 0xe0, - 0x53, 0xf4, 0x23, 0x28, 0xb6, 0xac, 0xa0, 0x71, 0x2c, 0xa0, 0x61, 0x7d, 0x5e, 0x4f, 0x17, 0x4a, - 0x13, 0x92, 0xaa, 0xbb, 0xb1, 0x98, 0x4d, 0x2f, 0xa0, 0xdd, 0xda, 0x15, 0x65, 0x52, 0x51, 0xc3, - 0x60, 0x5d, 0x9b, 0x68, 0xaa, 0xc4, 0xf7, 0xe6, 0x83, 0x36, 0x2f, 0x1e, 0xc6, 0xef, 0xe5, 0x12, - 0x26, 0x60, 0xf2, 0x56, 0xc7, 0xa1, 0xa4, 0x45, 0xbc, 0x20, 0x6e, 0xaa, 0x76, 0xfb, 0xe4, 0xe3, - 0x01, 0x8d, 0x4b, 0x2f, 0xc3, 0x7c, 0xbf, 0xf1, 0x3c, 0xfe, 0x9c, 0x90, 0xae, 0x3c, 0x2f, 0xcc, - 0x7f, 0xa2, 0x45, 0xc8, 0x9d, 0x5a, 0x6e, 0x47, 0xdd, 0x46, 0x2c, 0x3f, 0x6e, 0x67, 0x6e, 0x19, - 0xe6, 0xef, 0x0d, 0x28, 0x8f, 0x32, 0x04, 0x7d, 0x51, 0x13, 0x54, 0x2b, 0x2a, 0xab, 0xb2, 0xaf, - 0x92, 0xae, 0x94, 0xba, 0x09, 0x79, 0xbf, 0xcd, 0xab, 0x0d, 0x9f, 0xaa, 0x53, 0x7f, 0x2a, 0x3c, - 0xc9, 0x3d, 0x05, 0xbf, 0xe8, 0x55, 0xae, 0x26, 0xc4, 0x87, 0x08, 0x1c, 0xb1, 0xf2, 0x3c, 0x20, - 0xec, 0xe1, 0xb9, 0x29, 0xca, 0x03, 0xf7, 0x05, 0x04, 0x2b, 0x8c, 0xf9, 0x27, 0x03, 0x26, 0x45, - 0x59, 0xfc, 0x06, 0xe4, 0xf9, 0xfe, 0xd9, 0x56, 0x60, 0x09, 0xbb, 0x52, 0x37, 0x64, 0x9c, 0x7b, - 0x97, 0x04, 0x56, 0xec, 0x6d, 0x21, 0x04, 0x47, 0x12, 0x11, 0x86, 0x9c, 0x13, 0x90, 0x56, 0x78, - 0x90, 0xcf, 0x8c, 0x14, 0xad, 0xc6, 0x01, 0x55, 0x6c, 0x9d, 0x6d, 0x3e, 0x08, 0x88, 0xc7, 0x0f, - 0x23, 0xbe, 0x1a, 0xdb, 0x5c, 0x06, 0x96, 0xa2, 0xcc, 0x7f, 0x1b, 0x10, 0xa9, 0xe2, 0xce, 0xcf, - 0x88, 0x7b, 0xb4, 0xe3, 0x78, 0x27, 0x6a, 0x5b, 0x23, 0x73, 0x0e, 0x14, 0x1c, 0x47, 0x14, 0xc3, - 0xd2, 0x43, 0x66, 0xbc, 0xf4, 0xc0, 0x15, 0x36, 0x7c, 0x2f, 0x70, 0xbc, 0xce, 0xc0, 0x6d, 0xdb, - 0x50, 0x70, 0x1c, 0x51, 0xf0, 0x32, 0x87, 0x92, 0x96, 0xe5, 0x78, 0x8e, 0xd7, 0xe4, 0x8b, 0xd8, - 0xf0, 0x3b, 0x5e, 0x20, 0xf2, 0xbd, 0x2a, 0x73, 0xf0, 0x00, 0x16, 0x0f, 0xe1, 0x30, 0xff, 0x38, - 0x09, 0x45, 0xbe, 0xe6, 0x30, 0xcf, 0xbd, 0x08, 0x25, 0x57, 0xf7, 0x02, 0xb5, 0xf6, 0xab, 0xca, - 0x94, 0xe4, 0xbd, 0xc6, 0x49, 0x5a, 0xce, 0x2c, 0xaa, 0xb3, 0x88, 0x39, 0x93, 0x64, 0xde, 0xd2, - 0x91, 0x38, 0x49, 0xcb, 0xa3, 0xd7, 0x19, 0xbf, 0x1f, 0xaa, 0xee, 0x89, 0x8e, 0xe8, 0xdb, 0x1c, - 0x88, 0x25, 0x0e, 0xed, 0xc2, 0x15, 0xcb, 0x75, 0xfd, 0x33, 0x01, 0xac, 0xf9, 0xfe, 0x49, 0xcb, - 0xa2, 0x27, 0x4c, 0xb4, 0xb4, 0xf9, 0xda, 0x17, 0x14, 0xcb, 0x95, 0xf5, 0x41, 0x12, 0x3c, 0x8c, - 0x6f, 0xd8, 0xb1, 0x4d, 0x8e, 0x79, 0x6c, 0xc7, 0xb0, 0xd8, 0x07, 0x12, 0xb7, 0x5c, 0xf5, 0x97, - 0xcf, 0x29, 0x39, 0x8b, 0x78, 0x08, 0xcd, 0xc5, 0x08, 0x38, 0x1e, 0x2a, 0x11, 0xdd, 0x86, 0x59, - 0xee, 0xc9, 0x7e, 0x27, 0x08, 0xab, 0xda, 0x9c, 0x38, 0x6e, 0x74, 0xde, 0xab, 0xcc, 0xde, 0x4d, - 0x60, 0x70, 0x1f, 0x25, 0xdf, 0x5c, 0xd7, 0x69, 0x39, 0x41, 0x79, 0x5a, 0xb0, 0x44, 0x9b, 0xbb, - 0xc3, 0x81, 0x58, 0xe2, 0x12, 0x1e, 0x98, 0xbf, 0xcc, 0x03, 0xcd, 0xdf, 0x64, 0x01, 0xc9, 0x32, - 0xdc, 0x96, 0xf5, 0x94, 0x0c, 0x69, 0xbc, 0x57, 0x50, 0x65, 0xbc, 0xd1, 0xd7, 0x2b, 0xa8, 0x0a, - 0x3e, 0xc4, 0xa3, 0x5d, 0x28, 0xc8, 0xd0, 0x12, 0x5f, 0x97, 0x55, 0x45, 0x5c, 0xd8, 0x0b, 0x11, - 0x17, 0xbd, 0xca, 0x52, 0x42, 0x4d, 0x84, 0x11, 0x7d, 0x5c, 0x2c, 0x01, 0xdd, 0x04, 0xb0, 0xda, - 0x8e, 0x3e, 0x35, 0x2b, 0xc4, 0xb3, 0x93, 0xb8, 0xff, 0xc5, 0x1a, 0x15, 0x7a, 0x05, 0x26, 0x83, - 0x4f, 0xd6, 0x6b, 0xe5, 0x45, 0x2b, 0xc9, 0x3b, 0x2b, 0x21, 0x81, 0x6b, 0x17, 0xfe, 0xcc, 0xb8, - 0x59, 0xaa, 0x4d, 0x8a, 0xb4, 0x6f, 0x45, 0x18, 0xac, 0x51, 0xa1, 0xef, 0x40, 0xfe, 0x48, 0x95, - 0xa2, 0xe2, 0x60, 0x52, 0x87, 0xc8, 0xb0, 0x80, 0x95, 0x8d, 0x7b, 0xf8, 0x85, 0x23, 0x69, 0xe6, - 0x5b, 0x50, 0xd8, 0x75, 0x1a, 0xd4, 0x17, 0x6d, 0xde, 0x53, 0x30, 0xcd, 0x12, 0x7d, 0x50, 0x74, - 0x24, 0xa1, 0xbb, 0x84, 0x78, 0xee, 0x27, 0x9e, 0xe5, 0xf9, 0xb2, 0xdb, 0xc9, 0xc5, 0x7e, 0xf2, - 0x1a, 0x07, 0x62, 0x89, 0xbb, 0xbd, 0xc8, 0x33, 0xfd, 0xcf, 0xdf, 0xaf, 0x4c, 0xbc, 0xfb, 0x7e, - 0x65, 0xe2, 0xbd, 0xf7, 0x55, 0xd6, 0xbf, 0x00, 0x80, 0xbd, 0xc3, 0x1f, 0x90, 0x86, 0x8c, 0x9f, - 0xa9, 0xa6, 0x64, 0xe1, 0x70, 0x56, 0x4c, 0xc9, 0x32, 0x7d, 0xd5, 0x9b, 0x86, 0xc3, 0x09, 0x4a, - 0xb4, 0x0a, 0x85, 0x68, 0xfe, 0xa5, 0x0e, 0x7a, 0x21, 0x74, 0x9c, 0x68, 0x48, 0x86, 0x63, 0x9a, - 0x44, 0x30, 0x9f, 0xbc, 0x34, 0x98, 0xd7, 0x20, 0xdb, 0x71, 0x6c, 0xd5, 0x13, 0x3f, 0x1b, 0x26, - 0xd3, 0x7b, 0xdb, 0xf5, 0x8b, 0x5e, 0xe5, 0x89, 0x51, 0x63, 0xe7, 0xa0, 0xdb, 0x26, 0xac, 0x7a, - 0x6f, 0xbb, 0x8e, 0x39, 0xf3, 0xb0, 0xc8, 0x32, 0x35, 0x66, 0x64, 0xb9, 0x09, 0xd0, 0x8c, 0x27, - 0x0b, 0xf2, 0xe2, 0x46, 0x1e, 0xa5, 0x4d, 0x14, 0x34, 0x2a, 0xc4, 0x60, 0xa1, 0xc1, 0xdb, 0x6f, - 0xd5, 0xe1, 0xb3, 0xc0, 0x6a, 0xc9, 0xb9, 0xe0, 0x78, 0xce, 0x7d, 0x4d, 0xa9, 0x59, 0xd8, 0xe8, - 0x17, 0x86, 0x07, 0xe5, 0x23, 0x1f, 0x16, 0x6c, 0xd5, 0x48, 0xc6, 0x4a, 0x0b, 0x63, 0x2b, 0xbd, - 0xca, 0x15, 0xd6, 0xfb, 0x05, 0xe1, 0x41, 0xd9, 0xe8, 0xfb, 0xb0, 0x14, 0x02, 0x07, 0xbb, 0x79, - 0x11, 0x79, 0xb3, 0xb5, 0xe5, 0xf3, 0x5e, 0x65, 0xa9, 0x3e, 0x92, 0x0a, 0x3f, 0x42, 0x02, 0xb2, - 0x61, 0xca, 0x95, 0x95, 0x6a, 0x51, 0x54, 0x17, 0x5f, 0x4f, 0xb7, 0x8a, 0xd8, 0xfb, 0xab, 0x7a, - 0x85, 0x1a, 0x75, 0xab, 0xaa, 0x38, 0x55, 0xb2, 0xd1, 0x03, 0x28, 0x5a, 0x9e, 0xe7, 0x07, 0x96, - 0x9c, 0x2f, 0xcc, 0x08, 0x55, 0xeb, 0x63, 0xab, 0x5a, 0x8f, 0x65, 0xf4, 0x55, 0xc4, 0x1a, 0x06, - 0xeb, 0xaa, 0xd0, 0x19, 0xcc, 0xf9, 0x67, 0x1e, 0xa1, 0x98, 0x1c, 0x11, 0x4a, 0xbc, 0x06, 0x61, - 0xe5, 0x92, 0xd0, 0xfe, 0x5c, 0x4a, 0xed, 0x09, 0xe6, 0xd8, 0xa5, 0x93, 0x70, 0x86, 0xfb, 0xb5, - 0xa0, 0x2a, 0x0f, 0x92, 0x9e, 0xe5, 0x3a, 0x3f, 0x24, 0x94, 0x95, 0x67, 0xe3, 0xd1, 0xed, 0x56, - 0x04, 0xc5, 0x1a, 0x05, 0xfa, 0x1a, 0x14, 0x1b, 0x6e, 0x87, 0x05, 0x44, 0xce, 0xd1, 0xe7, 0xc4, - 0x0d, 0x8a, 0xd6, 0xb7, 0x11, 0xa3, 0xb0, 0x4e, 0x87, 0x3a, 0x50, 0x6a, 0xe9, 0x29, 0xa3, 0xbc, - 0x20, 0x56, 0x77, 0x2b, 0xdd, 0xea, 0x06, 0x93, 0x5a, 0x5c, 0xc1, 0x24, 0x70, 0x38, 0xa9, 0x65, - 0xe9, 0x05, 0x28, 0x7e, 0xc2, 0xe2, 0x9e, 0x37, 0x07, 0xfd, 0xe7, 0x38, 0x56, 0x73, 0xf0, 0xe7, - 0x0c, 0xcc, 0x26, 0x77, 0xbf, 0x2f, 0x1d, 0xe6, 0x52, 0xa5, 0xc3, 0xb0, 0x0d, 0x35, 0x46, 0x8e, - 0xfe, 0xc3, 0xb0, 0x9e, 0x1d, 0x19, 0xd6, 0x55, 0xf4, 0x9c, 0x7c, 0x9c, 0xe8, 0x59, 0x05, 0xe0, - 0x75, 0x06, 0xf5, 0x5d, 0x97, 0x50, 0x11, 0x38, 0xf3, 0x6a, 0xc4, 0x1f, 0x41, 0xb1, 0x46, 0xc1, - 0xab, 0xe1, 0x43, 0xd7, 0x6f, 0x9c, 0x88, 0x2d, 0x08, 0x2f, 0xbd, 0x08, 0x99, 0x79, 0x59, 0x0d, - 0xd7, 0x06, 0xb0, 0x78, 0x08, 0x87, 0xd9, 0x85, 0xab, 0xfb, 0x16, 0x0d, 0x1c, 0xcb, 0x8d, 0x2f, - 0x98, 0x68, 0x37, 0xde, 0x1c, 0x68, 0x66, 0x9e, 0x1d, 0xf7, 0xa2, 0xc6, 0x9b, 0x1f, 0xc3, 0xe2, - 0x86, 0xc6, 0xfc, 0x9b, 0x01, 0xd7, 0x86, 0xea, 0xfe, 0x0c, 0x9a, 0xa9, 0x37, 0x93, 0xcd, 0xd4, - 0x8b, 0x29, 0x67, 0x9c, 0xc3, 0xac, 0x1d, 0xd1, 0x5a, 0x4d, 0x43, 0x6e, 0x9f, 0x17, 0xb1, 0xe6, - 0xaf, 0x0c, 0x98, 0x11, 0xbf, 0xc6, 0x99, 0x0f, 0x57, 0x20, 0x77, 0xe4, 0x87, 0x23, 0xaa, 0xbc, - 0x7c, 0x42, 0xda, 0xe2, 0x00, 0x2c, 0xe1, 0x8f, 0x31, 0x40, 0x7e, 0xc7, 0x80, 0xe4, 0x64, 0x16, - 0xbd, 0x2c, 0xfd, 0xd7, 0x88, 0x46, 0xa7, 0x63, 0xfa, 0xee, 0x4b, 0xa3, 0x5a, 0xc1, 0x2b, 0xa9, - 0xa6, 0x84, 0x4f, 0x43, 0x01, 0xfb, 0x7e, 0xb0, 0x6f, 0x05, 0xc7, 0x8c, 0x2f, 0xbc, 0xcd, 0x7f, - 0xa8, 0xbd, 0x11, 0x0b, 0x17, 0x18, 0x2c, 0xe1, 0xe6, 0x2f, 0x0d, 0xb8, 0x36, 0xf2, 0xd5, 0x84, - 0x87, 0x80, 0x46, 0xf4, 0xa5, 0x56, 0x14, 0x79, 0x61, 0x4c, 0x87, 0x35, 0x2a, 0xde, 0xc3, 0x25, - 0x9e, 0x5a, 0xfa, 0x7b, 0xb8, 0x84, 0x36, 0x9c, 0xa4, 0x35, 0xff, 0x95, 0x01, 0xf5, 0x74, 0xf2, - 0x3f, 0xf6, 0xd8, 0xeb, 0x7d, 0x0f, 0x37, 0xb3, 0xc9, 0x87, 0x9b, 0xe8, 0x95, 0x46, 0x7b, 0xb9, - 0xc8, 0x3e, 0xfa, 0xe5, 0x02, 0x3d, 0x1f, 0x3d, 0x86, 0xc8, 0xd0, 0xb5, 0x9c, 0x7c, 0x0c, 0xb9, - 0xe8, 0x55, 0x66, 0x94, 0xf0, 0xe4, 0xe3, 0xc8, 0xeb, 0x30, 0x6d, 0x93, 0xc0, 0x72, 0x5c, 0xd9, - 0x8f, 0xa5, 0x7e, 0x22, 0x90, 0xc2, 0xea, 0x92, 0xb5, 0x56, 0xe4, 0x36, 0xa9, 0x0f, 0x1c, 0x0a, - 0xe4, 0xd1, 0xb6, 0xe1, 0xdb, 0xb2, 0x9d, 0xc8, 0xc5, 0xd1, 0x76, 0xc3, 0xb7, 0x09, 0x16, 0x18, - 0xf3, 0x5d, 0x03, 0x8a, 0x52, 0xd2, 0x86, 0xd5, 0x61, 0x04, 0xad, 0x45, 0xab, 0x90, 0xc7, 0x7d, - 0x4d, 0x7f, 0xf5, 0xba, 0xe8, 0x55, 0x0a, 0x82, 0x4c, 0x74, 0x22, 0x43, 0x5e, 0x77, 0x32, 0x97, - 0xec, 0xd1, 0x93, 0x90, 0x13, 0xb7, 0x47, 0x6d, 0x66, 0x74, 0xd7, 0xc5, 0x05, 0xc3, 0x12, 0x67, - 0x7e, 0x9c, 0x81, 0x52, 0x62, 0x71, 0x29, 0x7a, 0x81, 0x68, 0x74, 0x99, 0x49, 0x31, 0x0e, 0x1f, - 0xfd, 0x30, 0xad, 0x72, 0xcf, 0xd4, 0xe3, 0xe4, 0x9e, 0xef, 0xc2, 0x54, 0x83, 0xef, 0x51, 0xf8, - 0x3f, 0x87, 0xb5, 0x71, 0x8e, 0x53, 0xec, 0x6e, 0xec, 0x8d, 0xe2, 0x93, 0x61, 0x25, 0x10, 0xdd, - 0x81, 0x05, 0x4a, 0x02, 0xda, 0x5d, 0x3f, 0x0a, 0x08, 0xd5, 0x9b, 0xf8, 0x5c, 0x5c, 0x71, 0xe3, - 0x7e, 0x02, 0x3c, 0xc8, 0x63, 0x1e, 0xc2, 0xcc, 0x5d, 0xeb, 0xd0, 0x8d, 0x1e, 0xbd, 0x30, 0x94, - 0x1c, 0xaf, 0xe1, 0x76, 0x6c, 0x22, 0xa3, 0x71, 0x18, 0xbd, 0xc2, 0x4b, 0xbb, 0xad, 0x23, 0x2f, - 0x7a, 0x95, 0x2b, 0x09, 0x80, 0x7c, 0xe5, 0xc1, 0x49, 0x11, 0xa6, 0x0b, 0x93, 0x9f, 0x61, 0xf7, - 0xf8, 0x3d, 0x28, 0xc4, 0xf5, 0xfd, 0xa7, 0xac, 0xd2, 0x7c, 0x13, 0xf2, 0xdc, 0xe3, 0xc3, 0xbe, - 0xf4, 0x92, 0x12, 0x27, 0x59, 0x38, 0x65, 0xd2, 0x14, 0x4e, 0x66, 0x0b, 0x4a, 0xf7, 0xda, 0xf6, - 0x63, 0x3e, 0x7b, 0x66, 0x52, 0x67, 0xad, 0x9b, 0x20, 0xff, 0x42, 0xc1, 0x13, 0x84, 0xcc, 0xdc, - 0x5a, 0x82, 0xd0, 0x13, 0xaf, 0x36, 0x95, 0xff, 0xa9, 0x01, 0x20, 0xc6, 0x5f, 0x9b, 0xa7, 0xc4, - 0x0b, 0x52, 0x3c, 0x8e, 0xdf, 0x83, 0x29, 0x5f, 0x7a, 0x93, 0x7c, 0xfa, 0x1c, 0x73, 0xc6, 0x1a, - 0x5d, 0x02, 0xe9, 0x4f, 0x58, 0x09, 0xab, 0xdd, 0xf8, 0xe0, 0xe1, 0xf2, 0xc4, 0x87, 0x0f, 0x97, - 0x27, 0x3e, 0x7a, 0xb8, 0x3c, 0xf1, 0xf6, 0xf9, 0xb2, 0xf1, 0xc1, 0xf9, 0xb2, 0xf1, 0xe1, 0xf9, - 0xb2, 0xf1, 0xd1, 0xf9, 0xb2, 0xf1, 0xf1, 0xf9, 0xb2, 0xf1, 0xee, 0x3f, 0x96, 0x27, 0x5e, 0xcf, - 0x9c, 0xae, 0xfd, 0x37, 0x00, 0x00, 0xff, 0xff, 0x82, 0x62, 0x88, 0xff, 0xb8, 0x26, 0x00, 0x00, + // 2814 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x3a, 0xcb, 0x6f, 0x24, 0x47, + 0xf9, 0xee, 0x19, 0x8f, 0x3d, 0xf3, 0x8d, 0xc7, 0x8f, 0x5a, 0xef, 0xef, 0x37, 0x6b, 0x84, 0xc7, + 0xe9, 0xa0, 0x68, 0x03, 0xc9, 0x38, 0x5e, 0x42, 0xb4, 0xd9, 0x90, 0x80, 0xc7, 0x5e, 0x6f, 0x4c, + 0xec, 0xd8, 0x2a, 0xef, 0x2e, 0x10, 0x22, 0x94, 0x76, 0x77, 0x79, 0xdc, 0xb8, 0xa7, 0x7b, 0x52, + 0xd5, 0x63, 0x67, 0xe0, 0x40, 0x0e, 0x20, 0x40, 0x82, 0x28, 0xdc, 0x10, 0x07, 0x94, 0x08, 0xfe, + 0x02, 0x2e, 0xf0, 0x07, 0x20, 0x91, 0x63, 0x24, 0x2e, 0x91, 0x40, 0xa3, 0xc4, 0x1c, 0x38, 0x22, + 0xae, 0xbe, 0x80, 0xea, 0xd1, 0xdd, 0xd5, 0xf3, 0x58, 0xf7, 0x64, 0x97, 0x88, 0xdb, 0xf4, 0xf7, + 0xae, 0xaa, 0xaf, 0xbe, 0x57, 0x0d, 0xec, 0x9e, 0xdc, 0x64, 0x75, 0x37, 0x58, 0x3d, 0xe9, 0x1c, + 0x12, 0xea, 0x93, 0x90, 0xb0, 0xd5, 0x53, 0xe2, 0x3b, 0x01, 0x5d, 0x55, 0x08, 0xab, 0xed, 0xb6, + 0x2c, 0xfb, 0xd8, 0xf5, 0x09, 0xed, 0xae, 0xb6, 0x4f, 0x9a, 0x1c, 0xc0, 0x56, 0x5b, 0x24, 0xb4, + 0x56, 0x4f, 0xd7, 0x56, 0x9b, 0xc4, 0x27, 0xd4, 0x0a, 0x89, 0x53, 0x6f, 0xd3, 0x20, 0x0c, 0xd0, + 0x17, 0x24, 0x57, 0x5d, 0xe7, 0xaa, 0xb7, 0x4f, 0x9a, 0x1c, 0xc0, 0xea, 0x9c, 0xab, 0x7e, 0xba, + 0xb6, 0xf4, 0x74, 0xd3, 0x0d, 0x8f, 0x3b, 0x87, 0x75, 0x3b, 0x68, 0xad, 0x36, 0x83, 0x66, 0xb0, + 0x2a, 0x98, 0x0f, 0x3b, 0x47, 0xe2, 0x4b, 0x7c, 0x88, 0x5f, 0x52, 0xe8, 0xd2, 0x48, 0x53, 0x68, + 0xc7, 0x0f, 0xdd, 0x16, 0xe9, 0xb7, 0x62, 0xe9, 0xb9, 0xcb, 0x18, 0x98, 0x7d, 0x4c, 0x5a, 0x56, + 0x3f, 0x9f, 0xf9, 0xe7, 0x3c, 0x14, 0xd7, 0xf7, 0xb7, 0xef, 0xd0, 0xa0, 0xd3, 0x46, 0x2b, 0x30, + 0xe9, 0x5b, 0x2d, 0x52, 0x35, 0x56, 0x8c, 0xeb, 0xa5, 0xc6, 0xcc, 0x07, 0xbd, 0xda, 0xc4, 0x79, + 0xaf, 0x36, 0xf9, 0xaa, 0xd5, 0x22, 0x58, 0x60, 0x90, 0x07, 0xc5, 0x53, 0x42, 0x99, 0x1b, 0xf8, + 0xac, 0x9a, 0x5b, 0xc9, 0x5f, 0x2f, 0xdf, 0x78, 0xa9, 0x9e, 0x65, 0xfd, 0x75, 0xa1, 0xe0, 0xbe, + 0x64, 0xdd, 0x0a, 0xe8, 0xa6, 0xcb, 0xec, 0xe0, 0x94, 0xd0, 0x6e, 0x63, 0x5e, 0x69, 0x29, 0x2a, + 0x24, 0xc3, 0xb1, 0x06, 0xf4, 0x23, 0x03, 0xe6, 0xdb, 0x94, 0x1c, 0x11, 0x4a, 0x89, 0xa3, 0xf0, + 0xd5, 0xfc, 0x8a, 0xf1, 0x08, 0xd4, 0x56, 0x95, 0xda, 0xf9, 0xfd, 0x3e, 0xf9, 0x78, 0x40, 0x23, + 0xfa, 0xad, 0x01, 0x4b, 0x8c, 0xd0, 0x53, 0x42, 0xd7, 0x1d, 0x87, 0x12, 0xc6, 0x1a, 0xdd, 0x0d, + 0xcf, 0x25, 0x7e, 0xb8, 0xb1, 0xbd, 0x89, 0x59, 0x75, 0x52, 0xec, 0xc3, 0xd7, 0xb2, 0x19, 0x74, + 0x30, 0x4a, 0x4e, 0xc3, 0x54, 0x16, 0x2d, 0x8d, 0x24, 0x61, 0xf8, 0x01, 0x66, 0x98, 0x47, 0x30, + 0x13, 0x1d, 0xe4, 0x8e, 0xcb, 0x42, 0x74, 0x1f, 0xa6, 0x9a, 0xfc, 0x83, 0x55, 0x0d, 0x61, 0x60, + 0x3d, 0x9b, 0x81, 0x91, 0x8c, 0xc6, 0xac, 0xb2, 0x67, 0x4a, 0x7c, 0x32, 0xac, 0xa4, 0x99, 0x3f, + 0x9b, 0x84, 0xf2, 0xfa, 0xfe, 0x36, 0x26, 0x2c, 0xe8, 0x50, 0x9b, 0x64, 0x70, 0x9a, 0x9b, 0x30, + 0xc3, 0x5c, 0xbf, 0xd9, 0xf1, 0x2c, 0xca, 0xa1, 0xd5, 0x29, 0x41, 0xb9, 0xa8, 0x28, 0x67, 0x0e, + 0x34, 0x1c, 0x4e, 0x51, 0xa2, 0x1b, 0x00, 0x5c, 0x02, 0x6b, 0x5b, 0x36, 0x71, 0xaa, 0xb9, 0x15, + 0xe3, 0x7a, 0xb1, 0x81, 0x14, 0x1f, 0xbc, 0x1a, 0x63, 0xb0, 0x46, 0x85, 0x1e, 0x87, 0x82, 0xb0, + 0xb4, 0x5a, 0x14, 0x6a, 0x2a, 0x8a, 0xbc, 0x20, 0x96, 0x81, 0x25, 0x0e, 0x3d, 0x09, 0xd3, 0xca, + 0xcb, 0xaa, 0x25, 0x41, 0x36, 0xa7, 0xc8, 0xa6, 0x23, 0x37, 0x88, 0xf0, 0x7c, 0x7d, 0x27, 0xae, + 0xef, 0x08, 0xbf, 0xd3, 0xd6, 0xf7, 0x8a, 0xeb, 0x3b, 0x58, 0x60, 0xd0, 0x0e, 0x14, 0x4e, 0x09, + 0x3d, 0xe4, 0x9e, 0xc0, 0x5d, 0xf3, 0x4b, 0xd9, 0x36, 0xfa, 0x3e, 0x67, 0x69, 0x94, 0xb8, 0x69, + 0xe2, 0x27, 0x96, 0x42, 0x50, 0x1d, 0x80, 0x1d, 0x07, 0x34, 0x14, 0xcb, 0xab, 0x16, 0x56, 0xf2, + 0xd7, 0x4b, 0x8d, 0x59, 0xbe, 0xde, 0x83, 0x18, 0x8a, 0x35, 0x0a, 0x4e, 0x6f, 0x5b, 0x21, 0x69, + 0x06, 0xd4, 0x25, 0xac, 0x3a, 0x9d, 0xd0, 0x6f, 0xc4, 0x50, 0xac, 0x51, 0xa0, 0x6f, 0x00, 0x62, + 0x61, 0x40, 0xad, 0x26, 0x51, 0x4b, 0x7d, 0xd9, 0x62, 0xc7, 0x55, 0x10, 0xab, 0x5b, 0x52, 0xab, + 0x43, 0x07, 0x03, 0x14, 0x78, 0x08, 0x97, 0xf9, 0x7b, 0x03, 0xe6, 0x34, 0x5f, 0x10, 0x7e, 0x77, + 0x13, 0x66, 0x9a, 0xda, 0xad, 0x53, 0x7e, 0x11, 0x9f, 0xb6, 0x7e, 0x23, 0x71, 0x8a, 0x12, 0x11, + 0x28, 0x51, 0x25, 0x29, 0x8a, 0x2e, 0x6b, 0x99, 0x9d, 0x36, 0xb2, 0x21, 0xd1, 0xa4, 0x01, 0x19, + 0x4e, 0x24, 0x9b, 0xff, 0x30, 0x84, 0x03, 0x47, 0xf1, 0x06, 0x5d, 0xd7, 0x62, 0x9a, 0x21, 0xb6, + 0x6f, 0x66, 0x44, 0x3c, 0xba, 0x24, 0x10, 0xe4, 0xfe, 0x27, 0x02, 0xc1, 0xad, 0xe2, 0xaf, 0xde, + 0xab, 0x4d, 0xbc, 0xfd, 0xb7, 0x95, 0x09, 0xf3, 0x97, 0x06, 0xcc, 0xac, 0xb7, 0xdb, 0x5e, 0x77, + 0xaf, 0x1d, 0x8a, 0x05, 0x98, 0x30, 0xe5, 0xd0, 0x2e, 0xee, 0xf8, 0x6a, 0xa1, 0xc0, 0xef, 0xf7, + 0xa6, 0x80, 0x60, 0x85, 0xe1, 0xf7, 0xe7, 0x28, 0xa0, 0x36, 0x51, 0xd7, 0x2d, 0xbe, 0x3f, 0x5b, + 0x1c, 0x88, 0x25, 0x8e, 0x1f, 0xf2, 0x91, 0x4b, 0x3c, 0x67, 0xd7, 0xf2, 0xad, 0x26, 0xa1, 0xea, + 0x72, 0xc4, 0x5b, 0xbf, 0xa5, 0xe1, 0x70, 0x8a, 0xd2, 0xfc, 0x77, 0x0e, 0x4a, 0x1b, 0x81, 0xef, + 0xb8, 0xa1, 0xba, 0x5c, 0x61, 0xb7, 0x3d, 0x10, 0x3c, 0xee, 0x76, 0xdb, 0x04, 0x0b, 0x0c, 0x7a, + 0x1e, 0xa6, 0x58, 0x68, 0x85, 0x1d, 0x26, 0xec, 0x29, 0x35, 0x1e, 0x8b, 0xc2, 0xd2, 0x81, 0x80, + 0x5e, 0xf4, 0x6a, 0x73, 0xb1, 0x38, 0x09, 0xc2, 0x8a, 0x81, 0x7b, 0x7a, 0x70, 0x28, 0x36, 0xca, + 0xb9, 0x23, 0xd3, 0x5e, 0x94, 0x3f, 0xf2, 0x89, 0xa7, 0xef, 0x0d, 0x50, 0xe0, 0x21, 0x5c, 0xe8, + 0x14, 0x90, 0x67, 0xb1, 0xf0, 0x2e, 0xb5, 0x7c, 0x26, 0x74, 0xdd, 0x75, 0x5b, 0x44, 0x5d, 0xf8, + 0x2f, 0x66, 0x3b, 0x71, 0xce, 0x91, 0xe8, 0xdd, 0x19, 0x90, 0x86, 0x87, 0x68, 0x40, 0x4f, 0xc0, + 0x14, 0x25, 0x16, 0x0b, 0xfc, 0x6a, 0x41, 0x2c, 0x3f, 0x8e, 0xca, 0x58, 0x40, 0xb1, 0xc2, 0xf2, + 0x80, 0xd6, 0x22, 0x8c, 0x59, 0xcd, 0x28, 0xbc, 0xc6, 0x01, 0x6d, 0x57, 0x82, 0x71, 0x84, 0x37, + 0x5b, 0x50, 0xd9, 0xa0, 0xc4, 0x0a, 0xc9, 0x38, 0x5e, 0xf1, 0xe9, 0x0f, 0xfc, 0x27, 0x79, 0xa8, + 0x6c, 0x12, 0x8f, 0x24, 0xfa, 0xb6, 0x00, 0x35, 0xa9, 0x65, 0x93, 0x7d, 0x42, 0xdd, 0xc0, 0x39, + 0x20, 0x76, 0xe0, 0x3b, 0x4c, 0xb8, 0x40, 0xbe, 0xf1, 0x7f, 0x7c, 0x6f, 0xee, 0x0c, 0x60, 0xf1, + 0x10, 0x0e, 0xe4, 0x41, 0xa5, 0x4d, 0xc5, 0x6f, 0xb1, 0x5f, 0xd2, 0x43, 0xca, 0x37, 0xbe, 0x9c, + 0xed, 0x38, 0xf6, 0x75, 0xd6, 0xc6, 0xc2, 0x79, 0xaf, 0x56, 0x49, 0x81, 0x70, 0x5a, 0x38, 0xfa, + 0x3a, 0xcc, 0x07, 0xb4, 0x7d, 0x6c, 0xf9, 0x9b, 0xa4, 0x4d, 0x7c, 0x87, 0xf8, 0x21, 0x13, 0xbb, + 0x50, 0x6c, 0x2c, 0xf2, 0x3a, 0x62, 0xaf, 0x0f, 0x87, 0x07, 0xa8, 0xd1, 0x6b, 0xb0, 0xd0, 0xa6, + 0x41, 0xdb, 0x6a, 0x0a, 0x97, 0xda, 0x0f, 0x3c, 0xd7, 0xee, 0x0a, 0x17, 0x2a, 0x35, 0x9e, 0x3a, + 0xef, 0xd5, 0x16, 0xf6, 0xfb, 0x91, 0x17, 0xbd, 0xda, 0x15, 0xb1, 0x75, 0x1c, 0x92, 0x20, 0xf1, + 0xa0, 0x18, 0xed, 0x0c, 0x0b, 0xa3, 0xce, 0xd0, 0xdc, 0x86, 0xe2, 0x66, 0x47, 0xf9, 0xf3, 0x8b, + 0x50, 0x74, 0xd4, 0x6f, 0xb5, 0xf3, 0xd1, 0xc5, 0x8a, 0x69, 0x2e, 0x7a, 0xb5, 0x0a, 0x2f, 0x1d, + 0xeb, 0x11, 0x00, 0xc7, 0x2c, 0xe6, 0x13, 0x50, 0x14, 0x47, 0xce, 0xee, 0xaf, 0xa1, 0x79, 0xc8, + 0x63, 0xeb, 0x4c, 0x48, 0x99, 0xc1, 0x79, 0x6a, 0x9d, 0x69, 0x11, 0x68, 0x0f, 0xe0, 0x0e, 0x09, + 0xa3, 0x83, 0x5f, 0x87, 0xb9, 0x28, 0x0c, 0xa7, 0xb3, 0xc3, 0xff, 0x2b, 0xdd, 0x73, 0x38, 0x8d, + 0xc6, 0xfd, 0xf4, 0xe6, 0xeb, 0x50, 0x12, 0x19, 0x84, 0xa7, 0xdf, 0x24, 0xd5, 0x1b, 0x0f, 0x48, + 0xf5, 0x51, 0xfe, 0xce, 0x8d, 0xca, 0xdf, 0x9a, 0xb9, 0x1e, 0x54, 0x24, 0x6f, 0x54, 0xdc, 0x64, + 0xd2, 0xf0, 0x14, 0x14, 0x23, 0x33, 0x95, 0x96, 0xb8, 0xa8, 0x8d, 0x04, 0xe1, 0x98, 0x42, 0xd3, + 0x76, 0x0c, 0xa9, 0x6c, 0x98, 0x4d, 0x99, 0x56, 0xb9, 0xe4, 0x1e, 0x5c, 0xb9, 0x68, 0x9a, 0x7e, + 0x08, 0xd5, 0x51, 0x95, 0xf0, 0x43, 0xe4, 0xeb, 0xec, 0xa6, 0x98, 0xef, 0x18, 0x30, 0xaf, 0x4b, + 0xca, 0x7e, 0x7c, 0xd9, 0x95, 0x5c, 0x5e, 0xa9, 0x69, 0x3b, 0xf2, 0x1b, 0x03, 0x16, 0x53, 0x4b, + 0x1b, 0xeb, 0xc4, 0xc7, 0x30, 0x4a, 0x77, 0x8e, 0xfc, 0x18, 0xce, 0xf1, 0x97, 0x1c, 0x54, 0x76, + 0xac, 0x43, 0xe2, 0x1d, 0x10, 0x8f, 0xd8, 0x61, 0x40, 0xd1, 0x0f, 0xa0, 0xdc, 0xb2, 0x42, 0xfb, + 0x58, 0x40, 0xa3, 0xaa, 0x7e, 0x33, 0x5b, 0xb0, 0x4b, 0x49, 0xaa, 0xef, 0x26, 0x62, 0x6e, 0xfb, + 0x21, 0xed, 0x36, 0xae, 0x28, 0x93, 0xca, 0x1a, 0x06, 0xeb, 0xda, 0x44, 0x2b, 0x26, 0xbe, 0x6f, + 0xbf, 0xd5, 0xe6, 0x25, 0xc7, 0xf8, 0x1d, 0x60, 0xca, 0x04, 0x4c, 0xde, 0xec, 0xb8, 0x94, 0xb4, + 0x88, 0x1f, 0x26, 0xad, 0xd8, 0x6e, 0x9f, 0x7c, 0x3c, 0xa0, 0x71, 0xe9, 0x25, 0x98, 0xef, 0x37, + 0x9e, 0xc7, 0x9f, 0x13, 0xd2, 0x95, 0xe7, 0x85, 0xf9, 0x4f, 0xb4, 0x08, 0x85, 0x53, 0xcb, 0xeb, + 0xa8, 0xdb, 0x88, 0xe5, 0xc7, 0xad, 0xdc, 0x4d, 0xc3, 0xfc, 0x9d, 0x01, 0xd5, 0x51, 0x86, 0xa0, + 0xcf, 0x6b, 0x82, 0x1a, 0x65, 0x65, 0x55, 0xfe, 0x15, 0xd2, 0x95, 0x52, 0x6f, 0x43, 0x31, 0x68, + 0xf3, 0x7a, 0x20, 0xa0, 0xea, 0xd4, 0x9f, 0x8c, 0x4e, 0x72, 0x4f, 0xc1, 0x2f, 0x7a, 0xb5, 0xab, + 0x29, 0xf1, 0x11, 0x02, 0xc7, 0xac, 0x3c, 0x52, 0x0b, 0x7b, 0x78, 0xf6, 0x88, 0x23, 0xf5, 0x7d, + 0x01, 0xc1, 0x0a, 0x63, 0xfe, 0xd1, 0x80, 0x49, 0x51, 0x4c, 0xbf, 0x0e, 0x45, 0xbe, 0x7f, 0x8e, + 0x15, 0x5a, 0xc2, 0xae, 0xcc, 0x6d, 0x1c, 0xe7, 0xde, 0x25, 0xa1, 0x95, 0x78, 0x5b, 0x04, 0xc1, + 0xb1, 0x44, 0x84, 0xa1, 0xe0, 0x86, 0xa4, 0x15, 0x1d, 0xe4, 0xd3, 0x23, 0x45, 0xab, 0x21, 0x42, + 0x1d, 0x5b, 0x67, 0xb7, 0xdf, 0x0a, 0x89, 0xcf, 0x0f, 0x23, 0xb9, 0x1a, 0xdb, 0x5c, 0x06, 0x96, + 0xa2, 0xcc, 0x7f, 0x19, 0x10, 0xab, 0xe2, 0xce, 0xcf, 0x88, 0x77, 0xb4, 0xe3, 0xfa, 0x27, 0x6a, + 0x5b, 0x63, 0x73, 0x0e, 0x14, 0x1c, 0xc7, 0x14, 0xc3, 0xd2, 0x43, 0x6e, 0xbc, 0xf4, 0xc0, 0x15, + 0xda, 0x81, 0x1f, 0xba, 0x7e, 0x67, 0xe0, 0xb6, 0x6d, 0x28, 0x38, 0x8e, 0x29, 0x78, 0x21, 0x42, + 0x49, 0xcb, 0x72, 0x7d, 0xd7, 0x6f, 0xf2, 0x45, 0x6c, 0x04, 0x1d, 0x3f, 0x14, 0x19, 0x59, 0x15, + 0x22, 0x78, 0x00, 0x8b, 0x87, 0x70, 0x98, 0x7f, 0x98, 0x84, 0x32, 0x5f, 0x73, 0x94, 0xe7, 0x5e, + 0x80, 0x8a, 0xa7, 0x7b, 0x81, 0x5a, 0xfb, 0x55, 0x65, 0x4a, 0xfa, 0x5e, 0xe3, 0x34, 0x2d, 0x67, + 0x16, 0xf5, 0x53, 0xcc, 0x9c, 0x4b, 0x33, 0x6f, 0xe9, 0x48, 0x9c, 0xa6, 0xe5, 0xd1, 0xeb, 0x8c, + 0xdf, 0x0f, 0x55, 0x99, 0xc4, 0x47, 0xf4, 0x4d, 0x0e, 0xc4, 0x12, 0x87, 0x76, 0xe1, 0x8a, 0xe5, + 0x79, 0xc1, 0x99, 0x00, 0x36, 0x82, 0xe0, 0xa4, 0x65, 0xd1, 0x13, 0x26, 0x1a, 0xe1, 0x62, 0xe3, + 0x73, 0x8a, 0xe5, 0xca, 0xfa, 0x20, 0x09, 0x1e, 0xc6, 0x37, 0xec, 0xd8, 0x26, 0xc7, 0x3c, 0xb6, + 0x63, 0x58, 0xec, 0x03, 0x89, 0x5b, 0xae, 0xba, 0xd2, 0x67, 0x95, 0x9c, 0x45, 0x3c, 0x84, 0xe6, + 0x62, 0x04, 0x1c, 0x0f, 0x95, 0x88, 0x6e, 0xc1, 0x2c, 0xf7, 0xe4, 0xa0, 0x13, 0x46, 0x75, 0x67, + 0x41, 0x1c, 0x37, 0x3a, 0xef, 0xd5, 0x66, 0xef, 0xa6, 0x30, 0xb8, 0x8f, 0x92, 0x6f, 0xae, 0xe7, + 0xb6, 0xdc, 0xb0, 0x3a, 0x2d, 0x58, 0xe2, 0xcd, 0xdd, 0xe1, 0x40, 0x2c, 0x71, 0x29, 0x0f, 0x2c, + 0x5e, 0xe6, 0x81, 0xe6, 0xaf, 0xf3, 0x80, 0x64, 0xa1, 0xec, 0xc8, 0x7a, 0x4a, 0x86, 0x34, 0x5e, + 0xcd, 0xab, 0x42, 0xdb, 0xe8, 0xab, 0xe6, 0x55, 0x8d, 0x1d, 0xe1, 0xd1, 0x2e, 0x94, 0x64, 0x68, + 0x49, 0xae, 0xcb, 0xaa, 0x22, 0x2e, 0xed, 0x45, 0x88, 0x8b, 0x5e, 0x6d, 0x29, 0xa5, 0x26, 0xc6, + 0x88, 0x4e, 0x2b, 0x91, 0x80, 0x6e, 0x00, 0x58, 0x6d, 0x57, 0x9f, 0xb5, 0x95, 0x92, 0x89, 0x4b, + 0xd2, 0x35, 0x63, 0x8d, 0x0a, 0xbd, 0x0c, 0x93, 0xe1, 0xa7, 0xeb, 0x86, 0x8a, 0xa2, 0xd9, 0xe3, + 0xbd, 0x8f, 0x90, 0xc0, 0xb5, 0x0b, 0x7f, 0x66, 0xdc, 0x2c, 0xd5, 0xc8, 0xc4, 0xda, 0xb7, 0x62, + 0x0c, 0xd6, 0xa8, 0xd0, 0xb7, 0xa0, 0x78, 0xa4, 0x4a, 0x51, 0x71, 0x30, 0x99, 0x43, 0x64, 0x54, + 0xc0, 0xca, 0x76, 0x3f, 0xfa, 0xc2, 0xb1, 0x34, 0xf3, 0x4d, 0x28, 0xed, 0xba, 0x36, 0x0d, 0x44, + 0x23, 0xf6, 0x24, 0x4c, 0xb3, 0x54, 0xa7, 0x12, 0x1f, 0x49, 0xe4, 0x2e, 0x11, 0x9e, 0xfb, 0x89, + 0x6f, 0xf9, 0x81, 0xec, 0x47, 0x0a, 0x89, 0x9f, 0xbc, 0xca, 0x81, 0x58, 0xe2, 0x6e, 0x2d, 0xf2, + 0x4c, 0xff, 0xd3, 0xf7, 0x6b, 0x13, 0xef, 0xbe, 0x5f, 0x9b, 0x78, 0xef, 0x7d, 0x95, 0xf5, 0x2f, + 0x00, 0x60, 0xef, 0xf0, 0x7b, 0xc4, 0x96, 0xf1, 0x33, 0xd3, 0x6c, 0x2d, 0x1a, 0xe9, 0x8a, 0xd9, + 0x5a, 0xae, 0xaf, 0x7a, 0xd3, 0x70, 0x38, 0x45, 0x89, 0x56, 0xa1, 0x14, 0x4f, 0xcd, 0xd4, 0x41, + 0x2f, 0x44, 0x8e, 0x13, 0x8f, 0xd6, 0x70, 0x42, 0x93, 0x0a, 0xe6, 0x93, 0x97, 0x06, 0xf3, 0x06, + 0xe4, 0x3b, 0xae, 0xa3, 0xba, 0xd6, 0x67, 0xa2, 0x64, 0x7a, 0x6f, 0x7b, 0xf3, 0xa2, 0x57, 0x7b, + 0x6c, 0xd4, 0xb0, 0x9a, 0x77, 0xfc, 0xac, 0x7e, 0x6f, 0x7b, 0x13, 0x73, 0xe6, 0x61, 0x91, 0x65, + 0x6a, 0xcc, 0xc8, 0x72, 0x03, 0xa0, 0x99, 0xf4, 0xfe, 0xf2, 0xe2, 0xc6, 0x1e, 0xa5, 0xf5, 0xfc, + 0x1a, 0x15, 0x62, 0xb0, 0x60, 0xf3, 0x06, 0x59, 0xf5, 0xe0, 0x2c, 0xb4, 0x5a, 0x72, 0x9a, 0x38, + 0x9e, 0x73, 0x5f, 0x53, 0x6a, 0x16, 0x36, 0xfa, 0x85, 0xe1, 0x41, 0xf9, 0x28, 0x80, 0x05, 0x47, + 0xb5, 0x7a, 0x89, 0xd2, 0xd2, 0xd8, 0x4a, 0xaf, 0x72, 0x85, 0x9b, 0xfd, 0x82, 0xf0, 0xa0, 0x6c, + 0xf4, 0x5d, 0x58, 0x8a, 0x80, 0x83, 0xfd, 0xb6, 0x88, 0xbc, 0xf9, 0xc6, 0xf2, 0x79, 0xaf, 0xb6, + 0xb4, 0x39, 0x92, 0x0a, 0x3f, 0x40, 0x02, 0x72, 0x60, 0xca, 0x93, 0x95, 0x6a, 0x59, 0x54, 0x17, + 0x5f, 0xcd, 0xb6, 0x8a, 0xc4, 0xfb, 0xeb, 0x7a, 0x85, 0x1a, 0xcf, 0x3d, 0x54, 0x71, 0xaa, 0x64, + 0xa3, 0xb7, 0xa0, 0x6c, 0xf9, 0x7e, 0x10, 0x5a, 0x72, 0x02, 0x30, 0x23, 0x54, 0xad, 0x8f, 0xad, + 0x6a, 0x3d, 0x91, 0xd1, 0x57, 0x11, 0x6b, 0x18, 0xac, 0xab, 0x42, 0x67, 0x30, 0x17, 0x9c, 0xf9, + 0x84, 0x62, 0x72, 0x44, 0x28, 0xf1, 0x6d, 0xc2, 0xaa, 0x15, 0xa1, 0xfd, 0xd9, 0x8c, 0xda, 0x53, + 0xcc, 0x89, 0x4b, 0xa7, 0xe1, 0x0c, 0xf7, 0x6b, 0x41, 0x75, 0x1e, 0x24, 0x7d, 0xcb, 0x73, 0xbf, + 0x4f, 0x28, 0xab, 0xce, 0x26, 0x03, 0xdf, 0xad, 0x18, 0x8a, 0x35, 0x0a, 0xf4, 0x15, 0x28, 0xdb, + 0x5e, 0x87, 0x85, 0x44, 0x4e, 0xdf, 0xe7, 0xc4, 0x0d, 0x8a, 0xd7, 0xb7, 0x91, 0xa0, 0xb0, 0x4e, + 0x87, 0x3a, 0x50, 0x69, 0xe9, 0x29, 0xa3, 0xba, 0x20, 0x56, 0x77, 0x33, 0xdb, 0xea, 0x06, 0x93, + 0x5a, 0x52, 0xc1, 0xa4, 0x70, 0x38, 0xad, 0x65, 0xe9, 0x79, 0x28, 0x7f, 0xca, 0xe2, 0x9e, 0x37, + 0x07, 0xfd, 0xe7, 0x38, 0x56, 0x73, 0xf0, 0xa7, 0x1c, 0xcc, 0xa6, 0x77, 0xbf, 0x2f, 0x1d, 0x16, + 0x32, 0xa5, 0xc3, 0xa8, 0x0d, 0x35, 0x46, 0x3e, 0x18, 0x44, 0x61, 0x3d, 0x3f, 0x32, 0xac, 0xab, + 0xe8, 0x39, 0xf9, 0x30, 0xd1, 0xb3, 0x0e, 0xc0, 0xeb, 0x0c, 0x1a, 0x78, 0x1e, 0xa1, 0x22, 0x70, + 0x16, 0xd5, 0xc3, 0x40, 0x0c, 0xc5, 0x1a, 0x05, 0xaf, 0x86, 0x0f, 0xbd, 0xc0, 0x3e, 0x11, 0x5b, + 0x10, 0x5d, 0x7a, 0x11, 0x32, 0x8b, 0xb2, 0x1a, 0x6e, 0x0c, 0x60, 0xf1, 0x10, 0x0e, 0xb3, 0x0b, + 0x57, 0xf7, 0x2d, 0x1a, 0xba, 0x96, 0x97, 0x5c, 0x30, 0xd1, 0x6e, 0xbc, 0x31, 0xd0, 0xcc, 0x3c, + 0x33, 0xee, 0x45, 0x4d, 0x36, 0x3f, 0x81, 0x25, 0x0d, 0x8d, 0xf9, 0x57, 0x03, 0xae, 0x0d, 0xd5, + 0xfd, 0x19, 0x34, 0x53, 0x6f, 0xa4, 0x9b, 0xa9, 0x17, 0x32, 0x4e, 0x21, 0x87, 0x59, 0x3b, 0xa2, + 0xb5, 0x9a, 0x86, 0xc2, 0x3e, 0x2f, 0x62, 0xcd, 0x5f, 0x18, 0x30, 0x23, 0x7e, 0x8d, 0x33, 0xc1, + 0xad, 0xa5, 0xe7, 0xfa, 0xa5, 0x47, 0x38, 0xd3, 0x7f, 0xc7, 0x80, 0xf4, 0xec, 0x14, 0xbd, 0x24, + 0xfd, 0xd7, 0x88, 0x87, 0x9b, 0x63, 0xfa, 0xee, 0x8b, 0xa3, 0x5a, 0xc1, 0x2b, 0x99, 0xa6, 0x84, + 0x4f, 0x41, 0x09, 0x07, 0x41, 0xb8, 0x6f, 0x85, 0xc7, 0x8c, 0x2f, 0xbc, 0xcd, 0x7f, 0xa8, 0xbd, + 0x11, 0x0b, 0x17, 0x18, 0x2c, 0xe1, 0xe6, 0xcf, 0x0d, 0xb8, 0x36, 0xf2, 0xad, 0x85, 0x87, 0x00, + 0x3b, 0xfe, 0x52, 0x2b, 0x8a, 0xbd, 0x30, 0xa1, 0xc3, 0x1a, 0x15, 0xef, 0xe1, 0x52, 0x0f, 0x34, + 0xfd, 0x3d, 0x5c, 0x4a, 0x1b, 0x4e, 0xd3, 0x9a, 0xff, 0xcc, 0x81, 0x7a, 0xdc, 0xf8, 0x2f, 0x7b, + 0xec, 0x13, 0x7d, 0x4f, 0x2b, 0xb3, 0xe9, 0xa7, 0x95, 0xf8, 0x1d, 0x45, 0x7b, 0x5b, 0xc8, 0x3f, + 0xf8, 0x6d, 0x01, 0x3d, 0x17, 0x3f, 0x57, 0xc8, 0xd0, 0xb5, 0x9c, 0x7e, 0xae, 0xb8, 0xe8, 0xd5, + 0x66, 0x94, 0xf0, 0xf4, 0xf3, 0xc5, 0x6b, 0x30, 0xed, 0x90, 0xd0, 0x72, 0x3d, 0xd9, 0x8f, 0x65, + 0x1e, 0xe2, 0x4b, 0x61, 0x9b, 0x92, 0xb5, 0x51, 0xe6, 0x36, 0xa9, 0x0f, 0x1c, 0x09, 0xe4, 0xd1, + 0xd6, 0x0e, 0x1c, 0xd9, 0x4e, 0x14, 0x92, 0x68, 0xbb, 0x11, 0x38, 0x04, 0x0b, 0x8c, 0xf9, 0xae, + 0x01, 0x65, 0x29, 0x69, 0xc3, 0xea, 0x30, 0x82, 0xd6, 0xe2, 0x55, 0xc8, 0xe3, 0xbe, 0xa6, 0xbf, + 0x4b, 0x5d, 0xf4, 0x6a, 0x25, 0x41, 0x26, 0x3a, 0x91, 0x21, 0xef, 0x2f, 0xb9, 0x4b, 0xf6, 0xe8, + 0x71, 0x28, 0x88, 0xdb, 0xa3, 0x36, 0x33, 0x79, 0x60, 0xe3, 0x40, 0x2c, 0x71, 0xe6, 0xc7, 0x39, + 0xa8, 0xa4, 0x16, 0x97, 0xa1, 0x17, 0x88, 0x47, 0x97, 0xb9, 0x0c, 0xe3, 0xf0, 0xd1, 0xcf, 0xd9, + 0x2a, 0xf7, 0x4c, 0x3d, 0x4c, 0xee, 0xf9, 0x36, 0x4c, 0xd9, 0x7c, 0x8f, 0xa2, 0x7f, 0x47, 0xac, + 0x8d, 0x73, 0x9c, 0x62, 0x77, 0x13, 0x6f, 0x14, 0x9f, 0x0c, 0x2b, 0x81, 0xe8, 0x0e, 0x2c, 0x50, + 0x12, 0xd2, 0xee, 0xfa, 0x51, 0x48, 0xa8, 0xde, 0xc4, 0x17, 0x92, 0x8a, 0x1b, 0xf7, 0x13, 0xe0, + 0x41, 0x1e, 0xf3, 0x10, 0x66, 0xee, 0x5a, 0x87, 0x5e, 0xfc, 0x2c, 0x85, 0xa1, 0xe2, 0xfa, 0xb6, + 0xd7, 0x71, 0x88, 0x8c, 0xc6, 0x51, 0xf4, 0x8a, 0x2e, 0xed, 0xb6, 0x8e, 0xbc, 0xe8, 0xd5, 0xae, + 0xa4, 0x00, 0xf2, 0x1d, 0x06, 0xa7, 0x45, 0x98, 0x1e, 0x4c, 0x7e, 0x86, 0xdd, 0xe3, 0x77, 0xa0, + 0x94, 0xd4, 0xf7, 0x8f, 0x58, 0xa5, 0xf9, 0x06, 0x14, 0xb9, 0xc7, 0x47, 0x7d, 0xe9, 0x25, 0x25, + 0x4e, 0xba, 0x70, 0xca, 0x65, 0x29, 0x9c, 0xcc, 0x16, 0x54, 0xee, 0xb5, 0x9d, 0x87, 0x7c, 0x98, + 0xcc, 0x65, 0xce, 0x5a, 0x37, 0x40, 0xfe, 0xf1, 0x82, 0x27, 0x08, 0x99, 0xb9, 0xb5, 0x04, 0xa1, + 0x27, 0x5e, 0x6d, 0x2a, 0xff, 0x63, 0x03, 0x40, 0x8c, 0xbf, 0x6e, 0x9f, 0x12, 0x3f, 0xcc, 0xf0, + 0x7c, 0x7d, 0x0f, 0xa6, 0x02, 0xe9, 0x4d, 0xf2, 0x71, 0x72, 0xcc, 0x19, 0x6b, 0x7c, 0x09, 0xa4, + 0x3f, 0x61, 0x25, 0xac, 0x71, 0xfd, 0x83, 0x4f, 0x96, 0x27, 0x3e, 0xfc, 0x64, 0x79, 0xe2, 0xa3, + 0x4f, 0x96, 0x27, 0xde, 0x3e, 0x5f, 0x36, 0x3e, 0x38, 0x5f, 0x36, 0x3e, 0x3c, 0x5f, 0x36, 0x3e, + 0x3a, 0x5f, 0x36, 0x3e, 0x3e, 0x5f, 0x36, 0xde, 0xfd, 0xfb, 0xf2, 0xc4, 0x6b, 0xb9, 0xd3, 0xb5, + 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0xcb, 0x36, 0x03, 0x7d, 0xee, 0x26, 0x00, 0x00, } func (m *APIGroup) Marshal() (dAtA []byte, err error) { @@ -1788,6 +1787,51 @@ func (m *APIVersions) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *ApplyOptions) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ApplyOptions) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ApplyOptions) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.FieldManager) + copy(dAtA[i:], m.FieldManager) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.FieldManager))) + i-- + dAtA[i] = 0x1a + i-- + if m.Force { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + if len(m.DryRun) > 0 { + for iNdEx := len(m.DryRun) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.DryRun[iNdEx]) + copy(dAtA[i:], m.DryRun[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.DryRun[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + func (m *Condition) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1973,45 +2017,6 @@ func (m *Duration) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *ExportOptions) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ExportOptions) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ExportOptions) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - i-- - if m.Exact { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x10 - i-- - if m.Export { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x8 - return len(dAtA) - i, nil -} - func (m *FieldsV1) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -3585,6 +3590,24 @@ func (m *APIVersions) Size() (n int) { return n } +func (m *ApplyOptions) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.DryRun) > 0 { + for _, s := range m.DryRun { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + n += 2 + l = len(m.FieldManager) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + func (m *Condition) Size() (n int) { if m == nil { return 0 @@ -3661,17 +3684,6 @@ func (m *Duration) Size() (n int) { return n } -func (m *ExportOptions) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - n += 2 - n += 2 - return n -} - func (m *FieldsV1) Size() (n int) { if m == nil { return 0 @@ -4317,6 +4329,18 @@ func (this *APIResourceList) String() string { }, "") return s } +func (this *ApplyOptions) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ApplyOptions{`, + `DryRun:` + fmt.Sprintf("%v", this.DryRun) + `,`, + `Force:` + fmt.Sprintf("%v", this.Force) + `,`, + `FieldManager:` + fmt.Sprintf("%v", this.FieldManager) + `,`, + `}`, + }, "") + return s +} func (this *Condition) String() string { if this == nil { return "nil" @@ -4367,17 +4391,6 @@ func (this *Duration) String() string { }, "") return s } -func (this *ExportOptions) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&ExportOptions{`, - `Export:` + fmt.Sprintf("%v", this.Export) + `,`, - `Exact:` + fmt.Sprintf("%v", this.Exact) + `,`, - `}`, - }, "") - return s -} func (this *GetOptions) String() string { if this == nil { return "nil" @@ -4925,10 +4938,7 @@ func (m *APIGroup) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5012,10 +5022,7 @@ func (m *APIGroupList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5377,10 +5384,7 @@ func (m *APIResource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5496,10 +5500,7 @@ func (m *APIResourceList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5615,10 +5616,141 @@ func (m *APIVersions) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } - if (iNdEx + skippy) < 0 { + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ApplyOptions) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ApplyOptions: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ApplyOptions: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DryRun", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DryRun = append(m.DryRun, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Force", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Force = bool(v != 0) + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FieldManager", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.FieldManager = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5848,10 +5980,7 @@ func (m *Condition) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5965,10 +6094,7 @@ func (m *CreateOptions) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -6160,10 +6286,7 @@ func (m *DeleteOptions) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -6232,103 +6355,7 @@ func (m *Duration) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ExportOptions) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ExportOptions: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ExportOptions: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Export", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Export = bool(v != 0) - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Exact", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Exact = bool(v != 0) - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -6412,10 +6439,7 @@ func (m *FieldsV1) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -6497,10 +6521,7 @@ func (m *GetOptions) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -6614,10 +6635,7 @@ func (m *GroupKind) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -6731,10 +6749,7 @@ func (m *GroupResource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -6848,10 +6863,7 @@ func (m *GroupVersion) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -6965,10 +6977,7 @@ func (m *GroupVersionForDiscovery) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -7114,10 +7123,7 @@ func (m *GroupVersionKind) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -7263,10 +7269,7 @@ func (m *GroupVersionResource) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -7426,7 +7429,7 @@ func (m *LabelSelector) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -7477,10 +7480,7 @@ func (m *LabelSelector) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -7626,10 +7626,7 @@ func (m *LabelSelectorRequirement) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -7746,10 +7743,7 @@ func (m *List) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -7915,10 +7909,7 @@ func (m *ListMeta) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -8207,10 +8198,7 @@ func (m *ListOptions) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -8460,10 +8448,7 @@ func (m *ManagedFieldsEntry) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -8923,7 +8908,7 @@ func (m *ObjectMeta) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -9050,7 +9035,7 @@ func (m *ObjectMeta) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -9199,10 +9184,7 @@ func (m *ObjectMeta) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -9422,10 +9404,7 @@ func (m *OwnerReference) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -9508,10 +9487,7 @@ func (m *PartialObjectMetadata) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -9628,10 +9604,7 @@ func (m *PartialObjectMetadataList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -9681,10 +9654,7 @@ func (m *Patch) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -9819,10 +9789,7 @@ func (m *PatchOptions) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -9938,10 +9905,7 @@ func (m *Preconditions) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -10023,10 +9987,7 @@ func (m *RootPaths) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -10140,10 +10101,7 @@ func (m *ServerAddressByClientCIDR) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -10377,10 +10335,7 @@ func (m *Status) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -10526,10 +10481,7 @@ func (m *StatusCause) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -10760,10 +10712,7 @@ func (m *StatusDetails) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -10845,10 +10794,7 @@ func (m *TableOptions) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -10936,10 +10882,7 @@ func (m *Timestamp) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -11053,10 +10996,7 @@ func (m *TypeMeta) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -11170,10 +11110,7 @@ func (m *UpdateOptions) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -11255,10 +11192,7 @@ func (m *Verbs) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -11373,10 +11307,7 @@ func (m *WatchEvent) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto index fd24483c0e44..4f41504f3ff3 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto @@ -134,6 +134,31 @@ message APIVersions { repeated ServerAddressByClientCIDR serverAddressByClientCIDRs = 2; } +// ApplyOptions may be provided when applying an API object. +// FieldManager is required for apply requests. +// ApplyOptions is equivalent to PatchOptions. It is provided as a convenience with documentation +// that speaks specifically to how the options fields relate to apply. +message ApplyOptions { + // When present, indicates that modifications should not be + // persisted. An invalid or unrecognized dryRun directive will + // result in an error response and no further processing of the + // request. Valid values are: + // - All: all dry run stages will be processed + // +optional + repeated string dryRun = 1; + + // Force is going to "force" Apply requests. It means user will + // re-acquire conflicting fields owned by other people. + optional bool force = 2; + + // fieldManager is a name associated with the actor or entity + // that is making these changes. The value must be less than or + // 128 characters long, and only contain printable characters, + // as defined by https://golang.org/pkg/unicode/#IsPrint. This + // field is required. + optional string fieldManager = 3; +} + // Condition contains details for one aspect of the current state of this API Resource. // --- // This struct is intended for direct use as an array at the field path .status.conditions. For example, @@ -268,18 +293,6 @@ message Duration { optional int64 duration = 1; } -// ExportOptions is the query options to the standard REST get call. -// Deprecated. Planned for removal in 1.18. -message ExportOptions { - // Should this value be exported. Export strips fields that a user can not specify. - // Deprecated. Planned for removal in 1.18. - optional bool export = 1; - - // Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. - // Deprecated. Planned for removal in 1.18. - optional bool exact = 2; -} - // FieldsV1 stores a set of fields in a data structure like a Trie, in JSON format. // // Each key is either a '.' representing the field itself, and will always map to an empty set, diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/register.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/register.go index c1a077178bfb..1abdd626de03 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/register.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/register.go @@ -55,7 +55,6 @@ var ParameterCodec = runtime.NewParameterCodec(scheme) var optionsTypes = []runtime.Object{ &ListOptions{}, - &ExportOptions{}, &GetOptions{}, &DeleteOptions{}, &CreateOptions{}, diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types.go index d84878d7c25e..79e2ad48a040 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types.go @@ -99,10 +99,16 @@ type ListMeta struct { RemainingItemCount *int64 `json:"remainingItemCount,omitempty" protobuf:"bytes,4,opt,name=remainingItemCount"` } +// Field path constants that are specific to the internal API +// representation. +const ( + ObjectNameField = "metadata.name" +) + // These are internal finalizer values for Kubernetes-like APIs, must be qualified name unless defined here const ( - FinalizerOrphanDependents string = "orphan" - FinalizerDeleteDependents string = "foregroundDeletion" + FinalizerOrphanDependents = "orphan" + FinalizerDeleteDependents = "foregroundDeletion" ) // ObjectMeta is metadata that all persisted resources must have, which includes all objects @@ -283,15 +289,15 @@ type ObjectMeta struct { const ( // NamespaceDefault means the object is in the default namespace which is applied when not specified by clients - NamespaceDefault string = "default" + NamespaceDefault = "default" // NamespaceAll is the default argument to specify on a context when you want to list or filter resources across all namespaces - NamespaceAll string = "" + NamespaceAll = "" // NamespaceNone is the argument for a context when there is no namespace. - NamespaceNone string = "" + NamespaceNone = "" // NamespaceSystem is the system namespace where we place system components. - NamespaceSystem string = "kube-system" + NamespaceSystem = "kube-system" // NamespacePublic is the namespace where we place public info (ConfigMaps) - NamespacePublic string = "kube-public" + NamespacePublic = "kube-public" ) // OwnerReference contains enough information to let you identify an owning @@ -433,21 +439,6 @@ const ( // +k8s:conversion-gen:explicit-from=net/url.Values // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -// ExportOptions is the query options to the standard REST get call. -// Deprecated. Planned for removal in 1.18. -type ExportOptions struct { - TypeMeta `json:",inline"` - // Should this value be exported. Export strips fields that a user can not specify. - // Deprecated. Planned for removal in 1.18. - Export bool `json:"export" protobuf:"varint,1,opt,name=export"` - // Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. - // Deprecated. Planned for removal in 1.18. - Exact bool `json:"exact" protobuf:"varint,2,opt,name=exact"` -} - -// +k8s:conversion-gen:explicit-from=net/url.Values -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - // GetOptions is the standard query options to the standard REST get call. type GetOptions struct { TypeMeta `json:",inline"` @@ -589,6 +580,37 @@ type PatchOptions struct { FieldManager string `json:"fieldManager,omitempty" protobuf:"bytes,3,name=fieldManager"` } +// ApplyOptions may be provided when applying an API object. +// FieldManager is required for apply requests. +// ApplyOptions is equivalent to PatchOptions. It is provided as a convenience with documentation +// that speaks specifically to how the options fields relate to apply. +type ApplyOptions struct { + TypeMeta `json:",inline"` + + // When present, indicates that modifications should not be + // persisted. An invalid or unrecognized dryRun directive will + // result in an error response and no further processing of the + // request. Valid values are: + // - All: all dry run stages will be processed + // +optional + DryRun []string `json:"dryRun,omitempty" protobuf:"bytes,1,rep,name=dryRun"` + + // Force is going to "force" Apply requests. It means user will + // re-acquire conflicting fields owned by other people. + Force bool `json:"force" protobuf:"varint,2,opt,name=force"` + + // fieldManager is a name associated with the actor or entity + // that is making these changes. The value must be less than or + // 128 characters long, and only contain printable characters, + // as defined by https://golang.org/pkg/unicode/#IsPrint. This + // field is required. + FieldManager string `json:"fieldManager" protobuf:"bytes,3,name=fieldManager"` +} + +func (o ApplyOptions) ToPatchOptions() PatchOptions { + return PatchOptions{DryRun: o.DryRun, Force: &o.Force, FieldManager: o.FieldManager} +} + // +k8s:conversion-gen:explicit-from=net/url.Values // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types_swagger_doc_generated.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types_swagger_doc_generated.go index ace0abfb98e7..c33d8ffa7387 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types_swagger_doc_generated.go @@ -86,6 +86,17 @@ func (APIVersions) SwaggerDoc() map[string]string { return map_APIVersions } +var map_ApplyOptions = map[string]string{ + "": "ApplyOptions may be provided when applying an API object. FieldManager is required for apply requests. ApplyOptions is equivalent to PatchOptions. It is provided as a convenience with documentation that speaks specifically to how the options fields relate to apply.", + "dryRun": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "force": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people.", + "fieldManager": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required.", +} + +func (ApplyOptions) SwaggerDoc() map[string]string { + return map_ApplyOptions +} + var map_Condition = map[string]string{ "": "Condition contains details for one aspect of the current state of this API Resource.", "type": "type of condition in CamelCase or in foo.example.com/CamelCase.", @@ -123,16 +134,6 @@ func (DeleteOptions) SwaggerDoc() map[string]string { return map_DeleteOptions } -var map_ExportOptions = map[string]string{ - "": "ExportOptions is the query options to the standard REST get call. Deprecated. Planned for removal in 1.18.", - "export": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", - "exact": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", -} - -func (ExportOptions) SwaggerDoc() map[string]string { - return map_ExportOptions -} - var map_FieldsV1 = map[string]string{ "": "FieldsV1 stores a set of fields in a data structure like a Trie, in JSON format.\n\nEach key is either a '.' representing the field itself, and will always map to an empty set, or a string representing a sub-field or item. The string will follow one of these four formats: 'f:', where is the name of a field in a struct, or key in a map 'v:', where is the exact json formatted value of a list item 'i:', where is position of a item in a list 'k:', where is a map of a list item's key fields to their unique values If a key maps to an empty Fields value, the field that key represents is part of the set.\n\nThe exact format is defined in sigs.k8s.io/structured-merge-diff", } diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/BUILD b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/BUILD deleted file mode 100644 index 60bbb33c035a..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/BUILD +++ /dev/null @@ -1,71 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "helpers_test.go", - "unstructured_conversion_test.go", - "unstructured_list_test.go", - "unstructured_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/apitesting/fuzzer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/fuzzer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/testapigroup:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/testapigroup/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/testing:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/test:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "helpers.go", - "unstructured.go", - "unstructured_list.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured", - importpath = "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/json:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructuredscheme:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructuredscheme/BUILD b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructuredscheme/BUILD deleted file mode 100644 index d03d8e80abc9..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructuredscheme/BUILD +++ /dev/null @@ -1,30 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["scheme.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructuredscheme", - importpath = "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructuredscheme", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/json:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/versioning:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/validation/BUILD b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/validation/BUILD deleted file mode 100644 index 822d81a6ed35..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/validation/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["validation_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["validation.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/validation", - importpath = "k8s.io/apimachinery/pkg/apis/meta/v1/validation", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/validation/validation.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/validation/validation.go index 715adf2f973d..a5a7f144addb 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/validation/validation.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/validation/validation.go @@ -173,7 +173,8 @@ func ValidateTableOptions(opts *metav1.TableOptions) field.ErrorList { func ValidateManagedFields(fieldsList []metav1.ManagedFieldsEntry, fldPath *field.Path) field.ErrorList { var allErrs field.ErrorList - for _, fields := range fieldsList { + for i, fields := range fieldsList { + fldPath := fldPath.Index(i) switch fields.Operation { case metav1.ManagedFieldsOperationApply, metav1.ManagedFieldsOperationUpdate: default: @@ -182,6 +183,7 @@ func ValidateManagedFields(fieldsList []metav1.ManagedFieldsEntry, fldPath *fiel if len(fields.FieldsType) > 0 && fields.FieldsType != "FieldsV1" { allErrs = append(allErrs, field.Invalid(fldPath.Child("fieldsType"), fields.FieldsType, "must be `FieldsV1`")) } + allErrs = append(allErrs, ValidateFieldManager(fields.Manager, fldPath.Child("manager"))...) } return allErrs } diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/zz_generated.conversion.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/zz_generated.conversion.go index 06afd9b5be3f..3ecb67c82798 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/zz_generated.conversion.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/zz_generated.conversion.go @@ -50,11 +50,6 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*url.Values)(nil), (*ExportOptions)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_url_Values_To_v1_ExportOptions(a.(*url.Values), b.(*ExportOptions), scope) - }); err != nil { - return err - } if err := s.AddGeneratedConversionFunc((*url.Values)(nil), (*GetOptions)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_url_Values_To_v1_GetOptions(a.(*url.Values), b.(*GetOptions), scope) }); err != nil { @@ -339,31 +334,6 @@ func autoConvert_url_Values_To_v1_DeleteOptions(in *url.Values, out *DeleteOptio return nil } -func autoConvert_url_Values_To_v1_ExportOptions(in *url.Values, out *ExportOptions, s conversion.Scope) error { - // WARNING: Field TypeMeta does not have json tag, skipping. - - if values, ok := map[string][]string(*in)["export"]; ok && len(values) > 0 { - if err := runtime.Convert_Slice_string_To_bool(&values, &out.Export, s); err != nil { - return err - } - } else { - out.Export = false - } - if values, ok := map[string][]string(*in)["exact"]; ok && len(values) > 0 { - if err := runtime.Convert_Slice_string_To_bool(&values, &out.Exact, s); err != nil { - return err - } - } else { - out.Exact = false - } - return nil -} - -// Convert_url_Values_To_v1_ExportOptions is an autogenerated conversion function. -func Convert_url_Values_To_v1_ExportOptions(in *url.Values, out *ExportOptions, s conversion.Scope) error { - return autoConvert_url_Values_To_v1_ExportOptions(in, out, s) -} - func autoConvert_url_Values_To_v1_GetOptions(in *url.Values, out *GetOptions, s conversion.Scope) error { // WARNING: Field TypeMeta does not have json tag, skipping. diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/zz_generated.deepcopy.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/zz_generated.deepcopy.go index 1aa73bd24fde..d43020da573e 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/zz_generated.deepcopy.go @@ -191,6 +191,28 @@ func (in *APIVersions) DeepCopyObject() runtime.Object { return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ApplyOptions) DeepCopyInto(out *ApplyOptions) { + *out = *in + out.TypeMeta = in.TypeMeta + if in.DryRun != nil { + in, out := &in.DryRun, &out.DryRun + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ApplyOptions. +func (in *ApplyOptions) DeepCopy() *ApplyOptions { + if in == nil { + return nil + } + out := new(ApplyOptions) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Condition) DeepCopyInto(out *Condition) { *out = *in @@ -304,31 +326,6 @@ func (in *Duration) DeepCopy() *Duration { return out } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ExportOptions) DeepCopyInto(out *ExportOptions) { - *out = *in - out.TypeMeta = in.TypeMeta - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExportOptions. -func (in *ExportOptions) DeepCopy() *ExportOptions { - if in == nil { - return nil - } - out := new(ExportOptions) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *ExportOptions) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *FieldsV1) DeepCopyInto(out *FieldsV1) { *out = *in diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/BUILD b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/BUILD deleted file mode 100644 index 6cba6c2aa463..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "deepcopy.go", - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - "zz_generated.defaults.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1", - importpath = "k8s.io/apimachinery/pkg/apis/meta/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1beta1/validation:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/generated.pb.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/generated.pb.go index cd5fc9026c47..a5a94967966c 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/generated.pb.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/generated.pb.go @@ -311,10 +311,7 @@ func (m *PartialObjectMetadataList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/validation/BUILD b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/validation/BUILD deleted file mode 100644 index 858687b89309..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/validation/BUILD +++ /dev/null @@ -1,27 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["validation.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/validation", - importpath = "k8s.io/apimachinery/pkg/apis/meta/v1beta1/validation", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/conversion/BUILD b/vendor/k8s.io/apimachinery/pkg/conversion/BUILD deleted file mode 100644 index 4d6ec9dd2715..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/conversion/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "converter_test.go", - "helper_test.go", - ], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = [ - "converter.go", - "deep_equal.go", - "doc.go", - "helper.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/conversion", - importpath = "k8s.io/apimachinery/pkg/conversion", - deps = ["//staging/src/k8s.io/apimachinery/third_party/forked/golang/reflect:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apimachinery/pkg/conversion/queryparams:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/conversion/queryparams/BUILD b/vendor/k8s.io/apimachinery/pkg/conversion/queryparams/BUILD deleted file mode 100644 index e9fa8bc64bc3..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/conversion/queryparams/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "convert.go", - "doc.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/conversion/queryparams", - importpath = "k8s.io/apimachinery/pkg/conversion/queryparams", -) - -go_test( - name = "go_default_test", - srcs = ["convert_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/fields/BUILD b/vendor/k8s.io/apimachinery/pkg/fields/BUILD deleted file mode 100644 index 19207bca98e5..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/fields/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "fields_test.go", - "selector_test.go", - ], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fields.go", - "requirements.go", - "selector.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/fields", - importpath = "k8s.io/apimachinery/pkg/fields", - deps = ["//staging/src/k8s.io/apimachinery/pkg/selection:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/labels/BUILD b/vendor/k8s.io/apimachinery/pkg/labels/BUILD deleted file mode 100644 index 45fea8c199e1..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/labels/BUILD +++ /dev/null @@ -1,51 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "labels_test.go", - "selector_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/selection:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "labels.go", - "selector.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/labels", - importpath = "k8s.io/apimachinery/pkg/labels", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/selection:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/labels/labels.go b/vendor/k8s.io/apimachinery/pkg/labels/labels.go index d6bbeeaca785..8360d842b6ce 100644 --- a/vendor/k8s.io/apimachinery/pkg/labels/labels.go +++ b/vendor/k8s.io/apimachinery/pkg/labels/labels.go @@ -20,6 +20,8 @@ import ( "fmt" "sort" "strings" + + "k8s.io/apimachinery/pkg/util/validation/field" ) // Labels allows you to present labels independently from their storage. @@ -79,7 +81,7 @@ func (ls Set) AsSelectorPreValidated() Selector { return SelectorFromValidatedSet(ls) } -// FormatLabels convert label map into plain string +// FormatLabels converts label map into plain string func FormatLabels(labelMap map[string]string) string { l := Set(labelMap).String() if l == "" { @@ -143,7 +145,7 @@ func Equals(labels1, labels2 Set) bool { // ConvertSelectorToLabelsMap converts selector string to labels map // and validates keys and values -func ConvertSelectorToLabelsMap(selector string) (Set, error) { +func ConvertSelectorToLabelsMap(selector string, opts ...field.PathOption) (Set, error) { labelsMap := Set{} if len(selector) == 0 { @@ -157,11 +159,11 @@ func ConvertSelectorToLabelsMap(selector string) (Set, error) { return labelsMap, fmt.Errorf("invalid selector: %s", l) } key := strings.TrimSpace(l[0]) - if err := validateLabelKey(key); err != nil { + if err := validateLabelKey(key, field.ToPath(opts...)); err != nil { return labelsMap, err } value := strings.TrimSpace(l[1]) - if err := validateLabelValue(key, value); err != nil { + if err := validateLabelValue(key, value, field.ToPath(opts...)); err != nil { return labelsMap, err } labelsMap[key] = value diff --git a/vendor/k8s.io/apimachinery/pkg/labels/selector.go b/vendor/k8s.io/apimachinery/pkg/labels/selector.go index 50ae4f7cef4b..b0865777a29a 100644 --- a/vendor/k8s.io/apimachinery/pkg/labels/selector.go +++ b/vendor/k8s.io/apimachinery/pkg/labels/selector.go @@ -17,18 +17,28 @@ limitations under the License. package labels import ( - "bytes" "fmt" "sort" "strconv" "strings" + "github.com/google/go-cmp/cmp" "k8s.io/apimachinery/pkg/selection" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/validation" + "k8s.io/apimachinery/pkg/util/validation/field" "k8s.io/klog/v2" ) +var ( + validRequirementOperators = []string{ + string(selection.In), string(selection.NotIn), + string(selection.Equals), string(selection.DoubleEquals), string(selection.NotEquals), + string(selection.Exists), string(selection.DoesNotExist), + string(selection.GreaterThan), string(selection.LessThan), + } +) + // Requirements is AND of all requirements. type Requirements []Requirement @@ -139,42 +149,47 @@ type Requirement struct { // of characters. See validateLabelKey for more details. // // The empty string is a valid value in the input values set. -func NewRequirement(key string, op selection.Operator, vals []string) (*Requirement, error) { - if err := validateLabelKey(key); err != nil { - return nil, err +// Returned error, if not nil, is guaranteed to be an aggregated field.ErrorList +func NewRequirement(key string, op selection.Operator, vals []string, opts ...field.PathOption) (*Requirement, error) { + var allErrs field.ErrorList + path := field.ToPath(opts...) + if err := validateLabelKey(key, path.Child("key")); err != nil { + allErrs = append(allErrs, err) } + + valuePath := path.Child("values") switch op { case selection.In, selection.NotIn: if len(vals) == 0 { - return nil, fmt.Errorf("for 'in', 'notin' operators, values set can't be empty") + allErrs = append(allErrs, field.Invalid(valuePath, vals, "for 'in', 'notin' operators, values set can't be empty")) } case selection.Equals, selection.DoubleEquals, selection.NotEquals: if len(vals) != 1 { - return nil, fmt.Errorf("exact-match compatibility requires one single value") + allErrs = append(allErrs, field.Invalid(valuePath, vals, "exact-match compatibility requires one single value")) } case selection.Exists, selection.DoesNotExist: if len(vals) != 0 { - return nil, fmt.Errorf("values set must be empty for exists and does not exist") + allErrs = append(allErrs, field.Invalid(valuePath, vals, "values set must be empty for exists and does not exist")) } case selection.GreaterThan, selection.LessThan: if len(vals) != 1 { - return nil, fmt.Errorf("for 'Gt', 'Lt' operators, exactly one value is required") + allErrs = append(allErrs, field.Invalid(valuePath, vals, "for 'Gt', 'Lt' operators, exactly one value is required")) } for i := range vals { if _, err := strconv.ParseInt(vals[i], 10, 64); err != nil { - return nil, fmt.Errorf("for 'Gt', 'Lt' operators, the value must be an integer") + allErrs = append(allErrs, field.Invalid(valuePath.Index(i), vals[i], "for 'Gt', 'Lt' operators, the value must be an integer")) } } default: - return nil, fmt.Errorf("operator '%v' is not recognized", op) + allErrs = append(allErrs, field.NotSupported(path.Child("operator"), op, validRequirementOperators)) } for i := range vals { - if err := validateLabelValue(key, vals[i]); err != nil { - return nil, err + if err := validateLabelValue(key, vals[i], valuePath.Index(i)); err != nil { + allErrs = append(allErrs, err) } } - return &Requirement{key: key, operator: op, strValues: vals}, nil + return &Requirement{key: key, operator: op, strValues: vals}, allErrs.ToAggregate() } func (r *Requirement) hasValue(value string) bool { @@ -262,6 +277,17 @@ func (r *Requirement) Values() sets.String { return ret } +// Equal checks the equality of requirement. +func (r Requirement) Equal(x Requirement) bool { + if r.key != x.key { + return false + } + if r.operator != x.operator { + return false + } + return cmp.Equal(r.strValues, x.strValues) +} + // Empty returns true if the internalSelector doesn't restrict selection space func (s internalSelector) Empty() bool { if s == nil { @@ -274,51 +300,58 @@ func (s internalSelector) Empty() bool { // Requirement. If called on an invalid Requirement, an error is // returned. See NewRequirement for creating a valid Requirement. func (r *Requirement) String() string { - var buffer bytes.Buffer + var sb strings.Builder + sb.Grow( + // length of r.key + len(r.key) + + // length of 'r.operator' + 2 spaces for the worst case ('in' and 'notin') + len(r.operator) + 2 + + // length of 'r.strValues' slice times. Heuristically 5 chars per word + +5*len(r.strValues)) if r.operator == selection.DoesNotExist { - buffer.WriteString("!") + sb.WriteString("!") } - buffer.WriteString(r.key) + sb.WriteString(r.key) switch r.operator { case selection.Equals: - buffer.WriteString("=") + sb.WriteString("=") case selection.DoubleEquals: - buffer.WriteString("==") + sb.WriteString("==") case selection.NotEquals: - buffer.WriteString("!=") + sb.WriteString("!=") case selection.In: - buffer.WriteString(" in ") + sb.WriteString(" in ") case selection.NotIn: - buffer.WriteString(" notin ") + sb.WriteString(" notin ") case selection.GreaterThan: - buffer.WriteString(">") + sb.WriteString(">") case selection.LessThan: - buffer.WriteString("<") + sb.WriteString("<") case selection.Exists, selection.DoesNotExist: - return buffer.String() + return sb.String() } switch r.operator { case selection.In, selection.NotIn: - buffer.WriteString("(") + sb.WriteString("(") } if len(r.strValues) == 1 { - buffer.WriteString(r.strValues[0]) + sb.WriteString(r.strValues[0]) } else { // only > 1 since == 0 prohibited by NewRequirement // normalizes value order on output, without mutating the in-memory selector representation // also avoids normalization when it is not required, and ensures we do not mutate shared data - buffer.WriteString(strings.Join(safeSort(r.strValues), ",")) + sb.WriteString(strings.Join(safeSort(r.strValues), ",")) } switch r.operator { case selection.In, selection.NotIn: - buffer.WriteString(")") + sb.WriteString(")") } - return buffer.String() + return sb.String() } -// safeSort sort input strings without modification +// safeSort sorts input strings without modification func safeSort(in []string) []string { if sort.StringsAreSorted(in) { return in @@ -366,7 +399,7 @@ func (s internalSelector) String() string { return strings.Join(reqs, ",") } -// RequiresExactMatch introspect whether a given selector requires a single specific field +// RequiresExactMatch introspects whether a given selector requires a single specific field // to be set, and if so returns the value it requires. func (s internalSelector) RequiresExactMatch(label string) (value string, found bool) { for ix := range s { @@ -444,7 +477,7 @@ func isWhitespace(ch byte) bool { return ch == ' ' || ch == '\t' || ch == '\r' || ch == '\n' } -// isSpecialSymbol detect if the character ch can be an operator +// isSpecialSymbol detects if the character ch can be an operator func isSpecialSymbol(ch byte) bool { switch ch { case '=', '!', '(', ')', ',', '>', '<': @@ -462,7 +495,7 @@ type Lexer struct { pos int } -// read return the character currently lexed +// read returns the character currently lexed // increment the position and check the buffer overflow func (l *Lexer) read() (b byte) { b = 0 @@ -560,6 +593,7 @@ type Parser struct { l *Lexer scannedItems []ScannedItem position int + path *field.Path } // ParserContext represents context during parsing: @@ -653,7 +687,7 @@ func (p *Parser) parseRequirement() (*Requirement, error) { return nil, err } if operator == selection.Exists || operator == selection.DoesNotExist { // operator found lookahead set checked - return NewRequirement(key, operator, []string{}) + return NewRequirement(key, operator, []string{}, field.WithPath(p.path)) } operator, err = p.parseOperator() if err != nil { @@ -669,11 +703,11 @@ func (p *Parser) parseRequirement() (*Requirement, error) { if err != nil { return nil, err } - return NewRequirement(key, operator, values.List()) + return NewRequirement(key, operator, values.List(), field.WithPath(p.path)) } -// parseKeyAndInferOperator parse literals. +// parseKeyAndInferOperator parses literals. // in case of no operator '!, in, notin, ==, =, !=' are found // the 'exists' operator is inferred func (p *Parser) parseKeyAndInferOperator() (string, selection.Operator, error) { @@ -687,7 +721,7 @@ func (p *Parser) parseKeyAndInferOperator() (string, selection.Operator, error) err := fmt.Errorf("found '%s', expected: identifier", literal) return "", "", err } - if err := validateLabelKey(literal); err != nil { + if err := validateLabelKey(literal, p.path); err != nil { return "", "", err } if t, _ := p.lookahead(Values); t == EndOfStringToken || t == CommaToken { @@ -698,7 +732,7 @@ func (p *Parser) parseKeyAndInferOperator() (string, selection.Operator, error) return literal, operator, nil } -// parseOperator return operator and eventually matchType +// parseOperator returns operator and eventually matchType // matchType can be exact func (p *Parser) parseOperator() (op selection.Operator, err error) { tok, lit := p.consume(KeyAndOperator) @@ -833,8 +867,8 @@ func (p *Parser) parseExactValue() (sets.String, error) { // the KEY exists and can be any VALUE. // (5) A requirement with just !KEY requires that the KEY not exist. // -func Parse(selector string) (Selector, error) { - parsedSelector, err := parse(selector) +func Parse(selector string, opts ...field.PathOption) (Selector, error) { + parsedSelector, err := parse(selector, field.ToPath(opts...)) if err == nil { return parsedSelector, nil } @@ -845,8 +879,8 @@ func Parse(selector string) (Selector, error) { // The callers of this method can then decide how to return the internalSelector struct to their // callers. This function has two callers now, one returns a Selector interface and the other // returns a list of requirements. -func parse(selector string) (internalSelector, error) { - p := &Parser{l: &Lexer{s: selector, pos: 0}} +func parse(selector string, path *field.Path) (internalSelector, error) { + p := &Parser{l: &Lexer{s: selector, pos: 0}, path: path} items, err := p.parse() if err != nil { return nil, err @@ -855,16 +889,16 @@ func parse(selector string) (internalSelector, error) { return internalSelector(items), err } -func validateLabelKey(k string) error { +func validateLabelKey(k string, path *field.Path) *field.Error { if errs := validation.IsQualifiedName(k); len(errs) != 0 { - return fmt.Errorf("invalid label key %q: %s", k, strings.Join(errs, "; ")) + return field.Invalid(path, k, strings.Join(errs, "; ")) } return nil } -func validateLabelValue(k, v string) error { +func validateLabelValue(k, v string, path *field.Path) *field.Error { if errs := validation.IsValidLabelValue(v); len(errs) != 0 { - return fmt.Errorf("invalid label value: %q: at key: %q: %s", v, k, strings.Join(errs, "; ")) + return field.Invalid(path.Key(k), v, strings.Join(errs, "; ")) } return nil } @@ -918,6 +952,6 @@ func SelectorFromValidatedSet(ls Set) Selector { // processing on selector requirements. // See the documentation for Parse() function for more details. // TODO: Consider exporting the internalSelector type instead. -func ParseToRequirements(selector string) ([]Requirement, error) { - return parse(selector) +func ParseToRequirements(selector string, opts ...field.PathOption) ([]Requirement, error) { + return parse(selector, field.ToPath(opts...)) } diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/BUILD b/vendor/k8s.io/apimachinery/pkg/runtime/BUILD deleted file mode 100644 index 4791481e47ad..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/runtime/BUILD +++ /dev/null @@ -1,94 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "codec_test.go", - "converter_test.go", - "embedded_test.go", - "extension_test.go", - "local_scheme_test.go", - "mapper_test.go", - "scheme_test.go", - "swagger_doc_generator_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/testing:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/json:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "codec.go", - "codec_check.go", - "conversion.go", - "converter.go", - "doc.go", - "embedded.go", - "error.go", - "extension.go", - "generated.pb.go", - "helper.go", - "interfaces.go", - "mapper.go", - "negotiate.go", - "register.go", - "scheme.go", - "scheme_builder.go", - "swagger_doc_generator.go", - "types.go", - "types_proto.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/runtime", - importpath = "k8s.io/apimachinery/pkg/runtime", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion/queryparams:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/json:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/naming:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/sigs.k8s.io/structured-merge-diff/v4/value:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:all-srcs", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:all-srcs", - "//staging/src/k8s.io/apimachinery/pkg/runtime/testing:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/generated.pb.go b/vendor/k8s.io/apimachinery/pkg/runtime/generated.pb.go index 071971817317..ac428d6103a9 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/generated.pb.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/generated.pb.go @@ -450,10 +450,7 @@ func (m *RawExtension) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -567,10 +564,7 @@ func (m *TypeMeta) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -751,10 +745,7 @@ func (m *Unknown) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/schema/BUILD b/vendor/k8s.io/apimachinery/pkg/runtime/schema/BUILD deleted file mode 100644 index 497caf695873..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/runtime/schema/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["group_version_test.go"], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = [ - "generated.pb.go", - "group_version.go", - "interfaces.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/runtime/schema", - importpath = "k8s.io/apimachinery/pkg/runtime/schema", - deps = ["//vendor/github.com/gogo/protobuf/proto:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/scheme.go b/vendor/k8s.io/apimachinery/pkg/runtime/scheme.go index 697dd4ed77ce..ae47ab3abae4 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/scheme.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/scheme.go @@ -129,12 +129,6 @@ func (s *Scheme) nameFunc(t reflect.Type) string { return gvks[0].Kind } -// fromScope gets the input version, desired output version, and desired Scheme -// from a conversion.Scope. -func (s *Scheme) fromScope(scope conversion.Scope) *Scheme { - return s -} - // Converter allows access to the converter for the scheme func (s *Scheme) Converter() *conversion.Converter { return s.converter @@ -235,6 +229,32 @@ func (s *Scheme) KnownTypes(gv schema.GroupVersion) map[string]reflect.Type { return types } +// VersionsForGroupKind returns the versions that a particular GroupKind can be converted to within the given group. +// A GroupKind might be converted to a different group. That information is available in EquivalentResourceMapper. +func (s *Scheme) VersionsForGroupKind(gk schema.GroupKind) []schema.GroupVersion { + availableVersions := []schema.GroupVersion{} + for gvk := range s.gvkToType { + if gk != gvk.GroupKind() { + continue + } + + availableVersions = append(availableVersions, gvk.GroupVersion()) + } + + // order the return for stability + ret := []schema.GroupVersion{} + for _, version := range s.PrioritizedVersionsForGroup(gk.Group) { + for _, availableVersion := range availableVersions { + if version != availableVersion { + continue + } + ret = append(ret, availableVersion) + } + } + + return ret +} + // AllKnownTypes returns the all known types. func (s *Scheme) AllKnownTypes() map[schema.GroupVersionKind]reflect.Type { return s.gvkToType diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/BUILD b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/BUILD deleted file mode 100644 index 1e4c4b8ec292..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/BUILD +++ /dev/null @@ -1,68 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "codec_test.go", - "sparse_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/testing:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//vendor/github.com/google/gofuzz:go_default_library", - "//vendor/github.com/spf13/pflag:go_default_library", - "//vendor/sigs.k8s.io/yaml:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "codec_factory.go", - "negotiated_codec.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/runtime/serializer", - importpath = "k8s.io/apimachinery/pkg/runtime/serializer", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/json:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/protobuf:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/recognizer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/versioning:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/json:all-srcs", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/protobuf:all-srcs", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/recognizer:all-srcs", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/streaming:all-srcs", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/versioning:all-srcs", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/yaml:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/json/BUILD b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/json/BUILD deleted file mode 100644 index c0b7d8ed2073..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/json/BUILD +++ /dev/null @@ -1,58 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "json_limit_test.go", - "json_test.go", - "meta_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/testing:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/json:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "json.go", - "meta.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/runtime/serializer/json", - importpath = "k8s.io/apimachinery/pkg/runtime/serializer/json", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/recognizer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/framer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/yaml:go_default_library", - "//vendor/github.com/json-iterator/go:go_default_library", - "//vendor/github.com/modern-go/reflect2:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/sigs.k8s.io/yaml:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/json/json.go b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/json/json.go index 83b2e1393113..48f0777b24e2 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/json/json.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/json/json.go @@ -333,13 +333,12 @@ func (s *Serializer) Identifier() runtime.Identifier { } // RecognizesData implements the RecognizingDecoder interface. -func (s *Serializer) RecognizesData(peek io.Reader) (ok, unknown bool, err error) { +func (s *Serializer) RecognizesData(data []byte) (ok, unknown bool, err error) { if s.options.Yaml { // we could potentially look for '---' return false, true, nil } - _, _, ok = utilyaml.GuessJSONStream(peek, 2048) - return ok, false, nil + return utilyaml.IsJSONBuffer(data), false, nil } // Framer is the default JSON framing behavior, with newlines delimiting individual objects. diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/protobuf/BUILD b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/protobuf/BUILD deleted file mode 100644 index 06fc1ed5575c..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/protobuf/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "protobuf.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/runtime/serializer/protobuf", - importpath = "k8s.io/apimachinery/pkg/runtime/serializer/protobuf", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/recognizer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/framer:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["protobuf_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/testing:go_default_library", - ], -) diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/protobuf/protobuf.go b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/protobuf/protobuf.go index 404fb1b7e5f8..8358d77c39ee 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/protobuf/protobuf.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/protobuf/protobuf.go @@ -120,7 +120,7 @@ func (s *Serializer) Decode(originalData []byte, gvk *schema.GroupVersionKind, i if intoUnknown, ok := into.(*runtime.Unknown); ok && intoUnknown != nil { *intoUnknown = unk - if ok, _, _ := s.RecognizesData(bytes.NewBuffer(unk.Raw)); ok { + if ok, _, _ := s.RecognizesData(unk.Raw); ok { intoUnknown.ContentType = runtime.ContentTypeProtobuf } return intoUnknown, &actual, nil @@ -245,19 +245,8 @@ func (s *Serializer) Identifier() runtime.Identifier { } // RecognizesData implements the RecognizingDecoder interface. -func (s *Serializer) RecognizesData(peek io.Reader) (bool, bool, error) { - prefix := make([]byte, 4) - n, err := peek.Read(prefix) - if err != nil { - if err == io.EOF { - return false, false, nil - } - return false, false, err - } - if n != 4 { - return false, false, nil - } - return bytes.Equal(s.prefix, prefix), false, nil +func (s *Serializer) RecognizesData(data []byte) (bool, bool, error) { + return bytes.HasPrefix(data, s.prefix), false, nil } // copyKindDefaults defaults dst to the value in src if dst does not have a value set. diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/recognizer/BUILD b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/recognizer/BUILD deleted file mode 100644 index 1e923aecebee..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/recognizer/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["recognizer.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/runtime/serializer/recognizer", - importpath = "k8s.io/apimachinery/pkg/runtime/serializer/recognizer", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/recognizer/testing:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/recognizer/recognizer.go b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/recognizer/recognizer.go index 38497ab533e3..709f85291150 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/recognizer/recognizer.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/recognizer/recognizer.go @@ -17,10 +17,7 @@ limitations under the License. package recognizer import ( - "bufio" - "bytes" "fmt" - "io" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" @@ -35,7 +32,7 @@ type RecognizingDecoder interface { // provides) and may return unknown if the data provided is not sufficient to make a // a determination. When peek returns EOF that may mean the end of the input or the // end of buffered input - recognizers should return the best guess at that time. - RecognizesData(peek io.Reader) (ok, unknown bool, err error) + RecognizesData(peek []byte) (ok, unknown bool, err error) } // NewDecoder creates a decoder that will attempt multiple decoders in an order defined @@ -57,16 +54,15 @@ type decoder struct { var _ RecognizingDecoder = &decoder{} -func (d *decoder) RecognizesData(peek io.Reader) (bool, bool, error) { +func (d *decoder) RecognizesData(data []byte) (bool, bool, error) { var ( lastErr error anyUnknown bool ) - data, _ := bufio.NewReaderSize(peek, 1024).Peek(1024) for _, r := range d.decoders { switch t := r.(type) { case RecognizingDecoder: - ok, unknown, err := t.RecognizesData(bytes.NewBuffer(data)) + ok, unknown, err := t.RecognizesData(data) if err != nil { lastErr = err continue @@ -91,8 +87,7 @@ func (d *decoder) Decode(data []byte, gvk *schema.GroupVersionKind, into runtime for _, r := range d.decoders { switch t := r.(type) { case RecognizingDecoder: - buf := bytes.NewBuffer(data) - ok, unknown, err := t.RecognizesData(buf) + ok, unknown, err := t.RecognizesData(data) if err != nil { lastErr = err continue diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/streaming/BUILD b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/streaming/BUILD deleted file mode 100644 index 34563444768b..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/streaming/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["streaming_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/framer:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["streaming.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/runtime/serializer/streaming", - importpath = "k8s.io/apimachinery/pkg/runtime/serializer/streaming", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/versioning/BUILD b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/versioning/BUILD deleted file mode 100644 index c3b8c33de98d..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/versioning/BUILD +++ /dev/null @@ -1,50 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "versioning_test.go", - "versioning_unstructured_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/testing:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["versioning.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/runtime/serializer/versioning", - importpath = "k8s.io/apimachinery/pkg/runtime/serializer/versioning", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/selection/BUILD b/vendor/k8s.io/apimachinery/pkg/selection/BUILD deleted file mode 100644 index ebb68728a8b3..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/selection/BUILD +++ /dev/null @@ -1,26 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["operator.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/selection", - importpath = "k8s.io/apimachinery/pkg/selection", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/types/BUILD b/vendor/k8s.io/apimachinery/pkg/types/BUILD deleted file mode 100644 index ad08cd8fa684..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/types/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "namespacedname.go", - "nodename.go", - "patch.go", - "uid.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/types", - importpath = "k8s.io/apimachinery/pkg/types", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/cache/BUILD b/vendor/k8s.io/apimachinery/pkg/util/cache/BUILD deleted file mode 100644 index ff280d456ab4..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/cache/BUILD +++ /dev/null @@ -1,48 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "expiring_test.go", - "lruexpirecache_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//vendor/github.com/golang/groupcache/lru:go_default_library", - "//vendor/github.com/google/uuid:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "expiring.go", - "lruexpirecache.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/cache", - importpath = "k8s.io/apimachinery/pkg/util/cache", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//vendor/github.com/hashicorp/golang-lru:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/clock/BUILD b/vendor/k8s.io/apimachinery/pkg/util/clock/BUILD deleted file mode 100644 index 8aee67d9c9c5..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/clock/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["clock_test.go"], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = ["clock.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/clock", - importpath = "k8s.io/apimachinery/pkg/util/clock", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/clock/clock.go b/vendor/k8s.io/apimachinery/pkg/util/clock/clock.go index 3e1e2517b42e..1a544d3b2e4d 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/clock/clock.go +++ b/vendor/k8s.io/apimachinery/pkg/util/clock/clock.go @@ -34,6 +34,7 @@ type PassiveClock interface { type Clock interface { PassiveClock After(time.Duration) <-chan time.Time + AfterFunc(time.Duration, func()) Timer NewTimer(time.Duration) Timer Sleep(time.Duration) NewTicker(time.Duration) Ticker @@ -57,6 +58,13 @@ func (RealClock) After(d time.Duration) <-chan time.Time { return time.After(d) } +// AfterFunc is the same as time.AfterFunc(d, f). +func (RealClock) AfterFunc(d time.Duration, f func()) Timer { + return &realTimer{ + timer: time.AfterFunc(d, f), + } +} + // NewTimer returns a new Timer. func (RealClock) NewTimer(d time.Duration) Timer { return &realTimer{ @@ -95,6 +103,7 @@ type fakeClockWaiter struct { stepInterval time.Duration skipIfBlocked bool destChan chan time.Time + afterFunc func() } // NewFakePassiveClock returns a new FakePassiveClock. @@ -145,6 +154,25 @@ func (f *FakeClock) After(d time.Duration) <-chan time.Time { return ch } +// AfterFunc is the Fake version of time.AfterFunc(d, callback). +func (f *FakeClock) AfterFunc(d time.Duration, cb func()) Timer { + f.lock.Lock() + defer f.lock.Unlock() + stopTime := f.time.Add(d) + ch := make(chan time.Time, 1) // Don't block! + + timer := &fakeTimer{ + fakeClock: f, + waiter: fakeClockWaiter{ + targetTime: stopTime, + destChan: ch, + afterFunc: cb, + }, + } + f.waiters = append(f.waiters, timer.waiter) + return timer +} + // NewTimer is the Fake version of time.NewTimer(d). func (f *FakeClock) NewTimer(d time.Duration) Timer { f.lock.Lock() @@ -211,6 +239,10 @@ func (f *FakeClock) setTimeLocked(t time.Time) { w.destChan <- t } + if w.afterFunc != nil { + w.afterFunc() + } + if w.stepInterval > 0 { for !w.targetTime.After(t) { w.targetTime = w.targetTime.Add(w.stepInterval) @@ -225,8 +257,8 @@ func (f *FakeClock) setTimeLocked(t time.Time) { f.waiters = newWaiters } -// HasWaiters returns true if After has been called on f but not yet satisfied (so you can -// write race-free tests). +// HasWaiters returns true if After or AfterFunc has been called on f but not yet satisfied +// (so you can write race-free tests). func (f *FakeClock) HasWaiters() bool { f.lock.RLock() defer f.lock.RUnlock() @@ -261,6 +293,12 @@ func (*IntervalClock) After(d time.Duration) <-chan time.Time { panic("IntervalClock doesn't implement After") } +// AfterFunc is currently unimplemented, will panic. +// TODO: make interval clock use FakeClock so this can be implemented. +func (*IntervalClock) AfterFunc(d time.Duration, cb func()) Timer { + panic("IntervalClock doesn't implement AfterFunc") +} + // NewTimer is currently unimplemented, will panic. // TODO: make interval clock use FakeClock so this can be implemented. func (*IntervalClock) NewTimer(d time.Duration) Timer { diff --git a/vendor/k8s.io/apimachinery/pkg/util/diff/BUILD b/vendor/k8s.io/apimachinery/pkg/util/diff/BUILD deleted file mode 100644 index 006929eacbc9..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/diff/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["diff_test.go"], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = ["diff.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/diff", - importpath = "k8s.io/apimachinery/pkg/util/diff", - deps = [ - "//vendor/github.com/davecgh/go-spew/spew:go_default_library", - "//vendor/github.com/google/go-cmp/cmp:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/duration/BUILD b/vendor/k8s.io/apimachinery/pkg/util/duration/BUILD deleted file mode 100644 index 98f515dadbb8..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/duration/BUILD +++ /dev/null @@ -1,29 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["duration.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/duration", - importpath = "k8s.io/apimachinery/pkg/util/duration", - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["duration_test.go"], - embed = [":go_default_library"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/errors/BUILD b/vendor/k8s.io/apimachinery/pkg/util/errors/BUILD deleted file mode 100644 index 25d90f31cc13..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/errors/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["errors_test.go"], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "errors.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/errors", - importpath = "k8s.io/apimachinery/pkg/util/errors", - deps = ["//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/framer/BUILD b/vendor/k8s.io/apimachinery/pkg/util/framer/BUILD deleted file mode 100644 index e72505b98d34..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/framer/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["framer_test.go"], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = ["framer.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/framer", - importpath = "k8s.io/apimachinery/pkg/util/framer", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/httpstream/BUILD b/vendor/k8s.io/apimachinery/pkg/util/httpstream/BUILD deleted file mode 100644 index fa8e3f8d1a81..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/httpstream/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["httpstream_test.go"], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "httpstream.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/httpstream", - importpath = "k8s.io/apimachinery/pkg/util/httpstream", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apimachinery/pkg/util/httpstream/spdy:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/BUILD b/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/BUILD deleted file mode 100644 index fab9cc90f758..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/BUILD +++ /dev/null @@ -1,58 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "connection_test.go", - "roundtripper_test.go", - "upgrade_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", - "//vendor/github.com/docker/spdystream:go_default_library", - "//vendor/github.com/elazarl/goproxy:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "connection.go", - "roundtripper.go", - "upgrade.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy", - importpath = "k8s.io/apimachinery/pkg/util/httpstream/spdy", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/third_party/forked/golang/netutil:go_default_library", - "//vendor/github.com/docker/spdystream:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/connection.go b/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/connection.go index 336b4908b4cd..21b2568d9003 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/connection.go +++ b/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/connection.go @@ -22,7 +22,7 @@ import ( "sync" "time" - "github.com/docker/spdystream" + "github.com/moby/spdystream" "k8s.io/apimachinery/pkg/util/httpstream" "k8s.io/klog/v2" ) diff --git a/vendor/k8s.io/apimachinery/pkg/util/intstr/BUILD b/vendor/k8s.io/apimachinery/pkg/util/intstr/BUILD deleted file mode 100644 index 7baba8d60894..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/intstr/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["intstr_test.go"], - embed = [":go_default_library"], - deps = ["//vendor/sigs.k8s.io/yaml:go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = [ - "generated.pb.go", - "instr_fuzz.go", - "intstr.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/intstr", - importpath = "k8s.io/apimachinery/pkg/util/intstr", - deps = [ - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/google/gofuzz:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/intstr/generated.pb.go b/vendor/k8s.io/apimachinery/pkg/util/intstr/generated.pb.go index ec1cb70f29bd..a4792034abfb 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/intstr/generated.pb.go +++ b/vendor/k8s.io/apimachinery/pkg/util/intstr/generated.pb.go @@ -268,10 +268,7 @@ func (m *IntOrString) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/apimachinery/pkg/util/json/BUILD b/vendor/k8s.io/apimachinery/pkg/util/json/BUILD deleted file mode 100644 index d8ac6ce41a1b..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/json/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["json.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/json", - importpath = "k8s.io/apimachinery/pkg/util/json", -) - -go_test( - name = "go_default_test", - srcs = ["json_test.go"], - embed = [":go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/managedfields/extract.go b/vendor/k8s.io/apimachinery/pkg/util/managedfields/extract.go new file mode 100644 index 000000000000..b7c95322577a --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/util/managedfields/extract.go @@ -0,0 +1,86 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package managedfields + +import ( + "bytes" + "fmt" + + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" + "sigs.k8s.io/structured-merge-diff/v4/typed" + + "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime" +) + +// ExtractInto extracts the applied configuration state from object for fieldManager +// into applyConfiguration. If no managed fields are found for the given fieldManager, +// no error is returned, but applyConfiguration is left unpopulated. It is possible +// that no managed fields were found for the fieldManager because other field managers +// have taken ownership of all the fields previously owned by the fieldManager. It is +// also possible the fieldManager never owned fields. +func ExtractInto(object runtime.Object, objectType typed.ParseableType, fieldManager string, applyConfiguration interface{}) error { + typedObj, err := toTyped(object, objectType) + if err != nil { + return fmt.Errorf("error converting obj to typed: %w", err) + } + + accessor, err := meta.Accessor(object) + if err != nil { + return fmt.Errorf("error accessing metadata: %w", err) + } + fieldsEntry, ok := findManagedFields(accessor, fieldManager) + if !ok { + return nil + } + fieldset := &fieldpath.Set{} + err = fieldset.FromJSON(bytes.NewReader(fieldsEntry.FieldsV1.Raw)) + if err != nil { + return fmt.Errorf("error marshalling FieldsV1 to JSON: %w", err) + } + + u := typedObj.ExtractItems(fieldset.Leaves()).AsValue().Unstructured() + m, ok := u.(map[string]interface{}) + if !ok { + return fmt.Errorf("unable to convert managed fields for %s to unstructured, expected map, got %T", fieldManager, u) + } + if err := runtime.DefaultUnstructuredConverter.FromUnstructured(m, applyConfiguration); err != nil { + return fmt.Errorf("error extracting into obj from unstructured: %w", err) + } + return nil +} + +func findManagedFields(accessor metav1.Object, fieldManager string) (metav1.ManagedFieldsEntry, bool) { + objManagedFields := accessor.GetManagedFields() + for _, mf := range objManagedFields { + if mf.Manager == fieldManager && mf.Operation == metav1.ManagedFieldsOperationApply { + return mf, true + } + } + return metav1.ManagedFieldsEntry{}, false +} + +func toTyped(obj runtime.Object, objectType typed.ParseableType) (*typed.TypedValue, error) { + switch o := obj.(type) { + case *unstructured.Unstructured: + return objectType.FromUnstructured(o.Object) + default: + return objectType.FromStructured(o) + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/util/mergepatch/BUILD b/vendor/k8s.io/apimachinery/pkg/util/mergepatch/BUILD deleted file mode 100644 index aa444d4f6c23..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/mergepatch/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["util_test.go"], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = [ - "errors.go", - "util.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/mergepatch", - importpath = "k8s.io/apimachinery/pkg/util/mergepatch", - deps = [ - "//vendor/github.com/davecgh/go-spew/spew:go_default_library", - "//vendor/sigs.k8s.io/yaml:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/naming/BUILD b/vendor/k8s.io/apimachinery/pkg/util/naming/BUILD deleted file mode 100644 index d9046784cc7c..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/naming/BUILD +++ /dev/null @@ -1,29 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["from_stack.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/naming", - importpath = "k8s.io/apimachinery/pkg/util/naming", - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["from_stack_test.go"], - embed = [":go_default_library"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/net/BUILD b/vendor/k8s.io/apimachinery/pkg/util/net/BUILD deleted file mode 100644 index a6d63ea11d46..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/net/BUILD +++ /dev/null @@ -1,56 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "http_test.go", - "interface_test.go", - "port_range_test.go", - "port_split_test.go", - "util_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/github.com/spf13/pflag:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "http.go", - "interface.go", - "port_range.go", - "port_split.go", - "util.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/net", - importpath = "k8s.io/apimachinery/pkg/util/net", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/golang.org/x/net/http2:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/net/http.go b/vendor/k8s.io/apimachinery/pkg/util/net/http.go index ba63d02df69a..ce69b8054b51 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/net/http.go +++ b/vendor/k8s.io/apimachinery/pkg/util/net/http.go @@ -131,7 +131,7 @@ func SetTransportDefaults(t *http.Transport) *http.Transport { t = SetOldTransportDefaults(t) // Allow clients to disable http2 if needed. if s := os.Getenv("DISABLE_HTTP2"); len(s) > 0 { - klog.Infof("HTTP2 has been explicitly disabled") + klog.Info("HTTP2 has been explicitly disabled") } else if allowsHTTP2(t) { if err := configureHTTP2Transport(t); err != nil { klog.Warningf("Transport failed http2 configuration: %v", err) @@ -693,7 +693,7 @@ func parseQuotedString(quotedString string) (string, string, error) { var remainder string escaping := false closedQuote := false - result := &bytes.Buffer{} + result := &strings.Builder{} loop: for i := 0; i < len(quotedString); i++ { b := quotedString[i] diff --git a/vendor/k8s.io/apimachinery/pkg/util/net/interface.go b/vendor/k8s.io/apimachinery/pkg/util/net/interface.go index 204e223caf04..9adf4cfe477a 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/net/interface.go +++ b/vendor/k8s.io/apimachinery/pkg/util/net/interface.go @@ -266,6 +266,36 @@ func getIPFromInterface(intfName string, forFamily AddressFamily, nw networkInte return nil, nil } +// getIPFromLoopbackInterface gets the IPs on a loopback interface and returns a global unicast address, if any. +// The loopback interface must be up, the IP must in the family requested, and the IP must be a global unicast address. +func getIPFromLoopbackInterface(forFamily AddressFamily, nw networkInterfacer) (net.IP, error) { + intfs, err := nw.Interfaces() + if err != nil { + return nil, err + } + for _, intf := range intfs { + if !isInterfaceUp(&intf) { + continue + } + if intf.Flags&(net.FlagLoopback) != 0 { + addrs, err := nw.Addrs(&intf) + if err != nil { + return nil, err + } + klog.V(4).Infof("Interface %q has %d addresses :%v.", intf.Name, len(addrs), addrs) + matchingIP, err := getMatchingGlobalIP(addrs, forFamily) + if err != nil { + return nil, err + } + if matchingIP != nil { + klog.V(4).Infof("Found valid IPv%d address %v for interface %q.", int(forFamily), matchingIP, intf.Name) + return matchingIP, nil + } + } + } + return nil, nil +} + // memberOf tells if the IP is of the desired family. Used for checking interface addresses. func memberOf(ip net.IP, family AddressFamily) bool { if ip.To4() != nil { @@ -393,8 +423,9 @@ func getAllDefaultRoutes() ([]Route, error) { } // chooseHostInterfaceFromRoute cycles through each default route provided, looking for a -// global IP address from the interface for the route. addressFamilies determines whether it -// prefers IPv4 or IPv6 +// global IP address from the interface for the route. If there are routes but no global +// address is obtained from the interfaces, it checks if the loopback interface has a global address. +// addressFamilies determines whether it prefers IPv4 or IPv6 func chooseHostInterfaceFromRoute(routes []Route, nw networkInterfacer, addressFamilies AddressFamilyPreference) (net.IP, error) { for _, family := range addressFamilies { klog.V(4).Infof("Looking for default routes with IPv%d addresses", uint(family)) @@ -411,6 +442,17 @@ func chooseHostInterfaceFromRoute(routes []Route, nw networkInterfacer, addressF klog.V(4).Infof("Found active IP %v ", finalIP) return finalIP, nil } + // In case of network setups where default routes are present, but network + // interfaces use only link-local addresses (e.g. as described in RFC5549). + // the global IP is assigned to the loopback interface, and we should use it + loopbackIP, err := getIPFromLoopbackInterface(family, nw) + if err != nil { + return nil, err + } + if loopbackIP != nil { + klog.V(4).Infof("Found active IP %v on Loopback interface", loopbackIP) + return loopbackIP, nil + } } } klog.V(4).Infof("No active IP found by looking at default routes") diff --git a/vendor/k8s.io/apimachinery/pkg/util/proxy/BUILD b/vendor/k8s.io/apimachinery/pkg/util/proxy/BUILD deleted file mode 100644 index fc08cc28eae1..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/proxy/BUILD +++ /dev/null @@ -1,62 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "dial_test.go", - "transport_test.go", - "upgradeaware_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - "//vendor/golang.org/x/net/websocket:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "dial.go", - "doc.go", - "transport.go", - "upgradeaware.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/proxy", - importpath = "k8s.io/apimachinery/pkg/util/proxy", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/third_party/forked/golang/netutil:go_default_library", - "//vendor/github.com/mxk/go-flowrate/flowrate:go_default_library", - "//vendor/golang.org/x/net/html:go_default_library", - "//vendor/golang.org/x/net/html/atom:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/proxy/dial.go b/vendor/k8s.io/apimachinery/pkg/util/proxy/dial.go index 7b0704f596fb..5042981c5dc3 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/proxy/dial.go +++ b/vendor/k8s.io/apimachinery/pkg/util/proxy/dial.go @@ -69,7 +69,7 @@ func dialURL(ctx context.Context, url *url.URL, transport http.RoundTripper) (ne } if tlsConfig == nil { // tls.Client requires non-nil config - klog.Warningf("using custom dialer with no TLSClientConfig. Defaulting to InsecureSkipVerify") + klog.Warning("using custom dialer with no TLSClientConfig. Defaulting to InsecureSkipVerify") // tls.Handshake() requires ServerName or InsecureSkipVerify tlsConfig = &tls.Config{ InsecureSkipVerify: true, diff --git a/vendor/k8s.io/apimachinery/pkg/util/proxy/transport.go b/vendor/k8s.io/apimachinery/pkg/util/proxy/transport.go index cf8023da7836..28c654676eef 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/proxy/transport.go +++ b/vendor/k8s.io/apimachinery/pkg/util/proxy/transport.go @@ -32,6 +32,7 @@ import ( "golang.org/x/net/html/atom" "k8s.io/klog/v2" + "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/util/net" "k8s.io/apimachinery/pkg/util/sets" ) @@ -101,7 +102,7 @@ func (t *Transport) RoundTrip(req *http.Request) (*http.Response, error) { resp, err := rt.RoundTrip(req) if err != nil { - return nil, fmt.Errorf("error trying to reach service: %w", err) + return nil, errors.NewServiceUnavailable(fmt.Sprintf("error trying to reach service: %v", err)) } if redirect := resp.Header.Get("Location"); redirect != "" { diff --git a/vendor/k8s.io/apimachinery/pkg/util/proxy/upgradeaware.go b/vendor/k8s.io/apimachinery/pkg/util/proxy/upgradeaware.go index 43f528d9cd6a..8ef16eeb63fc 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/proxy/upgradeaware.go +++ b/vendor/k8s.io/apimachinery/pkg/util/proxy/upgradeaware.go @@ -74,6 +74,12 @@ type UpgradeAwareHandler struct { RequireSameHostRedirects bool // UseRequestLocation will use the incoming request URL when talking to the backend server. UseRequestLocation bool + // UseLocationHost overrides the HTTP host header in requests to the backend server to use the Host from Location. + // This will override the req.Host field of a request, while UseRequestLocation will override the req.URL field + // of a request. The req.URL.Host specifies the server to connect to, while the req.Host field + // specifies the Host header value to send in the HTTP request. If this is false, the incoming req.Host header will + // just be forwarded to the backend server. + UseLocationHost bool // FlushInterval controls how often the standard HTTP proxy will flush content from the upstream. FlushInterval time.Duration // MaxBytesPerSec controls the maximum rate for an upstream connection. No rate is imposed if the value is zero. @@ -227,6 +233,11 @@ func (h *UpgradeAwareHandler) ServeHTTP(w http.ResponseWriter, req *http.Request if !h.UseRequestLocation { newReq.URL = &loc } + if h.UseLocationHost { + // exchanging req.Host with the backend location is necessary for backends that act on the HTTP host header (e.g. API gateways), + // because req.Host has preference over req.URL.Host in filling this header field + newReq.Host = h.Location.Host + } proxy := httputil.NewSingleHostReverseProxy(&url.URL{Scheme: h.Location.Scheme, Host: h.Location.Host}) proxy.Transport = h.Transport @@ -282,6 +293,9 @@ func (h *UpgradeAwareHandler) tryUpgrade(w http.ResponseWriter, req *http.Reques backendConn, rawResponse, err = utilnet.ConnectWithRedirects(req.Method, &location, clone.Header, req.Body, utilnet.DialerFunc(h.DialForUpgrade), h.RequireSameHostRedirects) } else { klog.V(6).Infof("Connecting to backend proxy (direct dial) %s\n Headers: %v", &location, clone.Header) + if h.UseLocationHost { + clone.Host = h.Location.Host + } clone.URL = &location backendConn, err = h.DialForUpgrade(clone) } diff --git a/vendor/k8s.io/apimachinery/pkg/util/rand/BUILD b/vendor/k8s.io/apimachinery/pkg/util/rand/BUILD deleted file mode 100644 index 46e73b0369f7..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/rand/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["rand_test.go"], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = ["rand.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/rand", - importpath = "k8s.io/apimachinery/pkg/util/rand", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/remotecommand/BUILD b/vendor/k8s.io/apimachinery/pkg/util/remotecommand/BUILD deleted file mode 100644 index 2997f51a1078..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/remotecommand/BUILD +++ /dev/null @@ -1,27 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["constants.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/remotecommand", - importpath = "k8s.io/apimachinery/pkg/util/remotecommand", - deps = ["//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/runtime/BUILD b/vendor/k8s.io/apimachinery/pkg/util/runtime/BUILD deleted file mode 100644 index 0c4d6b5037ff..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/runtime/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["runtime_test.go"], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = ["runtime.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/runtime", - importpath = "k8s.io/apimachinery/pkg/util/runtime", - deps = ["//vendor/k8s.io/klog/v2:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/sets/BUILD b/vendor/k8s.io/apimachinery/pkg/util/sets/BUILD deleted file mode 100644 index 24e30d001706..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/sets/BUILD +++ /dev/null @@ -1,74 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load("@io_k8s_repo_infra//defs:go.bzl", "go_genrule") -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "byte.go", - "doc.go", - "empty.go", - "int.go", - "int32.go", - "int64.go", - "string.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/sets", - importpath = "k8s.io/apimachinery/pkg/util/sets", -) - -# This rule makes all sorts of terrible assumptions that it's running inside k8s.io/kubernetes, even though it's part of k8s.io/apimachinery. :\ -go_genrule( - name = "set-gen", - srcs = [ - "//hack/boilerplate:boilerplate.generatego.txt", - ], - outs = [ - "byte.go", - "doc.go", - "empty.go", - "int.go", - "int64.go", - "string.go", - ], - cmd = """ -$(location //vendor/k8s.io/code-generator/cmd/set-gen) \ - --input-dirs k8s.io/apimachinery/pkg/util/sets/types \ - --output-base $$(dirname $$(dirname $(location :byte.go))) \ - --go-header-file $(location //hack/boilerplate:boilerplate.generatego.txt) \ - --output-package sets - """, - go_deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/sets/types:go_default_library", - ], - tools = [ - "//vendor/k8s.io/code-generator/cmd/set-gen", - ], -) - -go_test( - name = "go_default_test", - srcs = ["set_test.go"], - embed = [":go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apimachinery/pkg/util/sets/types:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/BUILD b/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/BUILD deleted file mode 100644 index 5e3c9b419ed9..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/BUILD +++ /dev/null @@ -1,61 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["patch_test.go"], - data = [ - "testdata/swagger-merge-item.json", - "testdata/swagger-precision-item.json", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/json:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/mergepatch:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/strategicpatch/testing:go_default_library", - "//vendor/github.com/davecgh/go-spew/spew:go_default_library", - "//vendor/sigs.k8s.io/yaml:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "errors.go", - "meta.go", - "patch.go", - "types.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/strategicpatch", - importpath = "k8s.io/apimachinery/pkg/util/strategicpatch", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/json:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/mergepatch:go_default_library", - "//staging/src/k8s.io/apimachinery/third_party/forked/golang/json:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/util/proto:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apimachinery/pkg/util/strategicpatch/testing:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/uuid/BUILD b/vendor/k8s.io/apimachinery/pkg/util/uuid/BUILD deleted file mode 100644 index 33dc2c8f1fb7..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/uuid/BUILD +++ /dev/null @@ -1,30 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["uuid.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/uuid", - importpath = "k8s.io/apimachinery/pkg/util/uuid", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/github.com/google/uuid:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/validation/BUILD b/vendor/k8s.io/apimachinery/pkg/util/validation/BUILD deleted file mode 100644 index a28ee93e0b6a..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/validation/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["validation_test.go"], - embed = [":go_default_library"], - deps = ["//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = ["validation.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/validation", - importpath = "k8s.io/apimachinery/pkg/util/validation", - deps = ["//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/validation/field/BUILD b/vendor/k8s.io/apimachinery/pkg/util/validation/field/BUILD deleted file mode 100644 index ee8d60c09c92..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/validation/field/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "errors_test.go", - "path_test.go", - ], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = [ - "errors.go", - "path.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/validation/field", - importpath = "k8s.io/apimachinery/pkg/util/validation/field", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/validation/field/path.go b/vendor/k8s.io/apimachinery/pkg/util/validation/field/path.go index f9be7ac3391b..daccb0589030 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/validation/field/path.go +++ b/vendor/k8s.io/apimachinery/pkg/util/validation/field/path.go @@ -22,6 +22,29 @@ import ( "strconv" ) +type pathOptions struct { + path *Path +} + +// PathOption modifies a pathOptions +type PathOption func(o *pathOptions) + +// WithPath generates a PathOption +func WithPath(p *Path) PathOption { + return func(o *pathOptions) { + o.path = p + } +} + +// ToPath produces *Path from a set of PathOption +func ToPath(opts ...PathOption) *Path { + c := &pathOptions{} + for _, opt := range opts { + opt(c) + } + return c.path +} + // Path represents the path from some root to a particular field. type Path struct { name string // the name of this field or "" if this is an index diff --git a/vendor/k8s.io/apimachinery/pkg/util/version/BUILD b/vendor/k8s.io/apimachinery/pkg/util/version/BUILD deleted file mode 100644 index cb2162de6929..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/version/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "version.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/version", - importpath = "k8s.io/apimachinery/pkg/util/version", -) - -go_test( - name = "go_default_test", - srcs = ["version_test.go"], - embed = [":go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/wait/BUILD b/vendor/k8s.io/apimachinery/pkg/util/wait/BUILD deleted file mode 100644 index de7957e34761..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/wait/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["wait_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "wait.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/wait", - importpath = "k8s.io/apimachinery/pkg/util/wait", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/waitgroup/BUILD b/vendor/k8s.io/apimachinery/pkg/util/waitgroup/BUILD deleted file mode 100644 index a17ac933a427..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/waitgroup/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "waitgroup.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/waitgroup", - importpath = "k8s.io/apimachinery/pkg/util/waitgroup", - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["waitgroup_test.go"], - embed = [":go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/yaml/BUILD b/vendor/k8s.io/apimachinery/pkg/util/yaml/BUILD deleted file mode 100644 index cb3c98e6f21e..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/yaml/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["decoder_test.go"], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = ["decoder.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/yaml", - importpath = "k8s.io/apimachinery/pkg/util/yaml", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/json:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/sigs.k8s.io/yaml:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/yaml/decoder.go b/vendor/k8s.io/apimachinery/pkg/util/yaml/decoder.go index 7fe70646770c..612d63a6948a 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/yaml/decoder.go +++ b/vendor/k8s.io/apimachinery/pkg/util/yaml/decoder.go @@ -22,13 +22,11 @@ import ( "encoding/json" "fmt" "io" - "io/ioutil" "strings" "unicode" jsonutil "k8s.io/apimachinery/pkg/util/json" - "k8s.io/klog/v2" "sigs.k8s.io/yaml" ) @@ -215,16 +213,15 @@ type YAMLOrJSONDecoder struct { bufferSize int decoder decoder - rawData []byte } type JSONSyntaxError struct { - Line int - Err error + Offset int64 + Err error } func (e JSONSyntaxError) Error() string { - return fmt.Sprintf("json: line %d: %s", e.Line, e.Err.Error()) + return fmt.Sprintf("json: offset %d: %s", e.Offset, e.Err.Error()) } type YAMLSyntaxError struct { @@ -250,35 +247,18 @@ func NewYAMLOrJSONDecoder(r io.Reader, bufferSize int) *YAMLOrJSONDecoder { // provide object, or returns an error. func (d *YAMLOrJSONDecoder) Decode(into interface{}) error { if d.decoder == nil { - buffer, origData, isJSON := GuessJSONStream(d.r, d.bufferSize) + buffer, _, isJSON := GuessJSONStream(d.r, d.bufferSize) if isJSON { d.decoder = json.NewDecoder(buffer) - d.rawData = origData } else { d.decoder = NewYAMLToJSONDecoder(buffer) } } err := d.decoder.Decode(into) - if jsonDecoder, ok := d.decoder.(*json.Decoder); ok { - if syntax, ok := err.(*json.SyntaxError); ok { - data, readErr := ioutil.ReadAll(jsonDecoder.Buffered()) - if readErr != nil { - klog.V(4).Infof("reading stream failed: %v", readErr) - } - js := string(data) - - // if contents from io.Reader are not complete, - // use the original raw data to prevent panic - if int64(len(js)) <= syntax.Offset { - js = string(d.rawData) - } - - start := strings.LastIndex(js[:syntax.Offset], "\n") + 1 - line := strings.Count(js[:start], "\n") - return JSONSyntaxError{ - Line: line, - Err: fmt.Errorf(syntax.Error()), - } + if syntax, ok := err.(*json.SyntaxError); ok { + return JSONSyntaxError{ + Offset: syntax.Offset, + Err: syntax, } } return err @@ -363,6 +343,12 @@ func GuessJSONStream(r io.Reader, size int) (io.Reader, []byte, bool) { return buffer, b, hasJSONPrefix(b) } +// IsJSONBuffer scans the provided buffer, looking +// for an open brace indicating this is JSON. +func IsJSONBuffer(buf []byte) bool { + return hasJSONPrefix(buf) +} + var jsonPrefix = []byte("{") // hasJSONPrefix returns true if the provided buffer appears to start with diff --git a/vendor/k8s.io/apimachinery/pkg/version/BUILD b/vendor/k8s.io/apimachinery/pkg/version/BUILD deleted file mode 100644 index 95435cb72fc6..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/version/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "helpers.go", - "types.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/version", - importpath = "k8s.io/apimachinery/pkg/version", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["helpers_test.go"], - embed = [":go_default_library"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/watch/BUILD b/vendor/k8s.io/apimachinery/pkg/watch/BUILD deleted file mode 100644 index e2406b0c1b24..000000000000 --- a/vendor/k8s.io/apimachinery/pkg/watch/BUILD +++ /dev/null @@ -1,57 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "filter.go", - "mux.go", - "streamwatcher.go", - "watch.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/watch", - importpath = "k8s.io/apimachinery/pkg/watch", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "filter_test.go", - "mux_test.go", - "streamwatcher_test.go", - "watch_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/watch/mux.go b/vendor/k8s.io/apimachinery/pkg/watch/mux.go index 0aaf01adce68..e01d519060b0 100644 --- a/vendor/k8s.io/apimachinery/pkg/watch/mux.go +++ b/vendor/k8s.io/apimachinery/pkg/watch/mux.go @@ -74,6 +74,22 @@ func NewBroadcaster(queueLength int, fullChannelBehavior FullChannelBehavior) *B return m } +// NewLongQueueBroadcaster functions nearly identically to NewBroadcaster, +// except that the incoming queue is the same size as the outgoing queues +// (specified by queueLength). +func NewLongQueueBroadcaster(queueLength int, fullChannelBehavior FullChannelBehavior) *Broadcaster { + m := &Broadcaster{ + watchers: map[int64]*broadcasterWatcher{}, + incoming: make(chan Event, queueLength), + stopped: make(chan struct{}), + watchQueueLength: queueLength, + fullChannelBehavior: fullChannelBehavior, + } + m.distributing.Add(1) + go m.loop() + return m +} + const internalRunFunctionMarker = "internal-do-function" // a function type we can shoehorn into the queue. @@ -198,6 +214,18 @@ func (m *Broadcaster) Action(action EventType, obj runtime.Object) { m.incoming <- Event{action, obj} } +// Action distributes the given event among all watchers, or drops it on the floor +// if too many incoming actions are queued up. Returns true if the action was sent, +// false if dropped. +func (m *Broadcaster) ActionOrDrop(action EventType, obj runtime.Object) bool { + select { + case m.incoming <- Event{action, obj}: + return true + default: + return false + } +} + // Shutdown disconnects all watchers (but any queued events will still be distributed). // You must not call Action or Watch* after calling Shutdown. This call blocks // until all events have been distributed through the outbound channels. Note diff --git a/vendor/k8s.io/apimachinery/pkg/watch/streamwatcher.go b/vendor/k8s.io/apimachinery/pkg/watch/streamwatcher.go index 99f6770b919a..42dcac2b9e6f 100644 --- a/vendor/k8s.io/apimachinery/pkg/watch/streamwatcher.go +++ b/vendor/k8s.io/apimachinery/pkg/watch/streamwatcher.go @@ -55,7 +55,7 @@ type StreamWatcher struct { source Decoder reporter Reporter result chan Event - stopped bool + done chan struct{} } // NewStreamWatcher creates a StreamWatcher from the given decoder. @@ -67,6 +67,11 @@ func NewStreamWatcher(d Decoder, r Reporter) *StreamWatcher { // goroutine/channel, but impossible for them to remove it, // so nonbuffered is better. result: make(chan Event), + // If the watcher is externally stopped there is no receiver anymore + // and the send operations on the result channel, especially the + // error reporting might block forever. + // Therefore a dedicated stop channel is used to resolve this blocking. + done: make(chan struct{}), } go sw.receive() return sw @@ -82,19 +87,15 @@ func (sw *StreamWatcher) Stop() { // Call Close() exactly once by locking and setting a flag. sw.Lock() defer sw.Unlock() - if !sw.stopped { - sw.stopped = true + // closing a closed channel always panics, therefore check before closing + select { + case <-sw.done: + default: + close(sw.done) sw.source.Close() } } -// stopping returns true if Stop() was called previously. -func (sw *StreamWatcher) stopping() bool { - sw.Lock() - defer sw.Unlock() - return sw.stopped -} - // receive reads result from the decoder in a loop and sends down the result channel. func (sw *StreamWatcher) receive() { defer utilruntime.HandleCrash() @@ -103,10 +104,6 @@ func (sw *StreamWatcher) receive() { for { action, obj, err := sw.source.Decode() if err != nil { - // Ignore expected error. - if sw.stopping() { - return - } switch err { case io.EOF: // watch closed normally @@ -116,17 +113,24 @@ func (sw *StreamWatcher) receive() { if net.IsProbableEOF(err) || net.IsTimeout(err) { klog.V(5).Infof("Unable to decode an event from the watch stream: %v", err) } else { - sw.result <- Event{ + select { + case <-sw.done: + case sw.result <- Event{ Type: Error, Object: sw.reporter.AsObject(fmt.Errorf("unable to decode an event from the watch stream: %v", err)), + }: } } } return } - sw.result <- Event{ + select { + case <-sw.done: + return + case sw.result <- Event{ Type: action, Object: obj, + }: } } } diff --git a/vendor/k8s.io/apimachinery/third_party/forked/golang/json/BUILD b/vendor/k8s.io/apimachinery/third_party/forked/golang/json/BUILD deleted file mode 100644 index 6dc06d4e3099..000000000000 --- a/vendor/k8s.io/apimachinery/third_party/forked/golang/json/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["fields.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/third_party/forked/golang/json", - importpath = "k8s.io/apimachinery/third_party/forked/golang/json", -) - -go_test( - name = "go_default_test", - srcs = ["fields_test.go"], - embed = [":go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/third_party/forked/golang/netutil/BUILD b/vendor/k8s.io/apimachinery/third_party/forked/golang/netutil/BUILD deleted file mode 100644 index acc180d5cc7c..000000000000 --- a/vendor/k8s.io/apimachinery/third_party/forked/golang/netutil/BUILD +++ /dev/null @@ -1,26 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["addr.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/third_party/forked/golang/netutil", - importpath = "k8s.io/apimachinery/third_party/forked/golang/netutil", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/third_party/forked/golang/reflect/BUILD b/vendor/k8s.io/apimachinery/third_party/forked/golang/reflect/BUILD deleted file mode 100644 index 0af6d87dbba3..000000000000 --- a/vendor/k8s.io/apimachinery/third_party/forked/golang/reflect/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["deep_equal_test.go"], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = ["deep_equal.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/third_party/forked/golang/reflect", - importpath = "k8s.io/apimachinery/third_party/forked/golang/reflect", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/admission/BUILD b/vendor/k8s.io/apiserver/pkg/admission/BUILD deleted file mode 100644 index bcec0711393a..000000000000 --- a/vendor/k8s.io/apiserver/pkg/admission/BUILD +++ /dev/null @@ -1,86 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "attributes.go", - "audit.go", - "chain.go", - "config.go", - "decorator.go", - "errors.go", - "handler.go", - "interfaces.go", - "plugins.go", - "reinvocation.go", - "util.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/admission", - importpath = "k8s.io/apiserver/pkg/admission", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/apiserver:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/apiserver/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/audit:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/sigs.k8s.io/yaml:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "attributes_test.go", - "audit_test.go", - "chain_test.go", - "config_test.go", - "errors_test.go", - "handler_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/json:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/apiserver:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/apiserver/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/apiserver/v1alpha1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiserver/pkg/admission/configuration:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/admission/initializer:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/admission/metrics:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/namespace/lifecycle:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/admission/testing:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiserver/pkg/admission/configuration/BUILD b/vendor/k8s.io/apiserver/pkg/admission/configuration/BUILD deleted file mode 100644 index 739ed439cea7..000000000000 --- a/vendor/k8s.io/apiserver/pkg/admission/configuration/BUILD +++ /dev/null @@ -1,61 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "configuration_manager_test.go", - "mutating_webhook_manager_test.go", - "validating_webhook_manager_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/admissionregistration/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "configuration_manager.go", - "mutating_webhook_manager.go", - "validating_webhook_manager.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/admission/configuration", - importpath = "k8s.io/apiserver/pkg/admission/configuration", - deps = [ - "//staging/src/k8s.io/api/admissionregistration/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/generic:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/listers/admissionregistration/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/admission/configuration/mutating_webhook_manager.go b/vendor/k8s.io/apiserver/pkg/admission/configuration/mutating_webhook_manager.go index d9b28ad78566..ae57e6739a28 100644 --- a/vendor/k8s.io/apiserver/pkg/admission/configuration/mutating_webhook_manager.go +++ b/vendor/k8s.io/apiserver/pkg/admission/configuration/mutating_webhook_manager.go @@ -36,6 +36,11 @@ type mutatingWebhookConfigurationManager struct { configuration *atomic.Value lister admissionregistrationlisters.MutatingWebhookConfigurationLister hasSynced func() bool + // initialConfigurationSynced stores a boolean value, which tracks if + // the existing webhook configs have been synced (honored) by the + // manager at startup-- the informer has synced and either has no items + // or has finished executing updateConfiguration() once. + initialConfigurationSynced *atomic.Value } var _ generic.Source = &mutatingWebhookConfigurationManager{} @@ -43,13 +48,15 @@ var _ generic.Source = &mutatingWebhookConfigurationManager{} func NewMutatingWebhookConfigurationManager(f informers.SharedInformerFactory) generic.Source { informer := f.Admissionregistration().V1().MutatingWebhookConfigurations() manager := &mutatingWebhookConfigurationManager{ - configuration: &atomic.Value{}, - lister: informer.Lister(), - hasSynced: informer.Informer().HasSynced, + configuration: &atomic.Value{}, + lister: informer.Lister(), + hasSynced: informer.Informer().HasSynced, + initialConfigurationSynced: &atomic.Value{}, } // Start with an empty list manager.configuration.Store([]webhook.WebhookAccessor{}) + manager.initialConfigurationSynced.Store(false) // On any change, rebuild the config informer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ @@ -66,8 +73,27 @@ func (m *mutatingWebhookConfigurationManager) Webhooks() []webhook.WebhookAccess return m.configuration.Load().([]webhook.WebhookAccessor) } +// HasSynced returns true when the manager is synced with existing webhookconfig +// objects at startup-- which means the informer is synced and either has no items +// or updateConfiguration() has completed. func (m *mutatingWebhookConfigurationManager) HasSynced() bool { - return m.hasSynced() + if !m.hasSynced() { + return false + } + if m.initialConfigurationSynced.Load().(bool) { + // the informer has synced and configuration has been updated + return true + } + if configurations, err := m.lister.List(labels.Everything()); err == nil && len(configurations) == 0 { + // the empty list we initially stored is valid to use. + // Setting initialConfigurationSynced to true, so subsequent checks + // would be able to take the fast path on the atomic boolean in a + // cluster without any admission webhooks configured. + m.initialConfigurationSynced.Store(true) + // the informer has synced and we don't have any items + return true + } + return false } func (m *mutatingWebhookConfigurationManager) updateConfiguration() { @@ -77,6 +103,7 @@ func (m *mutatingWebhookConfigurationManager) updateConfiguration() { return } m.configuration.Store(mergeMutatingWebhookConfigurations(configurations)) + m.initialConfigurationSynced.Store(true) } func mergeMutatingWebhookConfigurations(configurations []*v1.MutatingWebhookConfiguration) []webhook.WebhookAccessor { diff --git a/vendor/k8s.io/apiserver/pkg/admission/configuration/validating_webhook_manager.go b/vendor/k8s.io/apiserver/pkg/admission/configuration/validating_webhook_manager.go index 37062b082e1e..b8c1904ea8a1 100644 --- a/vendor/k8s.io/apiserver/pkg/admission/configuration/validating_webhook_manager.go +++ b/vendor/k8s.io/apiserver/pkg/admission/configuration/validating_webhook_manager.go @@ -36,6 +36,11 @@ type validatingWebhookConfigurationManager struct { configuration *atomic.Value lister admissionregistrationlisters.ValidatingWebhookConfigurationLister hasSynced func() bool + // initialConfigurationSynced stores a boolean value, which tracks if + // the existing webhook configs have been synced (honored) by the + // manager at startup-- the informer has synced and either has no items + // or has finished executing updateConfiguration() once. + initialConfigurationSynced *atomic.Value } var _ generic.Source = &validatingWebhookConfigurationManager{} @@ -43,13 +48,15 @@ var _ generic.Source = &validatingWebhookConfigurationManager{} func NewValidatingWebhookConfigurationManager(f informers.SharedInformerFactory) generic.Source { informer := f.Admissionregistration().V1().ValidatingWebhookConfigurations() manager := &validatingWebhookConfigurationManager{ - configuration: &atomic.Value{}, - lister: informer.Lister(), - hasSynced: informer.Informer().HasSynced, + configuration: &atomic.Value{}, + lister: informer.Lister(), + hasSynced: informer.Informer().HasSynced, + initialConfigurationSynced: &atomic.Value{}, } // Start with an empty list manager.configuration.Store([]webhook.WebhookAccessor{}) + manager.initialConfigurationSynced.Store(false) // On any change, rebuild the config informer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ @@ -66,9 +73,28 @@ func (v *validatingWebhookConfigurationManager) Webhooks() []webhook.WebhookAcce return v.configuration.Load().([]webhook.WebhookAccessor) } -// HasSynced returns true if the shared informers have synced. +// HasSynced returns true when the manager is synced with existing webhookconfig +// objects at startup-- which means the informer is synced and either has no items +// or updateConfiguration() has completed. func (v *validatingWebhookConfigurationManager) HasSynced() bool { - return v.hasSynced() + if !v.hasSynced() { + return false + } + if v.initialConfigurationSynced.Load().(bool) { + // the informer has synced and configuration has been updated + return true + } + if configurations, err := v.lister.List(labels.Everything()); err == nil && len(configurations) == 0 { + // the empty list we initially stored is valid to use. + // Setting initialConfigurationSynced to true, so subsequent checks + // would be able to take the fast path on the atomic boolean in a + // cluster without any admission webhooks configured. + v.initialConfigurationSynced.Store(true) + // the informer has synced and we don't have any items + return true + } + return false + } func (v *validatingWebhookConfigurationManager) updateConfiguration() { @@ -78,6 +104,7 @@ func (v *validatingWebhookConfigurationManager) updateConfiguration() { return } v.configuration.Store(mergeValidatingWebhookConfigurations(configurations)) + v.initialConfigurationSynced.Store(true) } func mergeValidatingWebhookConfigurations(configurations []*v1.ValidatingWebhookConfiguration) []webhook.WebhookAccessor { diff --git a/vendor/k8s.io/apiserver/pkg/admission/initializer/BUILD b/vendor/k8s.io/apiserver/pkg/admission/initializer/BUILD deleted file mode 100644 index 575975100b9e..000000000000 --- a/vendor/k8s.io/apiserver/pkg/admission/initializer/BUILD +++ /dev/null @@ -1,51 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "initializer.go", - "interfaces.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/admission/initializer", - importpath = "k8s.io/apiserver/pkg/admission/initializer", - deps = [ - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/quota/v1:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/component-base/featuregate:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["initializer_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/admission/metrics/BUILD b/vendor/k8s.io/apiserver/pkg/admission/metrics/BUILD deleted file mode 100644 index 22036f9b957a..000000000000 --- a/vendor/k8s.io/apiserver/pkg/admission/metrics/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["metrics.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/admission/metrics", - importpath = "k8s.io/apiserver/pkg/admission/metrics", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "metrics_test.go", - "testutil_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - "//staging/src/k8s.io/component-base/metrics/testutil:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiserver/pkg/admission/metrics/metrics.go b/vendor/k8s.io/apiserver/pkg/admission/metrics/metrics.go index c9edb48b4186..82752fe08ccf 100644 --- a/vendor/k8s.io/apiserver/pkg/admission/metrics/metrics.go +++ b/vendor/k8s.io/apiserver/pkg/admission/metrics/metrics.go @@ -54,7 +54,7 @@ var ( ) // ObserverFunc is a func that emits metrics. -type ObserverFunc func(elapsed time.Duration, rejected bool, attr admission.Attributes, stepType string, extraLabels ...string) +type ObserverFunc func(ctx context.Context, elapsed time.Duration, rejected bool, attr admission.Attributes, stepType string, extraLabels ...string) const ( stepValidate = "validate" @@ -96,7 +96,7 @@ func (p pluginHandlerWithMetrics) Admit(ctx context.Context, a admission.Attribu start := time.Now() err := mutatingHandler.Admit(ctx, a, o) - p.observer(time.Since(start), err != nil, a, stepAdmit, p.extraLabels...) + p.observer(ctx, time.Since(start), err != nil, a, stepAdmit, p.extraLabels...) return err } @@ -109,7 +109,7 @@ func (p pluginHandlerWithMetrics) Validate(ctx context.Context, a admission.Attr start := time.Now() err := validatingHandler.Validate(ctx, a, o) - p.observer(time.Since(start), err != nil, a, stepValidate, p.extraLabels...) + p.observer(ctx, time.Since(start), err != nil, a, stepValidate, p.extraLabels...) return err } @@ -163,28 +163,28 @@ func (m *AdmissionMetrics) reset() { } // ObserveAdmissionStep records admission related metrics for a admission step, identified by step type. -func (m *AdmissionMetrics) ObserveAdmissionStep(elapsed time.Duration, rejected bool, attr admission.Attributes, stepType string, extraLabels ...string) { - m.step.observe(elapsed, append(extraLabels, stepType, string(attr.GetOperation()), strconv.FormatBool(rejected))...) +func (m *AdmissionMetrics) ObserveAdmissionStep(ctx context.Context, elapsed time.Duration, rejected bool, attr admission.Attributes, stepType string, extraLabels ...string) { + m.step.observe(ctx, elapsed, append(extraLabels, stepType, string(attr.GetOperation()), strconv.FormatBool(rejected))...) } // ObserveAdmissionController records admission related metrics for a built-in admission controller, identified by it's plugin handler name. -func (m *AdmissionMetrics) ObserveAdmissionController(elapsed time.Duration, rejected bool, attr admission.Attributes, stepType string, extraLabels ...string) { - m.controller.observe(elapsed, append(extraLabels, stepType, string(attr.GetOperation()), strconv.FormatBool(rejected))...) +func (m *AdmissionMetrics) ObserveAdmissionController(ctx context.Context, elapsed time.Duration, rejected bool, attr admission.Attributes, stepType string, extraLabels ...string) { + m.controller.observe(ctx, elapsed, append(extraLabels, stepType, string(attr.GetOperation()), strconv.FormatBool(rejected))...) } // ObserveWebhook records admission related metrics for a admission webhook. -func (m *AdmissionMetrics) ObserveWebhook(elapsed time.Duration, rejected bool, attr admission.Attributes, stepType string, extraLabels ...string) { - m.webhook.observe(elapsed, append(extraLabels, stepType, string(attr.GetOperation()), strconv.FormatBool(rejected))...) +func (m *AdmissionMetrics) ObserveWebhook(ctx context.Context, elapsed time.Duration, rejected bool, attr admission.Attributes, stepType string, extraLabels ...string) { + m.webhook.observe(ctx, elapsed, append(extraLabels, stepType, string(attr.GetOperation()), strconv.FormatBool(rejected))...) } // ObserveWebhookRejection records admission related metrics for an admission webhook rejection. -func (m *AdmissionMetrics) ObserveWebhookRejection(name, stepType, operation string, errorType WebhookRejectionErrorType, rejectionCode int) { +func (m *AdmissionMetrics) ObserveWebhookRejection(ctx context.Context, name, stepType, operation string, errorType WebhookRejectionErrorType, rejectionCode int) { // We truncate codes greater than 600 to keep the cardinality bounded. // This should be rarely done by a malfunctioning webhook server. if rejectionCode > 600 { rejectionCode = 600 } - m.webhookRejection.WithLabelValues(name, stepType, operation, string(errorType), strconv.Itoa(rejectionCode)).Inc() + m.webhookRejection.WithContext(ctx).WithLabelValues(name, stepType, operation, string(errorType), strconv.Itoa(rejectionCode)).Inc() } type metricSet struct { @@ -242,10 +242,10 @@ func (m *metricSet) reset() { } // Observe records an observed admission event to all metrics in the metricSet. -func (m *metricSet) observe(elapsed time.Duration, labels ...string) { +func (m *metricSet) observe(ctx context.Context, elapsed time.Duration, labels ...string) { elapsedSeconds := elapsed.Seconds() - m.latencies.WithLabelValues(labels...).Observe(elapsedSeconds) + m.latencies.WithContext(ctx).WithLabelValues(labels...).Observe(elapsedSeconds) if m.latenciesSummary != nil { - m.latenciesSummary.WithLabelValues(labels...).Observe(elapsedSeconds) + m.latenciesSummary.WithContext(ctx).WithLabelValues(labels...).Observe(elapsedSeconds) } } diff --git a/vendor/k8s.io/apiserver/pkg/admission/plugin/namespace/lifecycle/BUILD b/vendor/k8s.io/apiserver/pkg/admission/plugin/namespace/lifecycle/BUILD deleted file mode 100644 index c226d8a1bad9..000000000000 --- a/vendor/k8s.io/apiserver/pkg/admission/plugin/namespace/lifecycle/BUILD +++ /dev/null @@ -1,65 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["admission.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/admission/plugin/namespace/lifecycle", - importpath = "k8s.io/apiserver/pkg/admission/plugin/namespace/lifecycle", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/cache:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/initializer:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["admission_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/initializer:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/admission/plugin/namespace/lifecycle/admission.go b/vendor/k8s.io/apiserver/pkg/admission/plugin/namespace/lifecycle/admission.go index be90e0eef545..f619e5f0243a 100644 --- a/vendor/k8s.io/apiserver/pkg/admission/plugin/namespace/lifecycle/admission.go +++ b/vendor/k8s.io/apiserver/pkg/admission/plugin/namespace/lifecycle/admission.go @@ -149,7 +149,7 @@ func (l *Lifecycle) Admit(ctx context.Context, a admission.Attributes, o admissi exists = true } if exists { - klog.V(4).Infof("found %s in cache after waiting", a.GetNamespace()) + klog.V(4).InfoS("Namespace existed in cache after waiting", "namespace", klog.KRef("", a.GetNamespace())) } } @@ -170,7 +170,8 @@ func (l *Lifecycle) Admit(ctx context.Context, a admission.Attributes, o admissi case err != nil: return errors.NewInternalError(err) } - klog.V(4).Infof("found %s via storage lookup", a.GetNamespace()) + + klog.V(4).InfoS("Found namespace via storage lookup", "namespace", klog.KRef("", a.GetNamespace())) } // ensure that we're not trying to create objects in terminating namespaces diff --git a/vendor/k8s.io/apiserver/pkg/admission/plugin/resourcequota/BUILD b/vendor/k8s.io/apiserver/pkg/admission/plugin/resourcequota/BUILD deleted file mode 100644 index 62664170f4fe..000000000000 --- a/vendor/k8s.io/apiserver/pkg/admission/plugin/resourcequota/BUILD +++ /dev/null @@ -1,87 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "admission.go", - "config.go", - "controller.go", - "doc.go", - "resource_access.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/admission/plugin/resourcequota", - importpath = "k8s.io/apiserver/pkg/admission/plugin/resourcequota", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/initializer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/install:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/validation:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/quota/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/quota/v1/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/util/workqueue:go_default_library", - "//vendor/github.com/hashicorp/golang-lru:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "admission_test.go", - "config_test.go", - "resource_access_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//vendor/github.com/hashicorp/golang-lru:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/BUILD b/vendor/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/BUILD deleted file mode 100644 index b93b278f74cb..000000000000 --- a/vendor/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota", - importpath = "k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/install:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1alpha1:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1beta1:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/validation:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/install/BUILD b/vendor/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/install/BUILD deleted file mode 100644 index 5fb0b56ec055..000000000000 --- a/vendor/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/install/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["install.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/install", - importpath = "k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/install", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1alpha1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1beta1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1/BUILD b/vendor/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1/BUILD deleted file mode 100644 index 1b9d8ff61a0e..000000000000 --- a/vendor/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "defaults.go", - "doc.go", - "register.go", - "types.go", - "zz_generated.conversion.go", - "zz_generated.deepcopy.go", - "zz_generated.defaults.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1", - importpath = "k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1alpha1/BUILD b/vendor/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1alpha1/BUILD deleted file mode 100644 index 758a8f0db018..000000000000 --- a/vendor/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1alpha1/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "defaults.go", - "doc.go", - "register.go", - "types.go", - "zz_generated.conversion.go", - "zz_generated.deepcopy.go", - "zz_generated.defaults.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1alpha1", - importpath = "k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1alpha1", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1beta1/BUILD b/vendor/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1beta1/BUILD deleted file mode 100644 index 1698bf3499e1..000000000000 --- a/vendor/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1beta1/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "defaults.go", - "doc.go", - "register.go", - "types.go", - "zz_generated.conversion.go", - "zz_generated.deepcopy.go", - "zz_generated.defaults.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1beta1", - importpath = "k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1beta1", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/validation/BUILD b/vendor/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/validation/BUILD deleted file mode 100644 index baab314f9af0..000000000000 --- a/vendor/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/validation/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["validation.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/validation", - importpath = "k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/validation", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["validation_test.go"], - embed = [":go_default_library"], - deps = ["//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota:go_default_library"], -) diff --git a/vendor/k8s.io/apiserver/pkg/admission/plugin/resourcequota/controller.go b/vendor/k8s.io/apiserver/pkg/admission/plugin/resourcequota/controller.go index 622c7bcfd501..8b0ab85a2f71 100644 --- a/vendor/k8s.io/apiserver/pkg/admission/plugin/resourcequota/controller.go +++ b/vendor/k8s.io/apiserver/pkg/admission/plugin/resourcequota/controller.go @@ -377,7 +377,7 @@ func getMatchedLimitedScopes(evaluator quota.Evaluator, inputObject runtime.Obje for _, limitedResource := range limitedResources { matched, err := evaluator.MatchingScopes(inputObject, limitedResource.MatchScopes) if err != nil { - klog.Errorf("Error while matching limited Scopes: %v", err) + klog.ErrorS(err, "Error while matching limited Scopes") return []corev1.ScopedResourceSelectorRequirement{}, err } for _, scope := range matched { @@ -449,6 +449,8 @@ func CheckRequest(quotas []corev1.ResourceQuota, a admission.Attributes, evaluat match, err := evaluator.Matches(&resourceQuota, inputObject) if err != nil { klog.Errorf("Error occurred while matching resource quota, %v, against input object. Err: %v", resourceQuota, err) + klog.ErrorS(err, "Error occurred while matching resource quota against input object", + "resourceQuota", resourceQuota) return quotas, err } if !match { @@ -510,7 +512,10 @@ func CheckRequest(quotas []corev1.ResourceQuota, a admission.Attributes, evaluat } } - if quota.IsZero(deltaUsage) { + // ignore items in deltaUsage with zero usage + deltaUsage = quota.RemoveZeros(deltaUsage) + // if there is no remaining non-zero usage, short-circuit and return + if len(deltaUsage) == 0 { return quotas, nil } diff --git a/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/BUILD b/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/BUILD deleted file mode 100644 index 835025eb0050..000000000000 --- a/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/BUILD +++ /dev/null @@ -1,56 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["accessors.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook", - importpath = "k8s.io/apiserver/pkg/admission/plugin/webhook", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/admissionregistration/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/webhook:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/config:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/errors:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/generic:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/initializer:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/mutating:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/namespace:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/object:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/request:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/rules:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/testcerts:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/testing:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/util:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/validating:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["accessors_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/admissionregistration/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//vendor/github.com/google/gofuzz:go_default_library", - ], -) diff --git a/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/BUILD b/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/BUILD deleted file mode 100644 index 8848f7d6a7e2..000000000000 --- a/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["kubeconfig.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config", - importpath = "k8s.io/apiserver/pkg/admission/plugin/webhook/config", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/v1alpha1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["kubeconfig_test.go"], - embed = [":go_default_library"], -) diff --git a/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/BUILD b/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/BUILD deleted file mode 100644 index 8f8bfcc1d5d8..000000000000 --- a/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission", - importpath = "k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/install:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/v1:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/v1alpha1:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/v1/BUILD b/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/v1/BUILD deleted file mode 100644 index 01c2ff02cb6a..000000000000 --- a/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/v1/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "types.go", - "zz_generated.conversion.go", - "zz_generated.deepcopy.go", - "zz_generated.defaults.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/v1", - importpath = "k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/v1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/v1alpha1/BUILD b/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/v1alpha1/BUILD deleted file mode 100644 index 599f0421acdd..000000000000 --- a/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/v1alpha1/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "types.go", - "zz_generated.conversion.go", - "zz_generated.deepcopy.go", - "zz_generated.defaults.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/v1alpha1", - importpath = "k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/v1alpha1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/errors/BUILD b/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/errors/BUILD deleted file mode 100644 index 617cac351eee..000000000000 --- a/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/errors/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "statuserror.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/errors", - importpath = "k8s.io/apiserver/pkg/admission/plugin/webhook/errors", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["statuserror_test.go"], - embed = [":go_default_library"], - deps = ["//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/generic/BUILD b/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/generic/BUILD deleted file mode 100644 index 6fd9b8b3b50b..000000000000 --- a/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/generic/BUILD +++ /dev/null @@ -1,73 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "interfaces.go", - "webhook.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/generic", - importpath = "k8s.io/apiserver/pkg/admission/plugin/webhook/generic", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/admission/v1:go_default_library", - "//staging/src/k8s.io/api/admission/v1beta1:go_default_library", - "//staging/src/k8s.io/api/admissionregistration/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/initializer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/config:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/namespace:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/object:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/rules:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/webhook:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = [ - "conversion_test.go", - "webhook_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/admissionregistration/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/namespace:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/object:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/example:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/example/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/example2/v1:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - ], -) diff --git a/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/initializer/BUILD b/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/initializer/BUILD deleted file mode 100644 index 51a68fb2c9f0..000000000000 --- a/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/initializer/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["initializer.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/initializer", - importpath = "k8s.io/apiserver/pkg/admission/plugin/webhook/initializer", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/webhook:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["initializer_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/webhook:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/mutating/BUILD b/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/mutating/BUILD deleted file mode 100644 index 98ce88771065..000000000000 --- a/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/mutating/BUILD +++ /dev/null @@ -1,70 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "dispatcher.go", - "doc.go", - "plugin.go", - "reinvocationcontext.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/mutating", - importpath = "k8s.io/apiserver/pkg/admission/plugin/webhook/mutating", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/admission/v1:go_default_library", - "//staging/src/k8s.io/api/admissionregistration/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/json:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/configuration:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/metrics:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/errors:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/webhook:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/warning:go_default_library", - "//vendor/github.com/evanphx/json-patch:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/trace:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "dispatcher_test.go", - "plugin_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/testing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit:go_default_library", - "//vendor/github.com/evanphx/json-patch:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/mutating/dispatcher.go b/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/mutating/dispatcher.go index 4cf9f3711740..0410d0378595 100644 --- a/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/mutating/dispatcher.go +++ b/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/mutating/dispatcher.go @@ -142,17 +142,17 @@ func (a *mutatingDispatcher) Dispatch(ctx context.Context, attr admission.Attrib case *webhookutil.ErrCallingWebhook: if !ignoreClientCallFailures { rejected = true - admissionmetrics.Metrics.ObserveWebhookRejection(hook.Name, "admit", string(versionedAttr.Attributes.GetOperation()), admissionmetrics.WebhookRejectionCallingWebhookError, 0) + admissionmetrics.Metrics.ObserveWebhookRejection(ctx, hook.Name, "admit", string(versionedAttr.Attributes.GetOperation()), admissionmetrics.WebhookRejectionCallingWebhookError, 0) } case *webhookutil.ErrWebhookRejection: rejected = true - admissionmetrics.Metrics.ObserveWebhookRejection(hook.Name, "admit", string(versionedAttr.Attributes.GetOperation()), admissionmetrics.WebhookRejectionNoError, int(err.Status.ErrStatus.Code)) + admissionmetrics.Metrics.ObserveWebhookRejection(ctx, hook.Name, "admit", string(versionedAttr.Attributes.GetOperation()), admissionmetrics.WebhookRejectionNoError, int(err.Status.ErrStatus.Code)) default: rejected = true - admissionmetrics.Metrics.ObserveWebhookRejection(hook.Name, "admit", string(versionedAttr.Attributes.GetOperation()), admissionmetrics.WebhookRejectionAPIServerInternalError, 0) + admissionmetrics.Metrics.ObserveWebhookRejection(ctx, hook.Name, "admit", string(versionedAttr.Attributes.GetOperation()), admissionmetrics.WebhookRejectionAPIServerInternalError, 0) } } - admissionmetrics.Metrics.ObserveWebhook(time.Since(t), rejected, versionedAttr.Attributes, "admit", hook.Name) + admissionmetrics.Metrics.ObserveWebhook(ctx, time.Since(t), rejected, versionedAttr.Attributes, "admit", hook.Name) if changed { // Patch had changed the object. Prepare to reinvoke all previous webhooks that are eligible for re-invocation. webhookReinvokeCtx.RequireReinvokingPreviouslyInvokedPlugins() diff --git a/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/namespace/BUILD b/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/namespace/BUILD deleted file mode 100644 index b0a4b44f7ff8..000000000000 --- a/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/namespace/BUILD +++ /dev/null @@ -1,53 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "matcher.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/namespace", - importpath = "k8s.io/apiserver/pkg/admission/plugin/webhook/namespace", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["matcher_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/admissionregistration/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/object/BUILD b/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/object/BUILD deleted file mode 100644 index bc5c379e101e..000000000000 --- a/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/object/BUILD +++ /dev/null @@ -1,49 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "matcher.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/object", - importpath = "k8s.io/apiserver/pkg/admission/plugin/webhook/object", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["matcher_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/admissionregistration/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook:go_default_library", - ], -) diff --git a/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/object/matcher.go b/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/object/matcher.go index 773e3e6ee6d6..0dccb5bb3aed 100644 --- a/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/object/matcher.go +++ b/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/object/matcher.go @@ -36,7 +36,7 @@ func matchObject(obj runtime.Object, selector labels.Selector) bool { } accessor, err := meta.Accessor(obj) if err != nil { - klog.V(5).Infof("cannot access metadata of %v: %v", obj, err) + klog.V(5).InfoS("Accessing metadata failed", "object", obj, "err", err) return false } return selector.Matches(labels.Set(accessor.GetLabels())) diff --git a/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/request/BUILD b/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/request/BUILD deleted file mode 100644 index ab40b94dd369..000000000000 --- a/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/request/BUILD +++ /dev/null @@ -1,59 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "admissionreview.go", - "doc.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/request", - importpath = "k8s.io/apiserver/pkg/admission/plugin/webhook/request", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/admission/v1:go_default_library", - "//staging/src/k8s.io/api/admission/v1beta1:go_default_library", - "//staging/src/k8s.io/api/authentication/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/generic:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["admissionreview_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/admission/v1:go_default_library", - "//staging/src/k8s.io/api/admission/v1beta1:go_default_library", - "//staging/src/k8s.io/api/admissionregistration/v1:go_default_library", - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/authentication/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//vendor/github.com/google/go-cmp/cmp:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) diff --git a/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/rules/BUILD b/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/rules/BUILD deleted file mode 100644 index cb9c1a252c36..000000000000 --- a/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/rules/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["rules.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/rules", - importpath = "k8s.io/apiserver/pkg/admission/plugin/webhook/rules", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/admissionregistration/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["rules_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/admissionregistration/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/validating/BUILD b/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/validating/BUILD deleted file mode 100644 index b6a59f7a69e6..000000000000 --- a/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/validating/BUILD +++ /dev/null @@ -1,56 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "dispatcher.go", - "doc.go", - "plugin.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/validating", - importpath = "k8s.io/apiserver/pkg/admission/plugin/webhook/validating", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/admissionregistration/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/configuration:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/metrics:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/errors:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/webhook:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/warning:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/trace:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["plugin_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/testing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/validating/dispatcher.go b/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/validating/dispatcher.go index f065cdf5014c..7a24d52ce572 100644 --- a/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/validating/dispatcher.go +++ b/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/validating/dispatcher.go @@ -109,17 +109,17 @@ func (d *validatingDispatcher) Dispatch(ctx context.Context, attr admission.Attr case *webhookutil.ErrCallingWebhook: if !ignoreClientCallFailures { rejected = true - admissionmetrics.Metrics.ObserveWebhookRejection(hook.Name, "validating", string(versionedAttr.Attributes.GetOperation()), admissionmetrics.WebhookRejectionCallingWebhookError, 0) + admissionmetrics.Metrics.ObserveWebhookRejection(ctx, hook.Name, "validating", string(versionedAttr.Attributes.GetOperation()), admissionmetrics.WebhookRejectionCallingWebhookError, 0) } case *webhookutil.ErrWebhookRejection: rejected = true - admissionmetrics.Metrics.ObserveWebhookRejection(hook.Name, "validating", string(versionedAttr.Attributes.GetOperation()), admissionmetrics.WebhookRejectionNoError, int(err.Status.ErrStatus.Code)) + admissionmetrics.Metrics.ObserveWebhookRejection(ctx, hook.Name, "validating", string(versionedAttr.Attributes.GetOperation()), admissionmetrics.WebhookRejectionNoError, int(err.Status.ErrStatus.Code)) default: rejected = true - admissionmetrics.Metrics.ObserveWebhookRejection(hook.Name, "validating", string(versionedAttr.Attributes.GetOperation()), admissionmetrics.WebhookRejectionAPIServerInternalError, 0) + admissionmetrics.Metrics.ObserveWebhookRejection(ctx, hook.Name, "validating", string(versionedAttr.Attributes.GetOperation()), admissionmetrics.WebhookRejectionAPIServerInternalError, 0) } } - admissionmetrics.Metrics.ObserveWebhook(time.Since(t), rejected, versionedAttr.Attributes, "validating", hook.Name) + admissionmetrics.Metrics.ObserveWebhook(ctx, time.Since(t), rejected, versionedAttr.Attributes, "validating", hook.Name) if err == nil { return } diff --git a/vendor/k8s.io/apiserver/pkg/admission/plugins.go b/vendor/k8s.io/apiserver/pkg/admission/plugins.go index e6da6f4a7fc7..d720d9964e8e 100644 --- a/vendor/k8s.io/apiserver/pkg/admission/plugins.go +++ b/vendor/k8s.io/apiserver/pkg/admission/plugins.go @@ -81,7 +81,7 @@ func (ps *Plugins) Register(name string, plugin Factory) { ps.registry = map[string]Factory{} } - klog.V(1).Infof("Registered admission plugin %q", name) + klog.V(1).InfoS("Registered admission plugin", "plugin", name) ps.registry[name] = plugin } diff --git a/vendor/k8s.io/apiserver/pkg/apis/apiserver/BUILD b/vendor/k8s.io/apiserver/pkg/apis/apiserver/BUILD deleted file mode 100644 index e38489b6cf8c..000000000000 --- a/vendor/k8s.io/apiserver/pkg/apis/apiserver/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/apis/apiserver", - importpath = "k8s.io/apiserver/pkg/apis/apiserver", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiserver/pkg/apis/apiserver/install:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/apis/apiserver/v1:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/apis/apiserver/v1alpha1:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/apis/apiserver/v1beta1:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/apis/apiserver/install/BUILD b/vendor/k8s.io/apiserver/pkg/apis/apiserver/install/BUILD deleted file mode 100644 index fbafca05007a..000000000000 --- a/vendor/k8s.io/apiserver/pkg/apis/apiserver/install/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["install.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/apis/apiserver/install", - importpath = "k8s.io/apiserver/pkg/apis/apiserver/install", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/apiserver:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/apiserver/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/apiserver/v1alpha1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/apiserver/v1beta1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/apis/apiserver/v1/BUILD b/vendor/k8s.io/apiserver/pkg/apis/apiserver/v1/BUILD deleted file mode 100644 index b4da01bc7621..000000000000 --- a/vendor/k8s.io/apiserver/pkg/apis/apiserver/v1/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "types.go", - "zz_generated.conversion.go", - "zz_generated.deepcopy.go", - "zz_generated.defaults.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/apis/apiserver/v1", - importpath = "k8s.io/apiserver/pkg/apis/apiserver/v1", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/apiserver:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/apis/apiserver/v1alpha1/BUILD b/vendor/k8s.io/apiserver/pkg/apis/apiserver/v1alpha1/BUILD deleted file mode 100644 index 97fac2eaa3b2..000000000000 --- a/vendor/k8s.io/apiserver/pkg/apis/apiserver/v1alpha1/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "types.go", - "zz_generated.conversion.go", - "zz_generated.deepcopy.go", - "zz_generated.defaults.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/apis/apiserver/v1alpha1", - importpath = "k8s.io/apiserver/pkg/apis/apiserver/v1alpha1", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/apiserver:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/apis/apiserver/v1beta1/BUILD b/vendor/k8s.io/apiserver/pkg/apis/apiserver/v1beta1/BUILD deleted file mode 100644 index 8b4554d3297c..000000000000 --- a/vendor/k8s.io/apiserver/pkg/apis/apiserver/v1beta1/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "types.go", - "zz_generated.conversion.go", - "zz_generated.deepcopy.go", - "zz_generated.defaults.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/apis/apiserver/v1beta1", - importpath = "k8s.io/apiserver/pkg/apis/apiserver/v1beta1", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/apiserver:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/apis/audit/BUILD b/vendor/k8s.io/apiserver/pkg/apis/audit/BUILD deleted file mode 100644 index 706f160e5dfe..000000000000 --- a/vendor/k8s.io/apiserver/pkg/apis/audit/BUILD +++ /dev/null @@ -1,47 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "helpers.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/apis/audit", - importpath = "k8s.io/apiserver/pkg/apis/audit", - deps = [ - "//staging/src/k8s.io/api/authentication/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiserver/pkg/apis/audit/fuzzer:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/apis/audit/install:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/apis/audit/v1:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/apis/audit/v1alpha1:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/apis/audit/v1beta1:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/apis/audit/validation:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/apis/audit/install/BUILD b/vendor/k8s.io/apiserver/pkg/apis/audit/install/BUILD deleted file mode 100644 index e1ae7c2df860..000000000000 --- a/vendor/k8s.io/apiserver/pkg/apis/audit/install/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["install.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/apis/audit/install", - importpath = "k8s.io/apiserver/pkg/apis/audit/install", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit/v1alpha1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit/v1beta1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["roundtrip_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/apitesting/roundtrip:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit/fuzzer:go_default_library", - ], -) diff --git a/vendor/k8s.io/apiserver/pkg/apis/audit/v1/BUILD b/vendor/k8s.io/apiserver/pkg/apis/audit/v1/BUILD deleted file mode 100644 index a66e56d2edc2..000000000000 --- a/vendor/k8s.io/apiserver/pkg/apis/audit/v1/BUILD +++ /dev/null @@ -1,46 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "zz_generated.conversion.go", - "zz_generated.deepcopy.go", - "zz_generated.defaults.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/apis/audit/v1", - importpath = "k8s.io/apiserver/pkg/apis/audit/v1", - deps = [ - "//staging/src/k8s.io/api/authentication/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiserver/pkg/apis/audit/v1/generated.pb.go b/vendor/k8s.io/apiserver/pkg/apis/audit/v1/generated.pb.go index 3d2f444194b4..c569f506811b 100644 --- a/vendor/k8s.io/apiserver/pkg/apis/audit/v1/generated.pb.go +++ b/vendor/k8s.io/apiserver/pkg/apis/audit/v1/generated.pb.go @@ -1870,7 +1870,7 @@ func (m *Event) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -1919,10 +1919,7 @@ func (m *Event) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2039,10 +2036,7 @@ func (m *EventList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2188,10 +2182,7 @@ func (m *GroupResources) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2497,10 +2488,7 @@ func (m *ObjectReference) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2649,10 +2637,7 @@ func (m *Policy) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2769,10 +2754,7 @@ func (m *PolicyList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3080,10 +3062,7 @@ func (m *PolicyRule) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/BUILD b/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/BUILD deleted file mode 100644 index 69e1faf1b16b..000000000000 --- a/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/BUILD +++ /dev/null @@ -1,59 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "zz_generated.conversion.go", - "zz_generated.deepcopy.go", - "zz_generated.defaults.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1", - importpath = "k8s.io/apiserver/pkg/apis/audit/v1alpha1", - deps = [ - "//staging/src/k8s.io/api/authentication/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["conversion_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit:go_default_library", - ], -) diff --git a/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/doc.go b/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/doc.go index 54a8440eb7e7..ea9194afe8b1 100644 --- a/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/doc.go +++ b/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/doc.go @@ -18,6 +18,7 @@ limitations under the License. // +k8s:protobuf-gen=package // +k8s:conversion-gen=k8s.io/apiserver/pkg/apis/audit // +k8s:openapi-gen=true +// +k8s:prerelease-lifecycle-gen=true // +k8s:defaulter-gen=TypeMeta // +groupName=audit.k8s.io diff --git a/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/generated.pb.go b/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/generated.pb.go index 0b381d424277..4af2810f08b9 100644 --- a/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/generated.pb.go +++ b/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/generated.pb.go @@ -1959,7 +1959,7 @@ func (m *Event) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -2008,10 +2008,7 @@ func (m *Event) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2128,10 +2125,7 @@ func (m *EventList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2277,10 +2271,7 @@ func (m *GroupResources) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2554,10 +2545,7 @@ func (m *ObjectReference) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2706,10 +2694,7 @@ func (m *Policy) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2826,10 +2811,7 @@ func (m *PolicyList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3137,10 +3119,7 @@ func (m *PolicyRule) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/generated.proto b/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/generated.proto index 4d490ff96e37..9b5138ea5465 100644 --- a/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/generated.proto +++ b/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/generated.proto @@ -29,6 +29,8 @@ import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; // Package-wide variables from generator "generated". option go_package = "v1alpha1"; +// DEPRECATED - This group version of Event is deprecated by audit.k8s.io/v1/Event. See the release notes for +// more information. // Event captures all the information that can be included in an API audit log. message Event { // ObjectMeta is included for interoperability with API infrastructure. @@ -174,6 +176,8 @@ message ObjectReference { optional string subresource = 7; } +// DEPRECATED - This group version of Policy is deprecated by audit.k8s.io/v1/Policy. See the release notes for +// more information. // Policy defines the configuration of audit logging, and the rules for how different request // categories are logged. message Policy { diff --git a/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/types.go b/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/types.go index 4b4b7f25c6c3..3e4eca4821a8 100644 --- a/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/types.go +++ b/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/types.go @@ -74,7 +74,12 @@ const ( ) // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +k8s:prerelease-lifecycle-gen:introduced=1.7 +// +k8s:prerelease-lifecycle-gen:deprecated=1.21 +// +k8s:prerelease-lifecycle-gen:replacement=audit.k8s.io,v1,Event +// DEPRECATED - This group version of Event is deprecated by audit.k8s.io/v1/Event. See the release notes for +// more information. // Event captures all the information that can be included in an API audit log. type Event struct { metav1.TypeMeta `json:",inline"` @@ -148,6 +153,9 @@ type Event struct { } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +k8s:prerelease-lifecycle-gen:introduced=1.7 +// +k8s:prerelease-lifecycle-gen:deprecated=1.21 +// +k8s:prerelease-lifecycle-gen:replacement=audit.k8s.io,v1,EventList // EventList is a list of audit Events. type EventList struct { @@ -159,7 +167,12 @@ type EventList struct { } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +k8s:prerelease-lifecycle-gen:introduced=1.7 +// +k8s:prerelease-lifecycle-gen:deprecated=1.21 +// +k8s:prerelease-lifecycle-gen:replacement=audit.k8s.io,v1,Policy +// DEPRECATED - This group version of Policy is deprecated by audit.k8s.io/v1/Policy. See the release notes for +// more information. // Policy defines the configuration of audit logging, and the rules for how different request // categories are logged. type Policy struct { @@ -181,6 +194,9 @@ type Policy struct { } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +k8s:prerelease-lifecycle-gen:introduced=1.7 +// +k8s:prerelease-lifecycle-gen:deprecated=1.21 +// +k8s:prerelease-lifecycle-gen:replacement=audit.k8s.io,v1,PolicyList // PolicyList is a list of audit Policies. type PolicyList struct { diff --git a/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/zz_generated.prerelease-lifecycle.go b/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/zz_generated.prerelease-lifecycle.go new file mode 100644 index 000000000000..1fb3352112b5 --- /dev/null +++ b/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/zz_generated.prerelease-lifecycle.go @@ -0,0 +1,121 @@ +// +build !ignore_autogenerated + +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by prerelease-lifecycle-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + schema "k8s.io/apimachinery/pkg/runtime/schema" +) + +// APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. +func (in *Event) APILifecycleIntroduced() (major, minor int) { + return 1, 7 +} + +// APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. +func (in *Event) APILifecycleDeprecated() (major, minor int) { + return 1, 21 +} + +// APILifecycleReplacement is an autogenerated function, returning the group, version, and kind that should be used instead of this deprecated type. +// It is controlled by "k8s:prerelease-lifecycle-gen:replacement=,," tags in types.go. +func (in *Event) APILifecycleReplacement() schema.GroupVersionKind { + return schema.GroupVersionKind{Group: "audit.k8s.io", Version: "v1", Kind: "Event"} +} + +// APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:removed" tags in types.go or "k8s:prerelease-lifecycle-gen:deprecated" plus three minor. +func (in *Event) APILifecycleRemoved() (major, minor int) { + return 1, 24 +} + +// APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. +func (in *EventList) APILifecycleIntroduced() (major, minor int) { + return 1, 7 +} + +// APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. +func (in *EventList) APILifecycleDeprecated() (major, minor int) { + return 1, 21 +} + +// APILifecycleReplacement is an autogenerated function, returning the group, version, and kind that should be used instead of this deprecated type. +// It is controlled by "k8s:prerelease-lifecycle-gen:replacement=,," tags in types.go. +func (in *EventList) APILifecycleReplacement() schema.GroupVersionKind { + return schema.GroupVersionKind{Group: "audit.k8s.io", Version: "v1", Kind: "EventList"} +} + +// APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:removed" tags in types.go or "k8s:prerelease-lifecycle-gen:deprecated" plus three minor. +func (in *EventList) APILifecycleRemoved() (major, minor int) { + return 1, 24 +} + +// APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. +func (in *Policy) APILifecycleIntroduced() (major, minor int) { + return 1, 7 +} + +// APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. +func (in *Policy) APILifecycleDeprecated() (major, minor int) { + return 1, 21 +} + +// APILifecycleReplacement is an autogenerated function, returning the group, version, and kind that should be used instead of this deprecated type. +// It is controlled by "k8s:prerelease-lifecycle-gen:replacement=,," tags in types.go. +func (in *Policy) APILifecycleReplacement() schema.GroupVersionKind { + return schema.GroupVersionKind{Group: "audit.k8s.io", Version: "v1", Kind: "Policy"} +} + +// APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:removed" tags in types.go or "k8s:prerelease-lifecycle-gen:deprecated" plus three minor. +func (in *Policy) APILifecycleRemoved() (major, minor int) { + return 1, 24 +} + +// APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. +func (in *PolicyList) APILifecycleIntroduced() (major, minor int) { + return 1, 7 +} + +// APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. +func (in *PolicyList) APILifecycleDeprecated() (major, minor int) { + return 1, 21 +} + +// APILifecycleReplacement is an autogenerated function, returning the group, version, and kind that should be used instead of this deprecated type. +// It is controlled by "k8s:prerelease-lifecycle-gen:replacement=,," tags in types.go. +func (in *PolicyList) APILifecycleReplacement() schema.GroupVersionKind { + return schema.GroupVersionKind{Group: "audit.k8s.io", Version: "v1", Kind: "PolicyList"} +} + +// APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:removed" tags in types.go or "k8s:prerelease-lifecycle-gen:deprecated" plus three minor. +func (in *PolicyList) APILifecycleRemoved() (major, minor int) { + return 1, 24 +} diff --git a/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/BUILD b/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/BUILD deleted file mode 100644 index 2ed177947627..000000000000 --- a/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/BUILD +++ /dev/null @@ -1,60 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "zz_generated.conversion.go", - "zz_generated.deepcopy.go", - "zz_generated.defaults.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1", - importpath = "k8s.io/apiserver/pkg/apis/audit/v1beta1", - deps = [ - "//staging/src/k8s.io/api/authentication/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["conversion_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit:go_default_library", - ], -) diff --git a/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/doc.go b/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/doc.go index f3fe61683d8e..5ad5f251aa15 100644 --- a/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/doc.go +++ b/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/doc.go @@ -18,6 +18,7 @@ limitations under the License. // +k8s:protobuf-gen=package // +k8s:conversion-gen=k8s.io/apiserver/pkg/apis/audit // +k8s:openapi-gen=true +// +k8s:prerelease-lifecycle-gen=true // +k8s:defaulter-gen=TypeMeta // +groupName=audit.k8s.io diff --git a/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/generated.pb.go b/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/generated.pb.go index 14870e42944b..0437d71cf56a 100644 --- a/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/generated.pb.go +++ b/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/generated.pb.go @@ -1968,7 +1968,7 @@ func (m *Event) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -2017,10 +2017,7 @@ func (m *Event) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2137,10 +2134,7 @@ func (m *EventList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2286,10 +2280,7 @@ func (m *GroupResources) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2595,10 +2586,7 @@ func (m *ObjectReference) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2747,10 +2735,7 @@ func (m *Policy) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2867,10 +2852,7 @@ func (m *PolicyList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3178,10 +3160,7 @@ func (m *PolicyRule) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/generated.proto b/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/generated.proto index 95bfb8cec54d..0a200b538380 100644 --- a/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/generated.proto +++ b/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/generated.proto @@ -29,6 +29,8 @@ import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; // Package-wide variables from generator "generated". option go_package = "v1beta1"; +// DEPRECATED - This group version of Event is deprecated by audit.k8s.io/v1/Event. See the release notes for +// more information. // Event captures all the information that can be included in an API audit log. message Event { // ObjectMeta is included for interoperability with API infrastructure. @@ -183,6 +185,8 @@ message ObjectReference { optional string subresource = 8; } +// DEPRECATED - This group version of Policy is deprecated by audit.k8s.io/v1/Policy. See the release notes for +// more information. // Policy defines the configuration of audit logging, and the rules for how different request // categories are logged. message Policy { diff --git a/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/types.go b/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/types.go index 0317cf6ec5be..0bf6bfcb98d1 100644 --- a/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/types.go +++ b/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/types.go @@ -67,7 +67,12 @@ const ( ) // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +k8s:prerelease-lifecycle-gen:introduced=1.8 +// +k8s:prerelease-lifecycle-gen:deprecated=1.21 +// +k8s:prerelease-lifecycle-gen:replacement=audit.k8s.io,v1,Event +// DEPRECATED - This group version of Event is deprecated by audit.k8s.io/v1/Event. See the release notes for +// more information. // Event captures all the information that can be included in an API audit log. type Event struct { metav1.TypeMeta `json:",inline"` @@ -144,6 +149,9 @@ type Event struct { } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +k8s:prerelease-lifecycle-gen:introduced=1.8 +// +k8s:prerelease-lifecycle-gen:deprecated=1.21 +// +k8s:prerelease-lifecycle-gen:replacement=audit.k8s.io,v1,EventList // EventList is a list of audit Events. type EventList struct { @@ -155,7 +163,12 @@ type EventList struct { } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +k8s:prerelease-lifecycle-gen:introduced=1.8 +// +k8s:prerelease-lifecycle-gen:deprecated=1.21 +// +k8s:prerelease-lifecycle-gen:replacement=audit.k8s.io,v1,Policy +// DEPRECATED - This group version of Policy is deprecated by audit.k8s.io/v1/Policy. See the release notes for +// more information. // Policy defines the configuration of audit logging, and the rules for how different request // categories are logged. type Policy struct { @@ -177,6 +190,9 @@ type Policy struct { } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +k8s:prerelease-lifecycle-gen:introduced=1.8 +// +k8s:prerelease-lifecycle-gen:deprecated=1.21 +// +k8s:prerelease-lifecycle-gen:replacement=audit.k8s.io,v1,PolicyList // PolicyList is a list of audit Policies. type PolicyList struct { diff --git a/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/zz_generated.prerelease-lifecycle.go b/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/zz_generated.prerelease-lifecycle.go new file mode 100644 index 000000000000..e475d4c2e668 --- /dev/null +++ b/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/zz_generated.prerelease-lifecycle.go @@ -0,0 +1,121 @@ +// +build !ignore_autogenerated + +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by prerelease-lifecycle-gen. DO NOT EDIT. + +package v1beta1 + +import ( + schema "k8s.io/apimachinery/pkg/runtime/schema" +) + +// APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. +func (in *Event) APILifecycleIntroduced() (major, minor int) { + return 1, 8 +} + +// APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. +func (in *Event) APILifecycleDeprecated() (major, minor int) { + return 1, 21 +} + +// APILifecycleReplacement is an autogenerated function, returning the group, version, and kind that should be used instead of this deprecated type. +// It is controlled by "k8s:prerelease-lifecycle-gen:replacement=,," tags in types.go. +func (in *Event) APILifecycleReplacement() schema.GroupVersionKind { + return schema.GroupVersionKind{Group: "audit.k8s.io", Version: "v1", Kind: "Event"} +} + +// APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:removed" tags in types.go or "k8s:prerelease-lifecycle-gen:deprecated" plus three minor. +func (in *Event) APILifecycleRemoved() (major, minor int) { + return 1, 24 +} + +// APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. +func (in *EventList) APILifecycleIntroduced() (major, minor int) { + return 1, 8 +} + +// APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. +func (in *EventList) APILifecycleDeprecated() (major, minor int) { + return 1, 21 +} + +// APILifecycleReplacement is an autogenerated function, returning the group, version, and kind that should be used instead of this deprecated type. +// It is controlled by "k8s:prerelease-lifecycle-gen:replacement=,," tags in types.go. +func (in *EventList) APILifecycleReplacement() schema.GroupVersionKind { + return schema.GroupVersionKind{Group: "audit.k8s.io", Version: "v1", Kind: "EventList"} +} + +// APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:removed" tags in types.go or "k8s:prerelease-lifecycle-gen:deprecated" plus three minor. +func (in *EventList) APILifecycleRemoved() (major, minor int) { + return 1, 24 +} + +// APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. +func (in *Policy) APILifecycleIntroduced() (major, minor int) { + return 1, 8 +} + +// APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. +func (in *Policy) APILifecycleDeprecated() (major, minor int) { + return 1, 21 +} + +// APILifecycleReplacement is an autogenerated function, returning the group, version, and kind that should be used instead of this deprecated type. +// It is controlled by "k8s:prerelease-lifecycle-gen:replacement=,," tags in types.go. +func (in *Policy) APILifecycleReplacement() schema.GroupVersionKind { + return schema.GroupVersionKind{Group: "audit.k8s.io", Version: "v1", Kind: "Policy"} +} + +// APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:removed" tags in types.go or "k8s:prerelease-lifecycle-gen:deprecated" plus three minor. +func (in *Policy) APILifecycleRemoved() (major, minor int) { + return 1, 24 +} + +// APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. +func (in *PolicyList) APILifecycleIntroduced() (major, minor int) { + return 1, 8 +} + +// APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. +func (in *PolicyList) APILifecycleDeprecated() (major, minor int) { + return 1, 21 +} + +// APILifecycleReplacement is an autogenerated function, returning the group, version, and kind that should be used instead of this deprecated type. +// It is controlled by "k8s:prerelease-lifecycle-gen:replacement=,," tags in types.go. +func (in *PolicyList) APILifecycleReplacement() schema.GroupVersionKind { + return schema.GroupVersionKind{Group: "audit.k8s.io", Version: "v1", Kind: "PolicyList"} +} + +// APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:removed" tags in types.go or "k8s:prerelease-lifecycle-gen:deprecated" plus three minor. +func (in *PolicyList) APILifecycleRemoved() (major, minor int) { + return 1, 24 +} diff --git a/vendor/k8s.io/apiserver/pkg/apis/audit/validation/BUILD b/vendor/k8s.io/apiserver/pkg/apis/audit/validation/BUILD deleted file mode 100644 index 3b0799e66abc..000000000000 --- a/vendor/k8s.io/apiserver/pkg/apis/audit/validation/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["validation_test.go"], - embed = [":go_default_library"], - deps = ["//staging/src/k8s.io/apiserver/pkg/apis/audit:go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = ["validation.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/apis/audit/validation", - importpath = "k8s.io/apiserver/pkg/apis/audit/validation", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/apis/config/BUILD b/vendor/k8s.io/apiserver/pkg/apis/config/BUILD deleted file mode 100644 index a39a7e1fd0c2..000000000000 --- a/vendor/k8s.io/apiserver/pkg/apis/config/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/apis/config", - importpath = "k8s.io/apiserver/pkg/apis/config", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiserver/pkg/apis/config/v1:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/apis/config/validation:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiserver/pkg/apis/config/v1/BUILD b/vendor/k8s.io/apiserver/pkg/apis/config/v1/BUILD deleted file mode 100644 index 13593dd7b0c7..000000000000 --- a/vendor/k8s.io/apiserver/pkg/apis/config/v1/BUILD +++ /dev/null @@ -1,48 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "defaults.go", - "doc.go", - "register.go", - "types.go", - "zz_generated.conversion.go", - "zz_generated.deepcopy.go", - "zz_generated.defaults.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/apis/config/v1", - importpath = "k8s.io/apiserver/pkg/apis/config/v1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/config:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["defaults_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/github.com/google/go-cmp/cmp:go_default_library", - ], -) diff --git a/vendor/k8s.io/apiserver/pkg/apis/config/validation/BUILD b/vendor/k8s.io/apiserver/pkg/apis/config/validation/BUILD deleted file mode 100644 index 02aba21384d6..000000000000 --- a/vendor/k8s.io/apiserver/pkg/apis/config/validation/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["validation.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/apis/config/validation", - importpath = "k8s.io/apiserver/pkg/apis/config/validation", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/config:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["validation_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/config:go_default_library", - "//vendor/github.com/google/go-cmp/cmp:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiserver/pkg/apis/flowcontrol/bootstrap/BUILD b/vendor/k8s.io/apiserver/pkg/apis/flowcontrol/bootstrap/BUILD deleted file mode 100644 index a3268d11b1b4..000000000000 --- a/vendor/k8s.io/apiserver/pkg/apis/flowcontrol/bootstrap/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["default.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/apis/flowcontrol/bootstrap", - importpath = "k8s.io/apiserver/pkg/apis/flowcontrol/bootstrap", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/coordination/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/flowcontrol/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/serviceaccount:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiserver/pkg/apis/flowcontrol/bootstrap/default.go b/vendor/k8s.io/apiserver/pkg/apis/flowcontrol/bootstrap/default.go index f3e9a1a7bd3c..a3a1dddc6ff0 100644 --- a/vendor/k8s.io/apiserver/pkg/apis/flowcontrol/bootstrap/default.go +++ b/vendor/k8s.io/apiserver/pkg/apis/flowcontrol/bootstrap/default.go @@ -64,6 +64,7 @@ var ( } SuggestedFlowSchemas = []*flowcontrol.FlowSchema{ SuggestedFlowSchemaSystemNodes, // references "system" priority-level + SuggestedFlowSchemaProbes, // references "exempt" priority-level SuggestedFlowSchemaSystemLeaderElection, // references "leader-election" priority-level SuggestedFlowSchemaWorkloadLeaderElection, // references "leader-election" priority-level SuggestedFlowSchemaKubeControllerManager, // references "workload-high" priority-level @@ -83,7 +84,7 @@ var ( }, ) MandatoryPriorityLevelConfigurationCatchAll = newPriorityLevelConfiguration( - "catch-all", + flowcontrol.PriorityLevelConfigurationNameCatchAll, flowcontrol.PriorityLevelConfigurationSpec{ Type: flowcontrol.PriorityLevelEnablementLimited, Limited: &flowcontrol.LimitedPriorityLevelConfiguration{ @@ -126,8 +127,8 @@ var ( // "catch-all" priority-level only gets a minimal positive share of concurrency and won't be reaching // ideally unless you intentionally deleted the suggested "global-default". MandatoryFlowSchemaCatchAll = newFlowSchema( - "catch-all", - "catch-all", + flowcontrol.FlowSchemaNameCatchAll, + flowcontrol.PriorityLevelConfigurationNameCatchAll, 10000, // matchingPrecedence flowcontrol.FlowDistinguisherMethodByUserType, // distinguisherMethodType flowcontrol.PolicyRulesWithSubjects{ @@ -394,6 +395,19 @@ var ( }, }, ) + // the following flow schema exempts probes + SuggestedFlowSchemaProbes = newFlowSchema( + "probes", "exempt", 2, + "", // distinguisherMethodType + flowcontrol.PolicyRulesWithSubjects{ + Subjects: groups(user.AllUnauthenticated, user.AllAuthenticated), + NonResourceRules: []flowcontrol.NonResourcePolicyRule{ + nonResourceRule( + []string{"get"}, + []string{"/healthz", "/readyz", "/livez"}), + }, + }, + ) ) func newPriorityLevelConfiguration(name string, spec flowcontrol.PriorityLevelConfigurationSpec) *flowcontrol.PriorityLevelConfiguration { diff --git a/vendor/k8s.io/apiserver/pkg/audit/BUILD b/vendor/k8s.io/apiserver/pkg/audit/BUILD deleted file mode 100644 index 0934acb2325e..000000000000 --- a/vendor/k8s.io/apiserver/pkg/audit/BUILD +++ /dev/null @@ -1,80 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "context.go", - "format.go", - "metrics.go", - "request.go", - "scheme.go", - "types.go", - "union.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/audit", - importpath = "k8s.io/apiserver/pkg/audit", - deps = [ - "//staging/src/k8s.io/api/authentication/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit/v1alpha1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit/v1beta1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - "//vendor/github.com/google/uuid:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "request_test.go", - "union_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit:go_default_library", - "//vendor/github.com/google/go-cmp/cmp:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiserver/pkg/audit/event:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/audit/policy:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/audit/metrics.go b/vendor/k8s.io/apiserver/pkg/audit/metrics.go index 96166e65454d..3cf6d8f2a11f 100644 --- a/vendor/k8s.io/apiserver/pkg/audit/metrics.go +++ b/vendor/k8s.io/apiserver/pkg/audit/metrics.go @@ -17,6 +17,7 @@ limitations under the License. package audit import ( + "context" "fmt" auditinternal "k8s.io/apiserver/pkg/apis/audit" @@ -31,7 +32,7 @@ const ( /* * By default, all the following metrics are defined as falling under - * ALPHA stability level https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/20190404-kubernetes-control-plane-metrics-stability.md#stability-classes) + * ALPHA stability level https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/1209-metrics-stability/20190404-kubernetes-control-plane-metrics-stability.md#stability-classes) * * Promoting the stability level of the metric is a responsibility of the component owner, since it * involves explicitly acknowledging support for the metric across multiple releases, in accordance with @@ -84,13 +85,13 @@ func init() { } // ObserveEvent updates the relevant prometheus metrics for the generated audit event. -func ObserveEvent() { - eventCounter.Inc() +func ObserveEvent(ctx context.Context) { + eventCounter.WithContext(ctx).Inc() } // ObservePolicyLevel updates the relevant prometheus metrics with the audit level for a request. -func ObservePolicyLevel(level auditinternal.Level) { - levelCounter.WithLabelValues(string(level)).Inc() +func ObservePolicyLevel(ctx context.Context, level auditinternal.Level) { + levelCounter.WithContext(ctx).WithLabelValues(string(level)).Inc() } // HandlePluginError handles an error that occurred in an audit plugin. This method should only be diff --git a/vendor/k8s.io/apiserver/pkg/audit/policy/BUILD b/vendor/k8s.io/apiserver/pkg/audit/policy/BUILD deleted file mode 100644 index f845fddf995b..000000000000 --- a/vendor/k8s.io/apiserver/pkg/audit/policy/BUILD +++ /dev/null @@ -1,69 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "checker_test.go", - "enforce_test.go", - "reader_test.go", - "util_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/apitesting/fuzzer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit/fuzzer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//staging/src/k8s.io/apiserver/plugin/pkg/audit/webhook:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "checker.go", - "enforce.go", - "reader.go", - "util.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/audit/policy", - importpath = "k8s.io/apiserver/pkg/audit/policy", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit/v1alpha1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit/v1beta1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit/validation:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/audit:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/audit/policy/reader.go b/vendor/k8s.io/apiserver/pkg/audit/policy/reader.go index 81b800fd691b..257375a76df8 100644 --- a/vendor/k8s.io/apiserver/pkg/audit/policy/reader.go +++ b/vendor/k8s.io/apiserver/pkg/audit/policy/reader.go @@ -73,10 +73,15 @@ func LoadPolicyFromBytes(policyDef []byte) (*auditinternal.Policy, error) { } // Ensure the policy file contained an apiVersion and kind. - if !apiGroupVersionSet[schema.GroupVersion{Group: gvk.Group, Version: gvk.Version}] { + gv := schema.GroupVersion{Group: gvk.Group, Version: gvk.Version} + if !apiGroupVersionSet[gv] { return nil, fmt.Errorf("unknown group version field %v in policy", gvk) } + if gv != auditv1.SchemeGroupVersion { + klog.Warningf("%q is deprecated and will be removed in a future release, use %q instead", gv, auditv1.SchemeGroupVersion) + } + if err := validation.ValidatePolicy(policy); err != nil { return nil, err.ToAggregate() } @@ -85,6 +90,7 @@ func LoadPolicyFromBytes(policyDef []byte) (*auditinternal.Policy, error) { if policyCnt == 0 { return nil, fmt.Errorf("loaded illegal policy with 0 rules") } - klog.V(4).Infof("Loaded %d audit policy rules", policyCnt) + + klog.V(4).InfoS("Load audit policy rules success", "policyCnt", policyCnt) return policy, nil } diff --git a/vendor/k8s.io/apiserver/pkg/audit/request.go b/vendor/k8s.io/apiserver/pkg/audit/request.go index f88c196e67a4..182b94a64cf1 100644 --- a/vendor/k8s.io/apiserver/pkg/audit/request.go +++ b/vendor/k8s.io/apiserver/pkg/audit/request.go @@ -23,9 +23,6 @@ import ( "reflect" "time" - "github.com/google/uuid" - "k8s.io/klog/v2" - authnv1 "k8s.io/api/authentication/v1" "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -36,6 +33,10 @@ import ( auditinternal "k8s.io/apiserver/pkg/apis/audit" "k8s.io/apiserver/pkg/authentication/user" "k8s.io/apiserver/pkg/authorization/authorizer" + "k8s.io/apiserver/pkg/endpoints/request" + "k8s.io/klog/v2" + + "github.com/google/uuid" ) const ( @@ -52,14 +53,11 @@ func NewEventFromRequest(req *http.Request, requestReceivedTimestamp time.Time, Level: level, } - // prefer the id from the headers. If not available, create a new one. - // TODO(audit): do we want to forbid the header for non-front-proxy users? - ids := req.Header.Get(auditinternal.HeaderAuditID) - if ids != "" { - ev.AuditID = types.UID(ids) - } else { - ev.AuditID = types.UID(uuid.New().String()) + auditID, found := request.AuditIDFrom(req.Context()) + if !found { + auditID = types.UID(uuid.New().String()) } + ev.AuditID = auditID ips := utilnet.SourceIPs(req) ev.SourceIPs = make([]string, len(ips)) diff --git a/vendor/k8s.io/apiserver/pkg/authentication/authenticator/BUILD b/vendor/k8s.io/apiserver/pkg/authentication/authenticator/BUILD deleted file mode 100644 index a8a5395dc923..000000000000 --- a/vendor/k8s.io/apiserver/pkg/authentication/authenticator/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "audagnostic.go", - "audiences.go", - "interfaces.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/authentication/authenticator", - importpath = "k8s.io/apiserver/pkg/authentication/authenticator", - deps = ["//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = [ - "audagnostic_test.go", - "audiences_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - ], -) diff --git a/vendor/k8s.io/apiserver/pkg/authentication/authenticatorfactory/BUILD b/vendor/k8s.io/apiserver/pkg/authentication/authenticatorfactory/BUILD deleted file mode 100644 index e5ea7a93c44f..000000000000 --- a/vendor/k8s.io/apiserver/pkg/authentication/authenticatorfactory/BUILD +++ /dev/null @@ -1,47 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "delegating.go", - "loopback.go", - "requestheader.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/authentication/authenticatorfactory", - importpath = "k8s.io/apiserver/pkg/authentication/authenticatorfactory", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/group:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/request/anonymous:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/request/bearertoken:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/request/headerrequest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/request/union:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/request/websocket:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/request/x509:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/token/cache:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/token/tokenfile:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/plugin/pkg/authenticator/token/webhook:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/authentication/v1:go_default_library", - "//vendor/github.com/go-openapi/spec:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/authentication/authenticatorfactory/delegating.go b/vendor/k8s.io/apiserver/pkg/authentication/authenticatorfactory/delegating.go index 83697bb5470b..4b7105697dc2 100644 --- a/vendor/k8s.io/apiserver/pkg/authentication/authenticatorfactory/delegating.go +++ b/vendor/k8s.io/apiserver/pkg/authentication/authenticatorfactory/delegating.go @@ -44,6 +44,9 @@ type DelegatingAuthenticatorConfig struct { // TokenAccessReviewClient is a client to do token review. It can be nil. Then every token is ignored. TokenAccessReviewClient authenticationclient.TokenReviewInterface + // TokenAccessReviewTimeout specifies a time limit for requests made by the authorization webhook client. + TokenAccessReviewTimeout time.Duration + // WebhookRetryBackoff specifies the backoff parameters for the authentication webhook retry logic. // This allows us to configure the sleep time at each iteration and the maximum number of retries allowed // before we fail the webhook call in order to limit the fan out that ensues when the system is degraded. @@ -88,7 +91,7 @@ func (c DelegatingAuthenticatorConfig) New() (authenticator.Request, *spec.Secur if c.WebhookRetryBackoff == nil { return nil, nil, errors.New("retry backoff parameters for delegating authentication webhook has not been specified") } - tokenAuth, err := webhooktoken.NewFromInterface(c.TokenAccessReviewClient, c.APIAudiences, *c.WebhookRetryBackoff) + tokenAuth, err := webhooktoken.NewFromInterface(c.TokenAccessReviewClient, c.APIAudiences, *c.WebhookRetryBackoff, c.TokenAccessReviewTimeout) if err != nil { return nil, nil, err } diff --git a/vendor/k8s.io/apiserver/pkg/authentication/group/BUILD b/vendor/k8s.io/apiserver/pkg/authentication/group/BUILD deleted file mode 100644 index 2b28ba406ddd..000000000000 --- a/vendor/k8s.io/apiserver/pkg/authentication/group/BUILD +++ /dev/null @@ -1,48 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "group_adder_test.go", - "token_group_adder_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "authenticated_group_adder.go", - "group_adder.go", - "token_group_adder.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/authentication/group", - importpath = "k8s.io/apiserver/pkg/authentication/group", - deps = [ - "//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/authentication/request/anonymous/BUILD b/vendor/k8s.io/apiserver/pkg/authentication/request/anonymous/BUILD deleted file mode 100644 index 329b92ecc523..000000000000 --- a/vendor/k8s.io/apiserver/pkg/authentication/request/anonymous/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["anonymous_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["anonymous.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/authentication/request/anonymous", - importpath = "k8s.io/apiserver/pkg/authentication/request/anonymous", - deps = [ - "//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/authentication/request/bearertoken/BUILD b/vendor/k8s.io/apiserver/pkg/authentication/request/bearertoken/BUILD deleted file mode 100644 index 83f4f5dcca1c..000000000000 --- a/vendor/k8s.io/apiserver/pkg/authentication/request/bearertoken/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["bearertoken_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["bearertoken.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/authentication/request/bearertoken", - importpath = "k8s.io/apiserver/pkg/authentication/request/bearertoken", - deps = ["//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/authentication/request/headerrequest/BUILD b/vendor/k8s.io/apiserver/pkg/authentication/request/headerrequest/BUILD deleted file mode 100644 index c163c47347ad..000000000000 --- a/vendor/k8s.io/apiserver/pkg/authentication/request/headerrequest/BUILD +++ /dev/null @@ -1,67 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "requestheader_controller_test.go", - "requestheader_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "requestheader.go", - "requestheader_controller.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/authentication/request/headerrequest", - importpath = "k8s.io/apiserver/pkg/authentication/request/headerrequest", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/request/x509:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/client-go/informers/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/util/cert:go_default_library", - "//staging/src/k8s.io/client-go/util/workqueue:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/authentication/request/union/BUILD b/vendor/k8s.io/apiserver/pkg/authentication/request/union/BUILD deleted file mode 100644 index 86f585b52e4e..000000000000 --- a/vendor/k8s.io/apiserver/pkg/authentication/request/union/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["unionauth_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["union.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/authentication/request/union", - importpath = "k8s.io/apiserver/pkg/authentication/request/union", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/authentication/request/websocket/BUILD b/vendor/k8s.io/apiserver/pkg/authentication/request/websocket/BUILD deleted file mode 100644 index 53b8e0f463fc..000000000000 --- a/vendor/k8s.io/apiserver/pkg/authentication/request/websocket/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["protocol.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/authentication/request/websocket", - importpath = "k8s.io/apiserver/pkg/authentication/request/websocket", - deps = [ - "//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/wsstream:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["protocol_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/authentication/request/x509/BUILD b/vendor/k8s.io/apiserver/pkg/authentication/request/x509/BUILD deleted file mode 100644 index dd875239cc04..000000000000 --- a/vendor/k8s.io/apiserver/pkg/authentication/request/x509/BUILD +++ /dev/null @@ -1,57 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["x509_test.go"], - data = [ - "testdata/client-expired.pem", - "testdata/client-valid.pem", - "testdata/intermediate.pem", - "testdata/root.pem", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "verify_options.go", - "x509.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/authentication/request/x509", - importpath = "k8s.io/apiserver/pkg/authentication/request/x509", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/client-go/util/cert:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/authentication/request/x509/x509.go b/vendor/k8s.io/apiserver/pkg/authentication/request/x509/x509.go index 0116391409d1..09177f719b1a 100644 --- a/vendor/k8s.io/apiserver/pkg/authentication/request/x509/x509.go +++ b/vendor/k8s.io/apiserver/pkg/authentication/request/x509/x509.go @@ -35,7 +35,7 @@ import ( /* * By default, the following metric is defined as falling under - * ALPHA stability level https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/20190404-kubernetes-control-plane-metrics-stability.md#stability-classes) + * ALPHA stability level https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/1209-metrics-stability/20190404-kubernetes-control-plane-metrics-stability.md#stability-classes) * * Promoting the stability level of the metric is a responsibility of the component owner, since it * involves explicitly acknowledging support for the metric across multiple releases, in accordance with @@ -149,7 +149,7 @@ func (a *Authenticator) AuthenticateRequest(req *http.Request) (*authenticator.R } remaining := req.TLS.PeerCertificates[0].NotAfter.Sub(time.Now()) - clientCertificateExpirationHistogram.Observe(remaining.Seconds()) + clientCertificateExpirationHistogram.WithContext(req.Context()).Observe(remaining.Seconds()) chains, err := req.TLS.PeerCertificates[0].Verify(optsCopy) if err != nil { return nil, false, fmt.Errorf( diff --git a/vendor/k8s.io/apiserver/pkg/authentication/serviceaccount/BUILD b/vendor/k8s.io/apiserver/pkg/authentication/serviceaccount/BUILD deleted file mode 100644 index 4c9de2e6fcec..000000000000 --- a/vendor/k8s.io/apiserver/pkg/authentication/serviceaccount/BUILD +++ /dev/null @@ -1,46 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["util_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["util.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/authentication/serviceaccount", - importpath = "k8s.io/apiserver/pkg/authentication/serviceaccount", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/authentication/token/cache/BUILD b/vendor/k8s.io/apiserver/pkg/authentication/token/cache/BUILD deleted file mode 100644 index 10c715372ef7..000000000000 --- a/vendor/k8s.io/apiserver/pkg/authentication/token/cache/BUILD +++ /dev/null @@ -1,65 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "cache_test.go", - "cached_token_authenticator_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/audit:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//vendor/github.com/google/go-cmp/cmp:go_default_library", - "//vendor/github.com/google/uuid:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "cache_simple.go", - "cache_striped.go", - "cached_token_authenticator.go", - "stats.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/authentication/token/cache", - importpath = "k8s.io/apiserver/pkg/authentication/token/cache", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/cache:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/audit:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - "//vendor/golang.org/x/sync/singleflight:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/authentication/token/cache/cached_token_authenticator.go b/vendor/k8s.io/apiserver/pkg/authentication/token/cache/cached_token_authenticator.go index a10564f04d93..b0d06a231838 100644 --- a/vendor/k8s.io/apiserver/pkg/authentication/token/cache/cached_token_authenticator.go +++ b/vendor/k8s.io/apiserver/pkg/authentication/token/cache/cached_token_authenticator.go @@ -133,7 +133,7 @@ func (a *cachedTokenAuthenticator) AuthenticateToken(ctx context.Context, token } func (a *cachedTokenAuthenticator) doAuthenticateToken(ctx context.Context, token string) *cacheRecord { - doneAuthenticating := stats.authenticating() + doneAuthenticating := stats.authenticating(ctx) auds, audsOk := authenticator.AudiencesFrom(ctx) @@ -145,7 +145,7 @@ func (a *cachedTokenAuthenticator) doAuthenticateToken(ctx context.Context, toke } // Record cache miss - doneBlocking := stats.blocking() + doneBlocking := stats.blocking(ctx) defer doneBlocking() defer doneAuthenticating(false) @@ -153,7 +153,7 @@ func (a *cachedTokenAuthenticator) doAuthenticateToken(ctx context.Context, toke // always use one place to read and write the output of AuthenticateToken record := &cacheRecord{} - doneFetching := stats.fetching() + doneFetching := stats.fetching(ctx) // We're leaving the request handling stack so we need to handle crashes // ourselves. Log a stack trace and return a 500 if something panics. defer func() { diff --git a/vendor/k8s.io/apiserver/pkg/authentication/token/cache/stats.go b/vendor/k8s.io/apiserver/pkg/authentication/token/cache/stats.go index dbe745718e79..d1b959aa5ed7 100644 --- a/vendor/k8s.io/apiserver/pkg/authentication/token/cache/stats.go +++ b/vendor/k8s.io/apiserver/pkg/authentication/token/cache/stats.go @@ -17,6 +17,7 @@ limitations under the License. package cache import ( + "context" "time" "k8s.io/component-base/metrics" @@ -86,7 +87,7 @@ type statsCollector struct{} var stats = statsCollector{} -func (statsCollector) authenticating() func(hit bool) { +func (statsCollector) authenticating(ctx context.Context) func(hit bool) { start := time.Now() return func(hit bool) { var tag string @@ -98,18 +99,18 @@ func (statsCollector) authenticating() func(hit bool) { latency := time.Since(start) - requestCount.WithLabelValues(tag).Inc() - requestLatency.WithLabelValues(tag).Observe(float64(latency.Milliseconds()) / 1000) + requestCount.WithContext(ctx).WithLabelValues(tag).Inc() + requestLatency.WithContext(ctx).WithLabelValues(tag).Observe(float64(latency.Milliseconds()) / 1000) } } -func (statsCollector) blocking() func() { - activeFetchCount.WithLabelValues(fetchBlockedTag).Inc() - return activeFetchCount.WithLabelValues(fetchBlockedTag).Dec +func (statsCollector) blocking(ctx context.Context) func() { + activeFetchCount.WithContext(ctx).WithLabelValues(fetchBlockedTag).Inc() + return activeFetchCount.WithContext(ctx).WithLabelValues(fetchBlockedTag).Dec } -func (statsCollector) fetching() func(ok bool) { - activeFetchCount.WithLabelValues(fetchInFlightTag).Inc() +func (statsCollector) fetching(ctx context.Context) func(ok bool) { + activeFetchCount.WithContext(ctx).WithLabelValues(fetchInFlightTag).Inc() return func(ok bool) { var tag string if ok { @@ -118,8 +119,8 @@ func (statsCollector) fetching() func(ok bool) { tag = fetchFailedTag } - fetchCount.WithLabelValues(tag).Inc() + fetchCount.WithContext(ctx).WithLabelValues(tag).Inc() - activeFetchCount.WithLabelValues(fetchInFlightTag).Dec() + activeFetchCount.WithContext(ctx).WithLabelValues(fetchInFlightTag).Dec() } } diff --git a/vendor/k8s.io/apiserver/pkg/authentication/token/tokenfile/BUILD b/vendor/k8s.io/apiserver/pkg/authentication/token/tokenfile/BUILD deleted file mode 100644 index 2f2d8fae4bea..000000000000 --- a/vendor/k8s.io/apiserver/pkg/authentication/token/tokenfile/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["tokenfile_test.go"], - embed = [":go_default_library"], - deps = ["//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = ["tokenfile.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/authentication/token/tokenfile", - importpath = "k8s.io/apiserver/pkg/authentication/token/tokenfile", - deps = [ - "//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/authentication/token/union/BUILD b/vendor/k8s.io/apiserver/pkg/authentication/token/union/BUILD deleted file mode 100644 index ccdb9cf10914..000000000000 --- a/vendor/k8s.io/apiserver/pkg/authentication/token/union/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["unionauth_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["union.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/authentication/token/union", - importpath = "k8s.io/apiserver/pkg/authentication/token/union", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/authentication/user/BUILD b/vendor/k8s.io/apiserver/pkg/authentication/user/BUILD deleted file mode 100644 index cd8109d727ce..000000000000 --- a/vendor/k8s.io/apiserver/pkg/authentication/user/BUILD +++ /dev/null @@ -1,29 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "user.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/authentication/user", - importpath = "k8s.io/apiserver/pkg/authentication/user", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/authorization/authorizer/BUILD b/vendor/k8s.io/apiserver/pkg/authorization/authorizer/BUILD deleted file mode 100644 index 6360ac7e5d6a..000000000000 --- a/vendor/k8s.io/apiserver/pkg/authorization/authorizer/BUILD +++ /dev/null @@ -1,30 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "interfaces.go", - "rule.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/authorization/authorizer", - importpath = "k8s.io/apiserver/pkg/authorization/authorizer", - deps = ["//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/authorization/authorizerfactory/BUILD b/vendor/k8s.io/apiserver/pkg/authorization/authorizerfactory/BUILD deleted file mode 100644 index 2d1f1e6c9a2c..000000000000 --- a/vendor/k8s.io/apiserver/pkg/authorization/authorizerfactory/BUILD +++ /dev/null @@ -1,47 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["builtin_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "builtin.go", - "delegating.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/authorization/authorizerfactory", - importpath = "k8s.io/apiserver/pkg/authorization/authorizerfactory", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//staging/src/k8s.io/apiserver/plugin/pkg/authorizer/webhook:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/authorization/v1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/authorization/path/BUILD b/vendor/k8s.io/apiserver/pkg/authorization/path/BUILD deleted file mode 100644 index 4bbbe48ed7f6..000000000000 --- a/vendor/k8s.io/apiserver/pkg/authorization/path/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "path.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/authorization/path", - importpath = "k8s.io/apiserver/pkg/authorization/path", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["path_test.go"], - embed = [":go_default_library"], - deps = ["//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library"], -) diff --git a/vendor/k8s.io/apiserver/pkg/authorization/union/BUILD b/vendor/k8s.io/apiserver/pkg/authorization/union/BUILD deleted file mode 100644 index a5b2c0a5a1a1..000000000000 --- a/vendor/k8s.io/apiserver/pkg/authorization/union/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["union_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["union.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/authorization/union", - importpath = "k8s.io/apiserver/pkg/authorization/union", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/BUILD b/vendor/k8s.io/apiserver/pkg/endpoints/BUILD deleted file mode 100644 index 9cef55b16eaf..000000000000 --- a/vendor/k8s.io/apiserver/pkg/endpoints/BUILD +++ /dev/null @@ -1,124 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "apiserver_test.go", - "audit_test.go", - "installer_test.go", - "patchhandler_test.go", - "watch_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/apitesting/fuzzer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/internalversion/scheme:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/streaming:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/example:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/example/fuzzer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/example/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/audit:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/audit/policy:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/filters:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/handlers:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/handlers/negotiation:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/testing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/features:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/dynamic:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - "//vendor/github.com/emicklei/go-restful:go_default_library", - "//vendor/golang.org/x/net/websocket:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "groupversion.go", - "installer.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/endpoints", - importpath = "k8s.io/apiserver/pkg/endpoints", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/deprecation:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/discovery:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/handlers:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/handlers/negotiation:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/metrics:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/warning:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/features:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storageversion:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/version:go_default_library", - "//vendor/github.com/emicklei/go-restful:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/util/proto:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiserver/pkg/endpoints/deprecation:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/endpoints/discovery:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/endpoints/filterlatency:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/endpoints/filters:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/endpoints/handlers:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/endpoints/metrics:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/endpoints/openapi:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/endpoints/testing:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/endpoints/warning:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/deprecation/BUILD b/vendor/k8s.io/apiserver/pkg/endpoints/deprecation/BUILD deleted file mode 100644 index 7c5025059456..000000000000 --- a/vendor/k8s.io/apiserver/pkg/endpoints/deprecation/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["deprecation.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/endpoints/deprecation", - importpath = "k8s.io/apiserver/pkg/endpoints/deprecation", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/version:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["deprecation_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/version:go_default_library", - ], -) diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/discovery/BUILD b/vendor/k8s.io/apiserver/pkg/endpoints/discovery/BUILD deleted file mode 100644 index 9ab8bf77514b..000000000000 --- a/vendor/k8s.io/apiserver/pkg/endpoints/discovery/BUILD +++ /dev/null @@ -1,64 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "addresses_test.go", - "root_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "addresses.go", - "group.go", - "legacy.go", - "root.go", - "storageversionhash.go", - "util.go", - "version.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/endpoints/discovery", - importpath = "k8s.io/apiserver/pkg/endpoints/discovery", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/handlers/negotiation:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters:go_default_library", - "//vendor/github.com/emicklei/go-restful:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/filterlatency/BUILD b/vendor/k8s.io/apiserver/pkg/endpoints/filterlatency/BUILD deleted file mode 100644 index 886e9e352681..000000000000 --- a/vendor/k8s.io/apiserver/pkg/endpoints/filterlatency/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["filterlatency.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/endpoints/filterlatency", - importpath = "k8s.io/apiserver/pkg/endpoints/filterlatency", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/metrics:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["filterlatency_test.go"], - embed = [":go_default_library"], - deps = ["//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library"], -) diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/filterlatency/filterlatency.go b/vendor/k8s.io/apiserver/pkg/endpoints/filterlatency/filterlatency.go index 04264230d8dd..d42e18233f15 100644 --- a/vendor/k8s.io/apiserver/pkg/endpoints/filterlatency/filterlatency.go +++ b/vendor/k8s.io/apiserver/pkg/endpoints/filterlatency/filterlatency.go @@ -56,8 +56,8 @@ func TrackStarted(handler http.Handler, name string) http.Handler { // TrackCompleted measures the timestamp the given handler has completed execution and then // it updates the corresponding metric with the filter latency duration. func TrackCompleted(handler http.Handler) http.Handler { - return trackCompleted(handler, utilclock.RealClock{}, func(fr *requestFilterRecord, completedAt time.Time) { - metrics.RecordFilterLatency(fr.name, completedAt.Sub(fr.startedTimestamp)) + return trackCompleted(handler, utilclock.RealClock{}, func(ctx context.Context, fr *requestFilterRecord, completedAt time.Time) { + metrics.RecordFilterLatency(ctx, fr.name, completedAt.Sub(fr.startedTimestamp)) }) } @@ -81,7 +81,7 @@ func trackStarted(handler http.Handler, name string, clock utilclock.PassiveCloc }) } -func trackCompleted(handler http.Handler, clock utilclock.PassiveClock, action func(*requestFilterRecord, time.Time)) http.Handler { +func trackCompleted(handler http.Handler, clock utilclock.PassiveClock, action func(context.Context, *requestFilterRecord, time.Time)) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // The previous filter has just completed. completedAt := clock.Now() @@ -90,7 +90,7 @@ func trackCompleted(handler http.Handler, clock utilclock.PassiveClock, action f ctx := r.Context() if fr := requestFilterRecordFrom(ctx); fr != nil { - action(fr, completedAt) + action(ctx, fr, completedAt) } }) } diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/filters/BUILD b/vendor/k8s.io/apiserver/pkg/endpoints/filters/BUILD deleted file mode 100644 index e1cdfafd65f3..000000000000 --- a/vendor/k8s.io/apiserver/pkg/endpoints/filters/BUILD +++ /dev/null @@ -1,110 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "audit_test.go", - "authentication_test.go", - "authn_audit_test.go", - "authorization_test.go", - "cachecontrol_test.go", - "impersonation_test.go", - "metrics_test.go", - "request_deadline_test.go", - "request_received_time_test.go", - "requestinfo_test.go", - "warning_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/authentication/v1:go_default_library", - "//staging/src/k8s.io/api/batch/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/audit/policy:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - "//staging/src/k8s.io/component-base/metrics/testutil:go_default_library", - "//vendor/github.com/google/go-cmp/cmp:go_default_library", - "//vendor/github.com/google/uuid:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "audit.go", - "audit_annotations.go", - "authentication.go", - "authn_audit.go", - "authorization.go", - "cachecontrol.go", - "doc.go", - "impersonation.go", - "metrics.go", - "request_deadline.go", - "request_received_time.go", - "requestinfo.go", - "storageversion.go", - "warning.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/endpoints/filters", - importpath = "k8s.io/apiserver/pkg/endpoints/filters", - deps = [ - "//staging/src/k8s.io/api/authentication/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/audit:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/audit/policy:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/serviceaccount:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/httplog:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storageversion:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/warning:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - "//staging/src/k8s.io/component-base/metrics/prometheus/workqueue:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/filters/audit.go b/vendor/k8s.io/apiserver/pkg/endpoints/filters/audit.go index 891d60935498..853d1da9fd47 100644 --- a/vendor/k8s.io/apiserver/pkg/endpoints/filters/audit.go +++ b/vendor/k8s.io/apiserver/pkg/endpoints/filters/audit.go @@ -18,6 +18,7 @@ package filters import ( "bufio" + "context" "errors" "fmt" "net" @@ -56,8 +57,8 @@ func WithAudit(handler http.Handler, sink audit.Sink, policy policy.Checker, lon } ev.Stage = auditinternal.StageRequestReceived - if processed := processAuditEvent(sink, ev, omitStages); !processed { - audit.ApiserverAuditDroppedCounter.Inc() + if processed := processAuditEvent(ctx, sink, ev, omitStages); !processed { + audit.ApiserverAuditDroppedCounter.WithContext(ctx).Inc() responsewriters.InternalError(w, req, errors.New("failed to store audit event")) return } @@ -70,7 +71,7 @@ func WithAudit(handler http.Handler, sink audit.Sink, policy policy.Checker, lon longRunningSink = sink } } - respWriter := decorateResponseWriter(w, ev, longRunningSink, omitStages) + respWriter := decorateResponseWriter(ctx, w, ev, longRunningSink, omitStages) // send audit event when we leave this func, either via a panic or cleanly. In the case of long // running requests, this will be the second audit event. @@ -84,7 +85,7 @@ func WithAudit(handler http.Handler, sink audit.Sink, policy policy.Checker, lon Reason: metav1.StatusReasonInternalError, Message: fmt.Sprintf("APIServer panic'd: %v", r), } - processAuditEvent(sink, ev, omitStages) + processAuditEvent(ctx, sink, ev, omitStages) return } @@ -98,14 +99,14 @@ func WithAudit(handler http.Handler, sink audit.Sink, policy policy.Checker, lon if ev.ResponseStatus == nil && longRunningSink != nil { ev.ResponseStatus = fakedSuccessStatus ev.Stage = auditinternal.StageResponseStarted - processAuditEvent(longRunningSink, ev, omitStages) + processAuditEvent(ctx, longRunningSink, ev, omitStages) } ev.Stage = auditinternal.StageResponseComplete if ev.ResponseStatus == nil { ev.ResponseStatus = fakedSuccessStatus } - processAuditEvent(sink, ev, omitStages) + processAuditEvent(ctx, sink, ev, omitStages) }() handler.ServeHTTP(respWriter, req) }) @@ -125,7 +126,7 @@ func createAuditEventAndAttachToContext(req *http.Request, policy policy.Checker } level, omitStages := policy.LevelAndStages(attribs) - audit.ObservePolicyLevel(level) + audit.ObservePolicyLevel(ctx, level) if level == auditinternal.LevelNone { // Don't audit. return req, nil, nil, nil @@ -145,7 +146,7 @@ func createAuditEventAndAttachToContext(req *http.Request, policy policy.Checker return req, ev, omitStages, nil } -func processAuditEvent(sink audit.Sink, ev *auditinternal.Event, omitStages []auditinternal.Stage) bool { +func processAuditEvent(ctx context.Context, sink audit.Sink, ev *auditinternal.Event, omitStages []auditinternal.Stage) bool { for _, stage := range omitStages { if ev.Stage == stage { return true @@ -157,12 +158,13 @@ func processAuditEvent(sink audit.Sink, ev *auditinternal.Event, omitStages []au } else { ev.StageTimestamp = metav1.NewMicroTime(time.Now()) } - audit.ObserveEvent() + audit.ObserveEvent(ctx) return sink.ProcessEvents(ev) } -func decorateResponseWriter(responseWriter http.ResponseWriter, ev *auditinternal.Event, sink audit.Sink, omitStages []auditinternal.Stage) http.ResponseWriter { +func decorateResponseWriter(ctx context.Context, responseWriter http.ResponseWriter, ev *auditinternal.Event, sink audit.Sink, omitStages []auditinternal.Stage) http.ResponseWriter { delegate := &auditResponseWriter{ + ctx: ctx, ResponseWriter: responseWriter, event: ev, sink: sink, @@ -186,16 +188,13 @@ var _ http.ResponseWriter = &auditResponseWriter{} // create immediately an event (for long running requests). type auditResponseWriter struct { http.ResponseWriter + ctx context.Context event *auditinternal.Event once sync.Once sink audit.Sink omitStages []auditinternal.Stage } -func (a *auditResponseWriter) setHttpHeader() { - a.ResponseWriter.Header().Set(auditinternal.HeaderAuditID, string(a.event.AuditID)) -} - func (a *auditResponseWriter) processCode(code int) { a.once.Do(func() { if a.event.ResponseStatus == nil { @@ -205,7 +204,7 @@ func (a *auditResponseWriter) processCode(code int) { a.event.Stage = auditinternal.StageResponseStarted if a.sink != nil { - processAuditEvent(a.sink, a.event, a.omitStages) + processAuditEvent(a.ctx, a.sink, a.event, a.omitStages) } }) } @@ -213,13 +212,11 @@ func (a *auditResponseWriter) processCode(code int) { func (a *auditResponseWriter) Write(bs []byte) (int, error) { // the Go library calls WriteHeader internally if no code was written yet. But this will go unnoticed for us a.processCode(http.StatusOK) - a.setHttpHeader() return a.ResponseWriter.Write(bs) } func (a *auditResponseWriter) WriteHeader(code int) { a.processCode(code) - a.setHttpHeader() a.ResponseWriter.WriteHeader(code) } @@ -242,12 +239,6 @@ func (f *fancyResponseWriterDelegator) Hijack() (net.Conn, *bufio.ReadWriter, er // fake a response status before protocol switch happens f.processCode(http.StatusSwitchingProtocols) - // This will be ignored if WriteHeader() function has already been called. - // It's not guaranteed Audit-ID http header is sent for all requests. - // For example, when user run "kubectl exec", apiserver uses a proxy handler - // to deal with the request, users can only get http headers returned by kubelet node. - f.setHttpHeader() - return f.ResponseWriter.(http.Hijacker).Hijack() } diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/filters/authentication.go b/vendor/k8s.io/apiserver/pkg/endpoints/filters/authentication.go index e88e7ad28d63..d69cfef32d1b 100644 --- a/vendor/k8s.io/apiserver/pkg/endpoints/filters/authentication.go +++ b/vendor/k8s.io/apiserver/pkg/endpoints/filters/authentication.go @@ -17,6 +17,7 @@ limitations under the License. package filters import ( + "context" "errors" "fmt" "net/http" @@ -31,13 +32,19 @@ import ( "k8s.io/klog/v2" ) +type recordMetrics func(context.Context, *authenticator.Response, bool, error, authenticator.Audiences, time.Time, time.Time) + // WithAuthentication creates an http handler that tries to authenticate the given request as a user, and then // stores any such user found onto the provided context for the request. If authentication fails or returns an error // the failed handler is used. On success, "Authorization" header is removed from the request and handler // is invoked to serve the request. func WithAuthentication(handler http.Handler, auth authenticator.Request, failed http.Handler, apiAuds authenticator.Audiences) http.Handler { + return withAuthentication(handler, auth, failed, apiAuds, recordAuthMetrics) +} + +func withAuthentication(handler http.Handler, auth authenticator.Request, failed http.Handler, apiAuds authenticator.Audiences, metrics recordMetrics) http.Handler { if auth == nil { - klog.Warningf("Authentication is disabled") + klog.Warning("Authentication is disabled") return handler } return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { @@ -47,10 +54,13 @@ func WithAuthentication(handler http.Handler, auth authenticator.Request, failed req = req.WithContext(authenticator.WithAudiences(req.Context(), apiAuds)) } resp, ok, err := auth.AuthenticateRequest(req) - defer recordAuthMetrics(resp, ok, err, apiAuds, authenticationStart) + authenticationFinish := time.Now() + defer func() { + metrics(req.Context(), resp, ok, err, apiAuds, authenticationStart, authenticationFinish) + }() if err != nil || !ok { if err != nil { - klog.Errorf("Unable to authenticate the request due to an error: %v", err) + klog.ErrorS(err, "Unable to authenticate the request") } failed.ServeHTTP(w, req) return diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/filters/authn_audit.go b/vendor/k8s.io/apiserver/pkg/endpoints/filters/authn_audit.go index 09d7db8cc903..2de13f747061 100644 --- a/vendor/k8s.io/apiserver/pkg/endpoints/filters/authn_audit.go +++ b/vendor/k8s.io/apiserver/pkg/endpoints/filters/authn_audit.go @@ -52,7 +52,7 @@ func WithFailedAuthenticationAudit(failedHandler http.Handler, sink audit.Sink, ev.ResponseStatus.Message = getAuthMethods(req) ev.Stage = auditinternal.StageResponseStarted - rw := decorateResponseWriter(w, ev, sink, omitStages) + rw := decorateResponseWriter(req.Context(), w, ev, sink, omitStages) failedHandler.ServeHTTP(rw, req) }) } diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/filters/authorization.go b/vendor/k8s.io/apiserver/pkg/endpoints/filters/authorization.go index 8d115ff0910e..96834938124e 100644 --- a/vendor/k8s.io/apiserver/pkg/endpoints/filters/authorization.go +++ b/vendor/k8s.io/apiserver/pkg/endpoints/filters/authorization.go @@ -44,7 +44,7 @@ const ( // WithAuthorizationCheck passes all authorized requests on to handler, and returns a forbidden error otherwise. func WithAuthorization(handler http.Handler, a authorizer.Authorizer, s runtime.NegotiatedSerializer) http.Handler { if a == nil { - klog.Warningf("Authorization is disabled") + klog.Warning("Authorization is disabled") return handler } return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { @@ -70,7 +70,7 @@ func WithAuthorization(handler http.Handler, a authorizer.Authorizer, s runtime. return } - klog.V(4).Infof("Forbidden: %#v, Reason: %q", req.RequestURI, reason) + klog.V(4).InfoS("Forbidden", "URI", req.RequestURI, "Reason", reason) audit.LogAnnotation(ae, decisionAnnotationKey, decisionForbid) audit.LogAnnotation(ae, reasonAnnotationKey, reason) responsewriters.Forbidden(ctx, attributes, w, req, reason, s) diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/filters/impersonation.go b/vendor/k8s.io/apiserver/pkg/endpoints/filters/impersonation.go index 1246ae863a3b..16dd180dbcfc 100644 --- a/vendor/k8s.io/apiserver/pkg/endpoints/filters/impersonation.go +++ b/vendor/k8s.io/apiserver/pkg/endpoints/filters/impersonation.go @@ -104,14 +104,14 @@ func WithImpersonation(handler http.Handler, a authorizer.Authorizer, s runtime. userExtra[extraKey] = append(userExtra[extraKey], extraValue) default: - klog.V(4).Infof("unknown impersonation request type: %v", impersonationRequest) + klog.V(4).InfoS("unknown impersonation request type", "Request", impersonationRequest) responsewriters.Forbidden(ctx, actingAsAttributes, w, req, fmt.Sprintf("unknown impersonation request type: %v", impersonationRequest), s) return } decision, reason, err := a.Authorize(ctx, actingAsAttributes) if err != nil || decision != authorizer.DecisionAllow { - klog.V(4).Infof("Forbidden: %#v, Reason: %s, Error: %v", req.RequestURI, reason, err) + klog.V(4).InfoS("Forbidden", "URI", req.RequestURI, "Reason", reason, "Error", err) responsewriters.Forbidden(ctx, actingAsAttributes, w, req, reason, s) return } diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/filters/metrics.go b/vendor/k8s.io/apiserver/pkg/endpoints/filters/metrics.go index 421c0e0a2ba8..31ead93d51a4 100644 --- a/vendor/k8s.io/apiserver/pkg/endpoints/filters/metrics.go +++ b/vendor/k8s.io/apiserver/pkg/endpoints/filters/metrics.go @@ -17,6 +17,7 @@ limitations under the License. package filters import ( + "context" "strings" "time" @@ -27,7 +28,7 @@ import ( /* * By default, all the following metrics are defined as falling under - * ALPHA stability level https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/20190404-kubernetes-control-plane-metrics-stability.md#stability-classes) + * ALPHA stability level https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/1209-metrics-stability/20190404-kubernetes-control-plane-metrics-stability.md#stability-classes) * * Promoting the stability level of the metric is a responsibility of the component owner, since it * involves explicitly acknowledging support for the metric across multiple releases, in accordance with @@ -75,7 +76,7 @@ func init() { legacyregistry.MustRegister(authenticationLatency) } -func recordAuthMetrics(resp *authenticator.Response, ok bool, err error, apiAudiences authenticator.Audiences, authStart time.Time) { +func recordAuthMetrics(ctx context.Context, resp *authenticator.Response, ok bool, err error, apiAudiences authenticator.Audiences, authStart time.Time, authFinish time.Time) { var resultLabel string switch { @@ -85,11 +86,11 @@ func recordAuthMetrics(resp *authenticator.Response, ok bool, err error, apiAudi resultLabel = failureLabel default: resultLabel = successLabel - authenticatedUserCounter.WithLabelValues(compressUsername(resp.User.GetName())).Inc() + authenticatedUserCounter.WithContext(ctx).WithLabelValues(compressUsername(resp.User.GetName())).Inc() } - authenticatedAttemptsCounter.WithLabelValues(resultLabel).Inc() - authenticationLatency.WithLabelValues(resultLabel).Observe(time.Since(authStart).Seconds()) + authenticatedAttemptsCounter.WithContext(ctx).WithLabelValues(resultLabel).Inc() + authenticationLatency.WithContext(ctx).WithLabelValues(resultLabel).Observe(authFinish.Sub(authStart).Seconds()) } // compressUsername maps all possible usernames onto a small set of categories diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/filters/request_deadline.go b/vendor/k8s.io/apiserver/pkg/endpoints/filters/request_deadline.go index 1e43cdab20f1..cc4997968a14 100644 --- a/vendor/k8s.io/apiserver/pkg/endpoints/filters/request_deadline.go +++ b/vendor/k8s.io/apiserver/pkg/endpoints/filters/request_deadline.go @@ -69,7 +69,7 @@ func withRequestDeadline(handler http.Handler, sink audit.Sink, policy policy.Ch userSpecifiedTimeout, ok, err := parseTimeout(req) if err != nil { - statusErr := apierrors.NewBadRequest(fmt.Sprintf("%s", err.Error())) + statusErr := apierrors.NewBadRequest(err.Error()) klog.Errorf("Error - %s: %#v", err.Error(), req.RequestURI) @@ -126,7 +126,7 @@ func withFailedRequestAudit(failedHandler http.Handler, statusErr *apierrors.Sta ev.ResponseStatus.Message = statusErr.Error() } - rw := decorateResponseWriter(w, ev, sink, omitStages) + rw := decorateResponseWriter(req.Context(), w, ev, sink, omitStages) failedHandler.ServeHTTP(rw, req) }) } diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/filters/with_auditid.go b/vendor/k8s.io/apiserver/pkg/endpoints/filters/with_auditid.go new file mode 100644 index 000000000000..a7e8c7e4a585 --- /dev/null +++ b/vendor/k8s.io/apiserver/pkg/endpoints/filters/with_auditid.go @@ -0,0 +1,68 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package filters + +import ( + "net/http" + + "k8s.io/apimachinery/pkg/types" + auditinternal "k8s.io/apiserver/pkg/apis/audit" + "k8s.io/apiserver/pkg/endpoints/request" + + "github.com/google/uuid" +) + +// WithAuditID attaches the Audit-ID associated with a request to the context. +// +// a. If the caller does not specify a value for Audit-ID in the request header, we generate a new audit ID +// b. We echo the Audit-ID value to the caller via the response Header 'Audit-ID'. +func WithAuditID(handler http.Handler) http.Handler { + return withAuditID(handler, func() string { + return uuid.New().String() + }) +} + +func withAuditID(handler http.Handler, newAuditIDFunc func() string) http.Handler { + if newAuditIDFunc == nil { + return handler + } + + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + + auditID := r.Header.Get(auditinternal.HeaderAuditID) + if len(auditID) == 0 { + auditID = newAuditIDFunc() + } + + // Note: we save the user specified value of the Audit-ID header as is, no truncation is performed. + r = r.WithContext(request.WithAuditID(ctx, types.UID(auditID))) + + // We echo the Audit-ID in to the response header. + // It's not guaranteed Audit-ID http header is sent for all requests. + // For example, when user run "kubectl exec", apiserver uses a proxy handler + // to deal with the request, users can only get http headers returned by kubelet node. + // + // This filter will also be used by other aggregated api server(s). For an aggregated API + // we don't want to see the same audit ID appearing more than once. + if value := w.Header().Get(auditinternal.HeaderAuditID); len(value) == 0 { + w.Header().Set(auditinternal.HeaderAuditID, auditID) + } + + handler.ServeHTTP(w, r) + }) +} diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/groupversion.go b/vendor/k8s.io/apiserver/pkg/endpoints/groupversion.go index 22b97366142c..a6f17e84acb7 100644 --- a/vendor/k8s.io/apiserver/pkg/endpoints/groupversion.go +++ b/vendor/k8s.io/apiserver/pkg/endpoints/groupversion.go @@ -36,6 +36,13 @@ import ( openapiproto "k8s.io/kube-openapi/pkg/util/proto" ) +// ConvertabilityChecker indicates what versions a GroupKind is available in. +type ConvertabilityChecker interface { + // VersionsForGroupKind indicates what versions are available to convert a group kind. This determines + // what our decoding abilities are. + VersionsForGroupKind(gk schema.GroupKind) []schema.GroupVersion +} + // APIGroupVersion is a helper for exposing rest.Storage objects as http.Handlers via go-restful // It handles URLs of the form: // /${storage_key}[/${object_name}] @@ -67,13 +74,14 @@ type APIGroupVersion struct { Serializer runtime.NegotiatedSerializer ParameterCodec runtime.ParameterCodec - Typer runtime.ObjectTyper - Creater runtime.ObjectCreater - Convertor runtime.ObjectConvertor - Defaulter runtime.ObjectDefaulter - Linker runtime.SelfLinker - UnsafeConvertor runtime.ObjectConvertor - TypeConverter fieldmanager.TypeConverter + Typer runtime.ObjectTyper + Creater runtime.ObjectCreater + Convertor runtime.ObjectConvertor + ConvertabilityChecker ConvertabilityChecker + Defaulter runtime.ObjectDefaulter + Linker runtime.SelfLinker + UnsafeConvertor runtime.ObjectConvertor + TypeConverter fieldmanager.TypeConverter EquivalentResourceRegistry runtime.EquivalentResourceRegistry diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/handlers/BUILD b/vendor/k8s.io/apiserver/pkg/endpoints/handlers/BUILD deleted file mode 100644 index 3b299e4dfe32..000000000000 --- a/vendor/k8s.io/apiserver/pkg/endpoints/handlers/BUILD +++ /dev/null @@ -1,133 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "create_test.go", - "helpers_test.go", - "namer_test.go", - "response_test.go", - "rest_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/testapigroup/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/json:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/example:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/example/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/handlers/negotiation:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/github.com/evanphx/json-patch:go_default_library", - "//vendor/github.com/google/gofuzz:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/k8s.io/utils/trace:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "create.go", - "delete.go", - "doc.go", - "get.go", - "helpers.go", - "namer.go", - "patch.go", - "response.go", - "rest.go", - "update.go", - "watch.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/endpoints/handlers", - importpath = "k8s.io/apiserver/pkg/endpoints/handlers", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/internalversion/scheme:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/internalversion/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1beta1/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/streaming:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/json:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/mergepatch:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/yaml:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/audit:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/handlers/negotiation:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/metrics:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/features:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/httplog:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/dryrun:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/wsstream:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/warning:go_default_library", - "//vendor/github.com/evanphx/json-patch:go_default_library", - "//vendor/golang.org/x/net/websocket:go_default_library", - "//vendor/google.golang.org/grpc/codes:go_default_library", - "//vendor/google.golang.org/grpc/status:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/trace:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/endpoints/handlers/negotiation:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/handlers/create.go b/vendor/k8s.io/apiserver/pkg/endpoints/handlers/create.go index e1072d99c5a3..b2e167f26fd1 100644 --- a/vendor/k8s.io/apiserver/pkg/endpoints/handlers/create.go +++ b/vendor/k8s.io/apiserver/pkg/endpoints/handlers/create.go @@ -35,6 +35,7 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apiserver/pkg/admission" "k8s.io/apiserver/pkg/audit" + "k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager" "k8s.io/apiserver/pkg/endpoints/handlers/negotiation" "k8s.io/apiserver/pkg/endpoints/request" "k8s.io/apiserver/pkg/features" @@ -49,7 +50,7 @@ var namespaceGVK = schema.GroupVersionKind{Group: "", Version: "v1", Kind: "Name func createHandler(r rest.NamedCreater, scope *RequestScope, admit admission.Interface, includeName bool) http.HandlerFunc { return func(w http.ResponseWriter, req *http.Request) { // For performance tracking purposes. - trace := utiltrace.New("Create", utiltrace.Field{Key: "url", Value: req.URL.Path}, utiltrace.Field{Key: "user-agent", Value: &lazyTruncatedUserAgent{req}}, utiltrace.Field{Key: "client", Value: &lazyClientIP{req}}) + trace := utiltrace.New("Create", traceFields(req)...) defer trace.LogIfLong(500 * time.Millisecond) if isDryRun(req.URL) && !utilfeature.DefaultFeatureGate.Enabled(features.DryRun) { @@ -163,6 +164,7 @@ func createHandler(r rest.NamedCreater, scope *RequestScope, admit admission.Int return nil, fmt.Errorf("failed to create new object (Create for %v): %v", scope.Kind, err) } obj = scope.FieldManager.UpdateNoErrors(liveObj, obj, managerOrUserAgent(options.FieldManager, req.UserAgent())) + admit = fieldmanager.NewManagedFieldsValidatingAdmissionController(admit) } if mutatingAdmission, ok := admit.(admission.MutationInterface); ok && mutatingAdmission.Handles(admission.Create) { if err := mutatingAdmission.Admit(ctx, admissionAttributes, scope); err != nil { diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/handlers/delete.go b/vendor/k8s.io/apiserver/pkg/endpoints/handlers/delete.go index 0fd87f74750a..545ed897c2bf 100644 --- a/vendor/k8s.io/apiserver/pkg/endpoints/handlers/delete.go +++ b/vendor/k8s.io/apiserver/pkg/endpoints/handlers/delete.go @@ -46,7 +46,7 @@ import ( func DeleteResource(r rest.GracefulDeleter, allowsOptions bool, scope *RequestScope, admit admission.Interface) http.HandlerFunc { return func(w http.ResponseWriter, req *http.Request) { // For performance tracking purposes. - trace := utiltrace.New("Delete", utiltrace.Field{Key: "url", Value: req.URL.Path}, utiltrace.Field{Key: "user-agent", Value: &lazyTruncatedUserAgent{req}}, utiltrace.Field{Key: "client", Value: &lazyClientIP{req}}) + trace := utiltrace.New("Delete", traceFields(req)...) defer trace.LogIfLong(500 * time.Millisecond) if isDryRun(req.URL) && !utilfeature.DefaultFeatureGate.Enabled(features.DryRun) { @@ -142,6 +142,7 @@ func DeleteResource(r rest.GracefulDeleter, allowsOptions bool, scope *RequestSc // that will break existing clients. // Other cases where resource is not instantly deleted are: namespace deletion // and pod graceful deletion. + //lint:ignore SA1019 backwards compatibility if !wasDeleted && options.OrphanDependents != nil && !*options.OrphanDependents { status = http.StatusAccepted } @@ -165,7 +166,7 @@ func DeleteResource(r rest.GracefulDeleter, allowsOptions bool, scope *RequestSc // DeleteCollection returns a function that will handle a collection deletion func DeleteCollection(r rest.CollectionDeleter, checkBody bool, scope *RequestScope, admit admission.Interface) http.HandlerFunc { return func(w http.ResponseWriter, req *http.Request) { - trace := utiltrace.New("Delete", utiltrace.Field{"url", req.URL.Path}) + trace := utiltrace.New("Delete", traceFields(req)...) defer trace.LogIfLong(500 * time.Millisecond) if isDryRun(req.URL) && !utilfeature.DefaultFeatureGate.Enabled(features.DryRun) { diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/BUILD b/vendor/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/BUILD deleted file mode 100644 index a16e42c22ff9..000000000000 --- a/vendor/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/BUILD +++ /dev/null @@ -1,95 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "buildmanagerinfo.go", - "capmanagers.go", - "fieldmanager.go", - "lastappliedmanager.go", - "lastappliedupdater.go", - "managedfieldsupdater.go", - "skipnonapplied.go", - "stripmeta.go", - "structuredmerge.go", - "typeconverter.go", - "versionconverter.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager", - importpath = "k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/internal:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/util/proto:go_default_library", - "//vendor/sigs.k8s.io/structured-merge-diff/v4/fieldpath:go_default_library", - "//vendor/sigs.k8s.io/structured-merge-diff/v4/merge:go_default_library", - "//vendor/sigs.k8s.io/structured-merge-diff/v4/typed:go_default_library", - "//vendor/sigs.k8s.io/structured-merge-diff/v4/value:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/internal:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = [ - "capmanagers_test.go", - "fieldmanager_test.go", - "lastappliedmanager_test.go", - "lastappliedupdater_test.go", - "managedfieldsupdater_test.go", - "skipnonapplied_test.go", - "typeconverter_test.go", - "versionconverter_test.go", - ], - data = [ - "endpoints.yaml", - "node.yaml", - "pod.yaml", - "testdata/swagger.json", - "//api/openapi-spec", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/yaml:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/internal:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/util/proto:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/util/proto/testing:go_default_library", - "//vendor/sigs.k8s.io/structured-merge-diff/v4/fieldpath:go_default_library", - "//vendor/sigs.k8s.io/structured-merge-diff/v4/merge:go_default_library", - "//vendor/sigs.k8s.io/structured-merge-diff/v4/typed:go_default_library", - "//vendor/sigs.k8s.io/yaml:go_default_library", - ], -) diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/admission.go b/vendor/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/admission.go new file mode 100644 index 000000000000..20bbab065056 --- /dev/null +++ b/vendor/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/admission.go @@ -0,0 +1,86 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package fieldmanager + +import ( + "context" + "fmt" + + "k8s.io/apimachinery/pkg/api/meta" + "k8s.io/apiserver/pkg/admission" + "k8s.io/apiserver/pkg/warning" +) + +// InvalidManagedFieldsAfterMutatingAdmissionWarningFormat is the warning that a client receives +// when a create/update/patch request results in invalid managedFields after going through the admission chain. +const InvalidManagedFieldsAfterMutatingAdmissionWarningFormat = ".metadata.managedFields was in an invalid state after admission; this could be caused by an outdated mutating admission controller; please fix your requests: %v" + +// NewManagedFieldsValidatingAdmissionController validates the managedFields after calling +// the provided admission and resets them to their original state if they got changed to an invalid value +func NewManagedFieldsValidatingAdmissionController(wrap admission.Interface) admission.Interface { + if wrap == nil { + return nil + } + return &managedFieldsValidatingAdmissionController{wrap: wrap} +} + +type managedFieldsValidatingAdmissionController struct { + wrap admission.Interface +} + +var _ admission.Interface = &managedFieldsValidatingAdmissionController{} +var _ admission.MutationInterface = &managedFieldsValidatingAdmissionController{} +var _ admission.ValidationInterface = &managedFieldsValidatingAdmissionController{} + +// Handles calls the wrapped admission.Interface if applicable +func (admit *managedFieldsValidatingAdmissionController) Handles(operation admission.Operation) bool { + return admit.wrap.Handles(operation) +} + +// Admit calls the wrapped admission.Interface if applicable and resets the managedFields to their state before admission if they +// got modified in an invalid way +func (admit *managedFieldsValidatingAdmissionController) Admit(ctx context.Context, a admission.Attributes, o admission.ObjectInterfaces) (err error) { + mutationInterface, isMutationInterface := admit.wrap.(admission.MutationInterface) + if !isMutationInterface { + return nil + } + objectMeta, err := meta.Accessor(a.GetObject()) + if err != nil { + return err + } + managedFieldsBeforeAdmission := objectMeta.GetManagedFields() + if err := mutationInterface.Admit(ctx, a, o); err != nil { + return err + } + managedFieldsAfterAdmission := objectMeta.GetManagedFields() + if _, err := DecodeManagedFields(managedFieldsAfterAdmission); err != nil { + objectMeta.SetManagedFields(managedFieldsBeforeAdmission) + warning.AddWarning(ctx, "", + fmt.Sprintf(InvalidManagedFieldsAfterMutatingAdmissionWarningFormat, + err.Error()), + ) + } + return nil +} + +// Validate calls the wrapped admission.Interface if aplicable +func (admit *managedFieldsValidatingAdmissionController) Validate(ctx context.Context, a admission.Attributes, o admission.ObjectInterfaces) (err error) { + if validationInterface, isValidationInterface := admit.wrap.(admission.ValidationInterface); isValidationInterface { + return validationInterface.Validate(ctx, a, o) + } + return nil +} diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/fieldmanager.go b/vendor/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/fieldmanager.go index 7e81fcc8920b..5ef25dc81c40 100644 --- a/vendor/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/fieldmanager.go +++ b/vendor/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/fieldmanager.go @@ -78,8 +78,8 @@ func NewFieldManager(f Manager, ignoreManagedFieldsFromRequestObject bool) *Fiel // NewDefaultFieldManager creates a new FieldManager that merges apply requests // and update managed fields for other types of requests. -func NewDefaultFieldManager(typeConverter TypeConverter, objectConverter runtime.ObjectConvertor, objectDefaulter runtime.ObjectDefaulter, objectCreater runtime.ObjectCreater, kind schema.GroupVersionKind, hub schema.GroupVersion, ignoreManagedFieldsFromRequestObject bool) (*FieldManager, error) { - f, err := NewStructuredMergeManager(typeConverter, objectConverter, objectDefaulter, kind.GroupVersion(), hub) +func NewDefaultFieldManager(typeConverter TypeConverter, objectConverter runtime.ObjectConvertor, objectDefaulter runtime.ObjectDefaulter, objectCreater runtime.ObjectCreater, kind schema.GroupVersionKind, hub schema.GroupVersion, ignoreManagedFieldsFromRequestObject bool, resetFields map[fieldpath.APIVersion]*fieldpath.Set) (*FieldManager, error) { + f, err := NewStructuredMergeManager(typeConverter, objectConverter, objectDefaulter, kind.GroupVersion(), hub, resetFields) if err != nil { return nil, fmt.Errorf("failed to create field manager: %v", err) } @@ -89,8 +89,8 @@ func NewDefaultFieldManager(typeConverter TypeConverter, objectConverter runtime // NewDefaultCRDFieldManager creates a new FieldManager specifically for // CRDs. This allows for the possibility of fields which are not defined // in models, as well as having no models defined at all. -func NewDefaultCRDFieldManager(typeConverter TypeConverter, objectConverter runtime.ObjectConvertor, objectDefaulter runtime.ObjectDefaulter, objectCreater runtime.ObjectCreater, kind schema.GroupVersionKind, hub schema.GroupVersion, ignoreManagedFieldsFromRequestObject bool) (_ *FieldManager, err error) { - f, err := NewCRDStructuredMergeManager(typeConverter, objectConverter, objectDefaulter, kind.GroupVersion(), hub) +func NewDefaultCRDFieldManager(typeConverter TypeConverter, objectConverter runtime.ObjectConvertor, objectDefaulter runtime.ObjectDefaulter, objectCreater runtime.ObjectCreater, kind schema.GroupVersionKind, hub schema.GroupVersion, ignoreManagedFieldsFromRequestObject bool, resetFields map[fieldpath.APIVersion]*fieldpath.Set) (_ *FieldManager, err error) { + f, err := NewCRDStructuredMergeManager(typeConverter, objectConverter, objectDefaulter, kind.GroupVersion(), hub, resetFields) if err != nil { return nil, fmt.Errorf("failed to create field manager: %v", err) } @@ -110,23 +110,22 @@ func newDefaultFieldManager(f Manager, typeConverter TypeConverter, objectConver return NewFieldManager(f, ignoreManagedFieldsFromRequestObject) } -func decodeLiveManagedFields(liveObj runtime.Object) (Managed, error) { +// DecodeManagedFields converts ManagedFields from the wire format (api format) +// to the format used by sigs.k8s.io/structured-merge-diff +func DecodeManagedFields(encodedManagedFields []metav1.ManagedFieldsEntry) (Managed, error) { + return internal.DecodeManagedFields(encodedManagedFields) +} + +func decodeLiveOrNew(liveObj, newObj runtime.Object, ignoreManagedFieldsFromRequestObject bool) (Managed, error) { liveAccessor, err := meta.Accessor(liveObj) if err != nil { return nil, err } - managed, err := internal.DecodeObjectManagedFields(liveAccessor.GetManagedFields()) - if err != nil { - return internal.NewEmptyManaged(), nil - } - return managed, nil -} -func decodeManagedFields(liveObj, newObj runtime.Object, ignoreManagedFieldsFromRequestObject bool) (Managed, error) { // We take the managedFields of the live object in case the request tries to // manually set managedFields via a subresource. if ignoreManagedFieldsFromRequestObject { - return decodeLiveManagedFields(liveObj) + return emptyManagedFieldsOnErr(DecodeManagedFields(liveAccessor.GetManagedFields())) } // If the object doesn't have metadata, we should just return without trying to @@ -140,14 +139,20 @@ func decodeManagedFields(liveObj, newObj runtime.Object, ignoreManagedFieldsFrom return internal.NewEmptyManaged(), nil } - managed, err := internal.DecodeObjectManagedFields(newAccessor.GetManagedFields()) // If the managed field is empty or we failed to decode it, // let's try the live object. This is to prevent clients who // don't understand managedFields from deleting it accidentally. + managed, err := DecodeManagedFields(newAccessor.GetManagedFields()) if err != nil || len(managed.Fields()) == 0 { - return decodeLiveManagedFields(liveObj) + return emptyManagedFieldsOnErr(DecodeManagedFields(liveAccessor.GetManagedFields())) } + return managed, nil +} +func emptyManagedFieldsOnErr(managed Managed, err error) (Managed, error) { + if err != nil { + return internal.NewEmptyManaged(), nil + } return managed, nil } @@ -157,7 +162,7 @@ func decodeManagedFields(liveObj, newObj runtime.Object, ignoreManagedFieldsFrom func (f *FieldManager) Update(liveObj, newObj runtime.Object, manager string) (object runtime.Object, err error) { // First try to decode the managed fields provided in the update, // This is necessary to allow directly updating managed fields. - managed, err := decodeManagedFields(liveObj, newObj, f.ignoreManagedFieldsFromRequestObject) + managed, err := decodeLiveOrNew(liveObj, newObj, f.ignoreManagedFieldsFromRequestObject) if err != nil { return newObj, nil } @@ -183,9 +188,8 @@ func (f *FieldManager) UpdateNoErrors(liveObj, newObj runtime.Object, manager st obj, err := f.Update(liveObj, newObj, manager) if err != nil { atMostEverySecond.Do(func() { - klog.Errorf("[SHOULD NOT HAPPEN] failed to update managedFields for %v: %v", - newObj.GetObjectKind().GroupVersionKind(), - err) + klog.ErrorS(err, "[SHOULD NOT HAPPEN] failed to update managedFields", "VersionKind", + newObj.GetObjectKind().GroupVersionKind()) }) // Explicitly remove managedFields on failure, so that // we can't have garbage in it. @@ -220,7 +224,7 @@ func (f *FieldManager) Apply(liveObj, appliedObj runtime.Object, manager string, } // Decode the managed fields in the live object, since it isn't allowed in the patch. - managed, err := internal.DecodeObjectManagedFields(accessor.GetManagedFields()) + managed, err := DecodeManagedFields(accessor.GetManagedFields()) if err != nil { return nil, fmt.Errorf("failed to decode managed fields: %v", err) } diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/internal/BUILD b/vendor/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/internal/BUILD deleted file mode 100644 index a282e3e62e5b..000000000000 --- a/vendor/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/internal/BUILD +++ /dev/null @@ -1,63 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "atmostevery.go", - "conflict.go", - "fields.go", - "gvkparser.go", - "managedfields.go", - "pathelement.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/internal", - importpath = "k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/internal", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/schemaconv:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/util/proto:go_default_library", - "//vendor/sigs.k8s.io/structured-merge-diff/v4/fieldpath:go_default_library", - "//vendor/sigs.k8s.io/structured-merge-diff/v4/merge:go_default_library", - "//vendor/sigs.k8s.io/structured-merge-diff/v4/typed:go_default_library", - "//vendor/sigs.k8s.io/structured-merge-diff/v4/value:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "atmostevery_test.go", - "conflict_test.go", - "fields_test.go", - "managedfields_test.go", - "pathelement_test.go", - ], - data = glob(["testdata/**"]), - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/sigs.k8s.io/structured-merge-diff/v4/fieldpath:go_default_library", - "//vendor/sigs.k8s.io/structured-merge-diff/v4/merge:go_default_library", - "//vendor/sigs.k8s.io/yaml:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/internal/managedfields.go b/vendor/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/internal/managedfields.go index 9a625e2acf77..40237cdc6607 100644 --- a/vendor/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/internal/managedfields.go +++ b/vendor/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/internal/managedfields.go @@ -77,15 +77,6 @@ func RemoveObjectManagedFields(obj runtime.Object) { accessor.SetManagedFields(nil) } -// DecodeObjectManagedFields extracts and converts the objects ManagedFields into a fieldpath.ManagedFields. -func DecodeObjectManagedFields(from []metav1.ManagedFieldsEntry) (ManagedInterface, error) { - managed, err := decodeManagedFields(from) - if err != nil { - return nil, fmt.Errorf("failed to convert managed fields from API: %v", err) - } - return &managed, nil -} - // EncodeObjectManagedFields converts and stores the fieldpathManagedFields into the objects ManagedFields func EncodeObjectManagedFields(obj runtime.Object, managed ManagedInterface) error { accessor, err := meta.Accessor(obj) @@ -102,32 +93,41 @@ func EncodeObjectManagedFields(obj runtime.Object, managed ManagedInterface) err return nil } -// decodeManagedFields converts ManagedFields from the wire format (api format) +// DecodeManagedFields converts ManagedFields from the wire format (api format) // to the format used by sigs.k8s.io/structured-merge-diff -func decodeManagedFields(encodedManagedFields []metav1.ManagedFieldsEntry) (managed managedStruct, err error) { +func DecodeManagedFields(encodedManagedFields []metav1.ManagedFieldsEntry) (ManagedInterface, error) { + managed := managedStruct{} managed.fields = make(fieldpath.ManagedFields, len(encodedManagedFields)) managed.times = make(map[string]*metav1.Time, len(encodedManagedFields)) for i, encodedVersionedSet := range encodedManagedFields { + switch encodedVersionedSet.Operation { + case metav1.ManagedFieldsOperationApply, metav1.ManagedFieldsOperationUpdate: + default: + return nil, fmt.Errorf("operation must be `Apply` or `Update`") + } + if len(encodedVersionedSet.APIVersion) < 1 { + return nil, fmt.Errorf("apiVersion must not be empty") + } switch encodedVersionedSet.FieldsType { case "FieldsV1": // Valid case. case "": - return managedStruct{}, fmt.Errorf("missing fieldsType in managed fields entry %d", i) + return nil, fmt.Errorf("missing fieldsType in managed fields entry %d", i) default: - return managedStruct{}, fmt.Errorf("invalid fieldsType %q in managed fields entry %d", encodedVersionedSet.FieldsType, i) + return nil, fmt.Errorf("invalid fieldsType %q in managed fields entry %d", encodedVersionedSet.FieldsType, i) } manager, err := BuildManagerIdentifier(&encodedVersionedSet) if err != nil { - return managedStruct{}, fmt.Errorf("error decoding manager from %v: %v", encodedVersionedSet, err) + return nil, fmt.Errorf("error decoding manager from %v: %v", encodedVersionedSet, err) } managed.fields[manager], err = decodeVersionedSet(&encodedVersionedSet) if err != nil { - return managedStruct{}, fmt.Errorf("error decoding versioned set from %v: %v", encodedVersionedSet, err) + return nil, fmt.Errorf("error decoding versioned set from %v: %v", encodedVersionedSet, err) } managed.times[manager] = encodedVersionedSet.Time } - return managed, nil + return &managed, nil } // BuildManagerIdentifier creates a manager identifier string from a ManagedFieldsEntry diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/node.yaml b/vendor/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/node.yaml index 13a14cf449bf..de69de83e630 100644 --- a/vendor/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/node.yaml +++ b/vendor/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/node.yaml @@ -15,6 +15,8 @@ metadata: cloud.google.com/gke-os-distribution: cos failure-domain.beta.kubernetes.io/region: us-central1 failure-domain.beta.kubernetes.io/zone: us-central1-b + topology.kubernetes.io/region: us-central1 + topology.kubernetes.io/zone: us-central1-b kubernetes.io/hostname: node-default-pool-something name: node-default-pool-something resourceVersion: "211582541" diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/structuredmerge.go b/vendor/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/structuredmerge.go index 216a39cf7a58..bfa3a3f715a7 100644 --- a/vendor/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/structuredmerge.go +++ b/vendor/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/structuredmerge.go @@ -41,7 +41,7 @@ var _ Manager = &structuredMergeManager{} // NewStructuredMergeManager creates a new Manager that merges apply requests // and update managed fields for other types of requests. -func NewStructuredMergeManager(typeConverter TypeConverter, objectConverter runtime.ObjectConvertor, objectDefaulter runtime.ObjectDefaulter, gv schema.GroupVersion, hub schema.GroupVersion) (Manager, error) { +func NewStructuredMergeManager(typeConverter TypeConverter, objectConverter runtime.ObjectConvertor, objectDefaulter runtime.ObjectDefaulter, gv schema.GroupVersion, hub schema.GroupVersion, resetFields map[fieldpath.APIVersion]*fieldpath.Set) (Manager, error) { return &structuredMergeManager{ typeConverter: typeConverter, objectConverter: objectConverter, @@ -49,7 +49,8 @@ func NewStructuredMergeManager(typeConverter TypeConverter, objectConverter runt groupVersion: gv, hubVersion: hub, updater: merge.Updater{ - Converter: newVersionConverter(typeConverter, objectConverter, hub), // This is the converter provided to SMD from k8s + Converter: newVersionConverter(typeConverter, objectConverter, hub), // This is the converter provided to SMD from k8s + IgnoredFields: resetFields, }, }, nil } @@ -57,7 +58,7 @@ func NewStructuredMergeManager(typeConverter TypeConverter, objectConverter runt // NewCRDStructuredMergeManager creates a new Manager specifically for // CRDs. This allows for the possibility of fields which are not defined // in models, as well as having no models defined at all. -func NewCRDStructuredMergeManager(typeConverter TypeConverter, objectConverter runtime.ObjectConvertor, objectDefaulter runtime.ObjectDefaulter, gv schema.GroupVersion, hub schema.GroupVersion) (_ Manager, err error) { +func NewCRDStructuredMergeManager(typeConverter TypeConverter, objectConverter runtime.ObjectConvertor, objectDefaulter runtime.ObjectDefaulter, gv schema.GroupVersion, hub schema.GroupVersion, resetFields map[fieldpath.APIVersion]*fieldpath.Set) (_ Manager, err error) { return &structuredMergeManager{ typeConverter: typeConverter, objectConverter: objectConverter, @@ -65,7 +66,8 @@ func NewCRDStructuredMergeManager(typeConverter TypeConverter, objectConverter r groupVersion: gv, hubVersion: hub, updater: merge.Updater{ - Converter: newCRDVersionConverter(typeConverter, objectConverter, hub), + Converter: newCRDVersionConverter(typeConverter, objectConverter, hub), + IgnoredFields: resetFields, }, }, nil } @@ -116,7 +118,7 @@ func (f *structuredMergeManager) Apply(liveObj, patchObj runtime.Object, managed return nil, nil, fmt.Errorf("couldn't get accessor: %v", err) } if patchObjMeta.GetManagedFields() != nil { - return nil, nil, errors.NewBadRequest(fmt.Sprintf("metadata.managedFields must be nil")) + return nil, nil, errors.NewBadRequest("metadata.managedFields must be nil") } liveObjVersioned, err := f.toVersioned(liveObj) diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/handlers/get.go b/vendor/k8s.io/apiserver/pkg/endpoints/handlers/get.go index c3f6e4cbe136..6c09b4965356 100644 --- a/vendor/k8s.io/apiserver/pkg/endpoints/handlers/get.go +++ b/vendor/k8s.io/apiserver/pkg/endpoints/handlers/get.go @@ -19,14 +19,15 @@ package handlers import ( "context" "fmt" - metainternalversionvalidation "k8s.io/apimachinery/pkg/apis/meta/internalversion/validation" - "k8s.io/apimachinery/pkg/runtime/schema" "math/rand" "net/http" "net/url" "strings" "time" + metainternalversionvalidation "k8s.io/apimachinery/pkg/apis/meta/internalversion/validation" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/klog/v2" "k8s.io/apimachinery/pkg/api/errors" @@ -51,7 +52,7 @@ type getterFunc func(ctx context.Context, name string, req *http.Request, trace // passed-in getterFunc to perform the actual get. func getResourceHandler(scope *RequestScope, getter getterFunc) http.HandlerFunc { return func(w http.ResponseWriter, req *http.Request) { - trace := utiltrace.New("Get", utiltrace.Field{Key: "url", Value: req.URL.Path}, utiltrace.Field{Key: "user-agent", Value: &lazyTruncatedUserAgent{req}}, utiltrace.Field{Key: "client", Value: &lazyClientIP{req}}) + trace := utiltrace.New("Get", traceFields(req)...) defer trace.LogIfLong(500 * time.Millisecond) namespace, name, err := scope.Namer.Name(req) @@ -81,22 +82,22 @@ func getResourceHandler(scope *RequestScope, getter getterFunc) http.HandlerFunc } // GetResource returns a function that handles retrieving a single resource from a rest.Storage object. -func GetResource(r rest.Getter, e rest.Exporter, scope *RequestScope) http.HandlerFunc { +func GetResource(r rest.Getter, scope *RequestScope) http.HandlerFunc { return getResourceHandler(scope, func(ctx context.Context, name string, req *http.Request, trace *utiltrace.Trace) (runtime.Object, error) { // check for export options := metav1.GetOptions{} if values := req.URL.Query(); len(values) > 0 { - exports := metav1.ExportOptions{} - if err := metainternalversionscheme.ParameterCodec.DecodeParameters(values, scope.MetaGroupVersion, &exports); err != nil { - err = errors.NewBadRequest(err.Error()) - return nil, err - } - if exports.Export { - if e == nil { - return nil, errors.NewBadRequest(fmt.Sprintf("export of %q is not supported", scope.Resource.Resource)) + if len(values["export"]) > 0 { + exportBool := true + exportStrings := values["export"] + err := runtime.Convert_Slice_string_To_bool(&exportStrings, &exportBool, nil) + if err != nil { + return nil, errors.NewBadRequest(fmt.Sprintf("the export parameter cannot be parsed: %v", err)) + } + if exportBool { + return nil, errors.NewBadRequest("the export parameter, deprecated since v1.14, is no longer supported") } - return e.Export(ctx, name, exports) } if err := metainternalversionscheme.ParameterCodec.DecodeParameters(values, scope.MetaGroupVersion, &options); err != nil { err = errors.NewBadRequest(err.Error()) @@ -168,7 +169,7 @@ func getRequestOptions(req *http.Request, scope *RequestScope, into runtime.Obje func ListResource(r rest.Lister, rw rest.Watcher, scope *RequestScope, forceWatch bool, minRequestTimeout time.Duration) http.HandlerFunc { return func(w http.ResponseWriter, req *http.Request) { // For performance tracking purposes. - trace := utiltrace.New("List", utiltrace.Field{Key: "url", Value: req.URL.Path}, utiltrace.Field{Key: "user-agent", Value: &lazyTruncatedUserAgent{req}}, utiltrace.Field{Key: "client", Value: &lazyClientIP{req}}) + trace := utiltrace.New("List", traceFields(req)...) namespace, err := scope.Namer.Namespace(req) if err != nil { diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/handlers/helpers.go b/vendor/k8s.io/apiserver/pkg/endpoints/handlers/helpers.go index 82170e050ec1..3fb7beccad10 100644 --- a/vendor/k8s.io/apiserver/pkg/endpoints/handlers/helpers.go +++ b/vendor/k8s.io/apiserver/pkg/endpoints/handlers/helpers.go @@ -20,6 +20,7 @@ import ( "net/http" utilnet "k8s.io/apimachinery/pkg/util/net" + "k8s.io/apiserver/pkg/endpoints/request" ) const ( @@ -58,3 +59,32 @@ func (lazy *lazyClientIP) String() string { } return "unknown" } + +// lazyAccept implements String() string and it will +// calls http.Request Header.Get() lazily only when required. +type lazyAccept struct { + req *http.Request +} + +func (lazy *lazyAccept) String() string { + if lazy.req != nil { + accept := lazy.req.Header.Get("Accept") + return accept + } + + return "unknown" +} + +// lazyAuditID implements Stringer interface to lazily retrieve +// the audit ID associated with the request. +type lazyAuditID struct { + req *http.Request +} + +func (lazy *lazyAuditID) String() string { + if lazy.req != nil { + return request.GetAuditIDTruncated(lazy.req) + } + + return "unknown" +} diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/handlers/negotiation/BUILD b/vendor/k8s.io/apiserver/pkg/endpoints/handlers/negotiation/BUILD deleted file mode 100644 index 784fed6eb3c2..000000000000 --- a/vendor/k8s.io/apiserver/pkg/endpoints/handlers/negotiation/BUILD +++ /dev/null @@ -1,47 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["negotiate_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "errors.go", - "negotiate.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/endpoints/handlers/negotiation", - importpath = "k8s.io/apiserver/pkg/endpoints/handlers/negotiation", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/github.com/munnerz/goautoneg:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/handlers/patch.go b/vendor/k8s.io/apiserver/pkg/endpoints/handlers/patch.go index 3d720032804a..903307fc2852 100644 --- a/vendor/k8s.io/apiserver/pkg/endpoints/handlers/patch.go +++ b/vendor/k8s.io/apiserver/pkg/endpoints/handlers/patch.go @@ -61,7 +61,7 @@ const ( func PatchResource(r rest.Patcher, scope *RequestScope, admit admission.Interface, patchTypes []string) http.HandlerFunc { return func(w http.ResponseWriter, req *http.Request) { // For performance tracking purposes. - trace := utiltrace.New("Patch", utiltrace.Field{Key: "url", Value: req.URL.Path}, utiltrace.Field{Key: "user-agent", Value: &lazyTruncatedUserAgent{req}}, utiltrace.Field{Key: "client", Value: &lazyClientIP{req}}) + trace := utiltrace.New("Patch", traceFields(req)...) defer trace.LogIfLong(500 * time.Millisecond) if isDryRun(req.URL) && !utilfeature.DefaultFeatureGate.Enabled(features.DryRun) { @@ -171,6 +171,9 @@ func PatchResource(r rest.Patcher, scope *RequestScope, admit admission.Interfac userInfo, ) + if scope.FieldManager != nil { + admit = fieldmanager.NewManagedFieldsValidatingAdmissionController(admit) + } mutatingAdmission, _ := admit.(admission.MutationInterface) createAuthorizerAttributes := authorizer.AttributesRecord{ User: userInfo, diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters/BUILD b/vendor/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters/BUILD deleted file mode 100644 index 90427ce85d8a..000000000000 --- a/vendor/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters/BUILD +++ /dev/null @@ -1,74 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "errors_test.go", - "status_test.go", - "writers_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/features:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "errors.go", - "status.go", - "writers.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters", - importpath = "k8s.io/apiserver/pkg/endpoints/handlers/responsewriters", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/audit:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/handlers/negotiation:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/metrics:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/features:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/flushwriter:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/wsstream:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters/status.go b/vendor/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters/status.go index 5a845435033f..bb14a15be83d 100644 --- a/vendor/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters/status.go +++ b/vendor/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters/status.go @@ -68,7 +68,7 @@ func ErrorToAPIStatus(err error) *metav1.Status { // by REST storage - these typically indicate programmer // error by not using pkg/api/errors, or unexpected failure // cases. - runtime.HandleError(fmt.Errorf("apiserver received an error that is not an metav1.Status: %#+v", err)) + runtime.HandleError(fmt.Errorf("apiserver received an error that is not an metav1.Status: %#+v: %v", err, err)) return &metav1.Status{ TypeMeta: metav1.TypeMeta{ Kind: "Status", diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters/writers.go b/vendor/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters/writers.go index 65cb389e517d..16e16c35376f 100644 --- a/vendor/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters/writers.go +++ b/vendor/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters/writers.go @@ -21,11 +21,11 @@ import ( "encoding/json" "fmt" "io" - "io/ioutil" "net/http" "strconv" "strings" "sync" + "time" "k8s.io/apiserver/pkg/features" @@ -40,6 +40,7 @@ import ( utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/apiserver/pkg/util/flushwriter" "k8s.io/apiserver/pkg/util/wsstream" + utiltrace "k8s.io/utils/trace" ) // StreamObject performs input stream negotiation from a ResourceStreamer and writes that to the response. @@ -86,11 +87,20 @@ func StreamObject(statusCode int, gv schema.GroupVersion, s runtime.NegotiatedSe // The context is optional and can be nil. This method will perform optional content compression if requested by // a client and the feature gate for APIResponseCompression is enabled. func SerializeObject(mediaType string, encoder runtime.Encoder, hw http.ResponseWriter, req *http.Request, statusCode int, object runtime.Object) { + trace := utiltrace.New("SerializeObject", + utiltrace.Field{"method", req.Method}, + utiltrace.Field{"url", req.URL.Path}, + utiltrace.Field{"protocol", req.Proto}, + utiltrace.Field{"mediaType", mediaType}, + utiltrace.Field{"encoder", encoder.Identifier()}) + defer trace.LogIfLong(5 * time.Second) + w := &deferredResponseWriter{ mediaType: mediaType, statusCode: statusCode, contentEncoding: negotiateContentEncoding(req), hw: hw, + trace: trace, } err := encoder.Encode(object, w) @@ -177,9 +187,23 @@ type deferredResponseWriter struct { hasWritten bool hw http.ResponseWriter w io.Writer + + trace *utiltrace.Trace } func (w *deferredResponseWriter) Write(p []byte) (n int, err error) { + if w.trace != nil { + // This Step usually wraps in-memory object serialization. + w.trace.Step("About to start writing response", utiltrace.Field{"size", len(p)}) + + firstWrite := !w.hasWritten + defer func() { + w.trace.Step("Write call finished", + utiltrace.Field{"writer", fmt.Sprintf("%T", w.w)}, + utiltrace.Field{"size", len(p)}, + utiltrace.Field{"firstWrite", firstWrite}) + }() + } if w.hasWritten { return w.w.Write(p) } @@ -219,8 +243,6 @@ func (w *deferredResponseWriter) Close() error { return err } -var nopCloser = ioutil.NopCloser(nil) - // WriteObjectNegotiated renders an object in the content type negotiated by the client. func WriteObjectNegotiated(s runtime.NegotiatedSerializer, restrictions negotiation.EndpointRestrictions, gv schema.GroupVersion, w http.ResponseWriter, req *http.Request, statusCode int, object runtime.Object) { stream, ok := object.(rest.ResourceStreamer) diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/handlers/rest.go b/vendor/k8s.io/apiserver/pkg/endpoints/handlers/rest.go index ce8a2a32dc98..783ab96b9b98 100644 --- a/vendor/k8s.io/apiserver/pkg/endpoints/handlers/rest.go +++ b/vendor/k8s.io/apiserver/pkg/endpoints/handlers/rest.go @@ -432,7 +432,7 @@ func setObjectSelfLink(ctx context.Context, obj runtime.Object, req *http.Reques return err } if err := namer.SetSelfLink(obj, uri); err != nil { - klog.V(4).Infof("Unable to set self link on object: %v", err) + klog.V(4).InfoS("Unable to set self link on object", "error", err) } requestInfo, ok := request.RequestInfoFrom(ctx) if !ok { diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/handlers/trace_util.go b/vendor/k8s.io/apiserver/pkg/endpoints/handlers/trace_util.go new file mode 100644 index 000000000000..8d7c4e1b5263 --- /dev/null +++ b/vendor/k8s.io/apiserver/pkg/endpoints/handlers/trace_util.go @@ -0,0 +1,33 @@ +/* +Copyright 2020 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package handlers + +import ( + "net/http" + + utiltrace "k8s.io/utils/trace" +) + +func traceFields(req *http.Request) []utiltrace.Field { + return []utiltrace.Field{ + {Key: "url", Value: req.URL.Path}, + {Key: "user-agent", Value: &lazyTruncatedUserAgent{req: req}}, + {Key: "audit-id", Value: &lazyAuditID{req: req}}, + {Key: "client", Value: &lazyClientIP{req: req}}, + {Key: "accept", Value: &lazyAccept{req: req}}, + {Key: "protocol", Value: req.Proto}} +} diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/handlers/update.go b/vendor/k8s.io/apiserver/pkg/endpoints/handlers/update.go index cbee7167b193..57daefd9cf1e 100644 --- a/vendor/k8s.io/apiserver/pkg/endpoints/handlers/update.go +++ b/vendor/k8s.io/apiserver/pkg/endpoints/handlers/update.go @@ -33,6 +33,7 @@ import ( "k8s.io/apiserver/pkg/admission" "k8s.io/apiserver/pkg/audit" "k8s.io/apiserver/pkg/authorization/authorizer" + "k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager" "k8s.io/apiserver/pkg/endpoints/handlers/negotiation" "k8s.io/apiserver/pkg/endpoints/request" "k8s.io/apiserver/pkg/features" @@ -46,7 +47,7 @@ import ( func UpdateResource(r rest.Updater, scope *RequestScope, admit admission.Interface) http.HandlerFunc { return func(w http.ResponseWriter, req *http.Request) { // For performance tracking purposes. - trace := utiltrace.New("Update", utiltrace.Field{Key: "url", Value: req.URL.Path}, utiltrace.Field{Key: "user-agent", Value: &lazyTruncatedUserAgent{req}}, utiltrace.Field{Key: "client", Value: &lazyClientIP{req}}) + trace := utiltrace.New("Update", traceFields(req)...) defer trace.LogIfLong(500 * time.Millisecond) if isDryRun(req.URL) && !utilfeature.DefaultFeatureGate.Enabled(features.DryRun) { @@ -130,6 +131,7 @@ func UpdateResource(r rest.Updater, scope *RequestScope, admit admission.Interfa // allows skipping managedFields update if the resulting object is too big shouldUpdateManagedFields := true if scope.FieldManager != nil { + admit = fieldmanager.NewManagedFieldsValidatingAdmissionController(admit) transformers = append(transformers, func(_ context.Context, newObj, liveObj runtime.Object) (runtime.Object, error) { if shouldUpdateManagedFields { return scope.FieldManager.UpdateNoErrors(liveObj, newObj, managerOrUserAgent(options.FieldManager, req.UserAgent())), nil diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/handlers/watch.go b/vendor/k8s.io/apiserver/pkg/endpoints/handlers/watch.go index 22945ccf6b8a..47fe44b78d7a 100644 --- a/vendor/k8s.io/apiserver/pkg/endpoints/handlers/watch.go +++ b/vendor/k8s.io/apiserver/pkg/endpoints/handlers/watch.go @@ -163,8 +163,8 @@ type WatchServer struct { // or over a websocket connection. func (s *WatchServer) ServeHTTP(w http.ResponseWriter, req *http.Request) { kind := s.Scope.Kind - metrics.RegisteredWatchers.WithLabelValues(kind.Group, kind.Version, kind.Kind).Inc() - defer metrics.RegisteredWatchers.WithLabelValues(kind.Group, kind.Version, kind.Kind).Dec() + metrics.RegisteredWatchers.WithContext(req.Context()).WithLabelValues(kind.Group, kind.Version, kind.Kind).Inc() + defer metrics.RegisteredWatchers.WithContext(req.Context()).WithLabelValues(kind.Group, kind.Version, kind.Kind).Dec() w = httplog.Unlogged(req, w) @@ -220,7 +220,7 @@ func (s *WatchServer) ServeHTTP(w http.ResponseWriter, req *http.Request) { // End of results. return } - metrics.WatchEvents.WithLabelValues(kind.Group, kind.Version, kind.Kind).Inc() + metrics.WatchEvents.WithContext(req.Context()).WithLabelValues(kind.Group, kind.Version, kind.Kind).Inc() obj := s.Fixup(event.Object) if err := s.EmbeddedEncoder.Encode(obj, buf); err != nil { @@ -233,7 +233,7 @@ func (s *WatchServer) ServeHTTP(w http.ResponseWriter, req *http.Request) { // type unknown.Raw = buf.Bytes() event.Object = &unknown - metrics.WatchEventsSizes.WithLabelValues(kind.Group, kind.Version, kind.Kind).Observe(float64(len(unknown.Raw))) + metrics.WatchEventsSizes.WithContext(req.Context()).WithLabelValues(kind.Group, kind.Version, kind.Kind).Observe(float64(len(unknown.Raw))) *outEvent = metav1.WatchEvent{} diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/installer.go b/vendor/k8s.io/apiserver/pkg/endpoints/installer.go index 6549771ced8a..23fca82598f5 100644 --- a/vendor/k8s.io/apiserver/pkg/endpoints/installer.go +++ b/vendor/k8s.io/apiserver/pkg/endpoints/installer.go @@ -46,6 +46,7 @@ import ( "k8s.io/apiserver/pkg/storageversion" utilfeature "k8s.io/apiserver/pkg/util/feature" versioninfo "k8s.io/component-base/version" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) const ( @@ -253,20 +254,18 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag if !isMetadata { storageMeta = defaultStorageMetadata{} } - exporter, isExporter := storage.(rest.Exporter) - if !isExporter { - exporter = nil - } - - versionedExportOptions, err := a.group.Creater.New(optionsExternalVersion.WithKind("ExportOptions")) - if err != nil { - return nil, nil, err - } if isNamedCreater { isCreater = true } + var resetFields map[fieldpath.APIVersion]*fieldpath.Set + if a.group.OpenAPIModels != nil && utilfeature.DefaultFeatureGate.Enabled(features.ServerSideApply) { + if resetFieldsStrategy, isResetFieldsStrategy := storage.(rest.ResetFieldsStrategy); isResetFieldsStrategy { + resetFields = resetFieldsStrategy.GetResetFields() + } + } + var versionedList interface{} if isLister { list := lister.NewList() @@ -522,6 +521,10 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag if err != nil { return nil, nil, err } + decodableVersions := []schema.GroupVersion{} + if a.group.ConvertabilityChecker != nil { + decodableVersions = a.group.ConvertabilityChecker.VersionsForGroupKind(fqKindToRegister.GroupKind()) + } resourceInfo = &storageversion.ResourceInfo{ GroupResource: schema.GroupResource{ Group: a.group.GroupVersion.Group, @@ -532,6 +535,8 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag // DecodableVersions immediately because API installation must // be completed first for us to know equivalent APIs EquivalentResourceMapper: a.group.EquivalentResourceRegistry, + + DirectlyDecodableVersions: decodableVersions, } } @@ -600,6 +605,7 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag fqKindToRegister, reqScope.HubGroupVersion, isSubresource, + resetFields, ) if err != nil { return nil, nil, fmt.Errorf("failed to create field manager: %v", err) @@ -684,7 +690,7 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag if isGetterWithOptions { handler = restfulGetResourceWithOptions(getterWithOptions, reqScope, isSubresource) } else { - handler = restfulGetResource(getter, exporter, reqScope) + handler = restfulGetResource(getter, reqScope) } if needOverride { @@ -713,11 +719,6 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag return nil, nil, err } } - if isExporter { - if err := AddObjectParams(ws, route, versionedExportOptions); err != nil { - return nil, nil, err - } - } addParams(route, action.Params) routes = append(routes, route) case "LIST": // List all resources of a kind. @@ -1227,9 +1228,9 @@ func restfulPatchResource(r rest.Patcher, scope handlers.RequestScope, admit adm } } -func restfulGetResource(r rest.Getter, e rest.Exporter, scope handlers.RequestScope) restful.RouteFunction { +func restfulGetResource(r rest.Getter, scope handlers.RequestScope) restful.RouteFunction { return func(req *restful.Request, res *restful.Response) { - handlers.GetResource(r, e, &scope)(res.ResponseWriter, req.Request) + handlers.GetResource(r, &scope)(res.ResponseWriter, req.Request) } } diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/metrics/BUILD b/vendor/k8s.io/apiserver/pkg/endpoints/metrics/BUILD deleted file mode 100644 index 9e4fe94ab57f..000000000000 --- a/vendor/k8s.io/apiserver/pkg/endpoints/metrics/BUILD +++ /dev/null @@ -1,46 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["metrics.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/endpoints/metrics", - importpath = "k8s.io/apiserver/pkg/endpoints/metrics", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/audit:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/features:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - "//vendor/github.com/emicklei/go-restful:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["metrics_test.go"], - embed = [":go_default_library"], -) diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/metrics/OWNERS b/vendor/k8s.io/apiserver/pkg/endpoints/metrics/OWNERS index 33c780d7a6d7..9454593c8871 100644 --- a/vendor/k8s.io/apiserver/pkg/endpoints/metrics/OWNERS +++ b/vendor/k8s.io/apiserver/pkg/endpoints/metrics/OWNERS @@ -3,3 +3,6 @@ reviewers: - wojtek-t - jimmidyson + +approvers: +- logicalhan diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/metrics/metrics.go b/vendor/k8s.io/apiserver/pkg/endpoints/metrics/metrics.go index d4f6068b40e3..a278566438ce 100644 --- a/vendor/k8s.io/apiserver/pkg/endpoints/metrics/metrics.go +++ b/vendor/k8s.io/apiserver/pkg/endpoints/metrics/metrics.go @@ -18,10 +18,10 @@ package metrics import ( "bufio" + "context" "net" "net/http" "net/url" - "regexp" "strconv" "strings" "sync" @@ -49,13 +49,12 @@ type resettableCollector interface { const ( APIServerComponent string = "apiserver" - OtherContentType string = "other" OtherRequestMethod string = "other" ) /* * By default, all the following metrics are defined as falling under - * ALPHA stability level https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/20190404-kubernetes-control-plane-metrics-stability.md#stability-classes) + * ALPHA stability level https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/1209-metrics-stability/20190404-kubernetes-control-plane-metrics-stability.md#stability-classes) * * Promoting the stability level of the metric is a responsibility of the component owner, since it * involves explicitly acknowledging support for the metric across multiple releases, in accordance with @@ -76,14 +75,10 @@ var ( requestCounter = compbasemetrics.NewCounterVec( &compbasemetrics.CounterOpts{ Name: "apiserver_request_total", - Help: "Counter of apiserver requests broken out for each verb, dry run value, group, version, resource, scope, component, and HTTP response contentType and code.", - StabilityLevel: compbasemetrics.ALPHA, + Help: "Counter of apiserver requests broken out for each verb, dry run value, group, version, resource, scope, component, and HTTP response code.", + StabilityLevel: compbasemetrics.STABLE, }, - // The label_name contentType doesn't follow the label_name convention defined here: - // https://github.com/kubernetes/community/blob/master/contributors/devel/sig-instrumentation/instrumentation.md - // But changing it would break backwards compatibility. Future label_names - // should be all lowercase and separated by underscores. - []string{"verb", "dry_run", "group", "version", "resource", "subresource", "scope", "component", "contentType", "code"}, + []string{"verb", "dry_run", "group", "version", "resource", "subresource", "scope", "component", "code"}, ) longRunningRequestGauge = compbasemetrics.NewGaugeVec( &compbasemetrics.GaugeOpts{ @@ -102,7 +97,7 @@ var ( // Thus we customize buckets significantly, to empower both usecases. Buckets: []float64{0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.25, 1.5, 1.75, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5, 6, 7, 8, 9, 10, 15, 20, 25, 30, 40, 50, 60}, - StabilityLevel: compbasemetrics.ALPHA, + StabilityLevel: compbasemetrics.STABLE, }, []string{"verb", "dry_run", "group", "version", "resource", "subresource", "scope", "component"}, ) @@ -216,8 +211,6 @@ var ( []string{"verb", "group", "version", "resource", "subresource", "scope"}, ) - kubectlExeRegexp = regexp.MustCompile(`^.*((?i:kubectl\.exe))`) - metrics = []resettableCollector{ deprecatedRequestGauge, requestCounter, @@ -237,19 +230,6 @@ var ( requestAbortsTotal, } - // these are the known (e.g. whitelisted/known) content types which we will report for - // request metrics. Any other RFC compliant content types will be aggregated under 'unknown' - knownMetricContentTypes = utilsets.NewString( - "application/apply-patch+yaml", - "application/json", - "application/json-patch+json", - "application/merge-patch+json", - "application/strategic-merge-patch+json", - "application/vnd.kubernetes.protobuf", - "application/vnd.kubernetes.protobuf;stream=watch", - "application/yaml", - "text/plain", - "text/plain;charset=utf-8") // these are the valid request methods which we report in our metrics. Any other request methods // will be aggregated under 'unknown' validRequestMethods = utilsets.NewString( @@ -324,8 +304,8 @@ func UpdateInflightRequestMetrics(phase string, nonmutating, mutating int) { } } -func RecordFilterLatency(name string, elapsed time.Duration) { - requestFilterDuration.WithLabelValues(name).Observe(elapsed.Seconds()) +func RecordFilterLatency(ctx context.Context, name string, elapsed time.Duration) { + requestFilterDuration.WithContext(ctx).WithLabelValues(name).Observe(elapsed.Seconds()) } // RecordRequestAbort records that the request was aborted possibly due to a timeout. @@ -341,7 +321,7 @@ func RecordRequestAbort(req *http.Request, requestInfo *request.RequestInfo) { group := requestInfo.APIGroup version := requestInfo.APIVersion - requestAbortsTotal.WithLabelValues(reportedVerb, group, version, resource, subresource, scope).Inc() + requestAbortsTotal.WithContext(req.Context()).WithLabelValues(reportedVerb, group, version, resource, subresource, scope).Inc() } // RecordRequestTermination records that the request was terminated early as part of a resource @@ -361,9 +341,9 @@ func RecordRequestTermination(req *http.Request, requestInfo *request.RequestInf reportedVerb := cleanVerb(canonicalVerb(strings.ToUpper(req.Method), scope), req) if requestInfo.IsResourceRequest { - requestTerminationsTotal.WithLabelValues(reportedVerb, requestInfo.APIGroup, requestInfo.APIVersion, requestInfo.Resource, requestInfo.Subresource, scope, component, codeToString(code)).Inc() + requestTerminationsTotal.WithContext(req.Context()).WithLabelValues(reportedVerb, requestInfo.APIGroup, requestInfo.APIVersion, requestInfo.Resource, requestInfo.Subresource, scope, component, codeToString(code)).Inc() } else { - requestTerminationsTotal.WithLabelValues(reportedVerb, "", "", "", requestInfo.Path, scope, component, codeToString(code)).Inc() + requestTerminationsTotal.WithContext(req.Context()).WithLabelValues(reportedVerb, "", "", "", requestInfo.Path, scope, component, codeToString(code)).Inc() } } @@ -383,9 +363,9 @@ func RecordLongRunning(req *http.Request, requestInfo *request.RequestInfo, comp reportedVerb := cleanVerb(canonicalVerb(strings.ToUpper(req.Method), scope), req) if requestInfo.IsResourceRequest { - g = longRunningRequestGauge.WithLabelValues(reportedVerb, requestInfo.APIGroup, requestInfo.APIVersion, requestInfo.Resource, requestInfo.Subresource, scope, component) + g = longRunningRequestGauge.WithContext(req.Context()).WithLabelValues(reportedVerb, requestInfo.APIGroup, requestInfo.APIVersion, requestInfo.Resource, requestInfo.Subresource, scope, component) } else { - g = longRunningRequestGauge.WithLabelValues(reportedVerb, "", "", "", requestInfo.Path, scope, component) + g = longRunningRequestGauge.WithContext(req.Context()).WithLabelValues(reportedVerb, "", "", "", requestInfo.Path, scope, component) } g.Inc() defer g.Dec() @@ -394,7 +374,7 @@ func RecordLongRunning(req *http.Request, requestInfo *request.RequestInfo, comp // MonitorRequest handles standard transformations for client and the reported verb and then invokes Monitor to record // a request. verb must be uppercase to be backwards compatible with existing monitoring tooling. -func MonitorRequest(req *http.Request, verb, group, version, resource, subresource, scope, component string, deprecated bool, removedRelease string, contentType string, httpCode, respSize int, elapsed time.Duration) { +func MonitorRequest(req *http.Request, verb, group, version, resource, subresource, scope, component string, deprecated bool, removedRelease string, httpCode, respSize int, elapsed time.Duration) { // We don't use verb from , as this may be propagated from // InstrumentRouteFunc which is registered in installer.go with predefined // list of verbs (different than those translated to RequestInfo). @@ -403,24 +383,23 @@ func MonitorRequest(req *http.Request, verb, group, version, resource, subresour dryRun := cleanDryRun(req.URL) elapsedSeconds := elapsed.Seconds() - cleanContentType := cleanContentType(contentType) - requestCounter.WithLabelValues(reportedVerb, dryRun, group, version, resource, subresource, scope, component, cleanContentType, codeToString(httpCode)).Inc() + requestCounter.WithContext(req.Context()).WithLabelValues(reportedVerb, dryRun, group, version, resource, subresource, scope, component, codeToString(httpCode)).Inc() // MonitorRequest happens after authentication, so we can trust the username given by the request info, ok := request.UserFrom(req.Context()) if ok && info.GetName() == user.APIServerUser { - apiSelfRequestCounter.WithLabelValues(reportedVerb, resource, subresource).Inc() + apiSelfRequestCounter.WithContext(req.Context()).WithLabelValues(reportedVerb, resource, subresource).Inc() } if deprecated { - deprecatedRequestGauge.WithLabelValues(group, version, resource, subresource, removedRelease).Set(1) + deprecatedRequestGauge.WithContext(req.Context()).WithLabelValues(group, version, resource, subresource, removedRelease).Set(1) audit.AddAuditAnnotation(req.Context(), deprecatedAnnotationKey, "true") if len(removedRelease) > 0 { audit.AddAuditAnnotation(req.Context(), removedReleaseAnnotationKey, removedRelease) } } - requestLatencies.WithLabelValues(reportedVerb, dryRun, group, version, resource, subresource, scope, component).Observe(elapsedSeconds) + requestLatencies.WithContext(req.Context()).WithLabelValues(reportedVerb, dryRun, group, version, resource, subresource, scope, component).Observe(elapsedSeconds) // We are only interested in response sizes of read requests. if verb == "GET" || verb == "LIST" { - responseSizes.WithLabelValues(reportedVerb, group, version, resource, subresource, scope, component).Observe(float64(respSize)) + responseSizes.WithContext(req.Context()).WithLabelValues(reportedVerb, group, version, resource, subresource, scope, component).Observe(float64(respSize)) } } @@ -448,7 +427,7 @@ func InstrumentRouteFunc(verb, group, version, resource, subresource, scope, com routeFunc(req, response) - MonitorRequest(req.Request, verb, group, version, resource, subresource, scope, component, deprecated, removedRelease, delegate.Header().Get("Content-Type"), delegate.Status(), delegate.ContentLength(), time.Since(requestReceivedTimestamp)) + MonitorRequest(req.Request, verb, group, version, resource, subresource, scope, component, deprecated, removedRelease, delegate.Status(), delegate.ContentLength(), time.Since(requestReceivedTimestamp)) }) } @@ -473,21 +452,8 @@ func InstrumentHandlerFunc(verb, group, version, resource, subresource, scope, c handler(w, req) - MonitorRequest(req, verb, group, version, resource, subresource, scope, component, deprecated, removedRelease, delegate.Header().Get("Content-Type"), delegate.Status(), delegate.ContentLength(), time.Since(requestReceivedTimestamp)) - } -} - -// cleanContentType binds the contentType (for metrics related purposes) to a -// bounded set of known/expected content-types. -func cleanContentType(contentType string) string { - normalizedContentType := strings.ToLower(contentType) - if strings.HasSuffix(contentType, " stream=watch") || strings.HasSuffix(contentType, " charset=utf-8") { - normalizedContentType = strings.ReplaceAll(contentType, " ", "") - } - if knownMetricContentTypes.Has(normalizedContentType) { - return normalizedContentType + MonitorRequest(req, verb, group, version, resource, subresource, scope, component, deprecated, removedRelease, delegate.Status(), delegate.ContentLength(), time.Since(requestReceivedTimestamp)) } - return OtherContentType } // CleanScope returns the scope of the request. diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/openapi/BUILD b/vendor/k8s.io/apiserver/pkg/endpoints/openapi/BUILD deleted file mode 100644 index 639f52d75661..000000000000 --- a/vendor/k8s.io/apiserver/pkg/endpoints/openapi/BUILD +++ /dev/null @@ -1,49 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["openapi_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/openapi/testing:go_default_library", - "//vendor/github.com/go-openapi/spec:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["openapi.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/endpoints/openapi", - importpath = "k8s.io/apiserver/pkg/endpoints/openapi", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/github.com/emicklei/go-restful:go_default_library", - "//vendor/github.com/go-openapi/spec:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/util:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiserver/pkg/endpoints/openapi/testing:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/openapi/OWNERS b/vendor/k8s.io/apiserver/pkg/endpoints/openapi/OWNERS deleted file mode 100644 index 006f0125e186..000000000000 --- a/vendor/k8s.io/apiserver/pkg/endpoints/openapi/OWNERS +++ /dev/null @@ -1,4 +0,0 @@ -# See the OWNERS docs at https://go.k8s.io/owners - -reviewers: -- mbohlool diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/request/BUILD b/vendor/k8s.io/apiserver/pkg/endpoints/request/BUILD deleted file mode 100644 index 7dbe7f652822..000000000000 --- a/vendor/k8s.io/apiserver/pkg/endpoints/request/BUILD +++ /dev/null @@ -1,57 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "context_test.go", - "received_time_test.go", - "requestinfo_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "context.go", - "doc.go", - "received_time.go", - "requestinfo.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/endpoints/request", - importpath = "k8s.io/apiserver/pkg/endpoints/request", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/validation/path:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/internalversion/scheme:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/request/auditid.go b/vendor/k8s.io/apiserver/pkg/endpoints/request/auditid.go new file mode 100644 index 000000000000..a7b3d84addb1 --- /dev/null +++ b/vendor/k8s.io/apiserver/pkg/endpoints/request/auditid.go @@ -0,0 +1,66 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package request + +import ( + "context" + "net/http" + + "k8s.io/apimachinery/pkg/types" +) + +type auditIDKeyType int + +// auditIDKey is the key to associate the Audit-ID value of a request. +const auditIDKey auditIDKeyType = iota + +// WithAuditID returns a copy of the parent context into which the Audit-ID +// associated with the request is set. +// +// If the specified auditID is empty, no value is set and the parent context is returned as is. +func WithAuditID(parent context.Context, auditID types.UID) context.Context { + if auditID == "" { + return parent + } + return WithValue(parent, auditIDKey, auditID) +} + +// AuditIDFrom returns the value of the audit ID from the request context. +func AuditIDFrom(ctx context.Context) (types.UID, bool) { + auditID, ok := ctx.Value(auditIDKey).(types.UID) + return auditID, ok +} + +// GetAuditIDTruncated returns the audit ID (truncated) associated with a request. +// If the length of the Audit-ID value exceeds the limit, we truncate it to keep +// the first N (maxAuditIDLength) characters. +// This is intended to be used in logging only. +func GetAuditIDTruncated(req *http.Request) string { + auditID, ok := AuditIDFrom(req.Context()) + if !ok { + return "" + } + + // if the user has specified a very long audit ID then we will use the first N characters + // Note: assuming Audit-ID header is in ASCII + const maxAuditIDLength = 64 + if len(auditID) > maxAuditIDLength { + auditID = auditID[0:maxAuditIDLength] + } + + return string(auditID) +} diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/request/context.go b/vendor/k8s.io/apiserver/pkg/endpoints/request/context.go index fe3ae38edcd7..95166f5c4741 100644 --- a/vendor/k8s.io/apiserver/pkg/endpoints/request/context.go +++ b/vendor/k8s.io/apiserver/pkg/endpoints/request/context.go @@ -36,9 +36,6 @@ const ( // auditKey is the context key for the audit event. auditKey - - // audiencesKey is the context key for request audiences. - audiencesKey ) // NewContext instantiates a base context object for request flows. diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/request/requestinfo.go b/vendor/k8s.io/apiserver/pkg/endpoints/request/requestinfo.go index 1f5dc28a9e12..2bc00a66e7b9 100644 --- a/vendor/k8s.io/apiserver/pkg/endpoints/request/requestinfo.go +++ b/vendor/k8s.io/apiserver/pkg/endpoints/request/requestinfo.go @@ -211,7 +211,7 @@ func (r *RequestInfoFactory) NewRequestInfo(req *http.Request) (*RequestInfo, er opts := metainternalversion.ListOptions{} if err := metainternalversionscheme.ParameterCodec.DecodeParameters(req.URL.Query(), metav1.SchemeGroupVersion, &opts); err != nil { // An error in parsing request will result in default to "list" and not setting "name" field. - klog.Errorf("Couldn't parse request %#v: %v", req.URL.Query(), err) + klog.ErrorS(err, "Couldn't parse request", "Request", req.URL.Query()) // Reset opts to not rely on partial results from parsing. // However, if watch is set, let's report it. opts = metainternalversion.ListOptions{} diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/warning/BUILD b/vendor/k8s.io/apiserver/pkg/endpoints/warning/BUILD deleted file mode 100644 index 748c41706a1f..000000000000 --- a/vendor/k8s.io/apiserver/pkg/endpoints/warning/BUILD +++ /dev/null @@ -1,27 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["warning.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/endpoints/warning", - importpath = "k8s.io/apiserver/pkg/endpoints/warning", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apiserver/pkg/warning:go_default_library", - "//vendor/github.com/emicklei/go-restful:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiserver/pkg/features/BUILD b/vendor/k8s.io/apiserver/pkg/features/BUILD deleted file mode 100644 index 19b5ca919bb2..000000000000 --- a/vendor/k8s.io/apiserver/pkg/features/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["kube_features.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/features", - importpath = "k8s.io/apiserver/pkg/features", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/features/kube_features.go b/vendor/k8s.io/apiserver/pkg/features/kube_features.go index 612be9845a23..f7706c248154 100644 --- a/vendor/k8s.io/apiserver/pkg/features/kube_features.go +++ b/vendor/k8s.io/apiserver/pkg/features/kube_features.go @@ -151,6 +151,7 @@ const ( // owner: @wojtek-t // alpha: v1.20 + // beta: v1.21 // // Allows for updating watchcache resource version with progress notify events. EfficientWatchResumption featuregate.Feature = "EfficientWatchResumption" @@ -185,6 +186,6 @@ var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureS RemoveSelfLink: {Default: true, PreRelease: featuregate.Beta}, SelectorIndex: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, WarningHeaders: {Default: true, PreRelease: featuregate.Beta}, - EfficientWatchResumption: {Default: false, PreRelease: featuregate.Alpha}, + EfficientWatchResumption: {Default: true, PreRelease: featuregate.Beta}, APIServerIdentity: {Default: false, PreRelease: featuregate.Alpha}, } diff --git a/vendor/k8s.io/apiserver/pkg/quota/v1/BUILD b/vendor/k8s.io/apiserver/pkg/quota/v1/BUILD deleted file mode 100644 index 9823957d716f..000000000000 --- a/vendor/k8s.io/apiserver/pkg/quota/v1/BUILD +++ /dev/null @@ -1,53 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "interfaces.go", - "resources.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/quota/v1", - importpath = "k8s.io/apiserver/pkg/quota/v1", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["resources_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiserver/pkg/quota/v1/generic:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/quota/v1/generic/BUILD b/vendor/k8s.io/apiserver/pkg/quota/v1/generic/BUILD deleted file mode 100644 index 80e175915f23..000000000000 --- a/vendor/k8s.io/apiserver/pkg/quota/v1/generic/BUILD +++ /dev/null @@ -1,49 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "configuration.go", - "evaluator.go", - "registry.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/quota/v1/generic", - importpath = "k8s.io/apiserver/pkg/quota/v1/generic", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/quota/v1:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["evaluator_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) diff --git a/vendor/k8s.io/apiserver/pkg/quota/v1/resources.go b/vendor/k8s.io/apiserver/pkg/quota/v1/resources.go index 3c2927d738b0..b66471920993 100644 --- a/vendor/k8s.io/apiserver/pkg/quota/v1/resources.go +++ b/vendor/k8s.io/apiserver/pkg/quota/v1/resources.go @@ -226,6 +226,17 @@ func IsZero(a corev1.ResourceList) bool { return true } +// RemoveZeros returns a new resource list that only has no zero values +func RemoveZeros(a corev1.ResourceList) corev1.ResourceList { + result := corev1.ResourceList{} + for key, value := range a { + if !value.IsZero() { + result[key] = value + } + } + return result +} + // IsNegative returns the set of resource names that have a negative value. func IsNegative(a corev1.ResourceList) []corev1.ResourceName { results := []corev1.ResourceName{} diff --git a/vendor/k8s.io/apiserver/pkg/registry/generic/BUILD b/vendor/k8s.io/apiserver/pkg/registry/generic/BUILD deleted file mode 100644 index 5bccea16fa2b..000000000000 --- a/vendor/k8s.io/apiserver/pkg/registry/generic/BUILD +++ /dev/null @@ -1,46 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "matcher.go", - "options.go", - "storage_decorator.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/registry/generic", - importpath = "k8s.io/apiserver/pkg/registry/generic", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/storagebackend:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/storagebackend/factory:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/rest:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/testing:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/registry/generic/OWNERS b/vendor/k8s.io/apiserver/pkg/registry/generic/OWNERS index 3ac0d161dc51..bf987ec8959e 100644 --- a/vendor/k8s.io/apiserver/pkg/registry/generic/OWNERS +++ b/vendor/k8s.io/apiserver/pkg/registry/generic/OWNERS @@ -11,8 +11,6 @@ reviewers: - caesarxuchao - mikedanese - liggitt -- nikhiljindal -- gmarek - davidopp - saad-ali - janetkuo diff --git a/vendor/k8s.io/apiserver/pkg/registry/generic/registry/BUILD b/vendor/k8s.io/apiserver/pkg/registry/generic/registry/BUILD deleted file mode 100644 index d948a3c0726c..000000000000 --- a/vendor/k8s.io/apiserver/pkg/registry/generic/registry/BUILD +++ /dev/null @@ -1,106 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "decorated_watcher_test.go", - "dryrun_test.go", - "store_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/apitesting:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/selection:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/example:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/example/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/cacher:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/testing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/storagebackend/factory:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/testing:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "decorated_watcher.go", - "doc.go", - "dryrun.go", - "storage_factory.go", - "store.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/registry/generic/registry", - importpath = "k8s.io/apiserver/pkg/registry/generic/registry", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/validation/path:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/cacher:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/errors:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/metrics:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/storagebackend:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/storagebackend/factory:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/dryrun:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/registry/generic/registry/decorated_watcher.go b/vendor/k8s.io/apiserver/pkg/registry/generic/registry/decorated_watcher.go index 005a376d404b..e341b371df6f 100644 --- a/vendor/k8s.io/apiserver/pkg/registry/generic/registry/decorated_watcher.go +++ b/vendor/k8s.io/apiserver/pkg/registry/generic/registry/decorated_watcher.go @@ -18,20 +18,18 @@ package registry import ( "context" - "net/http" - - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/watch" ) type decoratedWatcher struct { w watch.Interface - decorator ObjectFunc + decorator func(runtime.Object) cancel context.CancelFunc resultCh chan watch.Event } -func newDecoratedWatcher(w watch.Interface, decorator ObjectFunc) *decoratedWatcher { +func newDecoratedWatcher(w watch.Interface, decorator func(runtime.Object)) *decoratedWatcher { ctx, cancel := context.WithCancel(context.Background()) d := &decoratedWatcher{ w: w, @@ -56,11 +54,7 @@ func (d *decoratedWatcher) run(ctx context.Context) { } switch recv.Type { case watch.Added, watch.Modified, watch.Deleted, watch.Bookmark: - err := d.decorator(recv.Object) - if err != nil { - send = makeStatusErrorEvent(err) - break - } + d.decorator(recv.Object) send = recv case watch.Error: send = recv @@ -87,16 +81,3 @@ func (d *decoratedWatcher) Stop() { func (d *decoratedWatcher) ResultChan() <-chan watch.Event { return d.resultCh } - -func makeStatusErrorEvent(err error) watch.Event { - status := &metav1.Status{ - Status: metav1.StatusFailure, - Message: err.Error(), - Code: http.StatusInternalServerError, - Reason: metav1.StatusReasonInternalError, - } - return watch.Event{ - Type: watch.Error, - Object: status, - } -} diff --git a/vendor/k8s.io/apiserver/pkg/registry/generic/registry/dryrun.go b/vendor/k8s.io/apiserver/pkg/registry/generic/registry/dryrun.go index 2f184c50e01e..e25684a8a53b 100644 --- a/vendor/k8s.io/apiserver/pkg/registry/generic/registry/dryrun.go +++ b/vendor/k8s.io/apiserver/pkg/registry/generic/registry/dryrun.go @@ -43,7 +43,7 @@ func (s *DryRunnableStorage) Create(ctx context.Context, key string, obj, out ru return s.Storage.Create(ctx, key, obj, out, ttl) } -func (s *DryRunnableStorage) Delete(ctx context.Context, key string, out runtime.Object, preconditions *storage.Preconditions, deleteValidation storage.ValidateObjectFunc, dryRun bool) error { +func (s *DryRunnableStorage) Delete(ctx context.Context, key string, out runtime.Object, preconditions *storage.Preconditions, deleteValidation storage.ValidateObjectFunc, dryRun bool, cachedExistingObject runtime.Object) error { if dryRun { if err := s.Storage.Get(ctx, key, storage.GetOptions{}, out); err != nil { return err @@ -53,7 +53,7 @@ func (s *DryRunnableStorage) Delete(ctx context.Context, key string, out runtime } return deleteValidation(ctx, out) } - return s.Storage.Delete(ctx, key, out, preconditions, deleteValidation) + return s.Storage.Delete(ctx, key, out, preconditions, deleteValidation, cachedExistingObject) } func (s *DryRunnableStorage) Watch(ctx context.Context, key string, opts storage.ListOptions) (watch.Interface, error) { @@ -78,7 +78,7 @@ func (s *DryRunnableStorage) List(ctx context.Context, key string, opts storage. func (s *DryRunnableStorage) GuaranteedUpdate( ctx context.Context, key string, ptrToType runtime.Object, ignoreNotFound bool, - preconditions *storage.Preconditions, tryUpdate storage.UpdateFunc, dryRun bool, suggestion runtime.Object) error { + preconditions *storage.Preconditions, tryUpdate storage.UpdateFunc, dryRun bool, cachedExistingObject runtime.Object) error { if dryRun { err := s.Storage.Get(ctx, key, storage.GetOptions{IgnoreNotFound: ignoreNotFound}, ptrToType) if err != nil { @@ -98,7 +98,7 @@ func (s *DryRunnableStorage) GuaranteedUpdate( } return s.copyInto(out, ptrToType) } - return s.Storage.GuaranteedUpdate(ctx, key, ptrToType, ignoreNotFound, preconditions, tryUpdate, suggestion) + return s.Storage.GuaranteedUpdate(ctx, key, ptrToType, ignoreNotFound, preconditions, tryUpdate, cachedExistingObject) } func (s *DryRunnableStorage) Count(key string) (int64, error) { diff --git a/vendor/k8s.io/apiserver/pkg/registry/generic/registry/store.go b/vendor/k8s.io/apiserver/pkg/registry/generic/registry/store.go index 7c2f4c390eba..d40214f9db9b 100644 --- a/vendor/k8s.io/apiserver/pkg/registry/generic/registry/store.go +++ b/vendor/k8s.io/apiserver/pkg/registry/generic/registry/store.go @@ -19,7 +19,6 @@ package registry import ( "context" "fmt" - "reflect" "strings" "sync" "time" @@ -46,27 +45,41 @@ import ( "k8s.io/apiserver/pkg/storage/etcd3/metrics" "k8s.io/apiserver/pkg/util/dryrun" "k8s.io/client-go/tools/cache" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" "k8s.io/klog/v2" ) -// ObjectFunc is a function to act on a given object. An error may be returned -// if the hook cannot be completed. An ObjectFunc may transform the provided -// object. -type ObjectFunc func(obj runtime.Object) error +// FinishFunc is a function returned by Begin hooks to complete an operation. +type FinishFunc func(ctx context.Context, success bool) + +// AfterDeleteFunc is the type used for the Store.AfterDelete hook. +type AfterDeleteFunc func(obj runtime.Object, options *metav1.DeleteOptions) + +// BeginCreateFunc is the type used for the Store.BeginCreate hook. +type BeginCreateFunc func(ctx context.Context, obj runtime.Object, options *metav1.CreateOptions) (FinishFunc, error) + +// AfterCreateFunc is the type used for the Store.AfterCreate hook. +type AfterCreateFunc func(obj runtime.Object, options *metav1.CreateOptions) + +// BeginUpdateFunc is the type used for the Store.BeginUpdate hook. +type BeginUpdateFunc func(ctx context.Context, obj, old runtime.Object, options *metav1.UpdateOptions) (FinishFunc, error) + +// AfterUpdateFunc is the type used for the Store.AfterUpdate hook. +type AfterUpdateFunc func(obj runtime.Object, options *metav1.UpdateOptions) // GenericStore interface can be used for type assertions when we need to access the underlying strategies. type GenericStore interface { GetCreateStrategy() rest.RESTCreateStrategy GetUpdateStrategy() rest.RESTUpdateStrategy GetDeleteStrategy() rest.RESTDeleteStrategy - GetExportStrategy() rest.RESTExportStrategy } -// Store implements pkg/api/rest.StandardStorage. It's intended to be -// embeddable and allows the consumer to implement any non-generic functions -// that are required. This object is intended to be copyable so that it can be -// used in different ways but share the same underlying behavior. +// Store implements k8s.io/apiserver/pkg/registry/rest.StandardStorage. It's +// intended to be embeddable and allows the consumer to implement any +// non-generic functions that are required. This object is intended to be +// copyable so that it can be used in different ways but share the same +// underlying behavior. // // All fields are required unless specified. // @@ -145,24 +158,37 @@ type Store struct { // integrations that are above storage and should only be used for // specific cases where storage of the value is not appropriate, since // they cannot be watched. - Decorator ObjectFunc + Decorator func(runtime.Object) + // CreateStrategy implements resource-specific behavior during creation. CreateStrategy rest.RESTCreateStrategy + // BeginCreate is an optional hook that returns a "transaction-like" + // commit/revert function which will be called at the end of the operation, + // but before AfterCreate and Decorator, indicating via the argument + // whether the operation succeeded. If this returns an error, the function + // is not called. Almost nobody should use this hook. + BeginCreate BeginCreateFunc // AfterCreate implements a further operation to run after a resource is // created and before it is decorated, optional. - AfterCreate ObjectFunc + AfterCreate AfterCreateFunc // UpdateStrategy implements resource-specific behavior during updates. UpdateStrategy rest.RESTUpdateStrategy + // BeginUpdate is an optional hook that returns a "transaction-like" + // commit/revert function which will be called at the end of the operation, + // but before AfterUpdate and Decorator, indicating via the argument + // whether the operation succeeded. If this returns an error, the function + // is not called. Almost nobody should use this hook. + BeginUpdate BeginUpdateFunc // AfterUpdate implements a further operation to run after a resource is // updated and before it is decorated, optional. - AfterUpdate ObjectFunc + AfterUpdate AfterUpdateFunc // DeleteStrategy implements resource-specific behavior during deletion. DeleteStrategy rest.RESTDeleteStrategy // AfterDelete implements a further operation to run after a resource is // deleted and before it is decorated, optional. - AfterDelete ObjectFunc + AfterDelete AfterDeleteFunc // ReturnDeletedObject determines whether the Store returns the object // that was deleted. Otherwise, return a generic success status response. ReturnDeletedObject bool @@ -171,13 +197,15 @@ type Store struct { // If specified, this is checked in addition to standard finalizer, // deletionTimestamp, and deletionGracePeriodSeconds checks. ShouldDeleteDuringUpdate func(ctx context.Context, key string, obj, existing runtime.Object) bool - // ExportStrategy implements resource-specific behavior during export, - // optional. Exported objects are not decorated. - ExportStrategy rest.RESTExportStrategy + // TableConvertor is an optional interface for transforming items or lists // of items into tabular output. If unset, the default will be used. TableConvertor rest.TableConvertor + // ResetFieldsStrategy provides the fields reset by the strategy that + // should not be modified by the user. + ResetFieldsStrategy rest.ResetFieldsStrategy + // Storage is the interface for the underlying storage for the // resource. It is wrapped into a "DryRunnableStorage" that will // either pass-through or simply dry-run. @@ -194,7 +222,6 @@ type Store struct { // Note: the rest.StandardStorage interface aggregates the common REST verbs var _ rest.StandardStorage = &Store{} -var _ rest.Exporter = &Store{} var _ rest.TableConvertor = &Store{} var _ GenericStore = &Store{} @@ -283,11 +310,6 @@ func (e *Store) GetDeleteStrategy() rest.RESTDeleteStrategy { return e.DeleteStrategy } -// GetExportStrategy implements GenericStore. -func (e *Store) GetExportStrategy() rest.RESTExportStrategy { - return e.ExportStrategy -} - // List returns a list of items matching labels and field according to the // store's PredicateFunc. func (e *Store) List(ctx context.Context, options *metainternalversion.ListOptions) (runtime.Object, error) { @@ -304,9 +326,7 @@ func (e *Store) List(ctx context.Context, options *metainternalversion.ListOptio return nil, err } if e.Decorator != nil { - if err := e.Decorator(out); err != nil { - return nil, err - } + e.Decorator(out) } return out, nil } @@ -335,8 +355,24 @@ func (e *Store) ListPredicate(ctx context.Context, p storage.SelectionPredicate, return list, storeerr.InterpretListError(err, qualifiedResource) } +// finishNothing is a do-nothing FinishFunc. +func finishNothing(context.Context, bool) {} + // Create inserts a new item according to the unique key from the object. func (e *Store) Create(ctx context.Context, obj runtime.Object, createValidation rest.ValidateObjectFunc, options *metav1.CreateOptions) (runtime.Object, error) { + var finishCreate FinishFunc = finishNothing + + if e.BeginCreate != nil { + fn, err := e.BeginCreate(ctx, obj, options) + if err != nil { + return nil, err + } + finishCreate = fn + defer func() { + finishCreate(ctx, false) + }() + } + if err := rest.BeforeCreate(e.CreateStrategy, ctx, obj); err != nil { return nil, err } @@ -381,15 +417,17 @@ func (e *Store) Create(ctx context.Context, obj runtime.Object, createValidation } return nil, err } + // The operation has succeeded. Call the finish function if there is one, + // and then make sure the defer doesn't call it again. + fn := finishCreate + finishCreate = finishNothing + fn(ctx, true) + if e.AfterCreate != nil { - if err := e.AfterCreate(out); err != nil { - return nil, err - } + e.AfterCreate(out, options) } if e.Decorator != nil { - if err := e.Decorator(out); err != nil { - return nil, err - } + e.Decorator(out) } return out, nil } @@ -424,16 +462,16 @@ func ShouldDeleteDuringUpdate(ctx context.Context, key string, obj, existing run // deleteWithoutFinalizers handles deleting an object ignoring its finalizer list. // Used for objects that are either been finalized or have never initialized. -func (e *Store) deleteWithoutFinalizers(ctx context.Context, name, key string, obj runtime.Object, preconditions *storage.Preconditions, dryRun bool) (runtime.Object, bool, error) { +func (e *Store) deleteWithoutFinalizers(ctx context.Context, name, key string, obj runtime.Object, preconditions *storage.Preconditions, options *metav1.DeleteOptions) (runtime.Object, bool, error) { out := e.NewFunc() klog.V(6).Infof("going to delete %s from registry, triggered by update", name) // Using the rest.ValidateAllObjectFunc because the request is an UPDATE request and has already passed the admission for the UPDATE verb. - if err := e.Storage.Delete(ctx, key, out, preconditions, rest.ValidateAllObjectFunc, dryRun); err != nil { + if err := e.Storage.Delete(ctx, key, out, preconditions, rest.ValidateAllObjectFunc, dryrun.IsDryRun(options.DryRun), nil); err != nil { // Deletion is racy, i.e., there could be multiple update // requests to remove all finalizers from the object, so we // ignore the NotFound error. if storage.IsNotFound(err) { - _, err := e.finalizeDelete(ctx, obj, true) + _, err := e.finalizeDelete(ctx, obj, true, options) // clients are expecting an updated object if a PUT succeeded, // but finalizeDelete returns a metav1.Status, so return // the object in the request instead. @@ -441,7 +479,7 @@ func (e *Store) deleteWithoutFinalizers(ctx context.Context, name, key string, o } return nil, false, storeerr.InterpretDeleteError(err, e.qualifiedResourceFromContext(ctx), name) } - _, err := e.finalizeDelete(ctx, out, true) + _, err := e.finalizeDelete(ctx, out, true, options) // clients are expecting an updated object if a PUT succeeded, but // finalizeDelete returns a metav1.Status, so return the object in // the request instead. @@ -500,6 +538,19 @@ func (e *Store) Update(ctx context.Context, name string, objInfo rest.UpdatedObj doUnconditionalUpdate := newResourceVersion == 0 && e.UpdateStrategy.AllowUnconditionalUpdate() if existingResourceVersion == 0 { + var finishCreate FinishFunc = finishNothing + + if e.BeginCreate != nil { + fn, err := e.BeginCreate(ctx, obj, newCreateOptionsFromUpdateOptions(options)) + if err != nil { + return nil, nil, err + } + finishCreate = fn + defer func() { + finishCreate(ctx, false) + }() + } + creating = true creatingObj = obj if err := rest.BeforeCreate(e.CreateStrategy, ctx, obj); err != nil { @@ -517,6 +568,12 @@ func (e *Store) Update(ctx context.Context, name string, objInfo rest.UpdatedObj return nil, nil, err } + // The operation has succeeded. Call the finish function if there is one, + // and then make sure the defer doesn't call it again. + fn := finishCreate + finishCreate = finishNothing + fn(ctx, true) + return obj, &ttl, nil } @@ -544,6 +601,20 @@ func (e *Store) Update(ctx context.Context, name string, objInfo rest.UpdatedObj return nil, nil, apierrors.NewConflict(qualifiedResource, name, fmt.Errorf(OptimisticLockErrorMsg)) } } + + var finishUpdate FinishFunc = finishNothing + + if e.BeginUpdate != nil { + fn, err := e.BeginUpdate(ctx, obj, existing, options) + if err != nil { + return nil, nil, err + } + finishUpdate = fn + defer func() { + finishUpdate(ctx, false) + }() + } + if err := rest.BeforeUpdate(e.UpdateStrategy, ctx, obj, existing); err != nil { return nil, nil, err } @@ -564,6 +635,13 @@ func (e *Store) Update(ctx context.Context, name string, objInfo rest.UpdatedObj if err != nil { return nil, nil, err } + + // The operation has succeeded. Call the finish function if there is one, + // and then make sure the defer doesn't call it again. + fn := finishUpdate + finishUpdate = finishNothing + fn(ctx, true) + if int64(ttl) != res.TTL { return obj, &ttl, nil } @@ -573,7 +651,7 @@ func (e *Store) Update(ctx context.Context, name string, objInfo rest.UpdatedObj if err != nil { // delete the object if err == errEmptiedFinalizers { - return e.deleteWithoutFinalizers(ctx, name, key, deleteObj, storagePreconditions, dryrun.IsDryRun(options.DryRun)) + return e.deleteWithoutFinalizers(ctx, name, key, deleteObj, storagePreconditions, newDeleteOptionsFromUpdateOptions(options)) } if creating { err = storeerr.InterpretCreateError(err, qualifiedResource, name) @@ -586,25 +664,40 @@ func (e *Store) Update(ctx context.Context, name string, objInfo rest.UpdatedObj if creating { if e.AfterCreate != nil { - if err := e.AfterCreate(out); err != nil { - return nil, false, err - } + e.AfterCreate(out, newCreateOptionsFromUpdateOptions(options)) } } else { if e.AfterUpdate != nil { - if err := e.AfterUpdate(out); err != nil { - return nil, false, err - } + e.AfterUpdate(out, options) } } if e.Decorator != nil { - if err := e.Decorator(out); err != nil { - return nil, false, err - } + e.Decorator(out) } return out, creating, nil } +// This is a helper to convert UpdateOptions to CreateOptions for the +// create-on-update path. +func newCreateOptionsFromUpdateOptions(in *metav1.UpdateOptions) *metav1.CreateOptions { + co := &metav1.CreateOptions{ + DryRun: in.DryRun, + FieldManager: in.FieldManager, + } + co.TypeMeta.SetGroupVersionKind(metav1.SchemeGroupVersion.WithKind("CreateOptions")) + return co +} + +// This is a helper to convert UpdateOptions to DeleteOptions for the +// delete-on-update path. +func newDeleteOptionsFromUpdateOptions(in *metav1.UpdateOptions) *metav1.DeleteOptions { + do := &metav1.DeleteOptions{ + DryRun: in.DryRun, + } + do.TypeMeta.SetGroupVersionKind(metav1.SchemeGroupVersion.WithKind("DeleteOptions")) + return do +} + // Get retrieves the item from storage. func (e *Store) Get(ctx context.Context, name string, options *metav1.GetOptions) (runtime.Object, error) { obj := e.NewFunc() @@ -616,9 +709,7 @@ func (e *Store) Get(ctx context.Context, name string, options *metav1.GetOptions return nil, storeerr.InterpretGetError(err, e.qualifiedResourceFromContext(ctx), name) } if e.Decorator != nil { - if err := e.Decorator(obj); err != nil { - return nil, err - } + e.Decorator(obj) } return obj, nil } @@ -658,7 +749,9 @@ func shouldOrphanDependents(ctx context.Context, e *Store, accessor metav1.Objec } // An explicit policy was set at deletion time, that overrides everything + //lint:ignore SA1019 backwards compatibility if options != nil && options.OrphanDependents != nil { + //lint:ignore SA1019 backwards compatibility return *options.OrphanDependents } if options != nil && options.PropagationPolicy != nil { @@ -699,6 +792,7 @@ func shouldDeleteDependents(ctx context.Context, e *Store, accessor metav1.Objec } // If an explicit policy was set at deletion time, that overrides both + //lint:ignore SA1019 backwards compatibility if options != nil && options.OrphanDependents != nil { return false } @@ -879,7 +973,7 @@ func (e *Store) updateForGracefulDeletionAndFinalizers(ctx context.Context, name // we should fall through and truly delete the object. return nil, false, true, out, lastExisting case errAlreadyDeleting: - out, err = e.finalizeDelete(ctx, in, true) + out, err = e.finalizeDelete(ctx, in, true, options) return err, false, false, out, lastExisting default: return storeerr.InterpretUpdateError(err, e.qualifiedResourceFromContext(ctx), name), false, false, out, lastExisting @@ -913,7 +1007,7 @@ func (e *Store) Delete(ctx context.Context, name string, deleteValidation rest.V } // this means finalizers cannot be updated via DeleteOptions if a deletion is already pending if pendingGraceful { - out, err := e.finalizeDelete(ctx, obj, false) + out, err := e.finalizeDelete(ctx, obj, false, options) return out, false, err } // check if obj has pending finalizers @@ -963,18 +1057,18 @@ func (e *Store) Delete(ctx context.Context, name string, deleteValidation rest.V // delete immediately, or no graceful deletion supported klog.V(6).Infof("going to delete %s from registry: ", name) out = e.NewFunc() - if err := e.Storage.Delete(ctx, key, out, &preconditions, storage.ValidateObjectFunc(deleteValidation), dryrun.IsDryRun(options.DryRun)); err != nil { + if err := e.Storage.Delete(ctx, key, out, &preconditions, storage.ValidateObjectFunc(deleteValidation), dryrun.IsDryRun(options.DryRun), nil); err != nil { // Please refer to the place where we set ignoreNotFound for the reason // why we ignore the NotFound error . if storage.IsNotFound(err) && ignoreNotFound && lastExisting != nil { // The lastExisting object may not be the last state of the object // before its deletion, but it's the best approximation. - out, err := e.finalizeDelete(ctx, lastExisting, true) + out, err := e.finalizeDelete(ctx, lastExisting, true, options) return out, true, err } return nil, false, storeerr.InterpretDeleteError(err, qualifiedResource, name) } - out, err = e.finalizeDelete(ctx, out, true) + out, err = e.finalizeDelete(ctx, out, true, options) return out, true, err } @@ -1072,17 +1166,13 @@ func (e *Store) DeleteCollection(ctx context.Context, deleteValidation rest.Vali // finalizeDelete runs the Store's AfterDelete hook if runHooks is set and // returns the decorated deleted object if appropriate. -func (e *Store) finalizeDelete(ctx context.Context, obj runtime.Object, runHooks bool) (runtime.Object, error) { +func (e *Store) finalizeDelete(ctx context.Context, obj runtime.Object, runHooks bool, options *metav1.DeleteOptions) (runtime.Object, error) { if runHooks && e.AfterDelete != nil { - if err := e.AfterDelete(obj); err != nil { - return nil, err - } + e.AfterDelete(obj, options) } if e.ReturnDeletedObject { if e.Decorator != nil { - if err := e.Decorator(obj); err != nil { - return nil, err - } + e.Decorator(obj) } return obj, nil } @@ -1173,44 +1263,6 @@ func (e *Store) calculateTTL(obj runtime.Object, defaultTTL int64, update bool) return ttl, err } -// exportObjectMeta unsets the fields on the given object that should not be -// present when the object is exported. -func exportObjectMeta(accessor metav1.Object, exact bool) { - accessor.SetUID("") - if !exact { - accessor.SetNamespace("") - } - accessor.SetCreationTimestamp(metav1.Time{}) - accessor.SetDeletionTimestamp(nil) - accessor.SetResourceVersion("") - accessor.SetSelfLink("") - if len(accessor.GetGenerateName()) > 0 && !exact { - accessor.SetName("") - } -} - -// Export implements the rest.Exporter interface -func (e *Store) Export(ctx context.Context, name string, opts metav1.ExportOptions) (runtime.Object, error) { - obj, err := e.Get(ctx, name, &metav1.GetOptions{}) - if err != nil { - return nil, err - } - if accessor, err := meta.Accessor(obj); err == nil { - exportObjectMeta(accessor, opts.Exact) - } else { - klog.V(4).Infof("Object of type %v does not have ObjectMeta: %v", reflect.TypeOf(obj), err) - } - - if e.ExportStrategy != nil { - if err = e.ExportStrategy.Export(ctx, obj, opts.Exact); err != nil { - return nil, err - } - } else { - e.CreateStrategy.PrepareForCreate(ctx, obj) - } - return obj, nil -} - // CompleteWithOptions updates the store with the provided options and // defaults common fields. func (e *Store) CompleteWithOptions(options *generic.StoreOptions) error { @@ -1398,6 +1450,14 @@ func (e *Store) StorageVersion() runtime.GroupVersioner { return e.StorageVersioner } +// GetResetFields implements rest.ResetFieldsStrategy +func (e *Store) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + if e.ResetFieldsStrategy == nil { + return nil + } + return e.ResetFieldsStrategy.GetResetFields() +} + // validateIndexers will check the prefix of indexers. func validateIndexers(indexers *cache.Indexers) error { if indexers == nil { diff --git a/vendor/k8s.io/apiserver/pkg/registry/generic/rest/BUILD b/vendor/k8s.io/apiserver/pkg/registry/generic/rest/BUILD deleted file mode 100644 index d282606c64a3..000000000000 --- a/vendor/k8s.io/apiserver/pkg/registry/generic/rest/BUILD +++ /dev/null @@ -1,53 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "response_checker_test.go", - "streamer_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "response_checker.go", - "streamer.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/registry/generic/rest", - importpath = "k8s.io/apiserver/pkg/registry/generic/rest", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/registry/generic/rest/streamer.go b/vendor/k8s.io/apiserver/pkg/registry/generic/rest/streamer.go index be911fab2f1f..cb9e4898cd5e 100644 --- a/vendor/k8s.io/apiserver/pkg/registry/generic/rest/streamer.go +++ b/vendor/k8s.io/apiserver/pkg/registry/generic/rest/streamer.go @@ -30,6 +30,10 @@ import ( "k8s.io/apiserver/pkg/registry/rest" ) +type CounterMetric interface { + Inc() +} + // LocationStreamer is a resource that streams the contents of a particular // location URL. type LocationStreamer struct { @@ -39,6 +43,9 @@ type LocationStreamer struct { Flush bool ResponseChecker HttpResponseChecker RedirectChecker func(req *http.Request, via []*http.Request) error + // TLSVerificationErrorCounter is an optional value that will Inc every time a TLS error is encountered. This can + // be wired a single prometheus counter instance to get counts overall. + TLSVerificationErrorCounter CounterMetric } // a LocationStreamer must implement a rest.ResourceStreamer @@ -77,6 +84,10 @@ func (s *LocationStreamer) InputStream(ctx context.Context, apiVersion, acceptHe resp, err := client.Do(req) if err != nil { + // TODO prefer segregate TLS errors more reliably, but we do want to increment a count + if strings.Contains(err.Error(), "x509:") && s.TLSVerificationErrorCounter != nil { + s.TLSVerificationErrorCounter.Inc() + } return nil, false, "", err } diff --git a/vendor/k8s.io/apiserver/pkg/registry/rest/BUILD b/vendor/k8s.io/apiserver/pkg/registry/rest/BUILD deleted file mode 100644 index 1c04312bcd8e..000000000000 --- a/vendor/k8s.io/apiserver/pkg/registry/rest/BUILD +++ /dev/null @@ -1,71 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["meta_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/example:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "create.go", - "create_update.go", - "delete.go", - "doc.go", - "export.go", - "meta.go", - "rest.go", - "table.go", - "update.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/registry/rest", - importpath = "k8s.io/apiserver/pkg/registry/rest", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/validation/path:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/features:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiserver/pkg/registry/rest/resttest:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/registry/rest/OWNERS b/vendor/k8s.io/apiserver/pkg/registry/rest/OWNERS index 55e6178184c0..f1366aa97658 100644 --- a/vendor/k8s.io/apiserver/pkg/registry/rest/OWNERS +++ b/vendor/k8s.io/apiserver/pkg/registry/rest/OWNERS @@ -10,14 +10,11 @@ reviewers: - caesarxuchao - mikedanese - liggitt -- nikhiljindal -- gmarek - justinsb - ncdc - dims - hongchaodeng - krousey - ingvagabund -- jianhuiz - sdminonne - enj diff --git a/vendor/k8s.io/apiserver/pkg/registry/rest/export.go b/vendor/k8s.io/apiserver/pkg/registry/rest/export.go deleted file mode 100644 index b3fd8af3001e..000000000000 --- a/vendor/k8s.io/apiserver/pkg/registry/rest/export.go +++ /dev/null @@ -1,34 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package rest - -import ( - "context" - - "k8s.io/apimachinery/pkg/runtime" -) - -// RESTExportStrategy is the interface that defines how to export a Kubernetes -// object. An exported object is stripped of non-user-settable fields and -// optionally, the identifying information related to the object's identity in -// the cluster so that it can be loaded into a different namespace or entirely -// different cluster without conflict. -type RESTExportStrategy interface { - // Export strips fields that can not be set by the user. If 'exact' is false - // fields specific to the cluster are also stripped - Export(ctx context.Context, obj runtime.Object, exact bool) error -} diff --git a/vendor/k8s.io/apiserver/pkg/registry/rest/rest.go b/vendor/k8s.io/apiserver/pkg/registry/rest/rest.go index 8f9c981dd858..8dba9b84bf85 100644 --- a/vendor/k8s.io/apiserver/pkg/registry/rest/rest.go +++ b/vendor/k8s.io/apiserver/pkg/registry/rest/rest.go @@ -27,6 +27,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/watch" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) //TODO: @@ -102,16 +103,6 @@ type Lister interface { TableConvertor } -// Exporter is an object that knows how to strip a RESTful resource for export. A store should implement this interface -// if export is generally supported for that type. Errors can still be returned during the actual Export when certain -// instances of the type are not exportable. -type Exporter interface { - // Export an object. Fields that are not user specified (e.g. Status, ObjectMeta.ResourceVersion) are stripped out - // Returns the stripped object. If 'exact' is true, fields that are specific to the cluster (e.g. namespace) are - // retained, otherwise they are stripped also. - Export(ctx context.Context, name string, opts metav1.ExportOptions) (runtime.Object, error) -} - // Getter is an object that can retrieve a named RESTful resource. type Getter interface { // Get finds a resource in the storage by name and returns it. @@ -214,7 +205,7 @@ type UpdatedObjectInfo interface { } // ValidateObjectFunc is a function to act on a given object. An error may be returned -// if the hook cannot be completed. An ObjectFunc may NOT transform the provided +// if the hook cannot be completed. A ValidateObjectFunc may NOT transform the provided // object. type ValidateObjectFunc func(ctx context.Context, obj runtime.Object) error @@ -349,3 +340,23 @@ type StorageVersionProvider interface { // list of kinds the object might belong to. StorageVersion() runtime.GroupVersioner } + +// ResetFieldsStrategy is an optional interface that a storage object can +// implement if it wishes to provide the fields reset by its strategies. +type ResetFieldsStrategy interface { + GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set +} + +// CreateUpdateResetFieldsStrategy is a union of RESTCreateUpdateStrategy +// and ResetFieldsStrategy. +type CreateUpdateResetFieldsStrategy interface { + RESTCreateUpdateStrategy + ResetFieldsStrategy +} + +// UpdateResetFieldsStrategy is a union of RESTUpdateStrategy +// and ResetFieldsStrategy. +type UpdateResetFieldsStrategy interface { + RESTUpdateStrategy + ResetFieldsStrategy +} diff --git a/vendor/k8s.io/apiserver/pkg/server/BUILD b/vendor/k8s.io/apiserver/pkg/server/BUILD deleted file mode 100644 index 7904109dbb83..000000000000 --- a/vendor/k8s.io/apiserver/pkg/server/BUILD +++ /dev/null @@ -1,175 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "config_selfclient_test.go", - "config_test.go", - "genericapiserver_test.go", - "graceful_shutdown_test.go", - "healthz_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/json:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/waitgroup:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/version:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/example:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/example/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/audit:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/audit/policy:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/discovery:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/filters:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/openapi:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/filters:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/healthz:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//vendor/github.com/go-openapi/spec:go_default_library", - "//vendor/github.com/google/go-cmp/cmp:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/golang.org/x/net/http2:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/common:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "config.go", - "config_selfclient.go", - "deprecated_insecure_serving.go", - "doc.go", - "genericapiserver.go", - "handler.go", - "healthz.go", - "hooks.go", - "patch.go", - "patch_genericapiserver.go", - "plugins.go", - "secure_serving.go", - "signal.go", - "signal_posix.go", - "signal_windows.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/server", - importpath = "k8s.io/apiserver/pkg/server", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/waitgroup:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/version:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/namespace/lifecycle:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/mutating:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/validating:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/apiserver/install:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/audit:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/audit/policy:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/authenticatorfactory:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/request/union:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizerfactory:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/union:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/discovery:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/filterlatency:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/filters:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/metrics:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/openapi:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/features:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/dynamiccertificates:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/egressselector:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/filters:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/healthz:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/mux:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/routes:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/storage:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storageversion:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/openapi:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/component-base/cli/flag:go_default_library", - "//staging/src/k8s.io/component-base/logs:go_default_library", - "//vendor/github.com/coreos/go-systemd/daemon:go_default_library", - "//vendor/github.com/emicklei/go-restful:go_default_library", - "//vendor/github.com/evanphx/json-patch:go_default_library", - "//vendor/github.com/go-openapi/spec:go_default_library", - "//vendor/github.com/google/uuid:go_default_library", - "//vendor/go.uber.org/atomic:go_default_library", - "//vendor/golang.org/x/net/http2:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/builder:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/common:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/handler:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/util:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/util/proto:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiserver/pkg/server/dynamiccertificates:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/server/egressselector:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/server/filters:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/server/healthz:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/server/httplog:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/server/mux:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/server/options:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/server/resourceconfig:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/server/routes:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/server/storage:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/server/config.go b/vendor/k8s.io/apiserver/pkg/server/config.go index fdba11c1fa48..1bc66cee29cc 100644 --- a/vendor/k8s.io/apiserver/pkg/server/config.go +++ b/vendor/k8s.io/apiserver/pkg/server/config.go @@ -117,7 +117,7 @@ type Config struct { // to set values and determine whether its allowed AdmissionControl admission.Interface CorsAllowedOriginList []string - + HSTSDirectives []string // FlowControl, if not nil, gives priority and fairness to request handling FlowControl utilflowcontrol.Interface @@ -170,6 +170,8 @@ type Config struct { Serializer runtime.NegotiatedSerializer // OpenAPIConfig will be used in generating OpenAPI spec. This is nil by default. Use DefaultOpenAPIConfig for "working" defaults. OpenAPIConfig *openapicommon.Config + // SkipOpenAPIInstallation avoids installing the OpenAPI handler if set to true. + SkipOpenAPIInstallation bool // RESTOptionsGetter is used to construct RESTStorage types via the generic registry. RESTOptionsGetter genericregistry.RESTOptionsGetter @@ -605,7 +607,7 @@ func eventReference() (*corev1.ObjectReference, error) { } // New creates a new server which logically combines the handling chain with the passed server. -// name is used to differentiate for logging. The handler chain in particular can be difficult as it starts delgating. +// name is used to differentiate for logging. The handler chain in particular can be difficult as it starts delegating. // delegationTarget may not be nil. func (c completedConfig) New(name string, delegationTarget DelegationTarget) (*GenericAPIServer, error) { if c.Serializer == nil { @@ -645,7 +647,8 @@ func (c completedConfig) New(name string, delegationTarget DelegationTarget) (*G listedPathProvider: apiServerHandler, - openAPIConfig: c.OpenAPIConfig, + openAPIConfig: c.OpenAPIConfig, + skipOpenAPIInstallation: c.SkipOpenAPIInstallation, postStartHooks: map[string]postStartHookEntry{}, preShutdownHooks: map[string]preShutdownHookEntry{}, @@ -717,7 +720,7 @@ func (c completedConfig) New(name string, delegationTarget DelegationTarget) (*G } } // TODO: Once we get rid of /healthz consider changing this to post-start-hook. - err := s.addReadyzChecks(healthz.NewInformerSyncHealthz(c.SharedInformerFactory)) + err := s.AddReadyzChecks(healthz.NewInformerSyncHealthz(c.SharedInformerFactory)) if err != nil { return nil, err } @@ -847,8 +850,11 @@ func DefaultBuildHandlerChain(apiHandler http.Handler, c *Config) http.Handler { handler = genericapifilters.WithAuditAnnotations(handler, c.AuditBackend, c.AuditPolicyChecker) handler = genericapifilters.WithWarningRecorder(handler) handler = genericapifilters.WithCacheControl(handler) + handler = genericfilters.WithHSTS(handler, c.HSTSDirectives) + handler = genericfilters.WithHTTPLogging(handler, c.IsTerminating) handler = genericapifilters.WithRequestReceivedTimestamp(handler) - handler = genericfilters.WithPanicRecovery(handler, c.RequestInfoResolver, c.IsTerminating) + handler = genericfilters.WithPanicRecovery(handler, c.RequestInfoResolver) + handler = genericapifilters.WithAuditID(handler) return handler } diff --git a/vendor/k8s.io/apiserver/pkg/server/deleted_kinds.go b/vendor/k8s.io/apiserver/pkg/server/deleted_kinds.go new file mode 100644 index 000000000000..e9aed99ed6b4 --- /dev/null +++ b/vendor/k8s.io/apiserver/pkg/server/deleted_kinds.go @@ -0,0 +1,198 @@ +/* +Copyright 2020 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package server + +import ( + "os" + "strconv" + "strings" + + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" + "k8s.io/apimachinery/pkg/util/sets" + apimachineryversion "k8s.io/apimachinery/pkg/version" + "k8s.io/apiserver/pkg/registry/rest" + "k8s.io/klog/v2" +) + +// resourceExpirationEvaluator holds info for deciding if a particular rest.Storage needs to excluded from the API +type resourceExpirationEvaluator struct { + currentMajor int + currentMinor int + isAlpha bool + // This is usually set for testing for which tests need to be removed. This prevent insta-failing CI. + // Set KUBE_APISERVER_STRICT_REMOVED_API_HANDLING_IN_ALPHA to see what will be removed when we tag beta + strictRemovedHandlingInAlpha bool + // This is usually set by a cluster-admin looking for a short-term escape hatch after something bad happened. + // This should be made a flag before merge + // Set KUBE_APISERVER_SERVE_REMOVED_APIS_FOR_ONE_RELEASE to prevent removing APIs for one more release. + serveRemovedAPIsOneMoreRelease bool +} + +// ResourceExpirationEvaluator indicates whether or not a resource should be served. +type ResourceExpirationEvaluator interface { + // RemoveDeletedKinds inspects the storage map and modifies it in place by removing storage for kinds that have been deleted. + // versionedResourcesStorageMap mirrors the field on APIGroupInfo, it's a map from version to resource to the storage. + RemoveDeletedKinds(groupName string, versioner runtime.ObjectVersioner, versionedResourcesStorageMap map[string]map[string]rest.Storage) + // ShouldServeForVersion returns true if a particular version cut off is after the current version + ShouldServeForVersion(majorRemoved, minorRemoved int) bool +} + +func NewResourceExpirationEvaluator(currentVersion apimachineryversion.Info) (ResourceExpirationEvaluator, error) { + ret := &resourceExpirationEvaluator{} + if len(currentVersion.Major) > 0 { + currentMajor64, err := strconv.ParseInt(currentVersion.Major, 10, 32) + if err != nil { + return nil, err + } + ret.currentMajor = int(currentMajor64) + } + if len(currentVersion.Minor) > 0 { + // split the "normal" + and - for semver stuff + minorString := strings.Split(currentVersion.Minor, "+")[0] + minorString = strings.Split(minorString, "-")[0] + minorString = strings.Split(minorString, ".")[0] + currentMinor64, err := strconv.ParseInt(minorString, 10, 32) + if err != nil { + return nil, err + } + ret.currentMinor = int(currentMinor64) + } + + ret.isAlpha = strings.Contains(currentVersion.GitVersion, "alpha") + + if envString, ok := os.LookupEnv("KUBE_APISERVER_STRICT_REMOVED_API_HANDLING_IN_ALPHA"); !ok { + // do nothing + } else if envBool, err := strconv.ParseBool(envString); err != nil { + return nil, err + } else { + ret.strictRemovedHandlingInAlpha = envBool + } + if envString, ok := os.LookupEnv("KUBE_APISERVER_SERVE_REMOVED_APIS_FOR_ONE_RELEASE"); !ok { + // do nothing + } else if envBool, err := strconv.ParseBool(envString); err != nil { + return nil, err + } else { + ret.serveRemovedAPIsOneMoreRelease = envBool + } + + return ret, nil +} + +func (e *resourceExpirationEvaluator) shouldServe(gv schema.GroupVersion, versioner runtime.ObjectVersioner, resourceServingInfo rest.Storage) bool { + internalPtr := resourceServingInfo.New() + + target := gv + // honor storage that overrides group version (used for things like scale subresources) + if versionProvider, ok := resourceServingInfo.(rest.GroupVersionKindProvider); ok { + target = versionProvider.GroupVersionKind(target).GroupVersion() + } + + versionedPtr, err := versioner.ConvertToVersion(internalPtr, target) + if err != nil { + utilruntime.HandleError(err) + return false + } + + removed, ok := versionedPtr.(removedInterface) + if !ok { + return true + } + majorRemoved, minorRemoved := removed.APILifecycleRemoved() + return e.ShouldServeForVersion(majorRemoved, minorRemoved) +} + +func (e *resourceExpirationEvaluator) ShouldServeForVersion(majorRemoved, minorRemoved int) bool { + if e.currentMajor < majorRemoved { + return true + } + if e.currentMajor > majorRemoved { + return false + } + if e.currentMinor < minorRemoved { + return true + } + if e.currentMinor > minorRemoved { + return false + } + // at this point major and minor are equal, so this API should be removed when the current release GAs. + // If this is an alpha tag, don't remove by default, but allow the option. + // If the cluster-admin has requested serving one more release, allow it. + if e.isAlpha && e.strictRemovedHandlingInAlpha { // don't serve in alpha if we want strict handling + return false + } + if e.isAlpha { // alphas are allowed to continue serving expired betas while we clean up the test + return true + } + if e.serveRemovedAPIsOneMoreRelease { // cluster-admins are allowed to kick the can one release down the road + return true + } + return false +} + +type removedInterface interface { + APILifecycleRemoved() (major, minor int) +} + +// removeDeletedKinds inspects the storage map and modifies it in place by removing storage for kinds that have been deleted. +// versionedResourcesStorageMap mirrors the field on APIGroupInfo, it's a map from version to resource to the storage. +func (e *resourceExpirationEvaluator) RemoveDeletedKinds(groupName string, versioner runtime.ObjectVersioner, versionedResourcesStorageMap map[string]map[string]rest.Storage) { + versionsToRemove := sets.NewString() + for apiVersion := range sets.StringKeySet(versionedResourcesStorageMap) { + versionToResource := versionedResourcesStorageMap[apiVersion] + resourcesToRemove := sets.NewString() + for resourceName, resourceServingInfo := range versionToResource { + if !e.shouldServe(schema.GroupVersion{Group: groupName, Version: apiVersion}, versioner, resourceServingInfo) { + resourcesToRemove.Insert(resourceName) + } + } + + for resourceName := range versionedResourcesStorageMap[apiVersion] { + if !shouldRemoveResourceAndSubresources(resourcesToRemove, resourceName) { + continue + } + + klog.V(1).Infof("Removing resource %v.%v.%v because it is time to stop serving it per APILifecycle.", resourceName, apiVersion, groupName) + delete(versionToResource, resourceName) + } + versionedResourcesStorageMap[apiVersion] = versionToResource + + if len(versionedResourcesStorageMap[apiVersion]) == 0 { + versionsToRemove.Insert(apiVersion) + } + } + + for _, apiVersion := range versionsToRemove.List() { + klog.V(1).Infof("Removing version %v.%v because it is time to stop serving it because it has no resources per APILifecycle.", apiVersion, groupName) + delete(versionedResourcesStorageMap, apiVersion) + } +} + +func shouldRemoveResourceAndSubresources(resourcesToRemove sets.String, resourceName string) bool { + for _, resourceToRemove := range resourcesToRemove.List() { + if resourceName == resourceToRemove { + return true + } + // our API works on nesting, so you can have deployments, deployments/status, and deployments/scale. Not all subresources + // serve the parent type, but if the parent type (deployments in this case), has been removed, it's subresources should be removed too. + if strings.HasPrefix(resourceName, resourceToRemove+"/") { + return true + } + } + return false +} diff --git a/vendor/k8s.io/apiserver/pkg/server/dynamiccertificates/BUILD b/vendor/k8s.io/apiserver/pkg/server/dynamiccertificates/BUILD deleted file mode 100644 index 564e34598ca7..000000000000 --- a/vendor/k8s.io/apiserver/pkg/server/dynamiccertificates/BUILD +++ /dev/null @@ -1,69 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "cert_key.go", - "client_ca.go", - "configmap_cafile_content.go", - "dynamic_cafile_content.go", - "dynamic_serving_content.go", - "dynamic_sni_content.go", - "named_certificates.go", - "static_content.go", - "tlsconfig.go", - "union_content.go", - "util.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/server/dynamiccertificates", - importpath = "k8s.io/apiserver/pkg/server/dynamiccertificates", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/informers/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/tools/events:go_default_library", - "//staging/src/k8s.io/client-go/util/cert:go_default_library", - "//staging/src/k8s.io/client-go/util/workqueue:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = [ - "cert_key_test.go", - "client_ca_test.go", - "named_certificates_test.go", - "server_test.go", - "tlsconfig_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/client-go/util/cert:go_default_library", - "//vendor/github.com/davecgh/go-spew/spew:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) diff --git a/vendor/k8s.io/apiserver/pkg/server/egressselector/BUILD b/vendor/k8s.io/apiserver/pkg/server/egressselector/BUILD deleted file mode 100644 index e9f44cd55c6a..000000000000 --- a/vendor/k8s.io/apiserver/pkg/server/egressselector/BUILD +++ /dev/null @@ -1,63 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "config.go", - "egress_selector.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/server/egressselector", - importpath = "k8s.io/apiserver/pkg/server/egressselector", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/apiserver:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/apiserver/install:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/apiserver/v1beta1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/egressselector/metrics:go_default_library", - "//vendor/google.golang.org/grpc:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/path:go_default_library", - "//vendor/k8s.io/utils/trace:go_default_library", - "//vendor/sigs.k8s.io/apiserver-network-proxy/konnectivity-client/pkg/client:go_default_library", - "//vendor/sigs.k8s.io/yaml:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiserver/pkg/server/egressselector/metrics:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = [ - "config_test.go", - "egress_selector_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/apiserver:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/egressselector/metrics:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - "//staging/src/k8s.io/component-base/metrics/testutil:go_default_library", - ], -) diff --git a/vendor/k8s.io/apiserver/pkg/server/egressselector/egress_selector.go b/vendor/k8s.io/apiserver/pkg/server/egressselector/egress_selector.go index a849575b8efe..701540d64ada 100644 --- a/vendor/k8s.io/apiserver/pkg/server/egressselector/egress_selector.go +++ b/vendor/k8s.io/apiserver/pkg/server/egressselector/egress_selector.go @@ -47,7 +47,7 @@ type EgressSelector struct { } // EgressType is an indicator of which egress selection should be used for sending traffic. -// See https://github.com/kubernetes/enhancements/blob/master/keps/sig-api-machinery/20190226-network-proxy.md#network-context +// See https://github.com/kubernetes/enhancements/blob/master/keps/sig-api-machinery/1281-network-proxy/README.md#network-context type EgressType int const ( @@ -226,7 +226,7 @@ func (d *dialerCreator) createDialer() utilnet.DialFunc { return directDialer } return func(ctx context.Context, network, addr string) (net.Conn, error) { - trace := utiltrace.New(fmt.Sprintf("Proxy via HTTP Connect over %s", d.options.transport), utiltrace.Field{Key: "address", Value: addr}) + trace := utiltrace.New(fmt.Sprintf("Proxy via %s protocol over %s", d.options.protocol, d.options.transport), utiltrace.Field{Key: "address", Value: addr}) defer trace.LogIfLong(500 * time.Millisecond) start := egressmetrics.Metrics.Clock().Now() proxier, err := d.connector.connect() diff --git a/vendor/k8s.io/apiserver/pkg/server/egressselector/metrics/BUILD b/vendor/k8s.io/apiserver/pkg/server/egressselector/metrics/BUILD deleted file mode 100644 index 99f1a0343ea8..000000000000 --- a/vendor/k8s.io/apiserver/pkg/server/egressselector/metrics/BUILD +++ /dev/null @@ -1,28 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["metrics.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/server/egressselector/metrics", - importpath = "k8s.io/apiserver/pkg/server/egressselector/metrics", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiserver/pkg/server/filters/BUILD b/vendor/k8s.io/apiserver/pkg/server/filters/BUILD deleted file mode 100644 index 5d5cefaf63a7..000000000000 --- a/vendor/k8s.io/apiserver/pkg/server/filters/BUILD +++ /dev/null @@ -1,99 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "content_type_test.go", - "cors_test.go", - "goaway_test.go", - "maxinflight_test.go", - "priority-and-fairness_test.go", - "timeout_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/flowcontrol/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/flowcontrol/bootstrap:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/filters:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/metrics:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/mux:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/flowcontrol/metrics:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - "//staging/src/k8s.io/component-base/metrics/testutil:go_default_library", - "//vendor/golang.org/x/net/http2:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "content_type.go", - "cors.go", - "doc.go", - "goaway.go", - "longrunning.go", - "maxinflight.go", - "priority-and-fairness.go", - "timeout.go", - "waitgroup.go", - "wrap.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/server/filters", - importpath = "k8s.io/apiserver/pkg/server/filters", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/flowcontrol/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/waitgroup:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/metrics:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/httplog:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/flowcontrol/metrics:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/server/filters/cors.go b/vendor/k8s.io/apiserver/pkg/server/filters/cors.go index 67df760988df..29c46e4c7935 100644 --- a/vendor/k8s.io/apiserver/pkg/server/filters/cors.go +++ b/vendor/k8s.io/apiserver/pkg/server/filters/cors.go @@ -25,8 +25,8 @@ import ( ) // TODO: use restful.CrossOriginResourceSharing -// See github.com/emicklei/go-restful/blob/master/examples/restful-CORS-filter.go, and -// github.com/emicklei/go-restful/blob/master/examples/restful-basic-authentication.go +// See github.com/emicklei/go-restful/blob/master/examples/cors/restful-CORS-filter.go, and +// github.com/emicklei/go-restful/blob/master/examples/basicauth/restful-basic-authentication.go // Or, for a more detailed implementation use https://github.com/martini-contrib/cors // or implement CORS at your proxy layer. diff --git a/vendor/k8s.io/apiserver/pkg/server/filters/hsts.go b/vendor/k8s.io/apiserver/pkg/server/filters/hsts.go new file mode 100644 index 000000000000..46625381fa0a --- /dev/null +++ b/vendor/k8s.io/apiserver/pkg/server/filters/hsts.go @@ -0,0 +1,40 @@ +/* +Copyright 2020 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package filters + +import ( + "net/http" + "strings" +) + +// WithHSTS is a simple HSTS implementation that wraps an http Handler. +// If hstsDirectives is empty or nil, no HSTS support is installed. +func WithHSTS(handler http.Handler, hstsDirectives []string) http.Handler { + if len(hstsDirectives) == 0 { + return handler + } + allDirectives := strings.Join(hstsDirectives, "; ") + return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + // Chrome and Mozilla Firefox maintain an HSTS preload list + // issue : golang.org/issue/26162 + // Set the Strict-Transport-Security header if it is not already set + if _, ok := w.Header()["Strict-Transport-Security"]; !ok { + w.Header().Set("Strict-Transport-Security", allDirectives) + } + handler.ServeHTTP(w, req) + }) +} diff --git a/vendor/k8s.io/apiserver/pkg/server/filters/maxinflight.go b/vendor/k8s.io/apiserver/pkg/server/filters/maxinflight.go index e873351c70bf..2484bfc76c8f 100644 --- a/vendor/k8s.io/apiserver/pkg/server/filters/maxinflight.go +++ b/vendor/k8s.io/apiserver/pkg/server/filters/maxinflight.go @@ -196,9 +196,9 @@ func WithMaxInFlightLimit( } // We need to split this data between buckets used for throttling. if isMutatingRequest { - metrics.DroppedRequests.WithLabelValues(metrics.MutatingKind).Inc() + metrics.DroppedRequests.WithContext(ctx).WithLabelValues(metrics.MutatingKind).Inc() } else { - metrics.DroppedRequests.WithLabelValues(metrics.ReadOnlyKind).Inc() + metrics.DroppedRequests.WithContext(ctx).WithLabelValues(metrics.ReadOnlyKind).Inc() } metrics.RecordRequestTermination(r, requestInfo, metrics.APIServerComponent, http.StatusTooManyRequests) tooManyRequests(r, w) diff --git a/vendor/k8s.io/apiserver/pkg/server/filters/priority-and-fairness.go b/vendor/k8s.io/apiserver/pkg/server/filters/priority-and-fairness.go index e1d7b7793a11..186824e2f265 100644 --- a/vendor/k8s.io/apiserver/pkg/server/filters/priority-and-fairness.go +++ b/vendor/k8s.io/apiserver/pkg/server/filters/priority-and-fairness.go @@ -122,8 +122,8 @@ func WithPriorityAndFairness( served = true innerCtx := context.WithValue(ctx, priorityAndFairnessKey, classification) innerReq := r.Clone(innerCtx) - w.Header().Set(flowcontrol.ResponseHeaderMatchedPriorityLevelConfigurationUID, string(classification.PriorityLevelUID)) - w.Header().Set(flowcontrol.ResponseHeaderMatchedFlowSchemaUID, string(classification.FlowSchemaUID)) + setResponseHeaders(classification, w) + handler.ServeHTTP(w, innerReq) } digest := utilflowcontrol.RequestDigest{RequestInfo: requestInfo, User: user} @@ -135,10 +135,12 @@ func WithPriorityAndFairness( } }, execute) if !served { + setResponseHeaders(classification, w) + if isMutatingRequest { - epmetrics.DroppedRequests.WithLabelValues(epmetrics.MutatingKind).Inc() + epmetrics.DroppedRequests.WithContext(ctx).WithLabelValues(epmetrics.MutatingKind).Inc() } else { - epmetrics.DroppedRequests.WithLabelValues(epmetrics.ReadOnlyKind).Inc() + epmetrics.DroppedRequests.WithContext(ctx).WithLabelValues(epmetrics.ReadOnlyKind).Inc() } epmetrics.RecordRequestTermination(r, requestInfo, epmetrics.APIServerComponent, http.StatusTooManyRequests) tooManyRequests(r, w) @@ -153,3 +155,15 @@ func StartPriorityAndFairnessWatermarkMaintenance(stopCh <-chan struct{}) { startWatermarkMaintenance(watermark, stopCh) startWatermarkMaintenance(waitingMark, stopCh) } + +func setResponseHeaders(classification *PriorityAndFairnessClassification, w http.ResponseWriter) { + if classification == nil { + return + } + + // We intentionally set the UID of the flow-schema and priority-level instead of name. This is so that + // the names that cluster-admins choose for categorization and priority levels are not exposed, also + // the names might make it obvious to the users that they are rejected due to classification with low priority. + w.Header().Set(flowcontrol.ResponseHeaderMatchedPriorityLevelConfigurationUID, string(classification.PriorityLevelUID)) + w.Header().Set(flowcontrol.ResponseHeaderMatchedFlowSchemaUID, string(classification.FlowSchemaUID)) +} diff --git a/vendor/k8s.io/apiserver/pkg/server/filters/wrap.go b/vendor/k8s.io/apiserver/pkg/server/filters/wrap.go index 2e4c823aefd3..3202ce857ed7 100644 --- a/vendor/k8s.io/apiserver/pkg/server/filters/wrap.go +++ b/vendor/k8s.io/apiserver/pkg/server/filters/wrap.go @@ -28,7 +28,7 @@ import ( ) // WithPanicRecovery wraps an http Handler to recover and log panics (except in the special case of http.ErrAbortHandler panics, which suppress logging). -func WithPanicRecovery(handler http.Handler, resolver request.RequestInfoResolver, isTerminating func() bool) http.Handler { +func WithPanicRecovery(handler http.Handler, resolver request.RequestInfoResolver) http.Handler { return withPanicRecovery(handler, func(w http.ResponseWriter, req *http.Request, err interface{}) { if err == http.ErrAbortHandler { // Honor the http.ErrAbortHandler sentinel panic value @@ -51,16 +51,20 @@ func WithPanicRecovery(handler http.Handler, resolver request.RequestInfoResolve // This call can have different handlers, but the default chain rate limits. Call it after the metrics are updated // in case the rate limit delays it. If you outrun the rate for this one timed out requests, something has gone // seriously wrong with your server, but generally having a logging signal for timeouts is useful. - runtime.HandleError(fmt.Errorf("timeout or abort while handling: %v %q", req.Method, req.URL.Path)) + runtime.HandleError(fmt.Errorf("timeout or abort while handling: method=%v URI=%q audit-ID=%q", req.Method, req.RequestURI, request.GetAuditIDTruncated(req))) return } http.Error(w, "This request caused apiserver to panic. Look in the logs for details.", http.StatusInternalServerError) - klog.Errorf("apiserver panic'd on %v %v", req.Method, req.RequestURI) - }, isTerminating) + klog.ErrorS(nil, "apiserver panic'd", "method", req.Method, "URI", req.RequestURI, "audit-ID", request.GetAuditIDTruncated(req)) + }) +} + +// WithHTTPLogging enables logging of incoming requests. +func WithHTTPLogging(handler http.Handler, isTerminating func() bool) http.Handler { + return httplog.WithLogging(handler, httplog.DefaultStacktracePred, isTerminating) } -func withPanicRecovery(handler http.Handler, crashHandler func(http.ResponseWriter, *http.Request, interface{}), isTerminating func() bool) http.Handler { - handler = httplog.WithLogging(handler, httplog.DefaultStacktracePred, isTerminating) +func withPanicRecovery(handler http.Handler, crashHandler func(http.ResponseWriter, *http.Request, interface{})) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { defer runtime.HandleCrash(func(err interface{}) { crashHandler(w, req, err) diff --git a/vendor/k8s.io/apiserver/pkg/server/genericapiserver.go b/vendor/k8s.io/apiserver/pkg/server/genericapiserver.go index fbcad50bda6d..177127b10c46 100644 --- a/vendor/k8s.io/apiserver/pkg/server/genericapiserver.go +++ b/vendor/k8s.io/apiserver/pkg/server/genericapiserver.go @@ -135,8 +135,14 @@ type GenericAPIServer struct { // Enable swagger and/or OpenAPI if these configs are non-nil. openAPIConfig *openapicommon.Config + // SkipOpenAPIInstallation indicates not to install the OpenAPI handler + // during PrepareRun. + // Set this to true when the specific API Server has its own OpenAPI handler + // (e.g. kube-aggregator) + skipOpenAPIInstallation bool + // OpenAPIVersionedService controls the /openapi/v2 endpoint, and can be used to update the served spec. - // It is set during PrepareRun. + // It is set during PrepareRun if `openAPIConfig` is non-nil unless `skipOpenAPIInstallation` is true. OpenAPIVersionedService *handler.OpenAPIService // StaticOpenAPISpec is the spec derived from the restful container endpoints. @@ -297,7 +303,7 @@ type preparedGenericAPIServer struct { func (s *GenericAPIServer) PrepareRun() preparedGenericAPIServer { s.delegationTarget.PrepareRun() - if s.openAPIConfig != nil { + if s.openAPIConfig != nil && !s.skipOpenAPIInstallation { s.OpenAPIVersionedService, s.StaticOpenAPISpec = routes.OpenAPI{ Config: s.openAPIConfig, }.Install(s.Handler.GoRestfulContainer, s.Handler.NonGoRestfulMux) @@ -585,14 +591,15 @@ func (s *GenericAPIServer) newAPIGroupVersion(apiGroupInfo *APIGroupInfo, groupV GroupVersion: groupVersion, MetaGroupVersion: apiGroupInfo.MetaGroupVersion, - ParameterCodec: apiGroupInfo.ParameterCodec, - Serializer: apiGroupInfo.NegotiatedSerializer, - Creater: apiGroupInfo.Scheme, - Convertor: apiGroupInfo.Scheme, - UnsafeConvertor: runtime.UnsafeObjectConvertor(apiGroupInfo.Scheme), - Defaulter: apiGroupInfo.Scheme, - Typer: apiGroupInfo.Scheme, - Linker: runtime.SelfLinker(meta.NewAccessor()), + ParameterCodec: apiGroupInfo.ParameterCodec, + Serializer: apiGroupInfo.NegotiatedSerializer, + Creater: apiGroupInfo.Scheme, + Convertor: apiGroupInfo.Scheme, + ConvertabilityChecker: apiGroupInfo.Scheme, + UnsafeConvertor: runtime.UnsafeObjectConvertor(apiGroupInfo.Scheme), + Defaulter: apiGroupInfo.Scheme, + Typer: apiGroupInfo.Scheme, + Linker: runtime.SelfLinker(meta.NewAccessor()), EquivalentResourceRegistry: s.EquivalentResourceRegistry, diff --git a/vendor/k8s.io/apiserver/pkg/server/healthz.go b/vendor/k8s.io/apiserver/pkg/server/healthz.go index ff8dd2022962..8d04e1b713d3 100644 --- a/vendor/k8s.io/apiserver/pkg/server/healthz.go +++ b/vendor/k8s.io/apiserver/pkg/server/healthz.go @@ -53,11 +53,14 @@ func (s *GenericAPIServer) addHealthChecks(livezGracePeriod time.Duration, check return fmt.Errorf("unable to add because the healthz endpoint has already been created") } s.healthzChecks = append(s.healthzChecks, checks...) - return s.addLivezChecks(livezGracePeriod, checks...) + if err := s.AddLivezChecks(livezGracePeriod, checks...); err != nil { + return err + } + return s.AddReadyzChecks(checks...) } -// addReadyzChecks allows you to add a HealthCheck to readyz. -func (s *GenericAPIServer) addReadyzChecks(checks ...healthz.HealthChecker) error { +// AddReadyzChecks allows you to add a HealthCheck to readyz. +func (s *GenericAPIServer) AddReadyzChecks(checks ...healthz.HealthChecker) error { s.readyzLock.Lock() defer s.readyzLock.Unlock() if s.readyzChecksInstalled { @@ -67,9 +70,8 @@ func (s *GenericAPIServer) addReadyzChecks(checks ...healthz.HealthChecker) erro return nil } -// addLivezChecks allows you to add a HealthCheck to livez. It will also automatically add a check to readyz, -// since we want to avoid being ready when we are not live. -func (s *GenericAPIServer) addLivezChecks(delay time.Duration, checks ...healthz.HealthChecker) error { +// AddLivezChecks allows you to add a HealthCheck to livez. +func (s *GenericAPIServer) AddLivezChecks(delay time.Duration, checks ...healthz.HealthChecker) error { s.livezLock.Lock() defer s.livezLock.Unlock() if s.livezChecksInstalled { @@ -78,14 +80,14 @@ func (s *GenericAPIServer) addLivezChecks(delay time.Duration, checks ...healthz for _, check := range checks { s.livezChecks = append(s.livezChecks, delayedHealthCheck(check, s.livezClock, delay)) } - return s.addReadyzChecks(checks...) + return nil } // addReadyzShutdownCheck is a convenience function for adding a readyz shutdown check, so // that we can register that the api-server is no longer ready while we attempt to gracefully // shutdown. func (s *GenericAPIServer) addReadyzShutdownCheck(stopCh <-chan struct{}) error { - return s.addReadyzChecks(shutdownCheck{stopCh}) + return s.AddReadyzChecks(shutdownCheck{stopCh}) } // installHealthz creates the healthz endpoint for this server diff --git a/vendor/k8s.io/apiserver/pkg/server/healthz/BUILD b/vendor/k8s.io/apiserver/pkg/server/healthz/BUILD deleted file mode 100644 index 2b2c2cfb92e4..000000000000 --- a/vendor/k8s.io/apiserver/pkg/server/healthz/BUILD +++ /dev/null @@ -1,50 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["healthz_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/metrics:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - "//staging/src/k8s.io/component-base/metrics/testutil:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "healthz.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/server/healthz", - importpath = "k8s.io/apiserver/pkg/server/healthz", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/metrics:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/httplog:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/server/httplog/BUILD b/vendor/k8s.io/apiserver/pkg/server/httplog/BUILD deleted file mode 100644 index 12fe81f2b852..000000000000 --- a/vendor/k8s.io/apiserver/pkg/server/httplog/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["httplog_test.go"], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "httplog.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/server/httplog", - importpath = "k8s.io/apiserver/pkg/server/httplog", - deps = ["//vendor/k8s.io/klog/v2:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/server/httplog/httplog.go b/vendor/k8s.io/apiserver/pkg/server/httplog/httplog.go index 0ab4dcb78f61..9acea2a032f3 100644 --- a/vendor/k8s.io/apiserver/pkg/server/httplog/httplog.go +++ b/vendor/k8s.io/apiserver/pkg/server/httplog/httplog.go @@ -25,6 +25,7 @@ import ( "runtime" "time" + "k8s.io/apiserver/pkg/endpoints/request" "k8s.io/klog/v2" ) @@ -87,7 +88,13 @@ func WithLogging(handler http.Handler, pred StacktracePred, isTerminatingFn func if isTerminatingFn != nil { isTerminating = isTerminatingFn() } - rl := newLogged(req, w).StacktraceWhen(pred).IsTerminating(isTerminating) + + startTime := time.Now() + if receivedTimestamp, ok := request.ReceivedTimestampFrom(ctx); ok { + startTime = receivedTimestamp + } + + rl := newLoggedWithStartTime(req, w, startTime).StacktraceWhen(pred).IsTerminating(isTerminating) req = req.WithContext(context.WithValue(ctx, respLoggerContextKey, rl)) if klog.V(3).Enabled() || (rl.isTerminating && klog.V(1).Enabled()) { @@ -107,16 +114,20 @@ func respLoggerFromContext(req *http.Request) *respLogger { return nil } -// newLogged turns a normal response writer into a logged response writer. -func newLogged(req *http.Request, w http.ResponseWriter) *respLogger { +func newLoggedWithStartTime(req *http.Request, w http.ResponseWriter, startTime time.Time) *respLogger { return &respLogger{ - startTime: time.Now(), + startTime: startTime, req: req, w: w, logStacktracePred: DefaultStacktracePred, } } +// newLogged turns a normal response writer into a logged response writer. +func newLogged(req *http.Request, w http.ResponseWriter) *respLogger { + return newLoggedWithStartTime(req, w, time.Now()) +} + // LogOf returns the logger hiding in w. If there is not an existing logger // then a passthroughLogger will be created which will log to stdout immediately // when Addf is called. @@ -177,12 +188,14 @@ func (rl *respLogger) Addf(format string, data ...interface{}) { func (rl *respLogger) LogArgs() []interface{} { latency := time.Since(rl.startTime) + auditID := request.GetAuditIDTruncated(rl.req) if rl.hijacked { return []interface{}{ "verb", rl.req.Method, "URI", rl.req.RequestURI, "latency", latency, "userAgent", rl.req.UserAgent(), + "audit-ID", auditID, "srcIP", rl.req.RemoteAddr, "hijacked", true, } @@ -192,6 +205,7 @@ func (rl *respLogger) LogArgs() []interface{} { "URI", rl.req.RequestURI, "latency", latency, "userAgent", rl.req.UserAgent(), + "audit-ID", auditID, "srcIP", rl.req.RemoteAddr, "resp", rl.status, } diff --git a/vendor/k8s.io/apiserver/pkg/server/mux/BUILD b/vendor/k8s.io/apiserver/pkg/server/mux/BUILD deleted file mode 100644 index 55dc1bf5070e..000000000000 --- a/vendor/k8s.io/apiserver/pkg/server/mux/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["pathrecorder_test.go"], - embed = [":go_default_library"], - deps = ["//vendor/github.com/stretchr/testify/assert:go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "pathrecorder.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/server/mux", - importpath = "k8s.io/apiserver/pkg/server/mux", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/server/options/BUILD b/vendor/k8s.io/apiserver/pkg/server/options/BUILD deleted file mode 100644 index bd4fcd1ff721..000000000000 --- a/vendor/k8s.io/apiserver/pkg/server/options/BUILD +++ /dev/null @@ -1,193 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "admission.go", - "api_enablement.go", - "audit.go", - "authentication.go", - "authentication_dynamic_request_header.go", - "authorization.go", - "coreapi.go", - "deprecated_insecure_serving.go", - "doc.go", - "egress_selector.go", - "etcd.go", - "feature.go", - "recommended.go", - "server_run_options.go", - "serving.go", - "serving_unix.go", - "serving_windows.go", - "serving_with_loopback.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/server/options", - importpath = "k8s.io/apiserver/pkg/server/options", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/initializer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/metrics:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/namespace/lifecycle:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/mutating:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/validating:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/apiserver:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/apiserver/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/apiserver/v1alpha1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit/v1alpha1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit/v1beta1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/audit:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/audit/policy:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/authenticatorfactory:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/request/headerrequest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizerfactory:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/path:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/union:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/features:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/dynamiccertificates:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/egressselector:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/healthz:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/options/encryptionconfig:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/resourceconfig:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/storage:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/storagebackend:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/storagebackend/factory:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/webhook:go_default_library", - "//staging/src/k8s.io/apiserver/plugin/pkg/audit/buffered:go_default_library", - "//staging/src/k8s.io/apiserver/plugin/pkg/audit/log:go_default_library", - "//staging/src/k8s.io/apiserver/plugin/pkg/audit/truncate:go_default_library", - "//staging/src/k8s.io/apiserver/plugin/pkg/audit/webhook:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/tools/clientcmd:go_default_library", - "//staging/src/k8s.io/client-go/util/cert:go_default_library", - "//staging/src/k8s.io/client-go/util/keyutil:go_default_library", - "//staging/src/k8s.io/component-base/cli/flag:go_default_library", - "//staging/src/k8s.io/component-base/featuregate:go_default_library", - "//vendor/github.com/google/uuid:go_default_library", - "//vendor/github.com/spf13/pflag:go_default_library", - "//vendor/gopkg.in/natefinch/lumberjack.v2:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/common:go_default_library", - "//vendor/k8s.io/utils/path:go_default_library", - ] + select({ - "@io_bazel_rules_go//go/platform:aix": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:android": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:illumos": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:ios": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:js": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "//conditions:default": [], - }), -) - -go_test( - name = "go_default_test", - srcs = [ - "admission_test.go", - "api_enablement_test.go", - "audit_test.go", - "authentication_test.go", - "etcd_test.go", - "server_run_options_test.go", - "serving_test.go", - "serving_unix_test.go", - ], - data = glob(["testdata/**"]), - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/version:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/authenticatorfactory:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/request/headerrequest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/storagebackend:go_default_library", - "//staging/src/k8s.io/client-go/discovery:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/tools/clientcmd/api/v1:go_default_library", - "//staging/src/k8s.io/component-base/cli/flag:go_default_library", - "//vendor/github.com/spf13/pflag:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/common:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiserver/pkg/server/options/encryptionconfig:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiserver/pkg/server/options/OWNERS b/vendor/k8s.io/apiserver/pkg/server/options/OWNERS index 0e84109d7d44..702015ad1028 100644 --- a/vendor/k8s.io/apiserver/pkg/server/options/OWNERS +++ b/vendor/k8s.io/apiserver/pkg/server/options/OWNERS @@ -5,7 +5,6 @@ reviewers: - wojtek-t - deads2k - liggitt -- nikhiljindal - sttts - jlowdermilk - soltysh diff --git a/vendor/k8s.io/apiserver/pkg/server/options/audit.go b/vendor/k8s.io/apiserver/pkg/server/options/audit.go index c3a709dcf10e..ba79eb466425 100644 --- a/vendor/k8s.io/apiserver/pkg/server/options/audit.go +++ b/vendor/k8s.io/apiserver/pkg/server/options/audit.go @@ -247,6 +247,9 @@ func validateGroupVersionString(groupVersion string) error { if !knownGroupVersion(gv) { return fmt.Errorf("invalid group version, allowed versions are %q", knownGroupVersions) } + if gv != auditv1.SchemeGroupVersion { + klog.Warningf("%q is deprecated and will be removed in a future release, use %q instead", gv, auditv1.SchemeGroupVersion) + } return nil } @@ -308,7 +311,8 @@ func (o *AuditOptions) ApplyTo( klog.V(2).Info("No audit policy file provided, no events will be recorded for webhook backend") } else { if c.EgressSelector != nil { - egressDialer, err := c.EgressSelector.Lookup(egressselector.ControlPlane.AsNetworkContext()) + var egressDialer utilnet.DialFunc + egressDialer, err = c.EgressSelector.Lookup(egressselector.ControlPlane.AsNetworkContext()) if err != nil { return err } diff --git a/vendor/k8s.io/apiserver/pkg/server/options/authentication.go b/vendor/k8s.io/apiserver/pkg/server/options/authentication.go index e266fb73ef6d..c76e79c7844b 100644 --- a/vendor/k8s.io/apiserver/pkg/server/options/authentication.go +++ b/vendor/k8s.io/apiserver/pkg/server/options/authentication.go @@ -21,8 +21,6 @@ import ( "strings" "time" - "k8s.io/apiserver/pkg/server/dynamiccertificates" - "github.com/spf13/pflag" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -30,9 +28,11 @@ import ( "k8s.io/apiserver/pkg/authentication/authenticatorfactory" "k8s.io/apiserver/pkg/authentication/request/headerrequest" "k8s.io/apiserver/pkg/server" + "k8s.io/apiserver/pkg/server/dynamiccertificates" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" + "k8s.io/client-go/transport" "k8s.io/klog/v2" openapicommon "k8s.io/kube-openapi/pkg/common" ) @@ -195,9 +195,12 @@ type DelegatingAuthenticationOptions struct { // before we fail the webhook call in order to limit the fan out that ensues when the system is degraded. WebhookRetryBackoff *wait.Backoff - // ClientTimeout specifies a time limit for requests made by the authorization webhook client. + // TokenRequestTimeout specifies a time limit for requests made by the authorization webhook client. // The default value is set to 10 seconds. - ClientTimeout time.Duration + TokenRequestTimeout time.Duration + + // CustomRoundTripperFn allows for specifying a middleware function for custom HTTP behaviour for the authentication webhook client. + CustomRoundTripperFn transport.WrapperFunc } func NewDelegatingAuthenticationOptions() *DelegatingAuthenticationOptions { @@ -211,7 +214,7 @@ func NewDelegatingAuthenticationOptions() *DelegatingAuthenticationOptions { ExtraHeaderPrefixes: []string{"x-remote-extra-"}, }, WebhookRetryBackoff: DefaultAuthWebhookRetryBackoff(), - ClientTimeout: 10 * time.Second, + TokenRequestTimeout: 10 * time.Second, } } @@ -220,12 +223,21 @@ func (s *DelegatingAuthenticationOptions) WithCustomRetryBackoff(backoff wait.Ba s.WebhookRetryBackoff = &backoff } -// WithClientTimeout sets the given timeout for the authentication webhook client. -func (s *DelegatingAuthenticationOptions) WithClientTimeout(timeout time.Duration) { - s.ClientTimeout = timeout +// WithRequestTimeout sets the given timeout for requests made by the authentication webhook client. +func (s *DelegatingAuthenticationOptions) WithRequestTimeout(timeout time.Duration) { + s.TokenRequestTimeout = timeout +} + +// WithCustomRoundTripper allows for specifying a middleware function for custom HTTP behaviour for the authentication webhook client. +func (s *DelegatingAuthenticationOptions) WithCustomRoundTripper(rt transport.WrapperFunc) { + s.CustomRoundTripperFn = rt } func (s *DelegatingAuthenticationOptions) Validate() []error { + if s == nil { + return nil + } + allErrors := []error{} allErrors = append(allErrors, s.RequestHeader.Validate()...) @@ -270,9 +282,10 @@ func (s *DelegatingAuthenticationOptions) ApplyTo(authenticationInfo *server.Aut } cfg := authenticatorfactory.DelegatingAuthenticatorConfig{ - Anonymous: true, - CacheTTL: s.CacheTTL, - WebhookRetryBackoff: s.WebhookRetryBackoff, + Anonymous: true, + CacheTTL: s.CacheTTL, + WebhookRetryBackoff: s.WebhookRetryBackoff, + TokenAccessReviewTimeout: s.TokenRequestTimeout, } client, err := s.getClient() @@ -286,16 +299,16 @@ func (s *DelegatingAuthenticationOptions) ApplyTo(authenticationInfo *server.Aut } // get the clientCA information - clientCAFileSpecified := len(s.ClientCert.ClientCA) > 0 + clientCASpecified := s.ClientCert != ClientCertAuthenticationOptions{} var clientCAProvider dynamiccertificates.CAContentProvider - if clientCAFileSpecified { + if clientCASpecified { clientCAProvider, err = s.ClientCert.GetClientCAContentProvider() if err != nil { - return fmt.Errorf("unable to load client CA file %q: %v", s.ClientCert.ClientCA, err) + return fmt.Errorf("unable to load client CA provider: %v", err) } cfg.ClientCertificateCAContentProvider = clientCAProvider if err = authenticationInfo.ApplyClientCert(cfg.ClientCertificateCAContentProvider, servingInfo); err != nil { - return fmt.Errorf("unable to assign client CA file: %v", err) + return fmt.Errorf("unable to assign client CA provider: %v", err) } } else if !s.SkipInClusterLookup { @@ -330,8 +343,8 @@ func (s *DelegatingAuthenticationOptions) ApplyTo(authenticationInfo *server.Aut if err != nil { if s.TolerateInClusterLookupFailure { klog.Warningf("Error looking up in-cluster authentication configuration: %v", err) - klog.Warningf("Continuing without authentication configuration. This may treat all requests as anonymous.") - klog.Warningf("To require authentication configuration lookup to succeed, set --authentication-tolerate-lookup-failure=false") + klog.Warning("Continuing without authentication configuration. This may treat all requests as anonymous.") + klog.Warning("To require authentication configuration lookup to succeed, set --authentication-tolerate-lookup-failure=false") } else { return fmt.Errorf("unable to load configmap based request-header-client-ca-file: %v", err) } @@ -415,7 +428,13 @@ func (s *DelegatingAuthenticationOptions) getClient() (kubernetes.Interface, err // set high qps/burst limits since this will effectively limit API server responsiveness clientConfig.QPS = 200 clientConfig.Burst = 400 - clientConfig.Timeout = s.ClientTimeout + // do not set a timeout on the http client, instead use context for cancellation + // if multiple timeouts were set, the request will pick the smaller timeout to be applied, leaving other useless. + // + // see https://github.com/golang/go/blob/a937729c2c2f6950a32bc5cd0f5b88700882f078/src/net/http/client.go#L364 + if s.CustomRoundTripperFn != nil { + clientConfig.Wrap(s.CustomRoundTripperFn) + } return kubernetes.NewForConfig(clientConfig) } diff --git a/vendor/k8s.io/apiserver/pkg/server/options/authorization.go b/vendor/k8s.io/apiserver/pkg/server/options/authorization.go index 1c7c87d601f5..d74033a41940 100644 --- a/vendor/k8s.io/apiserver/pkg/server/options/authorization.go +++ b/vendor/k8s.io/apiserver/pkg/server/options/authorization.go @@ -21,8 +21,8 @@ import ( "time" "github.com/spf13/pflag" - "k8s.io/klog/v2" + "github.com/openshift/library-go/pkg/authorization/hardcodedauthorizer" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/apiserver/pkg/authorization/authorizer" "k8s.io/apiserver/pkg/authorization/authorizerfactory" @@ -32,6 +32,8 @@ import ( "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" + "k8s.io/client-go/transport" + "k8s.io/klog/v2" ) // DelegatingAuthorizationOptions provides an easy way for composing API servers to delegate their authorization to @@ -69,6 +71,9 @@ type DelegatingAuthorizationOptions struct { // This allows us to configure the sleep time at each iteration and the maximum number of retries allowed // before we fail the webhook call in order to limit the fan out that ensues when the system is degraded. WebhookRetryBackoff *wait.Backoff + + // CustomRoundTripperFn allows for specifying a middleware function for custom HTTP behaviour for the authorization webhook client. + CustomRoundTripperFn transport.WrapperFunc } func NewDelegatingAuthorizationOptions() *DelegatingAuthorizationOptions { @@ -78,6 +83,14 @@ func NewDelegatingAuthorizationOptions() *DelegatingAuthorizationOptions { DenyCacheTTL: 10 * time.Second, ClientTimeout: 10 * time.Second, WebhookRetryBackoff: DefaultAuthWebhookRetryBackoff(), + // This allows the kubelet to always get health and readiness without causing an authorization check. + // This field can be cleared by callers if they don't want this behavior. + AlwaysAllowPaths: []string{"/healthz", "/readyz", "/livez"}, + // In an authorization call delegated to a kube-apiserver (the expected common-case), system:masters has full + // authority in a hard-coded authorizer. This means that our default can reasonably be to skip an authorization + // check for system:masters. + // This field can be cleared by callers if they don't want this behavior. + AlwaysAllowGroups: []string{"system:masters"}, } } @@ -103,9 +116,17 @@ func (s *DelegatingAuthorizationOptions) WithCustomRetryBackoff(backoff wait.Bac s.WebhookRetryBackoff = &backoff } +// WithCustomRoundTripper allows for specifying a middleware function for custom HTTP behaviour for the authorization webhook client. +func (s *DelegatingAuthorizationOptions) WithCustomRoundTripper(rt transport.WrapperFunc) { + s.CustomRoundTripperFn = rt +} + func (s *DelegatingAuthorizationOptions) Validate() []error { - allErrors := []error{} + if s == nil { + return nil + } + allErrors := []error{} if s.WebhookRetryBackoff != nil && s.WebhookRetryBackoff.Steps <= 0 { allErrors = append(allErrors, fmt.Errorf("number of webhook retry attempts must be greater than 1, but is: %d", s.WebhookRetryBackoff.Steps)) } @@ -161,6 +182,9 @@ func (s *DelegatingAuthorizationOptions) toAuthorizer(client kubernetes.Interfac authorizers = append(authorizers, authorizerfactory.NewPrivilegedGroups(s.AlwaysAllowGroups...)) } + // add an authorizer to always approver the openshift metrics scraper. + authorizers = append(authorizers, hardcodedauthorizer.NewHardCodedMetricsAuthorizer()) + if len(s.AlwaysAllowPaths) > 0 { a, err := path.NewAuthorizer(s.AlwaysAllowPaths) if err != nil { @@ -170,7 +194,7 @@ func (s *DelegatingAuthorizationOptions) toAuthorizer(client kubernetes.Interfac } if client == nil { - klog.Warningf("No authorization-kubeconfig provided, so SubjectAccessReview of authorization tokens won't work.") + klog.Warning("No authorization-kubeconfig provided, so SubjectAccessReview of authorization tokens won't work.") } else { cfg := authorizerfactory.DelegatingAuthorizerConfig{ SubjectAccessReviewClient: client.AuthorizationV1().SubjectAccessReviews(), @@ -215,6 +239,9 @@ func (s *DelegatingAuthorizationOptions) getClient() (kubernetes.Interface, erro clientConfig.QPS = 200 clientConfig.Burst = 400 clientConfig.Timeout = s.ClientTimeout + if s.CustomRoundTripperFn != nil { + clientConfig.Wrap(s.CustomRoundTripperFn) + } // make the client use protobuf protoConfig := rest.CopyConfig(clientConfig) diff --git a/vendor/k8s.io/apiserver/pkg/server/options/deprecated_insecure_serving.go b/vendor/k8s.io/apiserver/pkg/server/options/deprecated_insecure_serving.go index 1c066313c2cd..2b3afb0f1610 100644 --- a/vendor/k8s.io/apiserver/pkg/server/options/deprecated_insecure_serving.go +++ b/vendor/k8s.io/apiserver/pkg/server/options/deprecated_insecure_serving.go @@ -68,7 +68,7 @@ func (s *DeprecatedInsecureServingOptions) AddFlags(fs *pflag.FlagSet) { } fs.IPVar(&s.BindAddress, "insecure-bind-address", s.BindAddress, ""+ - "The IP address on which to serve the --insecure-port (set to 0.0.0.0 for all IPv4 interfaces and :: for all IPv6 interfaces).") + "The IP address on which to serve the --insecure-port (set to 0.0.0.0 or :: for listening in all interfaces and IP families).") // Though this flag is deprecated, we discovered security concerns over how to do health checks without it e.g. #43784 fs.MarkDeprecated("insecure-bind-address", "This flag will be removed in a future version.") fs.Lookup("insecure-bind-address").Hidden = false @@ -87,7 +87,7 @@ func (s *DeprecatedInsecureServingOptions) AddUnqualifiedFlags(fs *pflag.FlagSet } fs.IPVar(&s.BindAddress, "address", s.BindAddress, - "The IP address on which to serve the insecure --port (set to 0.0.0.0 for all IPv4 interfaces and :: for all IPv6 interfaces).") + "The IP address on which to serve the insecure --port (set to '0.0.0.0' or '::' for listening in all interfaces and IP families).") fs.MarkDeprecated("address", "see --bind-address instead.") fs.Lookup("address").Hidden = false diff --git a/vendor/k8s.io/apiserver/pkg/server/options/egress_selector.go b/vendor/k8s.io/apiserver/pkg/server/options/egress_selector.go index 07999cab1162..c7c94e5770c1 100644 --- a/vendor/k8s.io/apiserver/pkg/server/options/egress_selector.go +++ b/vendor/k8s.io/apiserver/pkg/server/options/egress_selector.go @@ -27,7 +27,7 @@ import ( ) // EgressSelectorOptions holds the api server egress selector options. -// See https://github.com/kubernetes/enhancements/blob/master/keps/sig-api-machinery/20190226-network-proxy.md +// See https://github.com/kubernetes/enhancements/blob/master/keps/sig-api-machinery/1281-network-proxy/README.md type EgressSelectorOptions struct { // ConfigFile is the file path with api-server egress selector configuration. ConfigFile string diff --git a/vendor/k8s.io/apiserver/pkg/server/options/encryptionconfig/BUILD b/vendor/k8s.io/apiserver/pkg/server/options/encryptionconfig/BUILD deleted file mode 100644 index d5dbda29fa00..000000000000 --- a/vendor/k8s.io/apiserver/pkg/server/options/encryptionconfig/BUILD +++ /dev/null @@ -1,56 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["config.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/server/options/encryptionconfig", - importpath = "k8s.io/apiserver/pkg/server/options/encryptionconfig", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/config:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/config/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/config/validation:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/healthz:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/value:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/aes:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/envelope:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/identity:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/secretbox:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["config_test.go"], - data = glob(["testdata/**"]), - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/config:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/value:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/envelope:go_default_library", - "//vendor/github.com/google/go-cmp/cmp:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/server/options/encryptionconfig/config.go b/vendor/k8s.io/apiserver/pkg/server/options/encryptionconfig/config.go index 372ab5eb8a66..09659676ac5d 100644 --- a/vendor/k8s.io/apiserver/pkg/server/options/encryptionconfig/config.go +++ b/vendor/k8s.io/apiserver/pkg/server/options/encryptionconfig/config.go @@ -241,7 +241,8 @@ func prefixTransformers(config *apiserverconfig.ResourceConfiguration) ([]value. case provider.Secretbox != nil: transformer, err = secretboxPrefixTransformer(provider.Secretbox) case provider.KMS != nil: - envelopeService, err := envelopeServiceFactory(provider.KMS.Endpoint, provider.KMS.Timeout.Duration) + var envelopeService envelope.Service + envelopeService, err = envelopeServiceFactory(provider.KMS.Endpoint, provider.KMS.Timeout.Duration) if err != nil { return nil, fmt.Errorf("could not configure KMS plugin %q, error: %v", provider.KMS.Name, err) } diff --git a/vendor/k8s.io/apiserver/pkg/server/options/etcd.go b/vendor/k8s.io/apiserver/pkg/server/options/etcd.go index d9c6f9e54bb4..d8b45b8198f8 100644 --- a/vendor/k8s.io/apiserver/pkg/server/options/etcd.go +++ b/vendor/k8s.io/apiserver/pkg/server/options/etcd.go @@ -35,6 +35,7 @@ import ( serverstorage "k8s.io/apiserver/pkg/server/storage" "k8s.io/apiserver/pkg/storage/storagebackend" storagefactory "k8s.io/apiserver/pkg/storage/storagebackend/factory" + "k8s.io/apiserver/pkg/storage/value" "k8s.io/klog/v2" ) @@ -117,7 +118,8 @@ func (s *EtcdOptions) AddFlags(fs *pflag.FlagSet) { fs.StringSliceVar(&s.EtcdServersOverrides, "etcd-servers-overrides", s.EtcdServersOverrides, ""+ "Per-resource etcd servers overrides, comma separated. The individual override "+ - "format: group/resource#servers, where servers are URLs, semicolon separated.") + "format: group/resource#servers, where servers are URLs, semicolon separated. "+ + "Note that this applies only to resources compiled into this server binary. ") fs.StringVar(&s.DefaultStorageMediaType, "storage-media-type", s.DefaultStorageMediaType, ""+ "The media type to use to store objects in storage. "+ @@ -183,6 +185,9 @@ func (s *EtcdOptions) AddFlags(fs *pflag.FlagSet) { fs.DurationVar(&s.StorageConfig.HealthcheckTimeout, "etcd-healthcheck-timeout", s.StorageConfig.HealthcheckTimeout, "The timeout to use when checking etcd health.") + + fs.Int64Var(&s.StorageConfig.LeaseManagerConfig.ReuseDurationSeconds, "lease-reuse-duration-seconds", s.StorageConfig.LeaseManagerConfig.ReuseDurationSeconds, + "The time in seconds that each lease is reused. A lower value could avoid large number of objects reusing the same lease. Notice that a too small value may cause performance problems at storage layer.") } func (s *EtcdOptions) ApplyTo(c *server.Config) error { @@ -192,7 +197,19 @@ func (s *EtcdOptions) ApplyTo(c *server.Config) error { if err := s.addEtcdHealthEndpoint(c); err != nil { return err } - c.RESTOptionsGetter = &SimpleRestOptionsFactory{Options: *s} + transformerOverrides := make(map[schema.GroupResource]value.Transformer) + if len(s.EncryptionProviderConfigFilepath) > 0 { + var err error + transformerOverrides, err = encryptionconfig.GetTransformerOverrides(s.EncryptionProviderConfigFilepath) + if err != nil { + return err + } + } + + c.RESTOptionsGetter = &SimpleRestOptionsFactory{ + Options: *s, + TransformerOverrides: transformerOverrides, + } return nil } @@ -225,7 +242,8 @@ func (s *EtcdOptions) addEtcdHealthEndpoint(c *server.Config) error { } type SimpleRestOptionsFactory struct { - Options EtcdOptions + Options EtcdOptions + TransformerOverrides map[schema.GroupResource]value.Transformer } func (f *SimpleRestOptionsFactory) GetRESTOptions(resource schema.GroupResource) (generic.RESTOptions, error) { @@ -237,6 +255,11 @@ func (f *SimpleRestOptionsFactory) GetRESTOptions(resource schema.GroupResource) ResourcePrefix: resource.Group + "/" + resource.Resource, CountMetricPollPeriod: f.Options.StorageConfig.CountMetricPollPeriod, } + if f.TransformerOverrides != nil { + if transformer, ok := f.TransformerOverrides[resource]; ok { + ret.StorageConfig.Transformer = transformer + } + } if f.Options.EnableWatchCache { sizes, err := ParseWatchCacheSizes(f.Options.WatchCacheSizes) if err != nil { diff --git a/vendor/k8s.io/apiserver/pkg/server/options/recommended.go b/vendor/k8s.io/apiserver/pkg/server/options/recommended.go index 18824083e25a..859dc88cb55f 100644 --- a/vendor/k8s.io/apiserver/pkg/server/options/recommended.go +++ b/vendor/k8s.io/apiserver/pkg/server/options/recommended.go @@ -28,6 +28,7 @@ import ( utilflowcontrol "k8s.io/apiserver/pkg/util/flowcontrol" "k8s.io/client-go/kubernetes" "k8s.io/component-base/featuregate" + "k8s.io/klog/v2" ) // RecommendedOptions contains the recommended options for running an API server. @@ -124,12 +125,16 @@ func (o *RecommendedOptions) ApplyTo(config *server.RecommendedConfig) error { return err } if feature.DefaultFeatureGate.Enabled(features.APIPriorityAndFairness) { - config.FlowControl = utilflowcontrol.New( - config.SharedInformerFactory, - kubernetes.NewForConfigOrDie(config.ClientConfig).FlowcontrolV1beta1(), - config.MaxRequestsInFlight+config.MaxMutatingRequestsInFlight, - config.RequestTimeout/4, - ) + if config.ClientConfig != nil { + config.FlowControl = utilflowcontrol.New( + config.SharedInformerFactory, + kubernetes.NewForConfigOrDie(config.ClientConfig).FlowcontrolV1beta1(), + config.MaxRequestsInFlight+config.MaxMutatingRequestsInFlight, + config.RequestTimeout/4, + ) + } else { + klog.Warningf("Neither kubeconfig is provided nor service-account is mounted, so APIPriorityAndFairness will be disabled") + } } return nil } diff --git a/vendor/k8s.io/apiserver/pkg/server/options/server_run_options.go b/vendor/k8s.io/apiserver/pkg/server/options/server_run_options.go index 1ee7060428a1..b9080fa81d73 100644 --- a/vendor/k8s.io/apiserver/pkg/server/options/server_run_options.go +++ b/vendor/k8s.io/apiserver/pkg/server/options/server_run_options.go @@ -19,10 +19,12 @@ package options import ( "fmt" "net" + "strings" "time" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime/serializer" + "k8s.io/apimachinery/pkg/util/errors" "k8s.io/apiserver/pkg/server" utilfeature "k8s.io/apiserver/pkg/util/feature" @@ -34,6 +36,7 @@ type ServerRunOptions struct { AdvertiseAddress net.IP CorsAllowedOriginList []string + HSTSDirectives []string ExternalHost string MaxRequestsInFlight int MaxMutatingRequestsInFlight int @@ -71,6 +74,7 @@ func NewServerRunOptions() *ServerRunOptions { // ApplyTo applies the run options to the method receiver and returns self func (s *ServerRunOptions) ApplyTo(c *server.Config) error { c.CorsAllowedOriginList = s.CorsAllowedOriginList + c.HSTSDirectives = s.HSTSDirectives c.ExternalAddress = s.ExternalHost c.MaxRequestsInFlight = s.MaxRequestsInFlight c.MaxMutatingRequestsInFlight = s.MaxMutatingRequestsInFlight @@ -143,9 +147,31 @@ func (s *ServerRunOptions) Validate() []error { errors = append(errors, fmt.Errorf("--max-resource-write-bytes can not be negative value")) } + if err := validateHSTSDirectives(s.HSTSDirectives); err != nil { + errors = append(errors, err) + } return errors } +func validateHSTSDirectives(hstsDirectives []string) error { + // HSTS Headers format: Strict-Transport-Security:max-age=expireTime [;includeSubDomains] [;preload] + // See https://tools.ietf.org/html/rfc6797#section-6.1 for more information + allErrors := []error{} + for _, hstsDirective := range hstsDirectives { + if len(strings.TrimSpace(hstsDirective)) == 0 { + allErrors = append(allErrors, fmt.Errorf("empty value in strict-transport-security-directives")) + continue + } + if hstsDirective != "includeSubDomains" && hstsDirective != "preload" { + maxAgeDirective := strings.Split(hstsDirective, "=") + if len(maxAgeDirective) != 2 || maxAgeDirective[0] != "max-age" { + allErrors = append(allErrors, fmt.Errorf("--strict-transport-security-directives invalid, allowed values: max-age=expireTime, includeSubDomains, preload. see https://tools.ietf.org/html/rfc6797#section-6.1 for more information")) + } + } + } + return errors.NewAggregate(allErrors) +} + // AddUniversalFlags adds flags for a specific APIServer to the specified FlagSet func (s *ServerRunOptions) AddUniversalFlags(fs *pflag.FlagSet) { // Note: the weird ""+ in below lines seems to be the only way to get gofmt to @@ -161,6 +187,10 @@ func (s *ServerRunOptions) AddUniversalFlags(fs *pflag.FlagSet) { "List of allowed origins for CORS, comma separated. An allowed origin can be a regular "+ "expression to support subdomain matching. If this list is empty CORS will not be enabled.") + fs.StringSliceVar(&s.HSTSDirectives, "strict-transport-security-directives", s.HSTSDirectives, ""+ + "List of directives for HSTS, comma separated. If this list is empty, then HSTS directives will not "+ + "be added. Example: 'max-age=31536000,includeSubDomains,preload'") + deprecatedTargetRAMMB := 0 fs.IntVar(&deprecatedTargetRAMMB, "target-ram-mb", deprecatedTargetRAMMB, "DEPRECATED: Memory limit for apiserver in MB (used to configure sizes of caches, etc.)") diff --git a/vendor/k8s.io/apiserver/pkg/server/options/serving.go b/vendor/k8s.io/apiserver/pkg/server/options/serving.go index 0dcbbb738fdd..f435ba5b8d9f 100644 --- a/vendor/k8s.io/apiserver/pkg/server/options/serving.go +++ b/vendor/k8s.io/apiserver/pkg/server/options/serving.go @@ -23,6 +23,7 @@ import ( "path" "strconv" "strings" + "syscall" "github.com/spf13/pflag" "k8s.io/klog/v2" @@ -71,6 +72,9 @@ type SecureServingOptions struct { // PermitPortSharing controls if SO_REUSEPORT is used when binding the port, which allows // more than one instance to bind on the same address and port. PermitPortSharing bool + + // PermitAddressSharing controls if SO_REUSEADDR is used when binding the port. + PermitAddressSharing bool } type CertKey struct { @@ -203,6 +207,11 @@ func (s *SecureServingOptions) AddFlags(fs *pflag.FlagSet) { fs.BoolVar(&s.PermitPortSharing, "permit-port-sharing", s.PermitPortSharing, "If true, SO_REUSEPORT will be used when binding the port, which allows "+ "more than one instance to bind on the same address and port. [default=false]") + + fs.BoolVar(&s.PermitAddressSharing, "permit-address-sharing", s.PermitAddressSharing, + "If true, SO_REUSEADDR will be used when binding the port. This allows binding "+ + "to wildcard IPs like 0.0.0.0 and specific IPs in parallel, and it avoids waiting "+ + "for the kernel to release sockets in TIME_WAIT state. [default=false]") } // ApplyTo fills up serving information in the server configuration. @@ -220,8 +229,15 @@ func (s *SecureServingOptions) ApplyTo(config **server.SecureServingInfo) error c := net.ListenConfig{} + ctls := multipleControls{} if s.PermitPortSharing { - c.Control = permitPortReuse + ctls = append(ctls, permitPortReuse) + } + if s.PermitAddressSharing { + ctls = append(ctls, permitAddressReuse) + } + if len(ctls) > 0 { + c.Control = ctls.Control } s.Listener, s.BindPort, err = CreateListener(s.BindNetwork, addr, c) @@ -354,3 +370,14 @@ func CreateListener(network, addr string, config net.ListenConfig) (net.Listener return ln, tcpAddr.Port, nil } + +type multipleControls []func(network, addr string, conn syscall.RawConn) error + +func (mcs multipleControls) Control(network, addr string, conn syscall.RawConn) error { + for _, c := range mcs { + if err := c(network, addr, conn); err != nil { + return err + } + } + return nil +} diff --git a/vendor/k8s.io/apiserver/pkg/server/options/serving_unix.go b/vendor/k8s.io/apiserver/pkg/server/options/serving_unix.go index 221a5474bd07..5bf87e4b17c2 100644 --- a/vendor/k8s.io/apiserver/pkg/server/options/serving_unix.go +++ b/vendor/k8s.io/apiserver/pkg/server/options/serving_unix.go @@ -22,10 +22,22 @@ import ( "syscall" "golang.org/x/sys/unix" + + "k8s.io/klog/v2" ) func permitPortReuse(network, addr string, conn syscall.RawConn) error { return conn.Control(func(fd uintptr) { - syscall.SetsockoptInt(int(fd), syscall.SOL_SOCKET, unix.SO_REUSEPORT, 1) + if err := syscall.SetsockoptInt(int(fd), syscall.SOL_SOCKET, unix.SO_REUSEPORT, 1); err != nil { + klog.Warningf("failed to set SO_REUSEPORT on socket: %v", err) + } + }) +} + +func permitAddressReuse(network, addr string, conn syscall.RawConn) error { + return conn.Control(func(fd uintptr) { + if err := syscall.SetsockoptInt(int(fd), syscall.SOL_SOCKET, unix.SO_REUSEADDR, 1); err != nil { + klog.Warningf("failed to set SO_REUSEADDR on socket: %v", err) + } }) } diff --git a/vendor/k8s.io/apiserver/pkg/server/options/serving_windows.go b/vendor/k8s.io/apiserver/pkg/server/options/serving_windows.go index 1941890234ea..1663acee0b81 100644 --- a/vendor/k8s.io/apiserver/pkg/server/options/serving_windows.go +++ b/vendor/k8s.io/apiserver/pkg/server/options/serving_windows.go @@ -23,8 +23,12 @@ import ( "syscall" ) -// Windows only supports SO_REUSEADDR, which may cause undefined behavior, as -// there is no protection against port hijacking. func permitPortReuse(network, address string, c syscall.RawConn) error { return fmt.Errorf("port reuse is not supported on Windows") } + +// Windows supports SO_REUSEADDR, but it may cause undefined behavior, as +// there is no protection against port hijacking. +func permitAddressReuse(network, addr string, conn syscall.RawConn) error { + return fmt.Errorf("address reuse is not supported on Windows") +} diff --git a/vendor/k8s.io/apiserver/pkg/server/resourceconfig/BUILD b/vendor/k8s.io/apiserver/pkg/server/resourceconfig/BUILD deleted file mode 100644 index 59c45ca49d37..000000000000 --- a/vendor/k8s.io/apiserver/pkg/server/resourceconfig/BUILD +++ /dev/null @@ -1,46 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "helpers.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/server/resourceconfig", - importpath = "k8s.io/apiserver/pkg/server/resourceconfig", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/storage:go_default_library", - "//staging/src/k8s.io/component-base/cli/flag:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["helpers_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/storage:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiserver/pkg/server/routes/BUILD b/vendor/k8s.io/apiserver/pkg/server/routes/BUILD deleted file mode 100644 index e0da2dd941e5..000000000000 --- a/vendor/k8s.io/apiserver/pkg/server/routes/BUILD +++ /dev/null @@ -1,51 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "flags.go", - "index.go", - "metrics.go", - "openapi.go", - "profiling.go", - "version.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/server/routes", - importpath = "k8s.io/apiserver/pkg/server/routes", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/version:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/metrics:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/mux:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/metrics:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/flowcontrol/metrics:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - "//vendor/github.com/emicklei/go-restful:go_default_library", - "//vendor/github.com/go-openapi/spec:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/builder:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/common:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/handler:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/server/signal.go b/vendor/k8s.io/apiserver/pkg/server/signal.go index e5334ae4c15f..bdd2728f8abf 100644 --- a/vendor/k8s.io/apiserver/pkg/server/signal.go +++ b/vendor/k8s.io/apiserver/pkg/server/signal.go @@ -20,6 +20,8 @@ import ( "context" "os" "os/signal" + + "k8s.io/klog/v2" ) var onlyOneSignalHandler = make(chan struct{}) @@ -34,10 +36,26 @@ func SetupSignalHandler() <-chan struct{} { return SetupSignalContext().Done() } +// SetupSignalHandlerIgnoringFurtherSignals is the same as SetupSignalContext, except +// it ignores further exit signals after receiving the first one. +func SetupSignalHandlerIgnoringFurtherSignals() <-chan struct{} { + return SetupSignalContextNotExiting().Done() +} + // SetupSignalContext is same as SetupSignalHandler, but a context.Context is returned. // Only one of SetupSignalContext and SetupSignalHandler should be called, and only can // be called once. func SetupSignalContext() context.Context { + return setupSignalContext(true) +} + +// SetupSignalContextNotExiting is the same as SetupSignalContext, except +// it ignores further exit signals after receiving the first one. +func SetupSignalContextNotExiting() context.Context { + return setupSignalContext(false) +} + +func setupSignalContext(exitOnSecondSignal bool) context.Context { close(onlyOneSignalHandler) // panics when called twice shutdownHandler = make(chan os.Signal, 2) @@ -47,8 +65,15 @@ func SetupSignalContext() context.Context { go func() { <-shutdownHandler cancel() - <-shutdownHandler - os.Exit(1) // second signal. Exit directly. + if exitOnSecondSignal { + <-shutdownHandler + os.Exit(1) + } else { + for { + <-shutdownHandler + klog.Infof("Termination signal has been received already. Ignoring signal.") + } + } }() return ctx diff --git a/vendor/k8s.io/apiserver/pkg/server/storage/BUILD b/vendor/k8s.io/apiserver/pkg/server/storage/BUILD deleted file mode 100644 index d57fb2278250..000000000000 --- a/vendor/k8s.io/apiserver/pkg/server/storage/BUILD +++ /dev/null @@ -1,63 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "resource_config_test.go", - "storage_factory_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/example:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/example/install:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/example/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/storagebackend:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "resource_config.go", - "resource_encoding_config.go", - "storage_codec.go", - "storage_factory.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/server/storage", - importpath = "k8s.io/apiserver/pkg/server/storage", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/recognizer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/features:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/storagebackend:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/value:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/storage/BUILD b/vendor/k8s.io/apiserver/pkg/storage/BUILD deleted file mode 100644 index f2506e70a863..000000000000 --- a/vendor/k8s.io/apiserver/pkg/storage/BUILD +++ /dev/null @@ -1,70 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "selection_predicate_test.go", - "util_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "errors.go", - "interfaces.go", - "selection_predicate.go", - "util.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/storage", - importpath = "k8s.io/apiserver/pkg/storage", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/validation/path:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiserver/pkg/storage/cacher:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/storage/errors:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/storage/names:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/storage/storagebackend:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/storage/testing:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/storage/tests:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/storage/value:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/storage/OWNERS b/vendor/k8s.io/apiserver/pkg/storage/OWNERS index 167792c32773..68f98b61a24f 100644 --- a/vendor/k8s.io/apiserver/pkg/storage/OWNERS +++ b/vendor/k8s.io/apiserver/pkg/storage/OWNERS @@ -22,5 +22,4 @@ reviewers: - mml - ingvagabund - resouer -- mbohlool - enj diff --git a/vendor/k8s.io/apiserver/pkg/storage/cacher/BUILD b/vendor/k8s.io/apiserver/pkg/storage/cacher/BUILD deleted file mode 100644 index 56fe89a25a9f..000000000000 --- a/vendor/k8s.io/apiserver/pkg/storage/cacher/BUILD +++ /dev/null @@ -1,86 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "cacher.go", - "caching_object.go", - "metrics.go", - "time_budget.go", - "util.go", - "watch_cache.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/storage/cacher", - importpath = "k8s.io/apiserver/pkg/storage/cacher", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/features:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/trace:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "cacher_whitebox_test.go", - "caching_object_test.go", - "time_budget_test.go", - "util_test.go", - "watch_cache_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/example:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/example/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiserver/pkg/storage/cacher/cacher.go b/vendor/k8s.io/apiserver/pkg/storage/cacher/cacher.go index 459517767547..23ffc3ae31e5 100644 --- a/vendor/k8s.io/apiserver/pkg/storage/cacher/cacher.go +++ b/vendor/k8s.io/apiserver/pkg/storage/cacher/cacher.go @@ -431,8 +431,21 @@ func (c *Cacher) Create(ctx context.Context, key string, obj, out runtime.Object } // Delete implements storage.Interface. -func (c *Cacher) Delete(ctx context.Context, key string, out runtime.Object, preconditions *storage.Preconditions, validateDeletion storage.ValidateObjectFunc) error { - return c.storage.Delete(ctx, key, out, preconditions, validateDeletion) +func (c *Cacher) Delete( + ctx context.Context, key string, out runtime.Object, preconditions *storage.Preconditions, + validateDeletion storage.ValidateObjectFunc, _ runtime.Object) error { + // Ignore the suggestion and try to pass down the current version of the object + // read from cache. + if elem, exists, err := c.watchCache.GetByKey(key); err != nil { + klog.Errorf("GetByKey returned error: %v", err) + } else if exists { + // DeepCopy the object since we modify resource version when serializing the + // current object. + currObj := elem.(*storeElement).Object.DeepCopyObject() + return c.storage.Delete(ctx, key, out, preconditions, validateDeletion, currObj) + } + // If we couldn't get the object, fallback to no-suggestion. + return c.storage.Delete(ctx, key, out, preconditions, validateDeletion, nil) } // Watch implements storage.Interface. @@ -474,11 +487,14 @@ func (c *Cacher) Watch(ctx context.Context, key string, opts storage.ListOptions // Determine watch timeout('0' means deadline is not set, ignore checking) deadline, _ := ctx.Deadline() + + identifier := fmt.Sprintf("key: %q, labels: %q, fields: %q", key, pred.Label, pred.Field) + // Create a watcher here to reduce memory allocations under lock, // given that memory allocation may trigger GC and block the thread. // Also note that emptyFunc is a placeholder, until we will be able // to compute watcher.forget function (which has to happen under lock). - watcher := newCacheWatcher(chanSize, filterWithAttrsFunction(key, pred), emptyFunc, c.versioner, deadline, pred.AllowWatchBookmarks, c.objectType) + watcher := newCacheWatcher(chanSize, filterWithAttrsFunction(key, pred), emptyFunc, c.versioner, deadline, pred.AllowWatchBookmarks, c.objectType, identifier) // We explicitly use thread unsafe version and do locking ourself to ensure that // no new events will be processed in the meantime. The watchCache will be unlocked @@ -739,6 +755,8 @@ func (c *Cacher) GuaranteedUpdate( if elem, exists, err := c.watchCache.GetByKey(key); err != nil { klog.Errorf("GetByKey returned error: %v", err) } else if exists { + // DeepCopy the object since we modify resource version when serializing the + // current object. currObj := elem.(*storeElement).Object.DeepCopyObject() return c.storage.GuaranteedUpdate(ctx, key, ptrToType, ignoreNotFound, preconditions, tryUpdate, currObj) } @@ -1179,9 +1197,13 @@ type cacheWatcher struct { allowWatchBookmarks bool // Object type of the cache watcher interests objectType reflect.Type + + // human readable identifier that helps assigning cacheWatcher + // instance with request + identifier string } -func newCacheWatcher(chanSize int, filter filterWithAttrsFunc, forget func(), versioner storage.Versioner, deadline time.Time, allowWatchBookmarks bool, objectType reflect.Type) *cacheWatcher { +func newCacheWatcher(chanSize int, filter filterWithAttrsFunc, forget func(), versioner storage.Versioner, deadline time.Time, allowWatchBookmarks bool, objectType reflect.Type, identifier string) *cacheWatcher { return &cacheWatcher{ input: make(chan *watchCacheEvent, chanSize), result: make(chan watch.Event, chanSize), @@ -1193,6 +1215,7 @@ func newCacheWatcher(chanSize int, filter filterWithAttrsFunc, forget func(), ve deadline: deadline, allowWatchBookmarks: allowWatchBookmarks, objectType: objectType, + identifier: identifier, } } @@ -1235,7 +1258,8 @@ func (c *cacheWatcher) add(event *watchCacheEvent, timer *time.Timer) bool { // This means that we couldn't send event to that watcher. // Since we don't want to block on it infinitely, // we simply terminate it. - klog.V(1).Infof("Forcing watcher close due to unresponsiveness: %v", c.objectType.String()) + klog.V(1).Infof("Forcing %v watcher close due to unresponsiveness: %v. len(c.input) = %v, len(c.result) = %v", c.objectType.String(), c.identifier, len(c.input), len(c.result)) + terminatedWatchersCounter.WithLabelValues(c.objectType.String()).Inc() c.forget() } @@ -1386,7 +1410,7 @@ func (c *cacheWatcher) process(ctx context.Context, initEvents []*watchCacheEven } processingTime := time.Since(startTime) if processingTime > initProcessThreshold { - klog.V(2).Infof("processing %d initEvents of %s took %v", len(initEvents), objType, processingTime) + klog.V(2).Infof("processing %d initEvents of %s (%s) took %v", len(initEvents), objType, c.identifier, processingTime) } defer close(c.result) diff --git a/vendor/k8s.io/apiserver/pkg/storage/cacher/metrics.go b/vendor/k8s.io/apiserver/pkg/storage/cacher/metrics.go index 19cd5da6af4e..cf7bad510a3c 100644 --- a/vendor/k8s.io/apiserver/pkg/storage/cacher/metrics.go +++ b/vendor/k8s.io/apiserver/pkg/storage/cacher/metrics.go @@ -23,7 +23,7 @@ import ( /* * By default, all the following metrics are defined as falling under - * ALPHA stability level https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/20190404-kubernetes-control-plane-metrics-stability.md#stability-classes) + * ALPHA stability level https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/1209-metrics-stability/20190404-kubernetes-control-plane-metrics-stability.md#stability-classes) * * Promoting the stability level of the metric is a responsibility of the component owner, since it * involves explicitly acknowledging support for the metric across multiple releases, in accordance with @@ -39,6 +39,15 @@ var ( []string{"resource"}, ) + terminatedWatchersCounter = metrics.NewCounterVec( + &metrics.CounterOpts{ + Name: "apiserver_terminated_watchers_total", + Help: "Counter of watchers closed due to unresponsiveness broken by resource type.", + StabilityLevel: metrics.ALPHA, + }, + []string{"resource"}, + ) + watchCacheCapacityIncreaseTotal = metrics.NewCounterVec( &metrics.CounterOpts{ Name: "watch_cache_capacity_increase_total", @@ -56,12 +65,23 @@ var ( }, []string{"resource"}, ) + + watchCacheCapacity = metrics.NewGaugeVec( + &metrics.GaugeOpts{ + Name: "watch_cache_capacity", + Help: "Total capacity of watch cache broken by resource type.", + StabilityLevel: metrics.ALPHA, + }, + []string{"resource"}, + ) ) func init() { legacyregistry.MustRegister(initCounter) + legacyregistry.MustRegister(terminatedWatchersCounter) legacyregistry.MustRegister(watchCacheCapacityIncreaseTotal) legacyregistry.MustRegister(watchCacheCapacityDecreaseTotal) + legacyregistry.MustRegister(watchCacheCapacity) } // recordsWatchCacheCapacityChange record watchCache capacity resize(increase or decrease) operations. @@ -71,4 +91,5 @@ func recordsWatchCacheCapacityChange(objType string, old, new int) { return } watchCacheCapacityDecreaseTotal.WithLabelValues(objType).Inc() + watchCacheCapacity.WithLabelValues(objType).Set(float64(new)) } diff --git a/vendor/k8s.io/apiserver/pkg/storage/cacher/watch_cache.go b/vendor/k8s.io/apiserver/pkg/storage/cacher/watch_cache.go index dafcb3996366..b3c925e180ca 100644 --- a/vendor/k8s.io/apiserver/pkg/storage/cacher/watch_cache.go +++ b/vendor/k8s.io/apiserver/pkg/storage/cacher/watch_cache.go @@ -216,6 +216,8 @@ func newWatchCache( versioner: versioner, objectType: objectType, } + objType := objectType.String() + watchCacheCapacity.WithLabelValues(objType).Set(float64(wc.capacity)) wc.cond = sync.NewCond(wc.RLocker()) return wc } diff --git a/vendor/k8s.io/apiserver/pkg/storage/errors/BUILD b/vendor/k8s.io/apiserver/pkg/storage/errors/BUILD deleted file mode 100644 index 26c73332f803..000000000000 --- a/vendor/k8s.io/apiserver/pkg/storage/errors/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "storage.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/storage/errors", - importpath = "k8s.io/apiserver/pkg/storage/errors", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/storage/etcd3/BUILD b/vendor/k8s.io/apiserver/pkg/storage/etcd3/BUILD deleted file mode 100644 index 982455986f32..000000000000 --- a/vendor/k8s.io/apiserver/pkg/storage/etcd3/BUILD +++ /dev/null @@ -1,107 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "api_object_versioner_test.go", - "compact_test.go", - "event_test.go", - "healthcheck_test.go", - "lease_manager_test.go", - "store_test.go", - "watcher_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/apitesting:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/example:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/example/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/features:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/testing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/value:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - "//vendor/github.com/coreos/pkg/capnslog:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - "//vendor/go.etcd.io/etcd/clientv3:go_default_library", - "//vendor/go.etcd.io/etcd/etcdserver/api/v3rpc/rpctypes:go_default_library", - "//vendor/go.etcd.io/etcd/integration:go_default_library", - "//vendor/go.etcd.io/etcd/mvcc/mvccpb:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "api_object_versioner.go", - "compact.go", - "errors.go", - "event.go", - "healthcheck.go", - "lease_manager.go", - "logger.go", - "store.go", - "watcher.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/storage/etcd3", - importpath = "k8s.io/apiserver/pkg/storage/etcd3", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/features:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/metrics:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/value:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/go.etcd.io/etcd/clientv3:go_default_library", - "//vendor/go.etcd.io/etcd/etcdserver/api/v3rpc/rpctypes:go_default_library", - "//vendor/go.etcd.io/etcd/mvcc/mvccpb:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/trace:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/metrics:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/preflight:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/testing:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/storage/etcd3/OWNERS b/vendor/k8s.io/apiserver/pkg/storage/etcd3/OWNERS index 84666835da67..bdb4d402aa6f 100644 --- a/vendor/k8s.io/apiserver/pkg/storage/etcd3/OWNERS +++ b/vendor/k8s.io/apiserver/pkg/storage/etcd3/OWNERS @@ -3,5 +3,4 @@ reviewers: - wojtek-t - timothysc -- madhusudancs - hongchaodeng diff --git a/vendor/k8s.io/apiserver/pkg/storage/etcd3/lease_manager.go b/vendor/k8s.io/apiserver/pkg/storage/etcd3/lease_manager.go index 6b5a5700a9e7..7c8b4a1d86a0 100644 --- a/vendor/k8s.io/apiserver/pkg/storage/etcd3/lease_manager.go +++ b/vendor/k8s.io/apiserver/pkg/storage/etcd3/lease_manager.go @@ -22,8 +22,30 @@ import ( "time" "go.etcd.io/etcd/clientv3" + "k8s.io/apiserver/pkg/storage/etcd3/metrics" ) +const ( + defaultLeaseReuseDurationSeconds = 60 + defaultLeaseMaxObjectCount = 1000 +) + +// LeaseManagerConfig is configuration for creating a lease manager. +type LeaseManagerConfig struct { + // ReuseDurationSeconds specifies time in seconds that each lease is reused + ReuseDurationSeconds int64 + // MaxObjectCount specifies how many objects that a lease can attach + MaxObjectCount int64 +} + +// NewDefaultLeaseManagerConfig creates a LeaseManagerConfig with default values +func NewDefaultLeaseManagerConfig() LeaseManagerConfig { + return LeaseManagerConfig{ + ReuseDurationSeconds: defaultLeaseReuseDurationSeconds, + MaxObjectCount: defaultLeaseMaxObjectCount, + } +} + // leaseManager is used to manage leases requested from etcd. If a new write // needs a lease that has similar expiration time to the previous one, the old // lease will be reused to reduce the overhead of etcd, since lease operations @@ -36,35 +58,33 @@ type leaseManager struct { prevLeaseExpirationTime time.Time // The period of time in seconds and percent of TTL that each lease is // reused. The minimum of them is used to avoid unreasonably large - // numbers. We use var instead of const for testing purposes. - leaseReuseDurationSeconds int64 - leaseReuseDurationPercent float64 + // numbers. + leaseReuseDurationSeconds int64 + leaseReuseDurationPercent float64 + leaseMaxAttachedObjectCount int64 + leaseAttachedObjectCount int64 } // newDefaultLeaseManager creates a new lease manager using default setting. -func newDefaultLeaseManager(client *clientv3.Client) *leaseManager { - return newLeaseManager(client, 60, 0.05) +func newDefaultLeaseManager(client *clientv3.Client, config LeaseManagerConfig) *leaseManager { + if config.MaxObjectCount <= 0 { + config.MaxObjectCount = defaultLeaseMaxObjectCount + } + return newLeaseManager(client, config.ReuseDurationSeconds, 0.05, config.MaxObjectCount) } // newLeaseManager creates a new lease manager with the number of buffered // leases, lease reuse duration in seconds and percentage. The percentage // value x means x*100%. -func newLeaseManager(client *clientv3.Client, leaseReuseDurationSeconds int64, leaseReuseDurationPercent float64) *leaseManager { +func newLeaseManager(client *clientv3.Client, leaseReuseDurationSeconds int64, leaseReuseDurationPercent float64, maxObjectCount int64) *leaseManager { return &leaseManager{ - client: client, - leaseReuseDurationSeconds: leaseReuseDurationSeconds, - leaseReuseDurationPercent: leaseReuseDurationPercent, + client: client, + leaseReuseDurationSeconds: leaseReuseDurationSeconds, + leaseReuseDurationPercent: leaseReuseDurationPercent, + leaseMaxAttachedObjectCount: maxObjectCount, } } -// setLeaseReuseDurationSeconds is used for testing purpose. It is used to -// reduce the extra lease duration to avoid unnecessary timeout in testing. -func (l *leaseManager) setLeaseReuseDurationSeconds(duration int64) { - l.leaseMu.Lock() - defer l.leaseMu.Unlock() - l.leaseReuseDurationSeconds = duration -} - // GetLease returns a lease based on requested ttl: if the cached previous // lease can be reused, reuse it; otherwise request a new one from etcd. func (l *leaseManager) GetLease(ctx context.Context, ttl int64) (clientv3.LeaseID, error) { @@ -75,9 +95,15 @@ func (l *leaseManager) GetLease(ctx context.Context, ttl int64) (clientv3.LeaseI reuseDurationSeconds := l.getReuseDurationSecondsLocked(ttl) valid := now.Add(time.Duration(ttl) * time.Second).Before(l.prevLeaseExpirationTime) sufficient := now.Add(time.Duration(ttl+reuseDurationSeconds) * time.Second).After(l.prevLeaseExpirationTime) - if valid && sufficient { + + // We count all operations that happened in the same lease, regardless of success or failure. + // Currently each GetLease call only attach 1 object + l.leaseAttachedObjectCount++ + + if valid && sufficient && l.leaseAttachedObjectCount <= l.leaseMaxAttachedObjectCount { return l.prevLeaseID, nil } + // request a lease with a little extra ttl from etcd ttl += reuseDurationSeconds lcr, err := l.client.Lease.Grant(ctx, ttl) @@ -87,6 +113,9 @@ func (l *leaseManager) GetLease(ctx context.Context, ttl int64) (clientv3.LeaseI // cache the new lease id l.prevLeaseID = lcr.ID l.prevLeaseExpirationTime = now.Add(time.Duration(ttl) * time.Second) + // refresh count + metrics.UpdateLeaseObjectCount(l.leaseAttachedObjectCount) + l.leaseAttachedObjectCount = 1 return lcr.ID, nil } diff --git a/vendor/k8s.io/apiserver/pkg/storage/etcd3/metrics/BUILD b/vendor/k8s.io/apiserver/pkg/storage/etcd3/metrics/BUILD deleted file mode 100644 index 13324471c836..000000000000 --- a/vendor/k8s.io/apiserver/pkg/storage/etcd3/metrics/BUILD +++ /dev/null @@ -1,30 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["metrics.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/storage/etcd3/metrics", - importpath = "k8s.io/apiserver/pkg/storage/etcd3/metrics", - deps = [ - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/storage/etcd3/metrics/OWNERS b/vendor/k8s.io/apiserver/pkg/storage/etcd3/metrics/OWNERS new file mode 100644 index 000000000000..433e84aa3e43 --- /dev/null +++ b/vendor/k8s.io/apiserver/pkg/storage/etcd3/metrics/OWNERS @@ -0,0 +1,4 @@ +# See the OWNERS docs at https://go.k8s.io/owners + +approvers: + - logicalhan diff --git a/vendor/k8s.io/apiserver/pkg/storage/etcd3/metrics/metrics.go b/vendor/k8s.io/apiserver/pkg/storage/etcd3/metrics/metrics.go index 53be9ae5fcff..a944e4478e7e 100644 --- a/vendor/k8s.io/apiserver/pkg/storage/etcd3/metrics/metrics.go +++ b/vendor/k8s.io/apiserver/pkg/storage/etcd3/metrics/metrics.go @@ -26,7 +26,7 @@ import ( /* * By default, all the following metrics are defined as falling under - * ALPHA stability level https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/20190404-kubernetes-control-plane-metrics-stability.md#stability-classes) + * ALPHA stability level https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/1209-metrics-stability/20190404-kubernetes-control-plane-metrics-stability.md#stability-classes) * * Promoting the stability level of the metric is a responsibility of the component owner, since it * involves explicitly acknowledging support for the metric across multiple releases, in accordance with @@ -43,11 +43,20 @@ var ( }, []string{"operation", "type"}, ) + etcdObjectCounts = compbasemetrics.NewGaugeVec( + &compbasemetrics.GaugeOpts{ + Name: "etcd_object_counts", + DeprecatedVersion: "1.21.0", + Help: "Number of stored objects at the time of last check split by kind. This metric is replaced by apiserver_storage_object_counts.", + StabilityLevel: compbasemetrics.ALPHA, + }, + []string{"resource"}, + ) objectCounts = compbasemetrics.NewGaugeVec( &compbasemetrics.GaugeOpts{ - Name: "etcd_object_counts", + Name: "apiserver_storage_objects", Help: "Number of stored objects at the time of last check split by kind.", - StabilityLevel: compbasemetrics.ALPHA, + StabilityLevel: compbasemetrics.STABLE, }, []string{"resource"}, ) @@ -67,6 +76,15 @@ var ( }, []string{"resource"}, ) + etcdLeaseObjectCounts = compbasemetrics.NewHistogramVec( + &compbasemetrics.HistogramOpts{ + Name: "etcd_lease_object_counts", + Help: "Number of objects attached to a single etcd lease.", + Buckets: []float64{10, 50, 100, 500, 1000, 2500, 5000}, + StabilityLevel: compbasemetrics.ALPHA, + }, + []string{}, + ) ) var registerMetrics sync.Once @@ -77,14 +95,17 @@ func Register() { registerMetrics.Do(func() { legacyregistry.MustRegister(etcdRequestLatency) legacyregistry.MustRegister(objectCounts) + legacyregistry.MustRegister(etcdObjectCounts) legacyregistry.MustRegister(dbTotalSize) legacyregistry.MustRegister(etcdBookmarkCounts) + legacyregistry.MustRegister(etcdLeaseObjectCounts) }) } -// UpdateObjectCount sets the etcd_object_counts metric. +// UpdateObjectCount sets the apiserver_storage_object_counts and etcd_object_counts (deprecated) metric. func UpdateObjectCount(resourcePrefix string, count int64) { objectCounts.WithLabelValues(resourcePrefix).Set(float64(count)) + etcdObjectCounts.WithLabelValues(resourcePrefix).Set(float64(count)) } // RecordEtcdRequestLatency sets the etcd_request_duration_seconds metrics. @@ -111,3 +132,10 @@ func sinceInSeconds(start time.Time) float64 { func UpdateEtcdDbSize(ep string, size int64) { dbTotalSize.WithLabelValues(ep).Set(float64(size)) } + +// UpdateLeaseObjectCount sets the etcd_lease_object_counts metric. +func UpdateLeaseObjectCount(count int64) { + // Currently we only store one previous lease, since all the events have the same ttl. + // See pkg/storage/etcd3/lease_manager.go + etcdLeaseObjectCounts.WithLabelValues().Observe(float64(count)) +} diff --git a/vendor/k8s.io/apiserver/pkg/storage/etcd3/preflight/BUILD b/vendor/k8s.io/apiserver/pkg/storage/etcd3/preflight/BUILD deleted file mode 100644 index 20d593431a18..000000000000 --- a/vendor/k8s.io/apiserver/pkg/storage/etcd3/preflight/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["checks.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/storage/etcd3/preflight", - importpath = "k8s.io/apiserver/pkg/storage/etcd3/preflight", -) - -go_test( - name = "go_default_test", - srcs = ["checks_test.go"], - embed = [":go_default_library"], - deps = ["//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/storage/etcd3/store.go b/vendor/k8s.io/apiserver/pkg/storage/etcd3/store.go index 0cff6b3fc9de..01008b7d03a6 100644 --- a/vendor/k8s.io/apiserver/pkg/storage/etcd3/store.go +++ b/vendor/k8s.io/apiserver/pkg/storage/etcd3/store.go @@ -83,11 +83,11 @@ type objState struct { } // New returns an etcd3 implementation of storage.Interface. -func New(c *clientv3.Client, codec runtime.Codec, newFunc func() runtime.Object, prefix string, transformer value.Transformer, pagingEnabled bool) storage.Interface { - return newStore(c, newFunc, pagingEnabled, codec, prefix, transformer) +func New(c *clientv3.Client, codec runtime.Codec, newFunc func() runtime.Object, prefix string, transformer value.Transformer, pagingEnabled bool, leaseManagerConfig LeaseManagerConfig) storage.Interface { + return newStore(c, codec, newFunc, prefix, transformer, pagingEnabled, leaseManagerConfig) } -func newStore(c *clientv3.Client, newFunc func() runtime.Object, pagingEnabled bool, codec runtime.Codec, prefix string, transformer value.Transformer) *store { +func newStore(c *clientv3.Client, codec runtime.Codec, newFunc func() runtime.Object, prefix string, transformer value.Transformer, pagingEnabled bool, leaseManagerConfig LeaseManagerConfig) *store { versioner := APIObjectVersioner{} result := &store{ client: c, @@ -100,7 +100,7 @@ func newStore(c *clientv3.Client, newFunc func() runtime.Object, pagingEnabled b // keeps compatibility with etcd2 impl for custom prefixes that don't start with '/' pathPrefix: path.Join("/", prefix), watcher: newWatcher(c, codec, newFunc, versioner, transformer), - leaseManager: newDefaultLeaseManager(c), + leaseManager: newDefaultLeaseManager(c, leaseManagerConfig), } return result } @@ -185,35 +185,77 @@ func (s *store) Create(ctx context.Context, key string, obj, out runtime.Object, } // Delete implements storage.Interface.Delete. -func (s *store) Delete(ctx context.Context, key string, out runtime.Object, preconditions *storage.Preconditions, validateDeletion storage.ValidateObjectFunc) error { +func (s *store) Delete( + ctx context.Context, key string, out runtime.Object, preconditions *storage.Preconditions, + validateDeletion storage.ValidateObjectFunc, cachedExistingObject runtime.Object) error { v, err := conversion.EnforcePtr(out) if err != nil { return fmt.Errorf("unable to convert output object to pointer: %v", err) } key = path.Join(s.pathPrefix, key) - return s.conditionalDelete(ctx, key, out, v, preconditions, validateDeletion) + return s.conditionalDelete(ctx, key, out, v, preconditions, validateDeletion, cachedExistingObject) } -func (s *store) conditionalDelete(ctx context.Context, key string, out runtime.Object, v reflect.Value, preconditions *storage.Preconditions, validateDeletion storage.ValidateObjectFunc) error { - startTime := time.Now() - getResp, err := s.client.KV.Get(ctx, key) - metrics.RecordEtcdRequestLatency("get", getTypeName(out), startTime) +func (s *store) conditionalDelete( + ctx context.Context, key string, out runtime.Object, v reflect.Value, preconditions *storage.Preconditions, + validateDeletion storage.ValidateObjectFunc, cachedExistingObject runtime.Object) error { + getCurrentState := func() (*objState, error) { + startTime := time.Now() + getResp, err := s.client.KV.Get(ctx, key) + metrics.RecordEtcdRequestLatency("get", getTypeName(out), startTime) + if err != nil { + return nil, err + } + return s.getState(getResp, key, v, false) + } + + var origState *objState + var err error + var origStateIsCurrent bool + if cachedExistingObject != nil { + origState, err = s.getStateFromObject(cachedExistingObject) + } else { + origState, err = getCurrentState() + origStateIsCurrent = true + } if err != nil { return err } + for { - origState, err := s.getState(getResp, key, v, false) - if err != nil { - return err - } if preconditions != nil { if err := preconditions.Check(key, origState.obj); err != nil { - return err + if origStateIsCurrent { + return err + } + + // It's possible we're working with stale data. + // Actually fetch + origState, err = getCurrentState() + if err != nil { + return err + } + origStateIsCurrent = true + // Retry + continue } } if err := validateDeletion(ctx, origState.obj); err != nil { - return err + if origStateIsCurrent { + return err + } + + // It's possible we're working with stale data. + // Actually fetch + origState, err = getCurrentState() + if err != nil { + return err + } + origStateIsCurrent = true + // Retry + continue } + startTime := time.Now() txnResp, err := s.client.KV.Txn(ctx).If( clientv3.Compare(clientv3.ModRevision(key), "=", origState.rev), @@ -227,8 +269,13 @@ func (s *store) conditionalDelete(ctx context.Context, key string, out runtime.O return err } if !txnResp.Succeeded { - getResp = (*clientv3.GetResponse)(txnResp.Responses[0].GetResponseRange()) + getResp := (*clientv3.GetResponse)(txnResp.Responses[0].GetResponseRange()) klog.V(4).Infof("deletion of %s failed because of a conflict, going to retry", key) + origState, err = s.getState(getResp, key, v, false) + if err != nil { + return err + } + origStateIsCurrent = true continue } return decode(s.codec, s.versioner, origState.data, out, origState.rev) @@ -238,7 +285,7 @@ func (s *store) conditionalDelete(ctx context.Context, key string, out runtime.O // GuaranteedUpdate implements storage.Interface.GuaranteedUpdate. func (s *store) GuaranteedUpdate( ctx context.Context, key string, out runtime.Object, ignoreNotFound bool, - preconditions *storage.Preconditions, tryUpdate storage.UpdateFunc, suggestion runtime.Object) error { + preconditions *storage.Preconditions, tryUpdate storage.UpdateFunc, cachedExistingObject runtime.Object) error { trace := utiltrace.New("GuaranteedUpdate etcd3", utiltrace.Field{"type", getTypeName(out)}) defer trace.LogIfLong(500 * time.Millisecond) @@ -259,18 +306,15 @@ func (s *store) GuaranteedUpdate( } var origState *objState - var mustCheckData bool - if suggestion != nil { - origState, err = s.getStateFromObject(suggestion) - if err != nil { - return err - } - mustCheckData = true + var origStateIsCurrent bool + if cachedExistingObject != nil { + origState, err = s.getStateFromObject(cachedExistingObject) } else { origState, err = getCurrentState() - if err != nil { - return err - } + origStateIsCurrent = true + } + if err != nil { + return err } trace.Step("initial value restored") @@ -278,7 +322,7 @@ func (s *store) GuaranteedUpdate( for { if err := preconditions.Check(key, origState.obj); err != nil { // If our data is already up to date, return the error - if !mustCheckData { + if origStateIsCurrent { return err } @@ -288,7 +332,7 @@ func (s *store) GuaranteedUpdate( if err != nil { return err } - mustCheckData = false + origStateIsCurrent = true // Retry continue } @@ -296,7 +340,7 @@ func (s *store) GuaranteedUpdate( ret, ttl, err := s.updateState(origState, tryUpdate) if err != nil { // If our data is already up to date, return the error - if !mustCheckData { + if origStateIsCurrent { return err } @@ -306,7 +350,7 @@ func (s *store) GuaranteedUpdate( if err != nil { return err } - mustCheckData = false + origStateIsCurrent = true // Retry continue } @@ -319,12 +363,12 @@ func (s *store) GuaranteedUpdate( // if we skipped the original Get in this loop, we must refresh from // etcd in order to be sure the data in the store is equivalent to // our desired serialization - if mustCheckData { + if !origStateIsCurrent { origState, err = getCurrentState() if err != nil { return err } - mustCheckData = false + origStateIsCurrent = true if !bytes.Equal(data, origState.data) { // original data changed, restart loop continue @@ -368,7 +412,7 @@ func (s *store) GuaranteedUpdate( return err } trace.Step("Retry value restored") - mustCheckData = false + origStateIsCurrent = true continue } putResp := txnResp.Responses[0].GetResponsePut() diff --git a/vendor/k8s.io/apiserver/pkg/storage/etcd3/testing/BUILD b/vendor/k8s.io/apiserver/pkg/storage/etcd3/testing/BUILD deleted file mode 100644 index f50b52719ab6..000000000000 --- a/vendor/k8s.io/apiserver/pkg/storage/etcd3/testing/BUILD +++ /dev/null @@ -1,48 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "test_server.go", - "utils.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/storage/etcd3/testing", - importpath = "k8s.io/apiserver/pkg/storage/etcd3/testing", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/testing/testingcert:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/storagebackend:go_default_library", - "//vendor/go.etcd.io/etcd/client:go_default_library", - "//vendor/go.etcd.io/etcd/clientv3:go_default_library", - "//vendor/go.etcd.io/etcd/etcdserver:go_default_library", - "//vendor/go.etcd.io/etcd/etcdserver/api/etcdhttp:go_default_library", - "//vendor/go.etcd.io/etcd/etcdserver/api/v2http:go_default_library", - "//vendor/go.etcd.io/etcd/integration:go_default_library", - "//vendor/go.etcd.io/etcd/pkg/testutil:go_default_library", - "//vendor/go.etcd.io/etcd/pkg/transport:go_default_library", - "//vendor/go.etcd.io/etcd/pkg/types:go_default_library", - "//vendor/go.uber.org/zap:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/testing/testingcert:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/storage/etcd3/testing/testingcert/BUILD b/vendor/k8s.io/apiserver/pkg/storage/etcd3/testing/testingcert/BUILD deleted file mode 100644 index 22e0247bbbfa..000000000000 --- a/vendor/k8s.io/apiserver/pkg/storage/etcd3/testing/testingcert/BUILD +++ /dev/null @@ -1,26 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["certificates.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/storage/etcd3/testing/testingcert", - importpath = "k8s.io/apiserver/pkg/storage/etcd3/testing/testingcert", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/storage/interfaces.go b/vendor/k8s.io/apiserver/pkg/storage/interfaces.go index 01f9132f55d5..ccfe98467e96 100644 --- a/vendor/k8s.io/apiserver/pkg/storage/interfaces.go +++ b/vendor/k8s.io/apiserver/pkg/storage/interfaces.go @@ -167,7 +167,12 @@ type Interface interface { // Delete removes the specified key and returns the value that existed at that spot. // If key didn't exist, it will return NotFound storage error. - Delete(ctx context.Context, key string, out runtime.Object, preconditions *Preconditions, validateDeletion ValidateObjectFunc) error + // If 'cachedExistingObject' is non-nil, it can be used as a suggestion about the + // current version of the object to avoid read operation from storage to get it. + // However, the implementations have to retry in case suggestion is stale. + Delete( + ctx context.Context, key string, out runtime.Object, preconditions *Preconditions, + validateDeletion ValidateObjectFunc, cachedExistingObject runtime.Object) error // Watch begins watching the specified key. Events are decoded into API objects, // and any items selected by 'p' are sent down to returned watch.Interface. @@ -215,9 +220,9 @@ type Interface interface { // or zero value in 'ptrToType' parameter otherwise. // If the object to update has the same value as previous, it won't do any update // but will return the object in 'ptrToType' parameter. - // If 'suggestion' is non-nil, it can be used as a suggestion about the current version - // of the object to avoid read operation from storage to get it. However, the - // implementations have to retry in case suggestion is stale. + // If 'cachedExistingObject' is non-nil, it can be used as a suggestion about the + // current version of the object to avoid read operation from storage to get it. + // However, the implementations have to retry in case suggestion is stale. // // Example: // @@ -239,7 +244,7 @@ type Interface interface { // ) GuaranteedUpdate( ctx context.Context, key string, ptrToType runtime.Object, ignoreNotFound bool, - precondtions *Preconditions, tryUpdate UpdateFunc, suggestion runtime.Object) error + precondtions *Preconditions, tryUpdate UpdateFunc, cachedExistingObject runtime.Object) error // Count returns number of different entries under the key (generally being path prefix). Count(key string) (int64, error) diff --git a/vendor/k8s.io/apiserver/pkg/storage/names/BUILD b/vendor/k8s.io/apiserver/pkg/storage/names/BUILD deleted file mode 100644 index 6a2bd25d28e3..000000000000 --- a/vendor/k8s.io/apiserver/pkg/storage/names/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["generate_test.go"], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = ["generate.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/storage/names", - importpath = "k8s.io/apiserver/pkg/storage/names", - deps = ["//staging/src/k8s.io/apimachinery/pkg/util/rand:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/storage/storagebackend/BUILD b/vendor/k8s.io/apiserver/pkg/storage/storagebackend/BUILD deleted file mode 100644 index 6a74f9eda4e7..000000000000 --- a/vendor/k8s.io/apiserver/pkg/storage/storagebackend/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["config.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/storage/storagebackend", - importpath = "k8s.io/apiserver/pkg/storage/storagebackend", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/egressselector:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/value:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiserver/pkg/storage/storagebackend/factory:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/storage/storagebackend/config.go b/vendor/k8s.io/apiserver/pkg/storage/storagebackend/config.go index 48245f831c7e..7caf1cb2f823 100644 --- a/vendor/k8s.io/apiserver/pkg/storage/storagebackend/config.go +++ b/vendor/k8s.io/apiserver/pkg/storage/storagebackend/config.go @@ -21,6 +21,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apiserver/pkg/server/egressselector" + "k8s.io/apiserver/pkg/storage/etcd3" "k8s.io/apiserver/pkg/storage/value" ) @@ -77,6 +78,8 @@ type Config struct { DBMetricPollInterval time.Duration // HealthcheckTimeout specifies the timeout used when checking health HealthcheckTimeout time.Duration + + LeaseManagerConfig etcd3.LeaseManagerConfig } func NewDefaultConfig(prefix string, codec runtime.Codec) *Config { @@ -87,5 +90,6 @@ func NewDefaultConfig(prefix string, codec runtime.Codec) *Config { CompactionInterval: DefaultCompactInterval, DBMetricPollInterval: DefaultDBMetricPollInterval, HealthcheckTimeout: DefaultHealthcheckTimeout, + LeaseManagerConfig: etcd3.NewDefaultLeaseManagerConfig(), } } diff --git a/vendor/k8s.io/apiserver/pkg/storage/storagebackend/factory/BUILD b/vendor/k8s.io/apiserver/pkg/storage/storagebackend/factory/BUILD deleted file mode 100644 index c797ce2c7f9b..000000000000 --- a/vendor/k8s.io/apiserver/pkg/storage/storagebackend/factory/BUILD +++ /dev/null @@ -1,66 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["tls_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/apitesting:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/example:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/example/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/testing/testingcert:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/storagebackend:go_default_library", - "//vendor/go.etcd.io/etcd/integration:go_default_library", - "//vendor/go.etcd.io/etcd/pkg/transport:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "etcd3.go", - "factory.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/storage/storagebackend/factory", - importpath = "k8s.io/apiserver/pkg/storage/storagebackend/factory", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/egressselector:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/metrics:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/storagebackend:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/value:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - "//vendor/github.com/grpc-ecosystem/go-grpc-prometheus:go_default_library", - "//vendor/go.etcd.io/etcd/clientv3:go_default_library", - "//vendor/go.etcd.io/etcd/pkg/transport:go_default_library", - "//vendor/google.golang.org/grpc:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/storage/storagebackend/factory/etcd3.go b/vendor/k8s.io/apiserver/pkg/storage/storagebackend/factory/etcd3.go index 9a1618df8dd3..c0fd8045f3a1 100644 --- a/vendor/k8s.io/apiserver/pkg/storage/storagebackend/factory/etcd3.go +++ b/vendor/k8s.io/apiserver/pkg/storage/storagebackend/factory/etcd3.go @@ -254,7 +254,7 @@ func newETCD3Storage(c storagebackend.Config, newFunc func() runtime.Object) (st if transformer == nil { transformer = value.IdentityTransformer } - return etcd3.New(client, c.Codec, newFunc, c.Prefix, transformer, c.Paging), destroyFunc, nil + return etcd3.New(client, c.Codec, newFunc, c.Prefix, transformer, c.Paging, c.LeaseManagerConfig), destroyFunc, nil } // startDBSizeMonitorPerEndpoint starts a loop to monitor etcd database size and update the diff --git a/vendor/k8s.io/apiserver/pkg/storage/value/BUILD b/vendor/k8s.io/apiserver/pkg/storage/value/BUILD deleted file mode 100644 index ffe57c748f3d..000000000000 --- a/vendor/k8s.io/apiserver/pkg/storage/value/BUILD +++ /dev/null @@ -1,57 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "metrics_test.go", - "transformer_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - "//staging/src/k8s.io/component-base/metrics/testutil:go_default_library", - "//vendor/google.golang.org/grpc/codes:go_default_library", - "//vendor/google.golang.org/grpc/status:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "metrics.go", - "transformer.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/storage/value", - importpath = "k8s.io/apiserver/pkg/storage/value", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - "//vendor/google.golang.org/grpc/status:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/aes:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/envelope:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/identity:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/secretbox:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/storage/value/encrypt/aes/BUILD b/vendor/k8s.io/apiserver/pkg/storage/value/encrypt/aes/BUILD deleted file mode 100644 index e4cc672e086f..000000000000 --- a/vendor/k8s.io/apiserver/pkg/storage/value/encrypt/aes/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["aes_test.go"], - embed = [":go_default_library"], - deps = ["//staging/src/k8s.io/apiserver/pkg/storage/value:go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = ["aes.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/storage/value/encrypt/aes", - importpath = "k8s.io/apiserver/pkg/storage/value/encrypt/aes", - deps = ["//staging/src/k8s.io/apiserver/pkg/storage/value:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/storage/value/encrypt/envelope/BUILD b/vendor/k8s.io/apiserver/pkg/storage/value/encrypt/envelope/BUILD deleted file mode 100644 index a2307920c088..000000000000 --- a/vendor/k8s.io/apiserver/pkg/storage/value/encrypt/envelope/BUILD +++ /dev/null @@ -1,116 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "envelope.go", - "grpc_service.go", - "metrics.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/storage/value/encrypt/envelope", - importpath = "k8s.io/apiserver/pkg/storage/value/encrypt/envelope", - deps = [ - "//staging/src/k8s.io/apiserver/pkg/storage/value:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/envelope/v1beta1:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - "//vendor/github.com/hashicorp/golang-lru:go_default_library", - "//vendor/golang.org/x/crypto/cryptobyte:go_default_library", - "//vendor/google.golang.org/grpc:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "envelope_test.go", - "grpc_service_unix_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apiserver/pkg/storage/value:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/aes:go_default_library", - ] + select({ - "@io_bazel_rules_go//go/platform:aix": [ - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/envelope/testing:go_default_library", - ], - "@io_bazel_rules_go//go/platform:android": [ - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/envelope/testing:go_default_library", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/envelope/testing:go_default_library", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/envelope/testing:go_default_library", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/envelope/testing:go_default_library", - ], - "@io_bazel_rules_go//go/platform:illumos": [ - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/envelope/testing:go_default_library", - ], - "@io_bazel_rules_go//go/platform:ios": [ - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/envelope/testing:go_default_library", - ], - "@io_bazel_rules_go//go/platform:js": [ - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/envelope/testing:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/envelope/testing:go_default_library", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/envelope/testing:go_default_library", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/envelope/testing:go_default_library", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/envelope/testing:go_default_library", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/envelope/testing:go_default_library", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/envelope/testing:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/envelope/testing:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/envelope/v1beta1:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/storage/value/encrypt/envelope/metrics.go b/vendor/k8s.io/apiserver/pkg/storage/value/encrypt/envelope/metrics.go index 285ae14be45e..10aafb03457b 100644 --- a/vendor/k8s.io/apiserver/pkg/storage/value/encrypt/envelope/metrics.go +++ b/vendor/k8s.io/apiserver/pkg/storage/value/encrypt/envelope/metrics.go @@ -33,7 +33,7 @@ const ( /* * By default, all the following metrics are defined as falling under - * ALPHA stability level https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/20190404-kubernetes-control-plane-metrics-stability.md#stability-classes) + * ALPHA stability level https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/1209-metrics-stability/20190404-kubernetes-control-plane-metrics-stability.md#stability-classes) * * Promoting the stability level of the metric is a responsibility of the component owner, since it * involves explicitly acknowledging support for the metric across multiple releases, in accordance with diff --git a/vendor/k8s.io/apiserver/pkg/storage/value/encrypt/envelope/v1beta1/BUILD b/vendor/k8s.io/apiserver/pkg/storage/value/encrypt/envelope/v1beta1/BUILD deleted file mode 100644 index e5d16d58cca1..000000000000 --- a/vendor/k8s.io/apiserver/pkg/storage/value/encrypt/envelope/v1beta1/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "service.pb.go", - "v1beta1.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/storage/value/encrypt/envelope/v1beta1", - importpath = "k8s.io/apiserver/pkg/storage/value/encrypt/envelope/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/google.golang.org/grpc:go_default_library", - "//vendor/google.golang.org/grpc/codes:go_default_library", - "//vendor/google.golang.org/grpc/status:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiserver/pkg/storage/value/encrypt/identity/BUILD b/vendor/k8s.io/apiserver/pkg/storage/value/encrypt/identity/BUILD deleted file mode 100644 index 530e9be01a48..000000000000 --- a/vendor/k8s.io/apiserver/pkg/storage/value/encrypt/identity/BUILD +++ /dev/null @@ -1,27 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["identity.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/storage/value/encrypt/identity", - importpath = "k8s.io/apiserver/pkg/storage/value/encrypt/identity", - deps = ["//staging/src/k8s.io/apiserver/pkg/storage/value:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/storage/value/encrypt/secretbox/BUILD b/vendor/k8s.io/apiserver/pkg/storage/value/encrypt/secretbox/BUILD deleted file mode 100644 index c20a391db45f..000000000000 --- a/vendor/k8s.io/apiserver/pkg/storage/value/encrypt/secretbox/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["secretbox_test.go"], - embed = [":go_default_library"], - deps = ["//staging/src/k8s.io/apiserver/pkg/storage/value:go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = ["secretbox.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/storage/value/encrypt/secretbox", - importpath = "k8s.io/apiserver/pkg/storage/value/encrypt/secretbox", - deps = [ - "//staging/src/k8s.io/apiserver/pkg/storage/value:go_default_library", - "//vendor/golang.org/x/crypto/nacl/secretbox:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/storage/value/metrics.go b/vendor/k8s.io/apiserver/pkg/storage/value/metrics.go index 292cfcd90d91..e52d9b01a45e 100644 --- a/vendor/k8s.io/apiserver/pkg/storage/value/metrics.go +++ b/vendor/k8s.io/apiserver/pkg/storage/value/metrics.go @@ -33,7 +33,7 @@ const ( /* * By default, all the following metrics are defined as falling under - * ALPHA stability level https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/20190404-kubernetes-control-plane-metrics-stability.md#stability-classes) + * ALPHA stability level https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/1209-metrics-stability/20190404-kubernetes-control-plane-metrics-stability.md#stability-classes) * * Promoting the stability level of the metric is a responsibility of the component owner, since it * involves explicitly acknowledging support for the metric across multiple releases, in accordance with diff --git a/vendor/k8s.io/apiserver/pkg/storageversion/BUILD b/vendor/k8s.io/apiserver/pkg/storageversion/BUILD deleted file mode 100644 index 247a51569582..000000000000 --- a/vendor/k8s.io/apiserver/pkg/storageversion/BUILD +++ /dev/null @@ -1,52 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "manager.go", - "updater.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/storageversion", - importpath = "k8s.io/apiserver/pkg/storageversion", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/apiserverinternal/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/component-base/metrics/prometheus/workqueue:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "manager_test.go", - "updater_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/apiserverinternal/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/github.com/google/go-cmp/cmp:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiserver/pkg/storageversion/manager.go b/vendor/k8s.io/apiserver/pkg/storageversion/manager.go index 03e21a4d6d31..c5ec9da1dd8d 100644 --- a/vendor/k8s.io/apiserver/pkg/storageversion/manager.go +++ b/vendor/k8s.io/apiserver/pkg/storageversion/manager.go @@ -40,6 +40,10 @@ type ResourceInfo struct { // Used to calculate decodable versions. Can only be used after all // equivalent versions are registered by InstallREST. EquivalentResourceMapper runtime.EquivalentResourceRegistry + + // DirectlyDecodableVersions is a list of versions that the converter for REST storage knows how to convert. This + // contains items like apiextensions.k8s.io/v1beta1 even if we don't serve that version. + DirectlyDecodableVersions []schema.GroupVersion } // Manager records the resources whose StorageVersions need updates, and provides a method to update those StorageVersions. @@ -133,13 +137,13 @@ func (s *defaultManager) UpdateStorageVersions(kubeAPIServerClientConfig *rest.C // StorageVersion objects have CommonEncodingVersion (each with one server registered). sortResourceInfosByGroupResource(resources) for _, r := range dedupResourceInfos(resources) { - dv := decodableVersions(r.EquivalentResourceMapper, r.GroupResource) + decodableVersions := decodableVersions(r.DirectlyDecodableVersions, r.EquivalentResourceMapper, r.GroupResource) gr := r.GroupResource // Group must be a valid subdomain in DNS (RFC 1123) if len(gr.Group) == 0 { gr.Group = "core" } - if err := updateStorageVersionFor(sc, serverID, gr, r.EncodingVersion, dv); err != nil { + if err := updateStorageVersionFor(sc, serverID, gr, r.EncodingVersion, decodableVersions); err != nil { utilruntime.HandleError(fmt.Errorf("failed to update storage version for %v: %v", r.GroupResource, err)) s.recordStatusFailure(&r, err) hasFailure = true @@ -267,10 +271,23 @@ func (s *defaultManager) Completed() bool { return s.completed.Load().(bool) } -func decodableVersions(e runtime.EquivalentResourceRegistry, gr schema.GroupResource) []string { +func decodableVersions(directlyDecodableVersions []schema.GroupVersion, e runtime.EquivalentResourceRegistry, gr schema.GroupResource) []string { var versions []string + for _, decodableVersions := range directlyDecodableVersions { + versions = append(versions, decodableVersions.String()) + } + decodingGVRs := e.EquivalentResourcesFor(gr.WithVersion(""), "") for _, v := range decodingGVRs { + found := false + for _, existingVersion := range versions { + if existingVersion == v.GroupVersion().String() { + found = true + } + } + if found { + continue + } versions = append(versions, v.GroupVersion().String()) } return versions diff --git a/vendor/k8s.io/apiserver/pkg/storageversion/updater.go b/vendor/k8s.io/apiserver/pkg/storageversion/updater.go index 10927fb0f035..ddd8dfbe632f 100644 --- a/vendor/k8s.io/apiserver/pkg/storageversion/updater.go +++ b/vendor/k8s.io/apiserver/pkg/storageversion/updater.go @@ -35,23 +35,90 @@ type Client interface { Get(context.Context, string, metav1.GetOptions) (*v1alpha1.StorageVersion, error) } -func setCommonEncodingVersion(sv *v1alpha1.StorageVersion) { - if len(sv.Status.StorageVersions) == 0 { - return +// SetCommonEncodingVersion updates the CommonEncodingVersion and the AllEncodingVersionsEqual +// condition based on the StorageVersions. +func SetCommonEncodingVersion(sv *v1alpha1.StorageVersion) { + var oldCommonEncodingVersion *string + if sv.Status.CommonEncodingVersion != nil { + version := *sv.Status.CommonEncodingVersion + oldCommonEncodingVersion = &version } - firstVersion := sv.Status.StorageVersions[0].EncodingVersion - agreed := true - for _, ssv := range sv.Status.StorageVersions { - if ssv.EncodingVersion != firstVersion { - agreed = false - break + sv.Status.CommonEncodingVersion = nil + if len(sv.Status.StorageVersions) != 0 { + firstVersion := sv.Status.StorageVersions[0].EncodingVersion + agreed := true + for _, ssv := range sv.Status.StorageVersions { + if ssv.EncodingVersion != firstVersion { + agreed = false + break + } + } + if agreed { + sv.Status.CommonEncodingVersion = &firstVersion + } + } + + condition := v1alpha1.StorageVersionCondition{ + Type: v1alpha1.AllEncodingVersionsEqual, + Status: v1alpha1.ConditionFalse, + ObservedGeneration: sv.Generation, + LastTransitionTime: metav1.NewTime(time.Now()), + Reason: "CommonEncodingVersionUnset", + Message: "Common encoding version unset", + } + if sv.Status.CommonEncodingVersion != nil { + condition.Status = v1alpha1.ConditionTrue + condition.Reason = "CommonEncodingVersionSet" + condition.Message = "Common encoding version set" + } + forceTransition := false + if oldCommonEncodingVersion != nil && sv.Status.CommonEncodingVersion != nil && + *oldCommonEncodingVersion != *sv.Status.CommonEncodingVersion { + forceTransition = true + } + setStatusCondition(&sv.Status.Conditions, condition, forceTransition) +} + +func findStatusCondition(conditions []v1alpha1.StorageVersionCondition, + conditionType v1alpha1.StorageVersionConditionType) *v1alpha1.StorageVersionCondition { + for i := range conditions { + if conditions[i].Type == conditionType { + return &conditions[i] } } - if agreed { - sv.Status.CommonEncodingVersion = &firstVersion - } else { - sv.Status.CommonEncodingVersion = nil + return nil +} + +// setStatusCondition sets the corresponding condition in conditions to newCondition. +// conditions must be non-nil. +// 1. if the condition of the specified type already exists: all fields of the existing condition are updated to +// newCondition, LastTransitionTime is set to now if the new status differs from the old status +// 2. if a condition of the specified type does not exist: LastTransitionTime is set to now() if unset, +// and newCondition is appended +// NOTE: forceTransition allows overwriting LastTransitionTime even when the status doesn't change. +func setStatusCondition(conditions *[]v1alpha1.StorageVersionCondition, newCondition v1alpha1.StorageVersionCondition, + forceTransition bool) { + if conditions == nil { + return + } + + if newCondition.LastTransitionTime.IsZero() { + newCondition.LastTransitionTime = metav1.NewTime(time.Now()) + } + existingCondition := findStatusCondition(*conditions, newCondition.Type) + if existingCondition == nil { + *conditions = append(*conditions, newCondition) + return + } + + statusChanged := existingCondition.Status != newCondition.Status + if statusChanged || forceTransition { + existingCondition.LastTransitionTime = newCondition.LastTransitionTime } + existingCondition.Status = newCondition.Status + existingCondition.Reason = newCondition.Reason + existingCondition.Message = newCondition.Message + existingCondition.ObservedGeneration = newCondition.ObservedGeneration } // updateStorageVersionFor updates the storage version object for the resource. @@ -123,6 +190,6 @@ func localUpdateStorageVersion(sv *v1alpha1.StorageVersion, apiserverID, encodin if !foundSSV { sv.Status.StorageVersions = append(sv.Status.StorageVersions, newSSV) } - setCommonEncodingVersion(sv) + SetCommonEncodingVersion(sv) return sv } diff --git a/vendor/k8s.io/apiserver/pkg/util/apihelpers/BUILD b/vendor/k8s.io/apiserver/pkg/util/apihelpers/BUILD deleted file mode 100644 index 96dab10dcf28..000000000000 --- a/vendor/k8s.io/apiserver/pkg/util/apihelpers/BUILD +++ /dev/null @@ -1,24 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["helpers.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/util/apihelpers", - importpath = "k8s.io/apiserver/pkg/util/apihelpers", - visibility = ["//visibility:public"], - deps = ["//staging/src/k8s.io/api/flowcontrol/v1beta1:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiserver/pkg/util/dryrun/BUILD b/vendor/k8s.io/apiserver/pkg/util/dryrun/BUILD deleted file mode 100644 index 356e902c719f..000000000000 --- a/vendor/k8s.io/apiserver/pkg/util/dryrun/BUILD +++ /dev/null @@ -1,23 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["dryrun.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/util/dryrun", - importpath = "k8s.io/apiserver/pkg/util/dryrun", - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiserver/pkg/util/feature/BUILD b/vendor/k8s.io/apiserver/pkg/util/feature/BUILD deleted file mode 100644 index 55b9f010e033..000000000000 --- a/vendor/k8s.io/apiserver/pkg/util/feature/BUILD +++ /dev/null @@ -1,24 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["feature_gate.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/util/feature", - importpath = "k8s.io/apiserver/pkg/util/feature", - deps = ["//staging/src/k8s.io/component-base/featuregate:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/util/flowcontrol/BUILD b/vendor/k8s.io/apiserver/pkg/util/flowcontrol/BUILD deleted file mode 100644 index 84af7fe0e275..000000000000 --- a/vendor/k8s.io/apiserver/pkg/util/flowcontrol/BUILD +++ /dev/null @@ -1,95 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "apf_controller.go", - "apf_controller_debug.go", - "apf_filter.go", - "formatting.go", - "rule.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/util/flowcontrol", - importpath = "k8s.io/apiserver/pkg/util/flowcontrol", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/flowcontrol/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/flowcontrol/bootstrap:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/serviceaccount:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/mux:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/apihelpers:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/flowcontrol/counter:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing/queueset:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/flowcontrol/format:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/flowcontrol/metrics:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/listers/flowcontrol/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/util/workqueue:go_default_library", - "//vendor/github.com/pkg/errors:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiserver/pkg/util/flowcontrol/counter:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/util/flowcontrol/debug:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/util/flowcontrol/format:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/util/flowcontrol/metrics:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = [ - "controller_test.go", - "filter_test.go", - "gen_test.go", - "match_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/flowcontrol/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/flowcontrol/bootstrap:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/flowcontrol/debug:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing/testing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/flowcontrol/format:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/flowcontrol/metrics:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta1:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) diff --git a/vendor/k8s.io/apiserver/pkg/util/flowcontrol/OWNERS b/vendor/k8s.io/apiserver/pkg/util/flowcontrol/OWNERS new file mode 100644 index 000000000000..50a230fcadb1 --- /dev/null +++ b/vendor/k8s.io/apiserver/pkg/util/flowcontrol/OWNERS @@ -0,0 +1,15 @@ +# See the OWNERS docs at https://go.k8s.io/owners + +approvers: +- lavalamp +- deads2k +- yue9944882 +- MikeSpreitzer +reviewers: +- lavalamp +- deads2k +- yue9944882 +- MikeSpreitzer +labels: +- sig/api-machinery +- area/apiserver diff --git a/vendor/k8s.io/apiserver/pkg/util/flowcontrol/apf_controller.go b/vendor/k8s.io/apiserver/pkg/util/flowcontrol/apf_controller.go index ef55aa2f0754..3ee3867456d5 100644 --- a/vendor/k8s.io/apiserver/pkg/util/flowcontrol/apf_controller.go +++ b/vendor/k8s.io/apiserver/pkg/util/flowcontrol/apf_controller.go @@ -23,6 +23,7 @@ import ( "encoding/json" "fmt" "math" + "math/rand" "sort" "sync" "time" @@ -30,11 +31,14 @@ import ( "github.com/pkg/errors" apiequality "k8s.io/apimachinery/pkg/api/equality" + apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" apitypes "k8s.io/apimachinery/pkg/types" - apierrors "k8s.io/apimachinery/pkg/util/errors" + "k8s.io/apimachinery/pkg/util/clock" + utilerrors "k8s.io/apimachinery/pkg/util/errors" utilruntime "k8s.io/apimachinery/pkg/util/runtime" + "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/wait" fcboot "k8s.io/apiserver/pkg/apis/flowcontrol/bootstrap" "k8s.io/apiserver/pkg/authentication/user" @@ -43,7 +47,6 @@ import ( fq "k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing" fcfmt "k8s.io/apiserver/pkg/util/flowcontrol/format" "k8s.io/apiserver/pkg/util/flowcontrol/metrics" - kubeinformers "k8s.io/client-go/informers" "k8s.io/client-go/tools/cache" "k8s.io/client-go/util/workqueue" "k8s.io/klog/v2" @@ -53,6 +56,8 @@ import ( flowcontrollister "k8s.io/client-go/listers/flowcontrol/v1beta1" ) +const timeFmt = "2006-01-02T15:04:05.999" + // This file contains a simple local (to the apiserver) controller // that digests API Priority and Fairness config objects (FlowSchema // and PriorityLevelConfiguration) into the data structure that the @@ -62,7 +67,7 @@ import ( // undesired becomes completely unused, all the config objects are // read and processed as a whole. -// StartFunction begins the process of handlig a request. If the +// StartFunction begins the process of handling a request. If the // request gets queued then this function uses the given hashValue as // the source of entropy as it shuffle-shards the request into a // queue. The descr1 and descr2 values play no role in the logic but @@ -85,9 +90,19 @@ type RequestDigest struct { // this type and cfgMeal follow the convention that the suffix // "Locked" means that the caller must hold the configController lock. type configController struct { + name string // varies in tests of fighting controllers + clock clock.PassiveClock queueSetFactory fq.QueueSetFactory obsPairGenerator metrics.TimedObserverPairGenerator + // How this controller appears in an ObjectMeta ManagedFieldsEntry.Manager + asFieldManager string + + // Given a boolean indicating whether a FlowSchema's referenced + // PriorityLevelConfig exists, return a boolean indicating whether + // the reference is dangling + foundToDangling func(bool) bool + // configQueue holds `(interface{})(0)` when the configuration // objects need to be reprocessed. configQueue workqueue.RateLimitingInterface @@ -122,6 +137,18 @@ type configController struct { // name to the state for that level. Every name referenced from a // member of `flowSchemas` has an entry here. priorityLevelStates map[string]*priorityLevelState + + // the most recent update attempts, ordered by increasing age. + // Consumer trims to keep only the last minute's worth of entries. + // The controller uses this to limit itself to at most six updates + // to a given FlowSchema in any minute. + // This may only be accessed from the one and only worker goroutine. + mostRecentUpdates []updateAttempt +} + +type updateAttempt struct { + timeUpdated time.Time + updatedItems sets.String // FlowSchema names } // priorityLevelState holds the state specific to a priority level. @@ -152,34 +179,26 @@ type priorityLevelState struct { } // NewTestableController is extra flexible to facilitate testing -func newTestableController( - informerFactory kubeinformers.SharedInformerFactory, - flowcontrolClient flowcontrolclient.FlowcontrolV1beta1Interface, - serverConcurrencyLimit int, - requestWaitLimit time.Duration, - obsPairGenerator metrics.TimedObserverPairGenerator, - queueSetFactory fq.QueueSetFactory, -) *configController { +func newTestableController(config TestableConfig) *configController { cfgCtlr := &configController{ - queueSetFactory: queueSetFactory, - obsPairGenerator: obsPairGenerator, - serverConcurrencyLimit: serverConcurrencyLimit, - requestWaitLimit: requestWaitLimit, - flowcontrolClient: flowcontrolClient, + name: config.Name, + clock: config.Clock, + queueSetFactory: config.QueueSetFactory, + obsPairGenerator: config.ObsPairGenerator, + asFieldManager: config.AsFieldManager, + foundToDangling: config.FoundToDangling, + serverConcurrencyLimit: config.ServerConcurrencyLimit, + requestWaitLimit: config.RequestWaitLimit, + flowcontrolClient: config.FlowcontrolClient, priorityLevelStates: make(map[string]*priorityLevelState), } - klog.V(2).Infof("NewTestableController with serverConcurrencyLimit=%d, requestWaitLimit=%s", serverConcurrencyLimit, requestWaitLimit) - cfgCtlr.initializeConfigController(informerFactory) + klog.V(2).Infof("NewTestableController %q with serverConcurrencyLimit=%d, requestWaitLimit=%s, name=%s, asFieldManager=%q", cfgCtlr.name, cfgCtlr.serverConcurrencyLimit, cfgCtlr.requestWaitLimit, cfgCtlr.name, cfgCtlr.asFieldManager) + // Start with longish delay because conflicts will be between + // different processes, so take some time to go away. + cfgCtlr.configQueue = workqueue.NewNamedRateLimitingQueue(workqueue.NewItemExponentialFailureRateLimiter(200*time.Millisecond, 8*time.Hour), "priority_and_fairness_config_queue") // ensure the data structure reflects the mandatory config cfgCtlr.lockAndDigestConfigObjects(nil, nil) - return cfgCtlr -} - -// initializeConfigController sets up the controller that processes -// config API objects. -func (cfgCtlr *configController) initializeConfigController(informerFactory kubeinformers.SharedInformerFactory) { - cfgCtlr.configQueue = workqueue.NewNamedRateLimitingQueue(workqueue.NewItemExponentialFailureRateLimiter(200*time.Millisecond, 8*time.Hour), "priority_and_fairness_config_queue") - fci := informerFactory.Flowcontrol().V1beta1() + fci := config.InformerFactory.Flowcontrol().V1beta1() pli := fci.PriorityLevelConfigurations() fsi := fci.FlowSchemas() cfgCtlr.plLister = pli.Lister() @@ -189,43 +208,64 @@ func (cfgCtlr *configController) initializeConfigController(informerFactory kube pli.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ AddFunc: func(obj interface{}) { pl := obj.(*flowcontrol.PriorityLevelConfiguration) - klog.V(7).Infof("Triggered API priority and fairness config reloading due to creation of PLC %s", pl.Name) + klog.V(7).Infof("Triggered API priority and fairness config reloading in %s due to creation of PLC %s", cfgCtlr.name, pl.Name) cfgCtlr.configQueue.Add(0) }, UpdateFunc: func(oldObj, newObj interface{}) { newPL := newObj.(*flowcontrol.PriorityLevelConfiguration) oldPL := oldObj.(*flowcontrol.PriorityLevelConfiguration) if !apiequality.Semantic.DeepEqual(oldPL.Spec, newPL.Spec) { - klog.V(7).Infof("Triggered API priority and fairness config reloading due to spec update of PLC %s", newPL.Name) + klog.V(7).Infof("Triggered API priority and fairness config reloading in %s due to spec update of PLC %s", cfgCtlr.name, newPL.Name) cfgCtlr.configQueue.Add(0) + } else { + klog.V(7).Infof("No trigger API priority and fairness config reloading in %s due to spec non-change of PLC %s", cfgCtlr.name, newPL.Name) } }, DeleteFunc: func(obj interface{}) { name, _ := cache.DeletionHandlingMetaNamespaceKeyFunc(obj) - klog.V(7).Infof("Triggered API priority and fairness config reloading due to deletion of PLC %s", name) + klog.V(7).Infof("Triggered API priority and fairness config reloading in %s due to deletion of PLC %s", cfgCtlr.name, name) cfgCtlr.configQueue.Add(0) }}) fsi.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ AddFunc: func(obj interface{}) { fs := obj.(*flowcontrol.FlowSchema) - klog.V(7).Infof("Triggered API priority and fairness config reloading due to creation of FS %s", fs.Name) + klog.V(7).Infof("Triggered API priority and fairness config reloading in %s due to creation of FS %s", cfgCtlr.name, fs.Name) cfgCtlr.configQueue.Add(0) }, UpdateFunc: func(oldObj, newObj interface{}) { newFS := newObj.(*flowcontrol.FlowSchema) oldFS := oldObj.(*flowcontrol.FlowSchema) - if !apiequality.Semantic.DeepEqual(oldFS.Spec, newFS.Spec) { - klog.V(7).Infof("Triggered API priority and fairness config reloading due to spec update of FS %s", newFS.Name) + // Changes to either Spec or Status are relevant. The + // concern is that we might, in some future release, want + // different behavior than is implemented now. One of the + // hardest questions is how does an operator roll out the + // new release in a cluster with multiple kube-apiservers + // --- in a way that works no matter what servers crash + // and restart when. If this handler reacts only to + // changes in Spec then we have a scenario in which the + // rollout leaves the old Status in place. The scenario + // ends with this subsequence: deploy the last new server + // before deleting the last old server, and in between + // those two operations the last old server crashes and + // recovers. The chosen solution is making this controller + // insist on maintaining the particular state that it + // establishes. + if !(apiequality.Semantic.DeepEqual(oldFS.Spec, newFS.Spec) && + apiequality.Semantic.DeepEqual(oldFS.Status, newFS.Status)) { + klog.V(7).Infof("Triggered API priority and fairness config reloading in %s due to spec and/or status update of FS %s", cfgCtlr.name, newFS.Name) cfgCtlr.configQueue.Add(0) + } else { + klog.V(7).Infof("No trigger of API priority and fairness config reloading in %s due to spec and status non-change of FS %s", cfgCtlr.name, newFS.Name) } }, DeleteFunc: func(obj interface{}) { name, _ := cache.DeletionHandlingMetaNamespaceKeyFunc(obj) - klog.V(7).Infof("Triggered API priority and fairness config reloading due to deletion of FS %s", name) + klog.V(7).Infof("Triggered API priority and fairness config reloading in %s due to deletion of FS %s", cfgCtlr.name, name) cfgCtlr.configQueue.Add(0) }}) + return cfgCtlr } // MaintainObservations keeps the observers from @@ -245,13 +285,6 @@ func (cfgCtlr *configController) updateObservations() { } } -// used from the unit tests only. -func (cfgCtlr *configController) getPriorityLevelState(plName string) *priorityLevelState { - cfgCtlr.lock.Lock() - defer cfgCtlr.lock.Unlock() - return cfgCtlr.priorityLevelStates[plName] -} - func (cfgCtlr *configController) Run(stopCh <-chan struct{}) error { defer utilruntime.HandleCrash() @@ -271,11 +304,16 @@ func (cfgCtlr *configController) Run(stopCh <-chan struct{}) error { return nil } +// runWorker is the logic of the one and only worker goroutine. We +// limit the number to one in order to obviate explicit +// synchronization around access to `cfgCtlr.mostRecentUpdates`. func (cfgCtlr *configController) runWorker() { for cfgCtlr.processNextWorkItem() { } } +// processNextWorkItem works on one entry from the work queue. +// Only invoke this in the one and only worker goroutine. func (cfgCtlr *configController) processNextWorkItem() bool { obj, shutdown := cfgCtlr.configQueue.Get() if shutdown { @@ -284,9 +322,14 @@ func (cfgCtlr *configController) processNextWorkItem() bool { func(obj interface{}) { defer cfgCtlr.configQueue.Done(obj) - if !cfgCtlr.syncOne() { + specificDelay, err := cfgCtlr.syncOne(map[string]string{}) + switch { + case err != nil: + klog.Error(err) cfgCtlr.configQueue.AddRateLimited(obj) - } else { + case specificDelay > 0: + cfgCtlr.configQueue.AddAfter(obj, specificDelay) + default: cfgCtlr.configQueue.Forget(obj) } }(obj) @@ -294,27 +337,22 @@ func (cfgCtlr *configController) processNextWorkItem() bool { return true } -// syncOne attempts to sync all the API Priority and Fairness config -// objects. It either succeeds and returns `true` or logs an error -// and returns `false`. -func (cfgCtlr *configController) syncOne() bool { +// syncOne does one full synchronization. It reads all the API +// objects that configure API Priority and Fairness and updates the +// local configController accordingly. +// Only invoke this in the one and only worker goroutine +func (cfgCtlr *configController) syncOne(flowSchemaRVs map[string]string) (specificDelay time.Duration, err error) { + klog.V(5).Infof("%s syncOne at %s", cfgCtlr.name, cfgCtlr.clock.Now().Format(timeFmt)) all := labels.Everything() newPLs, err := cfgCtlr.plLister.List(all) if err != nil { - klog.Errorf("Unable to list PriorityLevelConfiguration objects: %s", err.Error()) - return false + return 0, fmt.Errorf("unable to list PriorityLevelConfiguration objects: %w", err) } newFSs, err := cfgCtlr.fsLister.List(all) if err != nil { - klog.Errorf("Unable to list FlowSchema objects: %s", err.Error()) - return false + return 0, fmt.Errorf("unable to list FlowSchema objects: %w", err) } - err = cfgCtlr.digestConfigObjects(newPLs, newFSs) - if err == nil { - return true - } - klog.Error(err) - return false + return cfgCtlr.digestConfigObjects(newPLs, newFSs, flowSchemaRVs) } // cfgMeal is the data involved in the process of digesting the API @@ -345,7 +383,7 @@ type cfgMeal struct { fsStatusUpdates []fsStatusUpdate } -// A buffered set of status updates for a FlowSchema +// A buffered set of status updates for FlowSchemas type fsStatusUpdate struct { flowSchema *flowcontrol.FlowSchema condition flowcontrol.FlowSchemaCondition @@ -354,25 +392,79 @@ type fsStatusUpdate struct { // digestConfigObjects is given all the API objects that configure // cfgCtlr and writes its consequent new configState. -func (cfgCtlr *configController) digestConfigObjects(newPLs []*flowcontrol.PriorityLevelConfiguration, newFSs []*flowcontrol.FlowSchema) error { +// Only invoke this in the one and only worker goroutine +func (cfgCtlr *configController) digestConfigObjects(newPLs []*flowcontrol.PriorityLevelConfiguration, newFSs []*flowcontrol.FlowSchema, flowSchemaRVs map[string]string) (time.Duration, error) { fsStatusUpdates := cfgCtlr.lockAndDigestConfigObjects(newPLs, newFSs) var errs []error + currResult := updateAttempt{ + timeUpdated: cfgCtlr.clock.Now(), + updatedItems: sets.String{}, + } + var suggestedDelay time.Duration for _, fsu := range fsStatusUpdates { + // if we should skip this name, indicate we will need a delay, but continue with other entries + if cfgCtlr.shouldDelayUpdate(fsu.flowSchema.Name) { + if suggestedDelay == 0 { + suggestedDelay = time.Duration(30+rand.Intn(45)) * time.Second + } + continue + } + + // if we are going to issue an update, be sure we track every name we update so we know if we update it too often. + currResult.updatedItems.Insert(fsu.flowSchema.Name) + enc, err := json.Marshal(fsu.condition) if err != nil { // should never happen because these conditions are created here and well formed panic(fmt.Sprintf("Failed to json.Marshall(%#+v): %s", fsu.condition, err.Error())) } - klog.V(4).Infof("Writing Condition %s to FlowSchema %s because its previous value was %s", string(enc), fsu.flowSchema.Name, fcfmt.Fmt(fsu.oldValue)) - _, err = cfgCtlr.flowcontrolClient.FlowSchemas().Patch(context.TODO(), fsu.flowSchema.Name, apitypes.StrategicMergePatchType, []byte(fmt.Sprintf(`{"status": {"conditions": [ %s ] } }`, string(enc))), metav1.PatchOptions{FieldManager: "api-priority-and-fairness-config-consumer-v1"}, "status") - if err != nil { + klog.V(4).Infof("%s writing Condition %s to FlowSchema %s, which had ResourceVersion=%s, because its previous value was %s", cfgCtlr.name, string(enc), fsu.flowSchema.Name, fsu.flowSchema.ResourceVersion, fcfmt.Fmt(fsu.oldValue)) + fsIfc := cfgCtlr.flowcontrolClient.FlowSchemas() + patchBytes := []byte(fmt.Sprintf(`{"status": {"conditions": [ %s ] } }`, string(enc))) + patchOptions := metav1.PatchOptions{FieldManager: cfgCtlr.asFieldManager} + patchedFlowSchema, err := fsIfc.Patch(context.TODO(), fsu.flowSchema.Name, apitypes.StrategicMergePatchType, patchBytes, patchOptions, "status") + if err == nil { + key, _ := cache.MetaNamespaceKeyFunc(patchedFlowSchema) + flowSchemaRVs[key] = patchedFlowSchema.ResourceVersion + } else if apierrors.IsNotFound(err) { + // This object has been deleted. A notification is coming + // and nothing more needs to be done here. + klog.V(5).Infof("%s at %s: attempted update of concurrently deleted FlowSchema %s; nothing more needs to be done", cfgCtlr.name, cfgCtlr.clock.Now().Format(timeFmt), fsu.flowSchema.Name) + } else { errs = append(errs, errors.Wrap(err, fmt.Sprintf("failed to set a status.condition for FlowSchema %s", fsu.flowSchema.Name))) } } - if len(errs) == 0 { - return nil + cfgCtlr.addUpdateResult(currResult) + + return suggestedDelay, utilerrors.NewAggregate(errs) +} + +// shouldDelayUpdate checks to see if a flowschema has been updated too often and returns true if a delay is needed. +// Only invoke this in the one and only worker goroutine +func (cfgCtlr *configController) shouldDelayUpdate(flowSchemaName string) bool { + numUpdatesInPastMinute := 0 + oneMinuteAgo := cfgCtlr.clock.Now().Add(-1 * time.Minute) + for idx, update := range cfgCtlr.mostRecentUpdates { + if oneMinuteAgo.After(update.timeUpdated) { + // this and the remaining items are no longer relevant + cfgCtlr.mostRecentUpdates = cfgCtlr.mostRecentUpdates[:idx] + return false + } + if update.updatedItems.Has(flowSchemaName) { + numUpdatesInPastMinute++ + if numUpdatesInPastMinute > 5 { + return true + } + } } - return apierrors.NewAggregate(errs) + return false +} + +// addUpdateResult adds the result. It isn't a ring buffer because +// this is small and rate limited. +// Only invoke this in the one and only worker goroutine +func (cfgCtlr *configController) addUpdateResult(result updateAttempt) { + cfgCtlr.mostRecentUpdates = append([]updateAttempt{result}, cfgCtlr.mostRecentUpdates...) } func (cfgCtlr *configController) lockAndDigestConfigObjects(newPLs []*flowcontrol.PriorityLevelConfiguration, newFSs []*flowcontrol.FlowSchema) []fsStatusUpdate { @@ -456,7 +548,7 @@ func (meal *cfgMeal) digestFlowSchemasLocked(newFSs []*flowcontrol.FlowSchema) { // // TODO: consider not even trying if server is not handling // requests yet. - meal.presyncFlowSchemaStatus(fs, !goodPriorityRef, fs.Spec.PriorityLevelConfiguration.Name) + meal.presyncFlowSchemaStatus(fs, meal.cfgCtlr.foundToDangling(goodPriorityRef), fs.Spec.PriorityLevelConfiguration.Name) if !goodPriorityRef { klog.V(6).Infof("Ignoring FlowSchema %s because of bad priority level reference %q", fs.Name, fs.Spec.PriorityLevelConfiguration.Name) @@ -620,12 +712,13 @@ func (meal *cfgMeal) presyncFlowSchemaStatus(fs *flowcontrol.FlowSchema, isDangl if danglingCondition.Status == desiredStatus && danglingCondition.Reason == desiredReason && danglingCondition.Message == desiredMessage { return } + now := meal.cfgCtlr.clock.Now() meal.fsStatusUpdates = append(meal.fsStatusUpdates, fsStatusUpdate{ flowSchema: fs, condition: flowcontrol.FlowSchemaCondition{ Type: flowcontrol.FlowSchemaConditionDangling, Status: desiredStatus, - LastTransitionTime: metav1.Now(), + LastTransitionTime: metav1.NewTime(now), Reason: desiredReason, Message: desiredMessage, }, @@ -651,7 +744,6 @@ func (meal *cfgMeal) imaginePL(proto *flowcontrol.PriorityLevelConfiguration, re if proto.Spec.Limited != nil { meal.shareSum += float64(proto.Spec.Limited.AssuredConcurrencyShares) } - return } type immediateRequest struct{} @@ -670,30 +762,28 @@ func (cfgCtlr *configController) startRequest(ctx context.Context, rd RequestDig klog.V(7).Infof("startRequest(%#+v)", rd) cfgCtlr.lock.Lock() defer cfgCtlr.lock.Unlock() - var selectedFlowSchema *flowcontrol.FlowSchema + var selectedFlowSchema, catchAllFlowSchema *flowcontrol.FlowSchema for _, fs := range cfgCtlr.flowSchemas { if matchesFlowSchema(rd, fs) { selectedFlowSchema = fs break } + if fs.Name == flowcontrol.FlowSchemaNameCatchAll { + catchAllFlowSchema = fs + } } if selectedFlowSchema == nil { // This should never happen. If the requestDigest's User is a part of // system:authenticated or system:unauthenticated, the catch-all flow // schema should match it. However, if that invariant somehow fails, // fallback to the catch-all flow schema anyway. - for _, fs := range cfgCtlr.flowSchemas { - if fs.Name == flowcontrol.FlowSchemaNameCatchAll { - selectedFlowSchema = fs - break - } - } - if selectedFlowSchema == nil { + if catchAllFlowSchema == nil { // This should absolutely never, ever happen! APF guarantees two // undeletable flow schemas at all times: an exempt flow schema and a // catch-all flow schema. panic(fmt.Sprintf("no fallback catch-all flow schema found for request %#+v and user %#+v", rd.RequestInfo, rd.User)) } + selectedFlowSchema = catchAllFlowSchema klog.Warningf("no match found for request %#+v and user %#+v; selecting catchAll=%s as fallback flow schema", rd.RequestInfo, rd.User, fcfmt.Fmt(selectedFlowSchema)) } plName := selectedFlowSchema.Spec.PriorityLevelConfiguration.Name @@ -721,7 +811,9 @@ func (cfgCtlr *configController) startRequest(ctx context.Context, rd RequestDig return selectedFlowSchema, plState.pl, false, req, startWaitingTime } -// Call this after getting a clue that the given priority level is undesired and idle +// maybeReap will remove the last internal traces of the named +// priority level if it has no more use. Call this after getting a +// clue that the given priority level is undesired and idle. func (cfgCtlr *configController) maybeReap(plName string) { cfgCtlr.lock.Lock() defer cfgCtlr.lock.Unlock() @@ -741,8 +833,11 @@ func (cfgCtlr *configController) maybeReap(plName string) { cfgCtlr.configQueue.Add(0) } -// Call this if both (1) plState.queues is non-nil and reported being -// idle, and (2) cfgCtlr's lock has not been released since then. +// maybeReapLocked requires the cfgCtlr's lock to already be held and +// will remove the last internal traces of the named priority level if +// it has no more use. Call this if both (1) plState.queues is +// non-nil and reported being idle, and (2) cfgCtlr's lock has not +// been released since then. func (cfgCtlr *configController) maybeReapLocked(plName string, plState *priorityLevelState) { if !(plState.quiescing && plState.numPending == 0) { return diff --git a/vendor/k8s.io/apiserver/pkg/util/flowcontrol/apf_filter.go b/vendor/k8s.io/apiserver/pkg/util/flowcontrol/apf_filter.go index ffd6c9fa486e..825ae09ce3dc 100644 --- a/vendor/k8s.io/apiserver/pkg/util/flowcontrol/apf_filter.go +++ b/vendor/k8s.io/apiserver/pkg/util/flowcontrol/apf_filter.go @@ -34,6 +34,10 @@ import ( flowcontrolclient "k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta1" ) +// ConfigConsumerAsFieldManager is how the config consuminng +// controller appears in an ObjectMeta ManagedFieldsEntry.Manager +const ConfigConsumerAsFieldManager = "api-priority-and-fairness-config-consumer-v1" + // Interface defines how the API Priority and Fairness filter interacts with the underlying system. type Interface interface { // Handle takes care of queuing and dispatching a request @@ -64,7 +68,7 @@ type Interface interface { Install(c *mux.PathRecorderMux) } -// This request filter implements https://github.com/kubernetes/enhancements/blob/master/keps/sig-api-machinery/20190228-priority-and-fairness.md +// This request filter implements https://github.com/kubernetes/enhancements/blob/master/keps/sig-api-machinery/1040-priority-and-fairness/README.md // New creates a new instance to implement API priority and fairness func New( @@ -74,26 +78,65 @@ func New( requestWaitLimit time.Duration, ) Interface { grc := counter.NoOp{} - return NewTestable( - informerFactory, - flowcontrolClient, - serverConcurrencyLimit, - requestWaitLimit, - metrics.PriorityLevelConcurrencyObserverPairGenerator, - fqs.NewQueueSetFactory(&clock.RealClock{}, grc), - ) + clk := clock.RealClock{} + return NewTestable(TestableConfig{ + Name: "Controller", + Clock: clk, + AsFieldManager: ConfigConsumerAsFieldManager, + FoundToDangling: func(found bool) bool { return !found }, + InformerFactory: informerFactory, + FlowcontrolClient: flowcontrolClient, + ServerConcurrencyLimit: serverConcurrencyLimit, + RequestWaitLimit: requestWaitLimit, + ObsPairGenerator: metrics.PriorityLevelConcurrencyObserverPairGenerator, + QueueSetFactory: fqs.NewQueueSetFactory(clk, grc), + }) +} + +// TestableConfig carries the parameters to an implementation that is testable +type TestableConfig struct { + // Name of the controller + Name string + + // Clock to use in timing deliberate delays + Clock clock.PassiveClock + + // AsFieldManager is the string to use in the metadata for + // server-side apply. Normally this is + // `ConfigConsumerAsFieldManager`. This is exposed as a parameter + // so that a test of competing controllers can supply different + // values. + AsFieldManager string + + // FoundToDangling maps the boolean indicating whether a + // FlowSchema's referenced PLC exists to the boolean indicating + // that FlowSchema's status should indicate a dangling reference. + // This is a parameter so that we can write tests of what happens + // when servers disagree on that bit of Status. + FoundToDangling func(bool) bool + + // InformerFactory to use in building the controller + InformerFactory kubeinformers.SharedInformerFactory + + // FlowcontrolClient to use for manipulating config objects + FlowcontrolClient flowcontrolclient.FlowcontrolV1beta1Interface + + // ServerConcurrencyLimit for the controller to enforce + ServerConcurrencyLimit int + + // RequestWaitLimit configured on the server + RequestWaitLimit time.Duration + + // ObsPairGenerator for metrics + ObsPairGenerator metrics.TimedObserverPairGenerator + + // QueueSetFactory for the queuing implementation + QueueSetFactory fq.QueueSetFactory } // NewTestable is extra flexible to facilitate testing -func NewTestable( - informerFactory kubeinformers.SharedInformerFactory, - flowcontrolClient flowcontrolclient.FlowcontrolV1beta1Interface, - serverConcurrencyLimit int, - requestWaitLimit time.Duration, - obsPairGenerator metrics.TimedObserverPairGenerator, - queueSetFactory fq.QueueSetFactory, -) Interface { - return newTestableController(informerFactory, flowcontrolClient, serverConcurrencyLimit, requestWaitLimit, obsPairGenerator, queueSetFactory) +func NewTestable(config TestableConfig) Interface { + return newTestableController(config) } func (cfgCtlr *configController) Handle(ctx context.Context, requestDigest RequestDigest, @@ -105,7 +148,7 @@ func (cfgCtlr *configController) Handle(ctx context.Context, requestDigest Reque noteFn(fs, pl) if req == nil { if queued { - metrics.ObserveWaitingDuration(pl.Name, fs.Name, strconv.FormatBool(req != nil), time.Since(startWaitingTime)) + metrics.ObserveWaitingDuration(ctx, pl.Name, fs.Name, strconv.FormatBool(req != nil), time.Since(startWaitingTime)) } klog.V(7).Infof("Handle(%#+v) => fsName=%q, distMethod=%#+v, plName=%q, isExempt=%v, reject", requestDigest, fs.Name, fs.Spec.DistinguisherMethod, pl.Name, isExempt) return @@ -122,18 +165,18 @@ func (cfgCtlr *configController) Handle(ctx context.Context, requestDigest Reque }() idle = req.Finish(func() { if queued { - metrics.ObserveWaitingDuration(pl.Name, fs.Name, strconv.FormatBool(req != nil), time.Since(startWaitingTime)) + metrics.ObserveWaitingDuration(ctx, pl.Name, fs.Name, strconv.FormatBool(req != nil), time.Since(startWaitingTime)) } - metrics.AddDispatch(pl.Name, fs.Name) + metrics.AddDispatch(ctx, pl.Name, fs.Name) executed = true startExecutionTime := time.Now() defer func() { - metrics.ObserveExecutionDuration(pl.Name, fs.Name, time.Since(startExecutionTime)) + metrics.ObserveExecutionDuration(ctx, pl.Name, fs.Name, time.Since(startExecutionTime)) }() execFn() }) if queued && !executed { - metrics.ObserveWaitingDuration(pl.Name, fs.Name, strconv.FormatBool(req != nil), time.Since(startWaitingTime)) + metrics.ObserveWaitingDuration(ctx, pl.Name, fs.Name, strconv.FormatBool(req != nil), time.Since(startWaitingTime)) } panicking = false } diff --git a/vendor/k8s.io/apiserver/pkg/util/flowcontrol/counter/BUILD b/vendor/k8s.io/apiserver/pkg/util/flowcontrol/counter/BUILD deleted file mode 100644 index 9d287835b72f..000000000000 --- a/vendor/k8s.io/apiserver/pkg/util/flowcontrol/counter/BUILD +++ /dev/null @@ -1,26 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "interface.go", - "noop.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/util/flowcontrol/counter", - importpath = "k8s.io/apiserver/pkg/util/flowcontrol/counter", - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiserver/pkg/util/flowcontrol/debug/BUILD b/vendor/k8s.io/apiserver/pkg/util/flowcontrol/debug/BUILD deleted file mode 100644 index 2d7ebcd405ea..000000000000 --- a/vendor/k8s.io/apiserver/pkg/util/flowcontrol/debug/BUILD +++ /dev/null @@ -1,24 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["dump.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/util/flowcontrol/debug", - importpath = "k8s.io/apiserver/pkg/util/flowcontrol/debug", - visibility = ["//visibility:public"], - deps = ["//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing/BUILD b/vendor/k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing/BUILD deleted file mode 100644 index c8403a7ade3c..000000000000 --- a/vendor/k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "integrator.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing", - importpath = "k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/flowcontrol/debug:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/flowcontrol/metrics:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing/promise:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing/queueset:all-srcs", - "//staging/src/k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing/testing:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["integrator_test.go"], - embed = [":go_default_library"], - deps = ["//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library"], -) diff --git a/vendor/k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing/interface.go b/vendor/k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing/interface.go index 882a505c81f6..a91656c56292 100644 --- a/vendor/k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing/interface.go +++ b/vendor/k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing/interface.go @@ -46,7 +46,7 @@ type QueueSetCompleter interface { // functionality of one non-exempt priority level. It covers the // functionality described in the "Assignment to a Queue", "Queuing", // and "Dispatching" sections of -// https://github.com/kubernetes/enhancements/blob/master/keps/sig-api-machinery/20190228-priority-and-fairness.md +// https://github.com/kubernetes/enhancements/blob/master/keps/sig-api-machinery/1040-priority-and-fairness/README.md // . Some day we may have connections between priority levels, but // today is not that day. type QueueSet interface { diff --git a/vendor/k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing/promise/BUILD b/vendor/k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing/promise/BUILD deleted file mode 100644 index df09dcc4d9c7..000000000000 --- a/vendor/k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing/promise/BUILD +++ /dev/null @@ -1,26 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["interface.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing/promise", - importpath = "k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing/promise", - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing/promise/lockingpromise:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing/promise/lockingpromise/BUILD b/vendor/k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing/promise/lockingpromise/BUILD deleted file mode 100644 index 3ea0f8e2ed6b..000000000000 --- a/vendor/k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing/promise/lockingpromise/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["lockingpromise.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing/promise/lockingpromise", - importpath = "k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing/promise/lockingpromise", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apiserver/pkg/util/flowcontrol/counter:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing/promise:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["lockingpromise_test.go"], - embed = [":go_default_library"], - deps = ["//staging/src/k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing/testing/clock:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing/queueset/BUILD b/vendor/k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing/queueset/BUILD deleted file mode 100644 index fc4d0e44d39e..000000000000 --- a/vendor/k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing/queueset/BUILD +++ /dev/null @@ -1,56 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "queueset.go", - "types.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing/queueset", - importpath = "k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing/queueset", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/flowcontrol/counter:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/flowcontrol/debug:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing/promise:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing/promise/lockingpromise:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/flowcontrol/metrics:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/shufflesharding:go_default_library", - "//vendor/github.com/pkg/errors:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["queueset_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/flowcontrol/counter:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing/testing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing/testing/clock:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/flowcontrol/metrics:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing/queueset/queueset.go b/vendor/k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing/queueset/queueset.go index 1d540a28f912..8229ccbbb4b3 100644 --- a/vendor/k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing/queueset/queueset.go +++ b/vendor/k8s.io/apiserver/pkg/util/flowcontrol/fairqueuing/queueset/queueset.go @@ -243,7 +243,7 @@ func (qs *queueSet) StartRequest(ctx context.Context, hashValue uint64, flowDist if qs.qCfg.DesiredNumQueues < 1 { if qs.totRequestsExecuting >= qs.dCfg.ConcurrencyLimit { klog.V(5).Infof("QS(%s): rejecting request %q %#+v %#+v because %d are executing and the limit is %d", qs.qCfg.Name, fsName, descr1, descr2, qs.totRequestsExecuting, qs.dCfg.ConcurrencyLimit) - metrics.AddReject(qs.qCfg.Name, fsName, "concurrency-limit") + metrics.AddReject(ctx, qs.qCfg.Name, fsName, "concurrency-limit") return nil, qs.isIdleLocked() } req = qs.dispatchSansQueueLocked(ctx, flowDistinguisher, fsName, descr1, descr2) @@ -262,7 +262,7 @@ func (qs *queueSet) StartRequest(ctx context.Context, hashValue uint64, flowDist // concurrency shares and at max queue length already if req == nil { klog.V(5).Infof("QS(%s): rejecting request %q %#+v %#+v due to queue full", qs.qCfg.Name, fsName, descr1, descr2) - metrics.AddReject(qs.qCfg.Name, fsName, "queue-full") + metrics.AddReject(ctx, qs.qCfg.Name, fsName, "queue-full") return nil, qs.isIdleLocked() } @@ -285,6 +285,11 @@ func (qs *queueSet) StartRequest(ctx context.Context, hashValue uint64, flowDist // request's context's Done channel gets closed by the time // the request is done being processed. doneCh := ctx.Done() + + // Retrieve the queueset configuration name while we have the lock + // and use it in the goroutine below. + configName := qs.qCfg.Name + if doneCh != nil { qs.preCreateOrUnblockGoroutine() go func() { @@ -297,7 +302,7 @@ func (qs *queueSet) StartRequest(ctx context.Context, hashValue uint64, flowDist // known that the count does not need to be accurate. // BTW, the count only needs to be accurate in a test that // uses FakeEventClock::Run(). - klog.V(6).Infof("QS(%s): Context of request %q %#+v %#+v is Done", qs.qCfg.Name, fsName, descr1, descr2) + klog.V(6).Infof("QS(%s): Context of request %q %#+v %#+v is Done", configName, fsName, descr1, descr2) qs.cancelWait(req) qs.goroutineDoneOrBlocked() }() @@ -351,7 +356,7 @@ func (req *request) wait() (bool, bool) { switch decision { case decisionReject: klog.V(5).Infof("QS(%s): request %#+v %#+v timed out after being enqueued\n", qs.qCfg.Name, req.descr1, req.descr2) - metrics.AddReject(qs.qCfg.Name, req.fsName, "time-out") + metrics.AddReject(req.ctx, qs.qCfg.Name, req.fsName, "time-out") return false, qs.isIdleLocked() case decisionCancel: // TODO(aaron-prindle) add metrics for this case @@ -448,7 +453,7 @@ func (qs *queueSet) timeoutOldRequestsAndRejectOrEnqueueLocked(ctx context.Conte if ok := qs.rejectOrEnqueueLocked(req); !ok { return nil } - metrics.ObserveQueueLength(qs.qCfg.Name, fsName, len(queue.requests)) + metrics.ObserveQueueLength(ctx, qs.qCfg.Name, fsName, len(queue.requests)) return req } @@ -486,7 +491,7 @@ func (qs *queueSet) removeTimedOutRequestsFromQueueLocked(queue *queue, fsName s req.decision.SetLocked(decisionReject) // get index for timed out requests timeoutIdx = i - metrics.AddRequestsInQueues(qs.qCfg.Name, req.fsName, -1) + metrics.AddRequestsInQueues(req.ctx, qs.qCfg.Name, req.fsName, -1) req.NoteQueued(false) } else { break @@ -534,7 +539,7 @@ func (qs *queueSet) enqueueLocked(request *request) { } queue.Enqueue(request) qs.totRequestsWaiting++ - metrics.AddRequestsInQueues(qs.qCfg.Name, request.fsName, 1) + metrics.AddRequestsInQueues(request.ctx, qs.qCfg.Name, request.fsName, 1) request.NoteQueued(true) qs.obsPair.RequestsWaiting.Add(1) } @@ -569,7 +574,7 @@ func (qs *queueSet) dispatchSansQueueLocked(ctx context.Context, flowDistinguish } req.decision.SetLocked(decisionExecute) qs.totRequestsExecuting++ - metrics.AddRequestsExecuting(qs.qCfg.Name, fsName, 1) + metrics.AddRequestsExecuting(ctx, qs.qCfg.Name, fsName, 1) qs.obsPair.RequestsExecuting.Add(1) if klog.V(5).Enabled() { klog.Infof("QS(%s) at r=%s v=%.9fs: immediate dispatch of request %q %#+v %#+v, qs will have %d executing", qs.qCfg.Name, now.Format(nsTimeFmt), qs.virtualTime, fsName, descr1, descr2, qs.totRequestsExecuting) @@ -599,9 +604,9 @@ func (qs *queueSet) dispatchLocked() bool { qs.totRequestsWaiting-- qs.totRequestsExecuting++ queue.requestsExecuting++ - metrics.AddRequestsInQueues(qs.qCfg.Name, request.fsName, -1) + metrics.AddRequestsInQueues(request.ctx, qs.qCfg.Name, request.fsName, -1) request.NoteQueued(false) - metrics.AddRequestsExecuting(qs.qCfg.Name, request.fsName, 1) + metrics.AddRequestsExecuting(request.ctx, qs.qCfg.Name, request.fsName, 1) qs.obsPair.RequestsWaiting.Add(-1) qs.obsPair.RequestsExecuting.Add(1) if klog.V(6).Enabled() { @@ -631,13 +636,12 @@ func (qs *queueSet) cancelWait(req *request) { // remove the request queue.requests = append(queue.requests[:i], queue.requests[i+1:]...) qs.totRequestsWaiting-- - metrics.AddRequestsInQueues(qs.qCfg.Name, req.fsName, -1) + metrics.AddRequestsInQueues(req.ctx, qs.qCfg.Name, req.fsName, -1) req.NoteQueued(false) qs.obsPair.RequestsWaiting.Add(-1) break } } - return } // selectQueueLocked examines the queues in round robin order and @@ -705,7 +709,7 @@ func (qs *queueSet) finishRequestAndDispatchAsMuchAsPossible(req *request) bool func (qs *queueSet) finishRequestLocked(r *request) { now := qs.clock.Now() qs.totRequestsExecuting-- - metrics.AddRequestsExecuting(qs.qCfg.Name, r.fsName, -1) + metrics.AddRequestsExecuting(r.ctx, qs.qCfg.Name, r.fsName, -1) qs.obsPair.RequestsExecuting.Add(-1) if r.queue == nil { diff --git a/vendor/k8s.io/apiserver/pkg/util/flowcontrol/format/BUILD b/vendor/k8s.io/apiserver/pkg/util/flowcontrol/format/BUILD deleted file mode 100644 index c5460fe8d9b1..000000000000 --- a/vendor/k8s.io/apiserver/pkg/util/flowcontrol/format/BUILD +++ /dev/null @@ -1,28 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["formatting.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/util/flowcontrol/format", - importpath = "k8s.io/apiserver/pkg/util/flowcontrol/format", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/flowcontrol/v1beta1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiserver/pkg/util/flowcontrol/format/formatting.go b/vendor/k8s.io/apiserver/pkg/util/flowcontrol/format/formatting.go index 61ae65df96d6..d2c917e0ba57 100644 --- a/vendor/k8s.io/apiserver/pkg/util/flowcontrol/format/formatting.go +++ b/vendor/k8s.io/apiserver/pkg/util/flowcontrol/format/formatting.go @@ -195,7 +195,7 @@ func BufferFmtPolicyRulesWithSubjectsSlim(buf *bytes.Buffer, rule flowcontrol.Po buf.WriteString(fmt.Sprintf(", Group: &%#+v", *subj.Group)) } if subj.ServiceAccount != nil { - buf.WriteString(fmt.Sprintf(", ServiceAcount: &%#+v", *subj.ServiceAccount)) + buf.WriteString(fmt.Sprintf(", ServiceAccount: &%#+v", *subj.ServiceAccount)) } buf.WriteString("}") } diff --git a/vendor/k8s.io/apiserver/pkg/util/flowcontrol/metrics/BUILD b/vendor/k8s.io/apiserver/pkg/util/flowcontrol/metrics/BUILD deleted file mode 100644 index cf4d2f2427b1..000000000000 --- a/vendor/k8s.io/apiserver/pkg/util/flowcontrol/metrics/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "metrics.go", - "sample_and_watermark.go", - "timed_observer.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/util/flowcontrol/metrics", - importpath = "k8s.io/apiserver/pkg/util/flowcontrol/metrics", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - "//staging/src/k8s.io/component-base/metrics/testutil:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiserver/pkg/util/flowcontrol/metrics/metrics.go b/vendor/k8s.io/apiserver/pkg/util/flowcontrol/metrics/metrics.go index bdbaa94601f8..4ebe85577ba3 100644 --- a/vendor/k8s.io/apiserver/pkg/util/flowcontrol/metrics/metrics.go +++ b/vendor/k8s.io/apiserver/pkg/util/flowcontrol/metrics/metrics.go @@ -17,6 +17,7 @@ limitations under the License. package metrics import ( + "context" "strings" "sync" "time" @@ -221,12 +222,12 @@ var ( ) // AddRequestsInQueues adds the given delta to the gauge of the # of requests in the queues of the specified flowSchema and priorityLevel -func AddRequestsInQueues(priorityLevel, flowSchema string, delta int) { +func AddRequestsInQueues(ctx context.Context, priorityLevel, flowSchema string, delta int) { apiserverCurrentInqueueRequests.WithLabelValues(priorityLevel, flowSchema).Add(float64(delta)) } // AddRequestsExecuting adds the given delta to the gauge of executing requests of the given flowSchema and priorityLevel -func AddRequestsExecuting(priorityLevel, flowSchema string, delta int) { +func AddRequestsExecuting(ctx context.Context, priorityLevel, flowSchema string, delta int) { apiserverCurrentExecutingRequests.WithLabelValues(priorityLevel, flowSchema).Add(float64(delta)) } @@ -236,26 +237,26 @@ func UpdateSharedConcurrencyLimit(priorityLevel string, limit int) { } // AddReject increments the # of rejected requests for flow control -func AddReject(priorityLevel, flowSchema, reason string) { - apiserverRejectedRequestsTotal.WithLabelValues(priorityLevel, flowSchema, reason).Add(1) +func AddReject(ctx context.Context, priorityLevel, flowSchema, reason string) { + apiserverRejectedRequestsTotal.WithContext(ctx).WithLabelValues(priorityLevel, flowSchema, reason).Add(1) } // AddDispatch increments the # of dispatched requests for flow control -func AddDispatch(priorityLevel, flowSchema string) { - apiserverDispatchedRequestsTotal.WithLabelValues(priorityLevel, flowSchema).Add(1) +func AddDispatch(ctx context.Context, priorityLevel, flowSchema string) { + apiserverDispatchedRequestsTotal.WithContext(ctx).WithLabelValues(priorityLevel, flowSchema).Add(1) } // ObserveQueueLength observes the queue length for flow control -func ObserveQueueLength(priorityLevel, flowSchema string, length int) { - apiserverRequestQueueLength.WithLabelValues(priorityLevel, flowSchema).Observe(float64(length)) +func ObserveQueueLength(ctx context.Context, priorityLevel, flowSchema string, length int) { + apiserverRequestQueueLength.WithContext(ctx).WithLabelValues(priorityLevel, flowSchema).Observe(float64(length)) } // ObserveWaitingDuration observes the queue length for flow control -func ObserveWaitingDuration(priorityLevel, flowSchema, execute string, waitTime time.Duration) { - apiserverRequestWaitingSeconds.WithLabelValues(priorityLevel, flowSchema, execute).Observe(waitTime.Seconds()) +func ObserveWaitingDuration(ctx context.Context, priorityLevel, flowSchema, execute string, waitTime time.Duration) { + apiserverRequestWaitingSeconds.WithContext(ctx).WithLabelValues(priorityLevel, flowSchema, execute).Observe(waitTime.Seconds()) } // ObserveExecutionDuration observes the execution duration for flow control -func ObserveExecutionDuration(priorityLevel, flowSchema string, executionTime time.Duration) { - apiserverRequestExecutionSeconds.WithLabelValues(priorityLevel, flowSchema).Observe(executionTime.Seconds()) +func ObserveExecutionDuration(ctx context.Context, priorityLevel, flowSchema string, executionTime time.Duration) { + apiserverRequestExecutionSeconds.WithContext(ctx).WithLabelValues(priorityLevel, flowSchema).Observe(executionTime.Seconds()) } diff --git a/vendor/k8s.io/apiserver/pkg/util/flushwriter/BUILD b/vendor/k8s.io/apiserver/pkg/util/flushwriter/BUILD deleted file mode 100644 index 28090f0a3407..000000000000 --- a/vendor/k8s.io/apiserver/pkg/util/flushwriter/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["writer_test.go"], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "writer.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/util/flushwriter", - importpath = "k8s.io/apiserver/pkg/util/flushwriter", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/util/openapi/BUILD b/vendor/k8s.io/apiserver/pkg/util/openapi/BUILD deleted file mode 100644 index 0184fcbeebb8..000000000000 --- a/vendor/k8s.io/apiserver/pkg/util/openapi/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["proto.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/util/openapi", - importpath = "k8s.io/apiserver/pkg/util/openapi", - visibility = ["//visibility:public"], - deps = [ - "//vendor/github.com/go-openapi/spec:go_default_library", - "//vendor/github.com/googleapis/gnostic/compiler:go_default_library", - "//vendor/github.com/googleapis/gnostic/openapiv2:go_default_library", - "//vendor/gopkg.in/yaml.v2:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/util/proto:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["proto_test.go"], - embed = [":go_default_library"], - deps = [ - "//vendor/github.com/go-openapi/spec:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/util/proto:go_default_library", - ], -) diff --git a/vendor/k8s.io/apiserver/pkg/util/proxy/BUILD b/vendor/k8s.io/apiserver/pkg/util/proxy/BUILD deleted file mode 100644 index 796636062715..000000000000 --- a/vendor/k8s.io/apiserver/pkg/util/proxy/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["proxy_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["proxy.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/util/proxy", - importpath = "k8s.io/apiserver/pkg/util/proxy", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/util/shufflesharding/BUILD b/vendor/k8s.io/apiserver/pkg/util/shufflesharding/BUILD deleted file mode 100644 index 8508afe3ddbf..000000000000 --- a/vendor/k8s.io/apiserver/pkg/util/shufflesharding/BUILD +++ /dev/null @@ -1,29 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["shufflesharding.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/util/shufflesharding", - importpath = "k8s.io/apiserver/pkg/util/shufflesharding", - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["shufflesharding_test.go"], - embed = [":go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiserver/pkg/util/webhook/BUILD b/vendor/k8s.io/apiserver/pkg/util/webhook/BUILD deleted file mode 100644 index 4cdaee3bc873..000000000000 --- a/vendor/k8s.io/apiserver/pkg/util/webhook/BUILD +++ /dev/null @@ -1,74 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "authentication.go", - "client.go", - "error.go", - "serviceresolver.go", - "validation.go", - "webhook.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/util/webhook", - importpath = "k8s.io/apiserver/pkg/util/webhook", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/egressselector:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/tools/clientcmd:go_default_library", - "//staging/src/k8s.io/client-go/tools/clientcmd/api:go_default_library", - "//vendor/github.com/hashicorp/golang-lru:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "authentication_test.go", - "certs_test.go", - "serviceresolver_test.go", - "webhook_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/tools/clientcmd/api:go_default_library", - "//staging/src/k8s.io/client-go/tools/clientcmd/api/v1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/util/wsstream/BUILD b/vendor/k8s.io/apiserver/pkg/util/wsstream/BUILD deleted file mode 100644 index c1ec1311896d..000000000000 --- a/vendor/k8s.io/apiserver/pkg/util/wsstream/BUILD +++ /dev/null @@ -1,46 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "conn_test.go", - "stream_test.go", - ], - embed = [":go_default_library"], - deps = ["//vendor/golang.org/x/net/websocket:go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = [ - "conn.go", - "doc.go", - "stream.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/util/wsstream", - importpath = "k8s.io/apiserver/pkg/util/wsstream", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//vendor/golang.org/x/net/websocket:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/warning/BUILD b/vendor/k8s.io/apiserver/pkg/warning/BUILD deleted file mode 100644 index 2860666b9728..000000000000 --- a/vendor/k8s.io/apiserver/pkg/warning/BUILD +++ /dev/null @@ -1,23 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["context.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/warning", - importpath = "k8s.io/apiserver/pkg/warning", - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiserver/plugin/pkg/audit/buffered/BUILD b/vendor/k8s.io/apiserver/plugin/pkg/audit/buffered/BUILD deleted file mode 100644 index 2ed9b4f6199c..000000000000 --- a/vendor/k8s.io/apiserver/plugin/pkg/audit/buffered/BUILD +++ /dev/null @@ -1,46 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "buffered.go", - "doc.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/plugin/pkg/audit/buffered", - importpath = "k8s.io/apiserver/plugin/pkg/audit/buffered", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/audit:go_default_library", - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["buffered_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit:go_default_library", - "//staging/src/k8s.io/apiserver/plugin/pkg/audit/fake:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiserver/plugin/pkg/audit/log/BUILD b/vendor/k8s.io/apiserver/plugin/pkg/audit/log/BUILD deleted file mode 100644 index 41e4ce6d8178..000000000000 --- a/vendor/k8s.io/apiserver/plugin/pkg/audit/log/BUILD +++ /dev/null @@ -1,52 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["backend.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/plugin/pkg/audit/log", - importpath = "k8s.io/apiserver/plugin/pkg/audit/log", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/audit:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["backend_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/authentication/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit/install:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit/v1beta1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/audit:go_default_library", - "//vendor/github.com/google/uuid:go_default_library", - ], -) diff --git a/vendor/k8s.io/apiserver/plugin/pkg/audit/truncate/BUILD b/vendor/k8s.io/apiserver/plugin/pkg/audit/truncate/BUILD deleted file mode 100644 index 93d6730d49f4..000000000000 --- a/vendor/k8s.io/apiserver/plugin/pkg/audit/truncate/BUILD +++ /dev/null @@ -1,47 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "truncate.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/plugin/pkg/audit/truncate", - importpath = "k8s.io/apiserver/plugin/pkg/audit/truncate", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/audit:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["truncate_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit/v1:go_default_library", - "//staging/src/k8s.io/apiserver/plugin/pkg/audit/fake:go_default_library", - "//staging/src/k8s.io/apiserver/plugin/pkg/audit/webhook:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiserver/plugin/pkg/audit/webhook/BUILD b/vendor/k8s.io/apiserver/plugin/pkg/audit/webhook/BUILD deleted file mode 100644 index 9d6a2b88cb94..000000000000 --- a/vendor/k8s.io/apiserver/plugin/pkg/audit/webhook/BUILD +++ /dev/null @@ -1,57 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["webhook_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/json:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit/v1beta1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/audit:go_default_library", - "//staging/src/k8s.io/client-go/tools/clientcmd/api/v1:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["webhook.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/plugin/pkg/audit/webhook", - importpath = "k8s.io/apiserver/plugin/pkg/audit/webhook", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit/install:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/audit:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/webhook:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/utils/trace:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/plugin/pkg/authenticator/token/oidc/BUILD b/vendor/k8s.io/apiserver/plugin/pkg/authenticator/token/oidc/BUILD deleted file mode 100644 index 44b5fc87c4c8..000000000000 --- a/vendor/k8s.io/apiserver/plugin/pkg/authenticator/token/oidc/BUILD +++ /dev/null @@ -1,50 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - size = "small", - srcs = ["oidc_test.go"], - data = glob(["testdata/**"]), - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//vendor/github.com/coreos/go-oidc:go_default_library", - "//vendor/gopkg.in/square/go-jose.v2:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["oidc.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/plugin/pkg/authenticator/token/oidc", - importpath = "k8s.io/apiserver/plugin/pkg/authenticator/token/oidc", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/client-go/util/cert:go_default_library", - "//vendor/github.com/coreos/go-oidc:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/plugin/pkg/authenticator/token/oidc/oidc.go b/vendor/k8s.io/apiserver/plugin/pkg/authenticator/token/oidc/oidc.go index 2c4563aae219..8840b65f7339 100644 --- a/vendor/k8s.io/apiserver/plugin/pkg/authenticator/token/oidc/oidc.go +++ b/vendor/k8s.io/apiserver/plugin/pkg/authenticator/token/oidc/oidc.go @@ -218,7 +218,7 @@ func New(opts Options) (*Authenticator, error) { return newAuthenticator(opts, func(ctx context.Context, a *Authenticator, config *oidc.Config) { // Asynchronously attempt to initialize the authenticator. This enables // self-hosted providers, providers that run on top of Kubernetes itself. - go wait.PollUntil(time.Second*10, func() (done bool, err error) { + go wait.PollImmediateUntil(time.Second*10, func() (done bool, err error) { provider, err := oidc.NewProvider(ctx, a.issuerURL) if err != nil { klog.Errorf("oidc authenticator: initializing plugin: %v", err) diff --git a/vendor/k8s.io/apiserver/plugin/pkg/authenticator/token/webhook/BUILD b/vendor/k8s.io/apiserver/plugin/pkg/authenticator/token/webhook/BUILD deleted file mode 100644 index 823ce969a80f..000000000000 --- a/vendor/k8s.io/apiserver/plugin/pkg/authenticator/token/webhook/BUILD +++ /dev/null @@ -1,65 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "certs_test.go", - "round_trip_test.go", - "webhook_v1_test.go", - "webhook_v1beta1_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/authentication/v1:go_default_library", - "//staging/src/k8s.io/api/authentication/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/token/cache:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/client-go/tools/clientcmd/api/v1:go_default_library", - "//vendor/github.com/google/gofuzz:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["webhook.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/plugin/pkg/authenticator/token/webhook", - importpath = "k8s.io/apiserver/plugin/pkg/authenticator/token/webhook", - deps = [ - "//staging/src/k8s.io/api/authentication/v1:go_default_library", - "//staging/src/k8s.io/api/authentication/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/webhook:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/authentication/v1:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/plugin/pkg/authenticator/token/webhook/webhook.go b/vendor/k8s.io/apiserver/plugin/pkg/authenticator/token/webhook/webhook.go index 5bedf4e5985f..41dd7a69e9b9 100644 --- a/vendor/k8s.io/apiserver/plugin/pkg/authenticator/token/webhook/webhook.go +++ b/vendor/k8s.io/apiserver/plugin/pkg/authenticator/token/webhook/webhook.go @@ -52,17 +52,18 @@ type tokenReviewer interface { } type WebhookTokenAuthenticator struct { - tokenReview tokenReviewer - retryBackoff wait.Backoff - implicitAuds authenticator.Audiences + tokenReview tokenReviewer + retryBackoff wait.Backoff + implicitAuds authenticator.Audiences + requestTimeout time.Duration } // NewFromInterface creates a webhook authenticator using the given tokenReview // client. It is recommend to wrap this authenticator with the token cache // authenticator implemented in // k8s.io/apiserver/pkg/authentication/token/cache. -func NewFromInterface(tokenReview authenticationv1client.TokenReviewInterface, implicitAuds authenticator.Audiences, retryBackoff wait.Backoff) (*WebhookTokenAuthenticator, error) { - return newWithBackoff(tokenReview, retryBackoff, implicitAuds) +func NewFromInterface(tokenReview authenticationv1client.TokenReviewInterface, implicitAuds authenticator.Audiences, retryBackoff wait.Backoff, requestTimeout time.Duration) (*WebhookTokenAuthenticator, error) { + return newWithBackoff(tokenReview, retryBackoff, implicitAuds, requestTimeout) } // New creates a new WebhookTokenAuthenticator from the provided kubeconfig @@ -74,12 +75,12 @@ func New(kubeConfigFile string, version string, implicitAuds authenticator.Audie if err != nil { return nil, err } - return newWithBackoff(tokenReview, retryBackoff, implicitAuds) + return newWithBackoff(tokenReview, retryBackoff, implicitAuds, time.Duration(0)) } // newWithBackoff allows tests to skip the sleep. -func newWithBackoff(tokenReview tokenReviewer, retryBackoff wait.Backoff, implicitAuds authenticator.Audiences) (*WebhookTokenAuthenticator, error) { - return &WebhookTokenAuthenticator{tokenReview, retryBackoff, implicitAuds}, nil +func newWithBackoff(tokenReview tokenReviewer, retryBackoff wait.Backoff, implicitAuds authenticator.Audiences, requestTimeout time.Duration) (*WebhookTokenAuthenticator, error) { + return &WebhookTokenAuthenticator{tokenReview, retryBackoff, implicitAuds, requestTimeout}, nil } // AuthenticateToken implements the authenticator.Token interface. @@ -105,7 +106,17 @@ func (w *WebhookTokenAuthenticator) AuthenticateToken(ctx context.Context, token var ( result *authenticationv1.TokenReview auds authenticator.Audiences + cancel context.CancelFunc ) + + // set a hard timeout if it was defined + // if the child has a shorter deadline then it will expire first, + // otherwise if the parent has a shorter deadline then the parent will expire and it will be propagate to the child + if w.requestTimeout > 0 { + ctx, cancel = context.WithTimeout(ctx, w.requestTimeout) + defer cancel() + } + // WithExponentialBackoff will return tokenreview create error (tokenReviewErr) if any. if err := webhook.WithExponentialBackoff(ctx, w.retryBackoff, func() error { var tokenReviewErr error diff --git a/vendor/k8s.io/apiserver/plugin/pkg/authorizer/webhook/BUILD b/vendor/k8s.io/apiserver/plugin/pkg/authorizer/webhook/BUILD deleted file mode 100644 index a45057f4d3ef..000000000000 --- a/vendor/k8s.io/apiserver/plugin/pkg/authorizer/webhook/BUILD +++ /dev/null @@ -1,65 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "certs_test.go", - "round_trip_test.go", - "webhook_v1_test.go", - "webhook_v1beta1_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/authorization/v1:go_default_library", - "//staging/src/k8s.io/api/authorization/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//staging/src/k8s.io/client-go/tools/clientcmd/api/v1:go_default_library", - "//vendor/github.com/google/gofuzz:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["webhook.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/plugin/pkg/authorizer/webhook", - importpath = "k8s.io/apiserver/plugin/pkg/authorizer/webhook", - deps = [ - "//staging/src/k8s.io/api/authorization/v1:go_default_library", - "//staging/src/k8s.io/api/authorization/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/cache:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/webhook:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/authorization/v1:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/cli-runtime/pkg/genericclioptions/BUILD b/vendor/k8s.io/cli-runtime/pkg/genericclioptions/BUILD deleted file mode 100644 index c1606ff9aace..000000000000 --- a/vendor/k8s.io/cli-runtime/pkg/genericclioptions/BUILD +++ /dev/null @@ -1,75 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "builder_flags.go", - "builder_flags_fake.go", - "client_config.go", - "config_flags.go", - "config_flags_fake.go", - "doc.go", - "filename_flags.go", - "io_options.go", - "json_yaml_flags.go", - "jsonpath_flags.go", - "kube_template_flags.go", - "name_flags.go", - "print_flags.go", - "record_flags.go", - "template_flags.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/cli-runtime/pkg/genericclioptions", - importpath = "k8s.io/cli-runtime/pkg/genericclioptions", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/json:go_default_library", - "//staging/src/k8s.io/cli-runtime/pkg/printers:go_default_library", - "//staging/src/k8s.io/cli-runtime/pkg/resource:go_default_library", - "//staging/src/k8s.io/client-go/discovery:go_default_library", - "//staging/src/k8s.io/client-go/discovery/cached/disk:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/restmapper:go_default_library", - "//staging/src/k8s.io/client-go/tools/clientcmd:go_default_library", - "//staging/src/k8s.io/client-go/tools/clientcmd/api:go_default_library", - "//staging/src/k8s.io/client-go/util/homedir:go_default_library", - "//vendor/github.com/evanphx/json-patch:go_default_library", - "//vendor/github.com/spf13/cobra:go_default_library", - "//vendor/github.com/spf13/pflag:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = [ - "json_yaml_flags_test.go", - "jsonpath_flags_test.go", - "name_flags_test.go", - "print_flags_test.go", - "template_flags_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - ], -) diff --git a/vendor/k8s.io/cli-runtime/pkg/genericclioptions/builder_flags.go b/vendor/k8s.io/cli-runtime/pkg/genericclioptions/builder_flags.go index f695fb5f9bd9..acf576a366e7 100644 --- a/vendor/k8s.io/cli-runtime/pkg/genericclioptions/builder_flags.go +++ b/vendor/k8s.io/cli-runtime/pkg/genericclioptions/builder_flags.go @@ -52,6 +52,9 @@ func NewResourceBuilderFlags() *ResourceBuilderFlags { } } +// WithFile sets the FileNameFlags. +// If recurse is set, it will process directory recursively. Useful when you want to manage related manifests +// organized within the same directory. func (o *ResourceBuilderFlags) WithFile(recurse bool, files ...string) *ResourceBuilderFlags { o.FileNameFlags = &FileNameFlags{ Usage: "identifying the resource.", @@ -62,41 +65,49 @@ func (o *ResourceBuilderFlags) WithFile(recurse bool, files ...string) *Resource return o } +// WithLabelSelector sets the LabelSelector flag func (o *ResourceBuilderFlags) WithLabelSelector(selector string) *ResourceBuilderFlags { o.LabelSelector = &selector return o } +// WithFieldSelector sets the FieldSelector flag func (o *ResourceBuilderFlags) WithFieldSelector(selector string) *ResourceBuilderFlags { o.FieldSelector = &selector return o } +// WithAllNamespaces sets the AllNamespaces flag func (o *ResourceBuilderFlags) WithAllNamespaces(defaultVal bool) *ResourceBuilderFlags { o.AllNamespaces = &defaultVal return o } +// WithAll sets the All flag func (o *ResourceBuilderFlags) WithAll(defaultVal bool) *ResourceBuilderFlags { o.All = &defaultVal return o } +// WithLocal sets the Local flag func (o *ResourceBuilderFlags) WithLocal(defaultVal bool) *ResourceBuilderFlags { o.Local = &defaultVal return o } +// WithScheme sets the Scheme flag func (o *ResourceBuilderFlags) WithScheme(scheme *runtime.Scheme) *ResourceBuilderFlags { o.Scheme = scheme return o } +// WithLatest sets the Latest flag func (o *ResourceBuilderFlags) WithLatest() *ResourceBuilderFlags { o.Latest = true return o } +// StopOnError sets the StopOnFirstError flag func (o *ResourceBuilderFlags) StopOnError() *ResourceBuilderFlags { o.StopOnFirstError = true return o diff --git a/vendor/k8s.io/cli-runtime/pkg/genericclioptions/builder_flags_fake.go b/vendor/k8s.io/cli-runtime/pkg/genericclioptions/builder_flags_fake.go index 310382919f4c..d43b0c25e0d8 100644 --- a/vendor/k8s.io/cli-runtime/pkg/genericclioptions/builder_flags_fake.go +++ b/vendor/k8s.io/cli-runtime/pkg/genericclioptions/builder_flags_fake.go @@ -20,7 +20,7 @@ import ( "k8s.io/cli-runtime/pkg/resource" ) -// NewSimpleResourceFinder builds a super simple ResourceFinder that just iterates over the objects you provided +// NewSimpleFakeResourceFinder builds a super simple ResourceFinder that just iterates over the objects you provided func NewSimpleFakeResourceFinder(infos ...*resource.Info) ResourceFinder { return &fakeResourceFinder{ Infos: infos, diff --git a/vendor/k8s.io/cli-runtime/pkg/genericclioptions/client_config.go b/vendor/k8s.io/cli-runtime/pkg/genericclioptions/client_config.go index f25af27df2d4..0e22d71407d9 100644 --- a/vendor/k8s.io/cli-runtime/pkg/genericclioptions/client_config.go +++ b/vendor/k8s.io/cli-runtime/pkg/genericclioptions/client_config.go @@ -23,6 +23,7 @@ import ( ) var ( + // ErrEmptyConfig is the error message to be displayed if the configuration info is missing or incomplete ErrEmptyConfig = clientcmd.NewEmptyConfigError(`Missing or incomplete configuration info. Please point to an existing, complete config file: diff --git a/vendor/k8s.io/cli-runtime/pkg/genericclioptions/command_headers.go b/vendor/k8s.io/cli-runtime/pkg/genericclioptions/command_headers.go new file mode 100644 index 000000000000..8f9e774752a7 --- /dev/null +++ b/vendor/k8s.io/cli-runtime/pkg/genericclioptions/command_headers.go @@ -0,0 +1,79 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package genericclioptions + +import ( + "net/http" + "strings" + + "github.com/google/uuid" + "github.com/spf13/cobra" +) + +const ( + kubectlCommandHeader = "X-Kubectl-Command" + kubectlSessionHeader = "X-Kubectl-Session" +) + +// CommandHeaderRoundTripper adds a layer around the standard +// round tripper to add Request headers before delegation. Implements +// the go standard library "http.RoundTripper" interface. +type CommandHeaderRoundTripper struct { + Delegate http.RoundTripper + Headers map[string]string +} + +// CommandHeaderRoundTripper adds Request headers before delegating to standard +// round tripper. These headers are kubectl command headers which +// detail the kubectl command. See SIG CLI KEP 859: +// https://github.com/kubernetes/enhancements/tree/master/keps/sig-cli/859-kubectl-headers +func (c *CommandHeaderRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + for header, value := range c.Headers { + req.Header.Set(header, value) + } + return c.Delegate.RoundTrip(req) +} + +// ParseCommandHeaders fills in a map of X-Headers into the CommandHeaderRoundTripper. These +// headers are then filled into each request. For details on X-Headers see: +// https://github.com/kubernetes/enhancements/tree/master/keps/sig-cli/859-kubectl-headers +// Each call overwrites the previously parsed command headers (not additive). +// TODO(seans3): Parse/add flags removing PII from flag values. +func (c *CommandHeaderRoundTripper) ParseCommandHeaders(cmd *cobra.Command, args []string) { + if cmd == nil { + return + } + // Overwrites previously parsed command headers (headers not additive). + c.Headers = map[string]string{} + // Session identifier to aggregate multiple Requests from single kubectl command. + uid := uuid.New().String() + c.Headers[kubectlSessionHeader] = uid + // Iterate up the hierarchy of commands from the leaf command to create + // the full command string. Example: kubectl create secret generic + cmdStrs := []string{} + for cmd.HasParent() { + parent := cmd.Parent() + currName := strings.TrimSpace(cmd.Name()) + cmdStrs = append([]string{currName}, cmdStrs...) + cmd = parent + } + currName := strings.TrimSpace(cmd.Name()) + cmdStrs = append([]string{currName}, cmdStrs...) + if len(cmdStrs) > 0 { + c.Headers[kubectlCommandHeader] = strings.Join(cmdStrs, " ") + } +} diff --git a/vendor/k8s.io/cli-runtime/pkg/genericclioptions/config_flags.go b/vendor/k8s.io/cli-runtime/pkg/genericclioptions/config_flags.go index 91d1a4b52c8f..86a601a0ded9 100644 --- a/vendor/k8s.io/cli-runtime/pkg/genericclioptions/config_flags.go +++ b/vendor/k8s.io/cli-runtime/pkg/genericclioptions/config_flags.go @@ -98,6 +98,9 @@ type ConfigFlags struct { Username *string Password *string Timeout *string + // If non-nil, wrap config function can transform the Config + // before it is returned in ToRESTConfig function. + WrapConfigFn func(*rest.Config) *rest.Config clientConfig clientcmd.ClientConfig lock sync.Mutex @@ -105,14 +108,25 @@ type ConfigFlags struct { // propagate the config to the places that need it, rather than // loading the config multiple times usePersistentConfig bool + // Allows increasing burst used for discovery, this is useful + // in clusters with many registered resources + discoveryBurst int } // ToRESTConfig implements RESTClientGetter. // Returns a REST client configuration based on a provided path // to a .kubeconfig file, loading rules, and config flag overrides. -// Expects the AddFlags method to have been called. +// Expects the AddFlags method to have been called. If WrapConfigFn +// is non-nil this function can transform config before return. func (f *ConfigFlags) ToRESTConfig() (*rest.Config, error) { - return f.ToRawKubeConfigLoader().ClientConfig() + c, err := f.ToRawKubeConfigLoader().ClientConfig() + if err != nil { + return nil, err + } + if f.WrapConfigFn != nil { + return f.WrapConfigFn(c), nil + } + return c, nil } // ToRawKubeConfigLoader binds config flag values to config overrides @@ -224,7 +238,7 @@ func (f *ConfigFlags) ToDiscoveryClient() (discovery.CachedDiscoveryInterface, e // The more groups you have, the more discovery requests you need to make. // given 25 groups (our groups + a few custom resources) with one-ish version each, discovery needs to make 50 requests // double it just so we don't end up here again for a while. This config is only used for discovery. - config.Burst = 100 + config.Burst = f.discoveryBurst cacheDir := defaultCacheDir @@ -320,6 +334,12 @@ func (f *ConfigFlags) WithDeprecatedPasswordFlag() *ConfigFlags { return f } +// WithDiscoveryBurst sets the RESTClient burst for discovery. +func (f *ConfigFlags) WithDiscoveryBurst(discoveryBurst int) *ConfigFlags { + f.discoveryBurst = discoveryBurst + return f +} + // NewConfigFlags returns ConfigFlags with default values set func NewConfigFlags(usePersistentConfig bool) *ConfigFlags { impersonateGroup := []string{} @@ -345,6 +365,10 @@ func NewConfigFlags(usePersistentConfig bool) *ConfigFlags { ImpersonateGroup: &impersonateGroup, usePersistentConfig: usePersistentConfig, + // The more groups you have, the more discovery requests you need to make. + // given 25 groups (our groups + a few custom resources) with one-ish version each, discovery needs to make 50 requests + // double it just so we don't end up here again for a while. This config is only used for discovery. + discoveryBurst: 100, } } diff --git a/vendor/k8s.io/cli-runtime/pkg/genericclioptions/config_flags_fake.go b/vendor/k8s.io/cli-runtime/pkg/genericclioptions/config_flags_fake.go index ff986b027f4a..7a96481552d8 100644 --- a/vendor/k8s.io/cli-runtime/pkg/genericclioptions/config_flags_fake.go +++ b/vendor/k8s.io/cli-runtime/pkg/genericclioptions/config_flags_fake.go @@ -27,12 +27,16 @@ import ( clientcmdapi "k8s.io/client-go/tools/clientcmd/api" ) +// TestConfigFlags contains clientConfig struct +// and interfaces that implements RESTClientGetter type TestConfigFlags struct { clientConfig clientcmd.ClientConfig discoveryClient discovery.CachedDiscoveryInterface restMapper meta.RESTMapper } +// ToRawKubeConfigLoader implements RESTClientGetter +// Returns a clientconfig if it's set func (f *TestConfigFlags) ToRawKubeConfigLoader() clientcmd.ClientConfig { if f.clientConfig == nil { panic("attempt to obtain a test RawKubeConfigLoader with no clientConfig specified") @@ -40,14 +44,22 @@ func (f *TestConfigFlags) ToRawKubeConfigLoader() clientcmd.ClientConfig { return f.clientConfig } +// ToRESTConfig implements RESTClientGetter. +// Returns a REST client configuration based on a provided path +// to a .kubeconfig file, loading rules, and config flag overrides. +// Expects the AddFlags method to have been called. func (f *TestConfigFlags) ToRESTConfig() (*rest.Config, error) { return f.ToRawKubeConfigLoader().ClientConfig() } +// ToDiscoveryClient implements RESTClientGetter. +// Returns a CachedDiscoveryInterface func (f *TestConfigFlags) ToDiscoveryClient() (discovery.CachedDiscoveryInterface, error) { return f.discoveryClient, nil } +// ToRESTMapper implements RESTClientGetter. +// Returns a mapper. func (f *TestConfigFlags) ToRESTMapper() (meta.RESTMapper, error) { if f.restMapper != nil { return f.restMapper, nil @@ -60,21 +72,25 @@ func (f *TestConfigFlags) ToRESTMapper() (meta.RESTMapper, error) { return nil, fmt.Errorf("no restmapper") } +// WithClientConfig sets the clientConfig flag func (f *TestConfigFlags) WithClientConfig(clientConfig clientcmd.ClientConfig) *TestConfigFlags { f.clientConfig = clientConfig return f } +// WithRESTMapper sets the restMapper flag func (f *TestConfigFlags) WithRESTMapper(mapper meta.RESTMapper) *TestConfigFlags { f.restMapper = mapper return f } +// WithDiscoveryClient sets the discoveryClient flag func (f *TestConfigFlags) WithDiscoveryClient(c discovery.CachedDiscoveryInterface) *TestConfigFlags { f.discoveryClient = c return f } +// WithNamespace sets the clientConfig flag by modifying delagate and namespace func (f *TestConfigFlags) WithNamespace(ns string) *TestConfigFlags { if f.clientConfig == nil { panic("attempt to obtain a test RawKubeConfigLoader with no clientConfig specified") @@ -86,6 +102,7 @@ func (f *TestConfigFlags) WithNamespace(ns string) *TestConfigFlags { return f } +// NewTestConfigFlags builds a TestConfigFlags struct to test ConfigFlags func NewTestConfigFlags() *TestConfigFlags { return &TestConfigFlags{} } diff --git a/vendor/k8s.io/cli-runtime/pkg/genericclioptions/doc.go b/vendor/k8s.io/cli-runtime/pkg/genericclioptions/doc.go index 4796a8a449f6..303da330b7d4 100644 --- a/vendor/k8s.io/cli-runtime/pkg/genericclioptions/doc.go +++ b/vendor/k8s.io/cli-runtime/pkg/genericclioptions/doc.go @@ -14,6 +14,6 @@ See the License for the specific language governing permissions and limitations under the License. */ -// Package genericclioptions contains flags which can be added to you command, bound, completed, and produce +// Package genericclioptions contains flags which can be added to your command, bound, completed, and produce // useful helper functions. Nothing in this package can depend on kube/kube package genericclioptions // import "k8s.io/cli-runtime/pkg/genericclioptions" diff --git a/vendor/k8s.io/cli-runtime/pkg/genericclioptions/filename_flags.go b/vendor/k8s.io/cli-runtime/pkg/genericclioptions/filename_flags.go index 09e7b5bed181..74259e41700c 100644 --- a/vendor/k8s.io/cli-runtime/pkg/genericclioptions/filename_flags.go +++ b/vendor/k8s.io/cli-runtime/pkg/genericclioptions/filename_flags.go @@ -25,6 +25,7 @@ import ( "k8s.io/cli-runtime/pkg/resource" ) +// FileNameFlags are flags for processing files. // Usage of this struct by itself is discouraged. // These flags are composed by ResourceBuilderFlags // which should be used instead. @@ -36,6 +37,7 @@ type FileNameFlags struct { Recursive *bool } +// ToOptions creates a new FileNameOptions struct and sets FilenameOptions based on FileNameflags func (o *FileNameFlags) ToOptions() resource.FilenameOptions { options := resource.FilenameOptions{} @@ -56,6 +58,7 @@ func (o *FileNameFlags) ToOptions() resource.FilenameOptions { return options } +// AddFlags binds file name flags to a given flagset func (o *FileNameFlags) AddFlags(flags *pflag.FlagSet) { if o == nil { return diff --git a/vendor/k8s.io/cli-runtime/pkg/genericclioptions/json_yaml_flags.go b/vendor/k8s.io/cli-runtime/pkg/genericclioptions/json_yaml_flags.go index a344eb0b639b..0f2bdcdaf039 100644 --- a/vendor/k8s.io/cli-runtime/pkg/genericclioptions/json_yaml_flags.go +++ b/vendor/k8s.io/cli-runtime/pkg/genericclioptions/json_yaml_flags.go @@ -24,6 +24,7 @@ import ( "k8s.io/cli-runtime/pkg/printers" ) +// AllowedFormats returns slice of string of allowed JSONYaml printing format func (f *JSONYamlPrintFlags) AllowedFormats() []string { if f == nil { return []string{} @@ -35,6 +36,7 @@ func (f *JSONYamlPrintFlags) AllowedFormats() []string { // Given the following flag values, a printer can be requested that knows // how to handle printing based on these values. type JSONYamlPrintFlags struct { + showManagedFields bool } // ToPrinter receives an outputFormat and returns a printer capable of @@ -54,12 +56,21 @@ func (f *JSONYamlPrintFlags) ToPrinter(outputFormat string) (printers.ResourcePr return nil, NoCompatiblePrinterError{OutputFormat: &outputFormat, AllowedFormats: f.AllowedFormats()} } + if !f.showManagedFields { + printer = &printers.OmitManagedFieldsPrinter{Delegate: printer} + } return printer, nil } // AddFlags receives a *cobra.Command reference and binds // flags related to JSON or Yaml printing to it -func (f *JSONYamlPrintFlags) AddFlags(c *cobra.Command) {} +func (f *JSONYamlPrintFlags) AddFlags(c *cobra.Command) { + if f == nil { + return + } + + c.Flags().BoolVar(&f.showManagedFields, "show-managed-fields", f.showManagedFields, "If true, keep the managedFields when printing objects in JSON or YAML format.") +} // NewJSONYamlPrintFlags returns flags associated with // yaml or json printing, with default values set. diff --git a/vendor/k8s.io/cli-runtime/pkg/genericclioptions/jsonpath_flags.go b/vendor/k8s.io/cli-runtime/pkg/genericclioptions/jsonpath_flags.go index b5d114de73cc..06bef474a379 100644 --- a/vendor/k8s.io/cli-runtime/pkg/genericclioptions/jsonpath_flags.go +++ b/vendor/k8s.io/cli-runtime/pkg/genericclioptions/jsonpath_flags.go @@ -46,6 +46,7 @@ type JSONPathPrintFlags struct { TemplateArgument *string } +// AllowedFormats returns slice of string of allowed JSONPath printing format func (f *JSONPathPrintFlags) AllowedFormats() []string { formats := make([]string, 0, len(jsonFormats)) for format := range jsonFormats { @@ -89,7 +90,7 @@ func (f *JSONPathPrintFlags) ToPrinter(templateFormat string) (printers.Resource if templateFormat == "jsonpath-file" { data, err := ioutil.ReadFile(templateValue) if err != nil { - return nil, fmt.Errorf("error reading --template %s, %v\n", templateValue, err) + return nil, fmt.Errorf("error reading --template %s, %v", templateValue, err) } templateValue = string(data) @@ -97,7 +98,7 @@ func (f *JSONPathPrintFlags) ToPrinter(templateFormat string) (printers.Resource p, err := printers.NewJSONPathPrinter(templateValue) if err != nil { - return nil, fmt.Errorf("error parsing jsonpath %s, %v\n", templateValue, err) + return nil, fmt.Errorf("error parsing jsonpath %s, %v", templateValue, err) } allowMissingKeys := true diff --git a/vendor/k8s.io/cli-runtime/pkg/genericclioptions/kube_template_flags.go b/vendor/k8s.io/cli-runtime/pkg/genericclioptions/kube_template_flags.go index df2b58c1c288..518a20ac6b2d 100644 --- a/vendor/k8s.io/cli-runtime/pkg/genericclioptions/kube_template_flags.go +++ b/vendor/k8s.io/cli-runtime/pkg/genericclioptions/kube_template_flags.go @@ -33,6 +33,7 @@ type KubeTemplatePrintFlags struct { TemplateArgument *string } +// AllowedFormats returns slice of string of allowed GoTemplete and JSONPathPrint printing formats func (f *KubeTemplatePrintFlags) AllowedFormats() []string { if f == nil { return []string{} @@ -40,6 +41,10 @@ func (f *KubeTemplatePrintFlags) AllowedFormats() []string { return append(f.GoTemplatePrintFlags.AllowedFormats(), f.JSONPathPrintFlags.AllowedFormats()...) } +// ToPrinter receives an outputFormat and returns a printer capable of +// handling --template printing. +// Returns false if the specified outputFormat does not match a supported format. +// Supported Format types can be found in pkg/printers/printers.go func (f *KubeTemplatePrintFlags) ToPrinter(outputFormat string) (printers.ResourcePrinter, error) { if f == nil { return nil, NoCompatiblePrinterError{} diff --git a/vendor/k8s.io/cli-runtime/pkg/genericclioptions/name_flags.go b/vendor/k8s.io/cli-runtime/pkg/genericclioptions/name_flags.go index 7aa89ab05aa7..02f400a03ebb 100644 --- a/vendor/k8s.io/cli-runtime/pkg/genericclioptions/name_flags.go +++ b/vendor/k8s.io/cli-runtime/pkg/genericclioptions/name_flags.go @@ -35,11 +35,13 @@ type NamePrintFlags struct { Operation string } +// Complete sets NamePrintFlags operation flag from sucessTemplate func (f *NamePrintFlags) Complete(successTemplate string) error { f.Operation = fmt.Sprintf(successTemplate, f.Operation) return nil } +// AllowedFormats returns slice of string of allowed Name printing format func (f *NamePrintFlags) AllowedFormats() []string { if f == nil { return []string{} diff --git a/vendor/k8s.io/cli-runtime/pkg/genericclioptions/print_flags.go b/vendor/k8s.io/cli-runtime/pkg/genericclioptions/print_flags.go index 17b05c8cd69a..1ec93aecc486 100644 --- a/vendor/k8s.io/cli-runtime/pkg/genericclioptions/print_flags.go +++ b/vendor/k8s.io/cli-runtime/pkg/genericclioptions/print_flags.go @@ -27,6 +27,8 @@ import ( "k8s.io/cli-runtime/pkg/printers" ) +// NoCompatiblePrinterError is a struct that contains error information. +// It will be constructed when a invalid printing format is provided type NoCompatiblePrinterError struct { OutputFormat *string AllowedFormats []string @@ -43,6 +45,8 @@ func (e NoCompatiblePrinterError) Error() string { return fmt.Sprintf("unable to match a printer suitable for the output format %q, allowed formats are: %s", output, strings.Join(e.AllowedFormats, ",")) } +// IsNoCompatiblePrinterError returns true if it is a not a compatible printer +// otherwise it will return false func IsNoCompatiblePrinterError(err error) bool { if err == nil { return false @@ -69,10 +73,12 @@ type PrintFlags struct { OutputFlagSpecified func() bool } +// Complete sets NamePrintFlags operation flag from sucessTemplate func (f *PrintFlags) Complete(successTemplate string) error { return f.NamePrintFlags.Complete(successTemplate) } +// AllowedFormats returns slice of string of allowed JSONYaml/Name/Template printing format func (f *PrintFlags) AllowedFormats() []string { ret := []string{} ret = append(ret, f.JSONYamlPrintFlags.AllowedFormats()...) @@ -81,6 +87,10 @@ func (f *PrintFlags) AllowedFormats() []string { return ret } +// ToPrinter returns a printer capable of +// handling --output or --template printing. +// Returns false if the specified outputFormat does not match a supported format. +// Supported format types can be found in pkg/printers/printers.go func (f *PrintFlags) ToPrinter() (printers.ResourcePrinter, error) { outputFormat := "" if f.OutputFormat != nil { @@ -118,6 +128,8 @@ func (f *PrintFlags) ToPrinter() (printers.ResourcePrinter, error) { return nil, NoCompatiblePrinterError{OutputFormat: f.OutputFormat, AllowedFormats: f.AllowedFormats()} } +// AddFlags receives a *cobra.Command reference and binds +// flags related to JSON/Yaml/Name/Template printing to it func (f *PrintFlags) AddFlags(cmd *cobra.Command) { f.JSONYamlPrintFlags.AddFlags(cmd) f.NamePrintFlags.AddFlags(cmd) @@ -145,6 +157,7 @@ func (f *PrintFlags) WithTypeSetter(scheme *runtime.Scheme) *PrintFlags { return f } +// NewPrintFlags returns a default *PrintFlags func NewPrintFlags(operation string) *PrintFlags { outputFormat := "" diff --git a/vendor/k8s.io/cli-runtime/pkg/genericclioptions/record_flags.go b/vendor/k8s.io/cli-runtime/pkg/genericclioptions/record_flags.go index faf250d53cbd..095a7b519e31 100644 --- a/vendor/k8s.io/cli-runtime/pkg/genericclioptions/record_flags.go +++ b/vendor/k8s.io/cli-runtime/pkg/genericclioptions/record_flags.go @@ -21,7 +21,7 @@ import ( "path/filepath" "strings" - "github.com/evanphx/json-patch" + jsonpatch "github.com/evanphx/json-patch" "github.com/spf13/cobra" "github.com/spf13/pflag" @@ -74,6 +74,7 @@ func (f *RecordFlags) Complete(cmd *cobra.Command) error { return nil } +// CompleteWithChangeCause alters changeCause value with a new cause func (f *RecordFlags) CompleteWithChangeCause(cause string) error { if f == nil { return nil diff --git a/vendor/k8s.io/cli-runtime/pkg/genericclioptions/template_flags.go b/vendor/k8s.io/cli-runtime/pkg/genericclioptions/template_flags.go index 342912798a96..4502061ec43e 100644 --- a/vendor/k8s.io/cli-runtime/pkg/genericclioptions/template_flags.go +++ b/vendor/k8s.io/cli-runtime/pkg/genericclioptions/template_flags.go @@ -47,6 +47,7 @@ type GoTemplatePrintFlags struct { TemplateArgument *string } +// AllowedFormats returns slice of string of allowed GoTemplatePrint printing format func (f *GoTemplatePrintFlags) AllowedFormats() []string { formats := make([]string, 0, len(templateFormats)) for format := range templateFormats { @@ -90,7 +91,7 @@ func (f *GoTemplatePrintFlags) ToPrinter(templateFormat string) (printers.Resour if templateFormat == "templatefile" || templateFormat == "go-template-file" { data, err := ioutil.ReadFile(templateValue) if err != nil { - return nil, fmt.Errorf("error reading --template %s, %v\n", templateValue, err) + return nil, fmt.Errorf("error reading --template %s, %v", templateValue, err) } templateValue = string(data) @@ -98,7 +99,7 @@ func (f *GoTemplatePrintFlags) ToPrinter(templateFormat string) (printers.Resour p, err := printers.NewGoTemplatePrinter([]byte(templateValue)) if err != nil { - return nil, fmt.Errorf("error parsing template %s, %v\n", templateValue, err) + return nil, fmt.Errorf("error parsing template %s, %v", templateValue, err) } allowMissingKeys := true diff --git a/vendor/k8s.io/cli-runtime/pkg/kustomize/BUILD b/vendor/k8s.io/cli-runtime/pkg/kustomize/BUILD deleted file mode 100644 index 8780b6b06f86..000000000000 --- a/vendor/k8s.io/cli-runtime/pkg/kustomize/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["builder.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/cli-runtime/pkg/kustomize", - importpath = "k8s.io/cli-runtime/pkg/kustomize", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/cli-runtime/pkg/kustomize/k8sdeps:go_default_library", - "//vendor/sigs.k8s.io/kustomize/pkg/commands/build:go_default_library", - "//vendor/sigs.k8s.io/kustomize/pkg/fs:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/cli-runtime/pkg/kustomize/k8sdeps:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["builder_test.go"], - embed = [":go_default_library"], - deps = ["//vendor/sigs.k8s.io/kustomize/pkg/fs:go_default_library"], -) diff --git a/vendor/k8s.io/cli-runtime/pkg/kustomize/builder.go b/vendor/k8s.io/cli-runtime/pkg/kustomize/builder.go deleted file mode 100644 index 6aace7ce535b..000000000000 --- a/vendor/k8s.io/cli-runtime/pkg/kustomize/builder.go +++ /dev/null @@ -1,32 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package kustomize - -import ( - "io" - - "k8s.io/cli-runtime/pkg/kustomize/k8sdeps" - "sigs.k8s.io/kustomize/pkg/commands/build" - "sigs.k8s.io/kustomize/pkg/fs" -) - -// RunKustomizeBuild runs kustomize build given a filesystem and a path -func RunKustomizeBuild(out io.Writer, fSys fs.FileSystem, path string) error { - f := k8sdeps.NewFactory() - o := build.NewOptions(path, "") - return o.RunBuild(out, fSys, f.ResmapF, f.TransformerF) -} diff --git a/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/BUILD b/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/BUILD deleted file mode 100644 index 1ff850ef3798..000000000000 --- a/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "factory.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps", - importpath = "k8s.io/cli-runtime/pkg/kustomize/k8sdeps", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kunstruct:go_default_library", - "//staging/src/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer:go_default_library", - "//staging/src/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/validator:go_default_library", - "//vendor/sigs.k8s.io/kustomize/pkg/factory:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/configmapandsecret:all-srcs", - "//staging/src/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kunstruct:all-srcs", - "//staging/src/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kv:all-srcs", - "//staging/src/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer:all-srcs", - "//staging/src/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/validator:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/configmapandsecret/BUILD b/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/configmapandsecret/BUILD deleted file mode 100644 index 67c6bae6b513..000000000000 --- a/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/configmapandsecret/BUILD +++ /dev/null @@ -1,53 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "configmapfactory.go", - "kv.go", - "secretfactory.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/configmapandsecret", - importpath = "k8s.io/cli-runtime/pkg/kustomize/k8sdeps/configmapandsecret", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", - "//staging/src/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kv:go_default_library", - "//vendor/github.com/pkg/errors:go_default_library", - "//vendor/sigs.k8s.io/kustomize/pkg/ifc:go_default_library", - "//vendor/sigs.k8s.io/kustomize/pkg/types:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "configmapfactory_test.go", - "kv_test.go", - "secretfactory_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kv:go_default_library", - "//vendor/sigs.k8s.io/kustomize/pkg/fs:go_default_library", - "//vendor/sigs.k8s.io/kustomize/pkg/loader:go_default_library", - "//vendor/sigs.k8s.io/kustomize/pkg/types:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/configmapandsecret/configmapfactory.go b/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/configmapandsecret/configmapfactory.go deleted file mode 100644 index 9d40838ab0cd..000000000000 --- a/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/configmapandsecret/configmapfactory.go +++ /dev/null @@ -1,125 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Package configmapandsecret generates configmaps and secrets per generator rules. -package configmapandsecret - -import ( - "fmt" - "strings" - "unicode/utf8" - - "github.com/pkg/errors" - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/util/validation" - "k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kv" - "sigs.k8s.io/kustomize/pkg/ifc" - "sigs.k8s.io/kustomize/pkg/types" -) - -// ConfigMapFactory makes ConfigMaps. -type ConfigMapFactory struct { - ldr ifc.Loader -} - -// NewConfigMapFactory returns a new ConfigMapFactory. -func NewConfigMapFactory(l ifc.Loader) *ConfigMapFactory { - return &ConfigMapFactory{ldr: l} -} - -func (f *ConfigMapFactory) makeFreshConfigMap( - args *types.ConfigMapArgs) *corev1.ConfigMap { - cm := &corev1.ConfigMap{} - cm.APIVersion = "v1" - cm.Kind = "ConfigMap" - cm.Name = args.Name - cm.Namespace = args.Namespace - cm.Data = map[string]string{} - return cm -} - -// MakeConfigMap returns a new ConfigMap, or nil and an error. -func (f *ConfigMapFactory) MakeConfigMap( - args *types.ConfigMapArgs, options *types.GeneratorOptions) (*corev1.ConfigMap, error) { - var all []kv.Pair - var err error - cm := f.makeFreshConfigMap(args) - - pairs, err := keyValuesFromEnvFile(f.ldr, args.EnvSource) - if err != nil { - return nil, errors.Wrap(err, fmt.Sprintf( - "env source file: %s", - args.EnvSource)) - } - all = append(all, pairs...) - - pairs, err = keyValuesFromLiteralSources(args.LiteralSources) - if err != nil { - return nil, errors.Wrap(err, fmt.Sprintf( - "literal sources %v", args.LiteralSources)) - } - all = append(all, pairs...) - - pairs, err = keyValuesFromFileSources(f.ldr, args.FileSources) - if err != nil { - return nil, errors.Wrap(err, fmt.Sprintf( - "file sources: %v", args.FileSources)) - } - all = append(all, pairs...) - - for _, p := range all { - err = addKvToConfigMap(cm, p.Key, p.Value) - if err != nil { - return nil, err - } - } - if options != nil { - cm.SetLabels(options.Labels) - cm.SetAnnotations(options.Annotations) - } - return cm, nil -} - -// addKvToConfigMap adds the given key and data to the given config map. -// Error if key invalid, or already exists. -func addKvToConfigMap(configMap *corev1.ConfigMap, keyName, data string) error { - // Note, the rules for ConfigMap keys are the exact same as the ones for SecretKeys. - if errs := validation.IsConfigMapKey(keyName); len(errs) != 0 { - return fmt.Errorf("%q is not a valid key name for a ConfigMap: %s", keyName, strings.Join(errs, ";")) - } - - keyExistsErrorMsg := "cannot add key %s, another key by that name already exists: %v" - - // If the configmap data contains byte sequences that are all in the UTF-8 - // range, we will write it to .Data - if utf8.Valid([]byte(data)) { - if _, entryExists := configMap.Data[keyName]; entryExists { - return fmt.Errorf(keyExistsErrorMsg, keyName, configMap.Data) - } - configMap.Data[keyName] = data - return nil - } - - // otherwise, it's BinaryData - if configMap.BinaryData == nil { - configMap.BinaryData = map[string][]byte{} - } - if _, entryExists := configMap.BinaryData[keyName]; entryExists { - return fmt.Errorf(keyExistsErrorMsg, keyName, configMap.BinaryData) - } - configMap.BinaryData[keyName] = []byte(data) - return nil -} diff --git a/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/configmapandsecret/kv.go b/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/configmapandsecret/kv.go deleted file mode 100644 index 893dfefc9c98..000000000000 --- a/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/configmapandsecret/kv.go +++ /dev/null @@ -1,107 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package configmapandsecret - -import ( - "fmt" - "path" - "strings" - - "github.com/pkg/errors" - "k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kv" - "sigs.k8s.io/kustomize/pkg/ifc" -) - -func keyValuesFromLiteralSources(sources []string) ([]kv.Pair, error) { - var kvs []kv.Pair - for _, s := range sources { - k, v, err := parseLiteralSource(s) - if err != nil { - return nil, err - } - kvs = append(kvs, kv.Pair{Key: k, Value: v}) - } - return kvs, nil -} - -func keyValuesFromFileSources(ldr ifc.Loader, sources []string) ([]kv.Pair, error) { - var kvs []kv.Pair - for _, s := range sources { - k, fPath, err := parseFileSource(s) - if err != nil { - return nil, err - } - content, err := ldr.Load(fPath) - if err != nil { - return nil, err - } - kvs = append(kvs, kv.Pair{Key: k, Value: string(content)}) - } - return kvs, nil -} - -func keyValuesFromEnvFile(l ifc.Loader, path string) ([]kv.Pair, error) { - if path == "" { - return nil, nil - } - content, err := l.Load(path) - if err != nil { - return nil, err - } - return kv.KeyValuesFromLines(content) -} - -// parseFileSource parses the source given. -// -// Acceptable formats include: -// 1. source-path: the basename will become the key name -// 2. source-name=source-path: the source-name will become the key name and -// source-path is the path to the key file. -// -// Key names cannot include '='. -func parseFileSource(source string) (keyName, filePath string, err error) { - numSeparators := strings.Count(source, "=") - switch { - case numSeparators == 0: - return path.Base(source), source, nil - case numSeparators == 1 && strings.HasPrefix(source, "="): - return "", "", fmt.Errorf("key name for file path %v missing", strings.TrimPrefix(source, "=")) - case numSeparators == 1 && strings.HasSuffix(source, "="): - return "", "", fmt.Errorf("file path for key name %v missing", strings.TrimSuffix(source, "=")) - case numSeparators > 1: - return "", "", errors.New("key names or file paths cannot contain '='") - default: - components := strings.Split(source, "=") - return components[0], components[1], nil - } -} - -// parseLiteralSource parses the source key=val pair into its component pieces. -// This functionality is distinguished from strings.SplitN(source, "=", 2) since -// it returns an error in the case of empty keys, values, or a missing equals sign. -func parseLiteralSource(source string) (keyName, value string, err error) { - // leading equal is invalid - if strings.Index(source, "=") == 0 { - return "", "", fmt.Errorf("invalid literal source %v, expected key=value", source) - } - // split after the first equal (so values can have the = character) - items := strings.SplitN(source, "=", 2) - if len(items) != 2 { - return "", "", fmt.Errorf("invalid literal source %v, expected key=value", source) - } - return items[0], strings.Trim(items[1], "\"'"), nil -} diff --git a/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/configmapandsecret/secretfactory.go b/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/configmapandsecret/secretfactory.go deleted file mode 100644 index 97469f6337fd..000000000000 --- a/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/configmapandsecret/secretfactory.go +++ /dev/null @@ -1,106 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package configmapandsecret - -import ( - "fmt" - "strings" - - "github.com/pkg/errors" - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/util/validation" - "k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kv" - "sigs.k8s.io/kustomize/pkg/ifc" - "sigs.k8s.io/kustomize/pkg/types" -) - -// SecretFactory makes Secrets. -type SecretFactory struct { - ldr ifc.Loader -} - -// NewSecretFactory returns a new SecretFactory. -func NewSecretFactory(ldr ifc.Loader) *SecretFactory { - return &SecretFactory{ldr: ldr} -} - -func (f *SecretFactory) makeFreshSecret(args *types.SecretArgs) *corev1.Secret { - s := &corev1.Secret{} - s.APIVersion = "v1" - s.Kind = "Secret" - s.Name = args.Name - s.Namespace = args.Namespace - s.Type = corev1.SecretType(args.Type) - if s.Type == "" { - s.Type = corev1.SecretTypeOpaque - } - s.Data = map[string][]byte{} - return s -} - -// MakeSecret returns a new secret. -func (f *SecretFactory) MakeSecret(args *types.SecretArgs, options *types.GeneratorOptions) (*corev1.Secret, error) { - var all []kv.Pair - var err error - s := f.makeFreshSecret(args) - - pairs, err := keyValuesFromEnvFile(f.ldr, args.EnvSource) - if err != nil { - return nil, errors.Wrap(err, fmt.Sprintf( - "env source file: %s", - args.EnvSource)) - } - all = append(all, pairs...) - - pairs, err = keyValuesFromLiteralSources(args.LiteralSources) - if err != nil { - return nil, errors.Wrap(err, fmt.Sprintf( - "literal sources %v", args.LiteralSources)) - } - all = append(all, pairs...) - - pairs, err = keyValuesFromFileSources(f.ldr, args.FileSources) - if err != nil { - return nil, errors.Wrap(err, fmt.Sprintf( - "file sources: %v", args.FileSources)) - } - all = append(all, pairs...) - - for _, p := range all { - err = addKvToSecret(s, p.Key, p.Value) - if err != nil { - return nil, err - } - } - if options != nil { - s.SetLabels(options.Labels) - s.SetAnnotations(options.Annotations) - } - return s, nil -} - -func addKvToSecret(secret *corev1.Secret, keyName, data string) error { - // Note, the rules for SecretKeys keys are the exact same as the ones for ConfigMap. - if errs := validation.IsConfigMapKey(keyName); len(errs) != 0 { - return fmt.Errorf("%q is not a valid key name for a Secret: %s", keyName, strings.Join(errs, ";")) - } - if _, entryExists := secret.Data[keyName]; entryExists { - return fmt.Errorf("cannot add key %s, another key by that name already exists", keyName) - } - secret.Data[keyName] = []byte(data) - return nil -} diff --git a/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/doc.go b/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/doc.go deleted file mode 100644 index c98cb8d68048..000000000000 --- a/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/doc.go +++ /dev/null @@ -1,76 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// It's possible that kustomize's features will be vendored into -// the kubernetes/kubernetes repo and made available to kubectl -// commands, while at the same time the kustomize program will -// continue to exist as an independent CLI. Vendoring snapshots -// would be taken just before a kubectl release. -// -// This creates a problem in that freestanding-kustomize depends on -// (for example): -// -// https://github.com/kubernetes/apimachinery/ -// tree/master/pkg/util/yaml -// -// It vendors that package into -// sigs.k8s.io/kustomize/vendor/k8s.io/apimachinery/ -// -// Whereas kubectl-kustomize would have to depend on the "staging" -// version of this code, located at -// -// https://github.com/kubernetes/kubernetes/ -// blob/master/staging/src/k8s.io/apimachinery/pkg/util/yaml -// -// which is "vendored" via symlinks: -// k8s.io/kubernetes/vendor/k8s.io/apimachinery -// is a symlink to -// ../../staging/src/k8s.io/apimachinery -// -// The staging version is the canonical, under-development -// version of the code that kubectl depends on, whereas the packages -// at kubernetes/apimachinery are periodic snapshots of staging made -// for outside tools to depend on. -// -// apimachinery isn't the only package that poses this problem, just -// using it as a specific example. -// -// The kubectl binary cannot vendor in kustomize code that in -// turn vendors in the non-staging packages. -// -// One way to fix some of this would be to copy code - a hard fork. -// This has all the problems associated with a hard forking. -// -// Another way would be to break the kustomize repo into three: -// -// (1) kustomize - repo with the main() function, -// vendoring (2) and (3). -// -// (2) kustomize-libs - packages used by (1) with no -// apimachinery dependence. -// -// (3) kustomize-k8sdeps - A thin code layer that depends -// on (vendors) apimachinery to provide thin implementations -// to interfaces used in (2). -// -// The kubectl repo would then vendor from (2) only, and have -// a local implementation of (3). With that in mind, it's clear -// that (3) doesn't have to be a repo; the kustomize version of -// the thin layer can live directly in (1). -// -// This package is the code in (3), meant for kustomize. - -package k8sdeps diff --git a/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/factory.go b/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/factory.go deleted file mode 100644 index a83b4bdaae0b..000000000000 --- a/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/factory.go +++ /dev/null @@ -1,34 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Package k8sdeps provides kustomize factory with k8s dependencies -package k8sdeps - -import ( - "k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kunstruct" - "k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer" - "k8s.io/cli-runtime/pkg/kustomize/k8sdeps/validator" - "sigs.k8s.io/kustomize/pkg/factory" -) - -// NewFactory creates an instance of KustFactory using k8sdeps factories -func NewFactory() *factory.KustFactory { - return factory.NewKustFactory( - kunstruct.NewKunstructuredFactoryImpl(), - validator.NewKustValidator(), - transformer.NewFactoryImpl(), - ) -} diff --git a/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kunstruct/BUILD b/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kunstruct/BUILD deleted file mode 100644 index 92105687e449..000000000000 --- a/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kunstruct/BUILD +++ /dev/null @@ -1,47 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "factory.go", - "helper.go", - "kunstruct.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kunstruct", - importpath = "k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kunstruct", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/yaml:go_default_library", - "//staging/src/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/configmapandsecret:go_default_library", - "//vendor/sigs.k8s.io/kustomize/pkg/gvk:go_default_library", - "//vendor/sigs.k8s.io/kustomize/pkg/ifc:go_default_library", - "//vendor/sigs.k8s.io/kustomize/pkg/types:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "factory_test.go", - "kunstruct_test.go", - ], - embed = [":go_default_library"], - deps = ["//vendor/sigs.k8s.io/kustomize/pkg/ifc:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kunstruct/factory.go b/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kunstruct/factory.go deleted file mode 100644 index a1dec316918f..000000000000 --- a/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kunstruct/factory.go +++ /dev/null @@ -1,118 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package kunstruct - -import ( - "bytes" - "fmt" - "io" - "strings" - - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/util/yaml" - "k8s.io/cli-runtime/pkg/kustomize/k8sdeps/configmapandsecret" - "sigs.k8s.io/kustomize/pkg/ifc" - "sigs.k8s.io/kustomize/pkg/types" -) - -// KunstructuredFactoryImpl hides construction using apimachinery types. -type KunstructuredFactoryImpl struct { - cmFactory *configmapandsecret.ConfigMapFactory - secretFactory *configmapandsecret.SecretFactory -} - -var _ ifc.KunstructuredFactory = &KunstructuredFactoryImpl{} - -// NewKunstructuredFactoryImpl returns a factory. -func NewKunstructuredFactoryImpl() ifc.KunstructuredFactory { - return &KunstructuredFactoryImpl{} -} - -// SliceFromBytes returns a slice of Kunstructured. -func (kf *KunstructuredFactoryImpl) SliceFromBytes( - in []byte) ([]ifc.Kunstructured, error) { - decoder := yaml.NewYAMLOrJSONDecoder(bytes.NewReader(in), 1024) - var result []ifc.Kunstructured - var err error - for err == nil || isEmptyYamlError(err) { - var out unstructured.Unstructured - err = decoder.Decode(&out) - if err == nil { - if len(out.Object) == 0 { - continue - } - err = kf.validate(out) - if err != nil { - return nil, err - } - result = append(result, &UnstructAdapter{Unstructured: out}) - } - } - if err != io.EOF { - return nil, err - } - return result, nil -} - -func isEmptyYamlError(err error) bool { - return strings.Contains(err.Error(), "is missing in 'null'") -} - -// FromMap returns an instance of Kunstructured. -func (kf *KunstructuredFactoryImpl) FromMap( - m map[string]interface{}) ifc.Kunstructured { - return &UnstructAdapter{Unstructured: unstructured.Unstructured{Object: m}} -} - -// MakeConfigMap returns an instance of Kunstructured for ConfigMap -func (kf *KunstructuredFactoryImpl) MakeConfigMap(args *types.ConfigMapArgs, options *types.GeneratorOptions) (ifc.Kunstructured, error) { - cm, err := kf.cmFactory.MakeConfigMap(args, options) - if err != nil { - return nil, err - } - return NewKunstructuredFromObject(cm) -} - -// MakeSecret returns an instance of Kunstructured for Secret -func (kf *KunstructuredFactoryImpl) MakeSecret(args *types.SecretArgs, options *types.GeneratorOptions) (ifc.Kunstructured, error) { - sec, err := kf.secretFactory.MakeSecret(args, options) - if err != nil { - return nil, err - } - return NewKunstructuredFromObject(sec) -} - -// Set sets loader -func (kf *KunstructuredFactoryImpl) Set(ldr ifc.Loader) { - kf.cmFactory = configmapandsecret.NewConfigMapFactory(ldr) - kf.secretFactory = configmapandsecret.NewSecretFactory(ldr) -} - -// validate validates that u has kind and name -// except for kind `List`, which doesn't require a name -func (kf *KunstructuredFactoryImpl) validate(u unstructured.Unstructured) error { - kind := u.GetKind() - if kind == "" { - return fmt.Errorf("missing kind in object %v", u) - } else if strings.HasSuffix(kind, "List") { - return nil - } - if u.GetName() == "" { - return fmt.Errorf("missing metadata.name in object %v", u) - } - return nil -} diff --git a/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kunstruct/helper.go b/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kunstruct/helper.go deleted file mode 100644 index 0675b961de84..000000000000 --- a/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kunstruct/helper.go +++ /dev/null @@ -1,71 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Package kunstruct provides unstructured from api machinery and factory for creating unstructured -package kunstruct - -import ( - "fmt" - "strings" -) - -func parseFields(path string) ([]string, error) { - if !strings.Contains(path, "[") { - return strings.Split(path, "."), nil - } - - var fields []string - start := 0 - insideParentheses := false - for i := range path { - switch path[i] { - case '.': - if !insideParentheses { - fields = append(fields, path[start:i]) - start = i + 1 - } - case '[': - if !insideParentheses { - if i == start { - start = i + 1 - } else { - fields = append(fields, path[start:i]) - start = i + 1 - } - insideParentheses = true - } else { - return nil, fmt.Errorf("nested parentheses are not allowed: %s", path) - } - case ']': - if insideParentheses { - fields = append(fields, path[start:i]) - start = i + 1 - insideParentheses = false - } else { - return nil, fmt.Errorf("invalid field path %s", path) - } - } - } - if start < len(path)-1 { - fields = append(fields, path[start:]) - } - for i, f := range fields { - if strings.HasPrefix(f, "\"") || strings.HasPrefix(f, "'") { - fields[i] = strings.Trim(f, "\"'") - } - } - return fields, nil -} diff --git a/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kunstruct/kunstruct.go b/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kunstruct/kunstruct.go deleted file mode 100644 index 5ad306bf56cb..000000000000 --- a/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kunstruct/kunstruct.go +++ /dev/null @@ -1,92 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Package kunstruct provides unstructured from api machinery and factory for creating unstructured -package kunstruct - -import ( - "encoding/json" - "fmt" - - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/runtime" - "sigs.k8s.io/kustomize/pkg/gvk" - "sigs.k8s.io/kustomize/pkg/ifc" -) - -var _ ifc.Kunstructured = &UnstructAdapter{} - -// UnstructAdapter wraps unstructured.Unstructured from -// https://github.com/kubernetes/apimachinery/blob/master/ -// pkg/apis/meta/v1/unstructured/unstructured.go -// to isolate dependence on apimachinery. -type UnstructAdapter struct { - unstructured.Unstructured -} - -// NewKunstructuredFromObject returns a new instance of Kunstructured. -func NewKunstructuredFromObject(obj runtime.Object) (ifc.Kunstructured, error) { - // Convert obj to a byte stream, then convert that to JSON (Unstructured). - marshaled, err := json.Marshal(obj) - if err != nil { - return &UnstructAdapter{}, err - } - var u unstructured.Unstructured - err = u.UnmarshalJSON(marshaled) - // creationTimestamp always 'null', remove it - u.SetCreationTimestamp(metav1.Time{}) - return &UnstructAdapter{Unstructured: u}, err -} - -// GetGvk returns the Gvk name of the object. -func (fs *UnstructAdapter) GetGvk() gvk.Gvk { - x := fs.GroupVersionKind() - return gvk.Gvk{ - Group: x.Group, - Version: x.Version, - Kind: x.Kind, - } -} - -// Copy provides a copy behind an interface. -func (fs *UnstructAdapter) Copy() ifc.Kunstructured { - return &UnstructAdapter{*fs.DeepCopy()} -} - -// Map returns the unstructured content map. -func (fs *UnstructAdapter) Map() map[string]interface{} { - return fs.Object -} - -// SetMap overrides the unstructured content map. -func (fs *UnstructAdapter) SetMap(m map[string]interface{}) { - fs.Object = m -} - -// GetFieldValue returns value at the given fieldpath. -func (fs *UnstructAdapter) GetFieldValue(path string) (string, error) { - fields, err := parseFields(path) - if err != nil { - return "", err - } - s, found, err := unstructured.NestedString( - fs.UnstructuredContent(), fields...) - if found || err != nil { - return s, err - } - return "", fmt.Errorf("no field named '%s'", path) -} diff --git a/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kv/BUILD b/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kv/BUILD deleted file mode 100644 index 896f3c73e8a8..000000000000 --- a/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kv/BUILD +++ /dev/null @@ -1,30 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["kv.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kv", - importpath = "k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kv", - visibility = ["//visibility:public"], - deps = ["//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library"], -) - -go_test( - name = "go_default_test", - srcs = ["kv_test.go"], - embed = [":go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kv/kv.go b/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kv/kv.go deleted file mode 100644 index 27b8b3431e13..000000000000 --- a/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kv/kv.go +++ /dev/null @@ -1,102 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package kv - -import ( - "bufio" - "bytes" - "fmt" - "os" - "strings" - "unicode" - "unicode/utf8" - - "k8s.io/apimachinery/pkg/util/validation" -) - -// Pair represents a pair. -type Pair struct { - Key string - Value string -} - -var utf8bom = []byte{0xEF, 0xBB, 0xBF} - -// KeyValuesFromLines parses given content in to a list of key-value pairs. -func KeyValuesFromLines(content []byte) ([]Pair, error) { - var kvs []Pair - - scanner := bufio.NewScanner(bytes.NewReader(content)) - currentLine := 0 - for scanner.Scan() { - // Process the current line, retrieving a key/value pair if - // possible. - scannedBytes := scanner.Bytes() - kv, err := KeyValuesFromLine(scannedBytes, currentLine) - if err != nil { - return nil, err - } - currentLine++ - - if len(kv.Key) == 0 { - // no key means line was empty or a comment - continue - } - - kvs = append(kvs, kv) - } - return kvs, nil -} - -// KeyValuesFromLine returns a kv with blank key if the line is empty or a comment. -// The value will be retrieved from the environment if necessary. -func KeyValuesFromLine(line []byte, currentLine int) (Pair, error) { - kv := Pair{} - - if !utf8.Valid(line) { - return kv, fmt.Errorf("line %d has invalid utf8 bytes : %v", line, string(line)) - } - - // We trim UTF8 BOM from the first line of the file but no others - if currentLine == 0 { - line = bytes.TrimPrefix(line, utf8bom) - } - - // trim the line from all leading whitespace first - line = bytes.TrimLeftFunc(line, unicode.IsSpace) - - // If the line is empty or a comment, we return a blank key/value pair. - if len(line) == 0 || line[0] == '#' { - return kv, nil - } - - data := strings.SplitN(string(line), "=", 2) - key := data[0] - if errs := validation.IsEnvVarName(key); len(errs) != 0 { - return kv, fmt.Errorf("%q is not a valid key name: %s", key, strings.Join(errs, ";")) - } - - if len(data) == 2 { - kv.Value = data[1] - } else { - // No value (no `=` in the line) is a signal to obtain the value - // from the environment. - kv.Value = os.Getenv(key) - } - kv.Key = key - return kv, nil -} diff --git a/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/BUILD b/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/BUILD deleted file mode 100644 index b6ab75a1076c..000000000000 --- a/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["factory.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer", - importpath = "k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/hash:go_default_library", - "//staging/src/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/patch:go_default_library", - "//vendor/sigs.k8s.io/kustomize/pkg/resource:go_default_library", - "//vendor/sigs.k8s.io/kustomize/pkg/transformers:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/hash:all-srcs", - "//staging/src/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/patch:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/factory.go b/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/factory.go deleted file mode 100644 index bc435b379758..000000000000 --- a/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/factory.go +++ /dev/null @@ -1,43 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Package transformer provides transformer factory -package transformer - -import ( - "k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/hash" - "k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/patch" - "sigs.k8s.io/kustomize/pkg/resource" - "sigs.k8s.io/kustomize/pkg/transformers" -) - -// FactoryImpl makes patch transformer and name hash transformer -type FactoryImpl struct{} - -// NewFactoryImpl makes a new factoryImpl instance -func NewFactoryImpl() *FactoryImpl { - return &FactoryImpl{} -} - -// MakePatchTransformer makes a new patch transformer -func (p *FactoryImpl) MakePatchTransformer(slice []*resource.Resource, rf *resource.Factory) (transformers.Transformer, error) { - return patch.NewPatchTransformer(slice, rf) -} - -// MakeHashTransformer makes a new name hash transformer -func (p *FactoryImpl) MakeHashTransformer() transformers.Transformer { - return hash.NewNameHashTransformer() -} diff --git a/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/hash/BUILD b/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/hash/BUILD deleted file mode 100644 index 1b2a78eb6786..000000000000 --- a/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/hash/BUILD +++ /dev/null @@ -1,50 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "hash.go", - "namehash.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/hash", - importpath = "k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/hash", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//vendor/sigs.k8s.io/kustomize/pkg/resmap:go_default_library", - "//vendor/sigs.k8s.io/kustomize/pkg/transformers:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "hash_test.go", - "namehash_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kunstruct:go_default_library", - "//vendor/sigs.k8s.io/kustomize/pkg/gvk:go_default_library", - "//vendor/sigs.k8s.io/kustomize/pkg/resid:go_default_library", - "//vendor/sigs.k8s.io/kustomize/pkg/resmap:go_default_library", - "//vendor/sigs.k8s.io/kustomize/pkg/resource:go_default_library", - "//vendor/sigs.k8s.io/kustomize/pkg/types:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/hash/hash.go b/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/hash/hash.go deleted file mode 100644 index 85bf1e731c3f..000000000000 --- a/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/hash/hash.go +++ /dev/null @@ -1,184 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package hash - -import ( - "crypto/sha256" - "encoding/json" - "fmt" - - "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" -) - -// KustHash compute hash for unstructured objects -type KustHash struct{} - -// NewKustHash returns a KustHash object -func NewKustHash() *KustHash { - return &KustHash{} -} - -// Hash returns a hash of either a ConfigMap or a Secret -func (h *KustHash) Hash(m map[string]interface{}) (string, error) { - u := unstructured.Unstructured{ - Object: m, - } - kind := u.GetKind() - switch kind { - case "ConfigMap": - cm, err := unstructuredToConfigmap(u) - if err != nil { - return "", err - } - return ConfigMapHash(cm) - case "Secret": - sec, err := unstructuredToSecret(u) - - if err != nil { - return "", err - } - return SecretHash(sec) - default: - return "", fmt.Errorf("type %s is supported for hashing in %v", kind, m) - } -} - -// ConfigMapHash returns a hash of the ConfigMap. -// The Data, Kind, and Name are taken into account. -func ConfigMapHash(cm *v1.ConfigMap) (string, error) { - encoded, err := encodeConfigMap(cm) - if err != nil { - return "", err - } - h, err := encodeHash(hash(encoded)) - if err != nil { - return "", err - } - return h, nil -} - -// SecretHash returns a hash of the Secret. -// The Data, Kind, Name, and Type are taken into account. -func SecretHash(sec *v1.Secret) (string, error) { - encoded, err := encodeSecret(sec) - if err != nil { - return "", err - } - h, err := encodeHash(hash(encoded)) - if err != nil { - return "", err - } - return h, nil -} - -// encodeConfigMap encodes a ConfigMap. -// Data, Kind, and Name are taken into account. -func encodeConfigMap(cm *v1.ConfigMap) (string, error) { - // json.Marshal sorts the keys in a stable order in the encoding - m := map[string]interface{}{ - "kind": "ConfigMap", - "name": cm.Name, - "data": cm.Data, - } - if cm.Immutable != nil { - m["immutable"] = *cm.Immutable - } - if len(cm.BinaryData) > 0 { - m["binaryData"] = cm.BinaryData - } - data, err := json.Marshal(m) - if err != nil { - return "", err - } - return string(data), nil -} - -// encodeSecret encodes a Secret. -// Data, Kind, Name, and Type are taken into account. -func encodeSecret(sec *v1.Secret) (string, error) { - // json.Marshal sorts the keys in a stable order in the encoding - m := map[string]interface{}{ - "kind": "Secret", - "type": sec.Type, - "name": sec.Name, - "data": sec.Data, - } - if sec.Immutable != nil { - m["immutable"] = *sec.Immutable - } - data, err := json.Marshal(m) - if err != nil { - return "", err - } - return string(data), nil -} - -// encodeHash extracts the first 40 bits of the hash from the hex string -// (1 hex char represents 4 bits), and then maps vowels and vowel-like hex -// characters to consonants to prevent bad words from being formed (the theory -// is that no vowels makes it really hard to make bad words). Since the string -// is hex, the only vowels it can contain are 'a' and 'e'. -// We picked some arbitrary consonants to map to from the same character set as GenerateName. -// See: https://github.com/kubernetes/apimachinery/blob/dc1f89aff9a7509782bde3b68824c8043a3e58cc/pkg/util/rand/rand.go#L75 -// If the hex string contains fewer than ten characters, returns an error. -func encodeHash(hex string) (string, error) { - if len(hex) < 10 { - return "", fmt.Errorf("the hex string must contain at least 10 characters") - } - enc := []rune(hex[:10]) - for i := range enc { - switch enc[i] { - case '0': - enc[i] = 'g' - case '1': - enc[i] = 'h' - case '3': - enc[i] = 'k' - case 'a': - enc[i] = 'm' - case 'e': - enc[i] = 't' - } - } - return string(enc), nil -} - -// hash hashes `data` with sha256 and returns the hex string -func hash(data string) string { - return fmt.Sprintf("%x", sha256.Sum256([]byte(data))) -} - -func unstructuredToConfigmap(u unstructured.Unstructured) (*v1.ConfigMap, error) { - marshaled, err := json.Marshal(u.Object) - if err != nil { - return nil, err - } - var out v1.ConfigMap - err = json.Unmarshal(marshaled, &out) - return &out, err -} - -func unstructuredToSecret(u unstructured.Unstructured) (*v1.Secret, error) { - marshaled, err := json.Marshal(u.Object) - if err != nil { - return nil, err - } - var out v1.Secret - err = json.Unmarshal(marshaled, &out) - return &out, err -} diff --git a/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/hash/namehash.go b/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/hash/namehash.go deleted file mode 100644 index a52072e8adbe..000000000000 --- a/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/hash/namehash.go +++ /dev/null @@ -1,47 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package hash - -import ( - "fmt" - - "sigs.k8s.io/kustomize/pkg/resmap" - "sigs.k8s.io/kustomize/pkg/transformers" -) - -type nameHashTransformer struct{} - -var _ transformers.Transformer = &nameHashTransformer{} - -// NewNameHashTransformer construct a nameHashTransformer. -func NewNameHashTransformer() transformers.Transformer { - return &nameHashTransformer{} -} - -// Transform appends hash to generated resources. -func (o *nameHashTransformer) Transform(m resmap.ResMap) error { - for _, res := range m { - if res.NeedHashSuffix() { - h, err := NewKustHash().Hash(res.Map()) - if err != nil { - return err - } - res.SetName(fmt.Sprintf("%s-%s", res.GetName(), h)) - } - } - return nil -} diff --git a/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/patch/BUILD b/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/patch/BUILD deleted file mode 100644 index 0cb7910dcef2..000000000000 --- a/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/patch/BUILD +++ /dev/null @@ -1,51 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "patch.go", - "patchconflictdetector.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/patch", - importpath = "k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/patch", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/mergepatch:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/github.com/evanphx/json-patch:go_default_library", - "//vendor/sigs.k8s.io/kustomize/pkg/gvk:go_default_library", - "//vendor/sigs.k8s.io/kustomize/pkg/resmap:go_default_library", - "//vendor/sigs.k8s.io/kustomize/pkg/resource:go_default_library", - "//vendor/sigs.k8s.io/kustomize/pkg/transformers:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["patch_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kunstruct:go_default_library", - "//vendor/sigs.k8s.io/kustomize/pkg/gvk:go_default_library", - "//vendor/sigs.k8s.io/kustomize/pkg/resid:go_default_library", - "//vendor/sigs.k8s.io/kustomize/pkg/resmap:go_default_library", - "//vendor/sigs.k8s.io/kustomize/pkg/resource:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/patch/patch.go b/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/patch/patch.go deleted file mode 100644 index 357f3dabae04..000000000000 --- a/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/patch/patch.go +++ /dev/null @@ -1,174 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package patch - -import ( - "encoding/json" - "fmt" - - "github.com/evanphx/json-patch" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/apimachinery/pkg/util/strategicpatch" - "k8s.io/client-go/kubernetes/scheme" - "sigs.k8s.io/kustomize/pkg/gvk" - "sigs.k8s.io/kustomize/pkg/resmap" - "sigs.k8s.io/kustomize/pkg/resource" - "sigs.k8s.io/kustomize/pkg/transformers" -) - -// patchTransformer applies patches. -type patchTransformer struct { - patches []*resource.Resource - rf *resource.Factory -} - -var _ transformers.Transformer = &patchTransformer{} - -// NewPatchTransformer constructs a patchTransformer. -func NewPatchTransformer( - slice []*resource.Resource, rf *resource.Factory) (transformers.Transformer, error) { - if len(slice) == 0 { - return transformers.NewNoOpTransformer(), nil - } - return &patchTransformer{patches: slice, rf: rf}, nil -} - -// Transform apply the patches on top of the base resources. -func (pt *patchTransformer) Transform(baseResourceMap resmap.ResMap) error { - // Merge and then index the patches by Id. - patches, err := pt.mergePatches() - if err != nil { - return err - } - - // Strategic merge the resources exist in both base and patches. - for _, patch := range patches { - // Merge patches with base resource. - id := patch.Id() - matchedIds := baseResourceMap.GetMatchingIds(id.GvknEquals) - if len(matchedIds) == 0 { - return fmt.Errorf("failed to find an object with %s to apply the patch", id.GvknString()) - } - if len(matchedIds) > 1 { - return fmt.Errorf("found multiple objects %#v targeted by patch %#v (ambiguous)", matchedIds, id) - } - id = matchedIds[0] - base := baseResourceMap[id] - merged := map[string]interface{}{} - versionedObj, err := scheme.Scheme.New(toSchemaGvk(id.Gvk())) - baseName := base.GetName() - switch { - case runtime.IsNotRegisteredError(err): - // Use JSON merge patch to handle types w/o schema - baseBytes, err := json.Marshal(base.Map()) - if err != nil { - return err - } - patchBytes, err := json.Marshal(patch.Map()) - if err != nil { - return err - } - mergedBytes, err := jsonpatch.MergePatch(baseBytes, patchBytes) - if err != nil { - return err - } - err = json.Unmarshal(mergedBytes, &merged) - if err != nil { - return err - } - case err != nil: - return err - default: - // Use Strategic-Merge-Patch to handle types w/ schema - // TODO: Change this to use the new Merge package. - // Store the name of the base object, because this name may have been munged. - // Apply this name to the patched object. - lookupPatchMeta, err := strategicpatch.NewPatchMetaFromStruct(versionedObj) - if err != nil { - return err - } - merged, err = strategicpatch.StrategicMergeMapPatchUsingLookupPatchMeta( - base.Map(), - patch.Map(), - lookupPatchMeta) - if err != nil { - return err - } - } - base.SetName(baseName) - baseResourceMap[id].SetMap(merged) - } - return nil -} - -// mergePatches merge and index patches by Id. -// It errors out if there is conflict between patches. -func (pt *patchTransformer) mergePatches() (resmap.ResMap, error) { - rc := resmap.ResMap{} - for ix, patch := range pt.patches { - id := patch.Id() - existing, found := rc[id] - if !found { - rc[id] = patch - continue - } - - versionedObj, err := scheme.Scheme.New(toSchemaGvk(id.Gvk())) - if err != nil && !runtime.IsNotRegisteredError(err) { - return nil, err - } - var cd conflictDetector - if err != nil { - cd = newJMPConflictDetector(pt.rf) - } else { - cd, err = newSMPConflictDetector(versionedObj, pt.rf) - if err != nil { - return nil, err - } - } - - conflict, err := cd.hasConflict(existing, patch) - if err != nil { - return nil, err - } - if conflict { - conflictingPatch, err := cd.findConflict(ix, pt.patches) - if err != nil { - return nil, err - } - return nil, fmt.Errorf( - "conflict between %#v and %#v", - conflictingPatch.Map(), patch.Map()) - } - merged, err := cd.mergePatches(existing, patch) - if err != nil { - return nil, err - } - rc[id] = merged - } - return rc, nil -} - -// toSchemaGvk converts to a schema.GroupVersionKind. -func toSchemaGvk(x gvk.Gvk) schema.GroupVersionKind { - return schema.GroupVersionKind{ - Group: x.Group, - Version: x.Version, - Kind: x.Kind, - } -} diff --git a/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/patch/patchconflictdetector.go b/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/patch/patchconflictdetector.go deleted file mode 100644 index 10353c77ff6a..000000000000 --- a/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/patch/patchconflictdetector.go +++ /dev/null @@ -1,137 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package patch - -import ( - "encoding/json" - - "github.com/evanphx/json-patch" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/util/mergepatch" - "k8s.io/apimachinery/pkg/util/strategicpatch" - "sigs.k8s.io/kustomize/pkg/resource" -) - -type conflictDetector interface { - hasConflict(patch1, patch2 *resource.Resource) (bool, error) - findConflict(conflictingPatchIdx int, patches []*resource.Resource) (*resource.Resource, error) - mergePatches(patch1, patch2 *resource.Resource) (*resource.Resource, error) -} - -type jsonMergePatch struct { - rf *resource.Factory -} - -var _ conflictDetector = &jsonMergePatch{} - -func newJMPConflictDetector(rf *resource.Factory) conflictDetector { - return &jsonMergePatch{rf: rf} -} - -func (jmp *jsonMergePatch) hasConflict( - patch1, patch2 *resource.Resource) (bool, error) { - return mergepatch.HasConflicts(patch1.Map(), patch2.Map()) -} - -func (jmp *jsonMergePatch) findConflict( - conflictingPatchIdx int, patches []*resource.Resource) (*resource.Resource, error) { - for i, patch := range patches { - if i == conflictingPatchIdx { - continue - } - if !patches[conflictingPatchIdx].Id().GvknEquals(patch.Id()) { - continue - } - conflict, err := mergepatch.HasConflicts( - patch.Map(), - patches[conflictingPatchIdx].Map()) - if err != nil { - return nil, err - } - if conflict { - return patch, nil - } - } - return nil, nil -} - -func (jmp *jsonMergePatch) mergePatches( - patch1, patch2 *resource.Resource) (*resource.Resource, error) { - baseBytes, err := json.Marshal(patch1.Map()) - if err != nil { - return nil, err - } - patchBytes, err := json.Marshal(patch2.Map()) - if err != nil { - return nil, err - } - mergedBytes, err := jsonpatch.MergeMergePatches(baseBytes, patchBytes) - if err != nil { - return nil, err - } - mergedMap := make(map[string]interface{}) - err = json.Unmarshal(mergedBytes, &mergedMap) - return jmp.rf.FromMap(mergedMap), err -} - -type strategicMergePatch struct { - lookupPatchMeta strategicpatch.LookupPatchMeta - rf *resource.Factory -} - -var _ conflictDetector = &strategicMergePatch{} - -func newSMPConflictDetector( - versionedObj runtime.Object, - rf *resource.Factory) (conflictDetector, error) { - lookupPatchMeta, err := strategicpatch.NewPatchMetaFromStruct(versionedObj) - return &strategicMergePatch{lookupPatchMeta: lookupPatchMeta, rf: rf}, err -} - -func (smp *strategicMergePatch) hasConflict(p1, p2 *resource.Resource) (bool, error) { - return strategicpatch.MergingMapsHaveConflicts( - p1.Map(), p2.Map(), smp.lookupPatchMeta) -} - -func (smp *strategicMergePatch) findConflict( - conflictingPatchIdx int, patches []*resource.Resource) (*resource.Resource, error) { - for i, patch := range patches { - if i == conflictingPatchIdx { - continue - } - if !patches[conflictingPatchIdx].Id().GvknEquals(patch.Id()) { - continue - } - conflict, err := strategicpatch.MergingMapsHaveConflicts( - patch.Map(), - patches[conflictingPatchIdx].Map(), - smp.lookupPatchMeta) - if err != nil { - return nil, err - } - if conflict { - return patch, nil - } - } - return nil, nil -} - -func (smp *strategicMergePatch) mergePatches(patch1, patch2 *resource.Resource) (*resource.Resource, error) { - mergeJSONMap, err := strategicpatch.MergeStrategicMergeMapPatchUsingLookupPatchMeta( - smp.lookupPatchMeta, patch1.Map(), patch2.Map()) - return smp.rf.FromMap(mergeJSONMap), err -} diff --git a/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/validator/BUILD b/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/validator/BUILD deleted file mode 100644 index b42649ce92ec..000000000000 --- a/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/validator/BUILD +++ /dev/null @@ -1,29 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["validators.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/validator", - importpath = "k8s.io/cli-runtime/pkg/kustomize/k8sdeps/validator", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/validator/validators.go b/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/validator/validators.go deleted file mode 100644 index 563e8d6b9c00..000000000000 --- a/vendor/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/validator/validators.go +++ /dev/null @@ -1,61 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Package validator provides functions to validate labels, annotations, namespace using apimachinery -package validator - -import ( - "errors" - apivalidation "k8s.io/apimachinery/pkg/api/validation" - v1validation "k8s.io/apimachinery/pkg/apis/meta/v1/validation" - "k8s.io/apimachinery/pkg/util/validation" - "k8s.io/apimachinery/pkg/util/validation/field" -) - -// KustValidator validates Labels and annotations by apimachinery -type KustValidator struct{} - -// NewKustValidator returns a KustValidator object -func NewKustValidator() *KustValidator { - return &KustValidator{} -} - -// MakeAnnotationValidator returns a MapValidatorFunc using apimachinery. -func (v *KustValidator) MakeAnnotationValidator() func(map[string]string) error { - return func(x map[string]string) error { - errs := apivalidation.ValidateAnnotations(x, field.NewPath("field")) - if len(errs) > 0 { - return errors.New(errs.ToAggregate().Error()) - } - return nil - } -} - -// MakeLabelValidator returns a MapValidatorFunc using apimachinery. -func (v *KustValidator) MakeLabelValidator() func(map[string]string) error { - return func(x map[string]string) error { - errs := v1validation.ValidateLabels(x, field.NewPath("field")) - if len(errs) > 0 { - return errors.New(errs.ToAggregate().Error()) - } - return nil - } -} - -// ValidateNamespace validates a string is a valid namespace using apimachinery. -func (v *KustValidator) ValidateNamespace(s string) []string { - return validation.IsDNS1123Label(s) -} diff --git a/vendor/k8s.io/cli-runtime/pkg/printers/BUILD b/vendor/k8s.io/cli-runtime/pkg/printers/BUILD deleted file mode 100644 index 16d012c12e1d..000000000000 --- a/vendor/k8s.io/cli-runtime/pkg/printers/BUILD +++ /dev/null @@ -1,73 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "discard.go", - "doc.go", - "interface.go", - "json.go", - "jsonpath.go", - "name.go", - "sourcechecker.go", - "tableprinter.go", - "tabwriter.go", - "template.go", - "typesetter.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/cli-runtime/pkg/printers", - importpath = "k8s.io/cli-runtime/pkg/printers", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/duration:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/json:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/util/jsonpath:go_default_library", - "//vendor/github.com/liggitt/tabwriter:go_default_library", - "//vendor/sigs.k8s.io/yaml:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "json_test.go", - "jsonpath_test.go", - "sourcechecker_test.go", - "tableprinter_test.go", - "template_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/json:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/sigs.k8s.io/yaml:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/cli-runtime/pkg/printers/managedfields.go b/vendor/k8s.io/cli-runtime/pkg/printers/managedfields.go new file mode 100644 index 000000000000..cab54d0584de --- /dev/null +++ b/vendor/k8s.io/cli-runtime/pkg/printers/managedfields.go @@ -0,0 +1,59 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package printers + +import ( + "io" + + "k8s.io/apimachinery/pkg/api/meta" + "k8s.io/apimachinery/pkg/runtime" +) + +// OmitManagedFieldsPrinter wraps an existing printer and omits the managed fields from the object +// before printing it. +type OmitManagedFieldsPrinter struct { + Delegate ResourcePrinter +} + +var _ ResourcePrinter = (*OmitManagedFieldsPrinter)(nil) + +func omitManagedFields(o runtime.Object) runtime.Object { + a, err := meta.Accessor(o) + if err != nil { + // The object is not a `metav1.Object`, ignore it. + return o + } + a.SetManagedFields(nil) + return o +} + +// PrintObj copies the object and omits the managed fields from the copied object before printing it. +func (p *OmitManagedFieldsPrinter) PrintObj(obj runtime.Object, w io.Writer) error { + if obj == nil { + return p.Delegate.PrintObj(obj, w) + } + if meta.IsListType(obj) { + obj = obj.DeepCopyObject() + _ = meta.EachListItem(obj, func(item runtime.Object) error { + omitManagedFields(item) + return nil + }) + } else if _, err := meta.Accessor(obj); err == nil { + obj = omitManagedFields(obj.DeepCopyObject()) + } + return p.Delegate.PrintObj(obj, w) +} diff --git a/vendor/k8s.io/cli-runtime/pkg/printers/tableprinter.go b/vendor/k8s.io/cli-runtime/pkg/printers/tableprinter.go index 56bd05aa0d30..048cb66a2ba9 100644 --- a/vendor/k8s.io/cli-runtime/pkg/printers/tableprinter.go +++ b/vendor/k8s.io/cli-runtime/pkg/printers/tableprinter.go @@ -94,9 +94,8 @@ func printHeader(columnNames []string, w io.Writer) error { // PrintObj prints the obj in a human-friendly format according to the type of the obj. func (h *HumanReadablePrinter) PrintObj(obj runtime.Object, output io.Writer) error { - w, found := output.(*tabwriter.Writer) - if !found { - w = GetNewTabWriter(output) + if _, found := output.(*tabwriter.Writer); !found { + w := GetNewTabWriter(output) output = w defer w.Flush() } diff --git a/vendor/k8s.io/cli-runtime/pkg/resource/BUILD b/vendor/k8s.io/cli-runtime/pkg/resource/BUILD deleted file mode 100644 index 5f0b626cb614..000000000000 --- a/vendor/k8s.io/cli-runtime/pkg/resource/BUILD +++ /dev/null @@ -1,111 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "builder.go", - "client.go", - "crd_finder.go", - "doc.go", - "dry_run_verifier.go", - "fake.go", - "helper.go", - "interfaces.go", - "mapper.go", - "metadata_decoder.go", - "result.go", - "scheme.go", - "selector.go", - "visitor.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/cli-runtime/pkg/resource", - importpath = "k8s.io/cli-runtime/pkg/resource", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructuredscheme:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/json:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/yaml:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/cli-runtime/pkg/kustomize:go_default_library", - "//staging/src/k8s.io/client-go/discovery:go_default_library", - "//staging/src/k8s.io/client-go/dynamic:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/restmapper:go_default_library", - "//vendor/github.com/googleapis/gnostic/openapiv2:go_default_library", - "//vendor/golang.org/x/text/encoding/unicode:go_default_library", - "//vendor/golang.org/x/text/transform:go_default_library", - "//vendor/gopkg.in/yaml.v2:go_default_library", - "//vendor/sigs.k8s.io/kustomize/pkg/fs:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "builder_example_test.go", - "builder_test.go", - "crd_finder_test.go", - "dry_run_verifier_test.go", - "helper_test.go", - "scheme_test.go", - "visitor_test.go", - ], - data = [ - "//staging/src/k8s.io/cli-runtime/artifacts:all-srcs", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta/testrestmapper:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/streaming:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/rest/fake:go_default_library", - "//staging/src/k8s.io/client-go/rest/watch:go_default_library", - "//staging/src/k8s.io/client-go/restmapper:go_default_library", - "//staging/src/k8s.io/client-go/util/testing:go_default_library", - "//vendor/github.com/davecgh/go-spew/spew:go_default_library", - "//vendor/github.com/googleapis/gnostic/openapiv2:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/util/proto/testing:go_default_library", - "//vendor/sigs.k8s.io/yaml:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/cli-runtime/pkg/resource/builder.go b/vendor/k8s.io/cli-runtime/pkg/resource/builder.go index 5ea501698561..a8ebf6410c8e 100644 --- a/vendor/k8s.io/cli-runtime/pkg/resource/builder.go +++ b/vendor/k8s.io/cli-runtime/pkg/resource/builder.go @@ -38,6 +38,7 @@ import ( "k8s.io/client-go/discovery" "k8s.io/client-go/rest" "k8s.io/client-go/restmapper" + "sigs.k8s.io/kustomize/api/filesys" ) var FileExtensions = []string{".json", ".yaml", ".yml"} @@ -258,8 +259,14 @@ func (b *Builder) FilenameParam(enforceNamespace bool, filenameOptions *Filename } } if filenameOptions.Kustomize != "" { - b.paths = append(b.paths, &KustomizeVisitor{filenameOptions.Kustomize, - NewStreamVisitor(nil, b.mapper, filenameOptions.Kustomize, b.schema)}) + b.paths = append( + b.paths, + &KustomizeVisitor{ + mapper: b.mapper, + dirPath: filenameOptions.Kustomize, + schema: b.schema, + fSys: filesys.MakeFsOnDisk(), + }) } if enforceNamespace { @@ -839,7 +846,7 @@ func (b *Builder) visitorResult() *Result { return &Result{err: err} } } - return &Result{err: fmt.Errorf("resource(s) were provided, but no name, label selector, or --all flag specified")} + return &Result{err: fmt.Errorf("resource(s) were provided, but no name was specified")} } return &Result{err: missingResourceError} } diff --git a/vendor/k8s.io/cli-runtime/pkg/resource/dry_run_verifier.go b/vendor/k8s.io/cli-runtime/pkg/resource/dry_run_verifier.go index 49ab6f861cff..1fb36503a27d 100644 --- a/vendor/k8s.io/cli-runtime/pkg/resource/dry_run_verifier.go +++ b/vendor/k8s.io/cli-runtime/pkg/resource/dry_run_verifier.go @@ -27,17 +27,10 @@ import ( "k8s.io/client-go/dynamic" ) -// VerifyDryRun returns nil if a resource group-version-kind supports -// server-side dry-run. Otherwise, an error is returned. -func VerifyDryRun(gvk schema.GroupVersionKind, dynamicClient dynamic.Interface, discoveryClient discovery.DiscoveryInterface) error { - verifier := NewDryRunVerifier(dynamicClient, discoveryClient) - return verifier.HasSupport(gvk) -} - -func NewDryRunVerifier(dynamicClient dynamic.Interface, discoveryClient discovery.DiscoveryInterface) *DryRunVerifier { +func NewDryRunVerifier(dynamicClient dynamic.Interface, openAPIGetter discovery.OpenAPISchemaInterface) *DryRunVerifier { return &DryRunVerifier{ finder: NewCRDFinder(CRDFromDynamic(dynamicClient)), - openAPIGetter: discoveryClient, + openAPIGetter: openAPIGetter, } } diff --git a/vendor/k8s.io/cli-runtime/pkg/resource/kustomizevisitor.go b/vendor/k8s.io/cli-runtime/pkg/resource/kustomizevisitor.go new file mode 100644 index 000000000000..22c9a548d4bb --- /dev/null +++ b/vendor/k8s.io/cli-runtime/pkg/resource/kustomizevisitor.go @@ -0,0 +1,54 @@ +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package resource + +import ( + "bytes" + + "sigs.k8s.io/kustomize/api/filesys" + "sigs.k8s.io/kustomize/api/krusty" +) + +// KustomizeVisitor handles kustomization.yaml files. +type KustomizeVisitor struct { + mapper *mapper + schema ContentValidator + // Directory expected to contain a kustomization file. + dirPath string + // File system containing dirPath. + fSys filesys.FileSystem + // Holds result of kustomize build, retained for tests. + yml []byte +} + +// Visit passes the result of a kustomize build to a StreamVisitor. +func (v *KustomizeVisitor) Visit(fn VisitorFunc) error { + kOpts := krusty.MakeDefaultOptions() + kOpts.DoLegacyResourceSort = true + k := krusty.MakeKustomizer(kOpts) + m, err := k.Run(v.fSys, v.dirPath) + if err != nil { + return err + } + v.yml, err = m.AsYaml() + if err != nil { + return err + } + sv := NewStreamVisitor( + bytes.NewReader(v.yml), v.mapper, v.dirPath, v.schema) + return sv.Visit(fn) +} diff --git a/vendor/k8s.io/cli-runtime/pkg/resource/visitor.go b/vendor/k8s.io/cli-runtime/pkg/resource/visitor.go index fbd52e12f201..25d244346519 100644 --- a/vendor/k8s.io/cli-runtime/pkg/resource/visitor.go +++ b/vendor/k8s.io/cli-runtime/pkg/resource/visitor.go @@ -30,9 +30,6 @@ import ( "golang.org/x/text/encoding/unicode" "golang.org/x/text/transform" - - "sigs.k8s.io/kustomize/pkg/fs" - "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -42,7 +39,6 @@ import ( utilerrors "k8s.io/apimachinery/pkg/util/errors" "k8s.io/apimachinery/pkg/util/yaml" "k8s.io/apimachinery/pkg/watch" - "k8s.io/cli-runtime/pkg/kustomize" ) const ( @@ -528,24 +524,6 @@ func (v *FileVisitor) Visit(fn VisitorFunc) error { return v.StreamVisitor.Visit(fn) } -// KustomizeVisitor is wrapper around a StreamVisitor, to handle Kustomization directories -type KustomizeVisitor struct { - Path string - *StreamVisitor -} - -// Visit in a KustomizeVisitor gets the output of Kustomize build and save it in the Streamvisitor -func (v *KustomizeVisitor) Visit(fn VisitorFunc) error { - fSys := fs.MakeRealFS() - var out bytes.Buffer - err := kustomize.RunKustomizeBuild(&out, fSys, v.Path) - if err != nil { - return err - } - v.StreamVisitor.Reader = bytes.NewReader(out.Bytes()) - return v.StreamVisitor.Visit(fn) -} - // StreamVisitor reads objects from an io.Reader and walks them. A stream visitor can only be // visited once. // TODO: depends on objects being in JSON format before being passed to decode - need to implement diff --git a/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1/mutatingwebhook.go b/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1/mutatingwebhook.go new file mode 100644 index 000000000000..eba37bafdbd3 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1/mutatingwebhook.go @@ -0,0 +1,141 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + admissionregistrationv1 "k8s.io/api/admissionregistration/v1" + metav1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// MutatingWebhookApplyConfiguration represents an declarative configuration of the MutatingWebhook type for use +// with apply. +type MutatingWebhookApplyConfiguration struct { + Name *string `json:"name,omitempty"` + ClientConfig *WebhookClientConfigApplyConfiguration `json:"clientConfig,omitempty"` + Rules []RuleWithOperationsApplyConfiguration `json:"rules,omitempty"` + FailurePolicy *admissionregistrationv1.FailurePolicyType `json:"failurePolicy,omitempty"` + MatchPolicy *admissionregistrationv1.MatchPolicyType `json:"matchPolicy,omitempty"` + NamespaceSelector *metav1.LabelSelectorApplyConfiguration `json:"namespaceSelector,omitempty"` + ObjectSelector *metav1.LabelSelectorApplyConfiguration `json:"objectSelector,omitempty"` + SideEffects *admissionregistrationv1.SideEffectClass `json:"sideEffects,omitempty"` + TimeoutSeconds *int32 `json:"timeoutSeconds,omitempty"` + AdmissionReviewVersions []string `json:"admissionReviewVersions,omitempty"` + ReinvocationPolicy *admissionregistrationv1.ReinvocationPolicyType `json:"reinvocationPolicy,omitempty"` +} + +// MutatingWebhookApplyConfiguration constructs an declarative configuration of the MutatingWebhook type for use with +// apply. +func MutatingWebhook() *MutatingWebhookApplyConfiguration { + return &MutatingWebhookApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *MutatingWebhookApplyConfiguration) WithName(value string) *MutatingWebhookApplyConfiguration { + b.Name = &value + return b +} + +// WithClientConfig sets the ClientConfig field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClientConfig field is set to the value of the last call. +func (b *MutatingWebhookApplyConfiguration) WithClientConfig(value *WebhookClientConfigApplyConfiguration) *MutatingWebhookApplyConfiguration { + b.ClientConfig = value + return b +} + +// WithRules adds the given value to the Rules field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Rules field. +func (b *MutatingWebhookApplyConfiguration) WithRules(values ...*RuleWithOperationsApplyConfiguration) *MutatingWebhookApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithRules") + } + b.Rules = append(b.Rules, *values[i]) + } + return b +} + +// WithFailurePolicy sets the FailurePolicy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FailurePolicy field is set to the value of the last call. +func (b *MutatingWebhookApplyConfiguration) WithFailurePolicy(value admissionregistrationv1.FailurePolicyType) *MutatingWebhookApplyConfiguration { + b.FailurePolicy = &value + return b +} + +// WithMatchPolicy sets the MatchPolicy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MatchPolicy field is set to the value of the last call. +func (b *MutatingWebhookApplyConfiguration) WithMatchPolicy(value admissionregistrationv1.MatchPolicyType) *MutatingWebhookApplyConfiguration { + b.MatchPolicy = &value + return b +} + +// WithNamespaceSelector sets the NamespaceSelector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NamespaceSelector field is set to the value of the last call. +func (b *MutatingWebhookApplyConfiguration) WithNamespaceSelector(value *metav1.LabelSelectorApplyConfiguration) *MutatingWebhookApplyConfiguration { + b.NamespaceSelector = value + return b +} + +// WithObjectSelector sets the ObjectSelector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ObjectSelector field is set to the value of the last call. +func (b *MutatingWebhookApplyConfiguration) WithObjectSelector(value *metav1.LabelSelectorApplyConfiguration) *MutatingWebhookApplyConfiguration { + b.ObjectSelector = value + return b +} + +// WithSideEffects sets the SideEffects field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SideEffects field is set to the value of the last call. +func (b *MutatingWebhookApplyConfiguration) WithSideEffects(value admissionregistrationv1.SideEffectClass) *MutatingWebhookApplyConfiguration { + b.SideEffects = &value + return b +} + +// WithTimeoutSeconds sets the TimeoutSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the TimeoutSeconds field is set to the value of the last call. +func (b *MutatingWebhookApplyConfiguration) WithTimeoutSeconds(value int32) *MutatingWebhookApplyConfiguration { + b.TimeoutSeconds = &value + return b +} + +// WithAdmissionReviewVersions adds the given value to the AdmissionReviewVersions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the AdmissionReviewVersions field. +func (b *MutatingWebhookApplyConfiguration) WithAdmissionReviewVersions(values ...string) *MutatingWebhookApplyConfiguration { + for i := range values { + b.AdmissionReviewVersions = append(b.AdmissionReviewVersions, values[i]) + } + return b +} + +// WithReinvocationPolicy sets the ReinvocationPolicy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReinvocationPolicy field is set to the value of the last call. +func (b *MutatingWebhookApplyConfiguration) WithReinvocationPolicy(value admissionregistrationv1.ReinvocationPolicyType) *MutatingWebhookApplyConfiguration { + b.ReinvocationPolicy = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1/mutatingwebhookconfiguration.go b/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1/mutatingwebhookconfiguration.go new file mode 100644 index 000000000000..6c1658804f43 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1/mutatingwebhookconfiguration.go @@ -0,0 +1,259 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + apiadmissionregistrationv1 "k8s.io/api/admissionregistration/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// MutatingWebhookConfigurationApplyConfiguration represents an declarative configuration of the MutatingWebhookConfiguration type for use +// with apply. +type MutatingWebhookConfigurationApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Webhooks []MutatingWebhookApplyConfiguration `json:"webhooks,omitempty"` +} + +// MutatingWebhookConfiguration constructs an declarative configuration of the MutatingWebhookConfiguration type for use with +// apply. +func MutatingWebhookConfiguration(name string) *MutatingWebhookConfigurationApplyConfiguration { + b := &MutatingWebhookConfigurationApplyConfiguration{} + b.WithName(name) + b.WithKind("MutatingWebhookConfiguration") + b.WithAPIVersion("admissionregistration.k8s.io/v1") + return b +} + +// ExtractMutatingWebhookConfiguration extracts the applied configuration owned by fieldManager from +// mutatingWebhookConfiguration. If no managedFields are found in mutatingWebhookConfiguration for fieldManager, a +// MutatingWebhookConfigurationApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// mutatingWebhookConfiguration must be a unmodified MutatingWebhookConfiguration API object that was retrieved from the Kubernetes API. +// ExtractMutatingWebhookConfiguration provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractMutatingWebhookConfiguration(mutatingWebhookConfiguration *apiadmissionregistrationv1.MutatingWebhookConfiguration, fieldManager string) (*MutatingWebhookConfigurationApplyConfiguration, error) { + b := &MutatingWebhookConfigurationApplyConfiguration{} + err := managedfields.ExtractInto(mutatingWebhookConfiguration, internal.Parser().Type("io.k8s.api.admissionregistration.v1.MutatingWebhookConfiguration"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(mutatingWebhookConfiguration.Name) + + b.WithKind("MutatingWebhookConfiguration") + b.WithAPIVersion("admissionregistration.k8s.io/v1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *MutatingWebhookConfigurationApplyConfiguration) WithKind(value string) *MutatingWebhookConfigurationApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *MutatingWebhookConfigurationApplyConfiguration) WithAPIVersion(value string) *MutatingWebhookConfigurationApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *MutatingWebhookConfigurationApplyConfiguration) WithName(value string) *MutatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *MutatingWebhookConfigurationApplyConfiguration) WithGenerateName(value string) *MutatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *MutatingWebhookConfigurationApplyConfiguration) WithNamespace(value string) *MutatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *MutatingWebhookConfigurationApplyConfiguration) WithSelfLink(value string) *MutatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *MutatingWebhookConfigurationApplyConfiguration) WithUID(value types.UID) *MutatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *MutatingWebhookConfigurationApplyConfiguration) WithResourceVersion(value string) *MutatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *MutatingWebhookConfigurationApplyConfiguration) WithGeneration(value int64) *MutatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *MutatingWebhookConfigurationApplyConfiguration) WithCreationTimestamp(value metav1.Time) *MutatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *MutatingWebhookConfigurationApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *MutatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *MutatingWebhookConfigurationApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *MutatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *MutatingWebhookConfigurationApplyConfiguration) WithLabels(entries map[string]string) *MutatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *MutatingWebhookConfigurationApplyConfiguration) WithAnnotations(entries map[string]string) *MutatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *MutatingWebhookConfigurationApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *MutatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *MutatingWebhookConfigurationApplyConfiguration) WithFinalizers(values ...string) *MutatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *MutatingWebhookConfigurationApplyConfiguration) WithClusterName(value string) *MutatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *MutatingWebhookConfigurationApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithWebhooks adds the given value to the Webhooks field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Webhooks field. +func (b *MutatingWebhookConfigurationApplyConfiguration) WithWebhooks(values ...*MutatingWebhookApplyConfiguration) *MutatingWebhookConfigurationApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithWebhooks") + } + b.Webhooks = append(b.Webhooks, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1/rule.go b/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1/rule.go new file mode 100644 index 000000000000..41d4179df40a --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1/rule.go @@ -0,0 +1,76 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/admissionregistration/v1" +) + +// RuleApplyConfiguration represents an declarative configuration of the Rule type for use +// with apply. +type RuleApplyConfiguration struct { + APIGroups []string `json:"apiGroups,omitempty"` + APIVersions []string `json:"apiVersions,omitempty"` + Resources []string `json:"resources,omitempty"` + Scope *v1.ScopeType `json:"scope,omitempty"` +} + +// RuleApplyConfiguration constructs an declarative configuration of the Rule type for use with +// apply. +func Rule() *RuleApplyConfiguration { + return &RuleApplyConfiguration{} +} + +// WithAPIGroups adds the given value to the APIGroups field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the APIGroups field. +func (b *RuleApplyConfiguration) WithAPIGroups(values ...string) *RuleApplyConfiguration { + for i := range values { + b.APIGroups = append(b.APIGroups, values[i]) + } + return b +} + +// WithAPIVersions adds the given value to the APIVersions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the APIVersions field. +func (b *RuleApplyConfiguration) WithAPIVersions(values ...string) *RuleApplyConfiguration { + for i := range values { + b.APIVersions = append(b.APIVersions, values[i]) + } + return b +} + +// WithResources adds the given value to the Resources field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Resources field. +func (b *RuleApplyConfiguration) WithResources(values ...string) *RuleApplyConfiguration { + for i := range values { + b.Resources = append(b.Resources, values[i]) + } + return b +} + +// WithScope sets the Scope field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Scope field is set to the value of the last call. +func (b *RuleApplyConfiguration) WithScope(value v1.ScopeType) *RuleApplyConfiguration { + b.Scope = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1/rulewithoperations.go b/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1/rulewithoperations.go new file mode 100644 index 000000000000..59bbb8fe3d0d --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1/rulewithoperations.go @@ -0,0 +1,84 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/admissionregistration/v1" +) + +// RuleWithOperationsApplyConfiguration represents an declarative configuration of the RuleWithOperations type for use +// with apply. +type RuleWithOperationsApplyConfiguration struct { + Operations []v1.OperationType `json:"operations,omitempty"` + RuleApplyConfiguration `json:",inline"` +} + +// RuleWithOperationsApplyConfiguration constructs an declarative configuration of the RuleWithOperations type for use with +// apply. +func RuleWithOperations() *RuleWithOperationsApplyConfiguration { + return &RuleWithOperationsApplyConfiguration{} +} + +// WithOperations adds the given value to the Operations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Operations field. +func (b *RuleWithOperationsApplyConfiguration) WithOperations(values ...v1.OperationType) *RuleWithOperationsApplyConfiguration { + for i := range values { + b.Operations = append(b.Operations, values[i]) + } + return b +} + +// WithAPIGroups adds the given value to the APIGroups field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the APIGroups field. +func (b *RuleWithOperationsApplyConfiguration) WithAPIGroups(values ...string) *RuleWithOperationsApplyConfiguration { + for i := range values { + b.APIGroups = append(b.APIGroups, values[i]) + } + return b +} + +// WithAPIVersions adds the given value to the APIVersions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the APIVersions field. +func (b *RuleWithOperationsApplyConfiguration) WithAPIVersions(values ...string) *RuleWithOperationsApplyConfiguration { + for i := range values { + b.APIVersions = append(b.APIVersions, values[i]) + } + return b +} + +// WithResources adds the given value to the Resources field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Resources field. +func (b *RuleWithOperationsApplyConfiguration) WithResources(values ...string) *RuleWithOperationsApplyConfiguration { + for i := range values { + b.Resources = append(b.Resources, values[i]) + } + return b +} + +// WithScope sets the Scope field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Scope field is set to the value of the last call. +func (b *RuleWithOperationsApplyConfiguration) WithScope(value v1.ScopeType) *RuleWithOperationsApplyConfiguration { + b.Scope = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1/servicereference.go b/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1/servicereference.go new file mode 100644 index 000000000000..2cd55d9ea207 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1/servicereference.go @@ -0,0 +1,66 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// ServiceReferenceApplyConfiguration represents an declarative configuration of the ServiceReference type for use +// with apply. +type ServiceReferenceApplyConfiguration struct { + Namespace *string `json:"namespace,omitempty"` + Name *string `json:"name,omitempty"` + Path *string `json:"path,omitempty"` + Port *int32 `json:"port,omitempty"` +} + +// ServiceReferenceApplyConfiguration constructs an declarative configuration of the ServiceReference type for use with +// apply. +func ServiceReference() *ServiceReferenceApplyConfiguration { + return &ServiceReferenceApplyConfiguration{} +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *ServiceReferenceApplyConfiguration) WithNamespace(value string) *ServiceReferenceApplyConfiguration { + b.Namespace = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ServiceReferenceApplyConfiguration) WithName(value string) *ServiceReferenceApplyConfiguration { + b.Name = &value + return b +} + +// WithPath sets the Path field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Path field is set to the value of the last call. +func (b *ServiceReferenceApplyConfiguration) WithPath(value string) *ServiceReferenceApplyConfiguration { + b.Path = &value + return b +} + +// WithPort sets the Port field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Port field is set to the value of the last call. +func (b *ServiceReferenceApplyConfiguration) WithPort(value int32) *ServiceReferenceApplyConfiguration { + b.Port = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1/validatingwebhook.go b/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1/validatingwebhook.go new file mode 100644 index 000000000000..d0691de107c0 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1/validatingwebhook.go @@ -0,0 +1,132 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + admissionregistrationv1 "k8s.io/api/admissionregistration/v1" + metav1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// ValidatingWebhookApplyConfiguration represents an declarative configuration of the ValidatingWebhook type for use +// with apply. +type ValidatingWebhookApplyConfiguration struct { + Name *string `json:"name,omitempty"` + ClientConfig *WebhookClientConfigApplyConfiguration `json:"clientConfig,omitempty"` + Rules []RuleWithOperationsApplyConfiguration `json:"rules,omitempty"` + FailurePolicy *admissionregistrationv1.FailurePolicyType `json:"failurePolicy,omitempty"` + MatchPolicy *admissionregistrationv1.MatchPolicyType `json:"matchPolicy,omitempty"` + NamespaceSelector *metav1.LabelSelectorApplyConfiguration `json:"namespaceSelector,omitempty"` + ObjectSelector *metav1.LabelSelectorApplyConfiguration `json:"objectSelector,omitempty"` + SideEffects *admissionregistrationv1.SideEffectClass `json:"sideEffects,omitempty"` + TimeoutSeconds *int32 `json:"timeoutSeconds,omitempty"` + AdmissionReviewVersions []string `json:"admissionReviewVersions,omitempty"` +} + +// ValidatingWebhookApplyConfiguration constructs an declarative configuration of the ValidatingWebhook type for use with +// apply. +func ValidatingWebhook() *ValidatingWebhookApplyConfiguration { + return &ValidatingWebhookApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ValidatingWebhookApplyConfiguration) WithName(value string) *ValidatingWebhookApplyConfiguration { + b.Name = &value + return b +} + +// WithClientConfig sets the ClientConfig field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClientConfig field is set to the value of the last call. +func (b *ValidatingWebhookApplyConfiguration) WithClientConfig(value *WebhookClientConfigApplyConfiguration) *ValidatingWebhookApplyConfiguration { + b.ClientConfig = value + return b +} + +// WithRules adds the given value to the Rules field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Rules field. +func (b *ValidatingWebhookApplyConfiguration) WithRules(values ...*RuleWithOperationsApplyConfiguration) *ValidatingWebhookApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithRules") + } + b.Rules = append(b.Rules, *values[i]) + } + return b +} + +// WithFailurePolicy sets the FailurePolicy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FailurePolicy field is set to the value of the last call. +func (b *ValidatingWebhookApplyConfiguration) WithFailurePolicy(value admissionregistrationv1.FailurePolicyType) *ValidatingWebhookApplyConfiguration { + b.FailurePolicy = &value + return b +} + +// WithMatchPolicy sets the MatchPolicy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MatchPolicy field is set to the value of the last call. +func (b *ValidatingWebhookApplyConfiguration) WithMatchPolicy(value admissionregistrationv1.MatchPolicyType) *ValidatingWebhookApplyConfiguration { + b.MatchPolicy = &value + return b +} + +// WithNamespaceSelector sets the NamespaceSelector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NamespaceSelector field is set to the value of the last call. +func (b *ValidatingWebhookApplyConfiguration) WithNamespaceSelector(value *metav1.LabelSelectorApplyConfiguration) *ValidatingWebhookApplyConfiguration { + b.NamespaceSelector = value + return b +} + +// WithObjectSelector sets the ObjectSelector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ObjectSelector field is set to the value of the last call. +func (b *ValidatingWebhookApplyConfiguration) WithObjectSelector(value *metav1.LabelSelectorApplyConfiguration) *ValidatingWebhookApplyConfiguration { + b.ObjectSelector = value + return b +} + +// WithSideEffects sets the SideEffects field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SideEffects field is set to the value of the last call. +func (b *ValidatingWebhookApplyConfiguration) WithSideEffects(value admissionregistrationv1.SideEffectClass) *ValidatingWebhookApplyConfiguration { + b.SideEffects = &value + return b +} + +// WithTimeoutSeconds sets the TimeoutSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the TimeoutSeconds field is set to the value of the last call. +func (b *ValidatingWebhookApplyConfiguration) WithTimeoutSeconds(value int32) *ValidatingWebhookApplyConfiguration { + b.TimeoutSeconds = &value + return b +} + +// WithAdmissionReviewVersions adds the given value to the AdmissionReviewVersions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the AdmissionReviewVersions field. +func (b *ValidatingWebhookApplyConfiguration) WithAdmissionReviewVersions(values ...string) *ValidatingWebhookApplyConfiguration { + for i := range values { + b.AdmissionReviewVersions = append(b.AdmissionReviewVersions, values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1/validatingwebhookconfiguration.go b/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1/validatingwebhookconfiguration.go new file mode 100644 index 000000000000..f7802f540ff1 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1/validatingwebhookconfiguration.go @@ -0,0 +1,259 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + apiadmissionregistrationv1 "k8s.io/api/admissionregistration/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// ValidatingWebhookConfigurationApplyConfiguration represents an declarative configuration of the ValidatingWebhookConfiguration type for use +// with apply. +type ValidatingWebhookConfigurationApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Webhooks []ValidatingWebhookApplyConfiguration `json:"webhooks,omitempty"` +} + +// ValidatingWebhookConfiguration constructs an declarative configuration of the ValidatingWebhookConfiguration type for use with +// apply. +func ValidatingWebhookConfiguration(name string) *ValidatingWebhookConfigurationApplyConfiguration { + b := &ValidatingWebhookConfigurationApplyConfiguration{} + b.WithName(name) + b.WithKind("ValidatingWebhookConfiguration") + b.WithAPIVersion("admissionregistration.k8s.io/v1") + return b +} + +// ExtractValidatingWebhookConfiguration extracts the applied configuration owned by fieldManager from +// validatingWebhookConfiguration. If no managedFields are found in validatingWebhookConfiguration for fieldManager, a +// ValidatingWebhookConfigurationApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// validatingWebhookConfiguration must be a unmodified ValidatingWebhookConfiguration API object that was retrieved from the Kubernetes API. +// ExtractValidatingWebhookConfiguration provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractValidatingWebhookConfiguration(validatingWebhookConfiguration *apiadmissionregistrationv1.ValidatingWebhookConfiguration, fieldManager string) (*ValidatingWebhookConfigurationApplyConfiguration, error) { + b := &ValidatingWebhookConfigurationApplyConfiguration{} + err := managedfields.ExtractInto(validatingWebhookConfiguration, internal.Parser().Type("io.k8s.api.admissionregistration.v1.ValidatingWebhookConfiguration"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(validatingWebhookConfiguration.Name) + + b.WithKind("ValidatingWebhookConfiguration") + b.WithAPIVersion("admissionregistration.k8s.io/v1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *ValidatingWebhookConfigurationApplyConfiguration) WithKind(value string) *ValidatingWebhookConfigurationApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *ValidatingWebhookConfigurationApplyConfiguration) WithAPIVersion(value string) *ValidatingWebhookConfigurationApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ValidatingWebhookConfigurationApplyConfiguration) WithName(value string) *ValidatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *ValidatingWebhookConfigurationApplyConfiguration) WithGenerateName(value string) *ValidatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *ValidatingWebhookConfigurationApplyConfiguration) WithNamespace(value string) *ValidatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *ValidatingWebhookConfigurationApplyConfiguration) WithSelfLink(value string) *ValidatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *ValidatingWebhookConfigurationApplyConfiguration) WithUID(value types.UID) *ValidatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *ValidatingWebhookConfigurationApplyConfiguration) WithResourceVersion(value string) *ValidatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *ValidatingWebhookConfigurationApplyConfiguration) WithGeneration(value int64) *ValidatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *ValidatingWebhookConfigurationApplyConfiguration) WithCreationTimestamp(value metav1.Time) *ValidatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *ValidatingWebhookConfigurationApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *ValidatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *ValidatingWebhookConfigurationApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *ValidatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *ValidatingWebhookConfigurationApplyConfiguration) WithLabels(entries map[string]string) *ValidatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *ValidatingWebhookConfigurationApplyConfiguration) WithAnnotations(entries map[string]string) *ValidatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *ValidatingWebhookConfigurationApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *ValidatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *ValidatingWebhookConfigurationApplyConfiguration) WithFinalizers(values ...string) *ValidatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *ValidatingWebhookConfigurationApplyConfiguration) WithClusterName(value string) *ValidatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *ValidatingWebhookConfigurationApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithWebhooks adds the given value to the Webhooks field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Webhooks field. +func (b *ValidatingWebhookConfigurationApplyConfiguration) WithWebhooks(values ...*ValidatingWebhookApplyConfiguration) *ValidatingWebhookConfigurationApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithWebhooks") + } + b.Webhooks = append(b.Webhooks, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1/webhookclientconfig.go b/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1/webhookclientconfig.go new file mode 100644 index 000000000000..aa358ae20594 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1/webhookclientconfig.go @@ -0,0 +1,59 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// WebhookClientConfigApplyConfiguration represents an declarative configuration of the WebhookClientConfig type for use +// with apply. +type WebhookClientConfigApplyConfiguration struct { + URL *string `json:"url,omitempty"` + Service *ServiceReferenceApplyConfiguration `json:"service,omitempty"` + CABundle []byte `json:"caBundle,omitempty"` +} + +// WebhookClientConfigApplyConfiguration constructs an declarative configuration of the WebhookClientConfig type for use with +// apply. +func WebhookClientConfig() *WebhookClientConfigApplyConfiguration { + return &WebhookClientConfigApplyConfiguration{} +} + +// WithURL sets the URL field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the URL field is set to the value of the last call. +func (b *WebhookClientConfigApplyConfiguration) WithURL(value string) *WebhookClientConfigApplyConfiguration { + b.URL = &value + return b +} + +// WithService sets the Service field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Service field is set to the value of the last call. +func (b *WebhookClientConfigApplyConfiguration) WithService(value *ServiceReferenceApplyConfiguration) *WebhookClientConfigApplyConfiguration { + b.Service = value + return b +} + +// WithCABundle adds the given value to the CABundle field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the CABundle field. +func (b *WebhookClientConfigApplyConfiguration) WithCABundle(values ...byte) *WebhookClientConfigApplyConfiguration { + for i := range values { + b.CABundle = append(b.CABundle, values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/mutatingwebhook.go b/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/mutatingwebhook.go new file mode 100644 index 000000000000..ddb728aff8fa --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/mutatingwebhook.go @@ -0,0 +1,141 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + admissionregistrationv1beta1 "k8s.io/api/admissionregistration/v1beta1" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// MutatingWebhookApplyConfiguration represents an declarative configuration of the MutatingWebhook type for use +// with apply. +type MutatingWebhookApplyConfiguration struct { + Name *string `json:"name,omitempty"` + ClientConfig *WebhookClientConfigApplyConfiguration `json:"clientConfig,omitempty"` + Rules []RuleWithOperationsApplyConfiguration `json:"rules,omitempty"` + FailurePolicy *admissionregistrationv1beta1.FailurePolicyType `json:"failurePolicy,omitempty"` + MatchPolicy *admissionregistrationv1beta1.MatchPolicyType `json:"matchPolicy,omitempty"` + NamespaceSelector *v1.LabelSelectorApplyConfiguration `json:"namespaceSelector,omitempty"` + ObjectSelector *v1.LabelSelectorApplyConfiguration `json:"objectSelector,omitempty"` + SideEffects *admissionregistrationv1beta1.SideEffectClass `json:"sideEffects,omitempty"` + TimeoutSeconds *int32 `json:"timeoutSeconds,omitempty"` + AdmissionReviewVersions []string `json:"admissionReviewVersions,omitempty"` + ReinvocationPolicy *admissionregistrationv1beta1.ReinvocationPolicyType `json:"reinvocationPolicy,omitempty"` +} + +// MutatingWebhookApplyConfiguration constructs an declarative configuration of the MutatingWebhook type for use with +// apply. +func MutatingWebhook() *MutatingWebhookApplyConfiguration { + return &MutatingWebhookApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *MutatingWebhookApplyConfiguration) WithName(value string) *MutatingWebhookApplyConfiguration { + b.Name = &value + return b +} + +// WithClientConfig sets the ClientConfig field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClientConfig field is set to the value of the last call. +func (b *MutatingWebhookApplyConfiguration) WithClientConfig(value *WebhookClientConfigApplyConfiguration) *MutatingWebhookApplyConfiguration { + b.ClientConfig = value + return b +} + +// WithRules adds the given value to the Rules field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Rules field. +func (b *MutatingWebhookApplyConfiguration) WithRules(values ...*RuleWithOperationsApplyConfiguration) *MutatingWebhookApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithRules") + } + b.Rules = append(b.Rules, *values[i]) + } + return b +} + +// WithFailurePolicy sets the FailurePolicy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FailurePolicy field is set to the value of the last call. +func (b *MutatingWebhookApplyConfiguration) WithFailurePolicy(value admissionregistrationv1beta1.FailurePolicyType) *MutatingWebhookApplyConfiguration { + b.FailurePolicy = &value + return b +} + +// WithMatchPolicy sets the MatchPolicy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MatchPolicy field is set to the value of the last call. +func (b *MutatingWebhookApplyConfiguration) WithMatchPolicy(value admissionregistrationv1beta1.MatchPolicyType) *MutatingWebhookApplyConfiguration { + b.MatchPolicy = &value + return b +} + +// WithNamespaceSelector sets the NamespaceSelector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NamespaceSelector field is set to the value of the last call. +func (b *MutatingWebhookApplyConfiguration) WithNamespaceSelector(value *v1.LabelSelectorApplyConfiguration) *MutatingWebhookApplyConfiguration { + b.NamespaceSelector = value + return b +} + +// WithObjectSelector sets the ObjectSelector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ObjectSelector field is set to the value of the last call. +func (b *MutatingWebhookApplyConfiguration) WithObjectSelector(value *v1.LabelSelectorApplyConfiguration) *MutatingWebhookApplyConfiguration { + b.ObjectSelector = value + return b +} + +// WithSideEffects sets the SideEffects field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SideEffects field is set to the value of the last call. +func (b *MutatingWebhookApplyConfiguration) WithSideEffects(value admissionregistrationv1beta1.SideEffectClass) *MutatingWebhookApplyConfiguration { + b.SideEffects = &value + return b +} + +// WithTimeoutSeconds sets the TimeoutSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the TimeoutSeconds field is set to the value of the last call. +func (b *MutatingWebhookApplyConfiguration) WithTimeoutSeconds(value int32) *MutatingWebhookApplyConfiguration { + b.TimeoutSeconds = &value + return b +} + +// WithAdmissionReviewVersions adds the given value to the AdmissionReviewVersions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the AdmissionReviewVersions field. +func (b *MutatingWebhookApplyConfiguration) WithAdmissionReviewVersions(values ...string) *MutatingWebhookApplyConfiguration { + for i := range values { + b.AdmissionReviewVersions = append(b.AdmissionReviewVersions, values[i]) + } + return b +} + +// WithReinvocationPolicy sets the ReinvocationPolicy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReinvocationPolicy field is set to the value of the last call. +func (b *MutatingWebhookApplyConfiguration) WithReinvocationPolicy(value admissionregistrationv1beta1.ReinvocationPolicyType) *MutatingWebhookApplyConfiguration { + b.ReinvocationPolicy = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/mutatingwebhookconfiguration.go b/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/mutatingwebhookconfiguration.go new file mode 100644 index 000000000000..47ed1e252284 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/mutatingwebhookconfiguration.go @@ -0,0 +1,259 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + admissionregistrationv1beta1 "k8s.io/api/admissionregistration/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// MutatingWebhookConfigurationApplyConfiguration represents an declarative configuration of the MutatingWebhookConfiguration type for use +// with apply. +type MutatingWebhookConfigurationApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Webhooks []MutatingWebhookApplyConfiguration `json:"webhooks,omitempty"` +} + +// MutatingWebhookConfiguration constructs an declarative configuration of the MutatingWebhookConfiguration type for use with +// apply. +func MutatingWebhookConfiguration(name string) *MutatingWebhookConfigurationApplyConfiguration { + b := &MutatingWebhookConfigurationApplyConfiguration{} + b.WithName(name) + b.WithKind("MutatingWebhookConfiguration") + b.WithAPIVersion("admissionregistration.k8s.io/v1beta1") + return b +} + +// ExtractMutatingWebhookConfiguration extracts the applied configuration owned by fieldManager from +// mutatingWebhookConfiguration. If no managedFields are found in mutatingWebhookConfiguration for fieldManager, a +// MutatingWebhookConfigurationApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// mutatingWebhookConfiguration must be a unmodified MutatingWebhookConfiguration API object that was retrieved from the Kubernetes API. +// ExtractMutatingWebhookConfiguration provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractMutatingWebhookConfiguration(mutatingWebhookConfiguration *admissionregistrationv1beta1.MutatingWebhookConfiguration, fieldManager string) (*MutatingWebhookConfigurationApplyConfiguration, error) { + b := &MutatingWebhookConfigurationApplyConfiguration{} + err := managedfields.ExtractInto(mutatingWebhookConfiguration, internal.Parser().Type("io.k8s.api.admissionregistration.v1beta1.MutatingWebhookConfiguration"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(mutatingWebhookConfiguration.Name) + + b.WithKind("MutatingWebhookConfiguration") + b.WithAPIVersion("admissionregistration.k8s.io/v1beta1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *MutatingWebhookConfigurationApplyConfiguration) WithKind(value string) *MutatingWebhookConfigurationApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *MutatingWebhookConfigurationApplyConfiguration) WithAPIVersion(value string) *MutatingWebhookConfigurationApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *MutatingWebhookConfigurationApplyConfiguration) WithName(value string) *MutatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *MutatingWebhookConfigurationApplyConfiguration) WithGenerateName(value string) *MutatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *MutatingWebhookConfigurationApplyConfiguration) WithNamespace(value string) *MutatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *MutatingWebhookConfigurationApplyConfiguration) WithSelfLink(value string) *MutatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *MutatingWebhookConfigurationApplyConfiguration) WithUID(value types.UID) *MutatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *MutatingWebhookConfigurationApplyConfiguration) WithResourceVersion(value string) *MutatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *MutatingWebhookConfigurationApplyConfiguration) WithGeneration(value int64) *MutatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *MutatingWebhookConfigurationApplyConfiguration) WithCreationTimestamp(value metav1.Time) *MutatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *MutatingWebhookConfigurationApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *MutatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *MutatingWebhookConfigurationApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *MutatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *MutatingWebhookConfigurationApplyConfiguration) WithLabels(entries map[string]string) *MutatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *MutatingWebhookConfigurationApplyConfiguration) WithAnnotations(entries map[string]string) *MutatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *MutatingWebhookConfigurationApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *MutatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *MutatingWebhookConfigurationApplyConfiguration) WithFinalizers(values ...string) *MutatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *MutatingWebhookConfigurationApplyConfiguration) WithClusterName(value string) *MutatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *MutatingWebhookConfigurationApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithWebhooks adds the given value to the Webhooks field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Webhooks field. +func (b *MutatingWebhookConfigurationApplyConfiguration) WithWebhooks(values ...*MutatingWebhookApplyConfiguration) *MutatingWebhookConfigurationApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithWebhooks") + } + b.Webhooks = append(b.Webhooks, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/rule.go b/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/rule.go new file mode 100644 index 000000000000..21151b99809f --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/rule.go @@ -0,0 +1,76 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1beta1 "k8s.io/api/admissionregistration/v1beta1" +) + +// RuleApplyConfiguration represents an declarative configuration of the Rule type for use +// with apply. +type RuleApplyConfiguration struct { + APIGroups []string `json:"apiGroups,omitempty"` + APIVersions []string `json:"apiVersions,omitempty"` + Resources []string `json:"resources,omitempty"` + Scope *v1beta1.ScopeType `json:"scope,omitempty"` +} + +// RuleApplyConfiguration constructs an declarative configuration of the Rule type for use with +// apply. +func Rule() *RuleApplyConfiguration { + return &RuleApplyConfiguration{} +} + +// WithAPIGroups adds the given value to the APIGroups field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the APIGroups field. +func (b *RuleApplyConfiguration) WithAPIGroups(values ...string) *RuleApplyConfiguration { + for i := range values { + b.APIGroups = append(b.APIGroups, values[i]) + } + return b +} + +// WithAPIVersions adds the given value to the APIVersions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the APIVersions field. +func (b *RuleApplyConfiguration) WithAPIVersions(values ...string) *RuleApplyConfiguration { + for i := range values { + b.APIVersions = append(b.APIVersions, values[i]) + } + return b +} + +// WithResources adds the given value to the Resources field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Resources field. +func (b *RuleApplyConfiguration) WithResources(values ...string) *RuleApplyConfiguration { + for i := range values { + b.Resources = append(b.Resources, values[i]) + } + return b +} + +// WithScope sets the Scope field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Scope field is set to the value of the last call. +func (b *RuleApplyConfiguration) WithScope(value v1beta1.ScopeType) *RuleApplyConfiguration { + b.Scope = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/rulewithoperations.go b/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/rulewithoperations.go new file mode 100644 index 000000000000..e072edb85a14 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/rulewithoperations.go @@ -0,0 +1,84 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1beta1 "k8s.io/api/admissionregistration/v1beta1" +) + +// RuleWithOperationsApplyConfiguration represents an declarative configuration of the RuleWithOperations type for use +// with apply. +type RuleWithOperationsApplyConfiguration struct { + Operations []v1beta1.OperationType `json:"operations,omitempty"` + RuleApplyConfiguration `json:",inline"` +} + +// RuleWithOperationsApplyConfiguration constructs an declarative configuration of the RuleWithOperations type for use with +// apply. +func RuleWithOperations() *RuleWithOperationsApplyConfiguration { + return &RuleWithOperationsApplyConfiguration{} +} + +// WithOperations adds the given value to the Operations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Operations field. +func (b *RuleWithOperationsApplyConfiguration) WithOperations(values ...v1beta1.OperationType) *RuleWithOperationsApplyConfiguration { + for i := range values { + b.Operations = append(b.Operations, values[i]) + } + return b +} + +// WithAPIGroups adds the given value to the APIGroups field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the APIGroups field. +func (b *RuleWithOperationsApplyConfiguration) WithAPIGroups(values ...string) *RuleWithOperationsApplyConfiguration { + for i := range values { + b.APIGroups = append(b.APIGroups, values[i]) + } + return b +} + +// WithAPIVersions adds the given value to the APIVersions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the APIVersions field. +func (b *RuleWithOperationsApplyConfiguration) WithAPIVersions(values ...string) *RuleWithOperationsApplyConfiguration { + for i := range values { + b.APIVersions = append(b.APIVersions, values[i]) + } + return b +} + +// WithResources adds the given value to the Resources field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Resources field. +func (b *RuleWithOperationsApplyConfiguration) WithResources(values ...string) *RuleWithOperationsApplyConfiguration { + for i := range values { + b.Resources = append(b.Resources, values[i]) + } + return b +} + +// WithScope sets the Scope field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Scope field is set to the value of the last call. +func (b *RuleWithOperationsApplyConfiguration) WithScope(value v1beta1.ScopeType) *RuleWithOperationsApplyConfiguration { + b.Scope = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/servicereference.go b/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/servicereference.go new file mode 100644 index 000000000000..c21b57490853 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/servicereference.go @@ -0,0 +1,66 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// ServiceReferenceApplyConfiguration represents an declarative configuration of the ServiceReference type for use +// with apply. +type ServiceReferenceApplyConfiguration struct { + Namespace *string `json:"namespace,omitempty"` + Name *string `json:"name,omitempty"` + Path *string `json:"path,omitempty"` + Port *int32 `json:"port,omitempty"` +} + +// ServiceReferenceApplyConfiguration constructs an declarative configuration of the ServiceReference type for use with +// apply. +func ServiceReference() *ServiceReferenceApplyConfiguration { + return &ServiceReferenceApplyConfiguration{} +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *ServiceReferenceApplyConfiguration) WithNamespace(value string) *ServiceReferenceApplyConfiguration { + b.Namespace = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ServiceReferenceApplyConfiguration) WithName(value string) *ServiceReferenceApplyConfiguration { + b.Name = &value + return b +} + +// WithPath sets the Path field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Path field is set to the value of the last call. +func (b *ServiceReferenceApplyConfiguration) WithPath(value string) *ServiceReferenceApplyConfiguration { + b.Path = &value + return b +} + +// WithPort sets the Port field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Port field is set to the value of the last call. +func (b *ServiceReferenceApplyConfiguration) WithPort(value int32) *ServiceReferenceApplyConfiguration { + b.Port = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/validatingwebhook.go b/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/validatingwebhook.go new file mode 100644 index 000000000000..8ca0e9cbeb6f --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/validatingwebhook.go @@ -0,0 +1,132 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + admissionregistrationv1beta1 "k8s.io/api/admissionregistration/v1beta1" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// ValidatingWebhookApplyConfiguration represents an declarative configuration of the ValidatingWebhook type for use +// with apply. +type ValidatingWebhookApplyConfiguration struct { + Name *string `json:"name,omitempty"` + ClientConfig *WebhookClientConfigApplyConfiguration `json:"clientConfig,omitempty"` + Rules []RuleWithOperationsApplyConfiguration `json:"rules,omitempty"` + FailurePolicy *admissionregistrationv1beta1.FailurePolicyType `json:"failurePolicy,omitempty"` + MatchPolicy *admissionregistrationv1beta1.MatchPolicyType `json:"matchPolicy,omitempty"` + NamespaceSelector *v1.LabelSelectorApplyConfiguration `json:"namespaceSelector,omitempty"` + ObjectSelector *v1.LabelSelectorApplyConfiguration `json:"objectSelector,omitempty"` + SideEffects *admissionregistrationv1beta1.SideEffectClass `json:"sideEffects,omitempty"` + TimeoutSeconds *int32 `json:"timeoutSeconds,omitempty"` + AdmissionReviewVersions []string `json:"admissionReviewVersions,omitempty"` +} + +// ValidatingWebhookApplyConfiguration constructs an declarative configuration of the ValidatingWebhook type for use with +// apply. +func ValidatingWebhook() *ValidatingWebhookApplyConfiguration { + return &ValidatingWebhookApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ValidatingWebhookApplyConfiguration) WithName(value string) *ValidatingWebhookApplyConfiguration { + b.Name = &value + return b +} + +// WithClientConfig sets the ClientConfig field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClientConfig field is set to the value of the last call. +func (b *ValidatingWebhookApplyConfiguration) WithClientConfig(value *WebhookClientConfigApplyConfiguration) *ValidatingWebhookApplyConfiguration { + b.ClientConfig = value + return b +} + +// WithRules adds the given value to the Rules field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Rules field. +func (b *ValidatingWebhookApplyConfiguration) WithRules(values ...*RuleWithOperationsApplyConfiguration) *ValidatingWebhookApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithRules") + } + b.Rules = append(b.Rules, *values[i]) + } + return b +} + +// WithFailurePolicy sets the FailurePolicy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FailurePolicy field is set to the value of the last call. +func (b *ValidatingWebhookApplyConfiguration) WithFailurePolicy(value admissionregistrationv1beta1.FailurePolicyType) *ValidatingWebhookApplyConfiguration { + b.FailurePolicy = &value + return b +} + +// WithMatchPolicy sets the MatchPolicy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MatchPolicy field is set to the value of the last call. +func (b *ValidatingWebhookApplyConfiguration) WithMatchPolicy(value admissionregistrationv1beta1.MatchPolicyType) *ValidatingWebhookApplyConfiguration { + b.MatchPolicy = &value + return b +} + +// WithNamespaceSelector sets the NamespaceSelector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NamespaceSelector field is set to the value of the last call. +func (b *ValidatingWebhookApplyConfiguration) WithNamespaceSelector(value *v1.LabelSelectorApplyConfiguration) *ValidatingWebhookApplyConfiguration { + b.NamespaceSelector = value + return b +} + +// WithObjectSelector sets the ObjectSelector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ObjectSelector field is set to the value of the last call. +func (b *ValidatingWebhookApplyConfiguration) WithObjectSelector(value *v1.LabelSelectorApplyConfiguration) *ValidatingWebhookApplyConfiguration { + b.ObjectSelector = value + return b +} + +// WithSideEffects sets the SideEffects field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SideEffects field is set to the value of the last call. +func (b *ValidatingWebhookApplyConfiguration) WithSideEffects(value admissionregistrationv1beta1.SideEffectClass) *ValidatingWebhookApplyConfiguration { + b.SideEffects = &value + return b +} + +// WithTimeoutSeconds sets the TimeoutSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the TimeoutSeconds field is set to the value of the last call. +func (b *ValidatingWebhookApplyConfiguration) WithTimeoutSeconds(value int32) *ValidatingWebhookApplyConfiguration { + b.TimeoutSeconds = &value + return b +} + +// WithAdmissionReviewVersions adds the given value to the AdmissionReviewVersions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the AdmissionReviewVersions field. +func (b *ValidatingWebhookApplyConfiguration) WithAdmissionReviewVersions(values ...string) *ValidatingWebhookApplyConfiguration { + for i := range values { + b.AdmissionReviewVersions = append(b.AdmissionReviewVersions, values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/validatingwebhookconfiguration.go b/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/validatingwebhookconfiguration.go new file mode 100644 index 000000000000..dac1c27a0996 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/validatingwebhookconfiguration.go @@ -0,0 +1,259 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + admissionregistrationv1beta1 "k8s.io/api/admissionregistration/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// ValidatingWebhookConfigurationApplyConfiguration represents an declarative configuration of the ValidatingWebhookConfiguration type for use +// with apply. +type ValidatingWebhookConfigurationApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Webhooks []ValidatingWebhookApplyConfiguration `json:"webhooks,omitempty"` +} + +// ValidatingWebhookConfiguration constructs an declarative configuration of the ValidatingWebhookConfiguration type for use with +// apply. +func ValidatingWebhookConfiguration(name string) *ValidatingWebhookConfigurationApplyConfiguration { + b := &ValidatingWebhookConfigurationApplyConfiguration{} + b.WithName(name) + b.WithKind("ValidatingWebhookConfiguration") + b.WithAPIVersion("admissionregistration.k8s.io/v1beta1") + return b +} + +// ExtractValidatingWebhookConfiguration extracts the applied configuration owned by fieldManager from +// validatingWebhookConfiguration. If no managedFields are found in validatingWebhookConfiguration for fieldManager, a +// ValidatingWebhookConfigurationApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// validatingWebhookConfiguration must be a unmodified ValidatingWebhookConfiguration API object that was retrieved from the Kubernetes API. +// ExtractValidatingWebhookConfiguration provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractValidatingWebhookConfiguration(validatingWebhookConfiguration *admissionregistrationv1beta1.ValidatingWebhookConfiguration, fieldManager string) (*ValidatingWebhookConfigurationApplyConfiguration, error) { + b := &ValidatingWebhookConfigurationApplyConfiguration{} + err := managedfields.ExtractInto(validatingWebhookConfiguration, internal.Parser().Type("io.k8s.api.admissionregistration.v1beta1.ValidatingWebhookConfiguration"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(validatingWebhookConfiguration.Name) + + b.WithKind("ValidatingWebhookConfiguration") + b.WithAPIVersion("admissionregistration.k8s.io/v1beta1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *ValidatingWebhookConfigurationApplyConfiguration) WithKind(value string) *ValidatingWebhookConfigurationApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *ValidatingWebhookConfigurationApplyConfiguration) WithAPIVersion(value string) *ValidatingWebhookConfigurationApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ValidatingWebhookConfigurationApplyConfiguration) WithName(value string) *ValidatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *ValidatingWebhookConfigurationApplyConfiguration) WithGenerateName(value string) *ValidatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *ValidatingWebhookConfigurationApplyConfiguration) WithNamespace(value string) *ValidatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *ValidatingWebhookConfigurationApplyConfiguration) WithSelfLink(value string) *ValidatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *ValidatingWebhookConfigurationApplyConfiguration) WithUID(value types.UID) *ValidatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *ValidatingWebhookConfigurationApplyConfiguration) WithResourceVersion(value string) *ValidatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *ValidatingWebhookConfigurationApplyConfiguration) WithGeneration(value int64) *ValidatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *ValidatingWebhookConfigurationApplyConfiguration) WithCreationTimestamp(value metav1.Time) *ValidatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *ValidatingWebhookConfigurationApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *ValidatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *ValidatingWebhookConfigurationApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *ValidatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *ValidatingWebhookConfigurationApplyConfiguration) WithLabels(entries map[string]string) *ValidatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *ValidatingWebhookConfigurationApplyConfiguration) WithAnnotations(entries map[string]string) *ValidatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *ValidatingWebhookConfigurationApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *ValidatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *ValidatingWebhookConfigurationApplyConfiguration) WithFinalizers(values ...string) *ValidatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *ValidatingWebhookConfigurationApplyConfiguration) WithClusterName(value string) *ValidatingWebhookConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *ValidatingWebhookConfigurationApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithWebhooks adds the given value to the Webhooks field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Webhooks field. +func (b *ValidatingWebhookConfigurationApplyConfiguration) WithWebhooks(values ...*ValidatingWebhookApplyConfiguration) *ValidatingWebhookConfigurationApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithWebhooks") + } + b.Webhooks = append(b.Webhooks, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/webhookclientconfig.go b/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/webhookclientconfig.go new file mode 100644 index 000000000000..490f9d5f3f8f --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/webhookclientconfig.go @@ -0,0 +1,59 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// WebhookClientConfigApplyConfiguration represents an declarative configuration of the WebhookClientConfig type for use +// with apply. +type WebhookClientConfigApplyConfiguration struct { + URL *string `json:"url,omitempty"` + Service *ServiceReferenceApplyConfiguration `json:"service,omitempty"` + CABundle []byte `json:"caBundle,omitempty"` +} + +// WebhookClientConfigApplyConfiguration constructs an declarative configuration of the WebhookClientConfig type for use with +// apply. +func WebhookClientConfig() *WebhookClientConfigApplyConfiguration { + return &WebhookClientConfigApplyConfiguration{} +} + +// WithURL sets the URL field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the URL field is set to the value of the last call. +func (b *WebhookClientConfigApplyConfiguration) WithURL(value string) *WebhookClientConfigApplyConfiguration { + b.URL = &value + return b +} + +// WithService sets the Service field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Service field is set to the value of the last call. +func (b *WebhookClientConfigApplyConfiguration) WithService(value *ServiceReferenceApplyConfiguration) *WebhookClientConfigApplyConfiguration { + b.Service = value + return b +} + +// WithCABundle adds the given value to the CABundle field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the CABundle field. +func (b *WebhookClientConfigApplyConfiguration) WithCABundle(values ...byte) *WebhookClientConfigApplyConfiguration { + for i := range values { + b.CABundle = append(b.CABundle, values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apiserverinternal/v1alpha1/serverstorageversion.go b/vendor/k8s.io/client-go/applyconfigurations/apiserverinternal/v1alpha1/serverstorageversion.go new file mode 100644 index 000000000000..d36f7603c784 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apiserverinternal/v1alpha1/serverstorageversion.go @@ -0,0 +1,59 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +// ServerStorageVersionApplyConfiguration represents an declarative configuration of the ServerStorageVersion type for use +// with apply. +type ServerStorageVersionApplyConfiguration struct { + APIServerID *string `json:"apiServerID,omitempty"` + EncodingVersion *string `json:"encodingVersion,omitempty"` + DecodableVersions []string `json:"decodableVersions,omitempty"` +} + +// ServerStorageVersionApplyConfiguration constructs an declarative configuration of the ServerStorageVersion type for use with +// apply. +func ServerStorageVersion() *ServerStorageVersionApplyConfiguration { + return &ServerStorageVersionApplyConfiguration{} +} + +// WithAPIServerID sets the APIServerID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIServerID field is set to the value of the last call. +func (b *ServerStorageVersionApplyConfiguration) WithAPIServerID(value string) *ServerStorageVersionApplyConfiguration { + b.APIServerID = &value + return b +} + +// WithEncodingVersion sets the EncodingVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the EncodingVersion field is set to the value of the last call. +func (b *ServerStorageVersionApplyConfiguration) WithEncodingVersion(value string) *ServerStorageVersionApplyConfiguration { + b.EncodingVersion = &value + return b +} + +// WithDecodableVersions adds the given value to the DecodableVersions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the DecodableVersions field. +func (b *ServerStorageVersionApplyConfiguration) WithDecodableVersions(values ...string) *ServerStorageVersionApplyConfiguration { + for i := range values { + b.DecodableVersions = append(b.DecodableVersions, values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apiserverinternal/v1alpha1/storageversion.go b/vendor/k8s.io/client-go/applyconfigurations/apiserverinternal/v1alpha1/storageversion.go new file mode 100644 index 000000000000..44d9b05c0161 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apiserverinternal/v1alpha1/storageversion.go @@ -0,0 +1,263 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + v1alpha1 "k8s.io/api/apiserverinternal/v1alpha1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// StorageVersionApplyConfiguration represents an declarative configuration of the StorageVersion type for use +// with apply. +type StorageVersionApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *v1alpha1.StorageVersionSpec `json:"spec,omitempty"` + Status *StorageVersionStatusApplyConfiguration `json:"status,omitempty"` +} + +// StorageVersion constructs an declarative configuration of the StorageVersion type for use with +// apply. +func StorageVersion(name string) *StorageVersionApplyConfiguration { + b := &StorageVersionApplyConfiguration{} + b.WithName(name) + b.WithKind("StorageVersion") + b.WithAPIVersion("internal.apiserver.k8s.io/v1alpha1") + return b +} + +// ExtractStorageVersion extracts the applied configuration owned by fieldManager from +// storageVersion. If no managedFields are found in storageVersion for fieldManager, a +// StorageVersionApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// storageVersion must be a unmodified StorageVersion API object that was retrieved from the Kubernetes API. +// ExtractStorageVersion provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractStorageVersion(storageVersion *v1alpha1.StorageVersion, fieldManager string) (*StorageVersionApplyConfiguration, error) { + b := &StorageVersionApplyConfiguration{} + err := managedfields.ExtractInto(storageVersion, internal.Parser().Type("io.k8s.api.apiserverinternal.v1alpha1.StorageVersion"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(storageVersion.Name) + + b.WithKind("StorageVersion") + b.WithAPIVersion("internal.apiserver.k8s.io/v1alpha1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *StorageVersionApplyConfiguration) WithKind(value string) *StorageVersionApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *StorageVersionApplyConfiguration) WithAPIVersion(value string) *StorageVersionApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *StorageVersionApplyConfiguration) WithName(value string) *StorageVersionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *StorageVersionApplyConfiguration) WithGenerateName(value string) *StorageVersionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *StorageVersionApplyConfiguration) WithNamespace(value string) *StorageVersionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *StorageVersionApplyConfiguration) WithSelfLink(value string) *StorageVersionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *StorageVersionApplyConfiguration) WithUID(value types.UID) *StorageVersionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *StorageVersionApplyConfiguration) WithResourceVersion(value string) *StorageVersionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *StorageVersionApplyConfiguration) WithGeneration(value int64) *StorageVersionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *StorageVersionApplyConfiguration) WithCreationTimestamp(value metav1.Time) *StorageVersionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *StorageVersionApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *StorageVersionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *StorageVersionApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *StorageVersionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *StorageVersionApplyConfiguration) WithLabels(entries map[string]string) *StorageVersionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *StorageVersionApplyConfiguration) WithAnnotations(entries map[string]string) *StorageVersionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *StorageVersionApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *StorageVersionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *StorageVersionApplyConfiguration) WithFinalizers(values ...string) *StorageVersionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *StorageVersionApplyConfiguration) WithClusterName(value string) *StorageVersionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *StorageVersionApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *StorageVersionApplyConfiguration) WithSpec(value v1alpha1.StorageVersionSpec) *StorageVersionApplyConfiguration { + b.Spec = &value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *StorageVersionApplyConfiguration) WithStatus(value *StorageVersionStatusApplyConfiguration) *StorageVersionApplyConfiguration { + b.Status = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apiserverinternal/v1alpha1/storageversioncondition.go b/vendor/k8s.io/client-go/applyconfigurations/apiserverinternal/v1alpha1/storageversioncondition.go new file mode 100644 index 000000000000..75b625647862 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apiserverinternal/v1alpha1/storageversioncondition.go @@ -0,0 +1,89 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + v1alpha1 "k8s.io/api/apiserverinternal/v1alpha1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// StorageVersionConditionApplyConfiguration represents an declarative configuration of the StorageVersionCondition type for use +// with apply. +type StorageVersionConditionApplyConfiguration struct { + Type *v1alpha1.StorageVersionConditionType `json:"type,omitempty"` + Status *v1alpha1.ConditionStatus `json:"status,omitempty"` + ObservedGeneration *int64 `json:"observedGeneration,omitempty"` + LastTransitionTime *v1.Time `json:"lastTransitionTime,omitempty"` + Reason *string `json:"reason,omitempty"` + Message *string `json:"message,omitempty"` +} + +// StorageVersionConditionApplyConfiguration constructs an declarative configuration of the StorageVersionCondition type for use with +// apply. +func StorageVersionCondition() *StorageVersionConditionApplyConfiguration { + return &StorageVersionConditionApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *StorageVersionConditionApplyConfiguration) WithType(value v1alpha1.StorageVersionConditionType) *StorageVersionConditionApplyConfiguration { + b.Type = &value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *StorageVersionConditionApplyConfiguration) WithStatus(value v1alpha1.ConditionStatus) *StorageVersionConditionApplyConfiguration { + b.Status = &value + return b +} + +// WithObservedGeneration sets the ObservedGeneration field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ObservedGeneration field is set to the value of the last call. +func (b *StorageVersionConditionApplyConfiguration) WithObservedGeneration(value int64) *StorageVersionConditionApplyConfiguration { + b.ObservedGeneration = &value + return b +} + +// WithLastTransitionTime sets the LastTransitionTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastTransitionTime field is set to the value of the last call. +func (b *StorageVersionConditionApplyConfiguration) WithLastTransitionTime(value v1.Time) *StorageVersionConditionApplyConfiguration { + b.LastTransitionTime = &value + return b +} + +// WithReason sets the Reason field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Reason field is set to the value of the last call. +func (b *StorageVersionConditionApplyConfiguration) WithReason(value string) *StorageVersionConditionApplyConfiguration { + b.Reason = &value + return b +} + +// WithMessage sets the Message field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Message field is set to the value of the last call. +func (b *StorageVersionConditionApplyConfiguration) WithMessage(value string) *StorageVersionConditionApplyConfiguration { + b.Message = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apiserverinternal/v1alpha1/storageversionstatus.go b/vendor/k8s.io/client-go/applyconfigurations/apiserverinternal/v1alpha1/storageversionstatus.go new file mode 100644 index 000000000000..43b0bf71b137 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apiserverinternal/v1alpha1/storageversionstatus.go @@ -0,0 +1,67 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +// StorageVersionStatusApplyConfiguration represents an declarative configuration of the StorageVersionStatus type for use +// with apply. +type StorageVersionStatusApplyConfiguration struct { + StorageVersions []ServerStorageVersionApplyConfiguration `json:"storageVersions,omitempty"` + CommonEncodingVersion *string `json:"commonEncodingVersion,omitempty"` + Conditions []StorageVersionConditionApplyConfiguration `json:"conditions,omitempty"` +} + +// StorageVersionStatusApplyConfiguration constructs an declarative configuration of the StorageVersionStatus type for use with +// apply. +func StorageVersionStatus() *StorageVersionStatusApplyConfiguration { + return &StorageVersionStatusApplyConfiguration{} +} + +// WithStorageVersions adds the given value to the StorageVersions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the StorageVersions field. +func (b *StorageVersionStatusApplyConfiguration) WithStorageVersions(values ...*ServerStorageVersionApplyConfiguration) *StorageVersionStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithStorageVersions") + } + b.StorageVersions = append(b.StorageVersions, *values[i]) + } + return b +} + +// WithCommonEncodingVersion sets the CommonEncodingVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CommonEncodingVersion field is set to the value of the last call. +func (b *StorageVersionStatusApplyConfiguration) WithCommonEncodingVersion(value string) *StorageVersionStatusApplyConfiguration { + b.CommonEncodingVersion = &value + return b +} + +// WithConditions adds the given value to the Conditions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Conditions field. +func (b *StorageVersionStatusApplyConfiguration) WithConditions(values ...*StorageVersionConditionApplyConfiguration) *StorageVersionStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithConditions") + } + b.Conditions = append(b.Conditions, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1/controllerrevision.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1/controllerrevision.go new file mode 100644 index 000000000000..d01f77a5e802 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1/controllerrevision.go @@ -0,0 +1,266 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + appsv1 "k8s.io/api/apps/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// ControllerRevisionApplyConfiguration represents an declarative configuration of the ControllerRevision type for use +// with apply. +type ControllerRevisionApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Data *runtime.RawExtension `json:"data,omitempty"` + Revision *int64 `json:"revision,omitempty"` +} + +// ControllerRevision constructs an declarative configuration of the ControllerRevision type for use with +// apply. +func ControllerRevision(name, namespace string) *ControllerRevisionApplyConfiguration { + b := &ControllerRevisionApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("ControllerRevision") + b.WithAPIVersion("apps/v1") + return b +} + +// ExtractControllerRevision extracts the applied configuration owned by fieldManager from +// controllerRevision. If no managedFields are found in controllerRevision for fieldManager, a +// ControllerRevisionApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// controllerRevision must be a unmodified ControllerRevision API object that was retrieved from the Kubernetes API. +// ExtractControllerRevision provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractControllerRevision(controllerRevision *appsv1.ControllerRevision, fieldManager string) (*ControllerRevisionApplyConfiguration, error) { + b := &ControllerRevisionApplyConfiguration{} + err := managedfields.ExtractInto(controllerRevision, internal.Parser().Type("io.k8s.api.apps.v1.ControllerRevision"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(controllerRevision.Name) + b.WithNamespace(controllerRevision.Namespace) + + b.WithKind("ControllerRevision") + b.WithAPIVersion("apps/v1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *ControllerRevisionApplyConfiguration) WithKind(value string) *ControllerRevisionApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *ControllerRevisionApplyConfiguration) WithAPIVersion(value string) *ControllerRevisionApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ControllerRevisionApplyConfiguration) WithName(value string) *ControllerRevisionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *ControllerRevisionApplyConfiguration) WithGenerateName(value string) *ControllerRevisionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *ControllerRevisionApplyConfiguration) WithNamespace(value string) *ControllerRevisionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *ControllerRevisionApplyConfiguration) WithSelfLink(value string) *ControllerRevisionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *ControllerRevisionApplyConfiguration) WithUID(value types.UID) *ControllerRevisionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *ControllerRevisionApplyConfiguration) WithResourceVersion(value string) *ControllerRevisionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *ControllerRevisionApplyConfiguration) WithGeneration(value int64) *ControllerRevisionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *ControllerRevisionApplyConfiguration) WithCreationTimestamp(value metav1.Time) *ControllerRevisionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *ControllerRevisionApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *ControllerRevisionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *ControllerRevisionApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *ControllerRevisionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *ControllerRevisionApplyConfiguration) WithLabels(entries map[string]string) *ControllerRevisionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *ControllerRevisionApplyConfiguration) WithAnnotations(entries map[string]string) *ControllerRevisionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *ControllerRevisionApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *ControllerRevisionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *ControllerRevisionApplyConfiguration) WithFinalizers(values ...string) *ControllerRevisionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *ControllerRevisionApplyConfiguration) WithClusterName(value string) *ControllerRevisionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *ControllerRevisionApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithData sets the Data field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Data field is set to the value of the last call. +func (b *ControllerRevisionApplyConfiguration) WithData(value runtime.RawExtension) *ControllerRevisionApplyConfiguration { + b.Data = &value + return b +} + +// WithRevision sets the Revision field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Revision field is set to the value of the last call. +func (b *ControllerRevisionApplyConfiguration) WithRevision(value int64) *ControllerRevisionApplyConfiguration { + b.Revision = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1/daemonset.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1/daemonset.go new file mode 100644 index 000000000000..bcfe7a4a6423 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1/daemonset.go @@ -0,0 +1,265 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + apiappsv1 "k8s.io/api/apps/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// DaemonSetApplyConfiguration represents an declarative configuration of the DaemonSet type for use +// with apply. +type DaemonSetApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *DaemonSetSpecApplyConfiguration `json:"spec,omitempty"` + Status *DaemonSetStatusApplyConfiguration `json:"status,omitempty"` +} + +// DaemonSet constructs an declarative configuration of the DaemonSet type for use with +// apply. +func DaemonSet(name, namespace string) *DaemonSetApplyConfiguration { + b := &DaemonSetApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("DaemonSet") + b.WithAPIVersion("apps/v1") + return b +} + +// ExtractDaemonSet extracts the applied configuration owned by fieldManager from +// daemonSet. If no managedFields are found in daemonSet for fieldManager, a +// DaemonSetApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// daemonSet must be a unmodified DaemonSet API object that was retrieved from the Kubernetes API. +// ExtractDaemonSet provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractDaemonSet(daemonSet *apiappsv1.DaemonSet, fieldManager string) (*DaemonSetApplyConfiguration, error) { + b := &DaemonSetApplyConfiguration{} + err := managedfields.ExtractInto(daemonSet, internal.Parser().Type("io.k8s.api.apps.v1.DaemonSet"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(daemonSet.Name) + b.WithNamespace(daemonSet.Namespace) + + b.WithKind("DaemonSet") + b.WithAPIVersion("apps/v1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *DaemonSetApplyConfiguration) WithKind(value string) *DaemonSetApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *DaemonSetApplyConfiguration) WithAPIVersion(value string) *DaemonSetApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *DaemonSetApplyConfiguration) WithName(value string) *DaemonSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *DaemonSetApplyConfiguration) WithGenerateName(value string) *DaemonSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *DaemonSetApplyConfiguration) WithNamespace(value string) *DaemonSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *DaemonSetApplyConfiguration) WithSelfLink(value string) *DaemonSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *DaemonSetApplyConfiguration) WithUID(value types.UID) *DaemonSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *DaemonSetApplyConfiguration) WithResourceVersion(value string) *DaemonSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *DaemonSetApplyConfiguration) WithGeneration(value int64) *DaemonSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *DaemonSetApplyConfiguration) WithCreationTimestamp(value metav1.Time) *DaemonSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *DaemonSetApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *DaemonSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *DaemonSetApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *DaemonSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *DaemonSetApplyConfiguration) WithLabels(entries map[string]string) *DaemonSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *DaemonSetApplyConfiguration) WithAnnotations(entries map[string]string) *DaemonSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *DaemonSetApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *DaemonSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *DaemonSetApplyConfiguration) WithFinalizers(values ...string) *DaemonSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *DaemonSetApplyConfiguration) WithClusterName(value string) *DaemonSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *DaemonSetApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *DaemonSetApplyConfiguration) WithSpec(value *DaemonSetSpecApplyConfiguration) *DaemonSetApplyConfiguration { + b.Spec = value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *DaemonSetApplyConfiguration) WithStatus(value *DaemonSetStatusApplyConfiguration) *DaemonSetApplyConfiguration { + b.Status = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1/daemonsetcondition.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1/daemonsetcondition.go new file mode 100644 index 000000000000..283ae10a29f1 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1/daemonsetcondition.go @@ -0,0 +1,81 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/apps/v1" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// DaemonSetConditionApplyConfiguration represents an declarative configuration of the DaemonSetCondition type for use +// with apply. +type DaemonSetConditionApplyConfiguration struct { + Type *v1.DaemonSetConditionType `json:"type,omitempty"` + Status *corev1.ConditionStatus `json:"status,omitempty"` + LastTransitionTime *metav1.Time `json:"lastTransitionTime,omitempty"` + Reason *string `json:"reason,omitempty"` + Message *string `json:"message,omitempty"` +} + +// DaemonSetConditionApplyConfiguration constructs an declarative configuration of the DaemonSetCondition type for use with +// apply. +func DaemonSetCondition() *DaemonSetConditionApplyConfiguration { + return &DaemonSetConditionApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *DaemonSetConditionApplyConfiguration) WithType(value v1.DaemonSetConditionType) *DaemonSetConditionApplyConfiguration { + b.Type = &value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *DaemonSetConditionApplyConfiguration) WithStatus(value corev1.ConditionStatus) *DaemonSetConditionApplyConfiguration { + b.Status = &value + return b +} + +// WithLastTransitionTime sets the LastTransitionTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastTransitionTime field is set to the value of the last call. +func (b *DaemonSetConditionApplyConfiguration) WithLastTransitionTime(value metav1.Time) *DaemonSetConditionApplyConfiguration { + b.LastTransitionTime = &value + return b +} + +// WithReason sets the Reason field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Reason field is set to the value of the last call. +func (b *DaemonSetConditionApplyConfiguration) WithReason(value string) *DaemonSetConditionApplyConfiguration { + b.Reason = &value + return b +} + +// WithMessage sets the Message field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Message field is set to the value of the last call. +func (b *DaemonSetConditionApplyConfiguration) WithMessage(value string) *DaemonSetConditionApplyConfiguration { + b.Message = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1/daemonsetspec.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1/daemonsetspec.go new file mode 100644 index 000000000000..5e808874b7d9 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1/daemonsetspec.go @@ -0,0 +1,80 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + corev1 "k8s.io/client-go/applyconfigurations/core/v1" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// DaemonSetSpecApplyConfiguration represents an declarative configuration of the DaemonSetSpec type for use +// with apply. +type DaemonSetSpecApplyConfiguration struct { + Selector *v1.LabelSelectorApplyConfiguration `json:"selector,omitempty"` + Template *corev1.PodTemplateSpecApplyConfiguration `json:"template,omitempty"` + UpdateStrategy *DaemonSetUpdateStrategyApplyConfiguration `json:"updateStrategy,omitempty"` + MinReadySeconds *int32 `json:"minReadySeconds,omitempty"` + RevisionHistoryLimit *int32 `json:"revisionHistoryLimit,omitempty"` +} + +// DaemonSetSpecApplyConfiguration constructs an declarative configuration of the DaemonSetSpec type for use with +// apply. +func DaemonSetSpec() *DaemonSetSpecApplyConfiguration { + return &DaemonSetSpecApplyConfiguration{} +} + +// WithSelector sets the Selector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Selector field is set to the value of the last call. +func (b *DaemonSetSpecApplyConfiguration) WithSelector(value *v1.LabelSelectorApplyConfiguration) *DaemonSetSpecApplyConfiguration { + b.Selector = value + return b +} + +// WithTemplate sets the Template field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Template field is set to the value of the last call. +func (b *DaemonSetSpecApplyConfiguration) WithTemplate(value *corev1.PodTemplateSpecApplyConfiguration) *DaemonSetSpecApplyConfiguration { + b.Template = value + return b +} + +// WithUpdateStrategy sets the UpdateStrategy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UpdateStrategy field is set to the value of the last call. +func (b *DaemonSetSpecApplyConfiguration) WithUpdateStrategy(value *DaemonSetUpdateStrategyApplyConfiguration) *DaemonSetSpecApplyConfiguration { + b.UpdateStrategy = value + return b +} + +// WithMinReadySeconds sets the MinReadySeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MinReadySeconds field is set to the value of the last call. +func (b *DaemonSetSpecApplyConfiguration) WithMinReadySeconds(value int32) *DaemonSetSpecApplyConfiguration { + b.MinReadySeconds = &value + return b +} + +// WithRevisionHistoryLimit sets the RevisionHistoryLimit field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RevisionHistoryLimit field is set to the value of the last call. +func (b *DaemonSetSpecApplyConfiguration) WithRevisionHistoryLimit(value int32) *DaemonSetSpecApplyConfiguration { + b.RevisionHistoryLimit = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1/daemonsetstatus.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1/daemonsetstatus.go new file mode 100644 index 000000000000..d1c4462aa9ee --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1/daemonsetstatus.go @@ -0,0 +1,125 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// DaemonSetStatusApplyConfiguration represents an declarative configuration of the DaemonSetStatus type for use +// with apply. +type DaemonSetStatusApplyConfiguration struct { + CurrentNumberScheduled *int32 `json:"currentNumberScheduled,omitempty"` + NumberMisscheduled *int32 `json:"numberMisscheduled,omitempty"` + DesiredNumberScheduled *int32 `json:"desiredNumberScheduled,omitempty"` + NumberReady *int32 `json:"numberReady,omitempty"` + ObservedGeneration *int64 `json:"observedGeneration,omitempty"` + UpdatedNumberScheduled *int32 `json:"updatedNumberScheduled,omitempty"` + NumberAvailable *int32 `json:"numberAvailable,omitempty"` + NumberUnavailable *int32 `json:"numberUnavailable,omitempty"` + CollisionCount *int32 `json:"collisionCount,omitempty"` + Conditions []DaemonSetConditionApplyConfiguration `json:"conditions,omitempty"` +} + +// DaemonSetStatusApplyConfiguration constructs an declarative configuration of the DaemonSetStatus type for use with +// apply. +func DaemonSetStatus() *DaemonSetStatusApplyConfiguration { + return &DaemonSetStatusApplyConfiguration{} +} + +// WithCurrentNumberScheduled sets the CurrentNumberScheduled field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CurrentNumberScheduled field is set to the value of the last call. +func (b *DaemonSetStatusApplyConfiguration) WithCurrentNumberScheduled(value int32) *DaemonSetStatusApplyConfiguration { + b.CurrentNumberScheduled = &value + return b +} + +// WithNumberMisscheduled sets the NumberMisscheduled field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NumberMisscheduled field is set to the value of the last call. +func (b *DaemonSetStatusApplyConfiguration) WithNumberMisscheduled(value int32) *DaemonSetStatusApplyConfiguration { + b.NumberMisscheduled = &value + return b +} + +// WithDesiredNumberScheduled sets the DesiredNumberScheduled field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DesiredNumberScheduled field is set to the value of the last call. +func (b *DaemonSetStatusApplyConfiguration) WithDesiredNumberScheduled(value int32) *DaemonSetStatusApplyConfiguration { + b.DesiredNumberScheduled = &value + return b +} + +// WithNumberReady sets the NumberReady field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NumberReady field is set to the value of the last call. +func (b *DaemonSetStatusApplyConfiguration) WithNumberReady(value int32) *DaemonSetStatusApplyConfiguration { + b.NumberReady = &value + return b +} + +// WithObservedGeneration sets the ObservedGeneration field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ObservedGeneration field is set to the value of the last call. +func (b *DaemonSetStatusApplyConfiguration) WithObservedGeneration(value int64) *DaemonSetStatusApplyConfiguration { + b.ObservedGeneration = &value + return b +} + +// WithUpdatedNumberScheduled sets the UpdatedNumberScheduled field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UpdatedNumberScheduled field is set to the value of the last call. +func (b *DaemonSetStatusApplyConfiguration) WithUpdatedNumberScheduled(value int32) *DaemonSetStatusApplyConfiguration { + b.UpdatedNumberScheduled = &value + return b +} + +// WithNumberAvailable sets the NumberAvailable field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NumberAvailable field is set to the value of the last call. +func (b *DaemonSetStatusApplyConfiguration) WithNumberAvailable(value int32) *DaemonSetStatusApplyConfiguration { + b.NumberAvailable = &value + return b +} + +// WithNumberUnavailable sets the NumberUnavailable field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NumberUnavailable field is set to the value of the last call. +func (b *DaemonSetStatusApplyConfiguration) WithNumberUnavailable(value int32) *DaemonSetStatusApplyConfiguration { + b.NumberUnavailable = &value + return b +} + +// WithCollisionCount sets the CollisionCount field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CollisionCount field is set to the value of the last call. +func (b *DaemonSetStatusApplyConfiguration) WithCollisionCount(value int32) *DaemonSetStatusApplyConfiguration { + b.CollisionCount = &value + return b +} + +// WithConditions adds the given value to the Conditions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Conditions field. +func (b *DaemonSetStatusApplyConfiguration) WithConditions(values ...*DaemonSetConditionApplyConfiguration) *DaemonSetStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithConditions") + } + b.Conditions = append(b.Conditions, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1/daemonsetupdatestrategy.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1/daemonsetupdatestrategy.go new file mode 100644 index 000000000000..f1ba18226ff3 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1/daemonsetupdatestrategy.go @@ -0,0 +1,52 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/apps/v1" +) + +// DaemonSetUpdateStrategyApplyConfiguration represents an declarative configuration of the DaemonSetUpdateStrategy type for use +// with apply. +type DaemonSetUpdateStrategyApplyConfiguration struct { + Type *v1.DaemonSetUpdateStrategyType `json:"type,omitempty"` + RollingUpdate *RollingUpdateDaemonSetApplyConfiguration `json:"rollingUpdate,omitempty"` +} + +// DaemonSetUpdateStrategyApplyConfiguration constructs an declarative configuration of the DaemonSetUpdateStrategy type for use with +// apply. +func DaemonSetUpdateStrategy() *DaemonSetUpdateStrategyApplyConfiguration { + return &DaemonSetUpdateStrategyApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *DaemonSetUpdateStrategyApplyConfiguration) WithType(value v1.DaemonSetUpdateStrategyType) *DaemonSetUpdateStrategyApplyConfiguration { + b.Type = &value + return b +} + +// WithRollingUpdate sets the RollingUpdate field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RollingUpdate field is set to the value of the last call. +func (b *DaemonSetUpdateStrategyApplyConfiguration) WithRollingUpdate(value *RollingUpdateDaemonSetApplyConfiguration) *DaemonSetUpdateStrategyApplyConfiguration { + b.RollingUpdate = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1/deployment.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1/deployment.go new file mode 100644 index 000000000000..37ef1896a2dc --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1/deployment.go @@ -0,0 +1,265 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + apiappsv1 "k8s.io/api/apps/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// DeploymentApplyConfiguration represents an declarative configuration of the Deployment type for use +// with apply. +type DeploymentApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *DeploymentSpecApplyConfiguration `json:"spec,omitempty"` + Status *DeploymentStatusApplyConfiguration `json:"status,omitempty"` +} + +// Deployment constructs an declarative configuration of the Deployment type for use with +// apply. +func Deployment(name, namespace string) *DeploymentApplyConfiguration { + b := &DeploymentApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("Deployment") + b.WithAPIVersion("apps/v1") + return b +} + +// ExtractDeployment extracts the applied configuration owned by fieldManager from +// deployment. If no managedFields are found in deployment for fieldManager, a +// DeploymentApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// deployment must be a unmodified Deployment API object that was retrieved from the Kubernetes API. +// ExtractDeployment provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractDeployment(deployment *apiappsv1.Deployment, fieldManager string) (*DeploymentApplyConfiguration, error) { + b := &DeploymentApplyConfiguration{} + err := managedfields.ExtractInto(deployment, internal.Parser().Type("io.k8s.api.apps.v1.Deployment"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(deployment.Name) + b.WithNamespace(deployment.Namespace) + + b.WithKind("Deployment") + b.WithAPIVersion("apps/v1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithKind(value string) *DeploymentApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithAPIVersion(value string) *DeploymentApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithName(value string) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithGenerateName(value string) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithNamespace(value string) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithSelfLink(value string) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithUID(value types.UID) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithResourceVersion(value string) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithGeneration(value int64) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithCreationTimestamp(value metav1.Time) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *DeploymentApplyConfiguration) WithLabels(entries map[string]string) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *DeploymentApplyConfiguration) WithAnnotations(entries map[string]string) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *DeploymentApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *DeploymentApplyConfiguration) WithFinalizers(values ...string) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithClusterName(value string) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *DeploymentApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithSpec(value *DeploymentSpecApplyConfiguration) *DeploymentApplyConfiguration { + b.Spec = value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithStatus(value *DeploymentStatusApplyConfiguration) *DeploymentApplyConfiguration { + b.Status = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1/deploymentcondition.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1/deploymentcondition.go new file mode 100644 index 000000000000..774704413677 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1/deploymentcondition.go @@ -0,0 +1,90 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/apps/v1" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// DeploymentConditionApplyConfiguration represents an declarative configuration of the DeploymentCondition type for use +// with apply. +type DeploymentConditionApplyConfiguration struct { + Type *v1.DeploymentConditionType `json:"type,omitempty"` + Status *corev1.ConditionStatus `json:"status,omitempty"` + LastUpdateTime *metav1.Time `json:"lastUpdateTime,omitempty"` + LastTransitionTime *metav1.Time `json:"lastTransitionTime,omitempty"` + Reason *string `json:"reason,omitempty"` + Message *string `json:"message,omitempty"` +} + +// DeploymentConditionApplyConfiguration constructs an declarative configuration of the DeploymentCondition type for use with +// apply. +func DeploymentCondition() *DeploymentConditionApplyConfiguration { + return &DeploymentConditionApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *DeploymentConditionApplyConfiguration) WithType(value v1.DeploymentConditionType) *DeploymentConditionApplyConfiguration { + b.Type = &value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *DeploymentConditionApplyConfiguration) WithStatus(value corev1.ConditionStatus) *DeploymentConditionApplyConfiguration { + b.Status = &value + return b +} + +// WithLastUpdateTime sets the LastUpdateTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastUpdateTime field is set to the value of the last call. +func (b *DeploymentConditionApplyConfiguration) WithLastUpdateTime(value metav1.Time) *DeploymentConditionApplyConfiguration { + b.LastUpdateTime = &value + return b +} + +// WithLastTransitionTime sets the LastTransitionTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastTransitionTime field is set to the value of the last call. +func (b *DeploymentConditionApplyConfiguration) WithLastTransitionTime(value metav1.Time) *DeploymentConditionApplyConfiguration { + b.LastTransitionTime = &value + return b +} + +// WithReason sets the Reason field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Reason field is set to the value of the last call. +func (b *DeploymentConditionApplyConfiguration) WithReason(value string) *DeploymentConditionApplyConfiguration { + b.Reason = &value + return b +} + +// WithMessage sets the Message field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Message field is set to the value of the last call. +func (b *DeploymentConditionApplyConfiguration) WithMessage(value string) *DeploymentConditionApplyConfiguration { + b.Message = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1/deploymentspec.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1/deploymentspec.go new file mode 100644 index 000000000000..812253dae850 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1/deploymentspec.go @@ -0,0 +1,107 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + corev1 "k8s.io/client-go/applyconfigurations/core/v1" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// DeploymentSpecApplyConfiguration represents an declarative configuration of the DeploymentSpec type for use +// with apply. +type DeploymentSpecApplyConfiguration struct { + Replicas *int32 `json:"replicas,omitempty"` + Selector *v1.LabelSelectorApplyConfiguration `json:"selector,omitempty"` + Template *corev1.PodTemplateSpecApplyConfiguration `json:"template,omitempty"` + Strategy *DeploymentStrategyApplyConfiguration `json:"strategy,omitempty"` + MinReadySeconds *int32 `json:"minReadySeconds,omitempty"` + RevisionHistoryLimit *int32 `json:"revisionHistoryLimit,omitempty"` + Paused *bool `json:"paused,omitempty"` + ProgressDeadlineSeconds *int32 `json:"progressDeadlineSeconds,omitempty"` +} + +// DeploymentSpecApplyConfiguration constructs an declarative configuration of the DeploymentSpec type for use with +// apply. +func DeploymentSpec() *DeploymentSpecApplyConfiguration { + return &DeploymentSpecApplyConfiguration{} +} + +// WithReplicas sets the Replicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Replicas field is set to the value of the last call. +func (b *DeploymentSpecApplyConfiguration) WithReplicas(value int32) *DeploymentSpecApplyConfiguration { + b.Replicas = &value + return b +} + +// WithSelector sets the Selector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Selector field is set to the value of the last call. +func (b *DeploymentSpecApplyConfiguration) WithSelector(value *v1.LabelSelectorApplyConfiguration) *DeploymentSpecApplyConfiguration { + b.Selector = value + return b +} + +// WithTemplate sets the Template field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Template field is set to the value of the last call. +func (b *DeploymentSpecApplyConfiguration) WithTemplate(value *corev1.PodTemplateSpecApplyConfiguration) *DeploymentSpecApplyConfiguration { + b.Template = value + return b +} + +// WithStrategy sets the Strategy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Strategy field is set to the value of the last call. +func (b *DeploymentSpecApplyConfiguration) WithStrategy(value *DeploymentStrategyApplyConfiguration) *DeploymentSpecApplyConfiguration { + b.Strategy = value + return b +} + +// WithMinReadySeconds sets the MinReadySeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MinReadySeconds field is set to the value of the last call. +func (b *DeploymentSpecApplyConfiguration) WithMinReadySeconds(value int32) *DeploymentSpecApplyConfiguration { + b.MinReadySeconds = &value + return b +} + +// WithRevisionHistoryLimit sets the RevisionHistoryLimit field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RevisionHistoryLimit field is set to the value of the last call. +func (b *DeploymentSpecApplyConfiguration) WithRevisionHistoryLimit(value int32) *DeploymentSpecApplyConfiguration { + b.RevisionHistoryLimit = &value + return b +} + +// WithPaused sets the Paused field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Paused field is set to the value of the last call. +func (b *DeploymentSpecApplyConfiguration) WithPaused(value bool) *DeploymentSpecApplyConfiguration { + b.Paused = &value + return b +} + +// WithProgressDeadlineSeconds sets the ProgressDeadlineSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ProgressDeadlineSeconds field is set to the value of the last call. +func (b *DeploymentSpecApplyConfiguration) WithProgressDeadlineSeconds(value int32) *DeploymentSpecApplyConfiguration { + b.ProgressDeadlineSeconds = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1/deploymentstatus.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1/deploymentstatus.go new file mode 100644 index 000000000000..7b48b425575f --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1/deploymentstatus.go @@ -0,0 +1,107 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// DeploymentStatusApplyConfiguration represents an declarative configuration of the DeploymentStatus type for use +// with apply. +type DeploymentStatusApplyConfiguration struct { + ObservedGeneration *int64 `json:"observedGeneration,omitempty"` + Replicas *int32 `json:"replicas,omitempty"` + UpdatedReplicas *int32 `json:"updatedReplicas,omitempty"` + ReadyReplicas *int32 `json:"readyReplicas,omitempty"` + AvailableReplicas *int32 `json:"availableReplicas,omitempty"` + UnavailableReplicas *int32 `json:"unavailableReplicas,omitempty"` + Conditions []DeploymentConditionApplyConfiguration `json:"conditions,omitempty"` + CollisionCount *int32 `json:"collisionCount,omitempty"` +} + +// DeploymentStatusApplyConfiguration constructs an declarative configuration of the DeploymentStatus type for use with +// apply. +func DeploymentStatus() *DeploymentStatusApplyConfiguration { + return &DeploymentStatusApplyConfiguration{} +} + +// WithObservedGeneration sets the ObservedGeneration field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ObservedGeneration field is set to the value of the last call. +func (b *DeploymentStatusApplyConfiguration) WithObservedGeneration(value int64) *DeploymentStatusApplyConfiguration { + b.ObservedGeneration = &value + return b +} + +// WithReplicas sets the Replicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Replicas field is set to the value of the last call. +func (b *DeploymentStatusApplyConfiguration) WithReplicas(value int32) *DeploymentStatusApplyConfiguration { + b.Replicas = &value + return b +} + +// WithUpdatedReplicas sets the UpdatedReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UpdatedReplicas field is set to the value of the last call. +func (b *DeploymentStatusApplyConfiguration) WithUpdatedReplicas(value int32) *DeploymentStatusApplyConfiguration { + b.UpdatedReplicas = &value + return b +} + +// WithReadyReplicas sets the ReadyReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadyReplicas field is set to the value of the last call. +func (b *DeploymentStatusApplyConfiguration) WithReadyReplicas(value int32) *DeploymentStatusApplyConfiguration { + b.ReadyReplicas = &value + return b +} + +// WithAvailableReplicas sets the AvailableReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AvailableReplicas field is set to the value of the last call. +func (b *DeploymentStatusApplyConfiguration) WithAvailableReplicas(value int32) *DeploymentStatusApplyConfiguration { + b.AvailableReplicas = &value + return b +} + +// WithUnavailableReplicas sets the UnavailableReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UnavailableReplicas field is set to the value of the last call. +func (b *DeploymentStatusApplyConfiguration) WithUnavailableReplicas(value int32) *DeploymentStatusApplyConfiguration { + b.UnavailableReplicas = &value + return b +} + +// WithConditions adds the given value to the Conditions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Conditions field. +func (b *DeploymentStatusApplyConfiguration) WithConditions(values ...*DeploymentConditionApplyConfiguration) *DeploymentStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithConditions") + } + b.Conditions = append(b.Conditions, *values[i]) + } + return b +} + +// WithCollisionCount sets the CollisionCount field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CollisionCount field is set to the value of the last call. +func (b *DeploymentStatusApplyConfiguration) WithCollisionCount(value int32) *DeploymentStatusApplyConfiguration { + b.CollisionCount = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1/deploymentstrategy.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1/deploymentstrategy.go new file mode 100644 index 000000000000..e9571edab19e --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1/deploymentstrategy.go @@ -0,0 +1,52 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/apps/v1" +) + +// DeploymentStrategyApplyConfiguration represents an declarative configuration of the DeploymentStrategy type for use +// with apply. +type DeploymentStrategyApplyConfiguration struct { + Type *v1.DeploymentStrategyType `json:"type,omitempty"` + RollingUpdate *RollingUpdateDeploymentApplyConfiguration `json:"rollingUpdate,omitempty"` +} + +// DeploymentStrategyApplyConfiguration constructs an declarative configuration of the DeploymentStrategy type for use with +// apply. +func DeploymentStrategy() *DeploymentStrategyApplyConfiguration { + return &DeploymentStrategyApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *DeploymentStrategyApplyConfiguration) WithType(value v1.DeploymentStrategyType) *DeploymentStrategyApplyConfiguration { + b.Type = &value + return b +} + +// WithRollingUpdate sets the RollingUpdate field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RollingUpdate field is set to the value of the last call. +func (b *DeploymentStrategyApplyConfiguration) WithRollingUpdate(value *RollingUpdateDeploymentApplyConfiguration) *DeploymentStrategyApplyConfiguration { + b.RollingUpdate = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1/replicaset.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1/replicaset.go new file mode 100644 index 000000000000..fc7a468e48ce --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1/replicaset.go @@ -0,0 +1,265 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + apiappsv1 "k8s.io/api/apps/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// ReplicaSetApplyConfiguration represents an declarative configuration of the ReplicaSet type for use +// with apply. +type ReplicaSetApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *ReplicaSetSpecApplyConfiguration `json:"spec,omitempty"` + Status *ReplicaSetStatusApplyConfiguration `json:"status,omitempty"` +} + +// ReplicaSet constructs an declarative configuration of the ReplicaSet type for use with +// apply. +func ReplicaSet(name, namespace string) *ReplicaSetApplyConfiguration { + b := &ReplicaSetApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("ReplicaSet") + b.WithAPIVersion("apps/v1") + return b +} + +// ExtractReplicaSet extracts the applied configuration owned by fieldManager from +// replicaSet. If no managedFields are found in replicaSet for fieldManager, a +// ReplicaSetApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// replicaSet must be a unmodified ReplicaSet API object that was retrieved from the Kubernetes API. +// ExtractReplicaSet provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractReplicaSet(replicaSet *apiappsv1.ReplicaSet, fieldManager string) (*ReplicaSetApplyConfiguration, error) { + b := &ReplicaSetApplyConfiguration{} + err := managedfields.ExtractInto(replicaSet, internal.Parser().Type("io.k8s.api.apps.v1.ReplicaSet"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(replicaSet.Name) + b.WithNamespace(replicaSet.Namespace) + + b.WithKind("ReplicaSet") + b.WithAPIVersion("apps/v1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *ReplicaSetApplyConfiguration) WithKind(value string) *ReplicaSetApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *ReplicaSetApplyConfiguration) WithAPIVersion(value string) *ReplicaSetApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ReplicaSetApplyConfiguration) WithName(value string) *ReplicaSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *ReplicaSetApplyConfiguration) WithGenerateName(value string) *ReplicaSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *ReplicaSetApplyConfiguration) WithNamespace(value string) *ReplicaSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *ReplicaSetApplyConfiguration) WithSelfLink(value string) *ReplicaSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *ReplicaSetApplyConfiguration) WithUID(value types.UID) *ReplicaSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *ReplicaSetApplyConfiguration) WithResourceVersion(value string) *ReplicaSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *ReplicaSetApplyConfiguration) WithGeneration(value int64) *ReplicaSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *ReplicaSetApplyConfiguration) WithCreationTimestamp(value metav1.Time) *ReplicaSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *ReplicaSetApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *ReplicaSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *ReplicaSetApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *ReplicaSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *ReplicaSetApplyConfiguration) WithLabels(entries map[string]string) *ReplicaSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *ReplicaSetApplyConfiguration) WithAnnotations(entries map[string]string) *ReplicaSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *ReplicaSetApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *ReplicaSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *ReplicaSetApplyConfiguration) WithFinalizers(values ...string) *ReplicaSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *ReplicaSetApplyConfiguration) WithClusterName(value string) *ReplicaSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *ReplicaSetApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *ReplicaSetApplyConfiguration) WithSpec(value *ReplicaSetSpecApplyConfiguration) *ReplicaSetApplyConfiguration { + b.Spec = value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *ReplicaSetApplyConfiguration) WithStatus(value *ReplicaSetStatusApplyConfiguration) *ReplicaSetApplyConfiguration { + b.Status = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1/replicasetcondition.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1/replicasetcondition.go new file mode 100644 index 000000000000..19b0355d154e --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1/replicasetcondition.go @@ -0,0 +1,81 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/apps/v1" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// ReplicaSetConditionApplyConfiguration represents an declarative configuration of the ReplicaSetCondition type for use +// with apply. +type ReplicaSetConditionApplyConfiguration struct { + Type *v1.ReplicaSetConditionType `json:"type,omitempty"` + Status *corev1.ConditionStatus `json:"status,omitempty"` + LastTransitionTime *metav1.Time `json:"lastTransitionTime,omitempty"` + Reason *string `json:"reason,omitempty"` + Message *string `json:"message,omitempty"` +} + +// ReplicaSetConditionApplyConfiguration constructs an declarative configuration of the ReplicaSetCondition type for use with +// apply. +func ReplicaSetCondition() *ReplicaSetConditionApplyConfiguration { + return &ReplicaSetConditionApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *ReplicaSetConditionApplyConfiguration) WithType(value v1.ReplicaSetConditionType) *ReplicaSetConditionApplyConfiguration { + b.Type = &value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *ReplicaSetConditionApplyConfiguration) WithStatus(value corev1.ConditionStatus) *ReplicaSetConditionApplyConfiguration { + b.Status = &value + return b +} + +// WithLastTransitionTime sets the LastTransitionTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastTransitionTime field is set to the value of the last call. +func (b *ReplicaSetConditionApplyConfiguration) WithLastTransitionTime(value metav1.Time) *ReplicaSetConditionApplyConfiguration { + b.LastTransitionTime = &value + return b +} + +// WithReason sets the Reason field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Reason field is set to the value of the last call. +func (b *ReplicaSetConditionApplyConfiguration) WithReason(value string) *ReplicaSetConditionApplyConfiguration { + b.Reason = &value + return b +} + +// WithMessage sets the Message field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Message field is set to the value of the last call. +func (b *ReplicaSetConditionApplyConfiguration) WithMessage(value string) *ReplicaSetConditionApplyConfiguration { + b.Message = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1/replicasetspec.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1/replicasetspec.go new file mode 100644 index 000000000000..ca32865835b7 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1/replicasetspec.go @@ -0,0 +1,71 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + corev1 "k8s.io/client-go/applyconfigurations/core/v1" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// ReplicaSetSpecApplyConfiguration represents an declarative configuration of the ReplicaSetSpec type for use +// with apply. +type ReplicaSetSpecApplyConfiguration struct { + Replicas *int32 `json:"replicas,omitempty"` + MinReadySeconds *int32 `json:"minReadySeconds,omitempty"` + Selector *v1.LabelSelectorApplyConfiguration `json:"selector,omitempty"` + Template *corev1.PodTemplateSpecApplyConfiguration `json:"template,omitempty"` +} + +// ReplicaSetSpecApplyConfiguration constructs an declarative configuration of the ReplicaSetSpec type for use with +// apply. +func ReplicaSetSpec() *ReplicaSetSpecApplyConfiguration { + return &ReplicaSetSpecApplyConfiguration{} +} + +// WithReplicas sets the Replicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Replicas field is set to the value of the last call. +func (b *ReplicaSetSpecApplyConfiguration) WithReplicas(value int32) *ReplicaSetSpecApplyConfiguration { + b.Replicas = &value + return b +} + +// WithMinReadySeconds sets the MinReadySeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MinReadySeconds field is set to the value of the last call. +func (b *ReplicaSetSpecApplyConfiguration) WithMinReadySeconds(value int32) *ReplicaSetSpecApplyConfiguration { + b.MinReadySeconds = &value + return b +} + +// WithSelector sets the Selector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Selector field is set to the value of the last call. +func (b *ReplicaSetSpecApplyConfiguration) WithSelector(value *v1.LabelSelectorApplyConfiguration) *ReplicaSetSpecApplyConfiguration { + b.Selector = value + return b +} + +// WithTemplate sets the Template field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Template field is set to the value of the last call. +func (b *ReplicaSetSpecApplyConfiguration) WithTemplate(value *corev1.PodTemplateSpecApplyConfiguration) *ReplicaSetSpecApplyConfiguration { + b.Template = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1/replicasetstatus.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1/replicasetstatus.go new file mode 100644 index 000000000000..12f41490f9a1 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1/replicasetstatus.go @@ -0,0 +1,89 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// ReplicaSetStatusApplyConfiguration represents an declarative configuration of the ReplicaSetStatus type for use +// with apply. +type ReplicaSetStatusApplyConfiguration struct { + Replicas *int32 `json:"replicas,omitempty"` + FullyLabeledReplicas *int32 `json:"fullyLabeledReplicas,omitempty"` + ReadyReplicas *int32 `json:"readyReplicas,omitempty"` + AvailableReplicas *int32 `json:"availableReplicas,omitempty"` + ObservedGeneration *int64 `json:"observedGeneration,omitempty"` + Conditions []ReplicaSetConditionApplyConfiguration `json:"conditions,omitempty"` +} + +// ReplicaSetStatusApplyConfiguration constructs an declarative configuration of the ReplicaSetStatus type for use with +// apply. +func ReplicaSetStatus() *ReplicaSetStatusApplyConfiguration { + return &ReplicaSetStatusApplyConfiguration{} +} + +// WithReplicas sets the Replicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Replicas field is set to the value of the last call. +func (b *ReplicaSetStatusApplyConfiguration) WithReplicas(value int32) *ReplicaSetStatusApplyConfiguration { + b.Replicas = &value + return b +} + +// WithFullyLabeledReplicas sets the FullyLabeledReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FullyLabeledReplicas field is set to the value of the last call. +func (b *ReplicaSetStatusApplyConfiguration) WithFullyLabeledReplicas(value int32) *ReplicaSetStatusApplyConfiguration { + b.FullyLabeledReplicas = &value + return b +} + +// WithReadyReplicas sets the ReadyReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadyReplicas field is set to the value of the last call. +func (b *ReplicaSetStatusApplyConfiguration) WithReadyReplicas(value int32) *ReplicaSetStatusApplyConfiguration { + b.ReadyReplicas = &value + return b +} + +// WithAvailableReplicas sets the AvailableReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AvailableReplicas field is set to the value of the last call. +func (b *ReplicaSetStatusApplyConfiguration) WithAvailableReplicas(value int32) *ReplicaSetStatusApplyConfiguration { + b.AvailableReplicas = &value + return b +} + +// WithObservedGeneration sets the ObservedGeneration field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ObservedGeneration field is set to the value of the last call. +func (b *ReplicaSetStatusApplyConfiguration) WithObservedGeneration(value int64) *ReplicaSetStatusApplyConfiguration { + b.ObservedGeneration = &value + return b +} + +// WithConditions adds the given value to the Conditions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Conditions field. +func (b *ReplicaSetStatusApplyConfiguration) WithConditions(values ...*ReplicaSetConditionApplyConfiguration) *ReplicaSetStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithConditions") + } + b.Conditions = append(b.Conditions, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1/rollingupdatedaemonset.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1/rollingupdatedaemonset.go new file mode 100644 index 000000000000..ebe8e86d1f58 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1/rollingupdatedaemonset.go @@ -0,0 +1,52 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + intstr "k8s.io/apimachinery/pkg/util/intstr" +) + +// RollingUpdateDaemonSetApplyConfiguration represents an declarative configuration of the RollingUpdateDaemonSet type for use +// with apply. +type RollingUpdateDaemonSetApplyConfiguration struct { + MaxUnavailable *intstr.IntOrString `json:"maxUnavailable,omitempty"` + MaxSurge *intstr.IntOrString `json:"maxSurge,omitempty"` +} + +// RollingUpdateDaemonSetApplyConfiguration constructs an declarative configuration of the RollingUpdateDaemonSet type for use with +// apply. +func RollingUpdateDaemonSet() *RollingUpdateDaemonSetApplyConfiguration { + return &RollingUpdateDaemonSetApplyConfiguration{} +} + +// WithMaxUnavailable sets the MaxUnavailable field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MaxUnavailable field is set to the value of the last call. +func (b *RollingUpdateDaemonSetApplyConfiguration) WithMaxUnavailable(value intstr.IntOrString) *RollingUpdateDaemonSetApplyConfiguration { + b.MaxUnavailable = &value + return b +} + +// WithMaxSurge sets the MaxSurge field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MaxSurge field is set to the value of the last call. +func (b *RollingUpdateDaemonSetApplyConfiguration) WithMaxSurge(value intstr.IntOrString) *RollingUpdateDaemonSetApplyConfiguration { + b.MaxSurge = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1/rollingupdatedeployment.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1/rollingupdatedeployment.go new file mode 100644 index 000000000000..ca9daaf24955 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1/rollingupdatedeployment.go @@ -0,0 +1,52 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + intstr "k8s.io/apimachinery/pkg/util/intstr" +) + +// RollingUpdateDeploymentApplyConfiguration represents an declarative configuration of the RollingUpdateDeployment type for use +// with apply. +type RollingUpdateDeploymentApplyConfiguration struct { + MaxUnavailable *intstr.IntOrString `json:"maxUnavailable,omitempty"` + MaxSurge *intstr.IntOrString `json:"maxSurge,omitempty"` +} + +// RollingUpdateDeploymentApplyConfiguration constructs an declarative configuration of the RollingUpdateDeployment type for use with +// apply. +func RollingUpdateDeployment() *RollingUpdateDeploymentApplyConfiguration { + return &RollingUpdateDeploymentApplyConfiguration{} +} + +// WithMaxUnavailable sets the MaxUnavailable field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MaxUnavailable field is set to the value of the last call. +func (b *RollingUpdateDeploymentApplyConfiguration) WithMaxUnavailable(value intstr.IntOrString) *RollingUpdateDeploymentApplyConfiguration { + b.MaxUnavailable = &value + return b +} + +// WithMaxSurge sets the MaxSurge field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MaxSurge field is set to the value of the last call. +func (b *RollingUpdateDeploymentApplyConfiguration) WithMaxSurge(value intstr.IntOrString) *RollingUpdateDeploymentApplyConfiguration { + b.MaxSurge = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1/rollingupdatestatefulsetstrategy.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1/rollingupdatestatefulsetstrategy.go new file mode 100644 index 000000000000..2090d88ed9d5 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1/rollingupdatestatefulsetstrategy.go @@ -0,0 +1,39 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// RollingUpdateStatefulSetStrategyApplyConfiguration represents an declarative configuration of the RollingUpdateStatefulSetStrategy type for use +// with apply. +type RollingUpdateStatefulSetStrategyApplyConfiguration struct { + Partition *int32 `json:"partition,omitempty"` +} + +// RollingUpdateStatefulSetStrategyApplyConfiguration constructs an declarative configuration of the RollingUpdateStatefulSetStrategy type for use with +// apply. +func RollingUpdateStatefulSetStrategy() *RollingUpdateStatefulSetStrategyApplyConfiguration { + return &RollingUpdateStatefulSetStrategyApplyConfiguration{} +} + +// WithPartition sets the Partition field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Partition field is set to the value of the last call. +func (b *RollingUpdateStatefulSetStrategyApplyConfiguration) WithPartition(value int32) *RollingUpdateStatefulSetStrategyApplyConfiguration { + b.Partition = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1/statefulset.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1/statefulset.go new file mode 100644 index 000000000000..ff0d50862c35 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1/statefulset.go @@ -0,0 +1,265 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + apiappsv1 "k8s.io/api/apps/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// StatefulSetApplyConfiguration represents an declarative configuration of the StatefulSet type for use +// with apply. +type StatefulSetApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *StatefulSetSpecApplyConfiguration `json:"spec,omitempty"` + Status *StatefulSetStatusApplyConfiguration `json:"status,omitempty"` +} + +// StatefulSet constructs an declarative configuration of the StatefulSet type for use with +// apply. +func StatefulSet(name, namespace string) *StatefulSetApplyConfiguration { + b := &StatefulSetApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("StatefulSet") + b.WithAPIVersion("apps/v1") + return b +} + +// ExtractStatefulSet extracts the applied configuration owned by fieldManager from +// statefulSet. If no managedFields are found in statefulSet for fieldManager, a +// StatefulSetApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// statefulSet must be a unmodified StatefulSet API object that was retrieved from the Kubernetes API. +// ExtractStatefulSet provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractStatefulSet(statefulSet *apiappsv1.StatefulSet, fieldManager string) (*StatefulSetApplyConfiguration, error) { + b := &StatefulSetApplyConfiguration{} + err := managedfields.ExtractInto(statefulSet, internal.Parser().Type("io.k8s.api.apps.v1.StatefulSet"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(statefulSet.Name) + b.WithNamespace(statefulSet.Namespace) + + b.WithKind("StatefulSet") + b.WithAPIVersion("apps/v1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *StatefulSetApplyConfiguration) WithKind(value string) *StatefulSetApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *StatefulSetApplyConfiguration) WithAPIVersion(value string) *StatefulSetApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *StatefulSetApplyConfiguration) WithName(value string) *StatefulSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *StatefulSetApplyConfiguration) WithGenerateName(value string) *StatefulSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *StatefulSetApplyConfiguration) WithNamespace(value string) *StatefulSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *StatefulSetApplyConfiguration) WithSelfLink(value string) *StatefulSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *StatefulSetApplyConfiguration) WithUID(value types.UID) *StatefulSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *StatefulSetApplyConfiguration) WithResourceVersion(value string) *StatefulSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *StatefulSetApplyConfiguration) WithGeneration(value int64) *StatefulSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *StatefulSetApplyConfiguration) WithCreationTimestamp(value metav1.Time) *StatefulSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *StatefulSetApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *StatefulSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *StatefulSetApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *StatefulSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *StatefulSetApplyConfiguration) WithLabels(entries map[string]string) *StatefulSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *StatefulSetApplyConfiguration) WithAnnotations(entries map[string]string) *StatefulSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *StatefulSetApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *StatefulSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *StatefulSetApplyConfiguration) WithFinalizers(values ...string) *StatefulSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *StatefulSetApplyConfiguration) WithClusterName(value string) *StatefulSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *StatefulSetApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *StatefulSetApplyConfiguration) WithSpec(value *StatefulSetSpecApplyConfiguration) *StatefulSetApplyConfiguration { + b.Spec = value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *StatefulSetApplyConfiguration) WithStatus(value *StatefulSetStatusApplyConfiguration) *StatefulSetApplyConfiguration { + b.Status = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1/statefulsetcondition.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1/statefulsetcondition.go new file mode 100644 index 000000000000..f9d47850d6c9 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1/statefulsetcondition.go @@ -0,0 +1,81 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/apps/v1" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// StatefulSetConditionApplyConfiguration represents an declarative configuration of the StatefulSetCondition type for use +// with apply. +type StatefulSetConditionApplyConfiguration struct { + Type *v1.StatefulSetConditionType `json:"type,omitempty"` + Status *corev1.ConditionStatus `json:"status,omitempty"` + LastTransitionTime *metav1.Time `json:"lastTransitionTime,omitempty"` + Reason *string `json:"reason,omitempty"` + Message *string `json:"message,omitempty"` +} + +// StatefulSetConditionApplyConfiguration constructs an declarative configuration of the StatefulSetCondition type for use with +// apply. +func StatefulSetCondition() *StatefulSetConditionApplyConfiguration { + return &StatefulSetConditionApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *StatefulSetConditionApplyConfiguration) WithType(value v1.StatefulSetConditionType) *StatefulSetConditionApplyConfiguration { + b.Type = &value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *StatefulSetConditionApplyConfiguration) WithStatus(value corev1.ConditionStatus) *StatefulSetConditionApplyConfiguration { + b.Status = &value + return b +} + +// WithLastTransitionTime sets the LastTransitionTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastTransitionTime field is set to the value of the last call. +func (b *StatefulSetConditionApplyConfiguration) WithLastTransitionTime(value metav1.Time) *StatefulSetConditionApplyConfiguration { + b.LastTransitionTime = &value + return b +} + +// WithReason sets the Reason field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Reason field is set to the value of the last call. +func (b *StatefulSetConditionApplyConfiguration) WithReason(value string) *StatefulSetConditionApplyConfiguration { + b.Reason = &value + return b +} + +// WithMessage sets the Message field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Message field is set to the value of the last call. +func (b *StatefulSetConditionApplyConfiguration) WithMessage(value string) *StatefulSetConditionApplyConfiguration { + b.Message = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1/statefulsetspec.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1/statefulsetspec.go new file mode 100644 index 000000000000..502f00ba4509 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1/statefulsetspec.go @@ -0,0 +1,113 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + appsv1 "k8s.io/api/apps/v1" + corev1 "k8s.io/client-go/applyconfigurations/core/v1" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// StatefulSetSpecApplyConfiguration represents an declarative configuration of the StatefulSetSpec type for use +// with apply. +type StatefulSetSpecApplyConfiguration struct { + Replicas *int32 `json:"replicas,omitempty"` + Selector *v1.LabelSelectorApplyConfiguration `json:"selector,omitempty"` + Template *corev1.PodTemplateSpecApplyConfiguration `json:"template,omitempty"` + VolumeClaimTemplates []corev1.PersistentVolumeClaimApplyConfiguration `json:"volumeClaimTemplates,omitempty"` + ServiceName *string `json:"serviceName,omitempty"` + PodManagementPolicy *appsv1.PodManagementPolicyType `json:"podManagementPolicy,omitempty"` + UpdateStrategy *StatefulSetUpdateStrategyApplyConfiguration `json:"updateStrategy,omitempty"` + RevisionHistoryLimit *int32 `json:"revisionHistoryLimit,omitempty"` +} + +// StatefulSetSpecApplyConfiguration constructs an declarative configuration of the StatefulSetSpec type for use with +// apply. +func StatefulSetSpec() *StatefulSetSpecApplyConfiguration { + return &StatefulSetSpecApplyConfiguration{} +} + +// WithReplicas sets the Replicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Replicas field is set to the value of the last call. +func (b *StatefulSetSpecApplyConfiguration) WithReplicas(value int32) *StatefulSetSpecApplyConfiguration { + b.Replicas = &value + return b +} + +// WithSelector sets the Selector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Selector field is set to the value of the last call. +func (b *StatefulSetSpecApplyConfiguration) WithSelector(value *v1.LabelSelectorApplyConfiguration) *StatefulSetSpecApplyConfiguration { + b.Selector = value + return b +} + +// WithTemplate sets the Template field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Template field is set to the value of the last call. +func (b *StatefulSetSpecApplyConfiguration) WithTemplate(value *corev1.PodTemplateSpecApplyConfiguration) *StatefulSetSpecApplyConfiguration { + b.Template = value + return b +} + +// WithVolumeClaimTemplates adds the given value to the VolumeClaimTemplates field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the VolumeClaimTemplates field. +func (b *StatefulSetSpecApplyConfiguration) WithVolumeClaimTemplates(values ...*corev1.PersistentVolumeClaimApplyConfiguration) *StatefulSetSpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithVolumeClaimTemplates") + } + b.VolumeClaimTemplates = append(b.VolumeClaimTemplates, *values[i]) + } + return b +} + +// WithServiceName sets the ServiceName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ServiceName field is set to the value of the last call. +func (b *StatefulSetSpecApplyConfiguration) WithServiceName(value string) *StatefulSetSpecApplyConfiguration { + b.ServiceName = &value + return b +} + +// WithPodManagementPolicy sets the PodManagementPolicy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PodManagementPolicy field is set to the value of the last call. +func (b *StatefulSetSpecApplyConfiguration) WithPodManagementPolicy(value appsv1.PodManagementPolicyType) *StatefulSetSpecApplyConfiguration { + b.PodManagementPolicy = &value + return b +} + +// WithUpdateStrategy sets the UpdateStrategy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UpdateStrategy field is set to the value of the last call. +func (b *StatefulSetSpecApplyConfiguration) WithUpdateStrategy(value *StatefulSetUpdateStrategyApplyConfiguration) *StatefulSetSpecApplyConfiguration { + b.UpdateStrategy = value + return b +} + +// WithRevisionHistoryLimit sets the RevisionHistoryLimit field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RevisionHistoryLimit field is set to the value of the last call. +func (b *StatefulSetSpecApplyConfiguration) WithRevisionHistoryLimit(value int32) *StatefulSetSpecApplyConfiguration { + b.RevisionHistoryLimit = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1/statefulsetstatus.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1/statefulsetstatus.go new file mode 100644 index 000000000000..58c07475e549 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1/statefulsetstatus.go @@ -0,0 +1,116 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// StatefulSetStatusApplyConfiguration represents an declarative configuration of the StatefulSetStatus type for use +// with apply. +type StatefulSetStatusApplyConfiguration struct { + ObservedGeneration *int64 `json:"observedGeneration,omitempty"` + Replicas *int32 `json:"replicas,omitempty"` + ReadyReplicas *int32 `json:"readyReplicas,omitempty"` + CurrentReplicas *int32 `json:"currentReplicas,omitempty"` + UpdatedReplicas *int32 `json:"updatedReplicas,omitempty"` + CurrentRevision *string `json:"currentRevision,omitempty"` + UpdateRevision *string `json:"updateRevision,omitempty"` + CollisionCount *int32 `json:"collisionCount,omitempty"` + Conditions []StatefulSetConditionApplyConfiguration `json:"conditions,omitempty"` +} + +// StatefulSetStatusApplyConfiguration constructs an declarative configuration of the StatefulSetStatus type for use with +// apply. +func StatefulSetStatus() *StatefulSetStatusApplyConfiguration { + return &StatefulSetStatusApplyConfiguration{} +} + +// WithObservedGeneration sets the ObservedGeneration field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ObservedGeneration field is set to the value of the last call. +func (b *StatefulSetStatusApplyConfiguration) WithObservedGeneration(value int64) *StatefulSetStatusApplyConfiguration { + b.ObservedGeneration = &value + return b +} + +// WithReplicas sets the Replicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Replicas field is set to the value of the last call. +func (b *StatefulSetStatusApplyConfiguration) WithReplicas(value int32) *StatefulSetStatusApplyConfiguration { + b.Replicas = &value + return b +} + +// WithReadyReplicas sets the ReadyReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadyReplicas field is set to the value of the last call. +func (b *StatefulSetStatusApplyConfiguration) WithReadyReplicas(value int32) *StatefulSetStatusApplyConfiguration { + b.ReadyReplicas = &value + return b +} + +// WithCurrentReplicas sets the CurrentReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CurrentReplicas field is set to the value of the last call. +func (b *StatefulSetStatusApplyConfiguration) WithCurrentReplicas(value int32) *StatefulSetStatusApplyConfiguration { + b.CurrentReplicas = &value + return b +} + +// WithUpdatedReplicas sets the UpdatedReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UpdatedReplicas field is set to the value of the last call. +func (b *StatefulSetStatusApplyConfiguration) WithUpdatedReplicas(value int32) *StatefulSetStatusApplyConfiguration { + b.UpdatedReplicas = &value + return b +} + +// WithCurrentRevision sets the CurrentRevision field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CurrentRevision field is set to the value of the last call. +func (b *StatefulSetStatusApplyConfiguration) WithCurrentRevision(value string) *StatefulSetStatusApplyConfiguration { + b.CurrentRevision = &value + return b +} + +// WithUpdateRevision sets the UpdateRevision field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UpdateRevision field is set to the value of the last call. +func (b *StatefulSetStatusApplyConfiguration) WithUpdateRevision(value string) *StatefulSetStatusApplyConfiguration { + b.UpdateRevision = &value + return b +} + +// WithCollisionCount sets the CollisionCount field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CollisionCount field is set to the value of the last call. +func (b *StatefulSetStatusApplyConfiguration) WithCollisionCount(value int32) *StatefulSetStatusApplyConfiguration { + b.CollisionCount = &value + return b +} + +// WithConditions adds the given value to the Conditions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Conditions field. +func (b *StatefulSetStatusApplyConfiguration) WithConditions(values ...*StatefulSetConditionApplyConfiguration) *StatefulSetStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithConditions") + } + b.Conditions = append(b.Conditions, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1/statefulsetupdatestrategy.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1/statefulsetupdatestrategy.go new file mode 100644 index 000000000000..5268a1e06588 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1/statefulsetupdatestrategy.go @@ -0,0 +1,52 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/apps/v1" +) + +// StatefulSetUpdateStrategyApplyConfiguration represents an declarative configuration of the StatefulSetUpdateStrategy type for use +// with apply. +type StatefulSetUpdateStrategyApplyConfiguration struct { + Type *v1.StatefulSetUpdateStrategyType `json:"type,omitempty"` + RollingUpdate *RollingUpdateStatefulSetStrategyApplyConfiguration `json:"rollingUpdate,omitempty"` +} + +// StatefulSetUpdateStrategyApplyConfiguration constructs an declarative configuration of the StatefulSetUpdateStrategy type for use with +// apply. +func StatefulSetUpdateStrategy() *StatefulSetUpdateStrategyApplyConfiguration { + return &StatefulSetUpdateStrategyApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *StatefulSetUpdateStrategyApplyConfiguration) WithType(value v1.StatefulSetUpdateStrategyType) *StatefulSetUpdateStrategyApplyConfiguration { + b.Type = &value + return b +} + +// WithRollingUpdate sets the RollingUpdate field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RollingUpdate field is set to the value of the last call. +func (b *StatefulSetUpdateStrategyApplyConfiguration) WithRollingUpdate(value *RollingUpdateStatefulSetStrategyApplyConfiguration) *StatefulSetUpdateStrategyApplyConfiguration { + b.RollingUpdate = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/controllerrevision.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/controllerrevision.go new file mode 100644 index 000000000000..4497fd69d681 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/controllerrevision.go @@ -0,0 +1,266 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1beta1 "k8s.io/api/apps/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// ControllerRevisionApplyConfiguration represents an declarative configuration of the ControllerRevision type for use +// with apply. +type ControllerRevisionApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Data *runtime.RawExtension `json:"data,omitempty"` + Revision *int64 `json:"revision,omitempty"` +} + +// ControllerRevision constructs an declarative configuration of the ControllerRevision type for use with +// apply. +func ControllerRevision(name, namespace string) *ControllerRevisionApplyConfiguration { + b := &ControllerRevisionApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("ControllerRevision") + b.WithAPIVersion("apps/v1beta1") + return b +} + +// ExtractControllerRevision extracts the applied configuration owned by fieldManager from +// controllerRevision. If no managedFields are found in controllerRevision for fieldManager, a +// ControllerRevisionApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// controllerRevision must be a unmodified ControllerRevision API object that was retrieved from the Kubernetes API. +// ExtractControllerRevision provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractControllerRevision(controllerRevision *v1beta1.ControllerRevision, fieldManager string) (*ControllerRevisionApplyConfiguration, error) { + b := &ControllerRevisionApplyConfiguration{} + err := managedfields.ExtractInto(controllerRevision, internal.Parser().Type("io.k8s.api.apps.v1beta1.ControllerRevision"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(controllerRevision.Name) + b.WithNamespace(controllerRevision.Namespace) + + b.WithKind("ControllerRevision") + b.WithAPIVersion("apps/v1beta1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *ControllerRevisionApplyConfiguration) WithKind(value string) *ControllerRevisionApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *ControllerRevisionApplyConfiguration) WithAPIVersion(value string) *ControllerRevisionApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ControllerRevisionApplyConfiguration) WithName(value string) *ControllerRevisionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *ControllerRevisionApplyConfiguration) WithGenerateName(value string) *ControllerRevisionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *ControllerRevisionApplyConfiguration) WithNamespace(value string) *ControllerRevisionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *ControllerRevisionApplyConfiguration) WithSelfLink(value string) *ControllerRevisionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *ControllerRevisionApplyConfiguration) WithUID(value types.UID) *ControllerRevisionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *ControllerRevisionApplyConfiguration) WithResourceVersion(value string) *ControllerRevisionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *ControllerRevisionApplyConfiguration) WithGeneration(value int64) *ControllerRevisionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *ControllerRevisionApplyConfiguration) WithCreationTimestamp(value metav1.Time) *ControllerRevisionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *ControllerRevisionApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *ControllerRevisionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *ControllerRevisionApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *ControllerRevisionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *ControllerRevisionApplyConfiguration) WithLabels(entries map[string]string) *ControllerRevisionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *ControllerRevisionApplyConfiguration) WithAnnotations(entries map[string]string) *ControllerRevisionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *ControllerRevisionApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *ControllerRevisionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *ControllerRevisionApplyConfiguration) WithFinalizers(values ...string) *ControllerRevisionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *ControllerRevisionApplyConfiguration) WithClusterName(value string) *ControllerRevisionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *ControllerRevisionApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithData sets the Data field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Data field is set to the value of the last call. +func (b *ControllerRevisionApplyConfiguration) WithData(value runtime.RawExtension) *ControllerRevisionApplyConfiguration { + b.Data = &value + return b +} + +// WithRevision sets the Revision field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Revision field is set to the value of the last call. +func (b *ControllerRevisionApplyConfiguration) WithRevision(value int64) *ControllerRevisionApplyConfiguration { + b.Revision = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/deployment.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/deployment.go new file mode 100644 index 000000000000..c79a614d3ad7 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/deployment.go @@ -0,0 +1,265 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + appsv1beta1 "k8s.io/api/apps/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// DeploymentApplyConfiguration represents an declarative configuration of the Deployment type for use +// with apply. +type DeploymentApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *DeploymentSpecApplyConfiguration `json:"spec,omitempty"` + Status *DeploymentStatusApplyConfiguration `json:"status,omitempty"` +} + +// Deployment constructs an declarative configuration of the Deployment type for use with +// apply. +func Deployment(name, namespace string) *DeploymentApplyConfiguration { + b := &DeploymentApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("Deployment") + b.WithAPIVersion("apps/v1beta1") + return b +} + +// ExtractDeployment extracts the applied configuration owned by fieldManager from +// deployment. If no managedFields are found in deployment for fieldManager, a +// DeploymentApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// deployment must be a unmodified Deployment API object that was retrieved from the Kubernetes API. +// ExtractDeployment provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractDeployment(deployment *appsv1beta1.Deployment, fieldManager string) (*DeploymentApplyConfiguration, error) { + b := &DeploymentApplyConfiguration{} + err := managedfields.ExtractInto(deployment, internal.Parser().Type("io.k8s.api.apps.v1beta1.Deployment"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(deployment.Name) + b.WithNamespace(deployment.Namespace) + + b.WithKind("Deployment") + b.WithAPIVersion("apps/v1beta1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithKind(value string) *DeploymentApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithAPIVersion(value string) *DeploymentApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithName(value string) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithGenerateName(value string) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithNamespace(value string) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithSelfLink(value string) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithUID(value types.UID) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithResourceVersion(value string) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithGeneration(value int64) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithCreationTimestamp(value metav1.Time) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *DeploymentApplyConfiguration) WithLabels(entries map[string]string) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *DeploymentApplyConfiguration) WithAnnotations(entries map[string]string) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *DeploymentApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *DeploymentApplyConfiguration) WithFinalizers(values ...string) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithClusterName(value string) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *DeploymentApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithSpec(value *DeploymentSpecApplyConfiguration) *DeploymentApplyConfiguration { + b.Spec = value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithStatus(value *DeploymentStatusApplyConfiguration) *DeploymentApplyConfiguration { + b.Status = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/deploymentcondition.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/deploymentcondition.go new file mode 100644 index 000000000000..9da8ce089964 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/deploymentcondition.go @@ -0,0 +1,90 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1beta1 "k8s.io/api/apps/v1beta1" + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// DeploymentConditionApplyConfiguration represents an declarative configuration of the DeploymentCondition type for use +// with apply. +type DeploymentConditionApplyConfiguration struct { + Type *v1beta1.DeploymentConditionType `json:"type,omitempty"` + Status *v1.ConditionStatus `json:"status,omitempty"` + LastUpdateTime *metav1.Time `json:"lastUpdateTime,omitempty"` + LastTransitionTime *metav1.Time `json:"lastTransitionTime,omitempty"` + Reason *string `json:"reason,omitempty"` + Message *string `json:"message,omitempty"` +} + +// DeploymentConditionApplyConfiguration constructs an declarative configuration of the DeploymentCondition type for use with +// apply. +func DeploymentCondition() *DeploymentConditionApplyConfiguration { + return &DeploymentConditionApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *DeploymentConditionApplyConfiguration) WithType(value v1beta1.DeploymentConditionType) *DeploymentConditionApplyConfiguration { + b.Type = &value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *DeploymentConditionApplyConfiguration) WithStatus(value v1.ConditionStatus) *DeploymentConditionApplyConfiguration { + b.Status = &value + return b +} + +// WithLastUpdateTime sets the LastUpdateTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastUpdateTime field is set to the value of the last call. +func (b *DeploymentConditionApplyConfiguration) WithLastUpdateTime(value metav1.Time) *DeploymentConditionApplyConfiguration { + b.LastUpdateTime = &value + return b +} + +// WithLastTransitionTime sets the LastTransitionTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastTransitionTime field is set to the value of the last call. +func (b *DeploymentConditionApplyConfiguration) WithLastTransitionTime(value metav1.Time) *DeploymentConditionApplyConfiguration { + b.LastTransitionTime = &value + return b +} + +// WithReason sets the Reason field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Reason field is set to the value of the last call. +func (b *DeploymentConditionApplyConfiguration) WithReason(value string) *DeploymentConditionApplyConfiguration { + b.Reason = &value + return b +} + +// WithMessage sets the Message field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Message field is set to the value of the last call. +func (b *DeploymentConditionApplyConfiguration) WithMessage(value string) *DeploymentConditionApplyConfiguration { + b.Message = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/deploymentspec.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/deploymentspec.go new file mode 100644 index 000000000000..5e18476bdcab --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/deploymentspec.go @@ -0,0 +1,116 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + corev1 "k8s.io/client-go/applyconfigurations/core/v1" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// DeploymentSpecApplyConfiguration represents an declarative configuration of the DeploymentSpec type for use +// with apply. +type DeploymentSpecApplyConfiguration struct { + Replicas *int32 `json:"replicas,omitempty"` + Selector *v1.LabelSelectorApplyConfiguration `json:"selector,omitempty"` + Template *corev1.PodTemplateSpecApplyConfiguration `json:"template,omitempty"` + Strategy *DeploymentStrategyApplyConfiguration `json:"strategy,omitempty"` + MinReadySeconds *int32 `json:"minReadySeconds,omitempty"` + RevisionHistoryLimit *int32 `json:"revisionHistoryLimit,omitempty"` + Paused *bool `json:"paused,omitempty"` + RollbackTo *RollbackConfigApplyConfiguration `json:"rollbackTo,omitempty"` + ProgressDeadlineSeconds *int32 `json:"progressDeadlineSeconds,omitempty"` +} + +// DeploymentSpecApplyConfiguration constructs an declarative configuration of the DeploymentSpec type for use with +// apply. +func DeploymentSpec() *DeploymentSpecApplyConfiguration { + return &DeploymentSpecApplyConfiguration{} +} + +// WithReplicas sets the Replicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Replicas field is set to the value of the last call. +func (b *DeploymentSpecApplyConfiguration) WithReplicas(value int32) *DeploymentSpecApplyConfiguration { + b.Replicas = &value + return b +} + +// WithSelector sets the Selector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Selector field is set to the value of the last call. +func (b *DeploymentSpecApplyConfiguration) WithSelector(value *v1.LabelSelectorApplyConfiguration) *DeploymentSpecApplyConfiguration { + b.Selector = value + return b +} + +// WithTemplate sets the Template field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Template field is set to the value of the last call. +func (b *DeploymentSpecApplyConfiguration) WithTemplate(value *corev1.PodTemplateSpecApplyConfiguration) *DeploymentSpecApplyConfiguration { + b.Template = value + return b +} + +// WithStrategy sets the Strategy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Strategy field is set to the value of the last call. +func (b *DeploymentSpecApplyConfiguration) WithStrategy(value *DeploymentStrategyApplyConfiguration) *DeploymentSpecApplyConfiguration { + b.Strategy = value + return b +} + +// WithMinReadySeconds sets the MinReadySeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MinReadySeconds field is set to the value of the last call. +func (b *DeploymentSpecApplyConfiguration) WithMinReadySeconds(value int32) *DeploymentSpecApplyConfiguration { + b.MinReadySeconds = &value + return b +} + +// WithRevisionHistoryLimit sets the RevisionHistoryLimit field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RevisionHistoryLimit field is set to the value of the last call. +func (b *DeploymentSpecApplyConfiguration) WithRevisionHistoryLimit(value int32) *DeploymentSpecApplyConfiguration { + b.RevisionHistoryLimit = &value + return b +} + +// WithPaused sets the Paused field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Paused field is set to the value of the last call. +func (b *DeploymentSpecApplyConfiguration) WithPaused(value bool) *DeploymentSpecApplyConfiguration { + b.Paused = &value + return b +} + +// WithRollbackTo sets the RollbackTo field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RollbackTo field is set to the value of the last call. +func (b *DeploymentSpecApplyConfiguration) WithRollbackTo(value *RollbackConfigApplyConfiguration) *DeploymentSpecApplyConfiguration { + b.RollbackTo = value + return b +} + +// WithProgressDeadlineSeconds sets the ProgressDeadlineSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ProgressDeadlineSeconds field is set to the value of the last call. +func (b *DeploymentSpecApplyConfiguration) WithProgressDeadlineSeconds(value int32) *DeploymentSpecApplyConfiguration { + b.ProgressDeadlineSeconds = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/deploymentstatus.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/deploymentstatus.go new file mode 100644 index 000000000000..f8d1cf5d2559 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/deploymentstatus.go @@ -0,0 +1,107 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// DeploymentStatusApplyConfiguration represents an declarative configuration of the DeploymentStatus type for use +// with apply. +type DeploymentStatusApplyConfiguration struct { + ObservedGeneration *int64 `json:"observedGeneration,omitempty"` + Replicas *int32 `json:"replicas,omitempty"` + UpdatedReplicas *int32 `json:"updatedReplicas,omitempty"` + ReadyReplicas *int32 `json:"readyReplicas,omitempty"` + AvailableReplicas *int32 `json:"availableReplicas,omitempty"` + UnavailableReplicas *int32 `json:"unavailableReplicas,omitempty"` + Conditions []DeploymentConditionApplyConfiguration `json:"conditions,omitempty"` + CollisionCount *int32 `json:"collisionCount,omitempty"` +} + +// DeploymentStatusApplyConfiguration constructs an declarative configuration of the DeploymentStatus type for use with +// apply. +func DeploymentStatus() *DeploymentStatusApplyConfiguration { + return &DeploymentStatusApplyConfiguration{} +} + +// WithObservedGeneration sets the ObservedGeneration field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ObservedGeneration field is set to the value of the last call. +func (b *DeploymentStatusApplyConfiguration) WithObservedGeneration(value int64) *DeploymentStatusApplyConfiguration { + b.ObservedGeneration = &value + return b +} + +// WithReplicas sets the Replicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Replicas field is set to the value of the last call. +func (b *DeploymentStatusApplyConfiguration) WithReplicas(value int32) *DeploymentStatusApplyConfiguration { + b.Replicas = &value + return b +} + +// WithUpdatedReplicas sets the UpdatedReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UpdatedReplicas field is set to the value of the last call. +func (b *DeploymentStatusApplyConfiguration) WithUpdatedReplicas(value int32) *DeploymentStatusApplyConfiguration { + b.UpdatedReplicas = &value + return b +} + +// WithReadyReplicas sets the ReadyReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadyReplicas field is set to the value of the last call. +func (b *DeploymentStatusApplyConfiguration) WithReadyReplicas(value int32) *DeploymentStatusApplyConfiguration { + b.ReadyReplicas = &value + return b +} + +// WithAvailableReplicas sets the AvailableReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AvailableReplicas field is set to the value of the last call. +func (b *DeploymentStatusApplyConfiguration) WithAvailableReplicas(value int32) *DeploymentStatusApplyConfiguration { + b.AvailableReplicas = &value + return b +} + +// WithUnavailableReplicas sets the UnavailableReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UnavailableReplicas field is set to the value of the last call. +func (b *DeploymentStatusApplyConfiguration) WithUnavailableReplicas(value int32) *DeploymentStatusApplyConfiguration { + b.UnavailableReplicas = &value + return b +} + +// WithConditions adds the given value to the Conditions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Conditions field. +func (b *DeploymentStatusApplyConfiguration) WithConditions(values ...*DeploymentConditionApplyConfiguration) *DeploymentStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithConditions") + } + b.Conditions = append(b.Conditions, *values[i]) + } + return b +} + +// WithCollisionCount sets the CollisionCount field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CollisionCount field is set to the value of the last call. +func (b *DeploymentStatusApplyConfiguration) WithCollisionCount(value int32) *DeploymentStatusApplyConfiguration { + b.CollisionCount = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/deploymentstrategy.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/deploymentstrategy.go new file mode 100644 index 000000000000..7279318a8849 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/deploymentstrategy.go @@ -0,0 +1,52 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1beta1 "k8s.io/api/apps/v1beta1" +) + +// DeploymentStrategyApplyConfiguration represents an declarative configuration of the DeploymentStrategy type for use +// with apply. +type DeploymentStrategyApplyConfiguration struct { + Type *v1beta1.DeploymentStrategyType `json:"type,omitempty"` + RollingUpdate *RollingUpdateDeploymentApplyConfiguration `json:"rollingUpdate,omitempty"` +} + +// DeploymentStrategyApplyConfiguration constructs an declarative configuration of the DeploymentStrategy type for use with +// apply. +func DeploymentStrategy() *DeploymentStrategyApplyConfiguration { + return &DeploymentStrategyApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *DeploymentStrategyApplyConfiguration) WithType(value v1beta1.DeploymentStrategyType) *DeploymentStrategyApplyConfiguration { + b.Type = &value + return b +} + +// WithRollingUpdate sets the RollingUpdate field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RollingUpdate field is set to the value of the last call. +func (b *DeploymentStrategyApplyConfiguration) WithRollingUpdate(value *RollingUpdateDeploymentApplyConfiguration) *DeploymentStrategyApplyConfiguration { + b.RollingUpdate = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/rollbackconfig.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/rollbackconfig.go new file mode 100644 index 000000000000..131e57a39df4 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/rollbackconfig.go @@ -0,0 +1,39 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// RollbackConfigApplyConfiguration represents an declarative configuration of the RollbackConfig type for use +// with apply. +type RollbackConfigApplyConfiguration struct { + Revision *int64 `json:"revision,omitempty"` +} + +// RollbackConfigApplyConfiguration constructs an declarative configuration of the RollbackConfig type for use with +// apply. +func RollbackConfig() *RollbackConfigApplyConfiguration { + return &RollbackConfigApplyConfiguration{} +} + +// WithRevision sets the Revision field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Revision field is set to the value of the last call. +func (b *RollbackConfigApplyConfiguration) WithRevision(value int64) *RollbackConfigApplyConfiguration { + b.Revision = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/rollingupdatedeployment.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/rollingupdatedeployment.go new file mode 100644 index 000000000000..dde5f064b000 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/rollingupdatedeployment.go @@ -0,0 +1,52 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + intstr "k8s.io/apimachinery/pkg/util/intstr" +) + +// RollingUpdateDeploymentApplyConfiguration represents an declarative configuration of the RollingUpdateDeployment type for use +// with apply. +type RollingUpdateDeploymentApplyConfiguration struct { + MaxUnavailable *intstr.IntOrString `json:"maxUnavailable,omitempty"` + MaxSurge *intstr.IntOrString `json:"maxSurge,omitempty"` +} + +// RollingUpdateDeploymentApplyConfiguration constructs an declarative configuration of the RollingUpdateDeployment type for use with +// apply. +func RollingUpdateDeployment() *RollingUpdateDeploymentApplyConfiguration { + return &RollingUpdateDeploymentApplyConfiguration{} +} + +// WithMaxUnavailable sets the MaxUnavailable field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MaxUnavailable field is set to the value of the last call. +func (b *RollingUpdateDeploymentApplyConfiguration) WithMaxUnavailable(value intstr.IntOrString) *RollingUpdateDeploymentApplyConfiguration { + b.MaxUnavailable = &value + return b +} + +// WithMaxSurge sets the MaxSurge field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MaxSurge field is set to the value of the last call. +func (b *RollingUpdateDeploymentApplyConfiguration) WithMaxSurge(value intstr.IntOrString) *RollingUpdateDeploymentApplyConfiguration { + b.MaxSurge = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/rollingupdatestatefulsetstrategy.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/rollingupdatestatefulsetstrategy.go new file mode 100644 index 000000000000..64273f61834d --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/rollingupdatestatefulsetstrategy.go @@ -0,0 +1,39 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// RollingUpdateStatefulSetStrategyApplyConfiguration represents an declarative configuration of the RollingUpdateStatefulSetStrategy type for use +// with apply. +type RollingUpdateStatefulSetStrategyApplyConfiguration struct { + Partition *int32 `json:"partition,omitempty"` +} + +// RollingUpdateStatefulSetStrategyApplyConfiguration constructs an declarative configuration of the RollingUpdateStatefulSetStrategy type for use with +// apply. +func RollingUpdateStatefulSetStrategy() *RollingUpdateStatefulSetStrategyApplyConfiguration { + return &RollingUpdateStatefulSetStrategyApplyConfiguration{} +} + +// WithPartition sets the Partition field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Partition field is set to the value of the last call. +func (b *RollingUpdateStatefulSetStrategyApplyConfiguration) WithPartition(value int32) *RollingUpdateStatefulSetStrategyApplyConfiguration { + b.Partition = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/statefulset.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/statefulset.go new file mode 100644 index 000000000000..909ee91f8f40 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/statefulset.go @@ -0,0 +1,265 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + appsv1beta1 "k8s.io/api/apps/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// StatefulSetApplyConfiguration represents an declarative configuration of the StatefulSet type for use +// with apply. +type StatefulSetApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *StatefulSetSpecApplyConfiguration `json:"spec,omitempty"` + Status *StatefulSetStatusApplyConfiguration `json:"status,omitempty"` +} + +// StatefulSet constructs an declarative configuration of the StatefulSet type for use with +// apply. +func StatefulSet(name, namespace string) *StatefulSetApplyConfiguration { + b := &StatefulSetApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("StatefulSet") + b.WithAPIVersion("apps/v1beta1") + return b +} + +// ExtractStatefulSet extracts the applied configuration owned by fieldManager from +// statefulSet. If no managedFields are found in statefulSet for fieldManager, a +// StatefulSetApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// statefulSet must be a unmodified StatefulSet API object that was retrieved from the Kubernetes API. +// ExtractStatefulSet provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractStatefulSet(statefulSet *appsv1beta1.StatefulSet, fieldManager string) (*StatefulSetApplyConfiguration, error) { + b := &StatefulSetApplyConfiguration{} + err := managedfields.ExtractInto(statefulSet, internal.Parser().Type("io.k8s.api.apps.v1beta1.StatefulSet"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(statefulSet.Name) + b.WithNamespace(statefulSet.Namespace) + + b.WithKind("StatefulSet") + b.WithAPIVersion("apps/v1beta1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *StatefulSetApplyConfiguration) WithKind(value string) *StatefulSetApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *StatefulSetApplyConfiguration) WithAPIVersion(value string) *StatefulSetApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *StatefulSetApplyConfiguration) WithName(value string) *StatefulSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *StatefulSetApplyConfiguration) WithGenerateName(value string) *StatefulSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *StatefulSetApplyConfiguration) WithNamespace(value string) *StatefulSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *StatefulSetApplyConfiguration) WithSelfLink(value string) *StatefulSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *StatefulSetApplyConfiguration) WithUID(value types.UID) *StatefulSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *StatefulSetApplyConfiguration) WithResourceVersion(value string) *StatefulSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *StatefulSetApplyConfiguration) WithGeneration(value int64) *StatefulSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *StatefulSetApplyConfiguration) WithCreationTimestamp(value metav1.Time) *StatefulSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *StatefulSetApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *StatefulSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *StatefulSetApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *StatefulSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *StatefulSetApplyConfiguration) WithLabels(entries map[string]string) *StatefulSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *StatefulSetApplyConfiguration) WithAnnotations(entries map[string]string) *StatefulSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *StatefulSetApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *StatefulSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *StatefulSetApplyConfiguration) WithFinalizers(values ...string) *StatefulSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *StatefulSetApplyConfiguration) WithClusterName(value string) *StatefulSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *StatefulSetApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *StatefulSetApplyConfiguration) WithSpec(value *StatefulSetSpecApplyConfiguration) *StatefulSetApplyConfiguration { + b.Spec = value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *StatefulSetApplyConfiguration) WithStatus(value *StatefulSetStatusApplyConfiguration) *StatefulSetApplyConfiguration { + b.Status = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/statefulsetcondition.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/statefulsetcondition.go new file mode 100644 index 000000000000..97e994ab71ee --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/statefulsetcondition.go @@ -0,0 +1,81 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1beta1 "k8s.io/api/apps/v1beta1" + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// StatefulSetConditionApplyConfiguration represents an declarative configuration of the StatefulSetCondition type for use +// with apply. +type StatefulSetConditionApplyConfiguration struct { + Type *v1beta1.StatefulSetConditionType `json:"type,omitempty"` + Status *v1.ConditionStatus `json:"status,omitempty"` + LastTransitionTime *metav1.Time `json:"lastTransitionTime,omitempty"` + Reason *string `json:"reason,omitempty"` + Message *string `json:"message,omitempty"` +} + +// StatefulSetConditionApplyConfiguration constructs an declarative configuration of the StatefulSetCondition type for use with +// apply. +func StatefulSetCondition() *StatefulSetConditionApplyConfiguration { + return &StatefulSetConditionApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *StatefulSetConditionApplyConfiguration) WithType(value v1beta1.StatefulSetConditionType) *StatefulSetConditionApplyConfiguration { + b.Type = &value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *StatefulSetConditionApplyConfiguration) WithStatus(value v1.ConditionStatus) *StatefulSetConditionApplyConfiguration { + b.Status = &value + return b +} + +// WithLastTransitionTime sets the LastTransitionTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastTransitionTime field is set to the value of the last call. +func (b *StatefulSetConditionApplyConfiguration) WithLastTransitionTime(value metav1.Time) *StatefulSetConditionApplyConfiguration { + b.LastTransitionTime = &value + return b +} + +// WithReason sets the Reason field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Reason field is set to the value of the last call. +func (b *StatefulSetConditionApplyConfiguration) WithReason(value string) *StatefulSetConditionApplyConfiguration { + b.Reason = &value + return b +} + +// WithMessage sets the Message field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Message field is set to the value of the last call. +func (b *StatefulSetConditionApplyConfiguration) WithMessage(value string) *StatefulSetConditionApplyConfiguration { + b.Message = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/statefulsetspec.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/statefulsetspec.go new file mode 100644 index 000000000000..61b86a9d82f6 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/statefulsetspec.go @@ -0,0 +1,113 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1beta1 "k8s.io/api/apps/v1beta1" + corev1 "k8s.io/client-go/applyconfigurations/core/v1" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// StatefulSetSpecApplyConfiguration represents an declarative configuration of the StatefulSetSpec type for use +// with apply. +type StatefulSetSpecApplyConfiguration struct { + Replicas *int32 `json:"replicas,omitempty"` + Selector *v1.LabelSelectorApplyConfiguration `json:"selector,omitempty"` + Template *corev1.PodTemplateSpecApplyConfiguration `json:"template,omitempty"` + VolumeClaimTemplates []corev1.PersistentVolumeClaimApplyConfiguration `json:"volumeClaimTemplates,omitempty"` + ServiceName *string `json:"serviceName,omitempty"` + PodManagementPolicy *v1beta1.PodManagementPolicyType `json:"podManagementPolicy,omitempty"` + UpdateStrategy *StatefulSetUpdateStrategyApplyConfiguration `json:"updateStrategy,omitempty"` + RevisionHistoryLimit *int32 `json:"revisionHistoryLimit,omitempty"` +} + +// StatefulSetSpecApplyConfiguration constructs an declarative configuration of the StatefulSetSpec type for use with +// apply. +func StatefulSetSpec() *StatefulSetSpecApplyConfiguration { + return &StatefulSetSpecApplyConfiguration{} +} + +// WithReplicas sets the Replicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Replicas field is set to the value of the last call. +func (b *StatefulSetSpecApplyConfiguration) WithReplicas(value int32) *StatefulSetSpecApplyConfiguration { + b.Replicas = &value + return b +} + +// WithSelector sets the Selector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Selector field is set to the value of the last call. +func (b *StatefulSetSpecApplyConfiguration) WithSelector(value *v1.LabelSelectorApplyConfiguration) *StatefulSetSpecApplyConfiguration { + b.Selector = value + return b +} + +// WithTemplate sets the Template field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Template field is set to the value of the last call. +func (b *StatefulSetSpecApplyConfiguration) WithTemplate(value *corev1.PodTemplateSpecApplyConfiguration) *StatefulSetSpecApplyConfiguration { + b.Template = value + return b +} + +// WithVolumeClaimTemplates adds the given value to the VolumeClaimTemplates field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the VolumeClaimTemplates field. +func (b *StatefulSetSpecApplyConfiguration) WithVolumeClaimTemplates(values ...*corev1.PersistentVolumeClaimApplyConfiguration) *StatefulSetSpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithVolumeClaimTemplates") + } + b.VolumeClaimTemplates = append(b.VolumeClaimTemplates, *values[i]) + } + return b +} + +// WithServiceName sets the ServiceName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ServiceName field is set to the value of the last call. +func (b *StatefulSetSpecApplyConfiguration) WithServiceName(value string) *StatefulSetSpecApplyConfiguration { + b.ServiceName = &value + return b +} + +// WithPodManagementPolicy sets the PodManagementPolicy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PodManagementPolicy field is set to the value of the last call. +func (b *StatefulSetSpecApplyConfiguration) WithPodManagementPolicy(value v1beta1.PodManagementPolicyType) *StatefulSetSpecApplyConfiguration { + b.PodManagementPolicy = &value + return b +} + +// WithUpdateStrategy sets the UpdateStrategy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UpdateStrategy field is set to the value of the last call. +func (b *StatefulSetSpecApplyConfiguration) WithUpdateStrategy(value *StatefulSetUpdateStrategyApplyConfiguration) *StatefulSetSpecApplyConfiguration { + b.UpdateStrategy = value + return b +} + +// WithRevisionHistoryLimit sets the RevisionHistoryLimit field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RevisionHistoryLimit field is set to the value of the last call. +func (b *StatefulSetSpecApplyConfiguration) WithRevisionHistoryLimit(value int32) *StatefulSetSpecApplyConfiguration { + b.RevisionHistoryLimit = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/statefulsetstatus.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/statefulsetstatus.go new file mode 100644 index 000000000000..b716352d2650 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/statefulsetstatus.go @@ -0,0 +1,116 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// StatefulSetStatusApplyConfiguration represents an declarative configuration of the StatefulSetStatus type for use +// with apply. +type StatefulSetStatusApplyConfiguration struct { + ObservedGeneration *int64 `json:"observedGeneration,omitempty"` + Replicas *int32 `json:"replicas,omitempty"` + ReadyReplicas *int32 `json:"readyReplicas,omitempty"` + CurrentReplicas *int32 `json:"currentReplicas,omitempty"` + UpdatedReplicas *int32 `json:"updatedReplicas,omitempty"` + CurrentRevision *string `json:"currentRevision,omitempty"` + UpdateRevision *string `json:"updateRevision,omitempty"` + CollisionCount *int32 `json:"collisionCount,omitempty"` + Conditions []StatefulSetConditionApplyConfiguration `json:"conditions,omitempty"` +} + +// StatefulSetStatusApplyConfiguration constructs an declarative configuration of the StatefulSetStatus type for use with +// apply. +func StatefulSetStatus() *StatefulSetStatusApplyConfiguration { + return &StatefulSetStatusApplyConfiguration{} +} + +// WithObservedGeneration sets the ObservedGeneration field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ObservedGeneration field is set to the value of the last call. +func (b *StatefulSetStatusApplyConfiguration) WithObservedGeneration(value int64) *StatefulSetStatusApplyConfiguration { + b.ObservedGeneration = &value + return b +} + +// WithReplicas sets the Replicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Replicas field is set to the value of the last call. +func (b *StatefulSetStatusApplyConfiguration) WithReplicas(value int32) *StatefulSetStatusApplyConfiguration { + b.Replicas = &value + return b +} + +// WithReadyReplicas sets the ReadyReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadyReplicas field is set to the value of the last call. +func (b *StatefulSetStatusApplyConfiguration) WithReadyReplicas(value int32) *StatefulSetStatusApplyConfiguration { + b.ReadyReplicas = &value + return b +} + +// WithCurrentReplicas sets the CurrentReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CurrentReplicas field is set to the value of the last call. +func (b *StatefulSetStatusApplyConfiguration) WithCurrentReplicas(value int32) *StatefulSetStatusApplyConfiguration { + b.CurrentReplicas = &value + return b +} + +// WithUpdatedReplicas sets the UpdatedReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UpdatedReplicas field is set to the value of the last call. +func (b *StatefulSetStatusApplyConfiguration) WithUpdatedReplicas(value int32) *StatefulSetStatusApplyConfiguration { + b.UpdatedReplicas = &value + return b +} + +// WithCurrentRevision sets the CurrentRevision field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CurrentRevision field is set to the value of the last call. +func (b *StatefulSetStatusApplyConfiguration) WithCurrentRevision(value string) *StatefulSetStatusApplyConfiguration { + b.CurrentRevision = &value + return b +} + +// WithUpdateRevision sets the UpdateRevision field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UpdateRevision field is set to the value of the last call. +func (b *StatefulSetStatusApplyConfiguration) WithUpdateRevision(value string) *StatefulSetStatusApplyConfiguration { + b.UpdateRevision = &value + return b +} + +// WithCollisionCount sets the CollisionCount field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CollisionCount field is set to the value of the last call. +func (b *StatefulSetStatusApplyConfiguration) WithCollisionCount(value int32) *StatefulSetStatusApplyConfiguration { + b.CollisionCount = &value + return b +} + +// WithConditions adds the given value to the Conditions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Conditions field. +func (b *StatefulSetStatusApplyConfiguration) WithConditions(values ...*StatefulSetConditionApplyConfiguration) *StatefulSetStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithConditions") + } + b.Conditions = append(b.Conditions, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/statefulsetupdatestrategy.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/statefulsetupdatestrategy.go new file mode 100644 index 000000000000..895c1e7f8ac0 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/statefulsetupdatestrategy.go @@ -0,0 +1,52 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1beta1 "k8s.io/api/apps/v1beta1" +) + +// StatefulSetUpdateStrategyApplyConfiguration represents an declarative configuration of the StatefulSetUpdateStrategy type for use +// with apply. +type StatefulSetUpdateStrategyApplyConfiguration struct { + Type *v1beta1.StatefulSetUpdateStrategyType `json:"type,omitempty"` + RollingUpdate *RollingUpdateStatefulSetStrategyApplyConfiguration `json:"rollingUpdate,omitempty"` +} + +// StatefulSetUpdateStrategyApplyConfiguration constructs an declarative configuration of the StatefulSetUpdateStrategy type for use with +// apply. +func StatefulSetUpdateStrategy() *StatefulSetUpdateStrategyApplyConfiguration { + return &StatefulSetUpdateStrategyApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *StatefulSetUpdateStrategyApplyConfiguration) WithType(value v1beta1.StatefulSetUpdateStrategyType) *StatefulSetUpdateStrategyApplyConfiguration { + b.Type = &value + return b +} + +// WithRollingUpdate sets the RollingUpdate field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RollingUpdate field is set to the value of the last call. +func (b *StatefulSetUpdateStrategyApplyConfiguration) WithRollingUpdate(value *RollingUpdateStatefulSetStrategyApplyConfiguration) *StatefulSetUpdateStrategyApplyConfiguration { + b.RollingUpdate = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/controllerrevision.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/controllerrevision.go new file mode 100644 index 000000000000..7c36cd82cb76 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/controllerrevision.go @@ -0,0 +1,266 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta2 + +import ( + v1beta2 "k8s.io/api/apps/v1beta2" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// ControllerRevisionApplyConfiguration represents an declarative configuration of the ControllerRevision type for use +// with apply. +type ControllerRevisionApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Data *runtime.RawExtension `json:"data,omitempty"` + Revision *int64 `json:"revision,omitempty"` +} + +// ControllerRevision constructs an declarative configuration of the ControllerRevision type for use with +// apply. +func ControllerRevision(name, namespace string) *ControllerRevisionApplyConfiguration { + b := &ControllerRevisionApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("ControllerRevision") + b.WithAPIVersion("apps/v1beta2") + return b +} + +// ExtractControllerRevision extracts the applied configuration owned by fieldManager from +// controllerRevision. If no managedFields are found in controllerRevision for fieldManager, a +// ControllerRevisionApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// controllerRevision must be a unmodified ControllerRevision API object that was retrieved from the Kubernetes API. +// ExtractControllerRevision provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractControllerRevision(controllerRevision *v1beta2.ControllerRevision, fieldManager string) (*ControllerRevisionApplyConfiguration, error) { + b := &ControllerRevisionApplyConfiguration{} + err := managedfields.ExtractInto(controllerRevision, internal.Parser().Type("io.k8s.api.apps.v1beta2.ControllerRevision"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(controllerRevision.Name) + b.WithNamespace(controllerRevision.Namespace) + + b.WithKind("ControllerRevision") + b.WithAPIVersion("apps/v1beta2") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *ControllerRevisionApplyConfiguration) WithKind(value string) *ControllerRevisionApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *ControllerRevisionApplyConfiguration) WithAPIVersion(value string) *ControllerRevisionApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ControllerRevisionApplyConfiguration) WithName(value string) *ControllerRevisionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *ControllerRevisionApplyConfiguration) WithGenerateName(value string) *ControllerRevisionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *ControllerRevisionApplyConfiguration) WithNamespace(value string) *ControllerRevisionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *ControllerRevisionApplyConfiguration) WithSelfLink(value string) *ControllerRevisionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *ControllerRevisionApplyConfiguration) WithUID(value types.UID) *ControllerRevisionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *ControllerRevisionApplyConfiguration) WithResourceVersion(value string) *ControllerRevisionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *ControllerRevisionApplyConfiguration) WithGeneration(value int64) *ControllerRevisionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *ControllerRevisionApplyConfiguration) WithCreationTimestamp(value metav1.Time) *ControllerRevisionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *ControllerRevisionApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *ControllerRevisionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *ControllerRevisionApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *ControllerRevisionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *ControllerRevisionApplyConfiguration) WithLabels(entries map[string]string) *ControllerRevisionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *ControllerRevisionApplyConfiguration) WithAnnotations(entries map[string]string) *ControllerRevisionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *ControllerRevisionApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *ControllerRevisionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *ControllerRevisionApplyConfiguration) WithFinalizers(values ...string) *ControllerRevisionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *ControllerRevisionApplyConfiguration) WithClusterName(value string) *ControllerRevisionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *ControllerRevisionApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithData sets the Data field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Data field is set to the value of the last call. +func (b *ControllerRevisionApplyConfiguration) WithData(value runtime.RawExtension) *ControllerRevisionApplyConfiguration { + b.Data = &value + return b +} + +// WithRevision sets the Revision field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Revision field is set to the value of the last call. +func (b *ControllerRevisionApplyConfiguration) WithRevision(value int64) *ControllerRevisionApplyConfiguration { + b.Revision = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/daemonset.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/daemonset.go new file mode 100644 index 000000000000..174ee8a1967a --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/daemonset.go @@ -0,0 +1,265 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta2 + +import ( + appsv1beta2 "k8s.io/api/apps/v1beta2" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// DaemonSetApplyConfiguration represents an declarative configuration of the DaemonSet type for use +// with apply. +type DaemonSetApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *DaemonSetSpecApplyConfiguration `json:"spec,omitempty"` + Status *DaemonSetStatusApplyConfiguration `json:"status,omitempty"` +} + +// DaemonSet constructs an declarative configuration of the DaemonSet type for use with +// apply. +func DaemonSet(name, namespace string) *DaemonSetApplyConfiguration { + b := &DaemonSetApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("DaemonSet") + b.WithAPIVersion("apps/v1beta2") + return b +} + +// ExtractDaemonSet extracts the applied configuration owned by fieldManager from +// daemonSet. If no managedFields are found in daemonSet for fieldManager, a +// DaemonSetApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// daemonSet must be a unmodified DaemonSet API object that was retrieved from the Kubernetes API. +// ExtractDaemonSet provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractDaemonSet(daemonSet *appsv1beta2.DaemonSet, fieldManager string) (*DaemonSetApplyConfiguration, error) { + b := &DaemonSetApplyConfiguration{} + err := managedfields.ExtractInto(daemonSet, internal.Parser().Type("io.k8s.api.apps.v1beta2.DaemonSet"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(daemonSet.Name) + b.WithNamespace(daemonSet.Namespace) + + b.WithKind("DaemonSet") + b.WithAPIVersion("apps/v1beta2") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *DaemonSetApplyConfiguration) WithKind(value string) *DaemonSetApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *DaemonSetApplyConfiguration) WithAPIVersion(value string) *DaemonSetApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *DaemonSetApplyConfiguration) WithName(value string) *DaemonSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *DaemonSetApplyConfiguration) WithGenerateName(value string) *DaemonSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *DaemonSetApplyConfiguration) WithNamespace(value string) *DaemonSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *DaemonSetApplyConfiguration) WithSelfLink(value string) *DaemonSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *DaemonSetApplyConfiguration) WithUID(value types.UID) *DaemonSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *DaemonSetApplyConfiguration) WithResourceVersion(value string) *DaemonSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *DaemonSetApplyConfiguration) WithGeneration(value int64) *DaemonSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *DaemonSetApplyConfiguration) WithCreationTimestamp(value metav1.Time) *DaemonSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *DaemonSetApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *DaemonSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *DaemonSetApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *DaemonSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *DaemonSetApplyConfiguration) WithLabels(entries map[string]string) *DaemonSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *DaemonSetApplyConfiguration) WithAnnotations(entries map[string]string) *DaemonSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *DaemonSetApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *DaemonSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *DaemonSetApplyConfiguration) WithFinalizers(values ...string) *DaemonSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *DaemonSetApplyConfiguration) WithClusterName(value string) *DaemonSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *DaemonSetApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *DaemonSetApplyConfiguration) WithSpec(value *DaemonSetSpecApplyConfiguration) *DaemonSetApplyConfiguration { + b.Spec = value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *DaemonSetApplyConfiguration) WithStatus(value *DaemonSetStatusApplyConfiguration) *DaemonSetApplyConfiguration { + b.Status = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/daemonsetcondition.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/daemonsetcondition.go new file mode 100644 index 000000000000..55dc1f487799 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/daemonsetcondition.go @@ -0,0 +1,81 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta2 + +import ( + v1beta2 "k8s.io/api/apps/v1beta2" + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// DaemonSetConditionApplyConfiguration represents an declarative configuration of the DaemonSetCondition type for use +// with apply. +type DaemonSetConditionApplyConfiguration struct { + Type *v1beta2.DaemonSetConditionType `json:"type,omitempty"` + Status *v1.ConditionStatus `json:"status,omitempty"` + LastTransitionTime *metav1.Time `json:"lastTransitionTime,omitempty"` + Reason *string `json:"reason,omitempty"` + Message *string `json:"message,omitempty"` +} + +// DaemonSetConditionApplyConfiguration constructs an declarative configuration of the DaemonSetCondition type for use with +// apply. +func DaemonSetCondition() *DaemonSetConditionApplyConfiguration { + return &DaemonSetConditionApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *DaemonSetConditionApplyConfiguration) WithType(value v1beta2.DaemonSetConditionType) *DaemonSetConditionApplyConfiguration { + b.Type = &value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *DaemonSetConditionApplyConfiguration) WithStatus(value v1.ConditionStatus) *DaemonSetConditionApplyConfiguration { + b.Status = &value + return b +} + +// WithLastTransitionTime sets the LastTransitionTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastTransitionTime field is set to the value of the last call. +func (b *DaemonSetConditionApplyConfiguration) WithLastTransitionTime(value metav1.Time) *DaemonSetConditionApplyConfiguration { + b.LastTransitionTime = &value + return b +} + +// WithReason sets the Reason field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Reason field is set to the value of the last call. +func (b *DaemonSetConditionApplyConfiguration) WithReason(value string) *DaemonSetConditionApplyConfiguration { + b.Reason = &value + return b +} + +// WithMessage sets the Message field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Message field is set to the value of the last call. +func (b *DaemonSetConditionApplyConfiguration) WithMessage(value string) *DaemonSetConditionApplyConfiguration { + b.Message = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/daemonsetspec.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/daemonsetspec.go new file mode 100644 index 000000000000..48137819af02 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/daemonsetspec.go @@ -0,0 +1,80 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta2 + +import ( + corev1 "k8s.io/client-go/applyconfigurations/core/v1" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// DaemonSetSpecApplyConfiguration represents an declarative configuration of the DaemonSetSpec type for use +// with apply. +type DaemonSetSpecApplyConfiguration struct { + Selector *v1.LabelSelectorApplyConfiguration `json:"selector,omitempty"` + Template *corev1.PodTemplateSpecApplyConfiguration `json:"template,omitempty"` + UpdateStrategy *DaemonSetUpdateStrategyApplyConfiguration `json:"updateStrategy,omitempty"` + MinReadySeconds *int32 `json:"minReadySeconds,omitempty"` + RevisionHistoryLimit *int32 `json:"revisionHistoryLimit,omitempty"` +} + +// DaemonSetSpecApplyConfiguration constructs an declarative configuration of the DaemonSetSpec type for use with +// apply. +func DaemonSetSpec() *DaemonSetSpecApplyConfiguration { + return &DaemonSetSpecApplyConfiguration{} +} + +// WithSelector sets the Selector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Selector field is set to the value of the last call. +func (b *DaemonSetSpecApplyConfiguration) WithSelector(value *v1.LabelSelectorApplyConfiguration) *DaemonSetSpecApplyConfiguration { + b.Selector = value + return b +} + +// WithTemplate sets the Template field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Template field is set to the value of the last call. +func (b *DaemonSetSpecApplyConfiguration) WithTemplate(value *corev1.PodTemplateSpecApplyConfiguration) *DaemonSetSpecApplyConfiguration { + b.Template = value + return b +} + +// WithUpdateStrategy sets the UpdateStrategy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UpdateStrategy field is set to the value of the last call. +func (b *DaemonSetSpecApplyConfiguration) WithUpdateStrategy(value *DaemonSetUpdateStrategyApplyConfiguration) *DaemonSetSpecApplyConfiguration { + b.UpdateStrategy = value + return b +} + +// WithMinReadySeconds sets the MinReadySeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MinReadySeconds field is set to the value of the last call. +func (b *DaemonSetSpecApplyConfiguration) WithMinReadySeconds(value int32) *DaemonSetSpecApplyConfiguration { + b.MinReadySeconds = &value + return b +} + +// WithRevisionHistoryLimit sets the RevisionHistoryLimit field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RevisionHistoryLimit field is set to the value of the last call. +func (b *DaemonSetSpecApplyConfiguration) WithRevisionHistoryLimit(value int32) *DaemonSetSpecApplyConfiguration { + b.RevisionHistoryLimit = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/daemonsetstatus.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/daemonsetstatus.go new file mode 100644 index 000000000000..29cda7a90ec7 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/daemonsetstatus.go @@ -0,0 +1,125 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta2 + +// DaemonSetStatusApplyConfiguration represents an declarative configuration of the DaemonSetStatus type for use +// with apply. +type DaemonSetStatusApplyConfiguration struct { + CurrentNumberScheduled *int32 `json:"currentNumberScheduled,omitempty"` + NumberMisscheduled *int32 `json:"numberMisscheduled,omitempty"` + DesiredNumberScheduled *int32 `json:"desiredNumberScheduled,omitempty"` + NumberReady *int32 `json:"numberReady,omitempty"` + ObservedGeneration *int64 `json:"observedGeneration,omitempty"` + UpdatedNumberScheduled *int32 `json:"updatedNumberScheduled,omitempty"` + NumberAvailable *int32 `json:"numberAvailable,omitempty"` + NumberUnavailable *int32 `json:"numberUnavailable,omitempty"` + CollisionCount *int32 `json:"collisionCount,omitempty"` + Conditions []DaemonSetConditionApplyConfiguration `json:"conditions,omitempty"` +} + +// DaemonSetStatusApplyConfiguration constructs an declarative configuration of the DaemonSetStatus type for use with +// apply. +func DaemonSetStatus() *DaemonSetStatusApplyConfiguration { + return &DaemonSetStatusApplyConfiguration{} +} + +// WithCurrentNumberScheduled sets the CurrentNumberScheduled field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CurrentNumberScheduled field is set to the value of the last call. +func (b *DaemonSetStatusApplyConfiguration) WithCurrentNumberScheduled(value int32) *DaemonSetStatusApplyConfiguration { + b.CurrentNumberScheduled = &value + return b +} + +// WithNumberMisscheduled sets the NumberMisscheduled field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NumberMisscheduled field is set to the value of the last call. +func (b *DaemonSetStatusApplyConfiguration) WithNumberMisscheduled(value int32) *DaemonSetStatusApplyConfiguration { + b.NumberMisscheduled = &value + return b +} + +// WithDesiredNumberScheduled sets the DesiredNumberScheduled field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DesiredNumberScheduled field is set to the value of the last call. +func (b *DaemonSetStatusApplyConfiguration) WithDesiredNumberScheduled(value int32) *DaemonSetStatusApplyConfiguration { + b.DesiredNumberScheduled = &value + return b +} + +// WithNumberReady sets the NumberReady field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NumberReady field is set to the value of the last call. +func (b *DaemonSetStatusApplyConfiguration) WithNumberReady(value int32) *DaemonSetStatusApplyConfiguration { + b.NumberReady = &value + return b +} + +// WithObservedGeneration sets the ObservedGeneration field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ObservedGeneration field is set to the value of the last call. +func (b *DaemonSetStatusApplyConfiguration) WithObservedGeneration(value int64) *DaemonSetStatusApplyConfiguration { + b.ObservedGeneration = &value + return b +} + +// WithUpdatedNumberScheduled sets the UpdatedNumberScheduled field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UpdatedNumberScheduled field is set to the value of the last call. +func (b *DaemonSetStatusApplyConfiguration) WithUpdatedNumberScheduled(value int32) *DaemonSetStatusApplyConfiguration { + b.UpdatedNumberScheduled = &value + return b +} + +// WithNumberAvailable sets the NumberAvailable field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NumberAvailable field is set to the value of the last call. +func (b *DaemonSetStatusApplyConfiguration) WithNumberAvailable(value int32) *DaemonSetStatusApplyConfiguration { + b.NumberAvailable = &value + return b +} + +// WithNumberUnavailable sets the NumberUnavailable field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NumberUnavailable field is set to the value of the last call. +func (b *DaemonSetStatusApplyConfiguration) WithNumberUnavailable(value int32) *DaemonSetStatusApplyConfiguration { + b.NumberUnavailable = &value + return b +} + +// WithCollisionCount sets the CollisionCount field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CollisionCount field is set to the value of the last call. +func (b *DaemonSetStatusApplyConfiguration) WithCollisionCount(value int32) *DaemonSetStatusApplyConfiguration { + b.CollisionCount = &value + return b +} + +// WithConditions adds the given value to the Conditions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Conditions field. +func (b *DaemonSetStatusApplyConfiguration) WithConditions(values ...*DaemonSetConditionApplyConfiguration) *DaemonSetStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithConditions") + } + b.Conditions = append(b.Conditions, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/daemonsetupdatestrategy.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/daemonsetupdatestrategy.go new file mode 100644 index 000000000000..07fc07fc6afc --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/daemonsetupdatestrategy.go @@ -0,0 +1,52 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta2 + +import ( + v1beta2 "k8s.io/api/apps/v1beta2" +) + +// DaemonSetUpdateStrategyApplyConfiguration represents an declarative configuration of the DaemonSetUpdateStrategy type for use +// with apply. +type DaemonSetUpdateStrategyApplyConfiguration struct { + Type *v1beta2.DaemonSetUpdateStrategyType `json:"type,omitempty"` + RollingUpdate *RollingUpdateDaemonSetApplyConfiguration `json:"rollingUpdate,omitempty"` +} + +// DaemonSetUpdateStrategyApplyConfiguration constructs an declarative configuration of the DaemonSetUpdateStrategy type for use with +// apply. +func DaemonSetUpdateStrategy() *DaemonSetUpdateStrategyApplyConfiguration { + return &DaemonSetUpdateStrategyApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *DaemonSetUpdateStrategyApplyConfiguration) WithType(value v1beta2.DaemonSetUpdateStrategyType) *DaemonSetUpdateStrategyApplyConfiguration { + b.Type = &value + return b +} + +// WithRollingUpdate sets the RollingUpdate field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RollingUpdate field is set to the value of the last call. +func (b *DaemonSetUpdateStrategyApplyConfiguration) WithRollingUpdate(value *RollingUpdateDaemonSetApplyConfiguration) *DaemonSetUpdateStrategyApplyConfiguration { + b.RollingUpdate = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/deployment.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/deployment.go new file mode 100644 index 000000000000..c59ae290fe2b --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/deployment.go @@ -0,0 +1,265 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta2 + +import ( + appsv1beta2 "k8s.io/api/apps/v1beta2" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// DeploymentApplyConfiguration represents an declarative configuration of the Deployment type for use +// with apply. +type DeploymentApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *DeploymentSpecApplyConfiguration `json:"spec,omitempty"` + Status *DeploymentStatusApplyConfiguration `json:"status,omitempty"` +} + +// Deployment constructs an declarative configuration of the Deployment type for use with +// apply. +func Deployment(name, namespace string) *DeploymentApplyConfiguration { + b := &DeploymentApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("Deployment") + b.WithAPIVersion("apps/v1beta2") + return b +} + +// ExtractDeployment extracts the applied configuration owned by fieldManager from +// deployment. If no managedFields are found in deployment for fieldManager, a +// DeploymentApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// deployment must be a unmodified Deployment API object that was retrieved from the Kubernetes API. +// ExtractDeployment provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractDeployment(deployment *appsv1beta2.Deployment, fieldManager string) (*DeploymentApplyConfiguration, error) { + b := &DeploymentApplyConfiguration{} + err := managedfields.ExtractInto(deployment, internal.Parser().Type("io.k8s.api.apps.v1beta2.Deployment"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(deployment.Name) + b.WithNamespace(deployment.Namespace) + + b.WithKind("Deployment") + b.WithAPIVersion("apps/v1beta2") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithKind(value string) *DeploymentApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithAPIVersion(value string) *DeploymentApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithName(value string) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithGenerateName(value string) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithNamespace(value string) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithSelfLink(value string) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithUID(value types.UID) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithResourceVersion(value string) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithGeneration(value int64) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithCreationTimestamp(value metav1.Time) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *DeploymentApplyConfiguration) WithLabels(entries map[string]string) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *DeploymentApplyConfiguration) WithAnnotations(entries map[string]string) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *DeploymentApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *DeploymentApplyConfiguration) WithFinalizers(values ...string) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithClusterName(value string) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *DeploymentApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithSpec(value *DeploymentSpecApplyConfiguration) *DeploymentApplyConfiguration { + b.Spec = value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithStatus(value *DeploymentStatusApplyConfiguration) *DeploymentApplyConfiguration { + b.Status = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/deploymentcondition.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/deploymentcondition.go new file mode 100644 index 000000000000..852a2c683224 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/deploymentcondition.go @@ -0,0 +1,90 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta2 + +import ( + v1beta2 "k8s.io/api/apps/v1beta2" + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// DeploymentConditionApplyConfiguration represents an declarative configuration of the DeploymentCondition type for use +// with apply. +type DeploymentConditionApplyConfiguration struct { + Type *v1beta2.DeploymentConditionType `json:"type,omitempty"` + Status *v1.ConditionStatus `json:"status,omitempty"` + LastUpdateTime *metav1.Time `json:"lastUpdateTime,omitempty"` + LastTransitionTime *metav1.Time `json:"lastTransitionTime,omitempty"` + Reason *string `json:"reason,omitempty"` + Message *string `json:"message,omitempty"` +} + +// DeploymentConditionApplyConfiguration constructs an declarative configuration of the DeploymentCondition type for use with +// apply. +func DeploymentCondition() *DeploymentConditionApplyConfiguration { + return &DeploymentConditionApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *DeploymentConditionApplyConfiguration) WithType(value v1beta2.DeploymentConditionType) *DeploymentConditionApplyConfiguration { + b.Type = &value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *DeploymentConditionApplyConfiguration) WithStatus(value v1.ConditionStatus) *DeploymentConditionApplyConfiguration { + b.Status = &value + return b +} + +// WithLastUpdateTime sets the LastUpdateTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastUpdateTime field is set to the value of the last call. +func (b *DeploymentConditionApplyConfiguration) WithLastUpdateTime(value metav1.Time) *DeploymentConditionApplyConfiguration { + b.LastUpdateTime = &value + return b +} + +// WithLastTransitionTime sets the LastTransitionTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastTransitionTime field is set to the value of the last call. +func (b *DeploymentConditionApplyConfiguration) WithLastTransitionTime(value metav1.Time) *DeploymentConditionApplyConfiguration { + b.LastTransitionTime = &value + return b +} + +// WithReason sets the Reason field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Reason field is set to the value of the last call. +func (b *DeploymentConditionApplyConfiguration) WithReason(value string) *DeploymentConditionApplyConfiguration { + b.Reason = &value + return b +} + +// WithMessage sets the Message field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Message field is set to the value of the last call. +func (b *DeploymentConditionApplyConfiguration) WithMessage(value string) *DeploymentConditionApplyConfiguration { + b.Message = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/deploymentspec.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/deploymentspec.go new file mode 100644 index 000000000000..6898941ace2d --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/deploymentspec.go @@ -0,0 +1,107 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta2 + +import ( + corev1 "k8s.io/client-go/applyconfigurations/core/v1" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// DeploymentSpecApplyConfiguration represents an declarative configuration of the DeploymentSpec type for use +// with apply. +type DeploymentSpecApplyConfiguration struct { + Replicas *int32 `json:"replicas,omitempty"` + Selector *v1.LabelSelectorApplyConfiguration `json:"selector,omitempty"` + Template *corev1.PodTemplateSpecApplyConfiguration `json:"template,omitempty"` + Strategy *DeploymentStrategyApplyConfiguration `json:"strategy,omitempty"` + MinReadySeconds *int32 `json:"minReadySeconds,omitempty"` + RevisionHistoryLimit *int32 `json:"revisionHistoryLimit,omitempty"` + Paused *bool `json:"paused,omitempty"` + ProgressDeadlineSeconds *int32 `json:"progressDeadlineSeconds,omitempty"` +} + +// DeploymentSpecApplyConfiguration constructs an declarative configuration of the DeploymentSpec type for use with +// apply. +func DeploymentSpec() *DeploymentSpecApplyConfiguration { + return &DeploymentSpecApplyConfiguration{} +} + +// WithReplicas sets the Replicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Replicas field is set to the value of the last call. +func (b *DeploymentSpecApplyConfiguration) WithReplicas(value int32) *DeploymentSpecApplyConfiguration { + b.Replicas = &value + return b +} + +// WithSelector sets the Selector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Selector field is set to the value of the last call. +func (b *DeploymentSpecApplyConfiguration) WithSelector(value *v1.LabelSelectorApplyConfiguration) *DeploymentSpecApplyConfiguration { + b.Selector = value + return b +} + +// WithTemplate sets the Template field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Template field is set to the value of the last call. +func (b *DeploymentSpecApplyConfiguration) WithTemplate(value *corev1.PodTemplateSpecApplyConfiguration) *DeploymentSpecApplyConfiguration { + b.Template = value + return b +} + +// WithStrategy sets the Strategy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Strategy field is set to the value of the last call. +func (b *DeploymentSpecApplyConfiguration) WithStrategy(value *DeploymentStrategyApplyConfiguration) *DeploymentSpecApplyConfiguration { + b.Strategy = value + return b +} + +// WithMinReadySeconds sets the MinReadySeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MinReadySeconds field is set to the value of the last call. +func (b *DeploymentSpecApplyConfiguration) WithMinReadySeconds(value int32) *DeploymentSpecApplyConfiguration { + b.MinReadySeconds = &value + return b +} + +// WithRevisionHistoryLimit sets the RevisionHistoryLimit field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RevisionHistoryLimit field is set to the value of the last call. +func (b *DeploymentSpecApplyConfiguration) WithRevisionHistoryLimit(value int32) *DeploymentSpecApplyConfiguration { + b.RevisionHistoryLimit = &value + return b +} + +// WithPaused sets the Paused field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Paused field is set to the value of the last call. +func (b *DeploymentSpecApplyConfiguration) WithPaused(value bool) *DeploymentSpecApplyConfiguration { + b.Paused = &value + return b +} + +// WithProgressDeadlineSeconds sets the ProgressDeadlineSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ProgressDeadlineSeconds field is set to the value of the last call. +func (b *DeploymentSpecApplyConfiguration) WithProgressDeadlineSeconds(value int32) *DeploymentSpecApplyConfiguration { + b.ProgressDeadlineSeconds = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/deploymentstatus.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/deploymentstatus.go new file mode 100644 index 000000000000..fe99ca991745 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/deploymentstatus.go @@ -0,0 +1,107 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta2 + +// DeploymentStatusApplyConfiguration represents an declarative configuration of the DeploymentStatus type for use +// with apply. +type DeploymentStatusApplyConfiguration struct { + ObservedGeneration *int64 `json:"observedGeneration,omitempty"` + Replicas *int32 `json:"replicas,omitempty"` + UpdatedReplicas *int32 `json:"updatedReplicas,omitempty"` + ReadyReplicas *int32 `json:"readyReplicas,omitempty"` + AvailableReplicas *int32 `json:"availableReplicas,omitempty"` + UnavailableReplicas *int32 `json:"unavailableReplicas,omitempty"` + Conditions []DeploymentConditionApplyConfiguration `json:"conditions,omitempty"` + CollisionCount *int32 `json:"collisionCount,omitempty"` +} + +// DeploymentStatusApplyConfiguration constructs an declarative configuration of the DeploymentStatus type for use with +// apply. +func DeploymentStatus() *DeploymentStatusApplyConfiguration { + return &DeploymentStatusApplyConfiguration{} +} + +// WithObservedGeneration sets the ObservedGeneration field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ObservedGeneration field is set to the value of the last call. +func (b *DeploymentStatusApplyConfiguration) WithObservedGeneration(value int64) *DeploymentStatusApplyConfiguration { + b.ObservedGeneration = &value + return b +} + +// WithReplicas sets the Replicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Replicas field is set to the value of the last call. +func (b *DeploymentStatusApplyConfiguration) WithReplicas(value int32) *DeploymentStatusApplyConfiguration { + b.Replicas = &value + return b +} + +// WithUpdatedReplicas sets the UpdatedReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UpdatedReplicas field is set to the value of the last call. +func (b *DeploymentStatusApplyConfiguration) WithUpdatedReplicas(value int32) *DeploymentStatusApplyConfiguration { + b.UpdatedReplicas = &value + return b +} + +// WithReadyReplicas sets the ReadyReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadyReplicas field is set to the value of the last call. +func (b *DeploymentStatusApplyConfiguration) WithReadyReplicas(value int32) *DeploymentStatusApplyConfiguration { + b.ReadyReplicas = &value + return b +} + +// WithAvailableReplicas sets the AvailableReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AvailableReplicas field is set to the value of the last call. +func (b *DeploymentStatusApplyConfiguration) WithAvailableReplicas(value int32) *DeploymentStatusApplyConfiguration { + b.AvailableReplicas = &value + return b +} + +// WithUnavailableReplicas sets the UnavailableReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UnavailableReplicas field is set to the value of the last call. +func (b *DeploymentStatusApplyConfiguration) WithUnavailableReplicas(value int32) *DeploymentStatusApplyConfiguration { + b.UnavailableReplicas = &value + return b +} + +// WithConditions adds the given value to the Conditions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Conditions field. +func (b *DeploymentStatusApplyConfiguration) WithConditions(values ...*DeploymentConditionApplyConfiguration) *DeploymentStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithConditions") + } + b.Conditions = append(b.Conditions, *values[i]) + } + return b +} + +// WithCollisionCount sets the CollisionCount field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CollisionCount field is set to the value of the last call. +func (b *DeploymentStatusApplyConfiguration) WithCollisionCount(value int32) *DeploymentStatusApplyConfiguration { + b.CollisionCount = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/deploymentstrategy.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/deploymentstrategy.go new file mode 100644 index 000000000000..8714e153e40b --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/deploymentstrategy.go @@ -0,0 +1,52 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta2 + +import ( + v1beta2 "k8s.io/api/apps/v1beta2" +) + +// DeploymentStrategyApplyConfiguration represents an declarative configuration of the DeploymentStrategy type for use +// with apply. +type DeploymentStrategyApplyConfiguration struct { + Type *v1beta2.DeploymentStrategyType `json:"type,omitempty"` + RollingUpdate *RollingUpdateDeploymentApplyConfiguration `json:"rollingUpdate,omitempty"` +} + +// DeploymentStrategyApplyConfiguration constructs an declarative configuration of the DeploymentStrategy type for use with +// apply. +func DeploymentStrategy() *DeploymentStrategyApplyConfiguration { + return &DeploymentStrategyApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *DeploymentStrategyApplyConfiguration) WithType(value v1beta2.DeploymentStrategyType) *DeploymentStrategyApplyConfiguration { + b.Type = &value + return b +} + +// WithRollingUpdate sets the RollingUpdate field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RollingUpdate field is set to the value of the last call. +func (b *DeploymentStrategyApplyConfiguration) WithRollingUpdate(value *RollingUpdateDeploymentApplyConfiguration) *DeploymentStrategyApplyConfiguration { + b.RollingUpdate = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/replicaset.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/replicaset.go new file mode 100644 index 000000000000..881c503ae8b4 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/replicaset.go @@ -0,0 +1,265 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta2 + +import ( + appsv1beta2 "k8s.io/api/apps/v1beta2" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// ReplicaSetApplyConfiguration represents an declarative configuration of the ReplicaSet type for use +// with apply. +type ReplicaSetApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *ReplicaSetSpecApplyConfiguration `json:"spec,omitempty"` + Status *ReplicaSetStatusApplyConfiguration `json:"status,omitempty"` +} + +// ReplicaSet constructs an declarative configuration of the ReplicaSet type for use with +// apply. +func ReplicaSet(name, namespace string) *ReplicaSetApplyConfiguration { + b := &ReplicaSetApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("ReplicaSet") + b.WithAPIVersion("apps/v1beta2") + return b +} + +// ExtractReplicaSet extracts the applied configuration owned by fieldManager from +// replicaSet. If no managedFields are found in replicaSet for fieldManager, a +// ReplicaSetApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// replicaSet must be a unmodified ReplicaSet API object that was retrieved from the Kubernetes API. +// ExtractReplicaSet provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractReplicaSet(replicaSet *appsv1beta2.ReplicaSet, fieldManager string) (*ReplicaSetApplyConfiguration, error) { + b := &ReplicaSetApplyConfiguration{} + err := managedfields.ExtractInto(replicaSet, internal.Parser().Type("io.k8s.api.apps.v1beta2.ReplicaSet"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(replicaSet.Name) + b.WithNamespace(replicaSet.Namespace) + + b.WithKind("ReplicaSet") + b.WithAPIVersion("apps/v1beta2") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *ReplicaSetApplyConfiguration) WithKind(value string) *ReplicaSetApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *ReplicaSetApplyConfiguration) WithAPIVersion(value string) *ReplicaSetApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ReplicaSetApplyConfiguration) WithName(value string) *ReplicaSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *ReplicaSetApplyConfiguration) WithGenerateName(value string) *ReplicaSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *ReplicaSetApplyConfiguration) WithNamespace(value string) *ReplicaSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *ReplicaSetApplyConfiguration) WithSelfLink(value string) *ReplicaSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *ReplicaSetApplyConfiguration) WithUID(value types.UID) *ReplicaSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *ReplicaSetApplyConfiguration) WithResourceVersion(value string) *ReplicaSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *ReplicaSetApplyConfiguration) WithGeneration(value int64) *ReplicaSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *ReplicaSetApplyConfiguration) WithCreationTimestamp(value metav1.Time) *ReplicaSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *ReplicaSetApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *ReplicaSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *ReplicaSetApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *ReplicaSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *ReplicaSetApplyConfiguration) WithLabels(entries map[string]string) *ReplicaSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *ReplicaSetApplyConfiguration) WithAnnotations(entries map[string]string) *ReplicaSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *ReplicaSetApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *ReplicaSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *ReplicaSetApplyConfiguration) WithFinalizers(values ...string) *ReplicaSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *ReplicaSetApplyConfiguration) WithClusterName(value string) *ReplicaSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *ReplicaSetApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *ReplicaSetApplyConfiguration) WithSpec(value *ReplicaSetSpecApplyConfiguration) *ReplicaSetApplyConfiguration { + b.Spec = value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *ReplicaSetApplyConfiguration) WithStatus(value *ReplicaSetStatusApplyConfiguration) *ReplicaSetApplyConfiguration { + b.Status = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/replicasetcondition.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/replicasetcondition.go new file mode 100644 index 000000000000..47776bfa2e6d --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/replicasetcondition.go @@ -0,0 +1,81 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta2 + +import ( + v1beta2 "k8s.io/api/apps/v1beta2" + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// ReplicaSetConditionApplyConfiguration represents an declarative configuration of the ReplicaSetCondition type for use +// with apply. +type ReplicaSetConditionApplyConfiguration struct { + Type *v1beta2.ReplicaSetConditionType `json:"type,omitempty"` + Status *v1.ConditionStatus `json:"status,omitempty"` + LastTransitionTime *metav1.Time `json:"lastTransitionTime,omitempty"` + Reason *string `json:"reason,omitempty"` + Message *string `json:"message,omitempty"` +} + +// ReplicaSetConditionApplyConfiguration constructs an declarative configuration of the ReplicaSetCondition type for use with +// apply. +func ReplicaSetCondition() *ReplicaSetConditionApplyConfiguration { + return &ReplicaSetConditionApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *ReplicaSetConditionApplyConfiguration) WithType(value v1beta2.ReplicaSetConditionType) *ReplicaSetConditionApplyConfiguration { + b.Type = &value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *ReplicaSetConditionApplyConfiguration) WithStatus(value v1.ConditionStatus) *ReplicaSetConditionApplyConfiguration { + b.Status = &value + return b +} + +// WithLastTransitionTime sets the LastTransitionTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastTransitionTime field is set to the value of the last call. +func (b *ReplicaSetConditionApplyConfiguration) WithLastTransitionTime(value metav1.Time) *ReplicaSetConditionApplyConfiguration { + b.LastTransitionTime = &value + return b +} + +// WithReason sets the Reason field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Reason field is set to the value of the last call. +func (b *ReplicaSetConditionApplyConfiguration) WithReason(value string) *ReplicaSetConditionApplyConfiguration { + b.Reason = &value + return b +} + +// WithMessage sets the Message field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Message field is set to the value of the last call. +func (b *ReplicaSetConditionApplyConfiguration) WithMessage(value string) *ReplicaSetConditionApplyConfiguration { + b.Message = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/replicasetspec.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/replicasetspec.go new file mode 100644 index 000000000000..14d548169e54 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/replicasetspec.go @@ -0,0 +1,71 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta2 + +import ( + corev1 "k8s.io/client-go/applyconfigurations/core/v1" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// ReplicaSetSpecApplyConfiguration represents an declarative configuration of the ReplicaSetSpec type for use +// with apply. +type ReplicaSetSpecApplyConfiguration struct { + Replicas *int32 `json:"replicas,omitempty"` + MinReadySeconds *int32 `json:"minReadySeconds,omitempty"` + Selector *v1.LabelSelectorApplyConfiguration `json:"selector,omitempty"` + Template *corev1.PodTemplateSpecApplyConfiguration `json:"template,omitempty"` +} + +// ReplicaSetSpecApplyConfiguration constructs an declarative configuration of the ReplicaSetSpec type for use with +// apply. +func ReplicaSetSpec() *ReplicaSetSpecApplyConfiguration { + return &ReplicaSetSpecApplyConfiguration{} +} + +// WithReplicas sets the Replicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Replicas field is set to the value of the last call. +func (b *ReplicaSetSpecApplyConfiguration) WithReplicas(value int32) *ReplicaSetSpecApplyConfiguration { + b.Replicas = &value + return b +} + +// WithMinReadySeconds sets the MinReadySeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MinReadySeconds field is set to the value of the last call. +func (b *ReplicaSetSpecApplyConfiguration) WithMinReadySeconds(value int32) *ReplicaSetSpecApplyConfiguration { + b.MinReadySeconds = &value + return b +} + +// WithSelector sets the Selector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Selector field is set to the value of the last call. +func (b *ReplicaSetSpecApplyConfiguration) WithSelector(value *v1.LabelSelectorApplyConfiguration) *ReplicaSetSpecApplyConfiguration { + b.Selector = value + return b +} + +// WithTemplate sets the Template field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Template field is set to the value of the last call. +func (b *ReplicaSetSpecApplyConfiguration) WithTemplate(value *corev1.PodTemplateSpecApplyConfiguration) *ReplicaSetSpecApplyConfiguration { + b.Template = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/replicasetstatus.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/replicasetstatus.go new file mode 100644 index 000000000000..7c1b8fb29dd3 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/replicasetstatus.go @@ -0,0 +1,89 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta2 + +// ReplicaSetStatusApplyConfiguration represents an declarative configuration of the ReplicaSetStatus type for use +// with apply. +type ReplicaSetStatusApplyConfiguration struct { + Replicas *int32 `json:"replicas,omitempty"` + FullyLabeledReplicas *int32 `json:"fullyLabeledReplicas,omitempty"` + ReadyReplicas *int32 `json:"readyReplicas,omitempty"` + AvailableReplicas *int32 `json:"availableReplicas,omitempty"` + ObservedGeneration *int64 `json:"observedGeneration,omitempty"` + Conditions []ReplicaSetConditionApplyConfiguration `json:"conditions,omitempty"` +} + +// ReplicaSetStatusApplyConfiguration constructs an declarative configuration of the ReplicaSetStatus type for use with +// apply. +func ReplicaSetStatus() *ReplicaSetStatusApplyConfiguration { + return &ReplicaSetStatusApplyConfiguration{} +} + +// WithReplicas sets the Replicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Replicas field is set to the value of the last call. +func (b *ReplicaSetStatusApplyConfiguration) WithReplicas(value int32) *ReplicaSetStatusApplyConfiguration { + b.Replicas = &value + return b +} + +// WithFullyLabeledReplicas sets the FullyLabeledReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FullyLabeledReplicas field is set to the value of the last call. +func (b *ReplicaSetStatusApplyConfiguration) WithFullyLabeledReplicas(value int32) *ReplicaSetStatusApplyConfiguration { + b.FullyLabeledReplicas = &value + return b +} + +// WithReadyReplicas sets the ReadyReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadyReplicas field is set to the value of the last call. +func (b *ReplicaSetStatusApplyConfiguration) WithReadyReplicas(value int32) *ReplicaSetStatusApplyConfiguration { + b.ReadyReplicas = &value + return b +} + +// WithAvailableReplicas sets the AvailableReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AvailableReplicas field is set to the value of the last call. +func (b *ReplicaSetStatusApplyConfiguration) WithAvailableReplicas(value int32) *ReplicaSetStatusApplyConfiguration { + b.AvailableReplicas = &value + return b +} + +// WithObservedGeneration sets the ObservedGeneration field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ObservedGeneration field is set to the value of the last call. +func (b *ReplicaSetStatusApplyConfiguration) WithObservedGeneration(value int64) *ReplicaSetStatusApplyConfiguration { + b.ObservedGeneration = &value + return b +} + +// WithConditions adds the given value to the Conditions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Conditions field. +func (b *ReplicaSetStatusApplyConfiguration) WithConditions(values ...*ReplicaSetConditionApplyConfiguration) *ReplicaSetStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithConditions") + } + b.Conditions = append(b.Conditions, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/rollingupdatedaemonset.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/rollingupdatedaemonset.go new file mode 100644 index 000000000000..b586b678d487 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/rollingupdatedaemonset.go @@ -0,0 +1,52 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta2 + +import ( + intstr "k8s.io/apimachinery/pkg/util/intstr" +) + +// RollingUpdateDaemonSetApplyConfiguration represents an declarative configuration of the RollingUpdateDaemonSet type for use +// with apply. +type RollingUpdateDaemonSetApplyConfiguration struct { + MaxUnavailable *intstr.IntOrString `json:"maxUnavailable,omitempty"` + MaxSurge *intstr.IntOrString `json:"maxSurge,omitempty"` +} + +// RollingUpdateDaemonSetApplyConfiguration constructs an declarative configuration of the RollingUpdateDaemonSet type for use with +// apply. +func RollingUpdateDaemonSet() *RollingUpdateDaemonSetApplyConfiguration { + return &RollingUpdateDaemonSetApplyConfiguration{} +} + +// WithMaxUnavailable sets the MaxUnavailable field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MaxUnavailable field is set to the value of the last call. +func (b *RollingUpdateDaemonSetApplyConfiguration) WithMaxUnavailable(value intstr.IntOrString) *RollingUpdateDaemonSetApplyConfiguration { + b.MaxUnavailable = &value + return b +} + +// WithMaxSurge sets the MaxSurge field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MaxSurge field is set to the value of the last call. +func (b *RollingUpdateDaemonSetApplyConfiguration) WithMaxSurge(value intstr.IntOrString) *RollingUpdateDaemonSetApplyConfiguration { + b.MaxSurge = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/rollingupdatedeployment.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/rollingupdatedeployment.go new file mode 100644 index 000000000000..78ef2100816e --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/rollingupdatedeployment.go @@ -0,0 +1,52 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta2 + +import ( + intstr "k8s.io/apimachinery/pkg/util/intstr" +) + +// RollingUpdateDeploymentApplyConfiguration represents an declarative configuration of the RollingUpdateDeployment type for use +// with apply. +type RollingUpdateDeploymentApplyConfiguration struct { + MaxUnavailable *intstr.IntOrString `json:"maxUnavailable,omitempty"` + MaxSurge *intstr.IntOrString `json:"maxSurge,omitempty"` +} + +// RollingUpdateDeploymentApplyConfiguration constructs an declarative configuration of the RollingUpdateDeployment type for use with +// apply. +func RollingUpdateDeployment() *RollingUpdateDeploymentApplyConfiguration { + return &RollingUpdateDeploymentApplyConfiguration{} +} + +// WithMaxUnavailable sets the MaxUnavailable field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MaxUnavailable field is set to the value of the last call. +func (b *RollingUpdateDeploymentApplyConfiguration) WithMaxUnavailable(value intstr.IntOrString) *RollingUpdateDeploymentApplyConfiguration { + b.MaxUnavailable = &value + return b +} + +// WithMaxSurge sets the MaxSurge field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MaxSurge field is set to the value of the last call. +func (b *RollingUpdateDeploymentApplyConfiguration) WithMaxSurge(value intstr.IntOrString) *RollingUpdateDeploymentApplyConfiguration { + b.MaxSurge = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/rollingupdatestatefulsetstrategy.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/rollingupdatestatefulsetstrategy.go new file mode 100644 index 000000000000..f828ef70d493 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/rollingupdatestatefulsetstrategy.go @@ -0,0 +1,39 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta2 + +// RollingUpdateStatefulSetStrategyApplyConfiguration represents an declarative configuration of the RollingUpdateStatefulSetStrategy type for use +// with apply. +type RollingUpdateStatefulSetStrategyApplyConfiguration struct { + Partition *int32 `json:"partition,omitempty"` +} + +// RollingUpdateStatefulSetStrategyApplyConfiguration constructs an declarative configuration of the RollingUpdateStatefulSetStrategy type for use with +// apply. +func RollingUpdateStatefulSetStrategy() *RollingUpdateStatefulSetStrategyApplyConfiguration { + return &RollingUpdateStatefulSetStrategyApplyConfiguration{} +} + +// WithPartition sets the Partition field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Partition field is set to the value of the last call. +func (b *RollingUpdateStatefulSetStrategyApplyConfiguration) WithPartition(value int32) *RollingUpdateStatefulSetStrategyApplyConfiguration { + b.Partition = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/statefulset.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/statefulset.go new file mode 100644 index 000000000000..26a18794720f --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/statefulset.go @@ -0,0 +1,265 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta2 + +import ( + appsv1beta2 "k8s.io/api/apps/v1beta2" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// StatefulSetApplyConfiguration represents an declarative configuration of the StatefulSet type for use +// with apply. +type StatefulSetApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *StatefulSetSpecApplyConfiguration `json:"spec,omitempty"` + Status *StatefulSetStatusApplyConfiguration `json:"status,omitempty"` +} + +// StatefulSet constructs an declarative configuration of the StatefulSet type for use with +// apply. +func StatefulSet(name, namespace string) *StatefulSetApplyConfiguration { + b := &StatefulSetApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("StatefulSet") + b.WithAPIVersion("apps/v1beta2") + return b +} + +// ExtractStatefulSet extracts the applied configuration owned by fieldManager from +// statefulSet. If no managedFields are found in statefulSet for fieldManager, a +// StatefulSetApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// statefulSet must be a unmodified StatefulSet API object that was retrieved from the Kubernetes API. +// ExtractStatefulSet provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractStatefulSet(statefulSet *appsv1beta2.StatefulSet, fieldManager string) (*StatefulSetApplyConfiguration, error) { + b := &StatefulSetApplyConfiguration{} + err := managedfields.ExtractInto(statefulSet, internal.Parser().Type("io.k8s.api.apps.v1beta2.StatefulSet"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(statefulSet.Name) + b.WithNamespace(statefulSet.Namespace) + + b.WithKind("StatefulSet") + b.WithAPIVersion("apps/v1beta2") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *StatefulSetApplyConfiguration) WithKind(value string) *StatefulSetApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *StatefulSetApplyConfiguration) WithAPIVersion(value string) *StatefulSetApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *StatefulSetApplyConfiguration) WithName(value string) *StatefulSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *StatefulSetApplyConfiguration) WithGenerateName(value string) *StatefulSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *StatefulSetApplyConfiguration) WithNamespace(value string) *StatefulSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *StatefulSetApplyConfiguration) WithSelfLink(value string) *StatefulSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *StatefulSetApplyConfiguration) WithUID(value types.UID) *StatefulSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *StatefulSetApplyConfiguration) WithResourceVersion(value string) *StatefulSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *StatefulSetApplyConfiguration) WithGeneration(value int64) *StatefulSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *StatefulSetApplyConfiguration) WithCreationTimestamp(value metav1.Time) *StatefulSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *StatefulSetApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *StatefulSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *StatefulSetApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *StatefulSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *StatefulSetApplyConfiguration) WithLabels(entries map[string]string) *StatefulSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *StatefulSetApplyConfiguration) WithAnnotations(entries map[string]string) *StatefulSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *StatefulSetApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *StatefulSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *StatefulSetApplyConfiguration) WithFinalizers(values ...string) *StatefulSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *StatefulSetApplyConfiguration) WithClusterName(value string) *StatefulSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *StatefulSetApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *StatefulSetApplyConfiguration) WithSpec(value *StatefulSetSpecApplyConfiguration) *StatefulSetApplyConfiguration { + b.Spec = value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *StatefulSetApplyConfiguration) WithStatus(value *StatefulSetStatusApplyConfiguration) *StatefulSetApplyConfiguration { + b.Status = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/statefulsetcondition.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/statefulsetcondition.go new file mode 100644 index 000000000000..c33e68b5e28d --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/statefulsetcondition.go @@ -0,0 +1,81 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta2 + +import ( + v1beta2 "k8s.io/api/apps/v1beta2" + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// StatefulSetConditionApplyConfiguration represents an declarative configuration of the StatefulSetCondition type for use +// with apply. +type StatefulSetConditionApplyConfiguration struct { + Type *v1beta2.StatefulSetConditionType `json:"type,omitempty"` + Status *v1.ConditionStatus `json:"status,omitempty"` + LastTransitionTime *metav1.Time `json:"lastTransitionTime,omitempty"` + Reason *string `json:"reason,omitempty"` + Message *string `json:"message,omitempty"` +} + +// StatefulSetConditionApplyConfiguration constructs an declarative configuration of the StatefulSetCondition type for use with +// apply. +func StatefulSetCondition() *StatefulSetConditionApplyConfiguration { + return &StatefulSetConditionApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *StatefulSetConditionApplyConfiguration) WithType(value v1beta2.StatefulSetConditionType) *StatefulSetConditionApplyConfiguration { + b.Type = &value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *StatefulSetConditionApplyConfiguration) WithStatus(value v1.ConditionStatus) *StatefulSetConditionApplyConfiguration { + b.Status = &value + return b +} + +// WithLastTransitionTime sets the LastTransitionTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastTransitionTime field is set to the value of the last call. +func (b *StatefulSetConditionApplyConfiguration) WithLastTransitionTime(value metav1.Time) *StatefulSetConditionApplyConfiguration { + b.LastTransitionTime = &value + return b +} + +// WithReason sets the Reason field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Reason field is set to the value of the last call. +func (b *StatefulSetConditionApplyConfiguration) WithReason(value string) *StatefulSetConditionApplyConfiguration { + b.Reason = &value + return b +} + +// WithMessage sets the Message field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Message field is set to the value of the last call. +func (b *StatefulSetConditionApplyConfiguration) WithMessage(value string) *StatefulSetConditionApplyConfiguration { + b.Message = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/statefulsetspec.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/statefulsetspec.go new file mode 100644 index 000000000000..eb2c8555b94e --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/statefulsetspec.go @@ -0,0 +1,113 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta2 + +import ( + v1beta2 "k8s.io/api/apps/v1beta2" + corev1 "k8s.io/client-go/applyconfigurations/core/v1" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// StatefulSetSpecApplyConfiguration represents an declarative configuration of the StatefulSetSpec type for use +// with apply. +type StatefulSetSpecApplyConfiguration struct { + Replicas *int32 `json:"replicas,omitempty"` + Selector *v1.LabelSelectorApplyConfiguration `json:"selector,omitempty"` + Template *corev1.PodTemplateSpecApplyConfiguration `json:"template,omitempty"` + VolumeClaimTemplates []corev1.PersistentVolumeClaimApplyConfiguration `json:"volumeClaimTemplates,omitempty"` + ServiceName *string `json:"serviceName,omitempty"` + PodManagementPolicy *v1beta2.PodManagementPolicyType `json:"podManagementPolicy,omitempty"` + UpdateStrategy *StatefulSetUpdateStrategyApplyConfiguration `json:"updateStrategy,omitempty"` + RevisionHistoryLimit *int32 `json:"revisionHistoryLimit,omitempty"` +} + +// StatefulSetSpecApplyConfiguration constructs an declarative configuration of the StatefulSetSpec type for use with +// apply. +func StatefulSetSpec() *StatefulSetSpecApplyConfiguration { + return &StatefulSetSpecApplyConfiguration{} +} + +// WithReplicas sets the Replicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Replicas field is set to the value of the last call. +func (b *StatefulSetSpecApplyConfiguration) WithReplicas(value int32) *StatefulSetSpecApplyConfiguration { + b.Replicas = &value + return b +} + +// WithSelector sets the Selector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Selector field is set to the value of the last call. +func (b *StatefulSetSpecApplyConfiguration) WithSelector(value *v1.LabelSelectorApplyConfiguration) *StatefulSetSpecApplyConfiguration { + b.Selector = value + return b +} + +// WithTemplate sets the Template field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Template field is set to the value of the last call. +func (b *StatefulSetSpecApplyConfiguration) WithTemplate(value *corev1.PodTemplateSpecApplyConfiguration) *StatefulSetSpecApplyConfiguration { + b.Template = value + return b +} + +// WithVolumeClaimTemplates adds the given value to the VolumeClaimTemplates field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the VolumeClaimTemplates field. +func (b *StatefulSetSpecApplyConfiguration) WithVolumeClaimTemplates(values ...*corev1.PersistentVolumeClaimApplyConfiguration) *StatefulSetSpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithVolumeClaimTemplates") + } + b.VolumeClaimTemplates = append(b.VolumeClaimTemplates, *values[i]) + } + return b +} + +// WithServiceName sets the ServiceName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ServiceName field is set to the value of the last call. +func (b *StatefulSetSpecApplyConfiguration) WithServiceName(value string) *StatefulSetSpecApplyConfiguration { + b.ServiceName = &value + return b +} + +// WithPodManagementPolicy sets the PodManagementPolicy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PodManagementPolicy field is set to the value of the last call. +func (b *StatefulSetSpecApplyConfiguration) WithPodManagementPolicy(value v1beta2.PodManagementPolicyType) *StatefulSetSpecApplyConfiguration { + b.PodManagementPolicy = &value + return b +} + +// WithUpdateStrategy sets the UpdateStrategy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UpdateStrategy field is set to the value of the last call. +func (b *StatefulSetSpecApplyConfiguration) WithUpdateStrategy(value *StatefulSetUpdateStrategyApplyConfiguration) *StatefulSetSpecApplyConfiguration { + b.UpdateStrategy = value + return b +} + +// WithRevisionHistoryLimit sets the RevisionHistoryLimit field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RevisionHistoryLimit field is set to the value of the last call. +func (b *StatefulSetSpecApplyConfiguration) WithRevisionHistoryLimit(value int32) *StatefulSetSpecApplyConfiguration { + b.RevisionHistoryLimit = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/statefulsetstatus.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/statefulsetstatus.go new file mode 100644 index 000000000000..73f7c0b3f5c7 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/statefulsetstatus.go @@ -0,0 +1,116 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta2 + +// StatefulSetStatusApplyConfiguration represents an declarative configuration of the StatefulSetStatus type for use +// with apply. +type StatefulSetStatusApplyConfiguration struct { + ObservedGeneration *int64 `json:"observedGeneration,omitempty"` + Replicas *int32 `json:"replicas,omitempty"` + ReadyReplicas *int32 `json:"readyReplicas,omitempty"` + CurrentReplicas *int32 `json:"currentReplicas,omitempty"` + UpdatedReplicas *int32 `json:"updatedReplicas,omitempty"` + CurrentRevision *string `json:"currentRevision,omitempty"` + UpdateRevision *string `json:"updateRevision,omitempty"` + CollisionCount *int32 `json:"collisionCount,omitempty"` + Conditions []StatefulSetConditionApplyConfiguration `json:"conditions,omitempty"` +} + +// StatefulSetStatusApplyConfiguration constructs an declarative configuration of the StatefulSetStatus type for use with +// apply. +func StatefulSetStatus() *StatefulSetStatusApplyConfiguration { + return &StatefulSetStatusApplyConfiguration{} +} + +// WithObservedGeneration sets the ObservedGeneration field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ObservedGeneration field is set to the value of the last call. +func (b *StatefulSetStatusApplyConfiguration) WithObservedGeneration(value int64) *StatefulSetStatusApplyConfiguration { + b.ObservedGeneration = &value + return b +} + +// WithReplicas sets the Replicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Replicas field is set to the value of the last call. +func (b *StatefulSetStatusApplyConfiguration) WithReplicas(value int32) *StatefulSetStatusApplyConfiguration { + b.Replicas = &value + return b +} + +// WithReadyReplicas sets the ReadyReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadyReplicas field is set to the value of the last call. +func (b *StatefulSetStatusApplyConfiguration) WithReadyReplicas(value int32) *StatefulSetStatusApplyConfiguration { + b.ReadyReplicas = &value + return b +} + +// WithCurrentReplicas sets the CurrentReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CurrentReplicas field is set to the value of the last call. +func (b *StatefulSetStatusApplyConfiguration) WithCurrentReplicas(value int32) *StatefulSetStatusApplyConfiguration { + b.CurrentReplicas = &value + return b +} + +// WithUpdatedReplicas sets the UpdatedReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UpdatedReplicas field is set to the value of the last call. +func (b *StatefulSetStatusApplyConfiguration) WithUpdatedReplicas(value int32) *StatefulSetStatusApplyConfiguration { + b.UpdatedReplicas = &value + return b +} + +// WithCurrentRevision sets the CurrentRevision field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CurrentRevision field is set to the value of the last call. +func (b *StatefulSetStatusApplyConfiguration) WithCurrentRevision(value string) *StatefulSetStatusApplyConfiguration { + b.CurrentRevision = &value + return b +} + +// WithUpdateRevision sets the UpdateRevision field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UpdateRevision field is set to the value of the last call. +func (b *StatefulSetStatusApplyConfiguration) WithUpdateRevision(value string) *StatefulSetStatusApplyConfiguration { + b.UpdateRevision = &value + return b +} + +// WithCollisionCount sets the CollisionCount field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CollisionCount field is set to the value of the last call. +func (b *StatefulSetStatusApplyConfiguration) WithCollisionCount(value int32) *StatefulSetStatusApplyConfiguration { + b.CollisionCount = &value + return b +} + +// WithConditions adds the given value to the Conditions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Conditions field. +func (b *StatefulSetStatusApplyConfiguration) WithConditions(values ...*StatefulSetConditionApplyConfiguration) *StatefulSetStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithConditions") + } + b.Conditions = append(b.Conditions, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/statefulsetupdatestrategy.go b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/statefulsetupdatestrategy.go new file mode 100644 index 000000000000..03c291491700 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/statefulsetupdatestrategy.go @@ -0,0 +1,52 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta2 + +import ( + v1beta2 "k8s.io/api/apps/v1beta2" +) + +// StatefulSetUpdateStrategyApplyConfiguration represents an declarative configuration of the StatefulSetUpdateStrategy type for use +// with apply. +type StatefulSetUpdateStrategyApplyConfiguration struct { + Type *v1beta2.StatefulSetUpdateStrategyType `json:"type,omitempty"` + RollingUpdate *RollingUpdateStatefulSetStrategyApplyConfiguration `json:"rollingUpdate,omitempty"` +} + +// StatefulSetUpdateStrategyApplyConfiguration constructs an declarative configuration of the StatefulSetUpdateStrategy type for use with +// apply. +func StatefulSetUpdateStrategy() *StatefulSetUpdateStrategyApplyConfiguration { + return &StatefulSetUpdateStrategyApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *StatefulSetUpdateStrategyApplyConfiguration) WithType(value v1beta2.StatefulSetUpdateStrategyType) *StatefulSetUpdateStrategyApplyConfiguration { + b.Type = &value + return b +} + +// WithRollingUpdate sets the RollingUpdate field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RollingUpdate field is set to the value of the last call. +func (b *StatefulSetUpdateStrategyApplyConfiguration) WithRollingUpdate(value *RollingUpdateStatefulSetStrategyApplyConfiguration) *StatefulSetUpdateStrategyApplyConfiguration { + b.RollingUpdate = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v1/crossversionobjectreference.go b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v1/crossversionobjectreference.go new file mode 100644 index 000000000000..0eac22692cd7 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v1/crossversionobjectreference.go @@ -0,0 +1,57 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// CrossVersionObjectReferenceApplyConfiguration represents an declarative configuration of the CrossVersionObjectReference type for use +// with apply. +type CrossVersionObjectReferenceApplyConfiguration struct { + Kind *string `json:"kind,omitempty"` + Name *string `json:"name,omitempty"` + APIVersion *string `json:"apiVersion,omitempty"` +} + +// CrossVersionObjectReferenceApplyConfiguration constructs an declarative configuration of the CrossVersionObjectReference type for use with +// apply. +func CrossVersionObjectReference() *CrossVersionObjectReferenceApplyConfiguration { + return &CrossVersionObjectReferenceApplyConfiguration{} +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *CrossVersionObjectReferenceApplyConfiguration) WithKind(value string) *CrossVersionObjectReferenceApplyConfiguration { + b.Kind = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *CrossVersionObjectReferenceApplyConfiguration) WithName(value string) *CrossVersionObjectReferenceApplyConfiguration { + b.Name = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *CrossVersionObjectReferenceApplyConfiguration) WithAPIVersion(value string) *CrossVersionObjectReferenceApplyConfiguration { + b.APIVersion = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v1/horizontalpodautoscaler.go b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v1/horizontalpodautoscaler.go new file mode 100644 index 000000000000..6736bfb17cc7 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v1/horizontalpodautoscaler.go @@ -0,0 +1,265 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + apiautoscalingv1 "k8s.io/api/autoscaling/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// HorizontalPodAutoscalerApplyConfiguration represents an declarative configuration of the HorizontalPodAutoscaler type for use +// with apply. +type HorizontalPodAutoscalerApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *HorizontalPodAutoscalerSpecApplyConfiguration `json:"spec,omitempty"` + Status *HorizontalPodAutoscalerStatusApplyConfiguration `json:"status,omitempty"` +} + +// HorizontalPodAutoscaler constructs an declarative configuration of the HorizontalPodAutoscaler type for use with +// apply. +func HorizontalPodAutoscaler(name, namespace string) *HorizontalPodAutoscalerApplyConfiguration { + b := &HorizontalPodAutoscalerApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("HorizontalPodAutoscaler") + b.WithAPIVersion("autoscaling/v1") + return b +} + +// ExtractHorizontalPodAutoscaler extracts the applied configuration owned by fieldManager from +// horizontalPodAutoscaler. If no managedFields are found in horizontalPodAutoscaler for fieldManager, a +// HorizontalPodAutoscalerApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// horizontalPodAutoscaler must be a unmodified HorizontalPodAutoscaler API object that was retrieved from the Kubernetes API. +// ExtractHorizontalPodAutoscaler provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractHorizontalPodAutoscaler(horizontalPodAutoscaler *apiautoscalingv1.HorizontalPodAutoscaler, fieldManager string) (*HorizontalPodAutoscalerApplyConfiguration, error) { + b := &HorizontalPodAutoscalerApplyConfiguration{} + err := managedfields.ExtractInto(horizontalPodAutoscaler, internal.Parser().Type("io.k8s.api.autoscaling.v1.HorizontalPodAutoscaler"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(horizontalPodAutoscaler.Name) + b.WithNamespace(horizontalPodAutoscaler.Namespace) + + b.WithKind("HorizontalPodAutoscaler") + b.WithAPIVersion("autoscaling/v1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithKind(value string) *HorizontalPodAutoscalerApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithAPIVersion(value string) *HorizontalPodAutoscalerApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithName(value string) *HorizontalPodAutoscalerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithGenerateName(value string) *HorizontalPodAutoscalerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithNamespace(value string) *HorizontalPodAutoscalerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithSelfLink(value string) *HorizontalPodAutoscalerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithUID(value types.UID) *HorizontalPodAutoscalerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithResourceVersion(value string) *HorizontalPodAutoscalerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithGeneration(value int64) *HorizontalPodAutoscalerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithCreationTimestamp(value metav1.Time) *HorizontalPodAutoscalerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *HorizontalPodAutoscalerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *HorizontalPodAutoscalerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithLabels(entries map[string]string) *HorizontalPodAutoscalerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithAnnotations(entries map[string]string) *HorizontalPodAutoscalerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *HorizontalPodAutoscalerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithFinalizers(values ...string) *HorizontalPodAutoscalerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithClusterName(value string) *HorizontalPodAutoscalerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *HorizontalPodAutoscalerApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithSpec(value *HorizontalPodAutoscalerSpecApplyConfiguration) *HorizontalPodAutoscalerApplyConfiguration { + b.Spec = value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithStatus(value *HorizontalPodAutoscalerStatusApplyConfiguration) *HorizontalPodAutoscalerApplyConfiguration { + b.Status = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v1/horizontalpodautoscalerspec.go b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v1/horizontalpodautoscalerspec.go new file mode 100644 index 000000000000..561ac60d35d8 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v1/horizontalpodautoscalerspec.go @@ -0,0 +1,66 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// HorizontalPodAutoscalerSpecApplyConfiguration represents an declarative configuration of the HorizontalPodAutoscalerSpec type for use +// with apply. +type HorizontalPodAutoscalerSpecApplyConfiguration struct { + ScaleTargetRef *CrossVersionObjectReferenceApplyConfiguration `json:"scaleTargetRef,omitempty"` + MinReplicas *int32 `json:"minReplicas,omitempty"` + MaxReplicas *int32 `json:"maxReplicas,omitempty"` + TargetCPUUtilizationPercentage *int32 `json:"targetCPUUtilizationPercentage,omitempty"` +} + +// HorizontalPodAutoscalerSpecApplyConfiguration constructs an declarative configuration of the HorizontalPodAutoscalerSpec type for use with +// apply. +func HorizontalPodAutoscalerSpec() *HorizontalPodAutoscalerSpecApplyConfiguration { + return &HorizontalPodAutoscalerSpecApplyConfiguration{} +} + +// WithScaleTargetRef sets the ScaleTargetRef field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ScaleTargetRef field is set to the value of the last call. +func (b *HorizontalPodAutoscalerSpecApplyConfiguration) WithScaleTargetRef(value *CrossVersionObjectReferenceApplyConfiguration) *HorizontalPodAutoscalerSpecApplyConfiguration { + b.ScaleTargetRef = value + return b +} + +// WithMinReplicas sets the MinReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MinReplicas field is set to the value of the last call. +func (b *HorizontalPodAutoscalerSpecApplyConfiguration) WithMinReplicas(value int32) *HorizontalPodAutoscalerSpecApplyConfiguration { + b.MinReplicas = &value + return b +} + +// WithMaxReplicas sets the MaxReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MaxReplicas field is set to the value of the last call. +func (b *HorizontalPodAutoscalerSpecApplyConfiguration) WithMaxReplicas(value int32) *HorizontalPodAutoscalerSpecApplyConfiguration { + b.MaxReplicas = &value + return b +} + +// WithTargetCPUUtilizationPercentage sets the TargetCPUUtilizationPercentage field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the TargetCPUUtilizationPercentage field is set to the value of the last call. +func (b *HorizontalPodAutoscalerSpecApplyConfiguration) WithTargetCPUUtilizationPercentage(value int32) *HorizontalPodAutoscalerSpecApplyConfiguration { + b.TargetCPUUtilizationPercentage = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v1/horizontalpodautoscalerstatus.go b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v1/horizontalpodautoscalerstatus.go new file mode 100644 index 000000000000..abc2e05aa727 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v1/horizontalpodautoscalerstatus.go @@ -0,0 +1,79 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// HorizontalPodAutoscalerStatusApplyConfiguration represents an declarative configuration of the HorizontalPodAutoscalerStatus type for use +// with apply. +type HorizontalPodAutoscalerStatusApplyConfiguration struct { + ObservedGeneration *int64 `json:"observedGeneration,omitempty"` + LastScaleTime *v1.Time `json:"lastScaleTime,omitempty"` + CurrentReplicas *int32 `json:"currentReplicas,omitempty"` + DesiredReplicas *int32 `json:"desiredReplicas,omitempty"` + CurrentCPUUtilizationPercentage *int32 `json:"currentCPUUtilizationPercentage,omitempty"` +} + +// HorizontalPodAutoscalerStatusApplyConfiguration constructs an declarative configuration of the HorizontalPodAutoscalerStatus type for use with +// apply. +func HorizontalPodAutoscalerStatus() *HorizontalPodAutoscalerStatusApplyConfiguration { + return &HorizontalPodAutoscalerStatusApplyConfiguration{} +} + +// WithObservedGeneration sets the ObservedGeneration field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ObservedGeneration field is set to the value of the last call. +func (b *HorizontalPodAutoscalerStatusApplyConfiguration) WithObservedGeneration(value int64) *HorizontalPodAutoscalerStatusApplyConfiguration { + b.ObservedGeneration = &value + return b +} + +// WithLastScaleTime sets the LastScaleTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastScaleTime field is set to the value of the last call. +func (b *HorizontalPodAutoscalerStatusApplyConfiguration) WithLastScaleTime(value v1.Time) *HorizontalPodAutoscalerStatusApplyConfiguration { + b.LastScaleTime = &value + return b +} + +// WithCurrentReplicas sets the CurrentReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CurrentReplicas field is set to the value of the last call. +func (b *HorizontalPodAutoscalerStatusApplyConfiguration) WithCurrentReplicas(value int32) *HorizontalPodAutoscalerStatusApplyConfiguration { + b.CurrentReplicas = &value + return b +} + +// WithDesiredReplicas sets the DesiredReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DesiredReplicas field is set to the value of the last call. +func (b *HorizontalPodAutoscalerStatusApplyConfiguration) WithDesiredReplicas(value int32) *HorizontalPodAutoscalerStatusApplyConfiguration { + b.DesiredReplicas = &value + return b +} + +// WithCurrentCPUUtilizationPercentage sets the CurrentCPUUtilizationPercentage field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CurrentCPUUtilizationPercentage field is set to the value of the last call. +func (b *HorizontalPodAutoscalerStatusApplyConfiguration) WithCurrentCPUUtilizationPercentage(value int32) *HorizontalPodAutoscalerStatusApplyConfiguration { + b.CurrentCPUUtilizationPercentage = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/containerresourcemetricsource.go b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/containerresourcemetricsource.go new file mode 100644 index 000000000000..2594e8e07281 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/containerresourcemetricsource.go @@ -0,0 +1,71 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v2beta1 + +import ( + v1 "k8s.io/api/core/v1" + resource "k8s.io/apimachinery/pkg/api/resource" +) + +// ContainerResourceMetricSourceApplyConfiguration represents an declarative configuration of the ContainerResourceMetricSource type for use +// with apply. +type ContainerResourceMetricSourceApplyConfiguration struct { + Name *v1.ResourceName `json:"name,omitempty"` + TargetAverageUtilization *int32 `json:"targetAverageUtilization,omitempty"` + TargetAverageValue *resource.Quantity `json:"targetAverageValue,omitempty"` + Container *string `json:"container,omitempty"` +} + +// ContainerResourceMetricSourceApplyConfiguration constructs an declarative configuration of the ContainerResourceMetricSource type for use with +// apply. +func ContainerResourceMetricSource() *ContainerResourceMetricSourceApplyConfiguration { + return &ContainerResourceMetricSourceApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ContainerResourceMetricSourceApplyConfiguration) WithName(value v1.ResourceName) *ContainerResourceMetricSourceApplyConfiguration { + b.Name = &value + return b +} + +// WithTargetAverageUtilization sets the TargetAverageUtilization field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the TargetAverageUtilization field is set to the value of the last call. +func (b *ContainerResourceMetricSourceApplyConfiguration) WithTargetAverageUtilization(value int32) *ContainerResourceMetricSourceApplyConfiguration { + b.TargetAverageUtilization = &value + return b +} + +// WithTargetAverageValue sets the TargetAverageValue field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the TargetAverageValue field is set to the value of the last call. +func (b *ContainerResourceMetricSourceApplyConfiguration) WithTargetAverageValue(value resource.Quantity) *ContainerResourceMetricSourceApplyConfiguration { + b.TargetAverageValue = &value + return b +} + +// WithContainer sets the Container field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Container field is set to the value of the last call. +func (b *ContainerResourceMetricSourceApplyConfiguration) WithContainer(value string) *ContainerResourceMetricSourceApplyConfiguration { + b.Container = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/containerresourcemetricstatus.go b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/containerresourcemetricstatus.go new file mode 100644 index 000000000000..ae897237c479 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/containerresourcemetricstatus.go @@ -0,0 +1,71 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v2beta1 + +import ( + v1 "k8s.io/api/core/v1" + resource "k8s.io/apimachinery/pkg/api/resource" +) + +// ContainerResourceMetricStatusApplyConfiguration represents an declarative configuration of the ContainerResourceMetricStatus type for use +// with apply. +type ContainerResourceMetricStatusApplyConfiguration struct { + Name *v1.ResourceName `json:"name,omitempty"` + CurrentAverageUtilization *int32 `json:"currentAverageUtilization,omitempty"` + CurrentAverageValue *resource.Quantity `json:"currentAverageValue,omitempty"` + Container *string `json:"container,omitempty"` +} + +// ContainerResourceMetricStatusApplyConfiguration constructs an declarative configuration of the ContainerResourceMetricStatus type for use with +// apply. +func ContainerResourceMetricStatus() *ContainerResourceMetricStatusApplyConfiguration { + return &ContainerResourceMetricStatusApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ContainerResourceMetricStatusApplyConfiguration) WithName(value v1.ResourceName) *ContainerResourceMetricStatusApplyConfiguration { + b.Name = &value + return b +} + +// WithCurrentAverageUtilization sets the CurrentAverageUtilization field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CurrentAverageUtilization field is set to the value of the last call. +func (b *ContainerResourceMetricStatusApplyConfiguration) WithCurrentAverageUtilization(value int32) *ContainerResourceMetricStatusApplyConfiguration { + b.CurrentAverageUtilization = &value + return b +} + +// WithCurrentAverageValue sets the CurrentAverageValue field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CurrentAverageValue field is set to the value of the last call. +func (b *ContainerResourceMetricStatusApplyConfiguration) WithCurrentAverageValue(value resource.Quantity) *ContainerResourceMetricStatusApplyConfiguration { + b.CurrentAverageValue = &value + return b +} + +// WithContainer sets the Container field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Container field is set to the value of the last call. +func (b *ContainerResourceMetricStatusApplyConfiguration) WithContainer(value string) *ContainerResourceMetricStatusApplyConfiguration { + b.Container = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/crossversionobjectreference.go b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/crossversionobjectreference.go new file mode 100644 index 000000000000..fe3d15e8664f --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/crossversionobjectreference.go @@ -0,0 +1,57 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v2beta1 + +// CrossVersionObjectReferenceApplyConfiguration represents an declarative configuration of the CrossVersionObjectReference type for use +// with apply. +type CrossVersionObjectReferenceApplyConfiguration struct { + Kind *string `json:"kind,omitempty"` + Name *string `json:"name,omitempty"` + APIVersion *string `json:"apiVersion,omitempty"` +} + +// CrossVersionObjectReferenceApplyConfiguration constructs an declarative configuration of the CrossVersionObjectReference type for use with +// apply. +func CrossVersionObjectReference() *CrossVersionObjectReferenceApplyConfiguration { + return &CrossVersionObjectReferenceApplyConfiguration{} +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *CrossVersionObjectReferenceApplyConfiguration) WithKind(value string) *CrossVersionObjectReferenceApplyConfiguration { + b.Kind = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *CrossVersionObjectReferenceApplyConfiguration) WithName(value string) *CrossVersionObjectReferenceApplyConfiguration { + b.Name = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *CrossVersionObjectReferenceApplyConfiguration) WithAPIVersion(value string) *CrossVersionObjectReferenceApplyConfiguration { + b.APIVersion = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/externalmetricsource.go b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/externalmetricsource.go new file mode 100644 index 000000000000..c118e6ca1eec --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/externalmetricsource.go @@ -0,0 +1,71 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v2beta1 + +import ( + resource "k8s.io/apimachinery/pkg/api/resource" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// ExternalMetricSourceApplyConfiguration represents an declarative configuration of the ExternalMetricSource type for use +// with apply. +type ExternalMetricSourceApplyConfiguration struct { + MetricName *string `json:"metricName,omitempty"` + MetricSelector *v1.LabelSelectorApplyConfiguration `json:"metricSelector,omitempty"` + TargetValue *resource.Quantity `json:"targetValue,omitempty"` + TargetAverageValue *resource.Quantity `json:"targetAverageValue,omitempty"` +} + +// ExternalMetricSourceApplyConfiguration constructs an declarative configuration of the ExternalMetricSource type for use with +// apply. +func ExternalMetricSource() *ExternalMetricSourceApplyConfiguration { + return &ExternalMetricSourceApplyConfiguration{} +} + +// WithMetricName sets the MetricName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MetricName field is set to the value of the last call. +func (b *ExternalMetricSourceApplyConfiguration) WithMetricName(value string) *ExternalMetricSourceApplyConfiguration { + b.MetricName = &value + return b +} + +// WithMetricSelector sets the MetricSelector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MetricSelector field is set to the value of the last call. +func (b *ExternalMetricSourceApplyConfiguration) WithMetricSelector(value *v1.LabelSelectorApplyConfiguration) *ExternalMetricSourceApplyConfiguration { + b.MetricSelector = value + return b +} + +// WithTargetValue sets the TargetValue field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the TargetValue field is set to the value of the last call. +func (b *ExternalMetricSourceApplyConfiguration) WithTargetValue(value resource.Quantity) *ExternalMetricSourceApplyConfiguration { + b.TargetValue = &value + return b +} + +// WithTargetAverageValue sets the TargetAverageValue field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the TargetAverageValue field is set to the value of the last call. +func (b *ExternalMetricSourceApplyConfiguration) WithTargetAverageValue(value resource.Quantity) *ExternalMetricSourceApplyConfiguration { + b.TargetAverageValue = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/externalmetricstatus.go b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/externalmetricstatus.go new file mode 100644 index 000000000000..ab771214e223 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/externalmetricstatus.go @@ -0,0 +1,71 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v2beta1 + +import ( + resource "k8s.io/apimachinery/pkg/api/resource" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// ExternalMetricStatusApplyConfiguration represents an declarative configuration of the ExternalMetricStatus type for use +// with apply. +type ExternalMetricStatusApplyConfiguration struct { + MetricName *string `json:"metricName,omitempty"` + MetricSelector *v1.LabelSelectorApplyConfiguration `json:"metricSelector,omitempty"` + CurrentValue *resource.Quantity `json:"currentValue,omitempty"` + CurrentAverageValue *resource.Quantity `json:"currentAverageValue,omitempty"` +} + +// ExternalMetricStatusApplyConfiguration constructs an declarative configuration of the ExternalMetricStatus type for use with +// apply. +func ExternalMetricStatus() *ExternalMetricStatusApplyConfiguration { + return &ExternalMetricStatusApplyConfiguration{} +} + +// WithMetricName sets the MetricName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MetricName field is set to the value of the last call. +func (b *ExternalMetricStatusApplyConfiguration) WithMetricName(value string) *ExternalMetricStatusApplyConfiguration { + b.MetricName = &value + return b +} + +// WithMetricSelector sets the MetricSelector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MetricSelector field is set to the value of the last call. +func (b *ExternalMetricStatusApplyConfiguration) WithMetricSelector(value *v1.LabelSelectorApplyConfiguration) *ExternalMetricStatusApplyConfiguration { + b.MetricSelector = value + return b +} + +// WithCurrentValue sets the CurrentValue field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CurrentValue field is set to the value of the last call. +func (b *ExternalMetricStatusApplyConfiguration) WithCurrentValue(value resource.Quantity) *ExternalMetricStatusApplyConfiguration { + b.CurrentValue = &value + return b +} + +// WithCurrentAverageValue sets the CurrentAverageValue field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CurrentAverageValue field is set to the value of the last call. +func (b *ExternalMetricStatusApplyConfiguration) WithCurrentAverageValue(value resource.Quantity) *ExternalMetricStatusApplyConfiguration { + b.CurrentAverageValue = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/horizontalpodautoscaler.go b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/horizontalpodautoscaler.go new file mode 100644 index 000000000000..280ae05095ab --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/horizontalpodautoscaler.go @@ -0,0 +1,265 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v2beta1 + +import ( + autoscalingv2beta1 "k8s.io/api/autoscaling/v2beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// HorizontalPodAutoscalerApplyConfiguration represents an declarative configuration of the HorizontalPodAutoscaler type for use +// with apply. +type HorizontalPodAutoscalerApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *HorizontalPodAutoscalerSpecApplyConfiguration `json:"spec,omitempty"` + Status *HorizontalPodAutoscalerStatusApplyConfiguration `json:"status,omitempty"` +} + +// HorizontalPodAutoscaler constructs an declarative configuration of the HorizontalPodAutoscaler type for use with +// apply. +func HorizontalPodAutoscaler(name, namespace string) *HorizontalPodAutoscalerApplyConfiguration { + b := &HorizontalPodAutoscalerApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("HorizontalPodAutoscaler") + b.WithAPIVersion("autoscaling/v2beta1") + return b +} + +// ExtractHorizontalPodAutoscaler extracts the applied configuration owned by fieldManager from +// horizontalPodAutoscaler. If no managedFields are found in horizontalPodAutoscaler for fieldManager, a +// HorizontalPodAutoscalerApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// horizontalPodAutoscaler must be a unmodified HorizontalPodAutoscaler API object that was retrieved from the Kubernetes API. +// ExtractHorizontalPodAutoscaler provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractHorizontalPodAutoscaler(horizontalPodAutoscaler *autoscalingv2beta1.HorizontalPodAutoscaler, fieldManager string) (*HorizontalPodAutoscalerApplyConfiguration, error) { + b := &HorizontalPodAutoscalerApplyConfiguration{} + err := managedfields.ExtractInto(horizontalPodAutoscaler, internal.Parser().Type("io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscaler"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(horizontalPodAutoscaler.Name) + b.WithNamespace(horizontalPodAutoscaler.Namespace) + + b.WithKind("HorizontalPodAutoscaler") + b.WithAPIVersion("autoscaling/v2beta1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithKind(value string) *HorizontalPodAutoscalerApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithAPIVersion(value string) *HorizontalPodAutoscalerApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithName(value string) *HorizontalPodAutoscalerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithGenerateName(value string) *HorizontalPodAutoscalerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithNamespace(value string) *HorizontalPodAutoscalerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithSelfLink(value string) *HorizontalPodAutoscalerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithUID(value types.UID) *HorizontalPodAutoscalerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithResourceVersion(value string) *HorizontalPodAutoscalerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithGeneration(value int64) *HorizontalPodAutoscalerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithCreationTimestamp(value metav1.Time) *HorizontalPodAutoscalerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *HorizontalPodAutoscalerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *HorizontalPodAutoscalerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithLabels(entries map[string]string) *HorizontalPodAutoscalerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithAnnotations(entries map[string]string) *HorizontalPodAutoscalerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *HorizontalPodAutoscalerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithFinalizers(values ...string) *HorizontalPodAutoscalerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithClusterName(value string) *HorizontalPodAutoscalerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *HorizontalPodAutoscalerApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithSpec(value *HorizontalPodAutoscalerSpecApplyConfiguration) *HorizontalPodAutoscalerApplyConfiguration { + b.Spec = value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithStatus(value *HorizontalPodAutoscalerStatusApplyConfiguration) *HorizontalPodAutoscalerApplyConfiguration { + b.Status = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/horizontalpodautoscalercondition.go b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/horizontalpodautoscalercondition.go new file mode 100644 index 000000000000..de3e6ea5cde8 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/horizontalpodautoscalercondition.go @@ -0,0 +1,81 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v2beta1 + +import ( + v2beta1 "k8s.io/api/autoscaling/v2beta1" + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// HorizontalPodAutoscalerConditionApplyConfiguration represents an declarative configuration of the HorizontalPodAutoscalerCondition type for use +// with apply. +type HorizontalPodAutoscalerConditionApplyConfiguration struct { + Type *v2beta1.HorizontalPodAutoscalerConditionType `json:"type,omitempty"` + Status *v1.ConditionStatus `json:"status,omitempty"` + LastTransitionTime *metav1.Time `json:"lastTransitionTime,omitempty"` + Reason *string `json:"reason,omitempty"` + Message *string `json:"message,omitempty"` +} + +// HorizontalPodAutoscalerConditionApplyConfiguration constructs an declarative configuration of the HorizontalPodAutoscalerCondition type for use with +// apply. +func HorizontalPodAutoscalerCondition() *HorizontalPodAutoscalerConditionApplyConfiguration { + return &HorizontalPodAutoscalerConditionApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *HorizontalPodAutoscalerConditionApplyConfiguration) WithType(value v2beta1.HorizontalPodAutoscalerConditionType) *HorizontalPodAutoscalerConditionApplyConfiguration { + b.Type = &value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *HorizontalPodAutoscalerConditionApplyConfiguration) WithStatus(value v1.ConditionStatus) *HorizontalPodAutoscalerConditionApplyConfiguration { + b.Status = &value + return b +} + +// WithLastTransitionTime sets the LastTransitionTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastTransitionTime field is set to the value of the last call. +func (b *HorizontalPodAutoscalerConditionApplyConfiguration) WithLastTransitionTime(value metav1.Time) *HorizontalPodAutoscalerConditionApplyConfiguration { + b.LastTransitionTime = &value + return b +} + +// WithReason sets the Reason field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Reason field is set to the value of the last call. +func (b *HorizontalPodAutoscalerConditionApplyConfiguration) WithReason(value string) *HorizontalPodAutoscalerConditionApplyConfiguration { + b.Reason = &value + return b +} + +// WithMessage sets the Message field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Message field is set to the value of the last call. +func (b *HorizontalPodAutoscalerConditionApplyConfiguration) WithMessage(value string) *HorizontalPodAutoscalerConditionApplyConfiguration { + b.Message = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/horizontalpodautoscalerspec.go b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/horizontalpodautoscalerspec.go new file mode 100644 index 000000000000..761d94a85054 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/horizontalpodautoscalerspec.go @@ -0,0 +1,71 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v2beta1 + +// HorizontalPodAutoscalerSpecApplyConfiguration represents an declarative configuration of the HorizontalPodAutoscalerSpec type for use +// with apply. +type HorizontalPodAutoscalerSpecApplyConfiguration struct { + ScaleTargetRef *CrossVersionObjectReferenceApplyConfiguration `json:"scaleTargetRef,omitempty"` + MinReplicas *int32 `json:"minReplicas,omitempty"` + MaxReplicas *int32 `json:"maxReplicas,omitempty"` + Metrics []MetricSpecApplyConfiguration `json:"metrics,omitempty"` +} + +// HorizontalPodAutoscalerSpecApplyConfiguration constructs an declarative configuration of the HorizontalPodAutoscalerSpec type for use with +// apply. +func HorizontalPodAutoscalerSpec() *HorizontalPodAutoscalerSpecApplyConfiguration { + return &HorizontalPodAutoscalerSpecApplyConfiguration{} +} + +// WithScaleTargetRef sets the ScaleTargetRef field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ScaleTargetRef field is set to the value of the last call. +func (b *HorizontalPodAutoscalerSpecApplyConfiguration) WithScaleTargetRef(value *CrossVersionObjectReferenceApplyConfiguration) *HorizontalPodAutoscalerSpecApplyConfiguration { + b.ScaleTargetRef = value + return b +} + +// WithMinReplicas sets the MinReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MinReplicas field is set to the value of the last call. +func (b *HorizontalPodAutoscalerSpecApplyConfiguration) WithMinReplicas(value int32) *HorizontalPodAutoscalerSpecApplyConfiguration { + b.MinReplicas = &value + return b +} + +// WithMaxReplicas sets the MaxReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MaxReplicas field is set to the value of the last call. +func (b *HorizontalPodAutoscalerSpecApplyConfiguration) WithMaxReplicas(value int32) *HorizontalPodAutoscalerSpecApplyConfiguration { + b.MaxReplicas = &value + return b +} + +// WithMetrics adds the given value to the Metrics field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Metrics field. +func (b *HorizontalPodAutoscalerSpecApplyConfiguration) WithMetrics(values ...*MetricSpecApplyConfiguration) *HorizontalPodAutoscalerSpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithMetrics") + } + b.Metrics = append(b.Metrics, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/horizontalpodautoscalerstatus.go b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/horizontalpodautoscalerstatus.go new file mode 100644 index 000000000000..95ec5be43b55 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/horizontalpodautoscalerstatus.go @@ -0,0 +1,98 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v2beta1 + +import ( + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// HorizontalPodAutoscalerStatusApplyConfiguration represents an declarative configuration of the HorizontalPodAutoscalerStatus type for use +// with apply. +type HorizontalPodAutoscalerStatusApplyConfiguration struct { + ObservedGeneration *int64 `json:"observedGeneration,omitempty"` + LastScaleTime *v1.Time `json:"lastScaleTime,omitempty"` + CurrentReplicas *int32 `json:"currentReplicas,omitempty"` + DesiredReplicas *int32 `json:"desiredReplicas,omitempty"` + CurrentMetrics []MetricStatusApplyConfiguration `json:"currentMetrics,omitempty"` + Conditions []HorizontalPodAutoscalerConditionApplyConfiguration `json:"conditions,omitempty"` +} + +// HorizontalPodAutoscalerStatusApplyConfiguration constructs an declarative configuration of the HorizontalPodAutoscalerStatus type for use with +// apply. +func HorizontalPodAutoscalerStatus() *HorizontalPodAutoscalerStatusApplyConfiguration { + return &HorizontalPodAutoscalerStatusApplyConfiguration{} +} + +// WithObservedGeneration sets the ObservedGeneration field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ObservedGeneration field is set to the value of the last call. +func (b *HorizontalPodAutoscalerStatusApplyConfiguration) WithObservedGeneration(value int64) *HorizontalPodAutoscalerStatusApplyConfiguration { + b.ObservedGeneration = &value + return b +} + +// WithLastScaleTime sets the LastScaleTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastScaleTime field is set to the value of the last call. +func (b *HorizontalPodAutoscalerStatusApplyConfiguration) WithLastScaleTime(value v1.Time) *HorizontalPodAutoscalerStatusApplyConfiguration { + b.LastScaleTime = &value + return b +} + +// WithCurrentReplicas sets the CurrentReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CurrentReplicas field is set to the value of the last call. +func (b *HorizontalPodAutoscalerStatusApplyConfiguration) WithCurrentReplicas(value int32) *HorizontalPodAutoscalerStatusApplyConfiguration { + b.CurrentReplicas = &value + return b +} + +// WithDesiredReplicas sets the DesiredReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DesiredReplicas field is set to the value of the last call. +func (b *HorizontalPodAutoscalerStatusApplyConfiguration) WithDesiredReplicas(value int32) *HorizontalPodAutoscalerStatusApplyConfiguration { + b.DesiredReplicas = &value + return b +} + +// WithCurrentMetrics adds the given value to the CurrentMetrics field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the CurrentMetrics field. +func (b *HorizontalPodAutoscalerStatusApplyConfiguration) WithCurrentMetrics(values ...*MetricStatusApplyConfiguration) *HorizontalPodAutoscalerStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithCurrentMetrics") + } + b.CurrentMetrics = append(b.CurrentMetrics, *values[i]) + } + return b +} + +// WithConditions adds the given value to the Conditions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Conditions field. +func (b *HorizontalPodAutoscalerStatusApplyConfiguration) WithConditions(values ...*HorizontalPodAutoscalerConditionApplyConfiguration) *HorizontalPodAutoscalerStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithConditions") + } + b.Conditions = append(b.Conditions, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/metricspec.go b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/metricspec.go new file mode 100644 index 000000000000..70beec84e022 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/metricspec.go @@ -0,0 +1,88 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v2beta1 + +import ( + v2beta1 "k8s.io/api/autoscaling/v2beta1" +) + +// MetricSpecApplyConfiguration represents an declarative configuration of the MetricSpec type for use +// with apply. +type MetricSpecApplyConfiguration struct { + Type *v2beta1.MetricSourceType `json:"type,omitempty"` + Object *ObjectMetricSourceApplyConfiguration `json:"object,omitempty"` + Pods *PodsMetricSourceApplyConfiguration `json:"pods,omitempty"` + Resource *ResourceMetricSourceApplyConfiguration `json:"resource,omitempty"` + ContainerResource *ContainerResourceMetricSourceApplyConfiguration `json:"containerResource,omitempty"` + External *ExternalMetricSourceApplyConfiguration `json:"external,omitempty"` +} + +// MetricSpecApplyConfiguration constructs an declarative configuration of the MetricSpec type for use with +// apply. +func MetricSpec() *MetricSpecApplyConfiguration { + return &MetricSpecApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *MetricSpecApplyConfiguration) WithType(value v2beta1.MetricSourceType) *MetricSpecApplyConfiguration { + b.Type = &value + return b +} + +// WithObject sets the Object field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Object field is set to the value of the last call. +func (b *MetricSpecApplyConfiguration) WithObject(value *ObjectMetricSourceApplyConfiguration) *MetricSpecApplyConfiguration { + b.Object = value + return b +} + +// WithPods sets the Pods field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Pods field is set to the value of the last call. +func (b *MetricSpecApplyConfiguration) WithPods(value *PodsMetricSourceApplyConfiguration) *MetricSpecApplyConfiguration { + b.Pods = value + return b +} + +// WithResource sets the Resource field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Resource field is set to the value of the last call. +func (b *MetricSpecApplyConfiguration) WithResource(value *ResourceMetricSourceApplyConfiguration) *MetricSpecApplyConfiguration { + b.Resource = value + return b +} + +// WithContainerResource sets the ContainerResource field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ContainerResource field is set to the value of the last call. +func (b *MetricSpecApplyConfiguration) WithContainerResource(value *ContainerResourceMetricSourceApplyConfiguration) *MetricSpecApplyConfiguration { + b.ContainerResource = value + return b +} + +// WithExternal sets the External field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the External field is set to the value of the last call. +func (b *MetricSpecApplyConfiguration) WithExternal(value *ExternalMetricSourceApplyConfiguration) *MetricSpecApplyConfiguration { + b.External = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/metricstatus.go b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/metricstatus.go new file mode 100644 index 000000000000..b03ea2f9e4b3 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/metricstatus.go @@ -0,0 +1,88 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v2beta1 + +import ( + v2beta1 "k8s.io/api/autoscaling/v2beta1" +) + +// MetricStatusApplyConfiguration represents an declarative configuration of the MetricStatus type for use +// with apply. +type MetricStatusApplyConfiguration struct { + Type *v2beta1.MetricSourceType `json:"type,omitempty"` + Object *ObjectMetricStatusApplyConfiguration `json:"object,omitempty"` + Pods *PodsMetricStatusApplyConfiguration `json:"pods,omitempty"` + Resource *ResourceMetricStatusApplyConfiguration `json:"resource,omitempty"` + ContainerResource *ContainerResourceMetricStatusApplyConfiguration `json:"containerResource,omitempty"` + External *ExternalMetricStatusApplyConfiguration `json:"external,omitempty"` +} + +// MetricStatusApplyConfiguration constructs an declarative configuration of the MetricStatus type for use with +// apply. +func MetricStatus() *MetricStatusApplyConfiguration { + return &MetricStatusApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *MetricStatusApplyConfiguration) WithType(value v2beta1.MetricSourceType) *MetricStatusApplyConfiguration { + b.Type = &value + return b +} + +// WithObject sets the Object field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Object field is set to the value of the last call. +func (b *MetricStatusApplyConfiguration) WithObject(value *ObjectMetricStatusApplyConfiguration) *MetricStatusApplyConfiguration { + b.Object = value + return b +} + +// WithPods sets the Pods field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Pods field is set to the value of the last call. +func (b *MetricStatusApplyConfiguration) WithPods(value *PodsMetricStatusApplyConfiguration) *MetricStatusApplyConfiguration { + b.Pods = value + return b +} + +// WithResource sets the Resource field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Resource field is set to the value of the last call. +func (b *MetricStatusApplyConfiguration) WithResource(value *ResourceMetricStatusApplyConfiguration) *MetricStatusApplyConfiguration { + b.Resource = value + return b +} + +// WithContainerResource sets the ContainerResource field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ContainerResource field is set to the value of the last call. +func (b *MetricStatusApplyConfiguration) WithContainerResource(value *ContainerResourceMetricStatusApplyConfiguration) *MetricStatusApplyConfiguration { + b.ContainerResource = value + return b +} + +// WithExternal sets the External field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the External field is set to the value of the last call. +func (b *MetricStatusApplyConfiguration) WithExternal(value *ExternalMetricStatusApplyConfiguration) *MetricStatusApplyConfiguration { + b.External = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/objectmetricsource.go b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/objectmetricsource.go new file mode 100644 index 000000000000..07d467972eca --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/objectmetricsource.go @@ -0,0 +1,80 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v2beta1 + +import ( + resource "k8s.io/apimachinery/pkg/api/resource" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// ObjectMetricSourceApplyConfiguration represents an declarative configuration of the ObjectMetricSource type for use +// with apply. +type ObjectMetricSourceApplyConfiguration struct { + Target *CrossVersionObjectReferenceApplyConfiguration `json:"target,omitempty"` + MetricName *string `json:"metricName,omitempty"` + TargetValue *resource.Quantity `json:"targetValue,omitempty"` + Selector *v1.LabelSelectorApplyConfiguration `json:"selector,omitempty"` + AverageValue *resource.Quantity `json:"averageValue,omitempty"` +} + +// ObjectMetricSourceApplyConfiguration constructs an declarative configuration of the ObjectMetricSource type for use with +// apply. +func ObjectMetricSource() *ObjectMetricSourceApplyConfiguration { + return &ObjectMetricSourceApplyConfiguration{} +} + +// WithTarget sets the Target field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Target field is set to the value of the last call. +func (b *ObjectMetricSourceApplyConfiguration) WithTarget(value *CrossVersionObjectReferenceApplyConfiguration) *ObjectMetricSourceApplyConfiguration { + b.Target = value + return b +} + +// WithMetricName sets the MetricName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MetricName field is set to the value of the last call. +func (b *ObjectMetricSourceApplyConfiguration) WithMetricName(value string) *ObjectMetricSourceApplyConfiguration { + b.MetricName = &value + return b +} + +// WithTargetValue sets the TargetValue field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the TargetValue field is set to the value of the last call. +func (b *ObjectMetricSourceApplyConfiguration) WithTargetValue(value resource.Quantity) *ObjectMetricSourceApplyConfiguration { + b.TargetValue = &value + return b +} + +// WithSelector sets the Selector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Selector field is set to the value of the last call. +func (b *ObjectMetricSourceApplyConfiguration) WithSelector(value *v1.LabelSelectorApplyConfiguration) *ObjectMetricSourceApplyConfiguration { + b.Selector = value + return b +} + +// WithAverageValue sets the AverageValue field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AverageValue field is set to the value of the last call. +func (b *ObjectMetricSourceApplyConfiguration) WithAverageValue(value resource.Quantity) *ObjectMetricSourceApplyConfiguration { + b.AverageValue = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/objectmetricstatus.go b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/objectmetricstatus.go new file mode 100644 index 000000000000..b5e0d3e3d22e --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/objectmetricstatus.go @@ -0,0 +1,80 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v2beta1 + +import ( + resource "k8s.io/apimachinery/pkg/api/resource" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// ObjectMetricStatusApplyConfiguration represents an declarative configuration of the ObjectMetricStatus type for use +// with apply. +type ObjectMetricStatusApplyConfiguration struct { + Target *CrossVersionObjectReferenceApplyConfiguration `json:"target,omitempty"` + MetricName *string `json:"metricName,omitempty"` + CurrentValue *resource.Quantity `json:"currentValue,omitempty"` + Selector *v1.LabelSelectorApplyConfiguration `json:"selector,omitempty"` + AverageValue *resource.Quantity `json:"averageValue,omitempty"` +} + +// ObjectMetricStatusApplyConfiguration constructs an declarative configuration of the ObjectMetricStatus type for use with +// apply. +func ObjectMetricStatus() *ObjectMetricStatusApplyConfiguration { + return &ObjectMetricStatusApplyConfiguration{} +} + +// WithTarget sets the Target field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Target field is set to the value of the last call. +func (b *ObjectMetricStatusApplyConfiguration) WithTarget(value *CrossVersionObjectReferenceApplyConfiguration) *ObjectMetricStatusApplyConfiguration { + b.Target = value + return b +} + +// WithMetricName sets the MetricName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MetricName field is set to the value of the last call. +func (b *ObjectMetricStatusApplyConfiguration) WithMetricName(value string) *ObjectMetricStatusApplyConfiguration { + b.MetricName = &value + return b +} + +// WithCurrentValue sets the CurrentValue field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CurrentValue field is set to the value of the last call. +func (b *ObjectMetricStatusApplyConfiguration) WithCurrentValue(value resource.Quantity) *ObjectMetricStatusApplyConfiguration { + b.CurrentValue = &value + return b +} + +// WithSelector sets the Selector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Selector field is set to the value of the last call. +func (b *ObjectMetricStatusApplyConfiguration) WithSelector(value *v1.LabelSelectorApplyConfiguration) *ObjectMetricStatusApplyConfiguration { + b.Selector = value + return b +} + +// WithAverageValue sets the AverageValue field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AverageValue field is set to the value of the last call. +func (b *ObjectMetricStatusApplyConfiguration) WithAverageValue(value resource.Quantity) *ObjectMetricStatusApplyConfiguration { + b.AverageValue = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/podsmetricsource.go b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/podsmetricsource.go new file mode 100644 index 000000000000..a4122b898983 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/podsmetricsource.go @@ -0,0 +1,62 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v2beta1 + +import ( + resource "k8s.io/apimachinery/pkg/api/resource" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// PodsMetricSourceApplyConfiguration represents an declarative configuration of the PodsMetricSource type for use +// with apply. +type PodsMetricSourceApplyConfiguration struct { + MetricName *string `json:"metricName,omitempty"` + TargetAverageValue *resource.Quantity `json:"targetAverageValue,omitempty"` + Selector *v1.LabelSelectorApplyConfiguration `json:"selector,omitempty"` +} + +// PodsMetricSourceApplyConfiguration constructs an declarative configuration of the PodsMetricSource type for use with +// apply. +func PodsMetricSource() *PodsMetricSourceApplyConfiguration { + return &PodsMetricSourceApplyConfiguration{} +} + +// WithMetricName sets the MetricName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MetricName field is set to the value of the last call. +func (b *PodsMetricSourceApplyConfiguration) WithMetricName(value string) *PodsMetricSourceApplyConfiguration { + b.MetricName = &value + return b +} + +// WithTargetAverageValue sets the TargetAverageValue field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the TargetAverageValue field is set to the value of the last call. +func (b *PodsMetricSourceApplyConfiguration) WithTargetAverageValue(value resource.Quantity) *PodsMetricSourceApplyConfiguration { + b.TargetAverageValue = &value + return b +} + +// WithSelector sets the Selector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Selector field is set to the value of the last call. +func (b *PodsMetricSourceApplyConfiguration) WithSelector(value *v1.LabelSelectorApplyConfiguration) *PodsMetricSourceApplyConfiguration { + b.Selector = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/podsmetricstatus.go b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/podsmetricstatus.go new file mode 100644 index 000000000000..d6172011b7a2 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/podsmetricstatus.go @@ -0,0 +1,62 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v2beta1 + +import ( + resource "k8s.io/apimachinery/pkg/api/resource" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// PodsMetricStatusApplyConfiguration represents an declarative configuration of the PodsMetricStatus type for use +// with apply. +type PodsMetricStatusApplyConfiguration struct { + MetricName *string `json:"metricName,omitempty"` + CurrentAverageValue *resource.Quantity `json:"currentAverageValue,omitempty"` + Selector *v1.LabelSelectorApplyConfiguration `json:"selector,omitempty"` +} + +// PodsMetricStatusApplyConfiguration constructs an declarative configuration of the PodsMetricStatus type for use with +// apply. +func PodsMetricStatus() *PodsMetricStatusApplyConfiguration { + return &PodsMetricStatusApplyConfiguration{} +} + +// WithMetricName sets the MetricName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MetricName field is set to the value of the last call. +func (b *PodsMetricStatusApplyConfiguration) WithMetricName(value string) *PodsMetricStatusApplyConfiguration { + b.MetricName = &value + return b +} + +// WithCurrentAverageValue sets the CurrentAverageValue field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CurrentAverageValue field is set to the value of the last call. +func (b *PodsMetricStatusApplyConfiguration) WithCurrentAverageValue(value resource.Quantity) *PodsMetricStatusApplyConfiguration { + b.CurrentAverageValue = &value + return b +} + +// WithSelector sets the Selector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Selector field is set to the value of the last call. +func (b *PodsMetricStatusApplyConfiguration) WithSelector(value *v1.LabelSelectorApplyConfiguration) *PodsMetricStatusApplyConfiguration { + b.Selector = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/resourcemetricsource.go b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/resourcemetricsource.go new file mode 100644 index 000000000000..804f3f492632 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/resourcemetricsource.go @@ -0,0 +1,62 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v2beta1 + +import ( + v1 "k8s.io/api/core/v1" + resource "k8s.io/apimachinery/pkg/api/resource" +) + +// ResourceMetricSourceApplyConfiguration represents an declarative configuration of the ResourceMetricSource type for use +// with apply. +type ResourceMetricSourceApplyConfiguration struct { + Name *v1.ResourceName `json:"name,omitempty"` + TargetAverageUtilization *int32 `json:"targetAverageUtilization,omitempty"` + TargetAverageValue *resource.Quantity `json:"targetAverageValue,omitempty"` +} + +// ResourceMetricSourceApplyConfiguration constructs an declarative configuration of the ResourceMetricSource type for use with +// apply. +func ResourceMetricSource() *ResourceMetricSourceApplyConfiguration { + return &ResourceMetricSourceApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ResourceMetricSourceApplyConfiguration) WithName(value v1.ResourceName) *ResourceMetricSourceApplyConfiguration { + b.Name = &value + return b +} + +// WithTargetAverageUtilization sets the TargetAverageUtilization field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the TargetAverageUtilization field is set to the value of the last call. +func (b *ResourceMetricSourceApplyConfiguration) WithTargetAverageUtilization(value int32) *ResourceMetricSourceApplyConfiguration { + b.TargetAverageUtilization = &value + return b +} + +// WithTargetAverageValue sets the TargetAverageValue field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the TargetAverageValue field is set to the value of the last call. +func (b *ResourceMetricSourceApplyConfiguration) WithTargetAverageValue(value resource.Quantity) *ResourceMetricSourceApplyConfiguration { + b.TargetAverageValue = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/resourcemetricstatus.go b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/resourcemetricstatus.go new file mode 100644 index 000000000000..5fdc29c1328a --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta1/resourcemetricstatus.go @@ -0,0 +1,62 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v2beta1 + +import ( + v1 "k8s.io/api/core/v1" + resource "k8s.io/apimachinery/pkg/api/resource" +) + +// ResourceMetricStatusApplyConfiguration represents an declarative configuration of the ResourceMetricStatus type for use +// with apply. +type ResourceMetricStatusApplyConfiguration struct { + Name *v1.ResourceName `json:"name,omitempty"` + CurrentAverageUtilization *int32 `json:"currentAverageUtilization,omitempty"` + CurrentAverageValue *resource.Quantity `json:"currentAverageValue,omitempty"` +} + +// ResourceMetricStatusApplyConfiguration constructs an declarative configuration of the ResourceMetricStatus type for use with +// apply. +func ResourceMetricStatus() *ResourceMetricStatusApplyConfiguration { + return &ResourceMetricStatusApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ResourceMetricStatusApplyConfiguration) WithName(value v1.ResourceName) *ResourceMetricStatusApplyConfiguration { + b.Name = &value + return b +} + +// WithCurrentAverageUtilization sets the CurrentAverageUtilization field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CurrentAverageUtilization field is set to the value of the last call. +func (b *ResourceMetricStatusApplyConfiguration) WithCurrentAverageUtilization(value int32) *ResourceMetricStatusApplyConfiguration { + b.CurrentAverageUtilization = &value + return b +} + +// WithCurrentAverageValue sets the CurrentAverageValue field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CurrentAverageValue field is set to the value of the last call. +func (b *ResourceMetricStatusApplyConfiguration) WithCurrentAverageValue(value resource.Quantity) *ResourceMetricStatusApplyConfiguration { + b.CurrentAverageValue = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/containerresourcemetricsource.go b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/containerresourcemetricsource.go new file mode 100644 index 000000000000..aa334744ea8b --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/containerresourcemetricsource.go @@ -0,0 +1,61 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v2beta2 + +import ( + v1 "k8s.io/api/core/v1" +) + +// ContainerResourceMetricSourceApplyConfiguration represents an declarative configuration of the ContainerResourceMetricSource type for use +// with apply. +type ContainerResourceMetricSourceApplyConfiguration struct { + Name *v1.ResourceName `json:"name,omitempty"` + Target *MetricTargetApplyConfiguration `json:"target,omitempty"` + Container *string `json:"container,omitempty"` +} + +// ContainerResourceMetricSourceApplyConfiguration constructs an declarative configuration of the ContainerResourceMetricSource type for use with +// apply. +func ContainerResourceMetricSource() *ContainerResourceMetricSourceApplyConfiguration { + return &ContainerResourceMetricSourceApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ContainerResourceMetricSourceApplyConfiguration) WithName(value v1.ResourceName) *ContainerResourceMetricSourceApplyConfiguration { + b.Name = &value + return b +} + +// WithTarget sets the Target field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Target field is set to the value of the last call. +func (b *ContainerResourceMetricSourceApplyConfiguration) WithTarget(value *MetricTargetApplyConfiguration) *ContainerResourceMetricSourceApplyConfiguration { + b.Target = value + return b +} + +// WithContainer sets the Container field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Container field is set to the value of the last call. +func (b *ContainerResourceMetricSourceApplyConfiguration) WithContainer(value string) *ContainerResourceMetricSourceApplyConfiguration { + b.Container = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/containerresourcemetricstatus.go b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/containerresourcemetricstatus.go new file mode 100644 index 000000000000..bf0822a06641 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/containerresourcemetricstatus.go @@ -0,0 +1,61 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v2beta2 + +import ( + v1 "k8s.io/api/core/v1" +) + +// ContainerResourceMetricStatusApplyConfiguration represents an declarative configuration of the ContainerResourceMetricStatus type for use +// with apply. +type ContainerResourceMetricStatusApplyConfiguration struct { + Name *v1.ResourceName `json:"name,omitempty"` + Current *MetricValueStatusApplyConfiguration `json:"current,omitempty"` + Container *string `json:"container,omitempty"` +} + +// ContainerResourceMetricStatusApplyConfiguration constructs an declarative configuration of the ContainerResourceMetricStatus type for use with +// apply. +func ContainerResourceMetricStatus() *ContainerResourceMetricStatusApplyConfiguration { + return &ContainerResourceMetricStatusApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ContainerResourceMetricStatusApplyConfiguration) WithName(value v1.ResourceName) *ContainerResourceMetricStatusApplyConfiguration { + b.Name = &value + return b +} + +// WithCurrent sets the Current field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Current field is set to the value of the last call. +func (b *ContainerResourceMetricStatusApplyConfiguration) WithCurrent(value *MetricValueStatusApplyConfiguration) *ContainerResourceMetricStatusApplyConfiguration { + b.Current = value + return b +} + +// WithContainer sets the Container field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Container field is set to the value of the last call. +func (b *ContainerResourceMetricStatusApplyConfiguration) WithContainer(value string) *ContainerResourceMetricStatusApplyConfiguration { + b.Container = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/crossversionobjectreference.go b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/crossversionobjectreference.go new file mode 100644 index 000000000000..2903629bc80b --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/crossversionobjectreference.go @@ -0,0 +1,57 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v2beta2 + +// CrossVersionObjectReferenceApplyConfiguration represents an declarative configuration of the CrossVersionObjectReference type for use +// with apply. +type CrossVersionObjectReferenceApplyConfiguration struct { + Kind *string `json:"kind,omitempty"` + Name *string `json:"name,omitempty"` + APIVersion *string `json:"apiVersion,omitempty"` +} + +// CrossVersionObjectReferenceApplyConfiguration constructs an declarative configuration of the CrossVersionObjectReference type for use with +// apply. +func CrossVersionObjectReference() *CrossVersionObjectReferenceApplyConfiguration { + return &CrossVersionObjectReferenceApplyConfiguration{} +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *CrossVersionObjectReferenceApplyConfiguration) WithKind(value string) *CrossVersionObjectReferenceApplyConfiguration { + b.Kind = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *CrossVersionObjectReferenceApplyConfiguration) WithName(value string) *CrossVersionObjectReferenceApplyConfiguration { + b.Name = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *CrossVersionObjectReferenceApplyConfiguration) WithAPIVersion(value string) *CrossVersionObjectReferenceApplyConfiguration { + b.APIVersion = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/externalmetricsource.go b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/externalmetricsource.go new file mode 100644 index 000000000000..80053a6b334c --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/externalmetricsource.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v2beta2 + +// ExternalMetricSourceApplyConfiguration represents an declarative configuration of the ExternalMetricSource type for use +// with apply. +type ExternalMetricSourceApplyConfiguration struct { + Metric *MetricIdentifierApplyConfiguration `json:"metric,omitempty"` + Target *MetricTargetApplyConfiguration `json:"target,omitempty"` +} + +// ExternalMetricSourceApplyConfiguration constructs an declarative configuration of the ExternalMetricSource type for use with +// apply. +func ExternalMetricSource() *ExternalMetricSourceApplyConfiguration { + return &ExternalMetricSourceApplyConfiguration{} +} + +// WithMetric sets the Metric field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Metric field is set to the value of the last call. +func (b *ExternalMetricSourceApplyConfiguration) WithMetric(value *MetricIdentifierApplyConfiguration) *ExternalMetricSourceApplyConfiguration { + b.Metric = value + return b +} + +// WithTarget sets the Target field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Target field is set to the value of the last call. +func (b *ExternalMetricSourceApplyConfiguration) WithTarget(value *MetricTargetApplyConfiguration) *ExternalMetricSourceApplyConfiguration { + b.Target = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/externalmetricstatus.go b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/externalmetricstatus.go new file mode 100644 index 000000000000..71ac35adbc32 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/externalmetricstatus.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v2beta2 + +// ExternalMetricStatusApplyConfiguration represents an declarative configuration of the ExternalMetricStatus type for use +// with apply. +type ExternalMetricStatusApplyConfiguration struct { + Metric *MetricIdentifierApplyConfiguration `json:"metric,omitempty"` + Current *MetricValueStatusApplyConfiguration `json:"current,omitempty"` +} + +// ExternalMetricStatusApplyConfiguration constructs an declarative configuration of the ExternalMetricStatus type for use with +// apply. +func ExternalMetricStatus() *ExternalMetricStatusApplyConfiguration { + return &ExternalMetricStatusApplyConfiguration{} +} + +// WithMetric sets the Metric field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Metric field is set to the value of the last call. +func (b *ExternalMetricStatusApplyConfiguration) WithMetric(value *MetricIdentifierApplyConfiguration) *ExternalMetricStatusApplyConfiguration { + b.Metric = value + return b +} + +// WithCurrent sets the Current field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Current field is set to the value of the last call. +func (b *ExternalMetricStatusApplyConfiguration) WithCurrent(value *MetricValueStatusApplyConfiguration) *ExternalMetricStatusApplyConfiguration { + b.Current = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/horizontalpodautoscaler.go b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/horizontalpodautoscaler.go new file mode 100644 index 000000000000..0ae4a195368d --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/horizontalpodautoscaler.go @@ -0,0 +1,265 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v2beta2 + +import ( + autoscalingv2beta2 "k8s.io/api/autoscaling/v2beta2" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// HorizontalPodAutoscalerApplyConfiguration represents an declarative configuration of the HorizontalPodAutoscaler type for use +// with apply. +type HorizontalPodAutoscalerApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *HorizontalPodAutoscalerSpecApplyConfiguration `json:"spec,omitempty"` + Status *HorizontalPodAutoscalerStatusApplyConfiguration `json:"status,omitempty"` +} + +// HorizontalPodAutoscaler constructs an declarative configuration of the HorizontalPodAutoscaler type for use with +// apply. +func HorizontalPodAutoscaler(name, namespace string) *HorizontalPodAutoscalerApplyConfiguration { + b := &HorizontalPodAutoscalerApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("HorizontalPodAutoscaler") + b.WithAPIVersion("autoscaling/v2beta2") + return b +} + +// ExtractHorizontalPodAutoscaler extracts the applied configuration owned by fieldManager from +// horizontalPodAutoscaler. If no managedFields are found in horizontalPodAutoscaler for fieldManager, a +// HorizontalPodAutoscalerApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// horizontalPodAutoscaler must be a unmodified HorizontalPodAutoscaler API object that was retrieved from the Kubernetes API. +// ExtractHorizontalPodAutoscaler provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractHorizontalPodAutoscaler(horizontalPodAutoscaler *autoscalingv2beta2.HorizontalPodAutoscaler, fieldManager string) (*HorizontalPodAutoscalerApplyConfiguration, error) { + b := &HorizontalPodAutoscalerApplyConfiguration{} + err := managedfields.ExtractInto(horizontalPodAutoscaler, internal.Parser().Type("io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscaler"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(horizontalPodAutoscaler.Name) + b.WithNamespace(horizontalPodAutoscaler.Namespace) + + b.WithKind("HorizontalPodAutoscaler") + b.WithAPIVersion("autoscaling/v2beta2") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithKind(value string) *HorizontalPodAutoscalerApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithAPIVersion(value string) *HorizontalPodAutoscalerApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithName(value string) *HorizontalPodAutoscalerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithGenerateName(value string) *HorizontalPodAutoscalerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithNamespace(value string) *HorizontalPodAutoscalerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithSelfLink(value string) *HorizontalPodAutoscalerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithUID(value types.UID) *HorizontalPodAutoscalerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithResourceVersion(value string) *HorizontalPodAutoscalerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithGeneration(value int64) *HorizontalPodAutoscalerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithCreationTimestamp(value metav1.Time) *HorizontalPodAutoscalerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *HorizontalPodAutoscalerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *HorizontalPodAutoscalerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithLabels(entries map[string]string) *HorizontalPodAutoscalerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithAnnotations(entries map[string]string) *HorizontalPodAutoscalerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *HorizontalPodAutoscalerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithFinalizers(values ...string) *HorizontalPodAutoscalerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithClusterName(value string) *HorizontalPodAutoscalerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *HorizontalPodAutoscalerApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithSpec(value *HorizontalPodAutoscalerSpecApplyConfiguration) *HorizontalPodAutoscalerApplyConfiguration { + b.Spec = value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *HorizontalPodAutoscalerApplyConfiguration) WithStatus(value *HorizontalPodAutoscalerStatusApplyConfiguration) *HorizontalPodAutoscalerApplyConfiguration { + b.Status = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/horizontalpodautoscalerbehavior.go b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/horizontalpodautoscalerbehavior.go new file mode 100644 index 000000000000..ec41bfadeaa2 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/horizontalpodautoscalerbehavior.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v2beta2 + +// HorizontalPodAutoscalerBehaviorApplyConfiguration represents an declarative configuration of the HorizontalPodAutoscalerBehavior type for use +// with apply. +type HorizontalPodAutoscalerBehaviorApplyConfiguration struct { + ScaleUp *HPAScalingRulesApplyConfiguration `json:"scaleUp,omitempty"` + ScaleDown *HPAScalingRulesApplyConfiguration `json:"scaleDown,omitempty"` +} + +// HorizontalPodAutoscalerBehaviorApplyConfiguration constructs an declarative configuration of the HorizontalPodAutoscalerBehavior type for use with +// apply. +func HorizontalPodAutoscalerBehavior() *HorizontalPodAutoscalerBehaviorApplyConfiguration { + return &HorizontalPodAutoscalerBehaviorApplyConfiguration{} +} + +// WithScaleUp sets the ScaleUp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ScaleUp field is set to the value of the last call. +func (b *HorizontalPodAutoscalerBehaviorApplyConfiguration) WithScaleUp(value *HPAScalingRulesApplyConfiguration) *HorizontalPodAutoscalerBehaviorApplyConfiguration { + b.ScaleUp = value + return b +} + +// WithScaleDown sets the ScaleDown field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ScaleDown field is set to the value of the last call. +func (b *HorizontalPodAutoscalerBehaviorApplyConfiguration) WithScaleDown(value *HPAScalingRulesApplyConfiguration) *HorizontalPodAutoscalerBehaviorApplyConfiguration { + b.ScaleDown = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/horizontalpodautoscalercondition.go b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/horizontalpodautoscalercondition.go new file mode 100644 index 000000000000..0f0cae75d35b --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/horizontalpodautoscalercondition.go @@ -0,0 +1,81 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v2beta2 + +import ( + v2beta2 "k8s.io/api/autoscaling/v2beta2" + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// HorizontalPodAutoscalerConditionApplyConfiguration represents an declarative configuration of the HorizontalPodAutoscalerCondition type for use +// with apply. +type HorizontalPodAutoscalerConditionApplyConfiguration struct { + Type *v2beta2.HorizontalPodAutoscalerConditionType `json:"type,omitempty"` + Status *v1.ConditionStatus `json:"status,omitempty"` + LastTransitionTime *metav1.Time `json:"lastTransitionTime,omitempty"` + Reason *string `json:"reason,omitempty"` + Message *string `json:"message,omitempty"` +} + +// HorizontalPodAutoscalerConditionApplyConfiguration constructs an declarative configuration of the HorizontalPodAutoscalerCondition type for use with +// apply. +func HorizontalPodAutoscalerCondition() *HorizontalPodAutoscalerConditionApplyConfiguration { + return &HorizontalPodAutoscalerConditionApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *HorizontalPodAutoscalerConditionApplyConfiguration) WithType(value v2beta2.HorizontalPodAutoscalerConditionType) *HorizontalPodAutoscalerConditionApplyConfiguration { + b.Type = &value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *HorizontalPodAutoscalerConditionApplyConfiguration) WithStatus(value v1.ConditionStatus) *HorizontalPodAutoscalerConditionApplyConfiguration { + b.Status = &value + return b +} + +// WithLastTransitionTime sets the LastTransitionTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastTransitionTime field is set to the value of the last call. +func (b *HorizontalPodAutoscalerConditionApplyConfiguration) WithLastTransitionTime(value metav1.Time) *HorizontalPodAutoscalerConditionApplyConfiguration { + b.LastTransitionTime = &value + return b +} + +// WithReason sets the Reason field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Reason field is set to the value of the last call. +func (b *HorizontalPodAutoscalerConditionApplyConfiguration) WithReason(value string) *HorizontalPodAutoscalerConditionApplyConfiguration { + b.Reason = &value + return b +} + +// WithMessage sets the Message field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Message field is set to the value of the last call. +func (b *HorizontalPodAutoscalerConditionApplyConfiguration) WithMessage(value string) *HorizontalPodAutoscalerConditionApplyConfiguration { + b.Message = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/horizontalpodautoscalerspec.go b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/horizontalpodautoscalerspec.go new file mode 100644 index 000000000000..c60adee581ed --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/horizontalpodautoscalerspec.go @@ -0,0 +1,80 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v2beta2 + +// HorizontalPodAutoscalerSpecApplyConfiguration represents an declarative configuration of the HorizontalPodAutoscalerSpec type for use +// with apply. +type HorizontalPodAutoscalerSpecApplyConfiguration struct { + ScaleTargetRef *CrossVersionObjectReferenceApplyConfiguration `json:"scaleTargetRef,omitempty"` + MinReplicas *int32 `json:"minReplicas,omitempty"` + MaxReplicas *int32 `json:"maxReplicas,omitempty"` + Metrics []MetricSpecApplyConfiguration `json:"metrics,omitempty"` + Behavior *HorizontalPodAutoscalerBehaviorApplyConfiguration `json:"behavior,omitempty"` +} + +// HorizontalPodAutoscalerSpecApplyConfiguration constructs an declarative configuration of the HorizontalPodAutoscalerSpec type for use with +// apply. +func HorizontalPodAutoscalerSpec() *HorizontalPodAutoscalerSpecApplyConfiguration { + return &HorizontalPodAutoscalerSpecApplyConfiguration{} +} + +// WithScaleTargetRef sets the ScaleTargetRef field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ScaleTargetRef field is set to the value of the last call. +func (b *HorizontalPodAutoscalerSpecApplyConfiguration) WithScaleTargetRef(value *CrossVersionObjectReferenceApplyConfiguration) *HorizontalPodAutoscalerSpecApplyConfiguration { + b.ScaleTargetRef = value + return b +} + +// WithMinReplicas sets the MinReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MinReplicas field is set to the value of the last call. +func (b *HorizontalPodAutoscalerSpecApplyConfiguration) WithMinReplicas(value int32) *HorizontalPodAutoscalerSpecApplyConfiguration { + b.MinReplicas = &value + return b +} + +// WithMaxReplicas sets the MaxReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MaxReplicas field is set to the value of the last call. +func (b *HorizontalPodAutoscalerSpecApplyConfiguration) WithMaxReplicas(value int32) *HorizontalPodAutoscalerSpecApplyConfiguration { + b.MaxReplicas = &value + return b +} + +// WithMetrics adds the given value to the Metrics field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Metrics field. +func (b *HorizontalPodAutoscalerSpecApplyConfiguration) WithMetrics(values ...*MetricSpecApplyConfiguration) *HorizontalPodAutoscalerSpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithMetrics") + } + b.Metrics = append(b.Metrics, *values[i]) + } + return b +} + +// WithBehavior sets the Behavior field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Behavior field is set to the value of the last call. +func (b *HorizontalPodAutoscalerSpecApplyConfiguration) WithBehavior(value *HorizontalPodAutoscalerBehaviorApplyConfiguration) *HorizontalPodAutoscalerSpecApplyConfiguration { + b.Behavior = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/horizontalpodautoscalerstatus.go b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/horizontalpodautoscalerstatus.go new file mode 100644 index 000000000000..881a874e51d6 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/horizontalpodautoscalerstatus.go @@ -0,0 +1,98 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v2beta2 + +import ( + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// HorizontalPodAutoscalerStatusApplyConfiguration represents an declarative configuration of the HorizontalPodAutoscalerStatus type for use +// with apply. +type HorizontalPodAutoscalerStatusApplyConfiguration struct { + ObservedGeneration *int64 `json:"observedGeneration,omitempty"` + LastScaleTime *v1.Time `json:"lastScaleTime,omitempty"` + CurrentReplicas *int32 `json:"currentReplicas,omitempty"` + DesiredReplicas *int32 `json:"desiredReplicas,omitempty"` + CurrentMetrics []MetricStatusApplyConfiguration `json:"currentMetrics,omitempty"` + Conditions []HorizontalPodAutoscalerConditionApplyConfiguration `json:"conditions,omitempty"` +} + +// HorizontalPodAutoscalerStatusApplyConfiguration constructs an declarative configuration of the HorizontalPodAutoscalerStatus type for use with +// apply. +func HorizontalPodAutoscalerStatus() *HorizontalPodAutoscalerStatusApplyConfiguration { + return &HorizontalPodAutoscalerStatusApplyConfiguration{} +} + +// WithObservedGeneration sets the ObservedGeneration field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ObservedGeneration field is set to the value of the last call. +func (b *HorizontalPodAutoscalerStatusApplyConfiguration) WithObservedGeneration(value int64) *HorizontalPodAutoscalerStatusApplyConfiguration { + b.ObservedGeneration = &value + return b +} + +// WithLastScaleTime sets the LastScaleTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastScaleTime field is set to the value of the last call. +func (b *HorizontalPodAutoscalerStatusApplyConfiguration) WithLastScaleTime(value v1.Time) *HorizontalPodAutoscalerStatusApplyConfiguration { + b.LastScaleTime = &value + return b +} + +// WithCurrentReplicas sets the CurrentReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CurrentReplicas field is set to the value of the last call. +func (b *HorizontalPodAutoscalerStatusApplyConfiguration) WithCurrentReplicas(value int32) *HorizontalPodAutoscalerStatusApplyConfiguration { + b.CurrentReplicas = &value + return b +} + +// WithDesiredReplicas sets the DesiredReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DesiredReplicas field is set to the value of the last call. +func (b *HorizontalPodAutoscalerStatusApplyConfiguration) WithDesiredReplicas(value int32) *HorizontalPodAutoscalerStatusApplyConfiguration { + b.DesiredReplicas = &value + return b +} + +// WithCurrentMetrics adds the given value to the CurrentMetrics field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the CurrentMetrics field. +func (b *HorizontalPodAutoscalerStatusApplyConfiguration) WithCurrentMetrics(values ...*MetricStatusApplyConfiguration) *HorizontalPodAutoscalerStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithCurrentMetrics") + } + b.CurrentMetrics = append(b.CurrentMetrics, *values[i]) + } + return b +} + +// WithConditions adds the given value to the Conditions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Conditions field. +func (b *HorizontalPodAutoscalerStatusApplyConfiguration) WithConditions(values ...*HorizontalPodAutoscalerConditionApplyConfiguration) *HorizontalPodAutoscalerStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithConditions") + } + b.Conditions = append(b.Conditions, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/hpascalingpolicy.go b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/hpascalingpolicy.go new file mode 100644 index 000000000000..2a535891affb --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/hpascalingpolicy.go @@ -0,0 +1,61 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v2beta2 + +import ( + v2beta2 "k8s.io/api/autoscaling/v2beta2" +) + +// HPAScalingPolicyApplyConfiguration represents an declarative configuration of the HPAScalingPolicy type for use +// with apply. +type HPAScalingPolicyApplyConfiguration struct { + Type *v2beta2.HPAScalingPolicyType `json:"type,omitempty"` + Value *int32 `json:"value,omitempty"` + PeriodSeconds *int32 `json:"periodSeconds,omitempty"` +} + +// HPAScalingPolicyApplyConfiguration constructs an declarative configuration of the HPAScalingPolicy type for use with +// apply. +func HPAScalingPolicy() *HPAScalingPolicyApplyConfiguration { + return &HPAScalingPolicyApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *HPAScalingPolicyApplyConfiguration) WithType(value v2beta2.HPAScalingPolicyType) *HPAScalingPolicyApplyConfiguration { + b.Type = &value + return b +} + +// WithValue sets the Value field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Value field is set to the value of the last call. +func (b *HPAScalingPolicyApplyConfiguration) WithValue(value int32) *HPAScalingPolicyApplyConfiguration { + b.Value = &value + return b +} + +// WithPeriodSeconds sets the PeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PeriodSeconds field is set to the value of the last call. +func (b *HPAScalingPolicyApplyConfiguration) WithPeriodSeconds(value int32) *HPAScalingPolicyApplyConfiguration { + b.PeriodSeconds = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/hpascalingrules.go b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/hpascalingrules.go new file mode 100644 index 000000000000..57c917b89486 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/hpascalingrules.go @@ -0,0 +1,66 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v2beta2 + +import ( + v2beta2 "k8s.io/api/autoscaling/v2beta2" +) + +// HPAScalingRulesApplyConfiguration represents an declarative configuration of the HPAScalingRules type for use +// with apply. +type HPAScalingRulesApplyConfiguration struct { + StabilizationWindowSeconds *int32 `json:"stabilizationWindowSeconds,omitempty"` + SelectPolicy *v2beta2.ScalingPolicySelect `json:"selectPolicy,omitempty"` + Policies []HPAScalingPolicyApplyConfiguration `json:"policies,omitempty"` +} + +// HPAScalingRulesApplyConfiguration constructs an declarative configuration of the HPAScalingRules type for use with +// apply. +func HPAScalingRules() *HPAScalingRulesApplyConfiguration { + return &HPAScalingRulesApplyConfiguration{} +} + +// WithStabilizationWindowSeconds sets the StabilizationWindowSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the StabilizationWindowSeconds field is set to the value of the last call. +func (b *HPAScalingRulesApplyConfiguration) WithStabilizationWindowSeconds(value int32) *HPAScalingRulesApplyConfiguration { + b.StabilizationWindowSeconds = &value + return b +} + +// WithSelectPolicy sets the SelectPolicy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelectPolicy field is set to the value of the last call. +func (b *HPAScalingRulesApplyConfiguration) WithSelectPolicy(value v2beta2.ScalingPolicySelect) *HPAScalingRulesApplyConfiguration { + b.SelectPolicy = &value + return b +} + +// WithPolicies adds the given value to the Policies field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Policies field. +func (b *HPAScalingRulesApplyConfiguration) WithPolicies(values ...*HPAScalingPolicyApplyConfiguration) *HPAScalingRulesApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithPolicies") + } + b.Policies = append(b.Policies, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/metricidentifier.go b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/metricidentifier.go new file mode 100644 index 000000000000..70cbd4e8154a --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/metricidentifier.go @@ -0,0 +1,52 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v2beta2 + +import ( + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// MetricIdentifierApplyConfiguration represents an declarative configuration of the MetricIdentifier type for use +// with apply. +type MetricIdentifierApplyConfiguration struct { + Name *string `json:"name,omitempty"` + Selector *v1.LabelSelectorApplyConfiguration `json:"selector,omitempty"` +} + +// MetricIdentifierApplyConfiguration constructs an declarative configuration of the MetricIdentifier type for use with +// apply. +func MetricIdentifier() *MetricIdentifierApplyConfiguration { + return &MetricIdentifierApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *MetricIdentifierApplyConfiguration) WithName(value string) *MetricIdentifierApplyConfiguration { + b.Name = &value + return b +} + +// WithSelector sets the Selector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Selector field is set to the value of the last call. +func (b *MetricIdentifierApplyConfiguration) WithSelector(value *v1.LabelSelectorApplyConfiguration) *MetricIdentifierApplyConfiguration { + b.Selector = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/metricspec.go b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/metricspec.go new file mode 100644 index 000000000000..1e7ee1419de9 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/metricspec.go @@ -0,0 +1,88 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v2beta2 + +import ( + v2beta2 "k8s.io/api/autoscaling/v2beta2" +) + +// MetricSpecApplyConfiguration represents an declarative configuration of the MetricSpec type for use +// with apply. +type MetricSpecApplyConfiguration struct { + Type *v2beta2.MetricSourceType `json:"type,omitempty"` + Object *ObjectMetricSourceApplyConfiguration `json:"object,omitempty"` + Pods *PodsMetricSourceApplyConfiguration `json:"pods,omitempty"` + Resource *ResourceMetricSourceApplyConfiguration `json:"resource,omitempty"` + ContainerResource *ContainerResourceMetricSourceApplyConfiguration `json:"containerResource,omitempty"` + External *ExternalMetricSourceApplyConfiguration `json:"external,omitempty"` +} + +// MetricSpecApplyConfiguration constructs an declarative configuration of the MetricSpec type for use with +// apply. +func MetricSpec() *MetricSpecApplyConfiguration { + return &MetricSpecApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *MetricSpecApplyConfiguration) WithType(value v2beta2.MetricSourceType) *MetricSpecApplyConfiguration { + b.Type = &value + return b +} + +// WithObject sets the Object field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Object field is set to the value of the last call. +func (b *MetricSpecApplyConfiguration) WithObject(value *ObjectMetricSourceApplyConfiguration) *MetricSpecApplyConfiguration { + b.Object = value + return b +} + +// WithPods sets the Pods field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Pods field is set to the value of the last call. +func (b *MetricSpecApplyConfiguration) WithPods(value *PodsMetricSourceApplyConfiguration) *MetricSpecApplyConfiguration { + b.Pods = value + return b +} + +// WithResource sets the Resource field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Resource field is set to the value of the last call. +func (b *MetricSpecApplyConfiguration) WithResource(value *ResourceMetricSourceApplyConfiguration) *MetricSpecApplyConfiguration { + b.Resource = value + return b +} + +// WithContainerResource sets the ContainerResource field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ContainerResource field is set to the value of the last call. +func (b *MetricSpecApplyConfiguration) WithContainerResource(value *ContainerResourceMetricSourceApplyConfiguration) *MetricSpecApplyConfiguration { + b.ContainerResource = value + return b +} + +// WithExternal sets the External field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the External field is set to the value of the last call. +func (b *MetricSpecApplyConfiguration) WithExternal(value *ExternalMetricSourceApplyConfiguration) *MetricSpecApplyConfiguration { + b.External = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/metricstatus.go b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/metricstatus.go new file mode 100644 index 000000000000..353ec6d943e5 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/metricstatus.go @@ -0,0 +1,88 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v2beta2 + +import ( + v2beta2 "k8s.io/api/autoscaling/v2beta2" +) + +// MetricStatusApplyConfiguration represents an declarative configuration of the MetricStatus type for use +// with apply. +type MetricStatusApplyConfiguration struct { + Type *v2beta2.MetricSourceType `json:"type,omitempty"` + Object *ObjectMetricStatusApplyConfiguration `json:"object,omitempty"` + Pods *PodsMetricStatusApplyConfiguration `json:"pods,omitempty"` + Resource *ResourceMetricStatusApplyConfiguration `json:"resource,omitempty"` + ContainerResource *ContainerResourceMetricStatusApplyConfiguration `json:"containerResource,omitempty"` + External *ExternalMetricStatusApplyConfiguration `json:"external,omitempty"` +} + +// MetricStatusApplyConfiguration constructs an declarative configuration of the MetricStatus type for use with +// apply. +func MetricStatus() *MetricStatusApplyConfiguration { + return &MetricStatusApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *MetricStatusApplyConfiguration) WithType(value v2beta2.MetricSourceType) *MetricStatusApplyConfiguration { + b.Type = &value + return b +} + +// WithObject sets the Object field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Object field is set to the value of the last call. +func (b *MetricStatusApplyConfiguration) WithObject(value *ObjectMetricStatusApplyConfiguration) *MetricStatusApplyConfiguration { + b.Object = value + return b +} + +// WithPods sets the Pods field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Pods field is set to the value of the last call. +func (b *MetricStatusApplyConfiguration) WithPods(value *PodsMetricStatusApplyConfiguration) *MetricStatusApplyConfiguration { + b.Pods = value + return b +} + +// WithResource sets the Resource field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Resource field is set to the value of the last call. +func (b *MetricStatusApplyConfiguration) WithResource(value *ResourceMetricStatusApplyConfiguration) *MetricStatusApplyConfiguration { + b.Resource = value + return b +} + +// WithContainerResource sets the ContainerResource field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ContainerResource field is set to the value of the last call. +func (b *MetricStatusApplyConfiguration) WithContainerResource(value *ContainerResourceMetricStatusApplyConfiguration) *MetricStatusApplyConfiguration { + b.ContainerResource = value + return b +} + +// WithExternal sets the External field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the External field is set to the value of the last call. +func (b *MetricStatusApplyConfiguration) WithExternal(value *ExternalMetricStatusApplyConfiguration) *MetricStatusApplyConfiguration { + b.External = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/metrictarget.go b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/metrictarget.go new file mode 100644 index 000000000000..fbf006a5a616 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/metrictarget.go @@ -0,0 +1,71 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v2beta2 + +import ( + v2beta2 "k8s.io/api/autoscaling/v2beta2" + resource "k8s.io/apimachinery/pkg/api/resource" +) + +// MetricTargetApplyConfiguration represents an declarative configuration of the MetricTarget type for use +// with apply. +type MetricTargetApplyConfiguration struct { + Type *v2beta2.MetricTargetType `json:"type,omitempty"` + Value *resource.Quantity `json:"value,omitempty"` + AverageValue *resource.Quantity `json:"averageValue,omitempty"` + AverageUtilization *int32 `json:"averageUtilization,omitempty"` +} + +// MetricTargetApplyConfiguration constructs an declarative configuration of the MetricTarget type for use with +// apply. +func MetricTarget() *MetricTargetApplyConfiguration { + return &MetricTargetApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *MetricTargetApplyConfiguration) WithType(value v2beta2.MetricTargetType) *MetricTargetApplyConfiguration { + b.Type = &value + return b +} + +// WithValue sets the Value field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Value field is set to the value of the last call. +func (b *MetricTargetApplyConfiguration) WithValue(value resource.Quantity) *MetricTargetApplyConfiguration { + b.Value = &value + return b +} + +// WithAverageValue sets the AverageValue field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AverageValue field is set to the value of the last call. +func (b *MetricTargetApplyConfiguration) WithAverageValue(value resource.Quantity) *MetricTargetApplyConfiguration { + b.AverageValue = &value + return b +} + +// WithAverageUtilization sets the AverageUtilization field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AverageUtilization field is set to the value of the last call. +func (b *MetricTargetApplyConfiguration) WithAverageUtilization(value int32) *MetricTargetApplyConfiguration { + b.AverageUtilization = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/metricvaluestatus.go b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/metricvaluestatus.go new file mode 100644 index 000000000000..5796a0b4c17e --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/metricvaluestatus.go @@ -0,0 +1,61 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v2beta2 + +import ( + resource "k8s.io/apimachinery/pkg/api/resource" +) + +// MetricValueStatusApplyConfiguration represents an declarative configuration of the MetricValueStatus type for use +// with apply. +type MetricValueStatusApplyConfiguration struct { + Value *resource.Quantity `json:"value,omitempty"` + AverageValue *resource.Quantity `json:"averageValue,omitempty"` + AverageUtilization *int32 `json:"averageUtilization,omitempty"` +} + +// MetricValueStatusApplyConfiguration constructs an declarative configuration of the MetricValueStatus type for use with +// apply. +func MetricValueStatus() *MetricValueStatusApplyConfiguration { + return &MetricValueStatusApplyConfiguration{} +} + +// WithValue sets the Value field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Value field is set to the value of the last call. +func (b *MetricValueStatusApplyConfiguration) WithValue(value resource.Quantity) *MetricValueStatusApplyConfiguration { + b.Value = &value + return b +} + +// WithAverageValue sets the AverageValue field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AverageValue field is set to the value of the last call. +func (b *MetricValueStatusApplyConfiguration) WithAverageValue(value resource.Quantity) *MetricValueStatusApplyConfiguration { + b.AverageValue = &value + return b +} + +// WithAverageUtilization sets the AverageUtilization field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AverageUtilization field is set to the value of the last call. +func (b *MetricValueStatusApplyConfiguration) WithAverageUtilization(value int32) *MetricValueStatusApplyConfiguration { + b.AverageUtilization = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/objectmetricsource.go b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/objectmetricsource.go new file mode 100644 index 000000000000..eed31dab6190 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/objectmetricsource.go @@ -0,0 +1,57 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v2beta2 + +// ObjectMetricSourceApplyConfiguration represents an declarative configuration of the ObjectMetricSource type for use +// with apply. +type ObjectMetricSourceApplyConfiguration struct { + DescribedObject *CrossVersionObjectReferenceApplyConfiguration `json:"describedObject,omitempty"` + Target *MetricTargetApplyConfiguration `json:"target,omitempty"` + Metric *MetricIdentifierApplyConfiguration `json:"metric,omitempty"` +} + +// ObjectMetricSourceApplyConfiguration constructs an declarative configuration of the ObjectMetricSource type for use with +// apply. +func ObjectMetricSource() *ObjectMetricSourceApplyConfiguration { + return &ObjectMetricSourceApplyConfiguration{} +} + +// WithDescribedObject sets the DescribedObject field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DescribedObject field is set to the value of the last call. +func (b *ObjectMetricSourceApplyConfiguration) WithDescribedObject(value *CrossVersionObjectReferenceApplyConfiguration) *ObjectMetricSourceApplyConfiguration { + b.DescribedObject = value + return b +} + +// WithTarget sets the Target field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Target field is set to the value of the last call. +func (b *ObjectMetricSourceApplyConfiguration) WithTarget(value *MetricTargetApplyConfiguration) *ObjectMetricSourceApplyConfiguration { + b.Target = value + return b +} + +// WithMetric sets the Metric field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Metric field is set to the value of the last call. +func (b *ObjectMetricSourceApplyConfiguration) WithMetric(value *MetricIdentifierApplyConfiguration) *ObjectMetricSourceApplyConfiguration { + b.Metric = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/objectmetricstatus.go b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/objectmetricstatus.go new file mode 100644 index 000000000000..175e2120d602 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/objectmetricstatus.go @@ -0,0 +1,57 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v2beta2 + +// ObjectMetricStatusApplyConfiguration represents an declarative configuration of the ObjectMetricStatus type for use +// with apply. +type ObjectMetricStatusApplyConfiguration struct { + Metric *MetricIdentifierApplyConfiguration `json:"metric,omitempty"` + Current *MetricValueStatusApplyConfiguration `json:"current,omitempty"` + DescribedObject *CrossVersionObjectReferenceApplyConfiguration `json:"describedObject,omitempty"` +} + +// ObjectMetricStatusApplyConfiguration constructs an declarative configuration of the ObjectMetricStatus type for use with +// apply. +func ObjectMetricStatus() *ObjectMetricStatusApplyConfiguration { + return &ObjectMetricStatusApplyConfiguration{} +} + +// WithMetric sets the Metric field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Metric field is set to the value of the last call. +func (b *ObjectMetricStatusApplyConfiguration) WithMetric(value *MetricIdentifierApplyConfiguration) *ObjectMetricStatusApplyConfiguration { + b.Metric = value + return b +} + +// WithCurrent sets the Current field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Current field is set to the value of the last call. +func (b *ObjectMetricStatusApplyConfiguration) WithCurrent(value *MetricValueStatusApplyConfiguration) *ObjectMetricStatusApplyConfiguration { + b.Current = value + return b +} + +// WithDescribedObject sets the DescribedObject field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DescribedObject field is set to the value of the last call. +func (b *ObjectMetricStatusApplyConfiguration) WithDescribedObject(value *CrossVersionObjectReferenceApplyConfiguration) *ObjectMetricStatusApplyConfiguration { + b.DescribedObject = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/podsmetricsource.go b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/podsmetricsource.go new file mode 100644 index 000000000000..0365880950f3 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/podsmetricsource.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v2beta2 + +// PodsMetricSourceApplyConfiguration represents an declarative configuration of the PodsMetricSource type for use +// with apply. +type PodsMetricSourceApplyConfiguration struct { + Metric *MetricIdentifierApplyConfiguration `json:"metric,omitempty"` + Target *MetricTargetApplyConfiguration `json:"target,omitempty"` +} + +// PodsMetricSourceApplyConfiguration constructs an declarative configuration of the PodsMetricSource type for use with +// apply. +func PodsMetricSource() *PodsMetricSourceApplyConfiguration { + return &PodsMetricSourceApplyConfiguration{} +} + +// WithMetric sets the Metric field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Metric field is set to the value of the last call. +func (b *PodsMetricSourceApplyConfiguration) WithMetric(value *MetricIdentifierApplyConfiguration) *PodsMetricSourceApplyConfiguration { + b.Metric = value + return b +} + +// WithTarget sets the Target field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Target field is set to the value of the last call. +func (b *PodsMetricSourceApplyConfiguration) WithTarget(value *MetricTargetApplyConfiguration) *PodsMetricSourceApplyConfiguration { + b.Target = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/podsmetricstatus.go b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/podsmetricstatus.go new file mode 100644 index 000000000000..e6f98be8c45b --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/podsmetricstatus.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v2beta2 + +// PodsMetricStatusApplyConfiguration represents an declarative configuration of the PodsMetricStatus type for use +// with apply. +type PodsMetricStatusApplyConfiguration struct { + Metric *MetricIdentifierApplyConfiguration `json:"metric,omitempty"` + Current *MetricValueStatusApplyConfiguration `json:"current,omitempty"` +} + +// PodsMetricStatusApplyConfiguration constructs an declarative configuration of the PodsMetricStatus type for use with +// apply. +func PodsMetricStatus() *PodsMetricStatusApplyConfiguration { + return &PodsMetricStatusApplyConfiguration{} +} + +// WithMetric sets the Metric field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Metric field is set to the value of the last call. +func (b *PodsMetricStatusApplyConfiguration) WithMetric(value *MetricIdentifierApplyConfiguration) *PodsMetricStatusApplyConfiguration { + b.Metric = value + return b +} + +// WithCurrent sets the Current field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Current field is set to the value of the last call. +func (b *PodsMetricStatusApplyConfiguration) WithCurrent(value *MetricValueStatusApplyConfiguration) *PodsMetricStatusApplyConfiguration { + b.Current = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/resourcemetricsource.go b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/resourcemetricsource.go new file mode 100644 index 000000000000..cc8118d5e322 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/resourcemetricsource.go @@ -0,0 +1,52 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v2beta2 + +import ( + v1 "k8s.io/api/core/v1" +) + +// ResourceMetricSourceApplyConfiguration represents an declarative configuration of the ResourceMetricSource type for use +// with apply. +type ResourceMetricSourceApplyConfiguration struct { + Name *v1.ResourceName `json:"name,omitempty"` + Target *MetricTargetApplyConfiguration `json:"target,omitempty"` +} + +// ResourceMetricSourceApplyConfiguration constructs an declarative configuration of the ResourceMetricSource type for use with +// apply. +func ResourceMetricSource() *ResourceMetricSourceApplyConfiguration { + return &ResourceMetricSourceApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ResourceMetricSourceApplyConfiguration) WithName(value v1.ResourceName) *ResourceMetricSourceApplyConfiguration { + b.Name = &value + return b +} + +// WithTarget sets the Target field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Target field is set to the value of the last call. +func (b *ResourceMetricSourceApplyConfiguration) WithTarget(value *MetricTargetApplyConfiguration) *ResourceMetricSourceApplyConfiguration { + b.Target = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/resourcemetricstatus.go b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/resourcemetricstatus.go new file mode 100644 index 000000000000..0ab56be0f79d --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2beta2/resourcemetricstatus.go @@ -0,0 +1,52 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v2beta2 + +import ( + v1 "k8s.io/api/core/v1" +) + +// ResourceMetricStatusApplyConfiguration represents an declarative configuration of the ResourceMetricStatus type for use +// with apply. +type ResourceMetricStatusApplyConfiguration struct { + Name *v1.ResourceName `json:"name,omitempty"` + Current *MetricValueStatusApplyConfiguration `json:"current,omitempty"` +} + +// ResourceMetricStatusApplyConfiguration constructs an declarative configuration of the ResourceMetricStatus type for use with +// apply. +func ResourceMetricStatus() *ResourceMetricStatusApplyConfiguration { + return &ResourceMetricStatusApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ResourceMetricStatusApplyConfiguration) WithName(value v1.ResourceName) *ResourceMetricStatusApplyConfiguration { + b.Name = &value + return b +} + +// WithCurrent sets the Current field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Current field is set to the value of the last call. +func (b *ResourceMetricStatusApplyConfiguration) WithCurrent(value *MetricValueStatusApplyConfiguration) *ResourceMetricStatusApplyConfiguration { + b.Current = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/batch/v1/cronjob.go b/vendor/k8s.io/client-go/applyconfigurations/batch/v1/cronjob.go new file mode 100644 index 000000000000..af38708a0a7a --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/batch/v1/cronjob.go @@ -0,0 +1,265 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + apibatchv1 "k8s.io/api/batch/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// CronJobApplyConfiguration represents an declarative configuration of the CronJob type for use +// with apply. +type CronJobApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *CronJobSpecApplyConfiguration `json:"spec,omitempty"` + Status *CronJobStatusApplyConfiguration `json:"status,omitempty"` +} + +// CronJob constructs an declarative configuration of the CronJob type for use with +// apply. +func CronJob(name, namespace string) *CronJobApplyConfiguration { + b := &CronJobApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("CronJob") + b.WithAPIVersion("batch/v1") + return b +} + +// ExtractCronJob extracts the applied configuration owned by fieldManager from +// cronJob. If no managedFields are found in cronJob for fieldManager, a +// CronJobApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// cronJob must be a unmodified CronJob API object that was retrieved from the Kubernetes API. +// ExtractCronJob provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractCronJob(cronJob *apibatchv1.CronJob, fieldManager string) (*CronJobApplyConfiguration, error) { + b := &CronJobApplyConfiguration{} + err := managedfields.ExtractInto(cronJob, internal.Parser().Type("io.k8s.api.batch.v1.CronJob"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(cronJob.Name) + b.WithNamespace(cronJob.Namespace) + + b.WithKind("CronJob") + b.WithAPIVersion("batch/v1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *CronJobApplyConfiguration) WithKind(value string) *CronJobApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *CronJobApplyConfiguration) WithAPIVersion(value string) *CronJobApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *CronJobApplyConfiguration) WithName(value string) *CronJobApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *CronJobApplyConfiguration) WithGenerateName(value string) *CronJobApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *CronJobApplyConfiguration) WithNamespace(value string) *CronJobApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *CronJobApplyConfiguration) WithSelfLink(value string) *CronJobApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *CronJobApplyConfiguration) WithUID(value types.UID) *CronJobApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *CronJobApplyConfiguration) WithResourceVersion(value string) *CronJobApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *CronJobApplyConfiguration) WithGeneration(value int64) *CronJobApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *CronJobApplyConfiguration) WithCreationTimestamp(value metav1.Time) *CronJobApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *CronJobApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *CronJobApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *CronJobApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *CronJobApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *CronJobApplyConfiguration) WithLabels(entries map[string]string) *CronJobApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *CronJobApplyConfiguration) WithAnnotations(entries map[string]string) *CronJobApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *CronJobApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *CronJobApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *CronJobApplyConfiguration) WithFinalizers(values ...string) *CronJobApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *CronJobApplyConfiguration) WithClusterName(value string) *CronJobApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *CronJobApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *CronJobApplyConfiguration) WithSpec(value *CronJobSpecApplyConfiguration) *CronJobApplyConfiguration { + b.Spec = value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *CronJobApplyConfiguration) WithStatus(value *CronJobStatusApplyConfiguration) *CronJobApplyConfiguration { + b.Status = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/batch/v1/cronjobspec.go b/vendor/k8s.io/client-go/applyconfigurations/batch/v1/cronjobspec.go new file mode 100644 index 000000000000..eaf3ba8e65ee --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/batch/v1/cronjobspec.go @@ -0,0 +1,97 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/batch/v1" +) + +// CronJobSpecApplyConfiguration represents an declarative configuration of the CronJobSpec type for use +// with apply. +type CronJobSpecApplyConfiguration struct { + Schedule *string `json:"schedule,omitempty"` + StartingDeadlineSeconds *int64 `json:"startingDeadlineSeconds,omitempty"` + ConcurrencyPolicy *v1.ConcurrencyPolicy `json:"concurrencyPolicy,omitempty"` + Suspend *bool `json:"suspend,omitempty"` + JobTemplate *JobTemplateSpecApplyConfiguration `json:"jobTemplate,omitempty"` + SuccessfulJobsHistoryLimit *int32 `json:"successfulJobsHistoryLimit,omitempty"` + FailedJobsHistoryLimit *int32 `json:"failedJobsHistoryLimit,omitempty"` +} + +// CronJobSpecApplyConfiguration constructs an declarative configuration of the CronJobSpec type for use with +// apply. +func CronJobSpec() *CronJobSpecApplyConfiguration { + return &CronJobSpecApplyConfiguration{} +} + +// WithSchedule sets the Schedule field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Schedule field is set to the value of the last call. +func (b *CronJobSpecApplyConfiguration) WithSchedule(value string) *CronJobSpecApplyConfiguration { + b.Schedule = &value + return b +} + +// WithStartingDeadlineSeconds sets the StartingDeadlineSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the StartingDeadlineSeconds field is set to the value of the last call. +func (b *CronJobSpecApplyConfiguration) WithStartingDeadlineSeconds(value int64) *CronJobSpecApplyConfiguration { + b.StartingDeadlineSeconds = &value + return b +} + +// WithConcurrencyPolicy sets the ConcurrencyPolicy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ConcurrencyPolicy field is set to the value of the last call. +func (b *CronJobSpecApplyConfiguration) WithConcurrencyPolicy(value v1.ConcurrencyPolicy) *CronJobSpecApplyConfiguration { + b.ConcurrencyPolicy = &value + return b +} + +// WithSuspend sets the Suspend field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Suspend field is set to the value of the last call. +func (b *CronJobSpecApplyConfiguration) WithSuspend(value bool) *CronJobSpecApplyConfiguration { + b.Suspend = &value + return b +} + +// WithJobTemplate sets the JobTemplate field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the JobTemplate field is set to the value of the last call. +func (b *CronJobSpecApplyConfiguration) WithJobTemplate(value *JobTemplateSpecApplyConfiguration) *CronJobSpecApplyConfiguration { + b.JobTemplate = value + return b +} + +// WithSuccessfulJobsHistoryLimit sets the SuccessfulJobsHistoryLimit field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SuccessfulJobsHistoryLimit field is set to the value of the last call. +func (b *CronJobSpecApplyConfiguration) WithSuccessfulJobsHistoryLimit(value int32) *CronJobSpecApplyConfiguration { + b.SuccessfulJobsHistoryLimit = &value + return b +} + +// WithFailedJobsHistoryLimit sets the FailedJobsHistoryLimit field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FailedJobsHistoryLimit field is set to the value of the last call. +func (b *CronJobSpecApplyConfiguration) WithFailedJobsHistoryLimit(value int32) *CronJobSpecApplyConfiguration { + b.FailedJobsHistoryLimit = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/batch/v1/cronjobstatus.go b/vendor/k8s.io/client-go/applyconfigurations/batch/v1/cronjobstatus.go new file mode 100644 index 000000000000..b7cc2bdfb570 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/batch/v1/cronjobstatus.go @@ -0,0 +1,67 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + v1 "k8s.io/client-go/applyconfigurations/core/v1" +) + +// CronJobStatusApplyConfiguration represents an declarative configuration of the CronJobStatus type for use +// with apply. +type CronJobStatusApplyConfiguration struct { + Active []v1.ObjectReferenceApplyConfiguration `json:"active,omitempty"` + LastScheduleTime *metav1.Time `json:"lastScheduleTime,omitempty"` + LastSuccessfulTime *metav1.Time `json:"lastSuccessfulTime,omitempty"` +} + +// CronJobStatusApplyConfiguration constructs an declarative configuration of the CronJobStatus type for use with +// apply. +func CronJobStatus() *CronJobStatusApplyConfiguration { + return &CronJobStatusApplyConfiguration{} +} + +// WithActive adds the given value to the Active field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Active field. +func (b *CronJobStatusApplyConfiguration) WithActive(values ...*v1.ObjectReferenceApplyConfiguration) *CronJobStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithActive") + } + b.Active = append(b.Active, *values[i]) + } + return b +} + +// WithLastScheduleTime sets the LastScheduleTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastScheduleTime field is set to the value of the last call. +func (b *CronJobStatusApplyConfiguration) WithLastScheduleTime(value metav1.Time) *CronJobStatusApplyConfiguration { + b.LastScheduleTime = &value + return b +} + +// WithLastSuccessfulTime sets the LastSuccessfulTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastSuccessfulTime field is set to the value of the last call. +func (b *CronJobStatusApplyConfiguration) WithLastSuccessfulTime(value metav1.Time) *CronJobStatusApplyConfiguration { + b.LastSuccessfulTime = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/batch/v1/job.go b/vendor/k8s.io/client-go/applyconfigurations/batch/v1/job.go new file mode 100644 index 000000000000..0c9bcdb75152 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/batch/v1/job.go @@ -0,0 +1,265 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + apibatchv1 "k8s.io/api/batch/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// JobApplyConfiguration represents an declarative configuration of the Job type for use +// with apply. +type JobApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *JobSpecApplyConfiguration `json:"spec,omitempty"` + Status *JobStatusApplyConfiguration `json:"status,omitempty"` +} + +// Job constructs an declarative configuration of the Job type for use with +// apply. +func Job(name, namespace string) *JobApplyConfiguration { + b := &JobApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("Job") + b.WithAPIVersion("batch/v1") + return b +} + +// ExtractJob extracts the applied configuration owned by fieldManager from +// job. If no managedFields are found in job for fieldManager, a +// JobApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// job must be a unmodified Job API object that was retrieved from the Kubernetes API. +// ExtractJob provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractJob(job *apibatchv1.Job, fieldManager string) (*JobApplyConfiguration, error) { + b := &JobApplyConfiguration{} + err := managedfields.ExtractInto(job, internal.Parser().Type("io.k8s.api.batch.v1.Job"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(job.Name) + b.WithNamespace(job.Namespace) + + b.WithKind("Job") + b.WithAPIVersion("batch/v1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *JobApplyConfiguration) WithKind(value string) *JobApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *JobApplyConfiguration) WithAPIVersion(value string) *JobApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *JobApplyConfiguration) WithName(value string) *JobApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *JobApplyConfiguration) WithGenerateName(value string) *JobApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *JobApplyConfiguration) WithNamespace(value string) *JobApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *JobApplyConfiguration) WithSelfLink(value string) *JobApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *JobApplyConfiguration) WithUID(value types.UID) *JobApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *JobApplyConfiguration) WithResourceVersion(value string) *JobApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *JobApplyConfiguration) WithGeneration(value int64) *JobApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *JobApplyConfiguration) WithCreationTimestamp(value metav1.Time) *JobApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *JobApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *JobApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *JobApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *JobApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *JobApplyConfiguration) WithLabels(entries map[string]string) *JobApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *JobApplyConfiguration) WithAnnotations(entries map[string]string) *JobApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *JobApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *JobApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *JobApplyConfiguration) WithFinalizers(values ...string) *JobApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *JobApplyConfiguration) WithClusterName(value string) *JobApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *JobApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *JobApplyConfiguration) WithSpec(value *JobSpecApplyConfiguration) *JobApplyConfiguration { + b.Spec = value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *JobApplyConfiguration) WithStatus(value *JobStatusApplyConfiguration) *JobApplyConfiguration { + b.Status = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/batch/v1/jobcondition.go b/vendor/k8s.io/client-go/applyconfigurations/batch/v1/jobcondition.go new file mode 100644 index 000000000000..388ca7a1c08e --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/batch/v1/jobcondition.go @@ -0,0 +1,90 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/batch/v1" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// JobConditionApplyConfiguration represents an declarative configuration of the JobCondition type for use +// with apply. +type JobConditionApplyConfiguration struct { + Type *v1.JobConditionType `json:"type,omitempty"` + Status *corev1.ConditionStatus `json:"status,omitempty"` + LastProbeTime *metav1.Time `json:"lastProbeTime,omitempty"` + LastTransitionTime *metav1.Time `json:"lastTransitionTime,omitempty"` + Reason *string `json:"reason,omitempty"` + Message *string `json:"message,omitempty"` +} + +// JobConditionApplyConfiguration constructs an declarative configuration of the JobCondition type for use with +// apply. +func JobCondition() *JobConditionApplyConfiguration { + return &JobConditionApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *JobConditionApplyConfiguration) WithType(value v1.JobConditionType) *JobConditionApplyConfiguration { + b.Type = &value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *JobConditionApplyConfiguration) WithStatus(value corev1.ConditionStatus) *JobConditionApplyConfiguration { + b.Status = &value + return b +} + +// WithLastProbeTime sets the LastProbeTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastProbeTime field is set to the value of the last call. +func (b *JobConditionApplyConfiguration) WithLastProbeTime(value metav1.Time) *JobConditionApplyConfiguration { + b.LastProbeTime = &value + return b +} + +// WithLastTransitionTime sets the LastTransitionTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastTransitionTime field is set to the value of the last call. +func (b *JobConditionApplyConfiguration) WithLastTransitionTime(value metav1.Time) *JobConditionApplyConfiguration { + b.LastTransitionTime = &value + return b +} + +// WithReason sets the Reason field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Reason field is set to the value of the last call. +func (b *JobConditionApplyConfiguration) WithReason(value string) *JobConditionApplyConfiguration { + b.Reason = &value + return b +} + +// WithMessage sets the Message field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Message field is set to the value of the last call. +func (b *JobConditionApplyConfiguration) WithMessage(value string) *JobConditionApplyConfiguration { + b.Message = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/batch/v1/jobspec.go b/vendor/k8s.io/client-go/applyconfigurations/batch/v1/jobspec.go new file mode 100644 index 000000000000..e1424488947d --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/batch/v1/jobspec.go @@ -0,0 +1,126 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + batchv1 "k8s.io/api/batch/v1" + corev1 "k8s.io/client-go/applyconfigurations/core/v1" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// JobSpecApplyConfiguration represents an declarative configuration of the JobSpec type for use +// with apply. +type JobSpecApplyConfiguration struct { + Parallelism *int32 `json:"parallelism,omitempty"` + Completions *int32 `json:"completions,omitempty"` + ActiveDeadlineSeconds *int64 `json:"activeDeadlineSeconds,omitempty"` + BackoffLimit *int32 `json:"backoffLimit,omitempty"` + Selector *v1.LabelSelectorApplyConfiguration `json:"selector,omitempty"` + ManualSelector *bool `json:"manualSelector,omitempty"` + Template *corev1.PodTemplateSpecApplyConfiguration `json:"template,omitempty"` + TTLSecondsAfterFinished *int32 `json:"ttlSecondsAfterFinished,omitempty"` + CompletionMode *batchv1.CompletionMode `json:"completionMode,omitempty"` + Suspend *bool `json:"suspend,omitempty"` +} + +// JobSpecApplyConfiguration constructs an declarative configuration of the JobSpec type for use with +// apply. +func JobSpec() *JobSpecApplyConfiguration { + return &JobSpecApplyConfiguration{} +} + +// WithParallelism sets the Parallelism field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Parallelism field is set to the value of the last call. +func (b *JobSpecApplyConfiguration) WithParallelism(value int32) *JobSpecApplyConfiguration { + b.Parallelism = &value + return b +} + +// WithCompletions sets the Completions field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Completions field is set to the value of the last call. +func (b *JobSpecApplyConfiguration) WithCompletions(value int32) *JobSpecApplyConfiguration { + b.Completions = &value + return b +} + +// WithActiveDeadlineSeconds sets the ActiveDeadlineSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ActiveDeadlineSeconds field is set to the value of the last call. +func (b *JobSpecApplyConfiguration) WithActiveDeadlineSeconds(value int64) *JobSpecApplyConfiguration { + b.ActiveDeadlineSeconds = &value + return b +} + +// WithBackoffLimit sets the BackoffLimit field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the BackoffLimit field is set to the value of the last call. +func (b *JobSpecApplyConfiguration) WithBackoffLimit(value int32) *JobSpecApplyConfiguration { + b.BackoffLimit = &value + return b +} + +// WithSelector sets the Selector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Selector field is set to the value of the last call. +func (b *JobSpecApplyConfiguration) WithSelector(value *v1.LabelSelectorApplyConfiguration) *JobSpecApplyConfiguration { + b.Selector = value + return b +} + +// WithManualSelector sets the ManualSelector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ManualSelector field is set to the value of the last call. +func (b *JobSpecApplyConfiguration) WithManualSelector(value bool) *JobSpecApplyConfiguration { + b.ManualSelector = &value + return b +} + +// WithTemplate sets the Template field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Template field is set to the value of the last call. +func (b *JobSpecApplyConfiguration) WithTemplate(value *corev1.PodTemplateSpecApplyConfiguration) *JobSpecApplyConfiguration { + b.Template = value + return b +} + +// WithTTLSecondsAfterFinished sets the TTLSecondsAfterFinished field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the TTLSecondsAfterFinished field is set to the value of the last call. +func (b *JobSpecApplyConfiguration) WithTTLSecondsAfterFinished(value int32) *JobSpecApplyConfiguration { + b.TTLSecondsAfterFinished = &value + return b +} + +// WithCompletionMode sets the CompletionMode field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CompletionMode field is set to the value of the last call. +func (b *JobSpecApplyConfiguration) WithCompletionMode(value batchv1.CompletionMode) *JobSpecApplyConfiguration { + b.CompletionMode = &value + return b +} + +// WithSuspend sets the Suspend field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Suspend field is set to the value of the last call. +func (b *JobSpecApplyConfiguration) WithSuspend(value bool) *JobSpecApplyConfiguration { + b.Suspend = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/batch/v1/jobstatus.go b/vendor/k8s.io/client-go/applyconfigurations/batch/v1/jobstatus.go new file mode 100644 index 000000000000..e59d49cf1aa6 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/batch/v1/jobstatus.go @@ -0,0 +1,102 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// JobStatusApplyConfiguration represents an declarative configuration of the JobStatus type for use +// with apply. +type JobStatusApplyConfiguration struct { + Conditions []JobConditionApplyConfiguration `json:"conditions,omitempty"` + StartTime *metav1.Time `json:"startTime,omitempty"` + CompletionTime *metav1.Time `json:"completionTime,omitempty"` + Active *int32 `json:"active,omitempty"` + Succeeded *int32 `json:"succeeded,omitempty"` + Failed *int32 `json:"failed,omitempty"` + CompletedIndexes *string `json:"completedIndexes,omitempty"` +} + +// JobStatusApplyConfiguration constructs an declarative configuration of the JobStatus type for use with +// apply. +func JobStatus() *JobStatusApplyConfiguration { + return &JobStatusApplyConfiguration{} +} + +// WithConditions adds the given value to the Conditions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Conditions field. +func (b *JobStatusApplyConfiguration) WithConditions(values ...*JobConditionApplyConfiguration) *JobStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithConditions") + } + b.Conditions = append(b.Conditions, *values[i]) + } + return b +} + +// WithStartTime sets the StartTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the StartTime field is set to the value of the last call. +func (b *JobStatusApplyConfiguration) WithStartTime(value metav1.Time) *JobStatusApplyConfiguration { + b.StartTime = &value + return b +} + +// WithCompletionTime sets the CompletionTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CompletionTime field is set to the value of the last call. +func (b *JobStatusApplyConfiguration) WithCompletionTime(value metav1.Time) *JobStatusApplyConfiguration { + b.CompletionTime = &value + return b +} + +// WithActive sets the Active field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Active field is set to the value of the last call. +func (b *JobStatusApplyConfiguration) WithActive(value int32) *JobStatusApplyConfiguration { + b.Active = &value + return b +} + +// WithSucceeded sets the Succeeded field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Succeeded field is set to the value of the last call. +func (b *JobStatusApplyConfiguration) WithSucceeded(value int32) *JobStatusApplyConfiguration { + b.Succeeded = &value + return b +} + +// WithFailed sets the Failed field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Failed field is set to the value of the last call. +func (b *JobStatusApplyConfiguration) WithFailed(value int32) *JobStatusApplyConfiguration { + b.Failed = &value + return b +} + +// WithCompletedIndexes sets the CompletedIndexes field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CompletedIndexes field is set to the value of the last call. +func (b *JobStatusApplyConfiguration) WithCompletedIndexes(value string) *JobStatusApplyConfiguration { + b.CompletedIndexes = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/batch/v1/jobtemplatespec.go b/vendor/k8s.io/client-go/applyconfigurations/batch/v1/jobtemplatespec.go new file mode 100644 index 000000000000..46df3722f106 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/batch/v1/jobtemplatespec.go @@ -0,0 +1,206 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// JobTemplateSpecApplyConfiguration represents an declarative configuration of the JobTemplateSpec type for use +// with apply. +type JobTemplateSpecApplyConfiguration struct { + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *JobSpecApplyConfiguration `json:"spec,omitempty"` +} + +// JobTemplateSpecApplyConfiguration constructs an declarative configuration of the JobTemplateSpec type for use with +// apply. +func JobTemplateSpec() *JobTemplateSpecApplyConfiguration { + return &JobTemplateSpecApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *JobTemplateSpecApplyConfiguration) WithName(value string) *JobTemplateSpecApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *JobTemplateSpecApplyConfiguration) WithGenerateName(value string) *JobTemplateSpecApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *JobTemplateSpecApplyConfiguration) WithNamespace(value string) *JobTemplateSpecApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *JobTemplateSpecApplyConfiguration) WithSelfLink(value string) *JobTemplateSpecApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *JobTemplateSpecApplyConfiguration) WithUID(value types.UID) *JobTemplateSpecApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *JobTemplateSpecApplyConfiguration) WithResourceVersion(value string) *JobTemplateSpecApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *JobTemplateSpecApplyConfiguration) WithGeneration(value int64) *JobTemplateSpecApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *JobTemplateSpecApplyConfiguration) WithCreationTimestamp(value metav1.Time) *JobTemplateSpecApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *JobTemplateSpecApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *JobTemplateSpecApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *JobTemplateSpecApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *JobTemplateSpecApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *JobTemplateSpecApplyConfiguration) WithLabels(entries map[string]string) *JobTemplateSpecApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *JobTemplateSpecApplyConfiguration) WithAnnotations(entries map[string]string) *JobTemplateSpecApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *JobTemplateSpecApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *JobTemplateSpecApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *JobTemplateSpecApplyConfiguration) WithFinalizers(values ...string) *JobTemplateSpecApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *JobTemplateSpecApplyConfiguration) WithClusterName(value string) *JobTemplateSpecApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *JobTemplateSpecApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *JobTemplateSpecApplyConfiguration) WithSpec(value *JobSpecApplyConfiguration) *JobTemplateSpecApplyConfiguration { + b.Spec = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/batch/v1beta1/cronjob.go b/vendor/k8s.io/client-go/applyconfigurations/batch/v1beta1/cronjob.go new file mode 100644 index 000000000000..ddcef76fd259 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/batch/v1beta1/cronjob.go @@ -0,0 +1,265 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + batchv1beta1 "k8s.io/api/batch/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// CronJobApplyConfiguration represents an declarative configuration of the CronJob type for use +// with apply. +type CronJobApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *CronJobSpecApplyConfiguration `json:"spec,omitempty"` + Status *CronJobStatusApplyConfiguration `json:"status,omitempty"` +} + +// CronJob constructs an declarative configuration of the CronJob type for use with +// apply. +func CronJob(name, namespace string) *CronJobApplyConfiguration { + b := &CronJobApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("CronJob") + b.WithAPIVersion("batch/v1beta1") + return b +} + +// ExtractCronJob extracts the applied configuration owned by fieldManager from +// cronJob. If no managedFields are found in cronJob for fieldManager, a +// CronJobApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// cronJob must be a unmodified CronJob API object that was retrieved from the Kubernetes API. +// ExtractCronJob provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractCronJob(cronJob *batchv1beta1.CronJob, fieldManager string) (*CronJobApplyConfiguration, error) { + b := &CronJobApplyConfiguration{} + err := managedfields.ExtractInto(cronJob, internal.Parser().Type("io.k8s.api.batch.v1beta1.CronJob"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(cronJob.Name) + b.WithNamespace(cronJob.Namespace) + + b.WithKind("CronJob") + b.WithAPIVersion("batch/v1beta1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *CronJobApplyConfiguration) WithKind(value string) *CronJobApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *CronJobApplyConfiguration) WithAPIVersion(value string) *CronJobApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *CronJobApplyConfiguration) WithName(value string) *CronJobApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *CronJobApplyConfiguration) WithGenerateName(value string) *CronJobApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *CronJobApplyConfiguration) WithNamespace(value string) *CronJobApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *CronJobApplyConfiguration) WithSelfLink(value string) *CronJobApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *CronJobApplyConfiguration) WithUID(value types.UID) *CronJobApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *CronJobApplyConfiguration) WithResourceVersion(value string) *CronJobApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *CronJobApplyConfiguration) WithGeneration(value int64) *CronJobApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *CronJobApplyConfiguration) WithCreationTimestamp(value metav1.Time) *CronJobApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *CronJobApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *CronJobApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *CronJobApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *CronJobApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *CronJobApplyConfiguration) WithLabels(entries map[string]string) *CronJobApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *CronJobApplyConfiguration) WithAnnotations(entries map[string]string) *CronJobApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *CronJobApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *CronJobApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *CronJobApplyConfiguration) WithFinalizers(values ...string) *CronJobApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *CronJobApplyConfiguration) WithClusterName(value string) *CronJobApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *CronJobApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *CronJobApplyConfiguration) WithSpec(value *CronJobSpecApplyConfiguration) *CronJobApplyConfiguration { + b.Spec = value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *CronJobApplyConfiguration) WithStatus(value *CronJobStatusApplyConfiguration) *CronJobApplyConfiguration { + b.Status = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/batch/v1beta1/cronjobspec.go b/vendor/k8s.io/client-go/applyconfigurations/batch/v1beta1/cronjobspec.go new file mode 100644 index 000000000000..7ca431b1e6e5 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/batch/v1beta1/cronjobspec.go @@ -0,0 +1,97 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1beta1 "k8s.io/api/batch/v1beta1" +) + +// CronJobSpecApplyConfiguration represents an declarative configuration of the CronJobSpec type for use +// with apply. +type CronJobSpecApplyConfiguration struct { + Schedule *string `json:"schedule,omitempty"` + StartingDeadlineSeconds *int64 `json:"startingDeadlineSeconds,omitempty"` + ConcurrencyPolicy *v1beta1.ConcurrencyPolicy `json:"concurrencyPolicy,omitempty"` + Suspend *bool `json:"suspend,omitempty"` + JobTemplate *JobTemplateSpecApplyConfiguration `json:"jobTemplate,omitempty"` + SuccessfulJobsHistoryLimit *int32 `json:"successfulJobsHistoryLimit,omitempty"` + FailedJobsHistoryLimit *int32 `json:"failedJobsHistoryLimit,omitempty"` +} + +// CronJobSpecApplyConfiguration constructs an declarative configuration of the CronJobSpec type for use with +// apply. +func CronJobSpec() *CronJobSpecApplyConfiguration { + return &CronJobSpecApplyConfiguration{} +} + +// WithSchedule sets the Schedule field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Schedule field is set to the value of the last call. +func (b *CronJobSpecApplyConfiguration) WithSchedule(value string) *CronJobSpecApplyConfiguration { + b.Schedule = &value + return b +} + +// WithStartingDeadlineSeconds sets the StartingDeadlineSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the StartingDeadlineSeconds field is set to the value of the last call. +func (b *CronJobSpecApplyConfiguration) WithStartingDeadlineSeconds(value int64) *CronJobSpecApplyConfiguration { + b.StartingDeadlineSeconds = &value + return b +} + +// WithConcurrencyPolicy sets the ConcurrencyPolicy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ConcurrencyPolicy field is set to the value of the last call. +func (b *CronJobSpecApplyConfiguration) WithConcurrencyPolicy(value v1beta1.ConcurrencyPolicy) *CronJobSpecApplyConfiguration { + b.ConcurrencyPolicy = &value + return b +} + +// WithSuspend sets the Suspend field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Suspend field is set to the value of the last call. +func (b *CronJobSpecApplyConfiguration) WithSuspend(value bool) *CronJobSpecApplyConfiguration { + b.Suspend = &value + return b +} + +// WithJobTemplate sets the JobTemplate field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the JobTemplate field is set to the value of the last call. +func (b *CronJobSpecApplyConfiguration) WithJobTemplate(value *JobTemplateSpecApplyConfiguration) *CronJobSpecApplyConfiguration { + b.JobTemplate = value + return b +} + +// WithSuccessfulJobsHistoryLimit sets the SuccessfulJobsHistoryLimit field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SuccessfulJobsHistoryLimit field is set to the value of the last call. +func (b *CronJobSpecApplyConfiguration) WithSuccessfulJobsHistoryLimit(value int32) *CronJobSpecApplyConfiguration { + b.SuccessfulJobsHistoryLimit = &value + return b +} + +// WithFailedJobsHistoryLimit sets the FailedJobsHistoryLimit field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FailedJobsHistoryLimit field is set to the value of the last call. +func (b *CronJobSpecApplyConfiguration) WithFailedJobsHistoryLimit(value int32) *CronJobSpecApplyConfiguration { + b.FailedJobsHistoryLimit = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/batch/v1beta1/cronjobstatus.go b/vendor/k8s.io/client-go/applyconfigurations/batch/v1beta1/cronjobstatus.go new file mode 100644 index 000000000000..8dca14f66303 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/batch/v1beta1/cronjobstatus.go @@ -0,0 +1,67 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + v1 "k8s.io/client-go/applyconfigurations/core/v1" +) + +// CronJobStatusApplyConfiguration represents an declarative configuration of the CronJobStatus type for use +// with apply. +type CronJobStatusApplyConfiguration struct { + Active []v1.ObjectReferenceApplyConfiguration `json:"active,omitempty"` + LastScheduleTime *metav1.Time `json:"lastScheduleTime,omitempty"` + LastSuccessfulTime *metav1.Time `json:"lastSuccessfulTime,omitempty"` +} + +// CronJobStatusApplyConfiguration constructs an declarative configuration of the CronJobStatus type for use with +// apply. +func CronJobStatus() *CronJobStatusApplyConfiguration { + return &CronJobStatusApplyConfiguration{} +} + +// WithActive adds the given value to the Active field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Active field. +func (b *CronJobStatusApplyConfiguration) WithActive(values ...*v1.ObjectReferenceApplyConfiguration) *CronJobStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithActive") + } + b.Active = append(b.Active, *values[i]) + } + return b +} + +// WithLastScheduleTime sets the LastScheduleTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastScheduleTime field is set to the value of the last call. +func (b *CronJobStatusApplyConfiguration) WithLastScheduleTime(value metav1.Time) *CronJobStatusApplyConfiguration { + b.LastScheduleTime = &value + return b +} + +// WithLastSuccessfulTime sets the LastSuccessfulTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastSuccessfulTime field is set to the value of the last call. +func (b *CronJobStatusApplyConfiguration) WithLastSuccessfulTime(value metav1.Time) *CronJobStatusApplyConfiguration { + b.LastSuccessfulTime = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/batch/v1beta1/jobtemplatespec.go b/vendor/k8s.io/client-go/applyconfigurations/batch/v1beta1/jobtemplatespec.go new file mode 100644 index 000000000000..bad60e1fbf87 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/batch/v1beta1/jobtemplatespec.go @@ -0,0 +1,207 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + batchv1 "k8s.io/client-go/applyconfigurations/batch/v1" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// JobTemplateSpecApplyConfiguration represents an declarative configuration of the JobTemplateSpec type for use +// with apply. +type JobTemplateSpecApplyConfiguration struct { + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *batchv1.JobSpecApplyConfiguration `json:"spec,omitempty"` +} + +// JobTemplateSpecApplyConfiguration constructs an declarative configuration of the JobTemplateSpec type for use with +// apply. +func JobTemplateSpec() *JobTemplateSpecApplyConfiguration { + return &JobTemplateSpecApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *JobTemplateSpecApplyConfiguration) WithName(value string) *JobTemplateSpecApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *JobTemplateSpecApplyConfiguration) WithGenerateName(value string) *JobTemplateSpecApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *JobTemplateSpecApplyConfiguration) WithNamespace(value string) *JobTemplateSpecApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *JobTemplateSpecApplyConfiguration) WithSelfLink(value string) *JobTemplateSpecApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *JobTemplateSpecApplyConfiguration) WithUID(value types.UID) *JobTemplateSpecApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *JobTemplateSpecApplyConfiguration) WithResourceVersion(value string) *JobTemplateSpecApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *JobTemplateSpecApplyConfiguration) WithGeneration(value int64) *JobTemplateSpecApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *JobTemplateSpecApplyConfiguration) WithCreationTimestamp(value metav1.Time) *JobTemplateSpecApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *JobTemplateSpecApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *JobTemplateSpecApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *JobTemplateSpecApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *JobTemplateSpecApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *JobTemplateSpecApplyConfiguration) WithLabels(entries map[string]string) *JobTemplateSpecApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *JobTemplateSpecApplyConfiguration) WithAnnotations(entries map[string]string) *JobTemplateSpecApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *JobTemplateSpecApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *JobTemplateSpecApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *JobTemplateSpecApplyConfiguration) WithFinalizers(values ...string) *JobTemplateSpecApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *JobTemplateSpecApplyConfiguration) WithClusterName(value string) *JobTemplateSpecApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *JobTemplateSpecApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *JobTemplateSpecApplyConfiguration) WithSpec(value *batchv1.JobSpecApplyConfiguration) *JobTemplateSpecApplyConfiguration { + b.Spec = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/certificates/v1/certificatesigningrequest.go b/vendor/k8s.io/client-go/applyconfigurations/certificates/v1/certificatesigningrequest.go new file mode 100644 index 000000000000..99c710a0fb16 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/certificates/v1/certificatesigningrequest.go @@ -0,0 +1,263 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + apicertificatesv1 "k8s.io/api/certificates/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// CertificateSigningRequestApplyConfiguration represents an declarative configuration of the CertificateSigningRequest type for use +// with apply. +type CertificateSigningRequestApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *CertificateSigningRequestSpecApplyConfiguration `json:"spec,omitempty"` + Status *CertificateSigningRequestStatusApplyConfiguration `json:"status,omitempty"` +} + +// CertificateSigningRequest constructs an declarative configuration of the CertificateSigningRequest type for use with +// apply. +func CertificateSigningRequest(name string) *CertificateSigningRequestApplyConfiguration { + b := &CertificateSigningRequestApplyConfiguration{} + b.WithName(name) + b.WithKind("CertificateSigningRequest") + b.WithAPIVersion("certificates.k8s.io/v1") + return b +} + +// ExtractCertificateSigningRequest extracts the applied configuration owned by fieldManager from +// certificateSigningRequest. If no managedFields are found in certificateSigningRequest for fieldManager, a +// CertificateSigningRequestApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// certificateSigningRequest must be a unmodified CertificateSigningRequest API object that was retrieved from the Kubernetes API. +// ExtractCertificateSigningRequest provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractCertificateSigningRequest(certificateSigningRequest *apicertificatesv1.CertificateSigningRequest, fieldManager string) (*CertificateSigningRequestApplyConfiguration, error) { + b := &CertificateSigningRequestApplyConfiguration{} + err := managedfields.ExtractInto(certificateSigningRequest, internal.Parser().Type("io.k8s.api.certificates.v1.CertificateSigningRequest"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(certificateSigningRequest.Name) + + b.WithKind("CertificateSigningRequest") + b.WithAPIVersion("certificates.k8s.io/v1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *CertificateSigningRequestApplyConfiguration) WithKind(value string) *CertificateSigningRequestApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *CertificateSigningRequestApplyConfiguration) WithAPIVersion(value string) *CertificateSigningRequestApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *CertificateSigningRequestApplyConfiguration) WithName(value string) *CertificateSigningRequestApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *CertificateSigningRequestApplyConfiguration) WithGenerateName(value string) *CertificateSigningRequestApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *CertificateSigningRequestApplyConfiguration) WithNamespace(value string) *CertificateSigningRequestApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *CertificateSigningRequestApplyConfiguration) WithSelfLink(value string) *CertificateSigningRequestApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *CertificateSigningRequestApplyConfiguration) WithUID(value types.UID) *CertificateSigningRequestApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *CertificateSigningRequestApplyConfiguration) WithResourceVersion(value string) *CertificateSigningRequestApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *CertificateSigningRequestApplyConfiguration) WithGeneration(value int64) *CertificateSigningRequestApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *CertificateSigningRequestApplyConfiguration) WithCreationTimestamp(value metav1.Time) *CertificateSigningRequestApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *CertificateSigningRequestApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *CertificateSigningRequestApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *CertificateSigningRequestApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *CertificateSigningRequestApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *CertificateSigningRequestApplyConfiguration) WithLabels(entries map[string]string) *CertificateSigningRequestApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *CertificateSigningRequestApplyConfiguration) WithAnnotations(entries map[string]string) *CertificateSigningRequestApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *CertificateSigningRequestApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *CertificateSigningRequestApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *CertificateSigningRequestApplyConfiguration) WithFinalizers(values ...string) *CertificateSigningRequestApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *CertificateSigningRequestApplyConfiguration) WithClusterName(value string) *CertificateSigningRequestApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *CertificateSigningRequestApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *CertificateSigningRequestApplyConfiguration) WithSpec(value *CertificateSigningRequestSpecApplyConfiguration) *CertificateSigningRequestApplyConfiguration { + b.Spec = value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *CertificateSigningRequestApplyConfiguration) WithStatus(value *CertificateSigningRequestStatusApplyConfiguration) *CertificateSigningRequestApplyConfiguration { + b.Status = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/certificates/v1/certificatesigningrequestcondition.go b/vendor/k8s.io/client-go/applyconfigurations/certificates/v1/certificatesigningrequestcondition.go new file mode 100644 index 000000000000..13d69cfcef2d --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/certificates/v1/certificatesigningrequestcondition.go @@ -0,0 +1,90 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/certificates/v1" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// CertificateSigningRequestConditionApplyConfiguration represents an declarative configuration of the CertificateSigningRequestCondition type for use +// with apply. +type CertificateSigningRequestConditionApplyConfiguration struct { + Type *v1.RequestConditionType `json:"type,omitempty"` + Status *corev1.ConditionStatus `json:"status,omitempty"` + Reason *string `json:"reason,omitempty"` + Message *string `json:"message,omitempty"` + LastUpdateTime *metav1.Time `json:"lastUpdateTime,omitempty"` + LastTransitionTime *metav1.Time `json:"lastTransitionTime,omitempty"` +} + +// CertificateSigningRequestConditionApplyConfiguration constructs an declarative configuration of the CertificateSigningRequestCondition type for use with +// apply. +func CertificateSigningRequestCondition() *CertificateSigningRequestConditionApplyConfiguration { + return &CertificateSigningRequestConditionApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *CertificateSigningRequestConditionApplyConfiguration) WithType(value v1.RequestConditionType) *CertificateSigningRequestConditionApplyConfiguration { + b.Type = &value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *CertificateSigningRequestConditionApplyConfiguration) WithStatus(value corev1.ConditionStatus) *CertificateSigningRequestConditionApplyConfiguration { + b.Status = &value + return b +} + +// WithReason sets the Reason field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Reason field is set to the value of the last call. +func (b *CertificateSigningRequestConditionApplyConfiguration) WithReason(value string) *CertificateSigningRequestConditionApplyConfiguration { + b.Reason = &value + return b +} + +// WithMessage sets the Message field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Message field is set to the value of the last call. +func (b *CertificateSigningRequestConditionApplyConfiguration) WithMessage(value string) *CertificateSigningRequestConditionApplyConfiguration { + b.Message = &value + return b +} + +// WithLastUpdateTime sets the LastUpdateTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastUpdateTime field is set to the value of the last call. +func (b *CertificateSigningRequestConditionApplyConfiguration) WithLastUpdateTime(value metav1.Time) *CertificateSigningRequestConditionApplyConfiguration { + b.LastUpdateTime = &value + return b +} + +// WithLastTransitionTime sets the LastTransitionTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastTransitionTime field is set to the value of the last call. +func (b *CertificateSigningRequestConditionApplyConfiguration) WithLastTransitionTime(value metav1.Time) *CertificateSigningRequestConditionApplyConfiguration { + b.LastTransitionTime = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/certificates/v1/certificatesigningrequestspec.go b/vendor/k8s.io/client-go/applyconfigurations/certificates/v1/certificatesigningrequestspec.go new file mode 100644 index 000000000000..7c4d2c98e2dd --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/certificates/v1/certificatesigningrequestspec.go @@ -0,0 +1,109 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/certificates/v1" +) + +// CertificateSigningRequestSpecApplyConfiguration represents an declarative configuration of the CertificateSigningRequestSpec type for use +// with apply. +type CertificateSigningRequestSpecApplyConfiguration struct { + Request []byte `json:"request,omitempty"` + SignerName *string `json:"signerName,omitempty"` + Usages []v1.KeyUsage `json:"usages,omitempty"` + Username *string `json:"username,omitempty"` + UID *string `json:"uid,omitempty"` + Groups []string `json:"groups,omitempty"` + Extra map[string]v1.ExtraValue `json:"extra,omitempty"` +} + +// CertificateSigningRequestSpecApplyConfiguration constructs an declarative configuration of the CertificateSigningRequestSpec type for use with +// apply. +func CertificateSigningRequestSpec() *CertificateSigningRequestSpecApplyConfiguration { + return &CertificateSigningRequestSpecApplyConfiguration{} +} + +// WithRequest adds the given value to the Request field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Request field. +func (b *CertificateSigningRequestSpecApplyConfiguration) WithRequest(values ...byte) *CertificateSigningRequestSpecApplyConfiguration { + for i := range values { + b.Request = append(b.Request, values[i]) + } + return b +} + +// WithSignerName sets the SignerName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SignerName field is set to the value of the last call. +func (b *CertificateSigningRequestSpecApplyConfiguration) WithSignerName(value string) *CertificateSigningRequestSpecApplyConfiguration { + b.SignerName = &value + return b +} + +// WithUsages adds the given value to the Usages field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Usages field. +func (b *CertificateSigningRequestSpecApplyConfiguration) WithUsages(values ...v1.KeyUsage) *CertificateSigningRequestSpecApplyConfiguration { + for i := range values { + b.Usages = append(b.Usages, values[i]) + } + return b +} + +// WithUsername sets the Username field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Username field is set to the value of the last call. +func (b *CertificateSigningRequestSpecApplyConfiguration) WithUsername(value string) *CertificateSigningRequestSpecApplyConfiguration { + b.Username = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *CertificateSigningRequestSpecApplyConfiguration) WithUID(value string) *CertificateSigningRequestSpecApplyConfiguration { + b.UID = &value + return b +} + +// WithGroups adds the given value to the Groups field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Groups field. +func (b *CertificateSigningRequestSpecApplyConfiguration) WithGroups(values ...string) *CertificateSigningRequestSpecApplyConfiguration { + for i := range values { + b.Groups = append(b.Groups, values[i]) + } + return b +} + +// WithExtra puts the entries into the Extra field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Extra field, +// overwriting an existing map entries in Extra field with the same key. +func (b *CertificateSigningRequestSpecApplyConfiguration) WithExtra(entries map[string]v1.ExtraValue) *CertificateSigningRequestSpecApplyConfiguration { + if b.Extra == nil && len(entries) > 0 { + b.Extra = make(map[string]v1.ExtraValue, len(entries)) + } + for k, v := range entries { + b.Extra[k] = v + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/certificates/v1/certificatesigningrequeststatus.go b/vendor/k8s.io/client-go/applyconfigurations/certificates/v1/certificatesigningrequeststatus.go new file mode 100644 index 000000000000..59d59303310d --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/certificates/v1/certificatesigningrequeststatus.go @@ -0,0 +1,55 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// CertificateSigningRequestStatusApplyConfiguration represents an declarative configuration of the CertificateSigningRequestStatus type for use +// with apply. +type CertificateSigningRequestStatusApplyConfiguration struct { + Conditions []CertificateSigningRequestConditionApplyConfiguration `json:"conditions,omitempty"` + Certificate []byte `json:"certificate,omitempty"` +} + +// CertificateSigningRequestStatusApplyConfiguration constructs an declarative configuration of the CertificateSigningRequestStatus type for use with +// apply. +func CertificateSigningRequestStatus() *CertificateSigningRequestStatusApplyConfiguration { + return &CertificateSigningRequestStatusApplyConfiguration{} +} + +// WithConditions adds the given value to the Conditions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Conditions field. +func (b *CertificateSigningRequestStatusApplyConfiguration) WithConditions(values ...*CertificateSigningRequestConditionApplyConfiguration) *CertificateSigningRequestStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithConditions") + } + b.Conditions = append(b.Conditions, *values[i]) + } + return b +} + +// WithCertificate adds the given value to the Certificate field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Certificate field. +func (b *CertificateSigningRequestStatusApplyConfiguration) WithCertificate(values ...byte) *CertificateSigningRequestStatusApplyConfiguration { + for i := range values { + b.Certificate = append(b.Certificate, values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/certificates/v1beta1/certificatesigningrequest.go b/vendor/k8s.io/client-go/applyconfigurations/certificates/v1beta1/certificatesigningrequest.go new file mode 100644 index 000000000000..920b5319a907 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/certificates/v1beta1/certificatesigningrequest.go @@ -0,0 +1,263 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + certificatesv1beta1 "k8s.io/api/certificates/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// CertificateSigningRequestApplyConfiguration represents an declarative configuration of the CertificateSigningRequest type for use +// with apply. +type CertificateSigningRequestApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *CertificateSigningRequestSpecApplyConfiguration `json:"spec,omitempty"` + Status *CertificateSigningRequestStatusApplyConfiguration `json:"status,omitempty"` +} + +// CertificateSigningRequest constructs an declarative configuration of the CertificateSigningRequest type for use with +// apply. +func CertificateSigningRequest(name string) *CertificateSigningRequestApplyConfiguration { + b := &CertificateSigningRequestApplyConfiguration{} + b.WithName(name) + b.WithKind("CertificateSigningRequest") + b.WithAPIVersion("certificates.k8s.io/v1beta1") + return b +} + +// ExtractCertificateSigningRequest extracts the applied configuration owned by fieldManager from +// certificateSigningRequest. If no managedFields are found in certificateSigningRequest for fieldManager, a +// CertificateSigningRequestApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// certificateSigningRequest must be a unmodified CertificateSigningRequest API object that was retrieved from the Kubernetes API. +// ExtractCertificateSigningRequest provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractCertificateSigningRequest(certificateSigningRequest *certificatesv1beta1.CertificateSigningRequest, fieldManager string) (*CertificateSigningRequestApplyConfiguration, error) { + b := &CertificateSigningRequestApplyConfiguration{} + err := managedfields.ExtractInto(certificateSigningRequest, internal.Parser().Type("io.k8s.api.certificates.v1beta1.CertificateSigningRequest"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(certificateSigningRequest.Name) + + b.WithKind("CertificateSigningRequest") + b.WithAPIVersion("certificates.k8s.io/v1beta1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *CertificateSigningRequestApplyConfiguration) WithKind(value string) *CertificateSigningRequestApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *CertificateSigningRequestApplyConfiguration) WithAPIVersion(value string) *CertificateSigningRequestApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *CertificateSigningRequestApplyConfiguration) WithName(value string) *CertificateSigningRequestApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *CertificateSigningRequestApplyConfiguration) WithGenerateName(value string) *CertificateSigningRequestApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *CertificateSigningRequestApplyConfiguration) WithNamespace(value string) *CertificateSigningRequestApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *CertificateSigningRequestApplyConfiguration) WithSelfLink(value string) *CertificateSigningRequestApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *CertificateSigningRequestApplyConfiguration) WithUID(value types.UID) *CertificateSigningRequestApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *CertificateSigningRequestApplyConfiguration) WithResourceVersion(value string) *CertificateSigningRequestApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *CertificateSigningRequestApplyConfiguration) WithGeneration(value int64) *CertificateSigningRequestApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *CertificateSigningRequestApplyConfiguration) WithCreationTimestamp(value metav1.Time) *CertificateSigningRequestApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *CertificateSigningRequestApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *CertificateSigningRequestApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *CertificateSigningRequestApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *CertificateSigningRequestApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *CertificateSigningRequestApplyConfiguration) WithLabels(entries map[string]string) *CertificateSigningRequestApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *CertificateSigningRequestApplyConfiguration) WithAnnotations(entries map[string]string) *CertificateSigningRequestApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *CertificateSigningRequestApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *CertificateSigningRequestApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *CertificateSigningRequestApplyConfiguration) WithFinalizers(values ...string) *CertificateSigningRequestApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *CertificateSigningRequestApplyConfiguration) WithClusterName(value string) *CertificateSigningRequestApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *CertificateSigningRequestApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *CertificateSigningRequestApplyConfiguration) WithSpec(value *CertificateSigningRequestSpecApplyConfiguration) *CertificateSigningRequestApplyConfiguration { + b.Spec = value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *CertificateSigningRequestApplyConfiguration) WithStatus(value *CertificateSigningRequestStatusApplyConfiguration) *CertificateSigningRequestApplyConfiguration { + b.Status = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/certificates/v1beta1/certificatesigningrequestcondition.go b/vendor/k8s.io/client-go/applyconfigurations/certificates/v1beta1/certificatesigningrequestcondition.go new file mode 100644 index 000000000000..2c32a3272c14 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/certificates/v1beta1/certificatesigningrequestcondition.go @@ -0,0 +1,90 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1beta1 "k8s.io/api/certificates/v1beta1" + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// CertificateSigningRequestConditionApplyConfiguration represents an declarative configuration of the CertificateSigningRequestCondition type for use +// with apply. +type CertificateSigningRequestConditionApplyConfiguration struct { + Type *v1beta1.RequestConditionType `json:"type,omitempty"` + Status *v1.ConditionStatus `json:"status,omitempty"` + Reason *string `json:"reason,omitempty"` + Message *string `json:"message,omitempty"` + LastUpdateTime *metav1.Time `json:"lastUpdateTime,omitempty"` + LastTransitionTime *metav1.Time `json:"lastTransitionTime,omitempty"` +} + +// CertificateSigningRequestConditionApplyConfiguration constructs an declarative configuration of the CertificateSigningRequestCondition type for use with +// apply. +func CertificateSigningRequestCondition() *CertificateSigningRequestConditionApplyConfiguration { + return &CertificateSigningRequestConditionApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *CertificateSigningRequestConditionApplyConfiguration) WithType(value v1beta1.RequestConditionType) *CertificateSigningRequestConditionApplyConfiguration { + b.Type = &value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *CertificateSigningRequestConditionApplyConfiguration) WithStatus(value v1.ConditionStatus) *CertificateSigningRequestConditionApplyConfiguration { + b.Status = &value + return b +} + +// WithReason sets the Reason field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Reason field is set to the value of the last call. +func (b *CertificateSigningRequestConditionApplyConfiguration) WithReason(value string) *CertificateSigningRequestConditionApplyConfiguration { + b.Reason = &value + return b +} + +// WithMessage sets the Message field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Message field is set to the value of the last call. +func (b *CertificateSigningRequestConditionApplyConfiguration) WithMessage(value string) *CertificateSigningRequestConditionApplyConfiguration { + b.Message = &value + return b +} + +// WithLastUpdateTime sets the LastUpdateTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastUpdateTime field is set to the value of the last call. +func (b *CertificateSigningRequestConditionApplyConfiguration) WithLastUpdateTime(value metav1.Time) *CertificateSigningRequestConditionApplyConfiguration { + b.LastUpdateTime = &value + return b +} + +// WithLastTransitionTime sets the LastTransitionTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastTransitionTime field is set to the value of the last call. +func (b *CertificateSigningRequestConditionApplyConfiguration) WithLastTransitionTime(value metav1.Time) *CertificateSigningRequestConditionApplyConfiguration { + b.LastTransitionTime = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/certificates/v1beta1/certificatesigningrequestspec.go b/vendor/k8s.io/client-go/applyconfigurations/certificates/v1beta1/certificatesigningrequestspec.go new file mode 100644 index 000000000000..73ea58e5ec65 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/certificates/v1beta1/certificatesigningrequestspec.go @@ -0,0 +1,109 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1beta1 "k8s.io/api/certificates/v1beta1" +) + +// CertificateSigningRequestSpecApplyConfiguration represents an declarative configuration of the CertificateSigningRequestSpec type for use +// with apply. +type CertificateSigningRequestSpecApplyConfiguration struct { + Request []byte `json:"request,omitempty"` + SignerName *string `json:"signerName,omitempty"` + Usages []v1beta1.KeyUsage `json:"usages,omitempty"` + Username *string `json:"username,omitempty"` + UID *string `json:"uid,omitempty"` + Groups []string `json:"groups,omitempty"` + Extra map[string]v1beta1.ExtraValue `json:"extra,omitempty"` +} + +// CertificateSigningRequestSpecApplyConfiguration constructs an declarative configuration of the CertificateSigningRequestSpec type for use with +// apply. +func CertificateSigningRequestSpec() *CertificateSigningRequestSpecApplyConfiguration { + return &CertificateSigningRequestSpecApplyConfiguration{} +} + +// WithRequest adds the given value to the Request field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Request field. +func (b *CertificateSigningRequestSpecApplyConfiguration) WithRequest(values ...byte) *CertificateSigningRequestSpecApplyConfiguration { + for i := range values { + b.Request = append(b.Request, values[i]) + } + return b +} + +// WithSignerName sets the SignerName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SignerName field is set to the value of the last call. +func (b *CertificateSigningRequestSpecApplyConfiguration) WithSignerName(value string) *CertificateSigningRequestSpecApplyConfiguration { + b.SignerName = &value + return b +} + +// WithUsages adds the given value to the Usages field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Usages field. +func (b *CertificateSigningRequestSpecApplyConfiguration) WithUsages(values ...v1beta1.KeyUsage) *CertificateSigningRequestSpecApplyConfiguration { + for i := range values { + b.Usages = append(b.Usages, values[i]) + } + return b +} + +// WithUsername sets the Username field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Username field is set to the value of the last call. +func (b *CertificateSigningRequestSpecApplyConfiguration) WithUsername(value string) *CertificateSigningRequestSpecApplyConfiguration { + b.Username = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *CertificateSigningRequestSpecApplyConfiguration) WithUID(value string) *CertificateSigningRequestSpecApplyConfiguration { + b.UID = &value + return b +} + +// WithGroups adds the given value to the Groups field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Groups field. +func (b *CertificateSigningRequestSpecApplyConfiguration) WithGroups(values ...string) *CertificateSigningRequestSpecApplyConfiguration { + for i := range values { + b.Groups = append(b.Groups, values[i]) + } + return b +} + +// WithExtra puts the entries into the Extra field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Extra field, +// overwriting an existing map entries in Extra field with the same key. +func (b *CertificateSigningRequestSpecApplyConfiguration) WithExtra(entries map[string]v1beta1.ExtraValue) *CertificateSigningRequestSpecApplyConfiguration { + if b.Extra == nil && len(entries) > 0 { + b.Extra = make(map[string]v1beta1.ExtraValue, len(entries)) + } + for k, v := range entries { + b.Extra[k] = v + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/certificates/v1beta1/certificatesigningrequeststatus.go b/vendor/k8s.io/client-go/applyconfigurations/certificates/v1beta1/certificatesigningrequeststatus.go new file mode 100644 index 000000000000..9d8c5d4585c1 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/certificates/v1beta1/certificatesigningrequeststatus.go @@ -0,0 +1,55 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// CertificateSigningRequestStatusApplyConfiguration represents an declarative configuration of the CertificateSigningRequestStatus type for use +// with apply. +type CertificateSigningRequestStatusApplyConfiguration struct { + Conditions []CertificateSigningRequestConditionApplyConfiguration `json:"conditions,omitempty"` + Certificate []byte `json:"certificate,omitempty"` +} + +// CertificateSigningRequestStatusApplyConfiguration constructs an declarative configuration of the CertificateSigningRequestStatus type for use with +// apply. +func CertificateSigningRequestStatus() *CertificateSigningRequestStatusApplyConfiguration { + return &CertificateSigningRequestStatusApplyConfiguration{} +} + +// WithConditions adds the given value to the Conditions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Conditions field. +func (b *CertificateSigningRequestStatusApplyConfiguration) WithConditions(values ...*CertificateSigningRequestConditionApplyConfiguration) *CertificateSigningRequestStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithConditions") + } + b.Conditions = append(b.Conditions, *values[i]) + } + return b +} + +// WithCertificate adds the given value to the Certificate field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Certificate field. +func (b *CertificateSigningRequestStatusApplyConfiguration) WithCertificate(values ...byte) *CertificateSigningRequestStatusApplyConfiguration { + for i := range values { + b.Certificate = append(b.Certificate, values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/coordination/v1/lease.go b/vendor/k8s.io/client-go/applyconfigurations/coordination/v1/lease.go new file mode 100644 index 000000000000..ad552f2a5ead --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/coordination/v1/lease.go @@ -0,0 +1,256 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + apicoordinationv1 "k8s.io/api/coordination/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// LeaseApplyConfiguration represents an declarative configuration of the Lease type for use +// with apply. +type LeaseApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *LeaseSpecApplyConfiguration `json:"spec,omitempty"` +} + +// Lease constructs an declarative configuration of the Lease type for use with +// apply. +func Lease(name, namespace string) *LeaseApplyConfiguration { + b := &LeaseApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("Lease") + b.WithAPIVersion("coordination.k8s.io/v1") + return b +} + +// ExtractLease extracts the applied configuration owned by fieldManager from +// lease. If no managedFields are found in lease for fieldManager, a +// LeaseApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// lease must be a unmodified Lease API object that was retrieved from the Kubernetes API. +// ExtractLease provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractLease(lease *apicoordinationv1.Lease, fieldManager string) (*LeaseApplyConfiguration, error) { + b := &LeaseApplyConfiguration{} + err := managedfields.ExtractInto(lease, internal.Parser().Type("io.k8s.api.coordination.v1.Lease"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(lease.Name) + b.WithNamespace(lease.Namespace) + + b.WithKind("Lease") + b.WithAPIVersion("coordination.k8s.io/v1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *LeaseApplyConfiguration) WithKind(value string) *LeaseApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *LeaseApplyConfiguration) WithAPIVersion(value string) *LeaseApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *LeaseApplyConfiguration) WithName(value string) *LeaseApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *LeaseApplyConfiguration) WithGenerateName(value string) *LeaseApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *LeaseApplyConfiguration) WithNamespace(value string) *LeaseApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *LeaseApplyConfiguration) WithSelfLink(value string) *LeaseApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *LeaseApplyConfiguration) WithUID(value types.UID) *LeaseApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *LeaseApplyConfiguration) WithResourceVersion(value string) *LeaseApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *LeaseApplyConfiguration) WithGeneration(value int64) *LeaseApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *LeaseApplyConfiguration) WithCreationTimestamp(value metav1.Time) *LeaseApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *LeaseApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *LeaseApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *LeaseApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *LeaseApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *LeaseApplyConfiguration) WithLabels(entries map[string]string) *LeaseApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *LeaseApplyConfiguration) WithAnnotations(entries map[string]string) *LeaseApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *LeaseApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *LeaseApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *LeaseApplyConfiguration) WithFinalizers(values ...string) *LeaseApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *LeaseApplyConfiguration) WithClusterName(value string) *LeaseApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *LeaseApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *LeaseApplyConfiguration) WithSpec(value *LeaseSpecApplyConfiguration) *LeaseApplyConfiguration { + b.Spec = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/coordination/v1/leasespec.go b/vendor/k8s.io/client-go/applyconfigurations/coordination/v1/leasespec.go new file mode 100644 index 000000000000..a5f6a6ebbae7 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/coordination/v1/leasespec.go @@ -0,0 +1,79 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// LeaseSpecApplyConfiguration represents an declarative configuration of the LeaseSpec type for use +// with apply. +type LeaseSpecApplyConfiguration struct { + HolderIdentity *string `json:"holderIdentity,omitempty"` + LeaseDurationSeconds *int32 `json:"leaseDurationSeconds,omitempty"` + AcquireTime *v1.MicroTime `json:"acquireTime,omitempty"` + RenewTime *v1.MicroTime `json:"renewTime,omitempty"` + LeaseTransitions *int32 `json:"leaseTransitions,omitempty"` +} + +// LeaseSpecApplyConfiguration constructs an declarative configuration of the LeaseSpec type for use with +// apply. +func LeaseSpec() *LeaseSpecApplyConfiguration { + return &LeaseSpecApplyConfiguration{} +} + +// WithHolderIdentity sets the HolderIdentity field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the HolderIdentity field is set to the value of the last call. +func (b *LeaseSpecApplyConfiguration) WithHolderIdentity(value string) *LeaseSpecApplyConfiguration { + b.HolderIdentity = &value + return b +} + +// WithLeaseDurationSeconds sets the LeaseDurationSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LeaseDurationSeconds field is set to the value of the last call. +func (b *LeaseSpecApplyConfiguration) WithLeaseDurationSeconds(value int32) *LeaseSpecApplyConfiguration { + b.LeaseDurationSeconds = &value + return b +} + +// WithAcquireTime sets the AcquireTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AcquireTime field is set to the value of the last call. +func (b *LeaseSpecApplyConfiguration) WithAcquireTime(value v1.MicroTime) *LeaseSpecApplyConfiguration { + b.AcquireTime = &value + return b +} + +// WithRenewTime sets the RenewTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RenewTime field is set to the value of the last call. +func (b *LeaseSpecApplyConfiguration) WithRenewTime(value v1.MicroTime) *LeaseSpecApplyConfiguration { + b.RenewTime = &value + return b +} + +// WithLeaseTransitions sets the LeaseTransitions field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LeaseTransitions field is set to the value of the last call. +func (b *LeaseSpecApplyConfiguration) WithLeaseTransitions(value int32) *LeaseSpecApplyConfiguration { + b.LeaseTransitions = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/coordination/v1beta1/lease.go b/vendor/k8s.io/client-go/applyconfigurations/coordination/v1beta1/lease.go new file mode 100644 index 000000000000..9093cfc54344 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/coordination/v1beta1/lease.go @@ -0,0 +1,256 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + coordinationv1beta1 "k8s.io/api/coordination/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// LeaseApplyConfiguration represents an declarative configuration of the Lease type for use +// with apply. +type LeaseApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *LeaseSpecApplyConfiguration `json:"spec,omitempty"` +} + +// Lease constructs an declarative configuration of the Lease type for use with +// apply. +func Lease(name, namespace string) *LeaseApplyConfiguration { + b := &LeaseApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("Lease") + b.WithAPIVersion("coordination.k8s.io/v1beta1") + return b +} + +// ExtractLease extracts the applied configuration owned by fieldManager from +// lease. If no managedFields are found in lease for fieldManager, a +// LeaseApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// lease must be a unmodified Lease API object that was retrieved from the Kubernetes API. +// ExtractLease provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractLease(lease *coordinationv1beta1.Lease, fieldManager string) (*LeaseApplyConfiguration, error) { + b := &LeaseApplyConfiguration{} + err := managedfields.ExtractInto(lease, internal.Parser().Type("io.k8s.api.coordination.v1beta1.Lease"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(lease.Name) + b.WithNamespace(lease.Namespace) + + b.WithKind("Lease") + b.WithAPIVersion("coordination.k8s.io/v1beta1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *LeaseApplyConfiguration) WithKind(value string) *LeaseApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *LeaseApplyConfiguration) WithAPIVersion(value string) *LeaseApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *LeaseApplyConfiguration) WithName(value string) *LeaseApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *LeaseApplyConfiguration) WithGenerateName(value string) *LeaseApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *LeaseApplyConfiguration) WithNamespace(value string) *LeaseApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *LeaseApplyConfiguration) WithSelfLink(value string) *LeaseApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *LeaseApplyConfiguration) WithUID(value types.UID) *LeaseApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *LeaseApplyConfiguration) WithResourceVersion(value string) *LeaseApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *LeaseApplyConfiguration) WithGeneration(value int64) *LeaseApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *LeaseApplyConfiguration) WithCreationTimestamp(value metav1.Time) *LeaseApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *LeaseApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *LeaseApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *LeaseApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *LeaseApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *LeaseApplyConfiguration) WithLabels(entries map[string]string) *LeaseApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *LeaseApplyConfiguration) WithAnnotations(entries map[string]string) *LeaseApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *LeaseApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *LeaseApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *LeaseApplyConfiguration) WithFinalizers(values ...string) *LeaseApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *LeaseApplyConfiguration) WithClusterName(value string) *LeaseApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *LeaseApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *LeaseApplyConfiguration) WithSpec(value *LeaseSpecApplyConfiguration) *LeaseApplyConfiguration { + b.Spec = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/coordination/v1beta1/leasespec.go b/vendor/k8s.io/client-go/applyconfigurations/coordination/v1beta1/leasespec.go new file mode 100644 index 000000000000..865eb7645558 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/coordination/v1beta1/leasespec.go @@ -0,0 +1,79 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// LeaseSpecApplyConfiguration represents an declarative configuration of the LeaseSpec type for use +// with apply. +type LeaseSpecApplyConfiguration struct { + HolderIdentity *string `json:"holderIdentity,omitempty"` + LeaseDurationSeconds *int32 `json:"leaseDurationSeconds,omitempty"` + AcquireTime *v1.MicroTime `json:"acquireTime,omitempty"` + RenewTime *v1.MicroTime `json:"renewTime,omitempty"` + LeaseTransitions *int32 `json:"leaseTransitions,omitempty"` +} + +// LeaseSpecApplyConfiguration constructs an declarative configuration of the LeaseSpec type for use with +// apply. +func LeaseSpec() *LeaseSpecApplyConfiguration { + return &LeaseSpecApplyConfiguration{} +} + +// WithHolderIdentity sets the HolderIdentity field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the HolderIdentity field is set to the value of the last call. +func (b *LeaseSpecApplyConfiguration) WithHolderIdentity(value string) *LeaseSpecApplyConfiguration { + b.HolderIdentity = &value + return b +} + +// WithLeaseDurationSeconds sets the LeaseDurationSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LeaseDurationSeconds field is set to the value of the last call. +func (b *LeaseSpecApplyConfiguration) WithLeaseDurationSeconds(value int32) *LeaseSpecApplyConfiguration { + b.LeaseDurationSeconds = &value + return b +} + +// WithAcquireTime sets the AcquireTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AcquireTime field is set to the value of the last call. +func (b *LeaseSpecApplyConfiguration) WithAcquireTime(value v1.MicroTime) *LeaseSpecApplyConfiguration { + b.AcquireTime = &value + return b +} + +// WithRenewTime sets the RenewTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RenewTime field is set to the value of the last call. +func (b *LeaseSpecApplyConfiguration) WithRenewTime(value v1.MicroTime) *LeaseSpecApplyConfiguration { + b.RenewTime = &value + return b +} + +// WithLeaseTransitions sets the LeaseTransitions field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LeaseTransitions field is set to the value of the last call. +func (b *LeaseSpecApplyConfiguration) WithLeaseTransitions(value int32) *LeaseSpecApplyConfiguration { + b.LeaseTransitions = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/affinity.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/affinity.go new file mode 100644 index 000000000000..df6d1c64e562 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/affinity.go @@ -0,0 +1,57 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// AffinityApplyConfiguration represents an declarative configuration of the Affinity type for use +// with apply. +type AffinityApplyConfiguration struct { + NodeAffinity *NodeAffinityApplyConfiguration `json:"nodeAffinity,omitempty"` + PodAffinity *PodAffinityApplyConfiguration `json:"podAffinity,omitempty"` + PodAntiAffinity *PodAntiAffinityApplyConfiguration `json:"podAntiAffinity,omitempty"` +} + +// AffinityApplyConfiguration constructs an declarative configuration of the Affinity type for use with +// apply. +func Affinity() *AffinityApplyConfiguration { + return &AffinityApplyConfiguration{} +} + +// WithNodeAffinity sets the NodeAffinity field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NodeAffinity field is set to the value of the last call. +func (b *AffinityApplyConfiguration) WithNodeAffinity(value *NodeAffinityApplyConfiguration) *AffinityApplyConfiguration { + b.NodeAffinity = value + return b +} + +// WithPodAffinity sets the PodAffinity field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PodAffinity field is set to the value of the last call. +func (b *AffinityApplyConfiguration) WithPodAffinity(value *PodAffinityApplyConfiguration) *AffinityApplyConfiguration { + b.PodAffinity = value + return b +} + +// WithPodAntiAffinity sets the PodAntiAffinity field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PodAntiAffinity field is set to the value of the last call. +func (b *AffinityApplyConfiguration) WithPodAntiAffinity(value *PodAntiAffinityApplyConfiguration) *AffinityApplyConfiguration { + b.PodAntiAffinity = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/attachedvolume.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/attachedvolume.go new file mode 100644 index 000000000000..970bf24c45be --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/attachedvolume.go @@ -0,0 +1,52 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/core/v1" +) + +// AttachedVolumeApplyConfiguration represents an declarative configuration of the AttachedVolume type for use +// with apply. +type AttachedVolumeApplyConfiguration struct { + Name *v1.UniqueVolumeName `json:"name,omitempty"` + DevicePath *string `json:"devicePath,omitempty"` +} + +// AttachedVolumeApplyConfiguration constructs an declarative configuration of the AttachedVolume type for use with +// apply. +func AttachedVolume() *AttachedVolumeApplyConfiguration { + return &AttachedVolumeApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *AttachedVolumeApplyConfiguration) WithName(value v1.UniqueVolumeName) *AttachedVolumeApplyConfiguration { + b.Name = &value + return b +} + +// WithDevicePath sets the DevicePath field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DevicePath field is set to the value of the last call. +func (b *AttachedVolumeApplyConfiguration) WithDevicePath(value string) *AttachedVolumeApplyConfiguration { + b.DevicePath = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/awselasticblockstorevolumesource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/awselasticblockstorevolumesource.go new file mode 100644 index 000000000000..6ff335e9d624 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/awselasticblockstorevolumesource.go @@ -0,0 +1,66 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// AWSElasticBlockStoreVolumeSourceApplyConfiguration represents an declarative configuration of the AWSElasticBlockStoreVolumeSource type for use +// with apply. +type AWSElasticBlockStoreVolumeSourceApplyConfiguration struct { + VolumeID *string `json:"volumeID,omitempty"` + FSType *string `json:"fsType,omitempty"` + Partition *int32 `json:"partition,omitempty"` + ReadOnly *bool `json:"readOnly,omitempty"` +} + +// AWSElasticBlockStoreVolumeSourceApplyConfiguration constructs an declarative configuration of the AWSElasticBlockStoreVolumeSource type for use with +// apply. +func AWSElasticBlockStoreVolumeSource() *AWSElasticBlockStoreVolumeSourceApplyConfiguration { + return &AWSElasticBlockStoreVolumeSourceApplyConfiguration{} +} + +// WithVolumeID sets the VolumeID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the VolumeID field is set to the value of the last call. +func (b *AWSElasticBlockStoreVolumeSourceApplyConfiguration) WithVolumeID(value string) *AWSElasticBlockStoreVolumeSourceApplyConfiguration { + b.VolumeID = &value + return b +} + +// WithFSType sets the FSType field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FSType field is set to the value of the last call. +func (b *AWSElasticBlockStoreVolumeSourceApplyConfiguration) WithFSType(value string) *AWSElasticBlockStoreVolumeSourceApplyConfiguration { + b.FSType = &value + return b +} + +// WithPartition sets the Partition field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Partition field is set to the value of the last call. +func (b *AWSElasticBlockStoreVolumeSourceApplyConfiguration) WithPartition(value int32) *AWSElasticBlockStoreVolumeSourceApplyConfiguration { + b.Partition = &value + return b +} + +// WithReadOnly sets the ReadOnly field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadOnly field is set to the value of the last call. +func (b *AWSElasticBlockStoreVolumeSourceApplyConfiguration) WithReadOnly(value bool) *AWSElasticBlockStoreVolumeSourceApplyConfiguration { + b.ReadOnly = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/azurediskvolumesource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/azurediskvolumesource.go new file mode 100644 index 000000000000..b2774735ae44 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/azurediskvolumesource.go @@ -0,0 +1,88 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/core/v1" +) + +// AzureDiskVolumeSourceApplyConfiguration represents an declarative configuration of the AzureDiskVolumeSource type for use +// with apply. +type AzureDiskVolumeSourceApplyConfiguration struct { + DiskName *string `json:"diskName,omitempty"` + DataDiskURI *string `json:"diskURI,omitempty"` + CachingMode *v1.AzureDataDiskCachingMode `json:"cachingMode,omitempty"` + FSType *string `json:"fsType,omitempty"` + ReadOnly *bool `json:"readOnly,omitempty"` + Kind *v1.AzureDataDiskKind `json:"kind,omitempty"` +} + +// AzureDiskVolumeSourceApplyConfiguration constructs an declarative configuration of the AzureDiskVolumeSource type for use with +// apply. +func AzureDiskVolumeSource() *AzureDiskVolumeSourceApplyConfiguration { + return &AzureDiskVolumeSourceApplyConfiguration{} +} + +// WithDiskName sets the DiskName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DiskName field is set to the value of the last call. +func (b *AzureDiskVolumeSourceApplyConfiguration) WithDiskName(value string) *AzureDiskVolumeSourceApplyConfiguration { + b.DiskName = &value + return b +} + +// WithDataDiskURI sets the DataDiskURI field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DataDiskURI field is set to the value of the last call. +func (b *AzureDiskVolumeSourceApplyConfiguration) WithDataDiskURI(value string) *AzureDiskVolumeSourceApplyConfiguration { + b.DataDiskURI = &value + return b +} + +// WithCachingMode sets the CachingMode field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CachingMode field is set to the value of the last call. +func (b *AzureDiskVolumeSourceApplyConfiguration) WithCachingMode(value v1.AzureDataDiskCachingMode) *AzureDiskVolumeSourceApplyConfiguration { + b.CachingMode = &value + return b +} + +// WithFSType sets the FSType field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FSType field is set to the value of the last call. +func (b *AzureDiskVolumeSourceApplyConfiguration) WithFSType(value string) *AzureDiskVolumeSourceApplyConfiguration { + b.FSType = &value + return b +} + +// WithReadOnly sets the ReadOnly field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadOnly field is set to the value of the last call. +func (b *AzureDiskVolumeSourceApplyConfiguration) WithReadOnly(value bool) *AzureDiskVolumeSourceApplyConfiguration { + b.ReadOnly = &value + return b +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *AzureDiskVolumeSourceApplyConfiguration) WithKind(value v1.AzureDataDiskKind) *AzureDiskVolumeSourceApplyConfiguration { + b.Kind = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/azurefilepersistentvolumesource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/azurefilepersistentvolumesource.go new file mode 100644 index 000000000000..f17393833459 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/azurefilepersistentvolumesource.go @@ -0,0 +1,66 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// AzureFilePersistentVolumeSourceApplyConfiguration represents an declarative configuration of the AzureFilePersistentVolumeSource type for use +// with apply. +type AzureFilePersistentVolumeSourceApplyConfiguration struct { + SecretName *string `json:"secretName,omitempty"` + ShareName *string `json:"shareName,omitempty"` + ReadOnly *bool `json:"readOnly,omitempty"` + SecretNamespace *string `json:"secretNamespace,omitempty"` +} + +// AzureFilePersistentVolumeSourceApplyConfiguration constructs an declarative configuration of the AzureFilePersistentVolumeSource type for use with +// apply. +func AzureFilePersistentVolumeSource() *AzureFilePersistentVolumeSourceApplyConfiguration { + return &AzureFilePersistentVolumeSourceApplyConfiguration{} +} + +// WithSecretName sets the SecretName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SecretName field is set to the value of the last call. +func (b *AzureFilePersistentVolumeSourceApplyConfiguration) WithSecretName(value string) *AzureFilePersistentVolumeSourceApplyConfiguration { + b.SecretName = &value + return b +} + +// WithShareName sets the ShareName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ShareName field is set to the value of the last call. +func (b *AzureFilePersistentVolumeSourceApplyConfiguration) WithShareName(value string) *AzureFilePersistentVolumeSourceApplyConfiguration { + b.ShareName = &value + return b +} + +// WithReadOnly sets the ReadOnly field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadOnly field is set to the value of the last call. +func (b *AzureFilePersistentVolumeSourceApplyConfiguration) WithReadOnly(value bool) *AzureFilePersistentVolumeSourceApplyConfiguration { + b.ReadOnly = &value + return b +} + +// WithSecretNamespace sets the SecretNamespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SecretNamespace field is set to the value of the last call. +func (b *AzureFilePersistentVolumeSourceApplyConfiguration) WithSecretNamespace(value string) *AzureFilePersistentVolumeSourceApplyConfiguration { + b.SecretNamespace = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/azurefilevolumesource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/azurefilevolumesource.go new file mode 100644 index 000000000000..a7f7f33d8895 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/azurefilevolumesource.go @@ -0,0 +1,57 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// AzureFileVolumeSourceApplyConfiguration represents an declarative configuration of the AzureFileVolumeSource type for use +// with apply. +type AzureFileVolumeSourceApplyConfiguration struct { + SecretName *string `json:"secretName,omitempty"` + ShareName *string `json:"shareName,omitempty"` + ReadOnly *bool `json:"readOnly,omitempty"` +} + +// AzureFileVolumeSourceApplyConfiguration constructs an declarative configuration of the AzureFileVolumeSource type for use with +// apply. +func AzureFileVolumeSource() *AzureFileVolumeSourceApplyConfiguration { + return &AzureFileVolumeSourceApplyConfiguration{} +} + +// WithSecretName sets the SecretName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SecretName field is set to the value of the last call. +func (b *AzureFileVolumeSourceApplyConfiguration) WithSecretName(value string) *AzureFileVolumeSourceApplyConfiguration { + b.SecretName = &value + return b +} + +// WithShareName sets the ShareName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ShareName field is set to the value of the last call. +func (b *AzureFileVolumeSourceApplyConfiguration) WithShareName(value string) *AzureFileVolumeSourceApplyConfiguration { + b.ShareName = &value + return b +} + +// WithReadOnly sets the ReadOnly field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadOnly field is set to the value of the last call. +func (b *AzureFileVolumeSourceApplyConfiguration) WithReadOnly(value bool) *AzureFileVolumeSourceApplyConfiguration { + b.ReadOnly = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/capabilities.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/capabilities.go new file mode 100644 index 000000000000..c3d176c4d8a4 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/capabilities.go @@ -0,0 +1,56 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/core/v1" +) + +// CapabilitiesApplyConfiguration represents an declarative configuration of the Capabilities type for use +// with apply. +type CapabilitiesApplyConfiguration struct { + Add []v1.Capability `json:"add,omitempty"` + Drop []v1.Capability `json:"drop,omitempty"` +} + +// CapabilitiesApplyConfiguration constructs an declarative configuration of the Capabilities type for use with +// apply. +func Capabilities() *CapabilitiesApplyConfiguration { + return &CapabilitiesApplyConfiguration{} +} + +// WithAdd adds the given value to the Add field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Add field. +func (b *CapabilitiesApplyConfiguration) WithAdd(values ...v1.Capability) *CapabilitiesApplyConfiguration { + for i := range values { + b.Add = append(b.Add, values[i]) + } + return b +} + +// WithDrop adds the given value to the Drop field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Drop field. +func (b *CapabilitiesApplyConfiguration) WithDrop(values ...v1.Capability) *CapabilitiesApplyConfiguration { + for i := range values { + b.Drop = append(b.Drop, values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/cephfspersistentvolumesource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/cephfspersistentvolumesource.go new file mode 100644 index 000000000000..a41936fe3d99 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/cephfspersistentvolumesource.go @@ -0,0 +1,86 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// CephFSPersistentVolumeSourceApplyConfiguration represents an declarative configuration of the CephFSPersistentVolumeSource type for use +// with apply. +type CephFSPersistentVolumeSourceApplyConfiguration struct { + Monitors []string `json:"monitors,omitempty"` + Path *string `json:"path,omitempty"` + User *string `json:"user,omitempty"` + SecretFile *string `json:"secretFile,omitempty"` + SecretRef *SecretReferenceApplyConfiguration `json:"secretRef,omitempty"` + ReadOnly *bool `json:"readOnly,omitempty"` +} + +// CephFSPersistentVolumeSourceApplyConfiguration constructs an declarative configuration of the CephFSPersistentVolumeSource type for use with +// apply. +func CephFSPersistentVolumeSource() *CephFSPersistentVolumeSourceApplyConfiguration { + return &CephFSPersistentVolumeSourceApplyConfiguration{} +} + +// WithMonitors adds the given value to the Monitors field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Monitors field. +func (b *CephFSPersistentVolumeSourceApplyConfiguration) WithMonitors(values ...string) *CephFSPersistentVolumeSourceApplyConfiguration { + for i := range values { + b.Monitors = append(b.Monitors, values[i]) + } + return b +} + +// WithPath sets the Path field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Path field is set to the value of the last call. +func (b *CephFSPersistentVolumeSourceApplyConfiguration) WithPath(value string) *CephFSPersistentVolumeSourceApplyConfiguration { + b.Path = &value + return b +} + +// WithUser sets the User field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the User field is set to the value of the last call. +func (b *CephFSPersistentVolumeSourceApplyConfiguration) WithUser(value string) *CephFSPersistentVolumeSourceApplyConfiguration { + b.User = &value + return b +} + +// WithSecretFile sets the SecretFile field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SecretFile field is set to the value of the last call. +func (b *CephFSPersistentVolumeSourceApplyConfiguration) WithSecretFile(value string) *CephFSPersistentVolumeSourceApplyConfiguration { + b.SecretFile = &value + return b +} + +// WithSecretRef sets the SecretRef field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SecretRef field is set to the value of the last call. +func (b *CephFSPersistentVolumeSourceApplyConfiguration) WithSecretRef(value *SecretReferenceApplyConfiguration) *CephFSPersistentVolumeSourceApplyConfiguration { + b.SecretRef = value + return b +} + +// WithReadOnly sets the ReadOnly field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadOnly field is set to the value of the last call. +func (b *CephFSPersistentVolumeSourceApplyConfiguration) WithReadOnly(value bool) *CephFSPersistentVolumeSourceApplyConfiguration { + b.ReadOnly = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/cephfsvolumesource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/cephfsvolumesource.go new file mode 100644 index 000000000000..0ea070ba5d78 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/cephfsvolumesource.go @@ -0,0 +1,86 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// CephFSVolumeSourceApplyConfiguration represents an declarative configuration of the CephFSVolumeSource type for use +// with apply. +type CephFSVolumeSourceApplyConfiguration struct { + Monitors []string `json:"monitors,omitempty"` + Path *string `json:"path,omitempty"` + User *string `json:"user,omitempty"` + SecretFile *string `json:"secretFile,omitempty"` + SecretRef *LocalObjectReferenceApplyConfiguration `json:"secretRef,omitempty"` + ReadOnly *bool `json:"readOnly,omitempty"` +} + +// CephFSVolumeSourceApplyConfiguration constructs an declarative configuration of the CephFSVolumeSource type for use with +// apply. +func CephFSVolumeSource() *CephFSVolumeSourceApplyConfiguration { + return &CephFSVolumeSourceApplyConfiguration{} +} + +// WithMonitors adds the given value to the Monitors field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Monitors field. +func (b *CephFSVolumeSourceApplyConfiguration) WithMonitors(values ...string) *CephFSVolumeSourceApplyConfiguration { + for i := range values { + b.Monitors = append(b.Monitors, values[i]) + } + return b +} + +// WithPath sets the Path field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Path field is set to the value of the last call. +func (b *CephFSVolumeSourceApplyConfiguration) WithPath(value string) *CephFSVolumeSourceApplyConfiguration { + b.Path = &value + return b +} + +// WithUser sets the User field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the User field is set to the value of the last call. +func (b *CephFSVolumeSourceApplyConfiguration) WithUser(value string) *CephFSVolumeSourceApplyConfiguration { + b.User = &value + return b +} + +// WithSecretFile sets the SecretFile field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SecretFile field is set to the value of the last call. +func (b *CephFSVolumeSourceApplyConfiguration) WithSecretFile(value string) *CephFSVolumeSourceApplyConfiguration { + b.SecretFile = &value + return b +} + +// WithSecretRef sets the SecretRef field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SecretRef field is set to the value of the last call. +func (b *CephFSVolumeSourceApplyConfiguration) WithSecretRef(value *LocalObjectReferenceApplyConfiguration) *CephFSVolumeSourceApplyConfiguration { + b.SecretRef = value + return b +} + +// WithReadOnly sets the ReadOnly field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadOnly field is set to the value of the last call. +func (b *CephFSVolumeSourceApplyConfiguration) WithReadOnly(value bool) *CephFSVolumeSourceApplyConfiguration { + b.ReadOnly = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/cinderpersistentvolumesource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/cinderpersistentvolumesource.go new file mode 100644 index 000000000000..7754cf92f7f8 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/cinderpersistentvolumesource.go @@ -0,0 +1,66 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// CinderPersistentVolumeSourceApplyConfiguration represents an declarative configuration of the CinderPersistentVolumeSource type for use +// with apply. +type CinderPersistentVolumeSourceApplyConfiguration struct { + VolumeID *string `json:"volumeID,omitempty"` + FSType *string `json:"fsType,omitempty"` + ReadOnly *bool `json:"readOnly,omitempty"` + SecretRef *SecretReferenceApplyConfiguration `json:"secretRef,omitempty"` +} + +// CinderPersistentVolumeSourceApplyConfiguration constructs an declarative configuration of the CinderPersistentVolumeSource type for use with +// apply. +func CinderPersistentVolumeSource() *CinderPersistentVolumeSourceApplyConfiguration { + return &CinderPersistentVolumeSourceApplyConfiguration{} +} + +// WithVolumeID sets the VolumeID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the VolumeID field is set to the value of the last call. +func (b *CinderPersistentVolumeSourceApplyConfiguration) WithVolumeID(value string) *CinderPersistentVolumeSourceApplyConfiguration { + b.VolumeID = &value + return b +} + +// WithFSType sets the FSType field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FSType field is set to the value of the last call. +func (b *CinderPersistentVolumeSourceApplyConfiguration) WithFSType(value string) *CinderPersistentVolumeSourceApplyConfiguration { + b.FSType = &value + return b +} + +// WithReadOnly sets the ReadOnly field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadOnly field is set to the value of the last call. +func (b *CinderPersistentVolumeSourceApplyConfiguration) WithReadOnly(value bool) *CinderPersistentVolumeSourceApplyConfiguration { + b.ReadOnly = &value + return b +} + +// WithSecretRef sets the SecretRef field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SecretRef field is set to the value of the last call. +func (b *CinderPersistentVolumeSourceApplyConfiguration) WithSecretRef(value *SecretReferenceApplyConfiguration) *CinderPersistentVolumeSourceApplyConfiguration { + b.SecretRef = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/cindervolumesource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/cindervolumesource.go new file mode 100644 index 000000000000..51271e279d45 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/cindervolumesource.go @@ -0,0 +1,66 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// CinderVolumeSourceApplyConfiguration represents an declarative configuration of the CinderVolumeSource type for use +// with apply. +type CinderVolumeSourceApplyConfiguration struct { + VolumeID *string `json:"volumeID,omitempty"` + FSType *string `json:"fsType,omitempty"` + ReadOnly *bool `json:"readOnly,omitempty"` + SecretRef *LocalObjectReferenceApplyConfiguration `json:"secretRef,omitempty"` +} + +// CinderVolumeSourceApplyConfiguration constructs an declarative configuration of the CinderVolumeSource type for use with +// apply. +func CinderVolumeSource() *CinderVolumeSourceApplyConfiguration { + return &CinderVolumeSourceApplyConfiguration{} +} + +// WithVolumeID sets the VolumeID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the VolumeID field is set to the value of the last call. +func (b *CinderVolumeSourceApplyConfiguration) WithVolumeID(value string) *CinderVolumeSourceApplyConfiguration { + b.VolumeID = &value + return b +} + +// WithFSType sets the FSType field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FSType field is set to the value of the last call. +func (b *CinderVolumeSourceApplyConfiguration) WithFSType(value string) *CinderVolumeSourceApplyConfiguration { + b.FSType = &value + return b +} + +// WithReadOnly sets the ReadOnly field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadOnly field is set to the value of the last call. +func (b *CinderVolumeSourceApplyConfiguration) WithReadOnly(value bool) *CinderVolumeSourceApplyConfiguration { + b.ReadOnly = &value + return b +} + +// WithSecretRef sets the SecretRef field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SecretRef field is set to the value of the last call. +func (b *CinderVolumeSourceApplyConfiguration) WithSecretRef(value *LocalObjectReferenceApplyConfiguration) *CinderVolumeSourceApplyConfiguration { + b.SecretRef = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/clientipconfig.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/clientipconfig.go new file mode 100644 index 000000000000..a666e8faaebf --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/clientipconfig.go @@ -0,0 +1,39 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// ClientIPConfigApplyConfiguration represents an declarative configuration of the ClientIPConfig type for use +// with apply. +type ClientIPConfigApplyConfiguration struct { + TimeoutSeconds *int32 `json:"timeoutSeconds,omitempty"` +} + +// ClientIPConfigApplyConfiguration constructs an declarative configuration of the ClientIPConfig type for use with +// apply. +func ClientIPConfig() *ClientIPConfigApplyConfiguration { + return &ClientIPConfigApplyConfiguration{} +} + +// WithTimeoutSeconds sets the TimeoutSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the TimeoutSeconds field is set to the value of the last call. +func (b *ClientIPConfigApplyConfiguration) WithTimeoutSeconds(value int32) *ClientIPConfigApplyConfiguration { + b.TimeoutSeconds = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/componentcondition.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/componentcondition.go new file mode 100644 index 000000000000..1ef65f5a0c5d --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/componentcondition.go @@ -0,0 +1,70 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/core/v1" +) + +// ComponentConditionApplyConfiguration represents an declarative configuration of the ComponentCondition type for use +// with apply. +type ComponentConditionApplyConfiguration struct { + Type *v1.ComponentConditionType `json:"type,omitempty"` + Status *v1.ConditionStatus `json:"status,omitempty"` + Message *string `json:"message,omitempty"` + Error *string `json:"error,omitempty"` +} + +// ComponentConditionApplyConfiguration constructs an declarative configuration of the ComponentCondition type for use with +// apply. +func ComponentCondition() *ComponentConditionApplyConfiguration { + return &ComponentConditionApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *ComponentConditionApplyConfiguration) WithType(value v1.ComponentConditionType) *ComponentConditionApplyConfiguration { + b.Type = &value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *ComponentConditionApplyConfiguration) WithStatus(value v1.ConditionStatus) *ComponentConditionApplyConfiguration { + b.Status = &value + return b +} + +// WithMessage sets the Message field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Message field is set to the value of the last call. +func (b *ComponentConditionApplyConfiguration) WithMessage(value string) *ComponentConditionApplyConfiguration { + b.Message = &value + return b +} + +// WithError sets the Error field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Error field is set to the value of the last call. +func (b *ComponentConditionApplyConfiguration) WithError(value string) *ComponentConditionApplyConfiguration { + b.Error = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/componentstatus.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/componentstatus.go new file mode 100644 index 000000000000..9328bdd76026 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/componentstatus.go @@ -0,0 +1,259 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + apicorev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// ComponentStatusApplyConfiguration represents an declarative configuration of the ComponentStatus type for use +// with apply. +type ComponentStatusApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Conditions []ComponentConditionApplyConfiguration `json:"conditions,omitempty"` +} + +// ComponentStatus constructs an declarative configuration of the ComponentStatus type for use with +// apply. +func ComponentStatus(name string) *ComponentStatusApplyConfiguration { + b := &ComponentStatusApplyConfiguration{} + b.WithName(name) + b.WithKind("ComponentStatus") + b.WithAPIVersion("v1") + return b +} + +// ExtractComponentStatus extracts the applied configuration owned by fieldManager from +// componentStatus. If no managedFields are found in componentStatus for fieldManager, a +// ComponentStatusApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// componentStatus must be a unmodified ComponentStatus API object that was retrieved from the Kubernetes API. +// ExtractComponentStatus provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractComponentStatus(componentStatus *apicorev1.ComponentStatus, fieldManager string) (*ComponentStatusApplyConfiguration, error) { + b := &ComponentStatusApplyConfiguration{} + err := managedfields.ExtractInto(componentStatus, internal.Parser().Type("io.k8s.api.core.v1.ComponentStatus"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(componentStatus.Name) + + b.WithKind("ComponentStatus") + b.WithAPIVersion("v1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *ComponentStatusApplyConfiguration) WithKind(value string) *ComponentStatusApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *ComponentStatusApplyConfiguration) WithAPIVersion(value string) *ComponentStatusApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ComponentStatusApplyConfiguration) WithName(value string) *ComponentStatusApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *ComponentStatusApplyConfiguration) WithGenerateName(value string) *ComponentStatusApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *ComponentStatusApplyConfiguration) WithNamespace(value string) *ComponentStatusApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *ComponentStatusApplyConfiguration) WithSelfLink(value string) *ComponentStatusApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *ComponentStatusApplyConfiguration) WithUID(value types.UID) *ComponentStatusApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *ComponentStatusApplyConfiguration) WithResourceVersion(value string) *ComponentStatusApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *ComponentStatusApplyConfiguration) WithGeneration(value int64) *ComponentStatusApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *ComponentStatusApplyConfiguration) WithCreationTimestamp(value metav1.Time) *ComponentStatusApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *ComponentStatusApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *ComponentStatusApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *ComponentStatusApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *ComponentStatusApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *ComponentStatusApplyConfiguration) WithLabels(entries map[string]string) *ComponentStatusApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *ComponentStatusApplyConfiguration) WithAnnotations(entries map[string]string) *ComponentStatusApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *ComponentStatusApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *ComponentStatusApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *ComponentStatusApplyConfiguration) WithFinalizers(values ...string) *ComponentStatusApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *ComponentStatusApplyConfiguration) WithClusterName(value string) *ComponentStatusApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *ComponentStatusApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithConditions adds the given value to the Conditions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Conditions field. +func (b *ComponentStatusApplyConfiguration) WithConditions(values ...*ComponentConditionApplyConfiguration) *ComponentStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithConditions") + } + b.Conditions = append(b.Conditions, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/configmap.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/configmap.go new file mode 100644 index 000000000000..b60f981b05ca --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/configmap.go @@ -0,0 +1,286 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// ConfigMapApplyConfiguration represents an declarative configuration of the ConfigMap type for use +// with apply. +type ConfigMapApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Immutable *bool `json:"immutable,omitempty"` + Data map[string]string `json:"data,omitempty"` + BinaryData map[string][]byte `json:"binaryData,omitempty"` +} + +// ConfigMap constructs an declarative configuration of the ConfigMap type for use with +// apply. +func ConfigMap(name, namespace string) *ConfigMapApplyConfiguration { + b := &ConfigMapApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("ConfigMap") + b.WithAPIVersion("v1") + return b +} + +// ExtractConfigMap extracts the applied configuration owned by fieldManager from +// configMap. If no managedFields are found in configMap for fieldManager, a +// ConfigMapApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// configMap must be a unmodified ConfigMap API object that was retrieved from the Kubernetes API. +// ExtractConfigMap provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractConfigMap(configMap *corev1.ConfigMap, fieldManager string) (*ConfigMapApplyConfiguration, error) { + b := &ConfigMapApplyConfiguration{} + err := managedfields.ExtractInto(configMap, internal.Parser().Type("io.k8s.api.core.v1.ConfigMap"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(configMap.Name) + b.WithNamespace(configMap.Namespace) + + b.WithKind("ConfigMap") + b.WithAPIVersion("v1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *ConfigMapApplyConfiguration) WithKind(value string) *ConfigMapApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *ConfigMapApplyConfiguration) WithAPIVersion(value string) *ConfigMapApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ConfigMapApplyConfiguration) WithName(value string) *ConfigMapApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *ConfigMapApplyConfiguration) WithGenerateName(value string) *ConfigMapApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *ConfigMapApplyConfiguration) WithNamespace(value string) *ConfigMapApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *ConfigMapApplyConfiguration) WithSelfLink(value string) *ConfigMapApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *ConfigMapApplyConfiguration) WithUID(value types.UID) *ConfigMapApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *ConfigMapApplyConfiguration) WithResourceVersion(value string) *ConfigMapApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *ConfigMapApplyConfiguration) WithGeneration(value int64) *ConfigMapApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *ConfigMapApplyConfiguration) WithCreationTimestamp(value metav1.Time) *ConfigMapApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *ConfigMapApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *ConfigMapApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *ConfigMapApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *ConfigMapApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *ConfigMapApplyConfiguration) WithLabels(entries map[string]string) *ConfigMapApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *ConfigMapApplyConfiguration) WithAnnotations(entries map[string]string) *ConfigMapApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *ConfigMapApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *ConfigMapApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *ConfigMapApplyConfiguration) WithFinalizers(values ...string) *ConfigMapApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *ConfigMapApplyConfiguration) WithClusterName(value string) *ConfigMapApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *ConfigMapApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithImmutable sets the Immutable field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Immutable field is set to the value of the last call. +func (b *ConfigMapApplyConfiguration) WithImmutable(value bool) *ConfigMapApplyConfiguration { + b.Immutable = &value + return b +} + +// WithData puts the entries into the Data field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Data field, +// overwriting an existing map entries in Data field with the same key. +func (b *ConfigMapApplyConfiguration) WithData(entries map[string]string) *ConfigMapApplyConfiguration { + if b.Data == nil && len(entries) > 0 { + b.Data = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Data[k] = v + } + return b +} + +// WithBinaryData puts the entries into the BinaryData field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the BinaryData field, +// overwriting an existing map entries in BinaryData field with the same key. +func (b *ConfigMapApplyConfiguration) WithBinaryData(entries map[string][]byte) *ConfigMapApplyConfiguration { + if b.BinaryData == nil && len(entries) > 0 { + b.BinaryData = make(map[string][]byte, len(entries)) + } + for k, v := range entries { + b.BinaryData[k] = v + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/configmapenvsource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/configmapenvsource.go new file mode 100644 index 000000000000..8802fff48fb6 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/configmapenvsource.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// ConfigMapEnvSourceApplyConfiguration represents an declarative configuration of the ConfigMapEnvSource type for use +// with apply. +type ConfigMapEnvSourceApplyConfiguration struct { + LocalObjectReferenceApplyConfiguration `json:",inline"` + Optional *bool `json:"optional,omitempty"` +} + +// ConfigMapEnvSourceApplyConfiguration constructs an declarative configuration of the ConfigMapEnvSource type for use with +// apply. +func ConfigMapEnvSource() *ConfigMapEnvSourceApplyConfiguration { + return &ConfigMapEnvSourceApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ConfigMapEnvSourceApplyConfiguration) WithName(value string) *ConfigMapEnvSourceApplyConfiguration { + b.Name = &value + return b +} + +// WithOptional sets the Optional field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Optional field is set to the value of the last call. +func (b *ConfigMapEnvSourceApplyConfiguration) WithOptional(value bool) *ConfigMapEnvSourceApplyConfiguration { + b.Optional = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/configmapkeyselector.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/configmapkeyselector.go new file mode 100644 index 000000000000..2a8c800afc7a --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/configmapkeyselector.go @@ -0,0 +1,57 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// ConfigMapKeySelectorApplyConfiguration represents an declarative configuration of the ConfigMapKeySelector type for use +// with apply. +type ConfigMapKeySelectorApplyConfiguration struct { + LocalObjectReferenceApplyConfiguration `json:",inline"` + Key *string `json:"key,omitempty"` + Optional *bool `json:"optional,omitempty"` +} + +// ConfigMapKeySelectorApplyConfiguration constructs an declarative configuration of the ConfigMapKeySelector type for use with +// apply. +func ConfigMapKeySelector() *ConfigMapKeySelectorApplyConfiguration { + return &ConfigMapKeySelectorApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ConfigMapKeySelectorApplyConfiguration) WithName(value string) *ConfigMapKeySelectorApplyConfiguration { + b.Name = &value + return b +} + +// WithKey sets the Key field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Key field is set to the value of the last call. +func (b *ConfigMapKeySelectorApplyConfiguration) WithKey(value string) *ConfigMapKeySelectorApplyConfiguration { + b.Key = &value + return b +} + +// WithOptional sets the Optional field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Optional field is set to the value of the last call. +func (b *ConfigMapKeySelectorApplyConfiguration) WithOptional(value bool) *ConfigMapKeySelectorApplyConfiguration { + b.Optional = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/configmapnodeconfigsource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/configmapnodeconfigsource.go new file mode 100644 index 000000000000..da9655a5448a --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/configmapnodeconfigsource.go @@ -0,0 +1,79 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + types "k8s.io/apimachinery/pkg/types" +) + +// ConfigMapNodeConfigSourceApplyConfiguration represents an declarative configuration of the ConfigMapNodeConfigSource type for use +// with apply. +type ConfigMapNodeConfigSourceApplyConfiguration struct { + Namespace *string `json:"namespace,omitempty"` + Name *string `json:"name,omitempty"` + UID *types.UID `json:"uid,omitempty"` + ResourceVersion *string `json:"resourceVersion,omitempty"` + KubeletConfigKey *string `json:"kubeletConfigKey,omitempty"` +} + +// ConfigMapNodeConfigSourceApplyConfiguration constructs an declarative configuration of the ConfigMapNodeConfigSource type for use with +// apply. +func ConfigMapNodeConfigSource() *ConfigMapNodeConfigSourceApplyConfiguration { + return &ConfigMapNodeConfigSourceApplyConfiguration{} +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *ConfigMapNodeConfigSourceApplyConfiguration) WithNamespace(value string) *ConfigMapNodeConfigSourceApplyConfiguration { + b.Namespace = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ConfigMapNodeConfigSourceApplyConfiguration) WithName(value string) *ConfigMapNodeConfigSourceApplyConfiguration { + b.Name = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *ConfigMapNodeConfigSourceApplyConfiguration) WithUID(value types.UID) *ConfigMapNodeConfigSourceApplyConfiguration { + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *ConfigMapNodeConfigSourceApplyConfiguration) WithResourceVersion(value string) *ConfigMapNodeConfigSourceApplyConfiguration { + b.ResourceVersion = &value + return b +} + +// WithKubeletConfigKey sets the KubeletConfigKey field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the KubeletConfigKey field is set to the value of the last call. +func (b *ConfigMapNodeConfigSourceApplyConfiguration) WithKubeletConfigKey(value string) *ConfigMapNodeConfigSourceApplyConfiguration { + b.KubeletConfigKey = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/configmapprojection.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/configmapprojection.go new file mode 100644 index 000000000000..7297d3a4379e --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/configmapprojection.go @@ -0,0 +1,62 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// ConfigMapProjectionApplyConfiguration represents an declarative configuration of the ConfigMapProjection type for use +// with apply. +type ConfigMapProjectionApplyConfiguration struct { + LocalObjectReferenceApplyConfiguration `json:",inline"` + Items []KeyToPathApplyConfiguration `json:"items,omitempty"` + Optional *bool `json:"optional,omitempty"` +} + +// ConfigMapProjectionApplyConfiguration constructs an declarative configuration of the ConfigMapProjection type for use with +// apply. +func ConfigMapProjection() *ConfigMapProjectionApplyConfiguration { + return &ConfigMapProjectionApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ConfigMapProjectionApplyConfiguration) WithName(value string) *ConfigMapProjectionApplyConfiguration { + b.Name = &value + return b +} + +// WithItems adds the given value to the Items field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Items field. +func (b *ConfigMapProjectionApplyConfiguration) WithItems(values ...*KeyToPathApplyConfiguration) *ConfigMapProjectionApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithItems") + } + b.Items = append(b.Items, *values[i]) + } + return b +} + +// WithOptional sets the Optional field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Optional field is set to the value of the last call. +func (b *ConfigMapProjectionApplyConfiguration) WithOptional(value bool) *ConfigMapProjectionApplyConfiguration { + b.Optional = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/configmapvolumesource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/configmapvolumesource.go new file mode 100644 index 000000000000..deaebde31990 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/configmapvolumesource.go @@ -0,0 +1,71 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// ConfigMapVolumeSourceApplyConfiguration represents an declarative configuration of the ConfigMapVolumeSource type for use +// with apply. +type ConfigMapVolumeSourceApplyConfiguration struct { + LocalObjectReferenceApplyConfiguration `json:",inline"` + Items []KeyToPathApplyConfiguration `json:"items,omitempty"` + DefaultMode *int32 `json:"defaultMode,omitempty"` + Optional *bool `json:"optional,omitempty"` +} + +// ConfigMapVolumeSourceApplyConfiguration constructs an declarative configuration of the ConfigMapVolumeSource type for use with +// apply. +func ConfigMapVolumeSource() *ConfigMapVolumeSourceApplyConfiguration { + return &ConfigMapVolumeSourceApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ConfigMapVolumeSourceApplyConfiguration) WithName(value string) *ConfigMapVolumeSourceApplyConfiguration { + b.Name = &value + return b +} + +// WithItems adds the given value to the Items field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Items field. +func (b *ConfigMapVolumeSourceApplyConfiguration) WithItems(values ...*KeyToPathApplyConfiguration) *ConfigMapVolumeSourceApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithItems") + } + b.Items = append(b.Items, *values[i]) + } + return b +} + +// WithDefaultMode sets the DefaultMode field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DefaultMode field is set to the value of the last call. +func (b *ConfigMapVolumeSourceApplyConfiguration) WithDefaultMode(value int32) *ConfigMapVolumeSourceApplyConfiguration { + b.DefaultMode = &value + return b +} + +// WithOptional sets the Optional field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Optional field is set to the value of the last call. +func (b *ConfigMapVolumeSourceApplyConfiguration) WithOptional(value bool) *ConfigMapVolumeSourceApplyConfiguration { + b.Optional = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/container.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/container.go new file mode 100644 index 000000000000..d3b066d9c45b --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/container.go @@ -0,0 +1,261 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + corev1 "k8s.io/api/core/v1" +) + +// ContainerApplyConfiguration represents an declarative configuration of the Container type for use +// with apply. +type ContainerApplyConfiguration struct { + Name *string `json:"name,omitempty"` + Image *string `json:"image,omitempty"` + Command []string `json:"command,omitempty"` + Args []string `json:"args,omitempty"` + WorkingDir *string `json:"workingDir,omitempty"` + Ports []ContainerPortApplyConfiguration `json:"ports,omitempty"` + EnvFrom []EnvFromSourceApplyConfiguration `json:"envFrom,omitempty"` + Env []EnvVarApplyConfiguration `json:"env,omitempty"` + Resources *ResourceRequirementsApplyConfiguration `json:"resources,omitempty"` + VolumeMounts []VolumeMountApplyConfiguration `json:"volumeMounts,omitempty"` + VolumeDevices []VolumeDeviceApplyConfiguration `json:"volumeDevices,omitempty"` + LivenessProbe *ProbeApplyConfiguration `json:"livenessProbe,omitempty"` + ReadinessProbe *ProbeApplyConfiguration `json:"readinessProbe,omitempty"` + StartupProbe *ProbeApplyConfiguration `json:"startupProbe,omitempty"` + Lifecycle *LifecycleApplyConfiguration `json:"lifecycle,omitempty"` + TerminationMessagePath *string `json:"terminationMessagePath,omitempty"` + TerminationMessagePolicy *corev1.TerminationMessagePolicy `json:"terminationMessagePolicy,omitempty"` + ImagePullPolicy *corev1.PullPolicy `json:"imagePullPolicy,omitempty"` + SecurityContext *SecurityContextApplyConfiguration `json:"securityContext,omitempty"` + Stdin *bool `json:"stdin,omitempty"` + StdinOnce *bool `json:"stdinOnce,omitempty"` + TTY *bool `json:"tty,omitempty"` +} + +// ContainerApplyConfiguration constructs an declarative configuration of the Container type for use with +// apply. +func Container() *ContainerApplyConfiguration { + return &ContainerApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ContainerApplyConfiguration) WithName(value string) *ContainerApplyConfiguration { + b.Name = &value + return b +} + +// WithImage sets the Image field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Image field is set to the value of the last call. +func (b *ContainerApplyConfiguration) WithImage(value string) *ContainerApplyConfiguration { + b.Image = &value + return b +} + +// WithCommand adds the given value to the Command field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Command field. +func (b *ContainerApplyConfiguration) WithCommand(values ...string) *ContainerApplyConfiguration { + for i := range values { + b.Command = append(b.Command, values[i]) + } + return b +} + +// WithArgs adds the given value to the Args field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Args field. +func (b *ContainerApplyConfiguration) WithArgs(values ...string) *ContainerApplyConfiguration { + for i := range values { + b.Args = append(b.Args, values[i]) + } + return b +} + +// WithWorkingDir sets the WorkingDir field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the WorkingDir field is set to the value of the last call. +func (b *ContainerApplyConfiguration) WithWorkingDir(value string) *ContainerApplyConfiguration { + b.WorkingDir = &value + return b +} + +// WithPorts adds the given value to the Ports field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Ports field. +func (b *ContainerApplyConfiguration) WithPorts(values ...*ContainerPortApplyConfiguration) *ContainerApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithPorts") + } + b.Ports = append(b.Ports, *values[i]) + } + return b +} + +// WithEnvFrom adds the given value to the EnvFrom field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the EnvFrom field. +func (b *ContainerApplyConfiguration) WithEnvFrom(values ...*EnvFromSourceApplyConfiguration) *ContainerApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithEnvFrom") + } + b.EnvFrom = append(b.EnvFrom, *values[i]) + } + return b +} + +// WithEnv adds the given value to the Env field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Env field. +func (b *ContainerApplyConfiguration) WithEnv(values ...*EnvVarApplyConfiguration) *ContainerApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithEnv") + } + b.Env = append(b.Env, *values[i]) + } + return b +} + +// WithResources sets the Resources field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Resources field is set to the value of the last call. +func (b *ContainerApplyConfiguration) WithResources(value *ResourceRequirementsApplyConfiguration) *ContainerApplyConfiguration { + b.Resources = value + return b +} + +// WithVolumeMounts adds the given value to the VolumeMounts field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the VolumeMounts field. +func (b *ContainerApplyConfiguration) WithVolumeMounts(values ...*VolumeMountApplyConfiguration) *ContainerApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithVolumeMounts") + } + b.VolumeMounts = append(b.VolumeMounts, *values[i]) + } + return b +} + +// WithVolumeDevices adds the given value to the VolumeDevices field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the VolumeDevices field. +func (b *ContainerApplyConfiguration) WithVolumeDevices(values ...*VolumeDeviceApplyConfiguration) *ContainerApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithVolumeDevices") + } + b.VolumeDevices = append(b.VolumeDevices, *values[i]) + } + return b +} + +// WithLivenessProbe sets the LivenessProbe field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LivenessProbe field is set to the value of the last call. +func (b *ContainerApplyConfiguration) WithLivenessProbe(value *ProbeApplyConfiguration) *ContainerApplyConfiguration { + b.LivenessProbe = value + return b +} + +// WithReadinessProbe sets the ReadinessProbe field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadinessProbe field is set to the value of the last call. +func (b *ContainerApplyConfiguration) WithReadinessProbe(value *ProbeApplyConfiguration) *ContainerApplyConfiguration { + b.ReadinessProbe = value + return b +} + +// WithStartupProbe sets the StartupProbe field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the StartupProbe field is set to the value of the last call. +func (b *ContainerApplyConfiguration) WithStartupProbe(value *ProbeApplyConfiguration) *ContainerApplyConfiguration { + b.StartupProbe = value + return b +} + +// WithLifecycle sets the Lifecycle field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Lifecycle field is set to the value of the last call. +func (b *ContainerApplyConfiguration) WithLifecycle(value *LifecycleApplyConfiguration) *ContainerApplyConfiguration { + b.Lifecycle = value + return b +} + +// WithTerminationMessagePath sets the TerminationMessagePath field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the TerminationMessagePath field is set to the value of the last call. +func (b *ContainerApplyConfiguration) WithTerminationMessagePath(value string) *ContainerApplyConfiguration { + b.TerminationMessagePath = &value + return b +} + +// WithTerminationMessagePolicy sets the TerminationMessagePolicy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the TerminationMessagePolicy field is set to the value of the last call. +func (b *ContainerApplyConfiguration) WithTerminationMessagePolicy(value corev1.TerminationMessagePolicy) *ContainerApplyConfiguration { + b.TerminationMessagePolicy = &value + return b +} + +// WithImagePullPolicy sets the ImagePullPolicy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ImagePullPolicy field is set to the value of the last call. +func (b *ContainerApplyConfiguration) WithImagePullPolicy(value corev1.PullPolicy) *ContainerApplyConfiguration { + b.ImagePullPolicy = &value + return b +} + +// WithSecurityContext sets the SecurityContext field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SecurityContext field is set to the value of the last call. +func (b *ContainerApplyConfiguration) WithSecurityContext(value *SecurityContextApplyConfiguration) *ContainerApplyConfiguration { + b.SecurityContext = value + return b +} + +// WithStdin sets the Stdin field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Stdin field is set to the value of the last call. +func (b *ContainerApplyConfiguration) WithStdin(value bool) *ContainerApplyConfiguration { + b.Stdin = &value + return b +} + +// WithStdinOnce sets the StdinOnce field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the StdinOnce field is set to the value of the last call. +func (b *ContainerApplyConfiguration) WithStdinOnce(value bool) *ContainerApplyConfiguration { + b.StdinOnce = &value + return b +} + +// WithTTY sets the TTY field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the TTY field is set to the value of the last call. +func (b *ContainerApplyConfiguration) WithTTY(value bool) *ContainerApplyConfiguration { + b.TTY = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/containerimage.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/containerimage.go new file mode 100644 index 000000000000..d5c874a7cec8 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/containerimage.go @@ -0,0 +1,50 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// ContainerImageApplyConfiguration represents an declarative configuration of the ContainerImage type for use +// with apply. +type ContainerImageApplyConfiguration struct { + Names []string `json:"names,omitempty"` + SizeBytes *int64 `json:"sizeBytes,omitempty"` +} + +// ContainerImageApplyConfiguration constructs an declarative configuration of the ContainerImage type for use with +// apply. +func ContainerImage() *ContainerImageApplyConfiguration { + return &ContainerImageApplyConfiguration{} +} + +// WithNames adds the given value to the Names field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Names field. +func (b *ContainerImageApplyConfiguration) WithNames(values ...string) *ContainerImageApplyConfiguration { + for i := range values { + b.Names = append(b.Names, values[i]) + } + return b +} + +// WithSizeBytes sets the SizeBytes field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SizeBytes field is set to the value of the last call. +func (b *ContainerImageApplyConfiguration) WithSizeBytes(value int64) *ContainerImageApplyConfiguration { + b.SizeBytes = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/containerport.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/containerport.go new file mode 100644 index 000000000000..a23ad9268a2f --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/containerport.go @@ -0,0 +1,79 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/core/v1" +) + +// ContainerPortApplyConfiguration represents an declarative configuration of the ContainerPort type for use +// with apply. +type ContainerPortApplyConfiguration struct { + Name *string `json:"name,omitempty"` + HostPort *int32 `json:"hostPort,omitempty"` + ContainerPort *int32 `json:"containerPort,omitempty"` + Protocol *v1.Protocol `json:"protocol,omitempty"` + HostIP *string `json:"hostIP,omitempty"` +} + +// ContainerPortApplyConfiguration constructs an declarative configuration of the ContainerPort type for use with +// apply. +func ContainerPort() *ContainerPortApplyConfiguration { + return &ContainerPortApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ContainerPortApplyConfiguration) WithName(value string) *ContainerPortApplyConfiguration { + b.Name = &value + return b +} + +// WithHostPort sets the HostPort field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the HostPort field is set to the value of the last call. +func (b *ContainerPortApplyConfiguration) WithHostPort(value int32) *ContainerPortApplyConfiguration { + b.HostPort = &value + return b +} + +// WithContainerPort sets the ContainerPort field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ContainerPort field is set to the value of the last call. +func (b *ContainerPortApplyConfiguration) WithContainerPort(value int32) *ContainerPortApplyConfiguration { + b.ContainerPort = &value + return b +} + +// WithProtocol sets the Protocol field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Protocol field is set to the value of the last call. +func (b *ContainerPortApplyConfiguration) WithProtocol(value v1.Protocol) *ContainerPortApplyConfiguration { + b.Protocol = &value + return b +} + +// WithHostIP sets the HostIP field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the HostIP field is set to the value of the last call. +func (b *ContainerPortApplyConfiguration) WithHostIP(value string) *ContainerPortApplyConfiguration { + b.HostIP = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/containerstate.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/containerstate.go new file mode 100644 index 000000000000..6cbfc7fd9bb0 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/containerstate.go @@ -0,0 +1,57 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// ContainerStateApplyConfiguration represents an declarative configuration of the ContainerState type for use +// with apply. +type ContainerStateApplyConfiguration struct { + Waiting *ContainerStateWaitingApplyConfiguration `json:"waiting,omitempty"` + Running *ContainerStateRunningApplyConfiguration `json:"running,omitempty"` + Terminated *ContainerStateTerminatedApplyConfiguration `json:"terminated,omitempty"` +} + +// ContainerStateApplyConfiguration constructs an declarative configuration of the ContainerState type for use with +// apply. +func ContainerState() *ContainerStateApplyConfiguration { + return &ContainerStateApplyConfiguration{} +} + +// WithWaiting sets the Waiting field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Waiting field is set to the value of the last call. +func (b *ContainerStateApplyConfiguration) WithWaiting(value *ContainerStateWaitingApplyConfiguration) *ContainerStateApplyConfiguration { + b.Waiting = value + return b +} + +// WithRunning sets the Running field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Running field is set to the value of the last call. +func (b *ContainerStateApplyConfiguration) WithRunning(value *ContainerStateRunningApplyConfiguration) *ContainerStateApplyConfiguration { + b.Running = value + return b +} + +// WithTerminated sets the Terminated field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Terminated field is set to the value of the last call. +func (b *ContainerStateApplyConfiguration) WithTerminated(value *ContainerStateTerminatedApplyConfiguration) *ContainerStateApplyConfiguration { + b.Terminated = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/containerstaterunning.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/containerstaterunning.go new file mode 100644 index 000000000000..6c1d7311e7a2 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/containerstaterunning.go @@ -0,0 +1,43 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// ContainerStateRunningApplyConfiguration represents an declarative configuration of the ContainerStateRunning type for use +// with apply. +type ContainerStateRunningApplyConfiguration struct { + StartedAt *v1.Time `json:"startedAt,omitempty"` +} + +// ContainerStateRunningApplyConfiguration constructs an declarative configuration of the ContainerStateRunning type for use with +// apply. +func ContainerStateRunning() *ContainerStateRunningApplyConfiguration { + return &ContainerStateRunningApplyConfiguration{} +} + +// WithStartedAt sets the StartedAt field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the StartedAt field is set to the value of the last call. +func (b *ContainerStateRunningApplyConfiguration) WithStartedAt(value v1.Time) *ContainerStateRunningApplyConfiguration { + b.StartedAt = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/containerstateterminated.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/containerstateterminated.go new file mode 100644 index 000000000000..0383c9dd9dd0 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/containerstateterminated.go @@ -0,0 +1,97 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// ContainerStateTerminatedApplyConfiguration represents an declarative configuration of the ContainerStateTerminated type for use +// with apply. +type ContainerStateTerminatedApplyConfiguration struct { + ExitCode *int32 `json:"exitCode,omitempty"` + Signal *int32 `json:"signal,omitempty"` + Reason *string `json:"reason,omitempty"` + Message *string `json:"message,omitempty"` + StartedAt *v1.Time `json:"startedAt,omitempty"` + FinishedAt *v1.Time `json:"finishedAt,omitempty"` + ContainerID *string `json:"containerID,omitempty"` +} + +// ContainerStateTerminatedApplyConfiguration constructs an declarative configuration of the ContainerStateTerminated type for use with +// apply. +func ContainerStateTerminated() *ContainerStateTerminatedApplyConfiguration { + return &ContainerStateTerminatedApplyConfiguration{} +} + +// WithExitCode sets the ExitCode field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ExitCode field is set to the value of the last call. +func (b *ContainerStateTerminatedApplyConfiguration) WithExitCode(value int32) *ContainerStateTerminatedApplyConfiguration { + b.ExitCode = &value + return b +} + +// WithSignal sets the Signal field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Signal field is set to the value of the last call. +func (b *ContainerStateTerminatedApplyConfiguration) WithSignal(value int32) *ContainerStateTerminatedApplyConfiguration { + b.Signal = &value + return b +} + +// WithReason sets the Reason field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Reason field is set to the value of the last call. +func (b *ContainerStateTerminatedApplyConfiguration) WithReason(value string) *ContainerStateTerminatedApplyConfiguration { + b.Reason = &value + return b +} + +// WithMessage sets the Message field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Message field is set to the value of the last call. +func (b *ContainerStateTerminatedApplyConfiguration) WithMessage(value string) *ContainerStateTerminatedApplyConfiguration { + b.Message = &value + return b +} + +// WithStartedAt sets the StartedAt field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the StartedAt field is set to the value of the last call. +func (b *ContainerStateTerminatedApplyConfiguration) WithStartedAt(value v1.Time) *ContainerStateTerminatedApplyConfiguration { + b.StartedAt = &value + return b +} + +// WithFinishedAt sets the FinishedAt field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FinishedAt field is set to the value of the last call. +func (b *ContainerStateTerminatedApplyConfiguration) WithFinishedAt(value v1.Time) *ContainerStateTerminatedApplyConfiguration { + b.FinishedAt = &value + return b +} + +// WithContainerID sets the ContainerID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ContainerID field is set to the value of the last call. +func (b *ContainerStateTerminatedApplyConfiguration) WithContainerID(value string) *ContainerStateTerminatedApplyConfiguration { + b.ContainerID = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/containerstatewaiting.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/containerstatewaiting.go new file mode 100644 index 000000000000..e51b778c0de7 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/containerstatewaiting.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// ContainerStateWaitingApplyConfiguration represents an declarative configuration of the ContainerStateWaiting type for use +// with apply. +type ContainerStateWaitingApplyConfiguration struct { + Reason *string `json:"reason,omitempty"` + Message *string `json:"message,omitempty"` +} + +// ContainerStateWaitingApplyConfiguration constructs an declarative configuration of the ContainerStateWaiting type for use with +// apply. +func ContainerStateWaiting() *ContainerStateWaitingApplyConfiguration { + return &ContainerStateWaitingApplyConfiguration{} +} + +// WithReason sets the Reason field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Reason field is set to the value of the last call. +func (b *ContainerStateWaitingApplyConfiguration) WithReason(value string) *ContainerStateWaitingApplyConfiguration { + b.Reason = &value + return b +} + +// WithMessage sets the Message field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Message field is set to the value of the last call. +func (b *ContainerStateWaitingApplyConfiguration) WithMessage(value string) *ContainerStateWaitingApplyConfiguration { + b.Message = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/containerstatus.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/containerstatus.go new file mode 100644 index 000000000000..18d2925c1750 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/containerstatus.go @@ -0,0 +1,111 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// ContainerStatusApplyConfiguration represents an declarative configuration of the ContainerStatus type for use +// with apply. +type ContainerStatusApplyConfiguration struct { + Name *string `json:"name,omitempty"` + State *ContainerStateApplyConfiguration `json:"state,omitempty"` + LastTerminationState *ContainerStateApplyConfiguration `json:"lastState,omitempty"` + Ready *bool `json:"ready,omitempty"` + RestartCount *int32 `json:"restartCount,omitempty"` + Image *string `json:"image,omitempty"` + ImageID *string `json:"imageID,omitempty"` + ContainerID *string `json:"containerID,omitempty"` + Started *bool `json:"started,omitempty"` +} + +// ContainerStatusApplyConfiguration constructs an declarative configuration of the ContainerStatus type for use with +// apply. +func ContainerStatus() *ContainerStatusApplyConfiguration { + return &ContainerStatusApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ContainerStatusApplyConfiguration) WithName(value string) *ContainerStatusApplyConfiguration { + b.Name = &value + return b +} + +// WithState sets the State field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the State field is set to the value of the last call. +func (b *ContainerStatusApplyConfiguration) WithState(value *ContainerStateApplyConfiguration) *ContainerStatusApplyConfiguration { + b.State = value + return b +} + +// WithLastTerminationState sets the LastTerminationState field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastTerminationState field is set to the value of the last call. +func (b *ContainerStatusApplyConfiguration) WithLastTerminationState(value *ContainerStateApplyConfiguration) *ContainerStatusApplyConfiguration { + b.LastTerminationState = value + return b +} + +// WithReady sets the Ready field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Ready field is set to the value of the last call. +func (b *ContainerStatusApplyConfiguration) WithReady(value bool) *ContainerStatusApplyConfiguration { + b.Ready = &value + return b +} + +// WithRestartCount sets the RestartCount field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RestartCount field is set to the value of the last call. +func (b *ContainerStatusApplyConfiguration) WithRestartCount(value int32) *ContainerStatusApplyConfiguration { + b.RestartCount = &value + return b +} + +// WithImage sets the Image field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Image field is set to the value of the last call. +func (b *ContainerStatusApplyConfiguration) WithImage(value string) *ContainerStatusApplyConfiguration { + b.Image = &value + return b +} + +// WithImageID sets the ImageID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ImageID field is set to the value of the last call. +func (b *ContainerStatusApplyConfiguration) WithImageID(value string) *ContainerStatusApplyConfiguration { + b.ImageID = &value + return b +} + +// WithContainerID sets the ContainerID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ContainerID field is set to the value of the last call. +func (b *ContainerStatusApplyConfiguration) WithContainerID(value string) *ContainerStatusApplyConfiguration { + b.ContainerID = &value + return b +} + +// WithStarted sets the Started field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Started field is set to the value of the last call. +func (b *ContainerStatusApplyConfiguration) WithStarted(value bool) *ContainerStatusApplyConfiguration { + b.Started = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/csipersistentvolumesource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/csipersistentvolumesource.go new file mode 100644 index 000000000000..b8165445d00f --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/csipersistentvolumesource.go @@ -0,0 +1,117 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// CSIPersistentVolumeSourceApplyConfiguration represents an declarative configuration of the CSIPersistentVolumeSource type for use +// with apply. +type CSIPersistentVolumeSourceApplyConfiguration struct { + Driver *string `json:"driver,omitempty"` + VolumeHandle *string `json:"volumeHandle,omitempty"` + ReadOnly *bool `json:"readOnly,omitempty"` + FSType *string `json:"fsType,omitempty"` + VolumeAttributes map[string]string `json:"volumeAttributes,omitempty"` + ControllerPublishSecretRef *SecretReferenceApplyConfiguration `json:"controllerPublishSecretRef,omitempty"` + NodeStageSecretRef *SecretReferenceApplyConfiguration `json:"nodeStageSecretRef,omitempty"` + NodePublishSecretRef *SecretReferenceApplyConfiguration `json:"nodePublishSecretRef,omitempty"` + ControllerExpandSecretRef *SecretReferenceApplyConfiguration `json:"controllerExpandSecretRef,omitempty"` +} + +// CSIPersistentVolumeSourceApplyConfiguration constructs an declarative configuration of the CSIPersistentVolumeSource type for use with +// apply. +func CSIPersistentVolumeSource() *CSIPersistentVolumeSourceApplyConfiguration { + return &CSIPersistentVolumeSourceApplyConfiguration{} +} + +// WithDriver sets the Driver field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Driver field is set to the value of the last call. +func (b *CSIPersistentVolumeSourceApplyConfiguration) WithDriver(value string) *CSIPersistentVolumeSourceApplyConfiguration { + b.Driver = &value + return b +} + +// WithVolumeHandle sets the VolumeHandle field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the VolumeHandle field is set to the value of the last call. +func (b *CSIPersistentVolumeSourceApplyConfiguration) WithVolumeHandle(value string) *CSIPersistentVolumeSourceApplyConfiguration { + b.VolumeHandle = &value + return b +} + +// WithReadOnly sets the ReadOnly field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadOnly field is set to the value of the last call. +func (b *CSIPersistentVolumeSourceApplyConfiguration) WithReadOnly(value bool) *CSIPersistentVolumeSourceApplyConfiguration { + b.ReadOnly = &value + return b +} + +// WithFSType sets the FSType field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FSType field is set to the value of the last call. +func (b *CSIPersistentVolumeSourceApplyConfiguration) WithFSType(value string) *CSIPersistentVolumeSourceApplyConfiguration { + b.FSType = &value + return b +} + +// WithVolumeAttributes puts the entries into the VolumeAttributes field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the VolumeAttributes field, +// overwriting an existing map entries in VolumeAttributes field with the same key. +func (b *CSIPersistentVolumeSourceApplyConfiguration) WithVolumeAttributes(entries map[string]string) *CSIPersistentVolumeSourceApplyConfiguration { + if b.VolumeAttributes == nil && len(entries) > 0 { + b.VolumeAttributes = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.VolumeAttributes[k] = v + } + return b +} + +// WithControllerPublishSecretRef sets the ControllerPublishSecretRef field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ControllerPublishSecretRef field is set to the value of the last call. +func (b *CSIPersistentVolumeSourceApplyConfiguration) WithControllerPublishSecretRef(value *SecretReferenceApplyConfiguration) *CSIPersistentVolumeSourceApplyConfiguration { + b.ControllerPublishSecretRef = value + return b +} + +// WithNodeStageSecretRef sets the NodeStageSecretRef field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NodeStageSecretRef field is set to the value of the last call. +func (b *CSIPersistentVolumeSourceApplyConfiguration) WithNodeStageSecretRef(value *SecretReferenceApplyConfiguration) *CSIPersistentVolumeSourceApplyConfiguration { + b.NodeStageSecretRef = value + return b +} + +// WithNodePublishSecretRef sets the NodePublishSecretRef field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NodePublishSecretRef field is set to the value of the last call. +func (b *CSIPersistentVolumeSourceApplyConfiguration) WithNodePublishSecretRef(value *SecretReferenceApplyConfiguration) *CSIPersistentVolumeSourceApplyConfiguration { + b.NodePublishSecretRef = value + return b +} + +// WithControllerExpandSecretRef sets the ControllerExpandSecretRef field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ControllerExpandSecretRef field is set to the value of the last call. +func (b *CSIPersistentVolumeSourceApplyConfiguration) WithControllerExpandSecretRef(value *SecretReferenceApplyConfiguration) *CSIPersistentVolumeSourceApplyConfiguration { + b.ControllerExpandSecretRef = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/csivolumesource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/csivolumesource.go new file mode 100644 index 000000000000..c2a32df8d03b --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/csivolumesource.go @@ -0,0 +1,81 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// CSIVolumeSourceApplyConfiguration represents an declarative configuration of the CSIVolumeSource type for use +// with apply. +type CSIVolumeSourceApplyConfiguration struct { + Driver *string `json:"driver,omitempty"` + ReadOnly *bool `json:"readOnly,omitempty"` + FSType *string `json:"fsType,omitempty"` + VolumeAttributes map[string]string `json:"volumeAttributes,omitempty"` + NodePublishSecretRef *LocalObjectReferenceApplyConfiguration `json:"nodePublishSecretRef,omitempty"` +} + +// CSIVolumeSourceApplyConfiguration constructs an declarative configuration of the CSIVolumeSource type for use with +// apply. +func CSIVolumeSource() *CSIVolumeSourceApplyConfiguration { + return &CSIVolumeSourceApplyConfiguration{} +} + +// WithDriver sets the Driver field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Driver field is set to the value of the last call. +func (b *CSIVolumeSourceApplyConfiguration) WithDriver(value string) *CSIVolumeSourceApplyConfiguration { + b.Driver = &value + return b +} + +// WithReadOnly sets the ReadOnly field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadOnly field is set to the value of the last call. +func (b *CSIVolumeSourceApplyConfiguration) WithReadOnly(value bool) *CSIVolumeSourceApplyConfiguration { + b.ReadOnly = &value + return b +} + +// WithFSType sets the FSType field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FSType field is set to the value of the last call. +func (b *CSIVolumeSourceApplyConfiguration) WithFSType(value string) *CSIVolumeSourceApplyConfiguration { + b.FSType = &value + return b +} + +// WithVolumeAttributes puts the entries into the VolumeAttributes field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the VolumeAttributes field, +// overwriting an existing map entries in VolumeAttributes field with the same key. +func (b *CSIVolumeSourceApplyConfiguration) WithVolumeAttributes(entries map[string]string) *CSIVolumeSourceApplyConfiguration { + if b.VolumeAttributes == nil && len(entries) > 0 { + b.VolumeAttributes = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.VolumeAttributes[k] = v + } + return b +} + +// WithNodePublishSecretRef sets the NodePublishSecretRef field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NodePublishSecretRef field is set to the value of the last call. +func (b *CSIVolumeSourceApplyConfiguration) WithNodePublishSecretRef(value *LocalObjectReferenceApplyConfiguration) *CSIVolumeSourceApplyConfiguration { + b.NodePublishSecretRef = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/daemonendpoint.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/daemonendpoint.go new file mode 100644 index 000000000000..13a2e948f1bc --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/daemonendpoint.go @@ -0,0 +1,39 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// DaemonEndpointApplyConfiguration represents an declarative configuration of the DaemonEndpoint type for use +// with apply. +type DaemonEndpointApplyConfiguration struct { + Port *int32 `json:"Port,omitempty"` +} + +// DaemonEndpointApplyConfiguration constructs an declarative configuration of the DaemonEndpoint type for use with +// apply. +func DaemonEndpoint() *DaemonEndpointApplyConfiguration { + return &DaemonEndpointApplyConfiguration{} +} + +// WithPort sets the Port field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Port field is set to the value of the last call. +func (b *DaemonEndpointApplyConfiguration) WithPort(value int32) *DaemonEndpointApplyConfiguration { + b.Port = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/downwardapiprojection.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/downwardapiprojection.go new file mode 100644 index 000000000000..f88a87c0b5ab --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/downwardapiprojection.go @@ -0,0 +1,44 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// DownwardAPIProjectionApplyConfiguration represents an declarative configuration of the DownwardAPIProjection type for use +// with apply. +type DownwardAPIProjectionApplyConfiguration struct { + Items []DownwardAPIVolumeFileApplyConfiguration `json:"items,omitempty"` +} + +// DownwardAPIProjectionApplyConfiguration constructs an declarative configuration of the DownwardAPIProjection type for use with +// apply. +func DownwardAPIProjection() *DownwardAPIProjectionApplyConfiguration { + return &DownwardAPIProjectionApplyConfiguration{} +} + +// WithItems adds the given value to the Items field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Items field. +func (b *DownwardAPIProjectionApplyConfiguration) WithItems(values ...*DownwardAPIVolumeFileApplyConfiguration) *DownwardAPIProjectionApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithItems") + } + b.Items = append(b.Items, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/downwardapivolumefile.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/downwardapivolumefile.go new file mode 100644 index 000000000000..b25ff25fa99d --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/downwardapivolumefile.go @@ -0,0 +1,66 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// DownwardAPIVolumeFileApplyConfiguration represents an declarative configuration of the DownwardAPIVolumeFile type for use +// with apply. +type DownwardAPIVolumeFileApplyConfiguration struct { + Path *string `json:"path,omitempty"` + FieldRef *ObjectFieldSelectorApplyConfiguration `json:"fieldRef,omitempty"` + ResourceFieldRef *ResourceFieldSelectorApplyConfiguration `json:"resourceFieldRef,omitempty"` + Mode *int32 `json:"mode,omitempty"` +} + +// DownwardAPIVolumeFileApplyConfiguration constructs an declarative configuration of the DownwardAPIVolumeFile type for use with +// apply. +func DownwardAPIVolumeFile() *DownwardAPIVolumeFileApplyConfiguration { + return &DownwardAPIVolumeFileApplyConfiguration{} +} + +// WithPath sets the Path field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Path field is set to the value of the last call. +func (b *DownwardAPIVolumeFileApplyConfiguration) WithPath(value string) *DownwardAPIVolumeFileApplyConfiguration { + b.Path = &value + return b +} + +// WithFieldRef sets the FieldRef field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FieldRef field is set to the value of the last call. +func (b *DownwardAPIVolumeFileApplyConfiguration) WithFieldRef(value *ObjectFieldSelectorApplyConfiguration) *DownwardAPIVolumeFileApplyConfiguration { + b.FieldRef = value + return b +} + +// WithResourceFieldRef sets the ResourceFieldRef field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceFieldRef field is set to the value of the last call. +func (b *DownwardAPIVolumeFileApplyConfiguration) WithResourceFieldRef(value *ResourceFieldSelectorApplyConfiguration) *DownwardAPIVolumeFileApplyConfiguration { + b.ResourceFieldRef = value + return b +} + +// WithMode sets the Mode field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Mode field is set to the value of the last call. +func (b *DownwardAPIVolumeFileApplyConfiguration) WithMode(value int32) *DownwardAPIVolumeFileApplyConfiguration { + b.Mode = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/downwardapivolumesource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/downwardapivolumesource.go new file mode 100644 index 000000000000..6913bb521821 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/downwardapivolumesource.go @@ -0,0 +1,53 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// DownwardAPIVolumeSourceApplyConfiguration represents an declarative configuration of the DownwardAPIVolumeSource type for use +// with apply. +type DownwardAPIVolumeSourceApplyConfiguration struct { + Items []DownwardAPIVolumeFileApplyConfiguration `json:"items,omitempty"` + DefaultMode *int32 `json:"defaultMode,omitempty"` +} + +// DownwardAPIVolumeSourceApplyConfiguration constructs an declarative configuration of the DownwardAPIVolumeSource type for use with +// apply. +func DownwardAPIVolumeSource() *DownwardAPIVolumeSourceApplyConfiguration { + return &DownwardAPIVolumeSourceApplyConfiguration{} +} + +// WithItems adds the given value to the Items field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Items field. +func (b *DownwardAPIVolumeSourceApplyConfiguration) WithItems(values ...*DownwardAPIVolumeFileApplyConfiguration) *DownwardAPIVolumeSourceApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithItems") + } + b.Items = append(b.Items, *values[i]) + } + return b +} + +// WithDefaultMode sets the DefaultMode field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DefaultMode field is set to the value of the last call. +func (b *DownwardAPIVolumeSourceApplyConfiguration) WithDefaultMode(value int32) *DownwardAPIVolumeSourceApplyConfiguration { + b.DefaultMode = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/emptydirvolumesource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/emptydirvolumesource.go new file mode 100644 index 000000000000..021280daf642 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/emptydirvolumesource.go @@ -0,0 +1,53 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/core/v1" + resource "k8s.io/apimachinery/pkg/api/resource" +) + +// EmptyDirVolumeSourceApplyConfiguration represents an declarative configuration of the EmptyDirVolumeSource type for use +// with apply. +type EmptyDirVolumeSourceApplyConfiguration struct { + Medium *v1.StorageMedium `json:"medium,omitempty"` + SizeLimit *resource.Quantity `json:"sizeLimit,omitempty"` +} + +// EmptyDirVolumeSourceApplyConfiguration constructs an declarative configuration of the EmptyDirVolumeSource type for use with +// apply. +func EmptyDirVolumeSource() *EmptyDirVolumeSourceApplyConfiguration { + return &EmptyDirVolumeSourceApplyConfiguration{} +} + +// WithMedium sets the Medium field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Medium field is set to the value of the last call. +func (b *EmptyDirVolumeSourceApplyConfiguration) WithMedium(value v1.StorageMedium) *EmptyDirVolumeSourceApplyConfiguration { + b.Medium = &value + return b +} + +// WithSizeLimit sets the SizeLimit field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SizeLimit field is set to the value of the last call. +func (b *EmptyDirVolumeSourceApplyConfiguration) WithSizeLimit(value resource.Quantity) *EmptyDirVolumeSourceApplyConfiguration { + b.SizeLimit = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/endpointaddress.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/endpointaddress.go new file mode 100644 index 000000000000..52a54b6008ac --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/endpointaddress.go @@ -0,0 +1,66 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// EndpointAddressApplyConfiguration represents an declarative configuration of the EndpointAddress type for use +// with apply. +type EndpointAddressApplyConfiguration struct { + IP *string `json:"ip,omitempty"` + Hostname *string `json:"hostname,omitempty"` + NodeName *string `json:"nodeName,omitempty"` + TargetRef *ObjectReferenceApplyConfiguration `json:"targetRef,omitempty"` +} + +// EndpointAddressApplyConfiguration constructs an declarative configuration of the EndpointAddress type for use with +// apply. +func EndpointAddress() *EndpointAddressApplyConfiguration { + return &EndpointAddressApplyConfiguration{} +} + +// WithIP sets the IP field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the IP field is set to the value of the last call. +func (b *EndpointAddressApplyConfiguration) WithIP(value string) *EndpointAddressApplyConfiguration { + b.IP = &value + return b +} + +// WithHostname sets the Hostname field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Hostname field is set to the value of the last call. +func (b *EndpointAddressApplyConfiguration) WithHostname(value string) *EndpointAddressApplyConfiguration { + b.Hostname = &value + return b +} + +// WithNodeName sets the NodeName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NodeName field is set to the value of the last call. +func (b *EndpointAddressApplyConfiguration) WithNodeName(value string) *EndpointAddressApplyConfiguration { + b.NodeName = &value + return b +} + +// WithTargetRef sets the TargetRef field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the TargetRef field is set to the value of the last call. +func (b *EndpointAddressApplyConfiguration) WithTargetRef(value *ObjectReferenceApplyConfiguration) *EndpointAddressApplyConfiguration { + b.TargetRef = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/endpointport.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/endpointport.go new file mode 100644 index 000000000000..cc00d0e4917a --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/endpointport.go @@ -0,0 +1,70 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/core/v1" +) + +// EndpointPortApplyConfiguration represents an declarative configuration of the EndpointPort type for use +// with apply. +type EndpointPortApplyConfiguration struct { + Name *string `json:"name,omitempty"` + Port *int32 `json:"port,omitempty"` + Protocol *v1.Protocol `json:"protocol,omitempty"` + AppProtocol *string `json:"appProtocol,omitempty"` +} + +// EndpointPortApplyConfiguration constructs an declarative configuration of the EndpointPort type for use with +// apply. +func EndpointPort() *EndpointPortApplyConfiguration { + return &EndpointPortApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *EndpointPortApplyConfiguration) WithName(value string) *EndpointPortApplyConfiguration { + b.Name = &value + return b +} + +// WithPort sets the Port field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Port field is set to the value of the last call. +func (b *EndpointPortApplyConfiguration) WithPort(value int32) *EndpointPortApplyConfiguration { + b.Port = &value + return b +} + +// WithProtocol sets the Protocol field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Protocol field is set to the value of the last call. +func (b *EndpointPortApplyConfiguration) WithProtocol(value v1.Protocol) *EndpointPortApplyConfiguration { + b.Protocol = &value + return b +} + +// WithAppProtocol sets the AppProtocol field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AppProtocol field is set to the value of the last call. +func (b *EndpointPortApplyConfiguration) WithAppProtocol(value string) *EndpointPortApplyConfiguration { + b.AppProtocol = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/endpoints.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/endpoints.go new file mode 100644 index 000000000000..31a541c75a29 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/endpoints.go @@ -0,0 +1,261 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + apicorev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// EndpointsApplyConfiguration represents an declarative configuration of the Endpoints type for use +// with apply. +type EndpointsApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Subsets []EndpointSubsetApplyConfiguration `json:"subsets,omitempty"` +} + +// Endpoints constructs an declarative configuration of the Endpoints type for use with +// apply. +func Endpoints(name, namespace string) *EndpointsApplyConfiguration { + b := &EndpointsApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("Endpoints") + b.WithAPIVersion("v1") + return b +} + +// ExtractEndpoints extracts the applied configuration owned by fieldManager from +// endpoints. If no managedFields are found in endpoints for fieldManager, a +// EndpointsApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// endpoints must be a unmodified Endpoints API object that was retrieved from the Kubernetes API. +// ExtractEndpoints provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractEndpoints(endpoints *apicorev1.Endpoints, fieldManager string) (*EndpointsApplyConfiguration, error) { + b := &EndpointsApplyConfiguration{} + err := managedfields.ExtractInto(endpoints, internal.Parser().Type("io.k8s.api.core.v1.Endpoints"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(endpoints.Name) + b.WithNamespace(endpoints.Namespace) + + b.WithKind("Endpoints") + b.WithAPIVersion("v1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *EndpointsApplyConfiguration) WithKind(value string) *EndpointsApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *EndpointsApplyConfiguration) WithAPIVersion(value string) *EndpointsApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *EndpointsApplyConfiguration) WithName(value string) *EndpointsApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *EndpointsApplyConfiguration) WithGenerateName(value string) *EndpointsApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *EndpointsApplyConfiguration) WithNamespace(value string) *EndpointsApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *EndpointsApplyConfiguration) WithSelfLink(value string) *EndpointsApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *EndpointsApplyConfiguration) WithUID(value types.UID) *EndpointsApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *EndpointsApplyConfiguration) WithResourceVersion(value string) *EndpointsApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *EndpointsApplyConfiguration) WithGeneration(value int64) *EndpointsApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *EndpointsApplyConfiguration) WithCreationTimestamp(value metav1.Time) *EndpointsApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *EndpointsApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *EndpointsApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *EndpointsApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *EndpointsApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *EndpointsApplyConfiguration) WithLabels(entries map[string]string) *EndpointsApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *EndpointsApplyConfiguration) WithAnnotations(entries map[string]string) *EndpointsApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *EndpointsApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *EndpointsApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *EndpointsApplyConfiguration) WithFinalizers(values ...string) *EndpointsApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *EndpointsApplyConfiguration) WithClusterName(value string) *EndpointsApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *EndpointsApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSubsets adds the given value to the Subsets field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Subsets field. +func (b *EndpointsApplyConfiguration) WithSubsets(values ...*EndpointSubsetApplyConfiguration) *EndpointsApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithSubsets") + } + b.Subsets = append(b.Subsets, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/endpointsubset.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/endpointsubset.go new file mode 100644 index 000000000000..cd0657a80ce0 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/endpointsubset.go @@ -0,0 +1,72 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// EndpointSubsetApplyConfiguration represents an declarative configuration of the EndpointSubset type for use +// with apply. +type EndpointSubsetApplyConfiguration struct { + Addresses []EndpointAddressApplyConfiguration `json:"addresses,omitempty"` + NotReadyAddresses []EndpointAddressApplyConfiguration `json:"notReadyAddresses,omitempty"` + Ports []EndpointPortApplyConfiguration `json:"ports,omitempty"` +} + +// EndpointSubsetApplyConfiguration constructs an declarative configuration of the EndpointSubset type for use with +// apply. +func EndpointSubset() *EndpointSubsetApplyConfiguration { + return &EndpointSubsetApplyConfiguration{} +} + +// WithAddresses adds the given value to the Addresses field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Addresses field. +func (b *EndpointSubsetApplyConfiguration) WithAddresses(values ...*EndpointAddressApplyConfiguration) *EndpointSubsetApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithAddresses") + } + b.Addresses = append(b.Addresses, *values[i]) + } + return b +} + +// WithNotReadyAddresses adds the given value to the NotReadyAddresses field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the NotReadyAddresses field. +func (b *EndpointSubsetApplyConfiguration) WithNotReadyAddresses(values ...*EndpointAddressApplyConfiguration) *EndpointSubsetApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithNotReadyAddresses") + } + b.NotReadyAddresses = append(b.NotReadyAddresses, *values[i]) + } + return b +} + +// WithPorts adds the given value to the Ports field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Ports field. +func (b *EndpointSubsetApplyConfiguration) WithPorts(values ...*EndpointPortApplyConfiguration) *EndpointSubsetApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithPorts") + } + b.Ports = append(b.Ports, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/envfromsource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/envfromsource.go new file mode 100644 index 000000000000..9e46d25ded7f --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/envfromsource.go @@ -0,0 +1,57 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// EnvFromSourceApplyConfiguration represents an declarative configuration of the EnvFromSource type for use +// with apply. +type EnvFromSourceApplyConfiguration struct { + Prefix *string `json:"prefix,omitempty"` + ConfigMapRef *ConfigMapEnvSourceApplyConfiguration `json:"configMapRef,omitempty"` + SecretRef *SecretEnvSourceApplyConfiguration `json:"secretRef,omitempty"` +} + +// EnvFromSourceApplyConfiguration constructs an declarative configuration of the EnvFromSource type for use with +// apply. +func EnvFromSource() *EnvFromSourceApplyConfiguration { + return &EnvFromSourceApplyConfiguration{} +} + +// WithPrefix sets the Prefix field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Prefix field is set to the value of the last call. +func (b *EnvFromSourceApplyConfiguration) WithPrefix(value string) *EnvFromSourceApplyConfiguration { + b.Prefix = &value + return b +} + +// WithConfigMapRef sets the ConfigMapRef field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ConfigMapRef field is set to the value of the last call. +func (b *EnvFromSourceApplyConfiguration) WithConfigMapRef(value *ConfigMapEnvSourceApplyConfiguration) *EnvFromSourceApplyConfiguration { + b.ConfigMapRef = value + return b +} + +// WithSecretRef sets the SecretRef field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SecretRef field is set to the value of the last call. +func (b *EnvFromSourceApplyConfiguration) WithSecretRef(value *SecretEnvSourceApplyConfiguration) *EnvFromSourceApplyConfiguration { + b.SecretRef = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/envvar.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/envvar.go new file mode 100644 index 000000000000..a83528a28e48 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/envvar.go @@ -0,0 +1,57 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// EnvVarApplyConfiguration represents an declarative configuration of the EnvVar type for use +// with apply. +type EnvVarApplyConfiguration struct { + Name *string `json:"name,omitempty"` + Value *string `json:"value,omitempty"` + ValueFrom *EnvVarSourceApplyConfiguration `json:"valueFrom,omitempty"` +} + +// EnvVarApplyConfiguration constructs an declarative configuration of the EnvVar type for use with +// apply. +func EnvVar() *EnvVarApplyConfiguration { + return &EnvVarApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *EnvVarApplyConfiguration) WithName(value string) *EnvVarApplyConfiguration { + b.Name = &value + return b +} + +// WithValue sets the Value field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Value field is set to the value of the last call. +func (b *EnvVarApplyConfiguration) WithValue(value string) *EnvVarApplyConfiguration { + b.Value = &value + return b +} + +// WithValueFrom sets the ValueFrom field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ValueFrom field is set to the value of the last call. +func (b *EnvVarApplyConfiguration) WithValueFrom(value *EnvVarSourceApplyConfiguration) *EnvVarApplyConfiguration { + b.ValueFrom = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/envvarsource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/envvarsource.go new file mode 100644 index 000000000000..70c695bd5bb0 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/envvarsource.go @@ -0,0 +1,66 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// EnvVarSourceApplyConfiguration represents an declarative configuration of the EnvVarSource type for use +// with apply. +type EnvVarSourceApplyConfiguration struct { + FieldRef *ObjectFieldSelectorApplyConfiguration `json:"fieldRef,omitempty"` + ResourceFieldRef *ResourceFieldSelectorApplyConfiguration `json:"resourceFieldRef,omitempty"` + ConfigMapKeyRef *ConfigMapKeySelectorApplyConfiguration `json:"configMapKeyRef,omitempty"` + SecretKeyRef *SecretKeySelectorApplyConfiguration `json:"secretKeyRef,omitempty"` +} + +// EnvVarSourceApplyConfiguration constructs an declarative configuration of the EnvVarSource type for use with +// apply. +func EnvVarSource() *EnvVarSourceApplyConfiguration { + return &EnvVarSourceApplyConfiguration{} +} + +// WithFieldRef sets the FieldRef field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FieldRef field is set to the value of the last call. +func (b *EnvVarSourceApplyConfiguration) WithFieldRef(value *ObjectFieldSelectorApplyConfiguration) *EnvVarSourceApplyConfiguration { + b.FieldRef = value + return b +} + +// WithResourceFieldRef sets the ResourceFieldRef field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceFieldRef field is set to the value of the last call. +func (b *EnvVarSourceApplyConfiguration) WithResourceFieldRef(value *ResourceFieldSelectorApplyConfiguration) *EnvVarSourceApplyConfiguration { + b.ResourceFieldRef = value + return b +} + +// WithConfigMapKeyRef sets the ConfigMapKeyRef field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ConfigMapKeyRef field is set to the value of the last call. +func (b *EnvVarSourceApplyConfiguration) WithConfigMapKeyRef(value *ConfigMapKeySelectorApplyConfiguration) *EnvVarSourceApplyConfiguration { + b.ConfigMapKeyRef = value + return b +} + +// WithSecretKeyRef sets the SecretKeyRef field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SecretKeyRef field is set to the value of the last call. +func (b *EnvVarSourceApplyConfiguration) WithSecretKeyRef(value *SecretKeySelectorApplyConfiguration) *EnvVarSourceApplyConfiguration { + b.SecretKeyRef = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/ephemeralcontainer.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/ephemeralcontainer.go new file mode 100644 index 000000000000..6c24cd419d35 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/ephemeralcontainer.go @@ -0,0 +1,249 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + corev1 "k8s.io/api/core/v1" +) + +// EphemeralContainerApplyConfiguration represents an declarative configuration of the EphemeralContainer type for use +// with apply. +type EphemeralContainerApplyConfiguration struct { + EphemeralContainerCommonApplyConfiguration `json:",inline"` + TargetContainerName *string `json:"targetContainerName,omitempty"` +} + +// EphemeralContainerApplyConfiguration constructs an declarative configuration of the EphemeralContainer type for use with +// apply. +func EphemeralContainer() *EphemeralContainerApplyConfiguration { + return &EphemeralContainerApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *EphemeralContainerApplyConfiguration) WithName(value string) *EphemeralContainerApplyConfiguration { + b.Name = &value + return b +} + +// WithImage sets the Image field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Image field is set to the value of the last call. +func (b *EphemeralContainerApplyConfiguration) WithImage(value string) *EphemeralContainerApplyConfiguration { + b.Image = &value + return b +} + +// WithCommand adds the given value to the Command field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Command field. +func (b *EphemeralContainerApplyConfiguration) WithCommand(values ...string) *EphemeralContainerApplyConfiguration { + for i := range values { + b.Command = append(b.Command, values[i]) + } + return b +} + +// WithArgs adds the given value to the Args field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Args field. +func (b *EphemeralContainerApplyConfiguration) WithArgs(values ...string) *EphemeralContainerApplyConfiguration { + for i := range values { + b.Args = append(b.Args, values[i]) + } + return b +} + +// WithWorkingDir sets the WorkingDir field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the WorkingDir field is set to the value of the last call. +func (b *EphemeralContainerApplyConfiguration) WithWorkingDir(value string) *EphemeralContainerApplyConfiguration { + b.WorkingDir = &value + return b +} + +// WithPorts adds the given value to the Ports field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Ports field. +func (b *EphemeralContainerApplyConfiguration) WithPorts(values ...*ContainerPortApplyConfiguration) *EphemeralContainerApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithPorts") + } + b.Ports = append(b.Ports, *values[i]) + } + return b +} + +// WithEnvFrom adds the given value to the EnvFrom field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the EnvFrom field. +func (b *EphemeralContainerApplyConfiguration) WithEnvFrom(values ...*EnvFromSourceApplyConfiguration) *EphemeralContainerApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithEnvFrom") + } + b.EnvFrom = append(b.EnvFrom, *values[i]) + } + return b +} + +// WithEnv adds the given value to the Env field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Env field. +func (b *EphemeralContainerApplyConfiguration) WithEnv(values ...*EnvVarApplyConfiguration) *EphemeralContainerApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithEnv") + } + b.Env = append(b.Env, *values[i]) + } + return b +} + +// WithResources sets the Resources field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Resources field is set to the value of the last call. +func (b *EphemeralContainerApplyConfiguration) WithResources(value *ResourceRequirementsApplyConfiguration) *EphemeralContainerApplyConfiguration { + b.Resources = value + return b +} + +// WithVolumeMounts adds the given value to the VolumeMounts field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the VolumeMounts field. +func (b *EphemeralContainerApplyConfiguration) WithVolumeMounts(values ...*VolumeMountApplyConfiguration) *EphemeralContainerApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithVolumeMounts") + } + b.VolumeMounts = append(b.VolumeMounts, *values[i]) + } + return b +} + +// WithVolumeDevices adds the given value to the VolumeDevices field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the VolumeDevices field. +func (b *EphemeralContainerApplyConfiguration) WithVolumeDevices(values ...*VolumeDeviceApplyConfiguration) *EphemeralContainerApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithVolumeDevices") + } + b.VolumeDevices = append(b.VolumeDevices, *values[i]) + } + return b +} + +// WithLivenessProbe sets the LivenessProbe field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LivenessProbe field is set to the value of the last call. +func (b *EphemeralContainerApplyConfiguration) WithLivenessProbe(value *ProbeApplyConfiguration) *EphemeralContainerApplyConfiguration { + b.LivenessProbe = value + return b +} + +// WithReadinessProbe sets the ReadinessProbe field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadinessProbe field is set to the value of the last call. +func (b *EphemeralContainerApplyConfiguration) WithReadinessProbe(value *ProbeApplyConfiguration) *EphemeralContainerApplyConfiguration { + b.ReadinessProbe = value + return b +} + +// WithStartupProbe sets the StartupProbe field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the StartupProbe field is set to the value of the last call. +func (b *EphemeralContainerApplyConfiguration) WithStartupProbe(value *ProbeApplyConfiguration) *EphemeralContainerApplyConfiguration { + b.StartupProbe = value + return b +} + +// WithLifecycle sets the Lifecycle field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Lifecycle field is set to the value of the last call. +func (b *EphemeralContainerApplyConfiguration) WithLifecycle(value *LifecycleApplyConfiguration) *EphemeralContainerApplyConfiguration { + b.Lifecycle = value + return b +} + +// WithTerminationMessagePath sets the TerminationMessagePath field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the TerminationMessagePath field is set to the value of the last call. +func (b *EphemeralContainerApplyConfiguration) WithTerminationMessagePath(value string) *EphemeralContainerApplyConfiguration { + b.TerminationMessagePath = &value + return b +} + +// WithTerminationMessagePolicy sets the TerminationMessagePolicy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the TerminationMessagePolicy field is set to the value of the last call. +func (b *EphemeralContainerApplyConfiguration) WithTerminationMessagePolicy(value corev1.TerminationMessagePolicy) *EphemeralContainerApplyConfiguration { + b.TerminationMessagePolicy = &value + return b +} + +// WithImagePullPolicy sets the ImagePullPolicy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ImagePullPolicy field is set to the value of the last call. +func (b *EphemeralContainerApplyConfiguration) WithImagePullPolicy(value corev1.PullPolicy) *EphemeralContainerApplyConfiguration { + b.ImagePullPolicy = &value + return b +} + +// WithSecurityContext sets the SecurityContext field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SecurityContext field is set to the value of the last call. +func (b *EphemeralContainerApplyConfiguration) WithSecurityContext(value *SecurityContextApplyConfiguration) *EphemeralContainerApplyConfiguration { + b.SecurityContext = value + return b +} + +// WithStdin sets the Stdin field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Stdin field is set to the value of the last call. +func (b *EphemeralContainerApplyConfiguration) WithStdin(value bool) *EphemeralContainerApplyConfiguration { + b.Stdin = &value + return b +} + +// WithStdinOnce sets the StdinOnce field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the StdinOnce field is set to the value of the last call. +func (b *EphemeralContainerApplyConfiguration) WithStdinOnce(value bool) *EphemeralContainerApplyConfiguration { + b.StdinOnce = &value + return b +} + +// WithTTY sets the TTY field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the TTY field is set to the value of the last call. +func (b *EphemeralContainerApplyConfiguration) WithTTY(value bool) *EphemeralContainerApplyConfiguration { + b.TTY = &value + return b +} + +// WithTargetContainerName sets the TargetContainerName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the TargetContainerName field is set to the value of the last call. +func (b *EphemeralContainerApplyConfiguration) WithTargetContainerName(value string) *EphemeralContainerApplyConfiguration { + b.TargetContainerName = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/ephemeralcontainercommon.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/ephemeralcontainercommon.go new file mode 100644 index 000000000000..67e658cfab71 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/ephemeralcontainercommon.go @@ -0,0 +1,261 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + corev1 "k8s.io/api/core/v1" +) + +// EphemeralContainerCommonApplyConfiguration represents an declarative configuration of the EphemeralContainerCommon type for use +// with apply. +type EphemeralContainerCommonApplyConfiguration struct { + Name *string `json:"name,omitempty"` + Image *string `json:"image,omitempty"` + Command []string `json:"command,omitempty"` + Args []string `json:"args,omitempty"` + WorkingDir *string `json:"workingDir,omitempty"` + Ports []ContainerPortApplyConfiguration `json:"ports,omitempty"` + EnvFrom []EnvFromSourceApplyConfiguration `json:"envFrom,omitempty"` + Env []EnvVarApplyConfiguration `json:"env,omitempty"` + Resources *ResourceRequirementsApplyConfiguration `json:"resources,omitempty"` + VolumeMounts []VolumeMountApplyConfiguration `json:"volumeMounts,omitempty"` + VolumeDevices []VolumeDeviceApplyConfiguration `json:"volumeDevices,omitempty"` + LivenessProbe *ProbeApplyConfiguration `json:"livenessProbe,omitempty"` + ReadinessProbe *ProbeApplyConfiguration `json:"readinessProbe,omitempty"` + StartupProbe *ProbeApplyConfiguration `json:"startupProbe,omitempty"` + Lifecycle *LifecycleApplyConfiguration `json:"lifecycle,omitempty"` + TerminationMessagePath *string `json:"terminationMessagePath,omitempty"` + TerminationMessagePolicy *corev1.TerminationMessagePolicy `json:"terminationMessagePolicy,omitempty"` + ImagePullPolicy *corev1.PullPolicy `json:"imagePullPolicy,omitempty"` + SecurityContext *SecurityContextApplyConfiguration `json:"securityContext,omitempty"` + Stdin *bool `json:"stdin,omitempty"` + StdinOnce *bool `json:"stdinOnce,omitempty"` + TTY *bool `json:"tty,omitempty"` +} + +// EphemeralContainerCommonApplyConfiguration constructs an declarative configuration of the EphemeralContainerCommon type for use with +// apply. +func EphemeralContainerCommon() *EphemeralContainerCommonApplyConfiguration { + return &EphemeralContainerCommonApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *EphemeralContainerCommonApplyConfiguration) WithName(value string) *EphemeralContainerCommonApplyConfiguration { + b.Name = &value + return b +} + +// WithImage sets the Image field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Image field is set to the value of the last call. +func (b *EphemeralContainerCommonApplyConfiguration) WithImage(value string) *EphemeralContainerCommonApplyConfiguration { + b.Image = &value + return b +} + +// WithCommand adds the given value to the Command field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Command field. +func (b *EphemeralContainerCommonApplyConfiguration) WithCommand(values ...string) *EphemeralContainerCommonApplyConfiguration { + for i := range values { + b.Command = append(b.Command, values[i]) + } + return b +} + +// WithArgs adds the given value to the Args field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Args field. +func (b *EphemeralContainerCommonApplyConfiguration) WithArgs(values ...string) *EphemeralContainerCommonApplyConfiguration { + for i := range values { + b.Args = append(b.Args, values[i]) + } + return b +} + +// WithWorkingDir sets the WorkingDir field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the WorkingDir field is set to the value of the last call. +func (b *EphemeralContainerCommonApplyConfiguration) WithWorkingDir(value string) *EphemeralContainerCommonApplyConfiguration { + b.WorkingDir = &value + return b +} + +// WithPorts adds the given value to the Ports field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Ports field. +func (b *EphemeralContainerCommonApplyConfiguration) WithPorts(values ...*ContainerPortApplyConfiguration) *EphemeralContainerCommonApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithPorts") + } + b.Ports = append(b.Ports, *values[i]) + } + return b +} + +// WithEnvFrom adds the given value to the EnvFrom field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the EnvFrom field. +func (b *EphemeralContainerCommonApplyConfiguration) WithEnvFrom(values ...*EnvFromSourceApplyConfiguration) *EphemeralContainerCommonApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithEnvFrom") + } + b.EnvFrom = append(b.EnvFrom, *values[i]) + } + return b +} + +// WithEnv adds the given value to the Env field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Env field. +func (b *EphemeralContainerCommonApplyConfiguration) WithEnv(values ...*EnvVarApplyConfiguration) *EphemeralContainerCommonApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithEnv") + } + b.Env = append(b.Env, *values[i]) + } + return b +} + +// WithResources sets the Resources field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Resources field is set to the value of the last call. +func (b *EphemeralContainerCommonApplyConfiguration) WithResources(value *ResourceRequirementsApplyConfiguration) *EphemeralContainerCommonApplyConfiguration { + b.Resources = value + return b +} + +// WithVolumeMounts adds the given value to the VolumeMounts field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the VolumeMounts field. +func (b *EphemeralContainerCommonApplyConfiguration) WithVolumeMounts(values ...*VolumeMountApplyConfiguration) *EphemeralContainerCommonApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithVolumeMounts") + } + b.VolumeMounts = append(b.VolumeMounts, *values[i]) + } + return b +} + +// WithVolumeDevices adds the given value to the VolumeDevices field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the VolumeDevices field. +func (b *EphemeralContainerCommonApplyConfiguration) WithVolumeDevices(values ...*VolumeDeviceApplyConfiguration) *EphemeralContainerCommonApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithVolumeDevices") + } + b.VolumeDevices = append(b.VolumeDevices, *values[i]) + } + return b +} + +// WithLivenessProbe sets the LivenessProbe field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LivenessProbe field is set to the value of the last call. +func (b *EphemeralContainerCommonApplyConfiguration) WithLivenessProbe(value *ProbeApplyConfiguration) *EphemeralContainerCommonApplyConfiguration { + b.LivenessProbe = value + return b +} + +// WithReadinessProbe sets the ReadinessProbe field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadinessProbe field is set to the value of the last call. +func (b *EphemeralContainerCommonApplyConfiguration) WithReadinessProbe(value *ProbeApplyConfiguration) *EphemeralContainerCommonApplyConfiguration { + b.ReadinessProbe = value + return b +} + +// WithStartupProbe sets the StartupProbe field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the StartupProbe field is set to the value of the last call. +func (b *EphemeralContainerCommonApplyConfiguration) WithStartupProbe(value *ProbeApplyConfiguration) *EphemeralContainerCommonApplyConfiguration { + b.StartupProbe = value + return b +} + +// WithLifecycle sets the Lifecycle field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Lifecycle field is set to the value of the last call. +func (b *EphemeralContainerCommonApplyConfiguration) WithLifecycle(value *LifecycleApplyConfiguration) *EphemeralContainerCommonApplyConfiguration { + b.Lifecycle = value + return b +} + +// WithTerminationMessagePath sets the TerminationMessagePath field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the TerminationMessagePath field is set to the value of the last call. +func (b *EphemeralContainerCommonApplyConfiguration) WithTerminationMessagePath(value string) *EphemeralContainerCommonApplyConfiguration { + b.TerminationMessagePath = &value + return b +} + +// WithTerminationMessagePolicy sets the TerminationMessagePolicy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the TerminationMessagePolicy field is set to the value of the last call. +func (b *EphemeralContainerCommonApplyConfiguration) WithTerminationMessagePolicy(value corev1.TerminationMessagePolicy) *EphemeralContainerCommonApplyConfiguration { + b.TerminationMessagePolicy = &value + return b +} + +// WithImagePullPolicy sets the ImagePullPolicy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ImagePullPolicy field is set to the value of the last call. +func (b *EphemeralContainerCommonApplyConfiguration) WithImagePullPolicy(value corev1.PullPolicy) *EphemeralContainerCommonApplyConfiguration { + b.ImagePullPolicy = &value + return b +} + +// WithSecurityContext sets the SecurityContext field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SecurityContext field is set to the value of the last call. +func (b *EphemeralContainerCommonApplyConfiguration) WithSecurityContext(value *SecurityContextApplyConfiguration) *EphemeralContainerCommonApplyConfiguration { + b.SecurityContext = value + return b +} + +// WithStdin sets the Stdin field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Stdin field is set to the value of the last call. +func (b *EphemeralContainerCommonApplyConfiguration) WithStdin(value bool) *EphemeralContainerCommonApplyConfiguration { + b.Stdin = &value + return b +} + +// WithStdinOnce sets the StdinOnce field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the StdinOnce field is set to the value of the last call. +func (b *EphemeralContainerCommonApplyConfiguration) WithStdinOnce(value bool) *EphemeralContainerCommonApplyConfiguration { + b.StdinOnce = &value + return b +} + +// WithTTY sets the TTY field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the TTY field is set to the value of the last call. +func (b *EphemeralContainerCommonApplyConfiguration) WithTTY(value bool) *EphemeralContainerCommonApplyConfiguration { + b.TTY = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/ephemeralvolumesource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/ephemeralvolumesource.go new file mode 100644 index 000000000000..31859404ccff --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/ephemeralvolumesource.go @@ -0,0 +1,39 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// EphemeralVolumeSourceApplyConfiguration represents an declarative configuration of the EphemeralVolumeSource type for use +// with apply. +type EphemeralVolumeSourceApplyConfiguration struct { + VolumeClaimTemplate *PersistentVolumeClaimTemplateApplyConfiguration `json:"volumeClaimTemplate,omitempty"` +} + +// EphemeralVolumeSourceApplyConfiguration constructs an declarative configuration of the EphemeralVolumeSource type for use with +// apply. +func EphemeralVolumeSource() *EphemeralVolumeSourceApplyConfiguration { + return &EphemeralVolumeSourceApplyConfiguration{} +} + +// WithVolumeClaimTemplate sets the VolumeClaimTemplate field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the VolumeClaimTemplate field is set to the value of the last call. +func (b *EphemeralVolumeSourceApplyConfiguration) WithVolumeClaimTemplate(value *PersistentVolumeClaimTemplateApplyConfiguration) *EphemeralVolumeSourceApplyConfiguration { + b.VolumeClaimTemplate = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/event.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/event.go new file mode 100644 index 000000000000..bd39a0fb0831 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/event.go @@ -0,0 +1,373 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + apicorev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// EventApplyConfiguration represents an declarative configuration of the Event type for use +// with apply. +type EventApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + InvolvedObject *ObjectReferenceApplyConfiguration `json:"involvedObject,omitempty"` + Reason *string `json:"reason,omitempty"` + Message *string `json:"message,omitempty"` + Source *EventSourceApplyConfiguration `json:"source,omitempty"` + FirstTimestamp *metav1.Time `json:"firstTimestamp,omitempty"` + LastTimestamp *metav1.Time `json:"lastTimestamp,omitempty"` + Count *int32 `json:"count,omitempty"` + Type *string `json:"type,omitempty"` + EventTime *metav1.MicroTime `json:"eventTime,omitempty"` + Series *EventSeriesApplyConfiguration `json:"series,omitempty"` + Action *string `json:"action,omitempty"` + Related *ObjectReferenceApplyConfiguration `json:"related,omitempty"` + ReportingController *string `json:"reportingComponent,omitempty"` + ReportingInstance *string `json:"reportingInstance,omitempty"` +} + +// Event constructs an declarative configuration of the Event type for use with +// apply. +func Event(name, namespace string) *EventApplyConfiguration { + b := &EventApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("Event") + b.WithAPIVersion("v1") + return b +} + +// ExtractEvent extracts the applied configuration owned by fieldManager from +// event. If no managedFields are found in event for fieldManager, a +// EventApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// event must be a unmodified Event API object that was retrieved from the Kubernetes API. +// ExtractEvent provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractEvent(event *apicorev1.Event, fieldManager string) (*EventApplyConfiguration, error) { + b := &EventApplyConfiguration{} + err := managedfields.ExtractInto(event, internal.Parser().Type("io.k8s.api.core.v1.Event"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(event.Name) + b.WithNamespace(event.Namespace) + + b.WithKind("Event") + b.WithAPIVersion("v1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *EventApplyConfiguration) WithKind(value string) *EventApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *EventApplyConfiguration) WithAPIVersion(value string) *EventApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *EventApplyConfiguration) WithName(value string) *EventApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *EventApplyConfiguration) WithGenerateName(value string) *EventApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *EventApplyConfiguration) WithNamespace(value string) *EventApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *EventApplyConfiguration) WithSelfLink(value string) *EventApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *EventApplyConfiguration) WithUID(value types.UID) *EventApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *EventApplyConfiguration) WithResourceVersion(value string) *EventApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *EventApplyConfiguration) WithGeneration(value int64) *EventApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *EventApplyConfiguration) WithCreationTimestamp(value metav1.Time) *EventApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *EventApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *EventApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *EventApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *EventApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *EventApplyConfiguration) WithLabels(entries map[string]string) *EventApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *EventApplyConfiguration) WithAnnotations(entries map[string]string) *EventApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *EventApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *EventApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *EventApplyConfiguration) WithFinalizers(values ...string) *EventApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *EventApplyConfiguration) WithClusterName(value string) *EventApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *EventApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithInvolvedObject sets the InvolvedObject field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the InvolvedObject field is set to the value of the last call. +func (b *EventApplyConfiguration) WithInvolvedObject(value *ObjectReferenceApplyConfiguration) *EventApplyConfiguration { + b.InvolvedObject = value + return b +} + +// WithReason sets the Reason field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Reason field is set to the value of the last call. +func (b *EventApplyConfiguration) WithReason(value string) *EventApplyConfiguration { + b.Reason = &value + return b +} + +// WithMessage sets the Message field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Message field is set to the value of the last call. +func (b *EventApplyConfiguration) WithMessage(value string) *EventApplyConfiguration { + b.Message = &value + return b +} + +// WithSource sets the Source field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Source field is set to the value of the last call. +func (b *EventApplyConfiguration) WithSource(value *EventSourceApplyConfiguration) *EventApplyConfiguration { + b.Source = value + return b +} + +// WithFirstTimestamp sets the FirstTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FirstTimestamp field is set to the value of the last call. +func (b *EventApplyConfiguration) WithFirstTimestamp(value metav1.Time) *EventApplyConfiguration { + b.FirstTimestamp = &value + return b +} + +// WithLastTimestamp sets the LastTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastTimestamp field is set to the value of the last call. +func (b *EventApplyConfiguration) WithLastTimestamp(value metav1.Time) *EventApplyConfiguration { + b.LastTimestamp = &value + return b +} + +// WithCount sets the Count field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Count field is set to the value of the last call. +func (b *EventApplyConfiguration) WithCount(value int32) *EventApplyConfiguration { + b.Count = &value + return b +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *EventApplyConfiguration) WithType(value string) *EventApplyConfiguration { + b.Type = &value + return b +} + +// WithEventTime sets the EventTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the EventTime field is set to the value of the last call. +func (b *EventApplyConfiguration) WithEventTime(value metav1.MicroTime) *EventApplyConfiguration { + b.EventTime = &value + return b +} + +// WithSeries sets the Series field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Series field is set to the value of the last call. +func (b *EventApplyConfiguration) WithSeries(value *EventSeriesApplyConfiguration) *EventApplyConfiguration { + b.Series = value + return b +} + +// WithAction sets the Action field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Action field is set to the value of the last call. +func (b *EventApplyConfiguration) WithAction(value string) *EventApplyConfiguration { + b.Action = &value + return b +} + +// WithRelated sets the Related field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Related field is set to the value of the last call. +func (b *EventApplyConfiguration) WithRelated(value *ObjectReferenceApplyConfiguration) *EventApplyConfiguration { + b.Related = value + return b +} + +// WithReportingController sets the ReportingController field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReportingController field is set to the value of the last call. +func (b *EventApplyConfiguration) WithReportingController(value string) *EventApplyConfiguration { + b.ReportingController = &value + return b +} + +// WithReportingInstance sets the ReportingInstance field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReportingInstance field is set to the value of the last call. +func (b *EventApplyConfiguration) WithReportingInstance(value string) *EventApplyConfiguration { + b.ReportingInstance = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/eventseries.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/eventseries.go new file mode 100644 index 000000000000..e66fb412712b --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/eventseries.go @@ -0,0 +1,52 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// EventSeriesApplyConfiguration represents an declarative configuration of the EventSeries type for use +// with apply. +type EventSeriesApplyConfiguration struct { + Count *int32 `json:"count,omitempty"` + LastObservedTime *v1.MicroTime `json:"lastObservedTime,omitempty"` +} + +// EventSeriesApplyConfiguration constructs an declarative configuration of the EventSeries type for use with +// apply. +func EventSeries() *EventSeriesApplyConfiguration { + return &EventSeriesApplyConfiguration{} +} + +// WithCount sets the Count field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Count field is set to the value of the last call. +func (b *EventSeriesApplyConfiguration) WithCount(value int32) *EventSeriesApplyConfiguration { + b.Count = &value + return b +} + +// WithLastObservedTime sets the LastObservedTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastObservedTime field is set to the value of the last call. +func (b *EventSeriesApplyConfiguration) WithLastObservedTime(value v1.MicroTime) *EventSeriesApplyConfiguration { + b.LastObservedTime = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/eventsource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/eventsource.go new file mode 100644 index 000000000000..2eb4aa8e4491 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/eventsource.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// EventSourceApplyConfiguration represents an declarative configuration of the EventSource type for use +// with apply. +type EventSourceApplyConfiguration struct { + Component *string `json:"component,omitempty"` + Host *string `json:"host,omitempty"` +} + +// EventSourceApplyConfiguration constructs an declarative configuration of the EventSource type for use with +// apply. +func EventSource() *EventSourceApplyConfiguration { + return &EventSourceApplyConfiguration{} +} + +// WithComponent sets the Component field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Component field is set to the value of the last call. +func (b *EventSourceApplyConfiguration) WithComponent(value string) *EventSourceApplyConfiguration { + b.Component = &value + return b +} + +// WithHost sets the Host field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Host field is set to the value of the last call. +func (b *EventSourceApplyConfiguration) WithHost(value string) *EventSourceApplyConfiguration { + b.Host = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/execaction.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/execaction.go new file mode 100644 index 000000000000..1df52144d7a5 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/execaction.go @@ -0,0 +1,41 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// ExecActionApplyConfiguration represents an declarative configuration of the ExecAction type for use +// with apply. +type ExecActionApplyConfiguration struct { + Command []string `json:"command,omitempty"` +} + +// ExecActionApplyConfiguration constructs an declarative configuration of the ExecAction type for use with +// apply. +func ExecAction() *ExecActionApplyConfiguration { + return &ExecActionApplyConfiguration{} +} + +// WithCommand adds the given value to the Command field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Command field. +func (b *ExecActionApplyConfiguration) WithCommand(values ...string) *ExecActionApplyConfiguration { + for i := range values { + b.Command = append(b.Command, values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/fcvolumesource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/fcvolumesource.go new file mode 100644 index 000000000000..43069de9a612 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/fcvolumesource.go @@ -0,0 +1,79 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// FCVolumeSourceApplyConfiguration represents an declarative configuration of the FCVolumeSource type for use +// with apply. +type FCVolumeSourceApplyConfiguration struct { + TargetWWNs []string `json:"targetWWNs,omitempty"` + Lun *int32 `json:"lun,omitempty"` + FSType *string `json:"fsType,omitempty"` + ReadOnly *bool `json:"readOnly,omitempty"` + WWIDs []string `json:"wwids,omitempty"` +} + +// FCVolumeSourceApplyConfiguration constructs an declarative configuration of the FCVolumeSource type for use with +// apply. +func FCVolumeSource() *FCVolumeSourceApplyConfiguration { + return &FCVolumeSourceApplyConfiguration{} +} + +// WithTargetWWNs adds the given value to the TargetWWNs field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the TargetWWNs field. +func (b *FCVolumeSourceApplyConfiguration) WithTargetWWNs(values ...string) *FCVolumeSourceApplyConfiguration { + for i := range values { + b.TargetWWNs = append(b.TargetWWNs, values[i]) + } + return b +} + +// WithLun sets the Lun field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Lun field is set to the value of the last call. +func (b *FCVolumeSourceApplyConfiguration) WithLun(value int32) *FCVolumeSourceApplyConfiguration { + b.Lun = &value + return b +} + +// WithFSType sets the FSType field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FSType field is set to the value of the last call. +func (b *FCVolumeSourceApplyConfiguration) WithFSType(value string) *FCVolumeSourceApplyConfiguration { + b.FSType = &value + return b +} + +// WithReadOnly sets the ReadOnly field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadOnly field is set to the value of the last call. +func (b *FCVolumeSourceApplyConfiguration) WithReadOnly(value bool) *FCVolumeSourceApplyConfiguration { + b.ReadOnly = &value + return b +} + +// WithWWIDs adds the given value to the WWIDs field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the WWIDs field. +func (b *FCVolumeSourceApplyConfiguration) WithWWIDs(values ...string) *FCVolumeSourceApplyConfiguration { + for i := range values { + b.WWIDs = append(b.WWIDs, values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/flexpersistentvolumesource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/flexpersistentvolumesource.go new file mode 100644 index 000000000000..47e7c746eefe --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/flexpersistentvolumesource.go @@ -0,0 +1,81 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// FlexPersistentVolumeSourceApplyConfiguration represents an declarative configuration of the FlexPersistentVolumeSource type for use +// with apply. +type FlexPersistentVolumeSourceApplyConfiguration struct { + Driver *string `json:"driver,omitempty"` + FSType *string `json:"fsType,omitempty"` + SecretRef *SecretReferenceApplyConfiguration `json:"secretRef,omitempty"` + ReadOnly *bool `json:"readOnly,omitempty"` + Options map[string]string `json:"options,omitempty"` +} + +// FlexPersistentVolumeSourceApplyConfiguration constructs an declarative configuration of the FlexPersistentVolumeSource type for use with +// apply. +func FlexPersistentVolumeSource() *FlexPersistentVolumeSourceApplyConfiguration { + return &FlexPersistentVolumeSourceApplyConfiguration{} +} + +// WithDriver sets the Driver field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Driver field is set to the value of the last call. +func (b *FlexPersistentVolumeSourceApplyConfiguration) WithDriver(value string) *FlexPersistentVolumeSourceApplyConfiguration { + b.Driver = &value + return b +} + +// WithFSType sets the FSType field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FSType field is set to the value of the last call. +func (b *FlexPersistentVolumeSourceApplyConfiguration) WithFSType(value string) *FlexPersistentVolumeSourceApplyConfiguration { + b.FSType = &value + return b +} + +// WithSecretRef sets the SecretRef field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SecretRef field is set to the value of the last call. +func (b *FlexPersistentVolumeSourceApplyConfiguration) WithSecretRef(value *SecretReferenceApplyConfiguration) *FlexPersistentVolumeSourceApplyConfiguration { + b.SecretRef = value + return b +} + +// WithReadOnly sets the ReadOnly field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadOnly field is set to the value of the last call. +func (b *FlexPersistentVolumeSourceApplyConfiguration) WithReadOnly(value bool) *FlexPersistentVolumeSourceApplyConfiguration { + b.ReadOnly = &value + return b +} + +// WithOptions puts the entries into the Options field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Options field, +// overwriting an existing map entries in Options field with the same key. +func (b *FlexPersistentVolumeSourceApplyConfiguration) WithOptions(entries map[string]string) *FlexPersistentVolumeSourceApplyConfiguration { + if b.Options == nil && len(entries) > 0 { + b.Options = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Options[k] = v + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/flexvolumesource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/flexvolumesource.go new file mode 100644 index 000000000000..7c09516a9899 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/flexvolumesource.go @@ -0,0 +1,81 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// FlexVolumeSourceApplyConfiguration represents an declarative configuration of the FlexVolumeSource type for use +// with apply. +type FlexVolumeSourceApplyConfiguration struct { + Driver *string `json:"driver,omitempty"` + FSType *string `json:"fsType,omitempty"` + SecretRef *LocalObjectReferenceApplyConfiguration `json:"secretRef,omitempty"` + ReadOnly *bool `json:"readOnly,omitempty"` + Options map[string]string `json:"options,omitempty"` +} + +// FlexVolumeSourceApplyConfiguration constructs an declarative configuration of the FlexVolumeSource type for use with +// apply. +func FlexVolumeSource() *FlexVolumeSourceApplyConfiguration { + return &FlexVolumeSourceApplyConfiguration{} +} + +// WithDriver sets the Driver field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Driver field is set to the value of the last call. +func (b *FlexVolumeSourceApplyConfiguration) WithDriver(value string) *FlexVolumeSourceApplyConfiguration { + b.Driver = &value + return b +} + +// WithFSType sets the FSType field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FSType field is set to the value of the last call. +func (b *FlexVolumeSourceApplyConfiguration) WithFSType(value string) *FlexVolumeSourceApplyConfiguration { + b.FSType = &value + return b +} + +// WithSecretRef sets the SecretRef field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SecretRef field is set to the value of the last call. +func (b *FlexVolumeSourceApplyConfiguration) WithSecretRef(value *LocalObjectReferenceApplyConfiguration) *FlexVolumeSourceApplyConfiguration { + b.SecretRef = value + return b +} + +// WithReadOnly sets the ReadOnly field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadOnly field is set to the value of the last call. +func (b *FlexVolumeSourceApplyConfiguration) WithReadOnly(value bool) *FlexVolumeSourceApplyConfiguration { + b.ReadOnly = &value + return b +} + +// WithOptions puts the entries into the Options field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Options field, +// overwriting an existing map entries in Options field with the same key. +func (b *FlexVolumeSourceApplyConfiguration) WithOptions(entries map[string]string) *FlexVolumeSourceApplyConfiguration { + if b.Options == nil && len(entries) > 0 { + b.Options = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Options[k] = v + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/flockervolumesource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/flockervolumesource.go new file mode 100644 index 000000000000..74896d55ac4a --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/flockervolumesource.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// FlockerVolumeSourceApplyConfiguration represents an declarative configuration of the FlockerVolumeSource type for use +// with apply. +type FlockerVolumeSourceApplyConfiguration struct { + DatasetName *string `json:"datasetName,omitempty"` + DatasetUUID *string `json:"datasetUUID,omitempty"` +} + +// FlockerVolumeSourceApplyConfiguration constructs an declarative configuration of the FlockerVolumeSource type for use with +// apply. +func FlockerVolumeSource() *FlockerVolumeSourceApplyConfiguration { + return &FlockerVolumeSourceApplyConfiguration{} +} + +// WithDatasetName sets the DatasetName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DatasetName field is set to the value of the last call. +func (b *FlockerVolumeSourceApplyConfiguration) WithDatasetName(value string) *FlockerVolumeSourceApplyConfiguration { + b.DatasetName = &value + return b +} + +// WithDatasetUUID sets the DatasetUUID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DatasetUUID field is set to the value of the last call. +func (b *FlockerVolumeSourceApplyConfiguration) WithDatasetUUID(value string) *FlockerVolumeSourceApplyConfiguration { + b.DatasetUUID = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/gcepersistentdiskvolumesource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/gcepersistentdiskvolumesource.go new file mode 100644 index 000000000000..0869d3eaa67e --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/gcepersistentdiskvolumesource.go @@ -0,0 +1,66 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// GCEPersistentDiskVolumeSourceApplyConfiguration represents an declarative configuration of the GCEPersistentDiskVolumeSource type for use +// with apply. +type GCEPersistentDiskVolumeSourceApplyConfiguration struct { + PDName *string `json:"pdName,omitempty"` + FSType *string `json:"fsType,omitempty"` + Partition *int32 `json:"partition,omitempty"` + ReadOnly *bool `json:"readOnly,omitempty"` +} + +// GCEPersistentDiskVolumeSourceApplyConfiguration constructs an declarative configuration of the GCEPersistentDiskVolumeSource type for use with +// apply. +func GCEPersistentDiskVolumeSource() *GCEPersistentDiskVolumeSourceApplyConfiguration { + return &GCEPersistentDiskVolumeSourceApplyConfiguration{} +} + +// WithPDName sets the PDName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PDName field is set to the value of the last call. +func (b *GCEPersistentDiskVolumeSourceApplyConfiguration) WithPDName(value string) *GCEPersistentDiskVolumeSourceApplyConfiguration { + b.PDName = &value + return b +} + +// WithFSType sets the FSType field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FSType field is set to the value of the last call. +func (b *GCEPersistentDiskVolumeSourceApplyConfiguration) WithFSType(value string) *GCEPersistentDiskVolumeSourceApplyConfiguration { + b.FSType = &value + return b +} + +// WithPartition sets the Partition field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Partition field is set to the value of the last call. +func (b *GCEPersistentDiskVolumeSourceApplyConfiguration) WithPartition(value int32) *GCEPersistentDiskVolumeSourceApplyConfiguration { + b.Partition = &value + return b +} + +// WithReadOnly sets the ReadOnly field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadOnly field is set to the value of the last call. +func (b *GCEPersistentDiskVolumeSourceApplyConfiguration) WithReadOnly(value bool) *GCEPersistentDiskVolumeSourceApplyConfiguration { + b.ReadOnly = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/gitrepovolumesource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/gitrepovolumesource.go new file mode 100644 index 000000000000..825e02e4e4c0 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/gitrepovolumesource.go @@ -0,0 +1,57 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// GitRepoVolumeSourceApplyConfiguration represents an declarative configuration of the GitRepoVolumeSource type for use +// with apply. +type GitRepoVolumeSourceApplyConfiguration struct { + Repository *string `json:"repository,omitempty"` + Revision *string `json:"revision,omitempty"` + Directory *string `json:"directory,omitempty"` +} + +// GitRepoVolumeSourceApplyConfiguration constructs an declarative configuration of the GitRepoVolumeSource type for use with +// apply. +func GitRepoVolumeSource() *GitRepoVolumeSourceApplyConfiguration { + return &GitRepoVolumeSourceApplyConfiguration{} +} + +// WithRepository sets the Repository field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Repository field is set to the value of the last call. +func (b *GitRepoVolumeSourceApplyConfiguration) WithRepository(value string) *GitRepoVolumeSourceApplyConfiguration { + b.Repository = &value + return b +} + +// WithRevision sets the Revision field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Revision field is set to the value of the last call. +func (b *GitRepoVolumeSourceApplyConfiguration) WithRevision(value string) *GitRepoVolumeSourceApplyConfiguration { + b.Revision = &value + return b +} + +// WithDirectory sets the Directory field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Directory field is set to the value of the last call. +func (b *GitRepoVolumeSourceApplyConfiguration) WithDirectory(value string) *GitRepoVolumeSourceApplyConfiguration { + b.Directory = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/glusterfspersistentvolumesource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/glusterfspersistentvolumesource.go new file mode 100644 index 000000000000..21a3925e52da --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/glusterfspersistentvolumesource.go @@ -0,0 +1,66 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// GlusterfsPersistentVolumeSourceApplyConfiguration represents an declarative configuration of the GlusterfsPersistentVolumeSource type for use +// with apply. +type GlusterfsPersistentVolumeSourceApplyConfiguration struct { + EndpointsName *string `json:"endpoints,omitempty"` + Path *string `json:"path,omitempty"` + ReadOnly *bool `json:"readOnly,omitempty"` + EndpointsNamespace *string `json:"endpointsNamespace,omitempty"` +} + +// GlusterfsPersistentVolumeSourceApplyConfiguration constructs an declarative configuration of the GlusterfsPersistentVolumeSource type for use with +// apply. +func GlusterfsPersistentVolumeSource() *GlusterfsPersistentVolumeSourceApplyConfiguration { + return &GlusterfsPersistentVolumeSourceApplyConfiguration{} +} + +// WithEndpointsName sets the EndpointsName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the EndpointsName field is set to the value of the last call. +func (b *GlusterfsPersistentVolumeSourceApplyConfiguration) WithEndpointsName(value string) *GlusterfsPersistentVolumeSourceApplyConfiguration { + b.EndpointsName = &value + return b +} + +// WithPath sets the Path field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Path field is set to the value of the last call. +func (b *GlusterfsPersistentVolumeSourceApplyConfiguration) WithPath(value string) *GlusterfsPersistentVolumeSourceApplyConfiguration { + b.Path = &value + return b +} + +// WithReadOnly sets the ReadOnly field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadOnly field is set to the value of the last call. +func (b *GlusterfsPersistentVolumeSourceApplyConfiguration) WithReadOnly(value bool) *GlusterfsPersistentVolumeSourceApplyConfiguration { + b.ReadOnly = &value + return b +} + +// WithEndpointsNamespace sets the EndpointsNamespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the EndpointsNamespace field is set to the value of the last call. +func (b *GlusterfsPersistentVolumeSourceApplyConfiguration) WithEndpointsNamespace(value string) *GlusterfsPersistentVolumeSourceApplyConfiguration { + b.EndpointsNamespace = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/glusterfsvolumesource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/glusterfsvolumesource.go new file mode 100644 index 000000000000..7ce6f0b399b8 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/glusterfsvolumesource.go @@ -0,0 +1,57 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// GlusterfsVolumeSourceApplyConfiguration represents an declarative configuration of the GlusterfsVolumeSource type for use +// with apply. +type GlusterfsVolumeSourceApplyConfiguration struct { + EndpointsName *string `json:"endpoints,omitempty"` + Path *string `json:"path,omitempty"` + ReadOnly *bool `json:"readOnly,omitempty"` +} + +// GlusterfsVolumeSourceApplyConfiguration constructs an declarative configuration of the GlusterfsVolumeSource type for use with +// apply. +func GlusterfsVolumeSource() *GlusterfsVolumeSourceApplyConfiguration { + return &GlusterfsVolumeSourceApplyConfiguration{} +} + +// WithEndpointsName sets the EndpointsName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the EndpointsName field is set to the value of the last call. +func (b *GlusterfsVolumeSourceApplyConfiguration) WithEndpointsName(value string) *GlusterfsVolumeSourceApplyConfiguration { + b.EndpointsName = &value + return b +} + +// WithPath sets the Path field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Path field is set to the value of the last call. +func (b *GlusterfsVolumeSourceApplyConfiguration) WithPath(value string) *GlusterfsVolumeSourceApplyConfiguration { + b.Path = &value + return b +} + +// WithReadOnly sets the ReadOnly field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadOnly field is set to the value of the last call. +func (b *GlusterfsVolumeSourceApplyConfiguration) WithReadOnly(value bool) *GlusterfsVolumeSourceApplyConfiguration { + b.ReadOnly = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/handler.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/handler.go new file mode 100644 index 000000000000..fbf1511ccc59 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/handler.go @@ -0,0 +1,57 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// HandlerApplyConfiguration represents an declarative configuration of the Handler type for use +// with apply. +type HandlerApplyConfiguration struct { + Exec *ExecActionApplyConfiguration `json:"exec,omitempty"` + HTTPGet *HTTPGetActionApplyConfiguration `json:"httpGet,omitempty"` + TCPSocket *TCPSocketActionApplyConfiguration `json:"tcpSocket,omitempty"` +} + +// HandlerApplyConfiguration constructs an declarative configuration of the Handler type for use with +// apply. +func Handler() *HandlerApplyConfiguration { + return &HandlerApplyConfiguration{} +} + +// WithExec sets the Exec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Exec field is set to the value of the last call. +func (b *HandlerApplyConfiguration) WithExec(value *ExecActionApplyConfiguration) *HandlerApplyConfiguration { + b.Exec = value + return b +} + +// WithHTTPGet sets the HTTPGet field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the HTTPGet field is set to the value of the last call. +func (b *HandlerApplyConfiguration) WithHTTPGet(value *HTTPGetActionApplyConfiguration) *HandlerApplyConfiguration { + b.HTTPGet = value + return b +} + +// WithTCPSocket sets the TCPSocket field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the TCPSocket field is set to the value of the last call. +func (b *HandlerApplyConfiguration) WithTCPSocket(value *TCPSocketActionApplyConfiguration) *HandlerApplyConfiguration { + b.TCPSocket = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/hostalias.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/hostalias.go new file mode 100644 index 000000000000..861508ef53ab --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/hostalias.go @@ -0,0 +1,50 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// HostAliasApplyConfiguration represents an declarative configuration of the HostAlias type for use +// with apply. +type HostAliasApplyConfiguration struct { + IP *string `json:"ip,omitempty"` + Hostnames []string `json:"hostnames,omitempty"` +} + +// HostAliasApplyConfiguration constructs an declarative configuration of the HostAlias type for use with +// apply. +func HostAlias() *HostAliasApplyConfiguration { + return &HostAliasApplyConfiguration{} +} + +// WithIP sets the IP field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the IP field is set to the value of the last call. +func (b *HostAliasApplyConfiguration) WithIP(value string) *HostAliasApplyConfiguration { + b.IP = &value + return b +} + +// WithHostnames adds the given value to the Hostnames field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Hostnames field. +func (b *HostAliasApplyConfiguration) WithHostnames(values ...string) *HostAliasApplyConfiguration { + for i := range values { + b.Hostnames = append(b.Hostnames, values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/hostpathvolumesource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/hostpathvolumesource.go new file mode 100644 index 000000000000..8b15689eef69 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/hostpathvolumesource.go @@ -0,0 +1,52 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/core/v1" +) + +// HostPathVolumeSourceApplyConfiguration represents an declarative configuration of the HostPathVolumeSource type for use +// with apply. +type HostPathVolumeSourceApplyConfiguration struct { + Path *string `json:"path,omitempty"` + Type *v1.HostPathType `json:"type,omitempty"` +} + +// HostPathVolumeSourceApplyConfiguration constructs an declarative configuration of the HostPathVolumeSource type for use with +// apply. +func HostPathVolumeSource() *HostPathVolumeSourceApplyConfiguration { + return &HostPathVolumeSourceApplyConfiguration{} +} + +// WithPath sets the Path field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Path field is set to the value of the last call. +func (b *HostPathVolumeSourceApplyConfiguration) WithPath(value string) *HostPathVolumeSourceApplyConfiguration { + b.Path = &value + return b +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *HostPathVolumeSourceApplyConfiguration) WithType(value v1.HostPathType) *HostPathVolumeSourceApplyConfiguration { + b.Type = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/httpgetaction.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/httpgetaction.go new file mode 100644 index 000000000000..e4ecdd43032c --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/httpgetaction.go @@ -0,0 +1,85 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/core/v1" + intstr "k8s.io/apimachinery/pkg/util/intstr" +) + +// HTTPGetActionApplyConfiguration represents an declarative configuration of the HTTPGetAction type for use +// with apply. +type HTTPGetActionApplyConfiguration struct { + Path *string `json:"path,omitempty"` + Port *intstr.IntOrString `json:"port,omitempty"` + Host *string `json:"host,omitempty"` + Scheme *v1.URIScheme `json:"scheme,omitempty"` + HTTPHeaders []HTTPHeaderApplyConfiguration `json:"httpHeaders,omitempty"` +} + +// HTTPGetActionApplyConfiguration constructs an declarative configuration of the HTTPGetAction type for use with +// apply. +func HTTPGetAction() *HTTPGetActionApplyConfiguration { + return &HTTPGetActionApplyConfiguration{} +} + +// WithPath sets the Path field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Path field is set to the value of the last call. +func (b *HTTPGetActionApplyConfiguration) WithPath(value string) *HTTPGetActionApplyConfiguration { + b.Path = &value + return b +} + +// WithPort sets the Port field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Port field is set to the value of the last call. +func (b *HTTPGetActionApplyConfiguration) WithPort(value intstr.IntOrString) *HTTPGetActionApplyConfiguration { + b.Port = &value + return b +} + +// WithHost sets the Host field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Host field is set to the value of the last call. +func (b *HTTPGetActionApplyConfiguration) WithHost(value string) *HTTPGetActionApplyConfiguration { + b.Host = &value + return b +} + +// WithScheme sets the Scheme field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Scheme field is set to the value of the last call. +func (b *HTTPGetActionApplyConfiguration) WithScheme(value v1.URIScheme) *HTTPGetActionApplyConfiguration { + b.Scheme = &value + return b +} + +// WithHTTPHeaders adds the given value to the HTTPHeaders field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the HTTPHeaders field. +func (b *HTTPGetActionApplyConfiguration) WithHTTPHeaders(values ...*HTTPHeaderApplyConfiguration) *HTTPGetActionApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithHTTPHeaders") + } + b.HTTPHeaders = append(b.HTTPHeaders, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/httpheader.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/httpheader.go new file mode 100644 index 000000000000..d55f36bfd212 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/httpheader.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// HTTPHeaderApplyConfiguration represents an declarative configuration of the HTTPHeader type for use +// with apply. +type HTTPHeaderApplyConfiguration struct { + Name *string `json:"name,omitempty"` + Value *string `json:"value,omitempty"` +} + +// HTTPHeaderApplyConfiguration constructs an declarative configuration of the HTTPHeader type for use with +// apply. +func HTTPHeader() *HTTPHeaderApplyConfiguration { + return &HTTPHeaderApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *HTTPHeaderApplyConfiguration) WithName(value string) *HTTPHeaderApplyConfiguration { + b.Name = &value + return b +} + +// WithValue sets the Value field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Value field is set to the value of the last call. +func (b *HTTPHeaderApplyConfiguration) WithValue(value string) *HTTPHeaderApplyConfiguration { + b.Value = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/iscsipersistentvolumesource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/iscsipersistentvolumesource.go new file mode 100644 index 000000000000..c7b248181ae9 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/iscsipersistentvolumesource.go @@ -0,0 +1,131 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// ISCSIPersistentVolumeSourceApplyConfiguration represents an declarative configuration of the ISCSIPersistentVolumeSource type for use +// with apply. +type ISCSIPersistentVolumeSourceApplyConfiguration struct { + TargetPortal *string `json:"targetPortal,omitempty"` + IQN *string `json:"iqn,omitempty"` + Lun *int32 `json:"lun,omitempty"` + ISCSIInterface *string `json:"iscsiInterface,omitempty"` + FSType *string `json:"fsType,omitempty"` + ReadOnly *bool `json:"readOnly,omitempty"` + Portals []string `json:"portals,omitempty"` + DiscoveryCHAPAuth *bool `json:"chapAuthDiscovery,omitempty"` + SessionCHAPAuth *bool `json:"chapAuthSession,omitempty"` + SecretRef *SecretReferenceApplyConfiguration `json:"secretRef,omitempty"` + InitiatorName *string `json:"initiatorName,omitempty"` +} + +// ISCSIPersistentVolumeSourceApplyConfiguration constructs an declarative configuration of the ISCSIPersistentVolumeSource type for use with +// apply. +func ISCSIPersistentVolumeSource() *ISCSIPersistentVolumeSourceApplyConfiguration { + return &ISCSIPersistentVolumeSourceApplyConfiguration{} +} + +// WithTargetPortal sets the TargetPortal field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the TargetPortal field is set to the value of the last call. +func (b *ISCSIPersistentVolumeSourceApplyConfiguration) WithTargetPortal(value string) *ISCSIPersistentVolumeSourceApplyConfiguration { + b.TargetPortal = &value + return b +} + +// WithIQN sets the IQN field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the IQN field is set to the value of the last call. +func (b *ISCSIPersistentVolumeSourceApplyConfiguration) WithIQN(value string) *ISCSIPersistentVolumeSourceApplyConfiguration { + b.IQN = &value + return b +} + +// WithLun sets the Lun field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Lun field is set to the value of the last call. +func (b *ISCSIPersistentVolumeSourceApplyConfiguration) WithLun(value int32) *ISCSIPersistentVolumeSourceApplyConfiguration { + b.Lun = &value + return b +} + +// WithISCSIInterface sets the ISCSIInterface field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ISCSIInterface field is set to the value of the last call. +func (b *ISCSIPersistentVolumeSourceApplyConfiguration) WithISCSIInterface(value string) *ISCSIPersistentVolumeSourceApplyConfiguration { + b.ISCSIInterface = &value + return b +} + +// WithFSType sets the FSType field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FSType field is set to the value of the last call. +func (b *ISCSIPersistentVolumeSourceApplyConfiguration) WithFSType(value string) *ISCSIPersistentVolumeSourceApplyConfiguration { + b.FSType = &value + return b +} + +// WithReadOnly sets the ReadOnly field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadOnly field is set to the value of the last call. +func (b *ISCSIPersistentVolumeSourceApplyConfiguration) WithReadOnly(value bool) *ISCSIPersistentVolumeSourceApplyConfiguration { + b.ReadOnly = &value + return b +} + +// WithPortals adds the given value to the Portals field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Portals field. +func (b *ISCSIPersistentVolumeSourceApplyConfiguration) WithPortals(values ...string) *ISCSIPersistentVolumeSourceApplyConfiguration { + for i := range values { + b.Portals = append(b.Portals, values[i]) + } + return b +} + +// WithDiscoveryCHAPAuth sets the DiscoveryCHAPAuth field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DiscoveryCHAPAuth field is set to the value of the last call. +func (b *ISCSIPersistentVolumeSourceApplyConfiguration) WithDiscoveryCHAPAuth(value bool) *ISCSIPersistentVolumeSourceApplyConfiguration { + b.DiscoveryCHAPAuth = &value + return b +} + +// WithSessionCHAPAuth sets the SessionCHAPAuth field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SessionCHAPAuth field is set to the value of the last call. +func (b *ISCSIPersistentVolumeSourceApplyConfiguration) WithSessionCHAPAuth(value bool) *ISCSIPersistentVolumeSourceApplyConfiguration { + b.SessionCHAPAuth = &value + return b +} + +// WithSecretRef sets the SecretRef field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SecretRef field is set to the value of the last call. +func (b *ISCSIPersistentVolumeSourceApplyConfiguration) WithSecretRef(value *SecretReferenceApplyConfiguration) *ISCSIPersistentVolumeSourceApplyConfiguration { + b.SecretRef = value + return b +} + +// WithInitiatorName sets the InitiatorName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the InitiatorName field is set to the value of the last call. +func (b *ISCSIPersistentVolumeSourceApplyConfiguration) WithInitiatorName(value string) *ISCSIPersistentVolumeSourceApplyConfiguration { + b.InitiatorName = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/iscsivolumesource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/iscsivolumesource.go new file mode 100644 index 000000000000..c95941a9c7e8 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/iscsivolumesource.go @@ -0,0 +1,131 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// ISCSIVolumeSourceApplyConfiguration represents an declarative configuration of the ISCSIVolumeSource type for use +// with apply. +type ISCSIVolumeSourceApplyConfiguration struct { + TargetPortal *string `json:"targetPortal,omitempty"` + IQN *string `json:"iqn,omitempty"` + Lun *int32 `json:"lun,omitempty"` + ISCSIInterface *string `json:"iscsiInterface,omitempty"` + FSType *string `json:"fsType,omitempty"` + ReadOnly *bool `json:"readOnly,omitempty"` + Portals []string `json:"portals,omitempty"` + DiscoveryCHAPAuth *bool `json:"chapAuthDiscovery,omitempty"` + SessionCHAPAuth *bool `json:"chapAuthSession,omitempty"` + SecretRef *LocalObjectReferenceApplyConfiguration `json:"secretRef,omitempty"` + InitiatorName *string `json:"initiatorName,omitempty"` +} + +// ISCSIVolumeSourceApplyConfiguration constructs an declarative configuration of the ISCSIVolumeSource type for use with +// apply. +func ISCSIVolumeSource() *ISCSIVolumeSourceApplyConfiguration { + return &ISCSIVolumeSourceApplyConfiguration{} +} + +// WithTargetPortal sets the TargetPortal field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the TargetPortal field is set to the value of the last call. +func (b *ISCSIVolumeSourceApplyConfiguration) WithTargetPortal(value string) *ISCSIVolumeSourceApplyConfiguration { + b.TargetPortal = &value + return b +} + +// WithIQN sets the IQN field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the IQN field is set to the value of the last call. +func (b *ISCSIVolumeSourceApplyConfiguration) WithIQN(value string) *ISCSIVolumeSourceApplyConfiguration { + b.IQN = &value + return b +} + +// WithLun sets the Lun field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Lun field is set to the value of the last call. +func (b *ISCSIVolumeSourceApplyConfiguration) WithLun(value int32) *ISCSIVolumeSourceApplyConfiguration { + b.Lun = &value + return b +} + +// WithISCSIInterface sets the ISCSIInterface field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ISCSIInterface field is set to the value of the last call. +func (b *ISCSIVolumeSourceApplyConfiguration) WithISCSIInterface(value string) *ISCSIVolumeSourceApplyConfiguration { + b.ISCSIInterface = &value + return b +} + +// WithFSType sets the FSType field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FSType field is set to the value of the last call. +func (b *ISCSIVolumeSourceApplyConfiguration) WithFSType(value string) *ISCSIVolumeSourceApplyConfiguration { + b.FSType = &value + return b +} + +// WithReadOnly sets the ReadOnly field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadOnly field is set to the value of the last call. +func (b *ISCSIVolumeSourceApplyConfiguration) WithReadOnly(value bool) *ISCSIVolumeSourceApplyConfiguration { + b.ReadOnly = &value + return b +} + +// WithPortals adds the given value to the Portals field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Portals field. +func (b *ISCSIVolumeSourceApplyConfiguration) WithPortals(values ...string) *ISCSIVolumeSourceApplyConfiguration { + for i := range values { + b.Portals = append(b.Portals, values[i]) + } + return b +} + +// WithDiscoveryCHAPAuth sets the DiscoveryCHAPAuth field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DiscoveryCHAPAuth field is set to the value of the last call. +func (b *ISCSIVolumeSourceApplyConfiguration) WithDiscoveryCHAPAuth(value bool) *ISCSIVolumeSourceApplyConfiguration { + b.DiscoveryCHAPAuth = &value + return b +} + +// WithSessionCHAPAuth sets the SessionCHAPAuth field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SessionCHAPAuth field is set to the value of the last call. +func (b *ISCSIVolumeSourceApplyConfiguration) WithSessionCHAPAuth(value bool) *ISCSIVolumeSourceApplyConfiguration { + b.SessionCHAPAuth = &value + return b +} + +// WithSecretRef sets the SecretRef field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SecretRef field is set to the value of the last call. +func (b *ISCSIVolumeSourceApplyConfiguration) WithSecretRef(value *LocalObjectReferenceApplyConfiguration) *ISCSIVolumeSourceApplyConfiguration { + b.SecretRef = value + return b +} + +// WithInitiatorName sets the InitiatorName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the InitiatorName field is set to the value of the last call. +func (b *ISCSIVolumeSourceApplyConfiguration) WithInitiatorName(value string) *ISCSIVolumeSourceApplyConfiguration { + b.InitiatorName = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/keytopath.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/keytopath.go new file mode 100644 index 000000000000..d58676d34cde --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/keytopath.go @@ -0,0 +1,57 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// KeyToPathApplyConfiguration represents an declarative configuration of the KeyToPath type for use +// with apply. +type KeyToPathApplyConfiguration struct { + Key *string `json:"key,omitempty"` + Path *string `json:"path,omitempty"` + Mode *int32 `json:"mode,omitempty"` +} + +// KeyToPathApplyConfiguration constructs an declarative configuration of the KeyToPath type for use with +// apply. +func KeyToPath() *KeyToPathApplyConfiguration { + return &KeyToPathApplyConfiguration{} +} + +// WithKey sets the Key field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Key field is set to the value of the last call. +func (b *KeyToPathApplyConfiguration) WithKey(value string) *KeyToPathApplyConfiguration { + b.Key = &value + return b +} + +// WithPath sets the Path field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Path field is set to the value of the last call. +func (b *KeyToPathApplyConfiguration) WithPath(value string) *KeyToPathApplyConfiguration { + b.Path = &value + return b +} + +// WithMode sets the Mode field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Mode field is set to the value of the last call. +func (b *KeyToPathApplyConfiguration) WithMode(value int32) *KeyToPathApplyConfiguration { + b.Mode = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/lifecycle.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/lifecycle.go new file mode 100644 index 000000000000..ab37b6677b3e --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/lifecycle.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// LifecycleApplyConfiguration represents an declarative configuration of the Lifecycle type for use +// with apply. +type LifecycleApplyConfiguration struct { + PostStart *HandlerApplyConfiguration `json:"postStart,omitempty"` + PreStop *HandlerApplyConfiguration `json:"preStop,omitempty"` +} + +// LifecycleApplyConfiguration constructs an declarative configuration of the Lifecycle type for use with +// apply. +func Lifecycle() *LifecycleApplyConfiguration { + return &LifecycleApplyConfiguration{} +} + +// WithPostStart sets the PostStart field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PostStart field is set to the value of the last call. +func (b *LifecycleApplyConfiguration) WithPostStart(value *HandlerApplyConfiguration) *LifecycleApplyConfiguration { + b.PostStart = value + return b +} + +// WithPreStop sets the PreStop field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PreStop field is set to the value of the last call. +func (b *LifecycleApplyConfiguration) WithPreStop(value *HandlerApplyConfiguration) *LifecycleApplyConfiguration { + b.PreStop = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/limitrange.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/limitrange.go new file mode 100644 index 000000000000..920b527f5168 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/limitrange.go @@ -0,0 +1,256 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + apicorev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// LimitRangeApplyConfiguration represents an declarative configuration of the LimitRange type for use +// with apply. +type LimitRangeApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *LimitRangeSpecApplyConfiguration `json:"spec,omitempty"` +} + +// LimitRange constructs an declarative configuration of the LimitRange type for use with +// apply. +func LimitRange(name, namespace string) *LimitRangeApplyConfiguration { + b := &LimitRangeApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("LimitRange") + b.WithAPIVersion("v1") + return b +} + +// ExtractLimitRange extracts the applied configuration owned by fieldManager from +// limitRange. If no managedFields are found in limitRange for fieldManager, a +// LimitRangeApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// limitRange must be a unmodified LimitRange API object that was retrieved from the Kubernetes API. +// ExtractLimitRange provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractLimitRange(limitRange *apicorev1.LimitRange, fieldManager string) (*LimitRangeApplyConfiguration, error) { + b := &LimitRangeApplyConfiguration{} + err := managedfields.ExtractInto(limitRange, internal.Parser().Type("io.k8s.api.core.v1.LimitRange"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(limitRange.Name) + b.WithNamespace(limitRange.Namespace) + + b.WithKind("LimitRange") + b.WithAPIVersion("v1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *LimitRangeApplyConfiguration) WithKind(value string) *LimitRangeApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *LimitRangeApplyConfiguration) WithAPIVersion(value string) *LimitRangeApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *LimitRangeApplyConfiguration) WithName(value string) *LimitRangeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *LimitRangeApplyConfiguration) WithGenerateName(value string) *LimitRangeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *LimitRangeApplyConfiguration) WithNamespace(value string) *LimitRangeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *LimitRangeApplyConfiguration) WithSelfLink(value string) *LimitRangeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *LimitRangeApplyConfiguration) WithUID(value types.UID) *LimitRangeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *LimitRangeApplyConfiguration) WithResourceVersion(value string) *LimitRangeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *LimitRangeApplyConfiguration) WithGeneration(value int64) *LimitRangeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *LimitRangeApplyConfiguration) WithCreationTimestamp(value metav1.Time) *LimitRangeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *LimitRangeApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *LimitRangeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *LimitRangeApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *LimitRangeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *LimitRangeApplyConfiguration) WithLabels(entries map[string]string) *LimitRangeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *LimitRangeApplyConfiguration) WithAnnotations(entries map[string]string) *LimitRangeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *LimitRangeApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *LimitRangeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *LimitRangeApplyConfiguration) WithFinalizers(values ...string) *LimitRangeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *LimitRangeApplyConfiguration) WithClusterName(value string) *LimitRangeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *LimitRangeApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *LimitRangeApplyConfiguration) WithSpec(value *LimitRangeSpecApplyConfiguration) *LimitRangeApplyConfiguration { + b.Spec = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/limitrangeitem.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/limitrangeitem.go new file mode 100644 index 000000000000..084650fdaac2 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/limitrangeitem.go @@ -0,0 +1,88 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/core/v1" +) + +// LimitRangeItemApplyConfiguration represents an declarative configuration of the LimitRangeItem type for use +// with apply. +type LimitRangeItemApplyConfiguration struct { + Type *v1.LimitType `json:"type,omitempty"` + Max *v1.ResourceList `json:"max,omitempty"` + Min *v1.ResourceList `json:"min,omitempty"` + Default *v1.ResourceList `json:"default,omitempty"` + DefaultRequest *v1.ResourceList `json:"defaultRequest,omitempty"` + MaxLimitRequestRatio *v1.ResourceList `json:"maxLimitRequestRatio,omitempty"` +} + +// LimitRangeItemApplyConfiguration constructs an declarative configuration of the LimitRangeItem type for use with +// apply. +func LimitRangeItem() *LimitRangeItemApplyConfiguration { + return &LimitRangeItemApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *LimitRangeItemApplyConfiguration) WithType(value v1.LimitType) *LimitRangeItemApplyConfiguration { + b.Type = &value + return b +} + +// WithMax sets the Max field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Max field is set to the value of the last call. +func (b *LimitRangeItemApplyConfiguration) WithMax(value v1.ResourceList) *LimitRangeItemApplyConfiguration { + b.Max = &value + return b +} + +// WithMin sets the Min field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Min field is set to the value of the last call. +func (b *LimitRangeItemApplyConfiguration) WithMin(value v1.ResourceList) *LimitRangeItemApplyConfiguration { + b.Min = &value + return b +} + +// WithDefault sets the Default field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Default field is set to the value of the last call. +func (b *LimitRangeItemApplyConfiguration) WithDefault(value v1.ResourceList) *LimitRangeItemApplyConfiguration { + b.Default = &value + return b +} + +// WithDefaultRequest sets the DefaultRequest field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DefaultRequest field is set to the value of the last call. +func (b *LimitRangeItemApplyConfiguration) WithDefaultRequest(value v1.ResourceList) *LimitRangeItemApplyConfiguration { + b.DefaultRequest = &value + return b +} + +// WithMaxLimitRequestRatio sets the MaxLimitRequestRatio field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MaxLimitRequestRatio field is set to the value of the last call. +func (b *LimitRangeItemApplyConfiguration) WithMaxLimitRequestRatio(value v1.ResourceList) *LimitRangeItemApplyConfiguration { + b.MaxLimitRequestRatio = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/limitrangespec.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/limitrangespec.go new file mode 100644 index 000000000000..5eee5c498e3a --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/limitrangespec.go @@ -0,0 +1,44 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// LimitRangeSpecApplyConfiguration represents an declarative configuration of the LimitRangeSpec type for use +// with apply. +type LimitRangeSpecApplyConfiguration struct { + Limits []LimitRangeItemApplyConfiguration `json:"limits,omitempty"` +} + +// LimitRangeSpecApplyConfiguration constructs an declarative configuration of the LimitRangeSpec type for use with +// apply. +func LimitRangeSpec() *LimitRangeSpecApplyConfiguration { + return &LimitRangeSpecApplyConfiguration{} +} + +// WithLimits adds the given value to the Limits field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Limits field. +func (b *LimitRangeSpecApplyConfiguration) WithLimits(values ...*LimitRangeItemApplyConfiguration) *LimitRangeSpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithLimits") + } + b.Limits = append(b.Limits, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/loadbalanceringress.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/loadbalanceringress.go new file mode 100644 index 000000000000..64d27bdad50e --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/loadbalanceringress.go @@ -0,0 +1,62 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// LoadBalancerIngressApplyConfiguration represents an declarative configuration of the LoadBalancerIngress type for use +// with apply. +type LoadBalancerIngressApplyConfiguration struct { + IP *string `json:"ip,omitempty"` + Hostname *string `json:"hostname,omitempty"` + Ports []PortStatusApplyConfiguration `json:"ports,omitempty"` +} + +// LoadBalancerIngressApplyConfiguration constructs an declarative configuration of the LoadBalancerIngress type for use with +// apply. +func LoadBalancerIngress() *LoadBalancerIngressApplyConfiguration { + return &LoadBalancerIngressApplyConfiguration{} +} + +// WithIP sets the IP field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the IP field is set to the value of the last call. +func (b *LoadBalancerIngressApplyConfiguration) WithIP(value string) *LoadBalancerIngressApplyConfiguration { + b.IP = &value + return b +} + +// WithHostname sets the Hostname field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Hostname field is set to the value of the last call. +func (b *LoadBalancerIngressApplyConfiguration) WithHostname(value string) *LoadBalancerIngressApplyConfiguration { + b.Hostname = &value + return b +} + +// WithPorts adds the given value to the Ports field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Ports field. +func (b *LoadBalancerIngressApplyConfiguration) WithPorts(values ...*PortStatusApplyConfiguration) *LoadBalancerIngressApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithPorts") + } + b.Ports = append(b.Ports, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/loadbalancerstatus.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/loadbalancerstatus.go new file mode 100644 index 000000000000..2fcc0cad181b --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/loadbalancerstatus.go @@ -0,0 +1,44 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// LoadBalancerStatusApplyConfiguration represents an declarative configuration of the LoadBalancerStatus type for use +// with apply. +type LoadBalancerStatusApplyConfiguration struct { + Ingress []LoadBalancerIngressApplyConfiguration `json:"ingress,omitempty"` +} + +// LoadBalancerStatusApplyConfiguration constructs an declarative configuration of the LoadBalancerStatus type for use with +// apply. +func LoadBalancerStatus() *LoadBalancerStatusApplyConfiguration { + return &LoadBalancerStatusApplyConfiguration{} +} + +// WithIngress adds the given value to the Ingress field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Ingress field. +func (b *LoadBalancerStatusApplyConfiguration) WithIngress(values ...*LoadBalancerIngressApplyConfiguration) *LoadBalancerStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithIngress") + } + b.Ingress = append(b.Ingress, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/localobjectreference.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/localobjectreference.go new file mode 100644 index 000000000000..7662e32b319e --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/localobjectreference.go @@ -0,0 +1,39 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// LocalObjectReferenceApplyConfiguration represents an declarative configuration of the LocalObjectReference type for use +// with apply. +type LocalObjectReferenceApplyConfiguration struct { + Name *string `json:"name,omitempty"` +} + +// LocalObjectReferenceApplyConfiguration constructs an declarative configuration of the LocalObjectReference type for use with +// apply. +func LocalObjectReference() *LocalObjectReferenceApplyConfiguration { + return &LocalObjectReferenceApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *LocalObjectReferenceApplyConfiguration) WithName(value string) *LocalObjectReferenceApplyConfiguration { + b.Name = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/localvolumesource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/localvolumesource.go new file mode 100644 index 000000000000..5d289bd12df1 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/localvolumesource.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// LocalVolumeSourceApplyConfiguration represents an declarative configuration of the LocalVolumeSource type for use +// with apply. +type LocalVolumeSourceApplyConfiguration struct { + Path *string `json:"path,omitempty"` + FSType *string `json:"fsType,omitempty"` +} + +// LocalVolumeSourceApplyConfiguration constructs an declarative configuration of the LocalVolumeSource type for use with +// apply. +func LocalVolumeSource() *LocalVolumeSourceApplyConfiguration { + return &LocalVolumeSourceApplyConfiguration{} +} + +// WithPath sets the Path field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Path field is set to the value of the last call. +func (b *LocalVolumeSourceApplyConfiguration) WithPath(value string) *LocalVolumeSourceApplyConfiguration { + b.Path = &value + return b +} + +// WithFSType sets the FSType field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FSType field is set to the value of the last call. +func (b *LocalVolumeSourceApplyConfiguration) WithFSType(value string) *LocalVolumeSourceApplyConfiguration { + b.FSType = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/namespace.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/namespace.go new file mode 100644 index 000000000000..4a829f404d14 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/namespace.go @@ -0,0 +1,263 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + apicorev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// NamespaceApplyConfiguration represents an declarative configuration of the Namespace type for use +// with apply. +type NamespaceApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *NamespaceSpecApplyConfiguration `json:"spec,omitempty"` + Status *NamespaceStatusApplyConfiguration `json:"status,omitempty"` +} + +// Namespace constructs an declarative configuration of the Namespace type for use with +// apply. +func Namespace(name string) *NamespaceApplyConfiguration { + b := &NamespaceApplyConfiguration{} + b.WithName(name) + b.WithKind("Namespace") + b.WithAPIVersion("v1") + return b +} + +// ExtractNamespace extracts the applied configuration owned by fieldManager from +// namespace. If no managedFields are found in namespace for fieldManager, a +// NamespaceApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// namespace must be a unmodified Namespace API object that was retrieved from the Kubernetes API. +// ExtractNamespace provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractNamespace(namespace *apicorev1.Namespace, fieldManager string) (*NamespaceApplyConfiguration, error) { + b := &NamespaceApplyConfiguration{} + err := managedfields.ExtractInto(namespace, internal.Parser().Type("io.k8s.api.core.v1.Namespace"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(namespace.Name) + + b.WithKind("Namespace") + b.WithAPIVersion("v1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *NamespaceApplyConfiguration) WithKind(value string) *NamespaceApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *NamespaceApplyConfiguration) WithAPIVersion(value string) *NamespaceApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *NamespaceApplyConfiguration) WithName(value string) *NamespaceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *NamespaceApplyConfiguration) WithGenerateName(value string) *NamespaceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *NamespaceApplyConfiguration) WithNamespace(value string) *NamespaceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *NamespaceApplyConfiguration) WithSelfLink(value string) *NamespaceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *NamespaceApplyConfiguration) WithUID(value types.UID) *NamespaceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *NamespaceApplyConfiguration) WithResourceVersion(value string) *NamespaceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *NamespaceApplyConfiguration) WithGeneration(value int64) *NamespaceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *NamespaceApplyConfiguration) WithCreationTimestamp(value metav1.Time) *NamespaceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *NamespaceApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *NamespaceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *NamespaceApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *NamespaceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *NamespaceApplyConfiguration) WithLabels(entries map[string]string) *NamespaceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *NamespaceApplyConfiguration) WithAnnotations(entries map[string]string) *NamespaceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *NamespaceApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *NamespaceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *NamespaceApplyConfiguration) WithFinalizers(values ...string) *NamespaceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *NamespaceApplyConfiguration) WithClusterName(value string) *NamespaceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *NamespaceApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *NamespaceApplyConfiguration) WithSpec(value *NamespaceSpecApplyConfiguration) *NamespaceApplyConfiguration { + b.Spec = value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *NamespaceApplyConfiguration) WithStatus(value *NamespaceStatusApplyConfiguration) *NamespaceApplyConfiguration { + b.Status = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/namespacecondition.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/namespacecondition.go new file mode 100644 index 000000000000..8651978b0fb8 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/namespacecondition.go @@ -0,0 +1,80 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// NamespaceConditionApplyConfiguration represents an declarative configuration of the NamespaceCondition type for use +// with apply. +type NamespaceConditionApplyConfiguration struct { + Type *v1.NamespaceConditionType `json:"type,omitempty"` + Status *v1.ConditionStatus `json:"status,omitempty"` + LastTransitionTime *metav1.Time `json:"lastTransitionTime,omitempty"` + Reason *string `json:"reason,omitempty"` + Message *string `json:"message,omitempty"` +} + +// NamespaceConditionApplyConfiguration constructs an declarative configuration of the NamespaceCondition type for use with +// apply. +func NamespaceCondition() *NamespaceConditionApplyConfiguration { + return &NamespaceConditionApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *NamespaceConditionApplyConfiguration) WithType(value v1.NamespaceConditionType) *NamespaceConditionApplyConfiguration { + b.Type = &value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *NamespaceConditionApplyConfiguration) WithStatus(value v1.ConditionStatus) *NamespaceConditionApplyConfiguration { + b.Status = &value + return b +} + +// WithLastTransitionTime sets the LastTransitionTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastTransitionTime field is set to the value of the last call. +func (b *NamespaceConditionApplyConfiguration) WithLastTransitionTime(value metav1.Time) *NamespaceConditionApplyConfiguration { + b.LastTransitionTime = &value + return b +} + +// WithReason sets the Reason field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Reason field is set to the value of the last call. +func (b *NamespaceConditionApplyConfiguration) WithReason(value string) *NamespaceConditionApplyConfiguration { + b.Reason = &value + return b +} + +// WithMessage sets the Message field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Message field is set to the value of the last call. +func (b *NamespaceConditionApplyConfiguration) WithMessage(value string) *NamespaceConditionApplyConfiguration { + b.Message = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/namespacespec.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/namespacespec.go new file mode 100644 index 000000000000..9bc02d1fa2aa --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/namespacespec.go @@ -0,0 +1,45 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/core/v1" +) + +// NamespaceSpecApplyConfiguration represents an declarative configuration of the NamespaceSpec type for use +// with apply. +type NamespaceSpecApplyConfiguration struct { + Finalizers []v1.FinalizerName `json:"finalizers,omitempty"` +} + +// NamespaceSpecApplyConfiguration constructs an declarative configuration of the NamespaceSpec type for use with +// apply. +func NamespaceSpec() *NamespaceSpecApplyConfiguration { + return &NamespaceSpecApplyConfiguration{} +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *NamespaceSpecApplyConfiguration) WithFinalizers(values ...v1.FinalizerName) *NamespaceSpecApplyConfiguration { + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/namespacestatus.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/namespacestatus.go new file mode 100644 index 000000000000..d950fd316169 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/namespacestatus.go @@ -0,0 +1,57 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/core/v1" +) + +// NamespaceStatusApplyConfiguration represents an declarative configuration of the NamespaceStatus type for use +// with apply. +type NamespaceStatusApplyConfiguration struct { + Phase *v1.NamespacePhase `json:"phase,omitempty"` + Conditions []NamespaceConditionApplyConfiguration `json:"conditions,omitempty"` +} + +// NamespaceStatusApplyConfiguration constructs an declarative configuration of the NamespaceStatus type for use with +// apply. +func NamespaceStatus() *NamespaceStatusApplyConfiguration { + return &NamespaceStatusApplyConfiguration{} +} + +// WithPhase sets the Phase field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Phase field is set to the value of the last call. +func (b *NamespaceStatusApplyConfiguration) WithPhase(value v1.NamespacePhase) *NamespaceStatusApplyConfiguration { + b.Phase = &value + return b +} + +// WithConditions adds the given value to the Conditions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Conditions field. +func (b *NamespaceStatusApplyConfiguration) WithConditions(values ...*NamespaceConditionApplyConfiguration) *NamespaceStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithConditions") + } + b.Conditions = append(b.Conditions, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/nfsvolumesource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/nfsvolumesource.go new file mode 100644 index 000000000000..cb300ee81eb6 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/nfsvolumesource.go @@ -0,0 +1,57 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// NFSVolumeSourceApplyConfiguration represents an declarative configuration of the NFSVolumeSource type for use +// with apply. +type NFSVolumeSourceApplyConfiguration struct { + Server *string `json:"server,omitempty"` + Path *string `json:"path,omitempty"` + ReadOnly *bool `json:"readOnly,omitempty"` +} + +// NFSVolumeSourceApplyConfiguration constructs an declarative configuration of the NFSVolumeSource type for use with +// apply. +func NFSVolumeSource() *NFSVolumeSourceApplyConfiguration { + return &NFSVolumeSourceApplyConfiguration{} +} + +// WithServer sets the Server field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Server field is set to the value of the last call. +func (b *NFSVolumeSourceApplyConfiguration) WithServer(value string) *NFSVolumeSourceApplyConfiguration { + b.Server = &value + return b +} + +// WithPath sets the Path field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Path field is set to the value of the last call. +func (b *NFSVolumeSourceApplyConfiguration) WithPath(value string) *NFSVolumeSourceApplyConfiguration { + b.Path = &value + return b +} + +// WithReadOnly sets the ReadOnly field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadOnly field is set to the value of the last call. +func (b *NFSVolumeSourceApplyConfiguration) WithReadOnly(value bool) *NFSVolumeSourceApplyConfiguration { + b.ReadOnly = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/node.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/node.go new file mode 100644 index 000000000000..4f90da59f6c5 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/node.go @@ -0,0 +1,263 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + apicorev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// NodeApplyConfiguration represents an declarative configuration of the Node type for use +// with apply. +type NodeApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *NodeSpecApplyConfiguration `json:"spec,omitempty"` + Status *NodeStatusApplyConfiguration `json:"status,omitempty"` +} + +// Node constructs an declarative configuration of the Node type for use with +// apply. +func Node(name string) *NodeApplyConfiguration { + b := &NodeApplyConfiguration{} + b.WithName(name) + b.WithKind("Node") + b.WithAPIVersion("v1") + return b +} + +// ExtractNode extracts the applied configuration owned by fieldManager from +// node. If no managedFields are found in node for fieldManager, a +// NodeApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// node must be a unmodified Node API object that was retrieved from the Kubernetes API. +// ExtractNode provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractNode(node *apicorev1.Node, fieldManager string) (*NodeApplyConfiguration, error) { + b := &NodeApplyConfiguration{} + err := managedfields.ExtractInto(node, internal.Parser().Type("io.k8s.api.core.v1.Node"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(node.Name) + + b.WithKind("Node") + b.WithAPIVersion("v1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *NodeApplyConfiguration) WithKind(value string) *NodeApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *NodeApplyConfiguration) WithAPIVersion(value string) *NodeApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *NodeApplyConfiguration) WithName(value string) *NodeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *NodeApplyConfiguration) WithGenerateName(value string) *NodeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *NodeApplyConfiguration) WithNamespace(value string) *NodeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *NodeApplyConfiguration) WithSelfLink(value string) *NodeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *NodeApplyConfiguration) WithUID(value types.UID) *NodeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *NodeApplyConfiguration) WithResourceVersion(value string) *NodeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *NodeApplyConfiguration) WithGeneration(value int64) *NodeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *NodeApplyConfiguration) WithCreationTimestamp(value metav1.Time) *NodeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *NodeApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *NodeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *NodeApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *NodeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *NodeApplyConfiguration) WithLabels(entries map[string]string) *NodeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *NodeApplyConfiguration) WithAnnotations(entries map[string]string) *NodeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *NodeApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *NodeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *NodeApplyConfiguration) WithFinalizers(values ...string) *NodeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *NodeApplyConfiguration) WithClusterName(value string) *NodeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *NodeApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *NodeApplyConfiguration) WithSpec(value *NodeSpecApplyConfiguration) *NodeApplyConfiguration { + b.Spec = value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *NodeApplyConfiguration) WithStatus(value *NodeStatusApplyConfiguration) *NodeApplyConfiguration { + b.Status = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/nodeaddress.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/nodeaddress.go new file mode 100644 index 000000000000..a1d4fbe04eec --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/nodeaddress.go @@ -0,0 +1,52 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/core/v1" +) + +// NodeAddressApplyConfiguration represents an declarative configuration of the NodeAddress type for use +// with apply. +type NodeAddressApplyConfiguration struct { + Type *v1.NodeAddressType `json:"type,omitempty"` + Address *string `json:"address,omitempty"` +} + +// NodeAddressApplyConfiguration constructs an declarative configuration of the NodeAddress type for use with +// apply. +func NodeAddress() *NodeAddressApplyConfiguration { + return &NodeAddressApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *NodeAddressApplyConfiguration) WithType(value v1.NodeAddressType) *NodeAddressApplyConfiguration { + b.Type = &value + return b +} + +// WithAddress sets the Address field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Address field is set to the value of the last call. +func (b *NodeAddressApplyConfiguration) WithAddress(value string) *NodeAddressApplyConfiguration { + b.Address = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/nodeaffinity.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/nodeaffinity.go new file mode 100644 index 000000000000..e28ced6e4638 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/nodeaffinity.go @@ -0,0 +1,53 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// NodeAffinityApplyConfiguration represents an declarative configuration of the NodeAffinity type for use +// with apply. +type NodeAffinityApplyConfiguration struct { + RequiredDuringSchedulingIgnoredDuringExecution *NodeSelectorApplyConfiguration `json:"requiredDuringSchedulingIgnoredDuringExecution,omitempty"` + PreferredDuringSchedulingIgnoredDuringExecution []PreferredSchedulingTermApplyConfiguration `json:"preferredDuringSchedulingIgnoredDuringExecution,omitempty"` +} + +// NodeAffinityApplyConfiguration constructs an declarative configuration of the NodeAffinity type for use with +// apply. +func NodeAffinity() *NodeAffinityApplyConfiguration { + return &NodeAffinityApplyConfiguration{} +} + +// WithRequiredDuringSchedulingIgnoredDuringExecution sets the RequiredDuringSchedulingIgnoredDuringExecution field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RequiredDuringSchedulingIgnoredDuringExecution field is set to the value of the last call. +func (b *NodeAffinityApplyConfiguration) WithRequiredDuringSchedulingIgnoredDuringExecution(value *NodeSelectorApplyConfiguration) *NodeAffinityApplyConfiguration { + b.RequiredDuringSchedulingIgnoredDuringExecution = value + return b +} + +// WithPreferredDuringSchedulingIgnoredDuringExecution adds the given value to the PreferredDuringSchedulingIgnoredDuringExecution field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the PreferredDuringSchedulingIgnoredDuringExecution field. +func (b *NodeAffinityApplyConfiguration) WithPreferredDuringSchedulingIgnoredDuringExecution(values ...*PreferredSchedulingTermApplyConfiguration) *NodeAffinityApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithPreferredDuringSchedulingIgnoredDuringExecution") + } + b.PreferredDuringSchedulingIgnoredDuringExecution = append(b.PreferredDuringSchedulingIgnoredDuringExecution, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/nodecondition.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/nodecondition.go new file mode 100644 index 000000000000..eb81ca543faf --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/nodecondition.go @@ -0,0 +1,89 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// NodeConditionApplyConfiguration represents an declarative configuration of the NodeCondition type for use +// with apply. +type NodeConditionApplyConfiguration struct { + Type *v1.NodeConditionType `json:"type,omitempty"` + Status *v1.ConditionStatus `json:"status,omitempty"` + LastHeartbeatTime *metav1.Time `json:"lastHeartbeatTime,omitempty"` + LastTransitionTime *metav1.Time `json:"lastTransitionTime,omitempty"` + Reason *string `json:"reason,omitempty"` + Message *string `json:"message,omitempty"` +} + +// NodeConditionApplyConfiguration constructs an declarative configuration of the NodeCondition type for use with +// apply. +func NodeCondition() *NodeConditionApplyConfiguration { + return &NodeConditionApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *NodeConditionApplyConfiguration) WithType(value v1.NodeConditionType) *NodeConditionApplyConfiguration { + b.Type = &value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *NodeConditionApplyConfiguration) WithStatus(value v1.ConditionStatus) *NodeConditionApplyConfiguration { + b.Status = &value + return b +} + +// WithLastHeartbeatTime sets the LastHeartbeatTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastHeartbeatTime field is set to the value of the last call. +func (b *NodeConditionApplyConfiguration) WithLastHeartbeatTime(value metav1.Time) *NodeConditionApplyConfiguration { + b.LastHeartbeatTime = &value + return b +} + +// WithLastTransitionTime sets the LastTransitionTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastTransitionTime field is set to the value of the last call. +func (b *NodeConditionApplyConfiguration) WithLastTransitionTime(value metav1.Time) *NodeConditionApplyConfiguration { + b.LastTransitionTime = &value + return b +} + +// WithReason sets the Reason field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Reason field is set to the value of the last call. +func (b *NodeConditionApplyConfiguration) WithReason(value string) *NodeConditionApplyConfiguration { + b.Reason = &value + return b +} + +// WithMessage sets the Message field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Message field is set to the value of the last call. +func (b *NodeConditionApplyConfiguration) WithMessage(value string) *NodeConditionApplyConfiguration { + b.Message = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/nodeconfigsource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/nodeconfigsource.go new file mode 100644 index 000000000000..60567aa431c6 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/nodeconfigsource.go @@ -0,0 +1,39 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// NodeConfigSourceApplyConfiguration represents an declarative configuration of the NodeConfigSource type for use +// with apply. +type NodeConfigSourceApplyConfiguration struct { + ConfigMap *ConfigMapNodeConfigSourceApplyConfiguration `json:"configMap,omitempty"` +} + +// NodeConfigSourceApplyConfiguration constructs an declarative configuration of the NodeConfigSource type for use with +// apply. +func NodeConfigSource() *NodeConfigSourceApplyConfiguration { + return &NodeConfigSourceApplyConfiguration{} +} + +// WithConfigMap sets the ConfigMap field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ConfigMap field is set to the value of the last call. +func (b *NodeConfigSourceApplyConfiguration) WithConfigMap(value *ConfigMapNodeConfigSourceApplyConfiguration) *NodeConfigSourceApplyConfiguration { + b.ConfigMap = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/nodeconfigstatus.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/nodeconfigstatus.go new file mode 100644 index 000000000000..71447fe9c0f4 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/nodeconfigstatus.go @@ -0,0 +1,66 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// NodeConfigStatusApplyConfiguration represents an declarative configuration of the NodeConfigStatus type for use +// with apply. +type NodeConfigStatusApplyConfiguration struct { + Assigned *NodeConfigSourceApplyConfiguration `json:"assigned,omitempty"` + Active *NodeConfigSourceApplyConfiguration `json:"active,omitempty"` + LastKnownGood *NodeConfigSourceApplyConfiguration `json:"lastKnownGood,omitempty"` + Error *string `json:"error,omitempty"` +} + +// NodeConfigStatusApplyConfiguration constructs an declarative configuration of the NodeConfigStatus type for use with +// apply. +func NodeConfigStatus() *NodeConfigStatusApplyConfiguration { + return &NodeConfigStatusApplyConfiguration{} +} + +// WithAssigned sets the Assigned field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Assigned field is set to the value of the last call. +func (b *NodeConfigStatusApplyConfiguration) WithAssigned(value *NodeConfigSourceApplyConfiguration) *NodeConfigStatusApplyConfiguration { + b.Assigned = value + return b +} + +// WithActive sets the Active field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Active field is set to the value of the last call. +func (b *NodeConfigStatusApplyConfiguration) WithActive(value *NodeConfigSourceApplyConfiguration) *NodeConfigStatusApplyConfiguration { + b.Active = value + return b +} + +// WithLastKnownGood sets the LastKnownGood field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastKnownGood field is set to the value of the last call. +func (b *NodeConfigStatusApplyConfiguration) WithLastKnownGood(value *NodeConfigSourceApplyConfiguration) *NodeConfigStatusApplyConfiguration { + b.LastKnownGood = value + return b +} + +// WithError sets the Error field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Error field is set to the value of the last call. +func (b *NodeConfigStatusApplyConfiguration) WithError(value string) *NodeConfigStatusApplyConfiguration { + b.Error = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/nodedaemonendpoints.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/nodedaemonendpoints.go new file mode 100644 index 000000000000..4cabc7f52649 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/nodedaemonendpoints.go @@ -0,0 +1,39 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// NodeDaemonEndpointsApplyConfiguration represents an declarative configuration of the NodeDaemonEndpoints type for use +// with apply. +type NodeDaemonEndpointsApplyConfiguration struct { + KubeletEndpoint *DaemonEndpointApplyConfiguration `json:"kubeletEndpoint,omitempty"` +} + +// NodeDaemonEndpointsApplyConfiguration constructs an declarative configuration of the NodeDaemonEndpoints type for use with +// apply. +func NodeDaemonEndpoints() *NodeDaemonEndpointsApplyConfiguration { + return &NodeDaemonEndpointsApplyConfiguration{} +} + +// WithKubeletEndpoint sets the KubeletEndpoint field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the KubeletEndpoint field is set to the value of the last call. +func (b *NodeDaemonEndpointsApplyConfiguration) WithKubeletEndpoint(value *DaemonEndpointApplyConfiguration) *NodeDaemonEndpointsApplyConfiguration { + b.KubeletEndpoint = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/nodeselector.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/nodeselector.go new file mode 100644 index 000000000000..5489097f5ae7 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/nodeselector.go @@ -0,0 +1,44 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// NodeSelectorApplyConfiguration represents an declarative configuration of the NodeSelector type for use +// with apply. +type NodeSelectorApplyConfiguration struct { + NodeSelectorTerms []NodeSelectorTermApplyConfiguration `json:"nodeSelectorTerms,omitempty"` +} + +// NodeSelectorApplyConfiguration constructs an declarative configuration of the NodeSelector type for use with +// apply. +func NodeSelector() *NodeSelectorApplyConfiguration { + return &NodeSelectorApplyConfiguration{} +} + +// WithNodeSelectorTerms adds the given value to the NodeSelectorTerms field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the NodeSelectorTerms field. +func (b *NodeSelectorApplyConfiguration) WithNodeSelectorTerms(values ...*NodeSelectorTermApplyConfiguration) *NodeSelectorApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithNodeSelectorTerms") + } + b.NodeSelectorTerms = append(b.NodeSelectorTerms, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/nodeselectorrequirement.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/nodeselectorrequirement.go new file mode 100644 index 000000000000..a6e43e607eff --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/nodeselectorrequirement.go @@ -0,0 +1,63 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/core/v1" +) + +// NodeSelectorRequirementApplyConfiguration represents an declarative configuration of the NodeSelectorRequirement type for use +// with apply. +type NodeSelectorRequirementApplyConfiguration struct { + Key *string `json:"key,omitempty"` + Operator *v1.NodeSelectorOperator `json:"operator,omitempty"` + Values []string `json:"values,omitempty"` +} + +// NodeSelectorRequirementApplyConfiguration constructs an declarative configuration of the NodeSelectorRequirement type for use with +// apply. +func NodeSelectorRequirement() *NodeSelectorRequirementApplyConfiguration { + return &NodeSelectorRequirementApplyConfiguration{} +} + +// WithKey sets the Key field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Key field is set to the value of the last call. +func (b *NodeSelectorRequirementApplyConfiguration) WithKey(value string) *NodeSelectorRequirementApplyConfiguration { + b.Key = &value + return b +} + +// WithOperator sets the Operator field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Operator field is set to the value of the last call. +func (b *NodeSelectorRequirementApplyConfiguration) WithOperator(value v1.NodeSelectorOperator) *NodeSelectorRequirementApplyConfiguration { + b.Operator = &value + return b +} + +// WithValues adds the given value to the Values field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Values field. +func (b *NodeSelectorRequirementApplyConfiguration) WithValues(values ...string) *NodeSelectorRequirementApplyConfiguration { + for i := range values { + b.Values = append(b.Values, values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/nodeselectorterm.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/nodeselectorterm.go new file mode 100644 index 000000000000..13b3ddbc1bed --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/nodeselectorterm.go @@ -0,0 +1,58 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// NodeSelectorTermApplyConfiguration represents an declarative configuration of the NodeSelectorTerm type for use +// with apply. +type NodeSelectorTermApplyConfiguration struct { + MatchExpressions []NodeSelectorRequirementApplyConfiguration `json:"matchExpressions,omitempty"` + MatchFields []NodeSelectorRequirementApplyConfiguration `json:"matchFields,omitempty"` +} + +// NodeSelectorTermApplyConfiguration constructs an declarative configuration of the NodeSelectorTerm type for use with +// apply. +func NodeSelectorTerm() *NodeSelectorTermApplyConfiguration { + return &NodeSelectorTermApplyConfiguration{} +} + +// WithMatchExpressions adds the given value to the MatchExpressions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the MatchExpressions field. +func (b *NodeSelectorTermApplyConfiguration) WithMatchExpressions(values ...*NodeSelectorRequirementApplyConfiguration) *NodeSelectorTermApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithMatchExpressions") + } + b.MatchExpressions = append(b.MatchExpressions, *values[i]) + } + return b +} + +// WithMatchFields adds the given value to the MatchFields field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the MatchFields field. +func (b *NodeSelectorTermApplyConfiguration) WithMatchFields(values ...*NodeSelectorRequirementApplyConfiguration) *NodeSelectorTermApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithMatchFields") + } + b.MatchFields = append(b.MatchFields, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/nodespec.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/nodespec.go new file mode 100644 index 000000000000..63b61078d02e --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/nodespec.go @@ -0,0 +1,100 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// NodeSpecApplyConfiguration represents an declarative configuration of the NodeSpec type for use +// with apply. +type NodeSpecApplyConfiguration struct { + PodCIDR *string `json:"podCIDR,omitempty"` + PodCIDRs []string `json:"podCIDRs,omitempty"` + ProviderID *string `json:"providerID,omitempty"` + Unschedulable *bool `json:"unschedulable,omitempty"` + Taints []TaintApplyConfiguration `json:"taints,omitempty"` + ConfigSource *NodeConfigSourceApplyConfiguration `json:"configSource,omitempty"` + DoNotUseExternalID *string `json:"externalID,omitempty"` +} + +// NodeSpecApplyConfiguration constructs an declarative configuration of the NodeSpec type for use with +// apply. +func NodeSpec() *NodeSpecApplyConfiguration { + return &NodeSpecApplyConfiguration{} +} + +// WithPodCIDR sets the PodCIDR field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PodCIDR field is set to the value of the last call. +func (b *NodeSpecApplyConfiguration) WithPodCIDR(value string) *NodeSpecApplyConfiguration { + b.PodCIDR = &value + return b +} + +// WithPodCIDRs adds the given value to the PodCIDRs field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the PodCIDRs field. +func (b *NodeSpecApplyConfiguration) WithPodCIDRs(values ...string) *NodeSpecApplyConfiguration { + for i := range values { + b.PodCIDRs = append(b.PodCIDRs, values[i]) + } + return b +} + +// WithProviderID sets the ProviderID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ProviderID field is set to the value of the last call. +func (b *NodeSpecApplyConfiguration) WithProviderID(value string) *NodeSpecApplyConfiguration { + b.ProviderID = &value + return b +} + +// WithUnschedulable sets the Unschedulable field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Unschedulable field is set to the value of the last call. +func (b *NodeSpecApplyConfiguration) WithUnschedulable(value bool) *NodeSpecApplyConfiguration { + b.Unschedulable = &value + return b +} + +// WithTaints adds the given value to the Taints field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Taints field. +func (b *NodeSpecApplyConfiguration) WithTaints(values ...*TaintApplyConfiguration) *NodeSpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithTaints") + } + b.Taints = append(b.Taints, *values[i]) + } + return b +} + +// WithConfigSource sets the ConfigSource field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ConfigSource field is set to the value of the last call. +func (b *NodeSpecApplyConfiguration) WithConfigSource(value *NodeConfigSourceApplyConfiguration) *NodeSpecApplyConfiguration { + b.ConfigSource = value + return b +} + +// WithDoNotUseExternalID sets the DoNotUseExternalID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DoNotUseExternalID field is set to the value of the last call. +func (b *NodeSpecApplyConfiguration) WithDoNotUseExternalID(value string) *NodeSpecApplyConfiguration { + b.DoNotUseExternalID = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/nodestatus.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/nodestatus.go new file mode 100644 index 000000000000..aa3603f4fc08 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/nodestatus.go @@ -0,0 +1,155 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/core/v1" +) + +// NodeStatusApplyConfiguration represents an declarative configuration of the NodeStatus type for use +// with apply. +type NodeStatusApplyConfiguration struct { + Capacity *v1.ResourceList `json:"capacity,omitempty"` + Allocatable *v1.ResourceList `json:"allocatable,omitempty"` + Phase *v1.NodePhase `json:"phase,omitempty"` + Conditions []NodeConditionApplyConfiguration `json:"conditions,omitempty"` + Addresses []NodeAddressApplyConfiguration `json:"addresses,omitempty"` + DaemonEndpoints *NodeDaemonEndpointsApplyConfiguration `json:"daemonEndpoints,omitempty"` + NodeInfo *NodeSystemInfoApplyConfiguration `json:"nodeInfo,omitempty"` + Images []ContainerImageApplyConfiguration `json:"images,omitempty"` + VolumesInUse []v1.UniqueVolumeName `json:"volumesInUse,omitempty"` + VolumesAttached []AttachedVolumeApplyConfiguration `json:"volumesAttached,omitempty"` + Config *NodeConfigStatusApplyConfiguration `json:"config,omitempty"` +} + +// NodeStatusApplyConfiguration constructs an declarative configuration of the NodeStatus type for use with +// apply. +func NodeStatus() *NodeStatusApplyConfiguration { + return &NodeStatusApplyConfiguration{} +} + +// WithCapacity sets the Capacity field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Capacity field is set to the value of the last call. +func (b *NodeStatusApplyConfiguration) WithCapacity(value v1.ResourceList) *NodeStatusApplyConfiguration { + b.Capacity = &value + return b +} + +// WithAllocatable sets the Allocatable field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Allocatable field is set to the value of the last call. +func (b *NodeStatusApplyConfiguration) WithAllocatable(value v1.ResourceList) *NodeStatusApplyConfiguration { + b.Allocatable = &value + return b +} + +// WithPhase sets the Phase field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Phase field is set to the value of the last call. +func (b *NodeStatusApplyConfiguration) WithPhase(value v1.NodePhase) *NodeStatusApplyConfiguration { + b.Phase = &value + return b +} + +// WithConditions adds the given value to the Conditions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Conditions field. +func (b *NodeStatusApplyConfiguration) WithConditions(values ...*NodeConditionApplyConfiguration) *NodeStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithConditions") + } + b.Conditions = append(b.Conditions, *values[i]) + } + return b +} + +// WithAddresses adds the given value to the Addresses field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Addresses field. +func (b *NodeStatusApplyConfiguration) WithAddresses(values ...*NodeAddressApplyConfiguration) *NodeStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithAddresses") + } + b.Addresses = append(b.Addresses, *values[i]) + } + return b +} + +// WithDaemonEndpoints sets the DaemonEndpoints field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DaemonEndpoints field is set to the value of the last call. +func (b *NodeStatusApplyConfiguration) WithDaemonEndpoints(value *NodeDaemonEndpointsApplyConfiguration) *NodeStatusApplyConfiguration { + b.DaemonEndpoints = value + return b +} + +// WithNodeInfo sets the NodeInfo field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NodeInfo field is set to the value of the last call. +func (b *NodeStatusApplyConfiguration) WithNodeInfo(value *NodeSystemInfoApplyConfiguration) *NodeStatusApplyConfiguration { + b.NodeInfo = value + return b +} + +// WithImages adds the given value to the Images field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Images field. +func (b *NodeStatusApplyConfiguration) WithImages(values ...*ContainerImageApplyConfiguration) *NodeStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithImages") + } + b.Images = append(b.Images, *values[i]) + } + return b +} + +// WithVolumesInUse adds the given value to the VolumesInUse field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the VolumesInUse field. +func (b *NodeStatusApplyConfiguration) WithVolumesInUse(values ...v1.UniqueVolumeName) *NodeStatusApplyConfiguration { + for i := range values { + b.VolumesInUse = append(b.VolumesInUse, values[i]) + } + return b +} + +// WithVolumesAttached adds the given value to the VolumesAttached field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the VolumesAttached field. +func (b *NodeStatusApplyConfiguration) WithVolumesAttached(values ...*AttachedVolumeApplyConfiguration) *NodeStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithVolumesAttached") + } + b.VolumesAttached = append(b.VolumesAttached, *values[i]) + } + return b +} + +// WithConfig sets the Config field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Config field is set to the value of the last call. +func (b *NodeStatusApplyConfiguration) WithConfig(value *NodeConfigStatusApplyConfiguration) *NodeStatusApplyConfiguration { + b.Config = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/nodesysteminfo.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/nodesysteminfo.go new file mode 100644 index 000000000000..2634ea984292 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/nodesysteminfo.go @@ -0,0 +1,120 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// NodeSystemInfoApplyConfiguration represents an declarative configuration of the NodeSystemInfo type for use +// with apply. +type NodeSystemInfoApplyConfiguration struct { + MachineID *string `json:"machineID,omitempty"` + SystemUUID *string `json:"systemUUID,omitempty"` + BootID *string `json:"bootID,omitempty"` + KernelVersion *string `json:"kernelVersion,omitempty"` + OSImage *string `json:"osImage,omitempty"` + ContainerRuntimeVersion *string `json:"containerRuntimeVersion,omitempty"` + KubeletVersion *string `json:"kubeletVersion,omitempty"` + KubeProxyVersion *string `json:"kubeProxyVersion,omitempty"` + OperatingSystem *string `json:"operatingSystem,omitempty"` + Architecture *string `json:"architecture,omitempty"` +} + +// NodeSystemInfoApplyConfiguration constructs an declarative configuration of the NodeSystemInfo type for use with +// apply. +func NodeSystemInfo() *NodeSystemInfoApplyConfiguration { + return &NodeSystemInfoApplyConfiguration{} +} + +// WithMachineID sets the MachineID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MachineID field is set to the value of the last call. +func (b *NodeSystemInfoApplyConfiguration) WithMachineID(value string) *NodeSystemInfoApplyConfiguration { + b.MachineID = &value + return b +} + +// WithSystemUUID sets the SystemUUID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SystemUUID field is set to the value of the last call. +func (b *NodeSystemInfoApplyConfiguration) WithSystemUUID(value string) *NodeSystemInfoApplyConfiguration { + b.SystemUUID = &value + return b +} + +// WithBootID sets the BootID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the BootID field is set to the value of the last call. +func (b *NodeSystemInfoApplyConfiguration) WithBootID(value string) *NodeSystemInfoApplyConfiguration { + b.BootID = &value + return b +} + +// WithKernelVersion sets the KernelVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the KernelVersion field is set to the value of the last call. +func (b *NodeSystemInfoApplyConfiguration) WithKernelVersion(value string) *NodeSystemInfoApplyConfiguration { + b.KernelVersion = &value + return b +} + +// WithOSImage sets the OSImage field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the OSImage field is set to the value of the last call. +func (b *NodeSystemInfoApplyConfiguration) WithOSImage(value string) *NodeSystemInfoApplyConfiguration { + b.OSImage = &value + return b +} + +// WithContainerRuntimeVersion sets the ContainerRuntimeVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ContainerRuntimeVersion field is set to the value of the last call. +func (b *NodeSystemInfoApplyConfiguration) WithContainerRuntimeVersion(value string) *NodeSystemInfoApplyConfiguration { + b.ContainerRuntimeVersion = &value + return b +} + +// WithKubeletVersion sets the KubeletVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the KubeletVersion field is set to the value of the last call. +func (b *NodeSystemInfoApplyConfiguration) WithKubeletVersion(value string) *NodeSystemInfoApplyConfiguration { + b.KubeletVersion = &value + return b +} + +// WithKubeProxyVersion sets the KubeProxyVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the KubeProxyVersion field is set to the value of the last call. +func (b *NodeSystemInfoApplyConfiguration) WithKubeProxyVersion(value string) *NodeSystemInfoApplyConfiguration { + b.KubeProxyVersion = &value + return b +} + +// WithOperatingSystem sets the OperatingSystem field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the OperatingSystem field is set to the value of the last call. +func (b *NodeSystemInfoApplyConfiguration) WithOperatingSystem(value string) *NodeSystemInfoApplyConfiguration { + b.OperatingSystem = &value + return b +} + +// WithArchitecture sets the Architecture field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Architecture field is set to the value of the last call. +func (b *NodeSystemInfoApplyConfiguration) WithArchitecture(value string) *NodeSystemInfoApplyConfiguration { + b.Architecture = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/objectfieldselector.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/objectfieldselector.go new file mode 100644 index 000000000000..0c2402b3c74d --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/objectfieldselector.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// ObjectFieldSelectorApplyConfiguration represents an declarative configuration of the ObjectFieldSelector type for use +// with apply. +type ObjectFieldSelectorApplyConfiguration struct { + APIVersion *string `json:"apiVersion,omitempty"` + FieldPath *string `json:"fieldPath,omitempty"` +} + +// ObjectFieldSelectorApplyConfiguration constructs an declarative configuration of the ObjectFieldSelector type for use with +// apply. +func ObjectFieldSelector() *ObjectFieldSelectorApplyConfiguration { + return &ObjectFieldSelectorApplyConfiguration{} +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *ObjectFieldSelectorApplyConfiguration) WithAPIVersion(value string) *ObjectFieldSelectorApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithFieldPath sets the FieldPath field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FieldPath field is set to the value of the last call. +func (b *ObjectFieldSelectorApplyConfiguration) WithFieldPath(value string) *ObjectFieldSelectorApplyConfiguration { + b.FieldPath = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/objectreference.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/objectreference.go new file mode 100644 index 000000000000..667fa84a8176 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/objectreference.go @@ -0,0 +1,97 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + types "k8s.io/apimachinery/pkg/types" +) + +// ObjectReferenceApplyConfiguration represents an declarative configuration of the ObjectReference type for use +// with apply. +type ObjectReferenceApplyConfiguration struct { + Kind *string `json:"kind,omitempty"` + Namespace *string `json:"namespace,omitempty"` + Name *string `json:"name,omitempty"` + UID *types.UID `json:"uid,omitempty"` + APIVersion *string `json:"apiVersion,omitempty"` + ResourceVersion *string `json:"resourceVersion,omitempty"` + FieldPath *string `json:"fieldPath,omitempty"` +} + +// ObjectReferenceApplyConfiguration constructs an declarative configuration of the ObjectReference type for use with +// apply. +func ObjectReference() *ObjectReferenceApplyConfiguration { + return &ObjectReferenceApplyConfiguration{} +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *ObjectReferenceApplyConfiguration) WithKind(value string) *ObjectReferenceApplyConfiguration { + b.Kind = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *ObjectReferenceApplyConfiguration) WithNamespace(value string) *ObjectReferenceApplyConfiguration { + b.Namespace = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ObjectReferenceApplyConfiguration) WithName(value string) *ObjectReferenceApplyConfiguration { + b.Name = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *ObjectReferenceApplyConfiguration) WithUID(value types.UID) *ObjectReferenceApplyConfiguration { + b.UID = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *ObjectReferenceApplyConfiguration) WithAPIVersion(value string) *ObjectReferenceApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *ObjectReferenceApplyConfiguration) WithResourceVersion(value string) *ObjectReferenceApplyConfiguration { + b.ResourceVersion = &value + return b +} + +// WithFieldPath sets the FieldPath field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FieldPath field is set to the value of the last call. +func (b *ObjectReferenceApplyConfiguration) WithFieldPath(value string) *ObjectReferenceApplyConfiguration { + b.FieldPath = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolume.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolume.go new file mode 100644 index 000000000000..a5df345e15bb --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolume.go @@ -0,0 +1,263 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + apicorev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// PersistentVolumeApplyConfiguration represents an declarative configuration of the PersistentVolume type for use +// with apply. +type PersistentVolumeApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *PersistentVolumeSpecApplyConfiguration `json:"spec,omitempty"` + Status *PersistentVolumeStatusApplyConfiguration `json:"status,omitempty"` +} + +// PersistentVolume constructs an declarative configuration of the PersistentVolume type for use with +// apply. +func PersistentVolume(name string) *PersistentVolumeApplyConfiguration { + b := &PersistentVolumeApplyConfiguration{} + b.WithName(name) + b.WithKind("PersistentVolume") + b.WithAPIVersion("v1") + return b +} + +// ExtractPersistentVolume extracts the applied configuration owned by fieldManager from +// persistentVolume. If no managedFields are found in persistentVolume for fieldManager, a +// PersistentVolumeApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// persistentVolume must be a unmodified PersistentVolume API object that was retrieved from the Kubernetes API. +// ExtractPersistentVolume provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractPersistentVolume(persistentVolume *apicorev1.PersistentVolume, fieldManager string) (*PersistentVolumeApplyConfiguration, error) { + b := &PersistentVolumeApplyConfiguration{} + err := managedfields.ExtractInto(persistentVolume, internal.Parser().Type("io.k8s.api.core.v1.PersistentVolume"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(persistentVolume.Name) + + b.WithKind("PersistentVolume") + b.WithAPIVersion("v1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *PersistentVolumeApplyConfiguration) WithKind(value string) *PersistentVolumeApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *PersistentVolumeApplyConfiguration) WithAPIVersion(value string) *PersistentVolumeApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *PersistentVolumeApplyConfiguration) WithName(value string) *PersistentVolumeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *PersistentVolumeApplyConfiguration) WithGenerateName(value string) *PersistentVolumeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *PersistentVolumeApplyConfiguration) WithNamespace(value string) *PersistentVolumeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *PersistentVolumeApplyConfiguration) WithSelfLink(value string) *PersistentVolumeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *PersistentVolumeApplyConfiguration) WithUID(value types.UID) *PersistentVolumeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *PersistentVolumeApplyConfiguration) WithResourceVersion(value string) *PersistentVolumeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *PersistentVolumeApplyConfiguration) WithGeneration(value int64) *PersistentVolumeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *PersistentVolumeApplyConfiguration) WithCreationTimestamp(value metav1.Time) *PersistentVolumeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *PersistentVolumeApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *PersistentVolumeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *PersistentVolumeApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *PersistentVolumeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *PersistentVolumeApplyConfiguration) WithLabels(entries map[string]string) *PersistentVolumeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *PersistentVolumeApplyConfiguration) WithAnnotations(entries map[string]string) *PersistentVolumeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *PersistentVolumeApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *PersistentVolumeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *PersistentVolumeApplyConfiguration) WithFinalizers(values ...string) *PersistentVolumeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *PersistentVolumeApplyConfiguration) WithClusterName(value string) *PersistentVolumeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *PersistentVolumeApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *PersistentVolumeApplyConfiguration) WithSpec(value *PersistentVolumeSpecApplyConfiguration) *PersistentVolumeApplyConfiguration { + b.Spec = value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *PersistentVolumeApplyConfiguration) WithStatus(value *PersistentVolumeStatusApplyConfiguration) *PersistentVolumeApplyConfiguration { + b.Status = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumeclaim.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumeclaim.go new file mode 100644 index 000000000000..229b5d48164c --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumeclaim.go @@ -0,0 +1,265 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + apicorev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// PersistentVolumeClaimApplyConfiguration represents an declarative configuration of the PersistentVolumeClaim type for use +// with apply. +type PersistentVolumeClaimApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *PersistentVolumeClaimSpecApplyConfiguration `json:"spec,omitempty"` + Status *PersistentVolumeClaimStatusApplyConfiguration `json:"status,omitempty"` +} + +// PersistentVolumeClaim constructs an declarative configuration of the PersistentVolumeClaim type for use with +// apply. +func PersistentVolumeClaim(name, namespace string) *PersistentVolumeClaimApplyConfiguration { + b := &PersistentVolumeClaimApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("PersistentVolumeClaim") + b.WithAPIVersion("v1") + return b +} + +// ExtractPersistentVolumeClaim extracts the applied configuration owned by fieldManager from +// persistentVolumeClaim. If no managedFields are found in persistentVolumeClaim for fieldManager, a +// PersistentVolumeClaimApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// persistentVolumeClaim must be a unmodified PersistentVolumeClaim API object that was retrieved from the Kubernetes API. +// ExtractPersistentVolumeClaim provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractPersistentVolumeClaim(persistentVolumeClaim *apicorev1.PersistentVolumeClaim, fieldManager string) (*PersistentVolumeClaimApplyConfiguration, error) { + b := &PersistentVolumeClaimApplyConfiguration{} + err := managedfields.ExtractInto(persistentVolumeClaim, internal.Parser().Type("io.k8s.api.core.v1.PersistentVolumeClaim"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(persistentVolumeClaim.Name) + b.WithNamespace(persistentVolumeClaim.Namespace) + + b.WithKind("PersistentVolumeClaim") + b.WithAPIVersion("v1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *PersistentVolumeClaimApplyConfiguration) WithKind(value string) *PersistentVolumeClaimApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *PersistentVolumeClaimApplyConfiguration) WithAPIVersion(value string) *PersistentVolumeClaimApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *PersistentVolumeClaimApplyConfiguration) WithName(value string) *PersistentVolumeClaimApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *PersistentVolumeClaimApplyConfiguration) WithGenerateName(value string) *PersistentVolumeClaimApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *PersistentVolumeClaimApplyConfiguration) WithNamespace(value string) *PersistentVolumeClaimApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *PersistentVolumeClaimApplyConfiguration) WithSelfLink(value string) *PersistentVolumeClaimApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *PersistentVolumeClaimApplyConfiguration) WithUID(value types.UID) *PersistentVolumeClaimApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *PersistentVolumeClaimApplyConfiguration) WithResourceVersion(value string) *PersistentVolumeClaimApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *PersistentVolumeClaimApplyConfiguration) WithGeneration(value int64) *PersistentVolumeClaimApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *PersistentVolumeClaimApplyConfiguration) WithCreationTimestamp(value metav1.Time) *PersistentVolumeClaimApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *PersistentVolumeClaimApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *PersistentVolumeClaimApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *PersistentVolumeClaimApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *PersistentVolumeClaimApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *PersistentVolumeClaimApplyConfiguration) WithLabels(entries map[string]string) *PersistentVolumeClaimApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *PersistentVolumeClaimApplyConfiguration) WithAnnotations(entries map[string]string) *PersistentVolumeClaimApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *PersistentVolumeClaimApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *PersistentVolumeClaimApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *PersistentVolumeClaimApplyConfiguration) WithFinalizers(values ...string) *PersistentVolumeClaimApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *PersistentVolumeClaimApplyConfiguration) WithClusterName(value string) *PersistentVolumeClaimApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *PersistentVolumeClaimApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *PersistentVolumeClaimApplyConfiguration) WithSpec(value *PersistentVolumeClaimSpecApplyConfiguration) *PersistentVolumeClaimApplyConfiguration { + b.Spec = value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *PersistentVolumeClaimApplyConfiguration) WithStatus(value *PersistentVolumeClaimStatusApplyConfiguration) *PersistentVolumeClaimApplyConfiguration { + b.Status = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumeclaimcondition.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumeclaimcondition.go new file mode 100644 index 000000000000..65449e92eba3 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumeclaimcondition.go @@ -0,0 +1,89 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// PersistentVolumeClaimConditionApplyConfiguration represents an declarative configuration of the PersistentVolumeClaimCondition type for use +// with apply. +type PersistentVolumeClaimConditionApplyConfiguration struct { + Type *v1.PersistentVolumeClaimConditionType `json:"type,omitempty"` + Status *v1.ConditionStatus `json:"status,omitempty"` + LastProbeTime *metav1.Time `json:"lastProbeTime,omitempty"` + LastTransitionTime *metav1.Time `json:"lastTransitionTime,omitempty"` + Reason *string `json:"reason,omitempty"` + Message *string `json:"message,omitempty"` +} + +// PersistentVolumeClaimConditionApplyConfiguration constructs an declarative configuration of the PersistentVolumeClaimCondition type for use with +// apply. +func PersistentVolumeClaimCondition() *PersistentVolumeClaimConditionApplyConfiguration { + return &PersistentVolumeClaimConditionApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *PersistentVolumeClaimConditionApplyConfiguration) WithType(value v1.PersistentVolumeClaimConditionType) *PersistentVolumeClaimConditionApplyConfiguration { + b.Type = &value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *PersistentVolumeClaimConditionApplyConfiguration) WithStatus(value v1.ConditionStatus) *PersistentVolumeClaimConditionApplyConfiguration { + b.Status = &value + return b +} + +// WithLastProbeTime sets the LastProbeTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastProbeTime field is set to the value of the last call. +func (b *PersistentVolumeClaimConditionApplyConfiguration) WithLastProbeTime(value metav1.Time) *PersistentVolumeClaimConditionApplyConfiguration { + b.LastProbeTime = &value + return b +} + +// WithLastTransitionTime sets the LastTransitionTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastTransitionTime field is set to the value of the last call. +func (b *PersistentVolumeClaimConditionApplyConfiguration) WithLastTransitionTime(value metav1.Time) *PersistentVolumeClaimConditionApplyConfiguration { + b.LastTransitionTime = &value + return b +} + +// WithReason sets the Reason field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Reason field is set to the value of the last call. +func (b *PersistentVolumeClaimConditionApplyConfiguration) WithReason(value string) *PersistentVolumeClaimConditionApplyConfiguration { + b.Reason = &value + return b +} + +// WithMessage sets the Message field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Message field is set to the value of the last call. +func (b *PersistentVolumeClaimConditionApplyConfiguration) WithMessage(value string) *PersistentVolumeClaimConditionApplyConfiguration { + b.Message = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumeclaimspec.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumeclaimspec.go new file mode 100644 index 000000000000..ac4d64c7114b --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumeclaimspec.go @@ -0,0 +1,100 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// PersistentVolumeClaimSpecApplyConfiguration represents an declarative configuration of the PersistentVolumeClaimSpec type for use +// with apply. +type PersistentVolumeClaimSpecApplyConfiguration struct { + AccessModes []v1.PersistentVolumeAccessMode `json:"accessModes,omitempty"` + Selector *metav1.LabelSelectorApplyConfiguration `json:"selector,omitempty"` + Resources *ResourceRequirementsApplyConfiguration `json:"resources,omitempty"` + VolumeName *string `json:"volumeName,omitempty"` + StorageClassName *string `json:"storageClassName,omitempty"` + VolumeMode *v1.PersistentVolumeMode `json:"volumeMode,omitempty"` + DataSource *TypedLocalObjectReferenceApplyConfiguration `json:"dataSource,omitempty"` +} + +// PersistentVolumeClaimSpecApplyConfiguration constructs an declarative configuration of the PersistentVolumeClaimSpec type for use with +// apply. +func PersistentVolumeClaimSpec() *PersistentVolumeClaimSpecApplyConfiguration { + return &PersistentVolumeClaimSpecApplyConfiguration{} +} + +// WithAccessModes adds the given value to the AccessModes field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the AccessModes field. +func (b *PersistentVolumeClaimSpecApplyConfiguration) WithAccessModes(values ...v1.PersistentVolumeAccessMode) *PersistentVolumeClaimSpecApplyConfiguration { + for i := range values { + b.AccessModes = append(b.AccessModes, values[i]) + } + return b +} + +// WithSelector sets the Selector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Selector field is set to the value of the last call. +func (b *PersistentVolumeClaimSpecApplyConfiguration) WithSelector(value *metav1.LabelSelectorApplyConfiguration) *PersistentVolumeClaimSpecApplyConfiguration { + b.Selector = value + return b +} + +// WithResources sets the Resources field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Resources field is set to the value of the last call. +func (b *PersistentVolumeClaimSpecApplyConfiguration) WithResources(value *ResourceRequirementsApplyConfiguration) *PersistentVolumeClaimSpecApplyConfiguration { + b.Resources = value + return b +} + +// WithVolumeName sets the VolumeName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the VolumeName field is set to the value of the last call. +func (b *PersistentVolumeClaimSpecApplyConfiguration) WithVolumeName(value string) *PersistentVolumeClaimSpecApplyConfiguration { + b.VolumeName = &value + return b +} + +// WithStorageClassName sets the StorageClassName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the StorageClassName field is set to the value of the last call. +func (b *PersistentVolumeClaimSpecApplyConfiguration) WithStorageClassName(value string) *PersistentVolumeClaimSpecApplyConfiguration { + b.StorageClassName = &value + return b +} + +// WithVolumeMode sets the VolumeMode field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the VolumeMode field is set to the value of the last call. +func (b *PersistentVolumeClaimSpecApplyConfiguration) WithVolumeMode(value v1.PersistentVolumeMode) *PersistentVolumeClaimSpecApplyConfiguration { + b.VolumeMode = &value + return b +} + +// WithDataSource sets the DataSource field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DataSource field is set to the value of the last call. +func (b *PersistentVolumeClaimSpecApplyConfiguration) WithDataSource(value *TypedLocalObjectReferenceApplyConfiguration) *PersistentVolumeClaimSpecApplyConfiguration { + b.DataSource = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumeclaimstatus.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumeclaimstatus.go new file mode 100644 index 000000000000..711651e0bcb7 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumeclaimstatus.go @@ -0,0 +1,77 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/core/v1" +) + +// PersistentVolumeClaimStatusApplyConfiguration represents an declarative configuration of the PersistentVolumeClaimStatus type for use +// with apply. +type PersistentVolumeClaimStatusApplyConfiguration struct { + Phase *v1.PersistentVolumeClaimPhase `json:"phase,omitempty"` + AccessModes []v1.PersistentVolumeAccessMode `json:"accessModes,omitempty"` + Capacity *v1.ResourceList `json:"capacity,omitempty"` + Conditions []PersistentVolumeClaimConditionApplyConfiguration `json:"conditions,omitempty"` +} + +// PersistentVolumeClaimStatusApplyConfiguration constructs an declarative configuration of the PersistentVolumeClaimStatus type for use with +// apply. +func PersistentVolumeClaimStatus() *PersistentVolumeClaimStatusApplyConfiguration { + return &PersistentVolumeClaimStatusApplyConfiguration{} +} + +// WithPhase sets the Phase field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Phase field is set to the value of the last call. +func (b *PersistentVolumeClaimStatusApplyConfiguration) WithPhase(value v1.PersistentVolumeClaimPhase) *PersistentVolumeClaimStatusApplyConfiguration { + b.Phase = &value + return b +} + +// WithAccessModes adds the given value to the AccessModes field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the AccessModes field. +func (b *PersistentVolumeClaimStatusApplyConfiguration) WithAccessModes(values ...v1.PersistentVolumeAccessMode) *PersistentVolumeClaimStatusApplyConfiguration { + for i := range values { + b.AccessModes = append(b.AccessModes, values[i]) + } + return b +} + +// WithCapacity sets the Capacity field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Capacity field is set to the value of the last call. +func (b *PersistentVolumeClaimStatusApplyConfiguration) WithCapacity(value v1.ResourceList) *PersistentVolumeClaimStatusApplyConfiguration { + b.Capacity = &value + return b +} + +// WithConditions adds the given value to the Conditions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Conditions field. +func (b *PersistentVolumeClaimStatusApplyConfiguration) WithConditions(values ...*PersistentVolumeClaimConditionApplyConfiguration) *PersistentVolumeClaimStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithConditions") + } + b.Conditions = append(b.Conditions, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumeclaimtemplate.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumeclaimtemplate.go new file mode 100644 index 000000000000..ac1b6bf0155c --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumeclaimtemplate.go @@ -0,0 +1,206 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// PersistentVolumeClaimTemplateApplyConfiguration represents an declarative configuration of the PersistentVolumeClaimTemplate type for use +// with apply. +type PersistentVolumeClaimTemplateApplyConfiguration struct { + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *PersistentVolumeClaimSpecApplyConfiguration `json:"spec,omitempty"` +} + +// PersistentVolumeClaimTemplateApplyConfiguration constructs an declarative configuration of the PersistentVolumeClaimTemplate type for use with +// apply. +func PersistentVolumeClaimTemplate() *PersistentVolumeClaimTemplateApplyConfiguration { + return &PersistentVolumeClaimTemplateApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *PersistentVolumeClaimTemplateApplyConfiguration) WithName(value string) *PersistentVolumeClaimTemplateApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *PersistentVolumeClaimTemplateApplyConfiguration) WithGenerateName(value string) *PersistentVolumeClaimTemplateApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *PersistentVolumeClaimTemplateApplyConfiguration) WithNamespace(value string) *PersistentVolumeClaimTemplateApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *PersistentVolumeClaimTemplateApplyConfiguration) WithSelfLink(value string) *PersistentVolumeClaimTemplateApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *PersistentVolumeClaimTemplateApplyConfiguration) WithUID(value types.UID) *PersistentVolumeClaimTemplateApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *PersistentVolumeClaimTemplateApplyConfiguration) WithResourceVersion(value string) *PersistentVolumeClaimTemplateApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *PersistentVolumeClaimTemplateApplyConfiguration) WithGeneration(value int64) *PersistentVolumeClaimTemplateApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *PersistentVolumeClaimTemplateApplyConfiguration) WithCreationTimestamp(value metav1.Time) *PersistentVolumeClaimTemplateApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *PersistentVolumeClaimTemplateApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *PersistentVolumeClaimTemplateApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *PersistentVolumeClaimTemplateApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *PersistentVolumeClaimTemplateApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *PersistentVolumeClaimTemplateApplyConfiguration) WithLabels(entries map[string]string) *PersistentVolumeClaimTemplateApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *PersistentVolumeClaimTemplateApplyConfiguration) WithAnnotations(entries map[string]string) *PersistentVolumeClaimTemplateApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *PersistentVolumeClaimTemplateApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *PersistentVolumeClaimTemplateApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *PersistentVolumeClaimTemplateApplyConfiguration) WithFinalizers(values ...string) *PersistentVolumeClaimTemplateApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *PersistentVolumeClaimTemplateApplyConfiguration) WithClusterName(value string) *PersistentVolumeClaimTemplateApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *PersistentVolumeClaimTemplateApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *PersistentVolumeClaimTemplateApplyConfiguration) WithSpec(value *PersistentVolumeClaimSpecApplyConfiguration) *PersistentVolumeClaimTemplateApplyConfiguration { + b.Spec = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumeclaimvolumesource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumeclaimvolumesource.go new file mode 100644 index 000000000000..a498fa6a5eb2 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumeclaimvolumesource.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// PersistentVolumeClaimVolumeSourceApplyConfiguration represents an declarative configuration of the PersistentVolumeClaimVolumeSource type for use +// with apply. +type PersistentVolumeClaimVolumeSourceApplyConfiguration struct { + ClaimName *string `json:"claimName,omitempty"` + ReadOnly *bool `json:"readOnly,omitempty"` +} + +// PersistentVolumeClaimVolumeSourceApplyConfiguration constructs an declarative configuration of the PersistentVolumeClaimVolumeSource type for use with +// apply. +func PersistentVolumeClaimVolumeSource() *PersistentVolumeClaimVolumeSourceApplyConfiguration { + return &PersistentVolumeClaimVolumeSourceApplyConfiguration{} +} + +// WithClaimName sets the ClaimName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClaimName field is set to the value of the last call. +func (b *PersistentVolumeClaimVolumeSourceApplyConfiguration) WithClaimName(value string) *PersistentVolumeClaimVolumeSourceApplyConfiguration { + b.ClaimName = &value + return b +} + +// WithReadOnly sets the ReadOnly field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadOnly field is set to the value of the last call. +func (b *PersistentVolumeClaimVolumeSourceApplyConfiguration) WithReadOnly(value bool) *PersistentVolumeClaimVolumeSourceApplyConfiguration { + b.ReadOnly = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumesource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumesource.go new file mode 100644 index 000000000000..0576e7dd31e0 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumesource.go @@ -0,0 +1,228 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// PersistentVolumeSourceApplyConfiguration represents an declarative configuration of the PersistentVolumeSource type for use +// with apply. +type PersistentVolumeSourceApplyConfiguration struct { + GCEPersistentDisk *GCEPersistentDiskVolumeSourceApplyConfiguration `json:"gcePersistentDisk,omitempty"` + AWSElasticBlockStore *AWSElasticBlockStoreVolumeSourceApplyConfiguration `json:"awsElasticBlockStore,omitempty"` + HostPath *HostPathVolumeSourceApplyConfiguration `json:"hostPath,omitempty"` + Glusterfs *GlusterfsPersistentVolumeSourceApplyConfiguration `json:"glusterfs,omitempty"` + NFS *NFSVolumeSourceApplyConfiguration `json:"nfs,omitempty"` + RBD *RBDPersistentVolumeSourceApplyConfiguration `json:"rbd,omitempty"` + ISCSI *ISCSIPersistentVolumeSourceApplyConfiguration `json:"iscsi,omitempty"` + Cinder *CinderPersistentVolumeSourceApplyConfiguration `json:"cinder,omitempty"` + CephFS *CephFSPersistentVolumeSourceApplyConfiguration `json:"cephfs,omitempty"` + FC *FCVolumeSourceApplyConfiguration `json:"fc,omitempty"` + Flocker *FlockerVolumeSourceApplyConfiguration `json:"flocker,omitempty"` + FlexVolume *FlexPersistentVolumeSourceApplyConfiguration `json:"flexVolume,omitempty"` + AzureFile *AzureFilePersistentVolumeSourceApplyConfiguration `json:"azureFile,omitempty"` + VsphereVolume *VsphereVirtualDiskVolumeSourceApplyConfiguration `json:"vsphereVolume,omitempty"` + Quobyte *QuobyteVolumeSourceApplyConfiguration `json:"quobyte,omitempty"` + AzureDisk *AzureDiskVolumeSourceApplyConfiguration `json:"azureDisk,omitempty"` + PhotonPersistentDisk *PhotonPersistentDiskVolumeSourceApplyConfiguration `json:"photonPersistentDisk,omitempty"` + PortworxVolume *PortworxVolumeSourceApplyConfiguration `json:"portworxVolume,omitempty"` + ScaleIO *ScaleIOPersistentVolumeSourceApplyConfiguration `json:"scaleIO,omitempty"` + Local *LocalVolumeSourceApplyConfiguration `json:"local,omitempty"` + StorageOS *StorageOSPersistentVolumeSourceApplyConfiguration `json:"storageos,omitempty"` + CSI *CSIPersistentVolumeSourceApplyConfiguration `json:"csi,omitempty"` +} + +// PersistentVolumeSourceApplyConfiguration constructs an declarative configuration of the PersistentVolumeSource type for use with +// apply. +func PersistentVolumeSource() *PersistentVolumeSourceApplyConfiguration { + return &PersistentVolumeSourceApplyConfiguration{} +} + +// WithGCEPersistentDisk sets the GCEPersistentDisk field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GCEPersistentDisk field is set to the value of the last call. +func (b *PersistentVolumeSourceApplyConfiguration) WithGCEPersistentDisk(value *GCEPersistentDiskVolumeSourceApplyConfiguration) *PersistentVolumeSourceApplyConfiguration { + b.GCEPersistentDisk = value + return b +} + +// WithAWSElasticBlockStore sets the AWSElasticBlockStore field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AWSElasticBlockStore field is set to the value of the last call. +func (b *PersistentVolumeSourceApplyConfiguration) WithAWSElasticBlockStore(value *AWSElasticBlockStoreVolumeSourceApplyConfiguration) *PersistentVolumeSourceApplyConfiguration { + b.AWSElasticBlockStore = value + return b +} + +// WithHostPath sets the HostPath field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the HostPath field is set to the value of the last call. +func (b *PersistentVolumeSourceApplyConfiguration) WithHostPath(value *HostPathVolumeSourceApplyConfiguration) *PersistentVolumeSourceApplyConfiguration { + b.HostPath = value + return b +} + +// WithGlusterfs sets the Glusterfs field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Glusterfs field is set to the value of the last call. +func (b *PersistentVolumeSourceApplyConfiguration) WithGlusterfs(value *GlusterfsPersistentVolumeSourceApplyConfiguration) *PersistentVolumeSourceApplyConfiguration { + b.Glusterfs = value + return b +} + +// WithNFS sets the NFS field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NFS field is set to the value of the last call. +func (b *PersistentVolumeSourceApplyConfiguration) WithNFS(value *NFSVolumeSourceApplyConfiguration) *PersistentVolumeSourceApplyConfiguration { + b.NFS = value + return b +} + +// WithRBD sets the RBD field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RBD field is set to the value of the last call. +func (b *PersistentVolumeSourceApplyConfiguration) WithRBD(value *RBDPersistentVolumeSourceApplyConfiguration) *PersistentVolumeSourceApplyConfiguration { + b.RBD = value + return b +} + +// WithISCSI sets the ISCSI field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ISCSI field is set to the value of the last call. +func (b *PersistentVolumeSourceApplyConfiguration) WithISCSI(value *ISCSIPersistentVolumeSourceApplyConfiguration) *PersistentVolumeSourceApplyConfiguration { + b.ISCSI = value + return b +} + +// WithCinder sets the Cinder field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Cinder field is set to the value of the last call. +func (b *PersistentVolumeSourceApplyConfiguration) WithCinder(value *CinderPersistentVolumeSourceApplyConfiguration) *PersistentVolumeSourceApplyConfiguration { + b.Cinder = value + return b +} + +// WithCephFS sets the CephFS field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CephFS field is set to the value of the last call. +func (b *PersistentVolumeSourceApplyConfiguration) WithCephFS(value *CephFSPersistentVolumeSourceApplyConfiguration) *PersistentVolumeSourceApplyConfiguration { + b.CephFS = value + return b +} + +// WithFC sets the FC field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FC field is set to the value of the last call. +func (b *PersistentVolumeSourceApplyConfiguration) WithFC(value *FCVolumeSourceApplyConfiguration) *PersistentVolumeSourceApplyConfiguration { + b.FC = value + return b +} + +// WithFlocker sets the Flocker field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Flocker field is set to the value of the last call. +func (b *PersistentVolumeSourceApplyConfiguration) WithFlocker(value *FlockerVolumeSourceApplyConfiguration) *PersistentVolumeSourceApplyConfiguration { + b.Flocker = value + return b +} + +// WithFlexVolume sets the FlexVolume field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FlexVolume field is set to the value of the last call. +func (b *PersistentVolumeSourceApplyConfiguration) WithFlexVolume(value *FlexPersistentVolumeSourceApplyConfiguration) *PersistentVolumeSourceApplyConfiguration { + b.FlexVolume = value + return b +} + +// WithAzureFile sets the AzureFile field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AzureFile field is set to the value of the last call. +func (b *PersistentVolumeSourceApplyConfiguration) WithAzureFile(value *AzureFilePersistentVolumeSourceApplyConfiguration) *PersistentVolumeSourceApplyConfiguration { + b.AzureFile = value + return b +} + +// WithVsphereVolume sets the VsphereVolume field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the VsphereVolume field is set to the value of the last call. +func (b *PersistentVolumeSourceApplyConfiguration) WithVsphereVolume(value *VsphereVirtualDiskVolumeSourceApplyConfiguration) *PersistentVolumeSourceApplyConfiguration { + b.VsphereVolume = value + return b +} + +// WithQuobyte sets the Quobyte field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Quobyte field is set to the value of the last call. +func (b *PersistentVolumeSourceApplyConfiguration) WithQuobyte(value *QuobyteVolumeSourceApplyConfiguration) *PersistentVolumeSourceApplyConfiguration { + b.Quobyte = value + return b +} + +// WithAzureDisk sets the AzureDisk field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AzureDisk field is set to the value of the last call. +func (b *PersistentVolumeSourceApplyConfiguration) WithAzureDisk(value *AzureDiskVolumeSourceApplyConfiguration) *PersistentVolumeSourceApplyConfiguration { + b.AzureDisk = value + return b +} + +// WithPhotonPersistentDisk sets the PhotonPersistentDisk field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PhotonPersistentDisk field is set to the value of the last call. +func (b *PersistentVolumeSourceApplyConfiguration) WithPhotonPersistentDisk(value *PhotonPersistentDiskVolumeSourceApplyConfiguration) *PersistentVolumeSourceApplyConfiguration { + b.PhotonPersistentDisk = value + return b +} + +// WithPortworxVolume sets the PortworxVolume field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PortworxVolume field is set to the value of the last call. +func (b *PersistentVolumeSourceApplyConfiguration) WithPortworxVolume(value *PortworxVolumeSourceApplyConfiguration) *PersistentVolumeSourceApplyConfiguration { + b.PortworxVolume = value + return b +} + +// WithScaleIO sets the ScaleIO field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ScaleIO field is set to the value of the last call. +func (b *PersistentVolumeSourceApplyConfiguration) WithScaleIO(value *ScaleIOPersistentVolumeSourceApplyConfiguration) *PersistentVolumeSourceApplyConfiguration { + b.ScaleIO = value + return b +} + +// WithLocal sets the Local field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Local field is set to the value of the last call. +func (b *PersistentVolumeSourceApplyConfiguration) WithLocal(value *LocalVolumeSourceApplyConfiguration) *PersistentVolumeSourceApplyConfiguration { + b.Local = value + return b +} + +// WithStorageOS sets the StorageOS field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the StorageOS field is set to the value of the last call. +func (b *PersistentVolumeSourceApplyConfiguration) WithStorageOS(value *StorageOSPersistentVolumeSourceApplyConfiguration) *PersistentVolumeSourceApplyConfiguration { + b.StorageOS = value + return b +} + +// WithCSI sets the CSI field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CSI field is set to the value of the last call. +func (b *PersistentVolumeSourceApplyConfiguration) WithCSI(value *CSIPersistentVolumeSourceApplyConfiguration) *PersistentVolumeSourceApplyConfiguration { + b.CSI = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumespec.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumespec.go new file mode 100644 index 000000000000..b3a72b1c3ef5 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumespec.go @@ -0,0 +1,287 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/core/v1" +) + +// PersistentVolumeSpecApplyConfiguration represents an declarative configuration of the PersistentVolumeSpec type for use +// with apply. +type PersistentVolumeSpecApplyConfiguration struct { + Capacity *v1.ResourceList `json:"capacity,omitempty"` + PersistentVolumeSourceApplyConfiguration `json:",inline"` + AccessModes []v1.PersistentVolumeAccessMode `json:"accessModes,omitempty"` + ClaimRef *ObjectReferenceApplyConfiguration `json:"claimRef,omitempty"` + PersistentVolumeReclaimPolicy *v1.PersistentVolumeReclaimPolicy `json:"persistentVolumeReclaimPolicy,omitempty"` + StorageClassName *string `json:"storageClassName,omitempty"` + MountOptions []string `json:"mountOptions,omitempty"` + VolumeMode *v1.PersistentVolumeMode `json:"volumeMode,omitempty"` + NodeAffinity *VolumeNodeAffinityApplyConfiguration `json:"nodeAffinity,omitempty"` +} + +// PersistentVolumeSpecApplyConfiguration constructs an declarative configuration of the PersistentVolumeSpec type for use with +// apply. +func PersistentVolumeSpec() *PersistentVolumeSpecApplyConfiguration { + return &PersistentVolumeSpecApplyConfiguration{} +} + +// WithCapacity sets the Capacity field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Capacity field is set to the value of the last call. +func (b *PersistentVolumeSpecApplyConfiguration) WithCapacity(value v1.ResourceList) *PersistentVolumeSpecApplyConfiguration { + b.Capacity = &value + return b +} + +// WithGCEPersistentDisk sets the GCEPersistentDisk field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GCEPersistentDisk field is set to the value of the last call. +func (b *PersistentVolumeSpecApplyConfiguration) WithGCEPersistentDisk(value *GCEPersistentDiskVolumeSourceApplyConfiguration) *PersistentVolumeSpecApplyConfiguration { + b.GCEPersistentDisk = value + return b +} + +// WithAWSElasticBlockStore sets the AWSElasticBlockStore field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AWSElasticBlockStore field is set to the value of the last call. +func (b *PersistentVolumeSpecApplyConfiguration) WithAWSElasticBlockStore(value *AWSElasticBlockStoreVolumeSourceApplyConfiguration) *PersistentVolumeSpecApplyConfiguration { + b.AWSElasticBlockStore = value + return b +} + +// WithHostPath sets the HostPath field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the HostPath field is set to the value of the last call. +func (b *PersistentVolumeSpecApplyConfiguration) WithHostPath(value *HostPathVolumeSourceApplyConfiguration) *PersistentVolumeSpecApplyConfiguration { + b.HostPath = value + return b +} + +// WithGlusterfs sets the Glusterfs field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Glusterfs field is set to the value of the last call. +func (b *PersistentVolumeSpecApplyConfiguration) WithGlusterfs(value *GlusterfsPersistentVolumeSourceApplyConfiguration) *PersistentVolumeSpecApplyConfiguration { + b.Glusterfs = value + return b +} + +// WithNFS sets the NFS field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NFS field is set to the value of the last call. +func (b *PersistentVolumeSpecApplyConfiguration) WithNFS(value *NFSVolumeSourceApplyConfiguration) *PersistentVolumeSpecApplyConfiguration { + b.NFS = value + return b +} + +// WithRBD sets the RBD field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RBD field is set to the value of the last call. +func (b *PersistentVolumeSpecApplyConfiguration) WithRBD(value *RBDPersistentVolumeSourceApplyConfiguration) *PersistentVolumeSpecApplyConfiguration { + b.RBD = value + return b +} + +// WithISCSI sets the ISCSI field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ISCSI field is set to the value of the last call. +func (b *PersistentVolumeSpecApplyConfiguration) WithISCSI(value *ISCSIPersistentVolumeSourceApplyConfiguration) *PersistentVolumeSpecApplyConfiguration { + b.ISCSI = value + return b +} + +// WithCinder sets the Cinder field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Cinder field is set to the value of the last call. +func (b *PersistentVolumeSpecApplyConfiguration) WithCinder(value *CinderPersistentVolumeSourceApplyConfiguration) *PersistentVolumeSpecApplyConfiguration { + b.Cinder = value + return b +} + +// WithCephFS sets the CephFS field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CephFS field is set to the value of the last call. +func (b *PersistentVolumeSpecApplyConfiguration) WithCephFS(value *CephFSPersistentVolumeSourceApplyConfiguration) *PersistentVolumeSpecApplyConfiguration { + b.CephFS = value + return b +} + +// WithFC sets the FC field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FC field is set to the value of the last call. +func (b *PersistentVolumeSpecApplyConfiguration) WithFC(value *FCVolumeSourceApplyConfiguration) *PersistentVolumeSpecApplyConfiguration { + b.FC = value + return b +} + +// WithFlocker sets the Flocker field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Flocker field is set to the value of the last call. +func (b *PersistentVolumeSpecApplyConfiguration) WithFlocker(value *FlockerVolumeSourceApplyConfiguration) *PersistentVolumeSpecApplyConfiguration { + b.Flocker = value + return b +} + +// WithFlexVolume sets the FlexVolume field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FlexVolume field is set to the value of the last call. +func (b *PersistentVolumeSpecApplyConfiguration) WithFlexVolume(value *FlexPersistentVolumeSourceApplyConfiguration) *PersistentVolumeSpecApplyConfiguration { + b.FlexVolume = value + return b +} + +// WithAzureFile sets the AzureFile field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AzureFile field is set to the value of the last call. +func (b *PersistentVolumeSpecApplyConfiguration) WithAzureFile(value *AzureFilePersistentVolumeSourceApplyConfiguration) *PersistentVolumeSpecApplyConfiguration { + b.AzureFile = value + return b +} + +// WithVsphereVolume sets the VsphereVolume field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the VsphereVolume field is set to the value of the last call. +func (b *PersistentVolumeSpecApplyConfiguration) WithVsphereVolume(value *VsphereVirtualDiskVolumeSourceApplyConfiguration) *PersistentVolumeSpecApplyConfiguration { + b.VsphereVolume = value + return b +} + +// WithQuobyte sets the Quobyte field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Quobyte field is set to the value of the last call. +func (b *PersistentVolumeSpecApplyConfiguration) WithQuobyte(value *QuobyteVolumeSourceApplyConfiguration) *PersistentVolumeSpecApplyConfiguration { + b.Quobyte = value + return b +} + +// WithAzureDisk sets the AzureDisk field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AzureDisk field is set to the value of the last call. +func (b *PersistentVolumeSpecApplyConfiguration) WithAzureDisk(value *AzureDiskVolumeSourceApplyConfiguration) *PersistentVolumeSpecApplyConfiguration { + b.AzureDisk = value + return b +} + +// WithPhotonPersistentDisk sets the PhotonPersistentDisk field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PhotonPersistentDisk field is set to the value of the last call. +func (b *PersistentVolumeSpecApplyConfiguration) WithPhotonPersistentDisk(value *PhotonPersistentDiskVolumeSourceApplyConfiguration) *PersistentVolumeSpecApplyConfiguration { + b.PhotonPersistentDisk = value + return b +} + +// WithPortworxVolume sets the PortworxVolume field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PortworxVolume field is set to the value of the last call. +func (b *PersistentVolumeSpecApplyConfiguration) WithPortworxVolume(value *PortworxVolumeSourceApplyConfiguration) *PersistentVolumeSpecApplyConfiguration { + b.PortworxVolume = value + return b +} + +// WithScaleIO sets the ScaleIO field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ScaleIO field is set to the value of the last call. +func (b *PersistentVolumeSpecApplyConfiguration) WithScaleIO(value *ScaleIOPersistentVolumeSourceApplyConfiguration) *PersistentVolumeSpecApplyConfiguration { + b.ScaleIO = value + return b +} + +// WithLocal sets the Local field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Local field is set to the value of the last call. +func (b *PersistentVolumeSpecApplyConfiguration) WithLocal(value *LocalVolumeSourceApplyConfiguration) *PersistentVolumeSpecApplyConfiguration { + b.Local = value + return b +} + +// WithStorageOS sets the StorageOS field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the StorageOS field is set to the value of the last call. +func (b *PersistentVolumeSpecApplyConfiguration) WithStorageOS(value *StorageOSPersistentVolumeSourceApplyConfiguration) *PersistentVolumeSpecApplyConfiguration { + b.StorageOS = value + return b +} + +// WithCSI sets the CSI field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CSI field is set to the value of the last call. +func (b *PersistentVolumeSpecApplyConfiguration) WithCSI(value *CSIPersistentVolumeSourceApplyConfiguration) *PersistentVolumeSpecApplyConfiguration { + b.CSI = value + return b +} + +// WithAccessModes adds the given value to the AccessModes field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the AccessModes field. +func (b *PersistentVolumeSpecApplyConfiguration) WithAccessModes(values ...v1.PersistentVolumeAccessMode) *PersistentVolumeSpecApplyConfiguration { + for i := range values { + b.AccessModes = append(b.AccessModes, values[i]) + } + return b +} + +// WithClaimRef sets the ClaimRef field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClaimRef field is set to the value of the last call. +func (b *PersistentVolumeSpecApplyConfiguration) WithClaimRef(value *ObjectReferenceApplyConfiguration) *PersistentVolumeSpecApplyConfiguration { + b.ClaimRef = value + return b +} + +// WithPersistentVolumeReclaimPolicy sets the PersistentVolumeReclaimPolicy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PersistentVolumeReclaimPolicy field is set to the value of the last call. +func (b *PersistentVolumeSpecApplyConfiguration) WithPersistentVolumeReclaimPolicy(value v1.PersistentVolumeReclaimPolicy) *PersistentVolumeSpecApplyConfiguration { + b.PersistentVolumeReclaimPolicy = &value + return b +} + +// WithStorageClassName sets the StorageClassName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the StorageClassName field is set to the value of the last call. +func (b *PersistentVolumeSpecApplyConfiguration) WithStorageClassName(value string) *PersistentVolumeSpecApplyConfiguration { + b.StorageClassName = &value + return b +} + +// WithMountOptions adds the given value to the MountOptions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the MountOptions field. +func (b *PersistentVolumeSpecApplyConfiguration) WithMountOptions(values ...string) *PersistentVolumeSpecApplyConfiguration { + for i := range values { + b.MountOptions = append(b.MountOptions, values[i]) + } + return b +} + +// WithVolumeMode sets the VolumeMode field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the VolumeMode field is set to the value of the last call. +func (b *PersistentVolumeSpecApplyConfiguration) WithVolumeMode(value v1.PersistentVolumeMode) *PersistentVolumeSpecApplyConfiguration { + b.VolumeMode = &value + return b +} + +// WithNodeAffinity sets the NodeAffinity field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NodeAffinity field is set to the value of the last call. +func (b *PersistentVolumeSpecApplyConfiguration) WithNodeAffinity(value *VolumeNodeAffinityApplyConfiguration) *PersistentVolumeSpecApplyConfiguration { + b.NodeAffinity = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumestatus.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumestatus.go new file mode 100644 index 000000000000..f7048dec4eb3 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumestatus.go @@ -0,0 +1,61 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/core/v1" +) + +// PersistentVolumeStatusApplyConfiguration represents an declarative configuration of the PersistentVolumeStatus type for use +// with apply. +type PersistentVolumeStatusApplyConfiguration struct { + Phase *v1.PersistentVolumePhase `json:"phase,omitempty"` + Message *string `json:"message,omitempty"` + Reason *string `json:"reason,omitempty"` +} + +// PersistentVolumeStatusApplyConfiguration constructs an declarative configuration of the PersistentVolumeStatus type for use with +// apply. +func PersistentVolumeStatus() *PersistentVolumeStatusApplyConfiguration { + return &PersistentVolumeStatusApplyConfiguration{} +} + +// WithPhase sets the Phase field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Phase field is set to the value of the last call. +func (b *PersistentVolumeStatusApplyConfiguration) WithPhase(value v1.PersistentVolumePhase) *PersistentVolumeStatusApplyConfiguration { + b.Phase = &value + return b +} + +// WithMessage sets the Message field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Message field is set to the value of the last call. +func (b *PersistentVolumeStatusApplyConfiguration) WithMessage(value string) *PersistentVolumeStatusApplyConfiguration { + b.Message = &value + return b +} + +// WithReason sets the Reason field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Reason field is set to the value of the last call. +func (b *PersistentVolumeStatusApplyConfiguration) WithReason(value string) *PersistentVolumeStatusApplyConfiguration { + b.Reason = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/photonpersistentdiskvolumesource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/photonpersistentdiskvolumesource.go new file mode 100644 index 000000000000..43587d6768d7 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/photonpersistentdiskvolumesource.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// PhotonPersistentDiskVolumeSourceApplyConfiguration represents an declarative configuration of the PhotonPersistentDiskVolumeSource type for use +// with apply. +type PhotonPersistentDiskVolumeSourceApplyConfiguration struct { + PdID *string `json:"pdID,omitempty"` + FSType *string `json:"fsType,omitempty"` +} + +// PhotonPersistentDiskVolumeSourceApplyConfiguration constructs an declarative configuration of the PhotonPersistentDiskVolumeSource type for use with +// apply. +func PhotonPersistentDiskVolumeSource() *PhotonPersistentDiskVolumeSourceApplyConfiguration { + return &PhotonPersistentDiskVolumeSourceApplyConfiguration{} +} + +// WithPdID sets the PdID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PdID field is set to the value of the last call. +func (b *PhotonPersistentDiskVolumeSourceApplyConfiguration) WithPdID(value string) *PhotonPersistentDiskVolumeSourceApplyConfiguration { + b.PdID = &value + return b +} + +// WithFSType sets the FSType field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FSType field is set to the value of the last call. +func (b *PhotonPersistentDiskVolumeSourceApplyConfiguration) WithFSType(value string) *PhotonPersistentDiskVolumeSourceApplyConfiguration { + b.FSType = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/pod.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/pod.go new file mode 100644 index 000000000000..4783713929a5 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/pod.go @@ -0,0 +1,265 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + apicorev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// PodApplyConfiguration represents an declarative configuration of the Pod type for use +// with apply. +type PodApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *PodSpecApplyConfiguration `json:"spec,omitempty"` + Status *PodStatusApplyConfiguration `json:"status,omitempty"` +} + +// Pod constructs an declarative configuration of the Pod type for use with +// apply. +func Pod(name, namespace string) *PodApplyConfiguration { + b := &PodApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("Pod") + b.WithAPIVersion("v1") + return b +} + +// ExtractPod extracts the applied configuration owned by fieldManager from +// pod. If no managedFields are found in pod for fieldManager, a +// PodApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// pod must be a unmodified Pod API object that was retrieved from the Kubernetes API. +// ExtractPod provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractPod(pod *apicorev1.Pod, fieldManager string) (*PodApplyConfiguration, error) { + b := &PodApplyConfiguration{} + err := managedfields.ExtractInto(pod, internal.Parser().Type("io.k8s.api.core.v1.Pod"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(pod.Name) + b.WithNamespace(pod.Namespace) + + b.WithKind("Pod") + b.WithAPIVersion("v1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *PodApplyConfiguration) WithKind(value string) *PodApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *PodApplyConfiguration) WithAPIVersion(value string) *PodApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *PodApplyConfiguration) WithName(value string) *PodApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *PodApplyConfiguration) WithGenerateName(value string) *PodApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *PodApplyConfiguration) WithNamespace(value string) *PodApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *PodApplyConfiguration) WithSelfLink(value string) *PodApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *PodApplyConfiguration) WithUID(value types.UID) *PodApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *PodApplyConfiguration) WithResourceVersion(value string) *PodApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *PodApplyConfiguration) WithGeneration(value int64) *PodApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *PodApplyConfiguration) WithCreationTimestamp(value metav1.Time) *PodApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *PodApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *PodApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *PodApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *PodApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *PodApplyConfiguration) WithLabels(entries map[string]string) *PodApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *PodApplyConfiguration) WithAnnotations(entries map[string]string) *PodApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *PodApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *PodApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *PodApplyConfiguration) WithFinalizers(values ...string) *PodApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *PodApplyConfiguration) WithClusterName(value string) *PodApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *PodApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *PodApplyConfiguration) WithSpec(value *PodSpecApplyConfiguration) *PodApplyConfiguration { + b.Spec = value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *PodApplyConfiguration) WithStatus(value *PodStatusApplyConfiguration) *PodApplyConfiguration { + b.Status = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/podaffinity.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/podaffinity.go new file mode 100644 index 000000000000..7049c62121eb --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/podaffinity.go @@ -0,0 +1,58 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// PodAffinityApplyConfiguration represents an declarative configuration of the PodAffinity type for use +// with apply. +type PodAffinityApplyConfiguration struct { + RequiredDuringSchedulingIgnoredDuringExecution []PodAffinityTermApplyConfiguration `json:"requiredDuringSchedulingIgnoredDuringExecution,omitempty"` + PreferredDuringSchedulingIgnoredDuringExecution []WeightedPodAffinityTermApplyConfiguration `json:"preferredDuringSchedulingIgnoredDuringExecution,omitempty"` +} + +// PodAffinityApplyConfiguration constructs an declarative configuration of the PodAffinity type for use with +// apply. +func PodAffinity() *PodAffinityApplyConfiguration { + return &PodAffinityApplyConfiguration{} +} + +// WithRequiredDuringSchedulingIgnoredDuringExecution adds the given value to the RequiredDuringSchedulingIgnoredDuringExecution field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the RequiredDuringSchedulingIgnoredDuringExecution field. +func (b *PodAffinityApplyConfiguration) WithRequiredDuringSchedulingIgnoredDuringExecution(values ...*PodAffinityTermApplyConfiguration) *PodAffinityApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithRequiredDuringSchedulingIgnoredDuringExecution") + } + b.RequiredDuringSchedulingIgnoredDuringExecution = append(b.RequiredDuringSchedulingIgnoredDuringExecution, *values[i]) + } + return b +} + +// WithPreferredDuringSchedulingIgnoredDuringExecution adds the given value to the PreferredDuringSchedulingIgnoredDuringExecution field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the PreferredDuringSchedulingIgnoredDuringExecution field. +func (b *PodAffinityApplyConfiguration) WithPreferredDuringSchedulingIgnoredDuringExecution(values ...*WeightedPodAffinityTermApplyConfiguration) *PodAffinityApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithPreferredDuringSchedulingIgnoredDuringExecution") + } + b.PreferredDuringSchedulingIgnoredDuringExecution = append(b.PreferredDuringSchedulingIgnoredDuringExecution, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/podaffinityterm.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/podaffinityterm.go new file mode 100644 index 000000000000..7d2492203eed --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/podaffinityterm.go @@ -0,0 +1,72 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// PodAffinityTermApplyConfiguration represents an declarative configuration of the PodAffinityTerm type for use +// with apply. +type PodAffinityTermApplyConfiguration struct { + LabelSelector *v1.LabelSelectorApplyConfiguration `json:"labelSelector,omitempty"` + Namespaces []string `json:"namespaces,omitempty"` + TopologyKey *string `json:"topologyKey,omitempty"` + NamespaceSelector *v1.LabelSelectorApplyConfiguration `json:"namespaceSelector,omitempty"` +} + +// PodAffinityTermApplyConfiguration constructs an declarative configuration of the PodAffinityTerm type for use with +// apply. +func PodAffinityTerm() *PodAffinityTermApplyConfiguration { + return &PodAffinityTermApplyConfiguration{} +} + +// WithLabelSelector sets the LabelSelector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LabelSelector field is set to the value of the last call. +func (b *PodAffinityTermApplyConfiguration) WithLabelSelector(value *v1.LabelSelectorApplyConfiguration) *PodAffinityTermApplyConfiguration { + b.LabelSelector = value + return b +} + +// WithNamespaces adds the given value to the Namespaces field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Namespaces field. +func (b *PodAffinityTermApplyConfiguration) WithNamespaces(values ...string) *PodAffinityTermApplyConfiguration { + for i := range values { + b.Namespaces = append(b.Namespaces, values[i]) + } + return b +} + +// WithTopologyKey sets the TopologyKey field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the TopologyKey field is set to the value of the last call. +func (b *PodAffinityTermApplyConfiguration) WithTopologyKey(value string) *PodAffinityTermApplyConfiguration { + b.TopologyKey = &value + return b +} + +// WithNamespaceSelector sets the NamespaceSelector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NamespaceSelector field is set to the value of the last call. +func (b *PodAffinityTermApplyConfiguration) WithNamespaceSelector(value *v1.LabelSelectorApplyConfiguration) *PodAffinityTermApplyConfiguration { + b.NamespaceSelector = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/podantiaffinity.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/podantiaffinity.go new file mode 100644 index 000000000000..42681c54c4a0 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/podantiaffinity.go @@ -0,0 +1,58 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// PodAntiAffinityApplyConfiguration represents an declarative configuration of the PodAntiAffinity type for use +// with apply. +type PodAntiAffinityApplyConfiguration struct { + RequiredDuringSchedulingIgnoredDuringExecution []PodAffinityTermApplyConfiguration `json:"requiredDuringSchedulingIgnoredDuringExecution,omitempty"` + PreferredDuringSchedulingIgnoredDuringExecution []WeightedPodAffinityTermApplyConfiguration `json:"preferredDuringSchedulingIgnoredDuringExecution,omitempty"` +} + +// PodAntiAffinityApplyConfiguration constructs an declarative configuration of the PodAntiAffinity type for use with +// apply. +func PodAntiAffinity() *PodAntiAffinityApplyConfiguration { + return &PodAntiAffinityApplyConfiguration{} +} + +// WithRequiredDuringSchedulingIgnoredDuringExecution adds the given value to the RequiredDuringSchedulingIgnoredDuringExecution field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the RequiredDuringSchedulingIgnoredDuringExecution field. +func (b *PodAntiAffinityApplyConfiguration) WithRequiredDuringSchedulingIgnoredDuringExecution(values ...*PodAffinityTermApplyConfiguration) *PodAntiAffinityApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithRequiredDuringSchedulingIgnoredDuringExecution") + } + b.RequiredDuringSchedulingIgnoredDuringExecution = append(b.RequiredDuringSchedulingIgnoredDuringExecution, *values[i]) + } + return b +} + +// WithPreferredDuringSchedulingIgnoredDuringExecution adds the given value to the PreferredDuringSchedulingIgnoredDuringExecution field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the PreferredDuringSchedulingIgnoredDuringExecution field. +func (b *PodAntiAffinityApplyConfiguration) WithPreferredDuringSchedulingIgnoredDuringExecution(values ...*WeightedPodAffinityTermApplyConfiguration) *PodAntiAffinityApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithPreferredDuringSchedulingIgnoredDuringExecution") + } + b.PreferredDuringSchedulingIgnoredDuringExecution = append(b.PreferredDuringSchedulingIgnoredDuringExecution, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/podcondition.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/podcondition.go new file mode 100644 index 000000000000..610209f3c48d --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/podcondition.go @@ -0,0 +1,89 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// PodConditionApplyConfiguration represents an declarative configuration of the PodCondition type for use +// with apply. +type PodConditionApplyConfiguration struct { + Type *v1.PodConditionType `json:"type,omitempty"` + Status *v1.ConditionStatus `json:"status,omitempty"` + LastProbeTime *metav1.Time `json:"lastProbeTime,omitempty"` + LastTransitionTime *metav1.Time `json:"lastTransitionTime,omitempty"` + Reason *string `json:"reason,omitempty"` + Message *string `json:"message,omitempty"` +} + +// PodConditionApplyConfiguration constructs an declarative configuration of the PodCondition type for use with +// apply. +func PodCondition() *PodConditionApplyConfiguration { + return &PodConditionApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *PodConditionApplyConfiguration) WithType(value v1.PodConditionType) *PodConditionApplyConfiguration { + b.Type = &value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *PodConditionApplyConfiguration) WithStatus(value v1.ConditionStatus) *PodConditionApplyConfiguration { + b.Status = &value + return b +} + +// WithLastProbeTime sets the LastProbeTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastProbeTime field is set to the value of the last call. +func (b *PodConditionApplyConfiguration) WithLastProbeTime(value metav1.Time) *PodConditionApplyConfiguration { + b.LastProbeTime = &value + return b +} + +// WithLastTransitionTime sets the LastTransitionTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastTransitionTime field is set to the value of the last call. +func (b *PodConditionApplyConfiguration) WithLastTransitionTime(value metav1.Time) *PodConditionApplyConfiguration { + b.LastTransitionTime = &value + return b +} + +// WithReason sets the Reason field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Reason field is set to the value of the last call. +func (b *PodConditionApplyConfiguration) WithReason(value string) *PodConditionApplyConfiguration { + b.Reason = &value + return b +} + +// WithMessage sets the Message field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Message field is set to the value of the last call. +func (b *PodConditionApplyConfiguration) WithMessage(value string) *PodConditionApplyConfiguration { + b.Message = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/poddnsconfig.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/poddnsconfig.go new file mode 100644 index 000000000000..0fe6a0834938 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/poddnsconfig.go @@ -0,0 +1,66 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// PodDNSConfigApplyConfiguration represents an declarative configuration of the PodDNSConfig type for use +// with apply. +type PodDNSConfigApplyConfiguration struct { + Nameservers []string `json:"nameservers,omitempty"` + Searches []string `json:"searches,omitempty"` + Options []PodDNSConfigOptionApplyConfiguration `json:"options,omitempty"` +} + +// PodDNSConfigApplyConfiguration constructs an declarative configuration of the PodDNSConfig type for use with +// apply. +func PodDNSConfig() *PodDNSConfigApplyConfiguration { + return &PodDNSConfigApplyConfiguration{} +} + +// WithNameservers adds the given value to the Nameservers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Nameservers field. +func (b *PodDNSConfigApplyConfiguration) WithNameservers(values ...string) *PodDNSConfigApplyConfiguration { + for i := range values { + b.Nameservers = append(b.Nameservers, values[i]) + } + return b +} + +// WithSearches adds the given value to the Searches field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Searches field. +func (b *PodDNSConfigApplyConfiguration) WithSearches(values ...string) *PodDNSConfigApplyConfiguration { + for i := range values { + b.Searches = append(b.Searches, values[i]) + } + return b +} + +// WithOptions adds the given value to the Options field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Options field. +func (b *PodDNSConfigApplyConfiguration) WithOptions(values ...*PodDNSConfigOptionApplyConfiguration) *PodDNSConfigApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOptions") + } + b.Options = append(b.Options, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/poddnsconfigoption.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/poddnsconfigoption.go new file mode 100644 index 000000000000..327bf803b3a3 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/poddnsconfigoption.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// PodDNSConfigOptionApplyConfiguration represents an declarative configuration of the PodDNSConfigOption type for use +// with apply. +type PodDNSConfigOptionApplyConfiguration struct { + Name *string `json:"name,omitempty"` + Value *string `json:"value,omitempty"` +} + +// PodDNSConfigOptionApplyConfiguration constructs an declarative configuration of the PodDNSConfigOption type for use with +// apply. +func PodDNSConfigOption() *PodDNSConfigOptionApplyConfiguration { + return &PodDNSConfigOptionApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *PodDNSConfigOptionApplyConfiguration) WithName(value string) *PodDNSConfigOptionApplyConfiguration { + b.Name = &value + return b +} + +// WithValue sets the Value field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Value field is set to the value of the last call. +func (b *PodDNSConfigOptionApplyConfiguration) WithValue(value string) *PodDNSConfigOptionApplyConfiguration { + b.Value = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/podip.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/podip.go new file mode 100644 index 000000000000..3c6e6b87ac26 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/podip.go @@ -0,0 +1,39 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// PodIPApplyConfiguration represents an declarative configuration of the PodIP type for use +// with apply. +type PodIPApplyConfiguration struct { + IP *string `json:"ip,omitempty"` +} + +// PodIPApplyConfiguration constructs an declarative configuration of the PodIP type for use with +// apply. +func PodIP() *PodIPApplyConfiguration { + return &PodIPApplyConfiguration{} +} + +// WithIP sets the IP field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the IP field is set to the value of the last call. +func (b *PodIPApplyConfiguration) WithIP(value string) *PodIPApplyConfiguration { + b.IP = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/podreadinessgate.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/podreadinessgate.go new file mode 100644 index 000000000000..9d3ad458ac0a --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/podreadinessgate.go @@ -0,0 +1,43 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/core/v1" +) + +// PodReadinessGateApplyConfiguration represents an declarative configuration of the PodReadinessGate type for use +// with apply. +type PodReadinessGateApplyConfiguration struct { + ConditionType *v1.PodConditionType `json:"conditionType,omitempty"` +} + +// PodReadinessGateApplyConfiguration constructs an declarative configuration of the PodReadinessGate type for use with +// apply. +func PodReadinessGate() *PodReadinessGateApplyConfiguration { + return &PodReadinessGateApplyConfiguration{} +} + +// WithConditionType sets the ConditionType field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ConditionType field is set to the value of the last call. +func (b *PodReadinessGateApplyConfiguration) WithConditionType(value v1.PodConditionType) *PodReadinessGateApplyConfiguration { + b.ConditionType = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/podsecuritycontext.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/podsecuritycontext.go new file mode 100644 index 000000000000..6db09aa32f16 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/podsecuritycontext.go @@ -0,0 +1,131 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + corev1 "k8s.io/api/core/v1" +) + +// PodSecurityContextApplyConfiguration represents an declarative configuration of the PodSecurityContext type for use +// with apply. +type PodSecurityContextApplyConfiguration struct { + SELinuxOptions *SELinuxOptionsApplyConfiguration `json:"seLinuxOptions,omitempty"` + WindowsOptions *WindowsSecurityContextOptionsApplyConfiguration `json:"windowsOptions,omitempty"` + RunAsUser *int64 `json:"runAsUser,omitempty"` + RunAsGroup *int64 `json:"runAsGroup,omitempty"` + RunAsNonRoot *bool `json:"runAsNonRoot,omitempty"` + SupplementalGroups []int64 `json:"supplementalGroups,omitempty"` + FSGroup *int64 `json:"fsGroup,omitempty"` + Sysctls []SysctlApplyConfiguration `json:"sysctls,omitempty"` + FSGroupChangePolicy *corev1.PodFSGroupChangePolicy `json:"fsGroupChangePolicy,omitempty"` + SeccompProfile *SeccompProfileApplyConfiguration `json:"seccompProfile,omitempty"` +} + +// PodSecurityContextApplyConfiguration constructs an declarative configuration of the PodSecurityContext type for use with +// apply. +func PodSecurityContext() *PodSecurityContextApplyConfiguration { + return &PodSecurityContextApplyConfiguration{} +} + +// WithSELinuxOptions sets the SELinuxOptions field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SELinuxOptions field is set to the value of the last call. +func (b *PodSecurityContextApplyConfiguration) WithSELinuxOptions(value *SELinuxOptionsApplyConfiguration) *PodSecurityContextApplyConfiguration { + b.SELinuxOptions = value + return b +} + +// WithWindowsOptions sets the WindowsOptions field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the WindowsOptions field is set to the value of the last call. +func (b *PodSecurityContextApplyConfiguration) WithWindowsOptions(value *WindowsSecurityContextOptionsApplyConfiguration) *PodSecurityContextApplyConfiguration { + b.WindowsOptions = value + return b +} + +// WithRunAsUser sets the RunAsUser field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RunAsUser field is set to the value of the last call. +func (b *PodSecurityContextApplyConfiguration) WithRunAsUser(value int64) *PodSecurityContextApplyConfiguration { + b.RunAsUser = &value + return b +} + +// WithRunAsGroup sets the RunAsGroup field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RunAsGroup field is set to the value of the last call. +func (b *PodSecurityContextApplyConfiguration) WithRunAsGroup(value int64) *PodSecurityContextApplyConfiguration { + b.RunAsGroup = &value + return b +} + +// WithRunAsNonRoot sets the RunAsNonRoot field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RunAsNonRoot field is set to the value of the last call. +func (b *PodSecurityContextApplyConfiguration) WithRunAsNonRoot(value bool) *PodSecurityContextApplyConfiguration { + b.RunAsNonRoot = &value + return b +} + +// WithSupplementalGroups adds the given value to the SupplementalGroups field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the SupplementalGroups field. +func (b *PodSecurityContextApplyConfiguration) WithSupplementalGroups(values ...int64) *PodSecurityContextApplyConfiguration { + for i := range values { + b.SupplementalGroups = append(b.SupplementalGroups, values[i]) + } + return b +} + +// WithFSGroup sets the FSGroup field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FSGroup field is set to the value of the last call. +func (b *PodSecurityContextApplyConfiguration) WithFSGroup(value int64) *PodSecurityContextApplyConfiguration { + b.FSGroup = &value + return b +} + +// WithSysctls adds the given value to the Sysctls field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Sysctls field. +func (b *PodSecurityContextApplyConfiguration) WithSysctls(values ...*SysctlApplyConfiguration) *PodSecurityContextApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithSysctls") + } + b.Sysctls = append(b.Sysctls, *values[i]) + } + return b +} + +// WithFSGroupChangePolicy sets the FSGroupChangePolicy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FSGroupChangePolicy field is set to the value of the last call. +func (b *PodSecurityContextApplyConfiguration) WithFSGroupChangePolicy(value corev1.PodFSGroupChangePolicy) *PodSecurityContextApplyConfiguration { + b.FSGroupChangePolicy = &value + return b +} + +// WithSeccompProfile sets the SeccompProfile field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SeccompProfile field is set to the value of the last call. +func (b *PodSecurityContextApplyConfiguration) WithSeccompProfile(value *SeccompProfileApplyConfiguration) *PodSecurityContextApplyConfiguration { + b.SeccompProfile = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/podspec.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/podspec.go new file mode 100644 index 000000000000..d1c9ea9cb622 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/podspec.go @@ -0,0 +1,400 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + corev1 "k8s.io/api/core/v1" +) + +// PodSpecApplyConfiguration represents an declarative configuration of the PodSpec type for use +// with apply. +type PodSpecApplyConfiguration struct { + Volumes []VolumeApplyConfiguration `json:"volumes,omitempty"` + InitContainers []ContainerApplyConfiguration `json:"initContainers,omitempty"` + Containers []ContainerApplyConfiguration `json:"containers,omitempty"` + EphemeralContainers []EphemeralContainerApplyConfiguration `json:"ephemeralContainers,omitempty"` + RestartPolicy *corev1.RestartPolicy `json:"restartPolicy,omitempty"` + TerminationGracePeriodSeconds *int64 `json:"terminationGracePeriodSeconds,omitempty"` + ActiveDeadlineSeconds *int64 `json:"activeDeadlineSeconds,omitempty"` + DNSPolicy *corev1.DNSPolicy `json:"dnsPolicy,omitempty"` + NodeSelector map[string]string `json:"nodeSelector,omitempty"` + ServiceAccountName *string `json:"serviceAccountName,omitempty"` + DeprecatedServiceAccount *string `json:"serviceAccount,omitempty"` + AutomountServiceAccountToken *bool `json:"automountServiceAccountToken,omitempty"` + NodeName *string `json:"nodeName,omitempty"` + HostNetwork *bool `json:"hostNetwork,omitempty"` + HostPID *bool `json:"hostPID,omitempty"` + HostIPC *bool `json:"hostIPC,omitempty"` + ShareProcessNamespace *bool `json:"shareProcessNamespace,omitempty"` + SecurityContext *PodSecurityContextApplyConfiguration `json:"securityContext,omitempty"` + ImagePullSecrets []LocalObjectReferenceApplyConfiguration `json:"imagePullSecrets,omitempty"` + Hostname *string `json:"hostname,omitempty"` + Subdomain *string `json:"subdomain,omitempty"` + Affinity *AffinityApplyConfiguration `json:"affinity,omitempty"` + SchedulerName *string `json:"schedulerName,omitempty"` + Tolerations []TolerationApplyConfiguration `json:"tolerations,omitempty"` + HostAliases []HostAliasApplyConfiguration `json:"hostAliases,omitempty"` + PriorityClassName *string `json:"priorityClassName,omitempty"` + Priority *int32 `json:"priority,omitempty"` + DNSConfig *PodDNSConfigApplyConfiguration `json:"dnsConfig,omitempty"` + ReadinessGates []PodReadinessGateApplyConfiguration `json:"readinessGates,omitempty"` + RuntimeClassName *string `json:"runtimeClassName,omitempty"` + EnableServiceLinks *bool `json:"enableServiceLinks,omitempty"` + PreemptionPolicy *corev1.PreemptionPolicy `json:"preemptionPolicy,omitempty"` + Overhead *corev1.ResourceList `json:"overhead,omitempty"` + TopologySpreadConstraints []TopologySpreadConstraintApplyConfiguration `json:"topologySpreadConstraints,omitempty"` + SetHostnameAsFQDN *bool `json:"setHostnameAsFQDN,omitempty"` +} + +// PodSpecApplyConfiguration constructs an declarative configuration of the PodSpec type for use with +// apply. +func PodSpec() *PodSpecApplyConfiguration { + return &PodSpecApplyConfiguration{} +} + +// WithVolumes adds the given value to the Volumes field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Volumes field. +func (b *PodSpecApplyConfiguration) WithVolumes(values ...*VolumeApplyConfiguration) *PodSpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithVolumes") + } + b.Volumes = append(b.Volumes, *values[i]) + } + return b +} + +// WithInitContainers adds the given value to the InitContainers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the InitContainers field. +func (b *PodSpecApplyConfiguration) WithInitContainers(values ...*ContainerApplyConfiguration) *PodSpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithInitContainers") + } + b.InitContainers = append(b.InitContainers, *values[i]) + } + return b +} + +// WithContainers adds the given value to the Containers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Containers field. +func (b *PodSpecApplyConfiguration) WithContainers(values ...*ContainerApplyConfiguration) *PodSpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithContainers") + } + b.Containers = append(b.Containers, *values[i]) + } + return b +} + +// WithEphemeralContainers adds the given value to the EphemeralContainers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the EphemeralContainers field. +func (b *PodSpecApplyConfiguration) WithEphemeralContainers(values ...*EphemeralContainerApplyConfiguration) *PodSpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithEphemeralContainers") + } + b.EphemeralContainers = append(b.EphemeralContainers, *values[i]) + } + return b +} + +// WithRestartPolicy sets the RestartPolicy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RestartPolicy field is set to the value of the last call. +func (b *PodSpecApplyConfiguration) WithRestartPolicy(value corev1.RestartPolicy) *PodSpecApplyConfiguration { + b.RestartPolicy = &value + return b +} + +// WithTerminationGracePeriodSeconds sets the TerminationGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the TerminationGracePeriodSeconds field is set to the value of the last call. +func (b *PodSpecApplyConfiguration) WithTerminationGracePeriodSeconds(value int64) *PodSpecApplyConfiguration { + b.TerminationGracePeriodSeconds = &value + return b +} + +// WithActiveDeadlineSeconds sets the ActiveDeadlineSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ActiveDeadlineSeconds field is set to the value of the last call. +func (b *PodSpecApplyConfiguration) WithActiveDeadlineSeconds(value int64) *PodSpecApplyConfiguration { + b.ActiveDeadlineSeconds = &value + return b +} + +// WithDNSPolicy sets the DNSPolicy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DNSPolicy field is set to the value of the last call. +func (b *PodSpecApplyConfiguration) WithDNSPolicy(value corev1.DNSPolicy) *PodSpecApplyConfiguration { + b.DNSPolicy = &value + return b +} + +// WithNodeSelector puts the entries into the NodeSelector field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the NodeSelector field, +// overwriting an existing map entries in NodeSelector field with the same key. +func (b *PodSpecApplyConfiguration) WithNodeSelector(entries map[string]string) *PodSpecApplyConfiguration { + if b.NodeSelector == nil && len(entries) > 0 { + b.NodeSelector = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.NodeSelector[k] = v + } + return b +} + +// WithServiceAccountName sets the ServiceAccountName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ServiceAccountName field is set to the value of the last call. +func (b *PodSpecApplyConfiguration) WithServiceAccountName(value string) *PodSpecApplyConfiguration { + b.ServiceAccountName = &value + return b +} + +// WithDeprecatedServiceAccount sets the DeprecatedServiceAccount field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeprecatedServiceAccount field is set to the value of the last call. +func (b *PodSpecApplyConfiguration) WithDeprecatedServiceAccount(value string) *PodSpecApplyConfiguration { + b.DeprecatedServiceAccount = &value + return b +} + +// WithAutomountServiceAccountToken sets the AutomountServiceAccountToken field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AutomountServiceAccountToken field is set to the value of the last call. +func (b *PodSpecApplyConfiguration) WithAutomountServiceAccountToken(value bool) *PodSpecApplyConfiguration { + b.AutomountServiceAccountToken = &value + return b +} + +// WithNodeName sets the NodeName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NodeName field is set to the value of the last call. +func (b *PodSpecApplyConfiguration) WithNodeName(value string) *PodSpecApplyConfiguration { + b.NodeName = &value + return b +} + +// WithHostNetwork sets the HostNetwork field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the HostNetwork field is set to the value of the last call. +func (b *PodSpecApplyConfiguration) WithHostNetwork(value bool) *PodSpecApplyConfiguration { + b.HostNetwork = &value + return b +} + +// WithHostPID sets the HostPID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the HostPID field is set to the value of the last call. +func (b *PodSpecApplyConfiguration) WithHostPID(value bool) *PodSpecApplyConfiguration { + b.HostPID = &value + return b +} + +// WithHostIPC sets the HostIPC field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the HostIPC field is set to the value of the last call. +func (b *PodSpecApplyConfiguration) WithHostIPC(value bool) *PodSpecApplyConfiguration { + b.HostIPC = &value + return b +} + +// WithShareProcessNamespace sets the ShareProcessNamespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ShareProcessNamespace field is set to the value of the last call. +func (b *PodSpecApplyConfiguration) WithShareProcessNamespace(value bool) *PodSpecApplyConfiguration { + b.ShareProcessNamespace = &value + return b +} + +// WithSecurityContext sets the SecurityContext field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SecurityContext field is set to the value of the last call. +func (b *PodSpecApplyConfiguration) WithSecurityContext(value *PodSecurityContextApplyConfiguration) *PodSpecApplyConfiguration { + b.SecurityContext = value + return b +} + +// WithImagePullSecrets adds the given value to the ImagePullSecrets field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the ImagePullSecrets field. +func (b *PodSpecApplyConfiguration) WithImagePullSecrets(values ...*LocalObjectReferenceApplyConfiguration) *PodSpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithImagePullSecrets") + } + b.ImagePullSecrets = append(b.ImagePullSecrets, *values[i]) + } + return b +} + +// WithHostname sets the Hostname field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Hostname field is set to the value of the last call. +func (b *PodSpecApplyConfiguration) WithHostname(value string) *PodSpecApplyConfiguration { + b.Hostname = &value + return b +} + +// WithSubdomain sets the Subdomain field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Subdomain field is set to the value of the last call. +func (b *PodSpecApplyConfiguration) WithSubdomain(value string) *PodSpecApplyConfiguration { + b.Subdomain = &value + return b +} + +// WithAffinity sets the Affinity field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Affinity field is set to the value of the last call. +func (b *PodSpecApplyConfiguration) WithAffinity(value *AffinityApplyConfiguration) *PodSpecApplyConfiguration { + b.Affinity = value + return b +} + +// WithSchedulerName sets the SchedulerName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SchedulerName field is set to the value of the last call. +func (b *PodSpecApplyConfiguration) WithSchedulerName(value string) *PodSpecApplyConfiguration { + b.SchedulerName = &value + return b +} + +// WithTolerations adds the given value to the Tolerations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Tolerations field. +func (b *PodSpecApplyConfiguration) WithTolerations(values ...*TolerationApplyConfiguration) *PodSpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithTolerations") + } + b.Tolerations = append(b.Tolerations, *values[i]) + } + return b +} + +// WithHostAliases adds the given value to the HostAliases field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the HostAliases field. +func (b *PodSpecApplyConfiguration) WithHostAliases(values ...*HostAliasApplyConfiguration) *PodSpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithHostAliases") + } + b.HostAliases = append(b.HostAliases, *values[i]) + } + return b +} + +// WithPriorityClassName sets the PriorityClassName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PriorityClassName field is set to the value of the last call. +func (b *PodSpecApplyConfiguration) WithPriorityClassName(value string) *PodSpecApplyConfiguration { + b.PriorityClassName = &value + return b +} + +// WithPriority sets the Priority field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Priority field is set to the value of the last call. +func (b *PodSpecApplyConfiguration) WithPriority(value int32) *PodSpecApplyConfiguration { + b.Priority = &value + return b +} + +// WithDNSConfig sets the DNSConfig field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DNSConfig field is set to the value of the last call. +func (b *PodSpecApplyConfiguration) WithDNSConfig(value *PodDNSConfigApplyConfiguration) *PodSpecApplyConfiguration { + b.DNSConfig = value + return b +} + +// WithReadinessGates adds the given value to the ReadinessGates field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the ReadinessGates field. +func (b *PodSpecApplyConfiguration) WithReadinessGates(values ...*PodReadinessGateApplyConfiguration) *PodSpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithReadinessGates") + } + b.ReadinessGates = append(b.ReadinessGates, *values[i]) + } + return b +} + +// WithRuntimeClassName sets the RuntimeClassName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RuntimeClassName field is set to the value of the last call. +func (b *PodSpecApplyConfiguration) WithRuntimeClassName(value string) *PodSpecApplyConfiguration { + b.RuntimeClassName = &value + return b +} + +// WithEnableServiceLinks sets the EnableServiceLinks field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the EnableServiceLinks field is set to the value of the last call. +func (b *PodSpecApplyConfiguration) WithEnableServiceLinks(value bool) *PodSpecApplyConfiguration { + b.EnableServiceLinks = &value + return b +} + +// WithPreemptionPolicy sets the PreemptionPolicy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PreemptionPolicy field is set to the value of the last call. +func (b *PodSpecApplyConfiguration) WithPreemptionPolicy(value corev1.PreemptionPolicy) *PodSpecApplyConfiguration { + b.PreemptionPolicy = &value + return b +} + +// WithOverhead sets the Overhead field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Overhead field is set to the value of the last call. +func (b *PodSpecApplyConfiguration) WithOverhead(value corev1.ResourceList) *PodSpecApplyConfiguration { + b.Overhead = &value + return b +} + +// WithTopologySpreadConstraints adds the given value to the TopologySpreadConstraints field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the TopologySpreadConstraints field. +func (b *PodSpecApplyConfiguration) WithTopologySpreadConstraints(values ...*TopologySpreadConstraintApplyConfiguration) *PodSpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithTopologySpreadConstraints") + } + b.TopologySpreadConstraints = append(b.TopologySpreadConstraints, *values[i]) + } + return b +} + +// WithSetHostnameAsFQDN sets the SetHostnameAsFQDN field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SetHostnameAsFQDN field is set to the value of the last call. +func (b *PodSpecApplyConfiguration) WithSetHostnameAsFQDN(value bool) *PodSpecApplyConfiguration { + b.SetHostnameAsFQDN = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/podstatus.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/podstatus.go new file mode 100644 index 000000000000..7ee5b9955f66 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/podstatus.go @@ -0,0 +1,177 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// PodStatusApplyConfiguration represents an declarative configuration of the PodStatus type for use +// with apply. +type PodStatusApplyConfiguration struct { + Phase *v1.PodPhase `json:"phase,omitempty"` + Conditions []PodConditionApplyConfiguration `json:"conditions,omitempty"` + Message *string `json:"message,omitempty"` + Reason *string `json:"reason,omitempty"` + NominatedNodeName *string `json:"nominatedNodeName,omitempty"` + HostIP *string `json:"hostIP,omitempty"` + PodIP *string `json:"podIP,omitempty"` + PodIPs []PodIPApplyConfiguration `json:"podIPs,omitempty"` + StartTime *metav1.Time `json:"startTime,omitempty"` + InitContainerStatuses []ContainerStatusApplyConfiguration `json:"initContainerStatuses,omitempty"` + ContainerStatuses []ContainerStatusApplyConfiguration `json:"containerStatuses,omitempty"` + QOSClass *v1.PodQOSClass `json:"qosClass,omitempty"` + EphemeralContainerStatuses []ContainerStatusApplyConfiguration `json:"ephemeralContainerStatuses,omitempty"` +} + +// PodStatusApplyConfiguration constructs an declarative configuration of the PodStatus type for use with +// apply. +func PodStatus() *PodStatusApplyConfiguration { + return &PodStatusApplyConfiguration{} +} + +// WithPhase sets the Phase field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Phase field is set to the value of the last call. +func (b *PodStatusApplyConfiguration) WithPhase(value v1.PodPhase) *PodStatusApplyConfiguration { + b.Phase = &value + return b +} + +// WithConditions adds the given value to the Conditions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Conditions field. +func (b *PodStatusApplyConfiguration) WithConditions(values ...*PodConditionApplyConfiguration) *PodStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithConditions") + } + b.Conditions = append(b.Conditions, *values[i]) + } + return b +} + +// WithMessage sets the Message field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Message field is set to the value of the last call. +func (b *PodStatusApplyConfiguration) WithMessage(value string) *PodStatusApplyConfiguration { + b.Message = &value + return b +} + +// WithReason sets the Reason field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Reason field is set to the value of the last call. +func (b *PodStatusApplyConfiguration) WithReason(value string) *PodStatusApplyConfiguration { + b.Reason = &value + return b +} + +// WithNominatedNodeName sets the NominatedNodeName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NominatedNodeName field is set to the value of the last call. +func (b *PodStatusApplyConfiguration) WithNominatedNodeName(value string) *PodStatusApplyConfiguration { + b.NominatedNodeName = &value + return b +} + +// WithHostIP sets the HostIP field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the HostIP field is set to the value of the last call. +func (b *PodStatusApplyConfiguration) WithHostIP(value string) *PodStatusApplyConfiguration { + b.HostIP = &value + return b +} + +// WithPodIP sets the PodIP field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PodIP field is set to the value of the last call. +func (b *PodStatusApplyConfiguration) WithPodIP(value string) *PodStatusApplyConfiguration { + b.PodIP = &value + return b +} + +// WithPodIPs adds the given value to the PodIPs field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the PodIPs field. +func (b *PodStatusApplyConfiguration) WithPodIPs(values ...*PodIPApplyConfiguration) *PodStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithPodIPs") + } + b.PodIPs = append(b.PodIPs, *values[i]) + } + return b +} + +// WithStartTime sets the StartTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the StartTime field is set to the value of the last call. +func (b *PodStatusApplyConfiguration) WithStartTime(value metav1.Time) *PodStatusApplyConfiguration { + b.StartTime = &value + return b +} + +// WithInitContainerStatuses adds the given value to the InitContainerStatuses field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the InitContainerStatuses field. +func (b *PodStatusApplyConfiguration) WithInitContainerStatuses(values ...*ContainerStatusApplyConfiguration) *PodStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithInitContainerStatuses") + } + b.InitContainerStatuses = append(b.InitContainerStatuses, *values[i]) + } + return b +} + +// WithContainerStatuses adds the given value to the ContainerStatuses field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the ContainerStatuses field. +func (b *PodStatusApplyConfiguration) WithContainerStatuses(values ...*ContainerStatusApplyConfiguration) *PodStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithContainerStatuses") + } + b.ContainerStatuses = append(b.ContainerStatuses, *values[i]) + } + return b +} + +// WithQOSClass sets the QOSClass field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the QOSClass field is set to the value of the last call. +func (b *PodStatusApplyConfiguration) WithQOSClass(value v1.PodQOSClass) *PodStatusApplyConfiguration { + b.QOSClass = &value + return b +} + +// WithEphemeralContainerStatuses adds the given value to the EphemeralContainerStatuses field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the EphemeralContainerStatuses field. +func (b *PodStatusApplyConfiguration) WithEphemeralContainerStatuses(values ...*ContainerStatusApplyConfiguration) *PodStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithEphemeralContainerStatuses") + } + b.EphemeralContainerStatuses = append(b.EphemeralContainerStatuses, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/podtemplate.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/podtemplate.go new file mode 100644 index 000000000000..64263882a82c --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/podtemplate.go @@ -0,0 +1,256 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + apicorev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// PodTemplateApplyConfiguration represents an declarative configuration of the PodTemplate type for use +// with apply. +type PodTemplateApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Template *PodTemplateSpecApplyConfiguration `json:"template,omitempty"` +} + +// PodTemplate constructs an declarative configuration of the PodTemplate type for use with +// apply. +func PodTemplate(name, namespace string) *PodTemplateApplyConfiguration { + b := &PodTemplateApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("PodTemplate") + b.WithAPIVersion("v1") + return b +} + +// ExtractPodTemplate extracts the applied configuration owned by fieldManager from +// podTemplate. If no managedFields are found in podTemplate for fieldManager, a +// PodTemplateApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// podTemplate must be a unmodified PodTemplate API object that was retrieved from the Kubernetes API. +// ExtractPodTemplate provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractPodTemplate(podTemplate *apicorev1.PodTemplate, fieldManager string) (*PodTemplateApplyConfiguration, error) { + b := &PodTemplateApplyConfiguration{} + err := managedfields.ExtractInto(podTemplate, internal.Parser().Type("io.k8s.api.core.v1.PodTemplate"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(podTemplate.Name) + b.WithNamespace(podTemplate.Namespace) + + b.WithKind("PodTemplate") + b.WithAPIVersion("v1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *PodTemplateApplyConfiguration) WithKind(value string) *PodTemplateApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *PodTemplateApplyConfiguration) WithAPIVersion(value string) *PodTemplateApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *PodTemplateApplyConfiguration) WithName(value string) *PodTemplateApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *PodTemplateApplyConfiguration) WithGenerateName(value string) *PodTemplateApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *PodTemplateApplyConfiguration) WithNamespace(value string) *PodTemplateApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *PodTemplateApplyConfiguration) WithSelfLink(value string) *PodTemplateApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *PodTemplateApplyConfiguration) WithUID(value types.UID) *PodTemplateApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *PodTemplateApplyConfiguration) WithResourceVersion(value string) *PodTemplateApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *PodTemplateApplyConfiguration) WithGeneration(value int64) *PodTemplateApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *PodTemplateApplyConfiguration) WithCreationTimestamp(value metav1.Time) *PodTemplateApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *PodTemplateApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *PodTemplateApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *PodTemplateApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *PodTemplateApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *PodTemplateApplyConfiguration) WithLabels(entries map[string]string) *PodTemplateApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *PodTemplateApplyConfiguration) WithAnnotations(entries map[string]string) *PodTemplateApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *PodTemplateApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *PodTemplateApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *PodTemplateApplyConfiguration) WithFinalizers(values ...string) *PodTemplateApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *PodTemplateApplyConfiguration) WithClusterName(value string) *PodTemplateApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *PodTemplateApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithTemplate sets the Template field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Template field is set to the value of the last call. +func (b *PodTemplateApplyConfiguration) WithTemplate(value *PodTemplateSpecApplyConfiguration) *PodTemplateApplyConfiguration { + b.Template = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/podtemplatespec.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/podtemplatespec.go new file mode 100644 index 000000000000..ff06ea4b33a4 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/podtemplatespec.go @@ -0,0 +1,206 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// PodTemplateSpecApplyConfiguration represents an declarative configuration of the PodTemplateSpec type for use +// with apply. +type PodTemplateSpecApplyConfiguration struct { + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *PodSpecApplyConfiguration `json:"spec,omitempty"` +} + +// PodTemplateSpecApplyConfiguration constructs an declarative configuration of the PodTemplateSpec type for use with +// apply. +func PodTemplateSpec() *PodTemplateSpecApplyConfiguration { + return &PodTemplateSpecApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *PodTemplateSpecApplyConfiguration) WithName(value string) *PodTemplateSpecApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *PodTemplateSpecApplyConfiguration) WithGenerateName(value string) *PodTemplateSpecApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *PodTemplateSpecApplyConfiguration) WithNamespace(value string) *PodTemplateSpecApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *PodTemplateSpecApplyConfiguration) WithSelfLink(value string) *PodTemplateSpecApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *PodTemplateSpecApplyConfiguration) WithUID(value types.UID) *PodTemplateSpecApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *PodTemplateSpecApplyConfiguration) WithResourceVersion(value string) *PodTemplateSpecApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *PodTemplateSpecApplyConfiguration) WithGeneration(value int64) *PodTemplateSpecApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *PodTemplateSpecApplyConfiguration) WithCreationTimestamp(value metav1.Time) *PodTemplateSpecApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *PodTemplateSpecApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *PodTemplateSpecApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *PodTemplateSpecApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *PodTemplateSpecApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *PodTemplateSpecApplyConfiguration) WithLabels(entries map[string]string) *PodTemplateSpecApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *PodTemplateSpecApplyConfiguration) WithAnnotations(entries map[string]string) *PodTemplateSpecApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *PodTemplateSpecApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *PodTemplateSpecApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *PodTemplateSpecApplyConfiguration) WithFinalizers(values ...string) *PodTemplateSpecApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *PodTemplateSpecApplyConfiguration) WithClusterName(value string) *PodTemplateSpecApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *PodTemplateSpecApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *PodTemplateSpecApplyConfiguration) WithSpec(value *PodSpecApplyConfiguration) *PodTemplateSpecApplyConfiguration { + b.Spec = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/portstatus.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/portstatus.go new file mode 100644 index 000000000000..8c70c8f6cfeb --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/portstatus.go @@ -0,0 +1,61 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/core/v1" +) + +// PortStatusApplyConfiguration represents an declarative configuration of the PortStatus type for use +// with apply. +type PortStatusApplyConfiguration struct { + Port *int32 `json:"port,omitempty"` + Protocol *v1.Protocol `json:"protocol,omitempty"` + Error *string `json:"error,omitempty"` +} + +// PortStatusApplyConfiguration constructs an declarative configuration of the PortStatus type for use with +// apply. +func PortStatus() *PortStatusApplyConfiguration { + return &PortStatusApplyConfiguration{} +} + +// WithPort sets the Port field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Port field is set to the value of the last call. +func (b *PortStatusApplyConfiguration) WithPort(value int32) *PortStatusApplyConfiguration { + b.Port = &value + return b +} + +// WithProtocol sets the Protocol field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Protocol field is set to the value of the last call. +func (b *PortStatusApplyConfiguration) WithProtocol(value v1.Protocol) *PortStatusApplyConfiguration { + b.Protocol = &value + return b +} + +// WithError sets the Error field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Error field is set to the value of the last call. +func (b *PortStatusApplyConfiguration) WithError(value string) *PortStatusApplyConfiguration { + b.Error = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/portworxvolumesource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/portworxvolumesource.go new file mode 100644 index 000000000000..19cbb82edb84 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/portworxvolumesource.go @@ -0,0 +1,57 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// PortworxVolumeSourceApplyConfiguration represents an declarative configuration of the PortworxVolumeSource type for use +// with apply. +type PortworxVolumeSourceApplyConfiguration struct { + VolumeID *string `json:"volumeID,omitempty"` + FSType *string `json:"fsType,omitempty"` + ReadOnly *bool `json:"readOnly,omitempty"` +} + +// PortworxVolumeSourceApplyConfiguration constructs an declarative configuration of the PortworxVolumeSource type for use with +// apply. +func PortworxVolumeSource() *PortworxVolumeSourceApplyConfiguration { + return &PortworxVolumeSourceApplyConfiguration{} +} + +// WithVolumeID sets the VolumeID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the VolumeID field is set to the value of the last call. +func (b *PortworxVolumeSourceApplyConfiguration) WithVolumeID(value string) *PortworxVolumeSourceApplyConfiguration { + b.VolumeID = &value + return b +} + +// WithFSType sets the FSType field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FSType field is set to the value of the last call. +func (b *PortworxVolumeSourceApplyConfiguration) WithFSType(value string) *PortworxVolumeSourceApplyConfiguration { + b.FSType = &value + return b +} + +// WithReadOnly sets the ReadOnly field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadOnly field is set to the value of the last call. +func (b *PortworxVolumeSourceApplyConfiguration) WithReadOnly(value bool) *PortworxVolumeSourceApplyConfiguration { + b.ReadOnly = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/preferredschedulingterm.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/preferredschedulingterm.go new file mode 100644 index 000000000000..a373e4afe080 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/preferredschedulingterm.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// PreferredSchedulingTermApplyConfiguration represents an declarative configuration of the PreferredSchedulingTerm type for use +// with apply. +type PreferredSchedulingTermApplyConfiguration struct { + Weight *int32 `json:"weight,omitempty"` + Preference *NodeSelectorTermApplyConfiguration `json:"preference,omitempty"` +} + +// PreferredSchedulingTermApplyConfiguration constructs an declarative configuration of the PreferredSchedulingTerm type for use with +// apply. +func PreferredSchedulingTerm() *PreferredSchedulingTermApplyConfiguration { + return &PreferredSchedulingTermApplyConfiguration{} +} + +// WithWeight sets the Weight field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Weight field is set to the value of the last call. +func (b *PreferredSchedulingTermApplyConfiguration) WithWeight(value int32) *PreferredSchedulingTermApplyConfiguration { + b.Weight = &value + return b +} + +// WithPreference sets the Preference field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Preference field is set to the value of the last call. +func (b *PreferredSchedulingTermApplyConfiguration) WithPreference(value *NodeSelectorTermApplyConfiguration) *PreferredSchedulingTermApplyConfiguration { + b.Preference = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/probe.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/probe.go new file mode 100644 index 000000000000..f87adcd5f32a --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/probe.go @@ -0,0 +1,109 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// ProbeApplyConfiguration represents an declarative configuration of the Probe type for use +// with apply. +type ProbeApplyConfiguration struct { + HandlerApplyConfiguration `json:",inline"` + InitialDelaySeconds *int32 `json:"initialDelaySeconds,omitempty"` + TimeoutSeconds *int32 `json:"timeoutSeconds,omitempty"` + PeriodSeconds *int32 `json:"periodSeconds,omitempty"` + SuccessThreshold *int32 `json:"successThreshold,omitempty"` + FailureThreshold *int32 `json:"failureThreshold,omitempty"` + TerminationGracePeriodSeconds *int64 `json:"terminationGracePeriodSeconds,omitempty"` +} + +// ProbeApplyConfiguration constructs an declarative configuration of the Probe type for use with +// apply. +func Probe() *ProbeApplyConfiguration { + return &ProbeApplyConfiguration{} +} + +// WithExec sets the Exec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Exec field is set to the value of the last call. +func (b *ProbeApplyConfiguration) WithExec(value *ExecActionApplyConfiguration) *ProbeApplyConfiguration { + b.Exec = value + return b +} + +// WithHTTPGet sets the HTTPGet field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the HTTPGet field is set to the value of the last call. +func (b *ProbeApplyConfiguration) WithHTTPGet(value *HTTPGetActionApplyConfiguration) *ProbeApplyConfiguration { + b.HTTPGet = value + return b +} + +// WithTCPSocket sets the TCPSocket field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the TCPSocket field is set to the value of the last call. +func (b *ProbeApplyConfiguration) WithTCPSocket(value *TCPSocketActionApplyConfiguration) *ProbeApplyConfiguration { + b.TCPSocket = value + return b +} + +// WithInitialDelaySeconds sets the InitialDelaySeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the InitialDelaySeconds field is set to the value of the last call. +func (b *ProbeApplyConfiguration) WithInitialDelaySeconds(value int32) *ProbeApplyConfiguration { + b.InitialDelaySeconds = &value + return b +} + +// WithTimeoutSeconds sets the TimeoutSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the TimeoutSeconds field is set to the value of the last call. +func (b *ProbeApplyConfiguration) WithTimeoutSeconds(value int32) *ProbeApplyConfiguration { + b.TimeoutSeconds = &value + return b +} + +// WithPeriodSeconds sets the PeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PeriodSeconds field is set to the value of the last call. +func (b *ProbeApplyConfiguration) WithPeriodSeconds(value int32) *ProbeApplyConfiguration { + b.PeriodSeconds = &value + return b +} + +// WithSuccessThreshold sets the SuccessThreshold field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SuccessThreshold field is set to the value of the last call. +func (b *ProbeApplyConfiguration) WithSuccessThreshold(value int32) *ProbeApplyConfiguration { + b.SuccessThreshold = &value + return b +} + +// WithFailureThreshold sets the FailureThreshold field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FailureThreshold field is set to the value of the last call. +func (b *ProbeApplyConfiguration) WithFailureThreshold(value int32) *ProbeApplyConfiguration { + b.FailureThreshold = &value + return b +} + +// WithTerminationGracePeriodSeconds sets the TerminationGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the TerminationGracePeriodSeconds field is set to the value of the last call. +func (b *ProbeApplyConfiguration) WithTerminationGracePeriodSeconds(value int64) *ProbeApplyConfiguration { + b.TerminationGracePeriodSeconds = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/projectedvolumesource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/projectedvolumesource.go new file mode 100644 index 000000000000..0a9d1d88e601 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/projectedvolumesource.go @@ -0,0 +1,53 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// ProjectedVolumeSourceApplyConfiguration represents an declarative configuration of the ProjectedVolumeSource type for use +// with apply. +type ProjectedVolumeSourceApplyConfiguration struct { + Sources []VolumeProjectionApplyConfiguration `json:"sources,omitempty"` + DefaultMode *int32 `json:"defaultMode,omitempty"` +} + +// ProjectedVolumeSourceApplyConfiguration constructs an declarative configuration of the ProjectedVolumeSource type for use with +// apply. +func ProjectedVolumeSource() *ProjectedVolumeSourceApplyConfiguration { + return &ProjectedVolumeSourceApplyConfiguration{} +} + +// WithSources adds the given value to the Sources field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Sources field. +func (b *ProjectedVolumeSourceApplyConfiguration) WithSources(values ...*VolumeProjectionApplyConfiguration) *ProjectedVolumeSourceApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithSources") + } + b.Sources = append(b.Sources, *values[i]) + } + return b +} + +// WithDefaultMode sets the DefaultMode field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DefaultMode field is set to the value of the last call. +func (b *ProjectedVolumeSourceApplyConfiguration) WithDefaultMode(value int32) *ProjectedVolumeSourceApplyConfiguration { + b.DefaultMode = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/quobytevolumesource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/quobytevolumesource.go new file mode 100644 index 000000000000..646052ea4a77 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/quobytevolumesource.go @@ -0,0 +1,84 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// QuobyteVolumeSourceApplyConfiguration represents an declarative configuration of the QuobyteVolumeSource type for use +// with apply. +type QuobyteVolumeSourceApplyConfiguration struct { + Registry *string `json:"registry,omitempty"` + Volume *string `json:"volume,omitempty"` + ReadOnly *bool `json:"readOnly,omitempty"` + User *string `json:"user,omitempty"` + Group *string `json:"group,omitempty"` + Tenant *string `json:"tenant,omitempty"` +} + +// QuobyteVolumeSourceApplyConfiguration constructs an declarative configuration of the QuobyteVolumeSource type for use with +// apply. +func QuobyteVolumeSource() *QuobyteVolumeSourceApplyConfiguration { + return &QuobyteVolumeSourceApplyConfiguration{} +} + +// WithRegistry sets the Registry field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Registry field is set to the value of the last call. +func (b *QuobyteVolumeSourceApplyConfiguration) WithRegistry(value string) *QuobyteVolumeSourceApplyConfiguration { + b.Registry = &value + return b +} + +// WithVolume sets the Volume field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Volume field is set to the value of the last call. +func (b *QuobyteVolumeSourceApplyConfiguration) WithVolume(value string) *QuobyteVolumeSourceApplyConfiguration { + b.Volume = &value + return b +} + +// WithReadOnly sets the ReadOnly field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadOnly field is set to the value of the last call. +func (b *QuobyteVolumeSourceApplyConfiguration) WithReadOnly(value bool) *QuobyteVolumeSourceApplyConfiguration { + b.ReadOnly = &value + return b +} + +// WithUser sets the User field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the User field is set to the value of the last call. +func (b *QuobyteVolumeSourceApplyConfiguration) WithUser(value string) *QuobyteVolumeSourceApplyConfiguration { + b.User = &value + return b +} + +// WithGroup sets the Group field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Group field is set to the value of the last call. +func (b *QuobyteVolumeSourceApplyConfiguration) WithGroup(value string) *QuobyteVolumeSourceApplyConfiguration { + b.Group = &value + return b +} + +// WithTenant sets the Tenant field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Tenant field is set to the value of the last call. +func (b *QuobyteVolumeSourceApplyConfiguration) WithTenant(value string) *QuobyteVolumeSourceApplyConfiguration { + b.Tenant = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/rbdpersistentvolumesource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/rbdpersistentvolumesource.go new file mode 100644 index 000000000000..ffcb836eb0cc --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/rbdpersistentvolumesource.go @@ -0,0 +1,104 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// RBDPersistentVolumeSourceApplyConfiguration represents an declarative configuration of the RBDPersistentVolumeSource type for use +// with apply. +type RBDPersistentVolumeSourceApplyConfiguration struct { + CephMonitors []string `json:"monitors,omitempty"` + RBDImage *string `json:"image,omitempty"` + FSType *string `json:"fsType,omitempty"` + RBDPool *string `json:"pool,omitempty"` + RadosUser *string `json:"user,omitempty"` + Keyring *string `json:"keyring,omitempty"` + SecretRef *SecretReferenceApplyConfiguration `json:"secretRef,omitempty"` + ReadOnly *bool `json:"readOnly,omitempty"` +} + +// RBDPersistentVolumeSourceApplyConfiguration constructs an declarative configuration of the RBDPersistentVolumeSource type for use with +// apply. +func RBDPersistentVolumeSource() *RBDPersistentVolumeSourceApplyConfiguration { + return &RBDPersistentVolumeSourceApplyConfiguration{} +} + +// WithCephMonitors adds the given value to the CephMonitors field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the CephMonitors field. +func (b *RBDPersistentVolumeSourceApplyConfiguration) WithCephMonitors(values ...string) *RBDPersistentVolumeSourceApplyConfiguration { + for i := range values { + b.CephMonitors = append(b.CephMonitors, values[i]) + } + return b +} + +// WithRBDImage sets the RBDImage field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RBDImage field is set to the value of the last call. +func (b *RBDPersistentVolumeSourceApplyConfiguration) WithRBDImage(value string) *RBDPersistentVolumeSourceApplyConfiguration { + b.RBDImage = &value + return b +} + +// WithFSType sets the FSType field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FSType field is set to the value of the last call. +func (b *RBDPersistentVolumeSourceApplyConfiguration) WithFSType(value string) *RBDPersistentVolumeSourceApplyConfiguration { + b.FSType = &value + return b +} + +// WithRBDPool sets the RBDPool field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RBDPool field is set to the value of the last call. +func (b *RBDPersistentVolumeSourceApplyConfiguration) WithRBDPool(value string) *RBDPersistentVolumeSourceApplyConfiguration { + b.RBDPool = &value + return b +} + +// WithRadosUser sets the RadosUser field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RadosUser field is set to the value of the last call. +func (b *RBDPersistentVolumeSourceApplyConfiguration) WithRadosUser(value string) *RBDPersistentVolumeSourceApplyConfiguration { + b.RadosUser = &value + return b +} + +// WithKeyring sets the Keyring field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Keyring field is set to the value of the last call. +func (b *RBDPersistentVolumeSourceApplyConfiguration) WithKeyring(value string) *RBDPersistentVolumeSourceApplyConfiguration { + b.Keyring = &value + return b +} + +// WithSecretRef sets the SecretRef field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SecretRef field is set to the value of the last call. +func (b *RBDPersistentVolumeSourceApplyConfiguration) WithSecretRef(value *SecretReferenceApplyConfiguration) *RBDPersistentVolumeSourceApplyConfiguration { + b.SecretRef = value + return b +} + +// WithReadOnly sets the ReadOnly field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadOnly field is set to the value of the last call. +func (b *RBDPersistentVolumeSourceApplyConfiguration) WithReadOnly(value bool) *RBDPersistentVolumeSourceApplyConfiguration { + b.ReadOnly = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/rbdvolumesource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/rbdvolumesource.go new file mode 100644 index 000000000000..8e7c81732cd4 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/rbdvolumesource.go @@ -0,0 +1,104 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// RBDVolumeSourceApplyConfiguration represents an declarative configuration of the RBDVolumeSource type for use +// with apply. +type RBDVolumeSourceApplyConfiguration struct { + CephMonitors []string `json:"monitors,omitempty"` + RBDImage *string `json:"image,omitempty"` + FSType *string `json:"fsType,omitempty"` + RBDPool *string `json:"pool,omitempty"` + RadosUser *string `json:"user,omitempty"` + Keyring *string `json:"keyring,omitempty"` + SecretRef *LocalObjectReferenceApplyConfiguration `json:"secretRef,omitempty"` + ReadOnly *bool `json:"readOnly,omitempty"` +} + +// RBDVolumeSourceApplyConfiguration constructs an declarative configuration of the RBDVolumeSource type for use with +// apply. +func RBDVolumeSource() *RBDVolumeSourceApplyConfiguration { + return &RBDVolumeSourceApplyConfiguration{} +} + +// WithCephMonitors adds the given value to the CephMonitors field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the CephMonitors field. +func (b *RBDVolumeSourceApplyConfiguration) WithCephMonitors(values ...string) *RBDVolumeSourceApplyConfiguration { + for i := range values { + b.CephMonitors = append(b.CephMonitors, values[i]) + } + return b +} + +// WithRBDImage sets the RBDImage field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RBDImage field is set to the value of the last call. +func (b *RBDVolumeSourceApplyConfiguration) WithRBDImage(value string) *RBDVolumeSourceApplyConfiguration { + b.RBDImage = &value + return b +} + +// WithFSType sets the FSType field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FSType field is set to the value of the last call. +func (b *RBDVolumeSourceApplyConfiguration) WithFSType(value string) *RBDVolumeSourceApplyConfiguration { + b.FSType = &value + return b +} + +// WithRBDPool sets the RBDPool field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RBDPool field is set to the value of the last call. +func (b *RBDVolumeSourceApplyConfiguration) WithRBDPool(value string) *RBDVolumeSourceApplyConfiguration { + b.RBDPool = &value + return b +} + +// WithRadosUser sets the RadosUser field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RadosUser field is set to the value of the last call. +func (b *RBDVolumeSourceApplyConfiguration) WithRadosUser(value string) *RBDVolumeSourceApplyConfiguration { + b.RadosUser = &value + return b +} + +// WithKeyring sets the Keyring field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Keyring field is set to the value of the last call. +func (b *RBDVolumeSourceApplyConfiguration) WithKeyring(value string) *RBDVolumeSourceApplyConfiguration { + b.Keyring = &value + return b +} + +// WithSecretRef sets the SecretRef field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SecretRef field is set to the value of the last call. +func (b *RBDVolumeSourceApplyConfiguration) WithSecretRef(value *LocalObjectReferenceApplyConfiguration) *RBDVolumeSourceApplyConfiguration { + b.SecretRef = value + return b +} + +// WithReadOnly sets the ReadOnly field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadOnly field is set to the value of the last call. +func (b *RBDVolumeSourceApplyConfiguration) WithReadOnly(value bool) *RBDVolumeSourceApplyConfiguration { + b.ReadOnly = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/replicationcontroller.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/replicationcontroller.go new file mode 100644 index 000000000000..f9b243a65e98 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/replicationcontroller.go @@ -0,0 +1,265 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + apicorev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// ReplicationControllerApplyConfiguration represents an declarative configuration of the ReplicationController type for use +// with apply. +type ReplicationControllerApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *ReplicationControllerSpecApplyConfiguration `json:"spec,omitempty"` + Status *ReplicationControllerStatusApplyConfiguration `json:"status,omitempty"` +} + +// ReplicationController constructs an declarative configuration of the ReplicationController type for use with +// apply. +func ReplicationController(name, namespace string) *ReplicationControllerApplyConfiguration { + b := &ReplicationControllerApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("ReplicationController") + b.WithAPIVersion("v1") + return b +} + +// ExtractReplicationController extracts the applied configuration owned by fieldManager from +// replicationController. If no managedFields are found in replicationController for fieldManager, a +// ReplicationControllerApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// replicationController must be a unmodified ReplicationController API object that was retrieved from the Kubernetes API. +// ExtractReplicationController provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractReplicationController(replicationController *apicorev1.ReplicationController, fieldManager string) (*ReplicationControllerApplyConfiguration, error) { + b := &ReplicationControllerApplyConfiguration{} + err := managedfields.ExtractInto(replicationController, internal.Parser().Type("io.k8s.api.core.v1.ReplicationController"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(replicationController.Name) + b.WithNamespace(replicationController.Namespace) + + b.WithKind("ReplicationController") + b.WithAPIVersion("v1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *ReplicationControllerApplyConfiguration) WithKind(value string) *ReplicationControllerApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *ReplicationControllerApplyConfiguration) WithAPIVersion(value string) *ReplicationControllerApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ReplicationControllerApplyConfiguration) WithName(value string) *ReplicationControllerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *ReplicationControllerApplyConfiguration) WithGenerateName(value string) *ReplicationControllerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *ReplicationControllerApplyConfiguration) WithNamespace(value string) *ReplicationControllerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *ReplicationControllerApplyConfiguration) WithSelfLink(value string) *ReplicationControllerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *ReplicationControllerApplyConfiguration) WithUID(value types.UID) *ReplicationControllerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *ReplicationControllerApplyConfiguration) WithResourceVersion(value string) *ReplicationControllerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *ReplicationControllerApplyConfiguration) WithGeneration(value int64) *ReplicationControllerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *ReplicationControllerApplyConfiguration) WithCreationTimestamp(value metav1.Time) *ReplicationControllerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *ReplicationControllerApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *ReplicationControllerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *ReplicationControllerApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *ReplicationControllerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *ReplicationControllerApplyConfiguration) WithLabels(entries map[string]string) *ReplicationControllerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *ReplicationControllerApplyConfiguration) WithAnnotations(entries map[string]string) *ReplicationControllerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *ReplicationControllerApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *ReplicationControllerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *ReplicationControllerApplyConfiguration) WithFinalizers(values ...string) *ReplicationControllerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *ReplicationControllerApplyConfiguration) WithClusterName(value string) *ReplicationControllerApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *ReplicationControllerApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *ReplicationControllerApplyConfiguration) WithSpec(value *ReplicationControllerSpecApplyConfiguration) *ReplicationControllerApplyConfiguration { + b.Spec = value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *ReplicationControllerApplyConfiguration) WithStatus(value *ReplicationControllerStatusApplyConfiguration) *ReplicationControllerApplyConfiguration { + b.Status = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/replicationcontrollercondition.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/replicationcontrollercondition.go new file mode 100644 index 000000000000..c3d56cc697f8 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/replicationcontrollercondition.go @@ -0,0 +1,80 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// ReplicationControllerConditionApplyConfiguration represents an declarative configuration of the ReplicationControllerCondition type for use +// with apply. +type ReplicationControllerConditionApplyConfiguration struct { + Type *v1.ReplicationControllerConditionType `json:"type,omitempty"` + Status *v1.ConditionStatus `json:"status,omitempty"` + LastTransitionTime *metav1.Time `json:"lastTransitionTime,omitempty"` + Reason *string `json:"reason,omitempty"` + Message *string `json:"message,omitempty"` +} + +// ReplicationControllerConditionApplyConfiguration constructs an declarative configuration of the ReplicationControllerCondition type for use with +// apply. +func ReplicationControllerCondition() *ReplicationControllerConditionApplyConfiguration { + return &ReplicationControllerConditionApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *ReplicationControllerConditionApplyConfiguration) WithType(value v1.ReplicationControllerConditionType) *ReplicationControllerConditionApplyConfiguration { + b.Type = &value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *ReplicationControllerConditionApplyConfiguration) WithStatus(value v1.ConditionStatus) *ReplicationControllerConditionApplyConfiguration { + b.Status = &value + return b +} + +// WithLastTransitionTime sets the LastTransitionTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastTransitionTime field is set to the value of the last call. +func (b *ReplicationControllerConditionApplyConfiguration) WithLastTransitionTime(value metav1.Time) *ReplicationControllerConditionApplyConfiguration { + b.LastTransitionTime = &value + return b +} + +// WithReason sets the Reason field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Reason field is set to the value of the last call. +func (b *ReplicationControllerConditionApplyConfiguration) WithReason(value string) *ReplicationControllerConditionApplyConfiguration { + b.Reason = &value + return b +} + +// WithMessage sets the Message field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Message field is set to the value of the last call. +func (b *ReplicationControllerConditionApplyConfiguration) WithMessage(value string) *ReplicationControllerConditionApplyConfiguration { + b.Message = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/replicationcontrollerspec.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/replicationcontrollerspec.go new file mode 100644 index 000000000000..dd4e081d9f33 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/replicationcontrollerspec.go @@ -0,0 +1,72 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// ReplicationControllerSpecApplyConfiguration represents an declarative configuration of the ReplicationControllerSpec type for use +// with apply. +type ReplicationControllerSpecApplyConfiguration struct { + Replicas *int32 `json:"replicas,omitempty"` + MinReadySeconds *int32 `json:"minReadySeconds,omitempty"` + Selector map[string]string `json:"selector,omitempty"` + Template *PodTemplateSpecApplyConfiguration `json:"template,omitempty"` +} + +// ReplicationControllerSpecApplyConfiguration constructs an declarative configuration of the ReplicationControllerSpec type for use with +// apply. +func ReplicationControllerSpec() *ReplicationControllerSpecApplyConfiguration { + return &ReplicationControllerSpecApplyConfiguration{} +} + +// WithReplicas sets the Replicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Replicas field is set to the value of the last call. +func (b *ReplicationControllerSpecApplyConfiguration) WithReplicas(value int32) *ReplicationControllerSpecApplyConfiguration { + b.Replicas = &value + return b +} + +// WithMinReadySeconds sets the MinReadySeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MinReadySeconds field is set to the value of the last call. +func (b *ReplicationControllerSpecApplyConfiguration) WithMinReadySeconds(value int32) *ReplicationControllerSpecApplyConfiguration { + b.MinReadySeconds = &value + return b +} + +// WithSelector puts the entries into the Selector field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Selector field, +// overwriting an existing map entries in Selector field with the same key. +func (b *ReplicationControllerSpecApplyConfiguration) WithSelector(entries map[string]string) *ReplicationControllerSpecApplyConfiguration { + if b.Selector == nil && len(entries) > 0 { + b.Selector = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Selector[k] = v + } + return b +} + +// WithTemplate sets the Template field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Template field is set to the value of the last call. +func (b *ReplicationControllerSpecApplyConfiguration) WithTemplate(value *PodTemplateSpecApplyConfiguration) *ReplicationControllerSpecApplyConfiguration { + b.Template = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/replicationcontrollerstatus.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/replicationcontrollerstatus.go new file mode 100644 index 000000000000..1b994cfb8ce2 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/replicationcontrollerstatus.go @@ -0,0 +1,89 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// ReplicationControllerStatusApplyConfiguration represents an declarative configuration of the ReplicationControllerStatus type for use +// with apply. +type ReplicationControllerStatusApplyConfiguration struct { + Replicas *int32 `json:"replicas,omitempty"` + FullyLabeledReplicas *int32 `json:"fullyLabeledReplicas,omitempty"` + ReadyReplicas *int32 `json:"readyReplicas,omitempty"` + AvailableReplicas *int32 `json:"availableReplicas,omitempty"` + ObservedGeneration *int64 `json:"observedGeneration,omitempty"` + Conditions []ReplicationControllerConditionApplyConfiguration `json:"conditions,omitempty"` +} + +// ReplicationControllerStatusApplyConfiguration constructs an declarative configuration of the ReplicationControllerStatus type for use with +// apply. +func ReplicationControllerStatus() *ReplicationControllerStatusApplyConfiguration { + return &ReplicationControllerStatusApplyConfiguration{} +} + +// WithReplicas sets the Replicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Replicas field is set to the value of the last call. +func (b *ReplicationControllerStatusApplyConfiguration) WithReplicas(value int32) *ReplicationControllerStatusApplyConfiguration { + b.Replicas = &value + return b +} + +// WithFullyLabeledReplicas sets the FullyLabeledReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FullyLabeledReplicas field is set to the value of the last call. +func (b *ReplicationControllerStatusApplyConfiguration) WithFullyLabeledReplicas(value int32) *ReplicationControllerStatusApplyConfiguration { + b.FullyLabeledReplicas = &value + return b +} + +// WithReadyReplicas sets the ReadyReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadyReplicas field is set to the value of the last call. +func (b *ReplicationControllerStatusApplyConfiguration) WithReadyReplicas(value int32) *ReplicationControllerStatusApplyConfiguration { + b.ReadyReplicas = &value + return b +} + +// WithAvailableReplicas sets the AvailableReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AvailableReplicas field is set to the value of the last call. +func (b *ReplicationControllerStatusApplyConfiguration) WithAvailableReplicas(value int32) *ReplicationControllerStatusApplyConfiguration { + b.AvailableReplicas = &value + return b +} + +// WithObservedGeneration sets the ObservedGeneration field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ObservedGeneration field is set to the value of the last call. +func (b *ReplicationControllerStatusApplyConfiguration) WithObservedGeneration(value int64) *ReplicationControllerStatusApplyConfiguration { + b.ObservedGeneration = &value + return b +} + +// WithConditions adds the given value to the Conditions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Conditions field. +func (b *ReplicationControllerStatusApplyConfiguration) WithConditions(values ...*ReplicationControllerConditionApplyConfiguration) *ReplicationControllerStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithConditions") + } + b.Conditions = append(b.Conditions, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/resourcefieldselector.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/resourcefieldselector.go new file mode 100644 index 000000000000..2741227dd7a8 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/resourcefieldselector.go @@ -0,0 +1,61 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + resource "k8s.io/apimachinery/pkg/api/resource" +) + +// ResourceFieldSelectorApplyConfiguration represents an declarative configuration of the ResourceFieldSelector type for use +// with apply. +type ResourceFieldSelectorApplyConfiguration struct { + ContainerName *string `json:"containerName,omitempty"` + Resource *string `json:"resource,omitempty"` + Divisor *resource.Quantity `json:"divisor,omitempty"` +} + +// ResourceFieldSelectorApplyConfiguration constructs an declarative configuration of the ResourceFieldSelector type for use with +// apply. +func ResourceFieldSelector() *ResourceFieldSelectorApplyConfiguration { + return &ResourceFieldSelectorApplyConfiguration{} +} + +// WithContainerName sets the ContainerName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ContainerName field is set to the value of the last call. +func (b *ResourceFieldSelectorApplyConfiguration) WithContainerName(value string) *ResourceFieldSelectorApplyConfiguration { + b.ContainerName = &value + return b +} + +// WithResource sets the Resource field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Resource field is set to the value of the last call. +func (b *ResourceFieldSelectorApplyConfiguration) WithResource(value string) *ResourceFieldSelectorApplyConfiguration { + b.Resource = &value + return b +} + +// WithDivisor sets the Divisor field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Divisor field is set to the value of the last call. +func (b *ResourceFieldSelectorApplyConfiguration) WithDivisor(value resource.Quantity) *ResourceFieldSelectorApplyConfiguration { + b.Divisor = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/resourcequota.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/resourcequota.go new file mode 100644 index 000000000000..a0c4f0c0a2b0 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/resourcequota.go @@ -0,0 +1,265 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + apicorev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// ResourceQuotaApplyConfiguration represents an declarative configuration of the ResourceQuota type for use +// with apply. +type ResourceQuotaApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *ResourceQuotaSpecApplyConfiguration `json:"spec,omitempty"` + Status *ResourceQuotaStatusApplyConfiguration `json:"status,omitempty"` +} + +// ResourceQuota constructs an declarative configuration of the ResourceQuota type for use with +// apply. +func ResourceQuota(name, namespace string) *ResourceQuotaApplyConfiguration { + b := &ResourceQuotaApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("ResourceQuota") + b.WithAPIVersion("v1") + return b +} + +// ExtractResourceQuota extracts the applied configuration owned by fieldManager from +// resourceQuota. If no managedFields are found in resourceQuota for fieldManager, a +// ResourceQuotaApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// resourceQuota must be a unmodified ResourceQuota API object that was retrieved from the Kubernetes API. +// ExtractResourceQuota provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractResourceQuota(resourceQuota *apicorev1.ResourceQuota, fieldManager string) (*ResourceQuotaApplyConfiguration, error) { + b := &ResourceQuotaApplyConfiguration{} + err := managedfields.ExtractInto(resourceQuota, internal.Parser().Type("io.k8s.api.core.v1.ResourceQuota"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(resourceQuota.Name) + b.WithNamespace(resourceQuota.Namespace) + + b.WithKind("ResourceQuota") + b.WithAPIVersion("v1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *ResourceQuotaApplyConfiguration) WithKind(value string) *ResourceQuotaApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *ResourceQuotaApplyConfiguration) WithAPIVersion(value string) *ResourceQuotaApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ResourceQuotaApplyConfiguration) WithName(value string) *ResourceQuotaApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *ResourceQuotaApplyConfiguration) WithGenerateName(value string) *ResourceQuotaApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *ResourceQuotaApplyConfiguration) WithNamespace(value string) *ResourceQuotaApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *ResourceQuotaApplyConfiguration) WithSelfLink(value string) *ResourceQuotaApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *ResourceQuotaApplyConfiguration) WithUID(value types.UID) *ResourceQuotaApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *ResourceQuotaApplyConfiguration) WithResourceVersion(value string) *ResourceQuotaApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *ResourceQuotaApplyConfiguration) WithGeneration(value int64) *ResourceQuotaApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *ResourceQuotaApplyConfiguration) WithCreationTimestamp(value metav1.Time) *ResourceQuotaApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *ResourceQuotaApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *ResourceQuotaApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *ResourceQuotaApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *ResourceQuotaApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *ResourceQuotaApplyConfiguration) WithLabels(entries map[string]string) *ResourceQuotaApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *ResourceQuotaApplyConfiguration) WithAnnotations(entries map[string]string) *ResourceQuotaApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *ResourceQuotaApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *ResourceQuotaApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *ResourceQuotaApplyConfiguration) WithFinalizers(values ...string) *ResourceQuotaApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *ResourceQuotaApplyConfiguration) WithClusterName(value string) *ResourceQuotaApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *ResourceQuotaApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *ResourceQuotaApplyConfiguration) WithSpec(value *ResourceQuotaSpecApplyConfiguration) *ResourceQuotaApplyConfiguration { + b.Spec = value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *ResourceQuotaApplyConfiguration) WithStatus(value *ResourceQuotaStatusApplyConfiguration) *ResourceQuotaApplyConfiguration { + b.Status = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/resourcequotaspec.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/resourcequotaspec.go new file mode 100644 index 000000000000..feb454bc4bf3 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/resourcequotaspec.go @@ -0,0 +1,63 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/core/v1" +) + +// ResourceQuotaSpecApplyConfiguration represents an declarative configuration of the ResourceQuotaSpec type for use +// with apply. +type ResourceQuotaSpecApplyConfiguration struct { + Hard *v1.ResourceList `json:"hard,omitempty"` + Scopes []v1.ResourceQuotaScope `json:"scopes,omitempty"` + ScopeSelector *ScopeSelectorApplyConfiguration `json:"scopeSelector,omitempty"` +} + +// ResourceQuotaSpecApplyConfiguration constructs an declarative configuration of the ResourceQuotaSpec type for use with +// apply. +func ResourceQuotaSpec() *ResourceQuotaSpecApplyConfiguration { + return &ResourceQuotaSpecApplyConfiguration{} +} + +// WithHard sets the Hard field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Hard field is set to the value of the last call. +func (b *ResourceQuotaSpecApplyConfiguration) WithHard(value v1.ResourceList) *ResourceQuotaSpecApplyConfiguration { + b.Hard = &value + return b +} + +// WithScopes adds the given value to the Scopes field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Scopes field. +func (b *ResourceQuotaSpecApplyConfiguration) WithScopes(values ...v1.ResourceQuotaScope) *ResourceQuotaSpecApplyConfiguration { + for i := range values { + b.Scopes = append(b.Scopes, values[i]) + } + return b +} + +// WithScopeSelector sets the ScopeSelector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ScopeSelector field is set to the value of the last call. +func (b *ResourceQuotaSpecApplyConfiguration) WithScopeSelector(value *ScopeSelectorApplyConfiguration) *ResourceQuotaSpecApplyConfiguration { + b.ScopeSelector = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/resourcequotastatus.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/resourcequotastatus.go new file mode 100644 index 000000000000..4dced90f7ab3 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/resourcequotastatus.go @@ -0,0 +1,52 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/core/v1" +) + +// ResourceQuotaStatusApplyConfiguration represents an declarative configuration of the ResourceQuotaStatus type for use +// with apply. +type ResourceQuotaStatusApplyConfiguration struct { + Hard *v1.ResourceList `json:"hard,omitempty"` + Used *v1.ResourceList `json:"used,omitempty"` +} + +// ResourceQuotaStatusApplyConfiguration constructs an declarative configuration of the ResourceQuotaStatus type for use with +// apply. +func ResourceQuotaStatus() *ResourceQuotaStatusApplyConfiguration { + return &ResourceQuotaStatusApplyConfiguration{} +} + +// WithHard sets the Hard field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Hard field is set to the value of the last call. +func (b *ResourceQuotaStatusApplyConfiguration) WithHard(value v1.ResourceList) *ResourceQuotaStatusApplyConfiguration { + b.Hard = &value + return b +} + +// WithUsed sets the Used field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Used field is set to the value of the last call. +func (b *ResourceQuotaStatusApplyConfiguration) WithUsed(value v1.ResourceList) *ResourceQuotaStatusApplyConfiguration { + b.Used = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/resourcerequirements.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/resourcerequirements.go new file mode 100644 index 000000000000..d22f38479456 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/resourcerequirements.go @@ -0,0 +1,52 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/core/v1" +) + +// ResourceRequirementsApplyConfiguration represents an declarative configuration of the ResourceRequirements type for use +// with apply. +type ResourceRequirementsApplyConfiguration struct { + Limits *v1.ResourceList `json:"limits,omitempty"` + Requests *v1.ResourceList `json:"requests,omitempty"` +} + +// ResourceRequirementsApplyConfiguration constructs an declarative configuration of the ResourceRequirements type for use with +// apply. +func ResourceRequirements() *ResourceRequirementsApplyConfiguration { + return &ResourceRequirementsApplyConfiguration{} +} + +// WithLimits sets the Limits field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Limits field is set to the value of the last call. +func (b *ResourceRequirementsApplyConfiguration) WithLimits(value v1.ResourceList) *ResourceRequirementsApplyConfiguration { + b.Limits = &value + return b +} + +// WithRequests sets the Requests field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Requests field is set to the value of the last call. +func (b *ResourceRequirementsApplyConfiguration) WithRequests(value v1.ResourceList) *ResourceRequirementsApplyConfiguration { + b.Requests = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/scaleiopersistentvolumesource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/scaleiopersistentvolumesource.go new file mode 100644 index 000000000000..fffb5b186d94 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/scaleiopersistentvolumesource.go @@ -0,0 +1,120 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// ScaleIOPersistentVolumeSourceApplyConfiguration represents an declarative configuration of the ScaleIOPersistentVolumeSource type for use +// with apply. +type ScaleIOPersistentVolumeSourceApplyConfiguration struct { + Gateway *string `json:"gateway,omitempty"` + System *string `json:"system,omitempty"` + SecretRef *SecretReferenceApplyConfiguration `json:"secretRef,omitempty"` + SSLEnabled *bool `json:"sslEnabled,omitempty"` + ProtectionDomain *string `json:"protectionDomain,omitempty"` + StoragePool *string `json:"storagePool,omitempty"` + StorageMode *string `json:"storageMode,omitempty"` + VolumeName *string `json:"volumeName,omitempty"` + FSType *string `json:"fsType,omitempty"` + ReadOnly *bool `json:"readOnly,omitempty"` +} + +// ScaleIOPersistentVolumeSourceApplyConfiguration constructs an declarative configuration of the ScaleIOPersistentVolumeSource type for use with +// apply. +func ScaleIOPersistentVolumeSource() *ScaleIOPersistentVolumeSourceApplyConfiguration { + return &ScaleIOPersistentVolumeSourceApplyConfiguration{} +} + +// WithGateway sets the Gateway field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Gateway field is set to the value of the last call. +func (b *ScaleIOPersistentVolumeSourceApplyConfiguration) WithGateway(value string) *ScaleIOPersistentVolumeSourceApplyConfiguration { + b.Gateway = &value + return b +} + +// WithSystem sets the System field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the System field is set to the value of the last call. +func (b *ScaleIOPersistentVolumeSourceApplyConfiguration) WithSystem(value string) *ScaleIOPersistentVolumeSourceApplyConfiguration { + b.System = &value + return b +} + +// WithSecretRef sets the SecretRef field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SecretRef field is set to the value of the last call. +func (b *ScaleIOPersistentVolumeSourceApplyConfiguration) WithSecretRef(value *SecretReferenceApplyConfiguration) *ScaleIOPersistentVolumeSourceApplyConfiguration { + b.SecretRef = value + return b +} + +// WithSSLEnabled sets the SSLEnabled field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SSLEnabled field is set to the value of the last call. +func (b *ScaleIOPersistentVolumeSourceApplyConfiguration) WithSSLEnabled(value bool) *ScaleIOPersistentVolumeSourceApplyConfiguration { + b.SSLEnabled = &value + return b +} + +// WithProtectionDomain sets the ProtectionDomain field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ProtectionDomain field is set to the value of the last call. +func (b *ScaleIOPersistentVolumeSourceApplyConfiguration) WithProtectionDomain(value string) *ScaleIOPersistentVolumeSourceApplyConfiguration { + b.ProtectionDomain = &value + return b +} + +// WithStoragePool sets the StoragePool field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the StoragePool field is set to the value of the last call. +func (b *ScaleIOPersistentVolumeSourceApplyConfiguration) WithStoragePool(value string) *ScaleIOPersistentVolumeSourceApplyConfiguration { + b.StoragePool = &value + return b +} + +// WithStorageMode sets the StorageMode field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the StorageMode field is set to the value of the last call. +func (b *ScaleIOPersistentVolumeSourceApplyConfiguration) WithStorageMode(value string) *ScaleIOPersistentVolumeSourceApplyConfiguration { + b.StorageMode = &value + return b +} + +// WithVolumeName sets the VolumeName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the VolumeName field is set to the value of the last call. +func (b *ScaleIOPersistentVolumeSourceApplyConfiguration) WithVolumeName(value string) *ScaleIOPersistentVolumeSourceApplyConfiguration { + b.VolumeName = &value + return b +} + +// WithFSType sets the FSType field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FSType field is set to the value of the last call. +func (b *ScaleIOPersistentVolumeSourceApplyConfiguration) WithFSType(value string) *ScaleIOPersistentVolumeSourceApplyConfiguration { + b.FSType = &value + return b +} + +// WithReadOnly sets the ReadOnly field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadOnly field is set to the value of the last call. +func (b *ScaleIOPersistentVolumeSourceApplyConfiguration) WithReadOnly(value bool) *ScaleIOPersistentVolumeSourceApplyConfiguration { + b.ReadOnly = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/scaleiovolumesource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/scaleiovolumesource.go new file mode 100644 index 000000000000..b54e1161ebf8 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/scaleiovolumesource.go @@ -0,0 +1,120 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// ScaleIOVolumeSourceApplyConfiguration represents an declarative configuration of the ScaleIOVolumeSource type for use +// with apply. +type ScaleIOVolumeSourceApplyConfiguration struct { + Gateway *string `json:"gateway,omitempty"` + System *string `json:"system,omitempty"` + SecretRef *LocalObjectReferenceApplyConfiguration `json:"secretRef,omitempty"` + SSLEnabled *bool `json:"sslEnabled,omitempty"` + ProtectionDomain *string `json:"protectionDomain,omitempty"` + StoragePool *string `json:"storagePool,omitempty"` + StorageMode *string `json:"storageMode,omitempty"` + VolumeName *string `json:"volumeName,omitempty"` + FSType *string `json:"fsType,omitempty"` + ReadOnly *bool `json:"readOnly,omitempty"` +} + +// ScaleIOVolumeSourceApplyConfiguration constructs an declarative configuration of the ScaleIOVolumeSource type for use with +// apply. +func ScaleIOVolumeSource() *ScaleIOVolumeSourceApplyConfiguration { + return &ScaleIOVolumeSourceApplyConfiguration{} +} + +// WithGateway sets the Gateway field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Gateway field is set to the value of the last call. +func (b *ScaleIOVolumeSourceApplyConfiguration) WithGateway(value string) *ScaleIOVolumeSourceApplyConfiguration { + b.Gateway = &value + return b +} + +// WithSystem sets the System field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the System field is set to the value of the last call. +func (b *ScaleIOVolumeSourceApplyConfiguration) WithSystem(value string) *ScaleIOVolumeSourceApplyConfiguration { + b.System = &value + return b +} + +// WithSecretRef sets the SecretRef field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SecretRef field is set to the value of the last call. +func (b *ScaleIOVolumeSourceApplyConfiguration) WithSecretRef(value *LocalObjectReferenceApplyConfiguration) *ScaleIOVolumeSourceApplyConfiguration { + b.SecretRef = value + return b +} + +// WithSSLEnabled sets the SSLEnabled field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SSLEnabled field is set to the value of the last call. +func (b *ScaleIOVolumeSourceApplyConfiguration) WithSSLEnabled(value bool) *ScaleIOVolumeSourceApplyConfiguration { + b.SSLEnabled = &value + return b +} + +// WithProtectionDomain sets the ProtectionDomain field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ProtectionDomain field is set to the value of the last call. +func (b *ScaleIOVolumeSourceApplyConfiguration) WithProtectionDomain(value string) *ScaleIOVolumeSourceApplyConfiguration { + b.ProtectionDomain = &value + return b +} + +// WithStoragePool sets the StoragePool field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the StoragePool field is set to the value of the last call. +func (b *ScaleIOVolumeSourceApplyConfiguration) WithStoragePool(value string) *ScaleIOVolumeSourceApplyConfiguration { + b.StoragePool = &value + return b +} + +// WithStorageMode sets the StorageMode field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the StorageMode field is set to the value of the last call. +func (b *ScaleIOVolumeSourceApplyConfiguration) WithStorageMode(value string) *ScaleIOVolumeSourceApplyConfiguration { + b.StorageMode = &value + return b +} + +// WithVolumeName sets the VolumeName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the VolumeName field is set to the value of the last call. +func (b *ScaleIOVolumeSourceApplyConfiguration) WithVolumeName(value string) *ScaleIOVolumeSourceApplyConfiguration { + b.VolumeName = &value + return b +} + +// WithFSType sets the FSType field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FSType field is set to the value of the last call. +func (b *ScaleIOVolumeSourceApplyConfiguration) WithFSType(value string) *ScaleIOVolumeSourceApplyConfiguration { + b.FSType = &value + return b +} + +// WithReadOnly sets the ReadOnly field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadOnly field is set to the value of the last call. +func (b *ScaleIOVolumeSourceApplyConfiguration) WithReadOnly(value bool) *ScaleIOVolumeSourceApplyConfiguration { + b.ReadOnly = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/scopedresourceselectorrequirement.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/scopedresourceselectorrequirement.go new file mode 100644 index 000000000000..c901a2ae6d21 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/scopedresourceselectorrequirement.go @@ -0,0 +1,63 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/core/v1" +) + +// ScopedResourceSelectorRequirementApplyConfiguration represents an declarative configuration of the ScopedResourceSelectorRequirement type for use +// with apply. +type ScopedResourceSelectorRequirementApplyConfiguration struct { + ScopeName *v1.ResourceQuotaScope `json:"scopeName,omitempty"` + Operator *v1.ScopeSelectorOperator `json:"operator,omitempty"` + Values []string `json:"values,omitempty"` +} + +// ScopedResourceSelectorRequirementApplyConfiguration constructs an declarative configuration of the ScopedResourceSelectorRequirement type for use with +// apply. +func ScopedResourceSelectorRequirement() *ScopedResourceSelectorRequirementApplyConfiguration { + return &ScopedResourceSelectorRequirementApplyConfiguration{} +} + +// WithScopeName sets the ScopeName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ScopeName field is set to the value of the last call. +func (b *ScopedResourceSelectorRequirementApplyConfiguration) WithScopeName(value v1.ResourceQuotaScope) *ScopedResourceSelectorRequirementApplyConfiguration { + b.ScopeName = &value + return b +} + +// WithOperator sets the Operator field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Operator field is set to the value of the last call. +func (b *ScopedResourceSelectorRequirementApplyConfiguration) WithOperator(value v1.ScopeSelectorOperator) *ScopedResourceSelectorRequirementApplyConfiguration { + b.Operator = &value + return b +} + +// WithValues adds the given value to the Values field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Values field. +func (b *ScopedResourceSelectorRequirementApplyConfiguration) WithValues(values ...string) *ScopedResourceSelectorRequirementApplyConfiguration { + for i := range values { + b.Values = append(b.Values, values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/scopeselector.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/scopeselector.go new file mode 100644 index 000000000000..3251e9dc1845 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/scopeselector.go @@ -0,0 +1,44 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// ScopeSelectorApplyConfiguration represents an declarative configuration of the ScopeSelector type for use +// with apply. +type ScopeSelectorApplyConfiguration struct { + MatchExpressions []ScopedResourceSelectorRequirementApplyConfiguration `json:"matchExpressions,omitempty"` +} + +// ScopeSelectorApplyConfiguration constructs an declarative configuration of the ScopeSelector type for use with +// apply. +func ScopeSelector() *ScopeSelectorApplyConfiguration { + return &ScopeSelectorApplyConfiguration{} +} + +// WithMatchExpressions adds the given value to the MatchExpressions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the MatchExpressions field. +func (b *ScopeSelectorApplyConfiguration) WithMatchExpressions(values ...*ScopedResourceSelectorRequirementApplyConfiguration) *ScopeSelectorApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithMatchExpressions") + } + b.MatchExpressions = append(b.MatchExpressions, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/seccompprofile.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/seccompprofile.go new file mode 100644 index 000000000000..9818a00e7a4c --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/seccompprofile.go @@ -0,0 +1,52 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/core/v1" +) + +// SeccompProfileApplyConfiguration represents an declarative configuration of the SeccompProfile type for use +// with apply. +type SeccompProfileApplyConfiguration struct { + Type *v1.SeccompProfileType `json:"type,omitempty"` + LocalhostProfile *string `json:"localhostProfile,omitempty"` +} + +// SeccompProfileApplyConfiguration constructs an declarative configuration of the SeccompProfile type for use with +// apply. +func SeccompProfile() *SeccompProfileApplyConfiguration { + return &SeccompProfileApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *SeccompProfileApplyConfiguration) WithType(value v1.SeccompProfileType) *SeccompProfileApplyConfiguration { + b.Type = &value + return b +} + +// WithLocalhostProfile sets the LocalhostProfile field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LocalhostProfile field is set to the value of the last call. +func (b *SeccompProfileApplyConfiguration) WithLocalhostProfile(value string) *SeccompProfileApplyConfiguration { + b.LocalhostProfile = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/secret.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/secret.go new file mode 100644 index 000000000000..7fd2aa9360f0 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/secret.go @@ -0,0 +1,295 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// SecretApplyConfiguration represents an declarative configuration of the Secret type for use +// with apply. +type SecretApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Immutable *bool `json:"immutable,omitempty"` + Data map[string][]byte `json:"data,omitempty"` + StringData map[string]string `json:"stringData,omitempty"` + Type *corev1.SecretType `json:"type,omitempty"` +} + +// Secret constructs an declarative configuration of the Secret type for use with +// apply. +func Secret(name, namespace string) *SecretApplyConfiguration { + b := &SecretApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("Secret") + b.WithAPIVersion("v1") + return b +} + +// ExtractSecret extracts the applied configuration owned by fieldManager from +// secret. If no managedFields are found in secret for fieldManager, a +// SecretApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// secret must be a unmodified Secret API object that was retrieved from the Kubernetes API. +// ExtractSecret provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractSecret(secret *corev1.Secret, fieldManager string) (*SecretApplyConfiguration, error) { + b := &SecretApplyConfiguration{} + err := managedfields.ExtractInto(secret, internal.Parser().Type("io.k8s.api.core.v1.Secret"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(secret.Name) + b.WithNamespace(secret.Namespace) + + b.WithKind("Secret") + b.WithAPIVersion("v1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *SecretApplyConfiguration) WithKind(value string) *SecretApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *SecretApplyConfiguration) WithAPIVersion(value string) *SecretApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *SecretApplyConfiguration) WithName(value string) *SecretApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *SecretApplyConfiguration) WithGenerateName(value string) *SecretApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *SecretApplyConfiguration) WithNamespace(value string) *SecretApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *SecretApplyConfiguration) WithSelfLink(value string) *SecretApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *SecretApplyConfiguration) WithUID(value types.UID) *SecretApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *SecretApplyConfiguration) WithResourceVersion(value string) *SecretApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *SecretApplyConfiguration) WithGeneration(value int64) *SecretApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *SecretApplyConfiguration) WithCreationTimestamp(value metav1.Time) *SecretApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *SecretApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *SecretApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *SecretApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *SecretApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *SecretApplyConfiguration) WithLabels(entries map[string]string) *SecretApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *SecretApplyConfiguration) WithAnnotations(entries map[string]string) *SecretApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *SecretApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *SecretApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *SecretApplyConfiguration) WithFinalizers(values ...string) *SecretApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *SecretApplyConfiguration) WithClusterName(value string) *SecretApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *SecretApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithImmutable sets the Immutable field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Immutable field is set to the value of the last call. +func (b *SecretApplyConfiguration) WithImmutable(value bool) *SecretApplyConfiguration { + b.Immutable = &value + return b +} + +// WithData puts the entries into the Data field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Data field, +// overwriting an existing map entries in Data field with the same key. +func (b *SecretApplyConfiguration) WithData(entries map[string][]byte) *SecretApplyConfiguration { + if b.Data == nil && len(entries) > 0 { + b.Data = make(map[string][]byte, len(entries)) + } + for k, v := range entries { + b.Data[k] = v + } + return b +} + +// WithStringData puts the entries into the StringData field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the StringData field, +// overwriting an existing map entries in StringData field with the same key. +func (b *SecretApplyConfiguration) WithStringData(entries map[string]string) *SecretApplyConfiguration { + if b.StringData == nil && len(entries) > 0 { + b.StringData = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.StringData[k] = v + } + return b +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *SecretApplyConfiguration) WithType(value corev1.SecretType) *SecretApplyConfiguration { + b.Type = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/secretenvsource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/secretenvsource.go new file mode 100644 index 000000000000..7b22a8d0b285 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/secretenvsource.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// SecretEnvSourceApplyConfiguration represents an declarative configuration of the SecretEnvSource type for use +// with apply. +type SecretEnvSourceApplyConfiguration struct { + LocalObjectReferenceApplyConfiguration `json:",inline"` + Optional *bool `json:"optional,omitempty"` +} + +// SecretEnvSourceApplyConfiguration constructs an declarative configuration of the SecretEnvSource type for use with +// apply. +func SecretEnvSource() *SecretEnvSourceApplyConfiguration { + return &SecretEnvSourceApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *SecretEnvSourceApplyConfiguration) WithName(value string) *SecretEnvSourceApplyConfiguration { + b.Name = &value + return b +} + +// WithOptional sets the Optional field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Optional field is set to the value of the last call. +func (b *SecretEnvSourceApplyConfiguration) WithOptional(value bool) *SecretEnvSourceApplyConfiguration { + b.Optional = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/secretkeyselector.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/secretkeyselector.go new file mode 100644 index 000000000000..b8464a348a92 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/secretkeyselector.go @@ -0,0 +1,57 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// SecretKeySelectorApplyConfiguration represents an declarative configuration of the SecretKeySelector type for use +// with apply. +type SecretKeySelectorApplyConfiguration struct { + LocalObjectReferenceApplyConfiguration `json:",inline"` + Key *string `json:"key,omitempty"` + Optional *bool `json:"optional,omitempty"` +} + +// SecretKeySelectorApplyConfiguration constructs an declarative configuration of the SecretKeySelector type for use with +// apply. +func SecretKeySelector() *SecretKeySelectorApplyConfiguration { + return &SecretKeySelectorApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *SecretKeySelectorApplyConfiguration) WithName(value string) *SecretKeySelectorApplyConfiguration { + b.Name = &value + return b +} + +// WithKey sets the Key field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Key field is set to the value of the last call. +func (b *SecretKeySelectorApplyConfiguration) WithKey(value string) *SecretKeySelectorApplyConfiguration { + b.Key = &value + return b +} + +// WithOptional sets the Optional field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Optional field is set to the value of the last call. +func (b *SecretKeySelectorApplyConfiguration) WithOptional(value bool) *SecretKeySelectorApplyConfiguration { + b.Optional = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/secretprojection.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/secretprojection.go new file mode 100644 index 000000000000..e8edc61273bb --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/secretprojection.go @@ -0,0 +1,62 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// SecretProjectionApplyConfiguration represents an declarative configuration of the SecretProjection type for use +// with apply. +type SecretProjectionApplyConfiguration struct { + LocalObjectReferenceApplyConfiguration `json:",inline"` + Items []KeyToPathApplyConfiguration `json:"items,omitempty"` + Optional *bool `json:"optional,omitempty"` +} + +// SecretProjectionApplyConfiguration constructs an declarative configuration of the SecretProjection type for use with +// apply. +func SecretProjection() *SecretProjectionApplyConfiguration { + return &SecretProjectionApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *SecretProjectionApplyConfiguration) WithName(value string) *SecretProjectionApplyConfiguration { + b.Name = &value + return b +} + +// WithItems adds the given value to the Items field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Items field. +func (b *SecretProjectionApplyConfiguration) WithItems(values ...*KeyToPathApplyConfiguration) *SecretProjectionApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithItems") + } + b.Items = append(b.Items, *values[i]) + } + return b +} + +// WithOptional sets the Optional field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Optional field is set to the value of the last call. +func (b *SecretProjectionApplyConfiguration) WithOptional(value bool) *SecretProjectionApplyConfiguration { + b.Optional = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/secretreference.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/secretreference.go new file mode 100644 index 000000000000..95579d003e45 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/secretreference.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// SecretReferenceApplyConfiguration represents an declarative configuration of the SecretReference type for use +// with apply. +type SecretReferenceApplyConfiguration struct { + Name *string `json:"name,omitempty"` + Namespace *string `json:"namespace,omitempty"` +} + +// SecretReferenceApplyConfiguration constructs an declarative configuration of the SecretReference type for use with +// apply. +func SecretReference() *SecretReferenceApplyConfiguration { + return &SecretReferenceApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *SecretReferenceApplyConfiguration) WithName(value string) *SecretReferenceApplyConfiguration { + b.Name = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *SecretReferenceApplyConfiguration) WithNamespace(value string) *SecretReferenceApplyConfiguration { + b.Namespace = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/secretvolumesource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/secretvolumesource.go new file mode 100644 index 000000000000..bcb441e9f301 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/secretvolumesource.go @@ -0,0 +1,71 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// SecretVolumeSourceApplyConfiguration represents an declarative configuration of the SecretVolumeSource type for use +// with apply. +type SecretVolumeSourceApplyConfiguration struct { + SecretName *string `json:"secretName,omitempty"` + Items []KeyToPathApplyConfiguration `json:"items,omitempty"` + DefaultMode *int32 `json:"defaultMode,omitempty"` + Optional *bool `json:"optional,omitempty"` +} + +// SecretVolumeSourceApplyConfiguration constructs an declarative configuration of the SecretVolumeSource type for use with +// apply. +func SecretVolumeSource() *SecretVolumeSourceApplyConfiguration { + return &SecretVolumeSourceApplyConfiguration{} +} + +// WithSecretName sets the SecretName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SecretName field is set to the value of the last call. +func (b *SecretVolumeSourceApplyConfiguration) WithSecretName(value string) *SecretVolumeSourceApplyConfiguration { + b.SecretName = &value + return b +} + +// WithItems adds the given value to the Items field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Items field. +func (b *SecretVolumeSourceApplyConfiguration) WithItems(values ...*KeyToPathApplyConfiguration) *SecretVolumeSourceApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithItems") + } + b.Items = append(b.Items, *values[i]) + } + return b +} + +// WithDefaultMode sets the DefaultMode field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DefaultMode field is set to the value of the last call. +func (b *SecretVolumeSourceApplyConfiguration) WithDefaultMode(value int32) *SecretVolumeSourceApplyConfiguration { + b.DefaultMode = &value + return b +} + +// WithOptional sets the Optional field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Optional field is set to the value of the last call. +func (b *SecretVolumeSourceApplyConfiguration) WithOptional(value bool) *SecretVolumeSourceApplyConfiguration { + b.Optional = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/securitycontext.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/securitycontext.go new file mode 100644 index 000000000000..8f01537eb37b --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/securitycontext.go @@ -0,0 +1,133 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + corev1 "k8s.io/api/core/v1" +) + +// SecurityContextApplyConfiguration represents an declarative configuration of the SecurityContext type for use +// with apply. +type SecurityContextApplyConfiguration struct { + Capabilities *CapabilitiesApplyConfiguration `json:"capabilities,omitempty"` + Privileged *bool `json:"privileged,omitempty"` + SELinuxOptions *SELinuxOptionsApplyConfiguration `json:"seLinuxOptions,omitempty"` + WindowsOptions *WindowsSecurityContextOptionsApplyConfiguration `json:"windowsOptions,omitempty"` + RunAsUser *int64 `json:"runAsUser,omitempty"` + RunAsGroup *int64 `json:"runAsGroup,omitempty"` + RunAsNonRoot *bool `json:"runAsNonRoot,omitempty"` + ReadOnlyRootFilesystem *bool `json:"readOnlyRootFilesystem,omitempty"` + AllowPrivilegeEscalation *bool `json:"allowPrivilegeEscalation,omitempty"` + ProcMount *corev1.ProcMountType `json:"procMount,omitempty"` + SeccompProfile *SeccompProfileApplyConfiguration `json:"seccompProfile,omitempty"` +} + +// SecurityContextApplyConfiguration constructs an declarative configuration of the SecurityContext type for use with +// apply. +func SecurityContext() *SecurityContextApplyConfiguration { + return &SecurityContextApplyConfiguration{} +} + +// WithCapabilities sets the Capabilities field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Capabilities field is set to the value of the last call. +func (b *SecurityContextApplyConfiguration) WithCapabilities(value *CapabilitiesApplyConfiguration) *SecurityContextApplyConfiguration { + b.Capabilities = value + return b +} + +// WithPrivileged sets the Privileged field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Privileged field is set to the value of the last call. +func (b *SecurityContextApplyConfiguration) WithPrivileged(value bool) *SecurityContextApplyConfiguration { + b.Privileged = &value + return b +} + +// WithSELinuxOptions sets the SELinuxOptions field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SELinuxOptions field is set to the value of the last call. +func (b *SecurityContextApplyConfiguration) WithSELinuxOptions(value *SELinuxOptionsApplyConfiguration) *SecurityContextApplyConfiguration { + b.SELinuxOptions = value + return b +} + +// WithWindowsOptions sets the WindowsOptions field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the WindowsOptions field is set to the value of the last call. +func (b *SecurityContextApplyConfiguration) WithWindowsOptions(value *WindowsSecurityContextOptionsApplyConfiguration) *SecurityContextApplyConfiguration { + b.WindowsOptions = value + return b +} + +// WithRunAsUser sets the RunAsUser field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RunAsUser field is set to the value of the last call. +func (b *SecurityContextApplyConfiguration) WithRunAsUser(value int64) *SecurityContextApplyConfiguration { + b.RunAsUser = &value + return b +} + +// WithRunAsGroup sets the RunAsGroup field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RunAsGroup field is set to the value of the last call. +func (b *SecurityContextApplyConfiguration) WithRunAsGroup(value int64) *SecurityContextApplyConfiguration { + b.RunAsGroup = &value + return b +} + +// WithRunAsNonRoot sets the RunAsNonRoot field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RunAsNonRoot field is set to the value of the last call. +func (b *SecurityContextApplyConfiguration) WithRunAsNonRoot(value bool) *SecurityContextApplyConfiguration { + b.RunAsNonRoot = &value + return b +} + +// WithReadOnlyRootFilesystem sets the ReadOnlyRootFilesystem field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadOnlyRootFilesystem field is set to the value of the last call. +func (b *SecurityContextApplyConfiguration) WithReadOnlyRootFilesystem(value bool) *SecurityContextApplyConfiguration { + b.ReadOnlyRootFilesystem = &value + return b +} + +// WithAllowPrivilegeEscalation sets the AllowPrivilegeEscalation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AllowPrivilegeEscalation field is set to the value of the last call. +func (b *SecurityContextApplyConfiguration) WithAllowPrivilegeEscalation(value bool) *SecurityContextApplyConfiguration { + b.AllowPrivilegeEscalation = &value + return b +} + +// WithProcMount sets the ProcMount field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ProcMount field is set to the value of the last call. +func (b *SecurityContextApplyConfiguration) WithProcMount(value corev1.ProcMountType) *SecurityContextApplyConfiguration { + b.ProcMount = &value + return b +} + +// WithSeccompProfile sets the SeccompProfile field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SeccompProfile field is set to the value of the last call. +func (b *SecurityContextApplyConfiguration) WithSeccompProfile(value *SeccompProfileApplyConfiguration) *SecurityContextApplyConfiguration { + b.SeccompProfile = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/selinuxoptions.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/selinuxoptions.go new file mode 100644 index 000000000000..2938faa18ef3 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/selinuxoptions.go @@ -0,0 +1,66 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// SELinuxOptionsApplyConfiguration represents an declarative configuration of the SELinuxOptions type for use +// with apply. +type SELinuxOptionsApplyConfiguration struct { + User *string `json:"user,omitempty"` + Role *string `json:"role,omitempty"` + Type *string `json:"type,omitempty"` + Level *string `json:"level,omitempty"` +} + +// SELinuxOptionsApplyConfiguration constructs an declarative configuration of the SELinuxOptions type for use with +// apply. +func SELinuxOptions() *SELinuxOptionsApplyConfiguration { + return &SELinuxOptionsApplyConfiguration{} +} + +// WithUser sets the User field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the User field is set to the value of the last call. +func (b *SELinuxOptionsApplyConfiguration) WithUser(value string) *SELinuxOptionsApplyConfiguration { + b.User = &value + return b +} + +// WithRole sets the Role field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Role field is set to the value of the last call. +func (b *SELinuxOptionsApplyConfiguration) WithRole(value string) *SELinuxOptionsApplyConfiguration { + b.Role = &value + return b +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *SELinuxOptionsApplyConfiguration) WithType(value string) *SELinuxOptionsApplyConfiguration { + b.Type = &value + return b +} + +// WithLevel sets the Level field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Level field is set to the value of the last call. +func (b *SELinuxOptionsApplyConfiguration) WithLevel(value string) *SELinuxOptionsApplyConfiguration { + b.Level = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/service.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/service.go new file mode 100644 index 000000000000..38c439559328 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/service.go @@ -0,0 +1,265 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + apicorev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// ServiceApplyConfiguration represents an declarative configuration of the Service type for use +// with apply. +type ServiceApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *ServiceSpecApplyConfiguration `json:"spec,omitempty"` + Status *ServiceStatusApplyConfiguration `json:"status,omitempty"` +} + +// Service constructs an declarative configuration of the Service type for use with +// apply. +func Service(name, namespace string) *ServiceApplyConfiguration { + b := &ServiceApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("Service") + b.WithAPIVersion("v1") + return b +} + +// ExtractService extracts the applied configuration owned by fieldManager from +// service. If no managedFields are found in service for fieldManager, a +// ServiceApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// service must be a unmodified Service API object that was retrieved from the Kubernetes API. +// ExtractService provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractService(service *apicorev1.Service, fieldManager string) (*ServiceApplyConfiguration, error) { + b := &ServiceApplyConfiguration{} + err := managedfields.ExtractInto(service, internal.Parser().Type("io.k8s.api.core.v1.Service"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(service.Name) + b.WithNamespace(service.Namespace) + + b.WithKind("Service") + b.WithAPIVersion("v1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *ServiceApplyConfiguration) WithKind(value string) *ServiceApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *ServiceApplyConfiguration) WithAPIVersion(value string) *ServiceApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ServiceApplyConfiguration) WithName(value string) *ServiceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *ServiceApplyConfiguration) WithGenerateName(value string) *ServiceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *ServiceApplyConfiguration) WithNamespace(value string) *ServiceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *ServiceApplyConfiguration) WithSelfLink(value string) *ServiceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *ServiceApplyConfiguration) WithUID(value types.UID) *ServiceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *ServiceApplyConfiguration) WithResourceVersion(value string) *ServiceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *ServiceApplyConfiguration) WithGeneration(value int64) *ServiceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *ServiceApplyConfiguration) WithCreationTimestamp(value metav1.Time) *ServiceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *ServiceApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *ServiceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *ServiceApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *ServiceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *ServiceApplyConfiguration) WithLabels(entries map[string]string) *ServiceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *ServiceApplyConfiguration) WithAnnotations(entries map[string]string) *ServiceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *ServiceApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *ServiceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *ServiceApplyConfiguration) WithFinalizers(values ...string) *ServiceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *ServiceApplyConfiguration) WithClusterName(value string) *ServiceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *ServiceApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *ServiceApplyConfiguration) WithSpec(value *ServiceSpecApplyConfiguration) *ServiceApplyConfiguration { + b.Spec = value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *ServiceApplyConfiguration) WithStatus(value *ServiceStatusApplyConfiguration) *ServiceApplyConfiguration { + b.Status = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/serviceaccount.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/serviceaccount.go new file mode 100644 index 000000000000..46983e4a7b42 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/serviceaccount.go @@ -0,0 +1,284 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + apicorev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// ServiceAccountApplyConfiguration represents an declarative configuration of the ServiceAccount type for use +// with apply. +type ServiceAccountApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Secrets []ObjectReferenceApplyConfiguration `json:"secrets,omitempty"` + ImagePullSecrets []LocalObjectReferenceApplyConfiguration `json:"imagePullSecrets,omitempty"` + AutomountServiceAccountToken *bool `json:"automountServiceAccountToken,omitempty"` +} + +// ServiceAccount constructs an declarative configuration of the ServiceAccount type for use with +// apply. +func ServiceAccount(name, namespace string) *ServiceAccountApplyConfiguration { + b := &ServiceAccountApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("ServiceAccount") + b.WithAPIVersion("v1") + return b +} + +// ExtractServiceAccount extracts the applied configuration owned by fieldManager from +// serviceAccount. If no managedFields are found in serviceAccount for fieldManager, a +// ServiceAccountApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// serviceAccount must be a unmodified ServiceAccount API object that was retrieved from the Kubernetes API. +// ExtractServiceAccount provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractServiceAccount(serviceAccount *apicorev1.ServiceAccount, fieldManager string) (*ServiceAccountApplyConfiguration, error) { + b := &ServiceAccountApplyConfiguration{} + err := managedfields.ExtractInto(serviceAccount, internal.Parser().Type("io.k8s.api.core.v1.ServiceAccount"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(serviceAccount.Name) + b.WithNamespace(serviceAccount.Namespace) + + b.WithKind("ServiceAccount") + b.WithAPIVersion("v1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *ServiceAccountApplyConfiguration) WithKind(value string) *ServiceAccountApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *ServiceAccountApplyConfiguration) WithAPIVersion(value string) *ServiceAccountApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ServiceAccountApplyConfiguration) WithName(value string) *ServiceAccountApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *ServiceAccountApplyConfiguration) WithGenerateName(value string) *ServiceAccountApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *ServiceAccountApplyConfiguration) WithNamespace(value string) *ServiceAccountApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *ServiceAccountApplyConfiguration) WithSelfLink(value string) *ServiceAccountApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *ServiceAccountApplyConfiguration) WithUID(value types.UID) *ServiceAccountApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *ServiceAccountApplyConfiguration) WithResourceVersion(value string) *ServiceAccountApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *ServiceAccountApplyConfiguration) WithGeneration(value int64) *ServiceAccountApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *ServiceAccountApplyConfiguration) WithCreationTimestamp(value metav1.Time) *ServiceAccountApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *ServiceAccountApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *ServiceAccountApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *ServiceAccountApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *ServiceAccountApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *ServiceAccountApplyConfiguration) WithLabels(entries map[string]string) *ServiceAccountApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *ServiceAccountApplyConfiguration) WithAnnotations(entries map[string]string) *ServiceAccountApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *ServiceAccountApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *ServiceAccountApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *ServiceAccountApplyConfiguration) WithFinalizers(values ...string) *ServiceAccountApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *ServiceAccountApplyConfiguration) WithClusterName(value string) *ServiceAccountApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *ServiceAccountApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSecrets adds the given value to the Secrets field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Secrets field. +func (b *ServiceAccountApplyConfiguration) WithSecrets(values ...*ObjectReferenceApplyConfiguration) *ServiceAccountApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithSecrets") + } + b.Secrets = append(b.Secrets, *values[i]) + } + return b +} + +// WithImagePullSecrets adds the given value to the ImagePullSecrets field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the ImagePullSecrets field. +func (b *ServiceAccountApplyConfiguration) WithImagePullSecrets(values ...*LocalObjectReferenceApplyConfiguration) *ServiceAccountApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithImagePullSecrets") + } + b.ImagePullSecrets = append(b.ImagePullSecrets, *values[i]) + } + return b +} + +// WithAutomountServiceAccountToken sets the AutomountServiceAccountToken field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AutomountServiceAccountToken field is set to the value of the last call. +func (b *ServiceAccountApplyConfiguration) WithAutomountServiceAccountToken(value bool) *ServiceAccountApplyConfiguration { + b.AutomountServiceAccountToken = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/serviceaccounttokenprojection.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/serviceaccounttokenprojection.go new file mode 100644 index 000000000000..a52fad7d8dad --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/serviceaccounttokenprojection.go @@ -0,0 +1,57 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// ServiceAccountTokenProjectionApplyConfiguration represents an declarative configuration of the ServiceAccountTokenProjection type for use +// with apply. +type ServiceAccountTokenProjectionApplyConfiguration struct { + Audience *string `json:"audience,omitempty"` + ExpirationSeconds *int64 `json:"expirationSeconds,omitempty"` + Path *string `json:"path,omitempty"` +} + +// ServiceAccountTokenProjectionApplyConfiguration constructs an declarative configuration of the ServiceAccountTokenProjection type for use with +// apply. +func ServiceAccountTokenProjection() *ServiceAccountTokenProjectionApplyConfiguration { + return &ServiceAccountTokenProjectionApplyConfiguration{} +} + +// WithAudience sets the Audience field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Audience field is set to the value of the last call. +func (b *ServiceAccountTokenProjectionApplyConfiguration) WithAudience(value string) *ServiceAccountTokenProjectionApplyConfiguration { + b.Audience = &value + return b +} + +// WithExpirationSeconds sets the ExpirationSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ExpirationSeconds field is set to the value of the last call. +func (b *ServiceAccountTokenProjectionApplyConfiguration) WithExpirationSeconds(value int64) *ServiceAccountTokenProjectionApplyConfiguration { + b.ExpirationSeconds = &value + return b +} + +// WithPath sets the Path field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Path field is set to the value of the last call. +func (b *ServiceAccountTokenProjectionApplyConfiguration) WithPath(value string) *ServiceAccountTokenProjectionApplyConfiguration { + b.Path = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/serviceport.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/serviceport.go new file mode 100644 index 000000000000..8bc63bd950a8 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/serviceport.go @@ -0,0 +1,89 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/core/v1" + intstr "k8s.io/apimachinery/pkg/util/intstr" +) + +// ServicePortApplyConfiguration represents an declarative configuration of the ServicePort type for use +// with apply. +type ServicePortApplyConfiguration struct { + Name *string `json:"name,omitempty"` + Protocol *v1.Protocol `json:"protocol,omitempty"` + AppProtocol *string `json:"appProtocol,omitempty"` + Port *int32 `json:"port,omitempty"` + TargetPort *intstr.IntOrString `json:"targetPort,omitempty"` + NodePort *int32 `json:"nodePort,omitempty"` +} + +// ServicePortApplyConfiguration constructs an declarative configuration of the ServicePort type for use with +// apply. +func ServicePort() *ServicePortApplyConfiguration { + return &ServicePortApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ServicePortApplyConfiguration) WithName(value string) *ServicePortApplyConfiguration { + b.Name = &value + return b +} + +// WithProtocol sets the Protocol field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Protocol field is set to the value of the last call. +func (b *ServicePortApplyConfiguration) WithProtocol(value v1.Protocol) *ServicePortApplyConfiguration { + b.Protocol = &value + return b +} + +// WithAppProtocol sets the AppProtocol field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AppProtocol field is set to the value of the last call. +func (b *ServicePortApplyConfiguration) WithAppProtocol(value string) *ServicePortApplyConfiguration { + b.AppProtocol = &value + return b +} + +// WithPort sets the Port field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Port field is set to the value of the last call. +func (b *ServicePortApplyConfiguration) WithPort(value int32) *ServicePortApplyConfiguration { + b.Port = &value + return b +} + +// WithTargetPort sets the TargetPort field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the TargetPort field is set to the value of the last call. +func (b *ServicePortApplyConfiguration) WithTargetPort(value intstr.IntOrString) *ServicePortApplyConfiguration { + b.TargetPort = &value + return b +} + +// WithNodePort sets the NodePort field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NodePort field is set to the value of the last call. +func (b *ServicePortApplyConfiguration) WithNodePort(value int32) *ServicePortApplyConfiguration { + b.NodePort = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/servicespec.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/servicespec.go new file mode 100644 index 000000000000..99361cecf067 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/servicespec.go @@ -0,0 +1,235 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + corev1 "k8s.io/api/core/v1" +) + +// ServiceSpecApplyConfiguration represents an declarative configuration of the ServiceSpec type for use +// with apply. +type ServiceSpecApplyConfiguration struct { + Ports []ServicePortApplyConfiguration `json:"ports,omitempty"` + Selector map[string]string `json:"selector,omitempty"` + ClusterIP *string `json:"clusterIP,omitempty"` + ClusterIPs []string `json:"clusterIPs,omitempty"` + Type *corev1.ServiceType `json:"type,omitempty"` + ExternalIPs []string `json:"externalIPs,omitempty"` + SessionAffinity *corev1.ServiceAffinity `json:"sessionAffinity,omitempty"` + LoadBalancerIP *string `json:"loadBalancerIP,omitempty"` + LoadBalancerSourceRanges []string `json:"loadBalancerSourceRanges,omitempty"` + ExternalName *string `json:"externalName,omitempty"` + ExternalTrafficPolicy *corev1.ServiceExternalTrafficPolicyType `json:"externalTrafficPolicy,omitempty"` + HealthCheckNodePort *int32 `json:"healthCheckNodePort,omitempty"` + PublishNotReadyAddresses *bool `json:"publishNotReadyAddresses,omitempty"` + SessionAffinityConfig *SessionAffinityConfigApplyConfiguration `json:"sessionAffinityConfig,omitempty"` + TopologyKeys []string `json:"topologyKeys,omitempty"` + IPFamilies []corev1.IPFamily `json:"ipFamilies,omitempty"` + IPFamilyPolicy *corev1.IPFamilyPolicyType `json:"ipFamilyPolicy,omitempty"` + AllocateLoadBalancerNodePorts *bool `json:"allocateLoadBalancerNodePorts,omitempty"` + LoadBalancerClass *string `json:"loadBalancerClass,omitempty"` + InternalTrafficPolicy *corev1.ServiceInternalTrafficPolicyType `json:"internalTrafficPolicy,omitempty"` +} + +// ServiceSpecApplyConfiguration constructs an declarative configuration of the ServiceSpec type for use with +// apply. +func ServiceSpec() *ServiceSpecApplyConfiguration { + return &ServiceSpecApplyConfiguration{} +} + +// WithPorts adds the given value to the Ports field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Ports field. +func (b *ServiceSpecApplyConfiguration) WithPorts(values ...*ServicePortApplyConfiguration) *ServiceSpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithPorts") + } + b.Ports = append(b.Ports, *values[i]) + } + return b +} + +// WithSelector puts the entries into the Selector field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Selector field, +// overwriting an existing map entries in Selector field with the same key. +func (b *ServiceSpecApplyConfiguration) WithSelector(entries map[string]string) *ServiceSpecApplyConfiguration { + if b.Selector == nil && len(entries) > 0 { + b.Selector = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Selector[k] = v + } + return b +} + +// WithClusterIP sets the ClusterIP field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterIP field is set to the value of the last call. +func (b *ServiceSpecApplyConfiguration) WithClusterIP(value string) *ServiceSpecApplyConfiguration { + b.ClusterIP = &value + return b +} + +// WithClusterIPs adds the given value to the ClusterIPs field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the ClusterIPs field. +func (b *ServiceSpecApplyConfiguration) WithClusterIPs(values ...string) *ServiceSpecApplyConfiguration { + for i := range values { + b.ClusterIPs = append(b.ClusterIPs, values[i]) + } + return b +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *ServiceSpecApplyConfiguration) WithType(value corev1.ServiceType) *ServiceSpecApplyConfiguration { + b.Type = &value + return b +} + +// WithExternalIPs adds the given value to the ExternalIPs field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the ExternalIPs field. +func (b *ServiceSpecApplyConfiguration) WithExternalIPs(values ...string) *ServiceSpecApplyConfiguration { + for i := range values { + b.ExternalIPs = append(b.ExternalIPs, values[i]) + } + return b +} + +// WithSessionAffinity sets the SessionAffinity field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SessionAffinity field is set to the value of the last call. +func (b *ServiceSpecApplyConfiguration) WithSessionAffinity(value corev1.ServiceAffinity) *ServiceSpecApplyConfiguration { + b.SessionAffinity = &value + return b +} + +// WithLoadBalancerIP sets the LoadBalancerIP field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LoadBalancerIP field is set to the value of the last call. +func (b *ServiceSpecApplyConfiguration) WithLoadBalancerIP(value string) *ServiceSpecApplyConfiguration { + b.LoadBalancerIP = &value + return b +} + +// WithLoadBalancerSourceRanges adds the given value to the LoadBalancerSourceRanges field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the LoadBalancerSourceRanges field. +func (b *ServiceSpecApplyConfiguration) WithLoadBalancerSourceRanges(values ...string) *ServiceSpecApplyConfiguration { + for i := range values { + b.LoadBalancerSourceRanges = append(b.LoadBalancerSourceRanges, values[i]) + } + return b +} + +// WithExternalName sets the ExternalName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ExternalName field is set to the value of the last call. +func (b *ServiceSpecApplyConfiguration) WithExternalName(value string) *ServiceSpecApplyConfiguration { + b.ExternalName = &value + return b +} + +// WithExternalTrafficPolicy sets the ExternalTrafficPolicy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ExternalTrafficPolicy field is set to the value of the last call. +func (b *ServiceSpecApplyConfiguration) WithExternalTrafficPolicy(value corev1.ServiceExternalTrafficPolicyType) *ServiceSpecApplyConfiguration { + b.ExternalTrafficPolicy = &value + return b +} + +// WithHealthCheckNodePort sets the HealthCheckNodePort field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the HealthCheckNodePort field is set to the value of the last call. +func (b *ServiceSpecApplyConfiguration) WithHealthCheckNodePort(value int32) *ServiceSpecApplyConfiguration { + b.HealthCheckNodePort = &value + return b +} + +// WithPublishNotReadyAddresses sets the PublishNotReadyAddresses field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PublishNotReadyAddresses field is set to the value of the last call. +func (b *ServiceSpecApplyConfiguration) WithPublishNotReadyAddresses(value bool) *ServiceSpecApplyConfiguration { + b.PublishNotReadyAddresses = &value + return b +} + +// WithSessionAffinityConfig sets the SessionAffinityConfig field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SessionAffinityConfig field is set to the value of the last call. +func (b *ServiceSpecApplyConfiguration) WithSessionAffinityConfig(value *SessionAffinityConfigApplyConfiguration) *ServiceSpecApplyConfiguration { + b.SessionAffinityConfig = value + return b +} + +// WithTopologyKeys adds the given value to the TopologyKeys field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the TopologyKeys field. +func (b *ServiceSpecApplyConfiguration) WithTopologyKeys(values ...string) *ServiceSpecApplyConfiguration { + for i := range values { + b.TopologyKeys = append(b.TopologyKeys, values[i]) + } + return b +} + +// WithIPFamilies adds the given value to the IPFamilies field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the IPFamilies field. +func (b *ServiceSpecApplyConfiguration) WithIPFamilies(values ...corev1.IPFamily) *ServiceSpecApplyConfiguration { + for i := range values { + b.IPFamilies = append(b.IPFamilies, values[i]) + } + return b +} + +// WithIPFamilyPolicy sets the IPFamilyPolicy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the IPFamilyPolicy field is set to the value of the last call. +func (b *ServiceSpecApplyConfiguration) WithIPFamilyPolicy(value corev1.IPFamilyPolicyType) *ServiceSpecApplyConfiguration { + b.IPFamilyPolicy = &value + return b +} + +// WithAllocateLoadBalancerNodePorts sets the AllocateLoadBalancerNodePorts field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AllocateLoadBalancerNodePorts field is set to the value of the last call. +func (b *ServiceSpecApplyConfiguration) WithAllocateLoadBalancerNodePorts(value bool) *ServiceSpecApplyConfiguration { + b.AllocateLoadBalancerNodePorts = &value + return b +} + +// WithLoadBalancerClass sets the LoadBalancerClass field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LoadBalancerClass field is set to the value of the last call. +func (b *ServiceSpecApplyConfiguration) WithLoadBalancerClass(value string) *ServiceSpecApplyConfiguration { + b.LoadBalancerClass = &value + return b +} + +// WithInternalTrafficPolicy sets the InternalTrafficPolicy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the InternalTrafficPolicy field is set to the value of the last call. +func (b *ServiceSpecApplyConfiguration) WithInternalTrafficPolicy(value corev1.ServiceInternalTrafficPolicyType) *ServiceSpecApplyConfiguration { + b.InternalTrafficPolicy = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/servicestatus.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/servicestatus.go new file mode 100644 index 000000000000..2347cec678c8 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/servicestatus.go @@ -0,0 +1,57 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + metav1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// ServiceStatusApplyConfiguration represents an declarative configuration of the ServiceStatus type for use +// with apply. +type ServiceStatusApplyConfiguration struct { + LoadBalancer *LoadBalancerStatusApplyConfiguration `json:"loadBalancer,omitempty"` + Conditions []metav1.ConditionApplyConfiguration `json:"conditions,omitempty"` +} + +// ServiceStatusApplyConfiguration constructs an declarative configuration of the ServiceStatus type for use with +// apply. +func ServiceStatus() *ServiceStatusApplyConfiguration { + return &ServiceStatusApplyConfiguration{} +} + +// WithLoadBalancer sets the LoadBalancer field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LoadBalancer field is set to the value of the last call. +func (b *ServiceStatusApplyConfiguration) WithLoadBalancer(value *LoadBalancerStatusApplyConfiguration) *ServiceStatusApplyConfiguration { + b.LoadBalancer = value + return b +} + +// WithConditions adds the given value to the Conditions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Conditions field. +func (b *ServiceStatusApplyConfiguration) WithConditions(values ...*metav1.ConditionApplyConfiguration) *ServiceStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithConditions") + } + b.Conditions = append(b.Conditions, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/sessionaffinityconfig.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/sessionaffinityconfig.go new file mode 100644 index 000000000000..7016f836a1e7 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/sessionaffinityconfig.go @@ -0,0 +1,39 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// SessionAffinityConfigApplyConfiguration represents an declarative configuration of the SessionAffinityConfig type for use +// with apply. +type SessionAffinityConfigApplyConfiguration struct { + ClientIP *ClientIPConfigApplyConfiguration `json:"clientIP,omitempty"` +} + +// SessionAffinityConfigApplyConfiguration constructs an declarative configuration of the SessionAffinityConfig type for use with +// apply. +func SessionAffinityConfig() *SessionAffinityConfigApplyConfiguration { + return &SessionAffinityConfigApplyConfiguration{} +} + +// WithClientIP sets the ClientIP field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClientIP field is set to the value of the last call. +func (b *SessionAffinityConfigApplyConfiguration) WithClientIP(value *ClientIPConfigApplyConfiguration) *SessionAffinityConfigApplyConfiguration { + b.ClientIP = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/storageospersistentvolumesource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/storageospersistentvolumesource.go new file mode 100644 index 000000000000..00ed39ccb0db --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/storageospersistentvolumesource.go @@ -0,0 +1,75 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// StorageOSPersistentVolumeSourceApplyConfiguration represents an declarative configuration of the StorageOSPersistentVolumeSource type for use +// with apply. +type StorageOSPersistentVolumeSourceApplyConfiguration struct { + VolumeName *string `json:"volumeName,omitempty"` + VolumeNamespace *string `json:"volumeNamespace,omitempty"` + FSType *string `json:"fsType,omitempty"` + ReadOnly *bool `json:"readOnly,omitempty"` + SecretRef *ObjectReferenceApplyConfiguration `json:"secretRef,omitempty"` +} + +// StorageOSPersistentVolumeSourceApplyConfiguration constructs an declarative configuration of the StorageOSPersistentVolumeSource type for use with +// apply. +func StorageOSPersistentVolumeSource() *StorageOSPersistentVolumeSourceApplyConfiguration { + return &StorageOSPersistentVolumeSourceApplyConfiguration{} +} + +// WithVolumeName sets the VolumeName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the VolumeName field is set to the value of the last call. +func (b *StorageOSPersistentVolumeSourceApplyConfiguration) WithVolumeName(value string) *StorageOSPersistentVolumeSourceApplyConfiguration { + b.VolumeName = &value + return b +} + +// WithVolumeNamespace sets the VolumeNamespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the VolumeNamespace field is set to the value of the last call. +func (b *StorageOSPersistentVolumeSourceApplyConfiguration) WithVolumeNamespace(value string) *StorageOSPersistentVolumeSourceApplyConfiguration { + b.VolumeNamespace = &value + return b +} + +// WithFSType sets the FSType field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FSType field is set to the value of the last call. +func (b *StorageOSPersistentVolumeSourceApplyConfiguration) WithFSType(value string) *StorageOSPersistentVolumeSourceApplyConfiguration { + b.FSType = &value + return b +} + +// WithReadOnly sets the ReadOnly field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadOnly field is set to the value of the last call. +func (b *StorageOSPersistentVolumeSourceApplyConfiguration) WithReadOnly(value bool) *StorageOSPersistentVolumeSourceApplyConfiguration { + b.ReadOnly = &value + return b +} + +// WithSecretRef sets the SecretRef field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SecretRef field is set to the value of the last call. +func (b *StorageOSPersistentVolumeSourceApplyConfiguration) WithSecretRef(value *ObjectReferenceApplyConfiguration) *StorageOSPersistentVolumeSourceApplyConfiguration { + b.SecretRef = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/storageosvolumesource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/storageosvolumesource.go new file mode 100644 index 000000000000..7f3b810cf669 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/storageosvolumesource.go @@ -0,0 +1,75 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// StorageOSVolumeSourceApplyConfiguration represents an declarative configuration of the StorageOSVolumeSource type for use +// with apply. +type StorageOSVolumeSourceApplyConfiguration struct { + VolumeName *string `json:"volumeName,omitempty"` + VolumeNamespace *string `json:"volumeNamespace,omitempty"` + FSType *string `json:"fsType,omitempty"` + ReadOnly *bool `json:"readOnly,omitempty"` + SecretRef *LocalObjectReferenceApplyConfiguration `json:"secretRef,omitempty"` +} + +// StorageOSVolumeSourceApplyConfiguration constructs an declarative configuration of the StorageOSVolumeSource type for use with +// apply. +func StorageOSVolumeSource() *StorageOSVolumeSourceApplyConfiguration { + return &StorageOSVolumeSourceApplyConfiguration{} +} + +// WithVolumeName sets the VolumeName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the VolumeName field is set to the value of the last call. +func (b *StorageOSVolumeSourceApplyConfiguration) WithVolumeName(value string) *StorageOSVolumeSourceApplyConfiguration { + b.VolumeName = &value + return b +} + +// WithVolumeNamespace sets the VolumeNamespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the VolumeNamespace field is set to the value of the last call. +func (b *StorageOSVolumeSourceApplyConfiguration) WithVolumeNamespace(value string) *StorageOSVolumeSourceApplyConfiguration { + b.VolumeNamespace = &value + return b +} + +// WithFSType sets the FSType field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FSType field is set to the value of the last call. +func (b *StorageOSVolumeSourceApplyConfiguration) WithFSType(value string) *StorageOSVolumeSourceApplyConfiguration { + b.FSType = &value + return b +} + +// WithReadOnly sets the ReadOnly field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadOnly field is set to the value of the last call. +func (b *StorageOSVolumeSourceApplyConfiguration) WithReadOnly(value bool) *StorageOSVolumeSourceApplyConfiguration { + b.ReadOnly = &value + return b +} + +// WithSecretRef sets the SecretRef field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SecretRef field is set to the value of the last call. +func (b *StorageOSVolumeSourceApplyConfiguration) WithSecretRef(value *LocalObjectReferenceApplyConfiguration) *StorageOSVolumeSourceApplyConfiguration { + b.SecretRef = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/sysctl.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/sysctl.go new file mode 100644 index 000000000000..deab9e0b38fb --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/sysctl.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// SysctlApplyConfiguration represents an declarative configuration of the Sysctl type for use +// with apply. +type SysctlApplyConfiguration struct { + Name *string `json:"name,omitempty"` + Value *string `json:"value,omitempty"` +} + +// SysctlApplyConfiguration constructs an declarative configuration of the Sysctl type for use with +// apply. +func Sysctl() *SysctlApplyConfiguration { + return &SysctlApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *SysctlApplyConfiguration) WithName(value string) *SysctlApplyConfiguration { + b.Name = &value + return b +} + +// WithValue sets the Value field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Value field is set to the value of the last call. +func (b *SysctlApplyConfiguration) WithValue(value string) *SysctlApplyConfiguration { + b.Value = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/taint.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/taint.go new file mode 100644 index 000000000000..4672b8742716 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/taint.go @@ -0,0 +1,71 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// TaintApplyConfiguration represents an declarative configuration of the Taint type for use +// with apply. +type TaintApplyConfiguration struct { + Key *string `json:"key,omitempty"` + Value *string `json:"value,omitempty"` + Effect *v1.TaintEffect `json:"effect,omitempty"` + TimeAdded *metav1.Time `json:"timeAdded,omitempty"` +} + +// TaintApplyConfiguration constructs an declarative configuration of the Taint type for use with +// apply. +func Taint() *TaintApplyConfiguration { + return &TaintApplyConfiguration{} +} + +// WithKey sets the Key field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Key field is set to the value of the last call. +func (b *TaintApplyConfiguration) WithKey(value string) *TaintApplyConfiguration { + b.Key = &value + return b +} + +// WithValue sets the Value field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Value field is set to the value of the last call. +func (b *TaintApplyConfiguration) WithValue(value string) *TaintApplyConfiguration { + b.Value = &value + return b +} + +// WithEffect sets the Effect field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Effect field is set to the value of the last call. +func (b *TaintApplyConfiguration) WithEffect(value v1.TaintEffect) *TaintApplyConfiguration { + b.Effect = &value + return b +} + +// WithTimeAdded sets the TimeAdded field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the TimeAdded field is set to the value of the last call. +func (b *TaintApplyConfiguration) WithTimeAdded(value metav1.Time) *TaintApplyConfiguration { + b.TimeAdded = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/tcpsocketaction.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/tcpsocketaction.go new file mode 100644 index 000000000000..bd038fc3aed9 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/tcpsocketaction.go @@ -0,0 +1,52 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + intstr "k8s.io/apimachinery/pkg/util/intstr" +) + +// TCPSocketActionApplyConfiguration represents an declarative configuration of the TCPSocketAction type for use +// with apply. +type TCPSocketActionApplyConfiguration struct { + Port *intstr.IntOrString `json:"port,omitempty"` + Host *string `json:"host,omitempty"` +} + +// TCPSocketActionApplyConfiguration constructs an declarative configuration of the TCPSocketAction type for use with +// apply. +func TCPSocketAction() *TCPSocketActionApplyConfiguration { + return &TCPSocketActionApplyConfiguration{} +} + +// WithPort sets the Port field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Port field is set to the value of the last call. +func (b *TCPSocketActionApplyConfiguration) WithPort(value intstr.IntOrString) *TCPSocketActionApplyConfiguration { + b.Port = &value + return b +} + +// WithHost sets the Host field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Host field is set to the value of the last call. +func (b *TCPSocketActionApplyConfiguration) WithHost(value string) *TCPSocketActionApplyConfiguration { + b.Host = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/toleration.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/toleration.go new file mode 100644 index 000000000000..1a92a8c6683a --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/toleration.go @@ -0,0 +1,79 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/core/v1" +) + +// TolerationApplyConfiguration represents an declarative configuration of the Toleration type for use +// with apply. +type TolerationApplyConfiguration struct { + Key *string `json:"key,omitempty"` + Operator *v1.TolerationOperator `json:"operator,omitempty"` + Value *string `json:"value,omitempty"` + Effect *v1.TaintEffect `json:"effect,omitempty"` + TolerationSeconds *int64 `json:"tolerationSeconds,omitempty"` +} + +// TolerationApplyConfiguration constructs an declarative configuration of the Toleration type for use with +// apply. +func Toleration() *TolerationApplyConfiguration { + return &TolerationApplyConfiguration{} +} + +// WithKey sets the Key field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Key field is set to the value of the last call. +func (b *TolerationApplyConfiguration) WithKey(value string) *TolerationApplyConfiguration { + b.Key = &value + return b +} + +// WithOperator sets the Operator field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Operator field is set to the value of the last call. +func (b *TolerationApplyConfiguration) WithOperator(value v1.TolerationOperator) *TolerationApplyConfiguration { + b.Operator = &value + return b +} + +// WithValue sets the Value field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Value field is set to the value of the last call. +func (b *TolerationApplyConfiguration) WithValue(value string) *TolerationApplyConfiguration { + b.Value = &value + return b +} + +// WithEffect sets the Effect field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Effect field is set to the value of the last call. +func (b *TolerationApplyConfiguration) WithEffect(value v1.TaintEffect) *TolerationApplyConfiguration { + b.Effect = &value + return b +} + +// WithTolerationSeconds sets the TolerationSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the TolerationSeconds field is set to the value of the last call. +func (b *TolerationApplyConfiguration) WithTolerationSeconds(value int64) *TolerationApplyConfiguration { + b.TolerationSeconds = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/topologyselectorlabelrequirement.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/topologyselectorlabelrequirement.go new file mode 100644 index 000000000000..9581490de2d5 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/topologyselectorlabelrequirement.go @@ -0,0 +1,50 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// TopologySelectorLabelRequirementApplyConfiguration represents an declarative configuration of the TopologySelectorLabelRequirement type for use +// with apply. +type TopologySelectorLabelRequirementApplyConfiguration struct { + Key *string `json:"key,omitempty"` + Values []string `json:"values,omitempty"` +} + +// TopologySelectorLabelRequirementApplyConfiguration constructs an declarative configuration of the TopologySelectorLabelRequirement type for use with +// apply. +func TopologySelectorLabelRequirement() *TopologySelectorLabelRequirementApplyConfiguration { + return &TopologySelectorLabelRequirementApplyConfiguration{} +} + +// WithKey sets the Key field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Key field is set to the value of the last call. +func (b *TopologySelectorLabelRequirementApplyConfiguration) WithKey(value string) *TopologySelectorLabelRequirementApplyConfiguration { + b.Key = &value + return b +} + +// WithValues adds the given value to the Values field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Values field. +func (b *TopologySelectorLabelRequirementApplyConfiguration) WithValues(values ...string) *TopologySelectorLabelRequirementApplyConfiguration { + for i := range values { + b.Values = append(b.Values, values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/topologyselectorterm.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/topologyselectorterm.go new file mode 100644 index 000000000000..a025b8a2a8e6 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/topologyselectorterm.go @@ -0,0 +1,44 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// TopologySelectorTermApplyConfiguration represents an declarative configuration of the TopologySelectorTerm type for use +// with apply. +type TopologySelectorTermApplyConfiguration struct { + MatchLabelExpressions []TopologySelectorLabelRequirementApplyConfiguration `json:"matchLabelExpressions,omitempty"` +} + +// TopologySelectorTermApplyConfiguration constructs an declarative configuration of the TopologySelectorTerm type for use with +// apply. +func TopologySelectorTerm() *TopologySelectorTermApplyConfiguration { + return &TopologySelectorTermApplyConfiguration{} +} + +// WithMatchLabelExpressions adds the given value to the MatchLabelExpressions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the MatchLabelExpressions field. +func (b *TopologySelectorTermApplyConfiguration) WithMatchLabelExpressions(values ...*TopologySelectorLabelRequirementApplyConfiguration) *TopologySelectorTermApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithMatchLabelExpressions") + } + b.MatchLabelExpressions = append(b.MatchLabelExpressions, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/topologyspreadconstraint.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/topologyspreadconstraint.go new file mode 100644 index 000000000000..ac8b82eead8b --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/topologyspreadconstraint.go @@ -0,0 +1,71 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// TopologySpreadConstraintApplyConfiguration represents an declarative configuration of the TopologySpreadConstraint type for use +// with apply. +type TopologySpreadConstraintApplyConfiguration struct { + MaxSkew *int32 `json:"maxSkew,omitempty"` + TopologyKey *string `json:"topologyKey,omitempty"` + WhenUnsatisfiable *v1.UnsatisfiableConstraintAction `json:"whenUnsatisfiable,omitempty"` + LabelSelector *metav1.LabelSelectorApplyConfiguration `json:"labelSelector,omitempty"` +} + +// TopologySpreadConstraintApplyConfiguration constructs an declarative configuration of the TopologySpreadConstraint type for use with +// apply. +func TopologySpreadConstraint() *TopologySpreadConstraintApplyConfiguration { + return &TopologySpreadConstraintApplyConfiguration{} +} + +// WithMaxSkew sets the MaxSkew field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MaxSkew field is set to the value of the last call. +func (b *TopologySpreadConstraintApplyConfiguration) WithMaxSkew(value int32) *TopologySpreadConstraintApplyConfiguration { + b.MaxSkew = &value + return b +} + +// WithTopologyKey sets the TopologyKey field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the TopologyKey field is set to the value of the last call. +func (b *TopologySpreadConstraintApplyConfiguration) WithTopologyKey(value string) *TopologySpreadConstraintApplyConfiguration { + b.TopologyKey = &value + return b +} + +// WithWhenUnsatisfiable sets the WhenUnsatisfiable field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the WhenUnsatisfiable field is set to the value of the last call. +func (b *TopologySpreadConstraintApplyConfiguration) WithWhenUnsatisfiable(value v1.UnsatisfiableConstraintAction) *TopologySpreadConstraintApplyConfiguration { + b.WhenUnsatisfiable = &value + return b +} + +// WithLabelSelector sets the LabelSelector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LabelSelector field is set to the value of the last call. +func (b *TopologySpreadConstraintApplyConfiguration) WithLabelSelector(value *metav1.LabelSelectorApplyConfiguration) *TopologySpreadConstraintApplyConfiguration { + b.LabelSelector = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/typedlocalobjectreference.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/typedlocalobjectreference.go new file mode 100644 index 000000000000..cdc2eb7d34fc --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/typedlocalobjectreference.go @@ -0,0 +1,57 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// TypedLocalObjectReferenceApplyConfiguration represents an declarative configuration of the TypedLocalObjectReference type for use +// with apply. +type TypedLocalObjectReferenceApplyConfiguration struct { + APIGroup *string `json:"apiGroup,omitempty"` + Kind *string `json:"kind,omitempty"` + Name *string `json:"name,omitempty"` +} + +// TypedLocalObjectReferenceApplyConfiguration constructs an declarative configuration of the TypedLocalObjectReference type for use with +// apply. +func TypedLocalObjectReference() *TypedLocalObjectReferenceApplyConfiguration { + return &TypedLocalObjectReferenceApplyConfiguration{} +} + +// WithAPIGroup sets the APIGroup field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIGroup field is set to the value of the last call. +func (b *TypedLocalObjectReferenceApplyConfiguration) WithAPIGroup(value string) *TypedLocalObjectReferenceApplyConfiguration { + b.APIGroup = &value + return b +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *TypedLocalObjectReferenceApplyConfiguration) WithKind(value string) *TypedLocalObjectReferenceApplyConfiguration { + b.Kind = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *TypedLocalObjectReferenceApplyConfiguration) WithName(value string) *TypedLocalObjectReferenceApplyConfiguration { + b.Name = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/volume.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/volume.go new file mode 100644 index 000000000000..db0686bce703 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/volume.go @@ -0,0 +1,272 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// VolumeApplyConfiguration represents an declarative configuration of the Volume type for use +// with apply. +type VolumeApplyConfiguration struct { + Name *string `json:"name,omitempty"` + VolumeSourceApplyConfiguration `json:",inline"` +} + +// VolumeApplyConfiguration constructs an declarative configuration of the Volume type for use with +// apply. +func Volume() *VolumeApplyConfiguration { + return &VolumeApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *VolumeApplyConfiguration) WithName(value string) *VolumeApplyConfiguration { + b.Name = &value + return b +} + +// WithHostPath sets the HostPath field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the HostPath field is set to the value of the last call. +func (b *VolumeApplyConfiguration) WithHostPath(value *HostPathVolumeSourceApplyConfiguration) *VolumeApplyConfiguration { + b.HostPath = value + return b +} + +// WithEmptyDir sets the EmptyDir field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the EmptyDir field is set to the value of the last call. +func (b *VolumeApplyConfiguration) WithEmptyDir(value *EmptyDirVolumeSourceApplyConfiguration) *VolumeApplyConfiguration { + b.EmptyDir = value + return b +} + +// WithGCEPersistentDisk sets the GCEPersistentDisk field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GCEPersistentDisk field is set to the value of the last call. +func (b *VolumeApplyConfiguration) WithGCEPersistentDisk(value *GCEPersistentDiskVolumeSourceApplyConfiguration) *VolumeApplyConfiguration { + b.GCEPersistentDisk = value + return b +} + +// WithAWSElasticBlockStore sets the AWSElasticBlockStore field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AWSElasticBlockStore field is set to the value of the last call. +func (b *VolumeApplyConfiguration) WithAWSElasticBlockStore(value *AWSElasticBlockStoreVolumeSourceApplyConfiguration) *VolumeApplyConfiguration { + b.AWSElasticBlockStore = value + return b +} + +// WithGitRepo sets the GitRepo field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GitRepo field is set to the value of the last call. +func (b *VolumeApplyConfiguration) WithGitRepo(value *GitRepoVolumeSourceApplyConfiguration) *VolumeApplyConfiguration { + b.GitRepo = value + return b +} + +// WithSecret sets the Secret field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Secret field is set to the value of the last call. +func (b *VolumeApplyConfiguration) WithSecret(value *SecretVolumeSourceApplyConfiguration) *VolumeApplyConfiguration { + b.Secret = value + return b +} + +// WithNFS sets the NFS field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NFS field is set to the value of the last call. +func (b *VolumeApplyConfiguration) WithNFS(value *NFSVolumeSourceApplyConfiguration) *VolumeApplyConfiguration { + b.NFS = value + return b +} + +// WithISCSI sets the ISCSI field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ISCSI field is set to the value of the last call. +func (b *VolumeApplyConfiguration) WithISCSI(value *ISCSIVolumeSourceApplyConfiguration) *VolumeApplyConfiguration { + b.ISCSI = value + return b +} + +// WithGlusterfs sets the Glusterfs field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Glusterfs field is set to the value of the last call. +func (b *VolumeApplyConfiguration) WithGlusterfs(value *GlusterfsVolumeSourceApplyConfiguration) *VolumeApplyConfiguration { + b.Glusterfs = value + return b +} + +// WithPersistentVolumeClaim sets the PersistentVolumeClaim field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PersistentVolumeClaim field is set to the value of the last call. +func (b *VolumeApplyConfiguration) WithPersistentVolumeClaim(value *PersistentVolumeClaimVolumeSourceApplyConfiguration) *VolumeApplyConfiguration { + b.PersistentVolumeClaim = value + return b +} + +// WithRBD sets the RBD field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RBD field is set to the value of the last call. +func (b *VolumeApplyConfiguration) WithRBD(value *RBDVolumeSourceApplyConfiguration) *VolumeApplyConfiguration { + b.RBD = value + return b +} + +// WithFlexVolume sets the FlexVolume field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FlexVolume field is set to the value of the last call. +func (b *VolumeApplyConfiguration) WithFlexVolume(value *FlexVolumeSourceApplyConfiguration) *VolumeApplyConfiguration { + b.FlexVolume = value + return b +} + +// WithCinder sets the Cinder field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Cinder field is set to the value of the last call. +func (b *VolumeApplyConfiguration) WithCinder(value *CinderVolumeSourceApplyConfiguration) *VolumeApplyConfiguration { + b.Cinder = value + return b +} + +// WithCephFS sets the CephFS field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CephFS field is set to the value of the last call. +func (b *VolumeApplyConfiguration) WithCephFS(value *CephFSVolumeSourceApplyConfiguration) *VolumeApplyConfiguration { + b.CephFS = value + return b +} + +// WithFlocker sets the Flocker field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Flocker field is set to the value of the last call. +func (b *VolumeApplyConfiguration) WithFlocker(value *FlockerVolumeSourceApplyConfiguration) *VolumeApplyConfiguration { + b.Flocker = value + return b +} + +// WithDownwardAPI sets the DownwardAPI field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DownwardAPI field is set to the value of the last call. +func (b *VolumeApplyConfiguration) WithDownwardAPI(value *DownwardAPIVolumeSourceApplyConfiguration) *VolumeApplyConfiguration { + b.DownwardAPI = value + return b +} + +// WithFC sets the FC field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FC field is set to the value of the last call. +func (b *VolumeApplyConfiguration) WithFC(value *FCVolumeSourceApplyConfiguration) *VolumeApplyConfiguration { + b.FC = value + return b +} + +// WithAzureFile sets the AzureFile field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AzureFile field is set to the value of the last call. +func (b *VolumeApplyConfiguration) WithAzureFile(value *AzureFileVolumeSourceApplyConfiguration) *VolumeApplyConfiguration { + b.AzureFile = value + return b +} + +// WithConfigMap sets the ConfigMap field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ConfigMap field is set to the value of the last call. +func (b *VolumeApplyConfiguration) WithConfigMap(value *ConfigMapVolumeSourceApplyConfiguration) *VolumeApplyConfiguration { + b.ConfigMap = value + return b +} + +// WithVsphereVolume sets the VsphereVolume field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the VsphereVolume field is set to the value of the last call. +func (b *VolumeApplyConfiguration) WithVsphereVolume(value *VsphereVirtualDiskVolumeSourceApplyConfiguration) *VolumeApplyConfiguration { + b.VsphereVolume = value + return b +} + +// WithQuobyte sets the Quobyte field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Quobyte field is set to the value of the last call. +func (b *VolumeApplyConfiguration) WithQuobyte(value *QuobyteVolumeSourceApplyConfiguration) *VolumeApplyConfiguration { + b.Quobyte = value + return b +} + +// WithAzureDisk sets the AzureDisk field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AzureDisk field is set to the value of the last call. +func (b *VolumeApplyConfiguration) WithAzureDisk(value *AzureDiskVolumeSourceApplyConfiguration) *VolumeApplyConfiguration { + b.AzureDisk = value + return b +} + +// WithPhotonPersistentDisk sets the PhotonPersistentDisk field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PhotonPersistentDisk field is set to the value of the last call. +func (b *VolumeApplyConfiguration) WithPhotonPersistentDisk(value *PhotonPersistentDiskVolumeSourceApplyConfiguration) *VolumeApplyConfiguration { + b.PhotonPersistentDisk = value + return b +} + +// WithProjected sets the Projected field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Projected field is set to the value of the last call. +func (b *VolumeApplyConfiguration) WithProjected(value *ProjectedVolumeSourceApplyConfiguration) *VolumeApplyConfiguration { + b.Projected = value + return b +} + +// WithPortworxVolume sets the PortworxVolume field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PortworxVolume field is set to the value of the last call. +func (b *VolumeApplyConfiguration) WithPortworxVolume(value *PortworxVolumeSourceApplyConfiguration) *VolumeApplyConfiguration { + b.PortworxVolume = value + return b +} + +// WithScaleIO sets the ScaleIO field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ScaleIO field is set to the value of the last call. +func (b *VolumeApplyConfiguration) WithScaleIO(value *ScaleIOVolumeSourceApplyConfiguration) *VolumeApplyConfiguration { + b.ScaleIO = value + return b +} + +// WithStorageOS sets the StorageOS field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the StorageOS field is set to the value of the last call. +func (b *VolumeApplyConfiguration) WithStorageOS(value *StorageOSVolumeSourceApplyConfiguration) *VolumeApplyConfiguration { + b.StorageOS = value + return b +} + +// WithCSI sets the CSI field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CSI field is set to the value of the last call. +func (b *VolumeApplyConfiguration) WithCSI(value *CSIVolumeSourceApplyConfiguration) *VolumeApplyConfiguration { + b.CSI = value + return b +} + +// WithEphemeral sets the Ephemeral field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Ephemeral field is set to the value of the last call. +func (b *VolumeApplyConfiguration) WithEphemeral(value *EphemeralVolumeSourceApplyConfiguration) *VolumeApplyConfiguration { + b.Ephemeral = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/volumedevice.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/volumedevice.go new file mode 100644 index 000000000000..ea18ca8d9edc --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/volumedevice.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// VolumeDeviceApplyConfiguration represents an declarative configuration of the VolumeDevice type for use +// with apply. +type VolumeDeviceApplyConfiguration struct { + Name *string `json:"name,omitempty"` + DevicePath *string `json:"devicePath,omitempty"` +} + +// VolumeDeviceApplyConfiguration constructs an declarative configuration of the VolumeDevice type for use with +// apply. +func VolumeDevice() *VolumeDeviceApplyConfiguration { + return &VolumeDeviceApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *VolumeDeviceApplyConfiguration) WithName(value string) *VolumeDeviceApplyConfiguration { + b.Name = &value + return b +} + +// WithDevicePath sets the DevicePath field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DevicePath field is set to the value of the last call. +func (b *VolumeDeviceApplyConfiguration) WithDevicePath(value string) *VolumeDeviceApplyConfiguration { + b.DevicePath = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/volumemount.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/volumemount.go new file mode 100644 index 000000000000..b0bec9ffed95 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/volumemount.go @@ -0,0 +1,88 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/core/v1" +) + +// VolumeMountApplyConfiguration represents an declarative configuration of the VolumeMount type for use +// with apply. +type VolumeMountApplyConfiguration struct { + Name *string `json:"name,omitempty"` + ReadOnly *bool `json:"readOnly,omitempty"` + MountPath *string `json:"mountPath,omitempty"` + SubPath *string `json:"subPath,omitempty"` + MountPropagation *v1.MountPropagationMode `json:"mountPropagation,omitempty"` + SubPathExpr *string `json:"subPathExpr,omitempty"` +} + +// VolumeMountApplyConfiguration constructs an declarative configuration of the VolumeMount type for use with +// apply. +func VolumeMount() *VolumeMountApplyConfiguration { + return &VolumeMountApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *VolumeMountApplyConfiguration) WithName(value string) *VolumeMountApplyConfiguration { + b.Name = &value + return b +} + +// WithReadOnly sets the ReadOnly field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadOnly field is set to the value of the last call. +func (b *VolumeMountApplyConfiguration) WithReadOnly(value bool) *VolumeMountApplyConfiguration { + b.ReadOnly = &value + return b +} + +// WithMountPath sets the MountPath field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MountPath field is set to the value of the last call. +func (b *VolumeMountApplyConfiguration) WithMountPath(value string) *VolumeMountApplyConfiguration { + b.MountPath = &value + return b +} + +// WithSubPath sets the SubPath field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SubPath field is set to the value of the last call. +func (b *VolumeMountApplyConfiguration) WithSubPath(value string) *VolumeMountApplyConfiguration { + b.SubPath = &value + return b +} + +// WithMountPropagation sets the MountPropagation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MountPropagation field is set to the value of the last call. +func (b *VolumeMountApplyConfiguration) WithMountPropagation(value v1.MountPropagationMode) *VolumeMountApplyConfiguration { + b.MountPropagation = &value + return b +} + +// WithSubPathExpr sets the SubPathExpr field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SubPathExpr field is set to the value of the last call. +func (b *VolumeMountApplyConfiguration) WithSubPathExpr(value string) *VolumeMountApplyConfiguration { + b.SubPathExpr = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/volumenodeaffinity.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/volumenodeaffinity.go new file mode 100644 index 000000000000..32bfd8292852 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/volumenodeaffinity.go @@ -0,0 +1,39 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// VolumeNodeAffinityApplyConfiguration represents an declarative configuration of the VolumeNodeAffinity type for use +// with apply. +type VolumeNodeAffinityApplyConfiguration struct { + Required *NodeSelectorApplyConfiguration `json:"required,omitempty"` +} + +// VolumeNodeAffinityApplyConfiguration constructs an declarative configuration of the VolumeNodeAffinity type for use with +// apply. +func VolumeNodeAffinity() *VolumeNodeAffinityApplyConfiguration { + return &VolumeNodeAffinityApplyConfiguration{} +} + +// WithRequired sets the Required field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Required field is set to the value of the last call. +func (b *VolumeNodeAffinityApplyConfiguration) WithRequired(value *NodeSelectorApplyConfiguration) *VolumeNodeAffinityApplyConfiguration { + b.Required = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/volumeprojection.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/volumeprojection.go new file mode 100644 index 000000000000..8d16ea79eb21 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/volumeprojection.go @@ -0,0 +1,66 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// VolumeProjectionApplyConfiguration represents an declarative configuration of the VolumeProjection type for use +// with apply. +type VolumeProjectionApplyConfiguration struct { + Secret *SecretProjectionApplyConfiguration `json:"secret,omitempty"` + DownwardAPI *DownwardAPIProjectionApplyConfiguration `json:"downwardAPI,omitempty"` + ConfigMap *ConfigMapProjectionApplyConfiguration `json:"configMap,omitempty"` + ServiceAccountToken *ServiceAccountTokenProjectionApplyConfiguration `json:"serviceAccountToken,omitempty"` +} + +// VolumeProjectionApplyConfiguration constructs an declarative configuration of the VolumeProjection type for use with +// apply. +func VolumeProjection() *VolumeProjectionApplyConfiguration { + return &VolumeProjectionApplyConfiguration{} +} + +// WithSecret sets the Secret field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Secret field is set to the value of the last call. +func (b *VolumeProjectionApplyConfiguration) WithSecret(value *SecretProjectionApplyConfiguration) *VolumeProjectionApplyConfiguration { + b.Secret = value + return b +} + +// WithDownwardAPI sets the DownwardAPI field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DownwardAPI field is set to the value of the last call. +func (b *VolumeProjectionApplyConfiguration) WithDownwardAPI(value *DownwardAPIProjectionApplyConfiguration) *VolumeProjectionApplyConfiguration { + b.DownwardAPI = value + return b +} + +// WithConfigMap sets the ConfigMap field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ConfigMap field is set to the value of the last call. +func (b *VolumeProjectionApplyConfiguration) WithConfigMap(value *ConfigMapProjectionApplyConfiguration) *VolumeProjectionApplyConfiguration { + b.ConfigMap = value + return b +} + +// WithServiceAccountToken sets the ServiceAccountToken field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ServiceAccountToken field is set to the value of the last call. +func (b *VolumeProjectionApplyConfiguration) WithServiceAccountToken(value *ServiceAccountTokenProjectionApplyConfiguration) *VolumeProjectionApplyConfiguration { + b.ServiceAccountToken = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/volumesource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/volumesource.go new file mode 100644 index 000000000000..4a8d316dd52e --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/volumesource.go @@ -0,0 +1,291 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// VolumeSourceApplyConfiguration represents an declarative configuration of the VolumeSource type for use +// with apply. +type VolumeSourceApplyConfiguration struct { + HostPath *HostPathVolumeSourceApplyConfiguration `json:"hostPath,omitempty"` + EmptyDir *EmptyDirVolumeSourceApplyConfiguration `json:"emptyDir,omitempty"` + GCEPersistentDisk *GCEPersistentDiskVolumeSourceApplyConfiguration `json:"gcePersistentDisk,omitempty"` + AWSElasticBlockStore *AWSElasticBlockStoreVolumeSourceApplyConfiguration `json:"awsElasticBlockStore,omitempty"` + GitRepo *GitRepoVolumeSourceApplyConfiguration `json:"gitRepo,omitempty"` + Secret *SecretVolumeSourceApplyConfiguration `json:"secret,omitempty"` + NFS *NFSVolumeSourceApplyConfiguration `json:"nfs,omitempty"` + ISCSI *ISCSIVolumeSourceApplyConfiguration `json:"iscsi,omitempty"` + Glusterfs *GlusterfsVolumeSourceApplyConfiguration `json:"glusterfs,omitempty"` + PersistentVolumeClaim *PersistentVolumeClaimVolumeSourceApplyConfiguration `json:"persistentVolumeClaim,omitempty"` + RBD *RBDVolumeSourceApplyConfiguration `json:"rbd,omitempty"` + FlexVolume *FlexVolumeSourceApplyConfiguration `json:"flexVolume,omitempty"` + Cinder *CinderVolumeSourceApplyConfiguration `json:"cinder,omitempty"` + CephFS *CephFSVolumeSourceApplyConfiguration `json:"cephfs,omitempty"` + Flocker *FlockerVolumeSourceApplyConfiguration `json:"flocker,omitempty"` + DownwardAPI *DownwardAPIVolumeSourceApplyConfiguration `json:"downwardAPI,omitempty"` + FC *FCVolumeSourceApplyConfiguration `json:"fc,omitempty"` + AzureFile *AzureFileVolumeSourceApplyConfiguration `json:"azureFile,omitempty"` + ConfigMap *ConfigMapVolumeSourceApplyConfiguration `json:"configMap,omitempty"` + VsphereVolume *VsphereVirtualDiskVolumeSourceApplyConfiguration `json:"vsphereVolume,omitempty"` + Quobyte *QuobyteVolumeSourceApplyConfiguration `json:"quobyte,omitempty"` + AzureDisk *AzureDiskVolumeSourceApplyConfiguration `json:"azureDisk,omitempty"` + PhotonPersistentDisk *PhotonPersistentDiskVolumeSourceApplyConfiguration `json:"photonPersistentDisk,omitempty"` + Projected *ProjectedVolumeSourceApplyConfiguration `json:"projected,omitempty"` + PortworxVolume *PortworxVolumeSourceApplyConfiguration `json:"portworxVolume,omitempty"` + ScaleIO *ScaleIOVolumeSourceApplyConfiguration `json:"scaleIO,omitempty"` + StorageOS *StorageOSVolumeSourceApplyConfiguration `json:"storageos,omitempty"` + CSI *CSIVolumeSourceApplyConfiguration `json:"csi,omitempty"` + Ephemeral *EphemeralVolumeSourceApplyConfiguration `json:"ephemeral,omitempty"` +} + +// VolumeSourceApplyConfiguration constructs an declarative configuration of the VolumeSource type for use with +// apply. +func VolumeSource() *VolumeSourceApplyConfiguration { + return &VolumeSourceApplyConfiguration{} +} + +// WithHostPath sets the HostPath field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the HostPath field is set to the value of the last call. +func (b *VolumeSourceApplyConfiguration) WithHostPath(value *HostPathVolumeSourceApplyConfiguration) *VolumeSourceApplyConfiguration { + b.HostPath = value + return b +} + +// WithEmptyDir sets the EmptyDir field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the EmptyDir field is set to the value of the last call. +func (b *VolumeSourceApplyConfiguration) WithEmptyDir(value *EmptyDirVolumeSourceApplyConfiguration) *VolumeSourceApplyConfiguration { + b.EmptyDir = value + return b +} + +// WithGCEPersistentDisk sets the GCEPersistentDisk field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GCEPersistentDisk field is set to the value of the last call. +func (b *VolumeSourceApplyConfiguration) WithGCEPersistentDisk(value *GCEPersistentDiskVolumeSourceApplyConfiguration) *VolumeSourceApplyConfiguration { + b.GCEPersistentDisk = value + return b +} + +// WithAWSElasticBlockStore sets the AWSElasticBlockStore field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AWSElasticBlockStore field is set to the value of the last call. +func (b *VolumeSourceApplyConfiguration) WithAWSElasticBlockStore(value *AWSElasticBlockStoreVolumeSourceApplyConfiguration) *VolumeSourceApplyConfiguration { + b.AWSElasticBlockStore = value + return b +} + +// WithGitRepo sets the GitRepo field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GitRepo field is set to the value of the last call. +func (b *VolumeSourceApplyConfiguration) WithGitRepo(value *GitRepoVolumeSourceApplyConfiguration) *VolumeSourceApplyConfiguration { + b.GitRepo = value + return b +} + +// WithSecret sets the Secret field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Secret field is set to the value of the last call. +func (b *VolumeSourceApplyConfiguration) WithSecret(value *SecretVolumeSourceApplyConfiguration) *VolumeSourceApplyConfiguration { + b.Secret = value + return b +} + +// WithNFS sets the NFS field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NFS field is set to the value of the last call. +func (b *VolumeSourceApplyConfiguration) WithNFS(value *NFSVolumeSourceApplyConfiguration) *VolumeSourceApplyConfiguration { + b.NFS = value + return b +} + +// WithISCSI sets the ISCSI field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ISCSI field is set to the value of the last call. +func (b *VolumeSourceApplyConfiguration) WithISCSI(value *ISCSIVolumeSourceApplyConfiguration) *VolumeSourceApplyConfiguration { + b.ISCSI = value + return b +} + +// WithGlusterfs sets the Glusterfs field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Glusterfs field is set to the value of the last call. +func (b *VolumeSourceApplyConfiguration) WithGlusterfs(value *GlusterfsVolumeSourceApplyConfiguration) *VolumeSourceApplyConfiguration { + b.Glusterfs = value + return b +} + +// WithPersistentVolumeClaim sets the PersistentVolumeClaim field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PersistentVolumeClaim field is set to the value of the last call. +func (b *VolumeSourceApplyConfiguration) WithPersistentVolumeClaim(value *PersistentVolumeClaimVolumeSourceApplyConfiguration) *VolumeSourceApplyConfiguration { + b.PersistentVolumeClaim = value + return b +} + +// WithRBD sets the RBD field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RBD field is set to the value of the last call. +func (b *VolumeSourceApplyConfiguration) WithRBD(value *RBDVolumeSourceApplyConfiguration) *VolumeSourceApplyConfiguration { + b.RBD = value + return b +} + +// WithFlexVolume sets the FlexVolume field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FlexVolume field is set to the value of the last call. +func (b *VolumeSourceApplyConfiguration) WithFlexVolume(value *FlexVolumeSourceApplyConfiguration) *VolumeSourceApplyConfiguration { + b.FlexVolume = value + return b +} + +// WithCinder sets the Cinder field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Cinder field is set to the value of the last call. +func (b *VolumeSourceApplyConfiguration) WithCinder(value *CinderVolumeSourceApplyConfiguration) *VolumeSourceApplyConfiguration { + b.Cinder = value + return b +} + +// WithCephFS sets the CephFS field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CephFS field is set to the value of the last call. +func (b *VolumeSourceApplyConfiguration) WithCephFS(value *CephFSVolumeSourceApplyConfiguration) *VolumeSourceApplyConfiguration { + b.CephFS = value + return b +} + +// WithFlocker sets the Flocker field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Flocker field is set to the value of the last call. +func (b *VolumeSourceApplyConfiguration) WithFlocker(value *FlockerVolumeSourceApplyConfiguration) *VolumeSourceApplyConfiguration { + b.Flocker = value + return b +} + +// WithDownwardAPI sets the DownwardAPI field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DownwardAPI field is set to the value of the last call. +func (b *VolumeSourceApplyConfiguration) WithDownwardAPI(value *DownwardAPIVolumeSourceApplyConfiguration) *VolumeSourceApplyConfiguration { + b.DownwardAPI = value + return b +} + +// WithFC sets the FC field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FC field is set to the value of the last call. +func (b *VolumeSourceApplyConfiguration) WithFC(value *FCVolumeSourceApplyConfiguration) *VolumeSourceApplyConfiguration { + b.FC = value + return b +} + +// WithAzureFile sets the AzureFile field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AzureFile field is set to the value of the last call. +func (b *VolumeSourceApplyConfiguration) WithAzureFile(value *AzureFileVolumeSourceApplyConfiguration) *VolumeSourceApplyConfiguration { + b.AzureFile = value + return b +} + +// WithConfigMap sets the ConfigMap field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ConfigMap field is set to the value of the last call. +func (b *VolumeSourceApplyConfiguration) WithConfigMap(value *ConfigMapVolumeSourceApplyConfiguration) *VolumeSourceApplyConfiguration { + b.ConfigMap = value + return b +} + +// WithVsphereVolume sets the VsphereVolume field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the VsphereVolume field is set to the value of the last call. +func (b *VolumeSourceApplyConfiguration) WithVsphereVolume(value *VsphereVirtualDiskVolumeSourceApplyConfiguration) *VolumeSourceApplyConfiguration { + b.VsphereVolume = value + return b +} + +// WithQuobyte sets the Quobyte field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Quobyte field is set to the value of the last call. +func (b *VolumeSourceApplyConfiguration) WithQuobyte(value *QuobyteVolumeSourceApplyConfiguration) *VolumeSourceApplyConfiguration { + b.Quobyte = value + return b +} + +// WithAzureDisk sets the AzureDisk field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AzureDisk field is set to the value of the last call. +func (b *VolumeSourceApplyConfiguration) WithAzureDisk(value *AzureDiskVolumeSourceApplyConfiguration) *VolumeSourceApplyConfiguration { + b.AzureDisk = value + return b +} + +// WithPhotonPersistentDisk sets the PhotonPersistentDisk field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PhotonPersistentDisk field is set to the value of the last call. +func (b *VolumeSourceApplyConfiguration) WithPhotonPersistentDisk(value *PhotonPersistentDiskVolumeSourceApplyConfiguration) *VolumeSourceApplyConfiguration { + b.PhotonPersistentDisk = value + return b +} + +// WithProjected sets the Projected field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Projected field is set to the value of the last call. +func (b *VolumeSourceApplyConfiguration) WithProjected(value *ProjectedVolumeSourceApplyConfiguration) *VolumeSourceApplyConfiguration { + b.Projected = value + return b +} + +// WithPortworxVolume sets the PortworxVolume field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PortworxVolume field is set to the value of the last call. +func (b *VolumeSourceApplyConfiguration) WithPortworxVolume(value *PortworxVolumeSourceApplyConfiguration) *VolumeSourceApplyConfiguration { + b.PortworxVolume = value + return b +} + +// WithScaleIO sets the ScaleIO field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ScaleIO field is set to the value of the last call. +func (b *VolumeSourceApplyConfiguration) WithScaleIO(value *ScaleIOVolumeSourceApplyConfiguration) *VolumeSourceApplyConfiguration { + b.ScaleIO = value + return b +} + +// WithStorageOS sets the StorageOS field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the StorageOS field is set to the value of the last call. +func (b *VolumeSourceApplyConfiguration) WithStorageOS(value *StorageOSVolumeSourceApplyConfiguration) *VolumeSourceApplyConfiguration { + b.StorageOS = value + return b +} + +// WithCSI sets the CSI field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CSI field is set to the value of the last call. +func (b *VolumeSourceApplyConfiguration) WithCSI(value *CSIVolumeSourceApplyConfiguration) *VolumeSourceApplyConfiguration { + b.CSI = value + return b +} + +// WithEphemeral sets the Ephemeral field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Ephemeral field is set to the value of the last call. +func (b *VolumeSourceApplyConfiguration) WithEphemeral(value *EphemeralVolumeSourceApplyConfiguration) *VolumeSourceApplyConfiguration { + b.Ephemeral = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/vspherevirtualdiskvolumesource.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/vspherevirtualdiskvolumesource.go new file mode 100644 index 000000000000..ff3e3e27d90a --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/vspherevirtualdiskvolumesource.go @@ -0,0 +1,66 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// VsphereVirtualDiskVolumeSourceApplyConfiguration represents an declarative configuration of the VsphereVirtualDiskVolumeSource type for use +// with apply. +type VsphereVirtualDiskVolumeSourceApplyConfiguration struct { + VolumePath *string `json:"volumePath,omitempty"` + FSType *string `json:"fsType,omitempty"` + StoragePolicyName *string `json:"storagePolicyName,omitempty"` + StoragePolicyID *string `json:"storagePolicyID,omitempty"` +} + +// VsphereVirtualDiskVolumeSourceApplyConfiguration constructs an declarative configuration of the VsphereVirtualDiskVolumeSource type for use with +// apply. +func VsphereVirtualDiskVolumeSource() *VsphereVirtualDiskVolumeSourceApplyConfiguration { + return &VsphereVirtualDiskVolumeSourceApplyConfiguration{} +} + +// WithVolumePath sets the VolumePath field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the VolumePath field is set to the value of the last call. +func (b *VsphereVirtualDiskVolumeSourceApplyConfiguration) WithVolumePath(value string) *VsphereVirtualDiskVolumeSourceApplyConfiguration { + b.VolumePath = &value + return b +} + +// WithFSType sets the FSType field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FSType field is set to the value of the last call. +func (b *VsphereVirtualDiskVolumeSourceApplyConfiguration) WithFSType(value string) *VsphereVirtualDiskVolumeSourceApplyConfiguration { + b.FSType = &value + return b +} + +// WithStoragePolicyName sets the StoragePolicyName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the StoragePolicyName field is set to the value of the last call. +func (b *VsphereVirtualDiskVolumeSourceApplyConfiguration) WithStoragePolicyName(value string) *VsphereVirtualDiskVolumeSourceApplyConfiguration { + b.StoragePolicyName = &value + return b +} + +// WithStoragePolicyID sets the StoragePolicyID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the StoragePolicyID field is set to the value of the last call. +func (b *VsphereVirtualDiskVolumeSourceApplyConfiguration) WithStoragePolicyID(value string) *VsphereVirtualDiskVolumeSourceApplyConfiguration { + b.StoragePolicyID = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/weightedpodaffinityterm.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/weightedpodaffinityterm.go new file mode 100644 index 000000000000..eb99d06ffab2 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/weightedpodaffinityterm.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// WeightedPodAffinityTermApplyConfiguration represents an declarative configuration of the WeightedPodAffinityTerm type for use +// with apply. +type WeightedPodAffinityTermApplyConfiguration struct { + Weight *int32 `json:"weight,omitempty"` + PodAffinityTerm *PodAffinityTermApplyConfiguration `json:"podAffinityTerm,omitempty"` +} + +// WeightedPodAffinityTermApplyConfiguration constructs an declarative configuration of the WeightedPodAffinityTerm type for use with +// apply. +func WeightedPodAffinityTerm() *WeightedPodAffinityTermApplyConfiguration { + return &WeightedPodAffinityTermApplyConfiguration{} +} + +// WithWeight sets the Weight field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Weight field is set to the value of the last call. +func (b *WeightedPodAffinityTermApplyConfiguration) WithWeight(value int32) *WeightedPodAffinityTermApplyConfiguration { + b.Weight = &value + return b +} + +// WithPodAffinityTerm sets the PodAffinityTerm field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PodAffinityTerm field is set to the value of the last call. +func (b *WeightedPodAffinityTermApplyConfiguration) WithPodAffinityTerm(value *PodAffinityTermApplyConfiguration) *WeightedPodAffinityTermApplyConfiguration { + b.PodAffinityTerm = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/core/v1/windowssecuritycontextoptions.go b/vendor/k8s.io/client-go/applyconfigurations/core/v1/windowssecuritycontextoptions.go new file mode 100644 index 000000000000..2442063c4ecd --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/core/v1/windowssecuritycontextoptions.go @@ -0,0 +1,57 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// WindowsSecurityContextOptionsApplyConfiguration represents an declarative configuration of the WindowsSecurityContextOptions type for use +// with apply. +type WindowsSecurityContextOptionsApplyConfiguration struct { + GMSACredentialSpecName *string `json:"gmsaCredentialSpecName,omitempty"` + GMSACredentialSpec *string `json:"gmsaCredentialSpec,omitempty"` + RunAsUserName *string `json:"runAsUserName,omitempty"` +} + +// WindowsSecurityContextOptionsApplyConfiguration constructs an declarative configuration of the WindowsSecurityContextOptions type for use with +// apply. +func WindowsSecurityContextOptions() *WindowsSecurityContextOptionsApplyConfiguration { + return &WindowsSecurityContextOptionsApplyConfiguration{} +} + +// WithGMSACredentialSpecName sets the GMSACredentialSpecName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GMSACredentialSpecName field is set to the value of the last call. +func (b *WindowsSecurityContextOptionsApplyConfiguration) WithGMSACredentialSpecName(value string) *WindowsSecurityContextOptionsApplyConfiguration { + b.GMSACredentialSpecName = &value + return b +} + +// WithGMSACredentialSpec sets the GMSACredentialSpec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GMSACredentialSpec field is set to the value of the last call. +func (b *WindowsSecurityContextOptionsApplyConfiguration) WithGMSACredentialSpec(value string) *WindowsSecurityContextOptionsApplyConfiguration { + b.GMSACredentialSpec = &value + return b +} + +// WithRunAsUserName sets the RunAsUserName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RunAsUserName field is set to the value of the last call. +func (b *WindowsSecurityContextOptionsApplyConfiguration) WithRunAsUserName(value string) *WindowsSecurityContextOptionsApplyConfiguration { + b.RunAsUserName = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/discovery/v1/endpoint.go b/vendor/k8s.io/client-go/applyconfigurations/discovery/v1/endpoint.go new file mode 100644 index 000000000000..d8c2359a3b72 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/discovery/v1/endpoint.go @@ -0,0 +1,114 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + corev1 "k8s.io/client-go/applyconfigurations/core/v1" +) + +// EndpointApplyConfiguration represents an declarative configuration of the Endpoint type for use +// with apply. +type EndpointApplyConfiguration struct { + Addresses []string `json:"addresses,omitempty"` + Conditions *EndpointConditionsApplyConfiguration `json:"conditions,omitempty"` + Hostname *string `json:"hostname,omitempty"` + TargetRef *corev1.ObjectReferenceApplyConfiguration `json:"targetRef,omitempty"` + DeprecatedTopology map[string]string `json:"deprecatedTopology,omitempty"` + NodeName *string `json:"nodeName,omitempty"` + Zone *string `json:"zone,omitempty"` + Hints *EndpointHintsApplyConfiguration `json:"hints,omitempty"` +} + +// EndpointApplyConfiguration constructs an declarative configuration of the Endpoint type for use with +// apply. +func Endpoint() *EndpointApplyConfiguration { + return &EndpointApplyConfiguration{} +} + +// WithAddresses adds the given value to the Addresses field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Addresses field. +func (b *EndpointApplyConfiguration) WithAddresses(values ...string) *EndpointApplyConfiguration { + for i := range values { + b.Addresses = append(b.Addresses, values[i]) + } + return b +} + +// WithConditions sets the Conditions field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Conditions field is set to the value of the last call. +func (b *EndpointApplyConfiguration) WithConditions(value *EndpointConditionsApplyConfiguration) *EndpointApplyConfiguration { + b.Conditions = value + return b +} + +// WithHostname sets the Hostname field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Hostname field is set to the value of the last call. +func (b *EndpointApplyConfiguration) WithHostname(value string) *EndpointApplyConfiguration { + b.Hostname = &value + return b +} + +// WithTargetRef sets the TargetRef field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the TargetRef field is set to the value of the last call. +func (b *EndpointApplyConfiguration) WithTargetRef(value *corev1.ObjectReferenceApplyConfiguration) *EndpointApplyConfiguration { + b.TargetRef = value + return b +} + +// WithDeprecatedTopology puts the entries into the DeprecatedTopology field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the DeprecatedTopology field, +// overwriting an existing map entries in DeprecatedTopology field with the same key. +func (b *EndpointApplyConfiguration) WithDeprecatedTopology(entries map[string]string) *EndpointApplyConfiguration { + if b.DeprecatedTopology == nil && len(entries) > 0 { + b.DeprecatedTopology = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.DeprecatedTopology[k] = v + } + return b +} + +// WithNodeName sets the NodeName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NodeName field is set to the value of the last call. +func (b *EndpointApplyConfiguration) WithNodeName(value string) *EndpointApplyConfiguration { + b.NodeName = &value + return b +} + +// WithZone sets the Zone field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Zone field is set to the value of the last call. +func (b *EndpointApplyConfiguration) WithZone(value string) *EndpointApplyConfiguration { + b.Zone = &value + return b +} + +// WithHints sets the Hints field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Hints field is set to the value of the last call. +func (b *EndpointApplyConfiguration) WithHints(value *EndpointHintsApplyConfiguration) *EndpointApplyConfiguration { + b.Hints = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/discovery/v1/endpointconditions.go b/vendor/k8s.io/client-go/applyconfigurations/discovery/v1/endpointconditions.go new file mode 100644 index 000000000000..68c25dd57c13 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/discovery/v1/endpointconditions.go @@ -0,0 +1,57 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// EndpointConditionsApplyConfiguration represents an declarative configuration of the EndpointConditions type for use +// with apply. +type EndpointConditionsApplyConfiguration struct { + Ready *bool `json:"ready,omitempty"` + Serving *bool `json:"serving,omitempty"` + Terminating *bool `json:"terminating,omitempty"` +} + +// EndpointConditionsApplyConfiguration constructs an declarative configuration of the EndpointConditions type for use with +// apply. +func EndpointConditions() *EndpointConditionsApplyConfiguration { + return &EndpointConditionsApplyConfiguration{} +} + +// WithReady sets the Ready field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Ready field is set to the value of the last call. +func (b *EndpointConditionsApplyConfiguration) WithReady(value bool) *EndpointConditionsApplyConfiguration { + b.Ready = &value + return b +} + +// WithServing sets the Serving field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Serving field is set to the value of the last call. +func (b *EndpointConditionsApplyConfiguration) WithServing(value bool) *EndpointConditionsApplyConfiguration { + b.Serving = &value + return b +} + +// WithTerminating sets the Terminating field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Terminating field is set to the value of the last call. +func (b *EndpointConditionsApplyConfiguration) WithTerminating(value bool) *EndpointConditionsApplyConfiguration { + b.Terminating = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/discovery/v1/endpointhints.go b/vendor/k8s.io/client-go/applyconfigurations/discovery/v1/endpointhints.go new file mode 100644 index 000000000000..6eb9f21a5130 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/discovery/v1/endpointhints.go @@ -0,0 +1,44 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// EndpointHintsApplyConfiguration represents an declarative configuration of the EndpointHints type for use +// with apply. +type EndpointHintsApplyConfiguration struct { + ForZones []ForZoneApplyConfiguration `json:"forZones,omitempty"` +} + +// EndpointHintsApplyConfiguration constructs an declarative configuration of the EndpointHints type for use with +// apply. +func EndpointHints() *EndpointHintsApplyConfiguration { + return &EndpointHintsApplyConfiguration{} +} + +// WithForZones adds the given value to the ForZones field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the ForZones field. +func (b *EndpointHintsApplyConfiguration) WithForZones(values ...*ForZoneApplyConfiguration) *EndpointHintsApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithForZones") + } + b.ForZones = append(b.ForZones, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/discovery/v1/endpointport.go b/vendor/k8s.io/client-go/applyconfigurations/discovery/v1/endpointport.go new file mode 100644 index 000000000000..c71295600948 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/discovery/v1/endpointport.go @@ -0,0 +1,70 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/core/v1" +) + +// EndpointPortApplyConfiguration represents an declarative configuration of the EndpointPort type for use +// with apply. +type EndpointPortApplyConfiguration struct { + Name *string `json:"name,omitempty"` + Protocol *v1.Protocol `json:"protocol,omitempty"` + Port *int32 `json:"port,omitempty"` + AppProtocol *string `json:"appProtocol,omitempty"` +} + +// EndpointPortApplyConfiguration constructs an declarative configuration of the EndpointPort type for use with +// apply. +func EndpointPort() *EndpointPortApplyConfiguration { + return &EndpointPortApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *EndpointPortApplyConfiguration) WithName(value string) *EndpointPortApplyConfiguration { + b.Name = &value + return b +} + +// WithProtocol sets the Protocol field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Protocol field is set to the value of the last call. +func (b *EndpointPortApplyConfiguration) WithProtocol(value v1.Protocol) *EndpointPortApplyConfiguration { + b.Protocol = &value + return b +} + +// WithPort sets the Port field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Port field is set to the value of the last call. +func (b *EndpointPortApplyConfiguration) WithPort(value int32) *EndpointPortApplyConfiguration { + b.Port = &value + return b +} + +// WithAppProtocol sets the AppProtocol field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AppProtocol field is set to the value of the last call. +func (b *EndpointPortApplyConfiguration) WithAppProtocol(value string) *EndpointPortApplyConfiguration { + b.AppProtocol = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/discovery/v1/endpointslice.go b/vendor/k8s.io/client-go/applyconfigurations/discovery/v1/endpointslice.go new file mode 100644 index 000000000000..681013f0415e --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/discovery/v1/endpointslice.go @@ -0,0 +1,284 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + discoveryv1 "k8s.io/api/discovery/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// EndpointSliceApplyConfiguration represents an declarative configuration of the EndpointSlice type for use +// with apply. +type EndpointSliceApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + AddressType *discoveryv1.AddressType `json:"addressType,omitempty"` + Endpoints []EndpointApplyConfiguration `json:"endpoints,omitempty"` + Ports []EndpointPortApplyConfiguration `json:"ports,omitempty"` +} + +// EndpointSlice constructs an declarative configuration of the EndpointSlice type for use with +// apply. +func EndpointSlice(name, namespace string) *EndpointSliceApplyConfiguration { + b := &EndpointSliceApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("EndpointSlice") + b.WithAPIVersion("discovery.k8s.io/v1") + return b +} + +// ExtractEndpointSlice extracts the applied configuration owned by fieldManager from +// endpointSlice. If no managedFields are found in endpointSlice for fieldManager, a +// EndpointSliceApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// endpointSlice must be a unmodified EndpointSlice API object that was retrieved from the Kubernetes API. +// ExtractEndpointSlice provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractEndpointSlice(endpointSlice *discoveryv1.EndpointSlice, fieldManager string) (*EndpointSliceApplyConfiguration, error) { + b := &EndpointSliceApplyConfiguration{} + err := managedfields.ExtractInto(endpointSlice, internal.Parser().Type("io.k8s.api.discovery.v1.EndpointSlice"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(endpointSlice.Name) + b.WithNamespace(endpointSlice.Namespace) + + b.WithKind("EndpointSlice") + b.WithAPIVersion("discovery.k8s.io/v1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *EndpointSliceApplyConfiguration) WithKind(value string) *EndpointSliceApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *EndpointSliceApplyConfiguration) WithAPIVersion(value string) *EndpointSliceApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *EndpointSliceApplyConfiguration) WithName(value string) *EndpointSliceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *EndpointSliceApplyConfiguration) WithGenerateName(value string) *EndpointSliceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *EndpointSliceApplyConfiguration) WithNamespace(value string) *EndpointSliceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *EndpointSliceApplyConfiguration) WithSelfLink(value string) *EndpointSliceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *EndpointSliceApplyConfiguration) WithUID(value types.UID) *EndpointSliceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *EndpointSliceApplyConfiguration) WithResourceVersion(value string) *EndpointSliceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *EndpointSliceApplyConfiguration) WithGeneration(value int64) *EndpointSliceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *EndpointSliceApplyConfiguration) WithCreationTimestamp(value metav1.Time) *EndpointSliceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *EndpointSliceApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *EndpointSliceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *EndpointSliceApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *EndpointSliceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *EndpointSliceApplyConfiguration) WithLabels(entries map[string]string) *EndpointSliceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *EndpointSliceApplyConfiguration) WithAnnotations(entries map[string]string) *EndpointSliceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *EndpointSliceApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *EndpointSliceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *EndpointSliceApplyConfiguration) WithFinalizers(values ...string) *EndpointSliceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *EndpointSliceApplyConfiguration) WithClusterName(value string) *EndpointSliceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *EndpointSliceApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithAddressType sets the AddressType field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AddressType field is set to the value of the last call. +func (b *EndpointSliceApplyConfiguration) WithAddressType(value discoveryv1.AddressType) *EndpointSliceApplyConfiguration { + b.AddressType = &value + return b +} + +// WithEndpoints adds the given value to the Endpoints field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Endpoints field. +func (b *EndpointSliceApplyConfiguration) WithEndpoints(values ...*EndpointApplyConfiguration) *EndpointSliceApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithEndpoints") + } + b.Endpoints = append(b.Endpoints, *values[i]) + } + return b +} + +// WithPorts adds the given value to the Ports field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Ports field. +func (b *EndpointSliceApplyConfiguration) WithPorts(values ...*EndpointPortApplyConfiguration) *EndpointSliceApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithPorts") + } + b.Ports = append(b.Ports, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/discovery/v1/forzone.go b/vendor/k8s.io/client-go/applyconfigurations/discovery/v1/forzone.go new file mode 100644 index 000000000000..192a5ad2e8ce --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/discovery/v1/forzone.go @@ -0,0 +1,39 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// ForZoneApplyConfiguration represents an declarative configuration of the ForZone type for use +// with apply. +type ForZoneApplyConfiguration struct { + Name *string `json:"name,omitempty"` +} + +// ForZoneApplyConfiguration constructs an declarative configuration of the ForZone type for use with +// apply. +func ForZone() *ForZoneApplyConfiguration { + return &ForZoneApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ForZoneApplyConfiguration) WithName(value string) *ForZoneApplyConfiguration { + b.Name = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/discovery/v1beta1/endpoint.go b/vendor/k8s.io/client-go/applyconfigurations/discovery/v1beta1/endpoint.go new file mode 100644 index 000000000000..724c2d007c0b --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/discovery/v1beta1/endpoint.go @@ -0,0 +1,105 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1 "k8s.io/client-go/applyconfigurations/core/v1" +) + +// EndpointApplyConfiguration represents an declarative configuration of the Endpoint type for use +// with apply. +type EndpointApplyConfiguration struct { + Addresses []string `json:"addresses,omitempty"` + Conditions *EndpointConditionsApplyConfiguration `json:"conditions,omitempty"` + Hostname *string `json:"hostname,omitempty"` + TargetRef *v1.ObjectReferenceApplyConfiguration `json:"targetRef,omitempty"` + Topology map[string]string `json:"topology,omitempty"` + NodeName *string `json:"nodeName,omitempty"` + Hints *EndpointHintsApplyConfiguration `json:"hints,omitempty"` +} + +// EndpointApplyConfiguration constructs an declarative configuration of the Endpoint type for use with +// apply. +func Endpoint() *EndpointApplyConfiguration { + return &EndpointApplyConfiguration{} +} + +// WithAddresses adds the given value to the Addresses field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Addresses field. +func (b *EndpointApplyConfiguration) WithAddresses(values ...string) *EndpointApplyConfiguration { + for i := range values { + b.Addresses = append(b.Addresses, values[i]) + } + return b +} + +// WithConditions sets the Conditions field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Conditions field is set to the value of the last call. +func (b *EndpointApplyConfiguration) WithConditions(value *EndpointConditionsApplyConfiguration) *EndpointApplyConfiguration { + b.Conditions = value + return b +} + +// WithHostname sets the Hostname field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Hostname field is set to the value of the last call. +func (b *EndpointApplyConfiguration) WithHostname(value string) *EndpointApplyConfiguration { + b.Hostname = &value + return b +} + +// WithTargetRef sets the TargetRef field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the TargetRef field is set to the value of the last call. +func (b *EndpointApplyConfiguration) WithTargetRef(value *v1.ObjectReferenceApplyConfiguration) *EndpointApplyConfiguration { + b.TargetRef = value + return b +} + +// WithTopology puts the entries into the Topology field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Topology field, +// overwriting an existing map entries in Topology field with the same key. +func (b *EndpointApplyConfiguration) WithTopology(entries map[string]string) *EndpointApplyConfiguration { + if b.Topology == nil && len(entries) > 0 { + b.Topology = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Topology[k] = v + } + return b +} + +// WithNodeName sets the NodeName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NodeName field is set to the value of the last call. +func (b *EndpointApplyConfiguration) WithNodeName(value string) *EndpointApplyConfiguration { + b.NodeName = &value + return b +} + +// WithHints sets the Hints field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Hints field is set to the value of the last call. +func (b *EndpointApplyConfiguration) WithHints(value *EndpointHintsApplyConfiguration) *EndpointApplyConfiguration { + b.Hints = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/discovery/v1beta1/endpointconditions.go b/vendor/k8s.io/client-go/applyconfigurations/discovery/v1beta1/endpointconditions.go new file mode 100644 index 000000000000..bc0438f90b6b --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/discovery/v1beta1/endpointconditions.go @@ -0,0 +1,57 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// EndpointConditionsApplyConfiguration represents an declarative configuration of the EndpointConditions type for use +// with apply. +type EndpointConditionsApplyConfiguration struct { + Ready *bool `json:"ready,omitempty"` + Serving *bool `json:"serving,omitempty"` + Terminating *bool `json:"terminating,omitempty"` +} + +// EndpointConditionsApplyConfiguration constructs an declarative configuration of the EndpointConditions type for use with +// apply. +func EndpointConditions() *EndpointConditionsApplyConfiguration { + return &EndpointConditionsApplyConfiguration{} +} + +// WithReady sets the Ready field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Ready field is set to the value of the last call. +func (b *EndpointConditionsApplyConfiguration) WithReady(value bool) *EndpointConditionsApplyConfiguration { + b.Ready = &value + return b +} + +// WithServing sets the Serving field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Serving field is set to the value of the last call. +func (b *EndpointConditionsApplyConfiguration) WithServing(value bool) *EndpointConditionsApplyConfiguration { + b.Serving = &value + return b +} + +// WithTerminating sets the Terminating field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Terminating field is set to the value of the last call. +func (b *EndpointConditionsApplyConfiguration) WithTerminating(value bool) *EndpointConditionsApplyConfiguration { + b.Terminating = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/discovery/v1beta1/endpointhints.go b/vendor/k8s.io/client-go/applyconfigurations/discovery/v1beta1/endpointhints.go new file mode 100644 index 000000000000..41d80206b3b9 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/discovery/v1beta1/endpointhints.go @@ -0,0 +1,44 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// EndpointHintsApplyConfiguration represents an declarative configuration of the EndpointHints type for use +// with apply. +type EndpointHintsApplyConfiguration struct { + ForZones []ForZoneApplyConfiguration `json:"forZones,omitempty"` +} + +// EndpointHintsApplyConfiguration constructs an declarative configuration of the EndpointHints type for use with +// apply. +func EndpointHints() *EndpointHintsApplyConfiguration { + return &EndpointHintsApplyConfiguration{} +} + +// WithForZones adds the given value to the ForZones field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the ForZones field. +func (b *EndpointHintsApplyConfiguration) WithForZones(values ...*ForZoneApplyConfiguration) *EndpointHintsApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithForZones") + } + b.ForZones = append(b.ForZones, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/discovery/v1beta1/endpointport.go b/vendor/k8s.io/client-go/applyconfigurations/discovery/v1beta1/endpointport.go new file mode 100644 index 000000000000..9a3a31b965ac --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/discovery/v1beta1/endpointport.go @@ -0,0 +1,70 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1 "k8s.io/api/core/v1" +) + +// EndpointPortApplyConfiguration represents an declarative configuration of the EndpointPort type for use +// with apply. +type EndpointPortApplyConfiguration struct { + Name *string `json:"name,omitempty"` + Protocol *v1.Protocol `json:"protocol,omitempty"` + Port *int32 `json:"port,omitempty"` + AppProtocol *string `json:"appProtocol,omitempty"` +} + +// EndpointPortApplyConfiguration constructs an declarative configuration of the EndpointPort type for use with +// apply. +func EndpointPort() *EndpointPortApplyConfiguration { + return &EndpointPortApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *EndpointPortApplyConfiguration) WithName(value string) *EndpointPortApplyConfiguration { + b.Name = &value + return b +} + +// WithProtocol sets the Protocol field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Protocol field is set to the value of the last call. +func (b *EndpointPortApplyConfiguration) WithProtocol(value v1.Protocol) *EndpointPortApplyConfiguration { + b.Protocol = &value + return b +} + +// WithPort sets the Port field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Port field is set to the value of the last call. +func (b *EndpointPortApplyConfiguration) WithPort(value int32) *EndpointPortApplyConfiguration { + b.Port = &value + return b +} + +// WithAppProtocol sets the AppProtocol field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AppProtocol field is set to the value of the last call. +func (b *EndpointPortApplyConfiguration) WithAppProtocol(value string) *EndpointPortApplyConfiguration { + b.AppProtocol = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/discovery/v1beta1/endpointslice.go b/vendor/k8s.io/client-go/applyconfigurations/discovery/v1beta1/endpointslice.go new file mode 100644 index 000000000000..a96708225a74 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/discovery/v1beta1/endpointslice.go @@ -0,0 +1,284 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1beta1 "k8s.io/api/discovery/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// EndpointSliceApplyConfiguration represents an declarative configuration of the EndpointSlice type for use +// with apply. +type EndpointSliceApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + AddressType *v1beta1.AddressType `json:"addressType,omitempty"` + Endpoints []EndpointApplyConfiguration `json:"endpoints,omitempty"` + Ports []EndpointPortApplyConfiguration `json:"ports,omitempty"` +} + +// EndpointSlice constructs an declarative configuration of the EndpointSlice type for use with +// apply. +func EndpointSlice(name, namespace string) *EndpointSliceApplyConfiguration { + b := &EndpointSliceApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("EndpointSlice") + b.WithAPIVersion("discovery.k8s.io/v1beta1") + return b +} + +// ExtractEndpointSlice extracts the applied configuration owned by fieldManager from +// endpointSlice. If no managedFields are found in endpointSlice for fieldManager, a +// EndpointSliceApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// endpointSlice must be a unmodified EndpointSlice API object that was retrieved from the Kubernetes API. +// ExtractEndpointSlice provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractEndpointSlice(endpointSlice *v1beta1.EndpointSlice, fieldManager string) (*EndpointSliceApplyConfiguration, error) { + b := &EndpointSliceApplyConfiguration{} + err := managedfields.ExtractInto(endpointSlice, internal.Parser().Type("io.k8s.api.discovery.v1beta1.EndpointSlice"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(endpointSlice.Name) + b.WithNamespace(endpointSlice.Namespace) + + b.WithKind("EndpointSlice") + b.WithAPIVersion("discovery.k8s.io/v1beta1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *EndpointSliceApplyConfiguration) WithKind(value string) *EndpointSliceApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *EndpointSliceApplyConfiguration) WithAPIVersion(value string) *EndpointSliceApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *EndpointSliceApplyConfiguration) WithName(value string) *EndpointSliceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *EndpointSliceApplyConfiguration) WithGenerateName(value string) *EndpointSliceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *EndpointSliceApplyConfiguration) WithNamespace(value string) *EndpointSliceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *EndpointSliceApplyConfiguration) WithSelfLink(value string) *EndpointSliceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *EndpointSliceApplyConfiguration) WithUID(value types.UID) *EndpointSliceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *EndpointSliceApplyConfiguration) WithResourceVersion(value string) *EndpointSliceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *EndpointSliceApplyConfiguration) WithGeneration(value int64) *EndpointSliceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *EndpointSliceApplyConfiguration) WithCreationTimestamp(value metav1.Time) *EndpointSliceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *EndpointSliceApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *EndpointSliceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *EndpointSliceApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *EndpointSliceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *EndpointSliceApplyConfiguration) WithLabels(entries map[string]string) *EndpointSliceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *EndpointSliceApplyConfiguration) WithAnnotations(entries map[string]string) *EndpointSliceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *EndpointSliceApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *EndpointSliceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *EndpointSliceApplyConfiguration) WithFinalizers(values ...string) *EndpointSliceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *EndpointSliceApplyConfiguration) WithClusterName(value string) *EndpointSliceApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *EndpointSliceApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithAddressType sets the AddressType field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AddressType field is set to the value of the last call. +func (b *EndpointSliceApplyConfiguration) WithAddressType(value v1beta1.AddressType) *EndpointSliceApplyConfiguration { + b.AddressType = &value + return b +} + +// WithEndpoints adds the given value to the Endpoints field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Endpoints field. +func (b *EndpointSliceApplyConfiguration) WithEndpoints(values ...*EndpointApplyConfiguration) *EndpointSliceApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithEndpoints") + } + b.Endpoints = append(b.Endpoints, *values[i]) + } + return b +} + +// WithPorts adds the given value to the Ports field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Ports field. +func (b *EndpointSliceApplyConfiguration) WithPorts(values ...*EndpointPortApplyConfiguration) *EndpointSliceApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithPorts") + } + b.Ports = append(b.Ports, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/discovery/v1beta1/forzone.go b/vendor/k8s.io/client-go/applyconfigurations/discovery/v1beta1/forzone.go new file mode 100644 index 000000000000..4d1455ed3849 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/discovery/v1beta1/forzone.go @@ -0,0 +1,39 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// ForZoneApplyConfiguration represents an declarative configuration of the ForZone type for use +// with apply. +type ForZoneApplyConfiguration struct { + Name *string `json:"name,omitempty"` +} + +// ForZoneApplyConfiguration constructs an declarative configuration of the ForZone type for use with +// apply. +func ForZone() *ForZoneApplyConfiguration { + return &ForZoneApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ForZoneApplyConfiguration) WithName(value string) *ForZoneApplyConfiguration { + b.Name = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/events/v1/event.go b/vendor/k8s.io/client-go/applyconfigurations/events/v1/event.go new file mode 100644 index 000000000000..860fff586ce5 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/events/v1/event.go @@ -0,0 +1,374 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + apieventsv1 "k8s.io/api/events/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + corev1 "k8s.io/client-go/applyconfigurations/core/v1" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// EventApplyConfiguration represents an declarative configuration of the Event type for use +// with apply. +type EventApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + EventTime *metav1.MicroTime `json:"eventTime,omitempty"` + Series *EventSeriesApplyConfiguration `json:"series,omitempty"` + ReportingController *string `json:"reportingController,omitempty"` + ReportingInstance *string `json:"reportingInstance,omitempty"` + Action *string `json:"action,omitempty"` + Reason *string `json:"reason,omitempty"` + Regarding *corev1.ObjectReferenceApplyConfiguration `json:"regarding,omitempty"` + Related *corev1.ObjectReferenceApplyConfiguration `json:"related,omitempty"` + Note *string `json:"note,omitempty"` + Type *string `json:"type,omitempty"` + DeprecatedSource *corev1.EventSourceApplyConfiguration `json:"deprecatedSource,omitempty"` + DeprecatedFirstTimestamp *metav1.Time `json:"deprecatedFirstTimestamp,omitempty"` + DeprecatedLastTimestamp *metav1.Time `json:"deprecatedLastTimestamp,omitempty"` + DeprecatedCount *int32 `json:"deprecatedCount,omitempty"` +} + +// Event constructs an declarative configuration of the Event type for use with +// apply. +func Event(name, namespace string) *EventApplyConfiguration { + b := &EventApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("Event") + b.WithAPIVersion("events.k8s.io/v1") + return b +} + +// ExtractEvent extracts the applied configuration owned by fieldManager from +// event. If no managedFields are found in event for fieldManager, a +// EventApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// event must be a unmodified Event API object that was retrieved from the Kubernetes API. +// ExtractEvent provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractEvent(event *apieventsv1.Event, fieldManager string) (*EventApplyConfiguration, error) { + b := &EventApplyConfiguration{} + err := managedfields.ExtractInto(event, internal.Parser().Type("io.k8s.api.events.v1.Event"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(event.Name) + b.WithNamespace(event.Namespace) + + b.WithKind("Event") + b.WithAPIVersion("events.k8s.io/v1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *EventApplyConfiguration) WithKind(value string) *EventApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *EventApplyConfiguration) WithAPIVersion(value string) *EventApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *EventApplyConfiguration) WithName(value string) *EventApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *EventApplyConfiguration) WithGenerateName(value string) *EventApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *EventApplyConfiguration) WithNamespace(value string) *EventApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *EventApplyConfiguration) WithSelfLink(value string) *EventApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *EventApplyConfiguration) WithUID(value types.UID) *EventApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *EventApplyConfiguration) WithResourceVersion(value string) *EventApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *EventApplyConfiguration) WithGeneration(value int64) *EventApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *EventApplyConfiguration) WithCreationTimestamp(value metav1.Time) *EventApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *EventApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *EventApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *EventApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *EventApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *EventApplyConfiguration) WithLabels(entries map[string]string) *EventApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *EventApplyConfiguration) WithAnnotations(entries map[string]string) *EventApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *EventApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *EventApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *EventApplyConfiguration) WithFinalizers(values ...string) *EventApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *EventApplyConfiguration) WithClusterName(value string) *EventApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *EventApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithEventTime sets the EventTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the EventTime field is set to the value of the last call. +func (b *EventApplyConfiguration) WithEventTime(value metav1.MicroTime) *EventApplyConfiguration { + b.EventTime = &value + return b +} + +// WithSeries sets the Series field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Series field is set to the value of the last call. +func (b *EventApplyConfiguration) WithSeries(value *EventSeriesApplyConfiguration) *EventApplyConfiguration { + b.Series = value + return b +} + +// WithReportingController sets the ReportingController field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReportingController field is set to the value of the last call. +func (b *EventApplyConfiguration) WithReportingController(value string) *EventApplyConfiguration { + b.ReportingController = &value + return b +} + +// WithReportingInstance sets the ReportingInstance field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReportingInstance field is set to the value of the last call. +func (b *EventApplyConfiguration) WithReportingInstance(value string) *EventApplyConfiguration { + b.ReportingInstance = &value + return b +} + +// WithAction sets the Action field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Action field is set to the value of the last call. +func (b *EventApplyConfiguration) WithAction(value string) *EventApplyConfiguration { + b.Action = &value + return b +} + +// WithReason sets the Reason field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Reason field is set to the value of the last call. +func (b *EventApplyConfiguration) WithReason(value string) *EventApplyConfiguration { + b.Reason = &value + return b +} + +// WithRegarding sets the Regarding field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Regarding field is set to the value of the last call. +func (b *EventApplyConfiguration) WithRegarding(value *corev1.ObjectReferenceApplyConfiguration) *EventApplyConfiguration { + b.Regarding = value + return b +} + +// WithRelated sets the Related field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Related field is set to the value of the last call. +func (b *EventApplyConfiguration) WithRelated(value *corev1.ObjectReferenceApplyConfiguration) *EventApplyConfiguration { + b.Related = value + return b +} + +// WithNote sets the Note field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Note field is set to the value of the last call. +func (b *EventApplyConfiguration) WithNote(value string) *EventApplyConfiguration { + b.Note = &value + return b +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *EventApplyConfiguration) WithType(value string) *EventApplyConfiguration { + b.Type = &value + return b +} + +// WithDeprecatedSource sets the DeprecatedSource field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeprecatedSource field is set to the value of the last call. +func (b *EventApplyConfiguration) WithDeprecatedSource(value *corev1.EventSourceApplyConfiguration) *EventApplyConfiguration { + b.DeprecatedSource = value + return b +} + +// WithDeprecatedFirstTimestamp sets the DeprecatedFirstTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeprecatedFirstTimestamp field is set to the value of the last call. +func (b *EventApplyConfiguration) WithDeprecatedFirstTimestamp(value metav1.Time) *EventApplyConfiguration { + b.DeprecatedFirstTimestamp = &value + return b +} + +// WithDeprecatedLastTimestamp sets the DeprecatedLastTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeprecatedLastTimestamp field is set to the value of the last call. +func (b *EventApplyConfiguration) WithDeprecatedLastTimestamp(value metav1.Time) *EventApplyConfiguration { + b.DeprecatedLastTimestamp = &value + return b +} + +// WithDeprecatedCount sets the DeprecatedCount field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeprecatedCount field is set to the value of the last call. +func (b *EventApplyConfiguration) WithDeprecatedCount(value int32) *EventApplyConfiguration { + b.DeprecatedCount = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/events/v1/eventseries.go b/vendor/k8s.io/client-go/applyconfigurations/events/v1/eventseries.go new file mode 100644 index 000000000000..e66fb412712b --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/events/v1/eventseries.go @@ -0,0 +1,52 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// EventSeriesApplyConfiguration represents an declarative configuration of the EventSeries type for use +// with apply. +type EventSeriesApplyConfiguration struct { + Count *int32 `json:"count,omitempty"` + LastObservedTime *v1.MicroTime `json:"lastObservedTime,omitempty"` +} + +// EventSeriesApplyConfiguration constructs an declarative configuration of the EventSeries type for use with +// apply. +func EventSeries() *EventSeriesApplyConfiguration { + return &EventSeriesApplyConfiguration{} +} + +// WithCount sets the Count field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Count field is set to the value of the last call. +func (b *EventSeriesApplyConfiguration) WithCount(value int32) *EventSeriesApplyConfiguration { + b.Count = &value + return b +} + +// WithLastObservedTime sets the LastObservedTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastObservedTime field is set to the value of the last call. +func (b *EventSeriesApplyConfiguration) WithLastObservedTime(value v1.MicroTime) *EventSeriesApplyConfiguration { + b.LastObservedTime = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/events/v1beta1/event.go b/vendor/k8s.io/client-go/applyconfigurations/events/v1beta1/event.go new file mode 100644 index 000000000000..65057f957b4f --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/events/v1beta1/event.go @@ -0,0 +1,374 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + eventsv1beta1 "k8s.io/api/events/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + corev1 "k8s.io/client-go/applyconfigurations/core/v1" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// EventApplyConfiguration represents an declarative configuration of the Event type for use +// with apply. +type EventApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + EventTime *metav1.MicroTime `json:"eventTime,omitempty"` + Series *EventSeriesApplyConfiguration `json:"series,omitempty"` + ReportingController *string `json:"reportingController,omitempty"` + ReportingInstance *string `json:"reportingInstance,omitempty"` + Action *string `json:"action,omitempty"` + Reason *string `json:"reason,omitempty"` + Regarding *corev1.ObjectReferenceApplyConfiguration `json:"regarding,omitempty"` + Related *corev1.ObjectReferenceApplyConfiguration `json:"related,omitempty"` + Note *string `json:"note,omitempty"` + Type *string `json:"type,omitempty"` + DeprecatedSource *corev1.EventSourceApplyConfiguration `json:"deprecatedSource,omitempty"` + DeprecatedFirstTimestamp *metav1.Time `json:"deprecatedFirstTimestamp,omitempty"` + DeprecatedLastTimestamp *metav1.Time `json:"deprecatedLastTimestamp,omitempty"` + DeprecatedCount *int32 `json:"deprecatedCount,omitempty"` +} + +// Event constructs an declarative configuration of the Event type for use with +// apply. +func Event(name, namespace string) *EventApplyConfiguration { + b := &EventApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("Event") + b.WithAPIVersion("events.k8s.io/v1beta1") + return b +} + +// ExtractEvent extracts the applied configuration owned by fieldManager from +// event. If no managedFields are found in event for fieldManager, a +// EventApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// event must be a unmodified Event API object that was retrieved from the Kubernetes API. +// ExtractEvent provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractEvent(event *eventsv1beta1.Event, fieldManager string) (*EventApplyConfiguration, error) { + b := &EventApplyConfiguration{} + err := managedfields.ExtractInto(event, internal.Parser().Type("io.k8s.api.events.v1beta1.Event"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(event.Name) + b.WithNamespace(event.Namespace) + + b.WithKind("Event") + b.WithAPIVersion("events.k8s.io/v1beta1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *EventApplyConfiguration) WithKind(value string) *EventApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *EventApplyConfiguration) WithAPIVersion(value string) *EventApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *EventApplyConfiguration) WithName(value string) *EventApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *EventApplyConfiguration) WithGenerateName(value string) *EventApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *EventApplyConfiguration) WithNamespace(value string) *EventApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *EventApplyConfiguration) WithSelfLink(value string) *EventApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *EventApplyConfiguration) WithUID(value types.UID) *EventApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *EventApplyConfiguration) WithResourceVersion(value string) *EventApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *EventApplyConfiguration) WithGeneration(value int64) *EventApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *EventApplyConfiguration) WithCreationTimestamp(value metav1.Time) *EventApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *EventApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *EventApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *EventApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *EventApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *EventApplyConfiguration) WithLabels(entries map[string]string) *EventApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *EventApplyConfiguration) WithAnnotations(entries map[string]string) *EventApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *EventApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *EventApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *EventApplyConfiguration) WithFinalizers(values ...string) *EventApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *EventApplyConfiguration) WithClusterName(value string) *EventApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *EventApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithEventTime sets the EventTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the EventTime field is set to the value of the last call. +func (b *EventApplyConfiguration) WithEventTime(value metav1.MicroTime) *EventApplyConfiguration { + b.EventTime = &value + return b +} + +// WithSeries sets the Series field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Series field is set to the value of the last call. +func (b *EventApplyConfiguration) WithSeries(value *EventSeriesApplyConfiguration) *EventApplyConfiguration { + b.Series = value + return b +} + +// WithReportingController sets the ReportingController field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReportingController field is set to the value of the last call. +func (b *EventApplyConfiguration) WithReportingController(value string) *EventApplyConfiguration { + b.ReportingController = &value + return b +} + +// WithReportingInstance sets the ReportingInstance field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReportingInstance field is set to the value of the last call. +func (b *EventApplyConfiguration) WithReportingInstance(value string) *EventApplyConfiguration { + b.ReportingInstance = &value + return b +} + +// WithAction sets the Action field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Action field is set to the value of the last call. +func (b *EventApplyConfiguration) WithAction(value string) *EventApplyConfiguration { + b.Action = &value + return b +} + +// WithReason sets the Reason field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Reason field is set to the value of the last call. +func (b *EventApplyConfiguration) WithReason(value string) *EventApplyConfiguration { + b.Reason = &value + return b +} + +// WithRegarding sets the Regarding field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Regarding field is set to the value of the last call. +func (b *EventApplyConfiguration) WithRegarding(value *corev1.ObjectReferenceApplyConfiguration) *EventApplyConfiguration { + b.Regarding = value + return b +} + +// WithRelated sets the Related field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Related field is set to the value of the last call. +func (b *EventApplyConfiguration) WithRelated(value *corev1.ObjectReferenceApplyConfiguration) *EventApplyConfiguration { + b.Related = value + return b +} + +// WithNote sets the Note field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Note field is set to the value of the last call. +func (b *EventApplyConfiguration) WithNote(value string) *EventApplyConfiguration { + b.Note = &value + return b +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *EventApplyConfiguration) WithType(value string) *EventApplyConfiguration { + b.Type = &value + return b +} + +// WithDeprecatedSource sets the DeprecatedSource field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeprecatedSource field is set to the value of the last call. +func (b *EventApplyConfiguration) WithDeprecatedSource(value *corev1.EventSourceApplyConfiguration) *EventApplyConfiguration { + b.DeprecatedSource = value + return b +} + +// WithDeprecatedFirstTimestamp sets the DeprecatedFirstTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeprecatedFirstTimestamp field is set to the value of the last call. +func (b *EventApplyConfiguration) WithDeprecatedFirstTimestamp(value metav1.Time) *EventApplyConfiguration { + b.DeprecatedFirstTimestamp = &value + return b +} + +// WithDeprecatedLastTimestamp sets the DeprecatedLastTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeprecatedLastTimestamp field is set to the value of the last call. +func (b *EventApplyConfiguration) WithDeprecatedLastTimestamp(value metav1.Time) *EventApplyConfiguration { + b.DeprecatedLastTimestamp = &value + return b +} + +// WithDeprecatedCount sets the DeprecatedCount field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeprecatedCount field is set to the value of the last call. +func (b *EventApplyConfiguration) WithDeprecatedCount(value int32) *EventApplyConfiguration { + b.DeprecatedCount = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/events/v1beta1/eventseries.go b/vendor/k8s.io/client-go/applyconfigurations/events/v1beta1/eventseries.go new file mode 100644 index 000000000000..640a265172bd --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/events/v1beta1/eventseries.go @@ -0,0 +1,52 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// EventSeriesApplyConfiguration represents an declarative configuration of the EventSeries type for use +// with apply. +type EventSeriesApplyConfiguration struct { + Count *int32 `json:"count,omitempty"` + LastObservedTime *v1.MicroTime `json:"lastObservedTime,omitempty"` +} + +// EventSeriesApplyConfiguration constructs an declarative configuration of the EventSeries type for use with +// apply. +func EventSeries() *EventSeriesApplyConfiguration { + return &EventSeriesApplyConfiguration{} +} + +// WithCount sets the Count field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Count field is set to the value of the last call. +func (b *EventSeriesApplyConfiguration) WithCount(value int32) *EventSeriesApplyConfiguration { + b.Count = &value + return b +} + +// WithLastObservedTime sets the LastObservedTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastObservedTime field is set to the value of the last call. +func (b *EventSeriesApplyConfiguration) WithLastObservedTime(value v1.MicroTime) *EventSeriesApplyConfiguration { + b.LastObservedTime = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/allowedcsidriver.go b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/allowedcsidriver.go new file mode 100644 index 000000000000..27b49bf15384 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/allowedcsidriver.go @@ -0,0 +1,39 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// AllowedCSIDriverApplyConfiguration represents an declarative configuration of the AllowedCSIDriver type for use +// with apply. +type AllowedCSIDriverApplyConfiguration struct { + Name *string `json:"name,omitempty"` +} + +// AllowedCSIDriverApplyConfiguration constructs an declarative configuration of the AllowedCSIDriver type for use with +// apply. +func AllowedCSIDriver() *AllowedCSIDriverApplyConfiguration { + return &AllowedCSIDriverApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *AllowedCSIDriverApplyConfiguration) WithName(value string) *AllowedCSIDriverApplyConfiguration { + b.Name = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/allowedflexvolume.go b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/allowedflexvolume.go new file mode 100644 index 000000000000..30c3724cfee9 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/allowedflexvolume.go @@ -0,0 +1,39 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// AllowedFlexVolumeApplyConfiguration represents an declarative configuration of the AllowedFlexVolume type for use +// with apply. +type AllowedFlexVolumeApplyConfiguration struct { + Driver *string `json:"driver,omitempty"` +} + +// AllowedFlexVolumeApplyConfiguration constructs an declarative configuration of the AllowedFlexVolume type for use with +// apply. +func AllowedFlexVolume() *AllowedFlexVolumeApplyConfiguration { + return &AllowedFlexVolumeApplyConfiguration{} +} + +// WithDriver sets the Driver field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Driver field is set to the value of the last call. +func (b *AllowedFlexVolumeApplyConfiguration) WithDriver(value string) *AllowedFlexVolumeApplyConfiguration { + b.Driver = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/allowedhostpath.go b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/allowedhostpath.go new file mode 100644 index 000000000000..493815d8d4a5 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/allowedhostpath.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// AllowedHostPathApplyConfiguration represents an declarative configuration of the AllowedHostPath type for use +// with apply. +type AllowedHostPathApplyConfiguration struct { + PathPrefix *string `json:"pathPrefix,omitempty"` + ReadOnly *bool `json:"readOnly,omitempty"` +} + +// AllowedHostPathApplyConfiguration constructs an declarative configuration of the AllowedHostPath type for use with +// apply. +func AllowedHostPath() *AllowedHostPathApplyConfiguration { + return &AllowedHostPathApplyConfiguration{} +} + +// WithPathPrefix sets the PathPrefix field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PathPrefix field is set to the value of the last call. +func (b *AllowedHostPathApplyConfiguration) WithPathPrefix(value string) *AllowedHostPathApplyConfiguration { + b.PathPrefix = &value + return b +} + +// WithReadOnly sets the ReadOnly field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadOnly field is set to the value of the last call. +func (b *AllowedHostPathApplyConfiguration) WithReadOnly(value bool) *AllowedHostPathApplyConfiguration { + b.ReadOnly = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/daemonset.go b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/daemonset.go new file mode 100644 index 000000000000..09777e4340d4 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/daemonset.go @@ -0,0 +1,265 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + extensionsv1beta1 "k8s.io/api/extensions/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// DaemonSetApplyConfiguration represents an declarative configuration of the DaemonSet type for use +// with apply. +type DaemonSetApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *DaemonSetSpecApplyConfiguration `json:"spec,omitempty"` + Status *DaemonSetStatusApplyConfiguration `json:"status,omitempty"` +} + +// DaemonSet constructs an declarative configuration of the DaemonSet type for use with +// apply. +func DaemonSet(name, namespace string) *DaemonSetApplyConfiguration { + b := &DaemonSetApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("DaemonSet") + b.WithAPIVersion("extensions/v1beta1") + return b +} + +// ExtractDaemonSet extracts the applied configuration owned by fieldManager from +// daemonSet. If no managedFields are found in daemonSet for fieldManager, a +// DaemonSetApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// daemonSet must be a unmodified DaemonSet API object that was retrieved from the Kubernetes API. +// ExtractDaemonSet provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractDaemonSet(daemonSet *extensionsv1beta1.DaemonSet, fieldManager string) (*DaemonSetApplyConfiguration, error) { + b := &DaemonSetApplyConfiguration{} + err := managedfields.ExtractInto(daemonSet, internal.Parser().Type("io.k8s.api.extensions.v1beta1.DaemonSet"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(daemonSet.Name) + b.WithNamespace(daemonSet.Namespace) + + b.WithKind("DaemonSet") + b.WithAPIVersion("extensions/v1beta1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *DaemonSetApplyConfiguration) WithKind(value string) *DaemonSetApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *DaemonSetApplyConfiguration) WithAPIVersion(value string) *DaemonSetApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *DaemonSetApplyConfiguration) WithName(value string) *DaemonSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *DaemonSetApplyConfiguration) WithGenerateName(value string) *DaemonSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *DaemonSetApplyConfiguration) WithNamespace(value string) *DaemonSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *DaemonSetApplyConfiguration) WithSelfLink(value string) *DaemonSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *DaemonSetApplyConfiguration) WithUID(value types.UID) *DaemonSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *DaemonSetApplyConfiguration) WithResourceVersion(value string) *DaemonSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *DaemonSetApplyConfiguration) WithGeneration(value int64) *DaemonSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *DaemonSetApplyConfiguration) WithCreationTimestamp(value metav1.Time) *DaemonSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *DaemonSetApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *DaemonSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *DaemonSetApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *DaemonSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *DaemonSetApplyConfiguration) WithLabels(entries map[string]string) *DaemonSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *DaemonSetApplyConfiguration) WithAnnotations(entries map[string]string) *DaemonSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *DaemonSetApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *DaemonSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *DaemonSetApplyConfiguration) WithFinalizers(values ...string) *DaemonSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *DaemonSetApplyConfiguration) WithClusterName(value string) *DaemonSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *DaemonSetApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *DaemonSetApplyConfiguration) WithSpec(value *DaemonSetSpecApplyConfiguration) *DaemonSetApplyConfiguration { + b.Spec = value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *DaemonSetApplyConfiguration) WithStatus(value *DaemonSetStatusApplyConfiguration) *DaemonSetApplyConfiguration { + b.Status = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/daemonsetcondition.go b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/daemonsetcondition.go new file mode 100644 index 000000000000..bbf718f0f243 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/daemonsetcondition.go @@ -0,0 +1,81 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1 "k8s.io/api/core/v1" + v1beta1 "k8s.io/api/extensions/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// DaemonSetConditionApplyConfiguration represents an declarative configuration of the DaemonSetCondition type for use +// with apply. +type DaemonSetConditionApplyConfiguration struct { + Type *v1beta1.DaemonSetConditionType `json:"type,omitempty"` + Status *v1.ConditionStatus `json:"status,omitempty"` + LastTransitionTime *metav1.Time `json:"lastTransitionTime,omitempty"` + Reason *string `json:"reason,omitempty"` + Message *string `json:"message,omitempty"` +} + +// DaemonSetConditionApplyConfiguration constructs an declarative configuration of the DaemonSetCondition type for use with +// apply. +func DaemonSetCondition() *DaemonSetConditionApplyConfiguration { + return &DaemonSetConditionApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *DaemonSetConditionApplyConfiguration) WithType(value v1beta1.DaemonSetConditionType) *DaemonSetConditionApplyConfiguration { + b.Type = &value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *DaemonSetConditionApplyConfiguration) WithStatus(value v1.ConditionStatus) *DaemonSetConditionApplyConfiguration { + b.Status = &value + return b +} + +// WithLastTransitionTime sets the LastTransitionTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastTransitionTime field is set to the value of the last call. +func (b *DaemonSetConditionApplyConfiguration) WithLastTransitionTime(value metav1.Time) *DaemonSetConditionApplyConfiguration { + b.LastTransitionTime = &value + return b +} + +// WithReason sets the Reason field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Reason field is set to the value of the last call. +func (b *DaemonSetConditionApplyConfiguration) WithReason(value string) *DaemonSetConditionApplyConfiguration { + b.Reason = &value + return b +} + +// WithMessage sets the Message field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Message field is set to the value of the last call. +func (b *DaemonSetConditionApplyConfiguration) WithMessage(value string) *DaemonSetConditionApplyConfiguration { + b.Message = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/daemonsetspec.go b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/daemonsetspec.go new file mode 100644 index 000000000000..b5d7a0c161d5 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/daemonsetspec.go @@ -0,0 +1,89 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + corev1 "k8s.io/client-go/applyconfigurations/core/v1" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// DaemonSetSpecApplyConfiguration represents an declarative configuration of the DaemonSetSpec type for use +// with apply. +type DaemonSetSpecApplyConfiguration struct { + Selector *v1.LabelSelectorApplyConfiguration `json:"selector,omitempty"` + Template *corev1.PodTemplateSpecApplyConfiguration `json:"template,omitempty"` + UpdateStrategy *DaemonSetUpdateStrategyApplyConfiguration `json:"updateStrategy,omitempty"` + MinReadySeconds *int32 `json:"minReadySeconds,omitempty"` + TemplateGeneration *int64 `json:"templateGeneration,omitempty"` + RevisionHistoryLimit *int32 `json:"revisionHistoryLimit,omitempty"` +} + +// DaemonSetSpecApplyConfiguration constructs an declarative configuration of the DaemonSetSpec type for use with +// apply. +func DaemonSetSpec() *DaemonSetSpecApplyConfiguration { + return &DaemonSetSpecApplyConfiguration{} +} + +// WithSelector sets the Selector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Selector field is set to the value of the last call. +func (b *DaemonSetSpecApplyConfiguration) WithSelector(value *v1.LabelSelectorApplyConfiguration) *DaemonSetSpecApplyConfiguration { + b.Selector = value + return b +} + +// WithTemplate sets the Template field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Template field is set to the value of the last call. +func (b *DaemonSetSpecApplyConfiguration) WithTemplate(value *corev1.PodTemplateSpecApplyConfiguration) *DaemonSetSpecApplyConfiguration { + b.Template = value + return b +} + +// WithUpdateStrategy sets the UpdateStrategy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UpdateStrategy field is set to the value of the last call. +func (b *DaemonSetSpecApplyConfiguration) WithUpdateStrategy(value *DaemonSetUpdateStrategyApplyConfiguration) *DaemonSetSpecApplyConfiguration { + b.UpdateStrategy = value + return b +} + +// WithMinReadySeconds sets the MinReadySeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MinReadySeconds field is set to the value of the last call. +func (b *DaemonSetSpecApplyConfiguration) WithMinReadySeconds(value int32) *DaemonSetSpecApplyConfiguration { + b.MinReadySeconds = &value + return b +} + +// WithTemplateGeneration sets the TemplateGeneration field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the TemplateGeneration field is set to the value of the last call. +func (b *DaemonSetSpecApplyConfiguration) WithTemplateGeneration(value int64) *DaemonSetSpecApplyConfiguration { + b.TemplateGeneration = &value + return b +} + +// WithRevisionHistoryLimit sets the RevisionHistoryLimit field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RevisionHistoryLimit field is set to the value of the last call. +func (b *DaemonSetSpecApplyConfiguration) WithRevisionHistoryLimit(value int32) *DaemonSetSpecApplyConfiguration { + b.RevisionHistoryLimit = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/daemonsetstatus.go b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/daemonsetstatus.go new file mode 100644 index 000000000000..be6b3b285305 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/daemonsetstatus.go @@ -0,0 +1,125 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// DaemonSetStatusApplyConfiguration represents an declarative configuration of the DaemonSetStatus type for use +// with apply. +type DaemonSetStatusApplyConfiguration struct { + CurrentNumberScheduled *int32 `json:"currentNumberScheduled,omitempty"` + NumberMisscheduled *int32 `json:"numberMisscheduled,omitempty"` + DesiredNumberScheduled *int32 `json:"desiredNumberScheduled,omitempty"` + NumberReady *int32 `json:"numberReady,omitempty"` + ObservedGeneration *int64 `json:"observedGeneration,omitempty"` + UpdatedNumberScheduled *int32 `json:"updatedNumberScheduled,omitempty"` + NumberAvailable *int32 `json:"numberAvailable,omitempty"` + NumberUnavailable *int32 `json:"numberUnavailable,omitempty"` + CollisionCount *int32 `json:"collisionCount,omitempty"` + Conditions []DaemonSetConditionApplyConfiguration `json:"conditions,omitempty"` +} + +// DaemonSetStatusApplyConfiguration constructs an declarative configuration of the DaemonSetStatus type for use with +// apply. +func DaemonSetStatus() *DaemonSetStatusApplyConfiguration { + return &DaemonSetStatusApplyConfiguration{} +} + +// WithCurrentNumberScheduled sets the CurrentNumberScheduled field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CurrentNumberScheduled field is set to the value of the last call. +func (b *DaemonSetStatusApplyConfiguration) WithCurrentNumberScheduled(value int32) *DaemonSetStatusApplyConfiguration { + b.CurrentNumberScheduled = &value + return b +} + +// WithNumberMisscheduled sets the NumberMisscheduled field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NumberMisscheduled field is set to the value of the last call. +func (b *DaemonSetStatusApplyConfiguration) WithNumberMisscheduled(value int32) *DaemonSetStatusApplyConfiguration { + b.NumberMisscheduled = &value + return b +} + +// WithDesiredNumberScheduled sets the DesiredNumberScheduled field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DesiredNumberScheduled field is set to the value of the last call. +func (b *DaemonSetStatusApplyConfiguration) WithDesiredNumberScheduled(value int32) *DaemonSetStatusApplyConfiguration { + b.DesiredNumberScheduled = &value + return b +} + +// WithNumberReady sets the NumberReady field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NumberReady field is set to the value of the last call. +func (b *DaemonSetStatusApplyConfiguration) WithNumberReady(value int32) *DaemonSetStatusApplyConfiguration { + b.NumberReady = &value + return b +} + +// WithObservedGeneration sets the ObservedGeneration field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ObservedGeneration field is set to the value of the last call. +func (b *DaemonSetStatusApplyConfiguration) WithObservedGeneration(value int64) *DaemonSetStatusApplyConfiguration { + b.ObservedGeneration = &value + return b +} + +// WithUpdatedNumberScheduled sets the UpdatedNumberScheduled field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UpdatedNumberScheduled field is set to the value of the last call. +func (b *DaemonSetStatusApplyConfiguration) WithUpdatedNumberScheduled(value int32) *DaemonSetStatusApplyConfiguration { + b.UpdatedNumberScheduled = &value + return b +} + +// WithNumberAvailable sets the NumberAvailable field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NumberAvailable field is set to the value of the last call. +func (b *DaemonSetStatusApplyConfiguration) WithNumberAvailable(value int32) *DaemonSetStatusApplyConfiguration { + b.NumberAvailable = &value + return b +} + +// WithNumberUnavailable sets the NumberUnavailable field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NumberUnavailable field is set to the value of the last call. +func (b *DaemonSetStatusApplyConfiguration) WithNumberUnavailable(value int32) *DaemonSetStatusApplyConfiguration { + b.NumberUnavailable = &value + return b +} + +// WithCollisionCount sets the CollisionCount field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CollisionCount field is set to the value of the last call. +func (b *DaemonSetStatusApplyConfiguration) WithCollisionCount(value int32) *DaemonSetStatusApplyConfiguration { + b.CollisionCount = &value + return b +} + +// WithConditions adds the given value to the Conditions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Conditions field. +func (b *DaemonSetStatusApplyConfiguration) WithConditions(values ...*DaemonSetConditionApplyConfiguration) *DaemonSetStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithConditions") + } + b.Conditions = append(b.Conditions, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/daemonsetupdatestrategy.go b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/daemonsetupdatestrategy.go new file mode 100644 index 000000000000..2c827e62d478 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/daemonsetupdatestrategy.go @@ -0,0 +1,52 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1beta1 "k8s.io/api/extensions/v1beta1" +) + +// DaemonSetUpdateStrategyApplyConfiguration represents an declarative configuration of the DaemonSetUpdateStrategy type for use +// with apply. +type DaemonSetUpdateStrategyApplyConfiguration struct { + Type *v1beta1.DaemonSetUpdateStrategyType `json:"type,omitempty"` + RollingUpdate *RollingUpdateDaemonSetApplyConfiguration `json:"rollingUpdate,omitempty"` +} + +// DaemonSetUpdateStrategyApplyConfiguration constructs an declarative configuration of the DaemonSetUpdateStrategy type for use with +// apply. +func DaemonSetUpdateStrategy() *DaemonSetUpdateStrategyApplyConfiguration { + return &DaemonSetUpdateStrategyApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *DaemonSetUpdateStrategyApplyConfiguration) WithType(value v1beta1.DaemonSetUpdateStrategyType) *DaemonSetUpdateStrategyApplyConfiguration { + b.Type = &value + return b +} + +// WithRollingUpdate sets the RollingUpdate field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RollingUpdate field is set to the value of the last call. +func (b *DaemonSetUpdateStrategyApplyConfiguration) WithRollingUpdate(value *RollingUpdateDaemonSetApplyConfiguration) *DaemonSetUpdateStrategyApplyConfiguration { + b.RollingUpdate = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/deployment.go b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/deployment.go new file mode 100644 index 000000000000..cc9d8fdc3af4 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/deployment.go @@ -0,0 +1,265 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + extensionsv1beta1 "k8s.io/api/extensions/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// DeploymentApplyConfiguration represents an declarative configuration of the Deployment type for use +// with apply. +type DeploymentApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *DeploymentSpecApplyConfiguration `json:"spec,omitempty"` + Status *DeploymentStatusApplyConfiguration `json:"status,omitempty"` +} + +// Deployment constructs an declarative configuration of the Deployment type for use with +// apply. +func Deployment(name, namespace string) *DeploymentApplyConfiguration { + b := &DeploymentApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("Deployment") + b.WithAPIVersion("extensions/v1beta1") + return b +} + +// ExtractDeployment extracts the applied configuration owned by fieldManager from +// deployment. If no managedFields are found in deployment for fieldManager, a +// DeploymentApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// deployment must be a unmodified Deployment API object that was retrieved from the Kubernetes API. +// ExtractDeployment provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractDeployment(deployment *extensionsv1beta1.Deployment, fieldManager string) (*DeploymentApplyConfiguration, error) { + b := &DeploymentApplyConfiguration{} + err := managedfields.ExtractInto(deployment, internal.Parser().Type("io.k8s.api.extensions.v1beta1.Deployment"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(deployment.Name) + b.WithNamespace(deployment.Namespace) + + b.WithKind("Deployment") + b.WithAPIVersion("extensions/v1beta1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithKind(value string) *DeploymentApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithAPIVersion(value string) *DeploymentApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithName(value string) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithGenerateName(value string) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithNamespace(value string) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithSelfLink(value string) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithUID(value types.UID) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithResourceVersion(value string) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithGeneration(value int64) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithCreationTimestamp(value metav1.Time) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *DeploymentApplyConfiguration) WithLabels(entries map[string]string) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *DeploymentApplyConfiguration) WithAnnotations(entries map[string]string) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *DeploymentApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *DeploymentApplyConfiguration) WithFinalizers(values ...string) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithClusterName(value string) *DeploymentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *DeploymentApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithSpec(value *DeploymentSpecApplyConfiguration) *DeploymentApplyConfiguration { + b.Spec = value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *DeploymentApplyConfiguration) WithStatus(value *DeploymentStatusApplyConfiguration) *DeploymentApplyConfiguration { + b.Status = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/deploymentcondition.go b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/deploymentcondition.go new file mode 100644 index 000000000000..d8a214b7fca2 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/deploymentcondition.go @@ -0,0 +1,90 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1 "k8s.io/api/core/v1" + v1beta1 "k8s.io/api/extensions/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// DeploymentConditionApplyConfiguration represents an declarative configuration of the DeploymentCondition type for use +// with apply. +type DeploymentConditionApplyConfiguration struct { + Type *v1beta1.DeploymentConditionType `json:"type,omitempty"` + Status *v1.ConditionStatus `json:"status,omitempty"` + LastUpdateTime *metav1.Time `json:"lastUpdateTime,omitempty"` + LastTransitionTime *metav1.Time `json:"lastTransitionTime,omitempty"` + Reason *string `json:"reason,omitempty"` + Message *string `json:"message,omitempty"` +} + +// DeploymentConditionApplyConfiguration constructs an declarative configuration of the DeploymentCondition type for use with +// apply. +func DeploymentCondition() *DeploymentConditionApplyConfiguration { + return &DeploymentConditionApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *DeploymentConditionApplyConfiguration) WithType(value v1beta1.DeploymentConditionType) *DeploymentConditionApplyConfiguration { + b.Type = &value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *DeploymentConditionApplyConfiguration) WithStatus(value v1.ConditionStatus) *DeploymentConditionApplyConfiguration { + b.Status = &value + return b +} + +// WithLastUpdateTime sets the LastUpdateTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastUpdateTime field is set to the value of the last call. +func (b *DeploymentConditionApplyConfiguration) WithLastUpdateTime(value metav1.Time) *DeploymentConditionApplyConfiguration { + b.LastUpdateTime = &value + return b +} + +// WithLastTransitionTime sets the LastTransitionTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastTransitionTime field is set to the value of the last call. +func (b *DeploymentConditionApplyConfiguration) WithLastTransitionTime(value metav1.Time) *DeploymentConditionApplyConfiguration { + b.LastTransitionTime = &value + return b +} + +// WithReason sets the Reason field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Reason field is set to the value of the last call. +func (b *DeploymentConditionApplyConfiguration) WithReason(value string) *DeploymentConditionApplyConfiguration { + b.Reason = &value + return b +} + +// WithMessage sets the Message field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Message field is set to the value of the last call. +func (b *DeploymentConditionApplyConfiguration) WithMessage(value string) *DeploymentConditionApplyConfiguration { + b.Message = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/deploymentspec.go b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/deploymentspec.go new file mode 100644 index 000000000000..5e18476bdcab --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/deploymentspec.go @@ -0,0 +1,116 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + corev1 "k8s.io/client-go/applyconfigurations/core/v1" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// DeploymentSpecApplyConfiguration represents an declarative configuration of the DeploymentSpec type for use +// with apply. +type DeploymentSpecApplyConfiguration struct { + Replicas *int32 `json:"replicas,omitempty"` + Selector *v1.LabelSelectorApplyConfiguration `json:"selector,omitempty"` + Template *corev1.PodTemplateSpecApplyConfiguration `json:"template,omitempty"` + Strategy *DeploymentStrategyApplyConfiguration `json:"strategy,omitempty"` + MinReadySeconds *int32 `json:"minReadySeconds,omitempty"` + RevisionHistoryLimit *int32 `json:"revisionHistoryLimit,omitempty"` + Paused *bool `json:"paused,omitempty"` + RollbackTo *RollbackConfigApplyConfiguration `json:"rollbackTo,omitempty"` + ProgressDeadlineSeconds *int32 `json:"progressDeadlineSeconds,omitempty"` +} + +// DeploymentSpecApplyConfiguration constructs an declarative configuration of the DeploymentSpec type for use with +// apply. +func DeploymentSpec() *DeploymentSpecApplyConfiguration { + return &DeploymentSpecApplyConfiguration{} +} + +// WithReplicas sets the Replicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Replicas field is set to the value of the last call. +func (b *DeploymentSpecApplyConfiguration) WithReplicas(value int32) *DeploymentSpecApplyConfiguration { + b.Replicas = &value + return b +} + +// WithSelector sets the Selector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Selector field is set to the value of the last call. +func (b *DeploymentSpecApplyConfiguration) WithSelector(value *v1.LabelSelectorApplyConfiguration) *DeploymentSpecApplyConfiguration { + b.Selector = value + return b +} + +// WithTemplate sets the Template field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Template field is set to the value of the last call. +func (b *DeploymentSpecApplyConfiguration) WithTemplate(value *corev1.PodTemplateSpecApplyConfiguration) *DeploymentSpecApplyConfiguration { + b.Template = value + return b +} + +// WithStrategy sets the Strategy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Strategy field is set to the value of the last call. +func (b *DeploymentSpecApplyConfiguration) WithStrategy(value *DeploymentStrategyApplyConfiguration) *DeploymentSpecApplyConfiguration { + b.Strategy = value + return b +} + +// WithMinReadySeconds sets the MinReadySeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MinReadySeconds field is set to the value of the last call. +func (b *DeploymentSpecApplyConfiguration) WithMinReadySeconds(value int32) *DeploymentSpecApplyConfiguration { + b.MinReadySeconds = &value + return b +} + +// WithRevisionHistoryLimit sets the RevisionHistoryLimit field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RevisionHistoryLimit field is set to the value of the last call. +func (b *DeploymentSpecApplyConfiguration) WithRevisionHistoryLimit(value int32) *DeploymentSpecApplyConfiguration { + b.RevisionHistoryLimit = &value + return b +} + +// WithPaused sets the Paused field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Paused field is set to the value of the last call. +func (b *DeploymentSpecApplyConfiguration) WithPaused(value bool) *DeploymentSpecApplyConfiguration { + b.Paused = &value + return b +} + +// WithRollbackTo sets the RollbackTo field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RollbackTo field is set to the value of the last call. +func (b *DeploymentSpecApplyConfiguration) WithRollbackTo(value *RollbackConfigApplyConfiguration) *DeploymentSpecApplyConfiguration { + b.RollbackTo = value + return b +} + +// WithProgressDeadlineSeconds sets the ProgressDeadlineSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ProgressDeadlineSeconds field is set to the value of the last call. +func (b *DeploymentSpecApplyConfiguration) WithProgressDeadlineSeconds(value int32) *DeploymentSpecApplyConfiguration { + b.ProgressDeadlineSeconds = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/deploymentstatus.go b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/deploymentstatus.go new file mode 100644 index 000000000000..f8d1cf5d2559 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/deploymentstatus.go @@ -0,0 +1,107 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// DeploymentStatusApplyConfiguration represents an declarative configuration of the DeploymentStatus type for use +// with apply. +type DeploymentStatusApplyConfiguration struct { + ObservedGeneration *int64 `json:"observedGeneration,omitempty"` + Replicas *int32 `json:"replicas,omitempty"` + UpdatedReplicas *int32 `json:"updatedReplicas,omitempty"` + ReadyReplicas *int32 `json:"readyReplicas,omitempty"` + AvailableReplicas *int32 `json:"availableReplicas,omitempty"` + UnavailableReplicas *int32 `json:"unavailableReplicas,omitempty"` + Conditions []DeploymentConditionApplyConfiguration `json:"conditions,omitempty"` + CollisionCount *int32 `json:"collisionCount,omitempty"` +} + +// DeploymentStatusApplyConfiguration constructs an declarative configuration of the DeploymentStatus type for use with +// apply. +func DeploymentStatus() *DeploymentStatusApplyConfiguration { + return &DeploymentStatusApplyConfiguration{} +} + +// WithObservedGeneration sets the ObservedGeneration field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ObservedGeneration field is set to the value of the last call. +func (b *DeploymentStatusApplyConfiguration) WithObservedGeneration(value int64) *DeploymentStatusApplyConfiguration { + b.ObservedGeneration = &value + return b +} + +// WithReplicas sets the Replicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Replicas field is set to the value of the last call. +func (b *DeploymentStatusApplyConfiguration) WithReplicas(value int32) *DeploymentStatusApplyConfiguration { + b.Replicas = &value + return b +} + +// WithUpdatedReplicas sets the UpdatedReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UpdatedReplicas field is set to the value of the last call. +func (b *DeploymentStatusApplyConfiguration) WithUpdatedReplicas(value int32) *DeploymentStatusApplyConfiguration { + b.UpdatedReplicas = &value + return b +} + +// WithReadyReplicas sets the ReadyReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadyReplicas field is set to the value of the last call. +func (b *DeploymentStatusApplyConfiguration) WithReadyReplicas(value int32) *DeploymentStatusApplyConfiguration { + b.ReadyReplicas = &value + return b +} + +// WithAvailableReplicas sets the AvailableReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AvailableReplicas field is set to the value of the last call. +func (b *DeploymentStatusApplyConfiguration) WithAvailableReplicas(value int32) *DeploymentStatusApplyConfiguration { + b.AvailableReplicas = &value + return b +} + +// WithUnavailableReplicas sets the UnavailableReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UnavailableReplicas field is set to the value of the last call. +func (b *DeploymentStatusApplyConfiguration) WithUnavailableReplicas(value int32) *DeploymentStatusApplyConfiguration { + b.UnavailableReplicas = &value + return b +} + +// WithConditions adds the given value to the Conditions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Conditions field. +func (b *DeploymentStatusApplyConfiguration) WithConditions(values ...*DeploymentConditionApplyConfiguration) *DeploymentStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithConditions") + } + b.Conditions = append(b.Conditions, *values[i]) + } + return b +} + +// WithCollisionCount sets the CollisionCount field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CollisionCount field is set to the value of the last call. +func (b *DeploymentStatusApplyConfiguration) WithCollisionCount(value int32) *DeploymentStatusApplyConfiguration { + b.CollisionCount = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/deploymentstrategy.go b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/deploymentstrategy.go new file mode 100644 index 000000000000..7c17b407229d --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/deploymentstrategy.go @@ -0,0 +1,52 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1beta1 "k8s.io/api/extensions/v1beta1" +) + +// DeploymentStrategyApplyConfiguration represents an declarative configuration of the DeploymentStrategy type for use +// with apply. +type DeploymentStrategyApplyConfiguration struct { + Type *v1beta1.DeploymentStrategyType `json:"type,omitempty"` + RollingUpdate *RollingUpdateDeploymentApplyConfiguration `json:"rollingUpdate,omitempty"` +} + +// DeploymentStrategyApplyConfiguration constructs an declarative configuration of the DeploymentStrategy type for use with +// apply. +func DeploymentStrategy() *DeploymentStrategyApplyConfiguration { + return &DeploymentStrategyApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *DeploymentStrategyApplyConfiguration) WithType(value v1beta1.DeploymentStrategyType) *DeploymentStrategyApplyConfiguration { + b.Type = &value + return b +} + +// WithRollingUpdate sets the RollingUpdate field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RollingUpdate field is set to the value of the last call. +func (b *DeploymentStrategyApplyConfiguration) WithRollingUpdate(value *RollingUpdateDeploymentApplyConfiguration) *DeploymentStrategyApplyConfiguration { + b.RollingUpdate = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/fsgroupstrategyoptions.go b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/fsgroupstrategyoptions.go new file mode 100644 index 000000000000..c7434a6af00d --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/fsgroupstrategyoptions.go @@ -0,0 +1,57 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1beta1 "k8s.io/api/extensions/v1beta1" +) + +// FSGroupStrategyOptionsApplyConfiguration represents an declarative configuration of the FSGroupStrategyOptions type for use +// with apply. +type FSGroupStrategyOptionsApplyConfiguration struct { + Rule *v1beta1.FSGroupStrategyType `json:"rule,omitempty"` + Ranges []IDRangeApplyConfiguration `json:"ranges,omitempty"` +} + +// FSGroupStrategyOptionsApplyConfiguration constructs an declarative configuration of the FSGroupStrategyOptions type for use with +// apply. +func FSGroupStrategyOptions() *FSGroupStrategyOptionsApplyConfiguration { + return &FSGroupStrategyOptionsApplyConfiguration{} +} + +// WithRule sets the Rule field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Rule field is set to the value of the last call. +func (b *FSGroupStrategyOptionsApplyConfiguration) WithRule(value v1beta1.FSGroupStrategyType) *FSGroupStrategyOptionsApplyConfiguration { + b.Rule = &value + return b +} + +// WithRanges adds the given value to the Ranges field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Ranges field. +func (b *FSGroupStrategyOptionsApplyConfiguration) WithRanges(values ...*IDRangeApplyConfiguration) *FSGroupStrategyOptionsApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithRanges") + } + b.Ranges = append(b.Ranges, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/hostportrange.go b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/hostportrange.go new file mode 100644 index 000000000000..7c796881393f --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/hostportrange.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// HostPortRangeApplyConfiguration represents an declarative configuration of the HostPortRange type for use +// with apply. +type HostPortRangeApplyConfiguration struct { + Min *int32 `json:"min,omitempty"` + Max *int32 `json:"max,omitempty"` +} + +// HostPortRangeApplyConfiguration constructs an declarative configuration of the HostPortRange type for use with +// apply. +func HostPortRange() *HostPortRangeApplyConfiguration { + return &HostPortRangeApplyConfiguration{} +} + +// WithMin sets the Min field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Min field is set to the value of the last call. +func (b *HostPortRangeApplyConfiguration) WithMin(value int32) *HostPortRangeApplyConfiguration { + b.Min = &value + return b +} + +// WithMax sets the Max field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Max field is set to the value of the last call. +func (b *HostPortRangeApplyConfiguration) WithMax(value int32) *HostPortRangeApplyConfiguration { + b.Max = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/httpingresspath.go b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/httpingresspath.go new file mode 100644 index 000000000000..361605d8cd87 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/httpingresspath.go @@ -0,0 +1,61 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1beta1 "k8s.io/api/extensions/v1beta1" +) + +// HTTPIngressPathApplyConfiguration represents an declarative configuration of the HTTPIngressPath type for use +// with apply. +type HTTPIngressPathApplyConfiguration struct { + Path *string `json:"path,omitempty"` + PathType *v1beta1.PathType `json:"pathType,omitempty"` + Backend *IngressBackendApplyConfiguration `json:"backend,omitempty"` +} + +// HTTPIngressPathApplyConfiguration constructs an declarative configuration of the HTTPIngressPath type for use with +// apply. +func HTTPIngressPath() *HTTPIngressPathApplyConfiguration { + return &HTTPIngressPathApplyConfiguration{} +} + +// WithPath sets the Path field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Path field is set to the value of the last call. +func (b *HTTPIngressPathApplyConfiguration) WithPath(value string) *HTTPIngressPathApplyConfiguration { + b.Path = &value + return b +} + +// WithPathType sets the PathType field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PathType field is set to the value of the last call. +func (b *HTTPIngressPathApplyConfiguration) WithPathType(value v1beta1.PathType) *HTTPIngressPathApplyConfiguration { + b.PathType = &value + return b +} + +// WithBackend sets the Backend field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Backend field is set to the value of the last call. +func (b *HTTPIngressPathApplyConfiguration) WithBackend(value *IngressBackendApplyConfiguration) *HTTPIngressPathApplyConfiguration { + b.Backend = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/httpingressrulevalue.go b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/httpingressrulevalue.go new file mode 100644 index 000000000000..3137bc5eb04d --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/httpingressrulevalue.go @@ -0,0 +1,44 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// HTTPIngressRuleValueApplyConfiguration represents an declarative configuration of the HTTPIngressRuleValue type for use +// with apply. +type HTTPIngressRuleValueApplyConfiguration struct { + Paths []HTTPIngressPathApplyConfiguration `json:"paths,omitempty"` +} + +// HTTPIngressRuleValueApplyConfiguration constructs an declarative configuration of the HTTPIngressRuleValue type for use with +// apply. +func HTTPIngressRuleValue() *HTTPIngressRuleValueApplyConfiguration { + return &HTTPIngressRuleValueApplyConfiguration{} +} + +// WithPaths adds the given value to the Paths field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Paths field. +func (b *HTTPIngressRuleValueApplyConfiguration) WithPaths(values ...*HTTPIngressPathApplyConfiguration) *HTTPIngressRuleValueApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithPaths") + } + b.Paths = append(b.Paths, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/idrange.go b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/idrange.go new file mode 100644 index 000000000000..af46f76581ad --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/idrange.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// IDRangeApplyConfiguration represents an declarative configuration of the IDRange type for use +// with apply. +type IDRangeApplyConfiguration struct { + Min *int64 `json:"min,omitempty"` + Max *int64 `json:"max,omitempty"` +} + +// IDRangeApplyConfiguration constructs an declarative configuration of the IDRange type for use with +// apply. +func IDRange() *IDRangeApplyConfiguration { + return &IDRangeApplyConfiguration{} +} + +// WithMin sets the Min field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Min field is set to the value of the last call. +func (b *IDRangeApplyConfiguration) WithMin(value int64) *IDRangeApplyConfiguration { + b.Min = &value + return b +} + +// WithMax sets the Max field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Max field is set to the value of the last call. +func (b *IDRangeApplyConfiguration) WithMax(value int64) *IDRangeApplyConfiguration { + b.Max = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/ingress.go b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/ingress.go new file mode 100644 index 000000000000..ac30106667b3 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/ingress.go @@ -0,0 +1,265 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + extensionsv1beta1 "k8s.io/api/extensions/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// IngressApplyConfiguration represents an declarative configuration of the Ingress type for use +// with apply. +type IngressApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *IngressSpecApplyConfiguration `json:"spec,omitempty"` + Status *IngressStatusApplyConfiguration `json:"status,omitempty"` +} + +// Ingress constructs an declarative configuration of the Ingress type for use with +// apply. +func Ingress(name, namespace string) *IngressApplyConfiguration { + b := &IngressApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("Ingress") + b.WithAPIVersion("extensions/v1beta1") + return b +} + +// ExtractIngress extracts the applied configuration owned by fieldManager from +// ingress. If no managedFields are found in ingress for fieldManager, a +// IngressApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// ingress must be a unmodified Ingress API object that was retrieved from the Kubernetes API. +// ExtractIngress provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractIngress(ingress *extensionsv1beta1.Ingress, fieldManager string) (*IngressApplyConfiguration, error) { + b := &IngressApplyConfiguration{} + err := managedfields.ExtractInto(ingress, internal.Parser().Type("io.k8s.api.extensions.v1beta1.Ingress"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(ingress.Name) + b.WithNamespace(ingress.Namespace) + + b.WithKind("Ingress") + b.WithAPIVersion("extensions/v1beta1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *IngressApplyConfiguration) WithKind(value string) *IngressApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *IngressApplyConfiguration) WithAPIVersion(value string) *IngressApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *IngressApplyConfiguration) WithName(value string) *IngressApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *IngressApplyConfiguration) WithGenerateName(value string) *IngressApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *IngressApplyConfiguration) WithNamespace(value string) *IngressApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *IngressApplyConfiguration) WithSelfLink(value string) *IngressApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *IngressApplyConfiguration) WithUID(value types.UID) *IngressApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *IngressApplyConfiguration) WithResourceVersion(value string) *IngressApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *IngressApplyConfiguration) WithGeneration(value int64) *IngressApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *IngressApplyConfiguration) WithCreationTimestamp(value metav1.Time) *IngressApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *IngressApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *IngressApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *IngressApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *IngressApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *IngressApplyConfiguration) WithLabels(entries map[string]string) *IngressApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *IngressApplyConfiguration) WithAnnotations(entries map[string]string) *IngressApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *IngressApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *IngressApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *IngressApplyConfiguration) WithFinalizers(values ...string) *IngressApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *IngressApplyConfiguration) WithClusterName(value string) *IngressApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *IngressApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *IngressApplyConfiguration) WithSpec(value *IngressSpecApplyConfiguration) *IngressApplyConfiguration { + b.Spec = value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *IngressApplyConfiguration) WithStatus(value *IngressStatusApplyConfiguration) *IngressApplyConfiguration { + b.Status = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/ingressbackend.go b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/ingressbackend.go new file mode 100644 index 000000000000..f19c2f2ee24a --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/ingressbackend.go @@ -0,0 +1,62 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + intstr "k8s.io/apimachinery/pkg/util/intstr" + v1 "k8s.io/client-go/applyconfigurations/core/v1" +) + +// IngressBackendApplyConfiguration represents an declarative configuration of the IngressBackend type for use +// with apply. +type IngressBackendApplyConfiguration struct { + ServiceName *string `json:"serviceName,omitempty"` + ServicePort *intstr.IntOrString `json:"servicePort,omitempty"` + Resource *v1.TypedLocalObjectReferenceApplyConfiguration `json:"resource,omitempty"` +} + +// IngressBackendApplyConfiguration constructs an declarative configuration of the IngressBackend type for use with +// apply. +func IngressBackend() *IngressBackendApplyConfiguration { + return &IngressBackendApplyConfiguration{} +} + +// WithServiceName sets the ServiceName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ServiceName field is set to the value of the last call. +func (b *IngressBackendApplyConfiguration) WithServiceName(value string) *IngressBackendApplyConfiguration { + b.ServiceName = &value + return b +} + +// WithServicePort sets the ServicePort field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ServicePort field is set to the value of the last call. +func (b *IngressBackendApplyConfiguration) WithServicePort(value intstr.IntOrString) *IngressBackendApplyConfiguration { + b.ServicePort = &value + return b +} + +// WithResource sets the Resource field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Resource field is set to the value of the last call. +func (b *IngressBackendApplyConfiguration) WithResource(value *v1.TypedLocalObjectReferenceApplyConfiguration) *IngressBackendApplyConfiguration { + b.Resource = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/ingressrule.go b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/ingressrule.go new file mode 100644 index 000000000000..015541eeb971 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/ingressrule.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// IngressRuleApplyConfiguration represents an declarative configuration of the IngressRule type for use +// with apply. +type IngressRuleApplyConfiguration struct { + Host *string `json:"host,omitempty"` + IngressRuleValueApplyConfiguration `json:",omitempty,inline"` +} + +// IngressRuleApplyConfiguration constructs an declarative configuration of the IngressRule type for use with +// apply. +func IngressRule() *IngressRuleApplyConfiguration { + return &IngressRuleApplyConfiguration{} +} + +// WithHost sets the Host field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Host field is set to the value of the last call. +func (b *IngressRuleApplyConfiguration) WithHost(value string) *IngressRuleApplyConfiguration { + b.Host = &value + return b +} + +// WithHTTP sets the HTTP field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the HTTP field is set to the value of the last call. +func (b *IngressRuleApplyConfiguration) WithHTTP(value *HTTPIngressRuleValueApplyConfiguration) *IngressRuleApplyConfiguration { + b.HTTP = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/ingressrulevalue.go b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/ingressrulevalue.go new file mode 100644 index 000000000000..2d03c7b13220 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/ingressrulevalue.go @@ -0,0 +1,39 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// IngressRuleValueApplyConfiguration represents an declarative configuration of the IngressRuleValue type for use +// with apply. +type IngressRuleValueApplyConfiguration struct { + HTTP *HTTPIngressRuleValueApplyConfiguration `json:"http,omitempty"` +} + +// IngressRuleValueApplyConfiguration constructs an declarative configuration of the IngressRuleValue type for use with +// apply. +func IngressRuleValue() *IngressRuleValueApplyConfiguration { + return &IngressRuleValueApplyConfiguration{} +} + +// WithHTTP sets the HTTP field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the HTTP field is set to the value of the last call. +func (b *IngressRuleValueApplyConfiguration) WithHTTP(value *HTTPIngressRuleValueApplyConfiguration) *IngressRuleValueApplyConfiguration { + b.HTTP = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/ingressspec.go b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/ingressspec.go new file mode 100644 index 000000000000..1ab4d8bb73b0 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/ingressspec.go @@ -0,0 +1,76 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// IngressSpecApplyConfiguration represents an declarative configuration of the IngressSpec type for use +// with apply. +type IngressSpecApplyConfiguration struct { + IngressClassName *string `json:"ingressClassName,omitempty"` + Backend *IngressBackendApplyConfiguration `json:"backend,omitempty"` + TLS []IngressTLSApplyConfiguration `json:"tls,omitempty"` + Rules []IngressRuleApplyConfiguration `json:"rules,omitempty"` +} + +// IngressSpecApplyConfiguration constructs an declarative configuration of the IngressSpec type for use with +// apply. +func IngressSpec() *IngressSpecApplyConfiguration { + return &IngressSpecApplyConfiguration{} +} + +// WithIngressClassName sets the IngressClassName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the IngressClassName field is set to the value of the last call. +func (b *IngressSpecApplyConfiguration) WithIngressClassName(value string) *IngressSpecApplyConfiguration { + b.IngressClassName = &value + return b +} + +// WithBackend sets the Backend field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Backend field is set to the value of the last call. +func (b *IngressSpecApplyConfiguration) WithBackend(value *IngressBackendApplyConfiguration) *IngressSpecApplyConfiguration { + b.Backend = value + return b +} + +// WithTLS adds the given value to the TLS field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the TLS field. +func (b *IngressSpecApplyConfiguration) WithTLS(values ...*IngressTLSApplyConfiguration) *IngressSpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithTLS") + } + b.TLS = append(b.TLS, *values[i]) + } + return b +} + +// WithRules adds the given value to the Rules field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Rules field. +func (b *IngressSpecApplyConfiguration) WithRules(values ...*IngressRuleApplyConfiguration) *IngressSpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithRules") + } + b.Rules = append(b.Rules, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/ingressstatus.go b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/ingressstatus.go new file mode 100644 index 000000000000..941769594ec3 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/ingressstatus.go @@ -0,0 +1,43 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1 "k8s.io/client-go/applyconfigurations/core/v1" +) + +// IngressStatusApplyConfiguration represents an declarative configuration of the IngressStatus type for use +// with apply. +type IngressStatusApplyConfiguration struct { + LoadBalancer *v1.LoadBalancerStatusApplyConfiguration `json:"loadBalancer,omitempty"` +} + +// IngressStatusApplyConfiguration constructs an declarative configuration of the IngressStatus type for use with +// apply. +func IngressStatus() *IngressStatusApplyConfiguration { + return &IngressStatusApplyConfiguration{} +} + +// WithLoadBalancer sets the LoadBalancer field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LoadBalancer field is set to the value of the last call. +func (b *IngressStatusApplyConfiguration) WithLoadBalancer(value *v1.LoadBalancerStatusApplyConfiguration) *IngressStatusApplyConfiguration { + b.LoadBalancer = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/ingresstls.go b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/ingresstls.go new file mode 100644 index 000000000000..8ca93a0bc2d1 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/ingresstls.go @@ -0,0 +1,50 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// IngressTLSApplyConfiguration represents an declarative configuration of the IngressTLS type for use +// with apply. +type IngressTLSApplyConfiguration struct { + Hosts []string `json:"hosts,omitempty"` + SecretName *string `json:"secretName,omitempty"` +} + +// IngressTLSApplyConfiguration constructs an declarative configuration of the IngressTLS type for use with +// apply. +func IngressTLS() *IngressTLSApplyConfiguration { + return &IngressTLSApplyConfiguration{} +} + +// WithHosts adds the given value to the Hosts field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Hosts field. +func (b *IngressTLSApplyConfiguration) WithHosts(values ...string) *IngressTLSApplyConfiguration { + for i := range values { + b.Hosts = append(b.Hosts, values[i]) + } + return b +} + +// WithSecretName sets the SecretName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SecretName field is set to the value of the last call. +func (b *IngressTLSApplyConfiguration) WithSecretName(value string) *IngressTLSApplyConfiguration { + b.SecretName = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/ipblock.go b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/ipblock.go new file mode 100644 index 000000000000..a90d3b22074d --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/ipblock.go @@ -0,0 +1,50 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// IPBlockApplyConfiguration represents an declarative configuration of the IPBlock type for use +// with apply. +type IPBlockApplyConfiguration struct { + CIDR *string `json:"cidr,omitempty"` + Except []string `json:"except,omitempty"` +} + +// IPBlockApplyConfiguration constructs an declarative configuration of the IPBlock type for use with +// apply. +func IPBlock() *IPBlockApplyConfiguration { + return &IPBlockApplyConfiguration{} +} + +// WithCIDR sets the CIDR field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CIDR field is set to the value of the last call. +func (b *IPBlockApplyConfiguration) WithCIDR(value string) *IPBlockApplyConfiguration { + b.CIDR = &value + return b +} + +// WithExcept adds the given value to the Except field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Except field. +func (b *IPBlockApplyConfiguration) WithExcept(values ...string) *IPBlockApplyConfiguration { + for i := range values { + b.Except = append(b.Except, values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/networkpolicy.go b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/networkpolicy.go new file mode 100644 index 000000000000..0b25c9c966fd --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/networkpolicy.go @@ -0,0 +1,256 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + extensionsv1beta1 "k8s.io/api/extensions/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// NetworkPolicyApplyConfiguration represents an declarative configuration of the NetworkPolicy type for use +// with apply. +type NetworkPolicyApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *NetworkPolicySpecApplyConfiguration `json:"spec,omitempty"` +} + +// NetworkPolicy constructs an declarative configuration of the NetworkPolicy type for use with +// apply. +func NetworkPolicy(name, namespace string) *NetworkPolicyApplyConfiguration { + b := &NetworkPolicyApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("NetworkPolicy") + b.WithAPIVersion("extensions/v1beta1") + return b +} + +// ExtractNetworkPolicy extracts the applied configuration owned by fieldManager from +// networkPolicy. If no managedFields are found in networkPolicy for fieldManager, a +// NetworkPolicyApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// networkPolicy must be a unmodified NetworkPolicy API object that was retrieved from the Kubernetes API. +// ExtractNetworkPolicy provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractNetworkPolicy(networkPolicy *extensionsv1beta1.NetworkPolicy, fieldManager string) (*NetworkPolicyApplyConfiguration, error) { + b := &NetworkPolicyApplyConfiguration{} + err := managedfields.ExtractInto(networkPolicy, internal.Parser().Type("io.k8s.api.extensions.v1beta1.NetworkPolicy"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(networkPolicy.Name) + b.WithNamespace(networkPolicy.Namespace) + + b.WithKind("NetworkPolicy") + b.WithAPIVersion("extensions/v1beta1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *NetworkPolicyApplyConfiguration) WithKind(value string) *NetworkPolicyApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *NetworkPolicyApplyConfiguration) WithAPIVersion(value string) *NetworkPolicyApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *NetworkPolicyApplyConfiguration) WithName(value string) *NetworkPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *NetworkPolicyApplyConfiguration) WithGenerateName(value string) *NetworkPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *NetworkPolicyApplyConfiguration) WithNamespace(value string) *NetworkPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *NetworkPolicyApplyConfiguration) WithSelfLink(value string) *NetworkPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *NetworkPolicyApplyConfiguration) WithUID(value types.UID) *NetworkPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *NetworkPolicyApplyConfiguration) WithResourceVersion(value string) *NetworkPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *NetworkPolicyApplyConfiguration) WithGeneration(value int64) *NetworkPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *NetworkPolicyApplyConfiguration) WithCreationTimestamp(value metav1.Time) *NetworkPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *NetworkPolicyApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *NetworkPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *NetworkPolicyApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *NetworkPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *NetworkPolicyApplyConfiguration) WithLabels(entries map[string]string) *NetworkPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *NetworkPolicyApplyConfiguration) WithAnnotations(entries map[string]string) *NetworkPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *NetworkPolicyApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *NetworkPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *NetworkPolicyApplyConfiguration) WithFinalizers(values ...string) *NetworkPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *NetworkPolicyApplyConfiguration) WithClusterName(value string) *NetworkPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *NetworkPolicyApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *NetworkPolicyApplyConfiguration) WithSpec(value *NetworkPolicySpecApplyConfiguration) *NetworkPolicyApplyConfiguration { + b.Spec = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/networkpolicyegressrule.go b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/networkpolicyegressrule.go new file mode 100644 index 000000000000..6335ec375d3e --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/networkpolicyegressrule.go @@ -0,0 +1,58 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// NetworkPolicyEgressRuleApplyConfiguration represents an declarative configuration of the NetworkPolicyEgressRule type for use +// with apply. +type NetworkPolicyEgressRuleApplyConfiguration struct { + Ports []NetworkPolicyPortApplyConfiguration `json:"ports,omitempty"` + To []NetworkPolicyPeerApplyConfiguration `json:"to,omitempty"` +} + +// NetworkPolicyEgressRuleApplyConfiguration constructs an declarative configuration of the NetworkPolicyEgressRule type for use with +// apply. +func NetworkPolicyEgressRule() *NetworkPolicyEgressRuleApplyConfiguration { + return &NetworkPolicyEgressRuleApplyConfiguration{} +} + +// WithPorts adds the given value to the Ports field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Ports field. +func (b *NetworkPolicyEgressRuleApplyConfiguration) WithPorts(values ...*NetworkPolicyPortApplyConfiguration) *NetworkPolicyEgressRuleApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithPorts") + } + b.Ports = append(b.Ports, *values[i]) + } + return b +} + +// WithTo adds the given value to the To field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the To field. +func (b *NetworkPolicyEgressRuleApplyConfiguration) WithTo(values ...*NetworkPolicyPeerApplyConfiguration) *NetworkPolicyEgressRuleApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithTo") + } + b.To = append(b.To, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/networkpolicyingressrule.go b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/networkpolicyingressrule.go new file mode 100644 index 000000000000..2ecc4c8c6529 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/networkpolicyingressrule.go @@ -0,0 +1,58 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// NetworkPolicyIngressRuleApplyConfiguration represents an declarative configuration of the NetworkPolicyIngressRule type for use +// with apply. +type NetworkPolicyIngressRuleApplyConfiguration struct { + Ports []NetworkPolicyPortApplyConfiguration `json:"ports,omitempty"` + From []NetworkPolicyPeerApplyConfiguration `json:"from,omitempty"` +} + +// NetworkPolicyIngressRuleApplyConfiguration constructs an declarative configuration of the NetworkPolicyIngressRule type for use with +// apply. +func NetworkPolicyIngressRule() *NetworkPolicyIngressRuleApplyConfiguration { + return &NetworkPolicyIngressRuleApplyConfiguration{} +} + +// WithPorts adds the given value to the Ports field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Ports field. +func (b *NetworkPolicyIngressRuleApplyConfiguration) WithPorts(values ...*NetworkPolicyPortApplyConfiguration) *NetworkPolicyIngressRuleApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithPorts") + } + b.Ports = append(b.Ports, *values[i]) + } + return b +} + +// WithFrom adds the given value to the From field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the From field. +func (b *NetworkPolicyIngressRuleApplyConfiguration) WithFrom(values ...*NetworkPolicyPeerApplyConfiguration) *NetworkPolicyIngressRuleApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithFrom") + } + b.From = append(b.From, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/networkpolicypeer.go b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/networkpolicypeer.go new file mode 100644 index 000000000000..c69b281225f6 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/networkpolicypeer.go @@ -0,0 +1,61 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// NetworkPolicyPeerApplyConfiguration represents an declarative configuration of the NetworkPolicyPeer type for use +// with apply. +type NetworkPolicyPeerApplyConfiguration struct { + PodSelector *v1.LabelSelectorApplyConfiguration `json:"podSelector,omitempty"` + NamespaceSelector *v1.LabelSelectorApplyConfiguration `json:"namespaceSelector,omitempty"` + IPBlock *IPBlockApplyConfiguration `json:"ipBlock,omitempty"` +} + +// NetworkPolicyPeerApplyConfiguration constructs an declarative configuration of the NetworkPolicyPeer type for use with +// apply. +func NetworkPolicyPeer() *NetworkPolicyPeerApplyConfiguration { + return &NetworkPolicyPeerApplyConfiguration{} +} + +// WithPodSelector sets the PodSelector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PodSelector field is set to the value of the last call. +func (b *NetworkPolicyPeerApplyConfiguration) WithPodSelector(value *v1.LabelSelectorApplyConfiguration) *NetworkPolicyPeerApplyConfiguration { + b.PodSelector = value + return b +} + +// WithNamespaceSelector sets the NamespaceSelector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NamespaceSelector field is set to the value of the last call. +func (b *NetworkPolicyPeerApplyConfiguration) WithNamespaceSelector(value *v1.LabelSelectorApplyConfiguration) *NetworkPolicyPeerApplyConfiguration { + b.NamespaceSelector = value + return b +} + +// WithIPBlock sets the IPBlock field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the IPBlock field is set to the value of the last call. +func (b *NetworkPolicyPeerApplyConfiguration) WithIPBlock(value *IPBlockApplyConfiguration) *NetworkPolicyPeerApplyConfiguration { + b.IPBlock = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/networkpolicyport.go b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/networkpolicyport.go new file mode 100644 index 000000000000..0140d771bf26 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/networkpolicyport.go @@ -0,0 +1,62 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1 "k8s.io/api/core/v1" + intstr "k8s.io/apimachinery/pkg/util/intstr" +) + +// NetworkPolicyPortApplyConfiguration represents an declarative configuration of the NetworkPolicyPort type for use +// with apply. +type NetworkPolicyPortApplyConfiguration struct { + Protocol *v1.Protocol `json:"protocol,omitempty"` + Port *intstr.IntOrString `json:"port,omitempty"` + EndPort *int32 `json:"endPort,omitempty"` +} + +// NetworkPolicyPortApplyConfiguration constructs an declarative configuration of the NetworkPolicyPort type for use with +// apply. +func NetworkPolicyPort() *NetworkPolicyPortApplyConfiguration { + return &NetworkPolicyPortApplyConfiguration{} +} + +// WithProtocol sets the Protocol field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Protocol field is set to the value of the last call. +func (b *NetworkPolicyPortApplyConfiguration) WithProtocol(value v1.Protocol) *NetworkPolicyPortApplyConfiguration { + b.Protocol = &value + return b +} + +// WithPort sets the Port field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Port field is set to the value of the last call. +func (b *NetworkPolicyPortApplyConfiguration) WithPort(value intstr.IntOrString) *NetworkPolicyPortApplyConfiguration { + b.Port = &value + return b +} + +// WithEndPort sets the EndPort field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the EndPort field is set to the value of the last call. +func (b *NetworkPolicyPortApplyConfiguration) WithEndPort(value int32) *NetworkPolicyPortApplyConfiguration { + b.EndPort = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/networkpolicyspec.go b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/networkpolicyspec.go new file mode 100644 index 000000000000..179e4bd024e7 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/networkpolicyspec.go @@ -0,0 +1,83 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + extensionsv1beta1 "k8s.io/api/extensions/v1beta1" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// NetworkPolicySpecApplyConfiguration represents an declarative configuration of the NetworkPolicySpec type for use +// with apply. +type NetworkPolicySpecApplyConfiguration struct { + PodSelector *v1.LabelSelectorApplyConfiguration `json:"podSelector,omitempty"` + Ingress []NetworkPolicyIngressRuleApplyConfiguration `json:"ingress,omitempty"` + Egress []NetworkPolicyEgressRuleApplyConfiguration `json:"egress,omitempty"` + PolicyTypes []extensionsv1beta1.PolicyType `json:"policyTypes,omitempty"` +} + +// NetworkPolicySpecApplyConfiguration constructs an declarative configuration of the NetworkPolicySpec type for use with +// apply. +func NetworkPolicySpec() *NetworkPolicySpecApplyConfiguration { + return &NetworkPolicySpecApplyConfiguration{} +} + +// WithPodSelector sets the PodSelector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PodSelector field is set to the value of the last call. +func (b *NetworkPolicySpecApplyConfiguration) WithPodSelector(value *v1.LabelSelectorApplyConfiguration) *NetworkPolicySpecApplyConfiguration { + b.PodSelector = value + return b +} + +// WithIngress adds the given value to the Ingress field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Ingress field. +func (b *NetworkPolicySpecApplyConfiguration) WithIngress(values ...*NetworkPolicyIngressRuleApplyConfiguration) *NetworkPolicySpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithIngress") + } + b.Ingress = append(b.Ingress, *values[i]) + } + return b +} + +// WithEgress adds the given value to the Egress field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Egress field. +func (b *NetworkPolicySpecApplyConfiguration) WithEgress(values ...*NetworkPolicyEgressRuleApplyConfiguration) *NetworkPolicySpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithEgress") + } + b.Egress = append(b.Egress, *values[i]) + } + return b +} + +// WithPolicyTypes adds the given value to the PolicyTypes field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the PolicyTypes field. +func (b *NetworkPolicySpecApplyConfiguration) WithPolicyTypes(values ...extensionsv1beta1.PolicyType) *NetworkPolicySpecApplyConfiguration { + for i := range values { + b.PolicyTypes = append(b.PolicyTypes, values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/podsecuritypolicy.go b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/podsecuritypolicy.go new file mode 100644 index 000000000000..e2c8d8f81134 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/podsecuritypolicy.go @@ -0,0 +1,254 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + extensionsv1beta1 "k8s.io/api/extensions/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// PodSecurityPolicyApplyConfiguration represents an declarative configuration of the PodSecurityPolicy type for use +// with apply. +type PodSecurityPolicyApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *PodSecurityPolicySpecApplyConfiguration `json:"spec,omitempty"` +} + +// PodSecurityPolicy constructs an declarative configuration of the PodSecurityPolicy type for use with +// apply. +func PodSecurityPolicy(name string) *PodSecurityPolicyApplyConfiguration { + b := &PodSecurityPolicyApplyConfiguration{} + b.WithName(name) + b.WithKind("PodSecurityPolicy") + b.WithAPIVersion("extensions/v1beta1") + return b +} + +// ExtractPodSecurityPolicy extracts the applied configuration owned by fieldManager from +// podSecurityPolicy. If no managedFields are found in podSecurityPolicy for fieldManager, a +// PodSecurityPolicyApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// podSecurityPolicy must be a unmodified PodSecurityPolicy API object that was retrieved from the Kubernetes API. +// ExtractPodSecurityPolicy provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractPodSecurityPolicy(podSecurityPolicy *extensionsv1beta1.PodSecurityPolicy, fieldManager string) (*PodSecurityPolicyApplyConfiguration, error) { + b := &PodSecurityPolicyApplyConfiguration{} + err := managedfields.ExtractInto(podSecurityPolicy, internal.Parser().Type("io.k8s.api.extensions.v1beta1.PodSecurityPolicy"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(podSecurityPolicy.Name) + + b.WithKind("PodSecurityPolicy") + b.WithAPIVersion("extensions/v1beta1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *PodSecurityPolicyApplyConfiguration) WithKind(value string) *PodSecurityPolicyApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *PodSecurityPolicyApplyConfiguration) WithAPIVersion(value string) *PodSecurityPolicyApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *PodSecurityPolicyApplyConfiguration) WithName(value string) *PodSecurityPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *PodSecurityPolicyApplyConfiguration) WithGenerateName(value string) *PodSecurityPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *PodSecurityPolicyApplyConfiguration) WithNamespace(value string) *PodSecurityPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *PodSecurityPolicyApplyConfiguration) WithSelfLink(value string) *PodSecurityPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *PodSecurityPolicyApplyConfiguration) WithUID(value types.UID) *PodSecurityPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *PodSecurityPolicyApplyConfiguration) WithResourceVersion(value string) *PodSecurityPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *PodSecurityPolicyApplyConfiguration) WithGeneration(value int64) *PodSecurityPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *PodSecurityPolicyApplyConfiguration) WithCreationTimestamp(value metav1.Time) *PodSecurityPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *PodSecurityPolicyApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *PodSecurityPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *PodSecurityPolicyApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *PodSecurityPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *PodSecurityPolicyApplyConfiguration) WithLabels(entries map[string]string) *PodSecurityPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *PodSecurityPolicyApplyConfiguration) WithAnnotations(entries map[string]string) *PodSecurityPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *PodSecurityPolicyApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *PodSecurityPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *PodSecurityPolicyApplyConfiguration) WithFinalizers(values ...string) *PodSecurityPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *PodSecurityPolicyApplyConfiguration) WithClusterName(value string) *PodSecurityPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *PodSecurityPolicyApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *PodSecurityPolicyApplyConfiguration) WithSpec(value *PodSecurityPolicySpecApplyConfiguration) *PodSecurityPolicyApplyConfiguration { + b.Spec = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/podsecuritypolicyspec.go b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/podsecuritypolicyspec.go new file mode 100644 index 000000000000..de3949dc92d5 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/podsecuritypolicyspec.go @@ -0,0 +1,285 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1 "k8s.io/api/core/v1" + v1beta1 "k8s.io/api/extensions/v1beta1" +) + +// PodSecurityPolicySpecApplyConfiguration represents an declarative configuration of the PodSecurityPolicySpec type for use +// with apply. +type PodSecurityPolicySpecApplyConfiguration struct { + Privileged *bool `json:"privileged,omitempty"` + DefaultAddCapabilities []v1.Capability `json:"defaultAddCapabilities,omitempty"` + RequiredDropCapabilities []v1.Capability `json:"requiredDropCapabilities,omitempty"` + AllowedCapabilities []v1.Capability `json:"allowedCapabilities,omitempty"` + Volumes []v1beta1.FSType `json:"volumes,omitempty"` + HostNetwork *bool `json:"hostNetwork,omitempty"` + HostPorts []HostPortRangeApplyConfiguration `json:"hostPorts,omitempty"` + HostPID *bool `json:"hostPID,omitempty"` + HostIPC *bool `json:"hostIPC,omitempty"` + SELinux *SELinuxStrategyOptionsApplyConfiguration `json:"seLinux,omitempty"` + RunAsUser *RunAsUserStrategyOptionsApplyConfiguration `json:"runAsUser,omitempty"` + RunAsGroup *RunAsGroupStrategyOptionsApplyConfiguration `json:"runAsGroup,omitempty"` + SupplementalGroups *SupplementalGroupsStrategyOptionsApplyConfiguration `json:"supplementalGroups,omitempty"` + FSGroup *FSGroupStrategyOptionsApplyConfiguration `json:"fsGroup,omitempty"` + ReadOnlyRootFilesystem *bool `json:"readOnlyRootFilesystem,omitempty"` + DefaultAllowPrivilegeEscalation *bool `json:"defaultAllowPrivilegeEscalation,omitempty"` + AllowPrivilegeEscalation *bool `json:"allowPrivilegeEscalation,omitempty"` + AllowedHostPaths []AllowedHostPathApplyConfiguration `json:"allowedHostPaths,omitempty"` + AllowedFlexVolumes []AllowedFlexVolumeApplyConfiguration `json:"allowedFlexVolumes,omitempty"` + AllowedCSIDrivers []AllowedCSIDriverApplyConfiguration `json:"allowedCSIDrivers,omitempty"` + AllowedUnsafeSysctls []string `json:"allowedUnsafeSysctls,omitempty"` + ForbiddenSysctls []string `json:"forbiddenSysctls,omitempty"` + AllowedProcMountTypes []v1.ProcMountType `json:"allowedProcMountTypes,omitempty"` + RuntimeClass *RuntimeClassStrategyOptionsApplyConfiguration `json:"runtimeClass,omitempty"` +} + +// PodSecurityPolicySpecApplyConfiguration constructs an declarative configuration of the PodSecurityPolicySpec type for use with +// apply. +func PodSecurityPolicySpec() *PodSecurityPolicySpecApplyConfiguration { + return &PodSecurityPolicySpecApplyConfiguration{} +} + +// WithPrivileged sets the Privileged field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Privileged field is set to the value of the last call. +func (b *PodSecurityPolicySpecApplyConfiguration) WithPrivileged(value bool) *PodSecurityPolicySpecApplyConfiguration { + b.Privileged = &value + return b +} + +// WithDefaultAddCapabilities adds the given value to the DefaultAddCapabilities field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the DefaultAddCapabilities field. +func (b *PodSecurityPolicySpecApplyConfiguration) WithDefaultAddCapabilities(values ...v1.Capability) *PodSecurityPolicySpecApplyConfiguration { + for i := range values { + b.DefaultAddCapabilities = append(b.DefaultAddCapabilities, values[i]) + } + return b +} + +// WithRequiredDropCapabilities adds the given value to the RequiredDropCapabilities field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the RequiredDropCapabilities field. +func (b *PodSecurityPolicySpecApplyConfiguration) WithRequiredDropCapabilities(values ...v1.Capability) *PodSecurityPolicySpecApplyConfiguration { + for i := range values { + b.RequiredDropCapabilities = append(b.RequiredDropCapabilities, values[i]) + } + return b +} + +// WithAllowedCapabilities adds the given value to the AllowedCapabilities field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the AllowedCapabilities field. +func (b *PodSecurityPolicySpecApplyConfiguration) WithAllowedCapabilities(values ...v1.Capability) *PodSecurityPolicySpecApplyConfiguration { + for i := range values { + b.AllowedCapabilities = append(b.AllowedCapabilities, values[i]) + } + return b +} + +// WithVolumes adds the given value to the Volumes field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Volumes field. +func (b *PodSecurityPolicySpecApplyConfiguration) WithVolumes(values ...v1beta1.FSType) *PodSecurityPolicySpecApplyConfiguration { + for i := range values { + b.Volumes = append(b.Volumes, values[i]) + } + return b +} + +// WithHostNetwork sets the HostNetwork field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the HostNetwork field is set to the value of the last call. +func (b *PodSecurityPolicySpecApplyConfiguration) WithHostNetwork(value bool) *PodSecurityPolicySpecApplyConfiguration { + b.HostNetwork = &value + return b +} + +// WithHostPorts adds the given value to the HostPorts field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the HostPorts field. +func (b *PodSecurityPolicySpecApplyConfiguration) WithHostPorts(values ...*HostPortRangeApplyConfiguration) *PodSecurityPolicySpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithHostPorts") + } + b.HostPorts = append(b.HostPorts, *values[i]) + } + return b +} + +// WithHostPID sets the HostPID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the HostPID field is set to the value of the last call. +func (b *PodSecurityPolicySpecApplyConfiguration) WithHostPID(value bool) *PodSecurityPolicySpecApplyConfiguration { + b.HostPID = &value + return b +} + +// WithHostIPC sets the HostIPC field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the HostIPC field is set to the value of the last call. +func (b *PodSecurityPolicySpecApplyConfiguration) WithHostIPC(value bool) *PodSecurityPolicySpecApplyConfiguration { + b.HostIPC = &value + return b +} + +// WithSELinux sets the SELinux field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SELinux field is set to the value of the last call. +func (b *PodSecurityPolicySpecApplyConfiguration) WithSELinux(value *SELinuxStrategyOptionsApplyConfiguration) *PodSecurityPolicySpecApplyConfiguration { + b.SELinux = value + return b +} + +// WithRunAsUser sets the RunAsUser field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RunAsUser field is set to the value of the last call. +func (b *PodSecurityPolicySpecApplyConfiguration) WithRunAsUser(value *RunAsUserStrategyOptionsApplyConfiguration) *PodSecurityPolicySpecApplyConfiguration { + b.RunAsUser = value + return b +} + +// WithRunAsGroup sets the RunAsGroup field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RunAsGroup field is set to the value of the last call. +func (b *PodSecurityPolicySpecApplyConfiguration) WithRunAsGroup(value *RunAsGroupStrategyOptionsApplyConfiguration) *PodSecurityPolicySpecApplyConfiguration { + b.RunAsGroup = value + return b +} + +// WithSupplementalGroups sets the SupplementalGroups field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SupplementalGroups field is set to the value of the last call. +func (b *PodSecurityPolicySpecApplyConfiguration) WithSupplementalGroups(value *SupplementalGroupsStrategyOptionsApplyConfiguration) *PodSecurityPolicySpecApplyConfiguration { + b.SupplementalGroups = value + return b +} + +// WithFSGroup sets the FSGroup field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FSGroup field is set to the value of the last call. +func (b *PodSecurityPolicySpecApplyConfiguration) WithFSGroup(value *FSGroupStrategyOptionsApplyConfiguration) *PodSecurityPolicySpecApplyConfiguration { + b.FSGroup = value + return b +} + +// WithReadOnlyRootFilesystem sets the ReadOnlyRootFilesystem field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadOnlyRootFilesystem field is set to the value of the last call. +func (b *PodSecurityPolicySpecApplyConfiguration) WithReadOnlyRootFilesystem(value bool) *PodSecurityPolicySpecApplyConfiguration { + b.ReadOnlyRootFilesystem = &value + return b +} + +// WithDefaultAllowPrivilegeEscalation sets the DefaultAllowPrivilegeEscalation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DefaultAllowPrivilegeEscalation field is set to the value of the last call. +func (b *PodSecurityPolicySpecApplyConfiguration) WithDefaultAllowPrivilegeEscalation(value bool) *PodSecurityPolicySpecApplyConfiguration { + b.DefaultAllowPrivilegeEscalation = &value + return b +} + +// WithAllowPrivilegeEscalation sets the AllowPrivilegeEscalation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AllowPrivilegeEscalation field is set to the value of the last call. +func (b *PodSecurityPolicySpecApplyConfiguration) WithAllowPrivilegeEscalation(value bool) *PodSecurityPolicySpecApplyConfiguration { + b.AllowPrivilegeEscalation = &value + return b +} + +// WithAllowedHostPaths adds the given value to the AllowedHostPaths field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the AllowedHostPaths field. +func (b *PodSecurityPolicySpecApplyConfiguration) WithAllowedHostPaths(values ...*AllowedHostPathApplyConfiguration) *PodSecurityPolicySpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithAllowedHostPaths") + } + b.AllowedHostPaths = append(b.AllowedHostPaths, *values[i]) + } + return b +} + +// WithAllowedFlexVolumes adds the given value to the AllowedFlexVolumes field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the AllowedFlexVolumes field. +func (b *PodSecurityPolicySpecApplyConfiguration) WithAllowedFlexVolumes(values ...*AllowedFlexVolumeApplyConfiguration) *PodSecurityPolicySpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithAllowedFlexVolumes") + } + b.AllowedFlexVolumes = append(b.AllowedFlexVolumes, *values[i]) + } + return b +} + +// WithAllowedCSIDrivers adds the given value to the AllowedCSIDrivers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the AllowedCSIDrivers field. +func (b *PodSecurityPolicySpecApplyConfiguration) WithAllowedCSIDrivers(values ...*AllowedCSIDriverApplyConfiguration) *PodSecurityPolicySpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithAllowedCSIDrivers") + } + b.AllowedCSIDrivers = append(b.AllowedCSIDrivers, *values[i]) + } + return b +} + +// WithAllowedUnsafeSysctls adds the given value to the AllowedUnsafeSysctls field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the AllowedUnsafeSysctls field. +func (b *PodSecurityPolicySpecApplyConfiguration) WithAllowedUnsafeSysctls(values ...string) *PodSecurityPolicySpecApplyConfiguration { + for i := range values { + b.AllowedUnsafeSysctls = append(b.AllowedUnsafeSysctls, values[i]) + } + return b +} + +// WithForbiddenSysctls adds the given value to the ForbiddenSysctls field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the ForbiddenSysctls field. +func (b *PodSecurityPolicySpecApplyConfiguration) WithForbiddenSysctls(values ...string) *PodSecurityPolicySpecApplyConfiguration { + for i := range values { + b.ForbiddenSysctls = append(b.ForbiddenSysctls, values[i]) + } + return b +} + +// WithAllowedProcMountTypes adds the given value to the AllowedProcMountTypes field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the AllowedProcMountTypes field. +func (b *PodSecurityPolicySpecApplyConfiguration) WithAllowedProcMountTypes(values ...v1.ProcMountType) *PodSecurityPolicySpecApplyConfiguration { + for i := range values { + b.AllowedProcMountTypes = append(b.AllowedProcMountTypes, values[i]) + } + return b +} + +// WithRuntimeClass sets the RuntimeClass field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RuntimeClass field is set to the value of the last call. +func (b *PodSecurityPolicySpecApplyConfiguration) WithRuntimeClass(value *RuntimeClassStrategyOptionsApplyConfiguration) *PodSecurityPolicySpecApplyConfiguration { + b.RuntimeClass = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/replicaset.go b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/replicaset.go new file mode 100644 index 000000000000..dc7e7da78e21 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/replicaset.go @@ -0,0 +1,265 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + extensionsv1beta1 "k8s.io/api/extensions/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// ReplicaSetApplyConfiguration represents an declarative configuration of the ReplicaSet type for use +// with apply. +type ReplicaSetApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *ReplicaSetSpecApplyConfiguration `json:"spec,omitempty"` + Status *ReplicaSetStatusApplyConfiguration `json:"status,omitempty"` +} + +// ReplicaSet constructs an declarative configuration of the ReplicaSet type for use with +// apply. +func ReplicaSet(name, namespace string) *ReplicaSetApplyConfiguration { + b := &ReplicaSetApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("ReplicaSet") + b.WithAPIVersion("extensions/v1beta1") + return b +} + +// ExtractReplicaSet extracts the applied configuration owned by fieldManager from +// replicaSet. If no managedFields are found in replicaSet for fieldManager, a +// ReplicaSetApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// replicaSet must be a unmodified ReplicaSet API object that was retrieved from the Kubernetes API. +// ExtractReplicaSet provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractReplicaSet(replicaSet *extensionsv1beta1.ReplicaSet, fieldManager string) (*ReplicaSetApplyConfiguration, error) { + b := &ReplicaSetApplyConfiguration{} + err := managedfields.ExtractInto(replicaSet, internal.Parser().Type("io.k8s.api.extensions.v1beta1.ReplicaSet"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(replicaSet.Name) + b.WithNamespace(replicaSet.Namespace) + + b.WithKind("ReplicaSet") + b.WithAPIVersion("extensions/v1beta1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *ReplicaSetApplyConfiguration) WithKind(value string) *ReplicaSetApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *ReplicaSetApplyConfiguration) WithAPIVersion(value string) *ReplicaSetApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ReplicaSetApplyConfiguration) WithName(value string) *ReplicaSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *ReplicaSetApplyConfiguration) WithGenerateName(value string) *ReplicaSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *ReplicaSetApplyConfiguration) WithNamespace(value string) *ReplicaSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *ReplicaSetApplyConfiguration) WithSelfLink(value string) *ReplicaSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *ReplicaSetApplyConfiguration) WithUID(value types.UID) *ReplicaSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *ReplicaSetApplyConfiguration) WithResourceVersion(value string) *ReplicaSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *ReplicaSetApplyConfiguration) WithGeneration(value int64) *ReplicaSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *ReplicaSetApplyConfiguration) WithCreationTimestamp(value metav1.Time) *ReplicaSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *ReplicaSetApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *ReplicaSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *ReplicaSetApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *ReplicaSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *ReplicaSetApplyConfiguration) WithLabels(entries map[string]string) *ReplicaSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *ReplicaSetApplyConfiguration) WithAnnotations(entries map[string]string) *ReplicaSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *ReplicaSetApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *ReplicaSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *ReplicaSetApplyConfiguration) WithFinalizers(values ...string) *ReplicaSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *ReplicaSetApplyConfiguration) WithClusterName(value string) *ReplicaSetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *ReplicaSetApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *ReplicaSetApplyConfiguration) WithSpec(value *ReplicaSetSpecApplyConfiguration) *ReplicaSetApplyConfiguration { + b.Spec = value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *ReplicaSetApplyConfiguration) WithStatus(value *ReplicaSetStatusApplyConfiguration) *ReplicaSetApplyConfiguration { + b.Status = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/replicasetcondition.go b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/replicasetcondition.go new file mode 100644 index 000000000000..b717365175be --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/replicasetcondition.go @@ -0,0 +1,81 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1 "k8s.io/api/core/v1" + v1beta1 "k8s.io/api/extensions/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// ReplicaSetConditionApplyConfiguration represents an declarative configuration of the ReplicaSetCondition type for use +// with apply. +type ReplicaSetConditionApplyConfiguration struct { + Type *v1beta1.ReplicaSetConditionType `json:"type,omitempty"` + Status *v1.ConditionStatus `json:"status,omitempty"` + LastTransitionTime *metav1.Time `json:"lastTransitionTime,omitempty"` + Reason *string `json:"reason,omitempty"` + Message *string `json:"message,omitempty"` +} + +// ReplicaSetConditionApplyConfiguration constructs an declarative configuration of the ReplicaSetCondition type for use with +// apply. +func ReplicaSetCondition() *ReplicaSetConditionApplyConfiguration { + return &ReplicaSetConditionApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *ReplicaSetConditionApplyConfiguration) WithType(value v1beta1.ReplicaSetConditionType) *ReplicaSetConditionApplyConfiguration { + b.Type = &value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *ReplicaSetConditionApplyConfiguration) WithStatus(value v1.ConditionStatus) *ReplicaSetConditionApplyConfiguration { + b.Status = &value + return b +} + +// WithLastTransitionTime sets the LastTransitionTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastTransitionTime field is set to the value of the last call. +func (b *ReplicaSetConditionApplyConfiguration) WithLastTransitionTime(value metav1.Time) *ReplicaSetConditionApplyConfiguration { + b.LastTransitionTime = &value + return b +} + +// WithReason sets the Reason field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Reason field is set to the value of the last call. +func (b *ReplicaSetConditionApplyConfiguration) WithReason(value string) *ReplicaSetConditionApplyConfiguration { + b.Reason = &value + return b +} + +// WithMessage sets the Message field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Message field is set to the value of the last call. +func (b *ReplicaSetConditionApplyConfiguration) WithMessage(value string) *ReplicaSetConditionApplyConfiguration { + b.Message = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/replicasetspec.go b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/replicasetspec.go new file mode 100644 index 000000000000..5d0c570149ed --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/replicasetspec.go @@ -0,0 +1,71 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + corev1 "k8s.io/client-go/applyconfigurations/core/v1" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// ReplicaSetSpecApplyConfiguration represents an declarative configuration of the ReplicaSetSpec type for use +// with apply. +type ReplicaSetSpecApplyConfiguration struct { + Replicas *int32 `json:"replicas,omitempty"` + MinReadySeconds *int32 `json:"minReadySeconds,omitempty"` + Selector *v1.LabelSelectorApplyConfiguration `json:"selector,omitempty"` + Template *corev1.PodTemplateSpecApplyConfiguration `json:"template,omitempty"` +} + +// ReplicaSetSpecApplyConfiguration constructs an declarative configuration of the ReplicaSetSpec type for use with +// apply. +func ReplicaSetSpec() *ReplicaSetSpecApplyConfiguration { + return &ReplicaSetSpecApplyConfiguration{} +} + +// WithReplicas sets the Replicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Replicas field is set to the value of the last call. +func (b *ReplicaSetSpecApplyConfiguration) WithReplicas(value int32) *ReplicaSetSpecApplyConfiguration { + b.Replicas = &value + return b +} + +// WithMinReadySeconds sets the MinReadySeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MinReadySeconds field is set to the value of the last call. +func (b *ReplicaSetSpecApplyConfiguration) WithMinReadySeconds(value int32) *ReplicaSetSpecApplyConfiguration { + b.MinReadySeconds = &value + return b +} + +// WithSelector sets the Selector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Selector field is set to the value of the last call. +func (b *ReplicaSetSpecApplyConfiguration) WithSelector(value *v1.LabelSelectorApplyConfiguration) *ReplicaSetSpecApplyConfiguration { + b.Selector = value + return b +} + +// WithTemplate sets the Template field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Template field is set to the value of the last call. +func (b *ReplicaSetSpecApplyConfiguration) WithTemplate(value *corev1.PodTemplateSpecApplyConfiguration) *ReplicaSetSpecApplyConfiguration { + b.Template = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/replicasetstatus.go b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/replicasetstatus.go new file mode 100644 index 000000000000..45dc4bf319c1 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/replicasetstatus.go @@ -0,0 +1,89 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// ReplicaSetStatusApplyConfiguration represents an declarative configuration of the ReplicaSetStatus type for use +// with apply. +type ReplicaSetStatusApplyConfiguration struct { + Replicas *int32 `json:"replicas,omitempty"` + FullyLabeledReplicas *int32 `json:"fullyLabeledReplicas,omitempty"` + ReadyReplicas *int32 `json:"readyReplicas,omitempty"` + AvailableReplicas *int32 `json:"availableReplicas,omitempty"` + ObservedGeneration *int64 `json:"observedGeneration,omitempty"` + Conditions []ReplicaSetConditionApplyConfiguration `json:"conditions,omitempty"` +} + +// ReplicaSetStatusApplyConfiguration constructs an declarative configuration of the ReplicaSetStatus type for use with +// apply. +func ReplicaSetStatus() *ReplicaSetStatusApplyConfiguration { + return &ReplicaSetStatusApplyConfiguration{} +} + +// WithReplicas sets the Replicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Replicas field is set to the value of the last call. +func (b *ReplicaSetStatusApplyConfiguration) WithReplicas(value int32) *ReplicaSetStatusApplyConfiguration { + b.Replicas = &value + return b +} + +// WithFullyLabeledReplicas sets the FullyLabeledReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FullyLabeledReplicas field is set to the value of the last call. +func (b *ReplicaSetStatusApplyConfiguration) WithFullyLabeledReplicas(value int32) *ReplicaSetStatusApplyConfiguration { + b.FullyLabeledReplicas = &value + return b +} + +// WithReadyReplicas sets the ReadyReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadyReplicas field is set to the value of the last call. +func (b *ReplicaSetStatusApplyConfiguration) WithReadyReplicas(value int32) *ReplicaSetStatusApplyConfiguration { + b.ReadyReplicas = &value + return b +} + +// WithAvailableReplicas sets the AvailableReplicas field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AvailableReplicas field is set to the value of the last call. +func (b *ReplicaSetStatusApplyConfiguration) WithAvailableReplicas(value int32) *ReplicaSetStatusApplyConfiguration { + b.AvailableReplicas = &value + return b +} + +// WithObservedGeneration sets the ObservedGeneration field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ObservedGeneration field is set to the value of the last call. +func (b *ReplicaSetStatusApplyConfiguration) WithObservedGeneration(value int64) *ReplicaSetStatusApplyConfiguration { + b.ObservedGeneration = &value + return b +} + +// WithConditions adds the given value to the Conditions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Conditions field. +func (b *ReplicaSetStatusApplyConfiguration) WithConditions(values ...*ReplicaSetConditionApplyConfiguration) *ReplicaSetStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithConditions") + } + b.Conditions = append(b.Conditions, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/rollbackconfig.go b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/rollbackconfig.go new file mode 100644 index 000000000000..131e57a39df4 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/rollbackconfig.go @@ -0,0 +1,39 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// RollbackConfigApplyConfiguration represents an declarative configuration of the RollbackConfig type for use +// with apply. +type RollbackConfigApplyConfiguration struct { + Revision *int64 `json:"revision,omitempty"` +} + +// RollbackConfigApplyConfiguration constructs an declarative configuration of the RollbackConfig type for use with +// apply. +func RollbackConfig() *RollbackConfigApplyConfiguration { + return &RollbackConfigApplyConfiguration{} +} + +// WithRevision sets the Revision field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Revision field is set to the value of the last call. +func (b *RollbackConfigApplyConfiguration) WithRevision(value int64) *RollbackConfigApplyConfiguration { + b.Revision = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/rollingupdatedaemonset.go b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/rollingupdatedaemonset.go new file mode 100644 index 000000000000..3aa5e2f891e6 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/rollingupdatedaemonset.go @@ -0,0 +1,52 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + intstr "k8s.io/apimachinery/pkg/util/intstr" +) + +// RollingUpdateDaemonSetApplyConfiguration represents an declarative configuration of the RollingUpdateDaemonSet type for use +// with apply. +type RollingUpdateDaemonSetApplyConfiguration struct { + MaxUnavailable *intstr.IntOrString `json:"maxUnavailable,omitempty"` + MaxSurge *intstr.IntOrString `json:"maxSurge,omitempty"` +} + +// RollingUpdateDaemonSetApplyConfiguration constructs an declarative configuration of the RollingUpdateDaemonSet type for use with +// apply. +func RollingUpdateDaemonSet() *RollingUpdateDaemonSetApplyConfiguration { + return &RollingUpdateDaemonSetApplyConfiguration{} +} + +// WithMaxUnavailable sets the MaxUnavailable field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MaxUnavailable field is set to the value of the last call. +func (b *RollingUpdateDaemonSetApplyConfiguration) WithMaxUnavailable(value intstr.IntOrString) *RollingUpdateDaemonSetApplyConfiguration { + b.MaxUnavailable = &value + return b +} + +// WithMaxSurge sets the MaxSurge field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MaxSurge field is set to the value of the last call. +func (b *RollingUpdateDaemonSetApplyConfiguration) WithMaxSurge(value intstr.IntOrString) *RollingUpdateDaemonSetApplyConfiguration { + b.MaxSurge = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/rollingupdatedeployment.go b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/rollingupdatedeployment.go new file mode 100644 index 000000000000..dde5f064b000 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/rollingupdatedeployment.go @@ -0,0 +1,52 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + intstr "k8s.io/apimachinery/pkg/util/intstr" +) + +// RollingUpdateDeploymentApplyConfiguration represents an declarative configuration of the RollingUpdateDeployment type for use +// with apply. +type RollingUpdateDeploymentApplyConfiguration struct { + MaxUnavailable *intstr.IntOrString `json:"maxUnavailable,omitempty"` + MaxSurge *intstr.IntOrString `json:"maxSurge,omitempty"` +} + +// RollingUpdateDeploymentApplyConfiguration constructs an declarative configuration of the RollingUpdateDeployment type for use with +// apply. +func RollingUpdateDeployment() *RollingUpdateDeploymentApplyConfiguration { + return &RollingUpdateDeploymentApplyConfiguration{} +} + +// WithMaxUnavailable sets the MaxUnavailable field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MaxUnavailable field is set to the value of the last call. +func (b *RollingUpdateDeploymentApplyConfiguration) WithMaxUnavailable(value intstr.IntOrString) *RollingUpdateDeploymentApplyConfiguration { + b.MaxUnavailable = &value + return b +} + +// WithMaxSurge sets the MaxSurge field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MaxSurge field is set to the value of the last call. +func (b *RollingUpdateDeploymentApplyConfiguration) WithMaxSurge(value intstr.IntOrString) *RollingUpdateDeploymentApplyConfiguration { + b.MaxSurge = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/runasgroupstrategyoptions.go b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/runasgroupstrategyoptions.go new file mode 100644 index 000000000000..75e76e85fd1b --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/runasgroupstrategyoptions.go @@ -0,0 +1,57 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1beta1 "k8s.io/api/extensions/v1beta1" +) + +// RunAsGroupStrategyOptionsApplyConfiguration represents an declarative configuration of the RunAsGroupStrategyOptions type for use +// with apply. +type RunAsGroupStrategyOptionsApplyConfiguration struct { + Rule *v1beta1.RunAsGroupStrategy `json:"rule,omitempty"` + Ranges []IDRangeApplyConfiguration `json:"ranges,omitempty"` +} + +// RunAsGroupStrategyOptionsApplyConfiguration constructs an declarative configuration of the RunAsGroupStrategyOptions type for use with +// apply. +func RunAsGroupStrategyOptions() *RunAsGroupStrategyOptionsApplyConfiguration { + return &RunAsGroupStrategyOptionsApplyConfiguration{} +} + +// WithRule sets the Rule field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Rule field is set to the value of the last call. +func (b *RunAsGroupStrategyOptionsApplyConfiguration) WithRule(value v1beta1.RunAsGroupStrategy) *RunAsGroupStrategyOptionsApplyConfiguration { + b.Rule = &value + return b +} + +// WithRanges adds the given value to the Ranges field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Ranges field. +func (b *RunAsGroupStrategyOptionsApplyConfiguration) WithRanges(values ...*IDRangeApplyConfiguration) *RunAsGroupStrategyOptionsApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithRanges") + } + b.Ranges = append(b.Ranges, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/runasuserstrategyoptions.go b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/runasuserstrategyoptions.go new file mode 100644 index 000000000000..712c1675ac92 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/runasuserstrategyoptions.go @@ -0,0 +1,57 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1beta1 "k8s.io/api/extensions/v1beta1" +) + +// RunAsUserStrategyOptionsApplyConfiguration represents an declarative configuration of the RunAsUserStrategyOptions type for use +// with apply. +type RunAsUserStrategyOptionsApplyConfiguration struct { + Rule *v1beta1.RunAsUserStrategy `json:"rule,omitempty"` + Ranges []IDRangeApplyConfiguration `json:"ranges,omitempty"` +} + +// RunAsUserStrategyOptionsApplyConfiguration constructs an declarative configuration of the RunAsUserStrategyOptions type for use with +// apply. +func RunAsUserStrategyOptions() *RunAsUserStrategyOptionsApplyConfiguration { + return &RunAsUserStrategyOptionsApplyConfiguration{} +} + +// WithRule sets the Rule field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Rule field is set to the value of the last call. +func (b *RunAsUserStrategyOptionsApplyConfiguration) WithRule(value v1beta1.RunAsUserStrategy) *RunAsUserStrategyOptionsApplyConfiguration { + b.Rule = &value + return b +} + +// WithRanges adds the given value to the Ranges field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Ranges field. +func (b *RunAsUserStrategyOptionsApplyConfiguration) WithRanges(values ...*IDRangeApplyConfiguration) *RunAsUserStrategyOptionsApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithRanges") + } + b.Ranges = append(b.Ranges, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/runtimeclassstrategyoptions.go b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/runtimeclassstrategyoptions.go new file mode 100644 index 000000000000..c19a7ce61756 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/runtimeclassstrategyoptions.go @@ -0,0 +1,50 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// RuntimeClassStrategyOptionsApplyConfiguration represents an declarative configuration of the RuntimeClassStrategyOptions type for use +// with apply. +type RuntimeClassStrategyOptionsApplyConfiguration struct { + AllowedRuntimeClassNames []string `json:"allowedRuntimeClassNames,omitempty"` + DefaultRuntimeClassName *string `json:"defaultRuntimeClassName,omitempty"` +} + +// RuntimeClassStrategyOptionsApplyConfiguration constructs an declarative configuration of the RuntimeClassStrategyOptions type for use with +// apply. +func RuntimeClassStrategyOptions() *RuntimeClassStrategyOptionsApplyConfiguration { + return &RuntimeClassStrategyOptionsApplyConfiguration{} +} + +// WithAllowedRuntimeClassNames adds the given value to the AllowedRuntimeClassNames field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the AllowedRuntimeClassNames field. +func (b *RuntimeClassStrategyOptionsApplyConfiguration) WithAllowedRuntimeClassNames(values ...string) *RuntimeClassStrategyOptionsApplyConfiguration { + for i := range values { + b.AllowedRuntimeClassNames = append(b.AllowedRuntimeClassNames, values[i]) + } + return b +} + +// WithDefaultRuntimeClassName sets the DefaultRuntimeClassName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DefaultRuntimeClassName field is set to the value of the last call. +func (b *RuntimeClassStrategyOptionsApplyConfiguration) WithDefaultRuntimeClassName(value string) *RuntimeClassStrategyOptionsApplyConfiguration { + b.DefaultRuntimeClassName = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/selinuxstrategyoptions.go b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/selinuxstrategyoptions.go new file mode 100644 index 000000000000..265906a73a5f --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/selinuxstrategyoptions.go @@ -0,0 +1,53 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1beta1 "k8s.io/api/extensions/v1beta1" + v1 "k8s.io/client-go/applyconfigurations/core/v1" +) + +// SELinuxStrategyOptionsApplyConfiguration represents an declarative configuration of the SELinuxStrategyOptions type for use +// with apply. +type SELinuxStrategyOptionsApplyConfiguration struct { + Rule *v1beta1.SELinuxStrategy `json:"rule,omitempty"` + SELinuxOptions *v1.SELinuxOptionsApplyConfiguration `json:"seLinuxOptions,omitempty"` +} + +// SELinuxStrategyOptionsApplyConfiguration constructs an declarative configuration of the SELinuxStrategyOptions type for use with +// apply. +func SELinuxStrategyOptions() *SELinuxStrategyOptionsApplyConfiguration { + return &SELinuxStrategyOptionsApplyConfiguration{} +} + +// WithRule sets the Rule field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Rule field is set to the value of the last call. +func (b *SELinuxStrategyOptionsApplyConfiguration) WithRule(value v1beta1.SELinuxStrategy) *SELinuxStrategyOptionsApplyConfiguration { + b.Rule = &value + return b +} + +// WithSELinuxOptions sets the SELinuxOptions field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SELinuxOptions field is set to the value of the last call. +func (b *SELinuxStrategyOptionsApplyConfiguration) WithSELinuxOptions(value *v1.SELinuxOptionsApplyConfiguration) *SELinuxStrategyOptionsApplyConfiguration { + b.SELinuxOptions = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/supplementalgroupsstrategyoptions.go b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/supplementalgroupsstrategyoptions.go new file mode 100644 index 000000000000..ec4313812459 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/supplementalgroupsstrategyoptions.go @@ -0,0 +1,57 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1beta1 "k8s.io/api/extensions/v1beta1" +) + +// SupplementalGroupsStrategyOptionsApplyConfiguration represents an declarative configuration of the SupplementalGroupsStrategyOptions type for use +// with apply. +type SupplementalGroupsStrategyOptionsApplyConfiguration struct { + Rule *v1beta1.SupplementalGroupsStrategyType `json:"rule,omitempty"` + Ranges []IDRangeApplyConfiguration `json:"ranges,omitempty"` +} + +// SupplementalGroupsStrategyOptionsApplyConfiguration constructs an declarative configuration of the SupplementalGroupsStrategyOptions type for use with +// apply. +func SupplementalGroupsStrategyOptions() *SupplementalGroupsStrategyOptionsApplyConfiguration { + return &SupplementalGroupsStrategyOptionsApplyConfiguration{} +} + +// WithRule sets the Rule field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Rule field is set to the value of the last call. +func (b *SupplementalGroupsStrategyOptionsApplyConfiguration) WithRule(value v1beta1.SupplementalGroupsStrategyType) *SupplementalGroupsStrategyOptionsApplyConfiguration { + b.Rule = &value + return b +} + +// WithRanges adds the given value to the Ranges field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Ranges field. +func (b *SupplementalGroupsStrategyOptionsApplyConfiguration) WithRanges(values ...*IDRangeApplyConfiguration) *SupplementalGroupsStrategyOptionsApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithRanges") + } + b.Ranges = append(b.Ranges, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/flowdistinguishermethod.go b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/flowdistinguishermethod.go new file mode 100644 index 000000000000..507f8e9abe78 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/flowdistinguishermethod.go @@ -0,0 +1,43 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + v1alpha1 "k8s.io/api/flowcontrol/v1alpha1" +) + +// FlowDistinguisherMethodApplyConfiguration represents an declarative configuration of the FlowDistinguisherMethod type for use +// with apply. +type FlowDistinguisherMethodApplyConfiguration struct { + Type *v1alpha1.FlowDistinguisherMethodType `json:"type,omitempty"` +} + +// FlowDistinguisherMethodApplyConfiguration constructs an declarative configuration of the FlowDistinguisherMethod type for use with +// apply. +func FlowDistinguisherMethod() *FlowDistinguisherMethodApplyConfiguration { + return &FlowDistinguisherMethodApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *FlowDistinguisherMethodApplyConfiguration) WithType(value v1alpha1.FlowDistinguisherMethodType) *FlowDistinguisherMethodApplyConfiguration { + b.Type = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/flowschema.go b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/flowschema.go new file mode 100644 index 000000000000..76107d2d5902 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/flowschema.go @@ -0,0 +1,263 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + flowcontrolv1alpha1 "k8s.io/api/flowcontrol/v1alpha1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// FlowSchemaApplyConfiguration represents an declarative configuration of the FlowSchema type for use +// with apply. +type FlowSchemaApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *FlowSchemaSpecApplyConfiguration `json:"spec,omitempty"` + Status *FlowSchemaStatusApplyConfiguration `json:"status,omitempty"` +} + +// FlowSchema constructs an declarative configuration of the FlowSchema type for use with +// apply. +func FlowSchema(name string) *FlowSchemaApplyConfiguration { + b := &FlowSchemaApplyConfiguration{} + b.WithName(name) + b.WithKind("FlowSchema") + b.WithAPIVersion("flowcontrol.apiserver.k8s.io/v1alpha1") + return b +} + +// ExtractFlowSchema extracts the applied configuration owned by fieldManager from +// flowSchema. If no managedFields are found in flowSchema for fieldManager, a +// FlowSchemaApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// flowSchema must be a unmodified FlowSchema API object that was retrieved from the Kubernetes API. +// ExtractFlowSchema provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractFlowSchema(flowSchema *flowcontrolv1alpha1.FlowSchema, fieldManager string) (*FlowSchemaApplyConfiguration, error) { + b := &FlowSchemaApplyConfiguration{} + err := managedfields.ExtractInto(flowSchema, internal.Parser().Type("io.k8s.api.flowcontrol.v1alpha1.FlowSchema"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(flowSchema.Name) + + b.WithKind("FlowSchema") + b.WithAPIVersion("flowcontrol.apiserver.k8s.io/v1alpha1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *FlowSchemaApplyConfiguration) WithKind(value string) *FlowSchemaApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *FlowSchemaApplyConfiguration) WithAPIVersion(value string) *FlowSchemaApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *FlowSchemaApplyConfiguration) WithName(value string) *FlowSchemaApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *FlowSchemaApplyConfiguration) WithGenerateName(value string) *FlowSchemaApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *FlowSchemaApplyConfiguration) WithNamespace(value string) *FlowSchemaApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *FlowSchemaApplyConfiguration) WithSelfLink(value string) *FlowSchemaApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *FlowSchemaApplyConfiguration) WithUID(value types.UID) *FlowSchemaApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *FlowSchemaApplyConfiguration) WithResourceVersion(value string) *FlowSchemaApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *FlowSchemaApplyConfiguration) WithGeneration(value int64) *FlowSchemaApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *FlowSchemaApplyConfiguration) WithCreationTimestamp(value metav1.Time) *FlowSchemaApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *FlowSchemaApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *FlowSchemaApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *FlowSchemaApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *FlowSchemaApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *FlowSchemaApplyConfiguration) WithLabels(entries map[string]string) *FlowSchemaApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *FlowSchemaApplyConfiguration) WithAnnotations(entries map[string]string) *FlowSchemaApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *FlowSchemaApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *FlowSchemaApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *FlowSchemaApplyConfiguration) WithFinalizers(values ...string) *FlowSchemaApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *FlowSchemaApplyConfiguration) WithClusterName(value string) *FlowSchemaApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *FlowSchemaApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *FlowSchemaApplyConfiguration) WithSpec(value *FlowSchemaSpecApplyConfiguration) *FlowSchemaApplyConfiguration { + b.Spec = value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *FlowSchemaApplyConfiguration) WithStatus(value *FlowSchemaStatusApplyConfiguration) *FlowSchemaApplyConfiguration { + b.Status = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/flowschemacondition.go b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/flowschemacondition.go new file mode 100644 index 000000000000..31f5dc13ed39 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/flowschemacondition.go @@ -0,0 +1,80 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + v1alpha1 "k8s.io/api/flowcontrol/v1alpha1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// FlowSchemaConditionApplyConfiguration represents an declarative configuration of the FlowSchemaCondition type for use +// with apply. +type FlowSchemaConditionApplyConfiguration struct { + Type *v1alpha1.FlowSchemaConditionType `json:"type,omitempty"` + Status *v1alpha1.ConditionStatus `json:"status,omitempty"` + LastTransitionTime *v1.Time `json:"lastTransitionTime,omitempty"` + Reason *string `json:"reason,omitempty"` + Message *string `json:"message,omitempty"` +} + +// FlowSchemaConditionApplyConfiguration constructs an declarative configuration of the FlowSchemaCondition type for use with +// apply. +func FlowSchemaCondition() *FlowSchemaConditionApplyConfiguration { + return &FlowSchemaConditionApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *FlowSchemaConditionApplyConfiguration) WithType(value v1alpha1.FlowSchemaConditionType) *FlowSchemaConditionApplyConfiguration { + b.Type = &value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *FlowSchemaConditionApplyConfiguration) WithStatus(value v1alpha1.ConditionStatus) *FlowSchemaConditionApplyConfiguration { + b.Status = &value + return b +} + +// WithLastTransitionTime sets the LastTransitionTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastTransitionTime field is set to the value of the last call. +func (b *FlowSchemaConditionApplyConfiguration) WithLastTransitionTime(value v1.Time) *FlowSchemaConditionApplyConfiguration { + b.LastTransitionTime = &value + return b +} + +// WithReason sets the Reason field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Reason field is set to the value of the last call. +func (b *FlowSchemaConditionApplyConfiguration) WithReason(value string) *FlowSchemaConditionApplyConfiguration { + b.Reason = &value + return b +} + +// WithMessage sets the Message field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Message field is set to the value of the last call. +func (b *FlowSchemaConditionApplyConfiguration) WithMessage(value string) *FlowSchemaConditionApplyConfiguration { + b.Message = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/flowschemaspec.go b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/flowschemaspec.go new file mode 100644 index 000000000000..fd5fc0ae9aa3 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/flowschemaspec.go @@ -0,0 +1,71 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +// FlowSchemaSpecApplyConfiguration represents an declarative configuration of the FlowSchemaSpec type for use +// with apply. +type FlowSchemaSpecApplyConfiguration struct { + PriorityLevelConfiguration *PriorityLevelConfigurationReferenceApplyConfiguration `json:"priorityLevelConfiguration,omitempty"` + MatchingPrecedence *int32 `json:"matchingPrecedence,omitempty"` + DistinguisherMethod *FlowDistinguisherMethodApplyConfiguration `json:"distinguisherMethod,omitempty"` + Rules []PolicyRulesWithSubjectsApplyConfiguration `json:"rules,omitempty"` +} + +// FlowSchemaSpecApplyConfiguration constructs an declarative configuration of the FlowSchemaSpec type for use with +// apply. +func FlowSchemaSpec() *FlowSchemaSpecApplyConfiguration { + return &FlowSchemaSpecApplyConfiguration{} +} + +// WithPriorityLevelConfiguration sets the PriorityLevelConfiguration field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PriorityLevelConfiguration field is set to the value of the last call. +func (b *FlowSchemaSpecApplyConfiguration) WithPriorityLevelConfiguration(value *PriorityLevelConfigurationReferenceApplyConfiguration) *FlowSchemaSpecApplyConfiguration { + b.PriorityLevelConfiguration = value + return b +} + +// WithMatchingPrecedence sets the MatchingPrecedence field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MatchingPrecedence field is set to the value of the last call. +func (b *FlowSchemaSpecApplyConfiguration) WithMatchingPrecedence(value int32) *FlowSchemaSpecApplyConfiguration { + b.MatchingPrecedence = &value + return b +} + +// WithDistinguisherMethod sets the DistinguisherMethod field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DistinguisherMethod field is set to the value of the last call. +func (b *FlowSchemaSpecApplyConfiguration) WithDistinguisherMethod(value *FlowDistinguisherMethodApplyConfiguration) *FlowSchemaSpecApplyConfiguration { + b.DistinguisherMethod = value + return b +} + +// WithRules adds the given value to the Rules field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Rules field. +func (b *FlowSchemaSpecApplyConfiguration) WithRules(values ...*PolicyRulesWithSubjectsApplyConfiguration) *FlowSchemaSpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithRules") + } + b.Rules = append(b.Rules, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/flowschemastatus.go b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/flowschemastatus.go new file mode 100644 index 000000000000..db2dacf13afc --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/flowschemastatus.go @@ -0,0 +1,44 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +// FlowSchemaStatusApplyConfiguration represents an declarative configuration of the FlowSchemaStatus type for use +// with apply. +type FlowSchemaStatusApplyConfiguration struct { + Conditions []FlowSchemaConditionApplyConfiguration `json:"conditions,omitempty"` +} + +// FlowSchemaStatusApplyConfiguration constructs an declarative configuration of the FlowSchemaStatus type for use with +// apply. +func FlowSchemaStatus() *FlowSchemaStatusApplyConfiguration { + return &FlowSchemaStatusApplyConfiguration{} +} + +// WithConditions adds the given value to the Conditions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Conditions field. +func (b *FlowSchemaStatusApplyConfiguration) WithConditions(values ...*FlowSchemaConditionApplyConfiguration) *FlowSchemaStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithConditions") + } + b.Conditions = append(b.Conditions, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/groupsubject.go b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/groupsubject.go new file mode 100644 index 000000000000..0421f3f59999 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/groupsubject.go @@ -0,0 +1,39 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +// GroupSubjectApplyConfiguration represents an declarative configuration of the GroupSubject type for use +// with apply. +type GroupSubjectApplyConfiguration struct { + Name *string `json:"name,omitempty"` +} + +// GroupSubjectApplyConfiguration constructs an declarative configuration of the GroupSubject type for use with +// apply. +func GroupSubject() *GroupSubjectApplyConfiguration { + return &GroupSubjectApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *GroupSubjectApplyConfiguration) WithName(value string) *GroupSubjectApplyConfiguration { + b.Name = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/limitedprioritylevelconfiguration.go b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/limitedprioritylevelconfiguration.go new file mode 100644 index 000000000000..df3fecbd7faa --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/limitedprioritylevelconfiguration.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +// LimitedPriorityLevelConfigurationApplyConfiguration represents an declarative configuration of the LimitedPriorityLevelConfiguration type for use +// with apply. +type LimitedPriorityLevelConfigurationApplyConfiguration struct { + AssuredConcurrencyShares *int32 `json:"assuredConcurrencyShares,omitempty"` + LimitResponse *LimitResponseApplyConfiguration `json:"limitResponse,omitempty"` +} + +// LimitedPriorityLevelConfigurationApplyConfiguration constructs an declarative configuration of the LimitedPriorityLevelConfiguration type for use with +// apply. +func LimitedPriorityLevelConfiguration() *LimitedPriorityLevelConfigurationApplyConfiguration { + return &LimitedPriorityLevelConfigurationApplyConfiguration{} +} + +// WithAssuredConcurrencyShares sets the AssuredConcurrencyShares field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AssuredConcurrencyShares field is set to the value of the last call. +func (b *LimitedPriorityLevelConfigurationApplyConfiguration) WithAssuredConcurrencyShares(value int32) *LimitedPriorityLevelConfigurationApplyConfiguration { + b.AssuredConcurrencyShares = &value + return b +} + +// WithLimitResponse sets the LimitResponse field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LimitResponse field is set to the value of the last call. +func (b *LimitedPriorityLevelConfigurationApplyConfiguration) WithLimitResponse(value *LimitResponseApplyConfiguration) *LimitedPriorityLevelConfigurationApplyConfiguration { + b.LimitResponse = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/limitresponse.go b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/limitresponse.go new file mode 100644 index 000000000000..5edaa025cdb6 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/limitresponse.go @@ -0,0 +1,52 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + v1alpha1 "k8s.io/api/flowcontrol/v1alpha1" +) + +// LimitResponseApplyConfiguration represents an declarative configuration of the LimitResponse type for use +// with apply. +type LimitResponseApplyConfiguration struct { + Type *v1alpha1.LimitResponseType `json:"type,omitempty"` + Queuing *QueuingConfigurationApplyConfiguration `json:"queuing,omitempty"` +} + +// LimitResponseApplyConfiguration constructs an declarative configuration of the LimitResponse type for use with +// apply. +func LimitResponse() *LimitResponseApplyConfiguration { + return &LimitResponseApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *LimitResponseApplyConfiguration) WithType(value v1alpha1.LimitResponseType) *LimitResponseApplyConfiguration { + b.Type = &value + return b +} + +// WithQueuing sets the Queuing field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Queuing field is set to the value of the last call. +func (b *LimitResponseApplyConfiguration) WithQueuing(value *QueuingConfigurationApplyConfiguration) *LimitResponseApplyConfiguration { + b.Queuing = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/nonresourcepolicyrule.go b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/nonresourcepolicyrule.go new file mode 100644 index 000000000000..b1f09f5304cf --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/nonresourcepolicyrule.go @@ -0,0 +1,52 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +// NonResourcePolicyRuleApplyConfiguration represents an declarative configuration of the NonResourcePolicyRule type for use +// with apply. +type NonResourcePolicyRuleApplyConfiguration struct { + Verbs []string `json:"verbs,omitempty"` + NonResourceURLs []string `json:"nonResourceURLs,omitempty"` +} + +// NonResourcePolicyRuleApplyConfiguration constructs an declarative configuration of the NonResourcePolicyRule type for use with +// apply. +func NonResourcePolicyRule() *NonResourcePolicyRuleApplyConfiguration { + return &NonResourcePolicyRuleApplyConfiguration{} +} + +// WithVerbs adds the given value to the Verbs field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Verbs field. +func (b *NonResourcePolicyRuleApplyConfiguration) WithVerbs(values ...string) *NonResourcePolicyRuleApplyConfiguration { + for i := range values { + b.Verbs = append(b.Verbs, values[i]) + } + return b +} + +// WithNonResourceURLs adds the given value to the NonResourceURLs field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the NonResourceURLs field. +func (b *NonResourcePolicyRuleApplyConfiguration) WithNonResourceURLs(values ...string) *NonResourcePolicyRuleApplyConfiguration { + for i := range values { + b.NonResourceURLs = append(b.NonResourceURLs, values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/policyruleswithsubjects.go b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/policyruleswithsubjects.go new file mode 100644 index 000000000000..841104064465 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/policyruleswithsubjects.go @@ -0,0 +1,72 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +// PolicyRulesWithSubjectsApplyConfiguration represents an declarative configuration of the PolicyRulesWithSubjects type for use +// with apply. +type PolicyRulesWithSubjectsApplyConfiguration struct { + Subjects []SubjectApplyConfiguration `json:"subjects,omitempty"` + ResourceRules []ResourcePolicyRuleApplyConfiguration `json:"resourceRules,omitempty"` + NonResourceRules []NonResourcePolicyRuleApplyConfiguration `json:"nonResourceRules,omitempty"` +} + +// PolicyRulesWithSubjectsApplyConfiguration constructs an declarative configuration of the PolicyRulesWithSubjects type for use with +// apply. +func PolicyRulesWithSubjects() *PolicyRulesWithSubjectsApplyConfiguration { + return &PolicyRulesWithSubjectsApplyConfiguration{} +} + +// WithSubjects adds the given value to the Subjects field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Subjects field. +func (b *PolicyRulesWithSubjectsApplyConfiguration) WithSubjects(values ...*SubjectApplyConfiguration) *PolicyRulesWithSubjectsApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithSubjects") + } + b.Subjects = append(b.Subjects, *values[i]) + } + return b +} + +// WithResourceRules adds the given value to the ResourceRules field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the ResourceRules field. +func (b *PolicyRulesWithSubjectsApplyConfiguration) WithResourceRules(values ...*ResourcePolicyRuleApplyConfiguration) *PolicyRulesWithSubjectsApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithResourceRules") + } + b.ResourceRules = append(b.ResourceRules, *values[i]) + } + return b +} + +// WithNonResourceRules adds the given value to the NonResourceRules field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the NonResourceRules field. +func (b *PolicyRulesWithSubjectsApplyConfiguration) WithNonResourceRules(values ...*NonResourcePolicyRuleApplyConfiguration) *PolicyRulesWithSubjectsApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithNonResourceRules") + } + b.NonResourceRules = append(b.NonResourceRules, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/prioritylevelconfiguration.go b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/prioritylevelconfiguration.go new file mode 100644 index 000000000000..5f497ac786a2 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/prioritylevelconfiguration.go @@ -0,0 +1,263 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + flowcontrolv1alpha1 "k8s.io/api/flowcontrol/v1alpha1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// PriorityLevelConfigurationApplyConfiguration represents an declarative configuration of the PriorityLevelConfiguration type for use +// with apply. +type PriorityLevelConfigurationApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *PriorityLevelConfigurationSpecApplyConfiguration `json:"spec,omitempty"` + Status *PriorityLevelConfigurationStatusApplyConfiguration `json:"status,omitempty"` +} + +// PriorityLevelConfiguration constructs an declarative configuration of the PriorityLevelConfiguration type for use with +// apply. +func PriorityLevelConfiguration(name string) *PriorityLevelConfigurationApplyConfiguration { + b := &PriorityLevelConfigurationApplyConfiguration{} + b.WithName(name) + b.WithKind("PriorityLevelConfiguration") + b.WithAPIVersion("flowcontrol.apiserver.k8s.io/v1alpha1") + return b +} + +// ExtractPriorityLevelConfiguration extracts the applied configuration owned by fieldManager from +// priorityLevelConfiguration. If no managedFields are found in priorityLevelConfiguration for fieldManager, a +// PriorityLevelConfigurationApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// priorityLevelConfiguration must be a unmodified PriorityLevelConfiguration API object that was retrieved from the Kubernetes API. +// ExtractPriorityLevelConfiguration provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractPriorityLevelConfiguration(priorityLevelConfiguration *flowcontrolv1alpha1.PriorityLevelConfiguration, fieldManager string) (*PriorityLevelConfigurationApplyConfiguration, error) { + b := &PriorityLevelConfigurationApplyConfiguration{} + err := managedfields.ExtractInto(priorityLevelConfiguration, internal.Parser().Type("io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfiguration"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(priorityLevelConfiguration.Name) + + b.WithKind("PriorityLevelConfiguration") + b.WithAPIVersion("flowcontrol.apiserver.k8s.io/v1alpha1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *PriorityLevelConfigurationApplyConfiguration) WithKind(value string) *PriorityLevelConfigurationApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *PriorityLevelConfigurationApplyConfiguration) WithAPIVersion(value string) *PriorityLevelConfigurationApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *PriorityLevelConfigurationApplyConfiguration) WithName(value string) *PriorityLevelConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *PriorityLevelConfigurationApplyConfiguration) WithGenerateName(value string) *PriorityLevelConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *PriorityLevelConfigurationApplyConfiguration) WithNamespace(value string) *PriorityLevelConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *PriorityLevelConfigurationApplyConfiguration) WithSelfLink(value string) *PriorityLevelConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *PriorityLevelConfigurationApplyConfiguration) WithUID(value types.UID) *PriorityLevelConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *PriorityLevelConfigurationApplyConfiguration) WithResourceVersion(value string) *PriorityLevelConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *PriorityLevelConfigurationApplyConfiguration) WithGeneration(value int64) *PriorityLevelConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *PriorityLevelConfigurationApplyConfiguration) WithCreationTimestamp(value metav1.Time) *PriorityLevelConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *PriorityLevelConfigurationApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *PriorityLevelConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *PriorityLevelConfigurationApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *PriorityLevelConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *PriorityLevelConfigurationApplyConfiguration) WithLabels(entries map[string]string) *PriorityLevelConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *PriorityLevelConfigurationApplyConfiguration) WithAnnotations(entries map[string]string) *PriorityLevelConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *PriorityLevelConfigurationApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *PriorityLevelConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *PriorityLevelConfigurationApplyConfiguration) WithFinalizers(values ...string) *PriorityLevelConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *PriorityLevelConfigurationApplyConfiguration) WithClusterName(value string) *PriorityLevelConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *PriorityLevelConfigurationApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *PriorityLevelConfigurationApplyConfiguration) WithSpec(value *PriorityLevelConfigurationSpecApplyConfiguration) *PriorityLevelConfigurationApplyConfiguration { + b.Spec = value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *PriorityLevelConfigurationApplyConfiguration) WithStatus(value *PriorityLevelConfigurationStatusApplyConfiguration) *PriorityLevelConfigurationApplyConfiguration { + b.Status = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/prioritylevelconfigurationcondition.go b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/prioritylevelconfigurationcondition.go new file mode 100644 index 000000000000..bd91b80f21f2 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/prioritylevelconfigurationcondition.go @@ -0,0 +1,80 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + v1alpha1 "k8s.io/api/flowcontrol/v1alpha1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// PriorityLevelConfigurationConditionApplyConfiguration represents an declarative configuration of the PriorityLevelConfigurationCondition type for use +// with apply. +type PriorityLevelConfigurationConditionApplyConfiguration struct { + Type *v1alpha1.PriorityLevelConfigurationConditionType `json:"type,omitempty"` + Status *v1alpha1.ConditionStatus `json:"status,omitempty"` + LastTransitionTime *v1.Time `json:"lastTransitionTime,omitempty"` + Reason *string `json:"reason,omitempty"` + Message *string `json:"message,omitempty"` +} + +// PriorityLevelConfigurationConditionApplyConfiguration constructs an declarative configuration of the PriorityLevelConfigurationCondition type for use with +// apply. +func PriorityLevelConfigurationCondition() *PriorityLevelConfigurationConditionApplyConfiguration { + return &PriorityLevelConfigurationConditionApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *PriorityLevelConfigurationConditionApplyConfiguration) WithType(value v1alpha1.PriorityLevelConfigurationConditionType) *PriorityLevelConfigurationConditionApplyConfiguration { + b.Type = &value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *PriorityLevelConfigurationConditionApplyConfiguration) WithStatus(value v1alpha1.ConditionStatus) *PriorityLevelConfigurationConditionApplyConfiguration { + b.Status = &value + return b +} + +// WithLastTransitionTime sets the LastTransitionTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastTransitionTime field is set to the value of the last call. +func (b *PriorityLevelConfigurationConditionApplyConfiguration) WithLastTransitionTime(value v1.Time) *PriorityLevelConfigurationConditionApplyConfiguration { + b.LastTransitionTime = &value + return b +} + +// WithReason sets the Reason field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Reason field is set to the value of the last call. +func (b *PriorityLevelConfigurationConditionApplyConfiguration) WithReason(value string) *PriorityLevelConfigurationConditionApplyConfiguration { + b.Reason = &value + return b +} + +// WithMessage sets the Message field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Message field is set to the value of the last call. +func (b *PriorityLevelConfigurationConditionApplyConfiguration) WithMessage(value string) *PriorityLevelConfigurationConditionApplyConfiguration { + b.Message = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/prioritylevelconfigurationreference.go b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/prioritylevelconfigurationreference.go new file mode 100644 index 000000000000..b477c04df53a --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/prioritylevelconfigurationreference.go @@ -0,0 +1,39 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +// PriorityLevelConfigurationReferenceApplyConfiguration represents an declarative configuration of the PriorityLevelConfigurationReference type for use +// with apply. +type PriorityLevelConfigurationReferenceApplyConfiguration struct { + Name *string `json:"name,omitempty"` +} + +// PriorityLevelConfigurationReferenceApplyConfiguration constructs an declarative configuration of the PriorityLevelConfigurationReference type for use with +// apply. +func PriorityLevelConfigurationReference() *PriorityLevelConfigurationReferenceApplyConfiguration { + return &PriorityLevelConfigurationReferenceApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *PriorityLevelConfigurationReferenceApplyConfiguration) WithName(value string) *PriorityLevelConfigurationReferenceApplyConfiguration { + b.Name = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/prioritylevelconfigurationspec.go b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/prioritylevelconfigurationspec.go new file mode 100644 index 000000000000..3949dee46dc6 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/prioritylevelconfigurationspec.go @@ -0,0 +1,52 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + v1alpha1 "k8s.io/api/flowcontrol/v1alpha1" +) + +// PriorityLevelConfigurationSpecApplyConfiguration represents an declarative configuration of the PriorityLevelConfigurationSpec type for use +// with apply. +type PriorityLevelConfigurationSpecApplyConfiguration struct { + Type *v1alpha1.PriorityLevelEnablement `json:"type,omitempty"` + Limited *LimitedPriorityLevelConfigurationApplyConfiguration `json:"limited,omitempty"` +} + +// PriorityLevelConfigurationSpecApplyConfiguration constructs an declarative configuration of the PriorityLevelConfigurationSpec type for use with +// apply. +func PriorityLevelConfigurationSpec() *PriorityLevelConfigurationSpecApplyConfiguration { + return &PriorityLevelConfigurationSpecApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *PriorityLevelConfigurationSpecApplyConfiguration) WithType(value v1alpha1.PriorityLevelEnablement) *PriorityLevelConfigurationSpecApplyConfiguration { + b.Type = &value + return b +} + +// WithLimited sets the Limited field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Limited field is set to the value of the last call. +func (b *PriorityLevelConfigurationSpecApplyConfiguration) WithLimited(value *LimitedPriorityLevelConfigurationApplyConfiguration) *PriorityLevelConfigurationSpecApplyConfiguration { + b.Limited = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/prioritylevelconfigurationstatus.go b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/prioritylevelconfigurationstatus.go new file mode 100644 index 000000000000..eb3ef3d61d11 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/prioritylevelconfigurationstatus.go @@ -0,0 +1,44 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +// PriorityLevelConfigurationStatusApplyConfiguration represents an declarative configuration of the PriorityLevelConfigurationStatus type for use +// with apply. +type PriorityLevelConfigurationStatusApplyConfiguration struct { + Conditions []PriorityLevelConfigurationConditionApplyConfiguration `json:"conditions,omitempty"` +} + +// PriorityLevelConfigurationStatusApplyConfiguration constructs an declarative configuration of the PriorityLevelConfigurationStatus type for use with +// apply. +func PriorityLevelConfigurationStatus() *PriorityLevelConfigurationStatusApplyConfiguration { + return &PriorityLevelConfigurationStatusApplyConfiguration{} +} + +// WithConditions adds the given value to the Conditions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Conditions field. +func (b *PriorityLevelConfigurationStatusApplyConfiguration) WithConditions(values ...*PriorityLevelConfigurationConditionApplyConfiguration) *PriorityLevelConfigurationStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithConditions") + } + b.Conditions = append(b.Conditions, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/queuingconfiguration.go b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/queuingconfiguration.go new file mode 100644 index 000000000000..0fccc3f08be9 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/queuingconfiguration.go @@ -0,0 +1,57 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +// QueuingConfigurationApplyConfiguration represents an declarative configuration of the QueuingConfiguration type for use +// with apply. +type QueuingConfigurationApplyConfiguration struct { + Queues *int32 `json:"queues,omitempty"` + HandSize *int32 `json:"handSize,omitempty"` + QueueLengthLimit *int32 `json:"queueLengthLimit,omitempty"` +} + +// QueuingConfigurationApplyConfiguration constructs an declarative configuration of the QueuingConfiguration type for use with +// apply. +func QueuingConfiguration() *QueuingConfigurationApplyConfiguration { + return &QueuingConfigurationApplyConfiguration{} +} + +// WithQueues sets the Queues field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Queues field is set to the value of the last call. +func (b *QueuingConfigurationApplyConfiguration) WithQueues(value int32) *QueuingConfigurationApplyConfiguration { + b.Queues = &value + return b +} + +// WithHandSize sets the HandSize field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the HandSize field is set to the value of the last call. +func (b *QueuingConfigurationApplyConfiguration) WithHandSize(value int32) *QueuingConfigurationApplyConfiguration { + b.HandSize = &value + return b +} + +// WithQueueLengthLimit sets the QueueLengthLimit field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the QueueLengthLimit field is set to the value of the last call. +func (b *QueuingConfigurationApplyConfiguration) WithQueueLengthLimit(value int32) *QueuingConfigurationApplyConfiguration { + b.QueueLengthLimit = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/resourcepolicyrule.go b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/resourcepolicyrule.go new file mode 100644 index 000000000000..d2c6f4eed6d4 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/resourcepolicyrule.go @@ -0,0 +1,83 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +// ResourcePolicyRuleApplyConfiguration represents an declarative configuration of the ResourcePolicyRule type for use +// with apply. +type ResourcePolicyRuleApplyConfiguration struct { + Verbs []string `json:"verbs,omitempty"` + APIGroups []string `json:"apiGroups,omitempty"` + Resources []string `json:"resources,omitempty"` + ClusterScope *bool `json:"clusterScope,omitempty"` + Namespaces []string `json:"namespaces,omitempty"` +} + +// ResourcePolicyRuleApplyConfiguration constructs an declarative configuration of the ResourcePolicyRule type for use with +// apply. +func ResourcePolicyRule() *ResourcePolicyRuleApplyConfiguration { + return &ResourcePolicyRuleApplyConfiguration{} +} + +// WithVerbs adds the given value to the Verbs field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Verbs field. +func (b *ResourcePolicyRuleApplyConfiguration) WithVerbs(values ...string) *ResourcePolicyRuleApplyConfiguration { + for i := range values { + b.Verbs = append(b.Verbs, values[i]) + } + return b +} + +// WithAPIGroups adds the given value to the APIGroups field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the APIGroups field. +func (b *ResourcePolicyRuleApplyConfiguration) WithAPIGroups(values ...string) *ResourcePolicyRuleApplyConfiguration { + for i := range values { + b.APIGroups = append(b.APIGroups, values[i]) + } + return b +} + +// WithResources adds the given value to the Resources field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Resources field. +func (b *ResourcePolicyRuleApplyConfiguration) WithResources(values ...string) *ResourcePolicyRuleApplyConfiguration { + for i := range values { + b.Resources = append(b.Resources, values[i]) + } + return b +} + +// WithClusterScope sets the ClusterScope field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterScope field is set to the value of the last call. +func (b *ResourcePolicyRuleApplyConfiguration) WithClusterScope(value bool) *ResourcePolicyRuleApplyConfiguration { + b.ClusterScope = &value + return b +} + +// WithNamespaces adds the given value to the Namespaces field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Namespaces field. +func (b *ResourcePolicyRuleApplyConfiguration) WithNamespaces(values ...string) *ResourcePolicyRuleApplyConfiguration { + for i := range values { + b.Namespaces = append(b.Namespaces, values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/serviceaccountsubject.go b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/serviceaccountsubject.go new file mode 100644 index 000000000000..270b5225e144 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/serviceaccountsubject.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +// ServiceAccountSubjectApplyConfiguration represents an declarative configuration of the ServiceAccountSubject type for use +// with apply. +type ServiceAccountSubjectApplyConfiguration struct { + Namespace *string `json:"namespace,omitempty"` + Name *string `json:"name,omitempty"` +} + +// ServiceAccountSubjectApplyConfiguration constructs an declarative configuration of the ServiceAccountSubject type for use with +// apply. +func ServiceAccountSubject() *ServiceAccountSubjectApplyConfiguration { + return &ServiceAccountSubjectApplyConfiguration{} +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *ServiceAccountSubjectApplyConfiguration) WithNamespace(value string) *ServiceAccountSubjectApplyConfiguration { + b.Namespace = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ServiceAccountSubjectApplyConfiguration) WithName(value string) *ServiceAccountSubjectApplyConfiguration { + b.Name = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/subject.go b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/subject.go new file mode 100644 index 000000000000..83c09d644b2c --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/subject.go @@ -0,0 +1,70 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + v1alpha1 "k8s.io/api/flowcontrol/v1alpha1" +) + +// SubjectApplyConfiguration represents an declarative configuration of the Subject type for use +// with apply. +type SubjectApplyConfiguration struct { + Kind *v1alpha1.SubjectKind `json:"kind,omitempty"` + User *UserSubjectApplyConfiguration `json:"user,omitempty"` + Group *GroupSubjectApplyConfiguration `json:"group,omitempty"` + ServiceAccount *ServiceAccountSubjectApplyConfiguration `json:"serviceAccount,omitempty"` +} + +// SubjectApplyConfiguration constructs an declarative configuration of the Subject type for use with +// apply. +func Subject() *SubjectApplyConfiguration { + return &SubjectApplyConfiguration{} +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *SubjectApplyConfiguration) WithKind(value v1alpha1.SubjectKind) *SubjectApplyConfiguration { + b.Kind = &value + return b +} + +// WithUser sets the User field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the User field is set to the value of the last call. +func (b *SubjectApplyConfiguration) WithUser(value *UserSubjectApplyConfiguration) *SubjectApplyConfiguration { + b.User = value + return b +} + +// WithGroup sets the Group field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Group field is set to the value of the last call. +func (b *SubjectApplyConfiguration) WithGroup(value *GroupSubjectApplyConfiguration) *SubjectApplyConfiguration { + b.Group = value + return b +} + +// WithServiceAccount sets the ServiceAccount field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ServiceAccount field is set to the value of the last call. +func (b *SubjectApplyConfiguration) WithServiceAccount(value *ServiceAccountSubjectApplyConfiguration) *SubjectApplyConfiguration { + b.ServiceAccount = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/usersubject.go b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/usersubject.go new file mode 100644 index 000000000000..a762c249e099 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1/usersubject.go @@ -0,0 +1,39 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +// UserSubjectApplyConfiguration represents an declarative configuration of the UserSubject type for use +// with apply. +type UserSubjectApplyConfiguration struct { + Name *string `json:"name,omitempty"` +} + +// UserSubjectApplyConfiguration constructs an declarative configuration of the UserSubject type for use with +// apply. +func UserSubject() *UserSubjectApplyConfiguration { + return &UserSubjectApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *UserSubjectApplyConfiguration) WithName(value string) *UserSubjectApplyConfiguration { + b.Name = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/flowdistinguishermethod.go b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/flowdistinguishermethod.go new file mode 100644 index 000000000000..6dc1bb4d683f --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/flowdistinguishermethod.go @@ -0,0 +1,43 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1beta1 "k8s.io/api/flowcontrol/v1beta1" +) + +// FlowDistinguisherMethodApplyConfiguration represents an declarative configuration of the FlowDistinguisherMethod type for use +// with apply. +type FlowDistinguisherMethodApplyConfiguration struct { + Type *v1beta1.FlowDistinguisherMethodType `json:"type,omitempty"` +} + +// FlowDistinguisherMethodApplyConfiguration constructs an declarative configuration of the FlowDistinguisherMethod type for use with +// apply. +func FlowDistinguisherMethod() *FlowDistinguisherMethodApplyConfiguration { + return &FlowDistinguisherMethodApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *FlowDistinguisherMethodApplyConfiguration) WithType(value v1beta1.FlowDistinguisherMethodType) *FlowDistinguisherMethodApplyConfiguration { + b.Type = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/flowschema.go b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/flowschema.go new file mode 100644 index 000000000000..2c23ff949c7b --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/flowschema.go @@ -0,0 +1,263 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + flowcontrolv1beta1 "k8s.io/api/flowcontrol/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// FlowSchemaApplyConfiguration represents an declarative configuration of the FlowSchema type for use +// with apply. +type FlowSchemaApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *FlowSchemaSpecApplyConfiguration `json:"spec,omitempty"` + Status *FlowSchemaStatusApplyConfiguration `json:"status,omitempty"` +} + +// FlowSchema constructs an declarative configuration of the FlowSchema type for use with +// apply. +func FlowSchema(name string) *FlowSchemaApplyConfiguration { + b := &FlowSchemaApplyConfiguration{} + b.WithName(name) + b.WithKind("FlowSchema") + b.WithAPIVersion("flowcontrol.apiserver.k8s.io/v1beta1") + return b +} + +// ExtractFlowSchema extracts the applied configuration owned by fieldManager from +// flowSchema. If no managedFields are found in flowSchema for fieldManager, a +// FlowSchemaApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// flowSchema must be a unmodified FlowSchema API object that was retrieved from the Kubernetes API. +// ExtractFlowSchema provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractFlowSchema(flowSchema *flowcontrolv1beta1.FlowSchema, fieldManager string) (*FlowSchemaApplyConfiguration, error) { + b := &FlowSchemaApplyConfiguration{} + err := managedfields.ExtractInto(flowSchema, internal.Parser().Type("io.k8s.api.flowcontrol.v1beta1.FlowSchema"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(flowSchema.Name) + + b.WithKind("FlowSchema") + b.WithAPIVersion("flowcontrol.apiserver.k8s.io/v1beta1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *FlowSchemaApplyConfiguration) WithKind(value string) *FlowSchemaApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *FlowSchemaApplyConfiguration) WithAPIVersion(value string) *FlowSchemaApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *FlowSchemaApplyConfiguration) WithName(value string) *FlowSchemaApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *FlowSchemaApplyConfiguration) WithGenerateName(value string) *FlowSchemaApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *FlowSchemaApplyConfiguration) WithNamespace(value string) *FlowSchemaApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *FlowSchemaApplyConfiguration) WithSelfLink(value string) *FlowSchemaApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *FlowSchemaApplyConfiguration) WithUID(value types.UID) *FlowSchemaApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *FlowSchemaApplyConfiguration) WithResourceVersion(value string) *FlowSchemaApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *FlowSchemaApplyConfiguration) WithGeneration(value int64) *FlowSchemaApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *FlowSchemaApplyConfiguration) WithCreationTimestamp(value metav1.Time) *FlowSchemaApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *FlowSchemaApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *FlowSchemaApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *FlowSchemaApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *FlowSchemaApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *FlowSchemaApplyConfiguration) WithLabels(entries map[string]string) *FlowSchemaApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *FlowSchemaApplyConfiguration) WithAnnotations(entries map[string]string) *FlowSchemaApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *FlowSchemaApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *FlowSchemaApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *FlowSchemaApplyConfiguration) WithFinalizers(values ...string) *FlowSchemaApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *FlowSchemaApplyConfiguration) WithClusterName(value string) *FlowSchemaApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *FlowSchemaApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *FlowSchemaApplyConfiguration) WithSpec(value *FlowSchemaSpecApplyConfiguration) *FlowSchemaApplyConfiguration { + b.Spec = value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *FlowSchemaApplyConfiguration) WithStatus(value *FlowSchemaStatusApplyConfiguration) *FlowSchemaApplyConfiguration { + b.Status = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/flowschemacondition.go b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/flowschemacondition.go new file mode 100644 index 000000000000..b62e9a22ff30 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/flowschemacondition.go @@ -0,0 +1,80 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1beta1 "k8s.io/api/flowcontrol/v1beta1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// FlowSchemaConditionApplyConfiguration represents an declarative configuration of the FlowSchemaCondition type for use +// with apply. +type FlowSchemaConditionApplyConfiguration struct { + Type *v1beta1.FlowSchemaConditionType `json:"type,omitempty"` + Status *v1beta1.ConditionStatus `json:"status,omitempty"` + LastTransitionTime *v1.Time `json:"lastTransitionTime,omitempty"` + Reason *string `json:"reason,omitempty"` + Message *string `json:"message,omitempty"` +} + +// FlowSchemaConditionApplyConfiguration constructs an declarative configuration of the FlowSchemaCondition type for use with +// apply. +func FlowSchemaCondition() *FlowSchemaConditionApplyConfiguration { + return &FlowSchemaConditionApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *FlowSchemaConditionApplyConfiguration) WithType(value v1beta1.FlowSchemaConditionType) *FlowSchemaConditionApplyConfiguration { + b.Type = &value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *FlowSchemaConditionApplyConfiguration) WithStatus(value v1beta1.ConditionStatus) *FlowSchemaConditionApplyConfiguration { + b.Status = &value + return b +} + +// WithLastTransitionTime sets the LastTransitionTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastTransitionTime field is set to the value of the last call. +func (b *FlowSchemaConditionApplyConfiguration) WithLastTransitionTime(value v1.Time) *FlowSchemaConditionApplyConfiguration { + b.LastTransitionTime = &value + return b +} + +// WithReason sets the Reason field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Reason field is set to the value of the last call. +func (b *FlowSchemaConditionApplyConfiguration) WithReason(value string) *FlowSchemaConditionApplyConfiguration { + b.Reason = &value + return b +} + +// WithMessage sets the Message field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Message field is set to the value of the last call. +func (b *FlowSchemaConditionApplyConfiguration) WithMessage(value string) *FlowSchemaConditionApplyConfiguration { + b.Message = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/flowschemaspec.go b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/flowschemaspec.go new file mode 100644 index 000000000000..8d72c2d0d725 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/flowschemaspec.go @@ -0,0 +1,71 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// FlowSchemaSpecApplyConfiguration represents an declarative configuration of the FlowSchemaSpec type for use +// with apply. +type FlowSchemaSpecApplyConfiguration struct { + PriorityLevelConfiguration *PriorityLevelConfigurationReferenceApplyConfiguration `json:"priorityLevelConfiguration,omitempty"` + MatchingPrecedence *int32 `json:"matchingPrecedence,omitempty"` + DistinguisherMethod *FlowDistinguisherMethodApplyConfiguration `json:"distinguisherMethod,omitempty"` + Rules []PolicyRulesWithSubjectsApplyConfiguration `json:"rules,omitempty"` +} + +// FlowSchemaSpecApplyConfiguration constructs an declarative configuration of the FlowSchemaSpec type for use with +// apply. +func FlowSchemaSpec() *FlowSchemaSpecApplyConfiguration { + return &FlowSchemaSpecApplyConfiguration{} +} + +// WithPriorityLevelConfiguration sets the PriorityLevelConfiguration field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PriorityLevelConfiguration field is set to the value of the last call. +func (b *FlowSchemaSpecApplyConfiguration) WithPriorityLevelConfiguration(value *PriorityLevelConfigurationReferenceApplyConfiguration) *FlowSchemaSpecApplyConfiguration { + b.PriorityLevelConfiguration = value + return b +} + +// WithMatchingPrecedence sets the MatchingPrecedence field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MatchingPrecedence field is set to the value of the last call. +func (b *FlowSchemaSpecApplyConfiguration) WithMatchingPrecedence(value int32) *FlowSchemaSpecApplyConfiguration { + b.MatchingPrecedence = &value + return b +} + +// WithDistinguisherMethod sets the DistinguisherMethod field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DistinguisherMethod field is set to the value of the last call. +func (b *FlowSchemaSpecApplyConfiguration) WithDistinguisherMethod(value *FlowDistinguisherMethodApplyConfiguration) *FlowSchemaSpecApplyConfiguration { + b.DistinguisherMethod = value + return b +} + +// WithRules adds the given value to the Rules field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Rules field. +func (b *FlowSchemaSpecApplyConfiguration) WithRules(values ...*PolicyRulesWithSubjectsApplyConfiguration) *FlowSchemaSpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithRules") + } + b.Rules = append(b.Rules, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/flowschemastatus.go b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/flowschemastatus.go new file mode 100644 index 000000000000..6bc6d0543a04 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/flowschemastatus.go @@ -0,0 +1,44 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// FlowSchemaStatusApplyConfiguration represents an declarative configuration of the FlowSchemaStatus type for use +// with apply. +type FlowSchemaStatusApplyConfiguration struct { + Conditions []FlowSchemaConditionApplyConfiguration `json:"conditions,omitempty"` +} + +// FlowSchemaStatusApplyConfiguration constructs an declarative configuration of the FlowSchemaStatus type for use with +// apply. +func FlowSchemaStatus() *FlowSchemaStatusApplyConfiguration { + return &FlowSchemaStatusApplyConfiguration{} +} + +// WithConditions adds the given value to the Conditions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Conditions field. +func (b *FlowSchemaStatusApplyConfiguration) WithConditions(values ...*FlowSchemaConditionApplyConfiguration) *FlowSchemaStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithConditions") + } + b.Conditions = append(b.Conditions, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/groupsubject.go b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/groupsubject.go new file mode 100644 index 000000000000..95b416e426c7 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/groupsubject.go @@ -0,0 +1,39 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// GroupSubjectApplyConfiguration represents an declarative configuration of the GroupSubject type for use +// with apply. +type GroupSubjectApplyConfiguration struct { + Name *string `json:"name,omitempty"` +} + +// GroupSubjectApplyConfiguration constructs an declarative configuration of the GroupSubject type for use with +// apply. +func GroupSubject() *GroupSubjectApplyConfiguration { + return &GroupSubjectApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *GroupSubjectApplyConfiguration) WithName(value string) *GroupSubjectApplyConfiguration { + b.Name = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/limitedprioritylevelconfiguration.go b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/limitedprioritylevelconfiguration.go new file mode 100644 index 000000000000..f7f77f9b2941 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/limitedprioritylevelconfiguration.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// LimitedPriorityLevelConfigurationApplyConfiguration represents an declarative configuration of the LimitedPriorityLevelConfiguration type for use +// with apply. +type LimitedPriorityLevelConfigurationApplyConfiguration struct { + AssuredConcurrencyShares *int32 `json:"assuredConcurrencyShares,omitempty"` + LimitResponse *LimitResponseApplyConfiguration `json:"limitResponse,omitempty"` +} + +// LimitedPriorityLevelConfigurationApplyConfiguration constructs an declarative configuration of the LimitedPriorityLevelConfiguration type for use with +// apply. +func LimitedPriorityLevelConfiguration() *LimitedPriorityLevelConfigurationApplyConfiguration { + return &LimitedPriorityLevelConfigurationApplyConfiguration{} +} + +// WithAssuredConcurrencyShares sets the AssuredConcurrencyShares field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AssuredConcurrencyShares field is set to the value of the last call. +func (b *LimitedPriorityLevelConfigurationApplyConfiguration) WithAssuredConcurrencyShares(value int32) *LimitedPriorityLevelConfigurationApplyConfiguration { + b.AssuredConcurrencyShares = &value + return b +} + +// WithLimitResponse sets the LimitResponse field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LimitResponse field is set to the value of the last call. +func (b *LimitedPriorityLevelConfigurationApplyConfiguration) WithLimitResponse(value *LimitResponseApplyConfiguration) *LimitedPriorityLevelConfigurationApplyConfiguration { + b.LimitResponse = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/limitresponse.go b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/limitresponse.go new file mode 100644 index 000000000000..86e1bef6b917 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/limitresponse.go @@ -0,0 +1,52 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1beta1 "k8s.io/api/flowcontrol/v1beta1" +) + +// LimitResponseApplyConfiguration represents an declarative configuration of the LimitResponse type for use +// with apply. +type LimitResponseApplyConfiguration struct { + Type *v1beta1.LimitResponseType `json:"type,omitempty"` + Queuing *QueuingConfigurationApplyConfiguration `json:"queuing,omitempty"` +} + +// LimitResponseApplyConfiguration constructs an declarative configuration of the LimitResponse type for use with +// apply. +func LimitResponse() *LimitResponseApplyConfiguration { + return &LimitResponseApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *LimitResponseApplyConfiguration) WithType(value v1beta1.LimitResponseType) *LimitResponseApplyConfiguration { + b.Type = &value + return b +} + +// WithQueuing sets the Queuing field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Queuing field is set to the value of the last call. +func (b *LimitResponseApplyConfiguration) WithQueuing(value *QueuingConfigurationApplyConfiguration) *LimitResponseApplyConfiguration { + b.Queuing = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/nonresourcepolicyrule.go b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/nonresourcepolicyrule.go new file mode 100644 index 000000000000..594ebc9912ea --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/nonresourcepolicyrule.go @@ -0,0 +1,52 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// NonResourcePolicyRuleApplyConfiguration represents an declarative configuration of the NonResourcePolicyRule type for use +// with apply. +type NonResourcePolicyRuleApplyConfiguration struct { + Verbs []string `json:"verbs,omitempty"` + NonResourceURLs []string `json:"nonResourceURLs,omitempty"` +} + +// NonResourcePolicyRuleApplyConfiguration constructs an declarative configuration of the NonResourcePolicyRule type for use with +// apply. +func NonResourcePolicyRule() *NonResourcePolicyRuleApplyConfiguration { + return &NonResourcePolicyRuleApplyConfiguration{} +} + +// WithVerbs adds the given value to the Verbs field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Verbs field. +func (b *NonResourcePolicyRuleApplyConfiguration) WithVerbs(values ...string) *NonResourcePolicyRuleApplyConfiguration { + for i := range values { + b.Verbs = append(b.Verbs, values[i]) + } + return b +} + +// WithNonResourceURLs adds the given value to the NonResourceURLs field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the NonResourceURLs field. +func (b *NonResourcePolicyRuleApplyConfiguration) WithNonResourceURLs(values ...string) *NonResourcePolicyRuleApplyConfiguration { + for i := range values { + b.NonResourceURLs = append(b.NonResourceURLs, values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/policyruleswithsubjects.go b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/policyruleswithsubjects.go new file mode 100644 index 000000000000..ea5b266b4c30 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/policyruleswithsubjects.go @@ -0,0 +1,72 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// PolicyRulesWithSubjectsApplyConfiguration represents an declarative configuration of the PolicyRulesWithSubjects type for use +// with apply. +type PolicyRulesWithSubjectsApplyConfiguration struct { + Subjects []SubjectApplyConfiguration `json:"subjects,omitempty"` + ResourceRules []ResourcePolicyRuleApplyConfiguration `json:"resourceRules,omitempty"` + NonResourceRules []NonResourcePolicyRuleApplyConfiguration `json:"nonResourceRules,omitempty"` +} + +// PolicyRulesWithSubjectsApplyConfiguration constructs an declarative configuration of the PolicyRulesWithSubjects type for use with +// apply. +func PolicyRulesWithSubjects() *PolicyRulesWithSubjectsApplyConfiguration { + return &PolicyRulesWithSubjectsApplyConfiguration{} +} + +// WithSubjects adds the given value to the Subjects field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Subjects field. +func (b *PolicyRulesWithSubjectsApplyConfiguration) WithSubjects(values ...*SubjectApplyConfiguration) *PolicyRulesWithSubjectsApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithSubjects") + } + b.Subjects = append(b.Subjects, *values[i]) + } + return b +} + +// WithResourceRules adds the given value to the ResourceRules field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the ResourceRules field. +func (b *PolicyRulesWithSubjectsApplyConfiguration) WithResourceRules(values ...*ResourcePolicyRuleApplyConfiguration) *PolicyRulesWithSubjectsApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithResourceRules") + } + b.ResourceRules = append(b.ResourceRules, *values[i]) + } + return b +} + +// WithNonResourceRules adds the given value to the NonResourceRules field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the NonResourceRules field. +func (b *PolicyRulesWithSubjectsApplyConfiguration) WithNonResourceRules(values ...*NonResourcePolicyRuleApplyConfiguration) *PolicyRulesWithSubjectsApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithNonResourceRules") + } + b.NonResourceRules = append(b.NonResourceRules, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/prioritylevelconfiguration.go b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/prioritylevelconfiguration.go new file mode 100644 index 000000000000..57f118ad82d9 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/prioritylevelconfiguration.go @@ -0,0 +1,263 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + flowcontrolv1beta1 "k8s.io/api/flowcontrol/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// PriorityLevelConfigurationApplyConfiguration represents an declarative configuration of the PriorityLevelConfiguration type for use +// with apply. +type PriorityLevelConfigurationApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *PriorityLevelConfigurationSpecApplyConfiguration `json:"spec,omitempty"` + Status *PriorityLevelConfigurationStatusApplyConfiguration `json:"status,omitempty"` +} + +// PriorityLevelConfiguration constructs an declarative configuration of the PriorityLevelConfiguration type for use with +// apply. +func PriorityLevelConfiguration(name string) *PriorityLevelConfigurationApplyConfiguration { + b := &PriorityLevelConfigurationApplyConfiguration{} + b.WithName(name) + b.WithKind("PriorityLevelConfiguration") + b.WithAPIVersion("flowcontrol.apiserver.k8s.io/v1beta1") + return b +} + +// ExtractPriorityLevelConfiguration extracts the applied configuration owned by fieldManager from +// priorityLevelConfiguration. If no managedFields are found in priorityLevelConfiguration for fieldManager, a +// PriorityLevelConfigurationApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// priorityLevelConfiguration must be a unmodified PriorityLevelConfiguration API object that was retrieved from the Kubernetes API. +// ExtractPriorityLevelConfiguration provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractPriorityLevelConfiguration(priorityLevelConfiguration *flowcontrolv1beta1.PriorityLevelConfiguration, fieldManager string) (*PriorityLevelConfigurationApplyConfiguration, error) { + b := &PriorityLevelConfigurationApplyConfiguration{} + err := managedfields.ExtractInto(priorityLevelConfiguration, internal.Parser().Type("io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfiguration"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(priorityLevelConfiguration.Name) + + b.WithKind("PriorityLevelConfiguration") + b.WithAPIVersion("flowcontrol.apiserver.k8s.io/v1beta1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *PriorityLevelConfigurationApplyConfiguration) WithKind(value string) *PriorityLevelConfigurationApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *PriorityLevelConfigurationApplyConfiguration) WithAPIVersion(value string) *PriorityLevelConfigurationApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *PriorityLevelConfigurationApplyConfiguration) WithName(value string) *PriorityLevelConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *PriorityLevelConfigurationApplyConfiguration) WithGenerateName(value string) *PriorityLevelConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *PriorityLevelConfigurationApplyConfiguration) WithNamespace(value string) *PriorityLevelConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *PriorityLevelConfigurationApplyConfiguration) WithSelfLink(value string) *PriorityLevelConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *PriorityLevelConfigurationApplyConfiguration) WithUID(value types.UID) *PriorityLevelConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *PriorityLevelConfigurationApplyConfiguration) WithResourceVersion(value string) *PriorityLevelConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *PriorityLevelConfigurationApplyConfiguration) WithGeneration(value int64) *PriorityLevelConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *PriorityLevelConfigurationApplyConfiguration) WithCreationTimestamp(value metav1.Time) *PriorityLevelConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *PriorityLevelConfigurationApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *PriorityLevelConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *PriorityLevelConfigurationApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *PriorityLevelConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *PriorityLevelConfigurationApplyConfiguration) WithLabels(entries map[string]string) *PriorityLevelConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *PriorityLevelConfigurationApplyConfiguration) WithAnnotations(entries map[string]string) *PriorityLevelConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *PriorityLevelConfigurationApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *PriorityLevelConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *PriorityLevelConfigurationApplyConfiguration) WithFinalizers(values ...string) *PriorityLevelConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *PriorityLevelConfigurationApplyConfiguration) WithClusterName(value string) *PriorityLevelConfigurationApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *PriorityLevelConfigurationApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *PriorityLevelConfigurationApplyConfiguration) WithSpec(value *PriorityLevelConfigurationSpecApplyConfiguration) *PriorityLevelConfigurationApplyConfiguration { + b.Spec = value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *PriorityLevelConfigurationApplyConfiguration) WithStatus(value *PriorityLevelConfigurationStatusApplyConfiguration) *PriorityLevelConfigurationApplyConfiguration { + b.Status = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/prioritylevelconfigurationcondition.go b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/prioritylevelconfigurationcondition.go new file mode 100644 index 000000000000..59bc61051072 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/prioritylevelconfigurationcondition.go @@ -0,0 +1,80 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1beta1 "k8s.io/api/flowcontrol/v1beta1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// PriorityLevelConfigurationConditionApplyConfiguration represents an declarative configuration of the PriorityLevelConfigurationCondition type for use +// with apply. +type PriorityLevelConfigurationConditionApplyConfiguration struct { + Type *v1beta1.PriorityLevelConfigurationConditionType `json:"type,omitempty"` + Status *v1beta1.ConditionStatus `json:"status,omitempty"` + LastTransitionTime *v1.Time `json:"lastTransitionTime,omitempty"` + Reason *string `json:"reason,omitempty"` + Message *string `json:"message,omitempty"` +} + +// PriorityLevelConfigurationConditionApplyConfiguration constructs an declarative configuration of the PriorityLevelConfigurationCondition type for use with +// apply. +func PriorityLevelConfigurationCondition() *PriorityLevelConfigurationConditionApplyConfiguration { + return &PriorityLevelConfigurationConditionApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *PriorityLevelConfigurationConditionApplyConfiguration) WithType(value v1beta1.PriorityLevelConfigurationConditionType) *PriorityLevelConfigurationConditionApplyConfiguration { + b.Type = &value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *PriorityLevelConfigurationConditionApplyConfiguration) WithStatus(value v1beta1.ConditionStatus) *PriorityLevelConfigurationConditionApplyConfiguration { + b.Status = &value + return b +} + +// WithLastTransitionTime sets the LastTransitionTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastTransitionTime field is set to the value of the last call. +func (b *PriorityLevelConfigurationConditionApplyConfiguration) WithLastTransitionTime(value v1.Time) *PriorityLevelConfigurationConditionApplyConfiguration { + b.LastTransitionTime = &value + return b +} + +// WithReason sets the Reason field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Reason field is set to the value of the last call. +func (b *PriorityLevelConfigurationConditionApplyConfiguration) WithReason(value string) *PriorityLevelConfigurationConditionApplyConfiguration { + b.Reason = &value + return b +} + +// WithMessage sets the Message field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Message field is set to the value of the last call. +func (b *PriorityLevelConfigurationConditionApplyConfiguration) WithMessage(value string) *PriorityLevelConfigurationConditionApplyConfiguration { + b.Message = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/prioritylevelconfigurationreference.go b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/prioritylevelconfigurationreference.go new file mode 100644 index 000000000000..c44bcc08b4ce --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/prioritylevelconfigurationreference.go @@ -0,0 +1,39 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// PriorityLevelConfigurationReferenceApplyConfiguration represents an declarative configuration of the PriorityLevelConfigurationReference type for use +// with apply. +type PriorityLevelConfigurationReferenceApplyConfiguration struct { + Name *string `json:"name,omitempty"` +} + +// PriorityLevelConfigurationReferenceApplyConfiguration constructs an declarative configuration of the PriorityLevelConfigurationReference type for use with +// apply. +func PriorityLevelConfigurationReference() *PriorityLevelConfigurationReferenceApplyConfiguration { + return &PriorityLevelConfigurationReferenceApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *PriorityLevelConfigurationReferenceApplyConfiguration) WithName(value string) *PriorityLevelConfigurationReferenceApplyConfiguration { + b.Name = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/prioritylevelconfigurationspec.go b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/prioritylevelconfigurationspec.go new file mode 100644 index 000000000000..8ed4e399f88b --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/prioritylevelconfigurationspec.go @@ -0,0 +1,52 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1beta1 "k8s.io/api/flowcontrol/v1beta1" +) + +// PriorityLevelConfigurationSpecApplyConfiguration represents an declarative configuration of the PriorityLevelConfigurationSpec type for use +// with apply. +type PriorityLevelConfigurationSpecApplyConfiguration struct { + Type *v1beta1.PriorityLevelEnablement `json:"type,omitempty"` + Limited *LimitedPriorityLevelConfigurationApplyConfiguration `json:"limited,omitempty"` +} + +// PriorityLevelConfigurationSpecApplyConfiguration constructs an declarative configuration of the PriorityLevelConfigurationSpec type for use with +// apply. +func PriorityLevelConfigurationSpec() *PriorityLevelConfigurationSpecApplyConfiguration { + return &PriorityLevelConfigurationSpecApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *PriorityLevelConfigurationSpecApplyConfiguration) WithType(value v1beta1.PriorityLevelEnablement) *PriorityLevelConfigurationSpecApplyConfiguration { + b.Type = &value + return b +} + +// WithLimited sets the Limited field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Limited field is set to the value of the last call. +func (b *PriorityLevelConfigurationSpecApplyConfiguration) WithLimited(value *LimitedPriorityLevelConfigurationApplyConfiguration) *PriorityLevelConfigurationSpecApplyConfiguration { + b.Limited = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/prioritylevelconfigurationstatus.go b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/prioritylevelconfigurationstatus.go new file mode 100644 index 000000000000..3c27e6aa62ca --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/prioritylevelconfigurationstatus.go @@ -0,0 +1,44 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// PriorityLevelConfigurationStatusApplyConfiguration represents an declarative configuration of the PriorityLevelConfigurationStatus type for use +// with apply. +type PriorityLevelConfigurationStatusApplyConfiguration struct { + Conditions []PriorityLevelConfigurationConditionApplyConfiguration `json:"conditions,omitempty"` +} + +// PriorityLevelConfigurationStatusApplyConfiguration constructs an declarative configuration of the PriorityLevelConfigurationStatus type for use with +// apply. +func PriorityLevelConfigurationStatus() *PriorityLevelConfigurationStatusApplyConfiguration { + return &PriorityLevelConfigurationStatusApplyConfiguration{} +} + +// WithConditions adds the given value to the Conditions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Conditions field. +func (b *PriorityLevelConfigurationStatusApplyConfiguration) WithConditions(values ...*PriorityLevelConfigurationConditionApplyConfiguration) *PriorityLevelConfigurationStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithConditions") + } + b.Conditions = append(b.Conditions, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/queuingconfiguration.go b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/queuingconfiguration.go new file mode 100644 index 000000000000..5e6e6e7b018a --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/queuingconfiguration.go @@ -0,0 +1,57 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// QueuingConfigurationApplyConfiguration represents an declarative configuration of the QueuingConfiguration type for use +// with apply. +type QueuingConfigurationApplyConfiguration struct { + Queues *int32 `json:"queues,omitempty"` + HandSize *int32 `json:"handSize,omitempty"` + QueueLengthLimit *int32 `json:"queueLengthLimit,omitempty"` +} + +// QueuingConfigurationApplyConfiguration constructs an declarative configuration of the QueuingConfiguration type for use with +// apply. +func QueuingConfiguration() *QueuingConfigurationApplyConfiguration { + return &QueuingConfigurationApplyConfiguration{} +} + +// WithQueues sets the Queues field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Queues field is set to the value of the last call. +func (b *QueuingConfigurationApplyConfiguration) WithQueues(value int32) *QueuingConfigurationApplyConfiguration { + b.Queues = &value + return b +} + +// WithHandSize sets the HandSize field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the HandSize field is set to the value of the last call. +func (b *QueuingConfigurationApplyConfiguration) WithHandSize(value int32) *QueuingConfigurationApplyConfiguration { + b.HandSize = &value + return b +} + +// WithQueueLengthLimit sets the QueueLengthLimit field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the QueueLengthLimit field is set to the value of the last call. +func (b *QueuingConfigurationApplyConfiguration) WithQueueLengthLimit(value int32) *QueuingConfigurationApplyConfiguration { + b.QueueLengthLimit = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/resourcepolicyrule.go b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/resourcepolicyrule.go new file mode 100644 index 000000000000..2e12ee1cc000 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/resourcepolicyrule.go @@ -0,0 +1,83 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// ResourcePolicyRuleApplyConfiguration represents an declarative configuration of the ResourcePolicyRule type for use +// with apply. +type ResourcePolicyRuleApplyConfiguration struct { + Verbs []string `json:"verbs,omitempty"` + APIGroups []string `json:"apiGroups,omitempty"` + Resources []string `json:"resources,omitempty"` + ClusterScope *bool `json:"clusterScope,omitempty"` + Namespaces []string `json:"namespaces,omitempty"` +} + +// ResourcePolicyRuleApplyConfiguration constructs an declarative configuration of the ResourcePolicyRule type for use with +// apply. +func ResourcePolicyRule() *ResourcePolicyRuleApplyConfiguration { + return &ResourcePolicyRuleApplyConfiguration{} +} + +// WithVerbs adds the given value to the Verbs field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Verbs field. +func (b *ResourcePolicyRuleApplyConfiguration) WithVerbs(values ...string) *ResourcePolicyRuleApplyConfiguration { + for i := range values { + b.Verbs = append(b.Verbs, values[i]) + } + return b +} + +// WithAPIGroups adds the given value to the APIGroups field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the APIGroups field. +func (b *ResourcePolicyRuleApplyConfiguration) WithAPIGroups(values ...string) *ResourcePolicyRuleApplyConfiguration { + for i := range values { + b.APIGroups = append(b.APIGroups, values[i]) + } + return b +} + +// WithResources adds the given value to the Resources field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Resources field. +func (b *ResourcePolicyRuleApplyConfiguration) WithResources(values ...string) *ResourcePolicyRuleApplyConfiguration { + for i := range values { + b.Resources = append(b.Resources, values[i]) + } + return b +} + +// WithClusterScope sets the ClusterScope field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterScope field is set to the value of the last call. +func (b *ResourcePolicyRuleApplyConfiguration) WithClusterScope(value bool) *ResourcePolicyRuleApplyConfiguration { + b.ClusterScope = &value + return b +} + +// WithNamespaces adds the given value to the Namespaces field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Namespaces field. +func (b *ResourcePolicyRuleApplyConfiguration) WithNamespaces(values ...string) *ResourcePolicyRuleApplyConfiguration { + for i := range values { + b.Namespaces = append(b.Namespaces, values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/serviceaccountsubject.go b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/serviceaccountsubject.go new file mode 100644 index 000000000000..f5a146a9b13e --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/serviceaccountsubject.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// ServiceAccountSubjectApplyConfiguration represents an declarative configuration of the ServiceAccountSubject type for use +// with apply. +type ServiceAccountSubjectApplyConfiguration struct { + Namespace *string `json:"namespace,omitempty"` + Name *string `json:"name,omitempty"` +} + +// ServiceAccountSubjectApplyConfiguration constructs an declarative configuration of the ServiceAccountSubject type for use with +// apply. +func ServiceAccountSubject() *ServiceAccountSubjectApplyConfiguration { + return &ServiceAccountSubjectApplyConfiguration{} +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *ServiceAccountSubjectApplyConfiguration) WithNamespace(value string) *ServiceAccountSubjectApplyConfiguration { + b.Namespace = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ServiceAccountSubjectApplyConfiguration) WithName(value string) *ServiceAccountSubjectApplyConfiguration { + b.Name = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/subject.go b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/subject.go new file mode 100644 index 000000000000..af571029fc71 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/subject.go @@ -0,0 +1,70 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1beta1 "k8s.io/api/flowcontrol/v1beta1" +) + +// SubjectApplyConfiguration represents an declarative configuration of the Subject type for use +// with apply. +type SubjectApplyConfiguration struct { + Kind *v1beta1.SubjectKind `json:"kind,omitempty"` + User *UserSubjectApplyConfiguration `json:"user,omitempty"` + Group *GroupSubjectApplyConfiguration `json:"group,omitempty"` + ServiceAccount *ServiceAccountSubjectApplyConfiguration `json:"serviceAccount,omitempty"` +} + +// SubjectApplyConfiguration constructs an declarative configuration of the Subject type for use with +// apply. +func Subject() *SubjectApplyConfiguration { + return &SubjectApplyConfiguration{} +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *SubjectApplyConfiguration) WithKind(value v1beta1.SubjectKind) *SubjectApplyConfiguration { + b.Kind = &value + return b +} + +// WithUser sets the User field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the User field is set to the value of the last call. +func (b *SubjectApplyConfiguration) WithUser(value *UserSubjectApplyConfiguration) *SubjectApplyConfiguration { + b.User = value + return b +} + +// WithGroup sets the Group field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Group field is set to the value of the last call. +func (b *SubjectApplyConfiguration) WithGroup(value *GroupSubjectApplyConfiguration) *SubjectApplyConfiguration { + b.Group = value + return b +} + +// WithServiceAccount sets the ServiceAccount field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ServiceAccount field is set to the value of the last call. +func (b *SubjectApplyConfiguration) WithServiceAccount(value *ServiceAccountSubjectApplyConfiguration) *SubjectApplyConfiguration { + b.ServiceAccount = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/usersubject.go b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/usersubject.go new file mode 100644 index 000000000000..35bf27a5935e --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1/usersubject.go @@ -0,0 +1,39 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// UserSubjectApplyConfiguration represents an declarative configuration of the UserSubject type for use +// with apply. +type UserSubjectApplyConfiguration struct { + Name *string `json:"name,omitempty"` +} + +// UserSubjectApplyConfiguration constructs an declarative configuration of the UserSubject type for use with +// apply. +func UserSubject() *UserSubjectApplyConfiguration { + return &UserSubjectApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *UserSubjectApplyConfiguration) WithName(value string) *UserSubjectApplyConfiguration { + b.Name = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/internal/internal.go b/vendor/k8s.io/client-go/applyconfigurations/internal/internal.go new file mode 100644 index 000000000000..abe43c0bf471 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/internal/internal.go @@ -0,0 +1,10762 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package internal + +import ( + "fmt" + "sync" + + typed "sigs.k8s.io/structured-merge-diff/v4/typed" +) + +func Parser() *typed.Parser { + parserOnce.Do(func() { + var err error + parser, err = typed.NewParser(schemaYAML) + if err != nil { + panic(fmt.Sprintf("Failed to parse schema: %v", err)) + } + }) + return parser +} + +var parserOnce sync.Once +var parser *typed.Parser +var schemaYAML = typed.YAMLObject(`types: +- name: io.k8s.api.admissionregistration.v1.MutatingWebhook + map: + fields: + - name: admissionReviewVersions + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: clientConfig + type: + namedType: io.k8s.api.admissionregistration.v1.WebhookClientConfig + default: {} + - name: failurePolicy + type: + scalar: string + - name: matchPolicy + type: + scalar: string + - name: name + type: + scalar: string + default: "" + - name: namespaceSelector + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector + - name: objectSelector + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector + - name: reinvocationPolicy + type: + scalar: string + - name: rules + type: + list: + elementType: + namedType: io.k8s.api.admissionregistration.v1.RuleWithOperations + elementRelationship: atomic + - name: sideEffects + type: + scalar: string + - name: timeoutSeconds + type: + scalar: numeric +- name: io.k8s.api.admissionregistration.v1.MutatingWebhookConfiguration + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: webhooks + type: + list: + elementType: + namedType: io.k8s.api.admissionregistration.v1.MutatingWebhook + elementRelationship: associative + keys: + - name +- name: io.k8s.api.admissionregistration.v1.RuleWithOperations + map: + fields: + - name: apiGroups + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: apiVersions + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: operations + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: resources + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: scope + type: + scalar: string +- name: io.k8s.api.admissionregistration.v1.ServiceReference + map: + fields: + - name: name + type: + scalar: string + default: "" + - name: namespace + type: + scalar: string + default: "" + - name: path + type: + scalar: string + - name: port + type: + scalar: numeric +- name: io.k8s.api.admissionregistration.v1.ValidatingWebhook + map: + fields: + - name: admissionReviewVersions + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: clientConfig + type: + namedType: io.k8s.api.admissionregistration.v1.WebhookClientConfig + default: {} + - name: failurePolicy + type: + scalar: string + - name: matchPolicy + type: + scalar: string + - name: name + type: + scalar: string + default: "" + - name: namespaceSelector + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector + - name: objectSelector + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector + - name: rules + type: + list: + elementType: + namedType: io.k8s.api.admissionregistration.v1.RuleWithOperations + elementRelationship: atomic + - name: sideEffects + type: + scalar: string + - name: timeoutSeconds + type: + scalar: numeric +- name: io.k8s.api.admissionregistration.v1.ValidatingWebhookConfiguration + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: webhooks + type: + list: + elementType: + namedType: io.k8s.api.admissionregistration.v1.ValidatingWebhook + elementRelationship: associative + keys: + - name +- name: io.k8s.api.admissionregistration.v1.WebhookClientConfig + map: + fields: + - name: caBundle + type: + scalar: string + - name: service + type: + namedType: io.k8s.api.admissionregistration.v1.ServiceReference + - name: url + type: + scalar: string +- name: io.k8s.api.admissionregistration.v1beta1.MutatingWebhook + map: + fields: + - name: admissionReviewVersions + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: clientConfig + type: + namedType: io.k8s.api.admissionregistration.v1beta1.WebhookClientConfig + default: {} + - name: failurePolicy + type: + scalar: string + - name: matchPolicy + type: + scalar: string + - name: name + type: + scalar: string + default: "" + - name: namespaceSelector + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector + - name: objectSelector + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector + - name: reinvocationPolicy + type: + scalar: string + - name: rules + type: + list: + elementType: + namedType: io.k8s.api.admissionregistration.v1beta1.RuleWithOperations + elementRelationship: atomic + - name: sideEffects + type: + scalar: string + - name: timeoutSeconds + type: + scalar: numeric +- name: io.k8s.api.admissionregistration.v1beta1.MutatingWebhookConfiguration + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: webhooks + type: + list: + elementType: + namedType: io.k8s.api.admissionregistration.v1beta1.MutatingWebhook + elementRelationship: associative + keys: + - name +- name: io.k8s.api.admissionregistration.v1beta1.RuleWithOperations + map: + fields: + - name: apiGroups + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: apiVersions + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: operations + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: resources + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: scope + type: + scalar: string +- name: io.k8s.api.admissionregistration.v1beta1.ServiceReference + map: + fields: + - name: name + type: + scalar: string + default: "" + - name: namespace + type: + scalar: string + default: "" + - name: path + type: + scalar: string + - name: port + type: + scalar: numeric +- name: io.k8s.api.admissionregistration.v1beta1.ValidatingWebhook + map: + fields: + - name: admissionReviewVersions + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: clientConfig + type: + namedType: io.k8s.api.admissionregistration.v1beta1.WebhookClientConfig + default: {} + - name: failurePolicy + type: + scalar: string + - name: matchPolicy + type: + scalar: string + - name: name + type: + scalar: string + default: "" + - name: namespaceSelector + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector + - name: objectSelector + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector + - name: rules + type: + list: + elementType: + namedType: io.k8s.api.admissionregistration.v1beta1.RuleWithOperations + elementRelationship: atomic + - name: sideEffects + type: + scalar: string + - name: timeoutSeconds + type: + scalar: numeric +- name: io.k8s.api.admissionregistration.v1beta1.ValidatingWebhookConfiguration + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: webhooks + type: + list: + elementType: + namedType: io.k8s.api.admissionregistration.v1beta1.ValidatingWebhook + elementRelationship: associative + keys: + - name +- name: io.k8s.api.admissionregistration.v1beta1.WebhookClientConfig + map: + fields: + - name: caBundle + type: + scalar: string + - name: service + type: + namedType: io.k8s.api.admissionregistration.v1beta1.ServiceReference + - name: url + type: + scalar: string +- name: io.k8s.api.apiserverinternal.v1alpha1.ServerStorageVersion + map: + fields: + - name: apiServerID + type: + scalar: string + - name: decodableVersions + type: + list: + elementType: + scalar: string + elementRelationship: associative + - name: encodingVersion + type: + scalar: string +- name: io.k8s.api.apiserverinternal.v1alpha1.StorageVersion + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.apiserverinternal.v1alpha1.StorageVersionSpec + default: {} + - name: status + type: + namedType: io.k8s.api.apiserverinternal.v1alpha1.StorageVersionStatus + default: {} +- name: io.k8s.api.apiserverinternal.v1alpha1.StorageVersionCondition + map: + fields: + - name: lastTransitionTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} + - name: message + type: + scalar: string + - name: observedGeneration + type: + scalar: numeric + - name: reason + type: + scalar: string + default: "" + - name: status + type: + scalar: string + default: "" + - name: type + type: + scalar: string + default: "" +- name: io.k8s.api.apiserverinternal.v1alpha1.StorageVersionSpec + map: + elementType: + scalar: untyped + list: + elementType: + namedType: __untyped_atomic_ + elementRelationship: atomic + map: + elementType: + namedType: __untyped_atomic_ + elementRelationship: atomic +- name: io.k8s.api.apiserverinternal.v1alpha1.StorageVersionStatus + map: + fields: + - name: commonEncodingVersion + type: + scalar: string + - name: conditions + type: + list: + elementType: + namedType: io.k8s.api.apiserverinternal.v1alpha1.StorageVersionCondition + elementRelationship: associative + keys: + - type + - name: storageVersions + type: + list: + elementType: + namedType: io.k8s.api.apiserverinternal.v1alpha1.ServerStorageVersion + elementRelationship: associative + keys: + - apiServerID +- name: io.k8s.api.apps.v1.ControllerRevision + map: + fields: + - name: apiVersion + type: + scalar: string + - name: data + type: + namedType: __untyped_atomic_ + default: {} + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: revision + type: + scalar: numeric + default: 0 +- name: io.k8s.api.apps.v1.DaemonSet + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.apps.v1.DaemonSetSpec + default: {} + - name: status + type: + namedType: io.k8s.api.apps.v1.DaemonSetStatus + default: {} +- name: io.k8s.api.apps.v1.DaemonSetCondition + map: + fields: + - name: lastTransitionTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} + - name: message + type: + scalar: string + - name: reason + type: + scalar: string + - name: status + type: + scalar: string + default: "" + - name: type + type: + scalar: string + default: "" +- name: io.k8s.api.apps.v1.DaemonSetSpec + map: + fields: + - name: minReadySeconds + type: + scalar: numeric + - name: revisionHistoryLimit + type: + scalar: numeric + - name: selector + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector + - name: template + type: + namedType: io.k8s.api.core.v1.PodTemplateSpec + default: {} + - name: updateStrategy + type: + namedType: io.k8s.api.apps.v1.DaemonSetUpdateStrategy + default: {} +- name: io.k8s.api.apps.v1.DaemonSetStatus + map: + fields: + - name: collisionCount + type: + scalar: numeric + - name: conditions + type: + list: + elementType: + namedType: io.k8s.api.apps.v1.DaemonSetCondition + elementRelationship: associative + keys: + - type + - name: currentNumberScheduled + type: + scalar: numeric + default: 0 + - name: desiredNumberScheduled + type: + scalar: numeric + default: 0 + - name: numberAvailable + type: + scalar: numeric + - name: numberMisscheduled + type: + scalar: numeric + default: 0 + - name: numberReady + type: + scalar: numeric + default: 0 + - name: numberUnavailable + type: + scalar: numeric + - name: observedGeneration + type: + scalar: numeric + - name: updatedNumberScheduled + type: + scalar: numeric +- name: io.k8s.api.apps.v1.DaemonSetUpdateStrategy + map: + fields: + - name: rollingUpdate + type: + namedType: io.k8s.api.apps.v1.RollingUpdateDaemonSet + - name: type + type: + scalar: string +- name: io.k8s.api.apps.v1.Deployment + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.apps.v1.DeploymentSpec + default: {} + - name: status + type: + namedType: io.k8s.api.apps.v1.DeploymentStatus + default: {} +- name: io.k8s.api.apps.v1.DeploymentCondition + map: + fields: + - name: lastTransitionTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} + - name: lastUpdateTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} + - name: message + type: + scalar: string + - name: reason + type: + scalar: string + - name: status + type: + scalar: string + default: "" + - name: type + type: + scalar: string + default: "" +- name: io.k8s.api.apps.v1.DeploymentSpec + map: + fields: + - name: minReadySeconds + type: + scalar: numeric + - name: paused + type: + scalar: boolean + - name: progressDeadlineSeconds + type: + scalar: numeric + - name: replicas + type: + scalar: numeric + - name: revisionHistoryLimit + type: + scalar: numeric + - name: selector + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector + - name: strategy + type: + namedType: io.k8s.api.apps.v1.DeploymentStrategy + default: {} + - name: template + type: + namedType: io.k8s.api.core.v1.PodTemplateSpec + default: {} +- name: io.k8s.api.apps.v1.DeploymentStatus + map: + fields: + - name: availableReplicas + type: + scalar: numeric + - name: collisionCount + type: + scalar: numeric + - name: conditions + type: + list: + elementType: + namedType: io.k8s.api.apps.v1.DeploymentCondition + elementRelationship: associative + keys: + - type + - name: observedGeneration + type: + scalar: numeric + - name: readyReplicas + type: + scalar: numeric + - name: replicas + type: + scalar: numeric + - name: unavailableReplicas + type: + scalar: numeric + - name: updatedReplicas + type: + scalar: numeric +- name: io.k8s.api.apps.v1.DeploymentStrategy + map: + fields: + - name: rollingUpdate + type: + namedType: io.k8s.api.apps.v1.RollingUpdateDeployment + - name: type + type: + scalar: string +- name: io.k8s.api.apps.v1.ReplicaSet + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.apps.v1.ReplicaSetSpec + default: {} + - name: status + type: + namedType: io.k8s.api.apps.v1.ReplicaSetStatus + default: {} +- name: io.k8s.api.apps.v1.ReplicaSetCondition + map: + fields: + - name: lastTransitionTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} + - name: message + type: + scalar: string + - name: reason + type: + scalar: string + - name: status + type: + scalar: string + default: "" + - name: type + type: + scalar: string + default: "" +- name: io.k8s.api.apps.v1.ReplicaSetSpec + map: + fields: + - name: minReadySeconds + type: + scalar: numeric + - name: replicas + type: + scalar: numeric + - name: selector + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector + - name: template + type: + namedType: io.k8s.api.core.v1.PodTemplateSpec + default: {} +- name: io.k8s.api.apps.v1.ReplicaSetStatus + map: + fields: + - name: availableReplicas + type: + scalar: numeric + - name: conditions + type: + list: + elementType: + namedType: io.k8s.api.apps.v1.ReplicaSetCondition + elementRelationship: associative + keys: + - type + - name: fullyLabeledReplicas + type: + scalar: numeric + - name: observedGeneration + type: + scalar: numeric + - name: readyReplicas + type: + scalar: numeric + - name: replicas + type: + scalar: numeric + default: 0 +- name: io.k8s.api.apps.v1.RollingUpdateDaemonSet + map: + fields: + - name: maxSurge + type: + namedType: io.k8s.apimachinery.pkg.util.intstr.IntOrString + - name: maxUnavailable + type: + namedType: io.k8s.apimachinery.pkg.util.intstr.IntOrString +- name: io.k8s.api.apps.v1.RollingUpdateDeployment + map: + fields: + - name: maxSurge + type: + namedType: io.k8s.apimachinery.pkg.util.intstr.IntOrString + - name: maxUnavailable + type: + namedType: io.k8s.apimachinery.pkg.util.intstr.IntOrString +- name: io.k8s.api.apps.v1.RollingUpdateStatefulSetStrategy + map: + fields: + - name: partition + type: + scalar: numeric +- name: io.k8s.api.apps.v1.StatefulSet + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.apps.v1.StatefulSetSpec + default: {} + - name: status + type: + namedType: io.k8s.api.apps.v1.StatefulSetStatus + default: {} +- name: io.k8s.api.apps.v1.StatefulSetCondition + map: + fields: + - name: lastTransitionTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} + - name: message + type: + scalar: string + - name: reason + type: + scalar: string + - name: status + type: + scalar: string + default: "" + - name: type + type: + scalar: string + default: "" +- name: io.k8s.api.apps.v1.StatefulSetSpec + map: + fields: + - name: podManagementPolicy + type: + scalar: string + - name: replicas + type: + scalar: numeric + - name: revisionHistoryLimit + type: + scalar: numeric + - name: selector + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector + - name: serviceName + type: + scalar: string + default: "" + - name: template + type: + namedType: io.k8s.api.core.v1.PodTemplateSpec + default: {} + - name: updateStrategy + type: + namedType: io.k8s.api.apps.v1.StatefulSetUpdateStrategy + default: {} + - name: volumeClaimTemplates + type: + list: + elementType: + namedType: io.k8s.api.core.v1.PersistentVolumeClaim + elementRelationship: atomic +- name: io.k8s.api.apps.v1.StatefulSetStatus + map: + fields: + - name: collisionCount + type: + scalar: numeric + - name: conditions + type: + list: + elementType: + namedType: io.k8s.api.apps.v1.StatefulSetCondition + elementRelationship: associative + keys: + - type + - name: currentReplicas + type: + scalar: numeric + - name: currentRevision + type: + scalar: string + - name: observedGeneration + type: + scalar: numeric + - name: readyReplicas + type: + scalar: numeric + - name: replicas + type: + scalar: numeric + default: 0 + - name: updateRevision + type: + scalar: string + - name: updatedReplicas + type: + scalar: numeric +- name: io.k8s.api.apps.v1.StatefulSetUpdateStrategy + map: + fields: + - name: rollingUpdate + type: + namedType: io.k8s.api.apps.v1.RollingUpdateStatefulSetStrategy + - name: type + type: + scalar: string +- name: io.k8s.api.apps.v1beta1.ControllerRevision + map: + fields: + - name: apiVersion + type: + scalar: string + - name: data + type: + namedType: __untyped_atomic_ + default: {} + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: revision + type: + scalar: numeric + default: 0 +- name: io.k8s.api.apps.v1beta1.Deployment + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.apps.v1beta1.DeploymentSpec + default: {} + - name: status + type: + namedType: io.k8s.api.apps.v1beta1.DeploymentStatus + default: {} +- name: io.k8s.api.apps.v1beta1.DeploymentCondition + map: + fields: + - name: lastTransitionTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} + - name: lastUpdateTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} + - name: message + type: + scalar: string + - name: reason + type: + scalar: string + - name: status + type: + scalar: string + default: "" + - name: type + type: + scalar: string + default: "" +- name: io.k8s.api.apps.v1beta1.DeploymentSpec + map: + fields: + - name: minReadySeconds + type: + scalar: numeric + - name: paused + type: + scalar: boolean + - name: progressDeadlineSeconds + type: + scalar: numeric + - name: replicas + type: + scalar: numeric + - name: revisionHistoryLimit + type: + scalar: numeric + - name: rollbackTo + type: + namedType: io.k8s.api.apps.v1beta1.RollbackConfig + - name: selector + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector + - name: strategy + type: + namedType: io.k8s.api.apps.v1beta1.DeploymentStrategy + default: {} + - name: template + type: + namedType: io.k8s.api.core.v1.PodTemplateSpec + default: {} +- name: io.k8s.api.apps.v1beta1.DeploymentStatus + map: + fields: + - name: availableReplicas + type: + scalar: numeric + - name: collisionCount + type: + scalar: numeric + - name: conditions + type: + list: + elementType: + namedType: io.k8s.api.apps.v1beta1.DeploymentCondition + elementRelationship: associative + keys: + - type + - name: observedGeneration + type: + scalar: numeric + - name: readyReplicas + type: + scalar: numeric + - name: replicas + type: + scalar: numeric + - name: unavailableReplicas + type: + scalar: numeric + - name: updatedReplicas + type: + scalar: numeric +- name: io.k8s.api.apps.v1beta1.DeploymentStrategy + map: + fields: + - name: rollingUpdate + type: + namedType: io.k8s.api.apps.v1beta1.RollingUpdateDeployment + - name: type + type: + scalar: string +- name: io.k8s.api.apps.v1beta1.RollbackConfig + map: + fields: + - name: revision + type: + scalar: numeric +- name: io.k8s.api.apps.v1beta1.RollingUpdateDeployment + map: + fields: + - name: maxSurge + type: + namedType: io.k8s.apimachinery.pkg.util.intstr.IntOrString + - name: maxUnavailable + type: + namedType: io.k8s.apimachinery.pkg.util.intstr.IntOrString +- name: io.k8s.api.apps.v1beta1.RollingUpdateStatefulSetStrategy + map: + fields: + - name: partition + type: + scalar: numeric +- name: io.k8s.api.apps.v1beta1.StatefulSet + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.apps.v1beta1.StatefulSetSpec + default: {} + - name: status + type: + namedType: io.k8s.api.apps.v1beta1.StatefulSetStatus + default: {} +- name: io.k8s.api.apps.v1beta1.StatefulSetCondition + map: + fields: + - name: lastTransitionTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} + - name: message + type: + scalar: string + - name: reason + type: + scalar: string + - name: status + type: + scalar: string + default: "" + - name: type + type: + scalar: string + default: "" +- name: io.k8s.api.apps.v1beta1.StatefulSetSpec + map: + fields: + - name: podManagementPolicy + type: + scalar: string + - name: replicas + type: + scalar: numeric + - name: revisionHistoryLimit + type: + scalar: numeric + - name: selector + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector + - name: serviceName + type: + scalar: string + default: "" + - name: template + type: + namedType: io.k8s.api.core.v1.PodTemplateSpec + default: {} + - name: updateStrategy + type: + namedType: io.k8s.api.apps.v1beta1.StatefulSetUpdateStrategy + default: {} + - name: volumeClaimTemplates + type: + list: + elementType: + namedType: io.k8s.api.core.v1.PersistentVolumeClaim + elementRelationship: atomic +- name: io.k8s.api.apps.v1beta1.StatefulSetStatus + map: + fields: + - name: collisionCount + type: + scalar: numeric + - name: conditions + type: + list: + elementType: + namedType: io.k8s.api.apps.v1beta1.StatefulSetCondition + elementRelationship: associative + keys: + - type + - name: currentReplicas + type: + scalar: numeric + - name: currentRevision + type: + scalar: string + - name: observedGeneration + type: + scalar: numeric + - name: readyReplicas + type: + scalar: numeric + - name: replicas + type: + scalar: numeric + default: 0 + - name: updateRevision + type: + scalar: string + - name: updatedReplicas + type: + scalar: numeric +- name: io.k8s.api.apps.v1beta1.StatefulSetUpdateStrategy + map: + fields: + - name: rollingUpdate + type: + namedType: io.k8s.api.apps.v1beta1.RollingUpdateStatefulSetStrategy + - name: type + type: + scalar: string +- name: io.k8s.api.apps.v1beta2.ControllerRevision + map: + fields: + - name: apiVersion + type: + scalar: string + - name: data + type: + namedType: __untyped_atomic_ + default: {} + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: revision + type: + scalar: numeric + default: 0 +- name: io.k8s.api.apps.v1beta2.DaemonSet + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.apps.v1beta2.DaemonSetSpec + default: {} + - name: status + type: + namedType: io.k8s.api.apps.v1beta2.DaemonSetStatus + default: {} +- name: io.k8s.api.apps.v1beta2.DaemonSetCondition + map: + fields: + - name: lastTransitionTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} + - name: message + type: + scalar: string + - name: reason + type: + scalar: string + - name: status + type: + scalar: string + default: "" + - name: type + type: + scalar: string + default: "" +- name: io.k8s.api.apps.v1beta2.DaemonSetSpec + map: + fields: + - name: minReadySeconds + type: + scalar: numeric + - name: revisionHistoryLimit + type: + scalar: numeric + - name: selector + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector + - name: template + type: + namedType: io.k8s.api.core.v1.PodTemplateSpec + default: {} + - name: updateStrategy + type: + namedType: io.k8s.api.apps.v1beta2.DaemonSetUpdateStrategy + default: {} +- name: io.k8s.api.apps.v1beta2.DaemonSetStatus + map: + fields: + - name: collisionCount + type: + scalar: numeric + - name: conditions + type: + list: + elementType: + namedType: io.k8s.api.apps.v1beta2.DaemonSetCondition + elementRelationship: associative + keys: + - type + - name: currentNumberScheduled + type: + scalar: numeric + default: 0 + - name: desiredNumberScheduled + type: + scalar: numeric + default: 0 + - name: numberAvailable + type: + scalar: numeric + - name: numberMisscheduled + type: + scalar: numeric + default: 0 + - name: numberReady + type: + scalar: numeric + default: 0 + - name: numberUnavailable + type: + scalar: numeric + - name: observedGeneration + type: + scalar: numeric + - name: updatedNumberScheduled + type: + scalar: numeric +- name: io.k8s.api.apps.v1beta2.DaemonSetUpdateStrategy + map: + fields: + - name: rollingUpdate + type: + namedType: io.k8s.api.apps.v1beta2.RollingUpdateDaemonSet + - name: type + type: + scalar: string +- name: io.k8s.api.apps.v1beta2.Deployment + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.apps.v1beta2.DeploymentSpec + default: {} + - name: status + type: + namedType: io.k8s.api.apps.v1beta2.DeploymentStatus + default: {} +- name: io.k8s.api.apps.v1beta2.DeploymentCondition + map: + fields: + - name: lastTransitionTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} + - name: lastUpdateTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} + - name: message + type: + scalar: string + - name: reason + type: + scalar: string + - name: status + type: + scalar: string + default: "" + - name: type + type: + scalar: string + default: "" +- name: io.k8s.api.apps.v1beta2.DeploymentSpec + map: + fields: + - name: minReadySeconds + type: + scalar: numeric + - name: paused + type: + scalar: boolean + - name: progressDeadlineSeconds + type: + scalar: numeric + - name: replicas + type: + scalar: numeric + - name: revisionHistoryLimit + type: + scalar: numeric + - name: selector + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector + - name: strategy + type: + namedType: io.k8s.api.apps.v1beta2.DeploymentStrategy + default: {} + - name: template + type: + namedType: io.k8s.api.core.v1.PodTemplateSpec + default: {} +- name: io.k8s.api.apps.v1beta2.DeploymentStatus + map: + fields: + - name: availableReplicas + type: + scalar: numeric + - name: collisionCount + type: + scalar: numeric + - name: conditions + type: + list: + elementType: + namedType: io.k8s.api.apps.v1beta2.DeploymentCondition + elementRelationship: associative + keys: + - type + - name: observedGeneration + type: + scalar: numeric + - name: readyReplicas + type: + scalar: numeric + - name: replicas + type: + scalar: numeric + - name: unavailableReplicas + type: + scalar: numeric + - name: updatedReplicas + type: + scalar: numeric +- name: io.k8s.api.apps.v1beta2.DeploymentStrategy + map: + fields: + - name: rollingUpdate + type: + namedType: io.k8s.api.apps.v1beta2.RollingUpdateDeployment + - name: type + type: + scalar: string +- name: io.k8s.api.apps.v1beta2.ReplicaSet + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.apps.v1beta2.ReplicaSetSpec + default: {} + - name: status + type: + namedType: io.k8s.api.apps.v1beta2.ReplicaSetStatus + default: {} +- name: io.k8s.api.apps.v1beta2.ReplicaSetCondition + map: + fields: + - name: lastTransitionTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} + - name: message + type: + scalar: string + - name: reason + type: + scalar: string + - name: status + type: + scalar: string + default: "" + - name: type + type: + scalar: string + default: "" +- name: io.k8s.api.apps.v1beta2.ReplicaSetSpec + map: + fields: + - name: minReadySeconds + type: + scalar: numeric + - name: replicas + type: + scalar: numeric + - name: selector + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector + - name: template + type: + namedType: io.k8s.api.core.v1.PodTemplateSpec + default: {} +- name: io.k8s.api.apps.v1beta2.ReplicaSetStatus + map: + fields: + - name: availableReplicas + type: + scalar: numeric + - name: conditions + type: + list: + elementType: + namedType: io.k8s.api.apps.v1beta2.ReplicaSetCondition + elementRelationship: associative + keys: + - type + - name: fullyLabeledReplicas + type: + scalar: numeric + - name: observedGeneration + type: + scalar: numeric + - name: readyReplicas + type: + scalar: numeric + - name: replicas + type: + scalar: numeric + default: 0 +- name: io.k8s.api.apps.v1beta2.RollingUpdateDaemonSet + map: + fields: + - name: maxSurge + type: + namedType: io.k8s.apimachinery.pkg.util.intstr.IntOrString + - name: maxUnavailable + type: + namedType: io.k8s.apimachinery.pkg.util.intstr.IntOrString +- name: io.k8s.api.apps.v1beta2.RollingUpdateDeployment + map: + fields: + - name: maxSurge + type: + namedType: io.k8s.apimachinery.pkg.util.intstr.IntOrString + - name: maxUnavailable + type: + namedType: io.k8s.apimachinery.pkg.util.intstr.IntOrString +- name: io.k8s.api.apps.v1beta2.RollingUpdateStatefulSetStrategy + map: + fields: + - name: partition + type: + scalar: numeric +- name: io.k8s.api.apps.v1beta2.StatefulSet + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.apps.v1beta2.StatefulSetSpec + default: {} + - name: status + type: + namedType: io.k8s.api.apps.v1beta2.StatefulSetStatus + default: {} +- name: io.k8s.api.apps.v1beta2.StatefulSetCondition + map: + fields: + - name: lastTransitionTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} + - name: message + type: + scalar: string + - name: reason + type: + scalar: string + - name: status + type: + scalar: string + default: "" + - name: type + type: + scalar: string + default: "" +- name: io.k8s.api.apps.v1beta2.StatefulSetSpec + map: + fields: + - name: podManagementPolicy + type: + scalar: string + - name: replicas + type: + scalar: numeric + - name: revisionHistoryLimit + type: + scalar: numeric + - name: selector + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector + - name: serviceName + type: + scalar: string + default: "" + - name: template + type: + namedType: io.k8s.api.core.v1.PodTemplateSpec + default: {} + - name: updateStrategy + type: + namedType: io.k8s.api.apps.v1beta2.StatefulSetUpdateStrategy + default: {} + - name: volumeClaimTemplates + type: + list: + elementType: + namedType: io.k8s.api.core.v1.PersistentVolumeClaim + elementRelationship: atomic +- name: io.k8s.api.apps.v1beta2.StatefulSetStatus + map: + fields: + - name: collisionCount + type: + scalar: numeric + - name: conditions + type: + list: + elementType: + namedType: io.k8s.api.apps.v1beta2.StatefulSetCondition + elementRelationship: associative + keys: + - type + - name: currentReplicas + type: + scalar: numeric + - name: currentRevision + type: + scalar: string + - name: observedGeneration + type: + scalar: numeric + - name: readyReplicas + type: + scalar: numeric + - name: replicas + type: + scalar: numeric + default: 0 + - name: updateRevision + type: + scalar: string + - name: updatedReplicas + type: + scalar: numeric +- name: io.k8s.api.apps.v1beta2.StatefulSetUpdateStrategy + map: + fields: + - name: rollingUpdate + type: + namedType: io.k8s.api.apps.v1beta2.RollingUpdateStatefulSetStrategy + - name: type + type: + scalar: string +- name: io.k8s.api.autoscaling.v1.CrossVersionObjectReference + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + default: "" + - name: name + type: + scalar: string + default: "" +- name: io.k8s.api.autoscaling.v1.HorizontalPodAutoscaler + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.autoscaling.v1.HorizontalPodAutoscalerSpec + default: {} + - name: status + type: + namedType: io.k8s.api.autoscaling.v1.HorizontalPodAutoscalerStatus + default: {} +- name: io.k8s.api.autoscaling.v1.HorizontalPodAutoscalerSpec + map: + fields: + - name: maxReplicas + type: + scalar: numeric + default: 0 + - name: minReplicas + type: + scalar: numeric + - name: scaleTargetRef + type: + namedType: io.k8s.api.autoscaling.v1.CrossVersionObjectReference + default: {} + - name: targetCPUUtilizationPercentage + type: + scalar: numeric +- name: io.k8s.api.autoscaling.v1.HorizontalPodAutoscalerStatus + map: + fields: + - name: currentCPUUtilizationPercentage + type: + scalar: numeric + - name: currentReplicas + type: + scalar: numeric + default: 0 + - name: desiredReplicas + type: + scalar: numeric + default: 0 + - name: lastScaleTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + - name: observedGeneration + type: + scalar: numeric +- name: io.k8s.api.autoscaling.v2beta1.ContainerResourceMetricSource + map: + fields: + - name: container + type: + scalar: string + default: "" + - name: name + type: + scalar: string + default: "" + - name: targetAverageUtilization + type: + scalar: numeric + - name: targetAverageValue + type: + namedType: io.k8s.apimachinery.pkg.api.resource.Quantity +- name: io.k8s.api.autoscaling.v2beta1.ContainerResourceMetricStatus + map: + fields: + - name: container + type: + scalar: string + default: "" + - name: currentAverageUtilization + type: + scalar: numeric + - name: currentAverageValue + type: + namedType: io.k8s.apimachinery.pkg.api.resource.Quantity + default: {} + - name: name + type: + scalar: string + default: "" +- name: io.k8s.api.autoscaling.v2beta1.CrossVersionObjectReference + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + default: "" + - name: name + type: + scalar: string + default: "" +- name: io.k8s.api.autoscaling.v2beta1.ExternalMetricSource + map: + fields: + - name: metricName + type: + scalar: string + default: "" + - name: metricSelector + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector + - name: targetAverageValue + type: + namedType: io.k8s.apimachinery.pkg.api.resource.Quantity + - name: targetValue + type: + namedType: io.k8s.apimachinery.pkg.api.resource.Quantity +- name: io.k8s.api.autoscaling.v2beta1.ExternalMetricStatus + map: + fields: + - name: currentAverageValue + type: + namedType: io.k8s.apimachinery.pkg.api.resource.Quantity + - name: currentValue + type: + namedType: io.k8s.apimachinery.pkg.api.resource.Quantity + default: {} + - name: metricName + type: + scalar: string + default: "" + - name: metricSelector + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector +- name: io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscaler + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscalerSpec + default: {} + - name: status + type: + namedType: io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscalerStatus + default: {} +- name: io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscalerCondition + map: + fields: + - name: lastTransitionTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} + - name: message + type: + scalar: string + - name: reason + type: + scalar: string + - name: status + type: + scalar: string + default: "" + - name: type + type: + scalar: string + default: "" +- name: io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscalerSpec + map: + fields: + - name: maxReplicas + type: + scalar: numeric + default: 0 + - name: metrics + type: + list: + elementType: + namedType: io.k8s.api.autoscaling.v2beta1.MetricSpec + elementRelationship: atomic + - name: minReplicas + type: + scalar: numeric + - name: scaleTargetRef + type: + namedType: io.k8s.api.autoscaling.v2beta1.CrossVersionObjectReference + default: {} +- name: io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscalerStatus + map: + fields: + - name: conditions + type: + list: + elementType: + namedType: io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscalerCondition + elementRelationship: atomic + - name: currentMetrics + type: + list: + elementType: + namedType: io.k8s.api.autoscaling.v2beta1.MetricStatus + elementRelationship: atomic + - name: currentReplicas + type: + scalar: numeric + default: 0 + - name: desiredReplicas + type: + scalar: numeric + default: 0 + - name: lastScaleTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + - name: observedGeneration + type: + scalar: numeric +- name: io.k8s.api.autoscaling.v2beta1.MetricSpec + map: + fields: + - name: containerResource + type: + namedType: io.k8s.api.autoscaling.v2beta1.ContainerResourceMetricSource + - name: external + type: + namedType: io.k8s.api.autoscaling.v2beta1.ExternalMetricSource + - name: object + type: + namedType: io.k8s.api.autoscaling.v2beta1.ObjectMetricSource + - name: pods + type: + namedType: io.k8s.api.autoscaling.v2beta1.PodsMetricSource + - name: resource + type: + namedType: io.k8s.api.autoscaling.v2beta1.ResourceMetricSource + - name: type + type: + scalar: string + default: "" +- name: io.k8s.api.autoscaling.v2beta1.MetricStatus + map: + fields: + - name: containerResource + type: + namedType: io.k8s.api.autoscaling.v2beta1.ContainerResourceMetricStatus + - name: external + type: + namedType: io.k8s.api.autoscaling.v2beta1.ExternalMetricStatus + - name: object + type: + namedType: io.k8s.api.autoscaling.v2beta1.ObjectMetricStatus + - name: pods + type: + namedType: io.k8s.api.autoscaling.v2beta1.PodsMetricStatus + - name: resource + type: + namedType: io.k8s.api.autoscaling.v2beta1.ResourceMetricStatus + - name: type + type: + scalar: string + default: "" +- name: io.k8s.api.autoscaling.v2beta1.ObjectMetricSource + map: + fields: + - name: averageValue + type: + namedType: io.k8s.apimachinery.pkg.api.resource.Quantity + - name: metricName + type: + scalar: string + default: "" + - name: selector + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector + - name: target + type: + namedType: io.k8s.api.autoscaling.v2beta1.CrossVersionObjectReference + default: {} + - name: targetValue + type: + namedType: io.k8s.apimachinery.pkg.api.resource.Quantity + default: {} +- name: io.k8s.api.autoscaling.v2beta1.ObjectMetricStatus + map: + fields: + - name: averageValue + type: + namedType: io.k8s.apimachinery.pkg.api.resource.Quantity + - name: currentValue + type: + namedType: io.k8s.apimachinery.pkg.api.resource.Quantity + default: {} + - name: metricName + type: + scalar: string + default: "" + - name: selector + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector + - name: target + type: + namedType: io.k8s.api.autoscaling.v2beta1.CrossVersionObjectReference + default: {} +- name: io.k8s.api.autoscaling.v2beta1.PodsMetricSource + map: + fields: + - name: metricName + type: + scalar: string + default: "" + - name: selector + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector + - name: targetAverageValue + type: + namedType: io.k8s.apimachinery.pkg.api.resource.Quantity + default: {} +- name: io.k8s.api.autoscaling.v2beta1.PodsMetricStatus + map: + fields: + - name: currentAverageValue + type: + namedType: io.k8s.apimachinery.pkg.api.resource.Quantity + default: {} + - name: metricName + type: + scalar: string + default: "" + - name: selector + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector +- name: io.k8s.api.autoscaling.v2beta1.ResourceMetricSource + map: + fields: + - name: name + type: + scalar: string + default: "" + - name: targetAverageUtilization + type: + scalar: numeric + - name: targetAverageValue + type: + namedType: io.k8s.apimachinery.pkg.api.resource.Quantity +- name: io.k8s.api.autoscaling.v2beta1.ResourceMetricStatus + map: + fields: + - name: currentAverageUtilization + type: + scalar: numeric + - name: currentAverageValue + type: + namedType: io.k8s.apimachinery.pkg.api.resource.Quantity + default: {} + - name: name + type: + scalar: string + default: "" +- name: io.k8s.api.autoscaling.v2beta2.ContainerResourceMetricSource + map: + fields: + - name: container + type: + scalar: string + default: "" + - name: name + type: + scalar: string + default: "" + - name: target + type: + namedType: io.k8s.api.autoscaling.v2beta2.MetricTarget + default: {} +- name: io.k8s.api.autoscaling.v2beta2.ContainerResourceMetricStatus + map: + fields: + - name: container + type: + scalar: string + default: "" + - name: current + type: + namedType: io.k8s.api.autoscaling.v2beta2.MetricValueStatus + default: {} + - name: name + type: + scalar: string + default: "" +- name: io.k8s.api.autoscaling.v2beta2.CrossVersionObjectReference + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + default: "" + - name: name + type: + scalar: string + default: "" +- name: io.k8s.api.autoscaling.v2beta2.ExternalMetricSource + map: + fields: + - name: metric + type: + namedType: io.k8s.api.autoscaling.v2beta2.MetricIdentifier + default: {} + - name: target + type: + namedType: io.k8s.api.autoscaling.v2beta2.MetricTarget + default: {} +- name: io.k8s.api.autoscaling.v2beta2.ExternalMetricStatus + map: + fields: + - name: current + type: + namedType: io.k8s.api.autoscaling.v2beta2.MetricValueStatus + default: {} + - name: metric + type: + namedType: io.k8s.api.autoscaling.v2beta2.MetricIdentifier + default: {} +- name: io.k8s.api.autoscaling.v2beta2.HPAScalingPolicy + map: + fields: + - name: periodSeconds + type: + scalar: numeric + default: 0 + - name: type + type: + scalar: string + default: "" + - name: value + type: + scalar: numeric + default: 0 +- name: io.k8s.api.autoscaling.v2beta2.HPAScalingRules + map: + fields: + - name: policies + type: + list: + elementType: + namedType: io.k8s.api.autoscaling.v2beta2.HPAScalingPolicy + elementRelationship: atomic + - name: selectPolicy + type: + scalar: string + - name: stabilizationWindowSeconds + type: + scalar: numeric +- name: io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscaler + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerSpec + default: {} + - name: status + type: + namedType: io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerStatus + default: {} +- name: io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerBehavior + map: + fields: + - name: scaleDown + type: + namedType: io.k8s.api.autoscaling.v2beta2.HPAScalingRules + - name: scaleUp + type: + namedType: io.k8s.api.autoscaling.v2beta2.HPAScalingRules +- name: io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerCondition + map: + fields: + - name: lastTransitionTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} + - name: message + type: + scalar: string + - name: reason + type: + scalar: string + - name: status + type: + scalar: string + default: "" + - name: type + type: + scalar: string + default: "" +- name: io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerSpec + map: + fields: + - name: behavior + type: + namedType: io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerBehavior + - name: maxReplicas + type: + scalar: numeric + default: 0 + - name: metrics + type: + list: + elementType: + namedType: io.k8s.api.autoscaling.v2beta2.MetricSpec + elementRelationship: atomic + - name: minReplicas + type: + scalar: numeric + - name: scaleTargetRef + type: + namedType: io.k8s.api.autoscaling.v2beta2.CrossVersionObjectReference + default: {} +- name: io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerStatus + map: + fields: + - name: conditions + type: + list: + elementType: + namedType: io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerCondition + elementRelationship: atomic + - name: currentMetrics + type: + list: + elementType: + namedType: io.k8s.api.autoscaling.v2beta2.MetricStatus + elementRelationship: atomic + - name: currentReplicas + type: + scalar: numeric + default: 0 + - name: desiredReplicas + type: + scalar: numeric + default: 0 + - name: lastScaleTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + - name: observedGeneration + type: + scalar: numeric +- name: io.k8s.api.autoscaling.v2beta2.MetricIdentifier + map: + fields: + - name: name + type: + scalar: string + default: "" + - name: selector + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector +- name: io.k8s.api.autoscaling.v2beta2.MetricSpec + map: + fields: + - name: containerResource + type: + namedType: io.k8s.api.autoscaling.v2beta2.ContainerResourceMetricSource + - name: external + type: + namedType: io.k8s.api.autoscaling.v2beta2.ExternalMetricSource + - name: object + type: + namedType: io.k8s.api.autoscaling.v2beta2.ObjectMetricSource + - name: pods + type: + namedType: io.k8s.api.autoscaling.v2beta2.PodsMetricSource + - name: resource + type: + namedType: io.k8s.api.autoscaling.v2beta2.ResourceMetricSource + - name: type + type: + scalar: string + default: "" +- name: io.k8s.api.autoscaling.v2beta2.MetricStatus + map: + fields: + - name: containerResource + type: + namedType: io.k8s.api.autoscaling.v2beta2.ContainerResourceMetricStatus + - name: external + type: + namedType: io.k8s.api.autoscaling.v2beta2.ExternalMetricStatus + - name: object + type: + namedType: io.k8s.api.autoscaling.v2beta2.ObjectMetricStatus + - name: pods + type: + namedType: io.k8s.api.autoscaling.v2beta2.PodsMetricStatus + - name: resource + type: + namedType: io.k8s.api.autoscaling.v2beta2.ResourceMetricStatus + - name: type + type: + scalar: string + default: "" +- name: io.k8s.api.autoscaling.v2beta2.MetricTarget + map: + fields: + - name: averageUtilization + type: + scalar: numeric + - name: averageValue + type: + namedType: io.k8s.apimachinery.pkg.api.resource.Quantity + - name: type + type: + scalar: string + default: "" + - name: value + type: + namedType: io.k8s.apimachinery.pkg.api.resource.Quantity +- name: io.k8s.api.autoscaling.v2beta2.MetricValueStatus + map: + fields: + - name: averageUtilization + type: + scalar: numeric + - name: averageValue + type: + namedType: io.k8s.apimachinery.pkg.api.resource.Quantity + - name: value + type: + namedType: io.k8s.apimachinery.pkg.api.resource.Quantity +- name: io.k8s.api.autoscaling.v2beta2.ObjectMetricSource + map: + fields: + - name: describedObject + type: + namedType: io.k8s.api.autoscaling.v2beta2.CrossVersionObjectReference + default: {} + - name: metric + type: + namedType: io.k8s.api.autoscaling.v2beta2.MetricIdentifier + default: {} + - name: target + type: + namedType: io.k8s.api.autoscaling.v2beta2.MetricTarget + default: {} +- name: io.k8s.api.autoscaling.v2beta2.ObjectMetricStatus + map: + fields: + - name: current + type: + namedType: io.k8s.api.autoscaling.v2beta2.MetricValueStatus + default: {} + - name: describedObject + type: + namedType: io.k8s.api.autoscaling.v2beta2.CrossVersionObjectReference + default: {} + - name: metric + type: + namedType: io.k8s.api.autoscaling.v2beta2.MetricIdentifier + default: {} +- name: io.k8s.api.autoscaling.v2beta2.PodsMetricSource + map: + fields: + - name: metric + type: + namedType: io.k8s.api.autoscaling.v2beta2.MetricIdentifier + default: {} + - name: target + type: + namedType: io.k8s.api.autoscaling.v2beta2.MetricTarget + default: {} +- name: io.k8s.api.autoscaling.v2beta2.PodsMetricStatus + map: + fields: + - name: current + type: + namedType: io.k8s.api.autoscaling.v2beta2.MetricValueStatus + default: {} + - name: metric + type: + namedType: io.k8s.api.autoscaling.v2beta2.MetricIdentifier + default: {} +- name: io.k8s.api.autoscaling.v2beta2.ResourceMetricSource + map: + fields: + - name: name + type: + scalar: string + default: "" + - name: target + type: + namedType: io.k8s.api.autoscaling.v2beta2.MetricTarget + default: {} +- name: io.k8s.api.autoscaling.v2beta2.ResourceMetricStatus + map: + fields: + - name: current + type: + namedType: io.k8s.api.autoscaling.v2beta2.MetricValueStatus + default: {} + - name: name + type: + scalar: string + default: "" +- name: io.k8s.api.batch.v1.CronJob + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.batch.v1.CronJobSpec + default: {} + - name: status + type: + namedType: io.k8s.api.batch.v1.CronJobStatus + default: {} +- name: io.k8s.api.batch.v1.CronJobSpec + map: + fields: + - name: concurrencyPolicy + type: + scalar: string + - name: failedJobsHistoryLimit + type: + scalar: numeric + - name: jobTemplate + type: + namedType: io.k8s.api.batch.v1.JobTemplateSpec + default: {} + - name: schedule + type: + scalar: string + default: "" + - name: startingDeadlineSeconds + type: + scalar: numeric + - name: successfulJobsHistoryLimit + type: + scalar: numeric + - name: suspend + type: + scalar: boolean +- name: io.k8s.api.batch.v1.CronJobStatus + map: + fields: + - name: active + type: + list: + elementType: + namedType: io.k8s.api.core.v1.ObjectReference + elementRelationship: atomic + - name: lastScheduleTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + - name: lastSuccessfulTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time +- name: io.k8s.api.batch.v1.Job + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.batch.v1.JobSpec + default: {} + - name: status + type: + namedType: io.k8s.api.batch.v1.JobStatus + default: {} +- name: io.k8s.api.batch.v1.JobCondition + map: + fields: + - name: lastProbeTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} + - name: lastTransitionTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} + - name: message + type: + scalar: string + - name: reason + type: + scalar: string + - name: status + type: + scalar: string + default: "" + - name: type + type: + scalar: string + default: "" +- name: io.k8s.api.batch.v1.JobSpec + map: + fields: + - name: activeDeadlineSeconds + type: + scalar: numeric + - name: backoffLimit + type: + scalar: numeric + - name: completionMode + type: + scalar: string + - name: completions + type: + scalar: numeric + - name: manualSelector + type: + scalar: boolean + - name: parallelism + type: + scalar: numeric + - name: selector + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector + - name: suspend + type: + scalar: boolean + - name: template + type: + namedType: io.k8s.api.core.v1.PodTemplateSpec + default: {} + - name: ttlSecondsAfterFinished + type: + scalar: numeric +- name: io.k8s.api.batch.v1.JobStatus + map: + fields: + - name: active + type: + scalar: numeric + - name: completedIndexes + type: + scalar: string + - name: completionTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + - name: conditions + type: + list: + elementType: + namedType: io.k8s.api.batch.v1.JobCondition + elementRelationship: atomic + - name: failed + type: + scalar: numeric + - name: startTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + - name: succeeded + type: + scalar: numeric +- name: io.k8s.api.batch.v1.JobTemplateSpec + map: + fields: + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.batch.v1.JobSpec + default: {} +- name: io.k8s.api.batch.v1beta1.CronJob + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.batch.v1beta1.CronJobSpec + default: {} + - name: status + type: + namedType: io.k8s.api.batch.v1beta1.CronJobStatus + default: {} +- name: io.k8s.api.batch.v1beta1.CronJobSpec + map: + fields: + - name: concurrencyPolicy + type: + scalar: string + - name: failedJobsHistoryLimit + type: + scalar: numeric + - name: jobTemplate + type: + namedType: io.k8s.api.batch.v1beta1.JobTemplateSpec + default: {} + - name: schedule + type: + scalar: string + default: "" + - name: startingDeadlineSeconds + type: + scalar: numeric + - name: successfulJobsHistoryLimit + type: + scalar: numeric + - name: suspend + type: + scalar: boolean +- name: io.k8s.api.batch.v1beta1.CronJobStatus + map: + fields: + - name: active + type: + list: + elementType: + namedType: io.k8s.api.core.v1.ObjectReference + elementRelationship: atomic + - name: lastScheduleTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + - name: lastSuccessfulTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time +- name: io.k8s.api.batch.v1beta1.JobTemplateSpec + map: + fields: + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.batch.v1.JobSpec + default: {} +- name: io.k8s.api.certificates.v1.CertificateSigningRequest + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.certificates.v1.CertificateSigningRequestSpec + default: {} + - name: status + type: + namedType: io.k8s.api.certificates.v1.CertificateSigningRequestStatus + default: {} +- name: io.k8s.api.certificates.v1.CertificateSigningRequestCondition + map: + fields: + - name: lastTransitionTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} + - name: lastUpdateTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} + - name: message + type: + scalar: string + - name: reason + type: + scalar: string + - name: status + type: + scalar: string + default: "" + - name: type + type: + scalar: string + default: "" +- name: io.k8s.api.certificates.v1.CertificateSigningRequestSpec + map: + fields: + - name: extra + type: + map: + elementType: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: groups + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: request + type: + scalar: string + - name: signerName + type: + scalar: string + default: "" + - name: uid + type: + scalar: string + - name: usages + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: username + type: + scalar: string +- name: io.k8s.api.certificates.v1.CertificateSigningRequestStatus + map: + fields: + - name: certificate + type: + scalar: string + - name: conditions + type: + list: + elementType: + namedType: io.k8s.api.certificates.v1.CertificateSigningRequestCondition + elementRelationship: associative + keys: + - type +- name: io.k8s.api.certificates.v1beta1.CertificateSigningRequest + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.certificates.v1beta1.CertificateSigningRequestSpec + default: {} + - name: status + type: + namedType: io.k8s.api.certificates.v1beta1.CertificateSigningRequestStatus + default: {} +- name: io.k8s.api.certificates.v1beta1.CertificateSigningRequestCondition + map: + fields: + - name: lastTransitionTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} + - name: lastUpdateTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} + - name: message + type: + scalar: string + - name: reason + type: + scalar: string + - name: status + type: + scalar: string + default: "" + - name: type + type: + scalar: string + default: "" +- name: io.k8s.api.certificates.v1beta1.CertificateSigningRequestSpec + map: + fields: + - name: extra + type: + map: + elementType: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: groups + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: request + type: + scalar: string + - name: signerName + type: + scalar: string + - name: uid + type: + scalar: string + - name: usages + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: username + type: + scalar: string +- name: io.k8s.api.certificates.v1beta1.CertificateSigningRequestStatus + map: + fields: + - name: certificate + type: + scalar: string + - name: conditions + type: + list: + elementType: + namedType: io.k8s.api.certificates.v1beta1.CertificateSigningRequestCondition + elementRelationship: associative + keys: + - type +- name: io.k8s.api.coordination.v1.Lease + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.coordination.v1.LeaseSpec + default: {} +- name: io.k8s.api.coordination.v1.LeaseSpec + map: + fields: + - name: acquireTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.MicroTime + - name: holderIdentity + type: + scalar: string + - name: leaseDurationSeconds + type: + scalar: numeric + - name: leaseTransitions + type: + scalar: numeric + - name: renewTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.MicroTime +- name: io.k8s.api.coordination.v1beta1.Lease + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.coordination.v1beta1.LeaseSpec + default: {} +- name: io.k8s.api.coordination.v1beta1.LeaseSpec + map: + fields: + - name: acquireTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.MicroTime + - name: holderIdentity + type: + scalar: string + - name: leaseDurationSeconds + type: + scalar: numeric + - name: leaseTransitions + type: + scalar: numeric + - name: renewTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.MicroTime +- name: io.k8s.api.core.v1.AWSElasticBlockStoreVolumeSource + map: + fields: + - name: fsType + type: + scalar: string + - name: partition + type: + scalar: numeric + - name: readOnly + type: + scalar: boolean + - name: volumeID + type: + scalar: string + default: "" +- name: io.k8s.api.core.v1.Affinity + map: + fields: + - name: nodeAffinity + type: + namedType: io.k8s.api.core.v1.NodeAffinity + - name: podAffinity + type: + namedType: io.k8s.api.core.v1.PodAffinity + - name: podAntiAffinity + type: + namedType: io.k8s.api.core.v1.PodAntiAffinity +- name: io.k8s.api.core.v1.AttachedVolume + map: + fields: + - name: devicePath + type: + scalar: string + default: "" + - name: name + type: + scalar: string + default: "" +- name: io.k8s.api.core.v1.AzureDiskVolumeSource + map: + fields: + - name: cachingMode + type: + scalar: string + - name: diskName + type: + scalar: string + default: "" + - name: diskURI + type: + scalar: string + default: "" + - name: fsType + type: + scalar: string + - name: kind + type: + scalar: string + - name: readOnly + type: + scalar: boolean +- name: io.k8s.api.core.v1.AzureFilePersistentVolumeSource + map: + fields: + - name: readOnly + type: + scalar: boolean + - name: secretName + type: + scalar: string + default: "" + - name: secretNamespace + type: + scalar: string + - name: shareName + type: + scalar: string + default: "" +- name: io.k8s.api.core.v1.AzureFileVolumeSource + map: + fields: + - name: readOnly + type: + scalar: boolean + - name: secretName + type: + scalar: string + default: "" + - name: shareName + type: + scalar: string + default: "" +- name: io.k8s.api.core.v1.CSIPersistentVolumeSource + map: + fields: + - name: controllerExpandSecretRef + type: + namedType: io.k8s.api.core.v1.SecretReference + - name: controllerPublishSecretRef + type: + namedType: io.k8s.api.core.v1.SecretReference + - name: driver + type: + scalar: string + default: "" + - name: fsType + type: + scalar: string + - name: nodePublishSecretRef + type: + namedType: io.k8s.api.core.v1.SecretReference + - name: nodeStageSecretRef + type: + namedType: io.k8s.api.core.v1.SecretReference + - name: readOnly + type: + scalar: boolean + - name: volumeAttributes + type: + map: + elementType: + scalar: string + - name: volumeHandle + type: + scalar: string + default: "" +- name: io.k8s.api.core.v1.CSIVolumeSource + map: + fields: + - name: driver + type: + scalar: string + default: "" + - name: fsType + type: + scalar: string + - name: nodePublishSecretRef + type: + namedType: io.k8s.api.core.v1.LocalObjectReference + - name: readOnly + type: + scalar: boolean + - name: volumeAttributes + type: + map: + elementType: + scalar: string +- name: io.k8s.api.core.v1.Capabilities + map: + fields: + - name: add + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: drop + type: + list: + elementType: + scalar: string + elementRelationship: atomic +- name: io.k8s.api.core.v1.CephFSPersistentVolumeSource + map: + fields: + - name: monitors + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: path + type: + scalar: string + - name: readOnly + type: + scalar: boolean + - name: secretFile + type: + scalar: string + - name: secretRef + type: + namedType: io.k8s.api.core.v1.SecretReference + - name: user + type: + scalar: string +- name: io.k8s.api.core.v1.CephFSVolumeSource + map: + fields: + - name: monitors + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: path + type: + scalar: string + - name: readOnly + type: + scalar: boolean + - name: secretFile + type: + scalar: string + - name: secretRef + type: + namedType: io.k8s.api.core.v1.LocalObjectReference + - name: user + type: + scalar: string +- name: io.k8s.api.core.v1.CinderPersistentVolumeSource + map: + fields: + - name: fsType + type: + scalar: string + - name: readOnly + type: + scalar: boolean + - name: secretRef + type: + namedType: io.k8s.api.core.v1.SecretReference + - name: volumeID + type: + scalar: string + default: "" +- name: io.k8s.api.core.v1.CinderVolumeSource + map: + fields: + - name: fsType + type: + scalar: string + - name: readOnly + type: + scalar: boolean + - name: secretRef + type: + namedType: io.k8s.api.core.v1.LocalObjectReference + - name: volumeID + type: + scalar: string + default: "" +- name: io.k8s.api.core.v1.ClientIPConfig + map: + fields: + - name: timeoutSeconds + type: + scalar: numeric +- name: io.k8s.api.core.v1.ComponentCondition + map: + fields: + - name: error + type: + scalar: string + - name: message + type: + scalar: string + - name: status + type: + scalar: string + default: "" + - name: type + type: + scalar: string + default: "" +- name: io.k8s.api.core.v1.ComponentStatus + map: + fields: + - name: apiVersion + type: + scalar: string + - name: conditions + type: + list: + elementType: + namedType: io.k8s.api.core.v1.ComponentCondition + elementRelationship: associative + keys: + - type + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} +- name: io.k8s.api.core.v1.ConfigMap + map: + fields: + - name: apiVersion + type: + scalar: string + - name: binaryData + type: + map: + elementType: + scalar: string + - name: data + type: + map: + elementType: + scalar: string + - name: immutable + type: + scalar: boolean + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} +- name: io.k8s.api.core.v1.ConfigMapEnvSource + map: + fields: + - name: name + type: + scalar: string + - name: optional + type: + scalar: boolean +- name: io.k8s.api.core.v1.ConfigMapKeySelector + map: + fields: + - name: key + type: + scalar: string + default: "" + - name: name + type: + scalar: string + - name: optional + type: + scalar: boolean +- name: io.k8s.api.core.v1.ConfigMapNodeConfigSource + map: + fields: + - name: kubeletConfigKey + type: + scalar: string + default: "" + - name: name + type: + scalar: string + default: "" + - name: namespace + type: + scalar: string + default: "" + - name: resourceVersion + type: + scalar: string + - name: uid + type: + scalar: string +- name: io.k8s.api.core.v1.ConfigMapProjection + map: + fields: + - name: items + type: + list: + elementType: + namedType: io.k8s.api.core.v1.KeyToPath + elementRelationship: atomic + - name: name + type: + scalar: string + - name: optional + type: + scalar: boolean +- name: io.k8s.api.core.v1.ConfigMapVolumeSource + map: + fields: + - name: defaultMode + type: + scalar: numeric + - name: items + type: + list: + elementType: + namedType: io.k8s.api.core.v1.KeyToPath + elementRelationship: atomic + - name: name + type: + scalar: string + - name: optional + type: + scalar: boolean +- name: io.k8s.api.core.v1.Container + map: + fields: + - name: args + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: command + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: env + type: + list: + elementType: + namedType: io.k8s.api.core.v1.EnvVar + elementRelationship: associative + keys: + - name + - name: envFrom + type: + list: + elementType: + namedType: io.k8s.api.core.v1.EnvFromSource + elementRelationship: atomic + - name: image + type: + scalar: string + - name: imagePullPolicy + type: + scalar: string + - name: lifecycle + type: + namedType: io.k8s.api.core.v1.Lifecycle + - name: livenessProbe + type: + namedType: io.k8s.api.core.v1.Probe + - name: name + type: + scalar: string + default: "" + - name: ports + type: + list: + elementType: + namedType: io.k8s.api.core.v1.ContainerPort + elementRelationship: associative + keys: + - containerPort + - protocol + - name: readinessProbe + type: + namedType: io.k8s.api.core.v1.Probe + - name: resources + type: + namedType: io.k8s.api.core.v1.ResourceRequirements + default: {} + - name: securityContext + type: + namedType: io.k8s.api.core.v1.SecurityContext + - name: startupProbe + type: + namedType: io.k8s.api.core.v1.Probe + - name: stdin + type: + scalar: boolean + - name: stdinOnce + type: + scalar: boolean + - name: terminationMessagePath + type: + scalar: string + - name: terminationMessagePolicy + type: + scalar: string + - name: tty + type: + scalar: boolean + - name: volumeDevices + type: + list: + elementType: + namedType: io.k8s.api.core.v1.VolumeDevice + elementRelationship: associative + keys: + - devicePath + - name: volumeMounts + type: + list: + elementType: + namedType: io.k8s.api.core.v1.VolumeMount + elementRelationship: associative + keys: + - mountPath + - name: workingDir + type: + scalar: string +- name: io.k8s.api.core.v1.ContainerImage + map: + fields: + - name: names + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: sizeBytes + type: + scalar: numeric +- name: io.k8s.api.core.v1.ContainerPort + map: + fields: + - name: containerPort + type: + scalar: numeric + default: 0 + - name: hostIP + type: + scalar: string + - name: hostPort + type: + scalar: numeric + - name: name + type: + scalar: string + - name: protocol + type: + scalar: string + default: TCP +- name: io.k8s.api.core.v1.ContainerState + map: + fields: + - name: running + type: + namedType: io.k8s.api.core.v1.ContainerStateRunning + - name: terminated + type: + namedType: io.k8s.api.core.v1.ContainerStateTerminated + - name: waiting + type: + namedType: io.k8s.api.core.v1.ContainerStateWaiting +- name: io.k8s.api.core.v1.ContainerStateRunning + map: + fields: + - name: startedAt + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} +- name: io.k8s.api.core.v1.ContainerStateTerminated + map: + fields: + - name: containerID + type: + scalar: string + - name: exitCode + type: + scalar: numeric + default: 0 + - name: finishedAt + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} + - name: message + type: + scalar: string + - name: reason + type: + scalar: string + - name: signal + type: + scalar: numeric + - name: startedAt + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} +- name: io.k8s.api.core.v1.ContainerStateWaiting + map: + fields: + - name: message + type: + scalar: string + - name: reason + type: + scalar: string +- name: io.k8s.api.core.v1.ContainerStatus + map: + fields: + - name: containerID + type: + scalar: string + - name: image + type: + scalar: string + default: "" + - name: imageID + type: + scalar: string + default: "" + - name: lastState + type: + namedType: io.k8s.api.core.v1.ContainerState + default: {} + - name: name + type: + scalar: string + default: "" + - name: ready + type: + scalar: boolean + default: false + - name: restartCount + type: + scalar: numeric + default: 0 + - name: started + type: + scalar: boolean + - name: state + type: + namedType: io.k8s.api.core.v1.ContainerState + default: {} +- name: io.k8s.api.core.v1.DaemonEndpoint + map: + fields: + - name: Port + type: + scalar: numeric + default: 0 +- name: io.k8s.api.core.v1.DownwardAPIProjection + map: + fields: + - name: items + type: + list: + elementType: + namedType: io.k8s.api.core.v1.DownwardAPIVolumeFile + elementRelationship: atomic +- name: io.k8s.api.core.v1.DownwardAPIVolumeFile + map: + fields: + - name: fieldRef + type: + namedType: io.k8s.api.core.v1.ObjectFieldSelector + - name: mode + type: + scalar: numeric + - name: path + type: + scalar: string + default: "" + - name: resourceFieldRef + type: + namedType: io.k8s.api.core.v1.ResourceFieldSelector +- name: io.k8s.api.core.v1.DownwardAPIVolumeSource + map: + fields: + - name: defaultMode + type: + scalar: numeric + - name: items + type: + list: + elementType: + namedType: io.k8s.api.core.v1.DownwardAPIVolumeFile + elementRelationship: atomic +- name: io.k8s.api.core.v1.EmptyDirVolumeSource + map: + fields: + - name: medium + type: + scalar: string + - name: sizeLimit + type: + namedType: io.k8s.apimachinery.pkg.api.resource.Quantity +- name: io.k8s.api.core.v1.EndpointAddress + map: + fields: + - name: hostname + type: + scalar: string + - name: ip + type: + scalar: string + default: "" + - name: nodeName + type: + scalar: string + - name: targetRef + type: + namedType: io.k8s.api.core.v1.ObjectReference +- name: io.k8s.api.core.v1.EndpointPort + map: + fields: + - name: appProtocol + type: + scalar: string + - name: name + type: + scalar: string + - name: port + type: + scalar: numeric + default: 0 + - name: protocol + type: + scalar: string +- name: io.k8s.api.core.v1.EndpointSubset + map: + fields: + - name: addresses + type: + list: + elementType: + namedType: io.k8s.api.core.v1.EndpointAddress + elementRelationship: atomic + - name: notReadyAddresses + type: + list: + elementType: + namedType: io.k8s.api.core.v1.EndpointAddress + elementRelationship: atomic + - name: ports + type: + list: + elementType: + namedType: io.k8s.api.core.v1.EndpointPort + elementRelationship: atomic +- name: io.k8s.api.core.v1.Endpoints + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: subsets + type: + list: + elementType: + namedType: io.k8s.api.core.v1.EndpointSubset + elementRelationship: atomic +- name: io.k8s.api.core.v1.EnvFromSource + map: + fields: + - name: configMapRef + type: + namedType: io.k8s.api.core.v1.ConfigMapEnvSource + - name: prefix + type: + scalar: string + - name: secretRef + type: + namedType: io.k8s.api.core.v1.SecretEnvSource +- name: io.k8s.api.core.v1.EnvVar + map: + fields: + - name: name + type: + scalar: string + default: "" + - name: value + type: + scalar: string + - name: valueFrom + type: + namedType: io.k8s.api.core.v1.EnvVarSource +- name: io.k8s.api.core.v1.EnvVarSource + map: + fields: + - name: configMapKeyRef + type: + namedType: io.k8s.api.core.v1.ConfigMapKeySelector + - name: fieldRef + type: + namedType: io.k8s.api.core.v1.ObjectFieldSelector + - name: resourceFieldRef + type: + namedType: io.k8s.api.core.v1.ResourceFieldSelector + - name: secretKeyRef + type: + namedType: io.k8s.api.core.v1.SecretKeySelector +- name: io.k8s.api.core.v1.EphemeralContainer + map: + fields: + - name: args + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: command + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: env + type: + list: + elementType: + namedType: io.k8s.api.core.v1.EnvVar + elementRelationship: associative + keys: + - name + - name: envFrom + type: + list: + elementType: + namedType: io.k8s.api.core.v1.EnvFromSource + elementRelationship: atomic + - name: image + type: + scalar: string + - name: imagePullPolicy + type: + scalar: string + - name: lifecycle + type: + namedType: io.k8s.api.core.v1.Lifecycle + - name: livenessProbe + type: + namedType: io.k8s.api.core.v1.Probe + - name: name + type: + scalar: string + default: "" + - name: ports + type: + list: + elementType: + namedType: io.k8s.api.core.v1.ContainerPort + elementRelationship: atomic + - name: readinessProbe + type: + namedType: io.k8s.api.core.v1.Probe + - name: resources + type: + namedType: io.k8s.api.core.v1.ResourceRequirements + default: {} + - name: securityContext + type: + namedType: io.k8s.api.core.v1.SecurityContext + - name: startupProbe + type: + namedType: io.k8s.api.core.v1.Probe + - name: stdin + type: + scalar: boolean + - name: stdinOnce + type: + scalar: boolean + - name: targetContainerName + type: + scalar: string + - name: terminationMessagePath + type: + scalar: string + - name: terminationMessagePolicy + type: + scalar: string + - name: tty + type: + scalar: boolean + - name: volumeDevices + type: + list: + elementType: + namedType: io.k8s.api.core.v1.VolumeDevice + elementRelationship: associative + keys: + - devicePath + - name: volumeMounts + type: + list: + elementType: + namedType: io.k8s.api.core.v1.VolumeMount + elementRelationship: associative + keys: + - mountPath + - name: workingDir + type: + scalar: string +- name: io.k8s.api.core.v1.EphemeralVolumeSource + map: + fields: + - name: volumeClaimTemplate + type: + namedType: io.k8s.api.core.v1.PersistentVolumeClaimTemplate +- name: io.k8s.api.core.v1.Event + map: + fields: + - name: action + type: + scalar: string + - name: apiVersion + type: + scalar: string + - name: count + type: + scalar: numeric + - name: eventTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.MicroTime + default: {} + - name: firstTimestamp + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} + - name: involvedObject + type: + namedType: io.k8s.api.core.v1.ObjectReference + default: {} + - name: kind + type: + scalar: string + - name: lastTimestamp + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} + - name: message + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: reason + type: + scalar: string + - name: related + type: + namedType: io.k8s.api.core.v1.ObjectReference + - name: reportingComponent + type: + scalar: string + default: "" + - name: reportingInstance + type: + scalar: string + default: "" + - name: series + type: + namedType: io.k8s.api.core.v1.EventSeries + - name: source + type: + namedType: io.k8s.api.core.v1.EventSource + default: {} + - name: type + type: + scalar: string +- name: io.k8s.api.core.v1.EventSeries + map: + fields: + - name: count + type: + scalar: numeric + - name: lastObservedTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.MicroTime + default: {} +- name: io.k8s.api.core.v1.EventSource + map: + fields: + - name: component + type: + scalar: string + - name: host + type: + scalar: string +- name: io.k8s.api.core.v1.ExecAction + map: + fields: + - name: command + type: + list: + elementType: + scalar: string + elementRelationship: atomic +- name: io.k8s.api.core.v1.FCVolumeSource + map: + fields: + - name: fsType + type: + scalar: string + - name: lun + type: + scalar: numeric + - name: readOnly + type: + scalar: boolean + - name: targetWWNs + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: wwids + type: + list: + elementType: + scalar: string + elementRelationship: atomic +- name: io.k8s.api.core.v1.FlexPersistentVolumeSource + map: + fields: + - name: driver + type: + scalar: string + default: "" + - name: fsType + type: + scalar: string + - name: options + type: + map: + elementType: + scalar: string + - name: readOnly + type: + scalar: boolean + - name: secretRef + type: + namedType: io.k8s.api.core.v1.SecretReference +- name: io.k8s.api.core.v1.FlexVolumeSource + map: + fields: + - name: driver + type: + scalar: string + default: "" + - name: fsType + type: + scalar: string + - name: options + type: + map: + elementType: + scalar: string + - name: readOnly + type: + scalar: boolean + - name: secretRef + type: + namedType: io.k8s.api.core.v1.LocalObjectReference +- name: io.k8s.api.core.v1.FlockerVolumeSource + map: + fields: + - name: datasetName + type: + scalar: string + - name: datasetUUID + type: + scalar: string +- name: io.k8s.api.core.v1.GCEPersistentDiskVolumeSource + map: + fields: + - name: fsType + type: + scalar: string + - name: partition + type: + scalar: numeric + - name: pdName + type: + scalar: string + default: "" + - name: readOnly + type: + scalar: boolean +- name: io.k8s.api.core.v1.GitRepoVolumeSource + map: + fields: + - name: directory + type: + scalar: string + - name: repository + type: + scalar: string + default: "" + - name: revision + type: + scalar: string +- name: io.k8s.api.core.v1.GlusterfsPersistentVolumeSource + map: + fields: + - name: endpoints + type: + scalar: string + default: "" + - name: endpointsNamespace + type: + scalar: string + - name: path + type: + scalar: string + default: "" + - name: readOnly + type: + scalar: boolean +- name: io.k8s.api.core.v1.GlusterfsVolumeSource + map: + fields: + - name: endpoints + type: + scalar: string + default: "" + - name: path + type: + scalar: string + default: "" + - name: readOnly + type: + scalar: boolean +- name: io.k8s.api.core.v1.HTTPGetAction + map: + fields: + - name: host + type: + scalar: string + - name: httpHeaders + type: + list: + elementType: + namedType: io.k8s.api.core.v1.HTTPHeader + elementRelationship: atomic + - name: path + type: + scalar: string + - name: port + type: + namedType: io.k8s.apimachinery.pkg.util.intstr.IntOrString + default: {} + - name: scheme + type: + scalar: string +- name: io.k8s.api.core.v1.HTTPHeader + map: + fields: + - name: name + type: + scalar: string + default: "" + - name: value + type: + scalar: string + default: "" +- name: io.k8s.api.core.v1.Handler + map: + fields: + - name: exec + type: + namedType: io.k8s.api.core.v1.ExecAction + - name: httpGet + type: + namedType: io.k8s.api.core.v1.HTTPGetAction + - name: tcpSocket + type: + namedType: io.k8s.api.core.v1.TCPSocketAction +- name: io.k8s.api.core.v1.HostAlias + map: + fields: + - name: hostnames + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: ip + type: + scalar: string +- name: io.k8s.api.core.v1.HostPathVolumeSource + map: + fields: + - name: path + type: + scalar: string + default: "" + - name: type + type: + scalar: string +- name: io.k8s.api.core.v1.ISCSIPersistentVolumeSource + map: + fields: + - name: chapAuthDiscovery + type: + scalar: boolean + - name: chapAuthSession + type: + scalar: boolean + - name: fsType + type: + scalar: string + - name: initiatorName + type: + scalar: string + - name: iqn + type: + scalar: string + default: "" + - name: iscsiInterface + type: + scalar: string + - name: lun + type: + scalar: numeric + default: 0 + - name: portals + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: readOnly + type: + scalar: boolean + - name: secretRef + type: + namedType: io.k8s.api.core.v1.SecretReference + - name: targetPortal + type: + scalar: string + default: "" +- name: io.k8s.api.core.v1.ISCSIVolumeSource + map: + fields: + - name: chapAuthDiscovery + type: + scalar: boolean + - name: chapAuthSession + type: + scalar: boolean + - name: fsType + type: + scalar: string + - name: initiatorName + type: + scalar: string + - name: iqn + type: + scalar: string + default: "" + - name: iscsiInterface + type: + scalar: string + - name: lun + type: + scalar: numeric + default: 0 + - name: portals + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: readOnly + type: + scalar: boolean + - name: secretRef + type: + namedType: io.k8s.api.core.v1.LocalObjectReference + - name: targetPortal + type: + scalar: string + default: "" +- name: io.k8s.api.core.v1.KeyToPath + map: + fields: + - name: key + type: + scalar: string + default: "" + - name: mode + type: + scalar: numeric + - name: path + type: + scalar: string + default: "" +- name: io.k8s.api.core.v1.Lifecycle + map: + fields: + - name: postStart + type: + namedType: io.k8s.api.core.v1.Handler + - name: preStop + type: + namedType: io.k8s.api.core.v1.Handler +- name: io.k8s.api.core.v1.LimitRange + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.core.v1.LimitRangeSpec + default: {} +- name: io.k8s.api.core.v1.LimitRangeItem + map: + fields: + - name: default + type: + map: + elementType: + namedType: io.k8s.apimachinery.pkg.api.resource.Quantity + - name: defaultRequest + type: + map: + elementType: + namedType: io.k8s.apimachinery.pkg.api.resource.Quantity + - name: max + type: + map: + elementType: + namedType: io.k8s.apimachinery.pkg.api.resource.Quantity + - name: maxLimitRequestRatio + type: + map: + elementType: + namedType: io.k8s.apimachinery.pkg.api.resource.Quantity + - name: min + type: + map: + elementType: + namedType: io.k8s.apimachinery.pkg.api.resource.Quantity + - name: type + type: + scalar: string + default: "" +- name: io.k8s.api.core.v1.LimitRangeSpec + map: + fields: + - name: limits + type: + list: + elementType: + namedType: io.k8s.api.core.v1.LimitRangeItem + elementRelationship: atomic +- name: io.k8s.api.core.v1.LoadBalancerIngress + map: + fields: + - name: hostname + type: + scalar: string + - name: ip + type: + scalar: string + - name: ports + type: + list: + elementType: + namedType: io.k8s.api.core.v1.PortStatus + elementRelationship: atomic +- name: io.k8s.api.core.v1.LoadBalancerStatus + map: + fields: + - name: ingress + type: + list: + elementType: + namedType: io.k8s.api.core.v1.LoadBalancerIngress + elementRelationship: atomic +- name: io.k8s.api.core.v1.LocalObjectReference + map: + fields: + - name: name + type: + scalar: string +- name: io.k8s.api.core.v1.LocalVolumeSource + map: + fields: + - name: fsType + type: + scalar: string + - name: path + type: + scalar: string + default: "" +- name: io.k8s.api.core.v1.NFSVolumeSource + map: + fields: + - name: path + type: + scalar: string + default: "" + - name: readOnly + type: + scalar: boolean + - name: server + type: + scalar: string + default: "" +- name: io.k8s.api.core.v1.Namespace + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.core.v1.NamespaceSpec + default: {} + - name: status + type: + namedType: io.k8s.api.core.v1.NamespaceStatus + default: {} +- name: io.k8s.api.core.v1.NamespaceCondition + map: + fields: + - name: lastTransitionTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} + - name: message + type: + scalar: string + - name: reason + type: + scalar: string + - name: status + type: + scalar: string + default: "" + - name: type + type: + scalar: string + default: "" +- name: io.k8s.api.core.v1.NamespaceSpec + map: + fields: + - name: finalizers + type: + list: + elementType: + scalar: string + elementRelationship: atomic +- name: io.k8s.api.core.v1.NamespaceStatus + map: + fields: + - name: conditions + type: + list: + elementType: + namedType: io.k8s.api.core.v1.NamespaceCondition + elementRelationship: associative + keys: + - type + - name: phase + type: + scalar: string +- name: io.k8s.api.core.v1.Node + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.core.v1.NodeSpec + default: {} + - name: status + type: + namedType: io.k8s.api.core.v1.NodeStatus + default: {} +- name: io.k8s.api.core.v1.NodeAddress + map: + fields: + - name: address + type: + scalar: string + default: "" + - name: type + type: + scalar: string + default: "" +- name: io.k8s.api.core.v1.NodeAffinity + map: + fields: + - name: preferredDuringSchedulingIgnoredDuringExecution + type: + list: + elementType: + namedType: io.k8s.api.core.v1.PreferredSchedulingTerm + elementRelationship: atomic + - name: requiredDuringSchedulingIgnoredDuringExecution + type: + namedType: io.k8s.api.core.v1.NodeSelector +- name: io.k8s.api.core.v1.NodeCondition + map: + fields: + - name: lastHeartbeatTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} + - name: lastTransitionTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} + - name: message + type: + scalar: string + - name: reason + type: + scalar: string + - name: status + type: + scalar: string + default: "" + - name: type + type: + scalar: string + default: "" +- name: io.k8s.api.core.v1.NodeConfigSource + map: + fields: + - name: configMap + type: + namedType: io.k8s.api.core.v1.ConfigMapNodeConfigSource +- name: io.k8s.api.core.v1.NodeConfigStatus + map: + fields: + - name: active + type: + namedType: io.k8s.api.core.v1.NodeConfigSource + - name: assigned + type: + namedType: io.k8s.api.core.v1.NodeConfigSource + - name: error + type: + scalar: string + - name: lastKnownGood + type: + namedType: io.k8s.api.core.v1.NodeConfigSource +- name: io.k8s.api.core.v1.NodeDaemonEndpoints + map: + fields: + - name: kubeletEndpoint + type: + namedType: io.k8s.api.core.v1.DaemonEndpoint + default: {} +- name: io.k8s.api.core.v1.NodeSelector + map: + fields: + - name: nodeSelectorTerms + type: + list: + elementType: + namedType: io.k8s.api.core.v1.NodeSelectorTerm + elementRelationship: atomic +- name: io.k8s.api.core.v1.NodeSelectorRequirement + map: + fields: + - name: key + type: + scalar: string + default: "" + - name: operator + type: + scalar: string + default: "" + - name: values + type: + list: + elementType: + scalar: string + elementRelationship: atomic +- name: io.k8s.api.core.v1.NodeSelectorTerm + map: + fields: + - name: matchExpressions + type: + list: + elementType: + namedType: io.k8s.api.core.v1.NodeSelectorRequirement + elementRelationship: atomic + - name: matchFields + type: + list: + elementType: + namedType: io.k8s.api.core.v1.NodeSelectorRequirement + elementRelationship: atomic +- name: io.k8s.api.core.v1.NodeSpec + map: + fields: + - name: configSource + type: + namedType: io.k8s.api.core.v1.NodeConfigSource + - name: externalID + type: + scalar: string + - name: podCIDR + type: + scalar: string + - name: podCIDRs + type: + list: + elementType: + scalar: string + elementRelationship: associative + - name: providerID + type: + scalar: string + - name: taints + type: + list: + elementType: + namedType: io.k8s.api.core.v1.Taint + elementRelationship: atomic + - name: unschedulable + type: + scalar: boolean +- name: io.k8s.api.core.v1.NodeStatus + map: + fields: + - name: addresses + type: + list: + elementType: + namedType: io.k8s.api.core.v1.NodeAddress + elementRelationship: associative + keys: + - type + - name: allocatable + type: + map: + elementType: + namedType: io.k8s.apimachinery.pkg.api.resource.Quantity + - name: capacity + type: + map: + elementType: + namedType: io.k8s.apimachinery.pkg.api.resource.Quantity + - name: conditions + type: + list: + elementType: + namedType: io.k8s.api.core.v1.NodeCondition + elementRelationship: associative + keys: + - type + - name: config + type: + namedType: io.k8s.api.core.v1.NodeConfigStatus + - name: daemonEndpoints + type: + namedType: io.k8s.api.core.v1.NodeDaemonEndpoints + default: {} + - name: images + type: + list: + elementType: + namedType: io.k8s.api.core.v1.ContainerImage + elementRelationship: atomic + - name: nodeInfo + type: + namedType: io.k8s.api.core.v1.NodeSystemInfo + default: {} + - name: phase + type: + scalar: string + - name: volumesAttached + type: + list: + elementType: + namedType: io.k8s.api.core.v1.AttachedVolume + elementRelationship: atomic + - name: volumesInUse + type: + list: + elementType: + scalar: string + elementRelationship: atomic +- name: io.k8s.api.core.v1.NodeSystemInfo + map: + fields: + - name: architecture + type: + scalar: string + default: "" + - name: bootID + type: + scalar: string + default: "" + - name: containerRuntimeVersion + type: + scalar: string + default: "" + - name: kernelVersion + type: + scalar: string + default: "" + - name: kubeProxyVersion + type: + scalar: string + default: "" + - name: kubeletVersion + type: + scalar: string + default: "" + - name: machineID + type: + scalar: string + default: "" + - name: operatingSystem + type: + scalar: string + default: "" + - name: osImage + type: + scalar: string + default: "" + - name: systemUUID + type: + scalar: string + default: "" +- name: io.k8s.api.core.v1.ObjectFieldSelector + map: + fields: + - name: apiVersion + type: + scalar: string + - name: fieldPath + type: + scalar: string + default: "" +- name: io.k8s.api.core.v1.ObjectReference + map: + fields: + - name: apiVersion + type: + scalar: string + - name: fieldPath + type: + scalar: string + - name: kind + type: + scalar: string + - name: name + type: + scalar: string + - name: namespace + type: + scalar: string + - name: resourceVersion + type: + scalar: string + - name: uid + type: + scalar: string +- name: io.k8s.api.core.v1.PersistentVolume + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.core.v1.PersistentVolumeSpec + default: {} + - name: status + type: + namedType: io.k8s.api.core.v1.PersistentVolumeStatus + default: {} +- name: io.k8s.api.core.v1.PersistentVolumeClaim + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.core.v1.PersistentVolumeClaimSpec + default: {} + - name: status + type: + namedType: io.k8s.api.core.v1.PersistentVolumeClaimStatus + default: {} +- name: io.k8s.api.core.v1.PersistentVolumeClaimCondition + map: + fields: + - name: lastProbeTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} + - name: lastTransitionTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} + - name: message + type: + scalar: string + - name: reason + type: + scalar: string + - name: status + type: + scalar: string + default: "" + - name: type + type: + scalar: string + default: "" +- name: io.k8s.api.core.v1.PersistentVolumeClaimSpec + map: + fields: + - name: accessModes + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: dataSource + type: + namedType: io.k8s.api.core.v1.TypedLocalObjectReference + - name: resources + type: + namedType: io.k8s.api.core.v1.ResourceRequirements + default: {} + - name: selector + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector + - name: storageClassName + type: + scalar: string + - name: volumeMode + type: + scalar: string + - name: volumeName + type: + scalar: string +- name: io.k8s.api.core.v1.PersistentVolumeClaimStatus + map: + fields: + - name: accessModes + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: capacity + type: + map: + elementType: + namedType: io.k8s.apimachinery.pkg.api.resource.Quantity + - name: conditions + type: + list: + elementType: + namedType: io.k8s.api.core.v1.PersistentVolumeClaimCondition + elementRelationship: associative + keys: + - type + - name: phase + type: + scalar: string +- name: io.k8s.api.core.v1.PersistentVolumeClaimTemplate + map: + fields: + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.core.v1.PersistentVolumeClaimSpec + default: {} +- name: io.k8s.api.core.v1.PersistentVolumeClaimVolumeSource + map: + fields: + - name: claimName + type: + scalar: string + default: "" + - name: readOnly + type: + scalar: boolean +- name: io.k8s.api.core.v1.PersistentVolumeSpec + map: + fields: + - name: accessModes + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: awsElasticBlockStore + type: + namedType: io.k8s.api.core.v1.AWSElasticBlockStoreVolumeSource + - name: azureDisk + type: + namedType: io.k8s.api.core.v1.AzureDiskVolumeSource + - name: azureFile + type: + namedType: io.k8s.api.core.v1.AzureFilePersistentVolumeSource + - name: capacity + type: + map: + elementType: + namedType: io.k8s.apimachinery.pkg.api.resource.Quantity + - name: cephfs + type: + namedType: io.k8s.api.core.v1.CephFSPersistentVolumeSource + - name: cinder + type: + namedType: io.k8s.api.core.v1.CinderPersistentVolumeSource + - name: claimRef + type: + namedType: io.k8s.api.core.v1.ObjectReference + - name: csi + type: + namedType: io.k8s.api.core.v1.CSIPersistentVolumeSource + - name: fc + type: + namedType: io.k8s.api.core.v1.FCVolumeSource + - name: flexVolume + type: + namedType: io.k8s.api.core.v1.FlexPersistentVolumeSource + - name: flocker + type: + namedType: io.k8s.api.core.v1.FlockerVolumeSource + - name: gcePersistentDisk + type: + namedType: io.k8s.api.core.v1.GCEPersistentDiskVolumeSource + - name: glusterfs + type: + namedType: io.k8s.api.core.v1.GlusterfsPersistentVolumeSource + - name: hostPath + type: + namedType: io.k8s.api.core.v1.HostPathVolumeSource + - name: iscsi + type: + namedType: io.k8s.api.core.v1.ISCSIPersistentVolumeSource + - name: local + type: + namedType: io.k8s.api.core.v1.LocalVolumeSource + - name: mountOptions + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: nfs + type: + namedType: io.k8s.api.core.v1.NFSVolumeSource + - name: nodeAffinity + type: + namedType: io.k8s.api.core.v1.VolumeNodeAffinity + - name: persistentVolumeReclaimPolicy + type: + scalar: string + - name: photonPersistentDisk + type: + namedType: io.k8s.api.core.v1.PhotonPersistentDiskVolumeSource + - name: portworxVolume + type: + namedType: io.k8s.api.core.v1.PortworxVolumeSource + - name: quobyte + type: + namedType: io.k8s.api.core.v1.QuobyteVolumeSource + - name: rbd + type: + namedType: io.k8s.api.core.v1.RBDPersistentVolumeSource + - name: scaleIO + type: + namedType: io.k8s.api.core.v1.ScaleIOPersistentVolumeSource + - name: storageClassName + type: + scalar: string + - name: storageos + type: + namedType: io.k8s.api.core.v1.StorageOSPersistentVolumeSource + - name: volumeMode + type: + scalar: string + - name: vsphereVolume + type: + namedType: io.k8s.api.core.v1.VsphereVirtualDiskVolumeSource +- name: io.k8s.api.core.v1.PersistentVolumeStatus + map: + fields: + - name: message + type: + scalar: string + - name: phase + type: + scalar: string + - name: reason + type: + scalar: string +- name: io.k8s.api.core.v1.PhotonPersistentDiskVolumeSource + map: + fields: + - name: fsType + type: + scalar: string + - name: pdID + type: + scalar: string + default: "" +- name: io.k8s.api.core.v1.Pod + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.core.v1.PodSpec + default: {} + - name: status + type: + namedType: io.k8s.api.core.v1.PodStatus + default: {} +- name: io.k8s.api.core.v1.PodAffinity + map: + fields: + - name: preferredDuringSchedulingIgnoredDuringExecution + type: + list: + elementType: + namedType: io.k8s.api.core.v1.WeightedPodAffinityTerm + elementRelationship: atomic + - name: requiredDuringSchedulingIgnoredDuringExecution + type: + list: + elementType: + namedType: io.k8s.api.core.v1.PodAffinityTerm + elementRelationship: atomic +- name: io.k8s.api.core.v1.PodAffinityTerm + map: + fields: + - name: labelSelector + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector + - name: namespaceSelector + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector + - name: namespaces + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: topologyKey + type: + scalar: string + default: "" +- name: io.k8s.api.core.v1.PodAntiAffinity + map: + fields: + - name: preferredDuringSchedulingIgnoredDuringExecution + type: + list: + elementType: + namedType: io.k8s.api.core.v1.WeightedPodAffinityTerm + elementRelationship: atomic + - name: requiredDuringSchedulingIgnoredDuringExecution + type: + list: + elementType: + namedType: io.k8s.api.core.v1.PodAffinityTerm + elementRelationship: atomic +- name: io.k8s.api.core.v1.PodCondition + map: + fields: + - name: lastProbeTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} + - name: lastTransitionTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} + - name: message + type: + scalar: string + - name: reason + type: + scalar: string + - name: status + type: + scalar: string + default: "" + - name: type + type: + scalar: string + default: "" +- name: io.k8s.api.core.v1.PodDNSConfig + map: + fields: + - name: nameservers + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: options + type: + list: + elementType: + namedType: io.k8s.api.core.v1.PodDNSConfigOption + elementRelationship: atomic + - name: searches + type: + list: + elementType: + scalar: string + elementRelationship: atomic +- name: io.k8s.api.core.v1.PodDNSConfigOption + map: + fields: + - name: name + type: + scalar: string + - name: value + type: + scalar: string +- name: io.k8s.api.core.v1.PodIP + map: + fields: + - name: ip + type: + scalar: string +- name: io.k8s.api.core.v1.PodReadinessGate + map: + fields: + - name: conditionType + type: + scalar: string + default: "" +- name: io.k8s.api.core.v1.PodSecurityContext + map: + fields: + - name: fsGroup + type: + scalar: numeric + - name: fsGroupChangePolicy + type: + scalar: string + - name: runAsGroup + type: + scalar: numeric + - name: runAsNonRoot + type: + scalar: boolean + - name: runAsUser + type: + scalar: numeric + - name: seLinuxOptions + type: + namedType: io.k8s.api.core.v1.SELinuxOptions + - name: seccompProfile + type: + namedType: io.k8s.api.core.v1.SeccompProfile + - name: supplementalGroups + type: + list: + elementType: + scalar: numeric + elementRelationship: atomic + - name: sysctls + type: + list: + elementType: + namedType: io.k8s.api.core.v1.Sysctl + elementRelationship: atomic + - name: windowsOptions + type: + namedType: io.k8s.api.core.v1.WindowsSecurityContextOptions +- name: io.k8s.api.core.v1.PodSpec + map: + fields: + - name: activeDeadlineSeconds + type: + scalar: numeric + - name: affinity + type: + namedType: io.k8s.api.core.v1.Affinity + - name: automountServiceAccountToken + type: + scalar: boolean + - name: containers + type: + list: + elementType: + namedType: io.k8s.api.core.v1.Container + elementRelationship: associative + keys: + - name + - name: dnsConfig + type: + namedType: io.k8s.api.core.v1.PodDNSConfig + - name: dnsPolicy + type: + scalar: string + - name: enableServiceLinks + type: + scalar: boolean + - name: ephemeralContainers + type: + list: + elementType: + namedType: io.k8s.api.core.v1.EphemeralContainer + elementRelationship: associative + keys: + - name + - name: hostAliases + type: + list: + elementType: + namedType: io.k8s.api.core.v1.HostAlias + elementRelationship: associative + keys: + - ip + - name: hostIPC + type: + scalar: boolean + - name: hostNetwork + type: + scalar: boolean + - name: hostPID + type: + scalar: boolean + - name: hostname + type: + scalar: string + - name: imagePullSecrets + type: + list: + elementType: + namedType: io.k8s.api.core.v1.LocalObjectReference + elementRelationship: associative + keys: + - name + - name: initContainers + type: + list: + elementType: + namedType: io.k8s.api.core.v1.Container + elementRelationship: associative + keys: + - name + - name: nodeName + type: + scalar: string + - name: nodeSelector + type: + map: + elementType: + scalar: string + - name: overhead + type: + map: + elementType: + namedType: io.k8s.apimachinery.pkg.api.resource.Quantity + - name: preemptionPolicy + type: + scalar: string + - name: priority + type: + scalar: numeric + - name: priorityClassName + type: + scalar: string + - name: readinessGates + type: + list: + elementType: + namedType: io.k8s.api.core.v1.PodReadinessGate + elementRelationship: atomic + - name: restartPolicy + type: + scalar: string + - name: runtimeClassName + type: + scalar: string + - name: schedulerName + type: + scalar: string + - name: securityContext + type: + namedType: io.k8s.api.core.v1.PodSecurityContext + - name: serviceAccount + type: + scalar: string + - name: serviceAccountName + type: + scalar: string + - name: setHostnameAsFQDN + type: + scalar: boolean + - name: shareProcessNamespace + type: + scalar: boolean + - name: subdomain + type: + scalar: string + - name: terminationGracePeriodSeconds + type: + scalar: numeric + - name: tolerations + type: + list: + elementType: + namedType: io.k8s.api.core.v1.Toleration + elementRelationship: atomic + - name: topologySpreadConstraints + type: + list: + elementType: + namedType: io.k8s.api.core.v1.TopologySpreadConstraint + elementRelationship: associative + keys: + - topologyKey + - whenUnsatisfiable + - name: volumes + type: + list: + elementType: + namedType: io.k8s.api.core.v1.Volume + elementRelationship: associative + keys: + - name +- name: io.k8s.api.core.v1.PodStatus + map: + fields: + - name: conditions + type: + list: + elementType: + namedType: io.k8s.api.core.v1.PodCondition + elementRelationship: associative + keys: + - type + - name: containerStatuses + type: + list: + elementType: + namedType: io.k8s.api.core.v1.ContainerStatus + elementRelationship: atomic + - name: ephemeralContainerStatuses + type: + list: + elementType: + namedType: io.k8s.api.core.v1.ContainerStatus + elementRelationship: atomic + - name: hostIP + type: + scalar: string + - name: initContainerStatuses + type: + list: + elementType: + namedType: io.k8s.api.core.v1.ContainerStatus + elementRelationship: atomic + - name: message + type: + scalar: string + - name: nominatedNodeName + type: + scalar: string + - name: phase + type: + scalar: string + - name: podIP + type: + scalar: string + - name: podIPs + type: + list: + elementType: + namedType: io.k8s.api.core.v1.PodIP + elementRelationship: associative + keys: + - ip + - name: qosClass + type: + scalar: string + - name: reason + type: + scalar: string + - name: startTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time +- name: io.k8s.api.core.v1.PodTemplate + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: template + type: + namedType: io.k8s.api.core.v1.PodTemplateSpec + default: {} +- name: io.k8s.api.core.v1.PodTemplateSpec + map: + fields: + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.core.v1.PodSpec + default: {} +- name: io.k8s.api.core.v1.PortStatus + map: + fields: + - name: error + type: + scalar: string + - name: port + type: + scalar: numeric + default: 0 + - name: protocol + type: + scalar: string + default: "" +- name: io.k8s.api.core.v1.PortworxVolumeSource + map: + fields: + - name: fsType + type: + scalar: string + - name: readOnly + type: + scalar: boolean + - name: volumeID + type: + scalar: string + default: "" +- name: io.k8s.api.core.v1.PreferredSchedulingTerm + map: + fields: + - name: preference + type: + namedType: io.k8s.api.core.v1.NodeSelectorTerm + default: {} + - name: weight + type: + scalar: numeric + default: 0 +- name: io.k8s.api.core.v1.Probe + map: + fields: + - name: exec + type: + namedType: io.k8s.api.core.v1.ExecAction + - name: failureThreshold + type: + scalar: numeric + - name: httpGet + type: + namedType: io.k8s.api.core.v1.HTTPGetAction + - name: initialDelaySeconds + type: + scalar: numeric + - name: periodSeconds + type: + scalar: numeric + - name: successThreshold + type: + scalar: numeric + - name: tcpSocket + type: + namedType: io.k8s.api.core.v1.TCPSocketAction + - name: terminationGracePeriodSeconds + type: + scalar: numeric + - name: timeoutSeconds + type: + scalar: numeric +- name: io.k8s.api.core.v1.ProjectedVolumeSource + map: + fields: + - name: defaultMode + type: + scalar: numeric + - name: sources + type: + list: + elementType: + namedType: io.k8s.api.core.v1.VolumeProjection + elementRelationship: atomic +- name: io.k8s.api.core.v1.QuobyteVolumeSource + map: + fields: + - name: group + type: + scalar: string + - name: readOnly + type: + scalar: boolean + - name: registry + type: + scalar: string + default: "" + - name: tenant + type: + scalar: string + - name: user + type: + scalar: string + - name: volume + type: + scalar: string + default: "" +- name: io.k8s.api.core.v1.RBDPersistentVolumeSource + map: + fields: + - name: fsType + type: + scalar: string + - name: image + type: + scalar: string + default: "" + - name: keyring + type: + scalar: string + - name: monitors + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: pool + type: + scalar: string + - name: readOnly + type: + scalar: boolean + - name: secretRef + type: + namedType: io.k8s.api.core.v1.SecretReference + - name: user + type: + scalar: string +- name: io.k8s.api.core.v1.RBDVolumeSource + map: + fields: + - name: fsType + type: + scalar: string + - name: image + type: + scalar: string + default: "" + - name: keyring + type: + scalar: string + - name: monitors + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: pool + type: + scalar: string + - name: readOnly + type: + scalar: boolean + - name: secretRef + type: + namedType: io.k8s.api.core.v1.LocalObjectReference + - name: user + type: + scalar: string +- name: io.k8s.api.core.v1.ReplicationController + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.core.v1.ReplicationControllerSpec + default: {} + - name: status + type: + namedType: io.k8s.api.core.v1.ReplicationControllerStatus + default: {} +- name: io.k8s.api.core.v1.ReplicationControllerCondition + map: + fields: + - name: lastTransitionTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} + - name: message + type: + scalar: string + - name: reason + type: + scalar: string + - name: status + type: + scalar: string + default: "" + - name: type + type: + scalar: string + default: "" +- name: io.k8s.api.core.v1.ReplicationControllerSpec + map: + fields: + - name: minReadySeconds + type: + scalar: numeric + - name: replicas + type: + scalar: numeric + - name: selector + type: + map: + elementType: + scalar: string + - name: template + type: + namedType: io.k8s.api.core.v1.PodTemplateSpec +- name: io.k8s.api.core.v1.ReplicationControllerStatus + map: + fields: + - name: availableReplicas + type: + scalar: numeric + - name: conditions + type: + list: + elementType: + namedType: io.k8s.api.core.v1.ReplicationControllerCondition + elementRelationship: associative + keys: + - type + - name: fullyLabeledReplicas + type: + scalar: numeric + - name: observedGeneration + type: + scalar: numeric + - name: readyReplicas + type: + scalar: numeric + - name: replicas + type: + scalar: numeric + default: 0 +- name: io.k8s.api.core.v1.ResourceFieldSelector + map: + fields: + - name: containerName + type: + scalar: string + - name: divisor + type: + namedType: io.k8s.apimachinery.pkg.api.resource.Quantity + default: {} + - name: resource + type: + scalar: string + default: "" +- name: io.k8s.api.core.v1.ResourceQuota + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.core.v1.ResourceQuotaSpec + default: {} + - name: status + type: + namedType: io.k8s.api.core.v1.ResourceQuotaStatus + default: {} +- name: io.k8s.api.core.v1.ResourceQuotaSpec + map: + fields: + - name: hard + type: + map: + elementType: + namedType: io.k8s.apimachinery.pkg.api.resource.Quantity + - name: scopeSelector + type: + namedType: io.k8s.api.core.v1.ScopeSelector + - name: scopes + type: + list: + elementType: + scalar: string + elementRelationship: atomic +- name: io.k8s.api.core.v1.ResourceQuotaStatus + map: + fields: + - name: hard + type: + map: + elementType: + namedType: io.k8s.apimachinery.pkg.api.resource.Quantity + - name: used + type: + map: + elementType: + namedType: io.k8s.apimachinery.pkg.api.resource.Quantity +- name: io.k8s.api.core.v1.ResourceRequirements + map: + fields: + - name: limits + type: + map: + elementType: + namedType: io.k8s.apimachinery.pkg.api.resource.Quantity + - name: requests + type: + map: + elementType: + namedType: io.k8s.apimachinery.pkg.api.resource.Quantity +- name: io.k8s.api.core.v1.SELinuxOptions + map: + fields: + - name: level + type: + scalar: string + - name: role + type: + scalar: string + - name: type + type: + scalar: string + - name: user + type: + scalar: string +- name: io.k8s.api.core.v1.ScaleIOPersistentVolumeSource + map: + fields: + - name: fsType + type: + scalar: string + - name: gateway + type: + scalar: string + default: "" + - name: protectionDomain + type: + scalar: string + - name: readOnly + type: + scalar: boolean + - name: secretRef + type: + namedType: io.k8s.api.core.v1.SecretReference + - name: sslEnabled + type: + scalar: boolean + - name: storageMode + type: + scalar: string + - name: storagePool + type: + scalar: string + - name: system + type: + scalar: string + default: "" + - name: volumeName + type: + scalar: string +- name: io.k8s.api.core.v1.ScaleIOVolumeSource + map: + fields: + - name: fsType + type: + scalar: string + - name: gateway + type: + scalar: string + default: "" + - name: protectionDomain + type: + scalar: string + - name: readOnly + type: + scalar: boolean + - name: secretRef + type: + namedType: io.k8s.api.core.v1.LocalObjectReference + - name: sslEnabled + type: + scalar: boolean + - name: storageMode + type: + scalar: string + - name: storagePool + type: + scalar: string + - name: system + type: + scalar: string + default: "" + - name: volumeName + type: + scalar: string +- name: io.k8s.api.core.v1.ScopeSelector + map: + fields: + - name: matchExpressions + type: + list: + elementType: + namedType: io.k8s.api.core.v1.ScopedResourceSelectorRequirement + elementRelationship: atomic +- name: io.k8s.api.core.v1.ScopedResourceSelectorRequirement + map: + fields: + - name: operator + type: + scalar: string + default: "" + - name: scopeName + type: + scalar: string + default: "" + - name: values + type: + list: + elementType: + scalar: string + elementRelationship: atomic +- name: io.k8s.api.core.v1.SeccompProfile + map: + fields: + - name: localhostProfile + type: + scalar: string + - name: type + type: + scalar: string + default: "" + unions: + - discriminator: type + fields: + - fieldName: localhostProfile + discriminatorValue: LocalhostProfile +- name: io.k8s.api.core.v1.Secret + map: + fields: + - name: apiVersion + type: + scalar: string + - name: data + type: + map: + elementType: + scalar: string + - name: immutable + type: + scalar: boolean + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: stringData + type: + map: + elementType: + scalar: string + - name: type + type: + scalar: string +- name: io.k8s.api.core.v1.SecretEnvSource + map: + fields: + - name: name + type: + scalar: string + - name: optional + type: + scalar: boolean +- name: io.k8s.api.core.v1.SecretKeySelector + map: + fields: + - name: key + type: + scalar: string + default: "" + - name: name + type: + scalar: string + - name: optional + type: + scalar: boolean +- name: io.k8s.api.core.v1.SecretProjection + map: + fields: + - name: items + type: + list: + elementType: + namedType: io.k8s.api.core.v1.KeyToPath + elementRelationship: atomic + - name: name + type: + scalar: string + - name: optional + type: + scalar: boolean +- name: io.k8s.api.core.v1.SecretReference + map: + fields: + - name: name + type: + scalar: string + - name: namespace + type: + scalar: string +- name: io.k8s.api.core.v1.SecretVolumeSource + map: + fields: + - name: defaultMode + type: + scalar: numeric + - name: items + type: + list: + elementType: + namedType: io.k8s.api.core.v1.KeyToPath + elementRelationship: atomic + - name: optional + type: + scalar: boolean + - name: secretName + type: + scalar: string +- name: io.k8s.api.core.v1.SecurityContext + map: + fields: + - name: allowPrivilegeEscalation + type: + scalar: boolean + - name: capabilities + type: + namedType: io.k8s.api.core.v1.Capabilities + - name: privileged + type: + scalar: boolean + - name: procMount + type: + scalar: string + - name: readOnlyRootFilesystem + type: + scalar: boolean + - name: runAsGroup + type: + scalar: numeric + - name: runAsNonRoot + type: + scalar: boolean + - name: runAsUser + type: + scalar: numeric + - name: seLinuxOptions + type: + namedType: io.k8s.api.core.v1.SELinuxOptions + - name: seccompProfile + type: + namedType: io.k8s.api.core.v1.SeccompProfile + - name: windowsOptions + type: + namedType: io.k8s.api.core.v1.WindowsSecurityContextOptions +- name: io.k8s.api.core.v1.Service + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.core.v1.ServiceSpec + default: {} + - name: status + type: + namedType: io.k8s.api.core.v1.ServiceStatus + default: {} +- name: io.k8s.api.core.v1.ServiceAccount + map: + fields: + - name: apiVersion + type: + scalar: string + - name: automountServiceAccountToken + type: + scalar: boolean + - name: imagePullSecrets + type: + list: + elementType: + namedType: io.k8s.api.core.v1.LocalObjectReference + elementRelationship: atomic + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: secrets + type: + list: + elementType: + namedType: io.k8s.api.core.v1.ObjectReference + elementRelationship: associative + keys: + - name +- name: io.k8s.api.core.v1.ServiceAccountTokenProjection + map: + fields: + - name: audience + type: + scalar: string + - name: expirationSeconds + type: + scalar: numeric + - name: path + type: + scalar: string + default: "" +- name: io.k8s.api.core.v1.ServicePort + map: + fields: + - name: appProtocol + type: + scalar: string + - name: name + type: + scalar: string + - name: nodePort + type: + scalar: numeric + - name: port + type: + scalar: numeric + default: 0 + - name: protocol + type: + scalar: string + default: TCP + - name: targetPort + type: + namedType: io.k8s.apimachinery.pkg.util.intstr.IntOrString + default: {} +- name: io.k8s.api.core.v1.ServiceSpec + map: + fields: + - name: allocateLoadBalancerNodePorts + type: + scalar: boolean + - name: clusterIP + type: + scalar: string + - name: clusterIPs + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: externalIPs + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: externalName + type: + scalar: string + - name: externalTrafficPolicy + type: + scalar: string + - name: healthCheckNodePort + type: + scalar: numeric + - name: internalTrafficPolicy + type: + scalar: string + - name: ipFamilies + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: ipFamilyPolicy + type: + scalar: string + - name: loadBalancerClass + type: + scalar: string + - name: loadBalancerIP + type: + scalar: string + - name: loadBalancerSourceRanges + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: ports + type: + list: + elementType: + namedType: io.k8s.api.core.v1.ServicePort + elementRelationship: associative + keys: + - port + - protocol + - name: publishNotReadyAddresses + type: + scalar: boolean + - name: selector + type: + map: + elementType: + scalar: string + - name: sessionAffinity + type: + scalar: string + - name: sessionAffinityConfig + type: + namedType: io.k8s.api.core.v1.SessionAffinityConfig + - name: topologyKeys + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: type + type: + scalar: string +- name: io.k8s.api.core.v1.ServiceStatus + map: + fields: + - name: conditions + type: + list: + elementType: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Condition + elementRelationship: associative + keys: + - type + - name: loadBalancer + type: + namedType: io.k8s.api.core.v1.LoadBalancerStatus + default: {} +- name: io.k8s.api.core.v1.SessionAffinityConfig + map: + fields: + - name: clientIP + type: + namedType: io.k8s.api.core.v1.ClientIPConfig +- name: io.k8s.api.core.v1.StorageOSPersistentVolumeSource + map: + fields: + - name: fsType + type: + scalar: string + - name: readOnly + type: + scalar: boolean + - name: secretRef + type: + namedType: io.k8s.api.core.v1.ObjectReference + - name: volumeName + type: + scalar: string + - name: volumeNamespace + type: + scalar: string +- name: io.k8s.api.core.v1.StorageOSVolumeSource + map: + fields: + - name: fsType + type: + scalar: string + - name: readOnly + type: + scalar: boolean + - name: secretRef + type: + namedType: io.k8s.api.core.v1.LocalObjectReference + - name: volumeName + type: + scalar: string + - name: volumeNamespace + type: + scalar: string +- name: io.k8s.api.core.v1.Sysctl + map: + fields: + - name: name + type: + scalar: string + default: "" + - name: value + type: + scalar: string + default: "" +- name: io.k8s.api.core.v1.TCPSocketAction + map: + fields: + - name: host + type: + scalar: string + - name: port + type: + namedType: io.k8s.apimachinery.pkg.util.intstr.IntOrString + default: {} +- name: io.k8s.api.core.v1.Taint + map: + fields: + - name: effect + type: + scalar: string + default: "" + - name: key + type: + scalar: string + default: "" + - name: timeAdded + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + - name: value + type: + scalar: string +- name: io.k8s.api.core.v1.Toleration + map: + fields: + - name: effect + type: + scalar: string + - name: key + type: + scalar: string + - name: operator + type: + scalar: string + - name: tolerationSeconds + type: + scalar: numeric + - name: value + type: + scalar: string +- name: io.k8s.api.core.v1.TopologySelectorLabelRequirement + map: + fields: + - name: key + type: + scalar: string + default: "" + - name: values + type: + list: + elementType: + scalar: string + elementRelationship: atomic +- name: io.k8s.api.core.v1.TopologySelectorTerm + map: + fields: + - name: matchLabelExpressions + type: + list: + elementType: + namedType: io.k8s.api.core.v1.TopologySelectorLabelRequirement + elementRelationship: atomic +- name: io.k8s.api.core.v1.TopologySpreadConstraint + map: + fields: + - name: labelSelector + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector + - name: maxSkew + type: + scalar: numeric + default: 0 + - name: topologyKey + type: + scalar: string + default: "" + - name: whenUnsatisfiable + type: + scalar: string + default: "" +- name: io.k8s.api.core.v1.TypedLocalObjectReference + map: + fields: + - name: apiGroup + type: + scalar: string + - name: kind + type: + scalar: string + default: "" + - name: name + type: + scalar: string + default: "" +- name: io.k8s.api.core.v1.Volume + map: + fields: + - name: awsElasticBlockStore + type: + namedType: io.k8s.api.core.v1.AWSElasticBlockStoreVolumeSource + - name: azureDisk + type: + namedType: io.k8s.api.core.v1.AzureDiskVolumeSource + - name: azureFile + type: + namedType: io.k8s.api.core.v1.AzureFileVolumeSource + - name: cephfs + type: + namedType: io.k8s.api.core.v1.CephFSVolumeSource + - name: cinder + type: + namedType: io.k8s.api.core.v1.CinderVolumeSource + - name: configMap + type: + namedType: io.k8s.api.core.v1.ConfigMapVolumeSource + - name: csi + type: + namedType: io.k8s.api.core.v1.CSIVolumeSource + - name: downwardAPI + type: + namedType: io.k8s.api.core.v1.DownwardAPIVolumeSource + - name: emptyDir + type: + namedType: io.k8s.api.core.v1.EmptyDirVolumeSource + - name: ephemeral + type: + namedType: io.k8s.api.core.v1.EphemeralVolumeSource + - name: fc + type: + namedType: io.k8s.api.core.v1.FCVolumeSource + - name: flexVolume + type: + namedType: io.k8s.api.core.v1.FlexVolumeSource + - name: flocker + type: + namedType: io.k8s.api.core.v1.FlockerVolumeSource + - name: gcePersistentDisk + type: + namedType: io.k8s.api.core.v1.GCEPersistentDiskVolumeSource + - name: gitRepo + type: + namedType: io.k8s.api.core.v1.GitRepoVolumeSource + - name: glusterfs + type: + namedType: io.k8s.api.core.v1.GlusterfsVolumeSource + - name: hostPath + type: + namedType: io.k8s.api.core.v1.HostPathVolumeSource + - name: iscsi + type: + namedType: io.k8s.api.core.v1.ISCSIVolumeSource + - name: name + type: + scalar: string + default: "" + - name: nfs + type: + namedType: io.k8s.api.core.v1.NFSVolumeSource + - name: persistentVolumeClaim + type: + namedType: io.k8s.api.core.v1.PersistentVolumeClaimVolumeSource + - name: photonPersistentDisk + type: + namedType: io.k8s.api.core.v1.PhotonPersistentDiskVolumeSource + - name: portworxVolume + type: + namedType: io.k8s.api.core.v1.PortworxVolumeSource + - name: projected + type: + namedType: io.k8s.api.core.v1.ProjectedVolumeSource + - name: quobyte + type: + namedType: io.k8s.api.core.v1.QuobyteVolumeSource + - name: rbd + type: + namedType: io.k8s.api.core.v1.RBDVolumeSource + - name: scaleIO + type: + namedType: io.k8s.api.core.v1.ScaleIOVolumeSource + - name: secret + type: + namedType: io.k8s.api.core.v1.SecretVolumeSource + - name: storageos + type: + namedType: io.k8s.api.core.v1.StorageOSVolumeSource + - name: vsphereVolume + type: + namedType: io.k8s.api.core.v1.VsphereVirtualDiskVolumeSource +- name: io.k8s.api.core.v1.VolumeDevice + map: + fields: + - name: devicePath + type: + scalar: string + default: "" + - name: name + type: + scalar: string + default: "" +- name: io.k8s.api.core.v1.VolumeMount + map: + fields: + - name: mountPath + type: + scalar: string + default: "" + - name: mountPropagation + type: + scalar: string + - name: name + type: + scalar: string + default: "" + - name: readOnly + type: + scalar: boolean + - name: subPath + type: + scalar: string + - name: subPathExpr + type: + scalar: string +- name: io.k8s.api.core.v1.VolumeNodeAffinity + map: + fields: + - name: required + type: + namedType: io.k8s.api.core.v1.NodeSelector +- name: io.k8s.api.core.v1.VolumeProjection + map: + fields: + - name: configMap + type: + namedType: io.k8s.api.core.v1.ConfigMapProjection + - name: downwardAPI + type: + namedType: io.k8s.api.core.v1.DownwardAPIProjection + - name: secret + type: + namedType: io.k8s.api.core.v1.SecretProjection + - name: serviceAccountToken + type: + namedType: io.k8s.api.core.v1.ServiceAccountTokenProjection +- name: io.k8s.api.core.v1.VsphereVirtualDiskVolumeSource + map: + fields: + - name: fsType + type: + scalar: string + - name: storagePolicyID + type: + scalar: string + - name: storagePolicyName + type: + scalar: string + - name: volumePath + type: + scalar: string + default: "" +- name: io.k8s.api.core.v1.WeightedPodAffinityTerm + map: + fields: + - name: podAffinityTerm + type: + namedType: io.k8s.api.core.v1.PodAffinityTerm + default: {} + - name: weight + type: + scalar: numeric + default: 0 +- name: io.k8s.api.core.v1.WindowsSecurityContextOptions + map: + fields: + - name: gmsaCredentialSpec + type: + scalar: string + - name: gmsaCredentialSpecName + type: + scalar: string + - name: runAsUserName + type: + scalar: string +- name: io.k8s.api.discovery.v1.Endpoint + map: + fields: + - name: addresses + type: + list: + elementType: + scalar: string + elementRelationship: associative + - name: conditions + type: + namedType: io.k8s.api.discovery.v1.EndpointConditions + default: {} + - name: deprecatedTopology + type: + map: + elementType: + scalar: string + - name: hints + type: + namedType: io.k8s.api.discovery.v1.EndpointHints + - name: hostname + type: + scalar: string + - name: nodeName + type: + scalar: string + - name: targetRef + type: + namedType: io.k8s.api.core.v1.ObjectReference + - name: zone + type: + scalar: string +- name: io.k8s.api.discovery.v1.EndpointConditions + map: + fields: + - name: ready + type: + scalar: boolean + - name: serving + type: + scalar: boolean + - name: terminating + type: + scalar: boolean +- name: io.k8s.api.discovery.v1.EndpointHints + map: + fields: + - name: forZones + type: + list: + elementType: + namedType: io.k8s.api.discovery.v1.ForZone + elementRelationship: atomic +- name: io.k8s.api.discovery.v1.EndpointPort + map: + fields: + - name: appProtocol + type: + scalar: string + - name: name + type: + scalar: string + - name: port + type: + scalar: numeric + - name: protocol + type: + scalar: string +- name: io.k8s.api.discovery.v1.EndpointSlice + map: + fields: + - name: addressType + type: + scalar: string + default: "" + - name: apiVersion + type: + scalar: string + - name: endpoints + type: + list: + elementType: + namedType: io.k8s.api.discovery.v1.Endpoint + elementRelationship: atomic + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: ports + type: + list: + elementType: + namedType: io.k8s.api.discovery.v1.EndpointPort + elementRelationship: atomic +- name: io.k8s.api.discovery.v1.ForZone + map: + fields: + - name: name + type: + scalar: string + default: "" +- name: io.k8s.api.discovery.v1beta1.Endpoint + map: + fields: + - name: addresses + type: + list: + elementType: + scalar: string + elementRelationship: associative + - name: conditions + type: + namedType: io.k8s.api.discovery.v1beta1.EndpointConditions + default: {} + - name: hints + type: + namedType: io.k8s.api.discovery.v1beta1.EndpointHints + - name: hostname + type: + scalar: string + - name: nodeName + type: + scalar: string + - name: targetRef + type: + namedType: io.k8s.api.core.v1.ObjectReference + - name: topology + type: + map: + elementType: + scalar: string +- name: io.k8s.api.discovery.v1beta1.EndpointConditions + map: + fields: + - name: ready + type: + scalar: boolean + - name: serving + type: + scalar: boolean + - name: terminating + type: + scalar: boolean +- name: io.k8s.api.discovery.v1beta1.EndpointHints + map: + fields: + - name: forZones + type: + list: + elementType: + namedType: io.k8s.api.discovery.v1beta1.ForZone + elementRelationship: atomic +- name: io.k8s.api.discovery.v1beta1.EndpointPort + map: + fields: + - name: appProtocol + type: + scalar: string + - name: name + type: + scalar: string + - name: port + type: + scalar: numeric + - name: protocol + type: + scalar: string +- name: io.k8s.api.discovery.v1beta1.EndpointSlice + map: + fields: + - name: addressType + type: + scalar: string + default: "" + - name: apiVersion + type: + scalar: string + - name: endpoints + type: + list: + elementType: + namedType: io.k8s.api.discovery.v1beta1.Endpoint + elementRelationship: atomic + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: ports + type: + list: + elementType: + namedType: io.k8s.api.discovery.v1beta1.EndpointPort + elementRelationship: atomic +- name: io.k8s.api.discovery.v1beta1.ForZone + map: + fields: + - name: name + type: + scalar: string + default: "" +- name: io.k8s.api.events.v1.Event + map: + fields: + - name: action + type: + scalar: string + - name: apiVersion + type: + scalar: string + - name: deprecatedCount + type: + scalar: numeric + - name: deprecatedFirstTimestamp + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} + - name: deprecatedLastTimestamp + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} + - name: deprecatedSource + type: + namedType: io.k8s.api.core.v1.EventSource + default: {} + - name: eventTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.MicroTime + default: {} + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: note + type: + scalar: string + - name: reason + type: + scalar: string + - name: regarding + type: + namedType: io.k8s.api.core.v1.ObjectReference + default: {} + - name: related + type: + namedType: io.k8s.api.core.v1.ObjectReference + - name: reportingController + type: + scalar: string + - name: reportingInstance + type: + scalar: string + - name: series + type: + namedType: io.k8s.api.events.v1.EventSeries + - name: type + type: + scalar: string +- name: io.k8s.api.events.v1.EventSeries + map: + fields: + - name: count + type: + scalar: numeric + default: 0 + - name: lastObservedTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.MicroTime + default: {} +- name: io.k8s.api.events.v1beta1.Event + map: + fields: + - name: action + type: + scalar: string + - name: apiVersion + type: + scalar: string + - name: deprecatedCount + type: + scalar: numeric + - name: deprecatedFirstTimestamp + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} + - name: deprecatedLastTimestamp + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} + - name: deprecatedSource + type: + namedType: io.k8s.api.core.v1.EventSource + default: {} + - name: eventTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.MicroTime + default: {} + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: note + type: + scalar: string + - name: reason + type: + scalar: string + - name: regarding + type: + namedType: io.k8s.api.core.v1.ObjectReference + default: {} + - name: related + type: + namedType: io.k8s.api.core.v1.ObjectReference + - name: reportingController + type: + scalar: string + - name: reportingInstance + type: + scalar: string + - name: series + type: + namedType: io.k8s.api.events.v1beta1.EventSeries + - name: type + type: + scalar: string +- name: io.k8s.api.events.v1beta1.EventSeries + map: + fields: + - name: count + type: + scalar: numeric + default: 0 + - name: lastObservedTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.MicroTime + default: {} +- name: io.k8s.api.extensions.v1beta1.AllowedCSIDriver + map: + fields: + - name: name + type: + scalar: string + default: "" +- name: io.k8s.api.extensions.v1beta1.AllowedFlexVolume + map: + fields: + - name: driver + type: + scalar: string + default: "" +- name: io.k8s.api.extensions.v1beta1.AllowedHostPath + map: + fields: + - name: pathPrefix + type: + scalar: string + - name: readOnly + type: + scalar: boolean +- name: io.k8s.api.extensions.v1beta1.DaemonSet + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.extensions.v1beta1.DaemonSetSpec + default: {} + - name: status + type: + namedType: io.k8s.api.extensions.v1beta1.DaemonSetStatus + default: {} +- name: io.k8s.api.extensions.v1beta1.DaemonSetCondition + map: + fields: + - name: lastTransitionTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} + - name: message + type: + scalar: string + - name: reason + type: + scalar: string + - name: status + type: + scalar: string + default: "" + - name: type + type: + scalar: string + default: "" +- name: io.k8s.api.extensions.v1beta1.DaemonSetSpec + map: + fields: + - name: minReadySeconds + type: + scalar: numeric + - name: revisionHistoryLimit + type: + scalar: numeric + - name: selector + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector + - name: template + type: + namedType: io.k8s.api.core.v1.PodTemplateSpec + default: {} + - name: templateGeneration + type: + scalar: numeric + - name: updateStrategy + type: + namedType: io.k8s.api.extensions.v1beta1.DaemonSetUpdateStrategy + default: {} +- name: io.k8s.api.extensions.v1beta1.DaemonSetStatus + map: + fields: + - name: collisionCount + type: + scalar: numeric + - name: conditions + type: + list: + elementType: + namedType: io.k8s.api.extensions.v1beta1.DaemonSetCondition + elementRelationship: associative + keys: + - type + - name: currentNumberScheduled + type: + scalar: numeric + default: 0 + - name: desiredNumberScheduled + type: + scalar: numeric + default: 0 + - name: numberAvailable + type: + scalar: numeric + - name: numberMisscheduled + type: + scalar: numeric + default: 0 + - name: numberReady + type: + scalar: numeric + default: 0 + - name: numberUnavailable + type: + scalar: numeric + - name: observedGeneration + type: + scalar: numeric + - name: updatedNumberScheduled + type: + scalar: numeric +- name: io.k8s.api.extensions.v1beta1.DaemonSetUpdateStrategy + map: + fields: + - name: rollingUpdate + type: + namedType: io.k8s.api.extensions.v1beta1.RollingUpdateDaemonSet + - name: type + type: + scalar: string +- name: io.k8s.api.extensions.v1beta1.Deployment + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.extensions.v1beta1.DeploymentSpec + default: {} + - name: status + type: + namedType: io.k8s.api.extensions.v1beta1.DeploymentStatus + default: {} +- name: io.k8s.api.extensions.v1beta1.DeploymentCondition + map: + fields: + - name: lastTransitionTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} + - name: lastUpdateTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} + - name: message + type: + scalar: string + - name: reason + type: + scalar: string + - name: status + type: + scalar: string + default: "" + - name: type + type: + scalar: string + default: "" +- name: io.k8s.api.extensions.v1beta1.DeploymentSpec + map: + fields: + - name: minReadySeconds + type: + scalar: numeric + - name: paused + type: + scalar: boolean + - name: progressDeadlineSeconds + type: + scalar: numeric + - name: replicas + type: + scalar: numeric + - name: revisionHistoryLimit + type: + scalar: numeric + - name: rollbackTo + type: + namedType: io.k8s.api.extensions.v1beta1.RollbackConfig + - name: selector + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector + - name: strategy + type: + namedType: io.k8s.api.extensions.v1beta1.DeploymentStrategy + default: {} + - name: template + type: + namedType: io.k8s.api.core.v1.PodTemplateSpec + default: {} +- name: io.k8s.api.extensions.v1beta1.DeploymentStatus + map: + fields: + - name: availableReplicas + type: + scalar: numeric + - name: collisionCount + type: + scalar: numeric + - name: conditions + type: + list: + elementType: + namedType: io.k8s.api.extensions.v1beta1.DeploymentCondition + elementRelationship: associative + keys: + - type + - name: observedGeneration + type: + scalar: numeric + - name: readyReplicas + type: + scalar: numeric + - name: replicas + type: + scalar: numeric + - name: unavailableReplicas + type: + scalar: numeric + - name: updatedReplicas + type: + scalar: numeric +- name: io.k8s.api.extensions.v1beta1.DeploymentStrategy + map: + fields: + - name: rollingUpdate + type: + namedType: io.k8s.api.extensions.v1beta1.RollingUpdateDeployment + - name: type + type: + scalar: string +- name: io.k8s.api.extensions.v1beta1.FSGroupStrategyOptions + map: + fields: + - name: ranges + type: + list: + elementType: + namedType: io.k8s.api.extensions.v1beta1.IDRange + elementRelationship: atomic + - name: rule + type: + scalar: string +- name: io.k8s.api.extensions.v1beta1.HTTPIngressPath + map: + fields: + - name: backend + type: + namedType: io.k8s.api.extensions.v1beta1.IngressBackend + default: {} + - name: path + type: + scalar: string + - name: pathType + type: + scalar: string +- name: io.k8s.api.extensions.v1beta1.HTTPIngressRuleValue + map: + fields: + - name: paths + type: + list: + elementType: + namedType: io.k8s.api.extensions.v1beta1.HTTPIngressPath + elementRelationship: atomic +- name: io.k8s.api.extensions.v1beta1.HostPortRange + map: + fields: + - name: max + type: + scalar: numeric + default: 0 + - name: min + type: + scalar: numeric + default: 0 +- name: io.k8s.api.extensions.v1beta1.IDRange + map: + fields: + - name: max + type: + scalar: numeric + default: 0 + - name: min + type: + scalar: numeric + default: 0 +- name: io.k8s.api.extensions.v1beta1.IPBlock + map: + fields: + - name: cidr + type: + scalar: string + default: "" + - name: except + type: + list: + elementType: + scalar: string + elementRelationship: atomic +- name: io.k8s.api.extensions.v1beta1.Ingress + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.extensions.v1beta1.IngressSpec + default: {} + - name: status + type: + namedType: io.k8s.api.extensions.v1beta1.IngressStatus + default: {} +- name: io.k8s.api.extensions.v1beta1.IngressBackend + map: + fields: + - name: resource + type: + namedType: io.k8s.api.core.v1.TypedLocalObjectReference + - name: serviceName + type: + scalar: string + - name: servicePort + type: + namedType: io.k8s.apimachinery.pkg.util.intstr.IntOrString + default: {} +- name: io.k8s.api.extensions.v1beta1.IngressRule + map: + fields: + - name: host + type: + scalar: string + - name: http + type: + namedType: io.k8s.api.extensions.v1beta1.HTTPIngressRuleValue +- name: io.k8s.api.extensions.v1beta1.IngressSpec + map: + fields: + - name: backend + type: + namedType: io.k8s.api.extensions.v1beta1.IngressBackend + - name: ingressClassName + type: + scalar: string + - name: rules + type: + list: + elementType: + namedType: io.k8s.api.extensions.v1beta1.IngressRule + elementRelationship: atomic + - name: tls + type: + list: + elementType: + namedType: io.k8s.api.extensions.v1beta1.IngressTLS + elementRelationship: atomic +- name: io.k8s.api.extensions.v1beta1.IngressStatus + map: + fields: + - name: loadBalancer + type: + namedType: io.k8s.api.core.v1.LoadBalancerStatus + default: {} +- name: io.k8s.api.extensions.v1beta1.IngressTLS + map: + fields: + - name: hosts + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: secretName + type: + scalar: string +- name: io.k8s.api.extensions.v1beta1.NetworkPolicy + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.extensions.v1beta1.NetworkPolicySpec + default: {} +- name: io.k8s.api.extensions.v1beta1.NetworkPolicyEgressRule + map: + fields: + - name: ports + type: + list: + elementType: + namedType: io.k8s.api.extensions.v1beta1.NetworkPolicyPort + elementRelationship: atomic + - name: to + type: + list: + elementType: + namedType: io.k8s.api.extensions.v1beta1.NetworkPolicyPeer + elementRelationship: atomic +- name: io.k8s.api.extensions.v1beta1.NetworkPolicyIngressRule + map: + fields: + - name: from + type: + list: + elementType: + namedType: io.k8s.api.extensions.v1beta1.NetworkPolicyPeer + elementRelationship: atomic + - name: ports + type: + list: + elementType: + namedType: io.k8s.api.extensions.v1beta1.NetworkPolicyPort + elementRelationship: atomic +- name: io.k8s.api.extensions.v1beta1.NetworkPolicyPeer + map: + fields: + - name: ipBlock + type: + namedType: io.k8s.api.extensions.v1beta1.IPBlock + - name: namespaceSelector + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector + - name: podSelector + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector +- name: io.k8s.api.extensions.v1beta1.NetworkPolicyPort + map: + fields: + - name: endPort + type: + scalar: numeric + - name: port + type: + namedType: io.k8s.apimachinery.pkg.util.intstr.IntOrString + - name: protocol + type: + scalar: string +- name: io.k8s.api.extensions.v1beta1.NetworkPolicySpec + map: + fields: + - name: egress + type: + list: + elementType: + namedType: io.k8s.api.extensions.v1beta1.NetworkPolicyEgressRule + elementRelationship: atomic + - name: ingress + type: + list: + elementType: + namedType: io.k8s.api.extensions.v1beta1.NetworkPolicyIngressRule + elementRelationship: atomic + - name: podSelector + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector + default: {} + - name: policyTypes + type: + list: + elementType: + scalar: string + elementRelationship: atomic +- name: io.k8s.api.extensions.v1beta1.PodSecurityPolicy + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.extensions.v1beta1.PodSecurityPolicySpec + default: {} +- name: io.k8s.api.extensions.v1beta1.PodSecurityPolicySpec + map: + fields: + - name: allowPrivilegeEscalation + type: + scalar: boolean + - name: allowedCSIDrivers + type: + list: + elementType: + namedType: io.k8s.api.extensions.v1beta1.AllowedCSIDriver + elementRelationship: atomic + - name: allowedCapabilities + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: allowedFlexVolumes + type: + list: + elementType: + namedType: io.k8s.api.extensions.v1beta1.AllowedFlexVolume + elementRelationship: atomic + - name: allowedHostPaths + type: + list: + elementType: + namedType: io.k8s.api.extensions.v1beta1.AllowedHostPath + elementRelationship: atomic + - name: allowedProcMountTypes + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: allowedUnsafeSysctls + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: defaultAddCapabilities + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: defaultAllowPrivilegeEscalation + type: + scalar: boolean + - name: forbiddenSysctls + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: fsGroup + type: + namedType: io.k8s.api.extensions.v1beta1.FSGroupStrategyOptions + default: {} + - name: hostIPC + type: + scalar: boolean + - name: hostNetwork + type: + scalar: boolean + - name: hostPID + type: + scalar: boolean + - name: hostPorts + type: + list: + elementType: + namedType: io.k8s.api.extensions.v1beta1.HostPortRange + elementRelationship: atomic + - name: privileged + type: + scalar: boolean + - name: readOnlyRootFilesystem + type: + scalar: boolean + - name: requiredDropCapabilities + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: runAsGroup + type: + namedType: io.k8s.api.extensions.v1beta1.RunAsGroupStrategyOptions + - name: runAsUser + type: + namedType: io.k8s.api.extensions.v1beta1.RunAsUserStrategyOptions + default: {} + - name: runtimeClass + type: + namedType: io.k8s.api.extensions.v1beta1.RuntimeClassStrategyOptions + - name: seLinux + type: + namedType: io.k8s.api.extensions.v1beta1.SELinuxStrategyOptions + default: {} + - name: supplementalGroups + type: + namedType: io.k8s.api.extensions.v1beta1.SupplementalGroupsStrategyOptions + default: {} + - name: volumes + type: + list: + elementType: + scalar: string + elementRelationship: atomic +- name: io.k8s.api.extensions.v1beta1.ReplicaSet + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.extensions.v1beta1.ReplicaSetSpec + default: {} + - name: status + type: + namedType: io.k8s.api.extensions.v1beta1.ReplicaSetStatus + default: {} +- name: io.k8s.api.extensions.v1beta1.ReplicaSetCondition + map: + fields: + - name: lastTransitionTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} + - name: message + type: + scalar: string + - name: reason + type: + scalar: string + - name: status + type: + scalar: string + default: "" + - name: type + type: + scalar: string + default: "" +- name: io.k8s.api.extensions.v1beta1.ReplicaSetSpec + map: + fields: + - name: minReadySeconds + type: + scalar: numeric + - name: replicas + type: + scalar: numeric + - name: selector + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector + - name: template + type: + namedType: io.k8s.api.core.v1.PodTemplateSpec + default: {} +- name: io.k8s.api.extensions.v1beta1.ReplicaSetStatus + map: + fields: + - name: availableReplicas + type: + scalar: numeric + - name: conditions + type: + list: + elementType: + namedType: io.k8s.api.extensions.v1beta1.ReplicaSetCondition + elementRelationship: associative + keys: + - type + - name: fullyLabeledReplicas + type: + scalar: numeric + - name: observedGeneration + type: + scalar: numeric + - name: readyReplicas + type: + scalar: numeric + - name: replicas + type: + scalar: numeric + default: 0 +- name: io.k8s.api.extensions.v1beta1.RollbackConfig + map: + fields: + - name: revision + type: + scalar: numeric +- name: io.k8s.api.extensions.v1beta1.RollingUpdateDaemonSet + map: + fields: + - name: maxSurge + type: + namedType: io.k8s.apimachinery.pkg.util.intstr.IntOrString + - name: maxUnavailable + type: + namedType: io.k8s.apimachinery.pkg.util.intstr.IntOrString +- name: io.k8s.api.extensions.v1beta1.RollingUpdateDeployment + map: + fields: + - name: maxSurge + type: + namedType: io.k8s.apimachinery.pkg.util.intstr.IntOrString + - name: maxUnavailable + type: + namedType: io.k8s.apimachinery.pkg.util.intstr.IntOrString +- name: io.k8s.api.extensions.v1beta1.RunAsGroupStrategyOptions + map: + fields: + - name: ranges + type: + list: + elementType: + namedType: io.k8s.api.extensions.v1beta1.IDRange + elementRelationship: atomic + - name: rule + type: + scalar: string + default: "" +- name: io.k8s.api.extensions.v1beta1.RunAsUserStrategyOptions + map: + fields: + - name: ranges + type: + list: + elementType: + namedType: io.k8s.api.extensions.v1beta1.IDRange + elementRelationship: atomic + - name: rule + type: + scalar: string + default: "" +- name: io.k8s.api.extensions.v1beta1.RuntimeClassStrategyOptions + map: + fields: + - name: allowedRuntimeClassNames + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: defaultRuntimeClassName + type: + scalar: string +- name: io.k8s.api.extensions.v1beta1.SELinuxStrategyOptions + map: + fields: + - name: rule + type: + scalar: string + default: "" + - name: seLinuxOptions + type: + namedType: io.k8s.api.core.v1.SELinuxOptions +- name: io.k8s.api.extensions.v1beta1.SupplementalGroupsStrategyOptions + map: + fields: + - name: ranges + type: + list: + elementType: + namedType: io.k8s.api.extensions.v1beta1.IDRange + elementRelationship: atomic + - name: rule + type: + scalar: string +- name: io.k8s.api.flowcontrol.v1alpha1.FlowDistinguisherMethod + map: + fields: + - name: type + type: + scalar: string + default: "" +- name: io.k8s.api.flowcontrol.v1alpha1.FlowSchema + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.flowcontrol.v1alpha1.FlowSchemaSpec + default: {} + - name: status + type: + namedType: io.k8s.api.flowcontrol.v1alpha1.FlowSchemaStatus + default: {} +- name: io.k8s.api.flowcontrol.v1alpha1.FlowSchemaCondition + map: + fields: + - name: lastTransitionTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} + - name: message + type: + scalar: string + - name: reason + type: + scalar: string + - name: status + type: + scalar: string + - name: type + type: + scalar: string +- name: io.k8s.api.flowcontrol.v1alpha1.FlowSchemaSpec + map: + fields: + - name: distinguisherMethod + type: + namedType: io.k8s.api.flowcontrol.v1alpha1.FlowDistinguisherMethod + - name: matchingPrecedence + type: + scalar: numeric + default: 0 + - name: priorityLevelConfiguration + type: + namedType: io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfigurationReference + default: {} + - name: rules + type: + list: + elementType: + namedType: io.k8s.api.flowcontrol.v1alpha1.PolicyRulesWithSubjects + elementRelationship: atomic +- name: io.k8s.api.flowcontrol.v1alpha1.FlowSchemaStatus + map: + fields: + - name: conditions + type: + list: + elementType: + namedType: io.k8s.api.flowcontrol.v1alpha1.FlowSchemaCondition + elementRelationship: associative + keys: + - type +- name: io.k8s.api.flowcontrol.v1alpha1.GroupSubject + map: + fields: + - name: name + type: + scalar: string + default: "" +- name: io.k8s.api.flowcontrol.v1alpha1.LimitResponse + map: + fields: + - name: queuing + type: + namedType: io.k8s.api.flowcontrol.v1alpha1.QueuingConfiguration + - name: type + type: + scalar: string + default: "" + unions: + - discriminator: type + fields: + - fieldName: queuing + discriminatorValue: Queuing +- name: io.k8s.api.flowcontrol.v1alpha1.LimitedPriorityLevelConfiguration + map: + fields: + - name: assuredConcurrencyShares + type: + scalar: numeric + default: 0 + - name: limitResponse + type: + namedType: io.k8s.api.flowcontrol.v1alpha1.LimitResponse + default: {} +- name: io.k8s.api.flowcontrol.v1alpha1.NonResourcePolicyRule + map: + fields: + - name: nonResourceURLs + type: + list: + elementType: + scalar: string + elementRelationship: associative + - name: verbs + type: + list: + elementType: + scalar: string + elementRelationship: associative +- name: io.k8s.api.flowcontrol.v1alpha1.PolicyRulesWithSubjects + map: + fields: + - name: nonResourceRules + type: + list: + elementType: + namedType: io.k8s.api.flowcontrol.v1alpha1.NonResourcePolicyRule + elementRelationship: atomic + - name: resourceRules + type: + list: + elementType: + namedType: io.k8s.api.flowcontrol.v1alpha1.ResourcePolicyRule + elementRelationship: atomic + - name: subjects + type: + list: + elementType: + namedType: io.k8s.api.flowcontrol.v1alpha1.Subject + elementRelationship: atomic +- name: io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfiguration + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfigurationSpec + default: {} + - name: status + type: + namedType: io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfigurationStatus + default: {} +- name: io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfigurationCondition + map: + fields: + - name: lastTransitionTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} + - name: message + type: + scalar: string + - name: reason + type: + scalar: string + - name: status + type: + scalar: string + - name: type + type: + scalar: string +- name: io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfigurationReference + map: + fields: + - name: name + type: + scalar: string + default: "" +- name: io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfigurationSpec + map: + fields: + - name: limited + type: + namedType: io.k8s.api.flowcontrol.v1alpha1.LimitedPriorityLevelConfiguration + - name: type + type: + scalar: string + default: "" + unions: + - discriminator: type + fields: + - fieldName: limited + discriminatorValue: Limited +- name: io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfigurationStatus + map: + fields: + - name: conditions + type: + list: + elementType: + namedType: io.k8s.api.flowcontrol.v1alpha1.PriorityLevelConfigurationCondition + elementRelationship: associative + keys: + - type +- name: io.k8s.api.flowcontrol.v1alpha1.QueuingConfiguration + map: + fields: + - name: handSize + type: + scalar: numeric + default: 0 + - name: queueLengthLimit + type: + scalar: numeric + default: 0 + - name: queues + type: + scalar: numeric + default: 0 +- name: io.k8s.api.flowcontrol.v1alpha1.ResourcePolicyRule + map: + fields: + - name: apiGroups + type: + list: + elementType: + scalar: string + elementRelationship: associative + - name: clusterScope + type: + scalar: boolean + - name: namespaces + type: + list: + elementType: + scalar: string + elementRelationship: associative + - name: resources + type: + list: + elementType: + scalar: string + elementRelationship: associative + - name: verbs + type: + list: + elementType: + scalar: string + elementRelationship: associative +- name: io.k8s.api.flowcontrol.v1alpha1.ServiceAccountSubject + map: + fields: + - name: name + type: + scalar: string + default: "" + - name: namespace + type: + scalar: string + default: "" +- name: io.k8s.api.flowcontrol.v1alpha1.Subject + map: + fields: + - name: group + type: + namedType: io.k8s.api.flowcontrol.v1alpha1.GroupSubject + - name: kind + type: + scalar: string + default: "" + - name: serviceAccount + type: + namedType: io.k8s.api.flowcontrol.v1alpha1.ServiceAccountSubject + - name: user + type: + namedType: io.k8s.api.flowcontrol.v1alpha1.UserSubject + unions: + - discriminator: kind + fields: + - fieldName: group + discriminatorValue: Group + - fieldName: serviceAccount + discriminatorValue: ServiceAccount + - fieldName: user + discriminatorValue: User +- name: io.k8s.api.flowcontrol.v1alpha1.UserSubject + map: + fields: + - name: name + type: + scalar: string + default: "" +- name: io.k8s.api.flowcontrol.v1beta1.FlowDistinguisherMethod + map: + fields: + - name: type + type: + scalar: string + default: "" +- name: io.k8s.api.flowcontrol.v1beta1.FlowSchema + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.flowcontrol.v1beta1.FlowSchemaSpec + default: {} + - name: status + type: + namedType: io.k8s.api.flowcontrol.v1beta1.FlowSchemaStatus + default: {} +- name: io.k8s.api.flowcontrol.v1beta1.FlowSchemaCondition + map: + fields: + - name: lastTransitionTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} + - name: message + type: + scalar: string + - name: reason + type: + scalar: string + - name: status + type: + scalar: string + - name: type + type: + scalar: string +- name: io.k8s.api.flowcontrol.v1beta1.FlowSchemaSpec + map: + fields: + - name: distinguisherMethod + type: + namedType: io.k8s.api.flowcontrol.v1beta1.FlowDistinguisherMethod + - name: matchingPrecedence + type: + scalar: numeric + default: 0 + - name: priorityLevelConfiguration + type: + namedType: io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfigurationReference + default: {} + - name: rules + type: + list: + elementType: + namedType: io.k8s.api.flowcontrol.v1beta1.PolicyRulesWithSubjects + elementRelationship: atomic +- name: io.k8s.api.flowcontrol.v1beta1.FlowSchemaStatus + map: + fields: + - name: conditions + type: + list: + elementType: + namedType: io.k8s.api.flowcontrol.v1beta1.FlowSchemaCondition + elementRelationship: associative + keys: + - type +- name: io.k8s.api.flowcontrol.v1beta1.GroupSubject + map: + fields: + - name: name + type: + scalar: string + default: "" +- name: io.k8s.api.flowcontrol.v1beta1.LimitResponse + map: + fields: + - name: queuing + type: + namedType: io.k8s.api.flowcontrol.v1beta1.QueuingConfiguration + - name: type + type: + scalar: string + default: "" + unions: + - discriminator: type + fields: + - fieldName: queuing + discriminatorValue: Queuing +- name: io.k8s.api.flowcontrol.v1beta1.LimitedPriorityLevelConfiguration + map: + fields: + - name: assuredConcurrencyShares + type: + scalar: numeric + default: 0 + - name: limitResponse + type: + namedType: io.k8s.api.flowcontrol.v1beta1.LimitResponse + default: {} +- name: io.k8s.api.flowcontrol.v1beta1.NonResourcePolicyRule + map: + fields: + - name: nonResourceURLs + type: + list: + elementType: + scalar: string + elementRelationship: associative + - name: verbs + type: + list: + elementType: + scalar: string + elementRelationship: associative +- name: io.k8s.api.flowcontrol.v1beta1.PolicyRulesWithSubjects + map: + fields: + - name: nonResourceRules + type: + list: + elementType: + namedType: io.k8s.api.flowcontrol.v1beta1.NonResourcePolicyRule + elementRelationship: atomic + - name: resourceRules + type: + list: + elementType: + namedType: io.k8s.api.flowcontrol.v1beta1.ResourcePolicyRule + elementRelationship: atomic + - name: subjects + type: + list: + elementType: + namedType: io.k8s.api.flowcontrol.v1beta1.Subject + elementRelationship: atomic +- name: io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfiguration + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfigurationSpec + default: {} + - name: status + type: + namedType: io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfigurationStatus + default: {} +- name: io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfigurationCondition + map: + fields: + - name: lastTransitionTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} + - name: message + type: + scalar: string + - name: reason + type: + scalar: string + - name: status + type: + scalar: string + - name: type + type: + scalar: string +- name: io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfigurationReference + map: + fields: + - name: name + type: + scalar: string + default: "" +- name: io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfigurationSpec + map: + fields: + - name: limited + type: + namedType: io.k8s.api.flowcontrol.v1beta1.LimitedPriorityLevelConfiguration + - name: type + type: + scalar: string + default: "" + unions: + - discriminator: type + fields: + - fieldName: limited + discriminatorValue: Limited +- name: io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfigurationStatus + map: + fields: + - name: conditions + type: + list: + elementType: + namedType: io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfigurationCondition + elementRelationship: associative + keys: + - type +- name: io.k8s.api.flowcontrol.v1beta1.QueuingConfiguration + map: + fields: + - name: handSize + type: + scalar: numeric + default: 0 + - name: queueLengthLimit + type: + scalar: numeric + default: 0 + - name: queues + type: + scalar: numeric + default: 0 +- name: io.k8s.api.flowcontrol.v1beta1.ResourcePolicyRule + map: + fields: + - name: apiGroups + type: + list: + elementType: + scalar: string + elementRelationship: associative + - name: clusterScope + type: + scalar: boolean + - name: namespaces + type: + list: + elementType: + scalar: string + elementRelationship: associative + - name: resources + type: + list: + elementType: + scalar: string + elementRelationship: associative + - name: verbs + type: + list: + elementType: + scalar: string + elementRelationship: associative +- name: io.k8s.api.flowcontrol.v1beta1.ServiceAccountSubject + map: + fields: + - name: name + type: + scalar: string + default: "" + - name: namespace + type: + scalar: string + default: "" +- name: io.k8s.api.flowcontrol.v1beta1.Subject + map: + fields: + - name: group + type: + namedType: io.k8s.api.flowcontrol.v1beta1.GroupSubject + - name: kind + type: + scalar: string + default: "" + - name: serviceAccount + type: + namedType: io.k8s.api.flowcontrol.v1beta1.ServiceAccountSubject + - name: user + type: + namedType: io.k8s.api.flowcontrol.v1beta1.UserSubject + unions: + - discriminator: kind + fields: + - fieldName: group + discriminatorValue: Group + - fieldName: serviceAccount + discriminatorValue: ServiceAccount + - fieldName: user + discriminatorValue: User +- name: io.k8s.api.flowcontrol.v1beta1.UserSubject + map: + fields: + - name: name + type: + scalar: string + default: "" +- name: io.k8s.api.imagepolicy.v1alpha1.ImageReview + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.imagepolicy.v1alpha1.ImageReviewSpec + default: {} + - name: status + type: + namedType: io.k8s.api.imagepolicy.v1alpha1.ImageReviewStatus + default: {} +- name: io.k8s.api.imagepolicy.v1alpha1.ImageReviewContainerSpec + map: + fields: + - name: image + type: + scalar: string +- name: io.k8s.api.imagepolicy.v1alpha1.ImageReviewSpec + map: + fields: + - name: annotations + type: + map: + elementType: + scalar: string + - name: containers + type: + list: + elementType: + namedType: io.k8s.api.imagepolicy.v1alpha1.ImageReviewContainerSpec + elementRelationship: atomic + - name: namespace + type: + scalar: string +- name: io.k8s.api.imagepolicy.v1alpha1.ImageReviewStatus + map: + fields: + - name: allowed + type: + scalar: boolean + default: false + - name: auditAnnotations + type: + map: + elementType: + scalar: string + - name: reason + type: + scalar: string +- name: io.k8s.api.networking.v1.HTTPIngressPath + map: + fields: + - name: backend + type: + namedType: io.k8s.api.networking.v1.IngressBackend + default: {} + - name: path + type: + scalar: string + - name: pathType + type: + scalar: string +- name: io.k8s.api.networking.v1.HTTPIngressRuleValue + map: + fields: + - name: paths + type: + list: + elementType: + namedType: io.k8s.api.networking.v1.HTTPIngressPath + elementRelationship: atomic +- name: io.k8s.api.networking.v1.IPBlock + map: + fields: + - name: cidr + type: + scalar: string + default: "" + - name: except + type: + list: + elementType: + scalar: string + elementRelationship: atomic +- name: io.k8s.api.networking.v1.Ingress + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.networking.v1.IngressSpec + default: {} + - name: status + type: + namedType: io.k8s.api.networking.v1.IngressStatus + default: {} +- name: io.k8s.api.networking.v1.IngressBackend + map: + fields: + - name: resource + type: + namedType: io.k8s.api.core.v1.TypedLocalObjectReference + - name: service + type: + namedType: io.k8s.api.networking.v1.IngressServiceBackend +- name: io.k8s.api.networking.v1.IngressClass + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.networking.v1.IngressClassSpec + default: {} +- name: io.k8s.api.networking.v1.IngressClassParametersReference + map: + fields: + - name: apiGroup + type: + scalar: string + - name: kind + type: + scalar: string + default: "" + - name: name + type: + scalar: string + default: "" + - name: namespace + type: + scalar: string + - name: scope + type: + scalar: string +- name: io.k8s.api.networking.v1.IngressClassSpec + map: + fields: + - name: controller + type: + scalar: string + - name: parameters + type: + namedType: io.k8s.api.networking.v1.IngressClassParametersReference +- name: io.k8s.api.networking.v1.IngressRule + map: + fields: + - name: host + type: + scalar: string + - name: http + type: + namedType: io.k8s.api.networking.v1.HTTPIngressRuleValue +- name: io.k8s.api.networking.v1.IngressServiceBackend + map: + fields: + - name: name + type: + scalar: string + default: "" + - name: port + type: + namedType: io.k8s.api.networking.v1.ServiceBackendPort + default: {} +- name: io.k8s.api.networking.v1.IngressSpec + map: + fields: + - name: defaultBackend + type: + namedType: io.k8s.api.networking.v1.IngressBackend + - name: ingressClassName + type: + scalar: string + - name: rules + type: + list: + elementType: + namedType: io.k8s.api.networking.v1.IngressRule + elementRelationship: atomic + - name: tls + type: + list: + elementType: + namedType: io.k8s.api.networking.v1.IngressTLS + elementRelationship: atomic +- name: io.k8s.api.networking.v1.IngressStatus + map: + fields: + - name: loadBalancer + type: + namedType: io.k8s.api.core.v1.LoadBalancerStatus + default: {} +- name: io.k8s.api.networking.v1.IngressTLS + map: + fields: + - name: hosts + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: secretName + type: + scalar: string +- name: io.k8s.api.networking.v1.NetworkPolicy + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.networking.v1.NetworkPolicySpec + default: {} +- name: io.k8s.api.networking.v1.NetworkPolicyEgressRule + map: + fields: + - name: ports + type: + list: + elementType: + namedType: io.k8s.api.networking.v1.NetworkPolicyPort + elementRelationship: atomic + - name: to + type: + list: + elementType: + namedType: io.k8s.api.networking.v1.NetworkPolicyPeer + elementRelationship: atomic +- name: io.k8s.api.networking.v1.NetworkPolicyIngressRule + map: + fields: + - name: from + type: + list: + elementType: + namedType: io.k8s.api.networking.v1.NetworkPolicyPeer + elementRelationship: atomic + - name: ports + type: + list: + elementType: + namedType: io.k8s.api.networking.v1.NetworkPolicyPort + elementRelationship: atomic +- name: io.k8s.api.networking.v1.NetworkPolicyPeer + map: + fields: + - name: ipBlock + type: + namedType: io.k8s.api.networking.v1.IPBlock + - name: namespaceSelector + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector + - name: podSelector + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector +- name: io.k8s.api.networking.v1.NetworkPolicyPort + map: + fields: + - name: endPort + type: + scalar: numeric + - name: port + type: + namedType: io.k8s.apimachinery.pkg.util.intstr.IntOrString + - name: protocol + type: + scalar: string +- name: io.k8s.api.networking.v1.NetworkPolicySpec + map: + fields: + - name: egress + type: + list: + elementType: + namedType: io.k8s.api.networking.v1.NetworkPolicyEgressRule + elementRelationship: atomic + - name: ingress + type: + list: + elementType: + namedType: io.k8s.api.networking.v1.NetworkPolicyIngressRule + elementRelationship: atomic + - name: podSelector + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector + default: {} + - name: policyTypes + type: + list: + elementType: + scalar: string + elementRelationship: atomic +- name: io.k8s.api.networking.v1.ServiceBackendPort + map: + fields: + - name: name + type: + scalar: string + - name: number + type: + scalar: numeric +- name: io.k8s.api.networking.v1beta1.HTTPIngressPath + map: + fields: + - name: backend + type: + namedType: io.k8s.api.networking.v1beta1.IngressBackend + default: {} + - name: path + type: + scalar: string + - name: pathType + type: + scalar: string +- name: io.k8s.api.networking.v1beta1.HTTPIngressRuleValue + map: + fields: + - name: paths + type: + list: + elementType: + namedType: io.k8s.api.networking.v1beta1.HTTPIngressPath + elementRelationship: atomic +- name: io.k8s.api.networking.v1beta1.Ingress + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.networking.v1beta1.IngressSpec + default: {} + - name: status + type: + namedType: io.k8s.api.networking.v1beta1.IngressStatus + default: {} +- name: io.k8s.api.networking.v1beta1.IngressBackend + map: + fields: + - name: resource + type: + namedType: io.k8s.api.core.v1.TypedLocalObjectReference + - name: serviceName + type: + scalar: string + - name: servicePort + type: + namedType: io.k8s.apimachinery.pkg.util.intstr.IntOrString + default: {} +- name: io.k8s.api.networking.v1beta1.IngressClass + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.networking.v1beta1.IngressClassSpec + default: {} +- name: io.k8s.api.networking.v1beta1.IngressClassParametersReference + map: + fields: + - name: apiGroup + type: + scalar: string + - name: kind + type: + scalar: string + default: "" + - name: name + type: + scalar: string + default: "" + - name: namespace + type: + scalar: string + - name: scope + type: + scalar: string +- name: io.k8s.api.networking.v1beta1.IngressClassSpec + map: + fields: + - name: controller + type: + scalar: string + - name: parameters + type: + namedType: io.k8s.api.networking.v1beta1.IngressClassParametersReference +- name: io.k8s.api.networking.v1beta1.IngressRule + map: + fields: + - name: host + type: + scalar: string + - name: http + type: + namedType: io.k8s.api.networking.v1beta1.HTTPIngressRuleValue +- name: io.k8s.api.networking.v1beta1.IngressSpec + map: + fields: + - name: backend + type: + namedType: io.k8s.api.networking.v1beta1.IngressBackend + - name: ingressClassName + type: + scalar: string + - name: rules + type: + list: + elementType: + namedType: io.k8s.api.networking.v1beta1.IngressRule + elementRelationship: atomic + - name: tls + type: + list: + elementType: + namedType: io.k8s.api.networking.v1beta1.IngressTLS + elementRelationship: atomic +- name: io.k8s.api.networking.v1beta1.IngressStatus + map: + fields: + - name: loadBalancer + type: + namedType: io.k8s.api.core.v1.LoadBalancerStatus + default: {} +- name: io.k8s.api.networking.v1beta1.IngressTLS + map: + fields: + - name: hosts + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: secretName + type: + scalar: string +- name: io.k8s.api.node.v1.Overhead + map: + fields: + - name: podFixed + type: + map: + elementType: + namedType: io.k8s.apimachinery.pkg.api.resource.Quantity +- name: io.k8s.api.node.v1.RuntimeClass + map: + fields: + - name: apiVersion + type: + scalar: string + - name: handler + type: + scalar: string + default: "" + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: overhead + type: + namedType: io.k8s.api.node.v1.Overhead + - name: scheduling + type: + namedType: io.k8s.api.node.v1.Scheduling +- name: io.k8s.api.node.v1.Scheduling + map: + fields: + - name: nodeSelector + type: + map: + elementType: + scalar: string + - name: tolerations + type: + list: + elementType: + namedType: io.k8s.api.core.v1.Toleration + elementRelationship: atomic +- name: io.k8s.api.node.v1alpha1.Overhead + map: + fields: + - name: podFixed + type: + map: + elementType: + namedType: io.k8s.apimachinery.pkg.api.resource.Quantity +- name: io.k8s.api.node.v1alpha1.RuntimeClass + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.node.v1alpha1.RuntimeClassSpec + default: {} +- name: io.k8s.api.node.v1alpha1.RuntimeClassSpec + map: + fields: + - name: overhead + type: + namedType: io.k8s.api.node.v1alpha1.Overhead + - name: runtimeHandler + type: + scalar: string + default: "" + - name: scheduling + type: + namedType: io.k8s.api.node.v1alpha1.Scheduling +- name: io.k8s.api.node.v1alpha1.Scheduling + map: + fields: + - name: nodeSelector + type: + map: + elementType: + scalar: string + - name: tolerations + type: + list: + elementType: + namedType: io.k8s.api.core.v1.Toleration + elementRelationship: atomic +- name: io.k8s.api.node.v1beta1.Overhead + map: + fields: + - name: podFixed + type: + map: + elementType: + namedType: io.k8s.apimachinery.pkg.api.resource.Quantity +- name: io.k8s.api.node.v1beta1.RuntimeClass + map: + fields: + - name: apiVersion + type: + scalar: string + - name: handler + type: + scalar: string + default: "" + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: overhead + type: + namedType: io.k8s.api.node.v1beta1.Overhead + - name: scheduling + type: + namedType: io.k8s.api.node.v1beta1.Scheduling +- name: io.k8s.api.node.v1beta1.Scheduling + map: + fields: + - name: nodeSelector + type: + map: + elementType: + scalar: string + - name: tolerations + type: + list: + elementType: + namedType: io.k8s.api.core.v1.Toleration + elementRelationship: atomic +- name: io.k8s.api.policy.v1.PodDisruptionBudget + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.policy.v1.PodDisruptionBudgetSpec + default: {} + - name: status + type: + namedType: io.k8s.api.policy.v1.PodDisruptionBudgetStatus + default: {} +- name: io.k8s.api.policy.v1.PodDisruptionBudgetSpec + map: + fields: + - name: maxUnavailable + type: + namedType: io.k8s.apimachinery.pkg.util.intstr.IntOrString + - name: minAvailable + type: + namedType: io.k8s.apimachinery.pkg.util.intstr.IntOrString + - name: selector + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector +- name: io.k8s.api.policy.v1.PodDisruptionBudgetStatus + map: + fields: + - name: conditions + type: + list: + elementType: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Condition + elementRelationship: associative + keys: + - type + - name: currentHealthy + type: + scalar: numeric + default: 0 + - name: desiredHealthy + type: + scalar: numeric + default: 0 + - name: disruptedPods + type: + map: + elementType: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + - name: disruptionsAllowed + type: + scalar: numeric + default: 0 + - name: expectedPods + type: + scalar: numeric + default: 0 + - name: observedGeneration + type: + scalar: numeric +- name: io.k8s.api.policy.v1beta1.AllowedCSIDriver + map: + fields: + - name: name + type: + scalar: string + default: "" +- name: io.k8s.api.policy.v1beta1.AllowedFlexVolume + map: + fields: + - name: driver + type: + scalar: string + default: "" +- name: io.k8s.api.policy.v1beta1.AllowedHostPath + map: + fields: + - name: pathPrefix + type: + scalar: string + - name: readOnly + type: + scalar: boolean +- name: io.k8s.api.policy.v1beta1.Eviction + map: + fields: + - name: apiVersion + type: + scalar: string + - name: deleteOptions + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} +- name: io.k8s.api.policy.v1beta1.FSGroupStrategyOptions + map: + fields: + - name: ranges + type: + list: + elementType: + namedType: io.k8s.api.policy.v1beta1.IDRange + elementRelationship: atomic + - name: rule + type: + scalar: string +- name: io.k8s.api.policy.v1beta1.HostPortRange + map: + fields: + - name: max + type: + scalar: numeric + default: 0 + - name: min + type: + scalar: numeric + default: 0 +- name: io.k8s.api.policy.v1beta1.IDRange + map: + fields: + - name: max + type: + scalar: numeric + default: 0 + - name: min + type: + scalar: numeric + default: 0 +- name: io.k8s.api.policy.v1beta1.PodDisruptionBudget + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.policy.v1beta1.PodDisruptionBudgetSpec + default: {} + - name: status + type: + namedType: io.k8s.api.policy.v1beta1.PodDisruptionBudgetStatus + default: {} +- name: io.k8s.api.policy.v1beta1.PodDisruptionBudgetSpec + map: + fields: + - name: maxUnavailable + type: + namedType: io.k8s.apimachinery.pkg.util.intstr.IntOrString + - name: minAvailable + type: + namedType: io.k8s.apimachinery.pkg.util.intstr.IntOrString + - name: selector + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector +- name: io.k8s.api.policy.v1beta1.PodDisruptionBudgetStatus + map: + fields: + - name: conditions + type: + list: + elementType: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Condition + elementRelationship: associative + keys: + - type + - name: currentHealthy + type: + scalar: numeric + default: 0 + - name: desiredHealthy + type: + scalar: numeric + default: 0 + - name: disruptedPods + type: + map: + elementType: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + - name: disruptionsAllowed + type: + scalar: numeric + default: 0 + - name: expectedPods + type: + scalar: numeric + default: 0 + - name: observedGeneration + type: + scalar: numeric +- name: io.k8s.api.policy.v1beta1.PodSecurityPolicy + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.policy.v1beta1.PodSecurityPolicySpec + default: {} +- name: io.k8s.api.policy.v1beta1.PodSecurityPolicySpec + map: + fields: + - name: allowPrivilegeEscalation + type: + scalar: boolean + - name: allowedCSIDrivers + type: + list: + elementType: + namedType: io.k8s.api.policy.v1beta1.AllowedCSIDriver + elementRelationship: atomic + - name: allowedCapabilities + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: allowedFlexVolumes + type: + list: + elementType: + namedType: io.k8s.api.policy.v1beta1.AllowedFlexVolume + elementRelationship: atomic + - name: allowedHostPaths + type: + list: + elementType: + namedType: io.k8s.api.policy.v1beta1.AllowedHostPath + elementRelationship: atomic + - name: allowedProcMountTypes + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: allowedUnsafeSysctls + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: defaultAddCapabilities + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: defaultAllowPrivilegeEscalation + type: + scalar: boolean + - name: forbiddenSysctls + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: fsGroup + type: + namedType: io.k8s.api.policy.v1beta1.FSGroupStrategyOptions + default: {} + - name: hostIPC + type: + scalar: boolean + - name: hostNetwork + type: + scalar: boolean + - name: hostPID + type: + scalar: boolean + - name: hostPorts + type: + list: + elementType: + namedType: io.k8s.api.policy.v1beta1.HostPortRange + elementRelationship: atomic + - name: privileged + type: + scalar: boolean + - name: readOnlyRootFilesystem + type: + scalar: boolean + - name: requiredDropCapabilities + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: runAsGroup + type: + namedType: io.k8s.api.policy.v1beta1.RunAsGroupStrategyOptions + - name: runAsUser + type: + namedType: io.k8s.api.policy.v1beta1.RunAsUserStrategyOptions + default: {} + - name: runtimeClass + type: + namedType: io.k8s.api.policy.v1beta1.RuntimeClassStrategyOptions + - name: seLinux + type: + namedType: io.k8s.api.policy.v1beta1.SELinuxStrategyOptions + default: {} + - name: supplementalGroups + type: + namedType: io.k8s.api.policy.v1beta1.SupplementalGroupsStrategyOptions + default: {} + - name: volumes + type: + list: + elementType: + scalar: string + elementRelationship: atomic +- name: io.k8s.api.policy.v1beta1.RunAsGroupStrategyOptions + map: + fields: + - name: ranges + type: + list: + elementType: + namedType: io.k8s.api.policy.v1beta1.IDRange + elementRelationship: atomic + - name: rule + type: + scalar: string + default: "" +- name: io.k8s.api.policy.v1beta1.RunAsUserStrategyOptions + map: + fields: + - name: ranges + type: + list: + elementType: + namedType: io.k8s.api.policy.v1beta1.IDRange + elementRelationship: atomic + - name: rule + type: + scalar: string + default: "" +- name: io.k8s.api.policy.v1beta1.RuntimeClassStrategyOptions + map: + fields: + - name: allowedRuntimeClassNames + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: defaultRuntimeClassName + type: + scalar: string +- name: io.k8s.api.policy.v1beta1.SELinuxStrategyOptions + map: + fields: + - name: rule + type: + scalar: string + default: "" + - name: seLinuxOptions + type: + namedType: io.k8s.api.core.v1.SELinuxOptions +- name: io.k8s.api.policy.v1beta1.SupplementalGroupsStrategyOptions + map: + fields: + - name: ranges + type: + list: + elementType: + namedType: io.k8s.api.policy.v1beta1.IDRange + elementRelationship: atomic + - name: rule + type: + scalar: string +- name: io.k8s.api.rbac.v1.AggregationRule + map: + fields: + - name: clusterRoleSelectors + type: + list: + elementType: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector + elementRelationship: atomic +- name: io.k8s.api.rbac.v1.ClusterRole + map: + fields: + - name: aggregationRule + type: + namedType: io.k8s.api.rbac.v1.AggregationRule + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: rules + type: + list: + elementType: + namedType: io.k8s.api.rbac.v1.PolicyRule + elementRelationship: atomic +- name: io.k8s.api.rbac.v1.ClusterRoleBinding + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: roleRef + type: + namedType: io.k8s.api.rbac.v1.RoleRef + default: {} + - name: subjects + type: + list: + elementType: + namedType: io.k8s.api.rbac.v1.Subject + elementRelationship: atomic +- name: io.k8s.api.rbac.v1.PolicyRule + map: + fields: + - name: apiGroups + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: nonResourceURLs + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: resourceNames + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: resources + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: verbs + type: + list: + elementType: + scalar: string + elementRelationship: atomic +- name: io.k8s.api.rbac.v1.Role + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: rules + type: + list: + elementType: + namedType: io.k8s.api.rbac.v1.PolicyRule + elementRelationship: atomic +- name: io.k8s.api.rbac.v1.RoleBinding + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: roleRef + type: + namedType: io.k8s.api.rbac.v1.RoleRef + default: {} + - name: subjects + type: + list: + elementType: + namedType: io.k8s.api.rbac.v1.Subject + elementRelationship: atomic +- name: io.k8s.api.rbac.v1.RoleRef + map: + fields: + - name: apiGroup + type: + scalar: string + default: "" + - name: kind + type: + scalar: string + default: "" + - name: name + type: + scalar: string + default: "" +- name: io.k8s.api.rbac.v1.Subject + map: + fields: + - name: apiGroup + type: + scalar: string + - name: kind + type: + scalar: string + default: "" + - name: name + type: + scalar: string + default: "" + - name: namespace + type: + scalar: string +- name: io.k8s.api.rbac.v1alpha1.AggregationRule + map: + fields: + - name: clusterRoleSelectors + type: + list: + elementType: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector + elementRelationship: atomic +- name: io.k8s.api.rbac.v1alpha1.ClusterRole + map: + fields: + - name: aggregationRule + type: + namedType: io.k8s.api.rbac.v1alpha1.AggregationRule + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: rules + type: + list: + elementType: + namedType: io.k8s.api.rbac.v1alpha1.PolicyRule + elementRelationship: atomic +- name: io.k8s.api.rbac.v1alpha1.ClusterRoleBinding + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: roleRef + type: + namedType: io.k8s.api.rbac.v1alpha1.RoleRef + default: {} + - name: subjects + type: + list: + elementType: + namedType: io.k8s.api.rbac.v1alpha1.Subject + elementRelationship: atomic +- name: io.k8s.api.rbac.v1alpha1.PolicyRule + map: + fields: + - name: apiGroups + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: nonResourceURLs + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: resourceNames + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: resources + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: verbs + type: + list: + elementType: + scalar: string + elementRelationship: atomic +- name: io.k8s.api.rbac.v1alpha1.Role + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: rules + type: + list: + elementType: + namedType: io.k8s.api.rbac.v1alpha1.PolicyRule + elementRelationship: atomic +- name: io.k8s.api.rbac.v1alpha1.RoleBinding + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: roleRef + type: + namedType: io.k8s.api.rbac.v1alpha1.RoleRef + default: {} + - name: subjects + type: + list: + elementType: + namedType: io.k8s.api.rbac.v1alpha1.Subject + elementRelationship: atomic +- name: io.k8s.api.rbac.v1alpha1.RoleRef + map: + fields: + - name: apiGroup + type: + scalar: string + default: "" + - name: kind + type: + scalar: string + default: "" + - name: name + type: + scalar: string + default: "" +- name: io.k8s.api.rbac.v1alpha1.Subject + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + default: "" + - name: name + type: + scalar: string + default: "" + - name: namespace + type: + scalar: string +- name: io.k8s.api.rbac.v1beta1.AggregationRule + map: + fields: + - name: clusterRoleSelectors + type: + list: + elementType: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector + elementRelationship: atomic +- name: io.k8s.api.rbac.v1beta1.ClusterRole + map: + fields: + - name: aggregationRule + type: + namedType: io.k8s.api.rbac.v1beta1.AggregationRule + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: rules + type: + list: + elementType: + namedType: io.k8s.api.rbac.v1beta1.PolicyRule + elementRelationship: atomic +- name: io.k8s.api.rbac.v1beta1.ClusterRoleBinding + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: roleRef + type: + namedType: io.k8s.api.rbac.v1beta1.RoleRef + default: {} + - name: subjects + type: + list: + elementType: + namedType: io.k8s.api.rbac.v1beta1.Subject + elementRelationship: atomic +- name: io.k8s.api.rbac.v1beta1.PolicyRule + map: + fields: + - name: apiGroups + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: nonResourceURLs + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: resourceNames + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: resources + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: verbs + type: + list: + elementType: + scalar: string + elementRelationship: atomic +- name: io.k8s.api.rbac.v1beta1.Role + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: rules + type: + list: + elementType: + namedType: io.k8s.api.rbac.v1beta1.PolicyRule + elementRelationship: atomic +- name: io.k8s.api.rbac.v1beta1.RoleBinding + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: roleRef + type: + namedType: io.k8s.api.rbac.v1beta1.RoleRef + default: {} + - name: subjects + type: + list: + elementType: + namedType: io.k8s.api.rbac.v1beta1.Subject + elementRelationship: atomic +- name: io.k8s.api.rbac.v1beta1.RoleRef + map: + fields: + - name: apiGroup + type: + scalar: string + default: "" + - name: kind + type: + scalar: string + default: "" + - name: name + type: + scalar: string + default: "" +- name: io.k8s.api.rbac.v1beta1.Subject + map: + fields: + - name: apiGroup + type: + scalar: string + - name: kind + type: + scalar: string + default: "" + - name: name + type: + scalar: string + default: "" + - name: namespace + type: + scalar: string +- name: io.k8s.api.scheduling.v1.PriorityClass + map: + fields: + - name: apiVersion + type: + scalar: string + - name: description + type: + scalar: string + - name: globalDefault + type: + scalar: boolean + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: preemptionPolicy + type: + scalar: string + - name: value + type: + scalar: numeric + default: 0 +- name: io.k8s.api.scheduling.v1alpha1.PriorityClass + map: + fields: + - name: apiVersion + type: + scalar: string + - name: description + type: + scalar: string + - name: globalDefault + type: + scalar: boolean + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: preemptionPolicy + type: + scalar: string + - name: value + type: + scalar: numeric + default: 0 +- name: io.k8s.api.scheduling.v1beta1.PriorityClass + map: + fields: + - name: apiVersion + type: + scalar: string + - name: description + type: + scalar: string + - name: globalDefault + type: + scalar: boolean + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: preemptionPolicy + type: + scalar: string + - name: value + type: + scalar: numeric + default: 0 +- name: io.k8s.api.storage.v1.CSIDriver + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.storage.v1.CSIDriverSpec + default: {} +- name: io.k8s.api.storage.v1.CSIDriverSpec + map: + fields: + - name: attachRequired + type: + scalar: boolean + - name: fsGroupPolicy + type: + scalar: string + - name: podInfoOnMount + type: + scalar: boolean + - name: requiresRepublish + type: + scalar: boolean + - name: storageCapacity + type: + scalar: boolean + - name: tokenRequests + type: + list: + elementType: + namedType: io.k8s.api.storage.v1.TokenRequest + elementRelationship: atomic + - name: volumeLifecycleModes + type: + list: + elementType: + scalar: string + elementRelationship: associative +- name: io.k8s.api.storage.v1.CSINode + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.storage.v1.CSINodeSpec + default: {} +- name: io.k8s.api.storage.v1.CSINodeDriver + map: + fields: + - name: allocatable + type: + namedType: io.k8s.api.storage.v1.VolumeNodeResources + - name: name + type: + scalar: string + default: "" + - name: nodeID + type: + scalar: string + default: "" + - name: topologyKeys + type: + list: + elementType: + scalar: string + elementRelationship: atomic +- name: io.k8s.api.storage.v1.CSINodeSpec + map: + fields: + - name: drivers + type: + list: + elementType: + namedType: io.k8s.api.storage.v1.CSINodeDriver + elementRelationship: associative + keys: + - name +- name: io.k8s.api.storage.v1.StorageClass + map: + fields: + - name: allowVolumeExpansion + type: + scalar: boolean + - name: allowedTopologies + type: + list: + elementType: + namedType: io.k8s.api.core.v1.TopologySelectorTerm + elementRelationship: atomic + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: mountOptions + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: parameters + type: + map: + elementType: + scalar: string + - name: provisioner + type: + scalar: string + default: "" + - name: reclaimPolicy + type: + scalar: string + - name: volumeBindingMode + type: + scalar: string +- name: io.k8s.api.storage.v1.TokenRequest + map: + fields: + - name: audience + type: + scalar: string + default: "" + - name: expirationSeconds + type: + scalar: numeric +- name: io.k8s.api.storage.v1.VolumeAttachment + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.storage.v1.VolumeAttachmentSpec + default: {} + - name: status + type: + namedType: io.k8s.api.storage.v1.VolumeAttachmentStatus + default: {} +- name: io.k8s.api.storage.v1.VolumeAttachmentSource + map: + fields: + - name: inlineVolumeSpec + type: + namedType: io.k8s.api.core.v1.PersistentVolumeSpec + - name: persistentVolumeName + type: + scalar: string +- name: io.k8s.api.storage.v1.VolumeAttachmentSpec + map: + fields: + - name: attacher + type: + scalar: string + default: "" + - name: nodeName + type: + scalar: string + default: "" + - name: source + type: + namedType: io.k8s.api.storage.v1.VolumeAttachmentSource + default: {} +- name: io.k8s.api.storage.v1.VolumeAttachmentStatus + map: + fields: + - name: attachError + type: + namedType: io.k8s.api.storage.v1.VolumeError + - name: attached + type: + scalar: boolean + default: false + - name: attachmentMetadata + type: + map: + elementType: + scalar: string + - name: detachError + type: + namedType: io.k8s.api.storage.v1.VolumeError +- name: io.k8s.api.storage.v1.VolumeError + map: + fields: + - name: message + type: + scalar: string + - name: time + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} +- name: io.k8s.api.storage.v1.VolumeNodeResources + map: + fields: + - name: count + type: + scalar: numeric +- name: io.k8s.api.storage.v1alpha1.CSIStorageCapacity + map: + fields: + - name: apiVersion + type: + scalar: string + - name: capacity + type: + namedType: io.k8s.apimachinery.pkg.api.resource.Quantity + - name: kind + type: + scalar: string + - name: maximumVolumeSize + type: + namedType: io.k8s.apimachinery.pkg.api.resource.Quantity + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: nodeTopology + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector + - name: storageClassName + type: + scalar: string + default: "" +- name: io.k8s.api.storage.v1alpha1.VolumeAttachment + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.storage.v1alpha1.VolumeAttachmentSpec + default: {} + - name: status + type: + namedType: io.k8s.api.storage.v1alpha1.VolumeAttachmentStatus + default: {} +- name: io.k8s.api.storage.v1alpha1.VolumeAttachmentSource + map: + fields: + - name: inlineVolumeSpec + type: + namedType: io.k8s.api.core.v1.PersistentVolumeSpec + - name: persistentVolumeName + type: + scalar: string +- name: io.k8s.api.storage.v1alpha1.VolumeAttachmentSpec + map: + fields: + - name: attacher + type: + scalar: string + default: "" + - name: nodeName + type: + scalar: string + default: "" + - name: source + type: + namedType: io.k8s.api.storage.v1alpha1.VolumeAttachmentSource + default: {} +- name: io.k8s.api.storage.v1alpha1.VolumeAttachmentStatus + map: + fields: + - name: attachError + type: + namedType: io.k8s.api.storage.v1alpha1.VolumeError + - name: attached + type: + scalar: boolean + default: false + - name: attachmentMetadata + type: + map: + elementType: + scalar: string + - name: detachError + type: + namedType: io.k8s.api.storage.v1alpha1.VolumeError +- name: io.k8s.api.storage.v1alpha1.VolumeError + map: + fields: + - name: message + type: + scalar: string + - name: time + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} +- name: io.k8s.api.storage.v1beta1.CSIDriver + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.storage.v1beta1.CSIDriverSpec + default: {} +- name: io.k8s.api.storage.v1beta1.CSIDriverSpec + map: + fields: + - name: attachRequired + type: + scalar: boolean + - name: fsGroupPolicy + type: + scalar: string + - name: podInfoOnMount + type: + scalar: boolean + - name: requiresRepublish + type: + scalar: boolean + - name: storageCapacity + type: + scalar: boolean + - name: tokenRequests + type: + list: + elementType: + namedType: io.k8s.api.storage.v1beta1.TokenRequest + elementRelationship: atomic + - name: volumeLifecycleModes + type: + list: + elementType: + scalar: string + elementRelationship: atomic +- name: io.k8s.api.storage.v1beta1.CSINode + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.storage.v1beta1.CSINodeSpec + default: {} +- name: io.k8s.api.storage.v1beta1.CSINodeDriver + map: + fields: + - name: allocatable + type: + namedType: io.k8s.api.storage.v1beta1.VolumeNodeResources + - name: name + type: + scalar: string + default: "" + - name: nodeID + type: + scalar: string + default: "" + - name: topologyKeys + type: + list: + elementType: + scalar: string + elementRelationship: atomic +- name: io.k8s.api.storage.v1beta1.CSINodeSpec + map: + fields: + - name: drivers + type: + list: + elementType: + namedType: io.k8s.api.storage.v1beta1.CSINodeDriver + elementRelationship: associative + keys: + - name +- name: io.k8s.api.storage.v1beta1.CSIStorageCapacity + map: + fields: + - name: apiVersion + type: + scalar: string + - name: capacity + type: + namedType: io.k8s.apimachinery.pkg.api.resource.Quantity + - name: kind + type: + scalar: string + - name: maximumVolumeSize + type: + namedType: io.k8s.apimachinery.pkg.api.resource.Quantity + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: nodeTopology + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector + - name: storageClassName + type: + scalar: string + default: "" +- name: io.k8s.api.storage.v1beta1.StorageClass + map: + fields: + - name: allowVolumeExpansion + type: + scalar: boolean + - name: allowedTopologies + type: + list: + elementType: + namedType: io.k8s.api.core.v1.TopologySelectorTerm + elementRelationship: atomic + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: mountOptions + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: parameters + type: + map: + elementType: + scalar: string + - name: provisioner + type: + scalar: string + default: "" + - name: reclaimPolicy + type: + scalar: string + - name: volumeBindingMode + type: + scalar: string +- name: io.k8s.api.storage.v1beta1.TokenRequest + map: + fields: + - name: audience + type: + scalar: string + default: "" + - name: expirationSeconds + type: + scalar: numeric +- name: io.k8s.api.storage.v1beta1.VolumeAttachment + map: + fields: + - name: apiVersion + type: + scalar: string + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: spec + type: + namedType: io.k8s.api.storage.v1beta1.VolumeAttachmentSpec + default: {} + - name: status + type: + namedType: io.k8s.api.storage.v1beta1.VolumeAttachmentStatus + default: {} +- name: io.k8s.api.storage.v1beta1.VolumeAttachmentSource + map: + fields: + - name: inlineVolumeSpec + type: + namedType: io.k8s.api.core.v1.PersistentVolumeSpec + - name: persistentVolumeName + type: + scalar: string +- name: io.k8s.api.storage.v1beta1.VolumeAttachmentSpec + map: + fields: + - name: attacher + type: + scalar: string + default: "" + - name: nodeName + type: + scalar: string + default: "" + - name: source + type: + namedType: io.k8s.api.storage.v1beta1.VolumeAttachmentSource + default: {} +- name: io.k8s.api.storage.v1beta1.VolumeAttachmentStatus + map: + fields: + - name: attachError + type: + namedType: io.k8s.api.storage.v1beta1.VolumeError + - name: attached + type: + scalar: boolean + default: false + - name: attachmentMetadata + type: + map: + elementType: + scalar: string + - name: detachError + type: + namedType: io.k8s.api.storage.v1beta1.VolumeError +- name: io.k8s.api.storage.v1beta1.VolumeError + map: + fields: + - name: message + type: + scalar: string + - name: time + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} +- name: io.k8s.api.storage.v1beta1.VolumeNodeResources + map: + fields: + - name: count + type: + scalar: numeric +- name: io.k8s.apimachinery.pkg.api.resource.Quantity + scalar: untyped +- name: io.k8s.apimachinery.pkg.apis.meta.v1.Condition + map: + fields: + - name: lastTransitionTime + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} + - name: message + type: + scalar: string + default: "" + - name: observedGeneration + type: + scalar: numeric + - name: reason + type: + scalar: string + default: "" + - name: status + type: + scalar: string + default: "" + - name: type + type: + scalar: string + default: "" +- name: io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions + map: + fields: + - name: apiVersion + type: + scalar: string + - name: dryRun + type: + list: + elementType: + scalar: string + elementRelationship: atomic + - name: gracePeriodSeconds + type: + scalar: numeric + - name: kind + type: + scalar: string + - name: orphanDependents + type: + scalar: boolean + - name: preconditions + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Preconditions + - name: propagationPolicy + type: + scalar: string +- name: io.k8s.apimachinery.pkg.apis.meta.v1.FieldsV1 + map: + elementType: + scalar: untyped + list: + elementType: + namedType: __untyped_atomic_ + elementRelationship: atomic + map: + elementType: + namedType: __untyped_atomic_ + elementRelationship: atomic +- name: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector + map: + fields: + - name: matchExpressions + type: + list: + elementType: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelectorRequirement + elementRelationship: atomic + - name: matchLabels + type: + map: + elementType: + scalar: string + elementRelationship: atomic +- name: io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelectorRequirement + map: + fields: + - name: key + type: + scalar: string + default: "" + - name: operator + type: + scalar: string + default: "" + - name: values + type: + list: + elementType: + scalar: string + elementRelationship: atomic +- name: io.k8s.apimachinery.pkg.apis.meta.v1.ManagedFieldsEntry + map: + fields: + - name: apiVersion + type: + scalar: string + - name: fieldsType + type: + scalar: string + - name: fieldsV1 + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.FieldsV1 + - name: manager + type: + scalar: string + - name: operation + type: + scalar: string + - name: time + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time +- name: io.k8s.apimachinery.pkg.apis.meta.v1.MicroTime + scalar: untyped +- name: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + map: + fields: + - name: annotations + type: + map: + elementType: + scalar: string + - name: clusterName + type: + scalar: string + - name: creationTimestamp + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + default: {} + - name: deletionGracePeriodSeconds + type: + scalar: numeric + - name: deletionTimestamp + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.Time + - name: finalizers + type: + list: + elementType: + scalar: string + elementRelationship: associative + - name: generateName + type: + scalar: string + - name: generation + type: + scalar: numeric + - name: labels + type: + map: + elementType: + scalar: string + - name: managedFields + type: + list: + elementType: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ManagedFieldsEntry + elementRelationship: atomic + - name: name + type: + scalar: string + - name: namespace + type: + scalar: string + - name: ownerReferences + type: + list: + elementType: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.OwnerReference + elementRelationship: associative + keys: + - uid + - name: resourceVersion + type: + scalar: string + - name: selfLink + type: + scalar: string + - name: uid + type: + scalar: string +- name: io.k8s.apimachinery.pkg.apis.meta.v1.OwnerReference + map: + fields: + - name: apiVersion + type: + scalar: string + default: "" + - name: blockOwnerDeletion + type: + scalar: boolean + - name: controller + type: + scalar: boolean + - name: kind + type: + scalar: string + default: "" + - name: name + type: + scalar: string + default: "" + - name: uid + type: + scalar: string + default: "" +- name: io.k8s.apimachinery.pkg.apis.meta.v1.Preconditions + map: + fields: + - name: resourceVersion + type: + scalar: string + - name: uid + type: + scalar: string +- name: io.k8s.apimachinery.pkg.apis.meta.v1.Time + scalar: untyped +- name: io.k8s.apimachinery.pkg.runtime.RawExtension + map: + elementType: + scalar: untyped + list: + elementType: + namedType: __untyped_atomic_ + elementRelationship: atomic + map: + elementType: + namedType: __untyped_atomic_ + elementRelationship: atomic +- name: io.k8s.apimachinery.pkg.util.intstr.IntOrString + scalar: untyped +- name: __untyped_atomic_ + scalar: untyped + list: + elementType: + namedType: __untyped_atomic_ + elementRelationship: atomic + map: + elementType: + namedType: __untyped_atomic_ + elementRelationship: atomic +- name: __untyped_deduced_ + scalar: untyped + list: + elementType: + namedType: __untyped_atomic_ + elementRelationship: atomic + map: + elementType: + namedType: __untyped_deduced_ + elementRelationship: separable +`) diff --git a/vendor/k8s.io/client-go/applyconfigurations/meta/v1/condition.go b/vendor/k8s.io/client-go/applyconfigurations/meta/v1/condition.go new file mode 100644 index 000000000000..c84102cddecd --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/meta/v1/condition.go @@ -0,0 +1,88 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// ConditionApplyConfiguration represents an declarative configuration of the Condition type for use +// with apply. +type ConditionApplyConfiguration struct { + Type *string `json:"type,omitempty"` + Status *v1.ConditionStatus `json:"status,omitempty"` + ObservedGeneration *int64 `json:"observedGeneration,omitempty"` + LastTransitionTime *v1.Time `json:"lastTransitionTime,omitempty"` + Reason *string `json:"reason,omitempty"` + Message *string `json:"message,omitempty"` +} + +// ConditionApplyConfiguration constructs an declarative configuration of the Condition type for use with +// apply. +func Condition() *ConditionApplyConfiguration { + return &ConditionApplyConfiguration{} +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *ConditionApplyConfiguration) WithType(value string) *ConditionApplyConfiguration { + b.Type = &value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *ConditionApplyConfiguration) WithStatus(value v1.ConditionStatus) *ConditionApplyConfiguration { + b.Status = &value + return b +} + +// WithObservedGeneration sets the ObservedGeneration field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ObservedGeneration field is set to the value of the last call. +func (b *ConditionApplyConfiguration) WithObservedGeneration(value int64) *ConditionApplyConfiguration { + b.ObservedGeneration = &value + return b +} + +// WithLastTransitionTime sets the LastTransitionTime field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LastTransitionTime field is set to the value of the last call. +func (b *ConditionApplyConfiguration) WithLastTransitionTime(value v1.Time) *ConditionApplyConfiguration { + b.LastTransitionTime = &value + return b +} + +// WithReason sets the Reason field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Reason field is set to the value of the last call. +func (b *ConditionApplyConfiguration) WithReason(value string) *ConditionApplyConfiguration { + b.Reason = &value + return b +} + +// WithMessage sets the Message field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Message field is set to the value of the last call. +func (b *ConditionApplyConfiguration) WithMessage(value string) *ConditionApplyConfiguration { + b.Message = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/meta/v1/deleteoptions.go b/vendor/k8s.io/client-go/applyconfigurations/meta/v1/deleteoptions.go new file mode 100644 index 000000000000..289bef43de30 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/meta/v1/deleteoptions.go @@ -0,0 +1,98 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// DeleteOptionsApplyConfiguration represents an declarative configuration of the DeleteOptions type for use +// with apply. +type DeleteOptionsApplyConfiguration struct { + TypeMetaApplyConfiguration `json:",inline"` + GracePeriodSeconds *int64 `json:"gracePeriodSeconds,omitempty"` + Preconditions *PreconditionsApplyConfiguration `json:"preconditions,omitempty"` + OrphanDependents *bool `json:"orphanDependents,omitempty"` + PropagationPolicy *metav1.DeletionPropagation `json:"propagationPolicy,omitempty"` + DryRun []string `json:"dryRun,omitempty"` +} + +// DeleteOptionsApplyConfiguration constructs an declarative configuration of the DeleteOptions type for use with +// apply. +func DeleteOptions() *DeleteOptionsApplyConfiguration { + return &DeleteOptionsApplyConfiguration{} +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *DeleteOptionsApplyConfiguration) WithKind(value string) *DeleteOptionsApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *DeleteOptionsApplyConfiguration) WithAPIVersion(value string) *DeleteOptionsApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithGracePeriodSeconds sets the GracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GracePeriodSeconds field is set to the value of the last call. +func (b *DeleteOptionsApplyConfiguration) WithGracePeriodSeconds(value int64) *DeleteOptionsApplyConfiguration { + b.GracePeriodSeconds = &value + return b +} + +// WithPreconditions sets the Preconditions field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Preconditions field is set to the value of the last call. +func (b *DeleteOptionsApplyConfiguration) WithPreconditions(value *PreconditionsApplyConfiguration) *DeleteOptionsApplyConfiguration { + b.Preconditions = value + return b +} + +// WithOrphanDependents sets the OrphanDependents field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the OrphanDependents field is set to the value of the last call. +func (b *DeleteOptionsApplyConfiguration) WithOrphanDependents(value bool) *DeleteOptionsApplyConfiguration { + b.OrphanDependents = &value + return b +} + +// WithPropagationPolicy sets the PropagationPolicy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PropagationPolicy field is set to the value of the last call. +func (b *DeleteOptionsApplyConfiguration) WithPropagationPolicy(value metav1.DeletionPropagation) *DeleteOptionsApplyConfiguration { + b.PropagationPolicy = &value + return b +} + +// WithDryRun adds the given value to the DryRun field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the DryRun field. +func (b *DeleteOptionsApplyConfiguration) WithDryRun(values ...string) *DeleteOptionsApplyConfiguration { + for i := range values { + b.DryRun = append(b.DryRun, values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/meta/v1/labelselector.go b/vendor/k8s.io/client-go/applyconfigurations/meta/v1/labelselector.go new file mode 100644 index 000000000000..6d24bc363bfb --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/meta/v1/labelselector.go @@ -0,0 +1,59 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// LabelSelectorApplyConfiguration represents an declarative configuration of the LabelSelector type for use +// with apply. +type LabelSelectorApplyConfiguration struct { + MatchLabels map[string]string `json:"matchLabels,omitempty"` + MatchExpressions []LabelSelectorRequirementApplyConfiguration `json:"matchExpressions,omitempty"` +} + +// LabelSelectorApplyConfiguration constructs an declarative configuration of the LabelSelector type for use with +// apply. +func LabelSelector() *LabelSelectorApplyConfiguration { + return &LabelSelectorApplyConfiguration{} +} + +// WithMatchLabels puts the entries into the MatchLabels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the MatchLabels field, +// overwriting an existing map entries in MatchLabels field with the same key. +func (b *LabelSelectorApplyConfiguration) WithMatchLabels(entries map[string]string) *LabelSelectorApplyConfiguration { + if b.MatchLabels == nil && len(entries) > 0 { + b.MatchLabels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.MatchLabels[k] = v + } + return b +} + +// WithMatchExpressions adds the given value to the MatchExpressions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the MatchExpressions field. +func (b *LabelSelectorApplyConfiguration) WithMatchExpressions(values ...*LabelSelectorRequirementApplyConfiguration) *LabelSelectorApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithMatchExpressions") + } + b.MatchExpressions = append(b.MatchExpressions, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/meta/v1/labelselectorrequirement.go b/vendor/k8s.io/client-go/applyconfigurations/meta/v1/labelselectorrequirement.go new file mode 100644 index 000000000000..ff70f365e6f9 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/meta/v1/labelselectorrequirement.go @@ -0,0 +1,63 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// LabelSelectorRequirementApplyConfiguration represents an declarative configuration of the LabelSelectorRequirement type for use +// with apply. +type LabelSelectorRequirementApplyConfiguration struct { + Key *string `json:"key,omitempty"` + Operator *v1.LabelSelectorOperator `json:"operator,omitempty"` + Values []string `json:"values,omitempty"` +} + +// LabelSelectorRequirementApplyConfiguration constructs an declarative configuration of the LabelSelectorRequirement type for use with +// apply. +func LabelSelectorRequirement() *LabelSelectorRequirementApplyConfiguration { + return &LabelSelectorRequirementApplyConfiguration{} +} + +// WithKey sets the Key field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Key field is set to the value of the last call. +func (b *LabelSelectorRequirementApplyConfiguration) WithKey(value string) *LabelSelectorRequirementApplyConfiguration { + b.Key = &value + return b +} + +// WithOperator sets the Operator field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Operator field is set to the value of the last call. +func (b *LabelSelectorRequirementApplyConfiguration) WithOperator(value v1.LabelSelectorOperator) *LabelSelectorRequirementApplyConfiguration { + b.Operator = &value + return b +} + +// WithValues adds the given value to the Values field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Values field. +func (b *LabelSelectorRequirementApplyConfiguration) WithValues(values ...string) *LabelSelectorRequirementApplyConfiguration { + for i := range values { + b.Values = append(b.Values, values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/meta/v1/managedfieldsentry.go b/vendor/k8s.io/client-go/applyconfigurations/meta/v1/managedfieldsentry.go new file mode 100644 index 000000000000..919ad9f12cc9 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/meta/v1/managedfieldsentry.go @@ -0,0 +1,88 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// ManagedFieldsEntryApplyConfiguration represents an declarative configuration of the ManagedFieldsEntry type for use +// with apply. +type ManagedFieldsEntryApplyConfiguration struct { + Manager *string `json:"manager,omitempty"` + Operation *v1.ManagedFieldsOperationType `json:"operation,omitempty"` + APIVersion *string `json:"apiVersion,omitempty"` + Time *v1.Time `json:"time,omitempty"` + FieldsType *string `json:"fieldsType,omitempty"` + FieldsV1 *v1.FieldsV1 `json:"fieldsV1,omitempty"` +} + +// ManagedFieldsEntryApplyConfiguration constructs an declarative configuration of the ManagedFieldsEntry type for use with +// apply. +func ManagedFieldsEntry() *ManagedFieldsEntryApplyConfiguration { + return &ManagedFieldsEntryApplyConfiguration{} +} + +// WithManager sets the Manager field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Manager field is set to the value of the last call. +func (b *ManagedFieldsEntryApplyConfiguration) WithManager(value string) *ManagedFieldsEntryApplyConfiguration { + b.Manager = &value + return b +} + +// WithOperation sets the Operation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Operation field is set to the value of the last call. +func (b *ManagedFieldsEntryApplyConfiguration) WithOperation(value v1.ManagedFieldsOperationType) *ManagedFieldsEntryApplyConfiguration { + b.Operation = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *ManagedFieldsEntryApplyConfiguration) WithAPIVersion(value string) *ManagedFieldsEntryApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithTime sets the Time field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Time field is set to the value of the last call. +func (b *ManagedFieldsEntryApplyConfiguration) WithTime(value v1.Time) *ManagedFieldsEntryApplyConfiguration { + b.Time = &value + return b +} + +// WithFieldsType sets the FieldsType field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FieldsType field is set to the value of the last call. +func (b *ManagedFieldsEntryApplyConfiguration) WithFieldsType(value string) *ManagedFieldsEntryApplyConfiguration { + b.FieldsType = &value + return b +} + +// WithFieldsV1 sets the FieldsV1 field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FieldsV1 field is set to the value of the last call. +func (b *ManagedFieldsEntryApplyConfiguration) WithFieldsV1(value v1.FieldsV1) *ManagedFieldsEntryApplyConfiguration { + b.FieldsV1 = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/meta/v1/objectmeta.go b/vendor/k8s.io/client-go/applyconfigurations/meta/v1/objectmeta.go new file mode 100644 index 000000000000..0aeaeba27411 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/meta/v1/objectmeta.go @@ -0,0 +1,189 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" +) + +// ObjectMetaApplyConfiguration represents an declarative configuration of the ObjectMeta type for use +// with apply. +type ObjectMetaApplyConfiguration struct { + Name *string `json:"name,omitempty"` + GenerateName *string `json:"generateName,omitempty"` + Namespace *string `json:"namespace,omitempty"` + SelfLink *string `json:"selfLink,omitempty"` + UID *types.UID `json:"uid,omitempty"` + ResourceVersion *string `json:"resourceVersion,omitempty"` + Generation *int64 `json:"generation,omitempty"` + CreationTimestamp *v1.Time `json:"creationTimestamp,omitempty"` + DeletionTimestamp *v1.Time `json:"deletionTimestamp,omitempty"` + DeletionGracePeriodSeconds *int64 `json:"deletionGracePeriodSeconds,omitempty"` + Labels map[string]string `json:"labels,omitempty"` + Annotations map[string]string `json:"annotations,omitempty"` + OwnerReferences []OwnerReferenceApplyConfiguration `json:"ownerReferences,omitempty"` + Finalizers []string `json:"finalizers,omitempty"` + ClusterName *string `json:"clusterName,omitempty"` +} + +// ObjectMetaApplyConfiguration constructs an declarative configuration of the ObjectMeta type for use with +// apply. +func ObjectMeta() *ObjectMetaApplyConfiguration { + return &ObjectMetaApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ObjectMetaApplyConfiguration) WithName(value string) *ObjectMetaApplyConfiguration { + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *ObjectMetaApplyConfiguration) WithGenerateName(value string) *ObjectMetaApplyConfiguration { + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *ObjectMetaApplyConfiguration) WithNamespace(value string) *ObjectMetaApplyConfiguration { + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *ObjectMetaApplyConfiguration) WithSelfLink(value string) *ObjectMetaApplyConfiguration { + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *ObjectMetaApplyConfiguration) WithUID(value types.UID) *ObjectMetaApplyConfiguration { + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *ObjectMetaApplyConfiguration) WithResourceVersion(value string) *ObjectMetaApplyConfiguration { + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *ObjectMetaApplyConfiguration) WithGeneration(value int64) *ObjectMetaApplyConfiguration { + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *ObjectMetaApplyConfiguration) WithCreationTimestamp(value v1.Time) *ObjectMetaApplyConfiguration { + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *ObjectMetaApplyConfiguration) WithDeletionTimestamp(value v1.Time) *ObjectMetaApplyConfiguration { + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *ObjectMetaApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *ObjectMetaApplyConfiguration { + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *ObjectMetaApplyConfiguration) WithLabels(entries map[string]string) *ObjectMetaApplyConfiguration { + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *ObjectMetaApplyConfiguration) WithAnnotations(entries map[string]string) *ObjectMetaApplyConfiguration { + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *ObjectMetaApplyConfiguration) WithOwnerReferences(values ...*OwnerReferenceApplyConfiguration) *ObjectMetaApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *ObjectMetaApplyConfiguration) WithFinalizers(values ...string) *ObjectMetaApplyConfiguration { + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *ObjectMetaApplyConfiguration) WithClusterName(value string) *ObjectMetaApplyConfiguration { + b.ClusterName = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/meta/v1/ownerreference.go b/vendor/k8s.io/client-go/applyconfigurations/meta/v1/ownerreference.go new file mode 100644 index 000000000000..b3117d6a4b7c --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/meta/v1/ownerreference.go @@ -0,0 +1,88 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + types "k8s.io/apimachinery/pkg/types" +) + +// OwnerReferenceApplyConfiguration represents an declarative configuration of the OwnerReference type for use +// with apply. +type OwnerReferenceApplyConfiguration struct { + APIVersion *string `json:"apiVersion,omitempty"` + Kind *string `json:"kind,omitempty"` + Name *string `json:"name,omitempty"` + UID *types.UID `json:"uid,omitempty"` + Controller *bool `json:"controller,omitempty"` + BlockOwnerDeletion *bool `json:"blockOwnerDeletion,omitempty"` +} + +// OwnerReferenceApplyConfiguration constructs an declarative configuration of the OwnerReference type for use with +// apply. +func OwnerReference() *OwnerReferenceApplyConfiguration { + return &OwnerReferenceApplyConfiguration{} +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *OwnerReferenceApplyConfiguration) WithAPIVersion(value string) *OwnerReferenceApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *OwnerReferenceApplyConfiguration) WithKind(value string) *OwnerReferenceApplyConfiguration { + b.Kind = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *OwnerReferenceApplyConfiguration) WithName(value string) *OwnerReferenceApplyConfiguration { + b.Name = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *OwnerReferenceApplyConfiguration) WithUID(value types.UID) *OwnerReferenceApplyConfiguration { + b.UID = &value + return b +} + +// WithController sets the Controller field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Controller field is set to the value of the last call. +func (b *OwnerReferenceApplyConfiguration) WithController(value bool) *OwnerReferenceApplyConfiguration { + b.Controller = &value + return b +} + +// WithBlockOwnerDeletion sets the BlockOwnerDeletion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the BlockOwnerDeletion field is set to the value of the last call. +func (b *OwnerReferenceApplyConfiguration) WithBlockOwnerDeletion(value bool) *OwnerReferenceApplyConfiguration { + b.BlockOwnerDeletion = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/meta/v1/preconditions.go b/vendor/k8s.io/client-go/applyconfigurations/meta/v1/preconditions.go new file mode 100644 index 000000000000..f627733f1e2e --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/meta/v1/preconditions.go @@ -0,0 +1,52 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + types "k8s.io/apimachinery/pkg/types" +) + +// PreconditionsApplyConfiguration represents an declarative configuration of the Preconditions type for use +// with apply. +type PreconditionsApplyConfiguration struct { + UID *types.UID `json:"uid,omitempty"` + ResourceVersion *string `json:"resourceVersion,omitempty"` +} + +// PreconditionsApplyConfiguration constructs an declarative configuration of the Preconditions type for use with +// apply. +func Preconditions() *PreconditionsApplyConfiguration { + return &PreconditionsApplyConfiguration{} +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *PreconditionsApplyConfiguration) WithUID(value types.UID) *PreconditionsApplyConfiguration { + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *PreconditionsApplyConfiguration) WithResourceVersion(value string) *PreconditionsApplyConfiguration { + b.ResourceVersion = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/meta/v1/typemeta.go b/vendor/k8s.io/client-go/applyconfigurations/meta/v1/typemeta.go new file mode 100644 index 000000000000..877b0890e8f3 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/meta/v1/typemeta.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// TypeMetaApplyConfiguration represents an declarative configuration of the TypeMeta type for use +// with apply. +type TypeMetaApplyConfiguration struct { + Kind *string `json:"kind,omitempty"` + APIVersion *string `json:"apiVersion,omitempty"` +} + +// TypeMetaApplyConfiguration constructs an declarative configuration of the TypeMeta type for use with +// apply. +func TypeMeta() *TypeMetaApplyConfiguration { + return &TypeMetaApplyConfiguration{} +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *TypeMetaApplyConfiguration) WithKind(value string) *TypeMetaApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *TypeMetaApplyConfiguration) WithAPIVersion(value string) *TypeMetaApplyConfiguration { + b.APIVersion = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/networking/v1/httpingresspath.go b/vendor/k8s.io/client-go/applyconfigurations/networking/v1/httpingresspath.go new file mode 100644 index 000000000000..07b6a67f6a7a --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/networking/v1/httpingresspath.go @@ -0,0 +1,61 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/networking/v1" +) + +// HTTPIngressPathApplyConfiguration represents an declarative configuration of the HTTPIngressPath type for use +// with apply. +type HTTPIngressPathApplyConfiguration struct { + Path *string `json:"path,omitempty"` + PathType *v1.PathType `json:"pathType,omitempty"` + Backend *IngressBackendApplyConfiguration `json:"backend,omitempty"` +} + +// HTTPIngressPathApplyConfiguration constructs an declarative configuration of the HTTPIngressPath type for use with +// apply. +func HTTPIngressPath() *HTTPIngressPathApplyConfiguration { + return &HTTPIngressPathApplyConfiguration{} +} + +// WithPath sets the Path field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Path field is set to the value of the last call. +func (b *HTTPIngressPathApplyConfiguration) WithPath(value string) *HTTPIngressPathApplyConfiguration { + b.Path = &value + return b +} + +// WithPathType sets the PathType field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PathType field is set to the value of the last call. +func (b *HTTPIngressPathApplyConfiguration) WithPathType(value v1.PathType) *HTTPIngressPathApplyConfiguration { + b.PathType = &value + return b +} + +// WithBackend sets the Backend field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Backend field is set to the value of the last call. +func (b *HTTPIngressPathApplyConfiguration) WithBackend(value *IngressBackendApplyConfiguration) *HTTPIngressPathApplyConfiguration { + b.Backend = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/networking/v1/httpingressrulevalue.go b/vendor/k8s.io/client-go/applyconfigurations/networking/v1/httpingressrulevalue.go new file mode 100644 index 000000000000..fef529d696ea --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/networking/v1/httpingressrulevalue.go @@ -0,0 +1,44 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// HTTPIngressRuleValueApplyConfiguration represents an declarative configuration of the HTTPIngressRuleValue type for use +// with apply. +type HTTPIngressRuleValueApplyConfiguration struct { + Paths []HTTPIngressPathApplyConfiguration `json:"paths,omitempty"` +} + +// HTTPIngressRuleValueApplyConfiguration constructs an declarative configuration of the HTTPIngressRuleValue type for use with +// apply. +func HTTPIngressRuleValue() *HTTPIngressRuleValueApplyConfiguration { + return &HTTPIngressRuleValueApplyConfiguration{} +} + +// WithPaths adds the given value to the Paths field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Paths field. +func (b *HTTPIngressRuleValueApplyConfiguration) WithPaths(values ...*HTTPIngressPathApplyConfiguration) *HTTPIngressRuleValueApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithPaths") + } + b.Paths = append(b.Paths, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingress.go b/vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingress.go new file mode 100644 index 000000000000..08cbec9042ae --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingress.go @@ -0,0 +1,265 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + apinetworkingv1 "k8s.io/api/networking/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// IngressApplyConfiguration represents an declarative configuration of the Ingress type for use +// with apply. +type IngressApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *IngressSpecApplyConfiguration `json:"spec,omitempty"` + Status *IngressStatusApplyConfiguration `json:"status,omitempty"` +} + +// Ingress constructs an declarative configuration of the Ingress type for use with +// apply. +func Ingress(name, namespace string) *IngressApplyConfiguration { + b := &IngressApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("Ingress") + b.WithAPIVersion("networking.k8s.io/v1") + return b +} + +// ExtractIngress extracts the applied configuration owned by fieldManager from +// ingress. If no managedFields are found in ingress for fieldManager, a +// IngressApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// ingress must be a unmodified Ingress API object that was retrieved from the Kubernetes API. +// ExtractIngress provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractIngress(ingress *apinetworkingv1.Ingress, fieldManager string) (*IngressApplyConfiguration, error) { + b := &IngressApplyConfiguration{} + err := managedfields.ExtractInto(ingress, internal.Parser().Type("io.k8s.api.networking.v1.Ingress"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(ingress.Name) + b.WithNamespace(ingress.Namespace) + + b.WithKind("Ingress") + b.WithAPIVersion("networking.k8s.io/v1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *IngressApplyConfiguration) WithKind(value string) *IngressApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *IngressApplyConfiguration) WithAPIVersion(value string) *IngressApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *IngressApplyConfiguration) WithName(value string) *IngressApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *IngressApplyConfiguration) WithGenerateName(value string) *IngressApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *IngressApplyConfiguration) WithNamespace(value string) *IngressApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *IngressApplyConfiguration) WithSelfLink(value string) *IngressApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *IngressApplyConfiguration) WithUID(value types.UID) *IngressApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *IngressApplyConfiguration) WithResourceVersion(value string) *IngressApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *IngressApplyConfiguration) WithGeneration(value int64) *IngressApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *IngressApplyConfiguration) WithCreationTimestamp(value metav1.Time) *IngressApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *IngressApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *IngressApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *IngressApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *IngressApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *IngressApplyConfiguration) WithLabels(entries map[string]string) *IngressApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *IngressApplyConfiguration) WithAnnotations(entries map[string]string) *IngressApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *IngressApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *IngressApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *IngressApplyConfiguration) WithFinalizers(values ...string) *IngressApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *IngressApplyConfiguration) WithClusterName(value string) *IngressApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *IngressApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *IngressApplyConfiguration) WithSpec(value *IngressSpecApplyConfiguration) *IngressApplyConfiguration { + b.Spec = value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *IngressApplyConfiguration) WithStatus(value *IngressStatusApplyConfiguration) *IngressApplyConfiguration { + b.Status = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingressbackend.go b/vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingressbackend.go new file mode 100644 index 000000000000..575713599186 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingressbackend.go @@ -0,0 +1,52 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + corev1 "k8s.io/client-go/applyconfigurations/core/v1" +) + +// IngressBackendApplyConfiguration represents an declarative configuration of the IngressBackend type for use +// with apply. +type IngressBackendApplyConfiguration struct { + Service *IngressServiceBackendApplyConfiguration `json:"service,omitempty"` + Resource *corev1.TypedLocalObjectReferenceApplyConfiguration `json:"resource,omitempty"` +} + +// IngressBackendApplyConfiguration constructs an declarative configuration of the IngressBackend type for use with +// apply. +func IngressBackend() *IngressBackendApplyConfiguration { + return &IngressBackendApplyConfiguration{} +} + +// WithService sets the Service field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Service field is set to the value of the last call. +func (b *IngressBackendApplyConfiguration) WithService(value *IngressServiceBackendApplyConfiguration) *IngressBackendApplyConfiguration { + b.Service = value + return b +} + +// WithResource sets the Resource field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Resource field is set to the value of the last call. +func (b *IngressBackendApplyConfiguration) WithResource(value *corev1.TypedLocalObjectReferenceApplyConfiguration) *IngressBackendApplyConfiguration { + b.Resource = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingressclass.go b/vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingressclass.go new file mode 100644 index 000000000000..105dc7d71634 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingressclass.go @@ -0,0 +1,254 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + apinetworkingv1 "k8s.io/api/networking/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// IngressClassApplyConfiguration represents an declarative configuration of the IngressClass type for use +// with apply. +type IngressClassApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *IngressClassSpecApplyConfiguration `json:"spec,omitempty"` +} + +// IngressClass constructs an declarative configuration of the IngressClass type for use with +// apply. +func IngressClass(name string) *IngressClassApplyConfiguration { + b := &IngressClassApplyConfiguration{} + b.WithName(name) + b.WithKind("IngressClass") + b.WithAPIVersion("networking.k8s.io/v1") + return b +} + +// ExtractIngressClass extracts the applied configuration owned by fieldManager from +// ingressClass. If no managedFields are found in ingressClass for fieldManager, a +// IngressClassApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// ingressClass must be a unmodified IngressClass API object that was retrieved from the Kubernetes API. +// ExtractIngressClass provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractIngressClass(ingressClass *apinetworkingv1.IngressClass, fieldManager string) (*IngressClassApplyConfiguration, error) { + b := &IngressClassApplyConfiguration{} + err := managedfields.ExtractInto(ingressClass, internal.Parser().Type("io.k8s.api.networking.v1.IngressClass"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(ingressClass.Name) + + b.WithKind("IngressClass") + b.WithAPIVersion("networking.k8s.io/v1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *IngressClassApplyConfiguration) WithKind(value string) *IngressClassApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *IngressClassApplyConfiguration) WithAPIVersion(value string) *IngressClassApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *IngressClassApplyConfiguration) WithName(value string) *IngressClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *IngressClassApplyConfiguration) WithGenerateName(value string) *IngressClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *IngressClassApplyConfiguration) WithNamespace(value string) *IngressClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *IngressClassApplyConfiguration) WithSelfLink(value string) *IngressClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *IngressClassApplyConfiguration) WithUID(value types.UID) *IngressClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *IngressClassApplyConfiguration) WithResourceVersion(value string) *IngressClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *IngressClassApplyConfiguration) WithGeneration(value int64) *IngressClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *IngressClassApplyConfiguration) WithCreationTimestamp(value metav1.Time) *IngressClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *IngressClassApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *IngressClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *IngressClassApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *IngressClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *IngressClassApplyConfiguration) WithLabels(entries map[string]string) *IngressClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *IngressClassApplyConfiguration) WithAnnotations(entries map[string]string) *IngressClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *IngressClassApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *IngressClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *IngressClassApplyConfiguration) WithFinalizers(values ...string) *IngressClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *IngressClassApplyConfiguration) WithClusterName(value string) *IngressClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *IngressClassApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *IngressClassApplyConfiguration) WithSpec(value *IngressClassSpecApplyConfiguration) *IngressClassApplyConfiguration { + b.Spec = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingressclassparametersreference.go b/vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingressclassparametersreference.go new file mode 100644 index 000000000000..a020d3a8df87 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingressclassparametersreference.go @@ -0,0 +1,75 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// IngressClassParametersReferenceApplyConfiguration represents an declarative configuration of the IngressClassParametersReference type for use +// with apply. +type IngressClassParametersReferenceApplyConfiguration struct { + APIGroup *string `json:"apiGroup,omitempty"` + Kind *string `json:"kind,omitempty"` + Name *string `json:"name,omitempty"` + Scope *string `json:"scope,omitempty"` + Namespace *string `json:"namespace,omitempty"` +} + +// IngressClassParametersReferenceApplyConfiguration constructs an declarative configuration of the IngressClassParametersReference type for use with +// apply. +func IngressClassParametersReference() *IngressClassParametersReferenceApplyConfiguration { + return &IngressClassParametersReferenceApplyConfiguration{} +} + +// WithAPIGroup sets the APIGroup field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIGroup field is set to the value of the last call. +func (b *IngressClassParametersReferenceApplyConfiguration) WithAPIGroup(value string) *IngressClassParametersReferenceApplyConfiguration { + b.APIGroup = &value + return b +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *IngressClassParametersReferenceApplyConfiguration) WithKind(value string) *IngressClassParametersReferenceApplyConfiguration { + b.Kind = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *IngressClassParametersReferenceApplyConfiguration) WithName(value string) *IngressClassParametersReferenceApplyConfiguration { + b.Name = &value + return b +} + +// WithScope sets the Scope field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Scope field is set to the value of the last call. +func (b *IngressClassParametersReferenceApplyConfiguration) WithScope(value string) *IngressClassParametersReferenceApplyConfiguration { + b.Scope = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *IngressClassParametersReferenceApplyConfiguration) WithNamespace(value string) *IngressClassParametersReferenceApplyConfiguration { + b.Namespace = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingressclassspec.go b/vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingressclassspec.go new file mode 100644 index 000000000000..ec0423e708df --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingressclassspec.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// IngressClassSpecApplyConfiguration represents an declarative configuration of the IngressClassSpec type for use +// with apply. +type IngressClassSpecApplyConfiguration struct { + Controller *string `json:"controller,omitempty"` + Parameters *IngressClassParametersReferenceApplyConfiguration `json:"parameters,omitempty"` +} + +// IngressClassSpecApplyConfiguration constructs an declarative configuration of the IngressClassSpec type for use with +// apply. +func IngressClassSpec() *IngressClassSpecApplyConfiguration { + return &IngressClassSpecApplyConfiguration{} +} + +// WithController sets the Controller field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Controller field is set to the value of the last call. +func (b *IngressClassSpecApplyConfiguration) WithController(value string) *IngressClassSpecApplyConfiguration { + b.Controller = &value + return b +} + +// WithParameters sets the Parameters field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Parameters field is set to the value of the last call. +func (b *IngressClassSpecApplyConfiguration) WithParameters(value *IngressClassParametersReferenceApplyConfiguration) *IngressClassSpecApplyConfiguration { + b.Parameters = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingressrule.go b/vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingressrule.go new file mode 100644 index 000000000000..8153e88fe2c7 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingressrule.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// IngressRuleApplyConfiguration represents an declarative configuration of the IngressRule type for use +// with apply. +type IngressRuleApplyConfiguration struct { + Host *string `json:"host,omitempty"` + IngressRuleValueApplyConfiguration `json:",omitempty,inline"` +} + +// IngressRuleApplyConfiguration constructs an declarative configuration of the IngressRule type for use with +// apply. +func IngressRule() *IngressRuleApplyConfiguration { + return &IngressRuleApplyConfiguration{} +} + +// WithHost sets the Host field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Host field is set to the value of the last call. +func (b *IngressRuleApplyConfiguration) WithHost(value string) *IngressRuleApplyConfiguration { + b.Host = &value + return b +} + +// WithHTTP sets the HTTP field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the HTTP field is set to the value of the last call. +func (b *IngressRuleApplyConfiguration) WithHTTP(value *HTTPIngressRuleValueApplyConfiguration) *IngressRuleApplyConfiguration { + b.HTTP = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingressrulevalue.go b/vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingressrulevalue.go new file mode 100644 index 000000000000..d0e094387c59 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingressrulevalue.go @@ -0,0 +1,39 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// IngressRuleValueApplyConfiguration represents an declarative configuration of the IngressRuleValue type for use +// with apply. +type IngressRuleValueApplyConfiguration struct { + HTTP *HTTPIngressRuleValueApplyConfiguration `json:"http,omitempty"` +} + +// IngressRuleValueApplyConfiguration constructs an declarative configuration of the IngressRuleValue type for use with +// apply. +func IngressRuleValue() *IngressRuleValueApplyConfiguration { + return &IngressRuleValueApplyConfiguration{} +} + +// WithHTTP sets the HTTP field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the HTTP field is set to the value of the last call. +func (b *IngressRuleValueApplyConfiguration) WithHTTP(value *HTTPIngressRuleValueApplyConfiguration) *IngressRuleValueApplyConfiguration { + b.HTTP = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingressservicebackend.go b/vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingressservicebackend.go new file mode 100644 index 000000000000..399739631bf4 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingressservicebackend.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// IngressServiceBackendApplyConfiguration represents an declarative configuration of the IngressServiceBackend type for use +// with apply. +type IngressServiceBackendApplyConfiguration struct { + Name *string `json:"name,omitempty"` + Port *ServiceBackendPortApplyConfiguration `json:"port,omitempty"` +} + +// IngressServiceBackendApplyConfiguration constructs an declarative configuration of the IngressServiceBackend type for use with +// apply. +func IngressServiceBackend() *IngressServiceBackendApplyConfiguration { + return &IngressServiceBackendApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *IngressServiceBackendApplyConfiguration) WithName(value string) *IngressServiceBackendApplyConfiguration { + b.Name = &value + return b +} + +// WithPort sets the Port field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Port field is set to the value of the last call. +func (b *IngressServiceBackendApplyConfiguration) WithPort(value *ServiceBackendPortApplyConfiguration) *IngressServiceBackendApplyConfiguration { + b.Port = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingressspec.go b/vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingressspec.go new file mode 100644 index 000000000000..635514ecf785 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingressspec.go @@ -0,0 +1,76 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// IngressSpecApplyConfiguration represents an declarative configuration of the IngressSpec type for use +// with apply. +type IngressSpecApplyConfiguration struct { + IngressClassName *string `json:"ingressClassName,omitempty"` + DefaultBackend *IngressBackendApplyConfiguration `json:"defaultBackend,omitempty"` + TLS []IngressTLSApplyConfiguration `json:"tls,omitempty"` + Rules []IngressRuleApplyConfiguration `json:"rules,omitempty"` +} + +// IngressSpecApplyConfiguration constructs an declarative configuration of the IngressSpec type for use with +// apply. +func IngressSpec() *IngressSpecApplyConfiguration { + return &IngressSpecApplyConfiguration{} +} + +// WithIngressClassName sets the IngressClassName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the IngressClassName field is set to the value of the last call. +func (b *IngressSpecApplyConfiguration) WithIngressClassName(value string) *IngressSpecApplyConfiguration { + b.IngressClassName = &value + return b +} + +// WithDefaultBackend sets the DefaultBackend field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DefaultBackend field is set to the value of the last call. +func (b *IngressSpecApplyConfiguration) WithDefaultBackend(value *IngressBackendApplyConfiguration) *IngressSpecApplyConfiguration { + b.DefaultBackend = value + return b +} + +// WithTLS adds the given value to the TLS field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the TLS field. +func (b *IngressSpecApplyConfiguration) WithTLS(values ...*IngressTLSApplyConfiguration) *IngressSpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithTLS") + } + b.TLS = append(b.TLS, *values[i]) + } + return b +} + +// WithRules adds the given value to the Rules field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Rules field. +func (b *IngressSpecApplyConfiguration) WithRules(values ...*IngressRuleApplyConfiguration) *IngressSpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithRules") + } + b.Rules = append(b.Rules, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingressstatus.go b/vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingressstatus.go new file mode 100644 index 000000000000..dd8b25d836f5 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingressstatus.go @@ -0,0 +1,43 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/client-go/applyconfigurations/core/v1" +) + +// IngressStatusApplyConfiguration represents an declarative configuration of the IngressStatus type for use +// with apply. +type IngressStatusApplyConfiguration struct { + LoadBalancer *v1.LoadBalancerStatusApplyConfiguration `json:"loadBalancer,omitempty"` +} + +// IngressStatusApplyConfiguration constructs an declarative configuration of the IngressStatus type for use with +// apply. +func IngressStatus() *IngressStatusApplyConfiguration { + return &IngressStatusApplyConfiguration{} +} + +// WithLoadBalancer sets the LoadBalancer field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LoadBalancer field is set to the value of the last call. +func (b *IngressStatusApplyConfiguration) WithLoadBalancer(value *v1.LoadBalancerStatusApplyConfiguration) *IngressStatusApplyConfiguration { + b.LoadBalancer = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingresstls.go b/vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingresstls.go new file mode 100644 index 000000000000..4d8d369f7c08 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingresstls.go @@ -0,0 +1,50 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// IngressTLSApplyConfiguration represents an declarative configuration of the IngressTLS type for use +// with apply. +type IngressTLSApplyConfiguration struct { + Hosts []string `json:"hosts,omitempty"` + SecretName *string `json:"secretName,omitempty"` +} + +// IngressTLSApplyConfiguration constructs an declarative configuration of the IngressTLS type for use with +// apply. +func IngressTLS() *IngressTLSApplyConfiguration { + return &IngressTLSApplyConfiguration{} +} + +// WithHosts adds the given value to the Hosts field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Hosts field. +func (b *IngressTLSApplyConfiguration) WithHosts(values ...string) *IngressTLSApplyConfiguration { + for i := range values { + b.Hosts = append(b.Hosts, values[i]) + } + return b +} + +// WithSecretName sets the SecretName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SecretName field is set to the value of the last call. +func (b *IngressTLSApplyConfiguration) WithSecretName(value string) *IngressTLSApplyConfiguration { + b.SecretName = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/networking/v1/ipblock.go b/vendor/k8s.io/client-go/applyconfigurations/networking/v1/ipblock.go new file mode 100644 index 000000000000..1efd6edfdca0 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/networking/v1/ipblock.go @@ -0,0 +1,50 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// IPBlockApplyConfiguration represents an declarative configuration of the IPBlock type for use +// with apply. +type IPBlockApplyConfiguration struct { + CIDR *string `json:"cidr,omitempty"` + Except []string `json:"except,omitempty"` +} + +// IPBlockApplyConfiguration constructs an declarative configuration of the IPBlock type for use with +// apply. +func IPBlock() *IPBlockApplyConfiguration { + return &IPBlockApplyConfiguration{} +} + +// WithCIDR sets the CIDR field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CIDR field is set to the value of the last call. +func (b *IPBlockApplyConfiguration) WithCIDR(value string) *IPBlockApplyConfiguration { + b.CIDR = &value + return b +} + +// WithExcept adds the given value to the Except field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Except field. +func (b *IPBlockApplyConfiguration) WithExcept(values ...string) *IPBlockApplyConfiguration { + for i := range values { + b.Except = append(b.Except, values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/networking/v1/networkpolicy.go b/vendor/k8s.io/client-go/applyconfigurations/networking/v1/networkpolicy.go new file mode 100644 index 000000000000..061111183d78 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/networking/v1/networkpolicy.go @@ -0,0 +1,256 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + apinetworkingv1 "k8s.io/api/networking/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// NetworkPolicyApplyConfiguration represents an declarative configuration of the NetworkPolicy type for use +// with apply. +type NetworkPolicyApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *NetworkPolicySpecApplyConfiguration `json:"spec,omitempty"` +} + +// NetworkPolicy constructs an declarative configuration of the NetworkPolicy type for use with +// apply. +func NetworkPolicy(name, namespace string) *NetworkPolicyApplyConfiguration { + b := &NetworkPolicyApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("NetworkPolicy") + b.WithAPIVersion("networking.k8s.io/v1") + return b +} + +// ExtractNetworkPolicy extracts the applied configuration owned by fieldManager from +// networkPolicy. If no managedFields are found in networkPolicy for fieldManager, a +// NetworkPolicyApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// networkPolicy must be a unmodified NetworkPolicy API object that was retrieved from the Kubernetes API. +// ExtractNetworkPolicy provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractNetworkPolicy(networkPolicy *apinetworkingv1.NetworkPolicy, fieldManager string) (*NetworkPolicyApplyConfiguration, error) { + b := &NetworkPolicyApplyConfiguration{} + err := managedfields.ExtractInto(networkPolicy, internal.Parser().Type("io.k8s.api.networking.v1.NetworkPolicy"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(networkPolicy.Name) + b.WithNamespace(networkPolicy.Namespace) + + b.WithKind("NetworkPolicy") + b.WithAPIVersion("networking.k8s.io/v1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *NetworkPolicyApplyConfiguration) WithKind(value string) *NetworkPolicyApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *NetworkPolicyApplyConfiguration) WithAPIVersion(value string) *NetworkPolicyApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *NetworkPolicyApplyConfiguration) WithName(value string) *NetworkPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *NetworkPolicyApplyConfiguration) WithGenerateName(value string) *NetworkPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *NetworkPolicyApplyConfiguration) WithNamespace(value string) *NetworkPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *NetworkPolicyApplyConfiguration) WithSelfLink(value string) *NetworkPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *NetworkPolicyApplyConfiguration) WithUID(value types.UID) *NetworkPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *NetworkPolicyApplyConfiguration) WithResourceVersion(value string) *NetworkPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *NetworkPolicyApplyConfiguration) WithGeneration(value int64) *NetworkPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *NetworkPolicyApplyConfiguration) WithCreationTimestamp(value metav1.Time) *NetworkPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *NetworkPolicyApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *NetworkPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *NetworkPolicyApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *NetworkPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *NetworkPolicyApplyConfiguration) WithLabels(entries map[string]string) *NetworkPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *NetworkPolicyApplyConfiguration) WithAnnotations(entries map[string]string) *NetworkPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *NetworkPolicyApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *NetworkPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *NetworkPolicyApplyConfiguration) WithFinalizers(values ...string) *NetworkPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *NetworkPolicyApplyConfiguration) WithClusterName(value string) *NetworkPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *NetworkPolicyApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *NetworkPolicyApplyConfiguration) WithSpec(value *NetworkPolicySpecApplyConfiguration) *NetworkPolicyApplyConfiguration { + b.Spec = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/networking/v1/networkpolicyegressrule.go b/vendor/k8s.io/client-go/applyconfigurations/networking/v1/networkpolicyegressrule.go new file mode 100644 index 000000000000..e5751c441373 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/networking/v1/networkpolicyegressrule.go @@ -0,0 +1,58 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// NetworkPolicyEgressRuleApplyConfiguration represents an declarative configuration of the NetworkPolicyEgressRule type for use +// with apply. +type NetworkPolicyEgressRuleApplyConfiguration struct { + Ports []NetworkPolicyPortApplyConfiguration `json:"ports,omitempty"` + To []NetworkPolicyPeerApplyConfiguration `json:"to,omitempty"` +} + +// NetworkPolicyEgressRuleApplyConfiguration constructs an declarative configuration of the NetworkPolicyEgressRule type for use with +// apply. +func NetworkPolicyEgressRule() *NetworkPolicyEgressRuleApplyConfiguration { + return &NetworkPolicyEgressRuleApplyConfiguration{} +} + +// WithPorts adds the given value to the Ports field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Ports field. +func (b *NetworkPolicyEgressRuleApplyConfiguration) WithPorts(values ...*NetworkPolicyPortApplyConfiguration) *NetworkPolicyEgressRuleApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithPorts") + } + b.Ports = append(b.Ports, *values[i]) + } + return b +} + +// WithTo adds the given value to the To field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the To field. +func (b *NetworkPolicyEgressRuleApplyConfiguration) WithTo(values ...*NetworkPolicyPeerApplyConfiguration) *NetworkPolicyEgressRuleApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithTo") + } + b.To = append(b.To, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/networking/v1/networkpolicyingressrule.go b/vendor/k8s.io/client-go/applyconfigurations/networking/v1/networkpolicyingressrule.go new file mode 100644 index 000000000000..630fe1fabe60 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/networking/v1/networkpolicyingressrule.go @@ -0,0 +1,58 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// NetworkPolicyIngressRuleApplyConfiguration represents an declarative configuration of the NetworkPolicyIngressRule type for use +// with apply. +type NetworkPolicyIngressRuleApplyConfiguration struct { + Ports []NetworkPolicyPortApplyConfiguration `json:"ports,omitempty"` + From []NetworkPolicyPeerApplyConfiguration `json:"from,omitempty"` +} + +// NetworkPolicyIngressRuleApplyConfiguration constructs an declarative configuration of the NetworkPolicyIngressRule type for use with +// apply. +func NetworkPolicyIngressRule() *NetworkPolicyIngressRuleApplyConfiguration { + return &NetworkPolicyIngressRuleApplyConfiguration{} +} + +// WithPorts adds the given value to the Ports field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Ports field. +func (b *NetworkPolicyIngressRuleApplyConfiguration) WithPorts(values ...*NetworkPolicyPortApplyConfiguration) *NetworkPolicyIngressRuleApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithPorts") + } + b.Ports = append(b.Ports, *values[i]) + } + return b +} + +// WithFrom adds the given value to the From field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the From field. +func (b *NetworkPolicyIngressRuleApplyConfiguration) WithFrom(values ...*NetworkPolicyPeerApplyConfiguration) *NetworkPolicyIngressRuleApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithFrom") + } + b.From = append(b.From, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/networking/v1/networkpolicypeer.go b/vendor/k8s.io/client-go/applyconfigurations/networking/v1/networkpolicypeer.go new file mode 100644 index 000000000000..909b651c0411 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/networking/v1/networkpolicypeer.go @@ -0,0 +1,61 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// NetworkPolicyPeerApplyConfiguration represents an declarative configuration of the NetworkPolicyPeer type for use +// with apply. +type NetworkPolicyPeerApplyConfiguration struct { + PodSelector *v1.LabelSelectorApplyConfiguration `json:"podSelector,omitempty"` + NamespaceSelector *v1.LabelSelectorApplyConfiguration `json:"namespaceSelector,omitempty"` + IPBlock *IPBlockApplyConfiguration `json:"ipBlock,omitempty"` +} + +// NetworkPolicyPeerApplyConfiguration constructs an declarative configuration of the NetworkPolicyPeer type for use with +// apply. +func NetworkPolicyPeer() *NetworkPolicyPeerApplyConfiguration { + return &NetworkPolicyPeerApplyConfiguration{} +} + +// WithPodSelector sets the PodSelector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PodSelector field is set to the value of the last call. +func (b *NetworkPolicyPeerApplyConfiguration) WithPodSelector(value *v1.LabelSelectorApplyConfiguration) *NetworkPolicyPeerApplyConfiguration { + b.PodSelector = value + return b +} + +// WithNamespaceSelector sets the NamespaceSelector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NamespaceSelector field is set to the value of the last call. +func (b *NetworkPolicyPeerApplyConfiguration) WithNamespaceSelector(value *v1.LabelSelectorApplyConfiguration) *NetworkPolicyPeerApplyConfiguration { + b.NamespaceSelector = value + return b +} + +// WithIPBlock sets the IPBlock field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the IPBlock field is set to the value of the last call. +func (b *NetworkPolicyPeerApplyConfiguration) WithIPBlock(value *IPBlockApplyConfiguration) *NetworkPolicyPeerApplyConfiguration { + b.IPBlock = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/networking/v1/networkpolicyport.go b/vendor/k8s.io/client-go/applyconfigurations/networking/v1/networkpolicyport.go new file mode 100644 index 000000000000..73dbed1d8954 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/networking/v1/networkpolicyport.go @@ -0,0 +1,62 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/core/v1" + intstr "k8s.io/apimachinery/pkg/util/intstr" +) + +// NetworkPolicyPortApplyConfiguration represents an declarative configuration of the NetworkPolicyPort type for use +// with apply. +type NetworkPolicyPortApplyConfiguration struct { + Protocol *v1.Protocol `json:"protocol,omitempty"` + Port *intstr.IntOrString `json:"port,omitempty"` + EndPort *int32 `json:"endPort,omitempty"` +} + +// NetworkPolicyPortApplyConfiguration constructs an declarative configuration of the NetworkPolicyPort type for use with +// apply. +func NetworkPolicyPort() *NetworkPolicyPortApplyConfiguration { + return &NetworkPolicyPortApplyConfiguration{} +} + +// WithProtocol sets the Protocol field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Protocol field is set to the value of the last call. +func (b *NetworkPolicyPortApplyConfiguration) WithProtocol(value v1.Protocol) *NetworkPolicyPortApplyConfiguration { + b.Protocol = &value + return b +} + +// WithPort sets the Port field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Port field is set to the value of the last call. +func (b *NetworkPolicyPortApplyConfiguration) WithPort(value intstr.IntOrString) *NetworkPolicyPortApplyConfiguration { + b.Port = &value + return b +} + +// WithEndPort sets the EndPort field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the EndPort field is set to the value of the last call. +func (b *NetworkPolicyPortApplyConfiguration) WithEndPort(value int32) *NetworkPolicyPortApplyConfiguration { + b.EndPort = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/networking/v1/networkpolicyspec.go b/vendor/k8s.io/client-go/applyconfigurations/networking/v1/networkpolicyspec.go new file mode 100644 index 000000000000..882d8233a95b --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/networking/v1/networkpolicyspec.go @@ -0,0 +1,83 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + apinetworkingv1 "k8s.io/api/networking/v1" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// NetworkPolicySpecApplyConfiguration represents an declarative configuration of the NetworkPolicySpec type for use +// with apply. +type NetworkPolicySpecApplyConfiguration struct { + PodSelector *v1.LabelSelectorApplyConfiguration `json:"podSelector,omitempty"` + Ingress []NetworkPolicyIngressRuleApplyConfiguration `json:"ingress,omitempty"` + Egress []NetworkPolicyEgressRuleApplyConfiguration `json:"egress,omitempty"` + PolicyTypes []apinetworkingv1.PolicyType `json:"policyTypes,omitempty"` +} + +// NetworkPolicySpecApplyConfiguration constructs an declarative configuration of the NetworkPolicySpec type for use with +// apply. +func NetworkPolicySpec() *NetworkPolicySpecApplyConfiguration { + return &NetworkPolicySpecApplyConfiguration{} +} + +// WithPodSelector sets the PodSelector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PodSelector field is set to the value of the last call. +func (b *NetworkPolicySpecApplyConfiguration) WithPodSelector(value *v1.LabelSelectorApplyConfiguration) *NetworkPolicySpecApplyConfiguration { + b.PodSelector = value + return b +} + +// WithIngress adds the given value to the Ingress field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Ingress field. +func (b *NetworkPolicySpecApplyConfiguration) WithIngress(values ...*NetworkPolicyIngressRuleApplyConfiguration) *NetworkPolicySpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithIngress") + } + b.Ingress = append(b.Ingress, *values[i]) + } + return b +} + +// WithEgress adds the given value to the Egress field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Egress field. +func (b *NetworkPolicySpecApplyConfiguration) WithEgress(values ...*NetworkPolicyEgressRuleApplyConfiguration) *NetworkPolicySpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithEgress") + } + b.Egress = append(b.Egress, *values[i]) + } + return b +} + +// WithPolicyTypes adds the given value to the PolicyTypes field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the PolicyTypes field. +func (b *NetworkPolicySpecApplyConfiguration) WithPolicyTypes(values ...apinetworkingv1.PolicyType) *NetworkPolicySpecApplyConfiguration { + for i := range values { + b.PolicyTypes = append(b.PolicyTypes, values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/networking/v1/servicebackendport.go b/vendor/k8s.io/client-go/applyconfigurations/networking/v1/servicebackendport.go new file mode 100644 index 000000000000..ec278960caa7 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/networking/v1/servicebackendport.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// ServiceBackendPortApplyConfiguration represents an declarative configuration of the ServiceBackendPort type for use +// with apply. +type ServiceBackendPortApplyConfiguration struct { + Name *string `json:"name,omitempty"` + Number *int32 `json:"number,omitempty"` +} + +// ServiceBackendPortApplyConfiguration constructs an declarative configuration of the ServiceBackendPort type for use with +// apply. +func ServiceBackendPort() *ServiceBackendPortApplyConfiguration { + return &ServiceBackendPortApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ServiceBackendPortApplyConfiguration) WithName(value string) *ServiceBackendPortApplyConfiguration { + b.Name = &value + return b +} + +// WithNumber sets the Number field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Number field is set to the value of the last call. +func (b *ServiceBackendPortApplyConfiguration) WithNumber(value int32) *ServiceBackendPortApplyConfiguration { + b.Number = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/httpingresspath.go b/vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/httpingresspath.go new file mode 100644 index 000000000000..b12907e81c50 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/httpingresspath.go @@ -0,0 +1,61 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1beta1 "k8s.io/api/networking/v1beta1" +) + +// HTTPIngressPathApplyConfiguration represents an declarative configuration of the HTTPIngressPath type for use +// with apply. +type HTTPIngressPathApplyConfiguration struct { + Path *string `json:"path,omitempty"` + PathType *v1beta1.PathType `json:"pathType,omitempty"` + Backend *IngressBackendApplyConfiguration `json:"backend,omitempty"` +} + +// HTTPIngressPathApplyConfiguration constructs an declarative configuration of the HTTPIngressPath type for use with +// apply. +func HTTPIngressPath() *HTTPIngressPathApplyConfiguration { + return &HTTPIngressPathApplyConfiguration{} +} + +// WithPath sets the Path field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Path field is set to the value of the last call. +func (b *HTTPIngressPathApplyConfiguration) WithPath(value string) *HTTPIngressPathApplyConfiguration { + b.Path = &value + return b +} + +// WithPathType sets the PathType field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PathType field is set to the value of the last call. +func (b *HTTPIngressPathApplyConfiguration) WithPathType(value v1beta1.PathType) *HTTPIngressPathApplyConfiguration { + b.PathType = &value + return b +} + +// WithBackend sets the Backend field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Backend field is set to the value of the last call. +func (b *HTTPIngressPathApplyConfiguration) WithBackend(value *IngressBackendApplyConfiguration) *HTTPIngressPathApplyConfiguration { + b.Backend = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/httpingressrulevalue.go b/vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/httpingressrulevalue.go new file mode 100644 index 000000000000..3137bc5eb04d --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/httpingressrulevalue.go @@ -0,0 +1,44 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// HTTPIngressRuleValueApplyConfiguration represents an declarative configuration of the HTTPIngressRuleValue type for use +// with apply. +type HTTPIngressRuleValueApplyConfiguration struct { + Paths []HTTPIngressPathApplyConfiguration `json:"paths,omitempty"` +} + +// HTTPIngressRuleValueApplyConfiguration constructs an declarative configuration of the HTTPIngressRuleValue type for use with +// apply. +func HTTPIngressRuleValue() *HTTPIngressRuleValueApplyConfiguration { + return &HTTPIngressRuleValueApplyConfiguration{} +} + +// WithPaths adds the given value to the Paths field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Paths field. +func (b *HTTPIngressRuleValueApplyConfiguration) WithPaths(values ...*HTTPIngressPathApplyConfiguration) *HTTPIngressRuleValueApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithPaths") + } + b.Paths = append(b.Paths, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/ingress.go b/vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/ingress.go new file mode 100644 index 000000000000..3d15cf1270e4 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/ingress.go @@ -0,0 +1,265 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + networkingv1beta1 "k8s.io/api/networking/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// IngressApplyConfiguration represents an declarative configuration of the Ingress type for use +// with apply. +type IngressApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *IngressSpecApplyConfiguration `json:"spec,omitempty"` + Status *IngressStatusApplyConfiguration `json:"status,omitempty"` +} + +// Ingress constructs an declarative configuration of the Ingress type for use with +// apply. +func Ingress(name, namespace string) *IngressApplyConfiguration { + b := &IngressApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("Ingress") + b.WithAPIVersion("networking.k8s.io/v1beta1") + return b +} + +// ExtractIngress extracts the applied configuration owned by fieldManager from +// ingress. If no managedFields are found in ingress for fieldManager, a +// IngressApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// ingress must be a unmodified Ingress API object that was retrieved from the Kubernetes API. +// ExtractIngress provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractIngress(ingress *networkingv1beta1.Ingress, fieldManager string) (*IngressApplyConfiguration, error) { + b := &IngressApplyConfiguration{} + err := managedfields.ExtractInto(ingress, internal.Parser().Type("io.k8s.api.networking.v1beta1.Ingress"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(ingress.Name) + b.WithNamespace(ingress.Namespace) + + b.WithKind("Ingress") + b.WithAPIVersion("networking.k8s.io/v1beta1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *IngressApplyConfiguration) WithKind(value string) *IngressApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *IngressApplyConfiguration) WithAPIVersion(value string) *IngressApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *IngressApplyConfiguration) WithName(value string) *IngressApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *IngressApplyConfiguration) WithGenerateName(value string) *IngressApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *IngressApplyConfiguration) WithNamespace(value string) *IngressApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *IngressApplyConfiguration) WithSelfLink(value string) *IngressApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *IngressApplyConfiguration) WithUID(value types.UID) *IngressApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *IngressApplyConfiguration) WithResourceVersion(value string) *IngressApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *IngressApplyConfiguration) WithGeneration(value int64) *IngressApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *IngressApplyConfiguration) WithCreationTimestamp(value metav1.Time) *IngressApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *IngressApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *IngressApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *IngressApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *IngressApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *IngressApplyConfiguration) WithLabels(entries map[string]string) *IngressApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *IngressApplyConfiguration) WithAnnotations(entries map[string]string) *IngressApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *IngressApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *IngressApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *IngressApplyConfiguration) WithFinalizers(values ...string) *IngressApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *IngressApplyConfiguration) WithClusterName(value string) *IngressApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *IngressApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *IngressApplyConfiguration) WithSpec(value *IngressSpecApplyConfiguration) *IngressApplyConfiguration { + b.Spec = value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *IngressApplyConfiguration) WithStatus(value *IngressStatusApplyConfiguration) *IngressApplyConfiguration { + b.Status = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/ingressbackend.go b/vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/ingressbackend.go new file mode 100644 index 000000000000..f19c2f2ee24a --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/ingressbackend.go @@ -0,0 +1,62 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + intstr "k8s.io/apimachinery/pkg/util/intstr" + v1 "k8s.io/client-go/applyconfigurations/core/v1" +) + +// IngressBackendApplyConfiguration represents an declarative configuration of the IngressBackend type for use +// with apply. +type IngressBackendApplyConfiguration struct { + ServiceName *string `json:"serviceName,omitempty"` + ServicePort *intstr.IntOrString `json:"servicePort,omitempty"` + Resource *v1.TypedLocalObjectReferenceApplyConfiguration `json:"resource,omitempty"` +} + +// IngressBackendApplyConfiguration constructs an declarative configuration of the IngressBackend type for use with +// apply. +func IngressBackend() *IngressBackendApplyConfiguration { + return &IngressBackendApplyConfiguration{} +} + +// WithServiceName sets the ServiceName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ServiceName field is set to the value of the last call. +func (b *IngressBackendApplyConfiguration) WithServiceName(value string) *IngressBackendApplyConfiguration { + b.ServiceName = &value + return b +} + +// WithServicePort sets the ServicePort field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ServicePort field is set to the value of the last call. +func (b *IngressBackendApplyConfiguration) WithServicePort(value intstr.IntOrString) *IngressBackendApplyConfiguration { + b.ServicePort = &value + return b +} + +// WithResource sets the Resource field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Resource field is set to the value of the last call. +func (b *IngressBackendApplyConfiguration) WithResource(value *v1.TypedLocalObjectReferenceApplyConfiguration) *IngressBackendApplyConfiguration { + b.Resource = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/ingressclass.go b/vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/ingressclass.go new file mode 100644 index 000000000000..f80fae107dd1 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/ingressclass.go @@ -0,0 +1,254 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + networkingv1beta1 "k8s.io/api/networking/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// IngressClassApplyConfiguration represents an declarative configuration of the IngressClass type for use +// with apply. +type IngressClassApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *IngressClassSpecApplyConfiguration `json:"spec,omitempty"` +} + +// IngressClass constructs an declarative configuration of the IngressClass type for use with +// apply. +func IngressClass(name string) *IngressClassApplyConfiguration { + b := &IngressClassApplyConfiguration{} + b.WithName(name) + b.WithKind("IngressClass") + b.WithAPIVersion("networking.k8s.io/v1beta1") + return b +} + +// ExtractIngressClass extracts the applied configuration owned by fieldManager from +// ingressClass. If no managedFields are found in ingressClass for fieldManager, a +// IngressClassApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// ingressClass must be a unmodified IngressClass API object that was retrieved from the Kubernetes API. +// ExtractIngressClass provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractIngressClass(ingressClass *networkingv1beta1.IngressClass, fieldManager string) (*IngressClassApplyConfiguration, error) { + b := &IngressClassApplyConfiguration{} + err := managedfields.ExtractInto(ingressClass, internal.Parser().Type("io.k8s.api.networking.v1beta1.IngressClass"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(ingressClass.Name) + + b.WithKind("IngressClass") + b.WithAPIVersion("networking.k8s.io/v1beta1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *IngressClassApplyConfiguration) WithKind(value string) *IngressClassApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *IngressClassApplyConfiguration) WithAPIVersion(value string) *IngressClassApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *IngressClassApplyConfiguration) WithName(value string) *IngressClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *IngressClassApplyConfiguration) WithGenerateName(value string) *IngressClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *IngressClassApplyConfiguration) WithNamespace(value string) *IngressClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *IngressClassApplyConfiguration) WithSelfLink(value string) *IngressClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *IngressClassApplyConfiguration) WithUID(value types.UID) *IngressClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *IngressClassApplyConfiguration) WithResourceVersion(value string) *IngressClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *IngressClassApplyConfiguration) WithGeneration(value int64) *IngressClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *IngressClassApplyConfiguration) WithCreationTimestamp(value metav1.Time) *IngressClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *IngressClassApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *IngressClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *IngressClassApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *IngressClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *IngressClassApplyConfiguration) WithLabels(entries map[string]string) *IngressClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *IngressClassApplyConfiguration) WithAnnotations(entries map[string]string) *IngressClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *IngressClassApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *IngressClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *IngressClassApplyConfiguration) WithFinalizers(values ...string) *IngressClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *IngressClassApplyConfiguration) WithClusterName(value string) *IngressClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *IngressClassApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *IngressClassApplyConfiguration) WithSpec(value *IngressClassSpecApplyConfiguration) *IngressClassApplyConfiguration { + b.Spec = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/ingressclassparametersreference.go b/vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/ingressclassparametersreference.go new file mode 100644 index 000000000000..e6ca805e4721 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/ingressclassparametersreference.go @@ -0,0 +1,75 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// IngressClassParametersReferenceApplyConfiguration represents an declarative configuration of the IngressClassParametersReference type for use +// with apply. +type IngressClassParametersReferenceApplyConfiguration struct { + APIGroup *string `json:"apiGroup,omitempty"` + Kind *string `json:"kind,omitempty"` + Name *string `json:"name,omitempty"` + Scope *string `json:"scope,omitempty"` + Namespace *string `json:"namespace,omitempty"` +} + +// IngressClassParametersReferenceApplyConfiguration constructs an declarative configuration of the IngressClassParametersReference type for use with +// apply. +func IngressClassParametersReference() *IngressClassParametersReferenceApplyConfiguration { + return &IngressClassParametersReferenceApplyConfiguration{} +} + +// WithAPIGroup sets the APIGroup field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIGroup field is set to the value of the last call. +func (b *IngressClassParametersReferenceApplyConfiguration) WithAPIGroup(value string) *IngressClassParametersReferenceApplyConfiguration { + b.APIGroup = &value + return b +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *IngressClassParametersReferenceApplyConfiguration) WithKind(value string) *IngressClassParametersReferenceApplyConfiguration { + b.Kind = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *IngressClassParametersReferenceApplyConfiguration) WithName(value string) *IngressClassParametersReferenceApplyConfiguration { + b.Name = &value + return b +} + +// WithScope sets the Scope field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Scope field is set to the value of the last call. +func (b *IngressClassParametersReferenceApplyConfiguration) WithScope(value string) *IngressClassParametersReferenceApplyConfiguration { + b.Scope = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *IngressClassParametersReferenceApplyConfiguration) WithNamespace(value string) *IngressClassParametersReferenceApplyConfiguration { + b.Namespace = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/ingressclassspec.go b/vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/ingressclassspec.go new file mode 100644 index 000000000000..51040462cae0 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/ingressclassspec.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// IngressClassSpecApplyConfiguration represents an declarative configuration of the IngressClassSpec type for use +// with apply. +type IngressClassSpecApplyConfiguration struct { + Controller *string `json:"controller,omitempty"` + Parameters *IngressClassParametersReferenceApplyConfiguration `json:"parameters,omitempty"` +} + +// IngressClassSpecApplyConfiguration constructs an declarative configuration of the IngressClassSpec type for use with +// apply. +func IngressClassSpec() *IngressClassSpecApplyConfiguration { + return &IngressClassSpecApplyConfiguration{} +} + +// WithController sets the Controller field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Controller field is set to the value of the last call. +func (b *IngressClassSpecApplyConfiguration) WithController(value string) *IngressClassSpecApplyConfiguration { + b.Controller = &value + return b +} + +// WithParameters sets the Parameters field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Parameters field is set to the value of the last call. +func (b *IngressClassSpecApplyConfiguration) WithParameters(value *IngressClassParametersReferenceApplyConfiguration) *IngressClassSpecApplyConfiguration { + b.Parameters = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/ingressrule.go b/vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/ingressrule.go new file mode 100644 index 000000000000..015541eeb971 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/ingressrule.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// IngressRuleApplyConfiguration represents an declarative configuration of the IngressRule type for use +// with apply. +type IngressRuleApplyConfiguration struct { + Host *string `json:"host,omitempty"` + IngressRuleValueApplyConfiguration `json:",omitempty,inline"` +} + +// IngressRuleApplyConfiguration constructs an declarative configuration of the IngressRule type for use with +// apply. +func IngressRule() *IngressRuleApplyConfiguration { + return &IngressRuleApplyConfiguration{} +} + +// WithHost sets the Host field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Host field is set to the value of the last call. +func (b *IngressRuleApplyConfiguration) WithHost(value string) *IngressRuleApplyConfiguration { + b.Host = &value + return b +} + +// WithHTTP sets the HTTP field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the HTTP field is set to the value of the last call. +func (b *IngressRuleApplyConfiguration) WithHTTP(value *HTTPIngressRuleValueApplyConfiguration) *IngressRuleApplyConfiguration { + b.HTTP = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/ingressrulevalue.go b/vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/ingressrulevalue.go new file mode 100644 index 000000000000..2d03c7b13220 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/ingressrulevalue.go @@ -0,0 +1,39 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// IngressRuleValueApplyConfiguration represents an declarative configuration of the IngressRuleValue type for use +// with apply. +type IngressRuleValueApplyConfiguration struct { + HTTP *HTTPIngressRuleValueApplyConfiguration `json:"http,omitempty"` +} + +// IngressRuleValueApplyConfiguration constructs an declarative configuration of the IngressRuleValue type for use with +// apply. +func IngressRuleValue() *IngressRuleValueApplyConfiguration { + return &IngressRuleValueApplyConfiguration{} +} + +// WithHTTP sets the HTTP field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the HTTP field is set to the value of the last call. +func (b *IngressRuleValueApplyConfiguration) WithHTTP(value *HTTPIngressRuleValueApplyConfiguration) *IngressRuleValueApplyConfiguration { + b.HTTP = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/ingressspec.go b/vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/ingressspec.go new file mode 100644 index 000000000000..1ab4d8bb73b0 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/ingressspec.go @@ -0,0 +1,76 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// IngressSpecApplyConfiguration represents an declarative configuration of the IngressSpec type for use +// with apply. +type IngressSpecApplyConfiguration struct { + IngressClassName *string `json:"ingressClassName,omitempty"` + Backend *IngressBackendApplyConfiguration `json:"backend,omitempty"` + TLS []IngressTLSApplyConfiguration `json:"tls,omitempty"` + Rules []IngressRuleApplyConfiguration `json:"rules,omitempty"` +} + +// IngressSpecApplyConfiguration constructs an declarative configuration of the IngressSpec type for use with +// apply. +func IngressSpec() *IngressSpecApplyConfiguration { + return &IngressSpecApplyConfiguration{} +} + +// WithIngressClassName sets the IngressClassName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the IngressClassName field is set to the value of the last call. +func (b *IngressSpecApplyConfiguration) WithIngressClassName(value string) *IngressSpecApplyConfiguration { + b.IngressClassName = &value + return b +} + +// WithBackend sets the Backend field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Backend field is set to the value of the last call. +func (b *IngressSpecApplyConfiguration) WithBackend(value *IngressBackendApplyConfiguration) *IngressSpecApplyConfiguration { + b.Backend = value + return b +} + +// WithTLS adds the given value to the TLS field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the TLS field. +func (b *IngressSpecApplyConfiguration) WithTLS(values ...*IngressTLSApplyConfiguration) *IngressSpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithTLS") + } + b.TLS = append(b.TLS, *values[i]) + } + return b +} + +// WithRules adds the given value to the Rules field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Rules field. +func (b *IngressSpecApplyConfiguration) WithRules(values ...*IngressRuleApplyConfiguration) *IngressSpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithRules") + } + b.Rules = append(b.Rules, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/ingressstatus.go b/vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/ingressstatus.go new file mode 100644 index 000000000000..941769594ec3 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/ingressstatus.go @@ -0,0 +1,43 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1 "k8s.io/client-go/applyconfigurations/core/v1" +) + +// IngressStatusApplyConfiguration represents an declarative configuration of the IngressStatus type for use +// with apply. +type IngressStatusApplyConfiguration struct { + LoadBalancer *v1.LoadBalancerStatusApplyConfiguration `json:"loadBalancer,omitempty"` +} + +// IngressStatusApplyConfiguration constructs an declarative configuration of the IngressStatus type for use with +// apply. +func IngressStatus() *IngressStatusApplyConfiguration { + return &IngressStatusApplyConfiguration{} +} + +// WithLoadBalancer sets the LoadBalancer field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the LoadBalancer field is set to the value of the last call. +func (b *IngressStatusApplyConfiguration) WithLoadBalancer(value *v1.LoadBalancerStatusApplyConfiguration) *IngressStatusApplyConfiguration { + b.LoadBalancer = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/ingresstls.go b/vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/ingresstls.go new file mode 100644 index 000000000000..8ca93a0bc2d1 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/ingresstls.go @@ -0,0 +1,50 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// IngressTLSApplyConfiguration represents an declarative configuration of the IngressTLS type for use +// with apply. +type IngressTLSApplyConfiguration struct { + Hosts []string `json:"hosts,omitempty"` + SecretName *string `json:"secretName,omitempty"` +} + +// IngressTLSApplyConfiguration constructs an declarative configuration of the IngressTLS type for use with +// apply. +func IngressTLS() *IngressTLSApplyConfiguration { + return &IngressTLSApplyConfiguration{} +} + +// WithHosts adds the given value to the Hosts field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Hosts field. +func (b *IngressTLSApplyConfiguration) WithHosts(values ...string) *IngressTLSApplyConfiguration { + for i := range values { + b.Hosts = append(b.Hosts, values[i]) + } + return b +} + +// WithSecretName sets the SecretName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SecretName field is set to the value of the last call. +func (b *IngressTLSApplyConfiguration) WithSecretName(value string) *IngressTLSApplyConfiguration { + b.SecretName = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/node/v1/overhead.go b/vendor/k8s.io/client-go/applyconfigurations/node/v1/overhead.go new file mode 100644 index 000000000000..9eec0026715e --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/node/v1/overhead.go @@ -0,0 +1,43 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/core/v1" +) + +// OverheadApplyConfiguration represents an declarative configuration of the Overhead type for use +// with apply. +type OverheadApplyConfiguration struct { + PodFixed *v1.ResourceList `json:"podFixed,omitempty"` +} + +// OverheadApplyConfiguration constructs an declarative configuration of the Overhead type for use with +// apply. +func Overhead() *OverheadApplyConfiguration { + return &OverheadApplyConfiguration{} +} + +// WithPodFixed sets the PodFixed field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PodFixed field is set to the value of the last call. +func (b *OverheadApplyConfiguration) WithPodFixed(value v1.ResourceList) *OverheadApplyConfiguration { + b.PodFixed = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/node/v1/runtimeclass.go b/vendor/k8s.io/client-go/applyconfigurations/node/v1/runtimeclass.go new file mode 100644 index 000000000000..9f6cbef595c6 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/node/v1/runtimeclass.go @@ -0,0 +1,272 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + apinodev1 "k8s.io/api/node/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// RuntimeClassApplyConfiguration represents an declarative configuration of the RuntimeClass type for use +// with apply. +type RuntimeClassApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Handler *string `json:"handler,omitempty"` + Overhead *OverheadApplyConfiguration `json:"overhead,omitempty"` + Scheduling *SchedulingApplyConfiguration `json:"scheduling,omitempty"` +} + +// RuntimeClass constructs an declarative configuration of the RuntimeClass type for use with +// apply. +func RuntimeClass(name string) *RuntimeClassApplyConfiguration { + b := &RuntimeClassApplyConfiguration{} + b.WithName(name) + b.WithKind("RuntimeClass") + b.WithAPIVersion("node.k8s.io/v1") + return b +} + +// ExtractRuntimeClass extracts the applied configuration owned by fieldManager from +// runtimeClass. If no managedFields are found in runtimeClass for fieldManager, a +// RuntimeClassApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// runtimeClass must be a unmodified RuntimeClass API object that was retrieved from the Kubernetes API. +// ExtractRuntimeClass provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractRuntimeClass(runtimeClass *apinodev1.RuntimeClass, fieldManager string) (*RuntimeClassApplyConfiguration, error) { + b := &RuntimeClassApplyConfiguration{} + err := managedfields.ExtractInto(runtimeClass, internal.Parser().Type("io.k8s.api.node.v1.RuntimeClass"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(runtimeClass.Name) + + b.WithKind("RuntimeClass") + b.WithAPIVersion("node.k8s.io/v1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *RuntimeClassApplyConfiguration) WithKind(value string) *RuntimeClassApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *RuntimeClassApplyConfiguration) WithAPIVersion(value string) *RuntimeClassApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *RuntimeClassApplyConfiguration) WithName(value string) *RuntimeClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *RuntimeClassApplyConfiguration) WithGenerateName(value string) *RuntimeClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *RuntimeClassApplyConfiguration) WithNamespace(value string) *RuntimeClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *RuntimeClassApplyConfiguration) WithSelfLink(value string) *RuntimeClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *RuntimeClassApplyConfiguration) WithUID(value types.UID) *RuntimeClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *RuntimeClassApplyConfiguration) WithResourceVersion(value string) *RuntimeClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *RuntimeClassApplyConfiguration) WithGeneration(value int64) *RuntimeClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *RuntimeClassApplyConfiguration) WithCreationTimestamp(value metav1.Time) *RuntimeClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *RuntimeClassApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *RuntimeClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *RuntimeClassApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *RuntimeClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *RuntimeClassApplyConfiguration) WithLabels(entries map[string]string) *RuntimeClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *RuntimeClassApplyConfiguration) WithAnnotations(entries map[string]string) *RuntimeClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *RuntimeClassApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *RuntimeClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *RuntimeClassApplyConfiguration) WithFinalizers(values ...string) *RuntimeClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *RuntimeClassApplyConfiguration) WithClusterName(value string) *RuntimeClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *RuntimeClassApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithHandler sets the Handler field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Handler field is set to the value of the last call. +func (b *RuntimeClassApplyConfiguration) WithHandler(value string) *RuntimeClassApplyConfiguration { + b.Handler = &value + return b +} + +// WithOverhead sets the Overhead field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Overhead field is set to the value of the last call. +func (b *RuntimeClassApplyConfiguration) WithOverhead(value *OverheadApplyConfiguration) *RuntimeClassApplyConfiguration { + b.Overhead = value + return b +} + +// WithScheduling sets the Scheduling field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Scheduling field is set to the value of the last call. +func (b *RuntimeClassApplyConfiguration) WithScheduling(value *SchedulingApplyConfiguration) *RuntimeClassApplyConfiguration { + b.Scheduling = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/node/v1/scheduling.go b/vendor/k8s.io/client-go/applyconfigurations/node/v1/scheduling.go new file mode 100644 index 000000000000..e01db85d7b04 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/node/v1/scheduling.go @@ -0,0 +1,63 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/client-go/applyconfigurations/core/v1" +) + +// SchedulingApplyConfiguration represents an declarative configuration of the Scheduling type for use +// with apply. +type SchedulingApplyConfiguration struct { + NodeSelector map[string]string `json:"nodeSelector,omitempty"` + Tolerations []v1.TolerationApplyConfiguration `json:"tolerations,omitempty"` +} + +// SchedulingApplyConfiguration constructs an declarative configuration of the Scheduling type for use with +// apply. +func Scheduling() *SchedulingApplyConfiguration { + return &SchedulingApplyConfiguration{} +} + +// WithNodeSelector puts the entries into the NodeSelector field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the NodeSelector field, +// overwriting an existing map entries in NodeSelector field with the same key. +func (b *SchedulingApplyConfiguration) WithNodeSelector(entries map[string]string) *SchedulingApplyConfiguration { + if b.NodeSelector == nil && len(entries) > 0 { + b.NodeSelector = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.NodeSelector[k] = v + } + return b +} + +// WithTolerations adds the given value to the Tolerations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Tolerations field. +func (b *SchedulingApplyConfiguration) WithTolerations(values ...*v1.TolerationApplyConfiguration) *SchedulingApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithTolerations") + } + b.Tolerations = append(b.Tolerations, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/node/v1alpha1/overhead.go b/vendor/k8s.io/client-go/applyconfigurations/node/v1alpha1/overhead.go new file mode 100644 index 000000000000..1ddaa64acc1b --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/node/v1alpha1/overhead.go @@ -0,0 +1,43 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + v1 "k8s.io/api/core/v1" +) + +// OverheadApplyConfiguration represents an declarative configuration of the Overhead type for use +// with apply. +type OverheadApplyConfiguration struct { + PodFixed *v1.ResourceList `json:"podFixed,omitempty"` +} + +// OverheadApplyConfiguration constructs an declarative configuration of the Overhead type for use with +// apply. +func Overhead() *OverheadApplyConfiguration { + return &OverheadApplyConfiguration{} +} + +// WithPodFixed sets the PodFixed field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PodFixed field is set to the value of the last call. +func (b *OverheadApplyConfiguration) WithPodFixed(value v1.ResourceList) *OverheadApplyConfiguration { + b.PodFixed = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/node/v1alpha1/runtimeclass.go b/vendor/k8s.io/client-go/applyconfigurations/node/v1alpha1/runtimeclass.go new file mode 100644 index 000000000000..d40ba68b930c --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/node/v1alpha1/runtimeclass.go @@ -0,0 +1,254 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + nodev1alpha1 "k8s.io/api/node/v1alpha1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// RuntimeClassApplyConfiguration represents an declarative configuration of the RuntimeClass type for use +// with apply. +type RuntimeClassApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *RuntimeClassSpecApplyConfiguration `json:"spec,omitempty"` +} + +// RuntimeClass constructs an declarative configuration of the RuntimeClass type for use with +// apply. +func RuntimeClass(name string) *RuntimeClassApplyConfiguration { + b := &RuntimeClassApplyConfiguration{} + b.WithName(name) + b.WithKind("RuntimeClass") + b.WithAPIVersion("node.k8s.io/v1alpha1") + return b +} + +// ExtractRuntimeClass extracts the applied configuration owned by fieldManager from +// runtimeClass. If no managedFields are found in runtimeClass for fieldManager, a +// RuntimeClassApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// runtimeClass must be a unmodified RuntimeClass API object that was retrieved from the Kubernetes API. +// ExtractRuntimeClass provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractRuntimeClass(runtimeClass *nodev1alpha1.RuntimeClass, fieldManager string) (*RuntimeClassApplyConfiguration, error) { + b := &RuntimeClassApplyConfiguration{} + err := managedfields.ExtractInto(runtimeClass, internal.Parser().Type("io.k8s.api.node.v1alpha1.RuntimeClass"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(runtimeClass.Name) + + b.WithKind("RuntimeClass") + b.WithAPIVersion("node.k8s.io/v1alpha1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *RuntimeClassApplyConfiguration) WithKind(value string) *RuntimeClassApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *RuntimeClassApplyConfiguration) WithAPIVersion(value string) *RuntimeClassApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *RuntimeClassApplyConfiguration) WithName(value string) *RuntimeClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *RuntimeClassApplyConfiguration) WithGenerateName(value string) *RuntimeClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *RuntimeClassApplyConfiguration) WithNamespace(value string) *RuntimeClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *RuntimeClassApplyConfiguration) WithSelfLink(value string) *RuntimeClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *RuntimeClassApplyConfiguration) WithUID(value types.UID) *RuntimeClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *RuntimeClassApplyConfiguration) WithResourceVersion(value string) *RuntimeClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *RuntimeClassApplyConfiguration) WithGeneration(value int64) *RuntimeClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *RuntimeClassApplyConfiguration) WithCreationTimestamp(value metav1.Time) *RuntimeClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *RuntimeClassApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *RuntimeClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *RuntimeClassApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *RuntimeClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *RuntimeClassApplyConfiguration) WithLabels(entries map[string]string) *RuntimeClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *RuntimeClassApplyConfiguration) WithAnnotations(entries map[string]string) *RuntimeClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *RuntimeClassApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *RuntimeClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *RuntimeClassApplyConfiguration) WithFinalizers(values ...string) *RuntimeClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *RuntimeClassApplyConfiguration) WithClusterName(value string) *RuntimeClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *RuntimeClassApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *RuntimeClassApplyConfiguration) WithSpec(value *RuntimeClassSpecApplyConfiguration) *RuntimeClassApplyConfiguration { + b.Spec = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/node/v1alpha1/runtimeclassspec.go b/vendor/k8s.io/client-go/applyconfigurations/node/v1alpha1/runtimeclassspec.go new file mode 100644 index 000000000000..86e8585ad36f --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/node/v1alpha1/runtimeclassspec.go @@ -0,0 +1,57 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +// RuntimeClassSpecApplyConfiguration represents an declarative configuration of the RuntimeClassSpec type for use +// with apply. +type RuntimeClassSpecApplyConfiguration struct { + RuntimeHandler *string `json:"runtimeHandler,omitempty"` + Overhead *OverheadApplyConfiguration `json:"overhead,omitempty"` + Scheduling *SchedulingApplyConfiguration `json:"scheduling,omitempty"` +} + +// RuntimeClassSpecApplyConfiguration constructs an declarative configuration of the RuntimeClassSpec type for use with +// apply. +func RuntimeClassSpec() *RuntimeClassSpecApplyConfiguration { + return &RuntimeClassSpecApplyConfiguration{} +} + +// WithRuntimeHandler sets the RuntimeHandler field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RuntimeHandler field is set to the value of the last call. +func (b *RuntimeClassSpecApplyConfiguration) WithRuntimeHandler(value string) *RuntimeClassSpecApplyConfiguration { + b.RuntimeHandler = &value + return b +} + +// WithOverhead sets the Overhead field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Overhead field is set to the value of the last call. +func (b *RuntimeClassSpecApplyConfiguration) WithOverhead(value *OverheadApplyConfiguration) *RuntimeClassSpecApplyConfiguration { + b.Overhead = value + return b +} + +// WithScheduling sets the Scheduling field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Scheduling field is set to the value of the last call. +func (b *RuntimeClassSpecApplyConfiguration) WithScheduling(value *SchedulingApplyConfiguration) *RuntimeClassSpecApplyConfiguration { + b.Scheduling = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/node/v1alpha1/scheduling.go b/vendor/k8s.io/client-go/applyconfigurations/node/v1alpha1/scheduling.go new file mode 100644 index 000000000000..d4117d6bc7b8 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/node/v1alpha1/scheduling.go @@ -0,0 +1,63 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + v1 "k8s.io/client-go/applyconfigurations/core/v1" +) + +// SchedulingApplyConfiguration represents an declarative configuration of the Scheduling type for use +// with apply. +type SchedulingApplyConfiguration struct { + NodeSelector map[string]string `json:"nodeSelector,omitempty"` + Tolerations []v1.TolerationApplyConfiguration `json:"tolerations,omitempty"` +} + +// SchedulingApplyConfiguration constructs an declarative configuration of the Scheduling type for use with +// apply. +func Scheduling() *SchedulingApplyConfiguration { + return &SchedulingApplyConfiguration{} +} + +// WithNodeSelector puts the entries into the NodeSelector field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the NodeSelector field, +// overwriting an existing map entries in NodeSelector field with the same key. +func (b *SchedulingApplyConfiguration) WithNodeSelector(entries map[string]string) *SchedulingApplyConfiguration { + if b.NodeSelector == nil && len(entries) > 0 { + b.NodeSelector = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.NodeSelector[k] = v + } + return b +} + +// WithTolerations adds the given value to the Tolerations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Tolerations field. +func (b *SchedulingApplyConfiguration) WithTolerations(values ...*v1.TolerationApplyConfiguration) *SchedulingApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithTolerations") + } + b.Tolerations = append(b.Tolerations, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/node/v1beta1/overhead.go b/vendor/k8s.io/client-go/applyconfigurations/node/v1beta1/overhead.go new file mode 100644 index 000000000000..e8c489550558 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/node/v1beta1/overhead.go @@ -0,0 +1,43 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1 "k8s.io/api/core/v1" +) + +// OverheadApplyConfiguration represents an declarative configuration of the Overhead type for use +// with apply. +type OverheadApplyConfiguration struct { + PodFixed *v1.ResourceList `json:"podFixed,omitempty"` +} + +// OverheadApplyConfiguration constructs an declarative configuration of the Overhead type for use with +// apply. +func Overhead() *OverheadApplyConfiguration { + return &OverheadApplyConfiguration{} +} + +// WithPodFixed sets the PodFixed field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PodFixed field is set to the value of the last call. +func (b *OverheadApplyConfiguration) WithPodFixed(value v1.ResourceList) *OverheadApplyConfiguration { + b.PodFixed = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/node/v1beta1/runtimeclass.go b/vendor/k8s.io/client-go/applyconfigurations/node/v1beta1/runtimeclass.go new file mode 100644 index 000000000000..b56bc0ce7f56 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/node/v1beta1/runtimeclass.go @@ -0,0 +1,272 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + nodev1beta1 "k8s.io/api/node/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// RuntimeClassApplyConfiguration represents an declarative configuration of the RuntimeClass type for use +// with apply. +type RuntimeClassApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Handler *string `json:"handler,omitempty"` + Overhead *OverheadApplyConfiguration `json:"overhead,omitempty"` + Scheduling *SchedulingApplyConfiguration `json:"scheduling,omitempty"` +} + +// RuntimeClass constructs an declarative configuration of the RuntimeClass type for use with +// apply. +func RuntimeClass(name string) *RuntimeClassApplyConfiguration { + b := &RuntimeClassApplyConfiguration{} + b.WithName(name) + b.WithKind("RuntimeClass") + b.WithAPIVersion("node.k8s.io/v1beta1") + return b +} + +// ExtractRuntimeClass extracts the applied configuration owned by fieldManager from +// runtimeClass. If no managedFields are found in runtimeClass for fieldManager, a +// RuntimeClassApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// runtimeClass must be a unmodified RuntimeClass API object that was retrieved from the Kubernetes API. +// ExtractRuntimeClass provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractRuntimeClass(runtimeClass *nodev1beta1.RuntimeClass, fieldManager string) (*RuntimeClassApplyConfiguration, error) { + b := &RuntimeClassApplyConfiguration{} + err := managedfields.ExtractInto(runtimeClass, internal.Parser().Type("io.k8s.api.node.v1beta1.RuntimeClass"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(runtimeClass.Name) + + b.WithKind("RuntimeClass") + b.WithAPIVersion("node.k8s.io/v1beta1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *RuntimeClassApplyConfiguration) WithKind(value string) *RuntimeClassApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *RuntimeClassApplyConfiguration) WithAPIVersion(value string) *RuntimeClassApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *RuntimeClassApplyConfiguration) WithName(value string) *RuntimeClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *RuntimeClassApplyConfiguration) WithGenerateName(value string) *RuntimeClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *RuntimeClassApplyConfiguration) WithNamespace(value string) *RuntimeClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *RuntimeClassApplyConfiguration) WithSelfLink(value string) *RuntimeClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *RuntimeClassApplyConfiguration) WithUID(value types.UID) *RuntimeClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *RuntimeClassApplyConfiguration) WithResourceVersion(value string) *RuntimeClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *RuntimeClassApplyConfiguration) WithGeneration(value int64) *RuntimeClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *RuntimeClassApplyConfiguration) WithCreationTimestamp(value metav1.Time) *RuntimeClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *RuntimeClassApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *RuntimeClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *RuntimeClassApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *RuntimeClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *RuntimeClassApplyConfiguration) WithLabels(entries map[string]string) *RuntimeClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *RuntimeClassApplyConfiguration) WithAnnotations(entries map[string]string) *RuntimeClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *RuntimeClassApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *RuntimeClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *RuntimeClassApplyConfiguration) WithFinalizers(values ...string) *RuntimeClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *RuntimeClassApplyConfiguration) WithClusterName(value string) *RuntimeClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *RuntimeClassApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithHandler sets the Handler field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Handler field is set to the value of the last call. +func (b *RuntimeClassApplyConfiguration) WithHandler(value string) *RuntimeClassApplyConfiguration { + b.Handler = &value + return b +} + +// WithOverhead sets the Overhead field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Overhead field is set to the value of the last call. +func (b *RuntimeClassApplyConfiguration) WithOverhead(value *OverheadApplyConfiguration) *RuntimeClassApplyConfiguration { + b.Overhead = value + return b +} + +// WithScheduling sets the Scheduling field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Scheduling field is set to the value of the last call. +func (b *RuntimeClassApplyConfiguration) WithScheduling(value *SchedulingApplyConfiguration) *RuntimeClassApplyConfiguration { + b.Scheduling = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/node/v1beta1/scheduling.go b/vendor/k8s.io/client-go/applyconfigurations/node/v1beta1/scheduling.go new file mode 100644 index 000000000000..10831d0ff561 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/node/v1beta1/scheduling.go @@ -0,0 +1,63 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1 "k8s.io/client-go/applyconfigurations/core/v1" +) + +// SchedulingApplyConfiguration represents an declarative configuration of the Scheduling type for use +// with apply. +type SchedulingApplyConfiguration struct { + NodeSelector map[string]string `json:"nodeSelector,omitempty"` + Tolerations []v1.TolerationApplyConfiguration `json:"tolerations,omitempty"` +} + +// SchedulingApplyConfiguration constructs an declarative configuration of the Scheduling type for use with +// apply. +func Scheduling() *SchedulingApplyConfiguration { + return &SchedulingApplyConfiguration{} +} + +// WithNodeSelector puts the entries into the NodeSelector field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the NodeSelector field, +// overwriting an existing map entries in NodeSelector field with the same key. +func (b *SchedulingApplyConfiguration) WithNodeSelector(entries map[string]string) *SchedulingApplyConfiguration { + if b.NodeSelector == nil && len(entries) > 0 { + b.NodeSelector = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.NodeSelector[k] = v + } + return b +} + +// WithTolerations adds the given value to the Tolerations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Tolerations field. +func (b *SchedulingApplyConfiguration) WithTolerations(values ...*v1.TolerationApplyConfiguration) *SchedulingApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithTolerations") + } + b.Tolerations = append(b.Tolerations, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/policy/v1/poddisruptionbudget.go b/vendor/k8s.io/client-go/applyconfigurations/policy/v1/poddisruptionbudget.go new file mode 100644 index 000000000000..3233f5386ed5 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/policy/v1/poddisruptionbudget.go @@ -0,0 +1,265 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + apipolicyv1 "k8s.io/api/policy/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// PodDisruptionBudgetApplyConfiguration represents an declarative configuration of the PodDisruptionBudget type for use +// with apply. +type PodDisruptionBudgetApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *PodDisruptionBudgetSpecApplyConfiguration `json:"spec,omitempty"` + Status *PodDisruptionBudgetStatusApplyConfiguration `json:"status,omitempty"` +} + +// PodDisruptionBudget constructs an declarative configuration of the PodDisruptionBudget type for use with +// apply. +func PodDisruptionBudget(name, namespace string) *PodDisruptionBudgetApplyConfiguration { + b := &PodDisruptionBudgetApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("PodDisruptionBudget") + b.WithAPIVersion("policy/v1") + return b +} + +// ExtractPodDisruptionBudget extracts the applied configuration owned by fieldManager from +// podDisruptionBudget. If no managedFields are found in podDisruptionBudget for fieldManager, a +// PodDisruptionBudgetApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// podDisruptionBudget must be a unmodified PodDisruptionBudget API object that was retrieved from the Kubernetes API. +// ExtractPodDisruptionBudget provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractPodDisruptionBudget(podDisruptionBudget *apipolicyv1.PodDisruptionBudget, fieldManager string) (*PodDisruptionBudgetApplyConfiguration, error) { + b := &PodDisruptionBudgetApplyConfiguration{} + err := managedfields.ExtractInto(podDisruptionBudget, internal.Parser().Type("io.k8s.api.policy.v1.PodDisruptionBudget"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(podDisruptionBudget.Name) + b.WithNamespace(podDisruptionBudget.Namespace) + + b.WithKind("PodDisruptionBudget") + b.WithAPIVersion("policy/v1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *PodDisruptionBudgetApplyConfiguration) WithKind(value string) *PodDisruptionBudgetApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *PodDisruptionBudgetApplyConfiguration) WithAPIVersion(value string) *PodDisruptionBudgetApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *PodDisruptionBudgetApplyConfiguration) WithName(value string) *PodDisruptionBudgetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *PodDisruptionBudgetApplyConfiguration) WithGenerateName(value string) *PodDisruptionBudgetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *PodDisruptionBudgetApplyConfiguration) WithNamespace(value string) *PodDisruptionBudgetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *PodDisruptionBudgetApplyConfiguration) WithSelfLink(value string) *PodDisruptionBudgetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *PodDisruptionBudgetApplyConfiguration) WithUID(value types.UID) *PodDisruptionBudgetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *PodDisruptionBudgetApplyConfiguration) WithResourceVersion(value string) *PodDisruptionBudgetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *PodDisruptionBudgetApplyConfiguration) WithGeneration(value int64) *PodDisruptionBudgetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *PodDisruptionBudgetApplyConfiguration) WithCreationTimestamp(value metav1.Time) *PodDisruptionBudgetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *PodDisruptionBudgetApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *PodDisruptionBudgetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *PodDisruptionBudgetApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *PodDisruptionBudgetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *PodDisruptionBudgetApplyConfiguration) WithLabels(entries map[string]string) *PodDisruptionBudgetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *PodDisruptionBudgetApplyConfiguration) WithAnnotations(entries map[string]string) *PodDisruptionBudgetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *PodDisruptionBudgetApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *PodDisruptionBudgetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *PodDisruptionBudgetApplyConfiguration) WithFinalizers(values ...string) *PodDisruptionBudgetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *PodDisruptionBudgetApplyConfiguration) WithClusterName(value string) *PodDisruptionBudgetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *PodDisruptionBudgetApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *PodDisruptionBudgetApplyConfiguration) WithSpec(value *PodDisruptionBudgetSpecApplyConfiguration) *PodDisruptionBudgetApplyConfiguration { + b.Spec = value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *PodDisruptionBudgetApplyConfiguration) WithStatus(value *PodDisruptionBudgetStatusApplyConfiguration) *PodDisruptionBudgetApplyConfiguration { + b.Status = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/policy/v1/poddisruptionbudgetspec.go b/vendor/k8s.io/client-go/applyconfigurations/policy/v1/poddisruptionbudgetspec.go new file mode 100644 index 000000000000..e2f49f528cd4 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/policy/v1/poddisruptionbudgetspec.go @@ -0,0 +1,62 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + intstr "k8s.io/apimachinery/pkg/util/intstr" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// PodDisruptionBudgetSpecApplyConfiguration represents an declarative configuration of the PodDisruptionBudgetSpec type for use +// with apply. +type PodDisruptionBudgetSpecApplyConfiguration struct { + MinAvailable *intstr.IntOrString `json:"minAvailable,omitempty"` + Selector *v1.LabelSelectorApplyConfiguration `json:"selector,omitempty"` + MaxUnavailable *intstr.IntOrString `json:"maxUnavailable,omitempty"` +} + +// PodDisruptionBudgetSpecApplyConfiguration constructs an declarative configuration of the PodDisruptionBudgetSpec type for use with +// apply. +func PodDisruptionBudgetSpec() *PodDisruptionBudgetSpecApplyConfiguration { + return &PodDisruptionBudgetSpecApplyConfiguration{} +} + +// WithMinAvailable sets the MinAvailable field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MinAvailable field is set to the value of the last call. +func (b *PodDisruptionBudgetSpecApplyConfiguration) WithMinAvailable(value intstr.IntOrString) *PodDisruptionBudgetSpecApplyConfiguration { + b.MinAvailable = &value + return b +} + +// WithSelector sets the Selector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Selector field is set to the value of the last call. +func (b *PodDisruptionBudgetSpecApplyConfiguration) WithSelector(value *v1.LabelSelectorApplyConfiguration) *PodDisruptionBudgetSpecApplyConfiguration { + b.Selector = value + return b +} + +// WithMaxUnavailable sets the MaxUnavailable field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MaxUnavailable field is set to the value of the last call. +func (b *PodDisruptionBudgetSpecApplyConfiguration) WithMaxUnavailable(value intstr.IntOrString) *PodDisruptionBudgetSpecApplyConfiguration { + b.MaxUnavailable = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/policy/v1/poddisruptionbudgetstatus.go b/vendor/k8s.io/client-go/applyconfigurations/policy/v1/poddisruptionbudgetstatus.go new file mode 100644 index 000000000000..2dd427b9e182 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/policy/v1/poddisruptionbudgetstatus.go @@ -0,0 +1,109 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + metav1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// PodDisruptionBudgetStatusApplyConfiguration represents an declarative configuration of the PodDisruptionBudgetStatus type for use +// with apply. +type PodDisruptionBudgetStatusApplyConfiguration struct { + ObservedGeneration *int64 `json:"observedGeneration,omitempty"` + DisruptedPods map[string]v1.Time `json:"disruptedPods,omitempty"` + DisruptionsAllowed *int32 `json:"disruptionsAllowed,omitempty"` + CurrentHealthy *int32 `json:"currentHealthy,omitempty"` + DesiredHealthy *int32 `json:"desiredHealthy,omitempty"` + ExpectedPods *int32 `json:"expectedPods,omitempty"` + Conditions []metav1.ConditionApplyConfiguration `json:"conditions,omitempty"` +} + +// PodDisruptionBudgetStatusApplyConfiguration constructs an declarative configuration of the PodDisruptionBudgetStatus type for use with +// apply. +func PodDisruptionBudgetStatus() *PodDisruptionBudgetStatusApplyConfiguration { + return &PodDisruptionBudgetStatusApplyConfiguration{} +} + +// WithObservedGeneration sets the ObservedGeneration field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ObservedGeneration field is set to the value of the last call. +func (b *PodDisruptionBudgetStatusApplyConfiguration) WithObservedGeneration(value int64) *PodDisruptionBudgetStatusApplyConfiguration { + b.ObservedGeneration = &value + return b +} + +// WithDisruptedPods puts the entries into the DisruptedPods field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the DisruptedPods field, +// overwriting an existing map entries in DisruptedPods field with the same key. +func (b *PodDisruptionBudgetStatusApplyConfiguration) WithDisruptedPods(entries map[string]v1.Time) *PodDisruptionBudgetStatusApplyConfiguration { + if b.DisruptedPods == nil && len(entries) > 0 { + b.DisruptedPods = make(map[string]v1.Time, len(entries)) + } + for k, v := range entries { + b.DisruptedPods[k] = v + } + return b +} + +// WithDisruptionsAllowed sets the DisruptionsAllowed field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DisruptionsAllowed field is set to the value of the last call. +func (b *PodDisruptionBudgetStatusApplyConfiguration) WithDisruptionsAllowed(value int32) *PodDisruptionBudgetStatusApplyConfiguration { + b.DisruptionsAllowed = &value + return b +} + +// WithCurrentHealthy sets the CurrentHealthy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CurrentHealthy field is set to the value of the last call. +func (b *PodDisruptionBudgetStatusApplyConfiguration) WithCurrentHealthy(value int32) *PodDisruptionBudgetStatusApplyConfiguration { + b.CurrentHealthy = &value + return b +} + +// WithDesiredHealthy sets the DesiredHealthy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DesiredHealthy field is set to the value of the last call. +func (b *PodDisruptionBudgetStatusApplyConfiguration) WithDesiredHealthy(value int32) *PodDisruptionBudgetStatusApplyConfiguration { + b.DesiredHealthy = &value + return b +} + +// WithExpectedPods sets the ExpectedPods field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ExpectedPods field is set to the value of the last call. +func (b *PodDisruptionBudgetStatusApplyConfiguration) WithExpectedPods(value int32) *PodDisruptionBudgetStatusApplyConfiguration { + b.ExpectedPods = &value + return b +} + +// WithConditions adds the given value to the Conditions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Conditions field. +func (b *PodDisruptionBudgetStatusApplyConfiguration) WithConditions(values ...*metav1.ConditionApplyConfiguration) *PodDisruptionBudgetStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithConditions") + } + b.Conditions = append(b.Conditions, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/allowedcsidriver.go b/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/allowedcsidriver.go new file mode 100644 index 000000000000..27b49bf15384 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/allowedcsidriver.go @@ -0,0 +1,39 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// AllowedCSIDriverApplyConfiguration represents an declarative configuration of the AllowedCSIDriver type for use +// with apply. +type AllowedCSIDriverApplyConfiguration struct { + Name *string `json:"name,omitempty"` +} + +// AllowedCSIDriverApplyConfiguration constructs an declarative configuration of the AllowedCSIDriver type for use with +// apply. +func AllowedCSIDriver() *AllowedCSIDriverApplyConfiguration { + return &AllowedCSIDriverApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *AllowedCSIDriverApplyConfiguration) WithName(value string) *AllowedCSIDriverApplyConfiguration { + b.Name = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/allowedflexvolume.go b/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/allowedflexvolume.go new file mode 100644 index 000000000000..30c3724cfee9 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/allowedflexvolume.go @@ -0,0 +1,39 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// AllowedFlexVolumeApplyConfiguration represents an declarative configuration of the AllowedFlexVolume type for use +// with apply. +type AllowedFlexVolumeApplyConfiguration struct { + Driver *string `json:"driver,omitempty"` +} + +// AllowedFlexVolumeApplyConfiguration constructs an declarative configuration of the AllowedFlexVolume type for use with +// apply. +func AllowedFlexVolume() *AllowedFlexVolumeApplyConfiguration { + return &AllowedFlexVolumeApplyConfiguration{} +} + +// WithDriver sets the Driver field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Driver field is set to the value of the last call. +func (b *AllowedFlexVolumeApplyConfiguration) WithDriver(value string) *AllowedFlexVolumeApplyConfiguration { + b.Driver = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/allowedhostpath.go b/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/allowedhostpath.go new file mode 100644 index 000000000000..493815d8d4a5 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/allowedhostpath.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// AllowedHostPathApplyConfiguration represents an declarative configuration of the AllowedHostPath type for use +// with apply. +type AllowedHostPathApplyConfiguration struct { + PathPrefix *string `json:"pathPrefix,omitempty"` + ReadOnly *bool `json:"readOnly,omitempty"` +} + +// AllowedHostPathApplyConfiguration constructs an declarative configuration of the AllowedHostPath type for use with +// apply. +func AllowedHostPath() *AllowedHostPathApplyConfiguration { + return &AllowedHostPathApplyConfiguration{} +} + +// WithPathPrefix sets the PathPrefix field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PathPrefix field is set to the value of the last call. +func (b *AllowedHostPathApplyConfiguration) WithPathPrefix(value string) *AllowedHostPathApplyConfiguration { + b.PathPrefix = &value + return b +} + +// WithReadOnly sets the ReadOnly field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadOnly field is set to the value of the last call. +func (b *AllowedHostPathApplyConfiguration) WithReadOnly(value bool) *AllowedHostPathApplyConfiguration { + b.ReadOnly = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/eviction.go b/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/eviction.go new file mode 100644 index 000000000000..1db2695f7ddf --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/eviction.go @@ -0,0 +1,256 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1beta1 "k8s.io/api/policy/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// EvictionApplyConfiguration represents an declarative configuration of the Eviction type for use +// with apply. +type EvictionApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + DeleteOptions *v1.DeleteOptionsApplyConfiguration `json:"deleteOptions,omitempty"` +} + +// Eviction constructs an declarative configuration of the Eviction type for use with +// apply. +func Eviction(name, namespace string) *EvictionApplyConfiguration { + b := &EvictionApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("Eviction") + b.WithAPIVersion("policy/v1beta1") + return b +} + +// ExtractEviction extracts the applied configuration owned by fieldManager from +// eviction. If no managedFields are found in eviction for fieldManager, a +// EvictionApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// eviction must be a unmodified Eviction API object that was retrieved from the Kubernetes API. +// ExtractEviction provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractEviction(eviction *v1beta1.Eviction, fieldManager string) (*EvictionApplyConfiguration, error) { + b := &EvictionApplyConfiguration{} + err := managedfields.ExtractInto(eviction, internal.Parser().Type("io.k8s.api.policy.v1beta1.Eviction"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(eviction.Name) + b.WithNamespace(eviction.Namespace) + + b.WithKind("Eviction") + b.WithAPIVersion("policy/v1beta1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *EvictionApplyConfiguration) WithKind(value string) *EvictionApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *EvictionApplyConfiguration) WithAPIVersion(value string) *EvictionApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *EvictionApplyConfiguration) WithName(value string) *EvictionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *EvictionApplyConfiguration) WithGenerateName(value string) *EvictionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *EvictionApplyConfiguration) WithNamespace(value string) *EvictionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *EvictionApplyConfiguration) WithSelfLink(value string) *EvictionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *EvictionApplyConfiguration) WithUID(value types.UID) *EvictionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *EvictionApplyConfiguration) WithResourceVersion(value string) *EvictionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *EvictionApplyConfiguration) WithGeneration(value int64) *EvictionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *EvictionApplyConfiguration) WithCreationTimestamp(value metav1.Time) *EvictionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *EvictionApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *EvictionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *EvictionApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *EvictionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *EvictionApplyConfiguration) WithLabels(entries map[string]string) *EvictionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *EvictionApplyConfiguration) WithAnnotations(entries map[string]string) *EvictionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *EvictionApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *EvictionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *EvictionApplyConfiguration) WithFinalizers(values ...string) *EvictionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *EvictionApplyConfiguration) WithClusterName(value string) *EvictionApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *EvictionApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithDeleteOptions sets the DeleteOptions field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeleteOptions field is set to the value of the last call. +func (b *EvictionApplyConfiguration) WithDeleteOptions(value *v1.DeleteOptionsApplyConfiguration) *EvictionApplyConfiguration { + b.DeleteOptions = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/fsgroupstrategyoptions.go b/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/fsgroupstrategyoptions.go new file mode 100644 index 000000000000..06803b439dfd --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/fsgroupstrategyoptions.go @@ -0,0 +1,57 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1beta1 "k8s.io/api/policy/v1beta1" +) + +// FSGroupStrategyOptionsApplyConfiguration represents an declarative configuration of the FSGroupStrategyOptions type for use +// with apply. +type FSGroupStrategyOptionsApplyConfiguration struct { + Rule *v1beta1.FSGroupStrategyType `json:"rule,omitempty"` + Ranges []IDRangeApplyConfiguration `json:"ranges,omitempty"` +} + +// FSGroupStrategyOptionsApplyConfiguration constructs an declarative configuration of the FSGroupStrategyOptions type for use with +// apply. +func FSGroupStrategyOptions() *FSGroupStrategyOptionsApplyConfiguration { + return &FSGroupStrategyOptionsApplyConfiguration{} +} + +// WithRule sets the Rule field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Rule field is set to the value of the last call. +func (b *FSGroupStrategyOptionsApplyConfiguration) WithRule(value v1beta1.FSGroupStrategyType) *FSGroupStrategyOptionsApplyConfiguration { + b.Rule = &value + return b +} + +// WithRanges adds the given value to the Ranges field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Ranges field. +func (b *FSGroupStrategyOptionsApplyConfiguration) WithRanges(values ...*IDRangeApplyConfiguration) *FSGroupStrategyOptionsApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithRanges") + } + b.Ranges = append(b.Ranges, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/hostportrange.go b/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/hostportrange.go new file mode 100644 index 000000000000..7c796881393f --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/hostportrange.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// HostPortRangeApplyConfiguration represents an declarative configuration of the HostPortRange type for use +// with apply. +type HostPortRangeApplyConfiguration struct { + Min *int32 `json:"min,omitempty"` + Max *int32 `json:"max,omitempty"` +} + +// HostPortRangeApplyConfiguration constructs an declarative configuration of the HostPortRange type for use with +// apply. +func HostPortRange() *HostPortRangeApplyConfiguration { + return &HostPortRangeApplyConfiguration{} +} + +// WithMin sets the Min field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Min field is set to the value of the last call. +func (b *HostPortRangeApplyConfiguration) WithMin(value int32) *HostPortRangeApplyConfiguration { + b.Min = &value + return b +} + +// WithMax sets the Max field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Max field is set to the value of the last call. +func (b *HostPortRangeApplyConfiguration) WithMax(value int32) *HostPortRangeApplyConfiguration { + b.Max = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/idrange.go b/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/idrange.go new file mode 100644 index 000000000000..af46f76581ad --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/idrange.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// IDRangeApplyConfiguration represents an declarative configuration of the IDRange type for use +// with apply. +type IDRangeApplyConfiguration struct { + Min *int64 `json:"min,omitempty"` + Max *int64 `json:"max,omitempty"` +} + +// IDRangeApplyConfiguration constructs an declarative configuration of the IDRange type for use with +// apply. +func IDRange() *IDRangeApplyConfiguration { + return &IDRangeApplyConfiguration{} +} + +// WithMin sets the Min field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Min field is set to the value of the last call. +func (b *IDRangeApplyConfiguration) WithMin(value int64) *IDRangeApplyConfiguration { + b.Min = &value + return b +} + +// WithMax sets the Max field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Max field is set to the value of the last call. +func (b *IDRangeApplyConfiguration) WithMax(value int64) *IDRangeApplyConfiguration { + b.Max = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/poddisruptionbudget.go b/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/poddisruptionbudget.go new file mode 100644 index 000000000000..36d039445165 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/poddisruptionbudget.go @@ -0,0 +1,265 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + policyv1beta1 "k8s.io/api/policy/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// PodDisruptionBudgetApplyConfiguration represents an declarative configuration of the PodDisruptionBudget type for use +// with apply. +type PodDisruptionBudgetApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *PodDisruptionBudgetSpecApplyConfiguration `json:"spec,omitempty"` + Status *PodDisruptionBudgetStatusApplyConfiguration `json:"status,omitempty"` +} + +// PodDisruptionBudget constructs an declarative configuration of the PodDisruptionBudget type for use with +// apply. +func PodDisruptionBudget(name, namespace string) *PodDisruptionBudgetApplyConfiguration { + b := &PodDisruptionBudgetApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("PodDisruptionBudget") + b.WithAPIVersion("policy/v1beta1") + return b +} + +// ExtractPodDisruptionBudget extracts the applied configuration owned by fieldManager from +// podDisruptionBudget. If no managedFields are found in podDisruptionBudget for fieldManager, a +// PodDisruptionBudgetApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// podDisruptionBudget must be a unmodified PodDisruptionBudget API object that was retrieved from the Kubernetes API. +// ExtractPodDisruptionBudget provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractPodDisruptionBudget(podDisruptionBudget *policyv1beta1.PodDisruptionBudget, fieldManager string) (*PodDisruptionBudgetApplyConfiguration, error) { + b := &PodDisruptionBudgetApplyConfiguration{} + err := managedfields.ExtractInto(podDisruptionBudget, internal.Parser().Type("io.k8s.api.policy.v1beta1.PodDisruptionBudget"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(podDisruptionBudget.Name) + b.WithNamespace(podDisruptionBudget.Namespace) + + b.WithKind("PodDisruptionBudget") + b.WithAPIVersion("policy/v1beta1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *PodDisruptionBudgetApplyConfiguration) WithKind(value string) *PodDisruptionBudgetApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *PodDisruptionBudgetApplyConfiguration) WithAPIVersion(value string) *PodDisruptionBudgetApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *PodDisruptionBudgetApplyConfiguration) WithName(value string) *PodDisruptionBudgetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *PodDisruptionBudgetApplyConfiguration) WithGenerateName(value string) *PodDisruptionBudgetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *PodDisruptionBudgetApplyConfiguration) WithNamespace(value string) *PodDisruptionBudgetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *PodDisruptionBudgetApplyConfiguration) WithSelfLink(value string) *PodDisruptionBudgetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *PodDisruptionBudgetApplyConfiguration) WithUID(value types.UID) *PodDisruptionBudgetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *PodDisruptionBudgetApplyConfiguration) WithResourceVersion(value string) *PodDisruptionBudgetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *PodDisruptionBudgetApplyConfiguration) WithGeneration(value int64) *PodDisruptionBudgetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *PodDisruptionBudgetApplyConfiguration) WithCreationTimestamp(value metav1.Time) *PodDisruptionBudgetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *PodDisruptionBudgetApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *PodDisruptionBudgetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *PodDisruptionBudgetApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *PodDisruptionBudgetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *PodDisruptionBudgetApplyConfiguration) WithLabels(entries map[string]string) *PodDisruptionBudgetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *PodDisruptionBudgetApplyConfiguration) WithAnnotations(entries map[string]string) *PodDisruptionBudgetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *PodDisruptionBudgetApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *PodDisruptionBudgetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *PodDisruptionBudgetApplyConfiguration) WithFinalizers(values ...string) *PodDisruptionBudgetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *PodDisruptionBudgetApplyConfiguration) WithClusterName(value string) *PodDisruptionBudgetApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *PodDisruptionBudgetApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *PodDisruptionBudgetApplyConfiguration) WithSpec(value *PodDisruptionBudgetSpecApplyConfiguration) *PodDisruptionBudgetApplyConfiguration { + b.Spec = value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *PodDisruptionBudgetApplyConfiguration) WithStatus(value *PodDisruptionBudgetStatusApplyConfiguration) *PodDisruptionBudgetApplyConfiguration { + b.Status = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/poddisruptionbudgetspec.go b/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/poddisruptionbudgetspec.go new file mode 100644 index 000000000000..b5d17d3fe0b3 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/poddisruptionbudgetspec.go @@ -0,0 +1,62 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + intstr "k8s.io/apimachinery/pkg/util/intstr" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// PodDisruptionBudgetSpecApplyConfiguration represents an declarative configuration of the PodDisruptionBudgetSpec type for use +// with apply. +type PodDisruptionBudgetSpecApplyConfiguration struct { + MinAvailable *intstr.IntOrString `json:"minAvailable,omitempty"` + Selector *v1.LabelSelectorApplyConfiguration `json:"selector,omitempty"` + MaxUnavailable *intstr.IntOrString `json:"maxUnavailable,omitempty"` +} + +// PodDisruptionBudgetSpecApplyConfiguration constructs an declarative configuration of the PodDisruptionBudgetSpec type for use with +// apply. +func PodDisruptionBudgetSpec() *PodDisruptionBudgetSpecApplyConfiguration { + return &PodDisruptionBudgetSpecApplyConfiguration{} +} + +// WithMinAvailable sets the MinAvailable field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MinAvailable field is set to the value of the last call. +func (b *PodDisruptionBudgetSpecApplyConfiguration) WithMinAvailable(value intstr.IntOrString) *PodDisruptionBudgetSpecApplyConfiguration { + b.MinAvailable = &value + return b +} + +// WithSelector sets the Selector field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Selector field is set to the value of the last call. +func (b *PodDisruptionBudgetSpecApplyConfiguration) WithSelector(value *v1.LabelSelectorApplyConfiguration) *PodDisruptionBudgetSpecApplyConfiguration { + b.Selector = value + return b +} + +// WithMaxUnavailable sets the MaxUnavailable field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MaxUnavailable field is set to the value of the last call. +func (b *PodDisruptionBudgetSpecApplyConfiguration) WithMaxUnavailable(value intstr.IntOrString) *PodDisruptionBudgetSpecApplyConfiguration { + b.MaxUnavailable = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/poddisruptionbudgetstatus.go b/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/poddisruptionbudgetstatus.go new file mode 100644 index 000000000000..d0813590e11a --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/poddisruptionbudgetstatus.go @@ -0,0 +1,109 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + metav1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// PodDisruptionBudgetStatusApplyConfiguration represents an declarative configuration of the PodDisruptionBudgetStatus type for use +// with apply. +type PodDisruptionBudgetStatusApplyConfiguration struct { + ObservedGeneration *int64 `json:"observedGeneration,omitempty"` + DisruptedPods map[string]v1.Time `json:"disruptedPods,omitempty"` + DisruptionsAllowed *int32 `json:"disruptionsAllowed,omitempty"` + CurrentHealthy *int32 `json:"currentHealthy,omitempty"` + DesiredHealthy *int32 `json:"desiredHealthy,omitempty"` + ExpectedPods *int32 `json:"expectedPods,omitempty"` + Conditions []metav1.ConditionApplyConfiguration `json:"conditions,omitempty"` +} + +// PodDisruptionBudgetStatusApplyConfiguration constructs an declarative configuration of the PodDisruptionBudgetStatus type for use with +// apply. +func PodDisruptionBudgetStatus() *PodDisruptionBudgetStatusApplyConfiguration { + return &PodDisruptionBudgetStatusApplyConfiguration{} +} + +// WithObservedGeneration sets the ObservedGeneration field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ObservedGeneration field is set to the value of the last call. +func (b *PodDisruptionBudgetStatusApplyConfiguration) WithObservedGeneration(value int64) *PodDisruptionBudgetStatusApplyConfiguration { + b.ObservedGeneration = &value + return b +} + +// WithDisruptedPods puts the entries into the DisruptedPods field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the DisruptedPods field, +// overwriting an existing map entries in DisruptedPods field with the same key. +func (b *PodDisruptionBudgetStatusApplyConfiguration) WithDisruptedPods(entries map[string]v1.Time) *PodDisruptionBudgetStatusApplyConfiguration { + if b.DisruptedPods == nil && len(entries) > 0 { + b.DisruptedPods = make(map[string]v1.Time, len(entries)) + } + for k, v := range entries { + b.DisruptedPods[k] = v + } + return b +} + +// WithDisruptionsAllowed sets the DisruptionsAllowed field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DisruptionsAllowed field is set to the value of the last call. +func (b *PodDisruptionBudgetStatusApplyConfiguration) WithDisruptionsAllowed(value int32) *PodDisruptionBudgetStatusApplyConfiguration { + b.DisruptionsAllowed = &value + return b +} + +// WithCurrentHealthy sets the CurrentHealthy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CurrentHealthy field is set to the value of the last call. +func (b *PodDisruptionBudgetStatusApplyConfiguration) WithCurrentHealthy(value int32) *PodDisruptionBudgetStatusApplyConfiguration { + b.CurrentHealthy = &value + return b +} + +// WithDesiredHealthy sets the DesiredHealthy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DesiredHealthy field is set to the value of the last call. +func (b *PodDisruptionBudgetStatusApplyConfiguration) WithDesiredHealthy(value int32) *PodDisruptionBudgetStatusApplyConfiguration { + b.DesiredHealthy = &value + return b +} + +// WithExpectedPods sets the ExpectedPods field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ExpectedPods field is set to the value of the last call. +func (b *PodDisruptionBudgetStatusApplyConfiguration) WithExpectedPods(value int32) *PodDisruptionBudgetStatusApplyConfiguration { + b.ExpectedPods = &value + return b +} + +// WithConditions adds the given value to the Conditions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Conditions field. +func (b *PodDisruptionBudgetStatusApplyConfiguration) WithConditions(values ...*metav1.ConditionApplyConfiguration) *PodDisruptionBudgetStatusApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithConditions") + } + b.Conditions = append(b.Conditions, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/podsecuritypolicy.go b/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/podsecuritypolicy.go new file mode 100644 index 000000000000..3ff73633c496 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/podsecuritypolicy.go @@ -0,0 +1,254 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + policyv1beta1 "k8s.io/api/policy/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// PodSecurityPolicyApplyConfiguration represents an declarative configuration of the PodSecurityPolicy type for use +// with apply. +type PodSecurityPolicyApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *PodSecurityPolicySpecApplyConfiguration `json:"spec,omitempty"` +} + +// PodSecurityPolicy constructs an declarative configuration of the PodSecurityPolicy type for use with +// apply. +func PodSecurityPolicy(name string) *PodSecurityPolicyApplyConfiguration { + b := &PodSecurityPolicyApplyConfiguration{} + b.WithName(name) + b.WithKind("PodSecurityPolicy") + b.WithAPIVersion("policy/v1beta1") + return b +} + +// ExtractPodSecurityPolicy extracts the applied configuration owned by fieldManager from +// podSecurityPolicy. If no managedFields are found in podSecurityPolicy for fieldManager, a +// PodSecurityPolicyApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// podSecurityPolicy must be a unmodified PodSecurityPolicy API object that was retrieved from the Kubernetes API. +// ExtractPodSecurityPolicy provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractPodSecurityPolicy(podSecurityPolicy *policyv1beta1.PodSecurityPolicy, fieldManager string) (*PodSecurityPolicyApplyConfiguration, error) { + b := &PodSecurityPolicyApplyConfiguration{} + err := managedfields.ExtractInto(podSecurityPolicy, internal.Parser().Type("io.k8s.api.policy.v1beta1.PodSecurityPolicy"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(podSecurityPolicy.Name) + + b.WithKind("PodSecurityPolicy") + b.WithAPIVersion("policy/v1beta1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *PodSecurityPolicyApplyConfiguration) WithKind(value string) *PodSecurityPolicyApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *PodSecurityPolicyApplyConfiguration) WithAPIVersion(value string) *PodSecurityPolicyApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *PodSecurityPolicyApplyConfiguration) WithName(value string) *PodSecurityPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *PodSecurityPolicyApplyConfiguration) WithGenerateName(value string) *PodSecurityPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *PodSecurityPolicyApplyConfiguration) WithNamespace(value string) *PodSecurityPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *PodSecurityPolicyApplyConfiguration) WithSelfLink(value string) *PodSecurityPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *PodSecurityPolicyApplyConfiguration) WithUID(value types.UID) *PodSecurityPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *PodSecurityPolicyApplyConfiguration) WithResourceVersion(value string) *PodSecurityPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *PodSecurityPolicyApplyConfiguration) WithGeneration(value int64) *PodSecurityPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *PodSecurityPolicyApplyConfiguration) WithCreationTimestamp(value metav1.Time) *PodSecurityPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *PodSecurityPolicyApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *PodSecurityPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *PodSecurityPolicyApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *PodSecurityPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *PodSecurityPolicyApplyConfiguration) WithLabels(entries map[string]string) *PodSecurityPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *PodSecurityPolicyApplyConfiguration) WithAnnotations(entries map[string]string) *PodSecurityPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *PodSecurityPolicyApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *PodSecurityPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *PodSecurityPolicyApplyConfiguration) WithFinalizers(values ...string) *PodSecurityPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *PodSecurityPolicyApplyConfiguration) WithClusterName(value string) *PodSecurityPolicyApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *PodSecurityPolicyApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *PodSecurityPolicyApplyConfiguration) WithSpec(value *PodSecurityPolicySpecApplyConfiguration) *PodSecurityPolicyApplyConfiguration { + b.Spec = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/podsecuritypolicyspec.go b/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/podsecuritypolicyspec.go new file mode 100644 index 000000000000..bf951cf56b65 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/podsecuritypolicyspec.go @@ -0,0 +1,285 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1 "k8s.io/api/core/v1" + v1beta1 "k8s.io/api/policy/v1beta1" +) + +// PodSecurityPolicySpecApplyConfiguration represents an declarative configuration of the PodSecurityPolicySpec type for use +// with apply. +type PodSecurityPolicySpecApplyConfiguration struct { + Privileged *bool `json:"privileged,omitempty"` + DefaultAddCapabilities []v1.Capability `json:"defaultAddCapabilities,omitempty"` + RequiredDropCapabilities []v1.Capability `json:"requiredDropCapabilities,omitempty"` + AllowedCapabilities []v1.Capability `json:"allowedCapabilities,omitempty"` + Volumes []v1beta1.FSType `json:"volumes,omitempty"` + HostNetwork *bool `json:"hostNetwork,omitempty"` + HostPorts []HostPortRangeApplyConfiguration `json:"hostPorts,omitempty"` + HostPID *bool `json:"hostPID,omitempty"` + HostIPC *bool `json:"hostIPC,omitempty"` + SELinux *SELinuxStrategyOptionsApplyConfiguration `json:"seLinux,omitempty"` + RunAsUser *RunAsUserStrategyOptionsApplyConfiguration `json:"runAsUser,omitempty"` + RunAsGroup *RunAsGroupStrategyOptionsApplyConfiguration `json:"runAsGroup,omitempty"` + SupplementalGroups *SupplementalGroupsStrategyOptionsApplyConfiguration `json:"supplementalGroups,omitempty"` + FSGroup *FSGroupStrategyOptionsApplyConfiguration `json:"fsGroup,omitempty"` + ReadOnlyRootFilesystem *bool `json:"readOnlyRootFilesystem,omitempty"` + DefaultAllowPrivilegeEscalation *bool `json:"defaultAllowPrivilegeEscalation,omitempty"` + AllowPrivilegeEscalation *bool `json:"allowPrivilegeEscalation,omitempty"` + AllowedHostPaths []AllowedHostPathApplyConfiguration `json:"allowedHostPaths,omitempty"` + AllowedFlexVolumes []AllowedFlexVolumeApplyConfiguration `json:"allowedFlexVolumes,omitempty"` + AllowedCSIDrivers []AllowedCSIDriverApplyConfiguration `json:"allowedCSIDrivers,omitempty"` + AllowedUnsafeSysctls []string `json:"allowedUnsafeSysctls,omitempty"` + ForbiddenSysctls []string `json:"forbiddenSysctls,omitempty"` + AllowedProcMountTypes []v1.ProcMountType `json:"allowedProcMountTypes,omitempty"` + RuntimeClass *RuntimeClassStrategyOptionsApplyConfiguration `json:"runtimeClass,omitempty"` +} + +// PodSecurityPolicySpecApplyConfiguration constructs an declarative configuration of the PodSecurityPolicySpec type for use with +// apply. +func PodSecurityPolicySpec() *PodSecurityPolicySpecApplyConfiguration { + return &PodSecurityPolicySpecApplyConfiguration{} +} + +// WithPrivileged sets the Privileged field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Privileged field is set to the value of the last call. +func (b *PodSecurityPolicySpecApplyConfiguration) WithPrivileged(value bool) *PodSecurityPolicySpecApplyConfiguration { + b.Privileged = &value + return b +} + +// WithDefaultAddCapabilities adds the given value to the DefaultAddCapabilities field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the DefaultAddCapabilities field. +func (b *PodSecurityPolicySpecApplyConfiguration) WithDefaultAddCapabilities(values ...v1.Capability) *PodSecurityPolicySpecApplyConfiguration { + for i := range values { + b.DefaultAddCapabilities = append(b.DefaultAddCapabilities, values[i]) + } + return b +} + +// WithRequiredDropCapabilities adds the given value to the RequiredDropCapabilities field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the RequiredDropCapabilities field. +func (b *PodSecurityPolicySpecApplyConfiguration) WithRequiredDropCapabilities(values ...v1.Capability) *PodSecurityPolicySpecApplyConfiguration { + for i := range values { + b.RequiredDropCapabilities = append(b.RequiredDropCapabilities, values[i]) + } + return b +} + +// WithAllowedCapabilities adds the given value to the AllowedCapabilities field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the AllowedCapabilities field. +func (b *PodSecurityPolicySpecApplyConfiguration) WithAllowedCapabilities(values ...v1.Capability) *PodSecurityPolicySpecApplyConfiguration { + for i := range values { + b.AllowedCapabilities = append(b.AllowedCapabilities, values[i]) + } + return b +} + +// WithVolumes adds the given value to the Volumes field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Volumes field. +func (b *PodSecurityPolicySpecApplyConfiguration) WithVolumes(values ...v1beta1.FSType) *PodSecurityPolicySpecApplyConfiguration { + for i := range values { + b.Volumes = append(b.Volumes, values[i]) + } + return b +} + +// WithHostNetwork sets the HostNetwork field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the HostNetwork field is set to the value of the last call. +func (b *PodSecurityPolicySpecApplyConfiguration) WithHostNetwork(value bool) *PodSecurityPolicySpecApplyConfiguration { + b.HostNetwork = &value + return b +} + +// WithHostPorts adds the given value to the HostPorts field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the HostPorts field. +func (b *PodSecurityPolicySpecApplyConfiguration) WithHostPorts(values ...*HostPortRangeApplyConfiguration) *PodSecurityPolicySpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithHostPorts") + } + b.HostPorts = append(b.HostPorts, *values[i]) + } + return b +} + +// WithHostPID sets the HostPID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the HostPID field is set to the value of the last call. +func (b *PodSecurityPolicySpecApplyConfiguration) WithHostPID(value bool) *PodSecurityPolicySpecApplyConfiguration { + b.HostPID = &value + return b +} + +// WithHostIPC sets the HostIPC field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the HostIPC field is set to the value of the last call. +func (b *PodSecurityPolicySpecApplyConfiguration) WithHostIPC(value bool) *PodSecurityPolicySpecApplyConfiguration { + b.HostIPC = &value + return b +} + +// WithSELinux sets the SELinux field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SELinux field is set to the value of the last call. +func (b *PodSecurityPolicySpecApplyConfiguration) WithSELinux(value *SELinuxStrategyOptionsApplyConfiguration) *PodSecurityPolicySpecApplyConfiguration { + b.SELinux = value + return b +} + +// WithRunAsUser sets the RunAsUser field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RunAsUser field is set to the value of the last call. +func (b *PodSecurityPolicySpecApplyConfiguration) WithRunAsUser(value *RunAsUserStrategyOptionsApplyConfiguration) *PodSecurityPolicySpecApplyConfiguration { + b.RunAsUser = value + return b +} + +// WithRunAsGroup sets the RunAsGroup field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RunAsGroup field is set to the value of the last call. +func (b *PodSecurityPolicySpecApplyConfiguration) WithRunAsGroup(value *RunAsGroupStrategyOptionsApplyConfiguration) *PodSecurityPolicySpecApplyConfiguration { + b.RunAsGroup = value + return b +} + +// WithSupplementalGroups sets the SupplementalGroups field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SupplementalGroups field is set to the value of the last call. +func (b *PodSecurityPolicySpecApplyConfiguration) WithSupplementalGroups(value *SupplementalGroupsStrategyOptionsApplyConfiguration) *PodSecurityPolicySpecApplyConfiguration { + b.SupplementalGroups = value + return b +} + +// WithFSGroup sets the FSGroup field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FSGroup field is set to the value of the last call. +func (b *PodSecurityPolicySpecApplyConfiguration) WithFSGroup(value *FSGroupStrategyOptionsApplyConfiguration) *PodSecurityPolicySpecApplyConfiguration { + b.FSGroup = value + return b +} + +// WithReadOnlyRootFilesystem sets the ReadOnlyRootFilesystem field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReadOnlyRootFilesystem field is set to the value of the last call. +func (b *PodSecurityPolicySpecApplyConfiguration) WithReadOnlyRootFilesystem(value bool) *PodSecurityPolicySpecApplyConfiguration { + b.ReadOnlyRootFilesystem = &value + return b +} + +// WithDefaultAllowPrivilegeEscalation sets the DefaultAllowPrivilegeEscalation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DefaultAllowPrivilegeEscalation field is set to the value of the last call. +func (b *PodSecurityPolicySpecApplyConfiguration) WithDefaultAllowPrivilegeEscalation(value bool) *PodSecurityPolicySpecApplyConfiguration { + b.DefaultAllowPrivilegeEscalation = &value + return b +} + +// WithAllowPrivilegeEscalation sets the AllowPrivilegeEscalation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AllowPrivilegeEscalation field is set to the value of the last call. +func (b *PodSecurityPolicySpecApplyConfiguration) WithAllowPrivilegeEscalation(value bool) *PodSecurityPolicySpecApplyConfiguration { + b.AllowPrivilegeEscalation = &value + return b +} + +// WithAllowedHostPaths adds the given value to the AllowedHostPaths field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the AllowedHostPaths field. +func (b *PodSecurityPolicySpecApplyConfiguration) WithAllowedHostPaths(values ...*AllowedHostPathApplyConfiguration) *PodSecurityPolicySpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithAllowedHostPaths") + } + b.AllowedHostPaths = append(b.AllowedHostPaths, *values[i]) + } + return b +} + +// WithAllowedFlexVolumes adds the given value to the AllowedFlexVolumes field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the AllowedFlexVolumes field. +func (b *PodSecurityPolicySpecApplyConfiguration) WithAllowedFlexVolumes(values ...*AllowedFlexVolumeApplyConfiguration) *PodSecurityPolicySpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithAllowedFlexVolumes") + } + b.AllowedFlexVolumes = append(b.AllowedFlexVolumes, *values[i]) + } + return b +} + +// WithAllowedCSIDrivers adds the given value to the AllowedCSIDrivers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the AllowedCSIDrivers field. +func (b *PodSecurityPolicySpecApplyConfiguration) WithAllowedCSIDrivers(values ...*AllowedCSIDriverApplyConfiguration) *PodSecurityPolicySpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithAllowedCSIDrivers") + } + b.AllowedCSIDrivers = append(b.AllowedCSIDrivers, *values[i]) + } + return b +} + +// WithAllowedUnsafeSysctls adds the given value to the AllowedUnsafeSysctls field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the AllowedUnsafeSysctls field. +func (b *PodSecurityPolicySpecApplyConfiguration) WithAllowedUnsafeSysctls(values ...string) *PodSecurityPolicySpecApplyConfiguration { + for i := range values { + b.AllowedUnsafeSysctls = append(b.AllowedUnsafeSysctls, values[i]) + } + return b +} + +// WithForbiddenSysctls adds the given value to the ForbiddenSysctls field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the ForbiddenSysctls field. +func (b *PodSecurityPolicySpecApplyConfiguration) WithForbiddenSysctls(values ...string) *PodSecurityPolicySpecApplyConfiguration { + for i := range values { + b.ForbiddenSysctls = append(b.ForbiddenSysctls, values[i]) + } + return b +} + +// WithAllowedProcMountTypes adds the given value to the AllowedProcMountTypes field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the AllowedProcMountTypes field. +func (b *PodSecurityPolicySpecApplyConfiguration) WithAllowedProcMountTypes(values ...v1.ProcMountType) *PodSecurityPolicySpecApplyConfiguration { + for i := range values { + b.AllowedProcMountTypes = append(b.AllowedProcMountTypes, values[i]) + } + return b +} + +// WithRuntimeClass sets the RuntimeClass field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RuntimeClass field is set to the value of the last call. +func (b *PodSecurityPolicySpecApplyConfiguration) WithRuntimeClass(value *RuntimeClassStrategyOptionsApplyConfiguration) *PodSecurityPolicySpecApplyConfiguration { + b.RuntimeClass = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/runasgroupstrategyoptions.go b/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/runasgroupstrategyoptions.go new file mode 100644 index 000000000000..fcfcfbe6b924 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/runasgroupstrategyoptions.go @@ -0,0 +1,57 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1beta1 "k8s.io/api/policy/v1beta1" +) + +// RunAsGroupStrategyOptionsApplyConfiguration represents an declarative configuration of the RunAsGroupStrategyOptions type for use +// with apply. +type RunAsGroupStrategyOptionsApplyConfiguration struct { + Rule *v1beta1.RunAsGroupStrategy `json:"rule,omitempty"` + Ranges []IDRangeApplyConfiguration `json:"ranges,omitempty"` +} + +// RunAsGroupStrategyOptionsApplyConfiguration constructs an declarative configuration of the RunAsGroupStrategyOptions type for use with +// apply. +func RunAsGroupStrategyOptions() *RunAsGroupStrategyOptionsApplyConfiguration { + return &RunAsGroupStrategyOptionsApplyConfiguration{} +} + +// WithRule sets the Rule field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Rule field is set to the value of the last call. +func (b *RunAsGroupStrategyOptionsApplyConfiguration) WithRule(value v1beta1.RunAsGroupStrategy) *RunAsGroupStrategyOptionsApplyConfiguration { + b.Rule = &value + return b +} + +// WithRanges adds the given value to the Ranges field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Ranges field. +func (b *RunAsGroupStrategyOptionsApplyConfiguration) WithRanges(values ...*IDRangeApplyConfiguration) *RunAsGroupStrategyOptionsApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithRanges") + } + b.Ranges = append(b.Ranges, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/runasuserstrategyoptions.go b/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/runasuserstrategyoptions.go new file mode 100644 index 000000000000..a6d6ee58e372 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/runasuserstrategyoptions.go @@ -0,0 +1,57 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1beta1 "k8s.io/api/policy/v1beta1" +) + +// RunAsUserStrategyOptionsApplyConfiguration represents an declarative configuration of the RunAsUserStrategyOptions type for use +// with apply. +type RunAsUserStrategyOptionsApplyConfiguration struct { + Rule *v1beta1.RunAsUserStrategy `json:"rule,omitempty"` + Ranges []IDRangeApplyConfiguration `json:"ranges,omitempty"` +} + +// RunAsUserStrategyOptionsApplyConfiguration constructs an declarative configuration of the RunAsUserStrategyOptions type for use with +// apply. +func RunAsUserStrategyOptions() *RunAsUserStrategyOptionsApplyConfiguration { + return &RunAsUserStrategyOptionsApplyConfiguration{} +} + +// WithRule sets the Rule field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Rule field is set to the value of the last call. +func (b *RunAsUserStrategyOptionsApplyConfiguration) WithRule(value v1beta1.RunAsUserStrategy) *RunAsUserStrategyOptionsApplyConfiguration { + b.Rule = &value + return b +} + +// WithRanges adds the given value to the Ranges field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Ranges field. +func (b *RunAsUserStrategyOptionsApplyConfiguration) WithRanges(values ...*IDRangeApplyConfiguration) *RunAsUserStrategyOptionsApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithRanges") + } + b.Ranges = append(b.Ranges, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/runtimeclassstrategyoptions.go b/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/runtimeclassstrategyoptions.go new file mode 100644 index 000000000000..c19a7ce61756 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/runtimeclassstrategyoptions.go @@ -0,0 +1,50 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// RuntimeClassStrategyOptionsApplyConfiguration represents an declarative configuration of the RuntimeClassStrategyOptions type for use +// with apply. +type RuntimeClassStrategyOptionsApplyConfiguration struct { + AllowedRuntimeClassNames []string `json:"allowedRuntimeClassNames,omitempty"` + DefaultRuntimeClassName *string `json:"defaultRuntimeClassName,omitempty"` +} + +// RuntimeClassStrategyOptionsApplyConfiguration constructs an declarative configuration of the RuntimeClassStrategyOptions type for use with +// apply. +func RuntimeClassStrategyOptions() *RuntimeClassStrategyOptionsApplyConfiguration { + return &RuntimeClassStrategyOptionsApplyConfiguration{} +} + +// WithAllowedRuntimeClassNames adds the given value to the AllowedRuntimeClassNames field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the AllowedRuntimeClassNames field. +func (b *RuntimeClassStrategyOptionsApplyConfiguration) WithAllowedRuntimeClassNames(values ...string) *RuntimeClassStrategyOptionsApplyConfiguration { + for i := range values { + b.AllowedRuntimeClassNames = append(b.AllowedRuntimeClassNames, values[i]) + } + return b +} + +// WithDefaultRuntimeClassName sets the DefaultRuntimeClassName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DefaultRuntimeClassName field is set to the value of the last call. +func (b *RuntimeClassStrategyOptionsApplyConfiguration) WithDefaultRuntimeClassName(value string) *RuntimeClassStrategyOptionsApplyConfiguration { + b.DefaultRuntimeClassName = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/selinuxstrategyoptions.go b/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/selinuxstrategyoptions.go new file mode 100644 index 000000000000..de7ede618e9b --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/selinuxstrategyoptions.go @@ -0,0 +1,53 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1beta1 "k8s.io/api/policy/v1beta1" + v1 "k8s.io/client-go/applyconfigurations/core/v1" +) + +// SELinuxStrategyOptionsApplyConfiguration represents an declarative configuration of the SELinuxStrategyOptions type for use +// with apply. +type SELinuxStrategyOptionsApplyConfiguration struct { + Rule *v1beta1.SELinuxStrategy `json:"rule,omitempty"` + SELinuxOptions *v1.SELinuxOptionsApplyConfiguration `json:"seLinuxOptions,omitempty"` +} + +// SELinuxStrategyOptionsApplyConfiguration constructs an declarative configuration of the SELinuxStrategyOptions type for use with +// apply. +func SELinuxStrategyOptions() *SELinuxStrategyOptionsApplyConfiguration { + return &SELinuxStrategyOptionsApplyConfiguration{} +} + +// WithRule sets the Rule field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Rule field is set to the value of the last call. +func (b *SELinuxStrategyOptionsApplyConfiguration) WithRule(value v1beta1.SELinuxStrategy) *SELinuxStrategyOptionsApplyConfiguration { + b.Rule = &value + return b +} + +// WithSELinuxOptions sets the SELinuxOptions field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SELinuxOptions field is set to the value of the last call. +func (b *SELinuxStrategyOptionsApplyConfiguration) WithSELinuxOptions(value *v1.SELinuxOptionsApplyConfiguration) *SELinuxStrategyOptionsApplyConfiguration { + b.SELinuxOptions = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/supplementalgroupsstrategyoptions.go b/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/supplementalgroupsstrategyoptions.go new file mode 100644 index 000000000000..9e4a9bb2ca3b --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/policy/v1beta1/supplementalgroupsstrategyoptions.go @@ -0,0 +1,57 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1beta1 "k8s.io/api/policy/v1beta1" +) + +// SupplementalGroupsStrategyOptionsApplyConfiguration represents an declarative configuration of the SupplementalGroupsStrategyOptions type for use +// with apply. +type SupplementalGroupsStrategyOptionsApplyConfiguration struct { + Rule *v1beta1.SupplementalGroupsStrategyType `json:"rule,omitempty"` + Ranges []IDRangeApplyConfiguration `json:"ranges,omitempty"` +} + +// SupplementalGroupsStrategyOptionsApplyConfiguration constructs an declarative configuration of the SupplementalGroupsStrategyOptions type for use with +// apply. +func SupplementalGroupsStrategyOptions() *SupplementalGroupsStrategyOptionsApplyConfiguration { + return &SupplementalGroupsStrategyOptionsApplyConfiguration{} +} + +// WithRule sets the Rule field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Rule field is set to the value of the last call. +func (b *SupplementalGroupsStrategyOptionsApplyConfiguration) WithRule(value v1beta1.SupplementalGroupsStrategyType) *SupplementalGroupsStrategyOptionsApplyConfiguration { + b.Rule = &value + return b +} + +// WithRanges adds the given value to the Ranges field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Ranges field. +func (b *SupplementalGroupsStrategyOptionsApplyConfiguration) WithRanges(values ...*IDRangeApplyConfiguration) *SupplementalGroupsStrategyOptionsApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithRanges") + } + b.Ranges = append(b.Ranges, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/rbac/v1/aggregationrule.go b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1/aggregationrule.go new file mode 100644 index 000000000000..fda9205c2100 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1/aggregationrule.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// AggregationRuleApplyConfiguration represents an declarative configuration of the AggregationRule type for use +// with apply. +type AggregationRuleApplyConfiguration struct { + ClusterRoleSelectors []v1.LabelSelectorApplyConfiguration `json:"clusterRoleSelectors,omitempty"` +} + +// AggregationRuleApplyConfiguration constructs an declarative configuration of the AggregationRule type for use with +// apply. +func AggregationRule() *AggregationRuleApplyConfiguration { + return &AggregationRuleApplyConfiguration{} +} + +// WithClusterRoleSelectors adds the given value to the ClusterRoleSelectors field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the ClusterRoleSelectors field. +func (b *AggregationRuleApplyConfiguration) WithClusterRoleSelectors(values ...*v1.LabelSelectorApplyConfiguration) *AggregationRuleApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithClusterRoleSelectors") + } + b.ClusterRoleSelectors = append(b.ClusterRoleSelectors, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/rbac/v1/clusterrole.go b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1/clusterrole.go new file mode 100644 index 000000000000..92ade083e44f --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1/clusterrole.go @@ -0,0 +1,268 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + apirbacv1 "k8s.io/api/rbac/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// ClusterRoleApplyConfiguration represents an declarative configuration of the ClusterRole type for use +// with apply. +type ClusterRoleApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Rules []PolicyRuleApplyConfiguration `json:"rules,omitempty"` + AggregationRule *AggregationRuleApplyConfiguration `json:"aggregationRule,omitempty"` +} + +// ClusterRole constructs an declarative configuration of the ClusterRole type for use with +// apply. +func ClusterRole(name string) *ClusterRoleApplyConfiguration { + b := &ClusterRoleApplyConfiguration{} + b.WithName(name) + b.WithKind("ClusterRole") + b.WithAPIVersion("rbac.authorization.k8s.io/v1") + return b +} + +// ExtractClusterRole extracts the applied configuration owned by fieldManager from +// clusterRole. If no managedFields are found in clusterRole for fieldManager, a +// ClusterRoleApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// clusterRole must be a unmodified ClusterRole API object that was retrieved from the Kubernetes API. +// ExtractClusterRole provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractClusterRole(clusterRole *apirbacv1.ClusterRole, fieldManager string) (*ClusterRoleApplyConfiguration, error) { + b := &ClusterRoleApplyConfiguration{} + err := managedfields.ExtractInto(clusterRole, internal.Parser().Type("io.k8s.api.rbac.v1.ClusterRole"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(clusterRole.Name) + + b.WithKind("ClusterRole") + b.WithAPIVersion("rbac.authorization.k8s.io/v1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *ClusterRoleApplyConfiguration) WithKind(value string) *ClusterRoleApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *ClusterRoleApplyConfiguration) WithAPIVersion(value string) *ClusterRoleApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ClusterRoleApplyConfiguration) WithName(value string) *ClusterRoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *ClusterRoleApplyConfiguration) WithGenerateName(value string) *ClusterRoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *ClusterRoleApplyConfiguration) WithNamespace(value string) *ClusterRoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *ClusterRoleApplyConfiguration) WithSelfLink(value string) *ClusterRoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *ClusterRoleApplyConfiguration) WithUID(value types.UID) *ClusterRoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *ClusterRoleApplyConfiguration) WithResourceVersion(value string) *ClusterRoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *ClusterRoleApplyConfiguration) WithGeneration(value int64) *ClusterRoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *ClusterRoleApplyConfiguration) WithCreationTimestamp(value metav1.Time) *ClusterRoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *ClusterRoleApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *ClusterRoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *ClusterRoleApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *ClusterRoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *ClusterRoleApplyConfiguration) WithLabels(entries map[string]string) *ClusterRoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *ClusterRoleApplyConfiguration) WithAnnotations(entries map[string]string) *ClusterRoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *ClusterRoleApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *ClusterRoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *ClusterRoleApplyConfiguration) WithFinalizers(values ...string) *ClusterRoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *ClusterRoleApplyConfiguration) WithClusterName(value string) *ClusterRoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *ClusterRoleApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithRules adds the given value to the Rules field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Rules field. +func (b *ClusterRoleApplyConfiguration) WithRules(values ...*PolicyRuleApplyConfiguration) *ClusterRoleApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithRules") + } + b.Rules = append(b.Rules, *values[i]) + } + return b +} + +// WithAggregationRule sets the AggregationRule field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AggregationRule field is set to the value of the last call. +func (b *ClusterRoleApplyConfiguration) WithAggregationRule(value *AggregationRuleApplyConfiguration) *ClusterRoleApplyConfiguration { + b.AggregationRule = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/rbac/v1/clusterrolebinding.go b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1/clusterrolebinding.go new file mode 100644 index 000000000000..7bbbdaec9884 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1/clusterrolebinding.go @@ -0,0 +1,268 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + apirbacv1 "k8s.io/api/rbac/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// ClusterRoleBindingApplyConfiguration represents an declarative configuration of the ClusterRoleBinding type for use +// with apply. +type ClusterRoleBindingApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Subjects []SubjectApplyConfiguration `json:"subjects,omitempty"` + RoleRef *RoleRefApplyConfiguration `json:"roleRef,omitempty"` +} + +// ClusterRoleBinding constructs an declarative configuration of the ClusterRoleBinding type for use with +// apply. +func ClusterRoleBinding(name string) *ClusterRoleBindingApplyConfiguration { + b := &ClusterRoleBindingApplyConfiguration{} + b.WithName(name) + b.WithKind("ClusterRoleBinding") + b.WithAPIVersion("rbac.authorization.k8s.io/v1") + return b +} + +// ExtractClusterRoleBinding extracts the applied configuration owned by fieldManager from +// clusterRoleBinding. If no managedFields are found in clusterRoleBinding for fieldManager, a +// ClusterRoleBindingApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// clusterRoleBinding must be a unmodified ClusterRoleBinding API object that was retrieved from the Kubernetes API. +// ExtractClusterRoleBinding provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractClusterRoleBinding(clusterRoleBinding *apirbacv1.ClusterRoleBinding, fieldManager string) (*ClusterRoleBindingApplyConfiguration, error) { + b := &ClusterRoleBindingApplyConfiguration{} + err := managedfields.ExtractInto(clusterRoleBinding, internal.Parser().Type("io.k8s.api.rbac.v1.ClusterRoleBinding"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(clusterRoleBinding.Name) + + b.WithKind("ClusterRoleBinding") + b.WithAPIVersion("rbac.authorization.k8s.io/v1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *ClusterRoleBindingApplyConfiguration) WithKind(value string) *ClusterRoleBindingApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *ClusterRoleBindingApplyConfiguration) WithAPIVersion(value string) *ClusterRoleBindingApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ClusterRoleBindingApplyConfiguration) WithName(value string) *ClusterRoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *ClusterRoleBindingApplyConfiguration) WithGenerateName(value string) *ClusterRoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *ClusterRoleBindingApplyConfiguration) WithNamespace(value string) *ClusterRoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *ClusterRoleBindingApplyConfiguration) WithSelfLink(value string) *ClusterRoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *ClusterRoleBindingApplyConfiguration) WithUID(value types.UID) *ClusterRoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *ClusterRoleBindingApplyConfiguration) WithResourceVersion(value string) *ClusterRoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *ClusterRoleBindingApplyConfiguration) WithGeneration(value int64) *ClusterRoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *ClusterRoleBindingApplyConfiguration) WithCreationTimestamp(value metav1.Time) *ClusterRoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *ClusterRoleBindingApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *ClusterRoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *ClusterRoleBindingApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *ClusterRoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *ClusterRoleBindingApplyConfiguration) WithLabels(entries map[string]string) *ClusterRoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *ClusterRoleBindingApplyConfiguration) WithAnnotations(entries map[string]string) *ClusterRoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *ClusterRoleBindingApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *ClusterRoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *ClusterRoleBindingApplyConfiguration) WithFinalizers(values ...string) *ClusterRoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *ClusterRoleBindingApplyConfiguration) WithClusterName(value string) *ClusterRoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *ClusterRoleBindingApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSubjects adds the given value to the Subjects field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Subjects field. +func (b *ClusterRoleBindingApplyConfiguration) WithSubjects(values ...*SubjectApplyConfiguration) *ClusterRoleBindingApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithSubjects") + } + b.Subjects = append(b.Subjects, *values[i]) + } + return b +} + +// WithRoleRef sets the RoleRef field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RoleRef field is set to the value of the last call. +func (b *ClusterRoleBindingApplyConfiguration) WithRoleRef(value *RoleRefApplyConfiguration) *ClusterRoleBindingApplyConfiguration { + b.RoleRef = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/rbac/v1/policyrule.go b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1/policyrule.go new file mode 100644 index 000000000000..65ee1d4fe5a0 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1/policyrule.go @@ -0,0 +1,85 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// PolicyRuleApplyConfiguration represents an declarative configuration of the PolicyRule type for use +// with apply. +type PolicyRuleApplyConfiguration struct { + Verbs []string `json:"verbs,omitempty"` + APIGroups []string `json:"apiGroups,omitempty"` + Resources []string `json:"resources,omitempty"` + ResourceNames []string `json:"resourceNames,omitempty"` + NonResourceURLs []string `json:"nonResourceURLs,omitempty"` +} + +// PolicyRuleApplyConfiguration constructs an declarative configuration of the PolicyRule type for use with +// apply. +func PolicyRule() *PolicyRuleApplyConfiguration { + return &PolicyRuleApplyConfiguration{} +} + +// WithVerbs adds the given value to the Verbs field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Verbs field. +func (b *PolicyRuleApplyConfiguration) WithVerbs(values ...string) *PolicyRuleApplyConfiguration { + for i := range values { + b.Verbs = append(b.Verbs, values[i]) + } + return b +} + +// WithAPIGroups adds the given value to the APIGroups field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the APIGroups field. +func (b *PolicyRuleApplyConfiguration) WithAPIGroups(values ...string) *PolicyRuleApplyConfiguration { + for i := range values { + b.APIGroups = append(b.APIGroups, values[i]) + } + return b +} + +// WithResources adds the given value to the Resources field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Resources field. +func (b *PolicyRuleApplyConfiguration) WithResources(values ...string) *PolicyRuleApplyConfiguration { + for i := range values { + b.Resources = append(b.Resources, values[i]) + } + return b +} + +// WithResourceNames adds the given value to the ResourceNames field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the ResourceNames field. +func (b *PolicyRuleApplyConfiguration) WithResourceNames(values ...string) *PolicyRuleApplyConfiguration { + for i := range values { + b.ResourceNames = append(b.ResourceNames, values[i]) + } + return b +} + +// WithNonResourceURLs adds the given value to the NonResourceURLs field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the NonResourceURLs field. +func (b *PolicyRuleApplyConfiguration) WithNonResourceURLs(values ...string) *PolicyRuleApplyConfiguration { + for i := range values { + b.NonResourceURLs = append(b.NonResourceURLs, values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/rbac/v1/role.go b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1/role.go new file mode 100644 index 000000000000..772122f45641 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1/role.go @@ -0,0 +1,261 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + apirbacv1 "k8s.io/api/rbac/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// RoleApplyConfiguration represents an declarative configuration of the Role type for use +// with apply. +type RoleApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Rules []PolicyRuleApplyConfiguration `json:"rules,omitempty"` +} + +// Role constructs an declarative configuration of the Role type for use with +// apply. +func Role(name, namespace string) *RoleApplyConfiguration { + b := &RoleApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("Role") + b.WithAPIVersion("rbac.authorization.k8s.io/v1") + return b +} + +// ExtractRole extracts the applied configuration owned by fieldManager from +// role. If no managedFields are found in role for fieldManager, a +// RoleApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// role must be a unmodified Role API object that was retrieved from the Kubernetes API. +// ExtractRole provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractRole(role *apirbacv1.Role, fieldManager string) (*RoleApplyConfiguration, error) { + b := &RoleApplyConfiguration{} + err := managedfields.ExtractInto(role, internal.Parser().Type("io.k8s.api.rbac.v1.Role"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(role.Name) + b.WithNamespace(role.Namespace) + + b.WithKind("Role") + b.WithAPIVersion("rbac.authorization.k8s.io/v1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *RoleApplyConfiguration) WithKind(value string) *RoleApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *RoleApplyConfiguration) WithAPIVersion(value string) *RoleApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *RoleApplyConfiguration) WithName(value string) *RoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *RoleApplyConfiguration) WithGenerateName(value string) *RoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *RoleApplyConfiguration) WithNamespace(value string) *RoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *RoleApplyConfiguration) WithSelfLink(value string) *RoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *RoleApplyConfiguration) WithUID(value types.UID) *RoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *RoleApplyConfiguration) WithResourceVersion(value string) *RoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *RoleApplyConfiguration) WithGeneration(value int64) *RoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *RoleApplyConfiguration) WithCreationTimestamp(value metav1.Time) *RoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *RoleApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *RoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *RoleApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *RoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *RoleApplyConfiguration) WithLabels(entries map[string]string) *RoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *RoleApplyConfiguration) WithAnnotations(entries map[string]string) *RoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *RoleApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *RoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *RoleApplyConfiguration) WithFinalizers(values ...string) *RoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *RoleApplyConfiguration) WithClusterName(value string) *RoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *RoleApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithRules adds the given value to the Rules field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Rules field. +func (b *RoleApplyConfiguration) WithRules(values ...*PolicyRuleApplyConfiguration) *RoleApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithRules") + } + b.Rules = append(b.Rules, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/rbac/v1/rolebinding.go b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1/rolebinding.go new file mode 100644 index 000000000000..85dc476cd441 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1/rolebinding.go @@ -0,0 +1,270 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + apirbacv1 "k8s.io/api/rbac/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// RoleBindingApplyConfiguration represents an declarative configuration of the RoleBinding type for use +// with apply. +type RoleBindingApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Subjects []SubjectApplyConfiguration `json:"subjects,omitempty"` + RoleRef *RoleRefApplyConfiguration `json:"roleRef,omitempty"` +} + +// RoleBinding constructs an declarative configuration of the RoleBinding type for use with +// apply. +func RoleBinding(name, namespace string) *RoleBindingApplyConfiguration { + b := &RoleBindingApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("RoleBinding") + b.WithAPIVersion("rbac.authorization.k8s.io/v1") + return b +} + +// ExtractRoleBinding extracts the applied configuration owned by fieldManager from +// roleBinding. If no managedFields are found in roleBinding for fieldManager, a +// RoleBindingApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// roleBinding must be a unmodified RoleBinding API object that was retrieved from the Kubernetes API. +// ExtractRoleBinding provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractRoleBinding(roleBinding *apirbacv1.RoleBinding, fieldManager string) (*RoleBindingApplyConfiguration, error) { + b := &RoleBindingApplyConfiguration{} + err := managedfields.ExtractInto(roleBinding, internal.Parser().Type("io.k8s.api.rbac.v1.RoleBinding"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(roleBinding.Name) + b.WithNamespace(roleBinding.Namespace) + + b.WithKind("RoleBinding") + b.WithAPIVersion("rbac.authorization.k8s.io/v1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *RoleBindingApplyConfiguration) WithKind(value string) *RoleBindingApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *RoleBindingApplyConfiguration) WithAPIVersion(value string) *RoleBindingApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *RoleBindingApplyConfiguration) WithName(value string) *RoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *RoleBindingApplyConfiguration) WithGenerateName(value string) *RoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *RoleBindingApplyConfiguration) WithNamespace(value string) *RoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *RoleBindingApplyConfiguration) WithSelfLink(value string) *RoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *RoleBindingApplyConfiguration) WithUID(value types.UID) *RoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *RoleBindingApplyConfiguration) WithResourceVersion(value string) *RoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *RoleBindingApplyConfiguration) WithGeneration(value int64) *RoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *RoleBindingApplyConfiguration) WithCreationTimestamp(value metav1.Time) *RoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *RoleBindingApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *RoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *RoleBindingApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *RoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *RoleBindingApplyConfiguration) WithLabels(entries map[string]string) *RoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *RoleBindingApplyConfiguration) WithAnnotations(entries map[string]string) *RoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *RoleBindingApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *RoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *RoleBindingApplyConfiguration) WithFinalizers(values ...string) *RoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *RoleBindingApplyConfiguration) WithClusterName(value string) *RoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *RoleBindingApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSubjects adds the given value to the Subjects field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Subjects field. +func (b *RoleBindingApplyConfiguration) WithSubjects(values ...*SubjectApplyConfiguration) *RoleBindingApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithSubjects") + } + b.Subjects = append(b.Subjects, *values[i]) + } + return b +} + +// WithRoleRef sets the RoleRef field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RoleRef field is set to the value of the last call. +func (b *RoleBindingApplyConfiguration) WithRoleRef(value *RoleRefApplyConfiguration) *RoleBindingApplyConfiguration { + b.RoleRef = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/rbac/v1/roleref.go b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1/roleref.go new file mode 100644 index 000000000000..ef03a4882766 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1/roleref.go @@ -0,0 +1,57 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// RoleRefApplyConfiguration represents an declarative configuration of the RoleRef type for use +// with apply. +type RoleRefApplyConfiguration struct { + APIGroup *string `json:"apiGroup,omitempty"` + Kind *string `json:"kind,omitempty"` + Name *string `json:"name,omitempty"` +} + +// RoleRefApplyConfiguration constructs an declarative configuration of the RoleRef type for use with +// apply. +func RoleRef() *RoleRefApplyConfiguration { + return &RoleRefApplyConfiguration{} +} + +// WithAPIGroup sets the APIGroup field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIGroup field is set to the value of the last call. +func (b *RoleRefApplyConfiguration) WithAPIGroup(value string) *RoleRefApplyConfiguration { + b.APIGroup = &value + return b +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *RoleRefApplyConfiguration) WithKind(value string) *RoleRefApplyConfiguration { + b.Kind = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *RoleRefApplyConfiguration) WithName(value string) *RoleRefApplyConfiguration { + b.Name = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/rbac/v1/subject.go b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1/subject.go new file mode 100644 index 000000000000..ebc87fdc45af --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1/subject.go @@ -0,0 +1,66 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// SubjectApplyConfiguration represents an declarative configuration of the Subject type for use +// with apply. +type SubjectApplyConfiguration struct { + Kind *string `json:"kind,omitempty"` + APIGroup *string `json:"apiGroup,omitempty"` + Name *string `json:"name,omitempty"` + Namespace *string `json:"namespace,omitempty"` +} + +// SubjectApplyConfiguration constructs an declarative configuration of the Subject type for use with +// apply. +func Subject() *SubjectApplyConfiguration { + return &SubjectApplyConfiguration{} +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *SubjectApplyConfiguration) WithKind(value string) *SubjectApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIGroup sets the APIGroup field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIGroup field is set to the value of the last call. +func (b *SubjectApplyConfiguration) WithAPIGroup(value string) *SubjectApplyConfiguration { + b.APIGroup = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *SubjectApplyConfiguration) WithName(value string) *SubjectApplyConfiguration { + b.Name = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *SubjectApplyConfiguration) WithNamespace(value string) *SubjectApplyConfiguration { + b.Namespace = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/rbac/v1alpha1/aggregationrule.go b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1alpha1/aggregationrule.go new file mode 100644 index 000000000000..63cdc3fcca3a --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1alpha1/aggregationrule.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// AggregationRuleApplyConfiguration represents an declarative configuration of the AggregationRule type for use +// with apply. +type AggregationRuleApplyConfiguration struct { + ClusterRoleSelectors []v1.LabelSelectorApplyConfiguration `json:"clusterRoleSelectors,omitempty"` +} + +// AggregationRuleApplyConfiguration constructs an declarative configuration of the AggregationRule type for use with +// apply. +func AggregationRule() *AggregationRuleApplyConfiguration { + return &AggregationRuleApplyConfiguration{} +} + +// WithClusterRoleSelectors adds the given value to the ClusterRoleSelectors field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the ClusterRoleSelectors field. +func (b *AggregationRuleApplyConfiguration) WithClusterRoleSelectors(values ...*v1.LabelSelectorApplyConfiguration) *AggregationRuleApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithClusterRoleSelectors") + } + b.ClusterRoleSelectors = append(b.ClusterRoleSelectors, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/rbac/v1alpha1/clusterrole.go b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1alpha1/clusterrole.go new file mode 100644 index 000000000000..4e2d4a63c3b1 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1alpha1/clusterrole.go @@ -0,0 +1,268 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + rbacv1alpha1 "k8s.io/api/rbac/v1alpha1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// ClusterRoleApplyConfiguration represents an declarative configuration of the ClusterRole type for use +// with apply. +type ClusterRoleApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Rules []PolicyRuleApplyConfiguration `json:"rules,omitempty"` + AggregationRule *AggregationRuleApplyConfiguration `json:"aggregationRule,omitempty"` +} + +// ClusterRole constructs an declarative configuration of the ClusterRole type for use with +// apply. +func ClusterRole(name string) *ClusterRoleApplyConfiguration { + b := &ClusterRoleApplyConfiguration{} + b.WithName(name) + b.WithKind("ClusterRole") + b.WithAPIVersion("rbac.authorization.k8s.io/v1alpha1") + return b +} + +// ExtractClusterRole extracts the applied configuration owned by fieldManager from +// clusterRole. If no managedFields are found in clusterRole for fieldManager, a +// ClusterRoleApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// clusterRole must be a unmodified ClusterRole API object that was retrieved from the Kubernetes API. +// ExtractClusterRole provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractClusterRole(clusterRole *rbacv1alpha1.ClusterRole, fieldManager string) (*ClusterRoleApplyConfiguration, error) { + b := &ClusterRoleApplyConfiguration{} + err := managedfields.ExtractInto(clusterRole, internal.Parser().Type("io.k8s.api.rbac.v1alpha1.ClusterRole"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(clusterRole.Name) + + b.WithKind("ClusterRole") + b.WithAPIVersion("rbac.authorization.k8s.io/v1alpha1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *ClusterRoleApplyConfiguration) WithKind(value string) *ClusterRoleApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *ClusterRoleApplyConfiguration) WithAPIVersion(value string) *ClusterRoleApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ClusterRoleApplyConfiguration) WithName(value string) *ClusterRoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *ClusterRoleApplyConfiguration) WithGenerateName(value string) *ClusterRoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *ClusterRoleApplyConfiguration) WithNamespace(value string) *ClusterRoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *ClusterRoleApplyConfiguration) WithSelfLink(value string) *ClusterRoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *ClusterRoleApplyConfiguration) WithUID(value types.UID) *ClusterRoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *ClusterRoleApplyConfiguration) WithResourceVersion(value string) *ClusterRoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *ClusterRoleApplyConfiguration) WithGeneration(value int64) *ClusterRoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *ClusterRoleApplyConfiguration) WithCreationTimestamp(value metav1.Time) *ClusterRoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *ClusterRoleApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *ClusterRoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *ClusterRoleApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *ClusterRoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *ClusterRoleApplyConfiguration) WithLabels(entries map[string]string) *ClusterRoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *ClusterRoleApplyConfiguration) WithAnnotations(entries map[string]string) *ClusterRoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *ClusterRoleApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *ClusterRoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *ClusterRoleApplyConfiguration) WithFinalizers(values ...string) *ClusterRoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *ClusterRoleApplyConfiguration) WithClusterName(value string) *ClusterRoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *ClusterRoleApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithRules adds the given value to the Rules field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Rules field. +func (b *ClusterRoleApplyConfiguration) WithRules(values ...*PolicyRuleApplyConfiguration) *ClusterRoleApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithRules") + } + b.Rules = append(b.Rules, *values[i]) + } + return b +} + +// WithAggregationRule sets the AggregationRule field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AggregationRule field is set to the value of the last call. +func (b *ClusterRoleApplyConfiguration) WithAggregationRule(value *AggregationRuleApplyConfiguration) *ClusterRoleApplyConfiguration { + b.AggregationRule = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/rbac/v1alpha1/clusterrolebinding.go b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1alpha1/clusterrolebinding.go new file mode 100644 index 000000000000..10c93e5a5f75 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1alpha1/clusterrolebinding.go @@ -0,0 +1,268 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + rbacv1alpha1 "k8s.io/api/rbac/v1alpha1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// ClusterRoleBindingApplyConfiguration represents an declarative configuration of the ClusterRoleBinding type for use +// with apply. +type ClusterRoleBindingApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Subjects []SubjectApplyConfiguration `json:"subjects,omitempty"` + RoleRef *RoleRefApplyConfiguration `json:"roleRef,omitempty"` +} + +// ClusterRoleBinding constructs an declarative configuration of the ClusterRoleBinding type for use with +// apply. +func ClusterRoleBinding(name string) *ClusterRoleBindingApplyConfiguration { + b := &ClusterRoleBindingApplyConfiguration{} + b.WithName(name) + b.WithKind("ClusterRoleBinding") + b.WithAPIVersion("rbac.authorization.k8s.io/v1alpha1") + return b +} + +// ExtractClusterRoleBinding extracts the applied configuration owned by fieldManager from +// clusterRoleBinding. If no managedFields are found in clusterRoleBinding for fieldManager, a +// ClusterRoleBindingApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// clusterRoleBinding must be a unmodified ClusterRoleBinding API object that was retrieved from the Kubernetes API. +// ExtractClusterRoleBinding provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractClusterRoleBinding(clusterRoleBinding *rbacv1alpha1.ClusterRoleBinding, fieldManager string) (*ClusterRoleBindingApplyConfiguration, error) { + b := &ClusterRoleBindingApplyConfiguration{} + err := managedfields.ExtractInto(clusterRoleBinding, internal.Parser().Type("io.k8s.api.rbac.v1alpha1.ClusterRoleBinding"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(clusterRoleBinding.Name) + + b.WithKind("ClusterRoleBinding") + b.WithAPIVersion("rbac.authorization.k8s.io/v1alpha1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *ClusterRoleBindingApplyConfiguration) WithKind(value string) *ClusterRoleBindingApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *ClusterRoleBindingApplyConfiguration) WithAPIVersion(value string) *ClusterRoleBindingApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ClusterRoleBindingApplyConfiguration) WithName(value string) *ClusterRoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *ClusterRoleBindingApplyConfiguration) WithGenerateName(value string) *ClusterRoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *ClusterRoleBindingApplyConfiguration) WithNamespace(value string) *ClusterRoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *ClusterRoleBindingApplyConfiguration) WithSelfLink(value string) *ClusterRoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *ClusterRoleBindingApplyConfiguration) WithUID(value types.UID) *ClusterRoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *ClusterRoleBindingApplyConfiguration) WithResourceVersion(value string) *ClusterRoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *ClusterRoleBindingApplyConfiguration) WithGeneration(value int64) *ClusterRoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *ClusterRoleBindingApplyConfiguration) WithCreationTimestamp(value metav1.Time) *ClusterRoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *ClusterRoleBindingApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *ClusterRoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *ClusterRoleBindingApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *ClusterRoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *ClusterRoleBindingApplyConfiguration) WithLabels(entries map[string]string) *ClusterRoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *ClusterRoleBindingApplyConfiguration) WithAnnotations(entries map[string]string) *ClusterRoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *ClusterRoleBindingApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *ClusterRoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *ClusterRoleBindingApplyConfiguration) WithFinalizers(values ...string) *ClusterRoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *ClusterRoleBindingApplyConfiguration) WithClusterName(value string) *ClusterRoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *ClusterRoleBindingApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSubjects adds the given value to the Subjects field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Subjects field. +func (b *ClusterRoleBindingApplyConfiguration) WithSubjects(values ...*SubjectApplyConfiguration) *ClusterRoleBindingApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithSubjects") + } + b.Subjects = append(b.Subjects, *values[i]) + } + return b +} + +// WithRoleRef sets the RoleRef field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RoleRef field is set to the value of the last call. +func (b *ClusterRoleBindingApplyConfiguration) WithRoleRef(value *RoleRefApplyConfiguration) *ClusterRoleBindingApplyConfiguration { + b.RoleRef = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/rbac/v1alpha1/policyrule.go b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1alpha1/policyrule.go new file mode 100644 index 000000000000..12143af13040 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1alpha1/policyrule.go @@ -0,0 +1,85 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +// PolicyRuleApplyConfiguration represents an declarative configuration of the PolicyRule type for use +// with apply. +type PolicyRuleApplyConfiguration struct { + Verbs []string `json:"verbs,omitempty"` + APIGroups []string `json:"apiGroups,omitempty"` + Resources []string `json:"resources,omitempty"` + ResourceNames []string `json:"resourceNames,omitempty"` + NonResourceURLs []string `json:"nonResourceURLs,omitempty"` +} + +// PolicyRuleApplyConfiguration constructs an declarative configuration of the PolicyRule type for use with +// apply. +func PolicyRule() *PolicyRuleApplyConfiguration { + return &PolicyRuleApplyConfiguration{} +} + +// WithVerbs adds the given value to the Verbs field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Verbs field. +func (b *PolicyRuleApplyConfiguration) WithVerbs(values ...string) *PolicyRuleApplyConfiguration { + for i := range values { + b.Verbs = append(b.Verbs, values[i]) + } + return b +} + +// WithAPIGroups adds the given value to the APIGroups field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the APIGroups field. +func (b *PolicyRuleApplyConfiguration) WithAPIGroups(values ...string) *PolicyRuleApplyConfiguration { + for i := range values { + b.APIGroups = append(b.APIGroups, values[i]) + } + return b +} + +// WithResources adds the given value to the Resources field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Resources field. +func (b *PolicyRuleApplyConfiguration) WithResources(values ...string) *PolicyRuleApplyConfiguration { + for i := range values { + b.Resources = append(b.Resources, values[i]) + } + return b +} + +// WithResourceNames adds the given value to the ResourceNames field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the ResourceNames field. +func (b *PolicyRuleApplyConfiguration) WithResourceNames(values ...string) *PolicyRuleApplyConfiguration { + for i := range values { + b.ResourceNames = append(b.ResourceNames, values[i]) + } + return b +} + +// WithNonResourceURLs adds the given value to the NonResourceURLs field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the NonResourceURLs field. +func (b *PolicyRuleApplyConfiguration) WithNonResourceURLs(values ...string) *PolicyRuleApplyConfiguration { + for i := range values { + b.NonResourceURLs = append(b.NonResourceURLs, values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/rbac/v1alpha1/role.go b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1alpha1/role.go new file mode 100644 index 000000000000..d9bf15b4c973 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1alpha1/role.go @@ -0,0 +1,261 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + rbacv1alpha1 "k8s.io/api/rbac/v1alpha1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// RoleApplyConfiguration represents an declarative configuration of the Role type for use +// with apply. +type RoleApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Rules []PolicyRuleApplyConfiguration `json:"rules,omitempty"` +} + +// Role constructs an declarative configuration of the Role type for use with +// apply. +func Role(name, namespace string) *RoleApplyConfiguration { + b := &RoleApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("Role") + b.WithAPIVersion("rbac.authorization.k8s.io/v1alpha1") + return b +} + +// ExtractRole extracts the applied configuration owned by fieldManager from +// role. If no managedFields are found in role for fieldManager, a +// RoleApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// role must be a unmodified Role API object that was retrieved from the Kubernetes API. +// ExtractRole provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractRole(role *rbacv1alpha1.Role, fieldManager string) (*RoleApplyConfiguration, error) { + b := &RoleApplyConfiguration{} + err := managedfields.ExtractInto(role, internal.Parser().Type("io.k8s.api.rbac.v1alpha1.Role"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(role.Name) + b.WithNamespace(role.Namespace) + + b.WithKind("Role") + b.WithAPIVersion("rbac.authorization.k8s.io/v1alpha1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *RoleApplyConfiguration) WithKind(value string) *RoleApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *RoleApplyConfiguration) WithAPIVersion(value string) *RoleApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *RoleApplyConfiguration) WithName(value string) *RoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *RoleApplyConfiguration) WithGenerateName(value string) *RoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *RoleApplyConfiguration) WithNamespace(value string) *RoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *RoleApplyConfiguration) WithSelfLink(value string) *RoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *RoleApplyConfiguration) WithUID(value types.UID) *RoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *RoleApplyConfiguration) WithResourceVersion(value string) *RoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *RoleApplyConfiguration) WithGeneration(value int64) *RoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *RoleApplyConfiguration) WithCreationTimestamp(value metav1.Time) *RoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *RoleApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *RoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *RoleApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *RoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *RoleApplyConfiguration) WithLabels(entries map[string]string) *RoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *RoleApplyConfiguration) WithAnnotations(entries map[string]string) *RoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *RoleApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *RoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *RoleApplyConfiguration) WithFinalizers(values ...string) *RoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *RoleApplyConfiguration) WithClusterName(value string) *RoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *RoleApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithRules adds the given value to the Rules field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Rules field. +func (b *RoleApplyConfiguration) WithRules(values ...*PolicyRuleApplyConfiguration) *RoleApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithRules") + } + b.Rules = append(b.Rules, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/rbac/v1alpha1/rolebinding.go b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1alpha1/rolebinding.go new file mode 100644 index 000000000000..ca6f563a3738 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1alpha1/rolebinding.go @@ -0,0 +1,270 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + rbacv1alpha1 "k8s.io/api/rbac/v1alpha1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// RoleBindingApplyConfiguration represents an declarative configuration of the RoleBinding type for use +// with apply. +type RoleBindingApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Subjects []SubjectApplyConfiguration `json:"subjects,omitempty"` + RoleRef *RoleRefApplyConfiguration `json:"roleRef,omitempty"` +} + +// RoleBinding constructs an declarative configuration of the RoleBinding type for use with +// apply. +func RoleBinding(name, namespace string) *RoleBindingApplyConfiguration { + b := &RoleBindingApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("RoleBinding") + b.WithAPIVersion("rbac.authorization.k8s.io/v1alpha1") + return b +} + +// ExtractRoleBinding extracts the applied configuration owned by fieldManager from +// roleBinding. If no managedFields are found in roleBinding for fieldManager, a +// RoleBindingApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// roleBinding must be a unmodified RoleBinding API object that was retrieved from the Kubernetes API. +// ExtractRoleBinding provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractRoleBinding(roleBinding *rbacv1alpha1.RoleBinding, fieldManager string) (*RoleBindingApplyConfiguration, error) { + b := &RoleBindingApplyConfiguration{} + err := managedfields.ExtractInto(roleBinding, internal.Parser().Type("io.k8s.api.rbac.v1alpha1.RoleBinding"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(roleBinding.Name) + b.WithNamespace(roleBinding.Namespace) + + b.WithKind("RoleBinding") + b.WithAPIVersion("rbac.authorization.k8s.io/v1alpha1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *RoleBindingApplyConfiguration) WithKind(value string) *RoleBindingApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *RoleBindingApplyConfiguration) WithAPIVersion(value string) *RoleBindingApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *RoleBindingApplyConfiguration) WithName(value string) *RoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *RoleBindingApplyConfiguration) WithGenerateName(value string) *RoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *RoleBindingApplyConfiguration) WithNamespace(value string) *RoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *RoleBindingApplyConfiguration) WithSelfLink(value string) *RoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *RoleBindingApplyConfiguration) WithUID(value types.UID) *RoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *RoleBindingApplyConfiguration) WithResourceVersion(value string) *RoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *RoleBindingApplyConfiguration) WithGeneration(value int64) *RoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *RoleBindingApplyConfiguration) WithCreationTimestamp(value metav1.Time) *RoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *RoleBindingApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *RoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *RoleBindingApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *RoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *RoleBindingApplyConfiguration) WithLabels(entries map[string]string) *RoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *RoleBindingApplyConfiguration) WithAnnotations(entries map[string]string) *RoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *RoleBindingApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *RoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *RoleBindingApplyConfiguration) WithFinalizers(values ...string) *RoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *RoleBindingApplyConfiguration) WithClusterName(value string) *RoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *RoleBindingApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSubjects adds the given value to the Subjects field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Subjects field. +func (b *RoleBindingApplyConfiguration) WithSubjects(values ...*SubjectApplyConfiguration) *RoleBindingApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithSubjects") + } + b.Subjects = append(b.Subjects, *values[i]) + } + return b +} + +// WithRoleRef sets the RoleRef field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RoleRef field is set to the value of the last call. +func (b *RoleBindingApplyConfiguration) WithRoleRef(value *RoleRefApplyConfiguration) *RoleBindingApplyConfiguration { + b.RoleRef = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/rbac/v1alpha1/roleref.go b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1alpha1/roleref.go new file mode 100644 index 000000000000..40dbc330736e --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1alpha1/roleref.go @@ -0,0 +1,57 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +// RoleRefApplyConfiguration represents an declarative configuration of the RoleRef type for use +// with apply. +type RoleRefApplyConfiguration struct { + APIGroup *string `json:"apiGroup,omitempty"` + Kind *string `json:"kind,omitempty"` + Name *string `json:"name,omitempty"` +} + +// RoleRefApplyConfiguration constructs an declarative configuration of the RoleRef type for use with +// apply. +func RoleRef() *RoleRefApplyConfiguration { + return &RoleRefApplyConfiguration{} +} + +// WithAPIGroup sets the APIGroup field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIGroup field is set to the value of the last call. +func (b *RoleRefApplyConfiguration) WithAPIGroup(value string) *RoleRefApplyConfiguration { + b.APIGroup = &value + return b +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *RoleRefApplyConfiguration) WithKind(value string) *RoleRefApplyConfiguration { + b.Kind = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *RoleRefApplyConfiguration) WithName(value string) *RoleRefApplyConfiguration { + b.Name = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/rbac/v1alpha1/subject.go b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1alpha1/subject.go new file mode 100644 index 000000000000..46640dbbe99e --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1alpha1/subject.go @@ -0,0 +1,66 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +// SubjectApplyConfiguration represents an declarative configuration of the Subject type for use +// with apply. +type SubjectApplyConfiguration struct { + Kind *string `json:"kind,omitempty"` + APIVersion *string `json:"apiVersion,omitempty"` + Name *string `json:"name,omitempty"` + Namespace *string `json:"namespace,omitempty"` +} + +// SubjectApplyConfiguration constructs an declarative configuration of the Subject type for use with +// apply. +func Subject() *SubjectApplyConfiguration { + return &SubjectApplyConfiguration{} +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *SubjectApplyConfiguration) WithKind(value string) *SubjectApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *SubjectApplyConfiguration) WithAPIVersion(value string) *SubjectApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *SubjectApplyConfiguration) WithName(value string) *SubjectApplyConfiguration { + b.Name = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *SubjectApplyConfiguration) WithNamespace(value string) *SubjectApplyConfiguration { + b.Namespace = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/rbac/v1beta1/aggregationrule.go b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1beta1/aggregationrule.go new file mode 100644 index 000000000000..d52ac3db9bf3 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1beta1/aggregationrule.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// AggregationRuleApplyConfiguration represents an declarative configuration of the AggregationRule type for use +// with apply. +type AggregationRuleApplyConfiguration struct { + ClusterRoleSelectors []v1.LabelSelectorApplyConfiguration `json:"clusterRoleSelectors,omitempty"` +} + +// AggregationRuleApplyConfiguration constructs an declarative configuration of the AggregationRule type for use with +// apply. +func AggregationRule() *AggregationRuleApplyConfiguration { + return &AggregationRuleApplyConfiguration{} +} + +// WithClusterRoleSelectors adds the given value to the ClusterRoleSelectors field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the ClusterRoleSelectors field. +func (b *AggregationRuleApplyConfiguration) WithClusterRoleSelectors(values ...*v1.LabelSelectorApplyConfiguration) *AggregationRuleApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithClusterRoleSelectors") + } + b.ClusterRoleSelectors = append(b.ClusterRoleSelectors, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/rbac/v1beta1/clusterrole.go b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1beta1/clusterrole.go new file mode 100644 index 000000000000..4f5f28170ab6 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1beta1/clusterrole.go @@ -0,0 +1,268 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + rbacv1beta1 "k8s.io/api/rbac/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// ClusterRoleApplyConfiguration represents an declarative configuration of the ClusterRole type for use +// with apply. +type ClusterRoleApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Rules []PolicyRuleApplyConfiguration `json:"rules,omitempty"` + AggregationRule *AggregationRuleApplyConfiguration `json:"aggregationRule,omitempty"` +} + +// ClusterRole constructs an declarative configuration of the ClusterRole type for use with +// apply. +func ClusterRole(name string) *ClusterRoleApplyConfiguration { + b := &ClusterRoleApplyConfiguration{} + b.WithName(name) + b.WithKind("ClusterRole") + b.WithAPIVersion("rbac.authorization.k8s.io/v1beta1") + return b +} + +// ExtractClusterRole extracts the applied configuration owned by fieldManager from +// clusterRole. If no managedFields are found in clusterRole for fieldManager, a +// ClusterRoleApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// clusterRole must be a unmodified ClusterRole API object that was retrieved from the Kubernetes API. +// ExtractClusterRole provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractClusterRole(clusterRole *rbacv1beta1.ClusterRole, fieldManager string) (*ClusterRoleApplyConfiguration, error) { + b := &ClusterRoleApplyConfiguration{} + err := managedfields.ExtractInto(clusterRole, internal.Parser().Type("io.k8s.api.rbac.v1beta1.ClusterRole"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(clusterRole.Name) + + b.WithKind("ClusterRole") + b.WithAPIVersion("rbac.authorization.k8s.io/v1beta1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *ClusterRoleApplyConfiguration) WithKind(value string) *ClusterRoleApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *ClusterRoleApplyConfiguration) WithAPIVersion(value string) *ClusterRoleApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ClusterRoleApplyConfiguration) WithName(value string) *ClusterRoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *ClusterRoleApplyConfiguration) WithGenerateName(value string) *ClusterRoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *ClusterRoleApplyConfiguration) WithNamespace(value string) *ClusterRoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *ClusterRoleApplyConfiguration) WithSelfLink(value string) *ClusterRoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *ClusterRoleApplyConfiguration) WithUID(value types.UID) *ClusterRoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *ClusterRoleApplyConfiguration) WithResourceVersion(value string) *ClusterRoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *ClusterRoleApplyConfiguration) WithGeneration(value int64) *ClusterRoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *ClusterRoleApplyConfiguration) WithCreationTimestamp(value metav1.Time) *ClusterRoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *ClusterRoleApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *ClusterRoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *ClusterRoleApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *ClusterRoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *ClusterRoleApplyConfiguration) WithLabels(entries map[string]string) *ClusterRoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *ClusterRoleApplyConfiguration) WithAnnotations(entries map[string]string) *ClusterRoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *ClusterRoleApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *ClusterRoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *ClusterRoleApplyConfiguration) WithFinalizers(values ...string) *ClusterRoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *ClusterRoleApplyConfiguration) WithClusterName(value string) *ClusterRoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *ClusterRoleApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithRules adds the given value to the Rules field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Rules field. +func (b *ClusterRoleApplyConfiguration) WithRules(values ...*PolicyRuleApplyConfiguration) *ClusterRoleApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithRules") + } + b.Rules = append(b.Rules, *values[i]) + } + return b +} + +// WithAggregationRule sets the AggregationRule field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AggregationRule field is set to the value of the last call. +func (b *ClusterRoleApplyConfiguration) WithAggregationRule(value *AggregationRuleApplyConfiguration) *ClusterRoleApplyConfiguration { + b.AggregationRule = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/rbac/v1beta1/clusterrolebinding.go b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1beta1/clusterrolebinding.go new file mode 100644 index 000000000000..6fbe0aa98420 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1beta1/clusterrolebinding.go @@ -0,0 +1,268 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + rbacv1beta1 "k8s.io/api/rbac/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// ClusterRoleBindingApplyConfiguration represents an declarative configuration of the ClusterRoleBinding type for use +// with apply. +type ClusterRoleBindingApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Subjects []SubjectApplyConfiguration `json:"subjects,omitempty"` + RoleRef *RoleRefApplyConfiguration `json:"roleRef,omitempty"` +} + +// ClusterRoleBinding constructs an declarative configuration of the ClusterRoleBinding type for use with +// apply. +func ClusterRoleBinding(name string) *ClusterRoleBindingApplyConfiguration { + b := &ClusterRoleBindingApplyConfiguration{} + b.WithName(name) + b.WithKind("ClusterRoleBinding") + b.WithAPIVersion("rbac.authorization.k8s.io/v1beta1") + return b +} + +// ExtractClusterRoleBinding extracts the applied configuration owned by fieldManager from +// clusterRoleBinding. If no managedFields are found in clusterRoleBinding for fieldManager, a +// ClusterRoleBindingApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// clusterRoleBinding must be a unmodified ClusterRoleBinding API object that was retrieved from the Kubernetes API. +// ExtractClusterRoleBinding provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractClusterRoleBinding(clusterRoleBinding *rbacv1beta1.ClusterRoleBinding, fieldManager string) (*ClusterRoleBindingApplyConfiguration, error) { + b := &ClusterRoleBindingApplyConfiguration{} + err := managedfields.ExtractInto(clusterRoleBinding, internal.Parser().Type("io.k8s.api.rbac.v1beta1.ClusterRoleBinding"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(clusterRoleBinding.Name) + + b.WithKind("ClusterRoleBinding") + b.WithAPIVersion("rbac.authorization.k8s.io/v1beta1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *ClusterRoleBindingApplyConfiguration) WithKind(value string) *ClusterRoleBindingApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *ClusterRoleBindingApplyConfiguration) WithAPIVersion(value string) *ClusterRoleBindingApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *ClusterRoleBindingApplyConfiguration) WithName(value string) *ClusterRoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *ClusterRoleBindingApplyConfiguration) WithGenerateName(value string) *ClusterRoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *ClusterRoleBindingApplyConfiguration) WithNamespace(value string) *ClusterRoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *ClusterRoleBindingApplyConfiguration) WithSelfLink(value string) *ClusterRoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *ClusterRoleBindingApplyConfiguration) WithUID(value types.UID) *ClusterRoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *ClusterRoleBindingApplyConfiguration) WithResourceVersion(value string) *ClusterRoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *ClusterRoleBindingApplyConfiguration) WithGeneration(value int64) *ClusterRoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *ClusterRoleBindingApplyConfiguration) WithCreationTimestamp(value metav1.Time) *ClusterRoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *ClusterRoleBindingApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *ClusterRoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *ClusterRoleBindingApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *ClusterRoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *ClusterRoleBindingApplyConfiguration) WithLabels(entries map[string]string) *ClusterRoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *ClusterRoleBindingApplyConfiguration) WithAnnotations(entries map[string]string) *ClusterRoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *ClusterRoleBindingApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *ClusterRoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *ClusterRoleBindingApplyConfiguration) WithFinalizers(values ...string) *ClusterRoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *ClusterRoleBindingApplyConfiguration) WithClusterName(value string) *ClusterRoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *ClusterRoleBindingApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSubjects adds the given value to the Subjects field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Subjects field. +func (b *ClusterRoleBindingApplyConfiguration) WithSubjects(values ...*SubjectApplyConfiguration) *ClusterRoleBindingApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithSubjects") + } + b.Subjects = append(b.Subjects, *values[i]) + } + return b +} + +// WithRoleRef sets the RoleRef field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RoleRef field is set to the value of the last call. +func (b *ClusterRoleBindingApplyConfiguration) WithRoleRef(value *RoleRefApplyConfiguration) *ClusterRoleBindingApplyConfiguration { + b.RoleRef = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/rbac/v1beta1/policyrule.go b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1beta1/policyrule.go new file mode 100644 index 000000000000..c63dc68c6bb1 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1beta1/policyrule.go @@ -0,0 +1,85 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// PolicyRuleApplyConfiguration represents an declarative configuration of the PolicyRule type for use +// with apply. +type PolicyRuleApplyConfiguration struct { + Verbs []string `json:"verbs,omitempty"` + APIGroups []string `json:"apiGroups,omitempty"` + Resources []string `json:"resources,omitempty"` + ResourceNames []string `json:"resourceNames,omitempty"` + NonResourceURLs []string `json:"nonResourceURLs,omitempty"` +} + +// PolicyRuleApplyConfiguration constructs an declarative configuration of the PolicyRule type for use with +// apply. +func PolicyRule() *PolicyRuleApplyConfiguration { + return &PolicyRuleApplyConfiguration{} +} + +// WithVerbs adds the given value to the Verbs field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Verbs field. +func (b *PolicyRuleApplyConfiguration) WithVerbs(values ...string) *PolicyRuleApplyConfiguration { + for i := range values { + b.Verbs = append(b.Verbs, values[i]) + } + return b +} + +// WithAPIGroups adds the given value to the APIGroups field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the APIGroups field. +func (b *PolicyRuleApplyConfiguration) WithAPIGroups(values ...string) *PolicyRuleApplyConfiguration { + for i := range values { + b.APIGroups = append(b.APIGroups, values[i]) + } + return b +} + +// WithResources adds the given value to the Resources field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Resources field. +func (b *PolicyRuleApplyConfiguration) WithResources(values ...string) *PolicyRuleApplyConfiguration { + for i := range values { + b.Resources = append(b.Resources, values[i]) + } + return b +} + +// WithResourceNames adds the given value to the ResourceNames field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the ResourceNames field. +func (b *PolicyRuleApplyConfiguration) WithResourceNames(values ...string) *PolicyRuleApplyConfiguration { + for i := range values { + b.ResourceNames = append(b.ResourceNames, values[i]) + } + return b +} + +// WithNonResourceURLs adds the given value to the NonResourceURLs field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the NonResourceURLs field. +func (b *PolicyRuleApplyConfiguration) WithNonResourceURLs(values ...string) *PolicyRuleApplyConfiguration { + for i := range values { + b.NonResourceURLs = append(b.NonResourceURLs, values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/rbac/v1beta1/role.go b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1beta1/role.go new file mode 100644 index 000000000000..7e3744afba55 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1beta1/role.go @@ -0,0 +1,261 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + rbacv1beta1 "k8s.io/api/rbac/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// RoleApplyConfiguration represents an declarative configuration of the Role type for use +// with apply. +type RoleApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Rules []PolicyRuleApplyConfiguration `json:"rules,omitempty"` +} + +// Role constructs an declarative configuration of the Role type for use with +// apply. +func Role(name, namespace string) *RoleApplyConfiguration { + b := &RoleApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("Role") + b.WithAPIVersion("rbac.authorization.k8s.io/v1beta1") + return b +} + +// ExtractRole extracts the applied configuration owned by fieldManager from +// role. If no managedFields are found in role for fieldManager, a +// RoleApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// role must be a unmodified Role API object that was retrieved from the Kubernetes API. +// ExtractRole provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractRole(role *rbacv1beta1.Role, fieldManager string) (*RoleApplyConfiguration, error) { + b := &RoleApplyConfiguration{} + err := managedfields.ExtractInto(role, internal.Parser().Type("io.k8s.api.rbac.v1beta1.Role"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(role.Name) + b.WithNamespace(role.Namespace) + + b.WithKind("Role") + b.WithAPIVersion("rbac.authorization.k8s.io/v1beta1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *RoleApplyConfiguration) WithKind(value string) *RoleApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *RoleApplyConfiguration) WithAPIVersion(value string) *RoleApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *RoleApplyConfiguration) WithName(value string) *RoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *RoleApplyConfiguration) WithGenerateName(value string) *RoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *RoleApplyConfiguration) WithNamespace(value string) *RoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *RoleApplyConfiguration) WithSelfLink(value string) *RoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *RoleApplyConfiguration) WithUID(value types.UID) *RoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *RoleApplyConfiguration) WithResourceVersion(value string) *RoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *RoleApplyConfiguration) WithGeneration(value int64) *RoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *RoleApplyConfiguration) WithCreationTimestamp(value metav1.Time) *RoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *RoleApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *RoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *RoleApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *RoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *RoleApplyConfiguration) WithLabels(entries map[string]string) *RoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *RoleApplyConfiguration) WithAnnotations(entries map[string]string) *RoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *RoleApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *RoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *RoleApplyConfiguration) WithFinalizers(values ...string) *RoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *RoleApplyConfiguration) WithClusterName(value string) *RoleApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *RoleApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithRules adds the given value to the Rules field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Rules field. +func (b *RoleApplyConfiguration) WithRules(values ...*PolicyRuleApplyConfiguration) *RoleApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithRules") + } + b.Rules = append(b.Rules, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/rbac/v1beta1/rolebinding.go b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1beta1/rolebinding.go new file mode 100644 index 000000000000..ee3e6c55de1e --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1beta1/rolebinding.go @@ -0,0 +1,270 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + rbacv1beta1 "k8s.io/api/rbac/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// RoleBindingApplyConfiguration represents an declarative configuration of the RoleBinding type for use +// with apply. +type RoleBindingApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Subjects []SubjectApplyConfiguration `json:"subjects,omitempty"` + RoleRef *RoleRefApplyConfiguration `json:"roleRef,omitempty"` +} + +// RoleBinding constructs an declarative configuration of the RoleBinding type for use with +// apply. +func RoleBinding(name, namespace string) *RoleBindingApplyConfiguration { + b := &RoleBindingApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("RoleBinding") + b.WithAPIVersion("rbac.authorization.k8s.io/v1beta1") + return b +} + +// ExtractRoleBinding extracts the applied configuration owned by fieldManager from +// roleBinding. If no managedFields are found in roleBinding for fieldManager, a +// RoleBindingApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// roleBinding must be a unmodified RoleBinding API object that was retrieved from the Kubernetes API. +// ExtractRoleBinding provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractRoleBinding(roleBinding *rbacv1beta1.RoleBinding, fieldManager string) (*RoleBindingApplyConfiguration, error) { + b := &RoleBindingApplyConfiguration{} + err := managedfields.ExtractInto(roleBinding, internal.Parser().Type("io.k8s.api.rbac.v1beta1.RoleBinding"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(roleBinding.Name) + b.WithNamespace(roleBinding.Namespace) + + b.WithKind("RoleBinding") + b.WithAPIVersion("rbac.authorization.k8s.io/v1beta1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *RoleBindingApplyConfiguration) WithKind(value string) *RoleBindingApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *RoleBindingApplyConfiguration) WithAPIVersion(value string) *RoleBindingApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *RoleBindingApplyConfiguration) WithName(value string) *RoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *RoleBindingApplyConfiguration) WithGenerateName(value string) *RoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *RoleBindingApplyConfiguration) WithNamespace(value string) *RoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *RoleBindingApplyConfiguration) WithSelfLink(value string) *RoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *RoleBindingApplyConfiguration) WithUID(value types.UID) *RoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *RoleBindingApplyConfiguration) WithResourceVersion(value string) *RoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *RoleBindingApplyConfiguration) WithGeneration(value int64) *RoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *RoleBindingApplyConfiguration) WithCreationTimestamp(value metav1.Time) *RoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *RoleBindingApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *RoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *RoleBindingApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *RoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *RoleBindingApplyConfiguration) WithLabels(entries map[string]string) *RoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *RoleBindingApplyConfiguration) WithAnnotations(entries map[string]string) *RoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *RoleBindingApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *RoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *RoleBindingApplyConfiguration) WithFinalizers(values ...string) *RoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *RoleBindingApplyConfiguration) WithClusterName(value string) *RoleBindingApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *RoleBindingApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSubjects adds the given value to the Subjects field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Subjects field. +func (b *RoleBindingApplyConfiguration) WithSubjects(values ...*SubjectApplyConfiguration) *RoleBindingApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithSubjects") + } + b.Subjects = append(b.Subjects, *values[i]) + } + return b +} + +// WithRoleRef sets the RoleRef field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RoleRef field is set to the value of the last call. +func (b *RoleBindingApplyConfiguration) WithRoleRef(value *RoleRefApplyConfiguration) *RoleBindingApplyConfiguration { + b.RoleRef = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/rbac/v1beta1/roleref.go b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1beta1/roleref.go new file mode 100644 index 000000000000..e6a02dc60263 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1beta1/roleref.go @@ -0,0 +1,57 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// RoleRefApplyConfiguration represents an declarative configuration of the RoleRef type for use +// with apply. +type RoleRefApplyConfiguration struct { + APIGroup *string `json:"apiGroup,omitempty"` + Kind *string `json:"kind,omitempty"` + Name *string `json:"name,omitempty"` +} + +// RoleRefApplyConfiguration constructs an declarative configuration of the RoleRef type for use with +// apply. +func RoleRef() *RoleRefApplyConfiguration { + return &RoleRefApplyConfiguration{} +} + +// WithAPIGroup sets the APIGroup field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIGroup field is set to the value of the last call. +func (b *RoleRefApplyConfiguration) WithAPIGroup(value string) *RoleRefApplyConfiguration { + b.APIGroup = &value + return b +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *RoleRefApplyConfiguration) WithKind(value string) *RoleRefApplyConfiguration { + b.Kind = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *RoleRefApplyConfiguration) WithName(value string) *RoleRefApplyConfiguration { + b.Name = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/rbac/v1beta1/subject.go b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1beta1/subject.go new file mode 100644 index 000000000000..b616da8b1329 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/rbac/v1beta1/subject.go @@ -0,0 +1,66 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// SubjectApplyConfiguration represents an declarative configuration of the Subject type for use +// with apply. +type SubjectApplyConfiguration struct { + Kind *string `json:"kind,omitempty"` + APIGroup *string `json:"apiGroup,omitempty"` + Name *string `json:"name,omitempty"` + Namespace *string `json:"namespace,omitempty"` +} + +// SubjectApplyConfiguration constructs an declarative configuration of the Subject type for use with +// apply. +func Subject() *SubjectApplyConfiguration { + return &SubjectApplyConfiguration{} +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *SubjectApplyConfiguration) WithKind(value string) *SubjectApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIGroup sets the APIGroup field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIGroup field is set to the value of the last call. +func (b *SubjectApplyConfiguration) WithAPIGroup(value string) *SubjectApplyConfiguration { + b.APIGroup = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *SubjectApplyConfiguration) WithName(value string) *SubjectApplyConfiguration { + b.Name = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *SubjectApplyConfiguration) WithNamespace(value string) *SubjectApplyConfiguration { + b.Namespace = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/scheduling/v1/priorityclass.go b/vendor/k8s.io/client-go/applyconfigurations/scheduling/v1/priorityclass.go new file mode 100644 index 000000000000..6a942ecf1cb2 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/scheduling/v1/priorityclass.go @@ -0,0 +1,282 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + corev1 "k8s.io/api/core/v1" + schedulingv1 "k8s.io/api/scheduling/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// PriorityClassApplyConfiguration represents an declarative configuration of the PriorityClass type for use +// with apply. +type PriorityClassApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Value *int32 `json:"value,omitempty"` + GlobalDefault *bool `json:"globalDefault,omitempty"` + Description *string `json:"description,omitempty"` + PreemptionPolicy *corev1.PreemptionPolicy `json:"preemptionPolicy,omitempty"` +} + +// PriorityClass constructs an declarative configuration of the PriorityClass type for use with +// apply. +func PriorityClass(name string) *PriorityClassApplyConfiguration { + b := &PriorityClassApplyConfiguration{} + b.WithName(name) + b.WithKind("PriorityClass") + b.WithAPIVersion("scheduling.k8s.io/v1") + return b +} + +// ExtractPriorityClass extracts the applied configuration owned by fieldManager from +// priorityClass. If no managedFields are found in priorityClass for fieldManager, a +// PriorityClassApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// priorityClass must be a unmodified PriorityClass API object that was retrieved from the Kubernetes API. +// ExtractPriorityClass provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractPriorityClass(priorityClass *schedulingv1.PriorityClass, fieldManager string) (*PriorityClassApplyConfiguration, error) { + b := &PriorityClassApplyConfiguration{} + err := managedfields.ExtractInto(priorityClass, internal.Parser().Type("io.k8s.api.scheduling.v1.PriorityClass"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(priorityClass.Name) + + b.WithKind("PriorityClass") + b.WithAPIVersion("scheduling.k8s.io/v1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithKind(value string) *PriorityClassApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithAPIVersion(value string) *PriorityClassApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithName(value string) *PriorityClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithGenerateName(value string) *PriorityClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithNamespace(value string) *PriorityClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithSelfLink(value string) *PriorityClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithUID(value types.UID) *PriorityClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithResourceVersion(value string) *PriorityClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithGeneration(value int64) *PriorityClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithCreationTimestamp(value metav1.Time) *PriorityClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *PriorityClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *PriorityClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *PriorityClassApplyConfiguration) WithLabels(entries map[string]string) *PriorityClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *PriorityClassApplyConfiguration) WithAnnotations(entries map[string]string) *PriorityClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *PriorityClassApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *PriorityClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *PriorityClassApplyConfiguration) WithFinalizers(values ...string) *PriorityClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithClusterName(value string) *PriorityClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *PriorityClassApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithValue sets the Value field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Value field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithValue(value int32) *PriorityClassApplyConfiguration { + b.Value = &value + return b +} + +// WithGlobalDefault sets the GlobalDefault field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GlobalDefault field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithGlobalDefault(value bool) *PriorityClassApplyConfiguration { + b.GlobalDefault = &value + return b +} + +// WithDescription sets the Description field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Description field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithDescription(value string) *PriorityClassApplyConfiguration { + b.Description = &value + return b +} + +// WithPreemptionPolicy sets the PreemptionPolicy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PreemptionPolicy field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithPreemptionPolicy(value corev1.PreemptionPolicy) *PriorityClassApplyConfiguration { + b.PreemptionPolicy = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/scheduling/v1alpha1/priorityclass.go b/vendor/k8s.io/client-go/applyconfigurations/scheduling/v1alpha1/priorityclass.go new file mode 100644 index 000000000000..46dc278d9a9b --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/scheduling/v1alpha1/priorityclass.go @@ -0,0 +1,282 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + corev1 "k8s.io/api/core/v1" + v1alpha1 "k8s.io/api/scheduling/v1alpha1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// PriorityClassApplyConfiguration represents an declarative configuration of the PriorityClass type for use +// with apply. +type PriorityClassApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Value *int32 `json:"value,omitempty"` + GlobalDefault *bool `json:"globalDefault,omitempty"` + Description *string `json:"description,omitempty"` + PreemptionPolicy *corev1.PreemptionPolicy `json:"preemptionPolicy,omitempty"` +} + +// PriorityClass constructs an declarative configuration of the PriorityClass type for use with +// apply. +func PriorityClass(name string) *PriorityClassApplyConfiguration { + b := &PriorityClassApplyConfiguration{} + b.WithName(name) + b.WithKind("PriorityClass") + b.WithAPIVersion("scheduling.k8s.io/v1alpha1") + return b +} + +// ExtractPriorityClass extracts the applied configuration owned by fieldManager from +// priorityClass. If no managedFields are found in priorityClass for fieldManager, a +// PriorityClassApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// priorityClass must be a unmodified PriorityClass API object that was retrieved from the Kubernetes API. +// ExtractPriorityClass provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractPriorityClass(priorityClass *v1alpha1.PriorityClass, fieldManager string) (*PriorityClassApplyConfiguration, error) { + b := &PriorityClassApplyConfiguration{} + err := managedfields.ExtractInto(priorityClass, internal.Parser().Type("io.k8s.api.scheduling.v1alpha1.PriorityClass"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(priorityClass.Name) + + b.WithKind("PriorityClass") + b.WithAPIVersion("scheduling.k8s.io/v1alpha1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithKind(value string) *PriorityClassApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithAPIVersion(value string) *PriorityClassApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithName(value string) *PriorityClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithGenerateName(value string) *PriorityClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithNamespace(value string) *PriorityClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithSelfLink(value string) *PriorityClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithUID(value types.UID) *PriorityClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithResourceVersion(value string) *PriorityClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithGeneration(value int64) *PriorityClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithCreationTimestamp(value metav1.Time) *PriorityClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *PriorityClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *PriorityClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *PriorityClassApplyConfiguration) WithLabels(entries map[string]string) *PriorityClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *PriorityClassApplyConfiguration) WithAnnotations(entries map[string]string) *PriorityClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *PriorityClassApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *PriorityClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *PriorityClassApplyConfiguration) WithFinalizers(values ...string) *PriorityClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithClusterName(value string) *PriorityClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *PriorityClassApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithValue sets the Value field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Value field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithValue(value int32) *PriorityClassApplyConfiguration { + b.Value = &value + return b +} + +// WithGlobalDefault sets the GlobalDefault field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GlobalDefault field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithGlobalDefault(value bool) *PriorityClassApplyConfiguration { + b.GlobalDefault = &value + return b +} + +// WithDescription sets the Description field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Description field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithDescription(value string) *PriorityClassApplyConfiguration { + b.Description = &value + return b +} + +// WithPreemptionPolicy sets the PreemptionPolicy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PreemptionPolicy field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithPreemptionPolicy(value corev1.PreemptionPolicy) *PriorityClassApplyConfiguration { + b.PreemptionPolicy = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/scheduling/v1beta1/priorityclass.go b/vendor/k8s.io/client-go/applyconfigurations/scheduling/v1beta1/priorityclass.go new file mode 100644 index 000000000000..9327b7b619ac --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/scheduling/v1beta1/priorityclass.go @@ -0,0 +1,282 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + corev1 "k8s.io/api/core/v1" + v1beta1 "k8s.io/api/scheduling/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// PriorityClassApplyConfiguration represents an declarative configuration of the PriorityClass type for use +// with apply. +type PriorityClassApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Value *int32 `json:"value,omitempty"` + GlobalDefault *bool `json:"globalDefault,omitempty"` + Description *string `json:"description,omitempty"` + PreemptionPolicy *corev1.PreemptionPolicy `json:"preemptionPolicy,omitempty"` +} + +// PriorityClass constructs an declarative configuration of the PriorityClass type for use with +// apply. +func PriorityClass(name string) *PriorityClassApplyConfiguration { + b := &PriorityClassApplyConfiguration{} + b.WithName(name) + b.WithKind("PriorityClass") + b.WithAPIVersion("scheduling.k8s.io/v1beta1") + return b +} + +// ExtractPriorityClass extracts the applied configuration owned by fieldManager from +// priorityClass. If no managedFields are found in priorityClass for fieldManager, a +// PriorityClassApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// priorityClass must be a unmodified PriorityClass API object that was retrieved from the Kubernetes API. +// ExtractPriorityClass provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractPriorityClass(priorityClass *v1beta1.PriorityClass, fieldManager string) (*PriorityClassApplyConfiguration, error) { + b := &PriorityClassApplyConfiguration{} + err := managedfields.ExtractInto(priorityClass, internal.Parser().Type("io.k8s.api.scheduling.v1beta1.PriorityClass"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(priorityClass.Name) + + b.WithKind("PriorityClass") + b.WithAPIVersion("scheduling.k8s.io/v1beta1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithKind(value string) *PriorityClassApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithAPIVersion(value string) *PriorityClassApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithName(value string) *PriorityClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithGenerateName(value string) *PriorityClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithNamespace(value string) *PriorityClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithSelfLink(value string) *PriorityClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithUID(value types.UID) *PriorityClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithResourceVersion(value string) *PriorityClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithGeneration(value int64) *PriorityClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithCreationTimestamp(value metav1.Time) *PriorityClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *PriorityClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *PriorityClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *PriorityClassApplyConfiguration) WithLabels(entries map[string]string) *PriorityClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *PriorityClassApplyConfiguration) WithAnnotations(entries map[string]string) *PriorityClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *PriorityClassApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *PriorityClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *PriorityClassApplyConfiguration) WithFinalizers(values ...string) *PriorityClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithClusterName(value string) *PriorityClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *PriorityClassApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithValue sets the Value field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Value field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithValue(value int32) *PriorityClassApplyConfiguration { + b.Value = &value + return b +} + +// WithGlobalDefault sets the GlobalDefault field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GlobalDefault field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithGlobalDefault(value bool) *PriorityClassApplyConfiguration { + b.GlobalDefault = &value + return b +} + +// WithDescription sets the Description field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Description field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithDescription(value string) *PriorityClassApplyConfiguration { + b.Description = &value + return b +} + +// WithPreemptionPolicy sets the PreemptionPolicy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PreemptionPolicy field is set to the value of the last call. +func (b *PriorityClassApplyConfiguration) WithPreemptionPolicy(value corev1.PreemptionPolicy) *PriorityClassApplyConfiguration { + b.PreemptionPolicy = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/storage/v1/csidriver.go b/vendor/k8s.io/client-go/applyconfigurations/storage/v1/csidriver.go new file mode 100644 index 000000000000..31b35446ec7e --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/storage/v1/csidriver.go @@ -0,0 +1,254 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + apistoragev1 "k8s.io/api/storage/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// CSIDriverApplyConfiguration represents an declarative configuration of the CSIDriver type for use +// with apply. +type CSIDriverApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *CSIDriverSpecApplyConfiguration `json:"spec,omitempty"` +} + +// CSIDriver constructs an declarative configuration of the CSIDriver type for use with +// apply. +func CSIDriver(name string) *CSIDriverApplyConfiguration { + b := &CSIDriverApplyConfiguration{} + b.WithName(name) + b.WithKind("CSIDriver") + b.WithAPIVersion("storage.k8s.io/v1") + return b +} + +// ExtractCSIDriver extracts the applied configuration owned by fieldManager from +// cSIDriver. If no managedFields are found in cSIDriver for fieldManager, a +// CSIDriverApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// cSIDriver must be a unmodified CSIDriver API object that was retrieved from the Kubernetes API. +// ExtractCSIDriver provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractCSIDriver(cSIDriver *apistoragev1.CSIDriver, fieldManager string) (*CSIDriverApplyConfiguration, error) { + b := &CSIDriverApplyConfiguration{} + err := managedfields.ExtractInto(cSIDriver, internal.Parser().Type("io.k8s.api.storage.v1.CSIDriver"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(cSIDriver.Name) + + b.WithKind("CSIDriver") + b.WithAPIVersion("storage.k8s.io/v1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *CSIDriverApplyConfiguration) WithKind(value string) *CSIDriverApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *CSIDriverApplyConfiguration) WithAPIVersion(value string) *CSIDriverApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *CSIDriverApplyConfiguration) WithName(value string) *CSIDriverApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *CSIDriverApplyConfiguration) WithGenerateName(value string) *CSIDriverApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *CSIDriverApplyConfiguration) WithNamespace(value string) *CSIDriverApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *CSIDriverApplyConfiguration) WithSelfLink(value string) *CSIDriverApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *CSIDriverApplyConfiguration) WithUID(value types.UID) *CSIDriverApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *CSIDriverApplyConfiguration) WithResourceVersion(value string) *CSIDriverApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *CSIDriverApplyConfiguration) WithGeneration(value int64) *CSIDriverApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *CSIDriverApplyConfiguration) WithCreationTimestamp(value metav1.Time) *CSIDriverApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *CSIDriverApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *CSIDriverApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *CSIDriverApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *CSIDriverApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *CSIDriverApplyConfiguration) WithLabels(entries map[string]string) *CSIDriverApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *CSIDriverApplyConfiguration) WithAnnotations(entries map[string]string) *CSIDriverApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *CSIDriverApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *CSIDriverApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *CSIDriverApplyConfiguration) WithFinalizers(values ...string) *CSIDriverApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *CSIDriverApplyConfiguration) WithClusterName(value string) *CSIDriverApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *CSIDriverApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *CSIDriverApplyConfiguration) WithSpec(value *CSIDriverSpecApplyConfiguration) *CSIDriverApplyConfiguration { + b.Spec = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/storage/v1/csidriverspec.go b/vendor/k8s.io/client-go/applyconfigurations/storage/v1/csidriverspec.go new file mode 100644 index 000000000000..1dc17ce96a8c --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/storage/v1/csidriverspec.go @@ -0,0 +1,104 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/storage/v1" +) + +// CSIDriverSpecApplyConfiguration represents an declarative configuration of the CSIDriverSpec type for use +// with apply. +type CSIDriverSpecApplyConfiguration struct { + AttachRequired *bool `json:"attachRequired,omitempty"` + PodInfoOnMount *bool `json:"podInfoOnMount,omitempty"` + VolumeLifecycleModes []v1.VolumeLifecycleMode `json:"volumeLifecycleModes,omitempty"` + StorageCapacity *bool `json:"storageCapacity,omitempty"` + FSGroupPolicy *v1.FSGroupPolicy `json:"fsGroupPolicy,omitempty"` + TokenRequests []TokenRequestApplyConfiguration `json:"tokenRequests,omitempty"` + RequiresRepublish *bool `json:"requiresRepublish,omitempty"` +} + +// CSIDriverSpecApplyConfiguration constructs an declarative configuration of the CSIDriverSpec type for use with +// apply. +func CSIDriverSpec() *CSIDriverSpecApplyConfiguration { + return &CSIDriverSpecApplyConfiguration{} +} + +// WithAttachRequired sets the AttachRequired field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AttachRequired field is set to the value of the last call. +func (b *CSIDriverSpecApplyConfiguration) WithAttachRequired(value bool) *CSIDriverSpecApplyConfiguration { + b.AttachRequired = &value + return b +} + +// WithPodInfoOnMount sets the PodInfoOnMount field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PodInfoOnMount field is set to the value of the last call. +func (b *CSIDriverSpecApplyConfiguration) WithPodInfoOnMount(value bool) *CSIDriverSpecApplyConfiguration { + b.PodInfoOnMount = &value + return b +} + +// WithVolumeLifecycleModes adds the given value to the VolumeLifecycleModes field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the VolumeLifecycleModes field. +func (b *CSIDriverSpecApplyConfiguration) WithVolumeLifecycleModes(values ...v1.VolumeLifecycleMode) *CSIDriverSpecApplyConfiguration { + for i := range values { + b.VolumeLifecycleModes = append(b.VolumeLifecycleModes, values[i]) + } + return b +} + +// WithStorageCapacity sets the StorageCapacity field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the StorageCapacity field is set to the value of the last call. +func (b *CSIDriverSpecApplyConfiguration) WithStorageCapacity(value bool) *CSIDriverSpecApplyConfiguration { + b.StorageCapacity = &value + return b +} + +// WithFSGroupPolicy sets the FSGroupPolicy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FSGroupPolicy field is set to the value of the last call. +func (b *CSIDriverSpecApplyConfiguration) WithFSGroupPolicy(value v1.FSGroupPolicy) *CSIDriverSpecApplyConfiguration { + b.FSGroupPolicy = &value + return b +} + +// WithTokenRequests adds the given value to the TokenRequests field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the TokenRequests field. +func (b *CSIDriverSpecApplyConfiguration) WithTokenRequests(values ...*TokenRequestApplyConfiguration) *CSIDriverSpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithTokenRequests") + } + b.TokenRequests = append(b.TokenRequests, *values[i]) + } + return b +} + +// WithRequiresRepublish sets the RequiresRepublish field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RequiresRepublish field is set to the value of the last call. +func (b *CSIDriverSpecApplyConfiguration) WithRequiresRepublish(value bool) *CSIDriverSpecApplyConfiguration { + b.RequiresRepublish = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/storage/v1/csinode.go b/vendor/k8s.io/client-go/applyconfigurations/storage/v1/csinode.go new file mode 100644 index 000000000000..8da150bd50df --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/storage/v1/csinode.go @@ -0,0 +1,254 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + apistoragev1 "k8s.io/api/storage/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// CSINodeApplyConfiguration represents an declarative configuration of the CSINode type for use +// with apply. +type CSINodeApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *CSINodeSpecApplyConfiguration `json:"spec,omitempty"` +} + +// CSINode constructs an declarative configuration of the CSINode type for use with +// apply. +func CSINode(name string) *CSINodeApplyConfiguration { + b := &CSINodeApplyConfiguration{} + b.WithName(name) + b.WithKind("CSINode") + b.WithAPIVersion("storage.k8s.io/v1") + return b +} + +// ExtractCSINode extracts the applied configuration owned by fieldManager from +// cSINode. If no managedFields are found in cSINode for fieldManager, a +// CSINodeApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// cSINode must be a unmodified CSINode API object that was retrieved from the Kubernetes API. +// ExtractCSINode provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractCSINode(cSINode *apistoragev1.CSINode, fieldManager string) (*CSINodeApplyConfiguration, error) { + b := &CSINodeApplyConfiguration{} + err := managedfields.ExtractInto(cSINode, internal.Parser().Type("io.k8s.api.storage.v1.CSINode"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(cSINode.Name) + + b.WithKind("CSINode") + b.WithAPIVersion("storage.k8s.io/v1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *CSINodeApplyConfiguration) WithKind(value string) *CSINodeApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *CSINodeApplyConfiguration) WithAPIVersion(value string) *CSINodeApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *CSINodeApplyConfiguration) WithName(value string) *CSINodeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *CSINodeApplyConfiguration) WithGenerateName(value string) *CSINodeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *CSINodeApplyConfiguration) WithNamespace(value string) *CSINodeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *CSINodeApplyConfiguration) WithSelfLink(value string) *CSINodeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *CSINodeApplyConfiguration) WithUID(value types.UID) *CSINodeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *CSINodeApplyConfiguration) WithResourceVersion(value string) *CSINodeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *CSINodeApplyConfiguration) WithGeneration(value int64) *CSINodeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *CSINodeApplyConfiguration) WithCreationTimestamp(value metav1.Time) *CSINodeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *CSINodeApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *CSINodeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *CSINodeApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *CSINodeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *CSINodeApplyConfiguration) WithLabels(entries map[string]string) *CSINodeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *CSINodeApplyConfiguration) WithAnnotations(entries map[string]string) *CSINodeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *CSINodeApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *CSINodeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *CSINodeApplyConfiguration) WithFinalizers(values ...string) *CSINodeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *CSINodeApplyConfiguration) WithClusterName(value string) *CSINodeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *CSINodeApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *CSINodeApplyConfiguration) WithSpec(value *CSINodeSpecApplyConfiguration) *CSINodeApplyConfiguration { + b.Spec = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/storage/v1/csinodedriver.go b/vendor/k8s.io/client-go/applyconfigurations/storage/v1/csinodedriver.go new file mode 100644 index 000000000000..6219ef115122 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/storage/v1/csinodedriver.go @@ -0,0 +1,68 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// CSINodeDriverApplyConfiguration represents an declarative configuration of the CSINodeDriver type for use +// with apply. +type CSINodeDriverApplyConfiguration struct { + Name *string `json:"name,omitempty"` + NodeID *string `json:"nodeID,omitempty"` + TopologyKeys []string `json:"topologyKeys,omitempty"` + Allocatable *VolumeNodeResourcesApplyConfiguration `json:"allocatable,omitempty"` +} + +// CSINodeDriverApplyConfiguration constructs an declarative configuration of the CSINodeDriver type for use with +// apply. +func CSINodeDriver() *CSINodeDriverApplyConfiguration { + return &CSINodeDriverApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *CSINodeDriverApplyConfiguration) WithName(value string) *CSINodeDriverApplyConfiguration { + b.Name = &value + return b +} + +// WithNodeID sets the NodeID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NodeID field is set to the value of the last call. +func (b *CSINodeDriverApplyConfiguration) WithNodeID(value string) *CSINodeDriverApplyConfiguration { + b.NodeID = &value + return b +} + +// WithTopologyKeys adds the given value to the TopologyKeys field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the TopologyKeys field. +func (b *CSINodeDriverApplyConfiguration) WithTopologyKeys(values ...string) *CSINodeDriverApplyConfiguration { + for i := range values { + b.TopologyKeys = append(b.TopologyKeys, values[i]) + } + return b +} + +// WithAllocatable sets the Allocatable field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Allocatable field is set to the value of the last call. +func (b *CSINodeDriverApplyConfiguration) WithAllocatable(value *VolumeNodeResourcesApplyConfiguration) *CSINodeDriverApplyConfiguration { + b.Allocatable = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/storage/v1/csinodespec.go b/vendor/k8s.io/client-go/applyconfigurations/storage/v1/csinodespec.go new file mode 100644 index 000000000000..30d1d4546b9c --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/storage/v1/csinodespec.go @@ -0,0 +1,44 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// CSINodeSpecApplyConfiguration represents an declarative configuration of the CSINodeSpec type for use +// with apply. +type CSINodeSpecApplyConfiguration struct { + Drivers []CSINodeDriverApplyConfiguration `json:"drivers,omitempty"` +} + +// CSINodeSpecApplyConfiguration constructs an declarative configuration of the CSINodeSpec type for use with +// apply. +func CSINodeSpec() *CSINodeSpecApplyConfiguration { + return &CSINodeSpecApplyConfiguration{} +} + +// WithDrivers adds the given value to the Drivers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Drivers field. +func (b *CSINodeSpecApplyConfiguration) WithDrivers(values ...*CSINodeDriverApplyConfiguration) *CSINodeSpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithDrivers") + } + b.Drivers = append(b.Drivers, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/storage/v1/storageclass.go b/vendor/k8s.io/client-go/applyconfigurations/storage/v1/storageclass.go new file mode 100644 index 000000000000..ac5b8ca8d102 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/storage/v1/storageclass.go @@ -0,0 +1,323 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + corev1 "k8s.io/api/core/v1" + storagev1 "k8s.io/api/storage/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + applyconfigurationscorev1 "k8s.io/client-go/applyconfigurations/core/v1" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// StorageClassApplyConfiguration represents an declarative configuration of the StorageClass type for use +// with apply. +type StorageClassApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Provisioner *string `json:"provisioner,omitempty"` + Parameters map[string]string `json:"parameters,omitempty"` + ReclaimPolicy *corev1.PersistentVolumeReclaimPolicy `json:"reclaimPolicy,omitempty"` + MountOptions []string `json:"mountOptions,omitempty"` + AllowVolumeExpansion *bool `json:"allowVolumeExpansion,omitempty"` + VolumeBindingMode *storagev1.VolumeBindingMode `json:"volumeBindingMode,omitempty"` + AllowedTopologies []applyconfigurationscorev1.TopologySelectorTermApplyConfiguration `json:"allowedTopologies,omitempty"` +} + +// StorageClass constructs an declarative configuration of the StorageClass type for use with +// apply. +func StorageClass(name string) *StorageClassApplyConfiguration { + b := &StorageClassApplyConfiguration{} + b.WithName(name) + b.WithKind("StorageClass") + b.WithAPIVersion("storage.k8s.io/v1") + return b +} + +// ExtractStorageClass extracts the applied configuration owned by fieldManager from +// storageClass. If no managedFields are found in storageClass for fieldManager, a +// StorageClassApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// storageClass must be a unmodified StorageClass API object that was retrieved from the Kubernetes API. +// ExtractStorageClass provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractStorageClass(storageClass *storagev1.StorageClass, fieldManager string) (*StorageClassApplyConfiguration, error) { + b := &StorageClassApplyConfiguration{} + err := managedfields.ExtractInto(storageClass, internal.Parser().Type("io.k8s.api.storage.v1.StorageClass"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(storageClass.Name) + + b.WithKind("StorageClass") + b.WithAPIVersion("storage.k8s.io/v1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *StorageClassApplyConfiguration) WithKind(value string) *StorageClassApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *StorageClassApplyConfiguration) WithAPIVersion(value string) *StorageClassApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *StorageClassApplyConfiguration) WithName(value string) *StorageClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *StorageClassApplyConfiguration) WithGenerateName(value string) *StorageClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *StorageClassApplyConfiguration) WithNamespace(value string) *StorageClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *StorageClassApplyConfiguration) WithSelfLink(value string) *StorageClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *StorageClassApplyConfiguration) WithUID(value types.UID) *StorageClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *StorageClassApplyConfiguration) WithResourceVersion(value string) *StorageClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *StorageClassApplyConfiguration) WithGeneration(value int64) *StorageClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *StorageClassApplyConfiguration) WithCreationTimestamp(value metav1.Time) *StorageClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *StorageClassApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *StorageClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *StorageClassApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *StorageClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *StorageClassApplyConfiguration) WithLabels(entries map[string]string) *StorageClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *StorageClassApplyConfiguration) WithAnnotations(entries map[string]string) *StorageClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *StorageClassApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *StorageClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *StorageClassApplyConfiguration) WithFinalizers(values ...string) *StorageClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *StorageClassApplyConfiguration) WithClusterName(value string) *StorageClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *StorageClassApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithProvisioner sets the Provisioner field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Provisioner field is set to the value of the last call. +func (b *StorageClassApplyConfiguration) WithProvisioner(value string) *StorageClassApplyConfiguration { + b.Provisioner = &value + return b +} + +// WithParameters puts the entries into the Parameters field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Parameters field, +// overwriting an existing map entries in Parameters field with the same key. +func (b *StorageClassApplyConfiguration) WithParameters(entries map[string]string) *StorageClassApplyConfiguration { + if b.Parameters == nil && len(entries) > 0 { + b.Parameters = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Parameters[k] = v + } + return b +} + +// WithReclaimPolicy sets the ReclaimPolicy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReclaimPolicy field is set to the value of the last call. +func (b *StorageClassApplyConfiguration) WithReclaimPolicy(value corev1.PersistentVolumeReclaimPolicy) *StorageClassApplyConfiguration { + b.ReclaimPolicy = &value + return b +} + +// WithMountOptions adds the given value to the MountOptions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the MountOptions field. +func (b *StorageClassApplyConfiguration) WithMountOptions(values ...string) *StorageClassApplyConfiguration { + for i := range values { + b.MountOptions = append(b.MountOptions, values[i]) + } + return b +} + +// WithAllowVolumeExpansion sets the AllowVolumeExpansion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AllowVolumeExpansion field is set to the value of the last call. +func (b *StorageClassApplyConfiguration) WithAllowVolumeExpansion(value bool) *StorageClassApplyConfiguration { + b.AllowVolumeExpansion = &value + return b +} + +// WithVolumeBindingMode sets the VolumeBindingMode field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the VolumeBindingMode field is set to the value of the last call. +func (b *StorageClassApplyConfiguration) WithVolumeBindingMode(value storagev1.VolumeBindingMode) *StorageClassApplyConfiguration { + b.VolumeBindingMode = &value + return b +} + +// WithAllowedTopologies adds the given value to the AllowedTopologies field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the AllowedTopologies field. +func (b *StorageClassApplyConfiguration) WithAllowedTopologies(values ...*applyconfigurationscorev1.TopologySelectorTermApplyConfiguration) *StorageClassApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithAllowedTopologies") + } + b.AllowedTopologies = append(b.AllowedTopologies, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/storage/v1/tokenrequest.go b/vendor/k8s.io/client-go/applyconfigurations/storage/v1/tokenrequest.go new file mode 100644 index 000000000000..6665a1ff2e87 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/storage/v1/tokenrequest.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// TokenRequestApplyConfiguration represents an declarative configuration of the TokenRequest type for use +// with apply. +type TokenRequestApplyConfiguration struct { + Audience *string `json:"audience,omitempty"` + ExpirationSeconds *int64 `json:"expirationSeconds,omitempty"` +} + +// TokenRequestApplyConfiguration constructs an declarative configuration of the TokenRequest type for use with +// apply. +func TokenRequest() *TokenRequestApplyConfiguration { + return &TokenRequestApplyConfiguration{} +} + +// WithAudience sets the Audience field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Audience field is set to the value of the last call. +func (b *TokenRequestApplyConfiguration) WithAudience(value string) *TokenRequestApplyConfiguration { + b.Audience = &value + return b +} + +// WithExpirationSeconds sets the ExpirationSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ExpirationSeconds field is set to the value of the last call. +func (b *TokenRequestApplyConfiguration) WithExpirationSeconds(value int64) *TokenRequestApplyConfiguration { + b.ExpirationSeconds = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/storage/v1/volumeattachment.go b/vendor/k8s.io/client-go/applyconfigurations/storage/v1/volumeattachment.go new file mode 100644 index 000000000000..97c37c609d4e --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/storage/v1/volumeattachment.go @@ -0,0 +1,263 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + apistoragev1 "k8s.io/api/storage/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// VolumeAttachmentApplyConfiguration represents an declarative configuration of the VolumeAttachment type for use +// with apply. +type VolumeAttachmentApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *VolumeAttachmentSpecApplyConfiguration `json:"spec,omitempty"` + Status *VolumeAttachmentStatusApplyConfiguration `json:"status,omitempty"` +} + +// VolumeAttachment constructs an declarative configuration of the VolumeAttachment type for use with +// apply. +func VolumeAttachment(name string) *VolumeAttachmentApplyConfiguration { + b := &VolumeAttachmentApplyConfiguration{} + b.WithName(name) + b.WithKind("VolumeAttachment") + b.WithAPIVersion("storage.k8s.io/v1") + return b +} + +// ExtractVolumeAttachment extracts the applied configuration owned by fieldManager from +// volumeAttachment. If no managedFields are found in volumeAttachment for fieldManager, a +// VolumeAttachmentApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// volumeAttachment must be a unmodified VolumeAttachment API object that was retrieved from the Kubernetes API. +// ExtractVolumeAttachment provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractVolumeAttachment(volumeAttachment *apistoragev1.VolumeAttachment, fieldManager string) (*VolumeAttachmentApplyConfiguration, error) { + b := &VolumeAttachmentApplyConfiguration{} + err := managedfields.ExtractInto(volumeAttachment, internal.Parser().Type("io.k8s.api.storage.v1.VolumeAttachment"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(volumeAttachment.Name) + + b.WithKind("VolumeAttachment") + b.WithAPIVersion("storage.k8s.io/v1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *VolumeAttachmentApplyConfiguration) WithKind(value string) *VolumeAttachmentApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *VolumeAttachmentApplyConfiguration) WithAPIVersion(value string) *VolumeAttachmentApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *VolumeAttachmentApplyConfiguration) WithName(value string) *VolumeAttachmentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *VolumeAttachmentApplyConfiguration) WithGenerateName(value string) *VolumeAttachmentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *VolumeAttachmentApplyConfiguration) WithNamespace(value string) *VolumeAttachmentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *VolumeAttachmentApplyConfiguration) WithSelfLink(value string) *VolumeAttachmentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *VolumeAttachmentApplyConfiguration) WithUID(value types.UID) *VolumeAttachmentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *VolumeAttachmentApplyConfiguration) WithResourceVersion(value string) *VolumeAttachmentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *VolumeAttachmentApplyConfiguration) WithGeneration(value int64) *VolumeAttachmentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *VolumeAttachmentApplyConfiguration) WithCreationTimestamp(value metav1.Time) *VolumeAttachmentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *VolumeAttachmentApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *VolumeAttachmentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *VolumeAttachmentApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *VolumeAttachmentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *VolumeAttachmentApplyConfiguration) WithLabels(entries map[string]string) *VolumeAttachmentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *VolumeAttachmentApplyConfiguration) WithAnnotations(entries map[string]string) *VolumeAttachmentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *VolumeAttachmentApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *VolumeAttachmentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *VolumeAttachmentApplyConfiguration) WithFinalizers(values ...string) *VolumeAttachmentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *VolumeAttachmentApplyConfiguration) WithClusterName(value string) *VolumeAttachmentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *VolumeAttachmentApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *VolumeAttachmentApplyConfiguration) WithSpec(value *VolumeAttachmentSpecApplyConfiguration) *VolumeAttachmentApplyConfiguration { + b.Spec = value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *VolumeAttachmentApplyConfiguration) WithStatus(value *VolumeAttachmentStatusApplyConfiguration) *VolumeAttachmentApplyConfiguration { + b.Status = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/storage/v1/volumeattachmentsource.go b/vendor/k8s.io/client-go/applyconfigurations/storage/v1/volumeattachmentsource.go new file mode 100644 index 000000000000..2bf3f7720d3a --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/storage/v1/volumeattachmentsource.go @@ -0,0 +1,52 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/client-go/applyconfigurations/core/v1" +) + +// VolumeAttachmentSourceApplyConfiguration represents an declarative configuration of the VolumeAttachmentSource type for use +// with apply. +type VolumeAttachmentSourceApplyConfiguration struct { + PersistentVolumeName *string `json:"persistentVolumeName,omitempty"` + InlineVolumeSpec *v1.PersistentVolumeSpecApplyConfiguration `json:"inlineVolumeSpec,omitempty"` +} + +// VolumeAttachmentSourceApplyConfiguration constructs an declarative configuration of the VolumeAttachmentSource type for use with +// apply. +func VolumeAttachmentSource() *VolumeAttachmentSourceApplyConfiguration { + return &VolumeAttachmentSourceApplyConfiguration{} +} + +// WithPersistentVolumeName sets the PersistentVolumeName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PersistentVolumeName field is set to the value of the last call. +func (b *VolumeAttachmentSourceApplyConfiguration) WithPersistentVolumeName(value string) *VolumeAttachmentSourceApplyConfiguration { + b.PersistentVolumeName = &value + return b +} + +// WithInlineVolumeSpec sets the InlineVolumeSpec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the InlineVolumeSpec field is set to the value of the last call. +func (b *VolumeAttachmentSourceApplyConfiguration) WithInlineVolumeSpec(value *v1.PersistentVolumeSpecApplyConfiguration) *VolumeAttachmentSourceApplyConfiguration { + b.InlineVolumeSpec = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/storage/v1/volumeattachmentspec.go b/vendor/k8s.io/client-go/applyconfigurations/storage/v1/volumeattachmentspec.go new file mode 100644 index 000000000000..a55f7c8ea164 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/storage/v1/volumeattachmentspec.go @@ -0,0 +1,57 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// VolumeAttachmentSpecApplyConfiguration represents an declarative configuration of the VolumeAttachmentSpec type for use +// with apply. +type VolumeAttachmentSpecApplyConfiguration struct { + Attacher *string `json:"attacher,omitempty"` + Source *VolumeAttachmentSourceApplyConfiguration `json:"source,omitempty"` + NodeName *string `json:"nodeName,omitempty"` +} + +// VolumeAttachmentSpecApplyConfiguration constructs an declarative configuration of the VolumeAttachmentSpec type for use with +// apply. +func VolumeAttachmentSpec() *VolumeAttachmentSpecApplyConfiguration { + return &VolumeAttachmentSpecApplyConfiguration{} +} + +// WithAttacher sets the Attacher field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Attacher field is set to the value of the last call. +func (b *VolumeAttachmentSpecApplyConfiguration) WithAttacher(value string) *VolumeAttachmentSpecApplyConfiguration { + b.Attacher = &value + return b +} + +// WithSource sets the Source field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Source field is set to the value of the last call. +func (b *VolumeAttachmentSpecApplyConfiguration) WithSource(value *VolumeAttachmentSourceApplyConfiguration) *VolumeAttachmentSpecApplyConfiguration { + b.Source = value + return b +} + +// WithNodeName sets the NodeName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NodeName field is set to the value of the last call. +func (b *VolumeAttachmentSpecApplyConfiguration) WithNodeName(value string) *VolumeAttachmentSpecApplyConfiguration { + b.NodeName = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/storage/v1/volumeattachmentstatus.go b/vendor/k8s.io/client-go/applyconfigurations/storage/v1/volumeattachmentstatus.go new file mode 100644 index 000000000000..015b08e6ebeb --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/storage/v1/volumeattachmentstatus.go @@ -0,0 +1,72 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// VolumeAttachmentStatusApplyConfiguration represents an declarative configuration of the VolumeAttachmentStatus type for use +// with apply. +type VolumeAttachmentStatusApplyConfiguration struct { + Attached *bool `json:"attached,omitempty"` + AttachmentMetadata map[string]string `json:"attachmentMetadata,omitempty"` + AttachError *VolumeErrorApplyConfiguration `json:"attachError,omitempty"` + DetachError *VolumeErrorApplyConfiguration `json:"detachError,omitempty"` +} + +// VolumeAttachmentStatusApplyConfiguration constructs an declarative configuration of the VolumeAttachmentStatus type for use with +// apply. +func VolumeAttachmentStatus() *VolumeAttachmentStatusApplyConfiguration { + return &VolumeAttachmentStatusApplyConfiguration{} +} + +// WithAttached sets the Attached field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Attached field is set to the value of the last call. +func (b *VolumeAttachmentStatusApplyConfiguration) WithAttached(value bool) *VolumeAttachmentStatusApplyConfiguration { + b.Attached = &value + return b +} + +// WithAttachmentMetadata puts the entries into the AttachmentMetadata field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the AttachmentMetadata field, +// overwriting an existing map entries in AttachmentMetadata field with the same key. +func (b *VolumeAttachmentStatusApplyConfiguration) WithAttachmentMetadata(entries map[string]string) *VolumeAttachmentStatusApplyConfiguration { + if b.AttachmentMetadata == nil && len(entries) > 0 { + b.AttachmentMetadata = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.AttachmentMetadata[k] = v + } + return b +} + +// WithAttachError sets the AttachError field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AttachError field is set to the value of the last call. +func (b *VolumeAttachmentStatusApplyConfiguration) WithAttachError(value *VolumeErrorApplyConfiguration) *VolumeAttachmentStatusApplyConfiguration { + b.AttachError = value + return b +} + +// WithDetachError sets the DetachError field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DetachError field is set to the value of the last call. +func (b *VolumeAttachmentStatusApplyConfiguration) WithDetachError(value *VolumeErrorApplyConfiguration) *VolumeAttachmentStatusApplyConfiguration { + b.DetachError = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/storage/v1/volumeerror.go b/vendor/k8s.io/client-go/applyconfigurations/storage/v1/volumeerror.go new file mode 100644 index 000000000000..4bf829f8a9a4 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/storage/v1/volumeerror.go @@ -0,0 +1,52 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// VolumeErrorApplyConfiguration represents an declarative configuration of the VolumeError type for use +// with apply. +type VolumeErrorApplyConfiguration struct { + Time *v1.Time `json:"time,omitempty"` + Message *string `json:"message,omitempty"` +} + +// VolumeErrorApplyConfiguration constructs an declarative configuration of the VolumeError type for use with +// apply. +func VolumeError() *VolumeErrorApplyConfiguration { + return &VolumeErrorApplyConfiguration{} +} + +// WithTime sets the Time field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Time field is set to the value of the last call. +func (b *VolumeErrorApplyConfiguration) WithTime(value v1.Time) *VolumeErrorApplyConfiguration { + b.Time = &value + return b +} + +// WithMessage sets the Message field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Message field is set to the value of the last call. +func (b *VolumeErrorApplyConfiguration) WithMessage(value string) *VolumeErrorApplyConfiguration { + b.Message = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/storage/v1/volumenoderesources.go b/vendor/k8s.io/client-go/applyconfigurations/storage/v1/volumenoderesources.go new file mode 100644 index 000000000000..3c5fd3dc29d2 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/storage/v1/volumenoderesources.go @@ -0,0 +1,39 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// VolumeNodeResourcesApplyConfiguration represents an declarative configuration of the VolumeNodeResources type for use +// with apply. +type VolumeNodeResourcesApplyConfiguration struct { + Count *int32 `json:"count,omitempty"` +} + +// VolumeNodeResourcesApplyConfiguration constructs an declarative configuration of the VolumeNodeResources type for use with +// apply. +func VolumeNodeResources() *VolumeNodeResourcesApplyConfiguration { + return &VolumeNodeResourcesApplyConfiguration{} +} + +// WithCount sets the Count field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Count field is set to the value of the last call. +func (b *VolumeNodeResourcesApplyConfiguration) WithCount(value int32) *VolumeNodeResourcesApplyConfiguration { + b.Count = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/storage/v1alpha1/csistoragecapacity.go b/vendor/k8s.io/client-go/applyconfigurations/storage/v1alpha1/csistoragecapacity.go new file mode 100644 index 000000000000..32cf1b9f8b5a --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/storage/v1alpha1/csistoragecapacity.go @@ -0,0 +1,284 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + v1alpha1 "k8s.io/api/storage/v1alpha1" + resource "k8s.io/apimachinery/pkg/api/resource" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// CSIStorageCapacityApplyConfiguration represents an declarative configuration of the CSIStorageCapacity type for use +// with apply. +type CSIStorageCapacityApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + NodeTopology *v1.LabelSelectorApplyConfiguration `json:"nodeTopology,omitempty"` + StorageClassName *string `json:"storageClassName,omitempty"` + Capacity *resource.Quantity `json:"capacity,omitempty"` + MaximumVolumeSize *resource.Quantity `json:"maximumVolumeSize,omitempty"` +} + +// CSIStorageCapacity constructs an declarative configuration of the CSIStorageCapacity type for use with +// apply. +func CSIStorageCapacity(name, namespace string) *CSIStorageCapacityApplyConfiguration { + b := &CSIStorageCapacityApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("CSIStorageCapacity") + b.WithAPIVersion("storage.k8s.io/v1alpha1") + return b +} + +// ExtractCSIStorageCapacity extracts the applied configuration owned by fieldManager from +// cSIStorageCapacity. If no managedFields are found in cSIStorageCapacity for fieldManager, a +// CSIStorageCapacityApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// cSIStorageCapacity must be a unmodified CSIStorageCapacity API object that was retrieved from the Kubernetes API. +// ExtractCSIStorageCapacity provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractCSIStorageCapacity(cSIStorageCapacity *v1alpha1.CSIStorageCapacity, fieldManager string) (*CSIStorageCapacityApplyConfiguration, error) { + b := &CSIStorageCapacityApplyConfiguration{} + err := managedfields.ExtractInto(cSIStorageCapacity, internal.Parser().Type("io.k8s.api.storage.v1alpha1.CSIStorageCapacity"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(cSIStorageCapacity.Name) + b.WithNamespace(cSIStorageCapacity.Namespace) + + b.WithKind("CSIStorageCapacity") + b.WithAPIVersion("storage.k8s.io/v1alpha1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *CSIStorageCapacityApplyConfiguration) WithKind(value string) *CSIStorageCapacityApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *CSIStorageCapacityApplyConfiguration) WithAPIVersion(value string) *CSIStorageCapacityApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *CSIStorageCapacityApplyConfiguration) WithName(value string) *CSIStorageCapacityApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *CSIStorageCapacityApplyConfiguration) WithGenerateName(value string) *CSIStorageCapacityApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *CSIStorageCapacityApplyConfiguration) WithNamespace(value string) *CSIStorageCapacityApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *CSIStorageCapacityApplyConfiguration) WithSelfLink(value string) *CSIStorageCapacityApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *CSIStorageCapacityApplyConfiguration) WithUID(value types.UID) *CSIStorageCapacityApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *CSIStorageCapacityApplyConfiguration) WithResourceVersion(value string) *CSIStorageCapacityApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *CSIStorageCapacityApplyConfiguration) WithGeneration(value int64) *CSIStorageCapacityApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *CSIStorageCapacityApplyConfiguration) WithCreationTimestamp(value metav1.Time) *CSIStorageCapacityApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *CSIStorageCapacityApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *CSIStorageCapacityApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *CSIStorageCapacityApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *CSIStorageCapacityApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *CSIStorageCapacityApplyConfiguration) WithLabels(entries map[string]string) *CSIStorageCapacityApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *CSIStorageCapacityApplyConfiguration) WithAnnotations(entries map[string]string) *CSIStorageCapacityApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *CSIStorageCapacityApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *CSIStorageCapacityApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *CSIStorageCapacityApplyConfiguration) WithFinalizers(values ...string) *CSIStorageCapacityApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *CSIStorageCapacityApplyConfiguration) WithClusterName(value string) *CSIStorageCapacityApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *CSIStorageCapacityApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithNodeTopology sets the NodeTopology field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NodeTopology field is set to the value of the last call. +func (b *CSIStorageCapacityApplyConfiguration) WithNodeTopology(value *v1.LabelSelectorApplyConfiguration) *CSIStorageCapacityApplyConfiguration { + b.NodeTopology = value + return b +} + +// WithStorageClassName sets the StorageClassName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the StorageClassName field is set to the value of the last call. +func (b *CSIStorageCapacityApplyConfiguration) WithStorageClassName(value string) *CSIStorageCapacityApplyConfiguration { + b.StorageClassName = &value + return b +} + +// WithCapacity sets the Capacity field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Capacity field is set to the value of the last call. +func (b *CSIStorageCapacityApplyConfiguration) WithCapacity(value resource.Quantity) *CSIStorageCapacityApplyConfiguration { + b.Capacity = &value + return b +} + +// WithMaximumVolumeSize sets the MaximumVolumeSize field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MaximumVolumeSize field is set to the value of the last call. +func (b *CSIStorageCapacityApplyConfiguration) WithMaximumVolumeSize(value resource.Quantity) *CSIStorageCapacityApplyConfiguration { + b.MaximumVolumeSize = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/storage/v1alpha1/volumeattachment.go b/vendor/k8s.io/client-go/applyconfigurations/storage/v1alpha1/volumeattachment.go new file mode 100644 index 000000000000..bcc0f77295ba --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/storage/v1alpha1/volumeattachment.go @@ -0,0 +1,263 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + storagev1alpha1 "k8s.io/api/storage/v1alpha1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// VolumeAttachmentApplyConfiguration represents an declarative configuration of the VolumeAttachment type for use +// with apply. +type VolumeAttachmentApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *VolumeAttachmentSpecApplyConfiguration `json:"spec,omitempty"` + Status *VolumeAttachmentStatusApplyConfiguration `json:"status,omitempty"` +} + +// VolumeAttachment constructs an declarative configuration of the VolumeAttachment type for use with +// apply. +func VolumeAttachment(name string) *VolumeAttachmentApplyConfiguration { + b := &VolumeAttachmentApplyConfiguration{} + b.WithName(name) + b.WithKind("VolumeAttachment") + b.WithAPIVersion("storage.k8s.io/v1alpha1") + return b +} + +// ExtractVolumeAttachment extracts the applied configuration owned by fieldManager from +// volumeAttachment. If no managedFields are found in volumeAttachment for fieldManager, a +// VolumeAttachmentApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// volumeAttachment must be a unmodified VolumeAttachment API object that was retrieved from the Kubernetes API. +// ExtractVolumeAttachment provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractVolumeAttachment(volumeAttachment *storagev1alpha1.VolumeAttachment, fieldManager string) (*VolumeAttachmentApplyConfiguration, error) { + b := &VolumeAttachmentApplyConfiguration{} + err := managedfields.ExtractInto(volumeAttachment, internal.Parser().Type("io.k8s.api.storage.v1alpha1.VolumeAttachment"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(volumeAttachment.Name) + + b.WithKind("VolumeAttachment") + b.WithAPIVersion("storage.k8s.io/v1alpha1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *VolumeAttachmentApplyConfiguration) WithKind(value string) *VolumeAttachmentApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *VolumeAttachmentApplyConfiguration) WithAPIVersion(value string) *VolumeAttachmentApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *VolumeAttachmentApplyConfiguration) WithName(value string) *VolumeAttachmentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *VolumeAttachmentApplyConfiguration) WithGenerateName(value string) *VolumeAttachmentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *VolumeAttachmentApplyConfiguration) WithNamespace(value string) *VolumeAttachmentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *VolumeAttachmentApplyConfiguration) WithSelfLink(value string) *VolumeAttachmentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *VolumeAttachmentApplyConfiguration) WithUID(value types.UID) *VolumeAttachmentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *VolumeAttachmentApplyConfiguration) WithResourceVersion(value string) *VolumeAttachmentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *VolumeAttachmentApplyConfiguration) WithGeneration(value int64) *VolumeAttachmentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *VolumeAttachmentApplyConfiguration) WithCreationTimestamp(value metav1.Time) *VolumeAttachmentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *VolumeAttachmentApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *VolumeAttachmentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *VolumeAttachmentApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *VolumeAttachmentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *VolumeAttachmentApplyConfiguration) WithLabels(entries map[string]string) *VolumeAttachmentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *VolumeAttachmentApplyConfiguration) WithAnnotations(entries map[string]string) *VolumeAttachmentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *VolumeAttachmentApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *VolumeAttachmentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *VolumeAttachmentApplyConfiguration) WithFinalizers(values ...string) *VolumeAttachmentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *VolumeAttachmentApplyConfiguration) WithClusterName(value string) *VolumeAttachmentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *VolumeAttachmentApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *VolumeAttachmentApplyConfiguration) WithSpec(value *VolumeAttachmentSpecApplyConfiguration) *VolumeAttachmentApplyConfiguration { + b.Spec = value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *VolumeAttachmentApplyConfiguration) WithStatus(value *VolumeAttachmentStatusApplyConfiguration) *VolumeAttachmentApplyConfiguration { + b.Status = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/storage/v1alpha1/volumeattachmentsource.go b/vendor/k8s.io/client-go/applyconfigurations/storage/v1alpha1/volumeattachmentsource.go new file mode 100644 index 000000000000..82872cc3553c --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/storage/v1alpha1/volumeattachmentsource.go @@ -0,0 +1,52 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + v1 "k8s.io/client-go/applyconfigurations/core/v1" +) + +// VolumeAttachmentSourceApplyConfiguration represents an declarative configuration of the VolumeAttachmentSource type for use +// with apply. +type VolumeAttachmentSourceApplyConfiguration struct { + PersistentVolumeName *string `json:"persistentVolumeName,omitempty"` + InlineVolumeSpec *v1.PersistentVolumeSpecApplyConfiguration `json:"inlineVolumeSpec,omitempty"` +} + +// VolumeAttachmentSourceApplyConfiguration constructs an declarative configuration of the VolumeAttachmentSource type for use with +// apply. +func VolumeAttachmentSource() *VolumeAttachmentSourceApplyConfiguration { + return &VolumeAttachmentSourceApplyConfiguration{} +} + +// WithPersistentVolumeName sets the PersistentVolumeName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PersistentVolumeName field is set to the value of the last call. +func (b *VolumeAttachmentSourceApplyConfiguration) WithPersistentVolumeName(value string) *VolumeAttachmentSourceApplyConfiguration { + b.PersistentVolumeName = &value + return b +} + +// WithInlineVolumeSpec sets the InlineVolumeSpec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the InlineVolumeSpec field is set to the value of the last call. +func (b *VolumeAttachmentSourceApplyConfiguration) WithInlineVolumeSpec(value *v1.PersistentVolumeSpecApplyConfiguration) *VolumeAttachmentSourceApplyConfiguration { + b.InlineVolumeSpec = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/storage/v1alpha1/volumeattachmentspec.go b/vendor/k8s.io/client-go/applyconfigurations/storage/v1alpha1/volumeattachmentspec.go new file mode 100644 index 000000000000..2710ff8864b0 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/storage/v1alpha1/volumeattachmentspec.go @@ -0,0 +1,57 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +// VolumeAttachmentSpecApplyConfiguration represents an declarative configuration of the VolumeAttachmentSpec type for use +// with apply. +type VolumeAttachmentSpecApplyConfiguration struct { + Attacher *string `json:"attacher,omitempty"` + Source *VolumeAttachmentSourceApplyConfiguration `json:"source,omitempty"` + NodeName *string `json:"nodeName,omitempty"` +} + +// VolumeAttachmentSpecApplyConfiguration constructs an declarative configuration of the VolumeAttachmentSpec type for use with +// apply. +func VolumeAttachmentSpec() *VolumeAttachmentSpecApplyConfiguration { + return &VolumeAttachmentSpecApplyConfiguration{} +} + +// WithAttacher sets the Attacher field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Attacher field is set to the value of the last call. +func (b *VolumeAttachmentSpecApplyConfiguration) WithAttacher(value string) *VolumeAttachmentSpecApplyConfiguration { + b.Attacher = &value + return b +} + +// WithSource sets the Source field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Source field is set to the value of the last call. +func (b *VolumeAttachmentSpecApplyConfiguration) WithSource(value *VolumeAttachmentSourceApplyConfiguration) *VolumeAttachmentSpecApplyConfiguration { + b.Source = value + return b +} + +// WithNodeName sets the NodeName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NodeName field is set to the value of the last call. +func (b *VolumeAttachmentSpecApplyConfiguration) WithNodeName(value string) *VolumeAttachmentSpecApplyConfiguration { + b.NodeName = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/storage/v1alpha1/volumeattachmentstatus.go b/vendor/k8s.io/client-go/applyconfigurations/storage/v1alpha1/volumeattachmentstatus.go new file mode 100644 index 000000000000..43803496e84d --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/storage/v1alpha1/volumeattachmentstatus.go @@ -0,0 +1,72 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +// VolumeAttachmentStatusApplyConfiguration represents an declarative configuration of the VolumeAttachmentStatus type for use +// with apply. +type VolumeAttachmentStatusApplyConfiguration struct { + Attached *bool `json:"attached,omitempty"` + AttachmentMetadata map[string]string `json:"attachmentMetadata,omitempty"` + AttachError *VolumeErrorApplyConfiguration `json:"attachError,omitempty"` + DetachError *VolumeErrorApplyConfiguration `json:"detachError,omitempty"` +} + +// VolumeAttachmentStatusApplyConfiguration constructs an declarative configuration of the VolumeAttachmentStatus type for use with +// apply. +func VolumeAttachmentStatus() *VolumeAttachmentStatusApplyConfiguration { + return &VolumeAttachmentStatusApplyConfiguration{} +} + +// WithAttached sets the Attached field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Attached field is set to the value of the last call. +func (b *VolumeAttachmentStatusApplyConfiguration) WithAttached(value bool) *VolumeAttachmentStatusApplyConfiguration { + b.Attached = &value + return b +} + +// WithAttachmentMetadata puts the entries into the AttachmentMetadata field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the AttachmentMetadata field, +// overwriting an existing map entries in AttachmentMetadata field with the same key. +func (b *VolumeAttachmentStatusApplyConfiguration) WithAttachmentMetadata(entries map[string]string) *VolumeAttachmentStatusApplyConfiguration { + if b.AttachmentMetadata == nil && len(entries) > 0 { + b.AttachmentMetadata = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.AttachmentMetadata[k] = v + } + return b +} + +// WithAttachError sets the AttachError field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AttachError field is set to the value of the last call. +func (b *VolumeAttachmentStatusApplyConfiguration) WithAttachError(value *VolumeErrorApplyConfiguration) *VolumeAttachmentStatusApplyConfiguration { + b.AttachError = value + return b +} + +// WithDetachError sets the DetachError field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DetachError field is set to the value of the last call. +func (b *VolumeAttachmentStatusApplyConfiguration) WithDetachError(value *VolumeErrorApplyConfiguration) *VolumeAttachmentStatusApplyConfiguration { + b.DetachError = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/storage/v1alpha1/volumeerror.go b/vendor/k8s.io/client-go/applyconfigurations/storage/v1alpha1/volumeerror.go new file mode 100644 index 000000000000..cbff16fd0c7c --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/storage/v1alpha1/volumeerror.go @@ -0,0 +1,52 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// VolumeErrorApplyConfiguration represents an declarative configuration of the VolumeError type for use +// with apply. +type VolumeErrorApplyConfiguration struct { + Time *v1.Time `json:"time,omitempty"` + Message *string `json:"message,omitempty"` +} + +// VolumeErrorApplyConfiguration constructs an declarative configuration of the VolumeError type for use with +// apply. +func VolumeError() *VolumeErrorApplyConfiguration { + return &VolumeErrorApplyConfiguration{} +} + +// WithTime sets the Time field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Time field is set to the value of the last call. +func (b *VolumeErrorApplyConfiguration) WithTime(value v1.Time) *VolumeErrorApplyConfiguration { + b.Time = &value + return b +} + +// WithMessage sets the Message field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Message field is set to the value of the last call. +func (b *VolumeErrorApplyConfiguration) WithMessage(value string) *VolumeErrorApplyConfiguration { + b.Message = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/csidriver.go b/vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/csidriver.go new file mode 100644 index 000000000000..aad9ce500abb --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/csidriver.go @@ -0,0 +1,254 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + storagev1beta1 "k8s.io/api/storage/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// CSIDriverApplyConfiguration represents an declarative configuration of the CSIDriver type for use +// with apply. +type CSIDriverApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *CSIDriverSpecApplyConfiguration `json:"spec,omitempty"` +} + +// CSIDriver constructs an declarative configuration of the CSIDriver type for use with +// apply. +func CSIDriver(name string) *CSIDriverApplyConfiguration { + b := &CSIDriverApplyConfiguration{} + b.WithName(name) + b.WithKind("CSIDriver") + b.WithAPIVersion("storage.k8s.io/v1beta1") + return b +} + +// ExtractCSIDriver extracts the applied configuration owned by fieldManager from +// cSIDriver. If no managedFields are found in cSIDriver for fieldManager, a +// CSIDriverApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// cSIDriver must be a unmodified CSIDriver API object that was retrieved from the Kubernetes API. +// ExtractCSIDriver provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractCSIDriver(cSIDriver *storagev1beta1.CSIDriver, fieldManager string) (*CSIDriverApplyConfiguration, error) { + b := &CSIDriverApplyConfiguration{} + err := managedfields.ExtractInto(cSIDriver, internal.Parser().Type("io.k8s.api.storage.v1beta1.CSIDriver"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(cSIDriver.Name) + + b.WithKind("CSIDriver") + b.WithAPIVersion("storage.k8s.io/v1beta1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *CSIDriverApplyConfiguration) WithKind(value string) *CSIDriverApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *CSIDriverApplyConfiguration) WithAPIVersion(value string) *CSIDriverApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *CSIDriverApplyConfiguration) WithName(value string) *CSIDriverApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *CSIDriverApplyConfiguration) WithGenerateName(value string) *CSIDriverApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *CSIDriverApplyConfiguration) WithNamespace(value string) *CSIDriverApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *CSIDriverApplyConfiguration) WithSelfLink(value string) *CSIDriverApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *CSIDriverApplyConfiguration) WithUID(value types.UID) *CSIDriverApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *CSIDriverApplyConfiguration) WithResourceVersion(value string) *CSIDriverApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *CSIDriverApplyConfiguration) WithGeneration(value int64) *CSIDriverApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *CSIDriverApplyConfiguration) WithCreationTimestamp(value metav1.Time) *CSIDriverApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *CSIDriverApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *CSIDriverApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *CSIDriverApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *CSIDriverApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *CSIDriverApplyConfiguration) WithLabels(entries map[string]string) *CSIDriverApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *CSIDriverApplyConfiguration) WithAnnotations(entries map[string]string) *CSIDriverApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *CSIDriverApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *CSIDriverApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *CSIDriverApplyConfiguration) WithFinalizers(values ...string) *CSIDriverApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *CSIDriverApplyConfiguration) WithClusterName(value string) *CSIDriverApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *CSIDriverApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *CSIDriverApplyConfiguration) WithSpec(value *CSIDriverSpecApplyConfiguration) *CSIDriverApplyConfiguration { + b.Spec = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/csidriverspec.go b/vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/csidriverspec.go new file mode 100644 index 000000000000..1d943cbfffed --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/csidriverspec.go @@ -0,0 +1,104 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1beta1 "k8s.io/api/storage/v1beta1" +) + +// CSIDriverSpecApplyConfiguration represents an declarative configuration of the CSIDriverSpec type for use +// with apply. +type CSIDriverSpecApplyConfiguration struct { + AttachRequired *bool `json:"attachRequired,omitempty"` + PodInfoOnMount *bool `json:"podInfoOnMount,omitempty"` + VolumeLifecycleModes []v1beta1.VolumeLifecycleMode `json:"volumeLifecycleModes,omitempty"` + StorageCapacity *bool `json:"storageCapacity,omitempty"` + FSGroupPolicy *v1beta1.FSGroupPolicy `json:"fsGroupPolicy,omitempty"` + TokenRequests []TokenRequestApplyConfiguration `json:"tokenRequests,omitempty"` + RequiresRepublish *bool `json:"requiresRepublish,omitempty"` +} + +// CSIDriverSpecApplyConfiguration constructs an declarative configuration of the CSIDriverSpec type for use with +// apply. +func CSIDriverSpec() *CSIDriverSpecApplyConfiguration { + return &CSIDriverSpecApplyConfiguration{} +} + +// WithAttachRequired sets the AttachRequired field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AttachRequired field is set to the value of the last call. +func (b *CSIDriverSpecApplyConfiguration) WithAttachRequired(value bool) *CSIDriverSpecApplyConfiguration { + b.AttachRequired = &value + return b +} + +// WithPodInfoOnMount sets the PodInfoOnMount field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PodInfoOnMount field is set to the value of the last call. +func (b *CSIDriverSpecApplyConfiguration) WithPodInfoOnMount(value bool) *CSIDriverSpecApplyConfiguration { + b.PodInfoOnMount = &value + return b +} + +// WithVolumeLifecycleModes adds the given value to the VolumeLifecycleModes field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the VolumeLifecycleModes field. +func (b *CSIDriverSpecApplyConfiguration) WithVolumeLifecycleModes(values ...v1beta1.VolumeLifecycleMode) *CSIDriverSpecApplyConfiguration { + for i := range values { + b.VolumeLifecycleModes = append(b.VolumeLifecycleModes, values[i]) + } + return b +} + +// WithStorageCapacity sets the StorageCapacity field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the StorageCapacity field is set to the value of the last call. +func (b *CSIDriverSpecApplyConfiguration) WithStorageCapacity(value bool) *CSIDriverSpecApplyConfiguration { + b.StorageCapacity = &value + return b +} + +// WithFSGroupPolicy sets the FSGroupPolicy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the FSGroupPolicy field is set to the value of the last call. +func (b *CSIDriverSpecApplyConfiguration) WithFSGroupPolicy(value v1beta1.FSGroupPolicy) *CSIDriverSpecApplyConfiguration { + b.FSGroupPolicy = &value + return b +} + +// WithTokenRequests adds the given value to the TokenRequests field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the TokenRequests field. +func (b *CSIDriverSpecApplyConfiguration) WithTokenRequests(values ...*TokenRequestApplyConfiguration) *CSIDriverSpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithTokenRequests") + } + b.TokenRequests = append(b.TokenRequests, *values[i]) + } + return b +} + +// WithRequiresRepublish sets the RequiresRepublish field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RequiresRepublish field is set to the value of the last call. +func (b *CSIDriverSpecApplyConfiguration) WithRequiresRepublish(value bool) *CSIDriverSpecApplyConfiguration { + b.RequiresRepublish = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/csinode.go b/vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/csinode.go new file mode 100644 index 000000000000..5d151f28eaed --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/csinode.go @@ -0,0 +1,254 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + storagev1beta1 "k8s.io/api/storage/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// CSINodeApplyConfiguration represents an declarative configuration of the CSINode type for use +// with apply. +type CSINodeApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *CSINodeSpecApplyConfiguration `json:"spec,omitempty"` +} + +// CSINode constructs an declarative configuration of the CSINode type for use with +// apply. +func CSINode(name string) *CSINodeApplyConfiguration { + b := &CSINodeApplyConfiguration{} + b.WithName(name) + b.WithKind("CSINode") + b.WithAPIVersion("storage.k8s.io/v1beta1") + return b +} + +// ExtractCSINode extracts the applied configuration owned by fieldManager from +// cSINode. If no managedFields are found in cSINode for fieldManager, a +// CSINodeApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// cSINode must be a unmodified CSINode API object that was retrieved from the Kubernetes API. +// ExtractCSINode provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractCSINode(cSINode *storagev1beta1.CSINode, fieldManager string) (*CSINodeApplyConfiguration, error) { + b := &CSINodeApplyConfiguration{} + err := managedfields.ExtractInto(cSINode, internal.Parser().Type("io.k8s.api.storage.v1beta1.CSINode"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(cSINode.Name) + + b.WithKind("CSINode") + b.WithAPIVersion("storage.k8s.io/v1beta1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *CSINodeApplyConfiguration) WithKind(value string) *CSINodeApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *CSINodeApplyConfiguration) WithAPIVersion(value string) *CSINodeApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *CSINodeApplyConfiguration) WithName(value string) *CSINodeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *CSINodeApplyConfiguration) WithGenerateName(value string) *CSINodeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *CSINodeApplyConfiguration) WithNamespace(value string) *CSINodeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *CSINodeApplyConfiguration) WithSelfLink(value string) *CSINodeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *CSINodeApplyConfiguration) WithUID(value types.UID) *CSINodeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *CSINodeApplyConfiguration) WithResourceVersion(value string) *CSINodeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *CSINodeApplyConfiguration) WithGeneration(value int64) *CSINodeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *CSINodeApplyConfiguration) WithCreationTimestamp(value metav1.Time) *CSINodeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *CSINodeApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *CSINodeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *CSINodeApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *CSINodeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *CSINodeApplyConfiguration) WithLabels(entries map[string]string) *CSINodeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *CSINodeApplyConfiguration) WithAnnotations(entries map[string]string) *CSINodeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *CSINodeApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *CSINodeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *CSINodeApplyConfiguration) WithFinalizers(values ...string) *CSINodeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *CSINodeApplyConfiguration) WithClusterName(value string) *CSINodeApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *CSINodeApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *CSINodeApplyConfiguration) WithSpec(value *CSINodeSpecApplyConfiguration) *CSINodeApplyConfiguration { + b.Spec = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/csinodedriver.go b/vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/csinodedriver.go new file mode 100644 index 000000000000..2c7de497b2d7 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/csinodedriver.go @@ -0,0 +1,68 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// CSINodeDriverApplyConfiguration represents an declarative configuration of the CSINodeDriver type for use +// with apply. +type CSINodeDriverApplyConfiguration struct { + Name *string `json:"name,omitempty"` + NodeID *string `json:"nodeID,omitempty"` + TopologyKeys []string `json:"topologyKeys,omitempty"` + Allocatable *VolumeNodeResourcesApplyConfiguration `json:"allocatable,omitempty"` +} + +// CSINodeDriverApplyConfiguration constructs an declarative configuration of the CSINodeDriver type for use with +// apply. +func CSINodeDriver() *CSINodeDriverApplyConfiguration { + return &CSINodeDriverApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *CSINodeDriverApplyConfiguration) WithName(value string) *CSINodeDriverApplyConfiguration { + b.Name = &value + return b +} + +// WithNodeID sets the NodeID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NodeID field is set to the value of the last call. +func (b *CSINodeDriverApplyConfiguration) WithNodeID(value string) *CSINodeDriverApplyConfiguration { + b.NodeID = &value + return b +} + +// WithTopologyKeys adds the given value to the TopologyKeys field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the TopologyKeys field. +func (b *CSINodeDriverApplyConfiguration) WithTopologyKeys(values ...string) *CSINodeDriverApplyConfiguration { + for i := range values { + b.TopologyKeys = append(b.TopologyKeys, values[i]) + } + return b +} + +// WithAllocatable sets the Allocatable field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Allocatable field is set to the value of the last call. +func (b *CSINodeDriverApplyConfiguration) WithAllocatable(value *VolumeNodeResourcesApplyConfiguration) *CSINodeDriverApplyConfiguration { + b.Allocatable = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/csinodespec.go b/vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/csinodespec.go new file mode 100644 index 000000000000..94ff1b46113f --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/csinodespec.go @@ -0,0 +1,44 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// CSINodeSpecApplyConfiguration represents an declarative configuration of the CSINodeSpec type for use +// with apply. +type CSINodeSpecApplyConfiguration struct { + Drivers []CSINodeDriverApplyConfiguration `json:"drivers,omitempty"` +} + +// CSINodeSpecApplyConfiguration constructs an declarative configuration of the CSINodeSpec type for use with +// apply. +func CSINodeSpec() *CSINodeSpecApplyConfiguration { + return &CSINodeSpecApplyConfiguration{} +} + +// WithDrivers adds the given value to the Drivers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Drivers field. +func (b *CSINodeSpecApplyConfiguration) WithDrivers(values ...*CSINodeDriverApplyConfiguration) *CSINodeSpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithDrivers") + } + b.Drivers = append(b.Drivers, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/csistoragecapacity.go b/vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/csistoragecapacity.go new file mode 100644 index 000000000000..e0c6bd635205 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/csistoragecapacity.go @@ -0,0 +1,284 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1beta1 "k8s.io/api/storage/v1beta1" + resource "k8s.io/apimachinery/pkg/api/resource" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// CSIStorageCapacityApplyConfiguration represents an declarative configuration of the CSIStorageCapacity type for use +// with apply. +type CSIStorageCapacityApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + NodeTopology *v1.LabelSelectorApplyConfiguration `json:"nodeTopology,omitempty"` + StorageClassName *string `json:"storageClassName,omitempty"` + Capacity *resource.Quantity `json:"capacity,omitempty"` + MaximumVolumeSize *resource.Quantity `json:"maximumVolumeSize,omitempty"` +} + +// CSIStorageCapacity constructs an declarative configuration of the CSIStorageCapacity type for use with +// apply. +func CSIStorageCapacity(name, namespace string) *CSIStorageCapacityApplyConfiguration { + b := &CSIStorageCapacityApplyConfiguration{} + b.WithName(name) + b.WithNamespace(namespace) + b.WithKind("CSIStorageCapacity") + b.WithAPIVersion("storage.k8s.io/v1beta1") + return b +} + +// ExtractCSIStorageCapacity extracts the applied configuration owned by fieldManager from +// cSIStorageCapacity. If no managedFields are found in cSIStorageCapacity for fieldManager, a +// CSIStorageCapacityApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// cSIStorageCapacity must be a unmodified CSIStorageCapacity API object that was retrieved from the Kubernetes API. +// ExtractCSIStorageCapacity provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractCSIStorageCapacity(cSIStorageCapacity *v1beta1.CSIStorageCapacity, fieldManager string) (*CSIStorageCapacityApplyConfiguration, error) { + b := &CSIStorageCapacityApplyConfiguration{} + err := managedfields.ExtractInto(cSIStorageCapacity, internal.Parser().Type("io.k8s.api.storage.v1beta1.CSIStorageCapacity"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(cSIStorageCapacity.Name) + b.WithNamespace(cSIStorageCapacity.Namespace) + + b.WithKind("CSIStorageCapacity") + b.WithAPIVersion("storage.k8s.io/v1beta1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *CSIStorageCapacityApplyConfiguration) WithKind(value string) *CSIStorageCapacityApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *CSIStorageCapacityApplyConfiguration) WithAPIVersion(value string) *CSIStorageCapacityApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *CSIStorageCapacityApplyConfiguration) WithName(value string) *CSIStorageCapacityApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *CSIStorageCapacityApplyConfiguration) WithGenerateName(value string) *CSIStorageCapacityApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *CSIStorageCapacityApplyConfiguration) WithNamespace(value string) *CSIStorageCapacityApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *CSIStorageCapacityApplyConfiguration) WithSelfLink(value string) *CSIStorageCapacityApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *CSIStorageCapacityApplyConfiguration) WithUID(value types.UID) *CSIStorageCapacityApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *CSIStorageCapacityApplyConfiguration) WithResourceVersion(value string) *CSIStorageCapacityApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *CSIStorageCapacityApplyConfiguration) WithGeneration(value int64) *CSIStorageCapacityApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *CSIStorageCapacityApplyConfiguration) WithCreationTimestamp(value metav1.Time) *CSIStorageCapacityApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *CSIStorageCapacityApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *CSIStorageCapacityApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *CSIStorageCapacityApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *CSIStorageCapacityApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *CSIStorageCapacityApplyConfiguration) WithLabels(entries map[string]string) *CSIStorageCapacityApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *CSIStorageCapacityApplyConfiguration) WithAnnotations(entries map[string]string) *CSIStorageCapacityApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *CSIStorageCapacityApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *CSIStorageCapacityApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *CSIStorageCapacityApplyConfiguration) WithFinalizers(values ...string) *CSIStorageCapacityApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *CSIStorageCapacityApplyConfiguration) WithClusterName(value string) *CSIStorageCapacityApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *CSIStorageCapacityApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithNodeTopology sets the NodeTopology field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NodeTopology field is set to the value of the last call. +func (b *CSIStorageCapacityApplyConfiguration) WithNodeTopology(value *v1.LabelSelectorApplyConfiguration) *CSIStorageCapacityApplyConfiguration { + b.NodeTopology = value + return b +} + +// WithStorageClassName sets the StorageClassName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the StorageClassName field is set to the value of the last call. +func (b *CSIStorageCapacityApplyConfiguration) WithStorageClassName(value string) *CSIStorageCapacityApplyConfiguration { + b.StorageClassName = &value + return b +} + +// WithCapacity sets the Capacity field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Capacity field is set to the value of the last call. +func (b *CSIStorageCapacityApplyConfiguration) WithCapacity(value resource.Quantity) *CSIStorageCapacityApplyConfiguration { + b.Capacity = &value + return b +} + +// WithMaximumVolumeSize sets the MaximumVolumeSize field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the MaximumVolumeSize field is set to the value of the last call. +func (b *CSIStorageCapacityApplyConfiguration) WithMaximumVolumeSize(value resource.Quantity) *CSIStorageCapacityApplyConfiguration { + b.MaximumVolumeSize = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/storageclass.go b/vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/storageclass.go new file mode 100644 index 000000000000..d88da6a20fd8 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/storageclass.go @@ -0,0 +1,323 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + corev1 "k8s.io/api/core/v1" + v1beta1 "k8s.io/api/storage/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + applyconfigurationscorev1 "k8s.io/client-go/applyconfigurations/core/v1" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// StorageClassApplyConfiguration represents an declarative configuration of the StorageClass type for use +// with apply. +type StorageClassApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Provisioner *string `json:"provisioner,omitempty"` + Parameters map[string]string `json:"parameters,omitempty"` + ReclaimPolicy *corev1.PersistentVolumeReclaimPolicy `json:"reclaimPolicy,omitempty"` + MountOptions []string `json:"mountOptions,omitempty"` + AllowVolumeExpansion *bool `json:"allowVolumeExpansion,omitempty"` + VolumeBindingMode *v1beta1.VolumeBindingMode `json:"volumeBindingMode,omitempty"` + AllowedTopologies []applyconfigurationscorev1.TopologySelectorTermApplyConfiguration `json:"allowedTopologies,omitempty"` +} + +// StorageClass constructs an declarative configuration of the StorageClass type for use with +// apply. +func StorageClass(name string) *StorageClassApplyConfiguration { + b := &StorageClassApplyConfiguration{} + b.WithName(name) + b.WithKind("StorageClass") + b.WithAPIVersion("storage.k8s.io/v1beta1") + return b +} + +// ExtractStorageClass extracts the applied configuration owned by fieldManager from +// storageClass. If no managedFields are found in storageClass for fieldManager, a +// StorageClassApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// storageClass must be a unmodified StorageClass API object that was retrieved from the Kubernetes API. +// ExtractStorageClass provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractStorageClass(storageClass *v1beta1.StorageClass, fieldManager string) (*StorageClassApplyConfiguration, error) { + b := &StorageClassApplyConfiguration{} + err := managedfields.ExtractInto(storageClass, internal.Parser().Type("io.k8s.api.storage.v1beta1.StorageClass"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(storageClass.Name) + + b.WithKind("StorageClass") + b.WithAPIVersion("storage.k8s.io/v1beta1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *StorageClassApplyConfiguration) WithKind(value string) *StorageClassApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *StorageClassApplyConfiguration) WithAPIVersion(value string) *StorageClassApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *StorageClassApplyConfiguration) WithName(value string) *StorageClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *StorageClassApplyConfiguration) WithGenerateName(value string) *StorageClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *StorageClassApplyConfiguration) WithNamespace(value string) *StorageClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *StorageClassApplyConfiguration) WithSelfLink(value string) *StorageClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *StorageClassApplyConfiguration) WithUID(value types.UID) *StorageClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *StorageClassApplyConfiguration) WithResourceVersion(value string) *StorageClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *StorageClassApplyConfiguration) WithGeneration(value int64) *StorageClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *StorageClassApplyConfiguration) WithCreationTimestamp(value metav1.Time) *StorageClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *StorageClassApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *StorageClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *StorageClassApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *StorageClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *StorageClassApplyConfiguration) WithLabels(entries map[string]string) *StorageClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *StorageClassApplyConfiguration) WithAnnotations(entries map[string]string) *StorageClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *StorageClassApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *StorageClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *StorageClassApplyConfiguration) WithFinalizers(values ...string) *StorageClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *StorageClassApplyConfiguration) WithClusterName(value string) *StorageClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *StorageClassApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithProvisioner sets the Provisioner field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Provisioner field is set to the value of the last call. +func (b *StorageClassApplyConfiguration) WithProvisioner(value string) *StorageClassApplyConfiguration { + b.Provisioner = &value + return b +} + +// WithParameters puts the entries into the Parameters field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Parameters field, +// overwriting an existing map entries in Parameters field with the same key. +func (b *StorageClassApplyConfiguration) WithParameters(entries map[string]string) *StorageClassApplyConfiguration { + if b.Parameters == nil && len(entries) > 0 { + b.Parameters = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Parameters[k] = v + } + return b +} + +// WithReclaimPolicy sets the ReclaimPolicy field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ReclaimPolicy field is set to the value of the last call. +func (b *StorageClassApplyConfiguration) WithReclaimPolicy(value corev1.PersistentVolumeReclaimPolicy) *StorageClassApplyConfiguration { + b.ReclaimPolicy = &value + return b +} + +// WithMountOptions adds the given value to the MountOptions field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the MountOptions field. +func (b *StorageClassApplyConfiguration) WithMountOptions(values ...string) *StorageClassApplyConfiguration { + for i := range values { + b.MountOptions = append(b.MountOptions, values[i]) + } + return b +} + +// WithAllowVolumeExpansion sets the AllowVolumeExpansion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AllowVolumeExpansion field is set to the value of the last call. +func (b *StorageClassApplyConfiguration) WithAllowVolumeExpansion(value bool) *StorageClassApplyConfiguration { + b.AllowVolumeExpansion = &value + return b +} + +// WithVolumeBindingMode sets the VolumeBindingMode field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the VolumeBindingMode field is set to the value of the last call. +func (b *StorageClassApplyConfiguration) WithVolumeBindingMode(value v1beta1.VolumeBindingMode) *StorageClassApplyConfiguration { + b.VolumeBindingMode = &value + return b +} + +// WithAllowedTopologies adds the given value to the AllowedTopologies field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the AllowedTopologies field. +func (b *StorageClassApplyConfiguration) WithAllowedTopologies(values ...*applyconfigurationscorev1.TopologySelectorTermApplyConfiguration) *StorageClassApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithAllowedTopologies") + } + b.AllowedTopologies = append(b.AllowedTopologies, *values[i]) + } + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/tokenrequest.go b/vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/tokenrequest.go new file mode 100644 index 000000000000..89c99d560273 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/tokenrequest.go @@ -0,0 +1,48 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// TokenRequestApplyConfiguration represents an declarative configuration of the TokenRequest type for use +// with apply. +type TokenRequestApplyConfiguration struct { + Audience *string `json:"audience,omitempty"` + ExpirationSeconds *int64 `json:"expirationSeconds,omitempty"` +} + +// TokenRequestApplyConfiguration constructs an declarative configuration of the TokenRequest type for use with +// apply. +func TokenRequest() *TokenRequestApplyConfiguration { + return &TokenRequestApplyConfiguration{} +} + +// WithAudience sets the Audience field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Audience field is set to the value of the last call. +func (b *TokenRequestApplyConfiguration) WithAudience(value string) *TokenRequestApplyConfiguration { + b.Audience = &value + return b +} + +// WithExpirationSeconds sets the ExpirationSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ExpirationSeconds field is set to the value of the last call. +func (b *TokenRequestApplyConfiguration) WithExpirationSeconds(value int64) *TokenRequestApplyConfiguration { + b.ExpirationSeconds = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/volumeattachment.go b/vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/volumeattachment.go new file mode 100644 index 000000000000..3a3ed874f688 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/volumeattachment.go @@ -0,0 +1,263 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + storagev1beta1 "k8s.io/api/storage/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// VolumeAttachmentApplyConfiguration represents an declarative configuration of the VolumeAttachment type for use +// with apply. +type VolumeAttachmentApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + Spec *VolumeAttachmentSpecApplyConfiguration `json:"spec,omitempty"` + Status *VolumeAttachmentStatusApplyConfiguration `json:"status,omitempty"` +} + +// VolumeAttachment constructs an declarative configuration of the VolumeAttachment type for use with +// apply. +func VolumeAttachment(name string) *VolumeAttachmentApplyConfiguration { + b := &VolumeAttachmentApplyConfiguration{} + b.WithName(name) + b.WithKind("VolumeAttachment") + b.WithAPIVersion("storage.k8s.io/v1beta1") + return b +} + +// ExtractVolumeAttachment extracts the applied configuration owned by fieldManager from +// volumeAttachment. If no managedFields are found in volumeAttachment for fieldManager, a +// VolumeAttachmentApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. Is is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// volumeAttachment must be a unmodified VolumeAttachment API object that was retrieved from the Kubernetes API. +// ExtractVolumeAttachment provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractVolumeAttachment(volumeAttachment *storagev1beta1.VolumeAttachment, fieldManager string) (*VolumeAttachmentApplyConfiguration, error) { + b := &VolumeAttachmentApplyConfiguration{} + err := managedfields.ExtractInto(volumeAttachment, internal.Parser().Type("io.k8s.api.storage.v1beta1.VolumeAttachment"), fieldManager, b) + if err != nil { + return nil, err + } + b.WithName(volumeAttachment.Name) + + b.WithKind("VolumeAttachment") + b.WithAPIVersion("storage.k8s.io/v1beta1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *VolumeAttachmentApplyConfiguration) WithKind(value string) *VolumeAttachmentApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *VolumeAttachmentApplyConfiguration) WithAPIVersion(value string) *VolumeAttachmentApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *VolumeAttachmentApplyConfiguration) WithName(value string) *VolumeAttachmentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *VolumeAttachmentApplyConfiguration) WithGenerateName(value string) *VolumeAttachmentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *VolumeAttachmentApplyConfiguration) WithNamespace(value string) *VolumeAttachmentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithSelfLink sets the SelfLink field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SelfLink field is set to the value of the last call. +func (b *VolumeAttachmentApplyConfiguration) WithSelfLink(value string) *VolumeAttachmentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.SelfLink = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *VolumeAttachmentApplyConfiguration) WithUID(value types.UID) *VolumeAttachmentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *VolumeAttachmentApplyConfiguration) WithResourceVersion(value string) *VolumeAttachmentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *VolumeAttachmentApplyConfiguration) WithGeneration(value int64) *VolumeAttachmentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *VolumeAttachmentApplyConfiguration) WithCreationTimestamp(value metav1.Time) *VolumeAttachmentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *VolumeAttachmentApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *VolumeAttachmentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *VolumeAttachmentApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *VolumeAttachmentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *VolumeAttachmentApplyConfiguration) WithLabels(entries map[string]string) *VolumeAttachmentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *VolumeAttachmentApplyConfiguration) WithAnnotations(entries map[string]string) *VolumeAttachmentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *VolumeAttachmentApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *VolumeAttachmentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *VolumeAttachmentApplyConfiguration) WithFinalizers(values ...string) *VolumeAttachmentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +// WithClusterName sets the ClusterName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClusterName field is set to the value of the last call. +func (b *VolumeAttachmentApplyConfiguration) WithClusterName(value string) *VolumeAttachmentApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ClusterName = &value + return b +} + +func (b *VolumeAttachmentApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithSpec sets the Spec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Spec field is set to the value of the last call. +func (b *VolumeAttachmentApplyConfiguration) WithSpec(value *VolumeAttachmentSpecApplyConfiguration) *VolumeAttachmentApplyConfiguration { + b.Spec = value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *VolumeAttachmentApplyConfiguration) WithStatus(value *VolumeAttachmentStatusApplyConfiguration) *VolumeAttachmentApplyConfiguration { + b.Status = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/volumeattachmentsource.go b/vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/volumeattachmentsource.go new file mode 100644 index 000000000000..9700b38ee2e5 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/volumeattachmentsource.go @@ -0,0 +1,52 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1 "k8s.io/client-go/applyconfigurations/core/v1" +) + +// VolumeAttachmentSourceApplyConfiguration represents an declarative configuration of the VolumeAttachmentSource type for use +// with apply. +type VolumeAttachmentSourceApplyConfiguration struct { + PersistentVolumeName *string `json:"persistentVolumeName,omitempty"` + InlineVolumeSpec *v1.PersistentVolumeSpecApplyConfiguration `json:"inlineVolumeSpec,omitempty"` +} + +// VolumeAttachmentSourceApplyConfiguration constructs an declarative configuration of the VolumeAttachmentSource type for use with +// apply. +func VolumeAttachmentSource() *VolumeAttachmentSourceApplyConfiguration { + return &VolumeAttachmentSourceApplyConfiguration{} +} + +// WithPersistentVolumeName sets the PersistentVolumeName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the PersistentVolumeName field is set to the value of the last call. +func (b *VolumeAttachmentSourceApplyConfiguration) WithPersistentVolumeName(value string) *VolumeAttachmentSourceApplyConfiguration { + b.PersistentVolumeName = &value + return b +} + +// WithInlineVolumeSpec sets the InlineVolumeSpec field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the InlineVolumeSpec field is set to the value of the last call. +func (b *VolumeAttachmentSourceApplyConfiguration) WithInlineVolumeSpec(value *v1.PersistentVolumeSpecApplyConfiguration) *VolumeAttachmentSourceApplyConfiguration { + b.InlineVolumeSpec = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/volumeattachmentspec.go b/vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/volumeattachmentspec.go new file mode 100644 index 000000000000..1d5e304bb53c --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/volumeattachmentspec.go @@ -0,0 +1,57 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// VolumeAttachmentSpecApplyConfiguration represents an declarative configuration of the VolumeAttachmentSpec type for use +// with apply. +type VolumeAttachmentSpecApplyConfiguration struct { + Attacher *string `json:"attacher,omitempty"` + Source *VolumeAttachmentSourceApplyConfiguration `json:"source,omitempty"` + NodeName *string `json:"nodeName,omitempty"` +} + +// VolumeAttachmentSpecApplyConfiguration constructs an declarative configuration of the VolumeAttachmentSpec type for use with +// apply. +func VolumeAttachmentSpec() *VolumeAttachmentSpecApplyConfiguration { + return &VolumeAttachmentSpecApplyConfiguration{} +} + +// WithAttacher sets the Attacher field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Attacher field is set to the value of the last call. +func (b *VolumeAttachmentSpecApplyConfiguration) WithAttacher(value string) *VolumeAttachmentSpecApplyConfiguration { + b.Attacher = &value + return b +} + +// WithSource sets the Source field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Source field is set to the value of the last call. +func (b *VolumeAttachmentSpecApplyConfiguration) WithSource(value *VolumeAttachmentSourceApplyConfiguration) *VolumeAttachmentSpecApplyConfiguration { + b.Source = value + return b +} + +// WithNodeName sets the NodeName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the NodeName field is set to the value of the last call. +func (b *VolumeAttachmentSpecApplyConfiguration) WithNodeName(value string) *VolumeAttachmentSpecApplyConfiguration { + b.NodeName = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/volumeattachmentstatus.go b/vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/volumeattachmentstatus.go new file mode 100644 index 000000000000..fa1855a24115 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/volumeattachmentstatus.go @@ -0,0 +1,72 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// VolumeAttachmentStatusApplyConfiguration represents an declarative configuration of the VolumeAttachmentStatus type for use +// with apply. +type VolumeAttachmentStatusApplyConfiguration struct { + Attached *bool `json:"attached,omitempty"` + AttachmentMetadata map[string]string `json:"attachmentMetadata,omitempty"` + AttachError *VolumeErrorApplyConfiguration `json:"attachError,omitempty"` + DetachError *VolumeErrorApplyConfiguration `json:"detachError,omitempty"` +} + +// VolumeAttachmentStatusApplyConfiguration constructs an declarative configuration of the VolumeAttachmentStatus type for use with +// apply. +func VolumeAttachmentStatus() *VolumeAttachmentStatusApplyConfiguration { + return &VolumeAttachmentStatusApplyConfiguration{} +} + +// WithAttached sets the Attached field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Attached field is set to the value of the last call. +func (b *VolumeAttachmentStatusApplyConfiguration) WithAttached(value bool) *VolumeAttachmentStatusApplyConfiguration { + b.Attached = &value + return b +} + +// WithAttachmentMetadata puts the entries into the AttachmentMetadata field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the AttachmentMetadata field, +// overwriting an existing map entries in AttachmentMetadata field with the same key. +func (b *VolumeAttachmentStatusApplyConfiguration) WithAttachmentMetadata(entries map[string]string) *VolumeAttachmentStatusApplyConfiguration { + if b.AttachmentMetadata == nil && len(entries) > 0 { + b.AttachmentMetadata = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.AttachmentMetadata[k] = v + } + return b +} + +// WithAttachError sets the AttachError field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AttachError field is set to the value of the last call. +func (b *VolumeAttachmentStatusApplyConfiguration) WithAttachError(value *VolumeErrorApplyConfiguration) *VolumeAttachmentStatusApplyConfiguration { + b.AttachError = value + return b +} + +// WithDetachError sets the DetachError field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DetachError field is set to the value of the last call. +func (b *VolumeAttachmentStatusApplyConfiguration) WithDetachError(value *VolumeErrorApplyConfiguration) *VolumeAttachmentStatusApplyConfiguration { + b.DetachError = value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/volumeerror.go b/vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/volumeerror.go new file mode 100644 index 000000000000..3f255fce752c --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/volumeerror.go @@ -0,0 +1,52 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// VolumeErrorApplyConfiguration represents an declarative configuration of the VolumeError type for use +// with apply. +type VolumeErrorApplyConfiguration struct { + Time *v1.Time `json:"time,omitempty"` + Message *string `json:"message,omitempty"` +} + +// VolumeErrorApplyConfiguration constructs an declarative configuration of the VolumeError type for use with +// apply. +func VolumeError() *VolumeErrorApplyConfiguration { + return &VolumeErrorApplyConfiguration{} +} + +// WithTime sets the Time field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Time field is set to the value of the last call. +func (b *VolumeErrorApplyConfiguration) WithTime(value v1.Time) *VolumeErrorApplyConfiguration { + b.Time = &value + return b +} + +// WithMessage sets the Message field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Message field is set to the value of the last call. +func (b *VolumeErrorApplyConfiguration) WithMessage(value string) *VolumeErrorApplyConfiguration { + b.Message = &value + return b +} diff --git a/vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/volumenoderesources.go b/vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/volumenoderesources.go new file mode 100644 index 000000000000..4b69b64c9bb4 --- /dev/null +++ b/vendor/k8s.io/client-go/applyconfigurations/storage/v1beta1/volumenoderesources.go @@ -0,0 +1,39 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// VolumeNodeResourcesApplyConfiguration represents an declarative configuration of the VolumeNodeResources type for use +// with apply. +type VolumeNodeResourcesApplyConfiguration struct { + Count *int32 `json:"count,omitempty"` +} + +// VolumeNodeResourcesApplyConfiguration constructs an declarative configuration of the VolumeNodeResources type for use with +// apply. +func VolumeNodeResources() *VolumeNodeResourcesApplyConfiguration { + return &VolumeNodeResourcesApplyConfiguration{} +} + +// WithCount sets the Count field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Count field is set to the value of the last call. +func (b *VolumeNodeResourcesApplyConfiguration) WithCount(value int32) *VolumeNodeResourcesApplyConfiguration { + b.Count = &value + return b +} diff --git a/vendor/k8s.io/client-go/discovery/BUILD b/vendor/k8s.io/client-go/discovery/BUILD deleted file mode 100644 index bedfdec49d32..000000000000 --- a/vendor/k8s.io/client-go/discovery/BUILD +++ /dev/null @@ -1,72 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "discovery_client.go", - "doc.go", - "helper.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/discovery", - importpath = "k8s.io/client-go/discovery", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/version:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//vendor/github.com/golang/protobuf/proto:go_default_library", - "//vendor/github.com/googleapis/gnostic/openapiv2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/discovery/cached:all-srcs", - "//staging/src/k8s.io/client-go/discovery/fake:all-srcs", - ], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = [ - "discovery_client_test.go", - "helper_blackbox_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/version:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/rest/fake:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/googleapis/gnostic/openapiv2:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) diff --git a/vendor/k8s.io/client-go/discovery/cached/BUILD b/vendor/k8s.io/client-go/discovery/cached/BUILD deleted file mode 100644 index 00d4a5d24f4c..000000000000 --- a/vendor/k8s.io/client-go/discovery/cached/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["legacy.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/discovery/cached", - importpath = "k8s.io/client-go/discovery/cached", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/client-go/discovery:go_default_library", - "//staging/src/k8s.io/client-go/discovery/cached/memory:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/discovery/cached/disk:all-srcs", - "//staging/src/k8s.io/client-go/discovery/cached/memory:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/discovery/cached/disk/BUILD b/vendor/k8s.io/client-go/discovery/cached/disk/BUILD deleted file mode 100644 index 247964e47404..000000000000 --- a/vendor/k8s.io/client-go/discovery/cached/disk/BUILD +++ /dev/null @@ -1,59 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "cached_discovery.go", - "round_tripper.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/discovery/cached/disk", - importpath = "k8s.io/client-go/discovery/cached/disk", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/version:go_default_library", - "//staging/src/k8s.io/client-go/discovery:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//vendor/github.com/googleapis/gnostic/openapiv2:go_default_library", - "//vendor/github.com/gregjones/httpcache:go_default_library", - "//vendor/github.com/gregjones/httpcache/diskcache:go_default_library", - "//vendor/github.com/peterbourgon/diskv:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "cached_discovery_test.go", - "round_tripper_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/version:go_default_library", - "//staging/src/k8s.io/client-go/discovery:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/rest/fake:go_default_library", - "//vendor/github.com/googleapis/gnostic/openapiv2:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/discovery/cached/memory/BUILD b/vendor/k8s.io/client-go/discovery/cached/memory/BUILD deleted file mode 100644 index f72793758337..000000000000 --- a/vendor/k8s.io/client-go/discovery/cached/memory/BUILD +++ /dev/null @@ -1,47 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["memcache_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/client-go/discovery/fake:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["memcache.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/discovery/cached/memory", - importpath = "k8s.io/client-go/discovery/cached/memory", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/version:go_default_library", - "//staging/src/k8s.io/client-go/discovery:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//vendor/github.com/googleapis/gnostic/openapiv2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/discovery/fake/BUILD b/vendor/k8s.io/client-go/discovery/fake/BUILD deleted file mode 100644 index 59e0666eb658..000000000000 --- a/vendor/k8s.io/client-go/discovery/fake/BUILD +++ /dev/null @@ -1,46 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["discovery.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/discovery/fake", - importpath = "k8s.io/client-go/discovery/fake", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/version:go_default_library", - "//staging/src/k8s.io/client-go/pkg/version:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - "//vendor/github.com/googleapis/gnostic/openapiv2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["discovery_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/version:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - ], -) diff --git a/vendor/k8s.io/client-go/dynamic/BUILD b/vendor/k8s.io/client-go/dynamic/BUILD deleted file mode 100644 index a3d8a4520cc4..000000000000 --- a/vendor/k8s.io/client-go/dynamic/BUILD +++ /dev/null @@ -1,65 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["client_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/streaming:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/rest/watch:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "interface.go", - "scheme.go", - "simple.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/dynamic", - importpath = "k8s.io/client-go/dynamic", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/json:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/dynamic/dynamicinformer:all-srcs", - "//staging/src/k8s.io/client-go/dynamic/dynamiclister:all-srcs", - "//staging/src/k8s.io/client-go/dynamic/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/dynamic/dynamicinformer/BUILD b/vendor/k8s.io/client-go/dynamic/dynamicinformer/BUILD deleted file mode 100644 index 0a708d17a9a6..000000000000 --- a/vendor/k8s.io/client-go/dynamic/dynamicinformer/BUILD +++ /dev/null @@ -1,53 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "informer.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/dynamic/dynamicinformer", - importpath = "k8s.io/client-go/dynamic/dynamicinformer", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/dynamic:go_default_library", - "//staging/src/k8s.io/client-go/dynamic/dynamiclister:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["informer_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/client-go/dynamic/fake:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/dynamic/dynamiclister/BUILD b/vendor/k8s.io/client-go/dynamic/dynamiclister/BUILD deleted file mode 100644 index c1bb09e9b7c6..000000000000 --- a/vendor/k8s.io/client-go/dynamic/dynamiclister/BUILD +++ /dev/null @@ -1,49 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "interface.go", - "lister.go", - "shim.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/dynamic/dynamiclister", - importpath = "k8s.io/client-go/dynamic/dynamiclister", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["lister_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/informers/BUILD b/vendor/k8s.io/client-go/informers/BUILD deleted file mode 100644 index 742a146a1397..000000000000 --- a/vendor/k8s.io/client-go/informers/BUILD +++ /dev/null @@ -1,112 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "factory.go", - "generic.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers", - importpath = "k8s.io/client-go/informers", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/admissionregistration/v1:go_default_library", - "//staging/src/k8s.io/api/admissionregistration/v1beta1:go_default_library", - "//staging/src/k8s.io/api/apiserverinternal/v1alpha1:go_default_library", - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/apps/v1beta1:go_default_library", - "//staging/src/k8s.io/api/apps/v1beta2:go_default_library", - "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", - "//staging/src/k8s.io/api/autoscaling/v2beta1:go_default_library", - "//staging/src/k8s.io/api/autoscaling/v2beta2:go_default_library", - "//staging/src/k8s.io/api/batch/v1:go_default_library", - "//staging/src/k8s.io/api/batch/v1beta1:go_default_library", - "//staging/src/k8s.io/api/batch/v2alpha1:go_default_library", - "//staging/src/k8s.io/api/certificates/v1:go_default_library", - "//staging/src/k8s.io/api/certificates/v1beta1:go_default_library", - "//staging/src/k8s.io/api/coordination/v1:go_default_library", - "//staging/src/k8s.io/api/coordination/v1beta1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/discovery/v1alpha1:go_default_library", - "//staging/src/k8s.io/api/discovery/v1beta1:go_default_library", - "//staging/src/k8s.io/api/events/v1:go_default_library", - "//staging/src/k8s.io/api/events/v1beta1:go_default_library", - "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", - "//staging/src/k8s.io/api/flowcontrol/v1alpha1:go_default_library", - "//staging/src/k8s.io/api/flowcontrol/v1beta1:go_default_library", - "//staging/src/k8s.io/api/networking/v1:go_default_library", - "//staging/src/k8s.io/api/networking/v1beta1:go_default_library", - "//staging/src/k8s.io/api/node/v1:go_default_library", - "//staging/src/k8s.io/api/node/v1alpha1:go_default_library", - "//staging/src/k8s.io/api/node/v1beta1:go_default_library", - "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/api/rbac/v1:go_default_library", - "//staging/src/k8s.io/api/rbac/v1alpha1:go_default_library", - "//staging/src/k8s.io/api/rbac/v1beta1:go_default_library", - "//staging/src/k8s.io/api/scheduling/v1:go_default_library", - "//staging/src/k8s.io/api/scheduling/v1alpha1:go_default_library", - "//staging/src/k8s.io/api/scheduling/v1beta1:go_default_library", - "//staging/src/k8s.io/api/storage/v1:go_default_library", - "//staging/src/k8s.io/api/storage/v1alpha1:go_default_library", - "//staging/src/k8s.io/api/storage/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/client-go/informers/admissionregistration:go_default_library", - "//staging/src/k8s.io/client-go/informers/apiserverinternal:go_default_library", - "//staging/src/k8s.io/client-go/informers/apps:go_default_library", - "//staging/src/k8s.io/client-go/informers/autoscaling:go_default_library", - "//staging/src/k8s.io/client-go/informers/batch:go_default_library", - "//staging/src/k8s.io/client-go/informers/certificates:go_default_library", - "//staging/src/k8s.io/client-go/informers/coordination:go_default_library", - "//staging/src/k8s.io/client-go/informers/core:go_default_library", - "//staging/src/k8s.io/client-go/informers/discovery:go_default_library", - "//staging/src/k8s.io/client-go/informers/events:go_default_library", - "//staging/src/k8s.io/client-go/informers/extensions:go_default_library", - "//staging/src/k8s.io/client-go/informers/flowcontrol:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//staging/src/k8s.io/client-go/informers/networking:go_default_library", - "//staging/src/k8s.io/client-go/informers/node:go_default_library", - "//staging/src/k8s.io/client-go/informers/policy:go_default_library", - "//staging/src/k8s.io/client-go/informers/rbac:go_default_library", - "//staging/src/k8s.io/client-go/informers/scheduling:go_default_library", - "//staging/src/k8s.io/client-go/informers/storage:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/informers/admissionregistration:all-srcs", - "//staging/src/k8s.io/client-go/informers/apiserverinternal:all-srcs", - "//staging/src/k8s.io/client-go/informers/apps:all-srcs", - "//staging/src/k8s.io/client-go/informers/autoscaling:all-srcs", - "//staging/src/k8s.io/client-go/informers/batch:all-srcs", - "//staging/src/k8s.io/client-go/informers/certificates:all-srcs", - "//staging/src/k8s.io/client-go/informers/coordination:all-srcs", - "//staging/src/k8s.io/client-go/informers/core:all-srcs", - "//staging/src/k8s.io/client-go/informers/discovery:all-srcs", - "//staging/src/k8s.io/client-go/informers/events:all-srcs", - "//staging/src/k8s.io/client-go/informers/extensions:all-srcs", - "//staging/src/k8s.io/client-go/informers/flowcontrol:all-srcs", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:all-srcs", - "//staging/src/k8s.io/client-go/informers/networking:all-srcs", - "//staging/src/k8s.io/client-go/informers/node:all-srcs", - "//staging/src/k8s.io/client-go/informers/policy:all-srcs", - "//staging/src/k8s.io/client-go/informers/rbac:all-srcs", - "//staging/src/k8s.io/client-go/informers/scheduling:all-srcs", - "//staging/src/k8s.io/client-go/informers/storage:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/informers/admissionregistration/BUILD b/vendor/k8s.io/client-go/informers/admissionregistration/BUILD deleted file mode 100644 index be9d75135491..000000000000 --- a/vendor/k8s.io/client-go/informers/admissionregistration/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["interface.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/admissionregistration", - importpath = "k8s.io/client-go/informers/admissionregistration", - deps = [ - "//staging/src/k8s.io/client-go/informers/admissionregistration/v1:go_default_library", - "//staging/src/k8s.io/client-go/informers/admissionregistration/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/informers/admissionregistration/v1:all-srcs", - "//staging/src/k8s.io/client-go/informers/admissionregistration/v1beta1:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/admissionregistration/v1/BUILD b/vendor/k8s.io/client-go/informers/admissionregistration/v1/BUILD deleted file mode 100644 index 122186d8e7ff..000000000000 --- a/vendor/k8s.io/client-go/informers/admissionregistration/v1/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "interface.go", - "mutatingwebhookconfiguration.go", - "validatingwebhookconfiguration.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/admissionregistration/v1", - importpath = "k8s.io/client-go/informers/admissionregistration/v1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/admissionregistration/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/admissionregistration/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/informers/admissionregistration/v1beta1/BUILD b/vendor/k8s.io/client-go/informers/admissionregistration/v1beta1/BUILD deleted file mode 100644 index 82ddc155351e..000000000000 --- a/vendor/k8s.io/client-go/informers/admissionregistration/v1beta1/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "interface.go", - "mutatingwebhookconfiguration.go", - "validatingwebhookconfiguration.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/admissionregistration/v1beta1", - importpath = "k8s.io/client-go/informers/admissionregistration/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/admissionregistration/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/admissionregistration/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/informers/apiserverinternal/BUILD b/vendor/k8s.io/client-go/informers/apiserverinternal/BUILD deleted file mode 100644 index e5a05b1d08c7..000000000000 --- a/vendor/k8s.io/client-go/informers/apiserverinternal/BUILD +++ /dev/null @@ -1,30 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["interface.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/apiserverinternal", - importpath = "k8s.io/client-go/informers/apiserverinternal", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/client-go/informers/apiserverinternal/v1alpha1:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/informers/apiserverinternal/v1alpha1:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/informers/apiserverinternal/v1alpha1/BUILD b/vendor/k8s.io/client-go/informers/apiserverinternal/v1alpha1/BUILD deleted file mode 100644 index 5180554107ac..000000000000 --- a/vendor/k8s.io/client-go/informers/apiserverinternal/v1alpha1/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "interface.go", - "storageversion.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/apiserverinternal/v1alpha1", - importpath = "k8s.io/client-go/informers/apiserverinternal/v1alpha1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/apiserverinternal/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/apiserverinternal/v1alpha1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/informers/apps/BUILD b/vendor/k8s.io/client-go/informers/apps/BUILD deleted file mode 100644 index 55e563d0fb37..000000000000 --- a/vendor/k8s.io/client-go/informers/apps/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["interface.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/apps", - importpath = "k8s.io/client-go/informers/apps", - deps = [ - "//staging/src/k8s.io/client-go/informers/apps/v1:go_default_library", - "//staging/src/k8s.io/client-go/informers/apps/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/informers/apps/v1beta2:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/informers/apps/v1:all-srcs", - "//staging/src/k8s.io/client-go/informers/apps/v1beta1:all-srcs", - "//staging/src/k8s.io/client-go/informers/apps/v1beta2:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/apps/v1/BUILD b/vendor/k8s.io/client-go/informers/apps/v1/BUILD deleted file mode 100644 index 31aca7c503ae..000000000000 --- a/vendor/k8s.io/client-go/informers/apps/v1/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "controllerrevision.go", - "daemonset.go", - "deployment.go", - "interface.go", - "replicaset.go", - "statefulset.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/apps/v1", - importpath = "k8s.io/client-go/informers/apps/v1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/apps/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/informers/apps/v1beta1/BUILD b/vendor/k8s.io/client-go/informers/apps/v1beta1/BUILD deleted file mode 100644 index cd5220b3e1bd..000000000000 --- a/vendor/k8s.io/client-go/informers/apps/v1beta1/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "controllerrevision.go", - "deployment.go", - "interface.go", - "statefulset.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/apps/v1beta1", - importpath = "k8s.io/client-go/informers/apps/v1beta1", - deps = [ - "//staging/src/k8s.io/api/apps/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/apps/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/apps/v1beta2/BUILD b/vendor/k8s.io/client-go/informers/apps/v1beta2/BUILD deleted file mode 100644 index ce5d9adcaaa5..000000000000 --- a/vendor/k8s.io/client-go/informers/apps/v1beta2/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "controllerrevision.go", - "daemonset.go", - "deployment.go", - "interface.go", - "replicaset.go", - "statefulset.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/apps/v1beta2", - importpath = "k8s.io/client-go/informers/apps/v1beta2", - deps = [ - "//staging/src/k8s.io/api/apps/v1beta2:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/apps/v1beta2:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/autoscaling/BUILD b/vendor/k8s.io/client-go/informers/autoscaling/BUILD deleted file mode 100644 index 66f6ca746ce1..000000000000 --- a/vendor/k8s.io/client-go/informers/autoscaling/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["interface.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/autoscaling", - importpath = "k8s.io/client-go/informers/autoscaling", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/client-go/informers/autoscaling/v1:go_default_library", - "//staging/src/k8s.io/client-go/informers/autoscaling/v2beta1:go_default_library", - "//staging/src/k8s.io/client-go/informers/autoscaling/v2beta2:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/informers/autoscaling/v1:all-srcs", - "//staging/src/k8s.io/client-go/informers/autoscaling/v2beta1:all-srcs", - "//staging/src/k8s.io/client-go/informers/autoscaling/v2beta2:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/informers/autoscaling/v1/BUILD b/vendor/k8s.io/client-go/informers/autoscaling/v1/BUILD deleted file mode 100644 index 4a8e4d7fe03f..000000000000 --- a/vendor/k8s.io/client-go/informers/autoscaling/v1/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "horizontalpodautoscaler.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/autoscaling/v1", - importpath = "k8s.io/client-go/informers/autoscaling/v1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/autoscaling/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/informers/autoscaling/v2beta1/BUILD b/vendor/k8s.io/client-go/informers/autoscaling/v2beta1/BUILD deleted file mode 100644 index 578000419033..000000000000 --- a/vendor/k8s.io/client-go/informers/autoscaling/v2beta1/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "horizontalpodautoscaler.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/autoscaling/v2beta1", - importpath = "k8s.io/client-go/informers/autoscaling/v2beta1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/autoscaling/v2beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/autoscaling/v2beta1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/informers/autoscaling/v2beta2/BUILD b/vendor/k8s.io/client-go/informers/autoscaling/v2beta2/BUILD deleted file mode 100644 index 78bdf9097446..000000000000 --- a/vendor/k8s.io/client-go/informers/autoscaling/v2beta2/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "horizontalpodautoscaler.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/autoscaling/v2beta2", - importpath = "k8s.io/client-go/informers/autoscaling/v2beta2", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/autoscaling/v2beta2:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/autoscaling/v2beta2:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/informers/batch/BUILD b/vendor/k8s.io/client-go/informers/batch/BUILD deleted file mode 100644 index 3d461ecacdae..000000000000 --- a/vendor/k8s.io/client-go/informers/batch/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["interface.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/batch", - importpath = "k8s.io/client-go/informers/batch", - deps = [ - "//staging/src/k8s.io/client-go/informers/batch/v1:go_default_library", - "//staging/src/k8s.io/client-go/informers/batch/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/informers/batch/v2alpha1:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/informers/batch/v1:all-srcs", - "//staging/src/k8s.io/client-go/informers/batch/v1beta1:all-srcs", - "//staging/src/k8s.io/client-go/informers/batch/v2alpha1:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/batch/interface.go b/vendor/k8s.io/client-go/informers/batch/interface.go index fa428869dfd3..53b81c7ecc6f 100644 --- a/vendor/k8s.io/client-go/informers/batch/interface.go +++ b/vendor/k8s.io/client-go/informers/batch/interface.go @@ -21,7 +21,6 @@ package batch import ( v1 "k8s.io/client-go/informers/batch/v1" v1beta1 "k8s.io/client-go/informers/batch/v1beta1" - v2alpha1 "k8s.io/client-go/informers/batch/v2alpha1" internalinterfaces "k8s.io/client-go/informers/internalinterfaces" ) @@ -31,8 +30,6 @@ type Interface interface { V1() v1.Interface // V1beta1 provides access to shared informers for resources in V1beta1. V1beta1() v1beta1.Interface - // V2alpha1 provides access to shared informers for resources in V2alpha1. - V2alpha1() v2alpha1.Interface } type group struct { @@ -55,8 +52,3 @@ func (g *group) V1() v1.Interface { func (g *group) V1beta1() v1beta1.Interface { return v1beta1.New(g.factory, g.namespace, g.tweakListOptions) } - -// V2alpha1 returns a new v2alpha1.Interface. -func (g *group) V2alpha1() v2alpha1.Interface { - return v2alpha1.New(g.factory, g.namespace, g.tweakListOptions) -} diff --git a/vendor/k8s.io/client-go/informers/batch/v1/BUILD b/vendor/k8s.io/client-go/informers/batch/v1/BUILD deleted file mode 100644 index 64b28c545290..000000000000 --- a/vendor/k8s.io/client-go/informers/batch/v1/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "interface.go", - "job.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/batch/v1", - importpath = "k8s.io/client-go/informers/batch/v1", - deps = [ - "//staging/src/k8s.io/api/batch/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/batch/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/batch/v1/cronjob.go b/vendor/k8s.io/client-go/informers/batch/v1/cronjob.go new file mode 100644 index 000000000000..fdfb655134d0 --- /dev/null +++ b/vendor/k8s.io/client-go/informers/batch/v1/cronjob.go @@ -0,0 +1,90 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by informer-gen. DO NOT EDIT. + +package v1 + +import ( + "context" + time "time" + + batchv1 "k8s.io/api/batch/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + watch "k8s.io/apimachinery/pkg/watch" + internalinterfaces "k8s.io/client-go/informers/internalinterfaces" + kubernetes "k8s.io/client-go/kubernetes" + v1 "k8s.io/client-go/listers/batch/v1" + cache "k8s.io/client-go/tools/cache" +) + +// CronJobInformer provides access to a shared informer and lister for +// CronJobs. +type CronJobInformer interface { + Informer() cache.SharedIndexInformer + Lister() v1.CronJobLister +} + +type cronJobInformer struct { + factory internalinterfaces.SharedInformerFactory + tweakListOptions internalinterfaces.TweakListOptionsFunc + namespace string +} + +// NewCronJobInformer constructs a new informer for CronJob type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewCronJobInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { + return NewFilteredCronJobInformer(client, namespace, resyncPeriod, indexers, nil) +} + +// NewFilteredCronJobInformer constructs a new informer for CronJob type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewFilteredCronJobInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { + return cache.NewSharedIndexInformer( + &cache.ListWatch{ + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.BatchV1().CronJobs(namespace).List(context.TODO(), options) + }, + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.BatchV1().CronJobs(namespace).Watch(context.TODO(), options) + }, + }, + &batchv1.CronJob{}, + resyncPeriod, + indexers, + ) +} + +func (f *cronJobInformer) defaultInformer(client kubernetes.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { + return NewFilteredCronJobInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions) +} + +func (f *cronJobInformer) Informer() cache.SharedIndexInformer { + return f.factory.InformerFor(&batchv1.CronJob{}, f.defaultInformer) +} + +func (f *cronJobInformer) Lister() v1.CronJobLister { + return v1.NewCronJobLister(f.Informer().GetIndexer()) +} diff --git a/vendor/k8s.io/client-go/informers/batch/v1/interface.go b/vendor/k8s.io/client-go/informers/batch/v1/interface.go index 67d71adc23c9..84567fb592b7 100644 --- a/vendor/k8s.io/client-go/informers/batch/v1/interface.go +++ b/vendor/k8s.io/client-go/informers/batch/v1/interface.go @@ -24,6 +24,8 @@ import ( // Interface provides access to all the informers in this group version. type Interface interface { + // CronJobs returns a CronJobInformer. + CronJobs() CronJobInformer // Jobs returns a JobInformer. Jobs() JobInformer } @@ -39,6 +41,11 @@ func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakList return &version{factory: f, namespace: namespace, tweakListOptions: tweakListOptions} } +// CronJobs returns a CronJobInformer. +func (v *version) CronJobs() CronJobInformer { + return &cronJobInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} +} + // Jobs returns a JobInformer. func (v *version) Jobs() JobInformer { return &jobInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} diff --git a/vendor/k8s.io/client-go/informers/batch/v1beta1/BUILD b/vendor/k8s.io/client-go/informers/batch/v1beta1/BUILD deleted file mode 100644 index b7bde8807dd9..000000000000 --- a/vendor/k8s.io/client-go/informers/batch/v1beta1/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "cronjob.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/batch/v1beta1", - importpath = "k8s.io/client-go/informers/batch/v1beta1", - deps = [ - "//staging/src/k8s.io/api/batch/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/batch/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/batch/v2alpha1/BUILD b/vendor/k8s.io/client-go/informers/batch/v2alpha1/BUILD deleted file mode 100644 index 0ff45d9e0e73..000000000000 --- a/vendor/k8s.io/client-go/informers/batch/v2alpha1/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "cronjob.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/batch/v2alpha1", - importpath = "k8s.io/client-go/informers/batch/v2alpha1", - deps = [ - "//staging/src/k8s.io/api/batch/v2alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/batch/v2alpha1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/batch/v2alpha1/cronjob.go b/vendor/k8s.io/client-go/informers/batch/v2alpha1/cronjob.go deleted file mode 100644 index 5f5b870d4b6c..000000000000 --- a/vendor/k8s.io/client-go/informers/batch/v2alpha1/cronjob.go +++ /dev/null @@ -1,90 +0,0 @@ -/* -Copyright The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by informer-gen. DO NOT EDIT. - -package v2alpha1 - -import ( - "context" - time "time" - - batchv2alpha1 "k8s.io/api/batch/v2alpha1" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - runtime "k8s.io/apimachinery/pkg/runtime" - watch "k8s.io/apimachinery/pkg/watch" - internalinterfaces "k8s.io/client-go/informers/internalinterfaces" - kubernetes "k8s.io/client-go/kubernetes" - v2alpha1 "k8s.io/client-go/listers/batch/v2alpha1" - cache "k8s.io/client-go/tools/cache" -) - -// CronJobInformer provides access to a shared informer and lister for -// CronJobs. -type CronJobInformer interface { - Informer() cache.SharedIndexInformer - Lister() v2alpha1.CronJobLister -} - -type cronJobInformer struct { - factory internalinterfaces.SharedInformerFactory - tweakListOptions internalinterfaces.TweakListOptionsFunc - namespace string -} - -// NewCronJobInformer constructs a new informer for CronJob type. -// Always prefer using an informer factory to get a shared informer instead of getting an independent -// one. This reduces memory footprint and number of connections to the server. -func NewCronJobInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { - return NewFilteredCronJobInformer(client, namespace, resyncPeriod, indexers, nil) -} - -// NewFilteredCronJobInformer constructs a new informer for CronJob type. -// Always prefer using an informer factory to get a shared informer instead of getting an independent -// one. This reduces memory footprint and number of connections to the server. -func NewFilteredCronJobInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { - return cache.NewSharedIndexInformer( - &cache.ListWatch{ - ListFunc: func(options v1.ListOptions) (runtime.Object, error) { - if tweakListOptions != nil { - tweakListOptions(&options) - } - return client.BatchV2alpha1().CronJobs(namespace).List(context.TODO(), options) - }, - WatchFunc: func(options v1.ListOptions) (watch.Interface, error) { - if tweakListOptions != nil { - tweakListOptions(&options) - } - return client.BatchV2alpha1().CronJobs(namespace).Watch(context.TODO(), options) - }, - }, - &batchv2alpha1.CronJob{}, - resyncPeriod, - indexers, - ) -} - -func (f *cronJobInformer) defaultInformer(client kubernetes.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { - return NewFilteredCronJobInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions) -} - -func (f *cronJobInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&batchv2alpha1.CronJob{}, f.defaultInformer) -} - -func (f *cronJobInformer) Lister() v2alpha1.CronJobLister { - return v2alpha1.NewCronJobLister(f.Informer().GetIndexer()) -} diff --git a/vendor/k8s.io/client-go/informers/batch/v2alpha1/interface.go b/vendor/k8s.io/client-go/informers/batch/v2alpha1/interface.go deleted file mode 100644 index 6c5bf236f913..000000000000 --- a/vendor/k8s.io/client-go/informers/batch/v2alpha1/interface.go +++ /dev/null @@ -1,45 +0,0 @@ -/* -Copyright The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by informer-gen. DO NOT EDIT. - -package v2alpha1 - -import ( - internalinterfaces "k8s.io/client-go/informers/internalinterfaces" -) - -// Interface provides access to all the informers in this group version. -type Interface interface { - // CronJobs returns a CronJobInformer. - CronJobs() CronJobInformer -} - -type version struct { - factory internalinterfaces.SharedInformerFactory - namespace string - tweakListOptions internalinterfaces.TweakListOptionsFunc -} - -// New returns a new Interface. -func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) Interface { - return &version{factory: f, namespace: namespace, tweakListOptions: tweakListOptions} -} - -// CronJobs returns a CronJobInformer. -func (v *version) CronJobs() CronJobInformer { - return &cronJobInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} -} diff --git a/vendor/k8s.io/client-go/informers/certificates/BUILD b/vendor/k8s.io/client-go/informers/certificates/BUILD deleted file mode 100644 index bb416d090a8e..000000000000 --- a/vendor/k8s.io/client-go/informers/certificates/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["interface.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/certificates", - importpath = "k8s.io/client-go/informers/certificates", - deps = [ - "//staging/src/k8s.io/client-go/informers/certificates/v1:go_default_library", - "//staging/src/k8s.io/client-go/informers/certificates/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/informers/certificates/v1:all-srcs", - "//staging/src/k8s.io/client-go/informers/certificates/v1beta1:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/certificates/v1/BUILD b/vendor/k8s.io/client-go/informers/certificates/v1/BUILD deleted file mode 100644 index 222e41454e25..000000000000 --- a/vendor/k8s.io/client-go/informers/certificates/v1/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "certificatesigningrequest.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/certificates/v1", - importpath = "k8s.io/client-go/informers/certificates/v1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/certificates/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/certificates/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/informers/certificates/v1beta1/BUILD b/vendor/k8s.io/client-go/informers/certificates/v1beta1/BUILD deleted file mode 100644 index 3f464ec0e306..000000000000 --- a/vendor/k8s.io/client-go/informers/certificates/v1beta1/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "certificatesigningrequest.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/certificates/v1beta1", - importpath = "k8s.io/client-go/informers/certificates/v1beta1", - deps = [ - "//staging/src/k8s.io/api/certificates/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/certificates/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/coordination/BUILD b/vendor/k8s.io/client-go/informers/coordination/BUILD deleted file mode 100644 index 51e67990781c..000000000000 --- a/vendor/k8s.io/client-go/informers/coordination/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["interface.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/coordination", - importpath = "k8s.io/client-go/informers/coordination", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/client-go/informers/coordination/v1:go_default_library", - "//staging/src/k8s.io/client-go/informers/coordination/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/informers/coordination/v1:all-srcs", - "//staging/src/k8s.io/client-go/informers/coordination/v1beta1:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/informers/coordination/v1/BUILD b/vendor/k8s.io/client-go/informers/coordination/v1/BUILD deleted file mode 100644 index d4c2ea578606..000000000000 --- a/vendor/k8s.io/client-go/informers/coordination/v1/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "interface.go", - "lease.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/coordination/v1", - importpath = "k8s.io/client-go/informers/coordination/v1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/coordination/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/coordination/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/informers/coordination/v1beta1/BUILD b/vendor/k8s.io/client-go/informers/coordination/v1beta1/BUILD deleted file mode 100644 index 22d27614f10f..000000000000 --- a/vendor/k8s.io/client-go/informers/coordination/v1beta1/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "interface.go", - "lease.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/coordination/v1beta1", - importpath = "k8s.io/client-go/informers/coordination/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/coordination/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/coordination/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/informers/core/BUILD b/vendor/k8s.io/client-go/informers/core/BUILD deleted file mode 100644 index d72514d944e4..000000000000 --- a/vendor/k8s.io/client-go/informers/core/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["interface.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/core", - importpath = "k8s.io/client-go/informers/core", - deps = [ - "//staging/src/k8s.io/client-go/informers/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/informers/core/v1:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/core/v1/BUILD b/vendor/k8s.io/client-go/informers/core/v1/BUILD deleted file mode 100644 index 6fb6c75f7e78..000000000000 --- a/vendor/k8s.io/client-go/informers/core/v1/BUILD +++ /dev/null @@ -1,54 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "componentstatus.go", - "configmap.go", - "endpoints.go", - "event.go", - "interface.go", - "limitrange.go", - "namespace.go", - "node.go", - "persistentvolume.go", - "persistentvolumeclaim.go", - "pod.go", - "podtemplate.go", - "replicationcontroller.go", - "resourcequota.go", - "secret.go", - "service.go", - "serviceaccount.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/core/v1", - importpath = "k8s.io/client-go/informers/core/v1", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/discovery/BUILD b/vendor/k8s.io/client-go/informers/discovery/BUILD deleted file mode 100644 index 9a187d17dde5..000000000000 --- a/vendor/k8s.io/client-go/informers/discovery/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["interface.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/discovery", - importpath = "k8s.io/client-go/informers/discovery", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/client-go/informers/discovery/v1alpha1:go_default_library", - "//staging/src/k8s.io/client-go/informers/discovery/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/informers/discovery/v1alpha1:all-srcs", - "//staging/src/k8s.io/client-go/informers/discovery/v1beta1:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/informers/discovery/interface.go b/vendor/k8s.io/client-go/informers/discovery/interface.go index c0cae3314a32..37da9371f6bc 100644 --- a/vendor/k8s.io/client-go/informers/discovery/interface.go +++ b/vendor/k8s.io/client-go/informers/discovery/interface.go @@ -19,15 +19,15 @@ limitations under the License. package discovery import ( - v1alpha1 "k8s.io/client-go/informers/discovery/v1alpha1" + v1 "k8s.io/client-go/informers/discovery/v1" v1beta1 "k8s.io/client-go/informers/discovery/v1beta1" internalinterfaces "k8s.io/client-go/informers/internalinterfaces" ) // Interface provides access to each of this group's versions. type Interface interface { - // V1alpha1 provides access to shared informers for resources in V1alpha1. - V1alpha1() v1alpha1.Interface + // V1 provides access to shared informers for resources in V1. + V1() v1.Interface // V1beta1 provides access to shared informers for resources in V1beta1. V1beta1() v1beta1.Interface } @@ -43,9 +43,9 @@ func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakList return &group{factory: f, namespace: namespace, tweakListOptions: tweakListOptions} } -// V1alpha1 returns a new v1alpha1.Interface. -func (g *group) V1alpha1() v1alpha1.Interface { - return v1alpha1.New(g.factory, g.namespace, g.tweakListOptions) +// V1 returns a new v1.Interface. +func (g *group) V1() v1.Interface { + return v1.New(g.factory, g.namespace, g.tweakListOptions) } // V1beta1 returns a new v1beta1.Interface. diff --git a/vendor/k8s.io/client-go/informers/discovery/v1/endpointslice.go b/vendor/k8s.io/client-go/informers/discovery/v1/endpointslice.go new file mode 100644 index 000000000000..6c6c3372bfc8 --- /dev/null +++ b/vendor/k8s.io/client-go/informers/discovery/v1/endpointslice.go @@ -0,0 +1,90 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by informer-gen. DO NOT EDIT. + +package v1 + +import ( + "context" + time "time" + + discoveryv1 "k8s.io/api/discovery/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + watch "k8s.io/apimachinery/pkg/watch" + internalinterfaces "k8s.io/client-go/informers/internalinterfaces" + kubernetes "k8s.io/client-go/kubernetes" + v1 "k8s.io/client-go/listers/discovery/v1" + cache "k8s.io/client-go/tools/cache" +) + +// EndpointSliceInformer provides access to a shared informer and lister for +// EndpointSlices. +type EndpointSliceInformer interface { + Informer() cache.SharedIndexInformer + Lister() v1.EndpointSliceLister +} + +type endpointSliceInformer struct { + factory internalinterfaces.SharedInformerFactory + tweakListOptions internalinterfaces.TweakListOptionsFunc + namespace string +} + +// NewEndpointSliceInformer constructs a new informer for EndpointSlice type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewEndpointSliceInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { + return NewFilteredEndpointSliceInformer(client, namespace, resyncPeriod, indexers, nil) +} + +// NewFilteredEndpointSliceInformer constructs a new informer for EndpointSlice type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewFilteredEndpointSliceInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { + return cache.NewSharedIndexInformer( + &cache.ListWatch{ + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.DiscoveryV1().EndpointSlices(namespace).List(context.TODO(), options) + }, + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.DiscoveryV1().EndpointSlices(namespace).Watch(context.TODO(), options) + }, + }, + &discoveryv1.EndpointSlice{}, + resyncPeriod, + indexers, + ) +} + +func (f *endpointSliceInformer) defaultInformer(client kubernetes.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { + return NewFilteredEndpointSliceInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions) +} + +func (f *endpointSliceInformer) Informer() cache.SharedIndexInformer { + return f.factory.InformerFor(&discoveryv1.EndpointSlice{}, f.defaultInformer) +} + +func (f *endpointSliceInformer) Lister() v1.EndpointSliceLister { + return v1.NewEndpointSliceLister(f.Informer().GetIndexer()) +} diff --git a/vendor/k8s.io/client-go/informers/discovery/v1/interface.go b/vendor/k8s.io/client-go/informers/discovery/v1/interface.go new file mode 100644 index 000000000000..d90c63c0a940 --- /dev/null +++ b/vendor/k8s.io/client-go/informers/discovery/v1/interface.go @@ -0,0 +1,45 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by informer-gen. DO NOT EDIT. + +package v1 + +import ( + internalinterfaces "k8s.io/client-go/informers/internalinterfaces" +) + +// Interface provides access to all the informers in this group version. +type Interface interface { + // EndpointSlices returns a EndpointSliceInformer. + EndpointSlices() EndpointSliceInformer +} + +type version struct { + factory internalinterfaces.SharedInformerFactory + namespace string + tweakListOptions internalinterfaces.TweakListOptionsFunc +} + +// New returns a new Interface. +func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) Interface { + return &version{factory: f, namespace: namespace, tweakListOptions: tweakListOptions} +} + +// EndpointSlices returns a EndpointSliceInformer. +func (v *version) EndpointSlices() EndpointSliceInformer { + return &endpointSliceInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} +} diff --git a/vendor/k8s.io/client-go/informers/discovery/v1alpha1/BUILD b/vendor/k8s.io/client-go/informers/discovery/v1alpha1/BUILD deleted file mode 100644 index 68a4428a77f7..000000000000 --- a/vendor/k8s.io/client-go/informers/discovery/v1alpha1/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "endpointslice.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/discovery/v1alpha1", - importpath = "k8s.io/client-go/informers/discovery/v1alpha1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/discovery/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/discovery/v1alpha1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/informers/discovery/v1alpha1/endpointslice.go b/vendor/k8s.io/client-go/informers/discovery/v1alpha1/endpointslice.go deleted file mode 100644 index c5e383c0b206..000000000000 --- a/vendor/k8s.io/client-go/informers/discovery/v1alpha1/endpointslice.go +++ /dev/null @@ -1,90 +0,0 @@ -/* -Copyright The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by informer-gen. DO NOT EDIT. - -package v1alpha1 - -import ( - "context" - time "time" - - discoveryv1alpha1 "k8s.io/api/discovery/v1alpha1" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - runtime "k8s.io/apimachinery/pkg/runtime" - watch "k8s.io/apimachinery/pkg/watch" - internalinterfaces "k8s.io/client-go/informers/internalinterfaces" - kubernetes "k8s.io/client-go/kubernetes" - v1alpha1 "k8s.io/client-go/listers/discovery/v1alpha1" - cache "k8s.io/client-go/tools/cache" -) - -// EndpointSliceInformer provides access to a shared informer and lister for -// EndpointSlices. -type EndpointSliceInformer interface { - Informer() cache.SharedIndexInformer - Lister() v1alpha1.EndpointSliceLister -} - -type endpointSliceInformer struct { - factory internalinterfaces.SharedInformerFactory - tweakListOptions internalinterfaces.TweakListOptionsFunc - namespace string -} - -// NewEndpointSliceInformer constructs a new informer for EndpointSlice type. -// Always prefer using an informer factory to get a shared informer instead of getting an independent -// one. This reduces memory footprint and number of connections to the server. -func NewEndpointSliceInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { - return NewFilteredEndpointSliceInformer(client, namespace, resyncPeriod, indexers, nil) -} - -// NewFilteredEndpointSliceInformer constructs a new informer for EndpointSlice type. -// Always prefer using an informer factory to get a shared informer instead of getting an independent -// one. This reduces memory footprint and number of connections to the server. -func NewFilteredEndpointSliceInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { - return cache.NewSharedIndexInformer( - &cache.ListWatch{ - ListFunc: func(options v1.ListOptions) (runtime.Object, error) { - if tweakListOptions != nil { - tweakListOptions(&options) - } - return client.DiscoveryV1alpha1().EndpointSlices(namespace).List(context.TODO(), options) - }, - WatchFunc: func(options v1.ListOptions) (watch.Interface, error) { - if tweakListOptions != nil { - tweakListOptions(&options) - } - return client.DiscoveryV1alpha1().EndpointSlices(namespace).Watch(context.TODO(), options) - }, - }, - &discoveryv1alpha1.EndpointSlice{}, - resyncPeriod, - indexers, - ) -} - -func (f *endpointSliceInformer) defaultInformer(client kubernetes.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { - return NewFilteredEndpointSliceInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions) -} - -func (f *endpointSliceInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&discoveryv1alpha1.EndpointSlice{}, f.defaultInformer) -} - -func (f *endpointSliceInformer) Lister() v1alpha1.EndpointSliceLister { - return v1alpha1.NewEndpointSliceLister(f.Informer().GetIndexer()) -} diff --git a/vendor/k8s.io/client-go/informers/discovery/v1alpha1/interface.go b/vendor/k8s.io/client-go/informers/discovery/v1alpha1/interface.go deleted file mode 100644 index 711dcae52cca..000000000000 --- a/vendor/k8s.io/client-go/informers/discovery/v1alpha1/interface.go +++ /dev/null @@ -1,45 +0,0 @@ -/* -Copyright The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by informer-gen. DO NOT EDIT. - -package v1alpha1 - -import ( - internalinterfaces "k8s.io/client-go/informers/internalinterfaces" -) - -// Interface provides access to all the informers in this group version. -type Interface interface { - // EndpointSlices returns a EndpointSliceInformer. - EndpointSlices() EndpointSliceInformer -} - -type version struct { - factory internalinterfaces.SharedInformerFactory - namespace string - tweakListOptions internalinterfaces.TweakListOptionsFunc -} - -// New returns a new Interface. -func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) Interface { - return &version{factory: f, namespace: namespace, tweakListOptions: tweakListOptions} -} - -// EndpointSlices returns a EndpointSliceInformer. -func (v *version) EndpointSlices() EndpointSliceInformer { - return &endpointSliceInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} -} diff --git a/vendor/k8s.io/client-go/informers/discovery/v1beta1/BUILD b/vendor/k8s.io/client-go/informers/discovery/v1beta1/BUILD deleted file mode 100644 index ec7b58f88681..000000000000 --- a/vendor/k8s.io/client-go/informers/discovery/v1beta1/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "endpointslice.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/discovery/v1beta1", - importpath = "k8s.io/client-go/informers/discovery/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/discovery/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/discovery/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/informers/events/BUILD b/vendor/k8s.io/client-go/informers/events/BUILD deleted file mode 100644 index 908ee177e79f..000000000000 --- a/vendor/k8s.io/client-go/informers/events/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["interface.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/events", - importpath = "k8s.io/client-go/informers/events", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/client-go/informers/events/v1:go_default_library", - "//staging/src/k8s.io/client-go/informers/events/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/informers/events/v1:all-srcs", - "//staging/src/k8s.io/client-go/informers/events/v1beta1:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/informers/events/v1/BUILD b/vendor/k8s.io/client-go/informers/events/v1/BUILD deleted file mode 100644 index ec355a5c63b6..000000000000 --- a/vendor/k8s.io/client-go/informers/events/v1/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "event.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/events/v1", - importpath = "k8s.io/client-go/informers/events/v1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/events/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/events/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/informers/events/v1beta1/BUILD b/vendor/k8s.io/client-go/informers/events/v1beta1/BUILD deleted file mode 100644 index 0bf60bd756e6..000000000000 --- a/vendor/k8s.io/client-go/informers/events/v1beta1/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "event.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/events/v1beta1", - importpath = "k8s.io/client-go/informers/events/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/events/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/events/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/informers/extensions/BUILD b/vendor/k8s.io/client-go/informers/extensions/BUILD deleted file mode 100644 index d75a2ae9508c..000000000000 --- a/vendor/k8s.io/client-go/informers/extensions/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["interface.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/extensions", - importpath = "k8s.io/client-go/informers/extensions", - deps = [ - "//staging/src/k8s.io/client-go/informers/extensions/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/informers/extensions/v1beta1:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/extensions/v1beta1/BUILD b/vendor/k8s.io/client-go/informers/extensions/v1beta1/BUILD deleted file mode 100644 index ca0d7db4c89b..000000000000 --- a/vendor/k8s.io/client-go/informers/extensions/v1beta1/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "daemonset.go", - "deployment.go", - "ingress.go", - "interface.go", - "networkpolicy.go", - "podsecuritypolicy.go", - "replicaset.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/extensions/v1beta1", - importpath = "k8s.io/client-go/informers/extensions/v1beta1", - deps = [ - "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/extensions/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/flowcontrol/BUILD b/vendor/k8s.io/client-go/informers/flowcontrol/BUILD deleted file mode 100644 index d775ee413e55..000000000000 --- a/vendor/k8s.io/client-go/informers/flowcontrol/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["interface.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/flowcontrol", - importpath = "k8s.io/client-go/informers/flowcontrol", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/client-go/informers/flowcontrol/v1alpha1:go_default_library", - "//staging/src/k8s.io/client-go/informers/flowcontrol/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/informers/flowcontrol/v1alpha1:all-srcs", - "//staging/src/k8s.io/client-go/informers/flowcontrol/v1beta1:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/informers/flowcontrol/v1alpha1/BUILD b/vendor/k8s.io/client-go/informers/flowcontrol/v1alpha1/BUILD deleted file mode 100644 index 742eaf7a4067..000000000000 --- a/vendor/k8s.io/client-go/informers/flowcontrol/v1alpha1/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "flowschema.go", - "interface.go", - "prioritylevelconfiguration.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/flowcontrol/v1alpha1", - importpath = "k8s.io/client-go/informers/flowcontrol/v1alpha1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/flowcontrol/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/flowcontrol/v1alpha1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/informers/flowcontrol/v1beta1/BUILD b/vendor/k8s.io/client-go/informers/flowcontrol/v1beta1/BUILD deleted file mode 100644 index b64f6ed38bae..000000000000 --- a/vendor/k8s.io/client-go/informers/flowcontrol/v1beta1/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "flowschema.go", - "interface.go", - "prioritylevelconfiguration.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/flowcontrol/v1beta1", - importpath = "k8s.io/client-go/informers/flowcontrol/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/flowcontrol/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/flowcontrol/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/informers/generic.go b/vendor/k8s.io/client-go/informers/generic.go index 2bc451095e19..aede51a5e6d5 100644 --- a/vendor/k8s.io/client-go/informers/generic.go +++ b/vendor/k8s.io/client-go/informers/generic.go @@ -32,24 +32,24 @@ import ( v2beta2 "k8s.io/api/autoscaling/v2beta2" batchv1 "k8s.io/api/batch/v1" batchv1beta1 "k8s.io/api/batch/v1beta1" - v2alpha1 "k8s.io/api/batch/v2alpha1" certificatesv1 "k8s.io/api/certificates/v1" certificatesv1beta1 "k8s.io/api/certificates/v1beta1" coordinationv1 "k8s.io/api/coordination/v1" coordinationv1beta1 "k8s.io/api/coordination/v1beta1" corev1 "k8s.io/api/core/v1" - v1alpha1 "k8s.io/api/discovery/v1alpha1" + discoveryv1 "k8s.io/api/discovery/v1" discoveryv1beta1 "k8s.io/api/discovery/v1beta1" eventsv1 "k8s.io/api/events/v1" eventsv1beta1 "k8s.io/api/events/v1beta1" extensionsv1beta1 "k8s.io/api/extensions/v1beta1" - flowcontrolv1alpha1 "k8s.io/api/flowcontrol/v1alpha1" + v1alpha1 "k8s.io/api/flowcontrol/v1alpha1" flowcontrolv1beta1 "k8s.io/api/flowcontrol/v1beta1" networkingv1 "k8s.io/api/networking/v1" networkingv1beta1 "k8s.io/api/networking/v1beta1" nodev1 "k8s.io/api/node/v1" nodev1alpha1 "k8s.io/api/node/v1alpha1" nodev1beta1 "k8s.io/api/node/v1beta1" + policyv1 "k8s.io/api/policy/v1" policyv1beta1 "k8s.io/api/policy/v1beta1" rbacv1 "k8s.io/api/rbac/v1" rbacv1alpha1 "k8s.io/api/rbac/v1alpha1" @@ -147,6 +147,8 @@ func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource return &genericInformer{resource: resource.GroupResource(), informer: f.Autoscaling().V2beta2().HorizontalPodAutoscalers().Informer()}, nil // Group=batch, Version=v1 + case batchv1.SchemeGroupVersion.WithResource("cronjobs"): + return &genericInformer{resource: resource.GroupResource(), informer: f.Batch().V1().CronJobs().Informer()}, nil case batchv1.SchemeGroupVersion.WithResource("jobs"): return &genericInformer{resource: resource.GroupResource(), informer: f.Batch().V1().Jobs().Informer()}, nil @@ -154,10 +156,6 @@ func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource case batchv1beta1.SchemeGroupVersion.WithResource("cronjobs"): return &genericInformer{resource: resource.GroupResource(), informer: f.Batch().V1beta1().CronJobs().Informer()}, nil - // Group=batch, Version=v2alpha1 - case v2alpha1.SchemeGroupVersion.WithResource("cronjobs"): - return &genericInformer{resource: resource.GroupResource(), informer: f.Batch().V2alpha1().CronJobs().Informer()}, nil - // Group=certificates.k8s.io, Version=v1 case certificatesv1.SchemeGroupVersion.WithResource("certificatesigningrequests"): return &genericInformer{resource: resource.GroupResource(), informer: f.Certificates().V1().CertificateSigningRequests().Informer()}, nil @@ -208,9 +206,9 @@ func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource case corev1.SchemeGroupVersion.WithResource("serviceaccounts"): return &genericInformer{resource: resource.GroupResource(), informer: f.Core().V1().ServiceAccounts().Informer()}, nil - // Group=discovery.k8s.io, Version=v1alpha1 - case v1alpha1.SchemeGroupVersion.WithResource("endpointslices"): - return &genericInformer{resource: resource.GroupResource(), informer: f.Discovery().V1alpha1().EndpointSlices().Informer()}, nil + // Group=discovery.k8s.io, Version=v1 + case discoveryv1.SchemeGroupVersion.WithResource("endpointslices"): + return &genericInformer{resource: resource.GroupResource(), informer: f.Discovery().V1().EndpointSlices().Informer()}, nil // Group=discovery.k8s.io, Version=v1beta1 case discoveryv1beta1.SchemeGroupVersion.WithResource("endpointslices"): @@ -239,9 +237,9 @@ func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource return &genericInformer{resource: resource.GroupResource(), informer: f.Extensions().V1beta1().ReplicaSets().Informer()}, nil // Group=flowcontrol.apiserver.k8s.io, Version=v1alpha1 - case flowcontrolv1alpha1.SchemeGroupVersion.WithResource("flowschemas"): + case v1alpha1.SchemeGroupVersion.WithResource("flowschemas"): return &genericInformer{resource: resource.GroupResource(), informer: f.Flowcontrol().V1alpha1().FlowSchemas().Informer()}, nil - case flowcontrolv1alpha1.SchemeGroupVersion.WithResource("prioritylevelconfigurations"): + case v1alpha1.SchemeGroupVersion.WithResource("prioritylevelconfigurations"): return &genericInformer{resource: resource.GroupResource(), informer: f.Flowcontrol().V1alpha1().PriorityLevelConfigurations().Informer()}, nil // Group=flowcontrol.apiserver.k8s.io, Version=v1beta1 @@ -280,6 +278,10 @@ func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource case nodev1beta1.SchemeGroupVersion.WithResource("runtimeclasses"): return &genericInformer{resource: resource.GroupResource(), informer: f.Node().V1beta1().RuntimeClasses().Informer()}, nil + // Group=policy, Version=v1 + case policyv1.SchemeGroupVersion.WithResource("poddisruptionbudgets"): + return &genericInformer{resource: resource.GroupResource(), informer: f.Policy().V1().PodDisruptionBudgets().Informer()}, nil + // Group=policy, Version=v1beta1 case policyv1beta1.SchemeGroupVersion.WithResource("poddisruptionbudgets"): return &genericInformer{resource: resource.GroupResource(), informer: f.Policy().V1beta1().PodDisruptionBudgets().Informer()}, nil @@ -349,6 +351,8 @@ func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource return &genericInformer{resource: resource.GroupResource(), informer: f.Storage().V1beta1().CSIDrivers().Informer()}, nil case storagev1beta1.SchemeGroupVersion.WithResource("csinodes"): return &genericInformer{resource: resource.GroupResource(), informer: f.Storage().V1beta1().CSINodes().Informer()}, nil + case storagev1beta1.SchemeGroupVersion.WithResource("csistoragecapacities"): + return &genericInformer{resource: resource.GroupResource(), informer: f.Storage().V1beta1().CSIStorageCapacities().Informer()}, nil case storagev1beta1.SchemeGroupVersion.WithResource("storageclasses"): return &genericInformer{resource: resource.GroupResource(), informer: f.Storage().V1beta1().StorageClasses().Informer()}, nil case storagev1beta1.SchemeGroupVersion.WithResource("volumeattachments"): diff --git a/vendor/k8s.io/client-go/informers/internalinterfaces/BUILD b/vendor/k8s.io/client-go/informers/internalinterfaces/BUILD deleted file mode 100644 index fb724889c007..000000000000 --- a/vendor/k8s.io/client-go/informers/internalinterfaces/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["factory_interfaces.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/internalinterfaces", - importpath = "k8s.io/client-go/informers/internalinterfaces", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/networking/BUILD b/vendor/k8s.io/client-go/informers/networking/BUILD deleted file mode 100644 index 5c4ba64d5674..000000000000 --- a/vendor/k8s.io/client-go/informers/networking/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["interface.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/networking", - importpath = "k8s.io/client-go/informers/networking", - deps = [ - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//staging/src/k8s.io/client-go/informers/networking/v1:go_default_library", - "//staging/src/k8s.io/client-go/informers/networking/v1beta1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/informers/networking/v1:all-srcs", - "//staging/src/k8s.io/client-go/informers/networking/v1beta1:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/networking/v1/BUILD b/vendor/k8s.io/client-go/informers/networking/v1/BUILD deleted file mode 100644 index 0ba3def572b1..000000000000 --- a/vendor/k8s.io/client-go/informers/networking/v1/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "ingress.go", - "ingressclass.go", - "interface.go", - "networkpolicy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/networking/v1", - importpath = "k8s.io/client-go/informers/networking/v1", - deps = [ - "//staging/src/k8s.io/api/networking/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/networking/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/networking/v1beta1/BUILD b/vendor/k8s.io/client-go/informers/networking/v1beta1/BUILD deleted file mode 100644 index 54249be55a5e..000000000000 --- a/vendor/k8s.io/client-go/informers/networking/v1beta1/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "ingress.go", - "ingressclass.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/networking/v1beta1", - importpath = "k8s.io/client-go/informers/networking/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/networking/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/networking/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/informers/node/BUILD b/vendor/k8s.io/client-go/informers/node/BUILD deleted file mode 100644 index b96e1d180adc..000000000000 --- a/vendor/k8s.io/client-go/informers/node/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["interface.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/node", - importpath = "k8s.io/client-go/informers/node", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//staging/src/k8s.io/client-go/informers/node/v1:go_default_library", - "//staging/src/k8s.io/client-go/informers/node/v1alpha1:go_default_library", - "//staging/src/k8s.io/client-go/informers/node/v1beta1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/informers/node/v1:all-srcs", - "//staging/src/k8s.io/client-go/informers/node/v1alpha1:all-srcs", - "//staging/src/k8s.io/client-go/informers/node/v1beta1:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/informers/node/v1/BUILD b/vendor/k8s.io/client-go/informers/node/v1/BUILD deleted file mode 100644 index c8bf2879c205..000000000000 --- a/vendor/k8s.io/client-go/informers/node/v1/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "interface.go", - "runtimeclass.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/node/v1", - importpath = "k8s.io/client-go/informers/node/v1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/node/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/node/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/informers/node/v1alpha1/BUILD b/vendor/k8s.io/client-go/informers/node/v1alpha1/BUILD deleted file mode 100644 index 1b924aa429ee..000000000000 --- a/vendor/k8s.io/client-go/informers/node/v1alpha1/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "interface.go", - "runtimeclass.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/node/v1alpha1", - importpath = "k8s.io/client-go/informers/node/v1alpha1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/node/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/node/v1alpha1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/informers/node/v1beta1/BUILD b/vendor/k8s.io/client-go/informers/node/v1beta1/BUILD deleted file mode 100644 index 754127aa4db9..000000000000 --- a/vendor/k8s.io/client-go/informers/node/v1beta1/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "interface.go", - "runtimeclass.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/node/v1beta1", - importpath = "k8s.io/client-go/informers/node/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/node/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/node/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/informers/policy/BUILD b/vendor/k8s.io/client-go/informers/policy/BUILD deleted file mode 100644 index 0e7dbd04f078..000000000000 --- a/vendor/k8s.io/client-go/informers/policy/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["interface.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/policy", - importpath = "k8s.io/client-go/informers/policy", - deps = [ - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//staging/src/k8s.io/client-go/informers/policy/v1beta1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/informers/policy/v1beta1:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/policy/interface.go b/vendor/k8s.io/client-go/informers/policy/interface.go index 1859fca821b7..889cb8152c96 100644 --- a/vendor/k8s.io/client-go/informers/policy/interface.go +++ b/vendor/k8s.io/client-go/informers/policy/interface.go @@ -20,11 +20,14 @@ package policy import ( internalinterfaces "k8s.io/client-go/informers/internalinterfaces" + v1 "k8s.io/client-go/informers/policy/v1" v1beta1 "k8s.io/client-go/informers/policy/v1beta1" ) // Interface provides access to each of this group's versions. type Interface interface { + // V1 provides access to shared informers for resources in V1. + V1() v1.Interface // V1beta1 provides access to shared informers for resources in V1beta1. V1beta1() v1beta1.Interface } @@ -40,6 +43,11 @@ func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakList return &group{factory: f, namespace: namespace, tweakListOptions: tweakListOptions} } +// V1 returns a new v1.Interface. +func (g *group) V1() v1.Interface { + return v1.New(g.factory, g.namespace, g.tweakListOptions) +} + // V1beta1 returns a new v1beta1.Interface. func (g *group) V1beta1() v1beta1.Interface { return v1beta1.New(g.factory, g.namespace, g.tweakListOptions) diff --git a/vendor/k8s.io/client-go/informers/policy/v1/interface.go b/vendor/k8s.io/client-go/informers/policy/v1/interface.go new file mode 100644 index 000000000000..2c42e1993c4a --- /dev/null +++ b/vendor/k8s.io/client-go/informers/policy/v1/interface.go @@ -0,0 +1,45 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by informer-gen. DO NOT EDIT. + +package v1 + +import ( + internalinterfaces "k8s.io/client-go/informers/internalinterfaces" +) + +// Interface provides access to all the informers in this group version. +type Interface interface { + // PodDisruptionBudgets returns a PodDisruptionBudgetInformer. + PodDisruptionBudgets() PodDisruptionBudgetInformer +} + +type version struct { + factory internalinterfaces.SharedInformerFactory + namespace string + tweakListOptions internalinterfaces.TweakListOptionsFunc +} + +// New returns a new Interface. +func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) Interface { + return &version{factory: f, namespace: namespace, tweakListOptions: tweakListOptions} +} + +// PodDisruptionBudgets returns a PodDisruptionBudgetInformer. +func (v *version) PodDisruptionBudgets() PodDisruptionBudgetInformer { + return &podDisruptionBudgetInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} +} diff --git a/vendor/k8s.io/client-go/informers/policy/v1/poddisruptionbudget.go b/vendor/k8s.io/client-go/informers/policy/v1/poddisruptionbudget.go new file mode 100644 index 000000000000..436598512af2 --- /dev/null +++ b/vendor/k8s.io/client-go/informers/policy/v1/poddisruptionbudget.go @@ -0,0 +1,90 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by informer-gen. DO NOT EDIT. + +package v1 + +import ( + "context" + time "time" + + policyv1 "k8s.io/api/policy/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + watch "k8s.io/apimachinery/pkg/watch" + internalinterfaces "k8s.io/client-go/informers/internalinterfaces" + kubernetes "k8s.io/client-go/kubernetes" + v1 "k8s.io/client-go/listers/policy/v1" + cache "k8s.io/client-go/tools/cache" +) + +// PodDisruptionBudgetInformer provides access to a shared informer and lister for +// PodDisruptionBudgets. +type PodDisruptionBudgetInformer interface { + Informer() cache.SharedIndexInformer + Lister() v1.PodDisruptionBudgetLister +} + +type podDisruptionBudgetInformer struct { + factory internalinterfaces.SharedInformerFactory + tweakListOptions internalinterfaces.TweakListOptionsFunc + namespace string +} + +// NewPodDisruptionBudgetInformer constructs a new informer for PodDisruptionBudget type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewPodDisruptionBudgetInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { + return NewFilteredPodDisruptionBudgetInformer(client, namespace, resyncPeriod, indexers, nil) +} + +// NewFilteredPodDisruptionBudgetInformer constructs a new informer for PodDisruptionBudget type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewFilteredPodDisruptionBudgetInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { + return cache.NewSharedIndexInformer( + &cache.ListWatch{ + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.PolicyV1().PodDisruptionBudgets(namespace).List(context.TODO(), options) + }, + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.PolicyV1().PodDisruptionBudgets(namespace).Watch(context.TODO(), options) + }, + }, + &policyv1.PodDisruptionBudget{}, + resyncPeriod, + indexers, + ) +} + +func (f *podDisruptionBudgetInformer) defaultInformer(client kubernetes.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { + return NewFilteredPodDisruptionBudgetInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions) +} + +func (f *podDisruptionBudgetInformer) Informer() cache.SharedIndexInformer { + return f.factory.InformerFor(&policyv1.PodDisruptionBudget{}, f.defaultInformer) +} + +func (f *podDisruptionBudgetInformer) Lister() v1.PodDisruptionBudgetLister { + return v1.NewPodDisruptionBudgetLister(f.Informer().GetIndexer()) +} diff --git a/vendor/k8s.io/client-go/informers/policy/v1beta1/BUILD b/vendor/k8s.io/client-go/informers/policy/v1beta1/BUILD deleted file mode 100644 index 8ebf954c24fd..000000000000 --- a/vendor/k8s.io/client-go/informers/policy/v1beta1/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "interface.go", - "poddisruptionbudget.go", - "podsecuritypolicy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/policy/v1beta1", - importpath = "k8s.io/client-go/informers/policy/v1beta1", - deps = [ - "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/rbac/BUILD b/vendor/k8s.io/client-go/informers/rbac/BUILD deleted file mode 100644 index a1f4c26d3078..000000000000 --- a/vendor/k8s.io/client-go/informers/rbac/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["interface.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/rbac", - importpath = "k8s.io/client-go/informers/rbac", - deps = [ - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//staging/src/k8s.io/client-go/informers/rbac/v1:go_default_library", - "//staging/src/k8s.io/client-go/informers/rbac/v1alpha1:go_default_library", - "//staging/src/k8s.io/client-go/informers/rbac/v1beta1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/informers/rbac/v1:all-srcs", - "//staging/src/k8s.io/client-go/informers/rbac/v1alpha1:all-srcs", - "//staging/src/k8s.io/client-go/informers/rbac/v1beta1:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/rbac/v1/BUILD b/vendor/k8s.io/client-go/informers/rbac/v1/BUILD deleted file mode 100644 index a40e459b6aaa..000000000000 --- a/vendor/k8s.io/client-go/informers/rbac/v1/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "clusterrole.go", - "clusterrolebinding.go", - "interface.go", - "role.go", - "rolebinding.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/rbac/v1", - importpath = "k8s.io/client-go/informers/rbac/v1", - deps = [ - "//staging/src/k8s.io/api/rbac/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/rbac/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/rbac/v1alpha1/BUILD b/vendor/k8s.io/client-go/informers/rbac/v1alpha1/BUILD deleted file mode 100644 index 85f76b472869..000000000000 --- a/vendor/k8s.io/client-go/informers/rbac/v1alpha1/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "clusterrole.go", - "clusterrolebinding.go", - "interface.go", - "role.go", - "rolebinding.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/rbac/v1alpha1", - importpath = "k8s.io/client-go/informers/rbac/v1alpha1", - deps = [ - "//staging/src/k8s.io/api/rbac/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/rbac/v1alpha1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/rbac/v1beta1/BUILD b/vendor/k8s.io/client-go/informers/rbac/v1beta1/BUILD deleted file mode 100644 index c1c47efb2be5..000000000000 --- a/vendor/k8s.io/client-go/informers/rbac/v1beta1/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "clusterrole.go", - "clusterrolebinding.go", - "interface.go", - "role.go", - "rolebinding.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/rbac/v1beta1", - importpath = "k8s.io/client-go/informers/rbac/v1beta1", - deps = [ - "//staging/src/k8s.io/api/rbac/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/rbac/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/scheduling/BUILD b/vendor/k8s.io/client-go/informers/scheduling/BUILD deleted file mode 100644 index 309a12a5da80..000000000000 --- a/vendor/k8s.io/client-go/informers/scheduling/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["interface.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/scheduling", - importpath = "k8s.io/client-go/informers/scheduling", - deps = [ - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//staging/src/k8s.io/client-go/informers/scheduling/v1:go_default_library", - "//staging/src/k8s.io/client-go/informers/scheduling/v1alpha1:go_default_library", - "//staging/src/k8s.io/client-go/informers/scheduling/v1beta1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/informers/scheduling/v1:all-srcs", - "//staging/src/k8s.io/client-go/informers/scheduling/v1alpha1:all-srcs", - "//staging/src/k8s.io/client-go/informers/scheduling/v1beta1:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/scheduling/v1/BUILD b/vendor/k8s.io/client-go/informers/scheduling/v1/BUILD deleted file mode 100644 index 3b34304af7a8..000000000000 --- a/vendor/k8s.io/client-go/informers/scheduling/v1/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "interface.go", - "priorityclass.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/scheduling/v1", - importpath = "k8s.io/client-go/informers/scheduling/v1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/scheduling/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/scheduling/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/informers/scheduling/v1alpha1/BUILD b/vendor/k8s.io/client-go/informers/scheduling/v1alpha1/BUILD deleted file mode 100644 index 163945b4b407..000000000000 --- a/vendor/k8s.io/client-go/informers/scheduling/v1alpha1/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "interface.go", - "priorityclass.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/scheduling/v1alpha1", - importpath = "k8s.io/client-go/informers/scheduling/v1alpha1", - deps = [ - "//staging/src/k8s.io/api/scheduling/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/scheduling/v1alpha1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/scheduling/v1beta1/BUILD b/vendor/k8s.io/client-go/informers/scheduling/v1beta1/BUILD deleted file mode 100644 index b6ffaa41a8a3..000000000000 --- a/vendor/k8s.io/client-go/informers/scheduling/v1beta1/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "interface.go", - "priorityclass.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/scheduling/v1beta1", - importpath = "k8s.io/client-go/informers/scheduling/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/scheduling/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/scheduling/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/informers/storage/BUILD b/vendor/k8s.io/client-go/informers/storage/BUILD deleted file mode 100644 index 4f6cacf03d41..000000000000 --- a/vendor/k8s.io/client-go/informers/storage/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["interface.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/storage", - importpath = "k8s.io/client-go/informers/storage", - deps = [ - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//staging/src/k8s.io/client-go/informers/storage/v1:go_default_library", - "//staging/src/k8s.io/client-go/informers/storage/v1alpha1:go_default_library", - "//staging/src/k8s.io/client-go/informers/storage/v1beta1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/informers/storage/v1:all-srcs", - "//staging/src/k8s.io/client-go/informers/storage/v1alpha1:all-srcs", - "//staging/src/k8s.io/client-go/informers/storage/v1beta1:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/storage/v1/BUILD b/vendor/k8s.io/client-go/informers/storage/v1/BUILD deleted file mode 100644 index bed1ac46101e..000000000000 --- a/vendor/k8s.io/client-go/informers/storage/v1/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "csidriver.go", - "csinode.go", - "interface.go", - "storageclass.go", - "volumeattachment.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/storage/v1", - importpath = "k8s.io/client-go/informers/storage/v1", - deps = [ - "//staging/src/k8s.io/api/storage/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/storage/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/storage/v1alpha1/BUILD b/vendor/k8s.io/client-go/informers/storage/v1alpha1/BUILD deleted file mode 100644 index ddefad6ba85d..000000000000 --- a/vendor/k8s.io/client-go/informers/storage/v1alpha1/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "csistoragecapacity.go", - "interface.go", - "volumeattachment.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/storage/v1alpha1", - importpath = "k8s.io/client-go/informers/storage/v1alpha1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/storage/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/storage/v1alpha1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/informers/storage/v1beta1/BUILD b/vendor/k8s.io/client-go/informers/storage/v1beta1/BUILD deleted file mode 100644 index 3a7f30cec206..000000000000 --- a/vendor/k8s.io/client-go/informers/storage/v1beta1/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "csidriver.go", - "csinode.go", - "interface.go", - "storageclass.go", - "volumeattachment.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/storage/v1beta1", - importpath = "k8s.io/client-go/informers/storage/v1beta1", - deps = [ - "//staging/src/k8s.io/api/storage/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/storage/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/storage/v1beta1/csistoragecapacity.go b/vendor/k8s.io/client-go/informers/storage/v1beta1/csistoragecapacity.go new file mode 100644 index 000000000000..8f0cc4668793 --- /dev/null +++ b/vendor/k8s.io/client-go/informers/storage/v1beta1/csistoragecapacity.go @@ -0,0 +1,90 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by informer-gen. DO NOT EDIT. + +package v1beta1 + +import ( + "context" + time "time" + + storagev1beta1 "k8s.io/api/storage/v1beta1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + watch "k8s.io/apimachinery/pkg/watch" + internalinterfaces "k8s.io/client-go/informers/internalinterfaces" + kubernetes "k8s.io/client-go/kubernetes" + v1beta1 "k8s.io/client-go/listers/storage/v1beta1" + cache "k8s.io/client-go/tools/cache" +) + +// CSIStorageCapacityInformer provides access to a shared informer and lister for +// CSIStorageCapacities. +type CSIStorageCapacityInformer interface { + Informer() cache.SharedIndexInformer + Lister() v1beta1.CSIStorageCapacityLister +} + +type cSIStorageCapacityInformer struct { + factory internalinterfaces.SharedInformerFactory + tweakListOptions internalinterfaces.TweakListOptionsFunc + namespace string +} + +// NewCSIStorageCapacityInformer constructs a new informer for CSIStorageCapacity type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewCSIStorageCapacityInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { + return NewFilteredCSIStorageCapacityInformer(client, namespace, resyncPeriod, indexers, nil) +} + +// NewFilteredCSIStorageCapacityInformer constructs a new informer for CSIStorageCapacity type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewFilteredCSIStorageCapacityInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { + return cache.NewSharedIndexInformer( + &cache.ListWatch{ + ListFunc: func(options v1.ListOptions) (runtime.Object, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.StorageV1beta1().CSIStorageCapacities(namespace).List(context.TODO(), options) + }, + WatchFunc: func(options v1.ListOptions) (watch.Interface, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.StorageV1beta1().CSIStorageCapacities(namespace).Watch(context.TODO(), options) + }, + }, + &storagev1beta1.CSIStorageCapacity{}, + resyncPeriod, + indexers, + ) +} + +func (f *cSIStorageCapacityInformer) defaultInformer(client kubernetes.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { + return NewFilteredCSIStorageCapacityInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions) +} + +func (f *cSIStorageCapacityInformer) Informer() cache.SharedIndexInformer { + return f.factory.InformerFor(&storagev1beta1.CSIStorageCapacity{}, f.defaultInformer) +} + +func (f *cSIStorageCapacityInformer) Lister() v1beta1.CSIStorageCapacityLister { + return v1beta1.NewCSIStorageCapacityLister(f.Informer().GetIndexer()) +} diff --git a/vendor/k8s.io/client-go/informers/storage/v1beta1/interface.go b/vendor/k8s.io/client-go/informers/storage/v1beta1/interface.go index af4ee2f74a1a..77b77c08ee2e 100644 --- a/vendor/k8s.io/client-go/informers/storage/v1beta1/interface.go +++ b/vendor/k8s.io/client-go/informers/storage/v1beta1/interface.go @@ -28,6 +28,8 @@ type Interface interface { CSIDrivers() CSIDriverInformer // CSINodes returns a CSINodeInformer. CSINodes() CSINodeInformer + // CSIStorageCapacities returns a CSIStorageCapacityInformer. + CSIStorageCapacities() CSIStorageCapacityInformer // StorageClasses returns a StorageClassInformer. StorageClasses() StorageClassInformer // VolumeAttachments returns a VolumeAttachmentInformer. @@ -55,6 +57,11 @@ func (v *version) CSINodes() CSINodeInformer { return &cSINodeInformer{factory: v.factory, tweakListOptions: v.tweakListOptions} } +// CSIStorageCapacities returns a CSIStorageCapacityInformer. +func (v *version) CSIStorageCapacities() CSIStorageCapacityInformer { + return &cSIStorageCapacityInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} +} + // StorageClasses returns a StorageClassInformer. func (v *version) StorageClasses() StorageClassInformer { return &storageClassInformer{factory: v.factory, tweakListOptions: v.tweakListOptions} diff --git a/vendor/k8s.io/client-go/kubernetes/BUILD b/vendor/k8s.io/client-go/kubernetes/BUILD deleted file mode 100644 index 193aadbba752..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/BUILD +++ /dev/null @@ -1,122 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "clientset.go", - "doc.go", - "import.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes", - importpath = "k8s.io/client-go/kubernetes", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/client-go/discovery:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/admissionregistration/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/apiserverinternal/v1alpha1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/apps/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/apps/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/apps/v1beta2:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/authentication/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/authentication/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/authorization/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/authorization/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/autoscaling/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/batch/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/batch/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/batch/v2alpha1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/certificates/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/certificates/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/coordination/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/coordination/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/discovery/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/events/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/events/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/extensions/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/flowcontrol/v1alpha1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/networking/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/networking/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/node/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/node/v1alpha1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/node/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/scheduling/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/storage/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/storage/v1alpha1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/storage/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/fake:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/scheme:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/admissionregistration/v1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/apiserverinternal/v1alpha1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/apps/v1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/apps/v1beta1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/apps/v1beta2:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/authentication/v1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/authentication/v1beta1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/authorization/v1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/authorization/v1beta1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/autoscaling/v1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/batch/v1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/batch/v1beta1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/batch/v2alpha1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/certificates/v1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/certificates/v1beta1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/coordination/v1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/coordination/v1beta1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/discovery/v1beta1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/events/v1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/events/v1beta1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/extensions/v1beta1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/flowcontrol/v1alpha1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/networking/v1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/networking/v1beta1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/node/v1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/node/v1alpha1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/node/v1beta1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/policy/v1beta1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1beta1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/scheduling/v1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/storage/v1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/storage/v1alpha1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/storage/v1beta1:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/clientset.go b/vendor/k8s.io/client-go/kubernetes/clientset.go index f0d54b6a1855..55a236fac5d1 100644 --- a/vendor/k8s.io/client-go/kubernetes/clientset.go +++ b/vendor/k8s.io/client-go/kubernetes/clientset.go @@ -37,13 +37,12 @@ import ( autoscalingv2beta2 "k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2" batchv1 "k8s.io/client-go/kubernetes/typed/batch/v1" batchv1beta1 "k8s.io/client-go/kubernetes/typed/batch/v1beta1" - batchv2alpha1 "k8s.io/client-go/kubernetes/typed/batch/v2alpha1" certificatesv1 "k8s.io/client-go/kubernetes/typed/certificates/v1" certificatesv1beta1 "k8s.io/client-go/kubernetes/typed/certificates/v1beta1" coordinationv1 "k8s.io/client-go/kubernetes/typed/coordination/v1" coordinationv1beta1 "k8s.io/client-go/kubernetes/typed/coordination/v1beta1" corev1 "k8s.io/client-go/kubernetes/typed/core/v1" - discoveryv1alpha1 "k8s.io/client-go/kubernetes/typed/discovery/v1alpha1" + discoveryv1 "k8s.io/client-go/kubernetes/typed/discovery/v1" discoveryv1beta1 "k8s.io/client-go/kubernetes/typed/discovery/v1beta1" eventsv1 "k8s.io/client-go/kubernetes/typed/events/v1" eventsv1beta1 "k8s.io/client-go/kubernetes/typed/events/v1beta1" @@ -55,6 +54,7 @@ import ( nodev1 "k8s.io/client-go/kubernetes/typed/node/v1" nodev1alpha1 "k8s.io/client-go/kubernetes/typed/node/v1alpha1" nodev1beta1 "k8s.io/client-go/kubernetes/typed/node/v1beta1" + policyv1 "k8s.io/client-go/kubernetes/typed/policy/v1" policyv1beta1 "k8s.io/client-go/kubernetes/typed/policy/v1beta1" rbacv1 "k8s.io/client-go/kubernetes/typed/rbac/v1" rbacv1alpha1 "k8s.io/client-go/kubernetes/typed/rbac/v1alpha1" @@ -86,13 +86,12 @@ type Interface interface { AutoscalingV2beta2() autoscalingv2beta2.AutoscalingV2beta2Interface BatchV1() batchv1.BatchV1Interface BatchV1beta1() batchv1beta1.BatchV1beta1Interface - BatchV2alpha1() batchv2alpha1.BatchV2alpha1Interface CertificatesV1() certificatesv1.CertificatesV1Interface CertificatesV1beta1() certificatesv1beta1.CertificatesV1beta1Interface CoordinationV1beta1() coordinationv1beta1.CoordinationV1beta1Interface CoordinationV1() coordinationv1.CoordinationV1Interface CoreV1() corev1.CoreV1Interface - DiscoveryV1alpha1() discoveryv1alpha1.DiscoveryV1alpha1Interface + DiscoveryV1() discoveryv1.DiscoveryV1Interface DiscoveryV1beta1() discoveryv1beta1.DiscoveryV1beta1Interface EventsV1() eventsv1.EventsV1Interface EventsV1beta1() eventsv1beta1.EventsV1beta1Interface @@ -104,6 +103,7 @@ type Interface interface { NodeV1() nodev1.NodeV1Interface NodeV1alpha1() nodev1alpha1.NodeV1alpha1Interface NodeV1beta1() nodev1beta1.NodeV1beta1Interface + PolicyV1() policyv1.PolicyV1Interface PolicyV1beta1() policyv1beta1.PolicyV1beta1Interface RbacV1() rbacv1.RbacV1Interface RbacV1beta1() rbacv1beta1.RbacV1beta1Interface @@ -135,13 +135,12 @@ type Clientset struct { autoscalingV2beta2 *autoscalingv2beta2.AutoscalingV2beta2Client batchV1 *batchv1.BatchV1Client batchV1beta1 *batchv1beta1.BatchV1beta1Client - batchV2alpha1 *batchv2alpha1.BatchV2alpha1Client certificatesV1 *certificatesv1.CertificatesV1Client certificatesV1beta1 *certificatesv1beta1.CertificatesV1beta1Client coordinationV1beta1 *coordinationv1beta1.CoordinationV1beta1Client coordinationV1 *coordinationv1.CoordinationV1Client coreV1 *corev1.CoreV1Client - discoveryV1alpha1 *discoveryv1alpha1.DiscoveryV1alpha1Client + discoveryV1 *discoveryv1.DiscoveryV1Client discoveryV1beta1 *discoveryv1beta1.DiscoveryV1beta1Client eventsV1 *eventsv1.EventsV1Client eventsV1beta1 *eventsv1beta1.EventsV1beta1Client @@ -153,6 +152,7 @@ type Clientset struct { nodeV1 *nodev1.NodeV1Client nodeV1alpha1 *nodev1alpha1.NodeV1alpha1Client nodeV1beta1 *nodev1beta1.NodeV1beta1Client + policyV1 *policyv1.PolicyV1Client policyV1beta1 *policyv1beta1.PolicyV1beta1Client rbacV1 *rbacv1.RbacV1Client rbacV1beta1 *rbacv1beta1.RbacV1beta1Client @@ -240,11 +240,6 @@ func (c *Clientset) BatchV1beta1() batchv1beta1.BatchV1beta1Interface { return c.batchV1beta1 } -// BatchV2alpha1 retrieves the BatchV2alpha1Client -func (c *Clientset) BatchV2alpha1() batchv2alpha1.BatchV2alpha1Interface { - return c.batchV2alpha1 -} - // CertificatesV1 retrieves the CertificatesV1Client func (c *Clientset) CertificatesV1() certificatesv1.CertificatesV1Interface { return c.certificatesV1 @@ -270,9 +265,9 @@ func (c *Clientset) CoreV1() corev1.CoreV1Interface { return c.coreV1 } -// DiscoveryV1alpha1 retrieves the DiscoveryV1alpha1Client -func (c *Clientset) DiscoveryV1alpha1() discoveryv1alpha1.DiscoveryV1alpha1Interface { - return c.discoveryV1alpha1 +// DiscoveryV1 retrieves the DiscoveryV1Client +func (c *Clientset) DiscoveryV1() discoveryv1.DiscoveryV1Interface { + return c.discoveryV1 } // DiscoveryV1beta1 retrieves the DiscoveryV1beta1Client @@ -330,6 +325,11 @@ func (c *Clientset) NodeV1beta1() nodev1beta1.NodeV1beta1Interface { return c.nodeV1beta1 } +// PolicyV1 retrieves the PolicyV1Client +func (c *Clientset) PolicyV1() policyv1.PolicyV1Interface { + return c.policyV1 +} + // PolicyV1beta1 retrieves the PolicyV1beta1Client func (c *Clientset) PolicyV1beta1() policyv1beta1.PolicyV1beta1Interface { return c.policyV1beta1 @@ -461,10 +461,6 @@ func NewForConfig(c *rest.Config) (*Clientset, error) { if err != nil { return nil, err } - cs.batchV2alpha1, err = batchv2alpha1.NewForConfig(&configShallowCopy) - if err != nil { - return nil, err - } cs.certificatesV1, err = certificatesv1.NewForConfig(&configShallowCopy) if err != nil { return nil, err @@ -485,7 +481,7 @@ func NewForConfig(c *rest.Config) (*Clientset, error) { if err != nil { return nil, err } - cs.discoveryV1alpha1, err = discoveryv1alpha1.NewForConfig(&configShallowCopy) + cs.discoveryV1, err = discoveryv1.NewForConfig(&configShallowCopy) if err != nil { return nil, err } @@ -533,6 +529,10 @@ func NewForConfig(c *rest.Config) (*Clientset, error) { if err != nil { return nil, err } + cs.policyV1, err = policyv1.NewForConfig(&configShallowCopy) + if err != nil { + return nil, err + } cs.policyV1beta1, err = policyv1beta1.NewForConfig(&configShallowCopy) if err != nil { return nil, err @@ -600,13 +600,12 @@ func NewForConfigOrDie(c *rest.Config) *Clientset { cs.autoscalingV2beta2 = autoscalingv2beta2.NewForConfigOrDie(c) cs.batchV1 = batchv1.NewForConfigOrDie(c) cs.batchV1beta1 = batchv1beta1.NewForConfigOrDie(c) - cs.batchV2alpha1 = batchv2alpha1.NewForConfigOrDie(c) cs.certificatesV1 = certificatesv1.NewForConfigOrDie(c) cs.certificatesV1beta1 = certificatesv1beta1.NewForConfigOrDie(c) cs.coordinationV1beta1 = coordinationv1beta1.NewForConfigOrDie(c) cs.coordinationV1 = coordinationv1.NewForConfigOrDie(c) cs.coreV1 = corev1.NewForConfigOrDie(c) - cs.discoveryV1alpha1 = discoveryv1alpha1.NewForConfigOrDie(c) + cs.discoveryV1 = discoveryv1.NewForConfigOrDie(c) cs.discoveryV1beta1 = discoveryv1beta1.NewForConfigOrDie(c) cs.eventsV1 = eventsv1.NewForConfigOrDie(c) cs.eventsV1beta1 = eventsv1beta1.NewForConfigOrDie(c) @@ -618,6 +617,7 @@ func NewForConfigOrDie(c *rest.Config) *Clientset { cs.nodeV1 = nodev1.NewForConfigOrDie(c) cs.nodeV1alpha1 = nodev1alpha1.NewForConfigOrDie(c) cs.nodeV1beta1 = nodev1beta1.NewForConfigOrDie(c) + cs.policyV1 = policyv1.NewForConfigOrDie(c) cs.policyV1beta1 = policyv1beta1.NewForConfigOrDie(c) cs.rbacV1 = rbacv1.NewForConfigOrDie(c) cs.rbacV1beta1 = rbacv1beta1.NewForConfigOrDie(c) @@ -651,13 +651,12 @@ func New(c rest.Interface) *Clientset { cs.autoscalingV2beta2 = autoscalingv2beta2.New(c) cs.batchV1 = batchv1.New(c) cs.batchV1beta1 = batchv1beta1.New(c) - cs.batchV2alpha1 = batchv2alpha1.New(c) cs.certificatesV1 = certificatesv1.New(c) cs.certificatesV1beta1 = certificatesv1beta1.New(c) cs.coordinationV1beta1 = coordinationv1beta1.New(c) cs.coordinationV1 = coordinationv1.New(c) cs.coreV1 = corev1.New(c) - cs.discoveryV1alpha1 = discoveryv1alpha1.New(c) + cs.discoveryV1 = discoveryv1.New(c) cs.discoveryV1beta1 = discoveryv1beta1.New(c) cs.eventsV1 = eventsv1.New(c) cs.eventsV1beta1 = eventsv1beta1.New(c) @@ -669,6 +668,7 @@ func New(c rest.Interface) *Clientset { cs.nodeV1 = nodev1.New(c) cs.nodeV1alpha1 = nodev1alpha1.New(c) cs.nodeV1beta1 = nodev1beta1.New(c) + cs.policyV1 = policyv1.New(c) cs.policyV1beta1 = policyv1beta1.New(c) cs.rbacV1 = rbacv1.New(c) cs.rbacV1beta1 = rbacv1beta1.New(c) diff --git a/vendor/k8s.io/client-go/kubernetes/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/fake/BUILD deleted file mode 100644 index 67d958ce5d0c..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/fake/BUILD +++ /dev/null @@ -1,168 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "clientset_generated.go", - "doc.go", - "register.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/fake", - importpath = "k8s.io/client-go/kubernetes/fake", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/admissionregistration/v1:go_default_library", - "//staging/src/k8s.io/api/admissionregistration/v1beta1:go_default_library", - "//staging/src/k8s.io/api/apiserverinternal/v1alpha1:go_default_library", - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/apps/v1beta1:go_default_library", - "//staging/src/k8s.io/api/apps/v1beta2:go_default_library", - "//staging/src/k8s.io/api/authentication/v1:go_default_library", - "//staging/src/k8s.io/api/authentication/v1beta1:go_default_library", - "//staging/src/k8s.io/api/authorization/v1:go_default_library", - "//staging/src/k8s.io/api/authorization/v1beta1:go_default_library", - "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", - "//staging/src/k8s.io/api/autoscaling/v2beta1:go_default_library", - "//staging/src/k8s.io/api/autoscaling/v2beta2:go_default_library", - "//staging/src/k8s.io/api/batch/v1:go_default_library", - "//staging/src/k8s.io/api/batch/v1beta1:go_default_library", - "//staging/src/k8s.io/api/batch/v2alpha1:go_default_library", - "//staging/src/k8s.io/api/certificates/v1:go_default_library", - "//staging/src/k8s.io/api/certificates/v1beta1:go_default_library", - "//staging/src/k8s.io/api/coordination/v1:go_default_library", - "//staging/src/k8s.io/api/coordination/v1beta1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/discovery/v1alpha1:go_default_library", - "//staging/src/k8s.io/api/discovery/v1beta1:go_default_library", - "//staging/src/k8s.io/api/events/v1:go_default_library", - "//staging/src/k8s.io/api/events/v1beta1:go_default_library", - "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", - "//staging/src/k8s.io/api/flowcontrol/v1alpha1:go_default_library", - "//staging/src/k8s.io/api/flowcontrol/v1beta1:go_default_library", - "//staging/src/k8s.io/api/networking/v1:go_default_library", - "//staging/src/k8s.io/api/networking/v1beta1:go_default_library", - "//staging/src/k8s.io/api/node/v1:go_default_library", - "//staging/src/k8s.io/api/node/v1alpha1:go_default_library", - "//staging/src/k8s.io/api/node/v1beta1:go_default_library", - "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/api/rbac/v1:go_default_library", - "//staging/src/k8s.io/api/rbac/v1alpha1:go_default_library", - "//staging/src/k8s.io/api/rbac/v1beta1:go_default_library", - "//staging/src/k8s.io/api/scheduling/v1:go_default_library", - "//staging/src/k8s.io/api/scheduling/v1alpha1:go_default_library", - "//staging/src/k8s.io/api/scheduling/v1beta1:go_default_library", - "//staging/src/k8s.io/api/storage/v1:go_default_library", - "//staging/src/k8s.io/api/storage/v1alpha1:go_default_library", - "//staging/src/k8s.io/api/storage/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/discovery:go_default_library", - "//staging/src/k8s.io/client-go/discovery/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/admissionregistration/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/admissionregistration/v1/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/apiserverinternal/v1alpha1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/apiserverinternal/v1alpha1/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/apps/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/apps/v1/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/apps/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/apps/v1beta2:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/authentication/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/authentication/v1/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/authentication/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/authorization/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/authorization/v1/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/authorization/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/autoscaling/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/autoscaling/v1/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/batch/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/batch/v1/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/batch/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/batch/v1beta1/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/batch/v2alpha1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/certificates/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/certificates/v1/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/certificates/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/coordination/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/coordination/v1/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/coordination/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/coordination/v1beta1/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/discovery/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/discovery/v1beta1/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/events/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/events/v1/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/events/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/events/v1beta1/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/extensions/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/flowcontrol/v1alpha1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/flowcontrol/v1alpha1/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta1/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/networking/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/networking/v1/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/networking/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/networking/v1beta1/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/node/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/node/v1/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/node/v1alpha1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/node/v1alpha1/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/node/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/node/v1beta1/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/scheduling/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/scheduling/v1/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/storage/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/storage/v1/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/storage/v1alpha1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/storage/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/fake/clientset_generated.go b/vendor/k8s.io/client-go/kubernetes/fake/clientset_generated.go index 7293844ca54a..c09d8999f828 100644 --- a/vendor/k8s.io/client-go/kubernetes/fake/clientset_generated.go +++ b/vendor/k8s.io/client-go/kubernetes/fake/clientset_generated.go @@ -54,8 +54,6 @@ import ( fakebatchv1 "k8s.io/client-go/kubernetes/typed/batch/v1/fake" batchv1beta1 "k8s.io/client-go/kubernetes/typed/batch/v1beta1" fakebatchv1beta1 "k8s.io/client-go/kubernetes/typed/batch/v1beta1/fake" - batchv2alpha1 "k8s.io/client-go/kubernetes/typed/batch/v2alpha1" - fakebatchv2alpha1 "k8s.io/client-go/kubernetes/typed/batch/v2alpha1/fake" certificatesv1 "k8s.io/client-go/kubernetes/typed/certificates/v1" fakecertificatesv1 "k8s.io/client-go/kubernetes/typed/certificates/v1/fake" certificatesv1beta1 "k8s.io/client-go/kubernetes/typed/certificates/v1beta1" @@ -66,8 +64,8 @@ import ( fakecoordinationv1beta1 "k8s.io/client-go/kubernetes/typed/coordination/v1beta1/fake" corev1 "k8s.io/client-go/kubernetes/typed/core/v1" fakecorev1 "k8s.io/client-go/kubernetes/typed/core/v1/fake" - discoveryv1alpha1 "k8s.io/client-go/kubernetes/typed/discovery/v1alpha1" - fakediscoveryv1alpha1 "k8s.io/client-go/kubernetes/typed/discovery/v1alpha1/fake" + discoveryv1 "k8s.io/client-go/kubernetes/typed/discovery/v1" + fakediscoveryv1 "k8s.io/client-go/kubernetes/typed/discovery/v1/fake" discoveryv1beta1 "k8s.io/client-go/kubernetes/typed/discovery/v1beta1" fakediscoveryv1beta1 "k8s.io/client-go/kubernetes/typed/discovery/v1beta1/fake" eventsv1 "k8s.io/client-go/kubernetes/typed/events/v1" @@ -90,6 +88,8 @@ import ( fakenodev1alpha1 "k8s.io/client-go/kubernetes/typed/node/v1alpha1/fake" nodev1beta1 "k8s.io/client-go/kubernetes/typed/node/v1beta1" fakenodev1beta1 "k8s.io/client-go/kubernetes/typed/node/v1beta1/fake" + policyv1 "k8s.io/client-go/kubernetes/typed/policy/v1" + fakepolicyv1 "k8s.io/client-go/kubernetes/typed/policy/v1/fake" policyv1beta1 "k8s.io/client-go/kubernetes/typed/policy/v1beta1" fakepolicyv1beta1 "k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake" rbacv1 "k8s.io/client-go/kubernetes/typed/rbac/v1" @@ -235,11 +235,6 @@ func (c *Clientset) BatchV1beta1() batchv1beta1.BatchV1beta1Interface { return &fakebatchv1beta1.FakeBatchV1beta1{Fake: &c.Fake} } -// BatchV2alpha1 retrieves the BatchV2alpha1Client -func (c *Clientset) BatchV2alpha1() batchv2alpha1.BatchV2alpha1Interface { - return &fakebatchv2alpha1.FakeBatchV2alpha1{Fake: &c.Fake} -} - // CertificatesV1 retrieves the CertificatesV1Client func (c *Clientset) CertificatesV1() certificatesv1.CertificatesV1Interface { return &fakecertificatesv1.FakeCertificatesV1{Fake: &c.Fake} @@ -265,9 +260,9 @@ func (c *Clientset) CoreV1() corev1.CoreV1Interface { return &fakecorev1.FakeCoreV1{Fake: &c.Fake} } -// DiscoveryV1alpha1 retrieves the DiscoveryV1alpha1Client -func (c *Clientset) DiscoveryV1alpha1() discoveryv1alpha1.DiscoveryV1alpha1Interface { - return &fakediscoveryv1alpha1.FakeDiscoveryV1alpha1{Fake: &c.Fake} +// DiscoveryV1 retrieves the DiscoveryV1Client +func (c *Clientset) DiscoveryV1() discoveryv1.DiscoveryV1Interface { + return &fakediscoveryv1.FakeDiscoveryV1{Fake: &c.Fake} } // DiscoveryV1beta1 retrieves the DiscoveryV1beta1Client @@ -325,6 +320,11 @@ func (c *Clientset) NodeV1beta1() nodev1beta1.NodeV1beta1Interface { return &fakenodev1beta1.FakeNodeV1beta1{Fake: &c.Fake} } +// PolicyV1 retrieves the PolicyV1Client +func (c *Clientset) PolicyV1() policyv1.PolicyV1Interface { + return &fakepolicyv1.FakePolicyV1{Fake: &c.Fake} +} + // PolicyV1beta1 retrieves the PolicyV1beta1Client func (c *Clientset) PolicyV1beta1() policyv1beta1.PolicyV1beta1Interface { return &fakepolicyv1beta1.FakePolicyV1beta1{Fake: &c.Fake} diff --git a/vendor/k8s.io/client-go/kubernetes/fake/register.go b/vendor/k8s.io/client-go/kubernetes/fake/register.go index 0e8ab29f5f6a..789d6428fe52 100644 --- a/vendor/k8s.io/client-go/kubernetes/fake/register.go +++ b/vendor/k8s.io/client-go/kubernetes/fake/register.go @@ -34,13 +34,12 @@ import ( autoscalingv2beta2 "k8s.io/api/autoscaling/v2beta2" batchv1 "k8s.io/api/batch/v1" batchv1beta1 "k8s.io/api/batch/v1beta1" - batchv2alpha1 "k8s.io/api/batch/v2alpha1" certificatesv1 "k8s.io/api/certificates/v1" certificatesv1beta1 "k8s.io/api/certificates/v1beta1" coordinationv1 "k8s.io/api/coordination/v1" coordinationv1beta1 "k8s.io/api/coordination/v1beta1" corev1 "k8s.io/api/core/v1" - discoveryv1alpha1 "k8s.io/api/discovery/v1alpha1" + discoveryv1 "k8s.io/api/discovery/v1" discoveryv1beta1 "k8s.io/api/discovery/v1beta1" eventsv1 "k8s.io/api/events/v1" eventsv1beta1 "k8s.io/api/events/v1beta1" @@ -52,6 +51,7 @@ import ( nodev1 "k8s.io/api/node/v1" nodev1alpha1 "k8s.io/api/node/v1alpha1" nodev1beta1 "k8s.io/api/node/v1beta1" + policyv1 "k8s.io/api/policy/v1" policyv1beta1 "k8s.io/api/policy/v1beta1" rbacv1 "k8s.io/api/rbac/v1" rbacv1alpha1 "k8s.io/api/rbac/v1alpha1" @@ -88,13 +88,12 @@ var localSchemeBuilder = runtime.SchemeBuilder{ autoscalingv2beta2.AddToScheme, batchv1.AddToScheme, batchv1beta1.AddToScheme, - batchv2alpha1.AddToScheme, certificatesv1.AddToScheme, certificatesv1beta1.AddToScheme, coordinationv1beta1.AddToScheme, coordinationv1.AddToScheme, corev1.AddToScheme, - discoveryv1alpha1.AddToScheme, + discoveryv1.AddToScheme, discoveryv1beta1.AddToScheme, eventsv1.AddToScheme, eventsv1beta1.AddToScheme, @@ -106,6 +105,7 @@ var localSchemeBuilder = runtime.SchemeBuilder{ nodev1.AddToScheme, nodev1alpha1.AddToScheme, nodev1beta1.AddToScheme, + policyv1.AddToScheme, policyv1beta1.AddToScheme, rbacv1.AddToScheme, rbacv1beta1.AddToScheme, diff --git a/vendor/k8s.io/client-go/kubernetes/scheme/BUILD b/vendor/k8s.io/client-go/kubernetes/scheme/BUILD deleted file mode 100644 index 673795c88523..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/scheme/BUILD +++ /dev/null @@ -1,76 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/scheme", - importpath = "k8s.io/client-go/kubernetes/scheme", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/admissionregistration/v1:go_default_library", - "//staging/src/k8s.io/api/admissionregistration/v1beta1:go_default_library", - "//staging/src/k8s.io/api/apiserverinternal/v1alpha1:go_default_library", - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/apps/v1beta1:go_default_library", - "//staging/src/k8s.io/api/apps/v1beta2:go_default_library", - "//staging/src/k8s.io/api/authentication/v1:go_default_library", - "//staging/src/k8s.io/api/authentication/v1beta1:go_default_library", - "//staging/src/k8s.io/api/authorization/v1:go_default_library", - "//staging/src/k8s.io/api/authorization/v1beta1:go_default_library", - "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", - "//staging/src/k8s.io/api/autoscaling/v2beta1:go_default_library", - "//staging/src/k8s.io/api/autoscaling/v2beta2:go_default_library", - "//staging/src/k8s.io/api/batch/v1:go_default_library", - "//staging/src/k8s.io/api/batch/v1beta1:go_default_library", - "//staging/src/k8s.io/api/batch/v2alpha1:go_default_library", - "//staging/src/k8s.io/api/certificates/v1:go_default_library", - "//staging/src/k8s.io/api/certificates/v1beta1:go_default_library", - "//staging/src/k8s.io/api/coordination/v1:go_default_library", - "//staging/src/k8s.io/api/coordination/v1beta1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/discovery/v1alpha1:go_default_library", - "//staging/src/k8s.io/api/discovery/v1beta1:go_default_library", - "//staging/src/k8s.io/api/events/v1:go_default_library", - "//staging/src/k8s.io/api/events/v1beta1:go_default_library", - "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", - "//staging/src/k8s.io/api/flowcontrol/v1alpha1:go_default_library", - "//staging/src/k8s.io/api/flowcontrol/v1beta1:go_default_library", - "//staging/src/k8s.io/api/networking/v1:go_default_library", - "//staging/src/k8s.io/api/networking/v1beta1:go_default_library", - "//staging/src/k8s.io/api/node/v1:go_default_library", - "//staging/src/k8s.io/api/node/v1alpha1:go_default_library", - "//staging/src/k8s.io/api/node/v1beta1:go_default_library", - "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/api/rbac/v1:go_default_library", - "//staging/src/k8s.io/api/rbac/v1alpha1:go_default_library", - "//staging/src/k8s.io/api/rbac/v1beta1:go_default_library", - "//staging/src/k8s.io/api/scheduling/v1:go_default_library", - "//staging/src/k8s.io/api/scheduling/v1alpha1:go_default_library", - "//staging/src/k8s.io/api/scheduling/v1beta1:go_default_library", - "//staging/src/k8s.io/api/storage/v1:go_default_library", - "//staging/src/k8s.io/api/storage/v1alpha1:go_default_library", - "//staging/src/k8s.io/api/storage/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/scheme/register.go b/vendor/k8s.io/client-go/kubernetes/scheme/register.go index 5601e20dd5d3..a46fb296291d 100644 --- a/vendor/k8s.io/client-go/kubernetes/scheme/register.go +++ b/vendor/k8s.io/client-go/kubernetes/scheme/register.go @@ -34,13 +34,12 @@ import ( autoscalingv2beta2 "k8s.io/api/autoscaling/v2beta2" batchv1 "k8s.io/api/batch/v1" batchv1beta1 "k8s.io/api/batch/v1beta1" - batchv2alpha1 "k8s.io/api/batch/v2alpha1" certificatesv1 "k8s.io/api/certificates/v1" certificatesv1beta1 "k8s.io/api/certificates/v1beta1" coordinationv1 "k8s.io/api/coordination/v1" coordinationv1beta1 "k8s.io/api/coordination/v1beta1" corev1 "k8s.io/api/core/v1" - discoveryv1alpha1 "k8s.io/api/discovery/v1alpha1" + discoveryv1 "k8s.io/api/discovery/v1" discoveryv1beta1 "k8s.io/api/discovery/v1beta1" eventsv1 "k8s.io/api/events/v1" eventsv1beta1 "k8s.io/api/events/v1beta1" @@ -52,6 +51,7 @@ import ( nodev1 "k8s.io/api/node/v1" nodev1alpha1 "k8s.io/api/node/v1alpha1" nodev1beta1 "k8s.io/api/node/v1beta1" + policyv1 "k8s.io/api/policy/v1" policyv1beta1 "k8s.io/api/policy/v1beta1" rbacv1 "k8s.io/api/rbac/v1" rbacv1alpha1 "k8s.io/api/rbac/v1alpha1" @@ -88,13 +88,12 @@ var localSchemeBuilder = runtime.SchemeBuilder{ autoscalingv2beta2.AddToScheme, batchv1.AddToScheme, batchv1beta1.AddToScheme, - batchv2alpha1.AddToScheme, certificatesv1.AddToScheme, certificatesv1beta1.AddToScheme, coordinationv1beta1.AddToScheme, coordinationv1.AddToScheme, corev1.AddToScheme, - discoveryv1alpha1.AddToScheme, + discoveryv1.AddToScheme, discoveryv1beta1.AddToScheme, eventsv1.AddToScheme, eventsv1beta1.AddToScheme, @@ -106,6 +105,7 @@ var localSchemeBuilder = runtime.SchemeBuilder{ nodev1.AddToScheme, nodev1alpha1.AddToScheme, nodev1beta1.AddToScheme, + policyv1.AddToScheme, policyv1beta1.AddToScheme, rbacv1.AddToScheme, rbacv1beta1.AddToScheme, diff --git a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1/BUILD deleted file mode 100644 index da73062bd3d1..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "admissionregistration_client.go", - "doc.go", - "generated_expansion.go", - "mutatingwebhookconfiguration.go", - "validatingwebhookconfiguration.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1", - importpath = "k8s.io/client-go/kubernetes/typed/admissionregistration/v1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/admissionregistration/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/admissionregistration/v1/fake:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1/fake/BUILD deleted file mode 100644 index d1897792ff12..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1/fake/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_admissionregistration_client.go", - "fake_mutatingwebhookconfiguration.go", - "fake_validatingwebhookconfiguration.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1/fake", - importpath = "k8s.io/client-go/kubernetes/typed/admissionregistration/v1/fake", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/admissionregistration/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/admissionregistration/v1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1/fake/fake_mutatingwebhookconfiguration.go b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1/fake/fake_mutatingwebhookconfiguration.go index 11738461278a..cda5c5d638b1 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1/fake/fake_mutatingwebhookconfiguration.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1/fake/fake_mutatingwebhookconfiguration.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" admissionregistrationv1 "k8s.io/api/admissionregistration/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + applyconfigurationsadmissionregistrationv1 "k8s.io/client-go/applyconfigurations/admissionregistration/v1" testing "k8s.io/client-go/testing" ) @@ -120,3 +123,24 @@ func (c *FakeMutatingWebhookConfigurations) Patch(ctx context.Context, name stri } return obj.(*admissionregistrationv1.MutatingWebhookConfiguration), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied mutatingWebhookConfiguration. +func (c *FakeMutatingWebhookConfigurations) Apply(ctx context.Context, mutatingWebhookConfiguration *applyconfigurationsadmissionregistrationv1.MutatingWebhookConfigurationApplyConfiguration, opts v1.ApplyOptions) (result *admissionregistrationv1.MutatingWebhookConfiguration, err error) { + if mutatingWebhookConfiguration == nil { + return nil, fmt.Errorf("mutatingWebhookConfiguration provided to Apply must not be nil") + } + data, err := json.Marshal(mutatingWebhookConfiguration) + if err != nil { + return nil, err + } + name := mutatingWebhookConfiguration.Name + if name == nil { + return nil, fmt.Errorf("mutatingWebhookConfiguration.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(mutatingwebhookconfigurationsResource, *name, types.ApplyPatchType, data), &admissionregistrationv1.MutatingWebhookConfiguration{}) + if obj == nil { + return nil, err + } + return obj.(*admissionregistrationv1.MutatingWebhookConfiguration), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1/fake/fake_validatingwebhookconfiguration.go b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1/fake/fake_validatingwebhookconfiguration.go index 78b059372ca4..8cf1956121f9 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1/fake/fake_validatingwebhookconfiguration.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1/fake/fake_validatingwebhookconfiguration.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" admissionregistrationv1 "k8s.io/api/admissionregistration/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + applyconfigurationsadmissionregistrationv1 "k8s.io/client-go/applyconfigurations/admissionregistration/v1" testing "k8s.io/client-go/testing" ) @@ -120,3 +123,24 @@ func (c *FakeValidatingWebhookConfigurations) Patch(ctx context.Context, name st } return obj.(*admissionregistrationv1.ValidatingWebhookConfiguration), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied validatingWebhookConfiguration. +func (c *FakeValidatingWebhookConfigurations) Apply(ctx context.Context, validatingWebhookConfiguration *applyconfigurationsadmissionregistrationv1.ValidatingWebhookConfigurationApplyConfiguration, opts v1.ApplyOptions) (result *admissionregistrationv1.ValidatingWebhookConfiguration, err error) { + if validatingWebhookConfiguration == nil { + return nil, fmt.Errorf("validatingWebhookConfiguration provided to Apply must not be nil") + } + data, err := json.Marshal(validatingWebhookConfiguration) + if err != nil { + return nil, err + } + name := validatingWebhookConfiguration.Name + if name == nil { + return nil, fmt.Errorf("validatingWebhookConfiguration.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(validatingwebhookconfigurationsResource, *name, types.ApplyPatchType, data), &admissionregistrationv1.ValidatingWebhookConfiguration{}) + if obj == nil { + return nil, err + } + return obj.(*admissionregistrationv1.ValidatingWebhookConfiguration), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1/mutatingwebhookconfiguration.go b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1/mutatingwebhookconfiguration.go index cf458f482003..edbc826d19d1 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1/mutatingwebhookconfiguration.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1/mutatingwebhookconfiguration.go @@ -20,12 +20,15 @@ package v1 import ( "context" + json "encoding/json" + "fmt" "time" v1 "k8s.io/api/admissionregistration/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + admissionregistrationv1 "k8s.io/client-go/applyconfigurations/admissionregistration/v1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type MutatingWebhookConfigurationInterface interface { List(ctx context.Context, opts metav1.ListOptions) (*v1.MutatingWebhookConfigurationList, error) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.MutatingWebhookConfiguration, err error) + Apply(ctx context.Context, mutatingWebhookConfiguration *admissionregistrationv1.MutatingWebhookConfigurationApplyConfiguration, opts metav1.ApplyOptions) (result *v1.MutatingWebhookConfiguration, err error) MutatingWebhookConfigurationExpansion } @@ -166,3 +170,28 @@ func (c *mutatingWebhookConfigurations) Patch(ctx context.Context, name string, Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied mutatingWebhookConfiguration. +func (c *mutatingWebhookConfigurations) Apply(ctx context.Context, mutatingWebhookConfiguration *admissionregistrationv1.MutatingWebhookConfigurationApplyConfiguration, opts metav1.ApplyOptions) (result *v1.MutatingWebhookConfiguration, err error) { + if mutatingWebhookConfiguration == nil { + return nil, fmt.Errorf("mutatingWebhookConfiguration provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(mutatingWebhookConfiguration) + if err != nil { + return nil, err + } + name := mutatingWebhookConfiguration.Name + if name == nil { + return nil, fmt.Errorf("mutatingWebhookConfiguration.Name must be provided to Apply") + } + result = &v1.MutatingWebhookConfiguration{} + err = c.client.Patch(types.ApplyPatchType). + Resource("mutatingwebhookconfigurations"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1/validatingwebhookconfiguration.go b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1/validatingwebhookconfiguration.go index c7191c0fe9cb..065e3c834147 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1/validatingwebhookconfiguration.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1/validatingwebhookconfiguration.go @@ -20,12 +20,15 @@ package v1 import ( "context" + json "encoding/json" + "fmt" "time" v1 "k8s.io/api/admissionregistration/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + admissionregistrationv1 "k8s.io/client-go/applyconfigurations/admissionregistration/v1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type ValidatingWebhookConfigurationInterface interface { List(ctx context.Context, opts metav1.ListOptions) (*v1.ValidatingWebhookConfigurationList, error) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.ValidatingWebhookConfiguration, err error) + Apply(ctx context.Context, validatingWebhookConfiguration *admissionregistrationv1.ValidatingWebhookConfigurationApplyConfiguration, opts metav1.ApplyOptions) (result *v1.ValidatingWebhookConfiguration, err error) ValidatingWebhookConfigurationExpansion } @@ -166,3 +170,28 @@ func (c *validatingWebhookConfigurations) Patch(ctx context.Context, name string Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied validatingWebhookConfiguration. +func (c *validatingWebhookConfigurations) Apply(ctx context.Context, validatingWebhookConfiguration *admissionregistrationv1.ValidatingWebhookConfigurationApplyConfiguration, opts metav1.ApplyOptions) (result *v1.ValidatingWebhookConfiguration, err error) { + if validatingWebhookConfiguration == nil { + return nil, fmt.Errorf("validatingWebhookConfiguration provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(validatingWebhookConfiguration) + if err != nil { + return nil, err + } + name := validatingWebhookConfiguration.Name + if name == nil { + return nil, fmt.Errorf("validatingWebhookConfiguration.Name must be provided to Apply") + } + result = &v1.ValidatingWebhookConfiguration{} + err = c.client.Patch(types.ApplyPatchType). + Resource("validatingwebhookconfigurations"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/BUILD deleted file mode 100644 index 5893c7c215b2..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "admissionregistration_client.go", - "doc.go", - "generated_expansion.go", - "mutatingwebhookconfiguration.go", - "validatingwebhookconfiguration.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1", - importpath = "k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/admissionregistration/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/fake:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/fake/BUILD deleted file mode 100644 index 432084731e65..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/fake/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_admissionregistration_client.go", - "fake_mutatingwebhookconfiguration.go", - "fake_validatingwebhookconfiguration.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/fake", - importpath = "k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/fake", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/admissionregistration/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/fake/fake_mutatingwebhookconfiguration.go b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/fake/fake_mutatingwebhookconfiguration.go index f303f9fdf0cc..c28115631383 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/fake/fake_mutatingwebhookconfiguration.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/fake/fake_mutatingwebhookconfiguration.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1beta1 "k8s.io/api/admissionregistration/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + admissionregistrationv1beta1 "k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1" testing "k8s.io/client-go/testing" ) @@ -120,3 +123,24 @@ func (c *FakeMutatingWebhookConfigurations) Patch(ctx context.Context, name stri } return obj.(*v1beta1.MutatingWebhookConfiguration), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied mutatingWebhookConfiguration. +func (c *FakeMutatingWebhookConfigurations) Apply(ctx context.Context, mutatingWebhookConfiguration *admissionregistrationv1beta1.MutatingWebhookConfigurationApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.MutatingWebhookConfiguration, err error) { + if mutatingWebhookConfiguration == nil { + return nil, fmt.Errorf("mutatingWebhookConfiguration provided to Apply must not be nil") + } + data, err := json.Marshal(mutatingWebhookConfiguration) + if err != nil { + return nil, err + } + name := mutatingWebhookConfiguration.Name + if name == nil { + return nil, fmt.Errorf("mutatingWebhookConfiguration.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(mutatingwebhookconfigurationsResource, *name, types.ApplyPatchType, data), &v1beta1.MutatingWebhookConfiguration{}) + if obj == nil { + return nil, err + } + return obj.(*v1beta1.MutatingWebhookConfiguration), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/fake/fake_validatingwebhookconfiguration.go b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/fake/fake_validatingwebhookconfiguration.go index 7227fe088208..ac87db44aff3 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/fake/fake_validatingwebhookconfiguration.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/fake/fake_validatingwebhookconfiguration.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1beta1 "k8s.io/api/admissionregistration/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + admissionregistrationv1beta1 "k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1" testing "k8s.io/client-go/testing" ) @@ -120,3 +123,24 @@ func (c *FakeValidatingWebhookConfigurations) Patch(ctx context.Context, name st } return obj.(*v1beta1.ValidatingWebhookConfiguration), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied validatingWebhookConfiguration. +func (c *FakeValidatingWebhookConfigurations) Apply(ctx context.Context, validatingWebhookConfiguration *admissionregistrationv1beta1.ValidatingWebhookConfigurationApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.ValidatingWebhookConfiguration, err error) { + if validatingWebhookConfiguration == nil { + return nil, fmt.Errorf("validatingWebhookConfiguration provided to Apply must not be nil") + } + data, err := json.Marshal(validatingWebhookConfiguration) + if err != nil { + return nil, err + } + name := validatingWebhookConfiguration.Name + if name == nil { + return nil, fmt.Errorf("validatingWebhookConfiguration.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(validatingwebhookconfigurationsResource, *name, types.ApplyPatchType, data), &v1beta1.ValidatingWebhookConfiguration{}) + if obj == nil { + return nil, err + } + return obj.(*v1beta1.ValidatingWebhookConfiguration), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/mutatingwebhookconfiguration.go b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/mutatingwebhookconfiguration.go index 73ab9ecdee40..ca6bb8bd503c 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/mutatingwebhookconfiguration.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/mutatingwebhookconfiguration.go @@ -20,12 +20,15 @@ package v1beta1 import ( "context" + json "encoding/json" + "fmt" "time" v1beta1 "k8s.io/api/admissionregistration/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + admissionregistrationv1beta1 "k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type MutatingWebhookConfigurationInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1beta1.MutatingWebhookConfigurationList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta1.MutatingWebhookConfiguration, err error) + Apply(ctx context.Context, mutatingWebhookConfiguration *admissionregistrationv1beta1.MutatingWebhookConfigurationApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.MutatingWebhookConfiguration, err error) MutatingWebhookConfigurationExpansion } @@ -166,3 +170,28 @@ func (c *mutatingWebhookConfigurations) Patch(ctx context.Context, name string, Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied mutatingWebhookConfiguration. +func (c *mutatingWebhookConfigurations) Apply(ctx context.Context, mutatingWebhookConfiguration *admissionregistrationv1beta1.MutatingWebhookConfigurationApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.MutatingWebhookConfiguration, err error) { + if mutatingWebhookConfiguration == nil { + return nil, fmt.Errorf("mutatingWebhookConfiguration provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(mutatingWebhookConfiguration) + if err != nil { + return nil, err + } + name := mutatingWebhookConfiguration.Name + if name == nil { + return nil, fmt.Errorf("mutatingWebhookConfiguration.Name must be provided to Apply") + } + result = &v1beta1.MutatingWebhookConfiguration{} + err = c.client.Patch(types.ApplyPatchType). + Resource("mutatingwebhookconfigurations"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/validatingwebhookconfiguration.go b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/validatingwebhookconfiguration.go index 5ab0b9e37726..5ba5974d7aa7 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/validatingwebhookconfiguration.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/validatingwebhookconfiguration.go @@ -20,12 +20,15 @@ package v1beta1 import ( "context" + json "encoding/json" + "fmt" "time" v1beta1 "k8s.io/api/admissionregistration/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + admissionregistrationv1beta1 "k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type ValidatingWebhookConfigurationInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1beta1.ValidatingWebhookConfigurationList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta1.ValidatingWebhookConfiguration, err error) + Apply(ctx context.Context, validatingWebhookConfiguration *admissionregistrationv1beta1.ValidatingWebhookConfigurationApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.ValidatingWebhookConfiguration, err error) ValidatingWebhookConfigurationExpansion } @@ -166,3 +170,28 @@ func (c *validatingWebhookConfigurations) Patch(ctx context.Context, name string Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied validatingWebhookConfiguration. +func (c *validatingWebhookConfigurations) Apply(ctx context.Context, validatingWebhookConfiguration *admissionregistrationv1beta1.ValidatingWebhookConfigurationApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.ValidatingWebhookConfiguration, err error) { + if validatingWebhookConfiguration == nil { + return nil, fmt.Errorf("validatingWebhookConfiguration provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(validatingWebhookConfiguration) + if err != nil { + return nil, err + } + name := validatingWebhookConfiguration.Name + if name == nil { + return nil, fmt.Errorf("validatingWebhookConfiguration.Name must be provided to Apply") + } + result = &v1beta1.ValidatingWebhookConfiguration{} + err = c.client.Patch(types.ApplyPatchType). + Resource("validatingwebhookconfigurations"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apiserverinternal/v1alpha1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/apiserverinternal/v1alpha1/BUILD deleted file mode 100644 index 87bd0a613f77..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/apiserverinternal/v1alpha1/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "apiserverinternal_client.go", - "doc.go", - "generated_expansion.go", - "storageversion.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/apiserverinternal/v1alpha1", - importpath = "k8s.io/client-go/kubernetes/typed/apiserverinternal/v1alpha1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/apiserverinternal/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/apiserverinternal/v1alpha1/fake:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apiserverinternal/v1alpha1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/apiserverinternal/v1alpha1/fake/BUILD deleted file mode 100644 index 89fd14d47092..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/apiserverinternal/v1alpha1/fake/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_apiserverinternal_client.go", - "fake_storageversion.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/apiserverinternal/v1alpha1/fake", - importpath = "k8s.io/client-go/kubernetes/typed/apiserverinternal/v1alpha1/fake", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/apiserverinternal/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/apiserverinternal/v1alpha1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apiserverinternal/v1alpha1/fake/fake_storageversion.go b/vendor/k8s.io/client-go/kubernetes/typed/apiserverinternal/v1alpha1/fake/fake_storageversion.go index d75049a40bf8..71617dc25fec 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apiserverinternal/v1alpha1/fake/fake_storageversion.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apiserverinternal/v1alpha1/fake/fake_storageversion.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1alpha1 "k8s.io/api/apiserverinternal/v1alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + apiserverinternalv1alpha1 "k8s.io/client-go/applyconfigurations/apiserverinternal/v1alpha1" testing "k8s.io/client-go/testing" ) @@ -131,3 +134,46 @@ func (c *FakeStorageVersions) Patch(ctx context.Context, name string, pt types.P } return obj.(*v1alpha1.StorageVersion), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied storageVersion. +func (c *FakeStorageVersions) Apply(ctx context.Context, storageVersion *apiserverinternalv1alpha1.StorageVersionApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.StorageVersion, err error) { + if storageVersion == nil { + return nil, fmt.Errorf("storageVersion provided to Apply must not be nil") + } + data, err := json.Marshal(storageVersion) + if err != nil { + return nil, err + } + name := storageVersion.Name + if name == nil { + return nil, fmt.Errorf("storageVersion.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(storageversionsResource, *name, types.ApplyPatchType, data), &v1alpha1.StorageVersion{}) + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.StorageVersion), err +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *FakeStorageVersions) ApplyStatus(ctx context.Context, storageVersion *apiserverinternalv1alpha1.StorageVersionApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.StorageVersion, err error) { + if storageVersion == nil { + return nil, fmt.Errorf("storageVersion provided to Apply must not be nil") + } + data, err := json.Marshal(storageVersion) + if err != nil { + return nil, err + } + name := storageVersion.Name + if name == nil { + return nil, fmt.Errorf("storageVersion.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(storageversionsResource, *name, types.ApplyPatchType, data, "status"), &v1alpha1.StorageVersion{}) + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.StorageVersion), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apiserverinternal/v1alpha1/storageversion.go b/vendor/k8s.io/client-go/kubernetes/typed/apiserverinternal/v1alpha1/storageversion.go index af5466b04353..18789c7f82a3 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apiserverinternal/v1alpha1/storageversion.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apiserverinternal/v1alpha1/storageversion.go @@ -20,12 +20,15 @@ package v1alpha1 import ( "context" + json "encoding/json" + "fmt" "time" v1alpha1 "k8s.io/api/apiserverinternal/v1alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + apiserverinternalv1alpha1 "k8s.io/client-go/applyconfigurations/apiserverinternal/v1alpha1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -47,6 +50,8 @@ type StorageVersionInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1alpha1.StorageVersionList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.StorageVersion, err error) + Apply(ctx context.Context, storageVersion *apiserverinternalv1alpha1.StorageVersionApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.StorageVersion, err error) + ApplyStatus(ctx context.Context, storageVersion *apiserverinternalv1alpha1.StorageVersionApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.StorageVersion, err error) StorageVersionExpansion } @@ -182,3 +187,57 @@ func (c *storageVersions) Patch(ctx context.Context, name string, pt types.Patch Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied storageVersion. +func (c *storageVersions) Apply(ctx context.Context, storageVersion *apiserverinternalv1alpha1.StorageVersionApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.StorageVersion, err error) { + if storageVersion == nil { + return nil, fmt.Errorf("storageVersion provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(storageVersion) + if err != nil { + return nil, err + } + name := storageVersion.Name + if name == nil { + return nil, fmt.Errorf("storageVersion.Name must be provided to Apply") + } + result = &v1alpha1.StorageVersion{} + err = c.client.Patch(types.ApplyPatchType). + Resource("storageversions"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *storageVersions) ApplyStatus(ctx context.Context, storageVersion *apiserverinternalv1alpha1.StorageVersionApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.StorageVersion, err error) { + if storageVersion == nil { + return nil, fmt.Errorf("storageVersion provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(storageVersion) + if err != nil { + return nil, err + } + + name := storageVersion.Name + if name == nil { + return nil, fmt.Errorf("storageVersion.Name must be provided to Apply") + } + + result = &v1alpha1.StorageVersion{} + err = c.client.Patch(types.ApplyPatchType). + Resource("storageversions"). + Name(*name). + SubResource("status"). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/BUILD deleted file mode 100644 index 9f4e62d26c17..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "apps_client.go", - "controllerrevision.go", - "daemonset.go", - "deployment.go", - "doc.go", - "generated_expansion.go", - "replicaset.go", - "statefulset.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/apps/v1", - importpath = "k8s.io/client-go/kubernetes/typed/apps/v1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/apps/v1/fake:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/controllerrevision.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/controllerrevision.go index dba06207a043..f4b198265d6f 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/controllerrevision.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/controllerrevision.go @@ -20,12 +20,15 @@ package v1 import ( "context" + json "encoding/json" + "fmt" "time" v1 "k8s.io/api/apps/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + appsv1 "k8s.io/client-go/applyconfigurations/apps/v1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type ControllerRevisionInterface interface { List(ctx context.Context, opts metav1.ListOptions) (*v1.ControllerRevisionList, error) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.ControllerRevision, err error) + Apply(ctx context.Context, controllerRevision *appsv1.ControllerRevisionApplyConfiguration, opts metav1.ApplyOptions) (result *v1.ControllerRevision, err error) ControllerRevisionExpansion } @@ -176,3 +180,29 @@ func (c *controllerRevisions) Patch(ctx context.Context, name string, pt types.P Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied controllerRevision. +func (c *controllerRevisions) Apply(ctx context.Context, controllerRevision *appsv1.ControllerRevisionApplyConfiguration, opts metav1.ApplyOptions) (result *v1.ControllerRevision, err error) { + if controllerRevision == nil { + return nil, fmt.Errorf("controllerRevision provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(controllerRevision) + if err != nil { + return nil, err + } + name := controllerRevision.Name + if name == nil { + return nil, fmt.Errorf("controllerRevision.Name must be provided to Apply") + } + result = &v1.ControllerRevision{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("controllerrevisions"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/daemonset.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/daemonset.go index 0bb397af72dd..53e539287919 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/daemonset.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/daemonset.go @@ -20,12 +20,15 @@ package v1 import ( "context" + json "encoding/json" + "fmt" "time" v1 "k8s.io/api/apps/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + appsv1 "k8s.io/client-go/applyconfigurations/apps/v1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -47,6 +50,8 @@ type DaemonSetInterface interface { List(ctx context.Context, opts metav1.ListOptions) (*v1.DaemonSetList, error) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.DaemonSet, err error) + Apply(ctx context.Context, daemonSet *appsv1.DaemonSetApplyConfiguration, opts metav1.ApplyOptions) (result *v1.DaemonSet, err error) + ApplyStatus(ctx context.Context, daemonSet *appsv1.DaemonSetApplyConfiguration, opts metav1.ApplyOptions) (result *v1.DaemonSet, err error) DaemonSetExpansion } @@ -193,3 +198,59 @@ func (c *daemonSets) Patch(ctx context.Context, name string, pt types.PatchType, Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied daemonSet. +func (c *daemonSets) Apply(ctx context.Context, daemonSet *appsv1.DaemonSetApplyConfiguration, opts metav1.ApplyOptions) (result *v1.DaemonSet, err error) { + if daemonSet == nil { + return nil, fmt.Errorf("daemonSet provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(daemonSet) + if err != nil { + return nil, err + } + name := daemonSet.Name + if name == nil { + return nil, fmt.Errorf("daemonSet.Name must be provided to Apply") + } + result = &v1.DaemonSet{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("daemonsets"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *daemonSets) ApplyStatus(ctx context.Context, daemonSet *appsv1.DaemonSetApplyConfiguration, opts metav1.ApplyOptions) (result *v1.DaemonSet, err error) { + if daemonSet == nil { + return nil, fmt.Errorf("daemonSet provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(daemonSet) + if err != nil { + return nil, err + } + + name := daemonSet.Name + if name == nil { + return nil, fmt.Errorf("daemonSet.Name must be provided to Apply") + } + + result = &v1.DaemonSet{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("daemonsets"). + Name(*name). + SubResource("status"). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/deployment.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/deployment.go index 69d1b86dc06d..51545107d526 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/deployment.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/deployment.go @@ -20,6 +20,8 @@ package v1 import ( "context" + json "encoding/json" + "fmt" "time" v1 "k8s.io/api/apps/v1" @@ -27,6 +29,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + appsv1 "k8s.io/client-go/applyconfigurations/apps/v1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -48,6 +51,8 @@ type DeploymentInterface interface { List(ctx context.Context, opts metav1.ListOptions) (*v1.DeploymentList, error) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.Deployment, err error) + Apply(ctx context.Context, deployment *appsv1.DeploymentApplyConfiguration, opts metav1.ApplyOptions) (result *v1.Deployment, err error) + ApplyStatus(ctx context.Context, deployment *appsv1.DeploymentApplyConfiguration, opts metav1.ApplyOptions) (result *v1.Deployment, err error) GetScale(ctx context.Context, deploymentName string, options metav1.GetOptions) (*autoscalingv1.Scale, error) UpdateScale(ctx context.Context, deploymentName string, scale *autoscalingv1.Scale, opts metav1.UpdateOptions) (*autoscalingv1.Scale, error) @@ -198,6 +203,62 @@ func (c *deployments) Patch(ctx context.Context, name string, pt types.PatchType return } +// Apply takes the given apply declarative configuration, applies it and returns the applied deployment. +func (c *deployments) Apply(ctx context.Context, deployment *appsv1.DeploymentApplyConfiguration, opts metav1.ApplyOptions) (result *v1.Deployment, err error) { + if deployment == nil { + return nil, fmt.Errorf("deployment provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(deployment) + if err != nil { + return nil, err + } + name := deployment.Name + if name == nil { + return nil, fmt.Errorf("deployment.Name must be provided to Apply") + } + result = &v1.Deployment{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("deployments"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *deployments) ApplyStatus(ctx context.Context, deployment *appsv1.DeploymentApplyConfiguration, opts metav1.ApplyOptions) (result *v1.Deployment, err error) { + if deployment == nil { + return nil, fmt.Errorf("deployment provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(deployment) + if err != nil { + return nil, err + } + + name := deployment.Name + if name == nil { + return nil, fmt.Errorf("deployment.Name must be provided to Apply") + } + + result = &v1.Deployment{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("deployments"). + Name(*name). + SubResource("status"). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + // GetScale takes name of the deployment, and returns the corresponding autoscalingv1.Scale object, and an error if there is any. func (c *deployments) GetScale(ctx context.Context, deploymentName string, options metav1.GetOptions) (result *autoscalingv1.Scale, err error) { result = &autoscalingv1.Scale{} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/BUILD deleted file mode 100644 index d01abefea0cd..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_apps_client.go", - "fake_controllerrevision.go", - "fake_daemonset.go", - "fake_deployment.go", - "fake_replicaset.go", - "fake_statefulset.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake", - importpath = "k8s.io/client-go/kubernetes/typed/apps/v1/fake", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/apps/v1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/fake_controllerrevision.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/fake_controllerrevision.go index 959fc758da6b..c7ba0c50afca 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/fake_controllerrevision.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/fake_controllerrevision.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" appsv1 "k8s.io/api/apps/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + applyconfigurationsappsv1 "k8s.io/client-go/applyconfigurations/apps/v1" testing "k8s.io/client-go/testing" ) @@ -128,3 +131,25 @@ func (c *FakeControllerRevisions) Patch(ctx context.Context, name string, pt typ } return obj.(*appsv1.ControllerRevision), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied controllerRevision. +func (c *FakeControllerRevisions) Apply(ctx context.Context, controllerRevision *applyconfigurationsappsv1.ControllerRevisionApplyConfiguration, opts v1.ApplyOptions) (result *appsv1.ControllerRevision, err error) { + if controllerRevision == nil { + return nil, fmt.Errorf("controllerRevision provided to Apply must not be nil") + } + data, err := json.Marshal(controllerRevision) + if err != nil { + return nil, err + } + name := controllerRevision.Name + if name == nil { + return nil, fmt.Errorf("controllerRevision.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(controllerrevisionsResource, c.ns, *name, types.ApplyPatchType, data), &appsv1.ControllerRevision{}) + + if obj == nil { + return nil, err + } + return obj.(*appsv1.ControllerRevision), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/fake_daemonset.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/fake_daemonset.go index 3a799f6de208..ce69673bcbca 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/fake_daemonset.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/fake_daemonset.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" appsv1 "k8s.io/api/apps/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + applyconfigurationsappsv1 "k8s.io/client-go/applyconfigurations/apps/v1" testing "k8s.io/client-go/testing" ) @@ -140,3 +143,48 @@ func (c *FakeDaemonSets) Patch(ctx context.Context, name string, pt types.PatchT } return obj.(*appsv1.DaemonSet), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied daemonSet. +func (c *FakeDaemonSets) Apply(ctx context.Context, daemonSet *applyconfigurationsappsv1.DaemonSetApplyConfiguration, opts v1.ApplyOptions) (result *appsv1.DaemonSet, err error) { + if daemonSet == nil { + return nil, fmt.Errorf("daemonSet provided to Apply must not be nil") + } + data, err := json.Marshal(daemonSet) + if err != nil { + return nil, err + } + name := daemonSet.Name + if name == nil { + return nil, fmt.Errorf("daemonSet.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(daemonsetsResource, c.ns, *name, types.ApplyPatchType, data), &appsv1.DaemonSet{}) + + if obj == nil { + return nil, err + } + return obj.(*appsv1.DaemonSet), err +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *FakeDaemonSets) ApplyStatus(ctx context.Context, daemonSet *applyconfigurationsappsv1.DaemonSetApplyConfiguration, opts v1.ApplyOptions) (result *appsv1.DaemonSet, err error) { + if daemonSet == nil { + return nil, fmt.Errorf("daemonSet provided to Apply must not be nil") + } + data, err := json.Marshal(daemonSet) + if err != nil { + return nil, err + } + name := daemonSet.Name + if name == nil { + return nil, fmt.Errorf("daemonSet.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(daemonsetsResource, c.ns, *name, types.ApplyPatchType, data, "status"), &appsv1.DaemonSet{}) + + if obj == nil { + return nil, err + } + return obj.(*appsv1.DaemonSet), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/fake_deployment.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/fake_deployment.go index 868742ac6c18..3fe07c77859a 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/fake_deployment.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/fake_deployment.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" appsv1 "k8s.io/api/apps/v1" autoscalingv1 "k8s.io/api/autoscaling/v1" @@ -28,6 +30,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + applyconfigurationsappsv1 "k8s.io/client-go/applyconfigurations/apps/v1" testing "k8s.io/client-go/testing" ) @@ -142,6 +145,51 @@ func (c *FakeDeployments) Patch(ctx context.Context, name string, pt types.Patch return obj.(*appsv1.Deployment), err } +// Apply takes the given apply declarative configuration, applies it and returns the applied deployment. +func (c *FakeDeployments) Apply(ctx context.Context, deployment *applyconfigurationsappsv1.DeploymentApplyConfiguration, opts v1.ApplyOptions) (result *appsv1.Deployment, err error) { + if deployment == nil { + return nil, fmt.Errorf("deployment provided to Apply must not be nil") + } + data, err := json.Marshal(deployment) + if err != nil { + return nil, err + } + name := deployment.Name + if name == nil { + return nil, fmt.Errorf("deployment.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(deploymentsResource, c.ns, *name, types.ApplyPatchType, data), &appsv1.Deployment{}) + + if obj == nil { + return nil, err + } + return obj.(*appsv1.Deployment), err +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *FakeDeployments) ApplyStatus(ctx context.Context, deployment *applyconfigurationsappsv1.DeploymentApplyConfiguration, opts v1.ApplyOptions) (result *appsv1.Deployment, err error) { + if deployment == nil { + return nil, fmt.Errorf("deployment provided to Apply must not be nil") + } + data, err := json.Marshal(deployment) + if err != nil { + return nil, err + } + name := deployment.Name + if name == nil { + return nil, fmt.Errorf("deployment.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(deploymentsResource, c.ns, *name, types.ApplyPatchType, data, "status"), &appsv1.Deployment{}) + + if obj == nil { + return nil, err + } + return obj.(*appsv1.Deployment), err +} + // GetScale takes name of the deployment, and returns the corresponding scale object, and an error if there is any. func (c *FakeDeployments) GetScale(ctx context.Context, deploymentName string, options v1.GetOptions) (result *autoscalingv1.Scale, err error) { obj, err := c.Fake. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/fake_replicaset.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/fake_replicaset.go index 9e6912b7ee86..a84d1bdf6eb9 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/fake_replicaset.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/fake_replicaset.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" appsv1 "k8s.io/api/apps/v1" autoscalingv1 "k8s.io/api/autoscaling/v1" @@ -28,6 +30,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + applyconfigurationsappsv1 "k8s.io/client-go/applyconfigurations/apps/v1" testing "k8s.io/client-go/testing" ) @@ -142,6 +145,51 @@ func (c *FakeReplicaSets) Patch(ctx context.Context, name string, pt types.Patch return obj.(*appsv1.ReplicaSet), err } +// Apply takes the given apply declarative configuration, applies it and returns the applied replicaSet. +func (c *FakeReplicaSets) Apply(ctx context.Context, replicaSet *applyconfigurationsappsv1.ReplicaSetApplyConfiguration, opts v1.ApplyOptions) (result *appsv1.ReplicaSet, err error) { + if replicaSet == nil { + return nil, fmt.Errorf("replicaSet provided to Apply must not be nil") + } + data, err := json.Marshal(replicaSet) + if err != nil { + return nil, err + } + name := replicaSet.Name + if name == nil { + return nil, fmt.Errorf("replicaSet.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(replicasetsResource, c.ns, *name, types.ApplyPatchType, data), &appsv1.ReplicaSet{}) + + if obj == nil { + return nil, err + } + return obj.(*appsv1.ReplicaSet), err +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *FakeReplicaSets) ApplyStatus(ctx context.Context, replicaSet *applyconfigurationsappsv1.ReplicaSetApplyConfiguration, opts v1.ApplyOptions) (result *appsv1.ReplicaSet, err error) { + if replicaSet == nil { + return nil, fmt.Errorf("replicaSet provided to Apply must not be nil") + } + data, err := json.Marshal(replicaSet) + if err != nil { + return nil, err + } + name := replicaSet.Name + if name == nil { + return nil, fmt.Errorf("replicaSet.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(replicasetsResource, c.ns, *name, types.ApplyPatchType, data, "status"), &appsv1.ReplicaSet{}) + + if obj == nil { + return nil, err + } + return obj.(*appsv1.ReplicaSet), err +} + // GetScale takes name of the replicaSet, and returns the corresponding scale object, and an error if there is any. func (c *FakeReplicaSets) GetScale(ctx context.Context, replicaSetName string, options v1.GetOptions) (result *autoscalingv1.Scale, err error) { obj, err := c.Fake. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/fake_statefulset.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/fake_statefulset.go index 65eea8dc3d8c..44a3a5e09f8d 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/fake_statefulset.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/fake_statefulset.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" appsv1 "k8s.io/api/apps/v1" autoscalingv1 "k8s.io/api/autoscaling/v1" @@ -28,6 +30,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + applyconfigurationsappsv1 "k8s.io/client-go/applyconfigurations/apps/v1" testing "k8s.io/client-go/testing" ) @@ -142,6 +145,51 @@ func (c *FakeStatefulSets) Patch(ctx context.Context, name string, pt types.Patc return obj.(*appsv1.StatefulSet), err } +// Apply takes the given apply declarative configuration, applies it and returns the applied statefulSet. +func (c *FakeStatefulSets) Apply(ctx context.Context, statefulSet *applyconfigurationsappsv1.StatefulSetApplyConfiguration, opts v1.ApplyOptions) (result *appsv1.StatefulSet, err error) { + if statefulSet == nil { + return nil, fmt.Errorf("statefulSet provided to Apply must not be nil") + } + data, err := json.Marshal(statefulSet) + if err != nil { + return nil, err + } + name := statefulSet.Name + if name == nil { + return nil, fmt.Errorf("statefulSet.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(statefulsetsResource, c.ns, *name, types.ApplyPatchType, data), &appsv1.StatefulSet{}) + + if obj == nil { + return nil, err + } + return obj.(*appsv1.StatefulSet), err +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *FakeStatefulSets) ApplyStatus(ctx context.Context, statefulSet *applyconfigurationsappsv1.StatefulSetApplyConfiguration, opts v1.ApplyOptions) (result *appsv1.StatefulSet, err error) { + if statefulSet == nil { + return nil, fmt.Errorf("statefulSet provided to Apply must not be nil") + } + data, err := json.Marshal(statefulSet) + if err != nil { + return nil, err + } + name := statefulSet.Name + if name == nil { + return nil, fmt.Errorf("statefulSet.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(statefulsetsResource, c.ns, *name, types.ApplyPatchType, data, "status"), &appsv1.StatefulSet{}) + + if obj == nil { + return nil, err + } + return obj.(*appsv1.StatefulSet), err +} + // GetScale takes name of the statefulSet, and returns the corresponding scale object, and an error if there is any. func (c *FakeStatefulSets) GetScale(ctx context.Context, statefulSetName string, options v1.GetOptions) (result *autoscalingv1.Scale, err error) { obj, err := c.Fake. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/replicaset.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/replicaset.go index 377b9ca37af3..7a8f0cd84c83 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/replicaset.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/replicaset.go @@ -20,6 +20,8 @@ package v1 import ( "context" + json "encoding/json" + "fmt" "time" v1 "k8s.io/api/apps/v1" @@ -27,6 +29,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + appsv1 "k8s.io/client-go/applyconfigurations/apps/v1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -48,6 +51,8 @@ type ReplicaSetInterface interface { List(ctx context.Context, opts metav1.ListOptions) (*v1.ReplicaSetList, error) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.ReplicaSet, err error) + Apply(ctx context.Context, replicaSet *appsv1.ReplicaSetApplyConfiguration, opts metav1.ApplyOptions) (result *v1.ReplicaSet, err error) + ApplyStatus(ctx context.Context, replicaSet *appsv1.ReplicaSetApplyConfiguration, opts metav1.ApplyOptions) (result *v1.ReplicaSet, err error) GetScale(ctx context.Context, replicaSetName string, options metav1.GetOptions) (*autoscalingv1.Scale, error) UpdateScale(ctx context.Context, replicaSetName string, scale *autoscalingv1.Scale, opts metav1.UpdateOptions) (*autoscalingv1.Scale, error) @@ -198,6 +203,62 @@ func (c *replicaSets) Patch(ctx context.Context, name string, pt types.PatchType return } +// Apply takes the given apply declarative configuration, applies it and returns the applied replicaSet. +func (c *replicaSets) Apply(ctx context.Context, replicaSet *appsv1.ReplicaSetApplyConfiguration, opts metav1.ApplyOptions) (result *v1.ReplicaSet, err error) { + if replicaSet == nil { + return nil, fmt.Errorf("replicaSet provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(replicaSet) + if err != nil { + return nil, err + } + name := replicaSet.Name + if name == nil { + return nil, fmt.Errorf("replicaSet.Name must be provided to Apply") + } + result = &v1.ReplicaSet{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("replicasets"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *replicaSets) ApplyStatus(ctx context.Context, replicaSet *appsv1.ReplicaSetApplyConfiguration, opts metav1.ApplyOptions) (result *v1.ReplicaSet, err error) { + if replicaSet == nil { + return nil, fmt.Errorf("replicaSet provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(replicaSet) + if err != nil { + return nil, err + } + + name := replicaSet.Name + if name == nil { + return nil, fmt.Errorf("replicaSet.Name must be provided to Apply") + } + + result = &v1.ReplicaSet{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("replicasets"). + Name(*name). + SubResource("status"). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + // GetScale takes name of the replicaSet, and returns the corresponding autoscalingv1.Scale object, and an error if there is any. func (c *replicaSets) GetScale(ctx context.Context, replicaSetName string, options metav1.GetOptions) (result *autoscalingv1.Scale, err error) { result = &autoscalingv1.Scale{} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/statefulset.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/statefulset.go index 33a9f535c18a..5626e2baacc3 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/statefulset.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/statefulset.go @@ -20,6 +20,8 @@ package v1 import ( "context" + json "encoding/json" + "fmt" "time" v1 "k8s.io/api/apps/v1" @@ -27,6 +29,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + appsv1 "k8s.io/client-go/applyconfigurations/apps/v1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -48,6 +51,8 @@ type StatefulSetInterface interface { List(ctx context.Context, opts metav1.ListOptions) (*v1.StatefulSetList, error) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.StatefulSet, err error) + Apply(ctx context.Context, statefulSet *appsv1.StatefulSetApplyConfiguration, opts metav1.ApplyOptions) (result *v1.StatefulSet, err error) + ApplyStatus(ctx context.Context, statefulSet *appsv1.StatefulSetApplyConfiguration, opts metav1.ApplyOptions) (result *v1.StatefulSet, err error) GetScale(ctx context.Context, statefulSetName string, options metav1.GetOptions) (*autoscalingv1.Scale, error) UpdateScale(ctx context.Context, statefulSetName string, scale *autoscalingv1.Scale, opts metav1.UpdateOptions) (*autoscalingv1.Scale, error) @@ -198,6 +203,62 @@ func (c *statefulSets) Patch(ctx context.Context, name string, pt types.PatchTyp return } +// Apply takes the given apply declarative configuration, applies it and returns the applied statefulSet. +func (c *statefulSets) Apply(ctx context.Context, statefulSet *appsv1.StatefulSetApplyConfiguration, opts metav1.ApplyOptions) (result *v1.StatefulSet, err error) { + if statefulSet == nil { + return nil, fmt.Errorf("statefulSet provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(statefulSet) + if err != nil { + return nil, err + } + name := statefulSet.Name + if name == nil { + return nil, fmt.Errorf("statefulSet.Name must be provided to Apply") + } + result = &v1.StatefulSet{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("statefulsets"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *statefulSets) ApplyStatus(ctx context.Context, statefulSet *appsv1.StatefulSetApplyConfiguration, opts metav1.ApplyOptions) (result *v1.StatefulSet, err error) { + if statefulSet == nil { + return nil, fmt.Errorf("statefulSet provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(statefulSet) + if err != nil { + return nil, err + } + + name := statefulSet.Name + if name == nil { + return nil, fmt.Errorf("statefulSet.Name must be provided to Apply") + } + + result = &v1.StatefulSet{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("statefulsets"). + Name(*name). + SubResource("status"). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + // GetScale takes name of the statefulSet, and returns the corresponding autoscalingv1.Scale object, and an error if there is any. func (c *statefulSets) GetScale(ctx context.Context, statefulSetName string, options metav1.GetOptions) (result *autoscalingv1.Scale, err error) { result = &autoscalingv1.Scale{} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/BUILD deleted file mode 100644 index 5aa65682d523..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "apps_client.go", - "controllerrevision.go", - "deployment.go", - "doc.go", - "generated_expansion.go", - "statefulset.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1", - importpath = "k8s.io/client-go/kubernetes/typed/apps/v1beta1", - deps = [ - "//staging/src/k8s.io/api/apps/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/controllerrevision.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/controllerrevision.go index e247e07d036d..0c3f49ba149c 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/controllerrevision.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/controllerrevision.go @@ -20,12 +20,15 @@ package v1beta1 import ( "context" + json "encoding/json" + "fmt" "time" v1beta1 "k8s.io/api/apps/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + appsv1beta1 "k8s.io/client-go/applyconfigurations/apps/v1beta1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type ControllerRevisionInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1beta1.ControllerRevisionList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta1.ControllerRevision, err error) + Apply(ctx context.Context, controllerRevision *appsv1beta1.ControllerRevisionApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.ControllerRevision, err error) ControllerRevisionExpansion } @@ -176,3 +180,29 @@ func (c *controllerRevisions) Patch(ctx context.Context, name string, pt types.P Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied controllerRevision. +func (c *controllerRevisions) Apply(ctx context.Context, controllerRevision *appsv1beta1.ControllerRevisionApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.ControllerRevision, err error) { + if controllerRevision == nil { + return nil, fmt.Errorf("controllerRevision provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(controllerRevision) + if err != nil { + return nil, err + } + name := controllerRevision.Name + if name == nil { + return nil, fmt.Errorf("controllerRevision.Name must be provided to Apply") + } + result = &v1beta1.ControllerRevision{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("controllerrevisions"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/deployment.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/deployment.go index dc0dad044dcb..281758c4351b 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/deployment.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/deployment.go @@ -20,12 +20,15 @@ package v1beta1 import ( "context" + json "encoding/json" + "fmt" "time" v1beta1 "k8s.io/api/apps/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + appsv1beta1 "k8s.io/client-go/applyconfigurations/apps/v1beta1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -47,6 +50,8 @@ type DeploymentInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1beta1.DeploymentList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta1.Deployment, err error) + Apply(ctx context.Context, deployment *appsv1beta1.DeploymentApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.Deployment, err error) + ApplyStatus(ctx context.Context, deployment *appsv1beta1.DeploymentApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.Deployment, err error) DeploymentExpansion } @@ -193,3 +198,59 @@ func (c *deployments) Patch(ctx context.Context, name string, pt types.PatchType Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied deployment. +func (c *deployments) Apply(ctx context.Context, deployment *appsv1beta1.DeploymentApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.Deployment, err error) { + if deployment == nil { + return nil, fmt.Errorf("deployment provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(deployment) + if err != nil { + return nil, err + } + name := deployment.Name + if name == nil { + return nil, fmt.Errorf("deployment.Name must be provided to Apply") + } + result = &v1beta1.Deployment{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("deployments"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *deployments) ApplyStatus(ctx context.Context, deployment *appsv1beta1.DeploymentApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.Deployment, err error) { + if deployment == nil { + return nil, fmt.Errorf("deployment provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(deployment) + if err != nil { + return nil, err + } + + name := deployment.Name + if name == nil { + return nil, fmt.Errorf("deployment.Name must be provided to Apply") + } + + result = &v1beta1.Deployment{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("deployments"). + Name(*name). + SubResource("status"). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake/BUILD deleted file mode 100644 index c3bc1b48cd42..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_apps_client.go", - "fake_controllerrevision.go", - "fake_deployment.go", - "fake_statefulset.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake", - importpath = "k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake", - deps = [ - "//staging/src/k8s.io/api/apps/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/apps/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake/fake_controllerrevision.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake/fake_controllerrevision.go index 3215eca7d129..5cf7bf16c37e 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake/fake_controllerrevision.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake/fake_controllerrevision.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1beta1 "k8s.io/api/apps/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + appsv1beta1 "k8s.io/client-go/applyconfigurations/apps/v1beta1" testing "k8s.io/client-go/testing" ) @@ -128,3 +131,25 @@ func (c *FakeControllerRevisions) Patch(ctx context.Context, name string, pt typ } return obj.(*v1beta1.ControllerRevision), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied controllerRevision. +func (c *FakeControllerRevisions) Apply(ctx context.Context, controllerRevision *appsv1beta1.ControllerRevisionApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.ControllerRevision, err error) { + if controllerRevision == nil { + return nil, fmt.Errorf("controllerRevision provided to Apply must not be nil") + } + data, err := json.Marshal(controllerRevision) + if err != nil { + return nil, err + } + name := controllerRevision.Name + if name == nil { + return nil, fmt.Errorf("controllerRevision.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(controllerrevisionsResource, c.ns, *name, types.ApplyPatchType, data), &v1beta1.ControllerRevision{}) + + if obj == nil { + return nil, err + } + return obj.(*v1beta1.ControllerRevision), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake/fake_deployment.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake/fake_deployment.go index d9a9bbd1678b..2ab2ce5ff77a 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake/fake_deployment.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake/fake_deployment.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1beta1 "k8s.io/api/apps/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + appsv1beta1 "k8s.io/client-go/applyconfigurations/apps/v1beta1" testing "k8s.io/client-go/testing" ) @@ -140,3 +143,48 @@ func (c *FakeDeployments) Patch(ctx context.Context, name string, pt types.Patch } return obj.(*v1beta1.Deployment), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied deployment. +func (c *FakeDeployments) Apply(ctx context.Context, deployment *appsv1beta1.DeploymentApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.Deployment, err error) { + if deployment == nil { + return nil, fmt.Errorf("deployment provided to Apply must not be nil") + } + data, err := json.Marshal(deployment) + if err != nil { + return nil, err + } + name := deployment.Name + if name == nil { + return nil, fmt.Errorf("deployment.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(deploymentsResource, c.ns, *name, types.ApplyPatchType, data), &v1beta1.Deployment{}) + + if obj == nil { + return nil, err + } + return obj.(*v1beta1.Deployment), err +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *FakeDeployments) ApplyStatus(ctx context.Context, deployment *appsv1beta1.DeploymentApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.Deployment, err error) { + if deployment == nil { + return nil, fmt.Errorf("deployment provided to Apply must not be nil") + } + data, err := json.Marshal(deployment) + if err != nil { + return nil, err + } + name := deployment.Name + if name == nil { + return nil, fmt.Errorf("deployment.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(deploymentsResource, c.ns, *name, types.ApplyPatchType, data, "status"), &v1beta1.Deployment{}) + + if obj == nil { + return nil, err + } + return obj.(*v1beta1.Deployment), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake/fake_statefulset.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake/fake_statefulset.go index ef77142ff10b..a7c8db240951 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake/fake_statefulset.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake/fake_statefulset.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1beta1 "k8s.io/api/apps/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + appsv1beta1 "k8s.io/client-go/applyconfigurations/apps/v1beta1" testing "k8s.io/client-go/testing" ) @@ -140,3 +143,48 @@ func (c *FakeStatefulSets) Patch(ctx context.Context, name string, pt types.Patc } return obj.(*v1beta1.StatefulSet), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied statefulSet. +func (c *FakeStatefulSets) Apply(ctx context.Context, statefulSet *appsv1beta1.StatefulSetApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.StatefulSet, err error) { + if statefulSet == nil { + return nil, fmt.Errorf("statefulSet provided to Apply must not be nil") + } + data, err := json.Marshal(statefulSet) + if err != nil { + return nil, err + } + name := statefulSet.Name + if name == nil { + return nil, fmt.Errorf("statefulSet.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(statefulsetsResource, c.ns, *name, types.ApplyPatchType, data), &v1beta1.StatefulSet{}) + + if obj == nil { + return nil, err + } + return obj.(*v1beta1.StatefulSet), err +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *FakeStatefulSets) ApplyStatus(ctx context.Context, statefulSet *appsv1beta1.StatefulSetApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.StatefulSet, err error) { + if statefulSet == nil { + return nil, fmt.Errorf("statefulSet provided to Apply must not be nil") + } + data, err := json.Marshal(statefulSet) + if err != nil { + return nil, err + } + name := statefulSet.Name + if name == nil { + return nil, fmt.Errorf("statefulSet.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(statefulsetsResource, c.ns, *name, types.ApplyPatchType, data, "status"), &v1beta1.StatefulSet{}) + + if obj == nil { + return nil, err + } + return obj.(*v1beta1.StatefulSet), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/statefulset.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/statefulset.go index 32ec548ab42e..3f1aebcffb34 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/statefulset.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/statefulset.go @@ -20,12 +20,15 @@ package v1beta1 import ( "context" + json "encoding/json" + "fmt" "time" v1beta1 "k8s.io/api/apps/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + appsv1beta1 "k8s.io/client-go/applyconfigurations/apps/v1beta1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -47,6 +50,8 @@ type StatefulSetInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1beta1.StatefulSetList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta1.StatefulSet, err error) + Apply(ctx context.Context, statefulSet *appsv1beta1.StatefulSetApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.StatefulSet, err error) + ApplyStatus(ctx context.Context, statefulSet *appsv1beta1.StatefulSetApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.StatefulSet, err error) StatefulSetExpansion } @@ -193,3 +198,59 @@ func (c *statefulSets) Patch(ctx context.Context, name string, pt types.PatchTyp Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied statefulSet. +func (c *statefulSets) Apply(ctx context.Context, statefulSet *appsv1beta1.StatefulSetApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.StatefulSet, err error) { + if statefulSet == nil { + return nil, fmt.Errorf("statefulSet provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(statefulSet) + if err != nil { + return nil, err + } + name := statefulSet.Name + if name == nil { + return nil, fmt.Errorf("statefulSet.Name must be provided to Apply") + } + result = &v1beta1.StatefulSet{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("statefulsets"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *statefulSets) ApplyStatus(ctx context.Context, statefulSet *appsv1beta1.StatefulSetApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.StatefulSet, err error) { + if statefulSet == nil { + return nil, fmt.Errorf("statefulSet provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(statefulSet) + if err != nil { + return nil, err + } + + name := statefulSet.Name + if name == nil { + return nil, fmt.Errorf("statefulSet.Name must be provided to Apply") + } + + result = &v1beta1.StatefulSet{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("statefulsets"). + Name(*name). + SubResource("status"). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/BUILD deleted file mode 100644 index 49037ac29419..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/BUILD +++ /dev/null @@ -1,46 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "apps_client.go", - "controllerrevision.go", - "daemonset.go", - "deployment.go", - "doc.go", - "generated_expansion.go", - "replicaset.go", - "statefulset.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2", - importpath = "k8s.io/client-go/kubernetes/typed/apps/v1beta2", - deps = [ - "//staging/src/k8s.io/api/apps/v1beta2:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/controllerrevision.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/controllerrevision.go index e8de2d0fd0a3..e1643277a626 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/controllerrevision.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/controllerrevision.go @@ -20,12 +20,15 @@ package v1beta2 import ( "context" + json "encoding/json" + "fmt" "time" v1beta2 "k8s.io/api/apps/v1beta2" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + appsv1beta2 "k8s.io/client-go/applyconfigurations/apps/v1beta2" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type ControllerRevisionInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1beta2.ControllerRevisionList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta2.ControllerRevision, err error) + Apply(ctx context.Context, controllerRevision *appsv1beta2.ControllerRevisionApplyConfiguration, opts v1.ApplyOptions) (result *v1beta2.ControllerRevision, err error) ControllerRevisionExpansion } @@ -176,3 +180,29 @@ func (c *controllerRevisions) Patch(ctx context.Context, name string, pt types.P Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied controllerRevision. +func (c *controllerRevisions) Apply(ctx context.Context, controllerRevision *appsv1beta2.ControllerRevisionApplyConfiguration, opts v1.ApplyOptions) (result *v1beta2.ControllerRevision, err error) { + if controllerRevision == nil { + return nil, fmt.Errorf("controllerRevision provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(controllerRevision) + if err != nil { + return nil, err + } + name := controllerRevision.Name + if name == nil { + return nil, fmt.Errorf("controllerRevision.Name must be provided to Apply") + } + result = &v1beta2.ControllerRevision{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("controllerrevisions"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/daemonset.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/daemonset.go index 6d3a26d337cf..1391df87d216 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/daemonset.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/daemonset.go @@ -20,12 +20,15 @@ package v1beta2 import ( "context" + json "encoding/json" + "fmt" "time" v1beta2 "k8s.io/api/apps/v1beta2" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + appsv1beta2 "k8s.io/client-go/applyconfigurations/apps/v1beta2" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -47,6 +50,8 @@ type DaemonSetInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1beta2.DaemonSetList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta2.DaemonSet, err error) + Apply(ctx context.Context, daemonSet *appsv1beta2.DaemonSetApplyConfiguration, opts v1.ApplyOptions) (result *v1beta2.DaemonSet, err error) + ApplyStatus(ctx context.Context, daemonSet *appsv1beta2.DaemonSetApplyConfiguration, opts v1.ApplyOptions) (result *v1beta2.DaemonSet, err error) DaemonSetExpansion } @@ -193,3 +198,59 @@ func (c *daemonSets) Patch(ctx context.Context, name string, pt types.PatchType, Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied daemonSet. +func (c *daemonSets) Apply(ctx context.Context, daemonSet *appsv1beta2.DaemonSetApplyConfiguration, opts v1.ApplyOptions) (result *v1beta2.DaemonSet, err error) { + if daemonSet == nil { + return nil, fmt.Errorf("daemonSet provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(daemonSet) + if err != nil { + return nil, err + } + name := daemonSet.Name + if name == nil { + return nil, fmt.Errorf("daemonSet.Name must be provided to Apply") + } + result = &v1beta2.DaemonSet{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("daemonsets"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *daemonSets) ApplyStatus(ctx context.Context, daemonSet *appsv1beta2.DaemonSetApplyConfiguration, opts v1.ApplyOptions) (result *v1beta2.DaemonSet, err error) { + if daemonSet == nil { + return nil, fmt.Errorf("daemonSet provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(daemonSet) + if err != nil { + return nil, err + } + + name := daemonSet.Name + if name == nil { + return nil, fmt.Errorf("daemonSet.Name must be provided to Apply") + } + + result = &v1beta2.DaemonSet{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("daemonsets"). + Name(*name). + SubResource("status"). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/deployment.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/deployment.go index 2cdb539ef9f0..5bda0d92c11a 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/deployment.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/deployment.go @@ -20,12 +20,15 @@ package v1beta2 import ( "context" + json "encoding/json" + "fmt" "time" v1beta2 "k8s.io/api/apps/v1beta2" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + appsv1beta2 "k8s.io/client-go/applyconfigurations/apps/v1beta2" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -47,6 +50,8 @@ type DeploymentInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1beta2.DeploymentList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta2.Deployment, err error) + Apply(ctx context.Context, deployment *appsv1beta2.DeploymentApplyConfiguration, opts v1.ApplyOptions) (result *v1beta2.Deployment, err error) + ApplyStatus(ctx context.Context, deployment *appsv1beta2.DeploymentApplyConfiguration, opts v1.ApplyOptions) (result *v1beta2.Deployment, err error) DeploymentExpansion } @@ -193,3 +198,59 @@ func (c *deployments) Patch(ctx context.Context, name string, pt types.PatchType Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied deployment. +func (c *deployments) Apply(ctx context.Context, deployment *appsv1beta2.DeploymentApplyConfiguration, opts v1.ApplyOptions) (result *v1beta2.Deployment, err error) { + if deployment == nil { + return nil, fmt.Errorf("deployment provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(deployment) + if err != nil { + return nil, err + } + name := deployment.Name + if name == nil { + return nil, fmt.Errorf("deployment.Name must be provided to Apply") + } + result = &v1beta2.Deployment{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("deployments"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *deployments) ApplyStatus(ctx context.Context, deployment *appsv1beta2.DeploymentApplyConfiguration, opts v1.ApplyOptions) (result *v1beta2.Deployment, err error) { + if deployment == nil { + return nil, fmt.Errorf("deployment provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(deployment) + if err != nil { + return nil, err + } + + name := deployment.Name + if name == nil { + return nil, fmt.Errorf("deployment.Name must be provided to Apply") + } + + result = &v1beta2.Deployment{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("deployments"). + Name(*name). + SubResource("status"). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/BUILD deleted file mode 100644 index 642f08c79c55..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_apps_client.go", - "fake_controllerrevision.go", - "fake_daemonset.go", - "fake_deployment.go", - "fake_replicaset.go", - "fake_statefulset.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake", - importpath = "k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake", - deps = [ - "//staging/src/k8s.io/api/apps/v1beta2:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/apps/v1beta2:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_controllerrevision.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_controllerrevision.go index a29d7eb58460..90015d915e5e 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_controllerrevision.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_controllerrevision.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1beta2 "k8s.io/api/apps/v1beta2" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + appsv1beta2 "k8s.io/client-go/applyconfigurations/apps/v1beta2" testing "k8s.io/client-go/testing" ) @@ -128,3 +131,25 @@ func (c *FakeControllerRevisions) Patch(ctx context.Context, name string, pt typ } return obj.(*v1beta2.ControllerRevision), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied controllerRevision. +func (c *FakeControllerRevisions) Apply(ctx context.Context, controllerRevision *appsv1beta2.ControllerRevisionApplyConfiguration, opts v1.ApplyOptions) (result *v1beta2.ControllerRevision, err error) { + if controllerRevision == nil { + return nil, fmt.Errorf("controllerRevision provided to Apply must not be nil") + } + data, err := json.Marshal(controllerRevision) + if err != nil { + return nil, err + } + name := controllerRevision.Name + if name == nil { + return nil, fmt.Errorf("controllerRevision.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(controllerrevisionsResource, c.ns, *name, types.ApplyPatchType, data), &v1beta2.ControllerRevision{}) + + if obj == nil { + return nil, err + } + return obj.(*v1beta2.ControllerRevision), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_daemonset.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_daemonset.go index 3e355e582ff9..ef29e2ff8708 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_daemonset.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_daemonset.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1beta2 "k8s.io/api/apps/v1beta2" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + appsv1beta2 "k8s.io/client-go/applyconfigurations/apps/v1beta2" testing "k8s.io/client-go/testing" ) @@ -140,3 +143,48 @@ func (c *FakeDaemonSets) Patch(ctx context.Context, name string, pt types.PatchT } return obj.(*v1beta2.DaemonSet), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied daemonSet. +func (c *FakeDaemonSets) Apply(ctx context.Context, daemonSet *appsv1beta2.DaemonSetApplyConfiguration, opts v1.ApplyOptions) (result *v1beta2.DaemonSet, err error) { + if daemonSet == nil { + return nil, fmt.Errorf("daemonSet provided to Apply must not be nil") + } + data, err := json.Marshal(daemonSet) + if err != nil { + return nil, err + } + name := daemonSet.Name + if name == nil { + return nil, fmt.Errorf("daemonSet.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(daemonsetsResource, c.ns, *name, types.ApplyPatchType, data), &v1beta2.DaemonSet{}) + + if obj == nil { + return nil, err + } + return obj.(*v1beta2.DaemonSet), err +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *FakeDaemonSets) ApplyStatus(ctx context.Context, daemonSet *appsv1beta2.DaemonSetApplyConfiguration, opts v1.ApplyOptions) (result *v1beta2.DaemonSet, err error) { + if daemonSet == nil { + return nil, fmt.Errorf("daemonSet provided to Apply must not be nil") + } + data, err := json.Marshal(daemonSet) + if err != nil { + return nil, err + } + name := daemonSet.Name + if name == nil { + return nil, fmt.Errorf("daemonSet.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(daemonsetsResource, c.ns, *name, types.ApplyPatchType, data, "status"), &v1beta2.DaemonSet{}) + + if obj == nil { + return nil, err + } + return obj.(*v1beta2.DaemonSet), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_deployment.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_deployment.go index c01fddb33345..e11b3ffd3a1b 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_deployment.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_deployment.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1beta2 "k8s.io/api/apps/v1beta2" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + appsv1beta2 "k8s.io/client-go/applyconfigurations/apps/v1beta2" testing "k8s.io/client-go/testing" ) @@ -140,3 +143,48 @@ func (c *FakeDeployments) Patch(ctx context.Context, name string, pt types.Patch } return obj.(*v1beta2.Deployment), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied deployment. +func (c *FakeDeployments) Apply(ctx context.Context, deployment *appsv1beta2.DeploymentApplyConfiguration, opts v1.ApplyOptions) (result *v1beta2.Deployment, err error) { + if deployment == nil { + return nil, fmt.Errorf("deployment provided to Apply must not be nil") + } + data, err := json.Marshal(deployment) + if err != nil { + return nil, err + } + name := deployment.Name + if name == nil { + return nil, fmt.Errorf("deployment.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(deploymentsResource, c.ns, *name, types.ApplyPatchType, data), &v1beta2.Deployment{}) + + if obj == nil { + return nil, err + } + return obj.(*v1beta2.Deployment), err +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *FakeDeployments) ApplyStatus(ctx context.Context, deployment *appsv1beta2.DeploymentApplyConfiguration, opts v1.ApplyOptions) (result *v1beta2.Deployment, err error) { + if deployment == nil { + return nil, fmt.Errorf("deployment provided to Apply must not be nil") + } + data, err := json.Marshal(deployment) + if err != nil { + return nil, err + } + name := deployment.Name + if name == nil { + return nil, fmt.Errorf("deployment.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(deploymentsResource, c.ns, *name, types.ApplyPatchType, data, "status"), &v1beta2.Deployment{}) + + if obj == nil { + return nil, err + } + return obj.(*v1beta2.Deployment), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_replicaset.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_replicaset.go index 1f623d297679..713b1ec6eec5 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_replicaset.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_replicaset.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1beta2 "k8s.io/api/apps/v1beta2" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + appsv1beta2 "k8s.io/client-go/applyconfigurations/apps/v1beta2" testing "k8s.io/client-go/testing" ) @@ -140,3 +143,48 @@ func (c *FakeReplicaSets) Patch(ctx context.Context, name string, pt types.Patch } return obj.(*v1beta2.ReplicaSet), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied replicaSet. +func (c *FakeReplicaSets) Apply(ctx context.Context, replicaSet *appsv1beta2.ReplicaSetApplyConfiguration, opts v1.ApplyOptions) (result *v1beta2.ReplicaSet, err error) { + if replicaSet == nil { + return nil, fmt.Errorf("replicaSet provided to Apply must not be nil") + } + data, err := json.Marshal(replicaSet) + if err != nil { + return nil, err + } + name := replicaSet.Name + if name == nil { + return nil, fmt.Errorf("replicaSet.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(replicasetsResource, c.ns, *name, types.ApplyPatchType, data), &v1beta2.ReplicaSet{}) + + if obj == nil { + return nil, err + } + return obj.(*v1beta2.ReplicaSet), err +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *FakeReplicaSets) ApplyStatus(ctx context.Context, replicaSet *appsv1beta2.ReplicaSetApplyConfiguration, opts v1.ApplyOptions) (result *v1beta2.ReplicaSet, err error) { + if replicaSet == nil { + return nil, fmt.Errorf("replicaSet provided to Apply must not be nil") + } + data, err := json.Marshal(replicaSet) + if err != nil { + return nil, err + } + name := replicaSet.Name + if name == nil { + return nil, fmt.Errorf("replicaSet.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(replicasetsResource, c.ns, *name, types.ApplyPatchType, data, "status"), &v1beta2.ReplicaSet{}) + + if obj == nil { + return nil, err + } + return obj.(*v1beta2.ReplicaSet), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_statefulset.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_statefulset.go index 035086e229d7..6b996d4f33fb 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_statefulset.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_statefulset.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1beta2 "k8s.io/api/apps/v1beta2" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + appsv1beta2 "k8s.io/client-go/applyconfigurations/apps/v1beta2" testing "k8s.io/client-go/testing" ) @@ -141,6 +144,51 @@ func (c *FakeStatefulSets) Patch(ctx context.Context, name string, pt types.Patc return obj.(*v1beta2.StatefulSet), err } +// Apply takes the given apply declarative configuration, applies it and returns the applied statefulSet. +func (c *FakeStatefulSets) Apply(ctx context.Context, statefulSet *appsv1beta2.StatefulSetApplyConfiguration, opts v1.ApplyOptions) (result *v1beta2.StatefulSet, err error) { + if statefulSet == nil { + return nil, fmt.Errorf("statefulSet provided to Apply must not be nil") + } + data, err := json.Marshal(statefulSet) + if err != nil { + return nil, err + } + name := statefulSet.Name + if name == nil { + return nil, fmt.Errorf("statefulSet.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(statefulsetsResource, c.ns, *name, types.ApplyPatchType, data), &v1beta2.StatefulSet{}) + + if obj == nil { + return nil, err + } + return obj.(*v1beta2.StatefulSet), err +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *FakeStatefulSets) ApplyStatus(ctx context.Context, statefulSet *appsv1beta2.StatefulSetApplyConfiguration, opts v1.ApplyOptions) (result *v1beta2.StatefulSet, err error) { + if statefulSet == nil { + return nil, fmt.Errorf("statefulSet provided to Apply must not be nil") + } + data, err := json.Marshal(statefulSet) + if err != nil { + return nil, err + } + name := statefulSet.Name + if name == nil { + return nil, fmt.Errorf("statefulSet.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(statefulsetsResource, c.ns, *name, types.ApplyPatchType, data, "status"), &v1beta2.StatefulSet{}) + + if obj == nil { + return nil, err + } + return obj.(*v1beta2.StatefulSet), err +} + // GetScale takes name of the statefulSet, and returns the corresponding scale object, and an error if there is any. func (c *FakeStatefulSets) GetScale(ctx context.Context, statefulSetName string, options v1.GetOptions) (result *v1beta2.Scale, err error) { obj, err := c.Fake. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/replicaset.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/replicaset.go index d7365bebb5db..988d898f79b6 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/replicaset.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/replicaset.go @@ -20,12 +20,15 @@ package v1beta2 import ( "context" + json "encoding/json" + "fmt" "time" v1beta2 "k8s.io/api/apps/v1beta2" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + appsv1beta2 "k8s.io/client-go/applyconfigurations/apps/v1beta2" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -47,6 +50,8 @@ type ReplicaSetInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1beta2.ReplicaSetList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta2.ReplicaSet, err error) + Apply(ctx context.Context, replicaSet *appsv1beta2.ReplicaSetApplyConfiguration, opts v1.ApplyOptions) (result *v1beta2.ReplicaSet, err error) + ApplyStatus(ctx context.Context, replicaSet *appsv1beta2.ReplicaSetApplyConfiguration, opts v1.ApplyOptions) (result *v1beta2.ReplicaSet, err error) ReplicaSetExpansion } @@ -193,3 +198,59 @@ func (c *replicaSets) Patch(ctx context.Context, name string, pt types.PatchType Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied replicaSet. +func (c *replicaSets) Apply(ctx context.Context, replicaSet *appsv1beta2.ReplicaSetApplyConfiguration, opts v1.ApplyOptions) (result *v1beta2.ReplicaSet, err error) { + if replicaSet == nil { + return nil, fmt.Errorf("replicaSet provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(replicaSet) + if err != nil { + return nil, err + } + name := replicaSet.Name + if name == nil { + return nil, fmt.Errorf("replicaSet.Name must be provided to Apply") + } + result = &v1beta2.ReplicaSet{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("replicasets"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *replicaSets) ApplyStatus(ctx context.Context, replicaSet *appsv1beta2.ReplicaSetApplyConfiguration, opts v1.ApplyOptions) (result *v1beta2.ReplicaSet, err error) { + if replicaSet == nil { + return nil, fmt.Errorf("replicaSet provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(replicaSet) + if err != nil { + return nil, err + } + + name := replicaSet.Name + if name == nil { + return nil, fmt.Errorf("replicaSet.Name must be provided to Apply") + } + + result = &v1beta2.ReplicaSet{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("replicasets"). + Name(*name). + SubResource("status"). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/statefulset.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/statefulset.go index 7458316990b8..73a12c9966c7 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/statefulset.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/statefulset.go @@ -20,12 +20,15 @@ package v1beta2 import ( "context" + json "encoding/json" + "fmt" "time" v1beta2 "k8s.io/api/apps/v1beta2" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + appsv1beta2 "k8s.io/client-go/applyconfigurations/apps/v1beta2" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -47,6 +50,8 @@ type StatefulSetInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1beta2.StatefulSetList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta2.StatefulSet, err error) + Apply(ctx context.Context, statefulSet *appsv1beta2.StatefulSetApplyConfiguration, opts v1.ApplyOptions) (result *v1beta2.StatefulSet, err error) + ApplyStatus(ctx context.Context, statefulSet *appsv1beta2.StatefulSetApplyConfiguration, opts v1.ApplyOptions) (result *v1beta2.StatefulSet, err error) GetScale(ctx context.Context, statefulSetName string, options v1.GetOptions) (*v1beta2.Scale, error) UpdateScale(ctx context.Context, statefulSetName string, scale *v1beta2.Scale, opts v1.UpdateOptions) (*v1beta2.Scale, error) @@ -197,6 +202,62 @@ func (c *statefulSets) Patch(ctx context.Context, name string, pt types.PatchTyp return } +// Apply takes the given apply declarative configuration, applies it and returns the applied statefulSet. +func (c *statefulSets) Apply(ctx context.Context, statefulSet *appsv1beta2.StatefulSetApplyConfiguration, opts v1.ApplyOptions) (result *v1beta2.StatefulSet, err error) { + if statefulSet == nil { + return nil, fmt.Errorf("statefulSet provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(statefulSet) + if err != nil { + return nil, err + } + name := statefulSet.Name + if name == nil { + return nil, fmt.Errorf("statefulSet.Name must be provided to Apply") + } + result = &v1beta2.StatefulSet{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("statefulsets"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *statefulSets) ApplyStatus(ctx context.Context, statefulSet *appsv1beta2.StatefulSetApplyConfiguration, opts v1.ApplyOptions) (result *v1beta2.StatefulSet, err error) { + if statefulSet == nil { + return nil, fmt.Errorf("statefulSet provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(statefulSet) + if err != nil { + return nil, err + } + + name := statefulSet.Name + if name == nil { + return nil, fmt.Errorf("statefulSet.Name must be provided to Apply") + } + + result = &v1beta2.StatefulSet{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("statefulsets"). + Name(*name). + SubResource("status"). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + // GetScale takes name of the statefulSet, and returns the corresponding v1beta2.Scale object, and an error if there is any. func (c *statefulSets) GetScale(ctx context.Context, statefulSetName string, options v1.GetOptions) (result *v1beta2.Scale, err error) { result = &v1beta2.Scale{} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/BUILD deleted file mode 100644 index 6de5022f3a3b..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "authentication_client.go", - "doc.go", - "generated_expansion.go", - "tokenreview.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1", - importpath = "k8s.io/client-go/kubernetes/typed/authentication/v1", - deps = [ - "//staging/src/k8s.io/api/authentication/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/authentication/v1/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/fake/BUILD deleted file mode 100644 index ae3591ec0468..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/fake/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_authentication_client.go", - "fake_tokenreview.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/fake", - importpath = "k8s.io/client-go/kubernetes/typed/authentication/v1/fake", - deps = [ - "//staging/src/k8s.io/api/authentication/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/authentication/v1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/BUILD deleted file mode 100644 index d6255e5109d2..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "authentication_client.go", - "doc.go", - "generated_expansion.go", - "tokenreview.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1", - importpath = "k8s.io/client-go/kubernetes/typed/authentication/v1beta1", - deps = [ - "//staging/src/k8s.io/api/authentication/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/fake/BUILD deleted file mode 100644 index 3e6f85182b11..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/fake/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_authentication_client.go", - "fake_tokenreview.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/fake", - importpath = "k8s.io/client-go/kubernetes/typed/authentication/v1beta1/fake", - deps = [ - "//staging/src/k8s.io/api/authentication/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/authentication/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/BUILD deleted file mode 100644 index ec4ee12021c3..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "authorization_client.go", - "doc.go", - "generated_expansion.go", - "localsubjectaccessreview.go", - "selfsubjectaccessreview.go", - "selfsubjectrulesreview.go", - "subjectaccessreview.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1", - importpath = "k8s.io/client-go/kubernetes/typed/authorization/v1", - deps = [ - "//staging/src/k8s.io/api/authorization/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/authorization/v1/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/fake/BUILD deleted file mode 100644 index 0a27a1109852..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/fake/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_authorization_client.go", - "fake_localsubjectaccessreview.go", - "fake_selfsubjectaccessreview.go", - "fake_selfsubjectrulesreview.go", - "fake_subjectaccessreview.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/fake", - importpath = "k8s.io/client-go/kubernetes/typed/authorization/v1/fake", - deps = [ - "//staging/src/k8s.io/api/authorization/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/authorization/v1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/BUILD deleted file mode 100644 index e2904c06bdc0..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "authorization_client.go", - "doc.go", - "generated_expansion.go", - "localsubjectaccessreview.go", - "selfsubjectaccessreview.go", - "selfsubjectrulesreview.go", - "subjectaccessreview.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1", - importpath = "k8s.io/client-go/kubernetes/typed/authorization/v1beta1", - deps = [ - "//staging/src/k8s.io/api/authorization/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/fake/BUILD deleted file mode 100644 index 4f552fe52d5f..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/fake/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_authorization_client.go", - "fake_localsubjectaccessreview.go", - "fake_selfsubjectaccessreview.go", - "fake_selfsubjectrulesreview.go", - "fake_subjectaccessreview.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/fake", - importpath = "k8s.io/client-go/kubernetes/typed/authorization/v1beta1/fake", - deps = [ - "//staging/src/k8s.io/api/authorization/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/authorization/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/BUILD deleted file mode 100644 index 26e0a702f72f..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "autoscaling_client.go", - "doc.go", - "generated_expansion.go", - "horizontalpodautoscaler.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1", - importpath = "k8s.io/client-go/kubernetes/typed/autoscaling/v1", - deps = [ - "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/autoscaling/v1/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/fake/BUILD deleted file mode 100644 index c9e7ec4a1cd1..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/fake/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_autoscaling_client.go", - "fake_horizontalpodautoscaler.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/fake", - importpath = "k8s.io/client-go/kubernetes/typed/autoscaling/v1/fake", - deps = [ - "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/autoscaling/v1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/fake/fake_horizontalpodautoscaler.go b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/fake/fake_horizontalpodautoscaler.go index 82b8709a9490..2c54f08ef867 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/fake/fake_horizontalpodautoscaler.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/fake/fake_horizontalpodautoscaler.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" autoscalingv1 "k8s.io/api/autoscaling/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + applyconfigurationsautoscalingv1 "k8s.io/client-go/applyconfigurations/autoscaling/v1" testing "k8s.io/client-go/testing" ) @@ -140,3 +143,48 @@ func (c *FakeHorizontalPodAutoscalers) Patch(ctx context.Context, name string, p } return obj.(*autoscalingv1.HorizontalPodAutoscaler), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied horizontalPodAutoscaler. +func (c *FakeHorizontalPodAutoscalers) Apply(ctx context.Context, horizontalPodAutoscaler *applyconfigurationsautoscalingv1.HorizontalPodAutoscalerApplyConfiguration, opts v1.ApplyOptions) (result *autoscalingv1.HorizontalPodAutoscaler, err error) { + if horizontalPodAutoscaler == nil { + return nil, fmt.Errorf("horizontalPodAutoscaler provided to Apply must not be nil") + } + data, err := json.Marshal(horizontalPodAutoscaler) + if err != nil { + return nil, err + } + name := horizontalPodAutoscaler.Name + if name == nil { + return nil, fmt.Errorf("horizontalPodAutoscaler.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(horizontalpodautoscalersResource, c.ns, *name, types.ApplyPatchType, data), &autoscalingv1.HorizontalPodAutoscaler{}) + + if obj == nil { + return nil, err + } + return obj.(*autoscalingv1.HorizontalPodAutoscaler), err +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *FakeHorizontalPodAutoscalers) ApplyStatus(ctx context.Context, horizontalPodAutoscaler *applyconfigurationsautoscalingv1.HorizontalPodAutoscalerApplyConfiguration, opts v1.ApplyOptions) (result *autoscalingv1.HorizontalPodAutoscaler, err error) { + if horizontalPodAutoscaler == nil { + return nil, fmt.Errorf("horizontalPodAutoscaler provided to Apply must not be nil") + } + data, err := json.Marshal(horizontalPodAutoscaler) + if err != nil { + return nil, err + } + name := horizontalPodAutoscaler.Name + if name == nil { + return nil, fmt.Errorf("horizontalPodAutoscaler.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(horizontalpodautoscalersResource, c.ns, *name, types.ApplyPatchType, data, "status"), &autoscalingv1.HorizontalPodAutoscaler{}) + + if obj == nil { + return nil, err + } + return obj.(*autoscalingv1.HorizontalPodAutoscaler), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/horizontalpodautoscaler.go b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/horizontalpodautoscaler.go index ca8e0da8ba07..19afde66db5f 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/horizontalpodautoscaler.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/horizontalpodautoscaler.go @@ -20,12 +20,15 @@ package v1 import ( "context" + json "encoding/json" + "fmt" "time" v1 "k8s.io/api/autoscaling/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + autoscalingv1 "k8s.io/client-go/applyconfigurations/autoscaling/v1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -47,6 +50,8 @@ type HorizontalPodAutoscalerInterface interface { List(ctx context.Context, opts metav1.ListOptions) (*v1.HorizontalPodAutoscalerList, error) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.HorizontalPodAutoscaler, err error) + Apply(ctx context.Context, horizontalPodAutoscaler *autoscalingv1.HorizontalPodAutoscalerApplyConfiguration, opts metav1.ApplyOptions) (result *v1.HorizontalPodAutoscaler, err error) + ApplyStatus(ctx context.Context, horizontalPodAutoscaler *autoscalingv1.HorizontalPodAutoscalerApplyConfiguration, opts metav1.ApplyOptions) (result *v1.HorizontalPodAutoscaler, err error) HorizontalPodAutoscalerExpansion } @@ -193,3 +198,59 @@ func (c *horizontalPodAutoscalers) Patch(ctx context.Context, name string, pt ty Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied horizontalPodAutoscaler. +func (c *horizontalPodAutoscalers) Apply(ctx context.Context, horizontalPodAutoscaler *autoscalingv1.HorizontalPodAutoscalerApplyConfiguration, opts metav1.ApplyOptions) (result *v1.HorizontalPodAutoscaler, err error) { + if horizontalPodAutoscaler == nil { + return nil, fmt.Errorf("horizontalPodAutoscaler provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(horizontalPodAutoscaler) + if err != nil { + return nil, err + } + name := horizontalPodAutoscaler.Name + if name == nil { + return nil, fmt.Errorf("horizontalPodAutoscaler.Name must be provided to Apply") + } + result = &v1.HorizontalPodAutoscaler{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("horizontalpodautoscalers"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *horizontalPodAutoscalers) ApplyStatus(ctx context.Context, horizontalPodAutoscaler *autoscalingv1.HorizontalPodAutoscalerApplyConfiguration, opts metav1.ApplyOptions) (result *v1.HorizontalPodAutoscaler, err error) { + if horizontalPodAutoscaler == nil { + return nil, fmt.Errorf("horizontalPodAutoscaler provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(horizontalPodAutoscaler) + if err != nil { + return nil, err + } + + name := horizontalPodAutoscaler.Name + if name == nil { + return nil, fmt.Errorf("horizontalPodAutoscaler.Name must be provided to Apply") + } + + result = &v1.HorizontalPodAutoscaler{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("horizontalpodautoscalers"). + Name(*name). + SubResource("status"). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/BUILD deleted file mode 100644 index ef889c2d3206..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "autoscaling_client.go", - "doc.go", - "generated_expansion.go", - "horizontalpodautoscaler.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1", - importpath = "k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/autoscaling/v2beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/fake:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/fake/BUILD deleted file mode 100644 index 90a65333d345..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/fake/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_autoscaling_client.go", - "fake_horizontalpodautoscaler.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/fake", - importpath = "k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/fake", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/autoscaling/v2beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/fake/fake_horizontalpodautoscaler.go b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/fake/fake_horizontalpodautoscaler.go index 292d01814b0f..4967ca8f0d02 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/fake/fake_horizontalpodautoscaler.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/fake/fake_horizontalpodautoscaler.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v2beta1 "k8s.io/api/autoscaling/v2beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + autoscalingv2beta1 "k8s.io/client-go/applyconfigurations/autoscaling/v2beta1" testing "k8s.io/client-go/testing" ) @@ -140,3 +143,48 @@ func (c *FakeHorizontalPodAutoscalers) Patch(ctx context.Context, name string, p } return obj.(*v2beta1.HorizontalPodAutoscaler), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied horizontalPodAutoscaler. +func (c *FakeHorizontalPodAutoscalers) Apply(ctx context.Context, horizontalPodAutoscaler *autoscalingv2beta1.HorizontalPodAutoscalerApplyConfiguration, opts v1.ApplyOptions) (result *v2beta1.HorizontalPodAutoscaler, err error) { + if horizontalPodAutoscaler == nil { + return nil, fmt.Errorf("horizontalPodAutoscaler provided to Apply must not be nil") + } + data, err := json.Marshal(horizontalPodAutoscaler) + if err != nil { + return nil, err + } + name := horizontalPodAutoscaler.Name + if name == nil { + return nil, fmt.Errorf("horizontalPodAutoscaler.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(horizontalpodautoscalersResource, c.ns, *name, types.ApplyPatchType, data), &v2beta1.HorizontalPodAutoscaler{}) + + if obj == nil { + return nil, err + } + return obj.(*v2beta1.HorizontalPodAutoscaler), err +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *FakeHorizontalPodAutoscalers) ApplyStatus(ctx context.Context, horizontalPodAutoscaler *autoscalingv2beta1.HorizontalPodAutoscalerApplyConfiguration, opts v1.ApplyOptions) (result *v2beta1.HorizontalPodAutoscaler, err error) { + if horizontalPodAutoscaler == nil { + return nil, fmt.Errorf("horizontalPodAutoscaler provided to Apply must not be nil") + } + data, err := json.Marshal(horizontalPodAutoscaler) + if err != nil { + return nil, err + } + name := horizontalPodAutoscaler.Name + if name == nil { + return nil, fmt.Errorf("horizontalPodAutoscaler.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(horizontalpodautoscalersResource, c.ns, *name, types.ApplyPatchType, data, "status"), &v2beta1.HorizontalPodAutoscaler{}) + + if obj == nil { + return nil, err + } + return obj.(*v2beta1.HorizontalPodAutoscaler), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/horizontalpodautoscaler.go b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/horizontalpodautoscaler.go index f1637c1b85b0..5080912a1247 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/horizontalpodautoscaler.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/horizontalpodautoscaler.go @@ -20,12 +20,15 @@ package v2beta1 import ( "context" + json "encoding/json" + "fmt" "time" v2beta1 "k8s.io/api/autoscaling/v2beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + autoscalingv2beta1 "k8s.io/client-go/applyconfigurations/autoscaling/v2beta1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -47,6 +50,8 @@ type HorizontalPodAutoscalerInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v2beta1.HorizontalPodAutoscalerList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v2beta1.HorizontalPodAutoscaler, err error) + Apply(ctx context.Context, horizontalPodAutoscaler *autoscalingv2beta1.HorizontalPodAutoscalerApplyConfiguration, opts v1.ApplyOptions) (result *v2beta1.HorizontalPodAutoscaler, err error) + ApplyStatus(ctx context.Context, horizontalPodAutoscaler *autoscalingv2beta1.HorizontalPodAutoscalerApplyConfiguration, opts v1.ApplyOptions) (result *v2beta1.HorizontalPodAutoscaler, err error) HorizontalPodAutoscalerExpansion } @@ -193,3 +198,59 @@ func (c *horizontalPodAutoscalers) Patch(ctx context.Context, name string, pt ty Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied horizontalPodAutoscaler. +func (c *horizontalPodAutoscalers) Apply(ctx context.Context, horizontalPodAutoscaler *autoscalingv2beta1.HorizontalPodAutoscalerApplyConfiguration, opts v1.ApplyOptions) (result *v2beta1.HorizontalPodAutoscaler, err error) { + if horizontalPodAutoscaler == nil { + return nil, fmt.Errorf("horizontalPodAutoscaler provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(horizontalPodAutoscaler) + if err != nil { + return nil, err + } + name := horizontalPodAutoscaler.Name + if name == nil { + return nil, fmt.Errorf("horizontalPodAutoscaler.Name must be provided to Apply") + } + result = &v2beta1.HorizontalPodAutoscaler{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("horizontalpodautoscalers"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *horizontalPodAutoscalers) ApplyStatus(ctx context.Context, horizontalPodAutoscaler *autoscalingv2beta1.HorizontalPodAutoscalerApplyConfiguration, opts v1.ApplyOptions) (result *v2beta1.HorizontalPodAutoscaler, err error) { + if horizontalPodAutoscaler == nil { + return nil, fmt.Errorf("horizontalPodAutoscaler provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(horizontalPodAutoscaler) + if err != nil { + return nil, err + } + + name := horizontalPodAutoscaler.Name + if name == nil { + return nil, fmt.Errorf("horizontalPodAutoscaler.Name must be provided to Apply") + } + + result = &v2beta1.HorizontalPodAutoscaler{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("horizontalpodautoscalers"). + Name(*name). + SubResource("status"). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/BUILD deleted file mode 100644 index 557a987ff60a..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "autoscaling_client.go", - "doc.go", - "generated_expansion.go", - "horizontalpodautoscaler.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2", - importpath = "k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/autoscaling/v2beta2:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/fake:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/fake/BUILD deleted file mode 100644 index 5d1ddd5b02c3..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/fake/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_autoscaling_client.go", - "fake_horizontalpodautoscaler.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/fake", - importpath = "k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/fake", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/autoscaling/v2beta2:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/fake/fake_horizontalpodautoscaler.go b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/fake/fake_horizontalpodautoscaler.go index 845568b3311a..d0033434084f 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/fake/fake_horizontalpodautoscaler.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/fake/fake_horizontalpodautoscaler.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v2beta2 "k8s.io/api/autoscaling/v2beta2" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + autoscalingv2beta2 "k8s.io/client-go/applyconfigurations/autoscaling/v2beta2" testing "k8s.io/client-go/testing" ) @@ -140,3 +143,48 @@ func (c *FakeHorizontalPodAutoscalers) Patch(ctx context.Context, name string, p } return obj.(*v2beta2.HorizontalPodAutoscaler), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied horizontalPodAutoscaler. +func (c *FakeHorizontalPodAutoscalers) Apply(ctx context.Context, horizontalPodAutoscaler *autoscalingv2beta2.HorizontalPodAutoscalerApplyConfiguration, opts v1.ApplyOptions) (result *v2beta2.HorizontalPodAutoscaler, err error) { + if horizontalPodAutoscaler == nil { + return nil, fmt.Errorf("horizontalPodAutoscaler provided to Apply must not be nil") + } + data, err := json.Marshal(horizontalPodAutoscaler) + if err != nil { + return nil, err + } + name := horizontalPodAutoscaler.Name + if name == nil { + return nil, fmt.Errorf("horizontalPodAutoscaler.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(horizontalpodautoscalersResource, c.ns, *name, types.ApplyPatchType, data), &v2beta2.HorizontalPodAutoscaler{}) + + if obj == nil { + return nil, err + } + return obj.(*v2beta2.HorizontalPodAutoscaler), err +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *FakeHorizontalPodAutoscalers) ApplyStatus(ctx context.Context, horizontalPodAutoscaler *autoscalingv2beta2.HorizontalPodAutoscalerApplyConfiguration, opts v1.ApplyOptions) (result *v2beta2.HorizontalPodAutoscaler, err error) { + if horizontalPodAutoscaler == nil { + return nil, fmt.Errorf("horizontalPodAutoscaler provided to Apply must not be nil") + } + data, err := json.Marshal(horizontalPodAutoscaler) + if err != nil { + return nil, err + } + name := horizontalPodAutoscaler.Name + if name == nil { + return nil, fmt.Errorf("horizontalPodAutoscaler.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(horizontalpodautoscalersResource, c.ns, *name, types.ApplyPatchType, data, "status"), &v2beta2.HorizontalPodAutoscaler{}) + + if obj == nil { + return nil, err + } + return obj.(*v2beta2.HorizontalPodAutoscaler), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/horizontalpodautoscaler.go b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/horizontalpodautoscaler.go index c7fad108087b..0ddb9108b3a0 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/horizontalpodautoscaler.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/horizontalpodautoscaler.go @@ -20,12 +20,15 @@ package v2beta2 import ( "context" + json "encoding/json" + "fmt" "time" v2beta2 "k8s.io/api/autoscaling/v2beta2" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + autoscalingv2beta2 "k8s.io/client-go/applyconfigurations/autoscaling/v2beta2" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -47,6 +50,8 @@ type HorizontalPodAutoscalerInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v2beta2.HorizontalPodAutoscalerList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v2beta2.HorizontalPodAutoscaler, err error) + Apply(ctx context.Context, horizontalPodAutoscaler *autoscalingv2beta2.HorizontalPodAutoscalerApplyConfiguration, opts v1.ApplyOptions) (result *v2beta2.HorizontalPodAutoscaler, err error) + ApplyStatus(ctx context.Context, horizontalPodAutoscaler *autoscalingv2beta2.HorizontalPodAutoscalerApplyConfiguration, opts v1.ApplyOptions) (result *v2beta2.HorizontalPodAutoscaler, err error) HorizontalPodAutoscalerExpansion } @@ -193,3 +198,59 @@ func (c *horizontalPodAutoscalers) Patch(ctx context.Context, name string, pt ty Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied horizontalPodAutoscaler. +func (c *horizontalPodAutoscalers) Apply(ctx context.Context, horizontalPodAutoscaler *autoscalingv2beta2.HorizontalPodAutoscalerApplyConfiguration, opts v1.ApplyOptions) (result *v2beta2.HorizontalPodAutoscaler, err error) { + if horizontalPodAutoscaler == nil { + return nil, fmt.Errorf("horizontalPodAutoscaler provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(horizontalPodAutoscaler) + if err != nil { + return nil, err + } + name := horizontalPodAutoscaler.Name + if name == nil { + return nil, fmt.Errorf("horizontalPodAutoscaler.Name must be provided to Apply") + } + result = &v2beta2.HorizontalPodAutoscaler{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("horizontalpodautoscalers"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *horizontalPodAutoscalers) ApplyStatus(ctx context.Context, horizontalPodAutoscaler *autoscalingv2beta2.HorizontalPodAutoscalerApplyConfiguration, opts v1.ApplyOptions) (result *v2beta2.HorizontalPodAutoscaler, err error) { + if horizontalPodAutoscaler == nil { + return nil, fmt.Errorf("horizontalPodAutoscaler provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(horizontalPodAutoscaler) + if err != nil { + return nil, err + } + + name := horizontalPodAutoscaler.Name + if name == nil { + return nil, fmt.Errorf("horizontalPodAutoscaler.Name must be provided to Apply") + } + + result = &v2beta2.HorizontalPodAutoscaler{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("horizontalpodautoscalers"). + Name(*name). + SubResource("status"). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/BUILD deleted file mode 100644 index d2f3452b57d7..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "batch_client.go", - "doc.go", - "generated_expansion.go", - "job.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/batch/v1", - importpath = "k8s.io/client-go/kubernetes/typed/batch/v1", - deps = [ - "//staging/src/k8s.io/api/batch/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/batch/v1/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/batch_client.go b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/batch_client.go index 8dfc118a3215..ba414eebc781 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/batch_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/batch_client.go @@ -26,6 +26,7 @@ import ( type BatchV1Interface interface { RESTClient() rest.Interface + CronJobsGetter JobsGetter } @@ -34,6 +35,10 @@ type BatchV1Client struct { restClient rest.Interface } +func (c *BatchV1Client) CronJobs(namespace string) CronJobInterface { + return newCronJobs(c, namespace) +} + func (c *BatchV1Client) Jobs(namespace string) JobInterface { return newJobs(c, namespace) } diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/cronjob.go b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/cronjob.go new file mode 100644 index 000000000000..9250263215e4 --- /dev/null +++ b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/cronjob.go @@ -0,0 +1,256 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package v1 + +import ( + "context" + json "encoding/json" + "fmt" + "time" + + v1 "k8s.io/api/batch/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + batchv1 "k8s.io/client-go/applyconfigurations/batch/v1" + scheme "k8s.io/client-go/kubernetes/scheme" + rest "k8s.io/client-go/rest" +) + +// CronJobsGetter has a method to return a CronJobInterface. +// A group's client should implement this interface. +type CronJobsGetter interface { + CronJobs(namespace string) CronJobInterface +} + +// CronJobInterface has methods to work with CronJob resources. +type CronJobInterface interface { + Create(ctx context.Context, cronJob *v1.CronJob, opts metav1.CreateOptions) (*v1.CronJob, error) + Update(ctx context.Context, cronJob *v1.CronJob, opts metav1.UpdateOptions) (*v1.CronJob, error) + UpdateStatus(ctx context.Context, cronJob *v1.CronJob, opts metav1.UpdateOptions) (*v1.CronJob, error) + Delete(ctx context.Context, name string, opts metav1.DeleteOptions) error + DeleteCollection(ctx context.Context, opts metav1.DeleteOptions, listOpts metav1.ListOptions) error + Get(ctx context.Context, name string, opts metav1.GetOptions) (*v1.CronJob, error) + List(ctx context.Context, opts metav1.ListOptions) (*v1.CronJobList, error) + Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) + Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.CronJob, err error) + Apply(ctx context.Context, cronJob *batchv1.CronJobApplyConfiguration, opts metav1.ApplyOptions) (result *v1.CronJob, err error) + ApplyStatus(ctx context.Context, cronJob *batchv1.CronJobApplyConfiguration, opts metav1.ApplyOptions) (result *v1.CronJob, err error) + CronJobExpansion +} + +// cronJobs implements CronJobInterface +type cronJobs struct { + client rest.Interface + ns string +} + +// newCronJobs returns a CronJobs +func newCronJobs(c *BatchV1Client, namespace string) *cronJobs { + return &cronJobs{ + client: c.RESTClient(), + ns: namespace, + } +} + +// Get takes name of the cronJob, and returns the corresponding cronJob object, and an error if there is any. +func (c *cronJobs) Get(ctx context.Context, name string, options metav1.GetOptions) (result *v1.CronJob, err error) { + result = &v1.CronJob{} + err = c.client.Get(). + Namespace(c.ns). + Resource("cronjobs"). + Name(name). + VersionedParams(&options, scheme.ParameterCodec). + Do(ctx). + Into(result) + return +} + +// List takes label and field selectors, and returns the list of CronJobs that match those selectors. +func (c *cronJobs) List(ctx context.Context, opts metav1.ListOptions) (result *v1.CronJobList, err error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + result = &v1.CronJobList{} + err = c.client.Get(). + Namespace(c.ns). + Resource("cronjobs"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Do(ctx). + Into(result) + return +} + +// Watch returns a watch.Interface that watches the requested cronJobs. +func (c *cronJobs) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + opts.Watch = true + return c.client.Get(). + Namespace(c.ns). + Resource("cronjobs"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Watch(ctx) +} + +// Create takes the representation of a cronJob and creates it. Returns the server's representation of the cronJob, and an error, if there is any. +func (c *cronJobs) Create(ctx context.Context, cronJob *v1.CronJob, opts metav1.CreateOptions) (result *v1.CronJob, err error) { + result = &v1.CronJob{} + err = c.client.Post(). + Namespace(c.ns). + Resource("cronjobs"). + VersionedParams(&opts, scheme.ParameterCodec). + Body(cronJob). + Do(ctx). + Into(result) + return +} + +// Update takes the representation of a cronJob and updates it. Returns the server's representation of the cronJob, and an error, if there is any. +func (c *cronJobs) Update(ctx context.Context, cronJob *v1.CronJob, opts metav1.UpdateOptions) (result *v1.CronJob, err error) { + result = &v1.CronJob{} + err = c.client.Put(). + Namespace(c.ns). + Resource("cronjobs"). + Name(cronJob.Name). + VersionedParams(&opts, scheme.ParameterCodec). + Body(cronJob). + Do(ctx). + Into(result) + return +} + +// UpdateStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). +func (c *cronJobs) UpdateStatus(ctx context.Context, cronJob *v1.CronJob, opts metav1.UpdateOptions) (result *v1.CronJob, err error) { + result = &v1.CronJob{} + err = c.client.Put(). + Namespace(c.ns). + Resource("cronjobs"). + Name(cronJob.Name). + SubResource("status"). + VersionedParams(&opts, scheme.ParameterCodec). + Body(cronJob). + Do(ctx). + Into(result) + return +} + +// Delete takes name of the cronJob and deletes it. Returns an error if one occurs. +func (c *cronJobs) Delete(ctx context.Context, name string, opts metav1.DeleteOptions) error { + return c.client.Delete(). + Namespace(c.ns). + Resource("cronjobs"). + Name(name). + Body(&opts). + Do(ctx). + Error() +} + +// DeleteCollection deletes a collection of objects. +func (c *cronJobs) DeleteCollection(ctx context.Context, opts metav1.DeleteOptions, listOpts metav1.ListOptions) error { + var timeout time.Duration + if listOpts.TimeoutSeconds != nil { + timeout = time.Duration(*listOpts.TimeoutSeconds) * time.Second + } + return c.client.Delete(). + Namespace(c.ns). + Resource("cronjobs"). + VersionedParams(&listOpts, scheme.ParameterCodec). + Timeout(timeout). + Body(&opts). + Do(ctx). + Error() +} + +// Patch applies the patch and returns the patched cronJob. +func (c *cronJobs) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.CronJob, err error) { + result = &v1.CronJob{} + err = c.client.Patch(pt). + Namespace(c.ns). + Resource("cronjobs"). + Name(name). + SubResource(subresources...). + VersionedParams(&opts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// Apply takes the given apply declarative configuration, applies it and returns the applied cronJob. +func (c *cronJobs) Apply(ctx context.Context, cronJob *batchv1.CronJobApplyConfiguration, opts metav1.ApplyOptions) (result *v1.CronJob, err error) { + if cronJob == nil { + return nil, fmt.Errorf("cronJob provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(cronJob) + if err != nil { + return nil, err + } + name := cronJob.Name + if name == nil { + return nil, fmt.Errorf("cronJob.Name must be provided to Apply") + } + result = &v1.CronJob{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("cronjobs"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *cronJobs) ApplyStatus(ctx context.Context, cronJob *batchv1.CronJobApplyConfiguration, opts metav1.ApplyOptions) (result *v1.CronJob, err error) { + if cronJob == nil { + return nil, fmt.Errorf("cronJob provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(cronJob) + if err != nil { + return nil, err + } + + name := cronJob.Name + if name == nil { + return nil, fmt.Errorf("cronJob.Name must be provided to Apply") + } + + result = &v1.CronJob{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("cronjobs"). + Name(*name). + SubResource("status"). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/fake/BUILD deleted file mode 100644 index 4231f2f09a0f..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/fake/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_batch_client.go", - "fake_job.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/fake", - importpath = "k8s.io/client-go/kubernetes/typed/batch/v1/fake", - deps = [ - "//staging/src/k8s.io/api/batch/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/batch/v1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/fake/fake_batch_client.go b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/fake/fake_batch_client.go index c90dd75616d9..43d5b0d309a9 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/fake/fake_batch_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/fake/fake_batch_client.go @@ -28,6 +28,10 @@ type FakeBatchV1 struct { *testing.Fake } +func (c *FakeBatchV1) CronJobs(namespace string) v1.CronJobInterface { + return &FakeCronJobs{c, namespace} +} + func (c *FakeBatchV1) Jobs(namespace string) v1.JobInterface { return &FakeJobs{c, namespace} } diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/fake/fake_cronjob.go b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/fake/fake_cronjob.go new file mode 100644 index 000000000000..05441e4cf85d --- /dev/null +++ b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/fake/fake_cronjob.go @@ -0,0 +1,190 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package fake + +import ( + "context" + json "encoding/json" + "fmt" + + batchv1 "k8s.io/api/batch/v1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + labels "k8s.io/apimachinery/pkg/labels" + schema "k8s.io/apimachinery/pkg/runtime/schema" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + applyconfigurationsbatchv1 "k8s.io/client-go/applyconfigurations/batch/v1" + testing "k8s.io/client-go/testing" +) + +// FakeCronJobs implements CronJobInterface +type FakeCronJobs struct { + Fake *FakeBatchV1 + ns string +} + +var cronjobsResource = schema.GroupVersionResource{Group: "batch", Version: "v1", Resource: "cronjobs"} + +var cronjobsKind = schema.GroupVersionKind{Group: "batch", Version: "v1", Kind: "CronJob"} + +// Get takes name of the cronJob, and returns the corresponding cronJob object, and an error if there is any. +func (c *FakeCronJobs) Get(ctx context.Context, name string, options v1.GetOptions) (result *batchv1.CronJob, err error) { + obj, err := c.Fake. + Invokes(testing.NewGetAction(cronjobsResource, c.ns, name), &batchv1.CronJob{}) + + if obj == nil { + return nil, err + } + return obj.(*batchv1.CronJob), err +} + +// List takes label and field selectors, and returns the list of CronJobs that match those selectors. +func (c *FakeCronJobs) List(ctx context.Context, opts v1.ListOptions) (result *batchv1.CronJobList, err error) { + obj, err := c.Fake. + Invokes(testing.NewListAction(cronjobsResource, cronjobsKind, c.ns, opts), &batchv1.CronJobList{}) + + if obj == nil { + return nil, err + } + + label, _, _ := testing.ExtractFromListOptions(opts) + if label == nil { + label = labels.Everything() + } + list := &batchv1.CronJobList{ListMeta: obj.(*batchv1.CronJobList).ListMeta} + for _, item := range obj.(*batchv1.CronJobList).Items { + if label.Matches(labels.Set(item.Labels)) { + list.Items = append(list.Items, item) + } + } + return list, err +} + +// Watch returns a watch.Interface that watches the requested cronJobs. +func (c *FakeCronJobs) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) { + return c.Fake. + InvokesWatch(testing.NewWatchAction(cronjobsResource, c.ns, opts)) + +} + +// Create takes the representation of a cronJob and creates it. Returns the server's representation of the cronJob, and an error, if there is any. +func (c *FakeCronJobs) Create(ctx context.Context, cronJob *batchv1.CronJob, opts v1.CreateOptions) (result *batchv1.CronJob, err error) { + obj, err := c.Fake. + Invokes(testing.NewCreateAction(cronjobsResource, c.ns, cronJob), &batchv1.CronJob{}) + + if obj == nil { + return nil, err + } + return obj.(*batchv1.CronJob), err +} + +// Update takes the representation of a cronJob and updates it. Returns the server's representation of the cronJob, and an error, if there is any. +func (c *FakeCronJobs) Update(ctx context.Context, cronJob *batchv1.CronJob, opts v1.UpdateOptions) (result *batchv1.CronJob, err error) { + obj, err := c.Fake. + Invokes(testing.NewUpdateAction(cronjobsResource, c.ns, cronJob), &batchv1.CronJob{}) + + if obj == nil { + return nil, err + } + return obj.(*batchv1.CronJob), err +} + +// UpdateStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). +func (c *FakeCronJobs) UpdateStatus(ctx context.Context, cronJob *batchv1.CronJob, opts v1.UpdateOptions) (*batchv1.CronJob, error) { + obj, err := c.Fake. + Invokes(testing.NewUpdateSubresourceAction(cronjobsResource, "status", c.ns, cronJob), &batchv1.CronJob{}) + + if obj == nil { + return nil, err + } + return obj.(*batchv1.CronJob), err +} + +// Delete takes name of the cronJob and deletes it. Returns an error if one occurs. +func (c *FakeCronJobs) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error { + _, err := c.Fake. + Invokes(testing.NewDeleteAction(cronjobsResource, c.ns, name), &batchv1.CronJob{}) + + return err +} + +// DeleteCollection deletes a collection of objects. +func (c *FakeCronJobs) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error { + action := testing.NewDeleteCollectionAction(cronjobsResource, c.ns, listOpts) + + _, err := c.Fake.Invokes(action, &batchv1.CronJobList{}) + return err +} + +// Patch applies the patch and returns the patched cronJob. +func (c *FakeCronJobs) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *batchv1.CronJob, err error) { + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(cronjobsResource, c.ns, name, pt, data, subresources...), &batchv1.CronJob{}) + + if obj == nil { + return nil, err + } + return obj.(*batchv1.CronJob), err +} + +// Apply takes the given apply declarative configuration, applies it and returns the applied cronJob. +func (c *FakeCronJobs) Apply(ctx context.Context, cronJob *applyconfigurationsbatchv1.CronJobApplyConfiguration, opts v1.ApplyOptions) (result *batchv1.CronJob, err error) { + if cronJob == nil { + return nil, fmt.Errorf("cronJob provided to Apply must not be nil") + } + data, err := json.Marshal(cronJob) + if err != nil { + return nil, err + } + name := cronJob.Name + if name == nil { + return nil, fmt.Errorf("cronJob.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(cronjobsResource, c.ns, *name, types.ApplyPatchType, data), &batchv1.CronJob{}) + + if obj == nil { + return nil, err + } + return obj.(*batchv1.CronJob), err +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *FakeCronJobs) ApplyStatus(ctx context.Context, cronJob *applyconfigurationsbatchv1.CronJobApplyConfiguration, opts v1.ApplyOptions) (result *batchv1.CronJob, err error) { + if cronJob == nil { + return nil, fmt.Errorf("cronJob provided to Apply must not be nil") + } + data, err := json.Marshal(cronJob) + if err != nil { + return nil, err + } + name := cronJob.Name + if name == nil { + return nil, fmt.Errorf("cronJob.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(cronjobsResource, c.ns, *name, types.ApplyPatchType, data, "status"), &batchv1.CronJob{}) + + if obj == nil { + return nil, err + } + return obj.(*batchv1.CronJob), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/fake/fake_job.go b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/fake/fake_job.go index 45c0ad1ee783..8da3bb13c80b 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/fake/fake_job.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/fake/fake_job.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" batchv1 "k8s.io/api/batch/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + applyconfigurationsbatchv1 "k8s.io/client-go/applyconfigurations/batch/v1" testing "k8s.io/client-go/testing" ) @@ -140,3 +143,48 @@ func (c *FakeJobs) Patch(ctx context.Context, name string, pt types.PatchType, d } return obj.(*batchv1.Job), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied job. +func (c *FakeJobs) Apply(ctx context.Context, job *applyconfigurationsbatchv1.JobApplyConfiguration, opts v1.ApplyOptions) (result *batchv1.Job, err error) { + if job == nil { + return nil, fmt.Errorf("job provided to Apply must not be nil") + } + data, err := json.Marshal(job) + if err != nil { + return nil, err + } + name := job.Name + if name == nil { + return nil, fmt.Errorf("job.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(jobsResource, c.ns, *name, types.ApplyPatchType, data), &batchv1.Job{}) + + if obj == nil { + return nil, err + } + return obj.(*batchv1.Job), err +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *FakeJobs) ApplyStatus(ctx context.Context, job *applyconfigurationsbatchv1.JobApplyConfiguration, opts v1.ApplyOptions) (result *batchv1.Job, err error) { + if job == nil { + return nil, fmt.Errorf("job provided to Apply must not be nil") + } + data, err := json.Marshal(job) + if err != nil { + return nil, err + } + name := job.Name + if name == nil { + return nil, fmt.Errorf("job.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(jobsResource, c.ns, *name, types.ApplyPatchType, data, "status"), &batchv1.Job{}) + + if obj == nil { + return nil, err + } + return obj.(*batchv1.Job), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/generated_expansion.go b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/generated_expansion.go index dc4142934e7a..cd74884be706 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/generated_expansion.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/generated_expansion.go @@ -18,4 +18,6 @@ limitations under the License. package v1 +type CronJobExpansion interface{} + type JobExpansion interface{} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/job.go b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/job.go index a20c8e0e4e4d..c076c80af2a7 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/job.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/job.go @@ -20,12 +20,15 @@ package v1 import ( "context" + json "encoding/json" + "fmt" "time" v1 "k8s.io/api/batch/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + batchv1 "k8s.io/client-go/applyconfigurations/batch/v1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -47,6 +50,8 @@ type JobInterface interface { List(ctx context.Context, opts metav1.ListOptions) (*v1.JobList, error) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.Job, err error) + Apply(ctx context.Context, job *batchv1.JobApplyConfiguration, opts metav1.ApplyOptions) (result *v1.Job, err error) + ApplyStatus(ctx context.Context, job *batchv1.JobApplyConfiguration, opts metav1.ApplyOptions) (result *v1.Job, err error) JobExpansion } @@ -193,3 +198,59 @@ func (c *jobs) Patch(ctx context.Context, name string, pt types.PatchType, data Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied job. +func (c *jobs) Apply(ctx context.Context, job *batchv1.JobApplyConfiguration, opts metav1.ApplyOptions) (result *v1.Job, err error) { + if job == nil { + return nil, fmt.Errorf("job provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(job) + if err != nil { + return nil, err + } + name := job.Name + if name == nil { + return nil, fmt.Errorf("job.Name must be provided to Apply") + } + result = &v1.Job{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("jobs"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *jobs) ApplyStatus(ctx context.Context, job *batchv1.JobApplyConfiguration, opts metav1.ApplyOptions) (result *v1.Job, err error) { + if job == nil { + return nil, fmt.Errorf("job provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(job) + if err != nil { + return nil, err + } + + name := job.Name + if name == nil { + return nil, fmt.Errorf("job.Name must be provided to Apply") + } + + result = &v1.Job{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("jobs"). + Name(*name). + SubResource("status"). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/BUILD deleted file mode 100644 index 4ece1df20f93..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "batch_client.go", - "cronjob.go", - "doc.go", - "generated_expansion.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1", - importpath = "k8s.io/client-go/kubernetes/typed/batch/v1beta1", - deps = [ - "//staging/src/k8s.io/api/batch/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/batch/v1beta1/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/cronjob.go b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/cronjob.go index 076520296b54..d687339ae9d1 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/cronjob.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/cronjob.go @@ -20,12 +20,15 @@ package v1beta1 import ( "context" + json "encoding/json" + "fmt" "time" v1beta1 "k8s.io/api/batch/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + batchv1beta1 "k8s.io/client-go/applyconfigurations/batch/v1beta1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -47,6 +50,8 @@ type CronJobInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1beta1.CronJobList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta1.CronJob, err error) + Apply(ctx context.Context, cronJob *batchv1beta1.CronJobApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.CronJob, err error) + ApplyStatus(ctx context.Context, cronJob *batchv1beta1.CronJobApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.CronJob, err error) CronJobExpansion } @@ -193,3 +198,59 @@ func (c *cronJobs) Patch(ctx context.Context, name string, pt types.PatchType, d Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied cronJob. +func (c *cronJobs) Apply(ctx context.Context, cronJob *batchv1beta1.CronJobApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.CronJob, err error) { + if cronJob == nil { + return nil, fmt.Errorf("cronJob provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(cronJob) + if err != nil { + return nil, err + } + name := cronJob.Name + if name == nil { + return nil, fmt.Errorf("cronJob.Name must be provided to Apply") + } + result = &v1beta1.CronJob{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("cronjobs"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *cronJobs) ApplyStatus(ctx context.Context, cronJob *batchv1beta1.CronJobApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.CronJob, err error) { + if cronJob == nil { + return nil, fmt.Errorf("cronJob provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(cronJob) + if err != nil { + return nil, err + } + + name := cronJob.Name + if name == nil { + return nil, fmt.Errorf("cronJob.Name must be provided to Apply") + } + + result = &v1beta1.CronJob{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("cronjobs"). + Name(*name). + SubResource("status"). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/fake/BUILD deleted file mode 100644 index 28822b4ceb23..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/fake/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_batch_client.go", - "fake_cronjob.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/fake", - importpath = "k8s.io/client-go/kubernetes/typed/batch/v1beta1/fake", - deps = [ - "//staging/src/k8s.io/api/batch/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/batch/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/fake/fake_cronjob.go b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/fake/fake_cronjob.go index 303b7506a1fb..959b5cfe5a67 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/fake/fake_cronjob.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/fake/fake_cronjob.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1beta1 "k8s.io/api/batch/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + batchv1beta1 "k8s.io/client-go/applyconfigurations/batch/v1beta1" testing "k8s.io/client-go/testing" ) @@ -140,3 +143,48 @@ func (c *FakeCronJobs) Patch(ctx context.Context, name string, pt types.PatchTyp } return obj.(*v1beta1.CronJob), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied cronJob. +func (c *FakeCronJobs) Apply(ctx context.Context, cronJob *batchv1beta1.CronJobApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.CronJob, err error) { + if cronJob == nil { + return nil, fmt.Errorf("cronJob provided to Apply must not be nil") + } + data, err := json.Marshal(cronJob) + if err != nil { + return nil, err + } + name := cronJob.Name + if name == nil { + return nil, fmt.Errorf("cronJob.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(cronjobsResource, c.ns, *name, types.ApplyPatchType, data), &v1beta1.CronJob{}) + + if obj == nil { + return nil, err + } + return obj.(*v1beta1.CronJob), err +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *FakeCronJobs) ApplyStatus(ctx context.Context, cronJob *batchv1beta1.CronJobApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.CronJob, err error) { + if cronJob == nil { + return nil, fmt.Errorf("cronJob provided to Apply must not be nil") + } + data, err := json.Marshal(cronJob) + if err != nil { + return nil, err + } + name := cronJob.Name + if name == nil { + return nil, fmt.Errorf("cronJob.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(cronjobsResource, c.ns, *name, types.ApplyPatchType, data, "status"), &v1beta1.CronJob{}) + + if obj == nil { + return nil, err + } + return obj.(*v1beta1.CronJob), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/BUILD deleted file mode 100644 index 6f3d11ecb90e..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "batch_client.go", - "cronjob.go", - "doc.go", - "generated_expansion.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1", - importpath = "k8s.io/client-go/kubernetes/typed/batch/v2alpha1", - deps = [ - "//staging/src/k8s.io/api/batch/v2alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/batch_client.go b/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/batch_client.go deleted file mode 100644 index d45c19d521f4..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/batch_client.go +++ /dev/null @@ -1,89 +0,0 @@ -/* -Copyright The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by client-gen. DO NOT EDIT. - -package v2alpha1 - -import ( - v2alpha1 "k8s.io/api/batch/v2alpha1" - "k8s.io/client-go/kubernetes/scheme" - rest "k8s.io/client-go/rest" -) - -type BatchV2alpha1Interface interface { - RESTClient() rest.Interface - CronJobsGetter -} - -// BatchV2alpha1Client is used to interact with features provided by the batch group. -type BatchV2alpha1Client struct { - restClient rest.Interface -} - -func (c *BatchV2alpha1Client) CronJobs(namespace string) CronJobInterface { - return newCronJobs(c, namespace) -} - -// NewForConfig creates a new BatchV2alpha1Client for the given config. -func NewForConfig(c *rest.Config) (*BatchV2alpha1Client, error) { - config := *c - if err := setConfigDefaults(&config); err != nil { - return nil, err - } - client, err := rest.RESTClientFor(&config) - if err != nil { - return nil, err - } - return &BatchV2alpha1Client{client}, nil -} - -// NewForConfigOrDie creates a new BatchV2alpha1Client for the given config and -// panics if there is an error in the config. -func NewForConfigOrDie(c *rest.Config) *BatchV2alpha1Client { - client, err := NewForConfig(c) - if err != nil { - panic(err) - } - return client -} - -// New creates a new BatchV2alpha1Client for the given RESTClient. -func New(c rest.Interface) *BatchV2alpha1Client { - return &BatchV2alpha1Client{c} -} - -func setConfigDefaults(config *rest.Config) error { - gv := v2alpha1.SchemeGroupVersion - config.GroupVersion = &gv - config.APIPath = "/apis" - config.NegotiatedSerializer = scheme.Codecs.WithoutConversion() - - if config.UserAgent == "" { - config.UserAgent = rest.DefaultKubernetesUserAgent() - } - - return nil -} - -// RESTClient returns a RESTClient that is used to communicate -// with API server by this client implementation. -func (c *BatchV2alpha1Client) RESTClient() rest.Interface { - if c == nil { - return nil - } - return c.restClient -} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/cronjob.go b/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/cronjob.go deleted file mode 100644 index a25054f24432..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/cronjob.go +++ /dev/null @@ -1,195 +0,0 @@ -/* -Copyright The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by client-gen. DO NOT EDIT. - -package v2alpha1 - -import ( - "context" - "time" - - v2alpha1 "k8s.io/api/batch/v2alpha1" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - types "k8s.io/apimachinery/pkg/types" - watch "k8s.io/apimachinery/pkg/watch" - scheme "k8s.io/client-go/kubernetes/scheme" - rest "k8s.io/client-go/rest" -) - -// CronJobsGetter has a method to return a CronJobInterface. -// A group's client should implement this interface. -type CronJobsGetter interface { - CronJobs(namespace string) CronJobInterface -} - -// CronJobInterface has methods to work with CronJob resources. -type CronJobInterface interface { - Create(ctx context.Context, cronJob *v2alpha1.CronJob, opts v1.CreateOptions) (*v2alpha1.CronJob, error) - Update(ctx context.Context, cronJob *v2alpha1.CronJob, opts v1.UpdateOptions) (*v2alpha1.CronJob, error) - UpdateStatus(ctx context.Context, cronJob *v2alpha1.CronJob, opts v1.UpdateOptions) (*v2alpha1.CronJob, error) - Delete(ctx context.Context, name string, opts v1.DeleteOptions) error - DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error - Get(ctx context.Context, name string, opts v1.GetOptions) (*v2alpha1.CronJob, error) - List(ctx context.Context, opts v1.ListOptions) (*v2alpha1.CronJobList, error) - Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) - Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v2alpha1.CronJob, err error) - CronJobExpansion -} - -// cronJobs implements CronJobInterface -type cronJobs struct { - client rest.Interface - ns string -} - -// newCronJobs returns a CronJobs -func newCronJobs(c *BatchV2alpha1Client, namespace string) *cronJobs { - return &cronJobs{ - client: c.RESTClient(), - ns: namespace, - } -} - -// Get takes name of the cronJob, and returns the corresponding cronJob object, and an error if there is any. -func (c *cronJobs) Get(ctx context.Context, name string, options v1.GetOptions) (result *v2alpha1.CronJob, err error) { - result = &v2alpha1.CronJob{} - err = c.client.Get(). - Namespace(c.ns). - Resource("cronjobs"). - Name(name). - VersionedParams(&options, scheme.ParameterCodec). - Do(ctx). - Into(result) - return -} - -// List takes label and field selectors, and returns the list of CronJobs that match those selectors. -func (c *cronJobs) List(ctx context.Context, opts v1.ListOptions) (result *v2alpha1.CronJobList, err error) { - var timeout time.Duration - if opts.TimeoutSeconds != nil { - timeout = time.Duration(*opts.TimeoutSeconds) * time.Second - } - result = &v2alpha1.CronJobList{} - err = c.client.Get(). - Namespace(c.ns). - Resource("cronjobs"). - VersionedParams(&opts, scheme.ParameterCodec). - Timeout(timeout). - Do(ctx). - Into(result) - return -} - -// Watch returns a watch.Interface that watches the requested cronJobs. -func (c *cronJobs) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) { - var timeout time.Duration - if opts.TimeoutSeconds != nil { - timeout = time.Duration(*opts.TimeoutSeconds) * time.Second - } - opts.Watch = true - return c.client.Get(). - Namespace(c.ns). - Resource("cronjobs"). - VersionedParams(&opts, scheme.ParameterCodec). - Timeout(timeout). - Watch(ctx) -} - -// Create takes the representation of a cronJob and creates it. Returns the server's representation of the cronJob, and an error, if there is any. -func (c *cronJobs) Create(ctx context.Context, cronJob *v2alpha1.CronJob, opts v1.CreateOptions) (result *v2alpha1.CronJob, err error) { - result = &v2alpha1.CronJob{} - err = c.client.Post(). - Namespace(c.ns). - Resource("cronjobs"). - VersionedParams(&opts, scheme.ParameterCodec). - Body(cronJob). - Do(ctx). - Into(result) - return -} - -// Update takes the representation of a cronJob and updates it. Returns the server's representation of the cronJob, and an error, if there is any. -func (c *cronJobs) Update(ctx context.Context, cronJob *v2alpha1.CronJob, opts v1.UpdateOptions) (result *v2alpha1.CronJob, err error) { - result = &v2alpha1.CronJob{} - err = c.client.Put(). - Namespace(c.ns). - Resource("cronjobs"). - Name(cronJob.Name). - VersionedParams(&opts, scheme.ParameterCodec). - Body(cronJob). - Do(ctx). - Into(result) - return -} - -// UpdateStatus was generated because the type contains a Status member. -// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). -func (c *cronJobs) UpdateStatus(ctx context.Context, cronJob *v2alpha1.CronJob, opts v1.UpdateOptions) (result *v2alpha1.CronJob, err error) { - result = &v2alpha1.CronJob{} - err = c.client.Put(). - Namespace(c.ns). - Resource("cronjobs"). - Name(cronJob.Name). - SubResource("status"). - VersionedParams(&opts, scheme.ParameterCodec). - Body(cronJob). - Do(ctx). - Into(result) - return -} - -// Delete takes name of the cronJob and deletes it. Returns an error if one occurs. -func (c *cronJobs) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error { - return c.client.Delete(). - Namespace(c.ns). - Resource("cronjobs"). - Name(name). - Body(&opts). - Do(ctx). - Error() -} - -// DeleteCollection deletes a collection of objects. -func (c *cronJobs) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error { - var timeout time.Duration - if listOpts.TimeoutSeconds != nil { - timeout = time.Duration(*listOpts.TimeoutSeconds) * time.Second - } - return c.client.Delete(). - Namespace(c.ns). - Resource("cronjobs"). - VersionedParams(&listOpts, scheme.ParameterCodec). - Timeout(timeout). - Body(&opts). - Do(ctx). - Error() -} - -// Patch applies the patch and returns the patched cronJob. -func (c *cronJobs) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v2alpha1.CronJob, err error) { - result = &v2alpha1.CronJob{} - err = c.client.Patch(pt). - Namespace(c.ns). - Resource("cronjobs"). - Name(name). - SubResource(subresources...). - VersionedParams(&opts, scheme.ParameterCodec). - Body(data). - Do(ctx). - Into(result) - return -} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/doc.go deleted file mode 100644 index 3efe0d284424..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/doc.go +++ /dev/null @@ -1,20 +0,0 @@ -/* -Copyright The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by client-gen. DO NOT EDIT. - -// This package has the automatically generated typed clients. -package v2alpha1 diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/fake/BUILD deleted file mode 100644 index 4bbb8a29396d..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/fake/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_batch_client.go", - "fake_cronjob.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/fake", - importpath = "k8s.io/client-go/kubernetes/typed/batch/v2alpha1/fake", - deps = [ - "//staging/src/k8s.io/api/batch/v2alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/batch/v2alpha1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/fake/fake_batch_client.go b/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/fake/fake_batch_client.go deleted file mode 100644 index 3e478cde9de7..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/fake/fake_batch_client.go +++ /dev/null @@ -1,40 +0,0 @@ -/* -Copyright The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by client-gen. DO NOT EDIT. - -package fake - -import ( - v2alpha1 "k8s.io/client-go/kubernetes/typed/batch/v2alpha1" - rest "k8s.io/client-go/rest" - testing "k8s.io/client-go/testing" -) - -type FakeBatchV2alpha1 struct { - *testing.Fake -} - -func (c *FakeBatchV2alpha1) CronJobs(namespace string) v2alpha1.CronJobInterface { - return &FakeCronJobs{c, namespace} -} - -// RESTClient returns a RESTClient that is used to communicate -// with API server by this client implementation. -func (c *FakeBatchV2alpha1) RESTClient() rest.Interface { - var ret *rest.RESTClient - return ret -} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/fake/fake_cronjob.go b/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/fake/fake_cronjob.go deleted file mode 100644 index 3cd1bc159fb3..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/fake/fake_cronjob.go +++ /dev/null @@ -1,142 +0,0 @@ -/* -Copyright The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by client-gen. DO NOT EDIT. - -package fake - -import ( - "context" - - v2alpha1 "k8s.io/api/batch/v2alpha1" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - labels "k8s.io/apimachinery/pkg/labels" - schema "k8s.io/apimachinery/pkg/runtime/schema" - types "k8s.io/apimachinery/pkg/types" - watch "k8s.io/apimachinery/pkg/watch" - testing "k8s.io/client-go/testing" -) - -// FakeCronJobs implements CronJobInterface -type FakeCronJobs struct { - Fake *FakeBatchV2alpha1 - ns string -} - -var cronjobsResource = schema.GroupVersionResource{Group: "batch", Version: "v2alpha1", Resource: "cronjobs"} - -var cronjobsKind = schema.GroupVersionKind{Group: "batch", Version: "v2alpha1", Kind: "CronJob"} - -// Get takes name of the cronJob, and returns the corresponding cronJob object, and an error if there is any. -func (c *FakeCronJobs) Get(ctx context.Context, name string, options v1.GetOptions) (result *v2alpha1.CronJob, err error) { - obj, err := c.Fake. - Invokes(testing.NewGetAction(cronjobsResource, c.ns, name), &v2alpha1.CronJob{}) - - if obj == nil { - return nil, err - } - return obj.(*v2alpha1.CronJob), err -} - -// List takes label and field selectors, and returns the list of CronJobs that match those selectors. -func (c *FakeCronJobs) List(ctx context.Context, opts v1.ListOptions) (result *v2alpha1.CronJobList, err error) { - obj, err := c.Fake. - Invokes(testing.NewListAction(cronjobsResource, cronjobsKind, c.ns, opts), &v2alpha1.CronJobList{}) - - if obj == nil { - return nil, err - } - - label, _, _ := testing.ExtractFromListOptions(opts) - if label == nil { - label = labels.Everything() - } - list := &v2alpha1.CronJobList{ListMeta: obj.(*v2alpha1.CronJobList).ListMeta} - for _, item := range obj.(*v2alpha1.CronJobList).Items { - if label.Matches(labels.Set(item.Labels)) { - list.Items = append(list.Items, item) - } - } - return list, err -} - -// Watch returns a watch.Interface that watches the requested cronJobs. -func (c *FakeCronJobs) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) { - return c.Fake. - InvokesWatch(testing.NewWatchAction(cronjobsResource, c.ns, opts)) - -} - -// Create takes the representation of a cronJob and creates it. Returns the server's representation of the cronJob, and an error, if there is any. -func (c *FakeCronJobs) Create(ctx context.Context, cronJob *v2alpha1.CronJob, opts v1.CreateOptions) (result *v2alpha1.CronJob, err error) { - obj, err := c.Fake. - Invokes(testing.NewCreateAction(cronjobsResource, c.ns, cronJob), &v2alpha1.CronJob{}) - - if obj == nil { - return nil, err - } - return obj.(*v2alpha1.CronJob), err -} - -// Update takes the representation of a cronJob and updates it. Returns the server's representation of the cronJob, and an error, if there is any. -func (c *FakeCronJobs) Update(ctx context.Context, cronJob *v2alpha1.CronJob, opts v1.UpdateOptions) (result *v2alpha1.CronJob, err error) { - obj, err := c.Fake. - Invokes(testing.NewUpdateAction(cronjobsResource, c.ns, cronJob), &v2alpha1.CronJob{}) - - if obj == nil { - return nil, err - } - return obj.(*v2alpha1.CronJob), err -} - -// UpdateStatus was generated because the type contains a Status member. -// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). -func (c *FakeCronJobs) UpdateStatus(ctx context.Context, cronJob *v2alpha1.CronJob, opts v1.UpdateOptions) (*v2alpha1.CronJob, error) { - obj, err := c.Fake. - Invokes(testing.NewUpdateSubresourceAction(cronjobsResource, "status", c.ns, cronJob), &v2alpha1.CronJob{}) - - if obj == nil { - return nil, err - } - return obj.(*v2alpha1.CronJob), err -} - -// Delete takes name of the cronJob and deletes it. Returns an error if one occurs. -func (c *FakeCronJobs) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error { - _, err := c.Fake. - Invokes(testing.NewDeleteAction(cronjobsResource, c.ns, name), &v2alpha1.CronJob{}) - - return err -} - -// DeleteCollection deletes a collection of objects. -func (c *FakeCronJobs) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error { - action := testing.NewDeleteCollectionAction(cronjobsResource, c.ns, listOpts) - - _, err := c.Fake.Invokes(action, &v2alpha1.CronJobList{}) - return err -} - -// Patch applies the patch and returns the patched cronJob. -func (c *FakeCronJobs) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v2alpha1.CronJob, err error) { - obj, err := c.Fake. - Invokes(testing.NewPatchSubresourceAction(cronjobsResource, c.ns, name, pt, data, subresources...), &v2alpha1.CronJob{}) - - if obj == nil { - return nil, err - } - return obj.(*v2alpha1.CronJob), err -} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/generated_expansion.go b/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/generated_expansion.go deleted file mode 100644 index 34dafc464a8c..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/generated_expansion.go +++ /dev/null @@ -1,21 +0,0 @@ -/* -Copyright The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by client-gen. DO NOT EDIT. - -package v2alpha1 - -type CronJobExpansion interface{} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1/BUILD deleted file mode 100644 index d96e2d3cf2bf..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "certificates_client.go", - "certificatesigningrequest.go", - "doc.go", - "generated_expansion.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1", - importpath = "k8s.io/client-go/kubernetes/typed/certificates/v1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/certificates/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/certificates/v1/fake:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1/certificatesigningrequest.go b/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1/certificatesigningrequest.go index 28f74b2729c0..0d6b68b29623 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1/certificatesigningrequest.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1/certificatesigningrequest.go @@ -20,12 +20,15 @@ package v1 import ( "context" + json "encoding/json" + "fmt" "time" v1 "k8s.io/api/certificates/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + certificatesv1 "k8s.io/client-go/applyconfigurations/certificates/v1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -47,6 +50,8 @@ type CertificateSigningRequestInterface interface { List(ctx context.Context, opts metav1.ListOptions) (*v1.CertificateSigningRequestList, error) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.CertificateSigningRequest, err error) + Apply(ctx context.Context, certificateSigningRequest *certificatesv1.CertificateSigningRequestApplyConfiguration, opts metav1.ApplyOptions) (result *v1.CertificateSigningRequest, err error) + ApplyStatus(ctx context.Context, certificateSigningRequest *certificatesv1.CertificateSigningRequestApplyConfiguration, opts metav1.ApplyOptions) (result *v1.CertificateSigningRequest, err error) UpdateApproval(ctx context.Context, certificateSigningRequestName string, certificateSigningRequest *v1.CertificateSigningRequest, opts metav1.UpdateOptions) (*v1.CertificateSigningRequest, error) CertificateSigningRequestExpansion @@ -185,6 +190,60 @@ func (c *certificateSigningRequests) Patch(ctx context.Context, name string, pt return } +// Apply takes the given apply declarative configuration, applies it and returns the applied certificateSigningRequest. +func (c *certificateSigningRequests) Apply(ctx context.Context, certificateSigningRequest *certificatesv1.CertificateSigningRequestApplyConfiguration, opts metav1.ApplyOptions) (result *v1.CertificateSigningRequest, err error) { + if certificateSigningRequest == nil { + return nil, fmt.Errorf("certificateSigningRequest provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(certificateSigningRequest) + if err != nil { + return nil, err + } + name := certificateSigningRequest.Name + if name == nil { + return nil, fmt.Errorf("certificateSigningRequest.Name must be provided to Apply") + } + result = &v1.CertificateSigningRequest{} + err = c.client.Patch(types.ApplyPatchType). + Resource("certificatesigningrequests"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *certificateSigningRequests) ApplyStatus(ctx context.Context, certificateSigningRequest *certificatesv1.CertificateSigningRequestApplyConfiguration, opts metav1.ApplyOptions) (result *v1.CertificateSigningRequest, err error) { + if certificateSigningRequest == nil { + return nil, fmt.Errorf("certificateSigningRequest provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(certificateSigningRequest) + if err != nil { + return nil, err + } + + name := certificateSigningRequest.Name + if name == nil { + return nil, fmt.Errorf("certificateSigningRequest.Name must be provided to Apply") + } + + result = &v1.CertificateSigningRequest{} + err = c.client.Patch(types.ApplyPatchType). + Resource("certificatesigningrequests"). + Name(*name). + SubResource("status"). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + // UpdateApproval takes the top resource name and the representation of a certificateSigningRequest and updates it. Returns the server's representation of the certificateSigningRequest, and an error, if there is any. func (c *certificateSigningRequests) UpdateApproval(ctx context.Context, certificateSigningRequestName string, certificateSigningRequest *v1.CertificateSigningRequest, opts metav1.UpdateOptions) (result *v1.CertificateSigningRequest, err error) { result = &v1.CertificateSigningRequest{} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1/fake/BUILD deleted file mode 100644 index 5ecc04c160a0..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1/fake/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_certificates_client.go", - "fake_certificatesigningrequest.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1/fake", - importpath = "k8s.io/client-go/kubernetes/typed/certificates/v1/fake", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/certificates/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/certificates/v1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1/fake/fake_certificatesigningrequest.go b/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1/fake/fake_certificatesigningrequest.go index 1e5d9c2eff1b..acb9e579ec93 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1/fake/fake_certificatesigningrequest.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1/fake/fake_certificatesigningrequest.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" certificatesv1 "k8s.io/api/certificates/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + applyconfigurationscertificatesv1 "k8s.io/client-go/applyconfigurations/certificates/v1" testing "k8s.io/client-go/testing" ) @@ -132,6 +135,49 @@ func (c *FakeCertificateSigningRequests) Patch(ctx context.Context, name string, return obj.(*certificatesv1.CertificateSigningRequest), err } +// Apply takes the given apply declarative configuration, applies it and returns the applied certificateSigningRequest. +func (c *FakeCertificateSigningRequests) Apply(ctx context.Context, certificateSigningRequest *applyconfigurationscertificatesv1.CertificateSigningRequestApplyConfiguration, opts v1.ApplyOptions) (result *certificatesv1.CertificateSigningRequest, err error) { + if certificateSigningRequest == nil { + return nil, fmt.Errorf("certificateSigningRequest provided to Apply must not be nil") + } + data, err := json.Marshal(certificateSigningRequest) + if err != nil { + return nil, err + } + name := certificateSigningRequest.Name + if name == nil { + return nil, fmt.Errorf("certificateSigningRequest.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(certificatesigningrequestsResource, *name, types.ApplyPatchType, data), &certificatesv1.CertificateSigningRequest{}) + if obj == nil { + return nil, err + } + return obj.(*certificatesv1.CertificateSigningRequest), err +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *FakeCertificateSigningRequests) ApplyStatus(ctx context.Context, certificateSigningRequest *applyconfigurationscertificatesv1.CertificateSigningRequestApplyConfiguration, opts v1.ApplyOptions) (result *certificatesv1.CertificateSigningRequest, err error) { + if certificateSigningRequest == nil { + return nil, fmt.Errorf("certificateSigningRequest provided to Apply must not be nil") + } + data, err := json.Marshal(certificateSigningRequest) + if err != nil { + return nil, err + } + name := certificateSigningRequest.Name + if name == nil { + return nil, fmt.Errorf("certificateSigningRequest.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(certificatesigningrequestsResource, *name, types.ApplyPatchType, data, "status"), &certificatesv1.CertificateSigningRequest{}) + if obj == nil { + return nil, err + } + return obj.(*certificatesv1.CertificateSigningRequest), err +} + // UpdateApproval takes the representation of a certificateSigningRequest and updates it. Returns the server's representation of the certificateSigningRequest, and an error, if there is any. func (c *FakeCertificateSigningRequests) UpdateApproval(ctx context.Context, certificateSigningRequestName string, certificateSigningRequest *certificatesv1.CertificateSigningRequest, opts v1.UpdateOptions) (result *certificatesv1.CertificateSigningRequest, err error) { obj, err := c.Fake. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/BUILD deleted file mode 100644 index 0e854351529e..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "certificates_client.go", - "certificatesigningrequest.go", - "certificatesigningrequest_expansion.go", - "doc.go", - "generated_expansion.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1", - importpath = "k8s.io/client-go/kubernetes/typed/certificates/v1beta1", - deps = [ - "//staging/src/k8s.io/api/certificates/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/certificatesigningrequest.go b/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/certificatesigningrequest.go index 6b2623b8aeba..ec0b9d266fc2 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/certificatesigningrequest.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/certificatesigningrequest.go @@ -20,12 +20,15 @@ package v1beta1 import ( "context" + json "encoding/json" + "fmt" "time" v1beta1 "k8s.io/api/certificates/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + certificatesv1beta1 "k8s.io/client-go/applyconfigurations/certificates/v1beta1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -47,6 +50,8 @@ type CertificateSigningRequestInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1beta1.CertificateSigningRequestList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta1.CertificateSigningRequest, err error) + Apply(ctx context.Context, certificateSigningRequest *certificatesv1beta1.CertificateSigningRequestApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.CertificateSigningRequest, err error) + ApplyStatus(ctx context.Context, certificateSigningRequest *certificatesv1beta1.CertificateSigningRequestApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.CertificateSigningRequest, err error) CertificateSigningRequestExpansion } @@ -182,3 +187,57 @@ func (c *certificateSigningRequests) Patch(ctx context.Context, name string, pt Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied certificateSigningRequest. +func (c *certificateSigningRequests) Apply(ctx context.Context, certificateSigningRequest *certificatesv1beta1.CertificateSigningRequestApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.CertificateSigningRequest, err error) { + if certificateSigningRequest == nil { + return nil, fmt.Errorf("certificateSigningRequest provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(certificateSigningRequest) + if err != nil { + return nil, err + } + name := certificateSigningRequest.Name + if name == nil { + return nil, fmt.Errorf("certificateSigningRequest.Name must be provided to Apply") + } + result = &v1beta1.CertificateSigningRequest{} + err = c.client.Patch(types.ApplyPatchType). + Resource("certificatesigningrequests"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *certificateSigningRequests) ApplyStatus(ctx context.Context, certificateSigningRequest *certificatesv1beta1.CertificateSigningRequestApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.CertificateSigningRequest, err error) { + if certificateSigningRequest == nil { + return nil, fmt.Errorf("certificateSigningRequest provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(certificateSigningRequest) + if err != nil { + return nil, err + } + + name := certificateSigningRequest.Name + if name == nil { + return nil, fmt.Errorf("certificateSigningRequest.Name must be provided to Apply") + } + + result = &v1beta1.CertificateSigningRequest{} + err = c.client.Patch(types.ApplyPatchType). + Resource("certificatesigningrequests"). + Name(*name). + SubResource("status"). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/fake/BUILD deleted file mode 100644 index 8ff9a27c829f..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/fake/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_certificates_client.go", - "fake_certificatesigningrequest.go", - "fake_certificatesigningrequest_expansion.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/fake", - importpath = "k8s.io/client-go/kubernetes/typed/certificates/v1beta1/fake", - deps = [ - "//staging/src/k8s.io/api/certificates/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/certificates/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/fake/fake_certificatesigningrequest.go b/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/fake/fake_certificatesigningrequest.go index 9c1bd38473b3..68a1627d6e5f 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/fake/fake_certificatesigningrequest.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/fake/fake_certificatesigningrequest.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1beta1 "k8s.io/api/certificates/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + certificatesv1beta1 "k8s.io/client-go/applyconfigurations/certificates/v1beta1" testing "k8s.io/client-go/testing" ) @@ -131,3 +134,46 @@ func (c *FakeCertificateSigningRequests) Patch(ctx context.Context, name string, } return obj.(*v1beta1.CertificateSigningRequest), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied certificateSigningRequest. +func (c *FakeCertificateSigningRequests) Apply(ctx context.Context, certificateSigningRequest *certificatesv1beta1.CertificateSigningRequestApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.CertificateSigningRequest, err error) { + if certificateSigningRequest == nil { + return nil, fmt.Errorf("certificateSigningRequest provided to Apply must not be nil") + } + data, err := json.Marshal(certificateSigningRequest) + if err != nil { + return nil, err + } + name := certificateSigningRequest.Name + if name == nil { + return nil, fmt.Errorf("certificateSigningRequest.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(certificatesigningrequestsResource, *name, types.ApplyPatchType, data), &v1beta1.CertificateSigningRequest{}) + if obj == nil { + return nil, err + } + return obj.(*v1beta1.CertificateSigningRequest), err +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *FakeCertificateSigningRequests) ApplyStatus(ctx context.Context, certificateSigningRequest *certificatesv1beta1.CertificateSigningRequestApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.CertificateSigningRequest, err error) { + if certificateSigningRequest == nil { + return nil, fmt.Errorf("certificateSigningRequest provided to Apply must not be nil") + } + data, err := json.Marshal(certificateSigningRequest) + if err != nil { + return nil, err + } + name := certificateSigningRequest.Name + if name == nil { + return nil, fmt.Errorf("certificateSigningRequest.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(certificatesigningrequestsResource, *name, types.ApplyPatchType, data, "status"), &v1beta1.CertificateSigningRequest{}) + if obj == nil { + return nil, err + } + return obj.(*v1beta1.CertificateSigningRequest), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/coordination/v1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/coordination/v1/BUILD deleted file mode 100644 index b76130c07ad9..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/coordination/v1/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "coordination_client.go", - "doc.go", - "generated_expansion.go", - "lease.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/coordination/v1", - importpath = "k8s.io/client-go/kubernetes/typed/coordination/v1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/coordination/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/coordination/v1/fake:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/coordination/v1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/coordination/v1/fake/BUILD deleted file mode 100644 index 2ca4bee985fd..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/coordination/v1/fake/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_coordination_client.go", - "fake_lease.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/coordination/v1/fake", - importpath = "k8s.io/client-go/kubernetes/typed/coordination/v1/fake", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/coordination/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/coordination/v1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/coordination/v1/fake/fake_lease.go b/vendor/k8s.io/client-go/kubernetes/typed/coordination/v1/fake/fake_lease.go index 1c979de00fc8..a27f4765e152 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/coordination/v1/fake/fake_lease.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/coordination/v1/fake/fake_lease.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" coordinationv1 "k8s.io/api/coordination/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + applyconfigurationscoordinationv1 "k8s.io/client-go/applyconfigurations/coordination/v1" testing "k8s.io/client-go/testing" ) @@ -128,3 +131,25 @@ func (c *FakeLeases) Patch(ctx context.Context, name string, pt types.PatchType, } return obj.(*coordinationv1.Lease), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied lease. +func (c *FakeLeases) Apply(ctx context.Context, lease *applyconfigurationscoordinationv1.LeaseApplyConfiguration, opts v1.ApplyOptions) (result *coordinationv1.Lease, err error) { + if lease == nil { + return nil, fmt.Errorf("lease provided to Apply must not be nil") + } + data, err := json.Marshal(lease) + if err != nil { + return nil, err + } + name := lease.Name + if name == nil { + return nil, fmt.Errorf("lease.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(leasesResource, c.ns, *name, types.ApplyPatchType, data), &coordinationv1.Lease{}) + + if obj == nil { + return nil, err + } + return obj.(*coordinationv1.Lease), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/coordination/v1/lease.go b/vendor/k8s.io/client-go/kubernetes/typed/coordination/v1/lease.go index 4e8cbf9d6140..9e6b169a8117 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/coordination/v1/lease.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/coordination/v1/lease.go @@ -20,12 +20,15 @@ package v1 import ( "context" + json "encoding/json" + "fmt" "time" v1 "k8s.io/api/coordination/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + coordinationv1 "k8s.io/client-go/applyconfigurations/coordination/v1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type LeaseInterface interface { List(ctx context.Context, opts metav1.ListOptions) (*v1.LeaseList, error) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.Lease, err error) + Apply(ctx context.Context, lease *coordinationv1.LeaseApplyConfiguration, opts metav1.ApplyOptions) (result *v1.Lease, err error) LeaseExpansion } @@ -176,3 +180,29 @@ func (c *leases) Patch(ctx context.Context, name string, pt types.PatchType, dat Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied lease. +func (c *leases) Apply(ctx context.Context, lease *coordinationv1.LeaseApplyConfiguration, opts metav1.ApplyOptions) (result *v1.Lease, err error) { + if lease == nil { + return nil, fmt.Errorf("lease provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(lease) + if err != nil { + return nil, err + } + name := lease.Name + if name == nil { + return nil, fmt.Errorf("lease.Name must be provided to Apply") + } + result = &v1.Lease{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("leases"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/coordination/v1beta1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/coordination/v1beta1/BUILD deleted file mode 100644 index c32e95eb62b9..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/coordination/v1beta1/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "coordination_client.go", - "doc.go", - "generated_expansion.go", - "lease.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/coordination/v1beta1", - importpath = "k8s.io/client-go/kubernetes/typed/coordination/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/coordination/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/coordination/v1beta1/fake:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/coordination/v1beta1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/coordination/v1beta1/fake/BUILD deleted file mode 100644 index 62caae70f9ea..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/coordination/v1beta1/fake/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_coordination_client.go", - "fake_lease.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/coordination/v1beta1/fake", - importpath = "k8s.io/client-go/kubernetes/typed/coordination/v1beta1/fake", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/coordination/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/coordination/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/coordination/v1beta1/fake/fake_lease.go b/vendor/k8s.io/client-go/kubernetes/typed/coordination/v1beta1/fake/fake_lease.go index 4ab5b2ebd422..303f765c2834 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/coordination/v1beta1/fake/fake_lease.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/coordination/v1beta1/fake/fake_lease.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1beta1 "k8s.io/api/coordination/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + coordinationv1beta1 "k8s.io/client-go/applyconfigurations/coordination/v1beta1" testing "k8s.io/client-go/testing" ) @@ -128,3 +131,25 @@ func (c *FakeLeases) Patch(ctx context.Context, name string, pt types.PatchType, } return obj.(*v1beta1.Lease), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied lease. +func (c *FakeLeases) Apply(ctx context.Context, lease *coordinationv1beta1.LeaseApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.Lease, err error) { + if lease == nil { + return nil, fmt.Errorf("lease provided to Apply must not be nil") + } + data, err := json.Marshal(lease) + if err != nil { + return nil, err + } + name := lease.Name + if name == nil { + return nil, fmt.Errorf("lease.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(leasesResource, c.ns, *name, types.ApplyPatchType, data), &v1beta1.Lease{}) + + if obj == nil { + return nil, err + } + return obj.(*v1beta1.Lease), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/coordination/v1beta1/lease.go b/vendor/k8s.io/client-go/kubernetes/typed/coordination/v1beta1/lease.go index c73cb0a97db9..1bbd57bdd1f9 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/coordination/v1beta1/lease.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/coordination/v1beta1/lease.go @@ -20,12 +20,15 @@ package v1beta1 import ( "context" + json "encoding/json" + "fmt" "time" v1beta1 "k8s.io/api/coordination/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + coordinationv1beta1 "k8s.io/client-go/applyconfigurations/coordination/v1beta1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type LeaseInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1beta1.LeaseList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta1.Lease, err error) + Apply(ctx context.Context, lease *coordinationv1beta1.LeaseApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.Lease, err error) LeaseExpansion } @@ -176,3 +180,29 @@ func (c *leases) Patch(ctx context.Context, name string, pt types.PatchType, dat Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied lease. +func (c *leases) Apply(ctx context.Context, lease *coordinationv1beta1.LeaseApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.Lease, err error) { + if lease == nil { + return nil, fmt.Errorf("lease provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(lease) + if err != nil { + return nil, err + } + name := lease.Name + if name == nil { + return nil, fmt.Errorf("lease.Name must be provided to Apply") + } + result = &v1beta1.Lease{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("leases"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/BUILD deleted file mode 100644 index da2a237b1f05..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/BUILD +++ /dev/null @@ -1,69 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "componentstatus.go", - "configmap.go", - "core_client.go", - "doc.go", - "endpoints.go", - "event.go", - "event_expansion.go", - "generated_expansion.go", - "limitrange.go", - "namespace.go", - "namespace_expansion.go", - "node.go", - "node_expansion.go", - "persistentvolume.go", - "persistentvolumeclaim.go", - "pod.go", - "pod_expansion.go", - "podtemplate.go", - "replicationcontroller.go", - "resourcequota.go", - "secret.go", - "service.go", - "service_expansion.go", - "serviceaccount.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/core/v1", - importpath = "k8s.io/client-go/kubernetes/typed/core/v1", - deps = [ - "//staging/src/k8s.io/api/authentication/v1:go_default_library", - "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/tools/reference:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/componentstatus.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/componentstatus.go index faf5d19cc1ea..0fef56429d3f 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/componentstatus.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/componentstatus.go @@ -20,12 +20,15 @@ package v1 import ( "context" + json "encoding/json" + "fmt" "time" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + corev1 "k8s.io/client-go/applyconfigurations/core/v1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type ComponentStatusInterface interface { List(ctx context.Context, opts metav1.ListOptions) (*v1.ComponentStatusList, error) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.ComponentStatus, err error) + Apply(ctx context.Context, componentStatus *corev1.ComponentStatusApplyConfiguration, opts metav1.ApplyOptions) (result *v1.ComponentStatus, err error) ComponentStatusExpansion } @@ -166,3 +170,28 @@ func (c *componentStatuses) Patch(ctx context.Context, name string, pt types.Pat Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied componentStatus. +func (c *componentStatuses) Apply(ctx context.Context, componentStatus *corev1.ComponentStatusApplyConfiguration, opts metav1.ApplyOptions) (result *v1.ComponentStatus, err error) { + if componentStatus == nil { + return nil, fmt.Errorf("componentStatus provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(componentStatus) + if err != nil { + return nil, err + } + name := componentStatus.Name + if name == nil { + return nil, fmt.Errorf("componentStatus.Name must be provided to Apply") + } + result = &v1.ComponentStatus{} + err = c.client.Patch(types.ApplyPatchType). + Resource("componentstatuses"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/configmap.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/configmap.go index 407d25a462b0..b68177720bff 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/configmap.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/configmap.go @@ -20,12 +20,15 @@ package v1 import ( "context" + json "encoding/json" + "fmt" "time" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + corev1 "k8s.io/client-go/applyconfigurations/core/v1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type ConfigMapInterface interface { List(ctx context.Context, opts metav1.ListOptions) (*v1.ConfigMapList, error) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.ConfigMap, err error) + Apply(ctx context.Context, configMap *corev1.ConfigMapApplyConfiguration, opts metav1.ApplyOptions) (result *v1.ConfigMap, err error) ConfigMapExpansion } @@ -176,3 +180,29 @@ func (c *configMaps) Patch(ctx context.Context, name string, pt types.PatchType, Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied configMap. +func (c *configMaps) Apply(ctx context.Context, configMap *corev1.ConfigMapApplyConfiguration, opts metav1.ApplyOptions) (result *v1.ConfigMap, err error) { + if configMap == nil { + return nil, fmt.Errorf("configMap provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(configMap) + if err != nil { + return nil, err + } + name := configMap.Name + if name == nil { + return nil, fmt.Errorf("configMap.Name must be provided to Apply") + } + result = &v1.ConfigMap{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("configmaps"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/endpoints.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/endpoints.go index c36eaaa4ab6d..cdf464b0695d 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/endpoints.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/endpoints.go @@ -20,12 +20,15 @@ package v1 import ( "context" + json "encoding/json" + "fmt" "time" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + corev1 "k8s.io/client-go/applyconfigurations/core/v1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type EndpointsInterface interface { List(ctx context.Context, opts metav1.ListOptions) (*v1.EndpointsList, error) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.Endpoints, err error) + Apply(ctx context.Context, endpoints *corev1.EndpointsApplyConfiguration, opts metav1.ApplyOptions) (result *v1.Endpoints, err error) EndpointsExpansion } @@ -176,3 +180,29 @@ func (c *endpoints) Patch(ctx context.Context, name string, pt types.PatchType, Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied endpoints. +func (c *endpoints) Apply(ctx context.Context, endpoints *corev1.EndpointsApplyConfiguration, opts metav1.ApplyOptions) (result *v1.Endpoints, err error) { + if endpoints == nil { + return nil, fmt.Errorf("endpoints provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(endpoints) + if err != nil { + return nil, err + } + name := endpoints.Name + if name == nil { + return nil, fmt.Errorf("endpoints.Name must be provided to Apply") + } + result = &v1.Endpoints{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("endpoints"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/event.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/event.go index 9b669920f19e..8274d85ffe25 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/event.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/event.go @@ -20,12 +20,15 @@ package v1 import ( "context" + json "encoding/json" + "fmt" "time" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + corev1 "k8s.io/client-go/applyconfigurations/core/v1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type EventInterface interface { List(ctx context.Context, opts metav1.ListOptions) (*v1.EventList, error) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.Event, err error) + Apply(ctx context.Context, event *corev1.EventApplyConfiguration, opts metav1.ApplyOptions) (result *v1.Event, err error) EventExpansion } @@ -176,3 +180,29 @@ func (c *events) Patch(ctx context.Context, name string, pt types.PatchType, dat Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied event. +func (c *events) Apply(ctx context.Context, event *corev1.EventApplyConfiguration, opts metav1.ApplyOptions) (result *v1.Event, err error) { + if event == nil { + return nil, fmt.Errorf("event provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(event) + if err != nil { + return nil, err + } + name := event.Name + if name == nil { + return nil, fmt.Errorf("event.Name must be provided to Apply") + } + result = &v1.Event{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("events"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/BUILD deleted file mode 100644 index 5d37b4b63b05..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/BUILD +++ /dev/null @@ -1,79 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_componentstatus.go", - "fake_configmap.go", - "fake_core_client.go", - "fake_endpoints.go", - "fake_event.go", - "fake_event_expansion.go", - "fake_limitrange.go", - "fake_namespace.go", - "fake_namespace_expansion.go", - "fake_node.go", - "fake_node_expansion.go", - "fake_persistentvolume.go", - "fake_persistentvolumeclaim.go", - "fake_pod.go", - "fake_pod_expansion.go", - "fake_podtemplate.go", - "fake_replicationcontroller.go", - "fake_resourcequota.go", - "fake_secret.go", - "fake_service.go", - "fake_service_expansion.go", - "fake_serviceaccount.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake", - importpath = "k8s.io/client-go/kubernetes/typed/core/v1/fake", - deps = [ - "//staging/src/k8s.io/api/authentication/v1:go_default_library", - "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/rest/fake:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["fake_pod_expansion_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_componentstatus.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_componentstatus.go index 08ff515df1f5..a80fb38dce8c 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_componentstatus.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_componentstatus.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" corev1 "k8s.io/api/core/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + applyconfigurationscorev1 "k8s.io/client-go/applyconfigurations/core/v1" testing "k8s.io/client-go/testing" ) @@ -120,3 +123,24 @@ func (c *FakeComponentStatuses) Patch(ctx context.Context, name string, pt types } return obj.(*corev1.ComponentStatus), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied componentStatus. +func (c *FakeComponentStatuses) Apply(ctx context.Context, componentStatus *applyconfigurationscorev1.ComponentStatusApplyConfiguration, opts v1.ApplyOptions) (result *corev1.ComponentStatus, err error) { + if componentStatus == nil { + return nil, fmt.Errorf("componentStatus provided to Apply must not be nil") + } + data, err := json.Marshal(componentStatus) + if err != nil { + return nil, err + } + name := componentStatus.Name + if name == nil { + return nil, fmt.Errorf("componentStatus.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(componentstatusesResource, *name, types.ApplyPatchType, data), &corev1.ComponentStatus{}) + if obj == nil { + return nil, err + } + return obj.(*corev1.ComponentStatus), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_configmap.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_configmap.go index 6c541ec7d366..ba0058d61104 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_configmap.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_configmap.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" corev1 "k8s.io/api/core/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + applyconfigurationscorev1 "k8s.io/client-go/applyconfigurations/core/v1" testing "k8s.io/client-go/testing" ) @@ -128,3 +131,25 @@ func (c *FakeConfigMaps) Patch(ctx context.Context, name string, pt types.PatchT } return obj.(*corev1.ConfigMap), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied configMap. +func (c *FakeConfigMaps) Apply(ctx context.Context, configMap *applyconfigurationscorev1.ConfigMapApplyConfiguration, opts v1.ApplyOptions) (result *corev1.ConfigMap, err error) { + if configMap == nil { + return nil, fmt.Errorf("configMap provided to Apply must not be nil") + } + data, err := json.Marshal(configMap) + if err != nil { + return nil, err + } + name := configMap.Name + if name == nil { + return nil, fmt.Errorf("configMap.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(configmapsResource, c.ns, *name, types.ApplyPatchType, data), &corev1.ConfigMap{}) + + if obj == nil { + return nil, err + } + return obj.(*corev1.ConfigMap), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_endpoints.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_endpoints.go index 02c03223aae8..c9484ad243f2 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_endpoints.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_endpoints.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" corev1 "k8s.io/api/core/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + applyconfigurationscorev1 "k8s.io/client-go/applyconfigurations/core/v1" testing "k8s.io/client-go/testing" ) @@ -128,3 +131,25 @@ func (c *FakeEndpoints) Patch(ctx context.Context, name string, pt types.PatchTy } return obj.(*corev1.Endpoints), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied endpoints. +func (c *FakeEndpoints) Apply(ctx context.Context, endpoints *applyconfigurationscorev1.EndpointsApplyConfiguration, opts v1.ApplyOptions) (result *corev1.Endpoints, err error) { + if endpoints == nil { + return nil, fmt.Errorf("endpoints provided to Apply must not be nil") + } + data, err := json.Marshal(endpoints) + if err != nil { + return nil, err + } + name := endpoints.Name + if name == nil { + return nil, fmt.Errorf("endpoints.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(endpointsResource, c.ns, *name, types.ApplyPatchType, data), &corev1.Endpoints{}) + + if obj == nil { + return nil, err + } + return obj.(*corev1.Endpoints), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_event.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_event.go index 2e4787dc7f9d..71e34a948aab 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_event.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_event.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" corev1 "k8s.io/api/core/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + applyconfigurationscorev1 "k8s.io/client-go/applyconfigurations/core/v1" testing "k8s.io/client-go/testing" ) @@ -128,3 +131,25 @@ func (c *FakeEvents) Patch(ctx context.Context, name string, pt types.PatchType, } return obj.(*corev1.Event), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied event. +func (c *FakeEvents) Apply(ctx context.Context, event *applyconfigurationscorev1.EventApplyConfiguration, opts v1.ApplyOptions) (result *corev1.Event, err error) { + if event == nil { + return nil, fmt.Errorf("event provided to Apply must not be nil") + } + data, err := json.Marshal(event) + if err != nil { + return nil, err + } + name := event.Name + if name == nil { + return nil, fmt.Errorf("event.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(eventsResource, c.ns, *name, types.ApplyPatchType, data), &corev1.Event{}) + + if obj == nil { + return nil, err + } + return obj.(*corev1.Event), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_limitrange.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_limitrange.go index eb0bde8e598a..8c6c11ca12e8 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_limitrange.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_limitrange.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" corev1 "k8s.io/api/core/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + applyconfigurationscorev1 "k8s.io/client-go/applyconfigurations/core/v1" testing "k8s.io/client-go/testing" ) @@ -128,3 +131,25 @@ func (c *FakeLimitRanges) Patch(ctx context.Context, name string, pt types.Patch } return obj.(*corev1.LimitRange), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied limitRange. +func (c *FakeLimitRanges) Apply(ctx context.Context, limitRange *applyconfigurationscorev1.LimitRangeApplyConfiguration, opts v1.ApplyOptions) (result *corev1.LimitRange, err error) { + if limitRange == nil { + return nil, fmt.Errorf("limitRange provided to Apply must not be nil") + } + data, err := json.Marshal(limitRange) + if err != nil { + return nil, err + } + name := limitRange.Name + if name == nil { + return nil, fmt.Errorf("limitRange.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(limitrangesResource, c.ns, *name, types.ApplyPatchType, data), &corev1.LimitRange{}) + + if obj == nil { + return nil, err + } + return obj.(*corev1.LimitRange), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_namespace.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_namespace.go index efb937580380..6b56afecb1fe 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_namespace.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_namespace.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" corev1 "k8s.io/api/core/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + applyconfigurationscorev1 "k8s.io/client-go/applyconfigurations/core/v1" testing "k8s.io/client-go/testing" ) @@ -123,3 +126,46 @@ func (c *FakeNamespaces) Patch(ctx context.Context, name string, pt types.PatchT } return obj.(*corev1.Namespace), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied namespace. +func (c *FakeNamespaces) Apply(ctx context.Context, namespace *applyconfigurationscorev1.NamespaceApplyConfiguration, opts v1.ApplyOptions) (result *corev1.Namespace, err error) { + if namespace == nil { + return nil, fmt.Errorf("namespace provided to Apply must not be nil") + } + data, err := json.Marshal(namespace) + if err != nil { + return nil, err + } + name := namespace.Name + if name == nil { + return nil, fmt.Errorf("namespace.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(namespacesResource, *name, types.ApplyPatchType, data), &corev1.Namespace{}) + if obj == nil { + return nil, err + } + return obj.(*corev1.Namespace), err +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *FakeNamespaces) ApplyStatus(ctx context.Context, namespace *applyconfigurationscorev1.NamespaceApplyConfiguration, opts v1.ApplyOptions) (result *corev1.Namespace, err error) { + if namespace == nil { + return nil, fmt.Errorf("namespace provided to Apply must not be nil") + } + data, err := json.Marshal(namespace) + if err != nil { + return nil, err + } + name := namespace.Name + if name == nil { + return nil, fmt.Errorf("namespace.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(namespacesResource, *name, types.ApplyPatchType, data, "status"), &corev1.Namespace{}) + if obj == nil { + return nil, err + } + return obj.(*corev1.Namespace), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_node.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_node.go index 47c3a2168666..7a4071ab07ea 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_node.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_node.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" corev1 "k8s.io/api/core/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + applyconfigurationscorev1 "k8s.io/client-go/applyconfigurations/core/v1" testing "k8s.io/client-go/testing" ) @@ -131,3 +134,46 @@ func (c *FakeNodes) Patch(ctx context.Context, name string, pt types.PatchType, } return obj.(*corev1.Node), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied node. +func (c *FakeNodes) Apply(ctx context.Context, node *applyconfigurationscorev1.NodeApplyConfiguration, opts v1.ApplyOptions) (result *corev1.Node, err error) { + if node == nil { + return nil, fmt.Errorf("node provided to Apply must not be nil") + } + data, err := json.Marshal(node) + if err != nil { + return nil, err + } + name := node.Name + if name == nil { + return nil, fmt.Errorf("node.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(nodesResource, *name, types.ApplyPatchType, data), &corev1.Node{}) + if obj == nil { + return nil, err + } + return obj.(*corev1.Node), err +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *FakeNodes) ApplyStatus(ctx context.Context, node *applyconfigurationscorev1.NodeApplyConfiguration, opts v1.ApplyOptions) (result *corev1.Node, err error) { + if node == nil { + return nil, fmt.Errorf("node provided to Apply must not be nil") + } + data, err := json.Marshal(node) + if err != nil { + return nil, err + } + name := node.Name + if name == nil { + return nil, fmt.Errorf("node.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(nodesResource, *name, types.ApplyPatchType, data, "status"), &corev1.Node{}) + if obj == nil { + return nil, err + } + return obj.(*corev1.Node), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_persistentvolume.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_persistentvolume.go index 94e093073daf..b2b5b954fbfc 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_persistentvolume.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_persistentvolume.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" corev1 "k8s.io/api/core/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + applyconfigurationscorev1 "k8s.io/client-go/applyconfigurations/core/v1" testing "k8s.io/client-go/testing" ) @@ -131,3 +134,46 @@ func (c *FakePersistentVolumes) Patch(ctx context.Context, name string, pt types } return obj.(*corev1.PersistentVolume), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied persistentVolume. +func (c *FakePersistentVolumes) Apply(ctx context.Context, persistentVolume *applyconfigurationscorev1.PersistentVolumeApplyConfiguration, opts v1.ApplyOptions) (result *corev1.PersistentVolume, err error) { + if persistentVolume == nil { + return nil, fmt.Errorf("persistentVolume provided to Apply must not be nil") + } + data, err := json.Marshal(persistentVolume) + if err != nil { + return nil, err + } + name := persistentVolume.Name + if name == nil { + return nil, fmt.Errorf("persistentVolume.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(persistentvolumesResource, *name, types.ApplyPatchType, data), &corev1.PersistentVolume{}) + if obj == nil { + return nil, err + } + return obj.(*corev1.PersistentVolume), err +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *FakePersistentVolumes) ApplyStatus(ctx context.Context, persistentVolume *applyconfigurationscorev1.PersistentVolumeApplyConfiguration, opts v1.ApplyOptions) (result *corev1.PersistentVolume, err error) { + if persistentVolume == nil { + return nil, fmt.Errorf("persistentVolume provided to Apply must not be nil") + } + data, err := json.Marshal(persistentVolume) + if err != nil { + return nil, err + } + name := persistentVolume.Name + if name == nil { + return nil, fmt.Errorf("persistentVolume.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(persistentvolumesResource, *name, types.ApplyPatchType, data, "status"), &corev1.PersistentVolume{}) + if obj == nil { + return nil, err + } + return obj.(*corev1.PersistentVolume), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_persistentvolumeclaim.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_persistentvolumeclaim.go index 7b9a38da0ebe..952d4decb326 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_persistentvolumeclaim.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_persistentvolumeclaim.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" corev1 "k8s.io/api/core/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + applyconfigurationscorev1 "k8s.io/client-go/applyconfigurations/core/v1" testing "k8s.io/client-go/testing" ) @@ -140,3 +143,48 @@ func (c *FakePersistentVolumeClaims) Patch(ctx context.Context, name string, pt } return obj.(*corev1.PersistentVolumeClaim), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied persistentVolumeClaim. +func (c *FakePersistentVolumeClaims) Apply(ctx context.Context, persistentVolumeClaim *applyconfigurationscorev1.PersistentVolumeClaimApplyConfiguration, opts v1.ApplyOptions) (result *corev1.PersistentVolumeClaim, err error) { + if persistentVolumeClaim == nil { + return nil, fmt.Errorf("persistentVolumeClaim provided to Apply must not be nil") + } + data, err := json.Marshal(persistentVolumeClaim) + if err != nil { + return nil, err + } + name := persistentVolumeClaim.Name + if name == nil { + return nil, fmt.Errorf("persistentVolumeClaim.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(persistentvolumeclaimsResource, c.ns, *name, types.ApplyPatchType, data), &corev1.PersistentVolumeClaim{}) + + if obj == nil { + return nil, err + } + return obj.(*corev1.PersistentVolumeClaim), err +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *FakePersistentVolumeClaims) ApplyStatus(ctx context.Context, persistentVolumeClaim *applyconfigurationscorev1.PersistentVolumeClaimApplyConfiguration, opts v1.ApplyOptions) (result *corev1.PersistentVolumeClaim, err error) { + if persistentVolumeClaim == nil { + return nil, fmt.Errorf("persistentVolumeClaim provided to Apply must not be nil") + } + data, err := json.Marshal(persistentVolumeClaim) + if err != nil { + return nil, err + } + name := persistentVolumeClaim.Name + if name == nil { + return nil, fmt.Errorf("persistentVolumeClaim.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(persistentvolumeclaimsResource, c.ns, *name, types.ApplyPatchType, data, "status"), &corev1.PersistentVolumeClaim{}) + + if obj == nil { + return nil, err + } + return obj.(*corev1.PersistentVolumeClaim), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_pod.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_pod.go index b2f1b1531510..601cc82d48f3 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_pod.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_pod.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" corev1 "k8s.io/api/core/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + applyconfigurationscorev1 "k8s.io/client-go/applyconfigurations/core/v1" testing "k8s.io/client-go/testing" ) @@ -141,6 +144,51 @@ func (c *FakePods) Patch(ctx context.Context, name string, pt types.PatchType, d return obj.(*corev1.Pod), err } +// Apply takes the given apply declarative configuration, applies it and returns the applied pod. +func (c *FakePods) Apply(ctx context.Context, pod *applyconfigurationscorev1.PodApplyConfiguration, opts v1.ApplyOptions) (result *corev1.Pod, err error) { + if pod == nil { + return nil, fmt.Errorf("pod provided to Apply must not be nil") + } + data, err := json.Marshal(pod) + if err != nil { + return nil, err + } + name := pod.Name + if name == nil { + return nil, fmt.Errorf("pod.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(podsResource, c.ns, *name, types.ApplyPatchType, data), &corev1.Pod{}) + + if obj == nil { + return nil, err + } + return obj.(*corev1.Pod), err +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *FakePods) ApplyStatus(ctx context.Context, pod *applyconfigurationscorev1.PodApplyConfiguration, opts v1.ApplyOptions) (result *corev1.Pod, err error) { + if pod == nil { + return nil, fmt.Errorf("pod provided to Apply must not be nil") + } + data, err := json.Marshal(pod) + if err != nil { + return nil, err + } + name := pod.Name + if name == nil { + return nil, fmt.Errorf("pod.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(podsResource, c.ns, *name, types.ApplyPatchType, data, "status"), &corev1.Pod{}) + + if obj == nil { + return nil, err + } + return obj.(*corev1.Pod), err +} + // GetEphemeralContainers takes name of the pod, and returns the corresponding ephemeralContainers object, and an error if there is any. func (c *FakePods) GetEphemeralContainers(ctx context.Context, podName string, options v1.GetOptions) (result *corev1.EphemeralContainers, err error) { obj, err := c.Fake. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_podtemplate.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_podtemplate.go index 579fe1c7a72e..40c91611fa88 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_podtemplate.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_podtemplate.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" corev1 "k8s.io/api/core/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + applyconfigurationscorev1 "k8s.io/client-go/applyconfigurations/core/v1" testing "k8s.io/client-go/testing" ) @@ -128,3 +131,25 @@ func (c *FakePodTemplates) Patch(ctx context.Context, name string, pt types.Patc } return obj.(*corev1.PodTemplate), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied podTemplate. +func (c *FakePodTemplates) Apply(ctx context.Context, podTemplate *applyconfigurationscorev1.PodTemplateApplyConfiguration, opts v1.ApplyOptions) (result *corev1.PodTemplate, err error) { + if podTemplate == nil { + return nil, fmt.Errorf("podTemplate provided to Apply must not be nil") + } + data, err := json.Marshal(podTemplate) + if err != nil { + return nil, err + } + name := podTemplate.Name + if name == nil { + return nil, fmt.Errorf("podTemplate.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(podtemplatesResource, c.ns, *name, types.ApplyPatchType, data), &corev1.PodTemplate{}) + + if obj == nil { + return nil, err + } + return obj.(*corev1.PodTemplate), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_replicationcontroller.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_replicationcontroller.go index 3fa03a07631c..01cfd9088f36 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_replicationcontroller.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_replicationcontroller.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" autoscalingv1 "k8s.io/api/autoscaling/v1" corev1 "k8s.io/api/core/v1" @@ -28,6 +30,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + applyconfigurationscorev1 "k8s.io/client-go/applyconfigurations/core/v1" testing "k8s.io/client-go/testing" ) @@ -142,6 +145,51 @@ func (c *FakeReplicationControllers) Patch(ctx context.Context, name string, pt return obj.(*corev1.ReplicationController), err } +// Apply takes the given apply declarative configuration, applies it and returns the applied replicationController. +func (c *FakeReplicationControllers) Apply(ctx context.Context, replicationController *applyconfigurationscorev1.ReplicationControllerApplyConfiguration, opts v1.ApplyOptions) (result *corev1.ReplicationController, err error) { + if replicationController == nil { + return nil, fmt.Errorf("replicationController provided to Apply must not be nil") + } + data, err := json.Marshal(replicationController) + if err != nil { + return nil, err + } + name := replicationController.Name + if name == nil { + return nil, fmt.Errorf("replicationController.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(replicationcontrollersResource, c.ns, *name, types.ApplyPatchType, data), &corev1.ReplicationController{}) + + if obj == nil { + return nil, err + } + return obj.(*corev1.ReplicationController), err +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *FakeReplicationControllers) ApplyStatus(ctx context.Context, replicationController *applyconfigurationscorev1.ReplicationControllerApplyConfiguration, opts v1.ApplyOptions) (result *corev1.ReplicationController, err error) { + if replicationController == nil { + return nil, fmt.Errorf("replicationController provided to Apply must not be nil") + } + data, err := json.Marshal(replicationController) + if err != nil { + return nil, err + } + name := replicationController.Name + if name == nil { + return nil, fmt.Errorf("replicationController.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(replicationcontrollersResource, c.ns, *name, types.ApplyPatchType, data, "status"), &corev1.ReplicationController{}) + + if obj == nil { + return nil, err + } + return obj.(*corev1.ReplicationController), err +} + // GetScale takes name of the replicationController, and returns the corresponding scale object, and an error if there is any. func (c *FakeReplicationControllers) GetScale(ctx context.Context, replicationControllerName string, options v1.GetOptions) (result *autoscalingv1.Scale, err error) { obj, err := c.Fake. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_resourcequota.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_resourcequota.go index f70de3084949..c8af473f71f3 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_resourcequota.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_resourcequota.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" corev1 "k8s.io/api/core/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + applyconfigurationscorev1 "k8s.io/client-go/applyconfigurations/core/v1" testing "k8s.io/client-go/testing" ) @@ -140,3 +143,48 @@ func (c *FakeResourceQuotas) Patch(ctx context.Context, name string, pt types.Pa } return obj.(*corev1.ResourceQuota), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied resourceQuota. +func (c *FakeResourceQuotas) Apply(ctx context.Context, resourceQuota *applyconfigurationscorev1.ResourceQuotaApplyConfiguration, opts v1.ApplyOptions) (result *corev1.ResourceQuota, err error) { + if resourceQuota == nil { + return nil, fmt.Errorf("resourceQuota provided to Apply must not be nil") + } + data, err := json.Marshal(resourceQuota) + if err != nil { + return nil, err + } + name := resourceQuota.Name + if name == nil { + return nil, fmt.Errorf("resourceQuota.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(resourcequotasResource, c.ns, *name, types.ApplyPatchType, data), &corev1.ResourceQuota{}) + + if obj == nil { + return nil, err + } + return obj.(*corev1.ResourceQuota), err +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *FakeResourceQuotas) ApplyStatus(ctx context.Context, resourceQuota *applyconfigurationscorev1.ResourceQuotaApplyConfiguration, opts v1.ApplyOptions) (result *corev1.ResourceQuota, err error) { + if resourceQuota == nil { + return nil, fmt.Errorf("resourceQuota provided to Apply must not be nil") + } + data, err := json.Marshal(resourceQuota) + if err != nil { + return nil, err + } + name := resourceQuota.Name + if name == nil { + return nil, fmt.Errorf("resourceQuota.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(resourcequotasResource, c.ns, *name, types.ApplyPatchType, data, "status"), &corev1.ResourceQuota{}) + + if obj == nil { + return nil, err + } + return obj.(*corev1.ResourceQuota), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_secret.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_secret.go index a92329cfaaeb..b20c5edf490c 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_secret.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_secret.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" corev1 "k8s.io/api/core/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + applyconfigurationscorev1 "k8s.io/client-go/applyconfigurations/core/v1" testing "k8s.io/client-go/testing" ) @@ -128,3 +131,25 @@ func (c *FakeSecrets) Patch(ctx context.Context, name string, pt types.PatchType } return obj.(*corev1.Secret), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied secret. +func (c *FakeSecrets) Apply(ctx context.Context, secret *applyconfigurationscorev1.SecretApplyConfiguration, opts v1.ApplyOptions) (result *corev1.Secret, err error) { + if secret == nil { + return nil, fmt.Errorf("secret provided to Apply must not be nil") + } + data, err := json.Marshal(secret) + if err != nil { + return nil, err + } + name := secret.Name + if name == nil { + return nil, fmt.Errorf("secret.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(secretsResource, c.ns, *name, types.ApplyPatchType, data), &corev1.Secret{}) + + if obj == nil { + return nil, err + } + return obj.(*corev1.Secret), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_service.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_service.go index e5391ffb383c..1da10581ea81 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_service.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_service.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" corev1 "k8s.io/api/core/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + applyconfigurationscorev1 "k8s.io/client-go/applyconfigurations/core/v1" testing "k8s.io/client-go/testing" ) @@ -132,3 +135,48 @@ func (c *FakeServices) Patch(ctx context.Context, name string, pt types.PatchTyp } return obj.(*corev1.Service), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied service. +func (c *FakeServices) Apply(ctx context.Context, service *applyconfigurationscorev1.ServiceApplyConfiguration, opts v1.ApplyOptions) (result *corev1.Service, err error) { + if service == nil { + return nil, fmt.Errorf("service provided to Apply must not be nil") + } + data, err := json.Marshal(service) + if err != nil { + return nil, err + } + name := service.Name + if name == nil { + return nil, fmt.Errorf("service.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(servicesResource, c.ns, *name, types.ApplyPatchType, data), &corev1.Service{}) + + if obj == nil { + return nil, err + } + return obj.(*corev1.Service), err +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *FakeServices) ApplyStatus(ctx context.Context, service *applyconfigurationscorev1.ServiceApplyConfiguration, opts v1.ApplyOptions) (result *corev1.Service, err error) { + if service == nil { + return nil, fmt.Errorf("service provided to Apply must not be nil") + } + data, err := json.Marshal(service) + if err != nil { + return nil, err + } + name := service.Name + if name == nil { + return nil, fmt.Errorf("service.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(servicesResource, c.ns, *name, types.ApplyPatchType, data, "status"), &corev1.Service{}) + + if obj == nil { + return nil, err + } + return obj.(*corev1.Service), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_serviceaccount.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_serviceaccount.go index df344b5893ba..487c6f0f07b7 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_serviceaccount.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_serviceaccount.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" authenticationv1 "k8s.io/api/authentication/v1" corev1 "k8s.io/api/core/v1" @@ -28,6 +30,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + applyconfigurationscorev1 "k8s.io/client-go/applyconfigurations/core/v1" testing "k8s.io/client-go/testing" ) @@ -130,6 +133,28 @@ func (c *FakeServiceAccounts) Patch(ctx context.Context, name string, pt types.P return obj.(*corev1.ServiceAccount), err } +// Apply takes the given apply declarative configuration, applies it and returns the applied serviceAccount. +func (c *FakeServiceAccounts) Apply(ctx context.Context, serviceAccount *applyconfigurationscorev1.ServiceAccountApplyConfiguration, opts v1.ApplyOptions) (result *corev1.ServiceAccount, err error) { + if serviceAccount == nil { + return nil, fmt.Errorf("serviceAccount provided to Apply must not be nil") + } + data, err := json.Marshal(serviceAccount) + if err != nil { + return nil, err + } + name := serviceAccount.Name + if name == nil { + return nil, fmt.Errorf("serviceAccount.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(serviceaccountsResource, c.ns, *name, types.ApplyPatchType, data), &corev1.ServiceAccount{}) + + if obj == nil { + return nil, err + } + return obj.(*corev1.ServiceAccount), err +} + // CreateToken takes the representation of a tokenRequest and creates it. Returns the server's representation of the tokenRequest, and an error, if there is any. func (c *FakeServiceAccounts) CreateToken(ctx context.Context, serviceAccountName string, tokenRequest *authenticationv1.TokenRequest, opts v1.CreateOptions) (result *authenticationv1.TokenRequest, err error) { obj, err := c.Fake. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/limitrange.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/limitrange.go index 7031cd77ed94..e6883b607c74 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/limitrange.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/limitrange.go @@ -20,12 +20,15 @@ package v1 import ( "context" + json "encoding/json" + "fmt" "time" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + corev1 "k8s.io/client-go/applyconfigurations/core/v1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type LimitRangeInterface interface { List(ctx context.Context, opts metav1.ListOptions) (*v1.LimitRangeList, error) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.LimitRange, err error) + Apply(ctx context.Context, limitRange *corev1.LimitRangeApplyConfiguration, opts metav1.ApplyOptions) (result *v1.LimitRange, err error) LimitRangeExpansion } @@ -176,3 +180,29 @@ func (c *limitRanges) Patch(ctx context.Context, name string, pt types.PatchType Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied limitRange. +func (c *limitRanges) Apply(ctx context.Context, limitRange *corev1.LimitRangeApplyConfiguration, opts metav1.ApplyOptions) (result *v1.LimitRange, err error) { + if limitRange == nil { + return nil, fmt.Errorf("limitRange provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(limitRange) + if err != nil { + return nil, err + } + name := limitRange.Name + if name == nil { + return nil, fmt.Errorf("limitRange.Name must be provided to Apply") + } + result = &v1.LimitRange{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("limitranges"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/namespace.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/namespace.go index 55b03d65b2b7..06c77b4c458a 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/namespace.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/namespace.go @@ -20,12 +20,15 @@ package v1 import ( "context" + json "encoding/json" + "fmt" "time" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + corev1 "k8s.io/client-go/applyconfigurations/core/v1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,8 @@ type NamespaceInterface interface { List(ctx context.Context, opts metav1.ListOptions) (*v1.NamespaceList, error) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.Namespace, err error) + Apply(ctx context.Context, namespace *corev1.NamespaceApplyConfiguration, opts metav1.ApplyOptions) (result *v1.Namespace, err error) + ApplyStatus(ctx context.Context, namespace *corev1.NamespaceApplyConfiguration, opts metav1.ApplyOptions) (result *v1.Namespace, err error) NamespaceExpansion } @@ -166,3 +171,57 @@ func (c *namespaces) Patch(ctx context.Context, name string, pt types.PatchType, Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied namespace. +func (c *namespaces) Apply(ctx context.Context, namespace *corev1.NamespaceApplyConfiguration, opts metav1.ApplyOptions) (result *v1.Namespace, err error) { + if namespace == nil { + return nil, fmt.Errorf("namespace provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(namespace) + if err != nil { + return nil, err + } + name := namespace.Name + if name == nil { + return nil, fmt.Errorf("namespace.Name must be provided to Apply") + } + result = &v1.Namespace{} + err = c.client.Patch(types.ApplyPatchType). + Resource("namespaces"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *namespaces) ApplyStatus(ctx context.Context, namespace *corev1.NamespaceApplyConfiguration, opts metav1.ApplyOptions) (result *v1.Namespace, err error) { + if namespace == nil { + return nil, fmt.Errorf("namespace provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(namespace) + if err != nil { + return nil, err + } + + name := namespace.Name + if name == nil { + return nil, fmt.Errorf("namespace.Name must be provided to Apply") + } + + result = &v1.Namespace{} + err = c.client.Patch(types.ApplyPatchType). + Resource("namespaces"). + Name(*name). + SubResource("status"). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/node.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/node.go index 6176808f4268..d9725b2f95e9 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/node.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/node.go @@ -20,12 +20,15 @@ package v1 import ( "context" + json "encoding/json" + "fmt" "time" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + corev1 "k8s.io/client-go/applyconfigurations/core/v1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -47,6 +50,8 @@ type NodeInterface interface { List(ctx context.Context, opts metav1.ListOptions) (*v1.NodeList, error) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.Node, err error) + Apply(ctx context.Context, node *corev1.NodeApplyConfiguration, opts metav1.ApplyOptions) (result *v1.Node, err error) + ApplyStatus(ctx context.Context, node *corev1.NodeApplyConfiguration, opts metav1.ApplyOptions) (result *v1.Node, err error) NodeExpansion } @@ -182,3 +187,57 @@ func (c *nodes) Patch(ctx context.Context, name string, pt types.PatchType, data Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied node. +func (c *nodes) Apply(ctx context.Context, node *corev1.NodeApplyConfiguration, opts metav1.ApplyOptions) (result *v1.Node, err error) { + if node == nil { + return nil, fmt.Errorf("node provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(node) + if err != nil { + return nil, err + } + name := node.Name + if name == nil { + return nil, fmt.Errorf("node.Name must be provided to Apply") + } + result = &v1.Node{} + err = c.client.Patch(types.ApplyPatchType). + Resource("nodes"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *nodes) ApplyStatus(ctx context.Context, node *corev1.NodeApplyConfiguration, opts metav1.ApplyOptions) (result *v1.Node, err error) { + if node == nil { + return nil, fmt.Errorf("node provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(node) + if err != nil { + return nil, err + } + + name := node.Name + if name == nil { + return nil, fmt.Errorf("node.Name must be provided to Apply") + } + + result = &v1.Node{} + err = c.client.Patch(types.ApplyPatchType). + Resource("nodes"). + Name(*name). + SubResource("status"). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/persistentvolume.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/persistentvolume.go index 1eb9db635a6e..a8e22959771f 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/persistentvolume.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/persistentvolume.go @@ -20,12 +20,15 @@ package v1 import ( "context" + json "encoding/json" + "fmt" "time" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + corev1 "k8s.io/client-go/applyconfigurations/core/v1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -47,6 +50,8 @@ type PersistentVolumeInterface interface { List(ctx context.Context, opts metav1.ListOptions) (*v1.PersistentVolumeList, error) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.PersistentVolume, err error) + Apply(ctx context.Context, persistentVolume *corev1.PersistentVolumeApplyConfiguration, opts metav1.ApplyOptions) (result *v1.PersistentVolume, err error) + ApplyStatus(ctx context.Context, persistentVolume *corev1.PersistentVolumeApplyConfiguration, opts metav1.ApplyOptions) (result *v1.PersistentVolume, err error) PersistentVolumeExpansion } @@ -182,3 +187,57 @@ func (c *persistentVolumes) Patch(ctx context.Context, name string, pt types.Pat Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied persistentVolume. +func (c *persistentVolumes) Apply(ctx context.Context, persistentVolume *corev1.PersistentVolumeApplyConfiguration, opts metav1.ApplyOptions) (result *v1.PersistentVolume, err error) { + if persistentVolume == nil { + return nil, fmt.Errorf("persistentVolume provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(persistentVolume) + if err != nil { + return nil, err + } + name := persistentVolume.Name + if name == nil { + return nil, fmt.Errorf("persistentVolume.Name must be provided to Apply") + } + result = &v1.PersistentVolume{} + err = c.client.Patch(types.ApplyPatchType). + Resource("persistentvolumes"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *persistentVolumes) ApplyStatus(ctx context.Context, persistentVolume *corev1.PersistentVolumeApplyConfiguration, opts metav1.ApplyOptions) (result *v1.PersistentVolume, err error) { + if persistentVolume == nil { + return nil, fmt.Errorf("persistentVolume provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(persistentVolume) + if err != nil { + return nil, err + } + + name := persistentVolume.Name + if name == nil { + return nil, fmt.Errorf("persistentVolume.Name must be provided to Apply") + } + + result = &v1.PersistentVolume{} + err = c.client.Patch(types.ApplyPatchType). + Resource("persistentvolumes"). + Name(*name). + SubResource("status"). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/persistentvolumeclaim.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/persistentvolumeclaim.go index f4e205f4e888..2e7f4fb44f6c 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/persistentvolumeclaim.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/persistentvolumeclaim.go @@ -20,12 +20,15 @@ package v1 import ( "context" + json "encoding/json" + "fmt" "time" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + corev1 "k8s.io/client-go/applyconfigurations/core/v1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -47,6 +50,8 @@ type PersistentVolumeClaimInterface interface { List(ctx context.Context, opts metav1.ListOptions) (*v1.PersistentVolumeClaimList, error) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.PersistentVolumeClaim, err error) + Apply(ctx context.Context, persistentVolumeClaim *corev1.PersistentVolumeClaimApplyConfiguration, opts metav1.ApplyOptions) (result *v1.PersistentVolumeClaim, err error) + ApplyStatus(ctx context.Context, persistentVolumeClaim *corev1.PersistentVolumeClaimApplyConfiguration, opts metav1.ApplyOptions) (result *v1.PersistentVolumeClaim, err error) PersistentVolumeClaimExpansion } @@ -193,3 +198,59 @@ func (c *persistentVolumeClaims) Patch(ctx context.Context, name string, pt type Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied persistentVolumeClaim. +func (c *persistentVolumeClaims) Apply(ctx context.Context, persistentVolumeClaim *corev1.PersistentVolumeClaimApplyConfiguration, opts metav1.ApplyOptions) (result *v1.PersistentVolumeClaim, err error) { + if persistentVolumeClaim == nil { + return nil, fmt.Errorf("persistentVolumeClaim provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(persistentVolumeClaim) + if err != nil { + return nil, err + } + name := persistentVolumeClaim.Name + if name == nil { + return nil, fmt.Errorf("persistentVolumeClaim.Name must be provided to Apply") + } + result = &v1.PersistentVolumeClaim{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("persistentvolumeclaims"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *persistentVolumeClaims) ApplyStatus(ctx context.Context, persistentVolumeClaim *corev1.PersistentVolumeClaimApplyConfiguration, opts metav1.ApplyOptions) (result *v1.PersistentVolumeClaim, err error) { + if persistentVolumeClaim == nil { + return nil, fmt.Errorf("persistentVolumeClaim provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(persistentVolumeClaim) + if err != nil { + return nil, err + } + + name := persistentVolumeClaim.Name + if name == nil { + return nil, fmt.Errorf("persistentVolumeClaim.Name must be provided to Apply") + } + + result = &v1.PersistentVolumeClaim{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("persistentvolumeclaims"). + Name(*name). + SubResource("status"). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/pod.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/pod.go index 36092ab640fd..14b7bd0f04a8 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/pod.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/pod.go @@ -20,12 +20,15 @@ package v1 import ( "context" + json "encoding/json" + "fmt" "time" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + corev1 "k8s.io/client-go/applyconfigurations/core/v1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -47,6 +50,8 @@ type PodInterface interface { List(ctx context.Context, opts metav1.ListOptions) (*v1.PodList, error) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.Pod, err error) + Apply(ctx context.Context, pod *corev1.PodApplyConfiguration, opts metav1.ApplyOptions) (result *v1.Pod, err error) + ApplyStatus(ctx context.Context, pod *corev1.PodApplyConfiguration, opts metav1.ApplyOptions) (result *v1.Pod, err error) GetEphemeralContainers(ctx context.Context, podName string, options metav1.GetOptions) (*v1.EphemeralContainers, error) UpdateEphemeralContainers(ctx context.Context, podName string, ephemeralContainers *v1.EphemeralContainers, opts metav1.UpdateOptions) (*v1.EphemeralContainers, error) @@ -197,6 +202,62 @@ func (c *pods) Patch(ctx context.Context, name string, pt types.PatchType, data return } +// Apply takes the given apply declarative configuration, applies it and returns the applied pod. +func (c *pods) Apply(ctx context.Context, pod *corev1.PodApplyConfiguration, opts metav1.ApplyOptions) (result *v1.Pod, err error) { + if pod == nil { + return nil, fmt.Errorf("pod provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(pod) + if err != nil { + return nil, err + } + name := pod.Name + if name == nil { + return nil, fmt.Errorf("pod.Name must be provided to Apply") + } + result = &v1.Pod{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("pods"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *pods) ApplyStatus(ctx context.Context, pod *corev1.PodApplyConfiguration, opts metav1.ApplyOptions) (result *v1.Pod, err error) { + if pod == nil { + return nil, fmt.Errorf("pod provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(pod) + if err != nil { + return nil, err + } + + name := pod.Name + if name == nil { + return nil, fmt.Errorf("pod.Name must be provided to Apply") + } + + result = &v1.Pod{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("pods"). + Name(*name). + SubResource("status"). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + // GetEphemeralContainers takes name of the pod, and returns the corresponding v1.EphemeralContainers object, and an error if there is any. func (c *pods) GetEphemeralContainers(ctx context.Context, podName string, options metav1.GetOptions) (result *v1.EphemeralContainers, err error) { result = &v1.EphemeralContainers{} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/podtemplate.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/podtemplate.go index 012d3b52c42c..ff90fc0e629d 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/podtemplate.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/podtemplate.go @@ -20,12 +20,15 @@ package v1 import ( "context" + json "encoding/json" + "fmt" "time" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + corev1 "k8s.io/client-go/applyconfigurations/core/v1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type PodTemplateInterface interface { List(ctx context.Context, opts metav1.ListOptions) (*v1.PodTemplateList, error) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.PodTemplate, err error) + Apply(ctx context.Context, podTemplate *corev1.PodTemplateApplyConfiguration, opts metav1.ApplyOptions) (result *v1.PodTemplate, err error) PodTemplateExpansion } @@ -176,3 +180,29 @@ func (c *podTemplates) Patch(ctx context.Context, name string, pt types.PatchTyp Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied podTemplate. +func (c *podTemplates) Apply(ctx context.Context, podTemplate *corev1.PodTemplateApplyConfiguration, opts metav1.ApplyOptions) (result *v1.PodTemplate, err error) { + if podTemplate == nil { + return nil, fmt.Errorf("podTemplate provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(podTemplate) + if err != nil { + return nil, err + } + name := podTemplate.Name + if name == nil { + return nil, fmt.Errorf("podTemplate.Name must be provided to Apply") + } + result = &v1.PodTemplate{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("podtemplates"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/replicationcontroller.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/replicationcontroller.go index 8e9ccd59de6e..49c75d967bb5 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/replicationcontroller.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/replicationcontroller.go @@ -20,6 +20,8 @@ package v1 import ( "context" + json "encoding/json" + "fmt" "time" autoscalingv1 "k8s.io/api/autoscaling/v1" @@ -27,6 +29,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + corev1 "k8s.io/client-go/applyconfigurations/core/v1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -48,6 +51,8 @@ type ReplicationControllerInterface interface { List(ctx context.Context, opts metav1.ListOptions) (*v1.ReplicationControllerList, error) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.ReplicationController, err error) + Apply(ctx context.Context, replicationController *corev1.ReplicationControllerApplyConfiguration, opts metav1.ApplyOptions) (result *v1.ReplicationController, err error) + ApplyStatus(ctx context.Context, replicationController *corev1.ReplicationControllerApplyConfiguration, opts metav1.ApplyOptions) (result *v1.ReplicationController, err error) GetScale(ctx context.Context, replicationControllerName string, options metav1.GetOptions) (*autoscalingv1.Scale, error) UpdateScale(ctx context.Context, replicationControllerName string, scale *autoscalingv1.Scale, opts metav1.UpdateOptions) (*autoscalingv1.Scale, error) @@ -198,6 +203,62 @@ func (c *replicationControllers) Patch(ctx context.Context, name string, pt type return } +// Apply takes the given apply declarative configuration, applies it and returns the applied replicationController. +func (c *replicationControllers) Apply(ctx context.Context, replicationController *corev1.ReplicationControllerApplyConfiguration, opts metav1.ApplyOptions) (result *v1.ReplicationController, err error) { + if replicationController == nil { + return nil, fmt.Errorf("replicationController provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(replicationController) + if err != nil { + return nil, err + } + name := replicationController.Name + if name == nil { + return nil, fmt.Errorf("replicationController.Name must be provided to Apply") + } + result = &v1.ReplicationController{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("replicationcontrollers"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *replicationControllers) ApplyStatus(ctx context.Context, replicationController *corev1.ReplicationControllerApplyConfiguration, opts metav1.ApplyOptions) (result *v1.ReplicationController, err error) { + if replicationController == nil { + return nil, fmt.Errorf("replicationController provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(replicationController) + if err != nil { + return nil, err + } + + name := replicationController.Name + if name == nil { + return nil, fmt.Errorf("replicationController.Name must be provided to Apply") + } + + result = &v1.ReplicationController{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("replicationcontrollers"). + Name(*name). + SubResource("status"). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + // GetScale takes name of the replicationController, and returns the corresponding autoscalingv1.Scale object, and an error if there is any. func (c *replicationControllers) GetScale(ctx context.Context, replicationControllerName string, options metav1.GetOptions) (result *autoscalingv1.Scale, err error) { result = &autoscalingv1.Scale{} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/resourcequota.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/resourcequota.go index 6a41e35fdb2d..8444d164edda 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/resourcequota.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/resourcequota.go @@ -20,12 +20,15 @@ package v1 import ( "context" + json "encoding/json" + "fmt" "time" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + corev1 "k8s.io/client-go/applyconfigurations/core/v1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -47,6 +50,8 @@ type ResourceQuotaInterface interface { List(ctx context.Context, opts metav1.ListOptions) (*v1.ResourceQuotaList, error) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.ResourceQuota, err error) + Apply(ctx context.Context, resourceQuota *corev1.ResourceQuotaApplyConfiguration, opts metav1.ApplyOptions) (result *v1.ResourceQuota, err error) + ApplyStatus(ctx context.Context, resourceQuota *corev1.ResourceQuotaApplyConfiguration, opts metav1.ApplyOptions) (result *v1.ResourceQuota, err error) ResourceQuotaExpansion } @@ -193,3 +198,59 @@ func (c *resourceQuotas) Patch(ctx context.Context, name string, pt types.PatchT Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied resourceQuota. +func (c *resourceQuotas) Apply(ctx context.Context, resourceQuota *corev1.ResourceQuotaApplyConfiguration, opts metav1.ApplyOptions) (result *v1.ResourceQuota, err error) { + if resourceQuota == nil { + return nil, fmt.Errorf("resourceQuota provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(resourceQuota) + if err != nil { + return nil, err + } + name := resourceQuota.Name + if name == nil { + return nil, fmt.Errorf("resourceQuota.Name must be provided to Apply") + } + result = &v1.ResourceQuota{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("resourcequotas"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *resourceQuotas) ApplyStatus(ctx context.Context, resourceQuota *corev1.ResourceQuotaApplyConfiguration, opts metav1.ApplyOptions) (result *v1.ResourceQuota, err error) { + if resourceQuota == nil { + return nil, fmt.Errorf("resourceQuota provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(resourceQuota) + if err != nil { + return nil, err + } + + name := resourceQuota.Name + if name == nil { + return nil, fmt.Errorf("resourceQuota.Name must be provided to Apply") + } + + result = &v1.ResourceQuota{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("resourcequotas"). + Name(*name). + SubResource("status"). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/secret.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/secret.go index b2bd80baa524..4aba330381db 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/secret.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/secret.go @@ -20,12 +20,15 @@ package v1 import ( "context" + json "encoding/json" + "fmt" "time" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + corev1 "k8s.io/client-go/applyconfigurations/core/v1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type SecretInterface interface { List(ctx context.Context, opts metav1.ListOptions) (*v1.SecretList, error) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.Secret, err error) + Apply(ctx context.Context, secret *corev1.SecretApplyConfiguration, opts metav1.ApplyOptions) (result *v1.Secret, err error) SecretExpansion } @@ -176,3 +180,29 @@ func (c *secrets) Patch(ctx context.Context, name string, pt types.PatchType, da Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied secret. +func (c *secrets) Apply(ctx context.Context, secret *corev1.SecretApplyConfiguration, opts metav1.ApplyOptions) (result *v1.Secret, err error) { + if secret == nil { + return nil, fmt.Errorf("secret provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(secret) + if err != nil { + return nil, err + } + name := secret.Name + if name == nil { + return nil, fmt.Errorf("secret.Name must be provided to Apply") + } + result = &v1.Secret{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("secrets"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/service.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/service.go index ddde2ec6c7b2..3fe22ba44458 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/service.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/service.go @@ -20,12 +20,15 @@ package v1 import ( "context" + json "encoding/json" + "fmt" "time" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + corev1 "k8s.io/client-go/applyconfigurations/core/v1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,8 @@ type ServiceInterface interface { List(ctx context.Context, opts metav1.ListOptions) (*v1.ServiceList, error) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.Service, err error) + Apply(ctx context.Context, service *corev1.ServiceApplyConfiguration, opts metav1.ApplyOptions) (result *v1.Service, err error) + ApplyStatus(ctx context.Context, service *corev1.ServiceApplyConfiguration, opts metav1.ApplyOptions) (result *v1.Service, err error) ServiceExpansion } @@ -176,3 +181,59 @@ func (c *services) Patch(ctx context.Context, name string, pt types.PatchType, d Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied service. +func (c *services) Apply(ctx context.Context, service *corev1.ServiceApplyConfiguration, opts metav1.ApplyOptions) (result *v1.Service, err error) { + if service == nil { + return nil, fmt.Errorf("service provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(service) + if err != nil { + return nil, err + } + name := service.Name + if name == nil { + return nil, fmt.Errorf("service.Name must be provided to Apply") + } + result = &v1.Service{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("services"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *services) ApplyStatus(ctx context.Context, service *corev1.ServiceApplyConfiguration, opts metav1.ApplyOptions) (result *v1.Service, err error) { + if service == nil { + return nil, fmt.Errorf("service provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(service) + if err != nil { + return nil, err + } + + name := service.Name + if name == nil { + return nil, fmt.Errorf("service.Name must be provided to Apply") + } + + result = &v1.Service{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("services"). + Name(*name). + SubResource("status"). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/serviceaccount.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/serviceaccount.go index c2ddfbfdb74a..bdf589b96084 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/serviceaccount.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/serviceaccount.go @@ -20,6 +20,8 @@ package v1 import ( "context" + json "encoding/json" + "fmt" "time" authenticationv1 "k8s.io/api/authentication/v1" @@ -27,6 +29,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + corev1 "k8s.io/client-go/applyconfigurations/core/v1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -47,6 +50,7 @@ type ServiceAccountInterface interface { List(ctx context.Context, opts metav1.ListOptions) (*v1.ServiceAccountList, error) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.ServiceAccount, err error) + Apply(ctx context.Context, serviceAccount *corev1.ServiceAccountApplyConfiguration, opts metav1.ApplyOptions) (result *v1.ServiceAccount, err error) CreateToken(ctx context.Context, serviceAccountName string, tokenRequest *authenticationv1.TokenRequest, opts metav1.CreateOptions) (*authenticationv1.TokenRequest, error) ServiceAccountExpansion @@ -180,6 +184,32 @@ func (c *serviceAccounts) Patch(ctx context.Context, name string, pt types.Patch return } +// Apply takes the given apply declarative configuration, applies it and returns the applied serviceAccount. +func (c *serviceAccounts) Apply(ctx context.Context, serviceAccount *corev1.ServiceAccountApplyConfiguration, opts metav1.ApplyOptions) (result *v1.ServiceAccount, err error) { + if serviceAccount == nil { + return nil, fmt.Errorf("serviceAccount provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(serviceAccount) + if err != nil { + return nil, err + } + name := serviceAccount.Name + if name == nil { + return nil, fmt.Errorf("serviceAccount.Name must be provided to Apply") + } + result = &v1.ServiceAccount{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("serviceaccounts"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + // CreateToken takes the representation of a tokenRequest and creates it. Returns the server's representation of the tokenRequest, and an error, if there is any. func (c *serviceAccounts) CreateToken(ctx context.Context, serviceAccountName string, tokenRequest *authenticationv1.TokenRequest, opts metav1.CreateOptions) (result *authenticationv1.TokenRequest, err error) { result = &authenticationv1.TokenRequest{} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1/discovery_client.go b/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1/discovery_client.go new file mode 100644 index 000000000000..cb2632762644 --- /dev/null +++ b/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1/discovery_client.go @@ -0,0 +1,89 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/discovery/v1" + "k8s.io/client-go/kubernetes/scheme" + rest "k8s.io/client-go/rest" +) + +type DiscoveryV1Interface interface { + RESTClient() rest.Interface + EndpointSlicesGetter +} + +// DiscoveryV1Client is used to interact with features provided by the discovery.k8s.io group. +type DiscoveryV1Client struct { + restClient rest.Interface +} + +func (c *DiscoveryV1Client) EndpointSlices(namespace string) EndpointSliceInterface { + return newEndpointSlices(c, namespace) +} + +// NewForConfig creates a new DiscoveryV1Client for the given config. +func NewForConfig(c *rest.Config) (*DiscoveryV1Client, error) { + config := *c + if err := setConfigDefaults(&config); err != nil { + return nil, err + } + client, err := rest.RESTClientFor(&config) + if err != nil { + return nil, err + } + return &DiscoveryV1Client{client}, nil +} + +// NewForConfigOrDie creates a new DiscoveryV1Client for the given config and +// panics if there is an error in the config. +func NewForConfigOrDie(c *rest.Config) *DiscoveryV1Client { + client, err := NewForConfig(c) + if err != nil { + panic(err) + } + return client +} + +// New creates a new DiscoveryV1Client for the given RESTClient. +func New(c rest.Interface) *DiscoveryV1Client { + return &DiscoveryV1Client{c} +} + +func setConfigDefaults(config *rest.Config) error { + gv := v1.SchemeGroupVersion + config.GroupVersion = &gv + config.APIPath = "/apis" + config.NegotiatedSerializer = scheme.Codecs.WithoutConversion() + + if config.UserAgent == "" { + config.UserAgent = rest.DefaultKubernetesUserAgent() + } + + return nil +} + +// RESTClient returns a RESTClient that is used to communicate +// with API server by this client implementation. +func (c *DiscoveryV1Client) RESTClient() rest.Interface { + if c == nil { + return nil + } + return c.restClient +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1/doc.go new file mode 100644 index 000000000000..3af5d054f102 --- /dev/null +++ b/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1/doc.go @@ -0,0 +1,20 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +// This package has the automatically generated typed clients. +package v1 diff --git a/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1/endpointslice.go b/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1/endpointslice.go new file mode 100644 index 000000000000..63e616b033bf --- /dev/null +++ b/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1/endpointslice.go @@ -0,0 +1,208 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package v1 + +import ( + "context" + json "encoding/json" + "fmt" + "time" + + v1 "k8s.io/api/discovery/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + discoveryv1 "k8s.io/client-go/applyconfigurations/discovery/v1" + scheme "k8s.io/client-go/kubernetes/scheme" + rest "k8s.io/client-go/rest" +) + +// EndpointSlicesGetter has a method to return a EndpointSliceInterface. +// A group's client should implement this interface. +type EndpointSlicesGetter interface { + EndpointSlices(namespace string) EndpointSliceInterface +} + +// EndpointSliceInterface has methods to work with EndpointSlice resources. +type EndpointSliceInterface interface { + Create(ctx context.Context, endpointSlice *v1.EndpointSlice, opts metav1.CreateOptions) (*v1.EndpointSlice, error) + Update(ctx context.Context, endpointSlice *v1.EndpointSlice, opts metav1.UpdateOptions) (*v1.EndpointSlice, error) + Delete(ctx context.Context, name string, opts metav1.DeleteOptions) error + DeleteCollection(ctx context.Context, opts metav1.DeleteOptions, listOpts metav1.ListOptions) error + Get(ctx context.Context, name string, opts metav1.GetOptions) (*v1.EndpointSlice, error) + List(ctx context.Context, opts metav1.ListOptions) (*v1.EndpointSliceList, error) + Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) + Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.EndpointSlice, err error) + Apply(ctx context.Context, endpointSlice *discoveryv1.EndpointSliceApplyConfiguration, opts metav1.ApplyOptions) (result *v1.EndpointSlice, err error) + EndpointSliceExpansion +} + +// endpointSlices implements EndpointSliceInterface +type endpointSlices struct { + client rest.Interface + ns string +} + +// newEndpointSlices returns a EndpointSlices +func newEndpointSlices(c *DiscoveryV1Client, namespace string) *endpointSlices { + return &endpointSlices{ + client: c.RESTClient(), + ns: namespace, + } +} + +// Get takes name of the endpointSlice, and returns the corresponding endpointSlice object, and an error if there is any. +func (c *endpointSlices) Get(ctx context.Context, name string, options metav1.GetOptions) (result *v1.EndpointSlice, err error) { + result = &v1.EndpointSlice{} + err = c.client.Get(). + Namespace(c.ns). + Resource("endpointslices"). + Name(name). + VersionedParams(&options, scheme.ParameterCodec). + Do(ctx). + Into(result) + return +} + +// List takes label and field selectors, and returns the list of EndpointSlices that match those selectors. +func (c *endpointSlices) List(ctx context.Context, opts metav1.ListOptions) (result *v1.EndpointSliceList, err error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + result = &v1.EndpointSliceList{} + err = c.client.Get(). + Namespace(c.ns). + Resource("endpointslices"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Do(ctx). + Into(result) + return +} + +// Watch returns a watch.Interface that watches the requested endpointSlices. +func (c *endpointSlices) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + opts.Watch = true + return c.client.Get(). + Namespace(c.ns). + Resource("endpointslices"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Watch(ctx) +} + +// Create takes the representation of a endpointSlice and creates it. Returns the server's representation of the endpointSlice, and an error, if there is any. +func (c *endpointSlices) Create(ctx context.Context, endpointSlice *v1.EndpointSlice, opts metav1.CreateOptions) (result *v1.EndpointSlice, err error) { + result = &v1.EndpointSlice{} + err = c.client.Post(). + Namespace(c.ns). + Resource("endpointslices"). + VersionedParams(&opts, scheme.ParameterCodec). + Body(endpointSlice). + Do(ctx). + Into(result) + return +} + +// Update takes the representation of a endpointSlice and updates it. Returns the server's representation of the endpointSlice, and an error, if there is any. +func (c *endpointSlices) Update(ctx context.Context, endpointSlice *v1.EndpointSlice, opts metav1.UpdateOptions) (result *v1.EndpointSlice, err error) { + result = &v1.EndpointSlice{} + err = c.client.Put(). + Namespace(c.ns). + Resource("endpointslices"). + Name(endpointSlice.Name). + VersionedParams(&opts, scheme.ParameterCodec). + Body(endpointSlice). + Do(ctx). + Into(result) + return +} + +// Delete takes name of the endpointSlice and deletes it. Returns an error if one occurs. +func (c *endpointSlices) Delete(ctx context.Context, name string, opts metav1.DeleteOptions) error { + return c.client.Delete(). + Namespace(c.ns). + Resource("endpointslices"). + Name(name). + Body(&opts). + Do(ctx). + Error() +} + +// DeleteCollection deletes a collection of objects. +func (c *endpointSlices) DeleteCollection(ctx context.Context, opts metav1.DeleteOptions, listOpts metav1.ListOptions) error { + var timeout time.Duration + if listOpts.TimeoutSeconds != nil { + timeout = time.Duration(*listOpts.TimeoutSeconds) * time.Second + } + return c.client.Delete(). + Namespace(c.ns). + Resource("endpointslices"). + VersionedParams(&listOpts, scheme.ParameterCodec). + Timeout(timeout). + Body(&opts). + Do(ctx). + Error() +} + +// Patch applies the patch and returns the patched endpointSlice. +func (c *endpointSlices) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.EndpointSlice, err error) { + result = &v1.EndpointSlice{} + err = c.client.Patch(pt). + Namespace(c.ns). + Resource("endpointslices"). + Name(name). + SubResource(subresources...). + VersionedParams(&opts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// Apply takes the given apply declarative configuration, applies it and returns the applied endpointSlice. +func (c *endpointSlices) Apply(ctx context.Context, endpointSlice *discoveryv1.EndpointSliceApplyConfiguration, opts metav1.ApplyOptions) (result *v1.EndpointSlice, err error) { + if endpointSlice == nil { + return nil, fmt.Errorf("endpointSlice provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(endpointSlice) + if err != nil { + return nil, err + } + name := endpointSlice.Name + if name == nil { + return nil, fmt.Errorf("endpointSlice.Name must be provided to Apply") + } + result = &v1.EndpointSlice{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("endpointslices"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/fake/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1/fake/doc.go similarity index 100% rename from vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/fake/doc.go rename to vendor/k8s.io/client-go/kubernetes/typed/discovery/v1/fake/doc.go diff --git a/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1/fake/fake_discovery_client.go b/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1/fake/fake_discovery_client.go similarity index 77% rename from vendor/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1/fake/fake_discovery_client.go rename to vendor/k8s.io/client-go/kubernetes/typed/discovery/v1/fake/fake_discovery_client.go index 532a10756d05..1ca9b23f59d0 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1/fake/fake_discovery_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1/fake/fake_discovery_client.go @@ -19,22 +19,22 @@ limitations under the License. package fake import ( - v1alpha1 "k8s.io/client-go/kubernetes/typed/discovery/v1alpha1" + v1 "k8s.io/client-go/kubernetes/typed/discovery/v1" rest "k8s.io/client-go/rest" testing "k8s.io/client-go/testing" ) -type FakeDiscoveryV1alpha1 struct { +type FakeDiscoveryV1 struct { *testing.Fake } -func (c *FakeDiscoveryV1alpha1) EndpointSlices(namespace string) v1alpha1.EndpointSliceInterface { +func (c *FakeDiscoveryV1) EndpointSlices(namespace string) v1.EndpointSliceInterface { return &FakeEndpointSlices{c, namespace} } // RESTClient returns a RESTClient that is used to communicate // with API server by this client implementation. -func (c *FakeDiscoveryV1alpha1) RESTClient() rest.Interface { +func (c *FakeDiscoveryV1) RESTClient() rest.Interface { var ret *rest.RESTClient return ret } diff --git a/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1/fake/fake_endpointslice.go b/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1/fake/fake_endpointslice.go new file mode 100644 index 000000000000..9113061ff989 --- /dev/null +++ b/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1/fake/fake_endpointslice.go @@ -0,0 +1,155 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package fake + +import ( + "context" + json "encoding/json" + "fmt" + + discoveryv1 "k8s.io/api/discovery/v1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + labels "k8s.io/apimachinery/pkg/labels" + schema "k8s.io/apimachinery/pkg/runtime/schema" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + applyconfigurationsdiscoveryv1 "k8s.io/client-go/applyconfigurations/discovery/v1" + testing "k8s.io/client-go/testing" +) + +// FakeEndpointSlices implements EndpointSliceInterface +type FakeEndpointSlices struct { + Fake *FakeDiscoveryV1 + ns string +} + +var endpointslicesResource = schema.GroupVersionResource{Group: "discovery.k8s.io", Version: "v1", Resource: "endpointslices"} + +var endpointslicesKind = schema.GroupVersionKind{Group: "discovery.k8s.io", Version: "v1", Kind: "EndpointSlice"} + +// Get takes name of the endpointSlice, and returns the corresponding endpointSlice object, and an error if there is any. +func (c *FakeEndpointSlices) Get(ctx context.Context, name string, options v1.GetOptions) (result *discoveryv1.EndpointSlice, err error) { + obj, err := c.Fake. + Invokes(testing.NewGetAction(endpointslicesResource, c.ns, name), &discoveryv1.EndpointSlice{}) + + if obj == nil { + return nil, err + } + return obj.(*discoveryv1.EndpointSlice), err +} + +// List takes label and field selectors, and returns the list of EndpointSlices that match those selectors. +func (c *FakeEndpointSlices) List(ctx context.Context, opts v1.ListOptions) (result *discoveryv1.EndpointSliceList, err error) { + obj, err := c.Fake. + Invokes(testing.NewListAction(endpointslicesResource, endpointslicesKind, c.ns, opts), &discoveryv1.EndpointSliceList{}) + + if obj == nil { + return nil, err + } + + label, _, _ := testing.ExtractFromListOptions(opts) + if label == nil { + label = labels.Everything() + } + list := &discoveryv1.EndpointSliceList{ListMeta: obj.(*discoveryv1.EndpointSliceList).ListMeta} + for _, item := range obj.(*discoveryv1.EndpointSliceList).Items { + if label.Matches(labels.Set(item.Labels)) { + list.Items = append(list.Items, item) + } + } + return list, err +} + +// Watch returns a watch.Interface that watches the requested endpointSlices. +func (c *FakeEndpointSlices) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) { + return c.Fake. + InvokesWatch(testing.NewWatchAction(endpointslicesResource, c.ns, opts)) + +} + +// Create takes the representation of a endpointSlice and creates it. Returns the server's representation of the endpointSlice, and an error, if there is any. +func (c *FakeEndpointSlices) Create(ctx context.Context, endpointSlice *discoveryv1.EndpointSlice, opts v1.CreateOptions) (result *discoveryv1.EndpointSlice, err error) { + obj, err := c.Fake. + Invokes(testing.NewCreateAction(endpointslicesResource, c.ns, endpointSlice), &discoveryv1.EndpointSlice{}) + + if obj == nil { + return nil, err + } + return obj.(*discoveryv1.EndpointSlice), err +} + +// Update takes the representation of a endpointSlice and updates it. Returns the server's representation of the endpointSlice, and an error, if there is any. +func (c *FakeEndpointSlices) Update(ctx context.Context, endpointSlice *discoveryv1.EndpointSlice, opts v1.UpdateOptions) (result *discoveryv1.EndpointSlice, err error) { + obj, err := c.Fake. + Invokes(testing.NewUpdateAction(endpointslicesResource, c.ns, endpointSlice), &discoveryv1.EndpointSlice{}) + + if obj == nil { + return nil, err + } + return obj.(*discoveryv1.EndpointSlice), err +} + +// Delete takes name of the endpointSlice and deletes it. Returns an error if one occurs. +func (c *FakeEndpointSlices) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error { + _, err := c.Fake. + Invokes(testing.NewDeleteAction(endpointslicesResource, c.ns, name), &discoveryv1.EndpointSlice{}) + + return err +} + +// DeleteCollection deletes a collection of objects. +func (c *FakeEndpointSlices) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error { + action := testing.NewDeleteCollectionAction(endpointslicesResource, c.ns, listOpts) + + _, err := c.Fake.Invokes(action, &discoveryv1.EndpointSliceList{}) + return err +} + +// Patch applies the patch and returns the patched endpointSlice. +func (c *FakeEndpointSlices) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *discoveryv1.EndpointSlice, err error) { + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(endpointslicesResource, c.ns, name, pt, data, subresources...), &discoveryv1.EndpointSlice{}) + + if obj == nil { + return nil, err + } + return obj.(*discoveryv1.EndpointSlice), err +} + +// Apply takes the given apply declarative configuration, applies it and returns the applied endpointSlice. +func (c *FakeEndpointSlices) Apply(ctx context.Context, endpointSlice *applyconfigurationsdiscoveryv1.EndpointSliceApplyConfiguration, opts v1.ApplyOptions) (result *discoveryv1.EndpointSlice, err error) { + if endpointSlice == nil { + return nil, fmt.Errorf("endpointSlice provided to Apply must not be nil") + } + data, err := json.Marshal(endpointSlice) + if err != nil { + return nil, err + } + name := endpointSlice.Name + if name == nil { + return nil, fmt.Errorf("endpointSlice.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(endpointslicesResource, c.ns, *name, types.ApplyPatchType, data), &discoveryv1.EndpointSlice{}) + + if obj == nil { + return nil, err + } + return obj.(*discoveryv1.EndpointSlice), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1/generated_expansion.go b/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1/generated_expansion.go new file mode 100644 index 000000000000..56147f60a0c7 --- /dev/null +++ b/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1/generated_expansion.go @@ -0,0 +1,21 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package v1 + +type EndpointSliceExpansion interface{} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1/BUILD deleted file mode 100644 index d239cb064c04..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "discovery_client.go", - "doc.go", - "endpointslice.go", - "generated_expansion.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1", - importpath = "k8s.io/client-go/kubernetes/typed/discovery/v1alpha1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/discovery/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1/fake:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1/discovery_client.go b/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1/discovery_client.go deleted file mode 100644 index e65a0988d8f8..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1/discovery_client.go +++ /dev/null @@ -1,89 +0,0 @@ -/* -Copyright The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by client-gen. DO NOT EDIT. - -package v1alpha1 - -import ( - v1alpha1 "k8s.io/api/discovery/v1alpha1" - "k8s.io/client-go/kubernetes/scheme" - rest "k8s.io/client-go/rest" -) - -type DiscoveryV1alpha1Interface interface { - RESTClient() rest.Interface - EndpointSlicesGetter -} - -// DiscoveryV1alpha1Client is used to interact with features provided by the discovery.k8s.io group. -type DiscoveryV1alpha1Client struct { - restClient rest.Interface -} - -func (c *DiscoveryV1alpha1Client) EndpointSlices(namespace string) EndpointSliceInterface { - return newEndpointSlices(c, namespace) -} - -// NewForConfig creates a new DiscoveryV1alpha1Client for the given config. -func NewForConfig(c *rest.Config) (*DiscoveryV1alpha1Client, error) { - config := *c - if err := setConfigDefaults(&config); err != nil { - return nil, err - } - client, err := rest.RESTClientFor(&config) - if err != nil { - return nil, err - } - return &DiscoveryV1alpha1Client{client}, nil -} - -// NewForConfigOrDie creates a new DiscoveryV1alpha1Client for the given config and -// panics if there is an error in the config. -func NewForConfigOrDie(c *rest.Config) *DiscoveryV1alpha1Client { - client, err := NewForConfig(c) - if err != nil { - panic(err) - } - return client -} - -// New creates a new DiscoveryV1alpha1Client for the given RESTClient. -func New(c rest.Interface) *DiscoveryV1alpha1Client { - return &DiscoveryV1alpha1Client{c} -} - -func setConfigDefaults(config *rest.Config) error { - gv := v1alpha1.SchemeGroupVersion - config.GroupVersion = &gv - config.APIPath = "/apis" - config.NegotiatedSerializer = scheme.Codecs.WithoutConversion() - - if config.UserAgent == "" { - config.UserAgent = rest.DefaultKubernetesUserAgent() - } - - return nil -} - -// RESTClient returns a RESTClient that is used to communicate -// with API server by this client implementation. -func (c *DiscoveryV1alpha1Client) RESTClient() rest.Interface { - if c == nil { - return nil - } - return c.restClient -} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1/doc.go deleted file mode 100644 index df51baa4d4c1..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1/doc.go +++ /dev/null @@ -1,20 +0,0 @@ -/* -Copyright The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by client-gen. DO NOT EDIT. - -// This package has the automatically generated typed clients. -package v1alpha1 diff --git a/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1/endpointslice.go b/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1/endpointslice.go deleted file mode 100644 index 63b4627d3377..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1/endpointslice.go +++ /dev/null @@ -1,178 +0,0 @@ -/* -Copyright The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by client-gen. DO NOT EDIT. - -package v1alpha1 - -import ( - "context" - "time" - - v1alpha1 "k8s.io/api/discovery/v1alpha1" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - types "k8s.io/apimachinery/pkg/types" - watch "k8s.io/apimachinery/pkg/watch" - scheme "k8s.io/client-go/kubernetes/scheme" - rest "k8s.io/client-go/rest" -) - -// EndpointSlicesGetter has a method to return a EndpointSliceInterface. -// A group's client should implement this interface. -type EndpointSlicesGetter interface { - EndpointSlices(namespace string) EndpointSliceInterface -} - -// EndpointSliceInterface has methods to work with EndpointSlice resources. -type EndpointSliceInterface interface { - Create(ctx context.Context, endpointSlice *v1alpha1.EndpointSlice, opts v1.CreateOptions) (*v1alpha1.EndpointSlice, error) - Update(ctx context.Context, endpointSlice *v1alpha1.EndpointSlice, opts v1.UpdateOptions) (*v1alpha1.EndpointSlice, error) - Delete(ctx context.Context, name string, opts v1.DeleteOptions) error - DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error - Get(ctx context.Context, name string, opts v1.GetOptions) (*v1alpha1.EndpointSlice, error) - List(ctx context.Context, opts v1.ListOptions) (*v1alpha1.EndpointSliceList, error) - Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) - Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.EndpointSlice, err error) - EndpointSliceExpansion -} - -// endpointSlices implements EndpointSliceInterface -type endpointSlices struct { - client rest.Interface - ns string -} - -// newEndpointSlices returns a EndpointSlices -func newEndpointSlices(c *DiscoveryV1alpha1Client, namespace string) *endpointSlices { - return &endpointSlices{ - client: c.RESTClient(), - ns: namespace, - } -} - -// Get takes name of the endpointSlice, and returns the corresponding endpointSlice object, and an error if there is any. -func (c *endpointSlices) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.EndpointSlice, err error) { - result = &v1alpha1.EndpointSlice{} - err = c.client.Get(). - Namespace(c.ns). - Resource("endpointslices"). - Name(name). - VersionedParams(&options, scheme.ParameterCodec). - Do(ctx). - Into(result) - return -} - -// List takes label and field selectors, and returns the list of EndpointSlices that match those selectors. -func (c *endpointSlices) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha1.EndpointSliceList, err error) { - var timeout time.Duration - if opts.TimeoutSeconds != nil { - timeout = time.Duration(*opts.TimeoutSeconds) * time.Second - } - result = &v1alpha1.EndpointSliceList{} - err = c.client.Get(). - Namespace(c.ns). - Resource("endpointslices"). - VersionedParams(&opts, scheme.ParameterCodec). - Timeout(timeout). - Do(ctx). - Into(result) - return -} - -// Watch returns a watch.Interface that watches the requested endpointSlices. -func (c *endpointSlices) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) { - var timeout time.Duration - if opts.TimeoutSeconds != nil { - timeout = time.Duration(*opts.TimeoutSeconds) * time.Second - } - opts.Watch = true - return c.client.Get(). - Namespace(c.ns). - Resource("endpointslices"). - VersionedParams(&opts, scheme.ParameterCodec). - Timeout(timeout). - Watch(ctx) -} - -// Create takes the representation of a endpointSlice and creates it. Returns the server's representation of the endpointSlice, and an error, if there is any. -func (c *endpointSlices) Create(ctx context.Context, endpointSlice *v1alpha1.EndpointSlice, opts v1.CreateOptions) (result *v1alpha1.EndpointSlice, err error) { - result = &v1alpha1.EndpointSlice{} - err = c.client.Post(). - Namespace(c.ns). - Resource("endpointslices"). - VersionedParams(&opts, scheme.ParameterCodec). - Body(endpointSlice). - Do(ctx). - Into(result) - return -} - -// Update takes the representation of a endpointSlice and updates it. Returns the server's representation of the endpointSlice, and an error, if there is any. -func (c *endpointSlices) Update(ctx context.Context, endpointSlice *v1alpha1.EndpointSlice, opts v1.UpdateOptions) (result *v1alpha1.EndpointSlice, err error) { - result = &v1alpha1.EndpointSlice{} - err = c.client.Put(). - Namespace(c.ns). - Resource("endpointslices"). - Name(endpointSlice.Name). - VersionedParams(&opts, scheme.ParameterCodec). - Body(endpointSlice). - Do(ctx). - Into(result) - return -} - -// Delete takes name of the endpointSlice and deletes it. Returns an error if one occurs. -func (c *endpointSlices) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error { - return c.client.Delete(). - Namespace(c.ns). - Resource("endpointslices"). - Name(name). - Body(&opts). - Do(ctx). - Error() -} - -// DeleteCollection deletes a collection of objects. -func (c *endpointSlices) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error { - var timeout time.Duration - if listOpts.TimeoutSeconds != nil { - timeout = time.Duration(*listOpts.TimeoutSeconds) * time.Second - } - return c.client.Delete(). - Namespace(c.ns). - Resource("endpointslices"). - VersionedParams(&listOpts, scheme.ParameterCodec). - Timeout(timeout). - Body(&opts). - Do(ctx). - Error() -} - -// Patch applies the patch and returns the patched endpointSlice. -func (c *endpointSlices) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.EndpointSlice, err error) { - result = &v1alpha1.EndpointSlice{} - err = c.client.Patch(pt). - Namespace(c.ns). - Resource("endpointslices"). - Name(name). - SubResource(subresources...). - VersionedParams(&opts, scheme.ParameterCodec). - Body(data). - Do(ctx). - Into(result) - return -} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1/fake/BUILD deleted file mode 100644 index 36212888845b..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1/fake/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_discovery_client.go", - "fake_endpointslice.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1/fake", - importpath = "k8s.io/client-go/kubernetes/typed/discovery/v1alpha1/fake", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/discovery/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1/fake/fake_endpointslice.go b/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1/fake/fake_endpointslice.go deleted file mode 100644 index f180340ab679..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1/fake/fake_endpointslice.go +++ /dev/null @@ -1,130 +0,0 @@ -/* -Copyright The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by client-gen. DO NOT EDIT. - -package fake - -import ( - "context" - - v1alpha1 "k8s.io/api/discovery/v1alpha1" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - labels "k8s.io/apimachinery/pkg/labels" - schema "k8s.io/apimachinery/pkg/runtime/schema" - types "k8s.io/apimachinery/pkg/types" - watch "k8s.io/apimachinery/pkg/watch" - testing "k8s.io/client-go/testing" -) - -// FakeEndpointSlices implements EndpointSliceInterface -type FakeEndpointSlices struct { - Fake *FakeDiscoveryV1alpha1 - ns string -} - -var endpointslicesResource = schema.GroupVersionResource{Group: "discovery.k8s.io", Version: "v1alpha1", Resource: "endpointslices"} - -var endpointslicesKind = schema.GroupVersionKind{Group: "discovery.k8s.io", Version: "v1alpha1", Kind: "EndpointSlice"} - -// Get takes name of the endpointSlice, and returns the corresponding endpointSlice object, and an error if there is any. -func (c *FakeEndpointSlices) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.EndpointSlice, err error) { - obj, err := c.Fake. - Invokes(testing.NewGetAction(endpointslicesResource, c.ns, name), &v1alpha1.EndpointSlice{}) - - if obj == nil { - return nil, err - } - return obj.(*v1alpha1.EndpointSlice), err -} - -// List takes label and field selectors, and returns the list of EndpointSlices that match those selectors. -func (c *FakeEndpointSlices) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha1.EndpointSliceList, err error) { - obj, err := c.Fake. - Invokes(testing.NewListAction(endpointslicesResource, endpointslicesKind, c.ns, opts), &v1alpha1.EndpointSliceList{}) - - if obj == nil { - return nil, err - } - - label, _, _ := testing.ExtractFromListOptions(opts) - if label == nil { - label = labels.Everything() - } - list := &v1alpha1.EndpointSliceList{ListMeta: obj.(*v1alpha1.EndpointSliceList).ListMeta} - for _, item := range obj.(*v1alpha1.EndpointSliceList).Items { - if label.Matches(labels.Set(item.Labels)) { - list.Items = append(list.Items, item) - } - } - return list, err -} - -// Watch returns a watch.Interface that watches the requested endpointSlices. -func (c *FakeEndpointSlices) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) { - return c.Fake. - InvokesWatch(testing.NewWatchAction(endpointslicesResource, c.ns, opts)) - -} - -// Create takes the representation of a endpointSlice and creates it. Returns the server's representation of the endpointSlice, and an error, if there is any. -func (c *FakeEndpointSlices) Create(ctx context.Context, endpointSlice *v1alpha1.EndpointSlice, opts v1.CreateOptions) (result *v1alpha1.EndpointSlice, err error) { - obj, err := c.Fake. - Invokes(testing.NewCreateAction(endpointslicesResource, c.ns, endpointSlice), &v1alpha1.EndpointSlice{}) - - if obj == nil { - return nil, err - } - return obj.(*v1alpha1.EndpointSlice), err -} - -// Update takes the representation of a endpointSlice and updates it. Returns the server's representation of the endpointSlice, and an error, if there is any. -func (c *FakeEndpointSlices) Update(ctx context.Context, endpointSlice *v1alpha1.EndpointSlice, opts v1.UpdateOptions) (result *v1alpha1.EndpointSlice, err error) { - obj, err := c.Fake. - Invokes(testing.NewUpdateAction(endpointslicesResource, c.ns, endpointSlice), &v1alpha1.EndpointSlice{}) - - if obj == nil { - return nil, err - } - return obj.(*v1alpha1.EndpointSlice), err -} - -// Delete takes name of the endpointSlice and deletes it. Returns an error if one occurs. -func (c *FakeEndpointSlices) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error { - _, err := c.Fake. - Invokes(testing.NewDeleteAction(endpointslicesResource, c.ns, name), &v1alpha1.EndpointSlice{}) - - return err -} - -// DeleteCollection deletes a collection of objects. -func (c *FakeEndpointSlices) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error { - action := testing.NewDeleteCollectionAction(endpointslicesResource, c.ns, listOpts) - - _, err := c.Fake.Invokes(action, &v1alpha1.EndpointSliceList{}) - return err -} - -// Patch applies the patch and returns the patched endpointSlice. -func (c *FakeEndpointSlices) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.EndpointSlice, err error) { - obj, err := c.Fake. - Invokes(testing.NewPatchSubresourceAction(endpointslicesResource, c.ns, name, pt, data, subresources...), &v1alpha1.EndpointSlice{}) - - if obj == nil { - return nil, err - } - return obj.(*v1alpha1.EndpointSlice), err -} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1/generated_expansion.go b/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1/generated_expansion.go deleted file mode 100644 index e8ceb59a48c7..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1/generated_expansion.go +++ /dev/null @@ -1,21 +0,0 @@ -/* -Copyright The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by client-gen. DO NOT EDIT. - -package v1alpha1 - -type EndpointSliceExpansion interface{} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1beta1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1beta1/BUILD deleted file mode 100644 index a197cd4c3219..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1beta1/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "discovery_client.go", - "doc.go", - "endpointslice.go", - "generated_expansion.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1beta1", - importpath = "k8s.io/client-go/kubernetes/typed/discovery/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/discovery/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/discovery/v1beta1/fake:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1beta1/endpointslice.go b/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1beta1/endpointslice.go index a016663e73e5..2ade83302960 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1beta1/endpointslice.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1beta1/endpointslice.go @@ -20,12 +20,15 @@ package v1beta1 import ( "context" + json "encoding/json" + "fmt" "time" v1beta1 "k8s.io/api/discovery/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + discoveryv1beta1 "k8s.io/client-go/applyconfigurations/discovery/v1beta1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type EndpointSliceInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1beta1.EndpointSliceList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta1.EndpointSlice, err error) + Apply(ctx context.Context, endpointSlice *discoveryv1beta1.EndpointSliceApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.EndpointSlice, err error) EndpointSliceExpansion } @@ -176,3 +180,29 @@ func (c *endpointSlices) Patch(ctx context.Context, name string, pt types.PatchT Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied endpointSlice. +func (c *endpointSlices) Apply(ctx context.Context, endpointSlice *discoveryv1beta1.EndpointSliceApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.EndpointSlice, err error) { + if endpointSlice == nil { + return nil, fmt.Errorf("endpointSlice provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(endpointSlice) + if err != nil { + return nil, err + } + name := endpointSlice.Name + if name == nil { + return nil, fmt.Errorf("endpointSlice.Name must be provided to Apply") + } + result = &v1beta1.EndpointSlice{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("endpointslices"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1beta1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1beta1/fake/BUILD deleted file mode 100644 index d9a82c88e9b9..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1beta1/fake/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_discovery_client.go", - "fake_endpointslice.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1beta1/fake", - importpath = "k8s.io/client-go/kubernetes/typed/discovery/v1beta1/fake", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/discovery/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/discovery/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1beta1/fake/fake_endpointslice.go b/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1beta1/fake/fake_endpointslice.go index f338d1bd64b9..2019fdb44071 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1beta1/fake/fake_endpointslice.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1beta1/fake/fake_endpointslice.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1beta1 "k8s.io/api/discovery/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + discoveryv1beta1 "k8s.io/client-go/applyconfigurations/discovery/v1beta1" testing "k8s.io/client-go/testing" ) @@ -128,3 +131,25 @@ func (c *FakeEndpointSlices) Patch(ctx context.Context, name string, pt types.Pa } return obj.(*v1beta1.EndpointSlice), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied endpointSlice. +func (c *FakeEndpointSlices) Apply(ctx context.Context, endpointSlice *discoveryv1beta1.EndpointSliceApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.EndpointSlice, err error) { + if endpointSlice == nil { + return nil, fmt.Errorf("endpointSlice provided to Apply must not be nil") + } + data, err := json.Marshal(endpointSlice) + if err != nil { + return nil, err + } + name := endpointSlice.Name + if name == nil { + return nil, fmt.Errorf("endpointSlice.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(endpointslicesResource, c.ns, *name, types.ApplyPatchType, data), &v1beta1.EndpointSlice{}) + + if obj == nil { + return nil, err + } + return obj.(*v1beta1.EndpointSlice), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/events/v1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/events/v1/BUILD deleted file mode 100644 index 23530df9fb37..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/events/v1/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "event.go", - "events_client.go", - "generated_expansion.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/events/v1", - importpath = "k8s.io/client-go/kubernetes/typed/events/v1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/events/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/events/v1/fake:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/events/v1/event.go b/vendor/k8s.io/client-go/kubernetes/typed/events/v1/event.go index 3b3496317fcc..c9f2bbed5019 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/events/v1/event.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/events/v1/event.go @@ -20,12 +20,15 @@ package v1 import ( "context" + json "encoding/json" + "fmt" "time" v1 "k8s.io/api/events/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + eventsv1 "k8s.io/client-go/applyconfigurations/events/v1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type EventInterface interface { List(ctx context.Context, opts metav1.ListOptions) (*v1.EventList, error) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.Event, err error) + Apply(ctx context.Context, event *eventsv1.EventApplyConfiguration, opts metav1.ApplyOptions) (result *v1.Event, err error) EventExpansion } @@ -176,3 +180,29 @@ func (c *events) Patch(ctx context.Context, name string, pt types.PatchType, dat Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied event. +func (c *events) Apply(ctx context.Context, event *eventsv1.EventApplyConfiguration, opts metav1.ApplyOptions) (result *v1.Event, err error) { + if event == nil { + return nil, fmt.Errorf("event provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(event) + if err != nil { + return nil, err + } + name := event.Name + if name == nil { + return nil, fmt.Errorf("event.Name must be provided to Apply") + } + result = &v1.Event{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("events"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/events/v1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/events/v1/fake/BUILD deleted file mode 100644 index 26bfd8c2c49b..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/events/v1/fake/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_event.go", - "fake_events_client.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/events/v1/fake", - importpath = "k8s.io/client-go/kubernetes/typed/events/v1/fake", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/events/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/events/v1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/events/v1/fake/fake_event.go b/vendor/k8s.io/client-go/kubernetes/typed/events/v1/fake/fake_event.go index 73c3b4e02e20..3e7065d3130b 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/events/v1/fake/fake_event.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/events/v1/fake/fake_event.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" eventsv1 "k8s.io/api/events/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + applyconfigurationseventsv1 "k8s.io/client-go/applyconfigurations/events/v1" testing "k8s.io/client-go/testing" ) @@ -128,3 +131,25 @@ func (c *FakeEvents) Patch(ctx context.Context, name string, pt types.PatchType, } return obj.(*eventsv1.Event), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied event. +func (c *FakeEvents) Apply(ctx context.Context, event *applyconfigurationseventsv1.EventApplyConfiguration, opts v1.ApplyOptions) (result *eventsv1.Event, err error) { + if event == nil { + return nil, fmt.Errorf("event provided to Apply must not be nil") + } + data, err := json.Marshal(event) + if err != nil { + return nil, err + } + name := event.Name + if name == nil { + return nil, fmt.Errorf("event.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(eventsResource, c.ns, *name, types.ApplyPatchType, data), &eventsv1.Event{}) + + if obj == nil { + return nil, err + } + return obj.(*eventsv1.Event), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/BUILD deleted file mode 100644 index 989577ec2243..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "event.go", - "event_expansion.go", - "events_client.go", - "generated_expansion.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1", - importpath = "k8s.io/client-go/kubernetes/typed/events/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/events/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/events/v1beta1/fake:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/event.go b/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/event.go index 4cdc471fb018..dfdf8b897930 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/event.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/event.go @@ -20,12 +20,15 @@ package v1beta1 import ( "context" + json "encoding/json" + "fmt" "time" v1beta1 "k8s.io/api/events/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + eventsv1beta1 "k8s.io/client-go/applyconfigurations/events/v1beta1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type EventInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1beta1.EventList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta1.Event, err error) + Apply(ctx context.Context, event *eventsv1beta1.EventApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.Event, err error) EventExpansion } @@ -176,3 +180,29 @@ func (c *events) Patch(ctx context.Context, name string, pt types.PatchType, dat Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied event. +func (c *events) Apply(ctx context.Context, event *eventsv1beta1.EventApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.Event, err error) { + if event == nil { + return nil, fmt.Errorf("event provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(event) + if err != nil { + return nil, err + } + name := event.Name + if name == nil { + return nil, fmt.Errorf("event.Name must be provided to Apply") + } + result = &v1beta1.Event{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("events"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/fake/BUILD deleted file mode 100644 index 476a0f6848a7..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/fake/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_event.go", - "fake_event_expansion.go", - "fake_events_client.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/fake", - importpath = "k8s.io/client-go/kubernetes/typed/events/v1beta1/fake", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/events/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/events/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/fake/fake_event.go b/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/fake/fake_event.go index dcf488f7c16f..a8e0a023d814 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/fake/fake_event.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/fake/fake_event.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1beta1 "k8s.io/api/events/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + eventsv1beta1 "k8s.io/client-go/applyconfigurations/events/v1beta1" testing "k8s.io/client-go/testing" ) @@ -128,3 +131,25 @@ func (c *FakeEvents) Patch(ctx context.Context, name string, pt types.PatchType, } return obj.(*v1beta1.Event), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied event. +func (c *FakeEvents) Apply(ctx context.Context, event *eventsv1beta1.EventApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.Event, err error) { + if event == nil { + return nil, fmt.Errorf("event provided to Apply must not be nil") + } + data, err := json.Marshal(event) + if err != nil { + return nil, err + } + name := event.Name + if name == nil { + return nil, fmt.Errorf("event.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(eventsResource, c.ns, *name, types.ApplyPatchType, data), &v1beta1.Event{}) + + if obj == nil { + return nil, err + } + return obj.(*v1beta1.Event), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/BUILD deleted file mode 100644 index df7fb833483b..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/BUILD +++ /dev/null @@ -1,48 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "daemonset.go", - "deployment.go", - "deployment_expansion.go", - "doc.go", - "extensions_client.go", - "generated_expansion.go", - "ingress.go", - "networkpolicy.go", - "podsecuritypolicy.go", - "replicaset.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1", - importpath = "k8s.io/client-go/kubernetes/typed/extensions/v1beta1", - deps = [ - "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/daemonset.go b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/daemonset.go index 0ba8bfc949ff..ffe219fdaac6 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/daemonset.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/daemonset.go @@ -20,12 +20,15 @@ package v1beta1 import ( "context" + json "encoding/json" + "fmt" "time" v1beta1 "k8s.io/api/extensions/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + extensionsv1beta1 "k8s.io/client-go/applyconfigurations/extensions/v1beta1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -47,6 +50,8 @@ type DaemonSetInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1beta1.DaemonSetList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta1.DaemonSet, err error) + Apply(ctx context.Context, daemonSet *extensionsv1beta1.DaemonSetApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.DaemonSet, err error) + ApplyStatus(ctx context.Context, daemonSet *extensionsv1beta1.DaemonSetApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.DaemonSet, err error) DaemonSetExpansion } @@ -193,3 +198,59 @@ func (c *daemonSets) Patch(ctx context.Context, name string, pt types.PatchType, Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied daemonSet. +func (c *daemonSets) Apply(ctx context.Context, daemonSet *extensionsv1beta1.DaemonSetApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.DaemonSet, err error) { + if daemonSet == nil { + return nil, fmt.Errorf("daemonSet provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(daemonSet) + if err != nil { + return nil, err + } + name := daemonSet.Name + if name == nil { + return nil, fmt.Errorf("daemonSet.Name must be provided to Apply") + } + result = &v1beta1.DaemonSet{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("daemonsets"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *daemonSets) ApplyStatus(ctx context.Context, daemonSet *extensionsv1beta1.DaemonSetApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.DaemonSet, err error) { + if daemonSet == nil { + return nil, fmt.Errorf("daemonSet provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(daemonSet) + if err != nil { + return nil, err + } + + name := daemonSet.Name + if name == nil { + return nil, fmt.Errorf("daemonSet.Name must be provided to Apply") + } + + result = &v1beta1.DaemonSet{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("daemonsets"). + Name(*name). + SubResource("status"). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/deployment.go b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/deployment.go index 4265f6decb38..45c90aca3da7 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/deployment.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/deployment.go @@ -20,12 +20,15 @@ package v1beta1 import ( "context" + json "encoding/json" + "fmt" "time" v1beta1 "k8s.io/api/extensions/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + extensionsv1beta1 "k8s.io/client-go/applyconfigurations/extensions/v1beta1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -47,6 +50,8 @@ type DeploymentInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1beta1.DeploymentList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta1.Deployment, err error) + Apply(ctx context.Context, deployment *extensionsv1beta1.DeploymentApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.Deployment, err error) + ApplyStatus(ctx context.Context, deployment *extensionsv1beta1.DeploymentApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.Deployment, err error) GetScale(ctx context.Context, deploymentName string, options v1.GetOptions) (*v1beta1.Scale, error) UpdateScale(ctx context.Context, deploymentName string, scale *v1beta1.Scale, opts v1.UpdateOptions) (*v1beta1.Scale, error) @@ -197,6 +202,62 @@ func (c *deployments) Patch(ctx context.Context, name string, pt types.PatchType return } +// Apply takes the given apply declarative configuration, applies it and returns the applied deployment. +func (c *deployments) Apply(ctx context.Context, deployment *extensionsv1beta1.DeploymentApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.Deployment, err error) { + if deployment == nil { + return nil, fmt.Errorf("deployment provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(deployment) + if err != nil { + return nil, err + } + name := deployment.Name + if name == nil { + return nil, fmt.Errorf("deployment.Name must be provided to Apply") + } + result = &v1beta1.Deployment{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("deployments"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *deployments) ApplyStatus(ctx context.Context, deployment *extensionsv1beta1.DeploymentApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.Deployment, err error) { + if deployment == nil { + return nil, fmt.Errorf("deployment provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(deployment) + if err != nil { + return nil, err + } + + name := deployment.Name + if name == nil { + return nil, fmt.Errorf("deployment.Name must be provided to Apply") + } + + result = &v1beta1.Deployment{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("deployments"). + Name(*name). + SubResource("status"). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + // GetScale takes name of the deployment, and returns the corresponding v1beta1.Scale object, and an error if there is any. func (c *deployments) GetScale(ctx context.Context, deploymentName string, options v1.GetOptions) (result *v1beta1.Scale, err error) { result = &v1beta1.Scale{} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/BUILD deleted file mode 100644 index d9f3f150650e..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/BUILD +++ /dev/null @@ -1,47 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_daemonset.go", - "fake_deployment.go", - "fake_deployment_expansion.go", - "fake_extensions_client.go", - "fake_ingress.go", - "fake_networkpolicy.go", - "fake_podsecuritypolicy.go", - "fake_replicaset.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake", - importpath = "k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake", - deps = [ - "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/extensions/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_daemonset.go b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_daemonset.go index 75e9132e6ed4..f83c312e61eb 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_daemonset.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_daemonset.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1beta1 "k8s.io/api/extensions/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + extensionsv1beta1 "k8s.io/client-go/applyconfigurations/extensions/v1beta1" testing "k8s.io/client-go/testing" ) @@ -140,3 +143,48 @@ func (c *FakeDaemonSets) Patch(ctx context.Context, name string, pt types.PatchT } return obj.(*v1beta1.DaemonSet), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied daemonSet. +func (c *FakeDaemonSets) Apply(ctx context.Context, daemonSet *extensionsv1beta1.DaemonSetApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.DaemonSet, err error) { + if daemonSet == nil { + return nil, fmt.Errorf("daemonSet provided to Apply must not be nil") + } + data, err := json.Marshal(daemonSet) + if err != nil { + return nil, err + } + name := daemonSet.Name + if name == nil { + return nil, fmt.Errorf("daemonSet.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(daemonsetsResource, c.ns, *name, types.ApplyPatchType, data), &v1beta1.DaemonSet{}) + + if obj == nil { + return nil, err + } + return obj.(*v1beta1.DaemonSet), err +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *FakeDaemonSets) ApplyStatus(ctx context.Context, daemonSet *extensionsv1beta1.DaemonSetApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.DaemonSet, err error) { + if daemonSet == nil { + return nil, fmt.Errorf("daemonSet provided to Apply must not be nil") + } + data, err := json.Marshal(daemonSet) + if err != nil { + return nil, err + } + name := daemonSet.Name + if name == nil { + return nil, fmt.Errorf("daemonSet.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(daemonsetsResource, c.ns, *name, types.ApplyPatchType, data, "status"), &v1beta1.DaemonSet{}) + + if obj == nil { + return nil, err + } + return obj.(*v1beta1.DaemonSet), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_deployment.go b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_deployment.go index 2841b7b8770c..97511d300eae 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_deployment.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_deployment.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1beta1 "k8s.io/api/extensions/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + extensionsv1beta1 "k8s.io/client-go/applyconfigurations/extensions/v1beta1" testing "k8s.io/client-go/testing" ) @@ -141,6 +144,51 @@ func (c *FakeDeployments) Patch(ctx context.Context, name string, pt types.Patch return obj.(*v1beta1.Deployment), err } +// Apply takes the given apply declarative configuration, applies it and returns the applied deployment. +func (c *FakeDeployments) Apply(ctx context.Context, deployment *extensionsv1beta1.DeploymentApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.Deployment, err error) { + if deployment == nil { + return nil, fmt.Errorf("deployment provided to Apply must not be nil") + } + data, err := json.Marshal(deployment) + if err != nil { + return nil, err + } + name := deployment.Name + if name == nil { + return nil, fmt.Errorf("deployment.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(deploymentsResource, c.ns, *name, types.ApplyPatchType, data), &v1beta1.Deployment{}) + + if obj == nil { + return nil, err + } + return obj.(*v1beta1.Deployment), err +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *FakeDeployments) ApplyStatus(ctx context.Context, deployment *extensionsv1beta1.DeploymentApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.Deployment, err error) { + if deployment == nil { + return nil, fmt.Errorf("deployment provided to Apply must not be nil") + } + data, err := json.Marshal(deployment) + if err != nil { + return nil, err + } + name := deployment.Name + if name == nil { + return nil, fmt.Errorf("deployment.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(deploymentsResource, c.ns, *name, types.ApplyPatchType, data, "status"), &v1beta1.Deployment{}) + + if obj == nil { + return nil, err + } + return obj.(*v1beta1.Deployment), err +} + // GetScale takes name of the deployment, and returns the corresponding scale object, and an error if there is any. func (c *FakeDeployments) GetScale(ctx context.Context, deploymentName string, options v1.GetOptions) (result *v1beta1.Scale, err error) { obj, err := c.Fake. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_ingress.go b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_ingress.go index 01a3cf1adb09..46db8d067fe9 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_ingress.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_ingress.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1beta1 "k8s.io/api/extensions/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + extensionsv1beta1 "k8s.io/client-go/applyconfigurations/extensions/v1beta1" testing "k8s.io/client-go/testing" ) @@ -140,3 +143,48 @@ func (c *FakeIngresses) Patch(ctx context.Context, name string, pt types.PatchTy } return obj.(*v1beta1.Ingress), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied ingress. +func (c *FakeIngresses) Apply(ctx context.Context, ingress *extensionsv1beta1.IngressApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.Ingress, err error) { + if ingress == nil { + return nil, fmt.Errorf("ingress provided to Apply must not be nil") + } + data, err := json.Marshal(ingress) + if err != nil { + return nil, err + } + name := ingress.Name + if name == nil { + return nil, fmt.Errorf("ingress.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(ingressesResource, c.ns, *name, types.ApplyPatchType, data), &v1beta1.Ingress{}) + + if obj == nil { + return nil, err + } + return obj.(*v1beta1.Ingress), err +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *FakeIngresses) ApplyStatus(ctx context.Context, ingress *extensionsv1beta1.IngressApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.Ingress, err error) { + if ingress == nil { + return nil, fmt.Errorf("ingress provided to Apply must not be nil") + } + data, err := json.Marshal(ingress) + if err != nil { + return nil, err + } + name := ingress.Name + if name == nil { + return nil, fmt.Errorf("ingress.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(ingressesResource, c.ns, *name, types.ApplyPatchType, data, "status"), &v1beta1.Ingress{}) + + if obj == nil { + return nil, err + } + return obj.(*v1beta1.Ingress), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_networkpolicy.go b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_networkpolicy.go index e97a54eaaf2b..4ae650b0da64 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_networkpolicy.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_networkpolicy.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1beta1 "k8s.io/api/extensions/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + extensionsv1beta1 "k8s.io/client-go/applyconfigurations/extensions/v1beta1" testing "k8s.io/client-go/testing" ) @@ -128,3 +131,25 @@ func (c *FakeNetworkPolicies) Patch(ctx context.Context, name string, pt types.P } return obj.(*v1beta1.NetworkPolicy), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied networkPolicy. +func (c *FakeNetworkPolicies) Apply(ctx context.Context, networkPolicy *extensionsv1beta1.NetworkPolicyApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.NetworkPolicy, err error) { + if networkPolicy == nil { + return nil, fmt.Errorf("networkPolicy provided to Apply must not be nil") + } + data, err := json.Marshal(networkPolicy) + if err != nil { + return nil, err + } + name := networkPolicy.Name + if name == nil { + return nil, fmt.Errorf("networkPolicy.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(networkpoliciesResource, c.ns, *name, types.ApplyPatchType, data), &v1beta1.NetworkPolicy{}) + + if obj == nil { + return nil, err + } + return obj.(*v1beta1.NetworkPolicy), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_podsecuritypolicy.go b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_podsecuritypolicy.go index adb7d30fbddc..c4d0e9c5350e 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_podsecuritypolicy.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_podsecuritypolicy.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1beta1 "k8s.io/api/extensions/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + extensionsv1beta1 "k8s.io/client-go/applyconfigurations/extensions/v1beta1" testing "k8s.io/client-go/testing" ) @@ -120,3 +123,24 @@ func (c *FakePodSecurityPolicies) Patch(ctx context.Context, name string, pt typ } return obj.(*v1beta1.PodSecurityPolicy), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied podSecurityPolicy. +func (c *FakePodSecurityPolicies) Apply(ctx context.Context, podSecurityPolicy *extensionsv1beta1.PodSecurityPolicyApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.PodSecurityPolicy, err error) { + if podSecurityPolicy == nil { + return nil, fmt.Errorf("podSecurityPolicy provided to Apply must not be nil") + } + data, err := json.Marshal(podSecurityPolicy) + if err != nil { + return nil, err + } + name := podSecurityPolicy.Name + if name == nil { + return nil, fmt.Errorf("podSecurityPolicy.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(podsecuritypoliciesResource, *name, types.ApplyPatchType, data), &v1beta1.PodSecurityPolicy{}) + if obj == nil { + return nil, err + } + return obj.(*v1beta1.PodSecurityPolicy), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_replicaset.go b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_replicaset.go index 5b824acbbf6c..cf0310acb7bd 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_replicaset.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_replicaset.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1beta1 "k8s.io/api/extensions/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + extensionsv1beta1 "k8s.io/client-go/applyconfigurations/extensions/v1beta1" testing "k8s.io/client-go/testing" ) @@ -141,6 +144,51 @@ func (c *FakeReplicaSets) Patch(ctx context.Context, name string, pt types.Patch return obj.(*v1beta1.ReplicaSet), err } +// Apply takes the given apply declarative configuration, applies it and returns the applied replicaSet. +func (c *FakeReplicaSets) Apply(ctx context.Context, replicaSet *extensionsv1beta1.ReplicaSetApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.ReplicaSet, err error) { + if replicaSet == nil { + return nil, fmt.Errorf("replicaSet provided to Apply must not be nil") + } + data, err := json.Marshal(replicaSet) + if err != nil { + return nil, err + } + name := replicaSet.Name + if name == nil { + return nil, fmt.Errorf("replicaSet.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(replicasetsResource, c.ns, *name, types.ApplyPatchType, data), &v1beta1.ReplicaSet{}) + + if obj == nil { + return nil, err + } + return obj.(*v1beta1.ReplicaSet), err +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *FakeReplicaSets) ApplyStatus(ctx context.Context, replicaSet *extensionsv1beta1.ReplicaSetApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.ReplicaSet, err error) { + if replicaSet == nil { + return nil, fmt.Errorf("replicaSet provided to Apply must not be nil") + } + data, err := json.Marshal(replicaSet) + if err != nil { + return nil, err + } + name := replicaSet.Name + if name == nil { + return nil, fmt.Errorf("replicaSet.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(replicasetsResource, c.ns, *name, types.ApplyPatchType, data, "status"), &v1beta1.ReplicaSet{}) + + if obj == nil { + return nil, err + } + return obj.(*v1beta1.ReplicaSet), err +} + // GetScale takes name of the replicaSet, and returns the corresponding scale object, and an error if there is any. func (c *FakeReplicaSets) GetScale(ctx context.Context, replicaSetName string, options v1.GetOptions) (result *v1beta1.Scale, err error) { obj, err := c.Fake. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/ingress.go b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/ingress.go index b19e2455adbc..dd4012cc2332 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/ingress.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/ingress.go @@ -20,12 +20,15 @@ package v1beta1 import ( "context" + json "encoding/json" + "fmt" "time" v1beta1 "k8s.io/api/extensions/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + extensionsv1beta1 "k8s.io/client-go/applyconfigurations/extensions/v1beta1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -47,6 +50,8 @@ type IngressInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1beta1.IngressList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta1.Ingress, err error) + Apply(ctx context.Context, ingress *extensionsv1beta1.IngressApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.Ingress, err error) + ApplyStatus(ctx context.Context, ingress *extensionsv1beta1.IngressApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.Ingress, err error) IngressExpansion } @@ -193,3 +198,59 @@ func (c *ingresses) Patch(ctx context.Context, name string, pt types.PatchType, Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied ingress. +func (c *ingresses) Apply(ctx context.Context, ingress *extensionsv1beta1.IngressApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.Ingress, err error) { + if ingress == nil { + return nil, fmt.Errorf("ingress provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(ingress) + if err != nil { + return nil, err + } + name := ingress.Name + if name == nil { + return nil, fmt.Errorf("ingress.Name must be provided to Apply") + } + result = &v1beta1.Ingress{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("ingresses"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *ingresses) ApplyStatus(ctx context.Context, ingress *extensionsv1beta1.IngressApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.Ingress, err error) { + if ingress == nil { + return nil, fmt.Errorf("ingress provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(ingress) + if err != nil { + return nil, err + } + + name := ingress.Name + if name == nil { + return nil, fmt.Errorf("ingress.Name must be provided to Apply") + } + + result = &v1beta1.Ingress{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("ingresses"). + Name(*name). + SubResource("status"). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/networkpolicy.go b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/networkpolicy.go index ed9ae30dedc3..978b26db0337 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/networkpolicy.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/networkpolicy.go @@ -20,12 +20,15 @@ package v1beta1 import ( "context" + json "encoding/json" + "fmt" "time" v1beta1 "k8s.io/api/extensions/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + extensionsv1beta1 "k8s.io/client-go/applyconfigurations/extensions/v1beta1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type NetworkPolicyInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1beta1.NetworkPolicyList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta1.NetworkPolicy, err error) + Apply(ctx context.Context, networkPolicy *extensionsv1beta1.NetworkPolicyApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.NetworkPolicy, err error) NetworkPolicyExpansion } @@ -176,3 +180,29 @@ func (c *networkPolicies) Patch(ctx context.Context, name string, pt types.Patch Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied networkPolicy. +func (c *networkPolicies) Apply(ctx context.Context, networkPolicy *extensionsv1beta1.NetworkPolicyApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.NetworkPolicy, err error) { + if networkPolicy == nil { + return nil, fmt.Errorf("networkPolicy provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(networkPolicy) + if err != nil { + return nil, err + } + name := networkPolicy.Name + if name == nil { + return nil, fmt.Errorf("networkPolicy.Name must be provided to Apply") + } + result = &v1beta1.NetworkPolicy{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("networkpolicies"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/podsecuritypolicy.go b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/podsecuritypolicy.go index 76e67dedb85c..3f38c3133d6a 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/podsecuritypolicy.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/podsecuritypolicy.go @@ -20,12 +20,15 @@ package v1beta1 import ( "context" + json "encoding/json" + "fmt" "time" v1beta1 "k8s.io/api/extensions/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + extensionsv1beta1 "k8s.io/client-go/applyconfigurations/extensions/v1beta1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type PodSecurityPolicyInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1beta1.PodSecurityPolicyList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta1.PodSecurityPolicy, err error) + Apply(ctx context.Context, podSecurityPolicy *extensionsv1beta1.PodSecurityPolicyApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.PodSecurityPolicy, err error) PodSecurityPolicyExpansion } @@ -166,3 +170,28 @@ func (c *podSecurityPolicies) Patch(ctx context.Context, name string, pt types.P Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied podSecurityPolicy. +func (c *podSecurityPolicies) Apply(ctx context.Context, podSecurityPolicy *extensionsv1beta1.PodSecurityPolicyApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.PodSecurityPolicy, err error) { + if podSecurityPolicy == nil { + return nil, fmt.Errorf("podSecurityPolicy provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(podSecurityPolicy) + if err != nil { + return nil, err + } + name := podSecurityPolicy.Name + if name == nil { + return nil, fmt.Errorf("podSecurityPolicy.Name must be provided to Apply") + } + result = &v1beta1.PodSecurityPolicy{} + err = c.client.Patch(types.ApplyPatchType). + Resource("podsecuritypolicies"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/replicaset.go b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/replicaset.go index 64e3c1861744..ee897f75adf4 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/replicaset.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/replicaset.go @@ -20,12 +20,15 @@ package v1beta1 import ( "context" + json "encoding/json" + "fmt" "time" v1beta1 "k8s.io/api/extensions/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + extensionsv1beta1 "k8s.io/client-go/applyconfigurations/extensions/v1beta1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -47,6 +50,8 @@ type ReplicaSetInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1beta1.ReplicaSetList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta1.ReplicaSet, err error) + Apply(ctx context.Context, replicaSet *extensionsv1beta1.ReplicaSetApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.ReplicaSet, err error) + ApplyStatus(ctx context.Context, replicaSet *extensionsv1beta1.ReplicaSetApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.ReplicaSet, err error) GetScale(ctx context.Context, replicaSetName string, options v1.GetOptions) (*v1beta1.Scale, error) UpdateScale(ctx context.Context, replicaSetName string, scale *v1beta1.Scale, opts v1.UpdateOptions) (*v1beta1.Scale, error) @@ -197,6 +202,62 @@ func (c *replicaSets) Patch(ctx context.Context, name string, pt types.PatchType return } +// Apply takes the given apply declarative configuration, applies it and returns the applied replicaSet. +func (c *replicaSets) Apply(ctx context.Context, replicaSet *extensionsv1beta1.ReplicaSetApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.ReplicaSet, err error) { + if replicaSet == nil { + return nil, fmt.Errorf("replicaSet provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(replicaSet) + if err != nil { + return nil, err + } + name := replicaSet.Name + if name == nil { + return nil, fmt.Errorf("replicaSet.Name must be provided to Apply") + } + result = &v1beta1.ReplicaSet{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("replicasets"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *replicaSets) ApplyStatus(ctx context.Context, replicaSet *extensionsv1beta1.ReplicaSetApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.ReplicaSet, err error) { + if replicaSet == nil { + return nil, fmt.Errorf("replicaSet provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(replicaSet) + if err != nil { + return nil, err + } + + name := replicaSet.Name + if name == nil { + return nil, fmt.Errorf("replicaSet.Name must be provided to Apply") + } + + result = &v1beta1.ReplicaSet{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("replicasets"). + Name(*name). + SubResource("status"). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + // GetScale takes name of the replicaSet, and returns the corresponding v1beta1.Scale object, and an error if there is any. func (c *replicaSets) GetScale(ctx context.Context, replicaSetName string, options v1.GetOptions) (result *v1beta1.Scale, err error) { result = &v1beta1.Scale{} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1alpha1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1alpha1/BUILD deleted file mode 100644 index 33015e81ee5c..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1alpha1/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "flowcontrol_client.go", - "flowschema.go", - "generated_expansion.go", - "prioritylevelconfiguration.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1alpha1", - importpath = "k8s.io/client-go/kubernetes/typed/flowcontrol/v1alpha1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/flowcontrol/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/flowcontrol/v1alpha1/fake:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1alpha1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1alpha1/fake/BUILD deleted file mode 100644 index db56b4ec1429..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1alpha1/fake/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_flowcontrol_client.go", - "fake_flowschema.go", - "fake_prioritylevelconfiguration.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1alpha1/fake", - importpath = "k8s.io/client-go/kubernetes/typed/flowcontrol/v1alpha1/fake", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/flowcontrol/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/flowcontrol/v1alpha1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1alpha1/fake/fake_flowschema.go b/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1alpha1/fake/fake_flowschema.go index e4692874e8e1..824318c889c3 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1alpha1/fake/fake_flowschema.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1alpha1/fake/fake_flowschema.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1alpha1 "k8s.io/api/flowcontrol/v1alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + flowcontrolv1alpha1 "k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1" testing "k8s.io/client-go/testing" ) @@ -131,3 +134,46 @@ func (c *FakeFlowSchemas) Patch(ctx context.Context, name string, pt types.Patch } return obj.(*v1alpha1.FlowSchema), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied flowSchema. +func (c *FakeFlowSchemas) Apply(ctx context.Context, flowSchema *flowcontrolv1alpha1.FlowSchemaApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.FlowSchema, err error) { + if flowSchema == nil { + return nil, fmt.Errorf("flowSchema provided to Apply must not be nil") + } + data, err := json.Marshal(flowSchema) + if err != nil { + return nil, err + } + name := flowSchema.Name + if name == nil { + return nil, fmt.Errorf("flowSchema.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(flowschemasResource, *name, types.ApplyPatchType, data), &v1alpha1.FlowSchema{}) + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.FlowSchema), err +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *FakeFlowSchemas) ApplyStatus(ctx context.Context, flowSchema *flowcontrolv1alpha1.FlowSchemaApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.FlowSchema, err error) { + if flowSchema == nil { + return nil, fmt.Errorf("flowSchema provided to Apply must not be nil") + } + data, err := json.Marshal(flowSchema) + if err != nil { + return nil, err + } + name := flowSchema.Name + if name == nil { + return nil, fmt.Errorf("flowSchema.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(flowschemasResource, *name, types.ApplyPatchType, data, "status"), &v1alpha1.FlowSchema{}) + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.FlowSchema), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1alpha1/fake/fake_prioritylevelconfiguration.go b/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1alpha1/fake/fake_prioritylevelconfiguration.go index 133ab793ce0c..f6f7c8a5b194 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1alpha1/fake/fake_prioritylevelconfiguration.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1alpha1/fake/fake_prioritylevelconfiguration.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1alpha1 "k8s.io/api/flowcontrol/v1alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + flowcontrolv1alpha1 "k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1" testing "k8s.io/client-go/testing" ) @@ -131,3 +134,46 @@ func (c *FakePriorityLevelConfigurations) Patch(ctx context.Context, name string } return obj.(*v1alpha1.PriorityLevelConfiguration), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied priorityLevelConfiguration. +func (c *FakePriorityLevelConfigurations) Apply(ctx context.Context, priorityLevelConfiguration *flowcontrolv1alpha1.PriorityLevelConfigurationApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.PriorityLevelConfiguration, err error) { + if priorityLevelConfiguration == nil { + return nil, fmt.Errorf("priorityLevelConfiguration provided to Apply must not be nil") + } + data, err := json.Marshal(priorityLevelConfiguration) + if err != nil { + return nil, err + } + name := priorityLevelConfiguration.Name + if name == nil { + return nil, fmt.Errorf("priorityLevelConfiguration.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(prioritylevelconfigurationsResource, *name, types.ApplyPatchType, data), &v1alpha1.PriorityLevelConfiguration{}) + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.PriorityLevelConfiguration), err +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *FakePriorityLevelConfigurations) ApplyStatus(ctx context.Context, priorityLevelConfiguration *flowcontrolv1alpha1.PriorityLevelConfigurationApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.PriorityLevelConfiguration, err error) { + if priorityLevelConfiguration == nil { + return nil, fmt.Errorf("priorityLevelConfiguration provided to Apply must not be nil") + } + data, err := json.Marshal(priorityLevelConfiguration) + if err != nil { + return nil, err + } + name := priorityLevelConfiguration.Name + if name == nil { + return nil, fmt.Errorf("priorityLevelConfiguration.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(prioritylevelconfigurationsResource, *name, types.ApplyPatchType, data, "status"), &v1alpha1.PriorityLevelConfiguration{}) + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.PriorityLevelConfiguration), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1alpha1/flowschema.go b/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1alpha1/flowschema.go index 319636f771b1..95baf825191e 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1alpha1/flowschema.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1alpha1/flowschema.go @@ -20,12 +20,15 @@ package v1alpha1 import ( "context" + json "encoding/json" + "fmt" "time" v1alpha1 "k8s.io/api/flowcontrol/v1alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + flowcontrolv1alpha1 "k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -47,6 +50,8 @@ type FlowSchemaInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1alpha1.FlowSchemaList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.FlowSchema, err error) + Apply(ctx context.Context, flowSchema *flowcontrolv1alpha1.FlowSchemaApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.FlowSchema, err error) + ApplyStatus(ctx context.Context, flowSchema *flowcontrolv1alpha1.FlowSchemaApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.FlowSchema, err error) FlowSchemaExpansion } @@ -182,3 +187,57 @@ func (c *flowSchemas) Patch(ctx context.Context, name string, pt types.PatchType Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied flowSchema. +func (c *flowSchemas) Apply(ctx context.Context, flowSchema *flowcontrolv1alpha1.FlowSchemaApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.FlowSchema, err error) { + if flowSchema == nil { + return nil, fmt.Errorf("flowSchema provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(flowSchema) + if err != nil { + return nil, err + } + name := flowSchema.Name + if name == nil { + return nil, fmt.Errorf("flowSchema.Name must be provided to Apply") + } + result = &v1alpha1.FlowSchema{} + err = c.client.Patch(types.ApplyPatchType). + Resource("flowschemas"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *flowSchemas) ApplyStatus(ctx context.Context, flowSchema *flowcontrolv1alpha1.FlowSchemaApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.FlowSchema, err error) { + if flowSchema == nil { + return nil, fmt.Errorf("flowSchema provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(flowSchema) + if err != nil { + return nil, err + } + + name := flowSchema.Name + if name == nil { + return nil, fmt.Errorf("flowSchema.Name must be provided to Apply") + } + + result = &v1alpha1.FlowSchema{} + err = c.client.Patch(types.ApplyPatchType). + Resource("flowschemas"). + Name(*name). + SubResource("status"). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1alpha1/prioritylevelconfiguration.go b/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1alpha1/prioritylevelconfiguration.go index 1290e7936b19..327b727c1820 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1alpha1/prioritylevelconfiguration.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1alpha1/prioritylevelconfiguration.go @@ -20,12 +20,15 @@ package v1alpha1 import ( "context" + json "encoding/json" + "fmt" "time" v1alpha1 "k8s.io/api/flowcontrol/v1alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + flowcontrolv1alpha1 "k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -47,6 +50,8 @@ type PriorityLevelConfigurationInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1alpha1.PriorityLevelConfigurationList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.PriorityLevelConfiguration, err error) + Apply(ctx context.Context, priorityLevelConfiguration *flowcontrolv1alpha1.PriorityLevelConfigurationApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.PriorityLevelConfiguration, err error) + ApplyStatus(ctx context.Context, priorityLevelConfiguration *flowcontrolv1alpha1.PriorityLevelConfigurationApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.PriorityLevelConfiguration, err error) PriorityLevelConfigurationExpansion } @@ -182,3 +187,57 @@ func (c *priorityLevelConfigurations) Patch(ctx context.Context, name string, pt Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied priorityLevelConfiguration. +func (c *priorityLevelConfigurations) Apply(ctx context.Context, priorityLevelConfiguration *flowcontrolv1alpha1.PriorityLevelConfigurationApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.PriorityLevelConfiguration, err error) { + if priorityLevelConfiguration == nil { + return nil, fmt.Errorf("priorityLevelConfiguration provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(priorityLevelConfiguration) + if err != nil { + return nil, err + } + name := priorityLevelConfiguration.Name + if name == nil { + return nil, fmt.Errorf("priorityLevelConfiguration.Name must be provided to Apply") + } + result = &v1alpha1.PriorityLevelConfiguration{} + err = c.client.Patch(types.ApplyPatchType). + Resource("prioritylevelconfigurations"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *priorityLevelConfigurations) ApplyStatus(ctx context.Context, priorityLevelConfiguration *flowcontrolv1alpha1.PriorityLevelConfigurationApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.PriorityLevelConfiguration, err error) { + if priorityLevelConfiguration == nil { + return nil, fmt.Errorf("priorityLevelConfiguration provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(priorityLevelConfiguration) + if err != nil { + return nil, err + } + + name := priorityLevelConfiguration.Name + if name == nil { + return nil, fmt.Errorf("priorityLevelConfiguration.Name must be provided to Apply") + } + + result = &v1alpha1.PriorityLevelConfiguration{} + err = c.client.Patch(types.ApplyPatchType). + Resource("prioritylevelconfigurations"). + Name(*name). + SubResource("status"). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta1/BUILD deleted file mode 100644 index eb3a57fb8a89..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta1/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "flowcontrol_client.go", - "flowschema.go", - "generated_expansion.go", - "prioritylevelconfiguration.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta1", - importpath = "k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/flowcontrol/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta1/fake:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta1/fake/BUILD deleted file mode 100644 index 39d22a8c0fa6..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta1/fake/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_flowcontrol_client.go", - "fake_flowschema.go", - "fake_prioritylevelconfiguration.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta1/fake", - importpath = "k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta1/fake", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/flowcontrol/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta1/fake/fake_flowschema.go b/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta1/fake/fake_flowschema.go index 7732b69dca85..378c666d637c 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta1/fake/fake_flowschema.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta1/fake/fake_flowschema.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1beta1 "k8s.io/api/flowcontrol/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + flowcontrolv1beta1 "k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1" testing "k8s.io/client-go/testing" ) @@ -131,3 +134,46 @@ func (c *FakeFlowSchemas) Patch(ctx context.Context, name string, pt types.Patch } return obj.(*v1beta1.FlowSchema), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied flowSchema. +func (c *FakeFlowSchemas) Apply(ctx context.Context, flowSchema *flowcontrolv1beta1.FlowSchemaApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.FlowSchema, err error) { + if flowSchema == nil { + return nil, fmt.Errorf("flowSchema provided to Apply must not be nil") + } + data, err := json.Marshal(flowSchema) + if err != nil { + return nil, err + } + name := flowSchema.Name + if name == nil { + return nil, fmt.Errorf("flowSchema.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(flowschemasResource, *name, types.ApplyPatchType, data), &v1beta1.FlowSchema{}) + if obj == nil { + return nil, err + } + return obj.(*v1beta1.FlowSchema), err +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *FakeFlowSchemas) ApplyStatus(ctx context.Context, flowSchema *flowcontrolv1beta1.FlowSchemaApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.FlowSchema, err error) { + if flowSchema == nil { + return nil, fmt.Errorf("flowSchema provided to Apply must not be nil") + } + data, err := json.Marshal(flowSchema) + if err != nil { + return nil, err + } + name := flowSchema.Name + if name == nil { + return nil, fmt.Errorf("flowSchema.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(flowschemasResource, *name, types.ApplyPatchType, data, "status"), &v1beta1.FlowSchema{}) + if obj == nil { + return nil, err + } + return obj.(*v1beta1.FlowSchema), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta1/fake/fake_prioritylevelconfiguration.go b/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta1/fake/fake_prioritylevelconfiguration.go index f93a505d4c79..fe6850b30e61 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta1/fake/fake_prioritylevelconfiguration.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta1/fake/fake_prioritylevelconfiguration.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1beta1 "k8s.io/api/flowcontrol/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + flowcontrolv1beta1 "k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1" testing "k8s.io/client-go/testing" ) @@ -131,3 +134,46 @@ func (c *FakePriorityLevelConfigurations) Patch(ctx context.Context, name string } return obj.(*v1beta1.PriorityLevelConfiguration), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied priorityLevelConfiguration. +func (c *FakePriorityLevelConfigurations) Apply(ctx context.Context, priorityLevelConfiguration *flowcontrolv1beta1.PriorityLevelConfigurationApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.PriorityLevelConfiguration, err error) { + if priorityLevelConfiguration == nil { + return nil, fmt.Errorf("priorityLevelConfiguration provided to Apply must not be nil") + } + data, err := json.Marshal(priorityLevelConfiguration) + if err != nil { + return nil, err + } + name := priorityLevelConfiguration.Name + if name == nil { + return nil, fmt.Errorf("priorityLevelConfiguration.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(prioritylevelconfigurationsResource, *name, types.ApplyPatchType, data), &v1beta1.PriorityLevelConfiguration{}) + if obj == nil { + return nil, err + } + return obj.(*v1beta1.PriorityLevelConfiguration), err +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *FakePriorityLevelConfigurations) ApplyStatus(ctx context.Context, priorityLevelConfiguration *flowcontrolv1beta1.PriorityLevelConfigurationApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.PriorityLevelConfiguration, err error) { + if priorityLevelConfiguration == nil { + return nil, fmt.Errorf("priorityLevelConfiguration provided to Apply must not be nil") + } + data, err := json.Marshal(priorityLevelConfiguration) + if err != nil { + return nil, err + } + name := priorityLevelConfiguration.Name + if name == nil { + return nil, fmt.Errorf("priorityLevelConfiguration.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(prioritylevelconfigurationsResource, *name, types.ApplyPatchType, data, "status"), &v1beta1.PriorityLevelConfiguration{}) + if obj == nil { + return nil, err + } + return obj.(*v1beta1.PriorityLevelConfiguration), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta1/flowschema.go b/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta1/flowschema.go index 398f4f3473bd..a9d38becf9bf 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta1/flowschema.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta1/flowschema.go @@ -20,12 +20,15 @@ package v1beta1 import ( "context" + json "encoding/json" + "fmt" "time" v1beta1 "k8s.io/api/flowcontrol/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + flowcontrolv1beta1 "k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -47,6 +50,8 @@ type FlowSchemaInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1beta1.FlowSchemaList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta1.FlowSchema, err error) + Apply(ctx context.Context, flowSchema *flowcontrolv1beta1.FlowSchemaApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.FlowSchema, err error) + ApplyStatus(ctx context.Context, flowSchema *flowcontrolv1beta1.FlowSchemaApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.FlowSchema, err error) FlowSchemaExpansion } @@ -182,3 +187,57 @@ func (c *flowSchemas) Patch(ctx context.Context, name string, pt types.PatchType Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied flowSchema. +func (c *flowSchemas) Apply(ctx context.Context, flowSchema *flowcontrolv1beta1.FlowSchemaApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.FlowSchema, err error) { + if flowSchema == nil { + return nil, fmt.Errorf("flowSchema provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(flowSchema) + if err != nil { + return nil, err + } + name := flowSchema.Name + if name == nil { + return nil, fmt.Errorf("flowSchema.Name must be provided to Apply") + } + result = &v1beta1.FlowSchema{} + err = c.client.Patch(types.ApplyPatchType). + Resource("flowschemas"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *flowSchemas) ApplyStatus(ctx context.Context, flowSchema *flowcontrolv1beta1.FlowSchemaApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.FlowSchema, err error) { + if flowSchema == nil { + return nil, fmt.Errorf("flowSchema provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(flowSchema) + if err != nil { + return nil, err + } + + name := flowSchema.Name + if name == nil { + return nil, fmt.Errorf("flowSchema.Name must be provided to Apply") + } + + result = &v1beta1.FlowSchema{} + err = c.client.Patch(types.ApplyPatchType). + Resource("flowschemas"). + Name(*name). + SubResource("status"). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta1/prioritylevelconfiguration.go b/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta1/prioritylevelconfiguration.go index 88633c827887..41f35cbccd34 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta1/prioritylevelconfiguration.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta1/prioritylevelconfiguration.go @@ -20,12 +20,15 @@ package v1beta1 import ( "context" + json "encoding/json" + "fmt" "time" v1beta1 "k8s.io/api/flowcontrol/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + flowcontrolv1beta1 "k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -47,6 +50,8 @@ type PriorityLevelConfigurationInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1beta1.PriorityLevelConfigurationList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta1.PriorityLevelConfiguration, err error) + Apply(ctx context.Context, priorityLevelConfiguration *flowcontrolv1beta1.PriorityLevelConfigurationApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.PriorityLevelConfiguration, err error) + ApplyStatus(ctx context.Context, priorityLevelConfiguration *flowcontrolv1beta1.PriorityLevelConfigurationApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.PriorityLevelConfiguration, err error) PriorityLevelConfigurationExpansion } @@ -182,3 +187,57 @@ func (c *priorityLevelConfigurations) Patch(ctx context.Context, name string, pt Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied priorityLevelConfiguration. +func (c *priorityLevelConfigurations) Apply(ctx context.Context, priorityLevelConfiguration *flowcontrolv1beta1.PriorityLevelConfigurationApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.PriorityLevelConfiguration, err error) { + if priorityLevelConfiguration == nil { + return nil, fmt.Errorf("priorityLevelConfiguration provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(priorityLevelConfiguration) + if err != nil { + return nil, err + } + name := priorityLevelConfiguration.Name + if name == nil { + return nil, fmt.Errorf("priorityLevelConfiguration.Name must be provided to Apply") + } + result = &v1beta1.PriorityLevelConfiguration{} + err = c.client.Patch(types.ApplyPatchType). + Resource("prioritylevelconfigurations"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *priorityLevelConfigurations) ApplyStatus(ctx context.Context, priorityLevelConfiguration *flowcontrolv1beta1.PriorityLevelConfigurationApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.PriorityLevelConfiguration, err error) { + if priorityLevelConfiguration == nil { + return nil, fmt.Errorf("priorityLevelConfiguration provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(priorityLevelConfiguration) + if err != nil { + return nil, err + } + + name := priorityLevelConfiguration.Name + if name == nil { + return nil, fmt.Errorf("priorityLevelConfiguration.Name must be provided to Apply") + } + + result = &v1beta1.PriorityLevelConfiguration{} + err = c.client.Patch(types.ApplyPatchType). + Resource("prioritylevelconfigurations"). + Name(*name). + SubResource("status"). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/BUILD deleted file mode 100644 index fc4f6f11c4b4..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated_expansion.go", - "ingress.go", - "ingressclass.go", - "networking_client.go", - "networkpolicy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/networking/v1", - importpath = "k8s.io/client-go/kubernetes/typed/networking/v1", - deps = [ - "//staging/src/k8s.io/api/networking/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/networking/v1/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/fake/BUILD deleted file mode 100644 index 99781300aa77..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/fake/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_ingress.go", - "fake_ingressclass.go", - "fake_networking_client.go", - "fake_networkpolicy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/fake", - importpath = "k8s.io/client-go/kubernetes/typed/networking/v1/fake", - deps = [ - "//staging/src/k8s.io/api/networking/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/networking/v1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/fake/fake_ingress.go b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/fake/fake_ingress.go index 68d4d3358c10..f2feced2a653 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/fake/fake_ingress.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/fake/fake_ingress.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" networkingv1 "k8s.io/api/networking/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + applyconfigurationsnetworkingv1 "k8s.io/client-go/applyconfigurations/networking/v1" testing "k8s.io/client-go/testing" ) @@ -140,3 +143,48 @@ func (c *FakeIngresses) Patch(ctx context.Context, name string, pt types.PatchTy } return obj.(*networkingv1.Ingress), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied ingress. +func (c *FakeIngresses) Apply(ctx context.Context, ingress *applyconfigurationsnetworkingv1.IngressApplyConfiguration, opts v1.ApplyOptions) (result *networkingv1.Ingress, err error) { + if ingress == nil { + return nil, fmt.Errorf("ingress provided to Apply must not be nil") + } + data, err := json.Marshal(ingress) + if err != nil { + return nil, err + } + name := ingress.Name + if name == nil { + return nil, fmt.Errorf("ingress.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(ingressesResource, c.ns, *name, types.ApplyPatchType, data), &networkingv1.Ingress{}) + + if obj == nil { + return nil, err + } + return obj.(*networkingv1.Ingress), err +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *FakeIngresses) ApplyStatus(ctx context.Context, ingress *applyconfigurationsnetworkingv1.IngressApplyConfiguration, opts v1.ApplyOptions) (result *networkingv1.Ingress, err error) { + if ingress == nil { + return nil, fmt.Errorf("ingress provided to Apply must not be nil") + } + data, err := json.Marshal(ingress) + if err != nil { + return nil, err + } + name := ingress.Name + if name == nil { + return nil, fmt.Errorf("ingress.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(ingressesResource, c.ns, *name, types.ApplyPatchType, data, "status"), &networkingv1.Ingress{}) + + if obj == nil { + return nil, err + } + return obj.(*networkingv1.Ingress), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/fake/fake_ingressclass.go b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/fake/fake_ingressclass.go index 9c0519562965..200d9f68b998 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/fake/fake_ingressclass.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/fake/fake_ingressclass.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" networkingv1 "k8s.io/api/networking/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + applyconfigurationsnetworkingv1 "k8s.io/client-go/applyconfigurations/networking/v1" testing "k8s.io/client-go/testing" ) @@ -120,3 +123,24 @@ func (c *FakeIngressClasses) Patch(ctx context.Context, name string, pt types.Pa } return obj.(*networkingv1.IngressClass), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied ingressClass. +func (c *FakeIngressClasses) Apply(ctx context.Context, ingressClass *applyconfigurationsnetworkingv1.IngressClassApplyConfiguration, opts v1.ApplyOptions) (result *networkingv1.IngressClass, err error) { + if ingressClass == nil { + return nil, fmt.Errorf("ingressClass provided to Apply must not be nil") + } + data, err := json.Marshal(ingressClass) + if err != nil { + return nil, err + } + name := ingressClass.Name + if name == nil { + return nil, fmt.Errorf("ingressClass.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(ingressclassesResource, *name, types.ApplyPatchType, data), &networkingv1.IngressClass{}) + if obj == nil { + return nil, err + } + return obj.(*networkingv1.IngressClass), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/fake/fake_networkpolicy.go b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/fake/fake_networkpolicy.go index e8d6e28e44fa..5be9e8b57365 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/fake/fake_networkpolicy.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/fake/fake_networkpolicy.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" networkingv1 "k8s.io/api/networking/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + applyconfigurationsnetworkingv1 "k8s.io/client-go/applyconfigurations/networking/v1" testing "k8s.io/client-go/testing" ) @@ -128,3 +131,25 @@ func (c *FakeNetworkPolicies) Patch(ctx context.Context, name string, pt types.P } return obj.(*networkingv1.NetworkPolicy), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied networkPolicy. +func (c *FakeNetworkPolicies) Apply(ctx context.Context, networkPolicy *applyconfigurationsnetworkingv1.NetworkPolicyApplyConfiguration, opts v1.ApplyOptions) (result *networkingv1.NetworkPolicy, err error) { + if networkPolicy == nil { + return nil, fmt.Errorf("networkPolicy provided to Apply must not be nil") + } + data, err := json.Marshal(networkPolicy) + if err != nil { + return nil, err + } + name := networkPolicy.Name + if name == nil { + return nil, fmt.Errorf("networkPolicy.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(networkpoliciesResource, c.ns, *name, types.ApplyPatchType, data), &networkingv1.NetworkPolicy{}) + + if obj == nil { + return nil, err + } + return obj.(*networkingv1.NetworkPolicy), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/ingress.go b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/ingress.go index 40d028b2f5a0..9923d6cbae13 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/ingress.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/ingress.go @@ -20,12 +20,15 @@ package v1 import ( "context" + json "encoding/json" + "fmt" "time" v1 "k8s.io/api/networking/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + networkingv1 "k8s.io/client-go/applyconfigurations/networking/v1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -47,6 +50,8 @@ type IngressInterface interface { List(ctx context.Context, opts metav1.ListOptions) (*v1.IngressList, error) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.Ingress, err error) + Apply(ctx context.Context, ingress *networkingv1.IngressApplyConfiguration, opts metav1.ApplyOptions) (result *v1.Ingress, err error) + ApplyStatus(ctx context.Context, ingress *networkingv1.IngressApplyConfiguration, opts metav1.ApplyOptions) (result *v1.Ingress, err error) IngressExpansion } @@ -193,3 +198,59 @@ func (c *ingresses) Patch(ctx context.Context, name string, pt types.PatchType, Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied ingress. +func (c *ingresses) Apply(ctx context.Context, ingress *networkingv1.IngressApplyConfiguration, opts metav1.ApplyOptions) (result *v1.Ingress, err error) { + if ingress == nil { + return nil, fmt.Errorf("ingress provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(ingress) + if err != nil { + return nil, err + } + name := ingress.Name + if name == nil { + return nil, fmt.Errorf("ingress.Name must be provided to Apply") + } + result = &v1.Ingress{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("ingresses"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *ingresses) ApplyStatus(ctx context.Context, ingress *networkingv1.IngressApplyConfiguration, opts metav1.ApplyOptions) (result *v1.Ingress, err error) { + if ingress == nil { + return nil, fmt.Errorf("ingress provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(ingress) + if err != nil { + return nil, err + } + + name := ingress.Name + if name == nil { + return nil, fmt.Errorf("ingress.Name must be provided to Apply") + } + + result = &v1.Ingress{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("ingresses"). + Name(*name). + SubResource("status"). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/ingressclass.go b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/ingressclass.go index ea67fdab216e..16c8e48bf0ba 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/ingressclass.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/ingressclass.go @@ -20,12 +20,15 @@ package v1 import ( "context" + json "encoding/json" + "fmt" "time" v1 "k8s.io/api/networking/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + networkingv1 "k8s.io/client-go/applyconfigurations/networking/v1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type IngressClassInterface interface { List(ctx context.Context, opts metav1.ListOptions) (*v1.IngressClassList, error) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.IngressClass, err error) + Apply(ctx context.Context, ingressClass *networkingv1.IngressClassApplyConfiguration, opts metav1.ApplyOptions) (result *v1.IngressClass, err error) IngressClassExpansion } @@ -166,3 +170,28 @@ func (c *ingressClasses) Patch(ctx context.Context, name string, pt types.PatchT Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied ingressClass. +func (c *ingressClasses) Apply(ctx context.Context, ingressClass *networkingv1.IngressClassApplyConfiguration, opts metav1.ApplyOptions) (result *v1.IngressClass, err error) { + if ingressClass == nil { + return nil, fmt.Errorf("ingressClass provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(ingressClass) + if err != nil { + return nil, err + } + name := ingressClass.Name + if name == nil { + return nil, fmt.Errorf("ingressClass.Name must be provided to Apply") + } + result = &v1.IngressClass{} + err = c.client.Patch(types.ApplyPatchType). + Resource("ingressclasses"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/networkpolicy.go b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/networkpolicy.go index 19c0c880f39a..d7454ce14525 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/networkpolicy.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/networkpolicy.go @@ -20,12 +20,15 @@ package v1 import ( "context" + json "encoding/json" + "fmt" "time" v1 "k8s.io/api/networking/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + networkingv1 "k8s.io/client-go/applyconfigurations/networking/v1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type NetworkPolicyInterface interface { List(ctx context.Context, opts metav1.ListOptions) (*v1.NetworkPolicyList, error) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.NetworkPolicy, err error) + Apply(ctx context.Context, networkPolicy *networkingv1.NetworkPolicyApplyConfiguration, opts metav1.ApplyOptions) (result *v1.NetworkPolicy, err error) NetworkPolicyExpansion } @@ -176,3 +180,29 @@ func (c *networkPolicies) Patch(ctx context.Context, name string, pt types.Patch Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied networkPolicy. +func (c *networkPolicies) Apply(ctx context.Context, networkPolicy *networkingv1.NetworkPolicyApplyConfiguration, opts metav1.ApplyOptions) (result *v1.NetworkPolicy, err error) { + if networkPolicy == nil { + return nil, fmt.Errorf("networkPolicy provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(networkPolicy) + if err != nil { + return nil, err + } + name := networkPolicy.Name + if name == nil { + return nil, fmt.Errorf("networkPolicy.Name must be provided to Apply") + } + result = &v1.NetworkPolicy{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("networkpolicies"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1beta1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1beta1/BUILD deleted file mode 100644 index 641ae762922f..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1beta1/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated_expansion.go", - "ingress.go", - "ingressclass.go", - "networking_client.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/networking/v1beta1", - importpath = "k8s.io/client-go/kubernetes/typed/networking/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/networking/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/networking/v1beta1/fake:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1beta1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1beta1/fake/BUILD deleted file mode 100644 index 01dee2ab7b33..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1beta1/fake/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_ingress.go", - "fake_ingressclass.go", - "fake_networking_client.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/networking/v1beta1/fake", - importpath = "k8s.io/client-go/kubernetes/typed/networking/v1beta1/fake", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/networking/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/networking/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1beta1/fake/fake_ingress.go b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1beta1/fake/fake_ingress.go index 083229e290ff..21f5f6245414 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1beta1/fake/fake_ingress.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1beta1/fake/fake_ingress.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1beta1 "k8s.io/api/networking/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + networkingv1beta1 "k8s.io/client-go/applyconfigurations/networking/v1beta1" testing "k8s.io/client-go/testing" ) @@ -140,3 +143,48 @@ func (c *FakeIngresses) Patch(ctx context.Context, name string, pt types.PatchTy } return obj.(*v1beta1.Ingress), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied ingress. +func (c *FakeIngresses) Apply(ctx context.Context, ingress *networkingv1beta1.IngressApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.Ingress, err error) { + if ingress == nil { + return nil, fmt.Errorf("ingress provided to Apply must not be nil") + } + data, err := json.Marshal(ingress) + if err != nil { + return nil, err + } + name := ingress.Name + if name == nil { + return nil, fmt.Errorf("ingress.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(ingressesResource, c.ns, *name, types.ApplyPatchType, data), &v1beta1.Ingress{}) + + if obj == nil { + return nil, err + } + return obj.(*v1beta1.Ingress), err +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *FakeIngresses) ApplyStatus(ctx context.Context, ingress *networkingv1beta1.IngressApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.Ingress, err error) { + if ingress == nil { + return nil, fmt.Errorf("ingress provided to Apply must not be nil") + } + data, err := json.Marshal(ingress) + if err != nil { + return nil, err + } + name := ingress.Name + if name == nil { + return nil, fmt.Errorf("ingress.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(ingressesResource, c.ns, *name, types.ApplyPatchType, data, "status"), &v1beta1.Ingress{}) + + if obj == nil { + return nil, err + } + return obj.(*v1beta1.Ingress), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1beta1/fake/fake_ingressclass.go b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1beta1/fake/fake_ingressclass.go index 9329d0b3973c..a0bcebe6f34c 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1beta1/fake/fake_ingressclass.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1beta1/fake/fake_ingressclass.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1beta1 "k8s.io/api/networking/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + networkingv1beta1 "k8s.io/client-go/applyconfigurations/networking/v1beta1" testing "k8s.io/client-go/testing" ) @@ -120,3 +123,24 @@ func (c *FakeIngressClasses) Patch(ctx context.Context, name string, pt types.Pa } return obj.(*v1beta1.IngressClass), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied ingressClass. +func (c *FakeIngressClasses) Apply(ctx context.Context, ingressClass *networkingv1beta1.IngressClassApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.IngressClass, err error) { + if ingressClass == nil { + return nil, fmt.Errorf("ingressClass provided to Apply must not be nil") + } + data, err := json.Marshal(ingressClass) + if err != nil { + return nil, err + } + name := ingressClass.Name + if name == nil { + return nil, fmt.Errorf("ingressClass.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(ingressclassesResource, *name, types.ApplyPatchType, data), &v1beta1.IngressClass{}) + if obj == nil { + return nil, err + } + return obj.(*v1beta1.IngressClass), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1beta1/ingress.go b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1beta1/ingress.go index 0857c05d69d7..b309281afaae 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1beta1/ingress.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1beta1/ingress.go @@ -20,12 +20,15 @@ package v1beta1 import ( "context" + json "encoding/json" + "fmt" "time" v1beta1 "k8s.io/api/networking/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + networkingv1beta1 "k8s.io/client-go/applyconfigurations/networking/v1beta1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -47,6 +50,8 @@ type IngressInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1beta1.IngressList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta1.Ingress, err error) + Apply(ctx context.Context, ingress *networkingv1beta1.IngressApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.Ingress, err error) + ApplyStatus(ctx context.Context, ingress *networkingv1beta1.IngressApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.Ingress, err error) IngressExpansion } @@ -193,3 +198,59 @@ func (c *ingresses) Patch(ctx context.Context, name string, pt types.PatchType, Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied ingress. +func (c *ingresses) Apply(ctx context.Context, ingress *networkingv1beta1.IngressApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.Ingress, err error) { + if ingress == nil { + return nil, fmt.Errorf("ingress provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(ingress) + if err != nil { + return nil, err + } + name := ingress.Name + if name == nil { + return nil, fmt.Errorf("ingress.Name must be provided to Apply") + } + result = &v1beta1.Ingress{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("ingresses"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *ingresses) ApplyStatus(ctx context.Context, ingress *networkingv1beta1.IngressApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.Ingress, err error) { + if ingress == nil { + return nil, fmt.Errorf("ingress provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(ingress) + if err != nil { + return nil, err + } + + name := ingress.Name + if name == nil { + return nil, fmt.Errorf("ingress.Name must be provided to Apply") + } + + result = &v1beta1.Ingress{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("ingresses"). + Name(*name). + SubResource("status"). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1beta1/ingressclass.go b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1beta1/ingressclass.go index 2a4237425b45..50ccdfdbbaf7 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1beta1/ingressclass.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1beta1/ingressclass.go @@ -20,12 +20,15 @@ package v1beta1 import ( "context" + json "encoding/json" + "fmt" "time" v1beta1 "k8s.io/api/networking/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + networkingv1beta1 "k8s.io/client-go/applyconfigurations/networking/v1beta1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type IngressClassInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1beta1.IngressClassList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta1.IngressClass, err error) + Apply(ctx context.Context, ingressClass *networkingv1beta1.IngressClassApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.IngressClass, err error) IngressClassExpansion } @@ -166,3 +170,28 @@ func (c *ingressClasses) Patch(ctx context.Context, name string, pt types.PatchT Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied ingressClass. +func (c *ingressClasses) Apply(ctx context.Context, ingressClass *networkingv1beta1.IngressClassApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.IngressClass, err error) { + if ingressClass == nil { + return nil, fmt.Errorf("ingressClass provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(ingressClass) + if err != nil { + return nil, err + } + name := ingressClass.Name + if name == nil { + return nil, fmt.Errorf("ingressClass.Name must be provided to Apply") + } + result = &v1beta1.IngressClass{} + err = c.client.Patch(types.ApplyPatchType). + Resource("ingressclasses"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/node/v1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/node/v1/BUILD deleted file mode 100644 index ce6e379a2ee9..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/node/v1/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated_expansion.go", - "node_client.go", - "runtimeclass.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/node/v1", - importpath = "k8s.io/client-go/kubernetes/typed/node/v1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/node/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/node/v1/fake:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/node/v1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/node/v1/fake/BUILD deleted file mode 100644 index 77f775b87257..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/node/v1/fake/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_node_client.go", - "fake_runtimeclass.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/node/v1/fake", - importpath = "k8s.io/client-go/kubernetes/typed/node/v1/fake", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/node/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/node/v1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/node/v1/fake/fake_runtimeclass.go b/vendor/k8s.io/client-go/kubernetes/typed/node/v1/fake/fake_runtimeclass.go index 461386f452fb..c79a924bade3 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/node/v1/fake/fake_runtimeclass.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/node/v1/fake/fake_runtimeclass.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" nodev1 "k8s.io/api/node/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + applyconfigurationsnodev1 "k8s.io/client-go/applyconfigurations/node/v1" testing "k8s.io/client-go/testing" ) @@ -120,3 +123,24 @@ func (c *FakeRuntimeClasses) Patch(ctx context.Context, name string, pt types.Pa } return obj.(*nodev1.RuntimeClass), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied runtimeClass. +func (c *FakeRuntimeClasses) Apply(ctx context.Context, runtimeClass *applyconfigurationsnodev1.RuntimeClassApplyConfiguration, opts v1.ApplyOptions) (result *nodev1.RuntimeClass, err error) { + if runtimeClass == nil { + return nil, fmt.Errorf("runtimeClass provided to Apply must not be nil") + } + data, err := json.Marshal(runtimeClass) + if err != nil { + return nil, err + } + name := runtimeClass.Name + if name == nil { + return nil, fmt.Errorf("runtimeClass.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(runtimeclassesResource, *name, types.ApplyPatchType, data), &nodev1.RuntimeClass{}) + if obj == nil { + return nil, err + } + return obj.(*nodev1.RuntimeClass), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/node/v1/runtimeclass.go b/vendor/k8s.io/client-go/kubernetes/typed/node/v1/runtimeclass.go index df8c1cafe812..5ec38b203e3d 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/node/v1/runtimeclass.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/node/v1/runtimeclass.go @@ -20,12 +20,15 @@ package v1 import ( "context" + json "encoding/json" + "fmt" "time" v1 "k8s.io/api/node/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + nodev1 "k8s.io/client-go/applyconfigurations/node/v1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type RuntimeClassInterface interface { List(ctx context.Context, opts metav1.ListOptions) (*v1.RuntimeClassList, error) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.RuntimeClass, err error) + Apply(ctx context.Context, runtimeClass *nodev1.RuntimeClassApplyConfiguration, opts metav1.ApplyOptions) (result *v1.RuntimeClass, err error) RuntimeClassExpansion } @@ -166,3 +170,28 @@ func (c *runtimeClasses) Patch(ctx context.Context, name string, pt types.PatchT Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied runtimeClass. +func (c *runtimeClasses) Apply(ctx context.Context, runtimeClass *nodev1.RuntimeClassApplyConfiguration, opts metav1.ApplyOptions) (result *v1.RuntimeClass, err error) { + if runtimeClass == nil { + return nil, fmt.Errorf("runtimeClass provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(runtimeClass) + if err != nil { + return nil, err + } + name := runtimeClass.Name + if name == nil { + return nil, fmt.Errorf("runtimeClass.Name must be provided to Apply") + } + result = &v1.RuntimeClass{} + err = c.client.Patch(types.ApplyPatchType). + Resource("runtimeclasses"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/node/v1alpha1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/node/v1alpha1/BUILD deleted file mode 100644 index 8c82b48e8390..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/node/v1alpha1/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated_expansion.go", - "node_client.go", - "runtimeclass.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/node/v1alpha1", - importpath = "k8s.io/client-go/kubernetes/typed/node/v1alpha1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/node/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/node/v1alpha1/fake:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/node/v1alpha1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/node/v1alpha1/fake/BUILD deleted file mode 100644 index 1c91dc55b0bf..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/node/v1alpha1/fake/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_node_client.go", - "fake_runtimeclass.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/node/v1alpha1/fake", - importpath = "k8s.io/client-go/kubernetes/typed/node/v1alpha1/fake", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/node/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/node/v1alpha1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/node/v1alpha1/fake/fake_runtimeclass.go b/vendor/k8s.io/client-go/kubernetes/typed/node/v1alpha1/fake/fake_runtimeclass.go index b49d787ded71..22694eea3516 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/node/v1alpha1/fake/fake_runtimeclass.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/node/v1alpha1/fake/fake_runtimeclass.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1alpha1 "k8s.io/api/node/v1alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + nodev1alpha1 "k8s.io/client-go/applyconfigurations/node/v1alpha1" testing "k8s.io/client-go/testing" ) @@ -120,3 +123,24 @@ func (c *FakeRuntimeClasses) Patch(ctx context.Context, name string, pt types.Pa } return obj.(*v1alpha1.RuntimeClass), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied runtimeClass. +func (c *FakeRuntimeClasses) Apply(ctx context.Context, runtimeClass *nodev1alpha1.RuntimeClassApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.RuntimeClass, err error) { + if runtimeClass == nil { + return nil, fmt.Errorf("runtimeClass provided to Apply must not be nil") + } + data, err := json.Marshal(runtimeClass) + if err != nil { + return nil, err + } + name := runtimeClass.Name + if name == nil { + return nil, fmt.Errorf("runtimeClass.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(runtimeclassesResource, *name, types.ApplyPatchType, data), &v1alpha1.RuntimeClass{}) + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.RuntimeClass), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/node/v1alpha1/runtimeclass.go b/vendor/k8s.io/client-go/kubernetes/typed/node/v1alpha1/runtimeclass.go index 402c23e8af1a..039a7ace1590 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/node/v1alpha1/runtimeclass.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/node/v1alpha1/runtimeclass.go @@ -20,12 +20,15 @@ package v1alpha1 import ( "context" + json "encoding/json" + "fmt" "time" v1alpha1 "k8s.io/api/node/v1alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + nodev1alpha1 "k8s.io/client-go/applyconfigurations/node/v1alpha1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type RuntimeClassInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1alpha1.RuntimeClassList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.RuntimeClass, err error) + Apply(ctx context.Context, runtimeClass *nodev1alpha1.RuntimeClassApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.RuntimeClass, err error) RuntimeClassExpansion } @@ -166,3 +170,28 @@ func (c *runtimeClasses) Patch(ctx context.Context, name string, pt types.PatchT Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied runtimeClass. +func (c *runtimeClasses) Apply(ctx context.Context, runtimeClass *nodev1alpha1.RuntimeClassApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.RuntimeClass, err error) { + if runtimeClass == nil { + return nil, fmt.Errorf("runtimeClass provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(runtimeClass) + if err != nil { + return nil, err + } + name := runtimeClass.Name + if name == nil { + return nil, fmt.Errorf("runtimeClass.Name must be provided to Apply") + } + result = &v1alpha1.RuntimeClass{} + err = c.client.Patch(types.ApplyPatchType). + Resource("runtimeclasses"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/node/v1beta1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/node/v1beta1/BUILD deleted file mode 100644 index 6ecdd77d3423..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/node/v1beta1/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated_expansion.go", - "node_client.go", - "runtimeclass.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/node/v1beta1", - importpath = "k8s.io/client-go/kubernetes/typed/node/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/node/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/node/v1beta1/fake:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/node/v1beta1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/node/v1beta1/fake/BUILD deleted file mode 100644 index 70d328162845..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/node/v1beta1/fake/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_node_client.go", - "fake_runtimeclass.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/node/v1beta1/fake", - importpath = "k8s.io/client-go/kubernetes/typed/node/v1beta1/fake", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/node/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/node/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/node/v1beta1/fake/fake_runtimeclass.go b/vendor/k8s.io/client-go/kubernetes/typed/node/v1beta1/fake/fake_runtimeclass.go index d7987d9812fb..5aba915992e6 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/node/v1beta1/fake/fake_runtimeclass.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/node/v1beta1/fake/fake_runtimeclass.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1beta1 "k8s.io/api/node/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + nodev1beta1 "k8s.io/client-go/applyconfigurations/node/v1beta1" testing "k8s.io/client-go/testing" ) @@ -120,3 +123,24 @@ func (c *FakeRuntimeClasses) Patch(ctx context.Context, name string, pt types.Pa } return obj.(*v1beta1.RuntimeClass), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied runtimeClass. +func (c *FakeRuntimeClasses) Apply(ctx context.Context, runtimeClass *nodev1beta1.RuntimeClassApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.RuntimeClass, err error) { + if runtimeClass == nil { + return nil, fmt.Errorf("runtimeClass provided to Apply must not be nil") + } + data, err := json.Marshal(runtimeClass) + if err != nil { + return nil, err + } + name := runtimeClass.Name + if name == nil { + return nil, fmt.Errorf("runtimeClass.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(runtimeclassesResource, *name, types.ApplyPatchType, data), &v1beta1.RuntimeClass{}) + if obj == nil { + return nil, err + } + return obj.(*v1beta1.RuntimeClass), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/node/v1beta1/runtimeclass.go b/vendor/k8s.io/client-go/kubernetes/typed/node/v1beta1/runtimeclass.go index b0d1886eccef..f8990adf1ee4 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/node/v1beta1/runtimeclass.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/node/v1beta1/runtimeclass.go @@ -20,12 +20,15 @@ package v1beta1 import ( "context" + json "encoding/json" + "fmt" "time" v1beta1 "k8s.io/api/node/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + nodev1beta1 "k8s.io/client-go/applyconfigurations/node/v1beta1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type RuntimeClassInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1beta1.RuntimeClassList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta1.RuntimeClass, err error) + Apply(ctx context.Context, runtimeClass *nodev1beta1.RuntimeClassApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.RuntimeClass, err error) RuntimeClassExpansion } @@ -166,3 +170,28 @@ func (c *runtimeClasses) Patch(ctx context.Context, name string, pt types.PatchT Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied runtimeClass. +func (c *runtimeClasses) Apply(ctx context.Context, runtimeClass *nodev1beta1.RuntimeClassApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.RuntimeClass, err error) { + if runtimeClass == nil { + return nil, fmt.Errorf("runtimeClass provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(runtimeClass) + if err != nil { + return nil, err + } + name := runtimeClass.Name + if name == nil { + return nil, fmt.Errorf("runtimeClass.Name must be provided to Apply") + } + result = &v1beta1.RuntimeClass{} + err = c.client.Patch(types.ApplyPatchType). + Resource("runtimeclasses"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/policy/v1/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1/doc.go new file mode 100644 index 000000000000..3af5d054f102 --- /dev/null +++ b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1/doc.go @@ -0,0 +1,20 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +// This package has the automatically generated typed clients. +package v1 diff --git a/vendor/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1/fake/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1/fake/doc.go similarity index 100% rename from vendor/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1/fake/doc.go rename to vendor/k8s.io/client-go/kubernetes/typed/policy/v1/fake/doc.go diff --git a/vendor/k8s.io/client-go/kubernetes/typed/policy/v1/fake/fake_poddisruptionbudget.go b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1/fake/fake_poddisruptionbudget.go new file mode 100644 index 000000000000..5763782a9018 --- /dev/null +++ b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1/fake/fake_poddisruptionbudget.go @@ -0,0 +1,190 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package fake + +import ( + "context" + json "encoding/json" + "fmt" + + policyv1 "k8s.io/api/policy/v1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + labels "k8s.io/apimachinery/pkg/labels" + schema "k8s.io/apimachinery/pkg/runtime/schema" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + applyconfigurationspolicyv1 "k8s.io/client-go/applyconfigurations/policy/v1" + testing "k8s.io/client-go/testing" +) + +// FakePodDisruptionBudgets implements PodDisruptionBudgetInterface +type FakePodDisruptionBudgets struct { + Fake *FakePolicyV1 + ns string +} + +var poddisruptionbudgetsResource = schema.GroupVersionResource{Group: "policy", Version: "v1", Resource: "poddisruptionbudgets"} + +var poddisruptionbudgetsKind = schema.GroupVersionKind{Group: "policy", Version: "v1", Kind: "PodDisruptionBudget"} + +// Get takes name of the podDisruptionBudget, and returns the corresponding podDisruptionBudget object, and an error if there is any. +func (c *FakePodDisruptionBudgets) Get(ctx context.Context, name string, options v1.GetOptions) (result *policyv1.PodDisruptionBudget, err error) { + obj, err := c.Fake. + Invokes(testing.NewGetAction(poddisruptionbudgetsResource, c.ns, name), &policyv1.PodDisruptionBudget{}) + + if obj == nil { + return nil, err + } + return obj.(*policyv1.PodDisruptionBudget), err +} + +// List takes label and field selectors, and returns the list of PodDisruptionBudgets that match those selectors. +func (c *FakePodDisruptionBudgets) List(ctx context.Context, opts v1.ListOptions) (result *policyv1.PodDisruptionBudgetList, err error) { + obj, err := c.Fake. + Invokes(testing.NewListAction(poddisruptionbudgetsResource, poddisruptionbudgetsKind, c.ns, opts), &policyv1.PodDisruptionBudgetList{}) + + if obj == nil { + return nil, err + } + + label, _, _ := testing.ExtractFromListOptions(opts) + if label == nil { + label = labels.Everything() + } + list := &policyv1.PodDisruptionBudgetList{ListMeta: obj.(*policyv1.PodDisruptionBudgetList).ListMeta} + for _, item := range obj.(*policyv1.PodDisruptionBudgetList).Items { + if label.Matches(labels.Set(item.Labels)) { + list.Items = append(list.Items, item) + } + } + return list, err +} + +// Watch returns a watch.Interface that watches the requested podDisruptionBudgets. +func (c *FakePodDisruptionBudgets) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) { + return c.Fake. + InvokesWatch(testing.NewWatchAction(poddisruptionbudgetsResource, c.ns, opts)) + +} + +// Create takes the representation of a podDisruptionBudget and creates it. Returns the server's representation of the podDisruptionBudget, and an error, if there is any. +func (c *FakePodDisruptionBudgets) Create(ctx context.Context, podDisruptionBudget *policyv1.PodDisruptionBudget, opts v1.CreateOptions) (result *policyv1.PodDisruptionBudget, err error) { + obj, err := c.Fake. + Invokes(testing.NewCreateAction(poddisruptionbudgetsResource, c.ns, podDisruptionBudget), &policyv1.PodDisruptionBudget{}) + + if obj == nil { + return nil, err + } + return obj.(*policyv1.PodDisruptionBudget), err +} + +// Update takes the representation of a podDisruptionBudget and updates it. Returns the server's representation of the podDisruptionBudget, and an error, if there is any. +func (c *FakePodDisruptionBudgets) Update(ctx context.Context, podDisruptionBudget *policyv1.PodDisruptionBudget, opts v1.UpdateOptions) (result *policyv1.PodDisruptionBudget, err error) { + obj, err := c.Fake. + Invokes(testing.NewUpdateAction(poddisruptionbudgetsResource, c.ns, podDisruptionBudget), &policyv1.PodDisruptionBudget{}) + + if obj == nil { + return nil, err + } + return obj.(*policyv1.PodDisruptionBudget), err +} + +// UpdateStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). +func (c *FakePodDisruptionBudgets) UpdateStatus(ctx context.Context, podDisruptionBudget *policyv1.PodDisruptionBudget, opts v1.UpdateOptions) (*policyv1.PodDisruptionBudget, error) { + obj, err := c.Fake. + Invokes(testing.NewUpdateSubresourceAction(poddisruptionbudgetsResource, "status", c.ns, podDisruptionBudget), &policyv1.PodDisruptionBudget{}) + + if obj == nil { + return nil, err + } + return obj.(*policyv1.PodDisruptionBudget), err +} + +// Delete takes name of the podDisruptionBudget and deletes it. Returns an error if one occurs. +func (c *FakePodDisruptionBudgets) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error { + _, err := c.Fake. + Invokes(testing.NewDeleteAction(poddisruptionbudgetsResource, c.ns, name), &policyv1.PodDisruptionBudget{}) + + return err +} + +// DeleteCollection deletes a collection of objects. +func (c *FakePodDisruptionBudgets) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error { + action := testing.NewDeleteCollectionAction(poddisruptionbudgetsResource, c.ns, listOpts) + + _, err := c.Fake.Invokes(action, &policyv1.PodDisruptionBudgetList{}) + return err +} + +// Patch applies the patch and returns the patched podDisruptionBudget. +func (c *FakePodDisruptionBudgets) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *policyv1.PodDisruptionBudget, err error) { + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(poddisruptionbudgetsResource, c.ns, name, pt, data, subresources...), &policyv1.PodDisruptionBudget{}) + + if obj == nil { + return nil, err + } + return obj.(*policyv1.PodDisruptionBudget), err +} + +// Apply takes the given apply declarative configuration, applies it and returns the applied podDisruptionBudget. +func (c *FakePodDisruptionBudgets) Apply(ctx context.Context, podDisruptionBudget *applyconfigurationspolicyv1.PodDisruptionBudgetApplyConfiguration, opts v1.ApplyOptions) (result *policyv1.PodDisruptionBudget, err error) { + if podDisruptionBudget == nil { + return nil, fmt.Errorf("podDisruptionBudget provided to Apply must not be nil") + } + data, err := json.Marshal(podDisruptionBudget) + if err != nil { + return nil, err + } + name := podDisruptionBudget.Name + if name == nil { + return nil, fmt.Errorf("podDisruptionBudget.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(poddisruptionbudgetsResource, c.ns, *name, types.ApplyPatchType, data), &policyv1.PodDisruptionBudget{}) + + if obj == nil { + return nil, err + } + return obj.(*policyv1.PodDisruptionBudget), err +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *FakePodDisruptionBudgets) ApplyStatus(ctx context.Context, podDisruptionBudget *applyconfigurationspolicyv1.PodDisruptionBudgetApplyConfiguration, opts v1.ApplyOptions) (result *policyv1.PodDisruptionBudget, err error) { + if podDisruptionBudget == nil { + return nil, fmt.Errorf("podDisruptionBudget provided to Apply must not be nil") + } + data, err := json.Marshal(podDisruptionBudget) + if err != nil { + return nil, err + } + name := podDisruptionBudget.Name + if name == nil { + return nil, fmt.Errorf("podDisruptionBudget.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(poddisruptionbudgetsResource, c.ns, *name, types.ApplyPatchType, data, "status"), &policyv1.PodDisruptionBudget{}) + + if obj == nil { + return nil, err + } + return obj.(*policyv1.PodDisruptionBudget), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/policy/v1/fake/fake_policy_client.go b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1/fake/fake_policy_client.go new file mode 100644 index 000000000000..ba0f039b211d --- /dev/null +++ b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1/fake/fake_policy_client.go @@ -0,0 +1,40 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package fake + +import ( + v1 "k8s.io/client-go/kubernetes/typed/policy/v1" + rest "k8s.io/client-go/rest" + testing "k8s.io/client-go/testing" +) + +type FakePolicyV1 struct { + *testing.Fake +} + +func (c *FakePolicyV1) PodDisruptionBudgets(namespace string) v1.PodDisruptionBudgetInterface { + return &FakePodDisruptionBudgets{c, namespace} +} + +// RESTClient returns a RESTClient that is used to communicate +// with API server by this client implementation. +func (c *FakePolicyV1) RESTClient() rest.Interface { + var ret *rest.RESTClient + return ret +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/policy/v1/generated_expansion.go b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1/generated_expansion.go new file mode 100644 index 000000000000..e07093d79f8a --- /dev/null +++ b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1/generated_expansion.go @@ -0,0 +1,21 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package v1 + +type PodDisruptionBudgetExpansion interface{} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/policy/v1/poddisruptionbudget.go b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1/poddisruptionbudget.go new file mode 100644 index 000000000000..58db3acf9ec6 --- /dev/null +++ b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1/poddisruptionbudget.go @@ -0,0 +1,256 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package v1 + +import ( + "context" + json "encoding/json" + "fmt" + "time" + + v1 "k8s.io/api/policy/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + policyv1 "k8s.io/client-go/applyconfigurations/policy/v1" + scheme "k8s.io/client-go/kubernetes/scheme" + rest "k8s.io/client-go/rest" +) + +// PodDisruptionBudgetsGetter has a method to return a PodDisruptionBudgetInterface. +// A group's client should implement this interface. +type PodDisruptionBudgetsGetter interface { + PodDisruptionBudgets(namespace string) PodDisruptionBudgetInterface +} + +// PodDisruptionBudgetInterface has methods to work with PodDisruptionBudget resources. +type PodDisruptionBudgetInterface interface { + Create(ctx context.Context, podDisruptionBudget *v1.PodDisruptionBudget, opts metav1.CreateOptions) (*v1.PodDisruptionBudget, error) + Update(ctx context.Context, podDisruptionBudget *v1.PodDisruptionBudget, opts metav1.UpdateOptions) (*v1.PodDisruptionBudget, error) + UpdateStatus(ctx context.Context, podDisruptionBudget *v1.PodDisruptionBudget, opts metav1.UpdateOptions) (*v1.PodDisruptionBudget, error) + Delete(ctx context.Context, name string, opts metav1.DeleteOptions) error + DeleteCollection(ctx context.Context, opts metav1.DeleteOptions, listOpts metav1.ListOptions) error + Get(ctx context.Context, name string, opts metav1.GetOptions) (*v1.PodDisruptionBudget, error) + List(ctx context.Context, opts metav1.ListOptions) (*v1.PodDisruptionBudgetList, error) + Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) + Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.PodDisruptionBudget, err error) + Apply(ctx context.Context, podDisruptionBudget *policyv1.PodDisruptionBudgetApplyConfiguration, opts metav1.ApplyOptions) (result *v1.PodDisruptionBudget, err error) + ApplyStatus(ctx context.Context, podDisruptionBudget *policyv1.PodDisruptionBudgetApplyConfiguration, opts metav1.ApplyOptions) (result *v1.PodDisruptionBudget, err error) + PodDisruptionBudgetExpansion +} + +// podDisruptionBudgets implements PodDisruptionBudgetInterface +type podDisruptionBudgets struct { + client rest.Interface + ns string +} + +// newPodDisruptionBudgets returns a PodDisruptionBudgets +func newPodDisruptionBudgets(c *PolicyV1Client, namespace string) *podDisruptionBudgets { + return &podDisruptionBudgets{ + client: c.RESTClient(), + ns: namespace, + } +} + +// Get takes name of the podDisruptionBudget, and returns the corresponding podDisruptionBudget object, and an error if there is any. +func (c *podDisruptionBudgets) Get(ctx context.Context, name string, options metav1.GetOptions) (result *v1.PodDisruptionBudget, err error) { + result = &v1.PodDisruptionBudget{} + err = c.client.Get(). + Namespace(c.ns). + Resource("poddisruptionbudgets"). + Name(name). + VersionedParams(&options, scheme.ParameterCodec). + Do(ctx). + Into(result) + return +} + +// List takes label and field selectors, and returns the list of PodDisruptionBudgets that match those selectors. +func (c *podDisruptionBudgets) List(ctx context.Context, opts metav1.ListOptions) (result *v1.PodDisruptionBudgetList, err error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + result = &v1.PodDisruptionBudgetList{} + err = c.client.Get(). + Namespace(c.ns). + Resource("poddisruptionbudgets"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Do(ctx). + Into(result) + return +} + +// Watch returns a watch.Interface that watches the requested podDisruptionBudgets. +func (c *podDisruptionBudgets) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + opts.Watch = true + return c.client.Get(). + Namespace(c.ns). + Resource("poddisruptionbudgets"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Watch(ctx) +} + +// Create takes the representation of a podDisruptionBudget and creates it. Returns the server's representation of the podDisruptionBudget, and an error, if there is any. +func (c *podDisruptionBudgets) Create(ctx context.Context, podDisruptionBudget *v1.PodDisruptionBudget, opts metav1.CreateOptions) (result *v1.PodDisruptionBudget, err error) { + result = &v1.PodDisruptionBudget{} + err = c.client.Post(). + Namespace(c.ns). + Resource("poddisruptionbudgets"). + VersionedParams(&opts, scheme.ParameterCodec). + Body(podDisruptionBudget). + Do(ctx). + Into(result) + return +} + +// Update takes the representation of a podDisruptionBudget and updates it. Returns the server's representation of the podDisruptionBudget, and an error, if there is any. +func (c *podDisruptionBudgets) Update(ctx context.Context, podDisruptionBudget *v1.PodDisruptionBudget, opts metav1.UpdateOptions) (result *v1.PodDisruptionBudget, err error) { + result = &v1.PodDisruptionBudget{} + err = c.client.Put(). + Namespace(c.ns). + Resource("poddisruptionbudgets"). + Name(podDisruptionBudget.Name). + VersionedParams(&opts, scheme.ParameterCodec). + Body(podDisruptionBudget). + Do(ctx). + Into(result) + return +} + +// UpdateStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). +func (c *podDisruptionBudgets) UpdateStatus(ctx context.Context, podDisruptionBudget *v1.PodDisruptionBudget, opts metav1.UpdateOptions) (result *v1.PodDisruptionBudget, err error) { + result = &v1.PodDisruptionBudget{} + err = c.client.Put(). + Namespace(c.ns). + Resource("poddisruptionbudgets"). + Name(podDisruptionBudget.Name). + SubResource("status"). + VersionedParams(&opts, scheme.ParameterCodec). + Body(podDisruptionBudget). + Do(ctx). + Into(result) + return +} + +// Delete takes name of the podDisruptionBudget and deletes it. Returns an error if one occurs. +func (c *podDisruptionBudgets) Delete(ctx context.Context, name string, opts metav1.DeleteOptions) error { + return c.client.Delete(). + Namespace(c.ns). + Resource("poddisruptionbudgets"). + Name(name). + Body(&opts). + Do(ctx). + Error() +} + +// DeleteCollection deletes a collection of objects. +func (c *podDisruptionBudgets) DeleteCollection(ctx context.Context, opts metav1.DeleteOptions, listOpts metav1.ListOptions) error { + var timeout time.Duration + if listOpts.TimeoutSeconds != nil { + timeout = time.Duration(*listOpts.TimeoutSeconds) * time.Second + } + return c.client.Delete(). + Namespace(c.ns). + Resource("poddisruptionbudgets"). + VersionedParams(&listOpts, scheme.ParameterCodec). + Timeout(timeout). + Body(&opts). + Do(ctx). + Error() +} + +// Patch applies the patch and returns the patched podDisruptionBudget. +func (c *podDisruptionBudgets) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.PodDisruptionBudget, err error) { + result = &v1.PodDisruptionBudget{} + err = c.client.Patch(pt). + Namespace(c.ns). + Resource("poddisruptionbudgets"). + Name(name). + SubResource(subresources...). + VersionedParams(&opts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// Apply takes the given apply declarative configuration, applies it and returns the applied podDisruptionBudget. +func (c *podDisruptionBudgets) Apply(ctx context.Context, podDisruptionBudget *policyv1.PodDisruptionBudgetApplyConfiguration, opts metav1.ApplyOptions) (result *v1.PodDisruptionBudget, err error) { + if podDisruptionBudget == nil { + return nil, fmt.Errorf("podDisruptionBudget provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(podDisruptionBudget) + if err != nil { + return nil, err + } + name := podDisruptionBudget.Name + if name == nil { + return nil, fmt.Errorf("podDisruptionBudget.Name must be provided to Apply") + } + result = &v1.PodDisruptionBudget{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("poddisruptionbudgets"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *podDisruptionBudgets) ApplyStatus(ctx context.Context, podDisruptionBudget *policyv1.PodDisruptionBudgetApplyConfiguration, opts metav1.ApplyOptions) (result *v1.PodDisruptionBudget, err error) { + if podDisruptionBudget == nil { + return nil, fmt.Errorf("podDisruptionBudget provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(podDisruptionBudget) + if err != nil { + return nil, err + } + + name := podDisruptionBudget.Name + if name == nil { + return nil, fmt.Errorf("podDisruptionBudget.Name must be provided to Apply") + } + + result = &v1.PodDisruptionBudget{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("poddisruptionbudgets"). + Name(*name). + SubResource("status"). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/policy/v1/policy_client.go b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1/policy_client.go new file mode 100644 index 000000000000..bb05a686a67e --- /dev/null +++ b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1/policy_client.go @@ -0,0 +1,89 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/policy/v1" + "k8s.io/client-go/kubernetes/scheme" + rest "k8s.io/client-go/rest" +) + +type PolicyV1Interface interface { + RESTClient() rest.Interface + PodDisruptionBudgetsGetter +} + +// PolicyV1Client is used to interact with features provided by the policy group. +type PolicyV1Client struct { + restClient rest.Interface +} + +func (c *PolicyV1Client) PodDisruptionBudgets(namespace string) PodDisruptionBudgetInterface { + return newPodDisruptionBudgets(c, namespace) +} + +// NewForConfig creates a new PolicyV1Client for the given config. +func NewForConfig(c *rest.Config) (*PolicyV1Client, error) { + config := *c + if err := setConfigDefaults(&config); err != nil { + return nil, err + } + client, err := rest.RESTClientFor(&config) + if err != nil { + return nil, err + } + return &PolicyV1Client{client}, nil +} + +// NewForConfigOrDie creates a new PolicyV1Client for the given config and +// panics if there is an error in the config. +func NewForConfigOrDie(c *rest.Config) *PolicyV1Client { + client, err := NewForConfig(c) + if err != nil { + panic(err) + } + return client +} + +// New creates a new PolicyV1Client for the given RESTClient. +func New(c rest.Interface) *PolicyV1Client { + return &PolicyV1Client{c} +} + +func setConfigDefaults(config *rest.Config) error { + gv := v1.SchemeGroupVersion + config.GroupVersion = &gv + config.APIPath = "/apis" + config.NegotiatedSerializer = scheme.Codecs.WithoutConversion() + + if config.UserAgent == "" { + config.UserAgent = rest.DefaultKubernetesUserAgent() + } + + return nil +} + +// RESTClient returns a RESTClient that is used to communicate +// with API server by this client implementation. +func (c *PolicyV1Client) RESTClient() rest.Interface { + if c == nil { + return nil + } + return c.restClient +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/BUILD deleted file mode 100644 index f9fb20bdc7f9..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "eviction.go", - "eviction_expansion.go", - "generated_expansion.go", - "poddisruptionbudget.go", - "podsecuritypolicy.go", - "policy_client.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1", - importpath = "k8s.io/client-go/kubernetes/typed/policy/v1beta1", - deps = [ - "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake/BUILD deleted file mode 100644 index ee005c590ef5..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_eviction.go", - "fake_eviction_expansion.go", - "fake_poddisruptionbudget.go", - "fake_podsecuritypolicy.go", - "fake_policy_client.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake", - importpath = "k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake", - deps = [ - "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake/fake_poddisruptionbudget.go b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake/fake_poddisruptionbudget.go index 78ea7815ac2d..7c0352daa708 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake/fake_poddisruptionbudget.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake/fake_poddisruptionbudget.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1beta1 "k8s.io/api/policy/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + policyv1beta1 "k8s.io/client-go/applyconfigurations/policy/v1beta1" testing "k8s.io/client-go/testing" ) @@ -140,3 +143,48 @@ func (c *FakePodDisruptionBudgets) Patch(ctx context.Context, name string, pt ty } return obj.(*v1beta1.PodDisruptionBudget), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied podDisruptionBudget. +func (c *FakePodDisruptionBudgets) Apply(ctx context.Context, podDisruptionBudget *policyv1beta1.PodDisruptionBudgetApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.PodDisruptionBudget, err error) { + if podDisruptionBudget == nil { + return nil, fmt.Errorf("podDisruptionBudget provided to Apply must not be nil") + } + data, err := json.Marshal(podDisruptionBudget) + if err != nil { + return nil, err + } + name := podDisruptionBudget.Name + if name == nil { + return nil, fmt.Errorf("podDisruptionBudget.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(poddisruptionbudgetsResource, c.ns, *name, types.ApplyPatchType, data), &v1beta1.PodDisruptionBudget{}) + + if obj == nil { + return nil, err + } + return obj.(*v1beta1.PodDisruptionBudget), err +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *FakePodDisruptionBudgets) ApplyStatus(ctx context.Context, podDisruptionBudget *policyv1beta1.PodDisruptionBudgetApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.PodDisruptionBudget, err error) { + if podDisruptionBudget == nil { + return nil, fmt.Errorf("podDisruptionBudget provided to Apply must not be nil") + } + data, err := json.Marshal(podDisruptionBudget) + if err != nil { + return nil, err + } + name := podDisruptionBudget.Name + if name == nil { + return nil, fmt.Errorf("podDisruptionBudget.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(poddisruptionbudgetsResource, c.ns, *name, types.ApplyPatchType, data, "status"), &v1beta1.PodDisruptionBudget{}) + + if obj == nil { + return nil, err + } + return obj.(*v1beta1.PodDisruptionBudget), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake/fake_podsecuritypolicy.go b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake/fake_podsecuritypolicy.go index 667f86b792cd..a7dffc032c70 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake/fake_podsecuritypolicy.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake/fake_podsecuritypolicy.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1beta1 "k8s.io/api/policy/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + policyv1beta1 "k8s.io/client-go/applyconfigurations/policy/v1beta1" testing "k8s.io/client-go/testing" ) @@ -120,3 +123,24 @@ func (c *FakePodSecurityPolicies) Patch(ctx context.Context, name string, pt typ } return obj.(*v1beta1.PodSecurityPolicy), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied podSecurityPolicy. +func (c *FakePodSecurityPolicies) Apply(ctx context.Context, podSecurityPolicy *policyv1beta1.PodSecurityPolicyApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.PodSecurityPolicy, err error) { + if podSecurityPolicy == nil { + return nil, fmt.Errorf("podSecurityPolicy provided to Apply must not be nil") + } + data, err := json.Marshal(podSecurityPolicy) + if err != nil { + return nil, err + } + name := podSecurityPolicy.Name + if name == nil { + return nil, fmt.Errorf("podSecurityPolicy.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(podsecuritypoliciesResource, *name, types.ApplyPatchType, data), &v1beta1.PodSecurityPolicy{}) + if obj == nil { + return nil, err + } + return obj.(*v1beta1.PodSecurityPolicy), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/poddisruptionbudget.go b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/poddisruptionbudget.go index 95b7ff1b8274..168728992133 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/poddisruptionbudget.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/poddisruptionbudget.go @@ -20,12 +20,15 @@ package v1beta1 import ( "context" + json "encoding/json" + "fmt" "time" v1beta1 "k8s.io/api/policy/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + policyv1beta1 "k8s.io/client-go/applyconfigurations/policy/v1beta1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -47,6 +50,8 @@ type PodDisruptionBudgetInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1beta1.PodDisruptionBudgetList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta1.PodDisruptionBudget, err error) + Apply(ctx context.Context, podDisruptionBudget *policyv1beta1.PodDisruptionBudgetApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.PodDisruptionBudget, err error) + ApplyStatus(ctx context.Context, podDisruptionBudget *policyv1beta1.PodDisruptionBudgetApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.PodDisruptionBudget, err error) PodDisruptionBudgetExpansion } @@ -193,3 +198,59 @@ func (c *podDisruptionBudgets) Patch(ctx context.Context, name string, pt types. Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied podDisruptionBudget. +func (c *podDisruptionBudgets) Apply(ctx context.Context, podDisruptionBudget *policyv1beta1.PodDisruptionBudgetApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.PodDisruptionBudget, err error) { + if podDisruptionBudget == nil { + return nil, fmt.Errorf("podDisruptionBudget provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(podDisruptionBudget) + if err != nil { + return nil, err + } + name := podDisruptionBudget.Name + if name == nil { + return nil, fmt.Errorf("podDisruptionBudget.Name must be provided to Apply") + } + result = &v1beta1.PodDisruptionBudget{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("poddisruptionbudgets"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *podDisruptionBudgets) ApplyStatus(ctx context.Context, podDisruptionBudget *policyv1beta1.PodDisruptionBudgetApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.PodDisruptionBudget, err error) { + if podDisruptionBudget == nil { + return nil, fmt.Errorf("podDisruptionBudget provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(podDisruptionBudget) + if err != nil { + return nil, err + } + + name := podDisruptionBudget.Name + if name == nil { + return nil, fmt.Errorf("podDisruptionBudget.Name must be provided to Apply") + } + + result = &v1beta1.PodDisruptionBudget{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("poddisruptionbudgets"). + Name(*name). + SubResource("status"). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/podsecuritypolicy.go b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/podsecuritypolicy.go index 15d7bb9e4645..944b61de47fd 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/podsecuritypolicy.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/podsecuritypolicy.go @@ -20,12 +20,15 @@ package v1beta1 import ( "context" + json "encoding/json" + "fmt" "time" v1beta1 "k8s.io/api/policy/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + policyv1beta1 "k8s.io/client-go/applyconfigurations/policy/v1beta1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type PodSecurityPolicyInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1beta1.PodSecurityPolicyList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta1.PodSecurityPolicy, err error) + Apply(ctx context.Context, podSecurityPolicy *policyv1beta1.PodSecurityPolicyApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.PodSecurityPolicy, err error) PodSecurityPolicyExpansion } @@ -166,3 +170,28 @@ func (c *podSecurityPolicies) Patch(ctx context.Context, name string, pt types.P Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied podSecurityPolicy. +func (c *podSecurityPolicies) Apply(ctx context.Context, podSecurityPolicy *policyv1beta1.PodSecurityPolicyApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.PodSecurityPolicy, err error) { + if podSecurityPolicy == nil { + return nil, fmt.Errorf("podSecurityPolicy provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(podSecurityPolicy) + if err != nil { + return nil, err + } + name := podSecurityPolicy.Name + if name == nil { + return nil, fmt.Errorf("podSecurityPolicy.Name must be provided to Apply") + } + result = &v1beta1.PodSecurityPolicy{} + err = c.client.Patch(types.ApplyPatchType). + Resource("podsecuritypolicies"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/BUILD deleted file mode 100644 index 47f620068a1a..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "clusterrole.go", - "clusterrolebinding.go", - "doc.go", - "generated_expansion.go", - "rbac_client.go", - "role.go", - "rolebinding.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1", - importpath = "k8s.io/client-go/kubernetes/typed/rbac/v1", - deps = [ - "//staging/src/k8s.io/api/rbac/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/clusterrole.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/clusterrole.go index 787324d65484..000d737f0ff2 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/clusterrole.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/clusterrole.go @@ -20,12 +20,15 @@ package v1 import ( "context" + json "encoding/json" + "fmt" "time" v1 "k8s.io/api/rbac/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + rbacv1 "k8s.io/client-go/applyconfigurations/rbac/v1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type ClusterRoleInterface interface { List(ctx context.Context, opts metav1.ListOptions) (*v1.ClusterRoleList, error) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.ClusterRole, err error) + Apply(ctx context.Context, clusterRole *rbacv1.ClusterRoleApplyConfiguration, opts metav1.ApplyOptions) (result *v1.ClusterRole, err error) ClusterRoleExpansion } @@ -166,3 +170,28 @@ func (c *clusterRoles) Patch(ctx context.Context, name string, pt types.PatchTyp Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied clusterRole. +func (c *clusterRoles) Apply(ctx context.Context, clusterRole *rbacv1.ClusterRoleApplyConfiguration, opts metav1.ApplyOptions) (result *v1.ClusterRole, err error) { + if clusterRole == nil { + return nil, fmt.Errorf("clusterRole provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(clusterRole) + if err != nil { + return nil, err + } + name := clusterRole.Name + if name == nil { + return nil, fmt.Errorf("clusterRole.Name must be provided to Apply") + } + result = &v1.ClusterRole{} + err = c.client.Patch(types.ApplyPatchType). + Resource("clusterroles"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/clusterrolebinding.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/clusterrolebinding.go index 83e8c81bb24c..31db43d98480 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/clusterrolebinding.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/clusterrolebinding.go @@ -20,12 +20,15 @@ package v1 import ( "context" + json "encoding/json" + "fmt" "time" v1 "k8s.io/api/rbac/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + rbacv1 "k8s.io/client-go/applyconfigurations/rbac/v1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type ClusterRoleBindingInterface interface { List(ctx context.Context, opts metav1.ListOptions) (*v1.ClusterRoleBindingList, error) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.ClusterRoleBinding, err error) + Apply(ctx context.Context, clusterRoleBinding *rbacv1.ClusterRoleBindingApplyConfiguration, opts metav1.ApplyOptions) (result *v1.ClusterRoleBinding, err error) ClusterRoleBindingExpansion } @@ -166,3 +170,28 @@ func (c *clusterRoleBindings) Patch(ctx context.Context, name string, pt types.P Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied clusterRoleBinding. +func (c *clusterRoleBindings) Apply(ctx context.Context, clusterRoleBinding *rbacv1.ClusterRoleBindingApplyConfiguration, opts metav1.ApplyOptions) (result *v1.ClusterRoleBinding, err error) { + if clusterRoleBinding == nil { + return nil, fmt.Errorf("clusterRoleBinding provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(clusterRoleBinding) + if err != nil { + return nil, err + } + name := clusterRoleBinding.Name + if name == nil { + return nil, fmt.Errorf("clusterRoleBinding.Name must be provided to Apply") + } + result = &v1.ClusterRoleBinding{} + err = c.client.Patch(types.ApplyPatchType). + Resource("clusterrolebindings"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/BUILD deleted file mode 100644 index a3a6ee4e69f2..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_clusterrole.go", - "fake_clusterrolebinding.go", - "fake_rbac_client.go", - "fake_role.go", - "fake_rolebinding.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake", - importpath = "k8s.io/client-go/kubernetes/typed/rbac/v1/fake", - deps = [ - "//staging/src/k8s.io/api/rbac/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_clusterrole.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_clusterrole.go index e7696ba27d22..b4950675b3a8 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_clusterrole.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_clusterrole.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" rbacv1 "k8s.io/api/rbac/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + applyconfigurationsrbacv1 "k8s.io/client-go/applyconfigurations/rbac/v1" testing "k8s.io/client-go/testing" ) @@ -120,3 +123,24 @@ func (c *FakeClusterRoles) Patch(ctx context.Context, name string, pt types.Patc } return obj.(*rbacv1.ClusterRole), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied clusterRole. +func (c *FakeClusterRoles) Apply(ctx context.Context, clusterRole *applyconfigurationsrbacv1.ClusterRoleApplyConfiguration, opts v1.ApplyOptions) (result *rbacv1.ClusterRole, err error) { + if clusterRole == nil { + return nil, fmt.Errorf("clusterRole provided to Apply must not be nil") + } + data, err := json.Marshal(clusterRole) + if err != nil { + return nil, err + } + name := clusterRole.Name + if name == nil { + return nil, fmt.Errorf("clusterRole.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(clusterrolesResource, *name, types.ApplyPatchType, data), &rbacv1.ClusterRole{}) + if obj == nil { + return nil, err + } + return obj.(*rbacv1.ClusterRole), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_clusterrolebinding.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_clusterrolebinding.go index e9d19f1e0929..08d30e62dc8d 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_clusterrolebinding.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_clusterrolebinding.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" rbacv1 "k8s.io/api/rbac/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + applyconfigurationsrbacv1 "k8s.io/client-go/applyconfigurations/rbac/v1" testing "k8s.io/client-go/testing" ) @@ -120,3 +123,24 @@ func (c *FakeClusterRoleBindings) Patch(ctx context.Context, name string, pt typ } return obj.(*rbacv1.ClusterRoleBinding), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied clusterRoleBinding. +func (c *FakeClusterRoleBindings) Apply(ctx context.Context, clusterRoleBinding *applyconfigurationsrbacv1.ClusterRoleBindingApplyConfiguration, opts v1.ApplyOptions) (result *rbacv1.ClusterRoleBinding, err error) { + if clusterRoleBinding == nil { + return nil, fmt.Errorf("clusterRoleBinding provided to Apply must not be nil") + } + data, err := json.Marshal(clusterRoleBinding) + if err != nil { + return nil, err + } + name := clusterRoleBinding.Name + if name == nil { + return nil, fmt.Errorf("clusterRoleBinding.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(clusterrolebindingsResource, *name, types.ApplyPatchType, data), &rbacv1.ClusterRoleBinding{}) + if obj == nil { + return nil, err + } + return obj.(*rbacv1.ClusterRoleBinding), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_role.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_role.go index 1bc86d425dfe..ae724c65e82b 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_role.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_role.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" rbacv1 "k8s.io/api/rbac/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + applyconfigurationsrbacv1 "k8s.io/client-go/applyconfigurations/rbac/v1" testing "k8s.io/client-go/testing" ) @@ -128,3 +131,25 @@ func (c *FakeRoles) Patch(ctx context.Context, name string, pt types.PatchType, } return obj.(*rbacv1.Role), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied role. +func (c *FakeRoles) Apply(ctx context.Context, role *applyconfigurationsrbacv1.RoleApplyConfiguration, opts v1.ApplyOptions) (result *rbacv1.Role, err error) { + if role == nil { + return nil, fmt.Errorf("role provided to Apply must not be nil") + } + data, err := json.Marshal(role) + if err != nil { + return nil, err + } + name := role.Name + if name == nil { + return nil, fmt.Errorf("role.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(rolesResource, c.ns, *name, types.ApplyPatchType, data), &rbacv1.Role{}) + + if obj == nil { + return nil, err + } + return obj.(*rbacv1.Role), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_rolebinding.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_rolebinding.go index 4962aa7c8bf9..f47924378a63 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_rolebinding.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_rolebinding.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" rbacv1 "k8s.io/api/rbac/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + applyconfigurationsrbacv1 "k8s.io/client-go/applyconfigurations/rbac/v1" testing "k8s.io/client-go/testing" ) @@ -128,3 +131,25 @@ func (c *FakeRoleBindings) Patch(ctx context.Context, name string, pt types.Patc } return obj.(*rbacv1.RoleBinding), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied roleBinding. +func (c *FakeRoleBindings) Apply(ctx context.Context, roleBinding *applyconfigurationsrbacv1.RoleBindingApplyConfiguration, opts v1.ApplyOptions) (result *rbacv1.RoleBinding, err error) { + if roleBinding == nil { + return nil, fmt.Errorf("roleBinding provided to Apply must not be nil") + } + data, err := json.Marshal(roleBinding) + if err != nil { + return nil, err + } + name := roleBinding.Name + if name == nil { + return nil, fmt.Errorf("roleBinding.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(rolebindingsResource, c.ns, *name, types.ApplyPatchType, data), &rbacv1.RoleBinding{}) + + if obj == nil { + return nil, err + } + return obj.(*rbacv1.RoleBinding), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/role.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/role.go index c31e22b63e81..93810a3ffaad 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/role.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/role.go @@ -20,12 +20,15 @@ package v1 import ( "context" + json "encoding/json" + "fmt" "time" v1 "k8s.io/api/rbac/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + rbacv1 "k8s.io/client-go/applyconfigurations/rbac/v1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type RoleInterface interface { List(ctx context.Context, opts metav1.ListOptions) (*v1.RoleList, error) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.Role, err error) + Apply(ctx context.Context, role *rbacv1.RoleApplyConfiguration, opts metav1.ApplyOptions) (result *v1.Role, err error) RoleExpansion } @@ -176,3 +180,29 @@ func (c *roles) Patch(ctx context.Context, name string, pt types.PatchType, data Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied role. +func (c *roles) Apply(ctx context.Context, role *rbacv1.RoleApplyConfiguration, opts metav1.ApplyOptions) (result *v1.Role, err error) { + if role == nil { + return nil, fmt.Errorf("role provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(role) + if err != nil { + return nil, err + } + name := role.Name + if name == nil { + return nil, fmt.Errorf("role.Name must be provided to Apply") + } + result = &v1.Role{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("roles"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/rolebinding.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/rolebinding.go index 160fc16e6b43..2ace93860490 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/rolebinding.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/rolebinding.go @@ -20,12 +20,15 @@ package v1 import ( "context" + json "encoding/json" + "fmt" "time" v1 "k8s.io/api/rbac/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + rbacv1 "k8s.io/client-go/applyconfigurations/rbac/v1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type RoleBindingInterface interface { List(ctx context.Context, opts metav1.ListOptions) (*v1.RoleBindingList, error) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.RoleBinding, err error) + Apply(ctx context.Context, roleBinding *rbacv1.RoleBindingApplyConfiguration, opts metav1.ApplyOptions) (result *v1.RoleBinding, err error) RoleBindingExpansion } @@ -176,3 +180,29 @@ func (c *roleBindings) Patch(ctx context.Context, name string, pt types.PatchTyp Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied roleBinding. +func (c *roleBindings) Apply(ctx context.Context, roleBinding *rbacv1.RoleBindingApplyConfiguration, opts metav1.ApplyOptions) (result *v1.RoleBinding, err error) { + if roleBinding == nil { + return nil, fmt.Errorf("roleBinding provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(roleBinding) + if err != nil { + return nil, err + } + name := roleBinding.Name + if name == nil { + return nil, fmt.Errorf("roleBinding.Name must be provided to Apply") + } + result = &v1.RoleBinding{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("rolebindings"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/BUILD deleted file mode 100644 index 308053504836..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "clusterrole.go", - "clusterrolebinding.go", - "doc.go", - "generated_expansion.go", - "rbac_client.go", - "role.go", - "rolebinding.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1", - importpath = "k8s.io/client-go/kubernetes/typed/rbac/v1alpha1", - deps = [ - "//staging/src/k8s.io/api/rbac/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/clusterrole.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/clusterrole.go index 678d3711f31f..d6d30e99ef86 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/clusterrole.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/clusterrole.go @@ -20,12 +20,15 @@ package v1alpha1 import ( "context" + json "encoding/json" + "fmt" "time" v1alpha1 "k8s.io/api/rbac/v1alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + rbacv1alpha1 "k8s.io/client-go/applyconfigurations/rbac/v1alpha1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type ClusterRoleInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1alpha1.ClusterRoleList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.ClusterRole, err error) + Apply(ctx context.Context, clusterRole *rbacv1alpha1.ClusterRoleApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.ClusterRole, err error) ClusterRoleExpansion } @@ -166,3 +170,28 @@ func (c *clusterRoles) Patch(ctx context.Context, name string, pt types.PatchTyp Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied clusterRole. +func (c *clusterRoles) Apply(ctx context.Context, clusterRole *rbacv1alpha1.ClusterRoleApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.ClusterRole, err error) { + if clusterRole == nil { + return nil, fmt.Errorf("clusterRole provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(clusterRole) + if err != nil { + return nil, err + } + name := clusterRole.Name + if name == nil { + return nil, fmt.Errorf("clusterRole.Name must be provided to Apply") + } + result = &v1alpha1.ClusterRole{} + err = c.client.Patch(types.ApplyPatchType). + Resource("clusterroles"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/clusterrolebinding.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/clusterrolebinding.go index 7a9ca2953361..2eded92ac2b2 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/clusterrolebinding.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/clusterrolebinding.go @@ -20,12 +20,15 @@ package v1alpha1 import ( "context" + json "encoding/json" + "fmt" "time" v1alpha1 "k8s.io/api/rbac/v1alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + rbacv1alpha1 "k8s.io/client-go/applyconfigurations/rbac/v1alpha1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type ClusterRoleBindingInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1alpha1.ClusterRoleBindingList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.ClusterRoleBinding, err error) + Apply(ctx context.Context, clusterRoleBinding *rbacv1alpha1.ClusterRoleBindingApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.ClusterRoleBinding, err error) ClusterRoleBindingExpansion } @@ -166,3 +170,28 @@ func (c *clusterRoleBindings) Patch(ctx context.Context, name string, pt types.P Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied clusterRoleBinding. +func (c *clusterRoleBindings) Apply(ctx context.Context, clusterRoleBinding *rbacv1alpha1.ClusterRoleBindingApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.ClusterRoleBinding, err error) { + if clusterRoleBinding == nil { + return nil, fmt.Errorf("clusterRoleBinding provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(clusterRoleBinding) + if err != nil { + return nil, err + } + name := clusterRoleBinding.Name + if name == nil { + return nil, fmt.Errorf("clusterRoleBinding.Name must be provided to Apply") + } + result = &v1alpha1.ClusterRoleBinding{} + err = c.client.Patch(types.ApplyPatchType). + Resource("clusterrolebindings"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/BUILD deleted file mode 100644 index f14f4715683a..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_clusterrole.go", - "fake_clusterrolebinding.go", - "fake_rbac_client.go", - "fake_role.go", - "fake_rolebinding.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake", - importpath = "k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake", - deps = [ - "//staging/src/k8s.io/api/rbac/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/fake_clusterrole.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/fake_clusterrole.go index 3bdccbfad6c5..91015097a576 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/fake_clusterrole.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/fake_clusterrole.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1alpha1 "k8s.io/api/rbac/v1alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + rbacv1alpha1 "k8s.io/client-go/applyconfigurations/rbac/v1alpha1" testing "k8s.io/client-go/testing" ) @@ -120,3 +123,24 @@ func (c *FakeClusterRoles) Patch(ctx context.Context, name string, pt types.Patc } return obj.(*v1alpha1.ClusterRole), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied clusterRole. +func (c *FakeClusterRoles) Apply(ctx context.Context, clusterRole *rbacv1alpha1.ClusterRoleApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.ClusterRole, err error) { + if clusterRole == nil { + return nil, fmt.Errorf("clusterRole provided to Apply must not be nil") + } + data, err := json.Marshal(clusterRole) + if err != nil { + return nil, err + } + name := clusterRole.Name + if name == nil { + return nil, fmt.Errorf("clusterRole.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(clusterrolesResource, *name, types.ApplyPatchType, data), &v1alpha1.ClusterRole{}) + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.ClusterRole), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/fake_clusterrolebinding.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/fake_clusterrolebinding.go index 6557f73b0ced..4c7b77215f06 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/fake_clusterrolebinding.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/fake_clusterrolebinding.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1alpha1 "k8s.io/api/rbac/v1alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + rbacv1alpha1 "k8s.io/client-go/applyconfigurations/rbac/v1alpha1" testing "k8s.io/client-go/testing" ) @@ -120,3 +123,24 @@ func (c *FakeClusterRoleBindings) Patch(ctx context.Context, name string, pt typ } return obj.(*v1alpha1.ClusterRoleBinding), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied clusterRoleBinding. +func (c *FakeClusterRoleBindings) Apply(ctx context.Context, clusterRoleBinding *rbacv1alpha1.ClusterRoleBindingApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.ClusterRoleBinding, err error) { + if clusterRoleBinding == nil { + return nil, fmt.Errorf("clusterRoleBinding provided to Apply must not be nil") + } + data, err := json.Marshal(clusterRoleBinding) + if err != nil { + return nil, err + } + name := clusterRoleBinding.Name + if name == nil { + return nil, fmt.Errorf("clusterRoleBinding.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(clusterrolebindingsResource, *name, types.ApplyPatchType, data), &v1alpha1.ClusterRoleBinding{}) + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.ClusterRoleBinding), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/fake_role.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/fake_role.go index 8a7f2fea251a..5e72ab7f1709 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/fake_role.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/fake_role.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1alpha1 "k8s.io/api/rbac/v1alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + rbacv1alpha1 "k8s.io/client-go/applyconfigurations/rbac/v1alpha1" testing "k8s.io/client-go/testing" ) @@ -128,3 +131,25 @@ func (c *FakeRoles) Patch(ctx context.Context, name string, pt types.PatchType, } return obj.(*v1alpha1.Role), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied role. +func (c *FakeRoles) Apply(ctx context.Context, role *rbacv1alpha1.RoleApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.Role, err error) { + if role == nil { + return nil, fmt.Errorf("role provided to Apply must not be nil") + } + data, err := json.Marshal(role) + if err != nil { + return nil, err + } + name := role.Name + if name == nil { + return nil, fmt.Errorf("role.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(rolesResource, c.ns, *name, types.ApplyPatchType, data), &v1alpha1.Role{}) + + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.Role), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/fake_rolebinding.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/fake_rolebinding.go index 744ce0315510..65250f7eb95e 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/fake_rolebinding.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/fake_rolebinding.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1alpha1 "k8s.io/api/rbac/v1alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + rbacv1alpha1 "k8s.io/client-go/applyconfigurations/rbac/v1alpha1" testing "k8s.io/client-go/testing" ) @@ -128,3 +131,25 @@ func (c *FakeRoleBindings) Patch(ctx context.Context, name string, pt types.Patc } return obj.(*v1alpha1.RoleBinding), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied roleBinding. +func (c *FakeRoleBindings) Apply(ctx context.Context, roleBinding *rbacv1alpha1.RoleBindingApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.RoleBinding, err error) { + if roleBinding == nil { + return nil, fmt.Errorf("roleBinding provided to Apply must not be nil") + } + data, err := json.Marshal(roleBinding) + if err != nil { + return nil, err + } + name := roleBinding.Name + if name == nil { + return nil, fmt.Errorf("roleBinding.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(rolebindingsResource, c.ns, *name, types.ApplyPatchType, data), &v1alpha1.RoleBinding{}) + + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.RoleBinding), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/role.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/role.go index 56ec6e373d33..43c16fde74f6 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/role.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/role.go @@ -20,12 +20,15 @@ package v1alpha1 import ( "context" + json "encoding/json" + "fmt" "time" v1alpha1 "k8s.io/api/rbac/v1alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + rbacv1alpha1 "k8s.io/client-go/applyconfigurations/rbac/v1alpha1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type RoleInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1alpha1.RoleList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.Role, err error) + Apply(ctx context.Context, role *rbacv1alpha1.RoleApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.Role, err error) RoleExpansion } @@ -176,3 +180,29 @@ func (c *roles) Patch(ctx context.Context, name string, pt types.PatchType, data Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied role. +func (c *roles) Apply(ctx context.Context, role *rbacv1alpha1.RoleApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.Role, err error) { + if role == nil { + return nil, fmt.Errorf("role provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(role) + if err != nil { + return nil, err + } + name := role.Name + if name == nil { + return nil, fmt.Errorf("role.Name must be provided to Apply") + } + result = &v1alpha1.Role{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("roles"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/rolebinding.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/rolebinding.go index b4b1df5dc3a5..3129c9b4e8a6 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/rolebinding.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/rolebinding.go @@ -20,12 +20,15 @@ package v1alpha1 import ( "context" + json "encoding/json" + "fmt" "time" v1alpha1 "k8s.io/api/rbac/v1alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + rbacv1alpha1 "k8s.io/client-go/applyconfigurations/rbac/v1alpha1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type RoleBindingInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1alpha1.RoleBindingList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.RoleBinding, err error) + Apply(ctx context.Context, roleBinding *rbacv1alpha1.RoleBindingApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.RoleBinding, err error) RoleBindingExpansion } @@ -176,3 +180,29 @@ func (c *roleBindings) Patch(ctx context.Context, name string, pt types.PatchTyp Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied roleBinding. +func (c *roleBindings) Apply(ctx context.Context, roleBinding *rbacv1alpha1.RoleBindingApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.RoleBinding, err error) { + if roleBinding == nil { + return nil, fmt.Errorf("roleBinding provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(roleBinding) + if err != nil { + return nil, err + } + name := roleBinding.Name + if name == nil { + return nil, fmt.Errorf("roleBinding.Name must be provided to Apply") + } + result = &v1alpha1.RoleBinding{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("rolebindings"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/BUILD deleted file mode 100644 index d5be1ae9aa15..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "clusterrole.go", - "clusterrolebinding.go", - "doc.go", - "generated_expansion.go", - "rbac_client.go", - "role.go", - "rolebinding.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1", - importpath = "k8s.io/client-go/kubernetes/typed/rbac/v1beta1", - deps = [ - "//staging/src/k8s.io/api/rbac/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/clusterrole.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/clusterrole.go index 4db46666abfd..a3d67f0315e0 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/clusterrole.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/clusterrole.go @@ -20,12 +20,15 @@ package v1beta1 import ( "context" + json "encoding/json" + "fmt" "time" v1beta1 "k8s.io/api/rbac/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + rbacv1beta1 "k8s.io/client-go/applyconfigurations/rbac/v1beta1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type ClusterRoleInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1beta1.ClusterRoleList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta1.ClusterRole, err error) + Apply(ctx context.Context, clusterRole *rbacv1beta1.ClusterRoleApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.ClusterRole, err error) ClusterRoleExpansion } @@ -166,3 +170,28 @@ func (c *clusterRoles) Patch(ctx context.Context, name string, pt types.PatchTyp Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied clusterRole. +func (c *clusterRoles) Apply(ctx context.Context, clusterRole *rbacv1beta1.ClusterRoleApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.ClusterRole, err error) { + if clusterRole == nil { + return nil, fmt.Errorf("clusterRole provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(clusterRole) + if err != nil { + return nil, err + } + name := clusterRole.Name + if name == nil { + return nil, fmt.Errorf("clusterRole.Name must be provided to Apply") + } + result = &v1beta1.ClusterRole{} + err = c.client.Patch(types.ApplyPatchType). + Resource("clusterroles"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/clusterrolebinding.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/clusterrolebinding.go index f45777c232cf..ae39cbb9ae6a 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/clusterrolebinding.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/clusterrolebinding.go @@ -20,12 +20,15 @@ package v1beta1 import ( "context" + json "encoding/json" + "fmt" "time" v1beta1 "k8s.io/api/rbac/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + rbacv1beta1 "k8s.io/client-go/applyconfigurations/rbac/v1beta1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type ClusterRoleBindingInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1beta1.ClusterRoleBindingList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta1.ClusterRoleBinding, err error) + Apply(ctx context.Context, clusterRoleBinding *rbacv1beta1.ClusterRoleBindingApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.ClusterRoleBinding, err error) ClusterRoleBindingExpansion } @@ -166,3 +170,28 @@ func (c *clusterRoleBindings) Patch(ctx context.Context, name string, pt types.P Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied clusterRoleBinding. +func (c *clusterRoleBindings) Apply(ctx context.Context, clusterRoleBinding *rbacv1beta1.ClusterRoleBindingApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.ClusterRoleBinding, err error) { + if clusterRoleBinding == nil { + return nil, fmt.Errorf("clusterRoleBinding provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(clusterRoleBinding) + if err != nil { + return nil, err + } + name := clusterRoleBinding.Name + if name == nil { + return nil, fmt.Errorf("clusterRoleBinding.Name must be provided to Apply") + } + result = &v1beta1.ClusterRoleBinding{} + err = c.client.Patch(types.ApplyPatchType). + Resource("clusterrolebindings"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/BUILD deleted file mode 100644 index 4db34fbe41f0..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_clusterrole.go", - "fake_clusterrolebinding.go", - "fake_rbac_client.go", - "fake_role.go", - "fake_rolebinding.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake", - importpath = "k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake", - deps = [ - "//staging/src/k8s.io/api/rbac/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/fake_clusterrole.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/fake_clusterrole.go index 38fdc83f8ba4..e8a2ad3527b7 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/fake_clusterrole.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/fake_clusterrole.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1beta1 "k8s.io/api/rbac/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + rbacv1beta1 "k8s.io/client-go/applyconfigurations/rbac/v1beta1" testing "k8s.io/client-go/testing" ) @@ -120,3 +123,24 @@ func (c *FakeClusterRoles) Patch(ctx context.Context, name string, pt types.Patc } return obj.(*v1beta1.ClusterRole), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied clusterRole. +func (c *FakeClusterRoles) Apply(ctx context.Context, clusterRole *rbacv1beta1.ClusterRoleApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.ClusterRole, err error) { + if clusterRole == nil { + return nil, fmt.Errorf("clusterRole provided to Apply must not be nil") + } + data, err := json.Marshal(clusterRole) + if err != nil { + return nil, err + } + name := clusterRole.Name + if name == nil { + return nil, fmt.Errorf("clusterRole.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(clusterrolesResource, *name, types.ApplyPatchType, data), &v1beta1.ClusterRole{}) + if obj == nil { + return nil, err + } + return obj.(*v1beta1.ClusterRole), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/fake_clusterrolebinding.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/fake_clusterrolebinding.go index a47c011b5b4f..6695b1c4e241 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/fake_clusterrolebinding.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/fake_clusterrolebinding.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1beta1 "k8s.io/api/rbac/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + rbacv1beta1 "k8s.io/client-go/applyconfigurations/rbac/v1beta1" testing "k8s.io/client-go/testing" ) @@ -120,3 +123,24 @@ func (c *FakeClusterRoleBindings) Patch(ctx context.Context, name string, pt typ } return obj.(*v1beta1.ClusterRoleBinding), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied clusterRoleBinding. +func (c *FakeClusterRoleBindings) Apply(ctx context.Context, clusterRoleBinding *rbacv1beta1.ClusterRoleBindingApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.ClusterRoleBinding, err error) { + if clusterRoleBinding == nil { + return nil, fmt.Errorf("clusterRoleBinding provided to Apply must not be nil") + } + data, err := json.Marshal(clusterRoleBinding) + if err != nil { + return nil, err + } + name := clusterRoleBinding.Name + if name == nil { + return nil, fmt.Errorf("clusterRoleBinding.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(clusterrolebindingsResource, *name, types.ApplyPatchType, data), &v1beta1.ClusterRoleBinding{}) + if obj == nil { + return nil, err + } + return obj.(*v1beta1.ClusterRoleBinding), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/fake_role.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/fake_role.go index dad8915d0793..b73fc56c2a1f 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/fake_role.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/fake_role.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1beta1 "k8s.io/api/rbac/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + rbacv1beta1 "k8s.io/client-go/applyconfigurations/rbac/v1beta1" testing "k8s.io/client-go/testing" ) @@ -128,3 +131,25 @@ func (c *FakeRoles) Patch(ctx context.Context, name string, pt types.PatchType, } return obj.(*v1beta1.Role), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied role. +func (c *FakeRoles) Apply(ctx context.Context, role *rbacv1beta1.RoleApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.Role, err error) { + if role == nil { + return nil, fmt.Errorf("role provided to Apply must not be nil") + } + data, err := json.Marshal(role) + if err != nil { + return nil, err + } + name := role.Name + if name == nil { + return nil, fmt.Errorf("role.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(rolesResource, c.ns, *name, types.ApplyPatchType, data), &v1beta1.Role{}) + + if obj == nil { + return nil, err + } + return obj.(*v1beta1.Role), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/fake_rolebinding.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/fake_rolebinding.go index 1d7456b18bd1..2e3f6ab7f76a 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/fake_rolebinding.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/fake_rolebinding.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1beta1 "k8s.io/api/rbac/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + rbacv1beta1 "k8s.io/client-go/applyconfigurations/rbac/v1beta1" testing "k8s.io/client-go/testing" ) @@ -128,3 +131,25 @@ func (c *FakeRoleBindings) Patch(ctx context.Context, name string, pt types.Patc } return obj.(*v1beta1.RoleBinding), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied roleBinding. +func (c *FakeRoleBindings) Apply(ctx context.Context, roleBinding *rbacv1beta1.RoleBindingApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.RoleBinding, err error) { + if roleBinding == nil { + return nil, fmt.Errorf("roleBinding provided to Apply must not be nil") + } + data, err := json.Marshal(roleBinding) + if err != nil { + return nil, err + } + name := roleBinding.Name + if name == nil { + return nil, fmt.Errorf("roleBinding.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(rolebindingsResource, c.ns, *name, types.ApplyPatchType, data), &v1beta1.RoleBinding{}) + + if obj == nil { + return nil, err + } + return obj.(*v1beta1.RoleBinding), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/role.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/role.go index c172e7f671d0..e789e42fe76a 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/role.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/role.go @@ -20,12 +20,15 @@ package v1beta1 import ( "context" + json "encoding/json" + "fmt" "time" v1beta1 "k8s.io/api/rbac/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + rbacv1beta1 "k8s.io/client-go/applyconfigurations/rbac/v1beta1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type RoleInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1beta1.RoleList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta1.Role, err error) + Apply(ctx context.Context, role *rbacv1beta1.RoleApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.Role, err error) RoleExpansion } @@ -176,3 +180,29 @@ func (c *roles) Patch(ctx context.Context, name string, pt types.PatchType, data Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied role. +func (c *roles) Apply(ctx context.Context, role *rbacv1beta1.RoleApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.Role, err error) { + if role == nil { + return nil, fmt.Errorf("role provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(role) + if err != nil { + return nil, err + } + name := role.Name + if name == nil { + return nil, fmt.Errorf("role.Name must be provided to Apply") + } + result = &v1beta1.Role{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("roles"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/rolebinding.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/rolebinding.go index f37bfb744139..1461ba3b6ebb 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/rolebinding.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/rolebinding.go @@ -20,12 +20,15 @@ package v1beta1 import ( "context" + json "encoding/json" + "fmt" "time" v1beta1 "k8s.io/api/rbac/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + rbacv1beta1 "k8s.io/client-go/applyconfigurations/rbac/v1beta1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type RoleBindingInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1beta1.RoleBindingList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta1.RoleBinding, err error) + Apply(ctx context.Context, roleBinding *rbacv1beta1.RoleBindingApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.RoleBinding, err error) RoleBindingExpansion } @@ -176,3 +180,29 @@ func (c *roleBindings) Patch(ctx context.Context, name string, pt types.PatchTyp Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied roleBinding. +func (c *roleBindings) Apply(ctx context.Context, roleBinding *rbacv1beta1.RoleBindingApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.RoleBinding, err error) { + if roleBinding == nil { + return nil, fmt.Errorf("roleBinding provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(roleBinding) + if err != nil { + return nil, err + } + name := roleBinding.Name + if name == nil { + return nil, fmt.Errorf("roleBinding.Name must be provided to Apply") + } + result = &v1beta1.RoleBinding{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("rolebindings"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1/BUILD deleted file mode 100644 index dac986fe70ad..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated_expansion.go", - "priorityclass.go", - "scheduling_client.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1", - importpath = "k8s.io/client-go/kubernetes/typed/scheduling/v1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/scheduling/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/scheduling/v1/fake:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1/fake/BUILD deleted file mode 100644 index 098586f227c8..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1/fake/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_priorityclass.go", - "fake_scheduling_client.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1/fake", - importpath = "k8s.io/client-go/kubernetes/typed/scheduling/v1/fake", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/scheduling/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/scheduling/v1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1/fake/fake_priorityclass.go b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1/fake/fake_priorityclass.go index df095d87d134..bc1819c27ab1 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1/fake/fake_priorityclass.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1/fake/fake_priorityclass.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" schedulingv1 "k8s.io/api/scheduling/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + applyconfigurationsschedulingv1 "k8s.io/client-go/applyconfigurations/scheduling/v1" testing "k8s.io/client-go/testing" ) @@ -120,3 +123,24 @@ func (c *FakePriorityClasses) Patch(ctx context.Context, name string, pt types.P } return obj.(*schedulingv1.PriorityClass), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied priorityClass. +func (c *FakePriorityClasses) Apply(ctx context.Context, priorityClass *applyconfigurationsschedulingv1.PriorityClassApplyConfiguration, opts v1.ApplyOptions) (result *schedulingv1.PriorityClass, err error) { + if priorityClass == nil { + return nil, fmt.Errorf("priorityClass provided to Apply must not be nil") + } + data, err := json.Marshal(priorityClass) + if err != nil { + return nil, err + } + name := priorityClass.Name + if name == nil { + return nil, fmt.Errorf("priorityClass.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(priorityclassesResource, *name, types.ApplyPatchType, data), &schedulingv1.PriorityClass{}) + if obj == nil { + return nil, err + } + return obj.(*schedulingv1.PriorityClass), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1/priorityclass.go b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1/priorityclass.go index 06185d5fb6d1..c68ec5da414d 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1/priorityclass.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1/priorityclass.go @@ -20,12 +20,15 @@ package v1 import ( "context" + json "encoding/json" + "fmt" "time" v1 "k8s.io/api/scheduling/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + schedulingv1 "k8s.io/client-go/applyconfigurations/scheduling/v1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type PriorityClassInterface interface { List(ctx context.Context, opts metav1.ListOptions) (*v1.PriorityClassList, error) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.PriorityClass, err error) + Apply(ctx context.Context, priorityClass *schedulingv1.PriorityClassApplyConfiguration, opts metav1.ApplyOptions) (result *v1.PriorityClass, err error) PriorityClassExpansion } @@ -166,3 +170,28 @@ func (c *priorityClasses) Patch(ctx context.Context, name string, pt types.Patch Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied priorityClass. +func (c *priorityClasses) Apply(ctx context.Context, priorityClass *schedulingv1.PriorityClassApplyConfiguration, opts metav1.ApplyOptions) (result *v1.PriorityClass, err error) { + if priorityClass == nil { + return nil, fmt.Errorf("priorityClass provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(priorityClass) + if err != nil { + return nil, err + } + name := priorityClass.Name + if name == nil { + return nil, fmt.Errorf("priorityClass.Name must be provided to Apply") + } + result = &v1.PriorityClass{} + err = c.client.Patch(types.ApplyPatchType). + Resource("priorityclasses"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/BUILD deleted file mode 100644 index 4afd1e62d7f0..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated_expansion.go", - "priorityclass.go", - "scheduling_client.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1", - importpath = "k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1", - deps = [ - "//staging/src/k8s.io/api/scheduling/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/fake/BUILD deleted file mode 100644 index 4d5ff71cd902..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/fake/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_priorityclass.go", - "fake_scheduling_client.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/fake", - importpath = "k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/fake", - deps = [ - "//staging/src/k8s.io/api/scheduling/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/fake/fake_priorityclass.go b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/fake/fake_priorityclass.go index 0f246c032d7a..c8090f06c50b 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/fake/fake_priorityclass.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/fake/fake_priorityclass.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1alpha1 "k8s.io/api/scheduling/v1alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + schedulingv1alpha1 "k8s.io/client-go/applyconfigurations/scheduling/v1alpha1" testing "k8s.io/client-go/testing" ) @@ -120,3 +123,24 @@ func (c *FakePriorityClasses) Patch(ctx context.Context, name string, pt types.P } return obj.(*v1alpha1.PriorityClass), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied priorityClass. +func (c *FakePriorityClasses) Apply(ctx context.Context, priorityClass *schedulingv1alpha1.PriorityClassApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.PriorityClass, err error) { + if priorityClass == nil { + return nil, fmt.Errorf("priorityClass provided to Apply must not be nil") + } + data, err := json.Marshal(priorityClass) + if err != nil { + return nil, err + } + name := priorityClass.Name + if name == nil { + return nil, fmt.Errorf("priorityClass.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(priorityclassesResource, *name, types.ApplyPatchType, data), &v1alpha1.PriorityClass{}) + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.PriorityClass), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/priorityclass.go b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/priorityclass.go index ae9875e9a085..a9b8c19c78a0 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/priorityclass.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/priorityclass.go @@ -20,12 +20,15 @@ package v1alpha1 import ( "context" + json "encoding/json" + "fmt" "time" v1alpha1 "k8s.io/api/scheduling/v1alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + schedulingv1alpha1 "k8s.io/client-go/applyconfigurations/scheduling/v1alpha1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type PriorityClassInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1alpha1.PriorityClassList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.PriorityClass, err error) + Apply(ctx context.Context, priorityClass *schedulingv1alpha1.PriorityClassApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.PriorityClass, err error) PriorityClassExpansion } @@ -166,3 +170,28 @@ func (c *priorityClasses) Patch(ctx context.Context, name string, pt types.Patch Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied priorityClass. +func (c *priorityClasses) Apply(ctx context.Context, priorityClass *schedulingv1alpha1.PriorityClassApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.PriorityClass, err error) { + if priorityClass == nil { + return nil, fmt.Errorf("priorityClass provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(priorityClass) + if err != nil { + return nil, err + } + name := priorityClass.Name + if name == nil { + return nil, fmt.Errorf("priorityClass.Name must be provided to Apply") + } + result = &v1alpha1.PriorityClass{} + err = c.client.Patch(types.ApplyPatchType). + Resource("priorityclasses"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/BUILD deleted file mode 100644 index ec0a8a2ef002..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated_expansion.go", - "priorityclass.go", - "scheduling_client.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1", - importpath = "k8s.io/client-go/kubernetes/typed/scheduling/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/scheduling/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/fake:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/fake/BUILD deleted file mode 100644 index c1a1468d5988..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/fake/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_priorityclass.go", - "fake_scheduling_client.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/fake", - importpath = "k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/fake", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/scheduling/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/fake/fake_priorityclass.go b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/fake/fake_priorityclass.go index 256590177c39..ae415da0fd96 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/fake/fake_priorityclass.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/fake/fake_priorityclass.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1beta1 "k8s.io/api/scheduling/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + schedulingv1beta1 "k8s.io/client-go/applyconfigurations/scheduling/v1beta1" testing "k8s.io/client-go/testing" ) @@ -120,3 +123,24 @@ func (c *FakePriorityClasses) Patch(ctx context.Context, name string, pt types.P } return obj.(*v1beta1.PriorityClass), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied priorityClass. +func (c *FakePriorityClasses) Apply(ctx context.Context, priorityClass *schedulingv1beta1.PriorityClassApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.PriorityClass, err error) { + if priorityClass == nil { + return nil, fmt.Errorf("priorityClass provided to Apply must not be nil") + } + data, err := json.Marshal(priorityClass) + if err != nil { + return nil, err + } + name := priorityClass.Name + if name == nil { + return nil, fmt.Errorf("priorityClass.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(priorityclassesResource, *name, types.ApplyPatchType, data), &v1beta1.PriorityClass{}) + if obj == nil { + return nil, err + } + return obj.(*v1beta1.PriorityClass), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/priorityclass.go b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/priorityclass.go index 70ed597bb413..155476e4c727 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/priorityclass.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/priorityclass.go @@ -20,12 +20,15 @@ package v1beta1 import ( "context" + json "encoding/json" + "fmt" "time" v1beta1 "k8s.io/api/scheduling/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + schedulingv1beta1 "k8s.io/client-go/applyconfigurations/scheduling/v1beta1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type PriorityClassInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1beta1.PriorityClassList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta1.PriorityClass, err error) + Apply(ctx context.Context, priorityClass *schedulingv1beta1.PriorityClassApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.PriorityClass, err error) PriorityClassExpansion } @@ -166,3 +170,28 @@ func (c *priorityClasses) Patch(ctx context.Context, name string, pt types.Patch Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied priorityClass. +func (c *priorityClasses) Apply(ctx context.Context, priorityClass *schedulingv1beta1.PriorityClassApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.PriorityClass, err error) { + if priorityClass == nil { + return nil, fmt.Errorf("priorityClass provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(priorityClass) + if err != nil { + return nil, err + } + name := priorityClass.Name + if name == nil { + return nil, fmt.Errorf("priorityClass.Name must be provided to Apply") + } + result = &v1beta1.PriorityClass{} + err = c.client.Patch(types.ApplyPatchType). + Resource("priorityclasses"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/BUILD deleted file mode 100644 index a00619389139..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "csidriver.go", - "csinode.go", - "doc.go", - "generated_expansion.go", - "storage_client.go", - "storageclass.go", - "volumeattachment.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/storage/v1", - importpath = "k8s.io/client-go/kubernetes/typed/storage/v1", - deps = [ - "//staging/src/k8s.io/api/storage/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/storage/v1/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/csidriver.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/csidriver.go index 92e82251d5d0..d9dc4151e218 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/csidriver.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/csidriver.go @@ -20,12 +20,15 @@ package v1 import ( "context" + json "encoding/json" + "fmt" "time" v1 "k8s.io/api/storage/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + storagev1 "k8s.io/client-go/applyconfigurations/storage/v1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type CSIDriverInterface interface { List(ctx context.Context, opts metav1.ListOptions) (*v1.CSIDriverList, error) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.CSIDriver, err error) + Apply(ctx context.Context, cSIDriver *storagev1.CSIDriverApplyConfiguration, opts metav1.ApplyOptions) (result *v1.CSIDriver, err error) CSIDriverExpansion } @@ -166,3 +170,28 @@ func (c *cSIDrivers) Patch(ctx context.Context, name string, pt types.PatchType, Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied cSIDriver. +func (c *cSIDrivers) Apply(ctx context.Context, cSIDriver *storagev1.CSIDriverApplyConfiguration, opts metav1.ApplyOptions) (result *v1.CSIDriver, err error) { + if cSIDriver == nil { + return nil, fmt.Errorf("cSIDriver provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(cSIDriver) + if err != nil { + return nil, err + } + name := cSIDriver.Name + if name == nil { + return nil, fmt.Errorf("cSIDriver.Name must be provided to Apply") + } + result = &v1.CSIDriver{} + err = c.client.Patch(types.ApplyPatchType). + Resource("csidrivers"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/csinode.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/csinode.go index f8ba2454475d..17dbc8c1c8f2 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/csinode.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/csinode.go @@ -20,12 +20,15 @@ package v1 import ( "context" + json "encoding/json" + "fmt" "time" v1 "k8s.io/api/storage/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + storagev1 "k8s.io/client-go/applyconfigurations/storage/v1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type CSINodeInterface interface { List(ctx context.Context, opts metav1.ListOptions) (*v1.CSINodeList, error) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.CSINode, err error) + Apply(ctx context.Context, cSINode *storagev1.CSINodeApplyConfiguration, opts metav1.ApplyOptions) (result *v1.CSINode, err error) CSINodeExpansion } @@ -166,3 +170,28 @@ func (c *cSINodes) Patch(ctx context.Context, name string, pt types.PatchType, d Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied cSINode. +func (c *cSINodes) Apply(ctx context.Context, cSINode *storagev1.CSINodeApplyConfiguration, opts metav1.ApplyOptions) (result *v1.CSINode, err error) { + if cSINode == nil { + return nil, fmt.Errorf("cSINode provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(cSINode) + if err != nil { + return nil, err + } + name := cSINode.Name + if name == nil { + return nil, fmt.Errorf("cSINode.Name must be provided to Apply") + } + result = &v1.CSINode{} + err = c.client.Patch(types.ApplyPatchType). + Resource("csinodes"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/fake/BUILD deleted file mode 100644 index 65b14290dd10..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/fake/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_csidriver.go", - "fake_csinode.go", - "fake_storage_client.go", - "fake_storageclass.go", - "fake_volumeattachment.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/fake", - importpath = "k8s.io/client-go/kubernetes/typed/storage/v1/fake", - deps = [ - "//staging/src/k8s.io/api/storage/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/storage/v1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/fake/fake_csidriver.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/fake/fake_csidriver.go index d3b682c6392a..b001aaa94d90 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/fake/fake_csidriver.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/fake/fake_csidriver.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" storagev1 "k8s.io/api/storage/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + applyconfigurationsstoragev1 "k8s.io/client-go/applyconfigurations/storage/v1" testing "k8s.io/client-go/testing" ) @@ -120,3 +123,24 @@ func (c *FakeCSIDrivers) Patch(ctx context.Context, name string, pt types.PatchT } return obj.(*storagev1.CSIDriver), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied cSIDriver. +func (c *FakeCSIDrivers) Apply(ctx context.Context, cSIDriver *applyconfigurationsstoragev1.CSIDriverApplyConfiguration, opts v1.ApplyOptions) (result *storagev1.CSIDriver, err error) { + if cSIDriver == nil { + return nil, fmt.Errorf("cSIDriver provided to Apply must not be nil") + } + data, err := json.Marshal(cSIDriver) + if err != nil { + return nil, err + } + name := cSIDriver.Name + if name == nil { + return nil, fmt.Errorf("cSIDriver.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(csidriversResource, *name, types.ApplyPatchType, data), &storagev1.CSIDriver{}) + if obj == nil { + return nil, err + } + return obj.(*storagev1.CSIDriver), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/fake/fake_csinode.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/fake/fake_csinode.go index 46662d20a364..7089d5362c85 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/fake/fake_csinode.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/fake/fake_csinode.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" storagev1 "k8s.io/api/storage/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + applyconfigurationsstoragev1 "k8s.io/client-go/applyconfigurations/storage/v1" testing "k8s.io/client-go/testing" ) @@ -120,3 +123,24 @@ func (c *FakeCSINodes) Patch(ctx context.Context, name string, pt types.PatchTyp } return obj.(*storagev1.CSINode), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied cSINode. +func (c *FakeCSINodes) Apply(ctx context.Context, cSINode *applyconfigurationsstoragev1.CSINodeApplyConfiguration, opts v1.ApplyOptions) (result *storagev1.CSINode, err error) { + if cSINode == nil { + return nil, fmt.Errorf("cSINode provided to Apply must not be nil") + } + data, err := json.Marshal(cSINode) + if err != nil { + return nil, err + } + name := cSINode.Name + if name == nil { + return nil, fmt.Errorf("cSINode.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(csinodesResource, *name, types.ApplyPatchType, data), &storagev1.CSINode{}) + if obj == nil { + return nil, err + } + return obj.(*storagev1.CSINode), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/fake/fake_storageclass.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/fake/fake_storageclass.go index dbd38c765377..4b175356bb84 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/fake/fake_storageclass.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/fake/fake_storageclass.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" storagev1 "k8s.io/api/storage/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + applyconfigurationsstoragev1 "k8s.io/client-go/applyconfigurations/storage/v1" testing "k8s.io/client-go/testing" ) @@ -120,3 +123,24 @@ func (c *FakeStorageClasses) Patch(ctx context.Context, name string, pt types.Pa } return obj.(*storagev1.StorageClass), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied storageClass. +func (c *FakeStorageClasses) Apply(ctx context.Context, storageClass *applyconfigurationsstoragev1.StorageClassApplyConfiguration, opts v1.ApplyOptions) (result *storagev1.StorageClass, err error) { + if storageClass == nil { + return nil, fmt.Errorf("storageClass provided to Apply must not be nil") + } + data, err := json.Marshal(storageClass) + if err != nil { + return nil, err + } + name := storageClass.Name + if name == nil { + return nil, fmt.Errorf("storageClass.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(storageclassesResource, *name, types.ApplyPatchType, data), &storagev1.StorageClass{}) + if obj == nil { + return nil, err + } + return obj.(*storagev1.StorageClass), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/fake/fake_volumeattachment.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/fake/fake_volumeattachment.go index 72a3238f972c..63f53fd524ca 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/fake/fake_volumeattachment.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/fake/fake_volumeattachment.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" storagev1 "k8s.io/api/storage/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + applyconfigurationsstoragev1 "k8s.io/client-go/applyconfigurations/storage/v1" testing "k8s.io/client-go/testing" ) @@ -131,3 +134,46 @@ func (c *FakeVolumeAttachments) Patch(ctx context.Context, name string, pt types } return obj.(*storagev1.VolumeAttachment), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied volumeAttachment. +func (c *FakeVolumeAttachments) Apply(ctx context.Context, volumeAttachment *applyconfigurationsstoragev1.VolumeAttachmentApplyConfiguration, opts v1.ApplyOptions) (result *storagev1.VolumeAttachment, err error) { + if volumeAttachment == nil { + return nil, fmt.Errorf("volumeAttachment provided to Apply must not be nil") + } + data, err := json.Marshal(volumeAttachment) + if err != nil { + return nil, err + } + name := volumeAttachment.Name + if name == nil { + return nil, fmt.Errorf("volumeAttachment.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(volumeattachmentsResource, *name, types.ApplyPatchType, data), &storagev1.VolumeAttachment{}) + if obj == nil { + return nil, err + } + return obj.(*storagev1.VolumeAttachment), err +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *FakeVolumeAttachments) ApplyStatus(ctx context.Context, volumeAttachment *applyconfigurationsstoragev1.VolumeAttachmentApplyConfiguration, opts v1.ApplyOptions) (result *storagev1.VolumeAttachment, err error) { + if volumeAttachment == nil { + return nil, fmt.Errorf("volumeAttachment provided to Apply must not be nil") + } + data, err := json.Marshal(volumeAttachment) + if err != nil { + return nil, err + } + name := volumeAttachment.Name + if name == nil { + return nil, fmt.Errorf("volumeAttachment.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(volumeattachmentsResource, *name, types.ApplyPatchType, data, "status"), &storagev1.VolumeAttachment{}) + if obj == nil { + return nil, err + } + return obj.(*storagev1.VolumeAttachment), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/storageclass.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/storageclass.go index 046ec3a1b979..8e97d90a0f33 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/storageclass.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/storageclass.go @@ -20,12 +20,15 @@ package v1 import ( "context" + json "encoding/json" + "fmt" "time" v1 "k8s.io/api/storage/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + storagev1 "k8s.io/client-go/applyconfigurations/storage/v1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type StorageClassInterface interface { List(ctx context.Context, opts metav1.ListOptions) (*v1.StorageClassList, error) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.StorageClass, err error) + Apply(ctx context.Context, storageClass *storagev1.StorageClassApplyConfiguration, opts metav1.ApplyOptions) (result *v1.StorageClass, err error) StorageClassExpansion } @@ -166,3 +170,28 @@ func (c *storageClasses) Patch(ctx context.Context, name string, pt types.PatchT Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied storageClass. +func (c *storageClasses) Apply(ctx context.Context, storageClass *storagev1.StorageClassApplyConfiguration, opts metav1.ApplyOptions) (result *v1.StorageClass, err error) { + if storageClass == nil { + return nil, fmt.Errorf("storageClass provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(storageClass) + if err != nil { + return nil, err + } + name := storageClass.Name + if name == nil { + return nil, fmt.Errorf("storageClass.Name must be provided to Apply") + } + result = &v1.StorageClass{} + err = c.client.Patch(types.ApplyPatchType). + Resource("storageclasses"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/volumeattachment.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/volumeattachment.go index e4162975fc26..c1dbec84f478 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/volumeattachment.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/volumeattachment.go @@ -20,12 +20,15 @@ package v1 import ( "context" + json "encoding/json" + "fmt" "time" v1 "k8s.io/api/storage/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + storagev1 "k8s.io/client-go/applyconfigurations/storage/v1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -47,6 +50,8 @@ type VolumeAttachmentInterface interface { List(ctx context.Context, opts metav1.ListOptions) (*v1.VolumeAttachmentList, error) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.VolumeAttachment, err error) + Apply(ctx context.Context, volumeAttachment *storagev1.VolumeAttachmentApplyConfiguration, opts metav1.ApplyOptions) (result *v1.VolumeAttachment, err error) + ApplyStatus(ctx context.Context, volumeAttachment *storagev1.VolumeAttachmentApplyConfiguration, opts metav1.ApplyOptions) (result *v1.VolumeAttachment, err error) VolumeAttachmentExpansion } @@ -182,3 +187,57 @@ func (c *volumeAttachments) Patch(ctx context.Context, name string, pt types.Pat Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied volumeAttachment. +func (c *volumeAttachments) Apply(ctx context.Context, volumeAttachment *storagev1.VolumeAttachmentApplyConfiguration, opts metav1.ApplyOptions) (result *v1.VolumeAttachment, err error) { + if volumeAttachment == nil { + return nil, fmt.Errorf("volumeAttachment provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(volumeAttachment) + if err != nil { + return nil, err + } + name := volumeAttachment.Name + if name == nil { + return nil, fmt.Errorf("volumeAttachment.Name must be provided to Apply") + } + result = &v1.VolumeAttachment{} + err = c.client.Patch(types.ApplyPatchType). + Resource("volumeattachments"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *volumeAttachments) ApplyStatus(ctx context.Context, volumeAttachment *storagev1.VolumeAttachmentApplyConfiguration, opts metav1.ApplyOptions) (result *v1.VolumeAttachment, err error) { + if volumeAttachment == nil { + return nil, fmt.Errorf("volumeAttachment provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(volumeAttachment) + if err != nil { + return nil, err + } + + name := volumeAttachment.Name + if name == nil { + return nil, fmt.Errorf("volumeAttachment.Name must be provided to Apply") + } + + result = &v1.VolumeAttachment{} + err = c.client.Patch(types.ApplyPatchType). + Resource("volumeattachments"). + Name(*name). + SubResource("status"). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/BUILD deleted file mode 100644 index 2aff465ad474..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "csistoragecapacity.go", - "doc.go", - "generated_expansion.go", - "storage_client.go", - "volumeattachment.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1", - importpath = "k8s.io/client-go/kubernetes/typed/storage/v1alpha1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/storage/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/fake:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/csistoragecapacity.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/csistoragecapacity.go index 876348112ab2..bf5d64dddcb2 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/csistoragecapacity.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/csistoragecapacity.go @@ -20,12 +20,15 @@ package v1alpha1 import ( "context" + json "encoding/json" + "fmt" "time" v1alpha1 "k8s.io/api/storage/v1alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + storagev1alpha1 "k8s.io/client-go/applyconfigurations/storage/v1alpha1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type CSIStorageCapacityInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1alpha1.CSIStorageCapacityList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.CSIStorageCapacity, err error) + Apply(ctx context.Context, cSIStorageCapacity *storagev1alpha1.CSIStorageCapacityApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.CSIStorageCapacity, err error) CSIStorageCapacityExpansion } @@ -176,3 +180,29 @@ func (c *cSIStorageCapacities) Patch(ctx context.Context, name string, pt types. Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied cSIStorageCapacity. +func (c *cSIStorageCapacities) Apply(ctx context.Context, cSIStorageCapacity *storagev1alpha1.CSIStorageCapacityApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.CSIStorageCapacity, err error) { + if cSIStorageCapacity == nil { + return nil, fmt.Errorf("cSIStorageCapacity provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(cSIStorageCapacity) + if err != nil { + return nil, err + } + name := cSIStorageCapacity.Name + if name == nil { + return nil, fmt.Errorf("cSIStorageCapacity.Name must be provided to Apply") + } + result = &v1alpha1.CSIStorageCapacity{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("csistoragecapacities"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/fake/BUILD deleted file mode 100644 index d32458e1b621..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/fake/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_csistoragecapacity.go", - "fake_storage_client.go", - "fake_volumeattachment.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/fake", - importpath = "k8s.io/client-go/kubernetes/typed/storage/v1alpha1/fake", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/storage/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/storage/v1alpha1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/fake/fake_csistoragecapacity.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/fake/fake_csistoragecapacity.go index 5bca3e209cb9..004f5844935b 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/fake/fake_csistoragecapacity.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/fake/fake_csistoragecapacity.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1alpha1 "k8s.io/api/storage/v1alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + storagev1alpha1 "k8s.io/client-go/applyconfigurations/storage/v1alpha1" testing "k8s.io/client-go/testing" ) @@ -128,3 +131,25 @@ func (c *FakeCSIStorageCapacities) Patch(ctx context.Context, name string, pt ty } return obj.(*v1alpha1.CSIStorageCapacity), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied cSIStorageCapacity. +func (c *FakeCSIStorageCapacities) Apply(ctx context.Context, cSIStorageCapacity *storagev1alpha1.CSIStorageCapacityApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.CSIStorageCapacity, err error) { + if cSIStorageCapacity == nil { + return nil, fmt.Errorf("cSIStorageCapacity provided to Apply must not be nil") + } + data, err := json.Marshal(cSIStorageCapacity) + if err != nil { + return nil, err + } + name := cSIStorageCapacity.Name + if name == nil { + return nil, fmt.Errorf("cSIStorageCapacity.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(csistoragecapacitiesResource, c.ns, *name, types.ApplyPatchType, data), &v1alpha1.CSIStorageCapacity{}) + + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.CSIStorageCapacity), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/fake/fake_volumeattachment.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/fake/fake_volumeattachment.go index a3140e72178e..a9a8d76fb0df 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/fake/fake_volumeattachment.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/fake/fake_volumeattachment.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1alpha1 "k8s.io/api/storage/v1alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + storagev1alpha1 "k8s.io/client-go/applyconfigurations/storage/v1alpha1" testing "k8s.io/client-go/testing" ) @@ -131,3 +134,46 @@ func (c *FakeVolumeAttachments) Patch(ctx context.Context, name string, pt types } return obj.(*v1alpha1.VolumeAttachment), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied volumeAttachment. +func (c *FakeVolumeAttachments) Apply(ctx context.Context, volumeAttachment *storagev1alpha1.VolumeAttachmentApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.VolumeAttachment, err error) { + if volumeAttachment == nil { + return nil, fmt.Errorf("volumeAttachment provided to Apply must not be nil") + } + data, err := json.Marshal(volumeAttachment) + if err != nil { + return nil, err + } + name := volumeAttachment.Name + if name == nil { + return nil, fmt.Errorf("volumeAttachment.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(volumeattachmentsResource, *name, types.ApplyPatchType, data), &v1alpha1.VolumeAttachment{}) + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.VolumeAttachment), err +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *FakeVolumeAttachments) ApplyStatus(ctx context.Context, volumeAttachment *storagev1alpha1.VolumeAttachmentApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.VolumeAttachment, err error) { + if volumeAttachment == nil { + return nil, fmt.Errorf("volumeAttachment provided to Apply must not be nil") + } + data, err := json.Marshal(volumeAttachment) + if err != nil { + return nil, err + } + name := volumeAttachment.Name + if name == nil { + return nil, fmt.Errorf("volumeAttachment.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(volumeattachmentsResource, *name, types.ApplyPatchType, data, "status"), &v1alpha1.VolumeAttachment{}) + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.VolumeAttachment), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/volumeattachment.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/volumeattachment.go index 9012fde99d08..58abb748f9e4 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/volumeattachment.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/volumeattachment.go @@ -20,12 +20,15 @@ package v1alpha1 import ( "context" + json "encoding/json" + "fmt" "time" v1alpha1 "k8s.io/api/storage/v1alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + storagev1alpha1 "k8s.io/client-go/applyconfigurations/storage/v1alpha1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -47,6 +50,8 @@ type VolumeAttachmentInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1alpha1.VolumeAttachmentList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.VolumeAttachment, err error) + Apply(ctx context.Context, volumeAttachment *storagev1alpha1.VolumeAttachmentApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.VolumeAttachment, err error) + ApplyStatus(ctx context.Context, volumeAttachment *storagev1alpha1.VolumeAttachmentApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.VolumeAttachment, err error) VolumeAttachmentExpansion } @@ -182,3 +187,57 @@ func (c *volumeAttachments) Patch(ctx context.Context, name string, pt types.Pat Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied volumeAttachment. +func (c *volumeAttachments) Apply(ctx context.Context, volumeAttachment *storagev1alpha1.VolumeAttachmentApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.VolumeAttachment, err error) { + if volumeAttachment == nil { + return nil, fmt.Errorf("volumeAttachment provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(volumeAttachment) + if err != nil { + return nil, err + } + name := volumeAttachment.Name + if name == nil { + return nil, fmt.Errorf("volumeAttachment.Name must be provided to Apply") + } + result = &v1alpha1.VolumeAttachment{} + err = c.client.Patch(types.ApplyPatchType). + Resource("volumeattachments"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *volumeAttachments) ApplyStatus(ctx context.Context, volumeAttachment *storagev1alpha1.VolumeAttachmentApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.VolumeAttachment, err error) { + if volumeAttachment == nil { + return nil, fmt.Errorf("volumeAttachment provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(volumeAttachment) + if err != nil { + return nil, err + } + + name := volumeAttachment.Name + if name == nil { + return nil, fmt.Errorf("volumeAttachment.Name must be provided to Apply") + } + + result = &v1alpha1.VolumeAttachment{} + err = c.client.Patch(types.ApplyPatchType). + Resource("volumeattachments"). + Name(*name). + SubResource("status"). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/BUILD deleted file mode 100644 index 10d3b4059c56..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "csidriver.go", - "csinode.go", - "doc.go", - "generated_expansion.go", - "storage_client.go", - "storageclass.go", - "volumeattachment.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1", - importpath = "k8s.io/client-go/kubernetes/typed/storage/v1beta1", - deps = [ - "//staging/src/k8s.io/api/storage/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/csidriver.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/csidriver.go index 2ad263042013..04e677db0596 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/csidriver.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/csidriver.go @@ -20,12 +20,15 @@ package v1beta1 import ( "context" + json "encoding/json" + "fmt" "time" v1beta1 "k8s.io/api/storage/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + storagev1beta1 "k8s.io/client-go/applyconfigurations/storage/v1beta1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type CSIDriverInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1beta1.CSIDriverList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta1.CSIDriver, err error) + Apply(ctx context.Context, cSIDriver *storagev1beta1.CSIDriverApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.CSIDriver, err error) CSIDriverExpansion } @@ -166,3 +170,28 @@ func (c *cSIDrivers) Patch(ctx context.Context, name string, pt types.PatchType, Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied cSIDriver. +func (c *cSIDrivers) Apply(ctx context.Context, cSIDriver *storagev1beta1.CSIDriverApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.CSIDriver, err error) { + if cSIDriver == nil { + return nil, fmt.Errorf("cSIDriver provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(cSIDriver) + if err != nil { + return nil, err + } + name := cSIDriver.Name + if name == nil { + return nil, fmt.Errorf("cSIDriver.Name must be provided to Apply") + } + result = &v1beta1.CSIDriver{} + err = c.client.Patch(types.ApplyPatchType). + Resource("csidrivers"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/csinode.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/csinode.go index babb89aba63c..c3760b5ce5cf 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/csinode.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/csinode.go @@ -20,12 +20,15 @@ package v1beta1 import ( "context" + json "encoding/json" + "fmt" "time" v1beta1 "k8s.io/api/storage/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + storagev1beta1 "k8s.io/client-go/applyconfigurations/storage/v1beta1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type CSINodeInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1beta1.CSINodeList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta1.CSINode, err error) + Apply(ctx context.Context, cSINode *storagev1beta1.CSINodeApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.CSINode, err error) CSINodeExpansion } @@ -166,3 +170,28 @@ func (c *cSINodes) Patch(ctx context.Context, name string, pt types.PatchType, d Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied cSINode. +func (c *cSINodes) Apply(ctx context.Context, cSINode *storagev1beta1.CSINodeApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.CSINode, err error) { + if cSINode == nil { + return nil, fmt.Errorf("cSINode provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(cSINode) + if err != nil { + return nil, err + } + name := cSINode.Name + if name == nil { + return nil, fmt.Errorf("cSINode.Name must be provided to Apply") + } + result = &v1beta1.CSINode{} + err = c.client.Patch(types.ApplyPatchType). + Resource("csinodes"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/csistoragecapacity.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/csistoragecapacity.go new file mode 100644 index 000000000000..98ba936dc44a --- /dev/null +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/csistoragecapacity.go @@ -0,0 +1,208 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package v1beta1 + +import ( + "context" + json "encoding/json" + "fmt" + "time" + + v1beta1 "k8s.io/api/storage/v1beta1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + storagev1beta1 "k8s.io/client-go/applyconfigurations/storage/v1beta1" + scheme "k8s.io/client-go/kubernetes/scheme" + rest "k8s.io/client-go/rest" +) + +// CSIStorageCapacitiesGetter has a method to return a CSIStorageCapacityInterface. +// A group's client should implement this interface. +type CSIStorageCapacitiesGetter interface { + CSIStorageCapacities(namespace string) CSIStorageCapacityInterface +} + +// CSIStorageCapacityInterface has methods to work with CSIStorageCapacity resources. +type CSIStorageCapacityInterface interface { + Create(ctx context.Context, cSIStorageCapacity *v1beta1.CSIStorageCapacity, opts v1.CreateOptions) (*v1beta1.CSIStorageCapacity, error) + Update(ctx context.Context, cSIStorageCapacity *v1beta1.CSIStorageCapacity, opts v1.UpdateOptions) (*v1beta1.CSIStorageCapacity, error) + Delete(ctx context.Context, name string, opts v1.DeleteOptions) error + DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error + Get(ctx context.Context, name string, opts v1.GetOptions) (*v1beta1.CSIStorageCapacity, error) + List(ctx context.Context, opts v1.ListOptions) (*v1beta1.CSIStorageCapacityList, error) + Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) + Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta1.CSIStorageCapacity, err error) + Apply(ctx context.Context, cSIStorageCapacity *storagev1beta1.CSIStorageCapacityApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.CSIStorageCapacity, err error) + CSIStorageCapacityExpansion +} + +// cSIStorageCapacities implements CSIStorageCapacityInterface +type cSIStorageCapacities struct { + client rest.Interface + ns string +} + +// newCSIStorageCapacities returns a CSIStorageCapacities +func newCSIStorageCapacities(c *StorageV1beta1Client, namespace string) *cSIStorageCapacities { + return &cSIStorageCapacities{ + client: c.RESTClient(), + ns: namespace, + } +} + +// Get takes name of the cSIStorageCapacity, and returns the corresponding cSIStorageCapacity object, and an error if there is any. +func (c *cSIStorageCapacities) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1beta1.CSIStorageCapacity, err error) { + result = &v1beta1.CSIStorageCapacity{} + err = c.client.Get(). + Namespace(c.ns). + Resource("csistoragecapacities"). + Name(name). + VersionedParams(&options, scheme.ParameterCodec). + Do(ctx). + Into(result) + return +} + +// List takes label and field selectors, and returns the list of CSIStorageCapacities that match those selectors. +func (c *cSIStorageCapacities) List(ctx context.Context, opts v1.ListOptions) (result *v1beta1.CSIStorageCapacityList, err error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + result = &v1beta1.CSIStorageCapacityList{} + err = c.client.Get(). + Namespace(c.ns). + Resource("csistoragecapacities"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Do(ctx). + Into(result) + return +} + +// Watch returns a watch.Interface that watches the requested cSIStorageCapacities. +func (c *cSIStorageCapacities) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + opts.Watch = true + return c.client.Get(). + Namespace(c.ns). + Resource("csistoragecapacities"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Watch(ctx) +} + +// Create takes the representation of a cSIStorageCapacity and creates it. Returns the server's representation of the cSIStorageCapacity, and an error, if there is any. +func (c *cSIStorageCapacities) Create(ctx context.Context, cSIStorageCapacity *v1beta1.CSIStorageCapacity, opts v1.CreateOptions) (result *v1beta1.CSIStorageCapacity, err error) { + result = &v1beta1.CSIStorageCapacity{} + err = c.client.Post(). + Namespace(c.ns). + Resource("csistoragecapacities"). + VersionedParams(&opts, scheme.ParameterCodec). + Body(cSIStorageCapacity). + Do(ctx). + Into(result) + return +} + +// Update takes the representation of a cSIStorageCapacity and updates it. Returns the server's representation of the cSIStorageCapacity, and an error, if there is any. +func (c *cSIStorageCapacities) Update(ctx context.Context, cSIStorageCapacity *v1beta1.CSIStorageCapacity, opts v1.UpdateOptions) (result *v1beta1.CSIStorageCapacity, err error) { + result = &v1beta1.CSIStorageCapacity{} + err = c.client.Put(). + Namespace(c.ns). + Resource("csistoragecapacities"). + Name(cSIStorageCapacity.Name). + VersionedParams(&opts, scheme.ParameterCodec). + Body(cSIStorageCapacity). + Do(ctx). + Into(result) + return +} + +// Delete takes name of the cSIStorageCapacity and deletes it. Returns an error if one occurs. +func (c *cSIStorageCapacities) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error { + return c.client.Delete(). + Namespace(c.ns). + Resource("csistoragecapacities"). + Name(name). + Body(&opts). + Do(ctx). + Error() +} + +// DeleteCollection deletes a collection of objects. +func (c *cSIStorageCapacities) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error { + var timeout time.Duration + if listOpts.TimeoutSeconds != nil { + timeout = time.Duration(*listOpts.TimeoutSeconds) * time.Second + } + return c.client.Delete(). + Namespace(c.ns). + Resource("csistoragecapacities"). + VersionedParams(&listOpts, scheme.ParameterCodec). + Timeout(timeout). + Body(&opts). + Do(ctx). + Error() +} + +// Patch applies the patch and returns the patched cSIStorageCapacity. +func (c *cSIStorageCapacities) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta1.CSIStorageCapacity, err error) { + result = &v1beta1.CSIStorageCapacity{} + err = c.client.Patch(pt). + Namespace(c.ns). + Resource("csistoragecapacities"). + Name(name). + SubResource(subresources...). + VersionedParams(&opts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// Apply takes the given apply declarative configuration, applies it and returns the applied cSIStorageCapacity. +func (c *cSIStorageCapacities) Apply(ctx context.Context, cSIStorageCapacity *storagev1beta1.CSIStorageCapacityApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.CSIStorageCapacity, err error) { + if cSIStorageCapacity == nil { + return nil, fmt.Errorf("cSIStorageCapacity provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(cSIStorageCapacity) + if err != nil { + return nil, err + } + name := cSIStorageCapacity.Name + if name == nil { + return nil, fmt.Errorf("cSIStorageCapacity.Name must be provided to Apply") + } + result = &v1beta1.CSIStorageCapacity{} + err = c.client.Patch(types.ApplyPatchType). + Namespace(c.ns). + Resource("csistoragecapacities"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/BUILD deleted file mode 100644 index 7bcbe739901c..000000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_csidriver.go", - "fake_csinode.go", - "fake_storage_client.go", - "fake_storageclass.go", - "fake_volumeattachment.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake", - importpath = "k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake", - deps = [ - "//staging/src/k8s.io/api/storage/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/storage/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/fake_csidriver.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/fake_csidriver.go index 35b2449ee594..d4482f39ee13 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/fake_csidriver.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/fake_csidriver.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1beta1 "k8s.io/api/storage/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + storagev1beta1 "k8s.io/client-go/applyconfigurations/storage/v1beta1" testing "k8s.io/client-go/testing" ) @@ -120,3 +123,24 @@ func (c *FakeCSIDrivers) Patch(ctx context.Context, name string, pt types.PatchT } return obj.(*v1beta1.CSIDriver), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied cSIDriver. +func (c *FakeCSIDrivers) Apply(ctx context.Context, cSIDriver *storagev1beta1.CSIDriverApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.CSIDriver, err error) { + if cSIDriver == nil { + return nil, fmt.Errorf("cSIDriver provided to Apply must not be nil") + } + data, err := json.Marshal(cSIDriver) + if err != nil { + return nil, err + } + name := cSIDriver.Name + if name == nil { + return nil, fmt.Errorf("cSIDriver.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(csidriversResource, *name, types.ApplyPatchType, data), &v1beta1.CSIDriver{}) + if obj == nil { + return nil, err + } + return obj.(*v1beta1.CSIDriver), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/fake_csinode.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/fake_csinode.go index 81e5bc6d924a..1bee83d70c36 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/fake_csinode.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/fake_csinode.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1beta1 "k8s.io/api/storage/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + storagev1beta1 "k8s.io/client-go/applyconfigurations/storage/v1beta1" testing "k8s.io/client-go/testing" ) @@ -120,3 +123,24 @@ func (c *FakeCSINodes) Patch(ctx context.Context, name string, pt types.PatchTyp } return obj.(*v1beta1.CSINode), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied cSINode. +func (c *FakeCSINodes) Apply(ctx context.Context, cSINode *storagev1beta1.CSINodeApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.CSINode, err error) { + if cSINode == nil { + return nil, fmt.Errorf("cSINode provided to Apply must not be nil") + } + data, err := json.Marshal(cSINode) + if err != nil { + return nil, err + } + name := cSINode.Name + if name == nil { + return nil, fmt.Errorf("cSINode.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(csinodesResource, *name, types.ApplyPatchType, data), &v1beta1.CSINode{}) + if obj == nil { + return nil, err + } + return obj.(*v1beta1.CSINode), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/fake_csistoragecapacity.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/fake_csistoragecapacity.go new file mode 100644 index 000000000000..e216b9905e0c --- /dev/null +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/fake_csistoragecapacity.go @@ -0,0 +1,155 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package fake + +import ( + "context" + json "encoding/json" + "fmt" + + v1beta1 "k8s.io/api/storage/v1beta1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + labels "k8s.io/apimachinery/pkg/labels" + schema "k8s.io/apimachinery/pkg/runtime/schema" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + storagev1beta1 "k8s.io/client-go/applyconfigurations/storage/v1beta1" + testing "k8s.io/client-go/testing" +) + +// FakeCSIStorageCapacities implements CSIStorageCapacityInterface +type FakeCSIStorageCapacities struct { + Fake *FakeStorageV1beta1 + ns string +} + +var csistoragecapacitiesResource = schema.GroupVersionResource{Group: "storage.k8s.io", Version: "v1beta1", Resource: "csistoragecapacities"} + +var csistoragecapacitiesKind = schema.GroupVersionKind{Group: "storage.k8s.io", Version: "v1beta1", Kind: "CSIStorageCapacity"} + +// Get takes name of the cSIStorageCapacity, and returns the corresponding cSIStorageCapacity object, and an error if there is any. +func (c *FakeCSIStorageCapacities) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1beta1.CSIStorageCapacity, err error) { + obj, err := c.Fake. + Invokes(testing.NewGetAction(csistoragecapacitiesResource, c.ns, name), &v1beta1.CSIStorageCapacity{}) + + if obj == nil { + return nil, err + } + return obj.(*v1beta1.CSIStorageCapacity), err +} + +// List takes label and field selectors, and returns the list of CSIStorageCapacities that match those selectors. +func (c *FakeCSIStorageCapacities) List(ctx context.Context, opts v1.ListOptions) (result *v1beta1.CSIStorageCapacityList, err error) { + obj, err := c.Fake. + Invokes(testing.NewListAction(csistoragecapacitiesResource, csistoragecapacitiesKind, c.ns, opts), &v1beta1.CSIStorageCapacityList{}) + + if obj == nil { + return nil, err + } + + label, _, _ := testing.ExtractFromListOptions(opts) + if label == nil { + label = labels.Everything() + } + list := &v1beta1.CSIStorageCapacityList{ListMeta: obj.(*v1beta1.CSIStorageCapacityList).ListMeta} + for _, item := range obj.(*v1beta1.CSIStorageCapacityList).Items { + if label.Matches(labels.Set(item.Labels)) { + list.Items = append(list.Items, item) + } + } + return list, err +} + +// Watch returns a watch.Interface that watches the requested cSIStorageCapacities. +func (c *FakeCSIStorageCapacities) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) { + return c.Fake. + InvokesWatch(testing.NewWatchAction(csistoragecapacitiesResource, c.ns, opts)) + +} + +// Create takes the representation of a cSIStorageCapacity and creates it. Returns the server's representation of the cSIStorageCapacity, and an error, if there is any. +func (c *FakeCSIStorageCapacities) Create(ctx context.Context, cSIStorageCapacity *v1beta1.CSIStorageCapacity, opts v1.CreateOptions) (result *v1beta1.CSIStorageCapacity, err error) { + obj, err := c.Fake. + Invokes(testing.NewCreateAction(csistoragecapacitiesResource, c.ns, cSIStorageCapacity), &v1beta1.CSIStorageCapacity{}) + + if obj == nil { + return nil, err + } + return obj.(*v1beta1.CSIStorageCapacity), err +} + +// Update takes the representation of a cSIStorageCapacity and updates it. Returns the server's representation of the cSIStorageCapacity, and an error, if there is any. +func (c *FakeCSIStorageCapacities) Update(ctx context.Context, cSIStorageCapacity *v1beta1.CSIStorageCapacity, opts v1.UpdateOptions) (result *v1beta1.CSIStorageCapacity, err error) { + obj, err := c.Fake. + Invokes(testing.NewUpdateAction(csistoragecapacitiesResource, c.ns, cSIStorageCapacity), &v1beta1.CSIStorageCapacity{}) + + if obj == nil { + return nil, err + } + return obj.(*v1beta1.CSIStorageCapacity), err +} + +// Delete takes name of the cSIStorageCapacity and deletes it. Returns an error if one occurs. +func (c *FakeCSIStorageCapacities) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error { + _, err := c.Fake. + Invokes(testing.NewDeleteAction(csistoragecapacitiesResource, c.ns, name), &v1beta1.CSIStorageCapacity{}) + + return err +} + +// DeleteCollection deletes a collection of objects. +func (c *FakeCSIStorageCapacities) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error { + action := testing.NewDeleteCollectionAction(csistoragecapacitiesResource, c.ns, listOpts) + + _, err := c.Fake.Invokes(action, &v1beta1.CSIStorageCapacityList{}) + return err +} + +// Patch applies the patch and returns the patched cSIStorageCapacity. +func (c *FakeCSIStorageCapacities) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta1.CSIStorageCapacity, err error) { + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(csistoragecapacitiesResource, c.ns, name, pt, data, subresources...), &v1beta1.CSIStorageCapacity{}) + + if obj == nil { + return nil, err + } + return obj.(*v1beta1.CSIStorageCapacity), err +} + +// Apply takes the given apply declarative configuration, applies it and returns the applied cSIStorageCapacity. +func (c *FakeCSIStorageCapacities) Apply(ctx context.Context, cSIStorageCapacity *storagev1beta1.CSIStorageCapacityApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.CSIStorageCapacity, err error) { + if cSIStorageCapacity == nil { + return nil, fmt.Errorf("cSIStorageCapacity provided to Apply must not be nil") + } + data, err := json.Marshal(cSIStorageCapacity) + if err != nil { + return nil, err + } + name := cSIStorageCapacity.Name + if name == nil { + return nil, fmt.Errorf("cSIStorageCapacity.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(csistoragecapacitiesResource, c.ns, *name, types.ApplyPatchType, data), &v1beta1.CSIStorageCapacity{}) + + if obj == nil { + return nil, err + } + return obj.(*v1beta1.CSIStorageCapacity), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/fake_storage_client.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/fake_storage_client.go index 7968c9003a67..6b5bb02fdaf9 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/fake_storage_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/fake_storage_client.go @@ -36,6 +36,10 @@ func (c *FakeStorageV1beta1) CSINodes() v1beta1.CSINodeInterface { return &FakeCSINodes{c} } +func (c *FakeStorageV1beta1) CSIStorageCapacities(namespace string) v1beta1.CSIStorageCapacityInterface { + return &FakeCSIStorageCapacities{c, namespace} +} + func (c *FakeStorageV1beta1) StorageClasses() v1beta1.StorageClassInterface { return &FakeStorageClasses{c} } diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/fake_storageclass.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/fake_storageclass.go index 3b0a8688cb80..2cf03cb5aaef 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/fake_storageclass.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/fake_storageclass.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1beta1 "k8s.io/api/storage/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + storagev1beta1 "k8s.io/client-go/applyconfigurations/storage/v1beta1" testing "k8s.io/client-go/testing" ) @@ -120,3 +123,24 @@ func (c *FakeStorageClasses) Patch(ctx context.Context, name string, pt types.Pa } return obj.(*v1beta1.StorageClass), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied storageClass. +func (c *FakeStorageClasses) Apply(ctx context.Context, storageClass *storagev1beta1.StorageClassApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.StorageClass, err error) { + if storageClass == nil { + return nil, fmt.Errorf("storageClass provided to Apply must not be nil") + } + data, err := json.Marshal(storageClass) + if err != nil { + return nil, err + } + name := storageClass.Name + if name == nil { + return nil, fmt.Errorf("storageClass.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(storageclassesResource, *name, types.ApplyPatchType, data), &v1beta1.StorageClass{}) + if obj == nil { + return nil, err + } + return obj.(*v1beta1.StorageClass), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/fake_volumeattachment.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/fake_volumeattachment.go index 0bc91bf56639..3ba1d539a922 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/fake_volumeattachment.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/fake_volumeattachment.go @@ -20,6 +20,8 @@ package fake import ( "context" + json "encoding/json" + "fmt" v1beta1 "k8s.io/api/storage/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +29,7 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + storagev1beta1 "k8s.io/client-go/applyconfigurations/storage/v1beta1" testing "k8s.io/client-go/testing" ) @@ -131,3 +134,46 @@ func (c *FakeVolumeAttachments) Patch(ctx context.Context, name string, pt types } return obj.(*v1beta1.VolumeAttachment), err } + +// Apply takes the given apply declarative configuration, applies it and returns the applied volumeAttachment. +func (c *FakeVolumeAttachments) Apply(ctx context.Context, volumeAttachment *storagev1beta1.VolumeAttachmentApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.VolumeAttachment, err error) { + if volumeAttachment == nil { + return nil, fmt.Errorf("volumeAttachment provided to Apply must not be nil") + } + data, err := json.Marshal(volumeAttachment) + if err != nil { + return nil, err + } + name := volumeAttachment.Name + if name == nil { + return nil, fmt.Errorf("volumeAttachment.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(volumeattachmentsResource, *name, types.ApplyPatchType, data), &v1beta1.VolumeAttachment{}) + if obj == nil { + return nil, err + } + return obj.(*v1beta1.VolumeAttachment), err +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *FakeVolumeAttachments) ApplyStatus(ctx context.Context, volumeAttachment *storagev1beta1.VolumeAttachmentApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.VolumeAttachment, err error) { + if volumeAttachment == nil { + return nil, fmt.Errorf("volumeAttachment provided to Apply must not be nil") + } + data, err := json.Marshal(volumeAttachment) + if err != nil { + return nil, err + } + name := volumeAttachment.Name + if name == nil { + return nil, fmt.Errorf("volumeAttachment.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(volumeattachmentsResource, *name, types.ApplyPatchType, data, "status"), &v1beta1.VolumeAttachment{}) + if obj == nil { + return nil, err + } + return obj.(*v1beta1.VolumeAttachment), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/generated_expansion.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/generated_expansion.go index 7ba93142bf62..1a202a928ed7 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/generated_expansion.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/generated_expansion.go @@ -22,6 +22,8 @@ type CSIDriverExpansion interface{} type CSINodeExpansion interface{} +type CSIStorageCapacityExpansion interface{} + type StorageClassExpansion interface{} type VolumeAttachmentExpansion interface{} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/storage_client.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/storage_client.go index 5e12b025b227..19267b362500 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/storage_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/storage_client.go @@ -28,6 +28,7 @@ type StorageV1beta1Interface interface { RESTClient() rest.Interface CSIDriversGetter CSINodesGetter + CSIStorageCapacitiesGetter StorageClassesGetter VolumeAttachmentsGetter } @@ -45,6 +46,10 @@ func (c *StorageV1beta1Client) CSINodes() CSINodeInterface { return newCSINodes(c) } +func (c *StorageV1beta1Client) CSIStorageCapacities(namespace string) CSIStorageCapacityInterface { + return newCSIStorageCapacities(c, namespace) +} + func (c *StorageV1beta1Client) StorageClasses() StorageClassInterface { return newStorageClasses(c) } diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/storageclass.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/storageclass.go index d6a8da98a394..9b4ef231c898 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/storageclass.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/storageclass.go @@ -20,12 +20,15 @@ package v1beta1 import ( "context" + json "encoding/json" + "fmt" "time" v1beta1 "k8s.io/api/storage/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + storagev1beta1 "k8s.io/client-go/applyconfigurations/storage/v1beta1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -46,6 +49,7 @@ type StorageClassInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1beta1.StorageClassList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta1.StorageClass, err error) + Apply(ctx context.Context, storageClass *storagev1beta1.StorageClassApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.StorageClass, err error) StorageClassExpansion } @@ -166,3 +170,28 @@ func (c *storageClasses) Patch(ctx context.Context, name string, pt types.PatchT Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied storageClass. +func (c *storageClasses) Apply(ctx context.Context, storageClass *storagev1beta1.StorageClassApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.StorageClass, err error) { + if storageClass == nil { + return nil, fmt.Errorf("storageClass provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(storageClass) + if err != nil { + return nil, err + } + name := storageClass.Name + if name == nil { + return nil, fmt.Errorf("storageClass.Name must be provided to Apply") + } + result = &v1beta1.StorageClass{} + err = c.client.Patch(types.ApplyPatchType). + Resource("storageclasses"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/volumeattachment.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/volumeattachment.go index 951a5e71bf24..35a8b64fcc30 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/volumeattachment.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/volumeattachment.go @@ -20,12 +20,15 @@ package v1beta1 import ( "context" + json "encoding/json" + "fmt" "time" v1beta1 "k8s.io/api/storage/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" + storagev1beta1 "k8s.io/client-go/applyconfigurations/storage/v1beta1" scheme "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" ) @@ -47,6 +50,8 @@ type VolumeAttachmentInterface interface { List(ctx context.Context, opts v1.ListOptions) (*v1beta1.VolumeAttachmentList, error) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta1.VolumeAttachment, err error) + Apply(ctx context.Context, volumeAttachment *storagev1beta1.VolumeAttachmentApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.VolumeAttachment, err error) + ApplyStatus(ctx context.Context, volumeAttachment *storagev1beta1.VolumeAttachmentApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.VolumeAttachment, err error) VolumeAttachmentExpansion } @@ -182,3 +187,57 @@ func (c *volumeAttachments) Patch(ctx context.Context, name string, pt types.Pat Into(result) return } + +// Apply takes the given apply declarative configuration, applies it and returns the applied volumeAttachment. +func (c *volumeAttachments) Apply(ctx context.Context, volumeAttachment *storagev1beta1.VolumeAttachmentApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.VolumeAttachment, err error) { + if volumeAttachment == nil { + return nil, fmt.Errorf("volumeAttachment provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(volumeAttachment) + if err != nil { + return nil, err + } + name := volumeAttachment.Name + if name == nil { + return nil, fmt.Errorf("volumeAttachment.Name must be provided to Apply") + } + result = &v1beta1.VolumeAttachment{} + err = c.client.Patch(types.ApplyPatchType). + Resource("volumeattachments"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// ApplyStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus(). +func (c *volumeAttachments) ApplyStatus(ctx context.Context, volumeAttachment *storagev1beta1.VolumeAttachmentApplyConfiguration, opts v1.ApplyOptions) (result *v1beta1.VolumeAttachment, err error) { + if volumeAttachment == nil { + return nil, fmt.Errorf("volumeAttachment provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(volumeAttachment) + if err != nil { + return nil, err + } + + name := volumeAttachment.Name + if name == nil { + return nil, fmt.Errorf("volumeAttachment.Name must be provided to Apply") + } + + result = &v1beta1.VolumeAttachment{} + err = c.client.Patch(types.ApplyPatchType). + Resource("volumeattachments"). + Name(*name). + SubResource("status"). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/listers/admissionregistration/v1/BUILD b/vendor/k8s.io/client-go/listers/admissionregistration/v1/BUILD deleted file mode 100644 index a721acfecedf..000000000000 --- a/vendor/k8s.io/client-go/listers/admissionregistration/v1/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "expansion_generated.go", - "mutatingwebhookconfiguration.go", - "validatingwebhookconfiguration.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/admissionregistration/v1", - importpath = "k8s.io/client-go/listers/admissionregistration/v1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/admissionregistration/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/listers/admissionregistration/v1beta1/BUILD b/vendor/k8s.io/client-go/listers/admissionregistration/v1beta1/BUILD deleted file mode 100644 index 553cc6f8e091..000000000000 --- a/vendor/k8s.io/client-go/listers/admissionregistration/v1beta1/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "expansion_generated.go", - "mutatingwebhookconfiguration.go", - "validatingwebhookconfiguration.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/admissionregistration/v1beta1", - importpath = "k8s.io/client-go/listers/admissionregistration/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/admissionregistration/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/listers/apiserverinternal/v1alpha1/BUILD b/vendor/k8s.io/client-go/listers/apiserverinternal/v1alpha1/BUILD deleted file mode 100644 index d450e1d5b76e..000000000000 --- a/vendor/k8s.io/client-go/listers/apiserverinternal/v1alpha1/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "expansion_generated.go", - "storageversion.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/apiserverinternal/v1alpha1", - importpath = "k8s.io/client-go/listers/apiserverinternal/v1alpha1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/apiserverinternal/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/listers/apps/v1/BUILD b/vendor/k8s.io/client-go/listers/apps/v1/BUILD deleted file mode 100644 index a7f29ce901d8..000000000000 --- a/vendor/k8s.io/client-go/listers/apps/v1/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "controllerrevision.go", - "daemonset.go", - "daemonset_expansion.go", - "deployment.go", - "expansion_generated.go", - "replicaset.go", - "replicaset_expansion.go", - "statefulset.go", - "statefulset_expansion.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/apps/v1", - importpath = "k8s.io/client-go/listers/apps/v1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/listers/apps/v1beta1/BUILD b/vendor/k8s.io/client-go/listers/apps/v1beta1/BUILD deleted file mode 100644 index 9d50008600d2..000000000000 --- a/vendor/k8s.io/client-go/listers/apps/v1beta1/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "controllerrevision.go", - "deployment.go", - "expansion_generated.go", - "statefulset.go", - "statefulset_expansion.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/apps/v1beta1", - importpath = "k8s.io/client-go/listers/apps/v1beta1", - deps = [ - "//staging/src/k8s.io/api/apps/v1beta1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/listers/apps/v1beta2/BUILD b/vendor/k8s.io/client-go/listers/apps/v1beta2/BUILD deleted file mode 100644 index fb8e5680b8f2..000000000000 --- a/vendor/k8s.io/client-go/listers/apps/v1beta2/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "controllerrevision.go", - "daemonset.go", - "daemonset_expansion.go", - "deployment.go", - "expansion_generated.go", - "replicaset.go", - "replicaset_expansion.go", - "statefulset.go", - "statefulset_expansion.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/apps/v1beta2", - importpath = "k8s.io/client-go/listers/apps/v1beta2", - deps = [ - "//staging/src/k8s.io/api/apps/v1beta2:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/listers/autoscaling/v1/BUILD b/vendor/k8s.io/client-go/listers/autoscaling/v1/BUILD deleted file mode 100644 index 99704f4aad71..000000000000 --- a/vendor/k8s.io/client-go/listers/autoscaling/v1/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "expansion_generated.go", - "horizontalpodautoscaler.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/autoscaling/v1", - importpath = "k8s.io/client-go/listers/autoscaling/v1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/listers/autoscaling/v2beta1/BUILD b/vendor/k8s.io/client-go/listers/autoscaling/v2beta1/BUILD deleted file mode 100644 index 80d19292363c..000000000000 --- a/vendor/k8s.io/client-go/listers/autoscaling/v2beta1/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "expansion_generated.go", - "horizontalpodautoscaler.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/autoscaling/v2beta1", - importpath = "k8s.io/client-go/listers/autoscaling/v2beta1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/autoscaling/v2beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/listers/autoscaling/v2beta2/BUILD b/vendor/k8s.io/client-go/listers/autoscaling/v2beta2/BUILD deleted file mode 100644 index 6ce5db8f7691..000000000000 --- a/vendor/k8s.io/client-go/listers/autoscaling/v2beta2/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "expansion_generated.go", - "horizontalpodautoscaler.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/autoscaling/v2beta2", - importpath = "k8s.io/client-go/listers/autoscaling/v2beta2", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/autoscaling/v2beta2:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/listers/batch/v1/BUILD b/vendor/k8s.io/client-go/listers/batch/v1/BUILD deleted file mode 100644 index ea3fd00f8ea8..000000000000 --- a/vendor/k8s.io/client-go/listers/batch/v1/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "expansion_generated.go", - "job.go", - "job_expansion.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/batch/v1", - importpath = "k8s.io/client-go/listers/batch/v1", - deps = [ - "//staging/src/k8s.io/api/batch/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/listers/batch/v1/cronjob.go b/vendor/k8s.io/client-go/listers/batch/v1/cronjob.go new file mode 100644 index 000000000000..8e49ed959fac --- /dev/null +++ b/vendor/k8s.io/client-go/listers/batch/v1/cronjob.go @@ -0,0 +1,99 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by lister-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/batch/v1" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/tools/cache" +) + +// CronJobLister helps list CronJobs. +// All objects returned here must be treated as read-only. +type CronJobLister interface { + // List lists all CronJobs in the indexer. + // Objects returned here must be treated as read-only. + List(selector labels.Selector) (ret []*v1.CronJob, err error) + // CronJobs returns an object that can list and get CronJobs. + CronJobs(namespace string) CronJobNamespaceLister + CronJobListerExpansion +} + +// cronJobLister implements the CronJobLister interface. +type cronJobLister struct { + indexer cache.Indexer +} + +// NewCronJobLister returns a new CronJobLister. +func NewCronJobLister(indexer cache.Indexer) CronJobLister { + return &cronJobLister{indexer: indexer} +} + +// List lists all CronJobs in the indexer. +func (s *cronJobLister) List(selector labels.Selector) (ret []*v1.CronJob, err error) { + err = cache.ListAll(s.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*v1.CronJob)) + }) + return ret, err +} + +// CronJobs returns an object that can list and get CronJobs. +func (s *cronJobLister) CronJobs(namespace string) CronJobNamespaceLister { + return cronJobNamespaceLister{indexer: s.indexer, namespace: namespace} +} + +// CronJobNamespaceLister helps list and get CronJobs. +// All objects returned here must be treated as read-only. +type CronJobNamespaceLister interface { + // List lists all CronJobs in the indexer for a given namespace. + // Objects returned here must be treated as read-only. + List(selector labels.Selector) (ret []*v1.CronJob, err error) + // Get retrieves the CronJob from the indexer for a given namespace and name. + // Objects returned here must be treated as read-only. + Get(name string) (*v1.CronJob, error) + CronJobNamespaceListerExpansion +} + +// cronJobNamespaceLister implements the CronJobNamespaceLister +// interface. +type cronJobNamespaceLister struct { + indexer cache.Indexer + namespace string +} + +// List lists all CronJobs in the indexer for a given namespace. +func (s cronJobNamespaceLister) List(selector labels.Selector) (ret []*v1.CronJob, err error) { + err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) { + ret = append(ret, m.(*v1.CronJob)) + }) + return ret, err +} + +// Get retrieves the CronJob from the indexer for a given namespace and name. +func (s cronJobNamespaceLister) Get(name string) (*v1.CronJob, error) { + obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(v1.Resource("cronjob"), name) + } + return obj.(*v1.CronJob), nil +} diff --git a/vendor/k8s.io/client-go/listers/batch/v1/expansion_generated.go b/vendor/k8s.io/client-go/listers/batch/v1/expansion_generated.go index c43caf240364..220976279033 100644 --- a/vendor/k8s.io/client-go/listers/batch/v1/expansion_generated.go +++ b/vendor/k8s.io/client-go/listers/batch/v1/expansion_generated.go @@ -17,3 +17,11 @@ limitations under the License. // Code generated by lister-gen. DO NOT EDIT. package v1 + +// CronJobListerExpansion allows custom methods to be added to +// CronJobLister. +type CronJobListerExpansion interface{} + +// CronJobNamespaceListerExpansion allows custom methods to be added to +// CronJobNamespaceLister. +type CronJobNamespaceListerExpansion interface{} diff --git a/vendor/k8s.io/client-go/listers/batch/v1beta1/BUILD b/vendor/k8s.io/client-go/listers/batch/v1beta1/BUILD deleted file mode 100644 index f4ed597fae66..000000000000 --- a/vendor/k8s.io/client-go/listers/batch/v1beta1/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "cronjob.go", - "expansion_generated.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/batch/v1beta1", - importpath = "k8s.io/client-go/listers/batch/v1beta1", - deps = [ - "//staging/src/k8s.io/api/batch/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/listers/batch/v2alpha1/BUILD b/vendor/k8s.io/client-go/listers/batch/v2alpha1/BUILD deleted file mode 100644 index 25936513a208..000000000000 --- a/vendor/k8s.io/client-go/listers/batch/v2alpha1/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "cronjob.go", - "expansion_generated.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/batch/v2alpha1", - importpath = "k8s.io/client-go/listers/batch/v2alpha1", - deps = [ - "//staging/src/k8s.io/api/batch/v2alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/listers/batch/v2alpha1/cronjob.go b/vendor/k8s.io/client-go/listers/batch/v2alpha1/cronjob.go deleted file mode 100644 index 824aa331f49a..000000000000 --- a/vendor/k8s.io/client-go/listers/batch/v2alpha1/cronjob.go +++ /dev/null @@ -1,99 +0,0 @@ -/* -Copyright The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by lister-gen. DO NOT EDIT. - -package v2alpha1 - -import ( - v2alpha1 "k8s.io/api/batch/v2alpha1" - "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/labels" - "k8s.io/client-go/tools/cache" -) - -// CronJobLister helps list CronJobs. -// All objects returned here must be treated as read-only. -type CronJobLister interface { - // List lists all CronJobs in the indexer. - // Objects returned here must be treated as read-only. - List(selector labels.Selector) (ret []*v2alpha1.CronJob, err error) - // CronJobs returns an object that can list and get CronJobs. - CronJobs(namespace string) CronJobNamespaceLister - CronJobListerExpansion -} - -// cronJobLister implements the CronJobLister interface. -type cronJobLister struct { - indexer cache.Indexer -} - -// NewCronJobLister returns a new CronJobLister. -func NewCronJobLister(indexer cache.Indexer) CronJobLister { - return &cronJobLister{indexer: indexer} -} - -// List lists all CronJobs in the indexer. -func (s *cronJobLister) List(selector labels.Selector) (ret []*v2alpha1.CronJob, err error) { - err = cache.ListAll(s.indexer, selector, func(m interface{}) { - ret = append(ret, m.(*v2alpha1.CronJob)) - }) - return ret, err -} - -// CronJobs returns an object that can list and get CronJobs. -func (s *cronJobLister) CronJobs(namespace string) CronJobNamespaceLister { - return cronJobNamespaceLister{indexer: s.indexer, namespace: namespace} -} - -// CronJobNamespaceLister helps list and get CronJobs. -// All objects returned here must be treated as read-only. -type CronJobNamespaceLister interface { - // List lists all CronJobs in the indexer for a given namespace. - // Objects returned here must be treated as read-only. - List(selector labels.Selector) (ret []*v2alpha1.CronJob, err error) - // Get retrieves the CronJob from the indexer for a given namespace and name. - // Objects returned here must be treated as read-only. - Get(name string) (*v2alpha1.CronJob, error) - CronJobNamespaceListerExpansion -} - -// cronJobNamespaceLister implements the CronJobNamespaceLister -// interface. -type cronJobNamespaceLister struct { - indexer cache.Indexer - namespace string -} - -// List lists all CronJobs in the indexer for a given namespace. -func (s cronJobNamespaceLister) List(selector labels.Selector) (ret []*v2alpha1.CronJob, err error) { - err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) { - ret = append(ret, m.(*v2alpha1.CronJob)) - }) - return ret, err -} - -// Get retrieves the CronJob from the indexer for a given namespace and name. -func (s cronJobNamespaceLister) Get(name string) (*v2alpha1.CronJob, error) { - obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) - if err != nil { - return nil, err - } - if !exists { - return nil, errors.NewNotFound(v2alpha1.Resource("cronjob"), name) - } - return obj.(*v2alpha1.CronJob), nil -} diff --git a/vendor/k8s.io/client-go/listers/batch/v2alpha1/expansion_generated.go b/vendor/k8s.io/client-go/listers/batch/v2alpha1/expansion_generated.go deleted file mode 100644 index a30c7a6190aa..000000000000 --- a/vendor/k8s.io/client-go/listers/batch/v2alpha1/expansion_generated.go +++ /dev/null @@ -1,27 +0,0 @@ -/* -Copyright The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by lister-gen. DO NOT EDIT. - -package v2alpha1 - -// CronJobListerExpansion allows custom methods to be added to -// CronJobLister. -type CronJobListerExpansion interface{} - -// CronJobNamespaceListerExpansion allows custom methods to be added to -// CronJobNamespaceLister. -type CronJobNamespaceListerExpansion interface{} diff --git a/vendor/k8s.io/client-go/listers/certificates/v1/BUILD b/vendor/k8s.io/client-go/listers/certificates/v1/BUILD deleted file mode 100644 index 9b5ba62e30ae..000000000000 --- a/vendor/k8s.io/client-go/listers/certificates/v1/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "certificatesigningrequest.go", - "expansion_generated.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/certificates/v1", - importpath = "k8s.io/client-go/listers/certificates/v1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/certificates/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/listers/certificates/v1beta1/BUILD b/vendor/k8s.io/client-go/listers/certificates/v1beta1/BUILD deleted file mode 100644 index 0dd49fcb3027..000000000000 --- a/vendor/k8s.io/client-go/listers/certificates/v1beta1/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "certificatesigningrequest.go", - "expansion_generated.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/certificates/v1beta1", - importpath = "k8s.io/client-go/listers/certificates/v1beta1", - deps = [ - "//staging/src/k8s.io/api/certificates/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/listers/coordination/v1/BUILD b/vendor/k8s.io/client-go/listers/coordination/v1/BUILD deleted file mode 100644 index 9507d35c441c..000000000000 --- a/vendor/k8s.io/client-go/listers/coordination/v1/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "expansion_generated.go", - "lease.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/coordination/v1", - importpath = "k8s.io/client-go/listers/coordination/v1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/coordination/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/listers/coordination/v1beta1/BUILD b/vendor/k8s.io/client-go/listers/coordination/v1beta1/BUILD deleted file mode 100644 index da6d88d53e29..000000000000 --- a/vendor/k8s.io/client-go/listers/coordination/v1beta1/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "expansion_generated.go", - "lease.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/coordination/v1beta1", - importpath = "k8s.io/client-go/listers/coordination/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/coordination/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/listers/core/v1/BUILD b/vendor/k8s.io/client-go/listers/core/v1/BUILD deleted file mode 100644 index 3ceba86612b1..000000000000 --- a/vendor/k8s.io/client-go/listers/core/v1/BUILD +++ /dev/null @@ -1,51 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "componentstatus.go", - "configmap.go", - "endpoints.go", - "event.go", - "expansion_generated.go", - "limitrange.go", - "namespace.go", - "node.go", - "persistentvolume.go", - "persistentvolumeclaim.go", - "pod.go", - "podtemplate.go", - "replicationcontroller.go", - "replicationcontroller_expansion.go", - "resourcequota.go", - "secret.go", - "service.go", - "serviceaccount.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/core/v1", - importpath = "k8s.io/client-go/listers/core/v1", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/listers/discovery/v1/endpointslice.go b/vendor/k8s.io/client-go/listers/discovery/v1/endpointslice.go new file mode 100644 index 000000000000..4dd46ff1bf94 --- /dev/null +++ b/vendor/k8s.io/client-go/listers/discovery/v1/endpointslice.go @@ -0,0 +1,99 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by lister-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/discovery/v1" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/tools/cache" +) + +// EndpointSliceLister helps list EndpointSlices. +// All objects returned here must be treated as read-only. +type EndpointSliceLister interface { + // List lists all EndpointSlices in the indexer. + // Objects returned here must be treated as read-only. + List(selector labels.Selector) (ret []*v1.EndpointSlice, err error) + // EndpointSlices returns an object that can list and get EndpointSlices. + EndpointSlices(namespace string) EndpointSliceNamespaceLister + EndpointSliceListerExpansion +} + +// endpointSliceLister implements the EndpointSliceLister interface. +type endpointSliceLister struct { + indexer cache.Indexer +} + +// NewEndpointSliceLister returns a new EndpointSliceLister. +func NewEndpointSliceLister(indexer cache.Indexer) EndpointSliceLister { + return &endpointSliceLister{indexer: indexer} +} + +// List lists all EndpointSlices in the indexer. +func (s *endpointSliceLister) List(selector labels.Selector) (ret []*v1.EndpointSlice, err error) { + err = cache.ListAll(s.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*v1.EndpointSlice)) + }) + return ret, err +} + +// EndpointSlices returns an object that can list and get EndpointSlices. +func (s *endpointSliceLister) EndpointSlices(namespace string) EndpointSliceNamespaceLister { + return endpointSliceNamespaceLister{indexer: s.indexer, namespace: namespace} +} + +// EndpointSliceNamespaceLister helps list and get EndpointSlices. +// All objects returned here must be treated as read-only. +type EndpointSliceNamespaceLister interface { + // List lists all EndpointSlices in the indexer for a given namespace. + // Objects returned here must be treated as read-only. + List(selector labels.Selector) (ret []*v1.EndpointSlice, err error) + // Get retrieves the EndpointSlice from the indexer for a given namespace and name. + // Objects returned here must be treated as read-only. + Get(name string) (*v1.EndpointSlice, error) + EndpointSliceNamespaceListerExpansion +} + +// endpointSliceNamespaceLister implements the EndpointSliceNamespaceLister +// interface. +type endpointSliceNamespaceLister struct { + indexer cache.Indexer + namespace string +} + +// List lists all EndpointSlices in the indexer for a given namespace. +func (s endpointSliceNamespaceLister) List(selector labels.Selector) (ret []*v1.EndpointSlice, err error) { + err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) { + ret = append(ret, m.(*v1.EndpointSlice)) + }) + return ret, err +} + +// Get retrieves the EndpointSlice from the indexer for a given namespace and name. +func (s endpointSliceNamespaceLister) Get(name string) (*v1.EndpointSlice, error) { + obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(v1.Resource("endpointslice"), name) + } + return obj.(*v1.EndpointSlice), nil +} diff --git a/vendor/k8s.io/client-go/listers/discovery/v1/expansion_generated.go b/vendor/k8s.io/client-go/listers/discovery/v1/expansion_generated.go new file mode 100644 index 000000000000..660163eeef37 --- /dev/null +++ b/vendor/k8s.io/client-go/listers/discovery/v1/expansion_generated.go @@ -0,0 +1,27 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by lister-gen. DO NOT EDIT. + +package v1 + +// EndpointSliceListerExpansion allows custom methods to be added to +// EndpointSliceLister. +type EndpointSliceListerExpansion interface{} + +// EndpointSliceNamespaceListerExpansion allows custom methods to be added to +// EndpointSliceNamespaceLister. +type EndpointSliceNamespaceListerExpansion interface{} diff --git a/vendor/k8s.io/client-go/listers/discovery/v1alpha1/BUILD b/vendor/k8s.io/client-go/listers/discovery/v1alpha1/BUILD deleted file mode 100644 index c29c72e7cd5c..000000000000 --- a/vendor/k8s.io/client-go/listers/discovery/v1alpha1/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "endpointslice.go", - "expansion_generated.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/discovery/v1alpha1", - importpath = "k8s.io/client-go/listers/discovery/v1alpha1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/discovery/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/listers/discovery/v1alpha1/endpointslice.go b/vendor/k8s.io/client-go/listers/discovery/v1alpha1/endpointslice.go deleted file mode 100644 index f3c0822bb09a..000000000000 --- a/vendor/k8s.io/client-go/listers/discovery/v1alpha1/endpointslice.go +++ /dev/null @@ -1,99 +0,0 @@ -/* -Copyright The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by lister-gen. DO NOT EDIT. - -package v1alpha1 - -import ( - v1alpha1 "k8s.io/api/discovery/v1alpha1" - "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/labels" - "k8s.io/client-go/tools/cache" -) - -// EndpointSliceLister helps list EndpointSlices. -// All objects returned here must be treated as read-only. -type EndpointSliceLister interface { - // List lists all EndpointSlices in the indexer. - // Objects returned here must be treated as read-only. - List(selector labels.Selector) (ret []*v1alpha1.EndpointSlice, err error) - // EndpointSlices returns an object that can list and get EndpointSlices. - EndpointSlices(namespace string) EndpointSliceNamespaceLister - EndpointSliceListerExpansion -} - -// endpointSliceLister implements the EndpointSliceLister interface. -type endpointSliceLister struct { - indexer cache.Indexer -} - -// NewEndpointSliceLister returns a new EndpointSliceLister. -func NewEndpointSliceLister(indexer cache.Indexer) EndpointSliceLister { - return &endpointSliceLister{indexer: indexer} -} - -// List lists all EndpointSlices in the indexer. -func (s *endpointSliceLister) List(selector labels.Selector) (ret []*v1alpha1.EndpointSlice, err error) { - err = cache.ListAll(s.indexer, selector, func(m interface{}) { - ret = append(ret, m.(*v1alpha1.EndpointSlice)) - }) - return ret, err -} - -// EndpointSlices returns an object that can list and get EndpointSlices. -func (s *endpointSliceLister) EndpointSlices(namespace string) EndpointSliceNamespaceLister { - return endpointSliceNamespaceLister{indexer: s.indexer, namespace: namespace} -} - -// EndpointSliceNamespaceLister helps list and get EndpointSlices. -// All objects returned here must be treated as read-only. -type EndpointSliceNamespaceLister interface { - // List lists all EndpointSlices in the indexer for a given namespace. - // Objects returned here must be treated as read-only. - List(selector labels.Selector) (ret []*v1alpha1.EndpointSlice, err error) - // Get retrieves the EndpointSlice from the indexer for a given namespace and name. - // Objects returned here must be treated as read-only. - Get(name string) (*v1alpha1.EndpointSlice, error) - EndpointSliceNamespaceListerExpansion -} - -// endpointSliceNamespaceLister implements the EndpointSliceNamespaceLister -// interface. -type endpointSliceNamespaceLister struct { - indexer cache.Indexer - namespace string -} - -// List lists all EndpointSlices in the indexer for a given namespace. -func (s endpointSliceNamespaceLister) List(selector labels.Selector) (ret []*v1alpha1.EndpointSlice, err error) { - err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) { - ret = append(ret, m.(*v1alpha1.EndpointSlice)) - }) - return ret, err -} - -// Get retrieves the EndpointSlice from the indexer for a given namespace and name. -func (s endpointSliceNamespaceLister) Get(name string) (*v1alpha1.EndpointSlice, error) { - obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) - if err != nil { - return nil, err - } - if !exists { - return nil, errors.NewNotFound(v1alpha1.Resource("endpointslice"), name) - } - return obj.(*v1alpha1.EndpointSlice), nil -} diff --git a/vendor/k8s.io/client-go/listers/discovery/v1alpha1/expansion_generated.go b/vendor/k8s.io/client-go/listers/discovery/v1alpha1/expansion_generated.go deleted file mode 100644 index d47af59aa82c..000000000000 --- a/vendor/k8s.io/client-go/listers/discovery/v1alpha1/expansion_generated.go +++ /dev/null @@ -1,27 +0,0 @@ -/* -Copyright The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by lister-gen. DO NOT EDIT. - -package v1alpha1 - -// EndpointSliceListerExpansion allows custom methods to be added to -// EndpointSliceLister. -type EndpointSliceListerExpansion interface{} - -// EndpointSliceNamespaceListerExpansion allows custom methods to be added to -// EndpointSliceNamespaceLister. -type EndpointSliceNamespaceListerExpansion interface{} diff --git a/vendor/k8s.io/client-go/listers/discovery/v1beta1/BUILD b/vendor/k8s.io/client-go/listers/discovery/v1beta1/BUILD deleted file mode 100644 index 3b5ac4b82da4..000000000000 --- a/vendor/k8s.io/client-go/listers/discovery/v1beta1/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "endpointslice.go", - "expansion_generated.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/discovery/v1beta1", - importpath = "k8s.io/client-go/listers/discovery/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/discovery/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/listers/events/v1/BUILD b/vendor/k8s.io/client-go/listers/events/v1/BUILD deleted file mode 100644 index 7c0cb40e2997..000000000000 --- a/vendor/k8s.io/client-go/listers/events/v1/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "event.go", - "expansion_generated.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/events/v1", - importpath = "k8s.io/client-go/listers/events/v1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/events/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/listers/events/v1beta1/BUILD b/vendor/k8s.io/client-go/listers/events/v1beta1/BUILD deleted file mode 100644 index f3ea306fc726..000000000000 --- a/vendor/k8s.io/client-go/listers/events/v1beta1/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "event.go", - "expansion_generated.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/events/v1beta1", - importpath = "k8s.io/client-go/listers/events/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/events/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/listers/extensions/v1beta1/BUILD b/vendor/k8s.io/client-go/listers/extensions/v1beta1/BUILD deleted file mode 100644 index 853979b42a4a..000000000000 --- a/vendor/k8s.io/client-go/listers/extensions/v1beta1/BUILD +++ /dev/null @@ -1,60 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "daemonset.go", - "daemonset_expansion.go", - "deployment.go", - "expansion_generated.go", - "ingress.go", - "networkpolicy.go", - "podsecuritypolicy.go", - "replicaset.go", - "replicaset_expansion.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/extensions/v1beta1", - importpath = "k8s.io/client-go/listers/extensions/v1beta1", - deps = [ - "//staging/src/k8s.io/api/apps/v1beta1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["daemonset_expansion_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/listers/flowcontrol/v1alpha1/BUILD b/vendor/k8s.io/client-go/listers/flowcontrol/v1alpha1/BUILD deleted file mode 100644 index 40d01b283aac..000000000000 --- a/vendor/k8s.io/client-go/listers/flowcontrol/v1alpha1/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "expansion_generated.go", - "flowschema.go", - "prioritylevelconfiguration.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/flowcontrol/v1alpha1", - importpath = "k8s.io/client-go/listers/flowcontrol/v1alpha1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/flowcontrol/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/listers/flowcontrol/v1beta1/BUILD b/vendor/k8s.io/client-go/listers/flowcontrol/v1beta1/BUILD deleted file mode 100644 index 15e22587582a..000000000000 --- a/vendor/k8s.io/client-go/listers/flowcontrol/v1beta1/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "expansion_generated.go", - "flowschema.go", - "prioritylevelconfiguration.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/flowcontrol/v1beta1", - importpath = "k8s.io/client-go/listers/flowcontrol/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/flowcontrol/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/listers/networking/v1/BUILD b/vendor/k8s.io/client-go/listers/networking/v1/BUILD deleted file mode 100644 index 7c803c9ed156..000000000000 --- a/vendor/k8s.io/client-go/listers/networking/v1/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "expansion_generated.go", - "ingress.go", - "ingressclass.go", - "networkpolicy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/networking/v1", - importpath = "k8s.io/client-go/listers/networking/v1", - deps = [ - "//staging/src/k8s.io/api/networking/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/listers/networking/v1beta1/BUILD b/vendor/k8s.io/client-go/listers/networking/v1beta1/BUILD deleted file mode 100644 index 75e784b57721..000000000000 --- a/vendor/k8s.io/client-go/listers/networking/v1beta1/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "expansion_generated.go", - "ingress.go", - "ingressclass.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/networking/v1beta1", - importpath = "k8s.io/client-go/listers/networking/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/networking/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/listers/node/v1/BUILD b/vendor/k8s.io/client-go/listers/node/v1/BUILD deleted file mode 100644 index 28097a4fb72f..000000000000 --- a/vendor/k8s.io/client-go/listers/node/v1/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "expansion_generated.go", - "runtimeclass.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/node/v1", - importpath = "k8s.io/client-go/listers/node/v1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/node/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/listers/node/v1alpha1/BUILD b/vendor/k8s.io/client-go/listers/node/v1alpha1/BUILD deleted file mode 100644 index 1961002fc5d3..000000000000 --- a/vendor/k8s.io/client-go/listers/node/v1alpha1/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "expansion_generated.go", - "runtimeclass.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/node/v1alpha1", - importpath = "k8s.io/client-go/listers/node/v1alpha1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/node/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/listers/node/v1beta1/BUILD b/vendor/k8s.io/client-go/listers/node/v1beta1/BUILD deleted file mode 100644 index 1fdca048597e..000000000000 --- a/vendor/k8s.io/client-go/listers/node/v1beta1/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "expansion_generated.go", - "runtimeclass.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/node/v1beta1", - importpath = "k8s.io/client-go/listers/node/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/node/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/listers/policy/v1/expansion_generated.go b/vendor/k8s.io/client-go/listers/policy/v1/expansion_generated.go new file mode 100644 index 000000000000..c43caf240364 --- /dev/null +++ b/vendor/k8s.io/client-go/listers/policy/v1/expansion_generated.go @@ -0,0 +1,19 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by lister-gen. DO NOT EDIT. + +package v1 diff --git a/vendor/k8s.io/client-go/listers/policy/v1/poddisruptionbudget.go b/vendor/k8s.io/client-go/listers/policy/v1/poddisruptionbudget.go new file mode 100644 index 000000000000..8470d38bb299 --- /dev/null +++ b/vendor/k8s.io/client-go/listers/policy/v1/poddisruptionbudget.go @@ -0,0 +1,99 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by lister-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/policy/v1" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/tools/cache" +) + +// PodDisruptionBudgetLister helps list PodDisruptionBudgets. +// All objects returned here must be treated as read-only. +type PodDisruptionBudgetLister interface { + // List lists all PodDisruptionBudgets in the indexer. + // Objects returned here must be treated as read-only. + List(selector labels.Selector) (ret []*v1.PodDisruptionBudget, err error) + // PodDisruptionBudgets returns an object that can list and get PodDisruptionBudgets. + PodDisruptionBudgets(namespace string) PodDisruptionBudgetNamespaceLister + PodDisruptionBudgetListerExpansion +} + +// podDisruptionBudgetLister implements the PodDisruptionBudgetLister interface. +type podDisruptionBudgetLister struct { + indexer cache.Indexer +} + +// NewPodDisruptionBudgetLister returns a new PodDisruptionBudgetLister. +func NewPodDisruptionBudgetLister(indexer cache.Indexer) PodDisruptionBudgetLister { + return &podDisruptionBudgetLister{indexer: indexer} +} + +// List lists all PodDisruptionBudgets in the indexer. +func (s *podDisruptionBudgetLister) List(selector labels.Selector) (ret []*v1.PodDisruptionBudget, err error) { + err = cache.ListAll(s.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*v1.PodDisruptionBudget)) + }) + return ret, err +} + +// PodDisruptionBudgets returns an object that can list and get PodDisruptionBudgets. +func (s *podDisruptionBudgetLister) PodDisruptionBudgets(namespace string) PodDisruptionBudgetNamespaceLister { + return podDisruptionBudgetNamespaceLister{indexer: s.indexer, namespace: namespace} +} + +// PodDisruptionBudgetNamespaceLister helps list and get PodDisruptionBudgets. +// All objects returned here must be treated as read-only. +type PodDisruptionBudgetNamespaceLister interface { + // List lists all PodDisruptionBudgets in the indexer for a given namespace. + // Objects returned here must be treated as read-only. + List(selector labels.Selector) (ret []*v1.PodDisruptionBudget, err error) + // Get retrieves the PodDisruptionBudget from the indexer for a given namespace and name. + // Objects returned here must be treated as read-only. + Get(name string) (*v1.PodDisruptionBudget, error) + PodDisruptionBudgetNamespaceListerExpansion +} + +// podDisruptionBudgetNamespaceLister implements the PodDisruptionBudgetNamespaceLister +// interface. +type podDisruptionBudgetNamespaceLister struct { + indexer cache.Indexer + namespace string +} + +// List lists all PodDisruptionBudgets in the indexer for a given namespace. +func (s podDisruptionBudgetNamespaceLister) List(selector labels.Selector) (ret []*v1.PodDisruptionBudget, err error) { + err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) { + ret = append(ret, m.(*v1.PodDisruptionBudget)) + }) + return ret, err +} + +// Get retrieves the PodDisruptionBudget from the indexer for a given namespace and name. +func (s podDisruptionBudgetNamespaceLister) Get(name string) (*v1.PodDisruptionBudget, error) { + obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(v1.Resource("poddisruptionbudget"), name) + } + return obj.(*v1.PodDisruptionBudget), nil +} diff --git a/vendor/k8s.io/client-go/listers/policy/v1/poddisruptionbudget_expansion.go b/vendor/k8s.io/client-go/listers/policy/v1/poddisruptionbudget_expansion.go new file mode 100644 index 000000000000..f63851ad48be --- /dev/null +++ b/vendor/k8s.io/client-go/listers/policy/v1/poddisruptionbudget_expansion.go @@ -0,0 +1,69 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1 + +import ( + "fmt" + + "k8s.io/api/core/v1" + policy "k8s.io/api/policy/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/klog/v2" +) + +// PodDisruptionBudgetListerExpansion allows custom methods to be added to +// PodDisruptionBudgetLister. +type PodDisruptionBudgetListerExpansion interface { + GetPodPodDisruptionBudgets(pod *v1.Pod) ([]*policy.PodDisruptionBudget, error) +} + +// PodDisruptionBudgetNamespaceListerExpansion allows custom methods to be added to +// PodDisruptionBudgetNamespaceLister. +type PodDisruptionBudgetNamespaceListerExpansion interface{} + +// GetPodPodDisruptionBudgets returns a list of PodDisruptionBudgets matching a pod. +func (s *podDisruptionBudgetLister) GetPodPodDisruptionBudgets(pod *v1.Pod) ([]*policy.PodDisruptionBudget, error) { + var selector labels.Selector + + list, err := s.PodDisruptionBudgets(pod.Namespace).List(labels.Everything()) + if err != nil { + return nil, err + } + + var pdbList []*policy.PodDisruptionBudget + for i := range list { + pdb := list[i] + selector, err = metav1.LabelSelectorAsSelector(pdb.Spec.Selector) + if err != nil { + klog.Warningf("invalid selector: %v", err) + continue + } + + // Unlike the v1beta version, here we let an empty selector match everything. + if !selector.Matches(labels.Set(pod.Labels)) { + continue + } + pdbList = append(pdbList, pdb) + } + + if len(pdbList) == 0 { + return nil, fmt.Errorf("could not find PodDisruptionBudget for pod %s in namespace %s with labels: %v", pod.Name, pod.Namespace, pod.Labels) + } + + return pdbList, nil +} diff --git a/vendor/k8s.io/client-go/listers/policy/v1beta1/BUILD b/vendor/k8s.io/client-go/listers/policy/v1beta1/BUILD deleted file mode 100644 index d3c5a12b072a..000000000000 --- a/vendor/k8s.io/client-go/listers/policy/v1beta1/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "eviction.go", - "expansion_generated.go", - "poddisruptionbudget.go", - "poddisruptionbudget_expansion.go", - "podsecuritypolicy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/policy/v1beta1", - importpath = "k8s.io/client-go/listers/policy/v1beta1", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/listers/policy/v1beta1/poddisruptionbudget_expansion.go b/vendor/k8s.io/client-go/listers/policy/v1beta1/poddisruptionbudget_expansion.go index e93c3647b52d..dce5dca82083 100644 --- a/vendor/k8s.io/client-go/listers/policy/v1beta1/poddisruptionbudget_expansion.go +++ b/vendor/k8s.io/client-go/listers/policy/v1beta1/poddisruptionbudget_expansion.go @@ -40,10 +40,6 @@ type PodDisruptionBudgetNamespaceListerExpansion interface{} func (s *podDisruptionBudgetLister) GetPodPodDisruptionBudgets(pod *v1.Pod) ([]*policy.PodDisruptionBudget, error) { var selector labels.Selector - if len(pod.Labels) == 0 { - return nil, fmt.Errorf("no PodDisruptionBudgets found for pod %v because it has no labels", pod.Name) - } - list, err := s.PodDisruptionBudgets(pod.Namespace).List(labels.Everything()) if err != nil { return nil, err diff --git a/vendor/k8s.io/client-go/listers/rbac/v1/BUILD b/vendor/k8s.io/client-go/listers/rbac/v1/BUILD deleted file mode 100644 index 0d6f8e14df03..000000000000 --- a/vendor/k8s.io/client-go/listers/rbac/v1/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "clusterrole.go", - "clusterrolebinding.go", - "expansion_generated.go", - "role.go", - "rolebinding.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/rbac/v1", - importpath = "k8s.io/client-go/listers/rbac/v1", - deps = [ - "//staging/src/k8s.io/api/rbac/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/listers/rbac/v1alpha1/BUILD b/vendor/k8s.io/client-go/listers/rbac/v1alpha1/BUILD deleted file mode 100644 index ba0583033613..000000000000 --- a/vendor/k8s.io/client-go/listers/rbac/v1alpha1/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "clusterrole.go", - "clusterrolebinding.go", - "expansion_generated.go", - "role.go", - "rolebinding.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/rbac/v1alpha1", - importpath = "k8s.io/client-go/listers/rbac/v1alpha1", - deps = [ - "//staging/src/k8s.io/api/rbac/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/listers/rbac/v1beta1/BUILD b/vendor/k8s.io/client-go/listers/rbac/v1beta1/BUILD deleted file mode 100644 index 055f3542c518..000000000000 --- a/vendor/k8s.io/client-go/listers/rbac/v1beta1/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "clusterrole.go", - "clusterrolebinding.go", - "expansion_generated.go", - "role.go", - "rolebinding.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/rbac/v1beta1", - importpath = "k8s.io/client-go/listers/rbac/v1beta1", - deps = [ - "//staging/src/k8s.io/api/rbac/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/listers/scheduling/v1/BUILD b/vendor/k8s.io/client-go/listers/scheduling/v1/BUILD deleted file mode 100644 index 052e8386e8e5..000000000000 --- a/vendor/k8s.io/client-go/listers/scheduling/v1/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "expansion_generated.go", - "priorityclass.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/scheduling/v1", - importpath = "k8s.io/client-go/listers/scheduling/v1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/scheduling/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/listers/scheduling/v1alpha1/BUILD b/vendor/k8s.io/client-go/listers/scheduling/v1alpha1/BUILD deleted file mode 100644 index 3f17b0575e76..000000000000 --- a/vendor/k8s.io/client-go/listers/scheduling/v1alpha1/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "expansion_generated.go", - "priorityclass.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/scheduling/v1alpha1", - importpath = "k8s.io/client-go/listers/scheduling/v1alpha1", - deps = [ - "//staging/src/k8s.io/api/scheduling/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/listers/scheduling/v1beta1/BUILD b/vendor/k8s.io/client-go/listers/scheduling/v1beta1/BUILD deleted file mode 100644 index 543d09dd5bb8..000000000000 --- a/vendor/k8s.io/client-go/listers/scheduling/v1beta1/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "expansion_generated.go", - "priorityclass.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/scheduling/v1beta1", - importpath = "k8s.io/client-go/listers/scheduling/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/scheduling/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/listers/storage/v1/BUILD b/vendor/k8s.io/client-go/listers/storage/v1/BUILD deleted file mode 100644 index 605f4e2095c5..000000000000 --- a/vendor/k8s.io/client-go/listers/storage/v1/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "csidriver.go", - "csinode.go", - "expansion_generated.go", - "storageclass.go", - "volumeattachment.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/storage/v1", - importpath = "k8s.io/client-go/listers/storage/v1", - deps = [ - "//staging/src/k8s.io/api/storage/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/listers/storage/v1alpha1/BUILD b/vendor/k8s.io/client-go/listers/storage/v1alpha1/BUILD deleted file mode 100644 index e7cbd3ce1483..000000000000 --- a/vendor/k8s.io/client-go/listers/storage/v1alpha1/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "csistoragecapacity.go", - "expansion_generated.go", - "volumeattachment.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/storage/v1alpha1", - importpath = "k8s.io/client-go/listers/storage/v1alpha1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/storage/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/listers/storage/v1beta1/BUILD b/vendor/k8s.io/client-go/listers/storage/v1beta1/BUILD deleted file mode 100644 index 8f22ec79395b..000000000000 --- a/vendor/k8s.io/client-go/listers/storage/v1beta1/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "csidriver.go", - "csinode.go", - "expansion_generated.go", - "storageclass.go", - "volumeattachment.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/storage/v1beta1", - importpath = "k8s.io/client-go/listers/storage/v1beta1", - deps = [ - "//staging/src/k8s.io/api/storage/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/listers/storage/v1beta1/csistoragecapacity.go b/vendor/k8s.io/client-go/listers/storage/v1beta1/csistoragecapacity.go new file mode 100644 index 000000000000..4680ffb7c82c --- /dev/null +++ b/vendor/k8s.io/client-go/listers/storage/v1beta1/csistoragecapacity.go @@ -0,0 +1,99 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by lister-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1beta1 "k8s.io/api/storage/v1beta1" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/tools/cache" +) + +// CSIStorageCapacityLister helps list CSIStorageCapacities. +// All objects returned here must be treated as read-only. +type CSIStorageCapacityLister interface { + // List lists all CSIStorageCapacities in the indexer. + // Objects returned here must be treated as read-only. + List(selector labels.Selector) (ret []*v1beta1.CSIStorageCapacity, err error) + // CSIStorageCapacities returns an object that can list and get CSIStorageCapacities. + CSIStorageCapacities(namespace string) CSIStorageCapacityNamespaceLister + CSIStorageCapacityListerExpansion +} + +// cSIStorageCapacityLister implements the CSIStorageCapacityLister interface. +type cSIStorageCapacityLister struct { + indexer cache.Indexer +} + +// NewCSIStorageCapacityLister returns a new CSIStorageCapacityLister. +func NewCSIStorageCapacityLister(indexer cache.Indexer) CSIStorageCapacityLister { + return &cSIStorageCapacityLister{indexer: indexer} +} + +// List lists all CSIStorageCapacities in the indexer. +func (s *cSIStorageCapacityLister) List(selector labels.Selector) (ret []*v1beta1.CSIStorageCapacity, err error) { + err = cache.ListAll(s.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*v1beta1.CSIStorageCapacity)) + }) + return ret, err +} + +// CSIStorageCapacities returns an object that can list and get CSIStorageCapacities. +func (s *cSIStorageCapacityLister) CSIStorageCapacities(namespace string) CSIStorageCapacityNamespaceLister { + return cSIStorageCapacityNamespaceLister{indexer: s.indexer, namespace: namespace} +} + +// CSIStorageCapacityNamespaceLister helps list and get CSIStorageCapacities. +// All objects returned here must be treated as read-only. +type CSIStorageCapacityNamespaceLister interface { + // List lists all CSIStorageCapacities in the indexer for a given namespace. + // Objects returned here must be treated as read-only. + List(selector labels.Selector) (ret []*v1beta1.CSIStorageCapacity, err error) + // Get retrieves the CSIStorageCapacity from the indexer for a given namespace and name. + // Objects returned here must be treated as read-only. + Get(name string) (*v1beta1.CSIStorageCapacity, error) + CSIStorageCapacityNamespaceListerExpansion +} + +// cSIStorageCapacityNamespaceLister implements the CSIStorageCapacityNamespaceLister +// interface. +type cSIStorageCapacityNamespaceLister struct { + indexer cache.Indexer + namespace string +} + +// List lists all CSIStorageCapacities in the indexer for a given namespace. +func (s cSIStorageCapacityNamespaceLister) List(selector labels.Selector) (ret []*v1beta1.CSIStorageCapacity, err error) { + err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) { + ret = append(ret, m.(*v1beta1.CSIStorageCapacity)) + }) + return ret, err +} + +// Get retrieves the CSIStorageCapacity from the indexer for a given namespace and name. +func (s cSIStorageCapacityNamespaceLister) Get(name string) (*v1beta1.CSIStorageCapacity, error) { + obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(v1beta1.Resource("csistoragecapacity"), name) + } + return obj.(*v1beta1.CSIStorageCapacity), nil +} diff --git a/vendor/k8s.io/client-go/listers/storage/v1beta1/expansion_generated.go b/vendor/k8s.io/client-go/listers/storage/v1beta1/expansion_generated.go index eeca4fdb40ea..c2b0d5b17dfa 100644 --- a/vendor/k8s.io/client-go/listers/storage/v1beta1/expansion_generated.go +++ b/vendor/k8s.io/client-go/listers/storage/v1beta1/expansion_generated.go @@ -26,6 +26,14 @@ type CSIDriverListerExpansion interface{} // CSINodeLister. type CSINodeListerExpansion interface{} +// CSIStorageCapacityListerExpansion allows custom methods to be added to +// CSIStorageCapacityLister. +type CSIStorageCapacityListerExpansion interface{} + +// CSIStorageCapacityNamespaceListerExpansion allows custom methods to be added to +// CSIStorageCapacityNamespaceLister. +type CSIStorageCapacityNamespaceListerExpansion interface{} + // StorageClassListerExpansion allows custom methods to be added to // StorageClassLister. type StorageClassListerExpansion interface{} diff --git a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/BUILD b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/BUILD deleted file mode 100644 index 12c6369ee7bc..000000000000 --- a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/pkg/apis/clientauthentication", - importpath = "k8s.io/client-go/pkg/apis/clientauthentication", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/pkg/apis/clientauthentication/install:all-srcs", - "//staging/src/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1:all-srcs", - "//staging/src/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/BUILD b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/BUILD deleted file mode 100644 index 8ad512b7cc88..000000000000 --- a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "doc.go", - "register.go", - "types.go", - "zz_generated.conversion.go", - "zz_generated.deepcopy.go", - "zz_generated.defaults.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1", - importpath = "k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/client-go/pkg/apis/clientauthentication:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/BUILD b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/BUILD deleted file mode 100644 index fa0df9ae1616..000000000000 --- a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "doc.go", - "register.go", - "types.go", - "zz_generated.conversion.go", - "zz_generated.deepcopy.go", - "zz_generated.defaults.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1", - importpath = "k8s.io/client-go/pkg/apis/clientauthentication/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/client-go/pkg/apis/clientauthentication:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/pkg/version/BUILD b/vendor/k8s.io/client-go/pkg/version/BUILD deleted file mode 100644 index 9e66d15ab627..000000000000 --- a/vendor/k8s.io/client-go/pkg/version/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "base.go", - "doc.go", - "version.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/pkg/version", - importpath = "k8s.io/client-go/pkg/version", - deps = ["//staging/src/k8s.io/apimachinery/pkg/version:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/pkg/version/base.go b/vendor/k8s.io/client-go/pkg/version/base.go index 9b4c79f89519..51e34dda334a 100644 --- a/vendor/k8s.io/client-go/pkg/version/base.go +++ b/vendor/k8s.io/client-go/pkg/version/base.go @@ -55,7 +55,7 @@ var ( // NOTE: The $Format strings are replaced during 'git archive' thanks to the // companion .gitattributes file containing 'export-subst' in this same // directory. See also https://git-scm.com/docs/gitattributes - gitVersion string = "v0.0.0-master+$Format:%h$" + gitVersion string = "v0.0.0-master+$Format:%H$" gitCommit string = "$Format:%H$" // sha1 from git, output of $(git rev-parse HEAD) gitTreeState string = "" // state of git tree, either "clean" or "dirty" diff --git a/vendor/k8s.io/client-go/pkg/version/def.bzl b/vendor/k8s.io/client-go/pkg/version/def.bzl deleted file mode 100644 index ecc9cd3bb09d..000000000000 --- a/vendor/k8s.io/client-go/pkg/version/def.bzl +++ /dev/null @@ -1,38 +0,0 @@ -# Copyright 2017 The Kubernetes Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Implements hack/lib/version.sh's kube::version::ldflags() for Bazel. -def version_x_defs(): - # This should match the list of packages in kube::version::ldflag - stamp_pkgs = [ - "k8s.io/component-base/version", - # In hack/lib/version.sh, this has a vendor/ prefix. That isn't needed here? - "k8s.io/client-go/pkg/version", - ] - # This should match the list of vars in kube::version::ldflags - # It should also match the list of vars set in hack/print-workspace-status.sh. - stamp_vars = [ - "buildDate", - "gitCommit", - "gitMajor", - "gitMinor", - "gitTreeState", - "gitVersion", - ] - # Generate the cross-product. - x_defs = {} - for pkg in stamp_pkgs: - for var in stamp_vars: - x_defs["%s.%s" % (pkg, var)] = "{%s}" % var - return x_defs diff --git a/vendor/k8s.io/client-go/plugin/pkg/client/auth/BUILD b/vendor/k8s.io/client-go/plugin/pkg/client/auth/BUILD deleted file mode 100644 index 93f82807f87c..000000000000 --- a/vendor/k8s.io/client-go/plugin/pkg/client/auth/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["plugins.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/plugin/pkg/client/auth", - importpath = "k8s.io/client-go/plugin/pkg/client/auth", - deps = [ - "//staging/src/k8s.io/client-go/plugin/pkg/client/auth/azure:go_default_library", - "//staging/src/k8s.io/client-go/plugin/pkg/client/auth/gcp:go_default_library", - "//staging/src/k8s.io/client-go/plugin/pkg/client/auth/oidc:go_default_library", - "//staging/src/k8s.io/client-go/plugin/pkg/client/auth/openstack:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/plugin/pkg/client/auth/azure:all-srcs", - "//staging/src/k8s.io/client-go/plugin/pkg/client/auth/exec:all-srcs", - "//staging/src/k8s.io/client-go/plugin/pkg/client/auth/gcp:all-srcs", - "//staging/src/k8s.io/client-go/plugin/pkg/client/auth/oidc:all-srcs", - "//staging/src/k8s.io/client-go/plugin/pkg/client/auth/openstack:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/plugin/pkg/client/auth/azure/BUILD b/vendor/k8s.io/client-go/plugin/pkg/client/auth/azure/BUILD deleted file mode 100644 index ae8bb9a65d01..000000000000 --- a/vendor/k8s.io/client-go/plugin/pkg/client/auth/azure/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["azure_test.go"], - embed = [":go_default_library"], - deps = [ - "//vendor/github.com/Azure/go-autorest/autorest/adal:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/azure:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["azure.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/plugin/pkg/client/auth/azure", - importpath = "k8s.io/client-go/plugin/pkg/client/auth/azure", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/adal:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/azure:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/BUILD b/vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/BUILD deleted file mode 100644 index 352449a2f084..000000000000 --- a/vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/BUILD +++ /dev/null @@ -1,62 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "exec.go", - "metrics.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/plugin/pkg/client/auth/exec", - importpath = "k8s.io/client-go/plugin/pkg/client/auth/exec", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/client-go/pkg/apis/clientauthentication:go_default_library", - "//staging/src/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1:go_default_library", - "//staging/src/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/tools/clientcmd/api:go_default_library", - "//staging/src/k8s.io/client-go/tools/metrics:go_default_library", - "//staging/src/k8s.io/client-go/transport:go_default_library", - "//staging/src/k8s.io/client-go/util/connrotation:go_default_library", - "//vendor/github.com/davecgh/go-spew/spew:go_default_library", - "//vendor/golang.org/x/crypto/ssh/terminal:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "exec_test.go", - "metrics_test.go", - ], - data = glob(["testdata/**"]), - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/client-go/pkg/apis/clientauthentication:go_default_library", - "//staging/src/k8s.io/client-go/tools/clientcmd/api:go_default_library", - "//staging/src/k8s.io/client-go/transport:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/exec.go b/vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/exec.go index af21c4995371..b23e57dde636 100644 --- a/vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/exec.go +++ b/vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/exec.go @@ -18,7 +18,6 @@ package exec import ( "bytes" - "context" "crypto/tls" "crypto/x509" "errors" @@ -34,7 +33,8 @@ import ( "time" "github.com/davecgh/go-spew/spew" - "golang.org/x/crypto/ssh/terminal" + "golang.org/x/term" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" @@ -52,7 +52,6 @@ import ( ) const execInfoEnv = "KUBERNETES_EXEC_INFO" -const onRotateListWarningLength = 1000 const installHintVerboseHelp = ` It looks like you are trying to use a client-go credential plugin that is not installed. @@ -177,6 +176,12 @@ func newAuthenticator(c *cache, config *api.ExecConfig, cluster *clientauthentic return nil, fmt.Errorf("exec plugin: invalid apiVersion %q", config.APIVersion) } + connTracker := connrotation.NewConnectionTracker() + defaultDialer := connrotation.NewDialerWithTracker( + (&net.Dialer{Timeout: 30 * time.Second, KeepAlive: 30 * time.Second}).DialContext, + connTracker, + ) + a := &Authenticator{ cmd: config.Command, args: config.Args, @@ -193,9 +198,12 @@ func newAuthenticator(c *cache, config *api.ExecConfig, cluster *clientauthentic stdin: os.Stdin, stderr: os.Stderr, - interactive: terminal.IsTerminal(int(os.Stdout.Fd())), + interactive: term.IsTerminal(int(os.Stdin.Fd())), now: time.Now, environ: os.Environ, + + defaultDialer: defaultDialer, + connTracker: connTracker, } for _, env := range config.Env { @@ -229,6 +237,11 @@ type Authenticator struct { now func() time.Time environ func() []string + // defaultDialer is used for clients which don't specify a custom dialer + defaultDialer *connrotation.Dialer + // connTracker tracks all connections opened that we need to close when rotating a client certificate + connTracker *connrotation.ConnectionTracker + // Cached results. // // The mutex also guards calling the plugin. Since the plugin could be @@ -236,8 +249,6 @@ type Authenticator struct { mu sync.Mutex cachedCreds *credentials exp time.Time - - onRotateList []func() } type credentials struct { @@ -266,20 +277,12 @@ func (a *Authenticator) UpdateTransportConfig(c *transport.Config) error { } c.TLS.GetCert = a.cert - var dial func(ctx context.Context, network, addr string) (net.Conn, error) + var d *connrotation.Dialer if c.Dial != nil { - dial = c.Dial + // if c has a custom dialer, we have to wrap it + d = connrotation.NewDialerWithTracker(c.Dial, a.connTracker) } else { - dial = (&net.Dialer{Timeout: 30 * time.Second, KeepAlive: 30 * time.Second}).DialContext - } - d := connrotation.NewDialer(dial) - - a.mu.Lock() - defer a.mu.Unlock() - a.onRotateList = append(a.onRotateList, d.CloseAll) - onRotateListLength := len(a.onRotateList) - if onRotateListLength > onRotateListWarningLength { - klog.Warningf("constructing many client instances from the same exec auth config can cause performance problems during cert rotation and can exhaust available network connections; %d clients constructed calling %q", onRotateListLength, a.cmd) + d = a.defaultDialer } c.Dial = d.DialContext @@ -398,7 +401,9 @@ func (a *Authenticator) refreshCredsLocked(r *clientauthentication.Response) err cmd.Stdin = a.stdin } - if err := cmd.Run(); err != nil { + err = cmd.Run() + incrementCallsMetric(err) + if err != nil { return a.wrapCmdRunErrorLocked(err) } @@ -458,9 +463,7 @@ func (a *Authenticator) refreshCredsLocked(r *clientauthentication.Response) err if oldCreds.cert != nil && oldCreds.cert.Leaf != nil { metrics.ClientCertRotationAge.Observe(time.Now().Sub(oldCreds.cert.Leaf.NotBefore)) } - for _, onRotate := range a.onRotateList { - onRotate() - } + a.connTracker.CloseAll() } expiry := time.Time{} diff --git a/vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/metrics.go b/vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/metrics.go index caf0cca3e434..3a2cc251a1f0 100644 --- a/vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/metrics.go +++ b/vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/metrics.go @@ -17,12 +17,39 @@ limitations under the License. package exec import ( + "errors" + "os/exec" + "reflect" "sync" "time" + "k8s.io/klog/v2" + "k8s.io/client-go/tools/metrics" ) +// The following constants shadow the special values used in the prometheus metrics implementation. +const ( + // noError indicates that the plugin process was successfully started and exited with an exit + // code of 0. + noError = "no_error" + // pluginExecutionError indicates that the plugin process was successfully started and then + // it returned a non-zero exit code. + pluginExecutionError = "plugin_execution_error" + // pluginNotFoundError indicates that we could not find the exec plugin. + pluginNotFoundError = "plugin_not_found_error" + // clientInternalError indicates that we attempted to start the plugin process, but failed + // for some reason. + clientInternalError = "client_internal_error" + + // successExitCode represents an exec plugin invocation that was successful. + successExitCode = 0 + // failureExitCode represents an exec plugin invocation that was not successful. This code is + // used in some failure modes (e.g., plugin not found, client internal error) so that someone + // can more easily monitor all unsuccessful invocations. + failureExitCode = 1 +) + type certificateExpirationTracker struct { mu sync.RWMutex m map[*Authenticator]time.Time @@ -58,3 +85,25 @@ func (c *certificateExpirationTracker) set(a *Authenticator, t time.Time) { c.metricSet(&earliest) } } + +// incrementCallsMetric increments a global metrics counter for the number of calls to an exec +// plugin, partitioned by exit code. The provided err should be the return value from +// exec.Cmd.Run(). +func incrementCallsMetric(err error) { + execExitError := &exec.ExitError{} + execError := &exec.Error{} + switch { + case err == nil: // Binary execution succeeded. + metrics.ExecPluginCalls.Increment(successExitCode, noError) + + case errors.As(err, &execExitError): // Binary execution failed (see "os/exec".Cmd.Run()). + metrics.ExecPluginCalls.Increment(execExitError.ExitCode(), pluginExecutionError) + + case errors.As(err, &execError): // Binary does not exist (see exec.Error). + metrics.ExecPluginCalls.Increment(failureExitCode, pluginNotFoundError) + + default: // We don't know about this error type. + klog.V(2).InfoS("unexpected exec plugin return error type", "type", reflect.TypeOf(err).String(), "err", err) + metrics.ExecPluginCalls.Increment(failureExitCode, clientInternalError) + } +} diff --git a/vendor/k8s.io/client-go/plugin/pkg/client/auth/gcp/BUILD b/vendor/k8s.io/client-go/plugin/pkg/client/auth/gcp/BUILD deleted file mode 100644 index 3d0d7d5f0897..000000000000 --- a/vendor/k8s.io/client-go/plugin/pkg/client/auth/gcp/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["gcp_test.go"], - embed = [":go_default_library"], - deps = ["//vendor/golang.org/x/oauth2:go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = ["gcp.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/plugin/pkg/client/auth/gcp", - importpath = "k8s.io/client-go/plugin/pkg/client/auth/gcp", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/yaml:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/util/jsonpath:go_default_library", - "//vendor/golang.org/x/oauth2:go_default_library", - "//vendor/golang.org/x/oauth2/google:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/plugin/pkg/client/auth/oidc/BUILD b/vendor/k8s.io/client-go/plugin/pkg/client/auth/oidc/BUILD deleted file mode 100644 index 005d1b75f2a9..000000000000 --- a/vendor/k8s.io/client-go/plugin/pkg/client/auth/oidc/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["oidc_test.go"], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = ["oidc.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/plugin/pkg/client/auth/oidc", - importpath = "k8s.io/client-go/plugin/pkg/client/auth/oidc", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//vendor/golang.org/x/oauth2:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/plugin/pkg/client/auth/openstack/BUILD b/vendor/k8s.io/client-go/plugin/pkg/client/auth/openstack/BUILD deleted file mode 100644 index 78ff58f58b43..000000000000 --- a/vendor/k8s.io/client-go/plugin/pkg/client/auth/openstack/BUILD +++ /dev/null @@ -1,30 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["openstack_stub.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/plugin/pkg/client/auth/openstack", - importpath = "k8s.io/client-go/plugin/pkg/client/auth/openstack", - deps = [ - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/rest/BUILD b/vendor/k8s.io/client-go/rest/BUILD deleted file mode 100644 index d3fa26489073..000000000000 --- a/vendor/k8s.io/client-go/rest/BUILD +++ /dev/null @@ -1,110 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "client_test.go", - "config_test.go", - "connection_test.go", - "exec_test.go", - "plugin_test.go", - "request_test.go", - "url_utils_test.go", - "urlbackoff_test.go", - ], - data = glob(["testdata/**"]), - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/streaming:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/pkg/apis/clientauthentication:go_default_library", - "//staging/src/k8s.io/client-go/rest/watch:go_default_library", - "//staging/src/k8s.io/client-go/tools/clientcmd/api:go_default_library", - "//staging/src/k8s.io/client-go/transport:go_default_library", - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/client-go/util/testing:go_default_library", - "//vendor/github.com/google/go-cmp/cmp:go_default_library", - "//vendor/github.com/google/gofuzz:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "client.go", - "config.go", - "exec.go", - "plugin.go", - "request.go", - "transport.go", - "url_utils.go", - "urlbackoff.go", - "warnings.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/rest", - importpath = "k8s.io/client-go/rest", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/streaming:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/pkg/apis/clientauthentication:go_default_library", - "//staging/src/k8s.io/client-go/pkg/version:go_default_library", - "//staging/src/k8s.io/client-go/plugin/pkg/client/auth/exec:go_default_library", - "//staging/src/k8s.io/client-go/rest/watch:go_default_library", - "//staging/src/k8s.io/client-go/tools/clientcmd/api:go_default_library", - "//staging/src/k8s.io/client-go/tools/metrics:go_default_library", - "//staging/src/k8s.io/client-go/transport:go_default_library", - "//staging/src/k8s.io/client-go/util/cert:go_default_library", - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//vendor/golang.org/x/net/http2:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/rest/fake:all-srcs", - "//staging/src/k8s.io/client-go/rest/watch:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/rest/OWNERS b/vendor/k8s.io/client-go/rest/OWNERS index c02ec6a250f0..0d574e0568e9 100644 --- a/vendor/k8s.io/client-go/rest/OWNERS +++ b/vendor/k8s.io/client-go/rest/OWNERS @@ -8,8 +8,6 @@ reviewers: - deads2k - brendandburns - liggitt -- nikhiljindal -- gmarek - erictune - sttts - luxas diff --git a/vendor/k8s.io/client-go/rest/client.go b/vendor/k8s.io/client-go/rest/client.go index f35955d45faa..c969300494c0 100644 --- a/vendor/k8s.io/client-go/rest/client.go +++ b/vendor/k8s.io/client-go/rest/client.go @@ -127,7 +127,7 @@ func NewRESTClient(baseURL *url.URL, versionedAPIPath string, config ClientConte }, nil } -// GetRateLimiter returns rate limier for a given client, or nil if it's called on a nil client +// GetRateLimiter returns rate limiter for a given client, or nil if it's called on a nil client func (c *RESTClient) GetRateLimiter() flowcontrol.RateLimiter { if c == nil { return nil diff --git a/vendor/k8s.io/client-go/rest/fake/BUILD b/vendor/k8s.io/client-go/rest/fake/BUILD deleted file mode 100644 index 56a820d5dd64..000000000000 --- a/vendor/k8s.io/client-go/rest/fake/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["fake.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/rest/fake", - importpath = "k8s.io/client-go/rest/fake", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/rest/plugin.go b/vendor/k8s.io/client-go/rest/plugin.go index 33d146cd9d1b..c2b3dfc0f5e6 100644 --- a/vendor/k8s.io/client-go/rest/plugin.go +++ b/vendor/k8s.io/client-go/rest/plugin.go @@ -47,6 +47,13 @@ type AuthProviderConfigPersister interface { Persist(map[string]string) error } +type noopPersister struct{} + +func (n *noopPersister) Persist(_ map[string]string) error { + // no operation persister + return nil +} + // All registered auth provider plugins. var pluginsLock sync.Mutex var plugins = make(map[string]Factory) @@ -69,5 +76,8 @@ func GetAuthProvider(clusterAddress string, apc *clientcmdapi.AuthProviderConfig if !ok { return nil, fmt.Errorf("no Auth Provider found for name %q", apc.Name) } + if persister == nil { + persister = &noopPersister{} + } return p(clusterAddress, apc.Config, persister) } diff --git a/vendor/k8s.io/client-go/rest/request.go b/vendor/k8s.io/client-go/rest/request.go index 1ccc0dafe674..0ac0e8eab854 100644 --- a/vendor/k8s.io/client-go/rest/request.go +++ b/vendor/k8s.io/client-go/rest/request.go @@ -242,7 +242,7 @@ func (r *Request) SubResource(subresources ...string) *Request { } subresource := path.Join(subresources...) if len(r.subresource) != 0 { - r.err = fmt.Errorf("subresource already set to %q, cannot change to %q", r.resource, subresource) + r.err = fmt.Errorf("subresource already set to %q, cannot change to %q", r.subresource, subresource) return r } for _, s := range subresources { @@ -577,7 +577,7 @@ func (r Request) finalURLTemplate() url.URL { return *url } -func (r *Request) tryThrottle(ctx context.Context) error { +func (r *Request) tryThrottleWithInfo(ctx context.Context, retryInfo string) error { if r.rateLimiter == nil { return nil } @@ -587,19 +587,32 @@ func (r *Request) tryThrottle(ctx context.Context) error { err := r.rateLimiter.Wait(ctx) latency := time.Since(now) + + var message string + switch { + case len(retryInfo) > 0: + message = fmt.Sprintf("Waited for %v, %s - request: %s:%s", latency, retryInfo, r.verb, r.URL().String()) + default: + message = fmt.Sprintf("Waited for %v due to client-side throttling, not priority and fairness, request: %s:%s", latency, r.verb, r.URL().String()) + } + if latency > longThrottleLatency { - klog.V(3).Infof("Throttling request took %v, request: %s:%s", latency, r.verb, r.URL().String()) + klog.V(3).Info(message) } if latency > extraLongThrottleLatency { // If the rate limiter latency is very high, the log message should be printed at a higher log level, // but we use a throttled logger to prevent spamming. - globalThrottledLogger.Infof("Throttling request took %v, request: %s:%s", latency, r.verb, r.URL().String()) + globalThrottledLogger.Infof(message) } - metrics.RateLimiterLatency.Observe(r.verb, r.finalURLTemplate(), latency) + metrics.RateLimiterLatency.Observe(ctx, r.verb, r.finalURLTemplate(), latency) return err } +func (r *Request) tryThrottle(ctx context.Context) error { + return r.tryThrottleWithInfo(ctx, "") +} + type throttleSettings struct { logLevel klog.Level minLogInterval time.Duration @@ -678,7 +691,7 @@ func (r *Request) Watch(ctx context.Context) (watch.Interface, error) { } r.backoff.Sleep(r.backoff.CalculateBackoff(r.URL())) resp, err := client.Do(req) - updateURLMetrics(r, resp, err) + updateURLMetrics(ctx, r, resp, err) if r.c.base != nil { if err != nil { r.backoff.UpdateBackoff(r.c.base, err, 0) @@ -727,7 +740,7 @@ func (r *Request) Watch(ctx context.Context) (watch.Interface, error) { // updateURLMetrics is a convenience function for pushing metrics. // It also handles corner cases for incomplete/invalid request data. -func updateURLMetrics(req *Request, resp *http.Response, err error) { +func updateURLMetrics(ctx context.Context, req *Request, resp *http.Response, err error) { url := "none" if req.c.base != nil { url = req.c.base.Host @@ -736,10 +749,10 @@ func updateURLMetrics(req *Request, resp *http.Response, err error) { // Errors can be arbitrary strings. Unbound label cardinality is not suitable for a metric // system so we just report them as ``. if err != nil { - metrics.RequestResult.Increment("", req.verb, url) + metrics.RequestResult.Increment(ctx, "", req.verb, url) } else { //Metrics for failure codes - metrics.RequestResult.Increment(strconv.Itoa(resp.StatusCode), req.verb, url) + metrics.RequestResult.Increment(ctx, strconv.Itoa(resp.StatusCode), req.verb, url) } } @@ -772,7 +785,7 @@ func (r *Request) Stream(ctx context.Context) (io.ReadCloser, error) { } r.backoff.Sleep(r.backoff.CalculateBackoff(r.URL())) resp, err := client.Do(req) - updateURLMetrics(r, resp, err) + updateURLMetrics(ctx, r, resp, err) if r.c.base != nil { if err != nil { r.backoff.UpdateBackoff(r.URL(), err, 0) @@ -837,7 +850,7 @@ func (r *Request) request(ctx context.Context, fn func(*http.Request, *http.Resp //Metrics for total request latency start := time.Now() defer func() { - metrics.RequestLatency.Observe(r.verb, r.finalURLTemplate(), time.Since(start)) + metrics.RequestLatency.Observe(ctx, r.verb, r.finalURLTemplate(), time.Since(start)) }() if r.err != nil { @@ -869,6 +882,7 @@ func (r *Request) request(ctx context.Context, fn func(*http.Request, *http.Resp // Right now we make about ten retry attempts if we get a Retry-After response. retries := 0 + var retryInfo string for { url := r.URL().String() @@ -884,12 +898,13 @@ func (r *Request) request(ctx context.Context, fn func(*http.Request, *http.Resp // We are retrying the request that we already send to apiserver // at least once before. // This request should also be throttled with the client-internal rate limiter. - if err := r.tryThrottle(ctx); err != nil { + if err := r.tryThrottleWithInfo(ctx, retryInfo); err != nil { return err } + retryInfo = "" } resp, err := client.Do(req) - updateURLMetrics(r, resp, err) + updateURLMetrics(ctx, r, resp, err) if err != nil { r.backoff.UpdateBackoff(r.URL(), err, 0) } else { @@ -931,6 +946,7 @@ func (r *Request) request(ctx context.Context, fn func(*http.Request, *http.Resp retries++ if seconds, wait := checkWait(resp); wait && retries <= r.maxRetries { + retryInfo = getRetryReason(retries, seconds, resp, err) if seeker, ok := r.body.(io.Seeker); ok && r.body != nil { _, err := seeker.Seek(0, 0) if err != nil { @@ -1204,6 +1220,26 @@ func retryAfterSeconds(resp *http.Response) (int, bool) { return 0, false } +func getRetryReason(retries, seconds int, resp *http.Response, err error) string { + // priority and fairness sets the UID of the FlowSchema associated with a request + // in the following response Header. + const responseHeaderMatchedFlowSchemaUID = "X-Kubernetes-PF-FlowSchema-UID" + + message := fmt.Sprintf("retries: %d, retry-after: %ds", retries, seconds) + + switch { + case resp.StatusCode == http.StatusTooManyRequests: + // it is server-side throttling from priority and fairness + flowSchemaUID := resp.Header.Get(responseHeaderMatchedFlowSchemaUID) + return fmt.Sprintf("%s - retry-reason: due to server-side throttling, FlowSchema UID: %q", message, flowSchemaUID) + case err != nil: + // it's a retriable error + return fmt.Sprintf("%s - retry-reason: due to retriable error, error: %v", message, err) + default: + return fmt.Sprintf("%s - retry-reason: %d", message, resp.StatusCode) + } +} + // Result contains the result of calling Request.Do(). type Result struct { body []byte diff --git a/vendor/k8s.io/client-go/rest/watch/BUILD b/vendor/k8s.io/client-go/rest/watch/BUILD deleted file mode 100644 index 7e8883deb5a8..000000000000 --- a/vendor/k8s.io/client-go/rest/watch/BUILD +++ /dev/null @@ -1,56 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "decoder.go", - "encoder.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/rest/watch", - importpath = "k8s.io/client-go/rest/watch", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/streaming:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "decoder_test.go", - "encoder_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/json:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/streaming:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/restmapper/BUILD b/vendor/k8s.io/client-go/restmapper/BUILD deleted file mode 100644 index a2301eede96c..000000000000 --- a/vendor/k8s.io/client-go/restmapper/BUILD +++ /dev/null @@ -1,57 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "category_expansion.go", - "discovery.go", - "shortcut.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/restmapper", - importpath = "k8s.io/client-go/restmapper", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/client-go/discovery:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "category_expansion_test.go", - "discovery_test.go", - "shortcut_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/version:go_default_library", - "//staging/src/k8s.io/client-go/discovery:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/rest/fake:go_default_library", - "//vendor/github.com/davecgh/go-spew/spew:go_default_library", - "//vendor/github.com/googleapis/gnostic/openapiv2:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/scale/BUILD b/vendor/k8s.io/client-go/scale/BUILD deleted file mode 100644 index f4c590ec4116..000000000000 --- a/vendor/k8s.io/client-go/scale/BUILD +++ /dev/null @@ -1,80 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "client.go", - "doc.go", - "interfaces.go", - "util.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/scale", - importpath = "k8s.io/client-go/scale", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/client-go/discovery:go_default_library", - "//staging/src/k8s.io/client-go/dynamic:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/scale/scheme:go_default_library", - "//staging/src/k8s.io/client-go/scale/scheme/appsint:go_default_library", - "//staging/src/k8s.io/client-go/scale/scheme/appsv1beta1:go_default_library", - "//staging/src/k8s.io/client-go/scale/scheme/appsv1beta2:go_default_library", - "//staging/src/k8s.io/client-go/scale/scheme/autoscalingv1:go_default_library", - "//staging/src/k8s.io/client-go/scale/scheme/extensionsint:go_default_library", - "//staging/src/k8s.io/client-go/scale/scheme/extensionsv1beta1:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "client_test.go", - "roundtrip_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/apps/v1beta1:go_default_library", - "//staging/src/k8s.io/api/apps/v1beta2:go_default_library", - "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/apitesting/roundtrip:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/client-go/discovery/fake:go_default_library", - "//staging/src/k8s.io/client-go/dynamic:go_default_library", - "//staging/src/k8s.io/client-go/rest/fake:go_default_library", - "//staging/src/k8s.io/client-go/restmapper:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - "//vendor/github.com/evanphx/json-patch:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/scale/fake:all-srcs", - "//staging/src/k8s.io/client-go/scale/scheme:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/scale/scheme/BUILD b/vendor/k8s.io/client-go/scale/scheme/BUILD deleted file mode 100644 index 634bc5dd91bf..000000000000 --- a/vendor/k8s.io/client-go/scale/scheme/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/scale/scheme", - importpath = "k8s.io/client-go/scale/scheme", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/scale/scheme/appsint:all-srcs", - "//staging/src/k8s.io/client-go/scale/scheme/appsv1beta1:all-srcs", - "//staging/src/k8s.io/client-go/scale/scheme/appsv1beta2:all-srcs", - "//staging/src/k8s.io/client-go/scale/scheme/autoscalingv1:all-srcs", - "//staging/src/k8s.io/client-go/scale/scheme/extensionsint:all-srcs", - "//staging/src/k8s.io/client-go/scale/scheme/extensionsv1beta1:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/scale/scheme/appsint/BUILD b/vendor/k8s.io/client-go/scale/scheme/appsint/BUILD deleted file mode 100644 index 715d4077afac..000000000000 --- a/vendor/k8s.io/client-go/scale/scheme/appsint/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/scale/scheme/appsint", - importpath = "k8s.io/client-go/scale/scheme/appsint", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/apps/v1beta2:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/client-go/scale/scheme:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/scale/scheme/appsv1beta1/BUILD b/vendor/k8s.io/client-go/scale/scheme/appsv1beta1/BUILD deleted file mode 100644 index e6c1c513e1cf..000000000000 --- a/vendor/k8s.io/client-go/scale/scheme/appsv1beta1/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "doc.go", - "register.go", - "zz_generated.conversion.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/scale/scheme/appsv1beta1", - importpath = "k8s.io/client-go/scale/scheme/appsv1beta1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/apps/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/client-go/scale/scheme:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/scale/scheme/appsv1beta2/BUILD b/vendor/k8s.io/client-go/scale/scheme/appsv1beta2/BUILD deleted file mode 100644 index bbb605a0e9ad..000000000000 --- a/vendor/k8s.io/client-go/scale/scheme/appsv1beta2/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "doc.go", - "register.go", - "zz_generated.conversion.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/scale/scheme/appsv1beta2", - importpath = "k8s.io/client-go/scale/scheme/appsv1beta2", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/apps/v1beta2:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/client-go/scale/scheme:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/scale/scheme/autoscalingv1/BUILD b/vendor/k8s.io/client-go/scale/scheme/autoscalingv1/BUILD deleted file mode 100644 index cea381d612a8..000000000000 --- a/vendor/k8s.io/client-go/scale/scheme/autoscalingv1/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "doc.go", - "register.go", - "zz_generated.conversion.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/scale/scheme/autoscalingv1", - importpath = "k8s.io/client-go/scale/scheme/autoscalingv1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/client-go/scale/scheme:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/scale/scheme/extensionsint/BUILD b/vendor/k8s.io/client-go/scale/scheme/extensionsint/BUILD deleted file mode 100644 index 49c10f370a27..000000000000 --- a/vendor/k8s.io/client-go/scale/scheme/extensionsint/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/scale/scheme/extensionsint", - importpath = "k8s.io/client-go/scale/scheme/extensionsint", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/client-go/scale/scheme:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/scale/scheme/extensionsv1beta1/BUILD b/vendor/k8s.io/client-go/scale/scheme/extensionsv1beta1/BUILD deleted file mode 100644 index 58ff5aa6e46c..000000000000 --- a/vendor/k8s.io/client-go/scale/scheme/extensionsv1beta1/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "doc.go", - "register.go", - "zz_generated.conversion.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/scale/scheme/extensionsv1beta1", - importpath = "k8s.io/client-go/scale/scheme/extensionsv1beta1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/client-go/scale/scheme:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/testing/BUILD b/vendor/k8s.io/client-go/testing/BUILD deleted file mode 100644 index 44706ac0d934..000000000000 --- a/vendor/k8s.io/client-go/testing/BUILD +++ /dev/null @@ -1,66 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "actions.go", - "fake.go", - "fixture.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/testing", - importpath = "k8s.io/client-go/testing", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/json:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//vendor/github.com/evanphx/json-patch:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "fake_test.go", - "fixture_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/third_party/forked/golang/template/BUILD b/vendor/k8s.io/client-go/third_party/forked/golang/template/BUILD deleted file mode 100644 index 6d86954db9f1..000000000000 --- a/vendor/k8s.io/client-go/third_party/forked/golang/template/BUILD +++ /dev/null @@ -1,29 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "exec.go", - "funcs.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/third_party/forked/golang/template", - importpath = "k8s.io/client-go/third_party/forked/golang/template", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/tools/auth/BUILD b/vendor/k8s.io/client-go/tools/auth/BUILD deleted file mode 100644 index 1ecf2715dfd3..000000000000 --- a/vendor/k8s.io/client-go/tools/auth/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["clientauth.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/tools/auth", - importpath = "k8s.io/client-go/tools/auth", - deps = ["//staging/src/k8s.io/client-go/rest:go_default_library"], -) - -go_test( - name = "go_default_test", - srcs = ["clientauth_test.go"], - embed = [":go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/tools/auth/exec:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/tools/cache/BUILD b/vendor/k8s.io/client-go/tools/cache/BUILD deleted file mode 100644 index ec3fc196826b..000000000000 --- a/vendor/k8s.io/client-go/tools/cache/BUILD +++ /dev/null @@ -1,111 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "controller_test.go", - "delta_fifo_test.go", - "expiration_cache_test.go", - "fifo_test.go", - "heap_test.go", - "index_test.go", - "main_test.go", - "mutation_detector_test.go", - "processor_listener_test.go", - "reflector_test.go", - "shared_informer_test.go", - "store_test.go", - "thread_safe_store_test.go", - "undelta_store_test.go", - ], - embed = [":go_default_library"], - race = "off", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache/testing:go_default_library", - "//vendor/github.com/google/gofuzz:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "controller.go", - "delta_fifo.go", - "doc.go", - "expiration_cache.go", - "expiration_cache_fakes.go", - "fake_custom_store.go", - "fifo.go", - "heap.go", - "index.go", - "listers.go", - "listwatch.go", - "mutation_cache.go", - "mutation_detector.go", - "reflector.go", - "reflector_metrics.go", - "shared_informer.go", - "store.go", - "thread_safe_store.go", - "undelta_store.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/tools/cache", - importpath = "k8s.io/client-go/tools/cache", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/cache:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/naming:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/tools/pager:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/buffer:go_default_library", - "//vendor/k8s.io/utils/trace:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/tools/cache/testing:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/tools/cache/OWNERS b/vendor/k8s.io/client-go/tools/cache/OWNERS index 9d0a18771ece..6562ee5c7aa0 100644 --- a/vendor/k8s.io/client-go/tools/cache/OWNERS +++ b/vendor/k8s.io/client-go/tools/cache/OWNERS @@ -20,7 +20,6 @@ reviewers: - caesarxuchao - mikedanese - liggitt -- nikhiljindal - erictune - davidopp - pmorie @@ -29,7 +28,6 @@ reviewers: - soltysh - jsafrane - dims -- madhusudancs - hongchaodeng - krousey - xiang90 diff --git a/vendor/k8s.io/client-go/tools/cache/delta_fifo.go b/vendor/k8s.io/client-go/tools/cache/delta_fifo.go index 148b478d584b..f648673e1118 100644 --- a/vendor/k8s.io/client-go/tools/cache/delta_fifo.go +++ b/vendor/k8s.io/client-go/tools/cache/delta_fifo.go @@ -26,54 +26,6 @@ import ( "k8s.io/klog/v2" ) -// NewDeltaFIFO returns a Queue which can be used to process changes to items. -// -// keyFunc is used to figure out what key an object should have. (It is -// exposed in the returned DeltaFIFO's KeyOf() method, with additional handling -// around deleted objects and queue state). -// -// 'knownObjects' may be supplied to modify the behavior of Delete, -// Replace, and Resync. It may be nil if you do not need those -// modifications. -// -// TODO: consider merging keyLister with this object, tracking a list of -// "known" keys when Pop() is called. Have to think about how that -// affects error retrying. -// NOTE: It is possible to misuse this and cause a race when using an -// external known object source. -// Whether there is a potential race depends on how the consumer -// modifies knownObjects. In Pop(), process function is called under -// lock, so it is safe to update data structures in it that need to be -// in sync with the queue (e.g. knownObjects). -// -// Example: -// In case of sharedIndexInformer being a consumer -// (https://github.com/kubernetes/kubernetes/blob/0cdd940f/staging/ -// src/k8s.io/client-go/tools/cache/shared_informer.go#L192), -// there is no race as knownObjects (s.indexer) is modified safely -// under DeltaFIFO's lock. The only exceptions are GetStore() and -// GetIndexer() methods, which expose ways to modify the underlying -// storage. Currently these two methods are used for creating Lister -// and internal tests. -// -// Also see the comment on DeltaFIFO. -// -// Warning: This constructs a DeltaFIFO that does not differentiate between -// events caused by a call to Replace (e.g., from a relist, which may -// contain object updates), and synthetic events caused by a periodic resync -// (which just emit the existing object). See https://issue.k8s.io/86015 for details. -// -// Use `NewDeltaFIFOWithOptions(DeltaFIFOOptions{..., EmitDeltaTypeReplaced: true})` -// instead to receive a `Replaced` event depending on the type. -// -// Deprecated: Equivalent to NewDeltaFIFOWithOptions(DeltaFIFOOptions{KeyFunction: keyFunc, KnownObjects: knownObjects}) -func NewDeltaFIFO(keyFunc KeyFunc, knownObjects KeyListerGetter) *DeltaFIFO { - return NewDeltaFIFOWithOptions(DeltaFIFOOptions{ - KeyFunction: keyFunc, - KnownObjects: knownObjects, - }) -} - // DeltaFIFOOptions is the configuration parameters for DeltaFIFO. All are // optional. type DeltaFIFOOptions struct { @@ -99,25 +51,6 @@ type DeltaFIFOOptions struct { EmitDeltaTypeReplaced bool } -// NewDeltaFIFOWithOptions returns a Queue which can be used to process changes to -// items. See also the comment on DeltaFIFO. -func NewDeltaFIFOWithOptions(opts DeltaFIFOOptions) *DeltaFIFO { - if opts.KeyFunction == nil { - opts.KeyFunction = MetaNamespaceKeyFunc - } - - f := &DeltaFIFO{ - items: map[string]Deltas{}, - queue: []string{}, - keyFunc: opts.KeyFunction, - knownObjects: opts.KnownObjects, - - emitDeltaTypeReplaced: opts.EmitDeltaTypeReplaced, - } - f.cond.L = &f.lock - return f -} - // DeltaFIFO is like FIFO, but differs in two ways. One is that the // accumulator associated with a given object's key is not that object // but rather a Deltas, which is a slice of Delta values for that @@ -128,8 +61,11 @@ func NewDeltaFIFOWithOptions(opts DeltaFIFOOptions) *DeltaFIFO { // Deleted if the older Deleted's object is a // DeletedFinalStateUnknown. // -// The other difference is that DeltaFIFO has an additional way that -// an object can be applied to an accumulator, called Sync. +// The other difference is that DeltaFIFO has two additional ways that +// an object can be applied to an accumulator: Replaced and Sync. +// If EmitDeltaTypeReplaced is not set to true, Sync will be used in +// replace events for backwards compatibility. Sync is used for periodic +// resync events. // // DeltaFIFO is a producer-consumer queue, where a Reflector is // intended to be the producer, and the consumer is whatever calls @@ -193,6 +129,107 @@ type DeltaFIFO struct { emitDeltaTypeReplaced bool } +// DeltaType is the type of a change (addition, deletion, etc) +type DeltaType string + +// Change type definition +const ( + Added DeltaType = "Added" + Updated DeltaType = "Updated" + Deleted DeltaType = "Deleted" + // Replaced is emitted when we encountered watch errors and had to do a + // relist. We don't know if the replaced object has changed. + // + // NOTE: Previous versions of DeltaFIFO would use Sync for Replace events + // as well. Hence, Replaced is only emitted when the option + // EmitDeltaTypeReplaced is true. + Replaced DeltaType = "Replaced" + // Sync is for synthetic events during a periodic resync. + Sync DeltaType = "Sync" +) + +// Delta is a member of Deltas (a list of Delta objects) which +// in its turn is the type stored by a DeltaFIFO. It tells you what +// change happened, and the object's state after* that change. +// +// [*] Unless the change is a deletion, and then you'll get the final +// state of the object before it was deleted. +type Delta struct { + Type DeltaType + Object interface{} +} + +// Deltas is a list of one or more 'Delta's to an individual object. +// The oldest delta is at index 0, the newest delta is the last one. +type Deltas []Delta + +// NewDeltaFIFO returns a Queue which can be used to process changes to items. +// +// keyFunc is used to figure out what key an object should have. (It is +// exposed in the returned DeltaFIFO's KeyOf() method, with additional handling +// around deleted objects and queue state). +// +// 'knownObjects' may be supplied to modify the behavior of Delete, +// Replace, and Resync. It may be nil if you do not need those +// modifications. +// +// TODO: consider merging keyLister with this object, tracking a list of +// "known" keys when Pop() is called. Have to think about how that +// affects error retrying. +// NOTE: It is possible to misuse this and cause a race when using an +// external known object source. +// Whether there is a potential race depends on how the consumer +// modifies knownObjects. In Pop(), process function is called under +// lock, so it is safe to update data structures in it that need to be +// in sync with the queue (e.g. knownObjects). +// +// Example: +// In case of sharedIndexInformer being a consumer +// (https://github.com/kubernetes/kubernetes/blob/0cdd940f/staging/ +// src/k8s.io/client-go/tools/cache/shared_informer.go#L192), +// there is no race as knownObjects (s.indexer) is modified safely +// under DeltaFIFO's lock. The only exceptions are GetStore() and +// GetIndexer() methods, which expose ways to modify the underlying +// storage. Currently these two methods are used for creating Lister +// and internal tests. +// +// Also see the comment on DeltaFIFO. +// +// Warning: This constructs a DeltaFIFO that does not differentiate between +// events caused by a call to Replace (e.g., from a relist, which may +// contain object updates), and synthetic events caused by a periodic resync +// (which just emit the existing object). See https://issue.k8s.io/86015 for details. +// +// Use `NewDeltaFIFOWithOptions(DeltaFIFOOptions{..., EmitDeltaTypeReplaced: true})` +// instead to receive a `Replaced` event depending on the type. +// +// Deprecated: Equivalent to NewDeltaFIFOWithOptions(DeltaFIFOOptions{KeyFunction: keyFunc, KnownObjects: knownObjects}) +func NewDeltaFIFO(keyFunc KeyFunc, knownObjects KeyListerGetter) *DeltaFIFO { + return NewDeltaFIFOWithOptions(DeltaFIFOOptions{ + KeyFunction: keyFunc, + KnownObjects: knownObjects, + }) +} + +// NewDeltaFIFOWithOptions returns a Queue which can be used to process changes to +// items. See also the comment on DeltaFIFO. +func NewDeltaFIFOWithOptions(opts DeltaFIFOOptions) *DeltaFIFO { + if opts.KeyFunction == nil { + opts.KeyFunction = MetaNamespaceKeyFunc + } + + f := &DeltaFIFO{ + items: map[string]Deltas{}, + queue: []string{}, + keyFunc: opts.KeyFunction, + knownObjects: opts.KnownObjects, + + emitDeltaTypeReplaced: opts.EmitDeltaTypeReplaced, + } + f.cond.L = &f.lock + return f +} + var ( _ = Queue(&DeltaFIFO{}) // DeltaFIFO is a Queue ) @@ -572,7 +609,7 @@ func (f *DeltaFIFO) Replace(list []interface{}, resourceVersion string) error { f.populated = true // While there shouldn't be any queued deletions in the initial // population of the queue, it's better to be on the safe side. - f.initialPopulationCount = len(list) + queuedDeletions + f.initialPopulationCount = keys.Len() + queuedDeletions } return nil @@ -602,7 +639,7 @@ func (f *DeltaFIFO) Replace(list []interface{}, resourceVersion string) error { if !f.populated { f.populated = true - f.initialPopulationCount = len(list) + queuedDeletions + f.initialPopulationCount = keys.Len() + queuedDeletions } return nil @@ -673,39 +710,6 @@ type KeyGetter interface { GetByKey(key string) (value interface{}, exists bool, err error) } -// DeltaType is the type of a change (addition, deletion, etc) -type DeltaType string - -// Change type definition -const ( - Added DeltaType = "Added" - Updated DeltaType = "Updated" - Deleted DeltaType = "Deleted" - // Replaced is emitted when we encountered watch errors and had to do a - // relist. We don't know if the replaced object has changed. - // - // NOTE: Previous versions of DeltaFIFO would use Sync for Replace events - // as well. Hence, Replaced is only emitted when the option - // EmitDeltaTypeReplaced is true. - Replaced DeltaType = "Replaced" - // Sync is for synthetic events during a periodic resync. - Sync DeltaType = "Sync" -) - -// Delta is the type stored by a DeltaFIFO. It tells you what change -// happened, and the object's state after* that change. -// -// [*] Unless the change is a deletion, and then you'll get the final -// state of the object before it was deleted. -type Delta struct { - Type DeltaType - Object interface{} -} - -// Deltas is a list of one or more 'Delta's to an individual object. -// The oldest delta is at index 0, the newest delta is the last one. -type Deltas []Delta - // Oldest is a convenience function that returns the oldest delta, or // nil if there are no deltas. func (d Deltas) Oldest() *Delta { diff --git a/vendor/k8s.io/client-go/tools/clientcmd/BUILD b/vendor/k8s.io/client-go/tools/clientcmd/BUILD deleted file mode 100644 index 0225ea683376..000000000000 --- a/vendor/k8s.io/client-go/tools/clientcmd/BUILD +++ /dev/null @@ -1,79 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "client_config_test.go", - "loader_test.go", - "merged_client_builder_test.go", - "overrides_test.go", - "validation_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/tools/clientcmd/api:go_default_library", - "//staging/src/k8s.io/client-go/tools/clientcmd/api/latest:go_default_library", - "//vendor/github.com/imdario/mergo:go_default_library", - "//vendor/github.com/spf13/pflag:go_default_library", - "//vendor/sigs.k8s.io/yaml:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "auth_loaders.go", - "client_config.go", - "config.go", - "doc.go", - "flag.go", - "helpers.go", - "loader.go", - "merged_client_builder.go", - "overrides.go", - "validation.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/tools/clientcmd", - importpath = "k8s.io/client-go/tools/clientcmd", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/tools/auth:go_default_library", - "//staging/src/k8s.io/client-go/tools/clientcmd/api:go_default_library", - "//staging/src/k8s.io/client-go/tools/clientcmd/api/latest:go_default_library", - "//staging/src/k8s.io/client-go/util/homedir:go_default_library", - "//vendor/github.com/imdario/mergo:go_default_library", - "//vendor/github.com/spf13/pflag:go_default_library", - "//vendor/golang.org/x/crypto/ssh/terminal:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/tools/clientcmd/api:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/tools/clientcmd/api/BUILD b/vendor/k8s.io/client-go/tools/clientcmd/api/BUILD deleted file mode 100644 index ce7dac4fb52a..000000000000 --- a/vendor/k8s.io/client-go/tools/clientcmd/api/BUILD +++ /dev/null @@ -1,51 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "helpers_test.go", - "types_test.go", - ], - embed = [":go_default_library"], - deps = ["//vendor/sigs.k8s.io/yaml:go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "helpers.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/tools/clientcmd/api", - importpath = "k8s.io/client-go/tools/clientcmd/api", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/tools/clientcmd/api/latest:all-srcs", - "//staging/src/k8s.io/client-go/tools/clientcmd/api/v1:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/tools/clientcmd/api/latest/BUILD b/vendor/k8s.io/client-go/tools/clientcmd/api/latest/BUILD deleted file mode 100644 index 007ce0d9cde6..000000000000 --- a/vendor/k8s.io/client-go/tools/clientcmd/api/latest/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["latest.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/tools/clientcmd/api/latest", - importpath = "k8s.io/client-go/tools/clientcmd/api/latest", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/json:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/versioning:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/client-go/tools/clientcmd/api:go_default_library", - "//staging/src/k8s.io/client-go/tools/clientcmd/api/v1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/tools/clientcmd/api/v1/BUILD b/vendor/k8s.io/client-go/tools/clientcmd/api/v1/BUILD deleted file mode 100644 index 2685a08ecbd5..000000000000 --- a/vendor/k8s.io/client-go/tools/clientcmd/api/v1/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "doc.go", - "register.go", - "types.go", - "zz_generated.conversion.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/tools/clientcmd/api/v1", - importpath = "k8s.io/client-go/tools/clientcmd/api/v1", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/client-go/tools/clientcmd/api:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/tools/clientcmd/auth_loaders.go b/vendor/k8s.io/client-go/tools/clientcmd/auth_loaders.go index 1d3c11d8fc0b..0e41277628a5 100644 --- a/vendor/k8s.io/client-go/tools/clientcmd/auth_loaders.go +++ b/vendor/k8s.io/client-go/tools/clientcmd/auth_loaders.go @@ -23,7 +23,7 @@ import ( "io/ioutil" "os" - "golang.org/x/crypto/ssh/terminal" + "golang.org/x/term" clientauth "k8s.io/client-go/tools/auth" ) @@ -90,8 +90,8 @@ func promptForString(field string, r io.Reader, show bool) (result string, err e _, err = fmt.Fscan(r, &result) } else { var data []byte - if terminal.IsTerminal(int(os.Stdin.Fd())) { - data, err = terminal.ReadPassword(int(os.Stdin.Fd())) + if term.IsTerminal(int(os.Stdin.Fd())) { + data, err = term.ReadPassword(int(os.Stdin.Fd())) result = string(data) } else { return "", fmt.Errorf("error reading input for %s", field) diff --git a/vendor/k8s.io/client-go/tools/clientcmd/client_config.go b/vendor/k8s.io/client-go/tools/clientcmd/client_config.go index 9e1cd64a09e4..0a905490c902 100644 --- a/vendor/k8s.io/client-go/tools/clientcmd/client_config.go +++ b/vendor/k8s.io/client-go/tools/clientcmd/client_config.go @@ -198,13 +198,13 @@ func (config *DirectClientConfig) ClientConfig() (*restclient.Config, error) { if err != nil { return nil, err } - mergo.MergeWithOverwrite(clientConfig, userAuthPartialConfig) + mergo.Merge(clientConfig, userAuthPartialConfig, mergo.WithOverride) serverAuthPartialConfig, err := getServerIdentificationPartialConfig(configAuthInfo, configClusterInfo) if err != nil { return nil, err } - mergo.MergeWithOverwrite(clientConfig, serverAuthPartialConfig) + mergo.Merge(clientConfig, serverAuthPartialConfig, mergo.WithOverride) } return clientConfig, nil @@ -225,7 +225,7 @@ func getServerIdentificationPartialConfig(configAuthInfo clientcmdapi.AuthInfo, configClientConfig.CAData = configClusterInfo.CertificateAuthorityData configClientConfig.Insecure = configClusterInfo.InsecureSkipTLSVerify configClientConfig.ServerName = configClusterInfo.TLSServerName - mergo.MergeWithOverwrite(mergedConfig, configClientConfig) + mergo.Merge(mergedConfig, configClientConfig, mergo.WithOverride) return mergedConfig, nil } @@ -294,8 +294,8 @@ func (config *DirectClientConfig) getUserIdentificationPartialConfig(configAuthI promptedConfig := makeUserIdentificationConfig(*promptedAuthInfo) previouslyMergedConfig := mergedConfig mergedConfig = &restclient.Config{} - mergo.MergeWithOverwrite(mergedConfig, promptedConfig) - mergo.MergeWithOverwrite(mergedConfig, previouslyMergedConfig) + mergo.Merge(mergedConfig, promptedConfig, mergo.WithOverride) + mergo.Merge(mergedConfig, previouslyMergedConfig, mergo.WithOverride) config.promptedCredentials.username = mergedConfig.Username config.promptedCredentials.password = mergedConfig.Password } @@ -463,12 +463,12 @@ func (config *DirectClientConfig) getContext() (clientcmdapi.Context, error) { mergedContext := clientcmdapi.NewContext() if configContext, exists := contexts[contextName]; exists { - mergo.MergeWithOverwrite(mergedContext, configContext) + mergo.Merge(mergedContext, configContext, mergo.WithOverride) } else if required { return clientcmdapi.Context{}, fmt.Errorf("context %q does not exist", contextName) } if config.overrides != nil { - mergo.MergeWithOverwrite(mergedContext, config.overrides.Context) + mergo.Merge(mergedContext, config.overrides.Context, mergo.WithOverride) } return *mergedContext, nil @@ -481,12 +481,12 @@ func (config *DirectClientConfig) getAuthInfo() (clientcmdapi.AuthInfo, error) { mergedAuthInfo := clientcmdapi.NewAuthInfo() if configAuthInfo, exists := authInfos[authInfoName]; exists { - mergo.MergeWithOverwrite(mergedAuthInfo, configAuthInfo) + mergo.Merge(mergedAuthInfo, configAuthInfo, mergo.WithOverride) } else if required { return clientcmdapi.AuthInfo{}, fmt.Errorf("auth info %q does not exist", authInfoName) } if config.overrides != nil { - mergo.MergeWithOverwrite(mergedAuthInfo, config.overrides.AuthInfo) + mergo.Merge(mergedAuthInfo, config.overrides.AuthInfo, mergo.WithOverride) } return *mergedAuthInfo, nil @@ -499,15 +499,15 @@ func (config *DirectClientConfig) getCluster() (clientcmdapi.Cluster, error) { mergedClusterInfo := clientcmdapi.NewCluster() if config.overrides != nil { - mergo.MergeWithOverwrite(mergedClusterInfo, config.overrides.ClusterDefaults) + mergo.Merge(mergedClusterInfo, config.overrides.ClusterDefaults, mergo.WithOverride) } if configClusterInfo, exists := clusterInfos[clusterInfoName]; exists { - mergo.MergeWithOverwrite(mergedClusterInfo, configClusterInfo) + mergo.Merge(mergedClusterInfo, configClusterInfo, mergo.WithOverride) } else if required { return clientcmdapi.Cluster{}, fmt.Errorf("cluster %q does not exist", clusterInfoName) } if config.overrides != nil { - mergo.MergeWithOverwrite(mergedClusterInfo, config.overrides.ClusterInfo) + mergo.Merge(mergedClusterInfo, config.overrides.ClusterInfo, mergo.WithOverride) } // * An override of --insecure-skip-tls-verify=true and no accompanying CA/CA data should clear already-set CA/CA data @@ -548,11 +548,12 @@ func (config *inClusterClientConfig) RawConfig() (clientcmdapi.Config, error) { } func (config *inClusterClientConfig) ClientConfig() (*restclient.Config, error) { - if config.inClusterConfigProvider == nil { - config.inClusterConfigProvider = restclient.InClusterConfig + inClusterConfigProvider := config.inClusterConfigProvider + if inClusterConfigProvider == nil { + inClusterConfigProvider = restclient.InClusterConfig } - icc, err := config.inClusterConfigProvider() + icc, err := inClusterConfigProvider() if err != nil { return nil, err } @@ -572,7 +573,7 @@ func (config *inClusterClientConfig) ClientConfig() (*restclient.Config, error) } } - return icc, err + return icc, nil } func (config *inClusterClientConfig) Namespace() (string, bool, error) { @@ -611,7 +612,7 @@ func (config *inClusterClientConfig) Possible() bool { // to the default config. func BuildConfigFromFlags(masterUrl, kubeconfigPath string) (*restclient.Config, error) { if kubeconfigPath == "" && masterUrl == "" { - klog.Warningf("Neither --kubeconfig nor --master was specified. Using the inClusterConfig. This might not work.") + klog.Warning("Neither --kubeconfig nor --master was specified. Using the inClusterConfig. This might not work.") kubeconfig, err := restclient.InClusterConfig() if err == nil { return kubeconfig, nil diff --git a/vendor/k8s.io/client-go/tools/clientcmd/config.go b/vendor/k8s.io/client-go/tools/clientcmd/config.go index a7eae66bfad2..12c8b84f3778 100644 --- a/vendor/k8s.io/client-go/tools/clientcmd/config.go +++ b/vendor/k8s.io/client-go/tools/clientcmd/config.go @@ -374,7 +374,7 @@ func (p *persister) Persist(config map[string]string) error { authInfo, ok := newConfig.AuthInfos[p.user] if ok && authInfo.AuthProvider != nil { authInfo.AuthProvider.Config = config - ModifyConfig(p.configAccess, *newConfig, false) + return ModifyConfig(p.configAccess, *newConfig, false) } return nil } diff --git a/vendor/k8s.io/client-go/tools/clientcmd/loader.go b/vendor/k8s.io/client-go/tools/clientcmd/loader.go index 901ed50c424d..78bd9ed8d5c0 100644 --- a/vendor/k8s.io/client-go/tools/clientcmd/loader.go +++ b/vendor/k8s.io/client-go/tools/clientcmd/loader.go @@ -18,10 +18,8 @@ package clientcmd import ( "fmt" - "io" "io/ioutil" "os" - "path" "path/filepath" "reflect" goruntime "runtime" @@ -48,24 +46,24 @@ const ( ) var ( - RecommendedConfigDir = path.Join(homedir.HomeDir(), RecommendedHomeDir) - RecommendedHomeFile = path.Join(RecommendedConfigDir, RecommendedFileName) - RecommendedSchemaFile = path.Join(RecommendedConfigDir, RecommendedSchemaName) + RecommendedConfigDir = filepath.Join(homedir.HomeDir(), RecommendedHomeDir) + RecommendedHomeFile = filepath.Join(RecommendedConfigDir, RecommendedFileName) + RecommendedSchemaFile = filepath.Join(RecommendedConfigDir, RecommendedSchemaName) ) // currentMigrationRules returns a map that holds the history of recommended home directories used in previous versions. // Any future changes to RecommendedHomeFile and related are expected to add a migration rule here, in order to make // sure existing config files are migrated to their new locations properly. func currentMigrationRules() map[string]string { - oldRecommendedHomeFile := path.Join(os.Getenv("HOME"), "/.kube/.kubeconfig") - oldRecommendedWindowsHomeFile := path.Join(os.Getenv("HOME"), RecommendedHomeDir, RecommendedFileName) - - migrationRules := map[string]string{} - migrationRules[RecommendedHomeFile] = oldRecommendedHomeFile + var oldRecommendedHomeFileName string if goruntime.GOOS == "windows" { - migrationRules[RecommendedHomeFile] = oldRecommendedWindowsHomeFile + oldRecommendedHomeFileName = RecommendedFileName + } else { + oldRecommendedHomeFileName = ".kubeconfig" + } + return map[string]string{ + RecommendedHomeFile: filepath.Join(os.Getenv("HOME"), RecommendedHomeDir, oldRecommendedHomeFileName), } - return migrationRules } type ClientConfigLoader interface { @@ -227,7 +225,7 @@ func (rules *ClientConfigLoadingRules) Load() (*clientcmdapi.Config, error) { mapConfig := clientcmdapi.NewConfig() for _, kubeconfig := range kubeconfigs { - mergo.MergeWithOverwrite(mapConfig, kubeconfig) + mergo.Merge(mapConfig, kubeconfig, mergo.WithOverride) } // merge all of the struct values in the reverse order so that priority is given correctly @@ -235,14 +233,14 @@ func (rules *ClientConfigLoadingRules) Load() (*clientcmdapi.Config, error) { nonMapConfig := clientcmdapi.NewConfig() for i := len(kubeconfigs) - 1; i >= 0; i-- { kubeconfig := kubeconfigs[i] - mergo.MergeWithOverwrite(nonMapConfig, kubeconfig) + mergo.Merge(nonMapConfig, kubeconfig, mergo.WithOverride) } // since values are overwritten, but maps values are not, we can merge the non-map config on top of the map config and // get the values we expect. config := clientcmdapi.NewConfig() - mergo.MergeWithOverwrite(config, mapConfig) - mergo.MergeWithOverwrite(config, nonMapConfig) + mergo.Merge(config, mapConfig, mergo.WithOverride) + mergo.Merge(config, nonMapConfig, mergo.WithOverride) if rules.ResolvePaths() { if err := ResolveLocalPaths(config); err != nil { @@ -283,20 +281,15 @@ func (rules *ClientConfigLoadingRules) Migrate() error { return fmt.Errorf("cannot migrate %v to %v because it is a directory", source, destination) } - in, err := os.Open(source) + data, err := ioutil.ReadFile(source) if err != nil { return err } - defer in.Close() - out, err := os.Create(destination) + // destination is created with mode 0666 before umask + err = ioutil.WriteFile(destination, data, 0666) if err != nil { return err } - defer out.Close() - - if _, err = io.Copy(out, in); err != nil { - return err - } } return nil diff --git a/vendor/k8s.io/client-go/tools/events/BUILD b/vendor/k8s.io/client-go/tools/events/BUILD deleted file mode 100644 index fa0f66031f5b..000000000000 --- a/vendor/k8s.io/client-go/tools/events/BUILD +++ /dev/null @@ -1,68 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "event_broadcaster.go", - "event_recorder.go", - "fake.go", - "interfaces.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/tools/events", - importpath = "k8s.io/client-go/tools/events", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/events/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/json:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/events/v1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/client-go/tools/record/util:go_default_library", - "//staging/src/k8s.io/client-go/tools/reference:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["eventseries_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/events/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/tools/reference:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/tools/events/OWNERS b/vendor/k8s.io/client-go/tools/events/OWNERS index fbd0a6a013d7..05d68e687f31 100644 --- a/vendor/k8s.io/client-go/tools/events/OWNERS +++ b/vendor/k8s.io/client-go/tools/events/OWNERS @@ -1,8 +1,10 @@ # See the OWNERS docs at https://go.k8s.io/owners approvers: +- sig-instrumentation-approvers - yastij - wojtek-t reviewers: +- sig-instrumentation-reviewers - yastij - wojtek-t diff --git a/vendor/k8s.io/client-go/tools/leaderelection/BUILD b/vendor/k8s.io/client-go/tools/leaderelection/BUILD deleted file mode 100644 index feb49b900a3e..000000000000 --- a/vendor/k8s.io/client-go/tools/leaderelection/BUILD +++ /dev/null @@ -1,62 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "healthzadaptor.go", - "leaderelection.go", - "metrics.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/tools/leaderelection", - importpath = "k8s.io/client-go/tools/leaderelection", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/tools/leaderelection/resourcelock:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "healthzadaptor_test.go", - "leaderelection_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/coordination/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - "//staging/src/k8s.io/client-go/tools/leaderelection/resourcelock:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/tools/leaderelection/resourcelock:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/tools/leaderelection/OWNERS b/vendor/k8s.io/client-go/tools/leaderelection/OWNERS index 9ece5e1ea4b7..2ba793ee80fb 100644 --- a/vendor/k8s.io/client-go/tools/leaderelection/OWNERS +++ b/vendor/k8s.io/client-go/tools/leaderelection/OWNERS @@ -7,7 +7,6 @@ reviewers: - wojtek-t - deads2k - mikedanese -- gmarek - timothysc - ingvagabund - resouer diff --git a/vendor/k8s.io/client-go/tools/leaderelection/resourcelock/BUILD b/vendor/k8s.io/client-go/tools/leaderelection/resourcelock/BUILD deleted file mode 100644 index 1a983a05c46b..000000000000 --- a/vendor/k8s.io/client-go/tools/leaderelection/resourcelock/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "configmaplock.go", - "endpointslock.go", - "interface.go", - "leaselock.go", - "multilock.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/tools/leaderelection/resourcelock", - importpath = "k8s.io/client-go/tools/leaderelection/resourcelock", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/coordination/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/coordination/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/tools/leaderelection/resourcelock/interface.go b/vendor/k8s.io/client-go/tools/leaderelection/resourcelock/interface.go index c5d7ae3c571f..bc77c2eda889 100644 --- a/vendor/k8s.io/client-go/tools/leaderelection/resourcelock/interface.go +++ b/vendor/k8s.io/client-go/tools/leaderelection/resourcelock/interface.go @@ -145,10 +145,13 @@ func New(lockType string, ns string, name string, coreClient corev1.CoreV1Interf } // NewFromKubeconfig will create a lock of a given type according to the input parameters. +// Timeout set for a client used to contact to Kubernetes should be lower than +// RenewDeadline to keep a single hung request from forcing a leader loss. +// Setting it to max(time.Second, RenewDeadline/2) as a reasonable heuristic. func NewFromKubeconfig(lockType string, ns string, name string, rlc ResourceLockConfig, kubeconfig *restclient.Config, renewDeadline time.Duration) (Interface, error) { // shallow copy, do not modify the kubeconfig config := *kubeconfig - timeout := ((renewDeadline / time.Millisecond) / 2) * time.Millisecond + timeout := renewDeadline / 2 if timeout < time.Second { timeout = time.Second } diff --git a/vendor/k8s.io/client-go/tools/metrics/BUILD b/vendor/k8s.io/client-go/tools/metrics/BUILD deleted file mode 100644 index eafb30700299..000000000000 --- a/vendor/k8s.io/client-go/tools/metrics/BUILD +++ /dev/null @@ -1,26 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["metrics.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/tools/metrics", - importpath = "k8s.io/client-go/tools/metrics", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/tools/metrics/metrics.go b/vendor/k8s.io/client-go/tools/metrics/metrics.go index 5194026bdbf6..597dc8e53928 100644 --- a/vendor/k8s.io/client-go/tools/metrics/metrics.go +++ b/vendor/k8s.io/client-go/tools/metrics/metrics.go @@ -19,6 +19,7 @@ limitations under the License. package metrics import ( + "context" "net/url" "sync" "time" @@ -38,12 +39,18 @@ type ExpiryMetric interface { // LatencyMetric observes client latency partitioned by verb and url. type LatencyMetric interface { - Observe(verb string, u url.URL, latency time.Duration) + Observe(ctx context.Context, verb string, u url.URL, latency time.Duration) } // ResultMetric counts response codes partitioned by method and host. type ResultMetric interface { - Increment(code string, method string, host string) + Increment(ctx context.Context, code string, method string, host string) +} + +// CallsMetric counts calls that take place for a specific exec plugin. +type CallsMetric interface { + // Increment increments a counter per exitCode and callStatus. + Increment(exitCode int, callStatus string) } var ( @@ -57,6 +64,9 @@ var ( RateLimiterLatency LatencyMetric = noopLatency{} // RequestResult is the result metric that rest clients will update. RequestResult ResultMetric = noopResult{} + // ExecPluginCalls is the number of calls made to an exec plugin, partitioned by + // exit code and call status. + ExecPluginCalls CallsMetric = noopCalls{} ) // RegisterOpts contains all the metrics to register. Metrics may be nil. @@ -66,6 +76,7 @@ type RegisterOpts struct { RequestLatency LatencyMetric RateLimiterLatency LatencyMetric RequestResult ResultMetric + ExecPluginCalls CallsMetric } // Register registers metrics for the rest client to use. This can @@ -87,6 +98,9 @@ func Register(opts RegisterOpts) { if opts.RequestResult != nil { RequestResult = opts.RequestResult } + if opts.ExecPluginCalls != nil { + ExecPluginCalls = opts.ExecPluginCalls + } }) } @@ -100,8 +114,12 @@ func (noopExpiry) Set(*time.Time) {} type noopLatency struct{} -func (noopLatency) Observe(string, url.URL, time.Duration) {} +func (noopLatency) Observe(context.Context, string, url.URL, time.Duration) {} type noopResult struct{} -func (noopResult) Increment(string, string, string) {} +func (noopResult) Increment(context.Context, string, string, string) {} + +type noopCalls struct{} + +func (noopCalls) Increment(int, string) {} diff --git a/vendor/k8s.io/client-go/tools/pager/BUILD b/vendor/k8s.io/client-go/tools/pager/BUILD deleted file mode 100644 index 9cf8111a631f..000000000000 --- a/vendor/k8s.io/client-go/tools/pager/BUILD +++ /dev/null @@ -1,49 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["pager.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/tools/pager", - importpath = "k8s.io/client-go/tools/pager", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["pager_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - ], -) diff --git a/vendor/k8s.io/client-go/tools/portforward/BUILD b/vendor/k8s.io/client-go/tools/portforward/BUILD deleted file mode 100644 index e00624d3cdb2..000000000000 --- a/vendor/k8s.io/client-go/tools/portforward/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["portforward_test.go"], - embed = [":go_default_library"], - deps = ["//staging/src/k8s.io/apimachinery/pkg/util/httpstream:go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "portforward.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/tools/portforward", - importpath = "k8s.io/client-go/tools/portforward", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/tools/record/BUILD b/vendor/k8s.io/client-go/tools/record/BUILD deleted file mode 100644 index 66f00ea67b26..000000000000 --- a/vendor/k8s.io/client-go/tools/record/BUILD +++ /dev/null @@ -1,70 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "event.go", - "events_cache.go", - "fake.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/tools/record", - importpath = "k8s.io/client-go/tools/record", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/tools/record/util:go_default_library", - "//staging/src/k8s.io/client-go/tools/reference:go_default_library", - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//vendor/github.com/golang/groupcache/lru:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "event_test.go", - "events_cache_test.go", - "main_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/tools/reference:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/tools/record/util:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/tools/record/OWNERS b/vendor/k8s.io/client-go/tools/record/OWNERS index 792f356b0db1..e7e739b1503d 100644 --- a/vendor/k8s.io/client-go/tools/record/OWNERS +++ b/vendor/k8s.io/client-go/tools/record/OWNERS @@ -1,28 +1,6 @@ # See the OWNERS docs at https://go.k8s.io/owners reviewers: -- lavalamp -- smarterclayton -- wojtek-t -- deads2k -- derekwaynecarr -- caesarxuchao -- vishh -- mikedanese -- liggitt -- nikhiljindal -- erictune -- pmorie -- dchen1107 -- saad-ali -- luxas -- yifan-gu -- mwielgus -- timothysc -- jsafrane -- dims -- krousey -- a-robinson -- aveshagarwal -- resouer -- cjcullen +- sig-instrumentation-reviewers +approvers: +- sig-instrumentation-approvers diff --git a/vendor/k8s.io/client-go/tools/record/event.go b/vendor/k8s.io/client-go/tools/record/event.go index 48ef45bb5bc9..30a666019891 100644 --- a/vendor/k8s.io/client-go/tools/record/event.go +++ b/vendor/k8s.io/client-go/tools/record/event.go @@ -155,21 +155,21 @@ func (a *EventRecorderAdapter) Eventf(regarding, _ runtime.Object, eventtype, re // Creates a new event broadcaster. func NewBroadcaster() EventBroadcaster { return &eventBroadcasterImpl{ - Broadcaster: watch.NewBroadcaster(maxQueuedEvents, watch.DropIfChannelFull), + Broadcaster: watch.NewLongQueueBroadcaster(maxQueuedEvents, watch.DropIfChannelFull), sleepDuration: defaultSleepDuration, } } func NewBroadcasterForTests(sleepDuration time.Duration) EventBroadcaster { return &eventBroadcasterImpl{ - Broadcaster: watch.NewBroadcaster(maxQueuedEvents, watch.DropIfChannelFull), + Broadcaster: watch.NewLongQueueBroadcaster(maxQueuedEvents, watch.DropIfChannelFull), sleepDuration: sleepDuration, } } func NewBroadcasterWithCorrelatorOptions(options CorrelatorOptions) EventBroadcaster { return &eventBroadcasterImpl{ - Broadcaster: watch.NewBroadcaster(maxQueuedEvents, watch.DropIfChannelFull), + Broadcaster: watch.NewLongQueueBroadcaster(maxQueuedEvents, watch.DropIfChannelFull), sleepDuration: defaultSleepDuration, options: options, } @@ -323,7 +323,7 @@ type recorderImpl struct { clock clock.Clock } -func (recorder *recorderImpl) generateEvent(object runtime.Object, annotations map[string]string, timestamp metav1.Time, eventtype, reason, message string) { +func (recorder *recorderImpl) generateEvent(object runtime.Object, annotations map[string]string, eventtype, reason, message string) { ref, err := ref.GetReference(recorder.scheme, object) if err != nil { klog.Errorf("Could not construct reference to: '%#v' due to: '%v'. Will not report event: '%v' '%v' '%v'", object, err, eventtype, reason, message) @@ -338,15 +338,18 @@ func (recorder *recorderImpl) generateEvent(object runtime.Object, annotations m event := recorder.makeEvent(ref, annotations, eventtype, reason, message) event.Source = recorder.source - go func() { - // NOTE: events should be a non-blocking operation - defer utilruntime.HandleCrash() - recorder.Action(watch.Added, event) - }() + // NOTE: events should be a non-blocking operation, but we also need to not + // put this in a goroutine, otherwise we'll race to write to a closed channel + // when we go to shut down this broadcaster. Just drop events if we get overloaded, + // and log an error if that happens (we've configured the broadcaster to drop + // outgoing events anyway). + if sent := recorder.ActionOrDrop(watch.Added, event); !sent { + klog.Errorf("unable to record event: too many queued events, dropped event %#v", event) + } } func (recorder *recorderImpl) Event(object runtime.Object, eventtype, reason, message string) { - recorder.generateEvent(object, nil, metav1.Now(), eventtype, reason, message) + recorder.generateEvent(object, nil, eventtype, reason, message) } func (recorder *recorderImpl) Eventf(object runtime.Object, eventtype, reason, messageFmt string, args ...interface{}) { @@ -354,7 +357,7 @@ func (recorder *recorderImpl) Eventf(object runtime.Object, eventtype, reason, m } func (recorder *recorderImpl) AnnotatedEventf(object runtime.Object, annotations map[string]string, eventtype, reason, messageFmt string, args ...interface{}) { - recorder.generateEvent(object, annotations, metav1.Now(), eventtype, reason, fmt.Sprintf(messageFmt, args...)) + recorder.generateEvent(object, annotations, eventtype, reason, fmt.Sprintf(messageFmt, args...)) } func (recorder *recorderImpl) makeEvent(ref *v1.ObjectReference, annotations map[string]string, eventtype, reason, message string) *v1.Event { diff --git a/vendor/k8s.io/client-go/tools/record/util/BUILD b/vendor/k8s.io/client-go/tools/record/util/BUILD deleted file mode 100644 index a47a4a2dc7fd..000000000000 --- a/vendor/k8s.io/client-go/tools/record/util/BUILD +++ /dev/null @@ -1,27 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["util.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/tools/record/util", - importpath = "k8s.io/client-go/tools/record/util", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/tools/reference/BUILD b/vendor/k8s.io/client-go/tools/reference/BUILD deleted file mode 100644 index a16e7598283a..000000000000 --- a/vendor/k8s.io/client-go/tools/reference/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["ref.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/tools/reference", - importpath = "k8s.io/client-go/tools/reference", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["ref_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) diff --git a/vendor/k8s.io/client-go/tools/remotecommand/BUILD b/vendor/k8s.io/client-go/tools/remotecommand/BUILD deleted file mode 100644 index b3eb433c01de..000000000000 --- a/vendor/k8s.io/client-go/tools/remotecommand/BUILD +++ /dev/null @@ -1,62 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "v2_test.go", - "v4_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "errorstream.go", - "reader.go", - "remotecommand.go", - "resize.go", - "v1.go", - "v2.go", - "v3.go", - "v4.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/tools/remotecommand", - importpath = "k8s.io/client-go/tools/remotecommand", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/remotecommand:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/transport/spdy:go_default_library", - "//staging/src/k8s.io/client-go/util/exec:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/tools/remotecommand/v2.go b/vendor/k8s.io/client-go/tools/remotecommand/v2.go index 4b0001502a17..2f5561c942e1 100644 --- a/vendor/k8s.io/client-go/tools/remotecommand/v2.go +++ b/vendor/k8s.io/client-go/tools/remotecommand/v2.go @@ -142,6 +142,10 @@ func (p *streamProtocolV2) copyStdout(wg *sync.WaitGroup) { go func() { defer runtime.HandleCrash() defer wg.Done() + // make sure, packet in queue can be consumed. + // block in queue may lead to deadlock in conn.server + // issue: https://github.com/kubernetes/kubernetes/issues/96339 + defer io.Copy(ioutil.Discard, p.remoteStdout) if _, err := io.Copy(p.Stdout, p.remoteStdout); err != nil { runtime.HandleError(err) @@ -158,6 +162,7 @@ func (p *streamProtocolV2) copyStderr(wg *sync.WaitGroup) { go func() { defer runtime.HandleCrash() defer wg.Done() + defer io.Copy(ioutil.Discard, p.remoteStderr) if _, err := io.Copy(p.Stderr, p.remoteStderr); err != nil { runtime.HandleError(err) diff --git a/vendor/k8s.io/client-go/tools/watch/BUILD b/vendor/k8s.io/client-go/tools/watch/BUILD deleted file mode 100644 index 8a28eae20407..000000000000 --- a/vendor/k8s.io/client-go/tools/watch/BUILD +++ /dev/null @@ -1,63 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "informerwatcher.go", - "retrywatcher.go", - "until.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/tools/watch", - importpath = "k8s.io/client-go/tools/watch", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//vendor/github.com/davecgh/go-spew/spew:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "informerwatcher_test.go", - "retrywatcher_test.go", - "until_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//vendor/github.com/davecgh/go-spew/spew:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/tools/watch/informerwatcher.go b/vendor/k8s.io/client-go/tools/watch/informerwatcher.go index 4e0a400bb555..5e6aad5cf1fd 100644 --- a/vendor/k8s.io/client-go/tools/watch/informerwatcher.go +++ b/vendor/k8s.io/client-go/tools/watch/informerwatcher.go @@ -127,7 +127,7 @@ func NewIndexerInformerWatcher(lw cache.ListerWatcher, objType runtime.Object) ( // We have no means of passing the additional information down using // watch API based on watch.Event but the caller can filter such // objects by checking if metadata.deletionTimestamp is set - obj = staleObj + obj = staleObj.Obj } e.push(watch.Event{ diff --git a/vendor/k8s.io/client-go/tools/watch/retrywatcher.go b/vendor/k8s.io/client-go/tools/watch/retrywatcher.go index 62af45def2ce..1ed46ccb9e1d 100644 --- a/vendor/k8s.io/client-go/tools/watch/retrywatcher.go +++ b/vendor/k8s.io/client-go/tools/watch/retrywatcher.go @@ -116,24 +116,24 @@ func (rw *RetryWatcher) doReceive() (bool, time.Duration) { return false, 0 case io.ErrUnexpectedEOF: - klog.V(1).Infof("Watch closed with unexpected EOF: %v", err) + klog.V(1).InfoS("Watch closed with unexpected EOF", "err", err) return false, 0 default: - msg := "Watch failed: %v" + msg := "Watch failed" if net.IsProbableEOF(err) || net.IsTimeout(err) { - klog.V(5).Infof(msg, err) + klog.V(5).InfoS(msg, "err", err) // Retry return false, 0 } - klog.Errorf(msg, err) + klog.ErrorS(err, msg) // Retry return false, 0 } if watcher == nil { - klog.Error("Watch returned nil watcher") + klog.ErrorS(nil, "Watch returned nil watcher") // Retry return false, 0 } @@ -144,11 +144,11 @@ func (rw *RetryWatcher) doReceive() (bool, time.Duration) { for { select { case <-rw.stopChan: - klog.V(4).Info("Stopping RetryWatcher.") + klog.V(4).InfoS("Stopping RetryWatcher.") return true, 0 case event, ok := <-ch: if !ok { - klog.V(4).Infof("Failed to get event! Re-creating the watcher. Last RV: %s", rw.lastResourceVersion) + klog.V(4).InfoS("Failed to get event! Re-creating the watcher.", "resourceVersion", rw.lastResourceVersion) return false, 0 } diff --git a/vendor/k8s.io/client-go/transport/BUILD b/vendor/k8s.io/client-go/transport/BUILD deleted file mode 100644 index 8eb232f2729d..000000000000 --- a/vendor/k8s.io/client-go/transport/BUILD +++ /dev/null @@ -1,58 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "cache_test.go", - "round_trippers_test.go", - "token_source_test.go", - "transport_test.go", - ], - embed = [":go_default_library"], - deps = ["//vendor/golang.org/x/oauth2:go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = [ - "cache.go", - "cert_rotation.go", - "config.go", - "round_trippers.go", - "token_source.go", - "transport.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/transport", - importpath = "k8s.io/client-go/transport", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/util/connrotation:go_default_library", - "//staging/src/k8s.io/client-go/util/workqueue:go_default_library", - "//vendor/golang.org/x/oauth2:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/transport/spdy:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/transport/round_trippers.go b/vendor/k8s.io/client-go/transport/round_trippers.go index 056bc023c55e..cd0a4455f194 100644 --- a/vendor/k8s.io/client-go/transport/round_trippers.go +++ b/vendor/k8s.io/client-go/transport/round_trippers.go @@ -23,9 +23,9 @@ import ( "time" "golang.org/x/oauth2" - "k8s.io/klog/v2" utilnet "k8s.io/apimachinery/pkg/util/net" + "k8s.io/klog/v2" ) // HTTPWrappersForConfig wraps a round tripper with any relevant layered @@ -68,13 +68,13 @@ func HTTPWrappersForConfig(config *Config, rt http.RoundTripper) (http.RoundTrip func DebugWrappers(rt http.RoundTripper) http.RoundTripper { switch { case bool(klog.V(9).Enabled()): - rt = newDebuggingRoundTripper(rt, debugCurlCommand, debugURLTiming, debugResponseHeaders) + rt = NewDebuggingRoundTripper(rt, DebugCurlCommand, DebugURLTiming, DebugResponseHeaders) case bool(klog.V(8).Enabled()): - rt = newDebuggingRoundTripper(rt, debugJustURL, debugRequestHeaders, debugResponseStatus, debugResponseHeaders) + rt = NewDebuggingRoundTripper(rt, DebugJustURL, DebugRequestHeaders, DebugResponseStatus, DebugResponseHeaders) case bool(klog.V(7).Enabled()): - rt = newDebuggingRoundTripper(rt, debugJustURL, debugRequestHeaders, debugResponseStatus) + rt = NewDebuggingRoundTripper(rt, DebugJustURL, DebugRequestHeaders, DebugResponseStatus) case bool(klog.V(6).Enabled()): - rt = newDebuggingRoundTripper(rt, debugURLTiming) + rt = NewDebuggingRoundTripper(rt, DebugURLTiming) } return rt @@ -353,25 +353,35 @@ func (r *requestInfo) toCurl() string { // through it based on what is configured type debuggingRoundTripper struct { delegatedRoundTripper http.RoundTripper - - levels map[debugLevel]bool + levels map[DebugLevel]bool } -type debugLevel int +// DebugLevel is used to enable debugging of certain +// HTTP requests and responses fields via the debuggingRoundTripper. +type DebugLevel int const ( - debugJustURL debugLevel = iota - debugURLTiming - debugCurlCommand - debugRequestHeaders - debugResponseStatus - debugResponseHeaders + // DebugJustURL will add to the debug output HTTP requests method and url. + DebugJustURL DebugLevel = iota + // DebugURLTiming will add to the debug output the duration of HTTP requests. + DebugURLTiming + // DebugCurlCommand will add to the debug output the curl command equivalent to the + // HTTP request. + DebugCurlCommand + // DebugRequestHeaders will add to the debug output the HTTP requests headers. + DebugRequestHeaders + // DebugResponseStatus will add to the debug output the HTTP response status. + DebugResponseStatus + // DebugResponseHeaders will add to the debug output the HTTP response headers. + DebugResponseHeaders ) -func newDebuggingRoundTripper(rt http.RoundTripper, levels ...debugLevel) *debuggingRoundTripper { +// NewDebuggingRoundTripper allows to display in the logs output debug information +// on the API requests performed by the client. +func NewDebuggingRoundTripper(rt http.RoundTripper, levels ...DebugLevel) http.RoundTripper { drt := &debuggingRoundTripper{ delegatedRoundTripper: rt, - levels: make(map[debugLevel]bool, len(levels)), + levels: make(map[DebugLevel]bool, len(levels)), } for _, v := range levels { drt.levels[v] = true @@ -418,15 +428,14 @@ func maskValue(key string, value string) string { func (rt *debuggingRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { reqInfo := newRequestInfo(req) - if rt.levels[debugJustURL] { + if rt.levels[DebugJustURL] { klog.Infof("%s %s", reqInfo.RequestVerb, reqInfo.RequestURL) } - if rt.levels[debugCurlCommand] { + if rt.levels[DebugCurlCommand] { klog.Infof("%s", reqInfo.toCurl()) - } - if rt.levels[debugRequestHeaders] { - klog.Infof("Request Headers:") + if rt.levels[DebugRequestHeaders] { + klog.Info("Request Headers:") for key, values := range reqInfo.RequestHeaders { for _, value := range values { value = maskValue(key, value) @@ -441,14 +450,14 @@ func (rt *debuggingRoundTripper) RoundTrip(req *http.Request) (*http.Response, e reqInfo.complete(response, err) - if rt.levels[debugURLTiming] { + if rt.levels[DebugURLTiming] { klog.Infof("%s %s %s in %d milliseconds", reqInfo.RequestVerb, reqInfo.RequestURL, reqInfo.ResponseStatus, reqInfo.Duration.Nanoseconds()/int64(time.Millisecond)) } - if rt.levels[debugResponseStatus] { + if rt.levels[DebugResponseStatus] { klog.Infof("Response Status: %s in %d milliseconds", reqInfo.ResponseStatus, reqInfo.Duration.Nanoseconds()/int64(time.Millisecond)) } - if rt.levels[debugResponseHeaders] { - klog.Infof("Response Headers:") + if rt.levels[DebugResponseHeaders] { + klog.Info("Response Headers:") for key, values := range reqInfo.ResponseHeaders { for _, value := range values { klog.Infof(" %s: %s", key, value) diff --git a/vendor/k8s.io/client-go/transport/spdy/BUILD b/vendor/k8s.io/client-go/transport/spdy/BUILD deleted file mode 100644 index ba78f316c1de..000000000000 --- a/vendor/k8s.io/client-go/transport/spdy/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["spdy.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/transport/spdy", - importpath = "k8s.io/client-go/transport/spdy", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/httpstream/spdy:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/transport/spdy/spdy.go b/vendor/k8s.io/client-go/transport/spdy/spdy.go index 682f964f6f45..406d3cc19ce0 100644 --- a/vendor/k8s.io/client-go/transport/spdy/spdy.go +++ b/vendor/k8s.io/client-go/transport/spdy/spdy.go @@ -20,6 +20,7 @@ import ( "fmt" "net/http" "net/url" + "time" "k8s.io/apimachinery/pkg/util/httpstream" "k8s.io/apimachinery/pkg/util/httpstream/spdy" @@ -42,7 +43,13 @@ func RoundTripperFor(config *restclient.Config) (http.RoundTripper, Upgrader, er if config.Proxy != nil { proxy = config.Proxy } - upgradeRoundTripper := spdy.NewRoundTripperWithProxy(tlsConfig, true, false, proxy) + upgradeRoundTripper := spdy.NewRoundTripperWithConfig(spdy.RoundTripperConfig{ + TLS: tlsConfig, + FollowRedirects: true, + RequireSameHostRedirects: false, + Proxier: proxy, + PingPeriod: time.Second * 5, + }) wrapper, err := restclient.HTTPWrappersForConfig(config, upgradeRoundTripper) if err != nil { return nil, nil, err diff --git a/vendor/k8s.io/client-go/transport/token_source.go b/vendor/k8s.io/client-go/transport/token_source.go index f730c39759eb..fea02e611154 100644 --- a/vendor/k8s.io/client-go/transport/token_source.go +++ b/vendor/k8s.io/client-go/transport/token_source.go @@ -43,9 +43,29 @@ func TokenSourceWrapTransport(ts oauth2.TokenSource) func(http.RoundTripper) htt } } -// NewCachedFileTokenSource returns a oauth2.TokenSource reads a token from a -// file at a specified path and periodically reloads it. -func NewCachedFileTokenSource(path string) oauth2.TokenSource { +type ResettableTokenSource interface { + oauth2.TokenSource + ResetTokenOlderThan(time.Time) +} + +// ResettableTokenSourceWrapTransport returns a WrapTransport that injects bearer tokens +// authentication from an ResettableTokenSource. +func ResettableTokenSourceWrapTransport(ts ResettableTokenSource) func(http.RoundTripper) http.RoundTripper { + return func(rt http.RoundTripper) http.RoundTripper { + return &tokenSourceTransport{ + base: rt, + ort: &oauth2.Transport{ + Source: ts, + Base: rt, + }, + src: ts, + } + } +} + +// NewCachedFileTokenSource returns a resettable token source which reads a +// token from a file at a specified path and periodically reloads it. +func NewCachedFileTokenSource(path string) *cachingTokenSource { return &cachingTokenSource{ now: time.Now, leeway: 10 * time.Second, @@ -60,9 +80,9 @@ func NewCachedFileTokenSource(path string) oauth2.TokenSource { } } -// NewCachedTokenSource returns a oauth2.TokenSource reads a token from a -// designed TokenSource. The ts would provide the source of token. -func NewCachedTokenSource(ts oauth2.TokenSource) oauth2.TokenSource { +// NewCachedTokenSource returns resettable token source with caching. It reads +// a token from a designed TokenSource if not in cache or expired. +func NewCachedTokenSource(ts oauth2.TokenSource) *cachingTokenSource { return &cachingTokenSource{ now: time.Now, base: ts, @@ -72,6 +92,7 @@ func NewCachedTokenSource(ts oauth2.TokenSource) oauth2.TokenSource { type tokenSourceTransport struct { base http.RoundTripper ort http.RoundTripper + src ResettableTokenSource } func (tst *tokenSourceTransport) RoundTrip(req *http.Request) (*http.Response, error) { @@ -79,7 +100,15 @@ func (tst *tokenSourceTransport) RoundTrip(req *http.Request) (*http.Response, e if req.Header.Get("Authorization") != "" { return tst.base.RoundTrip(req) } - return tst.ort.RoundTrip(req) + // record time before RoundTrip to make sure newly acquired Unauthorized + // token would not be reset. Another request from user is required to reset + // and proceed. + start := time.Now() + resp, err := tst.ort.RoundTrip(req) + if err == nil && resp != nil && resp.StatusCode == 401 && tst.src != nil { + tst.src.ResetTokenOlderThan(start) + } + return resp, err } func (tst *tokenSourceTransport) CancelRequest(req *http.Request) { @@ -119,13 +148,12 @@ type cachingTokenSource struct { sync.RWMutex tok *oauth2.Token + t time.Time // for testing now func() time.Time } -var _ = oauth2.TokenSource(&cachingTokenSource{}) - func (ts *cachingTokenSource) Token() (*oauth2.Token, error) { now := ts.now() // fast path @@ -153,6 +181,16 @@ func (ts *cachingTokenSource) Token() (*oauth2.Token, error) { return ts.tok, nil } + ts.t = ts.now() ts.tok = tok return tok, nil } + +func (ts *cachingTokenSource) ResetTokenOlderThan(t time.Time) { + ts.Lock() + defer ts.Unlock() + if ts.t.Before(t) { + ts.tok = nil + ts.t = time.Time{} + } +} diff --git a/vendor/k8s.io/client-go/util/cert/BUILD b/vendor/k8s.io/client-go/util/cert/BUILD deleted file mode 100644 index 514a2572fc29..000000000000 --- a/vendor/k8s.io/client-go/util/cert/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["csr_test.go"], - data = glob(["testdata/**"]), - embed = [":go_default_library"], - deps = ["//staging/src/k8s.io/client-go/util/keyutil:go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = [ - "cert.go", - "csr.go", - "io.go", - "pem.go", - "server_inspection.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/util/cert", - importpath = "k8s.io/client-go/util/cert", - deps = ["//staging/src/k8s.io/client-go/util/keyutil:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/util/certificate/BUILD b/vendor/k8s.io/client-go/util/certificate/BUILD deleted file mode 100644 index b1f6aa7349b4..000000000000 --- a/vendor/k8s.io/client-go/util/certificate/BUILD +++ /dev/null @@ -1,70 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -licenses(["notice"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "certificate_manager_test.go", - "certificate_store_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/certificates/v1:go_default_library", - "//staging/src/k8s.io/api/certificates/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/certificates/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "certificate_manager.go", - "certificate_store.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/util/certificate", - importpath = "k8s.io/client-go/util/certificate", - deps = [ - "//staging/src/k8s.io/api/certificates/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/util/cert:go_default_library", - "//staging/src/k8s.io/client-go/util/certificate/csr:go_default_library", - "//staging/src/k8s.io/client-go/util/keyutil:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/util/certificate/csr:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/util/certificate/csr/BUILD b/vendor/k8s.io/client-go/util/certificate/csr/BUILD deleted file mode 100644 index bcdcb9e51114..000000000000 --- a/vendor/k8s.io/client-go/util/certificate/csr/BUILD +++ /dev/null @@ -1,46 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["csr.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/util/certificate/csr", - importpath = "k8s.io/client-go/util/certificate/csr", - deps = [ - "//staging/src/k8s.io/api/certificates/v1:go_default_library", - "//staging/src/k8s.io/api/certificates/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/tools/watch:go_default_library", - "//staging/src/k8s.io/client-go/util/cert:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["csr_test.go"], - embed = [":go_default_library"], - deps = ["//staging/src/k8s.io/api/certificates/v1:go_default_library"], -) diff --git a/vendor/k8s.io/client-go/util/connrotation/BUILD b/vendor/k8s.io/client-go/util/connrotation/BUILD deleted file mode 100644 index caf852a3b57c..000000000000 --- a/vendor/k8s.io/client-go/util/connrotation/BUILD +++ /dev/null @@ -1,29 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["connrotation.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/util/connrotation", - importpath = "k8s.io/client-go/util/connrotation", - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["connrotation_test.go"], - embed = [":go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/util/connrotation/connrotation.go b/vendor/k8s.io/client-go/util/connrotation/connrotation.go index f98faee47d51..2b9bf72bde61 100644 --- a/vendor/k8s.io/client-go/util/connrotation/connrotation.go +++ b/vendor/k8s.io/client-go/util/connrotation/connrotation.go @@ -33,18 +33,40 @@ type DialFunc func(ctx context.Context, network, address string) (net.Conn, erro // Dialer opens connections through Dial and tracks them. type Dialer struct { dial DialFunc - - mu sync.Mutex - conns map[*closableConn]struct{} + *ConnectionTracker } // NewDialer creates a new Dialer instance. +// Equivalent to NewDialerWithTracker(dial, nil). +func NewDialer(dial DialFunc) *Dialer { + return NewDialerWithTracker(dial, nil) +} + +// NewDialerWithTracker creates a new Dialer instance. // // If dial is not nil, it will be used to create new underlying connections. // Otherwise net.DialContext is used. -func NewDialer(dial DialFunc) *Dialer { +// If tracker is not nil, it will be used to track new underlying connections. +// Otherwise NewConnectionTracker() is used. +func NewDialerWithTracker(dial DialFunc, tracker *ConnectionTracker) *Dialer { + if tracker == nil { + tracker = NewConnectionTracker() + } return &Dialer{ - dial: dial, + dial: dial, + ConnectionTracker: tracker, + } +} + +// ConnectionTracker keeps track of opened connections +type ConnectionTracker struct { + mu sync.Mutex + conns map[*closableConn]struct{} +} + +// NewConnectionTracker returns a connection tracker for use with NewDialerWithTracker +func NewConnectionTracker() *ConnectionTracker { + return &ConnectionTracker{ conns: make(map[*closableConn]struct{}), } } @@ -52,17 +74,40 @@ func NewDialer(dial DialFunc) *Dialer { // CloseAll forcibly closes all tracked connections. // // Note: new connections may get created before CloseAll returns. -func (d *Dialer) CloseAll() { - d.mu.Lock() - conns := d.conns - d.conns = make(map[*closableConn]struct{}) - d.mu.Unlock() +func (c *ConnectionTracker) CloseAll() { + c.mu.Lock() + conns := c.conns + c.conns = make(map[*closableConn]struct{}) + c.mu.Unlock() for conn := range conns { conn.Close() } } +// Track adds the connection to the list of tracked connections, +// and returns a wrapped copy of the connection that stops tracking the connection +// when it is closed. +func (c *ConnectionTracker) Track(conn net.Conn) net.Conn { + closable := &closableConn{Conn: conn} + + // When the connection is closed, remove it from the map. This will + // be no-op if the connection isn't in the map, e.g. if CloseAll() + // is called. + closable.onClose = func() { + c.mu.Lock() + delete(c.conns, closable) + c.mu.Unlock() + } + + // Start tracking the connection + c.mu.Lock() + c.conns[closable] = struct{}{} + c.mu.Unlock() + + return closable +} + // Dial creates a new tracked connection. func (d *Dialer) Dial(network, address string) (net.Conn, error) { return d.DialContext(context.Background(), network, address) @@ -74,24 +119,7 @@ func (d *Dialer) DialContext(ctx context.Context, network, address string) (net. if err != nil { return nil, err } - - closable := &closableConn{Conn: conn} - - // When the connection is closed, remove it from the map. This will - // be no-op if the connection isn't in the map, e.g. if CloseAll() - // is called. - closable.onClose = func() { - d.mu.Lock() - delete(d.conns, closable) - d.mu.Unlock() - } - - // Start tracking the connection - d.mu.Lock() - d.conns[closable] = struct{}{} - d.mu.Unlock() - - return closable, nil + return d.ConnectionTracker.Track(conn), nil } type closableConn struct { diff --git a/vendor/k8s.io/client-go/util/exec/BUILD b/vendor/k8s.io/client-go/util/exec/BUILD deleted file mode 100644 index 30f4af1075d0..000000000000 --- a/vendor/k8s.io/client-go/util/exec/BUILD +++ /dev/null @@ -1,26 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["exec.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/util/exec", - importpath = "k8s.io/client-go/util/exec", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/util/flowcontrol/BUILD b/vendor/k8s.io/client-go/util/flowcontrol/BUILD deleted file mode 100644 index 526e8db020f2..000000000000 --- a/vendor/k8s.io/client-go/util/flowcontrol/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "backoff_test.go", - "throttle_test.go", - ], - embed = [":go_default_library"], - deps = ["//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = [ - "backoff.go", - "throttle.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/util/flowcontrol", - importpath = "k8s.io/client-go/util/flowcontrol", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//vendor/golang.org/x/time/rate:go_default_library", - "//vendor/k8s.io/utils/integer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/util/homedir/BUILD b/vendor/k8s.io/client-go/util/homedir/BUILD deleted file mode 100644 index ac033e83229a..000000000000 --- a/vendor/k8s.io/client-go/util/homedir/BUILD +++ /dev/null @@ -1,26 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["homedir.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/util/homedir", - importpath = "k8s.io/client-go/util/homedir", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/util/jsonpath/BUILD b/vendor/k8s.io/client-go/util/jsonpath/BUILD deleted file mode 100644 index ec1903ad5779..000000000000 --- a/vendor/k8s.io/client-go/util/jsonpath/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "jsonpath_test.go", - "parser_test.go", - ], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "jsonpath.go", - "node.go", - "parser.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/util/jsonpath", - importpath = "k8s.io/client-go/util/jsonpath", - deps = ["//staging/src/k8s.io/client-go/third_party/forked/golang/template:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/util/keyutil/BUILD b/vendor/k8s.io/client-go/util/keyutil/BUILD deleted file mode 100644 index 52793c68f999..000000000000 --- a/vendor/k8s.io/client-go/util/keyutil/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["key_test.go"], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = ["key.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/util/keyutil", - importpath = "k8s.io/client-go/util/keyutil", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/util/retry/BUILD b/vendor/k8s.io/client-go/util/retry/BUILD deleted file mode 100644 index 601c1393da37..000000000000 --- a/vendor/k8s.io/client-go/util/retry/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["util.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/util/retry", - importpath = "k8s.io/client-go/util/retry", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["util_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/util/workqueue/BUILD b/vendor/k8s.io/client-go/util/workqueue/BUILD deleted file mode 100644 index 302d16a930c7..000000000000 --- a/vendor/k8s.io/client-go/util/workqueue/BUILD +++ /dev/null @@ -1,59 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "default_rate_limiters_test.go", - "delaying_queue_test.go", - "main_test.go", - "metrics_test.go", - "parallelizer_test.go", - "queue_test.go", - "rate_limiting_queue_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/github.com/google/go-cmp/cmp:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "default_rate_limiters.go", - "delaying_queue.go", - "doc.go", - "metrics.go", - "parallelizer.go", - "queue.go", - "rate_limiting_queue.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/util/workqueue", - importpath = "k8s.io/client-go/util/workqueue", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//vendor/golang.org/x/time/rate:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/util/workqueue/queue.go b/vendor/k8s.io/client-go/util/workqueue/queue.go index 39009b8e79a3..f7c14ddcdb53 100644 --- a/vendor/k8s.io/client-go/util/workqueue/queue.go +++ b/vendor/k8s.io/client-go/util/workqueue/queue.go @@ -55,7 +55,13 @@ func newQueue(c clock.Clock, metrics queueMetrics, updatePeriod time.Duration) * metrics: metrics, unfinishedWorkUpdatePeriod: updatePeriod, } - go t.updateUnfinishedWorkLoop() + + // Don't start the goroutine for a type of noMetrics so we don't consume + // resources unnecessarily + if _, ok := metrics.(noMetrics); !ok { + go t.updateUnfinishedWorkLoop() + } + return t } diff --git a/vendor/k8s.io/cloud-provider/BUILD b/vendor/k8s.io/cloud-provider/BUILD deleted file mode 100644 index 7a2fdecb33af..000000000000 --- a/vendor/k8s.io/cloud-provider/BUILD +++ /dev/null @@ -1,54 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "cloud.go", - "doc.go", - "plugins.go", - "ports.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/cloud-provider", - importpath = "k8s.io/cloud-provider", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/cloud-provider/api:all-srcs", - "//staging/src/k8s.io/cloud-provider/app:all-srcs", - "//staging/src/k8s.io/cloud-provider/config:all-srcs", - "//staging/src/k8s.io/cloud-provider/controllers/node:all-srcs", - "//staging/src/k8s.io/cloud-provider/controllers/nodelifecycle:all-srcs", - "//staging/src/k8s.io/cloud-provider/controllers/route:all-srcs", - "//staging/src/k8s.io/cloud-provider/controllers/service:all-srcs", - "//staging/src/k8s.io/cloud-provider/fake:all-srcs", - "//staging/src/k8s.io/cloud-provider/node:all-srcs", - "//staging/src/k8s.io/cloud-provider/options:all-srcs", - "//staging/src/k8s.io/cloud-provider/sample:all-srcs", - "//staging/src/k8s.io/cloud-provider/service/helpers:all-srcs", - "//staging/src/k8s.io/cloud-provider/volume:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/cloud-provider/OWNERS b/vendor/k8s.io/cloud-provider/OWNERS index b5c5205c9d84..b0ef2b6f5543 100644 --- a/vendor/k8s.io/cloud-provider/OWNERS +++ b/vendor/k8s.io/cloud-provider/OWNERS @@ -13,7 +13,6 @@ reviewers: - vishh - mikedanese - liggitt -- gmarek - davidopp - pmorie - sttts diff --git a/vendor/k8s.io/cloud-provider/api/BUILD b/vendor/k8s.io/cloud-provider/api/BUILD deleted file mode 100644 index 2371259bd421..000000000000 --- a/vendor/k8s.io/cloud-provider/api/BUILD +++ /dev/null @@ -1,26 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "well_known_annotations.go", - "well_known_taints.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/cloud-provider/api", - importpath = "k8s.io/cloud-provider/api", - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/cloud-provider/credentialconfig/registry.go b/vendor/k8s.io/cloud-provider/credentialconfig/registry.go new file mode 100644 index 000000000000..eac2173e8add --- /dev/null +++ b/vendor/k8s.io/cloud-provider/credentialconfig/registry.go @@ -0,0 +1,31 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package credentialconfig + +// Code taken from /pkg/credentialprovider/config.go + +// RegistryConfig represents the config file used by the docker CLI. +// This config that represents the credentials that should be used +// when pulling images from specific image repositories. +type RegistryConfig map[string]RegistryConfigEntry + +// RegistryConfigEntry wraps a docker config as a entry +type RegistryConfigEntry struct { + Username string + Password string + Email string +} diff --git a/vendor/k8s.io/cloud-provider/go.mod b/vendor/k8s.io/cloud-provider/go.mod index 93f6ae2c0c36..198bd62953cf 100644 --- a/vendor/k8s.io/cloud-provider/go.mod +++ b/vendor/k8s.io/cloud-provider/go.mod @@ -2,32 +2,30 @@ module k8s.io/cloud-provider -go 1.15 +go 1.16 require ( github.com/google/go-cmp v0.5.2 github.com/spf13/cobra v1.1.1 github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.6.1 - k8s.io/api v0.20.0 - k8s.io/apimachinery v0.20.0 - k8s.io/apiserver v0.20.0 - k8s.io/client-go v0.20.0 - k8s.io/component-base v0.20.0 + k8s.io/api v0.21.0-rc.0 + k8s.io/apimachinery v0.21.0-rc.0 + k8s.io/apiserver v0.21.0-rc.0 + k8s.io/client-go v0.21.0-rc.0 + k8s.io/component-base v0.21.0-rc.0 k8s.io/controller-manager v0.0.0 - k8s.io/klog/v2 v2.4.0 + k8s.io/klog/v2 v2.8.0 k8s.io/utils v0.0.0-20201110183641-67b214c5f920 ) replace ( - github.com/containerd/continuity => github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc github.com/go-bindata/go-bindata => github.com/go-bindata/go-bindata v3.1.1+incompatible github.com/imdario/mergo => github.com/imdario/mergo v0.3.5 github.com/mattn/go-colorable => github.com/mattn/go-colorable v0.0.9 - github.com/onsi/ginkgo => github.com/openshift/ginkgo v4.5.0-origin.1+incompatible + github.com/onsi/ginkgo => github.com/openshift/ginkgo v4.7.0-origin.0+incompatible github.com/robfig/cron => github.com/robfig/cron v1.1.0 go.uber.org/multierr => go.uber.org/multierr v1.1.0 - gopkg.in/yaml.v2 => gopkg.in/yaml.v2 v2.2.8 k8s.io/api => ../api k8s.io/apiextensions-apiserver => ../apiextensions-apiserver k8s.io/apimachinery => ../apimachinery diff --git a/vendor/k8s.io/cloud-provider/go.sum b/vendor/k8s.io/cloud-provider/go.sum index 517330864615..b81d61d48cf7 100644 --- a/vendor/k8s.io/cloud-provider/go.sum +++ b/vendor/k8s.io/cloud-provider/go.sum @@ -24,15 +24,14 @@ cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiy cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= 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= github.com/Azure/azure-sdk-for-go v43.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7OZ575w+acHgRric5iCyQh+xv+KJ4HB8= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= -github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= +github.com/Azure/go-autorest/autorest v0.11.12/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/autorest/to v0.2.0/go.mod h1:GunWKJp1AEqgMaGLV+iocmRAJWqST1wQYhyyjXJ3SJc= github.com/Azure/go-autorest/autorest/validation v0.1.0/go.mod h1:Ha3z/SqBeaalWQvokg3NZAlQTalVMtOIAs1aGK7G6u8= @@ -44,12 +43,12 @@ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym github.com/GoogleCloudPlatform/k8s-cloud-provider v0.0.0-20200415212048-7901bc822317/go.mod h1:DF8FZRxMHMGv/vP2lQP6h+dYzzjpuRn24VeRiYn3qjQ= github.com/JeffAshton/win_pdh v0.0.0-20161109143554-76bb4ee9f0ab/go.mod h1:3VYc5hodBMJ5+l/7J4xAyMeuM2PNuepvHlGs8yilUCA= github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= -github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= github.com/Microsoft/go-winio v0.4.15/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= github.com/Microsoft/hcsshim v0.8.10-0.20200715222032-5eafd1556990/go.mod h1:ay/0dTb7NsG8QMDfsRfLHgZo/6xAJShLe1+ePPflihk= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46 h1:lsxEuwrXEAokXB9qhlbKWPpo3KMLZQ5WB5WLQRW1uq0= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/NYTimes/gziphandler v1.1.1 h1:ZUDjpQae29j0ryrS0u/B8HZfJBtBQHjqw2rQ2cqUQ3I= +github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= @@ -85,7 +84,6 @@ github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx2 github.com/caddyserver/caddy v1.0.3/go.mod h1:G+ouvOY32gENkJC+jhgl62TyhvqEsFaDiZ4uw0RzP1E= github.com/cenkalti/backoff v2.1.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/certifi/gocertifi v0.0.0-20180905225744-ee1a9a0726d2/go.mod h1:GJKEexRPVJrBSOjoqN5VNOIKJ5Q3RViH6eu3puDRwx4= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= @@ -97,18 +95,17 @@ github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWR github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= 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/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/clusterhq/flocker-go v0.0.0-20160920122132-2b8b7259d313/go.mod h1:P1wt9Z3DP8O6W3rvwCt0REIlshg1InHImaLW0t3ObY0= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa h1:OaNxuTZr7kxeODyLWsRMC+OD03aFUH+mW6r2d+MWa5Y= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/codegangsta/negroni v1.0.0/go.mod h1:v0y3T5G7Y1UlFfyxFn/QLRU4a2EuNau2iZY63YTKWo0= -github.com/container-storage-interface/spec v1.2.0/go.mod h1:6URME8mwIBbpVyZV93Ce5St17xBiQJQY67NDsuohiy4= +github.com/container-storage-interface/spec v1.3.0/go.mod h1:6URME8mwIBbpVyZV93Ce5St17xBiQJQY67NDsuohiy4= github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM= github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= -github.com/containerd/console v1.0.0/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= +github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.4/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= @@ -117,7 +114,7 @@ github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8h github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/coredns/corefile-migration v1.0.10/go.mod h1:RMy/mXdeDlYwzt0vdMEJvT2hGJ2I86/eO0UdXmH9XNI= +github.com/coredns/corefile-migration v1.0.11/go.mod h1:RMy/mXdeDlYwzt0vdMEJvT2hGJ2I86/eO0UdXmH9XNI= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= @@ -138,6 +135,9 @@ github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwc 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= 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 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= +github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -150,15 +150,12 @@ github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyG github.com/docker/distribution v0.0.0-20180920194744-16128bbac47f/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v17.12.0-ce-rc1.0.20200916142827-bd33bbf0497b+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/go-connections v0.3.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/docker v20.10.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/libnetwork v0.0.0-20190731215715-7f13a5c99f4b/go.mod h1:93m0aTqz6z+g32wla4l4WxTrdtvBRmVzYRkYvasA5Z8= github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= @@ -170,6 +167,7 @@ github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/euank/go-kmsg-parser v2.0.0+incompatible/go.mod h1:MhmAMZ8V4CYH4ybgdRwPr2TU5ThnS43puaKEMpja1uw= +github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.9.0+incompatible h1:kLcOMZeuLAJvL2BPWLMIj5oaZQobrkAqrL+WFZwQses= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4= @@ -179,17 +177,14 @@ github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/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/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsouza/go-dockerclient v0.0.0-20171004212419-da3951ba2e9e/go.mod h1:KpcjM623fQYE9MZiTGzKhjfxXAV9wbyX2C1cyRHfhl0= github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= -github.com/getsentry/raven-go v0.0.0-20190513200303-c977f96e1095/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/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-acme/lego v2.5.0+incompatible/go.mod h1:yzMNe9CasVUhkquNvti5nAtPmG94USbYxYrZfTkIn0M= github.com/go-bindata/go-bindata v3.1.1+incompatible/go.mod h1:xK8Dsgwmeed+BBsSy2XTopBn/8uK2HWuGSnA11C3Joo= +github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= 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= @@ -197,10 +192,10 @@ github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2 github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logr/logr v0.1.0 h1:M1Tv3VzNlEHg6uyACnRdtrploV2P7wZqH8BoQMtz0cg= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v0.2.0 h1:QvGt2nLcHH0WK9orKa+ppBPAxREcH364nPUedEpK0TY= github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-logr/logr v0.4.0 h1:K7/B1jt6fIBQVd4Owv2MqGQClcgf0R266+7C/QjRcLc= +github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= 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= github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= @@ -230,12 +225,14 @@ github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29g github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= -github.com/go-openapi/spec v0.19.3 h1:0XRyw8kguri6Yw4SxhsQA/atC88yqrk0+G4YhI2wabc= github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= +github.com/go-openapi/spec v0.19.5 h1:Xm0Ao53uqnk9QE/LlYV5DEU09UAgpliA85QoT9LzqPw= +github.com/go-openapi/spec v0.19.5/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= +github.com/go-openapi/strfmt v0.19.5/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= @@ -243,22 +240,23 @@ github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tF github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= -github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= +github.com/go-openapi/validate v0.19.8/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= github.com/go-ozzo/ozzo-validation v3.5.0+incompatible/go.mod h1:gsEKFIVnabGBt6mXmxK0MoFy+cZoTJY6mu5Ll3LVLBU= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gobuffalo/flect v0.2.0/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80= +github.com/gobuffalo/here v0.6.0/go.mod h1:wAG085dHOYqUpf+Ap+WOdrPTp5IYcDAs/x7PLa8Y5fM= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/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-20191227052852-215e87163ea7 h1:5ZkaAPbicIKTF2I64qf5Fh8Aa83Q/dnOafMYV0OMwjA= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -267,6 +265,7 @@ github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfb github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= 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= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -279,12 +278,9 @@ github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrU github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golangplus/bytes v0.0.0-20160111154220-45c989fe5450/go.mod h1:Bk6SMAONeMXrxql8uvOKuAZSu8aM5RUGv+1C6IJaEho= -github.com/golangplus/fmt v0.0.0-20150411045040-2a5d6d7d2995/go.mod h1:lJgMEyOkYFkPcDKwRXegd+iM6E7matEszMG5HhwytU8= github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= github.com/gonum/blas v0.0.0-20181208220705-f22b278b28ac/go.mod h1:P32wAyui1PQ58Oce/KYkOqQv8cVw1zAapXOl+dRFGbc= github.com/gonum/floats v0.0.0-20181209220543-c233463c7e82/go.mod h1:PxC8OnwL11+aosOB5+iEPoV3picfs8tUpkVd0pDo+Kg= @@ -295,11 +291,10 @@ github.com/gonum/matrix v0.0.0-20181209220409-c518dec07be9/go.mod h1:0EXg4mc1CNP github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/cadvisor v0.38.5/go.mod h1:1OFB9sOOMkBdUBGCO/1SArawTnDscgMzTodacVDe8mA= +github.com/google/cadvisor v0.39.0/go.mod h1:rjQFmK4jPCpxeUdLq9bYhNFFsjgGOtpnDmDeap0+nsw= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= 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 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM= @@ -314,8 +309,8 @@ github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -326,7 +321,6 @@ github.com/googleapis/gnostic v0.4.1 h1:DLJCy1n/vrD4HPjOvYcT8aYQXpPIzoRZONaYwyyc github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/mux v0.0.0-20191024121256-f395758b854c/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= @@ -364,7 +358,7 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/heketi/heketi v9.0.1-0.20190917153846-c2e2a4ab7ab9+incompatible/go.mod h1:bB9ly3RchcQqsQ9CpyaQwvva7RS5ytVoSoholZQON6o= +github.com/heketi/heketi v10.2.0+incompatible/go.mod h1:bB9ly3RchcQqsQ9CpyaQwvva7RS5ytVoSoholZQON6o= github.com/heketi/tests v0.0.0-20151005000721-f3775cbcefd6/go.mod h1:xGMAM8JLi7UkZt1i4FQeQy0R2T8GLUwQhOP5M1gBhy4= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= @@ -391,20 +385,19 @@ github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E github.com/karrick/godirwalk v1.16.1/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= 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= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= 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= -github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= github.com/libopenstorage/openstorage v1.0.0/go.mod h1:Sp1sIObHjat1BeXhfMqLZ14wnOzEhNx2YQedreMcUyc= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= @@ -422,18 +415,20 @@ github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.0 h1:aizVhC/NAAcKWb+5QsU1iNOZb4Yws5UO2I+aIprQITM= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/markbates/pkger v0.17.1/go.mod h1:0JoVlrol20BSywW79rN3kdFFsE5xYM+rSCQDXbLhiuI= github.com/marten-seemann/qtls v0.2.3/go.mod h1:xzjG7avBwGGbdZ8dTGxlBnLArsVKLvwmjgmPuiQEcYk= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/mholt/certmagic v0.6.2-0.20190624175158-6a42ef9fe8c2/go.mod h1:g4cOPxcjV0oFq3qwpjSA30LReKD8AoIfwAY9VvG35NY= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.3/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.4/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/mindprince/gonvml v0.0.0-20190828220739-9ebdce4bb989/go.mod h1:2eu9pRWp8mo84xCg6KswZ+USQHjwgRhNp06sozOdsTY= github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= @@ -446,9 +441,10 @@ github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0Qu github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/moby/ipvs v1.0.1/go.mod h1:2pngiyseZbIKXNv7hsKj3O9UEz30c53MT9005gt2hxQ= -github.com/moby/sys/mountinfo v0.1.3/go.mod h1:w2t2Avltqx8vE7gX5l+QiBKxODu2TX0+Syr3h52Tw4o= -github.com/moby/term v0.0.0-20200312100748-672ec06f55cd h1:aY7OQNf2XqY/JQ6qREWamhI/81os/agb2BAGpcx5yWI= -github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= +github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= +github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= +github.com/moby/term v0.0.0-20201216013528-df9cb8a40635 h1:rzf0wL0CHVc8CEsgyygG0Mn9CNCCPZqOPaz8RiiHYQk= +github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= 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= @@ -456,8 +452,9 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/mohae/deepcopy v0.0.0-20170603005431-491d3605edfb/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= +github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -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= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= @@ -466,8 +463,11 @@ github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRW github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= github.com/naoina/toml v0.1.1/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0 h1:XPnZz8VVBHjVsy1vzJmRwIcSwiUO+JFfrv/xGiigmME= @@ -477,18 +477,22 @@ github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQ github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v0.0.0-20191031171055-b133feaeeb2e/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc92/go.mod h1:X1zlU4p7wOlX4+WRCz+hvlRv8phdL7UqbYD+vQwNMmE= +github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.3-0.20200728170252-4d89ac9fbff6/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= -github.com/openshift/api v0.0.0-20201214114959-164a2fb63b5f/go.mod h1:aqU5Cq+kqKKPbDMqxo9FojgDeSpNJI7iuskjXjtojDg= -github.com/openshift/apiserver-library-go v0.0.0-20201214145556-6f1013f42f98/go.mod h1:bMWTKd7ZOYGyx1hVLipuA9LrIJw62V7Se99cZ/Volj8= -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-20201214125552-e615e336eb49/go.mod h1:9/jG4I6sh+5QublJpZZ4Zs/P4/QCXMsQQ/K/058bSB8= -github.com/openshift/ginkgo v4.5.0-origin.1+incompatible h1:AGewrYJW8aXFkkf86sSoiO9L/a/QYKZvODVCaB/wk4o= -github.com/openshift/ginkgo v4.5.0-origin.1+incompatible/go.mod h1:8METQ1gDhl0KW+pGH4c0DIJYEN/ksVCL6hOuHPmXGnk= -github.com/openshift/library-go v0.0.0-20201214135256-d265f469e75b/go.mod h1:udseDnqxn5ON8i+NBjDp00fBTK0JRu1/6Y6tf6EivDE= +github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= +github.com/openshift/api v0.0.0-20210331162552-3e31249e6a55/go.mod h1:dZ4kytOo3svxJHNYd0J55hwe/6IQG5gAUHUE0F3Jkio= +github.com/openshift/api v0.0.0-20210331193751-3acddb19d360/go.mod h1:dZ4kytOo3svxJHNYd0J55hwe/6IQG5gAUHUE0F3Jkio= +github.com/openshift/api v0.0.0-20210422150128-d8a48168c81c/go.mod h1:dZ4kytOo3svxJHNYd0J55hwe/6IQG5gAUHUE0F3Jkio= +github.com/openshift/apiserver-library-go v0.0.0-20210415093535-9176fb31e5dc/go.mod h1:nqn2IWld2A+Q9Lp/xGsbmUr2RyDCQixRU83yqAbymUM= +github.com/openshift/build-machinery-go v0.0.0-20210209125900-0da259a2c359/go.mod h1:b1BuldmJlbA/xYtdZvKi+7j5YGB44qJUJDZ9zwiNCfE= +github.com/openshift/client-go v0.0.0-20210331195552-cf6c2669e01f/go.mod h1:hHaRJ6vp2MRd/CpuZ1oJkqnMGy5eEnoAkQmKPZKcUPI= +github.com/openshift/client-go v0.0.0-20210422153130-25c8450d1535/go.mod h1:v5/AYttPCjfqMGC1Ed/vutuDpuXmgWc5O+W9nwQ7EtE= +github.com/openshift/ginkgo v4.7.0-origin.0+incompatible h1:2qD1n/RAnycWMPjYS6MEAUzRmVoF0ql7ozk1ANv8dcM= +github.com/openshift/ginkgo v4.7.0-origin.0+incompatible/go.mod h1:8METQ1gDhl0KW+pGH4c0DIJYEN/ksVCL6hOuHPmXGnk= +github.com/openshift/library-go v0.0.0-20210331235027-66936e2fcc52/go.mod h1:pnz961veImKsbn7pQcuFbcVpCQosYiC1fUOjzEDeOLU= +github.com/openshift/library-go v0.0.0-20210407092538-7021fda6f427 h1:/6Xf107BJIzdfRe9xfuU4xnx7TUHQ7vzDMWiNYPmxfM= +github.com/openshift/library-go v0.0.0-20210407092538-7021fda6f427/go.mod h1:pnz961veImKsbn7pQcuFbcVpCQosYiC1fUOjzEDeOLU= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= @@ -525,7 +529,6 @@ github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7z github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.1.3 h1:F0+tqvhOksq22sc6iCHF5WGlWjdwj92p0udFh1VFBS8= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.2.0 h1:wH4vA7pcjKuZzjF7lM8awk4fnuJO6idemZXoKnULUx4= github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= @@ -544,12 +547,13 @@ github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdh github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= 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/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E= @@ -580,12 +584,11 @@ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= 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 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -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/thecodeteam/goscaleio v0.1.0/go.mod h1:68sdkZAsK8bvEwBlbQnlLS+xU+hvLYM/iQ8KXej1AwM= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= @@ -598,17 +601,18 @@ github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtX github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= -github.com/vishvananda/netlink v1.0.0/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= 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/vmware/govmomi v0.20.3/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= -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/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xlab/handysort v0.0.0-20150421192137-fb3537ed64a1/go.mod h1:QcJo0QPSfTONNIgpN5RA8prR7fF8nkF6cTWTcNerRO8= +github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.5 h1:XAzx9gjCb0Rxj7EoqcClPD1d5ZBxZJk0jbuoPHenBt0= @@ -622,6 +626,7 @@ go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -642,10 +647,10 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0 h1:hb9wdF1z5waM+dSIICn1l0DkLVDT3hqhhQsDNUmHPRE= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 h1:/ZScEX8SfEmUGRHs0gxpqteO5nfNW6axyZbBdw9A12g= +golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -653,6 +658,7 @@ golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= 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-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= @@ -660,6 +666,7 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20210220032938-85be41e4509f/go.mod h1:I6l2HNBLBZEcrOoCpyKLdY2lHoRZ8lI4x60KMCQDft4= 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= @@ -675,12 +682,15 @@ golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPI golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mobile v0.0.0-20201217150744-e6ae53a27f4f/go.mod h1:skQtrUTUwhdJvXM/2KKJzY8pDgNr9I/FOMqDVRPBUS4= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -705,6 +715,7 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/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-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= @@ -712,14 +723,15 @@ golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e h1:3G+cUijn7XD+S4eJFddp53Pv7+slrESplyjG25HgL+k= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b h1:uwuIcX0g4Yl1NC5XAz37xsr2lTtcqevgzYNVt49waME= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210224082022-3d97a244fca7 h1:OgUuv8lsRpBibGNbSizVwKWlysjaNzmC9gYMhPVfqFM= +golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6 h1:pE8b58s1HRDMi8RDc79m0HISf9D4TzseP40cEA6IGfs= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -728,8 +740,9 @@ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9 h1:SQFwaSi55rU7vdNs9Yr0Z324VNlrF+0wMqRXT4St8ck= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 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-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -756,11 +769,13 @@ golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191115151921-52ab43148777/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-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -776,16 +791,22 @@ golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201110211018-35f3e6cf4a65/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201112073958-5cba982894dd h1:5CtCZbICpIOFdgO940moixOPjc0178IU44m4EjOO5IY= -golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073 h1:8qxJSnu+7dRq6upnbntrmriWByIakBuct5OM/MdQC1M= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d h1:SZxvLBoTP5yHO3Frd4z4vrF+DBX9vMVanchswa69toE= +golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/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.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -793,8 +814,9 @@ golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxb 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-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e h1:EHBhcS0mlXEAVwNyO2dLfjToGsyY4j24pTs2ScHnX7s= golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba h1:O8mE0/t419eoIwhTFpKVkHiTs/Igowgfkj25AcZrtiE= +golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -826,8 +848,10 @@ golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtn 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= +golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117012304-6edc0a871e69/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -837,10 +861,11 @@ golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/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-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -886,7 +911,6 @@ google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4 google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a h1:pOwg4OoaRYScjmR4LlLgdtnyoHYTSAVhhqe5uPdpII8= google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -897,7 +921,6 @@ google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ij google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0 h1:rRYRFMVgRv6E0D70Skyfsr28tDXIuuPZyWGMPdMcnXg= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1 h1:zvIju4sqAGvwKspUQOhwnpcqSbzi7/H6QomNNjTL4sk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= @@ -909,7 +932,6 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0 h1:UhZDfRO8JRQru4/+LlLE0BRKGF8L+PICnvYZmx/fEGA= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= @@ -917,8 +939,9 @@ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLks 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-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= @@ -936,14 +959,23 @@ gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76 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/warnings.v0 v0.1.1/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20190905181640-827449938966/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= +gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= +gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -951,18 +983,18 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= 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-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/heapster v1.2.0-beta.1/go.mod h1:h1uhptVXMwC8xtZBYsPXKVi8fpdlYkTs6k949KozGrM= k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.4.0 h1:7+X0fUguPyrKEC4WjH8iGDg3laWgMo5tMnRTIGTTxGQ= -k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd h1:sOHNzJIkytDF6qadMNKhhDRpc6ODik8lVC6nOur7B2c= -k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= -k8s.io/kubernetes v1.20.0/go.mod h1:/xrHGNfoQphtkhZvyd5bA1lRmz+QkDVmBZu+O8QMoek= -k8s.io/system-validators v1.2.0/go.mod h1:bPldcLgkIUK22ALflnsXk8pvkTEndYdNuaHH6gRrl0Q= +k8s.io/klog/v2 v2.8.0 h1:Q3gmuM9hKEjefWFFYF0Mat+YyFJvsUyYuwyNNJ5C9Ts= +k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= +k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7 h1:vEx13qjvaZ4yfObSSXW7BrMc/KQBBT/Jyee8XtLf4x0= +k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE= +k8s.io/kubernetes v1.21.0-rc.0/go.mod h1:Yx6XZ8zalyqEk7but+j4+5SvLzdyH1eeqZ4cwO+5dD4= +k8s.io/system-validators v1.4.0/go.mod h1:bPldcLgkIUK22ALflnsXk8pvkTEndYdNuaHH6gRrl0Q= k8s.io/utils v0.0.0-20201110183641-67b214c5f920 h1:CbnUZsM497iRC5QMVkHwyl8s2tB3g7yaSHkYPkpgelw= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= @@ -974,13 +1006,17 @@ rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8 rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14 h1:TihvEz9MPj2u0KWds6E2OBUXfwaL4qRJ33c7HGiJpqk= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15 h1:4uqm9Mv+w2MmBYD+F4qf/v6tDFUdPOk29C095RbU5mY= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/controller-tools v0.2.8/go.mod h1:9VKHPszmf2DHz/QmHkcfZoewO6BL7pPs9uAiBVsaJSE= sigs.k8s.io/kube-storage-version-migrator v0.0.3/go.mod h1:mXfSLkx9xbJHQsgNDDUZK/iQTs2tMbx/hsJlWe6Fthw= -sigs.k8s.io/kustomize v2.0.3+incompatible/go.mod h1:MkjgH3RdOWrievjo6c9T245dYlB5QeXV4WCbnt/PEpU= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2 h1:YHQV7Dajm86OuqnIR6zAelnDWBRjo+YhYV9PmGrh1s8= +sigs.k8s.io/kustomize/api v0.8.5/go.mod h1:M377apnKT5ZHJS++6H4rQoCHmWtt6qTpp3mbe7p6OLY= +sigs.k8s.io/kustomize/cmd/config v0.9.7/go.mod h1:MvXCpHs77cfyxRmCNUQjIqCmZyYsbn5PyQpWiq44nW0= +sigs.k8s.io/kustomize/kustomize/v4 v4.0.5/go.mod h1:C7rYla7sI8EnxHE/xEhRBSHMNfcL91fx0uKmUlUhrBk= +sigs.k8s.io/kustomize/kyaml v0.10.15/go.mod h1:mlQFagmkm1P+W4lZJbJ/yaxMd8PqMRSC4cPcfUVt5Hg= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.1.0 h1:C4r9BgJ98vrKnnVCjwCSXcWjWe0NKcUQkmzDXZXGwH8= +sigs.k8s.io/structured-merge-diff/v4 v4.1.0/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/vendor/k8s.io/cloud-provider/node/helpers/BUILD b/vendor/k8s.io/cloud-provider/node/helpers/BUILD deleted file mode 100644 index 7bff59248f49..000000000000 --- a/vendor/k8s.io/cloud-provider/node/helpers/BUILD +++ /dev/null @@ -1,55 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "address.go", - "conditions.go", - "labels.go", - "status.go", - "taints.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/cloud-provider/node/helpers", - importpath = "k8s.io/cloud-provider/node/helpers", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/util/retry:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = [ - "address_test.go", - "taints_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - ], -) diff --git a/vendor/k8s.io/cloud-provider/service/helpers/BUILD b/vendor/k8s.io/cloud-provider/service/helpers/BUILD deleted file mode 100644 index fa63eecc3a9b..000000000000 --- a/vendor/k8s.io/cloud-provider/service/helpers/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["helper.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/cloud-provider/service/helpers", - importpath = "k8s.io/cloud-provider/service/helpers", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["helper_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], -) diff --git a/vendor/k8s.io/cloud-provider/volume/BUILD b/vendor/k8s.io/cloud-provider/volume/BUILD deleted file mode 100644 index 7e447e59b084..000000000000 --- a/vendor/k8s.io/cloud-provider/volume/BUILD +++ /dev/null @@ -1,27 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["constants.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/cloud-provider/volume", - importpath = "k8s.io/cloud-provider/volume", - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/cloud-provider/volume/errors:all-srcs", - "//staging/src/k8s.io/cloud-provider/volume/helpers:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/cloud-provider/volume/errors/BUILD b/vendor/k8s.io/cloud-provider/volume/errors/BUILD deleted file mode 100644 index 30deba0b0d88..000000000000 --- a/vendor/k8s.io/cloud-provider/volume/errors/BUILD +++ /dev/null @@ -1,24 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["errors.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/cloud-provider/volume/errors", - importpath = "k8s.io/cloud-provider/volume/errors", - visibility = ["//visibility:public"], - deps = ["//staging/src/k8s.io/apimachinery/pkg/types:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/cloud-provider/volume/helpers/BUILD b/vendor/k8s.io/cloud-provider/volume/helpers/BUILD deleted file mode 100644 index 515b7643c787..000000000000 --- a/vendor/k8s.io/cloud-provider/volume/helpers/BUILD +++ /dev/null @@ -1,47 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "rounding.go", - "zones.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/cloud-provider/volume/helpers", - importpath = "k8s.io/cloud-provider/volume/helpers", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/cloud-provider/volume:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "rounding_test.go", - "zones_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/cloud-provider/volume/helpers/zones.go b/vendor/k8s.io/cloud-provider/volume/helpers/zones.go index a3a7375d1b59..ff3a392846f1 100644 --- a/vendor/k8s.io/cloud-provider/volume/helpers/zones.go +++ b/vendor/k8s.io/cloud-provider/volume/helpers/zones.go @@ -23,7 +23,7 @@ import ( "strconv" "strings" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/util/sets" cloudvolume "k8s.io/cloud-provider/volume" "k8s.io/klog/v2" @@ -118,9 +118,12 @@ func SelectZonesForVolume(zoneParameterPresent, zonesParameterPresent bool, zone // pick node's zone for one of the replicas var ok bool - zoneFromNode, ok = node.ObjectMeta.Labels[v1.LabelFailureDomainBetaZone] + zoneFromNode, ok = node.ObjectMeta.Labels[v1.LabelTopologyZone] if !ok { - return nil, fmt.Errorf("%s Label for node missing", v1.LabelFailureDomainBetaZone) + zoneFromNode, ok = node.ObjectMeta.Labels[v1.LabelFailureDomainBetaZone] + if !ok { + return nil, fmt.Errorf("Either %s or %s Label for node missing", v1.LabelTopologyZone, v1.LabelFailureDomainBetaZone) + } } // if single replica volume and node with zone found, return immediately if numReplicas == 1 { @@ -135,7 +138,7 @@ func SelectZonesForVolume(zoneParameterPresent, zonesParameterPresent bool, zone } if (len(allowedTopologies) > 0) && (allowedZones.Len() == 0) { - return nil, fmt.Errorf("no matchLabelExpressions with %s key found in allowedTopologies. Please specify matchLabelExpressions with %s key", v1.LabelFailureDomainBetaZone, v1.LabelFailureDomainBetaZone) + return nil, fmt.Errorf("no matchLabelExpressions with %s key found in allowedTopologies. Please specify matchLabelExpressions with %s key", v1.LabelTopologyZone, v1.LabelTopologyZone) } if allowedZones.Len() > 0 { @@ -185,7 +188,7 @@ func ZonesFromAllowedTopologies(allowedTopologies []v1.TopologySelectorTerm) (se zones := make(sets.String) for _, term := range allowedTopologies { for _, exp := range term.MatchLabelExpressions { - if exp.Key == v1.LabelFailureDomainBetaZone { + if exp.Key == v1.LabelTopologyZone || exp.Key == v1.LabelFailureDomainBetaZone { for _, value := range exp.Values { zones.Insert(value) } diff --git a/vendor/k8s.io/cluster-bootstrap/token/api/BUILD b/vendor/k8s.io/cluster-bootstrap/token/api/BUILD deleted file mode 100644 index c8a6f5ac1ff6..000000000000 --- a/vendor/k8s.io/cluster-bootstrap/token/api/BUILD +++ /dev/null @@ -1,27 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "types.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/cluster-bootstrap/token/api", - importpath = "k8s.io/cluster-bootstrap/token/api", - visibility = ["//visibility:public"], - deps = ["//staging/src/k8s.io/api/core/v1:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/cluster-bootstrap/token/util/BUILD b/vendor/k8s.io/cluster-bootstrap/token/util/BUILD deleted file mode 100644 index 16b303cb1a05..000000000000 --- a/vendor/k8s.io/cluster-bootstrap/token/util/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["helpers.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/cluster-bootstrap/token/util", - importpath = "k8s.io/cluster-bootstrap/token/util", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/cluster-bootstrap/token/api:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["helpers_test.go"], - embed = [":go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/cluster-bootstrap/util/secrets/BUILD b/vendor/k8s.io/cluster-bootstrap/util/secrets/BUILD deleted file mode 100644 index 1db28910d571..000000000000 --- a/vendor/k8s.io/cluster-bootstrap/util/secrets/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["secrets.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/cluster-bootstrap/util/secrets", - importpath = "k8s.io/cluster-bootstrap/util/secrets", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/cluster-bootstrap/token/api:go_default_library", - "//staging/src/k8s.io/cluster-bootstrap/token/util:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["secrets_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/cluster-bootstrap/token/api:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/cluster-bootstrap/util/tokens/BUILD b/vendor/k8s.io/cluster-bootstrap/util/tokens/BUILD deleted file mode 100644 index 6b0fc63f4209..000000000000 --- a/vendor/k8s.io/cluster-bootstrap/util/tokens/BUILD +++ /dev/null @@ -1,24 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["tokens.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/cluster-bootstrap/util/tokens", - importpath = "k8s.io/cluster-bootstrap/util/tokens", - visibility = ["//visibility:public"], - deps = ["//staging/src/k8s.io/cluster-bootstrap/token/api:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/component-base/cli/flag/BUILD b/vendor/k8s.io/component-base/cli/flag/BUILD deleted file mode 100644 index 9c52db989892..000000000000 --- a/vendor/k8s.io/component-base/cli/flag/BUILD +++ /dev/null @@ -1,63 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "ciphersuites_flag_test.go", - "colon_separated_multimap_string_string_test.go", - "langle_separated_map_string_string_test.go", - "map_string_bool_test.go", - "map_string_string_test.go", - "namedcertkey_flag_test.go", - "string_slice_flag_test.go", - ], - embed = [":go_default_library"], - deps = ["//vendor/github.com/spf13/pflag:go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = [ - "ciphersuites_flag.go", - "ciphersuites_flag_114.go", - "colon_separated_multimap_string_string.go", - "configuration_map.go", - "flags.go", - "langle_separated_map_string_string.go", - "map_string_bool.go", - "map_string_string.go", - "namedcertkey_flag.go", - "noop.go", - "omitempty.go", - "sectioned.go", - "string_flag.go", - "string_slice_flag.go", - "tristate.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/component-base/cli/flag", - importpath = "k8s.io/component-base/cli/flag", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/github.com/spf13/pflag:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/component-base/cli/flag/sectioned.go b/vendor/k8s.io/component-base/cli/flag/sectioned.go index 493a6c0f0f99..d829177674e1 100644 --- a/vendor/k8s.io/component-base/cli/flag/sectioned.go +++ b/vendor/k8s.io/component-base/cli/flag/sectioned.go @@ -31,6 +31,8 @@ type NamedFlagSets struct { Order []string // FlagSets stores the flag sets by name. FlagSets map[string]*pflag.FlagSet + // NormalizeNameFunc is the normalize function which used to initialize FlagSets created by NamedFlagSets. + NormalizeNameFunc func(f *pflag.FlagSet, name string) pflag.NormalizedName } // FlagSet returns the flag set with the given name and adds it to the @@ -40,7 +42,12 @@ func (nfs *NamedFlagSets) FlagSet(name string) *pflag.FlagSet { nfs.FlagSets = map[string]*pflag.FlagSet{} } if _, ok := nfs.FlagSets[name]; !ok { - nfs.FlagSets[name] = pflag.NewFlagSet(name, pflag.ExitOnError) + flagSet := pflag.NewFlagSet(name, pflag.ExitOnError) + flagSet.SetNormalizeFunc(pflag.CommandLine.GetNormalizeFunc()) + if nfs.NormalizeNameFunc != nil { + flagSet.SetNormalizeFunc(nfs.NormalizeNameFunc) + } + nfs.FlagSets[name] = flagSet nfs.Order = append(nfs.Order, name) } return nfs.FlagSets[name] diff --git a/vendor/k8s.io/component-base/cli/flag/string_slice_flag.go b/vendor/k8s.io/component-base/cli/flag/string_slice_flag.go index 7b2e0f616956..37a1d778a39d 100644 --- a/vendor/k8s.io/component-base/cli/flag/string_slice_flag.go +++ b/vendor/k8s.io/component-base/cli/flag/string_slice_flag.go @@ -38,12 +38,16 @@ var _ goflag.Value = &StringSlice{} var _ pflag.Value = &StringSlice{} func (s *StringSlice) String() string { + if s == nil || s.value == nil { + return "" + } return strings.Join(*s.value, " ") } func (s *StringSlice) Set(val string) error { if s.value == nil || !s.changed { - *s.value = make([]string, 0) + v := make([]string, 0) + s.value = &v } *s.value = append(*s.value, val) s.changed = true diff --git a/vendor/k8s.io/component-base/cli/globalflag/BUILD b/vendor/k8s.io/component-base/cli/globalflag/BUILD deleted file mode 100644 index 0f1f1919b13e..000000000000 --- a/vendor/k8s.io/component-base/cli/globalflag/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["globalflags.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/component-base/cli/globalflag", - importpath = "k8s.io/component-base/cli/globalflag", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/component-base/logs:go_default_library", - "//vendor/github.com/spf13/pflag:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["globalflags_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/component-base/cli/flag:go_default_library", - "//vendor/github.com/spf13/pflag:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/component-base/cli/globalflag/globalflags.go b/vendor/k8s.io/component-base/cli/globalflag/globalflags.go index acdf8b688f24..7a5640be7439 100644 --- a/vendor/k8s.io/component-base/cli/globalflag/globalflags.go +++ b/vendor/k8s.io/component-base/cli/globalflag/globalflags.go @@ -20,7 +20,6 @@ import ( "flag" "fmt" "os" - "strings" "github.com/spf13/pflag" "k8s.io/component-base/logs" @@ -41,23 +40,19 @@ func AddGlobalFlags(fs *pflag.FlagSet, name string) { func addKlogFlags(fs *pflag.FlagSet) { local := flag.NewFlagSet(os.Args[0], flag.ExitOnError) klog.InitFlags(local) + normalizeFunc := fs.GetNormalizeFunc() local.VisitAll(func(fl *flag.Flag) { - fl.Name = normalize(fl.Name) + fl.Name = string(normalizeFunc(fs, fl.Name)) fs.AddGoFlag(fl) }) } -// normalize replaces underscores with hyphens -// we should always use hyphens instead of underscores when registering component flags -func normalize(s string) string { - return strings.Replace(s, "_", "-", -1) -} - // Register adds a flag to local that targets the Value associated with the Flag named globalName in flag.CommandLine. func Register(local *pflag.FlagSet, globalName string) { if f := flag.CommandLine.Lookup(globalName); f != nil { pflagFlag := pflag.PFlagFromGoFlag(f) - pflagFlag.Name = normalize(pflagFlag.Name) + normalizeFunc := local.GetNormalizeFunc() + pflagFlag.Name = string(normalizeFunc(local, pflagFlag.Name)) local.AddFlag(pflagFlag) } else { panic(fmt.Sprintf("failed to find flag in global flagset (flag): %s", globalName)) diff --git a/vendor/k8s.io/component-base/codec/BUILD b/vendor/k8s.io/component-base/codec/BUILD deleted file mode 100644 index 9e848249cb6e..000000000000 --- a/vendor/k8s.io/component-base/codec/BUILD +++ /dev/null @@ -1,27 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["codec.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/component-base/codec", - importpath = "k8s.io/component-base/codec", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/component-base/config/BUILD b/vendor/k8s.io/component-base/config/BUILD deleted file mode 100644 index b92f4e0fd884..000000000000 --- a/vendor/k8s.io/component-base/config/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/component-base/config", - importpath = "k8s.io/component-base/config", - visibility = ["//visibility:public"], - deps = ["//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/component-base/config/options:all-srcs", - "//staging/src/k8s.io/component-base/config/testing:all-srcs", - "//staging/src/k8s.io/component-base/config/v1alpha1:all-srcs", - "//staging/src/k8s.io/component-base/config/validation:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/component-base/config/types.go b/vendor/k8s.io/component-base/config/types.go index f5fef2508b29..c6cd112af131 100644 --- a/vendor/k8s.io/component-base/config/types.go +++ b/vendor/k8s.io/component-base/config/types.go @@ -65,7 +65,7 @@ type LeaderElectionConfiguration struct { // resourceName indicates the name of resource object that will be used to lock // during leader election cycles. ResourceName string - // resourceName indicates the namespace of resource object that will be used to lock + // resourceNamespace indicates the namespace of resource object that will be used to lock // during leader election cycles. ResourceNamespace string } diff --git a/vendor/k8s.io/component-base/config/v1alpha1/BUILD b/vendor/k8s.io/component-base/config/v1alpha1/BUILD deleted file mode 100644 index d6deae7a9b1e..000000000000 --- a/vendor/k8s.io/component-base/config/v1alpha1/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "defaults.go", - "doc.go", - "register.go", - "types.go", - "zz_generated.conversion.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/component-base/config/v1alpha1", - importpath = "k8s.io/component-base/config/v1alpha1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/component-base/config:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/component-base/config/validation/BUILD b/vendor/k8s.io/component-base/config/validation/BUILD deleted file mode 100644 index fe29ae9c5b9d..000000000000 --- a/vendor/k8s.io/component-base/config/validation/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["validation.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/component-base/config/validation", - importpath = "k8s.io/component-base/config/validation", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/component-base/config:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["validation_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/component-base/config:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/component-base/configz/BUILD b/vendor/k8s.io/component-base/configz/BUILD deleted file mode 100644 index 9c41245c20de..000000000000 --- a/vendor/k8s.io/component-base/configz/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["configz.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/component-base/configz", - importpath = "k8s.io/component-base/configz", -) - -go_test( - name = "go_default_test", - srcs = ["configz_test.go"], - embed = [":go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/component-base/featuregate/BUILD b/vendor/k8s.io/component-base/featuregate/BUILD deleted file mode 100644 index c5513c01e612..000000000000 --- a/vendor/k8s.io/component-base/featuregate/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["feature_gate.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/component-base/featuregate", - importpath = "k8s.io/component-base/featuregate", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/naming:go_default_library", - "//vendor/github.com/spf13/pflag:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["feature_gate_test.go"], - embed = [":go_default_library"], - deps = [ - "//vendor/github.com/spf13/pflag:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/component-base/featuregate/testing:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/component-base/logs/BUILD b/vendor/k8s.io/component-base/logs/BUILD deleted file mode 100644 index 0183730b539d..000000000000 --- a/vendor/k8s.io/component-base/logs/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "logs.go", - "options.go", - "registry.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/component-base/logs", - importpath = "k8s.io/component-base/logs", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/component-base/logs/json:go_default_library", - "//staging/src/k8s.io/component-base/logs/sanitization:go_default_library", - "//vendor/github.com/go-logr/logr:go_default_library", - "//vendor/github.com/spf13/pflag:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/component-base/logs/datapol:all-srcs", - "//staging/src/k8s.io/component-base/logs/json:all-srcs", - "//staging/src/k8s.io/component-base/logs/logreduction:all-srcs", - "//staging/src/k8s.io/component-base/logs/sanitization:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/component-base/logs/datapol/BUILD b/vendor/k8s.io/component-base/logs/datapol/BUILD deleted file mode 100644 index 4f08886ddec1..000000000000 --- a/vendor/k8s.io/component-base/logs/datapol/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "datapol.go", - "externaltypes.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/component-base/logs/datapol", - importpath = "k8s.io/component-base/logs/datapol", - visibility = ["//visibility:public"], - deps = ["//vendor/k8s.io/klog/v2:go_default_library"], -) - -go_test( - name = "go_default_test", - srcs = [ - "datapol_test.go", - "externaltypes_test.go", - ], - embed = [":go_default_library"], - deps = ["//vendor/github.com/stretchr/testify/assert:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/component-base/logs/json/BUILD b/vendor/k8s.io/component-base/logs/json/BUILD deleted file mode 100644 index 3fb7831c8779..000000000000 --- a/vendor/k8s.io/component-base/logs/json/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["json.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/component-base/logs/json", - importpath = "k8s.io/component-base/logs/json", - visibility = ["//visibility:public"], - deps = [ - "//vendor/github.com/go-logr/logr:go_default_library", - "//vendor/go.uber.org/zap:go_default_library", - "//vendor/go.uber.org/zap/zapcore:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "json_benchmark_test.go", - "json_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/go.uber.org/zap:go_default_library", - "//vendor/go.uber.org/zap/zapcore:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/component-base/logs/json/json.go b/vendor/k8s.io/component-base/logs/json/json.go index f9bb55656fa7..fd23246979e6 100644 --- a/vendor/k8s.io/component-base/logs/json/json.go +++ b/vendor/k8s.io/component-base/logs/json/json.go @@ -148,8 +148,9 @@ func (l *zapLogger) WithName(name string) logr.Logger { var encoderConfig = zapcore.EncoderConfig{ MessageKey: "msg", - TimeKey: "ts", - EncodeTime: zapcore.EpochMillisTimeEncoder, + TimeKey: "ts", + EncodeTime: zapcore.EpochMillisTimeEncoder, + EncodeDuration: zapcore.StringDurationEncoder, } // NewJSONLogger creates a new json logr.Logger using the given Zap Logger to log. diff --git a/vendor/k8s.io/component-base/logs/logreduction/BUILD b/vendor/k8s.io/component-base/logs/logreduction/BUILD deleted file mode 100644 index d0fa90d14f18..000000000000 --- a/vendor/k8s.io/component-base/logs/logreduction/BUILD +++ /dev/null @@ -1,29 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["logreduction.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/component-base/logs/logreduction", - importpath = "k8s.io/component-base/logs/logreduction", - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["logreduction_test.go"], - embed = [":go_default_library"], -) diff --git a/vendor/k8s.io/component-base/logs/options.go b/vendor/k8s.io/component-base/logs/options.go index 3d9fd4c08ffb..1b53a6b2cdeb 100644 --- a/vendor/k8s.io/component-base/logs/options.go +++ b/vendor/k8s.io/component-base/logs/options.go @@ -57,9 +57,9 @@ func NewOptions() *Options { func (o *Options) Validate() []error { errs := []error{} if o.LogFormat != defaultLogFormat { - allFlags := unsupportedLoggingFlags() + allFlags := unsupportedLoggingFlags(hyphensToUnderscores) for _, fname := range allFlags { - if flagIsSet(fname) { + if flagIsSet(fname, hyphensToUnderscores) { errs = append(errs, fmt.Errorf("non-default logging format doesn't honor flag: %s", fname)) } } @@ -70,11 +70,23 @@ func (o *Options) Validate() []error { return errs } -func flagIsSet(name string) bool { +// hyphensToUnderscores replaces hyphens with underscores +// we should always use underscores instead of hyphens when validate flags +func hyphensToUnderscores(s string) string { + return strings.Replace(s, "-", "_", -1) +} + +func flagIsSet(name string, normalizeFunc func(name string) string) bool { f := flag.Lookup(name) if f != nil { return f.DefValue != f.Value.String() } + if normalizeFunc != nil { + f = flag.Lookup(normalizeFunc(name)) + if f != nil { + return f.DefValue != f.Value.String() + } + } pf := pflag.Lookup(name) if pf != nil { return pf.DefValue != pf.Value.String() @@ -84,7 +96,12 @@ func flagIsSet(name string) bool { // AddFlags add logging-format flag func (o *Options) AddFlags(fs *pflag.FlagSet) { - unsupportedFlags := fmt.Sprintf("--%s", strings.Join(unsupportedLoggingFlags(), ", --")) + normalizeFunc := func(name string) string { + f := fs.GetNormalizeFunc() + return string(f(fs, name)) + } + + unsupportedFlags := fmt.Sprintf("--%s", strings.Join(unsupportedLoggingFlags(normalizeFunc), ", --")) formats := fmt.Sprintf(`"%s"`, strings.Join(logRegistry.List(), `", "`)) fs.StringVar(&o.LogFormat, logFormatFlagName, defaultLogFormat, fmt.Sprintf("Sets the log format. Permitted formats: %s.\nNon-default formats don't honor these flags: %s.\nNon-default choices are currently alpha and subject to change without warning.", formats, unsupportedFlags)) @@ -109,7 +126,7 @@ func (o *Options) Get() (logr.Logger, error) { return logRegistry.Get(o.LogFormat) } -func unsupportedLoggingFlags() []string { +func unsupportedLoggingFlags(normalizeFunc func(name string) string) []string { allFlags := []string{} // k8s.io/klog flags @@ -117,7 +134,11 @@ func unsupportedLoggingFlags() []string { klog.InitFlags(fs) fs.VisitAll(func(flag *flag.Flag) { if _, found := supportedLogsFlags[flag.Name]; !found { - allFlags = append(allFlags, flag.Name) + name := flag.Name + if normalizeFunc != nil { + name = normalizeFunc(name) + } + allFlags = append(allFlags, name) } }) diff --git a/vendor/k8s.io/component-base/logs/sanitization/BUILD b/vendor/k8s.io/component-base/logs/sanitization/BUILD deleted file mode 100644 index 7369331bbb25..000000000000 --- a/vendor/k8s.io/component-base/logs/sanitization/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["sanitization.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/component-base/logs/sanitization", - importpath = "k8s.io/component-base/logs/sanitization", - visibility = ["//visibility:public"], - deps = ["//staging/src/k8s.io/component-base/logs/datapol:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["sanitization_test.go"], - embed = [":go_default_library"], - deps = ["//vendor/github.com/stretchr/testify/assert:go_default_library"], -) diff --git a/vendor/k8s.io/component-base/metrics/BUILD b/vendor/k8s.io/component-base/metrics/BUILD deleted file mode 100644 index b75763c4c1bd..000000000000 --- a/vendor/k8s.io/component-base/metrics/BUILD +++ /dev/null @@ -1,101 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "collector.go", - "counter.go", - "desc.go", - "gauge.go", - "histogram.go", - "http.go", - "labels.go", - "metric.go", - "options.go", - "opts.go", - "processstarttime.go", - "registry.go", - "summary.go", - "value.go", - "version.go", - "version_parser.go", - "wrappers.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/component-base/metrics", - importpath = "k8s.io/component-base/metrics", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/version:go_default_library", - "//staging/src/k8s.io/component-base/version:go_default_library", - "//vendor/github.com/blang/semver:go_default_library", - "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", - "//vendor/github.com/prometheus/client_golang/prometheus/promhttp:go_default_library", - "//vendor/github.com/prometheus/client_model/go:go_default_library", - "//vendor/github.com/prometheus/procfs:go_default_library", - "//vendor/github.com/spf13/pflag:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "collector_test.go", - "counter_test.go", - "desc_test.go", - "gauge_test.go", - "histogram_test.go", - "http_test.go", - "opts_test.go", - "registry_test.go", - "summary_test.go", - "version_parser_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/version:go_default_library", - "//vendor/github.com/blang/semver:go_default_library", - "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", - "//vendor/github.com/prometheus/client_golang/prometheus/testutil:go_default_library", - "//vendor/github.com/prometheus/common/expfmt:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:all-srcs", - "//staging/src/k8s.io/component-base/metrics/prometheus/clientgo:all-srcs", - "//staging/src/k8s.io/component-base/metrics/prometheus/ratelimiter:all-srcs", - "//staging/src/k8s.io/component-base/metrics/prometheus/restclient:all-srcs", - "//staging/src/k8s.io/component-base/metrics/prometheus/version:all-srcs", - "//staging/src/k8s.io/component-base/metrics/prometheus/workqueue:all-srcs", - "//staging/src/k8s.io/component-base/metrics/testutil:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -# Packages allowed to import github.com/prometheus -package_group( - name = "prometheus_import_allow_list", - packages = [ - "//cluster/images/etcd-version-monitor", - "//pkg/scheduler/framework/v1alpha1", - "//pkg/volume/util/operationexecutor", - "//staging/src/k8s.io/apiserver/pkg/util/flowcontrol/metrics", - "//staging/src/k8s.io/component-base/metrics/...", - "//test/e2e_node", - "//test/integration/apiserver/flowcontrol", - "//vendor/...", - ], -) diff --git a/vendor/k8s.io/component-base/metrics/OWNERS b/vendor/k8s.io/component-base/metrics/OWNERS index a9c3172f3989..6010d505f653 100644 --- a/vendor/k8s.io/component-base/metrics/OWNERS +++ b/vendor/k8s.io/component-base/metrics/OWNERS @@ -6,5 +6,6 @@ approvers: - RainbowMango reviewers: - sig-instrumentation-reviewers +- YoyinZyc labels: - sig/instrumentation diff --git a/vendor/k8s.io/component-base/metrics/collector.go b/vendor/k8s.io/component-base/metrics/collector.go index 090342e1623f..61ad951e5b9f 100644 --- a/vendor/k8s.io/component-base/metrics/collector.go +++ b/vendor/k8s.io/component-base/metrics/collector.go @@ -49,10 +49,10 @@ type StableCollector interface { // is a convenient assistant for custom collectors. // It is recommend that inherit BaseStableCollector when implementing custom collectors. type BaseStableCollector struct { - descriptors map[string]*Desc // stores all descriptors by pair, these are collected from DescribeWithStability(). - registrable map[string]*Desc // stores registrable descriptors by pair, is a subset of descriptors. - hidden map[string]*Desc // stores hidden descriptors by pair, is a subset of descriptors. - self StableCollector + descriptors map[string]*Desc // stores all descriptors by pair, these are collected from DescribeWithStability(). + registerable map[string]*Desc // stores registerable descriptors by pair, is a subset of descriptors. + hidden map[string]*Desc // stores hidden descriptors by pair, is a subset of descriptors. + self StableCollector } // DescribeWithStability sends all descriptors to the provided channel. @@ -64,7 +64,7 @@ func (bsc *BaseStableCollector) DescribeWithStability(ch chan<- *Desc) { // Describe sends all descriptors to the provided channel. // It intend to be called by prometheus registry. func (bsc *BaseStableCollector) Describe(ch chan<- *prometheus.Desc) { - for _, d := range bsc.registrable { + for _, d := range bsc.registerable { ch <- d.toPrometheusDesc() } } @@ -128,11 +128,11 @@ func (bsc *BaseStableCollector) init(self StableCollector) { } func (bsc *BaseStableCollector) trackRegistrableDescriptor(d *Desc) { - if bsc.registrable == nil { - bsc.registrable = make(map[string]*Desc) + if bsc.registerable == nil { + bsc.registerable = make(map[string]*Desc) } - bsc.registrable[d.fqName] = d + bsc.registerable[d.fqName] = d } func (bsc *BaseStableCollector) trackHiddenDescriptor(d *Desc) { @@ -158,7 +158,7 @@ func (bsc *BaseStableCollector) Create(version *semver.Version, self StableColle } } - if len(bsc.registrable) > 0 { + if len(bsc.registerable) > 0 { return true } @@ -173,7 +173,7 @@ func (bsc *BaseStableCollector) ClearState() { } bsc.descriptors = nil - bsc.registrable = nil + bsc.registerable = nil bsc.hidden = nil bsc.self = nil } diff --git a/vendor/k8s.io/component-base/metrics/counter.go b/vendor/k8s.io/component-base/metrics/counter.go index de694310953d..addf680c87b6 100644 --- a/vendor/k8s.io/component-base/metrics/counter.go +++ b/vendor/k8s.io/component-base/metrics/counter.go @@ -17,8 +17,10 @@ limitations under the License. package metrics import ( + "context" "github.com/blang/semver" "github.com/prometheus/client_golang/prometheus" + dto "github.com/prometheus/client_model/go" ) // Counter is our internal representation for our wrapping struct around prometheus @@ -30,6 +32,9 @@ type Counter struct { selfCollector } +// The implementation of the Metric interface is expected by testutil.GetCounterMetricValue. +var _ Metric = &Counter{} + // NewCounter returns an object which satisfies the kubeCollector and CounterMetric interfaces. // However, the object returned will not measure anything unless the collector is first // registered, since the metric is lazily instantiated. @@ -45,6 +50,14 @@ func NewCounter(opts *CounterOpts) *Counter { return kc } +func (c *Counter) Desc() *prometheus.Desc { + return c.metric.Desc() +} + +func (c *Counter) Write(to *dto.Metric) error { + return c.metric.Write(to) +} + // Reset resets the underlying prometheus Counter to start counting from 0 again func (c *Counter) Reset() { if !c.IsCreated() { @@ -79,6 +92,11 @@ func (c *Counter) initializeDeprecatedMetric() { c.initializeMetric() } +// WithContext allows the normal Counter metric to pass in context. The context is no-op now. +func (c *Counter) WithContext(ctx context.Context) CounterMetric { + return c.CounterMetric +} + // CounterVec is the internal representation of our wrapping struct around prometheus // counterVecs. CounterVec implements both kubeCollector and CounterVecMetric. type CounterVec struct { @@ -94,13 +112,20 @@ type CounterVec struct { func NewCounterVec(opts *CounterOpts, labels []string) *CounterVec { opts.StabilityLevel.setDefaults() + fqName := BuildFQName(opts.Namespace, opts.Subsystem, opts.Name) + allowListLock.RLock() + if allowList, ok := labelValueAllowLists[fqName]; ok { + opts.LabelValueAllowLists = allowList + } + allowListLock.RUnlock() + cv := &CounterVec{ CounterVec: noopCounterVec, CounterOpts: opts, originalLabels: labels, lazyMetric: lazyMetric{}, } - cv.lazyInit(cv, BuildFQName(opts.Namespace, opts.Subsystem, opts.Name)) + cv.lazyInit(cv, fqName) return cv } @@ -140,6 +165,9 @@ func (v *CounterVec) WithLabelValues(lvs ...string) CounterMetric { if !v.IsCreated() { return noop // return no-op counter } + if v.LabelValueAllowLists != nil { + v.LabelValueAllowLists.ConstrainToAllowedList(v.originalLabels, lvs) + } return v.CounterVec.WithLabelValues(lvs...) } @@ -151,6 +179,9 @@ func (v *CounterVec) With(labels map[string]string) CounterMetric { if !v.IsCreated() { return noop // return no-op counter } + if v.LabelValueAllowLists != nil { + v.LabelValueAllowLists.ConstrainLabelMap(labels) + } return v.CounterVec.With(labels) } @@ -176,3 +207,27 @@ func (v *CounterVec) Reset() { v.CounterVec.Reset() } + +// WithContext returns wrapped CounterVec with context +func (v *CounterVec) WithContext(ctx context.Context) *CounterVecWithContext { + return &CounterVecWithContext{ + ctx: ctx, + CounterVec: *v, + } +} + +// CounterVecWithContext is the wrapper of CounterVec with context. +type CounterVecWithContext struct { + CounterVec + ctx context.Context +} + +// WithLabelValues is the wrapper of CounterVec.WithLabelValues. +func (vc *CounterVecWithContext) WithLabelValues(lvs ...string) CounterMetric { + return vc.CounterVec.WithLabelValues(lvs...) +} + +// With is the wrapper of CounterVec.With. +func (vc *CounterVecWithContext) With(labels map[string]string) CounterMetric { + return vc.CounterVec.With(labels) +} diff --git a/vendor/k8s.io/component-base/metrics/gauge.go b/vendor/k8s.io/component-base/metrics/gauge.go index 7b4469fcb874..a8d9c201016f 100644 --- a/vendor/k8s.io/component-base/metrics/gauge.go +++ b/vendor/k8s.io/component-base/metrics/gauge.go @@ -17,6 +17,7 @@ limitations under the License. package metrics import ( + "context" "github.com/blang/semver" "github.com/prometheus/client_golang/prometheus" @@ -73,6 +74,11 @@ func (g *Gauge) initializeDeprecatedMetric() { g.initializeMetric() } +// WithContext allows the normal Gauge metric to pass in context. The context is no-op now. +func (g *Gauge) WithContext(ctx context.Context) GaugeMetric { + return g.GaugeMetric +} + // GaugeVec is the internal representation of our wrapping struct around prometheus // gaugeVecs. kubeGaugeVec implements both kubeCollector and KubeGaugeVec. type GaugeVec struct { @@ -88,13 +94,20 @@ type GaugeVec struct { func NewGaugeVec(opts *GaugeOpts, labels []string) *GaugeVec { opts.StabilityLevel.setDefaults() + fqName := BuildFQName(opts.Namespace, opts.Subsystem, opts.Name) + allowListLock.RLock() + if allowList, ok := labelValueAllowLists[fqName]; ok { + opts.LabelValueAllowLists = allowList + } + allowListLock.RUnlock() + cv := &GaugeVec{ GaugeVec: noopGaugeVec, GaugeOpts: opts, originalLabels: labels, lazyMetric: lazyMetric{}, } - cv.lazyInit(cv, BuildFQName(opts.Namespace, opts.Subsystem, opts.Name)) + cv.lazyInit(cv, fqName) return cv } @@ -133,6 +146,9 @@ func (v *GaugeVec) WithLabelValues(lvs ...string) GaugeMetric { if !v.IsCreated() { return noop // return no-op gauge } + if v.LabelValueAllowLists != nil { + v.LabelValueAllowLists.ConstrainToAllowedList(v.originalLabels, lvs) + } return v.GaugeVec.WithLabelValues(lvs...) } @@ -144,6 +160,9 @@ func (v *GaugeVec) With(labels map[string]string) GaugeMetric { if !v.IsCreated() { return noop // return no-op gauge } + if v.LabelValueAllowLists != nil { + v.LabelValueAllowLists.ConstrainLabelMap(labels) + } return v.GaugeVec.With(labels) } @@ -191,3 +210,27 @@ func NewGaugeFunc(opts GaugeOpts, function func() float64) GaugeFunc { return newGaugeFunc(opts, function, v) } + +// WithContext returns wrapped GaugeVec with context +func (v *GaugeVec) WithContext(ctx context.Context) *GaugeVecWithContext { + return &GaugeVecWithContext{ + ctx: ctx, + GaugeVec: *v, + } +} + +// GaugeVecWithContext is the wrapper of GaugeVec with context. +type GaugeVecWithContext struct { + GaugeVec + ctx context.Context +} + +// WithLabelValues is the wrapper of GaugeVec.WithLabelValues. +func (vc *GaugeVecWithContext) WithLabelValues(lvs ...string) GaugeMetric { + return vc.GaugeVec.WithLabelValues(lvs...) +} + +// With is the wrapper of GaugeVec.With. +func (vc *GaugeVecWithContext) With(labels map[string]string) GaugeMetric { + return vc.GaugeVec.With(labels) +} diff --git a/vendor/k8s.io/component-base/metrics/histogram.go b/vendor/k8s.io/component-base/metrics/histogram.go index d233e12b92b2..9dd75388b33e 100644 --- a/vendor/k8s.io/component-base/metrics/histogram.go +++ b/vendor/k8s.io/component-base/metrics/histogram.go @@ -17,6 +17,7 @@ limitations under the License. package metrics import ( + "context" "github.com/blang/semver" "github.com/prometheus/client_golang/prometheus" ) @@ -83,6 +84,11 @@ func (h *Histogram) initializeDeprecatedMetric() { h.initializeMetric() } +// WithContext allows the normal Histogram metric to pass in context. The context is no-op now. +func (h *Histogram) WithContext(ctx context.Context) ObserverMetric { + return h.ObserverMetric +} + // HistogramVec is the internal representation of our wrapping struct around prometheus // histogramVecs. type HistogramVec struct { @@ -98,13 +104,20 @@ type HistogramVec struct { func NewHistogramVec(opts *HistogramOpts, labels []string) *HistogramVec { opts.StabilityLevel.setDefaults() + fqName := BuildFQName(opts.Namespace, opts.Subsystem, opts.Name) + allowListLock.RLock() + if allowList, ok := labelValueAllowLists[fqName]; ok { + opts.LabelValueAllowLists = allowList + } + allowListLock.RUnlock() + v := &HistogramVec{ HistogramVec: noopHistogramVec, HistogramOpts: opts, originalLabels: labels, lazyMetric: lazyMetric{}, } - v.lazyInit(v, BuildFQName(opts.Namespace, opts.Subsystem, opts.Name)) + v.lazyInit(v, fqName) return v } @@ -139,6 +152,9 @@ func (v *HistogramVec) WithLabelValues(lvs ...string) ObserverMetric { if !v.IsCreated() { return noop } + if v.LabelValueAllowLists != nil { + v.LabelValueAllowLists.ConstrainToAllowedList(v.originalLabels, lvs) + } return v.HistogramVec.WithLabelValues(lvs...) } @@ -150,6 +166,9 @@ func (v *HistogramVec) With(labels map[string]string) ObserverMetric { if !v.IsCreated() { return noop } + if v.LabelValueAllowLists != nil { + v.LabelValueAllowLists.ConstrainLabelMap(labels) + } return v.HistogramVec.With(labels) } @@ -175,3 +194,27 @@ func (v *HistogramVec) Reset() { v.HistogramVec.Reset() } + +// WithContext returns wrapped HistogramVec with context +func (v *HistogramVec) WithContext(ctx context.Context) *HistogramVecWithContext { + return &HistogramVecWithContext{ + ctx: ctx, + HistogramVec: *v, + } +} + +// HistogramVecWithContext is the wrapper of HistogramVec with context. +type HistogramVecWithContext struct { + HistogramVec + ctx context.Context +} + +// WithLabelValues is the wrapper of HistogramVec.WithLabelValues. +func (vc *HistogramVecWithContext) WithLabelValues(lvs ...string) ObserverMetric { + return vc.HistogramVec.WithLabelValues(lvs...) +} + +// With is the wrapper of HistogramVec.With. +func (vc *HistogramVecWithContext) With(labels map[string]string) ObserverMetric { + return vc.HistogramVec.With(labels) +} diff --git a/vendor/k8s.io/component-base/metrics/legacyregistry/BUILD b/vendor/k8s.io/component-base/metrics/legacyregistry/BUILD deleted file mode 100644 index f2e32beac574..000000000000 --- a/vendor/k8s.io/component-base/metrics/legacyregistry/BUILD +++ /dev/null @@ -1,28 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["registry.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/component-base/metrics/legacyregistry", - importpath = "k8s.io/component-base/metrics/legacyregistry", - deps = [ - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", - "//vendor/github.com/prometheus/client_golang/prometheus/promhttp:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/component-base/metrics/metric.go b/vendor/k8s.io/component-base/metrics/metric.go index bb1f69627099..2f7b880d862a 100644 --- a/vendor/k8s.io/component-base/metrics/metric.go +++ b/vendor/k8s.io/component-base/metrics/metric.go @@ -87,10 +87,24 @@ func (r *lazyMetric) lazyInit(self kubeCollector, fqName string) { r.self = self } -// determineDeprecationStatus figures out whether the lazy metric should be deprecated or not. +// preprocessMetric figures out whether the lazy metric should be hidden or not. // This method takes a Version argument which should be the version of the binary in which -// this code is currently being executed. -func (r *lazyMetric) determineDeprecationStatus(version semver.Version) { +// this code is currently being executed. A metric can be hidden under two conditions: +// 1. if the metric is deprecated and is outside the grace period (i.e. has been +// deprecated for more than one release +// 2. if the metric is manually disabled via a CLI flag. +// +// Disclaimer: disabling a metric via a CLI flag has higher precedence than +// deprecation and will override show-hidden-metrics for the explicitly +// disabled metric. +func (r *lazyMetric) preprocessMetric(version semver.Version) { + disabledMetricsLock.RLock() + defer disabledMetricsLock.RUnlock() + // disabling metrics is higher in precedence than showing hidden metrics + if _, ok := disabledMetrics[r.fqName]; ok { + r.isHidden = true + return + } selfVersion := r.self.DeprecatedVersion() if selfVersion == nil { return @@ -99,6 +113,7 @@ func (r *lazyMetric) determineDeprecationStatus(version semver.Version) { if selfVersion.LTE(version) { r.isDeprecated = true } + if ShouldShowHidden() { klog.Warningf("Hidden metrics (%s) have been manually overridden, showing this very deprecated metric.", r.fqName) return @@ -126,7 +141,7 @@ func (r *lazyMetric) IsDeprecated() bool { // created. func (r *lazyMetric) Create(version *semver.Version) bool { if version != nil { - r.determineDeprecationStatus(*version) + r.preprocessMetric(*version) } // let's not create if this metric is slated to be hidden if r.IsHidden() { diff --git a/vendor/k8s.io/component-base/metrics/options.go b/vendor/k8s.io/component-base/metrics/options.go index c15dd9b4d205..91a76ba7e51c 100644 --- a/vendor/k8s.io/component-base/metrics/options.go +++ b/vendor/k8s.io/component-base/metrics/options.go @@ -18,6 +18,7 @@ package metrics import ( "fmt" + "regexp" "github.com/blang/semver" "github.com/spf13/pflag" @@ -28,6 +29,8 @@ import ( // Options has all parameters needed for exposing metrics from components type Options struct { ShowHiddenMetricsForVersion string + DisabledMetrics []string + AllowListMapping map[string]string } // NewOptions returns default metrics options @@ -37,12 +40,20 @@ func NewOptions() *Options { // Validate validates metrics flags options. func (o *Options) Validate() []error { + var errs []error err := validateShowHiddenMetricsVersion(parseVersion(version.Get()), o.ShowHiddenMetricsForVersion) if err != nil { - return []error{err} + errs = append(errs, err) } - return nil + if err := validateAllowMetricLabel(o.AllowListMapping); err != nil { + errs = append(errs, err) + } + + if len(errs) == 0 { + return nil + } + return errs } // AddFlags adds flags for exposing component metrics. @@ -56,13 +67,33 @@ func (o *Options) AddFlags(fs *pflag.FlagSet) { "The format is ., e.g.: '1.16'. "+ "The purpose of this format is make sure you have the opportunity to notice if the next release hides additional metrics, "+ "rather than being surprised when they are permanently removed in the release after that.") + fs.StringSliceVar(&o.DisabledMetrics, + "disabled-metrics", + o.DisabledMetrics, + "This flag provides an escape hatch for misbehaving metrics. "+ + "You must provide the fully qualified metric name in order to disable it. "+ + "Disclaimer: disabling metrics is higher in precedence than showing hidden metrics.") + fs.StringToStringVar(&o.AllowListMapping, "allow-metric-labels", o.AllowListMapping, + "The map from metric-label to value allow-list of this label. The key's format is ,. "+ + "The value's format is ,..."+ + "e.g. metric1,label1='v1,v2,v3', metric1,label2='v1,v2,v3' metric2,label1='v1,v2,v3'.") } // Apply applies parameters into global configuration of metrics. func (o *Options) Apply() { - if o != nil && len(o.ShowHiddenMetricsForVersion) > 0 { + if o == nil { + return + } + if len(o.ShowHiddenMetricsForVersion) > 0 { SetShowHidden() } + // set disabled metrics + for _, metricName := range o.DisabledMetrics { + SetDisabledMetric(metricName) + } + if o.AllowListMapping != nil { + SetLabelAllowListFromCLI(o.AllowListMapping) + } } func validateShowHiddenMetricsVersion(currentVersion semver.Version, targetVersionStr string) error { @@ -77,3 +108,18 @@ func validateShowHiddenMetricsVersion(currentVersion semver.Version, targetVersi return nil } + +func validateAllowMetricLabel(allowListMapping map[string]string) error { + if allowListMapping == nil { + return nil + } + metricNameRegex := `[a-zA-Z_:][a-zA-Z0-9_:]*` + labelRegex := `[a-zA-Z_][a-zA-Z0-9_]*` + for k := range allowListMapping { + reg := regexp.MustCompile(metricNameRegex + `,` + labelRegex) + if reg.FindString(k) != k { + return fmt.Errorf("--allow-metric-labels must has a list of kv pair with format `metricName:labelName=labelValue, labelValue,...`") + } + } + return nil +} diff --git a/vendor/k8s.io/component-base/metrics/opts.go b/vendor/k8s.io/component-base/metrics/opts.go index 906050c7f78a..04203b74e0a5 100644 --- a/vendor/k8s.io/component-base/metrics/opts.go +++ b/vendor/k8s.io/component-base/metrics/opts.go @@ -18,10 +18,17 @@ package metrics import ( "fmt" + "strings" "sync" "time" "github.com/prometheus/client_golang/prometheus" + "k8s.io/apimachinery/pkg/util/sets" +) + +var ( + labelValueAllowLists = map[string]*MetricLabelAllowList{} + allowListLock sync.RWMutex ) // KubeOpts is superset struct for prometheus.Opts. The prometheus Opts structure @@ -31,15 +38,16 @@ import ( // Name must be set to a non-empty string. DeprecatedVersion is defined only // if the metric for which this options applies is, in fact, deprecated. type KubeOpts struct { - Namespace string - Subsystem string - Name string - Help string - ConstLabels map[string]string - DeprecatedVersion string - deprecateOnce sync.Once - annotateOnce sync.Once - StabilityLevel StabilityLevel + Namespace string + Subsystem string + Name string + Help string + ConstLabels map[string]string + DeprecatedVersion string + deprecateOnce sync.Once + annotateOnce sync.Once + StabilityLevel StabilityLevel + LabelValueAllowLists *MetricLabelAllowList } // BuildFQName joins the given three name components by "_". Empty name @@ -140,16 +148,17 @@ func (o *GaugeOpts) toPromGaugeOpts() prometheus.GaugeOpts { // and can safely be left at their zero value, although it is strongly // encouraged to set a Help string. type HistogramOpts struct { - Namespace string - Subsystem string - Name string - Help string - ConstLabels map[string]string - Buckets []float64 - DeprecatedVersion string - deprecateOnce sync.Once - annotateOnce sync.Once - StabilityLevel StabilityLevel + Namespace string + Subsystem string + Name string + Help string + ConstLabels map[string]string + Buckets []float64 + DeprecatedVersion string + deprecateOnce sync.Once + annotateOnce sync.Once + StabilityLevel StabilityLevel + LabelValueAllowLists *MetricLabelAllowList } // Modify help description on the metric description. @@ -186,19 +195,20 @@ func (o *HistogramOpts) toPromHistogramOpts() prometheus.HistogramOpts { // a help string and to explicitly set the Objectives field to the desired value // as the default value will change in the upcoming v0.10 of the library. type SummaryOpts struct { - Namespace string - Subsystem string - Name string - Help string - ConstLabels map[string]string - Objectives map[float64]float64 - MaxAge time.Duration - AgeBuckets uint32 - BufCap uint32 - DeprecatedVersion string - deprecateOnce sync.Once - annotateOnce sync.Once - StabilityLevel StabilityLevel + Namespace string + Subsystem string + Name string + Help string + ConstLabels map[string]string + Objectives map[float64]float64 + MaxAge time.Duration + AgeBuckets uint32 + BufCap uint32 + DeprecatedVersion string + deprecateOnce sync.Once + annotateOnce sync.Once + StabilityLevel StabilityLevel + LabelValueAllowLists *MetricLabelAllowList } // Modify help description on the metric description. @@ -243,3 +253,49 @@ func (o *SummaryOpts) toPromSummaryOpts() prometheus.SummaryOpts { BufCap: o.BufCap, } } + +type MetricLabelAllowList struct { + labelToAllowList map[string]sets.String +} + +func (allowList *MetricLabelAllowList) ConstrainToAllowedList(labelNameList, labelValueList []string) { + for index, value := range labelValueList { + name := labelNameList[index] + if allowValues, ok := allowList.labelToAllowList[name]; ok { + if !allowValues.Has(value) { + labelValueList[index] = "unexpected" + } + } + } +} + +func (allowList *MetricLabelAllowList) ConstrainLabelMap(labels map[string]string) { + for name, value := range labels { + if allowValues, ok := allowList.labelToAllowList[name]; ok { + if !allowValues.Has(value) { + labels[name] = "unexpected" + } + } + } +} + +func SetLabelAllowListFromCLI(allowListMapping map[string]string) { + allowListLock.Lock() + defer allowListLock.Unlock() + for metricLabelName, labelValues := range allowListMapping { + metricName := strings.Split(metricLabelName, ",")[0] + labelName := strings.Split(metricLabelName, ",")[1] + valueSet := sets.NewString(strings.Split(labelValues, ",")...) + + allowList, ok := labelValueAllowLists[metricName] + if ok { + allowList.labelToAllowList[labelName] = valueSet + } else { + labelToAllowList := make(map[string]sets.String) + labelToAllowList[labelName] = valueSet + labelValueAllowLists[metricName] = &MetricLabelAllowList{ + labelToAllowList, + } + } + } +} diff --git a/vendor/k8s.io/component-base/metrics/processstarttime.go b/vendor/k8s.io/component-base/metrics/processstarttime.go index 8dde458814f3..4b5e76935cb1 100644 --- a/vendor/k8s.io/component-base/metrics/processstarttime.go +++ b/vendor/k8s.io/component-base/metrics/processstarttime.go @@ -17,11 +17,8 @@ limitations under the License. package metrics import ( - "os" "time" - "github.com/prometheus/procfs" - "k8s.io/klog/v2" ) @@ -44,24 +41,11 @@ func RegisterProcessStartTime(registrationFunc func(Registerable) error) error { start = float64(time.Now().Unix()) } // processStartTime is a lazy metric which only get initialized after registered. - // so we have to explicitly create it before setting the label value. Otherwise - // it is a noop. - if !processStartTime.IsCreated() { - processStartTime.initializeMetric() - } - processStartTime.WithLabelValues().Set(start) - return registrationFunc(processStartTime) -} - -func getProcessStart() (float64, error) { - pid := os.Getpid() - p, err := procfs.NewProc(pid) - if err != nil { - return 0, err + // so we need to register the metric first and then set the value for it + if err = registrationFunc(processStartTime); err != nil { + return err } - if stat, err := p.Stat(); err == nil { - return stat.StartTime() - } - return 0, err + processStartTime.WithLabelValues().Set(start) + return nil } diff --git a/vendor/k8s.io/component-base/metrics/processstarttime_others.go b/vendor/k8s.io/component-base/metrics/processstarttime_others.go new file mode 100644 index 000000000000..89ea8a68e8ba --- /dev/null +++ b/vendor/k8s.io/component-base/metrics/processstarttime_others.go @@ -0,0 +1,38 @@ +// +build !windows + +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package metrics + +import ( + "os" + + "github.com/prometheus/procfs" +) + +func getProcessStart() (float64, error) { + pid := os.Getpid() + p, err := procfs.NewProc(pid) + if err != nil { + return 0, err + } + + if stat, err := p.Stat(); err == nil { + return stat.StartTime() + } + return 0, err +} diff --git a/vendor/k8s.io/component-base/metrics/processstarttime_windows.go b/vendor/k8s.io/component-base/metrics/processstarttime_windows.go new file mode 100644 index 000000000000..8fcdf273a22d --- /dev/null +++ b/vendor/k8s.io/component-base/metrics/processstarttime_windows.go @@ -0,0 +1,33 @@ +// +build windows + +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package metrics + +import ( + "golang.org/x/sys/windows" +) + +func getProcessStart() (float64, error) { + processHandle := windows.CurrentProcess() + + var creationTime, exitTime, kernelTime, userTime windows.Filetime + if err := windows.GetProcessTimes(processHandle, &creationTime, &exitTime, &kernelTime, &userTime); err != nil { + return 0, err + } + return float64(creationTime.Nanoseconds() / 1e9), nil +} diff --git a/vendor/k8s.io/component-base/metrics/prometheus/ratelimiter/BUILD b/vendor/k8s.io/component-base/metrics/prometheus/ratelimiter/BUILD deleted file mode 100644 index c6b8c1647678..000000000000 --- a/vendor/k8s.io/component-base/metrics/prometheus/ratelimiter/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["rate_limiter.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/component-base/metrics/prometheus/ratelimiter", - importpath = "k8s.io/component-base/metrics/prometheus/ratelimiter", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["rate_limiter_test.go"], - embed = [":go_default_library"], - deps = ["//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/component-base/metrics/prometheus/workqueue/BUILD b/vendor/k8s.io/component-base/metrics/prometheus/workqueue/BUILD deleted file mode 100644 index 3b46b1f8c577..000000000000 --- a/vendor/k8s.io/component-base/metrics/prometheus/workqueue/BUILD +++ /dev/null @@ -1,28 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["metrics.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/component-base/metrics/prometheus/workqueue", - importpath = "k8s.io/component-base/metrics/prometheus/workqueue", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/client-go/util/workqueue:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/component-base/metrics/registry.go b/vendor/k8s.io/component-base/metrics/registry.go index 06a5c6503cf8..b608fb568f04 100644 --- a/vendor/k8s.io/component-base/metrics/registry.go +++ b/vendor/k8s.io/component-base/metrics/registry.go @@ -30,10 +30,12 @@ import ( ) var ( - showHiddenOnce sync.Once - showHidden atomic.Value - registries []*kubeRegistry // stores all registries created by NewKubeRegistry() - registriesLock sync.RWMutex + showHiddenOnce sync.Once + disabledMetricsLock sync.RWMutex + showHidden atomic.Value + registries []*kubeRegistry // stores all registries created by NewKubeRegistry() + registriesLock sync.RWMutex + disabledMetrics = map[string]struct{}{} ) // shouldHide be used to check if a specific metric with deprecated version should be hidden @@ -61,6 +63,12 @@ func ValidateShowHiddenMetricsVersion(v string) []error { return nil } +func SetDisabledMetric(name string) { + disabledMetricsLock.Lock() + defer disabledMetricsLock.Unlock() + disabledMetrics[name] = struct{}{} +} + // SetShowHidden will enable showing hidden metrics. This will no-opt // after the initial call func SetShowHidden() { diff --git a/vendor/k8s.io/component-base/metrics/summary.go b/vendor/k8s.io/component-base/metrics/summary.go index 726bcc489407..4732b02e308e 100644 --- a/vendor/k8s.io/component-base/metrics/summary.go +++ b/vendor/k8s.io/component-base/metrics/summary.go @@ -17,6 +17,7 @@ limitations under the License. package metrics import ( + "context" "github.com/blang/semver" "github.com/prometheus/client_golang/prometheus" ) @@ -74,6 +75,11 @@ func (s *Summary) initializeDeprecatedMetric() { s.initializeMetric() } +// WithContext allows the normal Summary metric to pass in context. The context is no-op now. +func (s *Summary) WithContext(ctx context.Context) ObserverMetric { + return s.ObserverMetric +} + // SummaryVec is the internal representation of our wrapping struct around prometheus // summaryVecs. // @@ -93,12 +99,19 @@ type SummaryVec struct { func NewSummaryVec(opts *SummaryOpts, labels []string) *SummaryVec { opts.StabilityLevel.setDefaults() + fqName := BuildFQName(opts.Namespace, opts.Subsystem, opts.Name) + allowListLock.RLock() + if allowList, ok := labelValueAllowLists[fqName]; ok { + opts.LabelValueAllowLists = allowList + } + allowListLock.RUnlock() + v := &SummaryVec{ SummaryOpts: opts, originalLabels: labels, lazyMetric: lazyMetric{}, } - v.lazyInit(v, BuildFQName(opts.Namespace, opts.Subsystem, opts.Name)) + v.lazyInit(v, fqName) return v } @@ -133,6 +146,9 @@ func (v *SummaryVec) WithLabelValues(lvs ...string) ObserverMetric { if !v.IsCreated() { return noop } + if v.LabelValueAllowLists != nil { + v.LabelValueAllowLists.ConstrainToAllowedList(v.originalLabels, lvs) + } return v.SummaryVec.WithLabelValues(lvs...) } @@ -144,6 +160,9 @@ func (v *SummaryVec) With(labels map[string]string) ObserverMetric { if !v.IsCreated() { return noop } + if v.LabelValueAllowLists != nil { + v.LabelValueAllowLists.ConstrainLabelMap(labels) + } return v.SummaryVec.With(labels) } @@ -169,3 +188,27 @@ func (v *SummaryVec) Reset() { v.SummaryVec.Reset() } + +// WithContext returns wrapped SummaryVec with context +func (v *SummaryVec) WithContext(ctx context.Context) *SummaryVecWithContext { + return &SummaryVecWithContext{ + ctx: ctx, + SummaryVec: *v, + } +} + +// SummaryVecWithContext is the wrapper of SummaryVec with context. +type SummaryVecWithContext struct { + SummaryVec + ctx context.Context +} + +// WithLabelValues is the wrapper of SummaryVec.WithLabelValues. +func (vc *SummaryVecWithContext) WithLabelValues(lvs ...string) ObserverMetric { + return vc.SummaryVec.WithLabelValues(lvs...) +} + +// With is the wrapper of SummaryVec.With. +func (vc *SummaryVecWithContext) With(labels map[string]string) ObserverMetric { + return vc.SummaryVec.With(labels) +} diff --git a/vendor/k8s.io/component-base/metrics/testutil/BUILD b/vendor/k8s.io/component-base/metrics/testutil/BUILD deleted file mode 100644 index 9d7adc8cc48c..000000000000 --- a/vendor/k8s.io/component-base/metrics/testutil/BUILD +++ /dev/null @@ -1,51 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "metrics.go", - "promlint.go", - "testutil.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/component-base/metrics/testutil", - importpath = "k8s.io/component-base/metrics/testutil", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/version:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//vendor/github.com/prometheus/client_golang/prometheus/testutil:go_default_library", - "//vendor/github.com/prometheus/client_golang/prometheus/testutil/promlint:go_default_library", - "//vendor/github.com/prometheus/client_model/go:go_default_library", - "//vendor/github.com/prometheus/common/expfmt:go_default_library", - "//vendor/github.com/prometheus/common/model:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = [ - "metrics_test.go", - "promlint_test.go", - "testutil_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//vendor/github.com/prometheus/client_model/go:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) diff --git a/vendor/k8s.io/component-base/metrics/testutil/metrics.go b/vendor/k8s.io/component-base/metrics/testutil/metrics.go index 389655012215..60a186483fb4 100644 --- a/vendor/k8s.io/component-base/metrics/testutil/metrics.go +++ b/vendor/k8s.io/component-base/metrics/testutil/metrics.go @@ -281,21 +281,6 @@ func (hist *Histogram) Average() float64 { return hist.GetSampleSum() / float64(hist.GetSampleCount()) } -// Clear clears all fields of the wrapped histogram -func (hist *Histogram) Clear() { - if hist.SampleCount != nil { - *hist.SampleCount = 0 - } - if hist.SampleSum != nil { - *hist.SampleSum = 0 - } - for _, b := range hist.Bucket { - if b.CumulativeCount != nil { - *b.CumulativeCount = 0 - } - } -} - // Validate makes sure the wrapped histogram has all necessary fields set and with valid values. func (hist *Histogram) Validate() error { if hist.SampleCount == nil || hist.GetSampleCount() == 0 { @@ -318,7 +303,7 @@ func (hist *Histogram) Validate() error { return nil } -// GetGaugeMetricValue extract metric value from GaugeMetric +// GetGaugeMetricValue extracts metric value from GaugeMetric func GetGaugeMetricValue(m metrics.GaugeMetric) (float64, error) { metricProto := &dto.Metric{} if err := m.Write(metricProto); err != nil { @@ -327,7 +312,7 @@ func GetGaugeMetricValue(m metrics.GaugeMetric) (float64, error) { return metricProto.Gauge.GetValue(), nil } -// GetCounterMetricValue extract metric value from CounterMetric +// GetCounterMetricValue extracts metric value from CounterMetric func GetCounterMetricValue(m metrics.CounterMetric) (float64, error) { metricProto := &dto.Metric{} if err := m.(metrics.Metric).Write(metricProto); err != nil { @@ -336,7 +321,7 @@ func GetCounterMetricValue(m metrics.CounterMetric) (float64, error) { return metricProto.Counter.GetValue(), nil } -// GetHistogramMetricValue extract sum of all samples from ObserverMetric +// GetHistogramMetricValue extracts sum of all samples from ObserverMetric func GetHistogramMetricValue(m metrics.ObserverMetric) (float64, error) { metricProto := &dto.Metric{} if err := m.(metrics.Metric).Write(metricProto); err != nil { @@ -345,6 +330,15 @@ func GetHistogramMetricValue(m metrics.ObserverMetric) (float64, error) { return metricProto.Histogram.GetSampleSum(), nil } +// GetHistogramMetricCount extracts count of all samples from ObserverMetric +func GetHistogramMetricCount(m metrics.ObserverMetric) (uint64, error) { + metricProto := &dto.Metric{} + if err := m.(metrics.Metric).Write(metricProto); err != nil { + return 0, fmt.Errorf("error writing m: %v", err) + } + return metricProto.Histogram.GetSampleCount(), nil +} + // LabelsMatch returns true if metric has all expected labels otherwise false func LabelsMatch(metric *dto.Metric, labelFilter map[string]string) bool { metricLabels := map[string]string{} diff --git a/vendor/k8s.io/component-base/term/BUILD b/vendor/k8s.io/component-base/term/BUILD deleted file mode 100644 index f282ec811767..000000000000 --- a/vendor/k8s.io/component-base/term/BUILD +++ /dev/null @@ -1,24 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["term.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/component-base/term", - importpath = "k8s.io/component-base/term", - visibility = ["//visibility:public"], - deps = ["//vendor/github.com/moby/term:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/component-base/version/BUILD b/vendor/k8s.io/component-base/version/BUILD deleted file mode 100644 index a8a3fc75cd56..000000000000 --- a/vendor/k8s.io/component-base/version/BUILD +++ /dev/null @@ -1,30 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "base.go", - "version.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/component-base/version", - importpath = "k8s.io/component-base/version", - visibility = ["//visibility:public"], - deps = ["//staging/src/k8s.io/apimachinery/pkg/version:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/component-base/version/verflag:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/component-base/version/base.go b/vendor/k8s.io/component-base/version/base.go index e13678c305fd..b753b7d191fc 100644 --- a/vendor/k8s.io/component-base/version/base.go +++ b/vendor/k8s.io/component-base/version/base.go @@ -55,7 +55,7 @@ var ( // NOTE: The $Format strings are replaced during 'git archive' thanks to the // companion .gitattributes file containing 'export-subst' in this same // directory. See also https://git-scm.com/docs/gitattributes - gitVersion = "v0.0.0-master+$Format:%h$" + gitVersion = "v0.0.0-master+$Format:%H$" gitCommit = "$Format:%H$" // sha1 from git, output of $(git rev-parse HEAD) gitTreeState = "" // state of git tree, either "clean" or "dirty" diff --git a/vendor/k8s.io/component-base/version/def.bzl b/vendor/k8s.io/component-base/version/def.bzl deleted file mode 100644 index 77edcbc89bcb..000000000000 --- a/vendor/k8s.io/component-base/version/def.bzl +++ /dev/null @@ -1,39 +0,0 @@ -# Copyright 2017 The Kubernetes Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Implements hack/lib/version.sh's kube::version::ldflags() for Bazel. -def version_x_defs(): - # This should match the list of packages in kube::version::ldflag - stamp_pkgs = [ - "k8s.io/kubernetes/vendor/k8s.io/component-base/version", - "k8s.io/kubernetes/vendor/k8s.io/client-go/pkg/version", - ] - - # This should match the list of vars in kube::version::ldflags - # It should also match the list of vars set in hack/print-workspace-status.sh. - stamp_vars = [ - "buildDate", - "gitCommit", - "gitMajor", - "gitMinor", - "gitTreeState", - "gitVersion", - ] - - # Generate the cross-product. - x_defs = {} - for pkg in stamp_pkgs: - for var in stamp_vars: - x_defs["%s.%s" % (pkg, var)] = "{%s}" % var - return x_defs diff --git a/vendor/k8s.io/component-base/version/verflag/BUILD b/vendor/k8s.io/component-base/version/verflag/BUILD deleted file mode 100644 index ca3c2b0f5ff8..000000000000 --- a/vendor/k8s.io/component-base/version/verflag/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) -load("//staging/src/k8s.io/component-base/version:def.bzl", "version_x_defs") - -go_library( - name = "go_default_library", - srcs = ["verflag.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/component-base/version/verflag", - importpath = "k8s.io/component-base/version/verflag", - deps = [ - "//staging/src/k8s.io/component-base/version:go_default_library", - "//vendor/github.com/spf13/pflag:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/component-helpers/apimachinery/lease/BUILD b/vendor/k8s.io/component-helpers/apimachinery/lease/BUILD deleted file mode 100644 index f80e5d0c84a5..000000000000 --- a/vendor/k8s.io/component-helpers/apimachinery/lease/BUILD +++ /dev/null @@ -1,57 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["controller.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/component-helpers/apimachinery/lease", - importpath = "k8s.io/component-helpers/apimachinery/lease", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/coordination/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/coordination/v1:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["controller_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/coordination/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/component-helpers/apps/poddisruptionbudget/helpers.go b/vendor/k8s.io/component-helpers/apps/poddisruptionbudget/helpers.go new file mode 100644 index 000000000000..f6008c76d769 --- /dev/null +++ b/vendor/k8s.io/component-helpers/apps/poddisruptionbudget/helpers.go @@ -0,0 +1,65 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package poddisruptionbudget + +import ( + policy "k8s.io/api/policy/v1" + apimeta "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// UpdateDisruptionAllowedCondition updates the DisruptionAllowed condition +// on a PodDisruptionBudget based on the value of the DisruptionsAllowed field. +func UpdateDisruptionAllowedCondition(pdb *policy.PodDisruptionBudget) { + if pdb.Status.Conditions == nil { + pdb.Status.Conditions = make([]metav1.Condition, 0) + } + if pdb.Status.DisruptionsAllowed > 0 { + apimeta.SetStatusCondition(&pdb.Status.Conditions, metav1.Condition{ + Type: policy.DisruptionAllowedCondition, + Reason: policy.SufficientPodsReason, + Status: metav1.ConditionTrue, + ObservedGeneration: pdb.Status.ObservedGeneration, + }) + } else { + apimeta.SetStatusCondition(&pdb.Status.Conditions, metav1.Condition{ + Type: policy.DisruptionAllowedCondition, + Reason: policy.InsufficientPodsReason, + Status: metav1.ConditionFalse, + ObservedGeneration: pdb.Status.ObservedGeneration, + }) + } +} + +// ConditionsAreUpToDate checks whether the status and reason for the +// DisruptionAllowed condition are set to the correct values based on the +// DisruptionsAllowed field. +func ConditionsAreUpToDate(pdb *policy.PodDisruptionBudget) bool { + cond := apimeta.FindStatusCondition(pdb.Status.Conditions, policy.DisruptionAllowedCondition) + if cond == nil { + return false + } + + if pdb.Status.ObservedGeneration != pdb.Generation { + return false + } + + if pdb.Status.DisruptionsAllowed > 0 { + return cond.Status == metav1.ConditionTrue && cond.Reason == policy.SufficientPodsReason + } + return cond.Status == metav1.ConditionFalse && cond.Reason == policy.InsufficientPodsReason +} diff --git a/vendor/k8s.io/component-helpers/auth/rbac/reconciliation/BUILD b/vendor/k8s.io/component-helpers/auth/rbac/reconciliation/BUILD deleted file mode 100644 index 3590efaa8ed9..000000000000 --- a/vendor/k8s.io/component-helpers/auth/rbac/reconciliation/BUILD +++ /dev/null @@ -1,64 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "reconcile_role_test.go", - "reconcile_rolebindings_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/rbac/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "clusterrole_interfaces.go", - "clusterrolebinding_interfaces.go", - "namespace.go", - "reconcile_role.go", - "reconcile_rolebindings.go", - "role_interfaces.go", - "rolebinding_interfaces.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/component-helpers/auth/rbac/reconciliation", - importpath = "k8s.io/component-helpers/auth/rbac/reconciliation", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/rbac/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1:go_default_library", - "//staging/src/k8s.io/component-helpers/auth/rbac/validation:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/component-helpers/auth/rbac/validation/BUILD b/vendor/k8s.io/component-helpers/auth/rbac/validation/BUILD deleted file mode 100644 index dd1ec07dbe58..000000000000 --- a/vendor/k8s.io/component-helpers/auth/rbac/validation/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["policy_comparator.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/component-helpers/auth/rbac/validation", - importpath = "k8s.io/component-helpers/auth/rbac/validation", - visibility = ["//visibility:public"], - deps = ["//staging/src/k8s.io/api/rbac/v1:go_default_library"], -) - -go_test( - name = "go_default_test", - srcs = ["policy_comparator_test.go"], - embed = [":go_default_library"], - deps = ["//staging/src/k8s.io/api/rbac/v1:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/component-helpers/node/topology/helpers.go b/vendor/k8s.io/component-helpers/node/topology/helpers.go new file mode 100644 index 000000000000..18c838cca564 --- /dev/null +++ b/vendor/k8s.io/component-helpers/node/topology/helpers.go @@ -0,0 +1,57 @@ +/* +Copyright 2020 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package topology + +import ( + "k8s.io/api/core/v1" +) + +// GetZoneKey is a helper function that builds a string identifier that is unique per failure-zone; +// it returns empty-string for no zone. +// Since there are currently two separate zone keys: +// * "failure-domain.beta.kubernetes.io/zone" +// * "topology.kubernetes.io/zone" +// GetZoneKey will first check failure-domain.beta.kubernetes.io/zone and if not exists, will then check +// topology.kubernetes.io/zone +func GetZoneKey(node *v1.Node) string { + labels := node.Labels + if labels == nil { + return "" + } + + // TODO: "failure-domain.beta..." names are deprecated, but will + // stick around a long time due to existing on old extant objects like PVs. + // Maybe one day we can stop considering them (see #88493). + zone, ok := labels[v1.LabelFailureDomainBetaZone] + if !ok { + zone, _ = labels[v1.LabelTopologyZone] + } + + region, ok := labels[v1.LabelFailureDomainBetaRegion] + if !ok { + region, _ = labels[v1.LabelTopologyRegion] + } + + if region == "" && zone == "" { + return "" + } + + // We include the null character just in case region or failureDomain has a colon + // (We do assume there's no null characters in a region or failureDomain) + // As a nice side-benefit, the null character is not printed by fmt.Print or glog + return region + ":\x00:" + zone +} diff --git a/vendor/k8s.io/component-helpers/scheduling/corev1/BUILD b/vendor/k8s.io/component-helpers/scheduling/corev1/BUILD deleted file mode 100644 index 61321c3a41f4..000000000000 --- a/vendor/k8s.io/component-helpers/scheduling/corev1/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "helpers.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/component-helpers/scheduling/corev1", - importpath = "k8s.io/component-helpers/scheduling/corev1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/component-helpers/scheduling/corev1/nodeaffinity:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["helpers_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/component-helpers/scheduling/corev1/nodeaffinity:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/component-helpers/scheduling/corev1/helpers.go b/vendor/k8s.io/component-helpers/scheduling/corev1/helpers.go index 57f916c265b2..23a94bd7bcd6 100644 --- a/vendor/k8s.io/component-helpers/scheduling/corev1/helpers.go +++ b/vendor/k8s.io/component-helpers/scheduling/corev1/helpers.go @@ -17,6 +17,8 @@ limitations under the License. package corev1 import ( + "encoding/json" + v1 "k8s.io/api/core/v1" "k8s.io/component-helpers/scheduling/corev1/nodeaffinity" ) @@ -43,3 +45,57 @@ func MatchNodeSelectorTerms( } return nodeaffinity.NewLazyErrorNodeSelector(nodeSelector).Match(node) } + +// GetAvoidPodsFromNodeAnnotations scans the list of annotations and +// returns the pods that needs to be avoided for this node from scheduling +func GetAvoidPodsFromNodeAnnotations(annotations map[string]string) (v1.AvoidPods, error) { + var avoidPods v1.AvoidPods + if len(annotations) > 0 && annotations[v1.PreferAvoidPodsAnnotationKey] != "" { + err := json.Unmarshal([]byte(annotations[v1.PreferAvoidPodsAnnotationKey]), &avoidPods) + if err != nil { + return avoidPods, err + } + } + return avoidPods, nil +} + +// TolerationsTolerateTaint checks if taint is tolerated by any of the tolerations. +func TolerationsTolerateTaint(tolerations []v1.Toleration, taint *v1.Taint) bool { + for i := range tolerations { + if tolerations[i].ToleratesTaint(taint) { + return true + } + } + return false +} + +type taintsFilterFunc func(*v1.Taint) bool + +// FindMatchingUntoleratedTaint checks if the given tolerations tolerates +// all the filtered taints, and returns the first taint without a toleration +// Returns true if there is an untolerated taint +// Returns false if all taints are tolerated +func FindMatchingUntoleratedTaint(taints []v1.Taint, tolerations []v1.Toleration, inclusionFilter taintsFilterFunc) (v1.Taint, bool) { + filteredTaints := getFilteredTaints(taints, inclusionFilter) + for _, taint := range filteredTaints { + if !TolerationsTolerateTaint(tolerations, &taint) { + return taint, true + } + } + return v1.Taint{}, false +} + +// getFilteredTaints returns a list of taints satisfying the filter predicate +func getFilteredTaints(taints []v1.Taint, inclusionFilter taintsFilterFunc) []v1.Taint { + if inclusionFilter == nil { + return taints + } + filteredTaints := []v1.Taint{} + for _, taint := range taints { + if !inclusionFilter(&taint) { + continue + } + filteredTaints = append(filteredTaints, taint) + } + return filteredTaints +} diff --git a/vendor/k8s.io/component-helpers/scheduling/corev1/nodeaffinity/BUILD b/vendor/k8s.io/component-helpers/scheduling/corev1/nodeaffinity/BUILD deleted file mode 100644 index 76427553ee20..000000000000 --- a/vendor/k8s.io/component-helpers/scheduling/corev1/nodeaffinity/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["nodeaffinity.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/component-helpers/scheduling/corev1/nodeaffinity", - importpath = "k8s.io/component-helpers/scheduling/corev1/nodeaffinity", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/selection:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["nodeaffinity_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - ], -) diff --git a/vendor/k8s.io/component-helpers/scheduling/corev1/nodeaffinity/nodeaffinity.go b/vendor/k8s.io/component-helpers/scheduling/corev1/nodeaffinity/nodeaffinity.go index efca431e6159..27caf69b920a 100644 --- a/vendor/k8s.io/component-helpers/scheduling/corev1/nodeaffinity/nodeaffinity.go +++ b/vendor/k8s.io/component-helpers/scheduling/corev1/nodeaffinity/nodeaffinity.go @@ -17,13 +17,12 @@ limitations under the License. package nodeaffinity import ( - "fmt" - v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/selection" "k8s.io/apimachinery/pkg/util/errors" + "k8s.io/apimachinery/pkg/util/validation/field" ) // NodeSelector is a runtime representation of v1.NodeSelector. @@ -37,31 +36,34 @@ type LazyErrorNodeSelector struct { terms []nodeSelectorTerm } -// NewNodeSelector returns a NodeSelector or all parsing errors found. -func NewNodeSelector(ns *v1.NodeSelector) (*NodeSelector, error) { - lazy := NewLazyErrorNodeSelector(ns) +// NewNodeSelector returns a NodeSelector or aggregate parsing errors found. +func NewNodeSelector(ns *v1.NodeSelector, opts ...field.PathOption) (*NodeSelector, error) { + lazy := NewLazyErrorNodeSelector(ns, opts...) var errs []error for _, term := range lazy.terms { - if term.parseErr != nil { - errs = append(errs, term.parseErr) + if len(term.parseErrs) > 0 { + errs = append(errs, term.parseErrs...) } } if len(errs) != 0 { - return nil, errors.NewAggregate(errs) + return nil, errors.Flatten(errors.NewAggregate(errs)) } return &NodeSelector{lazy: *lazy}, nil } // NewLazyErrorNodeSelector creates a NodeSelector that only reports parse // errors when no terms match. -func NewLazyErrorNodeSelector(ns *v1.NodeSelector) *LazyErrorNodeSelector { +func NewLazyErrorNodeSelector(ns *v1.NodeSelector, opts ...field.PathOption) *LazyErrorNodeSelector { + p := field.ToPath(opts...) parsedTerms := make([]nodeSelectorTerm, 0, len(ns.NodeSelectorTerms)) - for _, term := range ns.NodeSelectorTerms { + path := p.Child("nodeSelectorTerms") + for i, term := range ns.NodeSelectorTerms { // nil or empty term selects no objects if isEmptyNodeSelectorTerm(&term) { continue } - parsedTerms = append(parsedTerms, newNodeSelectorTerm(&term)) + p := path.Index(i) + parsedTerms = append(parsedTerms, newNodeSelectorTerm(&term, p)) } return &LazyErrorNodeSelector{ terms: parsedTerms, @@ -88,16 +90,16 @@ func (ns *LazyErrorNodeSelector) Match(node *v1.Node) (bool, error) { var errs []error for _, term := range ns.terms { - match, err := term.match(nodeLabels, nodeFields) - if err != nil { - errs = append(errs, term.parseErr) + match, tErrs := term.match(nodeLabels, nodeFields) + if len(tErrs) > 0 { + errs = append(errs, tErrs...) continue } if match { return true, nil } } - return false, errors.NewAggregate(errs) + return false, errors.Flatten(errors.NewAggregate(errs)) } // PreferredSchedulingTerms is a runtime representation of []v1.PreferredSchedulingTerms. @@ -107,25 +109,27 @@ type PreferredSchedulingTerms struct { // NewPreferredSchedulingTerms returns a PreferredSchedulingTerms or all the parsing errors found. // If a v1.PreferredSchedulingTerm has a 0 weight, its parsing is skipped. -func NewPreferredSchedulingTerms(terms []v1.PreferredSchedulingTerm) (*PreferredSchedulingTerms, error) { +func NewPreferredSchedulingTerms(terms []v1.PreferredSchedulingTerm, opts ...field.PathOption) (*PreferredSchedulingTerms, error) { + p := field.ToPath(opts...) var errs []error parsedTerms := make([]preferredSchedulingTerm, 0, len(terms)) - for _, term := range terms { + for i, term := range terms { + path := p.Index(i) if term.Weight == 0 || isEmptyNodeSelectorTerm(&term.Preference) { continue } parsedTerm := preferredSchedulingTerm{ - nodeSelectorTerm: newNodeSelectorTerm(&term.Preference), + nodeSelectorTerm: newNodeSelectorTerm(&term.Preference, path), weight: int(term.Weight), } - if parsedTerm.parseErr != nil { - errs = append(errs, parsedTerm.parseErr) + if len(parsedTerm.parseErrs) > 0 { + errs = append(errs, parsedTerm.parseErrs...) } else { parsedTerms = append(parsedTerms, parsedTerm) } } if len(errs) != 0 { - return nil, errors.NewAggregate(errs) + return nil, errors.Flatten(errors.NewAggregate(errs)) } return &PreferredSchedulingTerms{terms: parsedTerms}, nil } @@ -160,26 +164,32 @@ func extractNodeFields(n *v1.Node) fields.Set { type nodeSelectorTerm struct { matchLabels labels.Selector matchFields fields.Selector - parseErr error + parseErrs []error } -func newNodeSelectorTerm(term *v1.NodeSelectorTerm) nodeSelectorTerm { +func newNodeSelectorTerm(term *v1.NodeSelectorTerm, path *field.Path) nodeSelectorTerm { var parsedTerm nodeSelectorTerm + var errs []error if len(term.MatchExpressions) != 0 { - parsedTerm.matchLabels, parsedTerm.parseErr = nodeSelectorRequirementsAsSelector(term.MatchExpressions) - if parsedTerm.parseErr != nil { - return parsedTerm + p := path.Child("matchExpressions") + parsedTerm.matchLabels, errs = nodeSelectorRequirementsAsSelector(term.MatchExpressions, p) + if errs != nil { + parsedTerm.parseErrs = append(parsedTerm.parseErrs, errs...) } } if len(term.MatchFields) != 0 { - parsedTerm.matchFields, parsedTerm.parseErr = nodeSelectorRequirementsAsFieldSelector(term.MatchFields) + p := path.Child("matchFields") + parsedTerm.matchFields, errs = nodeSelectorRequirementsAsFieldSelector(term.MatchFields, p) + if errs != nil { + parsedTerm.parseErrs = append(parsedTerm.parseErrs, errs...) + } } return parsedTerm } -func (t *nodeSelectorTerm) match(nodeLabels labels.Set, nodeFields fields.Set) (bool, error) { - if t.parseErr != nil { - return false, t.parseErr +func (t *nodeSelectorTerm) match(nodeLabels labels.Set, nodeFields fields.Set) (bool, []error) { + if t.parseErrs != nil { + return false, t.parseErrs } if t.matchLabels != nil && !t.matchLabels.Matches(nodeLabels) { return false, nil @@ -192,12 +202,14 @@ func (t *nodeSelectorTerm) match(nodeLabels labels.Set, nodeFields fields.Set) ( // nodeSelectorRequirementsAsSelector converts the []NodeSelectorRequirement api type into a struct that implements // labels.Selector. -func nodeSelectorRequirementsAsSelector(nsm []v1.NodeSelectorRequirement) (labels.Selector, error) { +func nodeSelectorRequirementsAsSelector(nsm []v1.NodeSelectorRequirement, path *field.Path) (labels.Selector, []error) { if len(nsm) == 0 { return labels.Nothing(), nil } + var errs []error selector := labels.NewSelector() - for _, expr := range nsm { + for i, expr := range nsm { + p := path.Index(i) var op selection.Operator switch expr.Operator { case v1.NodeSelectorOpIn: @@ -213,46 +225,61 @@ func nodeSelectorRequirementsAsSelector(nsm []v1.NodeSelectorRequirement) (label case v1.NodeSelectorOpLt: op = selection.LessThan default: - return nil, fmt.Errorf("%q is not a valid node selector operator", expr.Operator) + errs = append(errs, field.NotSupported(p.Child("operator"), expr.Operator, nil)) + continue } - r, err := labels.NewRequirement(expr.Key, op, expr.Values) + r, err := labels.NewRequirement(expr.Key, op, expr.Values, field.WithPath(p)) if err != nil { - return nil, err + errs = append(errs, err) + } else { + selector = selector.Add(*r) } - selector = selector.Add(*r) + } + if len(errs) != 0 { + return nil, errs } return selector, nil } +var validFieldSelectorOperators = []string{ + string(v1.NodeSelectorOpIn), + string(v1.NodeSelectorOpNotIn), +} + // nodeSelectorRequirementsAsFieldSelector converts the []NodeSelectorRequirement core type into a struct that implements // fields.Selector. -func nodeSelectorRequirementsAsFieldSelector(nsr []v1.NodeSelectorRequirement) (fields.Selector, error) { +func nodeSelectorRequirementsAsFieldSelector(nsr []v1.NodeSelectorRequirement, path *field.Path) (fields.Selector, []error) { if len(nsr) == 0 { return fields.Nothing(), nil } + var errs []error var selectors []fields.Selector - for _, expr := range nsr { + for i, expr := range nsr { + p := path.Index(i) switch expr.Operator { case v1.NodeSelectorOpIn: if len(expr.Values) != 1 { - return nil, fmt.Errorf("unexpected number of value (%d) for node field selector operator %q", - len(expr.Values), expr.Operator) + errs = append(errs, field.Invalid(p.Child("values"), expr.Values, "must have one element")) + } else { + selectors = append(selectors, fields.OneTermEqualSelector(expr.Key, expr.Values[0])) } - selectors = append(selectors, fields.OneTermEqualSelector(expr.Key, expr.Values[0])) case v1.NodeSelectorOpNotIn: if len(expr.Values) != 1 { - return nil, fmt.Errorf("unexpected number of value (%d) for node field selector operator %q", - len(expr.Values), expr.Operator) + errs = append(errs, field.Invalid(p.Child("values"), expr.Values, "must have one element")) + } else { + selectors = append(selectors, fields.OneTermNotEqualSelector(expr.Key, expr.Values[0])) } - selectors = append(selectors, fields.OneTermNotEqualSelector(expr.Key, expr.Values[0])) default: - return nil, fmt.Errorf("%q is not a valid node field selector operator", expr.Operator) + errs = append(errs, field.NotSupported(p.Child("operator"), expr.Operator, validFieldSelectorOperators)) } } + if len(errs) != 0 { + return nil, errs + } return fields.AndSelectors(selectors...), nil } @@ -260,3 +287,38 @@ type preferredSchedulingTerm struct { nodeSelectorTerm weight int } + +type RequiredNodeAffinity struct { + labelSelector labels.Selector + nodeSelector *LazyErrorNodeSelector +} + +// GetRequiredNodeAffinity returns the parsing result of pod's nodeSelector and nodeAffinity. +func GetRequiredNodeAffinity(pod *v1.Pod) RequiredNodeAffinity { + var selector labels.Selector + if len(pod.Spec.NodeSelector) > 0 { + selector = labels.SelectorFromSet(pod.Spec.NodeSelector) + } + // Use LazyErrorNodeSelector for backwards compatibility of parsing errors. + var affinity *LazyErrorNodeSelector + if pod.Spec.Affinity != nil && + pod.Spec.Affinity.NodeAffinity != nil && + pod.Spec.Affinity.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution != nil { + affinity = NewLazyErrorNodeSelector(pod.Spec.Affinity.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution) + } + return RequiredNodeAffinity{labelSelector: selector, nodeSelector: affinity} +} + +// Match checks whether the pod is schedulable onto nodes according to +// the requirements in both nodeSelector and nodeAffinity. +func (s RequiredNodeAffinity) Match(node *v1.Node) (bool, error) { + if s.labelSelector != nil { + if !s.labelSelector.Matches(labels.Set(node.Labels)) { + return false, nil + } + } + if s.nodeSelector != nil { + return s.nodeSelector.Match(node) + } + return true, nil +} diff --git a/vendor/k8s.io/component-helpers/storage/volume/helpers.go b/vendor/k8s.io/component-helpers/storage/volume/helpers.go new file mode 100644 index 000000000000..a76e9334480f --- /dev/null +++ b/vendor/k8s.io/component-helpers/storage/volume/helpers.go @@ -0,0 +1,44 @@ +/* +Copyright 2020 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package volume + +import v1 "k8s.io/api/core/v1" + +// GetPersistentVolumeClaimClass returns StorageClassName. If no storage class was +// requested, it returns "". +func GetPersistentVolumeClaimClass(claim *v1.PersistentVolumeClaim) string { + // Use beta annotation first + if class, found := claim.Annotations[v1.BetaStorageClassAnnotation]; found { + return class + } + + if claim.Spec.StorageClassName != nil { + return *claim.Spec.StorageClassName + } + + return "" +} + +// GetPersistentVolumeClass returns StorageClassName. +func GetPersistentVolumeClass(volume *v1.PersistentVolume) string { + // Use beta annotation first + if class, found := volume.Annotations[v1.BetaStorageClassAnnotation]; found { + return class + } + + return volume.Spec.StorageClassName +} diff --git a/vendor/k8s.io/controller-manager/pkg/clientbuilder/BUILD b/vendor/k8s.io/controller-manager/pkg/clientbuilder/BUILD deleted file mode 100644 index f774b3c2caf4..000000000000 --- a/vendor/k8s.io/controller-manager/pkg/clientbuilder/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["client_builder.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/controller-manager/pkg/clientbuilder", - importpath = "k8s.io/controller-manager/pkg/clientbuilder", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/authentication/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/serviceaccount:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/authentication/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/tools/watch:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/controller-manager/pkg/clientbuilder/client_builder.go b/vendor/k8s.io/controller-manager/pkg/clientbuilder/client_builder.go deleted file mode 100644 index add180c70464..000000000000 --- a/vendor/k8s.io/controller-manager/pkg/clientbuilder/client_builder.go +++ /dev/null @@ -1,255 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package clientbuilder - -import ( - "context" - "fmt" - "time" - - v1authenticationapi "k8s.io/api/authentication/v1" - v1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/fields" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/watch" - apiserverserviceaccount "k8s.io/apiserver/pkg/authentication/serviceaccount" - clientset "k8s.io/client-go/kubernetes" - "k8s.io/client-go/kubernetes/scheme" - v1authentication "k8s.io/client-go/kubernetes/typed/authentication/v1" - v1core "k8s.io/client-go/kubernetes/typed/core/v1" - restclient "k8s.io/client-go/rest" - "k8s.io/client-go/tools/cache" - watchtools "k8s.io/client-go/tools/watch" - "k8s.io/klog/v2" -) - -const ( - // SecretTypeField is copied from pkg/apis/cores/field_constants.go - SecretTypeField = "type" -) - -// ControllerClientBuilder allows you to get clients and configs for controllers -// Please note a copy also exists in staging/src/k8s.io/cloud-provider/cloud.go -// TODO: Extract this into a separate controller utilities repo (issues/68947) -type ControllerClientBuilder interface { - Config(name string) (*restclient.Config, error) - ConfigOrDie(name string) *restclient.Config - Client(name string) (clientset.Interface, error) - ClientOrDie(name string) clientset.Interface -} - -// SimpleControllerClientBuilder returns a fixed client with different user agents -type SimpleControllerClientBuilder struct { - // ClientConfig is a skeleton config to clone and use as the basis for each controller client - ClientConfig *restclient.Config -} - -// Config returns a client config for a fixed client -func (b SimpleControllerClientBuilder) Config(name string) (*restclient.Config, error) { - clientConfig := *b.ClientConfig - return restclient.AddUserAgent(&clientConfig, name), nil -} - -// ConfigOrDie returns a client config if no error from previous config func. -// If it gets an error getting the client, it will log the error and kill the process it's running in. -func (b SimpleControllerClientBuilder) ConfigOrDie(name string) *restclient.Config { - clientConfig, err := b.Config(name) - if err != nil { - klog.Fatal(err) - } - return clientConfig -} - -// Client returns a clientset.Interface built from the ClientBuilder -func (b SimpleControllerClientBuilder) Client(name string) (clientset.Interface, error) { - clientConfig, err := b.Config(name) - if err != nil { - return nil, err - } - return clientset.NewForConfig(clientConfig) -} - -// ClientOrDie returns a clientset.interface built from the ClientBuilder with no error. -// If it gets an error getting the client, it will log the error and kill the process it's running in. -func (b SimpleControllerClientBuilder) ClientOrDie(name string) clientset.Interface { - client, err := b.Client(name) - if err != nil { - klog.Fatal(err) - } - return client -} - -// SAControllerClientBuilder is a ControllerClientBuilder that returns clients identifying as -// service accounts -type SAControllerClientBuilder struct { - // ClientConfig is a skeleton config to clone and use as the basis for each controller client - ClientConfig *restclient.Config - - // CoreClient is used to provision service accounts if needed and watch for their associated tokens - // to construct a controller client - CoreClient v1core.CoreV1Interface - - // AuthenticationClient is used to check API tokens to make sure they are valid before - // building a controller client from them - AuthenticationClient v1authentication.AuthenticationV1Interface - - // Namespace is the namespace used to host the service accounts that will back the - // controllers. It must be highly privileged namespace which normal users cannot inspect. - Namespace string -} - -// Config returns a complete clientConfig for constructing clients. This is separate in anticipation of composition -// which means that not all clientsets are known here -func (b SAControllerClientBuilder) Config(name string) (*restclient.Config, error) { - sa, err := apiserverserviceaccount.GetOrCreateServiceAccount(b.CoreClient, b.Namespace, name) - if err != nil { - return nil, err - } - - var clientConfig *restclient.Config - fieldSelector := fields.SelectorFromSet(map[string]string{ - SecretTypeField: string(v1.SecretTypeServiceAccountToken), - }).String() - lw := &cache.ListWatch{ - ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { - options.FieldSelector = fieldSelector - return b.CoreClient.Secrets(b.Namespace).List(context.TODO(), options) - }, - WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { - options.FieldSelector = fieldSelector - return b.CoreClient.Secrets(b.Namespace).Watch(context.TODO(), options) - }, - } - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) - defer cancel() - _, err = watchtools.UntilWithSync(ctx, lw, &v1.Secret{}, nil, - func(event watch.Event) (bool, error) { - switch event.Type { - case watch.Deleted: - return false, nil - case watch.Error: - return false, fmt.Errorf("error watching") - - case watch.Added, watch.Modified: - secret, ok := event.Object.(*v1.Secret) - if !ok { - return false, fmt.Errorf("unexpected object type: %T", event.Object) - } - if !apiserverserviceaccount.IsServiceAccountToken(secret, sa) { - return false, nil - } - if len(secret.Data[v1.ServiceAccountTokenKey]) == 0 { - return false, nil - } - validConfig, valid, err := b.getAuthenticatedConfig(sa, string(secret.Data[v1.ServiceAccountTokenKey])) - if err != nil { - klog.Warningf("error validating API token for %s/%s in secret %s: %v", sa.Namespace, sa.Name, secret.Name, err) - // continue watching for good tokens - return false, nil - } - if !valid { - klog.Warningf("secret %s contained an invalid API token for %s/%s", secret.Name, sa.Namespace, sa.Name) - // try to delete the secret containing the invalid token - if err := b.CoreClient.Secrets(secret.Namespace).Delete(context.TODO(), secret.Name, metav1.DeleteOptions{}); err != nil && !apierrors.IsNotFound(err) { - klog.Warningf("error deleting secret %s containing invalid API token for %s/%s: %v", secret.Name, sa.Namespace, sa.Name, err) - } - // continue watching for good tokens - return false, nil - } - clientConfig = validConfig - return true, nil - - default: - return false, fmt.Errorf("unexpected event type: %v", event.Type) - } - }) - if err != nil { - return nil, fmt.Errorf("unable to get token for service account: %v", err) - } - - return clientConfig, nil -} - -func (b SAControllerClientBuilder) getAuthenticatedConfig(sa *v1.ServiceAccount, token string) (*restclient.Config, bool, error) { - username := apiserverserviceaccount.MakeUsername(sa.Namespace, sa.Name) - - clientConfig := restclient.AnonymousClientConfig(b.ClientConfig) - clientConfig.BearerToken = token - restclient.AddUserAgent(clientConfig, username) - - // Try token review first - tokenReview := &v1authenticationapi.TokenReview{Spec: v1authenticationapi.TokenReviewSpec{Token: token}} - if tokenResult, err := b.AuthenticationClient.TokenReviews().Create(context.TODO(), tokenReview, metav1.CreateOptions{}); err == nil { - if !tokenResult.Status.Authenticated { - klog.Warningf("Token for %s/%s did not authenticate correctly", sa.Namespace, sa.Name) - return nil, false, nil - } - if tokenResult.Status.User.Username != username { - klog.Warningf("Token for %s/%s authenticated as unexpected username: %s", sa.Namespace, sa.Name, tokenResult.Status.User.Username) - return nil, false, nil - } - klog.V(4).Infof("Verified credential for %s/%s", sa.Namespace, sa.Name) - return clientConfig, true, nil - } - - // If we couldn't run the token review, the API might be disabled or we might not have permission. - // Try to make a request to /apis with the token. If we get a 401 we should consider the token invalid. - clientConfigCopy := *clientConfig - clientConfigCopy.NegotiatedSerializer = scheme.Codecs - client, err := restclient.UnversionedRESTClientFor(&clientConfigCopy) - if err != nil { - return nil, false, err - } - err = client.Get().AbsPath("/apis").Do(context.TODO()).Error() - if apierrors.IsUnauthorized(err) { - klog.Warningf("Token for %s/%s did not authenticate correctly: %v", sa.Namespace, sa.Name, err) - return nil, false, nil - } - - return clientConfig, true, nil -} - -// ConfigOrDie returns clientConfig for constructing clients. -// If it gets an error, it will log the error and kill the process it's running in. -func (b SAControllerClientBuilder) ConfigOrDie(name string) *restclient.Config { - clientConfig, err := b.Config(name) - if err != nil { - klog.Fatal(err) - } - return clientConfig -} - -// Client returns clientset.Interface built from ClientBuilder -func (b SAControllerClientBuilder) Client(name string) (clientset.Interface, error) { - clientConfig, err := b.Config(name) - if err != nil { - return nil, err - } - return clientset.NewForConfig(clientConfig) -} - -// ClientOrDie will return clientset.Interface built from ClientBuilder. -// If it gets an error getting the client, it will log the error and kill the process it's running in. -func (b SAControllerClientBuilder) ClientOrDie(name string) clientset.Interface { - client, err := b.Client(name) - if err != nil { - klog.Fatal(err) - } - return client -} diff --git a/vendor/k8s.io/cri-api/pkg/apis/BUILD b/vendor/k8s.io/cri-api/pkg/apis/BUILD deleted file mode 100644 index 4b213d03ff98..000000000000 --- a/vendor/k8s.io/cri-api/pkg/apis/BUILD +++ /dev/null @@ -1,29 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["services.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/cri-api/pkg/apis", - importpath = "k8s.io/cri-api/pkg/apis", - visibility = ["//visibility:public"], - deps = ["//staging/src/k8s.io/cri-api/pkg/apis/runtime/v1alpha2:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/cri-api/pkg/apis/runtime/v1:all-srcs", - "//staging/src/k8s.io/cri-api/pkg/apis/runtime/v1alpha2:all-srcs", - "//staging/src/k8s.io/cri-api/pkg/apis/testing:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/cri-api/pkg/apis/runtime/v1alpha2/BUILD b/vendor/k8s.io/cri-api/pkg/apis/runtime/v1alpha2/BUILD deleted file mode 100644 index c4aaa773840b..000000000000 --- a/vendor/k8s.io/cri-api/pkg/apis/runtime/v1alpha2/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "api.pb.go", - "constants.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/cri-api/pkg/apis/runtime/v1alpha2", - importpath = "k8s.io/cri-api/pkg/apis/runtime/v1alpha2", - visibility = ["//visibility:public"], - deps = [ - "//vendor/github.com/gogo/protobuf/gogoproto:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - "//vendor/google.golang.org/grpc:go_default_library", - "//vendor/google.golang.org/grpc/codes:go_default_library", - "//vendor/google.golang.org/grpc/status:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/cri-api/pkg/apis/runtime/v1alpha2/api.pb.go b/vendor/k8s.io/cri-api/pkg/apis/runtime/v1alpha2/api.pb.go index c80ecafdcfe9..852cac52a0b0 100644 --- a/vendor/k8s.io/cri-api/pkg/apis/runtime/v1alpha2/api.pb.go +++ b/vendor/k8s.io/cri-api/pkg/apis/runtime/v1alpha2/api.pb.go @@ -17574,10 +17574,7 @@ func (m *VersionRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -17755,10 +17752,7 @@ func (m *VersionResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -17904,10 +17898,7 @@ func (m *DNSConfig) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -18046,10 +18037,7 @@ func (m *PortMapping) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -18222,10 +18210,7 @@ func (m *Mount) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -18364,10 +18349,7 @@ func (m *NamespaceOption) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -18436,10 +18418,7 @@ func (m *Int64Value) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -18853,10 +18832,7 @@ func (m *LinuxSandboxSecurityContext) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -18957,10 +18933,7 @@ func (m *SecurityProfile) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -19188,7 +19161,7 @@ func (m *LinuxPodSandboxConfig) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > postIndex { @@ -19205,10 +19178,7 @@ func (m *LinuxPodSandboxConfig) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -19373,10 +19343,7 @@ func (m *PodSandboxMetadata) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -19706,7 +19673,7 @@ func (m *PodSandboxConfig) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > postIndex { @@ -19833,7 +19800,7 @@ func (m *PodSandboxConfig) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > postIndex { @@ -19886,10 +19853,7 @@ func (m *PodSandboxConfig) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -20007,10 +19971,7 @@ func (m *RunPodSandboxRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -20092,10 +20053,7 @@ func (m *RunPodSandboxResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -20177,10 +20135,7 @@ func (m *StopPodSandboxRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -20230,10 +20185,7 @@ func (m *StopPodSandboxResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -20315,10 +20267,7 @@ func (m *RemovePodSandboxRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -20368,10 +20317,7 @@ func (m *RemovePodSandboxResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -20473,10 +20419,7 @@ func (m *PodSandboxStatusRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -20558,10 +20501,7 @@ func (m *PodIP) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -20677,10 +20617,7 @@ func (m *PodSandboxNetworkStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -20766,10 +20703,7 @@ func (m *Namespace) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -20855,10 +20789,7 @@ func (m *LinuxPodSandboxStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -21196,7 +21127,7 @@ func (m *PodSandboxStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > postIndex { @@ -21323,7 +21254,7 @@ func (m *PodSandboxStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > postIndex { @@ -21372,10 +21303,7 @@ func (m *PodSandboxStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -21571,7 +21499,7 @@ func (m *PodSandboxStatusResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > postIndex { @@ -21588,10 +21516,7 @@ func (m *PodSandboxStatusResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -21660,10 +21585,7 @@ func (m *PodSandboxStateValue) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -21891,7 +21813,7 @@ func (m *PodSandboxFilter) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > postIndex { @@ -21908,10 +21830,7 @@ func (m *PodSandboxFilter) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -21997,10 +21916,7 @@ func (m *ListPodSandboxRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -22266,7 +22182,7 @@ func (m *PodSandbox) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > postIndex { @@ -22393,7 +22309,7 @@ func (m *PodSandbox) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > postIndex { @@ -22442,10 +22358,7 @@ func (m *PodSandbox) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -22529,10 +22442,7 @@ func (m *ListPodSandboxResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -22724,7 +22634,7 @@ func (m *ImageSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > postIndex { @@ -22741,10 +22651,7 @@ func (m *ImageSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -22858,10 +22765,7 @@ func (m *KeyValue) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -23104,10 +23008,7 @@ func (m *LinuxContainerResources) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -23208,10 +23109,7 @@ func (m *HugepageLimit) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -23389,10 +23287,7 @@ func (m *SELinuxOption) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -23506,10 +23401,7 @@ func (m *Capability) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -24107,10 +23999,7 @@ func (m *LinuxContainerSecurityContext) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -24232,10 +24121,7 @@ func (m *LinuxContainerConfig) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -24349,10 +24235,7 @@ func (m *WindowsContainerSecurityContext) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -24474,10 +24357,7 @@ func (m *WindowsContainerConfig) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -24603,10 +24483,7 @@ func (m *WindowsContainerResources) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -24707,10 +24584,7 @@ func (m *ContainerMetadata) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -24856,10 +24730,7 @@ func (m *Device) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -25289,7 +25160,7 @@ func (m *ContainerConfig) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > postIndex { @@ -25416,7 +25287,7 @@ func (m *ContainerConfig) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > postIndex { @@ -25597,10 +25468,7 @@ func (m *ContainerConfig) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -25754,10 +25622,7 @@ func (m *CreateContainerRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -25839,10 +25704,7 @@ func (m *CreateContainerResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -25924,10 +25786,7 @@ func (m *StartContainerRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -25977,10 +25836,7 @@ func (m *StartContainerResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -26081,10 +25937,7 @@ func (m *StopContainerRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -26134,10 +25987,7 @@ func (m *StopContainerResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -26219,10 +26069,7 @@ func (m *RemoveContainerRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -26272,10 +26119,7 @@ func (m *RemoveContainerResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -26344,10 +26188,7 @@ func (m *ContainerStateValue) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -26607,7 +26448,7 @@ func (m *ContainerFilter) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > postIndex { @@ -26624,10 +26465,7 @@ func (m *ContainerFilter) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -26713,10 +26551,7 @@ func (m *ListContainersRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -27082,7 +26917,7 @@ func (m *Container) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > postIndex { @@ -27209,7 +27044,7 @@ func (m *Container) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > postIndex { @@ -27226,10 +27061,7 @@ func (m *Container) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -27313,10 +27145,7 @@ func (m *ListContainersResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -27418,10 +27247,7 @@ func (m *ContainerStatusRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -27876,7 +27702,7 @@ func (m *ContainerStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > postIndex { @@ -28003,7 +27829,7 @@ func (m *ContainerStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > postIndex { @@ -28086,10 +27912,7 @@ func (m *ContainerStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -28285,7 +28108,7 @@ func (m *ContainerStatusResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > postIndex { @@ -28302,10 +28125,7 @@ func (m *ContainerStatusResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -28569,7 +28389,7 @@ func (m *UpdateContainerResourcesRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > postIndex { @@ -28586,10 +28406,7 @@ func (m *UpdateContainerResourcesRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -28639,10 +28456,7 @@ func (m *UpdateContainerResourcesResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -28775,10 +28589,7 @@ func (m *ExecSyncRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -28915,10 +28726,7 @@ func (m *ExecSyncResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -29112,10 +28920,7 @@ func (m *ExecRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -29197,10 +29002,7 @@ func (m *ExecResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -29362,10 +29164,7 @@ func (m *AttachRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -29447,10 +29246,7 @@ func (m *AttachResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -29608,10 +29404,7 @@ func (m *PortForwardRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -29693,10 +29486,7 @@ func (m *PortForwardResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -29782,10 +29572,7 @@ func (m *ImageFilter) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -29871,10 +29658,7 @@ func (m *ListImagesRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -30143,10 +29927,7 @@ func (m *Image) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -30230,10 +30011,7 @@ func (m *ListImagesResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -30339,10 +30117,7 @@ func (m *ImageStatusRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -30538,7 +30313,7 @@ func (m *ImageStatusResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > postIndex { @@ -30555,10 +30330,7 @@ func (m *ImageStatusResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -30800,10 +30572,7 @@ func (m *AuthConfig) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -30961,10 +30730,7 @@ func (m *PullImageRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -31046,10 +30812,7 @@ func (m *PullImageResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -31135,10 +30898,7 @@ func (m *RemoveImageRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -31188,10 +30948,7 @@ func (m *RemoveImageResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -31273,10 +31030,7 @@ func (m *NetworkConfig) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -31362,10 +31116,7 @@ func (m *RuntimeConfig) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -31451,10 +31202,7 @@ func (m *UpdateRuntimeConfigRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -31504,10 +31252,7 @@ func (m *UpdateRuntimeConfigResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -31673,10 +31418,7 @@ func (m *RuntimeCondition) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -31760,10 +31502,7 @@ func (m *RuntimeStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -31833,10 +31572,7 @@ func (m *StatusRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -32032,7 +31768,7 @@ func (m *StatusResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > postIndex { @@ -32049,10 +31785,7 @@ func (m *StatusResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -32102,10 +31835,7 @@ func (m *ImageFsInfoRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -32174,10 +31904,7 @@ func (m *UInt64Value) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -32259,10 +31986,7 @@ func (m *FilesystemIdentifier) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -32439,10 +32163,7 @@ func (m *FilesystemUsage) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -32526,10 +32247,7 @@ func (m *ImageFsInfoResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -32611,10 +32329,7 @@ func (m *ContainerStatsRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -32700,10 +32415,7 @@ func (m *ContainerStatsResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -32789,10 +32501,7 @@ func (m *ListContainerStatsRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -33016,7 +32725,7 @@ func (m *ContainerStatsFilter) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > postIndex { @@ -33033,10 +32742,7 @@ func (m *ContainerStatsFilter) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -33120,10 +32826,7 @@ func (m *ListContainerStatsResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -33351,7 +33054,7 @@ func (m *ContainerAttributes) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > postIndex { @@ -33478,7 +33181,7 @@ func (m *ContainerAttributes) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > postIndex { @@ -33495,10 +33198,7 @@ func (m *ContainerAttributes) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -33692,10 +33392,7 @@ func (m *ContainerStats) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -33800,10 +33497,7 @@ func (m *CpuUsage) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -33908,10 +33602,7 @@ func (m *MemoryUsage) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -33993,10 +33684,7 @@ func (m *ReopenContainerLogRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -34046,10 +33734,7 @@ func (m *ReopenContainerLogResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/csi-translation-lib/BUILD b/vendor/k8s.io/csi-translation-lib/BUILD deleted file mode 100644 index cd93d78f9f57..000000000000 --- a/vendor/k8s.io/csi-translation-lib/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["translate.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/csi-translation-lib", - importpath = "k8s.io/csi-translation-lib", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/storage/v1:go_default_library", - "//staging/src/k8s.io/csi-translation-lib/plugins:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["translate_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/csi-translation-lib/plugins:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/csi-translation-lib/plugins:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/csi-translation-lib/OWNERS b/vendor/k8s.io/csi-translation-lib/OWNERS index 84dffb0952ed..cbe405f456f6 100644 --- a/vendor/k8s.io/csi-translation-lib/OWNERS +++ b/vendor/k8s.io/csi-translation-lib/OWNERS @@ -12,3 +12,6 @@ approvers: - davidz627 - saad-ali - msau42 + +labels: + - sig/storage diff --git a/vendor/k8s.io/csi-translation-lib/go.mod b/vendor/k8s.io/csi-translation-lib/go.mod index 749e8e2ad067..a590b4602049 100644 --- a/vendor/k8s.io/csi-translation-lib/go.mod +++ b/vendor/k8s.io/csi-translation-lib/go.mod @@ -2,18 +2,17 @@ module k8s.io/csi-translation-lib -go 1.15 +go 1.16 require ( github.com/stretchr/testify v1.6.1 - k8s.io/api v0.20.0 - k8s.io/apimachinery v0.20.0 - k8s.io/klog/v2 v2.4.0 + k8s.io/api v0.21.0-rc.0 + k8s.io/apimachinery v0.21.0-rc.0 + k8s.io/klog/v2 v2.8.0 ) replace ( - github.com/onsi/ginkgo => github.com/openshift/ginkgo v4.5.0-origin.1+incompatible - gopkg.in/yaml.v2 => gopkg.in/yaml.v2 v2.2.8 + github.com/onsi/ginkgo => github.com/openshift/ginkgo v4.7.0-origin.0+incompatible k8s.io/api => ../api k8s.io/apimachinery => ../apimachinery k8s.io/csi-translation-lib => ../csi-translation-lib diff --git a/vendor/k8s.io/csi-translation-lib/go.sum b/vendor/k8s.io/csi-translation-lib/go.sum index 3d53ef29106e..4974cee29630 100644 --- a/vendor/k8s.io/csi-translation-lib/go.sum +++ b/vendor/k8s.io/csi-translation-lib/go.sum @@ -6,10 +6,10 @@ github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdko github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= @@ -17,11 +17,9 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v0.2.0 h1:QvGt2nLcHH0WK9orKa+ppBPAxREcH364nPUedEpK0TY= -github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-logr/logr v0.4.0 h1:K7/B1jt6fIBQVd4Owv2MqGQClcgf0R266+7C/QjRcLc= +github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= 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/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= @@ -29,8 +27,8 @@ github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL9 github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= @@ -47,7 +45,6 @@ github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= 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 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM= @@ -55,28 +52,29 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= 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= @@ -85,9 +83,11 @@ github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9 github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/openshift/ginkgo v4.5.0-origin.1+incompatible/go.mod h1:8METQ1gDhl0KW+pGH4c0DIJYEN/ksVCL6hOuHPmXGnk= +github.com/openshift/ginkgo v4.7.0-origin.0+incompatible/go.mod h1:8METQ1gDhl0KW+pGH4c0DIJYEN/ksVCL6hOuHPmXGnk= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -100,13 +100,18 @@ github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoH github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -114,37 +119,45 @@ golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b h1:uwuIcX0g4Yl1NC5XAz37xsr2lTtcqevgzYNVt49waME= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210224082022-3d97a244fca7 h1:OgUuv8lsRpBibGNbSizVwKWlysjaNzmC9gYMhPVfqFM= +golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/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-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/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-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -167,25 +180,29 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.4.0 h1:7+X0fUguPyrKEC4WjH8iGDg3laWgMo5tMnRTIGTTxGQ= -k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2 h1:YHQV7Dajm86OuqnIR6zAelnDWBRjo+YhYV9PmGrh1s8= +k8s.io/klog/v2 v2.8.0 h1:Q3gmuM9hKEjefWFFYF0Mat+YyFJvsUyYuwyNNJ5C9Ts= +k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= +k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/structured-merge-diff/v4 v4.1.0 h1:C4r9BgJ98vrKnnVCjwCSXcWjWe0NKcUQkmzDXZXGwH8= +sigs.k8s.io/structured-merge-diff/v4 v4.1.0/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/vendor/k8s.io/csi-translation-lib/plugins/BUILD b/vendor/k8s.io/csi-translation-lib/plugins/BUILD deleted file mode 100644 index b1d49607efc6..000000000000 --- a/vendor/k8s.io/csi-translation-lib/plugins/BUILD +++ /dev/null @@ -1,58 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "aws_ebs.go", - "azure_disk.go", - "azure_file.go", - "const.go", - "gce_pd.go", - "in_tree_volume.go", - "openstack_cinder.go", - "vsphere_volume.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/csi-translation-lib/plugins", - importpath = "k8s.io/csi-translation-lib/plugins", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/storage/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = [ - "aws_ebs_test.go", - "azure_disk_test.go", - "azure_file_test.go", - "gce_pd_test.go", - "in_tree_volume_test.go", - "vsphere_volume_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/storage/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) diff --git a/vendor/k8s.io/csi-translation-lib/plugins/aws_ebs.go b/vendor/k8s.io/csi-translation-lib/plugins/aws_ebs.go index 5db1e921f8de..db00283a68d5 100644 --- a/vendor/k8s.io/csi-translation-lib/plugins/aws_ebs.go +++ b/vendor/k8s.io/csi-translation-lib/plugins/aws_ebs.go @@ -26,6 +26,7 @@ import ( v1 "k8s.io/api/core/v1" storage "k8s.io/api/storage/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/sets" ) const ( @@ -98,7 +99,7 @@ func (t *awsElasticBlockStoreCSITranslator) TranslateInTreeInlineVolumeToCSI(vol ObjectMeta: metav1.ObjectMeta{ // Must be unique per disk as it is used as the unique part of the // staging path - Name: fmt.Sprintf("%s-%s", AWSEBSDriverName, ebsSource.VolumeID), + Name: fmt.Sprintf("%s-%s", AWSEBSDriverName, volumeHandle), }, Spec: v1.PersistentVolumeSpec{ PersistentVolumeSource: v1.PersistentVolumeSource{ @@ -142,7 +143,7 @@ func (t *awsElasticBlockStoreCSITranslator) TranslateInTreePVToCSI(pv *v1.Persis }, } - if err := translateTopology(pv, AWSEBSTopologyKey); err != nil { + if err := translateTopologyFromInTreeToCSI(pv, AWSEBSTopologyKey); err != nil { return nil, fmt.Errorf("failed to translate topology: %v", err) } @@ -174,6 +175,11 @@ func (t *awsElasticBlockStoreCSITranslator) TranslateCSIPVToInTree(pv *v1.Persis ebsSource.Partition = int32(partValue) } + // translate CSI topology to In-tree topology for rollback compatibility + if err := translateTopologyFromCSIToInTree(pv, AWSEBSTopologyKey, getAwsRegionFromZones); err != nil { + return nil, fmt.Errorf("failed to translate topology. PV:%+v. Error:%v", *pv, err) + } + pv.Spec.CSI = nil pv.Spec.AWSElasticBlockStore = ebsSource return pv, nil @@ -211,7 +217,7 @@ func (t *awsElasticBlockStoreCSITranslator) RepairVolumeHandle(volumeHandle, nod var awsVolumeRegMatch = regexp.MustCompile("^vol-[^/]*$") // KubernetesVolumeIDToEBSVolumeID translates Kubernetes volume ID to EBS volume ID -// KubernetsVolumeID forms: +// KubernetesVolumeID forms: // * aws:/// // * aws:/// // * @@ -253,3 +259,30 @@ func KubernetesVolumeIDToEBSVolumeID(kubernetesID string) (string, error) { return awsID, nil } + +func getAwsRegionFromZones(zones []string) (string, error) { + regions := sets.String{} + if len(zones) < 1 { + return "", fmt.Errorf("no zones specified") + } + + // AWS zones can be in four forms: + // us-west-2a, us-gov-east-1a, us-west-2-lax-1a (local zone) and us-east-1-wl1-bos-wlz-1 (wavelength). + for _, zone := range zones { + splitZone := strings.Split(zone, "-") + if (len(splitZone) == 3 || len(splitZone) == 4) && len(splitZone[len(splitZone)-1]) == 2 { + // this would break if we ever have a location with more than 9 regions, ie us-west-10. + splitZone[len(splitZone)-1] = splitZone[len(splitZone)-1][:1] + regions.Insert(strings.Join(splitZone, "-")) + } else if len(splitZone) == 5 || len(splitZone) == 7 { + // local zone or wavelength + regions.Insert(strings.Join(splitZone[:3], "-")) + } else { + return "", fmt.Errorf("Unexpected zone format: %v is not a valid AWS zone", zone) + } + } + if regions.Len() != 1 { + return "", fmt.Errorf("multiple or no regions gotten from zones, got: %v", regions) + } + return regions.UnsortedList()[0], nil +} diff --git a/vendor/k8s.io/csi-translation-lib/plugins/azure_file.go b/vendor/k8s.io/csi-translation-lib/plugins/azure_file.go index 94ef714fe274..6ce3be461f73 100644 --- a/vendor/k8s.io/csi-translation-lib/plugins/azure_file.go +++ b/vendor/k8s.io/csi-translation-lib/plugins/azure_file.go @@ -37,11 +37,11 @@ const ( volumeIDTemplate = "%s#%s#%s#%s" // Parameter names defined in azure file CSI driver, refer to // https://github.com/kubernetes-sigs/azurefile-csi-driver/blob/master/docs/driver-parameters.md - azureFileShareName = "shareName" - - secretNameTemplate = "azure-storage-account-%s-secret" - defaultSecretNamespace = "default" - + shareNameField = "sharename" + secretNameField = "secretname" + secretNamespaceField = "secretnamespace" + secretNameTemplate = "azure-storage-account-%s-secret" + defaultSecretNamespace = "default" resourceGroupAnnotation = "kubernetes.io/azure-file-resource-group" ) @@ -90,7 +90,7 @@ func (t *azureFileCSITranslator) TranslateInTreeInlineVolumeToCSI(volume *v1.Vol Driver: AzureFileDriverName, VolumeHandle: fmt.Sprintf(volumeIDTemplate, "", accountName, azureSource.ShareName, ""), ReadOnly: azureSource.ReadOnly, - VolumeAttributes: map[string]string{azureFileShareName: azureSource.ShareName}, + VolumeAttributes: map[string]string{shareNameField: azureSource.ShareName}, NodeStageSecretRef: &v1.SecretReference{ Name: azureSource.SecretName, Namespace: defaultSecretNamespace, @@ -135,7 +135,7 @@ func (t *azureFileCSITranslator) TranslateInTreePVToCSI(pv *v1.PersistentVolume) Namespace: defaultSecretNamespace, }, ReadOnly: azureSource.ReadOnly, - VolumeAttributes: map[string]string{azureFileShareName: azureSource.ShareName}, + VolumeAttributes: map[string]string{shareNameField: azureSource.ShareName}, VolumeHandle: volumeID, } ) @@ -163,31 +163,48 @@ func (t *azureFileCSITranslator) TranslateCSIPVToInTree(pv *v1.PersistentVolume) ReadOnly: csiSource.ReadOnly, } + for k, v := range csiSource.VolumeAttributes { + switch strings.ToLower(k) { + case shareNameField: + azureSource.ShareName = v + case secretNameField: + azureSource.SecretName = v + case secretNamespaceField: + ns := v + azureSource.SecretNamespace = &ns + } + } + resourceGroup := "" if csiSource.NodeStageSecretRef != nil && csiSource.NodeStageSecretRef.Name != "" { azureSource.SecretName = csiSource.NodeStageSecretRef.Name azureSource.SecretNamespace = &csiSource.NodeStageSecretRef.Namespace - if csiSource.VolumeAttributes != nil { - if shareName, ok := csiSource.VolumeAttributes[azureFileShareName]; ok { - azureSource.ShareName = shareName - } - } - } else { + } + if azureSource.ShareName == "" || azureSource.SecretName == "" { rg, storageAccount, fileShareName, _, err := getFileShareInfo(csiSource.VolumeHandle) if err != nil { return nil, err } - azureSource.ShareName = fileShareName - azureSource.SecretName = fmt.Sprintf(secretNameTemplate, storageAccount) + if azureSource.ShareName == "" { + azureSource.ShareName = fileShareName + } + if azureSource.SecretName == "" { + azureSource.SecretName = fmt.Sprintf(secretNameTemplate, storageAccount) + } resourceGroup = rg } + if azureSource.SecretNamespace == nil { + ns := defaultSecretNamespace + azureSource.SecretNamespace = &ns + } + pv.Spec.CSI = nil pv.Spec.AzureFile = azureSource + if pv.ObjectMeta.Annotations == nil { + pv.ObjectMeta.Annotations = map[string]string{} + } if resourceGroup != "" { - if pv.ObjectMeta.Annotations == nil { - pv.ObjectMeta.Annotations = map[string]string{} - } pv.ObjectMeta.Annotations[resourceGroupAnnotation] = resourceGroup } diff --git a/vendor/k8s.io/csi-translation-lib/plugins/gce_pd.go b/vendor/k8s.io/csi-translation-lib/plugins/gce_pd.go index 1a1541019ce9..d163fe88536d 100644 --- a/vendor/k8s.io/csi-translation-lib/plugins/gce_pd.go +++ b/vendor/k8s.io/csi-translation-lib/plugins/gce_pd.go @@ -215,18 +215,23 @@ func (g *gcePersistentDiskCSITranslator) TranslateInTreePVToCSI(pv *v1.Persisten return nil, fmt.Errorf("pv is nil or GCE Persistent Disk source not defined on pv") } + // depend on which version it migrates from, the label could be failuredomain beta or topology GA version zonesLabel := pv.Labels[v1.LabelFailureDomainBetaZone] + if zonesLabel == "" { + zonesLabel = pv.Labels[v1.LabelTopologyZone] + } + zones := strings.Split(zonesLabel, labelMultiZoneDelimiter) if len(zones) == 1 && len(zones[0]) != 0 { // Zonal volID = fmt.Sprintf(volIDZonalFmt, UnspecifiedValue, zones[0], pv.Spec.GCEPersistentDisk.PDName) } else if len(zones) > 1 { // Regional - region, err := getRegionFromZones(zones) + region, err := gceGetRegionFromZones(zones) if err != nil { return nil, fmt.Errorf("failed to get region from zones: %v", err) } - volID = fmt.Sprintf(volIDZonalFmt, UnspecifiedValue, region, pv.Spec.GCEPersistentDisk.PDName) + volID = fmt.Sprintf(volIDRegionalFmt, UnspecifiedValue, region, pv.Spec.GCEPersistentDisk.PDName) } else { // Unspecified volID = fmt.Sprintf(volIDZonalFmt, UnspecifiedValue, UnspecifiedValue, pv.Spec.GCEPersistentDisk.PDName) @@ -249,7 +254,7 @@ func (g *gcePersistentDiskCSITranslator) TranslateInTreePVToCSI(pv *v1.Persisten }, } - if err := translateTopology(pv, GCEPDTopologyKey); err != nil { + if err := translateTopologyFromInTreeToCSI(pv, GCEPDTopologyKey); err != nil { return nil, fmt.Errorf("failed to translate topology: %v", err) } @@ -286,7 +291,10 @@ func (g *gcePersistentDiskCSITranslator) TranslateCSIPVToInTree(pv *v1.Persisten gceSource.Partition = int32(partInt) } - // TODO: Take the zone/regional information and stick it into the label. + // translate CSI topology to In-tree topology for rollback compatibility + if err := translateTopologyFromCSIToInTree(pv, GCEPDTopologyKey, gceGetRegionFromZones); err != nil { + return nil, fmt.Errorf("failed to translate topology. PV:%+v. Error:%v", *pv, err) + } pv.Spec.CSI = nil pv.Spec.GCEPersistentDisk = gceSource @@ -348,7 +356,7 @@ func (g *gcePersistentDiskCSITranslator) RepairVolumeHandle(volumeHandle, nodeID case "regions": region := "" if tok[volIDZoneValue] == UnspecifiedValue { - region, err = getRegionFromZones([]string{nodeTok[volIDZoneValue]}) + region, err = gceGetRegionFromZones([]string{nodeTok[volIDZoneValue]}) if err != nil { return "", fmt.Errorf("failed to get region from zone %s: %v", nodeTok[volIDZoneValue], err) } @@ -371,7 +379,7 @@ func pdNameFromVolumeID(id string) (string, error) { // TODO: Replace this with the imported one from GCE PD CSI Driver when // the driver removes all k8s/k8s dependencies -func getRegionFromZones(zones []string) (string, error) { +func gceGetRegionFromZones(zones []string) (string, error) { regions := sets.String{} if len(zones) < 1 { return "", fmt.Errorf("no zones specified") diff --git a/vendor/k8s.io/csi-translation-lib/plugins/in_tree_volume.go b/vendor/k8s.io/csi-translation-lib/plugins/in_tree_volume.go index 9d22b80aad77..f1c760df786d 100644 --- a/vendor/k8s.io/csi-translation-lib/plugins/in_tree_volume.go +++ b/vendor/k8s.io/csi-translation-lib/plugins/in_tree_volume.go @@ -19,6 +19,7 @@ package plugins import ( "errors" "fmt" + "sort" "strings" v1 "k8s.io/api/core/v1" @@ -76,8 +77,17 @@ const ( zonesKey = "zones" ) -// replaceTopology overwrites an existing topology key by a new one. +// replaceTopology overwrites an existing key in NodeAffinity by a new one. +// If there are any newKey already exist in an expression of a term, we will +// not combine the replaced key Values with the existing ones. +// So there might be duplication if there is any newKey expression +// already in the terms. func replaceTopology(pv *v1.PersistentVolume, oldKey, newKey string) error { + // Make sure the necessary fields exist + if pv == nil || pv.Spec.NodeAffinity == nil || pv.Spec.NodeAffinity.Required == nil || + pv.Spec.NodeAffinity.Required.NodeSelectorTerms == nil || len(pv.Spec.NodeAffinity.Required.NodeSelectorTerms) == 0 { + return nil + } for i := range pv.Spec.NodeAffinity.Required.NodeSelectorTerms { for j, r := range pv.Spec.NodeAffinity.Required.NodeSelectorTerms[i].MatchExpressions { if r.Key == oldKey { @@ -85,29 +95,41 @@ func replaceTopology(pv *v1.PersistentVolume, oldKey, newKey string) error { } } } + return nil } -// getTopologyZones returns all topology zones with the given key found in the PV. -func getTopologyZones(pv *v1.PersistentVolume, key string) []string { +// getTopologyValues returns all unique topology values with the given key found in +// the PV NodeAffinity. Sort by alphabetical order. +// This function collapses multiple zones into a list that is ORed. This assumes that +// the plugin does not support a constraint like key in "zone1" AND "zone2" +func getTopologyValues(pv *v1.PersistentVolume, key string) []string { if pv.Spec.NodeAffinity == nil || pv.Spec.NodeAffinity.Required == nil || len(pv.Spec.NodeAffinity.Required.NodeSelectorTerms) < 1 { return nil } - var values []string + values := make(map[string]bool) for i := range pv.Spec.NodeAffinity.Required.NodeSelectorTerms { for _, r := range pv.Spec.NodeAffinity.Required.NodeSelectorTerms[i].MatchExpressions { if r.Key == key { - values = append(values, r.Values...) + for _, v := range r.Values { + values[v] = true + } } } } - return values + // remove duplication and sort them in order for better usage + var re []string + for k := range values { + re = append(re, k) + } + sort.Strings(re) + return re } -// addTopology appends the topology to the given PV. +// addTopology appends the topology to the given PV to all Terms. func addTopology(pv *v1.PersistentVolume, topologyKey string, zones []string) error { // Make sure there are no duplicate or empty strings filteredZones := sets.String{} @@ -124,9 +146,17 @@ func addTopology(pv *v1.PersistentVolume, topologyKey string, zones []string) er } // Make sure the necessary fields exist - pv.Spec.NodeAffinity = new(v1.VolumeNodeAffinity) - pv.Spec.NodeAffinity.Required = new(v1.NodeSelector) - pv.Spec.NodeAffinity.Required.NodeSelectorTerms = make([]v1.NodeSelectorTerm, 1) + if pv.Spec.NodeAffinity == nil { + pv.Spec.NodeAffinity = new(v1.VolumeNodeAffinity) + } + + if pv.Spec.NodeAffinity.Required == nil { + pv.Spec.NodeAffinity.Required = new(v1.NodeSelector) + } + + if len(pv.Spec.NodeAffinity.Required.NodeSelectorTerms) == 0 { + pv.Spec.NodeAffinity.Required.NodeSelectorTerms = make([]v1.NodeSelectorTerm, 1) + } topology := v1.NodeSelectorRequirement{ Key: topologyKey, @@ -134,31 +164,141 @@ func addTopology(pv *v1.PersistentVolume, topologyKey string, zones []string) er Values: zones, } - pv.Spec.NodeAffinity.Required.NodeSelectorTerms[0].MatchExpressions = append( - pv.Spec.NodeAffinity.Required.NodeSelectorTerms[0].MatchExpressions, - topology, - ) + // add the CSI topology to each term + for i := range pv.Spec.NodeAffinity.Required.NodeSelectorTerms { + pv.Spec.NodeAffinity.Required.NodeSelectorTerms[i].MatchExpressions = append( + pv.Spec.NodeAffinity.Required.NodeSelectorTerms[i].MatchExpressions, + topology, + ) + } return nil } -// translateTopology converts existing zone labels or in-tree topology to CSI topology. -// In-tree topology has precedence over zone labels. -func translateTopology(pv *v1.PersistentVolume, topologyKey string) error { - // If topology is already set, assume the content is accurate - if len(getTopologyZones(pv, topologyKey)) > 0 { - return nil - } +// translateTopologyFromInTreeToCSI converts existing zone labels or in-tree topology to CSI topology. +// In-tree topology has precedence over zone labels. When both in-tree topology and zone labels exist +// for a particular CSI topology, in-tree topology will be used. +// This function will remove the Beta version Kubernetes topology label in case the node upgrade to a +// newer version where it does not have any Beta topology label anymore +func translateTopologyFromInTreeToCSI(pv *v1.PersistentVolume, csiTopologyKey string) error { + + zoneLabel, regionLabel := getTopologyLabel(pv) - zones := getTopologyZones(pv, v1.LabelFailureDomainBetaZone) + // If Zone kubernetes topology exist, replace it to use csiTopologyKey + zones := getTopologyValues(pv, zoneLabel) if len(zones) > 0 { - return replaceTopology(pv, v1.LabelFailureDomainBetaZone, topologyKey) + replaceTopology(pv, zoneLabel, csiTopologyKey) + } else { + // if nothing is in the NodeAffinity, try to fetch the topology from PV labels + if label, ok := pv.Labels[zoneLabel]; ok { + zones = strings.Split(label, labelMultiZoneDelimiter) + if len(zones) > 0 { + addTopology(pv, csiTopologyKey, zones) + } + } + } + + // if the in-tree PV has beta region label, replace it with GA label to ensure + // the scheduler is able to schedule it on new nodes with only GA kubernetes label + // No need to check it for zone label because it has already been replaced if exist + if regionLabel == v1.LabelFailureDomainBetaRegion { + regions := getTopologyValues(pv, regionLabel) + if len(regions) > 0 { + replaceTopology(pv, regionLabel, v1.LabelTopologyRegion) + } + } + + return nil +} + +// getTopologyLabel checks if the kubernetes topology label used in this +// PV is GA and return the zone/region label used. +// The version checking follows the following orders +// 1. Check NodeAffinity +// 1.1 Check if zoneGA exists, if yes return GA labels +// 1.2 Check if zoneBeta exists, if yes return Beta labels +// 2. Check PV labels +// 2.1 Check if zoneGA exists, if yes return GA labels +// 2.2 Check if zoneBeta exists, if yes return Beta labels +func getTopologyLabel(pv *v1.PersistentVolume) (zoneLabel string, regionLabel string) { + + if zoneGA := TopologyKeyExist(v1.LabelTopologyZone, pv.Spec.NodeAffinity); zoneGA { + return v1.LabelTopologyZone, v1.LabelTopologyRegion + } + if zoneBeta := TopologyKeyExist(v1.LabelFailureDomainBetaZone, pv.Spec.NodeAffinity); zoneBeta { + return v1.LabelFailureDomainBetaZone, v1.LabelFailureDomainBetaRegion + } + if _, zoneGA := pv.Labels[v1.LabelTopologyZone]; zoneGA { + return v1.LabelTopologyZone, v1.LabelTopologyRegion + } + if _, zoneBeta := pv.Labels[v1.LabelFailureDomainBetaZone]; zoneBeta { + return v1.LabelFailureDomainBetaZone, v1.LabelFailureDomainBetaRegion + } + // No labels or NodeAffinity exist, default to GA version + return v1.LabelTopologyZone, v1.LabelTopologyRegion +} + +// TopologyKeyExist checks if a certain key exists in a VolumeNodeAffinity +func TopologyKeyExist(key string, vna *v1.VolumeNodeAffinity) bool { + if vna == nil || vna.Required == nil || vna.Required.NodeSelectorTerms == nil || len(vna.Required.NodeSelectorTerms) == 0 { + return false + } + + for _, nodeSelectorTerms := range vna.Required.NodeSelectorTerms { + nsrequirements := nodeSelectorTerms.MatchExpressions + for _, nodeSelectorRequirement := range nsrequirements { + if nodeSelectorRequirement.Key == key { + return true + } + } + } + return false +} + +type regionParserFn func([]string) (string, error) + +// translateTopologyFromCSIToInTree translate a CSI topology to +// Kubernetes topology and add topology labels to it. Note that this function +// will only work for plugin with a single topologyKey that translates to +// Kubernetes zone(and region if regionParser is passed in). +// If a plugin has more than one topologyKey, it will need to be processed +// separately by the plugin. +// If regionParser is nil, no region NodeAffinity will be added. If not nil, +// it'll be passed to regionTopologyHandler, which will add region topology NodeAffinity +// and labels for the given PV. It assumes the Zone NodeAffinity already exists. +// In short this function will, +// 1. Replace all CSI topology to Kubernetes Zone topology label +// 2. Process and generate region topology if a regionParser is passed +// 3. Add Kubernetes Topology labels(zone) if they do not exist +func translateTopologyFromCSIToInTree(pv *v1.PersistentVolume, csiTopologyKey string, regionParser regionParserFn) error { + + zoneLabel, _ := getTopologyLabel(pv) + + // 1. Replace all CSI topology to Kubernetes Zone label + err := replaceTopology(pv, csiTopologyKey, zoneLabel) + if err != nil { + return fmt.Errorf("Failed to replace CSI topology to Kubernetes topology, error: %v", err) } - if label, ok := pv.Labels[v1.LabelFailureDomainBetaZone]; ok { - zones = strings.Split(label, labelMultiZoneDelimiter) - if len(zones) > 0 { - return addTopology(pv, topologyKey, zones) + // 2. Take care of region topology if a regionParser is passed + if regionParser != nil { + // let's make less strict on this one. Even if there is an error in the region processing, just ignore it + err = regionTopologyHandler(pv, regionParser) + if err != nil { + return fmt.Errorf("Failed to handle region topology. error: %v", err) + } + } + + // 3. Add labels about Kubernetes Topology + zoneVals := getTopologyValues(pv, zoneLabel) + if len(zoneVals) > 0 { + if pv.Labels == nil { + pv.Labels = make(map[string]string) + } + _, zoneOK := pv.Labels[zoneLabel] + if !zoneOK { + zoneValStr := strings.Join(zoneVals, labelMultiZoneDelimiter) + pv.Labels[zoneLabel] = zoneValStr } } @@ -177,7 +317,7 @@ func translateAllowedTopologies(terms []v1.TopologySelectorTerm, key string) ([] newTerm := v1.TopologySelectorTerm{} for _, exp := range term.MatchLabelExpressions { var newExp v1.TopologySelectorLabelRequirement - if exp.Key == v1.LabelFailureDomainBetaZone { + if exp.Key == v1.LabelFailureDomainBetaZone || exp.Key == v1.LabelTopologyZone { newExp = v1.TopologySelectorLabelRequirement{ Key: key, Values: exp.Values, @@ -193,3 +333,65 @@ func translateAllowedTopologies(terms []v1.TopologySelectorTerm, key string) ([] } return newTopologies, nil } + +// regionTopologyHandler will process the PV and add region +// kubernetes topology label to its NodeAffinity and labels +// It assumes the Zone NodeAffinity already exists +// Each provider is responsible for providing their own regionParser +func regionTopologyHandler(pv *v1.PersistentVolume, regionParser regionParserFn) error { + + // Make sure the necessary fields exist + if pv == nil || pv.Spec.NodeAffinity == nil || pv.Spec.NodeAffinity.Required == nil || + pv.Spec.NodeAffinity.Required.NodeSelectorTerms == nil || len(pv.Spec.NodeAffinity.Required.NodeSelectorTerms) == 0 { + return nil + } + + zoneLabel, regionLabel := getTopologyLabel(pv) + + // process each term + for index, nodeSelectorTerm := range pv.Spec.NodeAffinity.Required.NodeSelectorTerms { + // In the first loop, see if regionLabel already exist + regionExist := false + var zoneVals []string + for _, nsRequirement := range nodeSelectorTerm.MatchExpressions { + if nsRequirement.Key == regionLabel { + regionExist = true + break + } else if nsRequirement.Key == zoneLabel { + zoneVals = append(zoneVals, nsRequirement.Values...) + } + } + if regionExist { + // Regionlabel already exist in this term, skip it + continue + } + // If no regionLabel found, generate region label from the zoneLabel we collect from this term + regionVal, err := regionParser(zoneVals) + if err != nil { + return err + } + // Add the regionVal to this term + pv.Spec.NodeAffinity.Required.NodeSelectorTerms[index].MatchExpressions = + append(pv.Spec.NodeAffinity.Required.NodeSelectorTerms[index].MatchExpressions, v1.NodeSelectorRequirement{ + Key: regionLabel, + Operator: v1.NodeSelectorOpIn, + Values: []string{regionVal}, + }) + + } + + // Add region label + regionVals := getTopologyValues(pv, regionLabel) + if len(regionVals) == 1 { + // We should only have exactly 1 region value + if pv.Labels == nil { + pv.Labels = make(map[string]string) + } + _, regionOK := pv.Labels[regionLabel] + if !regionOK { + pv.Labels[regionLabel] = regionVals[0] + } + } + + return nil +} diff --git a/vendor/k8s.io/csi-translation-lib/plugins/openstack_cinder.go b/vendor/k8s.io/csi-translation-lib/plugins/openstack_cinder.go index f3e21bc760ac..44f744cb2189 100644 --- a/vendor/k8s.io/csi-translation-lib/plugins/openstack_cinder.go +++ b/vendor/k8s.io/csi-translation-lib/plugins/openstack_cinder.go @@ -18,6 +18,7 @@ package plugins import ( "fmt" + "strings" v1 "k8s.io/api/core/v1" storage "k8s.io/api/storage/v1" @@ -45,6 +46,30 @@ func NewOpenStackCinderCSITranslator() InTreePlugin { // TranslateInTreeStorageClassParametersToCSI translates InTree Cinder storage class parameters to CSI storage class func (t *osCinderCSITranslator) TranslateInTreeStorageClassToCSI(sc *storage.StorageClass) (*storage.StorageClass, error) { + var ( + params = map[string]string{} + ) + for k, v := range sc.Parameters { + switch strings.ToLower(k) { + case fsTypeKey: + params[csiFsTypeKey] = v + default: + // All other parameters are supported by the CSI driver. + // This includes also "availability", therefore do not translate it to sc.AllowedTopologies + params[k] = v + } + } + + if len(sc.AllowedTopologies) > 0 { + newTopologies, err := translateAllowedTopologies(sc.AllowedTopologies, CinderTopologyKey) + if err != nil { + return nil, fmt.Errorf("failed translating allowed topologies: %v", err) + } + sc.AllowedTopologies = newTopologies + } + + sc.Parameters = params + return sc, nil } @@ -95,7 +120,7 @@ func (t *osCinderCSITranslator) TranslateInTreePVToCSI(pv *v1.PersistentVolume) VolumeAttributes: map[string]string{}, } - if err := translateTopology(pv, CinderTopologyKey); err != nil { + if err := translateTopologyFromInTreeToCSI(pv, CinderTopologyKey); err != nil { return nil, fmt.Errorf("failed to translate topology: %v", err) } @@ -119,6 +144,12 @@ func (t *osCinderCSITranslator) TranslateCSIPVToInTree(pv *v1.PersistentVolume) ReadOnly: csiSource.ReadOnly, } + // translate CSI topology to In-tree topology for rollback compatibility. + // It is not possible to guess Cinder Region from the Zone, therefore leave it empty. + if err := translateTopologyFromCSIToInTree(pv, CinderTopologyKey, nil); err != nil { + return nil, fmt.Errorf("failed to translate topology. PV:%+v. Error:%v", *pv, err) + } + pv.Spec.CSI = nil pv.Spec.Cinder = cinderSource return pv, nil diff --git a/vendor/k8s.io/kube-aggregator/pkg/apis/apiregistration/BUILD b/vendor/k8s.io/kube-aggregator/pkg/apis/apiregistration/BUILD deleted file mode 100644 index 0dd6540b5d26..000000000000 --- a/vendor/k8s.io/kube-aggregator/pkg/apis/apiregistration/BUILD +++ /dev/null @@ -1,51 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "helpers.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kube-aggregator/pkg/apis/apiregistration", - importpath = "k8s.io/kube-aggregator/pkg/apis/apiregistration", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/version:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/install:all-srcs", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1:all-srcs", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1:all-srcs", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/validation:all-srcs", - ], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["helpers_test.go"], - embed = [":go_default_library"], -) diff --git a/vendor/k8s.io/kube-aggregator/pkg/apis/apiregistration/install/BUILD b/vendor/k8s.io/kube-aggregator/pkg/apis/apiregistration/install/BUILD deleted file mode 100644 index a10bfc66c97b..000000000000 --- a/vendor/k8s.io/kube-aggregator/pkg/apis/apiregistration/install/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["install.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kube-aggregator/pkg/apis/apiregistration/install", - importpath = "k8s.io/kube-aggregator/pkg/apis/apiregistration/install", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1/BUILD b/vendor/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1/BUILD deleted file mode 100644 index c2ea29f81f37..000000000000 --- a/vendor/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1/BUILD +++ /dev/null @@ -1,47 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "defaults.go", - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "zz_generated.conversion.go", - "zz_generated.deepcopy.go", - "zz_generated.defaults.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1", - importpath = "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1/helper:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1/generated.pb.go b/vendor/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1/generated.pb.go index 9639fce29ac3..69d42622c8d5 100644 --- a/vendor/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1/generated.pb.go +++ b/vendor/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1/generated.pb.go @@ -925,10 +925,7 @@ func (m *APIService) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1139,10 +1136,7 @@ func (m *APIServiceCondition) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1259,10 +1253,7 @@ func (m *APIServiceList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1504,10 +1495,7 @@ func (m *APIServiceSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1591,10 +1579,7 @@ func (m *APIServiceStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1728,10 +1713,7 @@ func (m *ServiceReference) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1/helper/BUILD b/vendor/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1/helper/BUILD deleted file mode 100644 index 543971ecdcaf..000000000000 --- a/vendor/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1/helper/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["helpers.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1/helper", - importpath = "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1/helper", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/version:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["helpers_test.go"], - embed = [":go_default_library"], - deps = ["//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1/BUILD b/vendor/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1/BUILD deleted file mode 100644 index 64268ab5f9e2..000000000000 --- a/vendor/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "defaults.go", - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "zz_generated.conversion.go", - "zz_generated.deepcopy.go", - "zz_generated.defaults.go", - "zz_generated.prerelease-lifecycle.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1", - importpath = "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1/generated.pb.go b/vendor/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1/generated.pb.go index 7aff99be1790..4a9ff15faace 100644 --- a/vendor/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1/generated.pb.go +++ b/vendor/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1/generated.pb.go @@ -925,10 +925,7 @@ func (m *APIService) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1139,10 +1136,7 @@ func (m *APIServiceCondition) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1259,10 +1253,7 @@ func (m *APIServiceList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1504,10 +1495,7 @@ func (m *APIServiceSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1591,10 +1579,7 @@ func (m *APIServiceStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1728,10 +1713,7 @@ func (m *ServiceReference) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/kube-aggregator/pkg/apis/apiregistration/validation/BUILD b/vendor/k8s.io/kube-aggregator/pkg/apis/apiregistration/validation/BUILD deleted file mode 100644 index 789d75be2d32..000000000000 --- a/vendor/k8s.io/kube-aggregator/pkg/apis/apiregistration/validation/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["validation.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kube-aggregator/pkg/apis/apiregistration/validation", - importpath = "k8s.io/kube-aggregator/pkg/apis/apiregistration/validation", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/validation/path:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kube-aggregator/pkg/apiserver/BUILD b/vendor/k8s.io/kube-aggregator/pkg/apiserver/BUILD deleted file mode 100644 index 41956d67395e..000000000000 --- a/vendor/k8s.io/kube-aggregator/pkg/apiserver/BUILD +++ /dev/null @@ -1,110 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "handler_apis_test.go", - "handler_proxy_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/proxy:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/dynamiccertificates:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apiserver/scheme:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/client/listers/apiregistration/v1:go_default_library", - "//vendor/golang.org/x/net/websocket:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "apiserver.go", - "apiservice_controller.go", - "handler_apis.go", - "handler_proxy.go", - "resolvers.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kube-aggregator/pkg/apiserver", - importpath = "k8s.io/kube-aggregator/pkg/apiserver", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/httpstream/spdy:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/proxy:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/handlers/negotiation:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/metrics:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/features:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/dynamiccertificates:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/egressselector:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/storage:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/proxy:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/pkg/version:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/transport:go_default_library", - "//staging/src/k8s.io/client-go/util/workqueue:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1/helper:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apiserver/scheme:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/client/informers/externalversions:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/client/informers/externalversions/apiregistration/v1:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/client/listers/apiregistration/v1:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/controllers:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/controllers/openapi:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/controllers/openapi/aggregator:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/controllers/status:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/registry/apiservice/rest:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/common:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/kube-aggregator/pkg/apiserver/scheme:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kube-aggregator/pkg/apiserver/apiserver.go b/vendor/k8s.io/kube-aggregator/pkg/apiserver/apiserver.go index d4c27a905e27..8349b1d0ca77 100644 --- a/vendor/k8s.io/kube-aggregator/pkg/apiserver/apiserver.go +++ b/vendor/k8s.io/kube-aggregator/pkg/apiserver/apiserver.go @@ -68,8 +68,12 @@ func init() { ) } -// legacyAPIServiceName is the fixed name of the only non-groupified API version -const legacyAPIServiceName = "v1." +const ( + // legacyAPIServiceName is the fixed name of the only non-groupified API version + legacyAPIServiceName = "v1." + // StorageVersionPostStartHookName is the name of the storage version updater post start hook. + StorageVersionPostStartHookName = "built-in-resources-storage-version-updater" +) // ExtraConfig represents APIServices-specific configuration type ExtraConfig struct { @@ -170,11 +174,6 @@ func (cfg *Config) Complete() CompletedConfig { // NewWithDelegate returns a new instance of APIAggregator from the given config. func (c completedConfig) NewWithDelegate(delegationTarget genericapiserver.DelegationTarget) (*APIAggregator, error) { - // Prevent generic API server to install OpenAPI handler. Aggregator server - // has its own customized OpenAPI handler. - openAPIConfig := c.GenericConfig.OpenAPIConfig - c.GenericConfig.OpenAPIConfig = nil - genericServer, err := c.GenericConfig.New("kube-aggregator", delegationTarget) if err != nil { return nil, err @@ -199,12 +198,18 @@ func (c completedConfig) NewWithDelegate(delegationTarget genericapiserver.Deleg lister: informerFactory.Apiregistration().V1().APIServices().Lister(), APIRegistrationInformers: informerFactory, serviceResolver: c.ExtraConfig.ServiceResolver, - openAPIConfig: openAPIConfig, + openAPIConfig: c.GenericConfig.OpenAPIConfig, egressSelector: c.GenericConfig.EgressSelector, proxyCurrentCertKeyContent: func() (bytes []byte, bytes2 []byte) { return nil, nil }, } - apiGroupInfo := apiservicerest.NewRESTStorage(c.GenericConfig.MergedResourceConfig, c.GenericConfig.RESTOptionsGetter) + // used later to filter the served resource by those that have expired. + resourceExpirationEvaluator, err := genericapiserver.NewResourceExpirationEvaluator(*c.GenericConfig.Version) + if err != nil { + return nil, err + } + + apiGroupInfo := apiservicerest.NewRESTStorage(c.GenericConfig.MergedResourceConfig, c.GenericConfig.RESTOptionsGetter, resourceExpirationEvaluator.ShouldServeForVersion(1, 22)) if err := s.GenericAPIServer.InstallAPIGroup(&apiGroupInfo); err != nil { return nil, err } @@ -309,7 +314,7 @@ func (c completedConfig) NewWithDelegate(delegationTarget genericapiserver.Deleg utilfeature.DefaultFeatureGate.Enabled(genericfeatures.APIServerIdentity) { // Spawn a goroutine in aggregator apiserver to update storage version for // all built-in resources - s.GenericAPIServer.AddPostStartHookOrDie("built-in-resources-storage-version-updater", func(hookContext genericapiserver.PostStartHookContext) error { + s.GenericAPIServer.AddPostStartHookOrDie(StorageVersionPostStartHookName, func(hookContext genericapiserver.PostStartHookContext) error { // Wait for apiserver-identity to exist first before updating storage // versions, to avoid storage version GC accidentally garbage-collecting // storage versions. diff --git a/vendor/k8s.io/kube-aggregator/pkg/apiserver/apiservice_controller.go b/vendor/k8s.io/kube-aggregator/pkg/apiserver/apiservice_controller.go index 506748954ccc..52df3cb25fad 100644 --- a/vendor/k8s.io/kube-aggregator/pkg/apiserver/apiservice_controller.go +++ b/vendor/k8s.io/kube-aggregator/pkg/apiserver/apiservice_controller.go @@ -94,8 +94,8 @@ func (c *APIServiceRegistrationController) Run(stopCh <-chan struct{}, handlerSy defer utilruntime.HandleCrash() defer c.queue.ShutDown() - klog.Infof("Starting APIServiceRegistrationController") - defer klog.Infof("Shutting down APIServiceRegistrationController") + klog.Info("Starting APIServiceRegistrationController") + defer klog.Info("Shutting down APIServiceRegistrationController") if !controllers.WaitForCacheSync("APIServiceRegistrationController", stopCh, c.apiServiceSynced) { return diff --git a/vendor/k8s.io/kube-aggregator/pkg/apiserver/handler_proxy.go b/vendor/k8s.io/kube-aggregator/pkg/apiserver/handler_proxy.go index fe37fccc0f9b..47b4f3ed248b 100644 --- a/vendor/k8s.io/kube-aggregator/pkg/apiserver/handler_proxy.go +++ b/vendor/k8s.io/kube-aggregator/pkg/apiserver/handler_proxy.go @@ -30,6 +30,7 @@ import ( "k8s.io/apimachinery/pkg/util/httpstream/spdy" utilnet "k8s.io/apimachinery/pkg/util/net" "k8s.io/apimachinery/pkg/util/proxy" + auditinternal "k8s.io/apiserver/pkg/apis/audit" "k8s.io/apiserver/pkg/endpoints/handlers/responsewriters" endpointmetrics "k8s.io/apiserver/pkg/endpoints/metrics" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" @@ -210,6 +211,12 @@ func newRequestForProxy(location *url.URL, req *http.Request) (*http.Request, co newReq.URL = location newReq.Host = location.Host + // If the original request has an audit ID, let's make sure we propagate this + // to the aggregated server. + if auditID, found := genericapirequest.AuditIDFrom(req.Context()); found { + newReq.Header.Set(auditinternal.HeaderAuditID, string(auditID)) + } + return newReq, cancelFn } diff --git a/vendor/k8s.io/kube-aggregator/pkg/apiserver/scheme/BUILD b/vendor/k8s.io/kube-aggregator/pkg/apiserver/scheme/BUILD deleted file mode 100644 index fbd7456c5961..000000000000 --- a/vendor/k8s.io/kube-aggregator/pkg/apiserver/scheme/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["scheme.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kube-aggregator/pkg/apiserver/scheme", - importpath = "k8s.io/kube-aggregator/pkg/apiserver/scheme", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/install:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/BUILD b/vendor/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/BUILD deleted file mode 100644 index 78666b4dbbc8..000000000000 --- a/vendor/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "clientset.go", - "doc.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset", - importpath = "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset", - deps = [ - "//staging/src/k8s.io/client-go/discovery:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/typed/apiregistration/v1:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/typed/apiregistration/v1beta1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/fake:all-srcs", - "//staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme:all-srcs", - "//staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/typed/apiregistration/v1:all-srcs", - "//staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/typed/apiregistration/v1beta1:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme/BUILD b/vendor/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme/BUILD deleted file mode 100644 index f9d63d0c7260..000000000000 --- a/vendor/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme", - importpath = "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/typed/apiregistration/v1/BUILD b/vendor/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/typed/apiregistration/v1/BUILD deleted file mode 100644 index b449581ccdb2..000000000000 --- a/vendor/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/typed/apiregistration/v1/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "apiregistration_client.go", - "apiservice.go", - "doc.go", - "generated_expansion.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/typed/apiregistration/v1", - importpath = "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/typed/apiregistration/v1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/typed/apiregistration/v1/fake:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/typed/apiregistration/v1beta1/BUILD b/vendor/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/typed/apiregistration/v1beta1/BUILD deleted file mode 100644 index 790655d71ecd..000000000000 --- a/vendor/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/typed/apiregistration/v1beta1/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "apiregistration_client.go", - "apiservice.go", - "doc.go", - "generated_expansion.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/typed/apiregistration/v1beta1", - importpath = "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/typed/apiregistration/v1beta1", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/typed/apiregistration/v1beta1/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kube-aggregator/pkg/client/informers/externalversions/BUILD b/vendor/k8s.io/kube-aggregator/pkg/client/informers/externalversions/BUILD deleted file mode 100644 index c1e7698d161e..000000000000 --- a/vendor/k8s.io/kube-aggregator/pkg/client/informers/externalversions/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "factory.go", - "generic.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kube-aggregator/pkg/client/informers/externalversions", - importpath = "k8s.io/kube-aggregator/pkg/client/informers/externalversions", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/client/informers/externalversions/apiregistration:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/client/informers/externalversions/internalinterfaces:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/kube-aggregator/pkg/client/informers/externalversions/apiregistration:all-srcs", - "//staging/src/k8s.io/kube-aggregator/pkg/client/informers/externalversions/internalinterfaces:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kube-aggregator/pkg/client/informers/externalversions/apiregistration/BUILD b/vendor/k8s.io/kube-aggregator/pkg/client/informers/externalversions/apiregistration/BUILD deleted file mode 100644 index f7130b5ad971..000000000000 --- a/vendor/k8s.io/kube-aggregator/pkg/client/informers/externalversions/apiregistration/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["interface.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kube-aggregator/pkg/client/informers/externalversions/apiregistration", - importpath = "k8s.io/kube-aggregator/pkg/client/informers/externalversions/apiregistration", - deps = [ - "//staging/src/k8s.io/kube-aggregator/pkg/client/informers/externalversions/apiregistration/v1:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/client/informers/externalversions/apiregistration/v1beta1:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/client/informers/externalversions/internalinterfaces:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/kube-aggregator/pkg/client/informers/externalversions/apiregistration/v1:all-srcs", - "//staging/src/k8s.io/kube-aggregator/pkg/client/informers/externalversions/apiregistration/v1beta1:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kube-aggregator/pkg/client/informers/externalversions/apiregistration/v1/BUILD b/vendor/k8s.io/kube-aggregator/pkg/client/informers/externalversions/apiregistration/v1/BUILD deleted file mode 100644 index be2e12262a48..000000000000 --- a/vendor/k8s.io/kube-aggregator/pkg/client/informers/externalversions/apiregistration/v1/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "apiservice.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kube-aggregator/pkg/client/informers/externalversions/apiregistration/v1", - importpath = "k8s.io/kube-aggregator/pkg/client/informers/externalversions/apiregistration/v1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/client/informers/externalversions/internalinterfaces:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/client/listers/apiregistration/v1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kube-aggregator/pkg/client/informers/externalversions/apiregistration/v1beta1/BUILD b/vendor/k8s.io/kube-aggregator/pkg/client/informers/externalversions/apiregistration/v1beta1/BUILD deleted file mode 100644 index cfd20226132b..000000000000 --- a/vendor/k8s.io/kube-aggregator/pkg/client/informers/externalversions/apiregistration/v1beta1/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "apiservice.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kube-aggregator/pkg/client/informers/externalversions/apiregistration/v1beta1", - importpath = "k8s.io/kube-aggregator/pkg/client/informers/externalversions/apiregistration/v1beta1", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/client/informers/externalversions/internalinterfaces:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/client/listers/apiregistration/v1beta1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kube-aggregator/pkg/client/informers/externalversions/internalinterfaces/BUILD b/vendor/k8s.io/kube-aggregator/pkg/client/informers/externalversions/internalinterfaces/BUILD deleted file mode 100644 index f38dd81dfb08..000000000000 --- a/vendor/k8s.io/kube-aggregator/pkg/client/informers/externalversions/internalinterfaces/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["factory_interfaces.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kube-aggregator/pkg/client/informers/externalversions/internalinterfaces", - importpath = "k8s.io/kube-aggregator/pkg/client/informers/externalversions/internalinterfaces", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kube-aggregator/pkg/client/listers/apiregistration/v1/BUILD b/vendor/k8s.io/kube-aggregator/pkg/client/listers/apiregistration/v1/BUILD deleted file mode 100644 index 8f2991a5c9d8..000000000000 --- a/vendor/k8s.io/kube-aggregator/pkg/client/listers/apiregistration/v1/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "apiservice.go", - "expansion_generated.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kube-aggregator/pkg/client/listers/apiregistration/v1", - importpath = "k8s.io/kube-aggregator/pkg/client/listers/apiregistration/v1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kube-aggregator/pkg/client/listers/apiregistration/v1beta1/BUILD b/vendor/k8s.io/kube-aggregator/pkg/client/listers/apiregistration/v1beta1/BUILD deleted file mode 100644 index 78a1fd7b2c1b..000000000000 --- a/vendor/k8s.io/kube-aggregator/pkg/client/listers/apiregistration/v1beta1/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "apiservice.go", - "expansion_generated.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kube-aggregator/pkg/client/listers/apiregistration/v1beta1", - importpath = "k8s.io/kube-aggregator/pkg/client/listers/apiregistration/v1beta1", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kube-aggregator/pkg/controllers/BUILD b/vendor/k8s.io/kube-aggregator/pkg/controllers/BUILD deleted file mode 100644 index 9d1ddcfabca7..000000000000 --- a/vendor/k8s.io/kube-aggregator/pkg/controllers/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["cache.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kube-aggregator/pkg/controllers", - importpath = "k8s.io/kube-aggregator/pkg/controllers", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/kube-aggregator/pkg/controllers/autoregister:all-srcs", - "//staging/src/k8s.io/kube-aggregator/pkg/controllers/openapi:all-srcs", - "//staging/src/k8s.io/kube-aggregator/pkg/controllers/status:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kube-aggregator/pkg/controllers/autoregister/BUILD b/vendor/k8s.io/kube-aggregator/pkg/controllers/autoregister/BUILD deleted file mode 100644 index 71e528341551..000000000000 --- a/vendor/k8s.io/kube-aggregator/pkg/controllers/autoregister/BUILD +++ /dev/null @@ -1,57 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["autoregister_controller_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/util/workqueue:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/fake:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/client/listers/apiregistration/v1:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["autoregister_controller.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kube-aggregator/pkg/controllers/autoregister", - importpath = "k8s.io/kube-aggregator/pkg/controllers/autoregister", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/util/workqueue:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/typed/apiregistration/v1:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/client/informers/externalversions/apiregistration/v1:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/client/listers/apiregistration/v1:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/controllers:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kube-aggregator/pkg/controllers/autoregister/autoregister_controller.go b/vendor/k8s.io/kube-aggregator/pkg/controllers/autoregister/autoregister_controller.go index 5704656b645b..6efad8da9aeb 100644 --- a/vendor/k8s.io/kube-aggregator/pkg/controllers/autoregister/autoregister_controller.go +++ b/vendor/k8s.io/kube-aggregator/pkg/controllers/autoregister/autoregister_controller.go @@ -138,8 +138,8 @@ func (c *autoRegisterController) Run(threadiness int, stopCh <-chan struct{}) { // make sure the work queue is shutdown which will trigger workers to end defer c.queue.ShutDown() - klog.Infof("Starting autoregister controller") - defer klog.Infof("Shutting down autoregister controller") + klog.Info("Starting autoregister controller") + defer klog.Info("Shutting down autoregister controller") // wait for your secondary caches to fill before starting your work if !controllers.WaitForCacheSync("autoregister", stopCh, c.apiServiceSynced) { diff --git a/vendor/k8s.io/kube-aggregator/pkg/controllers/openapi/BUILD b/vendor/k8s.io/kube-aggregator/pkg/controllers/openapi/BUILD deleted file mode 100644 index 3f382183b8c8..000000000000 --- a/vendor/k8s.io/kube-aggregator/pkg/controllers/openapi/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["controller.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kube-aggregator/pkg/controllers/openapi", - importpath = "k8s.io/kube-aggregator/pkg/controllers/openapi", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/util/workqueue:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/controllers/openapi/aggregator:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/kube-aggregator/pkg/controllers/openapi/aggregator:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kube-aggregator/pkg/controllers/openapi/aggregator/BUILD b/vendor/k8s.io/kube-aggregator/pkg/controllers/openapi/aggregator/BUILD deleted file mode 100644 index fd60a11fb730..000000000000 --- a/vendor/k8s.io/kube-aggregator/pkg/controllers/openapi/aggregator/BUILD +++ /dev/null @@ -1,58 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "aggregator.go", - "downloader.go", - "metrics.go", - "priority.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kube-aggregator/pkg/controllers/openapi/aggregator", - importpath = "k8s.io/kube-aggregator/pkg/controllers/openapi/aggregator", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1:go_default_library", - "//vendor/github.com/emicklei/go-restful:go_default_library", - "//vendor/github.com/go-openapi/spec:go_default_library", - "//vendor/github.com/json-iterator/go:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/aggregator:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/builder:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/common:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/handler:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "downloader_test.go", - "priority_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1:go_default_library", - "//vendor/github.com/go-openapi/spec:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kube-aggregator/pkg/controllers/openapi/controller.go b/vendor/k8s.io/kube-aggregator/pkg/controllers/openapi/controller.go index e61a27358625..98e6ecc6dad6 100644 --- a/vendor/k8s.io/kube-aggregator/pkg/controllers/openapi/controller.go +++ b/vendor/k8s.io/kube-aggregator/pkg/controllers/openapi/controller.go @@ -80,8 +80,8 @@ func (c *AggregationController) Run(stopCh <-chan struct{}) { defer utilruntime.HandleCrash() defer c.queue.ShutDown() - klog.Infof("Starting OpenAPI AggregationController") - defer klog.Infof("Shutting down OpenAPI AggregationController") + klog.Info("Starting OpenAPI AggregationController") + defer klog.Info("Shutting down OpenAPI AggregationController") go wait.Until(c.runWorker, time.Second, stopCh) diff --git a/vendor/k8s.io/kube-aggregator/pkg/controllers/status/BUILD b/vendor/k8s.io/kube-aggregator/pkg/controllers/status/BUILD deleted file mode 100644 index 6a3197382f09..000000000000 --- a/vendor/k8s.io/kube-aggregator/pkg/controllers/status/BUILD +++ /dev/null @@ -1,78 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "available_controller.go", - "metrics.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kube-aggregator/pkg/controllers/status", - importpath = "k8s.io/kube-aggregator/pkg/controllers/status", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/egressselector:go_default_library", - "//staging/src/k8s.io/client-go/informers/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/transport:go_default_library", - "//staging/src/k8s.io/client-go/util/workqueue:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1/helper:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/typed/apiregistration/v1:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/client/informers/externalversions/apiregistration/v1:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/client/listers/apiregistration/v1:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/controllers:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "available_controller_test.go", - "metrics_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/util/workqueue:go_default_library", - "//staging/src/k8s.io/component-base/metrics/testutil:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/fake:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/typed/apiregistration/v1:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/client/listers/apiregistration/v1:go_default_library", - "//vendor/github.com/davecgh/go-spew/spew:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kube-aggregator/pkg/controllers/status/available_controller.go b/vendor/k8s.io/kube-aggregator/pkg/controllers/status/available_controller.go index 5d91c85fa66f..2b112b23dfb4 100644 --- a/vendor/k8s.io/kube-aggregator/pkg/controllers/status/available_controller.go +++ b/vendor/k8s.io/kube-aggregator/pkg/controllers/status/available_controller.go @@ -472,8 +472,8 @@ func (c *AvailableConditionController) Run(threadiness int, stopCh <-chan struct defer utilruntime.HandleCrash() defer c.queue.ShutDown() - klog.Infof("Starting AvailableConditionController") - defer klog.Infof("Shutting down AvailableConditionController") + klog.Info("Starting AvailableConditionController") + defer klog.Info("Shutting down AvailableConditionController") if !controllers.WaitForCacheSync("AvailableConditionController", stopCh, c.apiServiceSynced, c.servicesSynced, c.endpointsSynced) { return diff --git a/vendor/k8s.io/kube-aggregator/pkg/controllers/status/metrics.go b/vendor/k8s.io/kube-aggregator/pkg/controllers/status/metrics.go index 524a8edb9aa9..fe91f348cad8 100644 --- a/vendor/k8s.io/kube-aggregator/pkg/controllers/status/metrics.go +++ b/vendor/k8s.io/kube-aggregator/pkg/controllers/status/metrics.go @@ -24,7 +24,7 @@ import ( /* * By default, all the following metrics are defined as falling under - * ALPHA stability level https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/20190404-kubernetes-control-plane-metrics-stability.md#stability-classes) + * ALPHA stability level https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/1209-metrics-stability/20190404-kubernetes-control-plane-metrics-stability.md#stability-classes) * * Promoting the stability level of the metric is a responsibility of the component owner, since it * involves explicitly acknowledging support for the metric across multiple releases, in accordance with diff --git a/vendor/k8s.io/kube-aggregator/pkg/registry/apiservice/BUILD b/vendor/k8s.io/kube-aggregator/pkg/registry/apiservice/BUILD deleted file mode 100644 index 8cd7fac7d8e3..000000000000 --- a/vendor/k8s.io/kube-aggregator/pkg/registry/apiservice/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["strategy.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kube-aggregator/pkg/registry/apiservice", - importpath = "k8s.io/kube-aggregator/pkg/registry/apiservice", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/validation:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/kube-aggregator/pkg/registry/apiservice/etcd:all-srcs", - "//staging/src/k8s.io/kube-aggregator/pkg/registry/apiservice/rest:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kube-aggregator/pkg/registry/apiservice/etcd/BUILD b/vendor/k8s.io/kube-aggregator/pkg/registry/apiservice/etcd/BUILD deleted file mode 100644 index d6726b73ea7f..000000000000 --- a/vendor/k8s.io/kube-aggregator/pkg/registry/apiservice/etcd/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["etcd.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kube-aggregator/pkg/registry/apiservice/etcd", - importpath = "k8s.io/kube-aggregator/pkg/registry/apiservice/etcd", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta/table:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/registry/apiservice:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kube-aggregator/pkg/registry/apiservice/etcd/etcd.go b/vendor/k8s.io/kube-aggregator/pkg/registry/apiservice/etcd/etcd.go index 4fe241a5a3aa..0fdd1e971426 100644 --- a/vendor/k8s.io/kube-aggregator/pkg/registry/apiservice/etcd/etcd.go +++ b/vendor/k8s.io/kube-aggregator/pkg/registry/apiservice/etcd/etcd.go @@ -29,6 +29,7 @@ import ( "k8s.io/apiserver/pkg/registry/rest" "k8s.io/kube-aggregator/pkg/apis/apiregistration" "k8s.io/kube-aggregator/pkg/registry/apiservice" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // REST implements a RESTStorage for API services against etcd @@ -45,9 +46,10 @@ func NewREST(scheme *runtime.Scheme, optsGetter generic.RESTOptionsGetter) *REST PredicateFunc: apiservice.MatchAPIService, DefaultQualifiedResource: apiregistration.Resource("apiservices"), - CreateStrategy: strategy, - UpdateStrategy: strategy, - DeleteStrategy: strategy, + CreateStrategy: strategy, + UpdateStrategy: strategy, + DeleteStrategy: strategy, + ResetFieldsStrategy: strategy, // TODO: define table converter that exposes more than name/creation timestamp TableConvertor: rest.NewDefaultTableConvertor(apiregistration.Resource("apiservices")), @@ -126,10 +128,12 @@ func getCondition(conditions []apiregistration.APIServiceCondition, conditionTyp // NewStatusREST makes a RESTStorage for status that has more limited options. // It is based on the original REST so that we can share the same underlying store func NewStatusREST(scheme *runtime.Scheme, rest *REST) *StatusREST { + strategy := apiservice.NewStatusStrategy(scheme) statusStore := *rest.Store statusStore.CreateStrategy = nil statusStore.DeleteStrategy = nil - statusStore.UpdateStrategy = apiservice.NewStatusStrategy(scheme) + statusStore.UpdateStrategy = strategy + statusStore.ResetFieldsStrategy = strategy return &StatusREST{store: &statusStore} } @@ -156,3 +160,8 @@ func (r *StatusREST) Update(ctx context.Context, name string, objInfo rest.Updat // subresources should never allow create on update. return r.store.Update(ctx, name, objInfo, createValidation, updateValidation, false, options) } + +// GetResetFields implements rest.ResetFieldsStrategy +func (r *StatusREST) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + return r.store.GetResetFields() +} diff --git a/vendor/k8s.io/kube-aggregator/pkg/registry/apiservice/rest/BUILD b/vendor/k8s.io/kube-aggregator/pkg/registry/apiservice/rest/BUILD deleted file mode 100644 index 9597d580baf2..000000000000 --- a/vendor/k8s.io/kube-aggregator/pkg/registry/apiservice/rest/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["storage_apiservice.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kube-aggregator/pkg/registry/apiservice/rest", - importpath = "k8s.io/kube-aggregator/pkg/registry/apiservice/rest", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/storage:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apiserver/scheme:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/registry/apiservice/etcd:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kube-aggregator/pkg/registry/apiservice/rest/storage_apiservice.go b/vendor/k8s.io/kube-aggregator/pkg/registry/apiservice/rest/storage_apiservice.go index c10b5b233f4e..fc3fd6b2f1ac 100644 --- a/vendor/k8s.io/kube-aggregator/pkg/registry/apiservice/rest/storage_apiservice.go +++ b/vendor/k8s.io/kube-aggregator/pkg/registry/apiservice/rest/storage_apiservice.go @@ -24,17 +24,17 @@ import ( serverstorage "k8s.io/apiserver/pkg/server/storage" "k8s.io/kube-aggregator/pkg/apis/apiregistration" - "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1" + v1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1" "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1" aggregatorscheme "k8s.io/kube-aggregator/pkg/apiserver/scheme" apiservicestorage "k8s.io/kube-aggregator/pkg/registry/apiservice/etcd" ) // NewRESTStorage returns an APIGroupInfo object that will work against apiservice. -func NewRESTStorage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) genericapiserver.APIGroupInfo { +func NewRESTStorage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter, shouldServeBeta bool) genericapiserver.APIGroupInfo { apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(apiregistration.GroupName, aggregatorscheme.Scheme, metav1.ParameterCodec, aggregatorscheme.Codecs) - if apiResourceConfigSource.VersionEnabled(v1beta1.SchemeGroupVersion) { + if shouldServeBeta && apiResourceConfigSource.VersionEnabled(v1beta1.SchemeGroupVersion) { storage := map[string]rest.Storage{} apiServiceREST := apiservicestorage.NewREST(aggregatorscheme.Scheme, restOptionsGetter) storage["apiservices"] = apiServiceREST diff --git a/vendor/k8s.io/kube-aggregator/pkg/registry/apiservice/strategy.go b/vendor/k8s.io/kube-aggregator/pkg/registry/apiservice/strategy.go index d9bfe543e273..1818d503c914 100644 --- a/vendor/k8s.io/kube-aggregator/pkg/registry/apiservice/strategy.go +++ b/vendor/k8s.io/kube-aggregator/pkg/registry/apiservice/strategy.go @@ -31,6 +31,7 @@ import ( "k8s.io/kube-aggregator/pkg/apis/apiregistration" "k8s.io/kube-aggregator/pkg/apis/apiregistration/validation" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) type apiServerStrategy struct { @@ -40,9 +41,10 @@ type apiServerStrategy struct { // apiServerStrategy must implement rest.RESTCreateUpdateStrategy var _ rest.RESTCreateUpdateStrategy = apiServerStrategy{} +var Strategy = apiServerStrategy{} // NewStrategy creates a new apiServerStrategy. -func NewStrategy(typer runtime.ObjectTyper) rest.RESTCreateUpdateStrategy { +func NewStrategy(typer runtime.ObjectTyper) rest.CreateUpdateResetFieldsStrategy { return apiServerStrategy{typer, names.SimpleNameGenerator} } @@ -50,6 +52,19 @@ func (apiServerStrategy) NamespaceScoped() bool { return false } +func (apiServerStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + fields := map[fieldpath.APIVersion]*fieldpath.Set{ + "apiregistration.k8s.io/v1": fieldpath.NewSet( + fieldpath.MakePathOrDie("status"), + ), + "apiregistration.k8s.io/v1beta1": fieldpath.NewSet( + fieldpath.MakePathOrDie("status"), + ), + } + + return fields +} + func (apiServerStrategy) PrepareForCreate(ctx context.Context, obj runtime.Object) { apiservice := obj.(*apiregistration.APIService) apiservice.Status = apiregistration.APIServiceStatus{} @@ -91,7 +106,7 @@ type apiServerStatusStrategy struct { } // NewStatusStrategy creates a new apiServerStatusStrategy. -func NewStatusStrategy(typer runtime.ObjectTyper) rest.RESTUpdateStrategy { +func NewStatusStrategy(typer runtime.ObjectTyper) rest.UpdateResetFieldsStrategy { return apiServerStatusStrategy{typer, names.SimpleNameGenerator} } @@ -99,6 +114,21 @@ func (apiServerStatusStrategy) NamespaceScoped() bool { return false } +func (apiServerStatusStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + fields := map[fieldpath.APIVersion]*fieldpath.Set{ + "apiregistration.k8s.io/v1": fieldpath.NewSet( + fieldpath.MakePathOrDie("spec"), + fieldpath.MakePathOrDie("metadata"), + ), + "apiregistration.k8s.io/v1beta1": fieldpath.NewSet( + fieldpath.MakePathOrDie("spec"), + fieldpath.MakePathOrDie("metadata"), + ), + } + + return fields +} + func (apiServerStatusStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object) { newAPIService := obj.(*apiregistration.APIService) oldAPIService := old.(*apiregistration.APIService) diff --git a/vendor/k8s.io/kube-openapi/pkg/schemaconv/smd.go b/vendor/k8s.io/kube-openapi/pkg/schemaconv/smd.go index adc76f6c0cb0..99b33d34f2e5 100644 --- a/vendor/k8s.io/kube-openapi/pkg/schemaconv/smd.go +++ b/vendor/k8s.io/kube-openapi/pkg/schemaconv/smd.go @@ -27,6 +27,10 @@ import ( "sigs.k8s.io/structured-merge-diff/v4/schema" ) +const ( + quantityResource = "io.k8s.apimachinery.pkg.api.resource.Quantity" +) + // ToSchema converts openapi definitions into a schema suitable for structured // merge (i.e. kubectl apply v2). func ToSchema(models proto.Models) (*schema.Schema, error) { @@ -414,29 +418,33 @@ func ptr(s schema.Scalar) *schema.Scalar { return &s } func (c *convert) VisitPrimitive(p *proto.Primitive) { a := c.top() - switch p.Type { - case proto.Integer: - a.Scalar = ptr(schema.Numeric) - case proto.Number: - a.Scalar = ptr(schema.Numeric) - case proto.String: - switch p.Format { - case "": - a.Scalar = ptr(schema.String) - case "byte": - // byte really means []byte and is encoded as a string. - a.Scalar = ptr(schema.String) - case "int-or-string": - a.Scalar = ptr(schema.Scalar("untyped")) - case "date-time": - a.Scalar = ptr(schema.Scalar("untyped")) + if c.currentName == quantityResource { + a.Scalar = ptr(schema.Scalar("untyped")) + } else { + switch p.Type { + case proto.Integer: + a.Scalar = ptr(schema.Numeric) + case proto.Number: + a.Scalar = ptr(schema.Numeric) + case proto.String: + switch p.Format { + case "": + a.Scalar = ptr(schema.String) + case "byte": + // byte really means []byte and is encoded as a string. + a.Scalar = ptr(schema.String) + case "int-or-string": + a.Scalar = ptr(schema.Scalar("untyped")) + case "date-time": + a.Scalar = ptr(schema.Scalar("untyped")) + default: + a.Scalar = ptr(schema.Scalar("untyped")) + } + case proto.Boolean: + a.Scalar = ptr(schema.Boolean) default: a.Scalar = ptr(schema.Scalar("untyped")) } - case proto.Boolean: - a.Scalar = ptr(schema.Boolean) - default: - a.Scalar = ptr(schema.Scalar("untyped")) } } diff --git a/vendor/k8s.io/kube-openapi/pkg/util/util.go b/vendor/k8s.io/kube-openapi/pkg/util/util.go index 1eb674eea06d..0be06989e669 100644 --- a/vendor/k8s.io/kube-openapi/pkg/util/util.go +++ b/vendor/k8s.io/kube-openapi/pkg/util/util.go @@ -80,6 +80,9 @@ func ToRESTFriendlyName(name string) string { // Example for vendored Go type: // Original full path: k8s.io/kubernetes/vendor/k8s.io/api/core/v1.Pod // Canonical name: k8s.io/api/core/v1.Pod +// +// Original full path: vendor/k8s.io/api/core/v1.Pod +// Canonical name: k8s.io/api/core/v1.Pod type OpenAPICanonicalTypeNamer interface { OpenAPICanonicalTypeName() string } @@ -100,6 +103,8 @@ func GetCanonicalTypeName(model interface{}) string { path := t.PkgPath() if strings.Contains(path, "/vendor/") { path = path[strings.Index(path, "/vendor/")+len("/vendor/"):] + } else if strings.HasPrefix(path, "vendor/") { + path = strings.TrimPrefix(path, "vendor/") } return path + "." + t.Name() } diff --git a/vendor/k8s.io/kube-openapi/pkg/validation/validate/type.go b/vendor/k8s.io/kube-openapi/pkg/validation/validate/type.go index 5a9a8024546b..6469719dd676 100644 --- a/vendor/k8s.io/kube-openapi/pkg/validation/validate/type.go +++ b/vendor/k8s.io/kube-openapi/pkg/validation/validate/type.go @@ -132,7 +132,7 @@ func (t *typeValidator) Applies(source interface{}, kind reflect.Kind) bool { func (t *typeValidator) Validate(data interface{}) *Result { result := new(Result) result.Inc() - if data == nil || reflect.DeepEqual(reflect.Zero(reflect.TypeOf(data)), reflect.ValueOf(data)) { + if data == nil { // nil or zero value for the passed structure require Type: null if len(t.Type) > 0 && !t.Type.Contains(nullType) && !t.Nullable { // TODO: if a property is not required it also passes this return errorHelp.sErr(errors.InvalidType(t.Path, t.In, strings.Join(t.Type, ","), nullType)) diff --git a/vendor/k8s.io/kube-proxy/config/v1alpha1/BUILD b/vendor/k8s.io/kube-proxy/config/v1alpha1/BUILD deleted file mode 100644 index f290c33f0eba..000000000000 --- a/vendor/k8s.io/kube-proxy/config/v1alpha1/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kube-proxy/config/v1alpha1", - importpath = "k8s.io/kube-proxy/config/v1alpha1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/component-base/config/v1alpha1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["register_test.go"], - embed = [":go_default_library"], - deps = ["//staging/src/k8s.io/component-base/config/testing:go_default_library"], -) diff --git a/vendor/k8s.io/kube-scheduler/extender/v1/BUILD b/vendor/k8s.io/kube-scheduler/extender/v1/BUILD deleted file mode 100644 index dd3ce8195cd1..000000000000 --- a/vendor/k8s.io/kube-scheduler/extender/v1/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kube-scheduler/extender/v1", - importpath = "k8s.io/kube-scheduler/extender/v1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["types_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/github.com/google/go-cmp/cmp:go_default_library", - ], -) diff --git a/vendor/k8s.io/kube-scheduler/extender/v1/types.go b/vendor/k8s.io/kube-scheduler/extender/v1/types.go index 4557c8fd011e..e1f07c3dd7cc 100644 --- a/vendor/k8s.io/kube-scheduler/extender/v1/types.go +++ b/vendor/k8s.io/kube-scheduler/extender/v1/types.go @@ -92,6 +92,10 @@ type ExtenderFilterResult struct { NodeNames *[]string // Filtered out nodes where the pod can't be scheduled and the failure messages FailedNodes FailedNodesMap + // Filtered out nodes where the pod can't be scheduled and preemption would + // not change anything. The value is the failure message same as FailedNodes. + // Nodes specified here takes precedence over FailedNodes. + FailedAndUnresolvableNodes FailedNodesMap // Error message indicating failure Error string } diff --git a/vendor/k8s.io/kube-scheduler/extender/v1/zz_generated.deepcopy.go b/vendor/k8s.io/kube-scheduler/extender/v1/zz_generated.deepcopy.go index e568fe00a786..e20422644117 100644 --- a/vendor/k8s.io/kube-scheduler/extender/v1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/kube-scheduler/extender/v1/zz_generated.deepcopy.go @@ -115,6 +115,13 @@ func (in *ExtenderFilterResult) DeepCopyInto(out *ExtenderFilterResult) { (*out)[key] = val } } + if in.FailedAndUnresolvableNodes != nil { + in, out := &in.FailedAndUnresolvableNodes, &out.FailedAndUnresolvableNodes + *out = make(FailedNodesMap, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } return } diff --git a/vendor/k8s.io/kubectl/pkg/apps/BUILD b/vendor/k8s.io/kubectl/pkg/apps/BUILD deleted file mode 100644 index d59d553c41bd..000000000000 --- a/vendor/k8s.io/kubectl/pkg/apps/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["kind_visitor.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/apps", - importpath = "k8s.io/kubectl/pkg/apps", - visibility = ["//visibility:public"], - deps = ["//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library"], -) - -go_test( - name = "go_default_test", - srcs = [ - "apps_suite_test.go", - "kind_visitor_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//vendor/github.com/onsi/ginkgo:go_default_library", - "//vendor/github.com/onsi/ginkgo/config:go_default_library", - "//vendor/github.com/onsi/ginkgo/types:go_default_library", - "//vendor/github.com/onsi/gomega:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubectl/pkg/cmd/util/BUILD b/vendor/k8s.io/kubectl/pkg/cmd/util/BUILD deleted file mode 100644 index 626f61294488..000000000000 --- a/vendor/k8s.io/kubectl/pkg/cmd/util/BUILD +++ /dev/null @@ -1,82 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "factory.go", - "factory_client_access.go", - "helpers.go", - "kubectl_match_version.go", - "printing.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/cmd/util", - importpath = "k8s.io/kubectl/pkg/cmd/util", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/yaml:go_default_library", - "//staging/src/k8s.io/cli-runtime/pkg/genericclioptions:go_default_library", - "//staging/src/k8s.io/cli-runtime/pkg/resource:go_default_library", - "//staging/src/k8s.io/client-go/discovery:go_default_library", - "//staging/src/k8s.io/client-go/dynamic:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/scale:go_default_library", - "//staging/src/k8s.io/client-go/tools/clientcmd:go_default_library", - "//staging/src/k8s.io/component-base/version:go_default_library", - "//staging/src/k8s.io/kubectl/pkg/scheme:go_default_library", - "//staging/src/k8s.io/kubectl/pkg/util/openapi:go_default_library", - "//staging/src/k8s.io/kubectl/pkg/util/openapi/validation:go_default_library", - "//staging/src/k8s.io/kubectl/pkg/util/templates:go_default_library", - "//staging/src/k8s.io/kubectl/pkg/validation:go_default_library", - "//vendor/github.com/evanphx/json-patch:go_default_library", - "//vendor/github.com/spf13/cobra:go_default_library", - "//vendor/github.com/spf13/pflag:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["helpers_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/kubectl/pkg/scheme:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/kubectl/pkg/cmd/util/editor:all-srcs", - "//staging/src/k8s.io/kubectl/pkg/cmd/util/sanity:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubectl/pkg/cmd/util/env_file.go b/vendor/k8s.io/kubectl/pkg/cmd/util/env_file.go new file mode 100644 index 000000000000..ed1255839ed6 --- /dev/null +++ b/vendor/k8s.io/kubectl/pkg/cmd/util/env_file.go @@ -0,0 +1,103 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package util + +import ( + "bufio" + "bytes" + "fmt" + "os" + "strings" + "unicode" + "unicode/utf8" + + "k8s.io/apimachinery/pkg/util/validation" +) + +var utf8bom = []byte{0xEF, 0xBB, 0xBF} + +// processEnvFileLine returns a blank key if the line is empty or a comment. +// The value will be retrieved from the environment if necessary. +func processEnvFileLine(line []byte, filePath string, + currentLine int) (key, value string, err error) { + + if !utf8.Valid(line) { + return ``, ``, fmt.Errorf("env file %s contains invalid utf8 bytes at line %d: %v", + filePath, currentLine+1, line) + } + + // We trim UTF8 BOM from the first line of the file but no others + if currentLine == 0 { + line = bytes.TrimPrefix(line, utf8bom) + } + + // trim the line from all leading whitespace first + line = bytes.TrimLeftFunc(line, unicode.IsSpace) + + // If the line is empty or a comment, we return a blank key/value pair. + if len(line) == 0 || line[0] == '#' { + return ``, ``, nil + } + + data := strings.SplitN(string(line), "=", 2) + key = data[0] + if errs := validation.IsEnvVarName(key); len(errs) != 0 { + return ``, ``, fmt.Errorf("%q is not a valid key name: %s", key, strings.Join(errs, ";")) + } + + if len(data) == 2 { + value = data[1] + } else { + // No value (no `=` in the line) is a signal to obtain the value + // from the environment. + value = os.Getenv(key) + } + return +} + +// AddFromEnvFile processes an env file allows a generic addTo to handle the +// collection of key value pairs or returns an error. +func AddFromEnvFile(filePath string, addTo func(key, value string) error) error { + f, err := os.Open(filePath) + if err != nil { + return err + } + defer f.Close() + + scanner := bufio.NewScanner(f) + currentLine := 0 + for scanner.Scan() { + // Process the current line, retrieving a key/value pair if + // possible. + scannedBytes := scanner.Bytes() + key, value, err := processEnvFileLine(scannedBytes, filePath, currentLine) + if err != nil { + return err + } + currentLine++ + + if len(key) == 0 { + // no key means line was empty or a comment + continue + } + + if err = addTo(key, value); err != nil { + return err + } + } + return nil +} diff --git a/vendor/k8s.io/kubectl/pkg/cmd/util/factory.go b/vendor/k8s.io/kubectl/pkg/cmd/util/factory.go index d9df0bf3b519..9235b4b0ab3a 100644 --- a/vendor/k8s.io/kubectl/pkg/cmd/util/factory.go +++ b/vendor/k8s.io/kubectl/pkg/cmd/util/factory.go @@ -20,6 +20,7 @@ import ( "k8s.io/apimachinery/pkg/api/meta" "k8s.io/cli-runtime/pkg/genericclioptions" "k8s.io/cli-runtime/pkg/resource" + "k8s.io/client-go/discovery" "k8s.io/client-go/dynamic" "k8s.io/client-go/kubernetes" restclient "k8s.io/client-go/rest" @@ -61,6 +62,8 @@ type Factory interface { // Returns a schema that can validate objects stored on disk. Validator(validate bool) (validation.Schema, error) - // OpenAPISchema returns the schema openapi schema definition + // OpenAPISchema returns the parsed openapi schema definition OpenAPISchema() (openapi.Resources, error) + // OpenAPIGetter returns a getter for the openapi schema document + OpenAPIGetter() discovery.OpenAPISchemaInterface } diff --git a/vendor/k8s.io/kubectl/pkg/cmd/util/factory_client_access.go b/vendor/k8s.io/kubectl/pkg/cmd/util/factory_client_access.go index e4cf2da07349..2b9074cbac83 100644 --- a/vendor/k8s.io/kubectl/pkg/cmd/util/factory_client_access.go +++ b/vendor/k8s.io/kubectl/pkg/cmd/util/factory_client_access.go @@ -19,6 +19,7 @@ limitations under the License. package util import ( + "errors" "sync" corev1 "k8s.io/api/core/v1" @@ -38,20 +39,17 @@ import ( type factoryImpl struct { clientGetter genericclioptions.RESTClientGetter - // openAPIGetter loads and caches openapi specs - openAPIGetter openAPIGetter -} - -type openAPIGetter struct { - once sync.Once - getter openapi.Getter + // Caches OpenAPI document and parsed resources + openAPIParser *openapi.CachedOpenAPIParser + openAPIGetter *openapi.CachedOpenAPIGetter + parser sync.Once + getter sync.Once } func NewFactory(clientGetter genericclioptions.RESTClientGetter) Factory { if clientGetter == nil { panic("attempt to instantiate client_access_factory with nil clientGetter") } - f := &factoryImpl{ clientGetter: clientGetter, } @@ -159,19 +157,32 @@ func (f *factoryImpl) Validator(validate bool) (validation.Schema, error) { }, nil } -// OpenAPISchema returns metadata and structural information about Kubernetes object definitions. +// OpenAPISchema returns metadata and structural information about +// Kubernetes object definitions. func (f *factoryImpl) OpenAPISchema() (openapi.Resources, error) { + openAPIGetter := f.OpenAPIGetter() + if openAPIGetter == nil { + return nil, errors.New("no openapi getter") + } + + // Lazily initialize the OpenAPIParser once + f.parser.Do(func() { + // Create the caching OpenAPIParser + f.openAPIParser = openapi.NewOpenAPIParser(f.OpenAPIGetter()) + }) + + // Delegate to the OpenAPIPArser + return f.openAPIParser.Parse() +} + +func (f *factoryImpl) OpenAPIGetter() discovery.OpenAPISchemaInterface { discovery, err := f.clientGetter.ToDiscoveryClient() if err != nil { - return nil, err + return nil } - - // Lazily initialize the OpenAPIGetter once - f.openAPIGetter.once.Do(func() { - // Create the caching OpenAPIGetter - f.openAPIGetter.getter = openapi.NewOpenAPIGetter(discovery) + f.getter.Do(func() { + f.openAPIGetter = openapi.NewOpenAPIGetter(discovery) }) - // Delegate to the OpenAPIGetter - return f.openAPIGetter.getter.Get() + return f.openAPIGetter } diff --git a/vendor/k8s.io/kubectl/pkg/cmd/util/helpers.go b/vendor/k8s.io/kubectl/pkg/cmd/util/helpers.go index a6bfdd80afd2..8f74d66b8a68 100644 --- a/vendor/k8s.io/kubectl/pkg/cmd/util/helpers.go +++ b/vendor/k8s.io/kubectl/pkg/cmd/util/helpers.go @@ -434,6 +434,10 @@ func AddFieldManagerFlagVar(cmd *cobra.Command, p *string, defaultFieldManager s cmd.Flags().StringVar(p, "field-manager", defaultFieldManager, "Name of the manager used to track field ownership.") } +func AddContainerVarFlags(cmd *cobra.Command, p *string, containerName string) { + cmd.Flags().StringVarP(p, "container", "c", containerName, "Container name. If omitted, use the kubectl.kubernetes.io/default-container annotation for selecting the container to be attached or the first container in the pod will be chosen") +} + func AddServerSideApplyFlags(cmd *cobra.Command) { cmd.Flags().Bool("server-side", false, "If true, apply runs in the server instead of the client.") cmd.Flags().Bool("force-conflicts", false, "If true, server-side apply will force the changes against conflicts.") diff --git a/vendor/k8s.io/kubectl/pkg/cmd/util/podcmd/podcmd.go b/vendor/k8s.io/kubectl/pkg/cmd/util/podcmd/podcmd.go new file mode 100644 index 000000000000..1c4644193646 --- /dev/null +++ b/vendor/k8s.io/kubectl/pkg/cmd/util/podcmd/podcmd.go @@ -0,0 +1,104 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package podcmd + +import ( + "fmt" + "io" + "strings" + + v1 "k8s.io/api/core/v1" + "k8s.io/klog/v2" +) + +// DefaultContainerAnnotationName is an annotation name that can be used to preselect the interesting container +// from a pod when running kubectl. +const DefaultContainerAnnotationName = "kubectl.kubernetes.io/default-container" + +// FindContainerByName selects the named container from the spec of +// the provided pod or return nil if no such container exists. +func FindContainerByName(pod *v1.Pod, name string) (*v1.Container, string) { + for i := range pod.Spec.Containers { + if pod.Spec.Containers[i].Name == name { + return &pod.Spec.Containers[i], fmt.Sprintf("spec.containers{%s}", name) + } + } + for i := range pod.Spec.InitContainers { + if pod.Spec.InitContainers[i].Name == name { + return &pod.Spec.InitContainers[i], fmt.Sprintf("spec.initContainers{%s}", name) + } + } + for i := range pod.Spec.EphemeralContainers { + if pod.Spec.EphemeralContainers[i].Name == name { + return (*v1.Container)(&pod.Spec.EphemeralContainers[i].EphemeralContainerCommon), fmt.Sprintf("spec.ephemeralContainers{%s}", name) + } + } + return nil, "" +} + +// FindOrDefaultContainerByName defaults a container for a pod to the first container if any +// exists, or returns an error. It will print a message to the user indicating a default was +// selected if there was more than one container. +func FindOrDefaultContainerByName(pod *v1.Pod, name string, quiet bool, warn io.Writer) (*v1.Container, error) { + var container *v1.Container + + if len(name) > 0 { + container, _ = FindContainerByName(pod, name) + if container == nil { + return nil, fmt.Errorf("container %s not found in pod %s", name, pod.Name) + } + return container, nil + } + + // this should never happen, but just in case + if len(pod.Spec.Containers) == 0 { + return nil, fmt.Errorf("pod %s/%s does not have any containers", pod.Namespace, pod.Name) + } + + // read the default container the annotation as per + // https://github.com/kubernetes/enhancements/tree/master/keps/sig-cli/2227-kubectl-default-container + if name := pod.Annotations[DefaultContainerAnnotationName]; len(name) > 0 { + if container, _ = FindContainerByName(pod, name); container != nil { + klog.V(4).Infof("Defaulting container name from annotation %s", container.Name) + return container, nil + } + klog.V(4).Infof("Default container name from annotation %s was not found in the pod", name) + } + + // pick the first container as per existing behavior + container = &pod.Spec.Containers[0] + if !quiet && (len(pod.Spec.Containers) > 1 || len(pod.Spec.InitContainers) > 0 || len(pod.Spec.EphemeralContainers) > 0) { + fmt.Fprintf(warn, "Defaulted container %q out of: %s\n", container.Name, allContainerNames(pod)) + } + + klog.V(4).Infof("Defaulting container name to %s", container.Name) + return &pod.Spec.Containers[0], nil +} + +func allContainerNames(pod *v1.Pod) string { + var containers []string + for _, container := range pod.Spec.Containers { + containers = append(containers, container.Name) + } + for _, container := range pod.Spec.EphemeralContainers { + containers = append(containers, fmt.Sprintf("%s (ephem)", container.Name)) + } + for _, container := range pod.Spec.InitContainers { + containers = append(containers, fmt.Sprintf("%s (init)", container.Name)) + } + return strings.Join(containers, ", ") +} diff --git a/vendor/k8s.io/kubectl/pkg/describe/BUILD b/vendor/k8s.io/kubectl/pkg/describe/BUILD deleted file mode 100644 index df132947f87f..000000000000 --- a/vendor/k8s.io/kubectl/pkg/describe/BUILD +++ /dev/null @@ -1,100 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "describe.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/describe", - importpath = "k8s.io/kubectl/pkg/describe", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", - "//staging/src/k8s.io/api/autoscaling/v2beta2:go_default_library", - "//staging/src/k8s.io/api/batch/v1:go_default_library", - "//staging/src/k8s.io/api/batch/v1beta1:go_default_library", - "//staging/src/k8s.io/api/certificates/v1beta1:go_default_library", - "//staging/src/k8s.io/api/coordination/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/discovery/v1beta1:go_default_library", - "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", - "//staging/src/k8s.io/api/networking/v1:go_default_library", - "//staging/src/k8s.io/api/networking/v1beta1:go_default_library", - "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/api/rbac/v1:go_default_library", - "//staging/src/k8s.io/api/scheduling/v1:go_default_library", - "//staging/src/k8s.io/api/storage/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/duration:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/cli-runtime/pkg/genericclioptions:go_default_library", - "//staging/src/k8s.io/client-go/dynamic:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/tools/reference:go_default_library", - "//staging/src/k8s.io/kubectl/pkg/scheme:go_default_library", - "//staging/src/k8s.io/kubectl/pkg/util/certificate:go_default_library", - "//staging/src/k8s.io/kubectl/pkg/util/deployment:go_default_library", - "//staging/src/k8s.io/kubectl/pkg/util/event:go_default_library", - "//staging/src/k8s.io/kubectl/pkg/util/fieldpath:go_default_library", - "//staging/src/k8s.io/kubectl/pkg/util/qos:go_default_library", - "//staging/src/k8s.io/kubectl/pkg/util/rbac:go_default_library", - "//staging/src/k8s.io/kubectl/pkg/util/resource:go_default_library", - "//staging/src/k8s.io/kubectl/pkg/util/slice:go_default_library", - "//staging/src/k8s.io/kubectl/pkg/util/storage:go_default_library", - "//vendor/github.com/fatih/camelcase:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["describe_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", - "//staging/src/k8s.io/api/autoscaling/v2beta2:go_default_library", - "//staging/src/k8s.io/api/batch/v1:go_default_library", - "//staging/src/k8s.io/api/coordination/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/discovery/v1beta1:go_default_library", - "//staging/src/k8s.io/api/networking/v1:go_default_library", - "//staging/src/k8s.io/api/networking/v1beta1:go_default_library", - "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/api/storage/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubectl/pkg/describe/describe.go b/vendor/k8s.io/kubectl/pkg/describe/describe.go index ba59c1916774..b40a9b6b1c22 100644 --- a/vendor/k8s.io/kubectl/pkg/describe/describe.go +++ b/vendor/k8s.io/kubectl/pkg/describe/describe.go @@ -42,15 +42,18 @@ import ( certificatesv1beta1 "k8s.io/api/certificates/v1beta1" coordinationv1 "k8s.io/api/coordination/v1" corev1 "k8s.io/api/core/v1" + discoveryv1 "k8s.io/api/discovery/v1" discoveryv1beta1 "k8s.io/api/discovery/v1beta1" extensionsv1beta1 "k8s.io/api/extensions/v1beta1" networkingv1 "k8s.io/api/networking/v1" networkingv1beta1 "k8s.io/api/networking/v1beta1" + policyv1 "k8s.io/api/policy/v1" policyv1beta1 "k8s.io/api/policy/v1beta1" rbacv1 "k8s.io/api/rbac/v1" schedulingv1 "k8s.io/api/scheduling/v1" storagev1 "k8s.io/api/storage/v1" "k8s.io/apimachinery/pkg/api/errors" + apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -200,6 +203,7 @@ func describerMap(clientConfig *rest.Config) (map[schema.GroupKind]ResourceDescr {Group: corev1.GroupName, Kind: "ConfigMap"}: &ConfigMapDescriber{c}, {Group: corev1.GroupName, Kind: "PriorityClass"}: &PriorityClassDescriber{c}, {Group: discoveryv1beta1.GroupName, Kind: "EndpointSlice"}: &EndpointSliceDescriber{c}, + {Group: discoveryv1.GroupName, Kind: "EndpointSlice"}: &EndpointSliceDescriber{c}, {Group: extensionsv1beta1.GroupName, Kind: "ReplicaSet"}: &ReplicaSetDescriber{c}, {Group: extensionsv1beta1.GroupName, Kind: "NetworkPolicy"}: &NetworkPolicyDescriber{c}, {Group: extensionsv1beta1.GroupName, Kind: "PodSecurityPolicy"}: &PodSecurityPolicyDescriber{c}, @@ -213,6 +217,7 @@ func describerMap(clientConfig *rest.Config) (map[schema.GroupKind]ResourceDescr {Group: networkingv1.GroupName, Kind: "IngressClass"}: &IngressClassDescriber{c}, {Group: batchv1.GroupName, Kind: "Job"}: &JobDescriber{c}, {Group: batchv1.GroupName, Kind: "CronJob"}: &CronJobDescriber{c}, + {Group: batchv1beta1.GroupName, Kind: "CronJob"}: &CronJobDescriber{c}, {Group: appsv1.GroupName, Kind: "StatefulSet"}: &StatefulSetDescriber{c}, {Group: appsv1.GroupName, Kind: "Deployment"}: &DeploymentDescriber{c}, {Group: appsv1.GroupName, Kind: "DaemonSet"}: &DaemonSetDescriber{c}, @@ -221,6 +226,7 @@ func describerMap(clientConfig *rest.Config) (map[schema.GroupKind]ResourceDescr {Group: storagev1.GroupName, Kind: "StorageClass"}: &StorageClassDescriber{c}, {Group: storagev1.GroupName, Kind: "CSINode"}: &CSINodeDescriber{c}, {Group: policyv1beta1.GroupName, Kind: "PodDisruptionBudget"}: &PodDisruptionBudgetDescriber{c}, + {Group: policyv1.GroupName, Kind: "PodDisruptionBudget"}: &PodDisruptionBudgetDescriber{c}, {Group: rbacv1.GroupName, Kind: "Role"}: &RoleDescriber{c}, {Group: rbacv1.GroupName, Kind: "ClusterRole"}: &ClusterRoleDescriber{c}, {Group: rbacv1.GroupName, Kind: "RoleBinding"}: &RoleBindingDescriber{c}, @@ -525,26 +531,26 @@ func DescribeResourceQuotas(quotas *corev1.ResourceQuotaList, w PrefixWriter) { } sort.Sort(SortableResourceQuotas(quotas.Items)) - w.Write(LEVEL_0, "Resource Quotas") + w.Write(LEVEL_0, "Resource Quotas\n") for _, q := range quotas.Items { - w.Write(LEVEL_0, "\n Name:\t%s\n", q.Name) + w.Write(LEVEL_1, "Name:\t%s\n", q.Name) if len(q.Spec.Scopes) > 0 { scopes := make([]string, 0, len(q.Spec.Scopes)) for _, scope := range q.Spec.Scopes { scopes = append(scopes, string(scope)) } sort.Strings(scopes) - w.Write(LEVEL_0, " Scopes:\t%s\n", strings.Join(scopes, ", ")) + w.Write(LEVEL_1, "Scopes:\t%s\n", strings.Join(scopes, ", ")) for _, scope := range scopes { helpText := helpTextForResourceQuotaScope(corev1.ResourceQuotaScope(scope)) if len(helpText) > 0 { - w.Write(LEVEL_0, " * %s\n", helpText) + w.Write(LEVEL_1, "* %s\n", helpText) } } } - w.Write(LEVEL_0, " Resource\tUsed\tHard\n") - w.Write(LEVEL_0, " --------\t---\t---\n") + w.Write(LEVEL_1, "Resource\tUsed\tHard\n") + w.Write(LEVEL_1, "--------\t---\t---\n") resources := make([]corev1.ResourceName, 0, len(q.Status.Hard)) for resource := range q.Status.Hard { @@ -555,7 +561,7 @@ func DescribeResourceQuotas(quotas *corev1.ResourceQuotaList, w PrefixWriter) { for _, resource := range resources { hardQuantity := q.Status.Hard[resource] usedQuantity := q.Status.Used[resource] - w.Write(LEVEL_0, " %s\t%s\t%s\n", string(resource), usedQuantity.String(), hardQuantity.String()) + w.Write(LEVEL_1, "%s\t%s\t%s\n", string(resource), usedQuantity.String(), hardQuantity.String()) } } } @@ -1070,7 +1076,6 @@ func printEphemeralVolumeSource(ephemeral *corev1.EphemeralVolumeSource, w Prefi Spec: ephemeral.VolumeClaimTemplate.Spec, }, false /* not a full PVC */) } - w.Write(LEVEL_2, "ReadOnly:\t%v\n", ephemeral.ReadOnly) } func printRBDVolumeSource(rbd *corev1.RBDVolumeSource, w PrefixWriter) { @@ -2160,6 +2165,9 @@ func describeJob(job *batchv1.Job, events *corev1.EventList) (string, error) { } else { w.Write(LEVEL_0, "Completions:\t\n") } + if job.Spec.CompletionMode != nil { + w.Write(LEVEL_0, "Completion Mode:\t%s\n", job.Spec.CompletionMode) + } if job.Status.StartTime != nil { w.Write(LEVEL_0, "Start Time:\t%s\n", job.Status.StartTime.Time.Format(time.RFC1123Z)) } @@ -2173,6 +2181,9 @@ func describeJob(job *batchv1.Job, events *corev1.EventList) (string, error) { w.Write(LEVEL_0, "Active Deadline Seconds:\t%ds\n", *job.Spec.ActiveDeadlineSeconds) } w.Write(LEVEL_0, "Pods Statuses:\t%d Running / %d Succeeded / %d Failed\n", job.Status.Active, job.Status.Succeeded, job.Status.Failed) + if job.Spec.CompletionMode != nil && *job.Spec.CompletionMode == batchv1.IndexedCompletion { + w.Write(LEVEL_0, "Completed Indexes:\t%s\n", capIndexesListOrNone(job.Status.CompletedIndexes, 50)) + } DescribePodTemplate(&job.Spec.Template, w) if events != nil { DescribeEvents(events, w) @@ -2181,25 +2192,50 @@ func describeJob(job *batchv1.Job, events *corev1.EventList) (string, error) { }) } +func capIndexesListOrNone(indexes string, softLimit int) string { + if len(indexes) == 0 { + return "" + } + ix := softLimit + for ; ix < len(indexes); ix++ { + if indexes[ix] == ',' { + break + } + } + if ix >= len(indexes) { + return indexes + } + return indexes[:ix+1] + "..." +} + // CronJobDescriber generates information about a cron job and the jobs it has created. type CronJobDescriber struct { client clientset.Interface } func (d *CronJobDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) { - cronJob, err := d.client.BatchV1beta1().CronJobs(namespace).Get(context.TODO(), name, metav1.GetOptions{}) + var events *corev1.EventList + + cronJob, err := d.client.BatchV1().CronJobs(namespace).Get(context.TODO(), name, metav1.GetOptions{}) + if err == nil { + if describerSettings.ShowEvents { + events, _ = d.client.CoreV1().Events(namespace).Search(scheme.Scheme, cronJob) + } + return describeCronJob(cronJob, events) + } + + // TODO: drop this condition when beta disappears in 1.25 + cronJobBeta, err := d.client.BatchV1beta1().CronJobs(namespace).Get(context.TODO(), name, metav1.GetOptions{}) if err != nil { return "", err } - - var events *corev1.EventList if describerSettings.ShowEvents { events, _ = d.client.CoreV1().Events(namespace).Search(scheme.Scheme, cronJob) } - return describeCronJob(cronJob, events) + return describeCronJobBeta(cronJobBeta, events) } -func describeCronJob(cronJob *batchv1beta1.CronJob, events *corev1.EventList) (string, error) { +func describeCronJob(cronJob *batchv1.CronJob, events *corev1.EventList) (string, error) { return tabbedString(func(out io.Writer) error { w := NewPrefixWriter(out) w.Write(LEVEL_0, "Name:\t%s\n", cronJob.Name) @@ -2238,7 +2274,72 @@ func describeCronJob(cronJob *batchv1beta1.CronJob, events *corev1.EventList) (s }) } -func describeJobTemplate(jobTemplate batchv1beta1.JobTemplateSpec, w PrefixWriter) { +func describeJobTemplate(jobTemplate batchv1.JobTemplateSpec, w PrefixWriter) { + if jobTemplate.Spec.Selector != nil { + if selector, err := metav1.LabelSelectorAsSelector(jobTemplate.Spec.Selector); err == nil { + w.Write(LEVEL_0, "Selector:\t%s\n", selector) + } else { + w.Write(LEVEL_0, "Selector:\tFailed to get selector: %s\n", err) + } + } else { + w.Write(LEVEL_0, "Selector:\t\n") + } + if jobTemplate.Spec.Parallelism != nil { + w.Write(LEVEL_0, "Parallelism:\t%d\n", *jobTemplate.Spec.Parallelism) + } else { + w.Write(LEVEL_0, "Parallelism:\t\n") + } + if jobTemplate.Spec.Completions != nil { + w.Write(LEVEL_0, "Completions:\t%d\n", *jobTemplate.Spec.Completions) + } else { + w.Write(LEVEL_0, "Completions:\t\n") + } + if jobTemplate.Spec.ActiveDeadlineSeconds != nil { + w.Write(LEVEL_0, "Active Deadline Seconds:\t%ds\n", *jobTemplate.Spec.ActiveDeadlineSeconds) + } + DescribePodTemplate(&jobTemplate.Spec.Template, w) +} + +func describeCronJobBeta(cronJob *batchv1beta1.CronJob, events *corev1.EventList) (string, error) { + return tabbedString(func(out io.Writer) error { + w := NewPrefixWriter(out) + w.Write(LEVEL_0, "Name:\t%s\n", cronJob.Name) + w.Write(LEVEL_0, "Namespace:\t%s\n", cronJob.Namespace) + printLabelsMultiline(w, "Labels", cronJob.Labels) + printAnnotationsMultiline(w, "Annotations", cronJob.Annotations) + w.Write(LEVEL_0, "Schedule:\t%s\n", cronJob.Spec.Schedule) + w.Write(LEVEL_0, "Concurrency Policy:\t%s\n", cronJob.Spec.ConcurrencyPolicy) + w.Write(LEVEL_0, "Suspend:\t%s\n", printBoolPtr(cronJob.Spec.Suspend)) + if cronJob.Spec.SuccessfulJobsHistoryLimit != nil { + w.Write(LEVEL_0, "Successful Job History Limit:\t%d\n", *cronJob.Spec.SuccessfulJobsHistoryLimit) + } else { + w.Write(LEVEL_0, "Successful Job History Limit:\t\n") + } + if cronJob.Spec.FailedJobsHistoryLimit != nil { + w.Write(LEVEL_0, "Failed Job History Limit:\t%d\n", *cronJob.Spec.FailedJobsHistoryLimit) + } else { + w.Write(LEVEL_0, "Failed Job History Limit:\t\n") + } + if cronJob.Spec.StartingDeadlineSeconds != nil { + w.Write(LEVEL_0, "Starting Deadline Seconds:\t%ds\n", *cronJob.Spec.StartingDeadlineSeconds) + } else { + w.Write(LEVEL_0, "Starting Deadline Seconds:\t\n") + } + describeJobTemplateBeta(cronJob.Spec.JobTemplate, w) + if cronJob.Status.LastScheduleTime != nil { + w.Write(LEVEL_0, "Last Schedule Time:\t%s\n", cronJob.Status.LastScheduleTime.Time.Format(time.RFC1123Z)) + } else { + w.Write(LEVEL_0, "Last Schedule Time:\t\n") + } + printActiveJobs(w, "Active Jobs", cronJob.Status.Active) + if events != nil { + DescribeEvents(events, w) + } + return nil + }) +} + +func describeJobTemplateBeta(jobTemplate batchv1beta1.JobTemplateSpec, w PrefixWriter) { if jobTemplate.Spec.Selector != nil { if selector, err := metav1.LabelSelectorAsSelector(jobTemplate.Spec.Selector); err == nil { w.Write(LEVEL_0, "Selector:\t%s\n", selector) @@ -2455,7 +2556,11 @@ func (i *IngressDescriber) describeBackendV1(ns string, backend *networkingv1.In } if backend.Resource != nil { ic := backend.Resource - return fmt.Sprintf("APIGroup: %v, Kind: %v, Name: %v", *ic.APIGroup, ic.Kind, ic.Name) + apiGroup := "" + if ic.APIGroup != nil { + apiGroup = fmt.Sprintf("%v", *ic.APIGroup) + } + return fmt.Sprintf("APIGroup: %v, Kind: %v, Name: %v", apiGroup, ic.Kind, ic.Name) } return "" } @@ -2859,22 +2964,112 @@ type EndpointSliceDescriber struct { } func (d *EndpointSliceDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) { - c := d.DiscoveryV1beta1().EndpointSlices(namespace) + var events *corev1.EventList + // try endpointslice/v1 first (v1.21) and fallback to v1beta1 if error occurs - eps, err := c.Get(context.TODO(), name, metav1.GetOptions{}) + epsV1, err := d.DiscoveryV1().EndpointSlices(namespace).Get(context.TODO(), name, metav1.GetOptions{}) + if err == nil { + if describerSettings.ShowEvents { + events, _ = d.CoreV1().Events(namespace).Search(scheme.Scheme, epsV1) + } + return describeEndpointSliceV1(epsV1, events) + } + + epsV1beta1, err := d.DiscoveryV1beta1().EndpointSlices(namespace).Get(context.TODO(), name, metav1.GetOptions{}) if err != nil { return "", err } - var events *corev1.EventList if describerSettings.ShowEvents { - events, _ = d.CoreV1().Events(namespace).Search(scheme.Scheme, eps) + events, _ = d.CoreV1().Events(namespace).Search(scheme.Scheme, epsV1beta1) } - return describeEndpointSlice(eps, events) + return describeEndpointSliceV1beta1(epsV1beta1, events) +} + +func describeEndpointSliceV1(eps *discoveryv1.EndpointSlice, events *corev1.EventList) (string, error) { + return tabbedString(func(out io.Writer) error { + w := NewPrefixWriter(out) + w.Write(LEVEL_0, "Name:\t%s\n", eps.Name) + w.Write(LEVEL_0, "Namespace:\t%s\n", eps.Namespace) + printLabelsMultiline(w, "Labels", eps.Labels) + printAnnotationsMultiline(w, "Annotations", eps.Annotations) + + w.Write(LEVEL_0, "AddressType:\t%s\n", string(eps.AddressType)) + + if len(eps.Ports) == 0 { + w.Write(LEVEL_0, "Ports: \n") + } else { + w.Write(LEVEL_0, "Ports:\n") + w.Write(LEVEL_1, "Name\tPort\tProtocol\n") + w.Write(LEVEL_1, "----\t----\t--------\n") + for _, port := range eps.Ports { + portName := "" + if port.Name != nil && len(*port.Name) > 0 { + portName = *port.Name + } + + portNum := "" + if port.Port != nil { + portNum = strconv.Itoa(int(*port.Port)) + } + + w.Write(LEVEL_1, "%s\t%s\t%s\n", portName, portNum, *port.Protocol) + } + } + + if len(eps.Endpoints) == 0 { + w.Write(LEVEL_0, "Endpoints: \n") + } else { + w.Write(LEVEL_0, "Endpoints:\n") + for i := range eps.Endpoints { + endpoint := &eps.Endpoints[i] + + addressesString := strings.Join(endpoint.Addresses, ", ") + if len(addressesString) == 0 { + addressesString = "" + } + w.Write(LEVEL_1, "- Addresses:\t%s\n", addressesString) + + w.Write(LEVEL_2, "Conditions:\n") + readyText := "" + if endpoint.Conditions.Ready != nil { + readyText = strconv.FormatBool(*endpoint.Conditions.Ready) + } + w.Write(LEVEL_3, "Ready:\t%s\n", readyText) + + hostnameText := "" + if endpoint.Hostname != nil { + hostnameText = *endpoint.Hostname + } + w.Write(LEVEL_2, "Hostname:\t%s\n", hostnameText) + + if endpoint.TargetRef != nil { + w.Write(LEVEL_2, "TargetRef:\t%s/%s\n", endpoint.TargetRef.Kind, endpoint.TargetRef.Name) + } + + nodeNameText := "" + if endpoint.NodeName != nil { + nodeNameText = *endpoint.NodeName + } + w.Write(LEVEL_2, "NodeName:\t%s\n", nodeNameText) + + zoneText := "" + if endpoint.NodeName != nil { + zoneText = *endpoint.Zone + } + w.Write(LEVEL_2, "Zone:\t%s\n", zoneText) + } + } + + if events != nil { + DescribeEvents(events, w) + } + return nil + }) } -func describeEndpointSlice(eps *discoveryv1beta1.EndpointSlice, events *corev1.EventList) (string, error) { +func describeEndpointSliceV1beta1(eps *discoveryv1beta1.EndpointSlice, events *corev1.EventList) (string, error) { return tabbedString(func(out io.Writer) error { w := NewPrefixWriter(out) w.Write(LEVEL_0, "Name:\t%s\n", eps.Name) @@ -3772,7 +3967,7 @@ func describeHorizontalPodAutoscalerV1(hpa *autoscalingv1.HorizontalPodAutoscale func describeNodeResource(nodeNonTerminatedPodsList *corev1.PodList, node *corev1.Node, w PrefixWriter) { w.Write(LEVEL_0, "Non-terminated Pods:\t(%d in total)\n", len(nodeNonTerminatedPodsList.Items)) - w.Write(LEVEL_1, "Namespace\tName\t\tCPU Requests\tCPU Limits\tMemory Requests\tMemory Limits\tAGE\n") + w.Write(LEVEL_1, "Namespace\tName\t\tCPU Requests\tCPU Limits\tMemory Requests\tMemory Limits\tAge\n") w.Write(LEVEL_1, "---------\t----\t\t------------\t----------\t---------------\t-------------\t---\n") allocatable := node.Status.Capacity if len(node.Status.Allocatable) > 0 { @@ -3929,7 +4124,7 @@ func (dd *DeploymentDescriber) Describe(namespace, name string, describerSetting events, _ = dd.client.CoreV1().Events(namespace).Search(scheme.Scheme, d) } - return describeDeployment(d, selector, d, events, dd) + return describeDeployment(d, selector, d.DeepCopy(), events, dd) } func describeDeployment(d *appsv1.Deployment, selector labels.Selector, internalDeployment *appsv1.Deployment, events *corev1.EventList, dd *DeploymentDescriber) (string, error) { @@ -4344,20 +4539,67 @@ type PodDisruptionBudgetDescriber struct { } func (p *PodDisruptionBudgetDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) { - pdb, err := p.PolicyV1beta1().PodDisruptionBudgets(namespace).Get(context.TODO(), name, metav1.GetOptions{}) - if err != nil { - return "", err + var ( + pdbv1 *policyv1.PodDisruptionBudget + pdbv1beta1 *policyv1beta1.PodDisruptionBudget + err error + ) + + pdbv1, err = p.PolicyV1().PodDisruptionBudgets(namespace).Get(context.TODO(), name, metav1.GetOptions{}) + if err == nil { + var events *corev1.EventList + if describerSettings.ShowEvents { + events, _ = p.CoreV1().Events(namespace).Search(scheme.Scheme, pdbv1) + } + return describePodDisruptionBudgetV1(pdbv1, events) } - var events *corev1.EventList - if describerSettings.ShowEvents { - events, _ = p.CoreV1().Events(namespace).Search(scheme.Scheme, pdb) + // try falling back to v1beta1 in NotFound error cases + if apierrors.IsNotFound(err) { + pdbv1beta1, err = p.PolicyV1beta1().PodDisruptionBudgets(namespace).Get(context.TODO(), name, metav1.GetOptions{}) } + if err == nil { + var events *corev1.EventList + if describerSettings.ShowEvents { + events, _ = p.CoreV1().Events(namespace).Search(scheme.Scheme, pdbv1beta1) + } + return describePodDisruptionBudgetV1beta1(pdbv1beta1, events) + } + + return "", err +} - return describePodDisruptionBudget(pdb, events) +func describePodDisruptionBudgetV1(pdb *policyv1.PodDisruptionBudget, events *corev1.EventList) (string, error) { + return tabbedString(func(out io.Writer) error { + w := NewPrefixWriter(out) + w.Write(LEVEL_0, "Name:\t%s\n", pdb.Name) + w.Write(LEVEL_0, "Namespace:\t%s\n", pdb.Namespace) + + if pdb.Spec.MinAvailable != nil { + w.Write(LEVEL_0, "Min available:\t%s\n", pdb.Spec.MinAvailable.String()) + } else if pdb.Spec.MaxUnavailable != nil { + w.Write(LEVEL_0, "Max unavailable:\t%s\n", pdb.Spec.MaxUnavailable.String()) + } + + if pdb.Spec.Selector != nil { + w.Write(LEVEL_0, "Selector:\t%s\n", metav1.FormatLabelSelector(pdb.Spec.Selector)) + } else { + w.Write(LEVEL_0, "Selector:\t\n") + } + w.Write(LEVEL_0, "Status:\n") + w.Write(LEVEL_2, "Allowed disruptions:\t%d\n", pdb.Status.DisruptionsAllowed) + w.Write(LEVEL_2, "Current:\t%d\n", pdb.Status.CurrentHealthy) + w.Write(LEVEL_2, "Desired:\t%d\n", pdb.Status.DesiredHealthy) + w.Write(LEVEL_2, "Total:\t%d\n", pdb.Status.ExpectedPods) + if events != nil { + DescribeEvents(events, w) + } + + return nil + }) } -func describePodDisruptionBudget(pdb *policyv1beta1.PodDisruptionBudget, events *corev1.EventList) (string, error) { +func describePodDisruptionBudgetV1beta1(pdb *policyv1beta1.PodDisruptionBudget, events *corev1.EventList) (string, error) { return tabbedString(func(out io.Writer) error { w := NewPrefixWriter(out) w.Write(LEVEL_0, "Name:\t%s\n", pdb.Name) diff --git a/vendor/k8s.io/kubectl/pkg/polymorphichelpers/BUILD b/vendor/k8s.io/kubectl/pkg/polymorphichelpers/BUILD deleted file mode 100644 index 0b4d9f91a122..000000000000 --- a/vendor/k8s.io/kubectl/pkg/polymorphichelpers/BUILD +++ /dev/null @@ -1,118 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "attachablepodforobject.go", - "canbeexposed.go", - "helpers.go", - "history.go", - "historyviewer.go", - "interface.go", - "logsforobject.go", - "mapbasedselectorforobject.go", - "objectpauser.go", - "objectrestarter.go", - "objectresumer.go", - "portsforobject.go", - "protocolsforobject.go", - "rollback.go", - "rollbacker.go", - "rollout_status.go", - "statusviewer.go", - "updatepodspec.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/polymorphichelpers", - importpath = "k8s.io/kubectl/pkg/polymorphichelpers", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/apps/v1beta1:go_default_library", - "//staging/src/k8s.io/api/apps/v1beta2:go_default_library", - "//staging/src/k8s.io/api/batch/v1:go_default_library", - "//staging/src/k8s.io/api/batch/v1beta1:go_default_library", - "//staging/src/k8s.io/api/batch/v2alpha1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/json:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/cli-runtime/pkg/genericclioptions:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/apps/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/tools/reference:go_default_library", - "//staging/src/k8s.io/client-go/tools/watch:go_default_library", - "//staging/src/k8s.io/kubectl/pkg/apps:go_default_library", - "//staging/src/k8s.io/kubectl/pkg/cmd/util:go_default_library", - "//staging/src/k8s.io/kubectl/pkg/describe:go_default_library", - "//staging/src/k8s.io/kubectl/pkg/scheme:go_default_library", - "//staging/src/k8s.io/kubectl/pkg/util/deployment:go_default_library", - "//staging/src/k8s.io/kubectl/pkg/util/podutils:go_default_library", - "//staging/src/k8s.io/kubectl/pkg/util/slice:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "canbeexposed_test.go", - "helpers_test.go", - "history_test.go", - "logsforobject_test.go", - "mapbasedselectorforobject_test.go", - "objectpauser_test.go", - "objectresumer_test.go", - "portsforobject_test.go", - "protocolsforobject_test.go", - "rollback_test.go", - "rollout_status_test.go", - "updatepodspec_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/apps/v1beta1:go_default_library", - "//staging/src/k8s.io/api/apps/v1beta2:go_default_library", - "//staging/src/k8s.io/api/batch/v1:go_default_library", - "//staging/src/k8s.io/api/batch/v1beta1:go_default_library", - "//staging/src/k8s.io/api/batch/v2alpha1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/json:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - "//staging/src/k8s.io/kubectl/pkg/util/podutils:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubectl/pkg/polymorphichelpers/logsforobject.go b/vendor/k8s.io/kubectl/pkg/polymorphichelpers/logsforobject.go index b45243ba9193..5395596fc343 100644 --- a/vendor/k8s.io/kubectl/pkg/polymorphichelpers/logsforobject.go +++ b/vendor/k8s.io/kubectl/pkg/polymorphichelpers/logsforobject.go @@ -30,12 +30,13 @@ import ( corev1client "k8s.io/client-go/kubernetes/typed/core/v1" "k8s.io/client-go/rest" "k8s.io/client-go/tools/reference" + "k8s.io/kubectl/pkg/cmd/util/podcmd" "k8s.io/kubectl/pkg/scheme" "k8s.io/kubectl/pkg/util/podutils" ) // defaultLogsContainerAnnotationName is an annotation name that can be used to preselect the interesting container -// from a pod when running kubectl logs. +// from a pod when running kubectl logs. It is deprecated and will be remove in 1.25. const defaultLogsContainerAnnotationName = "kubectl.kubernetes.io/default-logs-container" func logsForObject(restClientGetter genericclioptions.RESTClientGetter, object, options runtime.Object, timeout time.Duration, allContainers bool) (map[corev1.ObjectReference]rest.ResponseWrapper, error) { @@ -73,22 +74,35 @@ func logsForObjectWithClient(clientset corev1client.CoreV1Interface, object, opt return ret, nil case *corev1.Pod: - // in case the "kubectl.kubernetes.io/default-logs-container" annotation is present, we preset the opts.Containers to default to selected - // container. This gives users ability to preselect the most interesting container in pod. - if annotations := t.GetAnnotations(); annotations != nil && len(opts.Container) == 0 && len(annotations[defaultLogsContainerAnnotationName]) > 0 { - containerName := annotations[defaultLogsContainerAnnotationName] - if exists, _ := findContainerByName(t, containerName); exists != nil { - opts.Container = containerName - } else { - fmt.Fprintf(os.Stderr, "Default container name %q not found in a pod\n", containerName) - } - } // if allContainers is true, then we're going to locate all containers and then iterate through them. At that point, "allContainers" is false if !allContainers { + // in case the "kubectl.kubernetes.io/default-container" annotation is present, we preset the opts.Containers to default to selected + // container. This gives users ability to preselect the most interesting container in pod. + if annotations := t.GetAnnotations(); annotations != nil && len(opts.Container) == 0 { + var containerName string + if len(annotations[podcmd.DefaultContainerAnnotationName]) > 0 { + containerName = annotations[podcmd.DefaultContainerAnnotationName] + } else if len(annotations[defaultLogsContainerAnnotationName]) > 0 { + // Only log deprecation if we have only the old annotation. This allows users to + // set both to support multiple versions of kubectl; if they are setting both + // they must already know it is deprecated, so we don't need to add noisy + // warnings. + containerName = annotations[defaultLogsContainerAnnotationName] + fmt.Fprintf(os.Stderr, "Using deprecated annotation `kubectl.kubernetes.io/default-logs-container` in pod/%v. Please use `kubectl.kubernetes.io/default-container` instead\n", t.Name) + } + if len(containerName) > 0 { + if exists, _ := podcmd.FindContainerByName(t, containerName); exists != nil { + opts.Container = containerName + } else { + fmt.Fprintf(os.Stderr, "Default container name %q not found in a pod\n", containerName) + } + } + } + var containerName string if opts == nil || len(opts.Container) == 0 { // We don't know container name. In this case we expect only one container to be present in the pod (ignoring InitContainers). - // If there is more than one container we should return an error showing all container names. + // If there is more than one container, we should return an error showing all container names. if len(t.Spec.Containers) != 1 { containerNames := getContainerNames(t.Spec.Containers) initContainerNames := getContainerNames(t.Spec.InitContainers) @@ -108,7 +122,7 @@ func logsForObjectWithClient(clientset corev1client.CoreV1Interface, object, opt containerName = opts.Container } - container, fieldPath := findContainerByName(t, containerName) + container, fieldPath := podcmd.FindContainerByName(t, containerName) if container == nil { return nil, fmt.Errorf("container %s is not valid for pod %s", opts.Container, t.Name) } @@ -177,28 +191,6 @@ func logsForObjectWithClient(clientset corev1client.CoreV1Interface, object, opt return logsForObjectWithClient(clientset, pod, options, timeout, allContainers) } -// findContainerByName searches for a container by name amongst all containers in a pod. -// Returns a pointer to a container and a field path. -func findContainerByName(pod *corev1.Pod, name string) (container *corev1.Container, fieldPath string) { - for _, c := range pod.Spec.InitContainers { - if c.Name == name { - return &c, fmt.Sprintf("spec.initContainers{%s}", c.Name) - } - } - for _, c := range pod.Spec.Containers { - if c.Name == name { - return &c, fmt.Sprintf("spec.containers{%s}", c.Name) - } - } - for _, c := range pod.Spec.EphemeralContainers { - if c.Name == name { - containerCommon := corev1.Container(c.EphemeralContainerCommon) - return &containerCommon, fmt.Sprintf("spec.ephemeralContainers{%s}", containerCommon.Name) - } - } - return nil, "" -} - // getContainerNames returns a formatted string containing the container names func getContainerNames(containers []corev1.Container) string { names := []string{} diff --git a/vendor/k8s.io/kubectl/pkg/polymorphichelpers/updatepodspec.go b/vendor/k8s.io/kubectl/pkg/polymorphichelpers/updatepodspec.go index 404486382464..f386447c1b23 100644 --- a/vendor/k8s.io/kubectl/pkg/polymorphichelpers/updatepodspec.go +++ b/vendor/k8s.io/kubectl/pkg/polymorphichelpers/updatepodspec.go @@ -24,7 +24,6 @@ import ( appsv1beta2 "k8s.io/api/apps/v1beta2" batchv1 "k8s.io/api/batch/v1" batchv1beta1 "k8s.io/api/batch/v1beta1" - batchv2alpha1 "k8s.io/api/batch/v2alpha1" "k8s.io/api/core/v1" extensionsv1beta1 "k8s.io/api/extensions/v1beta1" "k8s.io/apimachinery/pkg/runtime" @@ -82,7 +81,7 @@ func updatePodSpecForObject(obj runtime.Object, fn func(*v1.PodSpec) error) (boo // CronJob case *batchv1beta1.CronJob: return true, fn(&t.Spec.JobTemplate.Spec.Template.Spec) - case *batchv2alpha1.CronJob: + case *batchv1.CronJob: return true, fn(&t.Spec.JobTemplate.Spec.Template.Spec) default: diff --git a/vendor/k8s.io/kubectl/pkg/scale/BUILD b/vendor/k8s.io/kubectl/pkg/scale/BUILD deleted file mode 100644 index f928601661c2..000000000000 --- a/vendor/k8s.io/kubectl/pkg/scale/BUILD +++ /dev/null @@ -1,51 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["scale.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/scale", - importpath = "k8s.io/kubectl/pkg/scale", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/json:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/scale:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["scale_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/testapigroup/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/client-go/scale:go_default_library", - "//staging/src/k8s.io/client-go/scale/fake:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubectl/pkg/scheme/BUILD b/vendor/k8s.io/kubectl/pkg/scheme/BUILD deleted file mode 100644 index 63a39d37eb29..000000000000 --- a/vendor/k8s.io/kubectl/pkg/scheme/BUILD +++ /dev/null @@ -1,79 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "install.go", - "scheme.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/scheme", - importpath = "k8s.io/kubectl/pkg/scheme", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/admission/v1:go_default_library", - "//staging/src/k8s.io/api/admission/v1beta1:go_default_library", - "//staging/src/k8s.io/api/admissionregistration/v1:go_default_library", - "//staging/src/k8s.io/api/admissionregistration/v1beta1:go_default_library", - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/apps/v1beta1:go_default_library", - "//staging/src/k8s.io/api/apps/v1beta2:go_default_library", - "//staging/src/k8s.io/api/authentication/v1:go_default_library", - "//staging/src/k8s.io/api/authentication/v1beta1:go_default_library", - "//staging/src/k8s.io/api/authorization/v1:go_default_library", - "//staging/src/k8s.io/api/authorization/v1beta1:go_default_library", - "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", - "//staging/src/k8s.io/api/autoscaling/v2beta1:go_default_library", - "//staging/src/k8s.io/api/batch/v1:go_default_library", - "//staging/src/k8s.io/api/batch/v1beta1:go_default_library", - "//staging/src/k8s.io/api/batch/v2alpha1:go_default_library", - "//staging/src/k8s.io/api/certificates/v1:go_default_library", - "//staging/src/k8s.io/api/certificates/v1beta1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", - "//staging/src/k8s.io/api/imagepolicy/v1alpha1:go_default_library", - "//staging/src/k8s.io/api/networking/v1:go_default_library", - "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/api/rbac/v1:go_default_library", - "//staging/src/k8s.io/api/rbac/v1alpha1:go_default_library", - "//staging/src/k8s.io/api/rbac/v1beta1:go_default_library", - "//staging/src/k8s.io/api/scheduling/v1alpha1:go_default_library", - "//staging/src/k8s.io/api/storage/v1:go_default_library", - "//staging/src/k8s.io/api/storage/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["sparse_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/batch/v1:go_default_library", - "//staging/src/k8s.io/api/batch/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubectl/pkg/scheme/install.go b/vendor/k8s.io/kubectl/pkg/scheme/install.go index 8640c70216c8..0aa436eeb9f3 100644 --- a/vendor/k8s.io/kubectl/pkg/scheme/install.go +++ b/vendor/k8s.io/kubectl/pkg/scheme/install.go @@ -32,13 +32,13 @@ import ( autoscalingv2beta1 "k8s.io/api/autoscaling/v2beta1" batchv1 "k8s.io/api/batch/v1" batchv1beta1 "k8s.io/api/batch/v1beta1" - batchv2alpha1 "k8s.io/api/batch/v2alpha1" certificatesv1 "k8s.io/api/certificates/v1" certificatesv1beta1 "k8s.io/api/certificates/v1beta1" corev1 "k8s.io/api/core/v1" extensionsv1beta1 "k8s.io/api/extensions/v1beta1" imagepolicyv1alpha1 "k8s.io/api/imagepolicy/v1alpha1" networkingv1 "k8s.io/api/networking/v1" + policyv1 "k8s.io/api/policy/v1" policyv1beta1 "k8s.io/api/policy/v1beta1" rbacv1 "k8s.io/api/rbac/v1" rbacv1alpha1 "k8s.io/api/rbac/v1alpha1" @@ -70,12 +70,12 @@ func init() { utilruntime.Must(Scheme.SetVersionPriority(authenticationv1.SchemeGroupVersion, authenticationv1beta1.SchemeGroupVersion)) utilruntime.Must(Scheme.SetVersionPriority(authorizationv1.SchemeGroupVersion, authorizationv1beta1.SchemeGroupVersion)) utilruntime.Must(Scheme.SetVersionPriority(autoscalingv1.SchemeGroupVersion, autoscalingv2beta1.SchemeGroupVersion)) - utilruntime.Must(Scheme.SetVersionPriority(batchv1.SchemeGroupVersion, batchv1beta1.SchemeGroupVersion, batchv2alpha1.SchemeGroupVersion)) + utilruntime.Must(Scheme.SetVersionPriority(batchv1.SchemeGroupVersion, batchv1beta1.SchemeGroupVersion)) utilruntime.Must(Scheme.SetVersionPriority(certificatesv1.SchemeGroupVersion, certificatesv1beta1.SchemeGroupVersion)) utilruntime.Must(Scheme.SetVersionPriority(extensionsv1beta1.SchemeGroupVersion)) utilruntime.Must(Scheme.SetVersionPriority(imagepolicyv1alpha1.SchemeGroupVersion)) utilruntime.Must(Scheme.SetVersionPriority(networkingv1.SchemeGroupVersion)) - utilruntime.Must(Scheme.SetVersionPriority(policyv1beta1.SchemeGroupVersion)) + utilruntime.Must(Scheme.SetVersionPriority(policyv1beta1.SchemeGroupVersion, policyv1.SchemeGroupVersion)) utilruntime.Must(Scheme.SetVersionPriority(rbacv1.SchemeGroupVersion, rbacv1beta1.SchemeGroupVersion, rbacv1alpha1.SchemeGroupVersion)) utilruntime.Must(Scheme.SetVersionPriority(schedulingv1alpha1.SchemeGroupVersion)) utilruntime.Must(Scheme.SetVersionPriority(storagev1.SchemeGroupVersion, storagev1beta1.SchemeGroupVersion)) diff --git a/vendor/k8s.io/kubectl/pkg/util/certificate/BUILD b/vendor/k8s.io/kubectl/pkg/util/certificate/BUILD deleted file mode 100644 index 980c3cdae25c..000000000000 --- a/vendor/k8s.io/kubectl/pkg/util/certificate/BUILD +++ /dev/null @@ -1,23 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["certificate.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/util/certificate", - importpath = "k8s.io/kubectl/pkg/util/certificate", - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubectl/pkg/util/deployment/BUILD b/vendor/k8s.io/kubectl/pkg/util/deployment/BUILD deleted file mode 100644 index a2a728566d6e..000000000000 --- a/vendor/k8s.io/kubectl/pkg/util/deployment/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["deployment.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/util/deployment", - importpath = "k8s.io/kubectl/pkg/util/deployment", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/apps/v1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubectl/pkg/util/event/BUILD b/vendor/k8s.io/kubectl/pkg/util/event/BUILD deleted file mode 100644 index 1026bf06bf8e..000000000000 --- a/vendor/k8s.io/kubectl/pkg/util/event/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["sorted_event_list.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/util/event", - importpath = "k8s.io/kubectl/pkg/util/event", - visibility = ["//visibility:public"], - deps = ["//staging/src/k8s.io/api/core/v1:go_default_library"], -) - -go_test( - name = "go_default_test", - srcs = ["sorted_event_list_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubectl/pkg/util/fieldpath/BUILD b/vendor/k8s.io/kubectl/pkg/util/fieldpath/BUILD deleted file mode 100644 index 37682adb7ce1..000000000000 --- a/vendor/k8s.io/kubectl/pkg/util/fieldpath/BUILD +++ /dev/null @@ -1,28 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["fieldpath.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/util/fieldpath", - importpath = "k8s.io/kubectl/pkg/util/fieldpath", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubectl/pkg/util/interrupt/BUILD b/vendor/k8s.io/kubectl/pkg/util/interrupt/BUILD deleted file mode 100644 index f24a5df5d800..000000000000 --- a/vendor/k8s.io/kubectl/pkg/util/interrupt/BUILD +++ /dev/null @@ -1,23 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["interrupt.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/util/interrupt", - importpath = "k8s.io/kubectl/pkg/util/interrupt", - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubectl/pkg/util/openapi/BUILD b/vendor/k8s.io/kubectl/pkg/util/openapi/BUILD deleted file mode 100644 index af2da0065ac8..000000000000 --- a/vendor/k8s.io/kubectl/pkg/util/openapi/BUILD +++ /dev/null @@ -1,60 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "extensions.go", - "openapi.go", - "openapi_getter.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/util/openapi", - importpath = "k8s.io/kubectl/pkg/util/openapi", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/client-go/discovery:go_default_library", - "//vendor/github.com/go-openapi/spec:go_default_library", - "//vendor/github.com/googleapis/gnostic/openapiv2:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/util/proto:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "openapi_getter_test.go", - "openapi_suite_test.go", - "openapi_test.go", - ], - data = ["//staging/src/k8s.io/kubectl/testdata"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/github.com/googleapis/gnostic/openapiv2:go_default_library", - "//vendor/github.com/onsi/ginkgo:go_default_library", - "//vendor/github.com/onsi/ginkgo/config:go_default_library", - "//vendor/github.com/onsi/ginkgo/types:go_default_library", - "//vendor/github.com/onsi/gomega:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/util/proto:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/util/proto/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/kubectl/pkg/util/openapi/testing:all-srcs", - "//staging/src/k8s.io/kubectl/pkg/util/openapi/validation:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubectl/pkg/util/openapi/openapi_getter.go b/vendor/k8s.io/kubectl/pkg/util/openapi/openapi_getter.go index d5c9476a02b8..e0f82eba9c50 100644 --- a/vendor/k8s.io/kubectl/pkg/util/openapi/openapi_getter.go +++ b/vendor/k8s.io/kubectl/pkg/util/openapi/openapi_getter.go @@ -19,47 +19,64 @@ package openapi import ( "sync" + openapi_v2 "github.com/googleapis/gnostic/openapiv2" "k8s.io/client-go/discovery" ) -// synchronizedOpenAPIGetter fetches the openapi schema once and then caches it in memory -type synchronizedOpenAPIGetter struct { +// CachedOpenAPIGetter fetches the openapi schema once and then caches it in memory +type CachedOpenAPIGetter struct { + openAPIClient discovery.OpenAPISchemaInterface + // Cached results sync.Once - openAPISchema Resources + openAPISchema *openapi_v2.Document err error - - openAPIClient discovery.OpenAPISchemaInterface } -var _ Getter = &synchronizedOpenAPIGetter{} - -// Getter is an interface for fetching openapi specs and parsing them into an Resources struct -type Getter interface { - // OpenAPIData returns the parsed OpenAPIData - Get() (Resources, error) -} +var _ discovery.OpenAPISchemaInterface = &CachedOpenAPIGetter{} // NewOpenAPIGetter returns an object to return OpenAPIDatas which reads // from a server, and then stores in memory for subsequent invocations -func NewOpenAPIGetter(openAPIClient discovery.OpenAPISchemaInterface) Getter { - return &synchronizedOpenAPIGetter{ +func NewOpenAPIGetter(openAPIClient discovery.OpenAPISchemaInterface) *CachedOpenAPIGetter { + return &CachedOpenAPIGetter{ openAPIClient: openAPIClient, } } -// Resources implements Getter -func (g *synchronizedOpenAPIGetter) Get() (Resources, error) { +// OpenAPISchema implements OpenAPISchemaInterface. +func (g *CachedOpenAPIGetter) OpenAPISchema() (*openapi_v2.Document, error) { g.Do(func() { - s, err := g.openAPIClient.OpenAPISchema() + g.openAPISchema, g.err = g.openAPIClient.OpenAPISchema() + }) + + // Return the saved result. + return g.openAPISchema, g.err +} + +type CachedOpenAPIParser struct { + openAPIClient discovery.OpenAPISchemaInterface + + // Cached results + sync.Once + openAPIResources Resources + err error +} + +func NewOpenAPIParser(openAPIClient discovery.OpenAPISchemaInterface) *CachedOpenAPIParser { + return &CachedOpenAPIParser{ + openAPIClient: openAPIClient, + } +} + +func (p *CachedOpenAPIParser) Parse() (Resources, error) { + p.Do(func() { + oapi, err := p.openAPIClient.OpenAPISchema() if err != nil { - g.err = err + p.err = err return } - - g.openAPISchema, g.err = NewOpenAPIData(s) + p.openAPIResources, p.err = NewOpenAPIData(oapi) }) - // Return the save result - return g.openAPISchema, g.err + return p.openAPIResources, p.err } diff --git a/vendor/k8s.io/kubectl/pkg/util/openapi/validation/BUILD b/vendor/k8s.io/kubectl/pkg/util/openapi/validation/BUILD deleted file mode 100644 index 6e5e6e1be595..000000000000 --- a/vendor/k8s.io/kubectl/pkg/util/openapi/validation/BUILD +++ /dev/null @@ -1,51 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["validation.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/util/openapi/validation", - importpath = "k8s.io/kubectl/pkg/util/openapi/validation", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/json:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/yaml:go_default_library", - "//staging/src/k8s.io/kubectl/pkg/util/openapi:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/util/proto/validation:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "validation_suite_test.go", - "validation_test.go", - ], - data = ["//staging/src/k8s.io/kubectl/testdata"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/kubectl/pkg/util/openapi:go_default_library", - "//vendor/github.com/onsi/ginkgo:go_default_library", - "//vendor/github.com/onsi/ginkgo/config:go_default_library", - "//vendor/github.com/onsi/ginkgo/types:go_default_library", - "//vendor/github.com/onsi/gomega:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/util/proto/testing:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/util/proto/validation:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubectl/pkg/util/podutils/BUILD b/vendor/k8s.io/kubectl/pkg/util/podutils/BUILD deleted file mode 100644 index 621109f2e05d..000000000000 --- a/vendor/k8s.io/kubectl/pkg/util/podutils/BUILD +++ /dev/null @@ -1,28 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["podutils.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/util/podutils", - importpath = "k8s.io/kubectl/pkg/util/podutils", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/utils/integer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubectl/pkg/util/qos/BUILD b/vendor/k8s.io/kubectl/pkg/util/qos/BUILD deleted file mode 100644 index 244b748b6829..000000000000 --- a/vendor/k8s.io/kubectl/pkg/util/qos/BUILD +++ /dev/null @@ -1,28 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["qos.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/util/qos", - importpath = "k8s.io/kubectl/pkg/util/qos", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubectl/pkg/util/rbac/BUILD b/vendor/k8s.io/kubectl/pkg/util/rbac/BUILD deleted file mode 100644 index 94e7e86ef341..000000000000 --- a/vendor/k8s.io/kubectl/pkg/util/rbac/BUILD +++ /dev/null @@ -1,27 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["rbac.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/util/rbac", - importpath = "k8s.io/kubectl/pkg/util/rbac", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/rbac/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubectl/pkg/util/resource/BUILD b/vendor/k8s.io/kubectl/pkg/util/resource/BUILD deleted file mode 100644 index 84dbe311a652..000000000000 --- a/vendor/k8s.io/kubectl/pkg/util/resource/BUILD +++ /dev/null @@ -1,28 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["resource.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/util/resource", - importpath = "k8s.io/kubectl/pkg/util/resource", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubectl/pkg/util/slice/BUILD b/vendor/k8s.io/kubectl/pkg/util/slice/BUILD deleted file mode 100644 index 7476a1581ba5..000000000000 --- a/vendor/k8s.io/kubectl/pkg/util/slice/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["slice.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/util/slice", - importpath = "k8s.io/kubectl/pkg/util/slice", -) - -go_test( - name = "go_default_test", - srcs = ["slice_test.go"], - embed = [":go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubectl/pkg/util/storage/BUILD b/vendor/k8s.io/kubectl/pkg/util/storage/BUILD deleted file mode 100644 index a1d53780427b..000000000000 --- a/vendor/k8s.io/kubectl/pkg/util/storage/BUILD +++ /dev/null @@ -1,27 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/util/storage", - importpath = "k8s.io/kubectl/pkg/util/storage", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubectl/pkg/util/templates/BUILD b/vendor/k8s.io/kubectl/pkg/util/templates/BUILD deleted file mode 100644 index b96e2056175e..000000000000 --- a/vendor/k8s.io/kubectl/pkg/util/templates/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "command_groups.go", - "markdown.go", - "normalizers.go", - "templater.go", - "templates.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/util/templates", - importpath = "k8s.io/kubectl/pkg/util/templates", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/kubectl/pkg/util/term:go_default_library", - "//vendor/github.com/MakeNowJust/heredoc:go_default_library", - "//vendor/github.com/russross/blackfriday:go_default_library", - "//vendor/github.com/spf13/cobra:go_default_library", - "//vendor/github.com/spf13/pflag:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubectl/pkg/util/term/BUILD b/vendor/k8s.io/kubectl/pkg/util/term/BUILD deleted file mode 100644 index 91ebe3296e5a..000000000000 --- a/vendor/k8s.io/kubectl/pkg/util/term/BUILD +++ /dev/null @@ -1,86 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "resize.go", - "resizeevents.go", - "resizeevents_windows.go", - "term.go", - "term_writer.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/util/term", - importpath = "k8s.io/kubectl/pkg/util/term", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/client-go/tools/remotecommand:go_default_library", - "//staging/src/k8s.io/kubectl/pkg/util/interrupt:go_default_library", - "//vendor/github.com/mitchellh/go-wordwrap:go_default_library", - "//vendor/github.com/moby/term:go_default_library", - ] + select({ - "@io_bazel_rules_go//go/platform:aix": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:android": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:illumos": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:ios": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:js": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "//conditions:default": [], - }), -) - -go_test( - name = "go_default_test", - srcs = ["term_writer_test.go"], - embed = [":go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubectl/pkg/validation/BUILD b/vendor/k8s.io/kubectl/pkg/validation/BUILD deleted file mode 100644 index 5bf5b88c008c..000000000000 --- a/vendor/k8s.io/kubectl/pkg/validation/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["schema.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kubectl/pkg/validation", - importpath = "k8s.io/kubectl/pkg/validation", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//vendor/github.com/exponent-io/jsonpath:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["schema_test.go"], - data = glob(["testdata/**"]), - embed = [":go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubelet/config/v1alpha1/BUILD b/vendor/k8s.io/kubelet/config/v1alpha1/BUILD deleted file mode 100644 index 8a0db88e5a84..000000000000 --- a/vendor/k8s.io/kubelet/config/v1alpha1/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kubelet/config/v1alpha1", - importpath = "k8s.io/kubelet/config/v1alpha1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubelet/config/v1beta1/BUILD b/vendor/k8s.io/kubelet/config/v1beta1/BUILD deleted file mode 100644 index 8cb2ba27c0b4..000000000000 --- a/vendor/k8s.io/kubelet/config/v1beta1/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kubelet/config/v1beta1", - importpath = "k8s.io/kubelet/config/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/component-base/config/v1alpha1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["register_test.go"], - embed = [":go_default_library"], - deps = ["//staging/src/k8s.io/component-base/config/testing:go_default_library"], -) diff --git a/vendor/k8s.io/kubelet/config/v1beta1/types.go b/vendor/k8s.io/kubelet/config/v1beta1/types.go index 2c35b1f2403a..5977d855f22c 100644 --- a/vendor/k8s.io/kubelet/config/v1beta1/types.go +++ b/vendor/k8s.io/kubelet/config/v1beta1/types.go @@ -73,6 +73,13 @@ const ( // PodTopologyManagerScope represents that // topology policy is applied on a per-pod basis. PodTopologyManagerScope = "pod" + // NoneMemoryManagerPolicy is a memory manager none policy, under the none policy + // the memory manager will not pin containers memory of guaranteed pods + NoneMemoryManagerPolicy = "None" + // StaticMemoryManagerPolicy is a memory manager static policy, under the static policy + // the memory manager will try to pin containers memory of guaranteed pods to the smallest + // possible sub-set of NUMA nodes + StaticMemoryManagerPolicy = "Static" ) // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object @@ -333,10 +340,10 @@ type KubeletConfiguration struct { // status to master if node status does not change. Kubelet will ignore this // frequency and post node status immediately if any change is detected. It is // only used when node lease feature is enabled. nodeStatusReportFrequency's - // default value is 1m. But if nodeStatusUpdateFrequency is set explicitly, + // default value is 5m. But if nodeStatusUpdateFrequency is set explicitly, // nodeStatusReportFrequency's default value will be set to // nodeStatusUpdateFrequency for backward compatibility. - // Default: "1m" + // Default: "5m" // +optional NodeStatusReportFrequency metav1.Duration `json:"nodeStatusReportFrequency,omitempty"` // nodeLeaseDurationSeconds is the duration the Kubelet will set on its corresponding Lease, @@ -423,7 +430,7 @@ type KubeletConfiguration struct { // Requires the CPUManager feature gate to be enabled. // Dynamic Kubelet Config (beta): This field should not be updated without a full node // reboot. It is safest to keep this value the same as the local config. - // Default: "none" + // Default: "None" // +optional CPUManagerPolicy string `json:"cpuManagerPolicy,omitempty"` // CPU Manager reconciliation period. @@ -433,6 +440,13 @@ type KubeletConfiguration struct { // Default: "10s" // +optional CPUManagerReconcilePeriod metav1.Duration `json:"cpuManagerReconcilePeriod,omitempty"` + // MemoryManagerPolicy is the name of the policy to use by memory manager. + // Requires the MemoryManager feature gate to be enabled. + // Dynamic Kubelet Config (beta): This field should not be updated without a full node + // reboot. It is safest to keep this value the same as the local config. + // Default: "none" + // +optional + MemoryManagerPolicy string `json:"memoryManagerPolicy,omitempty"` // TopologyManagerPolicy is the name of the policy to use. // Policies other than "none" require the TopologyManager feature gate to be enabled. // Dynamic Kubelet Config (beta): This field should not be updated without a full node @@ -816,14 +830,40 @@ type KubeletConfiguration struct { // +optional EnableSystemLogHandler *bool `json:"enableSystemLogHandler,omitempty"` // ShutdownGracePeriod specifies the total duration that the node should delay the shutdown and total grace period for pod termination during a node shutdown. - // Default: "30s" + // Default: "0s" + // +featureGate=GracefulNodeShutdown // +optional ShutdownGracePeriod metav1.Duration `json:"shutdownGracePeriod,omitempty"` // ShutdownGracePeriodCriticalPods specifies the duration used to terminate critical pods during a node shutdown. This should be less than ShutdownGracePeriod. // For example, if ShutdownGracePeriod=30s, and ShutdownGracePeriodCriticalPods=10s, during a node shutdown the first 20 seconds would be reserved for gracefully terminating normal pods, and the last 10 seconds would be reserved for terminating critical pods. - // Default: "10s" + // Default: "0s" + // +featureGate=GracefulNodeShutdown // +optional ShutdownGracePeriodCriticalPods metav1.Duration `json:"shutdownGracePeriodCriticalPods,omitempty"` + // ReservedMemory specifies a comma-separated list of memory reservations for NUMA nodes. + // The parameter makes sense only in the context of the memory manager feature. The memory manager will not allocate reserved memory for container workloads. + // For example, if you have a NUMA0 with 10Gi of memory and the ReservedMemory was specified to reserve 1Gi of memory at NUMA0, + // the memory manager will assume that only 9Gi is available for allocation. + // You can specify a different amount of NUMA node and memory types. + // You can omit this parameter at all, but you should be aware that the amount of reserved memory from all NUMA nodes + // should be equal to the amount of memory specified by the node allocatable features(https://kubernetes.io/docs/tasks/administer-cluster/reserve-compute-resources/#node-allocatable). + // If at least one node allocatable parameter has a non-zero value, you will need to specify at least one NUMA node. + // Also, avoid specifying: + // 1. Duplicates, the same NUMA node, and memory type, but with a different value. + // 2. zero limits for any memory type. + // 3. NUMAs nodes IDs that do not exist under the machine. + // 4. memory types except for memory and hugepages- + // Default: nil + // +optional + ReservedMemory []MemoryReservation `json:"reservedMemory,omitempty"` + // enableProfilingHandler enables profiling via web interface host:port/debug/pprof/ + // Default: true + // +optional + EnableProfilingHandler *bool `json:"enableProfilingHandler,omitempty"` + // enableDebugFlagsHandler enables flags endpoint via web interface host:port/debug/flags/v + // Default: true + // +optional + EnableDebugFlagsHandler *bool `json:"enableDebugFlagsHandler,omitempty"` } type KubeletAuthorizationMode string @@ -904,3 +944,9 @@ type SerializedNodeConfigSource struct { // +optional Source v1.NodeConfigSource `json:"source,omitempty" protobuf:"bytes,1,opt,name=source"` } + +// MemoryReservation specifies the memory reservation of different types for each NUMA node +type MemoryReservation struct { + NumaNode int32 `json:"numaNode"` + Limits v1.ResourceList `json:"limits"` +} diff --git a/vendor/k8s.io/kubelet/config/v1beta1/zz_generated.deepcopy.go b/vendor/k8s.io/kubelet/config/v1beta1/zz_generated.deepcopy.go index a6ad075c9ad7..cd8b343a9fa1 100644 --- a/vendor/k8s.io/kubelet/config/v1beta1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/kubelet/config/v1beta1/zz_generated.deepcopy.go @@ -21,6 +21,7 @@ limitations under the License. package v1beta1 import ( + corev1 "k8s.io/api/core/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" ) @@ -303,6 +304,23 @@ func (in *KubeletConfiguration) DeepCopyInto(out *KubeletConfiguration) { } out.ShutdownGracePeriod = in.ShutdownGracePeriod out.ShutdownGracePeriodCriticalPods = in.ShutdownGracePeriodCriticalPods + if in.ReservedMemory != nil { + in, out := &in.ReservedMemory, &out.ReservedMemory + *out = make([]MemoryReservation, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.EnableProfilingHandler != nil { + in, out := &in.EnableProfilingHandler, &out.EnableProfilingHandler + *out = new(bool) + **out = **in + } + if in.EnableDebugFlagsHandler != nil { + in, out := &in.EnableDebugFlagsHandler, &out.EnableDebugFlagsHandler + *out = new(bool) + **out = **in + } return } @@ -380,6 +398,29 @@ func (in *KubeletX509Authentication) DeepCopy() *KubeletX509Authentication { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *MemoryReservation) DeepCopyInto(out *MemoryReservation) { + *out = *in + if in.Limits != nil { + in, out := &in.Limits, &out.Limits + *out = make(corev1.ResourceList, len(*in)) + for key, val := range *in { + (*out)[key] = val.DeepCopy() + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MemoryReservation. +func (in *MemoryReservation) DeepCopy() *MemoryReservation { + if in == nil { + return nil + } + out := new(MemoryReservation) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *SerializedNodeConfigSource) DeepCopyInto(out *SerializedNodeConfigSource) { *out = *in diff --git a/vendor/k8s.io/kubelet/pkg/apis/credentialprovider/BUILD b/vendor/k8s.io/kubelet/pkg/apis/credentialprovider/BUILD deleted file mode 100644 index b59f2a3ab232..000000000000 --- a/vendor/k8s.io/kubelet/pkg/apis/credentialprovider/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kubelet/pkg/apis/credentialprovider", - importpath = "k8s.io/kubelet/pkg/apis/credentialprovider", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/kubelet/pkg/apis/credentialprovider/install:all-srcs", - "//staging/src/k8s.io/kubelet/pkg/apis/credentialprovider/v1alpha1:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubelet/pkg/apis/credentialprovider/install/BUILD b/vendor/k8s.io/kubelet/pkg/apis/credentialprovider/install/BUILD deleted file mode 100644 index a85ef4812b90..000000000000 --- a/vendor/k8s.io/kubelet/pkg/apis/credentialprovider/install/BUILD +++ /dev/null @@ -1,29 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["install.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kubelet/pkg/apis/credentialprovider/install", - importpath = "k8s.io/kubelet/pkg/apis/credentialprovider/install", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/kubelet/pkg/apis/credentialprovider:go_default_library", - "//staging/src/k8s.io/kubelet/pkg/apis/credentialprovider/v1alpha1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubelet/pkg/apis/credentialprovider/v1alpha1/BUILD b/vendor/k8s.io/kubelet/pkg/apis/credentialprovider/v1alpha1/BUILD deleted file mode 100644 index d51534dfd393..000000000000 --- a/vendor/k8s.io/kubelet/pkg/apis/credentialprovider/v1alpha1/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "types.go", - "zz_generated.conversion.go", - "zz_generated.deepcopy.go", - "zz_generated.defaults.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kubelet/pkg/apis/credentialprovider/v1alpha1", - importpath = "k8s.io/kubelet/pkg/apis/credentialprovider/v1alpha1", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/kubelet/pkg/apis/credentialprovider:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubelet/pkg/apis/deviceplugin/v1beta1/BUILD b/vendor/k8s.io/kubelet/pkg/apis/deviceplugin/v1beta1/BUILD deleted file mode 100644 index 85b6411943e0..000000000000 --- a/vendor/k8s.io/kubelet/pkg/apis/deviceplugin/v1beta1/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "api.pb.go", - "constants.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kubelet/pkg/apis/deviceplugin/v1beta1", - importpath = "k8s.io/kubelet/pkg/apis/deviceplugin/v1beta1", - deps = [ - "//vendor/github.com/gogo/protobuf/gogoproto:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - "//vendor/google.golang.org/grpc:go_default_library", - "//vendor/google.golang.org/grpc/codes:go_default_library", - "//vendor/google.golang.org/grpc/status:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubelet/pkg/apis/deviceplugin/v1beta1/api.pb.go b/vendor/k8s.io/kubelet/pkg/apis/deviceplugin/v1beta1/api.pb.go index 5f0ff254fe52..34361f343fc8 100644 --- a/vendor/k8s.io/kubelet/pkg/apis/deviceplugin/v1beta1/api.pb.go +++ b/vendor/k8s.io/kubelet/pkg/apis/deviceplugin/v1beta1/api.pb.go @@ -2979,10 +2979,7 @@ func (m *DevicePluginOptions) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -3164,10 +3161,7 @@ func (m *RegisterRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -3217,10 +3211,7 @@ func (m *Empty) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -3304,10 +3295,7 @@ func (m *ListAndWatchResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -3391,10 +3379,7 @@ func (m *TopologyInfo) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -3463,10 +3448,7 @@ func (m *NUMANode) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -3616,10 +3598,7 @@ func (m *Device) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -3701,10 +3680,7 @@ func (m *PreStartContainerRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -3754,10 +3730,7 @@ func (m *PreStartContainerResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -3841,10 +3814,7 @@ func (m *PreferredAllocationRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -3977,10 +3947,7 @@ func (m *ContainerPreferredAllocationRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -4064,10 +4031,7 @@ func (m *PreferredAllocationResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -4149,10 +4113,7 @@ func (m *ContainerPreferredAllocationResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -4236,10 +4197,7 @@ func (m *AllocateRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -4321,10 +4279,7 @@ func (m *ContainerAllocateRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -4408,10 +4363,7 @@ func (m *AllocateResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -4571,7 +4523,7 @@ func (m *ContainerAllocateResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > postIndex { @@ -4766,7 +4718,7 @@ func (m *ContainerAllocateResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > postIndex { @@ -4783,10 +4735,7 @@ func (m *ContainerAllocateResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -4920,10 +4869,7 @@ func (m *Mount) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -5069,10 +5015,7 @@ func (m *DeviceSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/kubelet/pkg/apis/deviceplugin/v1beta1/constants.go b/vendor/k8s.io/kubelet/pkg/apis/deviceplugin/v1beta1/constants.go index 4c40f21240e1..3bed21480331 100644 --- a/vendor/k8s.io/kubelet/pkg/apis/deviceplugin/v1beta1/constants.go +++ b/vendor/k8s.io/kubelet/pkg/apis/deviceplugin/v1beta1/constants.go @@ -30,7 +30,17 @@ const ( DevicePluginPath = "/var/lib/kubelet/device-plugins/" // KubeletSocket is the path of the Kubelet registry socket KubeletSocket = DevicePluginPath + "kubelet.sock" + + // DevicePluginPathWindows Avoid failed to run Kubelet: bad socketPath, + // must be an absolute path: /var/lib/kubelet/device-plugins/kubelet.sock + // https://github.com/kubernetes/kubernetes/issues/93262 + // https://github.com/kubernetes/kubernetes/pull/93285#discussion_r458140701 + DevicePluginPathWindows = "\\var\\lib\\kubelet\\device-plugins\\" + // KubeletSocketWindows is the path of the Kubelet registry socket on windows + KubeletSocketWindows = DevicePluginPathWindows + "kubelet.sock" + // KubeletPreStartContainerRPCTimeoutInSecs is the timeout duration in secs for PreStartContainer RPC + // Timeout duration in secs for PreStartContainer RPC KubeletPreStartContainerRPCTimeoutInSecs = 30 ) diff --git a/vendor/k8s.io/kubelet/pkg/apis/pluginregistration/v1/BUILD b/vendor/k8s.io/kubelet/pkg/apis/pluginregistration/v1/BUILD deleted file mode 100644 index 0ea7e6ec74b9..000000000000 --- a/vendor/k8s.io/kubelet/pkg/apis/pluginregistration/v1/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "api.pb.go", - "constants.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kubelet/pkg/apis/pluginregistration/v1", - importpath = "k8s.io/kubelet/pkg/apis/pluginregistration/v1", - deps = [ - "//vendor/github.com/gogo/protobuf/gogoproto:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/golang.org/x/net/context:go_default_library", - "//vendor/google.golang.org/grpc:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubelet/pkg/apis/podresources/v1/BUILD b/vendor/k8s.io/kubelet/pkg/apis/podresources/v1/BUILD deleted file mode 100644 index 8b57794062f0..000000000000 --- a/vendor/k8s.io/kubelet/pkg/apis/podresources/v1/BUILD +++ /dev/null @@ -1,30 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["api.pb.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kubelet/pkg/apis/podresources/v1", - importpath = "k8s.io/kubelet/pkg/apis/podresources/v1", - visibility = ["//visibility:public"], - deps = [ - "//vendor/github.com/gogo/protobuf/gogoproto:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/google.golang.org/grpc:go_default_library", - "//vendor/google.golang.org/grpc/codes:go_default_library", - "//vendor/google.golang.org/grpc/status:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubelet/pkg/apis/podresources/v1/api.pb.go b/vendor/k8s.io/kubelet/pkg/apis/podresources/v1/api.pb.go index 961027e556e6..059cef05eeec 100644 --- a/vendor/k8s.io/kubelet/pkg/apis/podresources/v1/api.pb.go +++ b/vendor/k8s.io/kubelet/pkg/apis/podresources/v1/api.pb.go @@ -45,6 +45,97 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package +type AllocatableResourcesRequest struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *AllocatableResourcesRequest) Reset() { *m = AllocatableResourcesRequest{} } +func (*AllocatableResourcesRequest) ProtoMessage() {} +func (*AllocatableResourcesRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_00212fb1f9d3bf1c, []int{0} +} +func (m *AllocatableResourcesRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *AllocatableResourcesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_AllocatableResourcesRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *AllocatableResourcesRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_AllocatableResourcesRequest.Merge(m, src) +} +func (m *AllocatableResourcesRequest) XXX_Size() int { + return m.Size() +} +func (m *AllocatableResourcesRequest) XXX_DiscardUnknown() { + xxx_messageInfo_AllocatableResourcesRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_AllocatableResourcesRequest proto.InternalMessageInfo + +// AllocatableResourcesResponses contains informations about all the devices known by the kubelet +type AllocatableResourcesResponse struct { + Devices []*ContainerDevices `protobuf:"bytes,1,rep,name=devices,proto3" json:"devices,omitempty"` + CpuIds []int64 `protobuf:"varint,2,rep,packed,name=cpu_ids,json=cpuIds,proto3" json:"cpu_ids,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *AllocatableResourcesResponse) Reset() { *m = AllocatableResourcesResponse{} } +func (*AllocatableResourcesResponse) ProtoMessage() {} +func (*AllocatableResourcesResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_00212fb1f9d3bf1c, []int{1} +} +func (m *AllocatableResourcesResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *AllocatableResourcesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_AllocatableResourcesResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *AllocatableResourcesResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_AllocatableResourcesResponse.Merge(m, src) +} +func (m *AllocatableResourcesResponse) XXX_Size() int { + return m.Size() +} +func (m *AllocatableResourcesResponse) XXX_DiscardUnknown() { + xxx_messageInfo_AllocatableResourcesResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_AllocatableResourcesResponse proto.InternalMessageInfo + +func (m *AllocatableResourcesResponse) GetDevices() []*ContainerDevices { + if m != nil { + return m.Devices + } + return nil +} + +func (m *AllocatableResourcesResponse) GetCpuIds() []int64 { + if m != nil { + return m.CpuIds + } + return nil +} + // ListPodResourcesRequest is the request made to the PodResourcesLister service type ListPodResourcesRequest struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -54,7 +145,7 @@ type ListPodResourcesRequest struct { func (m *ListPodResourcesRequest) Reset() { *m = ListPodResourcesRequest{} } func (*ListPodResourcesRequest) ProtoMessage() {} func (*ListPodResourcesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_00212fb1f9d3bf1c, []int{0} + return fileDescriptor_00212fb1f9d3bf1c, []int{2} } func (m *ListPodResourcesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -93,7 +184,7 @@ type ListPodResourcesResponse struct { func (m *ListPodResourcesResponse) Reset() { *m = ListPodResourcesResponse{} } func (*ListPodResourcesResponse) ProtoMessage() {} func (*ListPodResourcesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_00212fb1f9d3bf1c, []int{1} + return fileDescriptor_00212fb1f9d3bf1c, []int{3} } func (m *ListPodResourcesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -141,7 +232,7 @@ type PodResources struct { func (m *PodResources) Reset() { *m = PodResources{} } func (*PodResources) ProtoMessage() {} func (*PodResources) Descriptor() ([]byte, []int) { - return fileDescriptor_00212fb1f9d3bf1c, []int{2} + return fileDescriptor_00212fb1f9d3bf1c, []int{4} } func (m *PodResources) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -203,7 +294,7 @@ type ContainerResources struct { func (m *ContainerResources) Reset() { *m = ContainerResources{} } func (*ContainerResources) ProtoMessage() {} func (*ContainerResources) Descriptor() ([]byte, []int) { - return fileDescriptor_00212fb1f9d3bf1c, []int{3} + return fileDescriptor_00212fb1f9d3bf1c, []int{5} } func (m *ContainerResources) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -265,7 +356,7 @@ type ContainerDevices struct { func (m *ContainerDevices) Reset() { *m = ContainerDevices{} } func (*ContainerDevices) ProtoMessage() {} func (*ContainerDevices) Descriptor() ([]byte, []int) { - return fileDescriptor_00212fb1f9d3bf1c, []int{4} + return fileDescriptor_00212fb1f9d3bf1c, []int{6} } func (m *ContainerDevices) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -325,7 +416,7 @@ type TopologyInfo struct { func (m *TopologyInfo) Reset() { *m = TopologyInfo{} } func (*TopologyInfo) ProtoMessage() {} func (*TopologyInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_00212fb1f9d3bf1c, []int{5} + return fileDescriptor_00212fb1f9d3bf1c, []int{7} } func (m *TopologyInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -371,7 +462,7 @@ type NUMANode struct { func (m *NUMANode) Reset() { *m = NUMANode{} } func (*NUMANode) ProtoMessage() {} func (*NUMANode) Descriptor() ([]byte, []int) { - return fileDescriptor_00212fb1f9d3bf1c, []int{6} + return fileDescriptor_00212fb1f9d3bf1c, []int{8} } func (m *NUMANode) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -408,6 +499,8 @@ func (m *NUMANode) GetID() int64 { } func init() { + proto.RegisterType((*AllocatableResourcesRequest)(nil), "v1.AllocatableResourcesRequest") + proto.RegisterType((*AllocatableResourcesResponse)(nil), "v1.AllocatableResourcesResponse") proto.RegisterType((*ListPodResourcesRequest)(nil), "v1.ListPodResourcesRequest") proto.RegisterType((*ListPodResourcesResponse)(nil), "v1.ListPodResourcesResponse") proto.RegisterType((*PodResources)(nil), "v1.PodResources") @@ -420,34 +513,37 @@ func init() { func init() { proto.RegisterFile("api.proto", fileDescriptor_00212fb1f9d3bf1c) } var fileDescriptor_00212fb1f9d3bf1c = []byte{ - // 424 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x52, 0xc1, 0x6e, 0xd3, 0x40, - 0x10, 0xcd, 0xda, 0xa5, 0xad, 0x07, 0x17, 0x55, 0x2b, 0x44, 0x4d, 0x08, 0x56, 0xb4, 0x5c, 0x7a, - 0x00, 0x57, 0x0d, 0x82, 0x3b, 0x34, 0x17, 0x4b, 0x10, 0xc1, 0x0a, 0x0e, 0x9c, 0x22, 0xc7, 0xbb, - 0x35, 0x96, 0xa8, 0x67, 0xeb, 0xb5, 0x23, 0xb8, 0x71, 0xe0, 0x03, 0xf8, 0xac, 0x1e, 0x39, 0x72, - 0xa4, 0xe6, 0x47, 0xd0, 0xae, 0x71, 0xe3, 0x90, 0x70, 0xf2, 0xcc, 0x7b, 0x33, 0xef, 0x8d, 0x77, - 0x06, 0xbc, 0x44, 0xe5, 0x91, 0x2a, 0xb1, 0x42, 0xea, 0x2c, 0x4f, 0x87, 0x4f, 0xb2, 0xbc, 0xfa, - 0x58, 0x2f, 0xa2, 0x14, 0x2f, 0x4e, 0x32, 0xcc, 0xf0, 0xc4, 0x52, 0x8b, 0xfa, 0xdc, 0x66, 0x36, - 0xb1, 0x51, 0xdb, 0xc2, 0xee, 0xc3, 0xd1, 0xab, 0x5c, 0x57, 0x6f, 0x50, 0x70, 0xa9, 0xb1, 0x2e, - 0x53, 0xa9, 0xb9, 0xbc, 0xac, 0xa5, 0xae, 0xd8, 0x5b, 0x08, 0x36, 0x29, 0xad, 0xb0, 0xd0, 0x92, - 0x3e, 0x83, 0x03, 0x85, 0x62, 0x5e, 0x76, 0x44, 0x40, 0xc6, 0xee, 0xf1, 0xed, 0xc9, 0x61, 0xb4, - 0x3c, 0x8d, 0xd6, 0x1a, 0x7c, 0xd5, 0xcb, 0xd8, 0x67, 0xf0, 0xfb, 0x2c, 0xa5, 0xb0, 0x53, 0x24, - 0x17, 0x32, 0x20, 0x63, 0x72, 0xec, 0x71, 0x1b, 0xd3, 0x11, 0x78, 0xe6, 0xab, 0x55, 0x92, 0xca, - 0xc0, 0xb1, 0xc4, 0x0a, 0xa0, 0xcf, 0x01, 0x52, 0x2c, 0xaa, 0x24, 0x2f, 0x64, 0xa9, 0x03, 0xd7, - 0xba, 0xde, 0x33, 0xae, 0x67, 0x1d, 0xba, 0xf2, 0xee, 0x55, 0xb2, 0x4b, 0xa0, 0x9b, 0x15, 0x5b, - 0xfd, 0x23, 0xd8, 0x13, 0x72, 0x99, 0x9b, 0x9f, 0x72, 0xac, 0xfc, 0xdd, 0x35, 0xf9, 0x69, 0xcb, - 0xf1, 0xae, 0x88, 0x1e, 0xc1, 0x5e, 0xaa, 0xea, 0x79, 0x2e, 0xda, 0x71, 0x5c, 0xbe, 0x9b, 0xaa, - 0x3a, 0x16, 0x9a, 0x7d, 0x23, 0x70, 0xf8, 0x6f, 0x1b, 0x7d, 0x04, 0x07, 0xdd, 0xa3, 0xcd, 0x7b, - 0xd6, 0x7e, 0x07, 0xce, 0xcc, 0x08, 0x0f, 0x01, 0x5a, 0x75, 0xab, 0x6a, 0xa6, 0xf0, 0xb8, 0xd7, - 0x22, 0xb1, 0xd0, 0xf4, 0x31, 0xec, 0x57, 0xa8, 0xf0, 0x13, 0x66, 0x5f, 0x02, 0x77, 0x4c, 0xba, - 0x77, 0x7f, 0xf7, 0x17, 0x8b, 0x8b, 0x73, 0xe4, 0x37, 0x15, 0x6c, 0x02, 0x7e, 0x9f, 0xa1, 0x0c, - 0x6e, 0x15, 0x28, 0x6e, 0x56, 0xe6, 0x9b, 0xd6, 0xd9, 0xfb, 0xd7, 0x2f, 0x66, 0x28, 0x24, 0x6f, - 0x29, 0x36, 0x84, 0xfd, 0x0e, 0xa2, 0x77, 0xc0, 0x89, 0xa7, 0x76, 0x4c, 0x97, 0x3b, 0xf9, 0x74, - 0xf2, 0x01, 0x68, 0x7f, 0x87, 0xe6, 0x44, 0x64, 0x49, 0xcf, 0x60, 0xc7, 0x44, 0xf4, 0x81, 0x91, - 0xfb, 0xcf, 0x45, 0x0d, 0x47, 0xdb, 0xc9, 0xf6, 0xa6, 0xd8, 0xe0, 0xe5, 0xe8, 0xea, 0x3a, 0x24, - 0x3f, 0xaf, 0xc3, 0xc1, 0xd7, 0x26, 0x24, 0x57, 0x4d, 0x48, 0x7e, 0x34, 0x21, 0xf9, 0xd5, 0x84, - 0xe4, 0xfb, 0xef, 0x70, 0xb0, 0xd8, 0xb5, 0x17, 0xfb, 0xf4, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, - 0x34, 0x5b, 0xe8, 0xc9, 0xf1, 0x02, 0x00, 0x00, + // 479 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x93, 0xcd, 0x6e, 0xd3, 0x40, + 0x10, 0x80, 0xb3, 0x76, 0x69, 0xeb, 0xc1, 0x45, 0xd5, 0x0a, 0x11, 0x93, 0xa6, 0xc6, 0x5a, 0x2e, + 0x39, 0x80, 0xab, 0x06, 0xc1, 0xbd, 0x34, 0x12, 0x8a, 0x04, 0x11, 0xac, 0xe0, 0x4a, 0xe4, 0xd8, + 0x5b, 0x63, 0x29, 0xf5, 0x6c, 0xbd, 0x76, 0x04, 0x37, 0x0e, 0x3c, 0x00, 0xaf, 0xc3, 0x1b, 0xf4, + 0xc8, 0x91, 0x23, 0x0d, 0x2f, 0x82, 0xbc, 0x8e, 0x53, 0x87, 0xa4, 0x48, 0x3d, 0x79, 0x66, 0xbe, + 0xf9, 0xf3, 0xcc, 0x2c, 0x58, 0x81, 0x4c, 0x7c, 0x99, 0x61, 0x8e, 0xd4, 0x98, 0x1d, 0x77, 0x9e, + 0xc6, 0x49, 0xfe, 0xa9, 0x98, 0xf8, 0x21, 0x9e, 0x1f, 0xc5, 0x18, 0xe3, 0x91, 0x46, 0x93, 0xe2, + 0x4c, 0x6b, 0x5a, 0xd1, 0x52, 0x15, 0xc2, 0x0e, 0xe1, 0xe0, 0x64, 0x3a, 0xc5, 0x30, 0xc8, 0x83, + 0xc9, 0x54, 0x70, 0xa1, 0xb0, 0xc8, 0x42, 0xa1, 0xb8, 0xb8, 0x28, 0x84, 0xca, 0x59, 0x0c, 0xdd, + 0xcd, 0x58, 0x49, 0x4c, 0x95, 0xa0, 0x3e, 0xec, 0x44, 0x62, 0x96, 0x84, 0x42, 0x39, 0xc4, 0x33, + 0x7b, 0x77, 0xfb, 0xf7, 0xfd, 0xd9, 0xb1, 0x7f, 0x8a, 0x69, 0x1e, 0x24, 0xa9, 0xc8, 0x06, 0x15, + 0xe3, 0xb5, 0x13, 0x6d, 0xc3, 0x4e, 0x28, 0x8b, 0x71, 0x12, 0x29, 0xc7, 0xf0, 0xcc, 0x9e, 0xc9, + 0xb7, 0x43, 0x59, 0x0c, 0x23, 0xc5, 0x1e, 0x42, 0xfb, 0x75, 0xa2, 0xf2, 0xb7, 0x18, 0xad, 0xf5, + 0xf0, 0x0e, 0x9c, 0x75, 0xb4, 0xa8, 0xff, 0x1c, 0xf6, 0x24, 0x46, 0xe3, 0xac, 0x06, 0x8b, 0x2e, + 0xf6, 0xcb, 0x2e, 0x56, 0x02, 0x6c, 0xd9, 0xd0, 0xd8, 0x67, 0xb0, 0x9b, 0x94, 0x52, 0xd8, 0x4a, + 0x83, 0x73, 0xe1, 0x10, 0x8f, 0xf4, 0x2c, 0xae, 0x65, 0xda, 0x05, 0xab, 0xfc, 0x2a, 0x19, 0x84, + 0xc2, 0x31, 0x34, 0xb8, 0x36, 0xd0, 0x17, 0x00, 0x61, 0xfd, 0x97, 0xca, 0x31, 0x75, 0xd5, 0x07, + 0x2b, 0xff, 0x7e, 0x5d, 0xbb, 0xe1, 0xc9, 0x2e, 0x80, 0xae, 0x7b, 0x6c, 0xac, 0xdf, 0x18, 0xad, + 0x71, 0xcb, 0xd1, 0x9a, 0x2b, 0xa3, 0xfd, 0x46, 0x60, 0xff, 0xdf, 0x30, 0xfa, 0x18, 0xf6, 0xea, + 0xa1, 0x8d, 0x1b, 0xa5, 0xed, 0xda, 0x38, 0x2a, 0x5b, 0x38, 0x04, 0xa8, 0xb2, 0x2f, 0x17, 0x66, + 0x71, 0xab, 0xb2, 0x0c, 0x23, 0x45, 0x9f, 0xc0, 0x6e, 0x8e, 0x12, 0xa7, 0x18, 0x7f, 0x71, 0x4c, + 0x8f, 0xd4, 0x73, 0x7f, 0xbf, 0xb0, 0x0d, 0xd3, 0x33, 0xe4, 0x4b, 0x0f, 0xd6, 0x07, 0xbb, 0x49, + 0x28, 0x83, 0x3b, 0x29, 0x46, 0xcb, 0x95, 0xd9, 0x65, 0xe8, 0xe8, 0xc3, 0x9b, 0x93, 0x11, 0x46, + 0x82, 0x57, 0x88, 0x75, 0x60, 0xb7, 0x36, 0xd1, 0x7b, 0x60, 0x0c, 0x07, 0xba, 0x4d, 0x93, 0x1b, + 0xc9, 0xa0, 0xff, 0x83, 0x00, 0x6d, 0x2e, 0xb1, 0xbc, 0x11, 0x91, 0xd1, 0x53, 0xd8, 0x2a, 0x25, + 0x7a, 0x50, 0xe6, 0xbb, 0xe1, 0xa4, 0x3a, 0xdd, 0xcd, 0xb0, 0x3a, 0x2a, 0xd6, 0xa2, 0x1f, 0xa1, + 0xfd, 0x4a, 0xe4, 0x9b, 0x2e, 0x9f, 0x3e, 0x2a, 0x43, 0xff, 0xf3, 0x64, 0x3a, 0xde, 0xcd, 0x0e, + 0x75, 0xfe, 0x97, 0xdd, 0xcb, 0x2b, 0x97, 0xfc, 0xba, 0x72, 0x5b, 0x5f, 0xe7, 0x2e, 0xb9, 0x9c, + 0xbb, 0xe4, 0xe7, 0xdc, 0x25, 0xbf, 0xe7, 0x2e, 0xf9, 0xfe, 0xc7, 0x6d, 0x4d, 0xb6, 0xf5, 0xd3, + 0x7c, 0xf6, 0x37, 0x00, 0x00, 0xff, 0xff, 0x34, 0xba, 0xac, 0xa0, 0xda, 0x03, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -463,6 +559,7 @@ const _ = grpc.SupportPackageIsVersion4 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. type PodResourcesListerClient interface { List(ctx context.Context, in *ListPodResourcesRequest, opts ...grpc.CallOption) (*ListPodResourcesResponse, error) + GetAllocatableResources(ctx context.Context, in *AllocatableResourcesRequest, opts ...grpc.CallOption) (*AllocatableResourcesResponse, error) } type podResourcesListerClient struct { @@ -482,9 +579,19 @@ func (c *podResourcesListerClient) List(ctx context.Context, in *ListPodResource return out, nil } +func (c *podResourcesListerClient) GetAllocatableResources(ctx context.Context, in *AllocatableResourcesRequest, opts ...grpc.CallOption) (*AllocatableResourcesResponse, error) { + out := new(AllocatableResourcesResponse) + err := c.cc.Invoke(ctx, "/v1.PodResourcesLister/GetAllocatableResources", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // PodResourcesListerServer is the server API for PodResourcesLister service. type PodResourcesListerServer interface { List(context.Context, *ListPodResourcesRequest) (*ListPodResourcesResponse, error) + GetAllocatableResources(context.Context, *AllocatableResourcesRequest) (*AllocatableResourcesResponse, error) } // UnimplementedPodResourcesListerServer can be embedded to have forward compatible implementations. @@ -494,6 +601,9 @@ type UnimplementedPodResourcesListerServer struct { func (*UnimplementedPodResourcesListerServer) List(ctx context.Context, req *ListPodResourcesRequest) (*ListPodResourcesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method List not implemented") } +func (*UnimplementedPodResourcesListerServer) GetAllocatableResources(ctx context.Context, req *AllocatableResourcesRequest) (*AllocatableResourcesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetAllocatableResources not implemented") +} func RegisterPodResourcesListerServer(s *grpc.Server, srv PodResourcesListerServer) { s.RegisterService(&_PodResourcesLister_serviceDesc, srv) @@ -517,6 +627,24 @@ func _PodResourcesLister_List_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } +func _PodResourcesLister_GetAllocatableResources_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AllocatableResourcesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(PodResourcesListerServer).GetAllocatableResources(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/v1.PodResourcesLister/GetAllocatableResources", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(PodResourcesListerServer).GetAllocatableResources(ctx, req.(*AllocatableResourcesRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _PodResourcesLister_serviceDesc = grpc.ServiceDesc{ ServiceName: "v1.PodResourcesLister", HandlerType: (*PodResourcesListerServer)(nil), @@ -525,11 +653,94 @@ var _PodResourcesLister_serviceDesc = grpc.ServiceDesc{ MethodName: "List", Handler: _PodResourcesLister_List_Handler, }, + { + MethodName: "GetAllocatableResources", + Handler: _PodResourcesLister_GetAllocatableResources_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "api.proto", } +func (m *AllocatableResourcesRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AllocatableResourcesRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *AllocatableResourcesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *AllocatableResourcesResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AllocatableResourcesResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *AllocatableResourcesResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.CpuIds) > 0 { + dAtA2 := make([]byte, len(m.CpuIds)*10) + var j1 int + for _, num1 := range m.CpuIds { + num := uint64(num1) + for num >= 1<<7 { + dAtA2[j1] = uint8(uint64(num)&0x7f | 0x80) + num >>= 7 + j1++ + } + dAtA2[j1] = uint8(num) + j1++ + } + i -= j1 + copy(dAtA[i:], dAtA2[:j1]) + i = encodeVarintApi(dAtA, i, uint64(j1)) + i-- + dAtA[i] = 0x12 + } + if len(m.Devices) > 0 { + for iNdEx := len(m.Devices) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Devices[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintApi(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + func (m *ListPodResourcesRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -662,21 +873,21 @@ func (m *ContainerResources) MarshalToSizedBuffer(dAtA []byte) (int, error) { var l int _ = l if len(m.CpuIds) > 0 { - dAtA2 := make([]byte, len(m.CpuIds)*10) - var j1 int + dAtA4 := make([]byte, len(m.CpuIds)*10) + var j3 int for _, num1 := range m.CpuIds { num := uint64(num1) for num >= 1<<7 { - dAtA2[j1] = uint8(uint64(num)&0x7f | 0x80) + dAtA4[j3] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j1++ + j3++ } - dAtA2[j1] = uint8(num) - j1++ + dAtA4[j3] = uint8(num) + j3++ } - i -= j1 - copy(dAtA[i:], dAtA2[:j1]) - i = encodeVarintApi(dAtA, i, uint64(j1)) + i -= j3 + copy(dAtA[i:], dAtA4[:j3]) + i = encodeVarintApi(dAtA, i, uint64(j3)) i-- dAtA[i] = 0x1a } @@ -831,6 +1042,37 @@ func encodeVarintApi(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return base } +func (m *AllocatableResourcesRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *AllocatableResourcesResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Devices) > 0 { + for _, e := range m.Devices { + l = e.Size() + n += 1 + l + sovApi(uint64(l)) + } + } + if len(m.CpuIds) > 0 { + l = 0 + for _, e := range m.CpuIds { + l += sovApi(uint64(e)) + } + n += 1 + sovApi(uint64(l)) + l + } + return n +} + func (m *ListPodResourcesRequest) Size() (n int) { if m == nil { return 0 @@ -960,6 +1202,31 @@ func sovApi(x uint64) (n int) { func sozApi(x uint64) (n int) { return sovApi(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } +func (this *AllocatableResourcesRequest) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&AllocatableResourcesRequest{`, + `}`, + }, "") + return s +} +func (this *AllocatableResourcesResponse) String() string { + if this == nil { + return "nil" + } + repeatedStringForDevices := "[]*ContainerDevices{" + for _, f := range this.Devices { + repeatedStringForDevices += strings.Replace(f.String(), "ContainerDevices", "ContainerDevices", 1) + "," + } + repeatedStringForDevices += "}" + s := strings.Join([]string{`&AllocatableResourcesResponse{`, + `Devices:` + repeatedStringForDevices + `,`, + `CpuIds:` + fmt.Sprintf("%v", this.CpuIds) + `,`, + `}`, + }, "") + return s +} func (this *ListPodResourcesRequest) String() string { if this == nil { return "nil" @@ -1063,6 +1330,216 @@ func valueToStringApi(v interface{}) string { pv := reflect.Indirect(rv).Interface() return fmt.Sprintf("*%v", pv) } +func (m *AllocatableResourcesRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AllocatableResourcesRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AllocatableResourcesRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipApi(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthApi + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AllocatableResourcesResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AllocatableResourcesResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AllocatableResourcesResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Devices", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthApi + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthApi + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Devices = append(m.Devices, &ContainerDevices{}) + if err := m.Devices[len(m.Devices)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType == 0 { + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.CpuIds = append(m.CpuIds, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return ErrInvalidLengthApi + } + postIndex := iNdEx + packedLen + if postIndex < 0 { + return ErrInvalidLengthApi + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var elementCount int + var count int + for _, integer := range dAtA[iNdEx:postIndex] { + if integer < 128 { + count++ + } + } + elementCount = count + if elementCount != 0 && len(m.CpuIds) == 0 { + m.CpuIds = make([]int64, 0, elementCount) + } + for iNdEx < postIndex { + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.CpuIds = append(m.CpuIds, v) + } + } else { + return fmt.Errorf("proto: wrong wireType = %d for field CpuIds", wireType) + } + default: + iNdEx = preIndex + skippy, err := skipApi(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthApi + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *ListPodResourcesRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -1098,10 +1575,7 @@ func (m *ListPodResourcesRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -1185,10 +1659,7 @@ func (m *ListPodResourcesResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -1336,10 +1807,7 @@ func (m *PodResources) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -1531,10 +1999,7 @@ func (m *ContainerResources) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -1684,10 +2149,7 @@ func (m *ContainerDevices) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -1771,10 +2233,7 @@ func (m *TopologyInfo) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -1843,10 +2302,7 @@ func (m *NUMANode) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/kubelet/pkg/apis/podresources/v1/api.proto b/vendor/k8s.io/kubelet/pkg/apis/podresources/v1/api.proto index cd8dbeaf9579..a05c5fd5605a 100644 --- a/vendor/k8s.io/kubelet/pkg/apis/podresources/v1/api.proto +++ b/vendor/k8s.io/kubelet/pkg/apis/podresources/v1/api.proto @@ -18,6 +18,15 @@ option (gogoproto.goproto_unrecognized_all) = false; // node resources consumed by pods and containers on the node service PodResourcesLister { rpc List(ListPodResourcesRequest) returns (ListPodResourcesResponse) {} + rpc GetAllocatableResources(AllocatableResourcesRequest) returns (AllocatableResourcesResponse) {} +} + +message AllocatableResourcesRequest {} + +// AllocatableResourcesResponses contains informations about all the devices known by the kubelet +message AllocatableResourcesResponse { + repeated ContainerDevices devices = 1; + repeated int64 cpu_ids = 2; } // ListPodResourcesRequest is the request made to the PodResourcesLister service diff --git a/vendor/k8s.io/kubelet/pkg/apis/podresources/v1alpha1/BUILD b/vendor/k8s.io/kubelet/pkg/apis/podresources/v1alpha1/BUILD deleted file mode 100644 index f82f61759af6..000000000000 --- a/vendor/k8s.io/kubelet/pkg/apis/podresources/v1alpha1/BUILD +++ /dev/null @@ -1,30 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["api.pb.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kubelet/pkg/apis/podresources/v1alpha1", - importpath = "k8s.io/kubelet/pkg/apis/podresources/v1alpha1", - visibility = ["//visibility:public"], - deps = [ - "//vendor/github.com/gogo/protobuf/gogoproto:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/google.golang.org/grpc:go_default_library", - "//vendor/google.golang.org/grpc/codes:go_default_library", - "//vendor/google.golang.org/grpc/status:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubelet/pkg/apis/stats/v1alpha1/BUILD b/vendor/k8s.io/kubelet/pkg/apis/stats/v1alpha1/BUILD deleted file mode 100644 index d408b79f66f4..000000000000 --- a/vendor/k8s.io/kubelet/pkg/apis/stats/v1alpha1/BUILD +++ /dev/null @@ -1,27 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["types.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/kubelet/pkg/apis/stats/v1alpha1", - importpath = "k8s.io/kubelet/pkg/apis/stats/v1alpha1", - deps = ["//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/well_known_labels.go b/vendor/k8s.io/kubelet/pkg/apis/well_known_labels.go similarity index 100% rename from vendor/k8s.io/kubernetes/pkg/kubelet/apis/well_known_labels.go rename to vendor/k8s.io/kubelet/pkg/apis/well_known_labels.go diff --git a/vendor/k8s.io/kubernetes/cmd/kube-apiserver/app/BUILD b/vendor/k8s.io/kubernetes/cmd/kube-apiserver/app/BUILD deleted file mode 100644 index bf45bdb09a3f..000000000000 --- a/vendor/k8s.io/kubernetes/cmd/kube-apiserver/app/BUILD +++ /dev/null @@ -1,102 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "aggregator.go", - "apiextensions.go", - "server.go", - ], - importpath = "k8s.io/kubernetes/cmd/kube-apiserver/app", - visibility = ["//visibility:public"], - deps = [ - "//cmd/kube-apiserver/app/options:go_default_library", - "//pkg/api/legacyscheme:go_default_library", - "//pkg/capabilities:go_default_library", - "//pkg/controlplane:go_default_library", - "//pkg/controlplane/controller/crdregistration:go_default_library", - "//pkg/controlplane/reconcilers:go_default_library", - "//pkg/controlplane/tunneler:go_default_library", - "//pkg/features:go_default_library", - "//pkg/generated/openapi:go_default_library", - "//pkg/kubeapiserver:go_default_library", - "//pkg/kubeapiserver/admission:go_default_library", - "//pkg/kubeapiserver/authenticator:go_default_library", - "//pkg/kubeapiserver/authorizer/modes:go_default_library", - "//pkg/registry/rbac/rest:go_default_library", - "//pkg/serviceaccount:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/cmd/server/options:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/openapi:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/features:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/egressselector:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/filters:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/healthz:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/options:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/storage:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/preflight:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/webhook:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/util/keyutil:go_default_library", - "//staging/src/k8s.io/cloud-provider:go_default_library", - "//staging/src/k8s.io/component-base/cli/flag:go_default_library", - "//staging/src/k8s.io/component-base/cli/globalflag:go_default_library", - "//staging/src/k8s.io/component-base/metrics/prometheus/workqueue:go_default_library", - "//staging/src/k8s.io/component-base/term:go_default_library", - "//staging/src/k8s.io/component-base/version:go_default_library", - "//staging/src/k8s.io/component-base/version/verflag:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1/helper:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apiserver:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apiserver/scheme:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/typed/apiregistration/v1:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/client/informers/externalversions/apiregistration/v1:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/controllers/autoregister:go_default_library", - "//vendor/github.com/spf13/cobra:go_default_library", - "//vendor/github.com/spf13/pflag:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["server_test.go"], - embed = [":go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//cmd/kube-apiserver/app/options:all-srcs", - "//cmd/kube-apiserver/app/testing:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/cmd/kube-apiserver/app/aggregator.go b/vendor/k8s.io/kubernetes/cmd/kube-apiserver/app/aggregator.go index 4289ce48d8fe..5ba5184f9226 100644 --- a/vendor/k8s.io/kubernetes/cmd/kube-apiserver/app/aggregator.go +++ b/vendor/k8s.io/kubernetes/cmd/kube-apiserver/app/aggregator.go @@ -67,6 +67,9 @@ func createAggregatorConfig( genericConfig := kubeAPIServerConfig genericConfig.PostStartHooks = map[string]genericapiserver.PostStartHookConfigEntry{} genericConfig.RESTOptionsGetter = nil + // prevent generic API server from installing the OpenAPI handler. Aggregator server + // has its own customized OpenAPI handler. + genericConfig.SkipOpenAPIInstallation = true if utilfeature.DefaultFeatureGate.Enabled(genericfeatures.StorageVersionAPI) && utilfeature.DefaultFeatureGate.Enabled(genericfeatures.APIServerIdentity) { @@ -91,8 +94,8 @@ func createAggregatorConfig( // copy the etcd options so we don't mutate originals. etcdOptions := *commandOptions.Etcd etcdOptions.StorageConfig.Paging = utilfeature.DefaultFeatureGate.Enabled(features.APIListChunking) - etcdOptions.StorageConfig.Codec = aggregatorscheme.Codecs.LegacyCodec(v1beta1.SchemeGroupVersion, v1.SchemeGroupVersion) - etcdOptions.StorageConfig.EncodeVersioner = runtime.NewMultiGroupVersioner(v1beta1.SchemeGroupVersion, schema.GroupKind{Group: v1beta1.GroupName}) + etcdOptions.StorageConfig.Codec = aggregatorscheme.Codecs.LegacyCodec(v1.SchemeGroupVersion, v1beta1.SchemeGroupVersion) + etcdOptions.StorageConfig.EncodeVersioner = runtime.NewMultiGroupVersioner(v1.SchemeGroupVersion, schema.GroupKind{Group: v1beta1.GroupName}) genericConfig.RESTOptionsGetter = &genericoptions.SimpleRestOptionsFactory{Options: etcdOptions} // override MergedResourceConfig with aggregator defaults and registry @@ -262,6 +265,7 @@ var apiVersionPriorities = map[schema.GroupVersion]priority{ {Group: "networking.k8s.io", Version: "v1"}: {group: 17200, version: 15}, {Group: "networking.k8s.io", Version: "v1beta1"}: {group: 17200, version: 9}, {Group: "extensions", Version: "v1beta1"}: {group: 17150, version: 1}, // prioritize below networking.k8s.io, which contains the GA version of Ingress, the only resource remaining in extensions/v1beta1 + {Group: "policy", Version: "v1"}: {group: 17100, version: 15}, {Group: "policy", Version: "v1beta1"}: {group: 17100, version: 9}, {Group: "rbac.authorization.k8s.io", Version: "v1"}: {group: 17000, version: 15}, {Group: "rbac.authorization.k8s.io", Version: "v1beta1"}: {group: 17000, version: 12}, @@ -281,8 +285,8 @@ var apiVersionPriorities = map[schema.GroupVersion]priority{ {Group: "node.k8s.io", Version: "v1"}: {group: 16300, version: 15}, {Group: "node.k8s.io", Version: "v1alpha1"}: {group: 16300, version: 1}, {Group: "node.k8s.io", Version: "v1beta1"}: {group: 16300, version: 9}, + {Group: "discovery.k8s.io", Version: "v1"}: {group: 16200, version: 15}, {Group: "discovery.k8s.io", Version: "v1beta1"}: {group: 16200, version: 12}, - {Group: "discovery.k8s.io", Version: "v1alpha1"}: {group: 16200, version: 9}, {Group: "flowcontrol.apiserver.k8s.io", Version: "v1beta1"}: {group: 16100, version: 12}, {Group: "flowcontrol.apiserver.k8s.io", Version: "v1alpha1"}: {group: 16100, version: 9}, {Group: "internal.apiserver.k8s.io", Version: "v1alpha1"}: {group: 16000, version: 9}, diff --git a/vendor/k8s.io/kubernetes/cmd/kube-apiserver/app/apiextensions.go b/vendor/k8s.io/kubernetes/cmd/kube-apiserver/app/apiextensions.go index 438e8588c2b0..93565db54f53 100644 --- a/vendor/k8s.io/kubernetes/cmd/kube-apiserver/app/apiextensions.go +++ b/vendor/k8s.io/kubernetes/cmd/kube-apiserver/app/apiextensions.go @@ -67,7 +67,9 @@ func createAPIExtensionsConfig( // copy the etcd options so we don't mutate originals. etcdOptions := *commandOptions.Etcd etcdOptions.StorageConfig.Paging = utilfeature.DefaultFeatureGate.Enabled(features.APIListChunking) + // this is where the true decodable levels come from. etcdOptions.StorageConfig.Codec = apiextensionsapiserver.Codecs.LegacyCodec(v1beta1.SchemeGroupVersion, v1.SchemeGroupVersion) + // prefer the more compact serialization (v1beta1) for storage until http://issue.k8s.io/82292 is resolved for objects whose v1 serialization is too big but whose v1beta1 serialization can be stored etcdOptions.StorageConfig.EncodeVersioner = runtime.NewMultiGroupVersioner(v1beta1.SchemeGroupVersion, schema.GroupKind{Group: v1beta1.GroupName}) genericConfig.RESTOptionsGetter = &genericoptions.SimpleRestOptionsFactory{Options: etcdOptions} diff --git a/vendor/k8s.io/kubernetes/cmd/kube-apiserver/app/options/BUILD b/vendor/k8s.io/kubernetes/cmd/kube-apiserver/app/options/BUILD deleted file mode 100644 index 5d7dc156efff..000000000000 --- a/vendor/k8s.io/kubernetes/cmd/kube-apiserver/app/options/BUILD +++ /dev/null @@ -1,88 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "globalflags.go", - "globalflags_providers.go", - "options.go", - "validation.go", - ], - importpath = "k8s.io/kubernetes/cmd/kube-apiserver/app/options", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/cloudprovider/providers:go_default_library", - "//pkg/cluster/ports:go_default_library", - "//pkg/controlplane/reconcilers:go_default_library", - "//pkg/features:go_default_library", - "//pkg/kubeapiserver/options:go_default_library", - "//pkg/kubelet/client:go_default_library", - "//pkg/serviceaccount:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/features:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/options:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/storagebackend:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/cli/flag:go_default_library", - "//staging/src/k8s.io/component-base/cli/globalflag:go_default_library", - "//staging/src/k8s.io/component-base/logs:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apiserver/scheme:go_default_library", - "//vendor/github.com/spf13/pflag:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "globalflags_test.go", - "options_test.go", - "validation_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/controlplane/reconcilers:go_default_library", - "//pkg/features:go_default_library", - "//pkg/kubeapiserver/options:go_default_library", - "//pkg/kubelet/client:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/options:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/storagebackend:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/apiserver/plugin/pkg/audit/buffered:go_default_library", - "//staging/src/k8s.io/apiserver/plugin/pkg/audit/truncate:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/component-base/cli/flag:go_default_library", - "//staging/src/k8s.io/component-base/cli/globalflag:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - "//staging/src/k8s.io/component-base/logs:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//vendor/github.com/google/go-cmp/cmp:go_default_library", - "//vendor/github.com/google/go-cmp/cmp/cmpopts:go_default_library", - "//vendor/github.com/spf13/pflag:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/cmd/kube-apiserver/app/options/options.go b/vendor/k8s.io/kubernetes/cmd/kube-apiserver/app/options/options.go index e21afb3754f8..3c73d8a35b30 100644 --- a/vendor/k8s.io/kubernetes/cmd/kube-apiserver/app/options/options.go +++ b/vendor/k8s.io/kubernetes/cmd/kube-apiserver/app/options/options.go @@ -154,7 +154,7 @@ func addDummyInsecureFlags(fs *pflag.FlagSet) { for _, name := range []string{"insecure-bind-address", "address"} { fs.IPVar(&bindAddr, name, bindAddr, ""+ - "The IP address on which to serve the insecure port (set to 0.0.0.0 for all IPv4 interfaces and :: for all IPv6 interfaces).") + "The IP address on which to serve the insecure port (set to 0.0.0.0 or :: for listening in all interfaces and IP families).") fs.MarkDeprecated(name, "This flag has no effect now and will be removed in v1.24.") } @@ -229,10 +229,9 @@ func (s *ServerRunOptions) Flags() (fss cliflag.NamedFlagSets) { "of type NodePort, using this as the value of the port. If zero, the Kubernetes master "+ "service will be of type ClusterIP.") - // TODO (khenidak) change documentation as we move IPv6DualStack feature from ALPHA to BETA fs.StringVar(&s.ServiceClusterIPRanges, "service-cluster-ip-range", s.ServiceClusterIPRanges, ""+ "A CIDR notation IP range from which to assign service cluster IPs. This must not "+ - "overlap with any IP ranges assigned to nodes or pods.") + "overlap with any IP ranges assigned to nodes or pods. Max of two dual-stack CIDRs is allowed.") fs.Var(&s.ServiceNodePortRange, "service-node-port-range", ""+ "A port range to reserve for services with NodePort visibility. "+ diff --git a/vendor/k8s.io/kubernetes/cmd/kube-apiserver/app/options/validation.go b/vendor/k8s.io/kubernetes/cmd/kube-apiserver/app/options/validation.go index 34b00a79e623..3fdf5c315d9c 100644 --- a/vendor/k8s.io/kubernetes/cmd/kube-apiserver/app/options/validation.go +++ b/vendor/k8s.io/kubernetes/cmd/kube-apiserver/app/options/validation.go @@ -55,12 +55,10 @@ func validateClusterIPFlags(options *ServerRunOptions) []error { } // Secondary IP validation - // while api-server dualstack bits does not have dependency on EndPointSlice, its - // a good idea to have validation consistent across all components (ControllerManager - // needs EndPointSlice + DualStack feature flags). + // ControllerManager needs DualStack feature flags secondaryServiceClusterIPRangeUsed := (options.SecondaryServiceClusterIPRange.IP != nil) - if secondaryServiceClusterIPRangeUsed && (!utilfeature.DefaultFeatureGate.Enabled(features.IPv6DualStack) || !utilfeature.DefaultFeatureGate.Enabled(features.EndpointSlice)) { - errs = append(errs, fmt.Errorf("secondary service cluster-ip range(--service-cluster-ip-range[1]) can only be used if %v and %v feature is enabled", string(features.IPv6DualStack), string(features.EndpointSlice))) + if secondaryServiceClusterIPRangeUsed && !utilfeature.DefaultFeatureGate.Enabled(features.IPv6DualStack) { + errs = append(errs, fmt.Errorf("secondary service cluster-ip range(--service-cluster-ip-range[1]) can only be used if %v feature is enabled", string(features.IPv6DualStack))) } // note: While the cluster might be dualstack (i.e. pods with multiple IPs), the user may choose @@ -139,7 +137,7 @@ func validateAPIPriorityAndFairness(options *ServerRunOptions) []error { testConfigs := []string{"flowcontrol.apiserver.k8s.io/v1beta1", "api/beta", "api/all"} // in the order of precedence for _, testConfig := range testConfigs { if strings.Contains(enabledAPIString, fmt.Sprintf("%s=false", testConfig)) { - return []error{fmt.Errorf("%s=false conflicts with APIPriorityAndFairness feature gate", testConfig)} + return []error{fmt.Errorf("--runtime-config=%s=false conflicts with --enable-priority-and-fairness=true and --feature-gates=APIPriorityAndFairness=true", testConfig)} } if strings.Contains(enabledAPIString, fmt.Sprintf("%s=true", testConfig)) { return nil @@ -150,6 +148,17 @@ func validateAPIPriorityAndFairness(options *ServerRunOptions) []error { return nil } +func validateAPIServerIdentity(options *ServerRunOptions) []error { + var errs []error + if options.IdentityLeaseDurationSeconds <= 0 { + errs = append(errs, fmt.Errorf("--identity-lease-duration-seconds should be a positive number, but value '%d' provided", options.IdentityLeaseDurationSeconds)) + } + if options.IdentityLeaseRenewIntervalSeconds <= 0 { + errs = append(errs, fmt.Errorf("--identity-lease-renew-interval-seconds should be a positive number, but value '%d' provided", options.IdentityLeaseRenewIntervalSeconds)) + } + return errs +} + // Validate checks ServerRunOptions and return a slice of found errs. func (s *ServerRunOptions) Validate() []error { var errs []error @@ -169,12 +178,7 @@ func (s *ServerRunOptions) Validate() []error { errs = append(errs, validateTokenRequest(s)...) errs = append(errs, s.Metrics.Validate()...) errs = append(errs, s.Logs.Validate()...) - if s.IdentityLeaseDurationSeconds <= 0 { - errs = append(errs, fmt.Errorf("--identity-lease-duration-seconds should be a positive number, but value '%d' provided", s.IdentityLeaseDurationSeconds)) - } - if s.IdentityLeaseRenewIntervalSeconds <= 0 { - errs = append(errs, fmt.Errorf("--identity-lease-renew-interval-seconds should be a positive number, but value '%d' provided", s.IdentityLeaseRenewIntervalSeconds)) - } + errs = append(errs, validateAPIServerIdentity(s)...) return errs } diff --git a/vendor/k8s.io/kubernetes/cmd/kube-apiserver/app/server.go b/vendor/k8s.io/kubernetes/cmd/kube-apiserver/app/server.go index edca51a5714e..0d49b25321fe 100644 --- a/vendor/k8s.io/kubernetes/cmd/kube-apiserver/app/server.go +++ b/vendor/k8s.io/kubernetes/cmd/kube-apiserver/app/server.go @@ -20,6 +20,7 @@ limitations under the License. package app import ( + "context" "crypto/tls" "fmt" "net" @@ -82,7 +83,6 @@ import ( "k8s.io/kubernetes/pkg/controlplane" "k8s.io/kubernetes/pkg/controlplane/reconcilers" "k8s.io/kubernetes/pkg/controlplane/tunneler" - "k8s.io/kubernetes/pkg/features" generatedopenapi "k8s.io/kubernetes/pkg/generated/openapi" "k8s.io/kubernetes/pkg/kubeapiserver" kubeapiserveradmission "k8s.io/kubernetes/pkg/kubeapiserver/admission" @@ -178,7 +178,7 @@ cluster's shared state through which all other components interact.`, return utilerrors.NewAggregate(errs) } - return Run(completedOptions, genericapiserver.SetupSignalHandler()) + return Run(completedOptions, genericapiserver.SetupSignalHandlerIgnoringFurtherSignals()) }, Args: func(cmd *cobra.Command, args []string) error { for _, arg := range args { @@ -468,21 +468,19 @@ func CreateKubeAPIServerConfig( config.ExtraConfig.ProxyTransport = c } - if utilfeature.DefaultFeatureGate.Enabled(features.ServiceAccountIssuerDiscovery) { - // Load the public keys. - var pubKeys []interface{} - for _, f := range s.Authentication.ServiceAccounts.KeyFiles { - keys, err := keyutil.PublicKeysFromFile(f) - if err != nil { - return nil, nil, nil, fmt.Errorf("failed to parse key file %q: %v", f, err) - } - pubKeys = append(pubKeys, keys...) + // Load the public keys. + var pubKeys []interface{} + for _, f := range s.Authentication.ServiceAccounts.KeyFiles { + keys, err := keyutil.PublicKeysFromFile(f) + if err != nil { + return nil, nil, nil, fmt.Errorf("failed to parse key file %q: %v", f, err) } - // Plumb the required metadata through ExtraConfig. - config.ExtraConfig.ServiceAccountIssuerURL = s.Authentication.ServiceAccounts.Issuer - config.ExtraConfig.ServiceAccountJWKSURI = s.Authentication.ServiceAccounts.JWKSURI - config.ExtraConfig.ServiceAccountPublicKeys = pubKeys + pubKeys = append(pubKeys, keys...) } + // Plumb the required metadata through ExtraConfig. + config.ExtraConfig.ServiceAccountIssuerURL = s.Authentication.ServiceAccounts.Issuer + config.ExtraConfig.ServiceAccountJWKSURI = s.Authentication.ServiceAccounts.JWKSURI + config.ExtraConfig.ServiceAccountPublicKeys = pubKeys return config, serviceResolver, pluginInitializers, nil } @@ -725,14 +723,14 @@ func Complete(s *options.ServerRunOptions) (completedServerRunOptions, error) { upBound := time.Duration(1<<32) * time.Second if s.Authentication.ServiceAccounts.MaxExpiration < lowBound || s.Authentication.ServiceAccounts.MaxExpiration > upBound { - return options, fmt.Errorf("the serviceaccount max expiration must be between 1 hour to 2^32 seconds") + return options, fmt.Errorf("the service-account-max-token-expiration must be between 1 hour and 2^32 seconds") } if s.Authentication.ServiceAccounts.ExtendExpiration { if s.Authentication.ServiceAccounts.MaxExpiration < serviceaccount.WarnOnlyBoundTokenExpirationSeconds*time.Second { - klog.Warningf("service-account-extend-token-expiration is true, in order to correctly trigger safe transition logic, service-account-max-token-expiration must be set longer than 3607 seconds (currently %s)", s.Authentication.ServiceAccounts.MaxExpiration) + klog.Warningf("service-account-extend-token-expiration is true, in order to correctly trigger safe transition logic, service-account-max-token-expiration must be set longer than %d seconds (currently %s)", serviceaccount.WarnOnlyBoundTokenExpirationSeconds, s.Authentication.ServiceAccounts.MaxExpiration) } if s.Authentication.ServiceAccounts.MaxExpiration < serviceaccount.ExpirationExtensionSeconds*time.Second { - klog.Warningf("service-account-extend-token-expiration is true, enabling tokens valid up to 1 year, which is longer than service-account-max-token-expiration set to %s", s.Authentication.ServiceAccounts.MaxExpiration) + klog.Warningf("service-account-extend-token-expiration is true, enabling tokens valid up to %d seconds, which is longer than service-account-max-token-expiration set to %s seconds", serviceaccount.ExpirationExtensionSeconds, s.Authentication.ServiceAccounts.MaxExpiration) } } } @@ -848,6 +846,9 @@ var _ genericapiserver.EventSink = eventRegistrySink{} func (s eventRegistrySink) Create(v1event *corev1.Event) (*corev1.Event, error) { ctx := request.WithNamespace(request.WithRequestInfo(request.NewContext(), &request.RequestInfo{APIVersion: "v1"}), v1event.Namespace) + // since we are bypassing the API set a hard timeout for the storage layer + ctx, cancel := context.WithTimeout(ctx, 3*time.Second) + defer cancel() var event core.Event if err := v1.Convert_v1_Event_To_core_Event(v1event, &event, nil); err != nil { diff --git a/vendor/k8s.io/kubernetes/cmd/kube-proxy/app/BUILD b/vendor/k8s.io/kubernetes/cmd/kube-proxy/app/BUILD deleted file mode 100644 index fec2efa4c634..000000000000 --- a/vendor/k8s.io/kubernetes/cmd/kube-proxy/app/BUILD +++ /dev/null @@ -1,405 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "conntrack.go", - "init_others.go", - "init_windows.go", - "server.go", - "server_others.go", - "server_windows.go", - ], - importpath = "k8s.io/kubernetes/cmd/kube-proxy/app", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/cluster/ports:go_default_library", - "//pkg/features:go_default_library", - "//pkg/kubelet/qos:go_default_library", - "//pkg/proxy:go_default_library", - "//pkg/proxy/apis:go_default_library", - "//pkg/proxy/apis/config:go_default_library", - "//pkg/proxy/apis/config/scheme:go_default_library", - "//pkg/proxy/apis/config/v1alpha1:go_default_library", - "//pkg/proxy/apis/config/validation:go_default_library", - "//pkg/proxy/config:go_default_library", - "//pkg/proxy/healthcheck:go_default_library", - "//pkg/proxy/iptables:go_default_library", - "//pkg/proxy/ipvs:go_default_library", - "//pkg/proxy/userspace:go_default_library", - "//pkg/proxy/util:go_default_library", - "//pkg/util/filesystem:go_default_library", - "//pkg/util/flag:go_default_library", - "//pkg/util/ipset:go_default_library", - "//pkg/util/iptables:go_default_library", - "//pkg/util/ipvs:go_default_library", - "//pkg/util/oom:go_default_library", - "//pkg/util/sysctl:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/selection:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/healthz:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/mux:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/routes:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/tools/clientcmd:go_default_library", - "//staging/src/k8s.io/client-go/tools/clientcmd/api:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/component-base/cli/flag:go_default_library", - "//staging/src/k8s.io/component-base/config:go_default_library", - "//staging/src/k8s.io/component-base/configz:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - "//staging/src/k8s.io/component-base/version:go_default_library", - "//staging/src/k8s.io/component-base/version/verflag:go_default_library", - "//staging/src/k8s.io/kube-proxy/config/v1alpha1:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/github.com/fsnotify/fsnotify:go_default_library", - "//vendor/github.com/pkg/errors:go_default_library", - "//vendor/github.com/spf13/cobra:go_default_library", - "//vendor/github.com/spf13/pflag:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ] + select({ - "@io_bazel_rules_go//go/platform:aix": [ - "//pkg/proxy/metrics:go_default_library", - "//pkg/proxy/util/iptables:go_default_library", - "//pkg/util/node:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/tools/watch:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], - "@io_bazel_rules_go//go/platform:android": [ - "//pkg/proxy/metrics:go_default_library", - "//pkg/proxy/util/iptables:go_default_library", - "//pkg/util/node:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/tools/watch:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "//pkg/proxy/metrics:go_default_library", - "//pkg/proxy/util/iptables:go_default_library", - "//pkg/util/node:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/tools/watch:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "//pkg/proxy/metrics:go_default_library", - "//pkg/proxy/util/iptables:go_default_library", - "//pkg/util/node:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/tools/watch:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "//pkg/proxy/metrics:go_default_library", - "//pkg/proxy/util/iptables:go_default_library", - "//pkg/util/node:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/tools/watch:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], - "@io_bazel_rules_go//go/platform:illumos": [ - "//pkg/proxy/metrics:go_default_library", - "//pkg/proxy/util/iptables:go_default_library", - "//pkg/util/node:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/tools/watch:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], - "@io_bazel_rules_go//go/platform:ios": [ - "//pkg/proxy/metrics:go_default_library", - "//pkg/proxy/util/iptables:go_default_library", - "//pkg/util/node:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/tools/watch:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], - "@io_bazel_rules_go//go/platform:js": [ - "//pkg/proxy/metrics:go_default_library", - "//pkg/proxy/util/iptables:go_default_library", - "//pkg/util/node:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/tools/watch:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//pkg/proxy/metrics:go_default_library", - "//pkg/proxy/util/iptables:go_default_library", - "//pkg/util/node:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/tools/watch:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "//pkg/proxy/metrics:go_default_library", - "//pkg/proxy/util/iptables:go_default_library", - "//pkg/util/node:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/tools/watch:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "//pkg/proxy/metrics:go_default_library", - "//pkg/proxy/util/iptables:go_default_library", - "//pkg/util/node:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/tools/watch:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "//pkg/proxy/metrics:go_default_library", - "//pkg/proxy/util/iptables:go_default_library", - "//pkg/util/node:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/tools/watch:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "//pkg/proxy/metrics:go_default_library", - "//pkg/proxy/util/iptables:go_default_library", - "//pkg/util/node:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/tools/watch:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "//pkg/proxy/metrics:go_default_library", - "//pkg/proxy/util/iptables:go_default_library", - "//pkg/util/node:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/tools/watch:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "//pkg/proxy/winkernel:go_default_library", - "//pkg/proxy/winuserspace:go_default_library", - "//pkg/util/netsh:go_default_library", - "//pkg/util/node:go_default_library", - "//pkg/windows/service:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], - "//conditions:default": [], - }), -) - -go_test( - name = "go_default_test", - srcs = [ - "server_others_test.go", - "server_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/proxy/apis/config:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/component-base/config:go_default_library", - "//vendor/github.com/google/go-cmp/cmp:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ] + select({ - "@io_bazel_rules_go//go/platform:aix": [ - "//pkg/proxy/ipvs:go_default_library", - "//pkg/proxy/util/iptables:go_default_library", - "//pkg/util/iptables:go_default_library", - "//pkg/util/iptables/testing:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - ], - "@io_bazel_rules_go//go/platform:android": [ - "//pkg/proxy/ipvs:go_default_library", - "//pkg/proxy/util/iptables:go_default_library", - "//pkg/util/iptables:go_default_library", - "//pkg/util/iptables/testing:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "//pkg/proxy/ipvs:go_default_library", - "//pkg/proxy/util/iptables:go_default_library", - "//pkg/util/iptables:go_default_library", - "//pkg/util/iptables/testing:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "//pkg/proxy/ipvs:go_default_library", - "//pkg/proxy/util/iptables:go_default_library", - "//pkg/util/iptables:go_default_library", - "//pkg/util/iptables/testing:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "//pkg/proxy/ipvs:go_default_library", - "//pkg/proxy/util/iptables:go_default_library", - "//pkg/util/iptables:go_default_library", - "//pkg/util/iptables/testing:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - ], - "@io_bazel_rules_go//go/platform:illumos": [ - "//pkg/proxy/ipvs:go_default_library", - "//pkg/proxy/util/iptables:go_default_library", - "//pkg/util/iptables:go_default_library", - "//pkg/util/iptables/testing:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - ], - "@io_bazel_rules_go//go/platform:ios": [ - "//pkg/proxy/ipvs:go_default_library", - "//pkg/proxy/util/iptables:go_default_library", - "//pkg/util/iptables:go_default_library", - "//pkg/util/iptables/testing:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - ], - "@io_bazel_rules_go//go/platform:js": [ - "//pkg/proxy/ipvs:go_default_library", - "//pkg/proxy/util/iptables:go_default_library", - "//pkg/util/iptables:go_default_library", - "//pkg/util/iptables/testing:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//pkg/proxy/ipvs:go_default_library", - "//pkg/proxy/util/iptables:go_default_library", - "//pkg/util/iptables:go_default_library", - "//pkg/util/iptables/testing:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "//pkg/proxy/ipvs:go_default_library", - "//pkg/proxy/util/iptables:go_default_library", - "//pkg/util/iptables:go_default_library", - "//pkg/util/iptables/testing:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "//pkg/proxy/ipvs:go_default_library", - "//pkg/proxy/util/iptables:go_default_library", - "//pkg/util/iptables:go_default_library", - "//pkg/util/iptables/testing:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "//pkg/proxy/ipvs:go_default_library", - "//pkg/proxy/util/iptables:go_default_library", - "//pkg/util/iptables:go_default_library", - "//pkg/util/iptables/testing:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "//pkg/proxy/ipvs:go_default_library", - "//pkg/proxy/util/iptables:go_default_library", - "//pkg/util/iptables:go_default_library", - "//pkg/util/iptables/testing:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "//pkg/proxy/ipvs:go_default_library", - "//pkg/proxy/util/iptables:go_default_library", - "//pkg/util/iptables:go_default_library", - "//pkg/util/iptables/testing:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/cmd/kube-proxy/app/server.go b/vendor/k8s.io/kubernetes/cmd/kube-proxy/app/server.go index 3f696152b834..f7b57b2582bc 100644 --- a/vendor/k8s.io/kubernetes/cmd/kube-proxy/app/server.go +++ b/vendor/k8s.io/kubernetes/cmd/kube-proxy/app/server.go @@ -24,7 +24,6 @@ import ( "io/ioutil" "net/http" "os" - goruntime "runtime" "strings" "time" @@ -108,8 +107,6 @@ type Options struct { WriteConfigTo string // CleanupAndExit, when true, makes the proxy server clean up iptables and ipvs rules, then exit. CleanupAndExit bool - // CleanupIPVS, when true, makes the proxy server clean up ipvs rules before running. - CleanupIPVS bool // WindowsService should be set to true if kube-proxy is running as a service on Windows. // Its corresponding flag only gets registered in Windows builds WindowsService bool @@ -162,8 +159,6 @@ func (o *Options) AddFlags(fs *pflag.FlagSet) { "A string slice of values which specify the addresses to use for NodePorts. Values may be valid IP blocks (e.g. 1.2.3.0/24, 1.2.3.4/32). The default empty string slice ([]) means to use all local addresses.") fs.BoolVar(&o.CleanupAndExit, "cleanup", o.CleanupAndExit, "If true cleanup iptables and ipvs rules and exit.") - fs.BoolVar(&o.CleanupIPVS, "cleanup-ipvs", o.CleanupIPVS, "If true and --cleanup is specified, kube-proxy will also flush IPVS rules, in addition to normal cleanup.") - fs.MarkDeprecated("cleanup-ipvs", "In a future release, running --cleanup will always flush IPVS rules") fs.Var(utilflag.IPVar{Val: &o.config.BindAddress}, "bind-address", "The IP address for the proxy server to serve on (set to '0.0.0.0' for all IPv4 interfaces and '::' for all IPv6 interfaces)") fs.Var(utilflag.IPPortVar{Val: &o.config.HealthzBindAddress}, "healthz-bind-address", "The IP address with port for the health check server to serve on (set to '0.0.0.0:10256' for all IPv4 interfaces and '[::]:10256' for all IPv6 interfaces). Set empty to disable.") @@ -215,7 +210,6 @@ func NewOptions() *Options { config: new(kubeproxyconfig.KubeProxyConfiguration), healthzPort: ports.ProxyHealthzPort, metricsPort: ports.ProxyStatusPort, - CleanupIPVS: true, errCh: make(chan error), } } @@ -535,7 +529,6 @@ type ProxyServer struct { Conntracker Conntracker // if nil, ignored ProxyMode string NodeRef *v1.ObjectReference - CleanupIPVS bool MetricsBindAddress string BindAddressHardFail bool EnableProfiling bool @@ -757,7 +750,7 @@ func (s *ProxyServer) Run() error { // functions must configure their shared informer event handlers first. informerFactory.Start(wait.NeverStop) - if utilfeature.DefaultFeatureGate.Enabled(features.ServiceTopology) { + if utilfeature.DefaultFeatureGate.Enabled(features.ServiceTopology) || utilfeature.DefaultFeatureGate.Enabled(features.TopologyAwareHints) { // Make an informer that selects for our nodename. currentNodeInformerFactory := informers.NewSharedInformerFactoryWithOptions(s.Client, s.ConfigSyncPeriod, informers.WithTweakListOptions(func(options *metav1.ListOptions) { @@ -790,7 +783,7 @@ func getConntrackMax(config kubeproxyconfig.KubeProxyConntrackConfiguration) (in if config.Min != nil { floor = int(*config.Min) } - scaled := int(*config.MaxPerCore) * goruntime.NumCPU() + scaled := int(*config.MaxPerCore) * detectNumCPU() if scaled > floor { klog.V(3).Infof("getConntrackMax: using scaled conntrack-max-per-core") return scaled, nil @@ -813,7 +806,7 @@ func (s *ProxyServer) CleanupAndExit() error { for _, ipt := range ipts { encounteredError = userspace.CleanupLeftovers(ipt) || encounteredError encounteredError = iptables.CleanupLeftovers(ipt) || encounteredError - encounteredError = ipvs.CleanupLeftovers(s.IpvsInterface, ipt, s.IpsetInterface, s.CleanupIPVS) || encounteredError + encounteredError = ipvs.CleanupLeftovers(s.IpvsInterface, ipt, s.IpsetInterface) || encounteredError } if encounteredError { return errors.New("encountered an error while tearing down rules") diff --git a/vendor/k8s.io/kubernetes/cmd/kube-proxy/app/server_others.go b/vendor/k8s.io/kubernetes/cmd/kube-proxy/app/server_others.go index b44dbb54b2f1..62547325b34e 100644 --- a/vendor/k8s.io/kubernetes/cmd/kube-proxy/app/server_others.go +++ b/vendor/k8s.io/kubernetes/cmd/kube-proxy/app/server_others.go @@ -25,9 +25,12 @@ import ( "errors" "fmt" "net" + goruntime "runtime" "strings" "time" + "github.com/google/cadvisor/machine" + "github.com/google/cadvisor/utils/sysfs" "k8s.io/apimachinery/pkg/watch" "k8s.io/apimachinery/pkg/runtime" @@ -134,15 +137,7 @@ func newProxyServer( } nodeIP := detectNodeIP(client, hostname, config.BindAddress) - protocol := utiliptables.ProtocolIPv4 - if utilsnet.IsIPv6(nodeIP) { - klog.V(0).Infof("kube-proxy node IP is an IPv6 address (%s), assume IPv6 operation", nodeIP.String()) - protocol = utiliptables.ProtocolIPv6 - } else { - klog.V(0).Infof("kube-proxy node IP is an IPv4 address (%s), assume IPv4 operation", nodeIP.String()) - } - - iptInterface = utiliptables.New(execer, protocol) + klog.Infof("Detected node IP %s", nodeIP.String()) // Create event recorder eventBroadcaster := record.NewBroadcaster() @@ -181,6 +176,38 @@ func newProxyServer( klog.V(2).Info("DetectLocalMode: '", string(detectLocalMode), "'") + primaryProtocol := utiliptables.ProtocolIPv4 + if utilsnet.IsIPv6(nodeIP) { + primaryProtocol = utiliptables.ProtocolIPv6 + } + iptInterface = utiliptables.New(execer, primaryProtocol) + + var ipt [2]utiliptables.Interface + dualStack := utilfeature.DefaultFeatureGate.Enabled(features.IPv6DualStack) && proxyMode != proxyModeUserspace + if dualStack { + // Create iptables handlers for both families, one is already created + // Always ordered as IPv4, IPv6 + if primaryProtocol == utiliptables.ProtocolIPv4 { + ipt[0] = iptInterface + ipt[1] = utiliptables.New(execer, utiliptables.ProtocolIPv6) + + // Just because the feature gate is enabled doesn't mean the node + // actually supports dual-stack + if _, err := ipt[1].ChainExists(utiliptables.TableNAT, utiliptables.ChainPostrouting); err != nil { + klog.Warningf("No iptables support for IPv6: %v", err) + dualStack = false + } + } else { + ipt[0] = utiliptables.New(execer, utiliptables.ProtocolIPv4) + ipt[1] = iptInterface + } + } + if dualStack { + klog.V(0).Infof("kube-proxy running in dual-stack mode, %s-primary", iptInterface.Protocol()) + } else { + klog.V(0).Infof("kube-proxy running in single-stack %s mode", iptInterface.Protocol()) + } + if proxyMode == proxyModeIPTables { klog.V(0).Info("Using iptables Proxier.") if config.IPTables.MasqueradeBit == nil { @@ -188,20 +215,9 @@ func newProxyServer( return nil, fmt.Errorf("unable to read IPTables MasqueradeBit from config") } - if utilfeature.DefaultFeatureGate.Enabled(features.IPv6DualStack) { + if dualStack { klog.V(0).Info("creating dualStackProxier for iptables.") - // Create iptables handlers for both families, one is already created - // Always ordered as IPv4, IPv6 - var ipt [2]utiliptables.Interface - if iptInterface.IsIPv6() { - ipt[1] = iptInterface - ipt[0] = utiliptables.New(execer, utiliptables.ProtocolIPv4) - } else { - ipt[0] = iptInterface - ipt[1] = utiliptables.New(execer, utiliptables.ProtocolIPv6) - } - // Always ordered to match []ipt var localDetectors [2]proxyutiliptables.LocalTrafficDetector localDetectors, err = getDualStackLocalDetectorTuple(detectLocalMode, config, ipt, nodeInfo) @@ -256,20 +272,9 @@ func newProxyServer( proxymetrics.RegisterMetrics() } else if proxyMode == proxyModeIPVS { klog.V(0).Info("Using ipvs Proxier.") - if utilfeature.DefaultFeatureGate.Enabled(features.IPv6DualStack) { + if dualStack { klog.V(0).Info("creating dualStackProxier for ipvs.") - // Create iptables handlers for both families, one is already created - // Always ordered as IPv4, IPv6 - var ipt [2]utiliptables.Interface - if iptInterface.IsIPv6() { - ipt[1] = iptInterface - ipt[0] = utiliptables.New(execer, utiliptables.ProtocolIPv4) - } else { - ipt[0] = iptInterface - ipt[1] = utiliptables.New(execer, utiliptables.ProtocolIPv6) - } - nodeIPs := nodeIPTuple(config.BindAddress) // Always ordered to match []ipt @@ -434,6 +439,15 @@ func detectNodeIP(client clientset.Interface, hostname, bindAddress string) net. return nodeIP } +func detectNumCPU() int { + // try get numCPU from /sys firstly due to a known issue (https://github.com/kubernetes/kubernetes/issues/99225) + _, numCPU, err := machine.GetTopology(sysfs.NewRealSysFs()) + if err != nil || numCPU < 1 { + return goruntime.NumCPU() + } + return numCPU +} + func getDetectLocalMode(config *proxyconfigapi.KubeProxyConfiguration) (proxyconfigapi.LocalMode, error) { mode := config.DetectLocalMode switch mode { diff --git a/vendor/k8s.io/kubernetes/cmd/kube-proxy/app/server_windows.go b/vendor/k8s.io/kubernetes/cmd/kube-proxy/app/server_windows.go index 759f04b08864..12c714a39345 100644 --- a/vendor/k8s.io/kubernetes/cmd/kube-proxy/app/server_windows.go +++ b/vendor/k8s.io/kubernetes/cmd/kube-proxy/app/server_windows.go @@ -24,6 +24,7 @@ import ( "errors" "fmt" "net" + goruntime "runtime" // Enable pprof HTTP handlers. _ "net/http/pprof" @@ -179,14 +180,16 @@ func newProxyServer(config *proxyconfigapi.KubeProxyConfiguration, cleanupAndExi } func getProxyMode(proxyMode string, kcompat winkernel.KernelCompatTester) string { - if proxyMode == proxyModeUserspace { - return proxyModeUserspace - } else if proxyMode == proxyModeKernelspace { + if proxyMode == proxyModeKernelspace { return tryWinKernelSpaceProxy(kcompat) } return proxyModeUserspace } +func detectNumCPU() int { + return goruntime.NumCPU() +} + func tryWinKernelSpaceProxy(kcompat winkernel.KernelCompatTester) string { // Check for Windows Kernel Version if we can support Kernel Space proxy // Check for Windows Version diff --git a/vendor/k8s.io/kubernetes/cmd/kubelet/app/BUILD b/vendor/k8s.io/kubernetes/cmd/kubelet/app/BUILD deleted file mode 100644 index bfd511422e25..000000000000 --- a/vendor/k8s.io/kubernetes/cmd/kubelet/app/BUILD +++ /dev/null @@ -1,179 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "auth.go", - "init_others.go", - "init_windows.go", - "plugins.go", - "plugins_providers.go", - "server.go", - "server_linux.go", - "server_unsupported.go", - ], - importpath = "k8s.io/kubernetes/cmd/kubelet/app", - visibility = ["//visibility:public"], - deps = [ - "//cmd/kubelet/app/options:go_default_library", - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/capabilities:go_default_library", - "//pkg/cloudprovider/providers:go_default_library", - "//pkg/credentialprovider:go_default_library", - "//pkg/credentialprovider/aws:go_default_library", - "//pkg/credentialprovider/azure:go_default_library", - "//pkg/credentialprovider/gcp:go_default_library", - "//pkg/features:go_default_library", - "//pkg/kubelet:go_default_library", - "//pkg/kubelet/apis/config:go_default_library", - "//pkg/kubelet/apis/config/scheme:go_default_library", - "//pkg/kubelet/apis/config/validation:go_default_library", - "//pkg/kubelet/cadvisor:go_default_library", - "//pkg/kubelet/certificate:go_default_library", - "//pkg/kubelet/certificate/bootstrap:go_default_library", - "//pkg/kubelet/cm:go_default_library", - "//pkg/kubelet/cm/cpuset:go_default_library", - "//pkg/kubelet/config:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/eviction:go_default_library", - "//pkg/kubelet/eviction/api:go_default_library", - "//pkg/kubelet/kubeletconfig:go_default_library", - "//pkg/kubelet/kubeletconfig/configfiles:go_default_library", - "//pkg/kubelet/metrics:go_default_library", - "//pkg/kubelet/server:go_default_library", - "//pkg/kubelet/stats/pidlimit:go_default_library", - "//pkg/kubelet/types:go_default_library", - "//pkg/util/filesystem:go_default_library", - "//pkg/util/flock:go_default_library", - "//pkg/util/node:go_default_library", - "//pkg/util/oom:go_default_library", - "//pkg/util/rlimit:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/awsebs:go_default_library", - "//pkg/volume/azure_file:go_default_library", - "//pkg/volume/azuredd:go_default_library", - "//pkg/volume/cephfs:go_default_library", - "//pkg/volume/cinder:go_default_library", - "//pkg/volume/configmap:go_default_library", - "//pkg/volume/csi:go_default_library", - "//pkg/volume/csimigration:go_default_library", - "//pkg/volume/downwardapi:go_default_library", - "//pkg/volume/emptydir:go_default_library", - "//pkg/volume/fc:go_default_library", - "//pkg/volume/flexvolume:go_default_library", - "//pkg/volume/flocker:go_default_library", - "//pkg/volume/gcepd:go_default_library", - "//pkg/volume/git_repo:go_default_library", - "//pkg/volume/glusterfs:go_default_library", - "//pkg/volume/hostpath:go_default_library", - "//pkg/volume/iscsi:go_default_library", - "//pkg/volume/local:go_default_library", - "//pkg/volume/nfs:go_default_library", - "//pkg/volume/portworx:go_default_library", - "//pkg/volume/projected:go_default_library", - "//pkg/volume/quobyte:go_default_library", - "//pkg/volume/rbd:go_default_library", - "//pkg/volume/scaleio:go_default_library", - "//pkg/volume/secret:go_default_library", - "//pkg/volume/storageos:go_default_library", - "//pkg/volume/util/hostutil:go_default_library", - "//pkg/volume/util/subpath:go_default_library", - "//pkg/volume/vsphere_volume:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/authenticatorfactory:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizerfactory:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/dynamiccertificates:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/healthz:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/options:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/authentication/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/authorization/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/tools/clientcmd:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/client-go/util/cert:go_default_library", - "//staging/src/k8s.io/client-go/util/certificate:go_default_library", - "//staging/src/k8s.io/client-go/util/connrotation:go_default_library", - "//staging/src/k8s.io/client-go/util/keyutil:go_default_library", - "//staging/src/k8s.io/cloud-provider:go_default_library", - "//staging/src/k8s.io/component-base/cli/flag:go_default_library", - "//staging/src/k8s.io/component-base/configz:go_default_library", - "//staging/src/k8s.io/component-base/featuregate:go_default_library", - "//staging/src/k8s.io/component-base/logs:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - "//staging/src/k8s.io/component-base/version:go_default_library", - "//staging/src/k8s.io/component-base/version/verflag:go_default_library", - "//staging/src/k8s.io/csi-translation-lib/plugins:go_default_library", - "//staging/src/k8s.io/kubelet/config/v1beta1:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/github.com/coreos/go-systemd/daemon:go_default_library", - "//vendor/github.com/spf13/cobra:go_default_library", - "//vendor/github.com/spf13/pflag:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "//vendor/k8s.io/utils/inotify:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//vendor/k8s.io/utils/inotify:go_default_library", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "//pkg/windows/service:go_default_library", - "//vendor/golang.org/x/sys/windows:go_default_library", - ], - "//conditions:default": [], - }), -) - -go_test( - name = "go_default_test", - srcs = [ - "init_windows_test.go", - "server_bootstrap_test.go", - "server_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/certificates/v1:go_default_library", - "//pkg/controller/certificates/authority:go_default_library", - "//staging/src/k8s.io/api/certificates/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/util/cert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//cmd/kubelet/app/options:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/cmd/kubelet/app/auth.go b/vendor/k8s.io/kubernetes/cmd/kubelet/app/auth.go index 76b35f5db98d..2cc2b26f2d7c 100644 --- a/vendor/k8s.io/kubernetes/cmd/kubelet/app/auth.go +++ b/vendor/k8s.io/kubernetes/cmd/kubelet/app/auth.go @@ -60,6 +60,7 @@ func BuildAuth(nodeName types.NodeName, client clientset.Interface, config kubel if err != nil { return nil, nil, err } + authorizer = wrapAuthorizerWithMetricsScraper(authorizer) return server.NewKubeletAuth(authenticator, attributes, authorizer), runAuthenticatorCAReload, nil } diff --git a/vendor/k8s.io/kubernetes/cmd/kubelet/app/init_windows.go b/vendor/k8s.io/kubernetes/cmd/kubelet/app/init_windows.go index bed76806701f..8b2755cc30d4 100644 --- a/vendor/k8s.io/kubernetes/cmd/kubelet/app/init_windows.go +++ b/vendor/k8s.io/kubernetes/cmd/kubelet/app/init_windows.go @@ -52,7 +52,7 @@ func initForOS(windowsService bool, windowsPriorityClass string) error { } kubeletProcessHandle := windows.CurrentProcess() // Set the priority of the kubelet process to given priority - klog.Infof("Setting the priority of kubelet process to %s", windowsPriorityClass) + klog.InfoS("Setting the priority of kubelet process", "windowsPriorityClass", windowsPriorityClass) if err := windows.SetPriorityClass(kubeletProcessHandle, priority); err != nil { return err } diff --git a/vendor/k8s.io/kubernetes/cmd/kubelet/app/options/BUILD b/vendor/k8s.io/kubernetes/cmd/kubelet/app/options/BUILD deleted file mode 100644 index 53932c63591d..000000000000 --- a/vendor/k8s.io/kubernetes/cmd/kubelet/app/options/BUILD +++ /dev/null @@ -1,90 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "container_runtime.go", - "globalflags.go", - "globalflags_linux.go", - "globalflags_other.go", - "globalflags_providers.go", - "options.go", - "osflags_others.go", - "osflags_windows.go", - ], - importpath = "k8s.io/kubernetes/cmd/kubelet/app/options", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/cluster/ports:go_default_library", - "//pkg/credentialprovider/azure:go_default_library", - "//pkg/credentialprovider/gcp:go_default_library", - "//pkg/features:go_default_library", - "//pkg/kubelet/apis:go_default_library", - "//pkg/kubelet/apis/config:go_default_library", - "//pkg/kubelet/apis/config/scheme:go_default_library", - "//pkg/kubelet/apis/config/validation:go_default_library", - "//pkg/kubelet/config:go_default_library", - "//pkg/kubelet/types:go_default_library", - "//pkg/util/flag:go_default_library", - "//pkg/util/taints:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/cli/flag:go_default_library", - "//staging/src/k8s.io/component-base/logs:go_default_library", - "//staging/src/k8s.io/component-base/version/verflag:go_default_library", - "//staging/src/k8s.io/kubelet/config/v1beta1:go_default_library", - "//vendor/github.com/spf13/pflag:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "//vendor/github.com/google/cadvisor/container/common:go_default_library", - "//vendor/github.com/google/cadvisor/container/containerd:go_default_library", - "//vendor/github.com/google/cadvisor/container/docker:go_default_library", - "//vendor/github.com/google/cadvisor/container/raw:go_default_library", - "//vendor/github.com/google/cadvisor/machine:go_default_library", - "//vendor/github.com/google/cadvisor/manager:go_default_library", - "//vendor/github.com/google/cadvisor/storage:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//vendor/github.com/google/cadvisor/container/common:go_default_library", - "//vendor/github.com/google/cadvisor/container/containerd:go_default_library", - "//vendor/github.com/google/cadvisor/container/docker:go_default_library", - "//vendor/github.com/google/cadvisor/container/raw:go_default_library", - "//vendor/github.com/google/cadvisor/machine:go_default_library", - "//vendor/github.com/google/cadvisor/manager:go_default_library", - "//vendor/github.com/google/cadvisor/storage:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["options_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/component-base/cli/flag:go_default_library", - "//vendor/github.com/spf13/pflag:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/cmd/kubelet/app/options/container_runtime.go b/vendor/k8s.io/kubernetes/cmd/kubelet/app/options/container_runtime.go index b58953b88ef5..a3be109f6493 100644 --- a/vendor/k8s.io/kubernetes/cmd/kubelet/app/options/container_runtime.go +++ b/vendor/k8s.io/kubernetes/cmd/kubelet/app/options/container_runtime.go @@ -28,7 +28,7 @@ import ( const ( // When these values are updated, also update test/utils/image/manifest.go defaultPodSandboxImageName = "k8s.gcr.io/pause" - defaultPodSandboxImageVersion = "3.2" + defaultPodSandboxImageVersion = "3.4.1" ) var ( diff --git a/vendor/k8s.io/kubernetes/cmd/kubelet/app/options/options.go b/vendor/k8s.io/kubernetes/cmd/kubelet/app/options/options.go index d821f8f12466..74226f8e3d89 100644 --- a/vendor/k8s.io/kubernetes/cmd/kubelet/app/options/options.go +++ b/vendor/k8s.io/kubernetes/cmd/kubelet/app/options/options.go @@ -31,10 +31,10 @@ import ( utilfeature "k8s.io/apiserver/pkg/util/feature" cliflag "k8s.io/component-base/cli/flag" "k8s.io/kubelet/config/v1beta1" + kubeletapis "k8s.io/kubelet/pkg/apis" "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/cluster/ports" "k8s.io/kubernetes/pkg/features" - kubeletapis "k8s.io/kubernetes/pkg/kubelet/apis" kubeletconfig "k8s.io/kubernetes/pkg/kubelet/apis/config" kubeletscheme "k8s.io/kubernetes/pkg/kubelet/apis/config/scheme" kubeletconfigvalidation "k8s.io/kubernetes/pkg/kubelet/apis/config/validation" @@ -167,8 +167,6 @@ type KubeletFlags struct { // This flag, if set, instructs the kubelet to keep volumes from terminated pods mounted to the node. // This can be useful for debugging volume related issues. KeepTerminatedPodVolumes bool - // EnableCAdvisorJSONEndpoints enables some cAdvisor endpoints that will be removed in future versions - EnableCAdvisorJSONEndpoints bool } // NewKubeletFlags will create a new KubeletFlags with default values @@ -194,8 +192,6 @@ func NewKubeletFlags() *KubeletFlags { NodeLabels: make(map[string]string), RegisterNode: true, SeccompProfileRoot: filepath.Join(defaultRootDir, "seccomp"), - // prior to the introduction of this flag, there was a hardcoded cap of 50 images - EnableCAdvisorJSONEndpoints: false, } } @@ -345,7 +341,7 @@ func (f *KubeletFlags) AddFlags(mainfs *pflag.FlagSet) { fs.Var(utiltaints.NewTaintsVar(&f.RegisterWithTaints), "register-with-taints", "Register the node with the given list of taints (comma separated \"=:\"). No-op if register-node is false.") // EXPERIMENTAL FLAGS - fs.StringVar(&f.RemoteRuntimeEndpoint, "container-runtime-endpoint", f.RemoteRuntimeEndpoint, "[Experimental] The endpoint of remote runtime service. Currently unix socket endpoint is supported on Linux, while npipe and tcp endpoints are supported on windows. Examples:'unix:///var/run/dockershim.sock', 'npipe:////./pipe/dockershim'") + fs.StringVar(&f.RemoteRuntimeEndpoint, "container-runtime-endpoint", f.RemoteRuntimeEndpoint, "[Experimental] The endpoint of remote runtime service. Currently unix socket endpoint is supported on Linux, while npipe and tcp endpoints are supported on windows. Note: When using docker as container runtime this specifies the dockershim socket location which kubelet itself creates. Examples:'unix:///var/run/dockershim.sock', 'npipe:////./pipe/dockershim'") fs.StringVar(&f.RemoteImageEndpoint, "image-service-endpoint", f.RemoteImageEndpoint, "[Experimental] The endpoint of remote image service. If not specified, it will be the same with container-runtime-endpoint by default. Currently unix socket endpoint is supported on Linux, while npipe and tcp endpoints are supported on windows. Examples:'unix:///var/run/dockershim.sock', 'npipe:////./pipe/dockershim'") bindableNodeLabels := cliflag.ConfigurationMap(f.NodeLabels) fs.Var(&bindableNodeLabels, "node-labels", fmt.Sprintf(" Labels to add when registering the node in the cluster. Labels must be key=value pairs separated by ','. Labels in the 'kubernetes.io' namespace must begin with an allowed prefix (%s) or be in the specifically allowed set (%s)", strings.Join(kubeletapis.KubeletLabelNamespaces(), ", "), strings.Join(kubeletapis.KubeletLabels(), ", "))) @@ -369,9 +365,6 @@ func (f *KubeletFlags) AddFlags(mainfs *pflag.FlagSet) { fs.MarkDeprecated("non-masquerade-cidr", "will be removed in a future version") fs.BoolVar(&f.KeepTerminatedPodVolumes, "keep-terminated-pod-volumes", f.KeepTerminatedPodVolumes, "Keep terminated pod volumes mounted to the node after the pod terminates. Can be useful for debugging volume related issues.") fs.MarkDeprecated("keep-terminated-pod-volumes", "will be removed in a future version") - fs.BoolVar(&f.EnableCAdvisorJSONEndpoints, "enable-cadvisor-json-endpoints", f.EnableCAdvisorJSONEndpoints, "Enable cAdvisor json /spec and /stats/* endpoints. [default=false]") - // TODO: Remove this flag in 1.20+. https://github.com/kubernetes/kubernetes/issues/68522 - fs.MarkDeprecated("enable-cadvisor-json-endpoints", "will be removed in a future version") fs.BoolVar(&f.ReallyCrashForTesting, "really-crash-for-testing", f.ReallyCrashForTesting, "If true, when panics occur crash. Intended for testing.") fs.MarkDeprecated("really-crash-for-testing", "will be removed in a future version.") fs.Float64Var(&f.ChaosChance, "chaos-chance", f.ChaosChance, "If > 0.0, introduce random client errors and latency. Intended for testing.") @@ -416,7 +409,7 @@ func AddKubeletConfigFlags(mainfs *pflag.FlagSet, c *kubeletconfig.KubeletConfig fs.DurationVar(&c.HTTPCheckFrequency.Duration, "http-check-frequency", c.HTTPCheckFrequency.Duration, "Duration between checking http for new data") fs.StringVar(&c.StaticPodURL, "manifest-url", c.StaticPodURL, "URL for accessing additional Pod specifications to run") fs.Var(cliflag.NewColonSeparatedMultimapStringString(&c.StaticPodURLHeader), "manifest-url-header", "Comma-separated list of HTTP headers to use when accessing the url provided to --manifest-url. Multiple headers with the same name will be added in the same order provided. This flag can be repeatedly invoked. For example: --manifest-url-header 'a:hello,b:again,c:world' --manifest-url-header 'b:beautiful'") - fs.Var(utilflag.IPVar{Val: &c.Address}, "address", "The IP address for the Kubelet to serve on (set to '0.0.0.0' for all IPv4 interfaces and '::' for all IPv6 interfaces)") + fs.Var(utilflag.IPVar{Val: &c.Address}, "address", "The IP address for the Kubelet to serve on (set to '0.0.0.0' or '::' for listening in all interfaces and IP families)") fs.Int32Var(&c.Port, "port", c.Port, "The port for the Kubelet to serve on.") fs.Int32Var(&c.ReadOnlyPort, "read-only-port", c.ReadOnlyPort, "The read-only port for the Kubelet to serve on with no authentication/authorization (set to 0 to disable)") @@ -470,7 +463,7 @@ func AddKubeletConfigFlags(mainfs *pflag.FlagSet, c *kubeletconfig.KubeletConfig fs.BoolVar(&c.EnableDebuggingHandlers, "enable-debugging-handlers", c.EnableDebuggingHandlers, "Enables server endpoints for log collection and local running of containers and commands") fs.BoolVar(&c.EnableContentionProfiling, "contention-profiling", c.EnableContentionProfiling, "Enable lock contention profiling, if profiling is enabled") fs.Int32Var(&c.HealthzPort, "healthz-port", c.HealthzPort, "The port of the localhost healthz endpoint (set to 0 to disable)") - fs.Var(utilflag.IPVar{Val: &c.HealthzBindAddress}, "healthz-bind-address", "The IP address for the healthz server to serve on (set to '0.0.0.0' for all IPv4 interfaces and '::' for all IPv6 interfaces)") + fs.Var(utilflag.IPVar{Val: &c.HealthzBindAddress}, "healthz-bind-address", "The IP address for the healthz server to serve on (set to '0.0.0.0' or '::' for listening in all interfaces and IP families)") fs.Int32Var(&c.OOMScoreAdj, "oom-score-adj", c.OOMScoreAdj, "The oom-score-adj value for kubelet process. Values must be within the range [-1000, 1000]") fs.StringVar(&c.ClusterDomain, "cluster-domain", c.ClusterDomain, "Domain for this cluster. If set, kubelet will configure all containers to search this domain in addition to the host's search domains") @@ -481,7 +474,7 @@ func AddKubeletConfigFlags(mainfs *pflag.FlagSet, c *kubeletconfig.KubeletConfig fs.DurationVar(&c.ImageMinimumGCAge.Duration, "minimum-image-ttl-duration", c.ImageMinimumGCAge.Duration, "Minimum age for an unused image before it is garbage collected. Examples: '300ms', '10s' or '2h45m'.") fs.Int32Var(&c.ImageGCHighThresholdPercent, "image-gc-high-threshold", c.ImageGCHighThresholdPercent, "The percent of disk usage after which image garbage collection is always run. Values must be within the range [0, 100], To disable image garbage collection, set to 100. ") fs.Int32Var(&c.ImageGCLowThresholdPercent, "image-gc-low-threshold", c.ImageGCLowThresholdPercent, "The percent of disk usage before which image garbage collection is never run. Lowest disk usage to garbage collect to. Values must be within the range [0, 100] and should not be larger than that of --image-gc-high-threshold.") - fs.DurationVar(&c.VolumeStatsAggPeriod.Duration, "volume-stats-agg-period", c.VolumeStatsAggPeriod.Duration, "Specifies interval for kubelet to calculate and cache the volume disk usage for all pods and volumes. To disable volume calculations, set to 0.") + fs.DurationVar(&c.VolumeStatsAggPeriod.Duration, "volume-stats-agg-period", c.VolumeStatsAggPeriod.Duration, "Specifies interval for kubelet to calculate and cache the volume disk usage for all pods and volumes. To disable volume calculations, set to a negative number.") fs.Var(cliflag.NewMapStringBool(&c.FeatureGates), "feature-gates", "A set of key=value pairs that describe feature gates for alpha/experimental features. "+ "Options are:\n"+strings.Join(utilfeature.DefaultFeatureGate.KnownFeatures(), "\n")) fs.StringVar(&c.KubeletCgroups, "kubelet-cgroups", c.KubeletCgroups, "Optional absolute name of cgroups to create and run the Kubelet in.") @@ -492,7 +485,7 @@ func AddKubeletConfigFlags(mainfs *pflag.FlagSet, c *kubeletconfig.KubeletConfig fs.BoolVar(&c.CgroupsPerQOS, "cgroups-per-qos", c.CgroupsPerQOS, "Enable creation of QoS cgroup hierarchy, if true top level QoS and pod cgroups are created.") fs.StringVar(&c.CgroupDriver, "cgroup-driver", c.CgroupDriver, "Driver that the kubelet uses to manipulate cgroups on the host. Possible values: 'cgroupfs', 'systemd'") fs.StringVar(&c.CgroupRoot, "cgroup-root", c.CgroupRoot, "Optional root cgroup to use for pods. This is handled by the container runtime on a best effort basis. Default: '', which means use the container runtime default.") - fs.StringVar(&c.CPUManagerPolicy, "cpu-manager-policy", c.CPUManagerPolicy, "CPU Manager policy to use. Possible values: 'none', 'static'. Default: 'none'") + fs.StringVar(&c.CPUManagerPolicy, "cpu-manager-policy", c.CPUManagerPolicy, "CPU Manager policy to use. Possible values: 'none', 'static'.") fs.DurationVar(&c.CPUManagerReconcilePeriod.Duration, "cpu-manager-reconcile-period", c.CPUManagerReconcilePeriod.Duration, " CPU Manager reconciliation period. Examples: '10s', or '1m'. If not supplied, defaults to 'NodeStatusUpdateFrequency'") fs.Var(cliflag.NewMapStringString(&c.QOSReserved), "qos-reserved", " A set of ResourceName=Percentage (e.g. memory=50%) pairs that describe how pod resource requests are reserved at the QoS level. Currently only memory is supported. Requires the QOSReserved feature gate to be enabled.") fs.StringVar(&c.TopologyManagerPolicy, "topology-manager-policy", c.TopologyManagerPolicy, "Topology Manager policy to use. Possible values: 'none', 'best-effort', 'restricted', 'single-numa-node'.") @@ -537,17 +530,22 @@ func AddKubeletConfigFlags(mainfs *pflag.FlagSet, c *kubeletconfig.KubeletConfig fs.Int32Var(&c.PodsPerCore, "pods-per-core", c.PodsPerCore, "Number of Pods per core that can run on this Kubelet. The total number of Pods on this Kubelet cannot exceed max-pods, so max-pods will be used if this calculation results in a larger number of Pods allowed on the Kubelet. A value of 0 disables this limit.") fs.BoolVar(&c.ProtectKernelDefaults, "protect-kernel-defaults", c.ProtectKernelDefaults, "Default kubelet behaviour for kernel tuning. If set, kubelet errors if any of kernel tunables is different than kubelet defaults.") fs.StringVar(&c.ReservedSystemCPUs, "reserved-cpus", c.ReservedSystemCPUs, "A comma-separated list of CPUs or CPU ranges that are reserved for system and kubernetes usage. This specific list will supersede cpu counts in --system-reserved and --kube-reserved.") - fs.StringVar(&c.TopologyManagerScope, "topology-manager-scope", c.TopologyManagerScope, "Scope to which topology hints applied. Topology Manager collects hints from Hint Providers and applies them to defined scope to ensure the pod admission. Possible values: 'container' (default), 'pod'.") + fs.StringVar(&c.TopologyManagerScope, "topology-manager-scope", c.TopologyManagerScope, "Scope to which topology hints applied. Topology Manager collects hints from Hint Providers and applies them to defined scope to ensure the pod admission. Possible values: 'container', 'pod'.") // Node Allocatable Flags fs.Var(cliflag.NewMapStringString(&c.SystemReserved), "system-reserved", "A set of ResourceName=ResourceQuantity (e.g. cpu=200m,memory=500Mi,ephemeral-storage=1Gi) pairs that describe resources reserved for non-kubernetes components. Currently only cpu and memory are supported. See http://kubernetes.io/docs/user-guide/compute-resources for more detail. [default=none]") fs.Var(cliflag.NewMapStringString(&c.KubeReserved), "kube-reserved", "A set of ResourceName=ResourceQuantity (e.g. cpu=200m,memory=500Mi,ephemeral-storage=1Gi) pairs that describe resources reserved for kubernetes system components. Currently cpu, memory and local ephemeral storage for root file system are supported. See http://kubernetes.io/docs/user-guide/compute-resources for more detail. [default=none]") fs.StringSliceVar(&c.EnforceNodeAllocatable, "enforce-node-allocatable", c.EnforceNodeAllocatable, "A comma separated list of levels of node allocatable enforcement to be enforced by kubelet. Acceptable options are 'none', 'pods', 'system-reserved', and 'kube-reserved'. If the latter two options are specified, '--system-reserved-cgroup' and '--kube-reserved-cgroup' must also be set, respectively. If 'none' is specified, no additional options should be set. See https://kubernetes.io/docs/tasks/administer-cluster/reserve-compute-resources/ for more details.") fs.StringVar(&c.SystemReservedCgroup, "system-reserved-cgroup", c.SystemReservedCgroup, "Absolute name of the top level cgroup that is used to manage non-kubernetes components for which compute resources were reserved via '--system-reserved' flag. Ex. '/system-reserved'. [default='']") fs.StringVar(&c.KubeReservedCgroup, "kube-reserved-cgroup", c.KubeReservedCgroup, "Absolute name of the top level cgroup that is used to manage kubernetes components for which compute resources were reserved via '--kube-reserved' flag. Ex. '/kube-reserved'. [default='']") - fs.StringVar(&c.Logging.Format, "logging-format", c.Logging.Format, `Sets the log format. Permitted formats: "text", "json".\nNon-default formats don't honor these flags: -add_dir_header, --alsologtostderr, --log_backtrace_at, --log_dir, --log_file, --log_file_max_size, --logtostderr, --skip_headers, --skip_log_headers, --stderrthreshold, --log-flush-frequency.\nNon-default choices are currently alpha and subject to change without warning.`) + fs.StringVar(&c.Logging.Format, "logging-format", c.Logging.Format, "Sets the log format. Permitted formats: \"text\", \"json\".\nNon-default formats don't honor these flags: -add_dir_header, --alsologtostderr, --log_backtrace_at, --log_dir, --log_file, --log_file_max_size, --logtostderr, --skip_headers, --skip_log_headers, --stderrthreshold, --log-flush-frequency.\nNon-default choices are currently alpha and subject to change without warning.") fs.BoolVar(&c.Logging.Sanitization, "experimental-logging-sanitization", c.Logging.Sanitization, `[Experimental] When enabled prevents logging of fields tagged as sensitive (passwords, keys, tokens). Runtime log sanitization may introduce significant computation overhead and therefore should not be enabled in production.`) // Graduated experimental flags, kept for backward compatibility fs.BoolVar(&c.KernelMemcgNotification, "experimental-kernel-memcg-notification", c.KernelMemcgNotification, "Use kernelMemcgNotification configuration, this flag will be removed in 1.23.") + + // Memory Manager Flags + fs.StringVar(&c.MemoryManagerPolicy, "memory-manager-policy", c.MemoryManagerPolicy, "Memory Manager policy to use. Possible values: 'None', 'Static'.") + // TODO: once documentation link is available, replace KEP link with the documentation one. + fs.Var(&utilflag.ReservedMemoryVar{Value: &c.ReservedMemory}, "reserved-memory", "A comma separated list of memory reservations for NUMA nodes. (e.g. --reserved-memory 0:memory=1Gi,hugepages-1M=2Gi --reserved-memory 1:memory=2Gi). The total sum for each memory type should be equal to the sum of kube-reserved, system-reserved and eviction-threshold. See more details under https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/1769-memory-manager#reserved-memory-flag") } diff --git a/vendor/k8s.io/kubernetes/cmd/kubelet/app/patch_auth.go b/vendor/k8s.io/kubernetes/cmd/kubelet/app/patch_auth.go new file mode 100644 index 000000000000..04d860cf5e6d --- /dev/null +++ b/vendor/k8s.io/kubernetes/cmd/kubelet/app/patch_auth.go @@ -0,0 +1,17 @@ +package app + +import ( + "github.com/openshift/library-go/pkg/authorization/hardcodedauthorizer" + "k8s.io/apiserver/pkg/authorization/authorizer" + "k8s.io/apiserver/pkg/authorization/union" +) + +// wrapAuthorizerWithMetricsScraper add an authorizer to always approver the openshift metrics scraper. +// This eliminates an unnecessary SAR for scraping metrics and enables metrics gathering when network access +// to the kube-apiserver is interrupted +func wrapAuthorizerWithMetricsScraper(authz authorizer.Authorizer) authorizer.Authorizer { + return union.New( + hardcodedauthorizer.NewHardCodedMetricsAuthorizer(), + authz, + ) +} diff --git a/vendor/k8s.io/kubernetes/cmd/kubelet/app/plugins.go b/vendor/k8s.io/kubernetes/cmd/kubelet/app/plugins.go index af9f708dc525..dc5125295c87 100644 --- a/vendor/k8s.io/kubernetes/cmd/kubelet/app/plugins.go +++ b/vendor/k8s.io/kubernetes/cmd/kubelet/app/plugins.go @@ -18,11 +18,6 @@ package app // This file exists to force the desired plugin implementations to be linked. import ( - // Credential providers - _ "k8s.io/kubernetes/pkg/credentialprovider/aws" - _ "k8s.io/kubernetes/pkg/credentialprovider/azure" - _ "k8s.io/kubernetes/pkg/credentialprovider/gcp" - "k8s.io/component-base/featuregate" "k8s.io/utils/exec" diff --git a/vendor/k8s.io/kubernetes/cmd/kubelet/app/plugins_providers.go b/vendor/k8s.io/kubernetes/cmd/kubelet/app/plugins_providers.go index 9f8ce86ff0b4..7261cd13b6a8 100644 --- a/vendor/k8s.io/kubernetes/cmd/kubelet/app/plugins_providers.go +++ b/vendor/k8s.io/kubernetes/cmd/kubelet/app/plugins_providers.go @@ -19,6 +19,11 @@ limitations under the License. package app import ( + // Credential providers + _ "k8s.io/kubernetes/pkg/credentialprovider/aws" + _ "k8s.io/kubernetes/pkg/credentialprovider/azure" + _ "k8s.io/kubernetes/pkg/credentialprovider/gcp" + "k8s.io/component-base/featuregate" "k8s.io/csi-translation-lib/plugins" "k8s.io/klog/v2" @@ -35,41 +40,51 @@ import ( type probeFn func() []volume.VolumePlugin -func appendPluginBasedOnMigrationFeatureFlags(plugins []volume.VolumePlugin, inTreePluginName string, featureGate featuregate.FeatureGate, pluginMigration, pluginMigrationComplete featuregate.Feature, fn probeFn) ([]volume.VolumePlugin, error) { +func appendPluginBasedOnFeatureFlags(plugins []volume.VolumePlugin, inTreePluginName string, + featureGate featuregate.FeatureGate, pluginInfo pluginInfo) ([]volume.VolumePlugin, error) { // Skip appending the in-tree plugin to the list of plugins to be probed/initialized // if the CSIMigration feature flag and plugin specific feature flag indicating // CSI migration is complete - err := csimigration.CheckMigrationFeatureFlags(featureGate, pluginMigration, pluginMigrationComplete) + migrationComplete, err := csimigration.CheckMigrationFeatureFlags(featureGate, pluginInfo.pluginMigrationFeature, + pluginInfo.pluginMigrationCompleteFeature, pluginInfo.pluginUnregisterFeature) if err != nil { - klog.Warningf("Unexpected CSI Migration Feature Flags combination detected: %v. CSI Migration may not take effect", err) + klog.InfoS("Unexpected CSI Migration Feature Flags combination detected, CSI Migration may not take effect", "err", err) // TODO: fail and return here once alpha only tests can set the feature flags for a plugin correctly } - if featureGate.Enabled(features.CSIMigration) && featureGate.Enabled(pluginMigration) && featureGate.Enabled(pluginMigrationComplete) { - klog.Infof("Skip registration of plugin %s since feature flag %v is enabled", inTreePluginName, pluginMigrationComplete) + // TODO: This can be removed after feature flag CSIMigrationvSphereComplete is removed. + if migrationComplete { + klog.InfoS("Skipped registration of plugin since migration is completed", "pluginName", inTreePluginName) + return plugins, nil + } + if featureGate.Enabled(pluginInfo.pluginUnregisterFeature) { + klog.InfoS("Skipped registration of plugin since feature flag is enabled", "pluginName", inTreePluginName, "featureFlag", pluginInfo.pluginUnregisterFeature) return plugins, nil } - plugins = append(plugins, fn()...) + + plugins = append(plugins, pluginInfo.pluginProbeFunction()...) return plugins, nil } type pluginInfo struct { - pluginMigrationFeature featuregate.Feature + pluginMigrationFeature featuregate.Feature + // deprecated, only to keep here for vSphere pluginMigrationCompleteFeature featuregate.Feature + pluginUnregisterFeature featuregate.Feature pluginProbeFunction probeFn } func appendLegacyProviderVolumes(allPlugins []volume.VolumePlugin, featureGate featuregate.FeatureGate) ([]volume.VolumePlugin, error) { pluginMigrationStatus := make(map[string]pluginInfo) - pluginMigrationStatus[plugins.AWSEBSInTreePluginName] = pluginInfo{pluginMigrationFeature: features.CSIMigrationAWS, pluginMigrationCompleteFeature: features.CSIMigrationAWSComplete, pluginProbeFunction: awsebs.ProbeVolumePlugins} - pluginMigrationStatus[plugins.GCEPDInTreePluginName] = pluginInfo{pluginMigrationFeature: features.CSIMigrationGCE, pluginMigrationCompleteFeature: features.CSIMigrationGCEComplete, pluginProbeFunction: gcepd.ProbeVolumePlugins} - pluginMigrationStatus[plugins.CinderInTreePluginName] = pluginInfo{pluginMigrationFeature: features.CSIMigrationOpenStack, pluginMigrationCompleteFeature: features.CSIMigrationOpenStackComplete, pluginProbeFunction: cinder.ProbeVolumePlugins} - pluginMigrationStatus[plugins.AzureDiskInTreePluginName] = pluginInfo{pluginMigrationFeature: features.CSIMigrationAzureDisk, pluginMigrationCompleteFeature: features.CSIMigrationAzureDiskComplete, pluginProbeFunction: azuredd.ProbeVolumePlugins} - pluginMigrationStatus[plugins.AzureFileInTreePluginName] = pluginInfo{pluginMigrationFeature: features.CSIMigrationAzureFile, pluginMigrationCompleteFeature: features.CSIMigrationAzureFileComplete, pluginProbeFunction: azure_file.ProbeVolumePlugins} - pluginMigrationStatus[plugins.VSphereInTreePluginName] = pluginInfo{pluginMigrationFeature: features.CSIMigrationvSphere, pluginMigrationCompleteFeature: features.CSIMigrationvSphereComplete, pluginProbeFunction: vsphere_volume.ProbeVolumePlugins} + pluginMigrationStatus[plugins.AWSEBSInTreePluginName] = pluginInfo{pluginMigrationFeature: features.CSIMigrationAWS, pluginUnregisterFeature: features.InTreePluginAWSUnregister, pluginProbeFunction: awsebs.ProbeVolumePlugins} + pluginMigrationStatus[plugins.GCEPDInTreePluginName] = pluginInfo{pluginMigrationFeature: features.CSIMigrationGCE, pluginUnregisterFeature: features.InTreePluginGCEUnregister, pluginProbeFunction: gcepd.ProbeVolumePlugins} + pluginMigrationStatus[plugins.CinderInTreePluginName] = pluginInfo{pluginMigrationFeature: features.CSIMigrationOpenStack, pluginUnregisterFeature: features.InTreePluginOpenStackUnregister, pluginProbeFunction: cinder.ProbeVolumePlugins} + pluginMigrationStatus[plugins.AzureDiskInTreePluginName] = pluginInfo{pluginMigrationFeature: features.CSIMigrationAzureDisk, pluginUnregisterFeature: features.InTreePluginAzureDiskUnregister, pluginProbeFunction: azuredd.ProbeVolumePlugins} + pluginMigrationStatus[plugins.AzureFileInTreePluginName] = pluginInfo{pluginMigrationFeature: features.CSIMigrationAzureFile, pluginUnregisterFeature: features.InTreePluginAzureFileUnregister, pluginProbeFunction: azure_file.ProbeVolumePlugins} + pluginMigrationStatus[plugins.VSphereInTreePluginName] = pluginInfo{pluginMigrationFeature: features.CSIMigrationvSphere, pluginMigrationCompleteFeature: features.CSIMigrationvSphereComplete, pluginUnregisterFeature: features.InTreePluginvSphereUnregister, pluginProbeFunction: vsphere_volume.ProbeVolumePlugins} var err error for pluginName, pluginInfo := range pluginMigrationStatus { - allPlugins, err = appendPluginBasedOnMigrationFeatureFlags(allPlugins, pluginName, featureGate, pluginInfo.pluginMigrationFeature, pluginInfo.pluginMigrationCompleteFeature, pluginInfo.pluginProbeFunction) + allPlugins, err = appendPluginBasedOnFeatureFlags(allPlugins, pluginName, featureGate, pluginInfo) if err != nil { return allPlugins, err } diff --git a/vendor/k8s.io/kubernetes/cmd/kubelet/app/server.go b/vendor/k8s.io/kubernetes/cmd/kubelet/app/server.go index ff7e05feec12..2dc10a512b3c 100644 --- a/vendor/k8s.io/kubernetes/cmd/kubelet/app/server.go +++ b/vendor/k8s.io/kubernetes/cmd/kubelet/app/server.go @@ -1,5 +1,5 @@ /* -Copyright 2015 The Kubernetes Authors. +Copyright 2021 The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -117,7 +117,8 @@ func NewKubeletCommand() *cobra.Command { kubeletConfig, err := options.NewKubeletConfiguration() // programmer error if err != nil { - klog.Fatal(err) + klog.ErrorS(err, "Failed to create a new kubelet configuration") + os.Exit(1) } cmd := &cobra.Command{ @@ -152,21 +153,24 @@ HTTP server: The kubelet can also listen for HTTP and respond to a simple API Run: func(cmd *cobra.Command, args []string) { // initial flag parse, since we disable cobra's flag parsing if err := cleanFlagSet.Parse(args); err != nil { + klog.ErrorS(err, "Failed to parse kubelet flag") cmd.Usage() - klog.Fatal(err) + os.Exit(1) } // check if there are non-flag arguments in the command line cmds := cleanFlagSet.Args() if len(cmds) > 0 { + klog.ErrorS(nil, "Unknown command", "command", cmds[0]) cmd.Usage() - klog.Fatalf("unknown command: %s", cmds[0]) + os.Exit(1) } // short-circuit on help help, err := cleanFlagSet.GetBool("help") if err != nil { - klog.Fatal(`"help" flag is non-bool, programmer error, please correct`) + klog.InfoS(`"help" flag is non-bool, programmer error, please correct`) + os.Exit(1) } if help { cmd.Help() @@ -179,44 +183,50 @@ HTTP server: The kubelet can also listen for HTTP and respond to a simple API // set feature gates from initial flags-based config if err := utilfeature.DefaultMutableFeatureGate.SetFromMap(kubeletConfig.FeatureGates); err != nil { - klog.Fatal(err) + klog.ErrorS(err, "Failed to set feature gates from initial flags-based config") + os.Exit(1) } // validate the initial KubeletFlags if err := options.ValidateKubeletFlags(kubeletFlags); err != nil { - klog.Fatal(err) + klog.ErrorS(err, "Failed to validate kubelet flags") + os.Exit(1) } if kubeletFlags.ContainerRuntime == "remote" && cleanFlagSet.Changed("pod-infra-container-image") { - klog.Warning("Warning: For remote container runtime, --pod-infra-container-image is ignored in kubelet, which should be set in that remote runtime instead") + klog.InfoS("Warning: For remote container runtime, --pod-infra-container-image is ignored in kubelet, which should be set in that remote runtime instead") } // load kubelet config file, if provided if configFile := kubeletFlags.KubeletConfigFile; len(configFile) > 0 { kubeletConfig, err = loadConfigFile(configFile) if err != nil { - klog.Fatal(err) + klog.ErrorS(err, "Failed to load kubelet config file", "path", configFile) + os.Exit(1) } // We must enforce flag precedence by re-parsing the command line into the new object. // This is necessary to preserve backwards-compatibility across binary upgrades. // See issue #56171 for more details. if err := kubeletConfigFlagPrecedence(kubeletConfig, args); err != nil { - klog.Fatal(err) + klog.ErrorS(err, "Failed to precedence kubeletConfigFlag") + os.Exit(1) } // update feature gates based on new config if err := utilfeature.DefaultMutableFeatureGate.SetFromMap(kubeletConfig.FeatureGates); err != nil { - klog.Fatal(err) + klog.ErrorS(err, "Failed to set feature gates from initial flags-based config") + os.Exit(1) } } // We always validate the local configuration (command line + config file). // This is the default "last-known-good" config for dynamic config, and must always remain valid. if err := kubeletconfigvalidation.ValidateKubeletConfiguration(kubeletConfig); err != nil { - klog.Fatal(err) + klog.ErrorS(err, "Failed to validate kubelet configuration", "path", kubeletConfig) + os.Exit(1) } if (kubeletConfig.KubeletCgroups != "" && kubeletConfig.KubeReservedCgroup != "") && (0 != strings.Index(kubeletConfig.KubeletCgroups, kubeletConfig.KubeReservedCgroup)) { - klog.Warning("unsupported configuration:KubeletCgroups is not within KubeReservedCgroup") + klog.InfoS("unsupported configuration:KubeletCgroups is not within KubeReservedCgroup") } // use dynamic kubelet config, if enabled @@ -232,7 +242,8 @@ HTTP server: The kubelet can also listen for HTTP and respond to a simple API return kubeletConfigFlagPrecedence(kc, args) }) if err != nil { - klog.Fatal(err) + klog.ErrorS(err, "Failed to bootstrap a configuration controller", "dynamicConfigDir", dynamicConfigDir) + os.Exit(1) } // If we should just use our existing, local config, the controller will return a nil config if dynamicKubeletConfig != nil { @@ -240,7 +251,8 @@ HTTP server: The kubelet can also listen for HTTP and respond to a simple API // Note: flag precedence was already enforced in the controller, prior to validation, // by our above transform function. Now we simply update feature gates from the new config. if err := utilfeature.DefaultMutableFeatureGate.SetFromMap(kubeletConfig.FeatureGates); err != nil { - klog.Fatal(err) + klog.ErrorS(err, "Failed to set feature gates from initial flags-based config") + os.Exit(1) } } } @@ -254,19 +266,31 @@ HTTP server: The kubelet can also listen for HTTP and respond to a simple API // use kubeletServer to construct the default KubeletDeps kubeletDeps, err := UnsecuredDependencies(kubeletServer, utilfeature.DefaultFeatureGate) if err != nil { - klog.Fatal(err) + klog.ErrorS(err, "Failed to construct kubelet dependencies") + os.Exit(1) } // add the kubelet config controller to kubeletDeps kubeletDeps.KubeletConfigController = kubeletConfigController + if err := checkPermissions(); err != nil { + klog.ErrorS(err, "kubelet running with insufficient permissions") + } // set up signal context here in order to be reused by kubelet and docker shim ctx := genericapiserver.SetupSignalContext() + // make the kubelet's config safe for logging + config := kubeletServer.KubeletConfiguration.DeepCopy() + for k := range config.StaticPodURLHeader { + config.StaticPodURLHeader[k] = []string{""} + } + // log the kubelet's config for inspection + klog.V(5).InfoS("KubeletConfiguration", "configuration", kubeletServer.KubeletConfiguration) + // run the kubelet - klog.V(5).Infof("KubeletConfiguration: %#v", kubeletServer.KubeletConfiguration) if err := Run(ctx, kubeletServer, kubeletDeps, utilfeature.DefaultFeatureGate); err != nil { - klog.Fatal(err) + klog.ErrorS(err, "Failed to run kubelet") + os.Exit(1) } }, } @@ -413,7 +437,7 @@ func Run(ctx context.Context, s *options.KubeletServer, kubeDeps *kubelet.Depend logOption.LogSanitization = s.Logging.Sanitization logOption.Apply() // To help debugging, immediately log version - klog.Infof("Version: %+v", version.Get()) + klog.InfoS("Kubelet version", "kubeletVersion", version.Get()) if err := initForOS(s.KubeletFlags.WindowsService, s.KubeletFlags.WindowsPriorityClass); err != nil { return fmt.Errorf("failed OS init: %v", err) } @@ -423,15 +447,6 @@ func Run(ctx context.Context, s *options.KubeletServer, kubeDeps *kubelet.Depend return nil } -func checkPermissions() error { - if uid := os.Getuid(); uid != 0 { - return fmt.Errorf("kubelet needs to run as uid `0`. It is being run as %d", uid) - } - // TODO: Check if kubelet is running in the `initial` user namespace. - // http://man7.org/linux/man-pages/man7/user_namespaces.7.html - return nil -} - func setConfigz(cz *configz.Config, kc *kubeletconfiginternal.KubeletConfiguration) error { scheme, _, err := kubeletscheme.NewSchemeAndCodecs() if err != nil { @@ -448,11 +463,11 @@ func setConfigz(cz *configz.Config, kc *kubeletconfiginternal.KubeletConfigurati func initConfigz(kc *kubeletconfiginternal.KubeletConfiguration) error { cz, err := configz.New("kubeletconfig") if err != nil { - klog.Errorf("unable to register configz: %s", err) + klog.ErrorS(err, "Failed to register configz") return err } if err := setConfigz(cz, kc); err != nil { - klog.Errorf("unable to register config: %s", err) + klog.ErrorS(err, "Failed to register config") return err } return nil @@ -467,10 +482,10 @@ func makeEventRecorder(kubeDeps *kubelet.Dependencies, nodeName types.NodeName) kubeDeps.Recorder = eventBroadcaster.NewRecorder(legacyscheme.Scheme, v1.EventSource{Component: componentKubelet, Host: string(nodeName)}) eventBroadcaster.StartStructuredLogging(3) if kubeDeps.EventClient != nil { - klog.V(4).Infof("Sending events to api server.") + klog.V(4).InfoS("Sending events to api server") eventBroadcaster.StartRecordingToSink(&v1core.EventSinkImpl{Interface: kubeDeps.EventClient.Events("")}) } else { - klog.Warning("No api server defined - no events will be sent to API server.") + klog.InfoS("No api server defined - no events will be sent to API server") } } @@ -491,12 +506,12 @@ func run(ctx context.Context, s *options.KubeletServer, kubeDeps *kubelet.Depend } done := make(chan struct{}) if s.LockFilePath != "" { - klog.Infof("acquiring file lock on %q", s.LockFilePath) + klog.InfoS("Acquiring file lock", "path", s.LockFilePath) if err := flock.Acquire(s.LockFilePath); err != nil { return fmt.Errorf("unable to acquire file lock on %q: %v", s.LockFilePath, err) } if s.ExitOnLockContention { - klog.Infof("watching for inotify events for: %v", s.LockFilePath) + klog.InfoS("Watching for inotify events", "path", s.LockFilePath) if err := watchForLockfileContention(s.LockFilePath, done); err != nil { return err } @@ -506,7 +521,7 @@ func run(ctx context.Context, s *options.KubeletServer, kubeDeps *kubelet.Depend // Register current configuration with /configz endpoint err = initConfigz(&s.KubeletConfiguration) if err != nil { - klog.Errorf("unable to register KubeletConfiguration with configz, error: %v", err) + klog.ErrorS(err, "Failed to register kubelet configuration with configz") } if len(s.ShowHiddenMetricsForVersion) > 0 { @@ -534,7 +549,7 @@ func run(ctx context.Context, s *options.KubeletServer, kubeDeps *kubelet.Depend return err } if cloud != nil { - klog.V(2).Infof("Successfully initialized cloud provider: %q from the config file: %q\n", s.CloudProvider, s.CloudConfigFile) + klog.V(2).InfoS("Successfully initialized cloud provider", "cloudProvider", s.CloudProvider, "cloudConfigFile", s.CloudConfigFile) } kubeDeps.Cloud = cloud } @@ -555,7 +570,7 @@ func run(ctx context.Context, s *options.KubeletServer, kubeDeps *kubelet.Depend kubeDeps.KubeClient = nil kubeDeps.EventClient = nil kubeDeps.HeartbeatClient = nil - klog.Warningf("standalone mode, no API client") + klog.InfoS("Standalone mode, no API client") case kubeDeps.KubeClient == nil, kubeDeps.EventClient == nil, kubeDeps.HeartbeatClient == nil: clientConfig, closeAllConns, err := buildKubeletClientConfig(ctx, s, nodeName) @@ -611,14 +626,14 @@ func run(ctx context.Context, s *options.KubeletServer, kubeDeps *kubelet.Depend cgroupRoots = append(cgroupRoots, nodeAllocatableRoot) kubeletCgroup, err := cm.GetKubeletContainer(s.KubeletCgroups) if err != nil { - klog.Warningf("failed to get the kubelet's cgroup: %v. Kubelet system container metrics may be missing.", err) + klog.InfoS("Failed to get the kubelet's cgroup. Kubelet system container metrics may be missing.", "err", err) } else if kubeletCgroup != "" { cgroupRoots = append(cgroupRoots, kubeletCgroup) } runtimeCgroup, err := cm.GetRuntimeContainer(s.ContainerRuntime, s.RuntimeCgroups) if err != nil { - klog.Warningf("failed to get the container runtime's cgroup: %v. Runtime system container metrics may be missing.", err) + klog.InfoS("Failed to get the container runtime's cgroup. Runtime system container metrics may be missing.", "err", err) } else if runtimeCgroup != "" { // RuntimeCgroups is optional, so ignore if it isn't specified cgroupRoots = append(cgroupRoots, runtimeCgroup) @@ -642,7 +657,7 @@ func run(ctx context.Context, s *options.KubeletServer, kubeDeps *kubelet.Depend if kubeDeps.ContainerManager == nil { if s.CgroupsPerQOS && s.CgroupRoot == "" { - klog.Info("--cgroups-per-qos enabled, but --cgroup-root was not specified. defaulting to /") + klog.InfoS("--cgroups-per-qos enabled, but --cgroup-root was not specified. defaulting to /") s.CgroupRoot = "/" } @@ -652,14 +667,14 @@ func run(ctx context.Context, s *options.KubeletServer, kubeDeps *kubelet.Depend machineInfo, err := kubeDeps.CAdvisorInterface.MachineInfo() if err != nil { // if can't use CAdvisor here, fall back to non-explicit cpu list behavor - klog.Warning("Failed to get MachineInfo, set reservedSystemCPUs to empty") + klog.InfoS("Failed to get MachineInfo, set reservedSystemCPUs to empty") reservedSystemCPUs = cpuset.NewCPUSet() } else { var errParse error reservedSystemCPUs, errParse = cpuset.Parse(s.ReservedSystemCPUs) if errParse != nil { // invalid cpu list is provided, set reservedSystemCPUs to empty, so it won't overwrite kubeReserved/systemReserved - klog.Infof("Invalid ReservedSystemCPUs \"%s\"", s.ReservedSystemCPUs) + klog.InfoS("Invalid ReservedSystemCPUs", "systemReservedCPUs", s.ReservedSystemCPUs) return errParse } reservedList := reservedSystemCPUs.ToSlice() @@ -667,7 +682,7 @@ func run(ctx context.Context, s *options.KubeletServer, kubeDeps *kubelet.Depend last := reservedList[len(reservedList)-1] if first < 0 || last >= machineInfo.NumCores { // the specified cpuset is outside of the range of what the machine has - klog.Infof("Invalid cpuset specified by --reserved-cpus") + klog.InfoS("Invalid cpuset specified by --reserved-cpus") return fmt.Errorf("Invalid cpuset %q specified by --reserved-cpus", s.ReservedSystemCPUs) } } @@ -677,7 +692,7 @@ func run(ctx context.Context, s *options.KubeletServer, kubeDeps *kubelet.Depend if reservedSystemCPUs.Size() > 0 { // at cmd option valication phase it is tested either --system-reserved-cgroup or --kube-reserved-cgroup is specified, so overwrite should be ok - klog.Infof("Option --reserved-cpus is specified, it will overwrite the cpu setting in KubeReserved=\"%v\", SystemReserved=\"%v\".", s.KubeReserved, s.SystemReserved) + klog.InfoS("Option --reserved-cpus is specified, it will overwrite the cpu setting in KubeReserved and SystemReserved", "kubeReservedCPUs", s.KubeReserved, "systemReservedCPUs", s.SystemReserved) if s.KubeReserved != nil { delete(s.KubeReserved, "cpu") } @@ -685,8 +700,9 @@ func run(ctx context.Context, s *options.KubeletServer, kubeDeps *kubelet.Depend s.SystemReserved = make(map[string]string) } s.SystemReserved["cpu"] = strconv.Itoa(reservedSystemCPUs.Size()) - klog.Infof("After cpu setting is overwritten, KubeReserved=\"%v\", SystemReserved=\"%v\"", s.KubeReserved, s.SystemReserved) + klog.InfoS("After cpu setting is overwritten", "kubeReservedCPUs", s.KubeReserved, "systemReservedCPUs", s.SystemReserved) } + kubeReserved, err := parseResourceList(s.KubeReserved) if err != nil { return err @@ -732,14 +748,16 @@ func run(ctx context.Context, s *options.KubeletServer, kubeDeps *kubelet.Depend ReservedSystemCPUs: reservedSystemCPUs, HardEvictionThresholds: hardEvictionThresholds, }, - QOSReserved: *experimentalQOSReserved, - ExperimentalCPUManagerPolicy: s.CPUManagerPolicy, - ExperimentalCPUManagerReconcilePeriod: s.CPUManagerReconcilePeriod.Duration, - ExperimentalPodPidsLimit: s.PodPidsLimit, - EnforceCPULimits: s.CPUCFSQuota, - CPUCFSQuotaPeriod: s.CPUCFSQuotaPeriod.Duration, - ExperimentalTopologyManagerPolicy: s.TopologyManagerPolicy, - ExperimentalTopologyManagerScope: s.TopologyManagerScope, + QOSReserved: *experimentalQOSReserved, + ExperimentalCPUManagerPolicy: s.CPUManagerPolicy, + ExperimentalCPUManagerReconcilePeriod: s.CPUManagerReconcilePeriod.Duration, + ExperimentalMemoryManagerPolicy: s.MemoryManagerPolicy, + ExperimentalMemoryManagerReservedMemory: s.ReservedMemory, + ExperimentalPodPidsLimit: s.PodPidsLimit, + EnforceCPULimits: s.CPUCFSQuota, + CPUCFSQuotaPeriod: s.CPUCFSQuotaPeriod.Duration, + ExperimentalTopologyManagerPolicy: s.TopologyManagerPolicy, + ExperimentalTopologyManagerScope: s.TopologyManagerScope, }, s.FailSwapOn, devicePluginEnabled, @@ -750,16 +768,12 @@ func run(ctx context.Context, s *options.KubeletServer, kubeDeps *kubelet.Depend } } - if err := checkPermissions(); err != nil { - klog.Error(err) - } - utilruntime.ReallyCrash = s.ReallyCrashForTesting // TODO(vmarmol): Do this through container config. oomAdjuster := kubeDeps.OOMAdjuster if err := oomAdjuster.ApplyOOMScoreAdj(0, int(s.OOMScoreAdj)); err != nil { - klog.Warning(err) + klog.InfoS("Failed to ApplyOOMScoreAdj", "err", err) } err = kubelet.PreInitRuntimeService(&s.KubeletConfiguration, @@ -791,7 +805,7 @@ func run(ctx context.Context, s *options.KubeletServer, kubeDeps *kubelet.Depend go wait.Until(func() { err := http.ListenAndServe(net.JoinHostPort(s.HealthzBindAddress, strconv.Itoa(int(s.HealthzPort))), mux) if err != nil { - klog.Errorf("Starting healthz server failed: %v", err) + klog.ErrorS(err, "Failed to start healthz server") } }, 5*time.Second, wait.NeverStop) } @@ -834,7 +848,7 @@ func buildKubeletClientConfig(ctx context.Context, s *options.KubeletServer, nod // which provides a high powered kubeconfig on the master with cert/key data, we must // bootstrap the cert manager with the contents of the initial client config. - klog.Infof("Client rotation is on, will bootstrap in background") + klog.InfoS("Client rotation is on, will bootstrap in background") certConfig, clientConfig, err := bootstrap.LoadClientConfig(s.KubeConfig, s.BootstrapKubeconfig, s.CertDirectory) if err != nil { return nil, nil, err @@ -878,7 +892,7 @@ func buildKubeletClientConfig(ctx context.Context, s *options.KubeletServer, nod return nil, nil, err } - klog.V(2).Info("Starting client certificate rotation.") + klog.V(2).InfoS("Starting client certificate rotation") clientCertificateManager.Start() return transportConfig, closeAllConns, nil @@ -972,7 +986,7 @@ func getNodeName(cloud cloudprovider.Interface, hostname string) (types.NodeName return "", fmt.Errorf("error fetching current node name from cloud provider: %v", err) } - klog.V(2).Infof("cloud provider determined current node name to be %s", nodeName) + klog.V(2).InfoS("Cloud provider determined current node", "nodeName", klog.KRef("", string(nodeName))) return nodeName, nil } @@ -1006,7 +1020,7 @@ func InitializeTLS(kf *options.KubeletFlags, kc *kubeletconfiginternal.KubeletCo return nil, err } - klog.V(4).Infof("Using self-signed cert (%s, %s)", kc.TLSCertFile, kc.TLSPrivateKeyFile) + klog.V(4).InfoS("Using self-signed cert", "TLSCertFile", kc.TLSCertFile, "TLSPrivateKeyFile", kc.TLSPrivateKeyFile) } } @@ -1020,7 +1034,7 @@ func InitializeTLS(kf *options.KubeletFlags, kc *kubeletconfiginternal.KubeletCo for i := 0; i < len(tlsCipherSuites); i++ { for cipherName, cipherID := range insecureCiphers { if tlsCipherSuites[i] == cipherID { - klog.Warningf("Use of insecure cipher '%s' detected.", cipherName) + klog.InfoS("Use of insecure cipher detected.", "cipher", cipherName) } } } @@ -1093,7 +1107,7 @@ func RunKubelet(kubeServer *options.KubeletServer, kubeDeps *kubelet.Dependencie for _, ip := range strings.Split(kubeServer.NodeIP, ",") { parsedNodeIP := net.ParseIP(strings.TrimSpace(ip)) if parsedNodeIP == nil { - klog.Warningf("Could not parse --node-ip value %q; ignoring", ip) + klog.InfoS("Could not parse --node-ip ignoring", "IP", ip) } else { nodeIPs = append(nodeIPs, parsedNodeIP) } @@ -1114,7 +1128,7 @@ func RunKubelet(kubeServer *options.KubeletServer, kubeDeps *kubelet.Dependencie }) credentialprovider.SetPreferredDockercfgPath(kubeServer.RootDirectory) - klog.V(2).Infof("Using root directory: %v", kubeServer.RootDirectory) + klog.V(2).InfoS("Using root directory", "path", kubeServer.RootDirectory) if kubeDeps.OSInterface == nil { kubeDeps.OSInterface = kubecontainer.RealOS{} @@ -1162,7 +1176,7 @@ func RunKubelet(kubeServer *options.KubeletServer, kubeDeps *kubelet.Dependencie podCfg := kubeDeps.PodConfig if err := rlimit.SetNumFiles(uint64(kubeServer.MaxOpenFiles)); err != nil { - klog.Errorf("Failed to set rlimit on max file handles: %v", err) + klog.ErrorS(err, "Failed to set rlimit on max file handles") } // process pods and exit. @@ -1170,26 +1184,24 @@ func RunKubelet(kubeServer *options.KubeletServer, kubeDeps *kubelet.Dependencie if _, err := k.RunOnce(podCfg.Updates()); err != nil { return fmt.Errorf("runonce failed: %v", err) } - klog.Info("Started kubelet as runonce") + klog.InfoS("Started kubelet as runonce") } else { - startKubelet(k, podCfg, &kubeServer.KubeletConfiguration, kubeDeps, kubeServer.EnableCAdvisorJSONEndpoints, kubeServer.EnableServer) - klog.Info("Started kubelet") + startKubelet(k, podCfg, &kubeServer.KubeletConfiguration, kubeDeps, kubeServer.EnableServer) + klog.InfoS("Started kubelet") } return nil } -func startKubelet(k kubelet.Bootstrap, podCfg *config.PodConfig, kubeCfg *kubeletconfiginternal.KubeletConfiguration, kubeDeps *kubelet.Dependencies, enableCAdvisorJSONEndpoints, enableServer bool) { +func startKubelet(k kubelet.Bootstrap, podCfg *config.PodConfig, kubeCfg *kubeletconfiginternal.KubeletConfiguration, kubeDeps *kubelet.Dependencies, enableServer bool) { // start the kubelet go k.Run(podCfg.Updates()) // start the kubelet server if enableServer { - go k.ListenAndServe(net.ParseIP(kubeCfg.Address), uint(kubeCfg.Port), kubeDeps.TLSOptions, kubeDeps.Auth, - enableCAdvisorJSONEndpoints, kubeCfg.EnableDebuggingHandlers, kubeCfg.EnableContentionProfiling, kubeCfg.EnableSystemLogHandler) - + go k.ListenAndServe(kubeCfg, kubeDeps.TLSOptions, kubeDeps.Auth) } if kubeCfg.ReadOnlyPort > 0 { - go k.ListenAndServeReadOnly(net.ParseIP(kubeCfg.Address), uint(kubeCfg.ReadOnlyPort), enableCAdvisorJSONEndpoints) + go k.ListenAndServeReadOnly(net.ParseIP(kubeCfg.Address), uint(kubeCfg.ReadOnlyPort)) } if utilfeature.DefaultFeatureGate.Enabled(features.KubeletPodResources) { go k.ListenAndServePodResources() diff --git a/vendor/k8s.io/kubernetes/cmd/kubelet/app/server_linux.go b/vendor/k8s.io/kubernetes/cmd/kubelet/app/server_linux.go index f6cff9af261c..c22e24d5312f 100644 --- a/vendor/k8s.io/kubernetes/cmd/kubelet/app/server_linux.go +++ b/vendor/k8s.io/kubernetes/cmd/kubelet/app/server_linux.go @@ -24,19 +24,19 @@ import ( func watchForLockfileContention(path string, done chan struct{}) error { watcher, err := inotify.NewWatcher() if err != nil { - klog.Errorf("unable to create watcher for lockfile: %v", err) + klog.ErrorS(err, "Unable to create watcher for lockfile") return err } if err = watcher.AddWatch(path, inotify.InOpen|inotify.InDeleteSelf); err != nil { - klog.Errorf("unable to watch lockfile: %v", err) + klog.ErrorS(err, "Unable to watch lockfile") return err } go func() { select { case ev := <-watcher.Event: - klog.Infof("inotify event: %v", ev) + klog.InfoS("inotify event", "event", ev) case err = <-watcher.Error: - klog.Errorf("inotify watcher error: %v", err) + klog.ErrorS(err, "inotify watcher error") } close(done) }() diff --git a/vendor/k8s.io/kubernetes/cmd/kubelet/app/server_others.go b/vendor/k8s.io/kubernetes/cmd/kubelet/app/server_others.go new file mode 100644 index 000000000000..a6cced1a1a86 --- /dev/null +++ b/vendor/k8s.io/kubernetes/cmd/kubelet/app/server_others.go @@ -0,0 +1,33 @@ +// +build !windows + +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package app + +import ( + "fmt" + "os" +) + +func checkPermissions() error { + if uid := os.Getuid(); uid != 0 { + return fmt.Errorf("kubelet needs to run as uid `0`. It is being run as %d", uid) + } + // TODO: Check if kubelet is running in the `initial` user namespace. + // http://man7.org/linux/man-pages/man7/user_namespaces.7.html + return nil +} diff --git a/vendor/k8s.io/kubernetes/cmd/kubelet/app/server_windows.go b/vendor/k8s.io/kubernetes/cmd/kubelet/app/server_windows.go new file mode 100644 index 000000000000..cdb83e321f44 --- /dev/null +++ b/vendor/k8s.io/kubernetes/cmd/kubelet/app/server_windows.go @@ -0,0 +1,85 @@ +// +build windows + +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package app + +import ( + "fmt" + "os/user" + + "golang.org/x/sys/windows" +) + +func isAdmin() (bool, error) { + // Get current user + u, err := user.Current() + if err != nil { + return false, fmt.Errorf("Error retrieving current user: %s", err) + } + // Get IDs of group user is a member of + ids, err := u.GroupIds() + if err != nil { + return false, fmt.Errorf("Error retrieving group ids: %s", err) + } + + // Check for existence of BUILTIN\ADMINISTRATORS group id + for i := range ids { + // BUILTIN\ADMINISTRATORS + if "S-1-5-32-544" == ids[i] { + return true, nil + } + } + return false, nil +} + +func checkPermissions() error { + //https://github.com/golang/go/issues/28804#issuecomment-505326268 + var sid *windows.SID + var userIsAdmin bool + + // https://docs.microsoft.com/en-us/windows/desktop/api/securitybaseapi/nf-securitybaseapi-checktokenmembership + err := windows.AllocateAndInitializeSid( + &windows.SECURITY_NT_AUTHORITY, + 2, + windows.SECURITY_BUILTIN_DOMAIN_RID, + windows.DOMAIN_ALIAS_RID_ADMINS, + 0, 0, 0, 0, 0, 0, + &sid) + if err != nil { + return fmt.Errorf("Error while checking for elevated permissions: %s", err) + } + + //We must free the sid to prevent security token leaks + defer windows.FreeSid(sid) + token := windows.Token(0) + + userIsAdmin, err = isAdmin() + if err != nil { + return fmt.Errorf("Error while checking admin group membership: %s", err) + } + + member, err := token.IsMember(sid) + if err != nil { + return fmt.Errorf("Error while checking for elevated permissions: %s", err) + } + if !member { + return fmt.Errorf("kubelet needs to run with administrator permissions. Run as admin is: %t, User in admin group: %t", member, userIsAdmin) + } + + return nil +} diff --git a/vendor/k8s.io/kubernetes/openshift-hack/e2e/annotate/rules.go b/vendor/k8s.io/kubernetes/openshift-hack/e2e/annotate/rules.go index a08d6400686f..60df1411e1a6 100644 --- a/vendor/k8s.io/kubernetes/openshift-hack/e2e/annotate/rules.go +++ b/vendor/k8s.io/kubernetes/openshift-hack/e2e/annotate/rules.go @@ -11,14 +11,22 @@ var ( "[Disabled:Alpha]": { // ALPHA features in 1.20, disabled by default. // !!! Review their status as part of the 1.21 rebase. - `\[Feature:CSIStorageCapacity\]`, `\[Feature:CSIServiceAccountToken\]`, - `\[Feature:IPv6DualStack.*\]`, - `\[Feature:TTLAfterFinished\]`, // BETA features in 1.20, enabled by default - // Their enablement is tracked via bz's targeted at 4.6. + // Their enablement is tracked via bz's targeted at 4.8. `\[Feature:SCTPConnectivity\]`, // https://bugzilla.redhat.com/show_bug.cgi?id=1861606 + + `\[Feature:NetworkPolicy\]`, + + `\[Feature:CrossNamespacePodAffinity\]`, + + `\[Feature:DaemonSetUpdateSurge\]`, + + `\[Feature:StorageVersionAPI\]`, + + `\[Feature:IndexedJob\]`, + `\[Feature:SuspendJob\]`, }, // tests for features that are not implemented in openshift "[Disabled:Unimplemented]": { @@ -77,9 +85,8 @@ var ( "should reject a Pod requesting a RuntimeClass with conflicting node selector", "should run a Pod requesting a RuntimeClass with scheduling", - // NFS umount is broken in kernels 5.7+ - // https://bugzilla.redhat.com/show_bug.cgi?id=1854379 - `\[sig-storage\].*\[Driver: nfs\] \[Testpattern: Dynamic PV \(default fs\)\].*subPath should be able to unmount after the subpath directory is deleted`, + // A fix is in progress: https://github.com/openshift/origin/pull/24709 + `Multi-AZ Clusters should spread the pods of a replication controller across zones`, // Upstream assumes all control plane pods are in kube-system namespace and we should revert the change // https://github.com/kubernetes/kubernetes/commit/176c8e219f4c7b4c15d34b92c50bfa5ba02b3aba#diff-28a3131f96324063dd53e17270d435a3b0b3bd8f806ee0e33295929570eab209R78 @@ -90,6 +97,16 @@ var ( // https://bugzilla.redhat.com/show_bug.cgi?id=1906808 `ServiceAccounts should support OIDC discovery of service account issuer`, + + // NFS umount is broken in kernels 5.7+ + // https://bugzilla.redhat.com/show_bug.cgi?id=1854379 + `\[sig-storage\].*\[Driver: nfs\] \[Testpattern: Dynamic PV \(default fs\)\].*subPath should be able to unmount after the subpath directory is deleted`, + + // https://bugzilla.redhat.com/show_bug.cgi?id=1945091 + `\[Feature:IPv6DualStack\]`, + + // https://bugzilla.redhat.com/show_bug.cgi?id=1945329 + `should drop INVALID conntrack entries`, }, // tests that may work, but we don't support them "[Disabled:Unsupported]": { @@ -121,8 +138,6 @@ var ( `Clean up pods on node`, // schedules up to max pods per node `DynamicProvisioner should test that deleting a claim before the volume is provisioned deletes the volume`, // test is very disruptive to other tests - `Multi-AZ Clusters should spread the pods of a service across zones`, // spreading is a priority, not a predicate, and if the node is temporarily full the priority will be ignored - `Should be able to support the 1\.7 Sample API Server using the current Aggregator`, // down apiservices break other clients today https://bugzilla.redhat.com/show_bug.cgi?id=1623195 `\[Feature:HPA\] Horizontal pod autoscaling \(scale resource: CPU\) \[sig-autoscaling\] ReplicationController light Should scale from 1 pod to 2 pods`, diff --git a/vendor/k8s.io/kubernetes/openshift-kube-apiserver/admission/admissionenablement/register.go b/vendor/k8s.io/kubernetes/openshift-kube-apiserver/admission/admissionenablement/register.go index cd5de4c3fc19..bf08920de24a 100644 --- a/vendor/k8s.io/kubernetes/openshift-kube-apiserver/admission/admissionenablement/register.go +++ b/vendor/k8s.io/kubernetes/openshift-kube-apiserver/admission/admissionenablement/register.go @@ -12,6 +12,7 @@ import ( "github.com/openshift/apiserver-library-go/pkg/securitycontextconstraints/sccadmission" authorizationrestrictusers "k8s.io/kubernetes/openshift-kube-apiserver/admission/authorization/restrictusers" quotaclusterresourceoverride "k8s.io/kubernetes/openshift-kube-apiserver/admission/autoscaling/clusterresourceoverride" + "k8s.io/kubernetes/openshift-kube-apiserver/admission/autoscaling/managementcpusoverride" quotarunonceduration "k8s.io/kubernetes/openshift-kube-apiserver/admission/autoscaling/runonceduration" "k8s.io/kubernetes/openshift-kube-apiserver/admission/customresourcevalidation/customresourcevalidationregistration" "k8s.io/kubernetes/openshift-kube-apiserver/admission/network/externalipranger" @@ -25,6 +26,7 @@ func RegisterOpenshiftKubeAdmissionPlugins(plugins *admission.Plugins) { authorizationrestrictusers.Register(plugins) imagepolicy.Register(plugins) ingressadmission.Register(plugins) + managementcpusoverride.Register(plugins) projectnodeenv.Register(plugins) quotaclusterresourceoverride.Register(plugins) quotaclusterresourcequota.Register(plugins) @@ -52,6 +54,7 @@ var ( // openshiftAdmissionPluginsForKubeBeforeMutating are the admission plugins to add after kube admission, before mutating webhooks openshiftAdmissionPluginsForKubeBeforeMutating = []string{ "autoscaling.openshift.io/ClusterResourceOverride", + managementcpusoverride.PluginName, // "autoscaling.openshift.io/ManagementCPUsOverride" "authorization.openshift.io/RestrictSubjectBindings", "autoscaling.openshift.io/RunOnceDuration", "scheduling.openshift.io/PodNodeConstraints", diff --git a/vendor/k8s.io/kubernetes/openshift-kube-apiserver/admission/autoscaling/managementcpusoverride/admission.go b/vendor/k8s.io/kubernetes/openshift-kube-apiserver/admission/autoscaling/managementcpusoverride/admission.go new file mode 100644 index 000000000000..62f1563dc713 --- /dev/null +++ b/vendor/k8s.io/kubernetes/openshift-kube-apiserver/admission/autoscaling/managementcpusoverride/admission.go @@ -0,0 +1,573 @@ +package managementcpusoverride + +import ( + "context" + "encoding/json" + "fmt" + "io" + "strings" + "time" + + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/api/resource" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/apimachinery/pkg/util/validation/field" + "k8s.io/apiserver/pkg/admission" + "k8s.io/apiserver/pkg/admission/initializer" + "k8s.io/client-go/informers" + "k8s.io/client-go/kubernetes" + corev1listers "k8s.io/client-go/listers/core/v1" + coreapi "k8s.io/kubernetes/pkg/apis/core" + "k8s.io/kubernetes/pkg/kubelet/cm" + kubetypes "k8s.io/kubernetes/pkg/kubelet/types" +) + +const ( + PluginName = "autoscaling.openshift.io/ManagementCPUsOverride" + // timeToWaitForCacheSync contains the time how long to wait for caches to be synchronize + timeToWaitForCacheSync = 10 * time.Second + // containerWorkloadResourceSuffix contains the suffix for the container workload resource + containerWorkloadResourceSuffix = "workload.openshift.io/cores" + // podWorkloadTargetAnnotationPrefix contains the prefix for the pod workload target annotation + podWorkloadTargetAnnotationPrefix = "target.workload.openshift.io/" + // podWorkloadAnnotationEffect contains the effect key for the workload annotation value + podWorkloadAnnotationEffect = "effect" + // workloadEffectPreferredDuringScheduling contains the PreferredDuringScheduling effect value + workloadEffectPreferredDuringScheduling = "PreferredDuringScheduling" + // containerResourcesAnnotationPrefix contains resource annotation prefix that will be used by CRI-O to set cpu shares + containerResourcesAnnotationPrefix = "resources.workload.openshift.io/" + // containerResourcesAnnotationValueKeyCPUShares contains resource annotation value cpushares key + containerResourcesAnnotationValueKeyCPUShares = "cpushares" + // namespaceAllowedAnnotation contains the namespace allowed annotation key + namespaceAllowedAnnotation = "workload.openshift.io/allowed" + // workloadAdmissionWarning contains the admission warning annotation key + workloadAdmissionWarning = "workload.openshift.io/warning" +) + +var _ = initializer.WantsExternalKubeInformerFactory(&managementCPUsOverride{}) +var _ = initializer.WantsExternalKubeClientSet(&managementCPUsOverride{}) +var _ = admission.MutationInterface(&managementCPUsOverride{}) +var _ = admission.ValidationInterface(&managementCPUsOverride{}) + +func Register(plugins *admission.Plugins) { + plugins.Register(PluginName, + func(config io.Reader) (admission.Interface, error) { + return &managementCPUsOverride{ + Handler: admission.NewHandler(admission.Create), + }, nil + }) +} + +// managementCPUsOverride presents admission plugin that should replace pod container CPU requests with a new management resource. +// It applies to all pods that: +// 1. are in an allowed namespace +// 2. and have the workload annotation. +// +// It also sets the new management resource request and limit and set resource annotation that CRI-O can +// recognize and apply the relevant changes. +// For more information, see - https://github.com/openshift/enhancements/pull/703 +// +// Conditions for CPUs requests deletion: +// 1. The namespace should have allowed annotation "workload.openshift.io/allowed": "management" +// 2. The pod should have management annotation: "workload.openshift.io/management": "{"effect": "PreferredDuringScheduling"}" +// 3. All nodes under the cluster should have new management resource - "management.workload.openshift.io/cores" +// 4. The CPU request deletion will not change the pod QoS class +type managementCPUsOverride struct { + *admission.Handler + client kubernetes.Interface + nsLister corev1listers.NamespaceLister + nsListerSynced func() bool + nodeLister corev1listers.NodeLister + nodeListSynced func() bool +} + +func (a *managementCPUsOverride) SetExternalKubeInformerFactory(kubeInformers informers.SharedInformerFactory) { + a.nsLister = kubeInformers.Core().V1().Namespaces().Lister() + a.nsListerSynced = kubeInformers.Core().V1().Namespaces().Informer().HasSynced + a.nodeLister = kubeInformers.Core().V1().Nodes().Lister() + a.nodeListSynced = kubeInformers.Core().V1().Nodes().Informer().HasSynced +} + +// SetExternalKubeClientSet implements the WantsExternalKubeClientSet interface. +func (a *managementCPUsOverride) SetExternalKubeClientSet(client kubernetes.Interface) { + a.client = client +} + +func (a *managementCPUsOverride) ValidateInitialization() error { + if a.client == nil { + return fmt.Errorf("%s plugin needs a kubernetes client", PluginName) + } + if a.nsLister == nil { + return fmt.Errorf("%s did not get a namespace lister", PluginName) + } + if a.nsListerSynced == nil { + return fmt.Errorf("%s plugin needs a namespace lister synced", PluginName) + } + if a.nodeLister == nil { + return fmt.Errorf("%s did not get a node lister", PluginName) + } + if a.nodeListSynced == nil { + return fmt.Errorf("%s plugin needs a node lister synced", PluginName) + } + return nil +} + +func (a *managementCPUsOverride) Admit(ctx context.Context, attr admission.Attributes, o admission.ObjectInterfaces) error { + if attr.GetResource().GroupResource() != coreapi.Resource("pods") || attr.GetSubresource() != "" { + return nil + } + + pod, ok := attr.GetObject().(*coreapi.Pod) + if !ok { + return admission.NewForbidden(attr, fmt.Errorf("unexpected object: %#v", attr.GetObject())) + } + + // do not mutate mirror pods at all + if isStaticPod(pod.Annotations) { + return nil + } + + podAnnotations := map[string]string{} + for k, v := range pod.Annotations { + podAnnotations[k] = v + } + + // strip any resource annotations specified by a user + stripResourcesAnnotations(pod.Annotations) + // strip any workload annotation to prevent from underlying components(CRI-O, kubelet) to apply any changes + // according to the workload annotation + stripWorkloadAnnotations(pod.Annotations) + + workloadType, err := getWorkloadType(podAnnotations) + if err != nil { + invalidError := getPodInvalidWorkloadAnnotationError(podAnnotations, err.Error()) + return errors.NewInvalid(coreapi.Kind("Pod"), pod.Name, field.ErrorList{invalidError}) + } + + // no workload annotation is specified under the pod + if len(workloadType) == 0 { + return nil + } + + if !a.waitForSyncedStore(time.After(timeToWaitForCacheSync)) { + return admission.NewForbidden(attr, fmt.Errorf("%s node and namespace caches not synchronized", PluginName)) + } + + nodes, err := a.nodeLister.List(labels.Everything()) + if err != nil { + return admission.NewForbidden(attr, err) // can happen due to informer latency + } + + // only pods that possible to run without any nodes is static pods, but we skip mutation of static pods in the beginning + if len(nodes) == 0 { + return admission.NewForbidden(attr, fmt.Errorf("%s the cluster does not have any nodes", PluginName)) + } + + // TODO: currently we supports only SNO use case because we have not yet worked out the best approach to determining whether the feature + // should be on or off in a multi-node cluster, and computing that state incorrectly could lead to breaking running clusters. + if len(nodes) > 1 { + pod.Annotations[workloadAdmissionWarning] = "only clusters with a single node are supported" + return nil + } + + // probably the workload feature disabled, because some of cluster nodes do not have workload resource + if err := isManagementResourceAvailableForAllNodes(nodes, workloadType); err != nil { + pod.Annotations[workloadAdmissionWarning] = err.Error() + return nil + } + + // allow annotations on project to override management pods CPUs requests + ns, err := a.getPodNamespace(attr) + if err != nil { + return err + } + + if !doesNamespaceAllowWorkloadType(ns.Annotations, workloadType) { + return admission.NewForbidden(attr, fmt.Errorf("%s the pod namespace %q does not allow the workload type %s", PluginName, ns.Name, workloadType)) + } + + workloadAnnotation := fmt.Sprintf("%s%s", podWorkloadTargetAnnotationPrefix, workloadType) + effect, err := getWorkloadAnnotationEffect(podAnnotations[workloadAnnotation]) + if err != nil { + invalidError := getPodInvalidWorkloadAnnotationError(podAnnotations, fmt.Sprintf("failed to get workload annotation effect: %v", err)) + return errors.NewInvalid(coreapi.Kind("Pod"), pod.Name, field.ErrorList{invalidError}) + } + + // TODO: currently we support only PreferredDuringScheduling effect + if effect != workloadEffectPreferredDuringScheduling { + invalidError := getPodInvalidWorkloadAnnotationError(podAnnotations, fmt.Sprintf("only %q effect is supported", workloadEffectPreferredDuringScheduling)) + return errors.NewInvalid(coreapi.Kind("Pod"), pod.Name, field.ErrorList{invalidError}) + } + + allContainers := append([]coreapi.Container{}, pod.Spec.InitContainers...) + allContainers = append(allContainers, pod.Spec.Containers...) + podQoSClass := getPodQoSClass(allContainers) + + // we do not want to change guaranteed pods resource allocation, because it should be managed by + // relevant managers(CPU and memory) under the kubelet + if podQoSClass == coreapi.PodQOSGuaranteed { + pod.Annotations[workloadAdmissionWarning] = "skip pod CPUs requests modifications because it has guaranteed QoS class" + return nil + } + + // before we update the pod available under admission attributes, we need to verify that deletion of the CPU request + // will not change the pod QoS class, otherwise skip pod mutation + // 1. Copy the pod + // 2. Delete CPUs requests for all containers under the pod + // 3. Get modified pod QoS class + // 4. Verify that the pod QoS class before and after the modification stay the same + // 5. Update the pod under admission attributes + podCopy := pod.DeepCopy() + updatePodResources(podCopy, workloadType, podQoSClass) + + allContainersCopy := append([]coreapi.Container{}, podCopy.Spec.InitContainers...) + allContainersCopy = append(allContainersCopy, podCopy.Spec.Containers...) + podQoSClassAfterModification := getPodQoSClass(allContainersCopy) + + if podQoSClass != podQoSClassAfterModification { + pod.Annotations[workloadAdmissionWarning] = fmt.Sprintf("skip pod CPUs requests modifications because it will change the pod QoS class from %s to %s", podQoSClass, podQoSClassAfterModification) + return nil + } + + updatePodResources(pod, workloadType, podQoSClass) + + return nil +} + +func (a *managementCPUsOverride) getPodNamespace(attr admission.Attributes) (*corev1.Namespace, error) { + ns, err := a.nsLister.Get(attr.GetNamespace()) + if err == nil { + return ns, nil + } + + if !errors.IsNotFound(err) { + return nil, admission.NewForbidden(attr, err) + } + + // in case of latency in our caches, make a call direct to storage to verify that it truly exists or not + ns, err = a.client.CoreV1().Namespaces().Get(context.TODO(), attr.GetNamespace(), metav1.GetOptions{}) + if err == nil { + return ns, nil + } + + if !errors.IsNotFound(err) { + return nil, admission.NewForbidden(attr, err) + } + + return nil, err +} + +func (a *managementCPUsOverride) waitForSyncedStore(timeout <-chan time.Time) bool { + for !a.nsListerSynced() || !a.nodeListSynced() { + select { + case <-time.After(100 * time.Millisecond): + case <-timeout: + return a.nsListerSynced() && a.nodeListSynced() + } + } + + return true +} + +func updatePodResources(pod *coreapi.Pod, workloadType string, class coreapi.PodQOSClass) { + if pod.Annotations == nil { + pod.Annotations = map[string]string{} + } + + // update init containers resources + updateContainersResources(pod.Spec.InitContainers, pod.Annotations, workloadType, class) + + // update app containers resources + updateContainersResources(pod.Spec.Containers, pod.Annotations, workloadType, class) + + // re-add workload annotation + addWorkloadAnnotations(pod.Annotations, workloadType) +} + +func updateContainersResources(containers []coreapi.Container, podAnnotations map[string]string, workloadType string, podQoSClass coreapi.PodQOSClass) { + for i := range containers { + c := &containers[i] + cpusharesAnnotationKey := fmt.Sprintf("%s%s", containerResourcesAnnotationPrefix, c.Name) + + // make sure best effort is always 2 shares, it the minimal shares that supported + // see - https://github.com/kubernetes/kubernetes/blob/46563b0abebbb00e21db967950a1343e83a0c6a2/pkg/kubelet/cm/qos_container_manager_linux.go#L99 + if podQoSClass == coreapi.PodQOSBestEffort { + podAnnotations[cpusharesAnnotationKey] = fmt.Sprintf(`{"%s": 2}`, containerResourcesAnnotationValueKeyCPUShares) + continue + } + + if c.Resources.Requests != nil { + if _, ok := c.Resources.Requests[coreapi.ResourceCPU]; !ok { + continue + } + + cpuRequest := c.Resources.Requests[coreapi.ResourceCPU] + cpuRequestInMilli := cpuRequest.MilliValue() + + cpuShares := cm.MilliCPUToShares(cpuRequestInMilli) + podAnnotations[cpusharesAnnotationKey] = fmt.Sprintf(`{"%s": %d}`, containerResourcesAnnotationValueKeyCPUShares, cpuShares) + delete(c.Resources.Requests, coreapi.ResourceCPU) + + if c.Resources.Limits == nil { + c.Resources.Limits = coreapi.ResourceList{} + } + + // multiply the CPU request by 1000, to make sure that the resource will pass integer validation + managedResource := fmt.Sprintf("%s.%s", workloadType, containerWorkloadResourceSuffix) + newCPURequest := resource.NewMilliQuantity(cpuRequestInMilli*1000, cpuRequest.Format) + c.Resources.Requests[coreapi.ResourceName(managedResource)] = *newCPURequest + c.Resources.Limits[coreapi.ResourceName(managedResource)] = *newCPURequest + } + } +} + +func isGuaranteed(containers []coreapi.Container) bool { + for _, c := range containers { + // only memory and CPU resources are relevant to decide pod QoS class + for _, r := range []coreapi.ResourceName{coreapi.ResourceMemory, coreapi.ResourceCPU} { + limit := c.Resources.Limits[r] + request, requestExist := c.Resources.Requests[r] + + if limit.IsZero() { + return false + } + + if !requestExist { + continue + } + + // it some corner case, when you set CPU request to 0 the k8s will change it to the value + // specified under the limit + if r == coreapi.ResourceCPU && request.IsZero() { + continue + } + + if !limit.Equal(request) { + return false + } + } + } + + return true +} + +func isBestEffort(containers []coreapi.Container) bool { + for _, c := range containers { + // only memory and CPU resources are relevant to decide pod QoS class + for _, r := range []coreapi.ResourceName{coreapi.ResourceMemory, coreapi.ResourceCPU} { + limit := c.Resources.Limits[r] + request := c.Resources.Requests[r] + + if !limit.IsZero() || !request.IsZero() { + return false + } + } + } + + return true +} + +func getPodQoSClass(containers []coreapi.Container) coreapi.PodQOSClass { + if isGuaranteed(containers) { + return coreapi.PodQOSGuaranteed + } + + if isBestEffort(containers) { + return coreapi.PodQOSBestEffort + } + + return coreapi.PodQOSBurstable +} + +func isManagementResourceAvailableForAllNodes(nodes []*corev1.Node, workloadType string) error { + managedResource := fmt.Sprintf("%s.%s", workloadType, containerWorkloadResourceSuffix) + for _, node := range nodes { + if v, ok := node.Status.Allocatable[corev1.ResourceName(managedResource)]; !ok || v.IsZero() { + return fmt.Errorf("the node %q does not have resource %q", node.Name, managedResource) + } + } + + return nil +} + +func doesNamespaceAllowWorkloadType(annotations map[string]string, workloadType string) bool { + v, found := annotations[namespaceAllowedAnnotation] + if !found { + return false + } + + for _, t := range strings.Split(v, ",") { + if workloadType == t { + return true + } + } + + return false +} + +func getWorkloadType(annotations map[string]string) (string, error) { + var workloadAnnotationsKeys []string + for k := range annotations { + if strings.HasPrefix(k, podWorkloadTargetAnnotationPrefix) { + workloadAnnotationsKeys = append(workloadAnnotationsKeys, k) + } + } + + // no workload annotation is specified under the pod + if len(workloadAnnotationsKeys) == 0 { + return "", nil + } + + // more than one workload annotation exists under the pod and we do not support different workload types + // under the same pod + if len(workloadAnnotationsKeys) > 1 { + return "", fmt.Errorf("the pod can not have more than one workload annotations") + } + + workloadType := strings.TrimPrefix(workloadAnnotationsKeys[0], podWorkloadTargetAnnotationPrefix) + if len(workloadType) == 0 { + return "", fmt.Errorf("the workload annotation key should have format %s, when is non empty string", podWorkloadTargetAnnotationPrefix) + } + + return workloadType, nil +} + +func getWorkloadAnnotationEffect(workloadAnnotationKey string) (string, error) { + managementAnnotationValue := map[string]string{} + if err := json.Unmarshal([]byte(workloadAnnotationKey), &managementAnnotationValue); err != nil { + return "", fmt.Errorf("failed to parse %q annotation value: %v", workloadAnnotationKey, err) + } + + if len(managementAnnotationValue) > 1 { + return "", fmt.Errorf("the workload annotation value %q has more than one key", managementAnnotationValue) + } + + effect, ok := managementAnnotationValue[podWorkloadAnnotationEffect] + if !ok { + return "", fmt.Errorf("the workload annotation value %q does not have %q key", managementAnnotationValue, podWorkloadAnnotationEffect) + } + return effect, nil +} + +func stripResourcesAnnotations(annotations map[string]string) { + for k := range annotations { + if strings.HasPrefix(k, containerResourcesAnnotationPrefix) { + delete(annotations, k) + } + } +} + +func stripWorkloadAnnotations(annotations map[string]string) { + for k := range annotations { + if strings.HasPrefix(k, podWorkloadTargetAnnotationPrefix) { + delete(annotations, k) + } + } +} + +func addWorkloadAnnotations(annotations map[string]string, workloadType string) { + if annotations == nil { + annotations = map[string]string{} + } + + workloadAnnotation := fmt.Sprintf("%s%s", podWorkloadTargetAnnotationPrefix, workloadType) + annotations[workloadAnnotation] = fmt.Sprintf(`{"%s":"%s"}`, podWorkloadAnnotationEffect, workloadEffectPreferredDuringScheduling) +} + +func (a *managementCPUsOverride) Validate(ctx context.Context, attr admission.Attributes, o admission.ObjectInterfaces) (err error) { + if attr.GetResource().GroupResource() != coreapi.Resource("pods") || attr.GetSubresource() != "" { + return nil + } + + pod, ok := attr.GetObject().(*coreapi.Pod) + if !ok { + return admission.NewForbidden(attr, fmt.Errorf("unexpected object: %#v", attr.GetObject())) + } + + // do not validate mirror pods at all + if isStaticPod(pod.Annotations) { + return nil + } + + ns, err := a.getPodNamespace(attr) + if err != nil { + return err + } + + var allErrs field.ErrorList + workloadType, err := getWorkloadType(pod.Annotations) + if err != nil { + allErrs = append(allErrs, getPodInvalidWorkloadAnnotationError(pod.Annotations, err.Error())) + } + + workloadResourceAnnotations := map[string]map[string]int{} + for k, v := range pod.Annotations { + if !strings.HasPrefix(k, containerResourcesAnnotationPrefix) { + continue + } + + resourceAnnotationValue := map[string]int{} + if err := json.Unmarshal([]byte(v), &resourceAnnotationValue); err != nil { + allErrs = append(allErrs, getPodInvalidWorkloadAnnotationError(pod.Annotations, err.Error())) + } + workloadResourceAnnotations[k] = resourceAnnotationValue + } + + containersWorkloadResources := map[string]*coreapi.Container{} + allContainers := append([]coreapi.Container{}, pod.Spec.InitContainers...) + allContainers = append(allContainers, pod.Spec.Containers...) + for i := range allContainers { + c := &allContainers[i] + // we interested only in request because only the request affects the scheduler + for r := range c.Resources.Requests { + resourceName := string(r) + if strings.HasSuffix(resourceName, containerWorkloadResourceSuffix) { + containersWorkloadResources[resourceName] = c + } + } + } + + // the pod does not have workload annotation + if len(workloadType) == 0 { + if len(workloadResourceAnnotations) > 0 { + allErrs = append(allErrs, getPodInvalidWorkloadAnnotationError(pod.Annotations, "the pod without workload annotation can not have resource annotation")) + } + + for resourceName, c := range containersWorkloadResources { + allErrs = append(allErrs, field.Invalid(field.NewPath("spec.containers.resources.requests"), c.Resources.Requests, fmt.Sprintf("the pod without workload annotations can not have containers with workload resources %q", resourceName))) + } + } else { + if !doesNamespaceAllowWorkloadType(ns.Annotations, workloadType) { // pod has workload annotation, but the pod does not have workload annotation + allErrs = append(allErrs, getPodInvalidWorkloadAnnotationError(pod.Annotations, fmt.Sprintf("the pod can not have workload annotation, when the namespace %q does not allow it", ns.Name))) + } + + for _, v := range workloadResourceAnnotations { + if len(v) > 1 { + allErrs = append(allErrs, field.Invalid(field.NewPath("metadata.annotations"), pod.Annotations, "the pod resource annotation value can not have more than one key")) + } + + // the pod should not have any resource annotations with the value that includes keys different from cpushares + if _, ok := v[containerResourcesAnnotationValueKeyCPUShares]; len(v) == 1 && !ok { + allErrs = append(allErrs, field.Invalid(field.NewPath("metadata.annotations"), pod.Annotations, "the pod resource annotation value should have only cpushares key")) + } + } + } + + if len(allErrs) == 0 { + return nil + } + + return errors.NewInvalid(coreapi.Kind("Pod"), pod.Name, allErrs) +} + +func getPodInvalidWorkloadAnnotationError(annotations map[string]string, message string) *field.Error { + return field.Invalid(field.NewPath("metadata.Annotations"), annotations, message) +} + +// isStaticPod returns true if the pod is a static pod. +func isStaticPod(annotations map[string]string) bool { + source, ok := annotations[kubetypes.ConfigSourceAnnotationKey] + return ok && source != kubetypes.ApiserverSource +} diff --git a/vendor/k8s.io/kubernetes/openshift-kube-apiserver/admission/autoscaling/managementcpusoverride/doc.go b/vendor/k8s.io/kubernetes/openshift-kube-apiserver/admission/autoscaling/managementcpusoverride/doc.go new file mode 100644 index 000000000000..bcd9c74ec472 --- /dev/null +++ b/vendor/k8s.io/kubernetes/openshift-kube-apiserver/admission/autoscaling/managementcpusoverride/doc.go @@ -0,0 +1,16 @@ +package managementcpusoverride + +// The ManagementCPUOverride admission plugin replaces pod container CPU requests with a new management resource. +// It applies to all pods that: +// 1. are in an allowed namespace +// 2. and have the workload annotation. +// +// It also sets the new management resource request and limit and set resource annotation that CRI-O can +// recognize and apply the relevant changes. +// For more information, see - https://github.com/openshift/enhancements/pull/703 +// +// Conditions for CPUs requests deletion: +// 1. The namespace should have allowed annotation "workload.openshift.io/allowed": "management" +// 2. The pod should have management annotation: "workload.openshift.io/management": "{"effect": "PreferredDuringScheduling"}" +// 3. All nodes under the cluster should have new management resource - "management.workload.openshift.io/cores" +// 4. The CPU request deletion will not change the pod QoS class diff --git a/vendor/k8s.io/kubernetes/openshift-kube-apiserver/admission/customresourcevalidation/clusterresourcequota/validation/validation.go b/vendor/k8s.io/kubernetes/openshift-kube-apiserver/admission/customresourcevalidation/clusterresourcequota/validation/validation.go index 19993a05fdd6..2b0bd4892241 100644 --- a/vendor/k8s.io/kubernetes/openshift-kube-apiserver/admission/customresourcevalidation/clusterresourcequota/validation/validation.go +++ b/vendor/k8s.io/kubernetes/openshift-kube-apiserver/admission/customresourcevalidation/clusterresourcequota/validation/validation.go @@ -40,7 +40,7 @@ func ValidateClusterResourceQuota(clusterquota *quotav1.ClusterResourceQuota) fi panic(err) } - allErrs = append(allErrs, validation.ValidateResourceQuotaSpec(internalQuota, field.NewPath("spec", "quota"))...) + allErrs = append(allErrs, validation.ValidateResourceQuotaSpec(internalQuota, validation.ResourceQuotaValidationOptions{}, field.NewPath("spec", "quota"))...) allErrs = append(allErrs, validation.ValidateResourceQuotaStatus(internalStatus, field.NewPath("status", "overall"))...) orderedNamespaces := clusterquota.Status.Namespaces.DeepCopy() diff --git a/vendor/k8s.io/kubernetes/openshift-kube-apiserver/admission/customresourcevalidation/network/BUILD b/vendor/k8s.io/kubernetes/openshift-kube-apiserver/admission/customresourcevalidation/network/BUILD deleted file mode 100644 index e1819a586cad..000000000000 --- a/vendor/k8s.io/kubernetes/openshift-kube-apiserver/admission/customresourcevalidation/network/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["validate_network_config.go"], - importpath = "k8s.io/kubernetes/openshift-kube-apiserver/admission/customresourcevalidation/network", - visibility = ["//visibility:public"], - deps = [ - "//openshift-kube-apiserver/admission/customresourcevalidation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//vendor/github.com/openshift/api/config/v1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/openshift-kube-apiserver/authentication/oauth/bootstrapauthenticator.go b/vendor/k8s.io/kubernetes/openshift-kube-apiserver/authentication/oauth/bootstrapauthenticator.go index fc594f218f83..881ba8c3e3f1 100644 --- a/vendor/k8s.io/kubernetes/openshift-kube-apiserver/authentication/oauth/bootstrapauthenticator.go +++ b/vendor/k8s.io/kubernetes/openshift-kube-apiserver/authentication/oauth/bootstrapauthenticator.go @@ -39,12 +39,14 @@ func NewBootstrapAuthenticator(tokens oauthclient.OAuthAccessTokenInterface, get func (a *bootstrapAuthenticator) AuthenticateToken(ctx context.Context, name string) (*kauthenticator.Response, bool, error) { // hash token for new-style sha256~ prefixed token // TODO: reject non-sha256 prefix tokens in 4.7+ - if strings.HasPrefix(name, sha256Prefix) { - withoutPrefix := strings.TrimPrefix(name, sha256Prefix) - h := sha256.Sum256([]byte(withoutPrefix)) - name = sha256Prefix + base64.RawURLEncoding.EncodeToString(h[0:]) + if !strings.HasPrefix(name, sha256Prefix) { + return nil, false, errOldFormat } + withoutPrefix := strings.TrimPrefix(name, sha256Prefix) + h := sha256.Sum256([]byte(withoutPrefix)) + name = sha256Prefix + base64.RawURLEncoding.EncodeToString(h[0:]) + token, err := a.tokens.Get(context.TODO(), name, metav1.GetOptions{}) if err != nil { return nil, false, errLookup // mask the error so we do not leak token data in logs diff --git a/vendor/k8s.io/kubernetes/openshift-kube-apiserver/authentication/oauth/tokenauthenticator.go b/vendor/k8s.io/kubernetes/openshift-kube-apiserver/authentication/oauth/tokenauthenticator.go index 3ce6e0e7a9c0..92f1ae97ee16 100644 --- a/vendor/k8s.io/kubernetes/openshift-kube-apiserver/authentication/oauth/tokenauthenticator.go +++ b/vendor/k8s.io/kubernetes/openshift-kube-apiserver/authentication/oauth/tokenauthenticator.go @@ -17,7 +17,10 @@ import ( userclient "github.com/openshift/client-go/user/clientset/versioned/typed/user/v1" ) -var errLookup = errors.New("token lookup failed") +var ( + errLookup = errors.New("token lookup failed") + errOldFormat = errors.New("old, insecure token format") +) type tokenAuthenticator struct { tokens oauthclient.OAuthAccessTokenInterface @@ -42,12 +45,14 @@ const sha256Prefix = "sha256~" func (a *tokenAuthenticator) AuthenticateToken(ctx context.Context, name string) (*kauthenticator.Response, bool, error) { // hash token for new-style sha256~ prefixed token // TODO: reject non-sha256 prefix tokens in 4.7+ - if strings.HasPrefix(name, sha256Prefix) { - withoutPrefix := strings.TrimPrefix(name, sha256Prefix) - h := sha256.Sum256([]byte(withoutPrefix)) - name = sha256Prefix + base64.RawURLEncoding.EncodeToString(h[0:]) + if !strings.HasPrefix(name, sha256Prefix) { + return nil, false, errOldFormat } + withoutPrefix := strings.TrimPrefix(name, sha256Prefix) + h := sha256.Sum256([]byte(withoutPrefix)) + name = sha256Prefix + base64.RawURLEncoding.EncodeToString(h[0:]) + token, err := a.tokens.Get(context.TODO(), name, metav1.GetOptions{}) if err != nil { return nil, false, errLookup // mask the error so we do not leak token data in logs diff --git a/vendor/k8s.io/kubernetes/openshift-kube-apiserver/filters/deprecatedapirequest/apiaccess_count_controller.go b/vendor/k8s.io/kubernetes/openshift-kube-apiserver/filters/deprecatedapirequest/apiaccess_count_controller.go new file mode 100644 index 000000000000..a711f849518f --- /dev/null +++ b/vendor/k8s.io/kubernetes/openshift-kube-apiserver/filters/deprecatedapirequest/apiaccess_count_controller.go @@ -0,0 +1,169 @@ +package deprecatedapirequest + +import ( + "context" + "sync" + "time" + + apiv1 "github.com/openshift/api/apiserver/v1" + + apiclientv1 "github.com/openshift/client-go/apiserver/clientset/versioned/typed/apiserver/v1" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/util/runtime" + "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/klog/v2" + "k8s.io/kubernetes/openshift-kube-apiserver/filters/deprecatedapirequest/v1helpers" +) + +// NewController returns a controller +func NewController(client apiclientv1.APIRequestCountInterface, nodeName string) *controller { + ret := &controller{ + client: client, + nodeName: nodeName, + updatePeriod: 5 * time.Minute, + } + ret.resetRequestCount() + return ret +} + +// APIRequestLogger support logging deprecated API requests. +type APIRequestLogger interface { + IsDeprecated(resource, version, group string) bool + LogRequest(resource schema.GroupVersionResource, timestamp time.Time, user, verb string) + Start(stop <-chan struct{}) +} + +type controller struct { + client apiclientv1.APIRequestCountInterface + nodeName string + updatePeriod time.Duration + + requestCountLock sync.RWMutex + requestCounts *apiRequestCounts +} + +// IsDeprecated return true if the resource is deprecated. +func (c *controller) IsDeprecated(resource, version, group string) bool { + _, ok := deprecatedApiRemovedRelease[schema.GroupVersionResource{ + Group: group, + Version: version, + Resource: resource, + }] + return ok +} + +// LogRequest queues an api request for logging +func (c *controller) LogRequest(resource schema.GroupVersionResource, timestamp time.Time, user, verb string) { + c.requestCountLock.RLock() + defer c.requestCountLock.RUnlock() + c.requestCounts.IncrementRequestCount(resource, timestamp.Hour(), user, verb, 1) +} + +// resetCount returns the current count and creates a new requestCount instance var +func (c *controller) resetRequestCount() *apiRequestCounts { + c.requestCountLock.Lock() + defer c.requestCountLock.Unlock() + existing := c.requestCounts + c.requestCounts = newAPIRequestCounts(c.nodeName) + return existing +} + +// Start the controller +func (c *controller) Start(stop <-chan struct{}) { + klog.Infof("Starting DeprecatedAPIRequest controller.") + + // create a context.Context needed for some API calls + ctx, cancel := context.WithCancel(context.Background()) + go func() { + <-stop + klog.Infof("Shutting down DeprecatedAPIRequest controller.") + cancel() + }() + + // write out logs every c.updatePeriod + go wait.UntilWithContext(ctx, c.persistRequestCountForAllResources, c.updatePeriod) +} + +func (c *controller) persistRequestCountForAllResources(ctx context.Context) { + klog.V(2).Infof("updating top APIRequest counts") + defer klog.V(2).Infof("finished updating top APIRequest counts") + + // get the current count to persist, start a new in-memory count + countsToPersist := c.resetRequestCount() + + // remove stale data + expiredHour := (time.Now().Hour() + 1) % 24 + currentHour := time.Now().Hour() + countsToPersist.ExpireOldestCounts(expiredHour) + + // when this function returns, add any remaining counts back to the total to be retried for update + defer c.requestCounts.Add(countsToPersist) + + var wg sync.WaitGroup + for gvr := range countsToPersist.resourceToRequestCount { + resourceCount := countsToPersist.Resource(gvr) + wg.Add(1) + go c.persistRequestCountForResource(ctx, &wg, currentHour, expiredHour, resourceCount) + } + wg.Wait() +} + +func (c *controller) persistRequestCountForResource(ctx context.Context, wg *sync.WaitGroup, currentHour, expiredHour int, localResourceCount *resourceRequestCounts) { + defer wg.Done() + + klog.V(2).Infof("updating top %v APIRequest counts", localResourceCount.resource) + defer klog.V(2).Infof("finished updating top %v APIRequest counts", localResourceCount.resource) + + status, _, err := v1helpers.ApplyStatus( + ctx, + c.client, + resourceToAPIName(localResourceCount.resource), + SetRequestCountsForNode(c.nodeName, currentHour, expiredHour, localResourceCount), + ) + if err != nil { + runtime.HandleError(err) + return + } + + // on successful update, remove the counts we don't need. This is every hour except the current hour + // and every user recorded for the current hour on this node + removePersistedRequestCounts(c.nodeName, currentHour, status, localResourceCount) +} + +// removePersistedRequestCounts removes the counts we don't need to keep in memory. +// This is every hour except the current hour (those will no longer change) and every user recorded for the current hour on this node. +// Then it tracks the amount that needs to be kept out of the sum. This is logically the amount we're adding back in. +// Because we already counted all the users in the persisted sum, we need to exclude the amount we'll be placing back +// in memory. +func removePersistedRequestCounts(nodeName string, currentHour int, persistedStatus *apiv1.APIRequestCountStatus, localResourceCount *resourceRequestCounts) { + for hourIndex := range localResourceCount.hourToRequestCount { + if currentHour != hourIndex { + localResourceCount.RemoveHour(hourIndex) + } + } + for _, persistedNodeCount := range persistedStatus.CurrentHour.ByNode { + if persistedNodeCount.NodeName != nodeName { + continue + } + for _, peristedUserCount := range persistedNodeCount.ByUser { + localResourceCount.Hour(currentHour).RemoveUser(peristedUserCount.UserName) + } + } + + countToSuppress := int64(0) + for _, userCounts := range localResourceCount.Hour(currentHour).usersToRequestCounts { + for _, verbCount := range userCounts.verbsToRequestCounts { + countToSuppress += verbCount.count + } + } + + localResourceCount.Hour(currentHour).countToSuppress = countToSuppress +} + +func resourceToAPIName(resource schema.GroupVersionResource) string { + apiName := resource.Resource + "." + resource.Version + if len(resource.Group) > 0 { + apiName += "." + resource.Group + } + return apiName +} diff --git a/vendor/k8s.io/kubernetes/openshift-kube-apiserver/filters/deprecatedapirequest/deprecated.go b/vendor/k8s.io/kubernetes/openshift-kube-apiserver/filters/deprecatedapirequest/deprecated.go new file mode 100644 index 000000000000..d4391f524a44 --- /dev/null +++ b/vendor/k8s.io/kubernetes/openshift-kube-apiserver/filters/deprecatedapirequest/deprecated.go @@ -0,0 +1,27 @@ +package deprecatedapirequest + +import "k8s.io/apimachinery/pkg/runtime/schema" + +var deprecatedApiRemovedRelease = map[schema.GroupVersionResource]string{ + {Group: "flowcontrol.apiserver.k8s.io", Version: "v1alpha1", Resource: "flowschemas"}: "1.21", + {Group: "flowcontrol.apiserver.k8s.io", Version: "v1alpha1", Resource: "prioritylevelconfigurations"}: "1.21", + {Group: "extensions", Version: "v1beta1", Resource: "ingresses"}: "1.22", + {Group: "admissionregistration.k8s.io", Version: "v1beta1", Resource: "validatingwebhookconfigurations"}: "1.22", + {Group: "apiextensions.k8s.io", Version: "v1beta1", Resource: "customresourcedefinitions"}: "1.22", + {Group: "admissionregistration.k8s.io", Version: "v1beta1", Resource: "mutatingwebhookconfigurations"}: "1.22", + {Group: "certificates.k8s.io", Version: "v1beta1", Resource: "certificatesigningrequests"}: "1.22", + {Group: "networking.k8s.io", Version: "v1beta1", Resource: "ingresses"}: "1.22", + {Group: "rbac.authorization.k8s.io", Version: "v1beta1", Resource: "clusterrolebindings"}: "1.22", + {Group: "rbac.authorization.k8s.io", Version: "v1beta1", Resource: "rolebindings"}: "1.22", + {Group: "rbac.authorization.k8s.io", Version: "v1beta1", Resource: "roles"}: "1.22", +} + +// removedRelease of a specified resource.version.group. +func removedRelease(resource schema.GroupVersionResource) string { + ret, ok := deprecatedApiRemovedRelease[resource] + if ok { + return ret + } + // return a non-empty default to get past validation for now. Nothing is guaranteed for 2.0. + return "2.0" +} diff --git a/vendor/k8s.io/kubernetes/openshift-kube-apiserver/filters/deprecatedapirequest/request_counts.go b/vendor/k8s.io/kubernetes/openshift-kube-apiserver/filters/deprecatedapirequest/request_counts.go new file mode 100644 index 000000000000..4045bd2841b2 --- /dev/null +++ b/vendor/k8s.io/kubernetes/openshift-kube-apiserver/filters/deprecatedapirequest/request_counts.go @@ -0,0 +1,413 @@ +package deprecatedapirequest + +import ( + "fmt" + "strings" + "sync" + "sync/atomic" + + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/util/sets" +) + +type clusterRequestCounts struct { + lock sync.RWMutex + nodeToRequestCount map[string]*apiRequestCounts +} + +func newClusterRequestCounts() *clusterRequestCounts { + return &clusterRequestCounts{ + nodeToRequestCount: map[string]*apiRequestCounts{}, + } +} + +func (c *clusterRequestCounts) Node(nodeName string) *apiRequestCounts { + c.lock.RLock() + ret, ok := c.nodeToRequestCount[nodeName] + c.lock.RUnlock() + if ok { + return ret + } + + c.lock.Lock() + defer c.lock.Unlock() + if _, ok := c.nodeToRequestCount[nodeName]; !ok { + c.nodeToRequestCount[nodeName] = newAPIRequestCounts(nodeName) + } + return c.nodeToRequestCount[nodeName] +} + +func (c *clusterRequestCounts) IncrementRequestCount(node string, resource schema.GroupVersionResource, hour int, user, verb string, count int64) { + c.Node(node).IncrementRequestCount(resource, hour, user, verb, count) +} + +func (c *clusterRequestCounts) String() string { + c.lock.RLock() + defer c.lock.RUnlock() + + mapStrings := []string{} + for _, k := range sets.StringKeySet(c.nodeToRequestCount).List() { + mapStrings = append(mapStrings, fmt.Sprintf("%q: %v", k, c.nodeToRequestCount[k])) + } + return fmt.Sprintf("nodeToRequestCount: {%v}", strings.Join(mapStrings, ", ")) +} + +type apiRequestCounts struct { + lock sync.RWMutex + nodeName string + resourceToRequestCount map[schema.GroupVersionResource]*resourceRequestCounts +} + +func newAPIRequestCounts(nodeName string) *apiRequestCounts { + return &apiRequestCounts{ + nodeName: nodeName, + resourceToRequestCount: map[schema.GroupVersionResource]*resourceRequestCounts{}, + } +} + +func (c *apiRequestCounts) Resource(resource schema.GroupVersionResource) *resourceRequestCounts { + c.lock.RLock() + ret, ok := c.resourceToRequestCount[resource] + c.lock.RUnlock() + if ok { + return ret + } + + c.lock.Lock() + defer c.lock.Unlock() + if _, ok := c.resourceToRequestCount[resource]; !ok { + c.resourceToRequestCount[resource] = newResourceRequestCounts(resource) + } + return c.resourceToRequestCount[resource] +} + +func (c *apiRequestCounts) Add(requestCounts *apiRequestCounts) { + for resource := range requestCounts.resourceToRequestCount { + c.Resource(resource).Add(requestCounts.Resource(resource)) + } +} + +func (c *apiRequestCounts) IncrementRequestCount(resource schema.GroupVersionResource, hour int, user, verb string, count int64) { + c.Resource(resource).IncrementRequestCount(hour, user, verb, count) +} + +func (c *apiRequestCounts) ExpireOldestCounts(expiredHour int) { + c.lock.Lock() + defer c.lock.Unlock() + for _, resource := range c.resourceToRequestCount { + resource.ExpireOldestCounts(expiredHour) + } +} + +func (c *apiRequestCounts) RemoveResource(resource schema.GroupVersionResource) { + c.lock.Lock() + defer c.lock.Unlock() + delete(c.resourceToRequestCount, resource) +} + +func (c *apiRequestCounts) Equals(rhs *apiRequestCounts) bool { + if c.nodeName != rhs.nodeName { + return false + } + + c.lock.RLock() + defer c.lock.RUnlock() + rhs.lock.RLock() + defer rhs.lock.RUnlock() + + if len(c.resourceToRequestCount) != len(rhs.resourceToRequestCount) { + return false + } + + for k, lhsV := range c.resourceToRequestCount { + rhsV, ok := rhs.resourceToRequestCount[k] + if !ok { + return false + } + if !lhsV.Equals(rhsV) { + return false + } + } + return true +} + +func (c *apiRequestCounts) String() string { + c.lock.RLock() + defer c.lock.RUnlock() + + lookup := map[string]schema.GroupVersionResource{} + for k := range c.resourceToRequestCount { + lookup[k.String()] = k + } + mapStrings := []string{} + for _, k := range sets.StringKeySet(lookup).List() { + mapStrings = append(mapStrings, fmt.Sprintf("%q: %v", k, c.resourceToRequestCount[lookup[k]])) + } + return fmt.Sprintf("resource: %v, resourceToRequestCount: {%v}", c.resourceToRequestCount, strings.Join(mapStrings, ", ")) +} + +type resourceRequestCounts struct { + lock sync.RWMutex + resource schema.GroupVersionResource + hourToRequestCount map[int]*hourlyRequestCounts +} + +func newResourceRequestCounts(resource schema.GroupVersionResource) *resourceRequestCounts { + return &resourceRequestCounts{ + resource: resource, + hourToRequestCount: map[int]*hourlyRequestCounts{}, + } +} + +func (c *resourceRequestCounts) Hour(hour int) *hourlyRequestCounts { + c.lock.RLock() + ret, ok := c.hourToRequestCount[hour] + c.lock.RUnlock() + if ok { + return ret + } + + c.lock.Lock() + defer c.lock.Unlock() + if _, ok := c.hourToRequestCount[hour]; !ok { + c.hourToRequestCount[hour] = newHourlyRequestCounts() + } + return c.hourToRequestCount[hour] +} + +func (c *resourceRequestCounts) ExpireOldestCounts(expiredHour int) { + c.lock.Lock() + defer c.lock.Unlock() + delete(c.hourToRequestCount, expiredHour) +} + +func (c *resourceRequestCounts) Add(requestCounts *resourceRequestCounts) { + for hour, hourCount := range requestCounts.hourToRequestCount { + c.Hour(hour).Add(hourCount) + } +} + +func (c *resourceRequestCounts) IncrementRequestCount(hour int, user, verb string, count int64) { + c.Hour(hour).IncrementRequestCount(user, verb, count) +} + +func (c *resourceRequestCounts) RemoveHour(hour int) { + c.lock.Lock() + defer c.lock.Unlock() + delete(c.hourToRequestCount, hour) +} + +func (c *resourceRequestCounts) Equals(rhs *resourceRequestCounts) bool { + if c.resource != rhs.resource { + return false + } + + c.lock.RLock() + defer c.lock.RUnlock() + rhs.lock.RLock() + defer rhs.lock.RUnlock() + + if len(c.hourToRequestCount) != len(rhs.hourToRequestCount) { + return false + } + + for k, lhsV := range c.hourToRequestCount { + rhsV, ok := rhs.hourToRequestCount[k] + if !ok { + return false + } + if !lhsV.Equals(rhsV) { + return false + } + } + return true +} + +func (c *resourceRequestCounts) String() string { + c.lock.RLock() + defer c.lock.RUnlock() + + mapStrings := []string{} + for _, k := range sets.IntKeySet(c.hourToRequestCount).List() { + mapStrings = append(mapStrings, fmt.Sprintf("%d: %v", k, c.hourToRequestCount[k].String())) + } + return fmt.Sprintf("resource: %v, hourToRequestCount: {%v}", c.resource, strings.Join(mapStrings, ", ")) +} + +type hourlyRequestCounts struct { + lock sync.RWMutex + // countToSupress is the number of requests to remove from the count to avoid double counting in persistence + // TODO I think I'd like this in look-aside data, but I don't see an easy way to plumb it. + countToSuppress int64 + usersToRequestCounts map[string]*userRequestCounts +} + +func newHourlyRequestCounts() *hourlyRequestCounts { + return &hourlyRequestCounts{ + usersToRequestCounts: map[string]*userRequestCounts{}, + } +} + +func (c *hourlyRequestCounts) User(user string) *userRequestCounts { + c.lock.RLock() + ret, ok := c.usersToRequestCounts[user] + c.lock.RUnlock() + if ok { + return ret + } + + c.lock.Lock() + if _, ok := c.usersToRequestCounts[user]; !ok { + c.usersToRequestCounts[user] = newUserRequestCounts(user) + } + c.lock.Unlock() + return c.usersToRequestCounts[user] +} + +func (c *hourlyRequestCounts) Add(requestCounts *hourlyRequestCounts) { + for user, userCount := range requestCounts.usersToRequestCounts { + c.User(user).Add(userCount) + } + c.countToSuppress += requestCounts.countToSuppress +} + +func (c *hourlyRequestCounts) IncrementRequestCount(user, verb string, count int64) { + c.User(user).IncrementRequestCount(verb, count) +} + +func (c *hourlyRequestCounts) RemoveUser(user string) { + c.lock.Lock() + defer c.lock.Unlock() + delete(c.usersToRequestCounts, user) +} + +func (c *hourlyRequestCounts) Equals(rhs *hourlyRequestCounts) bool { + c.lock.RLock() + defer c.lock.RUnlock() + rhs.lock.RLock() + defer rhs.lock.RUnlock() + + if c.countToSuppress != rhs.countToSuppress { + return false + } + + if len(c.usersToRequestCounts) != len(rhs.usersToRequestCounts) { + return false + } + + for k, lhsV := range c.usersToRequestCounts { + rhsV, ok := rhs.usersToRequestCounts[k] + if !ok { + return false + } + if !lhsV.Equals(rhsV) { + return false + } + } + return true +} + +func (c *hourlyRequestCounts) String() string { + c.lock.RLock() + defer c.lock.RUnlock() + + mapStrings := []string{} + for _, k := range sets.StringKeySet(c.usersToRequestCounts).List() { + mapStrings = append(mapStrings, fmt.Sprintf("%q: %v", k, c.usersToRequestCounts[k].String())) + } + return fmt.Sprintf("countToSuppress=%d usersToRequestCounts: {%v}", c.countToSuppress, strings.Join(mapStrings, ", ")) +} + +type userRequestCounts struct { + lock sync.RWMutex + user string + verbsToRequestCounts map[string]*verbRequestCount +} + +func newUserRequestCounts(user string) *userRequestCounts { + return &userRequestCounts{ + user: user, + verbsToRequestCounts: map[string]*verbRequestCount{}, + } +} + +func (c *userRequestCounts) Verb(verb string) *verbRequestCount { + c.lock.RLock() + ret, ok := c.verbsToRequestCounts[verb] + c.lock.RUnlock() + if ok { + return ret + } + + c.lock.Lock() + if _, ok := c.verbsToRequestCounts[verb]; !ok { + c.verbsToRequestCounts[verb] = &verbRequestCount{} + } + c.lock.Unlock() + return c.verbsToRequestCounts[verb] +} + +func (c *userRequestCounts) Add(requestCounts *userRequestCounts) { + for verb := range requestCounts.verbsToRequestCounts { + c.Verb(verb).Add(requestCounts.Verb(verb).count) + } +} + +func (c *userRequestCounts) IncrementRequestCount(verb string, count int64) { + c.Verb(verb).IncrementRequestCount(count) +} + +func (c *userRequestCounts) Equals(rhs *userRequestCounts) bool { + if c.user != rhs.user { + return false + } + + c.lock.RLock() + defer c.lock.RUnlock() + rhs.lock.RLock() + defer rhs.lock.RUnlock() + + if len(c.verbsToRequestCounts) != len(rhs.verbsToRequestCounts) { + return false + } + + for k, lhsV := range c.verbsToRequestCounts { + rhsV, ok := rhs.verbsToRequestCounts[k] + if !ok { + return false + } + if !lhsV.Equals(rhsV) { + return false + } + } + return true +} + +func (c *userRequestCounts) String() string { + c.lock.RLock() + defer c.lock.RUnlock() + + mapStrings := []string{} + for _, k := range sets.StringKeySet(c.verbsToRequestCounts).List() { + mapStrings = append(mapStrings, fmt.Sprintf("%q: %v", k, c.verbsToRequestCounts[k])) + } + return fmt.Sprintf("user: %q, verbsToRequestCounts: {%v}", c.user, strings.Join(mapStrings, ", ")) +} + +type verbRequestCount struct { + count int64 +} + +func (c *verbRequestCount) Add(count int64) { + atomic.AddInt64(&c.count, count) +} + +func (c *verbRequestCount) IncrementRequestCount(count int64) { + c.Add(count) +} + +func (c *verbRequestCount) Equals(rhs *verbRequestCount) bool { + lhsV := atomic.LoadInt64(&c.count) + rhsV := atomic.LoadInt64(&rhs.count) + return lhsV == rhsV +} diff --git a/vendor/k8s.io/kubernetes/openshift-kube-apiserver/filters/deprecatedapirequest/update_func.go b/vendor/k8s.io/kubernetes/openshift-kube-apiserver/filters/deprecatedapirequest/update_func.go new file mode 100644 index 000000000000..55613d7c0835 --- /dev/null +++ b/vendor/k8s.io/kubernetes/openshift-kube-apiserver/filters/deprecatedapirequest/update_func.go @@ -0,0 +1,202 @@ +package deprecatedapirequest + +import ( + "sort" + "strings" + + apiv1 "github.com/openshift/api/apiserver/v1" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/kubernetes/openshift-kube-apiserver/filters/deprecatedapirequest/v1helpers" +) + +// IncrementRequestCounts add additional api request counts to the log. +// countsToPersist must not be mutated +func SetRequestCountsForNode(nodeName string, currentHour, expiredHour int, countsToPersist *resourceRequestCounts) v1helpers.UpdateStatusFunc { + return func(status *apiv1.APIRequestCountStatus) { + existingLogsFromAPI := apiStatusToRequestCount(countsToPersist.resource, status) + existingNodeLogFromAPI := existingLogsFromAPI.Node(nodeName) + existingNodeLogFromAPI.ExpireOldestCounts(expiredHour) + + // updatedCounts is an alias so we recognize this, but it is based on the newly computed struct so we don't destroy + // our input data. + updatedCounts := existingNodeLogFromAPI.Resource(countsToPersist.resource) + updatedCounts.Add(countsToPersist) + hourlyRequestLogs := resourceRequestCountToHourlyNodeRequestLog(nodeName, updatedCounts) + + newStatus := setRequestCountsForNode(status, nodeName, currentHour, expiredHour, hourlyRequestLogs) + status.Last24h = newStatus.Last24h + status.CurrentHour = newStatus.CurrentHour + status.RemovedInRelease = removedRelease(countsToPersist.resource) + status.RequestCount = newStatus.RequestCount + } +} + +func setRequestCountsForNode(status *apiv1.APIRequestCountStatus, nodeName string, currentHour, expiredHour int, hourlyNodeRequests []apiv1.PerNodeAPIRequestLog) *apiv1.APIRequestCountStatus { + newStatus := status.DeepCopy() + newStatus.Last24h = []apiv1.PerResourceAPIRequestLog{} + newStatus.CurrentHour = apiv1.PerResourceAPIRequestLog{} + + for hour, currentNodeCount := range hourlyNodeRequests { + totalRequestThisHour := int64(0) + nextHourStatus := apiv1.PerResourceAPIRequestLog{} + if hour == expiredHour { + newStatus.Last24h = append(newStatus.Last24h, nextHourStatus) + continue + } + if len(status.Last24h) > hour { + for _, oldNodeStatus := range status.Last24h[hour].ByNode { + if oldNodeStatus.NodeName == nodeName { + continue + } + totalRequestThisHour += oldNodeStatus.RequestCount + nextHourStatus.ByNode = append(nextHourStatus.ByNode, *oldNodeStatus.DeepCopy()) + } + } + nextHourStatus.ByNode = append(nextHourStatus.ByNode, currentNodeCount) + totalRequestThisHour += currentNodeCount.RequestCount + nextHourStatus.RequestCount = totalRequestThisHour + + newStatus.Last24h = append(newStatus.Last24h, nextHourStatus) + } + + totalRequestsThisDay := int64(0) + for _, hourCount := range newStatus.Last24h { + totalRequestsThisDay += hourCount.RequestCount + } + newStatus.RequestCount = totalRequestsThisDay + + // get all our sorting before copying + canonicalizeStatus(newStatus) + newStatus.CurrentHour = newStatus.Last24h[currentHour] + + return newStatus +} + +const numberOfUsersInAPI = 10 + +// in this function we have exclusive access to resourceRequestCounts, so do the easy map navigation +func resourceRequestCountToHourlyNodeRequestLog(nodeName string, resourceRequestCounts *resourceRequestCounts) []apiv1.PerNodeAPIRequestLog { + hourlyNodeRequests := []apiv1.PerNodeAPIRequestLog{} + for i := 0; i < 24; i++ { + hourlyNodeRequests = append(hourlyNodeRequests, + apiv1.PerNodeAPIRequestLog{ + NodeName: nodeName, + ByUser: nil, + }, + ) + } + + for hour, hourlyCount := range resourceRequestCounts.hourToRequestCount { + // be sure to suppress the "extra" added back into memory so we don't double count requests + totalRequestsThisHour := int64(0) - hourlyCount.countToSuppress + for user, userCount := range hourlyCount.usersToRequestCounts { + apiUserStatus := apiv1.PerUserAPIRequestCount{ + UserName: user, + RequestCount: 0, + ByVerb: nil, + } + totalCount := int64(0) + for verb, verbCount := range userCount.verbsToRequestCounts { + totalCount += verbCount.count + apiUserStatus.ByVerb = append(apiUserStatus.ByVerb, + apiv1.PerVerbAPIRequestCount{ + Verb: verb, + RequestCount: verbCount.count, + }) + } + apiUserStatus.RequestCount = totalCount + totalRequestsThisHour += totalCount + + // the api resource has an interesting property of only keeping the last few. Having a short list makes the sort faster + hasMaxEntries := len(hourlyNodeRequests[hour].ByUser) >= numberOfUsersInAPI + if hasMaxEntries { + currentSmallestCount := hourlyNodeRequests[hour].ByUser[len(hourlyNodeRequests[hour].ByUser)-1].RequestCount + if apiUserStatus.RequestCount <= currentSmallestCount { + continue + } + } + + hourlyNodeRequests[hour].ByUser = append(hourlyNodeRequests[hour].ByUser, apiUserStatus) + sort.Stable(sort.Reverse(byNumberOfUserRequests(hourlyNodeRequests[hour].ByUser))) + } + hourlyNodeRequests[hour].RequestCount = totalRequestsThisHour + } + + return hourlyNodeRequests +} + +func apiStatusToRequestCount(resource schema.GroupVersionResource, status *apiv1.APIRequestCountStatus) *clusterRequestCounts { + requestCount := newClusterRequestCounts() + for hour, hourlyCount := range status.Last24h { + for _, hourlyNodeCount := range hourlyCount.ByNode { + for _, hourNodeUserCount := range hourlyNodeCount.ByUser { + for _, hourlyNodeUserVerbCount := range hourNodeUserCount.ByVerb { + requestCount.IncrementRequestCount( + hourlyNodeCount.NodeName, + resource, + hour, + hourNodeUserCount.UserName, + hourlyNodeUserVerbCount.Verb, + hourlyNodeUserVerbCount.RequestCount, + ) + } + } + } + } + return requestCount +} + +func canonicalizeStatus(status *apiv1.APIRequestCountStatus) { + for hour := range status.Last24h { + hourlyCount := status.Last24h[hour] + for j := range hourlyCount.ByNode { + nodeCount := hourlyCount.ByNode[j] + for k := range nodeCount.ByUser { + userCount := nodeCount.ByUser[k] + sort.Stable(byVerb(userCount.ByVerb)) + } + sort.Stable(sort.Reverse(byNumberOfUserRequests(nodeCount.ByUser))) + } + sort.Stable(byNode(status.Last24h[hour].ByNode)) + } + +} + +type byVerb []apiv1.PerVerbAPIRequestCount + +func (s byVerb) Len() int { + return len(s) +} +func (s byVerb) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +func (s byVerb) Less(i, j int) bool { + return strings.Compare(s[i].Verb, s[j].Verb) < 0 +} + +type byNode []apiv1.PerNodeAPIRequestLog + +func (s byNode) Len() int { + return len(s) +} +func (s byNode) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +func (s byNode) Less(i, j int) bool { + return strings.Compare(s[i].NodeName, s[j].NodeName) < 0 +} + +type byNumberOfUserRequests []apiv1.PerUserAPIRequestCount + +func (s byNumberOfUserRequests) Len() int { + return len(s) +} +func (s byNumberOfUserRequests) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +func (s byNumberOfUserRequests) Less(i, j int) bool { + return s[i].RequestCount < s[j].RequestCount +} diff --git a/vendor/k8s.io/kubernetes/openshift-kube-apiserver/filters/deprecatedapirequest/v1helpers/helpers.go b/vendor/k8s.io/kubernetes/openshift-kube-apiserver/filters/deprecatedapirequest/v1helpers/helpers.go new file mode 100644 index 000000000000..dfaa397d7c12 --- /dev/null +++ b/vendor/k8s.io/kubernetes/openshift-kube-apiserver/filters/deprecatedapirequest/v1helpers/helpers.go @@ -0,0 +1,58 @@ +package v1helpers + +import ( + "context" + + apiclientv1 "github.com/openshift/client-go/apiserver/clientset/versioned/typed/apiserver/v1" + + apiv1 "github.com/openshift/api/apiserver/v1" + "k8s.io/apimachinery/pkg/api/equality" + "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/util/retry" +) + +type UpdateStatusFunc func(status *apiv1.APIRequestCountStatus) + +func ApplyStatus(ctx context.Context, client apiclientv1.APIRequestCountInterface, name string, updateFuncs ...UpdateStatusFunc) (*apiv1.APIRequestCountStatus, bool, error) { + updated := false + var updatedStatus *apiv1.APIRequestCountStatus + err := retry.RetryOnConflict(retry.DefaultBackoff, func() error { + check, err := client.Get(ctx, name, metav1.GetOptions{}) + if errors.IsNotFound(err) { + // on a not found, let's create this thing. + requestCount := &apiv1.APIRequestCount{ + ObjectMeta: metav1.ObjectMeta{Name: name}, + Spec: apiv1.APIRequestCountSpec{ + NumberOfUsersToReport: 10, + }, + } + check, err = client.Create(ctx, requestCount, metav1.CreateOptions{}) + } + if err != nil { + return err + } + oldStatus := check.Status + newStatus := oldStatus.DeepCopy() + for _, update := range updateFuncs { + update(newStatus) + } + if equality.Semantic.DeepEqual(oldStatus, newStatus) { + updatedStatus = newStatus + return nil + } + check, err = client.Get(ctx, name, metav1.GetOptions{}) + if err != nil { + return err + } + check.Status = *newStatus + updatedCheck, err := client.UpdateStatus(ctx, check, metav1.UpdateOptions{}) + if err != nil { + return err + } + updatedStatus = &updatedCheck.Status + updated = true + return err + }) + return updatedStatus, updated, err +} diff --git a/vendor/k8s.io/kubernetes/openshift-kube-apiserver/filters/deprecatedapirequest_filter.go b/vendor/k8s.io/kubernetes/openshift-kube-apiserver/filters/deprecatedapirequest_filter.go new file mode 100644 index 000000000000..cca96e662a12 --- /dev/null +++ b/vendor/k8s.io/kubernetes/openshift-kube-apiserver/filters/deprecatedapirequest_filter.go @@ -0,0 +1,40 @@ +package filters + +import ( + "net/http" + + "k8s.io/apimachinery/pkg/runtime/schema" + + "k8s.io/apiserver/pkg/endpoints/request" + "k8s.io/kubernetes/openshift-kube-apiserver/filters/deprecatedapirequest" +) + +// WithDeprecatedApiRequestLogging adds an http handler that logs requests to deprecated apis. +func WithDeprecatedApiRequestLogging(handler http.Handler, controller deprecatedapirequest.APIRequestLogger) http.Handler { + handlerFunc := http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + defer handler.ServeHTTP(w, req) + info, ok := request.RequestInfoFrom(req.Context()) + if !ok { + return + } + timestamp, ok := request.ReceivedTimestampFrom(req.Context()) + if !ok { + return + } + user, ok := request.UserFrom(req.Context()) + if !ok { + return + } + controller.LogRequest( + schema.GroupVersionResource{ + Group: info.APIGroup, + Version: info.APIVersion, + Resource: info.Resource, + }, + timestamp, + user.GetName(), + info.Verb, + ) + }) + return handlerFunc +} diff --git a/vendor/k8s.io/kubernetes/openshift-kube-apiserver/openshiftkubeapiserver/patch.go b/vendor/k8s.io/kubernetes/openshift-kube-apiserver/openshiftkubeapiserver/patch.go index a55a350e65eb..6fe25e3caf5c 100644 --- a/vendor/k8s.io/kubernetes/openshift-kube-apiserver/openshiftkubeapiserver/patch.go +++ b/vendor/k8s.io/kubernetes/openshift-kube-apiserver/openshiftkubeapiserver/patch.go @@ -1,23 +1,14 @@ package openshiftkubeapiserver import ( + "os" "time" - "k8s.io/kubernetes/openshift-kube-apiserver/enablement" - - "k8s.io/apiserver/pkg/admission" - "k8s.io/apiserver/pkg/quota/v1/generic" - genericapiserver "k8s.io/apiserver/pkg/server" - clientgoinformers "k8s.io/client-go/informers" - corev1informers "k8s.io/client-go/informers/core/v1" - "k8s.io/client-go/rest" - "k8s.io/client-go/tools/cache" - "k8s.io/kubernetes/pkg/quota/v1/install" - "github.com/openshift/apiserver-library-go/pkg/admission/imagepolicy" "github.com/openshift/apiserver-library-go/pkg/admission/imagepolicy/imagereferencemutators" "github.com/openshift/apiserver-library-go/pkg/admission/quota/clusterresourcequota" "github.com/openshift/apiserver-library-go/pkg/securitycontextconstraints/sccadmission" + apiclientv1 "github.com/openshift/client-go/apiserver/clientset/versioned/typed/apiserver/v1" quotaclient "github.com/openshift/client-go/quota/clientset/versioned" quotainformer "github.com/openshift/client-go/quota/informers/externalversions" quotav1informer "github.com/openshift/client-go/quota/informers/externalversions/quota/v1" @@ -28,9 +19,22 @@ import ( "github.com/openshift/library-go/pkg/apiserver/admission/admissionrestconfig" "github.com/openshift/library-go/pkg/apiserver/apiserverconfig" "github.com/openshift/library-go/pkg/quota/clusterquotamapping" + "k8s.io/apiserver/pkg/admission" + "k8s.io/apiserver/pkg/quota/v1/generic" + genericapiserver "k8s.io/apiserver/pkg/server" + clientgoinformers "k8s.io/client-go/informers" + corev1informers "k8s.io/client-go/informers/core/v1" + "k8s.io/client-go/rest" + "k8s.io/client-go/tools/cache" "k8s.io/kubernetes/openshift-kube-apiserver/admission/authorization/restrictusers" "k8s.io/kubernetes/openshift-kube-apiserver/admission/authorization/restrictusers/usercache" "k8s.io/kubernetes/openshift-kube-apiserver/admission/scheduler/nodeenv" + "k8s.io/kubernetes/openshift-kube-apiserver/enablement" + "k8s.io/kubernetes/openshift-kube-apiserver/filters/deprecatedapirequest" + "k8s.io/kubernetes/pkg/quota/v1/install" + + // magnet to get authorizer package in hack/update-vendor.sh + _ "github.com/openshift/library-go/pkg/authorization/hardcodedauthorizer" ) func OpenShiftKubeAPIServerConfigPatch(genericConfig *genericapiserver.Config, kubeInformers clientgoinformers.SharedInformerFactory, pluginInitializers *[]admission.PluginInitializer) error { @@ -73,7 +77,20 @@ func OpenShiftKubeAPIServerConfigPatch(genericConfig *genericapiserver.Config, k // END ADMISSION // HANDLER CHAIN (with oauth server and web console) - genericConfig.BuildHandlerChainFunc, err = BuildHandlerChain(enablement.OpenshiftConfig().ConsolePublicURL, enablement.OpenshiftConfig().AuthConfig.OAuthMetadataFile) + deprecatedAPIClient, err := apiclientv1.NewForConfig(makeJSONRESTConfig(genericConfig.LoopbackClientConfig)) + if err != nil { + return err + } + deprecatedAPIRequestController := deprecatedapirequest.NewController(deprecatedAPIClient.APIRequestCounts(), nodeFor()) + genericConfig.AddPostStartHook("openshift.io-deprecated-api-requests-filter", func(context genericapiserver.PostStartHookContext) error { + go deprecatedAPIRequestController.Start(context.StopCh) + return nil + }) + genericConfig.BuildHandlerChainFunc, err = BuildHandlerChain( + enablement.OpenshiftConfig().ConsolePublicURL, + enablement.OpenshiftConfig().AuthConfig.OAuthMetadataFile, + deprecatedAPIRequestController, + ) if err != nil { return err } @@ -100,12 +117,25 @@ func OpenShiftKubeAPIServerConfigPatch(genericConfig *genericapiserver.Config, k return nil } +func makeJSONRESTConfig(config *rest.Config) *rest.Config { + c := rest.CopyConfig(config) + c.AcceptContentTypes = "application/json" + c.ContentType = "application/json" + return c +} + +func nodeFor() string { + node := os.Getenv("HOST_IP") + if hostname, err := os.Hostname(); err != nil { + node = hostname + } + return node +} + // newInformers is only exposed for the build's integration testing until it can be fixed more appropriately. func newInformers(loopbackClientConfig *rest.Config) (*kubeAPIServerInformers, error) { // ClusterResourceQuota is served using CRD resource any status update must use JSON - jsonLoopbackClientConfig := rest.CopyConfig(loopbackClientConfig) - jsonLoopbackClientConfig.ContentConfig.AcceptContentTypes = "application/json" - jsonLoopbackClientConfig.ContentConfig.ContentType = "application/json" + jsonLoopbackClientConfig := makeJSONRESTConfig(loopbackClientConfig) quotaClient, err := quotaclient.NewForConfig(jsonLoopbackClientConfig) if err != nil { diff --git a/vendor/k8s.io/kubernetes/openshift-kube-apiserver/openshiftkubeapiserver/patch_handlerchain.go b/vendor/k8s.io/kubernetes/openshift-kube-apiserver/openshiftkubeapiserver/patch_handlerchain.go index 804116c1efa1..6a8cbc50a658 100644 --- a/vendor/k8s.io/kubernetes/openshift-kube-apiserver/openshiftkubeapiserver/patch_handlerchain.go +++ b/vendor/k8s.io/kubernetes/openshift-kube-apiserver/openshiftkubeapiserver/patch_handlerchain.go @@ -1,18 +1,31 @@ package openshiftkubeapiserver import ( + "context" + "fmt" "net/http" "strings" - - authenticationv1 "k8s.io/api/authentication/v1" - genericapiserver "k8s.io/apiserver/pkg/server" + "time" authorizationv1 "github.com/openshift/api/authorization/v1" "github.com/openshift/library-go/pkg/apiserver/httprequest" + authenticationv1 "k8s.io/api/authentication/v1" + "k8s.io/apimachinery/pkg/util/clock" + "k8s.io/apimachinery/pkg/util/rand" + "k8s.io/apiserver/pkg/audit" + "k8s.io/apiserver/pkg/authentication/user" + "k8s.io/apiserver/pkg/authorization/authorizer" + "k8s.io/apiserver/pkg/endpoints/filters" + "k8s.io/apiserver/pkg/endpoints/metrics" + "k8s.io/apiserver/pkg/endpoints/request" + genericapiserver "k8s.io/apiserver/pkg/server" + "k8s.io/client-go/util/flowcontrol" + patchfilters "k8s.io/kubernetes/openshift-kube-apiserver/filters" + "k8s.io/kubernetes/openshift-kube-apiserver/filters/deprecatedapirequest" ) // TODO switch back to taking a kubeapiserver config. For now make it obviously safe for 3.11 -func BuildHandlerChain(consolePublicURL string, oauthMetadataFile string) (func(apiHandler http.Handler, kc *genericapiserver.Config) http.Handler, error) { +func BuildHandlerChain(consolePublicURL string, oauthMetadataFile string, deprecatedAPIRequestController deprecatedapirequest.APIRequestLogger) (func(apiHandler http.Handler, kc *genericapiserver.Config) http.Handler, error) { // load the oauthmetadata when we can return an error oAuthMetadata := []byte{} if len(oauthMetadataFile) > 0 { @@ -27,6 +40,12 @@ func BuildHandlerChain(consolePublicURL string, oauthMetadataFile string) (func( // well-known comes after the normal handling chain. This shows where to connect for oauth information handler := withOAuthInfo(apiHandler, oAuthMetadata) + // we rate limit watches after building the regular handler chain so we have the context information + handler = withWatchRateLimit(handler) + + // after normal chain, so that user is in context + handler = patchfilters.WithDeprecatedApiRequestLogging(handler, deprecatedAPIRequestController) + // this is the normal kube handler chain handler = genericapiserver.DefaultBuildHandlerChain(handler, genericConfig) @@ -38,6 +57,7 @@ func BuildHandlerChain(consolePublicURL string, oauthMetadataFile string) (func( return handler }, + nil } @@ -95,3 +115,129 @@ func translateLegacyScopeImpersonation(handler http.Handler) http.Handler { handler.ServeHTTP(w, req) }) } + +type authorizerAttributesFunc func(ctx context.Context) (authorizer.Attributes, error) + +type watchRateLimit struct { + delegate http.Handler + + earlyRateLimiter flowcontrol.RateLimiter + middleRateLimiter flowcontrol.RateLimiter + + authorizerAttributesFn authorizerAttributesFunc + clock clock.Clock + earlyEndTime time.Time + middleEndTime time.Time +} + +// ServeHTTP rate limits the establishment of watches to keep kube-apiservers from crashing. +// Rate limiting watches effectively creates an upper bound on secret and configmap mounts of 10*QPS because of a +// ten minute watch timeout and kubelets use watches to get the content for the mount. +// We will break the rate limiting into three timespans +// 1. first ten minutes: this is the most restrictive 10000 total mounted secrets and configmaps, 1000 per minute. +// We're trying to break up the slug of kubelet traffic and +// we want to be sure that operators can make progress during this time if we need to recover a cluster in +// a bad state. +// 2. second ten minutes: this is less restrictive 20000 total mounted secrets and configmaps, 2000 per minute. +// This lets us start to ramp up during a relative steady state. +// 3. no limit. We have this to handle cases of large clusters with more than 20000 mounted secrets and configmaps. +// I honestly don't know how common this is, but I don't want to break on it. +// Recall that we observed more than the the 30,000 per minute observed during some disruptive events on a cluster. +// In addition, we special case watches in the platform operator namespaces, cluster scope, and kube-system. +// We have not observed large numbers of these and they are required in order to make progress when trying to correct +// some kinds of cluster failures. +func (h watchRateLimit) ServeHTTP(w http.ResponseWriter, req *http.Request) { + var effectiveRateLimiter flowcontrol.RateLimiter + now := h.clock.Now() + switch { + case now.After(h.middleEndTime): + // we are past our rate limiting time + h.delegate.ServeHTTP(w, req) + return + case now.After(h.earlyEndTime): + effectiveRateLimiter = h.middleRateLimiter + default: + effectiveRateLimiter = h.earlyRateLimiter + } + + ctx := req.Context() + + attributes, err := h.authorizerAttributesFn(ctx) + if err != nil { + // if we cannot get attributes, don't fail the request + h.delegate.ServeHTTP(w, req) + return + } + if attributes.GetUser() == nil { + // if we cannot get user, don't fail the request + h.delegate.ServeHTTP(w, req) + return + } + for _, group := range attributes.GetUser().GetGroups() { + if group == user.SystemPrivilegedGroup { + // system:masters always have the power! + h.delegate.ServeHTTP(w, req) + return + } + } + + if attributes.GetVerb() != "watch" { + // only throttle watch establishment + h.delegate.ServeHTTP(w, req) + return + } + namespace := attributes.GetNamespace() + switch { + case len(namespace) == 0: + // don't rate limit cluster scoped watches because operators that need to make progress may use those + // if we have to restrict further we can + h.delegate.ServeHTTP(w, req) + return + + case strings.HasPrefix("kube-", namespace): + // don't rate limit kube- because some operators use and we use this for delegated authn + h.delegate.ServeHTTP(w, req) + return + + case strings.HasPrefix("openshift-", namespace): + // don't rate limit openshift- because we need operators to make progress, so we need openshift- mounts + // to succeed in order to progress + h.delegate.ServeHTTP(w, req) + return + + } + + if !effectiveRateLimiter.TryAccept() { + // add a metric for us to observe + if requestInfo, ok := request.RequestInfoFrom(ctx); ok { + metrics.RecordRequestTermination(req, requestInfo, "apiserver-watch", http.StatusTooManyRequests) + } + + ae := request.AuditEventFrom(ctx) + audit.LogAnnotation(ae, "apiserver.openshift.io/watch-rate-limit", "rate-limited") + retryAfter := rand.Intn(15) + 5 // evenly weighted from 5-20 second wait + // Return a 429 status indicating "Too Many Requests", but make sure its recognizeable + w.Header().Set("Retry-After", fmt.Sprintf("%d", retryAfter)) + http.Error(w, "Too many WATCH requests, please try again later.", http.StatusTooManyRequests) + return + } + h.delegate.ServeHTTP(w, req) +} + +func newWatchRateLimit(handler http.Handler, theClock clock.Clock) watchRateLimit { + startTime := theClock.Now() + + return watchRateLimit{ + delegate: handler, + earlyRateLimiter: flowcontrol.NewTokenBucketRateLimiterWithClock(16.6, 100, theClock), + middleRateLimiter: flowcontrol.NewTokenBucketRateLimiterWithClock(33.3, 100, theClock), + authorizerAttributesFn: filters.GetAuthorizerAttributes, + clock: theClock, + earlyEndTime: startTime.Add(10 * time.Minute), + middleEndTime: startTime.Add(20 * time.Minute), + } +} + +func withWatchRateLimit(handler http.Handler) http.Handler { + return newWatchRateLimit(handler, clock.RealClock{}) +} diff --git a/vendor/k8s.io/kubernetes/pkg/api/legacyscheme/BUILD b/vendor/k8s.io/kubernetes/pkg/api/legacyscheme/BUILD deleted file mode 100644 index b02b10a5275d..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/api/legacyscheme/BUILD +++ /dev/null @@ -1,26 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["scheme.go"], - importpath = "k8s.io/kubernetes/pkg/api/legacyscheme", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/api/persistentvolume/BUILD b/vendor/k8s.io/kubernetes/pkg/api/persistentvolume/BUILD deleted file mode 100644 index e70fa8b49987..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/api/persistentvolume/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["util.go"], - importpath = "k8s.io/kubernetes/pkg/api/persistentvolume", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["util_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/api/persistentvolumeclaim/BUILD b/vendor/k8s.io/kubernetes/pkg/api/persistentvolumeclaim/BUILD deleted file mode 100644 index 017affb84d63..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/api/persistentvolumeclaim/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["util.go"], - importpath = "k8s.io/kubernetes/pkg/api/persistentvolumeclaim", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["util_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/api/pod/BUILD b/vendor/k8s.io/kubernetes/pkg/api/pod/BUILD deleted file mode 100644 index 1b59f73e07ee..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/api/pod/BUILD +++ /dev/null @@ -1,56 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["util.go"], - importpath = "k8s.io/kubernetes/pkg/api/pod", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/helper:go_default_library", - "//pkg/apis/core/v1/helper:go_default_library", - "//pkg/apis/core/validation:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["util_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - "//vendor/github.com/google/go-cmp/cmp:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/api/pod/util.go b/vendor/k8s.io/kubernetes/pkg/api/pod/util.go index 27398b53fc4d..dd6922ee3762 100644 --- a/vendor/k8s.io/kubernetes/pkg/api/pod/util.go +++ b/vendor/k8s.io/kubernetes/pkg/api/pod/util.go @@ -92,11 +92,23 @@ func VisitContainers(podSpec *api.PodSpec, mask ContainerType, visitor Container // Visitor is called with each object name, and returns true if visiting should continue type Visitor func(name string) (shouldContinue bool) +func skipEmptyNames(visitor Visitor) Visitor { + return func(name string) bool { + if len(name) == 0 { + // continue visiting + return true + } + // delegate to visitor + return visitor(name) + } +} + // VisitPodSecretNames invokes the visitor function with the name of every secret // referenced by the pod spec. If visitor returns false, visiting is short-circuited. // Transitive references (e.g. pod -> pvc -> pv -> secret) are not visited. // Returns true if visiting completed, false if visiting was short-circuited. func VisitPodSecretNames(pod *api.Pod, visitor Visitor, containerType ContainerType) bool { + visitor = skipEmptyNames(visitor) for _, reference := range pod.Spec.ImagePullSecrets { if !visitor(reference.Name) { return false @@ -185,6 +197,7 @@ func visitContainerSecretNames(container *api.Container, visitor Visitor) bool { // Transitive references (e.g. pod -> pvc -> pv -> secret) are not visited. // Returns true if visiting completed, false if visiting was short-circuited. func VisitPodConfigmapNames(pod *api.Pod, visitor Visitor, containerType ContainerType) bool { + visitor = skipEmptyNames(visitor) VisitContainers(&pod.Spec, containerType, func(c *api.Container, containerType ContainerType) bool { return visitContainerConfigmapNames(c, visitor) }) @@ -332,45 +345,105 @@ func usesMultipleHugePageResources(podSpec *api.PodSpec) bool { return len(hugePageResources) > 1 } -// GetValidationOptionsFromPodSpec returns validation options based on pod specs -func GetValidationOptionsFromPodSpec(podSpec, oldPodSpec *api.PodSpec) apivalidation.PodValidationOptions { +func checkContainerUseIndivisibleHugePagesValues(container api.Container) bool { + for resourceName, quantity := range container.Resources.Limits { + if helper.IsHugePageResourceName(resourceName) { + if !helper.IsHugePageResourceValueDivisible(resourceName, quantity) { + return true + } + } + } + + for resourceName, quantity := range container.Resources.Requests { + if helper.IsHugePageResourceName(resourceName) { + if !helper.IsHugePageResourceValueDivisible(resourceName, quantity) { + return true + } + } + } + + return false +} + +// usesIndivisibleHugePagesValues returns true if the one of the containers uses non-integer multiple +// of huge page unit size +func usesIndivisibleHugePagesValues(podSpec *api.PodSpec) bool { + foundIndivisibleHugePagesValue := false + VisitContainers(podSpec, AllContainers, func(c *api.Container, containerType ContainerType) bool { + if checkContainerUseIndivisibleHugePagesValues(*c) { + foundIndivisibleHugePagesValue = true + } + return !foundIndivisibleHugePagesValue // continue visiting if we haven't seen an invalid value yet + }) + + if foundIndivisibleHugePagesValue { + return true + } + + for resourceName, quantity := range podSpec.Overhead { + if helper.IsHugePageResourceName(resourceName) { + if !helper.IsHugePageResourceValueDivisible(resourceName, quantity) { + return true + } + } + } + + return false +} + +// GetValidationOptionsFromPodSpecAndMeta returns validation options based on pod specs and metadata +func GetValidationOptionsFromPodSpecAndMeta(podSpec, oldPodSpec *api.PodSpec, podMeta, oldPodMeta *metav1.ObjectMeta) apivalidation.PodValidationOptions { // default pod validation options based on feature gate opts := validation.PodValidationOptions{ // Allow multiple huge pages on pod create if feature is enabled AllowMultipleHugePageResources: utilfeature.DefaultFeatureGate.Enabled(features.HugePageStorageMediumSize), // Allow pod spec to use hugepages in downward API if feature is enabled - AllowDownwardAPIHugePages: utilfeature.DefaultFeatureGate.Enabled(features.DownwardAPIHugePages), - } - // if we are not doing an update operation, just return with default options - if oldPodSpec == nil { - return opts - } - // if old spec used multiple huge page sizes, we must allow it - opts.AllowMultipleHugePageResources = opts.AllowMultipleHugePageResources || usesMultipleHugePageResources(oldPodSpec) - // if old spec used hugepages in downward api, we must allow it - opts.AllowDownwardAPIHugePages = opts.AllowDownwardAPIHugePages || usesHugePagesInProjectedVolume(oldPodSpec) - // determine if any container is using hugepages in env var - if !opts.AllowDownwardAPIHugePages { - VisitContainers(oldPodSpec, AllContainers, func(c *api.Container, containerType ContainerType) bool { - opts.AllowDownwardAPIHugePages = opts.AllowDownwardAPIHugePages || usesHugePagesInProjectedEnv(*c) - return !opts.AllowDownwardAPIHugePages - }) + AllowDownwardAPIHugePages: utilfeature.DefaultFeatureGate.Enabled(features.DownwardAPIHugePages), + AllowInvalidPodDeletionCost: !utilfeature.DefaultFeatureGate.Enabled(features.PodDeletionCost), + // Do not allow pod spec to use non-integer multiple of huge page unit size default + AllowIndivisibleHugePagesValues: false, + } + + if oldPodSpec != nil { + // if old spec used multiple huge page sizes, we must allow it + opts.AllowMultipleHugePageResources = opts.AllowMultipleHugePageResources || usesMultipleHugePageResources(oldPodSpec) + // if old spec used hugepages in downward api, we must allow it + opts.AllowDownwardAPIHugePages = opts.AllowDownwardAPIHugePages || usesHugePagesInProjectedVolume(oldPodSpec) + // determine if any container is using hugepages in env var + if !opts.AllowDownwardAPIHugePages { + VisitContainers(oldPodSpec, AllContainers, func(c *api.Container, containerType ContainerType) bool { + opts.AllowDownwardAPIHugePages = opts.AllowDownwardAPIHugePages || usesHugePagesInProjectedEnv(*c) + return !opts.AllowDownwardAPIHugePages + }) + } + + // if old spec used non-integer multiple of huge page unit size, we must allow it + opts.AllowIndivisibleHugePagesValues = usesIndivisibleHugePagesValues(oldPodSpec) } + if oldPodMeta != nil && !opts.AllowInvalidPodDeletionCost { + // This is an update, so validate only if the existing object was valid. + _, err := helper.GetDeletionCostFromPodAnnotations(oldPodMeta.Annotations) + opts.AllowInvalidPodDeletionCost = err != nil + } + return opts } // GetValidationOptionsFromPodTemplate will return pod validation options for specified template. func GetValidationOptionsFromPodTemplate(podTemplate, oldPodTemplate *api.PodTemplateSpec) apivalidation.PodValidationOptions { var newPodSpec, oldPodSpec *api.PodSpec + var newPodMeta, oldPodMeta *metav1.ObjectMeta // we have to be careful about nil pointers here // replication controller in particular is prone to passing nil if podTemplate != nil { newPodSpec = &podTemplate.Spec + newPodMeta = &podTemplate.ObjectMeta } if oldPodTemplate != nil { oldPodSpec = &oldPodTemplate.Spec + oldPodMeta = &oldPodTemplate.ObjectMeta } - return GetValidationOptionsFromPodSpec(newPodSpec, oldPodSpec) + return GetValidationOptionsFromPodSpecAndMeta(newPodSpec, oldPodSpec, newPodMeta, oldPodMeta) } // DropDisabledTemplateFields removes disabled fields from the pod template metadata and spec. @@ -447,12 +520,6 @@ func dropDisabledFields( } } - if !utilfeature.DefaultFeatureGate.Enabled(features.Sysctls) && !sysctlsInUse(oldPodSpec) { - if podSpec.SecurityContext != nil { - podSpec.SecurityContext.Sysctls = nil - } - } - if !utilfeature.DefaultFeatureGate.Enabled(features.LocalStorageCapacityIsolation) && !emptyDirSizeLimitInUse(oldPodSpec) { for i := range podSpec.Volumes { if podSpec.Volumes[i].EmptyDir != nil { @@ -484,7 +551,19 @@ func dropDisabledFields( }) } - dropDisabledRunAsGroupField(podSpec, oldPodSpec) + if !utilfeature.DefaultFeatureGate.Enabled(features.ProbeTerminationGracePeriod) && !probeGracePeriodInUse(oldPodSpec) { + // Set pod-level terminationGracePeriodSeconds to nil if the feature is disabled and it is not used + VisitContainers(podSpec, AllContainers, func(c *api.Container, containerType ContainerType) bool { + if c.LivenessProbe != nil { + c.LivenessProbe.TerminationGracePeriodSeconds = nil + } + if c.StartupProbe != nil { + c.StartupProbe.TerminationGracePeriodSeconds = nil + } + // cannot be set for readiness probes + return true + }) + } dropDisabledFSGroupFields(podSpec, oldPodSpec) @@ -510,22 +589,7 @@ func dropDisabledFields( podSpec.SetHostnameAsFQDN = nil } -} - -// dropDisabledRunAsGroupField removes disabled fields from PodSpec related -// to RunAsGroup -func dropDisabledRunAsGroupField(podSpec, oldPodSpec *api.PodSpec) { - if !utilfeature.DefaultFeatureGate.Enabled(features.RunAsGroup) && !runAsGroupInUse(oldPodSpec) { - if podSpec.SecurityContext != nil { - podSpec.SecurityContext.RunAsGroup = nil - } - VisitContainers(podSpec, AllContainers, func(c *api.Container, containerType ContainerType) bool { - if c.SecurityContext != nil { - c.SecurityContext.RunAsGroup = nil - } - return true - }) - } + dropDisabledPodAffinityTermFields(podSpec, oldPodSpec) } // dropDisabledProcMountField removes disabled fields from PodSpec related @@ -568,13 +632,73 @@ func dropDisabledCSIVolumeSourceAlphaFields(podSpec, oldPodSpec *api.PodSpec) { // dropDisabledEphemeralVolumeSourceAlphaFields removes disabled alpha fields from []EphemeralVolumeSource. // This should be called from PrepareForCreate/PrepareForUpdate for all pod specs resources containing a EphemeralVolumeSource func dropDisabledEphemeralVolumeSourceAlphaFields(podSpec, oldPodSpec *api.PodSpec) { - if !utilfeature.DefaultFeatureGate.Enabled(features.GenericEphemeralVolume) && !csiInUse(oldPodSpec) { + if !utilfeature.DefaultFeatureGate.Enabled(features.GenericEphemeralVolume) && !ephemeralInUse(oldPodSpec) { for i := range podSpec.Volumes { podSpec.Volumes[i].Ephemeral = nil } } } +func dropPodAffinityTermNamespaceSelector(terms []api.PodAffinityTerm) { + for i := range terms { + terms[i].NamespaceSelector = nil + } +} + +func dropWeightedPodAffinityTermNamespaceSelector(terms []api.WeightedPodAffinityTerm) { + for i := range terms { + terms[i].PodAffinityTerm.NamespaceSelector = nil + } +} + +// dropDisabledPodAffinityTermFields removes disabled fields from PodSpec related +// to PodAffinityTerm only if it is not already used by the old spec +func dropDisabledPodAffinityTermFields(podSpec, oldPodSpec *api.PodSpec) { + if !utilfeature.DefaultFeatureGate.Enabled(features.PodAffinityNamespaceSelector) && + podSpec != nil && podSpec.Affinity != nil && + !podAffinityNamespaceSelectorInUse(oldPodSpec) { + if podSpec.Affinity.PodAffinity != nil { + dropPodAffinityTermNamespaceSelector(podSpec.Affinity.PodAffinity.RequiredDuringSchedulingIgnoredDuringExecution) + dropWeightedPodAffinityTermNamespaceSelector(podSpec.Affinity.PodAffinity.PreferredDuringSchedulingIgnoredDuringExecution) + } + if podSpec.Affinity.PodAntiAffinity != nil { + dropPodAffinityTermNamespaceSelector(podSpec.Affinity.PodAntiAffinity.RequiredDuringSchedulingIgnoredDuringExecution) + dropWeightedPodAffinityTermNamespaceSelector(podSpec.Affinity.PodAntiAffinity.PreferredDuringSchedulingIgnoredDuringExecution) + } + } +} + +func podAffinityNamespaceSelectorInUse(podSpec *api.PodSpec) bool { + if podSpec == nil || podSpec.Affinity == nil { + return false + } + if podSpec.Affinity.PodAffinity != nil { + for _, t := range podSpec.Affinity.PodAffinity.RequiredDuringSchedulingIgnoredDuringExecution { + if t.NamespaceSelector != nil { + return true + } + } + for _, t := range podSpec.Affinity.PodAffinity.PreferredDuringSchedulingIgnoredDuringExecution { + if t.PodAffinityTerm.NamespaceSelector != nil { + return true + } + } + } + if podSpec.Affinity.PodAntiAffinity != nil { + for _, t := range podSpec.Affinity.PodAntiAffinity.RequiredDuringSchedulingIgnoredDuringExecution { + if t.NamespaceSelector != nil { + return true + } + } + for _, t := range podSpec.Affinity.PodAntiAffinity.PreferredDuringSchedulingIgnoredDuringExecution { + if t.PodAffinityTerm.NamespaceSelector == nil { + return true + } + } + } + return false +} + func ephemeralContainersInUse(podSpec *api.PodSpec) bool { if podSpec == nil { return false @@ -666,16 +790,6 @@ func podPriorityInUse(podSpec *api.PodSpec) bool { return false } -func sysctlsInUse(podSpec *api.PodSpec) bool { - if podSpec == nil { - return false - } - if podSpec.SecurityContext != nil && podSpec.SecurityContext.Sysctls != nil { - return true - } - return false -} - // emptyDirSizeLimitInUse returns true if any pod's EmptyDir volumes use SizeLimit. func emptyDirSizeLimitInUse(podSpec *api.PodSpec) bool { if podSpec == nil { @@ -691,21 +805,19 @@ func emptyDirSizeLimitInUse(podSpec *api.PodSpec) bool { return false } -// runAsGroupInUse returns true if the pod spec is non-nil and has a SecurityContext's RunAsGroup field set -func runAsGroupInUse(podSpec *api.PodSpec) bool { +// subpathExprInUse returns true if the pod spec is non-nil and has a volume mount that makes use of the subPathExpr feature +func subpathExprInUse(podSpec *api.PodSpec) bool { if podSpec == nil { return false } - if podSpec.SecurityContext != nil && podSpec.SecurityContext.RunAsGroup != nil { - return true - } - var inUse bool VisitContainers(podSpec, AllContainers, func(c *api.Container, containerType ContainerType) bool { - if c.SecurityContext != nil && c.SecurityContext.RunAsGroup != nil { - inUse = true - return false + for i := range c.VolumeMounts { + if len(c.VolumeMounts[i].SubPathExpr) > 0 { + inUse = true + return false + } } return true }) @@ -713,19 +825,20 @@ func runAsGroupInUse(podSpec *api.PodSpec) bool { return inUse } -// subpathExprInUse returns true if the pod spec is non-nil and has a volume mount that makes use of the subPathExpr feature -func subpathExprInUse(podSpec *api.PodSpec) bool { +// probeGracePeriodInUse returns true if the pod spec is non-nil and has a probe that makes use +// of the probe-level terminationGracePeriodSeconds feature +func probeGracePeriodInUse(podSpec *api.PodSpec) bool { if podSpec == nil { return false } var inUse bool VisitContainers(podSpec, AllContainers, func(c *api.Container, containerType ContainerType) bool { - for i := range c.VolumeMounts { - if len(c.VolumeMounts[i].SubPathExpr) > 0 { - inUse = true - return false - } + // cannot be set for readiness probes + if (c.LivenessProbe != nil && c.LivenessProbe.TerminationGracePeriodSeconds != nil) || + (c.StartupProbe != nil && c.StartupProbe.TerminationGracePeriodSeconds != nil) { + inUse = true + return false } return true }) @@ -746,6 +859,19 @@ func csiInUse(podSpec *api.PodSpec) bool { return false } +// ephemeralInUse returns true if any pod's spec include inline CSI volumes. +func ephemeralInUse(podSpec *api.PodSpec) bool { + if podSpec == nil { + return false + } + for i := range podSpec.Volumes { + if podSpec.Volumes[i].Ephemeral != nil { + return true + } + } + return false +} + // podPriorityInUse returns true if status is not nil and number of PodIPs is greater than one func multiplePodIPsInUse(podStatus *api.PodStatus) bool { if podStatus == nil { diff --git a/vendor/k8s.io/kubernetes/pkg/api/podsecuritypolicy/BUILD b/vendor/k8s.io/kubernetes/pkg/api/podsecuritypolicy/BUILD deleted file mode 100644 index b89f4aeb5823..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/api/podsecuritypolicy/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["util.go"], - importpath = "k8s.io/kubernetes/pkg/api/podsecuritypolicy", - deps = [ - "//pkg/apis/policy:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["util_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/policy:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/api/podsecuritypolicy/util.go b/vendor/k8s.io/kubernetes/pkg/api/podsecuritypolicy/util.go index 6dbcdb95b6f3..a0df4f83ac4a 100644 --- a/vendor/k8s.io/kubernetes/pkg/api/podsecuritypolicy/util.go +++ b/vendor/k8s.io/kubernetes/pkg/api/podsecuritypolicy/util.go @@ -28,13 +28,6 @@ func DropDisabledFields(pspSpec, oldPSPSpec *policy.PodSecurityPolicySpec) { if !utilfeature.DefaultFeatureGate.Enabled(features.ProcMountType) && !allowedProcMountTypesInUse(oldPSPSpec) { pspSpec.AllowedProcMountTypes = nil } - if !utilfeature.DefaultFeatureGate.Enabled(features.RunAsGroup) && (oldPSPSpec == nil || oldPSPSpec.RunAsGroup == nil) { - pspSpec.RunAsGroup = nil - } - if !utilfeature.DefaultFeatureGate.Enabled(features.Sysctls) && !sysctlsInUse(oldPSPSpec) { - pspSpec.AllowedUnsafeSysctls = nil - pspSpec.ForbiddenSysctls = nil - } if !utilfeature.DefaultFeatureGate.Enabled(features.CSIInlineVolume) { pspSpec.AllowedCSIDrivers = nil } @@ -52,13 +45,3 @@ func allowedProcMountTypesInUse(oldPSPSpec *policy.PodSecurityPolicySpec) bool { return false } - -func sysctlsInUse(oldPSPSpec *policy.PodSecurityPolicySpec) bool { - if oldPSPSpec == nil { - return false - } - if oldPSPSpec.AllowedUnsafeSysctls != nil || oldPSPSpec.ForbiddenSysctls != nil { - return true - } - return false -} diff --git a/vendor/k8s.io/kubernetes/pkg/api/service/BUILD b/vendor/k8s.io/kubernetes/pkg/api/service/BUILD deleted file mode 100644 index d28572faf1d9..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/api/service/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["util.go"], - importpath = "k8s.io/kubernetes/pkg/api/service", - deps = [ - "//pkg/apis/core:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["util_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/api/v1/endpoints/BUILD b/vendor/k8s.io/kubernetes/pkg/api/v1/endpoints/BUILD deleted file mode 100644 index e5d624ebdacc..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/api/v1/endpoints/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["util.go"], - importpath = "k8s.io/kubernetes/pkg/api/v1/endpoints", - deps = [ - "//pkg/util/hash:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["util_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/github.com/davecgh/go-spew/spew:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/api/v1/persistentvolume/BUILD b/vendor/k8s.io/kubernetes/pkg/api/v1/persistentvolume/BUILD deleted file mode 100644 index 06cd00697104..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/api/v1/persistentvolume/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["util.go"], - importpath = "k8s.io/kubernetes/pkg/api/v1/persistentvolume", - visibility = ["//visibility:public"], - deps = ["//staging/src/k8s.io/api/core/v1:go_default_library"], -) - -go_test( - name = "go_default_test", - srcs = ["util_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/api/v1/persistentvolume/util.go b/vendor/k8s.io/kubernetes/pkg/api/v1/persistentvolume/util.go index 003b2e70d978..376021a292ba 100644 --- a/vendor/k8s.io/kubernetes/pkg/api/v1/persistentvolume/util.go +++ b/vendor/k8s.io/kubernetes/pkg/api/v1/persistentvolume/util.go @@ -30,10 +30,22 @@ func getClaimRefNamespace(pv *corev1.PersistentVolume) string { // Visitor is called with each object's namespace and name, and returns true if visiting should continue type Visitor func(namespace, name string, kubeletVisible bool) (shouldContinue bool) +func skipEmptyNames(visitor Visitor) Visitor { + return func(namespace, name string, kubeletVisible bool) bool { + if len(name) == 0 { + // continue visiting + return true + } + // delegate to visitor + return visitor(namespace, name, kubeletVisible) + } +} + // VisitPVSecretNames invokes the visitor function with the name of every secret // referenced by the PV spec. If visitor returns false, visiting is short-circuited. // Returns true if visiting completed, false if visiting was short-circuited. func VisitPVSecretNames(pv *corev1.PersistentVolume, visitor Visitor) bool { + visitor = skipEmptyNames(visitor) source := &pv.Spec.PersistentVolumeSource switch { case source.AzureFile != nil: diff --git a/vendor/k8s.io/kubernetes/pkg/api/v1/pod/BUILD b/vendor/k8s.io/kubernetes/pkg/api/v1/pod/BUILD deleted file mode 100644 index c5c52c6db344..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/api/v1/pod/BUILD +++ /dev/null @@ -1,51 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["util.go"], - importpath = "k8s.io/kubernetes/pkg/api/v1/pod", - deps = [ - "//pkg/features:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["util_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/features:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - "//vendor/github.com/google/go-cmp/cmp:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/api/v1/pod/util.go b/vendor/k8s.io/kubernetes/pkg/api/v1/pod/util.go index a944cba8f5b0..9560121bbe5f 100644 --- a/vendor/k8s.io/kubernetes/pkg/api/v1/pod/util.go +++ b/vendor/k8s.io/kubernetes/pkg/api/v1/pod/util.go @@ -82,6 +82,17 @@ type ContainerVisitor func(container *v1.Container, containerType ContainerType) // Visitor is called with each object name, and returns true if visiting should continue type Visitor func(name string) (shouldContinue bool) +func skipEmptyNames(visitor Visitor) Visitor { + return func(name string) bool { + if len(name) == 0 { + // continue visiting + return true + } + // delegate to visitor + return visitor(name) + } +} + // VisitContainers invokes the visitor function with a pointer to every container // spec in the given pod spec with type set in mask. If visitor returns false, // visiting is short-circuited. VisitContainers returns true if visiting completes, @@ -116,6 +127,7 @@ func VisitContainers(podSpec *v1.PodSpec, mask ContainerType, visitor ContainerV // Transitive references (e.g. pod -> pvc -> pv -> secret) are not visited. // Returns true if visiting completed, false if visiting was short-circuited. func VisitPodSecretNames(pod *v1.Pod, visitor Visitor) bool { + visitor = skipEmptyNames(visitor) for _, reference := range pod.Spec.ImagePullSecrets { if !visitor(reference.Name) { return false @@ -205,6 +217,7 @@ func visitContainerSecretNames(container *v1.Container, visitor Visitor) bool { // Transitive references (e.g. pod -> pvc -> pv -> secret) are not visited. // Returns true if visiting completed, false if visiting was short-circuited. func VisitPodConfigmapNames(pod *v1.Pod, visitor Visitor) bool { + visitor = skipEmptyNames(visitor) VisitContainers(&pod.Spec, AllContainers, func(c *v1.Container, containerType ContainerType) bool { return visitContainerConfigmapNames(c, visitor) }) @@ -277,7 +290,7 @@ func IsPodAvailable(pod *v1.Pod, minReadySeconds int32, now metav1.Time) bool { c := GetPodReadyCondition(pod.Status) minReadySecondsDuration := time.Duration(minReadySeconds) * time.Second - if minReadySeconds == 0 || !c.LastTransitionTime.IsZero() && c.LastTransitionTime.Add(minReadySecondsDuration).Before(now.Time) { + if minReadySeconds == 0 || (!c.LastTransitionTime.IsZero() && c.LastTransitionTime.Add(minReadySecondsDuration).Before(now.Time)) { return true } return false diff --git a/vendor/k8s.io/kubernetes/pkg/api/v1/resource/BUILD b/vendor/k8s.io/kubernetes/pkg/api/v1/resource/BUILD deleted file mode 100644 index ceffb140431f..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/api/v1/resource/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["helpers_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["helpers.go"], - importpath = "k8s.io/kubernetes/pkg/api/v1/resource", - deps = [ - "//pkg/features:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/api/v1/service/BUILD b/vendor/k8s.io/kubernetes/pkg/api/v1/service/BUILD deleted file mode 100644 index 5a16fca24d26..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/api/v1/service/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["util.go"], - importpath = "k8s.io/kubernetes/pkg/api/v1/service", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["util_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/api/v1/service/util.go b/vendor/k8s.io/kubernetes/pkg/api/v1/service/util.go index d1c6713888e6..68913287c139 100644 --- a/vendor/k8s.io/kubernetes/pkg/api/v1/service/util.go +++ b/vendor/k8s.io/kubernetes/pkg/api/v1/service/util.go @@ -20,7 +20,7 @@ import ( "fmt" "strings" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" utilnet "k8s.io/utils/net" ) @@ -76,6 +76,15 @@ func RequestsOnlyLocalTraffic(service *v1.Service) bool { return service.Spec.ExternalTrafficPolicy == v1.ServiceExternalTrafficPolicyTypeLocal } +// RequestsOnlyLocalTrafficForInternal checks if service prefers Node Local +// endpoints for internal traffic +func RequestsOnlyLocalTrafficForInternal(service *v1.Service) bool { + if service.Spec.InternalTrafficPolicy == nil { + return false + } + return *service.Spec.InternalTrafficPolicy == v1.ServiceInternalTrafficPolicyLocal +} + // NeedsHealthCheck checks if service needs health check. func NeedsHealthCheck(service *v1.Service) bool { if service.Spec.Type != v1.ServiceTypeLoadBalancer { diff --git a/vendor/k8s.io/kubernetes/pkg/apis/abac/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/abac/BUILD deleted file mode 100644 index 2c9de9b14dd3..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/abac/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/abac", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/apis/abac/fuzzer:all-srcs", - "//pkg/apis/abac/latest:all-srcs", - "//pkg/apis/abac/v0:all-srcs", - "//pkg/apis/abac/v1beta1:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/abac/OWNERS b/vendor/k8s.io/kubernetes/pkg/apis/abac/OWNERS index 42148e6acd6f..019e78aa0902 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/abac/OWNERS +++ b/vendor/k8s.io/kubernetes/pkg/apis/abac/OWNERS @@ -5,4 +5,3 @@ reviewers: - smarterclayton - deads2k - liggitt -- mbohlool diff --git a/vendor/k8s.io/kubernetes/pkg/apis/abac/latest/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/abac/latest/BUILD deleted file mode 100644 index 1caca7263267..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/abac/latest/BUILD +++ /dev/null @@ -1,30 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["latest.go"], - importpath = "k8s.io/kubernetes/pkg/apis/abac/latest", - deps = [ - "//pkg/apis/abac:go_default_library", - "//pkg/apis/abac/v0:go_default_library", - "//pkg/apis/abac/v1beta1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/abac/v0/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/abac/v0/BUILD deleted file mode 100644 index 3045fbcee7c8..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/abac/v0/BUILD +++ /dev/null @@ -1,51 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "doc.go", - "register.go", - "types.go", - "zz_generated.conversion.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/abac/v0", - deps = [ - "//pkg/apis/abac:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["conversion_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/abac:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/abac/v1beta1/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/abac/v1beta1/BUILD deleted file mode 100644 index dddbf8762f5a..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/abac/v1beta1/BUILD +++ /dev/null @@ -1,52 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "doc.go", - "register.go", - "types.go", - "zz_generated.conversion.go", - "zz_generated.deepcopy.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/abac/v1beta1", - deps = [ - "//pkg/apis/abac:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["conversion_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/abac:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/admission/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/admission/BUILD deleted file mode 100644 index a9077b8d1ea3..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/admission/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/admission", - deps = [ - "//pkg/apis/authentication:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/apis/admission/fuzzer:all-srcs", - "//pkg/apis/admission/install:all-srcs", - "//pkg/apis/admission/v1:all-srcs", - "//pkg/apis/admission/v1beta1:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/admission/install/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/admission/install/BUILD deleted file mode 100644 index 5e624364a9a0..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/admission/install/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["install.go"], - importpath = "k8s.io/kubernetes/pkg/apis/admission/install", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/admission:go_default_library", - "//pkg/apis/admission/v1:go_default_library", - "//pkg/apis/admission/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/admission/v1/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/admission/v1/BUILD deleted file mode 100644 index d88640660e96..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/admission/v1/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "zz_generated.conversion.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/admission/v1", - deps = [ - "//pkg/apis/admission:go_default_library", - "//pkg/apis/authentication/v1:go_default_library", - "//staging/src/k8s.io/api/admission/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/admission/v1beta1/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/admission/v1beta1/BUILD deleted file mode 100644 index ac5d48726e18..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/admission/v1beta1/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "zz_generated.conversion.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/admission/v1beta1", - deps = [ - "//pkg/apis/admission:go_default_library", - "//pkg/apis/authentication/v1:go_default_library", - "//staging/src/k8s.io/api/admission/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/admissionregistration/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/admissionregistration/BUILD deleted file mode 100644 index fede6ec2b11f..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/admissionregistration/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/admissionregistration", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/apis/admissionregistration/fuzzer:all-srcs", - "//pkg/apis/admissionregistration/install:all-srcs", - "//pkg/apis/admissionregistration/v1:all-srcs", - "//pkg/apis/admissionregistration/v1beta1:all-srcs", - "//pkg/apis/admissionregistration/validation:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/admissionregistration/install/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/admissionregistration/install/BUILD deleted file mode 100644 index a51d1a481346..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/admissionregistration/install/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["install.go"], - importpath = "k8s.io/kubernetes/pkg/apis/admissionregistration/install", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/admissionregistration:go_default_library", - "//pkg/apis/admissionregistration/v1:go_default_library", - "//pkg/apis/admissionregistration/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/admissionregistration/install/install.go b/vendor/k8s.io/kubernetes/pkg/apis/admissionregistration/install/install.go index 86b5402739e4..67b78812150f 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/admissionregistration/install/install.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/admissionregistration/install/install.go @@ -21,7 +21,7 @@ import ( utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/apis/admissionregistration" - "k8s.io/kubernetes/pkg/apis/admissionregistration/v1" + v1 "k8s.io/kubernetes/pkg/apis/admissionregistration/v1" "k8s.io/kubernetes/pkg/apis/admissionregistration/v1beta1" ) @@ -34,5 +34,5 @@ func Install(scheme *runtime.Scheme) { utilruntime.Must(admissionregistration.AddToScheme(scheme)) utilruntime.Must(v1beta1.AddToScheme(scheme)) utilruntime.Must(v1.AddToScheme(scheme)) - utilruntime.Must(scheme.SetVersionPriority(v1beta1.SchemeGroupVersion, v1.SchemeGroupVersion)) + utilruntime.Must(scheme.SetVersionPriority(v1.SchemeGroupVersion, v1beta1.SchemeGroupVersion)) } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/admissionregistration/types.go b/vendor/k8s.io/kubernetes/pkg/apis/admissionregistration/types.go index 3fa9a0751028..46e9626ad5b3 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/admissionregistration/types.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/admissionregistration/types.go @@ -266,7 +266,7 @@ type ValidatingWebhook struct { // SideEffects states whether this webhook has side effects. // Acceptable values are: Unknown, None, Some, NoneOnDryRun // Webhooks with side effects MUST implement a reconciliation system, since a request may be - // rejected by a future step in the admission change and the side effects therefore need to be undone. + // rejected by a future step in the admission chain and the side effects therefore need to be undone. // Requests with the dryRun attribute will be auto-rejected if they match a webhook with // sideEffects == Unknown or Some. Defaults to Unknown. // +optional @@ -390,7 +390,7 @@ type MutatingWebhook struct { // SideEffects states whether this webhook has side effects. // Acceptable values are: Unknown, None, Some, NoneOnDryRun // Webhooks with side effects MUST implement a reconciliation system, since a request may be - // rejected by a future step in the admission change and the side effects therefore need to be undone. + // rejected by a future step in the admission chain and the side effects therefore need to be undone. // Requests with the dryRun attribute will be auto-rejected if they match a webhook with // sideEffects == Unknown or Some. Defaults to Unknown. // +optional diff --git a/vendor/k8s.io/kubernetes/pkg/apis/admissionregistration/v1/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/admissionregistration/v1/BUILD deleted file mode 100644 index 2c7bf8916dcf..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/admissionregistration/v1/BUILD +++ /dev/null @@ -1,53 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "defaults.go", - "doc.go", - "register.go", - "zz_generated.conversion.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/admissionregistration/v1", - deps = [ - "//pkg/apis/admissionregistration:go_default_library", - "//staging/src/k8s.io/api/admissionregistration/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["defaults_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/admissionregistration/install:go_default_library", - "//staging/src/k8s.io/api/admissionregistration/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/github.com/google/go-cmp/cmp:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/admissionregistration/v1beta1/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/admissionregistration/v1beta1/BUILD deleted file mode 100644 index 70a6d6a7d59d..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/admissionregistration/v1beta1/BUILD +++ /dev/null @@ -1,53 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "defaults.go", - "doc.go", - "register.go", - "zz_generated.conversion.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/admissionregistration/v1beta1", - deps = [ - "//pkg/apis/admissionregistration:go_default_library", - "//staging/src/k8s.io/api/admissionregistration/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["defaults_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/admissionregistration/install:go_default_library", - "//staging/src/k8s.io/api/admissionregistration/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/github.com/google/go-cmp/cmp:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/admissionregistration/validation/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/admissionregistration/validation/BUILD deleted file mode 100644 index 36068946f220..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/admissionregistration/validation/BUILD +++ /dev/null @@ -1,49 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["validation_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/admissionregistration:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["validation.go"], - importpath = "k8s.io/kubernetes/pkg/apis/admissionregistration/validation", - deps = [ - "//pkg/apis/admissionregistration:go_default_library", - "//pkg/apis/admissionregistration/v1:go_default_library", - "//pkg/apis/admissionregistration/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/webhook:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/apiserverinternal/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/apiserverinternal/BUILD deleted file mode 100644 index 64ea84278729..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/apiserverinternal/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/apiserverinternal", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/apis/apiserverinternal/fuzzer:all-srcs", - "//pkg/apis/apiserverinternal/install:all-srcs", - "//pkg/apis/apiserverinternal/v1alpha1:all-srcs", - "//pkg/apis/apiserverinternal/validation:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/apiserverinternal/install/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/apiserverinternal/install/BUILD deleted file mode 100644 index b71549916de4..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/apiserverinternal/install/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["install.go"], - importpath = "k8s.io/kubernetes/pkg/apis/apiserverinternal/install", - visibility = ["//visibility:public"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/apiserverinternal:go_default_library", - "//pkg/apis/apiserverinternal/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["roundtrip_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/apiserverinternal/fuzzer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/apitesting/roundtrip:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/apiserverinternal/v1alpha1/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/apiserverinternal/v1alpha1/BUILD deleted file mode 100644 index e3f714365a65..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/apiserverinternal/v1alpha1/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "zz_generated.conversion.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/apiserverinternal/v1alpha1", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/apiserverinternal:go_default_library", - "//staging/src/k8s.io/api/apiserverinternal/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/apiserverinternal/validation/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/apiserverinternal/validation/BUILD deleted file mode 100644 index f7e6cef73aba..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/apiserverinternal/validation/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["validation.go"], - importpath = "k8s.io/kubernetes/pkg/apis/apiserverinternal/validation", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/apiserverinternal:go_default_library", - "//pkg/apis/core/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["validation_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/apiserverinternal:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/apps/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/apps/BUILD deleted file mode 100644 index 0d4035331d68..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/apps/BUILD +++ /dev/null @@ -1,46 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/apps", - deps = [ - "//pkg/apis/autoscaling:go_default_library", - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/apis/apps/fuzzer:all-srcs", - "//pkg/apis/apps/install:all-srcs", - "//pkg/apis/apps/v1:all-srcs", - "//pkg/apis/apps/v1beta1:all-srcs", - "//pkg/apis/apps/v1beta2:all-srcs", - "//pkg/apis/apps/validation:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/apps/OWNERS b/vendor/k8s.io/kubernetes/pkg/apis/apps/OWNERS index 13db28cb0c00..031baa5e89f6 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/apps/OWNERS +++ b/vendor/k8s.io/kubernetes/pkg/apis/apps/OWNERS @@ -14,8 +14,6 @@ reviewers: - errordeveloper - mml - m1093782566 -- mbohlool - kevin-wangzefeng -- jianhuiz labels: - sig/apps diff --git a/vendor/k8s.io/kubernetes/pkg/apis/apps/install/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/apps/install/BUILD deleted file mode 100644 index 1baa04db245b..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/apps/install/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["install.go"], - importpath = "k8s.io/kubernetes/pkg/apis/apps/install", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/apps:go_default_library", - "//pkg/apis/apps/v1:go_default_library", - "//pkg/apis/apps/v1beta1:go_default_library", - "//pkg/apis/apps/v1beta2:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/apps/types.go b/vendor/k8s.io/kubernetes/pkg/apis/apps/types.go index c42ea2b62153..6866540baf08 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/apps/types.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/apps/types.go @@ -532,19 +532,41 @@ type RollingUpdateDaemonSet struct { // The maximum number of DaemonSet pods that can be unavailable during the // update. Value can be an absolute number (ex: 5) or a percentage of total // number of DaemonSet pods at the start of the update (ex: 10%). Absolute - // number is calculated from percentage by rounding up. - // This cannot be 0. + // number is calculated from percentage by rounding down to a minimum of one. + // This cannot be 0 if MaxSurge is 0 // Default value is 1. // Example: when this is set to 30%, at most 30% of the total number of nodes // that should be running the daemon pod (i.e. status.desiredNumberScheduled) - // can have their pods stopped for an update at any given - // time. The update starts by stopping at most 30% of those DaemonSet pods - // and then brings up new DaemonSet pods in their place. Once the new pods - // are available, it then proceeds onto other DaemonSet pods, thus ensuring - // that at least 70% of original number of DaemonSet pods are available at - // all times during the update. + // can have their pods stopped for an update at any given time. The update + // starts by stopping at most 30% of those DaemonSet pods and then brings + // up new DaemonSet pods in their place. Once the new pods are available, + // it then proceeds onto other DaemonSet pods, thus ensuring that at least + // 70% of original number of DaemonSet pods are available at all times during + // the update. // +optional MaxUnavailable intstr.IntOrString + + // The maximum number of nodes with an existing available DaemonSet pod that + // can have an updated DaemonSet pod during during an update. + // Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). + // This can not be 0 if MaxUnavailable is 0. + // Absolute number is calculated from percentage by rounding up to a minimum of 1. + // Default value is 0. + // Example: when this is set to 30%, at most 30% of the total number of nodes + // that should be running the daemon pod (i.e. status.desiredNumberScheduled) + // can have their a new pod created before the old pod is marked as deleted. + // The update starts by launching new pods on 30% of nodes. Once an updated + // pod is available (Ready for at least minReadySeconds) the old DaemonSet pod + // on that node is marked deleted. If the old pod becomes unavailable for any + // reason (Ready transitions to false, is evicted, or is drained) an updated + // pod is immediatedly created on that node without considering surge limits. + // Allowing surge implies the possibility that the resources consumed by the + // daemonset on any given node can double if the readiness check fails, and + // so resource intensive daemonsets should take into account that they may + // cause evictions during disruption. + // This is an alpha field and requires enabling DaemonSetUpdateSurge feature gate. + // +optional + MaxSurge intstr.IntOrString } // DaemonSetSpec is the specification of a daemon set. diff --git a/vendor/k8s.io/kubernetes/pkg/apis/apps/v1/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/apps/v1/BUILD deleted file mode 100644 index 852490223ea5..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/apps/v1/BUILD +++ /dev/null @@ -1,65 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "defaults.go", - "doc.go", - "register.go", - "zz_generated.conversion.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/apps/v1", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/apps:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/v1:go_default_library", - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "conversion_test.go", - "defaults_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/apps:go_default_library", - "//pkg/apis/apps/install:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/install:go_default_library", - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/apps/v1/defaults.go b/vendor/k8s.io/kubernetes/pkg/apis/apps/v1/defaults.go index 964c34d51beb..8b3a0e9882ef 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/apps/v1/defaults.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/apps/v1/defaults.go @@ -84,6 +84,11 @@ func SetDefaults_DaemonSet(obj *appsv1.DaemonSet) { maxUnavailable := intstr.FromInt(1) updateStrategy.RollingUpdate.MaxUnavailable = &maxUnavailable } + if updateStrategy.RollingUpdate.MaxSurge == nil { + // Set default MaxSurge as 0 by default. + maxSurge := intstr.FromInt(0) + updateStrategy.RollingUpdate.MaxSurge = &maxSurge + } } if obj.Spec.RevisionHistoryLimit == nil { obj.Spec.RevisionHistoryLimit = new(int32) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/apps/v1/zz_generated.conversion.go b/vendor/k8s.io/kubernetes/pkg/apis/apps/v1/zz_generated.conversion.go index bc63ff526a72..78cc6d01ef0a 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/apps/v1/zz_generated.conversion.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/apps/v1/zz_generated.conversion.go @@ -971,6 +971,9 @@ func autoConvert_v1_RollingUpdateDaemonSet_To_apps_RollingUpdateDaemonSet(in *v1 if err := metav1.Convert_Pointer_intstr_IntOrString_To_intstr_IntOrString(&in.MaxUnavailable, &out.MaxUnavailable, s); err != nil { return err } + if err := metav1.Convert_Pointer_intstr_IntOrString_To_intstr_IntOrString(&in.MaxSurge, &out.MaxSurge, s); err != nil { + return err + } return nil } @@ -983,6 +986,9 @@ func autoConvert_apps_RollingUpdateDaemonSet_To_v1_RollingUpdateDaemonSet(in *ap if err := metav1.Convert_intstr_IntOrString_To_Pointer_intstr_IntOrString(&in.MaxUnavailable, &out.MaxUnavailable, s); err != nil { return err } + if err := metav1.Convert_intstr_IntOrString_To_Pointer_intstr_IntOrString(&in.MaxSurge, &out.MaxSurge, s); err != nil { + return err + } return nil } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/apps/v1/zz_generated.defaults.go b/vendor/k8s.io/kubernetes/pkg/apis/apps/v1/zz_generated.defaults.go index 58a99f3f6b6d..80dba3b79469 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/apps/v1/zz_generated.defaults.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/apps/v1/zz_generated.defaults.go @@ -21,8 +21,6 @@ limitations under the License. package v1 import ( - "reflect" - v1 "k8s.io/api/apps/v1" runtime "k8s.io/apimachinery/pkg/runtime" corev1 "k8s.io/kubernetes/pkg/apis/core/v1" @@ -109,7 +107,7 @@ func SetObjectDefaults_DaemonSet(in *v1.DaemonSet) { corev1.SetDefaults_Container(a) for j := range a.Ports { b := &a.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -159,7 +157,7 @@ func SetObjectDefaults_DaemonSet(in *v1.DaemonSet) { corev1.SetDefaults_Container(a) for j := range a.Ports { b := &a.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -209,7 +207,7 @@ func SetObjectDefaults_DaemonSet(in *v1.DaemonSet) { corev1.SetDefaults_EphemeralContainer(a) for j := range a.EphemeralContainerCommon.Ports { b := &a.EphemeralContainerCommon.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -330,7 +328,7 @@ func SetObjectDefaults_Deployment(in *v1.Deployment) { corev1.SetDefaults_Container(a) for j := range a.Ports { b := &a.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -380,7 +378,7 @@ func SetObjectDefaults_Deployment(in *v1.Deployment) { corev1.SetDefaults_Container(a) for j := range a.Ports { b := &a.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -430,7 +428,7 @@ func SetObjectDefaults_Deployment(in *v1.Deployment) { corev1.SetDefaults_EphemeralContainer(a) for j := range a.EphemeralContainerCommon.Ports { b := &a.EphemeralContainerCommon.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -551,7 +549,7 @@ func SetObjectDefaults_ReplicaSet(in *v1.ReplicaSet) { corev1.SetDefaults_Container(a) for j := range a.Ports { b := &a.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -601,7 +599,7 @@ func SetObjectDefaults_ReplicaSet(in *v1.ReplicaSet) { corev1.SetDefaults_Container(a) for j := range a.Ports { b := &a.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -651,7 +649,7 @@ func SetObjectDefaults_ReplicaSet(in *v1.ReplicaSet) { corev1.SetDefaults_EphemeralContainer(a) for j := range a.EphemeralContainerCommon.Ports { b := &a.EphemeralContainerCommon.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -772,7 +770,7 @@ func SetObjectDefaults_StatefulSet(in *v1.StatefulSet) { corev1.SetDefaults_Container(a) for j := range a.Ports { b := &a.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -822,7 +820,7 @@ func SetObjectDefaults_StatefulSet(in *v1.StatefulSet) { corev1.SetDefaults_Container(a) for j := range a.Ports { b := &a.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -872,7 +870,7 @@ func SetObjectDefaults_StatefulSet(in *v1.StatefulSet) { corev1.SetDefaults_EphemeralContainer(a) for j := range a.EphemeralContainerCommon.Ports { b := &a.EphemeralContainerCommon.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta1/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta1/BUILD deleted file mode 100644 index a4110a88eca4..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta1/BUILD +++ /dev/null @@ -1,65 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "defaults.go", - "doc.go", - "register.go", - "zz_generated.conversion.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/apps/v1beta1", - deps = [ - "//pkg/apis/apps:go_default_library", - "//pkg/apis/autoscaling:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/v1:go_default_library", - "//staging/src/k8s.io/api/apps/v1beta1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["defaults_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/apps/install:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/install:go_default_library", - "//staging/src/k8s.io/api/apps/v1beta1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta1/zz_generated.defaults.go b/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta1/zz_generated.defaults.go index f248064ce3e4..01e84f4e4f86 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta1/zz_generated.defaults.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta1/zz_generated.defaults.go @@ -21,8 +21,6 @@ limitations under the License. package v1beta1 import ( - "reflect" - v1beta1 "k8s.io/api/apps/v1beta1" runtime "k8s.io/apimachinery/pkg/runtime" v1 "k8s.io/kubernetes/pkg/apis/core/v1" @@ -105,7 +103,7 @@ func SetObjectDefaults_Deployment(in *v1beta1.Deployment) { v1.SetDefaults_Container(a) for j := range a.Ports { b := &a.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -155,7 +153,7 @@ func SetObjectDefaults_Deployment(in *v1beta1.Deployment) { v1.SetDefaults_Container(a) for j := range a.Ports { b := &a.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -205,7 +203,7 @@ func SetObjectDefaults_Deployment(in *v1beta1.Deployment) { v1.SetDefaults_EphemeralContainer(a) for j := range a.EphemeralContainerCommon.Ports { b := &a.EphemeralContainerCommon.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -326,7 +324,7 @@ func SetObjectDefaults_StatefulSet(in *v1beta1.StatefulSet) { v1.SetDefaults_Container(a) for j := range a.Ports { b := &a.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -376,7 +374,7 @@ func SetObjectDefaults_StatefulSet(in *v1beta1.StatefulSet) { v1.SetDefaults_Container(a) for j := range a.Ports { b := &a.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -426,7 +424,7 @@ func SetObjectDefaults_StatefulSet(in *v1beta1.StatefulSet) { v1.SetDefaults_EphemeralContainer(a) for j := range a.EphemeralContainerCommon.Ports { b := &a.EphemeralContainerCommon.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta2/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta2/BUILD deleted file mode 100644 index 42a6b8191f47..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta2/BUILD +++ /dev/null @@ -1,72 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "defaults.go", - "doc.go", - "register.go", - "zz_generated.conversion.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/apps/v1beta2", - deps = [ - "//pkg/apis/apps:go_default_library", - "//pkg/apis/autoscaling:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/v1:go_default_library", - "//staging/src/k8s.io/api/apps/v1beta2:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = [ - "conversion_test.go", - "defaults_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/apps:go_default_library", - "//pkg/apis/apps/install:go_default_library", - "//pkg/apis/autoscaling:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/install:go_default_library", - "//staging/src/k8s.io/api/apps/v1beta2:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta2/defaults.go b/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta2/defaults.go index c93db681dadd..f42b021b04e8 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta2/defaults.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta2/defaults.go @@ -41,6 +41,11 @@ func SetDefaults_DaemonSet(obj *appsv1beta2.DaemonSet) { maxUnavailable := intstr.FromInt(1) updateStrategy.RollingUpdate.MaxUnavailable = &maxUnavailable } + if updateStrategy.RollingUpdate.MaxSurge == nil { + // Set default MaxSurge as 0 by default. + maxSurge := intstr.FromInt(0) + updateStrategy.RollingUpdate.MaxSurge = &maxSurge + } } if obj.Spec.RevisionHistoryLimit == nil { obj.Spec.RevisionHistoryLimit = new(int32) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta2/zz_generated.conversion.go b/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta2/zz_generated.conversion.go index 22944e280789..ac17f192daed 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta2/zz_generated.conversion.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta2/zz_generated.conversion.go @@ -1002,6 +1002,9 @@ func autoConvert_v1beta2_RollingUpdateDaemonSet_To_apps_RollingUpdateDaemonSet(i if err := metav1.Convert_Pointer_intstr_IntOrString_To_intstr_IntOrString(&in.MaxUnavailable, &out.MaxUnavailable, s); err != nil { return err } + if err := metav1.Convert_Pointer_intstr_IntOrString_To_intstr_IntOrString(&in.MaxSurge, &out.MaxSurge, s); err != nil { + return err + } return nil } @@ -1014,6 +1017,9 @@ func autoConvert_apps_RollingUpdateDaemonSet_To_v1beta2_RollingUpdateDaemonSet(i if err := metav1.Convert_intstr_IntOrString_To_Pointer_intstr_IntOrString(&in.MaxUnavailable, &out.MaxUnavailable, s); err != nil { return err } + if err := metav1.Convert_intstr_IntOrString_To_Pointer_intstr_IntOrString(&in.MaxSurge, &out.MaxSurge, s); err != nil { + return err + } return nil } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta2/zz_generated.defaults.go b/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta2/zz_generated.defaults.go index ffabe5f60e71..76d66940c799 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta2/zz_generated.defaults.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta2/zz_generated.defaults.go @@ -21,8 +21,6 @@ limitations under the License. package v1beta2 import ( - "reflect" - v1beta2 "k8s.io/api/apps/v1beta2" runtime "k8s.io/apimachinery/pkg/runtime" v1 "k8s.io/kubernetes/pkg/apis/core/v1" @@ -109,7 +107,7 @@ func SetObjectDefaults_DaemonSet(in *v1beta2.DaemonSet) { v1.SetDefaults_Container(a) for j := range a.Ports { b := &a.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -159,7 +157,7 @@ func SetObjectDefaults_DaemonSet(in *v1beta2.DaemonSet) { v1.SetDefaults_Container(a) for j := range a.Ports { b := &a.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -209,7 +207,7 @@ func SetObjectDefaults_DaemonSet(in *v1beta2.DaemonSet) { v1.SetDefaults_EphemeralContainer(a) for j := range a.EphemeralContainerCommon.Ports { b := &a.EphemeralContainerCommon.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -330,7 +328,7 @@ func SetObjectDefaults_Deployment(in *v1beta2.Deployment) { v1.SetDefaults_Container(a) for j := range a.Ports { b := &a.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -380,7 +378,7 @@ func SetObjectDefaults_Deployment(in *v1beta2.Deployment) { v1.SetDefaults_Container(a) for j := range a.Ports { b := &a.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -430,7 +428,7 @@ func SetObjectDefaults_Deployment(in *v1beta2.Deployment) { v1.SetDefaults_EphemeralContainer(a) for j := range a.EphemeralContainerCommon.Ports { b := &a.EphemeralContainerCommon.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -551,7 +549,7 @@ func SetObjectDefaults_ReplicaSet(in *v1beta2.ReplicaSet) { v1.SetDefaults_Container(a) for j := range a.Ports { b := &a.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -601,7 +599,7 @@ func SetObjectDefaults_ReplicaSet(in *v1beta2.ReplicaSet) { v1.SetDefaults_Container(a) for j := range a.Ports { b := &a.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -651,7 +649,7 @@ func SetObjectDefaults_ReplicaSet(in *v1beta2.ReplicaSet) { v1.SetDefaults_EphemeralContainer(a) for j := range a.EphemeralContainerCommon.Ports { b := &a.EphemeralContainerCommon.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -772,7 +770,7 @@ func SetObjectDefaults_StatefulSet(in *v1beta2.StatefulSet) { v1.SetDefaults_Container(a) for j := range a.Ports { b := &a.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -822,7 +820,7 @@ func SetObjectDefaults_StatefulSet(in *v1beta2.StatefulSet) { v1.SetDefaults_Container(a) for j := range a.Ports { b := &a.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -872,7 +870,7 @@ func SetObjectDefaults_StatefulSet(in *v1beta2.StatefulSet) { v1.SetDefaults_EphemeralContainer(a) for j := range a.EphemeralContainerCommon.Ports { b := &a.EphemeralContainerCommon.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/apps/validation/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/apps/validation/BUILD deleted file mode 100644 index b6967f8b7965..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/apps/validation/BUILD +++ /dev/null @@ -1,58 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["validation.go"], - importpath = "k8s.io/kubernetes/pkg/apis/apps/validation", - deps = [ - "//pkg/apis/apps:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["validation_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/apps:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/validation:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - "//vendor/github.com/davecgh/go-spew/spew:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/apps/validation/validation.go b/vendor/k8s.io/kubernetes/pkg/apis/apps/validation/validation.go index e297c8a75b90..ab68809bf0f8 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/apps/validation/validation.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/apps/validation/validation.go @@ -28,9 +28,11 @@ import ( "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/apimachinery/pkg/util/validation" "k8s.io/apimachinery/pkg/util/validation/field" + utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/kubernetes/pkg/apis/apps" api "k8s.io/kubernetes/pkg/apis/core" apivalidation "k8s.io/kubernetes/pkg/apis/core/validation" + "k8s.io/kubernetes/pkg/features" ) // ValidateStatefulSetName can be used to check whether the given StatefulSet name is valid. @@ -44,7 +46,7 @@ func ValidateStatefulSetName(name string, prefix bool) []string { } // ValidatePodTemplateSpecForStatefulSet validates the given template and ensures that it is in accordance with the desired selector. -func ValidatePodTemplateSpecForStatefulSet(template *api.PodTemplateSpec, selector labels.Selector, fldPath *field.Path) field.ErrorList { +func ValidatePodTemplateSpecForStatefulSet(template *api.PodTemplateSpec, selector labels.Selector, fldPath *field.Path, opts apivalidation.PodValidationOptions) field.ErrorList { allErrs := field.ErrorList{} if template == nil { allErrs = append(allErrs, field.Required(fldPath, "")) @@ -62,13 +64,13 @@ func ValidatePodTemplateSpecForStatefulSet(template *api.PodTemplateSpec, select // allErrs = append(allErrs, apivalidation.ValidatePodTemplateSpec(template, fldPath)...) allErrs = append(allErrs, unversionedvalidation.ValidateLabels(template.Labels, fldPath.Child("labels"))...) allErrs = append(allErrs, apivalidation.ValidateAnnotations(template.Annotations, fldPath.Child("annotations"))...) - allErrs = append(allErrs, apivalidation.ValidatePodSpecificAnnotations(template.Annotations, &template.Spec, fldPath.Child("annotations"))...) + allErrs = append(allErrs, apivalidation.ValidatePodSpecificAnnotations(template.Annotations, &template.Spec, fldPath.Child("annotations"), opts)...) } return allErrs } // ValidateStatefulSetSpec tests if required fields in the StatefulSet spec are set. -func ValidateStatefulSetSpec(spec *apps.StatefulSetSpec, fldPath *field.Path) field.ErrorList { +func ValidateStatefulSetSpec(spec *apps.StatefulSetSpec, fldPath *field.Path, opts apivalidation.PodValidationOptions) field.ErrorList { allErrs := field.ErrorList{} switch spec.PodManagementPolicy { @@ -120,7 +122,7 @@ func ValidateStatefulSetSpec(spec *apps.StatefulSetSpec, fldPath *field.Path) fi if err != nil { allErrs = append(allErrs, field.Invalid(fldPath.Child("selector"), spec.Selector, "")) } else { - allErrs = append(allErrs, ValidatePodTemplateSpecForStatefulSet(&spec.Template, selector, fldPath.Child("template"))...) + allErrs = append(allErrs, ValidatePodTemplateSpecForStatefulSet(&spec.Template, selector, fldPath.Child("template"), opts)...) } if spec.Template.Spec.RestartPolicy != api.RestartPolicyAlways { @@ -134,9 +136,9 @@ func ValidateStatefulSetSpec(spec *apps.StatefulSetSpec, fldPath *field.Path) fi } // ValidateStatefulSet validates a StatefulSet. -func ValidateStatefulSet(statefulSet *apps.StatefulSet) field.ErrorList { +func ValidateStatefulSet(statefulSet *apps.StatefulSet, opts apivalidation.PodValidationOptions) field.ErrorList { allErrs := apivalidation.ValidateObjectMeta(&statefulSet.ObjectMeta, true, ValidateStatefulSetName, field.NewPath("metadata")) - allErrs = append(allErrs, ValidateStatefulSetSpec(&statefulSet.Spec, field.NewPath("spec"))...) + allErrs = append(allErrs, ValidateStatefulSetSpec(&statefulSet.Spec, field.NewPath("spec"), opts)...) return allErrs } @@ -144,21 +146,15 @@ func ValidateStatefulSet(statefulSet *apps.StatefulSet) field.ErrorList { func ValidateStatefulSetUpdate(statefulSet, oldStatefulSet *apps.StatefulSet) field.ErrorList { allErrs := apivalidation.ValidateObjectMetaUpdate(&statefulSet.ObjectMeta, &oldStatefulSet.ObjectMeta, field.NewPath("metadata")) - restoreReplicas := statefulSet.Spec.Replicas - statefulSet.Spec.Replicas = oldStatefulSet.Spec.Replicas - - restoreTemplate := statefulSet.Spec.Template - statefulSet.Spec.Template = oldStatefulSet.Spec.Template - - restoreStrategy := statefulSet.Spec.UpdateStrategy - statefulSet.Spec.UpdateStrategy = oldStatefulSet.Spec.UpdateStrategy - - if !apiequality.Semantic.DeepEqual(statefulSet.Spec, oldStatefulSet.Spec) { + // statefulset updates aren't super common and general updates are likely to be touching spec, so we'll do this + // deep copy right away. This avoids mutating our inputs + newStatefulSetClone := statefulSet.DeepCopy() + newStatefulSetClone.Spec.Replicas = oldStatefulSet.Spec.Replicas // +k8s:verify-mutation:reason=clone + newStatefulSetClone.Spec.Template = oldStatefulSet.Spec.Template // +k8s:verify-mutation:reason=clone + newStatefulSetClone.Spec.UpdateStrategy = oldStatefulSet.Spec.UpdateStrategy // +k8s:verify-mutation:reason=clone + if !apiequality.Semantic.DeepEqual(newStatefulSetClone.Spec, oldStatefulSet.Spec) { allErrs = append(allErrs, field.Forbidden(field.NewPath("spec"), "updates to statefulset spec for fields other than 'replicas', 'template', and 'updateStrategy' are forbidden")) } - statefulSet.Spec.Replicas = restoreReplicas - statefulSet.Spec.Template = restoreTemplate - statefulSet.Spec.UpdateStrategy = restoreStrategy allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(statefulSet.Spec.Replicas), field.NewPath("spec", "replicas"))...) return allErrs @@ -343,14 +339,35 @@ func ValidateDaemonSetSpec(spec *apps.DaemonSetSpec, fldPath *field.Path, opts a // ValidateRollingUpdateDaemonSet validates a given RollingUpdateDaemonSet. func ValidateRollingUpdateDaemonSet(rollingUpdate *apps.RollingUpdateDaemonSet, fldPath *field.Path) field.ErrorList { - allErrs := field.ErrorList{} - allErrs = append(allErrs, ValidatePositiveIntOrPercent(rollingUpdate.MaxUnavailable, fldPath.Child("maxUnavailable"))...) - if getIntOrPercentValue(rollingUpdate.MaxUnavailable) == 0 { - // MaxUnavailable cannot be 0. - allErrs = append(allErrs, field.Invalid(fldPath.Child("maxUnavailable"), rollingUpdate.MaxUnavailable, "cannot be 0")) + var allErrs field.ErrorList + if utilfeature.DefaultFeatureGate.Enabled(features.DaemonSetUpdateSurge) { + // Validate both fields are positive ints or have a percentage value + allErrs = append(allErrs, ValidatePositiveIntOrPercent(rollingUpdate.MaxUnavailable, fldPath.Child("maxUnavailable"))...) + allErrs = append(allErrs, ValidatePositiveIntOrPercent(rollingUpdate.MaxSurge, fldPath.Child("maxSurge"))...) + + // Validate that MaxUnavailable and MaxSurge are not more than 100%. + allErrs = append(allErrs, IsNotMoreThan100Percent(rollingUpdate.MaxUnavailable, fldPath.Child("maxUnavailable"))...) + allErrs = append(allErrs, IsNotMoreThan100Percent(rollingUpdate.MaxSurge, fldPath.Child("maxSurge"))...) + + // Validate exactly one of MaxSurge or MaxUnavailable is non-zero + hasUnavailable := getIntOrPercentValue(rollingUpdate.MaxUnavailable) != 0 + hasSurge := getIntOrPercentValue(rollingUpdate.MaxSurge) != 0 + switch { + case hasUnavailable && hasSurge: + allErrs = append(allErrs, field.Invalid(fldPath.Child("maxSurge"), rollingUpdate.MaxSurge, "may not be set when maxUnavailable is non-zero")) + case !hasUnavailable && !hasSurge: + allErrs = append(allErrs, field.Required(fldPath.Child("maxUnavailable"), "cannot be 0 when maxSurge is 0")) + } + + } else { + allErrs = append(allErrs, ValidatePositiveIntOrPercent(rollingUpdate.MaxUnavailable, fldPath.Child("maxUnavailable"))...) + if getIntOrPercentValue(rollingUpdate.MaxUnavailable) == 0 { + // MaxUnavailable cannot be 0. + allErrs = append(allErrs, field.Invalid(fldPath.Child("maxUnavailable"), rollingUpdate.MaxUnavailable, "cannot be 0")) + } + // Validate that MaxUnavailable is not more than 100%. + allErrs = append(allErrs, IsNotMoreThan100Percent(rollingUpdate.MaxUnavailable, fldPath.Child("maxUnavailable"))...) } - // Validate that MaxUnavailable is not more than 100%. - allErrs = append(allErrs, IsNotMoreThan100Percent(rollingUpdate.MaxUnavailable, fldPath.Child("maxUnavailable"))...) return allErrs } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/apps/zz_generated.deepcopy.go b/vendor/k8s.io/kubernetes/pkg/apis/apps/zz_generated.deepcopy.go index deda2e6234ad..ff11b8fb2649 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/apps/zz_generated.deepcopy.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/apps/zz_generated.deepcopy.go @@ -585,6 +585,7 @@ func (in *RollbackConfig) DeepCopy() *RollbackConfig { func (in *RollingUpdateDaemonSet) DeepCopyInto(out *RollingUpdateDaemonSet) { *out = *in out.MaxUnavailable = in.MaxUnavailable + out.MaxSurge = in.MaxSurge return } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/authentication/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/authentication/BUILD deleted file mode 100644 index 20f2f9b10089..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/authentication/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/authentication", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/apis/authentication/fuzzer:all-srcs", - "//pkg/apis/authentication/install:all-srcs", - "//pkg/apis/authentication/v1:all-srcs", - "//pkg/apis/authentication/v1beta1:all-srcs", - "//pkg/apis/authentication/validation:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/authentication/install/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/authentication/install/BUILD deleted file mode 100644 index 5df2ab6412c3..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/authentication/install/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["install.go"], - importpath = "k8s.io/kubernetes/pkg/apis/authentication/install", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/authentication:go_default_library", - "//pkg/apis/authentication/v1:go_default_library", - "//pkg/apis/authentication/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/authentication/v1/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/authentication/v1/BUILD deleted file mode 100644 index 44752904f9b2..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/authentication/v1/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "defaults.go", - "doc.go", - "register.go", - "zz_generated.conversion.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/authentication/v1", - deps = [ - "//pkg/apis/authentication:go_default_library", - "//staging/src/k8s.io/api/authentication/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/authentication/v1beta1/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/authentication/v1beta1/BUILD deleted file mode 100644 index 96b0fb0f664d..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/authentication/v1beta1/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "defaults.go", - "doc.go", - "register.go", - "zz_generated.conversion.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/authentication/v1beta1", - deps = [ - "//pkg/apis/authentication:go_default_library", - "//staging/src/k8s.io/api/authentication/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/authentication/validation/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/authentication/validation/BUILD deleted file mode 100644 index 427169f9bc59..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/authentication/validation/BUILD +++ /dev/null @@ -1,26 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["validation.go"], - importpath = "k8s.io/kubernetes/pkg/apis/authentication/validation", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/authentication:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/authorization/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/authorization/BUILD deleted file mode 100644 index 92df2653c9b8..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/authorization/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/authorization", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/apis/authorization/fuzzer:all-srcs", - "//pkg/apis/authorization/install:all-srcs", - "//pkg/apis/authorization/v1:all-srcs", - "//pkg/apis/authorization/v1beta1:all-srcs", - "//pkg/apis/authorization/validation:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/authorization/install/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/authorization/install/BUILD deleted file mode 100644 index 00e0cfd3eea3..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/authorization/install/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["install.go"], - importpath = "k8s.io/kubernetes/pkg/apis/authorization/install", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/authorization:go_default_library", - "//pkg/apis/authorization/v1:go_default_library", - "//pkg/apis/authorization/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/authorization/v1/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/authorization/v1/BUILD deleted file mode 100644 index a0bec4599c03..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/authorization/v1/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "defaults.go", - "doc.go", - "register.go", - "zz_generated.conversion.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/authorization/v1", - deps = [ - "//pkg/apis/authorization:go_default_library", - "//staging/src/k8s.io/api/authorization/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/authorization/v1beta1/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/authorization/v1beta1/BUILD deleted file mode 100644 index 210a92b0c9bc..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/authorization/v1beta1/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "defaults.go", - "doc.go", - "register.go", - "zz_generated.conversion.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/authorization/v1beta1", - deps = [ - "//pkg/apis/authorization:go_default_library", - "//staging/src/k8s.io/api/authorization/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/authorization/validation/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/authorization/validation/BUILD deleted file mode 100644 index c21cbab34716..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/authorization/validation/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["validation.go"], - importpath = "k8s.io/kubernetes/pkg/apis/authorization/validation", - deps = [ - "//pkg/apis/authorization:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["validation_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/authorization:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/BUILD deleted file mode 100644 index 34f9e875bad6..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/BUILD +++ /dev/null @@ -1,47 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "annotations.go", - "doc.go", - "helpers.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/autoscaling", - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/apis/autoscaling/fuzzer:all-srcs", - "//pkg/apis/autoscaling/install:all-srcs", - "//pkg/apis/autoscaling/v1:all-srcs", - "//pkg/apis/autoscaling/v2beta1:all-srcs", - "//pkg/apis/autoscaling/v2beta2:all-srcs", - "//pkg/apis/autoscaling/validation:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/OWNERS b/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/OWNERS index 08814e0eb3e8..9ba34848ccb2 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/OWNERS +++ b/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/OWNERS @@ -13,7 +13,4 @@ reviewers: - piosz - dims - errordeveloper -- madhusudancs - mml -- mbohlool -- jianhuiz diff --git a/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/install/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/install/BUILD deleted file mode 100644 index 31b1a56184fc..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/install/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["install.go"], - importpath = "k8s.io/kubernetes/pkg/apis/autoscaling/install", - visibility = ["//visibility:public"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/autoscaling:go_default_library", - "//pkg/apis/autoscaling/v1:go_default_library", - "//pkg/apis/autoscaling/v2beta1:go_default_library", - "//pkg/apis/autoscaling/v2beta2:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/v1/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/v1/BUILD deleted file mode 100644 index e33396d1412f..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/v1/BUILD +++ /dev/null @@ -1,56 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "defaults.go", - "doc.go", - "register.go", - "zz_generated.conversion.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/autoscaling/v1", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/autoscaling:go_default_library", - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["defaults_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/autoscaling:go_default_library", - "//pkg/apis/autoscaling/install:go_default_library", - "//pkg/apis/core/install:go_default_library", - "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/v1/conversion.go b/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/v1/conversion.go index 31187d6c5011..bf94d48ae17d 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/v1/conversion.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/v1/conversion.go @@ -362,6 +362,7 @@ func Convert_autoscaling_HorizontalPodAutoscaler_To_v1_HorizontalPodAutoscaler(i } // copy before mutating if !copiedAnnotations { + //nolint:ineffassign copiedAnnotations = true out.Annotations = autoscaling.DeepCopyStringMap(out.Annotations) } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/v2beta1/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/v2beta1/BUILD deleted file mode 100644 index 491d1e9e41b8..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/v2beta1/BUILD +++ /dev/null @@ -1,62 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "defaults.go", - "doc.go", - "register.go", - "zz_generated.conversion.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/autoscaling/v2beta1", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/autoscaling:go_default_library", - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/api/autoscaling/v2beta1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "conversion_test.go", - "defaults_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/autoscaling:go_default_library", - "//pkg/apis/autoscaling/install:go_default_library", - "//pkg/apis/core/install:go_default_library", - "//staging/src/k8s.io/api/autoscaling/v2beta1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/v2beta1/conversion.go b/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/v2beta1/conversion.go index 171b2af4248e..513b41a2a3ee 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/v2beta1/conversion.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/v2beta1/conversion.go @@ -299,6 +299,7 @@ func Convert_autoscaling_HorizontalPodAutoscaler_To_v2beta1_HorizontalPodAutosca } // copy before mutating if !copiedAnnotations { + //nolint:ineffassign copiedAnnotations = true out.Annotations = autoscaling.DeepCopyStringMap(out.Annotations) } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/v2beta2/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/v2beta2/BUILD deleted file mode 100644 index 3c6694e297e8..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/v2beta2/BUILD +++ /dev/null @@ -1,58 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "defaults.go", - "doc.go", - "register.go", - "zz_generated.conversion.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/autoscaling/v2beta2", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/autoscaling:go_default_library", - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/api/autoscaling/v2beta2:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["defaults_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/autoscaling:go_default_library", - "//pkg/apis/autoscaling/install:go_default_library", - "//pkg/apis/core/install:go_default_library", - "//staging/src/k8s.io/api/autoscaling/v2beta2:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/validation/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/validation/BUILD deleted file mode 100644 index 9ca8db12a9ce..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/validation/BUILD +++ /dev/null @@ -1,53 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["validation.go"], - importpath = "k8s.io/kubernetes/pkg/apis/autoscaling/validation", - deps = [ - "//pkg/apis/autoscaling:go_default_library", - "//pkg/apis/core/v1/validation:go_default_library", - "//pkg/apis/core/validation:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/validation/path:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["validation_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/autoscaling:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/batch/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/batch/BUILD deleted file mode 100644 index b6157e8f8568..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/batch/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/batch", - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/apis/batch/fuzzer:all-srcs", - "//pkg/apis/batch/install:all-srcs", - "//pkg/apis/batch/v1:all-srcs", - "//pkg/apis/batch/v1beta1:all-srcs", - "//pkg/apis/batch/v2alpha1:all-srcs", - "//pkg/apis/batch/validation:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/batch/OWNERS b/vendor/k8s.io/kubernetes/pkg/apis/batch/OWNERS index ea5e31b74d09..7cacfce5f1ab 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/batch/OWNERS +++ b/vendor/k8s.io/kubernetes/pkg/apis/batch/OWNERS @@ -15,7 +15,5 @@ reviewers: - dims - errordeveloper - mml -- mbohlool -- jianhuiz labels: - sig/apps diff --git a/vendor/k8s.io/kubernetes/pkg/apis/batch/install/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/batch/install/BUILD deleted file mode 100644 index ce964905c7a0..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/batch/install/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["install.go"], - importpath = "k8s.io/kubernetes/pkg/apis/batch/install", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/batch:go_default_library", - "//pkg/apis/batch/v1:go_default_library", - "//pkg/apis/batch/v1beta1:go_default_library", - "//pkg/apis/batch/v2alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/batch/install/install.go b/vendor/k8s.io/kubernetes/pkg/apis/batch/install/install.go index c87c186cc402..8d2d0d7824a0 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/batch/install/install.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/batch/install/install.go @@ -25,7 +25,6 @@ import ( "k8s.io/kubernetes/pkg/apis/batch" "k8s.io/kubernetes/pkg/apis/batch/v1" "k8s.io/kubernetes/pkg/apis/batch/v1beta1" - "k8s.io/kubernetes/pkg/apis/batch/v2alpha1" ) func init() { @@ -37,6 +36,5 @@ func Install(scheme *runtime.Scheme) { utilruntime.Must(batch.AddToScheme(scheme)) utilruntime.Must(v1.AddToScheme(scheme)) utilruntime.Must(v1beta1.AddToScheme(scheme)) - utilruntime.Must(v2alpha1.AddToScheme(scheme)) - utilruntime.Must(scheme.SetVersionPriority(v1.SchemeGroupVersion, v1beta1.SchemeGroupVersion, v2alpha1.SchemeGroupVersion)) + utilruntime.Must(scheme.SetVersionPriority(v1.SchemeGroupVersion, v1beta1.SchemeGroupVersion)) } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/batch/types.go b/vendor/k8s.io/kubernetes/pkg/apis/batch/types.go index 396f6429a94c..29a49f9e0d3e 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/batch/types.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/batch/types.go @@ -85,6 +85,22 @@ type JobTemplateSpec struct { Spec JobSpec } +// CompletionMode specifies how Pod completions of a Job are tracked. +type CompletionMode string + +const ( + // NonIndexedCompletion is a Job completion mode. In this mode, the Job is + // considered complete when there have been .spec.completions + // successfully completed Pods. Pod completions are homologous to each other. + NonIndexedCompletion CompletionMode = "NonIndexed" + + // IndexedCompletion is a Job completion mode. In this mode, the Pods of a + // Job get an associated completion index from 0 to (.spec.completions - 1). + // The Job is considered complete when a Pod completes for each completion + // index. + IndexedCompletion CompletionMode = "Indexed" +) + // JobSpec describes how the job execution will look like. type JobSpec struct { @@ -103,8 +119,11 @@ type JobSpec struct { // +optional Completions *int32 - // Optional duration in seconds relative to the startTime that the job may be active - // before the system tries to terminate it; value must be positive integer + // Specifies the duration in seconds relative to the startTime that the job + // may be continuously active before the system tries to terminate it; value + // must be positive integer. If a Job is suspended (at creation or through an + // update), this timer will effectively be stopped and reset when the Job is + // resumed again. // +optional ActiveDeadlineSeconds *int64 @@ -149,19 +168,58 @@ type JobSpec struct { // TTLAfterFinished feature. // +optional TTLSecondsAfterFinished *int32 + + // CompletionMode specifies how Pod completions are tracked. It can be + // `NonIndexed` (default) or `Indexed`. + // + // `NonIndexed` means that the Job is considered complete when there have + // been .spec.completions successfully completed Pods. Each Pod completion is + // homologous to each other. + // + // `Indexed` means that the Pods of a + // Job get an associated completion index from 0 to (.spec.completions - 1), + // available in the annotation batch.kubernetes.io/job-completion-index. + // The Job is considered complete when there is one successfully completed Pod + // for each index. + // When value is `Indexed`, .spec.completions must be specified and + // `.spec.parallelism` must be less than or equal to 10^5. + // + // This field is alpha-level and is only honored by servers that enable the + // IndexedJob feature gate. More completion modes can be added in the future. + // If the Job controller observes a mode that it doesn't recognize, the + // controller skips updates for the Job. + // +optional + CompletionMode *CompletionMode + + // Suspend specifies whether the Job controller should create Pods or not. If + // a Job is created with suspend set to true, no Pods are created by the Job + // controller. If a Job is suspended after creation (i.e. the flag goes from + // false to true), the Job controller will delete all active Pods associated + // with this Job. Users must design their workload to gracefully handle this. + // Suspending a Job will reset the StartTime field of the Job, effectively + // resetting the ActiveDeadlineSeconds timer too. This is an alpha field and + // requires the SuspendJob feature gate to be enabled; otherwise this field + // may not be set to true. Defaults to false. + // +optional + Suspend *bool } // JobStatus represents the current state of a Job. type JobStatus struct { - // The latest available observations of an object's current state. - // When a job fails, one of the conditions will have type == "Failed". + // The latest available observations of an object's current state. When a Job + // fails, one of the conditions will have type "Failed" and status true. When + // a Job is suspended, one of the conditions will have type "Suspended" and + // status true; when the Job is resumed, the status of this condition will + // become false. When a Job is completed, one of the conditions will have + // type "Complete" and status true. // +optional Conditions []JobCondition - // Represents time when the job was acknowledged by the job controller. - // It is not guaranteed to be set in happens-before order across separate operations. - // It is represented in RFC3339 form and is in UTC. + // Represents time when the job controller started processing a job. When a + // Job is created in the suspended state, this field is not set until the + // first time it is resumed. This field is reset every time a Job is resumed + // from suspension. It is represented in RFC3339 form and is in UTC. // +optional StartTime *metav1.Time @@ -183,6 +241,16 @@ type JobStatus struct { // The number of pods which reached phase Failed. // +optional Failed int32 + + // CompletedIndexes holds the completed indexes when .spec.completionMode = + // "Indexed" in a text format. The indexes are represented as decimal integers + // separated by commas. The numbers are listed in increasing order. Three or + // more consecutive numbers are compressed and represented by the first and + // last element of the series, separated by a hyphen. + // For example, if the completed indexes are 1, 3, 4, 5 and 7, they are + // represented as "1,3-5,7". + // +optional + CompletedIndexes string } // JobConditionType is a valid value for JobCondition.Type @@ -190,6 +258,8 @@ type JobConditionType string // These are valid conditions of a job. const ( + // JobSuspended means the job has been suspended. + JobSuspended JobConditionType = "Suspended" // JobComplete means the job has completed its execution. JobComplete JobConditionType = "Complete" // JobFailed means the job has failed its execution. @@ -198,7 +268,7 @@ const ( // JobCondition describes current state of a job. type JobCondition struct { - // Type of job condition, Complete or Failed. + // Type of job condition. Type JobConditionType // Status of the condition, one of True, False, Unknown. Status api.ConditionStatus @@ -271,7 +341,7 @@ type CronJobSpec struct { ConcurrencyPolicy ConcurrencyPolicy // This flag tells the controller to suspend subsequent executions, it does - // not apply to already started executions. Defaults to false. + // not apply to already started executions. Defaults to false. // +optional Suspend *bool @@ -316,4 +386,8 @@ type CronJobStatus struct { // Information when was the last time the job was successfully scheduled. // +optional LastScheduleTime *metav1.Time + + // Information when was the last time the job successfully completed. + // +optional + LastSuccessfulTime *metav1.Time } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/batch/v1/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/batch/v1/BUILD deleted file mode 100644 index 20a1cd4907a7..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/batch/v1/BUILD +++ /dev/null @@ -1,60 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "defaults.go", - "doc.go", - "register.go", - "zz_generated.conversion.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/batch/v1", - deps = [ - "//pkg/apis/batch:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/v1:go_default_library", - "//staging/src/k8s.io/api/batch/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["defaults_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/batch/install:go_default_library", - "//pkg/apis/core/install:go_default_library", - "//staging/src/k8s.io/api/batch/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/batch/v1/conversion.go b/vendor/k8s.io/kubernetes/pkg/apis/batch/v1/conversion.go index 873876cbfc03..a3a581d41907 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/batch/v1/conversion.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/batch/v1/conversion.go @@ -19,12 +19,10 @@ package v1 import ( "fmt" - batchv1 "k8s.io/api/batch/v1" - + v1 "k8s.io/api/batch/v1" "k8s.io/apimachinery/pkg/conversion" "k8s.io/apimachinery/pkg/runtime" "k8s.io/kubernetes/pkg/apis/batch" - k8s_api_v1 "k8s.io/kubernetes/pkg/apis/core/v1" ) func addConversionFuncs(scheme *runtime.Scheme) error { @@ -34,48 +32,18 @@ func addConversionFuncs(scheme *runtime.Scheme) error { case "metadata.name", "metadata.namespace", "status.successful": return label, value, nil default: - return "", "", fmt.Errorf("field label %q not supported for batchv1.Job", label) + return "", "", fmt.Errorf("field label %q not supported for Job", label) } - }, - ) + }) } -func Convert_batch_JobSpec_To_v1_JobSpec(in *batch.JobSpec, out *batchv1.JobSpec, s conversion.Scope) error { - out.Parallelism = in.Parallelism - out.Completions = in.Completions - out.ActiveDeadlineSeconds = in.ActiveDeadlineSeconds - out.BackoffLimit = in.BackoffLimit - out.TTLSecondsAfterFinished = in.TTLSecondsAfterFinished - out.Selector = in.Selector - if in.ManualSelector != nil { - out.ManualSelector = new(bool) - *out.ManualSelector = *in.ManualSelector - } else { - out.ManualSelector = nil - } +// The following functions don't do anything special, but they need to be added +// here due to the dependency of v1beta1 on v1. - if err := k8s_api_v1.Convert_core_PodTemplateSpec_To_v1_PodTemplateSpec(&in.Template, &out.Template, s); err != nil { - return err - } - return nil +func Convert_batch_JobSpec_To_v1_JobSpec(in *batch.JobSpec, out *v1.JobSpec, s conversion.Scope) error { + return autoConvert_batch_JobSpec_To_v1_JobSpec(in, out, s) } -func Convert_v1_JobSpec_To_batch_JobSpec(in *batchv1.JobSpec, out *batch.JobSpec, s conversion.Scope) error { - out.Parallelism = in.Parallelism - out.Completions = in.Completions - out.ActiveDeadlineSeconds = in.ActiveDeadlineSeconds - out.BackoffLimit = in.BackoffLimit - out.TTLSecondsAfterFinished = in.TTLSecondsAfterFinished - out.Selector = in.Selector - if in.ManualSelector != nil { - out.ManualSelector = new(bool) - *out.ManualSelector = *in.ManualSelector - } else { - out.ManualSelector = nil - } - - if err := k8s_api_v1.Convert_v1_PodTemplateSpec_To_core_PodTemplateSpec(&in.Template, &out.Template, s); err != nil { - return err - } - return nil +func Convert_v1_JobSpec_To_batch_JobSpec(in *v1.JobSpec, out *batch.JobSpec, s conversion.Scope) error { + return autoConvert_v1_JobSpec_To_batch_JobSpec(in, out, s) } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/batch/v1/defaults.go b/vendor/k8s.io/kubernetes/pkg/apis/batch/v1/defaults.go index 72e7e2a9d5bb..14a4c1aeeff3 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/batch/v1/defaults.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/batch/v1/defaults.go @@ -19,6 +19,9 @@ package v1 import ( batchv1 "k8s.io/api/batch/v1" "k8s.io/apimachinery/pkg/runtime" + utilfeature "k8s.io/apiserver/pkg/util/feature" + "k8s.io/kubernetes/pkg/features" + utilpointer "k8s.io/utils/pointer" ) func addDefaultingFuncs(scheme *runtime.Scheme) error { @@ -29,21 +32,39 @@ func SetDefaults_Job(obj *batchv1.Job) { // For a non-parallel job, you can leave both `.spec.completions` and // `.spec.parallelism` unset. When both are unset, both are defaulted to 1. if obj.Spec.Completions == nil && obj.Spec.Parallelism == nil { - obj.Spec.Completions = new(int32) - *obj.Spec.Completions = 1 - obj.Spec.Parallelism = new(int32) - *obj.Spec.Parallelism = 1 + obj.Spec.Completions = utilpointer.Int32Ptr(1) + obj.Spec.Parallelism = utilpointer.Int32Ptr(1) } if obj.Spec.Parallelism == nil { - obj.Spec.Parallelism = new(int32) - *obj.Spec.Parallelism = 1 + obj.Spec.Parallelism = utilpointer.Int32Ptr(1) } if obj.Spec.BackoffLimit == nil { - obj.Spec.BackoffLimit = new(int32) - *obj.Spec.BackoffLimit = 6 + obj.Spec.BackoffLimit = utilpointer.Int32Ptr(6) } labels := obj.Spec.Template.Labels if labels != nil && len(obj.Labels) == 0 { obj.Labels = labels } + if utilfeature.DefaultFeatureGate.Enabled(features.IndexedJob) && obj.Spec.CompletionMode == nil { + mode := batchv1.NonIndexedCompletion + obj.Spec.CompletionMode = &mode + } + if utilfeature.DefaultFeatureGate.Enabled(features.SuspendJob) && obj.Spec.Suspend == nil { + obj.Spec.Suspend = utilpointer.BoolPtr(false) + } +} + +func SetDefaults_CronJob(obj *batchv1.CronJob) { + if obj.Spec.ConcurrencyPolicy == "" { + obj.Spec.ConcurrencyPolicy = batchv1.AllowConcurrent + } + if obj.Spec.Suspend == nil { + obj.Spec.Suspend = utilpointer.BoolPtr(false) + } + if obj.Spec.SuccessfulJobsHistoryLimit == nil { + obj.Spec.SuccessfulJobsHistoryLimit = utilpointer.Int32Ptr(3) + } + if obj.Spec.FailedJobsHistoryLimit == nil { + obj.Spec.FailedJobsHistoryLimit = utilpointer.Int32Ptr(1) + } } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/batch/v1/zz_generated.conversion.go b/vendor/k8s.io/kubernetes/pkg/apis/batch/v1/zz_generated.conversion.go index 5b66fd3d6354..eb72b8b8087a 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/batch/v1/zz_generated.conversion.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/batch/v1/zz_generated.conversion.go @@ -40,6 +40,46 @@ func init() { // RegisterConversions adds conversion functions to the given scheme. // Public to allow building arbitrary schemes. func RegisterConversions(s *runtime.Scheme) error { + if err := s.AddGeneratedConversionFunc((*v1.CronJob)(nil), (*batch.CronJob)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_CronJob_To_batch_CronJob(a.(*v1.CronJob), b.(*batch.CronJob), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*batch.CronJob)(nil), (*v1.CronJob)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_batch_CronJob_To_v1_CronJob(a.(*batch.CronJob), b.(*v1.CronJob), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.CronJobList)(nil), (*batch.CronJobList)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_CronJobList_To_batch_CronJobList(a.(*v1.CronJobList), b.(*batch.CronJobList), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*batch.CronJobList)(nil), (*v1.CronJobList)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_batch_CronJobList_To_v1_CronJobList(a.(*batch.CronJobList), b.(*v1.CronJobList), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.CronJobSpec)(nil), (*batch.CronJobSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_CronJobSpec_To_batch_CronJobSpec(a.(*v1.CronJobSpec), b.(*batch.CronJobSpec), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*batch.CronJobSpec)(nil), (*v1.CronJobSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_batch_CronJobSpec_To_v1_CronJobSpec(a.(*batch.CronJobSpec), b.(*v1.CronJobSpec), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.CronJobStatus)(nil), (*batch.CronJobStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_CronJobStatus_To_batch_CronJobStatus(a.(*v1.CronJobStatus), b.(*batch.CronJobStatus), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*batch.CronJobStatus)(nil), (*v1.CronJobStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_batch_CronJobStatus_To_v1_CronJobStatus(a.(*batch.CronJobStatus), b.(*v1.CronJobStatus), scope) + }); err != nil { + return err + } if err := s.AddGeneratedConversionFunc((*v1.Job)(nil), (*batch.Job)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1_Job_To_batch_Job(a.(*v1.Job), b.(*batch.Job), scope) }); err != nil { @@ -80,6 +120,16 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddGeneratedConversionFunc((*v1.JobTemplateSpec)(nil), (*batch.JobTemplateSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_JobTemplateSpec_To_batch_JobTemplateSpec(a.(*v1.JobTemplateSpec), b.(*batch.JobTemplateSpec), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*batch.JobTemplateSpec)(nil), (*v1.JobTemplateSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_batch_JobTemplateSpec_To_v1_JobTemplateSpec(a.(*batch.JobTemplateSpec), b.(*v1.JobTemplateSpec), scope) + }); err != nil { + return err + } if err := s.AddConversionFunc((*batch.JobSpec)(nil), (*v1.JobSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_batch_JobSpec_To_v1_JobSpec(a.(*batch.JobSpec), b.(*v1.JobSpec), scope) }); err != nil { @@ -93,6 +143,140 @@ func RegisterConversions(s *runtime.Scheme) error { return nil } +func autoConvert_v1_CronJob_To_batch_CronJob(in *v1.CronJob, out *batch.CronJob, s conversion.Scope) error { + out.ObjectMeta = in.ObjectMeta + if err := Convert_v1_CronJobSpec_To_batch_CronJobSpec(&in.Spec, &out.Spec, s); err != nil { + return err + } + if err := Convert_v1_CronJobStatus_To_batch_CronJobStatus(&in.Status, &out.Status, s); err != nil { + return err + } + return nil +} + +// Convert_v1_CronJob_To_batch_CronJob is an autogenerated conversion function. +func Convert_v1_CronJob_To_batch_CronJob(in *v1.CronJob, out *batch.CronJob, s conversion.Scope) error { + return autoConvert_v1_CronJob_To_batch_CronJob(in, out, s) +} + +func autoConvert_batch_CronJob_To_v1_CronJob(in *batch.CronJob, out *v1.CronJob, s conversion.Scope) error { + out.ObjectMeta = in.ObjectMeta + if err := Convert_batch_CronJobSpec_To_v1_CronJobSpec(&in.Spec, &out.Spec, s); err != nil { + return err + } + if err := Convert_batch_CronJobStatus_To_v1_CronJobStatus(&in.Status, &out.Status, s); err != nil { + return err + } + return nil +} + +// Convert_batch_CronJob_To_v1_CronJob is an autogenerated conversion function. +func Convert_batch_CronJob_To_v1_CronJob(in *batch.CronJob, out *v1.CronJob, s conversion.Scope) error { + return autoConvert_batch_CronJob_To_v1_CronJob(in, out, s) +} + +func autoConvert_v1_CronJobList_To_batch_CronJobList(in *v1.CronJobList, out *batch.CronJobList, s conversion.Scope) error { + out.ListMeta = in.ListMeta + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]batch.CronJob, len(*in)) + for i := range *in { + if err := Convert_v1_CronJob_To_batch_CronJob(&(*in)[i], &(*out)[i], s); err != nil { + return err + } + } + } else { + out.Items = nil + } + return nil +} + +// Convert_v1_CronJobList_To_batch_CronJobList is an autogenerated conversion function. +func Convert_v1_CronJobList_To_batch_CronJobList(in *v1.CronJobList, out *batch.CronJobList, s conversion.Scope) error { + return autoConvert_v1_CronJobList_To_batch_CronJobList(in, out, s) +} + +func autoConvert_batch_CronJobList_To_v1_CronJobList(in *batch.CronJobList, out *v1.CronJobList, s conversion.Scope) error { + out.ListMeta = in.ListMeta + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]v1.CronJob, len(*in)) + for i := range *in { + if err := Convert_batch_CronJob_To_v1_CronJob(&(*in)[i], &(*out)[i], s); err != nil { + return err + } + } + } else { + out.Items = nil + } + return nil +} + +// Convert_batch_CronJobList_To_v1_CronJobList is an autogenerated conversion function. +func Convert_batch_CronJobList_To_v1_CronJobList(in *batch.CronJobList, out *v1.CronJobList, s conversion.Scope) error { + return autoConvert_batch_CronJobList_To_v1_CronJobList(in, out, s) +} + +func autoConvert_v1_CronJobSpec_To_batch_CronJobSpec(in *v1.CronJobSpec, out *batch.CronJobSpec, s conversion.Scope) error { + out.Schedule = in.Schedule + out.StartingDeadlineSeconds = (*int64)(unsafe.Pointer(in.StartingDeadlineSeconds)) + out.ConcurrencyPolicy = batch.ConcurrencyPolicy(in.ConcurrencyPolicy) + out.Suspend = (*bool)(unsafe.Pointer(in.Suspend)) + if err := Convert_v1_JobTemplateSpec_To_batch_JobTemplateSpec(&in.JobTemplate, &out.JobTemplate, s); err != nil { + return err + } + out.SuccessfulJobsHistoryLimit = (*int32)(unsafe.Pointer(in.SuccessfulJobsHistoryLimit)) + out.FailedJobsHistoryLimit = (*int32)(unsafe.Pointer(in.FailedJobsHistoryLimit)) + return nil +} + +// Convert_v1_CronJobSpec_To_batch_CronJobSpec is an autogenerated conversion function. +func Convert_v1_CronJobSpec_To_batch_CronJobSpec(in *v1.CronJobSpec, out *batch.CronJobSpec, s conversion.Scope) error { + return autoConvert_v1_CronJobSpec_To_batch_CronJobSpec(in, out, s) +} + +func autoConvert_batch_CronJobSpec_To_v1_CronJobSpec(in *batch.CronJobSpec, out *v1.CronJobSpec, s conversion.Scope) error { + out.Schedule = in.Schedule + out.StartingDeadlineSeconds = (*int64)(unsafe.Pointer(in.StartingDeadlineSeconds)) + out.ConcurrencyPolicy = v1.ConcurrencyPolicy(in.ConcurrencyPolicy) + out.Suspend = (*bool)(unsafe.Pointer(in.Suspend)) + if err := Convert_batch_JobTemplateSpec_To_v1_JobTemplateSpec(&in.JobTemplate, &out.JobTemplate, s); err != nil { + return err + } + out.SuccessfulJobsHistoryLimit = (*int32)(unsafe.Pointer(in.SuccessfulJobsHistoryLimit)) + out.FailedJobsHistoryLimit = (*int32)(unsafe.Pointer(in.FailedJobsHistoryLimit)) + return nil +} + +// Convert_batch_CronJobSpec_To_v1_CronJobSpec is an autogenerated conversion function. +func Convert_batch_CronJobSpec_To_v1_CronJobSpec(in *batch.CronJobSpec, out *v1.CronJobSpec, s conversion.Scope) error { + return autoConvert_batch_CronJobSpec_To_v1_CronJobSpec(in, out, s) +} + +func autoConvert_v1_CronJobStatus_To_batch_CronJobStatus(in *v1.CronJobStatus, out *batch.CronJobStatus, s conversion.Scope) error { + out.Active = *(*[]core.ObjectReference)(unsafe.Pointer(&in.Active)) + out.LastScheduleTime = (*metav1.Time)(unsafe.Pointer(in.LastScheduleTime)) + out.LastSuccessfulTime = (*metav1.Time)(unsafe.Pointer(in.LastSuccessfulTime)) + return nil +} + +// Convert_v1_CronJobStatus_To_batch_CronJobStatus is an autogenerated conversion function. +func Convert_v1_CronJobStatus_To_batch_CronJobStatus(in *v1.CronJobStatus, out *batch.CronJobStatus, s conversion.Scope) error { + return autoConvert_v1_CronJobStatus_To_batch_CronJobStatus(in, out, s) +} + +func autoConvert_batch_CronJobStatus_To_v1_CronJobStatus(in *batch.CronJobStatus, out *v1.CronJobStatus, s conversion.Scope) error { + out.Active = *(*[]corev1.ObjectReference)(unsafe.Pointer(&in.Active)) + out.LastScheduleTime = (*metav1.Time)(unsafe.Pointer(in.LastScheduleTime)) + out.LastSuccessfulTime = (*metav1.Time)(unsafe.Pointer(in.LastSuccessfulTime)) + return nil +} + +// Convert_batch_CronJobStatus_To_v1_CronJobStatus is an autogenerated conversion function. +func Convert_batch_CronJobStatus_To_v1_CronJobStatus(in *batch.CronJobStatus, out *v1.CronJobStatus, s conversion.Scope) error { + return autoConvert_batch_CronJobStatus_To_v1_CronJobStatus(in, out, s) +} + func autoConvert_v1_Job_To_batch_Job(in *v1.Job, out *batch.Job, s conversion.Scope) error { out.ObjectMeta = in.ObjectMeta if err := Convert_v1_JobSpec_To_batch_JobSpec(&in.Spec, &out.Spec, s); err != nil { @@ -208,6 +392,8 @@ func autoConvert_v1_JobSpec_To_batch_JobSpec(in *v1.JobSpec, out *batch.JobSpec, return err } out.TTLSecondsAfterFinished = (*int32)(unsafe.Pointer(in.TTLSecondsAfterFinished)) + out.CompletionMode = (*batch.CompletionMode)(unsafe.Pointer(in.CompletionMode)) + out.Suspend = (*bool)(unsafe.Pointer(in.Suspend)) return nil } @@ -222,6 +408,8 @@ func autoConvert_batch_JobSpec_To_v1_JobSpec(in *batch.JobSpec, out *v1.JobSpec, return err } out.TTLSecondsAfterFinished = (*int32)(unsafe.Pointer(in.TTLSecondsAfterFinished)) + out.CompletionMode = (*v1.CompletionMode)(unsafe.Pointer(in.CompletionMode)) + out.Suspend = (*bool)(unsafe.Pointer(in.Suspend)) return nil } @@ -232,6 +420,7 @@ func autoConvert_v1_JobStatus_To_batch_JobStatus(in *v1.JobStatus, out *batch.Jo out.Active = in.Active out.Succeeded = in.Succeeded out.Failed = in.Failed + out.CompletedIndexes = in.CompletedIndexes return nil } @@ -247,6 +436,7 @@ func autoConvert_batch_JobStatus_To_v1_JobStatus(in *batch.JobStatus, out *v1.Jo out.Active = in.Active out.Succeeded = in.Succeeded out.Failed = in.Failed + out.CompletedIndexes = in.CompletedIndexes return nil } @@ -254,3 +444,29 @@ func autoConvert_batch_JobStatus_To_v1_JobStatus(in *batch.JobStatus, out *v1.Jo func Convert_batch_JobStatus_To_v1_JobStatus(in *batch.JobStatus, out *v1.JobStatus, s conversion.Scope) error { return autoConvert_batch_JobStatus_To_v1_JobStatus(in, out, s) } + +func autoConvert_v1_JobTemplateSpec_To_batch_JobTemplateSpec(in *v1.JobTemplateSpec, out *batch.JobTemplateSpec, s conversion.Scope) error { + out.ObjectMeta = in.ObjectMeta + if err := Convert_v1_JobSpec_To_batch_JobSpec(&in.Spec, &out.Spec, s); err != nil { + return err + } + return nil +} + +// Convert_v1_JobTemplateSpec_To_batch_JobTemplateSpec is an autogenerated conversion function. +func Convert_v1_JobTemplateSpec_To_batch_JobTemplateSpec(in *v1.JobTemplateSpec, out *batch.JobTemplateSpec, s conversion.Scope) error { + return autoConvert_v1_JobTemplateSpec_To_batch_JobTemplateSpec(in, out, s) +} + +func autoConvert_batch_JobTemplateSpec_To_v1_JobTemplateSpec(in *batch.JobTemplateSpec, out *v1.JobTemplateSpec, s conversion.Scope) error { + out.ObjectMeta = in.ObjectMeta + if err := Convert_batch_JobSpec_To_v1_JobSpec(&in.Spec, &out.Spec, s); err != nil { + return err + } + return nil +} + +// Convert_batch_JobTemplateSpec_To_v1_JobTemplateSpec is an autogenerated conversion function. +func Convert_batch_JobTemplateSpec_To_v1_JobTemplateSpec(in *batch.JobTemplateSpec, out *v1.JobTemplateSpec, s conversion.Scope) error { + return autoConvert_batch_JobTemplateSpec_To_v1_JobTemplateSpec(in, out, s) +} diff --git a/vendor/k8s.io/kubernetes/pkg/apis/batch/v1/zz_generated.defaults.go b/vendor/k8s.io/kubernetes/pkg/apis/batch/v1/zz_generated.defaults.go index ffeba646f2a1..afb907618dea 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/batch/v1/zz_generated.defaults.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/batch/v1/zz_generated.defaults.go @@ -21,8 +21,6 @@ limitations under the License. package v1 import ( - "reflect" - v1 "k8s.io/api/batch/v1" runtime "k8s.io/apimachinery/pkg/runtime" corev1 "k8s.io/kubernetes/pkg/apis/core/v1" @@ -32,11 +30,234 @@ import ( // Public to allow building arbitrary schemes. // All generated defaulters are covering - they call all nested defaulters. func RegisterDefaults(scheme *runtime.Scheme) error { + scheme.AddTypeDefaultingFunc(&v1.CronJob{}, func(obj interface{}) { SetObjectDefaults_CronJob(obj.(*v1.CronJob)) }) + scheme.AddTypeDefaultingFunc(&v1.CronJobList{}, func(obj interface{}) { SetObjectDefaults_CronJobList(obj.(*v1.CronJobList)) }) scheme.AddTypeDefaultingFunc(&v1.Job{}, func(obj interface{}) { SetObjectDefaults_Job(obj.(*v1.Job)) }) scheme.AddTypeDefaultingFunc(&v1.JobList{}, func(obj interface{}) { SetObjectDefaults_JobList(obj.(*v1.JobList)) }) return nil } +func SetObjectDefaults_CronJob(in *v1.CronJob) { + SetDefaults_CronJob(in) + corev1.SetDefaults_PodSpec(&in.Spec.JobTemplate.Spec.Template.Spec) + for i := range in.Spec.JobTemplate.Spec.Template.Spec.Volumes { + a := &in.Spec.JobTemplate.Spec.Template.Spec.Volumes[i] + corev1.SetDefaults_Volume(a) + if a.VolumeSource.HostPath != nil { + corev1.SetDefaults_HostPathVolumeSource(a.VolumeSource.HostPath) + } + if a.VolumeSource.Secret != nil { + corev1.SetDefaults_SecretVolumeSource(a.VolumeSource.Secret) + } + if a.VolumeSource.ISCSI != nil { + corev1.SetDefaults_ISCSIVolumeSource(a.VolumeSource.ISCSI) + } + if a.VolumeSource.RBD != nil { + corev1.SetDefaults_RBDVolumeSource(a.VolumeSource.RBD) + } + if a.VolumeSource.DownwardAPI != nil { + corev1.SetDefaults_DownwardAPIVolumeSource(a.VolumeSource.DownwardAPI) + for j := range a.VolumeSource.DownwardAPI.Items { + b := &a.VolumeSource.DownwardAPI.Items[j] + if b.FieldRef != nil { + corev1.SetDefaults_ObjectFieldSelector(b.FieldRef) + } + } + } + if a.VolumeSource.ConfigMap != nil { + corev1.SetDefaults_ConfigMapVolumeSource(a.VolumeSource.ConfigMap) + } + if a.VolumeSource.AzureDisk != nil { + corev1.SetDefaults_AzureDiskVolumeSource(a.VolumeSource.AzureDisk) + } + if a.VolumeSource.Projected != nil { + corev1.SetDefaults_ProjectedVolumeSource(a.VolumeSource.Projected) + for j := range a.VolumeSource.Projected.Sources { + b := &a.VolumeSource.Projected.Sources[j] + if b.DownwardAPI != nil { + for k := range b.DownwardAPI.Items { + c := &b.DownwardAPI.Items[k] + if c.FieldRef != nil { + corev1.SetDefaults_ObjectFieldSelector(c.FieldRef) + } + } + } + if b.ServiceAccountToken != nil { + corev1.SetDefaults_ServiceAccountTokenProjection(b.ServiceAccountToken) + } + } + } + if a.VolumeSource.ScaleIO != nil { + corev1.SetDefaults_ScaleIOVolumeSource(a.VolumeSource.ScaleIO) + } + if a.VolumeSource.Ephemeral != nil { + if a.VolumeSource.Ephemeral.VolumeClaimTemplate != nil { + corev1.SetDefaults_PersistentVolumeClaimSpec(&a.VolumeSource.Ephemeral.VolumeClaimTemplate.Spec) + corev1.SetDefaults_ResourceList(&a.VolumeSource.Ephemeral.VolumeClaimTemplate.Spec.Resources.Limits) + corev1.SetDefaults_ResourceList(&a.VolumeSource.Ephemeral.VolumeClaimTemplate.Spec.Resources.Requests) + } + } + } + for i := range in.Spec.JobTemplate.Spec.Template.Spec.InitContainers { + a := &in.Spec.JobTemplate.Spec.Template.Spec.InitContainers[i] + corev1.SetDefaults_Container(a) + for j := range a.Ports { + b := &a.Ports[j] + if b.Protocol == "" { + b.Protocol = "TCP" + } + } + for j := range a.Env { + b := &a.Env[j] + if b.ValueFrom != nil { + if b.ValueFrom.FieldRef != nil { + corev1.SetDefaults_ObjectFieldSelector(b.ValueFrom.FieldRef) + } + } + } + corev1.SetDefaults_ResourceList(&a.Resources.Limits) + corev1.SetDefaults_ResourceList(&a.Resources.Requests) + if a.LivenessProbe != nil { + corev1.SetDefaults_Probe(a.LivenessProbe) + if a.LivenessProbe.Handler.HTTPGet != nil { + corev1.SetDefaults_HTTPGetAction(a.LivenessProbe.Handler.HTTPGet) + } + } + if a.ReadinessProbe != nil { + corev1.SetDefaults_Probe(a.ReadinessProbe) + if a.ReadinessProbe.Handler.HTTPGet != nil { + corev1.SetDefaults_HTTPGetAction(a.ReadinessProbe.Handler.HTTPGet) + } + } + if a.StartupProbe != nil { + corev1.SetDefaults_Probe(a.StartupProbe) + if a.StartupProbe.Handler.HTTPGet != nil { + corev1.SetDefaults_HTTPGetAction(a.StartupProbe.Handler.HTTPGet) + } + } + if a.Lifecycle != nil { + if a.Lifecycle.PostStart != nil { + if a.Lifecycle.PostStart.HTTPGet != nil { + corev1.SetDefaults_HTTPGetAction(a.Lifecycle.PostStart.HTTPGet) + } + } + if a.Lifecycle.PreStop != nil { + if a.Lifecycle.PreStop.HTTPGet != nil { + corev1.SetDefaults_HTTPGetAction(a.Lifecycle.PreStop.HTTPGet) + } + } + } + } + for i := range in.Spec.JobTemplate.Spec.Template.Spec.Containers { + a := &in.Spec.JobTemplate.Spec.Template.Spec.Containers[i] + corev1.SetDefaults_Container(a) + for j := range a.Ports { + b := &a.Ports[j] + if b.Protocol == "" { + b.Protocol = "TCP" + } + } + for j := range a.Env { + b := &a.Env[j] + if b.ValueFrom != nil { + if b.ValueFrom.FieldRef != nil { + corev1.SetDefaults_ObjectFieldSelector(b.ValueFrom.FieldRef) + } + } + } + corev1.SetDefaults_ResourceList(&a.Resources.Limits) + corev1.SetDefaults_ResourceList(&a.Resources.Requests) + if a.LivenessProbe != nil { + corev1.SetDefaults_Probe(a.LivenessProbe) + if a.LivenessProbe.Handler.HTTPGet != nil { + corev1.SetDefaults_HTTPGetAction(a.LivenessProbe.Handler.HTTPGet) + } + } + if a.ReadinessProbe != nil { + corev1.SetDefaults_Probe(a.ReadinessProbe) + if a.ReadinessProbe.Handler.HTTPGet != nil { + corev1.SetDefaults_HTTPGetAction(a.ReadinessProbe.Handler.HTTPGet) + } + } + if a.StartupProbe != nil { + corev1.SetDefaults_Probe(a.StartupProbe) + if a.StartupProbe.Handler.HTTPGet != nil { + corev1.SetDefaults_HTTPGetAction(a.StartupProbe.Handler.HTTPGet) + } + } + if a.Lifecycle != nil { + if a.Lifecycle.PostStart != nil { + if a.Lifecycle.PostStart.HTTPGet != nil { + corev1.SetDefaults_HTTPGetAction(a.Lifecycle.PostStart.HTTPGet) + } + } + if a.Lifecycle.PreStop != nil { + if a.Lifecycle.PreStop.HTTPGet != nil { + corev1.SetDefaults_HTTPGetAction(a.Lifecycle.PreStop.HTTPGet) + } + } + } + } + for i := range in.Spec.JobTemplate.Spec.Template.Spec.EphemeralContainers { + a := &in.Spec.JobTemplate.Spec.Template.Spec.EphemeralContainers[i] + corev1.SetDefaults_EphemeralContainer(a) + for j := range a.EphemeralContainerCommon.Ports { + b := &a.EphemeralContainerCommon.Ports[j] + if b.Protocol == "" { + b.Protocol = "TCP" + } + } + for j := range a.EphemeralContainerCommon.Env { + b := &a.EphemeralContainerCommon.Env[j] + if b.ValueFrom != nil { + if b.ValueFrom.FieldRef != nil { + corev1.SetDefaults_ObjectFieldSelector(b.ValueFrom.FieldRef) + } + } + } + corev1.SetDefaults_ResourceList(&a.EphemeralContainerCommon.Resources.Limits) + corev1.SetDefaults_ResourceList(&a.EphemeralContainerCommon.Resources.Requests) + if a.EphemeralContainerCommon.LivenessProbe != nil { + corev1.SetDefaults_Probe(a.EphemeralContainerCommon.LivenessProbe) + if a.EphemeralContainerCommon.LivenessProbe.Handler.HTTPGet != nil { + corev1.SetDefaults_HTTPGetAction(a.EphemeralContainerCommon.LivenessProbe.Handler.HTTPGet) + } + } + if a.EphemeralContainerCommon.ReadinessProbe != nil { + corev1.SetDefaults_Probe(a.EphemeralContainerCommon.ReadinessProbe) + if a.EphemeralContainerCommon.ReadinessProbe.Handler.HTTPGet != nil { + corev1.SetDefaults_HTTPGetAction(a.EphemeralContainerCommon.ReadinessProbe.Handler.HTTPGet) + } + } + if a.EphemeralContainerCommon.StartupProbe != nil { + corev1.SetDefaults_Probe(a.EphemeralContainerCommon.StartupProbe) + if a.EphemeralContainerCommon.StartupProbe.Handler.HTTPGet != nil { + corev1.SetDefaults_HTTPGetAction(a.EphemeralContainerCommon.StartupProbe.Handler.HTTPGet) + } + } + if a.EphemeralContainerCommon.Lifecycle != nil { + if a.EphemeralContainerCommon.Lifecycle.PostStart != nil { + if a.EphemeralContainerCommon.Lifecycle.PostStart.HTTPGet != nil { + corev1.SetDefaults_HTTPGetAction(a.EphemeralContainerCommon.Lifecycle.PostStart.HTTPGet) + } + } + if a.EphemeralContainerCommon.Lifecycle.PreStop != nil { + if a.EphemeralContainerCommon.Lifecycle.PreStop.HTTPGet != nil { + corev1.SetDefaults_HTTPGetAction(a.EphemeralContainerCommon.Lifecycle.PreStop.HTTPGet) + } + } + } + } + corev1.SetDefaults_ResourceList(&in.Spec.JobTemplate.Spec.Template.Spec.Overhead) +} + +func SetObjectDefaults_CronJobList(in *v1.CronJobList) { + for i := range in.Items { + a := &in.Items[i] + SetObjectDefaults_CronJob(a) + } +} + func SetObjectDefaults_Job(in *v1.Job) { SetDefaults_Job(in) corev1.SetDefaults_PodSpec(&in.Spec.Template.Spec) @@ -103,7 +324,7 @@ func SetObjectDefaults_Job(in *v1.Job) { corev1.SetDefaults_Container(a) for j := range a.Ports { b := &a.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -153,7 +374,7 @@ func SetObjectDefaults_Job(in *v1.Job) { corev1.SetDefaults_Container(a) for j := range a.Ports { b := &a.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -203,7 +424,7 @@ func SetObjectDefaults_Job(in *v1.Job) { corev1.SetDefaults_EphemeralContainer(a) for j := range a.EphemeralContainerCommon.Ports { b := &a.EphemeralContainerCommon.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/batch/v1beta1/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/batch/v1beta1/BUILD deleted file mode 100644 index 9cc1b8678161..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/batch/v1beta1/BUILD +++ /dev/null @@ -1,59 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "defaults.go", - "doc.go", - "register.go", - "zz_generated.conversion.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/batch/v1beta1", - deps = [ - "//pkg/apis/batch:go_default_library", - "//pkg/apis/batch/v1:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/v1:go_default_library", - "//staging/src/k8s.io/api/batch/v1beta1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["defaults_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/batch/install:go_default_library", - "//pkg/apis/core/install:go_default_library", - "//staging/src/k8s.io/api/batch/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/batch/v1beta1/zz_generated.conversion.go b/vendor/k8s.io/kubernetes/pkg/apis/batch/v1beta1/zz_generated.conversion.go index df9f2e30c064..8439581df9d2 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/batch/v1beta1/zz_generated.conversion.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/batch/v1beta1/zz_generated.conversion.go @@ -216,6 +216,7 @@ func Convert_batch_CronJobSpec_To_v1beta1_CronJobSpec(in *batch.CronJobSpec, out func autoConvert_v1beta1_CronJobStatus_To_batch_CronJobStatus(in *v1beta1.CronJobStatus, out *batch.CronJobStatus, s conversion.Scope) error { out.Active = *(*[]core.ObjectReference)(unsafe.Pointer(&in.Active)) out.LastScheduleTime = (*v1.Time)(unsafe.Pointer(in.LastScheduleTime)) + out.LastSuccessfulTime = (*v1.Time)(unsafe.Pointer(in.LastSuccessfulTime)) return nil } @@ -227,6 +228,7 @@ func Convert_v1beta1_CronJobStatus_To_batch_CronJobStatus(in *v1beta1.CronJobSta func autoConvert_batch_CronJobStatus_To_v1beta1_CronJobStatus(in *batch.CronJobStatus, out *v1beta1.CronJobStatus, s conversion.Scope) error { out.Active = *(*[]corev1.ObjectReference)(unsafe.Pointer(&in.Active)) out.LastScheduleTime = (*v1.Time)(unsafe.Pointer(in.LastScheduleTime)) + out.LastSuccessfulTime = (*v1.Time)(unsafe.Pointer(in.LastSuccessfulTime)) return nil } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/batch/v1beta1/zz_generated.defaults.go b/vendor/k8s.io/kubernetes/pkg/apis/batch/v1beta1/zz_generated.defaults.go index 2b11eb146985..94f57743cd14 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/batch/v1beta1/zz_generated.defaults.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/batch/v1beta1/zz_generated.defaults.go @@ -21,8 +21,6 @@ limitations under the License. package v1beta1 import ( - "reflect" - v1beta1 "k8s.io/api/batch/v1beta1" runtime "k8s.io/apimachinery/pkg/runtime" v1 "k8s.io/kubernetes/pkg/apis/core/v1" @@ -104,7 +102,7 @@ func SetObjectDefaults_CronJob(in *v1beta1.CronJob) { v1.SetDefaults_Container(a) for j := range a.Ports { b := &a.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -154,7 +152,7 @@ func SetObjectDefaults_CronJob(in *v1beta1.CronJob) { v1.SetDefaults_Container(a) for j := range a.Ports { b := &a.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -204,7 +202,7 @@ func SetObjectDefaults_CronJob(in *v1beta1.CronJob) { v1.SetDefaults_EphemeralContainer(a) for j := range a.EphemeralContainerCommon.Ports { b := &a.EphemeralContainerCommon.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -324,7 +322,7 @@ func SetObjectDefaults_JobTemplate(in *v1beta1.JobTemplate) { v1.SetDefaults_Container(a) for j := range a.Ports { b := &a.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -374,7 +372,7 @@ func SetObjectDefaults_JobTemplate(in *v1beta1.JobTemplate) { v1.SetDefaults_Container(a) for j := range a.Ports { b := &a.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -424,7 +422,7 @@ func SetObjectDefaults_JobTemplate(in *v1beta1.JobTemplate) { v1.SetDefaults_EphemeralContainer(a) for j := range a.EphemeralContainerCommon.Ports { b := &a.EphemeralContainerCommon.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/batch/v2alpha1/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/batch/v2alpha1/BUILD deleted file mode 100644 index 59eab2eab159..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/batch/v2alpha1/BUILD +++ /dev/null @@ -1,58 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "defaults.go", - "doc.go", - "register.go", - "zz_generated.conversion.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/batch/v2alpha1", - deps = [ - "//pkg/apis/batch:go_default_library", - "//pkg/apis/batch/v1:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/v1:go_default_library", - "//staging/src/k8s.io/api/batch/v2alpha1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["defaults_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/batch/install:go_default_library", - "//pkg/apis/core/install:go_default_library", - "//staging/src/k8s.io/api/batch/v2alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/batch/v2alpha1/conversion.go b/vendor/k8s.io/kubernetes/pkg/apis/batch/v2alpha1/conversion.go deleted file mode 100644 index 0d854e5bab3c..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/batch/v2alpha1/conversion.go +++ /dev/null @@ -1,44 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package v2alpha1 - -import ( - "fmt" - - "k8s.io/apimachinery/pkg/runtime" -) - -func addConversionFuncs(scheme *runtime.Scheme) error { - var err error - // Add field label conversions for kinds having selectable nothing but ObjectMeta fields. - for _, k := range []string{"Job", "JobTemplate", "CronJob"} { - kind := k // don't close over range variables - err = scheme.AddFieldLabelConversionFunc(SchemeGroupVersion.WithKind(kind), - func(label, value string) (string, string, error) { - switch label { - case "metadata.name", "metadata.namespace", "status.successful": - return label, value, nil - default: - return "", "", fmt.Errorf("field label %q not supported for %q", label, kind) - } - }) - if err != nil { - return err - } - } - return nil -} diff --git a/vendor/k8s.io/kubernetes/pkg/apis/batch/v2alpha1/defaults.go b/vendor/k8s.io/kubernetes/pkg/apis/batch/v2alpha1/defaults.go deleted file mode 100644 index dab186aa7627..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/batch/v2alpha1/defaults.go +++ /dev/null @@ -1,35 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package v2alpha1 - -import ( - batchv2alpha1 "k8s.io/api/batch/v2alpha1" - "k8s.io/apimachinery/pkg/runtime" -) - -func addDefaultingFuncs(scheme *runtime.Scheme) error { - return RegisterDefaults(scheme) -} - -func SetDefaults_CronJob(obj *batchv2alpha1.CronJob) { - if obj.Spec.ConcurrencyPolicy == "" { - obj.Spec.ConcurrencyPolicy = batchv2alpha1.AllowConcurrent - } - if obj.Spec.Suspend == nil { - obj.Spec.Suspend = new(bool) - } -} diff --git a/vendor/k8s.io/kubernetes/pkg/apis/batch/v2alpha1/doc.go b/vendor/k8s.io/kubernetes/pkg/apis/batch/v2alpha1/doc.go deleted file mode 100644 index 243f82e8623e..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/batch/v2alpha1/doc.go +++ /dev/null @@ -1,23 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// +k8s:conversion-gen=k8s.io/kubernetes/pkg/apis/batch -// +k8s:conversion-gen=k8s.io/kubernetes/pkg/apis/batch/v1 -// +k8s:conversion-gen-external-types=k8s.io/api/batch/v2alpha1 -// +k8s:defaulter-gen=TypeMeta -// +k8s:defaulter-gen-input=../../../../vendor/k8s.io/api/batch/v2alpha1 - -package v2alpha1 // import "k8s.io/kubernetes/pkg/apis/batch/v2alpha1" diff --git a/vendor/k8s.io/kubernetes/pkg/apis/batch/v2alpha1/register.go b/vendor/k8s.io/kubernetes/pkg/apis/batch/v2alpha1/register.go deleted file mode 100644 index 5fa3750de81a..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/batch/v2alpha1/register.go +++ /dev/null @@ -1,45 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package v2alpha1 - -import ( - batchv2alpha1 "k8s.io/api/batch/v2alpha1" - "k8s.io/apimachinery/pkg/runtime/schema" -) - -// GroupName is the group name use in this package -const GroupName = "batch" - -// SchemeGroupVersion is group version used to register these objects -var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: "v2alpha1"} - -// Resource takes an unqualified resource and returns a Group qualified GroupResource -func Resource(resource string) schema.GroupResource { - return SchemeGroupVersion.WithResource(resource).GroupResource() -} - -var ( - localSchemeBuilder = &batchv2alpha1.SchemeBuilder - AddToScheme = localSchemeBuilder.AddToScheme -) - -func init() { - // We only register manually written functions here. The registration of the - // generated functions takes place in the generated files. The separation - // makes the code compile even when the generated files are missing. - localSchemeBuilder.Register(addDefaultingFuncs, addConversionFuncs) -} diff --git a/vendor/k8s.io/kubernetes/pkg/apis/batch/v2alpha1/zz_generated.conversion.go b/vendor/k8s.io/kubernetes/pkg/apis/batch/v2alpha1/zz_generated.conversion.go deleted file mode 100644 index be20c5535a76..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/batch/v2alpha1/zz_generated.conversion.go +++ /dev/null @@ -1,288 +0,0 @@ -// +build !ignore_autogenerated - -/* -Copyright The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by conversion-gen. DO NOT EDIT. - -package v2alpha1 - -import ( - unsafe "unsafe" - - v2alpha1 "k8s.io/api/batch/v2alpha1" - corev1 "k8s.io/api/core/v1" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - conversion "k8s.io/apimachinery/pkg/conversion" - runtime "k8s.io/apimachinery/pkg/runtime" - batch "k8s.io/kubernetes/pkg/apis/batch" - batchv1 "k8s.io/kubernetes/pkg/apis/batch/v1" - core "k8s.io/kubernetes/pkg/apis/core" -) - -func init() { - localSchemeBuilder.Register(RegisterConversions) -} - -// RegisterConversions adds conversion functions to the given scheme. -// Public to allow building arbitrary schemes. -func RegisterConversions(s *runtime.Scheme) error { - if err := s.AddGeneratedConversionFunc((*v2alpha1.CronJob)(nil), (*batch.CronJob)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v2alpha1_CronJob_To_batch_CronJob(a.(*v2alpha1.CronJob), b.(*batch.CronJob), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*batch.CronJob)(nil), (*v2alpha1.CronJob)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_batch_CronJob_To_v2alpha1_CronJob(a.(*batch.CronJob), b.(*v2alpha1.CronJob), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*v2alpha1.CronJobList)(nil), (*batch.CronJobList)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v2alpha1_CronJobList_To_batch_CronJobList(a.(*v2alpha1.CronJobList), b.(*batch.CronJobList), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*batch.CronJobList)(nil), (*v2alpha1.CronJobList)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_batch_CronJobList_To_v2alpha1_CronJobList(a.(*batch.CronJobList), b.(*v2alpha1.CronJobList), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*v2alpha1.CronJobSpec)(nil), (*batch.CronJobSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v2alpha1_CronJobSpec_To_batch_CronJobSpec(a.(*v2alpha1.CronJobSpec), b.(*batch.CronJobSpec), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*batch.CronJobSpec)(nil), (*v2alpha1.CronJobSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_batch_CronJobSpec_To_v2alpha1_CronJobSpec(a.(*batch.CronJobSpec), b.(*v2alpha1.CronJobSpec), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*v2alpha1.CronJobStatus)(nil), (*batch.CronJobStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v2alpha1_CronJobStatus_To_batch_CronJobStatus(a.(*v2alpha1.CronJobStatus), b.(*batch.CronJobStatus), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*batch.CronJobStatus)(nil), (*v2alpha1.CronJobStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_batch_CronJobStatus_To_v2alpha1_CronJobStatus(a.(*batch.CronJobStatus), b.(*v2alpha1.CronJobStatus), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*v2alpha1.JobTemplate)(nil), (*batch.JobTemplate)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v2alpha1_JobTemplate_To_batch_JobTemplate(a.(*v2alpha1.JobTemplate), b.(*batch.JobTemplate), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*batch.JobTemplate)(nil), (*v2alpha1.JobTemplate)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_batch_JobTemplate_To_v2alpha1_JobTemplate(a.(*batch.JobTemplate), b.(*v2alpha1.JobTemplate), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*v2alpha1.JobTemplateSpec)(nil), (*batch.JobTemplateSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v2alpha1_JobTemplateSpec_To_batch_JobTemplateSpec(a.(*v2alpha1.JobTemplateSpec), b.(*batch.JobTemplateSpec), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*batch.JobTemplateSpec)(nil), (*v2alpha1.JobTemplateSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_batch_JobTemplateSpec_To_v2alpha1_JobTemplateSpec(a.(*batch.JobTemplateSpec), b.(*v2alpha1.JobTemplateSpec), scope) - }); err != nil { - return err - } - return nil -} - -func autoConvert_v2alpha1_CronJob_To_batch_CronJob(in *v2alpha1.CronJob, out *batch.CronJob, s conversion.Scope) error { - out.ObjectMeta = in.ObjectMeta - if err := Convert_v2alpha1_CronJobSpec_To_batch_CronJobSpec(&in.Spec, &out.Spec, s); err != nil { - return err - } - if err := Convert_v2alpha1_CronJobStatus_To_batch_CronJobStatus(&in.Status, &out.Status, s); err != nil { - return err - } - return nil -} - -// Convert_v2alpha1_CronJob_To_batch_CronJob is an autogenerated conversion function. -func Convert_v2alpha1_CronJob_To_batch_CronJob(in *v2alpha1.CronJob, out *batch.CronJob, s conversion.Scope) error { - return autoConvert_v2alpha1_CronJob_To_batch_CronJob(in, out, s) -} - -func autoConvert_batch_CronJob_To_v2alpha1_CronJob(in *batch.CronJob, out *v2alpha1.CronJob, s conversion.Scope) error { - out.ObjectMeta = in.ObjectMeta - if err := Convert_batch_CronJobSpec_To_v2alpha1_CronJobSpec(&in.Spec, &out.Spec, s); err != nil { - return err - } - if err := Convert_batch_CronJobStatus_To_v2alpha1_CronJobStatus(&in.Status, &out.Status, s); err != nil { - return err - } - return nil -} - -// Convert_batch_CronJob_To_v2alpha1_CronJob is an autogenerated conversion function. -func Convert_batch_CronJob_To_v2alpha1_CronJob(in *batch.CronJob, out *v2alpha1.CronJob, s conversion.Scope) error { - return autoConvert_batch_CronJob_To_v2alpha1_CronJob(in, out, s) -} - -func autoConvert_v2alpha1_CronJobList_To_batch_CronJobList(in *v2alpha1.CronJobList, out *batch.CronJobList, s conversion.Scope) error { - out.ListMeta = in.ListMeta - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]batch.CronJob, len(*in)) - for i := range *in { - if err := Convert_v2alpha1_CronJob_To_batch_CronJob(&(*in)[i], &(*out)[i], s); err != nil { - return err - } - } - } else { - out.Items = nil - } - return nil -} - -// Convert_v2alpha1_CronJobList_To_batch_CronJobList is an autogenerated conversion function. -func Convert_v2alpha1_CronJobList_To_batch_CronJobList(in *v2alpha1.CronJobList, out *batch.CronJobList, s conversion.Scope) error { - return autoConvert_v2alpha1_CronJobList_To_batch_CronJobList(in, out, s) -} - -func autoConvert_batch_CronJobList_To_v2alpha1_CronJobList(in *batch.CronJobList, out *v2alpha1.CronJobList, s conversion.Scope) error { - out.ListMeta = in.ListMeta - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]v2alpha1.CronJob, len(*in)) - for i := range *in { - if err := Convert_batch_CronJob_To_v2alpha1_CronJob(&(*in)[i], &(*out)[i], s); err != nil { - return err - } - } - } else { - out.Items = nil - } - return nil -} - -// Convert_batch_CronJobList_To_v2alpha1_CronJobList is an autogenerated conversion function. -func Convert_batch_CronJobList_To_v2alpha1_CronJobList(in *batch.CronJobList, out *v2alpha1.CronJobList, s conversion.Scope) error { - return autoConvert_batch_CronJobList_To_v2alpha1_CronJobList(in, out, s) -} - -func autoConvert_v2alpha1_CronJobSpec_To_batch_CronJobSpec(in *v2alpha1.CronJobSpec, out *batch.CronJobSpec, s conversion.Scope) error { - out.Schedule = in.Schedule - out.StartingDeadlineSeconds = (*int64)(unsafe.Pointer(in.StartingDeadlineSeconds)) - out.ConcurrencyPolicy = batch.ConcurrencyPolicy(in.ConcurrencyPolicy) - out.Suspend = (*bool)(unsafe.Pointer(in.Suspend)) - if err := Convert_v2alpha1_JobTemplateSpec_To_batch_JobTemplateSpec(&in.JobTemplate, &out.JobTemplate, s); err != nil { - return err - } - out.SuccessfulJobsHistoryLimit = (*int32)(unsafe.Pointer(in.SuccessfulJobsHistoryLimit)) - out.FailedJobsHistoryLimit = (*int32)(unsafe.Pointer(in.FailedJobsHistoryLimit)) - return nil -} - -// Convert_v2alpha1_CronJobSpec_To_batch_CronJobSpec is an autogenerated conversion function. -func Convert_v2alpha1_CronJobSpec_To_batch_CronJobSpec(in *v2alpha1.CronJobSpec, out *batch.CronJobSpec, s conversion.Scope) error { - return autoConvert_v2alpha1_CronJobSpec_To_batch_CronJobSpec(in, out, s) -} - -func autoConvert_batch_CronJobSpec_To_v2alpha1_CronJobSpec(in *batch.CronJobSpec, out *v2alpha1.CronJobSpec, s conversion.Scope) error { - out.Schedule = in.Schedule - out.StartingDeadlineSeconds = (*int64)(unsafe.Pointer(in.StartingDeadlineSeconds)) - out.ConcurrencyPolicy = v2alpha1.ConcurrencyPolicy(in.ConcurrencyPolicy) - out.Suspend = (*bool)(unsafe.Pointer(in.Suspend)) - if err := Convert_batch_JobTemplateSpec_To_v2alpha1_JobTemplateSpec(&in.JobTemplate, &out.JobTemplate, s); err != nil { - return err - } - out.SuccessfulJobsHistoryLimit = (*int32)(unsafe.Pointer(in.SuccessfulJobsHistoryLimit)) - out.FailedJobsHistoryLimit = (*int32)(unsafe.Pointer(in.FailedJobsHistoryLimit)) - return nil -} - -// Convert_batch_CronJobSpec_To_v2alpha1_CronJobSpec is an autogenerated conversion function. -func Convert_batch_CronJobSpec_To_v2alpha1_CronJobSpec(in *batch.CronJobSpec, out *v2alpha1.CronJobSpec, s conversion.Scope) error { - return autoConvert_batch_CronJobSpec_To_v2alpha1_CronJobSpec(in, out, s) -} - -func autoConvert_v2alpha1_CronJobStatus_To_batch_CronJobStatus(in *v2alpha1.CronJobStatus, out *batch.CronJobStatus, s conversion.Scope) error { - out.Active = *(*[]core.ObjectReference)(unsafe.Pointer(&in.Active)) - out.LastScheduleTime = (*v1.Time)(unsafe.Pointer(in.LastScheduleTime)) - return nil -} - -// Convert_v2alpha1_CronJobStatus_To_batch_CronJobStatus is an autogenerated conversion function. -func Convert_v2alpha1_CronJobStatus_To_batch_CronJobStatus(in *v2alpha1.CronJobStatus, out *batch.CronJobStatus, s conversion.Scope) error { - return autoConvert_v2alpha1_CronJobStatus_To_batch_CronJobStatus(in, out, s) -} - -func autoConvert_batch_CronJobStatus_To_v2alpha1_CronJobStatus(in *batch.CronJobStatus, out *v2alpha1.CronJobStatus, s conversion.Scope) error { - out.Active = *(*[]corev1.ObjectReference)(unsafe.Pointer(&in.Active)) - out.LastScheduleTime = (*v1.Time)(unsafe.Pointer(in.LastScheduleTime)) - return nil -} - -// Convert_batch_CronJobStatus_To_v2alpha1_CronJobStatus is an autogenerated conversion function. -func Convert_batch_CronJobStatus_To_v2alpha1_CronJobStatus(in *batch.CronJobStatus, out *v2alpha1.CronJobStatus, s conversion.Scope) error { - return autoConvert_batch_CronJobStatus_To_v2alpha1_CronJobStatus(in, out, s) -} - -func autoConvert_v2alpha1_JobTemplate_To_batch_JobTemplate(in *v2alpha1.JobTemplate, out *batch.JobTemplate, s conversion.Scope) error { - out.ObjectMeta = in.ObjectMeta - if err := Convert_v2alpha1_JobTemplateSpec_To_batch_JobTemplateSpec(&in.Template, &out.Template, s); err != nil { - return err - } - return nil -} - -// Convert_v2alpha1_JobTemplate_To_batch_JobTemplate is an autogenerated conversion function. -func Convert_v2alpha1_JobTemplate_To_batch_JobTemplate(in *v2alpha1.JobTemplate, out *batch.JobTemplate, s conversion.Scope) error { - return autoConvert_v2alpha1_JobTemplate_To_batch_JobTemplate(in, out, s) -} - -func autoConvert_batch_JobTemplate_To_v2alpha1_JobTemplate(in *batch.JobTemplate, out *v2alpha1.JobTemplate, s conversion.Scope) error { - out.ObjectMeta = in.ObjectMeta - if err := Convert_batch_JobTemplateSpec_To_v2alpha1_JobTemplateSpec(&in.Template, &out.Template, s); err != nil { - return err - } - return nil -} - -// Convert_batch_JobTemplate_To_v2alpha1_JobTemplate is an autogenerated conversion function. -func Convert_batch_JobTemplate_To_v2alpha1_JobTemplate(in *batch.JobTemplate, out *v2alpha1.JobTemplate, s conversion.Scope) error { - return autoConvert_batch_JobTemplate_To_v2alpha1_JobTemplate(in, out, s) -} - -func autoConvert_v2alpha1_JobTemplateSpec_To_batch_JobTemplateSpec(in *v2alpha1.JobTemplateSpec, out *batch.JobTemplateSpec, s conversion.Scope) error { - out.ObjectMeta = in.ObjectMeta - if err := batchv1.Convert_v1_JobSpec_To_batch_JobSpec(&in.Spec, &out.Spec, s); err != nil { - return err - } - return nil -} - -// Convert_v2alpha1_JobTemplateSpec_To_batch_JobTemplateSpec is an autogenerated conversion function. -func Convert_v2alpha1_JobTemplateSpec_To_batch_JobTemplateSpec(in *v2alpha1.JobTemplateSpec, out *batch.JobTemplateSpec, s conversion.Scope) error { - return autoConvert_v2alpha1_JobTemplateSpec_To_batch_JobTemplateSpec(in, out, s) -} - -func autoConvert_batch_JobTemplateSpec_To_v2alpha1_JobTemplateSpec(in *batch.JobTemplateSpec, out *v2alpha1.JobTemplateSpec, s conversion.Scope) error { - out.ObjectMeta = in.ObjectMeta - if err := batchv1.Convert_batch_JobSpec_To_v1_JobSpec(&in.Spec, &out.Spec, s); err != nil { - return err - } - return nil -} - -// Convert_batch_JobTemplateSpec_To_v2alpha1_JobTemplateSpec is an autogenerated conversion function. -func Convert_batch_JobTemplateSpec_To_v2alpha1_JobTemplateSpec(in *batch.JobTemplateSpec, out *v2alpha1.JobTemplateSpec, s conversion.Scope) error { - return autoConvert_batch_JobTemplateSpec_To_v2alpha1_JobTemplateSpec(in, out, s) -} diff --git a/vendor/k8s.io/kubernetes/pkg/apis/batch/v2alpha1/zz_generated.defaults.go b/vendor/k8s.io/kubernetes/pkg/apis/batch/v2alpha1/zz_generated.defaults.go deleted file mode 100644 index eb96b04cb576..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/batch/v2alpha1/zz_generated.defaults.go +++ /dev/null @@ -1,473 +0,0 @@ -// +build !ignore_autogenerated - -/* -Copyright The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by defaulter-gen. DO NOT EDIT. - -package v2alpha1 - -import ( - "reflect" - - v2alpha1 "k8s.io/api/batch/v2alpha1" - runtime "k8s.io/apimachinery/pkg/runtime" - v1 "k8s.io/kubernetes/pkg/apis/core/v1" -) - -// RegisterDefaults adds defaulters functions to the given scheme. -// Public to allow building arbitrary schemes. -// All generated defaulters are covering - they call all nested defaulters. -func RegisterDefaults(scheme *runtime.Scheme) error { - scheme.AddTypeDefaultingFunc(&v2alpha1.CronJob{}, func(obj interface{}) { SetObjectDefaults_CronJob(obj.(*v2alpha1.CronJob)) }) - scheme.AddTypeDefaultingFunc(&v2alpha1.CronJobList{}, func(obj interface{}) { SetObjectDefaults_CronJobList(obj.(*v2alpha1.CronJobList)) }) - scheme.AddTypeDefaultingFunc(&v2alpha1.JobTemplate{}, func(obj interface{}) { SetObjectDefaults_JobTemplate(obj.(*v2alpha1.JobTemplate)) }) - return nil -} - -func SetObjectDefaults_CronJob(in *v2alpha1.CronJob) { - SetDefaults_CronJob(in) - v1.SetDefaults_PodSpec(&in.Spec.JobTemplate.Spec.Template.Spec) - for i := range in.Spec.JobTemplate.Spec.Template.Spec.Volumes { - a := &in.Spec.JobTemplate.Spec.Template.Spec.Volumes[i] - v1.SetDefaults_Volume(a) - if a.VolumeSource.HostPath != nil { - v1.SetDefaults_HostPathVolumeSource(a.VolumeSource.HostPath) - } - if a.VolumeSource.Secret != nil { - v1.SetDefaults_SecretVolumeSource(a.VolumeSource.Secret) - } - if a.VolumeSource.ISCSI != nil { - v1.SetDefaults_ISCSIVolumeSource(a.VolumeSource.ISCSI) - } - if a.VolumeSource.RBD != nil { - v1.SetDefaults_RBDVolumeSource(a.VolumeSource.RBD) - } - if a.VolumeSource.DownwardAPI != nil { - v1.SetDefaults_DownwardAPIVolumeSource(a.VolumeSource.DownwardAPI) - for j := range a.VolumeSource.DownwardAPI.Items { - b := &a.VolumeSource.DownwardAPI.Items[j] - if b.FieldRef != nil { - v1.SetDefaults_ObjectFieldSelector(b.FieldRef) - } - } - } - if a.VolumeSource.ConfigMap != nil { - v1.SetDefaults_ConfigMapVolumeSource(a.VolumeSource.ConfigMap) - } - if a.VolumeSource.AzureDisk != nil { - v1.SetDefaults_AzureDiskVolumeSource(a.VolumeSource.AzureDisk) - } - if a.VolumeSource.Projected != nil { - v1.SetDefaults_ProjectedVolumeSource(a.VolumeSource.Projected) - for j := range a.VolumeSource.Projected.Sources { - b := &a.VolumeSource.Projected.Sources[j] - if b.DownwardAPI != nil { - for k := range b.DownwardAPI.Items { - c := &b.DownwardAPI.Items[k] - if c.FieldRef != nil { - v1.SetDefaults_ObjectFieldSelector(c.FieldRef) - } - } - } - if b.ServiceAccountToken != nil { - v1.SetDefaults_ServiceAccountTokenProjection(b.ServiceAccountToken) - } - } - } - if a.VolumeSource.ScaleIO != nil { - v1.SetDefaults_ScaleIOVolumeSource(a.VolumeSource.ScaleIO) - } - if a.VolumeSource.Ephemeral != nil { - if a.VolumeSource.Ephemeral.VolumeClaimTemplate != nil { - v1.SetDefaults_PersistentVolumeClaimSpec(&a.VolumeSource.Ephemeral.VolumeClaimTemplate.Spec) - v1.SetDefaults_ResourceList(&a.VolumeSource.Ephemeral.VolumeClaimTemplate.Spec.Resources.Limits) - v1.SetDefaults_ResourceList(&a.VolumeSource.Ephemeral.VolumeClaimTemplate.Spec.Resources.Requests) - } - } - } - for i := range in.Spec.JobTemplate.Spec.Template.Spec.InitContainers { - a := &in.Spec.JobTemplate.Spec.Template.Spec.InitContainers[i] - v1.SetDefaults_Container(a) - for j := range a.Ports { - b := &a.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { - b.Protocol = "TCP" - } - } - for j := range a.Env { - b := &a.Env[j] - if b.ValueFrom != nil { - if b.ValueFrom.FieldRef != nil { - v1.SetDefaults_ObjectFieldSelector(b.ValueFrom.FieldRef) - } - } - } - v1.SetDefaults_ResourceList(&a.Resources.Limits) - v1.SetDefaults_ResourceList(&a.Resources.Requests) - if a.LivenessProbe != nil { - v1.SetDefaults_Probe(a.LivenessProbe) - if a.LivenessProbe.Handler.HTTPGet != nil { - v1.SetDefaults_HTTPGetAction(a.LivenessProbe.Handler.HTTPGet) - } - } - if a.ReadinessProbe != nil { - v1.SetDefaults_Probe(a.ReadinessProbe) - if a.ReadinessProbe.Handler.HTTPGet != nil { - v1.SetDefaults_HTTPGetAction(a.ReadinessProbe.Handler.HTTPGet) - } - } - if a.StartupProbe != nil { - v1.SetDefaults_Probe(a.StartupProbe) - if a.StartupProbe.Handler.HTTPGet != nil { - v1.SetDefaults_HTTPGetAction(a.StartupProbe.Handler.HTTPGet) - } - } - if a.Lifecycle != nil { - if a.Lifecycle.PostStart != nil { - if a.Lifecycle.PostStart.HTTPGet != nil { - v1.SetDefaults_HTTPGetAction(a.Lifecycle.PostStart.HTTPGet) - } - } - if a.Lifecycle.PreStop != nil { - if a.Lifecycle.PreStop.HTTPGet != nil { - v1.SetDefaults_HTTPGetAction(a.Lifecycle.PreStop.HTTPGet) - } - } - } - } - for i := range in.Spec.JobTemplate.Spec.Template.Spec.Containers { - a := &in.Spec.JobTemplate.Spec.Template.Spec.Containers[i] - v1.SetDefaults_Container(a) - for j := range a.Ports { - b := &a.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { - b.Protocol = "TCP" - } - } - for j := range a.Env { - b := &a.Env[j] - if b.ValueFrom != nil { - if b.ValueFrom.FieldRef != nil { - v1.SetDefaults_ObjectFieldSelector(b.ValueFrom.FieldRef) - } - } - } - v1.SetDefaults_ResourceList(&a.Resources.Limits) - v1.SetDefaults_ResourceList(&a.Resources.Requests) - if a.LivenessProbe != nil { - v1.SetDefaults_Probe(a.LivenessProbe) - if a.LivenessProbe.Handler.HTTPGet != nil { - v1.SetDefaults_HTTPGetAction(a.LivenessProbe.Handler.HTTPGet) - } - } - if a.ReadinessProbe != nil { - v1.SetDefaults_Probe(a.ReadinessProbe) - if a.ReadinessProbe.Handler.HTTPGet != nil { - v1.SetDefaults_HTTPGetAction(a.ReadinessProbe.Handler.HTTPGet) - } - } - if a.StartupProbe != nil { - v1.SetDefaults_Probe(a.StartupProbe) - if a.StartupProbe.Handler.HTTPGet != nil { - v1.SetDefaults_HTTPGetAction(a.StartupProbe.Handler.HTTPGet) - } - } - if a.Lifecycle != nil { - if a.Lifecycle.PostStart != nil { - if a.Lifecycle.PostStart.HTTPGet != nil { - v1.SetDefaults_HTTPGetAction(a.Lifecycle.PostStart.HTTPGet) - } - } - if a.Lifecycle.PreStop != nil { - if a.Lifecycle.PreStop.HTTPGet != nil { - v1.SetDefaults_HTTPGetAction(a.Lifecycle.PreStop.HTTPGet) - } - } - } - } - for i := range in.Spec.JobTemplate.Spec.Template.Spec.EphemeralContainers { - a := &in.Spec.JobTemplate.Spec.Template.Spec.EphemeralContainers[i] - v1.SetDefaults_EphemeralContainer(a) - for j := range a.EphemeralContainerCommon.Ports { - b := &a.EphemeralContainerCommon.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { - b.Protocol = "TCP" - } - } - for j := range a.EphemeralContainerCommon.Env { - b := &a.EphemeralContainerCommon.Env[j] - if b.ValueFrom != nil { - if b.ValueFrom.FieldRef != nil { - v1.SetDefaults_ObjectFieldSelector(b.ValueFrom.FieldRef) - } - } - } - v1.SetDefaults_ResourceList(&a.EphemeralContainerCommon.Resources.Limits) - v1.SetDefaults_ResourceList(&a.EphemeralContainerCommon.Resources.Requests) - if a.EphemeralContainerCommon.LivenessProbe != nil { - v1.SetDefaults_Probe(a.EphemeralContainerCommon.LivenessProbe) - if a.EphemeralContainerCommon.LivenessProbe.Handler.HTTPGet != nil { - v1.SetDefaults_HTTPGetAction(a.EphemeralContainerCommon.LivenessProbe.Handler.HTTPGet) - } - } - if a.EphemeralContainerCommon.ReadinessProbe != nil { - v1.SetDefaults_Probe(a.EphemeralContainerCommon.ReadinessProbe) - if a.EphemeralContainerCommon.ReadinessProbe.Handler.HTTPGet != nil { - v1.SetDefaults_HTTPGetAction(a.EphemeralContainerCommon.ReadinessProbe.Handler.HTTPGet) - } - } - if a.EphemeralContainerCommon.StartupProbe != nil { - v1.SetDefaults_Probe(a.EphemeralContainerCommon.StartupProbe) - if a.EphemeralContainerCommon.StartupProbe.Handler.HTTPGet != nil { - v1.SetDefaults_HTTPGetAction(a.EphemeralContainerCommon.StartupProbe.Handler.HTTPGet) - } - } - if a.EphemeralContainerCommon.Lifecycle != nil { - if a.EphemeralContainerCommon.Lifecycle.PostStart != nil { - if a.EphemeralContainerCommon.Lifecycle.PostStart.HTTPGet != nil { - v1.SetDefaults_HTTPGetAction(a.EphemeralContainerCommon.Lifecycle.PostStart.HTTPGet) - } - } - if a.EphemeralContainerCommon.Lifecycle.PreStop != nil { - if a.EphemeralContainerCommon.Lifecycle.PreStop.HTTPGet != nil { - v1.SetDefaults_HTTPGetAction(a.EphemeralContainerCommon.Lifecycle.PreStop.HTTPGet) - } - } - } - } - v1.SetDefaults_ResourceList(&in.Spec.JobTemplate.Spec.Template.Spec.Overhead) -} - -func SetObjectDefaults_CronJobList(in *v2alpha1.CronJobList) { - for i := range in.Items { - a := &in.Items[i] - SetObjectDefaults_CronJob(a) - } -} - -func SetObjectDefaults_JobTemplate(in *v2alpha1.JobTemplate) { - v1.SetDefaults_PodSpec(&in.Template.Spec.Template.Spec) - for i := range in.Template.Spec.Template.Spec.Volumes { - a := &in.Template.Spec.Template.Spec.Volumes[i] - v1.SetDefaults_Volume(a) - if a.VolumeSource.HostPath != nil { - v1.SetDefaults_HostPathVolumeSource(a.VolumeSource.HostPath) - } - if a.VolumeSource.Secret != nil { - v1.SetDefaults_SecretVolumeSource(a.VolumeSource.Secret) - } - if a.VolumeSource.ISCSI != nil { - v1.SetDefaults_ISCSIVolumeSource(a.VolumeSource.ISCSI) - } - if a.VolumeSource.RBD != nil { - v1.SetDefaults_RBDVolumeSource(a.VolumeSource.RBD) - } - if a.VolumeSource.DownwardAPI != nil { - v1.SetDefaults_DownwardAPIVolumeSource(a.VolumeSource.DownwardAPI) - for j := range a.VolumeSource.DownwardAPI.Items { - b := &a.VolumeSource.DownwardAPI.Items[j] - if b.FieldRef != nil { - v1.SetDefaults_ObjectFieldSelector(b.FieldRef) - } - } - } - if a.VolumeSource.ConfigMap != nil { - v1.SetDefaults_ConfigMapVolumeSource(a.VolumeSource.ConfigMap) - } - if a.VolumeSource.AzureDisk != nil { - v1.SetDefaults_AzureDiskVolumeSource(a.VolumeSource.AzureDisk) - } - if a.VolumeSource.Projected != nil { - v1.SetDefaults_ProjectedVolumeSource(a.VolumeSource.Projected) - for j := range a.VolumeSource.Projected.Sources { - b := &a.VolumeSource.Projected.Sources[j] - if b.DownwardAPI != nil { - for k := range b.DownwardAPI.Items { - c := &b.DownwardAPI.Items[k] - if c.FieldRef != nil { - v1.SetDefaults_ObjectFieldSelector(c.FieldRef) - } - } - } - if b.ServiceAccountToken != nil { - v1.SetDefaults_ServiceAccountTokenProjection(b.ServiceAccountToken) - } - } - } - if a.VolumeSource.ScaleIO != nil { - v1.SetDefaults_ScaleIOVolumeSource(a.VolumeSource.ScaleIO) - } - if a.VolumeSource.Ephemeral != nil { - if a.VolumeSource.Ephemeral.VolumeClaimTemplate != nil { - v1.SetDefaults_PersistentVolumeClaimSpec(&a.VolumeSource.Ephemeral.VolumeClaimTemplate.Spec) - v1.SetDefaults_ResourceList(&a.VolumeSource.Ephemeral.VolumeClaimTemplate.Spec.Resources.Limits) - v1.SetDefaults_ResourceList(&a.VolumeSource.Ephemeral.VolumeClaimTemplate.Spec.Resources.Requests) - } - } - } - for i := range in.Template.Spec.Template.Spec.InitContainers { - a := &in.Template.Spec.Template.Spec.InitContainers[i] - v1.SetDefaults_Container(a) - for j := range a.Ports { - b := &a.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { - b.Protocol = "TCP" - } - } - for j := range a.Env { - b := &a.Env[j] - if b.ValueFrom != nil { - if b.ValueFrom.FieldRef != nil { - v1.SetDefaults_ObjectFieldSelector(b.ValueFrom.FieldRef) - } - } - } - v1.SetDefaults_ResourceList(&a.Resources.Limits) - v1.SetDefaults_ResourceList(&a.Resources.Requests) - if a.LivenessProbe != nil { - v1.SetDefaults_Probe(a.LivenessProbe) - if a.LivenessProbe.Handler.HTTPGet != nil { - v1.SetDefaults_HTTPGetAction(a.LivenessProbe.Handler.HTTPGet) - } - } - if a.ReadinessProbe != nil { - v1.SetDefaults_Probe(a.ReadinessProbe) - if a.ReadinessProbe.Handler.HTTPGet != nil { - v1.SetDefaults_HTTPGetAction(a.ReadinessProbe.Handler.HTTPGet) - } - } - if a.StartupProbe != nil { - v1.SetDefaults_Probe(a.StartupProbe) - if a.StartupProbe.Handler.HTTPGet != nil { - v1.SetDefaults_HTTPGetAction(a.StartupProbe.Handler.HTTPGet) - } - } - if a.Lifecycle != nil { - if a.Lifecycle.PostStart != nil { - if a.Lifecycle.PostStart.HTTPGet != nil { - v1.SetDefaults_HTTPGetAction(a.Lifecycle.PostStart.HTTPGet) - } - } - if a.Lifecycle.PreStop != nil { - if a.Lifecycle.PreStop.HTTPGet != nil { - v1.SetDefaults_HTTPGetAction(a.Lifecycle.PreStop.HTTPGet) - } - } - } - } - for i := range in.Template.Spec.Template.Spec.Containers { - a := &in.Template.Spec.Template.Spec.Containers[i] - v1.SetDefaults_Container(a) - for j := range a.Ports { - b := &a.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { - b.Protocol = "TCP" - } - } - for j := range a.Env { - b := &a.Env[j] - if b.ValueFrom != nil { - if b.ValueFrom.FieldRef != nil { - v1.SetDefaults_ObjectFieldSelector(b.ValueFrom.FieldRef) - } - } - } - v1.SetDefaults_ResourceList(&a.Resources.Limits) - v1.SetDefaults_ResourceList(&a.Resources.Requests) - if a.LivenessProbe != nil { - v1.SetDefaults_Probe(a.LivenessProbe) - if a.LivenessProbe.Handler.HTTPGet != nil { - v1.SetDefaults_HTTPGetAction(a.LivenessProbe.Handler.HTTPGet) - } - } - if a.ReadinessProbe != nil { - v1.SetDefaults_Probe(a.ReadinessProbe) - if a.ReadinessProbe.Handler.HTTPGet != nil { - v1.SetDefaults_HTTPGetAction(a.ReadinessProbe.Handler.HTTPGet) - } - } - if a.StartupProbe != nil { - v1.SetDefaults_Probe(a.StartupProbe) - if a.StartupProbe.Handler.HTTPGet != nil { - v1.SetDefaults_HTTPGetAction(a.StartupProbe.Handler.HTTPGet) - } - } - if a.Lifecycle != nil { - if a.Lifecycle.PostStart != nil { - if a.Lifecycle.PostStart.HTTPGet != nil { - v1.SetDefaults_HTTPGetAction(a.Lifecycle.PostStart.HTTPGet) - } - } - if a.Lifecycle.PreStop != nil { - if a.Lifecycle.PreStop.HTTPGet != nil { - v1.SetDefaults_HTTPGetAction(a.Lifecycle.PreStop.HTTPGet) - } - } - } - } - for i := range in.Template.Spec.Template.Spec.EphemeralContainers { - a := &in.Template.Spec.Template.Spec.EphemeralContainers[i] - v1.SetDefaults_EphemeralContainer(a) - for j := range a.EphemeralContainerCommon.Ports { - b := &a.EphemeralContainerCommon.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { - b.Protocol = "TCP" - } - } - for j := range a.EphemeralContainerCommon.Env { - b := &a.EphemeralContainerCommon.Env[j] - if b.ValueFrom != nil { - if b.ValueFrom.FieldRef != nil { - v1.SetDefaults_ObjectFieldSelector(b.ValueFrom.FieldRef) - } - } - } - v1.SetDefaults_ResourceList(&a.EphemeralContainerCommon.Resources.Limits) - v1.SetDefaults_ResourceList(&a.EphemeralContainerCommon.Resources.Requests) - if a.EphemeralContainerCommon.LivenessProbe != nil { - v1.SetDefaults_Probe(a.EphemeralContainerCommon.LivenessProbe) - if a.EphemeralContainerCommon.LivenessProbe.Handler.HTTPGet != nil { - v1.SetDefaults_HTTPGetAction(a.EphemeralContainerCommon.LivenessProbe.Handler.HTTPGet) - } - } - if a.EphemeralContainerCommon.ReadinessProbe != nil { - v1.SetDefaults_Probe(a.EphemeralContainerCommon.ReadinessProbe) - if a.EphemeralContainerCommon.ReadinessProbe.Handler.HTTPGet != nil { - v1.SetDefaults_HTTPGetAction(a.EphemeralContainerCommon.ReadinessProbe.Handler.HTTPGet) - } - } - if a.EphemeralContainerCommon.StartupProbe != nil { - v1.SetDefaults_Probe(a.EphemeralContainerCommon.StartupProbe) - if a.EphemeralContainerCommon.StartupProbe.Handler.HTTPGet != nil { - v1.SetDefaults_HTTPGetAction(a.EphemeralContainerCommon.StartupProbe.Handler.HTTPGet) - } - } - if a.EphemeralContainerCommon.Lifecycle != nil { - if a.EphemeralContainerCommon.Lifecycle.PostStart != nil { - if a.EphemeralContainerCommon.Lifecycle.PostStart.HTTPGet != nil { - v1.SetDefaults_HTTPGetAction(a.EphemeralContainerCommon.Lifecycle.PostStart.HTTPGet) - } - } - if a.EphemeralContainerCommon.Lifecycle.PreStop != nil { - if a.EphemeralContainerCommon.Lifecycle.PreStop.HTTPGet != nil { - v1.SetDefaults_HTTPGetAction(a.EphemeralContainerCommon.Lifecycle.PreStop.HTTPGet) - } - } - } - } - v1.SetDefaults_ResourceList(&in.Template.Spec.Template.Spec.Overhead) -} diff --git a/vendor/k8s.io/kubernetes/pkg/apis/batch/validation/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/batch/validation/BUILD deleted file mode 100644 index 4fc203a8b91a..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/batch/validation/BUILD +++ /dev/null @@ -1,53 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["validation.go"], - importpath = "k8s.io/kubernetes/pkg/apis/batch/validation", - deps = [ - "//pkg/apis/batch:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//vendor/github.com/robfig/cron:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["validation_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/batch:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/validation:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/batch/validation/validation.go b/vendor/k8s.io/kubernetes/pkg/apis/batch/validation/validation.go index 8466b92e0388..34a498a96a20 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/batch/validation/validation.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/batch/validation/validation.go @@ -31,6 +31,11 @@ import ( apivalidation "k8s.io/kubernetes/pkg/apis/core/validation" ) +// maxParallelismForIndexJob is the maximum parallelism that an Indexed Job +// is allowed to have. This threshold allows to cap the length of +// .status.completedIndexes. +const maxParallelismForIndexedJob = 100000 + // ValidateGeneratedSelector validates that the generated selector on a controller object match the controller object // metadata, and the labels on the pod template are as generated. // @@ -124,6 +129,20 @@ func validateJobSpec(spec *batch.JobSpec, fldPath *field.Path, opts apivalidatio if spec.TTLSecondsAfterFinished != nil { allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(*spec.TTLSecondsAfterFinished), fldPath.Child("ttlSecondsAfterFinished"))...) } + // CompletionMode might be nil when IndexedJob feature gate is disabled. + if spec.CompletionMode != nil { + if *spec.CompletionMode != batch.NonIndexedCompletion && *spec.CompletionMode != batch.IndexedCompletion { + allErrs = append(allErrs, field.NotSupported(fldPath.Child("completionMode"), spec.CompletionMode, []string{string(batch.NonIndexedCompletion), string(batch.IndexedCompletion)})) + } + if *spec.CompletionMode == batch.IndexedCompletion { + if spec.Completions == nil { + allErrs = append(allErrs, field.Required(fldPath.Child("completions"), fmt.Sprintf("when completion mode is %s", batch.IndexedCompletion))) + } + if spec.Parallelism != nil && *spec.Parallelism > maxParallelismForIndexedJob { + allErrs = append(allErrs, field.Invalid(fldPath.Child("parallelism"), *spec.Parallelism, fmt.Sprintf("must be less than or equal to %d when completion mode is %s", maxParallelismForIndexedJob, batch.IndexedCompletion))) + } + } + } allErrs = append(allErrs, apivalidation.ValidatePodTemplateSpec(&spec.Template, fldPath.Child("template"), opts)...) @@ -170,6 +189,7 @@ func ValidateJobSpecUpdate(spec, oldSpec batch.JobSpec, fldPath *field.Path, opt allErrs = append(allErrs, apivalidation.ValidateImmutableField(spec.Completions, oldSpec.Completions, fldPath.Child("completions"))...) allErrs = append(allErrs, apivalidation.ValidateImmutableField(spec.Selector, oldSpec.Selector, fldPath.Child("selector"))...) allErrs = append(allErrs, apivalidation.ValidateImmutableField(spec.Template, oldSpec.Template, fldPath.Child("template"))...) + allErrs = append(allErrs, apivalidation.ValidateImmutableField(spec.CompletionMode, oldSpec.CompletionMode, fldPath.Child("completionMode"))...) return allErrs } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/batch/zz_generated.deepcopy.go b/vendor/k8s.io/kubernetes/pkg/apis/batch/zz_generated.deepcopy.go index 594572443e53..4c414b2f6119 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/batch/zz_generated.deepcopy.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/batch/zz_generated.deepcopy.go @@ -136,6 +136,10 @@ func (in *CronJobStatus) DeepCopyInto(out *CronJobStatus) { in, out := &in.LastScheduleTime, &out.LastScheduleTime *out = (*in).DeepCopy() } + if in.LastSuccessfulTime != nil { + in, out := &in.LastSuccessfulTime, &out.LastSuccessfulTime + *out = (*in).DeepCopy() + } return } @@ -267,6 +271,16 @@ func (in *JobSpec) DeepCopyInto(out *JobSpec) { *out = new(int32) **out = **in } + if in.CompletionMode != nil { + in, out := &in.CompletionMode, &out.CompletionMode + *out = new(CompletionMode) + **out = **in + } + if in.Suspend != nil { + in, out := &in.Suspend, &out.Suspend + *out = new(bool) + **out = **in + } return } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/certificates/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/certificates/BUILD deleted file mode 100644 index 095b0363790a..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/certificates/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "helpers.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/certificates", - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/apis/certificates/fuzzer:all-srcs", - "//pkg/apis/certificates/install:all-srcs", - "//pkg/apis/certificates/v1:all-srcs", - "//pkg/apis/certificates/v1beta1:all-srcs", - "//pkg/apis/certificates/validation:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/certificates/install/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/certificates/install/BUILD deleted file mode 100644 index 18d52721e58f..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/certificates/install/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["install.go"], - importpath = "k8s.io/kubernetes/pkg/apis/certificates/install", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/certificates:go_default_library", - "//pkg/apis/certificates/v1:go_default_library", - "//pkg/apis/certificates/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/certificates/install/install.go b/vendor/k8s.io/kubernetes/pkg/apis/certificates/install/install.go index f4e9fcb9ce36..26ff90e836c0 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/certificates/install/install.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/certificates/install/install.go @@ -36,6 +36,5 @@ func Install(scheme *runtime.Scheme) { utilruntime.Must(certificates.AddToScheme(scheme)) utilruntime.Must(v1.AddToScheme(scheme)) utilruntime.Must(v1beta1.AddToScheme(scheme)) - // TODO(liggitt): prefer v1 in 1.20 - utilruntime.Must(scheme.SetVersionPriority(v1beta1.SchemeGroupVersion, v1.SchemeGroupVersion)) + utilruntime.Must(scheme.SetVersionPriority(v1.SchemeGroupVersion, v1beta1.SchemeGroupVersion)) } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/certificates/types.go b/vendor/k8s.io/kubernetes/pkg/apis/certificates/types.go index b616c000113f..a2a15a686497 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/certificates/types.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/certificates/types.go @@ -45,10 +45,27 @@ type CertificateSigningRequestSpec struct { // Base64-encoded PKCS#10 CSR data Request []byte - // Requested signer for the request. It is a qualified name in the form: - // `scope-hostname.io/name`. - // Distribution of trust for signers happens out of band. - // You can select on this field using `spec.signerName`. + // signerName indicates the requested signer, and is a qualified name. + // + // List/watch requests for CertificateSigningRequests can filter on this field using a "spec.signerName=NAME" fieldSelector. + // + // Well-known Kubernetes signers are: + // 1. "kubernetes.io/kube-apiserver-client": issues client certificates that can be used to authenticate to kube-apiserver. + // Requests for this signer are never auto-approved by kube-controller-manager, can be issued by the "csrsigning" controller in kube-controller-manager. + // 2. "kubernetes.io/kube-apiserver-client-kubelet": issues client certificates that kubelets use to authenticate to kube-apiserver. + // Requests for this signer can be auto-approved by the "csrapproving" controller in kube-controller-manager, and can be issued by the "csrsigning" controller in kube-controller-manager. + // 3. "kubernetes.io/kubelet-serving" issues serving certificates that kubelets use to serve TLS endpoints, which kube-apiserver can connect to securely. + // Requests for this signer are never auto-approved by kube-controller-manager, and can be issued by the "csrsigning" controller in kube-controller-manager. + // + // More details are available at https://k8s.io/docs/reference/access-authn-authz/certificate-signing-requests/#kubernetes-signers + // + // Custom signerNames can also be specified. The signer defines: + // 1. Trust distribution: how trust (CA bundles) are distributed. + // 2. Permitted subjects: and behavior when a disallowed subject is requested. + // 3. Required, permitted, or forbidden x509 extensions in the request (including whether subjectAltNames are allowed, which types, restrictions on allowed values) and behavior when a disallowed extension is requested. + // 4. Required, permitted, or forbidden key usages / extended key usages. + // 5. Expiration/certificate lifetime: whether it is fixed by the signer, configurable by the admin. + // 6. Whether or not requests for CA certificates are allowed. SignerName string // usages specifies a set of usage contexts the key will be diff --git a/vendor/k8s.io/kubernetes/pkg/apis/certificates/v1/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/certificates/v1/BUILD deleted file mode 100644 index 192bf1c11c2a..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/certificates/v1/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "defaults.go", - "doc.go", - "helpers.go", - "register.go", - "zz_generated.conversion.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/certificates/v1", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/certificates:go_default_library", - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/api/certificates/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/certificates/v1beta1/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/certificates/v1beta1/BUILD deleted file mode 100644 index d7349d8ea676..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/certificates/v1beta1/BUILD +++ /dev/null @@ -1,52 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "defaults.go", - "doc.go", - "helpers.go", - "register.go", - "zz_generated.conversion.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/certificates/v1beta1", - deps = [ - "//pkg/apis/certificates:go_default_library", - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/api/certificates/v1beta1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["defaults_test.go"], - embed = [":go_default_library"], - deps = ["//staging/src/k8s.io/api/certificates/v1beta1:go_default_library"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/certificates/validation/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/certificates/validation/BUILD deleted file mode 100644 index 690d2ff56bda..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/certificates/validation/BUILD +++ /dev/null @@ -1,54 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["validation.go"], - importpath = "k8s.io/kubernetes/pkg/apis/certificates/validation", - deps = [ - "//pkg/apis/certificates:go_default_library", - "//pkg/apis/certificates/v1beta1:go_default_library", - "//pkg/apis/core/validation:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/client-go/util/cert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["validation_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/certificates:go_default_library", - "//pkg/apis/certificates/v1beta1:go_default_library", - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/coordination/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/coordination/BUILD deleted file mode 100644 index 1057f03da57c..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/coordination/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/coordination", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/apis/coordination/install:all-srcs", - "//pkg/apis/coordination/v1:all-srcs", - "//pkg/apis/coordination/v1beta1:all-srcs", - "//pkg/apis/coordination/validation:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/coordination/install/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/coordination/install/BUILD deleted file mode 100644 index c33d0b010d08..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/coordination/install/BUILD +++ /dev/null @@ -1,30 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["install.go"], - importpath = "k8s.io/kubernetes/pkg/apis/coordination/install", - visibility = ["//visibility:public"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/coordination:go_default_library", - "//pkg/apis/coordination/v1:go_default_library", - "//pkg/apis/coordination/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/coordination/install/install.go b/vendor/k8s.io/kubernetes/pkg/apis/coordination/install/install.go index 5ef66bddd07b..378e50060a53 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/coordination/install/install.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/coordination/install/install.go @@ -23,7 +23,7 @@ import ( utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/apis/coordination" - "k8s.io/kubernetes/pkg/apis/coordination/v1" + v1 "k8s.io/kubernetes/pkg/apis/coordination/v1" "k8s.io/kubernetes/pkg/apis/coordination/v1beta1" ) @@ -36,5 +36,5 @@ func Install(scheme *runtime.Scheme) { utilruntime.Must(coordination.AddToScheme(scheme)) utilruntime.Must(v1beta1.AddToScheme(scheme)) utilruntime.Must(v1.AddToScheme(scheme)) - utilruntime.Must(scheme.SetVersionPriority(v1beta1.SchemeGroupVersion, v1.SchemeGroupVersion)) + utilruntime.Must(scheme.SetVersionPriority(v1.SchemeGroupVersion, v1beta1.SchemeGroupVersion)) } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/coordination/v1/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/coordination/v1/BUILD deleted file mode 100644 index 849c112322bc..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/coordination/v1/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "zz_generated.conversion.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/coordination/v1", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/coordination:go_default_library", - "//staging/src/k8s.io/api/coordination/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/coordination/v1beta1/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/coordination/v1beta1/BUILD deleted file mode 100644 index 41943830bfeb..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/coordination/v1beta1/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "zz_generated.conversion.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/coordination/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/coordination:go_default_library", - "//staging/src/k8s.io/api/coordination/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/coordination/validation/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/coordination/validation/BUILD deleted file mode 100644 index 666da2f783eb..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/coordination/validation/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["validation.go"], - importpath = "k8s.io/kubernetes/pkg/apis/coordination/validation", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/coordination:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["validation_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/coordination:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/core/BUILD deleted file mode 100644 index 6ca92930e7f5..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/core/BUILD +++ /dev/null @@ -1,60 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "annotation_key_constants.go", - "doc.go", - "field_constants.go", - "json.go", - "objectreference.go", - "register.go", - "resource.go", - "taint.go", - "toleration.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/core", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "taint_test.go", - "toleration_test.go", - ], - embed = [":go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/apis/core/fuzzer:all-srcs", - "//pkg/apis/core/helper:all-srcs", - "//pkg/apis/core/install:all-srcs", - "//pkg/apis/core/pods:all-srcs", - "//pkg/apis/core/v1:all-srcs", - "//pkg/apis/core/validation:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/OWNERS b/vendor/k8s.io/kubernetes/pkg/apis/core/OWNERS index a689545f7bfe..588a436a5f8c 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/core/OWNERS +++ b/vendor/k8s.io/kubernetes/pkg/apis/core/OWNERS @@ -19,8 +19,6 @@ reviewers: - vishh - mikedanese - liggitt -- nikhiljindal -- gmarek - erictune - davidopp - pmorie diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/annotation_key_constants.go b/vendor/k8s.io/kubernetes/pkg/apis/core/annotation_key_constants.go index df0c15fd69c6..baacf3f10cd5 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/core/annotation_key_constants.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/core/annotation_key_constants.go @@ -101,9 +101,32 @@ const ( // https://github.com/kubernetes/community/blob/master/sig-scalability/slos/network_programming_latency.md EndpointsLastChangeTriggerTime = "endpoints.kubernetes.io/last-change-trigger-time" + // EndpointsOverCapacity will be set on an Endpoints resource when it + // exceeds the maximum capacity of 1000 addresses. Inititially the Endpoints + // controller will set this annotation with a value of "warning". In a + // future release, the controller may set this annotation with a value of + // "truncated" to indicate that any addresses exceeding the limit of 1000 + // have been truncated from the Endpoints resource. + EndpointsOverCapacity = "endpoints.kubernetes.io/over-capacity" + // MigratedPluginsAnnotationKey is the annotation key, set for CSINode objects, that is a comma-separated // list of in-tree plugins that will be serviced by the CSI backend on the Node represented by CSINode. // This annotation is used by the Attach Detach Controller to determine whether to use the in-tree or // CSI Backend for a volume plugin on a specific node. MigratedPluginsAnnotationKey = "storage.alpha.kubernetes.io/migrated-plugins" + + // PodDeletionCost can be used to set to an int32 that represent the cost of deleting + // a pod compared to other pods belonging to the same ReplicaSet. Pods with lower + // deletion cost are preferred to be deleted before pods with higher deletion cost. + // Note that this is honored on a best-effort basis, and so it does not offer guarantees on + // pod deletion order. + // The implicit deletion cost for pods that don't set the annotation is 0, negative values are permitted. + // + // This annotation is alpha-level and is only honored when PodDeletionCost feature is enabled. + PodDeletionCost = "controller.kubernetes.io/pod-deletion-cost" + + // AnnotationTopologyAwareHints can be used to enable or disable Topology + // Aware Hints for a Service. This may be set to "auto" or "disabled". Any + // other value is treated as "disabled". + AnnotationTopologyAwareHints = "service.kubernetes.io/topology-aware-hints" ) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/field_constants.go b/vendor/k8s.io/kubernetes/pkg/apis/core/field_constants.go deleted file mode 100644 index a26f80568c0b..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/core/field_constants.go +++ /dev/null @@ -1,38 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package core - -// Field path constants that are specific to the internal API -// representation. -const ( - NodeUnschedulableField = "spec.unschedulable" - ObjectNameField = "metadata.name" - PodHostField = "spec.nodeName" - PodStatusField = "status.phase" - SecretTypeField = "type" - - EventReasonField = "action" - EventSourceField = "reportingComponent" - EventTypeField = "type" - EventInvolvedKindField = "involvedObject.kind" - EventInvolvedNamespaceField = "involvedObject.namespace" - EventInvolvedNameField = "involvedObject.name" - EventInvolvedUIDField = "involvedObject.uid" - EventInvolvedAPIVersionField = "involvedObject.apiVersion" - EventInvolvedResourceVersionField = "involvedObject.resourceVersion" - EventInvolvedFieldPathField = "involvedObject.fieldPath" -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/helper/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/core/helper/BUILD deleted file mode 100644 index d4fa9fea8631..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/core/helper/BUILD +++ /dev/null @@ -1,51 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["helpers_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["helpers.go"], - importpath = "k8s.io/kubernetes/pkg/apis/core/helper", - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/selection:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/apis/core/helper/qos:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/helper/helpers.go b/vendor/k8s.io/kubernetes/pkg/apis/core/helper/helpers.go index adf5f28eca48..3dbb49993ea6 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/core/helper/helpers.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/core/helper/helpers.go @@ -19,6 +19,7 @@ package helper import ( "encoding/json" "fmt" + "strconv" "strings" "k8s.io/apimachinery/pkg/api/resource" @@ -38,6 +39,21 @@ func IsHugePageResourceName(name core.ResourceName) bool { return strings.HasPrefix(string(name), core.ResourceHugePagesPrefix) } +// IsHugePageResourceValueDivisible returns true if the resource value of storage is +// integer multiple of page size. +func IsHugePageResourceValueDivisible(name core.ResourceName, quantity resource.Quantity) bool { + pageSize, err := HugePageSizeFromResourceName(name) + if err != nil { + return false + } + + if pageSize.Sign() <= 0 || pageSize.MilliValue()%int64(1000) != int64(0) { + return false + } + + return quantity.Value()%pageSize.Value() == 0 +} + // IsQuotaHugePageResourceName returns true if the resource name has the quota // related huge page resource prefix. func IsQuotaHugePageResourceName(name core.ResourceName) bool { @@ -107,8 +123,9 @@ var standardResourceQuotaScopes = sets.NewString( ) // IsStandardResourceQuotaScope returns true if the scope is a standard value -func IsStandardResourceQuotaScope(str string) bool { - return standardResourceQuotaScopes.Has(str) +func IsStandardResourceQuotaScope(str string, allowNamespaceAffinityScope bool) bool { + return standardResourceQuotaScopes.Has(str) || + (allowNamespaceAffinityScope && str == string(core.ResourceQuotaScopeCrossNamespacePodAffinity)) } var podObjectCountQuotaResources = sets.NewString( @@ -127,7 +144,8 @@ var podComputeQuotaResources = sets.NewString( // IsResourceQuotaScopeValidForResource returns true if the resource applies to the specified scope func IsResourceQuotaScopeValidForResource(scope core.ResourceQuotaScope, resource string) bool { switch scope { - case core.ResourceQuotaScopeTerminating, core.ResourceQuotaScopeNotTerminating, core.ResourceQuotaScopeNotBestEffort, core.ResourceQuotaScopePriorityClass: + case core.ResourceQuotaScopeTerminating, core.ResourceQuotaScopeNotTerminating, core.ResourceQuotaScopeNotBestEffort, + core.ResourceQuotaScopePriorityClass, core.ResourceQuotaScopeCrossNamespacePodAffinity: return podObjectCountQuotaResources.Has(resource) || podComputeQuotaResources.Has(resource) case core.ResourceQuotaScopeBestEffort: return podObjectCountQuotaResources.Has(resource) @@ -532,3 +550,29 @@ func ToPodResourcesSet(podSpec *core.PodSpec) sets.String { } return result } + +// GetDeletionCostFromPodAnnotations returns the integer value of pod-deletion-cost. Returns 0 +// if not set or the value is invalid. +func GetDeletionCostFromPodAnnotations(annotations map[string]string) (int32, error) { + if value, exist := annotations[core.PodDeletionCost]; exist { + // values that start with plus sign (e.g, "+10") or leading zeros (e.g., "008") are not valid. + if !validFirstDigit(value) { + return 0, fmt.Errorf("invalid value %q", value) + } + + i, err := strconv.ParseInt(value, 10, 32) + if err != nil { + // make sure we default to 0 on error. + return 0, err + } + return int32(i), nil + } + return 0, nil +} + +func validFirstDigit(str string) bool { + if len(str) == 0 { + return false + } + return str[0] == '-' || (str[0] == '0' && str == "0") || (str[0] >= '1' && str[0] <= '9') +} diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/helper/qos/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/core/helper/qos/BUILD deleted file mode 100644 index a2a24eda2da8..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/core/helper/qos/BUILD +++ /dev/null @@ -1,30 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["qos.go"], - importpath = "k8s.io/kubernetes/pkg/apis/core/helper/qos", - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/install/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/core/install/BUILD deleted file mode 100644 index 731869eb8a7c..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/core/install/BUILD +++ /dev/null @@ -1,47 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["install.go"], - importpath = "k8s.io/kubernetes/pkg/apis/core/install", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["install_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/install/OWNERS b/vendor/k8s.io/kubernetes/pkg/apis/core/install/OWNERS index dfbbe68a5165..e42e9dcf47af 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/core/install/OWNERS +++ b/vendor/k8s.io/kubernetes/pkg/apis/core/install/OWNERS @@ -6,5 +6,4 @@ reviewers: - deads2k - caesarxuchao - liggitt -- nikhiljindal - dims diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/pods/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/core/pods/BUILD deleted file mode 100644 index 3cb1591febda..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/core/pods/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["helpers.go"], - importpath = "k8s.io/kubernetes/pkg/apis/core/pods", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/features:go_default_library", - "//pkg/fieldpath:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["helpers_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/types.go b/vendor/k8s.io/kubernetes/pkg/apis/core/types.go index 7514c3cdd0dd..24d4f808c818 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/core/types.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/core/types.go @@ -157,7 +157,7 @@ type VolumeSource struct { // CSI (Container Storage Interface) represents ephemeral storage that is handled by certain external CSI drivers (Beta feature). // +optional CSI *CSIVolumeSource - // Ephemeral represents a volume that is handled by a cluster storage driver (Alpha feature). + // Ephemeral represents a volume that is handled by a cluster storage driver. // The volume's lifecycle is tied to the pod that defines it - it will be created before the pod starts, // and deleted when the pod is removed. // @@ -182,6 +182,9 @@ type VolumeSource struct { // A pod can use both types of ephemeral volumes and // persistent volumes at the same time. // + // This is a beta feature and only available when the GenericEphemeralVolume + // feature gate is enabled. + // // +optional Ephemeral *EphemeralVolumeSource } @@ -1717,11 +1720,6 @@ type EphemeralVolumeSource struct { // // Required, must not be nil. VolumeClaimTemplate *PersistentVolumeClaimTemplate - - // ReadOnly specifies a read-only configuration for the volume. - // Defaults to false (read/write). - // +optional - ReadOnly bool } // PersistentVolumeClaimTemplate is used to produce @@ -2022,6 +2020,17 @@ type Probe struct { // Minimum consecutive failures for the probe to be considered failed after having succeeded. // +optional FailureThreshold int32 + // Optional duration in seconds the pod needs to terminate gracefully upon probe failure. + // The grace period is the duration in seconds after the processes running in the pod are sent + // a termination signal and the time when the processes are forcibly halted with a kill signal. + // Set this value longer than the expected cleanup time for your process. + // If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this + // value overrides the value provided by the pod spec. + // Value must be non-negative integer. The value zero indicates stop immediately via + // the kill signal (no opportunity to shut down). + // This is an alpha field and requires enabling ProbeTerminationGracePeriod feature gate. + // +optional + TerminationGracePeriodSeconds *int64 } // PullPolicy describes a policy for if/when to pull a container image @@ -2553,8 +2562,10 @@ type PodAffinityTerm struct { // A label query over a set of resources, in this case pods. // +optional LabelSelector *metav1.LabelSelector - // namespaces specifies which namespaces the labelSelector applies to (matches against); - // null or empty list means "this pod's namespace" + // namespaces specifies a static list of namespace names that the term applies to. + // The term is applied to the union of the namespaces listed in this field + // and the ones selected by namespaceSelector. + // null or empty namespaces list and null namespaceSelector means "this pod's namespace" // +optional Namespaces []string // This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching @@ -2563,6 +2574,14 @@ type PodAffinityTerm struct { // selected pods is running. // Empty topologyKey is not allowed. TopologyKey string + // A label query over the set of namespaces that the term applies to. + // The term is applied to the union of the namespaces selected by this field + // and the ones listed in the namespaces field. + // null selector and null or empty namespaces list means "this pod's namespace". + // An empty selector ({}) matches all namespaces. + // This field is alpha-level and is only honored when PodAffinityNamespaceSelector feature is enabled. + // +optional + NamespaceSelector *metav1.LabelSelector } // NodeAffinity is a group of node affinity scheduling rules. @@ -2711,7 +2730,8 @@ type PodSpec struct { // +optional RestartPolicy RestartPolicy // Optional duration in seconds the pod needs to terminate gracefully. May be decreased in delete request. - // Value must be non-negative integer. The value zero indicates delete immediately. + // Value must be non-negative integer. The value zero indicates stop immediately via the kill + // signal (no opportunity to shut down). // If this value is nil, the default grace period will be used instead. // The grace period is the duration in seconds after the processes running in the pod are sent // a termination signal and the time when the processes are forcibly halted with a kill signal. @@ -3465,6 +3485,19 @@ const ( ServiceTypeExternalName ServiceType = "ExternalName" ) +// ServiceInternalTrafficPolicyType describes the type of traffic routing for +// internal traffic +type ServiceInternalTrafficPolicyType string + +const ( + // ServiceInternalTrafficPolicyCluster routes traffic to all endpoints + ServiceInternalTrafficPolicyCluster ServiceInternalTrafficPolicyType = "Cluster" + + // ServiceInternalTrafficPolicyLocal only routes to node-local + // endpoints, otherwise drops the traffic + ServiceInternalTrafficPolicyLocal ServiceInternalTrafficPolicyType = "Local" +) + // ServiceExternalTrafficPolicyType string type ServiceExternalTrafficPolicyType string @@ -3706,6 +3739,7 @@ type ServiceSpec struct { // value, if used, only makes sense as the last value in the list. // If this is not specified or empty, no topology constraints will be applied. // This field is alpha-level and is only honored by servers that enable the ServiceTopology feature. + // This field is deprecated and will be removed in a future version. // +optional TopologyKeys []string @@ -3717,6 +3751,30 @@ type ServiceSpec struct { // This field is alpha-level and is only honored by servers that enable the ServiceLBNodePortControl feature. // +optional AllocateLoadBalancerNodePorts *bool + + // loadBalancerClass is the class of the load balancer implementation this Service belongs to. + // If specified, the value of this field must be a label-style identifier, with an optional prefix, + // e.g. "internal-vip" or "example.com/internal-vip". Unprefixed names are reserved for end-users. + // This field can only be set when the Service type is 'LoadBalancer'. If not set, the default load + // balancer implementation is used, today this is typically done through the cloud provider integration, + // but should apply for any default implementation. If set, it is assumed that a load balancer + // implementation is watching for Services with a matching class. Any default load balancer + // implementation (e.g. cloud providers) should ignore Services that set this field. + // This field can only be set when creating or updating a Service to type 'LoadBalancer'. + // Once set, it can not be changed. This field will be wiped when a service is updated to a non 'LoadBalancer' type. + // +featureGate=LoadBalancerClass + // +optional + LoadBalancerClass *string + + // InternalTrafficPolicy specifies if the cluster internal traffic + // should be routed to all endpoints or node-local endpoints only. + // "Cluster" routes internal traffic to a Service to all endpoints. + // "Local" routes traffic to node-local endpoints only, traffic is + // dropped if no node-local endpoints are ready. + // The default value is "Cluster". + // +featureGate=ServiceInternalTrafficPolicy + // +optional + InternalTrafficPolicy *ServiceInternalTrafficPolicyType } // ServicePort represents the port on which the service is exposed @@ -4831,9 +4889,9 @@ type ResourceQuotaScope string // These are valid values for resource quota spec const ( - // Match all pod objects where spec.activeDeadlineSeconds + // Match all pod objects where spec.activeDeadlineSeconds >=0 ResourceQuotaScopeTerminating ResourceQuotaScope = "Terminating" - // Match all pod objects where !spec.activeDeadlineSeconds + // Match all pod objects where spec.activeDeadlineSeconds is nil ResourceQuotaScopeNotTerminating ResourceQuotaScope = "NotTerminating" // Match all pod objects that have best effort quality of service ResourceQuotaScopeBestEffort ResourceQuotaScope = "BestEffort" @@ -4841,6 +4899,9 @@ const ( ResourceQuotaScopeNotBestEffort ResourceQuotaScope = "NotBestEffort" // Match all pod objects that have priority class mentioned ResourceQuotaScopePriorityClass ResourceQuotaScope = "PriorityClass" + // Match all pod objects that have cross-namespace pod (anti)affinity mentioned + // This is an alpha feature enabled by the PodAffinityNamespaceSelector feature flag. + ResourceQuotaScopeCrossNamespacePodAffinity ResourceQuotaScope = "CrossNamespacePodAffinity" ) // ResourceQuotaSpec defines the desired hard limits to enforce for Quota @@ -4944,7 +5005,6 @@ type Secret struct { // Immutable field, if set, ensures that data stored in the Secret cannot // be updated (only object metadata can be modified). - // This is a beta field enabled by ImmutableEphemeralVolumes feature gate. // +optional Immutable *bool @@ -5072,7 +5132,6 @@ type ConfigMap struct { // Immutable field, if set, ensures that data stored in the ConfigMap cannot // be updated (only object metadata can be modified). - // This is a beta field enabled by ImmutableEphemeralVolumes feature gate. // +optional Immutable *bool @@ -5332,9 +5391,6 @@ type RangeAllocation struct { } const ( - // DefaultSchedulerName defines the name of default scheduler. - DefaultSchedulerName = "default-scheduler" - // DefaultHardPodAffinitySymmetricWeight is the weight of implicit PreferredDuringScheduling affinity rule. // // RequiredDuringScheduling affinity is not symmetric, but there is an implicit PreferredDuringScheduling affinity rule diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/v1/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/core/v1/BUILD deleted file mode 100644 index 2e20bd610c37..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/core/v1/BUILD +++ /dev/null @@ -1,81 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "defaults.go", - "doc.go", - "register.go", - "zz_generated.conversion.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/core/v1", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/apps:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/features:go_default_library", - "//pkg/util/parsers:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "conversion_test.go", - "defaults_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/apps:go_default_library", - "//pkg/apis/apps/install:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/fuzzer:go_default_library", - "//pkg/apis/core/install:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/apitesting/fuzzer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/fuzzer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/apis/core/v1/helper:all-srcs", - "//pkg/apis/core/v1/validation:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/v1/OWNERS b/vendor/k8s.io/kubernetes/pkg/apis/core/v1/OWNERS index 66ba3983fad3..9f10db4dddd1 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/core/v1/OWNERS +++ b/vendor/k8s.io/kubernetes/pkg/apis/core/v1/OWNERS @@ -13,8 +13,6 @@ reviewers: - vishh - mikedanese - liggitt -- nikhiljindal -- gmarek - erictune - davidopp - pmorie @@ -30,7 +28,6 @@ reviewers: - jsafrane - dims - errordeveloper -- madhusudancs - krousey - jayunit100 - rootfs diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/v1/defaults.go b/vendor/k8s.io/kubernetes/pkg/apis/core/v1/defaults.go index 28ceb24244ea..dc936458708d 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/core/v1/defaults.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/core/v1/defaults.go @@ -131,35 +131,9 @@ func SetDefaults_Service(obj *v1.Service) { obj.Spec.ExternalTrafficPolicy = v1.ServiceExternalTrafficPolicyTypeCluster } - if utilfeature.DefaultFeatureGate.Enabled(features.IPv6DualStack) { - // Default obj.Spec.IPFamilyPolicy if we *know* we can, otherwise it will - // be handled later in allocation. - if obj.Spec.Type != v1.ServiceTypeExternalName { - if obj.Spec.IPFamilyPolicy == nil { - if len(obj.Spec.ClusterIPs) == 2 || len(obj.Spec.IPFamilies) == 2 { - requireDualStack := v1.IPFamilyPolicyRequireDualStack - obj.Spec.IPFamilyPolicy = &requireDualStack - } - } - - // If the user demanded dual-stack, but only specified one family, we add - // the other. - if obj.Spec.IPFamilyPolicy != nil && *(obj.Spec.IPFamilyPolicy) == v1.IPFamilyPolicyRequireDualStack && len(obj.Spec.IPFamilies) == 1 { - if obj.Spec.IPFamilies[0] == v1.IPv4Protocol { - obj.Spec.IPFamilies = append(obj.Spec.IPFamilies, v1.IPv6Protocol) - } else { - obj.Spec.IPFamilies = append(obj.Spec.IPFamilies, v1.IPv4Protocol) - } - - // Any other dual-stack defaulting depends on cluster configuration. - // Further IPFamilies, IPFamilyPolicy defaulting is in ClusterIP alloc/reserve logic - // NOTE: strategy handles cases where ClusterIPs is used (but not ClusterIP). - } - } - - // any other defaulting depends on cluster configuration. - // further IPFamilies, IPFamilyPolicy defaulting is in ClusterIP alloc/reserve logic - // note: conversion logic handles cases where ClusterIPs is used (but not ClusterIP). + if utilfeature.DefaultFeatureGate.Enabled(features.ServiceInternalTrafficPolicy) && obj.Spec.InternalTrafficPolicy == nil { + serviceInternalTrafficPolicyCluster := v1.ServiceInternalTrafficPolicyCluster + obj.Spec.InternalTrafficPolicy = &serviceInternalTrafficPolicyCluster } if utilfeature.DefaultFeatureGate.Enabled(features.ServiceLBNodePortControl) { @@ -349,6 +323,26 @@ func SetDefaults_HTTPGetAction(obj *v1.HTTPGetAction) { obj.Scheme = v1.URISchemeHTTP } } + +// SetDefaults_Namespace adds a default label for all namespaces +func SetDefaults_Namespace(obj *v1.Namespace) { + // TODO, remove the feature gate in 1.22 + // we can't SetDefaults for nameless namespaces (generateName). + // This code needs to be kept in sync with the implementation that exists + // in Namespace Canonicalize strategy (pkg/registry/core/namespace) + + // note that this can result in many calls to feature enablement in some cases, but + // we assume that there's no real cost there. + if utilfeature.DefaultFeatureGate.Enabled(features.NamespaceDefaultLabelName) { + if len(obj.Name) > 0 { + if obj.Labels == nil { + obj.Labels = map[string]string{} + } + obj.Labels[v1.LabelMetadataName] = obj.Name + } + } +} + func SetDefaults_NamespaceStatus(obj *v1.NamespaceStatus) { if obj.Phase == "" { obj.Phase = v1.NamespaceActive diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/v1/helper/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/core/v1/helper/BUILD deleted file mode 100644 index 0067d3d52707..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/core/v1/helper/BUILD +++ /dev/null @@ -1,49 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["helpers_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["helpers.go"], - importpath = "k8s.io/kubernetes/pkg/apis/core/v1/helper", - deps = [ - "//pkg/apis/core/helper:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/selection:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/apis/core/v1/helper/qos:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/v1/helper/helpers.go b/vendor/k8s.io/kubernetes/pkg/apis/core/v1/helper/helpers.go index 46db0bfae2b3..53446fff9b3a 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/core/v1/helper/helpers.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/core/v1/helper/helpers.go @@ -17,7 +17,6 @@ limitations under the License. package helper import ( - "encoding/json" "fmt" "strings" @@ -317,53 +316,6 @@ func AddOrUpdateTolerationInPod(pod *v1.Pod, toleration *v1.Toleration) bool { return AddOrUpdateTolerationInPodSpec(&pod.Spec, toleration) } -// TolerationsTolerateTaint checks if taint is tolerated by any of the tolerations. -func TolerationsTolerateTaint(tolerations []v1.Toleration, taint *v1.Taint) bool { - for i := range tolerations { - if tolerations[i].ToleratesTaint(taint) { - return true - } - } - return false -} - -type taintsFilterFunc func(*v1.Taint) bool - -// TolerationsTolerateTaintsWithFilter checks if given tolerations tolerates -// all the taints that apply to the filter in given taint list. -// DEPRECATED: Please use FindMatchingUntoleratedTaint instead. -func TolerationsTolerateTaintsWithFilter(tolerations []v1.Toleration, taints []v1.Taint, applyFilter taintsFilterFunc) bool { - _, isUntolerated := FindMatchingUntoleratedTaint(taints, tolerations, applyFilter) - return !isUntolerated -} - -// FindMatchingUntoleratedTaint checks if the given tolerations tolerates -// all the filtered taints, and returns the first taint without a toleration -func FindMatchingUntoleratedTaint(taints []v1.Taint, tolerations []v1.Toleration, inclusionFilter taintsFilterFunc) (v1.Taint, bool) { - filteredTaints := getFilteredTaints(taints, inclusionFilter) - for _, taint := range filteredTaints { - if !TolerationsTolerateTaint(tolerations, &taint) { - return taint, true - } - } - return v1.Taint{}, false -} - -// getFilteredTaints returns a list of taints satisfying the filter predicate -func getFilteredTaints(taints []v1.Taint, inclusionFilter taintsFilterFunc) []v1.Taint { - if inclusionFilter == nil { - return taints - } - filteredTaints := []v1.Taint{} - for _, taint := range taints { - if !inclusionFilter(&taint) { - continue - } - filteredTaints = append(filteredTaints, taint) - } - return filteredTaints -} - // GetMatchingTolerations returns true and list of Tolerations matching all Taints if all are tolerated, or false otherwise. func GetMatchingTolerations(taints []v1.Taint, tolerations []v1.Toleration) (bool, []v1.Toleration) { if len(taints) == 0 { @@ -389,44 +341,6 @@ func GetMatchingTolerations(taints []v1.Taint, tolerations []v1.Toleration) (boo return true, result } -// GetAvoidPodsFromNodeAnnotations scans the list of annotations and -// returns the pods that needs to be avoided for this node from scheduling -func GetAvoidPodsFromNodeAnnotations(annotations map[string]string) (v1.AvoidPods, error) { - var avoidPods v1.AvoidPods - if len(annotations) > 0 && annotations[v1.PreferAvoidPodsAnnotationKey] != "" { - err := json.Unmarshal([]byte(annotations[v1.PreferAvoidPodsAnnotationKey]), &avoidPods) - if err != nil { - return avoidPods, err - } - } - return avoidPods, nil -} - -// GetPersistentVolumeClass returns StorageClassName. -func GetPersistentVolumeClass(volume *v1.PersistentVolume) string { - // Use beta annotation first - if class, found := volume.Annotations[v1.BetaStorageClassAnnotation]; found { - return class - } - - return volume.Spec.StorageClassName -} - -// GetPersistentVolumeClaimClass returns StorageClassName. If no storage class was -// requested, it returns "". -func GetPersistentVolumeClaimClass(claim *v1.PersistentVolumeClaim) string { - // Use beta annotation first - if class, found := claim.Annotations[v1.BetaStorageClassAnnotation]; found { - return class - } - - if claim.Spec.StorageClassName != nil { - return *claim.Spec.StorageClassName - } - - return "" -} - // ScopedResourceSelectorRequirementsAsSelector converts the ScopedResourceSelectorRequirement api type into a struct that implements // labels.Selector. func ScopedResourceSelectorRequirementsAsSelector(ssr v1.ScopedResourceSelectorRequirement) (labels.Selector, error) { diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/v1/helper/qos/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/core/v1/helper/qos/BUILD deleted file mode 100644 index 38108d7026ea..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/core/v1/helper/qos/BUILD +++ /dev/null @@ -1,46 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["qos_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/helper/qos:go_default_library", - "//pkg/apis/core/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["qos.go"], - importpath = "k8s.io/kubernetes/pkg/apis/core/v1/helper/qos", - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/v1/validation/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/core/v1/validation/BUILD deleted file mode 100644 index b006232eec97..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/core/v1/validation/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["validation.go"], - importpath = "k8s.io/kubernetes/pkg/apis/core/v1/validation", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/core/helper:go_default_library", - "//pkg/apis/core/v1/helper:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["validation_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/v1/zz_generated.conversion.go b/vendor/k8s.io/kubernetes/pkg/apis/core/v1/zz_generated.conversion.go index f0792ba9aa77..b53e875857f3 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/core/v1/zz_generated.conversion.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/core/v1/zz_generated.conversion.go @@ -3546,7 +3546,6 @@ func Convert_core_EphemeralContainers_To_v1_EphemeralContainers(in *core.Ephemer func autoConvert_v1_EphemeralVolumeSource_To_core_EphemeralVolumeSource(in *v1.EphemeralVolumeSource, out *core.EphemeralVolumeSource, s conversion.Scope) error { out.VolumeClaimTemplate = (*core.PersistentVolumeClaimTemplate)(unsafe.Pointer(in.VolumeClaimTemplate)) - out.ReadOnly = in.ReadOnly return nil } @@ -3557,7 +3556,6 @@ func Convert_v1_EphemeralVolumeSource_To_core_EphemeralVolumeSource(in *v1.Ephem func autoConvert_core_EphemeralVolumeSource_To_v1_EphemeralVolumeSource(in *core.EphemeralVolumeSource, out *v1.EphemeralVolumeSource, s conversion.Scope) error { out.VolumeClaimTemplate = (*v1.PersistentVolumeClaimTemplate)(unsafe.Pointer(in.VolumeClaimTemplate)) - out.ReadOnly = in.ReadOnly return nil } @@ -5479,6 +5477,7 @@ func autoConvert_v1_PodAffinityTerm_To_core_PodAffinityTerm(in *v1.PodAffinityTe out.LabelSelector = (*metav1.LabelSelector)(unsafe.Pointer(in.LabelSelector)) out.Namespaces = *(*[]string)(unsafe.Pointer(&in.Namespaces)) out.TopologyKey = in.TopologyKey + out.NamespaceSelector = (*metav1.LabelSelector)(unsafe.Pointer(in.NamespaceSelector)) return nil } @@ -5491,6 +5490,7 @@ func autoConvert_core_PodAffinityTerm_To_v1_PodAffinityTerm(in *core.PodAffinity out.LabelSelector = (*metav1.LabelSelector)(unsafe.Pointer(in.LabelSelector)) out.Namespaces = *(*[]string)(unsafe.Pointer(&in.Namespaces)) out.TopologyKey = in.TopologyKey + out.NamespaceSelector = (*metav1.LabelSelector)(unsafe.Pointer(in.NamespaceSelector)) return nil } @@ -6467,6 +6467,7 @@ func autoConvert_v1_Probe_To_core_Probe(in *v1.Probe, out *core.Probe, s convers out.PeriodSeconds = in.PeriodSeconds out.SuccessThreshold = in.SuccessThreshold out.FailureThreshold = in.FailureThreshold + out.TerminationGracePeriodSeconds = (*int64)(unsafe.Pointer(in.TerminationGracePeriodSeconds)) return nil } @@ -6484,6 +6485,7 @@ func autoConvert_core_Probe_To_v1_Probe(in *core.Probe, out *v1.Probe, s convers out.PeriodSeconds = in.PeriodSeconds out.SuccessThreshold = in.SuccessThreshold out.FailureThreshold = in.FailureThreshold + out.TerminationGracePeriodSeconds = (*int64)(unsafe.Pointer(in.TerminationGracePeriodSeconds)) return nil } @@ -7633,6 +7635,8 @@ func autoConvert_v1_ServiceSpec_To_core_ServiceSpec(in *v1.ServiceSpec, out *cor out.IPFamilies = *(*[]core.IPFamily)(unsafe.Pointer(&in.IPFamilies)) out.IPFamilyPolicy = (*core.IPFamilyPolicyType)(unsafe.Pointer(in.IPFamilyPolicy)) out.AllocateLoadBalancerNodePorts = (*bool)(unsafe.Pointer(in.AllocateLoadBalancerNodePorts)) + out.LoadBalancerClass = (*string)(unsafe.Pointer(in.LoadBalancerClass)) + out.InternalTrafficPolicy = (*core.ServiceInternalTrafficPolicyType)(unsafe.Pointer(in.InternalTrafficPolicy)) return nil } @@ -7660,6 +7664,8 @@ func autoConvert_core_ServiceSpec_To_v1_ServiceSpec(in *core.ServiceSpec, out *v out.PublishNotReadyAddresses = in.PublishNotReadyAddresses out.TopologyKeys = *(*[]string)(unsafe.Pointer(&in.TopologyKeys)) out.AllocateLoadBalancerNodePorts = (*bool)(unsafe.Pointer(in.AllocateLoadBalancerNodePorts)) + out.LoadBalancerClass = (*string)(unsafe.Pointer(in.LoadBalancerClass)) + out.InternalTrafficPolicy = (*v1.ServiceInternalTrafficPolicyType)(unsafe.Pointer(in.InternalTrafficPolicy)) return nil } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/v1/zz_generated.defaults.go b/vendor/k8s.io/kubernetes/pkg/apis/core/v1/zz_generated.defaults.go index 89f45a026b69..68e2a32aacc7 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/core/v1/zz_generated.defaults.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/core/v1/zz_generated.defaults.go @@ -21,8 +21,6 @@ limitations under the License. package v1 import ( - "reflect" - v1 "k8s.io/api/core/v1" runtime "k8s.io/apimachinery/pkg/runtime" ) @@ -93,7 +91,7 @@ func SetObjectDefaults_EphemeralContainers(in *v1.EphemeralContainers) { SetDefaults_EphemeralContainer(a) for j := range a.EphemeralContainerCommon.Ports { b := &a.EphemeralContainerCommon.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -160,6 +158,7 @@ func SetObjectDefaults_LimitRangeList(in *v1.LimitRangeList) { } func SetObjectDefaults_Namespace(in *v1.Namespace) { + SetDefaults_Namespace(in) SetDefaults_NamespaceStatus(&in.Status) } @@ -291,7 +290,7 @@ func SetObjectDefaults_Pod(in *v1.Pod) { SetDefaults_Container(a) for j := range a.Ports { b := &a.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -341,7 +340,7 @@ func SetObjectDefaults_Pod(in *v1.Pod) { SetDefaults_Container(a) for j := range a.Ports { b := &a.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -391,7 +390,7 @@ func SetObjectDefaults_Pod(in *v1.Pod) { SetDefaults_EphemeralContainer(a) for j := range a.EphemeralContainerCommon.Ports { b := &a.EphemeralContainerCommon.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -511,7 +510,7 @@ func SetObjectDefaults_PodTemplate(in *v1.PodTemplate) { SetDefaults_Container(a) for j := range a.Ports { b := &a.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -561,7 +560,7 @@ func SetObjectDefaults_PodTemplate(in *v1.PodTemplate) { SetDefaults_Container(a) for j := range a.Ports { b := &a.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -611,7 +610,7 @@ func SetObjectDefaults_PodTemplate(in *v1.PodTemplate) { SetDefaults_EphemeralContainer(a) for j := range a.EphemeralContainerCommon.Ports { b := &a.EphemeralContainerCommon.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -733,7 +732,7 @@ func SetObjectDefaults_ReplicationController(in *v1.ReplicationController) { SetDefaults_Container(a) for j := range a.Ports { b := &a.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -783,7 +782,7 @@ func SetObjectDefaults_ReplicationController(in *v1.ReplicationController) { SetDefaults_Container(a) for j := range a.Ports { b := &a.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -833,7 +832,7 @@ func SetObjectDefaults_ReplicationController(in *v1.ReplicationController) { SetDefaults_EphemeralContainer(a) for j := range a.EphemeralContainerCommon.Ports { b := &a.EphemeralContainerCommon.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -915,6 +914,12 @@ func SetObjectDefaults_SecretList(in *v1.SecretList) { func SetObjectDefaults_Service(in *v1.Service) { SetDefaults_Service(in) + for i := range in.Spec.Ports { + a := &in.Spec.Ports[i] + if a.Protocol == "" { + a.Protocol = "TCP" + } + } } func SetObjectDefaults_ServiceList(in *v1.ServiceList) { diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/validation/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/core/validation/BUILD deleted file mode 100644 index 70d2bd71733c..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/core/validation/BUILD +++ /dev/null @@ -1,88 +0,0 @@ -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "conditional_validation.go", - "doc.go", - "events.go", - "validation.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/core/validation", - visibility = ["//visibility:public"], - deps = [ - "//pkg/api/service:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/helper:go_default_library", - "//pkg/apis/core/pods:go_default_library", - "//pkg/apis/core/v1:go_default_library", - "//pkg/apis/core/v1/helper:go_default_library", - "//pkg/capabilities:go_default_library", - "//pkg/cluster/ports:go_default_library", - "//pkg/features:go_default_library", - "//pkg/fieldpath:go_default_library", - "//pkg/security/apparmor:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/events/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "conditional_validation_test.go", - "events_test.go", - "validation_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/capabilities:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/events/v1:go_default_library", - "//staging/src/k8s.io/api/events/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/validation/OWNERS b/vendor/k8s.io/kubernetes/pkg/apis/core/validation/OWNERS index 861d1efdce89..c3b5996db8a9 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/core/validation/OWNERS +++ b/vendor/k8s.io/kubernetes/pkg/apis/core/validation/OWNERS @@ -13,8 +13,6 @@ reviewers: - vishh - mikedanese - liggitt -- nikhiljindal -- gmarek - erictune - davidopp - pmorie diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/validation/validation.go b/vendor/k8s.io/kubernetes/pkg/apis/core/validation/validation.go index fd3477176a4c..57292c5f3674 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/core/validation/validation.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/core/validation/validation.go @@ -29,8 +29,6 @@ import ( "unicode" "unicode/utf8" - "k8s.io/klog/v2" - v1 "k8s.io/api/core/v1" apiequality "k8s.io/apimachinery/pkg/api/equality" "k8s.io/apimachinery/pkg/api/resource" @@ -45,6 +43,7 @@ import ( "k8s.io/apimachinery/pkg/util/validation" "k8s.io/apimachinery/pkg/util/validation/field" utilfeature "k8s.io/apiserver/pkg/util/feature" + schedulinghelper "k8s.io/component-helpers/scheduling/corev1" apiservice "k8s.io/kubernetes/pkg/api/service" "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/apis/core/helper" @@ -121,6 +120,15 @@ func ValidateDNS1123Label(value string, fldPath *field.Path) field.ErrorList { return allErrs } +// ValidateQualifiedName validates if name is what Kubernetes calls a "qualified name". +func ValidateQualifiedName(value string, fldPath *field.Path) field.ErrorList { + allErrs := field.ErrorList{} + for _, msg := range validation.IsQualifiedName(value) { + allErrs = append(allErrs, field.Invalid(fldPath, value, msg)) + } + return allErrs +} + // ValidateDNS1123Subdomain validates that a name is a proper DNS subdomain. func ValidateDNS1123Subdomain(value string, fldPath *field.Path) field.ErrorList { allErrs := field.ErrorList{} @@ -130,7 +138,7 @@ func ValidateDNS1123Subdomain(value string, fldPath *field.Path) field.ErrorList return allErrs } -func ValidatePodSpecificAnnotations(annotations map[string]string, spec *core.PodSpec, fldPath *field.Path) field.ErrorList { +func ValidatePodSpecificAnnotations(annotations map[string]string, spec *core.PodSpec, fldPath *field.Path, opts PodValidationOptions) field.ErrorList { allErrs := field.ErrorList{} if value, isMirror := annotations[core.MirrorPodAnnotationKey]; isMirror { @@ -143,6 +151,12 @@ func ValidatePodSpecificAnnotations(annotations map[string]string, spec *core.Po allErrs = append(allErrs, ValidateTolerationsInPodAnnotations(annotations, fldPath)...) } + if !opts.AllowInvalidPodDeletionCost { + if _, err := helper.GetDeletionCostFromPodAnnotations(annotations); err != nil { + allErrs = append(allErrs, field.Invalid(fldPath.Key(core.PodDeletionCost), annotations[core.PodDeletionCost], "must be a 32bit integer")) + } + } + allErrs = append(allErrs, ValidateSeccompPodAnnotations(annotations, fldPath)...) allErrs = append(allErrs, ValidateAppArmorPodAnnotations(annotations, spec, fldPath)...) @@ -166,7 +180,7 @@ func ValidateTolerationsInPodAnnotations(annotations map[string]string, fldPath return allErrs } -func ValidatePodSpecificAnnotationUpdates(newPod, oldPod *core.Pod, fldPath *field.Path) field.ErrorList { +func ValidatePodSpecificAnnotationUpdates(newPod, oldPod *core.Pod, fldPath *field.Path, opts PodValidationOptions) field.ErrorList { allErrs := field.ErrorList{} newAnnotations := newPod.Annotations oldAnnotations := oldPod.Annotations @@ -193,7 +207,7 @@ func ValidatePodSpecificAnnotationUpdates(newPod, oldPod *core.Pod, fldPath *fie allErrs = append(allErrs, field.Forbidden(fldPath.Key(k), "may not add mirror pod annotation")) } } - allErrs = append(allErrs, ValidatePodSpecificAnnotations(newAnnotations, &newPod.Spec, fldPath)...) + allErrs = append(allErrs, ValidatePodSpecificAnnotations(newAnnotations, &newPod.Spec, fldPath, opts)...) return allErrs } @@ -285,9 +299,9 @@ func ValidateRuntimeClassName(name string, fldPath *field.Path) field.ErrorList } // validateOverhead can be used to check whether the given Overhead is valid. -func validateOverhead(overhead core.ResourceList, fldPath *field.Path) field.ErrorList { +func validateOverhead(overhead core.ResourceList, fldPath *field.Path, opts PodValidationOptions) field.ErrorList { // reuse the ResourceRequirements validation logic - return ValidateResourceRequirements(&core.ResourceRequirements{Limits: overhead}, fldPath) + return ValidateResourceRequirements(&core.ResourceRequirements{Limits: overhead}, fldPath, opts) } // Validates that given value is not negative. @@ -1944,13 +1958,11 @@ func ValidatePersistentVolumeUpdate(newPv, oldPv *core.PersistentVolume) field.E } // ValidatePersistentVolumeStatusUpdate tests to see if the status update is legal for an end user to make. -// newPv is updated with fields that cannot be changed. func ValidatePersistentVolumeStatusUpdate(newPv, oldPv *core.PersistentVolume) field.ErrorList { allErrs := ValidateObjectMetaUpdate(&newPv.ObjectMeta, &oldPv.ObjectMeta, field.NewPath("metadata")) if len(newPv.ResourceVersion) == 0 { allErrs = append(allErrs, field.Required(field.NewPath("resourceVersion"), "")) } - newPv.Spec = oldPv.Spec return allErrs } @@ -2023,7 +2035,7 @@ func ValidatePersistentVolumeClaimUpdate(newPvc, oldPvc *core.PersistentVolumeCl // Claims are immutable in order to enforce quota, range limits, etc. without gaming the system. if len(oldPvc.Spec.VolumeName) == 0 { // volumeName changes are allowed once. - oldPvcClone.Spec.VolumeName = newPvcClone.Spec.VolumeName + oldPvcClone.Spec.VolumeName = newPvcClone.Spec.VolumeName // +k8s:verify-mutation:reason=clone } if validateStorageClassUpgrade(oldPvcClone.Annotations, newPvcClone.Annotations, @@ -2039,7 +2051,7 @@ func ValidatePersistentVolumeClaimUpdate(newPvc, oldPvc *core.PersistentVolumeCl if utilfeature.DefaultFeatureGate.Enabled(features.ExpandPersistentVolumes) { // lets make sure storage values are same. if newPvc.Status.Phase == core.ClaimBound && newPvcClone.Spec.Resources.Requests != nil { - newPvcClone.Spec.Resources.Requests["storage"] = oldPvc.Spec.Resources.Requests["storage"] + newPvcClone.Spec.Resources.Requests["storage"] = oldPvc.Spec.Resources.Requests["storage"] // +k8s:verify-mutation:reason=clone } oldSize := oldPvc.Spec.Resources.Requests["storage"] @@ -2096,7 +2108,6 @@ func ValidatePersistentVolumeClaimStatusUpdate(newPvc, oldPvc *core.PersistentVo for r, qty := range newPvc.Status.Capacity { allErrs = append(allErrs, validateBasicResource(qty, capPath.Key(string(r)))...) } - newPvc.Spec = oldPvc.Spec return allErrs } @@ -2419,13 +2430,13 @@ func GetVolumeMountMap(mounts []core.VolumeMount) map[string]string { } func GetVolumeDeviceMap(devices []core.VolumeDevice) map[string]string { - voldevices := make(map[string]string) + volDevices := make(map[string]string) for _, dev := range devices { - voldevices[dev.Name] = dev.DevicePath + volDevices[dev.Name] = dev.DevicePath } - return voldevices + return volDevices } func ValidateVolumeMounts(mounts []core.VolumeMount, voldevices map[string]string, volumes map[string]core.VolumeSource, container *core.Container, fldPath *field.Path) field.ErrorList { @@ -2848,6 +2859,11 @@ func validateContainers(containers []core.Container, isInitContainers bool, volu allErrs = append(allErrs, validateLifecycle(ctr.Lifecycle, idxPath.Child("lifecycle"))...) } allErrs = append(allErrs, validateProbe(ctr.LivenessProbe, idxPath.Child("livenessProbe"))...) + // Readiness-specific validation + if ctr.ReadinessProbe != nil && ctr.ReadinessProbe.TerminationGracePeriodSeconds != nil { + allErrs = append(allErrs, field.Invalid(idxPath.Child("readinessProbe", "terminationGracePeriodSeconds"), ctr.ReadinessProbe.TerminationGracePeriodSeconds, "must not be set for readinessProbes")) + } + allErrs = append(allErrs, validateProbe(ctr.StartupProbe, idxPath.Child("startupProbe"))...) // Liveness-specific validation if ctr.LivenessProbe != nil && ctr.LivenessProbe.SuccessThreshold != 1 { allErrs = append(allErrs, field.Invalid(idxPath.Child("livenessProbe", "successThreshold"), ctr.LivenessProbe.SuccessThreshold, "must be 1")) @@ -2873,7 +2889,7 @@ func validateContainers(containers []core.Container, isInitContainers bool, volu allErrs = append(allErrs, ValidateVolumeMounts(ctr.VolumeMounts, volDevices, volumes, &ctr, idxPath.Child("volumeMounts"))...) allErrs = append(allErrs, ValidateVolumeDevices(ctr.VolumeDevices, volMounts, volumes, idxPath.Child("volumeDevices"))...) allErrs = append(allErrs, validatePullPolicy(ctr.ImagePullPolicy, idxPath.Child("imagePullPolicy"))...) - allErrs = append(allErrs, ValidateResourceRequirements(&ctr.Resources, idxPath.Child("resources"))...) + allErrs = append(allErrs, ValidateResourceRequirements(&ctr.Resources, idxPath.Child("resources"), opts)...) allErrs = append(allErrs, ValidateSecurityContext(ctr.SecurityContext, idxPath.Child("securityContext"))...) } @@ -3089,10 +3105,11 @@ func validateOnlyAddedTolerations(newTolerations []core.Toleration, oldToleratio allErrs := field.ErrorList{} for _, old := range oldTolerations { found := false - old.TolerationSeconds = nil - for _, new := range newTolerations { - new.TolerationSeconds = nil - if reflect.DeepEqual(old, new) { + oldTolerationClone := old.DeepCopy() + for _, newToleration := range newTolerations { + // assign to our clone before doing a deep equal so we can allow tolerationseconds to change. + oldTolerationClone.TolerationSeconds = newToleration.TolerationSeconds // +k8s:verify-mutation:reason=clone + if reflect.DeepEqual(*oldTolerationClone, newToleration) { found = true break } @@ -3184,6 +3201,10 @@ type PodValidationOptions struct { AllowMultipleHugePageResources bool // Allow pod spec to use hugepages in downward API AllowDownwardAPIHugePages bool + // Allow invalid pod-deletion-cost annotation value for backward compatibility. + AllowInvalidPodDeletionCost bool + // Allow pod spec to use non-integer multiple of huge page unit size + AllowIndivisibleHugePagesValues bool } // ValidatePodSingleHugePageResources checks if there are multiple huge @@ -3208,7 +3229,7 @@ func ValidatePodSingleHugePageResources(pod *core.Pod, specPath *field.Path) fie func validatePodMetadataAndSpec(pod *core.Pod, opts PodValidationOptions) field.ErrorList { fldPath := field.NewPath("metadata") allErrs := ValidateObjectMeta(&pod.ObjectMeta, true, ValidatePodName, fldPath) - allErrs = append(allErrs, ValidatePodSpecificAnnotations(pod.ObjectMeta.Annotations, &pod.Spec, fldPath.Child("annotations"))...) + allErrs = append(allErrs, ValidatePodSpecificAnnotations(pod.ObjectMeta.Annotations, &pod.Spec, fldPath.Child("annotations"), opts)...) allErrs = append(allErrs, ValidatePodSpec(&pod.Spec, &pod.ObjectMeta, field.NewPath("spec"), opts)...) // we do additional validation only pertinent for pods and not pod templates @@ -3357,7 +3378,7 @@ func ValidatePodSpec(spec *core.PodSpec, podMeta *metav1.ObjectMeta, fldPath *fi } if spec.Overhead != nil { - allErrs = append(allErrs, validateOverhead(spec.Overhead, fldPath.Child("overhead"))...) + allErrs = append(allErrs, validateOverhead(spec.Overhead, fldPath.Child("overhead"), opts)...) } return allErrs @@ -3390,7 +3411,7 @@ func ValidateNodeSelectorRequirement(rq core.NodeSelectorRequirement, fldPath *f } var nodeFieldSelectorValidators = map[string]func(string, bool) []string{ - core.ObjectNameField: ValidateNodeName, + metav1.ObjectNameField: ValidateNodeName, } // ValidateNodeFieldSelectorRequirement tests that the specified NodeSelectorRequirement fields has valid data @@ -3501,7 +3522,7 @@ func ValidateTopologySelectorTerm(term core.TopologySelectorTerm, fldPath *field func ValidateAvoidPodsInNodeAnnotations(annotations map[string]string, fldPath *field.Path) field.ErrorList { allErrs := field.ErrorList{} - v1Avoids, err := v1helper.GetAvoidPodsFromNodeAnnotations(annotations) + v1Avoids, err := schedulinghelper.GetAvoidPodsFromNodeAnnotations(annotations) if err != nil { allErrs = append(allErrs, field.Invalid(fldPath.Child("AvoidPods"), core.PreferAvoidPodsAnnotationKey, err.Error())) return allErrs @@ -3555,7 +3576,9 @@ func ValidatePreferredSchedulingTerms(terms []core.PreferredSchedulingTerm, fldP func validatePodAffinityTerm(podAffinityTerm core.PodAffinityTerm, fldPath *field.Path) field.ErrorList { allErrs := field.ErrorList{} - allErrs = append(allErrs, unversionedvalidation.ValidateLabelSelector(podAffinityTerm.LabelSelector, fldPath.Child("matchExpressions"))...) + allErrs = append(allErrs, unversionedvalidation.ValidateLabelSelector(podAffinityTerm.LabelSelector, fldPath.Child("labelSelector"))...) + allErrs = append(allErrs, unversionedvalidation.ValidateLabelSelector(podAffinityTerm.NamespaceSelector, fldPath.Child("namespaceSelector"))...) + for _, name := range podAffinityTerm.Namespaces { for _, msg := range ValidateNamespaceName(name, false) { allErrs = append(allErrs, field.Invalid(fldPath.Child("namespace"), name, msg)) @@ -3927,7 +3950,7 @@ func ValidatePodUpdate(newPod, oldPod *core.Pod, opts PodValidationOptions) fiel fldPath := field.NewPath("metadata") allErrs := ValidateObjectMetaUpdate(&newPod.ObjectMeta, &oldPod.ObjectMeta, fldPath) allErrs = append(allErrs, validatePodMetadataAndSpec(newPod, opts)...) - allErrs = append(allErrs, ValidatePodSpecificAnnotationUpdates(newPod, oldPod, fldPath.Child("annotations"))...) + allErrs = append(allErrs, ValidatePodSpecificAnnotationUpdates(newPod, oldPod, fldPath.Child("annotations"), opts)...) specPath := field.NewPath("spec") if !opts.AllowMultipleHugePageResources { @@ -3970,37 +3993,44 @@ func ValidatePodUpdate(newPod, oldPod *core.Pod, opts PodValidationOptions) fiel allErrs = append(allErrs, field.Invalid(specPath.Child("activeDeadlineSeconds"), newPod.Spec.ActiveDeadlineSeconds, "must not update from a positive integer to nil value")) } + // Allow only additions to tolerations updates. + allErrs = append(allErrs, validateOnlyAddedTolerations(newPod.Spec.Tolerations, oldPod.Spec.Tolerations, specPath.Child("tolerations"))...) + + // the last thing to check is pod spec equality. If the pod specs are equal, then we can simply return the errors we have + // so far and save the cost of a deep copy. + if apiequality.Semantic.DeepEqual(newPod.Spec, oldPod.Spec) { + return allErrs + } + // handle updateable fields by munging those fields prior to deep equal comparison. - mungedPod := *newPod + mungedPodSpec := *newPod.Spec.DeepCopy() // munge spec.containers[*].image var newContainers []core.Container - for ix, container := range mungedPod.Spec.Containers { - container.Image = oldPod.Spec.Containers[ix].Image + for ix, container := range mungedPodSpec.Containers { + container.Image = oldPod.Spec.Containers[ix].Image // +k8s:verify-mutation:reason=clone newContainers = append(newContainers, container) } - mungedPod.Spec.Containers = newContainers + mungedPodSpec.Containers = newContainers // munge spec.initContainers[*].image var newInitContainers []core.Container - for ix, container := range mungedPod.Spec.InitContainers { - container.Image = oldPod.Spec.InitContainers[ix].Image + for ix, container := range mungedPodSpec.InitContainers { + container.Image = oldPod.Spec.InitContainers[ix].Image // +k8s:verify-mutation:reason=clone newInitContainers = append(newInitContainers, container) } - mungedPod.Spec.InitContainers = newInitContainers + mungedPodSpec.InitContainers = newInitContainers // munge spec.activeDeadlineSeconds - mungedPod.Spec.ActiveDeadlineSeconds = nil + mungedPodSpec.ActiveDeadlineSeconds = nil if oldPod.Spec.ActiveDeadlineSeconds != nil { activeDeadlineSeconds := *oldPod.Spec.ActiveDeadlineSeconds - mungedPod.Spec.ActiveDeadlineSeconds = &activeDeadlineSeconds + mungedPodSpec.ActiveDeadlineSeconds = &activeDeadlineSeconds } + // tolerations are checked before the deep copy, so munge those too + mungedPodSpec.Tolerations = oldPod.Spec.Tolerations // +k8s:verify-mutation:reason=clone - // Allow only additions to tolerations updates. - mungedPod.Spec.Tolerations = oldPod.Spec.Tolerations - allErrs = append(allErrs, validateOnlyAddedTolerations(newPod.Spec.Tolerations, oldPod.Spec.Tolerations, specPath.Child("tolerations"))...) - - if !apiequality.Semantic.DeepEqual(mungedPod.Spec, oldPod.Spec) { + if !apiequality.Semantic.DeepEqual(mungedPodSpec, oldPod.Spec) { // This diff isn't perfect, but it's a helluva lot better an "I'm not going to tell you what the difference is". //TODO: Pinpoint the specific field that causes the invalid error after we have strategic merge diff - specDiff := diff.ObjectDiff(mungedPod.Spec, oldPod.Spec) + specDiff := diff.ObjectDiff(mungedPodSpec, oldPod.Spec) allErrs = append(allErrs, field.Forbidden(specPath, fmt.Sprintf("pod updates may not change fields other than `spec.containers[*].image`, `spec.initContainers[*].image`, `spec.activeDeadlineSeconds` or `spec.tolerations` (only additions to existing tolerations)\n%v", specDiff))) } @@ -4032,12 +4062,11 @@ func ValidateContainerStateTransition(newStatuses, oldStatuses []core.ContainerS return allErrs } -// ValidatePodStatusUpdate tests to see if the update is legal for an end user to make. newPod is updated with fields -// that cannot be changed. -func ValidatePodStatusUpdate(newPod, oldPod *core.Pod) field.ErrorList { +// ValidatePodStatusUpdate tests to see if the update is legal for an end user to make. +func ValidatePodStatusUpdate(newPod, oldPod *core.Pod, opts PodValidationOptions) field.ErrorList { fldPath := field.NewPath("metadata") allErrs := ValidateObjectMetaUpdate(&newPod.ObjectMeta, &oldPod.ObjectMeta, fldPath) - allErrs = append(allErrs, ValidatePodSpecificAnnotationUpdates(newPod, oldPod, fldPath.Child("annotations"))...) + allErrs = append(allErrs, ValidatePodSpecificAnnotationUpdates(newPod, oldPod, fldPath.Child("annotations"), opts)...) allErrs = append(allErrs, validatePodConditions(newPod.Status.Conditions, fldPath.Child("conditions"))...) fldPath = field.NewPath("status") @@ -4064,9 +4093,6 @@ func ValidatePodStatusUpdate(newPod, oldPod *core.Pod) field.ErrorList { } } - // For status update we ignore changes to pod spec. - newPod.Spec = oldPod.Spec - return allErrs } @@ -4149,6 +4175,8 @@ var supportedSessionAffinityType = sets.NewString(string(core.ServiceAffinityCli var supportedServiceType = sets.NewString(string(core.ServiceTypeClusterIP), string(core.ServiceTypeNodePort), string(core.ServiceTypeLoadBalancer), string(core.ServiceTypeExternalName)) +var supportedServiceInternalTrafficPolicy = sets.NewString(string(core.ServiceInternalTrafficPolicyCluster), string(core.ServiceExternalTrafficPolicyTypeLocal)) + var supportedServiceIPFamily = sets.NewString(string(core.IPv4Protocol), string(core.IPv6Protocol)) var supportedServiceIPFamilyPolicy = sets.NewString(string(core.IPFamilyPolicySingleStack), string(core.IPFamilyPolicyPreferDualStack), string(core.IPFamilyPolicyRequireDualStack)) @@ -4351,8 +4379,15 @@ func ValidateService(service *core.Service) field.ErrorList { } } + // validate LoadBalancerClass field + allErrs = append(allErrs, validateLoadBalancerClassField(nil, service)...) + // external traffic fields allErrs = append(allErrs, validateServiceExternalTrafficFieldsValue(service)...) + + // internal traffic policy field + allErrs = append(allErrs, validateServiceInternalTrafficFieldsValue(service)...) + return allErrs } @@ -4421,6 +4456,24 @@ func validateServiceExternalTrafficFieldsValue(service *core.Service) field.Erro return allErrs } +// validateServiceInternalTrafficFieldsValue validates InternalTraffic related +// spec have legal value. +func validateServiceInternalTrafficFieldsValue(service *core.Service) field.ErrorList { + allErrs := field.ErrorList{} + + if utilfeature.DefaultFeatureGate.Enabled(features.ServiceInternalTrafficPolicy) { + if service.Spec.InternalTrafficPolicy == nil { + allErrs = append(allErrs, field.Required(field.NewPath("spec").Child("internalTrafficPolicy"), "")) + } + } + + if service.Spec.InternalTrafficPolicy != nil && !supportedServiceInternalTrafficPolicy.Has(string(*service.Spec.InternalTrafficPolicy)) { + allErrs = append(allErrs, field.NotSupported(field.NewPath("spec").Child("internalTrafficPolicy"), *service.Spec.InternalTrafficPolicy, supportedServiceInternalTrafficPolicy.List())) + } + + return allErrs +} + // ValidateServiceExternalTrafficFieldsCombination validates if ExternalTrafficPolicy, // HealthCheckNodePort and Type combination are legal. For update, it should be called // after clearing externalTraffic related fields for the ease of transitioning between @@ -4464,6 +4517,9 @@ func ValidateServiceUpdate(service, oldService *core.Service) field.ErrorList { upgradeDowngradeIPFamiliesErrs := validateUpgradeDowngradeIPFamilies(oldService, service) allErrs = append(allErrs, upgradeDowngradeIPFamiliesErrs...) + upgradeDowngradeLoadBalancerClassErrs := validateLoadBalancerClassField(oldService, service) + allErrs = append(allErrs, upgradeDowngradeLoadBalancerClassErrs...) + return append(allErrs, ValidateService(service)...) } @@ -4572,7 +4628,7 @@ func ValidatePodTemplateSpec(spec *core.PodTemplateSpec, fldPath *field.Path, op allErrs := field.ErrorList{} allErrs = append(allErrs, unversionedvalidation.ValidateLabels(spec.Labels, fldPath.Child("labels"))...) allErrs = append(allErrs, ValidateAnnotations(spec.Annotations, fldPath.Child("annotations"))...) - allErrs = append(allErrs, ValidatePodSpecificAnnotations(spec.Annotations, &spec.Spec, fldPath.Child("annotations"))...) + allErrs = append(allErrs, ValidatePodSpecificAnnotations(spec.Annotations, &spec.Spec, fldPath.Child("annotations"), opts)...) allErrs = append(allErrs, ValidatePodSpec(&spec.Spec, nil, fldPath.Child("spec"), opts)...) allErrs = append(allErrs, validateSeccompAnnotationsAndFields(spec.ObjectMeta, &spec.Spec, fldPath.Child("spec"))...) @@ -4754,11 +4810,8 @@ func ValidateNodeUpdate(node, oldNode *core.Node) field.ErrorList { addresses[address] = true } - if len(oldNode.Spec.PodCIDRs) == 0 { - // Allow the controller manager to assign a CIDR to a node if it doesn't have one. - //this is a no op for a string slice. - oldNode.Spec.PodCIDRs = node.Spec.PodCIDRs - } else { + // Allow the controller manager to assign a CIDR to a node if it doesn't have one. + if len(oldNode.Spec.PodCIDRs) > 0 { // compare the entire slice if len(oldNode.Spec.PodCIDRs) != len(node.Spec.PodCIDRs) { allErrs = append(allErrs, field.Forbidden(field.NewPath("spec", "podCIDRs"), "node updates may not change podCIDR except from \"\" to valid")) @@ -4772,46 +4825,35 @@ func ValidateNodeUpdate(node, oldNode *core.Node) field.ErrorList { } // Allow controller manager updating provider ID when not set - if len(oldNode.Spec.ProviderID) == 0 { - oldNode.Spec.ProviderID = node.Spec.ProviderID - } else { - if oldNode.Spec.ProviderID != node.Spec.ProviderID { - allErrs = append(allErrs, field.Forbidden(field.NewPath("spec", "providerID"), "node updates may not change providerID except from \"\" to valid")) - } + if len(oldNode.Spec.ProviderID) > 0 && oldNode.Spec.ProviderID != node.Spec.ProviderID { + allErrs = append(allErrs, field.Forbidden(field.NewPath("spec", "providerID"), "node updates may not change providerID except from \"\" to valid")) } if node.Spec.ConfigSource != nil { allErrs = append(allErrs, validateNodeConfigSourceSpec(node.Spec.ConfigSource, field.NewPath("spec", "configSource"))...) } - oldNode.Spec.ConfigSource = node.Spec.ConfigSource if node.Status.Config != nil { allErrs = append(allErrs, validateNodeConfigStatus(node.Status.Config, field.NewPath("status", "config"))...) } - oldNode.Status.Config = node.Status.Config - - // TODO: move reset function to its own location - // Ignore metadata changes now that they have been tested - oldNode.ObjectMeta = node.ObjectMeta - // Allow users to update capacity - oldNode.Status.Capacity = node.Status.Capacity - // Allow users to unschedule node - oldNode.Spec.Unschedulable = node.Spec.Unschedulable - // Clear status - oldNode.Status = node.Status // update taints if len(node.Spec.Taints) > 0 { allErrs = append(allErrs, validateNodeTaints(node.Spec.Taints, fldPath.Child("taints"))...) } - oldNode.Spec.Taints = node.Spec.Taints - // We made allowed changes to oldNode, and now we compare oldNode to node. Any remaining differences indicate changes to protected fields. - // TODO: Add a 'real' error type for this error and provide print actual diffs. - if !apiequality.Semantic.DeepEqual(oldNode, node) { - klog.V(4).Infof("Update failed validation %#v vs %#v", oldNode, node) - allErrs = append(allErrs, field.Forbidden(field.NewPath(""), "node updates may only change labels, taints, or capacity (or configSource, if the DynamicKubeletConfig feature gate is enabled)")) + if node.Spec.DoNotUseExternalID != oldNode.Spec.DoNotUseExternalID { + allErrs = append(allErrs, field.Forbidden(field.NewPath("spec", "externalID"), "may not be updated")) } + // status and metadata are allowed change (barring restrictions above), so separately test spec field. + // spec only has a few fields, so check the ones we don't allow changing + // 1. PodCIDRs - immutable after first set - checked above + // 2. ProviderID - immutable after first set - checked above + // 3. Unschedulable - allowed to change + // 4. Taints - allowed to change + // 5. ConfigSource - allowed to change (and checked above) + // 6. DoNotUseExternalID - immutable - checked above + return allErrs } @@ -5224,10 +5266,6 @@ func ValidateSecret(secret *core.Secret) field.ErrorList { func ValidateSecretUpdate(newSecret, oldSecret *core.Secret) field.ErrorList { allErrs := ValidateObjectMetaUpdate(&newSecret.ObjectMeta, &oldSecret.ObjectMeta, field.NewPath("metadata")) - if len(newSecret.Type) == 0 { - newSecret.Type = oldSecret.Type - } - allErrs = append(allErrs, ValidateImmutableField(newSecret.Type, oldSecret.Type, field.NewPath("type"))...) if oldSecret.Immutable != nil && *oldSecret.Immutable { if newSecret.Immutable == nil || !*newSecret.Immutable { @@ -5310,7 +5348,7 @@ func validateBasicResource(quantity resource.Quantity, fldPath *field.Path) fiel } // Validates resource requirement spec. -func ValidateResourceRequirements(requirements *core.ResourceRequirements, fldPath *field.Path) field.ErrorList { +func ValidateResourceRequirements(requirements *core.ResourceRequirements, fldPath *field.Path, opts PodValidationOptions) field.ErrorList { allErrs := field.ErrorList{} limPath := fldPath.Child("limits") reqPath := fldPath.Child("requests") @@ -5330,6 +5368,9 @@ func ValidateResourceRequirements(requirements *core.ResourceRequirements, fldPa if helper.IsHugePageResourceName(resourceName) { limContainsHugePages = true + if err := validateResourceQuantityHugePageValue(resourceName, quantity, opts); err != nil { + allErrs = append(allErrs, field.Invalid(fldPath, quantity.String(), err.Error())) + } } if supportedQoSComputeResources.Has(string(resourceName)) { @@ -5357,6 +5398,9 @@ func ValidateResourceRequirements(requirements *core.ResourceRequirements, fldPa } if helper.IsHugePageResourceName(resourceName) { reqContainsHugePages = true + if err := validateResourceQuantityHugePageValue(resourceName, quantity, opts); err != nil { + allErrs = append(allErrs, field.Invalid(fldPath, quantity.String(), err.Error())) + } } if supportedQoSComputeResources.Has(string(resourceName)) { reqContainsCPUOrMemory = true @@ -5370,8 +5414,20 @@ func ValidateResourceRequirements(requirements *core.ResourceRequirements, fldPa return allErrs } +func validateResourceQuantityHugePageValue(name core.ResourceName, quantity resource.Quantity, opts PodValidationOptions) error { + if !helper.IsHugePageResourceName(name) { + return nil + } + + if !opts.AllowIndivisibleHugePagesValues && !helper.IsHugePageResourceValueDivisible(name, quantity) { + return fmt.Errorf("%s is not positive integer multiple of %s", quantity.String(), name) + } + + return nil +} + // validateResourceQuotaScopes ensures that each enumerated hard resource constraint is valid for set of scopes -func validateResourceQuotaScopes(resourceQuotaSpec *core.ResourceQuotaSpec, fld *field.Path) field.ErrorList { +func validateResourceQuotaScopes(resourceQuotaSpec *core.ResourceQuotaSpec, opts ResourceQuotaValidationOptions, fld *field.Path) field.ErrorList { allErrs := field.ErrorList{} if len(resourceQuotaSpec.Scopes) == 0 { return allErrs @@ -5383,7 +5439,7 @@ func validateResourceQuotaScopes(resourceQuotaSpec *core.ResourceQuotaSpec, fld fldPath := fld.Child("scopes") scopeSet := sets.NewString() for _, scope := range resourceQuotaSpec.Scopes { - if !helper.IsStandardResourceQuotaScope(string(scope)) { + if !helper.IsStandardResourceQuotaScope(string(scope), opts.AllowPodAffinityNamespaceSelector) { allErrs = append(allErrs, field.Invalid(fldPath, resourceQuotaSpec.Scopes, "unsupported scope")) } for _, k := range hardLimits.List() { @@ -5406,7 +5462,7 @@ func validateResourceQuotaScopes(resourceQuotaSpec *core.ResourceQuotaSpec, fld } // validateScopedResourceSelectorRequirement tests that the match expressions has valid data -func validateScopedResourceSelectorRequirement(resourceQuotaSpec *core.ResourceQuotaSpec, fld *field.Path) field.ErrorList { +func validateScopedResourceSelectorRequirement(resourceQuotaSpec *core.ResourceQuotaSpec, opts ResourceQuotaValidationOptions, fld *field.Path) field.ErrorList { allErrs := field.ErrorList{} hardLimits := sets.NewString() for k := range resourceQuotaSpec.Hard { @@ -5415,7 +5471,7 @@ func validateScopedResourceSelectorRequirement(resourceQuotaSpec *core.ResourceQ fldPath := fld.Child("matchExpressions") scopeSet := sets.NewString() for _, req := range resourceQuotaSpec.ScopeSelector.MatchExpressions { - if !helper.IsStandardResourceQuotaScope(string(req.ScopeName)) { + if !helper.IsStandardResourceQuotaScope(string(req.ScopeName), opts.AllowPodAffinityNamespaceSelector) { allErrs = append(allErrs, field.Invalid(fldPath.Child("scopeName"), req.ScopeName, "unsupported scope")) } for _, k := range hardLimits.List() { @@ -5424,10 +5480,10 @@ func validateScopedResourceSelectorRequirement(resourceQuotaSpec *core.ResourceQ } } switch req.ScopeName { - case core.ResourceQuotaScopeBestEffort, core.ResourceQuotaScopeNotBestEffort, core.ResourceQuotaScopeTerminating, core.ResourceQuotaScopeNotTerminating: + case core.ResourceQuotaScopeBestEffort, core.ResourceQuotaScopeNotBestEffort, core.ResourceQuotaScopeTerminating, core.ResourceQuotaScopeNotTerminating, core.ResourceQuotaScopeCrossNamespacePodAffinity: if req.Operator != core.ScopeSelectorOpExists { allErrs = append(allErrs, field.Invalid(fldPath.Child("operator"), req.Operator, - "must be 'Exist' only operator when scope is any of ResourceQuotaScopeTerminating, ResourceQuotaScopeNotTerminating, ResourceQuotaScopeBestEffort and ResourceQuotaScopeNotBestEffort")) + "must be 'Exist' when scope is any of ResourceQuotaScopeTerminating, ResourceQuotaScopeNotTerminating, ResourceQuotaScopeBestEffort, ResourceQuotaScopeNotBestEffort or ResourceQuotaScopeCrossNamespacePodAffinity")) } } @@ -5461,20 +5517,26 @@ func validateScopedResourceSelectorRequirement(resourceQuotaSpec *core.ResourceQ } // validateScopeSelector tests that the specified scope selector has valid data -func validateScopeSelector(resourceQuotaSpec *core.ResourceQuotaSpec, fld *field.Path) field.ErrorList { +func validateScopeSelector(resourceQuotaSpec *core.ResourceQuotaSpec, opts ResourceQuotaValidationOptions, fld *field.Path) field.ErrorList { allErrs := field.ErrorList{} if resourceQuotaSpec.ScopeSelector == nil { return allErrs } - allErrs = append(allErrs, validateScopedResourceSelectorRequirement(resourceQuotaSpec, fld.Child("scopeSelector"))...) + allErrs = append(allErrs, validateScopedResourceSelectorRequirement(resourceQuotaSpec, opts, fld.Child("scopeSelector"))...) return allErrs } +// ResourceQuotaValidationOptions contains the different settings for ResourceQuota validation +type ResourceQuotaValidationOptions struct { + // Allow pod-affinity namespace selector validation. + AllowPodAffinityNamespaceSelector bool +} + // ValidateResourceQuota tests if required fields in the ResourceQuota are set. -func ValidateResourceQuota(resourceQuota *core.ResourceQuota) field.ErrorList { +func ValidateResourceQuota(resourceQuota *core.ResourceQuota, opts ResourceQuotaValidationOptions) field.ErrorList { allErrs := ValidateObjectMeta(&resourceQuota.ObjectMeta, true, ValidateResourceQuotaName, field.NewPath("metadata")) - allErrs = append(allErrs, ValidateResourceQuotaSpec(&resourceQuota.Spec, field.NewPath("spec"))...) + allErrs = append(allErrs, ValidateResourceQuotaSpec(&resourceQuota.Spec, opts, field.NewPath("spec"))...) allErrs = append(allErrs, ValidateResourceQuotaStatus(&resourceQuota.Status, field.NewPath("status"))...) return allErrs @@ -5499,7 +5561,7 @@ func ValidateResourceQuotaStatus(status *core.ResourceQuotaStatus, fld *field.Pa return allErrs } -func ValidateResourceQuotaSpec(resourceQuotaSpec *core.ResourceQuotaSpec, fld *field.Path) field.ErrorList { +func ValidateResourceQuotaSpec(resourceQuotaSpec *core.ResourceQuotaSpec, opts ResourceQuotaValidationOptions, fld *field.Path) field.ErrorList { allErrs := field.ErrorList{} fldPath := fld.Child("hard") @@ -5508,8 +5570,9 @@ func ValidateResourceQuotaSpec(resourceQuotaSpec *core.ResourceQuotaSpec, fld *f allErrs = append(allErrs, ValidateResourceQuotaResourceName(string(k), resPath)...) allErrs = append(allErrs, ValidateResourceQuantityValue(string(k), v, resPath)...) } - allErrs = append(allErrs, validateResourceQuotaScopes(resourceQuotaSpec, fld)...) - allErrs = append(allErrs, validateScopeSelector(resourceQuotaSpec, fld)...) + + allErrs = append(allErrs, validateResourceQuotaScopes(resourceQuotaSpec, opts, fld)...) + allErrs = append(allErrs, validateScopeSelector(resourceQuotaSpec, opts, fld)...) return allErrs } @@ -5527,10 +5590,9 @@ func ValidateResourceQuantityValue(resource string, value resource.Quantity, fld } // ValidateResourceQuotaUpdate tests to see if the update is legal for an end user to make. -// newResourceQuota is updated with fields that cannot be changed. -func ValidateResourceQuotaUpdate(newResourceQuota, oldResourceQuota *core.ResourceQuota) field.ErrorList { +func ValidateResourceQuotaUpdate(newResourceQuota, oldResourceQuota *core.ResourceQuota, opts ResourceQuotaValidationOptions) field.ErrorList { allErrs := ValidateObjectMetaUpdate(&newResourceQuota.ObjectMeta, &oldResourceQuota.ObjectMeta, field.NewPath("metadata")) - allErrs = append(allErrs, ValidateResourceQuotaSpec(&newResourceQuota.Spec, field.NewPath("spec"))...) + allErrs = append(allErrs, ValidateResourceQuotaSpec(&newResourceQuota.Spec, opts, field.NewPath("spec"))...) // ensure scopes cannot change, and that resources are still valid for scope fldPath := field.NewPath("spec", "scopes") @@ -5546,12 +5608,10 @@ func ValidateResourceQuotaUpdate(newResourceQuota, oldResourceQuota *core.Resour allErrs = append(allErrs, field.Invalid(fldPath, newResourceQuota.Spec.Scopes, fieldImmutableErrorMsg)) } - newResourceQuota.Status = oldResourceQuota.Status return allErrs } // ValidateResourceQuotaStatusUpdate tests to see if the status update is legal for an end user to make. -// newResourceQuota is updated with fields that cannot be changed. func ValidateResourceQuotaStatusUpdate(newResourceQuota, oldResourceQuota *core.ResourceQuota) field.ErrorList { allErrs := ValidateObjectMetaUpdate(&newResourceQuota.ObjectMeta, &oldResourceQuota.ObjectMeta, field.NewPath("metadata")) if len(newResourceQuota.ResourceVersion) == 0 { @@ -5569,7 +5629,6 @@ func ValidateResourceQuotaStatusUpdate(newResourceQuota, oldResourceQuota *core. allErrs = append(allErrs, ValidateResourceQuotaResourceName(string(k), resPath)...) allErrs = append(allErrs, ValidateResourceQuantityValue(string(k), v, resPath)...) } - newResourceQuota.Spec = oldResourceQuota.Spec return allErrs } @@ -5602,19 +5661,14 @@ func validateKubeFinalizerName(stringValue string, fldPath *field.Path) field.Er } // ValidateNamespaceUpdate tests to make sure a namespace update can be applied. -// newNamespace is updated with fields that cannot be changed func ValidateNamespaceUpdate(newNamespace *core.Namespace, oldNamespace *core.Namespace) field.ErrorList { allErrs := ValidateObjectMetaUpdate(&newNamespace.ObjectMeta, &oldNamespace.ObjectMeta, field.NewPath("metadata")) - newNamespace.Spec.Finalizers = oldNamespace.Spec.Finalizers - newNamespace.Status = oldNamespace.Status return allErrs } -// ValidateNamespaceStatusUpdate tests to see if the update is legal for an end user to make. newNamespace is updated with fields -// that cannot be changed. +// ValidateNamespaceStatusUpdate tests to see if the update is legal for an end user to make. func ValidateNamespaceStatusUpdate(newNamespace, oldNamespace *core.Namespace) field.ErrorList { allErrs := ValidateObjectMetaUpdate(&newNamespace.ObjectMeta, &oldNamespace.ObjectMeta, field.NewPath("metadata")) - newNamespace.Spec = oldNamespace.Spec if newNamespace.DeletionTimestamp.IsZero() { if newNamespace.Status.Phase != core.NamespaceActive { allErrs = append(allErrs, field.Invalid(field.NewPath("status", "Phase"), newNamespace.Status.Phase, "may only be 'Active' if `deletionTimestamp` is empty")) @@ -5628,7 +5682,6 @@ func ValidateNamespaceStatusUpdate(newNamespace, oldNamespace *core.Namespace) f } // ValidateNamespaceFinalizeUpdate tests to see if the update is legal for an end user to make. -// newNamespace is updated with fields that cannot be changed. func ValidateNamespaceFinalizeUpdate(newNamespace, oldNamespace *core.Namespace) field.ErrorList { allErrs := ValidateObjectMetaUpdate(&newNamespace.ObjectMeta, &oldNamespace.ObjectMeta, field.NewPath("metadata")) @@ -5637,7 +5690,6 @@ func ValidateNamespaceFinalizeUpdate(newNamespace, oldNamespace *core.Namespace) idxPath := fldPath.Index(i) allErrs = append(allErrs, validateFinalizerName(string(newNamespace.Spec.Finalizers[i]), idxPath)...) } - newNamespace.Status = oldNamespace.Status return allErrs } @@ -6328,3 +6380,47 @@ func isHeadlessService(service *core.Service) bool { len(service.Spec.ClusterIPs) == 1 && service.Spec.ClusterIPs[0] == core.ClusterIPNone } + +// validateLoadBalancerClassField validation for loadBalancerClass +func validateLoadBalancerClassField(oldService, service *core.Service) field.ErrorList { + allErrs := make(field.ErrorList, 0) + if oldService != nil { + // validate update op + if isTypeLoadBalancer(oldService) && isTypeLoadBalancer(service) { + // old and new are both LoadBalancer + if !sameLoadBalancerClass(oldService, service) { + // can't change loadBalancerClass + allErrs = append(allErrs, field.Invalid(field.NewPath("spec", "loadBalancerClass"), service.Spec.LoadBalancerClass, "may not change once set")) + } + } + } + + if isTypeLoadBalancer(service) { + // check LoadBalancerClass format + if service.Spec.LoadBalancerClass != nil { + allErrs = append(allErrs, ValidateQualifiedName(*service.Spec.LoadBalancerClass, field.NewPath("spec", "loadBalancerClass"))...) + } + } else { + // check if LoadBalancerClass set for non LoadBalancer type of service + if service.Spec.LoadBalancerClass != nil { + allErrs = append(allErrs, field.Forbidden(field.NewPath("spec", "loadBalancerClass"), "may only be used when `type` is 'LoadBalancer'")) + } + } + return allErrs +} + +// isTypeLoadBalancer tests service type is loadBalancer or not +func isTypeLoadBalancer(service *core.Service) bool { + return service.Spec.Type == core.ServiceTypeLoadBalancer +} + +// sameLoadBalancerClass check two services have the same loadBalancerClass or not +func sameLoadBalancerClass(oldService, service *core.Service) bool { + if oldService.Spec.LoadBalancerClass == nil && service.Spec.LoadBalancerClass == nil { + return true + } + if oldService.Spec.LoadBalancerClass == nil || service.Spec.LoadBalancerClass == nil { + return false + } + return *oldService.Spec.LoadBalancerClass == *service.Spec.LoadBalancerClass +} diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/zz_generated.deepcopy.go b/vendor/k8s.io/kubernetes/pkg/apis/core/zz_generated.deepcopy.go index eab1009c1d97..598d9d54ce03 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/core/zz_generated.deepcopy.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/core/zz_generated.deepcopy.go @@ -3362,6 +3362,11 @@ func (in *PodAffinityTerm) DeepCopyInto(out *PodAffinityTerm) { *out = make([]string, len(*in)) copy(*out, *in) } + if in.NamespaceSelector != nil { + in, out := &in.NamespaceSelector, &out.NamespaceSelector + *out = new(v1.LabelSelector) + (*in).DeepCopyInto(*out) + } return } @@ -4187,6 +4192,11 @@ func (in *PreferredSchedulingTerm) DeepCopy() *PreferredSchedulingTerm { func (in *Probe) DeepCopyInto(out *Probe) { *out = *in in.Handler.DeepCopyInto(&out.Handler) + if in.TerminationGracePeriodSeconds != nil { + in, out := &in.TerminationGracePeriodSeconds, &out.TerminationGracePeriodSeconds + *out = new(int64) + **out = **in + } return } @@ -5325,6 +5335,16 @@ func (in *ServiceSpec) DeepCopyInto(out *ServiceSpec) { *out = new(bool) **out = **in } + if in.LoadBalancerClass != nil { + in, out := &in.LoadBalancerClass, &out.LoadBalancerClass + *out = new(string) + **out = **in + } + if in.InternalTrafficPolicy != nil { + in, out := &in.InternalTrafficPolicy, &out.InternalTrafficPolicy + *out = new(ServiceInternalTrafficPolicyType) + **out = **in + } return } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/discovery/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/discovery/BUILD deleted file mode 100644 index 239cdc13236a..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/discovery/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/discovery", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/apis/discovery/fuzzer:all-srcs", - "//pkg/apis/discovery/install:all-srcs", - "//pkg/apis/discovery/v1alpha1:all-srcs", - "//pkg/apis/discovery/v1beta1:all-srcs", - "//pkg/apis/discovery/validation:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/discovery/install/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/discovery/install/BUILD deleted file mode 100644 index 825bd82ee851..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/discovery/install/BUILD +++ /dev/null @@ -1,30 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["install.go"], - importpath = "k8s.io/kubernetes/pkg/apis/discovery/install", - visibility = ["//visibility:public"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/discovery:go_default_library", - "//pkg/apis/discovery/v1alpha1:go_default_library", - "//pkg/apis/discovery/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/discovery/install/install.go b/vendor/k8s.io/kubernetes/pkg/apis/discovery/install/install.go index 828f13883d40..996ce278d033 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/discovery/install/install.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/discovery/install/install.go @@ -23,7 +23,7 @@ import ( utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/apis/discovery" - "k8s.io/kubernetes/pkg/apis/discovery/v1alpha1" + v1 "k8s.io/kubernetes/pkg/apis/discovery/v1" "k8s.io/kubernetes/pkg/apis/discovery/v1beta1" ) @@ -34,7 +34,7 @@ func init() { // Install registers the API group and adds types to a scheme func Install(scheme *runtime.Scheme) { utilruntime.Must(discovery.AddToScheme(scheme)) - utilruntime.Must(v1alpha1.AddToScheme(scheme)) utilruntime.Must(v1beta1.AddToScheme(scheme)) - utilruntime.Must(scheme.SetVersionPriority(v1beta1.SchemeGroupVersion, v1alpha1.SchemeGroupVersion)) + utilruntime.Must(v1.AddToScheme(scheme)) + utilruntime.Must(scheme.SetVersionPriority(v1beta1.SchemeGroupVersion, v1.SchemeGroupVersion)) } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/discovery/types.go b/vendor/k8s.io/kubernetes/pkg/apis/discovery/types.go index 1201d4abbc4c..bb93ee47a1ac 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/discovery/types.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/discovery/types.go @@ -87,26 +87,24 @@ type Endpoint struct { // endpoint. // +optional TargetRef *api.ObjectReference - // topology contains arbitrary topology information associated with the - // endpoint. These key/value pairs must conform with the label format. - // https://kubernetes.io/docs/concepts/overview/working-with-objects/labels - // Topology may include a maximum of 16 key/value pairs. This includes, but - // is not limited to the following well known keys: - // * kubernetes.io/hostname: the value indicates the hostname of the node - // where the endpoint is located. This should match the corresponding - // node label. - // * topology.kubernetes.io/zone: the value indicates the zone where the - // endpoint is located. This should match the corresponding node label. - // * topology.kubernetes.io/region: the value indicates the region where the - // endpoint is located. This should match the corresponding node label. - // This field is deprecated and will be removed in future api versions. + // deprecatedTopology is deprecated and only retained for round-trip + // compatibility with v1beta1 Topology field. When v1beta1 is removed, this + // should be removed, too. // +optional - Topology map[string]string + DeprecatedTopology map[string]string // nodeName represents the name of the Node hosting this endpoint. This can // be used to determine endpoints local to a Node. This field can be enabled // with the EndpointSliceNodeName feature gate. // +optional NodeName *string + // zone is the name of the Zone this endpoint exists in. + // +optional + Zone *string + // hints contains information associated with how an endpoint should be + // consumed. + // +featureGate=TopologyAwareHints + // +optional + Hints *EndpointHints } // EndpointConditions represents the current condition of an endpoint. @@ -134,6 +132,19 @@ type EndpointConditions struct { Terminating *bool } +// EndpointHints provides hints describing how an endpoint should be consumed. +type EndpointHints struct { + // forZones indicates the zone(s) this endpoint should be consumed by to + // enable topology aware routing. May contain a maximum of 8 entries. + ForZones []ForZone +} + +// ForZone provides information about which zones should consume this endpoint. +type ForZone struct { + // name represents the name of the zone. + Name string +} + // EndpointPort represents a Port used by an EndpointSlice. type EndpointPort struct { // The name of this port. All ports in an EndpointSlice must have a unique diff --git a/vendor/k8s.io/kubernetes/pkg/apis/discovery/v1/defaults.go b/vendor/k8s.io/kubernetes/pkg/apis/discovery/v1/defaults.go new file mode 100644 index 000000000000..edcf180b5d25 --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/apis/discovery/v1/defaults.go @@ -0,0 +1,42 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1 + +import ( + v1 "k8s.io/api/core/v1" + discoveryv1 "k8s.io/api/discovery/v1" + "k8s.io/apimachinery/pkg/runtime" +) + +var ( + defaultPortName = "" + defaultProtocol = v1.ProtocolTCP +) + +func addDefaultingFuncs(scheme *runtime.Scheme) error { + return RegisterDefaults(scheme) +} + +func SetDefaults_EndpointPort(obj *discoveryv1.EndpointPort) { + if obj.Name == nil { + obj.Name = &defaultPortName + } + + if obj.Protocol == nil { + obj.Protocol = &defaultProtocol + } +} diff --git a/vendor/k8s.io/kubernetes/pkg/apis/discovery/v1/doc.go b/vendor/k8s.io/kubernetes/pkg/apis/discovery/v1/doc.go new file mode 100644 index 000000000000..cc12c8d2876c --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/apis/discovery/v1/doc.go @@ -0,0 +1,22 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// +k8s:conversion-gen=k8s.io/kubernetes/pkg/apis/discovery +// +k8s:conversion-gen-external-types=k8s.io/api/discovery/v1 +// +k8s:defaulter-gen=TypeMeta +// +k8s:defaulter-gen-input=../../../../vendor/k8s.io/api/discovery/v1 + +package v1 // import "k8s.io/kubernetes/pkg/apis/discovery/v1" diff --git a/vendor/k8s.io/kubernetes/pkg/apis/discovery/v1/register.go b/vendor/k8s.io/kubernetes/pkg/apis/discovery/v1/register.go new file mode 100644 index 000000000000..13c9a0068285 --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/apis/discovery/v1/register.go @@ -0,0 +1,45 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1 + +import ( + discoveryv1 "k8s.io/api/discovery/v1" + "k8s.io/apimachinery/pkg/runtime/schema" +) + +// GroupName is the group name used in this package +const GroupName = "discovery.k8s.io" + +// SchemeGroupVersion is group version used to register these objects +var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: "v1"} + +// Resource takes an unqualified resource and returns a Group qualified GroupResource +func Resource(resource string) schema.GroupResource { + return SchemeGroupVersion.WithResource(resource).GroupResource() +} + +var ( + localSchemeBuilder = &discoveryv1.SchemeBuilder + AddToScheme = localSchemeBuilder.AddToScheme +) + +func init() { + // We only register manually written functions here. The registration of the + // generated functions takes place in the generated files. The separation + // makes the code compile even when the generated files are missing. + localSchemeBuilder.Register(addDefaultingFuncs) +} diff --git a/vendor/k8s.io/kubernetes/pkg/apis/discovery/v1/zz_generated.conversion.go b/vendor/k8s.io/kubernetes/pkg/apis/discovery/v1/zz_generated.conversion.go new file mode 100644 index 000000000000..5894e48ff54f --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/apis/discovery/v1/zz_generated.conversion.go @@ -0,0 +1,288 @@ +// +build !ignore_autogenerated + +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by conversion-gen. DO NOT EDIT. + +package v1 + +import ( + unsafe "unsafe" + + corev1 "k8s.io/api/core/v1" + v1 "k8s.io/api/discovery/v1" + conversion "k8s.io/apimachinery/pkg/conversion" + runtime "k8s.io/apimachinery/pkg/runtime" + core "k8s.io/kubernetes/pkg/apis/core" + discovery "k8s.io/kubernetes/pkg/apis/discovery" +) + +func init() { + localSchemeBuilder.Register(RegisterConversions) +} + +// RegisterConversions adds conversion functions to the given scheme. +// Public to allow building arbitrary schemes. +func RegisterConversions(s *runtime.Scheme) error { + if err := s.AddGeneratedConversionFunc((*v1.Endpoint)(nil), (*discovery.Endpoint)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_Endpoint_To_discovery_Endpoint(a.(*v1.Endpoint), b.(*discovery.Endpoint), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*discovery.Endpoint)(nil), (*v1.Endpoint)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_discovery_Endpoint_To_v1_Endpoint(a.(*discovery.Endpoint), b.(*v1.Endpoint), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.EndpointConditions)(nil), (*discovery.EndpointConditions)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_EndpointConditions_To_discovery_EndpointConditions(a.(*v1.EndpointConditions), b.(*discovery.EndpointConditions), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*discovery.EndpointConditions)(nil), (*v1.EndpointConditions)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_discovery_EndpointConditions_To_v1_EndpointConditions(a.(*discovery.EndpointConditions), b.(*v1.EndpointConditions), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.EndpointHints)(nil), (*discovery.EndpointHints)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_EndpointHints_To_discovery_EndpointHints(a.(*v1.EndpointHints), b.(*discovery.EndpointHints), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*discovery.EndpointHints)(nil), (*v1.EndpointHints)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_discovery_EndpointHints_To_v1_EndpointHints(a.(*discovery.EndpointHints), b.(*v1.EndpointHints), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.EndpointPort)(nil), (*discovery.EndpointPort)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_EndpointPort_To_discovery_EndpointPort(a.(*v1.EndpointPort), b.(*discovery.EndpointPort), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*discovery.EndpointPort)(nil), (*v1.EndpointPort)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_discovery_EndpointPort_To_v1_EndpointPort(a.(*discovery.EndpointPort), b.(*v1.EndpointPort), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.EndpointSlice)(nil), (*discovery.EndpointSlice)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_EndpointSlice_To_discovery_EndpointSlice(a.(*v1.EndpointSlice), b.(*discovery.EndpointSlice), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*discovery.EndpointSlice)(nil), (*v1.EndpointSlice)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_discovery_EndpointSlice_To_v1_EndpointSlice(a.(*discovery.EndpointSlice), b.(*v1.EndpointSlice), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.EndpointSliceList)(nil), (*discovery.EndpointSliceList)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_EndpointSliceList_To_discovery_EndpointSliceList(a.(*v1.EndpointSliceList), b.(*discovery.EndpointSliceList), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*discovery.EndpointSliceList)(nil), (*v1.EndpointSliceList)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_discovery_EndpointSliceList_To_v1_EndpointSliceList(a.(*discovery.EndpointSliceList), b.(*v1.EndpointSliceList), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ForZone)(nil), (*discovery.ForZone)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ForZone_To_discovery_ForZone(a.(*v1.ForZone), b.(*discovery.ForZone), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*discovery.ForZone)(nil), (*v1.ForZone)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_discovery_ForZone_To_v1_ForZone(a.(*discovery.ForZone), b.(*v1.ForZone), scope) + }); err != nil { + return err + } + return nil +} + +func autoConvert_v1_Endpoint_To_discovery_Endpoint(in *v1.Endpoint, out *discovery.Endpoint, s conversion.Scope) error { + out.Addresses = *(*[]string)(unsafe.Pointer(&in.Addresses)) + if err := Convert_v1_EndpointConditions_To_discovery_EndpointConditions(&in.Conditions, &out.Conditions, s); err != nil { + return err + } + out.Hostname = (*string)(unsafe.Pointer(in.Hostname)) + out.TargetRef = (*core.ObjectReference)(unsafe.Pointer(in.TargetRef)) + out.DeprecatedTopology = *(*map[string]string)(unsafe.Pointer(&in.DeprecatedTopology)) + out.NodeName = (*string)(unsafe.Pointer(in.NodeName)) + out.Zone = (*string)(unsafe.Pointer(in.Zone)) + out.Hints = (*discovery.EndpointHints)(unsafe.Pointer(in.Hints)) + return nil +} + +// Convert_v1_Endpoint_To_discovery_Endpoint is an autogenerated conversion function. +func Convert_v1_Endpoint_To_discovery_Endpoint(in *v1.Endpoint, out *discovery.Endpoint, s conversion.Scope) error { + return autoConvert_v1_Endpoint_To_discovery_Endpoint(in, out, s) +} + +func autoConvert_discovery_Endpoint_To_v1_Endpoint(in *discovery.Endpoint, out *v1.Endpoint, s conversion.Scope) error { + out.Addresses = *(*[]string)(unsafe.Pointer(&in.Addresses)) + if err := Convert_discovery_EndpointConditions_To_v1_EndpointConditions(&in.Conditions, &out.Conditions, s); err != nil { + return err + } + out.Hostname = (*string)(unsafe.Pointer(in.Hostname)) + out.TargetRef = (*corev1.ObjectReference)(unsafe.Pointer(in.TargetRef)) + out.DeprecatedTopology = *(*map[string]string)(unsafe.Pointer(&in.DeprecatedTopology)) + out.NodeName = (*string)(unsafe.Pointer(in.NodeName)) + out.Zone = (*string)(unsafe.Pointer(in.Zone)) + out.Hints = (*v1.EndpointHints)(unsafe.Pointer(in.Hints)) + return nil +} + +// Convert_discovery_Endpoint_To_v1_Endpoint is an autogenerated conversion function. +func Convert_discovery_Endpoint_To_v1_Endpoint(in *discovery.Endpoint, out *v1.Endpoint, s conversion.Scope) error { + return autoConvert_discovery_Endpoint_To_v1_Endpoint(in, out, s) +} + +func autoConvert_v1_EndpointConditions_To_discovery_EndpointConditions(in *v1.EndpointConditions, out *discovery.EndpointConditions, s conversion.Scope) error { + out.Ready = (*bool)(unsafe.Pointer(in.Ready)) + out.Serving = (*bool)(unsafe.Pointer(in.Serving)) + out.Terminating = (*bool)(unsafe.Pointer(in.Terminating)) + return nil +} + +// Convert_v1_EndpointConditions_To_discovery_EndpointConditions is an autogenerated conversion function. +func Convert_v1_EndpointConditions_To_discovery_EndpointConditions(in *v1.EndpointConditions, out *discovery.EndpointConditions, s conversion.Scope) error { + return autoConvert_v1_EndpointConditions_To_discovery_EndpointConditions(in, out, s) +} + +func autoConvert_discovery_EndpointConditions_To_v1_EndpointConditions(in *discovery.EndpointConditions, out *v1.EndpointConditions, s conversion.Scope) error { + out.Ready = (*bool)(unsafe.Pointer(in.Ready)) + out.Serving = (*bool)(unsafe.Pointer(in.Serving)) + out.Terminating = (*bool)(unsafe.Pointer(in.Terminating)) + return nil +} + +// Convert_discovery_EndpointConditions_To_v1_EndpointConditions is an autogenerated conversion function. +func Convert_discovery_EndpointConditions_To_v1_EndpointConditions(in *discovery.EndpointConditions, out *v1.EndpointConditions, s conversion.Scope) error { + return autoConvert_discovery_EndpointConditions_To_v1_EndpointConditions(in, out, s) +} + +func autoConvert_v1_EndpointHints_To_discovery_EndpointHints(in *v1.EndpointHints, out *discovery.EndpointHints, s conversion.Scope) error { + out.ForZones = *(*[]discovery.ForZone)(unsafe.Pointer(&in.ForZones)) + return nil +} + +// Convert_v1_EndpointHints_To_discovery_EndpointHints is an autogenerated conversion function. +func Convert_v1_EndpointHints_To_discovery_EndpointHints(in *v1.EndpointHints, out *discovery.EndpointHints, s conversion.Scope) error { + return autoConvert_v1_EndpointHints_To_discovery_EndpointHints(in, out, s) +} + +func autoConvert_discovery_EndpointHints_To_v1_EndpointHints(in *discovery.EndpointHints, out *v1.EndpointHints, s conversion.Scope) error { + out.ForZones = *(*[]v1.ForZone)(unsafe.Pointer(&in.ForZones)) + return nil +} + +// Convert_discovery_EndpointHints_To_v1_EndpointHints is an autogenerated conversion function. +func Convert_discovery_EndpointHints_To_v1_EndpointHints(in *discovery.EndpointHints, out *v1.EndpointHints, s conversion.Scope) error { + return autoConvert_discovery_EndpointHints_To_v1_EndpointHints(in, out, s) +} + +func autoConvert_v1_EndpointPort_To_discovery_EndpointPort(in *v1.EndpointPort, out *discovery.EndpointPort, s conversion.Scope) error { + out.Name = (*string)(unsafe.Pointer(in.Name)) + out.Protocol = (*core.Protocol)(unsafe.Pointer(in.Protocol)) + out.Port = (*int32)(unsafe.Pointer(in.Port)) + out.AppProtocol = (*string)(unsafe.Pointer(in.AppProtocol)) + return nil +} + +// Convert_v1_EndpointPort_To_discovery_EndpointPort is an autogenerated conversion function. +func Convert_v1_EndpointPort_To_discovery_EndpointPort(in *v1.EndpointPort, out *discovery.EndpointPort, s conversion.Scope) error { + return autoConvert_v1_EndpointPort_To_discovery_EndpointPort(in, out, s) +} + +func autoConvert_discovery_EndpointPort_To_v1_EndpointPort(in *discovery.EndpointPort, out *v1.EndpointPort, s conversion.Scope) error { + out.Name = (*string)(unsafe.Pointer(in.Name)) + out.Protocol = (*corev1.Protocol)(unsafe.Pointer(in.Protocol)) + out.Port = (*int32)(unsafe.Pointer(in.Port)) + out.AppProtocol = (*string)(unsafe.Pointer(in.AppProtocol)) + return nil +} + +// Convert_discovery_EndpointPort_To_v1_EndpointPort is an autogenerated conversion function. +func Convert_discovery_EndpointPort_To_v1_EndpointPort(in *discovery.EndpointPort, out *v1.EndpointPort, s conversion.Scope) error { + return autoConvert_discovery_EndpointPort_To_v1_EndpointPort(in, out, s) +} + +func autoConvert_v1_EndpointSlice_To_discovery_EndpointSlice(in *v1.EndpointSlice, out *discovery.EndpointSlice, s conversion.Scope) error { + out.ObjectMeta = in.ObjectMeta + out.AddressType = discovery.AddressType(in.AddressType) + out.Endpoints = *(*[]discovery.Endpoint)(unsafe.Pointer(&in.Endpoints)) + out.Ports = *(*[]discovery.EndpointPort)(unsafe.Pointer(&in.Ports)) + return nil +} + +// Convert_v1_EndpointSlice_To_discovery_EndpointSlice is an autogenerated conversion function. +func Convert_v1_EndpointSlice_To_discovery_EndpointSlice(in *v1.EndpointSlice, out *discovery.EndpointSlice, s conversion.Scope) error { + return autoConvert_v1_EndpointSlice_To_discovery_EndpointSlice(in, out, s) +} + +func autoConvert_discovery_EndpointSlice_To_v1_EndpointSlice(in *discovery.EndpointSlice, out *v1.EndpointSlice, s conversion.Scope) error { + out.ObjectMeta = in.ObjectMeta + out.AddressType = v1.AddressType(in.AddressType) + out.Endpoints = *(*[]v1.Endpoint)(unsafe.Pointer(&in.Endpoints)) + out.Ports = *(*[]v1.EndpointPort)(unsafe.Pointer(&in.Ports)) + return nil +} + +// Convert_discovery_EndpointSlice_To_v1_EndpointSlice is an autogenerated conversion function. +func Convert_discovery_EndpointSlice_To_v1_EndpointSlice(in *discovery.EndpointSlice, out *v1.EndpointSlice, s conversion.Scope) error { + return autoConvert_discovery_EndpointSlice_To_v1_EndpointSlice(in, out, s) +} + +func autoConvert_v1_EndpointSliceList_To_discovery_EndpointSliceList(in *v1.EndpointSliceList, out *discovery.EndpointSliceList, s conversion.Scope) error { + out.ListMeta = in.ListMeta + out.Items = *(*[]discovery.EndpointSlice)(unsafe.Pointer(&in.Items)) + return nil +} + +// Convert_v1_EndpointSliceList_To_discovery_EndpointSliceList is an autogenerated conversion function. +func Convert_v1_EndpointSliceList_To_discovery_EndpointSliceList(in *v1.EndpointSliceList, out *discovery.EndpointSliceList, s conversion.Scope) error { + return autoConvert_v1_EndpointSliceList_To_discovery_EndpointSliceList(in, out, s) +} + +func autoConvert_discovery_EndpointSliceList_To_v1_EndpointSliceList(in *discovery.EndpointSliceList, out *v1.EndpointSliceList, s conversion.Scope) error { + out.ListMeta = in.ListMeta + out.Items = *(*[]v1.EndpointSlice)(unsafe.Pointer(&in.Items)) + return nil +} + +// Convert_discovery_EndpointSliceList_To_v1_EndpointSliceList is an autogenerated conversion function. +func Convert_discovery_EndpointSliceList_To_v1_EndpointSliceList(in *discovery.EndpointSliceList, out *v1.EndpointSliceList, s conversion.Scope) error { + return autoConvert_discovery_EndpointSliceList_To_v1_EndpointSliceList(in, out, s) +} + +func autoConvert_v1_ForZone_To_discovery_ForZone(in *v1.ForZone, out *discovery.ForZone, s conversion.Scope) error { + out.Name = in.Name + return nil +} + +// Convert_v1_ForZone_To_discovery_ForZone is an autogenerated conversion function. +func Convert_v1_ForZone_To_discovery_ForZone(in *v1.ForZone, out *discovery.ForZone, s conversion.Scope) error { + return autoConvert_v1_ForZone_To_discovery_ForZone(in, out, s) +} + +func autoConvert_discovery_ForZone_To_v1_ForZone(in *discovery.ForZone, out *v1.ForZone, s conversion.Scope) error { + out.Name = in.Name + return nil +} + +// Convert_discovery_ForZone_To_v1_ForZone is an autogenerated conversion function. +func Convert_discovery_ForZone_To_v1_ForZone(in *discovery.ForZone, out *v1.ForZone, s conversion.Scope) error { + return autoConvert_discovery_ForZone_To_v1_ForZone(in, out, s) +} diff --git a/vendor/k8s.io/kubernetes/pkg/apis/discovery/v1/zz_generated.defaults.go b/vendor/k8s.io/kubernetes/pkg/apis/discovery/v1/zz_generated.defaults.go new file mode 100644 index 000000000000..d03030be9650 --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/apis/discovery/v1/zz_generated.defaults.go @@ -0,0 +1,49 @@ +// +build !ignore_autogenerated + +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by defaulter-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/discovery/v1" + runtime "k8s.io/apimachinery/pkg/runtime" +) + +// RegisterDefaults adds defaulters functions to the given scheme. +// Public to allow building arbitrary schemes. +// All generated defaulters are covering - they call all nested defaulters. +func RegisterDefaults(scheme *runtime.Scheme) error { + scheme.AddTypeDefaultingFunc(&v1.EndpointSlice{}, func(obj interface{}) { SetObjectDefaults_EndpointSlice(obj.(*v1.EndpointSlice)) }) + scheme.AddTypeDefaultingFunc(&v1.EndpointSliceList{}, func(obj interface{}) { SetObjectDefaults_EndpointSliceList(obj.(*v1.EndpointSliceList)) }) + return nil +} + +func SetObjectDefaults_EndpointSlice(in *v1.EndpointSlice) { + for i := range in.Ports { + a := &in.Ports[i] + SetDefaults_EndpointPort(a) + } +} + +func SetObjectDefaults_EndpointSliceList(in *v1.EndpointSliceList) { + for i := range in.Items { + a := &in.Items[i] + SetObjectDefaults_EndpointSlice(a) + } +} diff --git a/vendor/k8s.io/kubernetes/pkg/apis/discovery/v1alpha1/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/discovery/v1alpha1/BUILD deleted file mode 100644 index 6a33b9619b05..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/discovery/v1alpha1/BUILD +++ /dev/null @@ -1,52 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "defaults.go", - "doc.go", - "register.go", - "zz_generated.conversion.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/discovery/v1alpha1", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/discovery:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/discovery/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["defaults_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/discovery/install:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/discovery/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//vendor/github.com/google/go-cmp/cmp:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/discovery/v1alpha1/defaults.go b/vendor/k8s.io/kubernetes/pkg/apis/discovery/v1alpha1/defaults.go deleted file mode 100644 index 7efdad3ef44c..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/discovery/v1alpha1/defaults.go +++ /dev/null @@ -1,42 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package v1alpha1 - -import ( - v1 "k8s.io/api/core/v1" - discoveryv1alpha1 "k8s.io/api/discovery/v1alpha1" - "k8s.io/apimachinery/pkg/runtime" -) - -var ( - defaultPortName = "" - defaultProtocol = v1.ProtocolTCP -) - -func addDefaultingFuncs(scheme *runtime.Scheme) error { - return RegisterDefaults(scheme) -} - -func SetDefaults_EndpointPort(obj *discoveryv1alpha1.EndpointPort) { - if obj.Name == nil { - obj.Name = &defaultPortName - } - - if obj.Protocol == nil { - obj.Protocol = &defaultProtocol - } -} diff --git a/vendor/k8s.io/kubernetes/pkg/apis/discovery/v1alpha1/doc.go b/vendor/k8s.io/kubernetes/pkg/apis/discovery/v1alpha1/doc.go deleted file mode 100644 index 1dd23c2acd45..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/discovery/v1alpha1/doc.go +++ /dev/null @@ -1,22 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// +k8s:conversion-gen=k8s.io/kubernetes/pkg/apis/discovery -// +k8s:conversion-gen-external-types=k8s.io/api/discovery/v1alpha1 -// +k8s:defaulter-gen=TypeMeta -// +k8s:defaulter-gen-input=../../../../vendor/k8s.io/api/discovery/v1alpha1 - -package v1alpha1 // import "k8s.io/kubernetes/pkg/apis/discovery/v1alpha1" diff --git a/vendor/k8s.io/kubernetes/pkg/apis/discovery/v1alpha1/register.go b/vendor/k8s.io/kubernetes/pkg/apis/discovery/v1alpha1/register.go deleted file mode 100644 index 331c5a914cbf..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/discovery/v1alpha1/register.go +++ /dev/null @@ -1,45 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package v1alpha1 - -import ( - discoveryv1alpha1 "k8s.io/api/discovery/v1alpha1" - "k8s.io/apimachinery/pkg/runtime/schema" -) - -// GroupName is the group name used in this package -const GroupName = "discovery.k8s.io" - -// SchemeGroupVersion is group version used to register these objects -var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: "v1alpha1"} - -// Resource takes an unqualified resource and returns a Group qualified GroupResource -func Resource(resource string) schema.GroupResource { - return SchemeGroupVersion.WithResource(resource).GroupResource() -} - -var ( - localSchemeBuilder = &discoveryv1alpha1.SchemeBuilder - AddToScheme = localSchemeBuilder.AddToScheme -) - -func init() { - // We only register manually written functions here. The registration of the - // generated functions takes place in the generated files. The separation - // makes the code compile even when the generated files are missing. - localSchemeBuilder.Register(addDefaultingFuncs) -} diff --git a/vendor/k8s.io/kubernetes/pkg/apis/discovery/v1alpha1/zz_generated.conversion.go b/vendor/k8s.io/kubernetes/pkg/apis/discovery/v1alpha1/zz_generated.conversion.go deleted file mode 100644 index 0f65d9579aa5..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/discovery/v1alpha1/zz_generated.conversion.go +++ /dev/null @@ -1,224 +0,0 @@ -// +build !ignore_autogenerated - -/* -Copyright The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by conversion-gen. DO NOT EDIT. - -package v1alpha1 - -import ( - unsafe "unsafe" - - v1 "k8s.io/api/core/v1" - v1alpha1 "k8s.io/api/discovery/v1alpha1" - conversion "k8s.io/apimachinery/pkg/conversion" - runtime "k8s.io/apimachinery/pkg/runtime" - core "k8s.io/kubernetes/pkg/apis/core" - discovery "k8s.io/kubernetes/pkg/apis/discovery" -) - -func init() { - localSchemeBuilder.Register(RegisterConversions) -} - -// RegisterConversions adds conversion functions to the given scheme. -// Public to allow building arbitrary schemes. -func RegisterConversions(s *runtime.Scheme) error { - if err := s.AddGeneratedConversionFunc((*v1alpha1.Endpoint)(nil), (*discovery.Endpoint)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha1_Endpoint_To_discovery_Endpoint(a.(*v1alpha1.Endpoint), b.(*discovery.Endpoint), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*discovery.Endpoint)(nil), (*v1alpha1.Endpoint)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_discovery_Endpoint_To_v1alpha1_Endpoint(a.(*discovery.Endpoint), b.(*v1alpha1.Endpoint), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*v1alpha1.EndpointConditions)(nil), (*discovery.EndpointConditions)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha1_EndpointConditions_To_discovery_EndpointConditions(a.(*v1alpha1.EndpointConditions), b.(*discovery.EndpointConditions), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*discovery.EndpointConditions)(nil), (*v1alpha1.EndpointConditions)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_discovery_EndpointConditions_To_v1alpha1_EndpointConditions(a.(*discovery.EndpointConditions), b.(*v1alpha1.EndpointConditions), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*v1alpha1.EndpointPort)(nil), (*discovery.EndpointPort)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha1_EndpointPort_To_discovery_EndpointPort(a.(*v1alpha1.EndpointPort), b.(*discovery.EndpointPort), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*discovery.EndpointPort)(nil), (*v1alpha1.EndpointPort)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_discovery_EndpointPort_To_v1alpha1_EndpointPort(a.(*discovery.EndpointPort), b.(*v1alpha1.EndpointPort), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*v1alpha1.EndpointSlice)(nil), (*discovery.EndpointSlice)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha1_EndpointSlice_To_discovery_EndpointSlice(a.(*v1alpha1.EndpointSlice), b.(*discovery.EndpointSlice), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*discovery.EndpointSlice)(nil), (*v1alpha1.EndpointSlice)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_discovery_EndpointSlice_To_v1alpha1_EndpointSlice(a.(*discovery.EndpointSlice), b.(*v1alpha1.EndpointSlice), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*v1alpha1.EndpointSliceList)(nil), (*discovery.EndpointSliceList)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha1_EndpointSliceList_To_discovery_EndpointSliceList(a.(*v1alpha1.EndpointSliceList), b.(*discovery.EndpointSliceList), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*discovery.EndpointSliceList)(nil), (*v1alpha1.EndpointSliceList)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_discovery_EndpointSliceList_To_v1alpha1_EndpointSliceList(a.(*discovery.EndpointSliceList), b.(*v1alpha1.EndpointSliceList), scope) - }); err != nil { - return err - } - return nil -} - -func autoConvert_v1alpha1_Endpoint_To_discovery_Endpoint(in *v1alpha1.Endpoint, out *discovery.Endpoint, s conversion.Scope) error { - out.Addresses = *(*[]string)(unsafe.Pointer(&in.Addresses)) - if err := Convert_v1alpha1_EndpointConditions_To_discovery_EndpointConditions(&in.Conditions, &out.Conditions, s); err != nil { - return err - } - out.Hostname = (*string)(unsafe.Pointer(in.Hostname)) - out.TargetRef = (*core.ObjectReference)(unsafe.Pointer(in.TargetRef)) - out.Topology = *(*map[string]string)(unsafe.Pointer(&in.Topology)) - out.NodeName = (*string)(unsafe.Pointer(in.NodeName)) - return nil -} - -// Convert_v1alpha1_Endpoint_To_discovery_Endpoint is an autogenerated conversion function. -func Convert_v1alpha1_Endpoint_To_discovery_Endpoint(in *v1alpha1.Endpoint, out *discovery.Endpoint, s conversion.Scope) error { - return autoConvert_v1alpha1_Endpoint_To_discovery_Endpoint(in, out, s) -} - -func autoConvert_discovery_Endpoint_To_v1alpha1_Endpoint(in *discovery.Endpoint, out *v1alpha1.Endpoint, s conversion.Scope) error { - out.Addresses = *(*[]string)(unsafe.Pointer(&in.Addresses)) - if err := Convert_discovery_EndpointConditions_To_v1alpha1_EndpointConditions(&in.Conditions, &out.Conditions, s); err != nil { - return err - } - out.Hostname = (*string)(unsafe.Pointer(in.Hostname)) - out.TargetRef = (*v1.ObjectReference)(unsafe.Pointer(in.TargetRef)) - out.Topology = *(*map[string]string)(unsafe.Pointer(&in.Topology)) - out.NodeName = (*string)(unsafe.Pointer(in.NodeName)) - return nil -} - -// Convert_discovery_Endpoint_To_v1alpha1_Endpoint is an autogenerated conversion function. -func Convert_discovery_Endpoint_To_v1alpha1_Endpoint(in *discovery.Endpoint, out *v1alpha1.Endpoint, s conversion.Scope) error { - return autoConvert_discovery_Endpoint_To_v1alpha1_Endpoint(in, out, s) -} - -func autoConvert_v1alpha1_EndpointConditions_To_discovery_EndpointConditions(in *v1alpha1.EndpointConditions, out *discovery.EndpointConditions, s conversion.Scope) error { - out.Ready = (*bool)(unsafe.Pointer(in.Ready)) - out.Serving = (*bool)(unsafe.Pointer(in.Serving)) - out.Terminating = (*bool)(unsafe.Pointer(in.Terminating)) - return nil -} - -// Convert_v1alpha1_EndpointConditions_To_discovery_EndpointConditions is an autogenerated conversion function. -func Convert_v1alpha1_EndpointConditions_To_discovery_EndpointConditions(in *v1alpha1.EndpointConditions, out *discovery.EndpointConditions, s conversion.Scope) error { - return autoConvert_v1alpha1_EndpointConditions_To_discovery_EndpointConditions(in, out, s) -} - -func autoConvert_discovery_EndpointConditions_To_v1alpha1_EndpointConditions(in *discovery.EndpointConditions, out *v1alpha1.EndpointConditions, s conversion.Scope) error { - out.Ready = (*bool)(unsafe.Pointer(in.Ready)) - out.Serving = (*bool)(unsafe.Pointer(in.Serving)) - out.Terminating = (*bool)(unsafe.Pointer(in.Terminating)) - return nil -} - -// Convert_discovery_EndpointConditions_To_v1alpha1_EndpointConditions is an autogenerated conversion function. -func Convert_discovery_EndpointConditions_To_v1alpha1_EndpointConditions(in *discovery.EndpointConditions, out *v1alpha1.EndpointConditions, s conversion.Scope) error { - return autoConvert_discovery_EndpointConditions_To_v1alpha1_EndpointConditions(in, out, s) -} - -func autoConvert_v1alpha1_EndpointPort_To_discovery_EndpointPort(in *v1alpha1.EndpointPort, out *discovery.EndpointPort, s conversion.Scope) error { - out.Name = (*string)(unsafe.Pointer(in.Name)) - out.Protocol = (*core.Protocol)(unsafe.Pointer(in.Protocol)) - out.Port = (*int32)(unsafe.Pointer(in.Port)) - out.AppProtocol = (*string)(unsafe.Pointer(in.AppProtocol)) - return nil -} - -// Convert_v1alpha1_EndpointPort_To_discovery_EndpointPort is an autogenerated conversion function. -func Convert_v1alpha1_EndpointPort_To_discovery_EndpointPort(in *v1alpha1.EndpointPort, out *discovery.EndpointPort, s conversion.Scope) error { - return autoConvert_v1alpha1_EndpointPort_To_discovery_EndpointPort(in, out, s) -} - -func autoConvert_discovery_EndpointPort_To_v1alpha1_EndpointPort(in *discovery.EndpointPort, out *v1alpha1.EndpointPort, s conversion.Scope) error { - out.Name = (*string)(unsafe.Pointer(in.Name)) - out.Protocol = (*v1.Protocol)(unsafe.Pointer(in.Protocol)) - out.Port = (*int32)(unsafe.Pointer(in.Port)) - out.AppProtocol = (*string)(unsafe.Pointer(in.AppProtocol)) - return nil -} - -// Convert_discovery_EndpointPort_To_v1alpha1_EndpointPort is an autogenerated conversion function. -func Convert_discovery_EndpointPort_To_v1alpha1_EndpointPort(in *discovery.EndpointPort, out *v1alpha1.EndpointPort, s conversion.Scope) error { - return autoConvert_discovery_EndpointPort_To_v1alpha1_EndpointPort(in, out, s) -} - -func autoConvert_v1alpha1_EndpointSlice_To_discovery_EndpointSlice(in *v1alpha1.EndpointSlice, out *discovery.EndpointSlice, s conversion.Scope) error { - out.ObjectMeta = in.ObjectMeta - out.AddressType = discovery.AddressType(in.AddressType) - out.Endpoints = *(*[]discovery.Endpoint)(unsafe.Pointer(&in.Endpoints)) - out.Ports = *(*[]discovery.EndpointPort)(unsafe.Pointer(&in.Ports)) - return nil -} - -// Convert_v1alpha1_EndpointSlice_To_discovery_EndpointSlice is an autogenerated conversion function. -func Convert_v1alpha1_EndpointSlice_To_discovery_EndpointSlice(in *v1alpha1.EndpointSlice, out *discovery.EndpointSlice, s conversion.Scope) error { - return autoConvert_v1alpha1_EndpointSlice_To_discovery_EndpointSlice(in, out, s) -} - -func autoConvert_discovery_EndpointSlice_To_v1alpha1_EndpointSlice(in *discovery.EndpointSlice, out *v1alpha1.EndpointSlice, s conversion.Scope) error { - out.ObjectMeta = in.ObjectMeta - out.AddressType = v1alpha1.AddressType(in.AddressType) - out.Endpoints = *(*[]v1alpha1.Endpoint)(unsafe.Pointer(&in.Endpoints)) - out.Ports = *(*[]v1alpha1.EndpointPort)(unsafe.Pointer(&in.Ports)) - return nil -} - -// Convert_discovery_EndpointSlice_To_v1alpha1_EndpointSlice is an autogenerated conversion function. -func Convert_discovery_EndpointSlice_To_v1alpha1_EndpointSlice(in *discovery.EndpointSlice, out *v1alpha1.EndpointSlice, s conversion.Scope) error { - return autoConvert_discovery_EndpointSlice_To_v1alpha1_EndpointSlice(in, out, s) -} - -func autoConvert_v1alpha1_EndpointSliceList_To_discovery_EndpointSliceList(in *v1alpha1.EndpointSliceList, out *discovery.EndpointSliceList, s conversion.Scope) error { - out.ListMeta = in.ListMeta - out.Items = *(*[]discovery.EndpointSlice)(unsafe.Pointer(&in.Items)) - return nil -} - -// Convert_v1alpha1_EndpointSliceList_To_discovery_EndpointSliceList is an autogenerated conversion function. -func Convert_v1alpha1_EndpointSliceList_To_discovery_EndpointSliceList(in *v1alpha1.EndpointSliceList, out *discovery.EndpointSliceList, s conversion.Scope) error { - return autoConvert_v1alpha1_EndpointSliceList_To_discovery_EndpointSliceList(in, out, s) -} - -func autoConvert_discovery_EndpointSliceList_To_v1alpha1_EndpointSliceList(in *discovery.EndpointSliceList, out *v1alpha1.EndpointSliceList, s conversion.Scope) error { - out.ListMeta = in.ListMeta - out.Items = *(*[]v1alpha1.EndpointSlice)(unsafe.Pointer(&in.Items)) - return nil -} - -// Convert_discovery_EndpointSliceList_To_v1alpha1_EndpointSliceList is an autogenerated conversion function. -func Convert_discovery_EndpointSliceList_To_v1alpha1_EndpointSliceList(in *discovery.EndpointSliceList, out *v1alpha1.EndpointSliceList, s conversion.Scope) error { - return autoConvert_discovery_EndpointSliceList_To_v1alpha1_EndpointSliceList(in, out, s) -} diff --git a/vendor/k8s.io/kubernetes/pkg/apis/discovery/v1alpha1/zz_generated.defaults.go b/vendor/k8s.io/kubernetes/pkg/apis/discovery/v1alpha1/zz_generated.defaults.go deleted file mode 100644 index 676869622412..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/discovery/v1alpha1/zz_generated.defaults.go +++ /dev/null @@ -1,49 +0,0 @@ -// +build !ignore_autogenerated - -/* -Copyright The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by defaulter-gen. DO NOT EDIT. - -package v1alpha1 - -import ( - v1alpha1 "k8s.io/api/discovery/v1alpha1" - runtime "k8s.io/apimachinery/pkg/runtime" -) - -// RegisterDefaults adds defaulters functions to the given scheme. -// Public to allow building arbitrary schemes. -// All generated defaulters are covering - they call all nested defaulters. -func RegisterDefaults(scheme *runtime.Scheme) error { - scheme.AddTypeDefaultingFunc(&v1alpha1.EndpointSlice{}, func(obj interface{}) { SetObjectDefaults_EndpointSlice(obj.(*v1alpha1.EndpointSlice)) }) - scheme.AddTypeDefaultingFunc(&v1alpha1.EndpointSliceList{}, func(obj interface{}) { SetObjectDefaults_EndpointSliceList(obj.(*v1alpha1.EndpointSliceList)) }) - return nil -} - -func SetObjectDefaults_EndpointSlice(in *v1alpha1.EndpointSlice) { - for i := range in.Ports { - a := &in.Ports[i] - SetDefaults_EndpointPort(a) - } -} - -func SetObjectDefaults_EndpointSliceList(in *v1alpha1.EndpointSliceList) { - for i := range in.Items { - a := &in.Items[i] - SetObjectDefaults_EndpointSlice(a) - } -} diff --git a/vendor/k8s.io/kubernetes/pkg/apis/discovery/v1beta1/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/discovery/v1beta1/BUILD deleted file mode 100644 index 58cfb5af3343..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/discovery/v1beta1/BUILD +++ /dev/null @@ -1,52 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "defaults.go", - "doc.go", - "register.go", - "zz_generated.conversion.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/discovery/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/discovery:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/discovery/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["defaults_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/discovery/install:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/discovery/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//vendor/github.com/google/go-cmp/cmp:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/discovery/v1beta1/conversion.go b/vendor/k8s.io/kubernetes/pkg/apis/discovery/v1beta1/conversion.go new file mode 100644 index 000000000000..9b316df5b68e --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/apis/discovery/v1beta1/conversion.go @@ -0,0 +1,92 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1beta1 + +import ( + corev1 "k8s.io/api/core/v1" + "k8s.io/api/discovery/v1beta1" + "k8s.io/apimachinery/pkg/conversion" + "k8s.io/kubernetes/pkg/apis/discovery" +) + +func Convert_v1beta1_Endpoint_To_discovery_Endpoint(in *v1beta1.Endpoint, out *discovery.Endpoint, s conversion.Scope) error { + if err := autoConvert_v1beta1_Endpoint_To_discovery_Endpoint(in, out, s); err != nil { + return err + } + if in.Topology != nil { + // Copy Topology into Deprecated Topology + out.DeprecatedTopology = make(map[string]string, len(in.Topology)) + for k, v := range in.Topology { + out.DeprecatedTopology[k] = v + } + + // Move zone from the topology map into a field + if zone, ok := in.Topology[corev1.LabelTopologyZone]; ok { + out.Zone = &zone + delete(out.DeprecatedTopology, corev1.LabelTopologyZone) + } + + // Remove hostname from the topology map ONLY IF it is the same value as + // nodeName. This preserves the (rather odd) ability to have different + // values for topology[hostname] and nodename in v1beta1, without showing + // duplicate values in v1. + if node, ok := in.Topology[corev1.LabelHostname]; ok { + if out.NodeName != nil && node == *out.NodeName { + delete(out.DeprecatedTopology, corev1.LabelHostname) + } + } + + // If zone & hostname were the only field in the map or topology was empty + // set DeprecatedTopology to nil + if len(out.DeprecatedTopology) == 0 { + out.DeprecatedTopology = nil + } + } + + return nil +} + +func Convert_discovery_Endpoint_To_v1beta1_Endpoint(in *discovery.Endpoint, out *v1beta1.Endpoint, s conversion.Scope) error { + if err := autoConvert_discovery_Endpoint_To_v1beta1_Endpoint(in, out, s); err != nil { + return err + } + + // If no deprecated topology, zone or node field, no conversion is necessary + if in.DeprecatedTopology == nil && in.Zone == nil && in.NodeName == nil { + return nil + } + + // Copy Deprecated Topology into Topology + out.Topology = make(map[string]string, len(in.DeprecatedTopology)) + for k, v := range in.DeprecatedTopology { + out.Topology[k] = v + } + + // Add zone field into the topology map + if in.Zone != nil { + out.Topology[corev1.LabelTopologyZone] = *in.Zone + } + + // Add hostname into the topology map ONLY IF it is not already present. + // This preserves the (rather odd) ability to have different values for + // topology[hostname] and nodename in v1beta1. + if in.NodeName != nil && out.Topology[corev1.LabelHostname] == "" { + out.Topology[corev1.LabelHostname] = *in.NodeName + } + + return nil +} diff --git a/vendor/k8s.io/kubernetes/pkg/apis/discovery/v1beta1/zz_generated.conversion.go b/vendor/k8s.io/kubernetes/pkg/apis/discovery/v1beta1/zz_generated.conversion.go index 2640deee9013..e13697a9ed5b 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/discovery/v1beta1/zz_generated.conversion.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/discovery/v1beta1/zz_generated.conversion.go @@ -38,23 +38,23 @@ func init() { // RegisterConversions adds conversion functions to the given scheme. // Public to allow building arbitrary schemes. func RegisterConversions(s *runtime.Scheme) error { - if err := s.AddGeneratedConversionFunc((*v1beta1.Endpoint)(nil), (*discovery.Endpoint)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1beta1_Endpoint_To_discovery_Endpoint(a.(*v1beta1.Endpoint), b.(*discovery.Endpoint), scope) + if err := s.AddGeneratedConversionFunc((*v1beta1.EndpointConditions)(nil), (*discovery.EndpointConditions)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1beta1_EndpointConditions_To_discovery_EndpointConditions(a.(*v1beta1.EndpointConditions), b.(*discovery.EndpointConditions), scope) }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*discovery.Endpoint)(nil), (*v1beta1.Endpoint)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_discovery_Endpoint_To_v1beta1_Endpoint(a.(*discovery.Endpoint), b.(*v1beta1.Endpoint), scope) + if err := s.AddGeneratedConversionFunc((*discovery.EndpointConditions)(nil), (*v1beta1.EndpointConditions)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_discovery_EndpointConditions_To_v1beta1_EndpointConditions(a.(*discovery.EndpointConditions), b.(*v1beta1.EndpointConditions), scope) }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*v1beta1.EndpointConditions)(nil), (*discovery.EndpointConditions)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1beta1_EndpointConditions_To_discovery_EndpointConditions(a.(*v1beta1.EndpointConditions), b.(*discovery.EndpointConditions), scope) + if err := s.AddGeneratedConversionFunc((*v1beta1.EndpointHints)(nil), (*discovery.EndpointHints)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1beta1_EndpointHints_To_discovery_EndpointHints(a.(*v1beta1.EndpointHints), b.(*discovery.EndpointHints), scope) }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*discovery.EndpointConditions)(nil), (*v1beta1.EndpointConditions)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_discovery_EndpointConditions_To_v1beta1_EndpointConditions(a.(*discovery.EndpointConditions), b.(*v1beta1.EndpointConditions), scope) + if err := s.AddGeneratedConversionFunc((*discovery.EndpointHints)(nil), (*v1beta1.EndpointHints)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_discovery_EndpointHints_To_v1beta1_EndpointHints(a.(*discovery.EndpointHints), b.(*v1beta1.EndpointHints), scope) }); err != nil { return err } @@ -88,6 +88,26 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddGeneratedConversionFunc((*v1beta1.ForZone)(nil), (*discovery.ForZone)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1beta1_ForZone_To_discovery_ForZone(a.(*v1beta1.ForZone), b.(*discovery.ForZone), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*discovery.ForZone)(nil), (*v1beta1.ForZone)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_discovery_ForZone_To_v1beta1_ForZone(a.(*discovery.ForZone), b.(*v1beta1.ForZone), scope) + }); err != nil { + return err + } + if err := s.AddConversionFunc((*discovery.Endpoint)(nil), (*v1beta1.Endpoint)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_discovery_Endpoint_To_v1beta1_Endpoint(a.(*discovery.Endpoint), b.(*v1beta1.Endpoint), scope) + }); err != nil { + return err + } + if err := s.AddConversionFunc((*v1beta1.Endpoint)(nil), (*discovery.Endpoint)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1beta1_Endpoint_To_discovery_Endpoint(a.(*v1beta1.Endpoint), b.(*discovery.Endpoint), scope) + }); err != nil { + return err + } return nil } @@ -98,16 +118,12 @@ func autoConvert_v1beta1_Endpoint_To_discovery_Endpoint(in *v1beta1.Endpoint, ou } out.Hostname = (*string)(unsafe.Pointer(in.Hostname)) out.TargetRef = (*core.ObjectReference)(unsafe.Pointer(in.TargetRef)) - out.Topology = *(*map[string]string)(unsafe.Pointer(&in.Topology)) + // WARNING: in.Topology requires manual conversion: does not exist in peer-type out.NodeName = (*string)(unsafe.Pointer(in.NodeName)) + out.Hints = (*discovery.EndpointHints)(unsafe.Pointer(in.Hints)) return nil } -// Convert_v1beta1_Endpoint_To_discovery_Endpoint is an autogenerated conversion function. -func Convert_v1beta1_Endpoint_To_discovery_Endpoint(in *v1beta1.Endpoint, out *discovery.Endpoint, s conversion.Scope) error { - return autoConvert_v1beta1_Endpoint_To_discovery_Endpoint(in, out, s) -} - func autoConvert_discovery_Endpoint_To_v1beta1_Endpoint(in *discovery.Endpoint, out *v1beta1.Endpoint, s conversion.Scope) error { out.Addresses = *(*[]string)(unsafe.Pointer(&in.Addresses)) if err := Convert_discovery_EndpointConditions_To_v1beta1_EndpointConditions(&in.Conditions, &out.Conditions, s); err != nil { @@ -115,16 +131,13 @@ func autoConvert_discovery_Endpoint_To_v1beta1_Endpoint(in *discovery.Endpoint, } out.Hostname = (*string)(unsafe.Pointer(in.Hostname)) out.TargetRef = (*v1.ObjectReference)(unsafe.Pointer(in.TargetRef)) - out.Topology = *(*map[string]string)(unsafe.Pointer(&in.Topology)) + // WARNING: in.DeprecatedTopology requires manual conversion: does not exist in peer-type out.NodeName = (*string)(unsafe.Pointer(in.NodeName)) + // WARNING: in.Zone requires manual conversion: does not exist in peer-type + out.Hints = (*v1beta1.EndpointHints)(unsafe.Pointer(in.Hints)) return nil } -// Convert_discovery_Endpoint_To_v1beta1_Endpoint is an autogenerated conversion function. -func Convert_discovery_Endpoint_To_v1beta1_Endpoint(in *discovery.Endpoint, out *v1beta1.Endpoint, s conversion.Scope) error { - return autoConvert_discovery_Endpoint_To_v1beta1_Endpoint(in, out, s) -} - func autoConvert_v1beta1_EndpointConditions_To_discovery_EndpointConditions(in *v1beta1.EndpointConditions, out *discovery.EndpointConditions, s conversion.Scope) error { out.Ready = (*bool)(unsafe.Pointer(in.Ready)) out.Serving = (*bool)(unsafe.Pointer(in.Serving)) @@ -149,6 +162,26 @@ func Convert_discovery_EndpointConditions_To_v1beta1_EndpointConditions(in *disc return autoConvert_discovery_EndpointConditions_To_v1beta1_EndpointConditions(in, out, s) } +func autoConvert_v1beta1_EndpointHints_To_discovery_EndpointHints(in *v1beta1.EndpointHints, out *discovery.EndpointHints, s conversion.Scope) error { + out.ForZones = *(*[]discovery.ForZone)(unsafe.Pointer(&in.ForZones)) + return nil +} + +// Convert_v1beta1_EndpointHints_To_discovery_EndpointHints is an autogenerated conversion function. +func Convert_v1beta1_EndpointHints_To_discovery_EndpointHints(in *v1beta1.EndpointHints, out *discovery.EndpointHints, s conversion.Scope) error { + return autoConvert_v1beta1_EndpointHints_To_discovery_EndpointHints(in, out, s) +} + +func autoConvert_discovery_EndpointHints_To_v1beta1_EndpointHints(in *discovery.EndpointHints, out *v1beta1.EndpointHints, s conversion.Scope) error { + out.ForZones = *(*[]v1beta1.ForZone)(unsafe.Pointer(&in.ForZones)) + return nil +} + +// Convert_discovery_EndpointHints_To_v1beta1_EndpointHints is an autogenerated conversion function. +func Convert_discovery_EndpointHints_To_v1beta1_EndpointHints(in *discovery.EndpointHints, out *v1beta1.EndpointHints, s conversion.Scope) error { + return autoConvert_discovery_EndpointHints_To_v1beta1_EndpointHints(in, out, s) +} + func autoConvert_v1beta1_EndpointPort_To_discovery_EndpointPort(in *v1beta1.EndpointPort, out *discovery.EndpointPort, s conversion.Scope) error { out.Name = (*string)(unsafe.Pointer(in.Name)) out.Protocol = (*core.Protocol)(unsafe.Pointer(in.Protocol)) @@ -178,7 +211,17 @@ func Convert_discovery_EndpointPort_To_v1beta1_EndpointPort(in *discovery.Endpoi func autoConvert_v1beta1_EndpointSlice_To_discovery_EndpointSlice(in *v1beta1.EndpointSlice, out *discovery.EndpointSlice, s conversion.Scope) error { out.ObjectMeta = in.ObjectMeta out.AddressType = discovery.AddressType(in.AddressType) - out.Endpoints = *(*[]discovery.Endpoint)(unsafe.Pointer(&in.Endpoints)) + if in.Endpoints != nil { + in, out := &in.Endpoints, &out.Endpoints + *out = make([]discovery.Endpoint, len(*in)) + for i := range *in { + if err := Convert_v1beta1_Endpoint_To_discovery_Endpoint(&(*in)[i], &(*out)[i], s); err != nil { + return err + } + } + } else { + out.Endpoints = nil + } out.Ports = *(*[]discovery.EndpointPort)(unsafe.Pointer(&in.Ports)) return nil } @@ -191,7 +234,17 @@ func Convert_v1beta1_EndpointSlice_To_discovery_EndpointSlice(in *v1beta1.Endpoi func autoConvert_discovery_EndpointSlice_To_v1beta1_EndpointSlice(in *discovery.EndpointSlice, out *v1beta1.EndpointSlice, s conversion.Scope) error { out.ObjectMeta = in.ObjectMeta out.AddressType = v1beta1.AddressType(in.AddressType) - out.Endpoints = *(*[]v1beta1.Endpoint)(unsafe.Pointer(&in.Endpoints)) + if in.Endpoints != nil { + in, out := &in.Endpoints, &out.Endpoints + *out = make([]v1beta1.Endpoint, len(*in)) + for i := range *in { + if err := Convert_discovery_Endpoint_To_v1beta1_Endpoint(&(*in)[i], &(*out)[i], s); err != nil { + return err + } + } + } else { + out.Endpoints = nil + } out.Ports = *(*[]v1beta1.EndpointPort)(unsafe.Pointer(&in.Ports)) return nil } @@ -203,7 +256,17 @@ func Convert_discovery_EndpointSlice_To_v1beta1_EndpointSlice(in *discovery.Endp func autoConvert_v1beta1_EndpointSliceList_To_discovery_EndpointSliceList(in *v1beta1.EndpointSliceList, out *discovery.EndpointSliceList, s conversion.Scope) error { out.ListMeta = in.ListMeta - out.Items = *(*[]discovery.EndpointSlice)(unsafe.Pointer(&in.Items)) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]discovery.EndpointSlice, len(*in)) + for i := range *in { + if err := Convert_v1beta1_EndpointSlice_To_discovery_EndpointSlice(&(*in)[i], &(*out)[i], s); err != nil { + return err + } + } + } else { + out.Items = nil + } return nil } @@ -214,7 +277,17 @@ func Convert_v1beta1_EndpointSliceList_To_discovery_EndpointSliceList(in *v1beta func autoConvert_discovery_EndpointSliceList_To_v1beta1_EndpointSliceList(in *discovery.EndpointSliceList, out *v1beta1.EndpointSliceList, s conversion.Scope) error { out.ListMeta = in.ListMeta - out.Items = *(*[]v1beta1.EndpointSlice)(unsafe.Pointer(&in.Items)) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]v1beta1.EndpointSlice, len(*in)) + for i := range *in { + if err := Convert_discovery_EndpointSlice_To_v1beta1_EndpointSlice(&(*in)[i], &(*out)[i], s); err != nil { + return err + } + } + } else { + out.Items = nil + } return nil } @@ -222,3 +295,23 @@ func autoConvert_discovery_EndpointSliceList_To_v1beta1_EndpointSliceList(in *di func Convert_discovery_EndpointSliceList_To_v1beta1_EndpointSliceList(in *discovery.EndpointSliceList, out *v1beta1.EndpointSliceList, s conversion.Scope) error { return autoConvert_discovery_EndpointSliceList_To_v1beta1_EndpointSliceList(in, out, s) } + +func autoConvert_v1beta1_ForZone_To_discovery_ForZone(in *v1beta1.ForZone, out *discovery.ForZone, s conversion.Scope) error { + out.Name = in.Name + return nil +} + +// Convert_v1beta1_ForZone_To_discovery_ForZone is an autogenerated conversion function. +func Convert_v1beta1_ForZone_To_discovery_ForZone(in *v1beta1.ForZone, out *discovery.ForZone, s conversion.Scope) error { + return autoConvert_v1beta1_ForZone_To_discovery_ForZone(in, out, s) +} + +func autoConvert_discovery_ForZone_To_v1beta1_ForZone(in *discovery.ForZone, out *v1beta1.ForZone, s conversion.Scope) error { + out.Name = in.Name + return nil +} + +// Convert_discovery_ForZone_To_v1beta1_ForZone is an autogenerated conversion function. +func Convert_discovery_ForZone_To_v1beta1_ForZone(in *discovery.ForZone, out *v1beta1.ForZone, s conversion.Scope) error { + return autoConvert_discovery_ForZone_To_v1beta1_ForZone(in, out, s) +} diff --git a/vendor/k8s.io/kubernetes/pkg/apis/discovery/validation/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/discovery/validation/BUILD deleted file mode 100644 index 1f1a470f8bc1..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/discovery/validation/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["validation.go"], - importpath = "k8s.io/kubernetes/pkg/apis/discovery/validation", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/validation:go_default_library", - "//pkg/apis/discovery:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["validation_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/discovery:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/discovery/validation/validation.go b/vendor/k8s.io/kubernetes/pkg/apis/discovery/validation/validation.go index 8499e7a696aa..c0a13ee48ea3 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/discovery/validation/validation.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/discovery/validation/validation.go @@ -17,6 +17,9 @@ limitations under the License. package validation import ( + "fmt" + + corev1 "k8s.io/api/core/v1" apimachineryvalidation "k8s.io/apimachinery/pkg/api/validation" metavalidation "k8s.io/apimachinery/pkg/apis/meta/v1/validation" "k8s.io/apimachinery/pkg/util/sets" @@ -40,8 +43,9 @@ var ( ) maxTopologyLabels = 16 maxAddresses = 100 - maxPorts = 100 + maxPorts = 20000 maxEndpoints = 1000 + maxZoneHints = 8 ) // ValidateEndpointSliceName can be used to check whether the given endpoint @@ -110,15 +114,22 @@ func validateEndpoints(endpoints []discovery.Endpoint, addrType discovery.Addres } } - topologyPath := idxPath.Child("topology") - if len(endpoint.Topology) > maxTopologyLabels { - allErrs = append(allErrs, field.TooMany(topologyPath, len(endpoint.Topology), maxTopologyLabels)) + topologyPath := idxPath.Child("deprecatedTopology") + if len(endpoint.DeprecatedTopology) > maxTopologyLabels { + allErrs = append(allErrs, field.TooMany(topologyPath, len(endpoint.DeprecatedTopology), maxTopologyLabels)) + } + allErrs = append(allErrs, metavalidation.ValidateLabels(endpoint.DeprecatedTopology, topologyPath)...) + if _, found := endpoint.DeprecatedTopology[corev1.LabelTopologyZone]; found { + allErrs = append(allErrs, field.InternalError(topologyPath.Key(corev1.LabelTopologyZone), fmt.Errorf("reserved key was not removed in conversion"))) } - allErrs = append(allErrs, metavalidation.ValidateLabels(endpoint.Topology, topologyPath)...) if endpoint.Hostname != nil { allErrs = append(allErrs, apivalidation.ValidateDNS1123Label(*endpoint.Hostname, idxPath.Child("hostname"))...) } + + if endpoint.Hints != nil { + allErrs = append(allErrs, validateHints(endpoint.Hints, idxPath.Child("hints"))...) + } } return allErrs @@ -173,3 +184,29 @@ func validateAddressType(addressType discovery.AddressType) field.ErrorList { return allErrs } + +func validateHints(endpointHints *discovery.EndpointHints, fldPath *field.Path) field.ErrorList { + allErrs := field.ErrorList{} + + fzPath := fldPath.Child("forZones") + if len(endpointHints.ForZones) > maxZoneHints { + allErrs = append(allErrs, field.TooMany(fzPath, len(endpointHints.ForZones), maxZoneHints)) + return allErrs + } + + zoneNames := sets.String{} + for i, forZone := range endpointHints.ForZones { + zonePath := fzPath.Index(i).Child("name") + if zoneNames.Has(forZone.Name) { + allErrs = append(allErrs, field.Duplicate(zonePath, forZone.Name)) + } else { + zoneNames.Insert(forZone.Name) + } + + for _, msg := range validation.IsValidLabelValue(forZone.Name) { + allErrs = append(allErrs, field.Invalid(zonePath, forZone.Name, msg)) + } + } + + return allErrs +} diff --git a/vendor/k8s.io/kubernetes/pkg/apis/discovery/zz_generated.deepcopy.go b/vendor/k8s.io/kubernetes/pkg/apis/discovery/zz_generated.deepcopy.go index aba324f34c77..52bfe6957ccb 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/discovery/zz_generated.deepcopy.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/discovery/zz_generated.deepcopy.go @@ -44,8 +44,8 @@ func (in *Endpoint) DeepCopyInto(out *Endpoint) { *out = new(core.ObjectReference) **out = **in } - if in.Topology != nil { - in, out := &in.Topology, &out.Topology + if in.DeprecatedTopology != nil { + in, out := &in.DeprecatedTopology, &out.DeprecatedTopology *out = make(map[string]string, len(*in)) for key, val := range *in { (*out)[key] = val @@ -56,6 +56,16 @@ func (in *Endpoint) DeepCopyInto(out *Endpoint) { *out = new(string) **out = **in } + if in.Zone != nil { + in, out := &in.Zone, &out.Zone + *out = new(string) + **out = **in + } + if in.Hints != nil { + in, out := &in.Hints, &out.Hints + *out = new(EndpointHints) + (*in).DeepCopyInto(*out) + } return } @@ -100,6 +110,27 @@ func (in *EndpointConditions) DeepCopy() *EndpointConditions { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *EndpointHints) DeepCopyInto(out *EndpointHints) { + *out = *in + if in.ForZones != nil { + in, out := &in.ForZones, &out.ForZones + *out = make([]ForZone, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EndpointHints. +func (in *EndpointHints) DeepCopy() *EndpointHints { + if in == nil { + return nil + } + out := new(EndpointHints) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *EndpointPort) DeepCopyInto(out *EndpointPort) { *out = *in @@ -208,3 +239,19 @@ func (in *EndpointSliceList) DeepCopyObject() runtime.Object { } return nil } + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ForZone) DeepCopyInto(out *ForZone) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ForZone. +func (in *ForZone) DeepCopy() *ForZone { + if in == nil { + return nil + } + out := new(ForZone) + in.DeepCopyInto(out) + return out +} diff --git a/vendor/k8s.io/kubernetes/pkg/apis/events/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/events/BUILD deleted file mode 100644 index 08a52aa8ebf9..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/events/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/events", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/apis/events/install:all-srcs", - "//pkg/apis/events/v1:all-srcs", - "//pkg/apis/events/v1beta1:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/events/install/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/events/install/BUILD deleted file mode 100644 index e4c19fb4ae6e..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/events/install/BUILD +++ /dev/null @@ -1,30 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["install.go"], - importpath = "k8s.io/kubernetes/pkg/apis/events/install", - visibility = ["//visibility:public"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/events:go_default_library", - "//pkg/apis/events/v1:go_default_library", - "//pkg/apis/events/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/events/v1/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/events/v1/BUILD deleted file mode 100644 index f6430d4b9572..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/events/v1/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "doc.go", - "register.go", - "zz_generated.conversion.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/events/v1", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/events/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/events/v1beta1/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/events/v1beta1/BUILD deleted file mode 100644 index f5903365467d..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/events/v1beta1/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "doc.go", - "register.go", - "zz_generated.conversion.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/events/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/events/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/extensions/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/extensions/BUILD deleted file mode 100644 index 910124366f60..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/extensions/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/extensions", - deps = [ - "//pkg/apis/apps:go_default_library", - "//pkg/apis/autoscaling:go_default_library", - "//pkg/apis/networking:go_default_library", - "//pkg/apis/policy:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/apis/extensions/fuzzer:all-srcs", - "//pkg/apis/extensions/install:all-srcs", - "//pkg/apis/extensions/v1beta1:all-srcs", - "//pkg/apis/extensions/validation:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/extensions/OWNERS b/vendor/k8s.io/kubernetes/pkg/apis/extensions/OWNERS index aa353a9c67df..7ae05a903044 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/extensions/OWNERS +++ b/vendor/k8s.io/kubernetes/pkg/apis/extensions/OWNERS @@ -11,7 +11,6 @@ reviewers: - caesarxuchao - mikedanese - liggitt -- nikhiljindal - erictune - pmorie - sttts @@ -25,14 +24,11 @@ reviewers: - piosz - dims - errordeveloper -- madhusudancs - rootfs - mml - resouer -- mbohlool - therc - pweil- - lukaszo -- jianhuiz labels: - sig/apps diff --git a/vendor/k8s.io/kubernetes/pkg/apis/extensions/install/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/extensions/install/BUILD deleted file mode 100644 index 3146e5cc3311..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/extensions/install/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["install.go"], - importpath = "k8s.io/kubernetes/pkg/apis/extensions/install", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/extensions:go_default_library", - "//pkg/apis/extensions/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/extensions/v1beta1/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/extensions/v1beta1/BUILD deleted file mode 100644 index ae5f1c0e2a5e..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/extensions/v1beta1/BUILD +++ /dev/null @@ -1,75 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "defaults.go", - "doc.go", - "register.go", - "zz_generated.conversion.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/extensions/v1beta1", - deps = [ - "//pkg/apis/apps:go_default_library", - "//pkg/apis/autoscaling:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/v1:go_default_library", - "//pkg/apis/networking:go_default_library", - "//pkg/apis/policy:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "conversion_test.go", - "defaults_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/install:go_default_library", - "//pkg/apis/extensions/install:go_default_library", - "//pkg/apis/networking:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/extensions/v1beta1/defaults.go b/vendor/k8s.io/kubernetes/pkg/apis/extensions/v1beta1/defaults.go index 1631dcb0eedb..1ba702ccc4b2 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/extensions/v1beta1/defaults.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/extensions/v1beta1/defaults.go @@ -19,7 +19,7 @@ package v1beta1 import ( "math" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" extensionsv1beta1 "k8s.io/api/extensions/v1beta1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" @@ -58,6 +58,11 @@ func SetDefaults_DaemonSet(obj *extensionsv1beta1.DaemonSet) { maxUnavailable := intstr.FromInt(1) updateStrategy.RollingUpdate.MaxUnavailable = &maxUnavailable } + if updateStrategy.RollingUpdate.MaxSurge == nil { + // Set default MaxSurge as 0 by default. + maxSurge := intstr.FromInt(0) + updateStrategy.RollingUpdate.MaxSurge = &maxSurge + } } if obj.Spec.RevisionHistoryLimit == nil { obj.Spec.RevisionHistoryLimit = new(int32) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/extensions/v1beta1/zz_generated.conversion.go b/vendor/k8s.io/kubernetes/pkg/apis/extensions/v1beta1/zz_generated.conversion.go index 6b94fdc072d4..e2359f7365b0 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/extensions/v1beta1/zz_generated.conversion.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/extensions/v1beta1/zz_generated.conversion.go @@ -1689,6 +1689,7 @@ func Convert_networking_NetworkPolicyPeer_To_v1beta1_NetworkPolicyPeer(in *netwo func autoConvert_v1beta1_NetworkPolicyPort_To_networking_NetworkPolicyPort(in *v1beta1.NetworkPolicyPort, out *networking.NetworkPolicyPort, s conversion.Scope) error { out.Protocol = (*core.Protocol)(unsafe.Pointer(in.Protocol)) out.Port = (*intstr.IntOrString)(unsafe.Pointer(in.Port)) + out.EndPort = (*int32)(unsafe.Pointer(in.EndPort)) return nil } @@ -1700,6 +1701,7 @@ func Convert_v1beta1_NetworkPolicyPort_To_networking_NetworkPolicyPort(in *v1bet func autoConvert_networking_NetworkPolicyPort_To_v1beta1_NetworkPolicyPort(in *networking.NetworkPolicyPort, out *v1beta1.NetworkPolicyPort, s conversion.Scope) error { out.Protocol = (*v1.Protocol)(unsafe.Pointer(in.Protocol)) out.Port = (*intstr.IntOrString)(unsafe.Pointer(in.Port)) + out.EndPort = (*int32)(unsafe.Pointer(in.EndPort)) return nil } @@ -2108,6 +2110,9 @@ func autoConvert_v1beta1_RollingUpdateDaemonSet_To_apps_RollingUpdateDaemonSet(i if err := metav1.Convert_Pointer_intstr_IntOrString_To_intstr_IntOrString(&in.MaxUnavailable, &out.MaxUnavailable, s); err != nil { return err } + if err := metav1.Convert_Pointer_intstr_IntOrString_To_intstr_IntOrString(&in.MaxSurge, &out.MaxSurge, s); err != nil { + return err + } return nil } @@ -2120,6 +2125,9 @@ func autoConvert_apps_RollingUpdateDaemonSet_To_v1beta1_RollingUpdateDaemonSet(i if err := metav1.Convert_intstr_IntOrString_To_Pointer_intstr_IntOrString(&in.MaxUnavailable, &out.MaxUnavailable, s); err != nil { return err } + if err := metav1.Convert_intstr_IntOrString_To_Pointer_intstr_IntOrString(&in.MaxSurge, &out.MaxSurge, s); err != nil { + return err + } return nil } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/extensions/v1beta1/zz_generated.defaults.go b/vendor/k8s.io/kubernetes/pkg/apis/extensions/v1beta1/zz_generated.defaults.go index 317003e1dbea..2d28b5779763 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/extensions/v1beta1/zz_generated.defaults.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/extensions/v1beta1/zz_generated.defaults.go @@ -21,8 +21,6 @@ limitations under the License. package v1beta1 import ( - "reflect" - v1beta1 "k8s.io/api/extensions/v1beta1" runtime "k8s.io/apimachinery/pkg/runtime" v1 "k8s.io/kubernetes/pkg/apis/core/v1" @@ -113,7 +111,7 @@ func SetObjectDefaults_DaemonSet(in *v1beta1.DaemonSet) { v1.SetDefaults_Container(a) for j := range a.Ports { b := &a.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -163,7 +161,7 @@ func SetObjectDefaults_DaemonSet(in *v1beta1.DaemonSet) { v1.SetDefaults_Container(a) for j := range a.Ports { b := &a.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -213,7 +211,7 @@ func SetObjectDefaults_DaemonSet(in *v1beta1.DaemonSet) { v1.SetDefaults_EphemeralContainer(a) for j := range a.EphemeralContainerCommon.Ports { b := &a.EphemeralContainerCommon.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -334,7 +332,7 @@ func SetObjectDefaults_Deployment(in *v1beta1.Deployment) { v1.SetDefaults_Container(a) for j := range a.Ports { b := &a.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -384,7 +382,7 @@ func SetObjectDefaults_Deployment(in *v1beta1.Deployment) { v1.SetDefaults_Container(a) for j := range a.Ports { b := &a.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -434,7 +432,7 @@ func SetObjectDefaults_Deployment(in *v1beta1.Deployment) { v1.SetDefaults_EphemeralContainer(a) for j := range a.EphemeralContainerCommon.Ports { b := &a.EphemeralContainerCommon.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -596,7 +594,7 @@ func SetObjectDefaults_ReplicaSet(in *v1beta1.ReplicaSet) { v1.SetDefaults_Container(a) for j := range a.Ports { b := &a.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -646,7 +644,7 @@ func SetObjectDefaults_ReplicaSet(in *v1beta1.ReplicaSet) { v1.SetDefaults_Container(a) for j := range a.Ports { b := &a.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } @@ -696,7 +694,7 @@ func SetObjectDefaults_ReplicaSet(in *v1beta1.ReplicaSet) { v1.SetDefaults_EphemeralContainer(a) for j := range a.EphemeralContainerCommon.Ports { b := &a.EphemeralContainerCommon.Ports[j] - if reflect.ValueOf(b.Protocol).IsZero() { + if b.Protocol == "" { b.Protocol = "TCP" } } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/flowcontrol/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/flowcontrol/BUILD deleted file mode 100644 index 9705173a7fc1..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/flowcontrol/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/flowcontrol", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/apis/flowcontrol/install:all-srcs", - "//pkg/apis/flowcontrol/internalbootstrap:all-srcs", - "//pkg/apis/flowcontrol/util:all-srcs", - "//pkg/apis/flowcontrol/v1alpha1:all-srcs", - "//pkg/apis/flowcontrol/v1beta1:all-srcs", - "//pkg/apis/flowcontrol/validation:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/flowcontrol/install/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/flowcontrol/install/BUILD deleted file mode 100644 index 0e15584e5c72..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/flowcontrol/install/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["install.go"], - importpath = "k8s.io/kubernetes/pkg/apis/flowcontrol/install", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/flowcontrol:go_default_library", - "//pkg/apis/flowcontrol/v1alpha1:go_default_library", - "//pkg/apis/flowcontrol/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/flowcontrol/internalbootstrap/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/flowcontrol/internalbootstrap/BUILD deleted file mode 100644 index 68c6a372155c..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/flowcontrol/internalbootstrap/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["default-internal.go"], - importpath = "k8s.io/kubernetes/pkg/apis/flowcontrol/internalbootstrap", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/flowcontrol:go_default_library", - "//pkg/apis/flowcontrol/install:go_default_library", - "//staging/src/k8s.io/api/flowcontrol/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/flowcontrol/bootstrap:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["defaults_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/flowcontrol/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/flowcontrol/bootstrap:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/flowcontrol/util/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/flowcontrol/util/BUILD deleted file mode 100644 index fcf7c6e89e22..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/flowcontrol/util/BUILD +++ /dev/null @@ -1,23 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["helpers.go"], - importpath = "k8s.io/kubernetes/pkg/apis/flowcontrol/util", - visibility = ["//visibility:public"], - deps = ["//pkg/apis/flowcontrol:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/flowcontrol/v1alpha1/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/flowcontrol/v1alpha1/BUILD deleted file mode 100644 index 4a6c504999a8..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/flowcontrol/v1alpha1/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "defaults.go", - "doc.go", - "register.go", - "zz_generated.conversion.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/flowcontrol/v1alpha1", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/flowcontrol:go_default_library", - "//staging/src/k8s.io/api/flowcontrol/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/flowcontrol/v1beta1/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/flowcontrol/v1beta1/BUILD deleted file mode 100644 index 1df69d104092..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/flowcontrol/v1beta1/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "defaults.go", - "doc.go", - "register.go", - "zz_generated.conversion.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/flowcontrol/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/flowcontrol:go_default_library", - "//staging/src/k8s.io/api/flowcontrol/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/flowcontrol/validation/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/flowcontrol/validation/BUILD deleted file mode 100644 index 6746b991d615..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/flowcontrol/validation/BUILD +++ /dev/null @@ -1,46 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["validation.go"], - importpath = "k8s.io/kubernetes/pkg/apis/flowcontrol/validation", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/core/validation:go_default_library", - "//pkg/apis/flowcontrol:go_default_library", - "//pkg/apis/flowcontrol/internalbootstrap:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/shufflesharding:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["validation_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/flowcontrol:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//vendor/github.com/google/go-cmp/cmp:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/imagepolicy/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/imagepolicy/BUILD deleted file mode 100644 index 6cccdc9fbc20..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/imagepolicy/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/imagepolicy", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/apis/imagepolicy/fuzzer:all-srcs", - "//pkg/apis/imagepolicy/install:all-srcs", - "//pkg/apis/imagepolicy/v1alpha1:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/imagepolicy/install/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/imagepolicy/install/BUILD deleted file mode 100644 index 299ba681552d..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/imagepolicy/install/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["install.go"], - importpath = "k8s.io/kubernetes/pkg/apis/imagepolicy/install", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/imagepolicy:go_default_library", - "//pkg/apis/imagepolicy/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/imagepolicy/v1alpha1/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/imagepolicy/v1alpha1/BUILD deleted file mode 100644 index 9b2b3fa1be2c..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/imagepolicy/v1alpha1/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "zz_generated.conversion.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/imagepolicy/v1alpha1", - deps = [ - "//pkg/apis/imagepolicy:go_default_library", - "//staging/src/k8s.io/api/imagepolicy/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/networking/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/networking/BUILD deleted file mode 100644 index 6f54a3700913..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/networking/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/networking", - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/apis/networking/fuzzer:all-srcs", - "//pkg/apis/networking/install:all-srcs", - "//pkg/apis/networking/v1:all-srcs", - "//pkg/apis/networking/v1beta1:all-srcs", - "//pkg/apis/networking/validation:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/networking/install/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/networking/install/BUILD deleted file mode 100644 index 1a28edd925dc..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/networking/install/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["install.go"], - importpath = "k8s.io/kubernetes/pkg/apis/networking/install", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/networking:go_default_library", - "//pkg/apis/networking/v1:go_default_library", - "//pkg/apis/networking/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/networking/types.go b/vendor/k8s.io/kubernetes/pkg/apis/networking/types.go index 4ba83a844e89..565aea9784a7 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/networking/types.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/networking/types.go @@ -77,7 +77,7 @@ type NetworkPolicySpec struct { Egress []NetworkPolicyEgressRule // List of rule types that the NetworkPolicy relates to. - // Valid options are "Ingress", "Egress", or "Ingress,Egress". + // Valid options are ["Ingress"], ["Egress"], or ["Ingress", "Egress"]. // If this field is not specified, it will default based on the existence of Ingress or Egress rules; // policies that contain an Egress section are assumed to affect Egress, and all policies // (whether or not they contain an Ingress section) are assumed to affect Ingress. @@ -138,10 +138,21 @@ type NetworkPolicyPort struct { // +optional Protocol *api.Protocol - // The port on the given protocol. This can either be a numerical or named port on - // a pod. If this field is not provided, this matches all port names and numbers. + // The port on the given protocol. This can either be a numerical or named + // port on a pod. If this field is not provided, this matches all port names and + // numbers. + // If present, only traffic on the specified protocol AND port will be matched. // +optional Port *intstr.IntOrString + + // If set, indicates that the range of ports from port to endPort, inclusive, + // should be allowed by the policy. This field cannot be defined if the port field + // is not defined or if the port field is defined as a named (string) port. + // The endPort must be equal or greater than port. + // This feature is in Alpha state and should be enabled using the Feature Gate + // "NetworkPolicyEndPort". + // +optional + EndPort *int32 } // IPBlock describes a particular CIDR (Ex. "192.168.1.1/24","2001:db9::/64") that is allowed @@ -302,7 +313,42 @@ type IngressClassSpec struct { // configuration for the controller. This is optional if the controller does // not require extra parameters. // +optional - Parameters *api.TypedLocalObjectReference + Parameters *IngressClassParametersReference +} + +const ( + // IngressClassParametersReferenceScopeNamespace indicates that the + // referenced Parameters resource is namespace-scoped. + IngressClassParametersReferenceScopeNamespace = "Namespace" + // IngressClassParametersReferenceScopeNamespace indicates that the + // referenced Parameters resource is cluster-scoped. + IngressClassParametersReferenceScopeCluster = "Cluster" +) + +// IngressClassParametersReference identifies an API object. This can be used +// to specify a cluster or namespace-scoped resource. +type IngressClassParametersReference struct { + // APIGroup is the group for the resource being referenced. If APIGroup is + // not specified, the specified Kind must be in the core API group. For any + // other third-party types, APIGroup is required. + // +optional + APIGroup *string + // Kind is the type of resource being referenced. + Kind string + // Name is the name of resource being referenced. + Name string + // Scope represents if this refers to a cluster or namespace scoped resource. + // This may be set to "Cluster" (default) or "Namespace". + // Field can be enabled with IngressClassNamespacedParams feature gate. + // +optional + // +featureGate=IngressClassNamespacedParams + Scope *string + // Namespace is the namespace of the resource being referenced. This field is + // required when scope is set to "Namespace" and must be unset when scope is set to + // "Cluster". + // +optional + // +featureGate=IngressClassNamespacedParams + Namespace *string } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object @@ -491,6 +537,7 @@ type IngressServiceBackend struct { // ServiceBackendPort is the service port being referenced. type ServiceBackendPort struct { // Name is the name of the port on the Service. + // This must be an IANA_SVC_NAME (following RFC6335). // This is a mutually exclusive setting with "Number". // +optional Name string diff --git a/vendor/k8s.io/kubernetes/pkg/apis/networking/v1/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/networking/v1/BUILD deleted file mode 100644 index f3da32a1d0bc..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/networking/v1/BUILD +++ /dev/null @@ -1,59 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "defaults.go", - "doc.go", - "register.go", - "zz_generated.conversion.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/networking/v1", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/v1:go_default_library", - "//pkg/apis/networking:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/networking/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["defaults_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/core/install:go_default_library", - "//pkg/apis/networking/install:go_default_library", - "//staging/src/k8s.io/api/networking/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/networking/v1/defaults.go b/vendor/k8s.io/kubernetes/pkg/apis/networking/v1/defaults.go index fce71ce71141..9ce991e8c753 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/networking/v1/defaults.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/networking/v1/defaults.go @@ -20,6 +20,9 @@ import ( "k8s.io/api/core/v1" networkingv1 "k8s.io/api/networking/v1" "k8s.io/apimachinery/pkg/runtime" + utilfeature "k8s.io/apiserver/pkg/util/feature" + "k8s.io/kubernetes/pkg/features" + utilpointer "k8s.io/utils/pointer" ) func addDefaultingFuncs(scheme *runtime.Scheme) error { @@ -43,3 +46,12 @@ func SetDefaults_NetworkPolicy(obj *networkingv1.NetworkPolicy) { } } } + +func SetDefaults_IngressClass(obj *networkingv1.IngressClass) { + if !utilfeature.DefaultFeatureGate.Enabled(features.IngressClassNamespacedParams) { + return + } + if obj.Spec.Parameters != nil && obj.Spec.Parameters.Scope == nil { + obj.Spec.Parameters.Scope = utilpointer.StringPtr(networkingv1.IngressClassParametersReferenceScopeCluster) + } +} diff --git a/vendor/k8s.io/kubernetes/pkg/apis/networking/v1/zz_generated.conversion.go b/vendor/k8s.io/kubernetes/pkg/apis/networking/v1/zz_generated.conversion.go index c87863a02fe2..f18732652873 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/networking/v1/zz_generated.conversion.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/networking/v1/zz_generated.conversion.go @@ -111,6 +111,16 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddGeneratedConversionFunc((*v1.IngressClassParametersReference)(nil), (*networking.IngressClassParametersReference)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_IngressClassParametersReference_To_networking_IngressClassParametersReference(a.(*v1.IngressClassParametersReference), b.(*networking.IngressClassParametersReference), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*networking.IngressClassParametersReference)(nil), (*v1.IngressClassParametersReference)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_networking_IngressClassParametersReference_To_v1_IngressClassParametersReference(a.(*networking.IngressClassParametersReference), b.(*v1.IngressClassParametersReference), scope) + }); err != nil { + return err + } if err := s.AddGeneratedConversionFunc((*v1.IngressClassSpec)(nil), (*networking.IngressClassSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1_IngressClassSpec_To_networking_IngressClassSpec(a.(*v1.IngressClassSpec), b.(*networking.IngressClassSpec), scope) }); err != nil { @@ -446,9 +456,37 @@ func Convert_networking_IngressClassList_To_v1_IngressClassList(in *networking.I return autoConvert_networking_IngressClassList_To_v1_IngressClassList(in, out, s) } +func autoConvert_v1_IngressClassParametersReference_To_networking_IngressClassParametersReference(in *v1.IngressClassParametersReference, out *networking.IngressClassParametersReference, s conversion.Scope) error { + out.APIGroup = (*string)(unsafe.Pointer(in.APIGroup)) + out.Kind = in.Kind + out.Name = in.Name + out.Scope = (*string)(unsafe.Pointer(in.Scope)) + out.Namespace = (*string)(unsafe.Pointer(in.Namespace)) + return nil +} + +// Convert_v1_IngressClassParametersReference_To_networking_IngressClassParametersReference is an autogenerated conversion function. +func Convert_v1_IngressClassParametersReference_To_networking_IngressClassParametersReference(in *v1.IngressClassParametersReference, out *networking.IngressClassParametersReference, s conversion.Scope) error { + return autoConvert_v1_IngressClassParametersReference_To_networking_IngressClassParametersReference(in, out, s) +} + +func autoConvert_networking_IngressClassParametersReference_To_v1_IngressClassParametersReference(in *networking.IngressClassParametersReference, out *v1.IngressClassParametersReference, s conversion.Scope) error { + out.APIGroup = (*string)(unsafe.Pointer(in.APIGroup)) + out.Kind = in.Kind + out.Name = in.Name + out.Scope = (*string)(unsafe.Pointer(in.Scope)) + out.Namespace = (*string)(unsafe.Pointer(in.Namespace)) + return nil +} + +// Convert_networking_IngressClassParametersReference_To_v1_IngressClassParametersReference is an autogenerated conversion function. +func Convert_networking_IngressClassParametersReference_To_v1_IngressClassParametersReference(in *networking.IngressClassParametersReference, out *v1.IngressClassParametersReference, s conversion.Scope) error { + return autoConvert_networking_IngressClassParametersReference_To_v1_IngressClassParametersReference(in, out, s) +} + func autoConvert_v1_IngressClassSpec_To_networking_IngressClassSpec(in *v1.IngressClassSpec, out *networking.IngressClassSpec, s conversion.Scope) error { out.Controller = in.Controller - out.Parameters = (*core.TypedLocalObjectReference)(unsafe.Pointer(in.Parameters)) + out.Parameters = (*networking.IngressClassParametersReference)(unsafe.Pointer(in.Parameters)) return nil } @@ -459,7 +497,7 @@ func Convert_v1_IngressClassSpec_To_networking_IngressClassSpec(in *v1.IngressCl func autoConvert_networking_IngressClassSpec_To_v1_IngressClassSpec(in *networking.IngressClassSpec, out *v1.IngressClassSpec, s conversion.Scope) error { out.Controller = in.Controller - out.Parameters = (*corev1.TypedLocalObjectReference)(unsafe.Pointer(in.Parameters)) + out.Parameters = (*v1.IngressClassParametersReference)(unsafe.Pointer(in.Parameters)) return nil } @@ -773,6 +811,7 @@ func Convert_networking_NetworkPolicyPeer_To_v1_NetworkPolicyPeer(in *networking func autoConvert_v1_NetworkPolicyPort_To_networking_NetworkPolicyPort(in *v1.NetworkPolicyPort, out *networking.NetworkPolicyPort, s conversion.Scope) error { out.Protocol = (*core.Protocol)(unsafe.Pointer(in.Protocol)) out.Port = (*intstr.IntOrString)(unsafe.Pointer(in.Port)) + out.EndPort = (*int32)(unsafe.Pointer(in.EndPort)) return nil } @@ -784,6 +823,7 @@ func Convert_v1_NetworkPolicyPort_To_networking_NetworkPolicyPort(in *v1.Network func autoConvert_networking_NetworkPolicyPort_To_v1_NetworkPolicyPort(in *networking.NetworkPolicyPort, out *v1.NetworkPolicyPort, s conversion.Scope) error { out.Protocol = (*corev1.Protocol)(unsafe.Pointer(in.Protocol)) out.Port = (*intstr.IntOrString)(unsafe.Pointer(in.Port)) + out.EndPort = (*int32)(unsafe.Pointer(in.EndPort)) return nil } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/networking/v1/zz_generated.defaults.go b/vendor/k8s.io/kubernetes/pkg/apis/networking/v1/zz_generated.defaults.go index 3962a1376b09..14652c005ae4 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/networking/v1/zz_generated.defaults.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/networking/v1/zz_generated.defaults.go @@ -29,11 +29,24 @@ import ( // Public to allow building arbitrary schemes. // All generated defaulters are covering - they call all nested defaulters. func RegisterDefaults(scheme *runtime.Scheme) error { + scheme.AddTypeDefaultingFunc(&v1.IngressClass{}, func(obj interface{}) { SetObjectDefaults_IngressClass(obj.(*v1.IngressClass)) }) + scheme.AddTypeDefaultingFunc(&v1.IngressClassList{}, func(obj interface{}) { SetObjectDefaults_IngressClassList(obj.(*v1.IngressClassList)) }) scheme.AddTypeDefaultingFunc(&v1.NetworkPolicy{}, func(obj interface{}) { SetObjectDefaults_NetworkPolicy(obj.(*v1.NetworkPolicy)) }) scheme.AddTypeDefaultingFunc(&v1.NetworkPolicyList{}, func(obj interface{}) { SetObjectDefaults_NetworkPolicyList(obj.(*v1.NetworkPolicyList)) }) return nil } +func SetObjectDefaults_IngressClass(in *v1.IngressClass) { + SetDefaults_IngressClass(in) +} + +func SetObjectDefaults_IngressClassList(in *v1.IngressClassList) { + for i := range in.Items { + a := &in.Items[i] + SetObjectDefaults_IngressClass(a) + } +} + func SetObjectDefaults_NetworkPolicy(in *v1.NetworkPolicy) { SetDefaults_NetworkPolicy(in) for i := range in.Spec.Ingress { diff --git a/vendor/k8s.io/kubernetes/pkg/apis/networking/v1beta1/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/networking/v1beta1/BUILD deleted file mode 100644 index 0c217d7a7970..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/networking/v1beta1/BUILD +++ /dev/null @@ -1,60 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "defaults.go", - "doc.go", - "register.go", - "zz_generated.conversion.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/networking/v1beta1", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/v1:go_default_library", - "//pkg/apis/networking:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/networking/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = [ - "conversion_test.go", - "defaults_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/networking:go_default_library", - "//pkg/apis/networking/install:go_default_library", - "//staging/src/k8s.io/api/networking/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/networking/v1beta1/zz_generated.conversion.go b/vendor/k8s.io/kubernetes/pkg/apis/networking/v1beta1/zz_generated.conversion.go index 53e7c1bc231b..459730570674 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/networking/v1beta1/zz_generated.conversion.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/networking/v1beta1/zz_generated.conversion.go @@ -89,6 +89,16 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddGeneratedConversionFunc((*v1beta1.IngressClassParametersReference)(nil), (*networking.IngressClassParametersReference)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1beta1_IngressClassParametersReference_To_networking_IngressClassParametersReference(a.(*v1beta1.IngressClassParametersReference), b.(*networking.IngressClassParametersReference), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*networking.IngressClassParametersReference)(nil), (*v1beta1.IngressClassParametersReference)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_networking_IngressClassParametersReference_To_v1beta1_IngressClassParametersReference(a.(*networking.IngressClassParametersReference), b.(*v1beta1.IngressClassParametersReference), scope) + }); err != nil { + return err + } if err := s.AddGeneratedConversionFunc((*v1beta1.IngressClassSpec)(nil), (*networking.IngressClassSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1beta1_IngressClassSpec_To_networking_IngressClassSpec(a.(*v1beta1.IngressClassSpec), b.(*networking.IngressClassSpec), scope) }); err != nil { @@ -333,9 +343,37 @@ func Convert_networking_IngressClassList_To_v1beta1_IngressClassList(in *network return autoConvert_networking_IngressClassList_To_v1beta1_IngressClassList(in, out, s) } +func autoConvert_v1beta1_IngressClassParametersReference_To_networking_IngressClassParametersReference(in *v1beta1.IngressClassParametersReference, out *networking.IngressClassParametersReference, s conversion.Scope) error { + out.APIGroup = (*string)(unsafe.Pointer(in.APIGroup)) + out.Kind = in.Kind + out.Name = in.Name + out.Scope = (*string)(unsafe.Pointer(in.Scope)) + out.Namespace = (*string)(unsafe.Pointer(in.Namespace)) + return nil +} + +// Convert_v1beta1_IngressClassParametersReference_To_networking_IngressClassParametersReference is an autogenerated conversion function. +func Convert_v1beta1_IngressClassParametersReference_To_networking_IngressClassParametersReference(in *v1beta1.IngressClassParametersReference, out *networking.IngressClassParametersReference, s conversion.Scope) error { + return autoConvert_v1beta1_IngressClassParametersReference_To_networking_IngressClassParametersReference(in, out, s) +} + +func autoConvert_networking_IngressClassParametersReference_To_v1beta1_IngressClassParametersReference(in *networking.IngressClassParametersReference, out *v1beta1.IngressClassParametersReference, s conversion.Scope) error { + out.APIGroup = (*string)(unsafe.Pointer(in.APIGroup)) + out.Kind = in.Kind + out.Name = in.Name + out.Scope = (*string)(unsafe.Pointer(in.Scope)) + out.Namespace = (*string)(unsafe.Pointer(in.Namespace)) + return nil +} + +// Convert_networking_IngressClassParametersReference_To_v1beta1_IngressClassParametersReference is an autogenerated conversion function. +func Convert_networking_IngressClassParametersReference_To_v1beta1_IngressClassParametersReference(in *networking.IngressClassParametersReference, out *v1beta1.IngressClassParametersReference, s conversion.Scope) error { + return autoConvert_networking_IngressClassParametersReference_To_v1beta1_IngressClassParametersReference(in, out, s) +} + func autoConvert_v1beta1_IngressClassSpec_To_networking_IngressClassSpec(in *v1beta1.IngressClassSpec, out *networking.IngressClassSpec, s conversion.Scope) error { out.Controller = in.Controller - out.Parameters = (*core.TypedLocalObjectReference)(unsafe.Pointer(in.Parameters)) + out.Parameters = (*networking.IngressClassParametersReference)(unsafe.Pointer(in.Parameters)) return nil } @@ -346,7 +384,7 @@ func Convert_v1beta1_IngressClassSpec_To_networking_IngressClassSpec(in *v1beta1 func autoConvert_networking_IngressClassSpec_To_v1beta1_IngressClassSpec(in *networking.IngressClassSpec, out *v1beta1.IngressClassSpec, s conversion.Scope) error { out.Controller = in.Controller - out.Parameters = (*v1.TypedLocalObjectReference)(unsafe.Pointer(in.Parameters)) + out.Parameters = (*v1beta1.IngressClassParametersReference)(unsafe.Pointer(in.Parameters)) return nil } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/networking/validation/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/networking/validation/BUILD deleted file mode 100644 index 24253843628b..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/networking/validation/BUILD +++ /dev/null @@ -1,59 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["validation_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/networking:go_default_library", - "//staging/src/k8s.io/api/networking/v1:go_default_library", - "//staging/src/k8s.io/api/networking/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["validation.go"], - importpath = "k8s.io/kubernetes/pkg/apis/networking/validation", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/validation:go_default_library", - "//pkg/apis/networking:go_default_library", - "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", - "//staging/src/k8s.io/api/networking/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/validation/path:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/networking/validation/validation.go b/vendor/k8s.io/kubernetes/pkg/apis/networking/validation/validation.go index b053d279e64f..1b4acf52b516 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/networking/validation/validation.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/networking/validation/validation.go @@ -31,9 +31,12 @@ import ( "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/validation" "k8s.io/apimachinery/pkg/util/validation/field" + utilfeature "k8s.io/apiserver/pkg/util/feature" api "k8s.io/kubernetes/pkg/apis/core" apivalidation "k8s.io/kubernetes/pkg/apis/core/validation" "k8s.io/kubernetes/pkg/apis/networking" + "k8s.io/kubernetes/pkg/features" + utilpointer "k8s.io/utils/pointer" ) const ( @@ -49,6 +52,11 @@ var ( ) invalidPathSequences = []string{"//", "/./", "/../", "%2f", "%2F"} invalidPathSuffixes = []string{"/..", "/."} + + supportedIngressClassParametersReferenceScopes = sets.NewString( + networking.IngressClassParametersReferenceScopeNamespace, + networking.IngressClassParametersReferenceScopeCluster, + ) ) // ValidateNetworkPolicyName can be used to check whether the given networkpolicy @@ -68,11 +76,26 @@ func ValidateNetworkPolicyPort(port *networking.NetworkPolicyPort, portPath *fie for _, msg := range validation.IsValidPortNum(int(port.Port.IntVal)) { allErrs = append(allErrs, field.Invalid(portPath.Child("port"), port.Port.IntVal, msg)) } + if port.EndPort != nil { + if *port.EndPort < port.Port.IntVal { + allErrs = append(allErrs, field.Invalid(portPath.Child("endPort"), port.Port.IntVal, "must be greater than or equal to `port`")) + } + for _, msg := range validation.IsValidPortNum(int(*port.EndPort)) { + allErrs = append(allErrs, field.Invalid(portPath.Child("endPort"), *port.EndPort, msg)) + } + } } else { + if port.EndPort != nil { + allErrs = append(allErrs, field.Invalid(portPath.Child("endPort"), *port.EndPort, "may not be specified when `port` is non-numeric")) + } for _, msg := range validation.IsValidPortName(port.Port.StrVal) { allErrs = append(allErrs, field.Invalid(portPath.Child("port"), port.Port.StrVal, msg)) } } + } else { + if port.EndPort != nil { + allErrs = append(allErrs, field.Invalid(portPath.Child("endPort"), *port.EndPort, "may not be specified when `port` is not specified")) + } } return allErrs @@ -503,7 +526,7 @@ func validateIngressClassSpec(spec *networking.IngressClassSpec, fldPath *field. allErrs = append(allErrs, field.TooLong(fldPath.Child("controller"), spec.Controller, maxLenIngressClassController)) } allErrs = append(allErrs, validation.IsDomainPrefixedPath(fldPath.Child("controller"), spec.Controller)...) - allErrs = append(allErrs, validateIngressTypedLocalObjectReference(spec.Parameters, fldPath.Child("parameters"))...) + allErrs = append(allErrs, validateIngressClassParametersReference(spec.Parameters, fldPath.Child("parameters"))...) return allErrs } @@ -546,6 +569,55 @@ func validateIngressTypedLocalObjectReference(params *api.TypedLocalObjectRefere return allErrs } +// validateIngressClassParametersReference ensures that Parameters fields are valid. +// Parameters was previously of type `TypedLocalObjectReference` and used +// `validateIngressTypedLocalObjectReference()`. This function extends validation +// for additional fields introduced for namespace-scoped references. +func validateIngressClassParametersReference(params *networking.IngressClassParametersReference, fldPath *field.Path) field.ErrorList { + allErrs := field.ErrorList{} + + if params == nil { + return allErrs + } + + allErrs = append(allErrs, validateIngressTypedLocalObjectReference(&api.TypedLocalObjectReference{ + APIGroup: params.APIGroup, + Kind: params.Kind, + Name: params.Name, + }, fldPath)...) + + if utilfeature.DefaultFeatureGate.Enabled(features.IngressClassNamespacedParams) && params.Scope == nil { + allErrs = append(allErrs, field.Required(fldPath.Child("scope"), "")) + return allErrs + } + + if params.Scope != nil || params.Namespace != nil { + scope := utilpointer.StringPtrDerefOr(params.Scope, "") + + if !supportedIngressClassParametersReferenceScopes.Has(scope) { + allErrs = append(allErrs, field.NotSupported(fldPath.Child("scope"), scope, + supportedIngressClassParametersReferenceScopes.List())) + } else { + + if scope == networking.IngressClassParametersReferenceScopeNamespace { + if params.Namespace == nil { + allErrs = append(allErrs, field.Required(fldPath.Child("namespace"), "`parameters.scope` is set to 'Namespace'")) + } else { + for _, msg := range apivalidation.ValidateNamespaceName(*params.Namespace, false) { + allErrs = append(allErrs, field.Invalid(fldPath.Child("namespace"), *params.Namespace, msg)) + } + } + } + + if scope == networking.IngressClassParametersReferenceScopeCluster && params.Namespace != nil { + allErrs = append(allErrs, field.Forbidden(fldPath.Child("namespace"), "`parameters.scope` is set to 'Cluster'")) + } + } + } + + return allErrs +} + func allowInvalidSecretName(gv schema.GroupVersion, oldIngress *networking.Ingress) bool { if gv == networkingv1beta1.SchemeGroupVersion || gv == extensionsv1beta1.SchemeGroupVersion { // backwards compatibility with released API versions that allowed invalid names diff --git a/vendor/k8s.io/kubernetes/pkg/apis/networking/zz_generated.deepcopy.go b/vendor/k8s.io/kubernetes/pkg/apis/networking/zz_generated.deepcopy.go index a81c0fac7322..b19d0773325f 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/networking/zz_generated.deepcopy.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/networking/zz_generated.deepcopy.go @@ -207,12 +207,43 @@ func (in *IngressClassList) DeepCopyObject() runtime.Object { return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *IngressClassParametersReference) DeepCopyInto(out *IngressClassParametersReference) { + *out = *in + if in.APIGroup != nil { + in, out := &in.APIGroup, &out.APIGroup + *out = new(string) + **out = **in + } + if in.Scope != nil { + in, out := &in.Scope, &out.Scope + *out = new(string) + **out = **in + } + if in.Namespace != nil { + in, out := &in.Namespace, &out.Namespace + *out = new(string) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IngressClassParametersReference. +func (in *IngressClassParametersReference) DeepCopy() *IngressClassParametersReference { + if in == nil { + return nil + } + out := new(IngressClassParametersReference) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *IngressClassSpec) DeepCopyInto(out *IngressClassSpec) { *out = *in if in.Parameters != nil { in, out := &in.Parameters, &out.Parameters - *out = new(core.TypedLocalObjectReference) + *out = new(IngressClassParametersReference) (*in).DeepCopyInto(*out) } return @@ -558,6 +589,11 @@ func (in *NetworkPolicyPort) DeepCopyInto(out *NetworkPolicyPort) { *out = new(intstr.IntOrString) **out = **in } + if in.EndPort != nil { + in, out := &in.EndPort, &out.EndPort + *out = new(int32) + **out = **in + } return } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/node/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/node/BUILD deleted file mode 100644 index a0be8befed60..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/node/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/node", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/apis/node/install:all-srcs", - "//pkg/apis/node/v1:all-srcs", - "//pkg/apis/node/v1alpha1:all-srcs", - "//pkg/apis/node/v1beta1:all-srcs", - "//pkg/apis/node/validation:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/node/install/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/node/install/BUILD deleted file mode 100644 index 874d382761b3..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/node/install/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["install.go"], - importpath = "k8s.io/kubernetes/pkg/apis/node/install", - visibility = ["//visibility:public"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/node:go_default_library", - "//pkg/apis/node/v1:go_default_library", - "//pkg/apis/node/v1alpha1:go_default_library", - "//pkg/apis/node/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/node/install/install.go b/vendor/k8s.io/kubernetes/pkg/apis/node/install/install.go index 678b767b1579..7c5ebcb93d79 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/node/install/install.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/node/install/install.go @@ -38,12 +38,5 @@ func Install(scheme *runtime.Scheme) { utilruntime.Must(v1alpha1.AddToScheme(scheme)) utilruntime.Must(v1beta1.AddToScheme(scheme)) utilruntime.Must(v1.AddToScheme(scheme)) - - // TODO (SergeyKanzhelev): priority should change after 1.21. See https://github.com/kubernetes/kubernetes/pull/95718#discussion_r520969477 - // This is what controls the preferred serialization version. Add both v1beta1 and v1 here, and prefer v1beta1 over v1 until 1.21. See the comment on test/integration/etcd around serialized version. - // - // Details on why we can't advance the storage version for a release are at https://kubernetes.io/docs/reference/using-api/deprecation-policy/: - // - // > Rule #4b: The "preferred" API version and the "storage version" for a given group may not advance until after a release has been made that supports both the new version and the previous version - utilruntime.Must(scheme.SetVersionPriority(v1beta1.SchemeGroupVersion, v1.SchemeGroupVersion)) + utilruntime.Must(scheme.SetVersionPriority(v1.SchemeGroupVersion, v1beta1.SchemeGroupVersion)) } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/node/v1/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/node/v1/BUILD deleted file mode 100644 index 088a6c3703b9..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/node/v1/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "zz_generated.conversion.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/node/v1", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/node:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/node/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/node/v1alpha1/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/node/v1alpha1/BUILD deleted file mode 100644 index 54d82e929bde..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/node/v1alpha1/BUILD +++ /dev/null @@ -1,52 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "doc.go", - "register.go", - "zz_generated.conversion.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/node/v1alpha1", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/node:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/node/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["conversion_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/node:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/node/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/node/v1beta1/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/node/v1beta1/BUILD deleted file mode 100644 index 07ef4b482b27..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/node/v1beta1/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "zz_generated.conversion.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/node/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/node:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/node/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/node/validation/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/node/validation/BUILD deleted file mode 100644 index 9fdead49ccc6..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/node/validation/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["validation.go"], - importpath = "k8s.io/kubernetes/pkg/apis/node/validation", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/validation:go_default_library", - "//pkg/apis/node:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["validation_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/node:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/node/validation/validation.go b/vendor/k8s.io/kubernetes/pkg/apis/node/validation/validation.go index 3f9ce994f4cd..60f6161611f9 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/node/validation/validation.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/node/validation/validation.go @@ -54,7 +54,8 @@ func ValidateRuntimeClassUpdate(new, old *node.RuntimeClass) field.ErrorList { func validateOverhead(overhead *node.Overhead, fldPath *field.Path) field.ErrorList { // reuse the ResourceRequirements validation logic - return corevalidation.ValidateResourceRequirements(&core.ResourceRequirements{Limits: overhead.PodFixed}, fldPath) + return corevalidation.ValidateResourceRequirements(&core.ResourceRequirements{Limits: overhead.PodFixed}, fldPath, + corevalidation.PodValidationOptions{}) } func validateScheduling(s *node.Scheduling, fldPath *field.Path) field.ErrorList { diff --git a/vendor/k8s.io/kubernetes/pkg/apis/policy/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/policy/BUILD deleted file mode 100644 index e1ea426b2e49..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/policy/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/policy", - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/apis/policy/fuzzer:all-srcs", - "//pkg/apis/policy/install:all-srcs", - "//pkg/apis/policy/v1beta1:all-srcs", - "//pkg/apis/policy/validation:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/policy/helper.go b/vendor/k8s.io/kubernetes/pkg/apis/policy/helper.go new file mode 100644 index 000000000000..4dd1658abc71 --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/apis/policy/helper.go @@ -0,0 +1,51 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package policy + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +const ( + PDBV1beta1Label = "pdb.kubernetes.io/deprecated-v1beta1-empty-selector-match" +) + +var ( + NonV1beta1MatchAllSelector = &metav1.LabelSelector{} + NonV1beta1MatchNoneSelector = &metav1.LabelSelector{ + MatchExpressions: []metav1.LabelSelectorRequirement{{Key: PDBV1beta1Label, Operator: metav1.LabelSelectorOpExists}}, + } + + V1beta1MatchNoneSelector = &metav1.LabelSelector{} + V1beta1MatchAllSelector = &metav1.LabelSelector{ + MatchExpressions: []metav1.LabelSelectorRequirement{{Key: PDBV1beta1Label, Operator: metav1.LabelSelectorOpDoesNotExist}}, + } +) + +func StripPDBV1beta1Label(selector *metav1.LabelSelector) { + if selector == nil { + return + } + + trimmedMatchExpressions := selector.MatchExpressions[:0] + for _, exp := range selector.MatchExpressions { + if exp.Key != PDBV1beta1Label { + trimmedMatchExpressions = append(trimmedMatchExpressions, exp) + } + } + selector.MatchExpressions = trimmedMatchExpressions +} diff --git a/vendor/k8s.io/kubernetes/pkg/apis/policy/install/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/policy/install/BUILD deleted file mode 100644 index b695383206ab..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/policy/install/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["install.go"], - importpath = "k8s.io/kubernetes/pkg/apis/policy/install", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/policy:go_default_library", - "//pkg/apis/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/policy/install/install.go b/vendor/k8s.io/kubernetes/pkg/apis/policy/install/install.go index 0d91720e4d8f..b3e2475e910e 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/policy/install/install.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/policy/install/install.go @@ -23,6 +23,7 @@ import ( utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/apis/policy" + "k8s.io/kubernetes/pkg/apis/policy/v1" "k8s.io/kubernetes/pkg/apis/policy/v1beta1" ) @@ -34,5 +35,7 @@ func init() { func Install(scheme *runtime.Scheme) { utilruntime.Must(policy.AddToScheme(scheme)) utilruntime.Must(v1beta1.AddToScheme(scheme)) - utilruntime.Must(scheme.SetVersionPriority(v1beta1.SchemeGroupVersion)) + utilruntime.Must(v1.AddToScheme(scheme)) + // TODO (mortent): priority should change after 1.21. See https://github.com/kubernetes/kubernetes/pull/95718#discussion_r520969477 + utilruntime.Must(scheme.SetVersionPriority(v1beta1.SchemeGroupVersion, v1.SchemeGroupVersion)) } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/policy/types.go b/vendor/k8s.io/kubernetes/pkg/apis/policy/types.go index 5dcee4cdac5f..b3884d5e4809 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/policy/types.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/policy/types.go @@ -77,6 +77,10 @@ type PodDisruptionBudgetStatus struct { // total number of pods counted by this disruption budget ExpectedPods int32 + + // Conditions contain conditions for PDB + // +optional + Conditions []metav1.Condition } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object @@ -305,6 +309,7 @@ const ( PortworxVolume FSType = "portworxVolume" ScaleIO FSType = "scaleIO" CSI FSType = "csi" + Ephemeral FSType = "ephemeral" All FSType = "*" ) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/policy/v1/conversion.go b/vendor/k8s.io/kubernetes/pkg/apis/policy/v1/conversion.go new file mode 100644 index 000000000000..d3aedbd634d2 --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/apis/policy/v1/conversion.go @@ -0,0 +1,42 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1 + +import ( + "k8s.io/api/policy/v1" + apiequality "k8s.io/apimachinery/pkg/api/equality" + "k8s.io/apimachinery/pkg/conversion" + "k8s.io/kubernetes/pkg/apis/policy" +) + +func Convert_v1_PodDisruptionBudget_To_policy_PodDisruptionBudget(in *v1.PodDisruptionBudget, out *policy.PodDisruptionBudget, s conversion.Scope) error { + if err := autoConvert_v1_PodDisruptionBudget_To_policy_PodDisruptionBudget(in, out, s); err != nil { + return err + } + + switch { + case apiequality.Semantic.DeepEqual(in.Spec.Selector, policy.NonV1beta1MatchNoneSelector): + // no-op, preserve + case apiequality.Semantic.DeepEqual(in.Spec.Selector, policy.NonV1beta1MatchAllSelector): + // no-op, preserve + default: + // otherwise, make sure the label intended to be used in a match-all or match-none selector + // never gets combined with user-specified fields + policy.StripPDBV1beta1Label(out.Spec.Selector) + } + return nil +} diff --git a/vendor/k8s.io/kubernetes/pkg/apis/policy/v1/doc.go b/vendor/k8s.io/kubernetes/pkg/apis/policy/v1/doc.go new file mode 100644 index 000000000000..f5d07a38d535 --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/apis/policy/v1/doc.go @@ -0,0 +1,24 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// +k8s:conversion-gen=k8s.io/kubernetes/pkg/apis/policy +// +k8s:conversion-gen-external-types=k8s.io/api/policy/v1 +// +k8s:defaulter-gen=TypeMeta +// +k8s:defaulter-gen-input=../../../../vendor/k8s.io/api/policy/v1 + +// Package policy is for any kind of policy object. Currently, this only +// includes policyv1.PodDisruptionBudget +package v1 // import "k8s.io/kubernetes/pkg/apis/policy/v1" diff --git a/vendor/k8s.io/kubernetes/pkg/apis/policy/v1/register.go b/vendor/k8s.io/kubernetes/pkg/apis/policy/v1/register.go new file mode 100644 index 000000000000..bd3f8f379a23 --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/apis/policy/v1/register.go @@ -0,0 +1,45 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1 + +import ( + policyv1 "k8s.io/api/policy/v1" + "k8s.io/apimachinery/pkg/runtime/schema" +) + +// GroupName is the group name use in this package +const GroupName = "policy" + +// SchemeGroupVersion is group version used to register these objects +var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: "v1"} + +// Resource takes an unqualified resource and returns a Group qualified GroupResource +func Resource(resource string) schema.GroupResource { + return SchemeGroupVersion.WithResource(resource).GroupResource() +} + +var ( + localSchemeBuilder = &policyv1.SchemeBuilder + AddToScheme = localSchemeBuilder.AddToScheme +) + +func init() { + // We only register manually written functions here. The registration of the + // generated functions takes place in the generated files. The separation + // makes the code compile even when the generated files are missing. + localSchemeBuilder.Register(RegisterDefaults) +} diff --git a/vendor/k8s.io/kubernetes/pkg/apis/policy/v1/zz_generated.conversion.go b/vendor/k8s.io/kubernetes/pkg/apis/policy/v1/zz_generated.conversion.go new file mode 100644 index 000000000000..d9d5eb840a42 --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/apis/policy/v1/zz_generated.conversion.go @@ -0,0 +1,207 @@ +// +build !ignore_autogenerated + +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by conversion-gen. DO NOT EDIT. + +package v1 + +import ( + unsafe "unsafe" + + v1 "k8s.io/api/policy/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + conversion "k8s.io/apimachinery/pkg/conversion" + runtime "k8s.io/apimachinery/pkg/runtime" + intstr "k8s.io/apimachinery/pkg/util/intstr" + policy "k8s.io/kubernetes/pkg/apis/policy" +) + +func init() { + localSchemeBuilder.Register(RegisterConversions) +} + +// RegisterConversions adds conversion functions to the given scheme. +// Public to allow building arbitrary schemes. +func RegisterConversions(s *runtime.Scheme) error { + if err := s.AddGeneratedConversionFunc((*policy.PodDisruptionBudget)(nil), (*v1.PodDisruptionBudget)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_policy_PodDisruptionBudget_To_v1_PodDisruptionBudget(a.(*policy.PodDisruptionBudget), b.(*v1.PodDisruptionBudget), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.PodDisruptionBudgetList)(nil), (*policy.PodDisruptionBudgetList)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_PodDisruptionBudgetList_To_policy_PodDisruptionBudgetList(a.(*v1.PodDisruptionBudgetList), b.(*policy.PodDisruptionBudgetList), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*policy.PodDisruptionBudgetList)(nil), (*v1.PodDisruptionBudgetList)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_policy_PodDisruptionBudgetList_To_v1_PodDisruptionBudgetList(a.(*policy.PodDisruptionBudgetList), b.(*v1.PodDisruptionBudgetList), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.PodDisruptionBudgetSpec)(nil), (*policy.PodDisruptionBudgetSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_PodDisruptionBudgetSpec_To_policy_PodDisruptionBudgetSpec(a.(*v1.PodDisruptionBudgetSpec), b.(*policy.PodDisruptionBudgetSpec), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*policy.PodDisruptionBudgetSpec)(nil), (*v1.PodDisruptionBudgetSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_policy_PodDisruptionBudgetSpec_To_v1_PodDisruptionBudgetSpec(a.(*policy.PodDisruptionBudgetSpec), b.(*v1.PodDisruptionBudgetSpec), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.PodDisruptionBudgetStatus)(nil), (*policy.PodDisruptionBudgetStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_PodDisruptionBudgetStatus_To_policy_PodDisruptionBudgetStatus(a.(*v1.PodDisruptionBudgetStatus), b.(*policy.PodDisruptionBudgetStatus), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*policy.PodDisruptionBudgetStatus)(nil), (*v1.PodDisruptionBudgetStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_policy_PodDisruptionBudgetStatus_To_v1_PodDisruptionBudgetStatus(a.(*policy.PodDisruptionBudgetStatus), b.(*v1.PodDisruptionBudgetStatus), scope) + }); err != nil { + return err + } + if err := s.AddConversionFunc((*v1.PodDisruptionBudget)(nil), (*policy.PodDisruptionBudget)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_PodDisruptionBudget_To_policy_PodDisruptionBudget(a.(*v1.PodDisruptionBudget), b.(*policy.PodDisruptionBudget), scope) + }); err != nil { + return err + } + return nil +} + +func autoConvert_v1_PodDisruptionBudget_To_policy_PodDisruptionBudget(in *v1.PodDisruptionBudget, out *policy.PodDisruptionBudget, s conversion.Scope) error { + out.ObjectMeta = in.ObjectMeta + if err := Convert_v1_PodDisruptionBudgetSpec_To_policy_PodDisruptionBudgetSpec(&in.Spec, &out.Spec, s); err != nil { + return err + } + if err := Convert_v1_PodDisruptionBudgetStatus_To_policy_PodDisruptionBudgetStatus(&in.Status, &out.Status, s); err != nil { + return err + } + return nil +} + +func autoConvert_policy_PodDisruptionBudget_To_v1_PodDisruptionBudget(in *policy.PodDisruptionBudget, out *v1.PodDisruptionBudget, s conversion.Scope) error { + out.ObjectMeta = in.ObjectMeta + if err := Convert_policy_PodDisruptionBudgetSpec_To_v1_PodDisruptionBudgetSpec(&in.Spec, &out.Spec, s); err != nil { + return err + } + if err := Convert_policy_PodDisruptionBudgetStatus_To_v1_PodDisruptionBudgetStatus(&in.Status, &out.Status, s); err != nil { + return err + } + return nil +} + +// Convert_policy_PodDisruptionBudget_To_v1_PodDisruptionBudget is an autogenerated conversion function. +func Convert_policy_PodDisruptionBudget_To_v1_PodDisruptionBudget(in *policy.PodDisruptionBudget, out *v1.PodDisruptionBudget, s conversion.Scope) error { + return autoConvert_policy_PodDisruptionBudget_To_v1_PodDisruptionBudget(in, out, s) +} + +func autoConvert_v1_PodDisruptionBudgetList_To_policy_PodDisruptionBudgetList(in *v1.PodDisruptionBudgetList, out *policy.PodDisruptionBudgetList, s conversion.Scope) error { + out.ListMeta = in.ListMeta + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]policy.PodDisruptionBudget, len(*in)) + for i := range *in { + if err := Convert_v1_PodDisruptionBudget_To_policy_PodDisruptionBudget(&(*in)[i], &(*out)[i], s); err != nil { + return err + } + } + } else { + out.Items = nil + } + return nil +} + +// Convert_v1_PodDisruptionBudgetList_To_policy_PodDisruptionBudgetList is an autogenerated conversion function. +func Convert_v1_PodDisruptionBudgetList_To_policy_PodDisruptionBudgetList(in *v1.PodDisruptionBudgetList, out *policy.PodDisruptionBudgetList, s conversion.Scope) error { + return autoConvert_v1_PodDisruptionBudgetList_To_policy_PodDisruptionBudgetList(in, out, s) +} + +func autoConvert_policy_PodDisruptionBudgetList_To_v1_PodDisruptionBudgetList(in *policy.PodDisruptionBudgetList, out *v1.PodDisruptionBudgetList, s conversion.Scope) error { + out.ListMeta = in.ListMeta + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]v1.PodDisruptionBudget, len(*in)) + for i := range *in { + if err := Convert_policy_PodDisruptionBudget_To_v1_PodDisruptionBudget(&(*in)[i], &(*out)[i], s); err != nil { + return err + } + } + } else { + out.Items = nil + } + return nil +} + +// Convert_policy_PodDisruptionBudgetList_To_v1_PodDisruptionBudgetList is an autogenerated conversion function. +func Convert_policy_PodDisruptionBudgetList_To_v1_PodDisruptionBudgetList(in *policy.PodDisruptionBudgetList, out *v1.PodDisruptionBudgetList, s conversion.Scope) error { + return autoConvert_policy_PodDisruptionBudgetList_To_v1_PodDisruptionBudgetList(in, out, s) +} + +func autoConvert_v1_PodDisruptionBudgetSpec_To_policy_PodDisruptionBudgetSpec(in *v1.PodDisruptionBudgetSpec, out *policy.PodDisruptionBudgetSpec, s conversion.Scope) error { + out.MinAvailable = (*intstr.IntOrString)(unsafe.Pointer(in.MinAvailable)) + out.Selector = (*metav1.LabelSelector)(unsafe.Pointer(in.Selector)) + out.MaxUnavailable = (*intstr.IntOrString)(unsafe.Pointer(in.MaxUnavailable)) + return nil +} + +// Convert_v1_PodDisruptionBudgetSpec_To_policy_PodDisruptionBudgetSpec is an autogenerated conversion function. +func Convert_v1_PodDisruptionBudgetSpec_To_policy_PodDisruptionBudgetSpec(in *v1.PodDisruptionBudgetSpec, out *policy.PodDisruptionBudgetSpec, s conversion.Scope) error { + return autoConvert_v1_PodDisruptionBudgetSpec_To_policy_PodDisruptionBudgetSpec(in, out, s) +} + +func autoConvert_policy_PodDisruptionBudgetSpec_To_v1_PodDisruptionBudgetSpec(in *policy.PodDisruptionBudgetSpec, out *v1.PodDisruptionBudgetSpec, s conversion.Scope) error { + out.MinAvailable = (*intstr.IntOrString)(unsafe.Pointer(in.MinAvailable)) + out.Selector = (*metav1.LabelSelector)(unsafe.Pointer(in.Selector)) + out.MaxUnavailable = (*intstr.IntOrString)(unsafe.Pointer(in.MaxUnavailable)) + return nil +} + +// Convert_policy_PodDisruptionBudgetSpec_To_v1_PodDisruptionBudgetSpec is an autogenerated conversion function. +func Convert_policy_PodDisruptionBudgetSpec_To_v1_PodDisruptionBudgetSpec(in *policy.PodDisruptionBudgetSpec, out *v1.PodDisruptionBudgetSpec, s conversion.Scope) error { + return autoConvert_policy_PodDisruptionBudgetSpec_To_v1_PodDisruptionBudgetSpec(in, out, s) +} + +func autoConvert_v1_PodDisruptionBudgetStatus_To_policy_PodDisruptionBudgetStatus(in *v1.PodDisruptionBudgetStatus, out *policy.PodDisruptionBudgetStatus, s conversion.Scope) error { + out.ObservedGeneration = in.ObservedGeneration + out.DisruptedPods = *(*map[string]metav1.Time)(unsafe.Pointer(&in.DisruptedPods)) + out.DisruptionsAllowed = in.DisruptionsAllowed + out.CurrentHealthy = in.CurrentHealthy + out.DesiredHealthy = in.DesiredHealthy + out.ExpectedPods = in.ExpectedPods + out.Conditions = *(*[]metav1.Condition)(unsafe.Pointer(&in.Conditions)) + return nil +} + +// Convert_v1_PodDisruptionBudgetStatus_To_policy_PodDisruptionBudgetStatus is an autogenerated conversion function. +func Convert_v1_PodDisruptionBudgetStatus_To_policy_PodDisruptionBudgetStatus(in *v1.PodDisruptionBudgetStatus, out *policy.PodDisruptionBudgetStatus, s conversion.Scope) error { + return autoConvert_v1_PodDisruptionBudgetStatus_To_policy_PodDisruptionBudgetStatus(in, out, s) +} + +func autoConvert_policy_PodDisruptionBudgetStatus_To_v1_PodDisruptionBudgetStatus(in *policy.PodDisruptionBudgetStatus, out *v1.PodDisruptionBudgetStatus, s conversion.Scope) error { + out.ObservedGeneration = in.ObservedGeneration + out.DisruptedPods = *(*map[string]metav1.Time)(unsafe.Pointer(&in.DisruptedPods)) + out.DisruptionsAllowed = in.DisruptionsAllowed + out.CurrentHealthy = in.CurrentHealthy + out.DesiredHealthy = in.DesiredHealthy + out.ExpectedPods = in.ExpectedPods + out.Conditions = *(*[]metav1.Condition)(unsafe.Pointer(&in.Conditions)) + return nil +} + +// Convert_policy_PodDisruptionBudgetStatus_To_v1_PodDisruptionBudgetStatus is an autogenerated conversion function. +func Convert_policy_PodDisruptionBudgetStatus_To_v1_PodDisruptionBudgetStatus(in *policy.PodDisruptionBudgetStatus, out *v1.PodDisruptionBudgetStatus, s conversion.Scope) error { + return autoConvert_policy_PodDisruptionBudgetStatus_To_v1_PodDisruptionBudgetStatus(in, out, s) +} diff --git a/vendor/k8s.io/kubernetes/pkg/apis/policy/v1/zz_generated.defaults.go b/vendor/k8s.io/kubernetes/pkg/apis/policy/v1/zz_generated.defaults.go new file mode 100644 index 000000000000..cce2e603a69a --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/apis/policy/v1/zz_generated.defaults.go @@ -0,0 +1,32 @@ +// +build !ignore_autogenerated + +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by defaulter-gen. DO NOT EDIT. + +package v1 + +import ( + runtime "k8s.io/apimachinery/pkg/runtime" +) + +// RegisterDefaults adds defaulters functions to the given scheme. +// Public to allow building arbitrary schemes. +// All generated defaulters are covering - they call all nested defaulters. +func RegisterDefaults(scheme *runtime.Scheme) error { + return nil +} diff --git a/vendor/k8s.io/kubernetes/pkg/apis/policy/v1beta1/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/policy/v1beta1/BUILD deleted file mode 100644 index b2845830edc9..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/policy/v1beta1/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "defaults.go", - "doc.go", - "register.go", - "zz_generated.conversion.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/policy/v1beta1", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/policy:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/policy/v1beta1/conversion.go b/vendor/k8s.io/kubernetes/pkg/apis/policy/v1beta1/conversion.go new file mode 100644 index 000000000000..0164fbfe1c5a --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/apis/policy/v1beta1/conversion.go @@ -0,0 +1,66 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1beta1 + +import ( + "k8s.io/api/policy/v1beta1" + apiequality "k8s.io/apimachinery/pkg/api/equality" + "k8s.io/apimachinery/pkg/conversion" + "k8s.io/kubernetes/pkg/apis/policy" +) + +func Convert_v1beta1_PodDisruptionBudget_To_policy_PodDisruptionBudget(in *v1beta1.PodDisruptionBudget, out *policy.PodDisruptionBudget, s conversion.Scope) error { + if err := autoConvert_v1beta1_PodDisruptionBudget_To_policy_PodDisruptionBudget(in, out, s); err != nil { + return err + } + + switch { + case apiequality.Semantic.DeepEqual(in.Spec.Selector, policy.V1beta1MatchNoneSelector): + // If the v1beta1 version has a non-nil but empty selector, it should be + // selecting no pods, even when used with the internal or v1 api. We + // add a selector that is non-empty but will never match any pods. + out.Spec.Selector = policy.NonV1beta1MatchNoneSelector.DeepCopy() + case apiequality.Semantic.DeepEqual(in.Spec.Selector, policy.V1beta1MatchAllSelector): + // If the v1beta1 version has our v1beta1-specific "match-all" selector, + // swap that out for a simpler empty "match-all" selector for v1 + out.Spec.Selector = policy.NonV1beta1MatchAllSelector.DeepCopy() + default: + // otherwise, make sure the label intended to be used in a match-all or match-none selector + // never gets combined with user-specified fields + policy.StripPDBV1beta1Label(out.Spec.Selector) + } + return nil +} + +func Convert_policy_PodDisruptionBudget_To_v1beta1_PodDisruptionBudget(in *policy.PodDisruptionBudget, out *v1beta1.PodDisruptionBudget, s conversion.Scope) error { + if err := autoConvert_policy_PodDisruptionBudget_To_v1beta1_PodDisruptionBudget(in, out, s); err != nil { + return err + } + + switch { + case apiequality.Semantic.DeepEqual(in.Spec.Selector, policy.NonV1beta1MatchNoneSelector): + // If the internal version has our v1beta1-specific "match-none" selector, + // swap that out for a simpler empty "match-none" selector for v1beta1 + out.Spec.Selector = policy.V1beta1MatchNoneSelector.DeepCopy() + case apiequality.Semantic.DeepEqual(in.Spec.Selector, policy.NonV1beta1MatchAllSelector): + // If the internal version has a non-nil but empty selector, we want it to + // select all pods. We make sure this happens even with the v1beta1 api by + // adding a non-empty selector that selects all pods. + out.Spec.Selector = policy.V1beta1MatchAllSelector.DeepCopy() + } + return nil +} diff --git a/vendor/k8s.io/kubernetes/pkg/apis/policy/v1beta1/zz_generated.conversion.go b/vendor/k8s.io/kubernetes/pkg/apis/policy/v1beta1/zz_generated.conversion.go index 50997715610f..71ef27fcd51a 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/policy/v1beta1/zz_generated.conversion.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/policy/v1beta1/zz_generated.conversion.go @@ -110,16 +110,6 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*v1beta1.PodDisruptionBudget)(nil), (*policy.PodDisruptionBudget)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1beta1_PodDisruptionBudget_To_policy_PodDisruptionBudget(a.(*v1beta1.PodDisruptionBudget), b.(*policy.PodDisruptionBudget), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*policy.PodDisruptionBudget)(nil), (*v1beta1.PodDisruptionBudget)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_policy_PodDisruptionBudget_To_v1beta1_PodDisruptionBudget(a.(*policy.PodDisruptionBudget), b.(*v1beta1.PodDisruptionBudget), scope) - }); err != nil { - return err - } if err := s.AddGeneratedConversionFunc((*v1beta1.PodDisruptionBudgetList)(nil), (*policy.PodDisruptionBudgetList)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1beta1_PodDisruptionBudgetList_To_policy_PodDisruptionBudgetList(a.(*v1beta1.PodDisruptionBudgetList), b.(*policy.PodDisruptionBudgetList), scope) }); err != nil { @@ -230,6 +220,16 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddConversionFunc((*policy.PodDisruptionBudget)(nil), (*v1beta1.PodDisruptionBudget)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_policy_PodDisruptionBudget_To_v1beta1_PodDisruptionBudget(a.(*policy.PodDisruptionBudget), b.(*v1beta1.PodDisruptionBudget), scope) + }); err != nil { + return err + } + if err := s.AddConversionFunc((*v1beta1.PodDisruptionBudget)(nil), (*policy.PodDisruptionBudget)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1beta1_PodDisruptionBudget_To_policy_PodDisruptionBudget(a.(*v1beta1.PodDisruptionBudget), b.(*policy.PodDisruptionBudget), scope) + }); err != nil { + return err + } return nil } @@ -394,11 +394,6 @@ func autoConvert_v1beta1_PodDisruptionBudget_To_policy_PodDisruptionBudget(in *v return nil } -// Convert_v1beta1_PodDisruptionBudget_To_policy_PodDisruptionBudget is an autogenerated conversion function. -func Convert_v1beta1_PodDisruptionBudget_To_policy_PodDisruptionBudget(in *v1beta1.PodDisruptionBudget, out *policy.PodDisruptionBudget, s conversion.Scope) error { - return autoConvert_v1beta1_PodDisruptionBudget_To_policy_PodDisruptionBudget(in, out, s) -} - func autoConvert_policy_PodDisruptionBudget_To_v1beta1_PodDisruptionBudget(in *policy.PodDisruptionBudget, out *v1beta1.PodDisruptionBudget, s conversion.Scope) error { out.ObjectMeta = in.ObjectMeta if err := Convert_policy_PodDisruptionBudgetSpec_To_v1beta1_PodDisruptionBudgetSpec(&in.Spec, &out.Spec, s); err != nil { @@ -410,14 +405,19 @@ func autoConvert_policy_PodDisruptionBudget_To_v1beta1_PodDisruptionBudget(in *p return nil } -// Convert_policy_PodDisruptionBudget_To_v1beta1_PodDisruptionBudget is an autogenerated conversion function. -func Convert_policy_PodDisruptionBudget_To_v1beta1_PodDisruptionBudget(in *policy.PodDisruptionBudget, out *v1beta1.PodDisruptionBudget, s conversion.Scope) error { - return autoConvert_policy_PodDisruptionBudget_To_v1beta1_PodDisruptionBudget(in, out, s) -} - func autoConvert_v1beta1_PodDisruptionBudgetList_To_policy_PodDisruptionBudgetList(in *v1beta1.PodDisruptionBudgetList, out *policy.PodDisruptionBudgetList, s conversion.Scope) error { out.ListMeta = in.ListMeta - out.Items = *(*[]policy.PodDisruptionBudget)(unsafe.Pointer(&in.Items)) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]policy.PodDisruptionBudget, len(*in)) + for i := range *in { + if err := Convert_v1beta1_PodDisruptionBudget_To_policy_PodDisruptionBudget(&(*in)[i], &(*out)[i], s); err != nil { + return err + } + } + } else { + out.Items = nil + } return nil } @@ -428,7 +428,17 @@ func Convert_v1beta1_PodDisruptionBudgetList_To_policy_PodDisruptionBudgetList(i func autoConvert_policy_PodDisruptionBudgetList_To_v1beta1_PodDisruptionBudgetList(in *policy.PodDisruptionBudgetList, out *v1beta1.PodDisruptionBudgetList, s conversion.Scope) error { out.ListMeta = in.ListMeta - out.Items = *(*[]v1beta1.PodDisruptionBudget)(unsafe.Pointer(&in.Items)) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]v1beta1.PodDisruptionBudget, len(*in)) + for i := range *in { + if err := Convert_policy_PodDisruptionBudget_To_v1beta1_PodDisruptionBudget(&(*in)[i], &(*out)[i], s); err != nil { + return err + } + } + } else { + out.Items = nil + } return nil } @@ -468,6 +478,7 @@ func autoConvert_v1beta1_PodDisruptionBudgetStatus_To_policy_PodDisruptionBudget out.CurrentHealthy = in.CurrentHealthy out.DesiredHealthy = in.DesiredHealthy out.ExpectedPods = in.ExpectedPods + out.Conditions = *(*[]v1.Condition)(unsafe.Pointer(&in.Conditions)) return nil } @@ -483,6 +494,7 @@ func autoConvert_policy_PodDisruptionBudgetStatus_To_v1beta1_PodDisruptionBudget out.CurrentHealthy = in.CurrentHealthy out.DesiredHealthy = in.DesiredHealthy out.ExpectedPods = in.ExpectedPods + out.Conditions = *(*[]v1.Condition)(unsafe.Pointer(&in.Conditions)) return nil } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/policy/validation/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/policy/validation/BUILD deleted file mode 100644 index a1d627225c14..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/policy/validation/BUILD +++ /dev/null @@ -1,58 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["validation.go"], - importpath = "k8s.io/kubernetes/pkg/apis/policy/validation", - deps = [ - "//pkg/apis/apps/validation:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/validation:go_default_library", - "//pkg/apis/policy:go_default_library", - "//pkg/security/apparmor:go_default_library", - "//pkg/security/podsecuritypolicy/seccomp:go_default_library", - "//pkg/security/podsecuritypolicy/util:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["validation_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/policy:go_default_library", - "//pkg/security/podsecuritypolicy/seccomp:go_default_library", - "//pkg/security/podsecuritypolicy/util:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/policy/validation/validation.go b/vendor/k8s.io/kubernetes/pkg/apis/policy/validation/validation.go index 35281eeadbef..a18d850ce6c7 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/policy/validation/validation.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/policy/validation/validation.go @@ -23,8 +23,10 @@ import ( "strings" "k8s.io/api/core/v1" + policyapiv1beta1 "k8s.io/api/policy/v1beta1" apimachineryvalidation "k8s.io/apimachinery/pkg/api/validation" unversionedvalidation "k8s.io/apimachinery/pkg/apis/meta/v1/validation" + "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/validation/field" appsvalidation "k8s.io/kubernetes/pkg/apis/apps/validation" @@ -40,7 +42,6 @@ import ( // with any errors. func ValidatePodDisruptionBudget(pdb *policy.PodDisruptionBudget) field.ErrorList { allErrs := ValidatePodDisruptionBudgetSpec(pdb.Spec, field.NewPath("spec")) - allErrs = append(allErrs, ValidatePodDisruptionBudgetStatus(pdb.Status, field.NewPath("status"))...) return allErrs } @@ -68,10 +69,16 @@ func ValidatePodDisruptionBudgetSpec(spec policy.PodDisruptionBudgetSpec, fldPat return allErrs } -// ValidatePodDisruptionBudgetStatus validates a PodDisruptionBudgetStatus and returns an ErrorList +// ValidatePodDisruptionBudgetStatusUpdate validates a PodDisruptionBudgetStatus and returns an ErrorList // with any errors. -func ValidatePodDisruptionBudgetStatus(status policy.PodDisruptionBudgetStatus, fldPath *field.Path) field.ErrorList { +func ValidatePodDisruptionBudgetStatusUpdate(status, oldStatus policy.PodDisruptionBudgetStatus, fldPath *field.Path, apiVersion schema.GroupVersion) field.ErrorList { allErrs := field.ErrorList{} + allErrs = append(allErrs, unversionedvalidation.ValidateConditions(status.Conditions, fldPath.Child("conditions"))...) + // Don't run other validations for v1beta1 since we don't want to introduce + // new validations retroactively. + if apiVersion == policyapiv1beta1.SchemeGroupVersion { + return allErrs + } allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(status.DisruptionsAllowed), fldPath.Child("disruptionsAllowed"))...) allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(status.CurrentHealthy), fldPath.Child("currentHealthy"))...) allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(status.DesiredHealthy), fldPath.Child("desiredHealthy"))...) @@ -85,19 +92,26 @@ func ValidatePodDisruptionBudgetStatus(status policy.PodDisruptionBudgetStatus, // trailing dashes are allowed. var ValidatePodSecurityPolicyName = apimachineryvalidation.NameIsDNSSubdomain +// PodSecurityPolicyValidationOptions contains additional parameters for ValidatePodSecurityPolicy. +type PodSecurityPolicyValidationOptions struct { + // AllowEphemeralVolumeType determines whether Ephemeral is a valid entry + // in PodSecurityPolicySpec.Volumes. + AllowEphemeralVolumeType bool +} + // ValidatePodSecurityPolicy validates a PodSecurityPolicy and returns an ErrorList // with any errors. -func ValidatePodSecurityPolicy(psp *policy.PodSecurityPolicy) field.ErrorList { +func ValidatePodSecurityPolicy(psp *policy.PodSecurityPolicy, opts PodSecurityPolicyValidationOptions) field.ErrorList { allErrs := field.ErrorList{} allErrs = append(allErrs, apivalidation.ValidateObjectMeta(&psp.ObjectMeta, false, ValidatePodSecurityPolicyName, field.NewPath("metadata"))...) allErrs = append(allErrs, ValidatePodSecurityPolicySpecificAnnotations(psp.Annotations, field.NewPath("metadata").Child("annotations"))...) - allErrs = append(allErrs, ValidatePodSecurityPolicySpec(&psp.Spec, field.NewPath("spec"))...) + allErrs = append(allErrs, ValidatePodSecurityPolicySpec(&psp.Spec, opts, field.NewPath("spec"))...) return allErrs } // ValidatePodSecurityPolicySpec validates a PodSecurityPolicySpec and returns an ErrorList // with any errors. -func ValidatePodSecurityPolicySpec(spec *policy.PodSecurityPolicySpec, fldPath *field.Path) field.ErrorList { +func ValidatePodSecurityPolicySpec(spec *policy.PodSecurityPolicySpec, opts PodSecurityPolicyValidationOptions, fldPath *field.Path) field.ErrorList { allErrs := field.ErrorList{} allErrs = append(allErrs, validatePSPRunAsUser(fldPath.Child("runAsUser"), &spec.RunAsUser)...) @@ -105,7 +119,7 @@ func ValidatePodSecurityPolicySpec(spec *policy.PodSecurityPolicySpec, fldPath * allErrs = append(allErrs, validatePSPSELinux(fldPath.Child("seLinux"), &spec.SELinux)...) allErrs = append(allErrs, validatePSPSupplementalGroup(fldPath.Child("supplementalGroups"), &spec.SupplementalGroups)...) allErrs = append(allErrs, validatePSPFSGroup(fldPath.Child("fsGroup"), &spec.FSGroup)...) - allErrs = append(allErrs, validatePodSecurityPolicyVolumes(fldPath, spec.Volumes)...) + allErrs = append(allErrs, validatePodSecurityPolicyVolumes(opts, fldPath, spec.Volumes)...) if len(spec.RequiredDropCapabilities) > 0 && hasCap(policy.AllowAllCapabilities, spec.AllowedCapabilities) { allErrs = append(allErrs, field.Invalid(field.NewPath("requiredDropCapabilities"), spec.RequiredDropCapabilities, "must be empty when all capabilities are allowed by a wildcard")) @@ -313,11 +327,15 @@ func validatePSPSupplementalGroup(fldPath *field.Path, groupOptions *policy.Supp } // validatePodSecurityPolicyVolumes validates the volume fields of PodSecurityPolicy. -func validatePodSecurityPolicyVolumes(fldPath *field.Path, volumes []policy.FSType) field.ErrorList { +func validatePodSecurityPolicyVolumes(opts PodSecurityPolicyValidationOptions, fldPath *field.Path, volumes []policy.FSType) field.ErrorList { allErrs := field.ErrorList{} allowed := psputil.GetAllFSTypesAsSet() // add in the * value since that is a pseudo type that is not included by default allowed.Insert(string(policy.All)) + // Ephemeral may or may not be allowed. + if !opts.AllowEphemeralVolumeType { + allowed.Delete(string(policy.Ephemeral)) + } for _, v := range volumes { if !allowed.Has(string(v)) { allErrs = append(allErrs, field.NotSupported(fldPath.Child("volumes"), v, allowed.List())) @@ -512,11 +530,11 @@ func validateRuntimeClassStrategy(fldPath *field.Path, rc *policy.RuntimeClassSt } // ValidatePodSecurityPolicyUpdate validates a PSP for updates. -func ValidatePodSecurityPolicyUpdate(old *policy.PodSecurityPolicy, new *policy.PodSecurityPolicy) field.ErrorList { +func ValidatePodSecurityPolicyUpdate(old *policy.PodSecurityPolicy, new *policy.PodSecurityPolicy, opts PodSecurityPolicyValidationOptions) field.ErrorList { allErrs := field.ErrorList{} allErrs = append(allErrs, apivalidation.ValidateObjectMetaUpdate(&new.ObjectMeta, &old.ObjectMeta, field.NewPath("metadata"))...) allErrs = append(allErrs, ValidatePodSecurityPolicySpecificAnnotations(new.Annotations, field.NewPath("metadata").Child("annotations"))...) - allErrs = append(allErrs, ValidatePodSecurityPolicySpec(&new.Spec, field.NewPath("spec"))...) + allErrs = append(allErrs, ValidatePodSecurityPolicySpec(&new.Spec, opts, field.NewPath("spec"))...) return allErrs } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/policy/zz_generated.deepcopy.go b/vendor/k8s.io/kubernetes/pkg/apis/policy/zz_generated.deepcopy.go index 61187798fff5..4d799ff8dc9e 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/policy/zz_generated.deepcopy.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/policy/zz_generated.deepcopy.go @@ -261,6 +261,13 @@ func (in *PodDisruptionBudgetStatus) DeepCopyInto(out *PodDisruptionBudgetStatus (*out)[key] = *val.DeepCopy() } } + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]v1.Condition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } return } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/rbac/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/rbac/BUILD deleted file mode 100644 index 278a460cb41d..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/rbac/BUILD +++ /dev/null @@ -1,59 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "helpers.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/rbac", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/apis/rbac/fuzzer:all-srcs", - "//pkg/apis/rbac/install:all-srcs", - "//pkg/apis/rbac/v1:all-srcs", - "//pkg/apis/rbac/v1alpha1:all-srcs", - "//pkg/apis/rbac/v1beta1:all-srcs", - "//pkg/apis/rbac/validation:all-srcs", - ], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["helpers_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/rbac/install:go_default_library", - "//pkg/apis/rbac/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/rbac/install/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/rbac/install/BUILD deleted file mode 100644 index 392b65f2264c..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/rbac/install/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["install.go"], - importpath = "k8s.io/kubernetes/pkg/apis/rbac/install", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/rbac:go_default_library", - "//pkg/apis/rbac/v1:go_default_library", - "//pkg/apis/rbac/v1alpha1:go_default_library", - "//pkg/apis/rbac/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/rbac/v1/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/rbac/v1/BUILD deleted file mode 100644 index e954ca241bdf..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/rbac/v1/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "defaults.go", - "doc.go", - "evaluation_helpers.go", - "helpers.go", - "register.go", - "zz_generated.conversion.go", - "zz_generated.deepcopy.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/rbac/v1", - deps = [ - "//pkg/apis/rbac:go_default_library", - "//staging/src/k8s.io/api/rbac/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/rbac/v1alpha1/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/rbac/v1alpha1/BUILD deleted file mode 100644 index bcb1747c4d81..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/rbac/v1alpha1/BUILD +++ /dev/null @@ -1,54 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "defaults.go", - "doc.go", - "helpers.go", - "register.go", - "zz_generated.conversion.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/rbac/v1alpha1", - deps = [ - "//pkg/apis/rbac:go_default_library", - "//staging/src/k8s.io/api/rbac/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["conversion_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/rbac:go_default_library", - "//pkg/apis/rbac/install:go_default_library", - "//staging/src/k8s.io/api/rbac/v1alpha1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/rbac/v1beta1/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/rbac/v1beta1/BUILD deleted file mode 100644 index 845b5efe05fc..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/rbac/v1beta1/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "defaults.go", - "doc.go", - "helpers.go", - "register.go", - "zz_generated.conversion.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/rbac/v1beta1", - deps = [ - "//pkg/apis/rbac:go_default_library", - "//staging/src/k8s.io/api/rbac/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/rbac/validation/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/rbac/validation/BUILD deleted file mode 100644 index b705516904d1..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/rbac/validation/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["validation.go"], - importpath = "k8s.io/kubernetes/pkg/apis/rbac/validation", - deps = [ - "//pkg/apis/core/validation:go_default_library", - "//pkg/apis/rbac:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/validation/path:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["validation_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/rbac:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/scheduling/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/scheduling/BUILD deleted file mode 100644 index 8b510f5cf52d..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/scheduling/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/scheduling", - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/apis/scheduling/fuzzer:all-srcs", - "//pkg/apis/scheduling/install:all-srcs", - "//pkg/apis/scheduling/util:all-srcs", - "//pkg/apis/scheduling/v1:all-srcs", - "//pkg/apis/scheduling/v1alpha1:all-srcs", - "//pkg/apis/scheduling/v1beta1:all-srcs", - "//pkg/apis/scheduling/validation:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/scheduling/install/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/scheduling/install/BUILD deleted file mode 100644 index 0e211c58ff98..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/scheduling/install/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["install.go"], - importpath = "k8s.io/kubernetes/pkg/apis/scheduling/install", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/scheduling:go_default_library", - "//pkg/apis/scheduling/v1:go_default_library", - "//pkg/apis/scheduling/v1alpha1:go_default_library", - "//pkg/apis/scheduling/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/scheduling/util/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/scheduling/util/BUILD deleted file mode 100644 index 646da3915844..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/scheduling/util/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["util.go"], - importpath = "k8s.io/kubernetes/pkg/apis/scheduling/util", - deps = [ - "//pkg/apis/scheduling:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["util_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/scheduling:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/scheduling/v1/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/scheduling/v1/BUILD deleted file mode 100644 index a3c74753cf70..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/scheduling/v1/BUILD +++ /dev/null @@ -1,62 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "defaults.go", - "doc.go", - "helpers.go", - "register.go", - "zz_generated.conversion.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/scheduling/v1", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/scheduling:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/scheduling/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = [ - "defaults_test.go", - "helpers_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/scheduling:go_default_library", - "//pkg/apis/scheduling/install:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/scheduling/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/scheduling/v1alpha1/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/scheduling/v1alpha1/BUILD deleted file mode 100644 index 7ea479b77b63..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/scheduling/v1alpha1/BUILD +++ /dev/null @@ -1,55 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "defaults.go", - "doc.go", - "register.go", - "zz_generated.conversion.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/scheduling/v1alpha1", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/scheduling:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/scheduling/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["defaults_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/scheduling/install:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/scheduling/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/scheduling/v1beta1/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/scheduling/v1beta1/BUILD deleted file mode 100644 index 33eb9ed0bc05..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/scheduling/v1beta1/BUILD +++ /dev/null @@ -1,55 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "defaults.go", - "doc.go", - "register.go", - "zz_generated.conversion.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/scheduling/v1beta1", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/scheduling:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/scheduling/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["defaults_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/scheduling/install:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/scheduling/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/scheduling/validation/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/scheduling/validation/BUILD deleted file mode 100644 index bdcf9185b74f..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/scheduling/validation/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["validation_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/scheduling:go_default_library", - "//pkg/apis/scheduling/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["validation.go"], - importpath = "k8s.io/kubernetes/pkg/apis/scheduling/validation", - deps = [ - "//pkg/apis/core/validation:go_default_library", - "//pkg/apis/scheduling:go_default_library", - "//pkg/apis/scheduling/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/storage/BUILD deleted file mode 100644 index 6224e0a493c9..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/storage/BUILD +++ /dev/null @@ -1,46 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/storage", - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/apis/storage/fuzzer:all-srcs", - "//pkg/apis/storage/install:all-srcs", - "//pkg/apis/storage/util:all-srcs", - "//pkg/apis/storage/v1:all-srcs", - "//pkg/apis/storage/v1alpha1:all-srcs", - "//pkg/apis/storage/v1beta1:all-srcs", - "//pkg/apis/storage/validation:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/storage/install/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/storage/install/BUILD deleted file mode 100644 index 45b92dda0062..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/storage/install/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["install.go"], - importpath = "k8s.io/kubernetes/pkg/apis/storage/install", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/storage:go_default_library", - "//pkg/apis/storage/v1:go_default_library", - "//pkg/apis/storage/v1alpha1:go_default_library", - "//pkg/apis/storage/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/storage/types.go b/vendor/k8s.io/kubernetes/pkg/apis/storage/types.go index 16c444b093ed..09e8cd4700c0 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/storage/types.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/storage/types.go @@ -158,7 +158,7 @@ type VolumeAttachmentSource struct { // a persistent volume defined by a pod's inline VolumeSource. This field // is populated only for the CSIMigration feature. It contains // translated fields from a pod's inline VolumeSource to a - // PersistentVolumeSpec. This field is alpha-level and is only + // PersistentVolumeSpec. This field is beta-level and is only // honored by servers that enabled the CSIMigration feature. // +optional InlineVolumeSpec *api.PersistentVolumeSpec @@ -274,6 +274,9 @@ type CSIDriverSpec struct { // If the CSIDriverRegistry feature gate is enabled and the value is // specified to false, the attach operation will be skipped. // Otherwise the attach operation will be called. + // + // This field is immutable. + // // +optional AttachRequired *bool @@ -282,6 +285,9 @@ type CSIDriverSpec struct { // Refer to the specific FSGroupPolicy values for additional details. // This field is alpha-level, and is only honored by servers // that enable the CSIVolumeFSGroupPolicy feature gate. + // + // This field is immutable. + // // +optional FSGroupPolicy *FSGroupPolicy @@ -300,6 +306,18 @@ type CSIDriverSpec struct { // "csi.storage.k8s.io/pod.name": pod.Name // "csi.storage.k8s.io/pod.namespace": pod.Namespace // "csi.storage.k8s.io/pod.uid": string(pod.UID) + // "csi.storage.k8s.io/ephemeral": "true" if the volume is an ephemeral inline volume + // defined by a CSIVolumeSource, otherwise "false" + // + // "csi.storage.k8s.io/ephemeral" is a new feature in Kubernetes 1.16. It is only + // required for drivers which support both the "Persistent" and "Ephemeral" VolumeLifecycleMode. + // Other drivers can leave pod info disabled and/or ignore this field. + // As Kubernetes 1.15 doesn't support this field, drivers can only support one mode when + // deployed on such a cluster and the deployment determines which mode that is, for example + // via a command line parameter of the driver. + // + // This field is immutable. + // // +optional PodInfoOnMount *bool @@ -315,6 +333,9 @@ type CSIDriverSpec struct { // https://kubernetes-csi.github.io/docs/ephemeral-local-volumes.html // A driver can support one or more of these mode and // more modes may be added in the future. + // + // This field is immutable. + // // +optional VolumeLifecycleModes []VolumeLifecycleMode @@ -332,7 +353,9 @@ type CSIDriverSpec struct { // unset or false and it can be flipped later when storage // capacity information has been published. // - // This is an alpha field and only available when the CSIStorageCapacity + // This field is immutable. + // + // This is a beta field and only available when the CSIStorageCapacity // feature is enabled. The default is false. // // +optional @@ -354,7 +377,7 @@ type CSIDriverSpec struct { // most one token is empty string. To receive a new token after expiry, // RequiresRepublish can be used to trigger NodePublishVolume periodically. // - // This is an alpha feature and only available when the + // This is a beta feature and only available when the // CSIServiceAccountToken feature is enabled. // // +optional @@ -369,7 +392,7 @@ type CSIDriverSpec struct { // to NodePublishVolume should only update the contents of the volume. New // mount points will not be seen by a running container. // - // This is an alpha feature and only available when the + // This is a beta feature and only available when the // CSIServiceAccountToken feature is enabled. // // +optional @@ -555,7 +578,9 @@ type CSINodeList struct { // // The producer of these objects can decide which approach is more suitable. // -// This is an alpha feature and only available when the CSIStorageCapacity feature is enabled. +// They are consumed by the kube-scheduler if the CSIStorageCapacity beta feature gate +// is enabled there and a CSI driver opts into capacity-aware scheduling with +// CSIDriver.StorageCapacity. type CSIStorageCapacity struct { metav1.TypeMeta // Standard object's metadata. The name has no particular meaning. It must be @@ -598,6 +623,20 @@ type CSIStorageCapacity struct { // // +optional Capacity *resource.Quantity + + // MaximumVolumeSize is the value reported by the CSI driver in its GetCapacityResponse + // for a GetCapacityRequest with topology and parameters that match the + // previous fields. + // + // This is defined since CSI spec 1.4.0 as the largest size + // that may be used in a + // CreateVolumeRequest.capacity_range.required_bytes field to + // create a volume with the same parameters as those in + // GetCapacityRequest. The corresponding value in the Kubernetes + // API is ResourceRequirements.Requests in a volume claim. + // + // +optional + MaximumVolumeSize *resource.Quantity } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object diff --git a/vendor/k8s.io/kubernetes/pkg/apis/storage/util/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/storage/util/BUILD deleted file mode 100644 index 38eeebfc3067..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/storage/util/BUILD +++ /dev/null @@ -1,48 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "helpers.go", - "util.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/storage/util", - deps = [ - "//pkg/apis/storage:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["util_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/storage:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/storage/v1/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/storage/v1/BUILD deleted file mode 100644 index 54f8a6137410..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/storage/v1/BUILD +++ /dev/null @@ -1,63 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "defaults.go", - "doc.go", - "register.go", - "zz_generated.conversion.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/storage/v1", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/v1:go_default_library", - "//pkg/apis/storage:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/storage/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/apis/storage/v1/util:all-srcs", - ], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["defaults_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/storage/install:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/api/storage/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - "//vendor/github.com/google/go-cmp/cmp:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/storage/v1/util/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/storage/v1/util/BUILD deleted file mode 100644 index 24f77a27f3c0..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/storage/v1/util/BUILD +++ /dev/null @@ -1,26 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["helpers.go"], - importpath = "k8s.io/kubernetes/pkg/apis/storage/v1/util", - deps = ["//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/storage/v1alpha1/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/storage/v1alpha1/BUILD deleted file mode 100644 index bd2653ce416a..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/storage/v1alpha1/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "zz_generated.conversion.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/storage/v1alpha1", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/v1:go_default_library", - "//pkg/apis/storage:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/storage/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/storage/v1alpha1/zz_generated.conversion.go b/vendor/k8s.io/kubernetes/pkg/apis/storage/v1alpha1/zz_generated.conversion.go index 37a4dc8e916d..4adc66928770 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/storage/v1alpha1/zz_generated.conversion.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/storage/v1alpha1/zz_generated.conversion.go @@ -129,6 +129,7 @@ func autoConvert_v1alpha1_CSIStorageCapacity_To_storage_CSIStorageCapacity(in *v out.NodeTopology = (*v1.LabelSelector)(unsafe.Pointer(in.NodeTopology)) out.StorageClassName = in.StorageClassName out.Capacity = (*resource.Quantity)(unsafe.Pointer(in.Capacity)) + out.MaximumVolumeSize = (*resource.Quantity)(unsafe.Pointer(in.MaximumVolumeSize)) return nil } @@ -142,6 +143,7 @@ func autoConvert_storage_CSIStorageCapacity_To_v1alpha1_CSIStorageCapacity(in *s out.NodeTopology = (*v1.LabelSelector)(unsafe.Pointer(in.NodeTopology)) out.StorageClassName = in.StorageClassName out.Capacity = (*resource.Quantity)(unsafe.Pointer(in.Capacity)) + out.MaximumVolumeSize = (*resource.Quantity)(unsafe.Pointer(in.MaximumVolumeSize)) return nil } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/storage/v1beta1/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/storage/v1beta1/BUILD deleted file mode 100644 index f990920a756e..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/storage/v1beta1/BUILD +++ /dev/null @@ -1,63 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "defaults.go", - "doc.go", - "register.go", - "zz_generated.conversion.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/storage/v1beta1", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/v1:go_default_library", - "//pkg/apis/storage:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/storage/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/apis/storage/v1beta1/util:all-srcs", - ], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["defaults_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/storage/install:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/api/storage/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - "//vendor/github.com/google/go-cmp/cmp:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/storage/v1beta1/zz_generated.conversion.go b/vendor/k8s.io/kubernetes/pkg/apis/storage/v1beta1/zz_generated.conversion.go index 961eef4edeec..9b2b880f0d64 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/storage/v1beta1/zz_generated.conversion.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/storage/v1beta1/zz_generated.conversion.go @@ -23,12 +23,14 @@ package v1beta1 import ( unsafe "unsafe" - v1 "k8s.io/api/core/v1" + corev1 "k8s.io/api/core/v1" v1beta1 "k8s.io/api/storage/v1beta1" + resource "k8s.io/apimachinery/pkg/api/resource" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" conversion "k8s.io/apimachinery/pkg/conversion" runtime "k8s.io/apimachinery/pkg/runtime" core "k8s.io/kubernetes/pkg/apis/core" - corev1 "k8s.io/kubernetes/pkg/apis/core/v1" + apiscorev1 "k8s.io/kubernetes/pkg/apis/core/v1" storage "k8s.io/kubernetes/pkg/apis/storage" ) @@ -109,6 +111,26 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddGeneratedConversionFunc((*v1beta1.CSIStorageCapacity)(nil), (*storage.CSIStorageCapacity)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1beta1_CSIStorageCapacity_To_storage_CSIStorageCapacity(a.(*v1beta1.CSIStorageCapacity), b.(*storage.CSIStorageCapacity), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*storage.CSIStorageCapacity)(nil), (*v1beta1.CSIStorageCapacity)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_storage_CSIStorageCapacity_To_v1beta1_CSIStorageCapacity(a.(*storage.CSIStorageCapacity), b.(*v1beta1.CSIStorageCapacity), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1beta1.CSIStorageCapacityList)(nil), (*storage.CSIStorageCapacityList)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1beta1_CSIStorageCapacityList_To_storage_CSIStorageCapacityList(a.(*v1beta1.CSIStorageCapacityList), b.(*storage.CSIStorageCapacityList), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*storage.CSIStorageCapacityList)(nil), (*v1beta1.CSIStorageCapacityList)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_storage_CSIStorageCapacityList_To_v1beta1_CSIStorageCapacityList(a.(*storage.CSIStorageCapacityList), b.(*v1beta1.CSIStorageCapacityList), scope) + }); err != nil { + return err + } if err := s.AddGeneratedConversionFunc((*v1beta1.StorageClass)(nil), (*storage.StorageClass)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1beta1_StorageClass_To_storage_StorageClass(a.(*v1beta1.StorageClass), b.(*storage.StorageClass), scope) }); err != nil { @@ -406,6 +428,56 @@ func Convert_storage_CSINodeSpec_To_v1beta1_CSINodeSpec(in *storage.CSINodeSpec, return autoConvert_storage_CSINodeSpec_To_v1beta1_CSINodeSpec(in, out, s) } +func autoConvert_v1beta1_CSIStorageCapacity_To_storage_CSIStorageCapacity(in *v1beta1.CSIStorageCapacity, out *storage.CSIStorageCapacity, s conversion.Scope) error { + out.ObjectMeta = in.ObjectMeta + out.NodeTopology = (*v1.LabelSelector)(unsafe.Pointer(in.NodeTopology)) + out.StorageClassName = in.StorageClassName + out.Capacity = (*resource.Quantity)(unsafe.Pointer(in.Capacity)) + out.MaximumVolumeSize = (*resource.Quantity)(unsafe.Pointer(in.MaximumVolumeSize)) + return nil +} + +// Convert_v1beta1_CSIStorageCapacity_To_storage_CSIStorageCapacity is an autogenerated conversion function. +func Convert_v1beta1_CSIStorageCapacity_To_storage_CSIStorageCapacity(in *v1beta1.CSIStorageCapacity, out *storage.CSIStorageCapacity, s conversion.Scope) error { + return autoConvert_v1beta1_CSIStorageCapacity_To_storage_CSIStorageCapacity(in, out, s) +} + +func autoConvert_storage_CSIStorageCapacity_To_v1beta1_CSIStorageCapacity(in *storage.CSIStorageCapacity, out *v1beta1.CSIStorageCapacity, s conversion.Scope) error { + out.ObjectMeta = in.ObjectMeta + out.NodeTopology = (*v1.LabelSelector)(unsafe.Pointer(in.NodeTopology)) + out.StorageClassName = in.StorageClassName + out.Capacity = (*resource.Quantity)(unsafe.Pointer(in.Capacity)) + out.MaximumVolumeSize = (*resource.Quantity)(unsafe.Pointer(in.MaximumVolumeSize)) + return nil +} + +// Convert_storage_CSIStorageCapacity_To_v1beta1_CSIStorageCapacity is an autogenerated conversion function. +func Convert_storage_CSIStorageCapacity_To_v1beta1_CSIStorageCapacity(in *storage.CSIStorageCapacity, out *v1beta1.CSIStorageCapacity, s conversion.Scope) error { + return autoConvert_storage_CSIStorageCapacity_To_v1beta1_CSIStorageCapacity(in, out, s) +} + +func autoConvert_v1beta1_CSIStorageCapacityList_To_storage_CSIStorageCapacityList(in *v1beta1.CSIStorageCapacityList, out *storage.CSIStorageCapacityList, s conversion.Scope) error { + out.ListMeta = in.ListMeta + out.Items = *(*[]storage.CSIStorageCapacity)(unsafe.Pointer(&in.Items)) + return nil +} + +// Convert_v1beta1_CSIStorageCapacityList_To_storage_CSIStorageCapacityList is an autogenerated conversion function. +func Convert_v1beta1_CSIStorageCapacityList_To_storage_CSIStorageCapacityList(in *v1beta1.CSIStorageCapacityList, out *storage.CSIStorageCapacityList, s conversion.Scope) error { + return autoConvert_v1beta1_CSIStorageCapacityList_To_storage_CSIStorageCapacityList(in, out, s) +} + +func autoConvert_storage_CSIStorageCapacityList_To_v1beta1_CSIStorageCapacityList(in *storage.CSIStorageCapacityList, out *v1beta1.CSIStorageCapacityList, s conversion.Scope) error { + out.ListMeta = in.ListMeta + out.Items = *(*[]v1beta1.CSIStorageCapacity)(unsafe.Pointer(&in.Items)) + return nil +} + +// Convert_storage_CSIStorageCapacityList_To_v1beta1_CSIStorageCapacityList is an autogenerated conversion function. +func Convert_storage_CSIStorageCapacityList_To_v1beta1_CSIStorageCapacityList(in *storage.CSIStorageCapacityList, out *v1beta1.CSIStorageCapacityList, s conversion.Scope) error { + return autoConvert_storage_CSIStorageCapacityList_To_v1beta1_CSIStorageCapacityList(in, out, s) +} + func autoConvert_v1beta1_StorageClass_To_storage_StorageClass(in *v1beta1.StorageClass, out *storage.StorageClass, s conversion.Scope) error { out.ObjectMeta = in.ObjectMeta out.Provisioner = in.Provisioner @@ -427,11 +499,11 @@ func autoConvert_storage_StorageClass_To_v1beta1_StorageClass(in *storage.Storag out.ObjectMeta = in.ObjectMeta out.Provisioner = in.Provisioner out.Parameters = *(*map[string]string)(unsafe.Pointer(&in.Parameters)) - out.ReclaimPolicy = (*v1.PersistentVolumeReclaimPolicy)(unsafe.Pointer(in.ReclaimPolicy)) + out.ReclaimPolicy = (*corev1.PersistentVolumeReclaimPolicy)(unsafe.Pointer(in.ReclaimPolicy)) out.MountOptions = *(*[]string)(unsafe.Pointer(&in.MountOptions)) out.AllowVolumeExpansion = (*bool)(unsafe.Pointer(in.AllowVolumeExpansion)) out.VolumeBindingMode = (*v1beta1.VolumeBindingMode)(unsafe.Pointer(in.VolumeBindingMode)) - out.AllowedTopologies = *(*[]v1.TopologySelectorTerm)(unsafe.Pointer(&in.AllowedTopologies)) + out.AllowedTopologies = *(*[]corev1.TopologySelectorTerm)(unsafe.Pointer(&in.AllowedTopologies)) return nil } @@ -563,7 +635,7 @@ func autoConvert_v1beta1_VolumeAttachmentSource_To_storage_VolumeAttachmentSourc if in.InlineVolumeSpec != nil { in, out := &in.InlineVolumeSpec, &out.InlineVolumeSpec *out = new(core.PersistentVolumeSpec) - if err := corev1.Convert_v1_PersistentVolumeSpec_To_core_PersistentVolumeSpec(*in, *out, s); err != nil { + if err := apiscorev1.Convert_v1_PersistentVolumeSpec_To_core_PersistentVolumeSpec(*in, *out, s); err != nil { return err } } else { @@ -581,8 +653,8 @@ func autoConvert_storage_VolumeAttachmentSource_To_v1beta1_VolumeAttachmentSourc out.PersistentVolumeName = (*string)(unsafe.Pointer(in.PersistentVolumeName)) if in.InlineVolumeSpec != nil { in, out := &in.InlineVolumeSpec, &out.InlineVolumeSpec - *out = new(v1.PersistentVolumeSpec) - if err := corev1.Convert_core_PersistentVolumeSpec_To_v1_PersistentVolumeSpec(*in, *out, s); err != nil { + *out = new(corev1.PersistentVolumeSpec) + if err := apiscorev1.Convert_core_PersistentVolumeSpec_To_v1_PersistentVolumeSpec(*in, *out, s); err != nil { return err } } else { diff --git a/vendor/k8s.io/kubernetes/pkg/apis/storage/validation/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/storage/validation/BUILD deleted file mode 100644 index 02351e23c6f5..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/storage/validation/BUILD +++ /dev/null @@ -1,56 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["validation.go"], - importpath = "k8s.io/kubernetes/pkg/apis/storage/validation", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/helper:go_default_library", - "//pkg/apis/core/validation:go_default_library", - "//pkg/apis/storage:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["validation_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/storage:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/storage/validation/validation.go b/vendor/k8s.io/kubernetes/pkg/apis/storage/validation/validation.go index 81d74b188b7f..6f4e34e6414b 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/storage/validation/validation.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/storage/validation/validation.go @@ -44,9 +44,15 @@ const ( maxAttachedVolumeMetadataSize = 256 * (1 << 10) // 256 kB maxVolumeErrorMessageSize = 1024 - csiNodeIDMaxLength = 128 + csiNodeIDMaxLength = 128 + csiNodeIDLongerMaxLength = 192 ) +// CSINodeValidationOptions contains the validation options for validating CSINode +type CSINodeValidationOptions struct { + AllowLongNodeID bool +} + // ValidateStorageClass validates a StorageClass. func ValidateStorageClass(storageClass *storage.StorageClass) field.ErrorList { allErrs := apivalidation.ValidateObjectMeta(&storageClass.ObjectMeta, false, apivalidation.ValidateClassName, field.NewPath("metadata")) @@ -291,15 +297,15 @@ func validateAllowedTopologies(topologies []api.TopologySelectorTerm, fldPath *f } // ValidateCSINode validates a CSINode. -func ValidateCSINode(csiNode *storage.CSINode) field.ErrorList { +func ValidateCSINode(csiNode *storage.CSINode, validationOpts CSINodeValidationOptions) field.ErrorList { allErrs := apivalidation.ValidateObjectMeta(&csiNode.ObjectMeta, false, apivalidation.ValidateNodeName, field.NewPath("metadata")) - allErrs = append(allErrs, validateCSINodeSpec(&csiNode.Spec, field.NewPath("spec"))...) + allErrs = append(allErrs, validateCSINodeSpec(&csiNode.Spec, field.NewPath("spec"), validationOpts)...) return allErrs } // ValidateCSINodeUpdate validates a CSINode. -func ValidateCSINodeUpdate(new, old *storage.CSINode) field.ErrorList { - allErrs := ValidateCSINode(new) +func ValidateCSINodeUpdate(new, old *storage.CSINode, validationOpts CSINodeValidationOptions) field.ErrorList { + allErrs := ValidateCSINode(new, validationOpts) // Validate modifying fields inside an existing CSINodeDriver entry is not allowed for _, oldDriver := range old.Spec.Drivers { @@ -317,38 +323,47 @@ func ValidateCSINodeUpdate(new, old *storage.CSINode) field.ErrorList { // ValidateCSINodeSpec tests that the specified CSINodeSpec has valid data. func validateCSINodeSpec( - spec *storage.CSINodeSpec, fldPath *field.Path) field.ErrorList { + spec *storage.CSINodeSpec, fldPath *field.Path, validationOpts CSINodeValidationOptions) field.ErrorList { allErrs := field.ErrorList{} - allErrs = append(allErrs, validateCSINodeDrivers(spec.Drivers, fldPath.Child("drivers"))...) + allErrs = append(allErrs, validateCSINodeDrivers(spec.Drivers, fldPath.Child("drivers"), validationOpts)...) return allErrs } // ValidateCSINodeDrivers tests that the specified CSINodeDrivers have valid data. -func validateCSINodeDrivers(drivers []storage.CSINodeDriver, fldPath *field.Path) field.ErrorList { +func validateCSINodeDrivers(drivers []storage.CSINodeDriver, fldPath *field.Path, validationOpts CSINodeValidationOptions) field.ErrorList { allErrs := field.ErrorList{} driverNamesInSpecs := make(sets.String) for i, driver := range drivers { idxPath := fldPath.Index(i) - allErrs = append(allErrs, validateCSINodeDriver(driver, driverNamesInSpecs, idxPath)...) + allErrs = append(allErrs, validateCSINodeDriver(driver, driverNamesInSpecs, idxPath, validationOpts)...) } return allErrs } // validateCSINodeDriverNodeID tests if Name in CSINodeDriver is a valid node id. -func validateCSINodeDriverNodeID(nodeID string, fldPath *field.Path) field.ErrorList { +func validateCSINodeDriverNodeID(nodeID string, fldPath *field.Path, validationOpts CSINodeValidationOptions) field.ErrorList { allErrs := field.ErrorList{} // nodeID is always required if len(nodeID) == 0 { allErrs = append(allErrs, field.Required(fldPath, nodeID)) } - if len(nodeID) > csiNodeIDMaxLength { + maxLength := csiNodeIDMaxLength + if validationOpts.AllowLongNodeID { + maxLength = csiNodeIDLongerMaxLength + } + if len(nodeID) > maxLength { allErrs = append(allErrs, field.Invalid(fldPath, nodeID, fmt.Sprintf("must be %d characters or less", csiNodeIDMaxLength))) } return allErrs } +// CSINodeLongerID will check if the nodeID is longer than csiNodeIDMaxLength +func CSINodeLongerID(nodeID string) bool { + return len(nodeID) > csiNodeIDMaxLength +} + // validateCSINodeDriverAllocatable tests if Allocatable in CSINodeDriver has valid volume limits. func validateCSINodeDriverAllocatable(a *storage.VolumeNodeResources, fldPath *field.Path) field.ErrorList { allErrs := field.ErrorList{} @@ -362,11 +377,12 @@ func validateCSINodeDriverAllocatable(a *storage.VolumeNodeResources, fldPath *f } // validateCSINodeDriver tests if CSINodeDriver has valid entries -func validateCSINodeDriver(driver storage.CSINodeDriver, driverNamesInSpecs sets.String, fldPath *field.Path) field.ErrorList { +func validateCSINodeDriver(driver storage.CSINodeDriver, driverNamesInSpecs sets.String, fldPath *field.Path, + validationOpts CSINodeValidationOptions) field.ErrorList { allErrs := field.ErrorList{} allErrs = append(allErrs, apivalidation.ValidateCSIDriverName(driver.Name, fldPath.Child("name"))...) - allErrs = append(allErrs, validateCSINodeDriverNodeID(driver.NodeID, fldPath.Child("nodeID"))...) + allErrs = append(allErrs, validateCSINodeDriverNodeID(driver.NodeID, fldPath.Child("nodeID"), validationOpts)...) allErrs = append(allErrs, validateCSINodeDriverAllocatable(driver.Allocatable, fldPath.Child("allocatable"))...) // check for duplicate entries for the same driver in specs @@ -409,11 +425,14 @@ func ValidateCSIDriver(csiDriver *storage.CSIDriver) field.ErrorList { func ValidateCSIDriverUpdate(new, old *storage.CSIDriver) field.ErrorList { allErrs := apivalidation.ValidateObjectMetaUpdate(&new.ObjectMeta, &old.ObjectMeta, field.NewPath("metadata")) - // Spec is read-only - // If this ever relaxes in the future, make sure to increment the Generation number in PrepareForUpdate - if !apiequality.Semantic.DeepEqual(old.Spec, new.Spec) { - allErrs = append(allErrs, field.Invalid(field.NewPath("spec"), new.Spec, "field is immutable")) - } + // immutable fields should not be mutated. + allErrs = append(allErrs, apimachineryvalidation.ValidateImmutableField(new.Spec.AttachRequired, old.Spec.AttachRequired, field.NewPath("spec", "attachedRequired"))...) + allErrs = append(allErrs, apimachineryvalidation.ValidateImmutableField(new.Spec.FSGroupPolicy, old.Spec.FSGroupPolicy, field.NewPath("spec", "fsGroupPolicy"))...) + allErrs = append(allErrs, apimachineryvalidation.ValidateImmutableField(new.Spec.PodInfoOnMount, old.Spec.PodInfoOnMount, field.NewPath("spec", "podInfoOnMount"))...) + allErrs = append(allErrs, apimachineryvalidation.ValidateImmutableField(new.Spec.VolumeLifecycleModes, old.Spec.VolumeLifecycleModes, field.NewPath("spec", "volumeLifecycleModes"))...) + allErrs = append(allErrs, apimachineryvalidation.ValidateImmutableField(new.Spec.StorageCapacity, old.Spec.StorageCapacity, field.NewPath("spec", "storageCapacity"))...) + + allErrs = append(allErrs, validateTokenRequests(new.Spec.TokenRequests, field.NewPath("spec", "tokenRequests"))...) return allErrs } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/storage/zz_generated.deepcopy.go b/vendor/k8s.io/kubernetes/pkg/apis/storage/zz_generated.deepcopy.go index 8553365dd6d7..a8e24544c34e 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/storage/zz_generated.deepcopy.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/storage/zz_generated.deepcopy.go @@ -263,6 +263,11 @@ func (in *CSIStorageCapacity) DeepCopyInto(out *CSIStorageCapacity) { x := (*in).DeepCopy() *out = &x } + if in.MaximumVolumeSize != nil { + in, out := &in.MaximumVolumeSize, &out.MaximumVolumeSize + x := (*in).DeepCopy() + *out = &x + } return } diff --git a/vendor/k8s.io/kubernetes/pkg/auth/authorizer/abac/BUILD b/vendor/k8s.io/kubernetes/pkg/auth/authorizer/abac/BUILD deleted file mode 100644 index 9901e474006b..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/auth/authorizer/abac/BUILD +++ /dev/null @@ -1,60 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["abac.go"], - importpath = "k8s.io/kubernetes/pkg/auth/authorizer/abac", - deps = [ - "//pkg/apis/abac:go_default_library", - "//pkg/apis/abac/latest:go_default_library", - "//pkg/apis/abac/v0:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "example_policy", - testonly = True, - srcs = [ - "example_policy_file.jsonl", - ], -) - -go_test( - name = "go_default_test", - srcs = ["abac_test.go"], - data = [ - ":example_policy", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/abac:go_default_library", - "//pkg/apis/abac/v0:go_default_library", - "//pkg/apis/abac/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/auth/nodeidentifier/BUILD b/vendor/k8s.io/kubernetes/pkg/auth/nodeidentifier/BUILD deleted file mode 100644 index ab741495ecfc..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/auth/nodeidentifier/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "default.go", - "interfaces.go", - ], - importpath = "k8s.io/kubernetes/pkg/auth/nodeidentifier", - deps = ["//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library"], -) - -go_test( - name = "go_default_test", - srcs = ["default_test.go"], - embed = [":go_default_library"], - deps = ["//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/capabilities/BUILD b/vendor/k8s.io/kubernetes/pkg/capabilities/BUILD deleted file mode 100644 index 231f30ba4f7a..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/capabilities/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "capabilities.go", - "doc.go", - ], - importpath = "k8s.io/kubernetes/pkg/capabilities", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["capabilities_test.go"], - embed = [":go_default_library"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/client/conditions/BUILD b/vendor/k8s.io/kubernetes/pkg/client/conditions/BUILD deleted file mode 100644 index 70aa4fb80488..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/client/conditions/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["conditions.go"], - importpath = "k8s.io/kubernetes/pkg/client/conditions", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/cloudprovider/providers/BUILD b/vendor/k8s.io/kubernetes/pkg/cloudprovider/providers/BUILD deleted file mode 100644 index 6be8a179d174..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/cloudprovider/providers/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "providers.go", - ], - importpath = "k8s.io/kubernetes/pkg/cloudprovider/providers", - visibility = [ - "//cmd/cloud-controller-manager:__pkg__", - "//cmd/kube-apiserver/app/options:__pkg__", - "//cmd/kube-controller-manager/app:__pkg__", - "//cmd/kubelet/app:__pkg__", - ], - deps = [ - "//staging/src/k8s.io/legacy-cloud-providers/aws:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/gce:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/openstack:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/vsphere:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["providers_test.go"], - embed = [":go_default_library"], - deps = ["//staging/src/k8s.io/legacy-cloud-providers/vsphere/testing:go_default_library"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/cluster/ports/BUILD b/vendor/k8s.io/kubernetes/pkg/cluster/ports/BUILD deleted file mode 100644 index a2dc03628d33..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/cluster/ports/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "ports.go", - ], - importpath = "k8s.io/kubernetes/pkg/cluster/ports", - deps = [ - "//staging/src/k8s.io/cloud-provider:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/cluster/ports/ports.go b/vendor/k8s.io/kubernetes/pkg/cluster/ports/ports.go index 40ce21a76730..7407060d9207 100644 --- a/vendor/k8s.io/kubernetes/pkg/cluster/ports/ports.go +++ b/vendor/k8s.io/kubernetes/pkg/cluster/ports/ports.go @@ -16,10 +16,8 @@ limitations under the License. package ports -import ( - "k8s.io/cloud-provider" -) - +// In this file, we can see all default port of cluster. +// It's also an important documentation for us. So don't remove them easily. const ( // ProxyStatusPort is the default port for the proxy metrics server. // May be overridden by a flag at startup. @@ -45,5 +43,5 @@ const ( KubeControllerManagerPort = 10257 // CloudControllerManagerPort is the default port for the cloud controller manager server. // This value may be overridden by a flag at startup. - CloudControllerManagerPort = cloudprovider.CloudControllerManagerPort + CloudControllerManagerPort = 10258 ) diff --git a/vendor/k8s.io/kubernetes/pkg/controller/BUILD b/vendor/k8s.io/kubernetes/pkg/controller/BUILD deleted file mode 100644 index 595ed59c9319..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/controller/BUILD +++ /dev/null @@ -1,141 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "client_builder_dynamic.go", - "controller_ref_manager.go", - "controller_utils.go", - "doc.go", - "lookup_cache.go", - ], - importpath = "k8s.io/kubernetes/pkg/controller", - visibility = ["//visibility:public"], - deps = [ - "//pkg/api/v1/pod:go_default_library", - "//pkg/apis/core/install:go_default_library", - "//pkg/apis/core/validation:go_default_library", - "//pkg/util/hash:go_default_library", - "//pkg/util/taints:go_default_library", - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/authentication/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/rand:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/serviceaccount:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/client-go/transport:go_default_library", - "//staging/src/k8s.io/client-go/util/retry:go_default_library", - "//staging/src/k8s.io/controller-manager/pkg/clientbuilder:go_default_library", - "//vendor/github.com/golang/groupcache/lru:go_default_library", - "//vendor/golang.org/x/oauth2:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/integer:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "controller_ref_manager_test.go", - "controller_utils_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core/install:go_default_library", - "//pkg/controller/testutil:go_default_library", - "//pkg/securitycontext:go_default_library", - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/client-go/util/testing:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/controller/apis/config:all-srcs", - "//pkg/controller/bootstrap:all-srcs", - "//pkg/controller/certificates:all-srcs", - "//pkg/controller/clusterroleaggregation:all-srcs", - "//pkg/controller/cronjob:all-srcs", - "//pkg/controller/daemon:all-srcs", - "//pkg/controller/deployment:all-srcs", - "//pkg/controller/disruption:all-srcs", - "//pkg/controller/endpoint:all-srcs", - "//pkg/controller/endpointslice:all-srcs", - "//pkg/controller/endpointslicemirroring:all-srcs", - "//pkg/controller/garbagecollector:all-srcs", - "//pkg/controller/history:all-srcs", - "//pkg/controller/job:all-srcs", - "//pkg/controller/namespace:all-srcs", - "//pkg/controller/nodeipam:all-srcs", - "//pkg/controller/nodelifecycle:all-srcs", - "//pkg/controller/podautoscaler:all-srcs", - "//pkg/controller/podgc:all-srcs", - "//pkg/controller/replicaset:all-srcs", - "//pkg/controller/replication:all-srcs", - "//pkg/controller/resourcequota:all-srcs", - "//pkg/controller/serviceaccount:all-srcs", - "//pkg/controller/statefulset:all-srcs", - "//pkg/controller/storageversiongc:all-srcs", - "//pkg/controller/testutil:all-srcs", - "//pkg/controller/ttl:all-srcs", - "//pkg/controller/ttlafterfinished:all-srcs", - "//pkg/controller/util/endpoint:all-srcs", - "//pkg/controller/util/node:all-srcs", - "//pkg/controller/volume/attachdetach:all-srcs", - "//pkg/controller/volume/common:all-srcs", - "//pkg/controller/volume/ephemeral:all-srcs", - "//pkg/controller/volume/events:all-srcs", - "//pkg/controller/volume/expand:all-srcs", - "//pkg/controller/volume/persistentvolume:all-srcs", - "//pkg/controller/volume/protectionutil:all-srcs", - "//pkg/controller/volume/pvcprotection:all-srcs", - "//pkg/controller/volume/pvprotection:all-srcs", - "//pkg/controller/volume/scheduling:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/controller/OWNERS b/vendor/k8s.io/kubernetes/pkg/controller/OWNERS index a4f3bf7ea3a6..49121b53b530 100644 --- a/vendor/k8s.io/kubernetes/pkg/controller/OWNERS +++ b/vendor/k8s.io/kubernetes/pkg/controller/OWNERS @@ -8,6 +8,7 @@ approvers: - cheftako - sig-apps-approvers reviewers: +- andrewsykim - deads2k - cheftako - sig-apps-reviewers diff --git a/vendor/k8s.io/kubernetes/pkg/controller/client_builder_dynamic.go b/vendor/k8s.io/kubernetes/pkg/controller/client_builder_dynamic.go deleted file mode 100644 index 029ceb658006..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/controller/client_builder_dynamic.go +++ /dev/null @@ -1,219 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package controller - -import ( - "context" - "fmt" - "net/http" - "sync" - "time" - - "golang.org/x/oauth2" - v1authenticationapi "k8s.io/api/authentication/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/clock" - "k8s.io/apimachinery/pkg/util/wait" - apiserverserviceaccount "k8s.io/apiserver/pkg/authentication/serviceaccount" - clientset "k8s.io/client-go/kubernetes" - v1core "k8s.io/client-go/kubernetes/typed/core/v1" - restclient "k8s.io/client-go/rest" - "k8s.io/client-go/transport" - "k8s.io/controller-manager/pkg/clientbuilder" - "k8s.io/klog/v2" - utilpointer "k8s.io/utils/pointer" -) - -var ( - // defaultExpirationSeconds defines the duration of a TokenRequest in seconds. - defaultExpirationSeconds = int64(3600) - // defaultLeewayPercent defines the percentage of expiration left before the client trigger a token rotation. - // range[0, 100] - defaultLeewayPercent = 20 -) - -type DynamicControllerClientBuilder struct { - // ClientConfig is a skeleton config to clone and use as the basis for each controller client - ClientConfig *restclient.Config - - // CoreClient is used to provision service accounts if needed and watch for their associated tokens - // to construct a controller client - CoreClient v1core.CoreV1Interface - - // Namespace is the namespace used to host the service accounts that will back the - // controllers. It must be highly privileged namespace which normal users cannot inspect. - Namespace string - - // roundTripperFuncMap is a cache stores the corresponding roundtripper func for each - // service account - roundTripperFuncMap map[string]func(http.RoundTripper) http.RoundTripper - - // expirationSeconds defines the token expiration seconds - expirationSeconds int64 - - // leewayPercent defines the percentage of expiration left before the client trigger a token rotation. - leewayPercent int - - mutex sync.Mutex - - clock clock.Clock -} - -func NewDynamicClientBuilder(clientConfig *restclient.Config, coreClient v1core.CoreV1Interface, ns string) clientbuilder.ControllerClientBuilder { - builder := &DynamicControllerClientBuilder{ - ClientConfig: clientConfig, - CoreClient: coreClient, - Namespace: ns, - roundTripperFuncMap: map[string]func(http.RoundTripper) http.RoundTripper{}, - expirationSeconds: defaultExpirationSeconds, - leewayPercent: defaultLeewayPercent, - clock: clock.RealClock{}, - } - return builder -} - -// this function only for test purpose, don't call it -func NewTestDynamicClientBuilder(clientConfig *restclient.Config, coreClient v1core.CoreV1Interface, ns string, expirationSeconds int64, leewayPercent int) clientbuilder.ControllerClientBuilder { - builder := &DynamicControllerClientBuilder{ - ClientConfig: clientConfig, - CoreClient: coreClient, - Namespace: ns, - roundTripperFuncMap: map[string]func(http.RoundTripper) http.RoundTripper{}, - expirationSeconds: expirationSeconds, - leewayPercent: leewayPercent, - clock: clock.RealClock{}, - } - return builder -} - -func (t *DynamicControllerClientBuilder) Config(saName string) (*restclient.Config, error) { - _, err := getOrCreateServiceAccount(t.CoreClient, t.Namespace, saName) - if err != nil { - return nil, err - } - - configCopy := constructClient(t.Namespace, saName, t.ClientConfig) - - t.mutex.Lock() - defer t.mutex.Unlock() - - rt, ok := t.roundTripperFuncMap[saName] - if ok { - configCopy.WrapTransport = rt - } else { - cachedTokenSource := transport.NewCachedTokenSource(&tokenSourceImpl{ - namespace: t.Namespace, - serviceAccountName: saName, - coreClient: t.CoreClient, - expirationSeconds: t.expirationSeconds, - leewayPercent: t.leewayPercent, - }) - configCopy.WrapTransport = transport.TokenSourceWrapTransport(cachedTokenSource) - - t.roundTripperFuncMap[saName] = configCopy.WrapTransport - } - - return &configCopy, nil -} - -func (t *DynamicControllerClientBuilder) ConfigOrDie(name string) *restclient.Config { - clientConfig, err := t.Config(name) - if err != nil { - klog.Fatal(err) - } - return clientConfig -} - -func (t *DynamicControllerClientBuilder) Client(name string) (clientset.Interface, error) { - clientConfig, err := t.Config(name) - if err != nil { - return nil, err - } - return clientset.NewForConfig(clientConfig) -} - -func (t *DynamicControllerClientBuilder) ClientOrDie(name string) clientset.Interface { - client, err := t.Client(name) - if err != nil { - klog.Fatal(err) - } - return client -} - -type tokenSourceImpl struct { - namespace string - serviceAccountName string - coreClient v1core.CoreV1Interface - expirationSeconds int64 - leewayPercent int -} - -func (ts *tokenSourceImpl) Token() (*oauth2.Token, error) { - var retTokenRequest *v1authenticationapi.TokenRequest - - backoff := wait.Backoff{ - Duration: 500 * time.Millisecond, - Factor: 2, // double the timeout for every failure - Steps: 4, - } - if err := wait.ExponentialBackoff(backoff, func() (bool, error) { - if _, inErr := getOrCreateServiceAccount(ts.coreClient, ts.namespace, ts.serviceAccountName); inErr != nil { - klog.Warningf("get or create service account failed: %v", inErr) - return false, nil - } - - tr, inErr := ts.coreClient.ServiceAccounts(ts.namespace).CreateToken(context.TODO(), ts.serviceAccountName, &v1authenticationapi.TokenRequest{ - Spec: v1authenticationapi.TokenRequestSpec{ - ExpirationSeconds: utilpointer.Int64Ptr(ts.expirationSeconds), - }, - }, metav1.CreateOptions{}) - if inErr != nil { - klog.Warningf("get token failed: %v", inErr) - return false, nil - } - retTokenRequest = tr - return true, nil - }); err != nil { - return nil, fmt.Errorf("failed to get token for %s/%s: %v", ts.namespace, ts.serviceAccountName, err) - } - - if retTokenRequest.Spec.ExpirationSeconds == nil { - return nil, fmt.Errorf("nil pointer of expiration in token request") - } - - lifetime := retTokenRequest.Status.ExpirationTimestamp.Time.Sub(time.Now()) - if lifetime < time.Minute*10 { - // possible clock skew issue, pin to minimum token lifetime - lifetime = time.Minute * 10 - } - - leeway := time.Duration(int64(lifetime) * int64(ts.leewayPercent) / 100) - expiry := time.Now().Add(lifetime).Add(-1 * leeway) - - return &oauth2.Token{ - AccessToken: retTokenRequest.Status.Token, - TokenType: "Bearer", - Expiry: expiry, - }, nil -} - -func constructClient(saNamespace, saName string, config *restclient.Config) restclient.Config { - username := apiserverserviceaccount.MakeUsername(saNamespace, saName) - ret := *restclient.AnonymousClientConfig(config) - restclient.AddUserAgent(&ret, username) - return ret -} diff --git a/vendor/k8s.io/kubernetes/pkg/controller/controller_utils.go b/vendor/k8s.io/kubernetes/pkg/controller/controller_utils.go index e5c66bfacd3c..9c623e5d047d 100644 --- a/vendor/k8s.io/kubernetes/pkg/controller/controller_utils.go +++ b/vendor/k8s.io/kubernetes/pkg/controller/controller_utils.go @@ -22,6 +22,7 @@ import ( "encoding/json" "fmt" "hash/fnv" + "math" "sync" "sync/atomic" "time" @@ -39,14 +40,16 @@ import ( "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/strategicpatch" "k8s.io/apimachinery/pkg/util/wait" + utilfeature "k8s.io/apiserver/pkg/util/feature" clientset "k8s.io/client-go/kubernetes" - v1core "k8s.io/client-go/kubernetes/typed/core/v1" "k8s.io/client-go/tools/cache" "k8s.io/client-go/tools/record" clientretry "k8s.io/client-go/util/retry" podutil "k8s.io/kubernetes/pkg/api/v1/pod" + "k8s.io/kubernetes/pkg/apis/core/helper" _ "k8s.io/kubernetes/pkg/apis/core/install" "k8s.io/kubernetes/pkg/apis/core/validation" + "k8s.io/kubernetes/pkg/features" hashutil "k8s.io/kubernetes/pkg/util/hash" taintutils "k8s.io/kubernetes/pkg/util/taints" "k8s.io/utils/integer" @@ -257,11 +260,6 @@ func (r *ControllerExpectations) DeletionObserved(controllerKey string) { r.LowerExpectations(controllerKey, 0, 1) } -// Expectations are either fulfilled, or expire naturally. -type Expectations interface { - Fulfilled() bool -} - // ControlleeExpectations track controllee creates/deletes. type ControlleeExpectations struct { // Important: Since these two int64 fields are using sync/atomic, they have to be at the top of the struct due to a bug on 32-bit platforms @@ -797,17 +795,23 @@ func (s ActivePods) Less(i, j int) bool { // is unknown, and a pod whose phase is unknown comes before a running pod. // 3. If exactly one of the pods is ready, the pod that is not ready comes // before the ready pod. -// 4. If the pods' ranks differ, the pod with greater rank comes before the pod +// 4. If controller.kubernetes.io/pod-deletion-cost annotation is set, then +// the pod with the lower value will come first. +// 5. If the pods' ranks differ, the pod with greater rank comes before the pod // with lower rank. -// 5. If both pods are ready but have not been ready for the same amount of +// 6. If both pods are ready but have not been ready for the same amount of // time, the pod that has been ready for a shorter amount of time comes // before the pod that has been ready for longer. -// 6. If one pod has a container that has restarted more than any container in +// 7. If one pod has a container that has restarted more than any container in // the other pod, the pod with the container with more restarts comes // before the other pod. -// 7. If the pods' creation times differ, the pod that was created more recently +// 8. If the pods' creation times differ, the pod that was created more recently // comes before the older pod. // +// In 6 and 8, times are compared in a logarithmic scale. This allows a level +// of randomness among equivalent Pods when sorting. If two pods have the same +// logarithmic rank, they are sorted by UUID to provide a pseudorandom order. +// // If none of these rules matches, the second pod comes before the first pod. // // The intention of this ordering is to put pods that should be preferred for @@ -820,6 +824,10 @@ type ActivePodsWithRanks struct { // comparing two pods that are both scheduled, in the same phase, and // having the same ready status. Rank []int + + // Now is a reference timestamp for doing logarithmic timestamp comparisons. + // If zero, comparison happens without scaling. + Now metav1.Time } func (s ActivePodsWithRanks) Len() int { @@ -848,7 +856,17 @@ func (s ActivePodsWithRanks) Less(i, j int) bool { if podutil.IsPodReady(s.Pods[i]) != podutil.IsPodReady(s.Pods[j]) { return !podutil.IsPodReady(s.Pods[i]) } - // 4. Doubled up < not doubled up + + // 4. higher pod-deletion-cost < lower pod-deletion cost + if utilfeature.DefaultFeatureGate.Enabled(features.PodDeletionCost) { + pi, _ := helper.GetDeletionCostFromPodAnnotations(s.Pods[i].Annotations) + pj, _ := helper.GetDeletionCostFromPodAnnotations(s.Pods[j].Annotations) + if pi != pj { + return pi < pj + } + } + + // 5. Doubled up < not doubled up // If one of the two pods is on the same node as one or more additional // ready pods that belong to the same replicaset, whichever pod has more // colocated ready pods is less @@ -857,22 +875,44 @@ func (s ActivePodsWithRanks) Less(i, j int) bool { } // TODO: take availability into account when we push minReadySeconds information from deployment into pods, // see https://github.com/kubernetes/kubernetes/issues/22065 - // 5. Been ready for empty time < less time < more time + // 6. Been ready for empty time < less time < more time // If both pods are ready, the latest ready one is smaller if podutil.IsPodReady(s.Pods[i]) && podutil.IsPodReady(s.Pods[j]) { readyTime1 := podReadyTime(s.Pods[i]) readyTime2 := podReadyTime(s.Pods[j]) if !readyTime1.Equal(readyTime2) { - return afterOrZero(readyTime1, readyTime2) + if !utilfeature.DefaultFeatureGate.Enabled(features.LogarithmicScaleDown) { + return afterOrZero(readyTime1, readyTime2) + } else { + if s.Now.IsZero() || readyTime1.IsZero() || readyTime2.IsZero() { + return afterOrZero(readyTime1, readyTime2) + } + rankDiff := logarithmicRankDiff(*readyTime1, *readyTime2, s.Now) + if rankDiff == 0 { + return s.Pods[i].UID < s.Pods[j].UID + } + return rankDiff < 0 + } } } - // 6. Pods with containers with higher restart counts < lower restart counts + // 7. Pods with containers with higher restart counts < lower restart counts if maxContainerRestarts(s.Pods[i]) != maxContainerRestarts(s.Pods[j]) { return maxContainerRestarts(s.Pods[i]) > maxContainerRestarts(s.Pods[j]) } - // 7. Empty creation time pods < newer pods < older pods + // 8. Empty creation time pods < newer pods < older pods if !s.Pods[i].CreationTimestamp.Equal(&s.Pods[j].CreationTimestamp) { - return afterOrZero(&s.Pods[i].CreationTimestamp, &s.Pods[j].CreationTimestamp) + if !utilfeature.DefaultFeatureGate.Enabled(features.LogarithmicScaleDown) { + return afterOrZero(&s.Pods[i].CreationTimestamp, &s.Pods[j].CreationTimestamp) + } else { + if s.Now.IsZero() || s.Pods[i].CreationTimestamp.IsZero() || s.Pods[j].CreationTimestamp.IsZero() { + return afterOrZero(&s.Pods[i].CreationTimestamp, &s.Pods[j].CreationTimestamp) + } + rankDiff := logarithmicRankDiff(s.Pods[i].CreationTimestamp, s.Pods[j].CreationTimestamp, s.Now) + if rankDiff == 0 { + return s.Pods[i].UID < s.Pods[j].UID + } + return rankDiff < 0 + } } return false } @@ -886,6 +926,22 @@ func afterOrZero(t1, t2 *metav1.Time) bool { return t1.After(t2.Time) } +// logarithmicRankDiff calculates the base-2 logarithmic ranks of 2 timestamps, +// compared to the current timestamp +func logarithmicRankDiff(t1, t2, now metav1.Time) int64 { + d1 := now.Sub(t1.Time) + d2 := now.Sub(t2.Time) + r1 := int64(-1) + r2 := int64(-1) + if d1 > 0 { + r1 = int64(math.Log2(float64(d1))) + } + if d2 > 0 { + r2 = int64(math.Log2(float64(d2))) + } + return r1 - r2 +} + func podReadyTime(pod *v1.Pod) *metav1.Time { if podutil.IsPodReady(pod) { for _, c := range pod.Status.Conditions { @@ -1188,29 +1244,3 @@ func AddOrUpdateLabelsOnNode(kubeClient clientset.Interface, nodeName string, la return nil }) } - -func getOrCreateServiceAccount(coreClient v1core.CoreV1Interface, namespace, name string) (*v1.ServiceAccount, error) { - sa, err := coreClient.ServiceAccounts(namespace).Get(context.TODO(), name, metav1.GetOptions{}) - if err == nil { - return sa, nil - } - if !apierrors.IsNotFound(err) { - return nil, err - } - - // Create the namespace if we can't verify it exists. - // Tolerate errors, since we don't know whether this component has namespace creation permissions. - if _, err := coreClient.Namespaces().Get(context.TODO(), namespace, metav1.GetOptions{}); apierrors.IsNotFound(err) { - if _, err = coreClient.Namespaces().Create(context.TODO(), &v1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: namespace}}, metav1.CreateOptions{}); err != nil && !apierrors.IsAlreadyExists(err) { - klog.Warningf("create non-exist namespace %s failed:%v", namespace, err) - } - } - - // Create the service account - sa, err = coreClient.ServiceAccounts(namespace).Create(context.TODO(), &v1.ServiceAccount{ObjectMeta: metav1.ObjectMeta{Namespace: namespace, Name: name}}, metav1.CreateOptions{}) - if apierrors.IsAlreadyExists(err) { - // If we're racing to init and someone else already created it, re-fetch - return coreClient.ServiceAccounts(namespace).Get(context.TODO(), name, metav1.GetOptions{}) - } - return sa, err -} diff --git a/vendor/k8s.io/kubernetes/pkg/controller/daemon/BUILD b/vendor/k8s.io/kubernetes/pkg/controller/daemon/BUILD deleted file mode 100644 index 04961a81e83a..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/controller/daemon/BUILD +++ /dev/null @@ -1,106 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "daemon_controller.go", - "doc.go", - "update.go", - ], - importpath = "k8s.io/kubernetes/pkg/controller/daemon", - deps = [ - "//pkg/api/v1/pod:go_default_library", - "//pkg/apis/core/v1/helper:go_default_library", - "//pkg/controller:go_default_library", - "//pkg/controller/daemon/util:go_default_library", - "//pkg/scheduler/framework/plugins/helper:go_default_library", - "//pkg/util/labels:go_default_library", - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/json:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/informers/apps/v1:go_default_library", - "//staging/src/k8s.io/client-go/informers/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/apps/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/listers/apps/v1:go_default_library", - "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/client-go/util/workqueue:go_default_library", - "//staging/src/k8s.io/component-base/metrics/prometheus/ratelimiter:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/integer:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "daemon_controller_test.go", - "init_test.go", - "update_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/api/v1/pod:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/scheduling:go_default_library", - "//pkg/controller:go_default_library", - "//pkg/securitycontext:go_default_library", - "//pkg/util/labels:go_default_library", - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/client-go/util/workqueue:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/controller/daemon/config:all-srcs", - "//pkg/controller/daemon/util:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/controller/daemon/daemon_controller.go b/vendor/k8s.io/kubernetes/pkg/controller/daemon/daemon_controller.go index aad47534218e..6165c489201f 100644 --- a/vendor/k8s.io/kubernetes/pkg/controller/daemon/daemon_controller.go +++ b/vendor/k8s.io/kubernetes/pkg/controller/daemon/daemon_controller.go @@ -49,8 +49,8 @@ import ( "k8s.io/client-go/util/flowcontrol" "k8s.io/client-go/util/workqueue" "k8s.io/component-base/metrics/prometheus/ratelimiter" + v1helper "k8s.io/component-helpers/scheduling/corev1" podutil "k8s.io/kubernetes/pkg/api/v1/pod" - v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper" "k8s.io/kubernetes/pkg/controller" "k8s.io/kubernetes/pkg/controller/daemon/util" pluginhelper "k8s.io/kubernetes/pkg/scheduler/framework/plugins/helper" @@ -653,11 +653,7 @@ func (dsc *DaemonSetsController) addNode(obj interface{}) { } node := obj.(*v1.Node) for _, ds := range dsList { - shouldRun, _, err := dsc.nodeShouldRunDaemonPod(node, ds) - if err != nil { - continue - } - if shouldRun { + if shouldRun, _ := dsc.nodeShouldRunDaemonPod(node, ds); shouldRun { dsc.enqueueDaemonSet(ds) } } @@ -715,14 +711,8 @@ func (dsc *DaemonSetsController) updateNode(old, cur interface{}) { } // TODO: it'd be nice to pass a hint with these enqueues, so that each ds would only examine the added node (unless it has other work to do, too). for _, ds := range dsList { - oldShouldRun, oldShouldContinueRunning, err := dsc.nodeShouldRunDaemonPod(oldNode, ds) - if err != nil { - continue - } - currentShouldRun, currentShouldContinueRunning, err := dsc.nodeShouldRunDaemonPod(curNode, ds) - if err != nil { - continue - } + oldShouldRun, oldShouldContinueRunning := dsc.nodeShouldRunDaemonPod(oldNode, ds) + currentShouldRun, currentShouldContinueRunning := dsc.nodeShouldRunDaemonPod(curNode, ds) if (oldShouldRun != currentShouldRun) || (oldShouldContinueRunning != currentShouldContinueRunning) { dsc.enqueueDaemonSet(ds) } @@ -817,13 +807,10 @@ func (dsc *DaemonSetsController) podsShouldBeOnNode( node *v1.Node, nodeToDaemonPods map[string][]*v1.Pod, ds *apps.DaemonSet, -) (nodesNeedingDaemonPods, podsToDelete []string, err error) { - - shouldRun, shouldContinueRunning, err := dsc.nodeShouldRunDaemonPod(node, ds) - if err != nil { - return - } + hash string, +) (nodesNeedingDaemonPods, podsToDelete []string) { + shouldRun, shouldContinueRunning := dsc.nodeShouldRunDaemonPod(node, ds) daemonPods, exists := nodeToDaemonPods[node.Name] switch { @@ -864,14 +851,60 @@ func (dsc *DaemonSetsController) podsShouldBeOnNode( daemonPodsRunning = append(daemonPodsRunning, pod) } } - // If daemon pod is supposed to be running on node, but more than 1 daemon pod is running, delete the excess daemon pods. - // Sort the daemon pods by creation time, so the oldest is preserved. - if len(daemonPodsRunning) > 1 { + + // When surge is not enabled, if there is more than 1 running pod on a node delete all but the oldest + if !util.AllowsSurge(ds) { + if len(daemonPodsRunning) <= 1 { + // There are no excess pods to be pruned, and no pods to create + break + } + sort.Sort(podByCreationTimestampAndPhase(daemonPodsRunning)) for i := 1; i < len(daemonPodsRunning); i++ { podsToDelete = append(podsToDelete, daemonPodsRunning[i].Name) } + break + } + + if len(daemonPodsRunning) <= 1 { + // // There are no excess pods to be pruned + if len(daemonPodsRunning) == 0 && shouldRun { + // We are surging so we need to have at least one non-deleted pod on the node + nodesNeedingDaemonPods = append(nodesNeedingDaemonPods, node.Name) + } + break } + + // When surge is enabled, we allow 2 pods if and only if the oldest pod matching the current hash state + // is not ready AND the oldest pod that doesn't match the current hash state is ready. All other pods are + // deleted. If neither pod is ready, only the one matching the current hash revision is kept. + var oldestNewPod, oldestOldPod *v1.Pod + sort.Sort(podByCreationTimestampAndPhase(daemonPodsRunning)) + for _, pod := range daemonPodsRunning { + if pod.Labels[apps.ControllerRevisionHashLabelKey] == hash { + if oldestNewPod == nil { + oldestNewPod = pod + continue + } + } else { + if oldestOldPod == nil { + oldestOldPod = pod + continue + } + } + podsToDelete = append(podsToDelete, pod.Name) + } + if oldestNewPod != nil && oldestOldPod != nil { + switch { + case !podutil.IsPodReady(oldestOldPod): + klog.V(5).Infof("Pod %s/%s from daemonset %s is no longer ready and will be replaced with newer pod %s", oldestOldPod.Namespace, oldestOldPod.Name, ds.Name, oldestNewPod.Name) + podsToDelete = append(podsToDelete, oldestOldPod.Name) + case podutil.IsPodAvailable(oldestNewPod, ds.Spec.MinReadySeconds, metav1.Time{Time: dsc.failedPodsBackoff.Clock.Now()}): + klog.V(5).Infof("Pod %s/%s from daemonset %s is now ready and will replace older pod %s", oldestNewPod.Namespace, oldestNewPod.Name, ds.Name, oldestOldPod.Name) + podsToDelete = append(podsToDelete, oldestOldPod.Name) + } + } + case !shouldContinueRunning && exists: // If daemon pod isn't supposed to run on node, but it is, delete all daemon pods on node. for _, pod := range daemonPods { @@ -882,7 +915,7 @@ func (dsc *DaemonSetsController) podsShouldBeOnNode( } } - return nodesNeedingDaemonPods, podsToDelete, nil + return nodesNeedingDaemonPods, podsToDelete } // manage manages the scheduling and running of Pods of ds on nodes. @@ -900,12 +933,8 @@ func (dsc *DaemonSetsController) manage(ds *apps.DaemonSet, nodeList []*v1.Node, // pod. If the node is supposed to run the daemon pod, but isn't, create the daemon pod on the node. var nodesNeedingDaemonPods, podsToDelete []string for _, node := range nodeList { - nodesNeedingDaemonPodsOnNode, podsToDeleteOnNode, err := dsc.podsShouldBeOnNode( - node, nodeToDaemonPods, ds) - - if err != nil { - continue - } + nodesNeedingDaemonPodsOnNode, podsToDeleteOnNode := dsc.podsShouldBeOnNode( + node, nodeToDaemonPods, ds, hash) nodesNeedingDaemonPods = append(nodesNeedingDaemonPods, nodesNeedingDaemonPodsOnNode...) podsToDelete = append(podsToDelete, podsToDeleteOnNode...) @@ -1085,12 +1114,9 @@ func (dsc *DaemonSetsController) updateDaemonSetStatus(ds *apps.DaemonSet, nodeL } var desiredNumberScheduled, currentNumberScheduled, numberMisscheduled, numberReady, updatedNumberScheduled, numberAvailable int + now := dsc.failedPodsBackoff.Clock.Now() for _, node := range nodeList { - shouldRun, _, err := dsc.nodeShouldRunDaemonPod(node, ds) - if err != nil { - return err - } - + shouldRun, _ := dsc.nodeShouldRunDaemonPod(node, ds) scheduled := len(nodeToDaemonPods[node.Name]) > 0 if shouldRun { @@ -1103,7 +1129,7 @@ func (dsc *DaemonSetsController) updateDaemonSetStatus(ds *apps.DaemonSet, nodeL pod := daemonPods[0] if podutil.IsPodReady(pod) { numberReady++ - if podutil.IsPodAvailable(pod, ds.Spec.MinReadySeconds, metav1.Now()) { + if podutil.IsPodAvailable(pod, ds.Spec.MinReadySeconds, metav1.Time{Time: now}) { numberAvailable++ } } @@ -1138,9 +1164,10 @@ func (dsc *DaemonSetsController) updateDaemonSetStatus(ds *apps.DaemonSet, nodeL } func (dsc *DaemonSetsController) syncDaemonSet(key string) error { - startTime := time.Now() + startTime := dsc.failedPodsBackoff.Clock.Now() + defer func() { - klog.V(4).Infof("Finished syncing daemon set %q (%v)", key, time.Since(startTime)) + klog.V(4).Infof("Finished syncing daemon set %q (%v)", key, dsc.failedPodsBackoff.Clock.Now().Sub(startTime)) }() namespace, name, err := cache.SplitMetaNamespaceKey(key) @@ -1233,42 +1260,43 @@ func (dsc *DaemonSetsController) syncDaemonSet(key string) error { // * shouldContinueRunning: // Returns true when a daemonset should continue running on a node if a daemonset pod is already // running on that node. -func (dsc *DaemonSetsController) nodeShouldRunDaemonPod(node *v1.Node, ds *apps.DaemonSet) (bool, bool, error) { +func (dsc *DaemonSetsController) nodeShouldRunDaemonPod(node *v1.Node, ds *apps.DaemonSet) (bool, bool) { pod := NewPod(ds, node.Name) // If the daemon set specifies a node name, check that it matches with node.Name. if !(ds.Spec.Template.Spec.NodeName == "" || ds.Spec.Template.Spec.NodeName == node.Name) { - return false, false, nil + return false, false } taints := node.Spec.Taints fitsNodeName, fitsNodeAffinity, fitsTaints := Predicates(pod, node, taints) if !fitsNodeName || !fitsNodeAffinity { - return false, false, nil + return false, false } if !fitsTaints { // Scheduled daemon pods should continue running if they tolerate NoExecute taint. - shouldContinueRunning := v1helper.TolerationsTolerateTaintsWithFilter(pod.Spec.Tolerations, taints, func(t *v1.Taint) bool { + _, hasUntoleratedTaint := v1helper.FindMatchingUntoleratedTaint(taints, pod.Spec.Tolerations, func(t *v1.Taint) bool { return t.Effect == v1.TaintEffectNoExecute }) - return false, shouldContinueRunning, nil + return false, !hasUntoleratedTaint } if matches, matchErr := dsc.namespaceNodeSelectorMatches(node, ds); !matches || matchErr != nil { - return false, false, matchErr + return false, false } - return true, true, nil + return true, true } // Predicates checks if a DaemonSet's pod can run on a node. func Predicates(pod *v1.Pod, node *v1.Node, taints []v1.Taint) (fitsNodeName, fitsNodeAffinity, fitsTaints bool) { fitsNodeName = len(pod.Spec.NodeName) == 0 || pod.Spec.NodeName == node.Name fitsNodeAffinity = pluginhelper.PodMatchesNodeSelectorAndAffinityTerms(pod, node) - fitsTaints = v1helper.TolerationsTolerateTaintsWithFilter(pod.Spec.Tolerations, taints, func(t *v1.Taint) bool { + _, hasUntoleratedTaint := v1helper.FindMatchingUntoleratedTaint(taints, pod.Spec.Tolerations, func(t *v1.Taint) bool { return t.Effect == v1.TaintEffectNoExecute || t.Effect == v1.TaintEffectNoSchedule }) + fitsTaints = !hasUntoleratedTaint return } diff --git a/vendor/k8s.io/kubernetes/pkg/controller/daemon/update.go b/vendor/k8s.io/kubernetes/pkg/controller/daemon/update.go index c8a67c35bcae..cd2ee0c72f1f 100644 --- a/vendor/k8s.io/kubernetes/pkg/controller/daemon/update.go +++ b/vendor/k8s.io/kubernetes/pkg/controller/daemon/update.go @@ -26,12 +26,11 @@ import ( "k8s.io/klog/v2" apps "k8s.io/api/apps/v1" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" - intstrutil "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/apimachinery/pkg/util/json" podutil "k8s.io/kubernetes/pkg/api/v1/pod" "k8s.io/kubernetes/pkg/controller" @@ -39,44 +38,197 @@ import ( labelsutil "k8s.io/kubernetes/pkg/util/labels" ) -// rollingUpdate deletes old daemon set pods making sure that no more than -// ds.Spec.UpdateStrategy.RollingUpdate.MaxUnavailable pods are unavailable +// rollingUpdate identifies the set of old pods to delete, or additional pods to create on nodes, +// remaining within the constraints imposed by the update strategy. func (dsc *DaemonSetsController) rollingUpdate(ds *apps.DaemonSet, nodeList []*v1.Node, hash string) error { nodeToDaemonPods, err := dsc.getNodesToDaemonPods(ds) if err != nil { return fmt.Errorf("couldn't get node to daemon pod mapping for daemon set %q: %v", ds.Name, err) } - - _, oldPods := dsc.getAllDaemonSetPods(ds, nodeToDaemonPods, hash) - maxUnavailable, numUnavailable, err := dsc.getUnavailableNumbers(ds, nodeList, nodeToDaemonPods) + maxSurge, maxUnavailable, err := dsc.updatedDesiredNodeCounts(ds, nodeList, nodeToDaemonPods) if err != nil { return fmt.Errorf("couldn't get unavailable numbers: %v", err) } - oldAvailablePods, oldUnavailablePods := util.SplitByAvailablePods(ds.Spec.MinReadySeconds, oldPods) - // for oldPods delete all not running pods + now := dsc.failedPodsBackoff.Clock.Now() + + // When not surging, we delete just enough pods to stay under the maxUnavailable limit, if any + // are necessary, and let the core loop create new instances on those nodes. + // + // Assumptions: + // * Expect manage loop to allow no more than one pod per node + // * Expect manage loop will create new pods + // * Expect manage loop will handle failed pods + // * Deleted pods do not count as unavailable so that updates make progress when nodes are down + // Invariants: + // * The number of new pods that are unavailable must be less than maxUnavailable + // * A node with an available old pod is a candidate for deletion if it does not violate other invariants + // + if maxSurge == 0 { + var numUnavailable int + var allowedReplacementPods []string + var candidatePodsToDelete []string + for nodeName, pods := range nodeToDaemonPods { + newPod, oldPod, ok := findUpdatedPodsOnNode(ds, pods, hash) + if !ok { + // let the manage loop clean up this node, and treat it as an unavailable node + klog.V(3).Infof("DaemonSet %s/%s has excess pods on node %s, skipping to allow the core loop to process", ds.Namespace, ds.Name, nodeName) + numUnavailable++ + continue + } + switch { + case oldPod == nil && newPod == nil, oldPod != nil && newPod != nil: + // the manage loop will handle creating or deleting the appropriate pod, consider this unavailable + numUnavailable++ + case newPod != nil: + // this pod is up to date, check its availability + if !podutil.IsPodAvailable(newPod, ds.Spec.MinReadySeconds, metav1.Time{Time: now}) { + // an unavailable new pod is counted against maxUnavailable + numUnavailable++ + } + default: + // this pod is old, it is an update candidate + switch { + case !podutil.IsPodAvailable(oldPod, ds.Spec.MinReadySeconds, metav1.Time{Time: now}): + // the old pod isn't available, so it needs to be replaced + klog.V(5).Infof("DaemonSet %s/%s pod %s on node %s is out of date and not available, allowing replacement", ds.Namespace, ds.Name, oldPod.Name, nodeName) + // record the replacement + if allowedReplacementPods == nil { + allowedReplacementPods = make([]string, 0, len(nodeToDaemonPods)) + } + allowedReplacementPods = append(allowedReplacementPods, oldPod.Name) + case numUnavailable >= maxUnavailable: + // no point considering any other candidates + continue + default: + klog.V(5).Infof("DaemonSet %s/%s pod %s on node %s is out of date, this is a candidate to replace", ds.Namespace, ds.Name, oldPod.Name, nodeName) + // record the candidate + if candidatePodsToDelete == nil { + candidatePodsToDelete = make([]string, 0, maxUnavailable) + } + candidatePodsToDelete = append(candidatePodsToDelete, oldPod.Name) + } + } + } + + // use any of the candidates we can, including the allowedReplacemnntPods + klog.V(5).Infof("DaemonSet %s/%s allowing %d replacements, up to %d unavailable, %d new are unavailable, %d candidates", ds.Namespace, ds.Name, len(allowedReplacementPods), maxUnavailable, numUnavailable, len(candidatePodsToDelete)) + remainingUnavailable := maxUnavailable - numUnavailable + if remainingUnavailable < 0 { + remainingUnavailable = 0 + } + if max := len(candidatePodsToDelete); remainingUnavailable > max { + remainingUnavailable = max + } + oldPodsToDelete := append(allowedReplacementPods, candidatePodsToDelete[:remainingUnavailable]...) + + return dsc.syncNodes(ds, oldPodsToDelete, nil, hash) + } + + // When surging, we create new pods whenever an old pod is unavailable, and we can create up + // to maxSurge extra pods + // + // Assumptions: + // * Expect manage loop to allow no more than two pods per node, one old, one new + // * Expect manage loop will create new pods if there are no pods on node + // * Expect manage loop will handle failed pods + // * Deleted pods do not count as unavailable so that updates make progress when nodes are down + // Invariants: + // * A node with an unavailable old pod is a candidate for immediate new pod creation + // * An old available pod is deleted if a new pod is available + // * No more than maxSurge new pods are created for old available pods at any one time + // var oldPodsToDelete []string - klog.V(4).Infof("Marking all unavailable old pods for deletion") - for _, pod := range oldUnavailablePods { - // Skip terminating pods. We won't delete them again - if pod.DeletionTimestamp != nil { + var candidateNewNodes []string + var allowedNewNodes []string + var numSurge int + + for nodeName, pods := range nodeToDaemonPods { + newPod, oldPod, ok := findUpdatedPodsOnNode(ds, pods, hash) + if !ok { + // let the manage loop clean up this node, and treat it as a surge node + klog.V(3).Infof("DaemonSet %s/%s has excess pods on node %s, skipping to allow the core loop to process", ds.Namespace, ds.Name, nodeName) + numSurge++ continue } - klog.V(4).Infof("Marking pod %s/%s for deletion", ds.Name, pod.Name) - oldPodsToDelete = append(oldPodsToDelete, pod.Name) + switch { + case oldPod == nil: + // we don't need to do anything to this node, the manage loop will handle it + case newPod == nil: + // this is a surge candidate + switch { + case !podutil.IsPodAvailable(oldPod, ds.Spec.MinReadySeconds, metav1.Time{Time: now}): + // the old pod isn't available, allow it to become a replacement + klog.V(5).Infof("Pod %s on node %s is out of date and not available, allowing replacement", ds.Namespace, ds.Name, oldPod.Name, nodeName) + // record the replacement + if allowedNewNodes == nil { + allowedNewNodes = make([]string, 0, len(nodeToDaemonPods)) + } + allowedNewNodes = append(allowedNewNodes, nodeName) + case numSurge >= maxSurge: + // no point considering any other candidates + continue + default: + klog.V(5).Infof("DaemonSet %s/%s pod %s on node %s is out of date, this is a surge candidate", ds.Namespace, ds.Name, oldPod.Name, nodeName) + // record the candidate + if candidateNewNodes == nil { + candidateNewNodes = make([]string, 0, maxSurge) + } + candidateNewNodes = append(candidateNewNodes, nodeName) + } + default: + // we have already surged onto this node, determine our state + if !podutil.IsPodAvailable(newPod, ds.Spec.MinReadySeconds, metav1.Time{Time: now}) { + // we're waiting to go available here + numSurge++ + continue + } + // we're available, delete the old pod + klog.V(5).Infof("DaemonSet %s/%s pod %s on node %s is available, remove %s", ds.Namespace, ds.Name, newPod.Name, nodeName, oldPod.Name) + oldPodsToDelete = append(oldPodsToDelete, oldPod.Name) + } } - klog.V(4).Infof("Marking old pods for deletion") - for _, pod := range oldAvailablePods { - if numUnavailable >= maxUnavailable { - klog.V(4).Infof("Number of unavailable DaemonSet pods: %d, is equal to or exceeds allowed maximum: %d", numUnavailable, maxUnavailable) - break + // use any of the candidates we can, including the allowedNewNodes + klog.V(5).Infof("DaemonSet %s/%s allowing %d replacements, surge up to %d, %d are in progress, %d candidates", ds.Namespace, ds.Name, len(allowedNewNodes), maxSurge, numSurge, len(candidateNewNodes)) + remainingSurge := maxSurge - numSurge + if remainingSurge < 0 { + remainingSurge = 0 + } + if max := len(candidateNewNodes); remainingSurge > max { + remainingSurge = max + } + newNodesToCreate := append(allowedNewNodes, candidateNewNodes[:remainingSurge]...) + + return dsc.syncNodes(ds, oldPodsToDelete, newNodesToCreate, hash) +} + +// findUpdatedPodsOnNode looks at non-deleted pods on a given node and returns true if there +// is at most one of each old and new pods, or false if there are multiples. We can skip +// processing the particular node in those scenarios and let the manage loop prune the +// excess pods for our next time around. +func findUpdatedPodsOnNode(ds *apps.DaemonSet, podsOnNode []*v1.Pod, hash string) (newPod, oldPod *v1.Pod, ok bool) { + for _, pod := range podsOnNode { + if pod.DeletionTimestamp != nil { + continue + } + generation, err := util.GetTemplateGeneration(ds) + if err != nil { + generation = nil + } + if util.IsPodUpdated(pod, hash, generation) { + if newPod != nil { + return nil, nil, false + } + newPod = pod + } else { + if oldPod != nil { + return nil, nil, false + } + oldPod = pod } - klog.V(4).Infof("Marking pod %s/%s for deletion", ds.Name, pod.Name) - oldPodsToDelete = append(oldPodsToDelete, pod.Name) - numUnavailable++ } - return dsc.syncNodes(ds, oldPodsToDelete, []string{}, hash) + return newPod, oldPod, true } // constructHistory finds all histories controlled by the given DaemonSet, and @@ -363,64 +515,41 @@ func (dsc *DaemonSetsController) snapshot(ds *apps.DaemonSet, revision int64) (* return history, err } -func (dsc *DaemonSetsController) getAllDaemonSetPods(ds *apps.DaemonSet, nodeToDaemonPods map[string][]*v1.Pod, hash string) ([]*v1.Pod, []*v1.Pod) { - var newPods []*v1.Pod - var oldPods []*v1.Pod - - for _, pods := range nodeToDaemonPods { - for _, pod := range pods { - // If the returned error is not nil we have a parse error. - // The controller handles this via the hash. - generation, err := util.GetTemplateGeneration(ds) - if err != nil { - generation = nil - } - if util.IsPodUpdated(pod, hash, generation) { - newPods = append(newPods, pod) - } else { - oldPods = append(oldPods, pod) - } - } - } - return newPods, oldPods -} - -func (dsc *DaemonSetsController) getUnavailableNumbers(ds *apps.DaemonSet, nodeList []*v1.Node, nodeToDaemonPods map[string][]*v1.Pod) (int, int, error) { - klog.V(4).Infof("Getting unavailable numbers") - var numUnavailable, desiredNumberScheduled int +// updatedDesiredNodeCounts calculates the true number of allowed unavailable or surge pods and +// updates the nodeToDaemonPods array to include an empty array for every node that is not scheduled. +func (dsc *DaemonSetsController) updatedDesiredNodeCounts(ds *apps.DaemonSet, nodeList []*v1.Node, nodeToDaemonPods map[string][]*v1.Pod) (int, int, error) { + var desiredNumberScheduled int for i := range nodeList { node := nodeList[i] - wantToRun, _, err := dsc.nodeShouldRunDaemonPod(node, ds) - if err != nil { - return -1, -1, err - } + wantToRun, _ := dsc.nodeShouldRunDaemonPod(node, ds) if !wantToRun { continue } desiredNumberScheduled++ - daemonPods, exists := nodeToDaemonPods[node.Name] - if !exists { - numUnavailable++ - continue - } - available := false - for _, pod := range daemonPods { - //for the purposes of update we ensure that the Pod is both available and not terminating - if podutil.IsPodAvailable(pod, ds.Spec.MinReadySeconds, metav1.Now()) && pod.DeletionTimestamp == nil { - available = true - break - } - } - if !available { - numUnavailable++ + + if _, exists := nodeToDaemonPods[node.Name]; !exists { + nodeToDaemonPods[node.Name] = nil } } - maxUnavailable, err := intstrutil.GetScaledValueFromIntOrPercent(ds.Spec.UpdateStrategy.RollingUpdate.MaxUnavailable, desiredNumberScheduled, true) + + maxUnavailable, err := util.UnavailableCount(ds, desiredNumberScheduled) if err != nil { return -1, -1, fmt.Errorf("invalid value for MaxUnavailable: %v", err) } - klog.V(4).Infof(" DaemonSet %s/%s, maxUnavailable: %d, numUnavailable: %d", ds.Namespace, ds.Name, maxUnavailable, numUnavailable) - return maxUnavailable, numUnavailable, nil + + maxSurge, err := util.SurgeCount(ds, desiredNumberScheduled) + if err != nil { + return -1, -1, fmt.Errorf("invalid value for MaxSurge: %v", err) + } + + // if the daemonset returned with an impossible configuration, obey the default of unavailable=1 (in the + // event the apiserver returns 0 for both surge and unavailability) + if desiredNumberScheduled > 0 && maxUnavailable == 0 && maxSurge == 0 { + klog.Warningf("DaemonSet %s/%s is not configured for surge or unavailability, defaulting to accepting unavailability", ds.Namespace, ds.Name) + maxUnavailable = 1 + } + klog.V(5).Infof("DaemonSet %s/%s, maxSurge: %d, maxUnavailable: %d", ds.Namespace, ds.Name, maxSurge, maxUnavailable) + return maxSurge, maxUnavailable, nil } type historiesByRevision []*apps.ControllerRevision diff --git a/vendor/k8s.io/kubernetes/pkg/controller/daemon/util/BUILD b/vendor/k8s.io/kubernetes/pkg/controller/daemon/util/BUILD deleted file mode 100644 index 0326bc53f19f..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/controller/daemon/util/BUILD +++ /dev/null @@ -1,51 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["daemonset_util.go"], - importpath = "k8s.io/kubernetes/pkg/controller/daemon/util", - deps = [ - "//pkg/api/v1/pod:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/v1/helper:go_default_library", - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["daemonset_util_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/controller/daemon/util/daemonset_util.go b/vendor/k8s.io/kubernetes/pkg/controller/daemon/util/daemonset_util.go index 26e203867083..f2b58237c205 100644 --- a/vendor/k8s.io/kubernetes/pkg/controller/daemon/util/daemonset_util.go +++ b/vendor/k8s.io/kubernetes/pkg/controller/daemon/util/daemonset_util.go @@ -24,9 +24,10 @@ import ( v1 "k8s.io/api/core/v1" extensions "k8s.io/api/extensions/v1beta1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - podutil "k8s.io/kubernetes/pkg/api/v1/pod" - api "k8s.io/kubernetes/pkg/apis/core" + intstrutil "k8s.io/apimachinery/pkg/util/intstr" + utilfeature "k8s.io/apiserver/pkg/util/feature" v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper" + "k8s.io/kubernetes/pkg/features" ) // GetTemplateGeneration gets the template generation associated with a v1.DaemonSet by extracting it from the @@ -123,6 +124,43 @@ func CreatePodTemplate(template v1.PodTemplateSpec, generation *int64, hash stri return newTemplate } +// AllowsSurge returns true if the daemonset allows more than a single pod on any node. +func AllowsSurge(ds *apps.DaemonSet) bool { + maxSurge, err := SurgeCount(ds, 1) + return err == nil && maxSurge > 0 +} + +// SurgeCount returns 0 if surge is not requested, the expected surge number to allow +// out of numberToSchedule if surge is configured, or an error if the surge percentage +// requested is invalid. +func SurgeCount(ds *apps.DaemonSet, numberToSchedule int) (int, error) { + if ds.Spec.UpdateStrategy.Type != apps.RollingUpdateDaemonSetStrategyType { + return 0, nil + } + if !utilfeature.DefaultFeatureGate.Enabled(features.DaemonSetUpdateSurge) { + return 0, nil + } + r := ds.Spec.UpdateStrategy.RollingUpdate + if r == nil { + return 0, nil + } + return intstrutil.GetScaledValueFromIntOrPercent(r.MaxSurge, numberToSchedule, true) +} + +// UnavailableCount returns 0 if unavailability is not requested, the expected +// unavailability number to allow out of numberToSchedule if requested, or an error if +// the unavailability percentage requested is invalid. +func UnavailableCount(ds *apps.DaemonSet, numberToSchedule int) (int, error) { + if ds.Spec.UpdateStrategy.Type != apps.RollingUpdateDaemonSetStrategyType { + return 0, nil + } + r := ds.Spec.UpdateStrategy.RollingUpdate + if r == nil { + return 0, nil + } + return intstrutil.GetScaledValueFromIntOrPercent(r.MaxUnavailable, numberToSchedule, true) +} + // IsPodUpdated checks if pod contains label value that either matches templateGeneration or hash func IsPodUpdated(pod *v1.Pod, hash string, dsTemplateGeneration *int64) bool { // Compare with hash to see if the pod is updated, need to maintain backward compatibility of templateGeneration @@ -132,26 +170,12 @@ func IsPodUpdated(pod *v1.Pod, hash string, dsTemplateGeneration *int64) bool { return hashMatches || templateMatches } -// SplitByAvailablePods splits provided daemon set pods by availability -func SplitByAvailablePods(minReadySeconds int32, pods []*v1.Pod) ([]*v1.Pod, []*v1.Pod) { - unavailablePods := []*v1.Pod{} - availablePods := []*v1.Pod{} - for _, pod := range pods { - if podutil.IsPodAvailable(pod, minReadySeconds, metav1.Now()) { - availablePods = append(availablePods, pod) - } else { - unavailablePods = append(unavailablePods, pod) - } - } - return availablePods, unavailablePods -} - // ReplaceDaemonSetPodNodeNameNodeAffinity replaces the RequiredDuringSchedulingIgnoredDuringExecution // NodeAffinity of the given affinity with a new NodeAffinity that selects the given nodeName. // Note that this function assumes that no NodeAffinity conflicts with the selected nodeName. func ReplaceDaemonSetPodNodeNameNodeAffinity(affinity *v1.Affinity, nodename string) *v1.Affinity { nodeSelReq := v1.NodeSelectorRequirement{ - Key: api.ObjectNameField, + Key: metav1.ObjectNameField, Operator: v1.NodeSelectorOpIn, Values: []string{nodename}, } @@ -220,11 +244,11 @@ func GetTargetNodeName(pod *v1.Pod) (string, error) { for _, term := range terms { for _, exp := range term.MatchFields { - if exp.Key == api.ObjectNameField && + if exp.Key == metav1.ObjectNameField && exp.Operator == v1.NodeSelectorOpIn { if len(exp.Values) != 1 { return "", fmt.Errorf("the matchFields value of '%s' is not unique for pod %s/%s", - api.ObjectNameField, pod.Namespace, pod.Name) + metav1.ObjectNameField, pod.Namespace, pod.Name) } return exp.Values[0], nil diff --git a/vendor/k8s.io/kubernetes/pkg/controller/deployment/util/BUILD b/vendor/k8s.io/kubernetes/pkg/controller/deployment/util/BUILD deleted file mode 100644 index 698c83aa55cf..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/controller/deployment/util/BUILD +++ /dev/null @@ -1,68 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["deployment_util.go"], - importpath = "k8s.io/kubernetes/pkg/controller/deployment/util", - deps = [ - "//pkg/controller:go_default_library", - "//pkg/util/labels:go_default_library", - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/apps/v1:go_default_library", - "//staging/src/k8s.io/client-go/listers/apps/v1:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/integer:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "deployment_util_test.go", - "hash_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/controller:go_default_library", - "//pkg/util/hash:go_default_library", - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/controller/deployment/util/deployment_util.go b/vendor/k8s.io/kubernetes/pkg/controller/deployment/util/deployment_util.go index fb1af676d4c5..84fc869f5ebc 100644 --- a/vendor/k8s.io/kubernetes/pkg/controller/deployment/util/deployment_util.go +++ b/vendor/k8s.io/kubernetes/pkg/controller/deployment/util/deployment_util.go @@ -319,7 +319,7 @@ func copyDeploymentAnnotationsToReplicaSet(deployment *apps.Deployment, rs *apps // newRS revision is updated automatically in getNewReplicaSet, and the deployment's revision number is then updated // by copying its newRS revision number. We should not copy deployment's revision to its newRS, since the update of // deployment revision number may fail (revision becomes stale) and the revision number in newRS is more reliable. - if skipCopyAnnotation(k) || rs.Annotations[k] == v { + if _, exist := rs.Annotations[k]; skipCopyAnnotation(k) || (exist && rs.Annotations[k] == v) { continue } rs.Annotations[k] = v @@ -949,3 +949,18 @@ func GetDeploymentsForReplicaSet(deploymentLister appslisters.DeploymentLister, return deployments, nil } + +// ReplicaSetsByRevision sorts a list of ReplicaSet by revision, using their creation timestamp or name as a tie breaker. +// By using the creation timestamp, this sorts from old to new replica sets. +type ReplicaSetsByRevision []*apps.ReplicaSet + +func (o ReplicaSetsByRevision) Len() int { return len(o) } +func (o ReplicaSetsByRevision) Swap(i, j int) { o[i], o[j] = o[j], o[i] } +func (o ReplicaSetsByRevision) Less(i, j int) bool { + revision1, err1 := Revision(o[i]) + revision2, err2 := Revision(o[j]) + if err1 != nil || err2 != nil || revision1 == revision2 { + return controller.ReplicaSetsByCreationTimestamp(o).Less(i, j) + } + return revision1 < revision2 +} diff --git a/vendor/k8s.io/kubernetes/pkg/controller/job/BUILD b/vendor/k8s.io/kubernetes/pkg/controller/job/BUILD deleted file mode 100644 index 6c9320a86e92..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/controller/job/BUILD +++ /dev/null @@ -1,86 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "job_controller.go", - "utils.go", - ], - importpath = "k8s.io/kubernetes/pkg/controller/job", - deps = [ - "//pkg/controller:go_default_library", - "//staging/src/k8s.io/api/batch/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/informers/batch/v1:go_default_library", - "//staging/src/k8s.io/client-go/informers/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/listers/batch/v1:go_default_library", - "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/client-go/util/workqueue:go_default_library", - "//staging/src/k8s.io/component-base/metrics/prometheus/ratelimiter:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/integer:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "job_controller_test.go", - "utils_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core/install:go_default_library", - "//pkg/controller:go_default_library", - "//pkg/controller/testutil:go_default_library", - "//staging/src/k8s.io/api/batch/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/rand:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/util/workqueue:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/controller/job/config:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/controller/job/indexed_job_utils.go b/vendor/k8s.io/kubernetes/pkg/controller/job/indexed_job_utils.go new file mode 100644 index 000000000000..9f9a09ac51b1 --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/controller/job/indexed_job_utils.go @@ -0,0 +1,221 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package job + +import ( + "fmt" + "math" + "sort" + "strconv" + "strings" + + batch "k8s.io/api/batch/v1" + v1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/util/sets" + "k8s.io/kubernetes/pkg/controller" +) + +const ( + completionIndexEnvName = "JOB_COMPLETION_INDEX" + unknownCompletionIndex = -1 +) + +func isIndexedJob(job *batch.Job) bool { + return job.Spec.CompletionMode != nil && *job.Spec.CompletionMode == batch.IndexedCompletion +} + +// calculateSucceededIndexes returns a string representation of the list of +// succeeded indexes in compressed format and the number of succeeded indexes. +func calculateSucceededIndexes(pods []*v1.Pod) (string, int32) { + sort.Sort(byCompletionIndex(pods)) + var result strings.Builder + var lastSucceeded int + var count int32 + firstSucceeded := math.MinInt32 + for _, p := range pods { + ix := getCompletionIndex(p.Annotations) + if ix == unknownCompletionIndex { + continue + } + if p.Status.Phase == v1.PodSucceeded { + if firstSucceeded == math.MinInt32 { + firstSucceeded = ix + } else if ix > lastSucceeded+1 { + addSingleOrRangeStr(&result, firstSucceeded, lastSucceeded) + count += int32(lastSucceeded - firstSucceeded + 1) + firstSucceeded = ix + } + lastSucceeded = ix + } + } + if firstSucceeded != math.MinInt32 { + addSingleOrRangeStr(&result, firstSucceeded, lastSucceeded) + count += int32(lastSucceeded - firstSucceeded + 1) + } + return result.String(), count +} + +func addSingleOrRangeStr(builder *strings.Builder, first, last int) { + if builder.Len() > 0 { + builder.WriteRune(',') + } + builder.WriteString(strconv.Itoa(first)) + if last > first { + if last == first+1 { + builder.WriteRune(',') + } else { + builder.WriteRune('-') + } + builder.WriteString(strconv.Itoa(last)) + } +} + +// firstPendingIndexes returns `count` indexes less than `completions` that are +// not covered by running or succeeded pods. +func firstPendingIndexes(pods []*v1.Pod, count, completions int) []int { + if count == 0 { + return nil + } + nonPending := sets.NewInt() + for _, p := range pods { + if p.Status.Phase == v1.PodSucceeded || controller.IsPodActive(p) { + ix := getCompletionIndex(p.Annotations) + if ix != unknownCompletionIndex { + nonPending.Insert(ix) + } + } + } + result := make([]int, 0, count) + // The following algorithm is bounded by the number of non pending pods and + // parallelism. + // TODO(#99368): Convert the list of non-pending pods into a set of + // non-pending intervals from the job's .status.completedIndexes and active + // pods. + candidate := 0 + for _, np := range nonPending.List() { + for ; candidate < np && candidate < completions; candidate++ { + result = append(result, candidate) + if len(result) == count { + return result + } + } + candidate = np + 1 + } + for ; candidate < completions && len(result) < count; candidate++ { + result = append(result, candidate) + } + return result +} + +// appendDuplicatedIndexPodsForRemoval scans active `pods` for duplicated +// completion indexes. For each index, it selects n-1 pods for removal, where n +// is the number of repetitions. The pods to be removed are appended to `rm`, +// while the remaining pods are appended to `left`. +// All pods that don't have a completion index are appended to `rm`. +func appendDuplicatedIndexPodsForRemoval(rm, left, pods []*v1.Pod) ([]*v1.Pod, []*v1.Pod) { + sort.Sort(byCompletionIndex(pods)) + lastIndex := unknownCompletionIndex + firstRepeatPos := 0 + for i, p := range pods { + ix := getCompletionIndex(p.Annotations) + if ix != lastIndex { + rm, left = appendPodsWithSameIndexForRemovalAndRemaining(rm, left, pods[firstRepeatPos:i], lastIndex) + firstRepeatPos = i + lastIndex = ix + } + } + return appendPodsWithSameIndexForRemovalAndRemaining(rm, left, pods[firstRepeatPos:], lastIndex) +} + +func appendPodsWithSameIndexForRemovalAndRemaining(rm, left, pods []*v1.Pod, ix int) ([]*v1.Pod, []*v1.Pod) { + if ix == unknownCompletionIndex { + rm = append(rm, pods...) + return rm, left + } + if len(pods) == 1 { + left = append(left, pods[0]) + return rm, left + } + sort.Sort(controller.ActivePods(pods)) + rm = append(rm, pods[:len(pods)-1]...) + left = append(left, pods[len(pods)-1]) + return rm, left +} + +func getCompletionIndex(annotations map[string]string) int { + if annotations == nil { + return unknownCompletionIndex + } + v, ok := annotations[batch.JobCompletionIndexAnnotationAlpha] + if !ok { + return unknownCompletionIndex + } + i, err := strconv.Atoi(v) + if err != nil { + return unknownCompletionIndex + } + if i < 0 { + return unknownCompletionIndex + } + return i +} + +func addCompletionIndexEnvVariables(template *v1.PodTemplateSpec) { + for i := range template.Spec.InitContainers { + addCompletionIndexEnvVariable(&template.Spec.InitContainers[i]) + } + for i := range template.Spec.Containers { + addCompletionIndexEnvVariable(&template.Spec.Containers[i]) + } +} + +func addCompletionIndexEnvVariable(container *v1.Container) { + for _, v := range container.Env { + if v.Name == completionIndexEnvName { + return + } + } + container.Env = append(container.Env, v1.EnvVar{ + Name: completionIndexEnvName, + ValueFrom: &v1.EnvVarSource{ + FieldRef: &v1.ObjectFieldSelector{ + FieldPath: fmt.Sprintf("metadata.annotations['%s']", batch.JobCompletionIndexAnnotationAlpha), + }, + }, + }) +} + +func addCompletionIndexAnnotation(template *v1.PodTemplateSpec, index int) { + if template.Annotations == nil { + template.Annotations = make(map[string]string, 1) + } + template.Annotations[batch.JobCompletionIndexAnnotationAlpha] = strconv.Itoa(index) +} + +type byCompletionIndex []*v1.Pod + +func (bci byCompletionIndex) Less(i, j int) bool { + return getCompletionIndex(bci[i].Annotations) < getCompletionIndex(bci[j].Annotations) +} + +func (bci byCompletionIndex) Swap(i, j int) { + bci[i], bci[j] = bci[j], bci[i] +} + +func (bci byCompletionIndex) Len() int { + return len(bci) +} diff --git a/vendor/k8s.io/kubernetes/pkg/controller/job/job_controller.go b/vendor/k8s.io/kubernetes/pkg/controller/job/job_controller.go index 70c7504834ba..cd50c5f2cdf0 100644 --- a/vendor/k8s.io/kubernetes/pkg/controller/job/job_controller.go +++ b/vendor/k8s.io/kubernetes/pkg/controller/job/job_controller.go @@ -23,16 +23,17 @@ import ( "reflect" "sort" "sync" + "sync/atomic" "time" batch "k8s.io/api/batch/v1" "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/errors" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/apimachinery/pkg/util/wait" + utilfeature "k8s.io/apiserver/pkg/util/feature" batchinformers "k8s.io/client-go/informers/batch/v1" coreinformers "k8s.io/client-go/informers/core/v1" clientset "k8s.io/client-go/kubernetes" @@ -46,6 +47,7 @@ import ( "k8s.io/component-base/metrics/prometheus/ratelimiter" "k8s.io/klog/v2" "k8s.io/kubernetes/pkg/controller" + "k8s.io/kubernetes/pkg/features" "k8s.io/utils/integer" ) @@ -348,7 +350,7 @@ func (jm *Controller) updateJob(old, cur interface{}) { total := time.Duration(*curADS) * time.Second // AddAfter will handle total < passed jm.queue.AddAfter(key, total-passed) - klog.V(4).Infof("job ActiveDeadlineSeconds updated, will rsync after %d seconds", total-passed) + klog.V(4).Infof("job %q ActiveDeadlineSeconds updated, will rsync after %d seconds", key, total-passed) } } } @@ -453,20 +455,31 @@ func (jm *Controller) syncJob(key string) (bool, error) { } sharedJob, err := jm.jobLister.Jobs(ns).Get(name) if err != nil { - if errors.IsNotFound(err) { + if apierrors.IsNotFound(err) { klog.V(4).Infof("Job has been deleted: %v", key) jm.expectations.DeleteExpectations(key) return true, nil } return false, err } - job := *sharedJob + // make a copy so we don't mutate the shared cache + job := *sharedJob.DeepCopy() // if job was finished previously, we don't want to redo the termination if IsJobFinished(&job) { return true, nil } + // Cannot create Pods if this is an Indexed Job and the feature is disabled. + if !utilfeature.DefaultFeatureGate.Enabled(features.IndexedJob) && isIndexedJob(&job) { + jm.recorder.Event(&job, v1.EventTypeWarning, "IndexedJobDisabled", "Skipped Indexed Job sync because feature is disabled.") + return false, nil + } + if job.Spec.CompletionMode != nil && *job.Spec.CompletionMode != batch.NonIndexedCompletion && *job.Spec.CompletionMode != batch.IndexedCompletion { + jm.recorder.Event(&job, v1.EventTypeWarning, "UnknownCompletionMode", "Skipped Job sync because completion mode is unknown") + return false, nil + } + // Check the expectations of the job before counting active pods, otherwise a new pod can sneak in // and update the expectations after we've retrieved active pods from the store. If a new pod enters // the store after we've checked the expectation, the job sync is just deferred till the next relist. @@ -476,13 +489,12 @@ func (jm *Controller) syncJob(key string) (bool, error) { if err != nil { return false, err } - activePods := controller.FilterActivePods(pods) active := int32(len(activePods)) - succeeded, failed := getStatus(pods) - conditions := len(job.Status.Conditions) - // job first start - if job.Status.StartTime == nil { + succeeded, failed := getStatus(&job, pods) + // Job first start. Set StartTime and start the ActiveDeadlineSeconds timer + // only if the job is not in the suspended state. + if job.Status.StartTime == nil && !jobSuspended(&job) { now := metav1.Now() job.Status.StartTime = &now // enqueue a sync to check if job past ActiveDeadlineSeconds @@ -517,25 +529,27 @@ func (jm *Controller) syncJob(key string) (bool, error) { failureMessage = "Job was active longer than specified deadline" } + var succeededIndexes string + if isIndexedJob(&job) { + succeededIndexes, succeeded = calculateSucceededIndexes(pods) + } + jobConditionsChanged := false + manageJobCalled := false if jobFailed { - errCh := make(chan error, active) - jm.deleteJobPods(&job, activePods, errCh) - select { - case manageJobErr = <-errCh: - if manageJobErr != nil { - break - } - default: - } + // TODO(#28486): Account for pod failures in status once we can track + // completions without lingering pods. + _, manageJobErr = jm.deleteJobPods(&job, "", activePods) // update status values accordingly failed += active active = 0 - job.Status.Conditions = append(job.Status.Conditions, newCondition(batch.JobFailed, failureReason, failureMessage)) + job.Status.Conditions = append(job.Status.Conditions, newCondition(batch.JobFailed, v1.ConditionTrue, failureReason, failureMessage)) + jobConditionsChanged = true jm.recorder.Event(&job, v1.EventTypeWarning, failureReason, failureMessage) } else { if jobNeedsSync && job.DeletionTimestamp == nil { - active, manageJobErr = jm.manageJob(activePods, succeeded, &job) + active, manageJobErr = jm.manageJob(&job, activePods, succeeded, pods) + manageJobCalled = true } completions := succeeded complete := false @@ -565,10 +579,40 @@ func (jm *Controller) syncJob(key string) (bool, error) { } } if complete { - job.Status.Conditions = append(job.Status.Conditions, newCondition(batch.JobComplete, "", "")) + job.Status.Conditions = append(job.Status.Conditions, newCondition(batch.JobComplete, v1.ConditionTrue, "", "")) + jobConditionsChanged = true now := metav1.Now() job.Status.CompletionTime = &now jm.recorder.Event(&job, v1.EventTypeNormal, "Completed", "Job completed") + } else if utilfeature.DefaultFeatureGate.Enabled(features.SuspendJob) && manageJobCalled { + // Update the conditions / emit events only if manageJob was called in + // this syncJob. Otherwise wait for the right syncJob call to make + // updates. + if job.Spec.Suspend != nil && *job.Spec.Suspend { + // Job can be in the suspended state only if it is NOT completed. + var isUpdated bool + job.Status.Conditions, isUpdated = ensureJobConditionStatus(job.Status.Conditions, batch.JobSuspended, v1.ConditionTrue, "JobSuspended", "Job suspended") + if isUpdated { + jobConditionsChanged = true + jm.recorder.Event(&job, v1.EventTypeNormal, "Suspended", "Job suspended") + } + } else { + // Job not suspended. + var isUpdated bool + job.Status.Conditions, isUpdated = ensureJobConditionStatus(job.Status.Conditions, batch.JobSuspended, v1.ConditionFalse, "JobResumed", "Job resumed") + if isUpdated { + jobConditionsChanged = true + jm.recorder.Event(&job, v1.EventTypeNormal, "Resumed", "Job resumed") + // Resumed jobs will always reset StartTime to current time. This is + // done because the ActiveDeadlineSeconds timer shouldn't go off + // whilst the Job is still suspended and resetting StartTime is + // consistent with resuming a Job created in the suspended state. + // (ActiveDeadlineSeconds is interpreted as the number of seconds a + // Job is continuously active.) + now := metav1.Now() + job.Status.StartTime = &now + } + } } } @@ -582,10 +626,13 @@ func (jm *Controller) syncJob(key string) (bool, error) { } // no need to update the job if the status hasn't changed since last time - if job.Status.Active != active || job.Status.Succeeded != succeeded || job.Status.Failed != failed || len(job.Status.Conditions) != conditions { + if job.Status.Active != active || job.Status.Succeeded != succeeded || job.Status.Failed != failed || jobConditionsChanged { job.Status.Active = active job.Status.Succeeded = succeeded job.Status.Failed = failed + if isIndexedJob(&job) { + job.Status.CompletedIndexes = succeededIndexes + } if err := jm.updateHandler(&job); err != nil { return forget, err @@ -602,27 +649,32 @@ func (jm *Controller) syncJob(key string) (bool, error) { return forget, manageJobErr } -func (jm *Controller) deleteJobPods(job *batch.Job, pods []*v1.Pod, errCh chan<- error) { - // TODO: below code should be replaced with pod termination resulting in - // pod failures, rather than killing pods. Unfortunately none such solution - // exists ATM. There's an open discussion in the topic in - // https://github.com/kubernetes/kubernetes/issues/14602 which might give - // some sort of solution to above problem. - // kill remaining active pods - wait := sync.WaitGroup{} - nbPods := len(pods) - wait.Add(nbPods) - for i := int32(0); i < int32(nbPods); i++ { - go func(ix int32) { - defer wait.Done() - if err := jm.podControl.DeletePod(job.Namespace, pods[ix].Name, job); err != nil && !apierrors.IsNotFound(err) { - defer utilruntime.HandleError(err) - klog.V(2).Infof("Failed to delete %v, job %q/%q deadline exceeded", pods[ix].Name, job.Namespace, job.Name) - errCh <- err +// deleteJobPods deletes the pods, returns the number of successful removals +// and any error. +func (jm *Controller) deleteJobPods(job *batch.Job, jobKey string, pods []*v1.Pod) (int32, error) { + errCh := make(chan error, len(pods)) + successfulDeletes := int32(len(pods)) + wg := sync.WaitGroup{} + wg.Add(len(pods)) + for i := range pods { + go func(pod *v1.Pod) { + defer wg.Done() + if err := jm.podControl.DeletePod(job.Namespace, pod.Name, job); err != nil { + // Decrement the expected number of deletes because the informer won't observe this deletion + if jobKey != "" { + jm.expectations.DeletionObserved(jobKey) + } + if !apierrors.IsNotFound(err) { + klog.V(2).Infof("Failed to delete Pod", "job", klog.KObj(job), "pod", klog.KObj(pod), "err", err) + atomic.AddInt32(&successfulDeletes, -1) + errCh <- err + utilruntime.HandleError(err) + } } - }(i) + }(pods[i]) } - wait.Wait() + wg.Wait() + return successfulDeletes, errorFromChannel(errCh) } // pastBackoffLimitOnFailure checks if container restartCounts sum exceeds BackoffLimit @@ -651,9 +703,11 @@ func pastBackoffLimitOnFailure(job *batch.Job, pods []*v1.Pod) bool { return result >= *job.Spec.BackoffLimit } -// pastActiveDeadline checks if job has ActiveDeadlineSeconds field set and if it is exceeded. +// pastActiveDeadline checks if job has ActiveDeadlineSeconds field set and if +// it is exceeded. If the job is currently suspended, the function will always +// return false. func pastActiveDeadline(job *batch.Job) bool { - if job.Spec.ActiveDeadlineSeconds == nil || job.Status.StartTime == nil { + if job.Spec.ActiveDeadlineSeconds == nil || job.Status.StartTime == nil || jobSuspended(job) { return false } now := metav1.Now() @@ -663,10 +717,10 @@ func pastActiveDeadline(job *batch.Job) bool { return duration >= allowedDuration } -func newCondition(conditionType batch.JobConditionType, reason, message string) batch.JobCondition { +func newCondition(conditionType batch.JobConditionType, status v1.ConditionStatus, reason, message string) batch.JobCondition { return batch.JobCondition{ Type: conditionType, - Status: v1.ConditionTrue, + Status: status, LastProbeTime: metav1.Now(), LastTransitionTime: metav1.Now(), Reason: reason, @@ -675,17 +729,22 @@ func newCondition(conditionType batch.JobConditionType, reason, message string) } // getStatus returns no of succeeded and failed pods running a job -func getStatus(pods []*v1.Pod) (succeeded, failed int32) { - succeeded = int32(filterPods(pods, v1.PodSucceeded)) - failed = int32(filterPods(pods, v1.PodFailed)) +func getStatus(job *batch.Job, pods []*v1.Pod) (succeeded, failed int32) { + succeeded = int32(countPodsByPhase(job, pods, v1.PodSucceeded)) + failed = int32(countPodsByPhase(job, pods, v1.PodFailed)) return } +// jobSuspended returns whether a Job is suspended while taking the feature +// gate into account. +func jobSuspended(job *batch.Job) bool { + return utilfeature.DefaultFeatureGate.Enabled(features.SuspendJob) && job.Spec.Suspend != nil && *job.Spec.Suspend +} + // manageJob is the core method responsible for managing the number of running // pods according to what is specified in the job.Spec. // Does NOT modify . -func (jm *Controller) manageJob(activePods []*v1.Pod, succeeded int32, job *batch.Job) (int32, error) { - var activeLock sync.Mutex +func (jm *Controller) manageJob(job *batch.Job, activePods []*v1.Pod, succeeded int32, allPods []*v1.Pod) (int32, error) { active := int32(len(activePods)) parallelism := *job.Spec.Parallelism jobKey, err := controller.KeyFunc(job) @@ -694,41 +753,31 @@ func (jm *Controller) manageJob(activePods []*v1.Pod, succeeded int32, job *batc return 0, nil } - var errCh chan error - if active > parallelism { - diff := active - parallelism - errCh = make(chan error, diff) - jm.expectations.ExpectDeletions(jobKey, int(diff)) - klog.V(4).Infof("Too many pods running job %q, need %d, deleting %d", jobKey, parallelism, diff) - // Sort the pods in the order such that not-ready < ready, unscheduled - // < scheduled, and pending < running. This ensures that we delete pods - // in the earlier stages whenever possible. - sort.Sort(controller.ActivePods(activePods)) - - active -= diff - wait := sync.WaitGroup{} - wait.Add(int(diff)) - for i := int32(0); i < diff; i++ { - go func(ix int32) { - defer wait.Done() - if err := jm.podControl.DeletePod(job.Namespace, activePods[ix].Name, job); err != nil { - // Decrement the expected number of deletes because the informer won't observe this deletion - jm.expectations.DeletionObserved(jobKey) - if !apierrors.IsNotFound(err) { - klog.V(2).Infof("Failed to delete %v, decremented expectations for job %q/%q", activePods[ix].Name, job.Namespace, job.Name) - activeLock.Lock() - active++ - activeLock.Unlock() - errCh <- err - utilruntime.HandleError(err) - } + if jobSuspended(job) { + klog.V(4).InfoS("Deleting all active pods in suspended job", "job", klog.KObj(job), "active", active) + podsToDelete := activePodsForRemoval(job, activePods, int(active)) + jm.expectations.ExpectDeletions(jobKey, len(podsToDelete)) + removed, err := jm.deleteJobPods(job, jobKey, podsToDelete) + active -= removed + return active, err + } - } - }(i) + rmAtLeast := active - parallelism + if rmAtLeast < 0 { + rmAtLeast = 0 + } + podsToDelete := activePodsForRemoval(job, activePods, int(rmAtLeast)) + if len(podsToDelete) > 0 { + jm.expectations.ExpectDeletions(jobKey, len(podsToDelete)) + klog.V(4).InfoS("Too many pods running for job", "job", klog.KObj(job), "deleted", rmAtLeast, "target", parallelism) + removed, err := jm.deleteJobPods(job, jobKey, podsToDelete) + active -= removed + if err != nil { + return active, err } - wait.Wait() + } - } else if active < parallelism { + if active < parallelism { wantActive := int32(0) if job.Spec.Completions == nil { // Job does not specify a number of completions. Therefore, number active @@ -755,13 +804,25 @@ func (jm *Controller) manageJob(activePods []*v1.Pod, succeeded int32, job *batc if diff == 0 { return active, nil } + jm.expectations.ExpectCreations(jobKey, int(diff)) - errCh = make(chan error, diff) + errCh := make(chan error, diff) klog.V(4).Infof("Too few pods running job %q, need %d, creating %d", jobKey, wantActive, diff) - active += diff wait := sync.WaitGroup{} + var indexesToAdd []int + if job.Spec.Completions != nil && isIndexedJob(job) { + indexesToAdd = firstPendingIndexes(allPods, int(diff), int(*job.Spec.Completions)) + diff = int32(len(indexesToAdd)) + } + active += diff + + podTemplate := job.Spec.Template.DeepCopy() + if isIndexedJob(job) { + addCompletionIndexEnvVariables(podTemplate) + } + // Batch the pod creates. Batch sizes start at SlowStartInitialBatchSize // and double with each successful iteration in a kind of "slow start". // This handles attempts to start large numbers of pods that would @@ -774,11 +835,21 @@ func (jm *Controller) manageJob(activePods []*v1.Pod, succeeded int32, job *batc errorCount := len(errCh) wait.Add(int(batchSize)) for i := int32(0); i < batchSize; i++ { + completionIndex := unknownCompletionIndex + if indexesToAdd != nil { + completionIndex = indexesToAdd[0] + indexesToAdd = indexesToAdd[1:] + } go func() { + template := podTemplate + if completionIndex != unknownCompletionIndex { + template = podTemplate.DeepCopy() + addCompletionIndexAnnotation(template, completionIndex) + } defer wait.Done() - err := jm.podControl.CreatePodsWithControllerRef(job.Namespace, &job.Spec.Template, job, metav1.NewControllerRef(job, controllerKind)) + err := jm.podControl.CreatePodsWithControllerRef(job.Namespace, template, job, metav1.NewControllerRef(job, controllerKind)) if err != nil { - if errors.HasStatusCause(err, v1.NamespaceTerminatingCause) { + if apierrors.HasStatusCause(err, v1.NamespaceTerminatingCause) { // If the namespace is being torn down, we can safely ignore // this error since all subsequent creations will fail. return @@ -789,9 +860,7 @@ func (jm *Controller) manageJob(activePods []*v1.Pod, succeeded int32, job *batc // Decrement the expected number of creates because the informer won't observe this pod klog.V(2).Infof("Failed creation, decrementing expectations for job %q/%q", job.Namespace, job.Name) jm.expectations.CreationObserved(jobKey) - activeLock.Lock() - active-- - activeLock.Unlock() + atomic.AddInt32(&active, -1) errCh <- err } }() @@ -812,20 +881,38 @@ func (jm *Controller) manageJob(activePods []*v1.Pod, succeeded int32, job *batc } diff -= batchSize } - } - - select { - case err := <-errCh: - // all errors have been reported before, we only need to inform the controller that there was an error and it should re-try this job once more next time. - if err != nil { + if err := errorFromChannel(errCh); err != nil { return active, err } - default: } return active, nil } +// activePodsForRemoval returns Pods that should be removed because there +// are too many pods running or, if this is an indexed job, there are repeated +// indexes or some pods don't have indexes. +// Sorts candidate pods in the order such that not-ready < ready, unscheduled +// < scheduled, and pending < running. This ensures that we delete pods +// in the earlier stages whenever possible. +func activePodsForRemoval(job *batch.Job, pods []*v1.Pod, rmAtLeast int) []*v1.Pod { + var rm, left []*v1.Pod + + if isIndexedJob(job) { + rm = make([]*v1.Pod, 0, rmAtLeast) + left = make([]*v1.Pod, 0, len(pods)-rmAtLeast) + rm, left = appendDuplicatedIndexPodsForRemoval(rm, left, pods) + } else { + left = pods + } + + if len(rm) < rmAtLeast { + sort.Sort(controller.ActivePods(left)) + rm = append(rm, left[:rmAtLeast-len(rm)]...) + } + return rm +} + func (jm *Controller) updateJobStatus(job *batch.Job) error { jobClient := jm.kubeClient.BatchV1().Jobs(job.Namespace) var err error @@ -864,13 +951,48 @@ func getBackoff(queue workqueue.RateLimitingInterface, key interface{}) time.Dur return calculated } -// filterPods returns pods based on their phase. -func filterPods(pods []*v1.Pod, phase v1.PodPhase) int { +// countPodsByPhase returns pods based on their phase. +func countPodsByPhase(job *batch.Job, pods []*v1.Pod, phase v1.PodPhase) int { result := 0 - for i := range pods { - if phase == pods[i].Status.Phase { + for _, p := range pods { + if phase == p.Status.Phase && (!isIndexedJob(job) || getCompletionIndex(p.Annotations) != unknownCompletionIndex) { result++ } } return result } + +func errorFromChannel(errCh <-chan error) error { + select { + case err := <-errCh: + return err + default: + } + return nil +} + +// ensureJobConditionStatus appends or updates an existing job condition of the +// given type with the given status value. Note that this function will not +// append to the conditions list if the new condition's status is false +// (because going from nothing to false is meaningless); it can, however, +// update the status condition to false. The function returns a bool to let the +// caller know if the list was changed (either appended or updated). +func ensureJobConditionStatus(list []batch.JobCondition, cType batch.JobConditionType, status v1.ConditionStatus, reason, message string) ([]batch.JobCondition, bool) { + for i := range list { + if list[i].Type == cType { + if list[i].Status != status || list[i].Reason != reason || list[i].Message != message { + list[i].Status = status + list[i].LastTransitionTime = metav1.Now() + list[i].Reason = reason + list[i].Message = message + return list, true + } + return list, false + } + } + // A condition with that type doesn't exist in the list. + if status != v1.ConditionFalse { + return append(list, newCondition(cType, status, reason, message)), true + } + return list, false +} diff --git a/vendor/k8s.io/kubernetes/pkg/controller/nodelifecycle/BUILD b/vendor/k8s.io/kubernetes/pkg/controller/nodelifecycle/BUILD deleted file mode 100644 index 4b6e8a869cdd..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/controller/nodelifecycle/BUILD +++ /dev/null @@ -1,100 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "metrics.go", - "node_lifecycle_controller.go", - ], - importpath = "k8s.io/kubernetes/pkg/controller/nodelifecycle", - visibility = ["//visibility:public"], - deps = [ - "//pkg/controller:go_default_library", - "//pkg/controller/nodelifecycle/scheduler:go_default_library", - "//pkg/controller/util/node:go_default_library", - "//pkg/features:go_default_library", - "//pkg/kubelet/apis:go_default_library", - "//pkg/util/node:go_default_library", - "//pkg/util/taints:go_default_library", - "//staging/src/k8s.io/api/coordination/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/informers/apps/v1:go_default_library", - "//staging/src/k8s.io/client-go/informers/coordination/v1:go_default_library", - "//staging/src/k8s.io/client-go/informers/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/listers/apps/v1:go_default_library", - "//staging/src/k8s.io/client-go/listers/coordination/v1:go_default_library", - "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/client-go/util/workqueue:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - "//staging/src/k8s.io/component-base/metrics/prometheus/ratelimiter:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["node_lifecycle_controller_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/controller:go_default_library", - "//pkg/controller/nodelifecycle/scheduler:go_default_library", - "//pkg/controller/testutil:go_default_library", - "//pkg/controller/util/node:go_default_library", - "//pkg/features:go_default_library", - "//pkg/kubelet/apis:go_default_library", - "//pkg/util/node:go_default_library", - "//pkg/util/taints:go_default_library", - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/coordination/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/informers/apps/v1:go_default_library", - "//staging/src/k8s.io/client-go/informers/coordination/v1:go_default_library", - "//staging/src/k8s.io/client-go/informers/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/controller/nodelifecycle/config:all-srcs", - "//pkg/controller/nodelifecycle/scheduler:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/controller/nodelifecycle/OWNERS b/vendor/k8s.io/kubernetes/pkg/controller/nodelifecycle/OWNERS index b1dae75b5c6f..fc1089bbb781 100644 --- a/vendor/k8s.io/kubernetes/pkg/controller/nodelifecycle/OWNERS +++ b/vendor/k8s.io/kubernetes/pkg/controller/nodelifecycle/OWNERS @@ -1,12 +1,13 @@ # See the OWNERS docs at https://go.k8s.io/owners approvers: -- gmarek - bowei - k82cn reviewers: -- gmarek - smarterclayton - ingvagabund - aveshagarwal - k82cn + +emeritus_approvers: +- gmarek diff --git a/vendor/k8s.io/kubernetes/pkg/controller/nodelifecycle/node_lifecycle_controller.go b/vendor/k8s.io/kubernetes/pkg/controller/nodelifecycle/node_lifecycle_controller.go index 33f4c35b59c6..2b2c2bf02cfa 100644 --- a/vendor/k8s.io/kubernetes/pkg/controller/nodelifecycle/node_lifecycle_controller.go +++ b/vendor/k8s.io/kubernetes/pkg/controller/nodelifecycle/node_lifecycle_controller.go @@ -24,7 +24,6 @@ package nodelifecycle import ( "context" "fmt" - "strings" "sync" "time" @@ -38,7 +37,6 @@ import ( "k8s.io/apimachinery/pkg/labels" utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/apimachinery/pkg/util/wait" - utilfeature "k8s.io/apiserver/pkg/util/feature" appsv1informers "k8s.io/client-go/informers/apps/v1" coordinformers "k8s.io/client-go/informers/coordination/v1" coreinformers "k8s.io/client-go/informers/core/v1" @@ -53,12 +51,11 @@ import ( "k8s.io/client-go/util/flowcontrol" "k8s.io/client-go/util/workqueue" "k8s.io/component-base/metrics/prometheus/ratelimiter" + utilnode "k8s.io/component-helpers/node/topology" + kubeletapis "k8s.io/kubelet/pkg/apis" "k8s.io/kubernetes/pkg/controller" "k8s.io/kubernetes/pkg/controller/nodelifecycle/scheduler" nodeutil "k8s.io/kubernetes/pkg/controller/util/node" - kubefeatures "k8s.io/kubernetes/pkg/features" - kubeletapis "k8s.io/kubernetes/pkg/kubelet/apis" - utilnode "k8s.io/kubernetes/pkg/util/node" taintutils "k8s.io/kubernetes/pkg/util/taints" ) @@ -949,37 +946,9 @@ func (nc *Controller) processNoTaintBaseEviction(node *v1.Node, observedReadyCon const labelNodeDisruptionExclusion = "node.kubernetes.io/exclude-disruption" func isNodeExcludedFromDisruptionChecks(node *v1.Node) bool { - // DEPRECATED: will be removed in 1.19 - if utilfeature.DefaultFeatureGate.Enabled(kubefeatures.LegacyNodeRoleBehavior) { - if legacyIsMasterNode(node.Name) { - return true - } - } - if utilfeature.DefaultFeatureGate.Enabled(kubefeatures.NodeDisruptionExclusion) { - if _, ok := node.Labels[labelNodeDisruptionExclusion]; ok { - return true - } - } - return false -} - -// legacyIsMasterNode returns true if given node is a registered master according -// to the logic historically used for this function. This code path is deprecated -// and the node disruption exclusion label should be used in the future. -// This code will not be allowed to update to use the node-role label, since -// node-roles may not be used for feature enablement. -// DEPRECATED: Will be removed in 1.19 -func legacyIsMasterNode(nodeName string) bool { - // We are trying to capture "master(-...)?$" regexp. - // However, using regexp.MatchString() results even in more than 35% - // of all space allocations in ControllerManager spent in this function. - // That's why we are trying to be a bit smarter. - if strings.HasSuffix(nodeName, "master") { + if _, ok := node.Labels[labelNodeDisruptionExclusion]; ok { return true } - if len(nodeName) >= 10 { - return strings.HasSuffix(nodeName[:len(nodeName)-3], "master-") - } return false } @@ -1477,13 +1446,13 @@ func (nc *Controller) markNodeForTainting(node *v1.Node, status v1.ConditionStat defer nc.evictorLock.Unlock() if status == v1.ConditionFalse { if !taintutils.TaintExists(node.Spec.Taints, NotReadyTaintTemplate) { - nc.zoneNoExecuteTainter[utilnode.GetZoneKey(node)].SetRemove(node.Name) + nc.zoneNoExecuteTainter[utilnode.GetZoneKey(node)].Remove(node.Name) } } if status == v1.ConditionUnknown { if !taintutils.TaintExists(node.Spec.Taints, UnreachableTaintTemplate) { - nc.zoneNoExecuteTainter[utilnode.GetZoneKey(node)].SetRemove(node.Name) + nc.zoneNoExecuteTainter[utilnode.GetZoneKey(node)].Remove(node.Name) } } diff --git a/vendor/k8s.io/kubernetes/pkg/controller/nodelifecycle/scheduler/BUILD b/vendor/k8s.io/kubernetes/pkg/controller/nodelifecycle/scheduler/BUILD deleted file mode 100644 index 6949d3866eff..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/controller/nodelifecycle/scheduler/BUILD +++ /dev/null @@ -1,65 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "rate_limited_queue.go", - "taint_manager.go", - "timed_workers.go", - ], - importpath = "k8s.io/kubernetes/pkg/controller/nodelifecycle/scheduler", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/core/helper:go_default_library", - "//pkg/apis/core/v1/helper:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/client-go/util/workqueue:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "rate_limited_queue_test.go", - "taint_manager_test.go", - "timed_workers_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/controller/testutil:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/controller/nodelifecycle/scheduler/rate_limited_queue.go b/vendor/k8s.io/kubernetes/pkg/controller/nodelifecycle/scheduler/rate_limited_queue.go index 26bcd29d8401..e343fa59667e 100644 --- a/vendor/k8s.io/kubernetes/pkg/controller/nodelifecycle/scheduler/rate_limited_queue.go +++ b/vendor/k8s.io/kubernetes/pkg/controller/nodelifecycle/scheduler/rate_limited_queue.go @@ -194,15 +194,6 @@ func (q *UniqueQueue) Clear() { } } -// SetRemove remove value from the set if value existed -func (q *UniqueQueue) SetRemove(value string) { - q.lock.Lock() - defer q.lock.Unlock() - if q.set.Has(value) { - q.set.Delete(value) - } -} - // RateLimitedTimedQueue is a unique item priority queue ordered by // the expected next time of execution. It is also rate limited. type RateLimitedTimedQueue struct { @@ -289,11 +280,6 @@ func (q *RateLimitedTimedQueue) Clear() { q.queue.Clear() } -// SetRemove remove value from the set of the queue -func (q *RateLimitedTimedQueue) SetRemove(value string) { - q.queue.SetRemove(value) -} - // SwapLimiter safely swaps current limiter for this queue with the // passed one if capacities or qps's differ. func (q *RateLimitedTimedQueue) SwapLimiter(newQPS float32) { diff --git a/vendor/k8s.io/kubernetes/pkg/controller/nodelifecycle/scheduler/taint_manager.go b/vendor/k8s.io/kubernetes/pkg/controller/nodelifecycle/scheduler/taint_manager.go index 8e38578a1a2a..e14157fd9a10 100644 --- a/vendor/k8s.io/kubernetes/pkg/controller/nodelifecycle/scheduler/taint_manager.go +++ b/vendor/k8s.io/kubernetes/pkg/controller/nodelifecycle/scheduler/taint_manager.go @@ -25,7 +25,7 @@ import ( "sync" "time" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" @@ -103,7 +103,7 @@ func deletePodHandler(c clientset.Interface, emitEventFunc func(types.Namespaced return func(args *WorkArgs) error { ns := args.NamespacedName.Namespace name := args.NamespacedName.Name - klog.V(0).Infof("NoExecuteTaintManager is deleting Pod: %v", args.NamespacedName.String()) + klog.V(0).InfoS("NoExecuteTaintManager is deleting pod", "pod", args.NamespacedName.String()) if emitEventFunc != nil { emitEventFunc(args.NamespacedName) } @@ -160,7 +160,7 @@ func NewNoExecuteTaintManager(c clientset.Interface, getPod GetPodFunc, getNode recorder := eventBroadcaster.NewRecorder(scheme.Scheme, v1.EventSource{Component: "taint-controller"}) eventBroadcaster.StartStructuredLogging(0) if c != nil { - klog.V(0).Infof("Sending events to api server.") + klog.V(0).InfoS("Sending events to api server") eventBroadcaster.StartRecordingToSink(&v1core.EventSinkImpl{Interface: c.CoreV1().Events("")}) } else { klog.Fatalf("kubeClient is nil when starting NodeController") @@ -184,7 +184,7 @@ func NewNoExecuteTaintManager(c clientset.Interface, getPod GetPodFunc, getNode // Run starts NoExecuteTaintManager which will run in loop until `stopCh` is closed. func (tc *NoExecuteTaintManager) Run(stopCh <-chan struct{}) { - klog.V(0).Infof("Starting NoExecuteTaintManager") + klog.V(0).InfoS("Starting NoExecuteTaintManager") for i := 0; i < UpdateWorkerSize; i++ { tc.nodeUpdateChannels = append(tc.nodeUpdateChannels, make(chan nodeUpdateItem, NodeUpdateChannelSize)) @@ -349,7 +349,7 @@ func (tc *NoExecuteTaintManager) processPodOnNode( } allTolerated, usedTolerations := v1helper.GetMatchingTolerations(taints, tolerations) if !allTolerated { - klog.V(2).Infof("Not all taints are tolerated after update for Pod %v on %v", podNamespacedName.String(), nodeName) + klog.V(2).InfoS("Not all taints are tolerated after update for pod on node", "pod", podNamespacedName.String(), "node", nodeName) // We're canceling scheduled work (if any), as we're going to delete the Pod right away. tc.cancelWorkWithEvent(podNamespacedName) tc.taintEvictionQueue.AddWork(NewWorkArgs(podNamespacedName.Name, podNamespacedName.Namespace), time.Now(), time.Now()) @@ -358,7 +358,7 @@ func (tc *NoExecuteTaintManager) processPodOnNode( minTolerationTime := getMinTolerationTime(usedTolerations) // getMinTolerationTime returns negative value to denote infinite toleration. if minTolerationTime < 0 { - klog.V(4).Infof("Current tolerations for %v tolerate forever, cancelling any scheduled deletion.", podNamespacedName.String()) + klog.V(4).InfoS("Current tolerations for pod tolerate forever, cancelling any scheduled deletion", "pod", podNamespacedName.String()) tc.cancelWorkWithEvent(podNamespacedName) return } @@ -382,7 +382,7 @@ func (tc *NoExecuteTaintManager) handlePodUpdate(podUpdate podUpdateItem) { if apierrors.IsNotFound(err) { // Delete podNamespacedName := types.NamespacedName{Namespace: podUpdate.podNamespace, Name: podUpdate.podName} - klog.V(4).Infof("Noticed pod deletion: %#v", podNamespacedName) + klog.V(4).InfoS("Noticed pod deletion", "pod", podNamespacedName) tc.cancelWorkWithEvent(podNamespacedName) return } @@ -397,7 +397,7 @@ func (tc *NoExecuteTaintManager) handlePodUpdate(podUpdate podUpdateItem) { // Create or Update podNamespacedName := types.NamespacedName{Namespace: pod.Namespace, Name: pod.Name} - klog.V(4).Infof("Noticed pod update: %#v", podNamespacedName) + klog.V(4).InfoS("Noticed pod update", "pod", podNamespacedName) nodeName := pod.Spec.NodeName if nodeName == "" { return @@ -421,7 +421,7 @@ func (tc *NoExecuteTaintManager) handleNodeUpdate(nodeUpdate nodeUpdateItem) { if err != nil { if apierrors.IsNotFound(err) { // Delete - klog.V(4).Infof("Noticed node deletion: %#v", nodeUpdate.nodeName) + klog.V(4).InfoS("Noticed node deletion", "node", nodeUpdate.nodeName) tc.taintedNodesLock.Lock() defer tc.taintedNodesLock.Unlock() delete(tc.taintedNodes, nodeUpdate.nodeName) @@ -432,12 +432,12 @@ func (tc *NoExecuteTaintManager) handleNodeUpdate(nodeUpdate nodeUpdateItem) { } // Create or Update - klog.V(4).Infof("Noticed node update: %#v", nodeUpdate) + klog.V(4).InfoS("Noticed node update", "node", nodeUpdate) taints := getNoExecuteTaints(node.Spec.Taints) func() { tc.taintedNodesLock.Lock() defer tc.taintedNodesLock.Unlock() - klog.V(4).Infof("Updating known taints on node %v: %v", node.Name, taints) + klog.V(4).InfoS("Updating known taints on node", "node", node.Name, "taints", taints) if len(taints) == 0 { delete(tc.taintedNodes, node.Name) } else { @@ -450,7 +450,7 @@ func (tc *NoExecuteTaintManager) handleNodeUpdate(nodeUpdate nodeUpdateItem) { // tc.PodUpdated which will use tc.taintedNodes to potentially delete delayed pods. pods, err := tc.getPodsAssignedToNode(node.Name) if err != nil { - klog.Errorf(err.Error()) + klog.ErrorS(err, "Failed to get pods assigned to node", "node", node.Name) return } if len(pods) == 0 { @@ -458,7 +458,7 @@ func (tc *NoExecuteTaintManager) handleNodeUpdate(nodeUpdate nodeUpdateItem) { } // Short circuit, to make this controller a bit faster. if len(taints) == 0 { - klog.V(4).Infof("All taints were removed from the Node %v. Cancelling all evictions...", node.Name) + klog.V(4).InfoS("All taints were removed from the node. Cancelling all evictions...", "node", node.Name) for i := range pods { tc.cancelWorkWithEvent(types.NamespacedName{Namespace: pods[i].Namespace, Name: pods[i].Name}) } diff --git a/vendor/k8s.io/kubernetes/pkg/controller/nodelifecycle/scheduler/timed_workers.go b/vendor/k8s.io/kubernetes/pkg/controller/nodelifecycle/scheduler/timed_workers.go index 2701e7ba23ea..de4d7c296264 100644 --- a/vendor/k8s.io/kubernetes/pkg/controller/nodelifecycle/scheduler/timed_workers.go +++ b/vendor/k8s.io/kubernetes/pkg/controller/nodelifecycle/scheduler/timed_workers.go @@ -21,6 +21,7 @@ import ( "time" "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/clock" "k8s.io/klog/v2" ) @@ -45,17 +46,17 @@ type TimedWorker struct { WorkItem *WorkArgs CreatedAt time.Time FireAt time.Time - Timer *time.Timer + Timer clock.Timer } -// CreateWorker creates a TimedWorker that will execute `f` not earlier than `fireAt`. -func CreateWorker(args *WorkArgs, createdAt time.Time, fireAt time.Time, f func(args *WorkArgs) error) *TimedWorker { +// createWorker creates a TimedWorker that will execute `f` not earlier than `fireAt`. +func createWorker(args *WorkArgs, createdAt time.Time, fireAt time.Time, f func(args *WorkArgs) error, clock clock.Clock) *TimedWorker { delay := fireAt.Sub(createdAt) if delay <= 0 { go f(args) return nil } - timer := time.AfterFunc(delay, func() { f(args) }) + timer := clock.AfterFunc(delay, func() { f(args) }) return &TimedWorker{ WorkItem: args, CreatedAt: createdAt, @@ -77,6 +78,7 @@ type TimedWorkerQueue struct { // map of workers keyed by string returned by 'KeyFromWorkArgs' from the given worker. workers map[string]*TimedWorker workFunc func(args *WorkArgs) error + clock clock.Clock } // CreateWorkerQueue creates a new TimedWorkerQueue for workers that will execute @@ -85,6 +87,7 @@ func CreateWorkerQueue(f func(args *WorkArgs) error) *TimedWorkerQueue { return &TimedWorkerQueue{ workers: make(map[string]*TimedWorker), workFunc: f, + clock: clock.RealClock{}, } } @@ -115,7 +118,7 @@ func (q *TimedWorkerQueue) AddWork(args *WorkArgs, createdAt time.Time, fireAt t klog.Warningf("Trying to add already existing work for %+v. Skipping.", args) return } - worker := CreateWorker(args, createdAt, fireAt, q.getWrappedWorkerFunc(key)) + worker := createWorker(args, createdAt, fireAt, q.getWrappedWorkerFunc(key), q.clock) q.workers[key] = worker } diff --git a/vendor/k8s.io/kubernetes/pkg/controller/replicaset/BUILD b/vendor/k8s.io/kubernetes/pkg/controller/replicaset/BUILD deleted file mode 100644 index 8e1b95aa4c42..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/controller/replicaset/BUILD +++ /dev/null @@ -1,94 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "replica_set.go", - "replica_set_utils.go", - ], - importpath = "k8s.io/kubernetes/pkg/controller/replicaset", - deps = [ - "//pkg/api/v1/pod:go_default_library", - "//pkg/controller:go_default_library", - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/informers/apps/v1:go_default_library", - "//staging/src/k8s.io/client-go/informers/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/apps/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/listers/apps/v1:go_default_library", - "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/client-go/util/workqueue:go_default_library", - "//staging/src/k8s.io/component-base/metrics/prometheus/ratelimiter:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/integer:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "init_test.go", - "replica_set_test.go", - "replica_set_utils_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/controller:go_default_library", - "//pkg/controller/testutil:go_default_library", - "//pkg/securitycontext:go_default_library", - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/util/testing:go_default_library", - "//staging/src/k8s.io/client-go/util/workqueue:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/controller/replicaset/config:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/controller/replicaset/replica_set.go b/vendor/k8s.io/kubernetes/pkg/controller/replicaset/replica_set.go index f52eab6ca924..cffa2df303ed 100644 --- a/vendor/k8s.io/kubernetes/pkg/controller/replicaset/replica_set.go +++ b/vendor/k8s.io/kubernetes/pkg/controller/replicaset/replica_set.go @@ -822,7 +822,7 @@ func getPodsRankedByRelatedPodsOnSameNode(podsToRank, relatedPods []*v1.Pod) con for i, pod := range podsToRank { ranks[i] = podsOnNode[pod.Spec.NodeName] } - return controller.ActivePodsWithRanks{Pods: podsToRank, Rank: ranks} + return controller.ActivePodsWithRanks{Pods: podsToRank, Rank: ranks, Now: metav1.Now()} } func getPodKeys(pods []*v1.Pod) []string { diff --git a/vendor/k8s.io/kubernetes/pkg/controller/replication/BUILD b/vendor/k8s.io/kubernetes/pkg/controller/replication/BUILD deleted file mode 100644 index 638601af579f..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/controller/replication/BUILD +++ /dev/null @@ -1,66 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "doc.go", - "replication_controller.go", - "replication_controller_utils.go", - ], - importpath = "k8s.io/kubernetes/pkg/controller/replication", - deps = [ - "//pkg/apis/apps:go_default_library", - "//pkg/apis/apps/v1:go_default_library", - "//pkg/apis/core/v1:go_default_library", - "//pkg/controller:go_default_library", - "//pkg/controller/replicaset:go_default_library", - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/informers/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/apps/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/listers/apps/v1:go_default_library", - "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["replication_controller_utils_test.go"], - embed = [":go_default_library"], - deps = ["//staging/src/k8s.io/api/core/v1:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/controller/replication/config:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/controller/replication/conversion.go b/vendor/k8s.io/kubernetes/pkg/controller/replication/conversion.go index 0214a4796784..161923aff1bb 100644 --- a/vendor/k8s.io/kubernetes/pkg/controller/replication/conversion.go +++ b/vendor/k8s.io/kubernetes/pkg/controller/replication/conversion.go @@ -36,6 +36,7 @@ import ( "k8s.io/apimachinery/pkg/types" utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/apimachinery/pkg/watch" + appsv1apply "k8s.io/client-go/applyconfigurations/apps/v1" coreinformers "k8s.io/client-go/informers/core/v1" clientset "k8s.io/client-go/kubernetes" appsv1client "k8s.io/client-go/kubernetes/typed/apps/v1" @@ -247,6 +248,14 @@ func (c conversionClient) Patch(ctx context.Context, name string, pt types.Patch return nil, errors.New("Patch() is not implemented for conversionClient") } +func (c conversionClient) Apply(ctx context.Context, rs *appsv1apply.ReplicaSetApplyConfiguration, opts metav1.ApplyOptions) (*apps.ReplicaSet, error) { + return nil, errors.New("Apply() is not implemented for conversionClient") +} + +func (c conversionClient) ApplyStatus(ctx context.Context, rs *appsv1apply.ReplicaSetApplyConfiguration, opts metav1.ApplyOptions) (*apps.ReplicaSet, error) { + return nil, errors.New("ApplyStatus() is not implemented for conversionClient") +} + func (c conversionClient) GetScale(ctx context.Context, name string, options metav1.GetOptions) (result *autoscalingv1.Scale, err error) { // This is not used by RSC. return nil, errors.New("GetScale() is not implemented for conversionClient") diff --git a/vendor/k8s.io/kubernetes/pkg/controller/serviceaccount/BUILD b/vendor/k8s.io/kubernetes/pkg/controller/serviceaccount/BUILD deleted file mode 100644 index addd82bbcdb3..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/controller/serviceaccount/BUILD +++ /dev/null @@ -1,81 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "serviceaccounts_controller.go", - "tokengetter.go", - "tokens_controller.go", - ], - importpath = "k8s.io/kubernetes/pkg/controller/serviceaccount", - deps = [ - "//pkg/registry/core/secret:go_default_library", - "//pkg/serviceaccount:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/serviceaccount:go_default_library", - "//staging/src/k8s.io/client-go/informers/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/util/retry:go_default_library", - "//staging/src/k8s.io/client-go/util/workqueue:go_default_library", - "//staging/src/k8s.io/component-base/metrics/prometheus/ratelimiter:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "serviceaccounts_controller_test.go", - "tokens_controller_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/controller:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/rand:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - "//vendor/github.com/davecgh/go-spew/spew:go_default_library", - "//vendor/gopkg.in/square/go-jose.v2/jwt:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/controller/serviceaccount/config:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/controller/util/node/BUILD b/vendor/k8s.io/kubernetes/pkg/controller/util/node/BUILD deleted file mode 100644 index 48d28ec1c49c..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/controller/util/node/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["controller_utils.go"], - importpath = "k8s.io/kubernetes/pkg/controller/util/node", - visibility = ["//visibility:public"], - deps = [ - "//pkg/api/v1/pod:go_default_library", - "//pkg/controller:go_default_library", - "//pkg/kubelet/util/format:go_default_library", - "//pkg/util/node:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/apps/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/controller/volume/events/BUILD b/vendor/k8s.io/kubernetes/pkg/controller/volume/events/BUILD deleted file mode 100644 index 73dc4c3f4406..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/controller/volume/events/BUILD +++ /dev/null @@ -1,25 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["event.go"], - importpath = "k8s.io/kubernetes/pkg/controller/volume/events", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/util/BUILD b/vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/util/BUILD deleted file mode 100644 index 041d10037663..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/util/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["util.go"], - importpath = "k8s.io/kubernetes/pkg/controller/volume/persistentvolume/util", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/core/v1/helper:go_default_library", - "//pkg/features:go_default_library", - "//pkg/volume/util:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/storage/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/listers/storage/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/reference:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/util/util.go b/vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/util/util.go index a8fd16d26d38..844cd6cdae16 100644 --- a/vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/util/util.go +++ b/vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/util/util.go @@ -29,7 +29,7 @@ import ( "k8s.io/client-go/kubernetes/scheme" storagelisters "k8s.io/client-go/listers/storage/v1" "k8s.io/client-go/tools/reference" - v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper" + storagehelpers "k8s.io/component-helpers/storage/volume" "k8s.io/kubernetes/pkg/features" volumeutil "k8s.io/kubernetes/pkg/volume/util" ) @@ -89,7 +89,7 @@ func IsDelayBindingProvisioning(claim *v1.PersistentVolumeClaim) bool { // IsDelayBindingMode checks if claim is in delay binding mode. func IsDelayBindingMode(claim *v1.PersistentVolumeClaim, classLister storagelisters.StorageClassLister) (bool, error) { - className := v1helper.GetPersistentVolumeClaimClass(claim) + className := storagehelpers.GetPersistentVolumeClaimClass(claim) if className == "" { return false, nil } @@ -188,7 +188,7 @@ func FindMatchingVolume( var smallestVolume *v1.PersistentVolume var smallestVolumeQty resource.Quantity requestedQty := claim.Spec.Resources.Requests[v1.ResourceName(v1.ResourceStorage)] - requestedClass := v1helper.GetPersistentVolumeClaimClass(claim) + requestedClass := storagehelpers.GetPersistentVolumeClaimClass(claim) var selector labels.Selector if claim.Spec.Selector != nil { @@ -275,7 +275,7 @@ func FindMatchingVolume( } else if selector != nil && !selector.Matches(labels.Set(volume.Labels)) { continue } - if v1helper.GetPersistentVolumeClass(volume) != requestedClass { + if storagehelpers.GetPersistentVolumeClass(volume) != requestedClass { continue } if !nodeAffinityValid { diff --git a/vendor/k8s.io/kubernetes/pkg/controller/volume/scheduling/BUILD b/vendor/k8s.io/kubernetes/pkg/controller/volume/scheduling/BUILD deleted file mode 100644 index 6525c355ecd9..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/controller/volume/scheduling/BUILD +++ /dev/null @@ -1,92 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "scheduler_assume_cache.go", - "scheduler_binder.go", - "scheduler_binder_fake.go", - ], - importpath = "k8s.io/kubernetes/pkg/controller/volume/scheduling", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/core/v1/helper:go_default_library", - "//pkg/controller/volume/persistentvolume/util:go_default_library", - "//pkg/controller/volume/scheduling/metrics:go_default_library", - "//pkg/features:go_default_library", - "//pkg/volume/util:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/storage/v1:go_default_library", - "//staging/src/k8s.io/api/storage/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/informers/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/informers/storage/v1:go_default_library", - "//staging/src/k8s.io/client-go/informers/storage/v1alpha1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/listers/storage/v1:go_default_library", - "//staging/src/k8s.io/client-go/listers/storage/v1alpha1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/csi-translation-lib:go_default_library", - "//staging/src/k8s.io/csi-translation-lib/plugins:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "scheduler_assume_cache_test.go", - "scheduler_binder_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/controller:go_default_library", - "//pkg/controller/volume/persistentvolume/testing:go_default_library", - "//pkg/controller/volume/persistentvolume/util:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/storage/v1:go_default_library", - "//staging/src/k8s.io/api/storage/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/informers/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/informers/storage/v1:go_default_library", - "//staging/src/k8s.io/client-go/informers/storage/v1alpha1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/controller/volume/scheduling/metrics:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/controller/volume/scheduling/metrics/BUILD b/vendor/k8s.io/kubernetes/pkg/controller/volume/scheduling/metrics/BUILD deleted file mode 100644 index 745aedfbe2ca..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/controller/volume/scheduling/metrics/BUILD +++ /dev/null @@ -1,26 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["metrics.go"], - importpath = "k8s.io/kubernetes/pkg/controller/volume/scheduling/metrics", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/controller/volume/scheduling/scheduler_assume_cache.go b/vendor/k8s.io/kubernetes/pkg/controller/volume/scheduling/scheduler_assume_cache.go index 8c4cd0c8eeb6..2eddbd4d83b2 100644 --- a/vendor/k8s.io/kubernetes/pkg/controller/volume/scheduling/scheduler_assume_cache.go +++ b/vendor/k8s.io/kubernetes/pkg/controller/volume/scheduling/scheduler_assume_cache.go @@ -18,6 +18,7 @@ package scheduling import ( "fmt" + storagehelpers "k8s.io/component-helpers/storage/volume" "strconv" "sync" @@ -26,7 +27,6 @@ import ( v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/meta" "k8s.io/client-go/tools/cache" - v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper" ) // AssumeCache is a cache on top of the informer that allows for updating @@ -358,7 +358,7 @@ type pvAssumeCache struct { func pvStorageClassIndexFunc(obj interface{}) ([]string, error) { if pv, ok := obj.(*v1.PersistentVolume); ok { - return []string{v1helper.GetPersistentVolumeClass(pv)}, nil + return []string{storagehelpers.GetPersistentVolumeClass(pv)}, nil } return []string{""}, fmt.Errorf("object is not a v1.PersistentVolume: %v", obj) } diff --git a/vendor/k8s.io/kubernetes/pkg/controller/volume/scheduling/scheduler_binder.go b/vendor/k8s.io/kubernetes/pkg/controller/volume/scheduling/scheduler_binder.go index 25ffc05b355a..4a5dbad8ac7a 100644 --- a/vendor/k8s.io/kubernetes/pkg/controller/volume/scheduling/scheduler_binder.go +++ b/vendor/k8s.io/kubernetes/pkg/controller/volume/scheduling/scheduler_binder.go @@ -25,7 +25,7 @@ import ( v1 "k8s.io/api/core/v1" storagev1 "k8s.io/api/storage/v1" - storagev1alpha1 "k8s.io/api/storage/v1alpha1" + storagev1beta1 "k8s.io/api/storage/v1beta1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" @@ -35,11 +35,12 @@ import ( utilfeature "k8s.io/apiserver/pkg/util/feature" coreinformers "k8s.io/client-go/informers/core/v1" storageinformers "k8s.io/client-go/informers/storage/v1" - storageinformersv1alpha1 "k8s.io/client-go/informers/storage/v1alpha1" + storageinformersv1beta1 "k8s.io/client-go/informers/storage/v1beta1" clientset "k8s.io/client-go/kubernetes" corelisters "k8s.io/client-go/listers/core/v1" storagelisters "k8s.io/client-go/listers/storage/v1" - storagelistersv1alpha1 "k8s.io/client-go/listers/storage/v1alpha1" + storagelistersv1beta1 "k8s.io/client-go/listers/storage/v1beta1" + storagehelpers "k8s.io/component-helpers/storage/volume" csitrans "k8s.io/csi-translation-lib" csiplugins "k8s.io/csi-translation-lib/plugins" "k8s.io/klog/v2" @@ -81,6 +82,28 @@ type BindingInfo struct { pv *v1.PersistentVolume } +// StorageClassName returns the name of the storage class. +func (b *BindingInfo) StorageClassName() string { + return b.pv.Spec.StorageClassName +} + +// StorageResource represents storage resource. +type StorageResource struct { + Requested int64 + Capacity int64 +} + +// StorageResource returns storage resource. +func (b *BindingInfo) StorageResource() *StorageResource { + // both fields are mandatory + requestedQty := b.pvc.Spec.Resources.Requests[v1.ResourceName(v1.ResourceStorage)] + capacityQty := b.pv.Spec.Capacity[v1.ResourceName(v1.ResourceStorage)] + return &StorageResource{ + Requested: requestedQty.Value(), + Capacity: capacityQty.Value(), + } +} + // PodVolumes holds pod's volumes information used in volume scheduling. type PodVolumes struct { // StaticBindings are binding decisions for PVCs which can be bound to @@ -187,7 +210,7 @@ type volumeBinder struct { capacityCheckEnabled bool csiDriverLister storagelisters.CSIDriverLister - csiStorageCapacityLister storagelistersv1alpha1.CSIStorageCapacityLister + csiStorageCapacityLister storagelistersv1beta1.CSIStorageCapacityLister } // CapacityCheck contains additional parameters for NewVolumeBinder that @@ -195,7 +218,7 @@ type volumeBinder struct { // capacity is desired. type CapacityCheck struct { CSIDriverInformer storageinformers.CSIDriverInformer - CSIStorageCapacityInformer storageinformersv1alpha1.CSIStorageCapacityInformer + CSIStorageCapacityInformer storageinformersv1beta1.CSIStorageCapacityInformer } // NewVolumeBinder sets up all the caches needed for the scheduler to make volume binding decisions. @@ -509,7 +532,7 @@ func (b *volumeBinder) bindAPIUpdate(podName string, bindings []*BindingInfo, cl } // Update claims objects to trigger volume provisioning. Let the PV controller take care of the rest - // PV controller is expect to signal back by removing related annotations if actual provisioning fails + // PV controller is expected to signal back by removing related annotations if actual provisioning fails for i, claim = range claimsToProvision { klog.V(5).Infof("bindAPIUpdate: Pod %q, PVC %q", podName, getPVCName(claim)) newClaim, err := b.kubeClient.CoreV1().PersistentVolumeClaims(claim.Namespace).Update(context.TODO(), claim, metav1.UpdateOptions{}) @@ -673,8 +696,13 @@ func (b *volumeBinder) isVolumeBound(pod *v1.Pod, vol *v1.Volume) (bound bool, p switch { case vol.PersistentVolumeClaim != nil: pvcName = vol.PersistentVolumeClaim.ClaimName - case vol.Ephemeral != nil && - utilfeature.DefaultFeatureGate.Enabled(features.GenericEphemeralVolume): + case vol.Ephemeral != nil: + if !utilfeature.DefaultFeatureGate.Enabled(features.GenericEphemeralVolume) { + return false, nil, fmt.Errorf( + "volume %s is a generic ephemeral volume, but that feature is disabled in kube-scheduler", + vol.Name, + ) + } // Generic ephemeral inline volumes also use a PVC, // just with a computed name, and... pvcName = pod.Name + "-" + vol.Name @@ -815,7 +843,7 @@ func (b *volumeBinder) findMatchingVolumes(pod *v1.Pod, claimsToBind []*v1.Persi for _, pvc := range claimsToBind { // Get storage class name from each PVC - storageClassName := v1helper.GetPersistentVolumeClaimClass(pvc) + storageClassName := storagehelpers.GetPersistentVolumeClaimClass(pvc) allPVs := b.pvCache.ListPVs(storageClassName) pvcName := getPVCName(pvc) @@ -855,7 +883,7 @@ func (b *volumeBinder) checkVolumeProvisions(pod *v1.Pod, claimsToProvision []*v // fails or we encounter an error. for _, claim := range claimsToProvision { pvcName := getPVCName(claim) - className := v1helper.GetPersistentVolumeClaimClass(claim) + className := storagehelpers.GetPersistentVolumeClaimClass(claim) if className == "" { return false, false, nil, fmt.Errorf("no class for claim %q", pvcName) } @@ -946,8 +974,7 @@ func (b *volumeBinder) hasEnoughCapacity(provisioner string, claim *v1.Persisten sizeInBytes := quantity.Value() for _, capacity := range capacities { if capacity.StorageClassName == storageClass.Name && - capacity.Capacity != nil && - capacity.Capacity.Value() >= sizeInBytes && + capacitySufficient(capacity, sizeInBytes) && b.nodeHasAccess(node, capacity) { // Enough capacity found. return true, nil @@ -961,7 +988,16 @@ func (b *volumeBinder) hasEnoughCapacity(provisioner string, claim *v1.Persisten return false, nil } -func (b *volumeBinder) nodeHasAccess(node *v1.Node, capacity *storagev1alpha1.CSIStorageCapacity) bool { +func capacitySufficient(capacity *storagev1beta1.CSIStorageCapacity, sizeInBytes int64) bool { + limit := capacity.Capacity + if capacity.MaximumVolumeSize != nil { + // Prefer MaximumVolumeSize if available, it is more precise. + limit = capacity.MaximumVolumeSize + } + return limit != nil && limit.Value() >= sizeInBytes +} + +func (b *volumeBinder) nodeHasAccess(node *v1.Node, capacity *storagev1beta1.CSIStorageCapacity) bool { if capacity.NodeTopology == nil { // Unavailable return false diff --git a/vendor/k8s.io/kubernetes/pkg/controlplane/BUILD b/vendor/k8s.io/kubernetes/pkg/controlplane/BUILD deleted file mode 100644 index 8ac0f0f2c6cc..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/controlplane/BUILD +++ /dev/null @@ -1,226 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "client_util.go", - "controller.go", - "deleted_kinds.go", - "doc.go", - "import_known_versions.go", - "instance.go", - "services.go", - ], - importpath = "k8s.io/kubernetes/pkg/controlplane", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/admission/install:go_default_library", - "//pkg/apis/admissionregistration/install:go_default_library", - "//pkg/apis/apiserverinternal/install:go_default_library", - "//pkg/apis/apps/install:go_default_library", - "//pkg/apis/authentication/install:go_default_library", - "//pkg/apis/authorization/install:go_default_library", - "//pkg/apis/autoscaling/install:go_default_library", - "//pkg/apis/batch/install:go_default_library", - "//pkg/apis/certificates/install:go_default_library", - "//pkg/apis/coordination/install:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/install:go_default_library", - "//pkg/apis/discovery/install:go_default_library", - "//pkg/apis/events/install:go_default_library", - "//pkg/apis/extensions/install:go_default_library", - "//pkg/apis/flowcontrol/install:go_default_library", - "//pkg/apis/flowcontrol/v1beta1:go_default_library", - "//pkg/apis/imagepolicy/install:go_default_library", - "//pkg/apis/networking/install:go_default_library", - "//pkg/apis/node/install:go_default_library", - "//pkg/apis/policy/install:go_default_library", - "//pkg/apis/rbac/install:go_default_library", - "//pkg/apis/scheduling/install:go_default_library", - "//pkg/apis/storage/install:go_default_library", - "//pkg/controlplane/controller/apiserverleasegc:go_default_library", - "//pkg/controlplane/controller/clusterauthenticationtrust:go_default_library", - "//pkg/controlplane/reconcilers:go_default_library", - "//pkg/controlplane/tunneler:go_default_library", - "//pkg/features:go_default_library", - "//pkg/kubeapiserver/options:go_default_library", - "//pkg/kubelet/client:go_default_library", - "//pkg/registry/admissionregistration/rest:go_default_library", - "//pkg/registry/apiserverinternal/rest:go_default_library", - "//pkg/registry/apps/rest:go_default_library", - "//pkg/registry/authentication/rest:go_default_library", - "//pkg/registry/authorization/rest:go_default_library", - "//pkg/registry/autoscaling/rest:go_default_library", - "//pkg/registry/batch/rest:go_default_library", - "//pkg/registry/certificates/rest:go_default_library", - "//pkg/registry/coordination/rest:go_default_library", - "//pkg/registry/core/rangeallocation:go_default_library", - "//pkg/registry/core/rest:go_default_library", - "//pkg/registry/core/service/ipallocator/controller:go_default_library", - "//pkg/registry/core/service/portallocator/controller:go_default_library", - "//pkg/registry/discovery/rest:go_default_library", - "//pkg/registry/events/rest:go_default_library", - "//pkg/registry/extensions/rest:go_default_library", - "//pkg/registry/flowcontrol/rest:go_default_library", - "//pkg/registry/networking/rest:go_default_library", - "//pkg/registry/node/rest:go_default_library", - "//pkg/registry/policy/rest:go_default_library", - "//pkg/registry/rbac/rest:go_default_library", - "//pkg/registry/scheduling/rest:go_default_library", - "//pkg/registry/storage/rest:go_default_library", - "//pkg/routes:go_default_library", - "//pkg/serviceaccount:go_default_library", - "//pkg/util/async:go_default_library", - "//pkg/util/node:go_default_library", - "//staging/src/k8s.io/api/admissionregistration/v1:go_default_library", - "//staging/src/k8s.io/api/admissionregistration/v1beta1:go_default_library", - "//staging/src/k8s.io/api/apiserverinternal/v1alpha1:go_default_library", - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/authentication/v1:go_default_library", - "//staging/src/k8s.io/api/authentication/v1beta1:go_default_library", - "//staging/src/k8s.io/api/authorization/v1:go_default_library", - "//staging/src/k8s.io/api/authorization/v1beta1:go_default_library", - "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", - "//staging/src/k8s.io/api/autoscaling/v2beta1:go_default_library", - "//staging/src/k8s.io/api/autoscaling/v2beta2:go_default_library", - "//staging/src/k8s.io/api/batch/v1:go_default_library", - "//staging/src/k8s.io/api/batch/v1beta1:go_default_library", - "//staging/src/k8s.io/api/batch/v2alpha1:go_default_library", - "//staging/src/k8s.io/api/certificates/v1:go_default_library", - "//staging/src/k8s.io/api/certificates/v1beta1:go_default_library", - "//staging/src/k8s.io/api/coordination/v1:go_default_library", - "//staging/src/k8s.io/api/coordination/v1beta1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/discovery/v1beta1:go_default_library", - "//staging/src/k8s.io/api/events/v1:go_default_library", - "//staging/src/k8s.io/api/events/v1beta1:go_default_library", - "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", - "//staging/src/k8s.io/api/flowcontrol/v1alpha1:go_default_library", - "//staging/src/k8s.io/api/networking/v1:go_default_library", - "//staging/src/k8s.io/api/networking/v1beta1:go_default_library", - "//staging/src/k8s.io/api/node/v1:go_default_library", - "//staging/src/k8s.io/api/node/v1alpha1:go_default_library", - "//staging/src/k8s.io/api/node/v1beta1:go_default_library", - "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/api/rbac/v1:go_default_library", - "//staging/src/k8s.io/api/rbac/v1alpha1:go_default_library", - "//staging/src/k8s.io/api/rbac/v1beta1:go_default_library", - "//staging/src/k8s.io/api/scheduling/v1:go_default_library", - "//staging/src/k8s.io/api/scheduling/v1alpha1:go_default_library", - "//staging/src/k8s.io/api/scheduling/v1beta1:go_default_library", - "//staging/src/k8s.io/api/storage/v1:go_default_library", - "//staging/src/k8s.io/api/storage/v1alpha1:go_default_library", - "//staging/src/k8s.io/api/storage/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/version:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/discovery:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/features:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/dynamiccertificates:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/healthz:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/storage:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/storagebackend/factory:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/discovery/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/component-base/version:go_default_library", - "//staging/src/k8s.io/component-helpers/apimachinery/lease:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/integer:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], -) - -go_test( - name = "go_default_test", - size = "medium", - timeout = "long", - srcs = [ - "controller_test.go", - "deleted_kinds_test.go", - "import_known_versions_test.go", - "instance_openapi_test.go", - "instance_test.go", - ], - embed = [":go_default_library"], - race = "off", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/batch:go_default_library", - "//pkg/apis/networking:go_default_library", - "//pkg/apis/storage:go_default_library", - "//pkg/controlplane/reconcilers:go_default_library", - "//pkg/controlplane/storageversionhashdata:go_default_library", - "//pkg/generated/openapi:go_default_library", - "//pkg/kubelet/client:go_default_library", - "//pkg/registry/certificates/rest:go_default_library", - "//pkg/registry/core/rest:go_default_library", - "//pkg/registry/registrytest:go_default_library", - "//staging/src/k8s.io/api/certificates/v1beta1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/discovery/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/apitesting/naming:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/version:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizerfactory:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/openapi:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/options:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/resourceconfig:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/storage:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/testing:go_default_library", - "//staging/src/k8s.io/client-go/discovery:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - "//staging/src/k8s.io/component-base/version:go_default_library", - "//vendor/github.com/davecgh/go-spew/spew:go_default_library", - "//vendor/github.com/go-openapi/loads:go_default_library", - "//vendor/github.com/go-openapi/spec:go_default_library", - "//vendor/github.com/go-openapi/strfmt:go_default_library", - "//vendor/github.com/go-openapi/validate:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/controlplane/controller/apiserverleasegc:all-srcs", - "//pkg/controlplane/controller/clusterauthenticationtrust:all-srcs", - "//pkg/controlplane/controller/crdregistration:all-srcs", - "//pkg/controlplane/reconcilers:all-srcs", - "//pkg/controlplane/storageversionhashdata:all-srcs", - "//pkg/controlplane/tunneler:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/controlplane/OWNERS b/vendor/k8s.io/kubernetes/pkg/controlplane/OWNERS index 77950e3559ad..2f684e4b4651 100644 --- a/vendor/k8s.io/kubernetes/pkg/controlplane/OWNERS +++ b/vendor/k8s.io/kubernetes/pkg/controlplane/OWNERS @@ -5,7 +5,6 @@ approvers: - derekwaynecarr - lavalamp - mikedanese -- nikhiljindal - sttts - wojtek-t reviewers: @@ -19,8 +18,6 @@ reviewers: - caesarxuchao - mikedanese - liggitt -- nikhiljindal -- gmarek - erictune - davidopp - pmorie @@ -35,8 +32,10 @@ reviewers: - timothysc - soltysh - piosz -- madhusudancs - hongchaodeng - enj labels: - sig/api-machinery + +emeritus_approvers: +- nikhiljindal diff --git a/vendor/k8s.io/kubernetes/pkg/controlplane/controller/apiserverleasegc/BUILD b/vendor/k8s.io/kubernetes/pkg/controlplane/controller/apiserverleasegc/BUILD deleted file mode 100644 index ad19c1eb723c..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/controlplane/controller/apiserverleasegc/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["gc_controller.go"], - importpath = "k8s.io/kubernetes/pkg/controlplane/controller/apiserverleasegc", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/coordination/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/informers/coordination/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/coordination/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/controlplane/controller/clusterauthenticationtrust/BUILD b/vendor/k8s.io/kubernetes/pkg/controlplane/controller/clusterauthenticationtrust/BUILD deleted file mode 100644 index 88acd818952e..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/controlplane/controller/clusterauthenticationtrust/BUILD +++ /dev/null @@ -1,63 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["cluster_authentication_trust_controller.go"], - importpath = "k8s.io/kubernetes/pkg/controlplane/controller/clusterauthenticationtrust", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/request/headerrequest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/dynamiccertificates:go_default_library", - "//staging/src/k8s.io/client-go/informers/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/util/cert:go_default_library", - "//staging/src/k8s.io/client-go/util/workqueue:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["cluster_authentication_trust_controller_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/request/headerrequest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/dynamiccertificates:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//vendor/github.com/davecgh/go-spew/spew:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/controlplane/controller/crdregistration/BUILD b/vendor/k8s.io/kubernetes/pkg/controlplane/controller/crdregistration/BUILD deleted file mode 100644 index 16f7d212a5cf..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/controlplane/controller/crdregistration/BUILD +++ /dev/null @@ -1,54 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["crdregistration_controller.go"], - importpath = "k8s.io/kubernetes/pkg/controlplane/controller/crdregistration", - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/util/workqueue:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["crdregistration_controller_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/controlplane/deleted_kinds.go b/vendor/k8s.io/kubernetes/pkg/controlplane/deleted_kinds.go deleted file mode 100644 index f9604c8761fb..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/controlplane/deleted_kinds.go +++ /dev/null @@ -1,167 +0,0 @@ -/* -Copyright 2020 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package controlplane - -import ( - "os" - "strconv" - "strings" - - "k8s.io/apimachinery/pkg/util/sets" - apimachineryversion "k8s.io/apimachinery/pkg/version" - "k8s.io/apiserver/pkg/registry/rest" - "k8s.io/klog/v2" -) - -// resourceExpirationEvaluator holds info for deciding if a particular rest.Storage needs to excluded from the API -type resourceExpirationEvaluator struct { - currentMajor int - currentMinor int - isAlpha bool - // This is usually set for testing for which tests need to be removed. This prevent insta-failing CI. - // Set KUBE_APISERVER_STRICT_REMOVED_API_HANDLING_IN_ALPHA to see what will be removed when we tag beta - strictRemovedHandlingInAlpha bool - // This is usually set by a cluster-admin looking for a short-term escape hatch after something bad happened. - // This should be made a flag before merge - // Set KUBE_APISERVER_SERVE_REMOVED_APIS_FOR_ONE_RELEASE to prevent removing APIs for one more release. - serveRemovedAPIsOneMoreRelease bool -} - -func newResourceExpirationEvaluator(currentVersion apimachineryversion.Info) (*resourceExpirationEvaluator, error) { - ret := &resourceExpirationEvaluator{} - if len(currentVersion.Major) > 0 { - currentMajor64, err := strconv.ParseInt(currentVersion.Major, 10, 32) - if err != nil { - return nil, err - } - ret.currentMajor = int(currentMajor64) - } - if len(currentVersion.Minor) > 0 { - // split the "normal" + and - for semver stuff - minorString := strings.Split(currentVersion.Minor, "+")[0] - minorString = strings.Split(minorString, "-")[0] - minorString = strings.Split(minorString, ".")[0] - currentMinor64, err := strconv.ParseInt(minorString, 10, 32) - if err != nil { - return nil, err - } - ret.currentMinor = int(currentMinor64) - } - - ret.isAlpha = strings.Contains(currentVersion.GitVersion, "alpha") - - if envString, ok := os.LookupEnv("KUBE_APISERVER_STRICT_REMOVED_API_HANDLING_IN_ALPHA"); !ok { - // do nothing - } else if envBool, err := strconv.ParseBool(envString); err != nil { - return nil, err - } else { - ret.strictRemovedHandlingInAlpha = envBool - } - if envString, ok := os.LookupEnv("KUBE_APISERVER_SERVE_REMOVED_APIS_FOR_ONE_RELEASE"); !ok { - // do nothing - } else if envBool, err := strconv.ParseBool(envString); err != nil { - return nil, err - } else { - ret.serveRemovedAPIsOneMoreRelease = envBool - } - - return ret, nil -} - -func (e *resourceExpirationEvaluator) shouldServe(resourceServingInfo rest.Storage) bool { - versionedPtr := resourceServingInfo.New() - removed, ok := versionedPtr.(removedInterface) - if !ok { - return true - } - majorRemoved, minorRemoved := removed.APILifecycleRemoved() - if e.currentMajor < majorRemoved { - return true - } - if e.currentMajor > majorRemoved { - return false - } - if e.currentMinor < minorRemoved { - return true - } - if e.currentMinor > minorRemoved { - return false - } - // at this point major and minor are equal, so this API should be removed when the current release GAs. - // If this is an alpha tag, don't remove by default, but allow the option. - // If the cluster-admin has requested serving one more release, allow it. - if e.isAlpha && e.strictRemovedHandlingInAlpha { // don't serve in alpha if we want strict handling - return false - } - if e.isAlpha { // alphas are allowed to continue serving expired betas while we clean up the test - return true - } - if e.serveRemovedAPIsOneMoreRelease { // cluster-admins are allowed to kick the can one release down the road - return true - } - return false -} - -type removedInterface interface { - APILifecycleRemoved() (major, minor int) -} - -// removeDeletedKinds inspects the storage map and modifies it in place by removing storage for kinds that have been deleted. -// versionedResourcesStorageMap mirrors the field on APIGroupInfo, it's a map from version to resource to the storage. -func (e *resourceExpirationEvaluator) removeDeletedKinds(groupName string, versionedResourcesStorageMap map[string]map[string]rest.Storage) { - versionsToRemove := sets.NewString() - for apiVersion, versionToResource := range versionedResourcesStorageMap { - resourcesToRemove := sets.NewString() - for resourceName, resourceServingInfo := range versionToResource { - if !e.shouldServe(resourceServingInfo) { - resourcesToRemove.Insert(resourceName) - } - } - - for resourceName := range versionedResourcesStorageMap[apiVersion] { - if !shouldRemoveResourceAndSubresources(resourcesToRemove, resourceName) { - continue - } - - klog.V(1).Infof("Removing resource %v.%v.%v because it is time to stop serving it per APILifecycle.", resourceName, apiVersion, groupName) - delete(versionedResourcesStorageMap[apiVersion], resourceName) - } - - if len(versionedResourcesStorageMap[apiVersion]) == 0 { - versionsToRemove.Insert(apiVersion) - } - } - - for _, apiVersion := range versionsToRemove.List() { - klog.V(1).Infof("Removing version %v.%v because it is time to stop serving it because it has no resources per APILifecycle.", apiVersion, groupName) - delete(versionedResourcesStorageMap, apiVersion) - } -} - -func shouldRemoveResourceAndSubresources(resourcesToRemove sets.String, resourceName string) bool { - for _, resourceToRemove := range resourcesToRemove.List() { - if resourceName == resourceToRemove { - return true - } - // our API works on nesting, so you can have deployments, deployments/status, and deployments/scale. Not all subresources - // serve the parent type, but if the parent type (deployments in this case), has been removed, it's subresources should be removed too. - if strings.HasPrefix(resourceName, resourceToRemove+"/") { - return true - } - } - return false -} diff --git a/vendor/k8s.io/kubernetes/pkg/controlplane/instance.go b/vendor/k8s.io/kubernetes/pkg/controlplane/instance.go index dfd5744e0e9d..9bba2ebd51b2 100644 --- a/vendor/k8s.io/kubernetes/pkg/controlplane/instance.go +++ b/vendor/k8s.io/kubernetes/pkg/controlplane/instance.go @@ -38,12 +38,12 @@ import ( autoscalingapiv2beta2 "k8s.io/api/autoscaling/v2beta2" batchapiv1 "k8s.io/api/batch/v1" batchapiv1beta1 "k8s.io/api/batch/v1beta1" - batchapiv2alpha1 "k8s.io/api/batch/v2alpha1" certificatesapiv1 "k8s.io/api/certificates/v1" certificatesapiv1beta1 "k8s.io/api/certificates/v1beta1" coordinationapiv1 "k8s.io/api/coordination/v1" coordinationapiv1beta1 "k8s.io/api/coordination/v1beta1" apiv1 "k8s.io/api/core/v1" + discoveryv1 "k8s.io/api/discovery/v1" discoveryv1beta1 "k8s.io/api/discovery/v1beta1" eventsv1 "k8s.io/api/events/v1" eventsv1beta1 "k8s.io/api/events/v1beta1" @@ -54,6 +54,7 @@ import ( nodev1 "k8s.io/api/node/v1" nodev1alpha1 "k8s.io/api/node/v1alpha1" nodev1beta1 "k8s.io/api/node/v1beta1" + policyapiv1 "k8s.io/api/policy/v1" policyapiv1beta1 "k8s.io/api/policy/v1beta1" rbacv1 "k8s.io/api/rbac/v1" rbacv1alpha1 "k8s.io/api/rbac/v1alpha1" @@ -81,7 +82,7 @@ import ( "k8s.io/client-go/informers" "k8s.io/client-go/kubernetes" corev1client "k8s.io/client-go/kubernetes/typed/core/v1" - discoveryclient "k8s.io/client-go/kubernetes/typed/discovery/v1beta1" + discoveryclient "k8s.io/client-go/kubernetes/typed/discovery/v1" "k8s.io/component-base/version" "k8s.io/component-helpers/apimachinery/lease" "k8s.io/klog/v2" @@ -91,7 +92,6 @@ import ( "k8s.io/kubernetes/pkg/controlplane/controller/clusterauthenticationtrust" "k8s.io/kubernetes/pkg/controlplane/reconcilers" "k8s.io/kubernetes/pkg/controlplane/tunneler" - "k8s.io/kubernetes/pkg/features" kubeoptions "k8s.io/kubernetes/pkg/kubeapiserver/options" kubeletclient "k8s.io/kubernetes/pkg/kubelet/client" "k8s.io/kubernetes/pkg/routes" @@ -250,10 +250,7 @@ type Instance struct { func (c *Config) createMasterCountReconciler() reconcilers.EndpointReconciler { endpointClient := corev1client.NewForConfigOrDie(c.GenericConfig.LoopbackClientConfig) - var endpointSliceClient discoveryclient.EndpointSlicesGetter - if utilfeature.DefaultFeatureGate.Enabled(features.EndpointSlice) { - endpointSliceClient = discoveryclient.NewForConfigOrDie(c.GenericConfig.LoopbackClientConfig) - } + endpointSliceClient := discoveryclient.NewForConfigOrDie(c.GenericConfig.LoopbackClientConfig) endpointsAdapter := reconcilers.NewEndpointsAdapter(endpointClient, endpointSliceClient) return reconcilers.NewMasterCountEndpointReconciler(c.ExtraConfig.MasterCount, endpointsAdapter) @@ -265,10 +262,7 @@ func (c *Config) createNoneReconciler() reconcilers.EndpointReconciler { func (c *Config) createLeaseReconciler() reconcilers.EndpointReconciler { endpointClient := corev1client.NewForConfigOrDie(c.GenericConfig.LoopbackClientConfig) - var endpointSliceClient discoveryclient.EndpointSlicesGetter - if utilfeature.DefaultFeatureGate.Enabled(features.EndpointSlice) { - endpointSliceClient = discoveryclient.NewForConfigOrDie(c.GenericConfig.LoopbackClientConfig) - } + endpointSliceClient := discoveryclient.NewForConfigOrDie(c.GenericConfig.LoopbackClientConfig) endpointsAdapter := reconcilers.NewEndpointsAdapter(endpointClient, endpointSliceClient) ttl := c.ExtraConfig.MasterEndpointReconcileTTL @@ -366,37 +360,35 @@ func (c completedConfig) New(delegationTarget genericapiserver.DelegationTarget) routes.Logs{}.Install(s.Handler.GoRestfulContainer) } - if utilfeature.DefaultFeatureGate.Enabled(features.ServiceAccountIssuerDiscovery) { - // Metadata and keys are expected to only change across restarts at present, - // so we just marshal immediately and serve the cached JSON bytes. - md, err := serviceaccount.NewOpenIDMetadata( - c.ExtraConfig.ServiceAccountIssuerURL, - c.ExtraConfig.ServiceAccountJWKSURI, - c.GenericConfig.ExternalAddress, - c.ExtraConfig.ServiceAccountPublicKeys, - ) - if err != nil { - // If there was an error, skip installing the endpoints and log the - // error, but continue on. We don't return the error because the - // metadata responses require additional, backwards incompatible - // validation of command-line options. - msg := fmt.Sprintf("Could not construct pre-rendered responses for"+ - " ServiceAccountIssuerDiscovery endpoints. Endpoints will not be"+ - " enabled. Error: %v", err) - if c.ExtraConfig.ServiceAccountIssuerURL != "" { - // The user likely expects this feature to be enabled if issuer URL is - // set and the feature gate is enabled. In the future, if there is no - // longer a feature gate and issuer URL is not set, the user may not - // expect this feature to be enabled. We log the former case as an Error - // and the latter case as an Info. - klog.Error(msg) - } else { - klog.Info(msg) - } + // Metadata and keys are expected to only change across restarts at present, + // so we just marshal immediately and serve the cached JSON bytes. + md, err := serviceaccount.NewOpenIDMetadata( + c.ExtraConfig.ServiceAccountIssuerURL, + c.ExtraConfig.ServiceAccountJWKSURI, + c.GenericConfig.ExternalAddress, + c.ExtraConfig.ServiceAccountPublicKeys, + ) + if err != nil { + // If there was an error, skip installing the endpoints and log the + // error, but continue on. We don't return the error because the + // metadata responses require additional, backwards incompatible + // validation of command-line options. + msg := fmt.Sprintf("Could not construct pre-rendered responses for"+ + " ServiceAccountIssuerDiscovery endpoints. Endpoints will not be"+ + " enabled. Error: %v", err) + if c.ExtraConfig.ServiceAccountIssuerURL != "" { + // The user likely expects this feature to be enabled if issuer URL is + // set and the feature gate is enabled. In the future, if there is no + // longer a feature gate and issuer URL is not set, the user may not + // expect this feature to be enabled. We log the former case as an Error + // and the latter case as an Info. + klog.Error(msg) } else { - routes.NewOpenIDMetadataServer(md.ConfigJSON, md.PublicKeysetJSON). - Install(s.Handler.GoRestfulContainer) + klog.Info(msg) } + } else { + routes.NewOpenIDMetadataServer(md.ConfigJSON, md.PublicKeysetJSON). + Install(s.Handler.GoRestfulContainer) } m := &Instance{ @@ -583,7 +575,7 @@ func (m *Instance) InstallAPIs(apiResourceConfigSource serverstorage.APIResource apiGroupsInfo := []*genericapiserver.APIGroupInfo{} // used later in the loop to filter the served resource by those that have expired. - resourceExpirationEvaluator, err := newResourceExpirationEvaluator(version.Get()) + resourceExpirationEvaluator, err := genericapiserver.NewResourceExpirationEvaluator(version.Get()) if err != nil { return err } @@ -606,7 +598,7 @@ func (m *Instance) InstallAPIs(apiResourceConfigSource serverstorage.APIResource // Remove resources that serving kinds that are removed. // We do this here so that we don't accidentally serve versions without resources or openapi information that for kinds we don't serve. // This is a spot above the construction of individual storage handlers so that no sig accidentally forgets to check. - resourceExpirationEvaluator.removeDeletedKinds(groupName, apiGroupInfo.VersionedResourcesStorageMap) + resourceExpirationEvaluator.RemoveDeletedKinds(groupName, apiGroupInfo.Scheme, apiGroupInfo.VersionedResourcesStorageMap) if len(apiGroupInfo.VersionedResourcesStorageMap) == 0 { klog.V(1).Infof("Removing API group %v because it is time to stop serving it because it has no versions per APILifecycle.", groupName) continue @@ -688,6 +680,7 @@ func DefaultAPIResourceConfigSource() *serverstorage.ResourceConfig { certificatesapiv1beta1.SchemeGroupVersion, coordinationapiv1.SchemeGroupVersion, coordinationapiv1beta1.SchemeGroupVersion, + discoveryv1.SchemeGroupVersion, discoveryv1beta1.SchemeGroupVersion, eventsv1.SchemeGroupVersion, eventsv1beta1.SchemeGroupVersion, @@ -696,6 +689,7 @@ func DefaultAPIResourceConfigSource() *serverstorage.ResourceConfig { networkingapiv1beta1.SchemeGroupVersion, nodev1.SchemeGroupVersion, nodev1beta1.SchemeGroupVersion, + policyapiv1.SchemeGroupVersion, policyapiv1beta1.SchemeGroupVersion, rbacv1.SchemeGroupVersion, rbacv1beta1.SchemeGroupVersion, @@ -712,7 +706,6 @@ func DefaultAPIResourceConfigSource() *serverstorage.ResourceConfig { // disable alpha versions explicitly so we have a full list of what's possible to serve ret.DisableVersions( apiserverinternalv1alpha1.SchemeGroupVersion, - batchapiv2alpha1.SchemeGroupVersion, nodev1alpha1.SchemeGroupVersion, rbacv1alpha1.SchemeGroupVersion, schedulingv1alpha1.SchemeGroupVersion, diff --git a/vendor/k8s.io/kubernetes/pkg/controlplane/reconcilers/BUILD b/vendor/k8s.io/kubernetes/pkg/controlplane/reconcilers/BUILD deleted file mode 100644 index 6e108dfb3fc1..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/controlplane/reconcilers/BUILD +++ /dev/null @@ -1,66 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "endpointsadapter.go", - "instancecount.go", - "lease.go", - "none.go", - "reconcilers.go", - ], - importpath = "k8s.io/kubernetes/pkg/controlplane/reconcilers", - visibility = ["//visibility:public"], - deps = [ - "//pkg/api/v1/endpoints:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/discovery/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/discovery/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/util/retry:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "endpointsadapter_test.go", - "lease_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/discovery/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/controlplane/reconcilers/endpointsadapter.go b/vendor/k8s.io/kubernetes/pkg/controlplane/reconcilers/endpointsadapter.go index 99d8f6b62a5e..25e69d010a41 100644 --- a/vendor/k8s.io/kubernetes/pkg/controlplane/reconcilers/endpointsadapter.go +++ b/vendor/k8s.io/kubernetes/pkg/controlplane/reconcilers/endpointsadapter.go @@ -18,15 +18,14 @@ package reconcilers import ( "context" + corev1 "k8s.io/api/core/v1" - discovery "k8s.io/api/discovery/v1beta1" + discovery "k8s.io/api/discovery/v1" apiequality "k8s.io/apimachinery/pkg/api/equality" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - utilfeature "k8s.io/apiserver/pkg/util/feature" corev1client "k8s.io/client-go/kubernetes/typed/core/v1" - discoveryclient "k8s.io/client-go/kubernetes/typed/discovery/v1beta1" - "k8s.io/kubernetes/pkg/features" + discoveryclient "k8s.io/client-go/kubernetes/typed/discovery/v1" utilnet "k8s.io/utils/net" ) @@ -175,12 +174,7 @@ func endpointFromAddress(address corev1.EndpointAddress, ready bool) discovery.E } if address.NodeName != nil { - ep.Topology = map[string]string{ - "kubernetes.io/hostname": *address.NodeName, - } - if utilfeature.DefaultFeatureGate.Enabled(features.EndpointSliceNodeName) { - ep.NodeName = address.NodeName - } + ep.NodeName = address.NodeName } return ep diff --git a/vendor/k8s.io/kubernetes/pkg/controlplane/reconcilers/lease.go b/vendor/k8s.io/kubernetes/pkg/controlplane/reconcilers/lease.go index 4d794ff74b78..ca3e1dee04b6 100644 --- a/vendor/k8s.io/kubernetes/pkg/controlplane/reconcilers/lease.go +++ b/vendor/k8s.io/kubernetes/pkg/controlplane/reconcilers/lease.go @@ -113,7 +113,7 @@ func (s *storageLeases) UpdateLease(ip string) error { // RemoveLease removes the lease on a master IP in storage func (s *storageLeases) RemoveLease(ip string) error { - return s.storage.Delete(apirequest.NewDefaultContext(), s.baseKey+"/"+ip, &corev1.Endpoints{}, nil, rest.ValidateAllObjectFunc) + return s.storage.Delete(apirequest.NewDefaultContext(), s.baseKey+"/"+ip, &corev1.Endpoints{}, nil, rest.ValidateAllObjectFunc, nil) } // NewLeases creates a new etcd-based Leases implementation. diff --git a/vendor/k8s.io/kubernetes/pkg/controlplane/tunneler/BUILD b/vendor/k8s.io/kubernetes/pkg/controlplane/tunneler/BUILD deleted file mode 100644 index 2a5bfb426c85..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/controlplane/tunneler/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["ssh_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["ssh.go"], - importpath = "k8s.io/kubernetes/pkg/controlplane/tunneler", - deps = [ - "//pkg/ssh:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/path:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/credentialprovider/BUILD b/vendor/k8s.io/kubernetes/pkg/credentialprovider/BUILD deleted file mode 100644 index 461f5850b070..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/credentialprovider/BUILD +++ /dev/null @@ -1,53 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "config.go", - "doc.go", - "keyring.go", - "plugins.go", - "provider.go", - ], - importpath = "k8s.io/kubernetes/pkg/credentialprovider", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "config_test.go", - "keyring_test.go", - "provider_test.go", - ], - embed = [":go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/credentialprovider/aws:all-srcs", - "//pkg/credentialprovider/azure:all-srcs", - "//pkg/credentialprovider/gcp:all-srcs", - "//pkg/credentialprovider/plugin:all-srcs", - "//pkg/credentialprovider/secrets:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/credentialprovider/OWNERS b/vendor/k8s.io/kubernetes/pkg/credentialprovider/OWNERS index d96f6e41e727..5e72ed8bde3b 100644 --- a/vendor/k8s.io/kubernetes/pkg/credentialprovider/OWNERS +++ b/vendor/k8s.io/kubernetes/pkg/credentialprovider/OWNERS @@ -18,7 +18,6 @@ reviewers: - justinsb - dims - resouer -- mbohlool - mfojtik - therc - andrewsykim diff --git a/vendor/k8s.io/kubernetes/pkg/credentialprovider/aws/BUILD b/vendor/k8s.io/kubernetes/pkg/credentialprovider/aws/BUILD deleted file mode 100644 index af13e57b6975..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/credentialprovider/aws/BUILD +++ /dev/null @@ -1,48 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["aws_credentials.go"], - importpath = "k8s.io/kubernetes/pkg/credentialprovider/aws", - deps = [ - "//pkg/credentialprovider:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/component-base/version:go_default_library", - "//vendor/github.com/aws/aws-sdk-go/aws:go_default_library", - "//vendor/github.com/aws/aws-sdk-go/aws/request:go_default_library", - "//vendor/github.com/aws/aws-sdk-go/aws/session:go_default_library", - "//vendor/github.com/aws/aws-sdk-go/service/ecr:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["aws_credentials_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/credentialprovider:go_default_library", - "//vendor/github.com/aws/aws-sdk-go/aws:go_default_library", - "//vendor/github.com/aws/aws-sdk-go/service/ecr:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/credentialprovider/azure/BUILD b/vendor/k8s.io/kubernetes/pkg/credentialprovider/azure/BUILD deleted file mode 100644 index c8c6ac266448..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/credentialprovider/azure/BUILD +++ /dev/null @@ -1,55 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "azure_acr_helper.go", - "azure_credentials.go", - "doc.go", - ], - importpath = "k8s.io/kubernetes/pkg/credentialprovider/azure", - deps = [ - "//pkg/credentialprovider:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/auth:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/containerregistry/mgmt/2019-05-01/containerregistry:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/adal:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/azure:go_default_library", - "//vendor/github.com/spf13/pflag:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/sigs.k8s.io/yaml:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["azure_credentials_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/containerregistry/mgmt/2019-05-01/containerregistry:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/azure:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/to:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/credentialprovider/azure/azure_credentials.go b/vendor/k8s.io/kubernetes/pkg/credentialprovider/azure/azure_credentials.go index 75803c7da5f8..2d9281482bf2 100644 --- a/vendor/k8s.io/kubernetes/pkg/credentialprovider/azure/azure_credentials.go +++ b/vendor/k8s.io/kubernetes/pkg/credentialprovider/azure/azure_credentials.go @@ -257,7 +257,7 @@ func (a *acrProvider) Provide(image string) credentialprovider.DockerConfig { if exists { klog.V(4).Infof("Got ACR credentials from cache for %s", loginServer) } else { - klog.V(2).Info("unable to get ACR credentials from cache for %s, checking ACR API", loginServer) + klog.V(2).Infof("unable to get ACR credentials from cache for %s, checking ACR API", loginServer) var err error cfg, err = a.getFromACR(loginServer) if err != nil { diff --git a/vendor/k8s.io/kubernetes/pkg/credentialprovider/config.go b/vendor/k8s.io/kubernetes/pkg/credentialprovider/config.go index b9edb4c39e83..00a5fa90608d 100644 --- a/vendor/k8s.io/kubernetes/pkg/credentialprovider/config.go +++ b/vendor/k8s.io/kubernetes/pkg/credentialprovider/config.go @@ -116,7 +116,7 @@ func ReadDockercfgFile(searchPaths []string) (cfg DockerConfig, err error) { klog.V(4).Infof("while trying to read %s: %v", absDockerConfigFileLocation, err) continue } - cfg, err := readDockerConfigFileFromBytes(contents) + cfg, err := ReadDockerConfigFileFromBytes(contents) if err != nil { klog.V(4).Infof("couldn't get the config from %q contents: %v", absDockerConfigFileLocation, err) continue @@ -226,13 +226,14 @@ func ReadURL(url string, client *http.Client, header *http.Header) (body []byte, // ReadDockerConfigFileFromURL read a docker config file from the given url func ReadDockerConfigFileFromURL(url string, client *http.Client, header *http.Header) (cfg DockerConfig, err error) { if contents, err := ReadURL(url, client, header); err == nil { - return readDockerConfigFileFromBytes(contents) + return ReadDockerConfigFileFromBytes(contents) } return nil, err } -func readDockerConfigFileFromBytes(contents []byte) (cfg DockerConfig, err error) { +// ReadDockerConfigFileFromBytes read a docker config file from the given bytes +func ReadDockerConfigFileFromBytes(contents []byte) (cfg DockerConfig, err error) { if err = json.Unmarshal(contents, &cfg); err != nil { return nil, errors.New("error occurred while trying to unmarshal json") } diff --git a/vendor/k8s.io/kubernetes/pkg/credentialprovider/gcp/BUILD b/vendor/k8s.io/kubernetes/pkg/credentialprovider/gcp/BUILD deleted file mode 100644 index f57bd90d1529..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/credentialprovider/gcp/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "metadata.go", - ], - importpath = "k8s.io/kubernetes/pkg/credentialprovider/gcp", - deps = [ - "//pkg/credentialprovider:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["metadata_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/credentialprovider:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/credentialprovider/gcp/metadata.go b/vendor/k8s.io/kubernetes/pkg/credentialprovider/gcp/metadata.go index c7f0b994c8e9..9c5df1987c19 100644 --- a/vendor/k8s.io/kubernetes/pkg/credentialprovider/gcp/metadata.go +++ b/vendor/k8s.io/kubernetes/pkg/credentialprovider/gcp/metadata.go @@ -26,61 +26,37 @@ import ( "time" utilnet "k8s.io/apimachinery/pkg/util/net" + "k8s.io/cloud-provider/credentialconfig" "k8s.io/klog/v2" "k8s.io/kubernetes/pkg/credentialprovider" + "k8s.io/legacy-cloud-providers/gce/gcpcredential" ) const ( - metadataURL = "http://metadata.google.internal./computeMetadata/v1/" - metadataAttributes = metadataURL + "instance/attributes/" - dockerConfigKey = metadataAttributes + "google-dockercfg" - dockerConfigURLKey = metadataAttributes + "google-dockercfg-url" - serviceAccounts = metadataURL + "instance/service-accounts/" - metadataScopes = metadataURL + "instance/service-accounts/default/scopes" - metadataToken = metadataURL + "instance/service-accounts/default/token" - metadataEmail = metadataURL + "instance/service-accounts/default/email" - storageScopePrefix = "https://www.googleapis.com/auth/devstorage" + metadataURL = "http://metadata.google.internal./computeMetadata/v1/" + metadataAttributes = metadataURL + "instance/attributes/" + // DockerConfigKey is the URL of the dockercfg metadata key used by DockerConfigKeyProvider. + DockerConfigKey = metadataAttributes + "google-dockercfg" + // DockerConfigURLKey is the URL of the dockercfg metadata key used by DockerConfigURLKeyProvider. + DockerConfigURLKey = metadataAttributes + "google-dockercfg-url" + serviceAccounts = metadataURL + "instance/service-accounts/" + metadataScopes = metadataURL + "instance/service-accounts/default/scopes" + metadataToken = metadataURL + "instance/service-accounts/default/token" + metadataEmail = metadataURL + "instance/service-accounts/default/email" + // StorageScopePrefix is the prefix checked by ContainerRegistryProvider.Enabled. + StorageScopePrefix = "https://www.googleapis.com/auth/devstorage" cloudPlatformScopePrefix = "https://www.googleapis.com/auth/cloud-platform" defaultServiceAccount = "default/" ) -// Product file path that contains the cloud service name. +// gceProductNameFile is the product file path that contains the cloud service name. // This is a variable instead of a const to enable testing. var gceProductNameFile = "/sys/class/dmi/id/product_name" -// For these urls, the parts of the host name can be glob, for example '*.gcr.io" will match -// "foo.gcr.io" and "bar.gcr.io". -var containerRegistryUrls = []string{"container.cloud.google.com", "gcr.io", "*.gcr.io", "*.pkg.dev"} - var metadataHeader = &http.Header{ "Metadata-Flavor": []string{"Google"}, } -// A DockerConfigProvider that reads its configuration from Google -// Compute Engine metadata. -type metadataProvider struct { - Client *http.Client -} - -// A DockerConfigProvider that reads its configuration from a specific -// Google Compute Engine metadata key: 'google-dockercfg'. -type dockerConfigKeyProvider struct { - metadataProvider -} - -// A DockerConfigProvider that reads its configuration from a URL read from -// a specific Google Compute Engine metadata key: 'google-dockercfg-url'. -type dockerConfigURLKeyProvider struct { - metadataProvider -} - -// A DockerConfigProvider that provides a dockercfg with: -// Username: "_token" -// Password: "{access token from metadata}" -type containerRegistryProvider struct { - metadataProvider -} - // init registers the various means by which credentials may // be resolved on GCP. func init() { @@ -92,16 +68,16 @@ func init() { } credentialprovider.RegisterCredentialProvider("google-dockercfg", &credentialprovider.CachingDockerConfigProvider{ - Provider: &dockerConfigKeyProvider{ - metadataProvider{Client: httpClient}, + Provider: &DockerConfigKeyProvider{ + MetadataProvider: MetadataProvider{Client: httpClient}, }, Lifetime: 60 * time.Second, }) credentialprovider.RegisterCredentialProvider("google-dockercfg-url", &credentialprovider.CachingDockerConfigProvider{ - Provider: &dockerConfigURLKeyProvider{ - metadataProvider{Client: httpClient}, + Provider: &DockerConfigURLKeyProvider{ + MetadataProvider: MetadataProvider{Client: httpClient}, }, Lifetime: 60 * time.Second, }) @@ -109,11 +85,36 @@ func init() { credentialprovider.RegisterCredentialProvider("google-container-registry", // Never cache this. The access token is already // cached by the metadata service. - &containerRegistryProvider{ - metadataProvider{Client: httpClient}, + &ContainerRegistryProvider{ + MetadataProvider: MetadataProvider{Client: httpClient}, }) } +// MetadataProvider is a DockerConfigProvider that reads its configuration from Google +// Compute Engine metadata. +type MetadataProvider struct { + Client *http.Client +} + +// DockerConfigKeyProvider is a DockerConfigProvider that reads its configuration from a specific +// Google Compute Engine metadata key: 'google-dockercfg'. +type DockerConfigKeyProvider struct { + MetadataProvider +} + +// DockerConfigURLKeyProvider is a DockerConfigProvider that reads its configuration from a URL read from +// a specific Google Compute Engine metadata key: 'google-dockercfg-url'. +type DockerConfigURLKeyProvider struct { + MetadataProvider +} + +// ContainerRegistryProvider is a DockerConfigProvider that provides a dockercfg with: +// Username: "_token" +// Password: "{access token from metadata}" +type ContainerRegistryProvider struct { + MetadataProvider +} + // Returns true if it finds a local GCE VM. // Looks at a product file that is an undocumented API. func onGCEVM() bool { @@ -142,42 +143,18 @@ func onGCEVM() bool { } // Enabled implements DockerConfigProvider for all of the Google implementations. -func (g *metadataProvider) Enabled() bool { +func (g *MetadataProvider) Enabled() bool { return onGCEVM() } // Provide implements DockerConfigProvider -func (g *dockerConfigKeyProvider) Provide(image string) credentialprovider.DockerConfig { - // Read the contents of the google-dockercfg metadata key and - // parse them as an alternate .dockercfg - if cfg, err := credentialprovider.ReadDockerConfigFileFromURL(dockerConfigKey, g.Client, metadataHeader); err != nil { - klog.Errorf("while reading 'google-dockercfg' metadata: %v", err) - } else { - return cfg - } - - return credentialprovider.DockerConfig{} +func (g *DockerConfigKeyProvider) Provide(image string) credentialprovider.DockerConfig { + return registryToDocker(gcpcredential.ProvideConfigKey(g.Client, image)) } // Provide implements DockerConfigProvider -func (g *dockerConfigURLKeyProvider) Provide(image string) credentialprovider.DockerConfig { - // Read the contents of the google-dockercfg-url key and load a .dockercfg from there - if url, err := credentialprovider.ReadURL(dockerConfigURLKey, g.Client, metadataHeader); err != nil { - klog.Errorf("while reading 'google-dockercfg-url' metadata: %v", err) - } else { - if strings.HasPrefix(string(url), "http") { - if cfg, err := credentialprovider.ReadDockerConfigFileFromURL(string(url), g.Client, nil); err != nil { - klog.Errorf("while reading 'google-dockercfg-url'-specified url: %s, %v", string(url), err) - } else { - return cfg - } - } else { - // TODO(mattmoor): support reading alternate scheme URLs (e.g. gs:// or s3://) - klog.Errorf("Unsupported URL scheme: %s", string(url)) - } - } - - return credentialprovider.DockerConfig{} +func (g *DockerConfigURLKeyProvider) Provide(image string) credentialprovider.DockerConfig { + return registryToDocker(gcpcredential.ProvideURLKey(g.Client, image)) } // runWithBackoff runs input function `f` with an exponential backoff. @@ -208,13 +185,13 @@ func runWithBackoff(f func() ([]byte, error)) []byte { // It is expected that "http://metadata.google.internal./computeMetadata/v1/instance/service-accounts/" will return a `200` // and "http://metadata.google.internal./computeMetadata/v1/instance/service-accounts/default/scopes" will also return `200`. // More information on metadata service can be found here - https://cloud.google.com/compute/docs/storing-retrieving-metadata -func (g *containerRegistryProvider) Enabled() bool { +func (g *ContainerRegistryProvider) Enabled() bool { if !onGCEVM() { return false } // Given that we are on GCE, we should keep retrying until the metadata server responds. value := runWithBackoff(func() ([]byte, error) { - value, err := credentialprovider.ReadURL(serviceAccounts, g.Client, metadataHeader) + value, err := gcpcredential.ReadURL(serviceAccounts, g.Client, metadataHeader) if err != nil { klog.V(2).Infof("Failed to Get service accounts from gce metadata server: %v", err) } @@ -237,7 +214,7 @@ func (g *containerRegistryProvider) Enabled() bool { } url := metadataScopes + "?alt=json" value = runWithBackoff(func() ([]byte, error) { - value, err := credentialprovider.ReadURL(url, g.Client, metadataHeader) + value, err := gcpcredential.ReadURL(url, g.Client, metadataHeader) if err != nil { klog.V(2).Infof("Failed to Get scopes in default service account from gce metadata server: %v", err) } @@ -250,7 +227,7 @@ func (g *containerRegistryProvider) Enabled() bool { } for _, v := range scopes { // cloudPlatformScope implies storage scope. - if strings.HasPrefix(v, storageScopePrefix) || strings.HasPrefix(v, cloudPlatformScopePrefix) { + if strings.HasPrefix(v, StorageScopePrefix) || strings.HasPrefix(v, cloudPlatformScopePrefix) { return true } } @@ -258,43 +235,19 @@ func (g *containerRegistryProvider) Enabled() bool { return false } -// tokenBlob is used to decode the JSON blob containing an access token -// that is returned by GCE metadata. -type tokenBlob struct { - AccessToken string `json:"access_token"` -} - // Provide implements DockerConfigProvider -func (g *containerRegistryProvider) Provide(image string) credentialprovider.DockerConfig { - cfg := credentialprovider.DockerConfig{} - - tokenJSONBlob, err := credentialprovider.ReadURL(metadataToken, g.Client, metadataHeader) - if err != nil { - klog.Errorf("while reading access token endpoint: %v", err) - return cfg - } - - email, err := credentialprovider.ReadURL(metadataEmail, g.Client, metadataHeader) - if err != nil { - klog.Errorf("while reading email endpoint: %v", err) - return cfg - } - - var parsedBlob tokenBlob - if err := json.Unmarshal([]byte(tokenJSONBlob), &parsedBlob); err != nil { - klog.Errorf("while parsing json blob %s: %v", tokenJSONBlob, err) - return cfg - } - - entry := credentialprovider.DockerConfigEntry{ - Username: "_token", - Password: parsedBlob.AccessToken, - Email: string(email), - } +func (g *ContainerRegistryProvider) Provide(image string) credentialprovider.DockerConfig { + return registryToDocker(gcpcredential.ProvideContainerRegistry(g.Client, image)) +} - // Add our entry for each of the supported container registry URLs - for _, k := range containerRegistryUrls { - cfg[k] = entry +func registryToDocker(registryConfig credentialconfig.RegistryConfig) credentialprovider.DockerConfig { + dockerConfig := credentialprovider.DockerConfig{} + for k, v := range registryConfig { + dockerConfig[k] = credentialprovider.DockerConfigEntry{ + Username: v.Username, + Password: v.Password, + Email: v.Email, + } } - return cfg + return dockerConfig } diff --git a/vendor/k8s.io/kubernetes/pkg/credentialprovider/keyring.go b/vendor/k8s.io/kubernetes/pkg/credentialprovider/keyring.go index 5ce467f9a8bb..0af960a384fc 100644 --- a/vendor/k8s.io/kubernetes/pkg/credentialprovider/keyring.go +++ b/vendor/k8s.io/kubernetes/pkg/credentialprovider/keyring.go @@ -23,9 +23,8 @@ import ( "sort" "strings" - "k8s.io/klog/v2" - "k8s.io/apimachinery/pkg/util/sets" + "k8s.io/klog/v2" ) // DockerKeyring tracks a set of docker registry credentials, maintaining a diff --git a/vendor/k8s.io/kubernetes/pkg/credentialprovider/plugin/BUILD b/vendor/k8s.io/kubernetes/pkg/credentialprovider/plugin/BUILD deleted file mode 100644 index 6362b35b6e81..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/credentialprovider/plugin/BUILD +++ /dev/null @@ -1,58 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "config.go", - "plugin.go", - ], - importpath = "k8s.io/kubernetes/pkg/credentialprovider/plugin", - visibility = ["//visibility:public"], - deps = [ - "//pkg/credentialprovider:go_default_library", - "//pkg/kubelet/apis/config:go_default_library", - "//pkg/kubelet/apis/config/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/json:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/kubelet/pkg/apis/credentialprovider:go_default_library", - "//staging/src/k8s.io/kubelet/pkg/apis/credentialprovider/install:go_default_library", - "//staging/src/k8s.io/kubelet/pkg/apis/credentialprovider/v1alpha1:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = [ - "config_test.go", - "plugin_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/credentialprovider:go_default_library", - "//pkg/kubelet/apis/config:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/kubelet/pkg/apis/credentialprovider:go_default_library", - "//staging/src/k8s.io/kubelet/pkg/apis/credentialprovider/v1alpha1:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/credentialprovider/plugin/plugin.go b/vendor/k8s.io/kubernetes/pkg/credentialprovider/plugin/plugin.go index 6b1c7463df50..c646d5ca8713 100644 --- a/vendor/k8s.io/kubernetes/pkg/credentialprovider/plugin/plugin.go +++ b/vendor/k8s.io/kubernetes/pkg/credentialprovider/plugin/plugin.go @@ -252,7 +252,7 @@ func (p *pluginProvider) Provide(image string) credentialprovider.DockerConfig { } // Enabled always returns true since registration of the plugin via kubelet implies it should be enabled. -func (e *pluginProvider) Enabled() bool { +func (p *pluginProvider) Enabled() bool { return true } diff --git a/vendor/k8s.io/kubernetes/pkg/credentialprovider/provider.go b/vendor/k8s.io/kubernetes/pkg/credentialprovider/provider.go index d575ca9155f0..8c9ad347b72c 100644 --- a/vendor/k8s.io/kubernetes/pkg/credentialprovider/provider.go +++ b/vendor/k8s.io/kubernetes/pkg/credentialprovider/provider.go @@ -79,7 +79,7 @@ func (d *defaultDockerConfigProvider) Provide(image string) DockerConfig { if cfg, err := ReadDockerConfigFile(); err == nil { return cfg } else if !os.IsNotExist(err) { - klog.V(4).Infof("Unable to parse Docker config file: %v", err) + klog.V(2).Infof("Docker config file not found: %v", err) } return DockerConfig{} } diff --git a/vendor/k8s.io/kubernetes/pkg/credentialprovider/secrets/BUILD b/vendor/k8s.io/kubernetes/pkg/credentialprovider/secrets/BUILD deleted file mode 100644 index 084b486a170b..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/credentialprovider/secrets/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["secrets.go"], - importpath = "k8s.io/kubernetes/pkg/credentialprovider/secrets", - visibility = ["//visibility:public"], - deps = [ - "//pkg/credentialprovider:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["secrets_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/credentialprovider:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/credentialprovider/secrets/secrets.go b/vendor/k8s.io/kubernetes/pkg/credentialprovider/secrets/secrets.go index 4e7c220b397f..423cd2bbf947 100644 --- a/vendor/k8s.io/kubernetes/pkg/credentialprovider/secrets/secrets.go +++ b/vendor/k8s.io/kubernetes/pkg/credentialprovider/secrets/secrets.go @@ -19,7 +19,7 @@ package secrets import ( "encoding/json" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" "k8s.io/kubernetes/pkg/credentialprovider" ) diff --git a/vendor/k8s.io/kubernetes/pkg/features/BUILD b/vendor/k8s.io/kubernetes/pkg/features/BUILD deleted file mode 100644 index 1f1b927d7677..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/features/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["kube_features.go"], - importpath = "k8s.io/kubernetes/pkg/features", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/features:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/features/kube_features.go b/vendor/k8s.io/kubernetes/pkg/features/kube_features.go index 575a0a2e102d..bdb3588f760c 100644 --- a/vendor/k8s.io/kubernetes/pkg/features/kube_features.go +++ b/vendor/k8s.io/kubernetes/pkg/features/kube_features.go @@ -68,14 +68,6 @@ const ( // certificate as expiration approaches. RotateKubeletServerCertificate featuregate.Feature = "RotateKubeletServerCertificate" - // owner: @mikedanese - // beta: v1.8 - // ga: v1.19 - // - // Automatically renews the client certificate used for communicating with - // the API server as the certificate approaches expiration. - RotateKubeletClientCertificate featuregate.Feature = "RotateKubeletClientCertificate" - // owner: @jinxu // beta: v1.10 // @@ -131,8 +123,16 @@ const ( // Enable resource managers to make NUMA aligned decisions TopologyManager featuregate.Feature = "TopologyManager" + // owner: @cynepco3hahue(alukiano) @cezaryzukowski @k-wiatrzyk + // alpha:: v1.20 + + // Allows setting memory affinity for a container based on NUMA topology + MemoryManager featuregate.Feature = "MemoryManager" + // owner: @sjenning + // alpha: v1.4 // beta: v1.11 + // ga: v1.21 // // Enable pods to set sysctls on a pod Sysctls featuregate.Feature = "Sysctls" @@ -140,13 +140,16 @@ const ( // owner @smarterclayton // alpha: v1.16 // beta: v1.19 + // ga: v1.21 // // Enable legacy behavior to vary cluster functionality on the node-role.kubernetes.io labels. On by default (legacy), will be turned off in 1.18. + // Lock to false in v1.21 and remove in v1.22. LegacyNodeRoleBehavior featuregate.Feature = "LegacyNodeRoleBehavior" // owner @brendandburns // alpha: v1.9 // beta: v1.19 + // ga: v1.21 // // Enable nodes to exclude themselves from service load balancers ServiceNodeExclusion featuregate.Feature = "ServiceNodeExclusion" @@ -154,32 +157,11 @@ const ( // owner @smarterclayton // alpha: v1.16 // beta: v1.19 + // ga: v1.21 // // Enable nodes to exclude themselves from network disruption checks NodeDisruptionExclusion featuregate.Feature = "NodeDisruptionExclusion" - // owner: @saad-ali - // alpha: v1.12 - // beta: v1.14 - // GA: v1.18 - // Enable all logic related to the CSIDriver API object in storage.k8s.io - CSIDriverRegistry featuregate.Feature = "CSIDriverRegistry" - - // owner: @verult - // alpha: v1.12 - // beta: v1.14 - // ga: v1.17 - // Enable all logic related to the CSINode API object in storage.k8s.io - CSINodeInfo featuregate.Feature = "CSINodeInfo" - - // owner: @screeley44 - // alpha: v1.9 - // beta: v1.13 - // ga: v1.18 - // - // Enable Block volume support in containers. - BlockVolume featuregate.Feature = "BlockVolume" - // owner: @pospispa // GA: v1.11 // @@ -194,29 +176,9 @@ const ( // Implement support for limiting pids in pods SupportPodPidsLimit featuregate.Feature = "SupportPodPidsLimit" - // owner: @feiskyer - // alpha: v1.10 - // - // Enable Hyper-V containers on Windows - // Deprecated in 1.20 and removed in 1.21 - HyperVContainer featuregate.Feature = "HyperVContainer" - - // owner: @mikedanese - // beta: v1.12 - // ga: v1.20 - // - // Implement TokenRequest endpoint on service account resources. - TokenRequest featuregate.Feature = "TokenRequest" - - // owner: @mikedanese - // beta: v1.12 - // ga: v1.20 - // - // Enable ServiceAccountTokenVolumeProjection support in ProjectedVolumes. - TokenRequestProjection featuregate.Feature = "TokenRequestProjection" - // owner: @mikedanese // alpha: v1.13 + // beta: v1.21 // // Migrate ServiceAccount volumes to use a projected volume consisting of a // ServiceAccountTokenVolumeProjection. This feature adds new required flags @@ -226,6 +188,7 @@ const ( // owner: @mtaufen // alpha: v1.18 // beta: v1.20 + // stable: v1.21 // // Enable OIDC discovery endpoints (issuer and JWKS URLs) for the service // account issuer in the API server. @@ -235,32 +198,25 @@ const ( // owner: @Random-Liu // beta: v1.11 + // ga: v1.21 // // Enable container log rotation for cri container runtime CRIContainerLogRotation featuregate.Feature = "CRIContainerLogRotation" // owner: @krmayankk - // beta: v1.14 + // beta: v1.14 + // ga: v1.21 // // Enables control over the primary group ID of containers' init processes. RunAsGroup featuregate.Feature = "RunAsGroup" // owner: @saad-ali - // ga + // ga: v1.10 // // Allow mounting a subpath of a volume in a container // Do not remove this feature gate even though it's GA VolumeSubpath featuregate.Feature = "VolumeSubpath" - // owner: @gnufied - // beta : v1.12 - // GA : v1.17 - - // - // Add support for volume plugins to report node specific - // volume limits - AttachVolumeLimit featuregate.Feature = "AttachVolumeLimit" - // owner: @ravig // alpha: v1.11 // @@ -269,14 +225,6 @@ const ( // while making decisions. BalanceAttachedNodeVolumes featuregate.Feature = "BalanceAttachedNodeVolumes" - // owner: @vladimirvivien - // alpha: v1.11 - // beta: v1.14 - // ga: v1.18 - // - // Enables CSI to use raw block storage volumes - CSIBlockVolume featuregate.Feature = "CSIBlockVolume" - // owner: @pohly // alpha: v1.14 // beta: v1.16 @@ -286,6 +234,7 @@ const ( // owner: @pohly // alpha: v1.19 + // beta: v1.21 // // Enables tracking of available storage capacity that CSI drivers provide. CSIStorageCapacity featuregate.Feature = "CSIStorageCapacity" @@ -299,10 +248,21 @@ const ( // owner: @pohly // alpha: v1.19 + // beta: v1.21 // // Enables generic ephemeral inline volume support for pods GenericEphemeralVolume featuregate.Feature = "GenericEphemeralVolume" + // owner: @chendave + // alpha: v1.21 + // + // PreferNominatedNode tells scheduler whether the nominated node will be checked first before looping + // all the rest of nodes in the cluster. + // Enabling this feature also implies the preemptor pod might not be dispatched to the best candidate in + // some corner case, e.g. another node releases enough resources after the nominated node has been set + // and hence is the best candidate instead. + PreferNominatedNode featuregate.Feature = "PreferNominatedNode" + // owner: @tallclair // alpha: v1.12 // beta: v1.14 @@ -322,12 +282,18 @@ const ( // owner: @janosi // alpha: v1.12 - // beta: v1.18 + // beta: v1.19 // GA: v1.20 // // Enables SCTP as new protocol for Service ports, NetworkPolicy, and ContainerPort in Pod/Containers definition SCTPSupport featuregate.Feature = "SCTPSupport" + // owner: @rikatz + // alpha: v1.21 + // + // Enables the endPort field in NetworkPolicy to enable a Port Range behavior in Network Policies. + NetworkPolicyEndPort featuregate.Feature = "NetworkPolicyEndPort" + // owner: @xing-yang // alpha: v1.12 // beta: v1.17 @@ -348,6 +314,12 @@ const ( // Allow TTL controller to clean up Pods and Jobs after they finish. TTLAfterFinished featuregate.Feature = "TTLAfterFinished" + // owner: @alculquicondor + // alpha: v1.21 + // + // Allows Job controller to manage Pod completions per completion index. + IndexedJob featuregate.Feature = "IndexedJob" + // owner: @dashpole // alpha: v1.13 // beta: v1.15 @@ -369,12 +341,11 @@ const ( // Enables the GCE PD in-tree driver to GCE CSI Driver migration feature. CSIMigrationGCE featuregate.Feature = "CSIMigrationGCE" - // owner: @davidz627 - // alpha: v1.17 + // owner: @Jiawei0227 + // alpha: v1.21 // // Disables the GCE PD in-tree driver. - // Expects GCE PD CSI Driver to be installed and configured on all nodes. - CSIMigrationGCEComplete featuregate.Feature = "CSIMigrationGCEComplete" + InTreePluginGCEUnregister featuregate.Feature = "InTreePluginGCEUnregister" // owner: @leakingtapan // alpha: v1.14 @@ -384,11 +355,10 @@ const ( CSIMigrationAWS featuregate.Feature = "CSIMigrationAWS" // owner: @leakingtapan - // alpha: v1.17 + // alpha: v1.21 // // Disables the AWS EBS in-tree driver. - // Expects AWS EBS CSI Driver to be installed and configured on all nodes. - CSIMigrationAWSComplete featuregate.Feature = "CSIMigrationAWSComplete" + InTreePluginAWSUnregister featuregate.Feature = "InTreePluginAWSUnregister" // owner: @andyzhangx // alpha: v1.15 @@ -398,24 +368,23 @@ const ( CSIMigrationAzureDisk featuregate.Feature = "CSIMigrationAzureDisk" // owner: @andyzhangx - // alpha: v1.17 + // alpha: v1.21 // // Disables the Azure Disk in-tree driver. - // Expects Azure Disk CSI Driver to be installed and configured on all nodes. - CSIMigrationAzureDiskComplete featuregate.Feature = "CSIMigrationAzureDiskComplete" + InTreePluginAzureDiskUnregister featuregate.Feature = "InTreePluginAzureDiskUnregister" // owner: @andyzhangx // alpha: v1.15 + // beta: v1.21 // // Enables the Azure File in-tree driver to Azure File Driver migration feature. CSIMigrationAzureFile featuregate.Feature = "CSIMigrationAzureFile" // owner: @andyzhangx - // alpha: v1.17 + // alpha: v1.21 // // Disables the Azure File in-tree driver. - // Expects Azure File CSI Driver to be installed and configured on all nodes. - CSIMigrationAzureFileComplete featuregate.Feature = "CSIMigrationAzureFileComplete" + InTreePluginAzureFileUnregister featuregate.Feature = "InTreePluginAzureFileUnregister" // owner: @divyenpatel // beta: v1.19 (requires: vSphere vCenter/ESXi Version: 7.0u1, HW Version: VM version 15) @@ -430,6 +399,25 @@ const ( // Expects vSphere CSI Driver to be installed and configured on all nodes. CSIMigrationvSphereComplete featuregate.Feature = "CSIMigrationvSphereComplete" + // owner: @divyenpatel + // alpha: v1.21 + // + // Disables the vSphere in-tree driver. + InTreePluginvSphereUnregister featuregate.Feature = "InTreePluginvSphereUnregister" + + // owner: @adisky + // alpha: v1.14 + // beta: v1.18 + // + // Enables the OpenStack Cinder in-tree driver to OpenStack Cinder CSI Driver migration feature. + CSIMigrationOpenStack featuregate.Feature = "CSIMigrationOpenStack" + + // owner: @adisky + // alpha: v1.21 + // + // Disables the OpenStack Cinder in-tree driver. + InTreePluginOpenStackUnregister featuregate.Feature = "InTreePluginOpenStackUnregister" + // owner: @huffmanca // alpha: v1.19 // beta: v1.20 @@ -451,35 +439,6 @@ const ( // Implement support for limiting pids in nodes SupportNodePidsLimit featuregate.Feature = "SupportNodePidsLimit" - // owner: @wk8 - // alpha: v1.14 - // beta: v1.16 - // - // Enables GMSA support for Windows workloads. - WindowsGMSA featuregate.Feature = "WindowsGMSA" - - // owner: @bclau - // alpha: v1.16 - // beta: v1.17 - // GA: v1.18 - // - // Enables support for running container entrypoints as different usernames than their default ones. - WindowsRunAsUserName featuregate.Feature = "WindowsRunAsUserName" - - // owner: @adisky - // alpha: v1.14 - // beta: v1.18 - // - // Enables the OpenStack Cinder in-tree driver to OpenStack Cinder CSI Driver migration feature. - CSIMigrationOpenStack featuregate.Feature = "CSIMigrationOpenStack" - - // owner: @adisky - // alpha: v1.17 - // - // Disables the OpenStack Cinder in-tree driver. - // Expects the OpenStack Cinder CSI Driver to be installed and configured on all nodes. - CSIMigrationOpenStackComplete featuregate.Feature = "CSIMigrationOpenStackComplete" - // owner: @RobertKrawitz // alpha: v1.15 // @@ -494,14 +453,6 @@ const ( // Enables NonPreempting option for priorityClass and pod. NonPreemptingPriority featuregate.Feature = "NonPreemptingPriority" - // owner: @j-griffith - // alpha: v1.15 - // beta: v1.16 - // GA: v1.18 - // - // Enable support for specifying an existing PVC as a DataSource - VolumePVCDataSource featuregate.Feature = "VolumePVCDataSource" - // owner: @egernst // alpha: v1.16 // beta: v1.18 @@ -511,12 +462,15 @@ const ( // owner: @khenidak // alpha: v1.15 + // beta: v1.21 // // Enables ipv6 dual stack IPv6DualStack featuregate.Feature = "IPv6DualStack" // owner: @robscott @freehan // alpha: v1.16 + // beta: v1.18 + // ga: v1.21 // // Enable Endpoint Slices for more scalable Service endpoints. EndpointSlice featuregate.Feature = "EndpointSlice" @@ -530,18 +484,11 @@ const ( // owner: @robscott @kumarvin123 // alpha: v1.19 + // beta: v1.21 // // Enable Endpoint Slice consumption by kube-proxy in Windows for improved scalability. WindowsEndpointSliceProxying featuregate.Feature = "WindowsEndpointSliceProxying" - // owner: @Huang-Wei - // alpha: v1.16 - // beta: v1.18 - // GA: v1.19 - // - // Schedule pods evenly across available topology domains. - EvenPodsSpread featuregate.Feature = "EvenPodsSpread" - // owner: @matthyx // alpha: v1.16 // beta: v1.18 @@ -552,6 +499,7 @@ const ( // owner: @deads2k // beta: v1.17 + // GA: v1.21 // // Enables the users to skip TLS verification of kubelets on pod logs requests AllowInsecureBackendProxy featuregate.Feature = "AllowInsecureBackendProxy" @@ -573,6 +521,12 @@ const ( // This feature is deprecated, and will be removed in v1.22. CronJobControllerV2 featuregate.Feature = "CronJobControllerV2" + // owner: @smarterclayton + // alpha: v1.21 + // + // DaemonSets allow workloads to maintain availability during update per node + DaemonSetUpdateSurge featuregate.Feature = "DaemonSetUpdateSurge" + // owner: @m1093782566 // alpha: v1.17 // @@ -589,7 +543,8 @@ const ( // owner: @wojtek-t // alpha: v1.18 - // beta: v1.19 + // beta: v1.19 + // ga: v1.21 // // Enables a feature to make secrets and configmaps data immutable. ImmutableEphemeralVolumes featuregate.Feature = "ImmutableEphemeralVolumes" @@ -605,6 +560,7 @@ const ( // owner: @derekwaynecarr // alpha: v1.20 + // beta: v1.21 (off by default until 1.22) // // Enables usage of hugepages- in downward API. DownwardAPIHugePages featuregate.Feature = "DownwardAPIHugePages" @@ -660,6 +616,7 @@ const ( // owner: @zshihang // alpha: v1.13 // beta: v1.20 + // ga: v1.21 // // Allows kube-controller-manager to publish kube-root-ca.crt configmap to // every namespace. This feature is a prerequisite of BoundServiceAccountTokenVolume. @@ -688,7 +645,7 @@ const ( // // Ensure kubelet respects exec probe timeouts. Feature gate exists in-case existing workloads // may depend on old behavior where exec probe timeouts were ignored. - // Lock to default in v1.21 and remove in v1.22. + // Lock to default and remove after v1.22 based on user feedback that should be reflected in KEP #1972 update ExecProbeTimeout featuregate.Feature = "ExecProbeTimeout" // owner: @andrewsykim @@ -699,6 +656,7 @@ const ( // owner: @zshihang // alpha: v1.20 + // beta: v1.21 // // Enable kubelet to pass pod's service account token to NodePublishVolume // call of CSI driver which is mounting volumes for that pod. @@ -706,6 +664,7 @@ const ( // owner: @bobbypage // alpha: v1.20 + // beta: v1.21 // Adds support for kubelet to detect node shutdown and gracefully terminate pods prior to the node being shutdown. GracefulNodeShutdown featuregate.Feature = "GracefulNodeShutdown" @@ -720,6 +679,82 @@ const ( // // Enables the usage of different protocols in the same Service with type=LoadBalancer MixedProtocolLBService featuregate.Feature = "MixedProtocolLBService" + + // owner: @cofyc + // alpha: v1.21 + VolumeCapacityPriority featuregate.Feature = "VolumeCapacityPriority" + + // owner: @ahg-g + // alpha: v1.21 + // + // Enables controlling pod ranking on replicaset scale-down. + PodDeletionCost featuregate.Feature = "PodDeletionCost" + + // owner: @robscott + // alpha: v1.21 + // + // Enables topology aware hints for EndpointSlices + TopologyAwareHints featuregate.Feature = "TopologyAwareHints" + + // owner: @ehashman + // alpha: v1.21 + // + // Allows user to override pod-level terminationGracePeriod for probes + ProbeTerminationGracePeriod featuregate.Feature = "ProbeTerminationGracePeriod" + + // owner: @ahg-g + // alpha: v1.21 + // + // Allow specifying NamespaceSelector in PodAffinityTerm. + PodAffinityNamespaceSelector featuregate.Feature = "PodAffinityNamespaceSelector" + + // owner: @andrewsykim @xudongliuharold + // alpha: v1.21 + // + // Enable support multiple Service "type: LoadBalancer" implementations in a cluster by specifying LoadBalancerClass + ServiceLoadBalancerClass featuregate.Feature = "ServiceLoadBalancerClass" + + // owner: @damemi + // aplpha: v1.21 + // + // Enables scaling down replicas via logarithmic comparison of creation/ready timestamps + LogarithmicScaleDown featuregate.Feature = "LogarithmicScaleDown" + + // owner: @hbagdi + // alpha: v1.21 + // + // Enable Scope and Namespace fields on IngressClassParametersReference. + IngressClassNamespacedParams featuregate.Feature = "IngressClassNamespacedParams" + + // owner: @maplain @andrewsykim + // alpha: v1.21 + // + // Enables node-local routing for Service internal traffic + ServiceInternalTrafficPolicy featuregate.Feature = "ServiceInternalTrafficPolicy" + + // owner: @adtac + // alpha: v1.21 + // + // Allows jobs to be created in the suspended state. + SuspendJob featuregate.Feature = "SuspendJob" + + // owner: @fromanirh + // alpha: v1.21 + // + // Enable POD resources API to return allocatable resources + KubeletPodResourcesGetAllocatable featuregate.Feature = "KubeletPodResourcesGetAllocatable" + + // owner: @jayunit100 @abhiraut @rikatz + // beta: v1.21 + // + // Labels all namespaces with a default label "kubernetes.io/metadata.name: " + NamespaceDefaultLabelName featuregate.Feature = "NamespaceDefaultLabelName" + + // owner: @fengzixu + // alpha: v1.21 + // + // Enables kubelet to detect CSI volume condition and send the event of the abnormal volume to the corresponding pod that is using it. + CSIVolumeHealth featuregate.Feature = "CSIVolumeHealth" ) func init() { @@ -733,86 +768,77 @@ var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureS AppArmor: {Default: true, PreRelease: featuregate.Beta}, DynamicKubeletConfig: {Default: true, PreRelease: featuregate.Beta}, ExperimentalHostUserNamespaceDefaultingGate: {Default: false, PreRelease: featuregate.Beta}, - DevicePlugins: {Default: true, PreRelease: featuregate.Beta}, - RotateKubeletServerCertificate: {Default: true, PreRelease: featuregate.Beta}, - RotateKubeletClientCertificate: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.20 - LocalStorageCapacityIsolation: {Default: true, PreRelease: featuregate.Beta}, - Sysctls: {Default: true, PreRelease: featuregate.Beta}, - EphemeralContainers: {Default: false, PreRelease: featuregate.Alpha}, - QOSReserved: {Default: false, PreRelease: featuregate.Alpha}, - ExpandPersistentVolumes: {Default: true, PreRelease: featuregate.Beta}, - ExpandInUsePersistentVolumes: {Default: true, PreRelease: featuregate.Beta}, - ExpandCSIVolumes: {Default: true, PreRelease: featuregate.Beta}, - AttachVolumeLimit: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.19 - CPUManager: {Default: true, PreRelease: featuregate.Beta}, - CPUCFSQuotaPeriod: {Default: false, PreRelease: featuregate.Alpha}, - TopologyManager: {Default: true, PreRelease: featuregate.Beta}, - ServiceNodeExclusion: {Default: true, PreRelease: featuregate.Beta}, - NodeDisruptionExclusion: {Default: true, PreRelease: featuregate.Beta}, - CSIDriverRegistry: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.20 - CSINodeInfo: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.19 - BlockVolume: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.20 - StorageObjectInUseProtection: {Default: true, PreRelease: featuregate.GA}, - SupportPodPidsLimit: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.23 - SupportNodePidsLimit: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.23 - HyperVContainer: {Default: false, PreRelease: featuregate.Deprecated}, - TokenRequest: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.21 - TokenRequestProjection: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.21 - BoundServiceAccountTokenVolume: {Default: false, PreRelease: featuregate.Alpha}, - ServiceAccountIssuerDiscovery: {Default: true, PreRelease: featuregate.Beta}, - CRIContainerLogRotation: {Default: true, PreRelease: featuregate.Beta}, - CSIMigration: {Default: true, PreRelease: featuregate.Beta}, - CSIMigrationGCE: {Default: false, PreRelease: featuregate.Beta}, // Off by default (requires GCE PD CSI Driver) - CSIMigrationGCEComplete: {Default: false, PreRelease: featuregate.Alpha}, - CSIMigrationAWS: {Default: false, PreRelease: featuregate.Beta}, // Off by default (requires AWS EBS CSI driver) - CSIMigrationAWSComplete: {Default: false, PreRelease: featuregate.Alpha}, - CSIMigrationAzureDisk: {Default: false, PreRelease: featuregate.Beta}, // Off by default (requires Azure Disk CSI driver) - CSIMigrationAzureDiskComplete: {Default: false, PreRelease: featuregate.Alpha}, - CSIMigrationAzureFile: {Default: false, PreRelease: featuregate.Alpha}, - CSIMigrationAzureFileComplete: {Default: false, PreRelease: featuregate.Alpha}, - CSIMigrationvSphere: {Default: false, PreRelease: featuregate.Beta}, - CSIMigrationvSphereComplete: {Default: false, PreRelease: featuregate.Beta}, - RunAsGroup: {Default: true, PreRelease: featuregate.Beta}, - CSIMigrationOpenStack: {Default: false, PreRelease: featuregate.Beta}, // Off by default (requires OpenStack Cinder CSI driver) - CSIMigrationOpenStackComplete: {Default: false, PreRelease: featuregate.Alpha}, - VolumeSubpath: {Default: true, PreRelease: featuregate.GA}, - ConfigurableFSGroupPolicy: {Default: true, PreRelease: featuregate.Beta}, - BalanceAttachedNodeVolumes: {Default: false, PreRelease: featuregate.Alpha}, - CSIBlockVolume: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.20 - CSIInlineVolume: {Default: true, PreRelease: featuregate.Beta}, - CSIStorageCapacity: {Default: false, PreRelease: featuregate.Alpha}, - CSIServiceAccountToken: {Default: false, PreRelease: featuregate.Alpha}, - GenericEphemeralVolume: {Default: false, PreRelease: featuregate.Alpha}, - CSIVolumeFSGroupPolicy: {Default: true, PreRelease: featuregate.Beta}, - RuntimeClass: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.23 - NodeLease: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, - SCTPSupport: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.22 - VolumeSnapshotDataSource: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.21 - ProcMountType: {Default: false, PreRelease: featuregate.Alpha}, - TTLAfterFinished: {Default: false, PreRelease: featuregate.Alpha}, - KubeletPodResources: {Default: true, PreRelease: featuregate.Beta}, - WindowsGMSA: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.20 - WindowsRunAsUserName: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.20 + DevicePlugins: {Default: true, PreRelease: featuregate.Beta}, + RotateKubeletServerCertificate: {Default: true, PreRelease: featuregate.Beta}, + LocalStorageCapacityIsolation: {Default: true, PreRelease: featuregate.Beta}, + Sysctls: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.23 + EphemeralContainers: {Default: false, PreRelease: featuregate.Alpha}, + QOSReserved: {Default: false, PreRelease: featuregate.Alpha}, + ExpandPersistentVolumes: {Default: true, PreRelease: featuregate.Beta}, + ExpandInUsePersistentVolumes: {Default: true, PreRelease: featuregate.Beta}, + ExpandCSIVolumes: {Default: true, PreRelease: featuregate.Beta}, + CPUManager: {Default: true, PreRelease: featuregate.Beta}, + MemoryManager: {Default: false, PreRelease: featuregate.Alpha}, + CPUCFSQuotaPeriod: {Default: false, PreRelease: featuregate.Alpha}, + TopologyManager: {Default: true, PreRelease: featuregate.Beta}, + ServiceNodeExclusion: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.22 + NodeDisruptionExclusion: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.22 + StorageObjectInUseProtection: {Default: true, PreRelease: featuregate.GA}, + SupportPodPidsLimit: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.23 + SupportNodePidsLimit: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.23 + BoundServiceAccountTokenVolume: {Default: false, PreRelease: featuregate.Beta}, // TODO(auth): investigate the impact of enabling this feature (https://bugzilla.redhat.com/show_bug.cgi?id=1946479) + ServiceAccountIssuerDiscovery: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.22 + CRIContainerLogRotation: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.22 + CSIMigration: {Default: true, PreRelease: featuregate.Beta}, + CSIMigrationGCE: {Default: false, PreRelease: featuregate.Beta}, // Off by default (requires GCE PD CSI Driver) + InTreePluginGCEUnregister: {Default: false, PreRelease: featuregate.Alpha}, + CSIMigrationAWS: {Default: false, PreRelease: featuregate.Beta}, // Off by default (requires AWS EBS CSI driver) + InTreePluginAWSUnregister: {Default: false, PreRelease: featuregate.Alpha}, + CSIMigrationAzureDisk: {Default: false, PreRelease: featuregate.Beta}, // Off by default (requires Azure Disk CSI driver) + InTreePluginAzureDiskUnregister: {Default: false, PreRelease: featuregate.Alpha}, + CSIMigrationAzureFile: {Default: false, PreRelease: featuregate.Beta}, // Off by default (requires Azure File CSI driver) + InTreePluginAzureFileUnregister: {Default: false, PreRelease: featuregate.Alpha}, + CSIMigrationvSphere: {Default: false, PreRelease: featuregate.Beta}, // Off by default (requires vSphere CSI driver) + CSIMigrationvSphereComplete: {Default: false, PreRelease: featuregate.Beta}, // remove in 1.22 + InTreePluginvSphereUnregister: {Default: false, PreRelease: featuregate.Alpha}, + CSIMigrationOpenStack: {Default: false, PreRelease: featuregate.Beta}, // OCP(storage team): force off by default, requires explicit opt-in via FeatureGate CR. Please until it's GA. https://github.com/openshift/enhancements/pull/549 + InTreePluginOpenStackUnregister: {Default: false, PreRelease: featuregate.Alpha}, + VolumeSubpath: {Default: true, PreRelease: featuregate.GA}, + ConfigurableFSGroupPolicy: {Default: true, PreRelease: featuregate.Beta}, + BalanceAttachedNodeVolumes: {Default: false, PreRelease: featuregate.Alpha}, + CSIInlineVolume: {Default: true, PreRelease: featuregate.Beta}, + CSIStorageCapacity: {Default: true, PreRelease: featuregate.Beta}, + CSIServiceAccountToken: {Default: true, PreRelease: featuregate.Beta}, + GenericEphemeralVolume: {Default: true, PreRelease: featuregate.Beta}, + CSIVolumeFSGroupPolicy: {Default: true, PreRelease: featuregate.Beta}, + RuntimeClass: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.23 + NodeLease: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, + SCTPSupport: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.22 + NetworkPolicyEndPort: {Default: false, PreRelease: featuregate.Alpha}, + VolumeSnapshotDataSource: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.21 + ProcMountType: {Default: false, PreRelease: featuregate.Alpha}, + TTLAfterFinished: {Default: true, PreRelease: featuregate.Beta}, + IndexedJob: {Default: false, PreRelease: featuregate.Alpha}, + KubeletPodResources: {Default: true, PreRelease: featuregate.Beta}, LocalStorageCapacityIsolationFSQuotaMonitoring: {Default: false, PreRelease: featuregate.Alpha}, NonPreemptingPriority: {Default: true, PreRelease: featuregate.Beta}, - VolumePVCDataSource: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.20 PodOverhead: {Default: true, PreRelease: featuregate.Beta}, - IPv6DualStack: {Default: false, PreRelease: featuregate.Alpha}, - EndpointSlice: {Default: true, PreRelease: featuregate.Beta}, + IPv6DualStack: {Default: true, PreRelease: featuregate.Beta}, + EndpointSlice: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.25 EndpointSliceProxying: {Default: true, PreRelease: featuregate.Beta}, EndpointSliceTerminatingCondition: {Default: false, PreRelease: featuregate.Alpha}, - EndpointSliceNodeName: {Default: false, PreRelease: featuregate.Alpha}, - WindowsEndpointSliceProxying: {Default: false, PreRelease: featuregate.Alpha}, - EvenPodsSpread: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.21 + EndpointSliceNodeName: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, //remove in 1.25 + WindowsEndpointSliceProxying: {Default: true, PreRelease: featuregate.Beta}, StartupProbe: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.23 - AllowInsecureBackendProxy: {Default: true, PreRelease: featuregate.Beta}, - PodDisruptionBudget: {Default: true, PreRelease: featuregate.Beta}, - CronJobControllerV2: {Default: false, PreRelease: featuregate.Alpha}, + AllowInsecureBackendProxy: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.23 + PodDisruptionBudget: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.25 + CronJobControllerV2: {Default: true, PreRelease: featuregate.Beta}, + DaemonSetUpdateSurge: {Default: false, PreRelease: featuregate.Alpha}, ServiceTopology: {Default: false, PreRelease: featuregate.Alpha}, ServiceAppProtocol: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, - ImmutableEphemeralVolumes: {Default: true, PreRelease: featuregate.Beta}, + ImmutableEphemeralVolumes: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.24 HugePageStorageMediumSize: {Default: true, PreRelease: featuregate.Beta}, - DownwardAPIHugePages: {Default: false, PreRelease: featuregate.Alpha}, + DownwardAPIHugePages: {Default: false, PreRelease: featuregate.Beta}, // on by default in 1.22 ExternalPolicyForExternalIP: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.22 AnyVolumeDataSource: {Default: false, PreRelease: featuregate.Alpha}, DefaultPodTopologySpread: {Default: true, PreRelease: featuregate.Beta}, @@ -821,13 +847,28 @@ var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureS WinDSR: {Default: false, PreRelease: featuregate.Alpha}, DisableAcceleratorUsageMetrics: {Default: true, PreRelease: featuregate.Beta}, HPAContainerMetrics: {Default: false, PreRelease: featuregate.Alpha}, - RootCAConfigMap: {Default: true, PreRelease: featuregate.Beta}, + RootCAConfigMap: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.22 SizeMemoryBackedVolumes: {Default: false, PreRelease: featuregate.Alpha}, - ExecProbeTimeout: {Default: true, PreRelease: featuregate.GA}, // lock to default in v1.21 and remove in v1.22 + ExecProbeTimeout: {Default: true, PreRelease: featuregate.GA}, // lock to default and remove after v1.22 based on KEP #1972 update KubeletCredentialProviders: {Default: false, PreRelease: featuregate.Alpha}, - GracefulNodeShutdown: {Default: false, PreRelease: featuregate.Alpha}, + GracefulNodeShutdown: {Default: true, PreRelease: featuregate.Beta}, ServiceLBNodePortControl: {Default: false, PreRelease: featuregate.Alpha}, MixedProtocolLBService: {Default: false, PreRelease: featuregate.Alpha}, + VolumeCapacityPriority: {Default: false, PreRelease: featuregate.Alpha}, + PreferNominatedNode: {Default: false, PreRelease: featuregate.Alpha}, + ProbeTerminationGracePeriod: {Default: false, PreRelease: featuregate.Alpha}, + RunAsGroup: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.22 + PodDeletionCost: {Default: false, PreRelease: featuregate.Alpha}, + TopologyAwareHints: {Default: false, PreRelease: featuregate.Alpha}, + PodAffinityNamespaceSelector: {Default: false, PreRelease: featuregate.Alpha}, + ServiceLoadBalancerClass: {Default: false, PreRelease: featuregate.Alpha}, + LogarithmicScaleDown: {Default: false, PreRelease: featuregate.Alpha}, + IngressClassNamespacedParams: {Default: false, PreRelease: featuregate.Alpha}, + ServiceInternalTrafficPolicy: {Default: false, PreRelease: featuregate.Alpha}, + SuspendJob: {Default: false, PreRelease: featuregate.Alpha}, + KubeletPodResourcesGetAllocatable: {Default: false, PreRelease: featuregate.Alpha}, + NamespaceDefaultLabelName: {Default: true, PreRelease: featuregate.Beta}, // graduate to GA and lock to default in 1.22, remove in 1.24 + CSIVolumeHealth: {Default: false, PreRelease: featuregate.Alpha}, // inherited features from generic apiserver, relisted here to get a conflict if it is changed // unintentionally on either side: @@ -844,5 +885,5 @@ var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureS // features that enable backwards compatibility but are scheduled to be removed // ... HPAScaleToZero: {Default: false, PreRelease: featuregate.Alpha}, - LegacyNodeRoleBehavior: {Default: true, PreRelease: featuregate.Beta}, + LegacyNodeRoleBehavior: {Default: false, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.22 } diff --git a/vendor/k8s.io/kubernetes/pkg/features/patch_kube_features.go b/vendor/k8s.io/kubernetes/pkg/features/patch_kube_features.go new file mode 100644 index 000000000000..f4f094f461c8 --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/features/patch_kube_features.go @@ -0,0 +1,30 @@ +package features + +import ( + "k8s.io/apimachinery/pkg/util/runtime" + utilfeature "k8s.io/apiserver/pkg/util/feature" + "k8s.io/component-base/featuregate" +) + +var ( + // owner: @jsafrane + // alpha: v1.21 + // + // Enables the AWS EBS CSI migration for the Attach/Detach controller (ADC) only. + ADCCSIMigrationAWS featuregate.Feature = "ADC_CSIMigrationAWS" + + // owner: @jsafrane + // alpha: v1.21 + // + // Enables the Cinder CSI migration for the Attach/Detach controller (ADC) only. + ADCCSIMigrationCinder featuregate.Feature = "ADC_CSIMigrationCinder" +) + +var ocpDefaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureSpec{ + ADCCSIMigrationAWS: {Default: true, PreRelease: featuregate.Beta}, + ADCCSIMigrationCinder: {Default: true, PreRelease: featuregate.Beta}, +} + +func init() { + runtime.Must(utilfeature.DefaultMutableFeatureGate.Add(ocpDefaultKubernetesFeatureGates)) +} diff --git a/vendor/k8s.io/kubernetes/pkg/fieldpath/BUILD b/vendor/k8s.io/kubernetes/pkg/fieldpath/BUILD deleted file mode 100644 index 025831118c2c..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/fieldpath/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fieldpath.go", - ], - importpath = "k8s.io/kubernetes/pkg/fieldpath", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["fieldpath_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/generated/openapi/BUILD b/vendor/k8s.io/kubernetes/pkg/generated/openapi/BUILD deleted file mode 100644 index 63213ff5986a..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/generated/openapi/BUILD +++ /dev/null @@ -1,47 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load("//build:code_generation.bzl", "gen_openapi", "openapi_deps") -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -gen_openapi( - outs = ["zz_generated.openapi.go"], - exclude_pkgs = [ - "staging/src/k8s.io/code-generator", - "staging/src/k8s.io/sample-apiserver", - ], - output_pkg = "k8s.io/kubernetes/pkg/generated/openapi", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "zz_generated.openapi.go", - ], - importpath = "k8s.io/kubernetes/pkg/generated/openapi", - deps = openapi_deps(), # keep -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["openapi_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//vendor/github.com/go-openapi/spec:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/handler:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/generated/openapi/zz_generated.openapi.go b/vendor/k8s.io/kubernetes/pkg/generated/openapi/zz_generated.openapi.go index d73fc2100816..e9792e587703 100644 --- a/vendor/k8s.io/kubernetes/pkg/generated/openapi/zz_generated.openapi.go +++ b/vendor/k8s.io/kubernetes/pkg/generated/openapi/zz_generated.openapi.go @@ -241,23 +241,22 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "k8s.io/api/autoscaling/v2beta2.PodsMetricStatus": schema_k8sio_api_autoscaling_v2beta2_PodsMetricStatus(ref), "k8s.io/api/autoscaling/v2beta2.ResourceMetricSource": schema_k8sio_api_autoscaling_v2beta2_ResourceMetricSource(ref), "k8s.io/api/autoscaling/v2beta2.ResourceMetricStatus": schema_k8sio_api_autoscaling_v2beta2_ResourceMetricStatus(ref), + "k8s.io/api/batch/v1.CronJob": schema_k8sio_api_batch_v1_CronJob(ref), + "k8s.io/api/batch/v1.CronJobList": schema_k8sio_api_batch_v1_CronJobList(ref), + "k8s.io/api/batch/v1.CronJobSpec": schema_k8sio_api_batch_v1_CronJobSpec(ref), + "k8s.io/api/batch/v1.CronJobStatus": schema_k8sio_api_batch_v1_CronJobStatus(ref), "k8s.io/api/batch/v1.Job": schema_k8sio_api_batch_v1_Job(ref), "k8s.io/api/batch/v1.JobCondition": schema_k8sio_api_batch_v1_JobCondition(ref), "k8s.io/api/batch/v1.JobList": schema_k8sio_api_batch_v1_JobList(ref), "k8s.io/api/batch/v1.JobSpec": schema_k8sio_api_batch_v1_JobSpec(ref), "k8s.io/api/batch/v1.JobStatus": schema_k8sio_api_batch_v1_JobStatus(ref), + "k8s.io/api/batch/v1.JobTemplateSpec": schema_k8sio_api_batch_v1_JobTemplateSpec(ref), "k8s.io/api/batch/v1beta1.CronJob": schema_k8sio_api_batch_v1beta1_CronJob(ref), "k8s.io/api/batch/v1beta1.CronJobList": schema_k8sio_api_batch_v1beta1_CronJobList(ref), "k8s.io/api/batch/v1beta1.CronJobSpec": schema_k8sio_api_batch_v1beta1_CronJobSpec(ref), "k8s.io/api/batch/v1beta1.CronJobStatus": schema_k8sio_api_batch_v1beta1_CronJobStatus(ref), "k8s.io/api/batch/v1beta1.JobTemplate": schema_k8sio_api_batch_v1beta1_JobTemplate(ref), "k8s.io/api/batch/v1beta1.JobTemplateSpec": schema_k8sio_api_batch_v1beta1_JobTemplateSpec(ref), - "k8s.io/api/batch/v2alpha1.CronJob": schema_k8sio_api_batch_v2alpha1_CronJob(ref), - "k8s.io/api/batch/v2alpha1.CronJobList": schema_k8sio_api_batch_v2alpha1_CronJobList(ref), - "k8s.io/api/batch/v2alpha1.CronJobSpec": schema_k8sio_api_batch_v2alpha1_CronJobSpec(ref), - "k8s.io/api/batch/v2alpha1.CronJobStatus": schema_k8sio_api_batch_v2alpha1_CronJobStatus(ref), - "k8s.io/api/batch/v2alpha1.JobTemplate": schema_k8sio_api_batch_v2alpha1_JobTemplate(ref), - "k8s.io/api/batch/v2alpha1.JobTemplateSpec": schema_k8sio_api_batch_v2alpha1_JobTemplateSpec(ref), "k8s.io/api/certificates/v1.CertificateSigningRequest": schema_k8sio_api_certificates_v1_CertificateSigningRequest(ref), "k8s.io/api/certificates/v1.CertificateSigningRequestCondition": schema_k8sio_api_certificates_v1_CertificateSigningRequestCondition(ref), "k8s.io/api/certificates/v1.CertificateSigningRequestList": schema_k8sio_api_certificates_v1_CertificateSigningRequestList(ref), @@ -481,16 +480,20 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "k8s.io/api/core/v1.VsphereVirtualDiskVolumeSource": schema_k8sio_api_core_v1_VsphereVirtualDiskVolumeSource(ref), "k8s.io/api/core/v1.WeightedPodAffinityTerm": schema_k8sio_api_core_v1_WeightedPodAffinityTerm(ref), "k8s.io/api/core/v1.WindowsSecurityContextOptions": schema_k8sio_api_core_v1_WindowsSecurityContextOptions(ref), - "k8s.io/api/discovery/v1alpha1.Endpoint": schema_k8sio_api_discovery_v1alpha1_Endpoint(ref), - "k8s.io/api/discovery/v1alpha1.EndpointConditions": schema_k8sio_api_discovery_v1alpha1_EndpointConditions(ref), - "k8s.io/api/discovery/v1alpha1.EndpointPort": schema_k8sio_api_discovery_v1alpha1_EndpointPort(ref), - "k8s.io/api/discovery/v1alpha1.EndpointSlice": schema_k8sio_api_discovery_v1alpha1_EndpointSlice(ref), - "k8s.io/api/discovery/v1alpha1.EndpointSliceList": schema_k8sio_api_discovery_v1alpha1_EndpointSliceList(ref), + "k8s.io/api/discovery/v1.Endpoint": schema_k8sio_api_discovery_v1_Endpoint(ref), + "k8s.io/api/discovery/v1.EndpointConditions": schema_k8sio_api_discovery_v1_EndpointConditions(ref), + "k8s.io/api/discovery/v1.EndpointHints": schema_k8sio_api_discovery_v1_EndpointHints(ref), + "k8s.io/api/discovery/v1.EndpointPort": schema_k8sio_api_discovery_v1_EndpointPort(ref), + "k8s.io/api/discovery/v1.EndpointSlice": schema_k8sio_api_discovery_v1_EndpointSlice(ref), + "k8s.io/api/discovery/v1.EndpointSliceList": schema_k8sio_api_discovery_v1_EndpointSliceList(ref), + "k8s.io/api/discovery/v1.ForZone": schema_k8sio_api_discovery_v1_ForZone(ref), "k8s.io/api/discovery/v1beta1.Endpoint": schema_k8sio_api_discovery_v1beta1_Endpoint(ref), "k8s.io/api/discovery/v1beta1.EndpointConditions": schema_k8sio_api_discovery_v1beta1_EndpointConditions(ref), + "k8s.io/api/discovery/v1beta1.EndpointHints": schema_k8sio_api_discovery_v1beta1_EndpointHints(ref), "k8s.io/api/discovery/v1beta1.EndpointPort": schema_k8sio_api_discovery_v1beta1_EndpointPort(ref), "k8s.io/api/discovery/v1beta1.EndpointSlice": schema_k8sio_api_discovery_v1beta1_EndpointSlice(ref), "k8s.io/api/discovery/v1beta1.EndpointSliceList": schema_k8sio_api_discovery_v1beta1_EndpointSliceList(ref), + "k8s.io/api/discovery/v1beta1.ForZone": schema_k8sio_api_discovery_v1beta1_ForZone(ref), "k8s.io/api/events/v1.Event": schema_k8sio_api_events_v1_Event(ref), "k8s.io/api/events/v1.EventList": schema_k8sio_api_events_v1_EventList(ref), "k8s.io/api/events/v1.EventSeries": schema_k8sio_api_events_v1_EventSeries(ref), @@ -608,6 +611,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "k8s.io/api/networking/v1.IngressBackend": schema_k8sio_api_networking_v1_IngressBackend(ref), "k8s.io/api/networking/v1.IngressClass": schema_k8sio_api_networking_v1_IngressClass(ref), "k8s.io/api/networking/v1.IngressClassList": schema_k8sio_api_networking_v1_IngressClassList(ref), + "k8s.io/api/networking/v1.IngressClassParametersReference": schema_k8sio_api_networking_v1_IngressClassParametersReference(ref), "k8s.io/api/networking/v1.IngressClassSpec": schema_k8sio_api_networking_v1_IngressClassSpec(ref), "k8s.io/api/networking/v1.IngressList": schema_k8sio_api_networking_v1_IngressList(ref), "k8s.io/api/networking/v1.IngressRule": schema_k8sio_api_networking_v1_IngressRule(ref), @@ -630,6 +634,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "k8s.io/api/networking/v1beta1.IngressBackend": schema_k8sio_api_networking_v1beta1_IngressBackend(ref), "k8s.io/api/networking/v1beta1.IngressClass": schema_k8sio_api_networking_v1beta1_IngressClass(ref), "k8s.io/api/networking/v1beta1.IngressClassList": schema_k8sio_api_networking_v1beta1_IngressClassList(ref), + "k8s.io/api/networking/v1beta1.IngressClassParametersReference": schema_k8sio_api_networking_v1beta1_IngressClassParametersReference(ref), "k8s.io/api/networking/v1beta1.IngressClassSpec": schema_k8sio_api_networking_v1beta1_IngressClassSpec(ref), "k8s.io/api/networking/v1beta1.IngressList": schema_k8sio_api_networking_v1beta1_IngressList(ref), "k8s.io/api/networking/v1beta1.IngressRule": schema_k8sio_api_networking_v1beta1_IngressRule(ref), @@ -650,6 +655,10 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "k8s.io/api/node/v1beta1.RuntimeClass": schema_k8sio_api_node_v1beta1_RuntimeClass(ref), "k8s.io/api/node/v1beta1.RuntimeClassList": schema_k8sio_api_node_v1beta1_RuntimeClassList(ref), "k8s.io/api/node/v1beta1.Scheduling": schema_k8sio_api_node_v1beta1_Scheduling(ref), + "k8s.io/api/policy/v1.PodDisruptionBudget": schema_k8sio_api_policy_v1_PodDisruptionBudget(ref), + "k8s.io/api/policy/v1.PodDisruptionBudgetList": schema_k8sio_api_policy_v1_PodDisruptionBudgetList(ref), + "k8s.io/api/policy/v1.PodDisruptionBudgetSpec": schema_k8sio_api_policy_v1_PodDisruptionBudgetSpec(ref), + "k8s.io/api/policy/v1.PodDisruptionBudgetStatus": schema_k8sio_api_policy_v1_PodDisruptionBudgetStatus(ref), "k8s.io/api/policy/v1beta1.AllowedCSIDriver": schema_k8sio_api_policy_v1beta1_AllowedCSIDriver(ref), "k8s.io/api/policy/v1beta1.AllowedFlexVolume": schema_k8sio_api_policy_v1beta1_AllowedFlexVolume(ref), "k8s.io/api/policy/v1beta1.AllowedHostPath": schema_k8sio_api_policy_v1beta1_AllowedHostPath(ref), @@ -743,6 +752,8 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "k8s.io/api/storage/v1beta1.CSINodeDriver": schema_k8sio_api_storage_v1beta1_CSINodeDriver(ref), "k8s.io/api/storage/v1beta1.CSINodeList": schema_k8sio_api_storage_v1beta1_CSINodeList(ref), "k8s.io/api/storage/v1beta1.CSINodeSpec": schema_k8sio_api_storage_v1beta1_CSINodeSpec(ref), + "k8s.io/api/storage/v1beta1.CSIStorageCapacity": schema_k8sio_api_storage_v1beta1_CSIStorageCapacity(ref), + "k8s.io/api/storage/v1beta1.CSIStorageCapacityList": schema_k8sio_api_storage_v1beta1_CSIStorageCapacityList(ref), "k8s.io/api/storage/v1beta1.StorageClass": schema_k8sio_api_storage_v1beta1_StorageClass(ref), "k8s.io/api/storage/v1beta1.StorageClassList": schema_k8sio_api_storage_v1beta1_StorageClassList(ref), "k8s.io/api/storage/v1beta1.TokenRequest": schema_k8sio_api_storage_v1beta1_TokenRequest(ref), @@ -809,11 +820,11 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "k8s.io/apimachinery/pkg/apis/meta/v1.APIResource": schema_pkg_apis_meta_v1_APIResource(ref), "k8s.io/apimachinery/pkg/apis/meta/v1.APIResourceList": schema_pkg_apis_meta_v1_APIResourceList(ref), "k8s.io/apimachinery/pkg/apis/meta/v1.APIVersions": schema_pkg_apis_meta_v1_APIVersions(ref), + "k8s.io/apimachinery/pkg/apis/meta/v1.ApplyOptions": schema_pkg_apis_meta_v1_ApplyOptions(ref), "k8s.io/apimachinery/pkg/apis/meta/v1.Condition": schema_pkg_apis_meta_v1_Condition(ref), "k8s.io/apimachinery/pkg/apis/meta/v1.CreateOptions": schema_pkg_apis_meta_v1_CreateOptions(ref), "k8s.io/apimachinery/pkg/apis/meta/v1.DeleteOptions": schema_pkg_apis_meta_v1_DeleteOptions(ref), "k8s.io/apimachinery/pkg/apis/meta/v1.Duration": schema_pkg_apis_meta_v1_Duration(ref), - "k8s.io/apimachinery/pkg/apis/meta/v1.ExportOptions": schema_pkg_apis_meta_v1_ExportOptions(ref), "k8s.io/apimachinery/pkg/apis/meta/v1.FieldsV1": schema_pkg_apis_meta_v1_FieldsV1(ref), "k8s.io/apimachinery/pkg/apis/meta/v1.GetOptions": schema_pkg_apis_meta_v1_GetOptions(ref), "k8s.io/apimachinery/pkg/apis/meta/v1.GroupKind": schema_pkg_apis_meta_v1_GroupKind(ref), @@ -983,6 +994,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "k8s.io/kubelet/config/v1beta1.KubeletWebhookAuthentication": schema_k8sio_kubelet_config_v1beta1_KubeletWebhookAuthentication(ref), "k8s.io/kubelet/config/v1beta1.KubeletWebhookAuthorization": schema_k8sio_kubelet_config_v1beta1_KubeletWebhookAuthorization(ref), "k8s.io/kubelet/config/v1beta1.KubeletX509Authentication": schema_k8sio_kubelet_config_v1beta1_KubeletX509Authentication(ref), + "k8s.io/kubelet/config/v1beta1.MemoryReservation": schema_k8sio_kubelet_config_v1beta1_MemoryReservation(ref), "k8s.io/kubelet/config/v1beta1.SerializedNodeConfigSource": schema_k8sio_kubelet_config_v1beta1_SerializedNodeConfigSource(ref), "k8s.io/kubernetes/pkg/apis/abac/v1beta1.Policy": schema_pkg_apis_abac_v1beta1_Policy(ref), "k8s.io/kubernetes/pkg/apis/abac/v1beta1.PolicySpec": schema_pkg_apis_abac_v1beta1_PolicySpec(ref), @@ -1072,7 +1084,7 @@ func schema_k8sio_api_admissionregistration_v1_MutatingWebhook(ref common.Refere }, "sideEffects": { SchemaProps: spec.SchemaProps{ - Description: "SideEffects states whether this webhook has side effects. Acceptable values are: None, NoneOnDryRun (webhooks created via v1beta1 may also specify Some or Unknown). Webhooks with side effects MUST implement a reconciliation system, since a request may be rejected by a future step in the admission change and the side effects therefore need to be undone. Requests with the dryRun attribute will be auto-rejected if they match a webhook with sideEffects == Unknown or Some.", + Description: "SideEffects states whether this webhook has side effects. Acceptable values are: None, NoneOnDryRun (webhooks created via v1beta1 may also specify Some or Unknown). Webhooks with side effects MUST implement a reconciliation system, since a request may be rejected by a future step in the admission chain and the side effects therefore need to be undone. Requests with the dryRun attribute will be auto-rejected if they match a webhook with sideEffects == Unknown or Some.", Type: []string{"string"}, Format: "", }, @@ -1475,7 +1487,7 @@ func schema_k8sio_api_admissionregistration_v1_ValidatingWebhook(ref common.Refe }, "sideEffects": { SchemaProps: spec.SchemaProps{ - Description: "SideEffects states whether this webhook has side effects. Acceptable values are: None, NoneOnDryRun (webhooks created via v1beta1 may also specify Some or Unknown). Webhooks with side effects MUST implement a reconciliation system, since a request may be rejected by a future step in the admission change and the side effects therefore need to be undone. Requests with the dryRun attribute will be auto-rejected if they match a webhook with sideEffects == Unknown or Some.", + Description: "SideEffects states whether this webhook has side effects. Acceptable values are: None, NoneOnDryRun (webhooks created via v1beta1 may also specify Some or Unknown). Webhooks with side effects MUST implement a reconciliation system, since a request may be rejected by a future step in the admission chain and the side effects therefore need to be undone. Requests with the dryRun attribute will be auto-rejected if they match a webhook with sideEffects == Unknown or Some.", Type: []string{"string"}, Format: "", }, @@ -1717,7 +1729,7 @@ func schema_k8sio_api_admissionregistration_v1beta1_MutatingWebhook(ref common.R }, "sideEffects": { SchemaProps: spec.SchemaProps{ - Description: "SideEffects states whether this webhook has side effects. Acceptable values are: Unknown, None, Some, NoneOnDryRun Webhooks with side effects MUST implement a reconciliation system, since a request may be rejected by a future step in the admission change and the side effects therefore need to be undone. Requests with the dryRun attribute will be auto-rejected if they match a webhook with sideEffects == Unknown or Some. Defaults to Unknown.", + Description: "SideEffects states whether this webhook has side effects. Acceptable values are: Unknown, None, Some, NoneOnDryRun Webhooks with side effects MUST implement a reconciliation system, since a request may be rejected by a future step in the admission chain and the side effects therefore need to be undone. Requests with the dryRun attribute will be auto-rejected if they match a webhook with sideEffects == Unknown or Some. Defaults to Unknown.", Type: []string{"string"}, Format: "", }, @@ -2120,7 +2132,7 @@ func schema_k8sio_api_admissionregistration_v1beta1_ValidatingWebhook(ref common }, "sideEffects": { SchemaProps: spec.SchemaProps{ - Description: "SideEffects states whether this webhook has side effects. Acceptable values are: Unknown, None, Some, NoneOnDryRun Webhooks with side effects MUST implement a reconciliation system, since a request may be rejected by a future step in the admission change and the side effects therefore need to be undone. Requests with the dryRun attribute will be auto-rejected if they match a webhook with sideEffects == Unknown or Some. Defaults to Unknown.", + Description: "SideEffects states whether this webhook has side effects. Acceptable values are: Unknown, None, Some, NoneOnDryRun Webhooks with side effects MUST implement a reconciliation system, since a request may be rejected by a future step in the admission chain and the side effects therefore need to be undone. Requests with the dryRun attribute will be auto-rejected if they match a webhook with sideEffects == Unknown or Some. Defaults to Unknown.", Type: []string{"string"}, Format: "", }, @@ -3648,7 +3660,13 @@ func schema_k8sio_api_apps_v1_RollingUpdateDaemonSet(ref common.ReferenceCallbac Properties: map[string]spec.Schema{ "maxUnavailable": { SchemaProps: spec.SchemaProps{ - Description: "The maximum number of DaemonSet pods that can be unavailable during the update. Value can be an absolute number (ex: 5) or a percentage of total number of DaemonSet pods at the start of the update (ex: 10%). Absolute number is calculated from percentage by rounding up. This cannot be 0. Default value is 1. Example: when this is set to 30%, at most 30% of the total number of nodes that should be running the daemon pod (i.e. status.desiredNumberScheduled) can have their pods stopped for an update at any given time. The update starts by stopping at most 30% of those DaemonSet pods and then brings up new DaemonSet pods in their place. Once the new pods are available, it then proceeds onto other DaemonSet pods, thus ensuring that at least 70% of original number of DaemonSet pods are available at all times during the update.", + Description: "The maximum number of DaemonSet pods that can be unavailable during the update. Value can be an absolute number (ex: 5) or a percentage of total number of DaemonSet pods at the start of the update (ex: 10%). Absolute number is calculated from percentage by rounding down to a minimum of one. This cannot be 0 if MaxSurge is 0 Default value is 1. Example: when this is set to 30%, at most 30% of the total number of nodes that should be running the daemon pod (i.e. status.desiredNumberScheduled) can have their pods stopped for an update at any given time. The update starts by stopping at most 30% of those DaemonSet pods and then brings up new DaemonSet pods in their place. Once the new pods are available, it then proceeds onto other DaemonSet pods, thus ensuring that at least 70% of original number of DaemonSet pods are available at all times during the update.", + Ref: ref("k8s.io/apimachinery/pkg/util/intstr.IntOrString"), + }, + }, + "maxSurge": { + SchemaProps: spec.SchemaProps{ + Description: "The maximum number of nodes with an existing available DaemonSet pod that can have an updated DaemonSet pod during during an update. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). This can not be 0 if MaxUnavailable is 0. Absolute number is calculated from percentage by rounding up to a minimum of 1. Default value is 0. Example: when this is set to 30%, at most 30% of the total number of nodes that should be running the daemon pod (i.e. status.desiredNumberScheduled) can have their a new pod created before the old pod is marked as deleted. The update starts by launching new pods on 30% of nodes. Once an updated pod is available (Ready for at least minReadySeconds) the old DaemonSet pod on that node is marked deleted. If the old pod becomes unavailable for any reason (Ready transitions to false, is evicted, or is drained) an updated pod is immediatedly created on that node without considering surge limits. Allowing surge implies the possibility that the resources consumed by the daemonset on any given node can double if the readiness check fails, and so resource intensive daemonsets should take into account that they may cause evictions during disruption. This is an alpha field and requires enabling DaemonSetUpdateSurge feature gate.", Ref: ref("k8s.io/apimachinery/pkg/util/intstr.IntOrString"), }, }, @@ -6175,7 +6193,13 @@ func schema_k8sio_api_apps_v1beta2_RollingUpdateDaemonSet(ref common.ReferenceCa Properties: map[string]spec.Schema{ "maxUnavailable": { SchemaProps: spec.SchemaProps{ - Description: "The maximum number of DaemonSet pods that can be unavailable during the update. Value can be an absolute number (ex: 5) or a percentage of total number of DaemonSet pods at the start of the update (ex: 10%). Absolute number is calculated from percentage by rounding up. This cannot be 0. Default value is 1. Example: when this is set to 30%, at most 30% of the total number of nodes that should be running the daemon pod (i.e. status.desiredNumberScheduled) can have their pods stopped for an update at any given time. The update starts by stopping at most 30% of those DaemonSet pods and then brings up new DaemonSet pods in their place. Once the new pods are available, it then proceeds onto other DaemonSet pods, thus ensuring that at least 70% of original number of DaemonSet pods are available at all times during the update.", + Description: "The maximum number of DaemonSet pods that can be unavailable during the update. Value can be an absolute number (ex: 5) or a percentage of total number of DaemonSet pods at the start of the update (ex: 10%). Absolute number is calculated from percentage by rounding down to a minimum of one. This cannot be 0 if MaxSurge is 0 Default value is 1. Example: when this is set to 30%, at most 30% of the total number of nodes that should be running the daemon pod (i.e. status.desiredNumberScheduled) can have their pods stopped for an update at any given time. The update starts by stopping at most 30% of those DaemonSet pods and then brings up new DaemonSet pods in their place. Once the new pods are available, it then proceeds onto other DaemonSet pods, thus ensuring that at least 70% of original number of DaemonSet pods are available at all times during the update.", + Ref: ref("k8s.io/apimachinery/pkg/util/intstr.IntOrString"), + }, + }, + "maxSurge": { + SchemaProps: spec.SchemaProps{ + Description: "The maximum number of nodes with an existing available DaemonSet pod that can have an updated DaemonSet pod during during an update. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). This can not be 0 if MaxUnavailable is 0. Absolute number is calculated from percentage by rounding up to a minimum of 1. Default value is 0. Example: when this is set to 30%, at most 30% of the total number of nodes that should be running the daemon pod (i.e. status.desiredNumberScheduled) can have their a new pod created before the old pod is marked as deleted. The update starts by launching new pods on 30% of nodes. Once an updated pod is available (Ready for at least minReadySeconds) the old DaemonSet pod on that node is marked deleted. If the old pod becomes unavailable for any reason (Ready transitions to false, is evicted, or is drained) an updated pod is immediatedly created on that node without considering surge limits. Allowing surge implies the possibility that the resources consumed by the daemonset on any given node can double if the readiness check fails, and so resource intensive daemonsets should take into account that they may cause evictions during disruption. This is an alpha field and requires enabling DaemonSetUpdateSurge feature gate.", Ref: ref("k8s.io/apimachinery/pkg/util/intstr.IntOrString"), }, }, @@ -11280,6 +11304,219 @@ func schema_k8sio_api_autoscaling_v2beta2_ResourceMetricStatus(ref common.Refere } } +func schema_k8sio_api_batch_v1_CronJob(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "CronJob represents the configuration of a single cron job.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "kind": { + SchemaProps: spec.SchemaProps{ + Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + Type: []string{"string"}, + Format: "", + }, + }, + "apiVersion": { + SchemaProps: spec.SchemaProps{ + Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + Type: []string{"string"}, + Format: "", + }, + }, + "metadata": { + SchemaProps: spec.SchemaProps{ + Description: "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), + }, + }, + "spec": { + SchemaProps: spec.SchemaProps{ + Description: "Specification of the desired behavior of a cron job, including the schedule. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status", + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/batch/v1.CronJobSpec"), + }, + }, + "status": { + SchemaProps: spec.SchemaProps{ + Description: "Current status of a cron job. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status", + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/batch/v1.CronJobStatus"), + }, + }, + }, + }, + }, + Dependencies: []string{ + "k8s.io/api/batch/v1.CronJobSpec", "k8s.io/api/batch/v1.CronJobStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + } +} + +func schema_k8sio_api_batch_v1_CronJobList(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "CronJobList is a collection of cron jobs.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "kind": { + SchemaProps: spec.SchemaProps{ + Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + Type: []string{"string"}, + Format: "", + }, + }, + "apiVersion": { + SchemaProps: spec.SchemaProps{ + Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + Type: []string{"string"}, + Format: "", + }, + }, + "metadata": { + SchemaProps: spec.SchemaProps{ + Description: "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"), + }, + }, + "items": { + SchemaProps: spec.SchemaProps{ + Description: "items is the list of CronJobs.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/batch/v1.CronJob"), + }, + }, + }, + }, + }, + }, + Required: []string{"items"}, + }, + }, + Dependencies: []string{ + "k8s.io/api/batch/v1.CronJob", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, + } +} + +func schema_k8sio_api_batch_v1_CronJobSpec(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "CronJobSpec describes how the job execution will look like and when it will actually run.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "schedule": { + SchemaProps: spec.SchemaProps{ + Description: "The schedule in Cron format, see https://en.wikipedia.org/wiki/Cron.", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "startingDeadlineSeconds": { + SchemaProps: spec.SchemaProps{ + Description: "Optional deadline in seconds for starting the job if it misses scheduled time for any reason. Missed jobs executions will be counted as failed ones.", + Type: []string{"integer"}, + Format: "int64", + }, + }, + "concurrencyPolicy": { + SchemaProps: spec.SchemaProps{ + Description: "Specifies how to treat concurrent executions of a Job. Valid values are: - \"Allow\" (default): allows CronJobs to run concurrently; - \"Forbid\": forbids concurrent runs, skipping next run if previous run hasn't finished yet; - \"Replace\": cancels currently running job and replaces it with a new one", + Type: []string{"string"}, + Format: "", + }, + }, + "suspend": { + SchemaProps: spec.SchemaProps{ + Description: "This flag tells the controller to suspend subsequent executions, it does not apply to already started executions. Defaults to false.", + Type: []string{"boolean"}, + Format: "", + }, + }, + "jobTemplate": { + SchemaProps: spec.SchemaProps{ + Description: "Specifies the job that will be created when executing a CronJob.", + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/batch/v1.JobTemplateSpec"), + }, + }, + "successfulJobsHistoryLimit": { + SchemaProps: spec.SchemaProps{ + Description: "The number of successful finished jobs to retain. Value must be non-negative integer. Defaults to 3.", + Type: []string{"integer"}, + Format: "int32", + }, + }, + "failedJobsHistoryLimit": { + SchemaProps: spec.SchemaProps{ + Description: "The number of failed finished jobs to retain. Value must be non-negative integer. Defaults to 1.", + Type: []string{"integer"}, + Format: "int32", + }, + }, + }, + Required: []string{"schedule", "jobTemplate"}, + }, + }, + Dependencies: []string{ + "k8s.io/api/batch/v1.JobTemplateSpec"}, + } +} + +func schema_k8sio_api_batch_v1_CronJobStatus(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "CronJobStatus represents the current state of a cron job.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "active": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-type": "atomic", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "A list of pointers to currently running jobs.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/core/v1.ObjectReference"), + }, + }, + }, + }, + }, + "lastScheduleTime": { + SchemaProps: spec.SchemaProps{ + Description: "Information when was the last time the job was successfully scheduled.", + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), + }, + }, + "lastSuccessfulTime": { + SchemaProps: spec.SchemaProps{ + Description: "Information when was the last time the job successfully completed.", + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), + }, + }, + }, + }, + }, + Dependencies: []string{ + "k8s.io/api/core/v1.ObjectReference", "k8s.io/apimachinery/pkg/apis/meta/v1.Time"}, + } +} + func schema_k8sio_api_batch_v1_Job(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -11464,7 +11701,7 @@ func schema_k8sio_api_batch_v1_JobSpec(ref common.ReferenceCallback) common.Open }, "activeDeadlineSeconds": { SchemaProps: spec.SchemaProps{ - Description: "Specifies the duration in seconds relative to the startTime that the job may be active before the system tries to terminate it; value must be positive integer", + Description: "Specifies the duration in seconds relative to the startTime that the job may be continuously active before the system tries to terminate it; value must be positive integer. If a Job is suspended (at creation or through an update), this timer will effectively be stopped and reset when the Job is resumed again.", Type: []string{"integer"}, Format: "int64", }, @@ -11503,6 +11740,20 @@ func schema_k8sio_api_batch_v1_JobSpec(ref common.ReferenceCallback) common.Open Format: "int32", }, }, + "completionMode": { + SchemaProps: spec.SchemaProps{ + Description: "CompletionMode specifies how Pod completions are tracked. It can be `NonIndexed` (default) or `Indexed`.\n\n`NonIndexed` means that the Job is considered complete when there have been .spec.completions successfully completed Pods. Each Pod completion is homologous to each other.\n\n`Indexed` means that the Pods of a Job get an associated completion index from 0 to (.spec.completions - 1), available in the annotation batch.kubernetes.io/job-completion-index. The Job is considered complete when there is one successfully completed Pod for each index. When value is `Indexed`, .spec.completions must be specified and `.spec.parallelism` must be less than or equal to 10^5.\n\nThis field is alpha-level and is only honored by servers that enable the IndexedJob feature gate. More completion modes can be added in the future. If the Job controller observes a mode that it doesn't recognize, the controller skips updates for the Job.", + Type: []string{"string"}, + Format: "", + }, + }, + "suspend": { + SchemaProps: spec.SchemaProps{ + Description: "Suspend specifies whether the Job controller should create Pods or not. If a Job is created with suspend set to true, no Pods are created by the Job controller. If a Job is suspended after creation (i.e. the flag goes from false to true), the Job controller will delete all active Pods associated with this Job. Users must design their workload to gracefully handle this. Suspending a Job will reset the StartTime field of the Job, effectively resetting the ActiveDeadlineSeconds timer too. This is an alpha field and requires the SuspendJob feature gate to be enabled; otherwise this field may not be set to true. Defaults to false.", + Type: []string{"boolean"}, + Format: "", + }, + }, }, Required: []string{"template"}, }, @@ -11522,12 +11773,13 @@ func schema_k8sio_api_batch_v1_JobStatus(ref common.ReferenceCallback) common.Op "conditions": { VendorExtensible: spec.VendorExtensible{ Extensions: spec.Extensions{ + "x-kubernetes-list-type": "atomic", "x-kubernetes-patch-merge-key": "type", "x-kubernetes-patch-strategy": "merge", }, }, SchemaProps: spec.SchemaProps{ - Description: "The latest available observations of an object's current state. When a job fails, one of the conditions will have type == \"Failed\". More info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/", + Description: "The latest available observations of an object's current state. When a Job fails, one of the conditions will have type \"Failed\" and status true. When a Job is suspended, one of the conditions will have type \"Suspended\" and status true; when the Job is resumed, the status of this condition will become false. When a Job is completed, one of the conditions will have type \"Complete\" and status true. More info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ @@ -11541,7 +11793,7 @@ func schema_k8sio_api_batch_v1_JobStatus(ref common.ReferenceCallback) common.Op }, "startTime": { SchemaProps: spec.SchemaProps{ - Description: "Represents time when the job was acknowledged by the job controller. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC.", + Description: "Represents time when the job controller started processing a job. When a Job is created in the suspended state, this field is not set until the first time it is resumed. This field is reset every time a Job is resumed from suspension. It is represented in RFC3339 form and is in UTC.", Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), }, }, @@ -11572,6 +11824,13 @@ func schema_k8sio_api_batch_v1_JobStatus(ref common.ReferenceCallback) common.Op Format: "int32", }, }, + "completedIndexes": { + SchemaProps: spec.SchemaProps{ + Description: "CompletedIndexes holds the completed indexes when .spec.completionMode = \"Indexed\" in a text format. The indexes are represented as decimal integers separated by commas. The numbers are listed in increasing order. Three or more consecutive numbers are compressed and represented by the first and last element of the series, separated by a hyphen. For example, if the completed indexes are 1, 3, 4, 5 and 7, they are represented as \"1,3-5,7\".", + Type: []string{"string"}, + Format: "", + }, + }, }, }, }, @@ -11580,6 +11839,35 @@ func schema_k8sio_api_batch_v1_JobStatus(ref common.ReferenceCallback) common.Op } } +func schema_k8sio_api_batch_v1_JobTemplateSpec(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "JobTemplateSpec describes the data a Job should have when created from a template", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "metadata": { + SchemaProps: spec.SchemaProps{ + Description: "Standard object's metadata of the jobs created from this template. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), + }, + }, + "spec": { + SchemaProps: spec.SchemaProps{ + Description: "Specification of the desired behavior of the job. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status", + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/batch/v1.JobSpec"), + }, + }, + }, + }, + }, + Dependencies: []string{ + "k8s.io/api/batch/v1.JobSpec", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + } +} + func schema_k8sio_api_batch_v1beta1_CronJob(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -11755,6 +12043,11 @@ func schema_k8sio_api_batch_v1beta1_CronJobStatus(ref common.ReferenceCallback) Type: []string{"object"}, Properties: map[string]spec.Schema{ "active": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-type": "atomic", + }, + }, SchemaProps: spec.SchemaProps{ Description: "A list of pointers to currently running jobs.", Type: []string{"array"}, @@ -11774,6 +12067,12 @@ func schema_k8sio_api_batch_v1beta1_CronJobStatus(ref common.ReferenceCallback) Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), }, }, + "lastSuccessfulTime": { + SchemaProps: spec.SchemaProps{ + Description: "Information when was the last time the job successfully completed.", + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), + }, + }, }, }, }, @@ -11854,280 +12153,6 @@ func schema_k8sio_api_batch_v1beta1_JobTemplateSpec(ref common.ReferenceCallback } } -func schema_k8sio_api_batch_v2alpha1_CronJob(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "CronJob represents the configuration of a single cron job.", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "kind": { - SchemaProps: spec.SchemaProps{ - Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", - Type: []string{"string"}, - Format: "", - }, - }, - "apiVersion": { - SchemaProps: spec.SchemaProps{ - Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", - Type: []string{"string"}, - Format: "", - }, - }, - "metadata": { - SchemaProps: spec.SchemaProps{ - Description: "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", - Default: map[string]interface{}{}, - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), - }, - }, - "spec": { - SchemaProps: spec.SchemaProps{ - Description: "Specification of the desired behavior of a cron job, including the schedule. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status", - Default: map[string]interface{}{}, - Ref: ref("k8s.io/api/batch/v2alpha1.CronJobSpec"), - }, - }, - "status": { - SchemaProps: spec.SchemaProps{ - Description: "Current status of a cron job. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status", - Default: map[string]interface{}{}, - Ref: ref("k8s.io/api/batch/v2alpha1.CronJobStatus"), - }, - }, - }, - }, - }, - Dependencies: []string{ - "k8s.io/api/batch/v2alpha1.CronJobSpec", "k8s.io/api/batch/v2alpha1.CronJobStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, - } -} - -func schema_k8sio_api_batch_v2alpha1_CronJobList(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "CronJobList is a collection of cron jobs.", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "kind": { - SchemaProps: spec.SchemaProps{ - Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", - Type: []string{"string"}, - Format: "", - }, - }, - "apiVersion": { - SchemaProps: spec.SchemaProps{ - Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", - Type: []string{"string"}, - Format: "", - }, - }, - "metadata": { - SchemaProps: spec.SchemaProps{ - Description: "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", - Default: map[string]interface{}{}, - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"), - }, - }, - "items": { - SchemaProps: spec.SchemaProps{ - Description: "items is the list of CronJobs.", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Default: map[string]interface{}{}, - Ref: ref("k8s.io/api/batch/v2alpha1.CronJob"), - }, - }, - }, - }, - }, - }, - Required: []string{"items"}, - }, - }, - Dependencies: []string{ - "k8s.io/api/batch/v2alpha1.CronJob", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, - } -} - -func schema_k8sio_api_batch_v2alpha1_CronJobSpec(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "CronJobSpec describes how the job execution will look like and when it will actually run.", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "schedule": { - SchemaProps: spec.SchemaProps{ - Description: "The schedule in Cron format, see https://en.wikipedia.org/wiki/Cron.", - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - "startingDeadlineSeconds": { - SchemaProps: spec.SchemaProps{ - Description: "Optional deadline in seconds for starting the job if it misses scheduled time for any reason. Missed jobs executions will be counted as failed ones.", - Type: []string{"integer"}, - Format: "int64", - }, - }, - "concurrencyPolicy": { - SchemaProps: spec.SchemaProps{ - Description: "Specifies how to treat concurrent executions of a Job. Valid values are: - \"Allow\" (default): allows CronJobs to run concurrently; - \"Forbid\": forbids concurrent runs, skipping next run if previous run hasn't finished yet; - \"Replace\": cancels currently running job and replaces it with a new one", - Type: []string{"string"}, - Format: "", - }, - }, - "suspend": { - SchemaProps: spec.SchemaProps{ - Description: "This flag tells the controller to suspend subsequent executions, it does not apply to already started executions. Defaults to false.", - Type: []string{"boolean"}, - Format: "", - }, - }, - "jobTemplate": { - SchemaProps: spec.SchemaProps{ - Description: "Specifies the job that will be created when executing a CronJob.", - Default: map[string]interface{}{}, - Ref: ref("k8s.io/api/batch/v2alpha1.JobTemplateSpec"), - }, - }, - "successfulJobsHistoryLimit": { - SchemaProps: spec.SchemaProps{ - Description: "The number of successful finished jobs to retain. This is a pointer to distinguish between explicit zero and not specified.", - Type: []string{"integer"}, - Format: "int32", - }, - }, - "failedJobsHistoryLimit": { - SchemaProps: spec.SchemaProps{ - Description: "The number of failed finished jobs to retain. This is a pointer to distinguish between explicit zero and not specified.", - Type: []string{"integer"}, - Format: "int32", - }, - }, - }, - Required: []string{"schedule", "jobTemplate"}, - }, - }, - Dependencies: []string{ - "k8s.io/api/batch/v2alpha1.JobTemplateSpec"}, - } -} - -func schema_k8sio_api_batch_v2alpha1_CronJobStatus(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "CronJobStatus represents the current state of a cron job.", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "active": { - SchemaProps: spec.SchemaProps{ - Description: "A list of pointers to currently running jobs.", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Default: map[string]interface{}{}, - Ref: ref("k8s.io/api/core/v1.ObjectReference"), - }, - }, - }, - }, - }, - "lastScheduleTime": { - SchemaProps: spec.SchemaProps{ - Description: "Information when was the last time the job was successfully scheduled.", - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), - }, - }, - }, - }, - }, - Dependencies: []string{ - "k8s.io/api/core/v1.ObjectReference", "k8s.io/apimachinery/pkg/apis/meta/v1.Time"}, - } -} - -func schema_k8sio_api_batch_v2alpha1_JobTemplate(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "JobTemplate describes a template for creating copies of a predefined pod.", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "kind": { - SchemaProps: spec.SchemaProps{ - Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", - Type: []string{"string"}, - Format: "", - }, - }, - "apiVersion": { - SchemaProps: spec.SchemaProps{ - Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", - Type: []string{"string"}, - Format: "", - }, - }, - "metadata": { - SchemaProps: spec.SchemaProps{ - Description: "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", - Default: map[string]interface{}{}, - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), - }, - }, - "template": { - SchemaProps: spec.SchemaProps{ - Description: "Defines jobs that will be created from this template. https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status", - Default: map[string]interface{}{}, - Ref: ref("k8s.io/api/batch/v2alpha1.JobTemplateSpec"), - }, - }, - }, - }, - }, - Dependencies: []string{ - "k8s.io/api/batch/v2alpha1.JobTemplateSpec", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, - } -} - -func schema_k8sio_api_batch_v2alpha1_JobTemplateSpec(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "JobTemplateSpec describes the data a Job should have when created from a template", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "metadata": { - SchemaProps: spec.SchemaProps{ - Description: "Standard object's metadata of the jobs created from this template. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", - Default: map[string]interface{}{}, - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), - }, - }, - "spec": { - SchemaProps: spec.SchemaProps{ - Description: "Specification of the desired behavior of the job. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status", - Default: map[string]interface{}{}, - Ref: ref("k8s.io/api/batch/v1.JobSpec"), - }, - }, - }, - }, - }, - Dependencies: []string{ - "k8s.io/api/batch/v1.JobSpec", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, - } -} - func schema_k8sio_api_certificates_v1_CertificateSigningRequest(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -13972,7 +13997,7 @@ func schema_k8sio_api_core_v1_ConfigMap(ref common.ReferenceCallback) common.Ope }, "immutable": { SchemaProps: spec.SchemaProps{ - Description: "Immutable, if set to true, ensures that data stored in the ConfigMap cannot be updated (only object metadata can be modified). If not set to true, the field can be modified at any time. Defaulted to nil. This is a beta field enabled by ImmutableEphemeralVolumes feature gate.", + Description: "Immutable, if set to true, ensures that data stored in the ConfigMap cannot be updated (only object metadata can be modified). If not set to true, the field can be modified at any time. Defaulted to nil.", Type: []string{"boolean"}, Format: "", }, @@ -14395,7 +14420,7 @@ func schema_k8sio_api_core_v1_Container(ref common.ReferenceCallback) common.Ope }, "resources": { SchemaProps: spec.SchemaProps{ - Description: "Compute Resources required by this container. Cannot be updated. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/", + Description: "Compute Resources required by this container. Cannot be updated. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/", Default: map[string]interface{}{}, Ref: ref("k8s.io/api/core/v1.ResourceRequirements"), }, @@ -15899,13 +15924,6 @@ func schema_k8sio_api_core_v1_EphemeralVolumeSource(ref common.ReferenceCallback Ref: ref("k8s.io/api/core/v1.PersistentVolumeClaimTemplate"), }, }, - "readOnly": { - SchemaProps: spec.SchemaProps{ - Description: "Specifies a read-only configuration for the volume. Defaults to false (read/write).", - Type: []string{"boolean"}, - Format: "", - }, - }, }, }, }, @@ -17182,7 +17200,7 @@ func schema_k8sio_api_core_v1_LimitRangeList(ref common.ReferenceCallback) commo }, "items": { SchemaProps: spec.SchemaProps{ - Description: "Items is a list of LimitRange objects. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/", + Description: "Items is a list of LimitRange objects. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ @@ -19587,7 +19605,7 @@ func schema_k8sio_api_core_v1_PodAffinityTerm(ref common.ReferenceCallback) comm }, "namespaces": { SchemaProps: spec.SchemaProps{ - Description: "namespaces specifies which namespaces the labelSelector applies to (matches against); null or empty list means \"this pod's namespace\"", + Description: "namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means \"this pod's namespace\"", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ @@ -19608,6 +19626,12 @@ func schema_k8sio_api_core_v1_PodAffinityTerm(ref common.ReferenceCallback) comm Format: "", }, }, + "namespaceSelector": { + SchemaProps: spec.SchemaProps{ + Description: "A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means \"this pod's namespace\". An empty selector ({}) matches all namespaces. This field is alpha-level and is only honored when PodAffinityNamespaceSelector feature is enabled.", + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.LabelSelector"), + }, + }, }, Required: []string{"topologyKey"}, }, @@ -20419,7 +20443,7 @@ func schema_k8sio_api_core_v1_PodSpec(ref common.ReferenceCallback) common.OpenA }, "terminationGracePeriodSeconds": { SchemaProps: spec.SchemaProps{ - Description: "Optional duration in seconds the pod needs to terminate gracefully. May be decreased in delete request. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period will be used instead. The grace period is the duration in seconds after the processes running in the pod are sent a termination signal and the time when the processes are forcibly halted with a kill signal. Set this value longer than the expected cleanup time for your process. Defaults to 30 seconds.", + Description: "Optional duration in seconds the pod needs to terminate gracefully. May be decreased in delete request. Value must be non-negative integer. The value zero indicates stop immediately via the kill signal (no opportunity to shut down). If this value is nil, the default grace period will be used instead. The grace period is the duration in seconds after the processes running in the pod are sent a termination signal and the time when the processes are forcibly halted with a kill signal. Set this value longer than the expected cleanup time for your process. Defaults to 30 seconds.", Type: []string{"integer"}, Format: "int64", }, @@ -21233,6 +21257,13 @@ func schema_k8sio_api_core_v1_Probe(ref common.ReferenceCallback) common.OpenAPI Format: "int32", }, }, + "terminationGracePeriodSeconds": { + SchemaProps: spec.SchemaProps{ + Description: "Optional duration in seconds the pod needs to terminate gracefully upon probe failure. The grace period is the duration in seconds after the processes running in the pod are sent a termination signal and the time when the processes are forcibly halted with a kill signal. Set this value longer than the expected cleanup time for your process. If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this value overrides the value provided by the pod spec. Value must be non-negative integer. The value zero indicates stop immediately via the kill signal (no opportunity to shut down). This is an alpha field and requires enabling ProbeTerminationGracePeriod feature gate.", + Type: []string{"integer"}, + Format: "int64", + }, + }, }, }, }, @@ -22068,7 +22099,7 @@ func schema_k8sio_api_core_v1_ResourceRequirements(ref common.ReferenceCallback) Properties: map[string]spec.Schema{ "limits": { SchemaProps: spec.SchemaProps{ - Description: "Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/", + Description: "Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/", Type: []string{"object"}, AdditionalProperties: &spec.SchemaOrBool{ Allows: true, @@ -22083,7 +22114,7 @@ func schema_k8sio_api_core_v1_ResourceRequirements(ref common.ReferenceCallback) }, "requests": { SchemaProps: spec.SchemaProps{ - Description: "Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/", + Description: "Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/", Type: []string{"object"}, AdditionalProperties: &spec.SchemaOrBool{ Allows: true, @@ -22464,7 +22495,7 @@ func schema_k8sio_api_core_v1_Secret(ref common.ReferenceCallback) common.OpenAP }, "immutable": { SchemaProps: spec.SchemaProps{ - Description: "Immutable, if set to true, ensures that data stored in the Secret cannot be updated (only object metadata can be modified). If not set to true, the field can be modified at any time. Defaulted to nil. This is a beta field enabled by ImmutableEphemeralVolumes feature gate.", + Description: "Immutable, if set to true, ensures that data stored in the Secret cannot be updated (only object metadata can be modified). If not set to true, the field can be modified at any time. Defaulted to nil.", Type: []string{"boolean"}, Format: "", }, @@ -22486,7 +22517,7 @@ func schema_k8sio_api_core_v1_Secret(ref common.ReferenceCallback) common.OpenAP }, "stringData": { SchemaProps: spec.SchemaProps{ - Description: "stringData allows specifying non-binary secret data in string form. It is provided as a write-only convenience method. All keys and values are merged into the data field on write, overwriting any existing values. It is never output when reading from the API.", + Description: "stringData allows specifying non-binary secret data in string form. It is provided as a write-only input field for convenience. All keys and values are merged into the data field on write, overwriting any existing values. The stringData field is never output when reading from the API.", Type: []string{"object"}, AdditionalProperties: &spec.SchemaOrBool{ Allows: true, @@ -23155,6 +23186,7 @@ func schema_k8sio_api_core_v1_ServicePort(ref common.ReferenceCallback) common.O "protocol": { SchemaProps: spec.SchemaProps{ Description: "The IP protocol for this port. Supports \"TCP\", \"UDP\", and \"SCTP\". Default is TCP.", + Default: "TCP", Type: []string{"string"}, Format: "", }, @@ -23359,7 +23391,7 @@ func schema_k8sio_api_core_v1_ServiceSpec(ref common.ReferenceCallback) common.O }, "externalName": { SchemaProps: spec.SchemaProps{ - Description: "externalName is the external reference that discovery mechanisms will return as an alias for this service (e.g. a DNS CNAME record). No proxying will be involved. Must be a lowercase RFC-1123 hostname (https://tools.ietf.org/html/rfc1123) and requires Type to be", + Description: "externalName is the external reference that discovery mechanisms will return as an alias for this service (e.g. a DNS CNAME record). No proxying will be involved. Must be a lowercase RFC-1123 hostname (https://tools.ietf.org/html/rfc1123) and requires `type` to be \"ExternalName\".", Type: []string{"string"}, Format: "", }, @@ -23393,7 +23425,7 @@ func schema_k8sio_api_core_v1_ServiceSpec(ref common.ReferenceCallback) common.O }, "topologyKeys": { SchemaProps: spec.SchemaProps{ - Description: "topologyKeys is a preference-order list of topology keys which implementations of services should use to preferentially sort endpoints when accessing this Service, it can not be used at the same time as externalTrafficPolicy=Local. Topology keys must be valid label keys and at most 16 keys may be specified. Endpoints are chosen based on the first topology key with available backends. If this field is specified and all entries have no backends that match the topology of the client, the service has no backends for that client and connections should fail. The special value \"*\" may be used to mean \"any topology\". This catch-all value, if used, only makes sense as the last value in the list. If this is not specified or empty, no topology constraints will be applied. This field is alpha-level and is only honored by servers that enable the ServiceTopology feature.", + Description: "topologyKeys is a preference-order list of topology keys which implementations of services should use to preferentially sort endpoints when accessing this Service, it can not be used at the same time as externalTrafficPolicy=Local. Topology keys must be valid label keys and at most 16 keys may be specified. Endpoints are chosen based on the first topology key with available backends. If this field is specified and all entries have no backends that match the topology of the client, the service has no backends for that client and connections should fail. The special value \"*\" may be used to mean \"any topology\". This catch-all value, if used, only makes sense as the last value in the list. If this is not specified or empty, no topology constraints will be applied. This field is alpha-level and is only honored by servers that enable the ServiceTopology feature. This field is deprecated and will be removed in a future version.", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ @@ -23440,6 +23472,20 @@ func schema_k8sio_api_core_v1_ServiceSpec(ref common.ReferenceCallback) common.O Format: "", }, }, + "loadBalancerClass": { + SchemaProps: spec.SchemaProps{ + Description: "loadBalancerClass is the class of the load balancer implementation this Service belongs to. If specified, the value of this field must be a label-style identifier, with an optional prefix, e.g. \"internal-vip\" or \"example.com/internal-vip\". Unprefixed names are reserved for end-users. This field can only be set when the Service type is 'LoadBalancer'. If not set, the default load balancer implementation is used, today this is typically done through the cloud provider integration, but should apply for any default implementation. If set, it is assumed that a load balancer implementation is watching for Services with a matching class. Any default load balancer implementation (e.g. cloud providers) should ignore Services that set this field. This field can only be set when creating or updating a Service to type 'LoadBalancer'. Once set, it can not be changed. This field will be wiped when a service is updated to a non 'LoadBalancer' type.", + Type: []string{"string"}, + Format: "", + }, + }, + "internalTrafficPolicy": { + SchemaProps: spec.SchemaProps{ + Description: "InternalTrafficPolicy specifies if the cluster internal traffic should be routed to all endpoints or node-local endpoints only. \"Cluster\" routes internal traffic to a Service to all endpoints. \"Local\" routes traffic to node-local endpoints only, traffic is dropped if no node-local endpoints are ready. The default value is \"Cluster\".", + Type: []string{"string"}, + Format: "", + }, + }, }, }, }, @@ -24100,7 +24146,7 @@ func schema_k8sio_api_core_v1_Volume(ref common.ReferenceCallback) common.OpenAP }, "ephemeral": { SchemaProps: spec.SchemaProps{ - Description: "Ephemeral represents a volume that is handled by a cluster storage driver (Alpha feature). The volume's lifecycle is tied to the pod that defines it - it will be created before the pod starts, and deleted when the pod is removed.\n\nUse this if: a) the volume is only needed while the pod runs, b) features of normal volumes like restoring from snapshot or capacity\n tracking are needed,\nc) the storage driver is specified through a storage class, and d) the storage driver supports dynamic volume provisioning through\n a PersistentVolumeClaim (see EphemeralVolumeSource for more\n information on the connection between this volume type\n and PersistentVolumeClaim).\n\nUse PersistentVolumeClaim or one of the vendor-specific APIs for volumes that persist for longer than the lifecycle of an individual pod.\n\nUse CSI for light-weight local ephemeral volumes if the CSI driver is meant to be used that way - see the documentation of the driver for more information.\n\nA pod can use both types of ephemeral volumes and persistent volumes at the same time.", + Description: "Ephemeral represents a volume that is handled by a cluster storage driver. The volume's lifecycle is tied to the pod that defines it - it will be created before the pod starts, and deleted when the pod is removed.\n\nUse this if: a) the volume is only needed while the pod runs, b) features of normal volumes like restoring from snapshot or capacity\n tracking are needed,\nc) the storage driver is specified through a storage class, and d) the storage driver supports dynamic volume provisioning through\n a PersistentVolumeClaim (see EphemeralVolumeSource for more\n information on the connection between this volume type\n and PersistentVolumeClaim).\n\nUse PersistentVolumeClaim or one of the vendor-specific APIs for volumes that persist for longer than the lifecycle of an individual pod.\n\nUse CSI for light-weight local ephemeral volumes if the CSI driver is meant to be used that way - see the documentation of the driver for more information.\n\nA pod can use both types of ephemeral volumes and persistent volumes at the same time.\n\nThis is a beta feature and only available when the GenericEphemeralVolume feature gate is enabled.", Ref: ref("k8s.io/api/core/v1.EphemeralVolumeSource"), }, }, @@ -24438,7 +24484,7 @@ func schema_k8sio_api_core_v1_VolumeSource(ref common.ReferenceCallback) common. }, "ephemeral": { SchemaProps: spec.SchemaProps{ - Description: "Ephemeral represents a volume that is handled by a cluster storage driver (Alpha feature). The volume's lifecycle is tied to the pod that defines it - it will be created before the pod starts, and deleted when the pod is removed.\n\nUse this if: a) the volume is only needed while the pod runs, b) features of normal volumes like restoring from snapshot or capacity\n tracking are needed,\nc) the storage driver is specified through a storage class, and d) the storage driver supports dynamic volume provisioning through\n a PersistentVolumeClaim (see EphemeralVolumeSource for more\n information on the connection between this volume type\n and PersistentVolumeClaim).\n\nUse PersistentVolumeClaim or one of the vendor-specific APIs for volumes that persist for longer than the lifecycle of an individual pod.\n\nUse CSI for light-weight local ephemeral volumes if the CSI driver is meant to be used that way - see the documentation of the driver for more information.\n\nA pod can use both types of ephemeral volumes and persistent volumes at the same time.", + Description: "Ephemeral represents a volume that is handled by a cluster storage driver. The volume's lifecycle is tied to the pod that defines it - it will be created before the pod starts, and deleted when the pod is removed.\n\nUse this if: a) the volume is only needed while the pod runs, b) features of normal volumes like restoring from snapshot or capacity\n tracking are needed,\nc) the storage driver is specified through a storage class, and d) the storage driver supports dynamic volume provisioning through\n a PersistentVolumeClaim (see EphemeralVolumeSource for more\n information on the connection between this volume type\n and PersistentVolumeClaim).\n\nUse PersistentVolumeClaim or one of the vendor-specific APIs for volumes that persist for longer than the lifecycle of an individual pod.\n\nUse CSI for light-weight local ephemeral volumes if the CSI driver is meant to be used that way - see the documentation of the driver for more information.\n\nA pod can use both types of ephemeral volumes and persistent volumes at the same time.\n\nThis is a beta feature and only available when the GenericEphemeralVolume feature gate is enabled.", Ref: ref("k8s.io/api/core/v1.EphemeralVolumeSource"), }, }, @@ -24558,7 +24604,7 @@ func schema_k8sio_api_core_v1_WindowsSecurityContextOptions(ref common.Reference } } -func schema_k8sio_api_discovery_v1alpha1_Endpoint(ref common.ReferenceCallback) common.OpenAPIDefinition { +func schema_k8sio_api_discovery_v1_Endpoint(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ @@ -24589,12 +24635,12 @@ func schema_k8sio_api_discovery_v1alpha1_Endpoint(ref common.ReferenceCallback) SchemaProps: spec.SchemaProps{ Description: "conditions contains information about the current status of the endpoint.", Default: map[string]interface{}{}, - Ref: ref("k8s.io/api/discovery/v1alpha1.EndpointConditions"), + Ref: ref("k8s.io/api/discovery/v1.EndpointConditions"), }, }, "hostname": { SchemaProps: spec.SchemaProps{ - Description: "hostname of this endpoint. This field may be used by consumers of endpoints to distinguish endpoints from each other (e.g. in DNS names). Multiple endpoints which use the same hostname should be considered fungible (e.g. multiple A values in DNS). Must be lowercase and pass DNS label (RFC 1123) validation.", + Description: "hostname of this endpoint. This field may be used by consumers of endpoints to distinguish endpoints from each other (e.g. in DNS names). Multiple endpoints which use the same hostname should be considered fungible (e.g. multiple A values in DNS). Must be lowercase and pass DNS Label (RFC 1123) validation.", Type: []string{"string"}, Format: "", }, @@ -24605,9 +24651,9 @@ func schema_k8sio_api_discovery_v1alpha1_Endpoint(ref common.ReferenceCallback) Ref: ref("k8s.io/api/core/v1.ObjectReference"), }, }, - "topology": { + "deprecatedTopology": { SchemaProps: spec.SchemaProps{ - Description: "topology contains arbitrary topology information associated with the endpoint. These key/value pairs must conform with the label format. https://kubernetes.io/docs/concepts/overview/working-with-objects/labels Topology may include a maximum of 16 key/value pairs. This includes, but is not limited to the following well known keys: * kubernetes.io/hostname: the value indicates the hostname of the node\n where the endpoint is located. This should match the corresponding\n node label.\n* topology.kubernetes.io/zone: the value indicates the zone where the\n endpoint is located. This should match the corresponding node label.\n* topology.kubernetes.io/region: the value indicates the region where the\n endpoint is located. This should match the corresponding node label.\nThis field is deprecated and will be removed in future api versions.", + Description: "deprecatedTopology contains topology information part of the v1beta1 API. This field is deprecated, and will be removed when the v1beta1 API is removed (no sooner than kubernetes v1.24). While this field can hold values, it is not writable through the v1 API, and any attempts to write to it will be silently ignored. Topology information can be found in the zone and nodeName fields instead.", Type: []string{"object"}, AdditionalProperties: &spec.SchemaOrBool{ Allows: true, @@ -24628,16 +24674,29 @@ func schema_k8sio_api_discovery_v1alpha1_Endpoint(ref common.ReferenceCallback) Format: "", }, }, + "zone": { + SchemaProps: spec.SchemaProps{ + Description: "zone is the name of the Zone this endpoint exists in.", + Type: []string{"string"}, + Format: "", + }, + }, + "hints": { + SchemaProps: spec.SchemaProps{ + Description: "hints contains information associated with how an endpoint should be consumed.", + Ref: ref("k8s.io/api/discovery/v1.EndpointHints"), + }, + }, }, Required: []string{"addresses"}, }, }, Dependencies: []string{ - "k8s.io/api/core/v1.ObjectReference", "k8s.io/api/discovery/v1alpha1.EndpointConditions"}, + "k8s.io/api/core/v1.ObjectReference", "k8s.io/api/discovery/v1.EndpointConditions", "k8s.io/api/discovery/v1.EndpointHints"}, } } -func schema_k8sio_api_discovery_v1alpha1_EndpointConditions(ref common.ReferenceCallback) common.OpenAPIDefinition { +func schema_k8sio_api_discovery_v1_EndpointConditions(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ @@ -24671,295 +24730,391 @@ func schema_k8sio_api_discovery_v1alpha1_EndpointConditions(ref common.Reference } } -func schema_k8sio_api_discovery_v1alpha1_EndpointPort(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "EndpointPort represents a Port used by an EndpointSlice", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "name": { - SchemaProps: spec.SchemaProps{ - Description: "The name of this port. All ports in an EndpointSlice must have a unique name. If the EndpointSlice is dervied from a Kubernetes service, this corresponds to the Service.ports[].name. Name must either be an empty string or pass DNS_LABEL validation: * must be no more than 63 characters long. * must consist of lower case alphanumeric characters or '-'. * must start and end with an alphanumeric character. Default is empty string.", - Type: []string{"string"}, - Format: "", - }, - }, - "protocol": { - SchemaProps: spec.SchemaProps{ - Description: "The IP protocol for this port. Must be UDP, TCP, or SCTP. Default is TCP.", - Type: []string{"string"}, - Format: "", - }, - }, - "port": { - SchemaProps: spec.SchemaProps{ - Description: "The port number of the endpoint. If this is not specified, ports are not restricted and must be interpreted in the context of the specific consumer.", - Type: []string{"integer"}, - Format: "int32", - }, - }, - "appProtocol": { - SchemaProps: spec.SchemaProps{ - Description: "The application protocol for this port. This field follows standard Kubernetes label syntax. Un-prefixed names are reserved for IANA standard service names (as per RFC-6335 and http://www.iana.org/assignments/service-names). Non-standard protocols should use prefixed names. Default is empty string.", - Type: []string{"string"}, - Format: "", - }, - }, - }, - }, - }, - } -} - -func schema_k8sio_api_discovery_v1alpha1_EndpointSlice(ref common.ReferenceCallback) common.OpenAPIDefinition { +func schema_k8sio_api_discovery_v1_EndpointHints(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ - Description: "EndpointSlice represents a subset of the endpoints that implement a service. For a given service there may be multiple EndpointSlice objects, selected by labels, which must be joined to produce the full set of endpoints.", + Description: "EndpointHints provides hints describing how an endpoint should be consumed.", Type: []string{"object"}, Properties: map[string]spec.Schema{ - "kind": { - SchemaProps: spec.SchemaProps{ - Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", - Type: []string{"string"}, - Format: "", - }, - }, - "apiVersion": { - SchemaProps: spec.SchemaProps{ - Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", - Type: []string{"string"}, - Format: "", - }, - }, - "metadata": { - SchemaProps: spec.SchemaProps{ - Description: "Standard object's metadata.", - Default: map[string]interface{}{}, - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), - }, - }, - "addressType": { - SchemaProps: spec.SchemaProps{ - Description: "addressType specifies the type of address carried by this EndpointSlice. All addresses in this slice must be the same type. This field is immutable after creation. The following address types are currently supported: * IPv4: Represents an IPv4 Address. * IPv6: Represents an IPv6 Address. * FQDN: Represents a Fully Qualified Domain Name.", - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - "endpoints": { + "forZones": { VendorExtensible: spec.VendorExtensible{ Extensions: spec.Extensions{ "x-kubernetes-list-type": "atomic", }, }, SchemaProps: spec.SchemaProps{ - Description: "endpoints is a list of unique endpoints in this slice. Each slice may include a maximum of 1000 endpoints.", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Default: map[string]interface{}{}, - Ref: ref("k8s.io/api/discovery/v1alpha1.Endpoint"), - }, - }, - }, - }, - }, - "ports": { - VendorExtensible: spec.VendorExtensible{ - Extensions: spec.Extensions{ - "x-kubernetes-list-type": "atomic", - }, - }, - SchemaProps: spec.SchemaProps{ - Description: "ports specifies the list of network ports exposed by each endpoint in this slice. Each port must have a unique name. When ports is empty, it indicates that there are no defined ports. When a port is defined with a nil port value, it indicates \"all ports\". Each slice may include a maximum of 100 ports.", + Description: "forZones indicates the zone(s) this endpoint should be consumed by to enable topology aware routing.", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("k8s.io/api/discovery/v1alpha1.EndpointPort"), + Ref: ref("k8s.io/api/discovery/v1.ForZone"), }, }, }, }, }, }, - Required: []string{"addressType", "endpoints"}, }, }, Dependencies: []string{ - "k8s.io/api/discovery/v1alpha1.Endpoint", "k8s.io/api/discovery/v1alpha1.EndpointPort", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + "k8s.io/api/discovery/v1.ForZone"}, } } -func schema_k8sio_api_discovery_v1alpha1_EndpointSliceList(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "EndpointSliceList represents a list of endpoint slices", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "kind": { - SchemaProps: spec.SchemaProps{ - Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", - Type: []string{"string"}, - Format: "", - }, - }, - "apiVersion": { - SchemaProps: spec.SchemaProps{ - Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", - Type: []string{"string"}, - Format: "", - }, - }, - "metadata": { - SchemaProps: spec.SchemaProps{ - Description: "Standard list metadata.", - Default: map[string]interface{}{}, - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"), - }, - }, - "items": { - SchemaProps: spec.SchemaProps{ - Description: "List of endpoint slices", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Default: map[string]interface{}{}, - Ref: ref("k8s.io/api/discovery/v1alpha1.EndpointSlice"), - }, - }, - }, - }, - }, - }, - Required: []string{"items"}, - }, - }, - Dependencies: []string{ - "k8s.io/api/discovery/v1alpha1.EndpointSlice", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, - } -} - -func schema_k8sio_api_discovery_v1beta1_Endpoint(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "Endpoint represents a single logical \"backend\" implementing a service.", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "addresses": { - VendorExtensible: spec.VendorExtensible{ - Extensions: spec.Extensions{ - "x-kubernetes-list-type": "set", - }, - }, - SchemaProps: spec.SchemaProps{ - Description: "addresses of this endpoint. The contents of this field are interpreted according to the corresponding EndpointSlice addressType field. Consumers must handle different types of addresses in the context of their own capabilities. This must contain at least one address but no more than 100.", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - }, - }, - }, - "conditions": { - SchemaProps: spec.SchemaProps{ - Description: "conditions contains information about the current status of the endpoint.", - Default: map[string]interface{}{}, - Ref: ref("k8s.io/api/discovery/v1beta1.EndpointConditions"), - }, - }, - "hostname": { - SchemaProps: spec.SchemaProps{ - Description: "hostname of this endpoint. This field may be used by consumers of endpoints to distinguish endpoints from each other (e.g. in DNS names). Multiple endpoints which use the same hostname should be considered fungible (e.g. multiple A values in DNS). Must be lowercase and pass DNS Label (RFC 1123) validation.", - Type: []string{"string"}, - Format: "", - }, - }, - "targetRef": { - SchemaProps: spec.SchemaProps{ - Description: "targetRef is a reference to a Kubernetes object that represents this endpoint.", - Ref: ref("k8s.io/api/core/v1.ObjectReference"), - }, - }, - "topology": { - SchemaProps: spec.SchemaProps{ - Description: "topology contains arbitrary topology information associated with the endpoint. These key/value pairs must conform with the label format. https://kubernetes.io/docs/concepts/overview/working-with-objects/labels Topology may include a maximum of 16 key/value pairs. This includes, but is not limited to the following well known keys: * kubernetes.io/hostname: the value indicates the hostname of the node\n where the endpoint is located. This should match the corresponding\n node label.\n* topology.kubernetes.io/zone: the value indicates the zone where the\n endpoint is located. This should match the corresponding node label.\n* topology.kubernetes.io/region: the value indicates the region where the\n endpoint is located. This should match the corresponding node label.\nThis field is deprecated and will be removed in future api versions.", - Type: []string{"object"}, - AdditionalProperties: &spec.SchemaOrBool{ - Allows: true, - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - }, - }, - }, - "nodeName": { - SchemaProps: spec.SchemaProps{ - Description: "nodeName represents the name of the Node hosting this endpoint. This can be used to determine endpoints local to a Node. This field can be enabled with the EndpointSliceNodeName feature gate.", - Type: []string{"string"}, - Format: "", - }, - }, - }, - Required: []string{"addresses"}, - }, - }, - Dependencies: []string{ - "k8s.io/api/core/v1.ObjectReference", "k8s.io/api/discovery/v1beta1.EndpointConditions"}, - } -} - -func schema_k8sio_api_discovery_v1beta1_EndpointConditions(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "EndpointConditions represents the current condition of an endpoint.", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "ready": { - SchemaProps: spec.SchemaProps{ - Description: "ready indicates that this endpoint is prepared to receive traffic, according to whatever system is managing the endpoint. A nil value indicates an unknown state. In most cases consumers should interpret this unknown state as ready. For compatibility reasons, ready should never be \"true\" for terminating endpoints.", - Type: []string{"boolean"}, - Format: "", - }, - }, - "serving": { - SchemaProps: spec.SchemaProps{ - Description: "serving is identical to ready except that it is set regardless of the terminating state of endpoints. This condition should be set to true for a ready endpoint that is terminating. If nil, consumers should defer to the ready condition. This field can be enabled with the EndpointSliceTerminatingCondition feature gate.", - Type: []string{"boolean"}, - Format: "", - }, - }, - "terminating": { - SchemaProps: spec.SchemaProps{ - Description: "terminating indicates that this endpoint is terminating. A nil value indicates an unknown state. Consumers should interpret this unknown state to mean that the endpoint is not terminating. This field can be enabled with the EndpointSliceTerminatingCondition feature gate.", - Type: []string{"boolean"}, - Format: "", - }, - }, - }, - }, - }, - } -} - -func schema_k8sio_api_discovery_v1beta1_EndpointPort(ref common.ReferenceCallback) common.OpenAPIDefinition { +func schema_k8sio_api_discovery_v1_EndpointPort(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "EndpointPort represents a Port used by an EndpointSlice", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "name": { + SchemaProps: spec.SchemaProps{ + Description: "The name of this port. All ports in an EndpointSlice must have a unique name. If the EndpointSlice is dervied from a Kubernetes service, this corresponds to the Service.ports[].name. Name must either be an empty string or pass DNS_LABEL validation: * must be no more than 63 characters long. * must consist of lower case alphanumeric characters or '-'. * must start and end with an alphanumeric character. Default is empty string.", + Type: []string{"string"}, + Format: "", + }, + }, + "protocol": { + SchemaProps: spec.SchemaProps{ + Description: "The IP protocol for this port. Must be UDP, TCP, or SCTP. Default is TCP.", + Type: []string{"string"}, + Format: "", + }, + }, + "port": { + SchemaProps: spec.SchemaProps{ + Description: "The port number of the endpoint. If this is not specified, ports are not restricted and must be interpreted in the context of the specific consumer.", + Type: []string{"integer"}, + Format: "int32", + }, + }, + "appProtocol": { + SchemaProps: spec.SchemaProps{ + Description: "The application protocol for this port. This field follows standard Kubernetes label syntax. Un-prefixed names are reserved for IANA standard service names (as per RFC-6335 and http://www.iana.org/assignments/service-names). Non-standard protocols should use prefixed names such as mycompany.com/my-custom-protocol.", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + } +} + +func schema_k8sio_api_discovery_v1_EndpointSlice(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "EndpointSlice represents a subset of the endpoints that implement a service. For a given service there may be multiple EndpointSlice objects, selected by labels, which must be joined to produce the full set of endpoints.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "kind": { + SchemaProps: spec.SchemaProps{ + Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + Type: []string{"string"}, + Format: "", + }, + }, + "apiVersion": { + SchemaProps: spec.SchemaProps{ + Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + Type: []string{"string"}, + Format: "", + }, + }, + "metadata": { + SchemaProps: spec.SchemaProps{ + Description: "Standard object's metadata.", + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), + }, + }, + "addressType": { + SchemaProps: spec.SchemaProps{ + Description: "addressType specifies the type of address carried by this EndpointSlice. All addresses in this slice must be the same type. This field is immutable after creation. The following address types are currently supported: * IPv4: Represents an IPv4 Address. * IPv6: Represents an IPv6 Address. * FQDN: Represents a Fully Qualified Domain Name.", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "endpoints": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-type": "atomic", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "endpoints is a list of unique endpoints in this slice. Each slice may include a maximum of 1000 endpoints.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/discovery/v1.Endpoint"), + }, + }, + }, + }, + }, + "ports": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-type": "atomic", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "ports specifies the list of network ports exposed by each endpoint in this slice. Each port must have a unique name. When ports is empty, it indicates that there are no defined ports. When a port is defined with a nil port value, it indicates \"all ports\". Each slice may include a maximum of 100 ports.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/discovery/v1.EndpointPort"), + }, + }, + }, + }, + }, + }, + Required: []string{"addressType", "endpoints"}, + }, + }, + Dependencies: []string{ + "k8s.io/api/discovery/v1.Endpoint", "k8s.io/api/discovery/v1.EndpointPort", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + } +} + +func schema_k8sio_api_discovery_v1_EndpointSliceList(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "EndpointSliceList represents a list of endpoint slices", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "kind": { + SchemaProps: spec.SchemaProps{ + Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + Type: []string{"string"}, + Format: "", + }, + }, + "apiVersion": { + SchemaProps: spec.SchemaProps{ + Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + Type: []string{"string"}, + Format: "", + }, + }, + "metadata": { + SchemaProps: spec.SchemaProps{ + Description: "Standard list metadata.", + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"), + }, + }, + "items": { + SchemaProps: spec.SchemaProps{ + Description: "List of endpoint slices", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/discovery/v1.EndpointSlice"), + }, + }, + }, + }, + }, + }, + Required: []string{"items"}, + }, + }, + Dependencies: []string{ + "k8s.io/api/discovery/v1.EndpointSlice", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, + } +} + +func schema_k8sio_api_discovery_v1_ForZone(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "ForZone provides information about which zones should consume this endpoint.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "name": { + SchemaProps: spec.SchemaProps{ + Description: "name represents the name of the zone.", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + Required: []string{"name"}, + }, + }, + } +} + +func schema_k8sio_api_discovery_v1beta1_Endpoint(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "Endpoint represents a single logical \"backend\" implementing a service.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "addresses": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-type": "set", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "addresses of this endpoint. The contents of this field are interpreted according to the corresponding EndpointSlice addressType field. Consumers must handle different types of addresses in the context of their own capabilities. This must contain at least one address but no more than 100.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + "conditions": { + SchemaProps: spec.SchemaProps{ + Description: "conditions contains information about the current status of the endpoint.", + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/discovery/v1beta1.EndpointConditions"), + }, + }, + "hostname": { + SchemaProps: spec.SchemaProps{ + Description: "hostname of this endpoint. This field may be used by consumers of endpoints to distinguish endpoints from each other (e.g. in DNS names). Multiple endpoints which use the same hostname should be considered fungible (e.g. multiple A values in DNS). Must be lowercase and pass DNS Label (RFC 1123) validation.", + Type: []string{"string"}, + Format: "", + }, + }, + "targetRef": { + SchemaProps: spec.SchemaProps{ + Description: "targetRef is a reference to a Kubernetes object that represents this endpoint.", + Ref: ref("k8s.io/api/core/v1.ObjectReference"), + }, + }, + "topology": { + SchemaProps: spec.SchemaProps{ + Description: "topology contains arbitrary topology information associated with the endpoint. These key/value pairs must conform with the label format. https://kubernetes.io/docs/concepts/overview/working-with-objects/labels Topology may include a maximum of 16 key/value pairs. This includes, but is not limited to the following well known keys: * kubernetes.io/hostname: the value indicates the hostname of the node\n where the endpoint is located. This should match the corresponding\n node label.\n* topology.kubernetes.io/zone: the value indicates the zone where the\n endpoint is located. This should match the corresponding node label.\n* topology.kubernetes.io/region: the value indicates the region where the\n endpoint is located. This should match the corresponding node label.\nThis field is deprecated and will be removed in future api versions.", + Type: []string{"object"}, + AdditionalProperties: &spec.SchemaOrBool{ + Allows: true, + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + "nodeName": { + SchemaProps: spec.SchemaProps{ + Description: "nodeName represents the name of the Node hosting this endpoint. This can be used to determine endpoints local to a Node. This field can be enabled with the EndpointSliceNodeName feature gate.", + Type: []string{"string"}, + Format: "", + }, + }, + "hints": { + SchemaProps: spec.SchemaProps{ + Description: "hints contains information associated with how an endpoint should be consumed.", + Ref: ref("k8s.io/api/discovery/v1beta1.EndpointHints"), + }, + }, + }, + Required: []string{"addresses"}, + }, + }, + Dependencies: []string{ + "k8s.io/api/core/v1.ObjectReference", "k8s.io/api/discovery/v1beta1.EndpointConditions", "k8s.io/api/discovery/v1beta1.EndpointHints"}, + } +} + +func schema_k8sio_api_discovery_v1beta1_EndpointConditions(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "EndpointConditions represents the current condition of an endpoint.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "ready": { + SchemaProps: spec.SchemaProps{ + Description: "ready indicates that this endpoint is prepared to receive traffic, according to whatever system is managing the endpoint. A nil value indicates an unknown state. In most cases consumers should interpret this unknown state as ready. For compatibility reasons, ready should never be \"true\" for terminating endpoints.", + Type: []string{"boolean"}, + Format: "", + }, + }, + "serving": { + SchemaProps: spec.SchemaProps{ + Description: "serving is identical to ready except that it is set regardless of the terminating state of endpoints. This condition should be set to true for a ready endpoint that is terminating. If nil, consumers should defer to the ready condition. This field can be enabled with the EndpointSliceTerminatingCondition feature gate.", + Type: []string{"boolean"}, + Format: "", + }, + }, + "terminating": { + SchemaProps: spec.SchemaProps{ + Description: "terminating indicates that this endpoint is terminating. A nil value indicates an unknown state. Consumers should interpret this unknown state to mean that the endpoint is not terminating. This field can be enabled with the EndpointSliceTerminatingCondition feature gate.", + Type: []string{"boolean"}, + Format: "", + }, + }, + }, + }, + }, + } +} + +func schema_k8sio_api_discovery_v1beta1_EndpointHints(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "EndpointHints provides hints describing how an endpoint should be consumed.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "forZones": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-type": "atomic", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "forZones indicates the zone(s) this endpoint should be consumed by to enable topology aware routing. May contain a maximum of 8 entries.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/discovery/v1beta1.ForZone"), + }, + }, + }, + }, + }, + }, + }, + }, + Dependencies: []string{ + "k8s.io/api/discovery/v1beta1.ForZone"}, + } +} + +func schema_k8sio_api_discovery_v1beta1_EndpointPort(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ @@ -25134,6 +25289,28 @@ func schema_k8sio_api_discovery_v1beta1_EndpointSliceList(ref common.ReferenceCa } } +func schema_k8sio_api_discovery_v1beta1_ForZone(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "ForZone provides information about which zones should consume this endpoint.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "name": { + SchemaProps: spec.SchemaProps{ + Description: "name represents the name of the zone.", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + Required: []string{"name"}, + }, + }, + } +} + func schema_k8sio_api_events_v1_Event(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -25157,8 +25334,9 @@ func schema_k8sio_api_events_v1_Event(ref common.ReferenceCallback) common.OpenA }, "metadata": { SchemaProps: spec.SchemaProps{ - Default: map[string]interface{}{}, - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), + Description: "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), }, }, "eventTime": { @@ -25258,7 +25436,7 @@ func schema_k8sio_api_events_v1_Event(ref common.ReferenceCallback) common.OpenA }, }, }, - Required: []string{"metadata", "eventTime"}, + Required: []string{"eventTime"}, }, }, Dependencies: []string{ @@ -25371,8 +25549,9 @@ func schema_k8sio_api_events_v1beta1_Event(ref common.ReferenceCallback) common. }, "metadata": { SchemaProps: spec.SchemaProps{ - Default: map[string]interface{}{}, - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), + Description: "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), }, }, "eventTime": { @@ -25472,7 +25651,7 @@ func schema_k8sio_api_events_v1beta1_Event(ref common.ReferenceCallback) common. }, }, }, - Required: []string{"metadata", "eventTime"}, + Required: []string{"eventTime"}, }, }, Dependencies: []string{ @@ -27115,10 +27294,17 @@ func schema_k8sio_api_extensions_v1beta1_NetworkPolicyPort(ref common.ReferenceC }, "port": { SchemaProps: spec.SchemaProps{ - Description: "If specified, the port on the given protocol. This can either be a numerical or named port on a pod. If this field is not provided, this matches all port names and numbers. If present, only traffic on the specified protocol AND port will be matched.", + Description: "The port on the given protocol. This can either be a numerical or named port on a pod. If this field is not provided, this matches all port names and numbers. If present, only traffic on the specified protocol AND port will be matched.", Ref: ref("k8s.io/apimachinery/pkg/util/intstr.IntOrString"), }, }, + "endPort": { + SchemaProps: spec.SchemaProps{ + Description: "If set, indicates that the range of ports from port to endPort, inclusive, should be allowed by the policy. This field cannot be defined if the port field is not defined or if the port field is defined as a named (string) port. The endPort must be equal or greater than port. This feature is in Alpha state and should be enabled using the Feature Gate \"NetworkPolicyEndPort\".", + Type: []string{"integer"}, + Format: "int32", + }, + }, }, }, }, @@ -27171,7 +27357,7 @@ func schema_k8sio_api_extensions_v1beta1_NetworkPolicySpec(ref common.ReferenceC }, "policyTypes": { SchemaProps: spec.SchemaProps{ - Description: "List of rule types that the NetworkPolicy relates to. Valid options are \"Ingress\", \"Egress\", or \"Ingress,Egress\". If this field is not specified, it will default based on the existence of Ingress or Egress rules; policies that contain an Egress section are assumed to affect Egress, and all policies (whether or not they contain an Ingress section) are assumed to affect Ingress. If you want to write an egress-only policy, you must explicitly specify policyTypes [ \"Egress\" ]. Likewise, if you want to write a policy that specifies that no egress is allowed, you must specify a policyTypes value that include \"Egress\" (since such a policy would not include an Egress section and would otherwise default to just [ \"Ingress\" ]). This field is beta-level in 1.8", + Description: "List of rule types that the NetworkPolicy relates to. Valid options are [\"Ingress\"], [\"Egress\"], or [\"Ingress\", \"Egress\"]. If this field is not specified, it will default based on the existence of Ingress or Egress rules; policies that contain an Egress section are assumed to affect Egress, and all policies (whether or not they contain an Ingress section) are assumed to affect Ingress. If you want to write an egress-only policy, you must explicitly specify policyTypes [ \"Egress\" ]. Likewise, if you want to write a policy that specifies that no egress is allowed, you must specify a policyTypes value that include \"Egress\" (since such a policy would not include an Egress section and would otherwise default to just [ \"Ingress\" ]). This field is beta-level in 1.8", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ @@ -27850,7 +28036,13 @@ func schema_k8sio_api_extensions_v1beta1_RollingUpdateDaemonSet(ref common.Refer Properties: map[string]spec.Schema{ "maxUnavailable": { SchemaProps: spec.SchemaProps{ - Description: "The maximum number of DaemonSet pods that can be unavailable during the update. Value can be an absolute number (ex: 5) or a percentage of total number of DaemonSet pods at the start of the update (ex: 10%). Absolute number is calculated from percentage by rounding up. This cannot be 0. Default value is 1. Example: when this is set to 30%, at most 30% of the total number of nodes that should be running the daemon pod (i.e. status.desiredNumberScheduled) can have their pods stopped for an update at any given time. The update starts by stopping at most 30% of those DaemonSet pods and then brings up new DaemonSet pods in their place. Once the new pods are available, it then proceeds onto other DaemonSet pods, thus ensuring that at least 70% of original number of DaemonSet pods are available at all times during the update.", + Description: "The maximum number of DaemonSet pods that can be unavailable during the update. Value can be an absolute number (ex: 5) or a percentage of total number of DaemonSet pods at the start of the update (ex: 10%). Absolute number is calculated from percentage by rounding down to a minimum of one. This cannot be 0 if MaxSurge is 0 Default value is 1. Example: when this is set to 30%, at most 30% of the total number of nodes that should be running the daemon pod (i.e. status.desiredNumberScheduled) can have their pods stopped for an update at any given time. The update starts by stopping at most 30% of those DaemonSet pods and then brings up new DaemonSet pods in their place. Once the new pods are available, it then proceeds onto other DaemonSet pods, thus ensuring that at least 70% of original number of DaemonSet pods are available at all times during the update.", + Ref: ref("k8s.io/apimachinery/pkg/util/intstr.IntOrString"), + }, + }, + "maxSurge": { + SchemaProps: spec.SchemaProps{ + Description: "The maximum number of nodes with an existing available DaemonSet pod that can have an updated DaemonSet pod during during an update. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). This can not be 0 if MaxUnavailable is 0. Absolute number is calculated from percentage by rounding up to a minimum of 1. Default value is 0. Example: when this is set to 30%, at most 30% of the total number of nodes that should be running the daemon pod (i.e. status.desiredNumberScheduled) can have their a new pod created before the old pod is marked as deleted. The update starts by launching new pods on 30% of nodes. Once an updated pod is available (Ready for at least minReadySeconds) the old DaemonSet pod on that node is marked deleted. If the old pod becomes unavailable for any reason (Ready transitions to false, is evicted, or is drained) an updated pod is immediatedly created on that node without considering surge limits. Allowing surge implies the possibility that the resources consumed by the daemonset on any given node can double if the readiness check fails, and so resource intensive daemonsets should take into account that they may cause evictions during disruption. This is an alpha field and requires enabling DaemonSetUpdateSurge feature gate.", Ref: ref("k8s.io/apimachinery/pkg/util/intstr.IntOrString"), }, }, @@ -30593,6 +30785,57 @@ func schema_k8sio_api_networking_v1_IngressClassList(ref common.ReferenceCallbac } } +func schema_k8sio_api_networking_v1_IngressClassParametersReference(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "IngressClassParametersReference identifies an API object. This can be used to specify a cluster or namespace-scoped resource.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "apiGroup": { + SchemaProps: spec.SchemaProps{ + Description: "APIGroup is the group for the resource being referenced. If APIGroup is not specified, the specified Kind must be in the core API group. For any other third-party types, APIGroup is required.", + Type: []string{"string"}, + Format: "", + }, + }, + "kind": { + SchemaProps: spec.SchemaProps{ + Description: "Kind is the type of resource being referenced.", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "name": { + SchemaProps: spec.SchemaProps{ + Description: "Name is the name of resource being referenced.", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "scope": { + SchemaProps: spec.SchemaProps{ + Description: "Scope represents if this refers to a cluster or namespace scoped resource. This may be set to \"Cluster\" (default) or \"Namespace\". Field can be enabled with IngressClassNamespacedParams feature gate.", + Type: []string{"string"}, + Format: "", + }, + }, + "namespace": { + SchemaProps: spec.SchemaProps{ + Description: "Namespace is the namespace of the resource being referenced. This field is required when scope is set to \"Namespace\" and must be unset when scope is set to \"Cluster\".", + Type: []string{"string"}, + Format: "", + }, + }, + }, + Required: []string{"kind", "name"}, + }, + }, + } +} + func schema_k8sio_api_networking_v1_IngressClassSpec(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -30610,14 +30853,14 @@ func schema_k8sio_api_networking_v1_IngressClassSpec(ref common.ReferenceCallbac "parameters": { SchemaProps: spec.SchemaProps{ Description: "Parameters is a link to a custom resource containing additional configuration for the controller. This is optional if the controller does not require extra parameters.", - Ref: ref("k8s.io/api/core/v1.TypedLocalObjectReference"), + Ref: ref("k8s.io/api/networking/v1.IngressClassParametersReference"), }, }, }, }, }, Dependencies: []string{ - "k8s.io/api/core/v1.TypedLocalObjectReference"}, + "k8s.io/api/networking/v1.IngressClassParametersReference"}, } } @@ -31107,10 +31350,17 @@ func schema_k8sio_api_networking_v1_NetworkPolicyPort(ref common.ReferenceCallba }, "port": { SchemaProps: spec.SchemaProps{ - Description: "The port on the given protocol. This can either be a numerical or named port on a pod. If this field is not provided, this matches all port names and numbers.", + Description: "The port on the given protocol. This can either be a numerical or named port on a pod. If this field is not provided, this matches all port names and numbers. If present, only traffic on the specified protocol AND port will be matched.", Ref: ref("k8s.io/apimachinery/pkg/util/intstr.IntOrString"), }, }, + "endPort": { + SchemaProps: spec.SchemaProps{ + Description: "If set, indicates that the range of ports from port to endPort, inclusive, should be allowed by the policy. This field cannot be defined if the port field is not defined or if the port field is defined as a named (string) port. The endPort must be equal or greater than port. This feature is in Alpha state and should be enabled using the Feature Gate \"NetworkPolicyEndPort\".", + Type: []string{"integer"}, + Format: "int32", + }, + }, }, }, }, @@ -31163,7 +31413,7 @@ func schema_k8sio_api_networking_v1_NetworkPolicySpec(ref common.ReferenceCallba }, "policyTypes": { SchemaProps: spec.SchemaProps{ - Description: "List of rule types that the NetworkPolicy relates to. Valid options are \"Ingress\", \"Egress\", or \"Ingress,Egress\". If this field is not specified, it will default based on the existence of Ingress or Egress rules; policies that contain an Egress section are assumed to affect Egress, and all policies (whether or not they contain an Ingress section) are assumed to affect Ingress. If you want to write an egress-only policy, you must explicitly specify policyTypes [ \"Egress\" ]. Likewise, if you want to write a policy that specifies that no egress is allowed, you must specify a policyTypes value that include \"Egress\" (since such a policy would not include an Egress section and would otherwise default to just [ \"Ingress\" ]). This field is beta-level in 1.8", + Description: "List of rule types that the NetworkPolicy relates to. Valid options are [\"Ingress\"], [\"Egress\"], or [\"Ingress\", \"Egress\"]. If this field is not specified, it will default based on the existence of Ingress or Egress rules; policies that contain an Egress section are assumed to affect Egress, and all policies (whether or not they contain an Ingress section) are assumed to affect Ingress. If you want to write an egress-only policy, you must explicitly specify policyTypes [ \"Egress\" ]. Likewise, if you want to write a policy that specifies that no egress is allowed, you must specify a policyTypes value that include \"Egress\" (since such a policy would not include an Egress section and would otherwise default to just [ \"Ingress\" ]). This field is beta-level in 1.8", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ @@ -31458,6 +31708,57 @@ func schema_k8sio_api_networking_v1beta1_IngressClassList(ref common.ReferenceCa } } +func schema_k8sio_api_networking_v1beta1_IngressClassParametersReference(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "IngressClassParametersReference identifies an API object. This can be used to specify a cluster or namespace-scoped resource.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "apiGroup": { + SchemaProps: spec.SchemaProps{ + Description: "APIGroup is the group for the resource being referenced. If APIGroup is not specified, the specified Kind must be in the core API group. For any other third-party types, APIGroup is required.", + Type: []string{"string"}, + Format: "", + }, + }, + "kind": { + SchemaProps: spec.SchemaProps{ + Description: "Kind is the type of resource being referenced.", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "name": { + SchemaProps: spec.SchemaProps{ + Description: "Name is the name of resource being referenced.", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "scope": { + SchemaProps: spec.SchemaProps{ + Description: "Scope represents if this refers to a cluster or namespace scoped resource. This may be set to \"Cluster\" (default) or \"Namespace\". Field can be enabled with IngressClassNamespacedParams feature gate.", + Type: []string{"string"}, + Format: "", + }, + }, + "namespace": { + SchemaProps: spec.SchemaProps{ + Description: "Namespace is the namespace of the resource being referenced. This field is required when scope is set to \"Namespace\" and must be unset when scope is set to \"Cluster\".", + Type: []string{"string"}, + Format: "", + }, + }, + }, + Required: []string{"kind", "name"}, + }, + }, + } +} + func schema_k8sio_api_networking_v1beta1_IngressClassSpec(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -31475,14 +31776,14 @@ func schema_k8sio_api_networking_v1beta1_IngressClassSpec(ref common.ReferenceCa "parameters": { SchemaProps: spec.SchemaProps{ Description: "Parameters is a link to a custom resource containing additional configuration for the controller. This is optional if the controller does not require extra parameters.", - Ref: ref("k8s.io/api/core/v1.TypedLocalObjectReference"), + Ref: ref("k8s.io/api/networking/v1beta1.IngressClassParametersReference"), }, }, }, }, }, Dependencies: []string{ - "k8s.io/api/core/v1.TypedLocalObjectReference"}, + "k8s.io/api/networking/v1beta1.IngressClassParametersReference"}, } } @@ -31943,23 +32244,247 @@ func schema_k8sio_api_node_v1alpha1_RuntimeClass(ref common.ReferenceCallback) c Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), }, }, - "spec": { + "spec": { + SchemaProps: spec.SchemaProps{ + Description: "Specification of the RuntimeClass More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status", + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/node/v1alpha1.RuntimeClassSpec"), + }, + }, + }, + Required: []string{"spec"}, + }, + }, + Dependencies: []string{ + "k8s.io/api/node/v1alpha1.RuntimeClassSpec", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + } +} + +func schema_k8sio_api_node_v1alpha1_RuntimeClassList(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "RuntimeClassList is a list of RuntimeClass objects.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "kind": { + SchemaProps: spec.SchemaProps{ + Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + Type: []string{"string"}, + Format: "", + }, + }, + "apiVersion": { + SchemaProps: spec.SchemaProps{ + Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + Type: []string{"string"}, + Format: "", + }, + }, + "metadata": { + SchemaProps: spec.SchemaProps{ + Description: "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"), + }, + }, + "items": { + SchemaProps: spec.SchemaProps{ + Description: "Items is a list of schema objects.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/node/v1alpha1.RuntimeClass"), + }, + }, + }, + }, + }, + }, + Required: []string{"items"}, + }, + }, + Dependencies: []string{ + "k8s.io/api/node/v1alpha1.RuntimeClass", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, + } +} + +func schema_k8sio_api_node_v1alpha1_RuntimeClassSpec(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "RuntimeClassSpec is a specification of a RuntimeClass. It contains parameters that are required to describe the RuntimeClass to the Container Runtime Interface (CRI) implementation, as well as any other components that need to understand how the pod will be run. The RuntimeClassSpec is immutable.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "runtimeHandler": { + SchemaProps: spec.SchemaProps{ + Description: "RuntimeHandler specifies the underlying runtime and configuration that the CRI implementation will use to handle pods of this class. The possible values are specific to the node & CRI configuration. It is assumed that all handlers are available on every node, and handlers of the same name are equivalent on every node. For example, a handler called \"runc\" might specify that the runc OCI runtime (using native Linux containers) will be used to run the containers in a pod. The RuntimeHandler must be lowercase, conform to the DNS Label (RFC 1123) requirements, and is immutable.", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "overhead": { + SchemaProps: spec.SchemaProps{ + Description: "Overhead represents the resource overhead associated with running a pod for a given RuntimeClass. For more details, see https://git.k8s.io/enhancements/keps/sig-node/20190226-pod-overhead.md This field is alpha-level as of Kubernetes v1.15, and is only honored by servers that enable the PodOverhead feature.", + Ref: ref("k8s.io/api/node/v1alpha1.Overhead"), + }, + }, + "scheduling": { + SchemaProps: spec.SchemaProps{ + Description: "Scheduling holds the scheduling constraints to ensure that pods running with this RuntimeClass are scheduled to nodes that support it. If scheduling is nil, this RuntimeClass is assumed to be supported by all nodes.", + Ref: ref("k8s.io/api/node/v1alpha1.Scheduling"), + }, + }, + }, + Required: []string{"runtimeHandler"}, + }, + }, + Dependencies: []string{ + "k8s.io/api/node/v1alpha1.Overhead", "k8s.io/api/node/v1alpha1.Scheduling"}, + } +} + +func schema_k8sio_api_node_v1alpha1_Scheduling(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "Scheduling specifies the scheduling constraints for nodes supporting a RuntimeClass.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "nodeSelector": { + SchemaProps: spec.SchemaProps{ + Description: "nodeSelector lists labels that must be present on nodes that support this RuntimeClass. Pods using this RuntimeClass can only be scheduled to a node matched by this selector. The RuntimeClass nodeSelector is merged with a pod's existing nodeSelector. Any conflicts will cause the pod to be rejected in admission.", + Type: []string{"object"}, + AdditionalProperties: &spec.SchemaOrBool{ + Allows: true, + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + "tolerations": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-type": "atomic", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "tolerations are appended (excluding duplicates) to pods running with this RuntimeClass during admission, effectively unioning the set of nodes tolerated by the pod and the RuntimeClass.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/core/v1.Toleration"), + }, + }, + }, + }, + }, + }, + }, + }, + Dependencies: []string{ + "k8s.io/api/core/v1.Toleration"}, + } +} + +func schema_k8sio_api_node_v1beta1_Overhead(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "Overhead structure represents the resource overhead associated with running a pod.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "podFixed": { + SchemaProps: spec.SchemaProps{ + Description: "PodFixed represents the fixed resource overhead associated with running a pod.", + Type: []string{"object"}, + AdditionalProperties: &spec.SchemaOrBool{ + Allows: true, + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/api/resource.Quantity"), + }, + }, + }, + }, + }, + }, + }, + }, + Dependencies: []string{ + "k8s.io/apimachinery/pkg/api/resource.Quantity"}, + } +} + +func schema_k8sio_api_node_v1beta1_RuntimeClass(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "RuntimeClass defines a class of container runtime supported in the cluster. The RuntimeClass is used to determine which container runtime is used to run all containers in a pod. RuntimeClasses are (currently) manually defined by a user or cluster provisioner, and referenced in the PodSpec. The Kubelet is responsible for resolving the RuntimeClassName reference before running the pod. For more details, see https://git.k8s.io/enhancements/keps/sig-node/runtime-class.md", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "kind": { + SchemaProps: spec.SchemaProps{ + Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + Type: []string{"string"}, + Format: "", + }, + }, + "apiVersion": { + SchemaProps: spec.SchemaProps{ + Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + Type: []string{"string"}, + Format: "", + }, + }, + "metadata": { + SchemaProps: spec.SchemaProps{ + Description: "More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), + }, + }, + "handler": { SchemaProps: spec.SchemaProps{ - Description: "Specification of the RuntimeClass More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status", - Default: map[string]interface{}{}, - Ref: ref("k8s.io/api/node/v1alpha1.RuntimeClassSpec"), + Description: "Handler specifies the underlying runtime and configuration that the CRI implementation will use to handle pods of this class. The possible values are specific to the node & CRI configuration. It is assumed that all handlers are available on every node, and handlers of the same name are equivalent on every node. For example, a handler called \"runc\" might specify that the runc OCI runtime (using native Linux containers) will be used to run the containers in a pod. The Handler must be lowercase, conform to the DNS Label (RFC 1123) requirements, and is immutable.", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "overhead": { + SchemaProps: spec.SchemaProps{ + Description: "Overhead represents the resource overhead associated with running a pod for a given RuntimeClass. For more details, see https://git.k8s.io/enhancements/keps/sig-node/20190226-pod-overhead.md This field is alpha-level as of Kubernetes v1.15, and is only honored by servers that enable the PodOverhead feature.", + Ref: ref("k8s.io/api/node/v1beta1.Overhead"), + }, + }, + "scheduling": { + SchemaProps: spec.SchemaProps{ + Description: "Scheduling holds the scheduling constraints to ensure that pods running with this RuntimeClass are scheduled to nodes that support it. If scheduling is nil, this RuntimeClass is assumed to be supported by all nodes.", + Ref: ref("k8s.io/api/node/v1beta1.Scheduling"), }, }, }, - Required: []string{"spec"}, + Required: []string{"handler"}, }, }, Dependencies: []string{ - "k8s.io/api/node/v1alpha1.RuntimeClassSpec", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + "k8s.io/api/node/v1beta1.Overhead", "k8s.io/api/node/v1beta1.Scheduling", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, } } -func schema_k8sio_api_node_v1alpha1_RuntimeClassList(ref common.ReferenceCallback) common.OpenAPIDefinition { +func schema_k8sio_api_node_v1beta1_RuntimeClassList(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ @@ -31995,7 +32520,7 @@ func schema_k8sio_api_node_v1alpha1_RuntimeClassList(ref common.ReferenceCallbac Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("k8s.io/api/node/v1alpha1.RuntimeClass"), + Ref: ref("k8s.io/api/node/v1beta1.RuntimeClass"), }, }, }, @@ -32006,47 +32531,11 @@ func schema_k8sio_api_node_v1alpha1_RuntimeClassList(ref common.ReferenceCallbac }, }, Dependencies: []string{ - "k8s.io/api/node/v1alpha1.RuntimeClass", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, - } -} - -func schema_k8sio_api_node_v1alpha1_RuntimeClassSpec(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "RuntimeClassSpec is a specification of a RuntimeClass. It contains parameters that are required to describe the RuntimeClass to the Container Runtime Interface (CRI) implementation, as well as any other components that need to understand how the pod will be run. The RuntimeClassSpec is immutable.", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "runtimeHandler": { - SchemaProps: spec.SchemaProps{ - Description: "RuntimeHandler specifies the underlying runtime and configuration that the CRI implementation will use to handle pods of this class. The possible values are specific to the node & CRI configuration. It is assumed that all handlers are available on every node, and handlers of the same name are equivalent on every node. For example, a handler called \"runc\" might specify that the runc OCI runtime (using native Linux containers) will be used to run the containers in a pod. The RuntimeHandler must be lowercase, conform to the DNS Label (RFC 1123) requirements, and is immutable.", - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - "overhead": { - SchemaProps: spec.SchemaProps{ - Description: "Overhead represents the resource overhead associated with running a pod for a given RuntimeClass. For more details, see https://git.k8s.io/enhancements/keps/sig-node/20190226-pod-overhead.md This field is alpha-level as of Kubernetes v1.15, and is only honored by servers that enable the PodOverhead feature.", - Ref: ref("k8s.io/api/node/v1alpha1.Overhead"), - }, - }, - "scheduling": { - SchemaProps: spec.SchemaProps{ - Description: "Scheduling holds the scheduling constraints to ensure that pods running with this RuntimeClass are scheduled to nodes that support it. If scheduling is nil, this RuntimeClass is assumed to be supported by all nodes.", - Ref: ref("k8s.io/api/node/v1alpha1.Scheduling"), - }, - }, - }, - Required: []string{"runtimeHandler"}, - }, - }, - Dependencies: []string{ - "k8s.io/api/node/v1alpha1.Overhead", "k8s.io/api/node/v1alpha1.Scheduling"}, + "k8s.io/api/node/v1beta1.RuntimeClass", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, } } -func schema_k8sio_api_node_v1alpha1_Scheduling(ref common.ReferenceCallback) common.OpenAPIDefinition { +func schema_k8sio_api_node_v1beta1_Scheduling(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ @@ -32096,41 +32585,11 @@ func schema_k8sio_api_node_v1alpha1_Scheduling(ref common.ReferenceCallback) com } } -func schema_k8sio_api_node_v1beta1_Overhead(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "Overhead structure represents the resource overhead associated with running a pod.", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "podFixed": { - SchemaProps: spec.SchemaProps{ - Description: "PodFixed represents the fixed resource overhead associated with running a pod.", - Type: []string{"object"}, - AdditionalProperties: &spec.SchemaOrBool{ - Allows: true, - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Default: map[string]interface{}{}, - Ref: ref("k8s.io/apimachinery/pkg/api/resource.Quantity"), - }, - }, - }, - }, - }, - }, - }, - }, - Dependencies: []string{ - "k8s.io/apimachinery/pkg/api/resource.Quantity"}, - } -} - -func schema_k8sio_api_node_v1beta1_RuntimeClass(ref common.ReferenceCallback) common.OpenAPIDefinition { +func schema_k8sio_api_policy_v1_PodDisruptionBudget(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ - Description: "RuntimeClass defines a class of container runtime supported in the cluster. The RuntimeClass is used to determine which container runtime is used to run all containers in a pod. RuntimeClasses are (currently) manually defined by a user or cluster provisioner, and referenced in the PodSpec. The Kubelet is responsible for resolving the RuntimeClassName reference before running the pod. For more details, see https://git.k8s.io/enhancements/keps/sig-node/runtime-class.md", + Description: "PodDisruptionBudget is an object to define the max disruption that can be caused to a collection of pods", Type: []string{"object"}, Properties: map[string]spec.Schema{ "kind": { @@ -32149,45 +32608,38 @@ func schema_k8sio_api_node_v1beta1_RuntimeClass(ref common.ReferenceCallback) co }, "metadata": { SchemaProps: spec.SchemaProps{ - Description: "More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + Description: "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", Default: map[string]interface{}{}, Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), }, }, - "handler": { - SchemaProps: spec.SchemaProps{ - Description: "Handler specifies the underlying runtime and configuration that the CRI implementation will use to handle pods of this class. The possible values are specific to the node & CRI configuration. It is assumed that all handlers are available on every node, and handlers of the same name are equivalent on every node. For example, a handler called \"runc\" might specify that the runc OCI runtime (using native Linux containers) will be used to run the containers in a pod. The Handler must be lowercase, conform to the DNS Label (RFC 1123) requirements, and is immutable.", - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - "overhead": { + "spec": { SchemaProps: spec.SchemaProps{ - Description: "Overhead represents the resource overhead associated with running a pod for a given RuntimeClass. For more details, see https://git.k8s.io/enhancements/keps/sig-node/20190226-pod-overhead.md This field is alpha-level as of Kubernetes v1.15, and is only honored by servers that enable the PodOverhead feature.", - Ref: ref("k8s.io/api/node/v1beta1.Overhead"), + Description: "Specification of the desired behavior of the PodDisruptionBudget.", + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/policy/v1.PodDisruptionBudgetSpec"), }, }, - "scheduling": { + "status": { SchemaProps: spec.SchemaProps{ - Description: "Scheduling holds the scheduling constraints to ensure that pods running with this RuntimeClass are scheduled to nodes that support it. If scheduling is nil, this RuntimeClass is assumed to be supported by all nodes.", - Ref: ref("k8s.io/api/node/v1beta1.Scheduling"), + Description: "Most recently observed status of the PodDisruptionBudget.", + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/policy/v1.PodDisruptionBudgetStatus"), }, }, }, - Required: []string{"handler"}, }, }, Dependencies: []string{ - "k8s.io/api/node/v1beta1.Overhead", "k8s.io/api/node/v1beta1.Scheduling", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + "k8s.io/api/policy/v1.PodDisruptionBudgetSpec", "k8s.io/api/policy/v1.PodDisruptionBudgetStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, } } -func schema_k8sio_api_node_v1beta1_RuntimeClassList(ref common.ReferenceCallback) common.OpenAPIDefinition { +func schema_k8sio_api_policy_v1_PodDisruptionBudgetList(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ - Description: "RuntimeClassList is a list of RuntimeClass objects.", + Description: "PodDisruptionBudgetList is a collection of PodDisruptionBudgets.", Type: []string{"object"}, Properties: map[string]spec.Schema{ "kind": { @@ -32206,20 +32658,20 @@ func schema_k8sio_api_node_v1beta1_RuntimeClassList(ref common.ReferenceCallback }, "metadata": { SchemaProps: spec.SchemaProps{ - Description: "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + Description: "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", Default: map[string]interface{}{}, Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"), }, }, "items": { SchemaProps: spec.SchemaProps{ - Description: "Items is a list of schema objects.", + Description: "Items is a list of PodDisruptionBudgets", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("k8s.io/api/node/v1beta1.RuntimeClass"), + Ref: ref("k8s.io/api/policy/v1.PodDisruptionBudget"), }, }, }, @@ -32230,57 +32682,139 @@ func schema_k8sio_api_node_v1beta1_RuntimeClassList(ref common.ReferenceCallback }, }, Dependencies: []string{ - "k8s.io/api/node/v1beta1.RuntimeClass", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, + "k8s.io/api/policy/v1.PodDisruptionBudget", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, } } -func schema_k8sio_api_node_v1beta1_Scheduling(ref common.ReferenceCallback) common.OpenAPIDefinition { +func schema_k8sio_api_policy_v1_PodDisruptionBudgetSpec(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ - Description: "Scheduling specifies the scheduling constraints for nodes supporting a RuntimeClass.", + Description: "PodDisruptionBudgetSpec is a description of a PodDisruptionBudget.", Type: []string{"object"}, Properties: map[string]spec.Schema{ - "nodeSelector": { + "minAvailable": { SchemaProps: spec.SchemaProps{ - Description: "nodeSelector lists labels that must be present on nodes that support this RuntimeClass. Pods using this RuntimeClass can only be scheduled to a node matched by this selector. The RuntimeClass nodeSelector is merged with a pod's existing nodeSelector. Any conflicts will cause the pod to be rejected in admission.", + Description: "An eviction is allowed if at least \"minAvailable\" pods selected by \"selector\" will still be available after the eviction, i.e. even in the absence of the evicted pod. So for example you can prevent all voluntary evictions by specifying \"100%\".", + Ref: ref("k8s.io/apimachinery/pkg/util/intstr.IntOrString"), + }, + }, + "selector": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-patch-strategy": "replace", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "Label query over pods whose evictions are managed by the disruption budget. A null selector will match no pods, while an empty ({}) selector will select all pods within the namespace.", + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.LabelSelector"), + }, + }, + "maxUnavailable": { + SchemaProps: spec.SchemaProps{ + Description: "An eviction is allowed if at most \"maxUnavailable\" pods selected by \"selector\" are unavailable after the eviction, i.e. even in absence of the evicted pod. For example, one can prevent all voluntary evictions by specifying 0. This is a mutually exclusive setting with \"minAvailable\".", + Ref: ref("k8s.io/apimachinery/pkg/util/intstr.IntOrString"), + }, + }, + }, + }, + }, + Dependencies: []string{ + "k8s.io/apimachinery/pkg/apis/meta/v1.LabelSelector", "k8s.io/apimachinery/pkg/util/intstr.IntOrString"}, + } +} + +func schema_k8sio_api_policy_v1_PodDisruptionBudgetStatus(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "PodDisruptionBudgetStatus represents information about the status of a PodDisruptionBudget. Status may trail the actual state of a system.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "observedGeneration": { + SchemaProps: spec.SchemaProps{ + Description: "Most recent generation observed when updating this PDB status. DisruptionsAllowed and other status information is valid only if observedGeneration equals to PDB's object generation.", + Type: []string{"integer"}, + Format: "int64", + }, + }, + "disruptedPods": { + SchemaProps: spec.SchemaProps{ + Description: "DisruptedPods contains information about pods whose eviction was processed by the API server eviction subresource handler but has not yet been observed by the PodDisruptionBudget controller. A pod will be in this map from the time when the API server processed the eviction request to the time when the pod is seen by PDB controller as having been marked for deletion (or after a timeout). The key in the map is the name of the pod and the value is the time when the API server processed the eviction request. If the deletion didn't occur and a pod is still there it will be removed from the list automatically by PodDisruptionBudget controller after some time. If everything goes smooth this map should be empty for the most of the time. Large number of entries in the map may indicate problems with pod deletions.", Type: []string{"object"}, AdditionalProperties: &spec.SchemaOrBool{ Allows: true, Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Default: "", - Type: []string{"string"}, - Format: "", + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), }, }, }, }, }, - "tolerations": { + "disruptionsAllowed": { + SchemaProps: spec.SchemaProps{ + Description: "Number of pod disruptions that are currently allowed.", + Default: 0, + Type: []string{"integer"}, + Format: "int32", + }, + }, + "currentHealthy": { + SchemaProps: spec.SchemaProps{ + Description: "current number of healthy pods", + Default: 0, + Type: []string{"integer"}, + Format: "int32", + }, + }, + "desiredHealthy": { + SchemaProps: spec.SchemaProps{ + Description: "minimum desired number of healthy pods", + Default: 0, + Type: []string{"integer"}, + Format: "int32", + }, + }, + "expectedPods": { + SchemaProps: spec.SchemaProps{ + Description: "total number of pods counted by this disruption budget", + Default: 0, + Type: []string{"integer"}, + Format: "int32", + }, + }, + "conditions": { VendorExtensible: spec.VendorExtensible{ Extensions: spec.Extensions{ - "x-kubernetes-list-type": "atomic", + "x-kubernetes-list-map-keys": []interface{}{ + "type", + }, + "x-kubernetes-list-type": "map", + "x-kubernetes-patch-merge-key": "type", + "x-kubernetes-patch-strategy": "merge", }, }, SchemaProps: spec.SchemaProps{ - Description: "tolerations are appended (excluding duplicates) to pods running with this RuntimeClass during admission, effectively unioning the set of nodes tolerated by the pod and the RuntimeClass.", + Description: "Conditions contain conditions for PDB. The disruption controller sets the DisruptionAllowed condition. The following are known values for the reason field (additional reasons could be added in the future): - SyncFailed: The controller encountered an error and wasn't able to compute\n the number of allowed disruptions. Therefore no disruptions are\n allowed and the status of the condition will be False.\n- InsufficientPods: The number of pods are either at or below the number\n required by the PodDisruptionBudget. No disruptions are\n allowed and the status of the condition will be False.\n- SufficientPods: There are more pods than required by the PodDisruptionBudget.\n The condition will be True, and the number of allowed\n disruptions are provided by the disruptionsAllowed property.", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("k8s.io/api/core/v1.Toleration"), + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Condition"), }, }, }, }, }, }, + Required: []string{"disruptionsAllowed", "currentHealthy", "desiredHealthy", "expectedPods"}, }, }, Dependencies: []string{ - "k8s.io/api/core/v1.Toleration"}, + "k8s.io/apimachinery/pkg/apis/meta/v1.Condition", "k8s.io/apimachinery/pkg/apis/meta/v1.Time"}, } } @@ -32605,8 +33139,13 @@ func schema_k8sio_api_policy_v1beta1_PodDisruptionBudgetSpec(ref common.Referenc }, }, "selector": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-patch-strategy": "replace", + }, + }, SchemaProps: spec.SchemaProps{ - Description: "Label query over pods whose evictions are managed by the disruption budget.", + Description: "Label query over pods whose evictions are managed by the disruption budget. A null selector selects no pods. An empty selector ({}) also selects no pods, which differs from standard behavior of selecting all pods. In policy/v1, an empty selector will select all pods in the namespace.", Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.LabelSelector"), }, }, @@ -32685,12 +33224,36 @@ func schema_k8sio_api_policy_v1beta1_PodDisruptionBudgetStatus(ref common.Refere Format: "int32", }, }, + "conditions": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-map-keys": []interface{}{ + "type", + }, + "x-kubernetes-list-type": "map", + "x-kubernetes-patch-merge-key": "type", + "x-kubernetes-patch-strategy": "merge", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "Conditions contain conditions for PDB. The disruption controller sets the DisruptionAllowed condition. The following are known values for the reason field (additional reasons could be added in the future): - SyncFailed: The controller encountered an error and wasn't able to compute\n the number of allowed disruptions. Therefore no disruptions are\n allowed and the status of the condition will be False.\n- InsufficientPods: The number of pods are either at or below the number\n required by the PodDisruptionBudget. No disruptions are\n allowed and the status of the condition will be False.\n- SufficientPods: There are more pods than required by the PodDisruptionBudget.\n The condition will be True, and the number of allowed\n disruptions are provided by the disruptionsAllowed property.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Condition"), + }, + }, + }, + }, + }, }, Required: []string{"disruptionsAllowed", "currentHealthy", "desiredHealthy", "expectedPods"}, }, }, Dependencies: []string{ - "k8s.io/apimachinery/pkg/apis/meta/v1.Time"}, + "k8s.io/apimachinery/pkg/apis/meta/v1.Condition", "k8s.io/apimachinery/pkg/apis/meta/v1.Time"}, } } @@ -32698,7 +33261,7 @@ func schema_k8sio_api_policy_v1beta1_PodSecurityPolicy(ref common.ReferenceCallb return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ - Description: "PodSecurityPolicy governs the ability to make requests that affect the Security Context that will be applied to a pod and container.", + Description: "PodSecurityPolicy governs the ability to make requests that affect the Security Context that will be applied to a pod and container. Deprecated in 1.21.", Type: []string{"object"}, Properties: map[string]spec.Schema{ "kind": { @@ -35565,14 +36128,14 @@ func schema_k8sio_api_storage_v1_CSIDriverSpec(ref common.ReferenceCallback) com Properties: map[string]spec.Schema{ "attachRequired": { SchemaProps: spec.SchemaProps{ - Description: "attachRequired indicates this CSI volume driver requires an attach operation (because it implements the CSI ControllerPublishVolume() method), and that the Kubernetes attach detach controller should call the attach volume interface which checks the volumeattachment status and waits until the volume is attached before proceeding to mounting. The CSI external-attacher coordinates with CSI volume driver and updates the volumeattachment status when the attach operation is complete. If the CSIDriverRegistry feature gate is enabled and the value is specified to false, the attach operation will be skipped. Otherwise the attach operation will be called.", + Description: "attachRequired indicates this CSI volume driver requires an attach operation (because it implements the CSI ControllerPublishVolume() method), and that the Kubernetes attach detach controller should call the attach volume interface which checks the volumeattachment status and waits until the volume is attached before proceeding to mounting. The CSI external-attacher coordinates with CSI volume driver and updates the volumeattachment status when the attach operation is complete. If the CSIDriverRegistry feature gate is enabled and the value is specified to false, the attach operation will be skipped. Otherwise the attach operation will be called.\n\nThis field is immutable.", Type: []string{"boolean"}, Format: "", }, }, "podInfoOnMount": { SchemaProps: spec.SchemaProps{ - Description: "If set to true, podInfoOnMount indicates this CSI volume driver requires additional pod information (like podName, podUID, etc.) during mount operations. If set to false, pod information will not be passed on mount. Default is false. The CSI driver specifies podInfoOnMount as part of driver deployment. If true, Kubelet will pass pod information as VolumeContext in the CSI NodePublishVolume() calls. The CSI driver is responsible for parsing and validating the information passed in as VolumeContext. The following VolumeConext will be passed if podInfoOnMount is set to true. This list might grow, but the prefix will be used. \"csi.storage.k8s.io/pod.name\": pod.Name \"csi.storage.k8s.io/pod.namespace\": pod.Namespace \"csi.storage.k8s.io/pod.uid\": string(pod.UID) \"csi.storage.k8s.io/ephemeral\": \"true\" iff the volume is an ephemeral inline volume\n defined by a CSIVolumeSource, otherwise \"false\"\n\n\"csi.storage.k8s.io/ephemeral\" is a new feature in Kubernetes 1.16. It is only required for drivers which support both the \"Persistent\" and \"Ephemeral\" VolumeLifecycleMode. Other drivers can leave pod info disabled and/or ignore this field. As Kubernetes 1.15 doesn't support this field, drivers can only support one mode when deployed on such a cluster and the deployment determines which mode that is, for example via a command line parameter of the driver.", + Description: "If set to true, podInfoOnMount indicates this CSI volume driver requires additional pod information (like podName, podUID, etc.) during mount operations. If set to false, pod information will not be passed on mount. Default is false. The CSI driver specifies podInfoOnMount as part of driver deployment. If true, Kubelet will pass pod information as VolumeContext in the CSI NodePublishVolume() calls. The CSI driver is responsible for parsing and validating the information passed in as VolumeContext. The following VolumeConext will be passed if podInfoOnMount is set to true. This list might grow, but the prefix will be used. \"csi.storage.k8s.io/pod.name\": pod.Name \"csi.storage.k8s.io/pod.namespace\": pod.Namespace \"csi.storage.k8s.io/pod.uid\": string(pod.UID) \"csi.storage.k8s.io/ephemeral\": \"true\" if the volume is an ephemeral inline volume\n defined by a CSIVolumeSource, otherwise \"false\"\n\n\"csi.storage.k8s.io/ephemeral\" is a new feature in Kubernetes 1.16. It is only required for drivers which support both the \"Persistent\" and \"Ephemeral\" VolumeLifecycleMode. Other drivers can leave pod info disabled and/or ignore this field. As Kubernetes 1.15 doesn't support this field, drivers can only support one mode when deployed on such a cluster and the deployment determines which mode that is, for example via a command line parameter of the driver.\n\nThis field is immutable.", Type: []string{"boolean"}, Format: "", }, @@ -35584,7 +36147,7 @@ func schema_k8sio_api_storage_v1_CSIDriverSpec(ref common.ReferenceCallback) com }, }, SchemaProps: spec.SchemaProps{ - Description: "volumeLifecycleModes defines what kind of volumes this CSI volume driver supports. The default if the list is empty is \"Persistent\", which is the usage defined by the CSI specification and implemented in Kubernetes via the usual PV/PVC mechanism. The other mode is \"Ephemeral\". In this mode, volumes are defined inline inside the pod spec with CSIVolumeSource and their lifecycle is tied to the lifecycle of that pod. A driver has to be aware of this because it is only going to get a NodePublishVolume call for such a volume. For more information about implementing this mode, see https://kubernetes-csi.github.io/docs/ephemeral-local-volumes.html A driver can support one or more of these modes and more modes may be added in the future. This field is beta.", + Description: "volumeLifecycleModes defines what kind of volumes this CSI volume driver supports. The default if the list is empty is \"Persistent\", which is the usage defined by the CSI specification and implemented in Kubernetes via the usual PV/PVC mechanism. The other mode is \"Ephemeral\". In this mode, volumes are defined inline inside the pod spec with CSIVolumeSource and their lifecycle is tied to the lifecycle of that pod. A driver has to be aware of this because it is only going to get a NodePublishVolume call for such a volume. For more information about implementing this mode, see https://kubernetes-csi.github.io/docs/ephemeral-local-volumes.html A driver can support one or more of these modes and more modes may be added in the future. This field is beta.\n\nThis field is immutable.", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ @@ -35599,14 +36162,14 @@ func schema_k8sio_api_storage_v1_CSIDriverSpec(ref common.ReferenceCallback) com }, "storageCapacity": { SchemaProps: spec.SchemaProps{ - Description: "If set to true, storageCapacity indicates that the CSI volume driver wants pod scheduling to consider the storage capacity that the driver deployment will report by creating CSIStorageCapacity objects with capacity information.\n\nThe check can be enabled immediately when deploying a driver. In that case, provisioning new volumes with late binding will pause until the driver deployment has published some suitable CSIStorageCapacity object.\n\nAlternatively, the driver can be deployed with the field unset or false and it can be flipped later when storage capacity information has been published.\n\nThis is an alpha field and only available when the CSIStorageCapacity feature is enabled. The default is false.", + Description: "If set to true, storageCapacity indicates that the CSI volume driver wants pod scheduling to consider the storage capacity that the driver deployment will report by creating CSIStorageCapacity objects with capacity information.\n\nThe check can be enabled immediately when deploying a driver. In that case, provisioning new volumes with late binding will pause until the driver deployment has published some suitable CSIStorageCapacity object.\n\nAlternatively, the driver can be deployed with the field unset or false and it can be flipped later when storage capacity information has been published.\n\nThis field is immutable.\n\nThis is a beta field and only available when the CSIStorageCapacity feature is enabled. The default is false.", Type: []string{"boolean"}, Format: "", }, }, "fsGroupPolicy": { SchemaProps: spec.SchemaProps{ - Description: "Defines if the underlying volume supports changing ownership and permission of the volume before being mounted. Refer to the specific FSGroupPolicy values for additional details. This field is alpha-level, and is only honored by servers that enable the CSIVolumeFSGroupPolicy feature gate.", + Description: "Defines if the underlying volume supports changing ownership and permission of the volume before being mounted. Refer to the specific FSGroupPolicy values for additional details. This field is alpha-level, and is only honored by servers that enable the CSIVolumeFSGroupPolicy feature gate.\n\nThis field is immutable.", Type: []string{"string"}, Format: "", }, @@ -35618,7 +36181,7 @@ func schema_k8sio_api_storage_v1_CSIDriverSpec(ref common.ReferenceCallback) com }, }, SchemaProps: spec.SchemaProps{ - Description: "TokenRequests indicates the CSI driver needs pods' service account tokens it is mounting volume for to do necessary authentication. Kubelet will pass the tokens in VolumeContext in the CSI NodePublishVolume calls. The CSI driver should parse and validate the following VolumeContext: \"csi.storage.k8s.io/serviceAccount.tokens\": {\n \"\": {\n \"token\": ,\n \"expirationTimestamp\": ,\n },\n ...\n}\n\nNote: Audience in each TokenRequest should be different and at most one token is empty string. To receive a new token after expiry, RequiresRepublish can be used to trigger NodePublishVolume periodically.\n\nThis is an alpha feature and only available when the CSIServiceAccountToken feature is enabled.", + Description: "TokenRequests indicates the CSI driver needs pods' service account tokens it is mounting volume for to do necessary authentication. Kubelet will pass the tokens in VolumeContext in the CSI NodePublishVolume calls. The CSI driver should parse and validate the following VolumeContext: \"csi.storage.k8s.io/serviceAccount.tokens\": {\n \"\": {\n \"token\": ,\n \"expirationTimestamp\": ,\n },\n ...\n}\n\nNote: Audience in each TokenRequest should be different and at most one token is empty string. To receive a new token after expiry, RequiresRepublish can be used to trigger NodePublishVolume periodically.\n\nThis is a beta feature and only available when the CSIServiceAccountToken feature is enabled.", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ @@ -35632,7 +36195,7 @@ func schema_k8sio_api_storage_v1_CSIDriverSpec(ref common.ReferenceCallback) com }, "requiresRepublish": { SchemaProps: spec.SchemaProps{ - Description: "RequiresRepublish indicates the CSI driver wants `NodePublishVolume` being periodically called to reflect any possible change in the mounted volume. This field defaults to false.\n\nNote: After a successful initial NodePublishVolume call, subsequent calls to NodePublishVolume should only update the contents of the volume. New mount points will not be seen by a running container.\n\nThis is an alpha feature and only available when the CSIServiceAccountToken feature is enabled.", + Description: "RequiresRepublish indicates the CSI driver wants `NodePublishVolume` being periodically called to reflect any possible change in the mounted volume. This field defaults to false.\n\nNote: After a successful initial NodePublishVolume call, subsequent calls to NodePublishVolume should only update the contents of the volume. New mount points will not be seen by a running container.\n\nThis is a beta feature and only available when the CSIServiceAccountToken feature is enabled.", Type: []string{"boolean"}, Format: "", }, @@ -36138,7 +36701,7 @@ func schema_k8sio_api_storage_v1_VolumeAttachmentSource(ref common.ReferenceCall }, "inlineVolumeSpec": { SchemaProps: spec.SchemaProps{ - Description: "inlineVolumeSpec contains all the information necessary to attach a persistent volume defined by a pod's inline VolumeSource. This field is populated only for the CSIMigration feature. It contains translated fields from a pod's inline VolumeSource to a PersistentVolumeSpec. This field is alpha-level and is only honored by servers that enabled the CSIMigration feature.", + Description: "inlineVolumeSpec contains all the information necessary to attach a persistent volume defined by a pod's inline VolumeSource. This field is populated only for the CSIMigration feature. It contains translated fields from a pod's inline VolumeSource to a PersistentVolumeSpec. This field is beta-level and is only honored by servers that enabled the CSIMigration feature.", Ref: ref("k8s.io/api/core/v1.PersistentVolumeSpec"), }, }, @@ -36294,7 +36857,7 @@ func schema_k8sio_api_storage_v1alpha1_CSIStorageCapacity(ref common.ReferenceCa return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ - Description: "CSIStorageCapacity stores the result of one CSI GetCapacity call. For a given StorageClass, this describes the available capacity in a particular topology segment. This can be used when considering where to instantiate new PersistentVolumes.\n\nFor example this can express things like: - StorageClass \"standard\" has \"1234 GiB\" available in \"topology.kubernetes.io/zone=us-east1\" - StorageClass \"localssd\" has \"10 GiB\" available in \"kubernetes.io/hostname=knode-abc123\"\n\nThe following three cases all imply that no capacity is available for a certain combination: - no object exists with suitable topology and storage class name - such an object exists, but the capacity is unset - such an object exists, but the capacity is zero\n\nThe producer of these objects can decide which approach is more suitable.\n\nThis is an alpha feature and only available when the CSIStorageCapacity feature is enabled.", + Description: "CSIStorageCapacity stores the result of one CSI GetCapacity call. For a given StorageClass, this describes the available capacity in a particular topology segment. This can be used when considering where to instantiate new PersistentVolumes.\n\nFor example this can express things like: - StorageClass \"standard\" has \"1234 GiB\" available in \"topology.kubernetes.io/zone=us-east1\" - StorageClass \"localssd\" has \"10 GiB\" available in \"kubernetes.io/hostname=knode-abc123\"\n\nThe following three cases all imply that no capacity is available for a certain combination: - no object exists with suitable topology and storage class name - such an object exists, but the capacity is unset - such an object exists, but the capacity is zero\n\nThe producer of these objects can decide which approach is more suitable.\n\nThey are consumed by the kube-scheduler if the CSIStorageCapacity beta feature gate is enabled there and a CSI driver opts into capacity-aware scheduling with CSIDriver.StorageCapacity.", Type: []string{"object"}, Properties: map[string]spec.Schema{ "kind": { @@ -36338,6 +36901,12 @@ func schema_k8sio_api_storage_v1alpha1_CSIStorageCapacity(ref common.ReferenceCa Ref: ref("k8s.io/apimachinery/pkg/api/resource.Quantity"), }, }, + "maximumVolumeSize": { + SchemaProps: spec.SchemaProps{ + Description: "MaximumVolumeSize is the value reported by the CSI driver in its GetCapacityResponse for a GetCapacityRequest with topology and parameters that match the previous fields.\n\nThis is defined since CSI spec 1.4.0 as the largest size that may be used in a CreateVolumeRequest.capacity_range.required_bytes field to create a volume with the same parameters as those in GetCapacityRequest. The corresponding value in the Kubernetes API is ResourceRequirements.Requests in a volume claim.", + Ref: ref("k8s.io/apimachinery/pkg/api/resource.Quantity"), + }, + }, }, Required: []string{"storageClassName"}, }, @@ -36760,21 +37329,21 @@ func schema_k8sio_api_storage_v1beta1_CSIDriverSpec(ref common.ReferenceCallback Properties: map[string]spec.Schema{ "attachRequired": { SchemaProps: spec.SchemaProps{ - Description: "attachRequired indicates this CSI volume driver requires an attach operation (because it implements the CSI ControllerPublishVolume() method), and that the Kubernetes attach detach controller should call the attach volume interface which checks the volumeattachment status and waits until the volume is attached before proceeding to mounting. The CSI external-attacher coordinates with CSI volume driver and updates the volumeattachment status when the attach operation is complete. If the CSIDriverRegistry feature gate is enabled and the value is specified to false, the attach operation will be skipped. Otherwise the attach operation will be called.", + Description: "attachRequired indicates this CSI volume driver requires an attach operation (because it implements the CSI ControllerPublishVolume() method), and that the Kubernetes attach detach controller should call the attach volume interface which checks the volumeattachment status and waits until the volume is attached before proceeding to mounting. The CSI external-attacher coordinates with CSI volume driver and updates the volumeattachment status when the attach operation is complete. If the CSIDriverRegistry feature gate is enabled and the value is specified to false, the attach operation will be skipped. Otherwise the attach operation will be called.\n\nThis field is immutable.", Type: []string{"boolean"}, Format: "", }, }, "podInfoOnMount": { SchemaProps: spec.SchemaProps{ - Description: "If set to true, podInfoOnMount indicates this CSI volume driver requires additional pod information (like podName, podUID, etc.) during mount operations. If set to false, pod information will not be passed on mount. Default is false. The CSI driver specifies podInfoOnMount as part of driver deployment. If true, Kubelet will pass pod information as VolumeContext in the CSI NodePublishVolume() calls. The CSI driver is responsible for parsing and validating the information passed in as VolumeContext. The following VolumeConext will be passed if podInfoOnMount is set to true. This list might grow, but the prefix will be used. \"csi.storage.k8s.io/pod.name\": pod.Name \"csi.storage.k8s.io/pod.namespace\": pod.Namespace \"csi.storage.k8s.io/pod.uid\": string(pod.UID) \"csi.storage.k8s.io/ephemeral\": \"true\" iff the volume is an ephemeral inline volume\n defined by a CSIVolumeSource, otherwise \"false\"\n\n\"csi.storage.k8s.io/ephemeral\" is a new feature in Kubernetes 1.16. It is only required for drivers which support both the \"Persistent\" and \"Ephemeral\" VolumeLifecycleMode. Other drivers can leave pod info disabled and/or ignore this field. As Kubernetes 1.15 doesn't support this field, drivers can only support one mode when deployed on such a cluster and the deployment determines which mode that is, for example via a command line parameter of the driver.", + Description: "If set to true, podInfoOnMount indicates this CSI volume driver requires additional pod information (like podName, podUID, etc.) during mount operations. If set to false, pod information will not be passed on mount. Default is false. The CSI driver specifies podInfoOnMount as part of driver deployment. If true, Kubelet will pass pod information as VolumeContext in the CSI NodePublishVolume() calls. The CSI driver is responsible for parsing and validating the information passed in as VolumeContext. The following VolumeConext will be passed if podInfoOnMount is set to true. This list might grow, but the prefix will be used. \"csi.storage.k8s.io/pod.name\": pod.Name \"csi.storage.k8s.io/pod.namespace\": pod.Namespace \"csi.storage.k8s.io/pod.uid\": string(pod.UID) \"csi.storage.k8s.io/ephemeral\": \"true\" if the volume is an ephemeral inline volume\n defined by a CSIVolumeSource, otherwise \"false\"\n\n\"csi.storage.k8s.io/ephemeral\" is a new feature in Kubernetes 1.16. It is only required for drivers which support both the \"Persistent\" and \"Ephemeral\" VolumeLifecycleMode. Other drivers can leave pod info disabled and/or ignore this field. As Kubernetes 1.15 doesn't support this field, drivers can only support one mode when deployed on such a cluster and the deployment determines which mode that is, for example via a command line parameter of the driver.\n\nThis field is immutable.", Type: []string{"boolean"}, Format: "", }, }, "volumeLifecycleModes": { SchemaProps: spec.SchemaProps{ - Description: "VolumeLifecycleModes defines what kind of volumes this CSI volume driver supports. The default if the list is empty is \"Persistent\", which is the usage defined by the CSI specification and implemented in Kubernetes via the usual PV/PVC mechanism. The other mode is \"Ephemeral\". In this mode, volumes are defined inline inside the pod spec with CSIVolumeSource and their lifecycle is tied to the lifecycle of that pod. A driver has to be aware of this because it is only going to get a NodePublishVolume call for such a volume. For more information about implementing this mode, see https://kubernetes-csi.github.io/docs/ephemeral-local-volumes.html A driver can support one or more of these modes and more modes may be added in the future.", + Description: "VolumeLifecycleModes defines what kind of volumes this CSI volume driver supports. The default if the list is empty is \"Persistent\", which is the usage defined by the CSI specification and implemented in Kubernetes via the usual PV/PVC mechanism. The other mode is \"Ephemeral\". In this mode, volumes are defined inline inside the pod spec with CSIVolumeSource and their lifecycle is tied to the lifecycle of that pod. A driver has to be aware of this because it is only going to get a NodePublishVolume call for such a volume. For more information about implementing this mode, see https://kubernetes-csi.github.io/docs/ephemeral-local-volumes.html A driver can support one or more of these modes and more modes may be added in the future.\n\nThis field is immutable.", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ @@ -36789,14 +37358,14 @@ func schema_k8sio_api_storage_v1beta1_CSIDriverSpec(ref common.ReferenceCallback }, "storageCapacity": { SchemaProps: spec.SchemaProps{ - Description: "If set to true, storageCapacity indicates that the CSI volume driver wants pod scheduling to consider the storage capacity that the driver deployment will report by creating CSIStorageCapacity objects with capacity information.\n\nThe check can be enabled immediately when deploying a driver. In that case, provisioning new volumes with late binding will pause until the driver deployment has published some suitable CSIStorageCapacity object.\n\nAlternatively, the driver can be deployed with the field unset or false and it can be flipped later when storage capacity information has been published.\n\nThis is an alpha field and only available when the CSIStorageCapacity feature is enabled. The default is false.", + Description: "If set to true, storageCapacity indicates that the CSI volume driver wants pod scheduling to consider the storage capacity that the driver deployment will report by creating CSIStorageCapacity objects with capacity information.\n\nThe check can be enabled immediately when deploying a driver. In that case, provisioning new volumes with late binding will pause until the driver deployment has published some suitable CSIStorageCapacity object.\n\nAlternatively, the driver can be deployed with the field unset or false and it can be flipped later when storage capacity information has been published.\n\nThis field is immutable.\n\nThis is a beta field and only available when the CSIStorageCapacity feature is enabled. The default is false.", Type: []string{"boolean"}, Format: "", }, }, "fsGroupPolicy": { SchemaProps: spec.SchemaProps{ - Description: "Defines if the underlying volume supports changing ownership and permission of the volume before being mounted. Refer to the specific FSGroupPolicy values for additional details. This field is alpha-level, and is only honored by servers that enable the CSIVolumeFSGroupPolicy feature gate.", + Description: "Defines if the underlying volume supports changing ownership and permission of the volume before being mounted. Refer to the specific FSGroupPolicy values for additional details. This field is alpha-level, and is only honored by servers that enable the CSIVolumeFSGroupPolicy feature gate.\n\nThis field is immutable.", Type: []string{"string"}, Format: "", }, @@ -36808,7 +37377,7 @@ func schema_k8sio_api_storage_v1beta1_CSIDriverSpec(ref common.ReferenceCallback }, }, SchemaProps: spec.SchemaProps{ - Description: "TokenRequests indicates the CSI driver needs pods' service account tokens it is mounting volume for to do necessary authentication. Kubelet will pass the tokens in VolumeContext in the CSI NodePublishVolume calls. The CSI driver should parse and validate the following VolumeContext: \"csi.storage.k8s.io/serviceAccount.tokens\": {\n \"\": {\n \"token\": ,\n \"expirationTimestamp\": ,\n },\n ...\n}\n\nNote: Audience in each TokenRequest should be different and at most one token is empty string. To receive a new token after expiry, RequiresRepublish can be used to trigger NodePublishVolume periodically.\n\nThis is an alpha feature and only available when the CSIServiceAccountToken feature is enabled.", + Description: "TokenRequests indicates the CSI driver needs pods' service account tokens it is mounting volume for to do necessary authentication. Kubelet will pass the tokens in VolumeContext in the CSI NodePublishVolume calls. The CSI driver should parse and validate the following VolumeContext: \"csi.storage.k8s.io/serviceAccount.tokens\": {\n \"\": {\n \"token\": ,\n \"expirationTimestamp\": ,\n },\n ...\n}\n\nNote: Audience in each TokenRequest should be different and at most one token is empty string. To receive a new token after expiry, RequiresRepublish can be used to trigger NodePublishVolume periodically.\n\nThis is a beta feature and only available when the CSIServiceAccountToken feature is enabled.", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ @@ -36822,7 +37391,7 @@ func schema_k8sio_api_storage_v1beta1_CSIDriverSpec(ref common.ReferenceCallback }, "requiresRepublish": { SchemaProps: spec.SchemaProps{ - Description: "RequiresRepublish indicates the CSI driver wants `NodePublishVolume` being periodically called to reflect any possible change in the mounted volume. This field defaults to false.\n\nNote: After a successful initial NodePublishVolume call, subsequent calls to NodePublishVolume should only update the contents of the volume. New mount points will not be seen by a running container.\n\nThis is an alpha feature and only available when the CSIServiceAccountToken feature is enabled.", + Description: "RequiresRepublish indicates the CSI driver wants `NodePublishVolume` being periodically called to reflect any possible change in the mounted volume. This field defaults to false.\n\nNote: After a successful initial NodePublishVolume call, subsequent calls to NodePublishVolume should only update the contents of the volume. New mount points will not be seen by a running container.\n\nThis is a beta feature and only available when the CSIServiceAccountToken feature is enabled.", Type: []string{"boolean"}, Format: "", }, @@ -37019,6 +37588,128 @@ func schema_k8sio_api_storage_v1beta1_CSINodeSpec(ref common.ReferenceCallback) } } +func schema_k8sio_api_storage_v1beta1_CSIStorageCapacity(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "CSIStorageCapacity stores the result of one CSI GetCapacity call. For a given StorageClass, this describes the available capacity in a particular topology segment. This can be used when considering where to instantiate new PersistentVolumes.\n\nFor example this can express things like: - StorageClass \"standard\" has \"1234 GiB\" available in \"topology.kubernetes.io/zone=us-east1\" - StorageClass \"localssd\" has \"10 GiB\" available in \"kubernetes.io/hostname=knode-abc123\"\n\nThe following three cases all imply that no capacity is available for a certain combination: - no object exists with suitable topology and storage class name - such an object exists, but the capacity is unset - such an object exists, but the capacity is zero\n\nThe producer of these objects can decide which approach is more suitable.\n\nThey are consumed by the kube-scheduler if the CSIStorageCapacity beta feature gate is enabled there and a CSI driver opts into capacity-aware scheduling with CSIDriver.StorageCapacity.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "kind": { + SchemaProps: spec.SchemaProps{ + Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + Type: []string{"string"}, + Format: "", + }, + }, + "apiVersion": { + SchemaProps: spec.SchemaProps{ + Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + Type: []string{"string"}, + Format: "", + }, + }, + "metadata": { + SchemaProps: spec.SchemaProps{ + Description: "Standard object's metadata. The name has no particular meaning. It must be be a DNS subdomain (dots allowed, 253 characters). To ensure that there are no conflicts with other CSI drivers on the cluster, the recommendation is to use csisc-, a generated name, or a reverse-domain name which ends with the unique CSI driver name.\n\nObjects are namespaced.\n\nMore info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), + }, + }, + "nodeTopology": { + SchemaProps: spec.SchemaProps{ + Description: "NodeTopology defines which nodes have access to the storage for which capacity was reported. If not set, the storage is not accessible from any node in the cluster. If empty, the storage is accessible from all nodes. This field is immutable.", + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.LabelSelector"), + }, + }, + "storageClassName": { + SchemaProps: spec.SchemaProps{ + Description: "The name of the StorageClass that the reported capacity applies to. It must meet the same requirements as the name of a StorageClass object (non-empty, DNS subdomain). If that object no longer exists, the CSIStorageCapacity object is obsolete and should be removed by its creator. This field is immutable.", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "capacity": { + SchemaProps: spec.SchemaProps{ + Description: "Capacity is the value reported by the CSI driver in its GetCapacityResponse for a GetCapacityRequest with topology and parameters that match the previous fields.\n\nThe semantic is currently (CSI spec 1.2) defined as: The available capacity, in bytes, of the storage that can be used to provision volumes. If not set, that information is currently unavailable and treated like zero capacity.", + Ref: ref("k8s.io/apimachinery/pkg/api/resource.Quantity"), + }, + }, + "maximumVolumeSize": { + SchemaProps: spec.SchemaProps{ + Description: "MaximumVolumeSize is the value reported by the CSI driver in its GetCapacityResponse for a GetCapacityRequest with topology and parameters that match the previous fields.\n\nThis is defined since CSI spec 1.4.0 as the largest size that may be used in a CreateVolumeRequest.capacity_range.required_bytes field to create a volume with the same parameters as those in GetCapacityRequest. The corresponding value in the Kubernetes API is ResourceRequirements.Requests in a volume claim.", + Ref: ref("k8s.io/apimachinery/pkg/api/resource.Quantity"), + }, + }, + }, + Required: []string{"storageClassName"}, + }, + }, + Dependencies: []string{ + "k8s.io/apimachinery/pkg/api/resource.Quantity", "k8s.io/apimachinery/pkg/apis/meta/v1.LabelSelector", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + } +} + +func schema_k8sio_api_storage_v1beta1_CSIStorageCapacityList(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "CSIStorageCapacityList is a collection of CSIStorageCapacity objects.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "kind": { + SchemaProps: spec.SchemaProps{ + Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + Type: []string{"string"}, + Format: "", + }, + }, + "apiVersion": { + SchemaProps: spec.SchemaProps{ + Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + Type: []string{"string"}, + Format: "", + }, + }, + "metadata": { + SchemaProps: spec.SchemaProps{ + Description: "Standard list metadata More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"), + }, + }, + "items": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-map-keys": []interface{}{ + "name", + }, + "x-kubernetes-list-type": "map", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "Items is the list of CSIStorageCapacity objects.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/storage/v1beta1.CSIStorageCapacity"), + }, + }, + }, + }, + }, + }, + Required: []string{"items"}, + }, + }, + Dependencies: []string{ + "k8s.io/api/storage/v1beta1.CSIStorageCapacity", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, + } +} + func schema_k8sio_api_storage_v1beta1_StorageClass(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -37328,7 +38019,7 @@ func schema_k8sio_api_storage_v1beta1_VolumeAttachmentSource(ref common.Referenc }, "inlineVolumeSpec": { SchemaProps: spec.SchemaProps{ - Description: "inlineVolumeSpec contains all the information necessary to attach a persistent volume defined by a pod's inline VolumeSource. This field is populated only for the CSIMigration feature. It contains translated fields from a pod's inline VolumeSource to a PersistentVolumeSpec. This field is alpha-level and is only honored by servers that enabled the CSIMigration feature.", + Description: "inlineVolumeSpec contains all the information necessary to attach a persistent volume defined by a pod's inline VolumeSource. This field is populated only for the CSIMigration feature. It contains translated fields from a pod's inline VolumeSource to a PersistentVolumeSpec. This field is beta-level and is only honored by servers that enabled the CSIMigration feature.", Ref: ref("k8s.io/api/core/v1.PersistentVolumeSpec"), }, }, @@ -38002,6 +38693,14 @@ func schema_pkg_apis_apiextensions_v1_CustomResourceDefinitionStatus(ref common. Type: []string{"object"}, Properties: map[string]spec.Schema{ "conditions": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-map-keys": []interface{}{ + "type", + }, + "x-kubernetes-list-type": "map", + }, + }, SchemaProps: spec.SchemaProps{ Description: "conditions indicate state for particular aspects of a CustomResourceDefinition", Type: []string{"array"}, @@ -39330,6 +40029,14 @@ func schema_pkg_apis_apiextensions_v1beta1_CustomResourceDefinitionStatus(ref co Type: []string{"object"}, Properties: map[string]spec.Schema{ "conditions": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-map-keys": []interface{}{ + "type", + }, + "x-kubernetes-list-type": "map", + }, + }, SchemaProps: spec.SchemaProps{ Description: "conditions indicate state for particular aspects of a CustomResourceDefinition", Type: []string{"array"}, @@ -40431,6 +41138,65 @@ func schema_pkg_apis_meta_v1_APIVersions(ref common.ReferenceCallback) common.Op } } +func schema_pkg_apis_meta_v1_ApplyOptions(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "ApplyOptions may be provided when applying an API object. FieldManager is required for apply requests. ApplyOptions is equivalent to PatchOptions. It is provided as a convenience with documentation that speaks specifically to how the options fields relate to apply.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "kind": { + SchemaProps: spec.SchemaProps{ + Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + Type: []string{"string"}, + Format: "", + }, + }, + "apiVersion": { + SchemaProps: spec.SchemaProps{ + Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + Type: []string{"string"}, + Format: "", + }, + }, + "dryRun": { + SchemaProps: spec.SchemaProps{ + Description: "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + "force": { + SchemaProps: spec.SchemaProps{ + Description: "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people.", + Default: false, + Type: []string{"boolean"}, + Format: "", + }, + }, + "fieldManager": { + SchemaProps: spec.SchemaProps{ + Description: "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required.", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + Required: []string{"force", "fieldManager"}, + }, + }, + } +} + func schema_pkg_apis_meta_v1_Condition(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -40625,50 +41391,6 @@ func schema_pkg_apis_meta_v1_Duration(ref common.ReferenceCallback) common.OpenA } } -func schema_pkg_apis_meta_v1_ExportOptions(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "ExportOptions is the query options to the standard REST get call. Deprecated. Planned for removal in 1.18.", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "kind": { - SchemaProps: spec.SchemaProps{ - Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", - Type: []string{"string"}, - Format: "", - }, - }, - "apiVersion": { - SchemaProps: spec.SchemaProps{ - Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", - Type: []string{"string"}, - Format: "", - }, - }, - "export": { - SchemaProps: spec.SchemaProps{ - Description: "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", - Default: false, - Type: []string{"boolean"}, - Format: "", - }, - }, - "exact": { - SchemaProps: spec.SchemaProps{ - Description: "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", - Default: false, - Type: []string{"boolean"}, - Format: "", - }, - }, - }, - Required: []string{"export", "exact"}, - }, - }, - } -} - func schema_pkg_apis_meta_v1_FieldsV1(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -43111,7 +43833,7 @@ func schema_pkg_apis_audit_v1alpha1_Event(ref common.ReferenceCallback) common.O return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ - Description: "Event captures all the information that can be included in an API audit log.", + Description: "DEPRECATED - This group version of Event is deprecated by audit.k8s.io/v1/Event. See the release notes for more information. Event captures all the information that can be included in an API audit log.", Type: []string{"object"}, Properties: map[string]spec.Schema{ "kind": { @@ -43438,7 +44160,7 @@ func schema_pkg_apis_audit_v1alpha1_Policy(ref common.ReferenceCallback) common. return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ - Description: "Policy defines the configuration of audit logging, and the rules for how different request categories are logged.", + Description: "DEPRECATED - This group version of Policy is deprecated by audit.k8s.io/v1/Policy. See the release notes for more information. Policy defines the configuration of audit logging, and the rules for how different request categories are logged.", Type: []string{"object"}, Properties: map[string]spec.Schema{ "kind": { @@ -43681,7 +44403,7 @@ func schema_pkg_apis_audit_v1beta1_Event(ref common.ReferenceCallback) common.Op return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ - Description: "Event captures all the information that can be included in an API audit log.", + Description: "DEPRECATED - This group version of Event is deprecated by audit.k8s.io/v1/Event. See the release notes for more information. Event captures all the information that can be included in an API audit log.", Type: []string{"object"}, Properties: map[string]spec.Schema{ "kind": { @@ -44016,7 +44738,7 @@ func schema_pkg_apis_audit_v1beta1_Policy(ref common.ReferenceCallback) common.O return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ - Description: "Policy defines the configuration of audit logging, and the rules for how different request categories are logged.", + Description: "DEPRECATED - This group version of Policy is deprecated by audit.k8s.io/v1/Policy. See the release notes for more information. Policy defines the configuration of audit logging, and the rules for how different request categories are logged.", Type: []string{"object"}, Properties: map[string]spec.Schema{ "kind": { @@ -44876,12 +45598,27 @@ func schema_k8sio_controller_manager_config_v1alpha1_GenericControllerManagerCon Ref: ref("k8s.io/component-base/config/v1alpha1.DebuggingConfiguration"), }, }, + "LeaderMigrationEnabled": { + SchemaProps: spec.SchemaProps{ + Description: "LeaderMigrationEnabled indicates whether Leader Migration should be enabled for the controller manager.", + Default: false, + Type: []string{"boolean"}, + Format: "", + }, + }, + "LeaderMigration": { + SchemaProps: spec.SchemaProps{ + Description: "LeaderMigration holds the configuration for Leader Migration.", + Default: map[string]interface{}{}, + Ref: ref("k8s.io/controller-manager/config/v1alpha1.LeaderMigrationConfiguration"), + }, + }, }, - Required: []string{"Port", "Address", "MinResyncPeriod", "ClientConnection", "ControllerStartInterval", "LeaderElection", "Controllers", "Debugging"}, + Required: []string{"Port", "Address", "MinResyncPeriod", "ClientConnection", "ControllerStartInterval", "LeaderElection", "Controllers", "Debugging", "LeaderMigrationEnabled", "LeaderMigration"}, }, }, Dependencies: []string{ - "k8s.io/apimachinery/pkg/apis/meta/v1.Duration", "k8s.io/component-base/config/v1alpha1.ClientConnectionConfiguration", "k8s.io/component-base/config/v1alpha1.DebuggingConfiguration", "k8s.io/component-base/config/v1alpha1.LeaderElectionConfiguration"}, + "k8s.io/apimachinery/pkg/apis/meta/v1.Duration", "k8s.io/component-base/config/v1alpha1.ClientConnectionConfiguration", "k8s.io/component-base/config/v1alpha1.DebuggingConfiguration", "k8s.io/component-base/config/v1alpha1.LeaderElectionConfiguration", "k8s.io/controller-manager/config/v1alpha1.LeaderMigrationConfiguration"}, } } @@ -49500,7 +50237,7 @@ func schema_k8sio_kubelet_config_v1beta1_KubeletConfiguration(ref common.Referen }, "nodeStatusReportFrequency": { SchemaProps: spec.SchemaProps{ - Description: "nodeStatusReportFrequency is the frequency that kubelet posts node status to master if node status does not change. Kubelet will ignore this frequency and post node status immediately if any change is detected. It is only used when node lease feature is enabled. nodeStatusReportFrequency's default value is 1m. But if nodeStatusUpdateFrequency is set explicitly, nodeStatusReportFrequency's default value will be set to nodeStatusUpdateFrequency for backward compatibility. Default: \"1m\"", + Description: "nodeStatusReportFrequency is the frequency that kubelet posts node status to master if node status does not change. Kubelet will ignore this frequency and post node status immediately if any change is detected. It is only used when node lease feature is enabled. nodeStatusReportFrequency's default value is 5m. But if nodeStatusUpdateFrequency is set explicitly, nodeStatusReportFrequency's default value will be set to nodeStatusUpdateFrequency for backward compatibility. Default: \"5m\"", Default: map[string]interface{}{}, Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Duration"), }, @@ -49577,7 +50314,7 @@ func schema_k8sio_kubelet_config_v1beta1_KubeletConfiguration(ref common.Referen }, "cpuManagerPolicy": { SchemaProps: spec.SchemaProps{ - Description: "CPUManagerPolicy is the name of the policy to use. Requires the CPUManager feature gate to be enabled. Dynamic Kubelet Config (beta): This field should not be updated without a full node reboot. It is safest to keep this value the same as the local config. Default: \"none\"", + Description: "CPUManagerPolicy is the name of the policy to use. Requires the CPUManager feature gate to be enabled. Dynamic Kubelet Config (beta): This field should not be updated without a full node reboot. It is safest to keep this value the same as the local config. Default: \"None\"", Type: []string{"string"}, Format: "", }, @@ -49589,6 +50326,13 @@ func schema_k8sio_kubelet_config_v1beta1_KubeletConfiguration(ref common.Referen Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Duration"), }, }, + "memoryManagerPolicy": { + SchemaProps: spec.SchemaProps{ + Description: "MemoryManagerPolicy is the name of the policy to use by memory manager. Requires the MemoryManager feature gate to be enabled. Dynamic Kubelet Config (beta): This field should not be updated without a full node reboot. It is safest to keep this value the same as the local config. Default: \"none\"", + Type: []string{"string"}, + Format: "", + }, + }, "topologyManagerPolicy": { SchemaProps: spec.SchemaProps{ Description: "TopologyManagerPolicy is the name of the policy to use. Policies other than \"none\" require the TopologyManager feature gate to be enabled. Dynamic Kubelet Config (beta): This field should not be updated without a full node reboot. It is safest to keep this value the same as the local config. Default: \"none\"", @@ -50014,23 +50758,51 @@ func schema_k8sio_kubelet_config_v1beta1_KubeletConfiguration(ref common.Referen }, "shutdownGracePeriod": { SchemaProps: spec.SchemaProps{ - Description: "ShutdownGracePeriod specifies the total duration that the node should delay the shutdown and total grace period for pod termination during a node shutdown. Default: \"30s\"", + Description: "ShutdownGracePeriod specifies the total duration that the node should delay the shutdown and total grace period for pod termination during a node shutdown. Default: \"0s\"", Default: map[string]interface{}{}, Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Duration"), }, }, "shutdownGracePeriodCriticalPods": { SchemaProps: spec.SchemaProps{ - Description: "ShutdownGracePeriodCriticalPods specifies the duration used to terminate critical pods during a node shutdown. This should be less than ShutdownGracePeriod. For example, if ShutdownGracePeriod=30s, and ShutdownGracePeriodCriticalPods=10s, during a node shutdown the first 20 seconds would be reserved for gracefully terminating normal pods, and the last 10 seconds would be reserved for terminating critical pods. Default: \"10s\"", + Description: "ShutdownGracePeriodCriticalPods specifies the duration used to terminate critical pods during a node shutdown. This should be less than ShutdownGracePeriod. For example, if ShutdownGracePeriod=30s, and ShutdownGracePeriodCriticalPods=10s, during a node shutdown the first 20 seconds would be reserved for gracefully terminating normal pods, and the last 10 seconds would be reserved for terminating critical pods. Default: \"0s\"", Default: map[string]interface{}{}, Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Duration"), }, }, + "reservedMemory": { + SchemaProps: spec.SchemaProps{ + Description: "ReservedMemory specifies a comma-separated list of memory reservations for NUMA nodes. The parameter makes sense only in the context of the memory manager feature. The memory manager will not allocate reserved memory for container workloads. For example, if you have a NUMA0 with 10Gi of memory and the ReservedMemory was specified to reserve 1Gi of memory at NUMA0, the memory manager will assume that only 9Gi is available for allocation. You can specify a different amount of NUMA node and memory types. You can omit this parameter at all, but you should be aware that the amount of reserved memory from all NUMA nodes should be equal to the amount of memory specified by the node allocatable features(https://kubernetes.io/docs/tasks/administer-cluster/reserve-compute-resources/#node-allocatable). If at least one node allocatable parameter has a non-zero value, you will need to specify at least one NUMA node. Also, avoid specifying: 1. Duplicates, the same NUMA node, and memory type, but with a different value. 2. zero limits for any memory type. 3. NUMAs nodes IDs that do not exist under the machine. 4. memory types except for memory and hugepages- Default: nil", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/kubelet/config/v1beta1.MemoryReservation"), + }, + }, + }, + }, + }, + "enableProfilingHandler": { + SchemaProps: spec.SchemaProps{ + Description: "enableProfilingHandler enables profiling via web interface host:port/debug/pprof/ Default: true", + Type: []string{"boolean"}, + Format: "", + }, + }, + "enableDebugFlagsHandler": { + SchemaProps: spec.SchemaProps{ + Description: "enableDebugFlagsHandler enables flags endpoint via web interface host:port/debug/flags/v Default: true", + Type: []string{"boolean"}, + Format: "", + }, + }, }, }, }, Dependencies: []string{ - "k8s.io/apimachinery/pkg/apis/meta/v1.Duration", "k8s.io/component-base/config/v1alpha1.LoggingConfiguration", "k8s.io/kubelet/config/v1beta1.KubeletAuthentication", "k8s.io/kubelet/config/v1beta1.KubeletAuthorization"}, + "k8s.io/apimachinery/pkg/apis/meta/v1.Duration", "k8s.io/component-base/config/v1alpha1.LoggingConfiguration", "k8s.io/kubelet/config/v1beta1.KubeletAuthentication", "k8s.io/kubelet/config/v1beta1.KubeletAuthorization", "k8s.io/kubelet/config/v1beta1.MemoryReservation"}, } } @@ -50109,6 +50881,43 @@ func schema_k8sio_kubelet_config_v1beta1_KubeletX509Authentication(ref common.Re } } +func schema_k8sio_kubelet_config_v1beta1_MemoryReservation(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "MemoryReservation specifies the memory reservation of different types for each NUMA node", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "numaNode": { + SchemaProps: spec.SchemaProps{ + Default: 0, + Type: []string{"integer"}, + Format: "int32", + }, + }, + "limits": { + SchemaProps: spec.SchemaProps{ + Type: []string{"object"}, + AdditionalProperties: &spec.SchemaOrBool{ + Allows: true, + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/api/resource.Quantity"), + }, + }, + }, + }, + }, + }, + Required: []string{"numaNode", "limits"}, + }, + }, + Dependencies: []string{ + "k8s.io/apimachinery/pkg/api/resource.Quantity"}, + } +} + func schema_k8sio_kubelet_config_v1beta1_SerializedNodeConfigSource(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ diff --git a/vendor/k8s.io/kubernetes/pkg/kubeapiserver/BUILD b/vendor/k8s.io/kubernetes/pkg/kubeapiserver/BUILD deleted file mode 100644 index 4a9c0ea50268..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubeapiserver/BUILD +++ /dev/null @@ -1,53 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "default_storage_factory_builder.go", - "doc.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubeapiserver", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/apps:go_default_library", - "//pkg/apis/batch:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/events:go_default_library", - "//pkg/apis/extensions:go_default_library", - "//pkg/apis/networking:go_default_library", - "//pkg/apis/policy:go_default_library", - "//pkg/apis/storage:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/options:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/options/encryptionconfig:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/resourceconfig:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/storage:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/storagebackend:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/kubeapiserver/admission:all-srcs", - "//pkg/kubeapiserver/authenticator:all-srcs", - "//pkg/kubeapiserver/authorizer:all-srcs", - "//pkg/kubeapiserver/options:all-srcs", - "//pkg/kubeapiserver/server:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubeapiserver/admission/BUILD b/vendor/k8s.io/kubernetes/pkg/kubeapiserver/admission/BUILD deleted file mode 100644 index 24ea4253096c..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubeapiserver/admission/BUILD +++ /dev/null @@ -1,50 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "config.go", - "initializer.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubeapiserver/admission", - visibility = ["//visibility:public"], - deps = [ - "//pkg/quota/v1/install:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/initializer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/initializer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/quota/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/egressselector:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/webhook:go_default_library", - "//staging/src/k8s.io/client-go/discovery/cached/memory:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/restmapper:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["initializer_test.go"], - embed = [":go_default_library"], - deps = ["//staging/src/k8s.io/apiserver/pkg/admission:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubeapiserver/authenticator/BUILD b/vendor/k8s.io/kubernetes/pkg/kubeapiserver/authenticator/BUILD deleted file mode 100644 index f99c3bb755c0..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubeapiserver/authenticator/BUILD +++ /dev/null @@ -1,48 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["config.go"], - importpath = "k8s.io/kubernetes/pkg/kubeapiserver/authenticator", - deps = [ - "//pkg/serviceaccount:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/authenticatorfactory:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/group:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/request/anonymous:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/request/bearertoken:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/request/headerrequest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/request/union:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/request/websocket:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/request/x509:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/token/cache:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/token/tokenfile:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/token/union:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/dynamiccertificates:go_default_library", - "//staging/src/k8s.io/apiserver/plugin/pkg/authenticator/token/oidc:go_default_library", - "//staging/src/k8s.io/apiserver/plugin/pkg/authenticator/token/webhook:go_default_library", - "//staging/src/k8s.io/client-go/plugin/pkg/client/auth:go_default_library", - "//staging/src/k8s.io/client-go/util/keyutil:go_default_library", - "//vendor/github.com/go-openapi/spec:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubeapiserver/authorizer/BUILD b/vendor/k8s.io/kubernetes/pkg/kubeapiserver/authorizer/BUILD deleted file mode 100644 index 13c2eb80e4d8..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubeapiserver/authorizer/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["config.go"], - importpath = "k8s.io/kubernetes/pkg/kubeapiserver/authorizer", - deps = [ - "//pkg/auth/authorizer/abac:go_default_library", - "//pkg/auth/nodeidentifier:go_default_library", - "//pkg/kubeapiserver/authorizer/modes:go_default_library", - "//plugin/pkg/auth/authorizer/node:go_default_library", - "//plugin/pkg/auth/authorizer/rbac:go_default_library", - "//plugin/pkg/auth/authorizer/rbac/bootstrappolicy:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizerfactory:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/union:go_default_library", - "//staging/src/k8s.io/apiserver/plugin/pkg/authorizer/webhook:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/kubeapiserver/authorizer/modes:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubeapiserver/authorizer/modes/BUILD b/vendor/k8s.io/kubernetes/pkg/kubeapiserver/authorizer/modes/BUILD deleted file mode 100644 index d36abff7d86c..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubeapiserver/authorizer/modes/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["modes_test.go"], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = ["modes.go"], - importpath = "k8s.io/kubernetes/pkg/kubeapiserver/authorizer/modes", - deps = ["//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubeapiserver/default_storage_factory_builder.go b/vendor/k8s.io/kubernetes/pkg/kubeapiserver/default_storage_factory_builder.go index e89ae47eb033..d19f65789537 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubeapiserver/default_storage_factory_builder.go +++ b/vendor/k8s.io/kubernetes/pkg/kubeapiserver/default_storage_factory_builder.go @@ -32,7 +32,6 @@ import ( api "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/apis/events" "k8s.io/kubernetes/pkg/apis/extensions" - "k8s.io/kubernetes/pkg/apis/flowcontrol" "k8s.io/kubernetes/pkg/apis/networking" "k8s.io/kubernetes/pkg/apis/policy" apisstorage "k8s.io/kubernetes/pkg/apis/storage" @@ -64,12 +63,7 @@ func NewStorageFactoryConfig() *StorageFactoryConfig { resources := []schema.GroupVersionResource{ batch.Resource("cronjobs").WithVersion("v1beta1"), - networking.Resource("ingresses").WithVersion("v1beta1"), - networking.Resource("ingressclasses").WithVersion("v1beta1"), - apisstorage.Resource("csidrivers").WithVersion("v1beta1"), - apisstorage.Resource("csistoragecapacities").WithVersion("v1alpha1"), - flowcontrol.Resource("flowschemas").WithVersion("v1alpha1"), - flowcontrol.Resource("prioritylevelconfigurations").WithVersion("v1alpha1"), + apisstorage.Resource("csistoragecapacities").WithVersion("v1beta1"), } return &StorageFactoryConfig{ diff --git a/vendor/k8s.io/kubernetes/pkg/kubeapiserver/options/BUILD b/vendor/k8s.io/kubernetes/pkg/kubeapiserver/options/BUILD deleted file mode 100644 index 5c9e9ba6fd8a..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubeapiserver/options/BUILD +++ /dev/null @@ -1,112 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "admission.go", - "authentication.go", - "authorization.go", - "cloudprovider.go", - "options.go", - "plugins.go", - "serving.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubeapiserver/options", - visibility = ["//visibility:public"], - deps = [ - "//pkg/controller/serviceaccount:go_default_library", - "//pkg/features:go_default_library", - "//pkg/kubeapiserver/authenticator:go_default_library", - "//pkg/kubeapiserver/authorizer:go_default_library", - "//pkg/kubeapiserver/authorizer/modes:go_default_library", - "//plugin/pkg/admission/admit:go_default_library", - "//plugin/pkg/admission/alwayspullimages:go_default_library", - "//plugin/pkg/admission/antiaffinity:go_default_library", - "//plugin/pkg/admission/certificates/approval:go_default_library", - "//plugin/pkg/admission/certificates/signing:go_default_library", - "//plugin/pkg/admission/certificates/subjectrestriction:go_default_library", - "//plugin/pkg/admission/defaultingressclass:go_default_library", - "//plugin/pkg/admission/defaulttolerationseconds:go_default_library", - "//plugin/pkg/admission/deny:go_default_library", - "//plugin/pkg/admission/eventratelimit:go_default_library", - "//plugin/pkg/admission/exec:go_default_library", - "//plugin/pkg/admission/extendedresourcetoleration:go_default_library", - "//plugin/pkg/admission/gc:go_default_library", - "//plugin/pkg/admission/imagepolicy:go_default_library", - "//plugin/pkg/admission/limitranger:go_default_library", - "//plugin/pkg/admission/namespace/autoprovision:go_default_library", - "//plugin/pkg/admission/namespace/exists:go_default_library", - "//plugin/pkg/admission/noderestriction:go_default_library", - "//plugin/pkg/admission/nodetaint:go_default_library", - "//plugin/pkg/admission/podnodeselector:go_default_library", - "//plugin/pkg/admission/podtolerationrestriction:go_default_library", - "//plugin/pkg/admission/priority:go_default_library", - "//plugin/pkg/admission/runtimeclass:go_default_library", - "//plugin/pkg/admission/security/podsecuritypolicy:go_default_library", - "//plugin/pkg/admission/securitycontext/scdeny:go_default_library", - "//plugin/pkg/admission/serviceaccount:go_default_library", - "//plugin/pkg/admission/storage/persistentvolume/label:go_default_library", - "//plugin/pkg/admission/storage/persistentvolume/resize:go_default_library", - "//plugin/pkg/admission/storage/storageclass/setdefault:go_default_library", - "//plugin/pkg/admission/storage/storageobjectinuseprotection:go_default_library", - "//plugin/pkg/auth/authenticator/token/bootstrap:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/namespace/lifecycle:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/mutating:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/validating:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/egressselector:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/options:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/component-base/cli/flag:go_default_library", - "//staging/src/k8s.io/component-base/featuregate:go_default_library", - "//vendor/github.com/spf13/pflag:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/common:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "admission_test.go", - "authentication_test.go", - "authorization_test.go", - "plugins_test.go", - ], - data = glob(["testdata/**"]), - embed = [":go_default_library"], - deps = [ - "//pkg/kubeapiserver/authenticator:go_default_library", - "//pkg/kubeapiserver/authorizer/modes:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/authenticatorfactory:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/request/headerrequest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/options:go_default_library", - "//vendor/github.com/google/go-cmp/cmp:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubeapiserver/options/authentication.go b/vendor/k8s.io/kubernetes/pkg/kubeapiserver/options/authentication.go index aac123cdc43c..8100a74f2c5b 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubeapiserver/options/authentication.go +++ b/vendor/k8s.io/kubernetes/pkg/kubeapiserver/options/authentication.go @@ -32,7 +32,6 @@ import ( genericapiserver "k8s.io/apiserver/pkg/server" "k8s.io/apiserver/pkg/server/egressselector" genericoptions "k8s.io/apiserver/pkg/server/options" - utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/client-go/informers" "k8s.io/client-go/kubernetes" cliflag "k8s.io/component-base/cli/flag" @@ -40,7 +39,6 @@ import ( openapicommon "k8s.io/kube-openapi/pkg/common" serviceaccountcontroller "k8s.io/kubernetes/pkg/controller/serviceaccount" - "k8s.io/kubernetes/pkg/features" kubeauthenticator "k8s.io/kubernetes/pkg/kubeapiserver/authenticator" authzmodes "k8s.io/kubernetes/pkg/kubeapiserver/authorizer/modes" "k8s.io/kubernetes/plugin/pkg/auth/authenticator/token/bootstrap" @@ -199,12 +197,6 @@ func (o *BuiltInAuthenticationOptions) Validate() []error { } } - if o.ServiceAccounts != nil && utilfeature.DefaultFeatureGate.Enabled(features.BoundServiceAccountTokenVolume) { - if !utilfeature.DefaultFeatureGate.Enabled(features.RootCAConfigMap) { - allErrors = append(allErrors, errors.New("BoundServiceAccountTokenVolume feature depends on RootCAConfigMap feature, but RootCAConfigMap features is not enabled")) - } - } - if o.ServiceAccounts != nil { if len(o.ServiceAccounts.Issuer) == 0 { allErrors = append(allErrors, errors.New("service-account-issuer is a required flag")) @@ -213,18 +205,14 @@ func (o *BuiltInAuthenticationOptions) Validate() []error { allErrors = append(allErrors, errors.New("service-account-key-file is a required flag")) } - if utilfeature.DefaultFeatureGate.Enabled(features.ServiceAccountIssuerDiscovery) { - // Validate the JWKS URI when it is explicitly set. - // When unset, it is later derived from ExternalHost. - if o.ServiceAccounts.JWKSURI != "" { - if u, err := url.Parse(o.ServiceAccounts.JWKSURI); err != nil { - allErrors = append(allErrors, fmt.Errorf("service-account-jwks-uri must be a valid URL: %v", err)) - } else if u.Scheme != "https" { - allErrors = append(allErrors, fmt.Errorf("service-account-jwks-uri requires https scheme, parsed as: %v", u.String())) - } + // Validate the JWKS URI when it is explicitly set. + // When unset, it is later derived from ExternalHost. + if o.ServiceAccounts.JWKSURI != "" { + if u, err := url.Parse(o.ServiceAccounts.JWKSURI); err != nil { + allErrors = append(allErrors, fmt.Errorf("service-account-jwks-uri must be a valid URL: %v", err)) + } else if u.Scheme != "https" { + allErrors = append(allErrors, fmt.Errorf("service-account-jwks-uri requires https scheme, parsed as: %v", u.String())) } - } else if len(o.ServiceAccounts.JWKSURI) > 0 { - allErrors = append(allErrors, fmt.Errorf("service-account-jwks-uri may only be set when the ServiceAccountIssuerDiscovery feature gate is enabled")) } } diff --git a/vendor/k8s.io/kubernetes/pkg/kubeapiserver/options/plugins.go b/vendor/k8s.io/kubernetes/pkg/kubeapiserver/options/plugins.go index 351a8ef8d005..6dd71bfa0992 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubeapiserver/options/plugins.go +++ b/vendor/k8s.io/kubernetes/pkg/kubeapiserver/options/plugins.go @@ -27,17 +27,17 @@ import ( certapproval "k8s.io/kubernetes/plugin/pkg/admission/certificates/approval" certsigning "k8s.io/kubernetes/plugin/pkg/admission/certificates/signing" certsubjectrestriction "k8s.io/kubernetes/plugin/pkg/admission/certificates/subjectrestriction" - "k8s.io/kubernetes/plugin/pkg/admission/defaultingressclass" "k8s.io/kubernetes/plugin/pkg/admission/defaulttolerationseconds" "k8s.io/kubernetes/plugin/pkg/admission/deny" "k8s.io/kubernetes/plugin/pkg/admission/eventratelimit" - "k8s.io/kubernetes/plugin/pkg/admission/exec" "k8s.io/kubernetes/plugin/pkg/admission/extendedresourcetoleration" "k8s.io/kubernetes/plugin/pkg/admission/gc" "k8s.io/kubernetes/plugin/pkg/admission/imagepolicy" "k8s.io/kubernetes/plugin/pkg/admission/limitranger" "k8s.io/kubernetes/plugin/pkg/admission/namespace/autoprovision" "k8s.io/kubernetes/plugin/pkg/admission/namespace/exists" + "k8s.io/kubernetes/plugin/pkg/admission/network/defaultingressclass" + "k8s.io/kubernetes/plugin/pkg/admission/network/denyserviceexternalips" "k8s.io/kubernetes/plugin/pkg/admission/noderestriction" "k8s.io/kubernetes/plugin/pkg/admission/nodetaint" "k8s.io/kubernetes/plugin/pkg/admission/podnodeselector" @@ -79,8 +79,6 @@ var AllOrderedPlugins = []string{ podpriority.PluginName, // Priority defaulttolerationseconds.PluginName, // DefaultTolerationSeconds podtolerationrestriction.PluginName, // PodTolerationRestriction - exec.DenyEscalatingExec, // DenyEscalatingExec - exec.DenyExecOnPrivileged, // DenyExecOnPrivileged eventratelimit.PluginName, // EventRateLimit extendedresourcetoleration.PluginName, // ExtendedResourceToleration label.PluginName, // PersistentVolumeLabel @@ -93,6 +91,7 @@ var AllOrderedPlugins = []string{ certsigning.PluginName, // CertificateSigning certsubjectrestriction.PluginName, // CertificateSubjectRestriction defaultingressclass.PluginName, // DefaultIngressClass + denyserviceexternalips.PluginName, // DenyServiceExternalIPs // new admission plugins should generally be inserted above here // webhook, resourcequota, and deny plugins must go at the end @@ -111,9 +110,9 @@ func RegisterAllAdmissionPlugins(plugins *admission.Plugins) { antiaffinity.Register(plugins) defaulttolerationseconds.Register(plugins) defaultingressclass.Register(plugins) + denyserviceexternalips.Register(plugins) deny.Register(plugins) // DEPRECATED as no real meaning eventratelimit.Register(plugins) - exec.Register(plugins) extendedresourcetoleration.Register(plugins) gc.Register(plugins) imagepolicy.Register(plugins) @@ -142,23 +141,23 @@ func RegisterAllAdmissionPlugins(plugins *admission.Plugins) { // DefaultOffAdmissionPlugins get admission plugins off by default for kube-apiserver. func DefaultOffAdmissionPlugins() sets.String { defaultOnPlugins := sets.NewString( - lifecycle.PluginName, //NamespaceLifecycle - limitranger.PluginName, //LimitRanger - serviceaccount.PluginName, //ServiceAccount - setdefault.PluginName, //DefaultStorageClass - resize.PluginName, //PersistentVolumeClaimResize - defaulttolerationseconds.PluginName, //DefaultTolerationSeconds - mutatingwebhook.PluginName, //MutatingAdmissionWebhook - validatingwebhook.PluginName, //ValidatingAdmissionWebhook - resourcequota.PluginName, //ResourceQuota - storageobjectinuseprotection.PluginName, //StorageObjectInUseProtection - podpriority.PluginName, //PodPriority - nodetaint.PluginName, //TaintNodesByCondition - runtimeclass.PluginName, //RuntimeClass + lifecycle.PluginName, // NamespaceLifecycle + limitranger.PluginName, // LimitRanger + serviceaccount.PluginName, // ServiceAccount + setdefault.PluginName, // DefaultStorageClass + resize.PluginName, // PersistentVolumeClaimResize + defaulttolerationseconds.PluginName, // DefaultTolerationSeconds + mutatingwebhook.PluginName, // MutatingAdmissionWebhook + validatingwebhook.PluginName, // ValidatingAdmissionWebhook + resourcequota.PluginName, // ResourceQuota + storageobjectinuseprotection.PluginName, // StorageObjectInUseProtection + podpriority.PluginName, // PodPriority + nodetaint.PluginName, // TaintNodesByCondition + runtimeclass.PluginName, // RuntimeClass certapproval.PluginName, // CertificateApproval certsigning.PluginName, // CertificateSigning certsubjectrestriction.PluginName, // CertificateSubjectRestriction - defaultingressclass.PluginName, //DefaultIngressClass + defaultingressclass.PluginName, // DefaultIngressClass ) return sets.NewString(AllOrderedPlugins...).Difference(defaultOnPlugins) diff --git a/vendor/k8s.io/kubernetes/pkg/kubeapiserver/options/serving.go b/vendor/k8s.io/kubernetes/pkg/kubeapiserver/options/serving.go index c659fc8cd6d2..09d14703711c 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubeapiserver/options/serving.go +++ b/vendor/k8s.io/kubernetes/pkg/kubeapiserver/options/serving.go @@ -18,10 +18,8 @@ limitations under the License. package options import ( - "fmt" "net" - utilnet "k8s.io/apimachinery/pkg/util/net" genericoptions "k8s.io/apiserver/pkg/server/options" ) @@ -39,34 +37,3 @@ func NewSecureServingOptions() *genericoptions.SecureServingOptionsWithLoopback } return o.WithLoopback() } - -// NewInsecureServingOptions gives default values for the kube-apiserver. -// TODO: switch insecure serving off by default -func NewInsecureServingOptions() *genericoptions.DeprecatedInsecureServingOptionsWithLoopback { - o := genericoptions.DeprecatedInsecureServingOptions{ - BindAddress: net.ParseIP("127.0.0.1"), - BindPort: 8080, - } - return o.WithLoopback() -} - -// DefaultAdvertiseAddress sets the field AdvertiseAddress if -// unset. The field will be set based on the SecureServingOptions. If -// the SecureServingOptions is not present, DefaultExternalAddress -// will fall back to the insecure ServingOptions. -func DefaultAdvertiseAddress(s *genericoptions.ServerRunOptions, insecure *genericoptions.DeprecatedInsecureServingOptions) error { - if insecure == nil { - return nil - } - - if s.AdvertiseAddress == nil || s.AdvertiseAddress.IsUnspecified() { - hostIP, err := utilnet.ResolveBindAddress(insecure.BindAddress) - if err != nil { - return fmt.Errorf("unable to find suitable network address.error='%v'. "+ - "Try to set the AdvertiseAddress directly or provide a valid BindAddress to fix this", err) - } - s.AdvertiseAddress = hostIP - } - - return nil -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/BUILD deleted file mode 100644 index b72c6ba5d541..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/BUILD +++ /dev/null @@ -1,346 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "active_deadline.go", - "doc.go", - "errors.go", - "kubelet.go", - "kubelet_dockershim.go", - "kubelet_getters.go", - "kubelet_network.go", - "kubelet_network_linux.go", - "kubelet_network_others.go", - "kubelet_node_status.go", - "kubelet_node_status_others.go", - "kubelet_node_status_windows.go", - "kubelet_pods.go", - "kubelet_resources.go", - "kubelet_server_journal.go", - "kubelet_server_journal_linux.go", - "kubelet_server_journal_others.go", - "kubelet_server_journal_windows.go", - "kubelet_volumes.go", - "pod_container_deletor.go", - "pod_workers.go", - "reason_cache.go", - "runonce.go", - "runtime.go", - "time_cache.go", - "volume_host.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet", - deps = [ - "//pkg/api/v1/pod:go_default_library", - "//pkg/api/v1/resource:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/pods:go_default_library", - "//pkg/apis/core/v1:go_default_library", - "//pkg/apis/core/v1/helper:go_default_library", - "//pkg/apis/core/v1/helper/qos:go_default_library", - "//pkg/features:go_default_library", - "//pkg/fieldpath:go_default_library", - "//pkg/kubelet/apis:go_default_library", - "//pkg/kubelet/apis/config:go_default_library", - "//pkg/kubelet/apis/podresources:go_default_library", - "//pkg/kubelet/cadvisor:go_default_library", - "//pkg/kubelet/certificate:go_default_library", - "//pkg/kubelet/cloudresource:go_default_library", - "//pkg/kubelet/cm:go_default_library", - "//pkg/kubelet/config:go_default_library", - "//pkg/kubelet/configmap:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/cri/remote:go_default_library", - "//pkg/kubelet/cri/streaming:go_default_library", - "//pkg/kubelet/cri/streaming/portforward:go_default_library", - "//pkg/kubelet/cri/streaming/remotecommand:go_default_library", - "//pkg/kubelet/dockershim:go_default_library", - "//pkg/kubelet/dockershim/remote:go_default_library", - "//pkg/kubelet/envvars:go_default_library", - "//pkg/kubelet/events:go_default_library", - "//pkg/kubelet/eviction:go_default_library", - "//pkg/kubelet/images:go_default_library", - "//pkg/kubelet/kubeletconfig:go_default_library", - "//pkg/kubelet/kuberuntime:go_default_library", - "//pkg/kubelet/legacy:go_default_library", - "//pkg/kubelet/lifecycle:go_default_library", - "//pkg/kubelet/logs:go_default_library", - "//pkg/kubelet/metrics:go_default_library", - "//pkg/kubelet/metrics/collectors:go_default_library", - "//pkg/kubelet/network/dns:go_default_library", - "//pkg/kubelet/nodeshutdown:go_default_library", - "//pkg/kubelet/nodestatus:go_default_library", - "//pkg/kubelet/oom:go_default_library", - "//pkg/kubelet/pleg:go_default_library", - "//pkg/kubelet/pluginmanager:go_default_library", - "//pkg/kubelet/pluginmanager/cache:go_default_library", - "//pkg/kubelet/pod:go_default_library", - "//pkg/kubelet/preemption:go_default_library", - "//pkg/kubelet/prober:go_default_library", - "//pkg/kubelet/prober/results:go_default_library", - "//pkg/kubelet/runtimeclass:go_default_library", - "//pkg/kubelet/secret:go_default_library", - "//pkg/kubelet/server:go_default_library", - "//pkg/kubelet/server/metrics:go_default_library", - "//pkg/kubelet/server/stats:go_default_library", - "//pkg/kubelet/stats:go_default_library", - "//pkg/kubelet/status:go_default_library", - "//pkg/kubelet/sysctl:go_default_library", - "//pkg/kubelet/token:go_default_library", - "//pkg/kubelet/types:go_default_library", - "//pkg/kubelet/util:go_default_library", - "//pkg/kubelet/util/format:go_default_library", - "//pkg/kubelet/util/manager:go_default_library", - "//pkg/kubelet/util/queue:go_default_library", - "//pkg/kubelet/util/sliceutils:go_default_library", - "//pkg/kubelet/volumemanager:go_default_library", - "//pkg/proxy/util:go_default_library", - "//pkg/security/apparmor:go_default_library", - "//pkg/security/podsecuritypolicy/sysctl:go_default_library", - "//pkg/util/iptables:go_default_library", - "//pkg/util/node:go_default_library", - "//pkg/util/oom:go_default_library", - "//pkg/util/removeall:go_default_library", - "//pkg/util/selinux:go_default_library", - "//pkg/util/taints:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/csi:go_default_library", - "//pkg/volume/util:go_default_library", - "//pkg/volume/util/hostutil:go_default_library", - "//pkg/volume/util/subpath:go_default_library", - "//pkg/volume/util/types:go_default_library", - "//pkg/volume/util/volumepathhandler:go_default_library", - "//pkg/volume/validation:go_default_library", - "//staging/src/k8s.io/api/authentication/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/listers/storage/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/client-go/util/certificate:go_default_library", - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/cloud-provider:go_default_library", - "//staging/src/k8s.io/cloud-provider/api:go_default_library", - "//staging/src/k8s.io/component-helpers/apimachinery/lease:go_default_library", - "//staging/src/k8s.io/cri-api/pkg/apis:go_default_library", - "//staging/src/k8s.io/cri-api/pkg/apis/runtime/v1alpha2:go_default_library", - "//staging/src/k8s.io/kubelet/pkg/apis/pluginregistration/v1:go_default_library", - "//staging/src/k8s.io/kubelet/pkg/apis/stats/v1alpha1:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//third_party/forked/golang/expansion:go_default_library", - "//vendor/github.com/golang/groupcache/lru:go_default_library", - "//vendor/github.com/google/cadvisor/info/v1:go_default_library", - "//vendor/github.com/google/cadvisor/info/v2:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - "//vendor/k8s.io/utils/integer:go_default_library", - "//vendor/k8s.io/utils/path:go_default_library", - "//vendor/k8s.io/utils/strings:go_default_library", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "//vendor/k8s.io/utils/net:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//vendor/k8s.io/utils/net:go_default_library", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "//pkg/kubelet/winstats:go_default_library", - ], - "//conditions:default": [], - }), -) - -go_test( - name = "go_default_test", - srcs = [ - "active_deadline_test.go", - "kubelet_getters_test.go", - "kubelet_network_test.go", - "kubelet_node_status_test.go", - "kubelet_pods_linux_test.go", - "kubelet_pods_test.go", - "kubelet_pods_windows_test.go", - "kubelet_resources_test.go", - "kubelet_server_journal_test.go", - "kubelet_test.go", - "kubelet_volumes_linux_test.go", - "kubelet_volumes_test.go", - "pod_container_deletor_test.go", - "pod_workers_test.go", - "reason_cache_test.go", - "runonce_test.go", - "time_cache_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core/install:go_default_library", - "//pkg/features:go_default_library", - "//pkg/kubelet/apis:go_default_library", - "//pkg/kubelet/cadvisor/testing:go_default_library", - "//pkg/kubelet/cm:go_default_library", - "//pkg/kubelet/config:go_default_library", - "//pkg/kubelet/configmap:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/container/testing:go_default_library", - "//pkg/kubelet/cri/streaming/portforward:go_default_library", - "//pkg/kubelet/cri/streaming/remotecommand:go_default_library", - "//pkg/kubelet/eviction:go_default_library", - "//pkg/kubelet/images:go_default_library", - "//pkg/kubelet/lifecycle:go_default_library", - "//pkg/kubelet/logs:go_default_library", - "//pkg/kubelet/network/dns:go_default_library", - "//pkg/kubelet/nodestatus:go_default_library", - "//pkg/kubelet/pleg:go_default_library", - "//pkg/kubelet/pluginmanager:go_default_library", - "//pkg/kubelet/pod:go_default_library", - "//pkg/kubelet/pod/testing:go_default_library", - "//pkg/kubelet/prober/results:go_default_library", - "//pkg/kubelet/prober/testing:go_default_library", - "//pkg/kubelet/secret:go_default_library", - "//pkg/kubelet/server/stats:go_default_library", - "//pkg/kubelet/stats:go_default_library", - "//pkg/kubelet/status:go_default_library", - "//pkg/kubelet/status/testing:go_default_library", - "//pkg/kubelet/token:go_default_library", - "//pkg/kubelet/types:go_default_library", - "//pkg/kubelet/util/queue:go_default_library", - "//pkg/kubelet/util/sliceutils:go_default_library", - "//pkg/kubelet/volumemanager:go_default_library", - "//pkg/scheduler/framework:go_default_library", - "//pkg/util/taints:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/awsebs:go_default_library", - "//pkg/volume/azuredd:go_default_library", - "//pkg/volume/gcepd:go_default_library", - "//pkg/volume/hostpath:go_default_library", - "//pkg/volume/testing:go_default_library", - "//pkg/volume/util:go_default_library", - "//pkg/volume/util/hostutil:go_default_library", - "//pkg/volume/util/subpath:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/rand:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/client-go/util/testing:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - "//staging/src/k8s.io/component-base/version:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/github.com/golang/groupcache/lru:go_default_library", - "//vendor/github.com/google/cadvisor/info/v1:go_default_library", - "//vendor/github.com/google/cadvisor/info/v2:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "//staging/src/k8s.io/cri-api/pkg/apis/runtime/v1alpha2:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//staging/src/k8s.io/cri-api/pkg/apis/runtime/v1alpha2:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/kubelet/apis:all-srcs", - "//pkg/kubelet/cadvisor:all-srcs", - "//pkg/kubelet/certificate:all-srcs", - "//pkg/kubelet/checkpointmanager:all-srcs", - "//pkg/kubelet/client:all-srcs", - "//pkg/kubelet/cloudresource:all-srcs", - "//pkg/kubelet/cm:all-srcs", - "//pkg/kubelet/config:all-srcs", - "//pkg/kubelet/configmap:all-srcs", - "//pkg/kubelet/container:all-srcs", - "//pkg/kubelet/cri/remote:all-srcs", - "//pkg/kubelet/cri/streaming:all-srcs", - "//pkg/kubelet/custommetrics:all-srcs", - "//pkg/kubelet/dockershim:all-srcs", - "//pkg/kubelet/envvars:all-srcs", - "//pkg/kubelet/events:all-srcs", - "//pkg/kubelet/eviction:all-srcs", - "//pkg/kubelet/images:all-srcs", - "//pkg/kubelet/kubeletconfig:all-srcs", - "//pkg/kubelet/kuberuntime:all-srcs", - "//pkg/kubelet/leaky:all-srcs", - "//pkg/kubelet/legacy:all-srcs", - "//pkg/kubelet/lifecycle:all-srcs", - "//pkg/kubelet/logs:all-srcs", - "//pkg/kubelet/metrics:all-srcs", - "//pkg/kubelet/network:all-srcs", - "//pkg/kubelet/nodeshutdown:all-srcs", - "//pkg/kubelet/nodestatus:all-srcs", - "//pkg/kubelet/oom:all-srcs", - "//pkg/kubelet/pleg:all-srcs", - "//pkg/kubelet/pluginmanager:all-srcs", - "//pkg/kubelet/pod:all-srcs", - "//pkg/kubelet/preemption:all-srcs", - "//pkg/kubelet/prober:all-srcs", - "//pkg/kubelet/qos:all-srcs", - "//pkg/kubelet/runtimeclass:all-srcs", - "//pkg/kubelet/secret:all-srcs", - "//pkg/kubelet/server:all-srcs", - "//pkg/kubelet/stats:all-srcs", - "//pkg/kubelet/status:all-srcs", - "//pkg/kubelet/sysctl:all-srcs", - "//pkg/kubelet/token:all-srcs", - "//pkg/kubelet/types:all-srcs", - "//pkg/kubelet/util:all-srcs", - "//pkg/kubelet/volumemanager:all-srcs", - "//pkg/kubelet/winstats:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/OWNERS b/vendor/k8s.io/kubernetes/pkg/kubelet/OWNERS index f59c6982714d..9b0a9215c3c2 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/OWNERS +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/OWNERS @@ -5,13 +5,14 @@ approvers: - Random-Liu - dchen1107 - derekwaynecarr -- vishh - yujuhong - sjenning - mrunalp +- klueska emeritus_approvers: - dashpole +- vishh reviewers: - sig-node-reviewers # see https://github.com/kubernetes/kubernetes/blob/master/OWNERS_ALIASES#LC220:~:text=sig%2Dnode%2Dreviewers diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/BUILD deleted file mode 100644 index 823940a76a3c..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "well_known_annotations_windows.go", - "well_known_labels.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/apis", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - ] + select({ - "@io_bazel_rules_go//go/platform:windows": [ - "//pkg/features:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/kubelet/apis/config:all-srcs", - "//pkg/kubelet/apis/podresources:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/BUILD deleted file mode 100644 index 6ad87d3a15be..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/BUILD +++ /dev/null @@ -1,62 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "helpers.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/apis/config", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/component-base/config:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/kubelet/apis/config/fuzzer:all-srcs", - "//pkg/kubelet/apis/config/scheme:all-srcs", - "//pkg/kubelet/apis/config/v1alpha1:all-srcs", - "//pkg/kubelet/apis/config/v1beta1:all-srcs", - "//pkg/kubelet/apis/config/validation:all-srcs", - ], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = [ - "helpers_test.go", - "register_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/component-base/config/testing:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/scheme/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/scheme/BUILD deleted file mode 100644 index d1e0439a4dd2..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/scheme/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["scheme.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/apis/config/scheme", - visibility = ["//visibility:public"], - deps = [ - "//pkg/kubelet/apis/config:go_default_library", - "//pkg/kubelet/apis/config/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["scheme_test.go"], - data = glob(["testdata/**"]), - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/apis/config/fuzzer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/apitesting/roundtrip:go_default_library", - "//staging/src/k8s.io/component-base/config/testing:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/types.go b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/types.go index d518a6cf4125..fcc86830b5a3 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/types.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/types.go @@ -224,6 +224,9 @@ type KubeletConfiguration struct { // CPU Manager reconciliation period. // Requires the CPUManager feature gate to be enabled. CPUManagerReconcilePeriod metav1.Duration + // MemoryManagerPolicy is the name of the policy to use. + // Requires the MemoryManager feature gate to be enabled. + MemoryManagerPolicy string // TopologyManagerPolicy is the name of the policy to use. // Policies other than "none" require the TopologyManager feature gate to be enabled. TopologyManagerPolicy string @@ -376,12 +379,34 @@ type KubeletConfiguration struct { // EnableSystemLogHandler enables /logs handler. EnableSystemLogHandler bool // ShutdownGracePeriod specifies the total duration that the node should delay the shutdown and total grace period for pod termination during a node shutdown. - // Defaults to 30 seconds, requires GracefulNodeShutdown feature gate to be enabled. + // Defaults to 0 seconds. + // +featureGate=GracefulNodeShutdown + // +optional ShutdownGracePeriod metav1.Duration // ShutdownGracePeriodCriticalPods specifies the duration used to terminate critical pods during a node shutdown. This should be less than ShutdownGracePeriod. - // Defaults to 10 seconds, requires GracefulNodeShutdown feature gate to be enabled. + // Defaults to 0 seconds. // For example, if ShutdownGracePeriod=30s, and ShutdownGracePeriodCriticalPods=10s, during a node shutdown the first 20 seconds would be reserved for gracefully terminating normal pods, and the last 10 seconds would be reserved for terminating critical pods. + // +featureGate=GracefulNodeShutdown + // +optional ShutdownGracePeriodCriticalPods metav1.Duration + // ReservedMemory specifies a comma-separated list of memory reservations for NUMA nodes. + // The parameter makes sense only in the context of the memory manager feature. The memory manager will not allocate reserved memory for container workloads. + // For example, if you have a NUMA0 with 10Gi of memory and the ReservedMemory was specified to reserve 1Gi of memory at NUMA0, + // the memory manager will assume that only 9Gi is available for allocation. + // You can specify a different amount of NUMA node and memory types. + // You can omit this parameter at all, but you should be aware that the amount of reserved memory from all NUMA nodes + // should be equal to the amount of memory specified by the node allocatable features(https://kubernetes.io/docs/tasks/administer-cluster/reserve-compute-resources/#node-allocatable). + // If at least one node allocatable parameter has a non-zero value, you will need to specify at least one NUMA node. + // Also, avoid specifying: + // 1. Duplicates, the same NUMA node, and memory type, but with a different value. + // 2. zero limits for any memory type. + // 3. NUMAs nodes IDs that do not exist under the machine. + // 4. memory types except for memory and hugepages- + ReservedMemory []MemoryReservation + // EnableProfiling enables /debug/pprof handler. + EnableProfilingHandler bool + // EnableDebugFlagsHandler enables/debug/flags/v handler. + EnableDebugFlagsHandler bool } // KubeletAuthorizationMode denotes the authorization mode for the kubelet @@ -535,3 +560,9 @@ type ExecEnvVar struct { Name string Value string } + +// MemoryReservation specifies the memory reservation of different types for each NUMA node +type MemoryReservation struct { + NumaNode int32 + Limits v1.ResourceList +} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1alpha1/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1alpha1/BUILD deleted file mode 100644 index aa8a4973438e..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1alpha1/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "zz_generated.conversion.go", - "zz_generated.deepcopy.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/apis/config/v1alpha1", - visibility = ["//visibility:public"], - deps = [ - "//pkg/kubelet/apis/config:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/kubelet/config/v1alpha1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/BUILD deleted file mode 100644 index 66bc0bdd0d8d..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/BUILD +++ /dev/null @@ -1,47 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "defaults.go", - "defaults_linux.go", - "defaults_others.go", - "doc.go", - "register.go", - "zz_generated.conversion.go", - "zz_generated.deepcopy.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1", - deps = [ - "//pkg/cluster/ports:go_default_library", - "//pkg/kubelet/apis/config:go_default_library", - "//pkg/kubelet/qos:go_default_library", - "//pkg/kubelet/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/component-base/config/v1alpha1:go_default_library", - "//staging/src/k8s.io/kubelet/config/v1beta1:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/defaults.go b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/defaults.go index 3b46d4164b32..f16c8b490274 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/defaults.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/defaults.go @@ -23,6 +23,7 @@ import ( kruntime "k8s.io/apimachinery/pkg/runtime" componentbaseconfigv1alpha1 "k8s.io/component-base/config/v1alpha1" kubeletconfigv1beta1 "k8s.io/kubelet/config/v1beta1" + // TODO: Cut references to k8s.io/kubernetes, eventually there should be none from this package "k8s.io/kubernetes/pkg/cluster/ports" "k8s.io/kubernetes/pkg/kubelet/qos" @@ -154,6 +155,9 @@ func SetDefaults_KubeletConfiguration(obj *kubeletconfigv1beta1.KubeletConfigura // Keep the same as default NodeStatusUpdateFrequency obj.CPUManagerReconcilePeriod = metav1.Duration{Duration: 10 * time.Second} } + if obj.MemoryManagerPolicy == "" { + obj.MemoryManagerPolicy = kubeletconfigv1beta1.NoneMemoryManagerPolicy + } if obj.TopologyManagerPolicy == "" { obj.TopologyManagerPolicy = kubeletconfigv1beta1.NoneTopologyManagerPolicy } @@ -242,4 +246,10 @@ func SetDefaults_KubeletConfiguration(obj *kubeletconfigv1beta1.KubeletConfigura if obj.EnableSystemLogHandler == nil { obj.EnableSystemLogHandler = utilpointer.BoolPtr(true) } + if obj.EnableProfilingHandler == nil { + obj.EnableProfilingHandler = utilpointer.BoolPtr(true) + } + if obj.EnableDebugFlagsHandler == nil { + obj.EnableDebugFlagsHandler = utilpointer.BoolPtr(true) + } } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/zz_generated.conversion.go b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/zz_generated.conversion.go index 09aae527ecce..48606111fa43 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/zz_generated.conversion.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/zz_generated.conversion.go @@ -23,6 +23,7 @@ package v1beta1 import ( unsafe "unsafe" + corev1 "k8s.io/api/core/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" conversion "k8s.io/apimachinery/pkg/conversion" runtime "k8s.io/apimachinery/pkg/runtime" @@ -108,6 +109,16 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddGeneratedConversionFunc((*v1beta1.MemoryReservation)(nil), (*config.MemoryReservation)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1beta1_MemoryReservation_To_config_MemoryReservation(a.(*v1beta1.MemoryReservation), b.(*config.MemoryReservation), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*config.MemoryReservation)(nil), (*v1beta1.MemoryReservation)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_config_MemoryReservation_To_v1beta1_MemoryReservation(a.(*config.MemoryReservation), b.(*v1beta1.MemoryReservation), scope) + }); err != nil { + return err + } if err := s.AddGeneratedConversionFunc((*v1beta1.SerializedNodeConfigSource)(nil), (*config.SerializedNodeConfigSource)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1beta1_SerializedNodeConfigSource_To_config_SerializedNodeConfigSource(a.(*v1beta1.SerializedNodeConfigSource), b.(*config.SerializedNodeConfigSource), scope) }); err != nil { @@ -274,6 +285,7 @@ func autoConvert_v1beta1_KubeletConfiguration_To_config_KubeletConfiguration(in out.CgroupDriver = in.CgroupDriver out.CPUManagerPolicy = in.CPUManagerPolicy out.CPUManagerReconcilePeriod = in.CPUManagerReconcilePeriod + out.MemoryManagerPolicy = in.MemoryManagerPolicy out.TopologyManagerPolicy = in.TopologyManagerPolicy out.TopologyManagerScope = in.TopologyManagerScope out.QOSReserved = *(*map[string]string)(unsafe.Pointer(&in.QOSReserved)) @@ -352,6 +364,13 @@ func autoConvert_v1beta1_KubeletConfiguration_To_config_KubeletConfiguration(in } out.ShutdownGracePeriod = in.ShutdownGracePeriod out.ShutdownGracePeriodCriticalPods = in.ShutdownGracePeriodCriticalPods + out.ReservedMemory = *(*[]config.MemoryReservation)(unsafe.Pointer(&in.ReservedMemory)) + if err := v1.Convert_Pointer_bool_To_bool(&in.EnableProfilingHandler, &out.EnableProfilingHandler, s); err != nil { + return err + } + if err := v1.Convert_Pointer_bool_To_bool(&in.EnableDebugFlagsHandler, &out.EnableDebugFlagsHandler, s); err != nil { + return err + } return nil } @@ -429,6 +448,7 @@ func autoConvert_config_KubeletConfiguration_To_v1beta1_KubeletConfiguration(in out.CgroupDriver = in.CgroupDriver out.CPUManagerPolicy = in.CPUManagerPolicy out.CPUManagerReconcilePeriod = in.CPUManagerReconcilePeriod + out.MemoryManagerPolicy = in.MemoryManagerPolicy out.TopologyManagerPolicy = in.TopologyManagerPolicy out.TopologyManagerScope = in.TopologyManagerScope out.QOSReserved = *(*map[string]string)(unsafe.Pointer(&in.QOSReserved)) @@ -505,6 +525,13 @@ func autoConvert_config_KubeletConfiguration_To_v1beta1_KubeletConfiguration(in } out.ShutdownGracePeriod = in.ShutdownGracePeriod out.ShutdownGracePeriodCriticalPods = in.ShutdownGracePeriodCriticalPods + out.ReservedMemory = *(*[]v1beta1.MemoryReservation)(unsafe.Pointer(&in.ReservedMemory)) + if err := v1.Convert_bool_To_Pointer_bool(&in.EnableProfilingHandler, &out.EnableProfilingHandler, s); err != nil { + return err + } + if err := v1.Convert_bool_To_Pointer_bool(&in.EnableDebugFlagsHandler, &out.EnableDebugFlagsHandler, s); err != nil { + return err + } return nil } @@ -581,6 +608,28 @@ func Convert_config_KubeletX509Authentication_To_v1beta1_KubeletX509Authenticati return autoConvert_config_KubeletX509Authentication_To_v1beta1_KubeletX509Authentication(in, out, s) } +func autoConvert_v1beta1_MemoryReservation_To_config_MemoryReservation(in *v1beta1.MemoryReservation, out *config.MemoryReservation, s conversion.Scope) error { + out.NumaNode = in.NumaNode + out.Limits = *(*corev1.ResourceList)(unsafe.Pointer(&in.Limits)) + return nil +} + +// Convert_v1beta1_MemoryReservation_To_config_MemoryReservation is an autogenerated conversion function. +func Convert_v1beta1_MemoryReservation_To_config_MemoryReservation(in *v1beta1.MemoryReservation, out *config.MemoryReservation, s conversion.Scope) error { + return autoConvert_v1beta1_MemoryReservation_To_config_MemoryReservation(in, out, s) +} + +func autoConvert_config_MemoryReservation_To_v1beta1_MemoryReservation(in *config.MemoryReservation, out *v1beta1.MemoryReservation, s conversion.Scope) error { + out.NumaNode = in.NumaNode + out.Limits = *(*corev1.ResourceList)(unsafe.Pointer(&in.Limits)) + return nil +} + +// Convert_config_MemoryReservation_To_v1beta1_MemoryReservation is an autogenerated conversion function. +func Convert_config_MemoryReservation_To_v1beta1_MemoryReservation(in *config.MemoryReservation, out *v1beta1.MemoryReservation, s conversion.Scope) error { + return autoConvert_config_MemoryReservation_To_v1beta1_MemoryReservation(in, out, s) +} + func autoConvert_v1beta1_SerializedNodeConfigSource_To_config_SerializedNodeConfigSource(in *v1beta1.SerializedNodeConfigSource, out *config.SerializedNodeConfigSource, s conversion.Scope) error { out.Source = in.Source return nil diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/zz_generated.defaults.go b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/zz_generated.defaults.go index 7c127d46e2f3..8a4efba40b0d 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/zz_generated.defaults.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/zz_generated.defaults.go @@ -23,6 +23,7 @@ package v1beta1 import ( runtime "k8s.io/apimachinery/pkg/runtime" v1beta1 "k8s.io/kubelet/config/v1beta1" + v1 "k8s.io/kubernetes/pkg/apis/core/v1" ) // RegisterDefaults adds defaulters functions to the given scheme. @@ -35,4 +36,8 @@ func RegisterDefaults(scheme *runtime.Scheme) error { func SetObjectDefaults_KubeletConfiguration(in *v1beta1.KubeletConfiguration) { SetDefaults_KubeletConfiguration(in) + for i := range in.ReservedMemory { + a := &in.ReservedMemory[i] + v1.SetDefaults_ResourceList(&a.Limits) + } } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/validation/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/validation/BUILD deleted file mode 100644 index 25ad727a0a04..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/validation/BUILD +++ /dev/null @@ -1,53 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "validation.go", - "validation_others.go", - "validation_windows.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/apis/config/validation", - deps = [ - "//pkg/features:go_default_library", - "//pkg/kubelet/apis/config:go_default_library", - "//pkg/kubelet/cm/cpuset:go_default_library", - "//pkg/kubelet/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/logs:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["validation_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/apis/config:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/validation/validation.go b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/validation/validation.go index 56069cae10bf..69b08a8229d4 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/validation/validation.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/validation/validation.go @@ -193,6 +193,8 @@ func ValidateKubeletConfiguration(kc *kubeletconfig.KubeletConfiguration) error } } + allErrors = append(allErrors, validateReservedMemoryConfiguration(kc)...) + if err := validateKubeletOSConfiguration(kc); err != nil { allErrors = append(allErrors, err) } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/validation/validation_reserved_memory.go b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/validation/validation_reserved_memory.go new file mode 100644 index 000000000000..ba4d9a289ffb --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/validation/validation_reserved_memory.go @@ -0,0 +1,64 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package validation + +import ( + "fmt" + + v1 "k8s.io/api/core/v1" + corev1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper" + kubeletconfig "k8s.io/kubernetes/pkg/kubelet/apis/config" +) + +// validateReservedMemory validates the reserved memory configuration and returns an error if it is invalid. +func validateReservedMemoryConfiguration(kc *kubeletconfig.KubeletConfiguration) []error { + if len(kc.ReservedMemory) == 0 { + return nil + } + + var errors []error + + numaTypeDuplicates := map[int32]map[v1.ResourceName]bool{} + for _, reservedMemory := range kc.ReservedMemory { + numaNode := reservedMemory.NumaNode + if _, ok := numaTypeDuplicates[numaNode]; !ok { + numaTypeDuplicates[numaNode] = map[v1.ResourceName]bool{} + } + + for resourceName, q := range reservedMemory.Limits { + if !reservedMemorySupportedLimit(resourceName) { + errors = append(errors, fmt.Errorf("the limit type %q for NUMA node %d is not supported, only %v is accepted", resourceName, numaNode, []v1.ResourceName{v1.ResourceMemory, v1.ResourceHugePagesPrefix + ""})) + } + + // validates that the limit has non-zero value + if q.IsZero() { + errors = append(errors, fmt.Errorf("reserved memory may not be zero for NUMA node %d and resource %q", numaNode, resourceName)) + } + + // validates that no duplication for NUMA node and limit type occurred + if _, ok := numaTypeDuplicates[numaNode][resourceName]; ok { + errors = append(errors, fmt.Errorf("the reserved memory has a duplicate value for NUMA node %d and resource %q", numaNode, resourceName)) + } + numaTypeDuplicates[numaNode][resourceName] = true + } + } + return errors +} + +func reservedMemorySupportedLimit(resourceName v1.ResourceName) bool { + return corev1helper.IsHugePageResourceName(resourceName) || resourceName == v1.ResourceMemory +} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/zz_generated.deepcopy.go b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/zz_generated.deepcopy.go index e458d832294f..6c78450a5efd 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/zz_generated.deepcopy.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/zz_generated.deepcopy.go @@ -21,6 +21,7 @@ limitations under the License. package config import ( + corev1 "k8s.io/api/core/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" ) @@ -273,6 +274,13 @@ func (in *KubeletConfiguration) DeepCopyInto(out *KubeletConfiguration) { out.Logging = in.Logging out.ShutdownGracePeriod = in.ShutdownGracePeriod out.ShutdownGracePeriodCriticalPods = in.ShutdownGracePeriodCriticalPods + if in.ReservedMemory != nil { + in, out := &in.ReservedMemory, &out.ReservedMemory + *out = make([]MemoryReservation, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } return } @@ -345,6 +353,29 @@ func (in *KubeletX509Authentication) DeepCopy() *KubeletX509Authentication { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *MemoryReservation) DeepCopyInto(out *MemoryReservation) { + *out = *in + if in.Limits != nil { + in, out := &in.Limits, &out.Limits + *out = make(corev1.ResourceList, len(*in)) + for key, val := range *in { + (*out)[key] = val.DeepCopy() + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MemoryReservation. +func (in *MemoryReservation) DeepCopy() *MemoryReservation { + if in == nil { + return nil + } + out := new(MemoryReservation) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *SerializedNodeConfigSource) DeepCopyInto(out *SerializedNodeConfigSource) { *out = *in diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/podresources/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/podresources/BUILD deleted file mode 100644 index 3a64e413dffa..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/podresources/BUILD +++ /dev/null @@ -1,53 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "client.go", - "constants.go", - "server_v1.go", - "server_v1alpha1.go", - "types.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/apis/podresources", - visibility = ["//visibility:public"], - deps = [ - "//pkg/kubelet/metrics:go_default_library", - "//pkg/kubelet/util:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/kubelet/pkg/apis/podresources/v1:go_default_library", - "//staging/src/k8s.io/kubelet/pkg/apis/podresources/v1alpha1:go_default_library", - "//vendor/google.golang.org/grpc:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "server_v1_test.go", - "server_v1alpha1_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/kubelet/pkg/apis/podresources/v1:go_default_library", - "//staging/src/k8s.io/kubelet/pkg/apis/podresources/v1alpha1:go_default_library", - "//vendor/github.com/stretchr/testify/mock:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/podresources/server_v1.go b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/podresources/server_v1.go index 8482f51a19db..bd29ed9fc53e 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/podresources/server_v1.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/podresources/server_v1.go @@ -18,7 +18,10 @@ package podresources import ( "context" + "fmt" + utilfeature "k8s.io/apiserver/pkg/util/feature" + kubefeatures "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/pkg/kubelet/metrics" "k8s.io/kubelet/pkg/apis/podresources/v1" @@ -44,6 +47,7 @@ func NewV1PodResourcesServer(podsProvider PodsProvider, devicesProvider DevicesP // List returns information about the resources assigned to pods on the node func (p *v1PodResourcesServer) List(ctx context.Context, req *v1.ListPodResourcesRequest) (*v1.ListPodResourcesResponse, error) { metrics.PodResourcesEndpointRequestsTotalCount.WithLabelValues("v1").Inc() + metrics.PodResourcesEndpointRequestsListCount.WithLabelValues("v1").Inc() pods := p.podsProvider.GetPods() podResources := make([]*v1.PodResources, len(pods)) @@ -70,3 +74,21 @@ func (p *v1PodResourcesServer) List(ctx context.Context, req *v1.ListPodResource PodResources: podResources, }, nil } + +// GetAllocatableResources returns information about all the resources known by the server - this more like the capacity, not like the current amount of free resources. +func (p *v1PodResourcesServer) GetAllocatableResources(ctx context.Context, req *v1.AllocatableResourcesRequest) (*v1.AllocatableResourcesResponse, error) { + metrics.PodResourcesEndpointRequestsTotalCount.WithLabelValues("v1").Inc() + metrics.PodResourcesEndpointRequestsGetAllocatableCount.WithLabelValues("v1").Inc() + + if !utilfeature.DefaultFeatureGate.Enabled(kubefeatures.KubeletPodResourcesGetAllocatable) { + metrics.PodResourcesEndpointErrorsGetAllocatableCount.WithLabelValues("v1").Inc() + return nil, fmt.Errorf("Pod Resources API GetAllocatableResources disabled") + } + + metrics.PodResourcesEndpointRequestsTotalCount.WithLabelValues("v1").Inc() + + return &v1.AllocatableResourcesResponse{ + Devices: p.devicesProvider.GetAllocatableDevices(), + CpuIds: p.cpusProvider.GetAllocatableCPUs(), + }, nil +} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/podresources/types.go b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/podresources/types.go index 433d92c59964..ebc068742c7f 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/podresources/types.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/podresources/types.go @@ -23,8 +23,12 @@ import ( // DevicesProvider knows how to provide the devices used by the given container type DevicesProvider interface { - GetDevices(podUID, containerName string) []*podresourcesapi.ContainerDevices + // UpdateAllocatedDevices frees any Devices that are bound to terminated pods. UpdateAllocatedDevices() + // GetDevices returns information about the devices assigned to pods and containers + GetDevices(podUID, containerName string) []*podresourcesapi.ContainerDevices + // GetAllocatableDevices returns information about all the devices known to the manager + GetAllocatableDevices() []*podresourcesapi.ContainerDevices } // PodsProvider knows how to provide the pods admitted by the node @@ -34,5 +38,8 @@ type PodsProvider interface { // CPUsProvider knows how to provide the cpus used by the given container type CPUsProvider interface { + // GetCPUs returns information about the cpus assigned to pods and containers GetCPUs(podUID, containerName string) []int64 + // GetAllocatableCPUs returns the allocatable (not allocated) CPUs + GetAllocatableCPUs() []int64 } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/well_known_annotations_windows.go b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/well_known_annotations_windows.go deleted file mode 100644 index 6d577d5f1296..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/well_known_annotations_windows.go +++ /dev/null @@ -1,46 +0,0 @@ -// +build windows - -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package apis - -import ( - utilfeature "k8s.io/apiserver/pkg/util/feature" - "k8s.io/klog/v2" - "k8s.io/kubernetes/pkg/features" -) - -const ( - // HypervIsolationAnnotationKey is used to run windows containers with hyperv isolation. - // Refer https://aka.ms/hyperv-container. - HypervIsolationAnnotationKey = "experimental.windows.kubernetes.io/isolation-type" - // HypervIsolationValue is used to run windows containers with hyperv isolation. - // Refer https://aka.ms/hyperv-container. - HypervIsolationValue = "hyperv" -) - -// ShouldIsolatedByHyperV returns true if a windows container should be run with hyperv isolation. -func ShouldIsolatedByHyperV(annotations map[string]string) bool { - klog.Warningf("The hyper-v FeatureGate is deprecated in 1.20 and will be removed in 1.21") - - if !utilfeature.DefaultFeatureGate.Enabled(features.HyperVContainer) { - return false - } - - v, ok := annotations[HypervIsolationAnnotationKey] - return ok && v == HypervIsolationValue -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cadvisor/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/cadvisor/BUILD deleted file mode 100644 index 673068e7f780..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cadvisor/BUILD +++ /dev/null @@ -1,112 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "cadvisor_linux.go", - "cadvisor_linux_docker.go", - "cadvisor_unsupported.go", - "cadvisor_windows.go", - "doc.go", - "helpers_linux.go", - "helpers_unsupported.go", - "types.go", - "util.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/cadvisor", - deps = [ - "//pkg/apis/core/v1/helper:go_default_library", - "//pkg/kubelet/types:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/github.com/google/cadvisor/events:go_default_library", - "//vendor/github.com/google/cadvisor/info/v1:go_default_library", - "//vendor/github.com/google/cadvisor/info/v2:go_default_library", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "//pkg/features:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/github.com/google/cadvisor/cache/memory:go_default_library", - "//vendor/github.com/google/cadvisor/container:go_default_library", - "//vendor/github.com/google/cadvisor/container/containerd/install:go_default_library", - "//vendor/github.com/google/cadvisor/container/crio/install:go_default_library", - "//vendor/github.com/google/cadvisor/container/docker/install:go_default_library", - "//vendor/github.com/google/cadvisor/container/systemd/install:go_default_library", - "//vendor/github.com/google/cadvisor/fs:go_default_library", - "//vendor/github.com/google/cadvisor/manager:go_default_library", - "//vendor/github.com/google/cadvisor/utils/cloudinfo/aws:go_default_library", - "//vendor/github.com/google/cadvisor/utils/cloudinfo/azure:go_default_library", - "//vendor/github.com/google/cadvisor/utils/cloudinfo/gce:go_default_library", - "//vendor/github.com/google/cadvisor/utils/sysfs:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//pkg/features:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/github.com/google/cadvisor/cache/memory:go_default_library", - "//vendor/github.com/google/cadvisor/container:go_default_library", - "//vendor/github.com/google/cadvisor/container/containerd/install:go_default_library", - "//vendor/github.com/google/cadvisor/container/crio/install:go_default_library", - "//vendor/github.com/google/cadvisor/container/docker/install:go_default_library", - "//vendor/github.com/google/cadvisor/container/systemd/install:go_default_library", - "//vendor/github.com/google/cadvisor/fs:go_default_library", - "//vendor/github.com/google/cadvisor/manager:go_default_library", - "//vendor/github.com/google/cadvisor/utils/cloudinfo/aws:go_default_library", - "//vendor/github.com/google/cadvisor/utils/cloudinfo/azure:go_default_library", - "//vendor/github.com/google/cadvisor/utils/cloudinfo/gce:go_default_library", - "//vendor/github.com/google/cadvisor/utils/sysfs:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "//pkg/kubelet/winstats:go_default_library", - ], - "//conditions:default": [], - }), -) - -go_test( - name = "go_default_test", - srcs = ["util_test.go"], - embed = [":go_default_library"], - deps = select({ - "@io_bazel_rules_go//go/platform:android": [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/github.com/google/cadvisor/container/crio:go_default_library", - "//vendor/github.com/google/cadvisor/info/v1:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/github.com/google/cadvisor/container/crio:go_default_library", - "//vendor/github.com/google/cadvisor/info/v1:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/kubelet/cadvisor/testing:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cadvisor/cadvisor_cloudproviders.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cadvisor/cadvisor_cloudproviders.go new file mode 100644 index 000000000000..c6444f241724 --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cadvisor/cadvisor_cloudproviders.go @@ -0,0 +1,28 @@ +// +build linux +// +build !providerless + +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package cadvisor + +import ( + // Register cloud info providers. + // TODO(#68522): Remove this in 1.20+ once the cAdvisor endpoints are removed. + _ "github.com/google/cadvisor/utils/cloudinfo/aws" + _ "github.com/google/cadvisor/utils/cloudinfo/azure" + _ "github.com/google/cadvisor/utils/cloudinfo/gce" +) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cadvisor/cadvisor_linux.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cadvisor/cadvisor_linux.go index 0c701cb98d3e..991afe5fcfeb 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cadvisor/cadvisor_linux.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cadvisor/cadvisor_linux.go @@ -31,12 +31,6 @@ import ( _ "github.com/google/cadvisor/container/crio/install" _ "github.com/google/cadvisor/container/systemd/install" - // Register cloud info providers. - // TODO(#68522): Remove this in 1.20+ once the cAdvisor endpoints are removed. - _ "github.com/google/cadvisor/utils/cloudinfo/aws" - _ "github.com/google/cadvisor/utils/cloudinfo/azure" - _ "github.com/google/cadvisor/utils/cloudinfo/gce" - "github.com/google/cadvisor/cache/memory" cadvisormetrics "github.com/google/cadvisor/container" "github.com/google/cadvisor/events" @@ -79,7 +73,7 @@ func init() { f.DefValue = defaultValue f.Value.Set(defaultValue) } else { - klog.Errorf("Expected cAdvisor flag %q not found", name) + klog.ErrorS(nil, "Expected cAdvisor flag not found", "flag", name) } } } @@ -186,7 +180,7 @@ func (cc *cadvisorClient) getFsInfo(label string) (cadvisorapiv2.FsInfo, error) } // TODO(vmarmol): Handle this better when a label has more than one image filesystem. if len(res) > 1 { - klog.Warningf("More than one filesystem labeled %q: %#v. Only using the first one", label, res) + klog.InfoS("More than one filesystem labeled. Only using the first one", "label", label, "fileSystem", res) } return res[0], nil diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cadvisor/util.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cadvisor/util.go index 8fdf0b9dae60..6020abd4dee1 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cadvisor/util.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cadvisor/util.go @@ -30,7 +30,7 @@ import ( const ( // CrioSocket is the path to the CRI-O socket. // Please keep this in sync with the one in: - // github.com/google/cadvisor/container/crio/client.go + // github.com/google/cadvisor/tree/master/container/crio/client.go CrioSocket = "/var/run/crio/crio.sock" ) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/certificate/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/certificate/BUILD deleted file mode 100644 index 24c6489761ee..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/certificate/BUILD +++ /dev/null @@ -1,65 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "kubelet.go", - "transport.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/certificate", - deps = [ - "//pkg/kubelet/apis/config:go_default_library", - "//pkg/kubelet/metrics:go_default_library", - "//staging/src/k8s.io/api/certificates/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/util/certificate:go_default_library", - "//staging/src/k8s.io/client-go/util/connrotation:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "kubelet_test.go", - "transport_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/certificates/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/kubelet/certificate/bootstrap:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/certificate/bootstrap/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/certificate/bootstrap/BUILD deleted file mode 100644 index 64a57490866c..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/certificate/bootstrap/BUILD +++ /dev/null @@ -1,62 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["bootstrap_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/certificates/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/certificates/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - "//staging/src/k8s.io/client-go/util/keyutil:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["bootstrap.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/certificate/bootstrap", - deps = [ - "//staging/src/k8s.io/api/certificates/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/tools/clientcmd:go_default_library", - "//staging/src/k8s.io/client-go/tools/clientcmd/api:go_default_library", - "//staging/src/k8s.io/client-go/transport:go_default_library", - "//staging/src/k8s.io/client-go/util/cert:go_default_library", - "//staging/src/k8s.io/client-go/util/certificate:go_default_library", - "//staging/src/k8s.io/client-go/util/certificate/csr:go_default_library", - "//staging/src/k8s.io/client-go/util/keyutil:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/certificate/bootstrap/bootstrap.go b/vendor/k8s.io/kubernetes/pkg/kubelet/certificate/bootstrap/bootstrap.go index f6b129dc8696..90dd28c36e85 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/certificate/bootstrap/bootstrap.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/certificate/bootstrap/bootstrap.go @@ -61,7 +61,7 @@ func LoadClientConfig(kubeconfigPath, bootstrapPath, certDir string) (certConfig if err != nil { return nil, nil, fmt.Errorf("unable to load kubeconfig: %v", err) } - klog.V(2).Infof("No bootstrapping requested, will use kubeconfig") + klog.V(2).InfoS("No bootstrapping requested, will use kubeconfig") return clientConfig, restclient.CopyConfig(clientConfig), nil } @@ -81,7 +81,7 @@ func LoadClientConfig(kubeconfigPath, bootstrapPath, certDir string) (certConfig if err != nil { return nil, nil, fmt.Errorf("unable to load kubeconfig: %v", err) } - klog.V(2).Infof("Current kubeconfig file contents are still valid, no bootstrap necessary") + klog.V(2).InfoS("Current kubeconfig file contents are still valid, no bootstrap necessary") return clientConfig, restclient.CopyConfig(clientConfig), nil } @@ -97,7 +97,7 @@ func LoadClientConfig(kubeconfigPath, bootstrapPath, certDir string) (certConfig if err := writeKubeconfigFromBootstrapping(clientConfig, kubeconfigPath, pemPath); err != nil { return nil, nil, err } - klog.V(2).Infof("Use the bootstrap credentials to request a cert, and set kubeconfig to point to the certificate dir") + klog.V(2).InfoS("Use the bootstrap credentials to request a cert, and set kubeconfig to point to the certificate dir") return bootstrapClientConfig, clientConfig, nil } @@ -112,11 +112,11 @@ func LoadClientCert(ctx context.Context, kubeconfigPath, bootstrapPath, certDir return err } if ok { - klog.V(2).Infof("Kubeconfig %s exists and is valid, skipping bootstrap", kubeconfigPath) + klog.V(2).InfoS("Kubeconfig exists and is valid, skipping bootstrap", "path", kubeconfigPath) return nil } - klog.V(2).Info("Using bootstrap kubeconfig to generate TLS client cert, key and kubeconfig file") + klog.V(2).InfoS("Using bootstrap kubeconfig to generate TLS client cert, key and kubeconfig file") bootstrapClientConfig, err := loadRESTClientConfig(bootstrapPath) if err != nil { @@ -147,7 +147,7 @@ func LoadClientCert(ctx context.Context, kubeconfigPath, bootstrapPath, certDir // managed by the store. privKeyPath := filepath.Join(certDir, tmpPrivateKeyFile) if !verifyKeyData(keyData) { - klog.V(2).Infof("No valid private key and/or certificate found, reusing existing private key or creating a new one") + klog.V(2).InfoS("No valid private key and/or certificate found, reusing existing private key or creating a new one") // Note: always call LoadOrGenerateKeyFile so that private key is // reused on next startup if CSR request fails. keyData, _, err = keyutil.LoadOrGenerateKeyFile(privKeyPath) @@ -157,7 +157,7 @@ func LoadClientCert(ctx context.Context, kubeconfigPath, bootstrapPath, certDir } if err := waitForServer(ctx, *bootstrapClientConfig, 1*time.Minute); err != nil { - klog.Warningf("Error waiting for apiserver to come up: %v", err) + klog.InfoS("Error waiting for apiserver to come up", "err", err) } certData, err := requestNodeCertificate(ctx, bootstrapClient, keyData, nodeName) @@ -168,7 +168,7 @@ func LoadClientCert(ctx context.Context, kubeconfigPath, bootstrapPath, certDir return err } if err := os.Remove(privKeyPath); err != nil && !os.IsNotExist(err) { - klog.V(2).Infof("failed cleaning up private key file %q: %v", privKeyPath, err) + klog.V(2).InfoS("Failed cleaning up private key file", "path", privKeyPath, "err", err) } return writeKubeconfigFromBootstrapping(bootstrapClientConfig, kubeconfigPath, store.CurrentPath()) @@ -237,32 +237,32 @@ func isClientConfigStillValid(kubeconfigPath string) (bool, error) { } bootstrapClientConfig, err := loadRESTClientConfig(kubeconfigPath) if err != nil { - utilruntime.HandleError(fmt.Errorf("unable to read existing bootstrap client config: %v", err)) + utilruntime.HandleError(fmt.Errorf("unable to read existing bootstrap client config from %s: %v", kubeconfigPath, err)) return false, nil } transportConfig, err := bootstrapClientConfig.TransportConfig() if err != nil { - utilruntime.HandleError(fmt.Errorf("unable to load transport configuration from existing bootstrap client config: %v", err)) + utilruntime.HandleError(fmt.Errorf("unable to load transport configuration from existing bootstrap client config read from %s: %v", kubeconfigPath, err)) return false, nil } // has side effect of populating transport config data fields if _, err := transport.TLSConfigFor(transportConfig); err != nil { - utilruntime.HandleError(fmt.Errorf("unable to load TLS configuration from existing bootstrap client config: %v", err)) + utilruntime.HandleError(fmt.Errorf("unable to load TLS configuration from existing bootstrap client config read from %s: %v", kubeconfigPath, err)) return false, nil } certs, err := certutil.ParseCertsPEM(transportConfig.TLS.CertData) if err != nil { - utilruntime.HandleError(fmt.Errorf("unable to load TLS certificates from existing bootstrap client config: %v", err)) + utilruntime.HandleError(fmt.Errorf("unable to load TLS certificates from existing bootstrap client config read from %s: %v", kubeconfigPath, err)) return false, nil } if len(certs) == 0 { - utilruntime.HandleError(fmt.Errorf("unable to read TLS certificates from existing bootstrap client config: %v", err)) + utilruntime.HandleError(fmt.Errorf("unable to read TLS certificates from existing bootstrap client config read from %s: %v", kubeconfigPath, err)) return false, nil } now := time.Now() for _, cert := range certs { if now.After(cert.NotAfter) { - utilruntime.HandleError(fmt.Errorf("part of the existing bootstrap client certificate is expired: %s", cert.NotAfter)) + utilruntime.HandleError(fmt.Errorf("part of the existing bootstrap client certificate in %s is expired: %v", kubeconfigPath, cert.NotAfter)) return false, nil } } @@ -292,7 +292,7 @@ func waitForServer(ctx context.Context, cfg restclient.Config, deadline time.Dur var connected bool wait.JitterUntil(func() { if _, err := cli.Get().AbsPath("/healthz").Do(ctx).Raw(); err != nil { - klog.Infof("Failed to connect to apiserver: %v", err) + klog.InfoS("Failed to connect to apiserver", "err", err) return } cancel() @@ -352,7 +352,7 @@ func requestNodeCertificate(ctx context.Context, client clientset.Interface, pri ctx, cancel := context.WithTimeout(ctx, 3600*time.Second) defer cancel() - klog.V(2).Infof("Waiting for client certificate to be issued") + klog.V(2).InfoS("Waiting for client certificate to be issued") return csr.WaitForCertificate(ctx, client, reqName, reqUID) } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/certificate/transport.go b/vendor/k8s.io/kubernetes/pkg/kubelet/certificate/transport.go index d19c4ecbcec5..ddb007555aac 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/certificate/transport.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/certificate/transport.go @@ -21,6 +21,7 @@ import ( "fmt" "net" "net/http" + "os" "time" "k8s.io/klog/v2" @@ -105,18 +106,20 @@ func addCertRotation(stopCh <-chan struct{}, period time.Duration, clientConfig // the certificate has been deleted from disk or is otherwise corrupt if now.After(lastCertAvailable.Add(exitAfter)) { if clientCertificateManager.ServerHealthy() { - klog.Fatalf("It has been %s since a valid client cert was found and the server is responsive, exiting.", exitAfter) + klog.ErrorS(nil, "No valid client certificate is found and the server is responsive, exiting.", "lastCertificateAvailabilityTime", lastCertAvailable, "shutdownThreshold", exitAfter) + os.Exit(1) } else { - klog.Errorf("It has been %s since a valid client cert was found, but the server is not responsive. A restart may be necessary to retrieve new initial credentials.", exitAfter) + klog.ErrorS(nil, "No valid client certificate is found but the server is not responsive. A restart may be necessary to retrieve new initial credentials.", "lastCertificateAvailabilityTime", lastCertAvailable, "shutdownThreshold", exitAfter) } } } else { // the certificate is expired if now.After(curr.Leaf.NotAfter) { if clientCertificateManager.ServerHealthy() { - klog.Fatalf("The currently active client certificate has expired and the server is responsive, exiting.") + klog.ErrorS(nil, "The currently active client certificate has expired and the server is responsive, exiting.") + os.Exit(1) } else { - klog.Errorf("The currently active client certificate has expired, but the server is not responsive. A restart may be necessary to retrieve new initial credentials.") + klog.ErrorS(nil, "The currently active client certificate has expired, but the server is not responsive. A restart may be necessary to retrieve new initial credentials.") } } lastCertAvailable = now @@ -129,7 +132,7 @@ func addCertRotation(stopCh <-chan struct{}, period time.Duration, clientConfig } lastCert = curr - klog.Infof("certificate rotation detected, shutting down client connections to start using new credentials") + klog.InfoS("Certificate rotation detected, shutting down client connections to start using new credentials") // The cert has been rotated. Close all existing connections to force the client // to reperform its TLS handshake with new cert. // diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/checkpointmanager/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/checkpointmanager/BUILD deleted file mode 100644 index 0353c2d1ca8d..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/checkpointmanager/BUILD +++ /dev/null @@ -1,48 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["checkpoint_manager.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/checkpointmanager", - deps = [ - "//pkg/kubelet/checkpointmanager/errors:go_default_library", - "//pkg/kubelet/util/store:go_default_library", - "//pkg/util/filesystem:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["checkpoint_manager_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/checkpointmanager/checksum:go_default_library", - "//pkg/kubelet/checkpointmanager/testing:go_default_library", - "//pkg/kubelet/checkpointmanager/testing/example_checkpoint_formats/v1:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/kubelet/checkpointmanager/checksum:all-srcs", - "//pkg/kubelet/checkpointmanager/errors:all-srcs", - "//pkg/kubelet/checkpointmanager/testing:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/checkpointmanager/checksum/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/checkpointmanager/checksum/BUILD deleted file mode 100644 index cb86b212baff..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/checkpointmanager/checksum/BUILD +++ /dev/null @@ -1,26 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["checksum.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/checkpointmanager/checksum", - visibility = ["//visibility:public"], - deps = [ - "//pkg/kubelet/checkpointmanager/errors:go_default_library", - "//pkg/util/hash:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/checkpointmanager/errors/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/checkpointmanager/errors/BUILD deleted file mode 100644 index 76c04fe9014f..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/checkpointmanager/errors/BUILD +++ /dev/null @@ -1,25 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["errors.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/checkpointmanager/errors", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/client/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/client/BUILD deleted file mode 100644 index ffb2434be555..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/client/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["kubelet_client.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/client", - deps = [ - "//pkg/util/node:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/egressselector:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/transport:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["kubelet_client_test.go"], - data = ["//pkg/client/testdata"], - embed = [":go_default_library"], - deps = ["//staging/src/k8s.io/client-go/rest:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cloudresource/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/cloudresource/BUILD deleted file mode 100644 index 1f5a1e5fbf55..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cloudresource/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["cloud_request_manager.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/cloudresource", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/cloud-provider:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["cloud_request_manager_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/cloud-provider/fake:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cloudresource/cloud_request_manager.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cloudresource/cloud_request_manager.go index 889c29b1907a..fafec971f9c2 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cloudresource/cloud_request_manager.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cloudresource/cloud_request_manager.go @@ -82,7 +82,7 @@ func (m *cloudResourceSyncManager) NodeAddresses() ([]v1.NodeAddress, error) { if addrs, err := m.nodeAddresses, m.nodeAddressesErr; len(addrs) > 0 || err != nil { return addrs, err } - klog.V(5).Infof("Waiting for cloud provider to provide node addresses") + klog.V(5).InfoS("Waiting for cloud provider to provide node addresses") m.nodeAddressesMonitor.Wait() } } @@ -103,7 +103,7 @@ func (m *cloudResourceSyncManager) getNodeAddresses() ([]v1.NodeAddress, error) } func (m *cloudResourceSyncManager) syncNodeAddresses() { - klog.V(5).Infof("Requesting node addresses from cloud provider for node %q", m.nodeName) + klog.V(5).InfoS("Requesting node addresses from cloud provider for node", "nodeName", m.nodeName) addrs, err := m.getNodeAddresses() @@ -112,7 +112,7 @@ func (m *cloudResourceSyncManager) syncNodeAddresses() { defer m.nodeAddressesMonitor.Broadcast() if err != nil { - klog.V(2).Infof("Node addresses from cloud provider for node %q not collected: %v", m.nodeName, err) + klog.V(2).InfoS("Node addresses from cloud provider for node not collected", "nodeName", m.nodeName, "err", err) if len(m.nodeAddresses) > 0 { // in the event that a sync loop fails when a previous sync had @@ -124,7 +124,7 @@ func (m *cloudResourceSyncManager) syncNodeAddresses() { return } - klog.V(5).Infof("Node addresses from cloud provider for node %q collected", m.nodeName) + klog.V(5).InfoS("Node addresses from cloud provider for node collected", "nodeName", m.nodeName) m.nodeAddressesErr = nil m.nodeAddresses = addrs } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/BUILD deleted file mode 100644 index 6d14d67f245a..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/BUILD +++ /dev/null @@ -1,247 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "cgroup_manager_linux.go", - "cgroup_manager_unsupported.go", - "container_manager.go", - "container_manager_linux.go", - "container_manager_stub.go", - "container_manager_unsupported.go", - "container_manager_windows.go", - "fake_container_manager.go", - "fake_internal_container_lifecycle.go", - "fake_pod_container_manager.go", - "helpers.go", - "helpers_linux.go", - "helpers_unsupported.go", - "internal_container_lifecycle.go", - "internal_container_lifecycle_linux.go", - "internal_container_lifecycle_unsupported.go", - "internal_container_lifecycle_windows.go", - "node_container_manager_linux.go", - "pod_container_manager_linux.go", - "pod_container_manager_stub.go", - "pod_container_manager_unsupported.go", - "qos_container_manager_linux.go", - "types.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/cm", - visibility = ["//visibility:public"], - deps = [ - "//pkg/features:go_default_library", - "//pkg/kubelet/cm/cpumanager:go_default_library", - "//pkg/kubelet/cm/cpuset:go_default_library", - "//pkg/kubelet/cm/topologymanager:go_default_library", - "//pkg/kubelet/config:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/eviction/api:go_default_library", - "//pkg/kubelet/lifecycle:go_default_library", - "//pkg/kubelet/pluginmanager/cache:go_default_library", - "//pkg/kubelet/status:go_default_library", - "//pkg/scheduler/framework:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/cri-api/pkg/apis:go_default_library", - "//staging/src/k8s.io/cri-api/pkg/apis/runtime/v1alpha2:go_default_library", - "//staging/src/k8s.io/kubelet/pkg/apis/podresources/v1:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ] + select({ - "@io_bazel_rules_go//go/platform:aix": [ - "//pkg/kubelet/cadvisor:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - ], - "@io_bazel_rules_go//go/platform:android": [ - "//pkg/api/v1/resource:go_default_library", - "//pkg/apis/core/v1/helper:go_default_library", - "//pkg/apis/core/v1/helper/qos:go_default_library", - "//pkg/kubelet/cadvisor:go_default_library", - "//pkg/kubelet/cm/containermap:go_default_library", - "//pkg/kubelet/cm/devicemanager:go_default_library", - "//pkg/kubelet/cm/util:go_default_library", - "//pkg/kubelet/events:go_default_library", - "//pkg/kubelet/metrics:go_default_library", - "//pkg/kubelet/qos:go_default_library", - "//pkg/kubelet/stats/pidlimit:go_default_library", - "//pkg/kubelet/types:go_default_library", - "//pkg/util/oom:go_default_library", - "//pkg/util/procfs:go_default_library", - "//pkg/util/sysctl:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/version:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/github.com/docker/go-units:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/cgroups:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs2:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/systemd:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/configs:go_default_library", - "//vendor/k8s.io/utils/io:go_default_library", - "//vendor/k8s.io/utils/path:go_default_library", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "//pkg/kubelet/cadvisor:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "//pkg/kubelet/cadvisor:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "//pkg/kubelet/cadvisor:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - ], - "@io_bazel_rules_go//go/platform:illumos": [ - "//pkg/kubelet/cadvisor:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - ], - "@io_bazel_rules_go//go/platform:ios": [ - "//pkg/kubelet/cadvisor:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - ], - "@io_bazel_rules_go//go/platform:js": [ - "//pkg/kubelet/cadvisor:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//pkg/api/v1/resource:go_default_library", - "//pkg/apis/core/v1/helper:go_default_library", - "//pkg/apis/core/v1/helper/qos:go_default_library", - "//pkg/kubelet/cadvisor:go_default_library", - "//pkg/kubelet/cm/containermap:go_default_library", - "//pkg/kubelet/cm/devicemanager:go_default_library", - "//pkg/kubelet/cm/util:go_default_library", - "//pkg/kubelet/events:go_default_library", - "//pkg/kubelet/metrics:go_default_library", - "//pkg/kubelet/qos:go_default_library", - "//pkg/kubelet/stats/pidlimit:go_default_library", - "//pkg/kubelet/types:go_default_library", - "//pkg/util/oom:go_default_library", - "//pkg/util/procfs:go_default_library", - "//pkg/util/sysctl:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/version:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/github.com/docker/go-units:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/cgroups:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs2:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/systemd:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/configs:go_default_library", - "//vendor/k8s.io/utils/io:go_default_library", - "//vendor/k8s.io/utils/path:go_default_library", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "//pkg/kubelet/cadvisor:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "//pkg/kubelet/cadvisor:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "//pkg/kubelet/cadvisor:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "//pkg/kubelet/cadvisor:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "//pkg/kubelet/cadvisor:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "//pkg/kubelet/cadvisor:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - ], - "//conditions:default": [], - }), -) - -go_test( - name = "go_default_test", - srcs = [ - "cgroup_manager_linux_test.go", - "cgroup_manager_test.go", - "container_manager_linux_test.go", - "helpers_linux_test.go", - "node_container_manager_linux_test.go", - "pod_container_manager_linux_test.go", - ], - embed = [":go_default_library"], - deps = select({ - "@io_bazel_rules_go//go/platform:android": [ - "//pkg/features:go_default_library", - "//pkg/kubelet/eviction/api:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/cgroups:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//pkg/features:go_default_library", - "//pkg/kubelet/eviction/api:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/cgroups:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/kubelet/cm/containermap:all-srcs", - "//pkg/kubelet/cm/cpumanager:all-srcs", - "//pkg/kubelet/cm/cpuset:all-srcs", - "//pkg/kubelet/cm/devicemanager:all-srcs", - "//pkg/kubelet/cm/topologymanager:all-srcs", - "//pkg/kubelet/cm/util:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cgroup_manager_linux.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cgroup_manager_linux.go index b99f20e870a7..f598d466b0b3 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cgroup_manager_linux.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cgroup_manager_linux.go @@ -31,6 +31,7 @@ import ( cgroupfs2 "github.com/opencontainers/runc/libcontainer/cgroups/fs2" cgroupsystemd "github.com/opencontainers/runc/libcontainer/cgroups/systemd" libcontainerconfigs "github.com/opencontainers/runc/libcontainer/configs" + libcontainerdevices "github.com/opencontainers/runc/libcontainer/devices" "k8s.io/klog/v2" v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper" @@ -258,7 +259,7 @@ func (m *cgroupManagerImpl) Exists(name CgroupName) bool { } difference := neededControllers.Difference(enabledControllers) if difference.Len() > 0 { - klog.V(4).Infof("The Cgroup %v has some missing controllers: %v", name, difference) + klog.V(4).InfoS("The cgroup has some missing controllers", "cgroupName", name, "controllers", difference) return false } return true @@ -291,7 +292,7 @@ func (m *cgroupManagerImpl) Exists(name CgroupName) bool { } if len(missingPaths) > 0 { - klog.V(4).Infof("The Cgroup %v has some missing paths: %v", name, missingPaths) + klog.V(4).InfoS("The cgroup has some missing paths", "cgroupName", name, "paths", missingPaths) return false } @@ -366,7 +367,7 @@ func setSupportedSubsystemsV1(cgroupConfig *libcontainerconfigs.Cgroup) error { return fmt.Errorf("failed to find subsystem mount for required subsystem: %v", sys.Name()) } // the cgroup is not mounted, but its not required so continue... - klog.V(6).Infof("Unable to find subsystem mount for optional subsystem: %v", sys.Name()) + klog.V(6).InfoS("Unable to find subsystem mount for optional subsystem", "subsystemName", sys.Name()) continue } if err := sys.Set(cgroupConfig.Paths[sys.Name()], cgroupConfig); err != nil { @@ -468,13 +469,13 @@ func setResourcesV2(cgroupConfig *libcontainerconfigs.Cgroup) error { if err := propagateControllers(cgroupConfig.Path); err != nil { return err } - cgroupConfig.Resources.Devices = []*libcontainerconfigs.DeviceRule{ + cgroupConfig.Resources.Devices = []*libcontainerdevices.Rule{ { Type: 'a', Permissions: "rwm", Allow: true, - Minor: libcontainerconfigs.Wildcard, - Major: libcontainerconfigs.Wildcard, + Minor: libcontainerdevices.Wildcard, + Major: libcontainerdevices.Wildcard, }, } cgroupConfig.Resources.SkipDevices = true @@ -484,7 +485,7 @@ func setResourcesV2(cgroupConfig *libcontainerconfigs.Cgroup) error { if !supportedControllers.Has("hugetlb") { cgroupConfig.Resources.HugetlbLimit = nil // the cgroup is not present, but its not required so skip it - klog.V(6).Infof("Optional subsystem not supported: hugetlb") + klog.V(6).InfoS("Optional subsystem not supported: hugetlb") } manager, err := cgroupfs2.NewManager(cgroupConfig, filepath.Join(cmutil.CgroupRoot, cgroupConfig.Path), false) @@ -499,13 +500,13 @@ func setResourcesV2(cgroupConfig *libcontainerconfigs.Cgroup) error { func (m *cgroupManagerImpl) toResources(resourceConfig *ResourceConfig) *libcontainerconfigs.Resources { resources := &libcontainerconfigs.Resources{ - Devices: []*libcontainerconfigs.DeviceRule{ + Devices: []*libcontainerdevices.Rule{ { Type: 'a', Permissions: "rwm", Allow: true, - Minor: libcontainerconfigs.Wildcard, - Major: libcontainerconfigs.Wildcard, + Minor: libcontainerdevices.Wildcard, + Major: libcontainerdevices.Wildcard, }, }, SkipDevices: true, @@ -538,7 +539,7 @@ func (m *cgroupManagerImpl) toResources(resourceConfig *ResourceConfig) *libcont for pageSize, limit := range resourceConfig.HugePageLimit { sizeString, err := v1helper.HugePageUnitSizeFromByteSize(pageSize) if err != nil { - klog.Warningf("pageSize is invalid: %v", err) + klog.InfoS("Invalid pageSize", "err", err) continue } resources.HugetlbLimit = append(resources.HugetlbLimit, &libcontainerconfigs.HugepageLimit{ @@ -577,7 +578,7 @@ func (m *cgroupManagerImpl) Update(cgroupConfig *CgroupConfig) error { unified := libcontainercgroups.IsCgroup2UnifiedMode() if unified { - libcontainerCgroupConfig.Path = cgroupConfig.Name.ToCgroupfs() + libcontainerCgroupConfig.Path = m.Name(cgroupConfig.Name) } else { libcontainerCgroupConfig.Paths = m.buildCgroupPaths(cgroupConfig.Name) } @@ -679,7 +680,7 @@ func (m *cgroupManagerImpl) Pids(name CgroupName) []int { // WalkFunc which is called for each file and directory in the pod cgroup dir visitor := func(path string, info os.FileInfo, err error) error { if err != nil { - klog.V(4).Infof("cgroup manager encountered error scanning cgroup path %q: %v", path, err) + klog.V(4).InfoS("Cgroup manager encountered error scanning cgroup path", "path", path, "err", err) return filepath.SkipDir } if !info.IsDir() { @@ -687,7 +688,7 @@ func (m *cgroupManagerImpl) Pids(name CgroupName) []int { } pids, err = getCgroupProcs(path) if err != nil { - klog.V(4).Infof("cgroup manager encountered error getting procs for cgroup path %q: %v", path, err) + klog.V(4).InfoS("Cgroup manager encountered error getting procs for cgroup path", "path", path, "err", err) return filepath.SkipDir } pidsToKill.Insert(pids...) @@ -697,7 +698,7 @@ func (m *cgroupManagerImpl) Pids(name CgroupName) []int { // container cgroups haven't been GCed yet. Get attached processes to // all such unwanted containers under the pod cgroup if err = filepath.Walk(dir, visitor); err != nil { - klog.V(4).Infof("cgroup manager encountered error scanning pids for directory: %q: %v", dir, err) + klog.V(4).InfoS("Cgroup manager encountered error scanning pids for directory", "path", dir, "err", err) } } return pidsToKill.List() @@ -725,7 +726,7 @@ func getStatsSupportedSubsystems(cgroupPaths map[string]string) (*libcontainercg return nil, fmt.Errorf("failed to find subsystem mount for required subsystem: %v", sys.Name()) } // the cgroup is not mounted, but its not required so continue... - klog.V(6).Infof("Unable to find subsystem mount for optional subsystem: %v", sys.Name()) + klog.V(6).InfoS("Unable to find subsystem mount for optional subsystem", "subsystemName", sys.Name()) continue } if err := sys.GetStats(cgroupPaths[sys.Name()], stats); err != nil { diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/container_manager.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/container_manager.go index ea81d6163a75..2296fe024e25 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/container_manager.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/container_manager.go @@ -17,6 +17,9 @@ limitations under the License. package cm import ( + "fmt" + "strconv" + "strings" "time" "k8s.io/apimachinery/pkg/util/sets" @@ -24,7 +27,10 @@ import ( v1 "k8s.io/api/core/v1" internalapi "k8s.io/cri-api/pkg/apis" podresourcesapi "k8s.io/kubelet/pkg/apis/podresources/v1" + kubeletconfig "k8s.io/kubernetes/pkg/kubelet/apis/config" + "k8s.io/kubernetes/pkg/kubelet/apis/podresources" "k8s.io/kubernetes/pkg/kubelet/cm/cpuset" + "k8s.io/kubernetes/pkg/kubelet/cm/devicemanager" "k8s.io/kubernetes/pkg/kubelet/config" kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" evictionapi "k8s.io/kubernetes/pkg/kubelet/eviction/api" @@ -32,10 +38,6 @@ import ( "k8s.io/kubernetes/pkg/kubelet/pluginmanager/cache" "k8s.io/kubernetes/pkg/kubelet/status" schedulerframework "k8s.io/kubernetes/pkg/scheduler/framework" - - "fmt" - "strconv" - "strings" ) type ActivePodsFunc func() []*v1.Pod @@ -103,12 +105,6 @@ type ContainerManager interface { // registration. GetPluginRegistrationHandler() cache.PluginHandler - // GetDevices returns information about the devices assigned to pods and containers - GetDevices(podUID, containerName string) []*podresourcesapi.ContainerDevices - - // GetCPUs returns information about the cpus assigned to pods and containers - GetCPUs(podUID, containerName string) []int64 - // ShouldResetExtendedResourceCapacity returns whether or not the extended resources should be zeroed, // due to node recreation. ShouldResetExtendedResourceCapacity() bool @@ -116,8 +112,9 @@ type ContainerManager interface { // GetAllocateResourcesPodAdmitHandler returns an instance of a PodAdmitHandler responsible for allocating pod resources. GetAllocateResourcesPodAdmitHandler() lifecycle.PodAdmitHandler - // UpdateAllocatedDevices frees any Devices that are bound to terminated pods. - UpdateAllocatedDevices() + // Implements the podresources Provider API for CPUs and Devices + podresources.CPUsProvider + podresources.DevicesProvider } type NodeConfig struct { @@ -131,14 +128,16 @@ type NodeConfig struct { KubeletRootDir string ProtectKernelDefaults bool NodeAllocatableConfig - QOSReserved map[v1.ResourceName]int64 - ExperimentalCPUManagerPolicy string - ExperimentalTopologyManagerScope string - ExperimentalCPUManagerReconcilePeriod time.Duration - ExperimentalPodPidsLimit int64 - EnforceCPULimits bool - CPUCFSQuotaPeriod time.Duration - ExperimentalTopologyManagerPolicy string + QOSReserved map[v1.ResourceName]int64 + ExperimentalCPUManagerPolicy string + ExperimentalTopologyManagerScope string + ExperimentalCPUManagerReconcilePeriod time.Duration + ExperimentalMemoryManagerPolicy string + ExperimentalMemoryManagerReservedMemory []kubeletconfig.MemoryReservation + ExperimentalPodPidsLimit int64 + EnforceCPULimits bool + CPUCFSQuotaPeriod time.Duration + ExperimentalTopologyManagerPolicy string } type NodeAllocatableConfig struct { @@ -189,3 +188,39 @@ func ParseQOSReserved(m map[string]string) (*map[v1.ResourceName]int64, error) { } return &reservations, nil } + +func containerDevicesFromResourceDeviceInstances(devs devicemanager.ResourceDeviceInstances) []*podresourcesapi.ContainerDevices { + var respDevs []*podresourcesapi.ContainerDevices + + for resourceName, resourceDevs := range devs { + for devID, dev := range resourceDevs { + topo := dev.GetTopology() + if topo == nil { + // Some device plugin do not report the topology information. + // This is legal, so we report the devices anyway, + // let the client decide what to do. + respDevs = append(respDevs, &podresourcesapi.ContainerDevices{ + ResourceName: resourceName, + DeviceIds: []string{devID}, + }) + continue + } + + for _, node := range topo.GetNodes() { + respDevs = append(respDevs, &podresourcesapi.ContainerDevices{ + ResourceName: resourceName, + DeviceIds: []string{devID}, + Topology: &podresourcesapi.TopologyInfo{ + Nodes: []*podresourcesapi.NUMANode{ + { + ID: node.GetID(), + }, + }, + }, + }) + } + } + } + + return respDevs +} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/container_manager_linux.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/container_manager_linux.go index fd732430d1ae..5e05d5eff82a 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/container_manager_linux.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/container_manager_linux.go @@ -38,6 +38,7 @@ import ( utilio "k8s.io/utils/io" utilpath "k8s.io/utils/path" + libcontainerdevices "github.com/opencontainers/runc/libcontainer/devices" v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" utilerrors "k8s.io/apimachinery/pkg/util/errors" @@ -53,6 +54,7 @@ import ( "k8s.io/kubernetes/pkg/kubelet/cm/containermap" "k8s.io/kubernetes/pkg/kubelet/cm/cpumanager" "k8s.io/kubernetes/pkg/kubelet/cm/devicemanager" + "k8s.io/kubernetes/pkg/kubelet/cm/memorymanager" "k8s.io/kubernetes/pkg/kubelet/cm/topologymanager" cmutil "k8s.io/kubernetes/pkg/kubelet/cm/util" "k8s.io/kubernetes/pkg/kubelet/config" @@ -69,10 +71,10 @@ import ( ) const ( - dockerProcessName = "dockerd" + dockerProcessName = "dockerd" + // dockerd option --pidfile can specify path to use for daemon PID file, pid file path is default "/var/run/docker.pid" dockerPidFile = "/var/run/docker.pid" - containerdProcessName = "docker-containerd" - containerdPidFile = "/run/docker/libcontainerd/docker-containerd.pid" + containerdProcessName = "containerd" maxPidFileLength = 1 << 10 // 1KB ) @@ -138,6 +140,8 @@ type containerManagerImpl struct { deviceManager devicemanager.Manager // Interface for CPU affinity management. cpuManager cpumanager.Manager + // Interface for memory affinity management. + memoryManager memorymanager.Manager // Interface for Topology resource co-ordination topologyManager topologymanager.Manager } @@ -192,11 +196,11 @@ func validateSystemRequirements(mountUtil mount.Interface) (features, error) { // CPU cgroup is required and so it expected to be mounted at this point. periodExists, err := utilpath.Exists(utilpath.CheckFollowSymlink, path.Join(cpuMountPoint, "cpu.cfs_period_us")) if err != nil { - klog.Errorf("failed to detect if CPU cgroup cpu.cfs_period_us is available - %v", err) + klog.ErrorS(err, "Failed to detect if CPU cgroup cpu.cfs_period_us is available") } quotaExists, err := utilpath.Exists(utilpath.CheckFollowSymlink, path.Join(cpuMountPoint, "cpu.cfs_quota_us")) if err != nil { - klog.Errorf("failed to detect if CPU cgroup cpu.cfs_quota_us is available - %v", err) + klog.ErrorS(err, "Failed to detect if CPU cgroup cpu.cfs_quota_us is available") } if quotaExists && periodExists { f.cpuHardcapping = true @@ -219,7 +223,7 @@ func NewContainerManager(mountUtil mount.Interface, cadvisorInterface cadvisor.I swapData, err := ioutil.ReadFile(swapFile) if err != nil { if os.IsNotExist(err) { - klog.Warningf("file %v does not exist, assuming that swap is disabled", swapFile) + klog.InfoS("File does not exist, assuming that swap is disabled", "path", swapFile) } else { return nil, err } @@ -271,12 +275,12 @@ func NewContainerManager(mountUtil mount.Interface, cadvisorInterface cadvisor.I if !cgroupManager.Exists(cgroupRoot) { return nil, fmt.Errorf("invalid configuration: cgroup-root %q doesn't exist", cgroupRoot) } - klog.Infof("container manager verified user specified cgroup-root exists: %v", cgroupRoot) + klog.InfoS("Container manager verified user specified cgroup-root exists", "cgroupRoot", cgroupRoot) // Include the top level cgroup for enforcing node allocatable into cgroup-root. // This way, all sub modules can avoid having to understand the concept of node allocatable. cgroupRoot = NewCgroupName(cgroupRoot, defaultNodeAllocatableCgroupName) } - klog.Infof("Creating Container Manager object based on Node Config: %+v", nodeConfig) + klog.InfoS("Creating Container Manager object based on Node Config", "nodeConfig", nodeConfig) qosContainerManager, err := NewQOSContainerManager(subsystems, cgroupRoot, nodeConfig, cgroupManager) if err != nil { @@ -307,12 +311,12 @@ func NewContainerManager(mountUtil mount.Interface, cadvisorInterface cadvisor.I return nil, err } - klog.Infof("[topologymanager] Initializing Topology Manager with %s policy and %s-level scope", nodeConfig.ExperimentalTopologyManagerPolicy, nodeConfig.ExperimentalTopologyManagerScope) + klog.InfoS("Initializing Topology Manager", "policy", nodeConfig.ExperimentalTopologyManagerPolicy, "scope", nodeConfig.ExperimentalTopologyManagerScope) } else { cm.topologyManager = topologymanager.NewFakeManager() } - klog.Infof("Creating device plugin manager: %t", devicePluginEnabled) + klog.InfoS("Creating device plugin manager", "devicePluginEnabled", devicePluginEnabled) if devicePluginEnabled { cm.deviceManager, err = devicemanager.NewManagerImpl(machineInfo.Topology, cm.topologyManager) cm.topologyManager.AddHintProvider(cm.deviceManager) @@ -335,12 +339,28 @@ func NewContainerManager(mountUtil mount.Interface, cadvisorInterface cadvisor.I cm.topologyManager, ) if err != nil { - klog.Errorf("failed to initialize cpu manager: %v", err) + klog.ErrorS(err, "Failed to initialize cpu manager") return nil, err } cm.topologyManager.AddHintProvider(cm.cpuManager) } + if utilfeature.DefaultFeatureGate.Enabled(kubefeatures.MemoryManager) { + cm.memoryManager, err = memorymanager.NewManager( + nodeConfig.ExperimentalMemoryManagerPolicy, + machineInfo, + cm.GetNodeAllocatableReservation(), + nodeConfig.ExperimentalMemoryManagerReservedMemory, + nodeConfig.KubeletRootDir, + cm.topologyManager, + ) + if err != nil { + klog.ErrorS(err, "Failed to initialize memory manager") + return nil, err + } + cm.topologyManager.AddHintProvider(cm.memoryManager) + } + return cm, nil } @@ -364,7 +384,7 @@ func (cm *containerManagerImpl) NewPodContainerManager() PodContainerManager { } func (cm *containerManagerImpl) InternalContainerLifecycle() InternalContainerLifecycle { - return &internalContainerLifecycleImpl{cm.cpuManager, cm.topologyManager} + return &internalContainerLifecycleImpl{cm.cpuManager, cm.memoryManager, cm.topologyManager} } // Create a cgroup container manager. @@ -373,13 +393,13 @@ func createManager(containerName string) (cgroups.Manager, error) { Parent: "/", Name: containerName, Resources: &configs.Resources{ - Devices: []*configs.DeviceRule{ + Devices: []*libcontainerdevices.Rule{ { Type: 'a', Permissions: "rwm", Allow: true, - Minor: configs.Wildcard, - Major: configs.Wildcard, + Minor: libcontainerdevices.Wildcard, + Major: libcontainerdevices.Wildcard, }, }, SkipDevices: true, @@ -430,9 +450,9 @@ func setupKernelTunables(option KernelTunableBehavior) error { case KernelTunableError: errList = append(errList, fmt.Errorf("invalid kernel flag: %v, expected value: %v, actual value: %v", flag, expectedValue, val)) case KernelTunableWarn: - klog.V(2).Infof("Invalid kernel flag: %v, expected value: %v, actual value: %v", flag, expectedValue, val) + klog.V(2).InfoS("Invalid kernel flag", "flag", flag, "expectedValue", expectedValue, "actualValue", val) case KernelTunableModify: - klog.V(2).Infof("Updating kernel flag: %v, expected value: %v, actual value: %v", flag, expectedValue, val) + klog.V(2).InfoS("Updating kernel flag", "flag", flag, "expectedValue", expectedValue, "actualValue", val) err = sysctl.SetSysctl(flag, expectedValue) if err != nil { errList = append(errList, err) @@ -481,13 +501,13 @@ func (cm *containerManagerImpl) setupNode(activePods ActivePodsFunc) error { // Check the cgroup for docker periodically, so kubelet can serve stats for the docker runtime. // TODO(KEP#866): remove special processing for CRI "docker" enablement cm.periodicTasks = append(cm.periodicTasks, func() { - klog.V(4).Infof("[ContainerManager]: Adding periodic tasks for docker CRI integration") + klog.V(4).InfoS("Adding periodic tasks for docker CRI integration") cont, err := getContainerNameForProcess(dockerProcessName, dockerPidFile) if err != nil { - klog.Error(err) + klog.ErrorS(err, "Failed to get container name for process") return } - klog.V(2).Infof("[ContainerManager]: Discovered runtime cgroups name: %s", cont) + klog.V(2).InfoS("Discovered runtime cgroup name", "cgroupName", cont) cm.Lock() defer cm.Unlock() cm.RuntimeCgroupsName = cont @@ -525,12 +545,12 @@ func (cm *containerManagerImpl) setupNode(activePods ActivePodsFunc) error { } else { cm.periodicTasks = append(cm.periodicTasks, func() { if err := ensureProcessInContainerWithOOMScore(os.Getpid(), qos.KubeletOOMScoreAdj, nil); err != nil { - klog.Error(err) + klog.ErrorS(err, "Failed to ensure process in container with oom score") return } cont, err := getContainer(os.Getpid()) if err != nil { - klog.Errorf("failed to find cgroups of kubelet - %v", err) + klog.ErrorS(err, "Failed to find cgroups of kubelet") return } cm.Lock() @@ -606,6 +626,18 @@ func (cm *containerManagerImpl) Start(node *v1.Node, } } + // Initialize memory manager + if utilfeature.DefaultFeatureGate.Enabled(kubefeatures.MemoryManager) { + containerMap, err := buildContainerMapFromRuntime(runtimeService) + if err != nil { + return fmt.Errorf("failed to build map of initial containers from runtime: %v", err) + } + err = cm.memoryManager.Start(memorymanager.ActivePodsFunc(activePods), sourcesReady, podStatusProvider, runtimeService, containerMap) + if err != nil { + return fmt.Errorf("start memory manager error: %v", err) + } + } + // cache the node Info including resource capacity and // allocatable of the node cm.nodeInfo = node @@ -644,7 +676,7 @@ func (cm *containerManagerImpl) Start(node *v1.Node, for _, cont := range cm.systemContainers { if cont.ensureStateFunc != nil { if err := cont.ensureStateFunc(cont.manager); err != nil { - klog.Warningf("[ContainerManager] Failed to ensure state of %q: %v", cont.name, err) + klog.InfoS("Failed to ensure state", "containerName", cont.name, "err", err) } } } @@ -706,11 +738,12 @@ func (cm *containerManagerImpl) GetAllocateResourcesPodAdmitHandler() lifecycle. // work as we add more and more hint providers that the TopologyManager // needs to call Allocate() on (that may not be directly intstantiated // inside this component). - return &resourceAllocator{cm.cpuManager, cm.deviceManager} + return &resourceAllocator{cm.cpuManager, cm.memoryManager, cm.deviceManager} } type resourceAllocator struct { cpuManager cpumanager.Manager + memoryManager memorymanager.Manager deviceManager devicemanager.Manager } @@ -737,6 +770,17 @@ func (m *resourceAllocator) Admit(attrs *lifecycle.PodAdmitAttributes) lifecycle } } } + + if m.memoryManager != nil { + err = m.memoryManager.Allocate(pod, &container) + if err != nil { + return lifecycle.PodAdmitResult{ + Message: fmt.Sprintf("Allocate failed due to %v, which is unexpected", err), + Reason: "UnexpectedAdmissionError", + Admit: false, + } + } + } } return lifecycle.PodAdmitResult{Admit: true} @@ -782,12 +826,12 @@ func isProcessRunningInHost(pid int) (bool, error) { if err != nil { return false, fmt.Errorf("failed to find pid namespace of init process") } - klog.V(10).Infof("init pid ns is %q", initPidNs) + klog.V(10).InfoS("Found init PID namespace", "namespace", initPidNs) processPidNs, err := os.Readlink(fmt.Sprintf("/proc/%d/ns/pid", pid)) if err != nil { return false, fmt.Errorf("failed to find pid namespace of process %q", pid) } - klog.V(10).Infof("Pid %d pid ns is %q", pid, processPidNs) + klog.V(10).InfoS("Process info", "pid", pid, "namespace", processPidNs) return initPidNs == processPidNs, nil } @@ -829,7 +873,7 @@ func getPidsForProcess(name, pidFile string) ([]int, error) { // Return error from getPidFromPidFile since that should have worked // and is the real source of the problem. - klog.V(4).Infof("unable to get pid from %s: %v", pidFile, err) + klog.V(4).InfoS("Unable to get pid from file", "path", pidFile, "err", err) return []int{}, err } @@ -841,6 +885,8 @@ func EnsureDockerInContainer(dockerAPIVersion *utilversion.Version, oomScoreAdj type process struct{ name, file string } dockerProcs := []process{{dockerProcessName, dockerPidFile}} if dockerAPIVersion.AtLeast(containerdAPIVersion) { + // By default containerd is started separately, so there is no pid file. + containerdPidFile := "" dockerProcs = append(dockerProcs, process{containerdProcessName, containerdPidFile}) } var errs []error @@ -867,7 +913,7 @@ func ensureProcessInContainerWithOOMScore(pid int, oomScoreAdj int, manager cgro return err } else if !runningInHost { // Process is running inside a container. Don't touch that. - klog.V(2).Infof("pid %d is not running in the host namespaces", pid) + klog.V(2).InfoS("PID is not running in the host namespace", "pid", pid) return nil } @@ -896,9 +942,9 @@ func ensureProcessInContainerWithOOMScore(pid int, oomScoreAdj int, manager cgro // Also apply oom-score-adj to processes oomAdjuster := oom.NewOOMAdjuster() - klog.V(5).Infof("attempting to apply oom_score_adj of %d to pid %d", oomScoreAdj, pid) + klog.V(5).InfoS("Attempting to apply oom_score_adj to process", "oomScoreAdj", oomScoreAdj, "pid", pid) if err := oomAdjuster.ApplyOOMScoreAdj(pid, oomScoreAdj); err != nil { - klog.V(3).Infof("Failed to apply oom_score_adj %d for pid %d: %v", oomScoreAdj, pid, err) + klog.V(3).InfoS("Failed to apply oom_score_adj to process", "oomScoreAdj", oomScoreAdj, "pid", pid, "err", err) errs = append(errs, fmt.Errorf("failed to apply oom score %d to PID %d: %v", oomScoreAdj, pid, err)) } return utilerrors.NewAggregate(errs) @@ -946,10 +992,10 @@ func getContainer(pid int) (string, error) { // in addition, you would not get memory or cpu accounting for the runtime unless accounting was enabled on its unit (or globally). if systemd, found := cgs["name=systemd"]; found { if systemd != cpu { - klog.Warningf("CPUAccounting not enabled for pid: %d", pid) + klog.InfoS("CPUAccounting not enabled for process", "pid", pid) } if systemd != memory { - klog.Warningf("MemoryAccounting not enabled for pid: %d", pid) + klog.InfoS("MemoryAccounting not enabled for process", "pid", pid) } return systemd, nil } @@ -983,14 +1029,13 @@ func ensureSystemCgroups(rootCgroupPath string, manager cgroups.Manager) error { pids = append(pids, pid) } - klog.Infof("Found %d PIDs in root, %d of them are not to be moved", len(allPids), len(allPids)-len(pids)) // Check if we have moved all the non-kernel PIDs. if len(pids) == 0 { return nil } - klog.Infof("Moving non-kernel processes: %v", pids) + klog.InfoS("Moving non-kernel processes", "pids", pids) for _, pid := range pids { err := manager.Apply(pid) if err != nil { @@ -1025,13 +1070,21 @@ func (cm *containerManagerImpl) GetDevicePluginResourceCapacity() (v1.ResourceLi } func (cm *containerManagerImpl) GetDevices(podUID, containerName string) []*podresourcesapi.ContainerDevices { - return cm.deviceManager.GetDevices(podUID, containerName) + return containerDevicesFromResourceDeviceInstances(cm.deviceManager.GetDevices(podUID, containerName)) +} + +func (cm *containerManagerImpl) GetAllocatableDevices() []*podresourcesapi.ContainerDevices { + return containerDevicesFromResourceDeviceInstances(cm.deviceManager.GetAllocatableDevices()) } func (cm *containerManagerImpl) GetCPUs(podUID, containerName string) []int64 { return cm.cpuManager.GetCPUs(podUID, containerName).ToSliceNoSortInt64() } +func (cm *containerManagerImpl) GetAllocatableCPUs() []int64 { + return cm.cpuManager.GetAllocatableCPUs().ToSliceNoSortInt64() +} + func (cm *containerManagerImpl) ShouldResetExtendedResourceCapacity() bool { return cm.deviceManager.ShouldResetExtendedResourceCapacity() } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/container_manager_stub.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/container_manager_stub.go index 65eac7aadcfa..615803387a7b 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/container_manager_stub.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/container_manager_stub.go @@ -24,6 +24,7 @@ import ( internalapi "k8s.io/cri-api/pkg/apis" podresourcesapi "k8s.io/kubelet/pkg/apis/podresources/v1" "k8s.io/kubernetes/pkg/kubelet/cm/cpumanager" + "k8s.io/kubernetes/pkg/kubelet/cm/memorymanager" "k8s.io/kubernetes/pkg/kubelet/cm/topologymanager" "k8s.io/kubernetes/pkg/kubelet/config" kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" @@ -40,7 +41,7 @@ type containerManagerStub struct { var _ ContainerManager = &containerManagerStub{} func (cm *containerManagerStub) Start(_ *v1.Node, _ ActivePodsFunc, _ config.SourcesReady, _ status.PodStatusProvider, _ internalapi.RuntimeService) error { - klog.V(2).Infof("Starting stub container manager") + klog.V(2).InfoS("Starting stub container manager") return nil } @@ -102,7 +103,7 @@ func (cm *containerManagerStub) UpdatePluginResources(*schedulerframework.NodeIn } func (cm *containerManagerStub) InternalContainerLifecycle() InternalContainerLifecycle { - return &internalContainerLifecycleImpl{cpumanager.NewFakeManager(), topologymanager.NewFakeManager()} + return &internalContainerLifecycleImpl{cpumanager.NewFakeManager(), memorymanager.NewFakeManager(), topologymanager.NewFakeManager()} } func (cm *containerManagerStub) GetPodCgroupRoot() string { @@ -113,6 +114,10 @@ func (cm *containerManagerStub) GetDevices(_, _ string) []*podresourcesapi.Conta return nil } +func (cm *containerManagerStub) GetAllocatableDevices() []*podresourcesapi.ContainerDevices { + return nil +} + func (cm *containerManagerStub) ShouldResetExtendedResourceCapacity() bool { return cm.shouldResetExtendedResourceCapacity } @@ -129,6 +134,10 @@ func (cm *containerManagerStub) GetCPUs(_, _ string) []int64 { return nil } +func (cm *containerManagerStub) GetAllocatableCPUs() []int64 { + return nil +} + func NewStubContainerManager() ContainerManager { return &containerManagerStub{shouldResetExtendedResourceCapacity: false} } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/container_manager_windows.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/container_manager_windows.go index e6637b4d4439..3b1cf9430efc 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/container_manager_windows.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/container_manager_windows.go @@ -36,6 +36,8 @@ import ( kubefeatures "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/pkg/kubelet/cadvisor" "k8s.io/kubernetes/pkg/kubelet/cm/cpumanager" + "k8s.io/kubernetes/pkg/kubelet/cm/devicemanager" + "k8s.io/kubernetes/pkg/kubelet/cm/memorymanager" "k8s.io/kubernetes/pkg/kubelet/cm/topologymanager" "k8s.io/kubernetes/pkg/kubelet/config" kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" @@ -52,6 +54,10 @@ type containerManagerImpl struct { cadvisorInterface cadvisor.Interface // Config of this node. nodeConfig NodeConfig + // Interface for exporting and allocating devices reported by device plugins. + deviceManager devicemanager.Manager + // Interface for Topology resource co-ordination + topologyManager topologymanager.Manager } type noopWindowsResourceAllocator struct{} @@ -67,7 +73,7 @@ func (cm *containerManagerImpl) Start(node *v1.Node, sourcesReady config.SourcesReady, podStatusProvider status.PodStatusProvider, runtimeService internalapi.RuntimeService) error { - klog.V(2).Infof("Starting Windows container manager") + klog.V(2).InfoS("Starting Windows container manager") if utilfeature.DefaultFeatureGate.Enabled(kubefeatures.LocalStorageCapacityIsolation) { rootfs, err := cm.cadvisorInterface.RootFsInfo() @@ -79,6 +85,11 @@ func (cm *containerManagerImpl) Start(node *v1.Node, } } + // Starts device manager. + if err := cm.deviceManager.Start(devicemanager.ActivePodsFunc(activePods), sourcesReady); err != nil { + return err + } + return nil } @@ -93,11 +104,26 @@ func NewContainerManager(mountUtil mount.Interface, cadvisorInterface cadvisor.I } capacity := cadvisor.CapacityFromMachineInfo(machineInfo) - return &containerManagerImpl{ + cm := &containerManagerImpl{ capacity: capacity, nodeConfig: nodeConfig, cadvisorInterface: cadvisorInterface, - }, nil + } + + cm.topologyManager = topologymanager.NewFakeManager() + + klog.InfoS("Creating device plugin manager", "devicePluginEnabled", devicePluginEnabled) + if devicePluginEnabled { + cm.deviceManager, err = devicemanager.NewManagerImpl(nil, cm.topologyManager) + cm.topologyManager.AddHintProvider(cm.deviceManager) + } else { + cm.deviceManager, err = devicemanager.NewManagerStub() + } + if err != nil { + return nil, err + } + + return cm, nil } func (cm *containerManagerImpl) SystemCgroupsLimit() v1.ResourceList { @@ -150,11 +176,11 @@ func (cm *containerManagerImpl) GetCapacity() v1.ResourceList { } func (cm *containerManagerImpl) GetPluginRegistrationHandler() cache.PluginHandler { - return nil + return cm.deviceManager.GetWatcherHandler() } func (cm *containerManagerImpl) GetDevicePluginResourceCapacity() (v1.ResourceList, v1.ResourceList, []string) { - return nil, nil, []string{} + return cm.deviceManager.GetCapacity() } func (cm *containerManagerImpl) NewPodContainerManager() PodContainerManager { @@ -162,27 +188,44 @@ func (cm *containerManagerImpl) NewPodContainerManager() PodContainerManager { } func (cm *containerManagerImpl) GetResources(pod *v1.Pod, container *v1.Container) (*kubecontainer.RunContainerOptions, error) { - return &kubecontainer.RunContainerOptions{}, nil + opts := &kubecontainer.RunContainerOptions{} + // Allocate should already be called during predicateAdmitHandler.Admit(), + // just try to fetch device runtime information from cached state here + devOpts, err := cm.deviceManager.GetDeviceRunContainerOptions(pod, container) + if err != nil { + return nil, err + } else if devOpts == nil { + return opts, nil + } + opts.Devices = append(opts.Devices, devOpts.Devices...) + opts.Mounts = append(opts.Mounts, devOpts.Mounts...) + opts.Envs = append(opts.Envs, devOpts.Envs...) + opts.Annotations = append(opts.Annotations, devOpts.Annotations...) + return opts, nil } -func (cm *containerManagerImpl) UpdatePluginResources(*schedulerframework.NodeInfo, *lifecycle.PodAdmitAttributes) error { - return nil +func (cm *containerManagerImpl) UpdatePluginResources(node *schedulerframework.NodeInfo, attrs *lifecycle.PodAdmitAttributes) error { + return cm.deviceManager.UpdatePluginResources(node, attrs) } func (cm *containerManagerImpl) InternalContainerLifecycle() InternalContainerLifecycle { - return &internalContainerLifecycleImpl{cpumanager.NewFakeManager(), topologymanager.NewFakeManager()} + return &internalContainerLifecycleImpl{cpumanager.NewFakeManager(), memorymanager.NewFakeManager(), topologymanager.NewFakeManager()} } func (cm *containerManagerImpl) GetPodCgroupRoot() string { return "" } -func (cm *containerManagerImpl) GetDevices(_, _ string) []*podresourcesapi.ContainerDevices { +func (cm *containerManagerImpl) GetDevices(podUID, containerName string) []*podresourcesapi.ContainerDevices { + return containerDevicesFromResourceDeviceInstances(cm.deviceManager.GetDevices(podUID, containerName)) +} + +func (cm *containerManagerImpl) GetAllocatableDevices() []*podresourcesapi.ContainerDevices { return nil } func (cm *containerManagerImpl) ShouldResetExtendedResourceCapacity() bool { - return false + return cm.deviceManager.ShouldResetExtendedResourceCapacity() } func (cm *containerManagerImpl) GetAllocateResourcesPodAdmitHandler() lifecycle.PodAdmitHandler { @@ -196,3 +239,7 @@ func (cm *containerManagerImpl) UpdateAllocatedDevices() { func (cm *containerManagerImpl) GetCPUs(_, _ string) []int64 { return nil } + +func (cm *containerManagerImpl) GetAllocatableCPUs() []int64 { + return nil +} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/containermap/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/containermap/BUILD deleted file mode 100644 index 5260916cf67c..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/containermap/BUILD +++ /dev/null @@ -1,28 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["container_map.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/cm/containermap", - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["container_map_test.go"], - embed = [":go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/BUILD deleted file mode 100644 index 71dba254bd72..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/BUILD +++ /dev/null @@ -1,78 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "cpu_assignment.go", - "cpu_manager.go", - "fake_cpu_manager.go", - "policy.go", - "policy_none.go", - "policy_static.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/cm/cpumanager", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/core/v1/helper/qos:go_default_library", - "//pkg/kubelet/cm/containermap:go_default_library", - "//pkg/kubelet/cm/cpumanager/state:go_default_library", - "//pkg/kubelet/cm/cpumanager/topology:go_default_library", - "//pkg/kubelet/cm/cpuset:go_default_library", - "//pkg/kubelet/cm/topologymanager:go_default_library", - "//pkg/kubelet/cm/topologymanager/bitmask:go_default_library", - "//pkg/kubelet/config:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/status:go_default_library", - "//pkg/kubelet/util/format:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/cri-api/pkg/apis/runtime/v1alpha2:go_default_library", - "//vendor/github.com/google/cadvisor/info/v1:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "cpu_assignment_test.go", - "cpu_manager_test.go", - "policy_none_test.go", - "policy_static_test.go", - "policy_test.go", - "topology_hints_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/cm/containermap:go_default_library", - "//pkg/kubelet/cm/cpumanager/state:go_default_library", - "//pkg/kubelet/cm/cpumanager/topology:go_default_library", - "//pkg/kubelet/cm/cpuset:go_default_library", - "//pkg/kubelet/cm/topologymanager:go_default_library", - "//pkg/kubelet/cm/topologymanager/bitmask:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/cri-api/pkg/apis/runtime/v1alpha2:go_default_library", - "//vendor/github.com/google/cadvisor/info/v1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/kubelet/cm/cpumanager/state:all-srcs", - "//pkg/kubelet/cm/cpumanager/topology:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/OWNERS b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/OWNERS index 951ab1b6383b..72b536f87c74 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/OWNERS +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/OWNERS @@ -4,6 +4,8 @@ approvers: - derekwaynecarr - vishh - ConnorDoyle -- balajismaniam reviewers: - klueska + +emeritus_approvers: +- balajismaniam diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/cpu_assignment.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/cpu_assignment.go index f646f80811a2..cb4b9807529f 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/cpu_assignment.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/cpu_assignment.go @@ -160,7 +160,7 @@ func takeByTopology(topo *topology.CPUTopology, availableCPUs cpuset.CPUSet, num // least a socket's-worth of CPUs. if acc.needs(acc.topo.CPUsPerSocket()) { for _, s := range acc.freeSockets() { - klog.V(4).Infof("[cpumanager] takeByTopology: claiming socket [%d]", s) + klog.V(4).InfoS("takeByTopology: claiming socket", "socket", s) acc.take(acc.details.CPUsInSockets(s)) if acc.isSatisfied() { return acc.result, nil @@ -175,7 +175,7 @@ func takeByTopology(topo *topology.CPUTopology, availableCPUs cpuset.CPUSet, num // a core's-worth of CPUs. if acc.needs(acc.topo.CPUsPerCore()) { for _, c := range acc.freeCores() { - klog.V(4).Infof("[cpumanager] takeByTopology: claiming core [%d]", c) + klog.V(4).InfoS("takeByTopology: claiming core", "core", c) acc.take(acc.details.CPUsInCores(c)) if acc.isSatisfied() { return acc.result, nil @@ -190,7 +190,7 @@ func takeByTopology(topo *topology.CPUTopology, availableCPUs cpuset.CPUSet, num // on the same sockets as the whole cores we have already taken in this // allocation. for _, c := range acc.freeCPUs() { - klog.V(4).Infof("[cpumanager] takeByTopology: claiming CPU [%d]", c) + klog.V(4).InfoS("takeByTopology: claiming CPU", "cpu", c) if acc.needs(1) { acc.take(cpuset.NewCPUSet(c)) } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/cpu_manager.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/cpu_manager.go index b4a17eb2053d..2f394cd4658d 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/cpu_manager.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/cpu_manager.go @@ -35,6 +35,7 @@ import ( "k8s.io/kubernetes/pkg/kubelet/cm/topologymanager" "k8s.io/kubernetes/pkg/kubelet/config" kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" + "k8s.io/kubernetes/pkg/kubelet/managed" "k8s.io/kubernetes/pkg/kubelet/status" ) @@ -85,6 +86,9 @@ type Manager interface { // and is consulted to achieve NUMA aware resource alignment per Pod // among this and other resource controllers. GetPodTopologyHints(pod *v1.Pod) map[string][]topologymanager.TopologyHint + + // GetAllocatableCPUs returns the assignable (not allocated) CPUs + GetAllocatableCPUs() cpuset.CPUSet } type manager struct { @@ -124,6 +128,9 @@ type manager struct { // stateFileDirectory holds the directory where the state file for checkpoints is held. stateFileDirectory string + + // allocatableCPUs is the set of online CPUs as reported by the system + allocatableCPUs cpuset.CPUSet } var _ Manager = &manager{} @@ -149,7 +156,8 @@ func NewManager(cpuPolicyName string, reconcilePeriod time.Duration, machineInfo if err != nil { return nil, err } - klog.Infof("[cpumanager] detected CPU topology: %v", topo) + klog.InfoS("Detected CPU topology", "topology", topo) + reservedCPUs, ok := nodeAllocatableReservation[v1.ResourceCPU] if !ok { // The static policy cannot initialize without this information. @@ -189,8 +197,8 @@ func NewManager(cpuPolicyName string, reconcilePeriod time.Duration, machineInfo } func (m *manager) Start(activePods ActivePodsFunc, sourcesReady config.SourcesReady, podStatusProvider status.PodStatusProvider, containerRuntime runtimeService, initialContainers containermap.ContainerMap) error { - klog.Infof("[cpumanager] starting with %s policy", m.policy.Name()) - klog.Infof("[cpumanager] reconciling every %v", m.reconcilePeriod) + klog.InfoS("Starting CPU manager", "policy", m.policy.Name()) + klog.InfoS("Reconciling", "reconcilePeriod", m.reconcilePeriod) m.sourcesReady = sourcesReady m.activePods = activePods m.podStatusProvider = podStatusProvider @@ -199,17 +207,19 @@ func (m *manager) Start(activePods ActivePodsFunc, sourcesReady config.SourcesRe stateImpl, err := state.NewCheckpointState(m.stateFileDirectory, cpuManagerStateFileName, m.policy.Name(), m.containerMap) if err != nil { - klog.Errorf("[cpumanager] could not initialize checkpoint manager: %v, please drain node and remove policy state file", err) + klog.ErrorS(err, "Could not initialize checkpoint manager, please drain node and remove policy state file") return err } m.state = stateImpl err = m.policy.Start(m.state) if err != nil { - klog.Errorf("[cpumanager] policy start error: %v", err) + klog.ErrorS(err, "Policy start error") return err } + m.allocatableCPUs = m.policy.GetAllocatableCPUs(m.state) + if m.policy.Name() == string(PolicyNone) { return nil } @@ -229,7 +239,7 @@ func (m *manager) Allocate(p *v1.Pod, c *v1.Container) error { // Call down into the policy to assign this container CPUs if required. err := m.policy.Allocate(m.state, p, c) if err != nil { - klog.Errorf("[cpumanager] Allocate error: %v", err) + klog.ErrorS(err, "Allocate error") return err } @@ -248,7 +258,7 @@ func (m *manager) RemoveContainer(containerID string) error { err := m.policyRemoveContainerByID(containerID) if err != nil { - klog.Errorf("[cpumanager] RemoveContainer error: %v", err) + klog.ErrorS(err, "RemoveContainer error") return err } @@ -296,6 +306,10 @@ func (m *manager) GetPodTopologyHints(pod *v1.Pod) map[string][]topologymanager. return m.policy.GetPodTopologyHints(m.state, pod) } +func (m *manager) GetAllocatableCPUs() cpuset.CPUSet { + return m.allocatableCPUs.Clone() +} + type reconciledContainer struct { podName string containerName string @@ -335,10 +349,10 @@ func (m *manager) removeStaleState() { for podUID := range assignments { for containerName := range assignments[podUID] { if _, ok := activeContainers[podUID][containerName]; !ok { - klog.Errorf("[cpumanager] removeStaleState: removing (pod %s, container: %s)", podUID, containerName) + klog.ErrorS(nil, "RemoveStaleState: removing container", "podUID", podUID, "containerName", containerName) err := m.policyRemoveContainerByRef(podUID, containerName) if err != nil { - klog.Errorf("[cpumanager] removeStaleState: failed to remove (pod %s, container %s), error: %v)", podUID, containerName, err) + klog.ErrorS(err, "RemoveStaleState: failed to remove container", "podUID", podUID, "containerName", containerName) } } } @@ -353,35 +367,40 @@ func (m *manager) reconcileState() (success []reconciledContainer, failure []rec for _, pod := range m.activePods() { pstatus, ok := m.podStatusProvider.GetPodStatus(pod.UID) if !ok { - klog.Warningf("[cpumanager] reconcileState: skipping pod; status not found (pod: %s)", pod.Name) + klog.InfoS("ReconcileState: skipping pod; status not found", "pod", klog.KObj(pod)) failure = append(failure, reconciledContainer{pod.Name, "", ""}) continue } + if enabled, _ := managed.IsPodManaged(pod); enabled { + klog.Warningf("[cpumanager] reconcileState: skipping pod; pod is managed (pod: %s)", pod.Name) + continue + } allContainers := pod.Spec.InitContainers allContainers = append(allContainers, pod.Spec.Containers...) for _, container := range allContainers { containerID, err := findContainerIDByName(&pstatus, container.Name) if err != nil { - klog.Warningf("[cpumanager] reconcileState: skipping container; ID not found in pod status (pod: %s, container: %s, error: %v)", pod.Name, container.Name, err) + klog.InfoS("ReconcileState: skipping container; ID not found in pod status", "pod", klog.KObj(pod), "containerName", container.Name, "err", err) failure = append(failure, reconciledContainer{pod.Name, container.Name, ""}) continue } cstatus, err := findContainerStatusByName(&pstatus, container.Name) if err != nil { - klog.Warningf("[cpumanager] reconcileState: skipping container; container status not found in pod status (pod: %s, container: %s, error: %v)", pod.Name, container.Name, err) + klog.InfoS("ReconcileState: skipping container; container status not found in pod status", "pod", klog.KObj(pod), "containerName", container.Name, "err", err) failure = append(failure, reconciledContainer{pod.Name, container.Name, ""}) continue } if cstatus.State.Waiting != nil || (cstatus.State.Waiting == nil && cstatus.State.Running == nil && cstatus.State.Terminated == nil) { - klog.Warningf("[cpumanager] reconcileState: skipping container; container still in the waiting state (pod: %s, container: %s, error: %v)", pod.Name, container.Name, err) + klog.InfoS("ReconcileState: skipping container; container still in the waiting state", "pod", klog.KObj(pod), "containerName", container.Name, "err", err) failure = append(failure, reconciledContainer{pod.Name, container.Name, ""}) continue } + m.Lock() if cstatus.State.Terminated != nil { // The container is terminated but we can't call m.RemoveContainer() // here because it could remove the allocated cpuset for the container @@ -390,8 +409,9 @@ func (m *manager) reconcileState() (success []reconciledContainer, failure []rec // was allocated. _, _, err := m.containerMap.GetContainerRef(containerID) if err == nil { - klog.Warningf("[cpumanager] reconcileState: ignoring terminated container (pod: %s, container id: %s)", pod.Name, containerID) + klog.InfoS("ReconcileState: ignoring terminated container", "pod", klog.KObj(pod), "containerID", containerID) } + m.Unlock() continue } @@ -399,19 +419,20 @@ func (m *manager) reconcileState() (success []reconciledContainer, failure []rec // Idempotently add it to the containerMap incase it is missing. // This can happen after a kubelet restart, for example. m.containerMap.Add(string(pod.UID), container.Name, containerID) + m.Unlock() cset := m.state.GetCPUSetOrDefault(string(pod.UID), container.Name) if cset.IsEmpty() { // NOTE: This should not happen outside of tests. - klog.Infof("[cpumanager] reconcileState: skipping container; assigned cpuset is empty (pod: %s, container: %s)", pod.Name, container.Name) + klog.InfoS("ReconcileState: skipping container; assigned cpuset is empty", "pod", klog.KObj(pod), "containerName", container.Name) failure = append(failure, reconciledContainer{pod.Name, container.Name, containerID}) continue } - klog.V(4).Infof("[cpumanager] reconcileState: updating container (pod: %s, container: %s, container id: %s, cpuset: \"%v\")", pod.Name, container.Name, containerID, cset) + klog.V(4).InfoS("ReconcileState: updating container", "pod", klog.KObj(pod), "containerName", container.Name, "containerID", containerID, "cpuSet", cset) err = m.updateContainerCPUSet(containerID, cset) if err != nil { - klog.Errorf("[cpumanager] reconcileState: failed to update container (pod: %s, container: %s, container id: %s, cpuset: \"%v\", error: %v)", pod.Name, container.Name, containerID, cset, err) + klog.ErrorS(err, "ReconcileState: failed to update container", "pod", klog.KObj(pod), "containerName", container.Name, "containerID", containerID, "cpuSet", cset) failure = append(failure, reconciledContainer{pod.Name, container.Name, containerID}) continue } @@ -438,9 +459,9 @@ func findContainerIDByName(status *v1.PodStatus, name string) (string, error) { } func findContainerStatusByName(status *v1.PodStatus, name string) (*v1.ContainerStatus, error) { - for _, status := range append(status.InitContainerStatuses, status.ContainerStatuses...) { - if status.Name == name { - return &status, nil + for _, containerStatus := range append(status.InitContainerStatuses, status.ContainerStatuses...) { + if containerStatus.Name == name { + return &containerStatus, nil } } return nil, fmt.Errorf("unable to find status for container with name %v in pod status (it may not be running)", name) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/fake_cpu_manager.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/fake_cpu_manager.go index 478534b1c1c0..2c38b52b3748 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/fake_cpu_manager.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/fake_cpu_manager.go @@ -32,36 +32,36 @@ type fakeManager struct { } func (m *fakeManager) Start(activePods ActivePodsFunc, sourcesReady config.SourcesReady, podStatusProvider status.PodStatusProvider, containerRuntime runtimeService, initialContainers containermap.ContainerMap) error { - klog.Info("[fake cpumanager] Start()") + klog.InfoS("Start()") return nil } func (m *fakeManager) Policy() Policy { - klog.Info("[fake cpumanager] Policy()") + klog.InfoS("Policy()") return NewNonePolicy() } func (m *fakeManager) Allocate(pod *v1.Pod, container *v1.Container) error { - klog.Infof("[fake cpumanager] Allocate (pod: %s, container: %s", pod.Name, container.Name) + klog.InfoS("Allocate", "pod", klog.KObj(pod), "containerName", container.Name) return nil } func (m *fakeManager) AddContainer(pod *v1.Pod, container *v1.Container, containerID string) { - klog.Infof("[fake cpumanager] AddContainer (pod: %s, container: %s, container id: %s)", pod.Name, container.Name, containerID) + klog.InfoS("AddContainer", "pod", klog.KObj(pod), "containerName", container.Name, "containerID", containerID) } func (m *fakeManager) RemoveContainer(containerID string) error { - klog.Infof("[fake cpumanager] RemoveContainer (container id: %s)", containerID) + klog.InfoS("RemoveContainer", "containerID", containerID) return nil } func (m *fakeManager) GetTopologyHints(pod *v1.Pod, container *v1.Container) map[string][]topologymanager.TopologyHint { - klog.Infof("[fake cpumanager] Get Container Topology Hints") + klog.InfoS("Get container topology hints") return map[string][]topologymanager.TopologyHint{} } func (m *fakeManager) GetPodTopologyHints(pod *v1.Pod) map[string][]topologymanager.TopologyHint { - klog.Infof("[fake cpumanager] Get Pod Topology Hints") + klog.InfoS("Get pod topology hints") return map[string][]topologymanager.TopologyHint{} } @@ -70,7 +70,12 @@ func (m *fakeManager) State() state.Reader { } func (m *fakeManager) GetCPUs(podUID, containerName string) cpuset.CPUSet { - klog.Infof("[fake cpumanager] GetCPUs(podUID: %s, containerName: %s)", podUID, containerName) + klog.InfoS("GetCPUs", "podUID", podUID, "containerName", containerName) + return cpuset.CPUSet{} +} + +func (m *fakeManager) GetAllocatableCPUs() cpuset.CPUSet { + klog.InfoS("Get Allocatable CPUs") return cpuset.CPUSet{} } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/policy.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/policy.go index 54565e5023c0..dd5d977a1201 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/policy.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/policy.go @@ -19,6 +19,7 @@ package cpumanager import ( "k8s.io/api/core/v1" "k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/state" + "k8s.io/kubernetes/pkg/kubelet/cm/cpuset" "k8s.io/kubernetes/pkg/kubelet/cm/topologymanager" ) @@ -38,4 +39,6 @@ type Policy interface { // and is consulted to achieve NUMA aware resource alignment per Pod // among this and other resource controllers. GetPodTopologyHints(s state.State, pod *v1.Pod) map[string][]topologymanager.TopologyHint + // GetAllocatableCPUs returns the assignable (not allocated) CPUs + GetAllocatableCPUs(m state.State) cpuset.CPUSet } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/policy_none.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/policy_none.go index abc1c0632b14..345d4c14d6d1 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/policy_none.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/policy_none.go @@ -20,6 +20,7 @@ import ( "k8s.io/api/core/v1" "k8s.io/klog/v2" "k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/state" + "k8s.io/kubernetes/pkg/kubelet/cm/cpuset" "k8s.io/kubernetes/pkg/kubelet/cm/topologymanager" ) @@ -30,7 +31,7 @@ var _ Policy = &nonePolicy{} // PolicyNone name of none policy const PolicyNone policyName = "none" -// NewNonePolicy returns a cupset manager policy that does nothing +// NewNonePolicy returns a cpuset manager policy that does nothing func NewNonePolicy() Policy { return &nonePolicy{} } @@ -40,7 +41,7 @@ func (p *nonePolicy) Name() string { } func (p *nonePolicy) Start(s state.State) error { - klog.Info("[cpumanager] none policy: Start") + klog.InfoS("None policy: Start") return nil } @@ -59,3 +60,12 @@ func (p *nonePolicy) GetTopologyHints(s state.State, pod *v1.Pod, container *v1. func (p *nonePolicy) GetPodTopologyHints(s state.State, pod *v1.Pod) map[string][]topologymanager.TopologyHint { return nil } + +// Assignable CPUs are the ones that can be exclusively allocated to pods that meet the exclusivity requirement +// (ie guaranteed QoS class and integral CPU request). +// Assignability of CPUs as a concept is only applicable in case of static policy i.e. scenarios where workloads +// CAN get exclusive access to core(s). +// Hence, we return empty set here: no cpus are assignable according to above definition with this policy. +func (p *nonePolicy) GetAllocatableCPUs(m state.State) cpuset.CPUSet { + return cpuset.NewCPUSet() +} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/policy_static.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/policy_static.go index c3309ef72805..ec25a15a3c22 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/policy_static.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/policy_static.go @@ -27,7 +27,6 @@ import ( "k8s.io/kubernetes/pkg/kubelet/cm/cpuset" "k8s.io/kubernetes/pkg/kubelet/cm/topologymanager" "k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/bitmask" - "k8s.io/kubernetes/pkg/kubelet/util/format" ) // PolicyStatic is the name of the static policy @@ -107,7 +106,7 @@ func NewStaticPolicy(topology *topology.CPUTopology, numReservedCPUs int, reserv return nil, err } - klog.Infof("[cpumanager] reserved %d CPUs (\"%s\") not available for exclusive assignment", reserved.Size(), reserved) + klog.InfoS("Reserved CPUs not available for exclusive assignment", "reservedSize", reserved.Size(), "reserved", reserved) return &staticPolicy{ topology: topology, @@ -123,7 +122,7 @@ func (p *staticPolicy) Name() string { func (p *staticPolicy) Start(s state.State) error { if err := p.validateState(s); err != nil { - klog.Errorf("[cpumanager] static policy invalid state: %v, please drain node and remove policy state file", err) + klog.ErrorS(err, "Static policy invalid state, please drain node and remove policy state file") return err } return nil @@ -187,8 +186,8 @@ func (p *staticPolicy) validateState(s state.State) error { return nil } -// assignableCPUs returns the set of unassigned CPUs minus the reserved set. -func (p *staticPolicy) assignableCPUs(s state.State) cpuset.CPUSet { +// GetAllocatableCPUs returns the set of unassigned CPUs minus the reserved set. +func (p *staticPolicy) GetAllocatableCPUs(s state.State) cpuset.CPUSet { return s.GetDefaultCPUSet().Difference(p.reserved) } @@ -218,23 +217,23 @@ func (p *staticPolicy) updateCPUsToReuse(pod *v1.Pod, container *v1.Container, c func (p *staticPolicy) Allocate(s state.State, pod *v1.Pod, container *v1.Container) error { if numCPUs := p.guaranteedCPUs(pod, container); numCPUs != 0 { - klog.Infof("[cpumanager] static policy: Allocate (pod: %s, container: %s)", format.Pod(pod), container.Name) + klog.InfoS("Static policy: Allocate", "pod", klog.KObj(pod), "containerName", container.Name) // container belongs in an exclusively allocated pool if cpuset, ok := s.GetCPUSet(string(pod.UID), container.Name); ok { p.updateCPUsToReuse(pod, container, cpuset) - klog.Infof("[cpumanager] static policy: container already present in state, skipping (pod: %s, container: %s)", format.Pod(pod), container.Name) + klog.InfoS("Static policy: container already present in state, skipping", "pod", klog.KObj(pod), "containerName", container.Name) return nil } // Call Topology Manager to get the aligned socket affinity across all hint providers. hint := p.affinity.GetAffinity(string(pod.UID), container.Name) - klog.Infof("[cpumanager] Pod %v, Container %v Topology Affinity is: %v", format.Pod(pod), container.Name, hint) + klog.InfoS("Topology Affinity", "pod", klog.KObj(pod), "containerName", container.Name, "affinity", hint) // Allocate CPUs according to the NUMA affinity contained in the hint. cpuset, err := p.allocateCPUs(s, numCPUs, hint.NUMANodeAffinity, p.cpusToReuse[string(pod.UID)]) if err != nil { - klog.Errorf("[cpumanager] unable to allocate %d CPUs (pod: %s, container: %s, error: %v)", numCPUs, format.Pod(pod), container.Name, err) + klog.ErrorS(err, "Unable to allocate CPUs", "pod", klog.KObj(pod), "containerName", container.Name, "numCPUs", numCPUs) return err } s.SetCPUSet(string(pod.UID), container.Name, cpuset) @@ -246,7 +245,7 @@ func (p *staticPolicy) Allocate(s state.State, pod *v1.Pod, container *v1.Contai } func (p *staticPolicy) RemoveContainer(s state.State, podUID string, containerName string) error { - klog.Infof("[cpumanager] static policy: RemoveContainer (pod: %s, container: %s)", podUID, containerName) + klog.InfoS("Static policy: RemoveContainer", "podUID", podUID, "containerName", containerName) if toRelease, ok := s.GetCPUSet(podUID, containerName); ok { s.Delete(podUID, containerName) // Mutate the shared pool, adding released cpus. @@ -256,16 +255,16 @@ func (p *staticPolicy) RemoveContainer(s state.State, podUID string, containerNa } func (p *staticPolicy) allocateCPUs(s state.State, numCPUs int, numaAffinity bitmask.BitMask, reusableCPUs cpuset.CPUSet) (cpuset.CPUSet, error) { - klog.Infof("[cpumanager] allocateCpus: (numCPUs: %d, socket: %v)", numCPUs, numaAffinity) + klog.InfoS("AllocateCPUs", "numCPUs", numCPUs, "socket", numaAffinity) - assignableCPUs := p.assignableCPUs(s).Union(reusableCPUs) + allocatableCPUs := p.GetAllocatableCPUs(s).Union(reusableCPUs) // If there are aligned CPUs in numaAffinity, attempt to take those first. result := cpuset.NewCPUSet() if numaAffinity != nil { alignedCPUs := cpuset.NewCPUSet() for _, numaNodeID := range numaAffinity.GetBits() { - alignedCPUs = alignedCPUs.Union(assignableCPUs.Intersection(p.topology.CPUDetails.CPUsInNUMANodes(numaNodeID))) + alignedCPUs = alignedCPUs.Union(allocatableCPUs.Intersection(p.topology.CPUDetails.CPUsInNUMANodes(numaNodeID))) } numAlignedToAlloc := alignedCPUs.Size() @@ -282,7 +281,7 @@ func (p *staticPolicy) allocateCPUs(s state.State, numCPUs int, numaAffinity bit } // Get any remaining CPUs from what's leftover after attempting to grab aligned ones. - remainingCPUs, err := takeByTopology(p.topology, assignableCPUs.Difference(result), numCPUs-result.Size()) + remainingCPUs, err := takeByTopology(p.topology, allocatableCPUs.Difference(result), numCPUs-result.Size()) if err != nil { return cpuset.NewCPUSet(), err } @@ -291,7 +290,7 @@ func (p *staticPolicy) allocateCPUs(s state.State, numCPUs int, numaAffinity bit // Remove allocated CPUs from the shared CPUSet. s.SetDefaultCPUSet(s.GetDefaultCPUSet().Difference(result)) - klog.Infof("[cpumanager] allocateCPUs: returning \"%v\"", result) + klog.InfoS("AllocateCPUs", "result", result) return result, nil } @@ -353,7 +352,7 @@ func (p *staticPolicy) GetTopologyHints(s state.State, pod *v1.Pod, container *v // kubelet restart, for example. if allocated, exists := s.GetCPUSet(string(pod.UID), container.Name); exists { if allocated.Size() != requested { - klog.Errorf("[cpumanager] CPUs already allocated to (pod %v, container %v) with different number than request: requested: %d, allocated: %d", format.Pod(pod), container.Name, requested, allocated.Size()) + klog.ErrorS(nil, "CPUs already allocated to container with different number than request", "pod", klog.KObj(pod), "containerName", container.Name, "requestedSize", requested, "allocatedSize", allocated.Size()) // An empty list of hints will be treated as a preference that cannot be satisfied. // In definition of hints this is equal to: TopologyHint[NUMANodeAffinity: nil, Preferred: false]. // For all but the best-effort policy, the Topology Manager will throw a pod-admission error. @@ -361,14 +360,14 @@ func (p *staticPolicy) GetTopologyHints(s state.State, pod *v1.Pod, container *v string(v1.ResourceCPU): {}, } } - klog.Infof("[cpumanager] Regenerating TopologyHints for CPUs already allocated to (pod %v, container %v)", format.Pod(pod), container.Name) + klog.InfoS("Regenerating TopologyHints for CPUs already allocated", "pod", klog.KObj(pod), "containerName", container.Name) return map[string][]topologymanager.TopologyHint{ string(v1.ResourceCPU): p.generateCPUTopologyHints(allocated, cpuset.CPUSet{}, requested), } } // Get a list of available CPUs. - available := p.assignableCPUs(s) + available := p.GetAllocatableCPUs(s) // Get a list of reusable CPUs (e.g. CPUs reused from initContainers). // It should be an empty CPUSet for a newly created pod. @@ -376,7 +375,7 @@ func (p *staticPolicy) GetTopologyHints(s state.State, pod *v1.Pod, container *v // Generate hints. cpuHints := p.generateCPUTopologyHints(available, reusable, requested) - klog.Infof("[cpumanager] TopologyHints generated for pod '%v', container '%v': %v", format.Pod(pod), container.Name, cpuHints) + klog.InfoS("TopologyHints generated", "pod", klog.KObj(pod), "containerName", container.Name, "cpuHints", cpuHints) return map[string][]topologymanager.TopologyHint{ string(v1.ResourceCPU): cpuHints, @@ -403,7 +402,7 @@ func (p *staticPolicy) GetPodTopologyHints(s state.State, pod *v1.Pod) map[strin // kubelet restart, for example. if allocated, exists := s.GetCPUSet(string(pod.UID), container.Name); exists { if allocated.Size() != requestedByContainer { - klog.Errorf("[cpumanager] CPUs already allocated to (pod %v, container %v) with different number than request: requested: %d, allocated: %d", format.Pod(pod), container.Name, requestedByContainer, allocated.Size()) + klog.ErrorS(nil, "CPUs already allocated to container with different number than request", "pod", klog.KObj(pod), "containerName", container.Name, "allocatedSize", requested, "requestedByContainer", requestedByContainer, "allocatedSize", allocated.Size()) // An empty list of hints will be treated as a preference that cannot be satisfied. // In definition of hints this is equal to: TopologyHint[NUMANodeAffinity: nil, Preferred: false]. // For all but the best-effort policy, the Topology Manager will throw a pod-admission error. @@ -416,14 +415,14 @@ func (p *staticPolicy) GetPodTopologyHints(s state.State, pod *v1.Pod) map[strin } } if assignedCPUs.Size() == requested { - klog.Infof("[cpumanager] Regenerating TopologyHints for CPUs already allocated to pod %v", format.Pod(pod)) + klog.InfoS("Regenerating TopologyHints for CPUs already allocated", "pod", klog.KObj(pod)) return map[string][]topologymanager.TopologyHint{ string(v1.ResourceCPU): p.generateCPUTopologyHints(assignedCPUs, cpuset.CPUSet{}, requested), } } // Get a list of available CPUs. - available := p.assignableCPUs(s) + available := p.GetAllocatableCPUs(s) // Get a list of reusable CPUs (e.g. CPUs reused from initContainers). // It should be an empty CPUSet for a newly created pod. @@ -434,7 +433,7 @@ func (p *staticPolicy) GetPodTopologyHints(s state.State, pod *v1.Pod) map[strin // Generate hints. cpuHints := p.generateCPUTopologyHints(available, reusable, requested) - klog.Infof("[cpumanager] TopologyHints generated for pod '%v' : %v", format.Pod(pod), cpuHints) + klog.InfoS("TopologyHints generated", "pod", klog.KObj(pod), "cpuHints", cpuHints) return map[string][]topologymanager.TopologyHint{ string(v1.ResourceCPU): cpuHints, diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/state/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/state/BUILD deleted file mode 100644 index f2f271a4889f..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/state/BUILD +++ /dev/null @@ -1,51 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "checkpoint.go", - "state.go", - "state_checkpoint.go", - "state_mem.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/state", - visibility = ["//visibility:public"], - deps = [ - "//pkg/kubelet/checkpointmanager:go_default_library", - "//pkg/kubelet/checkpointmanager/checksum:go_default_library", - "//pkg/kubelet/checkpointmanager/errors:go_default_library", - "//pkg/kubelet/cm/containermap:go_default_library", - "//pkg/kubelet/cm/cpuset:go_default_library", - "//vendor/github.com/davecgh/go-spew/spew:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["state_checkpoint_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/checkpointmanager:go_default_library", - "//pkg/kubelet/cm/containermap:go_default_library", - "//pkg/kubelet/cm/cpumanager/state/testing:go_default_library", - "//pkg/kubelet/cm/cpuset:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/kubelet/cm/cpumanager/state/testing:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/state/state_checkpoint.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/state/state_checkpoint.go index 951f9da7f929..f501c2bea302 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/state/state_checkpoint.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/state/state_checkpoint.go @@ -133,8 +133,8 @@ func (sc *stateCheckpoint) restoreState() error { sc.cache.SetDefaultCPUSet(tmpDefaultCPUSet) sc.cache.SetCPUAssignments(tmpAssignments) - klog.V(2).Info("[cpumanager] state checkpoint: restored state from checkpoint") - klog.V(2).Infof("[cpumanager] state checkpoint: defaultCPUSet: %s", tmpDefaultCPUSet.String()) + klog.V(2).InfoS("State checkpoint: restored state from checkpoint") + klog.V(2).InfoS("State checkpoint: defaultCPUSet", "defaultCpuSet", tmpDefaultCPUSet.String()) return nil } @@ -155,7 +155,7 @@ func (sc *stateCheckpoint) storeState() error { err := sc.checkpointManager.CreateCheckpoint(sc.checkpointName, checkpoint) if err != nil { - klog.Errorf("[cpumanager] could not save checkpoint: %v", err) + klog.ErrorS(err, "Failed to save checkpoint") return err } return nil @@ -201,7 +201,7 @@ func (sc *stateCheckpoint) SetCPUSet(podUID string, containerName string, cset c sc.cache.SetCPUSet(podUID, containerName, cset) err := sc.storeState() if err != nil { - klog.Warningf("store state to checkpoint error: %v", err) + klog.InfoS("Store state to checkpoint error", "err", err) } } @@ -212,7 +212,7 @@ func (sc *stateCheckpoint) SetDefaultCPUSet(cset cpuset.CPUSet) { sc.cache.SetDefaultCPUSet(cset) err := sc.storeState() if err != nil { - klog.Warningf("store state to checkpoint error: %v", err) + klog.InfoS("Store state to checkpoint error", "err", err) } } @@ -223,7 +223,7 @@ func (sc *stateCheckpoint) SetCPUAssignments(a ContainerCPUAssignments) { sc.cache.SetCPUAssignments(a) err := sc.storeState() if err != nil { - klog.Warningf("store state to checkpoint error: %v", err) + klog.InfoS("Store state to checkpoint error", "err", err) } } @@ -234,7 +234,7 @@ func (sc *stateCheckpoint) Delete(podUID string, containerName string) { sc.cache.Delete(podUID, containerName) err := sc.storeState() if err != nil { - klog.Warningf("store state to checkpoint error: %v", err) + klog.InfoS("Store state to checkpoint error", "err", err) } } @@ -245,6 +245,6 @@ func (sc *stateCheckpoint) ClearState() { sc.cache.ClearState() err := sc.storeState() if err != nil { - klog.Warningf("store state to checkpoint error: %v", err) + klog.InfoS("Store state to checkpoint error", "err", err) } } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/state/state_mem.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/state/state_mem.go index 894a6ccccfca..f51423f18674 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/state/state_mem.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/state/state_mem.go @@ -33,7 +33,7 @@ var _ State = &stateMemory{} // NewMemoryState creates new State for keeping track of cpu/pod assignment func NewMemoryState() State { - klog.Infof("[cpumanager] initializing new in-memory state store") + klog.InfoS("Initialized new in-memory state store") return &stateMemory{ assignments: ContainerCPUAssignments{}, defaultCPUSet: cpuset.NewCPUSet(), @@ -77,7 +77,7 @@ func (s *stateMemory) SetCPUSet(podUID string, containerName string, cset cpuset } s.assignments[podUID][containerName] = cset - klog.Infof("[cpumanager] updated desired cpuset (pod: %s, container: %s, cpuset: \"%s\")", podUID, containerName, cset) + klog.InfoS("Updated desired CPUSet", "podUID", podUID, "containerName", containerName, "cpuSet", cset) } func (s *stateMemory) SetDefaultCPUSet(cset cpuset.CPUSet) { @@ -85,7 +85,7 @@ func (s *stateMemory) SetDefaultCPUSet(cset cpuset.CPUSet) { defer s.Unlock() s.defaultCPUSet = cset - klog.Infof("[cpumanager] updated default cpuset: \"%s\"", cset) + klog.InfoS("Updated default CPUSet", "cpuSet", cset) } func (s *stateMemory) SetCPUAssignments(a ContainerCPUAssignments) { @@ -93,7 +93,7 @@ func (s *stateMemory) SetCPUAssignments(a ContainerCPUAssignments) { defer s.Unlock() s.assignments = a.Clone() - klog.Infof("[cpumanager] updated cpuset assignments: \"%v\"", a) + klog.InfoS("Updated CPUSet assignments", "assignments", a) } func (s *stateMemory) Delete(podUID string, containerName string) { @@ -104,7 +104,7 @@ func (s *stateMemory) Delete(podUID string, containerName string) { if len(s.assignments[podUID]) == 0 { delete(s.assignments, podUID) } - klog.V(2).Infof("[cpumanager] deleted cpuset assignment (pod: %s, container: %s)", podUID, containerName) + klog.V(2).InfoS("Deleted CPUSet assignment", "podUID", podUID, "containerName", containerName) } func (s *stateMemory) ClearState() { @@ -113,5 +113,5 @@ func (s *stateMemory) ClearState() { s.defaultCPUSet = cpuset.CPUSet{} s.assignments = make(ContainerCPUAssignments) - klog.V(2).Infof("[cpumanager] cleared state") + klog.V(2).InfoS("Cleared state") } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/topology/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/topology/BUILD deleted file mode 100644 index bd387ad1d3f8..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/topology/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "topology.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/topology", - visibility = ["//visibility:public"], - deps = [ - "//pkg/kubelet/cm/cpuset:go_default_library", - "//vendor/github.com/google/cadvisor/info/v1:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["topology_test.go"], - embed = [":go_default_library"], - deps = ["//vendor/github.com/google/cadvisor/info/v1:go_default_library"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/topology/topology.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/topology/topology.go index ac7330010704..b397165d97e6 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/topology/topology.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/topology/topology.go @@ -236,8 +236,7 @@ func Discover(machineInfo *cadvisorapi.MachineInfo) (*CPUTopology, error) { } } } else { - klog.Errorf("could not get unique coreID for socket: %d core %d threads: %v", - core.SocketID, core.Id, core.Threads) + klog.ErrorS(nil, "Could not get unique coreID for socket", "socket", core.SocketID, "core", core.Id, "threads", core.Threads) return nil, err } } @@ -245,7 +244,7 @@ func Discover(machineInfo *cadvisorapi.MachineInfo) (*CPUTopology, error) { return &CPUTopology{ NumCPUs: machineInfo.NumCores, - NumSockets: len(machineInfo.Topology), + NumSockets: machineInfo.NumSockets, NumCores: numPhysicalCores, CPUDetails: CPUDetails, }, nil diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpuset/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpuset/BUILD deleted file mode 100644 index d2e3ef73fe47..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpuset/BUILD +++ /dev/null @@ -1,29 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["cpuset.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/cm/cpuset", - visibility = ["//visibility:public"], - deps = ["//vendor/k8s.io/klog/v2:go_default_library"], -) - -go_test( - name = "go_default_test", - srcs = ["cpuset_test.go"], - embed = [":go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpuset/cpuset.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpuset/cpuset.go index ad7ea27afa43..de72ba257569 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpuset/cpuset.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpuset/cpuset.go @@ -19,6 +19,7 @@ package cpuset import ( "bytes" "fmt" + "os" "reflect" "sort" "strconv" @@ -75,6 +76,15 @@ func NewCPUSet(cpus ...int) CPUSet { return b.Result() } +// NewCPUSet returns a new CPUSet containing the supplied elements, as slice of int64. +func NewCPUSetInt64(cpus ...int64) CPUSet { + b := NewBuilder() + for _, c := range cpus { + b.Add(int(c)) + } + return b.Result() +} + // Size returns the number of elements in this set. func (s CPUSet) Size() int { return len(s.elems) @@ -269,7 +279,8 @@ func (s CPUSet) String() string { func MustParse(s string) CPUSet { res, err := Parse(s) if err != nil { - klog.Fatalf("unable to parse [%s] as CPUSet: %v", s, err) + klog.ErrorS(err, "Failed to parse input as CPUSet", "input", s) + os.Exit(1) } return res } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/BUILD deleted file mode 100644 index e9392f133459..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/BUILD +++ /dev/null @@ -1,95 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "device_plugin_stub.go", - "endpoint.go", - "manager.go", - "manager_stub.go", - "pod_devices.go", - "topology_hints.go", - "types.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/cm/devicemanager", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/core/v1/helper:go_default_library", - "//pkg/features:go_default_library", - "//pkg/kubelet/checkpointmanager:go_default_library", - "//pkg/kubelet/checkpointmanager/errors:go_default_library", - "//pkg/kubelet/cm/devicemanager/checkpoint:go_default_library", - "//pkg/kubelet/cm/topologymanager:go_default_library", - "//pkg/kubelet/cm/topologymanager/bitmask:go_default_library", - "//pkg/kubelet/config:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/lifecycle:go_default_library", - "//pkg/kubelet/metrics:go_default_library", - "//pkg/kubelet/pluginmanager/cache:go_default_library", - "//pkg/kubelet/util/format:go_default_library", - "//pkg/scheduler/framework:go_default_library", - "//pkg/util/selinux:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/kubelet/pkg/apis/deviceplugin/v1beta1:go_default_library", - "//staging/src/k8s.io/kubelet/pkg/apis/pluginregistration/v1:go_default_library", - "//staging/src/k8s.io/kubelet/pkg/apis/podresources/v1:go_default_library", - "//vendor/github.com/google/cadvisor/info/v1:go_default_library", - "//vendor/google.golang.org/grpc:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "endpoint_test.go", - "manager_test.go", - "pod_devices_test.go", - "topology_hints_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/checkpointmanager:go_default_library", - "//pkg/kubelet/cm/devicemanager/checkpoint:go_default_library", - "//pkg/kubelet/cm/topologymanager:go_default_library", - "//pkg/kubelet/cm/topologymanager/bitmask:go_default_library", - "//pkg/kubelet/config:go_default_library", - "//pkg/kubelet/lifecycle:go_default_library", - "//pkg/kubelet/pluginmanager:go_default_library", - "//pkg/scheduler/framework:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/kubelet/pkg/apis/deviceplugin/v1beta1:go_default_library", - "//staging/src/k8s.io/kubelet/pkg/apis/pluginregistration/v1:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/kubelet/cm/devicemanager/checkpoint:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/checkpoint/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/checkpoint/BUILD deleted file mode 100644 index afdace3db4fd..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/checkpoint/BUILD +++ /dev/null @@ -1,27 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["checkpoint.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/checkpoint", - visibility = ["//visibility:public"], - deps = [ - "//pkg/kubelet/checkpointmanager:go_default_library", - "//pkg/kubelet/checkpointmanager/checksum:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/device_plugin_stub.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/device_plugin_stub.go index b4c6be04ded9..ef1ca4569e65 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/device_plugin_stub.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/device_plugin_stub.go @@ -139,8 +139,7 @@ func (m *Stub) Start() error { return lastDialErr } - klog.Infof("Starting to serve on %v", m.socket) - + klog.InfoS("Starting to serve on socket", "socket", m.socket) return nil } @@ -161,7 +160,7 @@ func (m *Stub) Stop() error { // GetInfo is the RPC which return pluginInfo func (m *Stub) GetInfo(ctx context.Context, req *watcherapi.InfoRequest) (*watcherapi.PluginInfo, error) { - klog.Info("GetInfo") + klog.InfoS("GetInfo") return &watcherapi.PluginInfo{ Type: watcherapi.DevicePlugin, Name: m.resourceName, @@ -175,7 +174,7 @@ func (m *Stub) NotifyRegistrationStatus(ctx context.Context, status *watcherapi. m.registrationStatus <- *status } if !status.PluginRegistered { - klog.Infof("Registration failed: %v", status.Error) + klog.InfoS("Registration failed", "err", status.Error) } return &watcherapi.RegistrationStatusResponse{}, nil } @@ -184,11 +183,11 @@ func (m *Stub) NotifyRegistrationStatus(ctx context.Context, status *watcherapi. func (m *Stub) Register(kubeletEndpoint, resourceName string, pluginSockDir string) error { if pluginSockDir != "" { if _, err := os.Stat(pluginSockDir + "DEPRECATION"); err == nil { - klog.Info("Deprecation file found. Skip registration.") + klog.InfoS("Deprecation file found. Skip registration") return nil } } - klog.Info("Deprecation file not found. Invoke registration") + klog.InfoS("Deprecation file not found. Invoke registration") ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() @@ -229,13 +228,13 @@ func (m *Stub) GetDevicePluginOptions(ctx context.Context, e *pluginapi.Empty) ( // PreStartContainer resets the devices received func (m *Stub) PreStartContainer(ctx context.Context, r *pluginapi.PreStartContainerRequest) (*pluginapi.PreStartContainerResponse, error) { - klog.Infof("PreStartContainer, %+v", r) + klog.InfoS("PreStartContainer", "request", r) return &pluginapi.PreStartContainerResponse{}, nil } // ListAndWatch lists devices and update that list according to the Update call func (m *Stub) ListAndWatch(e *pluginapi.Empty, s pluginapi.DevicePlugin_ListAndWatchServer) error { - klog.Info("ListAndWatch") + klog.InfoS("ListAndWatch") s.Send(&pluginapi.ListAndWatchResponse{Devices: m.devs}) @@ -256,7 +255,7 @@ func (m *Stub) Update(devs []*pluginapi.Device) { // GetPreferredAllocation gets the preferred allocation from a set of available devices func (m *Stub) GetPreferredAllocation(ctx context.Context, r *pluginapi.PreferredAllocationRequest) (*pluginapi.PreferredAllocationResponse, error) { - klog.Infof("GetPreferredAllocation, %+v", r) + klog.InfoS("GetPreferredAllocation", "request", r) devs := make(map[string]pluginapi.Device) @@ -269,7 +268,7 @@ func (m *Stub) GetPreferredAllocation(ctx context.Context, r *pluginapi.Preferre // Allocate does a mock allocation func (m *Stub) Allocate(ctx context.Context, r *pluginapi.AllocateRequest) (*pluginapi.AllocateResponse, error) { - klog.Infof("Allocate, %+v", r) + klog.InfoS("Allocate", "request", r) devs := make(map[string]pluginapi.Device) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/endpoint.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/endpoint.go index eaef0df39aab..9ce1df284eb0 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/endpoint.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/endpoint.go @@ -60,7 +60,7 @@ type endpointImpl struct { func newEndpointImpl(socketPath, resourceName string, callback monitorCallback) (*endpointImpl, error) { client, c, err := dial(socketPath) if err != nil { - klog.Errorf("Can't create new endpoint with path %s err %v", socketPath, err) + klog.ErrorS(err, "Can't create new endpoint with socket path", "path", socketPath) return nil, err } @@ -96,7 +96,7 @@ func (e *endpointImpl) callback(resourceName string, devices []pluginapi.Device) func (e *endpointImpl) run() { stream, err := e.client.ListAndWatch(context.Background(), &pluginapi.Empty{}) if err != nil { - klog.Errorf(errListAndWatch, e.resourceName, err) + klog.ErrorS(err, "listAndWatch ended unexpectedly for device plugin", "resourceName", e.resourceName) return } @@ -104,12 +104,12 @@ func (e *endpointImpl) run() { for { response, err := stream.Recv() if err != nil { - klog.Errorf(errListAndWatch, e.resourceName, err) + klog.ErrorS(err, "listAndWatch ended unexpectedly for device plugin", "resourceName", e.resourceName) return } devs := response.Devices - klog.V(2).Infof("State pushed for device plugin %s", e.resourceName) + klog.V(2).InfoS("State pushed for device plugin", "resourceName", e.resourceName) var newDevs []pluginapi.Device for _, d := range devs { diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/manager.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/manager.go index 95cf058f1a78..1708176fc9b4 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/manager.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/manager.go @@ -22,6 +22,7 @@ import ( "net" "os" "path/filepath" + "runtime" "sort" "sync" "time" @@ -36,7 +37,6 @@ import ( "k8s.io/apimachinery/pkg/util/sets" utilfeature "k8s.io/apiserver/pkg/util/feature" pluginapi "k8s.io/kubelet/pkg/apis/deviceplugin/v1beta1" - podresourcesapi "k8s.io/kubelet/pkg/apis/podresources/v1" v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper" "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/pkg/kubelet/checkpointmanager" @@ -47,7 +47,6 @@ import ( "k8s.io/kubernetes/pkg/kubelet/lifecycle" "k8s.io/kubernetes/pkg/kubelet/metrics" "k8s.io/kubernetes/pkg/kubelet/pluginmanager/cache" - "k8s.io/kubernetes/pkg/kubelet/util/format" schedulerframework "k8s.io/kubernetes/pkg/scheduler/framework" "k8s.io/kubernetes/pkg/util/selinux" ) @@ -84,8 +83,8 @@ type ManagerImpl struct { // e.g. a new device is advertised, two old devices are deleted and a running device fails. callback monitorCallback - // allDevices is a map by resource name of all the devices currently registered to the device manager - allDevices map[string]map[string]pluginapi.Device + // allDevices holds all the devices currently registered to the device manager + allDevices ResourceDeviceInstances // healthyDevices contains all of the registered healthy resourceNames and their exported device IDs. healthyDevices map[string]sets.String @@ -126,11 +125,15 @@ func (s *sourcesReadyStub) AllReady() bool { return true } // NewManagerImpl creates a new manager. func NewManagerImpl(topology []cadvisorapi.Node, topologyAffinityStore topologymanager.Store) (*ManagerImpl, error) { - return newManagerImpl(pluginapi.KubeletSocket, topology, topologyAffinityStore) + socketPath := pluginapi.KubeletSocket + if runtime.GOOS == "windows" { + socketPath = os.Getenv("SYSTEMDRIVE") + pluginapi.KubeletSocketWindows + } + return newManagerImpl(socketPath, topology, topologyAffinityStore) } func newManagerImpl(socketPath string, topology []cadvisorapi.Node, topologyAffinityStore topologymanager.Store) (*ManagerImpl, error) { - klog.V(2).Infof("Creating Device Plugin manager at %s", socketPath) + klog.V(2).InfoS("Creating Device Plugin manager", "path", socketPath) if socketPath == "" || !filepath.IsAbs(socketPath) { return nil, fmt.Errorf(errBadSocket+" %s", socketPath) @@ -147,7 +150,7 @@ func newManagerImpl(socketPath string, topology []cadvisorapi.Node, topologyAffi socketname: file, socketdir: dir, - allDevices: make(map[string]map[string]pluginapi.Device), + allDevices: NewResourceDeviceInstances(), healthyDevices: make(map[string]sets.String), unhealthyDevices: make(map[string]sets.String), allocatedDevices: make(map[string]sets.String), @@ -186,7 +189,7 @@ func (m *ManagerImpl) genericDeviceUpdateCallback(resourceName string, devices [ } m.mutex.Unlock() if err := m.writeCheckpoint(); err != nil { - klog.Errorf("writing checkpoint encountered %v", err) + klog.ErrorS(err, "Writing checkpoint encountered") } } @@ -206,9 +209,12 @@ func (m *ManagerImpl) removeContents(dir string) error { if filePath == m.checkpointFile() { continue } - stat, err := os.Stat(filePath) + // TODO: Until the bug - https://github.com/golang/go/issues/33357 is fixed, os.stat wouldn't return the + // right mode(socket) on windows. Hence deleting the file, without checking whether + // its a socket, on windows. + stat, err := os.Lstat(filePath) if err != nil { - klog.Errorf("Failed to stat file %s: %v", filePath, err) + klog.ErrorS(err, "Failed to stat file", "path", filePath) continue } if stat.IsDir() { @@ -217,7 +223,7 @@ func (m *ManagerImpl) removeContents(dir string) error { err = os.RemoveAll(filePath) if err != nil { errs = append(errs, err) - klog.Errorf("Failed to remove file %s: %v", filePath, err) + klog.ErrorS(err, "Failed to remove file", "path", filePath) continue } } @@ -233,7 +239,7 @@ func (m *ManagerImpl) checkpointFile() string { // podDevices and allocatedDevices information from checkpointed state and // starts device plugin registration service. func (m *ManagerImpl) Start(activePods ActivePodsFunc, sourcesReady config.SourcesReady) error { - klog.V(2).Infof("Starting Device Plugin manager") + klog.V(2).InfoS("Starting Device Plugin manager") m.activePods = activePods m.sourcesReady = sourcesReady @@ -241,7 +247,7 @@ func (m *ManagerImpl) Start(activePods ActivePodsFunc, sourcesReady config.Sourc // Loads in allocatedDevices information from disk. err := m.readCheckpoint() if err != nil { - klog.Warningf("Continue after failing to read checkpoint file. Device allocation info may NOT be up-to-date. Err: %v", err) + klog.InfoS("Continue after failing to read checkpoint file. Device allocation info may NOT be up-to-date", "err", err) } socketPath := filepath.Join(m.socketdir, m.socketname) @@ -250,19 +256,19 @@ func (m *ManagerImpl) Start(activePods ActivePodsFunc, sourcesReady config.Sourc } if selinux.SELinuxEnabled() { if err := selinux.SetFileLabel(m.socketdir, config.KubeletPluginsDirSELinuxLabel); err != nil { - klog.Warningf("Unprivileged containerized plugins might not work. Could not set selinux context on %s: %v", m.socketdir, err) + klog.InfoS("Unprivileged containerized plugins might not work. Could not set selinux context on socket dir", "path", m.socketdir, "err", err) } } // Removes all stale sockets in m.socketdir. Device plugins can monitor // this and use it as a signal to re-register with the new Kubelet. if err := m.removeContents(m.socketdir); err != nil { - klog.Errorf("Fail to clean up stale contents under %s: %v", m.socketdir, err) + klog.ErrorS(err, "Fail to clean up stale content under socket dir", "path", m.socketdir) } s, err := net.Listen("unix", socketPath) if err != nil { - klog.Errorf(errListenSocket+" %v", err) + klog.ErrorS(err, "Failed to listen to socket while starting device plugin registry") return err } @@ -275,7 +281,7 @@ func (m *ManagerImpl) Start(activePods ActivePodsFunc, sourcesReady config.Sourc m.server.Serve(s) }() - klog.V(2).Infof("Serving device plugin registration server on %q", socketPath) + klog.V(2).InfoS("Serving device plugin registration server on socket", "path", socketPath) return nil } @@ -283,10 +289,10 @@ func (m *ManagerImpl) Start(activePods ActivePodsFunc, sourcesReady config.Sourc // GetWatcherHandler returns the plugin handler func (m *ManagerImpl) GetWatcherHandler() cache.PluginHandler { if f, err := os.Create(m.socketdir + "DEPRECATION"); err != nil { - klog.Errorf("Failed to create deprecation file at %s", m.socketdir) + klog.ErrorS(err, "Failed to create deprecation file at socket dir", "path", m.socketdir) } else { f.Close() - klog.V(4).Infof("created deprecation file %s", f.Name()) + klog.V(4).InfoS("Created deprecation file", "path", f.Name()) } return cache.PluginHandler(m) @@ -294,7 +300,7 @@ func (m *ManagerImpl) GetWatcherHandler() cache.PluginHandler { // ValidatePlugin validates a plugin if the version is correct and the name has the format of an extended resource func (m *ManagerImpl) ValidatePlugin(pluginName string, endpoint string, versions []string) error { - klog.V(2).Infof("Got Plugin %s at endpoint %s with versions %v", pluginName, endpoint, versions) + klog.V(2).InfoS("Got Plugin at endpoint with versions", "plugin", pluginName, "endpoint", endpoint, "versions", versions) if !m.isVersionCompatibleWithPlugin(versions) { return fmt.Errorf("manager version, %s, is not among plugin supported versions %v", pluginapi.Version, versions) @@ -311,7 +317,7 @@ func (m *ManagerImpl) ValidatePlugin(pluginName string, endpoint string, version // TODO: Start the endpoint and wait for the First ListAndWatch call // before registering the plugin func (m *ManagerImpl) RegisterPlugin(pluginName string, endpoint string, versions []string) error { - klog.V(2).Infof("Registering Plugin %s at endpoint %s", pluginName, endpoint) + klog.V(2).InfoS("Registering plugin at endpoint", "plugin", pluginName, "endpoint", endpoint) e, err := newEndpointImpl(endpoint, pluginName, m.callback) if err != nil { @@ -405,7 +411,7 @@ func (m *ManagerImpl) UpdatePluginResources(node *schedulerframework.NodeInfo, a // Register registers a device plugin. func (m *ManagerImpl) Register(ctx context.Context, r *pluginapi.RegisterRequest) (*pluginapi.Empty, error) { - klog.Infof("Got registration request from device plugin with resource name %q", r.ResourceName) + klog.InfoS("Got registration request from device plugin with resource", "resourceName", r.ResourceName) metrics.DevicePluginRegistrationCount.WithLabelValues(r.ResourceName).Inc() var versionCompatible bool for _, v := range pluginapi.SupportedVersions { @@ -415,15 +421,15 @@ func (m *ManagerImpl) Register(ctx context.Context, r *pluginapi.RegisterRequest } } if !versionCompatible { - errorString := fmt.Sprintf(errUnsupportedVersion, r.Version, pluginapi.SupportedVersions) - klog.Infof("Bad registration request from device plugin with resource name %q: %s", r.ResourceName, errorString) - return &pluginapi.Empty{}, fmt.Errorf(errorString) + err := fmt.Errorf(errUnsupportedVersion, r.Version, pluginapi.SupportedVersions) + klog.InfoS("Bad registration request from device plugin with resource", "resourceName", r.ResourceName, "err", err) + return &pluginapi.Empty{}, err } if !v1helper.IsExtendedResourceName(v1.ResourceName(r.ResourceName)) { - errorString := fmt.Sprintf(errInvalidResourceName, r.ResourceName) - klog.Infof("Bad registration request from device plugin: %s", errorString) - return &pluginapi.Empty{}, fmt.Errorf(errorString) + err := fmt.Errorf(errInvalidResourceName, r.ResourceName) + klog.InfoS("Bad registration request from device plugin", "err", err) + return &pluginapi.Empty{}, err } // TODO: for now, always accepts newest device plugin. Later may consider to @@ -459,7 +465,7 @@ func (m *ManagerImpl) registerEndpoint(resourceName string, options *pluginapi.D defer m.mutex.Unlock() m.endpoints[resourceName] = endpointInfo{e: e, opts: options} - klog.V(2).Infof("Registered endpoint %v", e) + klog.V(2).InfoS("Registered endpoint", "endpoint", e) } func (m *ManagerImpl) runEndpoint(resourceName string, e endpoint) { @@ -473,13 +479,13 @@ func (m *ManagerImpl) runEndpoint(resourceName string, e endpoint) { m.markResourceUnhealthy(resourceName) } - klog.V(2).Infof("Endpoint (%s, %v) became unhealthy", resourceName, e) + klog.V(2).InfoS("Endpoint became unhealthy", "resourceName", resourceName, "endpoint", e) } func (m *ManagerImpl) addEndpoint(r *pluginapi.RegisterRequest) { new, err := newEndpointImpl(filepath.Join(m.socketdir, r.Endpoint), r.ResourceName, m.callback) if err != nil { - klog.Errorf("Failed to dial device plugin with request %v: %v", r, err) + klog.ErrorS(err, "Failed to dial device plugin with request", "request", r) return } m.registerEndpoint(r.ResourceName, r.Options, new) @@ -489,7 +495,7 @@ func (m *ManagerImpl) addEndpoint(r *pluginapi.RegisterRequest) { } func (m *ManagerImpl) markResourceUnhealthy(resourceName string) { - klog.V(2).Infof("Mark all resources Unhealthy for resource %s", resourceName) + klog.V(2).InfoS("Mark all resources Unhealthy for resource", "resourceName", resourceName) healthyDevices := sets.NewString() if _, ok := m.healthyDevices[resourceName]; ok { healthyDevices = m.healthyDevices[resourceName] @@ -526,7 +532,7 @@ func (m *ManagerImpl) GetCapacity() (v1.ResourceList, v1.ResourceList, []string) // should always be consistent. Otherwise, we run with the risk // of failing to garbage collect non-existing resources or devices. if !ok { - klog.Errorf("unexpected: healthyDevices and endpoints are out of sync") + klog.ErrorS(nil, "Unexpected: healthyDevices and endpoints are out of sync") } delete(m.endpoints, resourceName) delete(m.healthyDevices, resourceName) @@ -541,7 +547,7 @@ func (m *ManagerImpl) GetCapacity() (v1.ResourceList, v1.ResourceList, []string) eI, ok := m.endpoints[resourceName] if (ok && eI.e.stopGracePeriodExpired()) || !ok { if !ok { - klog.Errorf("unexpected: unhealthyDevices and endpoints are out of sync") + klog.ErrorS(nil, "Unexpected: unhealthyDevices and endpoints are out of sync") } delete(m.endpoints, resourceName) delete(m.unhealthyDevices, resourceName) @@ -557,7 +563,7 @@ func (m *ManagerImpl) GetCapacity() (v1.ResourceList, v1.ResourceList, []string) m.mutex.Unlock() if needsUpdateCheckpoint { if err := m.writeCheckpoint(); err != nil { - klog.Errorf("writing checkpoint encountered %v", err) + klog.ErrorS(err, "Error on writing checkpoint") } } return capacity, allocatable, deletedResources.UnsortedList() @@ -576,7 +582,7 @@ func (m *ManagerImpl) writeCheckpoint() error { err := m.checkpointManager.CreateCheckpoint(kubeletDeviceManagerCheckpoint, data) if err != nil { err2 := fmt.Errorf("failed to write checkpoint file %q: %v", kubeletDeviceManagerCheckpoint, err) - klog.Warning(err2) + klog.InfoS("Failed to write checkpoint file", "err", err) return err2 } return nil @@ -591,7 +597,7 @@ func (m *ManagerImpl) readCheckpoint() error { err := m.checkpointManager.GetCheckpoint(kubeletDeviceManagerCheckpoint, cp) if err != nil { if err == errors.ErrCheckpointNotFound { - klog.Warningf("Failed to retrieve checkpoint for %q: %v", kubeletDeviceManagerCheckpoint, err) + klog.InfoS("Failed to retrieve checkpoint", "checkpoint", kubeletDeviceManagerCheckpoint, "err", err) return nil } return err @@ -626,7 +632,7 @@ func (m *ManagerImpl) UpdateAllocatedDevices() { if len(podsToBeRemoved) <= 0 { return } - klog.V(3).Infof("pods to be removed: %v", podsToBeRemoved.List()) + klog.V(3).InfoS("Pods to be removed", "podUIDs", podsToBeRemoved.List()) m.podDevices.delete(podsToBeRemoved.List()) // Regenerated allocatedDevices after we update pod allocation information. m.allocatedDevices = m.podDevices.devices() @@ -642,7 +648,7 @@ func (m *ManagerImpl) devicesToAllocate(podUID, contName, resource string, requi // This can happen if a container restarts for example. devices := m.podDevices.containerDevices(podUID, contName, resource) if devices != nil { - klog.V(3).Infof("Found pre-allocated devices for resource %s container %q in Pod %q: %v", resource, contName, string(podUID), devices.List()) + klog.V(3).InfoS("Found pre-allocated devices for resource on pod", "resourceName", resource, "containerName", contName, "podUID", string(podUID), "devices", devices.List()) needed = needed - devices.Len() // A pod's resource is not expected to change once admitted by the API server, // so just fail loudly here. We can revisit this part if this no longer holds. @@ -654,7 +660,7 @@ func (m *ManagerImpl) devicesToAllocate(podUID, contName, resource string, requi // No change, no work. return nil, nil } - klog.V(3).Infof("Needs to allocate %d %q for pod %q container %q", needed, resource, string(podUID), contName) + klog.V(3).InfoS("Need devices to allocate for pod", "deviceNumber", needed, "resourceName", resource, "podUID", string(podUID), "containerName", contName) // Check if resource registered with devicemanager if _, ok := m.healthyDevices[resource]; !ok { return nil, fmt.Errorf("can't allocate unregistered device %s", resource) @@ -839,7 +845,7 @@ func (m *ManagerImpl) allocateContainerResources(pod *v1.Pod, container *v1.Cont for k, v := range container.Resources.Limits { resource := string(k) needed := int(v.Value()) - klog.V(3).Infof("needs %d %s", needed, resource) + klog.V(3).InfoS("Looking for needed resources", "needed", needed, "resourceName", resource) if !m.isDevicePluginResource(resource) { continue } @@ -885,7 +891,7 @@ func (m *ManagerImpl) allocateContainerResources(pod *v1.Pod, container *v1.Cont devs := allocDevices.UnsortedList() // TODO: refactor this part of code to just append a ContainerAllocationRequest // in a passed in AllocateRequest pointer, and issues a single Allocate call per pod. - klog.V(3).Infof("Making allocation request for devices %v for device plugin %s", devs, resource) + klog.V(3).InfoS("Making allocation request for device plugin", "devices", devs, "resourceName", resource) resp, err := eI.e.allocate(devs) metrics.DevicePluginAllocationDuration.WithLabelValues(resource).Observe(metrics.SinceInSeconds(startRPCTime)) if err != nil { @@ -932,9 +938,9 @@ func (m *ManagerImpl) GetDeviceRunContainerOptions(pod *v1.Pod, container *v1.Co podUID := string(pod.UID) contName := container.Name needsReAllocate := false - for k := range container.Resources.Limits { + for k, v := range container.Resources.Limits { resource := string(k) - if !m.isDevicePluginResource(resource) { + if !m.isDevicePluginResource(resource) || v.Value() == 0 { continue } err := m.callPreStartContainerIfNeeded(podUID, contName, resource) @@ -949,7 +955,7 @@ func (m *ManagerImpl) GetDeviceRunContainerOptions(pod *v1.Pod, container *v1.Co } } if needsReAllocate { - klog.V(2).Infof("needs re-allocate device plugin resources for pod %s, container %s", format.Pod(pod), container.Name) + klog.V(2).InfoS("Needs to re-allocate device plugin resources for pod", "pod", klog.KObj(pod), "containerName", container.Name) if err := m.Allocate(pod, container); err != nil { return nil, err } @@ -969,7 +975,7 @@ func (m *ManagerImpl) callPreStartContainerIfNeeded(podUID, contName, resource s if eI.opts == nil || !eI.opts.PreStartRequired { m.mutex.Unlock() - klog.V(4).Infof("Plugin options indicate to skip PreStartContainer for resource: %s", resource) + klog.V(4).InfoS("Plugin options indicate to skip PreStartContainer for resource", "resourceName", resource) return nil } @@ -981,7 +987,7 @@ func (m *ManagerImpl) callPreStartContainerIfNeeded(podUID, contName, resource s m.mutex.Unlock() devs := devices.UnsortedList() - klog.V(4).Infof("Issuing an PreStartContainer call for container, %s, of pod %s", contName, string(podUID)) + klog.V(4).InfoS("Issuing a PreStartContainer call for container", "containerName", contName, "podUID", string(podUID)) _, err := eI.e.preStartContainer(devs) if err != nil { return fmt.Errorf("device plugin PreStartContainer rpc failed with err: %v", err) @@ -999,12 +1005,12 @@ func (m *ManagerImpl) callGetPreferredAllocationIfAvailable(podUID, contName, re } if eI.opts == nil || !eI.opts.GetPreferredAllocationAvailable { - klog.V(4).Infof("Plugin options indicate to skip GetPreferredAllocation for resource: %s", resource) + klog.V(4).InfoS("Plugin options indicate to skip GetPreferredAllocation for resource", "resourceName", resource) return nil, nil } m.mutex.Unlock() - klog.V(4).Infof("Issuing a GetPreferredAllocation call for container, %s, of pod %s", contName, string(podUID)) + klog.V(4).InfoS("Issuing a GetPreferredAllocation call for container", "containerName", contName, "podUID", string(podUID)) resp, err := eI.e.getPreferredAllocation(available.UnsortedList(), mustInclude.UnsortedList(), size) m.mutex.Lock() if err != nil { @@ -1060,8 +1066,17 @@ func (m *ManagerImpl) isDevicePluginResource(resource string) bool { return false } +// GetAllocatableDevices returns information about all the devices known to the manager +func (m *ManagerImpl) GetAllocatableDevices() ResourceDeviceInstances { + m.mutex.Lock() + resp := m.allDevices.Clone() + m.mutex.Unlock() + klog.V(4).InfoS("known devices", "numDevices", len(resp)) + return resp +} + // GetDevices returns the devices used by the specified container -func (m *ManagerImpl) GetDevices(podUID, containerName string) []*podresourcesapi.ContainerDevices { +func (m *ManagerImpl) GetDevices(podUID, containerName string) ResourceDeviceInstances { return m.podDevices.getContainerDevices(podUID, containerName) } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/manager_stub.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/manager_stub.go index ea04f5a16c02..e6874f88d8ad 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/manager_stub.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/manager_stub.go @@ -18,7 +18,6 @@ package devicemanager import ( v1 "k8s.io/api/core/v1" - podresourcesapi "k8s.io/kubelet/pkg/apis/podresources/v1" "k8s.io/kubernetes/pkg/kubelet/cm/topologymanager" "k8s.io/kubernetes/pkg/kubelet/config" "k8s.io/kubernetes/pkg/kubelet/lifecycle" @@ -80,7 +79,12 @@ func (h *ManagerStub) GetPodTopologyHints(pod *v1.Pod) map[string][]topologymana } // GetDevices returns nil -func (h *ManagerStub) GetDevices(_, _ string) []*podresourcesapi.ContainerDevices { +func (h *ManagerStub) GetDevices(_, _ string) ResourceDeviceInstances { + return nil +} + +// GetAllocatableDevices returns nothing +func (h *ManagerStub) GetAllocatableDevices() ResourceDeviceInstances { return nil } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/pod_devices.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/pod_devices.go index 8e20eb7bb7bd..b7bb2e2e8f12 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/pod_devices.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/pod_devices.go @@ -23,7 +23,6 @@ import ( "k8s.io/apimachinery/pkg/util/sets" pluginapi "k8s.io/kubelet/pkg/apis/deviceplugin/v1beta1" - podresourcesapi "k8s.io/kubelet/pkg/apis/podresources/v1" "k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/checkpoint" kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" ) @@ -187,13 +186,13 @@ func (pdev *podDevices) toCheckpointData() []checkpoint.PodDevicesEntry { for conName, resources := range containerDevices { for resource, devices := range resources { if devices.allocResp == nil { - klog.Errorf("Can't marshal allocResp for %v %v %v: allocation response is missing", podUID, conName, resource) + klog.ErrorS(nil, "Can't marshal allocResp, allocation response is missing", "podUID", podUID, "containerName", conName, "resourceName", resource) continue } allocResp, err := devices.allocResp.Marshal() if err != nil { - klog.Errorf("Can't marshal allocResp for %v %v %v: %v", podUID, conName, resource, err) + klog.ErrorS(err, "Can't marshal allocResp", "podUID", podUID, "containerName", conName, "resourceName", resource) continue } data = append(data, checkpoint.PodDevicesEntry{ @@ -211,12 +210,13 @@ func (pdev *podDevices) toCheckpointData() []checkpoint.PodDevicesEntry { // Populates podDevices from the passed in checkpointData. func (pdev *podDevices) fromCheckpointData(data []checkpoint.PodDevicesEntry) { for _, entry := range data { - klog.V(2).Infof("Get checkpoint entry: %v %v %v %v %v\n", - entry.PodUID, entry.ContainerName, entry.ResourceName, entry.DeviceIDs, entry.AllocResp) + klog.V(2).InfoS("Get checkpoint entry", + "podUID", entry.PodUID, "containerName", entry.ContainerName, + "resourceName", entry.ResourceName, "deviceIDs", entry.DeviceIDs, "allocated", entry.AllocResp) allocResp := &pluginapi.ContainerAllocateResponse{} err := allocResp.Unmarshal(entry.AllocResp) if err != nil { - klog.Errorf("Can't unmarshal allocResp for %v %v %v: %v", entry.PodUID, entry.ContainerName, entry.ResourceName, err) + klog.ErrorS(err, "Can't unmarshal allocResp", "podUID", entry.PodUID, "containerName", entry.ContainerName, "resourceName", entry.ResourceName) continue } pdev.insert(entry.PodUID, entry.ContainerName, entry.ResourceName, entry.DeviceIDs, allocResp) @@ -254,13 +254,13 @@ func (pdev *podDevices) deviceRunContainerOptions(podUID, contName string) *Devi // Updates RunContainerOptions.Envs. for k, v := range resp.Envs { if e, ok := envsMap[k]; ok { - klog.V(4).Infof("Skip existing env %s %s", k, v) + klog.V(4).InfoS("Skip existing env", "envKey", k, "envValue", v) if e != v { - klog.Errorf("Environment variable %s has conflicting setting: %s and %s", k, e, v) + klog.ErrorS(nil, "Environment variable has conflicting setting", "envKey", k, "expected", v, "got", e) } continue } - klog.V(4).Infof("Add env %s %s", k, v) + klog.V(4).InfoS("Add env", "envKey", k, "envValue", v) envsMap[k] = v opts.Envs = append(opts.Envs, kubecontainer.EnvVar{Name: k, Value: v}) } @@ -268,14 +268,14 @@ func (pdev *podDevices) deviceRunContainerOptions(podUID, contName string) *Devi // Updates RunContainerOptions.Devices. for _, dev := range resp.Devices { if d, ok := devsMap[dev.ContainerPath]; ok { - klog.V(4).Infof("Skip existing device %s %s", dev.ContainerPath, dev.HostPath) + klog.V(4).InfoS("Skip existing device", "containerPath", dev.ContainerPath, "hostPath", dev.HostPath) if d != dev.HostPath { - klog.Errorf("Container device %s has conflicting mapping host devices: %s and %s", - dev.ContainerPath, d, dev.HostPath) + klog.ErrorS(nil, "Container device has conflicting mapping host devices", + "containerPath", dev.ContainerPath, "got", d, "expected", dev.HostPath) } continue } - klog.V(4).Infof("Add device %s %s", dev.ContainerPath, dev.HostPath) + klog.V(4).InfoS("Add device", "containerPath", dev.ContainerPath, "hostPath", dev.HostPath) devsMap[dev.ContainerPath] = dev.HostPath opts.Devices = append(opts.Devices, kubecontainer.DeviceInfo{ PathOnHost: dev.HostPath, @@ -287,14 +287,14 @@ func (pdev *podDevices) deviceRunContainerOptions(podUID, contName string) *Devi // Updates RunContainerOptions.Mounts. for _, mount := range resp.Mounts { if m, ok := mountsMap[mount.ContainerPath]; ok { - klog.V(4).Infof("Skip existing mount %s %s", mount.ContainerPath, mount.HostPath) + klog.V(4).InfoS("Skip existing mount", "containerPath", mount.ContainerPath, "hostPath", mount.HostPath) if m != mount.HostPath { - klog.Errorf("Container mount %s has conflicting mapping host mounts: %s and %s", - mount.ContainerPath, m, mount.HostPath) + klog.ErrorS(nil, "Container mount has conflicting mapping host mounts", + "containerPath", mount.ContainerPath, "conflictingPath", m, "hostPath", mount.HostPath) } continue } - klog.V(4).Infof("Add mount %s %s", mount.ContainerPath, mount.HostPath) + klog.V(4).InfoS("Add mount", "containerPath", mount.ContainerPath, "hostPath", mount.HostPath) mountsMap[mount.ContainerPath] = mount.HostPath opts.Mounts = append(opts.Mounts, kubecontainer.Mount{ Name: mount.ContainerPath, @@ -309,13 +309,13 @@ func (pdev *podDevices) deviceRunContainerOptions(podUID, contName string) *Devi // Updates for Annotations for k, v := range resp.Annotations { if e, ok := annotationsMap[k]; ok { - klog.V(4).Infof("Skip existing annotation %s %s", k, v) + klog.V(4).InfoS("Skip existing annotation", "annotationKey", k, "annotationValue", v) if e != v { - klog.Errorf("Annotation %s has conflicting setting: %s and %s", k, e, v) + klog.ErrorS(nil, "Annotation has conflicting setting", "annotationKey", k, "expected", e, "got", v) } continue } - klog.V(4).Infof("Add annotation %s %s", k, v) + klog.V(4).InfoS("Add annotation", "annotationKey", k, "annotationValue", v) annotationsMap[k] = v opts.Annotations = append(opts.Annotations, kubecontainer.Annotation{Name: k, Value: v}) } @@ -324,7 +324,7 @@ func (pdev *podDevices) deviceRunContainerOptions(podUID, contName string) *Devi } // getContainerDevices returns the devices assigned to the provided container for all ResourceNames -func (pdev *podDevices) getContainerDevices(podUID, contName string) []*podresourcesapi.ContainerDevices { +func (pdev *podDevices) getContainerDevices(podUID, contName string) ResourceDeviceInstances { pdev.RLock() defer pdev.RUnlock() @@ -334,15 +334,51 @@ func (pdev *podDevices) getContainerDevices(podUID, contName string) []*podresou if _, contExists := pdev.devs[podUID][contName]; !contExists { return nil } - cDev := []*podresourcesapi.ContainerDevices{} + resDev := NewResourceDeviceInstances() for resource, allocateInfo := range pdev.devs[podUID][contName] { + if len(allocateInfo.deviceIds) == 0 { + continue + } + devicePluginMap := make(map[string]pluginapi.Device) for numaid, devlist := range allocateInfo.deviceIds { - cDev = append(cDev, &podresourcesapi.ContainerDevices{ - ResourceName: resource, - DeviceIds: devlist, - Topology: &podresourcesapi.TopologyInfo{Nodes: []*podresourcesapi.NUMANode{{ID: numaid}}}, - }) + for _, devId := range devlist { + NUMANodes := []*pluginapi.NUMANode{{ID: numaid}} + if pDev, ok := devicePluginMap[devId]; ok && pDev.Topology != nil { + if nodes := pDev.Topology.GetNodes(); nodes != nil { + NUMANodes = append(NUMANodes, nodes...) + } + } + + devicePluginMap[devId] = pluginapi.Device{ + // ID and Healthy are not relevant here. + Topology: &pluginapi.TopologyInfo{ + Nodes: NUMANodes, + }, + } + } + } + resDev[resource] = devicePluginMap + } + return resDev +} + +// DeviceInstances is a mapping device name -> plugin device data +type DeviceInstances map[string]pluginapi.Device + +// ResourceDeviceInstances is a mapping resource name -> DeviceInstances +type ResourceDeviceInstances map[string]DeviceInstances + +func NewResourceDeviceInstances() ResourceDeviceInstances { + return make(ResourceDeviceInstances) +} + +func (rdev ResourceDeviceInstances) Clone() ResourceDeviceInstances { + clone := NewResourceDeviceInstances() + for resourceName, resourceDevs := range rdev { + clone[resourceName] = make(map[string]pluginapi.Device) + for devID, dev := range resourceDevs { + clone[resourceName][devID] = dev } } - return cDev + return clone } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/topology_hints.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/topology_hints.go index 855f4763468c..32f26f139a8e 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/topology_hints.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/topology_hints.go @@ -23,7 +23,6 @@ import ( pluginapi "k8s.io/kubelet/pkg/apis/deviceplugin/v1beta1" "k8s.io/kubernetes/pkg/kubelet/cm/topologymanager" "k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/bitmask" - "k8s.io/kubernetes/pkg/kubelet/util/format" ) // GetTopologyHints implements the TopologyManager HintProvider Interface which @@ -43,7 +42,7 @@ func (m *ManagerImpl) GetTopologyHints(pod *v1.Pod, container *v1.Container) map if m.isDevicePluginResource(resource) { // Only consider devices that actually container topology information. if aligned := m.deviceHasTopologyAlignment(resource); !aligned { - klog.Infof("[devicemanager] Resource '%v' does not have a topology preference", resource) + klog.InfoS("Resource does not have a topology preference", "resource", resource) deviceHints[resource] = nil continue } @@ -54,11 +53,11 @@ func (m *ManagerImpl) GetTopologyHints(pod *v1.Pod, container *v1.Container) map allocated := m.podDevices.containerDevices(string(pod.UID), container.Name, resource) if allocated.Len() > 0 { if allocated.Len() != requested { - klog.Errorf("[devicemanager] Resource '%v' already allocated to (pod %v, container %v) with different number than request: requested: %d, allocated: %d", resource, format.Pod(pod), container.Name, requested, allocated.Len()) + klog.ErrorS(nil, "Resource already allocated to pod with different number than request", "resource", resource, "pod", klog.KObj(pod), "containerName", container.Name, "request", requested, "allocated", allocated.Len()) deviceHints[resource] = []topologymanager.TopologyHint{} continue } - klog.Infof("[devicemanager] Regenerating TopologyHints for resource '%v' already allocated to (pod %v, container %v)", resource, format.Pod(pod), container.Name) + klog.InfoS("Regenerating TopologyHints for resource already allocated to pod", "resource", resource, "pod", klog.KObj(pod), "containerName", container.Name) deviceHints[resource] = m.generateDeviceTopologyHints(resource, allocated, sets.String{}, requested) continue } @@ -67,7 +66,7 @@ func (m *ManagerImpl) GetTopologyHints(pod *v1.Pod, container *v1.Container) map available := m.getAvailableDevices(resource) reusable := m.devicesToReuse[string(pod.UID)][resource] if available.Union(reusable).Len() < requested { - klog.Errorf("[devicemanager] Unable to generate topology hints: requested number of devices unavailable for '%s': requested: %d, available: %d", resource, requested, available.Union(reusable).Len()) + klog.ErrorS(nil, "Unable to generate topology hints: requested number of devices unavailable", "resource", resource, "request", requested, "available", available.Union(reusable).Len()) deviceHints[resource] = []topologymanager.TopologyHint{} continue } @@ -93,7 +92,7 @@ func (m *ManagerImpl) GetPodTopologyHints(pod *v1.Pod) map[string][]topologymana for resource, requested := range accumulatedResourceRequests { // Only consider devices that actually contain topology information. if aligned := m.deviceHasTopologyAlignment(resource); !aligned { - klog.Infof("[devicemanager] Resource '%v' does not have a topology preference", resource) + klog.InfoS("Resource does not have a topology preference", "resource", resource) deviceHints[resource] = nil continue } @@ -104,11 +103,11 @@ func (m *ManagerImpl) GetPodTopologyHints(pod *v1.Pod) map[string][]topologymana allocated := m.podDevices.podDevices(string(pod.UID), resource) if allocated.Len() > 0 { if allocated.Len() != requested { - klog.Errorf("[devicemanager] Resource '%v' already allocated to (pod %v) with different number than request: requested: %d, allocated: %d", resource, format.Pod(pod), requested, allocated.Len()) + klog.ErrorS(nil, "Resource already allocated to pod with different number than request", "resource", resource, "pod", klog.KObj(pod), "request", requested, "allocated", allocated.Len()) deviceHints[resource] = []topologymanager.TopologyHint{} continue } - klog.Infof("[devicemanager] Regenerating TopologyHints for resource '%v' already allocated to (pod %v)", resource, format.Pod(pod)) + klog.InfoS("Regenerating TopologyHints for resource already allocated to pod", "resource", resource, "pod", klog.KObj(pod)) deviceHints[resource] = m.generateDeviceTopologyHints(resource, allocated, sets.String{}, requested) continue } @@ -116,7 +115,7 @@ func (m *ManagerImpl) GetPodTopologyHints(pod *v1.Pod) map[string][]topologymana // Get the list of available devices, for which TopologyHints should be generated. available := m.getAvailableDevices(resource) if available.Len() < requested { - klog.Errorf("[devicemanager] Unable to generate topology hints: requested number of devices unavailable for '%s': requested: %d, available: %d", resource, requested, available.Len()) + klog.ErrorS(nil, "Unable to generate topology hints: requested number of devices unavailable", "resource", resource, "request", requested, "available", available.Len()) deviceHints[resource] = []topologymanager.TopologyHint{} continue } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/types.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/types.go index 779d91e3df12..7b17ac4619d1 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/types.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/types.go @@ -20,7 +20,6 @@ import ( "time" v1 "k8s.io/api/core/v1" - podresourcesapi "k8s.io/kubelet/pkg/apis/podresources/v1" "k8s.io/kubernetes/pkg/kubelet/cm/topologymanager" "k8s.io/kubernetes/pkg/kubelet/config" kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" @@ -60,7 +59,10 @@ type Manager interface { GetWatcherHandler() cache.PluginHandler // GetDevices returns information about the devices assigned to pods and containers - GetDevices(podUID, containerName string) []*podresourcesapi.ContainerDevices + GetDevices(podUID, containerName string) ResourceDeviceInstances + + // GetAllocatableDevices returns information about all the devices known to the manager + GetAllocatableDevices() ResourceDeviceInstances // ShouldResetExtendedResourceCapacity returns whether the extended resources should be reset or not, // depending on the checkpoint file availability. Absence of the checkpoint file strongly indicates @@ -106,10 +108,6 @@ const ( errEndpointStopped = "endpoint %v has been stopped" // errBadSocket is the error raised when the registry socket path is not absolute errBadSocket = "bad socketPath, must be an absolute path:" - // errListenSocket is the error raised when the registry could not listen on the socket - errListenSocket = "failed to listen to socket while starting device plugin registry, with error" - // errListAndWatch is the error raised when ListAndWatch ended unsuccessfully - errListAndWatch = "listAndWatch ended unexpectedly for device plugin %s with error %v" ) // endpointStopGracePeriod indicates the grace period after an endpoint is stopped diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/fake_container_manager.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/fake_container_manager.go index eb01b1ab3f2f..a05b5fce114f 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/fake_container_manager.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/fake_container_manager.go @@ -25,6 +25,7 @@ import ( internalapi "k8s.io/cri-api/pkg/apis" podresourcesapi "k8s.io/kubelet/pkg/apis/podresources/v1" "k8s.io/kubernetes/pkg/kubelet/cm/cpumanager" + "k8s.io/kubernetes/pkg/kubelet/cm/memorymanager" "k8s.io/kubernetes/pkg/kubelet/cm/topologymanager" "k8s.io/kubernetes/pkg/kubelet/config" kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" @@ -156,7 +157,7 @@ func (cm *FakeContainerManager) InternalContainerLifecycle() InternalContainerLi cm.Lock() defer cm.Unlock() cm.CalledFunctions = append(cm.CalledFunctions, "InternalContainerLifecycle") - return &internalContainerLifecycleImpl{cpumanager.NewFakeManager(), topologymanager.NewFakeManager()} + return &internalContainerLifecycleImpl{cpumanager.NewFakeManager(), memorymanager.NewFakeManager(), topologymanager.NewFakeManager()} } func (cm *FakeContainerManager) GetPodCgroupRoot() string { @@ -173,6 +174,13 @@ func (cm *FakeContainerManager) GetDevices(_, _ string) []*podresourcesapi.Conta return nil } +func (cm *FakeContainerManager) GetAllocatableDevices() []*podresourcesapi.ContainerDevices { + cm.Lock() + defer cm.Unlock() + cm.CalledFunctions = append(cm.CalledFunctions, "GetAllocatableDevices") + return nil +} + func (cm *FakeContainerManager) ShouldResetExtendedResourceCapacity() bool { cm.Lock() defer cm.Unlock() @@ -200,3 +208,9 @@ func (cm *FakeContainerManager) GetCPUs(_, _ string) []int64 { cm.CalledFunctions = append(cm.CalledFunctions, "GetCPUs") return nil } + +func (cm *FakeContainerManager) GetAllocatableCPUs() []int64 { + cm.Lock() + defer cm.Unlock() + return nil +} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/helpers_linux.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/helpers_linux.go index 9b115ab53807..aa5c37639dc8 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/helpers_linux.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/helpers_linux.go @@ -202,8 +202,16 @@ func getCgroupSubsystemsV1() (*CgroupSubsystems, error) { } mountPoints := make(map[string]string, len(allCgroups)) for _, mount := range allCgroups { + // BEFORE kubelet used a random mount point per cgroups subsystem; + // NOW more deterministic: kubelet use mount point with shortest path; + // FUTURE is bright with clear expectation determined in doc. + // ref. issue: https://github.com/kubernetes/kubernetes/issues/95488 + for _, subsystem := range mount.Subsystems { - mountPoints[subsystem] = mount.Mountpoint + previous := mountPoints[subsystem] + if previous == "" || len(mount.Mountpoint) < len(previous) { + mountPoints[subsystem] = mount.Mountpoint + } } } return &CgroupSubsystems{ diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/internal_container_lifecycle.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/internal_container_lifecycle.go index 0635ea0ed4f4..278f13eb08e2 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/internal_container_lifecycle.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/internal_container_lifecycle.go @@ -22,6 +22,7 @@ import ( runtimeapi "k8s.io/cri-api/pkg/apis/runtime/v1alpha2" kubefeatures "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/pkg/kubelet/cm/cpumanager" + "k8s.io/kubernetes/pkg/kubelet/cm/memorymanager" "k8s.io/kubernetes/pkg/kubelet/cm/topologymanager" ) @@ -35,6 +36,7 @@ type InternalContainerLifecycle interface { // Implements InternalContainerLifecycle interface. type internalContainerLifecycleImpl struct { cpuManager cpumanager.Manager + memoryManager memorymanager.Manager topologyManager topologymanager.Manager } @@ -43,6 +45,10 @@ func (i *internalContainerLifecycleImpl) PreStartContainer(pod *v1.Pod, containe i.cpuManager.AddContainer(pod, container, containerID) } + if i.memoryManager != nil { + i.memoryManager.AddContainer(pod, container, containerID) + } + if utilfeature.DefaultFeatureGate.Enabled(kubefeatures.TopologyManager) { err := i.topologyManager.AddContainer(pod, containerID) if err != nil { diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/internal_container_lifecycle_linux.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/internal_container_lifecycle_linux.go index dd0a37f086a1..9cf41620b8c2 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/internal_container_lifecycle_linux.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/internal_container_lifecycle_linux.go @@ -19,6 +19,9 @@ limitations under the License. package cm import ( + "strconv" + "strings" + "k8s.io/api/core/v1" runtimeapi "k8s.io/cri-api/pkg/apis/runtime/v1alpha2" ) @@ -31,5 +34,16 @@ func (i *internalContainerLifecycleImpl) PreCreateContainer(pod *v1.Pod, contain } } + if i.memoryManager != nil { + numaNodes := i.memoryManager.GetMemoryNUMANodes(pod, container) + if numaNodes.Len() > 0 { + var affinity []string + for _, numaNode := range numaNodes.List() { + affinity = append(affinity, strconv.Itoa(numaNode)) + } + containerConfig.Linux.Resources.CpusetMems = strings.Join(affinity, ",") + } + } + return nil } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/memorymanager/fake_memory_manager.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/memorymanager/fake_memory_manager.go new file mode 100644 index 000000000000..2c0034cdff0d --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/memorymanager/fake_memory_manager.go @@ -0,0 +1,82 @@ +/* +Copyright 2020 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package memorymanager + +import ( + v1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/util/sets" + "k8s.io/klog/v2" + "k8s.io/kubernetes/pkg/kubelet/cm/containermap" + "k8s.io/kubernetes/pkg/kubelet/cm/memorymanager/state" + "k8s.io/kubernetes/pkg/kubelet/cm/topologymanager" + "k8s.io/kubernetes/pkg/kubelet/config" + "k8s.io/kubernetes/pkg/kubelet/status" +) + +type fakeManager struct { + state state.State +} + +func (m *fakeManager) Start(activePods ActivePodsFunc, sourcesReady config.SourcesReady, podStatusProvider status.PodStatusProvider, containerRuntime runtimeService, initialContainers containermap.ContainerMap) error { + klog.InfoS("Start()") + return nil +} + +func (m *fakeManager) Policy() Policy { + klog.InfoS("Policy()") + return NewPolicyNone() +} + +func (m *fakeManager) Allocate(pod *v1.Pod, container *v1.Container) error { + klog.InfoS("Allocate", "pod", klog.KObj(pod), "containerName", container.Name) + return nil +} + +func (m *fakeManager) AddContainer(pod *v1.Pod, container *v1.Container, containerID string) { + klog.InfoS("Add container", "pod", klog.KObj(pod), "containerName", container.Name, "containerID", containerID) +} + +func (m *fakeManager) GetMemoryNUMANodes(pod *v1.Pod, container *v1.Container) sets.Int { + klog.InfoS("Get MemoryNUMANodes", "pod", klog.KObj(pod), "containerName", container.Name) + return nil +} + +func (m *fakeManager) RemoveContainer(containerID string) error { + klog.InfoS("RemoveContainer", "containerID", containerID) + return nil +} + +func (m *fakeManager) GetTopologyHints(pod *v1.Pod, container *v1.Container) map[string][]topologymanager.TopologyHint { + klog.InfoS("Get Topology Hints") + return map[string][]topologymanager.TopologyHint{} +} + +func (m *fakeManager) GetPodTopologyHints(pod *v1.Pod) map[string][]topologymanager.TopologyHint { + klog.InfoS("Get Pod Topology Hints") + return map[string][]topologymanager.TopologyHint{} +} + +func (m *fakeManager) State() state.Reader { + return m.state +} + +// NewFakeManager creates empty/fake memory manager +func NewFakeManager() Manager { + return &fakeManager{ + state: state.NewMemoryState(), + } +} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/memorymanager/memory_manager.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/memorymanager/memory_manager.go new file mode 100644 index 000000000000..00e3d1ea3122 --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/memorymanager/memory_manager.go @@ -0,0 +1,409 @@ +/* +Copyright 2020 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package memorymanager + +import ( + "fmt" + "sync" + + cadvisorapi "github.com/google/cadvisor/info/v1" + + v1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" + "k8s.io/apimachinery/pkg/util/sets" + runtimeapi "k8s.io/cri-api/pkg/apis/runtime/v1alpha2" + "k8s.io/klog/v2" + corev1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper" + kubeletconfig "k8s.io/kubernetes/pkg/kubelet/apis/config" + "k8s.io/kubernetes/pkg/kubelet/cm/containermap" + "k8s.io/kubernetes/pkg/kubelet/cm/memorymanager/state" + "k8s.io/kubernetes/pkg/kubelet/cm/topologymanager" + "k8s.io/kubernetes/pkg/kubelet/config" + "k8s.io/kubernetes/pkg/kubelet/status" +) + +// memoryManagerStateFileName is the file name where memory manager stores its state +const memoryManagerStateFileName = "memory_manager_state" + +// ActivePodsFunc is a function that returns a list of active pods +type ActivePodsFunc func() []*v1.Pod + +type runtimeService interface { + UpdateContainerResources(id string, resources *runtimeapi.LinuxContainerResources) error +} + +type sourcesReadyStub struct{} + +func (s *sourcesReadyStub) AddSource(source string) {} +func (s *sourcesReadyStub) AllReady() bool { return true } + +// Manager interface provides methods for Kubelet to manage pod memory. +type Manager interface { + // Start is called during Kubelet initialization. + Start(activePods ActivePodsFunc, sourcesReady config.SourcesReady, podStatusProvider status.PodStatusProvider, containerRuntime runtimeService, initialContainers containermap.ContainerMap) error + + // AddContainer adds the mapping between container ID to pod UID and the container name + // The mapping used to remove the memory allocation during the container removal + AddContainer(p *v1.Pod, c *v1.Container, containerID string) + + // Allocate is called to pre-allocate memory resources during Pod admission. + // This must be called at some point prior to the AddContainer() call for a container, e.g. at pod admission time. + Allocate(pod *v1.Pod, container *v1.Container) error + + // RemoveContainer is called after Kubelet decides to kill or delete a + // container. After this call, any memory allocated to the container is freed. + RemoveContainer(containerID string) error + + // State returns a read-only interface to the internal memory manager state. + State() state.Reader + + // GetTopologyHints implements the topologymanager.HintProvider Interface + // and is consulted to achieve NUMA aware resource alignment among this + // and other resource controllers. + GetTopologyHints(*v1.Pod, *v1.Container) map[string][]topologymanager.TopologyHint + + // GetPodTopologyHints implements the topologymanager.HintProvider Interface + // and is consulted to achieve NUMA aware resource alignment among this + // and other resource controllers. + GetPodTopologyHints(*v1.Pod) map[string][]topologymanager.TopologyHint + + // GetMemoryNUMANodes provides NUMA nodes that are used to allocate the container memory + GetMemoryNUMANodes(pod *v1.Pod, container *v1.Container) sets.Int +} + +type manager struct { + sync.Mutex + policy Policy + + // state allows to restore information regarding memory allocation for guaranteed pods + // in the case of the kubelet restart + state state.State + + // containerRuntime is the container runtime service interface needed + // to make UpdateContainerResources() calls against the containers. + containerRuntime runtimeService + + // activePods is a method for listing active pods on the node + // so all the containers can be updated during call to the removeStaleState. + activePods ActivePodsFunc + + // podStatusProvider provides a method for obtaining pod statuses + // and the containerID of their containers + podStatusProvider status.PodStatusProvider + + // containerMap provides a mapping from (pod, container) -> containerID + // for all containers a pod + containerMap containermap.ContainerMap + + // sourcesReady provides the readiness of kubelet configuration sources such as apiserver update readiness. + // We use it to determine when we can purge inactive pods from checkpointed state. + sourcesReady config.SourcesReady + + // stateFileDirectory holds the directory where the state file for checkpoints is held. + stateFileDirectory string +} + +var _ Manager = &manager{} + +// NewManager returns new instance of the memory manager +func NewManager(policyName string, machineInfo *cadvisorapi.MachineInfo, nodeAllocatableReservation v1.ResourceList, reservedMemory []kubeletconfig.MemoryReservation, stateFileDirectory string, affinity topologymanager.Store) (Manager, error) { + var policy Policy + + switch policyType(policyName) { + + case policyTypeNone: + policy = NewPolicyNone() + + case policyTypeStatic: + systemReserved, err := getSystemReservedMemory(machineInfo, nodeAllocatableReservation, reservedMemory) + if err != nil { + return nil, err + } + + policy, err = NewPolicyStatic(machineInfo, systemReserved, affinity) + if err != nil { + return nil, err + } + + default: + return nil, fmt.Errorf("unknown policy: \"%s\"", policyName) + } + + manager := &manager{ + policy: policy, + stateFileDirectory: stateFileDirectory, + } + manager.sourcesReady = &sourcesReadyStub{} + return manager, nil +} + +// Start starts the memory manager under the kubelet and calls policy start +func (m *manager) Start(activePods ActivePodsFunc, sourcesReady config.SourcesReady, podStatusProvider status.PodStatusProvider, containerRuntime runtimeService, initialContainers containermap.ContainerMap) error { + klog.InfoS("Starting memorymanager", "policy", m.policy.Name()) + m.sourcesReady = sourcesReady + m.activePods = activePods + m.podStatusProvider = podStatusProvider + m.containerRuntime = containerRuntime + m.containerMap = initialContainers + + stateImpl, err := state.NewCheckpointState(m.stateFileDirectory, memoryManagerStateFileName, m.policy.Name()) + if err != nil { + klog.ErrorS(err, "Could not initialize checkpoint manager, please drain node and remove policy state file") + return err + } + m.state = stateImpl + + err = m.policy.Start(m.state) + if err != nil { + klog.ErrorS(err, "Policy start error") + return err + } + + return nil +} + +// AddContainer saves the value of requested memory for the guaranteed pod under the state and set memory affinity according to the topolgy manager +func (m *manager) AddContainer(pod *v1.Pod, container *v1.Container, containerID string) { + m.Lock() + defer m.Unlock() + + m.containerMap.Add(string(pod.UID), container.Name, containerID) +} + +// GetMemory provides NUMA nodes that used to allocate the container memory +func (m *manager) GetMemoryNUMANodes(pod *v1.Pod, container *v1.Container) sets.Int { + // Get NUMA node affinity of blocks assigned to the container during Allocate() + numaNodes := sets.NewInt() + for _, block := range m.state.GetMemoryBlocks(string(pod.UID), container.Name) { + for _, nodeID := range block.NUMAAffinity { + // avoid nodes duplication when hugepages and memory blocks pinned to the same NUMA node + numaNodes.Insert(nodeID) + } + } + + if numaNodes.Len() == 0 { + klog.V(5).InfoS("No allocation is available", "pod", klog.KObj(pod), "containerName", container.Name) + return nil + } + + klog.InfoS("Memory affinity", "pod", klog.KObj(pod), "containerName", container.Name, "numaNodes", numaNodes) + return numaNodes +} + +// Allocate is called to pre-allocate memory resources during Pod admission. +func (m *manager) Allocate(pod *v1.Pod, container *v1.Container) error { + // Garbage collect any stranded resources before allocation + m.removeStaleState() + + m.Lock() + defer m.Unlock() + + // Call down into the policy to assign this container memory if required. + if err := m.policy.Allocate(m.state, pod, container); err != nil { + klog.ErrorS(err, "Allocate error") + return err + } + return nil +} + +// RemoveContainer removes the container from the state +func (m *manager) RemoveContainer(containerID string) error { + m.Lock() + defer m.Unlock() + + // if error appears it means container entry already does not exist under the container map + podUID, containerName, err := m.containerMap.GetContainerRef(containerID) + if err != nil { + klog.InfoS("Failed to get container from container map", "containerID", containerID, "err", err) + return nil + } + + err = m.policyRemoveContainerByRef(podUID, containerName) + if err != nil { + klog.ErrorS(err, "RemoveContainer error") + return err + } + + return nil +} + +// State returns the state of the manager +func (m *manager) State() state.Reader { + return m.state +} + +// GetPodTopologyHints returns the topology hints for the topology manager +func (m *manager) GetPodTopologyHints(pod *v1.Pod) map[string][]topologymanager.TopologyHint { + // Garbage collect any stranded resources before providing TopologyHints + m.removeStaleState() + // Delegate to active policy + return m.policy.GetPodTopologyHints(m.state, pod) +} + +// GetTopologyHints returns the topology hints for the topology manager +func (m *manager) GetTopologyHints(pod *v1.Pod, container *v1.Container) map[string][]topologymanager.TopologyHint { + // Garbage collect any stranded resources before providing TopologyHints + m.removeStaleState() + // Delegate to active policy + return m.policy.GetTopologyHints(m.state, pod, container) +} + +// TODO: move the method to the upper level, to re-use it under the CPU and memory managers +func (m *manager) removeStaleState() { + // Only once all sources are ready do we attempt to remove any stale state. + // This ensures that the call to `m.activePods()` below will succeed with + // the actual active pods list. + if !m.sourcesReady.AllReady() { + return + } + + // We grab the lock to ensure that no new containers will grab memory block while + // executing the code below. Without this lock, its possible that we end up + // removing state that is newly added by an asynchronous call to + // AddContainer() during the execution of this code. + m.Lock() + defer m.Unlock() + + // Get the list of active pods. + activePods := m.activePods() + + // Build a list of (podUID, containerName) pairs for all containers in all active Pods. + activeContainers := make(map[string]map[string]struct{}) + for _, pod := range activePods { + activeContainers[string(pod.UID)] = make(map[string]struct{}) + for _, container := range append(pod.Spec.InitContainers, pod.Spec.Containers...) { + activeContainers[string(pod.UID)][container.Name] = struct{}{} + } + } + + // Loop through the MemoryManager state. Remove any state for containers not + // in the `activeContainers` list built above. + assignments := m.state.GetMemoryAssignments() + for podUID := range assignments { + for containerName := range assignments[podUID] { + if _, ok := activeContainers[podUID][containerName]; !ok { + klog.InfoS("RemoveStaleState removing state", "podUID", podUID, "containerName", containerName) + err := m.policyRemoveContainerByRef(podUID, containerName) + if err != nil { + klog.ErrorS(err, "RemoveStaleState: failed to remove state", "podUID", podUID, "containerName", containerName) + } + } + } + } +} + +func (m *manager) policyRemoveContainerByRef(podUID string, containerName string) error { + err := m.policy.RemoveContainer(m.state, podUID, containerName) + if err == nil { + m.containerMap.RemoveByContainerRef(podUID, containerName) + } + + return err +} + +func getTotalMemoryTypeReserved(machineInfo *cadvisorapi.MachineInfo, reservedMemory []kubeletconfig.MemoryReservation) (map[v1.ResourceName]resource.Quantity, error) { + totalMemoryType := map[v1.ResourceName]resource.Quantity{} + + numaNodes := map[int]bool{} + for _, numaNode := range machineInfo.Topology { + numaNodes[numaNode.Id] = true + } + + for _, reservation := range reservedMemory { + if !numaNodes[int(reservation.NumaNode)] { + return nil, fmt.Errorf("the reserved memory configuration references a NUMA node %d that does not exist on this machine", reservation.NumaNode) + } + + for resourceName, q := range reservation.Limits { + if value, ok := totalMemoryType[resourceName]; ok { + q.Add(value) + } + totalMemoryType[resourceName] = q + } + } + + return totalMemoryType, nil +} + +func validateReservedMemory(machineInfo *cadvisorapi.MachineInfo, nodeAllocatableReservation v1.ResourceList, reservedMemory []kubeletconfig.MemoryReservation) error { + totalMemoryType, err := getTotalMemoryTypeReserved(machineInfo, reservedMemory) + if err != nil { + return err + } + + commonMemoryTypeSet := make(map[v1.ResourceName]bool) + for resourceType := range totalMemoryType { + commonMemoryTypeSet[resourceType] = true + } + + for resourceType := range nodeAllocatableReservation { + if !(corev1helper.IsHugePageResourceName(resourceType) || resourceType == v1.ResourceMemory) { + continue + } + commonMemoryTypeSet[resourceType] = true + } + + for resourceType := range commonMemoryTypeSet { + nodeAllocatableMemory := resource.NewQuantity(0, resource.DecimalSI) + if memValue, set := nodeAllocatableReservation[resourceType]; set { + nodeAllocatableMemory.Add(memValue) + } + + reservedMemory := resource.NewQuantity(0, resource.DecimalSI) + if memValue, set := totalMemoryType[resourceType]; set { + reservedMemory.Add(memValue) + } + + if !(*nodeAllocatableMemory).Equal(*reservedMemory) { + return fmt.Errorf("the total amount %q of type %q is not equal to the value %q determined by Node Allocatable feature", reservedMemory.String(), resourceType, nodeAllocatableMemory.String()) + } + } + + return nil +} + +func convertReserved(machineInfo *cadvisorapi.MachineInfo, reservedMemory []kubeletconfig.MemoryReservation) (systemReservedMemory, error) { + reservedMemoryConverted := make(map[int]map[v1.ResourceName]uint64) + for _, node := range machineInfo.Topology { + reservedMemoryConverted[node.Id] = make(map[v1.ResourceName]uint64) + } + + for _, reservation := range reservedMemory { + for resourceName, q := range reservation.Limits { + val, success := q.AsInt64() + if !success { + return nil, fmt.Errorf("could not covert a variable of type Quantity to int64") + } + reservedMemoryConverted[int(reservation.NumaNode)][resourceName] = uint64(val) + } + } + + return reservedMemoryConverted, nil +} + +func getSystemReservedMemory(machineInfo *cadvisorapi.MachineInfo, nodeAllocatableReservation v1.ResourceList, reservedMemory []kubeletconfig.MemoryReservation) (systemReservedMemory, error) { + if err := validateReservedMemory(machineInfo, nodeAllocatableReservation, reservedMemory); err != nil { + return nil, err + } + + reservedMemoryConverted, err := convertReserved(machineInfo, reservedMemory) + if err != nil { + return nil, err + } + + return reservedMemoryConverted, nil +} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/memorymanager/policy.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/memorymanager/policy.go new file mode 100644 index 000000000000..8d84c71f137c --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/memorymanager/policy.go @@ -0,0 +1,44 @@ +/* +Copyright 2020 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package memorymanager + +import ( + v1 "k8s.io/api/core/v1" + "k8s.io/kubernetes/pkg/kubelet/cm/memorymanager/state" + "k8s.io/kubernetes/pkg/kubelet/cm/topologymanager" +) + +// Type defines the policy type +type policyType string + +// Policy implements logic for pod container to a memory assignment. +type Policy interface { + Name() string + Start(s state.State) error + // Allocate call is idempotent + Allocate(s state.State, pod *v1.Pod, container *v1.Container) error + // RemoveContainer call is idempotent + RemoveContainer(s state.State, podUID string, containerName string) error + // GetTopologyHints implements the topologymanager.HintProvider Interface + // and is consulted to achieve NUMA aware resource alignment among this + // and other resource controllers. + GetTopologyHints(s state.State, pod *v1.Pod, container *v1.Container) map[string][]topologymanager.TopologyHint + // GetPodTopologyHints implements the topologymanager.HintProvider Interface + // and is consulted to achieve NUMA aware resource alignment among this + // and other resource controllers. + GetPodTopologyHints(s state.State, pod *v1.Pod) map[string][]topologymanager.TopologyHint +} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/memorymanager/policy_none.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/memorymanager/policy_none.go new file mode 100644 index 000000000000..8df7bdb0dad7 --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/memorymanager/policy_none.go @@ -0,0 +1,68 @@ +/* +Copyright 2020 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package memorymanager + +import ( + v1 "k8s.io/api/core/v1" + "k8s.io/kubernetes/pkg/kubelet/cm/memorymanager/state" + "k8s.io/kubernetes/pkg/kubelet/cm/topologymanager" +) + +const policyTypeNone policyType = "None" + +// none is implementation of the policy interface for the none policy, using none +// policy is the same as disable memory management +type none struct{} + +var _ Policy = &none{} + +// NewPolicyNone returns new none policy instance +func NewPolicyNone() Policy { + return &none{} +} + +func (p *none) Name() string { + return string(policyTypeNone) +} + +func (p *none) Start(s state.State) error { + return nil +} + +// Allocate call is idempotent +func (p *none) Allocate(s state.State, pod *v1.Pod, container *v1.Container) error { + return nil +} + +// RemoveContainer call is idempotent +func (p *none) RemoveContainer(s state.State, podUID string, containerName string) error { + return nil +} + +// GetTopologyHints implements the topologymanager.HintProvider Interface +// and is consulted to achieve NUMA aware resource alignment among this +// and other resource controllers. +func (p *none) GetTopologyHints(s state.State, pod *v1.Pod, container *v1.Container) map[string][]topologymanager.TopologyHint { + return nil +} + +// GetPodTopologyHints implements the topologymanager.HintProvider Interface +// and is consulted to achieve NUMA aware resource alignment among this +// and other resource controllers. +func (p *none) GetPodTopologyHints(s state.State, pod *v1.Pod) map[string][]topologymanager.TopologyHint { + return nil +} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/memorymanager/policy_static.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/memorymanager/policy_static.go new file mode 100644 index 000000000000..4f52d703e1dc --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/memorymanager/policy_static.go @@ -0,0 +1,769 @@ +/* +Copyright 2020 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package memorymanager + +import ( + "fmt" + "reflect" + "sort" + + cadvisorapi "github.com/google/cadvisor/info/v1" + + v1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" + "k8s.io/klog/v2" + corehelper "k8s.io/kubernetes/pkg/apis/core/v1/helper" + v1qos "k8s.io/kubernetes/pkg/apis/core/v1/helper/qos" + "k8s.io/kubernetes/pkg/kubelet/cm/memorymanager/state" + "k8s.io/kubernetes/pkg/kubelet/cm/topologymanager" + "k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/bitmask" +) + +const policyTypeStatic policyType = "Static" + +type systemReservedMemory map[int]map[v1.ResourceName]uint64 + +// staticPolicy is implementation of the policy interface for the static policy +type staticPolicy struct { + // machineInfo contains machine memory related information + machineInfo *cadvisorapi.MachineInfo + // reserved contains memory that reserved for kube + systemReserved systemReservedMemory + // topology manager reference to get container Topology affinity + affinity topologymanager.Store +} + +var _ Policy = &staticPolicy{} + +// NewPolicyStatic returns new static policy instance +func NewPolicyStatic(machineInfo *cadvisorapi.MachineInfo, reserved systemReservedMemory, affinity topologymanager.Store) (Policy, error) { + var totalSystemReserved uint64 + for _, node := range reserved { + if _, ok := node[v1.ResourceMemory]; !ok { + continue + } + totalSystemReserved += node[v1.ResourceMemory] + } + + // check if we have some reserved memory for the system + if totalSystemReserved <= 0 { + return nil, fmt.Errorf("[memorymanager] you should specify the system reserved memory") + } + + return &staticPolicy{ + machineInfo: machineInfo, + systemReserved: reserved, + affinity: affinity, + }, nil +} + +func (p *staticPolicy) Name() string { + return string(policyTypeStatic) +} + +func (p *staticPolicy) Start(s state.State) error { + if err := p.validateState(s); err != nil { + klog.ErrorS(err, "Invalid state, please drain node and remove policy state file") + return err + } + return nil +} + +// Allocate call is idempotent +func (p *staticPolicy) Allocate(s state.State, pod *v1.Pod, container *v1.Container) error { + // allocate the memory only for guaranteed pods + if v1qos.GetPodQOS(pod) != v1.PodQOSGuaranteed { + return nil + } + + klog.InfoS("Allocate", "pod", klog.KObj(pod), "containerName", container.Name) + if blocks := s.GetMemoryBlocks(string(pod.UID), container.Name); blocks != nil { + klog.InfoS("Container already present in state, skipping", "pod", klog.KObj(pod), "containerName", container.Name) + return nil + } + + // Call Topology Manager to get the aligned affinity across all hint providers. + hint := p.affinity.GetAffinity(string(pod.UID), container.Name) + klog.InfoS("Got topology affinity", "pod", klog.KObj(pod), "podUID", pod.UID, "containerName", container.Name, "hint", hint) + + requestedResources, err := getRequestedResources(container) + if err != nil { + return err + } + + bestHint := &hint + // topology manager returned the hint with NUMA affinity nil + // we should use the default NUMA affinity calculated the same way as for the topology manager + if hint.NUMANodeAffinity == nil { + defaultHint, err := p.getDefaultHint(s, requestedResources) + if err != nil { + return err + } + + if !defaultHint.Preferred && bestHint.Preferred { + return fmt.Errorf("[memorymanager] failed to find the default preferred hint") + } + bestHint = defaultHint + } + + machineState := s.GetMachineState() + + // topology manager returns the hint that does not satisfy completely the container request + // we should extend this hint to the one who will satisfy the request and include the current hint + if !isAffinitySatisfyRequest(machineState, bestHint.NUMANodeAffinity, requestedResources) { + extendedHint, err := p.extendTopologyManagerHint(s, requestedResources, bestHint.NUMANodeAffinity) + if err != nil { + return err + } + + if !extendedHint.Preferred && bestHint.Preferred { + return fmt.Errorf("[memorymanager] failed to find the extended preferred hint") + } + bestHint = extendedHint + } + + var containerBlocks []state.Block + maskBits := bestHint.NUMANodeAffinity.GetBits() + for resourceName, requestedSize := range requestedResources { + // update memory blocks + containerBlocks = append(containerBlocks, state.Block{ + NUMAAffinity: maskBits, + Size: requestedSize, + Type: resourceName, + }) + + // Update nodes memory state + for _, nodeID := range maskBits { + machineState[nodeID].NumberOfAssignments++ + machineState[nodeID].Cells = maskBits + + // we need to continue to update all affinity mask nodes + if requestedSize == 0 { + continue + } + + // update the node memory state + nodeResourceMemoryState := machineState[nodeID].MemoryMap[resourceName] + if nodeResourceMemoryState.Free <= 0 { + continue + } + + // the node has enough memory to satisfy the request + if nodeResourceMemoryState.Free >= requestedSize { + nodeResourceMemoryState.Reserved += requestedSize + nodeResourceMemoryState.Free -= requestedSize + requestedSize = 0 + continue + } + + // the node does not have enough memory, use the node remaining memory and move to the next node + requestedSize -= nodeResourceMemoryState.Free + nodeResourceMemoryState.Reserved += nodeResourceMemoryState.Free + nodeResourceMemoryState.Free = 0 + } + } + + s.SetMachineState(machineState) + s.SetMemoryBlocks(string(pod.UID), container.Name, containerBlocks) + + return nil +} + +// RemoveContainer call is idempotent +func (p *staticPolicy) RemoveContainer(s state.State, podUID string, containerName string) error { + klog.InfoS("RemoveContainer", "podUID", podUID, "containerName", containerName) + blocks := s.GetMemoryBlocks(podUID, containerName) + if blocks == nil { + return nil + } + + s.Delete(podUID, containerName) + + // Mutate machine memory state to update free and reserved memory + machineState := s.GetMachineState() + for _, b := range blocks { + releasedSize := b.Size + for _, nodeID := range b.NUMAAffinity { + machineState[nodeID].NumberOfAssignments-- + + // once we do not have any memory allocations on this node, clear node groups + if machineState[nodeID].NumberOfAssignments == 0 { + machineState[nodeID].Cells = []int{nodeID} + } + + // we still need to pass over all NUMA node under the affinity mask to update them + if releasedSize == 0 { + continue + } + + nodeResourceMemoryState := machineState[nodeID].MemoryMap[b.Type] + + // if the node does not have reserved memory to free, continue to the next node + if nodeResourceMemoryState.Reserved == 0 { + continue + } + + // the reserved memory smaller than the amount of the memory that should be released + // release as much as possible and move to the next node + if nodeResourceMemoryState.Reserved < releasedSize { + releasedSize -= nodeResourceMemoryState.Reserved + nodeResourceMemoryState.Free += nodeResourceMemoryState.Reserved + nodeResourceMemoryState.Reserved = 0 + continue + } + + // the reserved memory big enough to satisfy the released memory + nodeResourceMemoryState.Free += releasedSize + nodeResourceMemoryState.Reserved -= releasedSize + releasedSize = 0 + } + } + + s.SetMachineState(machineState) + + return nil +} + +func regenerateHints(pod *v1.Pod, ctn *v1.Container, ctnBlocks []state.Block, reqRsrc map[v1.ResourceName]uint64) map[string][]topologymanager.TopologyHint { + hints := map[string][]topologymanager.TopologyHint{} + for resourceName := range reqRsrc { + hints[string(resourceName)] = []topologymanager.TopologyHint{} + } + + if len(ctnBlocks) != len(reqRsrc) { + klog.ErrorS(nil, "The number of requested resources by the container differs from the number of memory blocks", "containerName", ctn.Name) + return nil + } + + for _, b := range ctnBlocks { + if _, ok := reqRsrc[b.Type]; !ok { + klog.ErrorS(nil, "Container requested resources do not have resource of this type", "containerName", ctn.Name, "type", b.Type) + return nil + } + + if b.Size != reqRsrc[b.Type] { + klog.ErrorS(nil, "Memory already allocated with different numbers than requested", "podUID", pod.UID, "type", b.Type, "containerName", ctn.Name, "requestedResource", reqRsrc[b.Type], "allocatedSize", b.Size) + return nil + } + + containerNUMAAffinity, err := bitmask.NewBitMask(b.NUMAAffinity...) + if err != nil { + klog.ErrorS(err, "Failed to generate NUMA bitmask") + return nil + } + + klog.InfoS("Regenerating TopologyHints, resource was already allocated to pod", "resourceName", b.Type, "pod", klog.KObj(pod), "podUID", pod.UID, "containerName", ctn.Name) + hints[string(b.Type)] = append(hints[string(b.Type)], topologymanager.TopologyHint{ + NUMANodeAffinity: containerNUMAAffinity, + Preferred: true, + }) + } + return hints +} + +func getPodRequestedResources(pod *v1.Pod) (map[v1.ResourceName]uint64, error) { + reqRsrcsByInitCtrs := make(map[v1.ResourceName]uint64) + reqRsrcsByAppCtrs := make(map[v1.ResourceName]uint64) + + for _, ctr := range pod.Spec.InitContainers { + reqRsrcs, err := getRequestedResources(&ctr) + + if err != nil { + return nil, err + } + for rsrcName, qty := range reqRsrcs { + if _, ok := reqRsrcsByInitCtrs[rsrcName]; !ok { + reqRsrcsByInitCtrs[rsrcName] = uint64(0) + } + + if reqRsrcs[rsrcName] > reqRsrcsByInitCtrs[rsrcName] { + reqRsrcsByInitCtrs[rsrcName] = qty + } + } + } + + for _, ctr := range pod.Spec.Containers { + reqRsrcs, err := getRequestedResources(&ctr) + + if err != nil { + return nil, err + } + for rsrcName, qty := range reqRsrcs { + if _, ok := reqRsrcsByAppCtrs[rsrcName]; !ok { + reqRsrcsByAppCtrs[rsrcName] = uint64(0) + } + + reqRsrcsByAppCtrs[rsrcName] += qty + } + } + + for rsrcName := range reqRsrcsByAppCtrs { + if reqRsrcsByInitCtrs[rsrcName] > reqRsrcsByAppCtrs[rsrcName] { + reqRsrcsByAppCtrs[rsrcName] = reqRsrcsByInitCtrs[rsrcName] + } + } + return reqRsrcsByAppCtrs, nil +} + +func (p *staticPolicy) GetPodTopologyHints(s state.State, pod *v1.Pod) map[string][]topologymanager.TopologyHint { + if v1qos.GetPodQOS(pod) != v1.PodQOSGuaranteed { + return nil + } + + reqRsrcs, err := getPodRequestedResources(pod) + if err != nil { + klog.ErrorS(err, "Failed to get pod requested resources", "pod", klog.KObj(pod), "podUID", pod.UID) + return nil + } + + for _, ctn := range append(pod.Spec.InitContainers, pod.Spec.Containers...) { + containerBlocks := s.GetMemoryBlocks(string(pod.UID), ctn.Name) + // Short circuit to regenerate the same hints if there are already + // memory allocated for the container. This might happen after a + // kubelet restart, for example. + if containerBlocks != nil { + return regenerateHints(pod, &ctn, containerBlocks, reqRsrcs) + } + } + return p.calculateHints(s, reqRsrcs) +} + +// GetTopologyHints implements the topologymanager.HintProvider Interface +// and is consulted to achieve NUMA aware resource alignment among this +// and other resource controllers. +func (p *staticPolicy) GetTopologyHints(s state.State, pod *v1.Pod, container *v1.Container) map[string][]topologymanager.TopologyHint { + if v1qos.GetPodQOS(pod) != v1.PodQOSGuaranteed { + return nil + } + + requestedResources, err := getRequestedResources(container) + if err != nil { + klog.ErrorS(err, "Failed to get container requested resources", "pod", klog.KObj(pod), "podUID", pod.UID, "containerName", container.Name) + return nil + } + + containerBlocks := s.GetMemoryBlocks(string(pod.UID), container.Name) + // Short circuit to regenerate the same hints if there are already + // memory allocated for the container. This might happen after a + // kubelet restart, for example. + if containerBlocks != nil { + return regenerateHints(pod, container, containerBlocks, requestedResources) + } + + return p.calculateHints(s, requestedResources) +} + +func getRequestedResources(container *v1.Container) (map[v1.ResourceName]uint64, error) { + requestedResources := map[v1.ResourceName]uint64{} + for resourceName, quantity := range container.Resources.Requests { + if resourceName != v1.ResourceMemory && !corehelper.IsHugePageResourceName(resourceName) { + continue + } + requestedSize, succeed := quantity.AsInt64() + if !succeed { + return nil, fmt.Errorf("[memorymanager] failed to represent quantity as int64") + } + requestedResources[resourceName] = uint64(requestedSize) + } + return requestedResources, nil +} + +func (p *staticPolicy) calculateHints(s state.State, requestedResources map[v1.ResourceName]uint64) map[string][]topologymanager.TopologyHint { + machineState := s.GetMachineState() + var numaNodes []int + for n := range machineState { + numaNodes = append(numaNodes, n) + } + sort.Ints(numaNodes) + + // Initialize minAffinitySize to include all NUMA Cells. + minAffinitySize := len(numaNodes) + + hints := map[string][]topologymanager.TopologyHint{} + bitmask.IterateBitMasks(numaNodes, func(mask bitmask.BitMask) { + maskBits := mask.GetBits() + singleNUMAHint := len(maskBits) == 1 + + // the node already in group with another node, it can not be used for the single NUMA node allocation + if singleNUMAHint && len(machineState[maskBits[0]].Cells) > 1 { + return + } + + totalFreeSize := map[v1.ResourceName]uint64{} + totalAllocatableSize := map[v1.ResourceName]uint64{} + // calculate total free memory for the node mask + for _, nodeID := range maskBits { + // the node already used for the memory allocation + if !singleNUMAHint && machineState[nodeID].NumberOfAssignments > 0 { + // the node used for the single NUMA memory allocation, it can not be used for the multi NUMA node allocation + if len(machineState[nodeID].Cells) == 1 { + return + } + + // the node already used with different group of nodes, it can not be use with in the current hint + if !areGroupsEqual(machineState[nodeID].Cells, maskBits) { + return + } + } + + for resourceName := range requestedResources { + if _, ok := totalFreeSize[resourceName]; !ok { + totalFreeSize[resourceName] = 0 + } + totalFreeSize[resourceName] += machineState[nodeID].MemoryMap[resourceName].Free + + if _, ok := totalAllocatableSize[resourceName]; !ok { + totalAllocatableSize[resourceName] = 0 + } + totalAllocatableSize[resourceName] += machineState[nodeID].MemoryMap[resourceName].Allocatable + } + } + + // verify that for all memory types the node mask has enough allocatable resources + for resourceName, requestedSize := range requestedResources { + if totalAllocatableSize[resourceName] < requestedSize { + return + } + } + + // set the minimum amount of NUMA nodes that can satisfy the container resources requests + if mask.Count() < minAffinitySize { + minAffinitySize = mask.Count() + } + + // verify that for all memory types the node mask has enough free resources + for resourceName, requestedSize := range requestedResources { + if totalFreeSize[resourceName] < requestedSize { + return + } + } + + // add the node mask as topology hint for all memory types + for resourceName := range requestedResources { + if _, ok := hints[string(resourceName)]; !ok { + hints[string(resourceName)] = []topologymanager.TopologyHint{} + } + hints[string(resourceName)] = append(hints[string(resourceName)], topologymanager.TopologyHint{ + NUMANodeAffinity: mask, + Preferred: false, + }) + } + }) + + // update hints preferred according to multiNUMAGroups, in case when it wasn't provided, the default + // behaviour to prefer the minimal amount of NUMA nodes will be used + for resourceName := range requestedResources { + for i, hint := range hints[string(resourceName)] { + hints[string(resourceName)][i].Preferred = p.isHintPreferred(hint.NUMANodeAffinity.GetBits(), minAffinitySize) + } + } + + return hints +} + +func (p *staticPolicy) isHintPreferred(maskBits []int, minAffinitySize int) bool { + return len(maskBits) == minAffinitySize +} + +func areGroupsEqual(group1, group2 []int) bool { + sort.Ints(group1) + sort.Ints(group2) + + if len(group1) != len(group2) { + return false + } + + for i, elm := range group1 { + if group2[i] != elm { + return false + } + } + return true +} + +func (p *staticPolicy) validateState(s state.State) error { + machineState := s.GetMachineState() + memoryAssignments := s.GetMemoryAssignments() + + if len(machineState) == 0 { + // Machine state cannot be empty when assignments exist + if len(memoryAssignments) != 0 { + return fmt.Errorf("[memorymanager] machine state can not be empty when it has memory assignments") + } + + defaultMachineState := p.getDefaultMachineState() + s.SetMachineState(defaultMachineState) + + return nil + } + + // calculate all memory assigned to containers + expectedMachineState := p.getDefaultMachineState() + for pod, container := range memoryAssignments { + for containerName, blocks := range container { + for _, b := range blocks { + requestedSize := b.Size + for _, nodeID := range b.NUMAAffinity { + nodeState, ok := expectedMachineState[nodeID] + if !ok { + return fmt.Errorf("[memorymanager] (pod: %s, container: %s) the memory assignment uses the NUMA that does not exist", pod, containerName) + } + + nodeState.NumberOfAssignments++ + nodeState.Cells = b.NUMAAffinity + + memoryState, ok := nodeState.MemoryMap[b.Type] + if !ok { + return fmt.Errorf("[memorymanager] (pod: %s, container: %s) the memory assignment uses memory resource that does not exist", pod, containerName) + } + + if requestedSize == 0 { + continue + } + + // this node does not have enough memory continue to the next one + if memoryState.Free <= 0 { + continue + } + + // the node has enough memory to satisfy the request + if memoryState.Free >= requestedSize { + memoryState.Reserved += requestedSize + memoryState.Free -= requestedSize + requestedSize = 0 + continue + } + + // the node does not have enough memory, use the node remaining memory and move to the next node + requestedSize -= memoryState.Free + memoryState.Reserved += memoryState.Free + memoryState.Free = 0 + } + } + } + } + + // State has already been initialized from file (is not empty) + // Validate that total size, system reserved and reserved memory not changed, it can happen, when: + // - adding or removing physical memory bank from the node + // - change of kubelet system-reserved, kube-reserved or pre-reserved-memory-zone parameters + if !areMachineStatesEqual(machineState, expectedMachineState) { + return fmt.Errorf("[memorymanager] the expected machine state is different from the real one") + } + + return nil +} + +func areMachineStatesEqual(ms1, ms2 state.NUMANodeMap) bool { + if len(ms1) != len(ms2) { + klog.ErrorS(nil, "Node states are different", "lengthNode1", len(ms1), "lengthNode2", len(ms2)) + return false + } + + for nodeID, nodeState1 := range ms1 { + nodeState2, ok := ms2[nodeID] + if !ok { + klog.ErrorS(nil, "Node state does not have node ID", "nodeID", nodeID) + return false + } + + if nodeState1.NumberOfAssignments != nodeState2.NumberOfAssignments { + klog.ErrorS(nil, "Node states number of assignments are different", "assignment1", nodeState1.NumberOfAssignments, "assignment2", nodeState2.NumberOfAssignments) + return false + } + + if !areGroupsEqual(nodeState1.Cells, nodeState2.Cells) { + klog.ErrorS(nil, "Node states groups are different", "stateNode1", nodeState1.Cells, "stateNode2", nodeState2.Cells) + return false + } + + if len(nodeState1.MemoryMap) != len(nodeState2.MemoryMap) { + klog.ErrorS(nil, "Node states memory map have different lengths", "lengthNode1", len(nodeState1.MemoryMap), "lengthNode2", len(nodeState2.MemoryMap)) + return false + } + + for resourceName, memoryState1 := range nodeState1.MemoryMap { + memoryState2, ok := nodeState2.MemoryMap[resourceName] + if !ok { + klog.ErrorS(nil, "Memory state does not have resource", "resource", resourceName) + return false + } + + if !reflect.DeepEqual(*memoryState1, *memoryState2) { + klog.ErrorS(nil, "Memory states for the NUMA node and resource are different", "node", nodeID, "resource", resourceName, "memoryState1", *memoryState1, "memoryState2", *memoryState2) + return false + } + } + } + return true +} + +func (p *staticPolicy) getDefaultMachineState() state.NUMANodeMap { + defaultMachineState := state.NUMANodeMap{} + nodeHugepages := map[int]uint64{} + for _, node := range p.machineInfo.Topology { + defaultMachineState[node.Id] = &state.NUMANodeState{ + NumberOfAssignments: 0, + MemoryMap: map[v1.ResourceName]*state.MemoryTable{}, + Cells: []int{node.Id}, + } + + // fill memory table with huge pages values + for _, hugepage := range node.HugePages { + hugepageQuantity := resource.NewQuantity(int64(hugepage.PageSize)*1024, resource.BinarySI) + resourceName := corehelper.HugePageResourceName(*hugepageQuantity) + systemReserved := p.getResourceSystemReserved(node.Id, resourceName) + totalHugepagesSize := hugepage.NumPages * hugepage.PageSize * 1024 + allocatable := totalHugepagesSize - systemReserved + defaultMachineState[node.Id].MemoryMap[resourceName] = &state.MemoryTable{ + Allocatable: allocatable, + Free: allocatable, + Reserved: 0, + SystemReserved: systemReserved, + TotalMemSize: totalHugepagesSize, + } + if _, ok := nodeHugepages[node.Id]; !ok { + nodeHugepages[node.Id] = 0 + } + nodeHugepages[node.Id] += totalHugepagesSize + } + + // fill memory table with regular memory values + systemReserved := p.getResourceSystemReserved(node.Id, v1.ResourceMemory) + + allocatable := node.Memory - systemReserved + // remove memory allocated by hugepages + if allocatedByHugepages, ok := nodeHugepages[node.Id]; ok { + allocatable -= allocatedByHugepages + } + defaultMachineState[node.Id].MemoryMap[v1.ResourceMemory] = &state.MemoryTable{ + Allocatable: allocatable, + Free: allocatable, + Reserved: 0, + SystemReserved: systemReserved, + TotalMemSize: node.Memory, + } + } + return defaultMachineState +} + +func (p *staticPolicy) getResourceSystemReserved(nodeID int, resourceName v1.ResourceName) uint64 { + var systemReserved uint64 + if nodeSystemReserved, ok := p.systemReserved[nodeID]; ok { + if nodeMemorySystemReserved, ok := nodeSystemReserved[resourceName]; ok { + systemReserved = nodeMemorySystemReserved + } + } + return systemReserved +} + +func (p *staticPolicy) getDefaultHint(s state.State, requestedResources map[v1.ResourceName]uint64) (*topologymanager.TopologyHint, error) { + hints := p.calculateHints(s, requestedResources) + if len(hints) < 1 { + return nil, fmt.Errorf("[memorymanager] failed to get the default NUMA affinity, no NUMA nodes with enough memory is available") + } + + // hints for all memory types should be the same, so we will check hints only for regular memory type + return findBestHint(hints[string(v1.ResourceMemory)]), nil +} + +func isAffinitySatisfyRequest(machineState state.NUMANodeMap, mask bitmask.BitMask, requestedResources map[v1.ResourceName]uint64) bool { + totalFreeSize := map[v1.ResourceName]uint64{} + for _, nodeID := range mask.GetBits() { + for resourceName := range requestedResources { + if _, ok := totalFreeSize[resourceName]; !ok { + totalFreeSize[resourceName] = 0 + } + totalFreeSize[resourceName] += machineState[nodeID].MemoryMap[resourceName].Free + } + } + + // verify that for all memory types the node mask has enough resources + for resourceName, requestedSize := range requestedResources { + if totalFreeSize[resourceName] < requestedSize { + return false + } + } + + return true +} + +// extendTopologyManagerHint extends the topology manager hint, in case when it does not satisfy to the container request +// the topology manager uses bitwise AND to merge all topology hints into the best one, so in case of the restricted policy, +// it possible that we will get the subset of hint that we provided to the topology manager, in this case we want to extend +// it to the original one +func (p *staticPolicy) extendTopologyManagerHint(s state.State, requestedResources map[v1.ResourceName]uint64, mask bitmask.BitMask) (*topologymanager.TopologyHint, error) { + hints := p.calculateHints(s, requestedResources) + + var filteredHints []topologymanager.TopologyHint + // hints for all memory types should be the same, so we will check hints only for regular memory type + for _, hint := range hints[string(v1.ResourceMemory)] { + affinityBits := hint.NUMANodeAffinity.GetBits() + // filter all hints that does not include currentHint + if isHintInGroup(mask.GetBits(), affinityBits) { + filteredHints = append(filteredHints, hint) + } + } + + if len(filteredHints) < 1 { + return nil, fmt.Errorf("[memorymanager] failed to find NUMA nodes to extend the current topology hint") + } + + // try to find the preferred hint with the minimal number of NUMA nodes, relevant for the restricted policy + return findBestHint(filteredHints), nil +} + +func isHintInGroup(hint []int, group []int) bool { + sort.Ints(hint) + sort.Ints(group) + + hintIndex := 0 + for i := range group { + if hintIndex == len(hint) { + return true + } + + if group[i] != hint[hintIndex] { + continue + } + hintIndex++ + } + return false +} + +func findBestHint(hints []topologymanager.TopologyHint) *topologymanager.TopologyHint { + // try to find the preferred hint with the minimal number of NUMA nodes, relevant for the restricted policy + bestHint := topologymanager.TopologyHint{} + for _, hint := range hints { + if bestHint.NUMANodeAffinity == nil { + bestHint = hint + continue + } + + // preferred of the current hint is true, when the extendedHint preferred is false + if hint.Preferred && !bestHint.Preferred { + bestHint = hint + continue + } + + // both hints has the same preferred value, but the current hint has less NUMA nodes than the extended one + if hint.Preferred == bestHint.Preferred && hint.NUMANodeAffinity.IsNarrowerThan(bestHint.NUMANodeAffinity) { + bestHint = hint + } + } + return &bestHint +} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/memorymanager/state/checkpoint.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/memorymanager/state/checkpoint.go new file mode 100644 index 000000000000..a43b40272e02 --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/memorymanager/state/checkpoint.go @@ -0,0 +1,65 @@ +/* +Copyright 2020 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package state + +import ( + "encoding/json" + + "k8s.io/kubernetes/pkg/kubelet/checkpointmanager" + "k8s.io/kubernetes/pkg/kubelet/checkpointmanager/checksum" +) + +var _ checkpointmanager.Checkpoint = &MemoryManagerCheckpoint{} + +// MemoryManagerCheckpoint struct is used to store memory/pod assignments in a checkpoint +type MemoryManagerCheckpoint struct { + PolicyName string `json:"policyName"` + MachineState NUMANodeMap `json:"machineState"` + Entries ContainerMemoryAssignments `json:"entries,omitempty"` + Checksum checksum.Checksum `json:"checksum"` +} + +// NewMemoryManagerCheckpoint returns an instance of Checkpoint +func NewMemoryManagerCheckpoint() *MemoryManagerCheckpoint { + //lint:ignore unexported-type-in-api user-facing error message + return &MemoryManagerCheckpoint{ + Entries: ContainerMemoryAssignments{}, + MachineState: NUMANodeMap{}, + } +} + +// MarshalCheckpoint returns marshalled checkpoint +func (mp *MemoryManagerCheckpoint) MarshalCheckpoint() ([]byte, error) { + // make sure checksum wasn't set before so it doesn't affect output checksum + mp.Checksum = 0 + mp.Checksum = checksum.New(mp) + return json.Marshal(*mp) +} + +// UnmarshalCheckpoint tries to unmarshal passed bytes to checkpoint +func (mp *MemoryManagerCheckpoint) UnmarshalCheckpoint(blob []byte) error { + return json.Unmarshal(blob, mp) +} + +// VerifyChecksum verifies that current checksum of checkpoint is valid +func (mp *MemoryManagerCheckpoint) VerifyChecksum() error { + ck := mp.Checksum + mp.Checksum = 0 + err := ck.Verify(mp) + mp.Checksum = ck + return err +} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/memorymanager/state/state.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/memorymanager/state/state.go new file mode 100644 index 000000000000..322ca608e4ca --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/memorymanager/state/state.go @@ -0,0 +1,130 @@ +/* +Copyright 2020 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package state + +import ( + v1 "k8s.io/api/core/v1" +) + +// MemoryTable contains memory information +type MemoryTable struct { + TotalMemSize uint64 `json:"total"` + SystemReserved uint64 `json:"systemReserved"` + Allocatable uint64 `json:"allocatable"` + Reserved uint64 `json:"reserved"` + Free uint64 `json:"free"` +} + +// NUMANodeState contains NUMA node related information +type NUMANodeState struct { + // NumberOfAssignments contains a number memory assignments from this node + // When the container requires memory and hugepages it will increase number of assignments by two + NumberOfAssignments int `json:"numberOfAssignments"` + // MemoryTable contains NUMA node memory related information + MemoryMap map[v1.ResourceName]*MemoryTable `json:"memoryMap"` + // Cells contains the current NUMA node and all other nodes that are in a group with current NUMA node + // This parameter indicates if the current node is used for the multiple NUMA node memory allocation + // For example if some container has pinning 0,1,2, NUMA nodes 0,1,2 under the state will have + // this parameter equals to [0, 1, 2] + Cells []int `json:"cells"` +} + +// NUMANodeMap contains memory information for each NUMA node. +type NUMANodeMap map[int]*NUMANodeState + +// Clone returns a copy of NUMANodeMap +func (nm NUMANodeMap) Clone() NUMANodeMap { + clone := make(NUMANodeMap) + for node, s := range nm { + if s == nil { + clone[node] = nil + continue + } + + clone[node] = &NUMANodeState{} + clone[node].NumberOfAssignments = s.NumberOfAssignments + clone[node].Cells = append([]int{}, s.Cells...) + + if s.MemoryMap == nil { + continue + } + + clone[node].MemoryMap = map[v1.ResourceName]*MemoryTable{} + for memoryType, memoryTable := range s.MemoryMap { + clone[node].MemoryMap[memoryType] = &MemoryTable{ + Allocatable: memoryTable.Allocatable, + Free: memoryTable.Free, + Reserved: memoryTable.Reserved, + SystemReserved: memoryTable.SystemReserved, + TotalMemSize: memoryTable.TotalMemSize, + } + } + } + return clone +} + +// Block is a data structure used to represent a certain amount of memory +type Block struct { + // NUMAAffinity contains the string that represents NUMA affinity bitmask + NUMAAffinity []int `json:"numaAffinity"` + Type v1.ResourceName `json:"type"` + Size uint64 `json:"size"` +} + +// ContainerMemoryAssignments stores memory assignments of containers +type ContainerMemoryAssignments map[string]map[string][]Block + +// Clone returns a copy of ContainerMemoryAssignments +func (as ContainerMemoryAssignments) Clone() ContainerMemoryAssignments { + clone := make(ContainerMemoryAssignments) + for pod := range as { + clone[pod] = make(map[string][]Block) + for container, blocks := range as[pod] { + clone[pod][container] = append([]Block{}, blocks...) + } + } + return clone +} + +// Reader interface used to read current memory/pod assignment state +type Reader interface { + // GetMachineState returns Memory Map stored in the State + GetMachineState() NUMANodeMap + // GetMemoryBlocks returns memory assignments of a container + GetMemoryBlocks(podUID string, containerName string) []Block + // GetMemoryAssignments returns ContainerMemoryAssignments + GetMemoryAssignments() ContainerMemoryAssignments +} + +type writer interface { + // SetMachineState stores NUMANodeMap in State + SetMachineState(memoryMap NUMANodeMap) + // SetMemoryBlocks stores memory assignments of a container + SetMemoryBlocks(podUID string, containerName string, blocks []Block) + // SetMemoryAssignments sets ContainerMemoryAssignments by using the passed parameter + SetMemoryAssignments(assignments ContainerMemoryAssignments) + // Delete deletes corresponding Blocks from ContainerMemoryAssignments + Delete(podUID string, containerName string) + // ClearState clears machineState and ContainerMemoryAssignments + ClearState() +} + +// State interface provides methods for tracking and setting memory/pod assignment +type State interface { + Reader + writer +} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/memorymanager/state/state_checkpoint.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/memorymanager/state/state_checkpoint.go new file mode 100644 index 000000000000..3607234094b1 --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/memorymanager/state/state_checkpoint.go @@ -0,0 +1,184 @@ +/* +Copyright 2020 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package state + +import ( + "fmt" + "path" + "sync" + + "k8s.io/klog/v2" + "k8s.io/kubernetes/pkg/kubelet/checkpointmanager" + "k8s.io/kubernetes/pkg/kubelet/checkpointmanager/errors" +) + +var _ State = &stateCheckpoint{} + +type stateCheckpoint struct { + sync.RWMutex + cache State + policyName string + checkpointManager checkpointmanager.CheckpointManager + checkpointName string +} + +// NewCheckpointState creates new State for keeping track of memory/pod assignment with checkpoint backend +func NewCheckpointState(stateDir, checkpointName, policyName string) (State, error) { + checkpointManager, err := checkpointmanager.NewCheckpointManager(stateDir) + if err != nil { + return nil, fmt.Errorf("failed to initialize checkpoint manager: %v", err) + } + stateCheckpoint := &stateCheckpoint{ + cache: NewMemoryState(), + policyName: policyName, + checkpointManager: checkpointManager, + checkpointName: checkpointName, + } + + if err := stateCheckpoint.restoreState(); err != nil { + //lint:ignore ST1005 user-facing error message + return nil, fmt.Errorf("could not restore state from checkpoint: %v, please drain this node and delete the memory manager checkpoint file %q before restarting Kubelet", + err, path.Join(stateDir, checkpointName)) + } + + return stateCheckpoint, nil +} + +// restores state from a checkpoint and creates it if it doesn't exist +func (sc *stateCheckpoint) restoreState() error { + sc.Lock() + defer sc.Unlock() + var err error + + checkpoint := NewMemoryManagerCheckpoint() + if err = sc.checkpointManager.GetCheckpoint(sc.checkpointName, checkpoint); err != nil { + if err == errors.ErrCheckpointNotFound { + return sc.storeState() + } + return err + } + + if sc.policyName != checkpoint.PolicyName { + return fmt.Errorf("[memorymanager] configured policy %q differs from state checkpoint policy %q", sc.policyName, checkpoint.PolicyName) + } + + sc.cache.SetMachineState(checkpoint.MachineState) + sc.cache.SetMemoryAssignments(checkpoint.Entries) + + klog.V(2).InfoS("State checkpoint: restored state from checkpoint") + + return nil +} + +// saves state to a checkpoint, caller is responsible for locking +func (sc *stateCheckpoint) storeState() error { + checkpoint := NewMemoryManagerCheckpoint() + checkpoint.PolicyName = sc.policyName + checkpoint.MachineState = sc.cache.GetMachineState() + checkpoint.Entries = sc.cache.GetMemoryAssignments() + + err := sc.checkpointManager.CreateCheckpoint(sc.checkpointName, checkpoint) + if err != nil { + klog.ErrorS(err, "Could not save checkpoint") + return err + } + return nil +} + +// GetMemoryState returns Memory Map stored in the State +func (sc *stateCheckpoint) GetMachineState() NUMANodeMap { + sc.RLock() + defer sc.RUnlock() + + return sc.cache.GetMachineState() +} + +// GetMemoryBlocks returns memory assignments of a container +func (sc *stateCheckpoint) GetMemoryBlocks(podUID string, containerName string) []Block { + sc.RLock() + defer sc.RUnlock() + + return sc.cache.GetMemoryBlocks(podUID, containerName) +} + +// GetMemoryAssignments returns ContainerMemoryAssignments +func (sc *stateCheckpoint) GetMemoryAssignments() ContainerMemoryAssignments { + sc.RLock() + defer sc.RUnlock() + + return sc.cache.GetMemoryAssignments() +} + +// SetMachineState stores NUMANodeMap in State +func (sc *stateCheckpoint) SetMachineState(memoryMap NUMANodeMap) { + sc.Lock() + defer sc.Unlock() + + sc.cache.SetMachineState(memoryMap) + err := sc.storeState() + if err != nil { + klog.InfoS("Store state to checkpoint error", "err", err) + } +} + +// SetMemoryBlocks stores memory assignments of container +func (sc *stateCheckpoint) SetMemoryBlocks(podUID string, containerName string, blocks []Block) { + sc.Lock() + defer sc.Unlock() + + sc.cache.SetMemoryBlocks(podUID, containerName, blocks) + err := sc.storeState() + if err != nil { + klog.InfoS("Store state to checkpoint error", "err", err) + } +} + +// SetMemoryAssignments sets ContainerMemoryAssignments by using the passed parameter +func (sc *stateCheckpoint) SetMemoryAssignments(assignments ContainerMemoryAssignments) { + sc.Lock() + defer sc.Unlock() + + sc.cache.SetMemoryAssignments(assignments) + err := sc.storeState() + if err != nil { + klog.InfoS("Store state to checkpoint error", "err", err) + } +} + +// Delete deletes corresponding Blocks from ContainerMemoryAssignments +func (sc *stateCheckpoint) Delete(podUID string, containerName string) { + sc.Lock() + defer sc.Unlock() + + sc.cache.Delete(podUID, containerName) + err := sc.storeState() + if err != nil { + klog.InfoS("Store state to checkpoint error", "err", err) + } +} + +// ClearState clears machineState and ContainerMemoryAssignments +func (sc *stateCheckpoint) ClearState() { + sc.Lock() + defer sc.Unlock() + + sc.cache.ClearState() + err := sc.storeState() + if err != nil { + klog.InfoS("Store state to checkpoint error", "err", err) + } +} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/memorymanager/state/state_mem.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/memorymanager/state/state_mem.go new file mode 100644 index 000000000000..7e4da7ab67ce --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/memorymanager/state/state_mem.go @@ -0,0 +1,123 @@ +/* +Copyright 2020 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package state + +import ( + "sync" + + "k8s.io/klog/v2" +) + +type stateMemory struct { + sync.RWMutex + assignments ContainerMemoryAssignments + machineState NUMANodeMap +} + +var _ State = &stateMemory{} + +// NewMemoryState creates new State for keeping track of cpu/pod assignment +func NewMemoryState() State { + klog.InfoS("Initializing new in-memory state store") + return &stateMemory{ + assignments: ContainerMemoryAssignments{}, + machineState: NUMANodeMap{}, + } +} + +// GetMemoryState returns Memory Map stored in the State +func (s *stateMemory) GetMachineState() NUMANodeMap { + s.RLock() + defer s.RUnlock() + + return s.machineState.Clone() +} + +// GetMemoryBlocks returns memory assignments of a container +func (s *stateMemory) GetMemoryBlocks(podUID string, containerName string) []Block { + s.RLock() + defer s.RUnlock() + + if res, ok := s.assignments[podUID][containerName]; ok { + return append([]Block{}, res...) + } + return nil +} + +// GetMemoryAssignments returns ContainerMemoryAssignments +func (s *stateMemory) GetMemoryAssignments() ContainerMemoryAssignments { + s.RLock() + defer s.RUnlock() + + return s.assignments.Clone() +} + +// SetMachineState stores NUMANodeMap in State +func (s *stateMemory) SetMachineState(nodeMap NUMANodeMap) { + s.Lock() + defer s.Unlock() + + s.machineState = nodeMap.Clone() + klog.InfoS("Updated machine memory state") +} + +// SetMemoryBlocks stores memory assignments of container +func (s *stateMemory) SetMemoryBlocks(podUID string, containerName string, blocks []Block) { + s.Lock() + defer s.Unlock() + + if _, ok := s.assignments[podUID]; !ok { + s.assignments[podUID] = map[string][]Block{} + } + + s.assignments[podUID][containerName] = append([]Block{}, blocks...) + klog.InfoS("Updated memory state", "podUID", podUID, "containerName", containerName) +} + +// SetMemoryAssignments sets ContainerMemoryAssignments by using the passed parameter +func (s *stateMemory) SetMemoryAssignments(assignments ContainerMemoryAssignments) { + s.Lock() + defer s.Unlock() + + s.assignments = assignments.Clone() +} + +// Delete deletes corresponding Blocks from ContainerMemoryAssignments +func (s *stateMemory) Delete(podUID string, containerName string) { + s.Lock() + defer s.Unlock() + + if _, ok := s.assignments[podUID]; !ok { + return + } + + delete(s.assignments[podUID], containerName) + if len(s.assignments[podUID]) == 0 { + delete(s.assignments, podUID) + } + klog.V(2).InfoS("Deleted memory assignment", "podUID", podUID, "containerName", containerName) +} + +// ClearState clears machineState and ContainerMemoryAssignments +func (s *stateMemory) ClearState() { + s.Lock() + defer s.Unlock() + + s.machineState = NUMANodeMap{} + s.assignments = make(ContainerMemoryAssignments) + klog.V(2).InfoS("Cleared state") +} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/node_container_manager_linux.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/node_container_manager_linux.go index fc7864dacc2d..d9132c114641 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/node_container_manager_linux.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/node_container_manager_linux.go @@ -54,7 +54,7 @@ func (cm *containerManagerImpl) createNodeAllocatableCgroups() error { return nil } if err := cm.cgroupManager.Create(cgroupConfig); err != nil { - klog.Errorf("Failed to create %q cgroup", cm.cgroupRoot) + klog.ErrorS(err, "Failed to create cgroup", "cgroupName", cm.cgroupRoot) return err } return nil @@ -72,7 +72,7 @@ func (cm *containerManagerImpl) enforceNodeAllocatableCgroups() error { nodeAllocatable = cm.getNodeAllocatableInternalAbsolute() } - klog.V(4).Infof("Attempting to enforce Node Allocatable with config: %+v", nc) + klog.V(4).InfoS("Attempting to enforce Node Allocatable", "config", nc) cgroupConfig := &CgroupConfig{ Name: cm.cgroupRoot, @@ -109,7 +109,7 @@ func (cm *containerManagerImpl) enforceNodeAllocatableCgroups() error { } // Now apply kube reserved and system reserved limits if required. if nc.EnforceNodeAllocatable.Has(kubetypes.SystemReservedEnforcementKey) { - klog.V(2).Infof("Enforcing System reserved on cgroup %q with limits: %+v", nc.SystemReservedCgroupName, nc.SystemReserved) + klog.V(2).InfoS("Enforcing system reserved on cgroup", "cgroupName", nc.SystemReservedCgroupName, "limits", nc.SystemReserved) if err := enforceExistingCgroup(cm.cgroupManager, cm.cgroupManager.CgroupName(nc.SystemReservedCgroupName), nc.SystemReserved); err != nil { message := fmt.Sprintf("Failed to enforce System Reserved Cgroup Limits on %q: %v", nc.SystemReservedCgroupName, err) cm.recorder.Event(nodeRef, v1.EventTypeWarning, events.FailedNodeAllocatableEnforcement, message) @@ -118,7 +118,7 @@ func (cm *containerManagerImpl) enforceNodeAllocatableCgroups() error { cm.recorder.Eventf(nodeRef, v1.EventTypeNormal, events.SuccessfulNodeAllocatableEnforcement, "Updated limits on system reserved cgroup %v", nc.SystemReservedCgroupName) } if nc.EnforceNodeAllocatable.Has(kubetypes.KubeReservedEnforcementKey) { - klog.V(2).Infof("Enforcing kube reserved on cgroup %q with limits: %+v", nc.KubeReservedCgroupName, nc.KubeReserved) + klog.V(2).InfoS("Enforcing kube reserved on cgroup", "cgroupName", nc.KubeReservedCgroupName, "limits", nc.KubeReserved) if err := enforceExistingCgroup(cm.cgroupManager, cm.cgroupManager.CgroupName(nc.KubeReservedCgroupName), nc.KubeReserved); err != nil { message := fmt.Sprintf("Failed to enforce Kube Reserved Cgroup Limits on %q: %v", nc.KubeReservedCgroupName, err) cm.recorder.Event(nodeRef, v1.EventTypeWarning, events.FailedNodeAllocatableEnforcement, message) @@ -138,7 +138,7 @@ func enforceExistingCgroup(cgroupManager CgroupManager, cName CgroupName, rl v1. if cgroupConfig.ResourceParameters == nil { return fmt.Errorf("%q cgroup is not config properly", cgroupConfig.Name) } - klog.V(4).Infof("Enforcing limits on cgroup %q with %d cpu shares, %d bytes of memory, and %d processes", cName, cgroupConfig.ResourceParameters.CpuShares, cgroupConfig.ResourceParameters.Memory, cgroupConfig.ResourceParameters.PidsLimit) + klog.V(4).InfoS("Enforcing limits on cgroup", "cgroupName", cName, "cpuShares", cgroupConfig.ResourceParameters.CpuShares, "memory", cgroupConfig.ResourceParameters.Memory, "pidsLimit", cgroupConfig.ResourceParameters.PidsLimit) if !cgroupManager.Exists(cgroupConfig.Name) { return fmt.Errorf("%q cgroup does not exist", cgroupConfig.Name) } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/pod_container_manager_linux.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/pod_container_manager_linux.go index b9fa3e05cde0..ce745a3e479e 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/pod_container_manager_linux.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/pod_container_manager_linux.go @@ -135,7 +135,7 @@ func (m *podContainerManagerImpl) killOnePid(pid int) error { // Hate parsing strings, but // vendor/github.com/opencontainers/runc/libcontainer/ // also does this. - klog.V(3).Infof("process with pid %v no longer exists", pid) + klog.V(3).InfoS("Process no longer exists", "pid", pid) return nil } return err @@ -158,23 +158,23 @@ func (m *podContainerManagerImpl) tryKillingCgroupProcesses(podCgroup CgroupName removed := map[int]bool{} for i := 0; i < 5; i++ { if i != 0 { - klog.V(3).Infof("Attempt %v failed to kill all unwanted process from cgroup: %v. Retyring", i, podCgroup) + klog.V(3).InfoS("Attempt failed to kill all unwanted process from cgroup, retrying", "attempt", i, "cgroupName", podCgroup) } errlist = []error{} for _, pid := range pidsToKill { if _, ok := removed[pid]; ok { continue } - klog.V(3).Infof("Attempt to kill process with pid: %v from cgroup: %v", pid, podCgroup) + klog.V(3).InfoS("Attempting to kill process from cgroup", "pid", pid, "cgroupName", podCgroup) if err := m.killOnePid(pid); err != nil { - klog.V(3).Infof("failed to kill process with pid: %v from cgroup: %v", pid, podCgroup) + klog.V(3).InfoS("Failed to kill process from cgroup", "pid", pid, "cgroupName", podCgroup, "err", err) errlist = append(errlist, err) } else { removed[pid] = true } } if len(errlist) == 0 { - klog.V(3).Infof("successfully killed all unwanted processes from cgroup: %v", podCgroup) + klog.V(3).InfoS("Successfully killed all unwanted processes from cgroup", "cgroupName", podCgroup) return nil } } @@ -185,7 +185,7 @@ func (m *podContainerManagerImpl) tryKillingCgroupProcesses(podCgroup CgroupName func (m *podContainerManagerImpl) Destroy(podCgroup CgroupName) error { // Try killing all the processes attached to the pod cgroup if err := m.tryKillingCgroupProcesses(podCgroup); err != nil { - klog.Warningf("failed to kill all the processes attached to the %v cgroups", podCgroup) + klog.InfoS("Failed to kill all the processes attached to cgroup", "cgroupName", podCgroup, "err", err) return fmt.Errorf("failed to kill all the processes attached to the %v cgroups : %v", podCgroup, err) } @@ -195,7 +195,7 @@ func (m *podContainerManagerImpl) Destroy(podCgroup CgroupName) error { ResourceParameters: &ResourceConfig{}, } if err := m.cgroupManager.Destroy(containerConfig); err != nil { - klog.Warningf("failed to delete cgroup paths for %v : %v", podCgroup, err) + klog.InfoS("Failed to delete cgroup paths", "cgroupName", podCgroup, "err", err) return fmt.Errorf("failed to delete cgroup paths for %v : %v", podCgroup, err) } return nil @@ -274,7 +274,7 @@ func (m *podContainerManagerImpl) GetAllPodsFromCgroups() (map[types.UID]CgroupN parts := strings.Split(basePath, podCgroupNamePrefix) // the uid is missing, so we log the unexpected cgroup not of form pod if len(parts) != 2 { - klog.Errorf("pod cgroup manager ignoring unexpected cgroup %v because it is not a pod", cgroupfsPath) + klog.InfoS("Pod cgroup manager ignored unexpected cgroup because it is not a pod", "path", cgroupfsPath) continue } podUID := parts[1] diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/qos_container_manager_linux.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/qos_container_manager_linux.go index eb8fc7d3da3f..084388e4b5cd 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/qos_container_manager_linux.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/qos_container_manager_linux.go @@ -28,11 +28,12 @@ import ( units "github.com/docker/go-units" cgroupfs "github.com/opencontainers/runc/libcontainer/cgroups/fs" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/kubernetes/pkg/api/v1/resource" v1qos "k8s.io/kubernetes/pkg/apis/core/v1/helper/qos" kubefeatures "k8s.io/kubernetes/pkg/features" + "k8s.io/kubernetes/pkg/kubelet/managed" ) const ( @@ -135,7 +136,7 @@ func (m *qosContainerManagerImpl) Start(getNodeAllocatable func() v1.ResourceLis go wait.Until(func() { err := m.UpdateCgroups() if err != nil { - klog.Warningf("[ContainerManager] Failed to reserve QoS requests: %v", err) + klog.InfoS("Failed to reserve QoS requests", "err", err) } }, periodicQOSCgroupUpdateInterval, wait.NeverStop) @@ -170,6 +171,9 @@ func (m *qosContainerManagerImpl) setCPUCgroupConfig(configs map[v1.PodQOSClass] burstablePodCPURequest := int64(0) for i := range pods { pod := pods[i] + if enabled, _ := managed.IsPodManaged(pod); enabled { + continue + } qosClass := v1qos.GetPodQOS(pod) if qosClass != v1.PodQOSBurstable { // we only care about the burstable qos tier @@ -219,17 +223,17 @@ func (m *qosContainerManagerImpl) setMemoryReserve(configs map[v1.PodQOSClass]*C resources := m.getNodeAllocatable() allocatableResource, ok := resources[v1.ResourceMemory] if !ok { - klog.V(2).Infof("[Container Manager] Allocatable memory value could not be determined. Not setting QOS memory limts.") + klog.V(2).InfoS("Allocatable memory value could not be determined, not setting QoS memory limits") return } allocatable := allocatableResource.Value() if allocatable == 0 { - klog.V(2).Infof("[Container Manager] Memory allocatable reported as 0, might be in standalone mode. Not setting QOS memory limts.") + klog.V(2).InfoS("Allocatable memory reported as 0, might be in standalone mode, not setting QoS memory limits") return } for qos, limits := range qosMemoryRequests { - klog.V(2).Infof("[Container Manager] %s pod requests total %d bytes (reserve %d%%)", qos, limits, percentReserve) + klog.V(2).InfoS("QoS pod memory limit", "qos", qos, "limits", limits, "percentReserve", percentReserve) } // Calculate QOS memory limits @@ -249,7 +253,7 @@ func (m *qosContainerManagerImpl) retrySetMemoryReserve(configs map[v1.PodQOSCla for qos, config := range configs { stats, err := m.cgroupManager.GetResourceStats(config.Name) if err != nil { - klog.V(2).Infof("[Container Manager] %v", err) + klog.V(2).InfoS("Failed to get resource stats", "err", err) return } usage := stats.MemoryStats.Usage @@ -307,7 +311,7 @@ func (m *qosContainerManagerImpl) UpdateCgroups() error { } } if updateSuccess { - klog.V(4).Infof("[ContainerManager]: Updated QoS cgroup configuration") + klog.V(4).InfoS("Updated QoS cgroup configuration") return nil } @@ -325,12 +329,12 @@ func (m *qosContainerManagerImpl) UpdateCgroups() error { for _, config := range qosConfigs { err := m.cgroupManager.Update(config) if err != nil { - klog.Errorf("[ContainerManager]: Failed to update QoS cgroup configuration") + klog.ErrorS(err, "Failed to update QoS cgroup configuration") return err } } - klog.V(4).Infof("[ContainerManager]: Updated QoS cgroup configuration") + klog.V(4).InfoS("Updated QoS cgroup configuration") return nil } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/BUILD deleted file mode 100644 index 3405dbc488cb..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/BUILD +++ /dev/null @@ -1,67 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "fake_topology_manager.go", - "policy.go", - "policy_best_effort.go", - "policy_none.go", - "policy_restricted.go", - "policy_single_numa_node.go", - "scope.go", - "scope_container.go", - "scope_pod.go", - "topology_manager.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/cm/topologymanager", - visibility = ["//visibility:public"], - deps = [ - "//pkg/kubelet/cm/topologymanager/bitmask:go_default_library", - "//pkg/kubelet/lifecycle:go_default_library", - "//pkg/kubelet/util/format:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//vendor/github.com/google/cadvisor/info/v1:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/kubelet/cm/topologymanager/bitmask:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = [ - "fake_topology_manager_test.go", - "policy_best_effort_test.go", - "policy_none_test.go", - "policy_restricted_test.go", - "policy_single_numa_node_test.go", - "policy_test.go", - "scope_container_test.go", - "scope_pod_test.go", - "scope_test.go", - "topology_manager_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/cm/topologymanager/bitmask:go_default_library", - "//pkg/kubelet/lifecycle:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/bitmask/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/bitmask/BUILD deleted file mode 100644 index 8d89cfe4751d..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/bitmask/BUILD +++ /dev/null @@ -1,28 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["bitmask.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/bitmask", - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["bitmask_test.go"], - embed = [":go_default_library"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/fake_topology_manager.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/fake_topology_manager.go index a21e50c555a8..063cac65a27d 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/fake_topology_manager.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/fake_topology_manager.go @@ -20,38 +20,37 @@ import ( "k8s.io/api/core/v1" "k8s.io/klog/v2" "k8s.io/kubernetes/pkg/kubelet/lifecycle" - "k8s.io/kubernetes/pkg/kubelet/util/format" ) type fakeManager struct{} //NewFakeManager returns an instance of FakeManager func NewFakeManager() Manager { - klog.Infof("[fake topologymanager] NewFakeManager") + klog.InfoS("NewFakeManager") return &fakeManager{} } func (m *fakeManager) GetAffinity(podUID string, containerName string) TopologyHint { - klog.Infof("[fake topologymanager] GetAffinity pod: %v container name: %v", podUID, containerName) + klog.InfoS("GetAffinity", "podUID", podUID, "containerName", containerName) return TopologyHint{} } func (m *fakeManager) AddHintProvider(h HintProvider) { - klog.Infof("[fake topologymanager] AddHintProvider HintProvider: %v", h) + klog.InfoS("AddHintProvider", "hintProvider", h) } func (m *fakeManager) AddContainer(pod *v1.Pod, containerID string) error { - klog.Infof("[fake topologymanager] AddContainer pod: %v container id: %v", format.Pod(pod), containerID) + klog.InfoS("AddContainer", "pod", klog.KObj(pod), "containerID", containerID) return nil } func (m *fakeManager) RemoveContainer(containerID string) error { - klog.Infof("[fake topologymanager] RemoveContainer container id: %v", containerID) + klog.InfoS("RemoveContainer", "containerID", containerID) return nil } func (m *fakeManager) Admit(attrs *lifecycle.PodAdmitAttributes) lifecycle.PodAdmitResult { - klog.Infof("[fake topologymanager] Topology Admit Handler") + klog.InfoS("Topology Admit Handler") return lifecycle.PodAdmitResult{ Admit: true, } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/policy.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/policy.go index 08a4d9e28e2a..b548e4afdbe5 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/policy.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/policy.go @@ -67,7 +67,7 @@ func filterProvidersHints(providersHints []map[string][]TopologyHint) [][]Topolo for _, hints := range providersHints { // If hints is nil, insert a single, preferred any-numa hint into allProviderHints. if len(hints) == 0 { - klog.Infof("[topologymanager] Hint Provider has no preference for NUMA affinity with any resource") + klog.InfoS("Hint Provider has no preference for NUMA affinity with any resource") allProviderHints = append(allProviderHints, []TopologyHint{{nil, true}}) continue } @@ -75,13 +75,13 @@ func filterProvidersHints(providersHints []map[string][]TopologyHint) [][]Topolo // Otherwise, accumulate the hints for each resource type into allProviderHints. for resource := range hints { if hints[resource] == nil { - klog.Infof("[topologymanager] Hint Provider has no preference for NUMA affinity with resource '%s'", resource) + klog.InfoS("Hint Provider has no preference for NUMA affinity with resource", "resource", resource) allProviderHints = append(allProviderHints, []TopologyHint{{nil, true}}) continue } if len(hints[resource]) == 0 { - klog.Infof("[topologymanager] Hint Provider has no possible NUMA affinities for resource '%s'", resource) + klog.InfoS("Hint Provider has no possible NUMA affinities for resource", "resource", resource) allProviderHints = append(allProviderHints, []TopologyHint{{nil, false}}) continue } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/scope.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/scope.go index d26636298b52..af90663368a4 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/scope.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/scope.go @@ -68,10 +68,26 @@ func (s *scope) Name() string { return s.name } -func (s *scope) GetAffinity(podUID string, containerName string) TopologyHint { +func (s *scope) getTopologyHints(podUID string, containerName string) TopologyHint { + s.mutex.Lock() + defer s.mutex.Unlock() return s.podTopologyHints[podUID][containerName] } +func (s *scope) setTopologyHints(podUID string, containerName string, th TopologyHint) { + s.mutex.Lock() + defer s.mutex.Unlock() + + if s.podTopologyHints[podUID] == nil { + s.podTopologyHints[podUID] = make(map[string]TopologyHint) + } + s.podTopologyHints[podUID][containerName] = th +} + +func (s *scope) GetAffinity(podUID string, containerName string) TopologyHint { + return s.getTopologyHints(podUID, containerName) +} + func (s *scope) AddHintProvider(h HintProvider) { s.hintProviders = append(s.hintProviders, h) } @@ -92,7 +108,7 @@ func (s *scope) RemoveContainer(containerID string) error { s.mutex.Lock() defer s.mutex.Unlock() - klog.Infof("[topologymanager] RemoveContainer - Container ID: %v", containerID) + klog.InfoS("RemoveContainer", "containerID", containerID) podUIDString := s.podMap[containerID] delete(s.podMap, containerID) if _, exists := s.podTopologyHints[podUIDString]; exists { diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/scope_container.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/scope_container.go index 4908e5f047e7..e5d331e00e92 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/scope_container.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/scope_container.go @@ -20,7 +20,6 @@ import ( "k8s.io/api/core/v1" "k8s.io/klog/v2" "k8s.io/kubernetes/pkg/kubelet/lifecycle" - "k8s.io/kubernetes/pkg/kubelet/util/format" ) type containerScope struct { @@ -50,18 +49,14 @@ func (s *containerScope) Admit(pod *v1.Pod) lifecycle.PodAdmitResult { for _, container := range append(pod.Spec.InitContainers, pod.Spec.Containers...) { bestHint, admit := s.calculateAffinity(pod, &container) - klog.Infof("[topologymanager] Best TopologyHint for (pod: %v container: %v): %v", format.Pod(pod), container.Name, bestHint) + klog.InfoS("Best TopologyHint", "bestHint", bestHint, "pod", klog.KObj(pod), "containerName", container.Name) if !admit { return topologyAffinityError() } + klog.InfoS("Topology Affinity", "bestHint", bestHint, "pod", klog.KObj(pod), "containerName", container.Name) + s.setTopologyHints(string(pod.UID), container.Name, bestHint) - if (s.podTopologyHints)[string(pod.UID)] == nil { - (s.podTopologyHints)[string(pod.UID)] = make(map[string]TopologyHint) - } - - klog.Infof("[topologymanager] Topology Affinity for (pod: %v container: %v): %v", format.Pod(pod), container.Name, bestHint) - (s.podTopologyHints)[string(pod.UID)][container.Name] = bestHint err := s.allocateAlignedResources(pod, &container) if err != nil { return unexpectedAdmissionError(err) @@ -77,7 +72,7 @@ func (s *containerScope) accumulateProvidersHints(pod *v1.Pod, container *v1.Con // Get the TopologyHints for a Container from a provider. hints := provider.GetTopologyHints(pod, container) providersHints = append(providersHints, hints) - klog.Infof("[topologymanager] TopologyHints for pod '%v', container '%v': %v", format.Pod(pod), container.Name, hints) + klog.InfoS("TopologyHints", "hints", hints, "pod", klog.KObj(pod), "containerName", container.Name) } return providersHints } @@ -85,6 +80,6 @@ func (s *containerScope) accumulateProvidersHints(pod *v1.Pod, container *v1.Con func (s *containerScope) calculateAffinity(pod *v1.Pod, container *v1.Container) (TopologyHint, bool) { providersHints := s.accumulateProvidersHints(pod, container) bestHint, admit := s.policy.Merge(providersHints) - klog.Infof("[topologymanager] ContainerTopologyHint: %v", bestHint) + klog.InfoS("ContainerTopologyHint", "bestHint", bestHint) return bestHint, admit } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/scope_pod.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/scope_pod.go index 033577d2d64f..f4645bc4d768 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/scope_pod.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/scope_pod.go @@ -20,7 +20,6 @@ import ( "k8s.io/api/core/v1" "k8s.io/klog/v2" "k8s.io/kubernetes/pkg/kubelet/lifecycle" - "k8s.io/kubernetes/pkg/kubelet/util/format" ) type podScope struct { @@ -49,19 +48,14 @@ func (s *podScope) Admit(pod *v1.Pod) lifecycle.PodAdmitResult { } bestHint, admit := s.calculateAffinity(pod) - klog.Infof("[topologymanager] Best TopologyHint for (pod: %v): %v", format.Pod(pod), bestHint) + klog.InfoS("Best TopologyHint", "bestHint", bestHint, "pod", klog.KObj(pod)) if !admit { return topologyAffinityError() } for _, container := range append(pod.Spec.InitContainers, pod.Spec.Containers...) { - klog.Infof("[topologymanager] Topology Affinity for (pod: %v container: %v): %v", format.Pod(pod), container.Name, bestHint) - - if (s.podTopologyHints)[string(pod.UID)] == nil { - (s.podTopologyHints)[string(pod.UID)] = make(map[string]TopologyHint) - } - - (s.podTopologyHints)[string(pod.UID)][container.Name] = bestHint + klog.InfoS("Topology Affinity", "bestHint", bestHint, "pod", klog.KObj(pod), "containerName", container.Name) + s.setTopologyHints(string(pod.UID), container.Name, bestHint) err := s.allocateAlignedResources(pod, &container) if err != nil { @@ -78,7 +72,7 @@ func (s *podScope) accumulateProvidersHints(pod *v1.Pod) []map[string][]Topology // Get the TopologyHints for a Pod from a provider. hints := provider.GetPodTopologyHints(pod) providersHints = append(providersHints, hints) - klog.Infof("[topologymanager] TopologyHints for pod '%v': %v", format.Pod(pod), hints) + klog.InfoS("TopologyHints", "hints", hints, "pod", klog.KObj(pod)) } return providersHints } @@ -86,6 +80,6 @@ func (s *podScope) accumulateProvidersHints(pod *v1.Pod) []map[string][]Topology func (s *podScope) calculateAffinity(pod *v1.Pod) (TopologyHint, bool) { providersHints := s.accumulateProvidersHints(pod) bestHint, admit := s.policy.Merge(providersHints) - klog.Infof("[topologymanager] PodTopologyHint: %v", bestHint) + klog.InfoS("PodTopologyHint", "bestHint", bestHint) return bestHint, admit } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/topology_manager.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/topology_manager.go index 00ebf490bd35..f1e435260dec 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/topology_manager.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/topology_manager.go @@ -117,7 +117,7 @@ var _ Manager = &manager{} // NewManager creates a new TopologyManager based on provided policy and scope func NewManager(topology []cadvisorapi.Node, topologyPolicyName string, topologyScopeName string) (Manager, error) { - klog.Infof("[topologymanager] Creating topology manager with %s policy per %s scope", topologyPolicyName, topologyScopeName) + klog.InfoS("Creating topology manager with policy per scope", "topologyPolicyName", topologyPolicyName, "topologyScopeName", topologyScopeName) var numaNodes []int for _, node := range topology { @@ -184,7 +184,7 @@ func (m *manager) RemoveContainer(containerID string) error { } func (m *manager) Admit(attrs *lifecycle.PodAdmitAttributes) lifecycle.PodAdmitResult { - klog.Infof("[topologymanager] Topology Admit Handler") + klog.InfoS("Topology Admit Handler") pod := attrs.Pod return m.scope.Admit(pod) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/util/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/util/BUILD deleted file mode 100644 index ffaa15864599..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/util/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "cgroups_linux.go", - "cgroups_unsupported.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/cm/util", - deps = select({ - "@io_bazel_rules_go//go/platform:android": [ - "//vendor/github.com/opencontainers/runc/libcontainer/cgroups:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/utils:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//vendor/github.com/opencontainers/runc/libcontainer/cgroups:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/utils:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/config/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/config/BUILD deleted file mode 100644 index b090d49d644c..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/config/BUILD +++ /dev/null @@ -1,114 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "apiserver.go", - "common.go", - "config.go", - "defaults.go", - "doc.go", - "file.go", - "file_linux.go", - "file_unsupported.go", - "flags.go", - "http.go", - "sources.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/config", - visibility = ["//visibility:public"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/helper:go_default_library", - "//pkg/apis/core/install:go_default_library", - "//pkg/apis/core/v1:go_default_library", - "//pkg/apis/core/validation:go_default_library", - "//pkg/features:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/events:go_default_library", - "//pkg/kubelet/types:go_default_library", - "//pkg/kubelet/util/format:go_default_library", - "//pkg/util/config:go_default_library", - "//pkg/util/hash:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/yaml:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//vendor/github.com/spf13/pflag:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/io:go_default_library", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//vendor/github.com/fsnotify/fsnotify:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//vendor/github.com/fsnotify/fsnotify:go_default_library", - ], - "//conditions:default": [], - }), -) - -go_test( - name = "go_default_test", - srcs = [ - "apiserver_test.go", - "common_test.go", - "config_test.go", - "file_linux_test.go", - "file_test.go", - "http_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/v1:go_default_library", - "//pkg/apis/core/validation:go_default_library", - "//pkg/kubelet/types:go_default_library", - "//pkg/securitycontext:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/client-go/util/testing:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/config/apiserver.go b/vendor/k8s.io/kubernetes/pkg/kubelet/config/apiserver.go index 2f29ddd576ff..5369cb285d37 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/config/apiserver.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/config/apiserver.go @@ -17,20 +17,19 @@ limitations under the License. package config import ( - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/wait" clientset "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/cache" - api "k8s.io/kubernetes/pkg/apis/core" kubetypes "k8s.io/kubernetes/pkg/kubelet/types" ) // NewSourceApiserver creates a config source that watches and pulls from the apiserver. func NewSourceApiserver(c clientset.Interface, nodeName types.NodeName, updates chan<- interface{}) { - lw := cache.NewListWatchFromClient(c.CoreV1().RESTClient(), "pods", metav1.NamespaceAll, fields.OneTermEqualSelector(api.PodHostField, string(nodeName))) + lw := cache.NewListWatchFromClient(c.CoreV1().RESTClient(), "pods", metav1.NamespaceAll, fields.OneTermEqualSelector("spec.nodeName", string(nodeName))) newSourceApiserverFromLW(lw, updates) } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/config/common.go b/vendor/k8s.io/kubernetes/pkg/kubelet/config/common.go index 2a5733d4f480..20456622a529 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/config/common.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/config/common.go @@ -68,16 +68,16 @@ func applyDefaults(pod *api.Pod, source string, isFile bool, nodeName types.Node fmt.Fprintf(hasher, "url:%s", source) } pod.UID = types.UID(hex.EncodeToString(hasher.Sum(nil)[0:])) - klog.V(5).Infof("Generated UID %q pod %q from %s", pod.UID, pod.Name, source) + klog.V(5).InfoS("Generated UID", "pod", klog.KObj(pod), "podUID", pod.UID, "source", source) } pod.Name = generatePodName(pod.Name, nodeName) - klog.V(5).Infof("Generated Name %q for UID %q from URL %s", pod.Name, pod.UID, source) + klog.V(5).InfoS("Generated pod name", "pod", klog.KObj(pod), "podUID", pod.UID, "source", source) if pod.Namespace == "" { pod.Namespace = metav1.NamespaceDefault } - klog.V(5).Infof("Using namespace %q for pod %q from %s", pod.Namespace, pod.Name, source) + klog.V(5).InfoS("Set namespace for pod", "pod", klog.KObj(pod), "source", source) // Set the Host field to indicate this pod is scheduled on the current node. pod.Spec.NodeName = string(nodeName) @@ -145,7 +145,7 @@ func tryDecodeSinglePod(data []byte, defaultFn defaultFunc) (parsed bool, pod *v } v1Pod := &v1.Pod{} if err := k8s_api_v1.Convert_core_Pod_To_v1_Pod(newPod, v1Pod, nil); err != nil { - klog.Errorf("Pod %q failed to convert to v1", newPod.Name) + klog.ErrorS(err, "Pod failed to convert to v1", "pod", klog.KObj(newPod)) return true, nil, err } return true, v1Pod, nil diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/config/config.go b/vendor/k8s.io/kubernetes/pkg/kubelet/config/config.go index b04fdb8f967e..ca9a460c20ea 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/config/config.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/config/config.go @@ -94,7 +94,7 @@ func (c *PodConfig) SeenAllSources(seenSources sets.String) bool { if c.pods == nil { return false } - klog.V(5).Infof("Looking for %v, have seen %v", c.sources.List(), seenSources) + klog.V(5).InfoS("Looking for sources, have seen", "sources", c.sources.List(), "seenSources", seenSources) return seenSources.HasAll(c.sources.List()...) && c.pods.seenSources(c.sources.List()...) } @@ -254,16 +254,16 @@ func (s *podStorage) merge(source string, change interface{}) (adds, updates, de switch update.Op { case kubetypes.ADD, kubetypes.UPDATE, kubetypes.DELETE: if update.Op == kubetypes.ADD { - klog.V(4).Infof("Adding new pods from source %s : %v", source, update.Pods) + klog.V(4).InfoS("Adding new pods from source", "source", source, "pods", format.Pods(update.Pods)) } else if update.Op == kubetypes.DELETE { - klog.V(4).Infof("Graceful deleting pods from source %s : %v", source, update.Pods) + klog.V(4).InfoS("Gracefully deleting pods from source", "source", source, "pods", format.Pods(update.Pods)) } else { - klog.V(4).Infof("Updating pods from source %s : %v", source, update.Pods) + klog.V(4).InfoS("Updating pods from source", "source", source, "pods", format.Pods(update.Pods)) } updatePodsFunc(update.Pods, pods, pods) case kubetypes.REMOVE: - klog.V(4).Infof("Removing pods from source %s : %v", source, update.Pods) + klog.V(4).InfoS("Removing pods from source", "source", source, "pods", format.Pods(update.Pods)) for _, value := range update.Pods { if existing, found := pods[value.UID]; found { // this is a delete @@ -275,7 +275,7 @@ func (s *podStorage) merge(source string, change interface{}) (adds, updates, de } case kubetypes.SET: - klog.V(4).Infof("Setting pods for source %s", source) + klog.V(4).InfoS("Setting pods for source", "source", source) s.markSourceSet(source) // Clear the old map entries by just creating a new map oldPods := pods @@ -289,7 +289,7 @@ func (s *podStorage) merge(source string, change interface{}) (adds, updates, de } default: - klog.Warningf("Received invalid update type: %v", update) + klog.InfoS("Received invalid update type", "type", update) } @@ -323,7 +323,7 @@ func filterInvalidPods(pods []*v1.Pod, source string, recorder record.EventRecor // This function only checks if there is any naming conflict. name := kubecontainer.GetPodFullName(pod) if names.Has(name) { - klog.Warningf("Pod[%d] (%s) from %s failed validation due to duplicate pod name %q, ignoring", i+1, format.Pod(pod), source, pod.Name) + klog.InfoS("Pod failed validation due to duplicate pod name, ignoring", "index", i, "pod", klog.KObj(pod), "source", source) recorder.Eventf(pod, v1.EventTypeWarning, events.FailedValidation, "Error validating pod %s from %s due to duplicate pod name %q, ignoring", format.Pod(pod), source, pod.Name) continue } else { @@ -380,7 +380,7 @@ func isAnnotationMapEqual(existingMap, candidateMap map[string]string) bool { // recordFirstSeenTime records the first seen time of this pod. func recordFirstSeenTime(pod *v1.Pod) { - klog.V(4).Infof("Receiving a new pod %q", format.Pod(pod)) + klog.V(4).InfoS("Receiving a new pod", "pod", klog.KObj(pod)) pod.Annotations[kubetypes.ConfigFirstSeenAnnotationKey] = kubetypes.NewTimestamp().GetString() } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/config/file.go b/vendor/k8s.io/kubernetes/pkg/kubelet/config/file.go index 68b5d3d22bdd..8984f5dee483 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/config/file.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/config/file.go @@ -65,7 +65,7 @@ func NewSourceFile(path string, nodeName types.NodeName, period time.Duration, u path = strings.TrimRight(path, string(os.PathSeparator)) config := newSourceFile(path, nodeName, period, updates) - klog.V(1).Infof("Watching path %q", path) + klog.V(1).InfoS("Watching path", "path", path) config.run() } @@ -95,17 +95,17 @@ func (s *sourceFile) run() { go func() { // Read path immediately to speed up startup. if err := s.listConfig(); err != nil { - klog.Errorf("Unable to read config path %q: %v", s.path, err) + klog.ErrorS(err, "Unable to read config path", "path", s.path) } for { select { case <-listTicker.C: if err := s.listConfig(); err != nil { - klog.Errorf("Unable to read config path %q: %v", s.path, err) + klog.ErrorS(err, "Unable to read config path", "path", s.path) } case e := <-s.watchEvents: if err := s.consumeWatchEvent(e); err != nil { - klog.Errorf("Unable to process watch event: %v", err) + klog.ErrorS(err, "Unable to process watch event") } } } @@ -173,24 +173,24 @@ func (s *sourceFile) extractFromDir(name string) ([]*v1.Pod, error) { for _, path := range dirents { statInfo, err := os.Stat(path) if err != nil { - klog.Errorf("Can't get metadata for %q: %v", path, err) + klog.ErrorS(err, "Could not get metadata", "path", path) continue } switch { case statInfo.Mode().IsDir(): - klog.Errorf("Not recursing into manifest path %q", path) + klog.ErrorS(nil, "Provided manifest path is a directory, not recursing into manifest path", "path", path) case statInfo.Mode().IsRegular(): pod, err := s.extractFromFile(path) if err != nil { if !os.IsNotExist(err) { - klog.Errorf("Can't process manifest file %q: %v", path, err) + klog.ErrorS(err, "Could not process manifest file", "path", path) } } else { pods = append(pods, pod) } default: - klog.Errorf("Manifest path %q is not a directory or file: %v", path, statInfo.Mode()) + klog.ErrorS(nil, "Manifest path is not a directory or file", "path", path, "mode", statInfo.Mode()) } } return pods, nil @@ -198,7 +198,7 @@ func (s *sourceFile) extractFromDir(name string) ([]*v1.Pod, error) { // extractFromFile parses a file for Pod configuration information. func (s *sourceFile) extractFromFile(filename string) (pod *v1.Pod, err error) { - klog.V(3).Infof("Reading config file %q", filename) + klog.V(3).InfoS("Reading config file", "path", filename) defer func() { if err == nil && pod != nil { objKey, keyErr := cache.MetaNamespaceKeyFunc(pod) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/config/file_linux.go b/vendor/k8s.io/kubernetes/pkg/kubelet/config/file_linux.go index f1938afa1a5e..11f8891173b8 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/config/file_linux.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/config/file_linux.go @@ -28,9 +28,10 @@ import ( "github.com/fsnotify/fsnotify" "k8s.io/klog/v2" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/client-go/util/flowcontrol" + "k8s.io/kubernetes/pkg/kubelet/managed" kubetypes "k8s.io/kubernetes/pkg/kubelet/types" ) @@ -57,7 +58,7 @@ func (s *sourceFile) startWatch() { } if err := s.doWatch(); err != nil { - klog.Errorf("Unable to read config path %q: %v", s.path, err) + klog.ErrorS(err, "Unable to read config path", "path", s.path) if _, retryable := err.(*retryableError); !retryable { backOff.Next(backOffID, time.Now()) } @@ -102,7 +103,7 @@ func (s *sourceFile) doWatch() error { func (s *sourceFile) produceWatchEvent(e *fsnotify.Event) error { // Ignore file start with dots if strings.HasPrefix(filepath.Base(e.Name), ".") { - klog.V(4).Infof("Ignored pod manifest: %s, because it starts with dots", e.Name) + klog.V(4).InfoS("Ignored pod manifest, because it starts with dots", "eventName", e.Name) return nil } var eventType podEventType @@ -133,6 +134,9 @@ func (s *sourceFile) consumeWatchEvent(e *watchEvent) error { if err != nil { return fmt.Errorf("can't process config file %q: %v", e.fileName, err) } + if managed.IsEnabled() { + managed.ModifyStaticPodForPinnedManagement(pod) + } return s.store.Add(pod) case podDelete: if objKey, keyExist := s.fileKeyMapping[e.fileName]; keyExist { diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/config/file_unsupported.go b/vendor/k8s.io/kubernetes/pkg/kubelet/config/file_unsupported.go index 5b58246763a2..7a262f421d92 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/config/file_unsupported.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/config/file_unsupported.go @@ -25,7 +25,7 @@ import ( ) func (s *sourceFile) startWatch() { - klog.Errorf("Watching source file is unsupported in this build") + klog.ErrorS(nil, "Watching source file is unsupported in this build") } func (s *sourceFile) consumeWatchEvent(e *watchEvent) error { diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/config/flags.go b/vendor/k8s.io/kubernetes/pkg/kubelet/config/flags.go index 1fc61dcfca1f..9fd5fe6b3030 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/config/flags.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/config/flags.go @@ -94,16 +94,24 @@ func (s *ContainerRuntimeOptions) AddFlags(fs *pflag.FlagSet) { // Docker-specific settings. fs.StringVar(&s.DockershimRootDirectory, "experimental-dockershim-root-directory", s.DockershimRootDirectory, "Path to the dockershim root directory.") fs.MarkHidden("experimental-dockershim-root-directory") - fs.StringVar(&s.PodSandboxImage, "pod-infra-container-image", s.PodSandboxImage, fmt.Sprintf("The image whose network/ipc namespaces containers in each pod will use. %s", dockerOnlyWarning)) + fs.StringVar(&s.PodSandboxImage, "pod-infra-container-image", s.PodSandboxImage, fmt.Sprintf("Specified image will not be pruned by the image garbage collector. "+ + "When container-runtime is set to 'docker', all containers in each pod will use the network/ipc namespaces from this image. Other CRI implementations have their own configuration to set this image.")) fs.StringVar(&s.DockerEndpoint, "docker-endpoint", s.DockerEndpoint, fmt.Sprintf("Use this for the docker endpoint to communicate with. %s", dockerOnlyWarning)) + fs.MarkDeprecated("docker-endpoint", "will be removed along with dockershim.") fs.DurationVar(&s.ImagePullProgressDeadline.Duration, "image-pull-progress-deadline", s.ImagePullProgressDeadline.Duration, fmt.Sprintf("If no pulling progress is made before this deadline, the image pulling will be cancelled. %s", dockerOnlyWarning)) + fs.MarkDeprecated("image-pull-progress-deadline", "will be removed along with dockershim.") // Network plugin settings for Docker. fs.StringVar(&s.NetworkPluginName, "network-plugin", s.NetworkPluginName, fmt.Sprintf("The name of the network plugin to be invoked for various events in kubelet/pod lifecycle. %s", dockerOnlyWarning)) + fs.MarkDeprecated("network-plugin", "will be removed along with dockershim.") fs.StringVar(&s.CNIConfDir, "cni-conf-dir", s.CNIConfDir, fmt.Sprintf("The full path of the directory in which to search for CNI config files. %s", dockerOnlyWarning)) + fs.MarkDeprecated("cni-conf-dir", "will be removed along with dockershim.") fs.StringVar(&s.CNIBinDir, "cni-bin-dir", s.CNIBinDir, fmt.Sprintf("A comma-separated list of full paths of directories in which to search for CNI plugin binaries. %s", dockerOnlyWarning)) + fs.MarkDeprecated("cni-bin-dir", "will be removed along with dockershim.") fs.StringVar(&s.CNICacheDir, "cni-cache-dir", s.CNICacheDir, fmt.Sprintf("The full path of the directory in which CNI should store cache files. %s", dockerOnlyWarning)) + fs.MarkDeprecated("cni-cache-dir", "will be removed along with dockershim.") fs.Int32Var(&s.NetworkPluginMTU, "network-plugin-mtu", s.NetworkPluginMTU, fmt.Sprintf("The MTU to be passed to the network plugin, to override the default. Set to 0 to use the default 1460 MTU. %s", dockerOnlyWarning)) + fs.MarkDeprecated("network-plugin-mtu", "will be removed along with dockershim.") // Image credential provider settings. fs.StringVar(&s.ImageCredentialProviderConfigFile, "image-credential-provider-config", s.ImageCredentialProviderConfigFile, "The path to the credential provider plugin config file.") diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/config/http.go b/vendor/k8s.io/kubernetes/pkg/kubelet/config/http.go index 710abb089b0e..b0b49e517c37 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/config/http.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/config/http.go @@ -54,7 +54,7 @@ func NewSourceURL(url string, header http.Header, nodeName types.NodeName, perio // read the manifest URL passed to kubelet. client: &http.Client{Timeout: 10 * time.Second}, } - klog.V(1).Infof("Watching URL %s", url) + klog.V(1).InfoS("Watching URL", "URL", url) go wait.Until(config.run, period, wait.NeverStop) } @@ -63,16 +63,16 @@ func (s *sourceURL) run() { // Don't log this multiple times per minute. The first few entries should be // enough to get the point across. if s.failureLogs < 3 { - klog.Warningf("Failed to read pods from URL: %v", err) + klog.InfoS("Failed to read pods from URL", "err", err) } else if s.failureLogs == 3 { - klog.Warningf("Failed to read pods from URL. Dropping verbosity of this message to V(4): %v", err) + klog.InfoS("Failed to read pods from URL. Dropping verbosity of this message to V(4)", "err", err) } else { - klog.V(4).Infof("Failed to read pods from URL: %v", err) + klog.V(4).InfoS("Failed to read pods from URL", "err", err) } s.failureLogs++ } else { if s.failureLogs > 0 { - klog.Info("Successfully read pods from URL.") + klog.InfoS("Successfully read pods from URL") s.failureLogs = 0 } } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/configmap/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/configmap/BUILD deleted file mode 100644 index fcba1122076d..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/configmap/BUILD +++ /dev/null @@ -1,56 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "configmap_manager.go", - "fake_manager.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/configmap", - deps = [ - "//pkg/api/v1/pod:go_default_library", - "//pkg/apis/core/v1:go_default_library", - "//pkg/kubelet/util/manager:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["configmap_manager_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/util/manager:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/configmap/configmap_manager.go b/vendor/k8s.io/kubernetes/pkg/kubelet/configmap/configmap_manager.go index 2f525357df5b..5466dd8b3212 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/configmap/configmap_manager.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/configmap/configmap_manager.go @@ -135,7 +135,7 @@ func NewCachingConfigMapManager(kubeClient clientset.Interface, getTTL manager.G // - whenever a pod is created or updated, we start individual watches for all // referenced objects that aren't referenced from other registered pods // - every GetObject() returns a value from local cache propagated via watches -func NewWatchingConfigMapManager(kubeClient clientset.Interface) Manager { +func NewWatchingConfigMapManager(kubeClient clientset.Interface, resyncInterval time.Duration) Manager { listConfigMap := func(namespace string, opts metav1.ListOptions) (runtime.Object, error) { return kubeClient.CoreV1().ConfigMaps(namespace).List(context.TODO(), opts) } @@ -153,6 +153,6 @@ func NewWatchingConfigMapManager(kubeClient clientset.Interface) Manager { } gr := corev1.Resource("configmap") return &configMapManager{ - manager: manager.NewWatchBasedManager(listConfigMap, watchConfigMap, newConfigMap, isImmutable, gr, getConfigMapNames), + manager: manager.NewWatchBasedManager(listConfigMap, watchConfigMap, newConfigMap, isImmutable, gr, resyncInterval, getConfigMapNames), } } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/container/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/container/BUILD deleted file mode 100644 index 970139acaeb7..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/container/BUILD +++ /dev/null @@ -1,84 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "cache.go", - "container_gc.go", - "helpers.go", - "os.go", - "ref.go", - "resize.go", - "runtime.go", - "runtime_cache.go", - "runtime_cache_fake.go", - "sync_result.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/container", - visibility = ["//visibility:public"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/api/v1/pod:go_default_library", - "//pkg/features:go_default_library", - "//pkg/kubelet/util/format:go_default_library", - "//pkg/util/hash:go_default_library", - "//pkg/volume:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/client-go/tools/reference:go_default_library", - "//staging/src/k8s.io/client-go/tools/remotecommand:go_default_library", - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/cri-api/pkg/apis/runtime/v1alpha2:go_default_library", - "//third_party/forked/golang/expansion:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "cache_test.go", - "container_hash_test.go", - "helpers_test.go", - "ref_test.go", - "runtime_cache_test.go", - "sync_result_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core/install:go_default_library", - "//pkg/features:go_default_library", - "//pkg/kubelet/container/testing:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - "//vendor/github.com/google/go-cmp/cmp:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/kubelet/container/testing:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/container/container_gc.go b/vendor/k8s.io/kubernetes/pkg/kubelet/container/container_gc.go index 1b3cb192c21a..c1df294a9639 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/container/container_gc.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/container/container_gc.go @@ -82,6 +82,6 @@ func (cgc *realContainerGC) GarbageCollect() error { } func (cgc *realContainerGC) DeleteAllUnusedContainers() error { - klog.Infof("attempting to delete unused containers") + klog.InfoS("Attempting to delete unused containers") return cgc.runtime.GarbageCollect(cgc.policy, cgc.sourcesReadyProvider.AllReady(), true) } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/container/helpers.go b/vendor/k8s.io/kubernetes/pkg/kubelet/container/helpers.go index 4b207b99d848..7e3314fec017 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/container/helpers.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/container/helpers.go @@ -31,7 +31,6 @@ import ( "k8s.io/client-go/tools/record" runtimeapi "k8s.io/cri-api/pkg/apis/runtime/v1alpha2" podutil "k8s.io/kubernetes/pkg/api/v1/pod" - "k8s.io/kubernetes/pkg/kubelet/util/format" hashutil "k8s.io/kubernetes/pkg/util/hash" "k8s.io/kubernetes/third_party/forked/golang/expansion" utilsnet "k8s.io/utils/net" @@ -82,13 +81,13 @@ func ShouldContainerBeRestarted(container *v1.Container, pod *v1.Pod, podStatus } // Check RestartPolicy for dead container if pod.Spec.RestartPolicy == v1.RestartPolicyNever { - klog.V(4).Infof("Already ran container %q of pod %q, do nothing", container.Name, format.Pod(pod)) + klog.V(4).InfoS("Already ran container, do nothing", "pod", klog.KObj(pod), "containerName", container.Name) return false } if pod.Spec.RestartPolicy == v1.RestartPolicyOnFailure { // Check the exit code. if status.ExitCode == 0 { - klog.V(4).Infof("Already successfully ran container %q of pod %q, do nothing", container.Name, format.Pod(pod)) + klog.V(4).InfoS("Already successfully ran container, do nothing", "pod", klog.KObj(pod), "containerName", container.Name) return false } } @@ -341,7 +340,7 @@ func MakePortMappings(container *v1.Container) (ports []PortMapping) { // Protect against a port name being used more than once in a container. if _, ok := names[name]; ok { - klog.Warningf("Port name conflicted, %q is defined more than once", name) + klog.InfoS("Port name conflicted, it is defined more than once", "portName", name) continue } ports = append(ports, pm) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/container/runtime.go b/vendor/k8s.io/kubernetes/pkg/kubelet/container/runtime.go index b8014cea5f2e..52180087a155 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/container/runtime.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/container/runtime.go @@ -204,7 +204,7 @@ func BuildContainerID(typ, ID string) ContainerID { func ParseContainerID(containerID string) ContainerID { var id ContainerID if err := id.ParseString(containerID); err != nil { - klog.Error(err) + klog.ErrorS(err, "Parsing containerID failed") } return id } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/container/testing/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/container/testing/BUILD deleted file mode 100644 index 1b6ed00bc556..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/container/testing/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "fake_cache.go", - "fake_runtime.go", - "fake_runtime_helper.go", - "mock_runtime_cache.go", - "mockfileinfo.go", - "os.go", - "runtime_mock.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/container/testing", - visibility = ["//visibility:public"], - deps = [ - "//pkg/kubelet/container:go_default_library", - "//pkg/volume:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/client-go/tools/remotecommand:go_default_library", - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/cri-api/pkg/apis/runtime/v1alpha2:go_default_library", - "//vendor/github.com/golang/mock/gomock:go_default_library", - "//vendor/github.com/stretchr/testify/mock:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/container/testing/fake_runtime.go b/vendor/k8s.io/kubernetes/pkg/kubelet/container/testing/fake_runtime.go index 6598c727920f..4e50b2c53c71 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/container/testing/fake_runtime.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/container/testing/fake_runtime.go @@ -18,11 +18,11 @@ package testing import ( "context" - "fmt" "io" "net/url" "reflect" "sync" + "testing" "time" v1 "k8s.io/api/core/v1" @@ -58,6 +58,7 @@ type FakeRuntime struct { Err error InspectErr error StatusErr error + T *testing.T } const FakeHost = "localhost:12345" @@ -135,39 +136,40 @@ func (f *FakeRuntime) UpdatePodCIDR(c string) error { return nil } -func (f *FakeRuntime) assertList(expect []string, test []string) error { +func (f *FakeRuntime) assertList(expect []string, test []string) bool { if !reflect.DeepEqual(expect, test) { - return fmt.Errorf("expected %#v, got %#v", expect, test) + f.T.Errorf("AssertList: expected %#v, got %#v", expect, test) + return false } - return nil + return true } // AssertCalls test if the invoked functions are as expected. -func (f *FakeRuntime) AssertCalls(calls []string) error { +func (f *FakeRuntime) AssertCalls(calls []string) bool { f.Lock() defer f.Unlock() return f.assertList(calls, f.CalledFunctions) } -func (f *FakeRuntime) AssertStartedPods(pods []string) error { +func (f *FakeRuntime) AssertStartedPods(pods []string) bool { f.Lock() defer f.Unlock() return f.assertList(pods, f.StartedPods) } -func (f *FakeRuntime) AssertKilledPods(pods []string) error { +func (f *FakeRuntime) AssertKilledPods(pods []string) bool { f.Lock() defer f.Unlock() return f.assertList(pods, f.KilledPods) } -func (f *FakeRuntime) AssertStartedContainers(containers []string) error { +func (f *FakeRuntime) AssertStartedContainers(containers []string) bool { f.Lock() defer f.Unlock() return f.assertList(containers, f.StartedContainers) } -func (f *FakeRuntime) AssertKilledContainers(containers []string) error { +func (f *FakeRuntime) AssertKilledContainers(containers []string) bool { f.Lock() defer f.Unlock() return f.assertList(containers, f.KilledContainers) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cri/remote/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/cri/remote/BUILD deleted file mode 100644 index d6cd6b7cf5be..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cri/remote/BUILD +++ /dev/null @@ -1,60 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "remote_image.go", - "remote_runtime.go", - "utils.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/cri/remote", - deps = [ - "//pkg/kubelet/cri/remote/util:go_default_library", - "//pkg/probe/exec:go_default_library", - "//staging/src/k8s.io/component-base/logs/logreduction:go_default_library", - "//staging/src/k8s.io/cri-api/pkg/apis:go_default_library", - "//staging/src/k8s.io/cri-api/pkg/apis/runtime/v1alpha2:go_default_library", - "//vendor/google.golang.org/grpc:go_default_library", - "//vendor/google.golang.org/grpc/codes:go_default_library", - "//vendor/google.golang.org/grpc/status:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/kubelet/cri/remote/fake:all-srcs", - "//pkg/kubelet/cri/remote/util:all-srcs", - ], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["remote_runtime_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/cri/remote/fake:go_default_library", - "//staging/src/k8s.io/cri-api/pkg/apis:go_default_library", - "//staging/src/k8s.io/cri-api/pkg/apis/testing:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cri/remote/remote_image.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cri/remote/remote_image.go index 259dd4c6e150..45845a1efecb 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cri/remote/remote_image.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cri/remote/remote_image.go @@ -38,7 +38,7 @@ type remoteImageService struct { // NewRemoteImageService creates a new internalapi.ImageManagerService. func NewRemoteImageService(endpoint string, connectionTimeout time.Duration) (internalapi.ImageManagerService, error) { - klog.V(3).Infof("Connecting to image service %s", endpoint) + klog.V(3).InfoS("Connecting to image service", "endpoint", endpoint) addr, dialer, err := util.GetAddressAndDialer(endpoint) if err != nil { return nil, err @@ -49,7 +49,7 @@ func NewRemoteImageService(endpoint string, connectionTimeout time.Duration) (in conn, err := grpc.DialContext(ctx, addr, grpc.WithInsecure(), grpc.WithContextDialer(dialer), grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(maxMsgSize))) if err != nil { - klog.Errorf("Connect remote image service %s failed: %v", addr, err) + klog.ErrorS(err, "Connect remote image service failed", "address", addr) return nil, err } @@ -68,7 +68,7 @@ func (r *remoteImageService) ListImages(filter *runtimeapi.ImageFilter) ([]*runt Filter: filter, }) if err != nil { - klog.Errorf("ListImages with filter %+v from image service failed: %v", filter, err) + klog.ErrorS(err, "ListImages with filter from image service failed", "filter", filter) return nil, err } @@ -84,15 +84,16 @@ func (r *remoteImageService) ImageStatus(image *runtimeapi.ImageSpec) (*runtimea Image: image, }) if err != nil { - klog.Errorf("ImageStatus %q from image service failed: %v", image.Image, err) + klog.ErrorS(err, "Get ImageStatus from image service failed", "image", image.Image) return nil, err } if resp.Image != nil { if resp.Image.Id == "" || resp.Image.Size_ == 0 { errorMessage := fmt.Sprintf("Id or size of image %q is not set", image.Image) - klog.Errorf("ImageStatus failed: %s", errorMessage) - return nil, errors.New(errorMessage) + err := errors.New(errorMessage) + klog.ErrorS(err, "ImageStatus failed", "image", image.Image) + return nil, err } } @@ -110,13 +111,13 @@ func (r *remoteImageService) PullImage(image *runtimeapi.ImageSpec, auth *runtim SandboxConfig: podSandboxConfig, }) if err != nil { - klog.Errorf("PullImage %q from image service failed: %v", image.Image, err) + klog.ErrorS(err, "PullImage from image service failed", "image", image.Image) return "", err } if resp.ImageRef == "" { + klog.ErrorS(errors.New("PullImage failed"), "ImageRef of image is not set", "image", image.Image) errorMessage := fmt.Sprintf("imageRef of image %q is not set", image.Image) - klog.Errorf("PullImage failed: %s", errorMessage) return "", errors.New(errorMessage) } @@ -132,7 +133,7 @@ func (r *remoteImageService) RemoveImage(image *runtimeapi.ImageSpec) error { Image: image, }) if err != nil { - klog.Errorf("RemoveImage %q from image service failed: %v", image.Image, err) + klog.ErrorS(err, "RemoveImage from image service failed", "image", image.Image) return err } @@ -148,7 +149,7 @@ func (r *remoteImageService) ImageFsInfo() ([]*runtimeapi.FilesystemUsage, error resp, err := r.imageClient.ImageFsInfo(ctx, &runtimeapi.ImageFsInfoRequest{}) if err != nil { - klog.Errorf("ImageFsInfo from image service failed: %v", err) + klog.ErrorS(err, "ImageFsInfo from image service failed") return nil, err } return resp.GetImageFilesystems(), nil diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cri/remote/remote_runtime.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cri/remote/remote_runtime.go index 87b41bbf16fb..d11e5899a30d 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cri/remote/remote_runtime.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cri/remote/remote_runtime.go @@ -51,7 +51,7 @@ const ( // NewRemoteRuntimeService creates a new internalapi.RuntimeService. func NewRemoteRuntimeService(endpoint string, connectionTimeout time.Duration) (internalapi.RuntimeService, error) { - klog.V(3).Infof("Connecting to runtime service %s", endpoint) + klog.V(3).InfoS("Connecting to runtime service", "endpoint", endpoint) addr, dialer, err := util.GetAddressAndDialer(endpoint) if err != nil { return nil, err @@ -61,7 +61,7 @@ func NewRemoteRuntimeService(endpoint string, connectionTimeout time.Duration) ( conn, err := grpc.DialContext(ctx, addr, grpc.WithInsecure(), grpc.WithContextDialer(dialer), grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(maxMsgSize))) if err != nil { - klog.Errorf("Connect remote runtime %s failed: %v", addr, err) + klog.ErrorS(err, "Connect remote runtime failed", "address", addr) return nil, err } @@ -74,7 +74,7 @@ func NewRemoteRuntimeService(endpoint string, connectionTimeout time.Duration) ( // Version returns the runtime name, runtime version and runtime API version. func (r *remoteRuntimeService) Version(apiVersion string) (*runtimeapi.VersionResponse, error) { - klog.V(10).Infof("[RemoteRuntimeService] Version (apiVersion=%v, timeout=%v)", apiVersion, r.timeout) + klog.V(10).InfoS("[RemoteRuntimeService] Version", "apiVersion", apiVersion, "timeout", r.timeout) ctx, cancel := getContextWithTimeout(r.timeout) defer cancel() @@ -83,11 +83,11 @@ func (r *remoteRuntimeService) Version(apiVersion string) (*runtimeapi.VersionRe Version: apiVersion, }) if err != nil { - klog.Errorf("Version from runtime service failed: %v", err) + klog.ErrorS(err, "Version from runtime service failed") return nil, err } - klog.V(10).Infof("[RemoteRuntimeService] Version Response (typedVersion=%v)", typedVersion) + klog.V(10).InfoS("[RemoteRuntimeService] Version Response", "apiVersion", typedVersion) if typedVersion.Version == "" || typedVersion.RuntimeName == "" || typedVersion.RuntimeApiVersion == "" || typedVersion.RuntimeVersion == "" { return nil, fmt.Errorf("not all fields are set in VersionResponse (%q)", *typedVersion) @@ -103,7 +103,7 @@ func (r *remoteRuntimeService) RunPodSandbox(config *runtimeapi.PodSandboxConfig // TODO: Make the pod sandbox timeout configurable. timeout := r.timeout * 2 - klog.V(10).Infof("[RemoteRuntimeService] RunPodSandbox (config=%v, runtimeHandler=%v, timeout=%v)", config, runtimeHandler, timeout) + klog.V(10).InfoS("[RemoteRuntimeService] RunPodSandbox", "config", config, "runtimeHandler", runtimeHandler, "timeout", timeout) ctx, cancel := getContextWithTimeout(timeout) defer cancel() @@ -113,17 +113,18 @@ func (r *remoteRuntimeService) RunPodSandbox(config *runtimeapi.PodSandboxConfig RuntimeHandler: runtimeHandler, }) if err != nil { - klog.Errorf("RunPodSandbox from runtime service failed: %v", err) + klog.ErrorS(err, "RunPodSandbox from runtime service failed") return "", err } if resp.PodSandboxId == "" { errorMessage := fmt.Sprintf("PodSandboxId is not set for sandbox %q", config.GetMetadata()) - klog.Errorf("RunPodSandbox failed: %s", errorMessage) - return "", errors.New(errorMessage) + err := errors.New(errorMessage) + klog.ErrorS(err, "RunPodSandbox failed") + return "", err } - klog.V(10).Infof("[RemoteRuntimeService] RunPodSandbox Response (PodSandboxId=%v)", resp.PodSandboxId) + klog.V(10).InfoS("[RemoteRuntimeService] RunPodSandbox Response", "podSandboxID", resp.PodSandboxId) return resp.PodSandboxId, nil } @@ -131,7 +132,7 @@ func (r *remoteRuntimeService) RunPodSandbox(config *runtimeapi.PodSandboxConfig // StopPodSandbox stops the sandbox. If there are any running containers in the // sandbox, they should be forced to termination. func (r *remoteRuntimeService) StopPodSandbox(podSandBoxID string) error { - klog.V(10).Infof("[RemoteRuntimeService] StopPodSandbox (podSandboxID=%v, timeout=%v)", podSandBoxID, r.timeout) + klog.V(10).InfoS("[RemoteRuntimeService] StopPodSandbox", "podSandboxID", podSandBoxID, "timeout", r.timeout) ctx, cancel := getContextWithTimeout(r.timeout) defer cancel() @@ -140,11 +141,11 @@ func (r *remoteRuntimeService) StopPodSandbox(podSandBoxID string) error { PodSandboxId: podSandBoxID, }) if err != nil { - klog.Errorf("StopPodSandbox %q from runtime service failed: %v", podSandBoxID, err) + klog.ErrorS(err, "StopPodSandbox from runtime service failed", "podSandboxID", podSandBoxID) return err } - klog.V(10).Infof("[RemoteRuntimeService] StopPodSandbox Response (podSandboxID=%v)", podSandBoxID) + klog.V(10).InfoS("[RemoteRuntimeService] StopPodSandbox Response", "podSandboxID", podSandBoxID) return nil } @@ -152,7 +153,7 @@ func (r *remoteRuntimeService) StopPodSandbox(podSandBoxID string) error { // RemovePodSandbox removes the sandbox. If there are any containers in the // sandbox, they should be forcibly removed. func (r *remoteRuntimeService) RemovePodSandbox(podSandBoxID string) error { - klog.V(10).Infof("[RemoteRuntimeService] RemovePodSandbox (podSandboxID=%v, timeout=%v)", podSandBoxID, r.timeout) + klog.V(10).InfoS("[RemoteRuntimeService] RemovePodSandbox", "podSandboxID", podSandBoxID, "timeout", r.timeout) ctx, cancel := getContextWithTimeout(r.timeout) defer cancel() @@ -160,18 +161,18 @@ func (r *remoteRuntimeService) RemovePodSandbox(podSandBoxID string) error { PodSandboxId: podSandBoxID, }) if err != nil { - klog.Errorf("RemovePodSandbox %q from runtime service failed: %v", podSandBoxID, err) + klog.ErrorS(err, "RemovePodSandbox from runtime service failed", "podSandboxID", podSandBoxID) return err } - klog.V(10).Infof("[RemoteRuntimeService] RemovePodSandbox Response (podSandboxID=%v)", podSandBoxID) + klog.V(10).InfoS("[RemoteRuntimeService] RemovePodSandbox Response", "podSandboxID", podSandBoxID) return nil } // PodSandboxStatus returns the status of the PodSandbox. func (r *remoteRuntimeService) PodSandboxStatus(podSandBoxID string) (*runtimeapi.PodSandboxStatus, error) { - klog.V(10).Infof("[RemoteRuntimeService] PodSandboxStatus (podSandboxID=%v, timeout=%v)", podSandBoxID, r.timeout) + klog.V(10).InfoS("[RemoteRuntimeService] PodSandboxStatus", "podSandboxID", podSandBoxID, "timeout", r.timeout) ctx, cancel := getContextWithTimeout(r.timeout) defer cancel() @@ -182,7 +183,7 @@ func (r *remoteRuntimeService) PodSandboxStatus(podSandBoxID string) (*runtimeap return nil, err } - klog.V(10).Infof("[RemoteRuntimeService] PodSandboxStatus Response (podSandboxID=%v, status=%v)", podSandBoxID, resp.Status) + klog.V(10).InfoS("[RemoteRuntimeService] PodSandboxStatus Response", "podSandboxID", podSandBoxID, "status", resp.Status) if resp.Status != nil { if err := verifySandboxStatus(resp.Status); err != nil { @@ -195,7 +196,7 @@ func (r *remoteRuntimeService) PodSandboxStatus(podSandBoxID string) (*runtimeap // ListPodSandbox returns a list of PodSandboxes. func (r *remoteRuntimeService) ListPodSandbox(filter *runtimeapi.PodSandboxFilter) ([]*runtimeapi.PodSandbox, error) { - klog.V(10).Infof("[RemoteRuntimeService] ListPodSandbox (filter=%v, timeout=%v)", filter, r.timeout) + klog.V(10).InfoS("[RemoteRuntimeService] ListPodSandbox", "filter", filter, "timeout", r.timeout) ctx, cancel := getContextWithTimeout(r.timeout) defer cancel() @@ -203,18 +204,18 @@ func (r *remoteRuntimeService) ListPodSandbox(filter *runtimeapi.PodSandboxFilte Filter: filter, }) if err != nil { - klog.Errorf("ListPodSandbox with filter %+v from runtime service failed: %v", filter, err) + klog.ErrorS(err, "ListPodSandbox with filter from runtime service failed", "filter", filter) return nil, err } - klog.V(10).Infof("[RemoteRuntimeService] ListPodSandbox Response (filter=%v, items=%v)", filter, resp.Items) + klog.V(10).InfoS("[RemoteRuntimeService] ListPodSandbox Response", "filter", filter, "items", resp.Items) return resp.Items, nil } // CreateContainer creates a new container in the specified PodSandbox. func (r *remoteRuntimeService) CreateContainer(podSandBoxID string, config *runtimeapi.ContainerConfig, sandboxConfig *runtimeapi.PodSandboxConfig) (string, error) { - klog.V(10).Infof("[RemoteRuntimeService] CreateContainer (podSandBoxID=%v, timeout=%v)", podSandBoxID, r.timeout) + klog.V(10).InfoS("[RemoteRuntimeService] CreateContainer", "podSandboxID", podSandBoxID, "timeout", r.timeout) ctx, cancel := getContextWithTimeout(r.timeout) defer cancel() @@ -224,15 +225,16 @@ func (r *remoteRuntimeService) CreateContainer(podSandBoxID string, config *runt SandboxConfig: sandboxConfig, }) if err != nil { - klog.Errorf("CreateContainer in sandbox %q from runtime service failed: %v", podSandBoxID, err) + klog.ErrorS(err, "CreateContainer in sandbox from runtime service failed", "podSandboxID", podSandBoxID) return "", err } - klog.V(10).Infof("[RemoteRuntimeService] CreateContainer (podSandBoxID=%v, ContainerId=%v)", podSandBoxID, resp.ContainerId) + klog.V(10).InfoS("[RemoteRuntimeService] CreateContainer", "podSandboxID", podSandBoxID, "containerID", resp.ContainerId) if resp.ContainerId == "" { errorMessage := fmt.Sprintf("ContainerId is not set for container %q", config.GetMetadata()) - klog.Errorf("CreateContainer failed: %s", errorMessage) - return "", errors.New(errorMessage) + err := errors.New(errorMessage) + klog.ErrorS(err, "CreateContainer failed") + return "", err } return resp.ContainerId, nil @@ -240,7 +242,7 @@ func (r *remoteRuntimeService) CreateContainer(podSandBoxID string, config *runt // StartContainer starts the container. func (r *remoteRuntimeService) StartContainer(containerID string) error { - klog.V(10).Infof("[RemoteRuntimeService] StartContainer (containerID=%v, timeout=%v)", containerID, r.timeout) + klog.V(10).InfoS("[RemoteRuntimeService] StartContainer", "containerID", containerID, "timeout", r.timeout) ctx, cancel := getContextWithTimeout(r.timeout) defer cancel() @@ -248,17 +250,17 @@ func (r *remoteRuntimeService) StartContainer(containerID string) error { ContainerId: containerID, }) if err != nil { - klog.Errorf("StartContainer %q from runtime service failed: %v", containerID, err) + klog.ErrorS(err, "StartContainer from runtime service failed", "containerID", containerID) return err } - klog.V(10).Infof("[RemoteRuntimeService] StartContainer Response (containerID=%v)", containerID) + klog.V(10).InfoS("[RemoteRuntimeService] StartContainer Response", "containerID", containerID) return nil } // StopContainer stops a running container with a grace period (i.e., timeout). func (r *remoteRuntimeService) StopContainer(containerID string, timeout int64) error { - klog.V(10).Infof("[RemoteRuntimeService] StopContainer (containerID=%v, timeout=%v)", containerID, timeout) + klog.V(10).InfoS("[RemoteRuntimeService] StopContainer", "containerID", containerID, "timeout", timeout) // Use timeout + default timeout (2 minutes) as timeout to leave extra time // for SIGKILL container and request latency. t := r.timeout + time.Duration(timeout)*time.Second @@ -271,10 +273,10 @@ func (r *remoteRuntimeService) StopContainer(containerID string, timeout int64) Timeout: timeout, }) if err != nil { - klog.Errorf("StopContainer %q from runtime service failed: %v", containerID, err) + klog.ErrorS(err, "StopContainer from runtime service failed", "containerID", containerID) return err } - klog.V(10).Infof("[RemoteRuntimeService] StopContainer Response (containerID=%v)", containerID) + klog.V(10).InfoS("[RemoteRuntimeService] StopContainer Response", "containerID", containerID) return nil } @@ -282,7 +284,7 @@ func (r *remoteRuntimeService) StopContainer(containerID string, timeout int64) // RemoveContainer removes the container. If the container is running, the container // should be forced to removal. func (r *remoteRuntimeService) RemoveContainer(containerID string) error { - klog.V(10).Infof("[RemoteRuntimeService] RemoveContainer (containerID=%v, timeout=%v)", containerID, r.timeout) + klog.V(10).InfoS("[RemoteRuntimeService] RemoveContainer", "containerID", containerID, "timeout", r.timeout) ctx, cancel := getContextWithTimeout(r.timeout) defer cancel() @@ -291,17 +293,17 @@ func (r *remoteRuntimeService) RemoveContainer(containerID string) error { ContainerId: containerID, }) if err != nil { - klog.Errorf("RemoveContainer %q from runtime service failed: %v", containerID, err) + klog.ErrorS(err, "RemoveContainer from runtime service failed", "containerID", containerID) return err } - klog.V(10).Infof("[RemoteRuntimeService] RemoveContainer Response (containerID=%v)", containerID) + klog.V(10).InfoS("[RemoteRuntimeService] RemoveContainer Response", "containerID", containerID) return nil } // ListContainers lists containers by filters. func (r *remoteRuntimeService) ListContainers(filter *runtimeapi.ContainerFilter) ([]*runtimeapi.Container, error) { - klog.V(10).Infof("[RemoteRuntimeService] ListContainers (filter=%v, timeout=%v)", filter, r.timeout) + klog.V(10).InfoS("[RemoteRuntimeService] ListContainers", "filter", filter, "timeout", r.timeout) ctx, cancel := getContextWithTimeout(r.timeout) defer cancel() @@ -309,17 +311,17 @@ func (r *remoteRuntimeService) ListContainers(filter *runtimeapi.ContainerFilter Filter: filter, }) if err != nil { - klog.Errorf("ListContainers with filter %+v from runtime service failed: %v", filter, err) + klog.ErrorS(err, "ListContainers with filter from runtime service failed", "filter", filter) return nil, err } - klog.V(10).Infof("[RemoteRuntimeService] ListContainers Response (filter=%v, containers=%v)", filter, resp.Containers) + klog.V(10).InfoS("[RemoteRuntimeService] ListContainers Response", "filter", filter, "containers", resp.Containers) return resp.Containers, nil } // ContainerStatus returns the container status. func (r *remoteRuntimeService) ContainerStatus(containerID string) (*runtimeapi.ContainerStatus, error) { - klog.V(10).Infof("[RemoteRuntimeService] ContainerStatus (containerID=%v, timeout=%v)", containerID, r.timeout) + klog.V(10).InfoS("[RemoteRuntimeService] ContainerStatus", "containerID", containerID, "timeout", r.timeout) ctx, cancel := getContextWithTimeout(r.timeout) defer cancel() @@ -329,16 +331,16 @@ func (r *remoteRuntimeService) ContainerStatus(containerID string) (*runtimeapi. if err != nil { // Don't spam the log with endless messages about the same failure. if r.logReduction.ShouldMessageBePrinted(err.Error(), containerID) { - klog.Errorf("ContainerStatus %q from runtime service failed: %v", containerID, err) + klog.ErrorS(err, "ContainerStatus from runtime service failed", "containerID", containerID) } return nil, err } r.logReduction.ClearID(containerID) - klog.V(10).Infof("[RemoteRuntimeService] ContainerStatus Response (containerID=%v, status=%v)", containerID, resp.Status) + klog.V(10).InfoS("[RemoteRuntimeService] ContainerStatus Response", "containerID", containerID, "status", resp.Status) if resp.Status != nil { if err := verifyContainerStatus(resp.Status); err != nil { - klog.Errorf("ContainerStatus of %q failed: %v", containerID, err) + klog.ErrorS(err, "verify ContainerStatus failed", "containerID", containerID) return nil, err } } @@ -348,7 +350,7 @@ func (r *remoteRuntimeService) ContainerStatus(containerID string) (*runtimeapi. // UpdateContainerResources updates a containers resource config func (r *remoteRuntimeService) UpdateContainerResources(containerID string, resources *runtimeapi.LinuxContainerResources) error { - klog.V(10).Infof("[RemoteRuntimeService] UpdateContainerResources (containerID=%v, timeout=%v)", containerID, r.timeout) + klog.V(10).InfoS("[RemoteRuntimeService] UpdateContainerResources", "containerID", containerID, "timeout", r.timeout) ctx, cancel := getContextWithTimeout(r.timeout) defer cancel() @@ -357,10 +359,10 @@ func (r *remoteRuntimeService) UpdateContainerResources(containerID string, reso Linux: resources, }) if err != nil { - klog.Errorf("UpdateContainerResources %q from runtime service failed: %v", containerID, err) + klog.ErrorS(err, "UpdateContainerResources from runtime service failed", "containerID", containerID) return err } - klog.V(10).Infof("[RemoteRuntimeService] UpdateContainerResources Response (containerID=%v)", containerID) + klog.V(10).InfoS("[RemoteRuntimeService] UpdateContainerResources Response", "containerID", containerID) return nil } @@ -368,7 +370,7 @@ func (r *remoteRuntimeService) UpdateContainerResources(containerID string, reso // ExecSync executes a command in the container, and returns the stdout output. // If command exits with a non-zero exit code, an error is returned. func (r *remoteRuntimeService) ExecSync(containerID string, cmd []string, timeout time.Duration) (stdout []byte, stderr []byte, err error) { - klog.V(10).Infof("[RemoteRuntimeService] ExecSync (containerID=%v, timeout=%v)", containerID, timeout) + klog.V(10).InfoS("[RemoteRuntimeService] ExecSync", "containerID", containerID, "timeout", timeout) // Do not set timeout when timeout is 0. var ctx context.Context var cancel context.CancelFunc @@ -389,7 +391,7 @@ func (r *remoteRuntimeService) ExecSync(containerID string, cmd []string, timeou } resp, err := r.runtimeClient.ExecSync(ctx, req) if err != nil { - klog.Errorf("ExecSync %s '%s' from runtime service failed: %v", containerID, strings.Join(cmd, " "), err) + klog.ErrorS(err, "ExecSync cmd from runtime service failed", "containerID", containerID, "cmd", cmd) // interpret DeadlineExceeded gRPC errors as timedout probes if status.Code(err) == codes.DeadlineExceeded { @@ -399,7 +401,7 @@ func (r *remoteRuntimeService) ExecSync(containerID string, cmd []string, timeou return nil, nil, err } - klog.V(10).Infof("[RemoteRuntimeService] ExecSync Response (containerID=%v, ExitCode=%v)", containerID, resp.ExitCode) + klog.V(10).InfoS("[RemoteRuntimeService] ExecSync Response", "containerID", containerID, "exitCode", resp.ExitCode) err = nil if resp.ExitCode != 0 { err = utilexec.CodeExitError{ @@ -413,21 +415,22 @@ func (r *remoteRuntimeService) ExecSync(containerID string, cmd []string, timeou // Exec prepares a streaming endpoint to execute a command in the container, and returns the address. func (r *remoteRuntimeService) Exec(req *runtimeapi.ExecRequest) (*runtimeapi.ExecResponse, error) { - klog.V(10).Infof("[RemoteRuntimeService] Exec (timeout=%v)", r.timeout) + klog.V(10).InfoS("[RemoteRuntimeService] Exec", "timeout", r.timeout) ctx, cancel := getContextWithTimeout(r.timeout) defer cancel() resp, err := r.runtimeClient.Exec(ctx, req) if err != nil { - klog.Errorf("Exec %s '%s' from runtime service failed: %v", req.ContainerId, strings.Join(req.Cmd, " "), err) + klog.ErrorS(err, "Exec cmd from runtime service failed", "containerID", req.ContainerId, "cmd", req.Cmd) return nil, err } - klog.V(10).Info("[RemoteRuntimeService] Exec Response") + klog.V(10).InfoS("[RemoteRuntimeService] Exec Response") if resp.Url == "" { errorMessage := "URL is not set" - klog.Errorf("Exec failed: %s", errorMessage) - return nil, errors.New(errorMessage) + err := errors.New(errorMessage) + klog.ErrorS(err, "Exec failed") + return nil, err } return resp, nil @@ -435,42 +438,44 @@ func (r *remoteRuntimeService) Exec(req *runtimeapi.ExecRequest) (*runtimeapi.Ex // Attach prepares a streaming endpoint to attach to a running container, and returns the address. func (r *remoteRuntimeService) Attach(req *runtimeapi.AttachRequest) (*runtimeapi.AttachResponse, error) { - klog.V(10).Infof("[RemoteRuntimeService] Attach (containerId=%v, timeout=%v)", req.ContainerId, r.timeout) + klog.V(10).InfoS("[RemoteRuntimeService] Attach", "containerID", req.ContainerId, "timeout", r.timeout) ctx, cancel := getContextWithTimeout(r.timeout) defer cancel() resp, err := r.runtimeClient.Attach(ctx, req) if err != nil { - klog.Errorf("Attach %s from runtime service failed: %v", req.ContainerId, err) + klog.ErrorS(err, "Attach container from runtime service failed", "containerID", req.ContainerId) return nil, err } - klog.V(10).Infof("[RemoteRuntimeService] Attach Response (containerId=%v)", req.ContainerId) + klog.V(10).InfoS("[RemoteRuntimeService] Attach Response", "containerID", req.ContainerId) if resp.Url == "" { errorMessage := "URL is not set" - klog.Errorf("Attach failed: %s", errorMessage) - return nil, errors.New(errorMessage) + err := errors.New(errorMessage) + klog.ErrorS(err, "Attach failed") + return nil, err } return resp, nil } // PortForward prepares a streaming endpoint to forward ports from a PodSandbox, and returns the address. func (r *remoteRuntimeService) PortForward(req *runtimeapi.PortForwardRequest) (*runtimeapi.PortForwardResponse, error) { - klog.V(10).Infof("[RemoteRuntimeService] PortForward (podSandboxID=%v, port=%v, timeout=%v)", req.PodSandboxId, req.Port, r.timeout) + klog.V(10).InfoS("[RemoteRuntimeService] PortForward", "podSandboxID", req.PodSandboxId, "port", req.Port, "timeout", r.timeout) ctx, cancel := getContextWithTimeout(r.timeout) defer cancel() resp, err := r.runtimeClient.PortForward(ctx, req) if err != nil { - klog.Errorf("PortForward %s from runtime service failed: %v", req.PodSandboxId, err) + klog.ErrorS(err, "PortForward from runtime service failed", "podSandboxID", req.PodSandboxId) return nil, err } - klog.V(10).Infof("[RemoteRuntimeService] PortForward Response (podSandboxID=%v)", req.PodSandboxId) + klog.V(10).InfoS("[RemoteRuntimeService] PortForward Response", "podSandboxID", req.PodSandboxId) if resp.Url == "" { errorMessage := "URL is not set" - klog.Errorf("PortForward failed: %s", errorMessage) - return nil, errors.New(errorMessage) + err := errors.New(errorMessage) + klog.ErrorS(err, "PortForward failed") + return nil, err } return resp, nil @@ -480,7 +485,7 @@ func (r *remoteRuntimeService) PortForward(req *runtimeapi.PortForwardRequest) ( // update payload currently supported is the pod CIDR assigned to a node, // and the runtime service just proxies it down to the network plugin. func (r *remoteRuntimeService) UpdateRuntimeConfig(runtimeConfig *runtimeapi.RuntimeConfig) error { - klog.V(10).Infof("[RemoteRuntimeService] UpdateRuntimeConfig (runtimeConfig=%v, timeout=%v)", runtimeConfig, r.timeout) + klog.V(10).InfoS("[RemoteRuntimeService] UpdateRuntimeConfig", "runtimeConfig", runtimeConfig, "timeout", r.timeout) ctx, cancel := getContextWithTimeout(r.timeout) defer cancel() @@ -494,29 +499,30 @@ func (r *remoteRuntimeService) UpdateRuntimeConfig(runtimeConfig *runtimeapi.Run if err != nil { return err } - klog.V(10).Infof("[RemoteRuntimeService] UpdateRuntimeConfig Response (runtimeConfig=%v)", runtimeConfig) + klog.V(10).InfoS("[RemoteRuntimeService] UpdateRuntimeConfig Response", "runtimeConfig", runtimeConfig) return nil } // Status returns the status of the runtime. func (r *remoteRuntimeService) Status() (*runtimeapi.RuntimeStatus, error) { - klog.V(10).Infof("[RemoteRuntimeService] Status (timeout=%v)", r.timeout) + klog.V(10).InfoS("[RemoteRuntimeService] Status", "timeout", r.timeout) ctx, cancel := getContextWithTimeout(r.timeout) defer cancel() resp, err := r.runtimeClient.Status(ctx, &runtimeapi.StatusRequest{}) if err != nil { - klog.Errorf("Status from runtime service failed: %v", err) + klog.ErrorS(err, "Status from runtime service failed") return nil, err } - klog.V(10).Infof("[RemoteRuntimeService] Status Response (status=%v)", resp.Status) + klog.V(10).InfoS("[RemoteRuntimeService] Status Response", "status", resp.Status) if resp.Status == nil || len(resp.Status.Conditions) < 2 { errorMessage := "RuntimeReady or NetworkReady condition are not set" - klog.Errorf("Status failed: %s", errorMessage) - return nil, errors.New(errorMessage) + err := errors.New(errorMessage) + klog.ErrorS(err, "Status failed") + return nil, err } return resp.Status, nil @@ -524,7 +530,7 @@ func (r *remoteRuntimeService) Status() (*runtimeapi.RuntimeStatus, error) { // ContainerStats returns the stats of the container. func (r *remoteRuntimeService) ContainerStats(containerID string) (*runtimeapi.ContainerStats, error) { - klog.V(10).Infof("[RemoteRuntimeService] ContainerStats (containerID=%v, timeout=%v)", containerID, r.timeout) + klog.V(10).InfoS("[RemoteRuntimeService] ContainerStats", "containerID", containerID, "timeout", r.timeout) ctx, cancel := getContextWithTimeout(r.timeout) defer cancel() @@ -533,19 +539,19 @@ func (r *remoteRuntimeService) ContainerStats(containerID string) (*runtimeapi.C }) if err != nil { if r.logReduction.ShouldMessageBePrinted(err.Error(), containerID) { - klog.Errorf("ContainerStats %q from runtime service failed: %v", containerID, err) + klog.ErrorS(err, "ContainerStats from runtime service failed", "containerID", containerID) } return nil, err } r.logReduction.ClearID(containerID) - klog.V(10).Infof("[RemoteRuntimeService] ContainerStats Response (containerID=%v, stats=%v)", containerID, resp.GetStats()) + klog.V(10).InfoS("[RemoteRuntimeService] ContainerStats Response", "containerID", containerID, "stats", resp.GetStats()) return resp.GetStats(), nil } // ListContainerStats returns the list of ContainerStats given the filter. func (r *remoteRuntimeService) ListContainerStats(filter *runtimeapi.ContainerStatsFilter) ([]*runtimeapi.ContainerStats, error) { - klog.V(10).Infof("[RemoteRuntimeService] ListContainerStats (filter=%v)", filter) + klog.V(10).InfoS("[RemoteRuntimeService] ListContainerStats", "filter", filter) // Do not set timeout, because writable layer stats collection takes time. // TODO(random-liu): Should we assume runtime should cache the result, and set timeout here? ctx, cancel := getContextWithCancel() @@ -555,26 +561,26 @@ func (r *remoteRuntimeService) ListContainerStats(filter *runtimeapi.ContainerSt Filter: filter, }) if err != nil { - klog.Errorf("ListContainerStats with filter %+v from runtime service failed: %v", filter, err) + klog.ErrorS(err, "ListContainerStats with filter from runtime service failed", "filter", filter) return nil, err } - klog.V(10).Infof("[RemoteRuntimeService] ListContainerStats Response (filter=%v, stats=%v)", filter, resp.GetStats()) + klog.V(10).InfoS("[RemoteRuntimeService] ListContainerStats Response", "filter", filter, "stats", resp.GetStats()) return resp.GetStats(), nil } // ReopenContainerLog reopens the container log file. func (r *remoteRuntimeService) ReopenContainerLog(containerID string) error { - klog.V(10).Infof("[RemoteRuntimeService] ReopenContainerLog (containerID=%v, timeout=%v)", containerID, r.timeout) + klog.V(10).InfoS("[RemoteRuntimeService] ReopenContainerLog", "containerID", containerID, "timeout", r.timeout) ctx, cancel := getContextWithTimeout(r.timeout) defer cancel() _, err := r.runtimeClient.ReopenContainerLog(ctx, &runtimeapi.ReopenContainerLogRequest{ContainerId: containerID}) if err != nil { - klog.Errorf("ReopenContainerLog %q from runtime service failed: %v", containerID, err) + klog.ErrorS(err, "ReopenContainerLog from runtime service failed", "containerID", containerID) return err } - klog.V(10).Infof("[RemoteRuntimeService] ReopenContainerLog Response (containerID=%v)", containerID) + klog.V(10).InfoS("[RemoteRuntimeService] ReopenContainerLog Response", "containerID", containerID) return nil } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cri/remote/util/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/cri/remote/util/BUILD deleted file mode 100644 index 5b91eec32364..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cri/remote/util/BUILD +++ /dev/null @@ -1,89 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "util_unix.go", - "util_unsupported.go", - "util_windows.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/cri/remote/util", - visibility = ["//visibility:public"], - deps = select({ - "@io_bazel_rules_go//go/platform:android": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], - "@io_bazel_rules_go//go/platform:ios": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "//vendor/github.com/Microsoft/go-winio:go_default_library", - ], - "//conditions:default": [], - }), -) - -go_test( - name = "go_default_test", - srcs = [ - "util_unix_test.go", - "util_windows_test.go", - ], - embed = [":go_default_library"], - deps = select({ - "@io_bazel_rules_go//go/platform:android": [ - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - ], - "@io_bazel_rules_go//go/platform:ios": [ - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "//vendor/github.com/Microsoft/go-winio:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cri/remote/util/util_unix.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cri/remote/util/util_unix.go index ef067bd4c464..e5e2d7bedeab 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cri/remote/util/util_unix.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cri/remote/util/util_unix.go @@ -100,7 +100,7 @@ func parseEndpointWithFallbackProtocol(endpoint string, fallbackProtocol string) fallbackEndpoint := fallbackProtocol + "://" + endpoint protocol, addr, err = parseEndpoint(fallbackEndpoint) if err == nil { - klog.Warningf("Using %q as endpoint is deprecated, please consider using full url format %q.", endpoint, fallbackEndpoint) + klog.InfoS("Using this format as endpoint is deprecated, please consider using full url format.", "deprecatedFormat", endpoint, "fullURLFormat", fallbackEndpoint) } } return diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cri/streaming/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/cri/streaming/BUILD deleted file mode 100644 index ff26feedfed0..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cri/streaming/BUILD +++ /dev/null @@ -1,66 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "errors.go", - "request_cache.go", - "server.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/cri/streaming", - deps = [ - "//pkg/kubelet/cri/streaming/portforward:go_default_library", - "//pkg/kubelet/cri/streaming/remotecommand:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/remotecommand:go_default_library", - "//staging/src/k8s.io/client-go/tools/remotecommand:go_default_library", - "//staging/src/k8s.io/cri-api/pkg/apis/runtime/v1alpha2:go_default_library", - "//vendor/github.com/emicklei/go-restful:go_default_library", - "//vendor/google.golang.org/grpc/codes:go_default_library", - "//vendor/google.golang.org/grpc/status:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "request_cache_test.go", - "server_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/cri/streaming/portforward:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/tools/remotecommand:go_default_library", - "//staging/src/k8s.io/client-go/transport/spdy:go_default_library", - "//staging/src/k8s.io/cri-api/pkg/apis/runtime/v1alpha2:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/kubelet/cri/streaming/portforward:all-srcs", - "//pkg/kubelet/cri/streaming/remotecommand:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cri/streaming/portforward/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/cri/streaming/portforward/BUILD deleted file mode 100644 index 59c7f9b110da..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cri/streaming/portforward/BUILD +++ /dev/null @@ -1,54 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "constants.go", - "httpstream.go", - "portforward.go", - "websocket.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/cri/streaming/portforward", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/httpstream/spdy:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/httplog:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/wsstream:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "httpstream_test.go", - "websocket_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cri/streaming/portforward/httpstream.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cri/streaming/portforward/httpstream.go index 41911305487c..bd707decb16c 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cri/streaming/portforward/httpstream.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cri/streaming/portforward/httpstream.go @@ -42,7 +42,7 @@ func handleHTTPStreams(req *http.Request, w http.ResponseWriter, portForwarder P } streamChan := make(chan httpstream.Stream, 1) - klog.V(5).Infof("Upgrading port forward response") + klog.V(5).InfoS("Upgrading port forward response") upgrader := spdy.NewResponseUpgrader() conn := upgrader.UpgradeResponse(w, req, httpStreamReceived(streamChan)) if conn == nil { @@ -50,7 +50,7 @@ func handleHTTPStreams(req *http.Request, w http.ResponseWriter, portForwarder P } defer conn.Close() - klog.V(5).Infof("(conn=%p) setting port forwarding streaming connection idle timeout to %v", conn, idleTimeout) + klog.V(5).InfoS("Connection setting port forwarding streaming connection idle timeout", "connection", conn, "idleTimeout", idleTimeout) conn.SetIdleTimeout(idleTimeout) h := &httpStreamHandler{ @@ -121,11 +121,11 @@ func (h *httpStreamHandler) getStreamPair(requestID string) (*httpStreamPair, bo defer h.streamPairsLock.Unlock() if p, ok := h.streamPairs[requestID]; ok { - klog.V(5).Infof("(conn=%p, request=%s) found existing stream pair", h.conn, requestID) + klog.V(5).InfoS("Connection request found existing stream pair", "connection", h.conn, "request", requestID) return p, false } - klog.V(5).Infof("(conn=%p, request=%s) creating new stream pair", h.conn, requestID) + klog.V(5).InfoS("Connection request creating new stream pair", "connection", h.conn, "request", requestID) p := newPortForwardPair(requestID) h.streamPairs[requestID] = p @@ -143,7 +143,7 @@ func (h *httpStreamHandler) monitorStreamPair(p *httpStreamPair, timeout <-chan utilruntime.HandleError(err) p.printError(err.Error()) case <-p.complete: - klog.V(5).Infof("(conn=%v, request=%s) successfully received error and data streams", h.conn, p.requestID) + klog.V(5).InfoS("Connection request successfully received error and data streams", "connection", h.conn, "request", p.requestID) } h.removeStreamPair(p.requestID) } @@ -170,7 +170,7 @@ func (h *httpStreamHandler) removeStreamPair(requestID string) { func (h *httpStreamHandler) requestID(stream httpstream.Stream) string { requestID := stream.Headers().Get(api.PortForwardRequestIDHeader) if len(requestID) == 0 { - klog.V(5).Infof("(conn=%p) stream received without %s header", h.conn, api.PortForwardRequestIDHeader) + klog.V(5).InfoS("Connection stream received without requestID header", "connection", h.conn) // If we get here, it's because the connection came from an older client // that isn't generating the request id header // (https://github.com/kubernetes/kubernetes/blob/843134885e7e0b360eb5441e85b1410a8b1a7a0c/pkg/client/unversioned/portforward/portforward.go#L258-L287) @@ -197,7 +197,7 @@ func (h *httpStreamHandler) requestID(stream httpstream.Stream) string { requestID = strconv.Itoa(int(stream.Identifier()) - 2) } - klog.V(5).Infof("(conn=%p) automatically assigning request ID=%q from stream type=%s, stream ID=%d", h.conn, requestID, streamType, stream.Identifier()) + klog.V(5).InfoS("Connection automatically assigning request ID from stream type and stream ID", "connection", h.conn, "request", requestID, "streamType", streamType, "stream", stream.Identifier()) } return requestID } @@ -206,17 +206,17 @@ func (h *httpStreamHandler) requestID(stream httpstream.Stream) string { // streams, invoking portForward for each complete stream pair. The loop exits // when the httpstream.Connection is closed. func (h *httpStreamHandler) run() { - klog.V(5).Infof("(conn=%p) waiting for port forward streams", h.conn) + klog.V(5).InfoS("Connection waiting for port forward streams", "connection", h.conn) Loop: for { select { case <-h.conn.CloseChan(): - klog.V(5).Infof("(conn=%p) upgraded connection closed", h.conn) + klog.V(5).InfoS("Connection upgraded connection closed", "connection", h.conn) break Loop case stream := <-h.streamChan: requestID := h.requestID(stream) streamType := stream.Headers().Get(api.StreamType) - klog.V(5).Infof("(conn=%p, request=%s) received new stream of type %s", h.conn, requestID, streamType) + klog.V(5).InfoS("Connection request received new type of stream", "connection", h.conn, "request", requestID, "streamType", streamType) p, created := h.getStreamPair(requestID) if created { @@ -242,9 +242,9 @@ func (h *httpStreamHandler) portForward(p *httpStreamPair) { portString := p.dataStream.Headers().Get(api.PortHeader) port, _ := strconv.ParseInt(portString, 10, 32) - klog.V(5).Infof("(conn=%p, request=%s) invoking forwarder.PortForward for port %s", h.conn, p.requestID, portString) + klog.V(5).InfoS("Connection request invoking forwarder.PortForward for port", "connection", h.conn, "request", p.requestID, "port", portString) err := h.forwarder.PortForward(h.pod, h.uid, int32(port), p.dataStream) - klog.V(5).Infof("(conn=%p, request=%s) done invoking forwarder.PortForward for port %s", h.conn, p.requestID, portString) + klog.V(5).InfoS("Connection request done invoking forwarder.PortForward for port", "connection", h.conn, "request", p.requestID, "port", portString) if err != nil { msg := fmt.Errorf("error forwarding port %d to pod %s, uid %v: %v", port, h.pod, h.uid, err) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cri/streaming/portforward/websocket.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cri/streaming/portforward/websocket.go index 8b5428cb6d80..d62d9d3f05fc 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cri/streaming/portforward/websocket.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cri/streaming/portforward/websocket.go @@ -185,9 +185,9 @@ func (h *websocketStreamHandler) portForward(p *websocketStreamPair) { defer p.dataStream.Close() defer p.errorStream.Close() - klog.V(5).Infof("(conn=%p) invoking forwarder.PortForward for port %d", h.conn, p.port) + klog.V(5).InfoS("Connection invoking forwarder.PortForward for port", "connection", h.conn, "port", p.port) err := h.forwarder.PortForward(h.pod, h.uid, p.port, p.dataStream) - klog.V(5).Infof("(conn=%p) done invoking forwarder.PortForward for port %d", h.conn, p.port) + klog.V(5).InfoS("Connection done invoking forwarder.PortForward for port", "connection", h.conn, "port", p.port) if err != nil { msg := fmt.Errorf("error forwarding port %d to pod %s, uid %v: %v", p.port, h.pod, h.uid, err) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cri/streaming/remotecommand/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/cri/streaming/remotecommand/BUILD deleted file mode 100644 index 3cd81c00c331..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cri/streaming/remotecommand/BUILD +++ /dev/null @@ -1,46 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "attach.go", - "doc.go", - "exec.go", - "httpstream.go", - "websocket.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/cri/streaming/remotecommand", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/httpstream/spdy:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/remotecommand:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/httplog:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/wsstream:go_default_library", - "//staging/src/k8s.io/client-go/tools/remotecommand:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cri/streaming/remotecommand/httpstream.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cri/streaming/remotecommand/httpstream.go index 9be6c4345e21..c1054152d350 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cri/streaming/remotecommand/httpstream.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cri/streaming/remotecommand/httpstream.go @@ -54,7 +54,7 @@ func NewOptions(req *http.Request) (*Options, error) { stderr := req.FormValue(api.ExecStderrParam) == "1" if tty && stderr { // TODO: make this an error before we reach this method - klog.V(4).Infof("Access to exec with tty and stderr is not supported, bypassing stderr") + klog.V(4).InfoS("Access to exec with tty and stderr is not supported, bypassing stderr") stderr = false } @@ -155,7 +155,7 @@ func createHTTPStreamStreams(req *http.Request, w http.ResponseWriter, opts *Opt case remotecommandconsts.StreamProtocolV2Name: handler = &v2ProtocolHandler{} case "": - klog.V(4).Infof("Client did not request protocol negotiation. Falling back to %q", remotecommandconsts.StreamProtocolV1Name) + klog.V(4).InfoS("Client did not request protocol negotiation. Falling back", "protocol", remotecommandconsts.StreamProtocolV1Name) fallthrough case remotecommandconsts.StreamProtocolV1Name: handler = &v1ProtocolHandler{} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/BUILD deleted file mode 100644 index 57919f932b88..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/BUILD +++ /dev/null @@ -1,156 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "convert.go", - "doc.go", - "docker_checkpoint.go", - "docker_container.go", - "docker_container_unsupported.go", - "docker_container_windows.go", - "docker_image.go", - "docker_image_linux.go", - "docker_image_unsupported.go", - "docker_image_windows.go", - "docker_legacy_service.go", - "docker_logs.go", - "docker_sandbox.go", - "docker_service.go", - "docker_stats.go", - "docker_stats_linux.go", - "docker_stats_unsupported.go", - "docker_stats_windows.go", - "docker_streaming.go", - "docker_streaming_others.go", - "docker_streaming_windows.go", - "exec.go", - "helpers.go", - "helpers_linux.go", - "helpers_unsupported.go", - "helpers_windows.go", - "naming.go", - "security_context.go", - "selinux_util.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/dockershim", - visibility = ["//visibility:public"], - deps = [ - "//pkg/credentialprovider:go_default_library", - "//pkg/kubelet/apis/config:go_default_library", - "//pkg/kubelet/checkpointmanager:go_default_library", - "//pkg/kubelet/checkpointmanager/checksum:go_default_library", - "//pkg/kubelet/checkpointmanager/errors:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/cri/streaming:go_default_library", - "//pkg/kubelet/dockershim/cm:go_default_library", - "//pkg/kubelet/dockershim/libdocker:go_default_library", - "//pkg/kubelet/dockershim/metrics:go_default_library", - "//pkg/kubelet/dockershim/network:go_default_library", - "//pkg/kubelet/dockershim/network/cni:go_default_library", - "//pkg/kubelet/dockershim/network/hostport:go_default_library", - "//pkg/kubelet/dockershim/network/kubenet:go_default_library", - "//pkg/kubelet/leaky:go_default_library", - "//pkg/kubelet/legacy:go_default_library", - "//pkg/kubelet/types:go_default_library", - "//pkg/kubelet/util/cache:go_default_library", - "//pkg/kubelet/util/ioutils:go_default_library", - "//pkg/util/parsers:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/client-go/tools/remotecommand:go_default_library", - "//staging/src/k8s.io/cri-api/pkg/apis/runtime/v1alpha2:go_default_library", - "//vendor/github.com/armon/circbuf:go_default_library", - "//vendor/github.com/blang/semver:go_default_library", - "//vendor/github.com/docker/docker/api/types:go_default_library", - "//vendor/github.com/docker/docker/api/types/container:go_default_library", - "//vendor/github.com/docker/docker/api/types/filters:go_default_library", - "//vendor/github.com/docker/docker/api/types/strslice:go_default_library", - "//vendor/github.com/docker/docker/pkg/jsonmessage:go_default_library", - "//vendor/github.com/docker/go-connections/nat:go_default_library", - "//vendor/google.golang.org/grpc/codes:go_default_library", - "//vendor/google.golang.org/grpc/status:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - ] + select({ - "@io_bazel_rules_go//go/platform:windows": [ - "//pkg/kubelet/apis:go_default_library", - "//pkg/kubelet/winstats:go_default_library", - "//vendor/github.com/Microsoft/hcsshim:go_default_library", - "//vendor/golang.org/x/sys/windows/registry:go_default_library", - ], - "//conditions:default": [], - }), -) - -go_test( - name = "go_default_test", - srcs = [ - "convert_test.go", - "docker_checkpoint_test.go", - "docker_container_test.go", - "docker_container_windows_test.go", - "docker_image_test.go", - "docker_sandbox_test.go", - "docker_service_test.go", - "docker_stats_test.go", - "exec_test.go", - "helpers_linux_test.go", - "helpers_test.go", - "naming_test.go", - "security_context_test.go", - "selinux_util_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/checkpointmanager:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/container/testing:go_default_library", - "//pkg/kubelet/dockershim/libdocker:go_default_library", - "//pkg/kubelet/dockershim/libdocker/testing:go_default_library", - "//pkg/kubelet/dockershim/network:go_default_library", - "//pkg/kubelet/dockershim/network/testing:go_default_library", - "//pkg/kubelet/types:go_default_library", - "//pkg/kubelet/util/cache:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/client-go/tools/remotecommand:go_default_library", - "//staging/src/k8s.io/cri-api/pkg/apis/runtime/v1alpha2:go_default_library", - "//vendor/github.com/blang/semver:go_default_library", - "//vendor/github.com/docker/docker/api/types:go_default_library", - "//vendor/github.com/docker/docker/api/types/container:go_default_library", - "//vendor/github.com/docker/docker/pkg/jsonmessage:go_default_library", - "//vendor/github.com/docker/go-connections/nat:go_default_library", - "//vendor/github.com/golang/mock/gomock:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - ] + select({ - "@io_bazel_rules_go//go/platform:windows": [ - "//vendor/golang.org/x/sys/windows/registry:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/kubelet/dockershim/cm:all-srcs", - "//pkg/kubelet/dockershim/libdocker:all-srcs", - "//pkg/kubelet/dockershim/metrics:all-srcs", - "//pkg/kubelet/dockershim/network:all-srcs", - "//pkg/kubelet/dockershim/remote:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/cm/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/cm/BUILD deleted file mode 100644 index 880288320952..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/cm/BUILD +++ /dev/null @@ -1,92 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "container_manager.go", - "container_manager_linux.go", - "container_manager_unsupported.go", - "container_manager_windows.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/dockershim/cm", - deps = select({ - "@io_bazel_rules_go//go/platform:aix": [ - "//pkg/kubelet/dockershim/libdocker:go_default_library", - ], - "@io_bazel_rules_go//go/platform:android": [ - "//pkg/kubelet/cm:go_default_library", - "//pkg/kubelet/dockershim/libdocker:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/version:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/cgroups:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/configs:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "//pkg/kubelet/dockershim/libdocker:go_default_library", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "//pkg/kubelet/dockershim/libdocker:go_default_library", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "//pkg/kubelet/dockershim/libdocker:go_default_library", - ], - "@io_bazel_rules_go//go/platform:illumos": [ - "//pkg/kubelet/dockershim/libdocker:go_default_library", - ], - "@io_bazel_rules_go//go/platform:ios": [ - "//pkg/kubelet/dockershim/libdocker:go_default_library", - ], - "@io_bazel_rules_go//go/platform:js": [ - "//pkg/kubelet/dockershim/libdocker:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//pkg/kubelet/cm:go_default_library", - "//pkg/kubelet/dockershim/libdocker:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/version:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/cgroups:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/configs:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "//pkg/kubelet/dockershim/libdocker:go_default_library", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "//pkg/kubelet/dockershim/libdocker:go_default_library", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "//pkg/kubelet/dockershim/libdocker:go_default_library", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "//pkg/kubelet/dockershim/libdocker:go_default_library", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "//pkg/kubelet/dockershim/libdocker:go_default_library", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "//pkg/kubelet/dockershim/libdocker:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/cm/container_manager_linux.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/cm/container_manager_linux.go index 4430efb538ca..f515a5bfb25e 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/cm/container_manager_linux.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/cm/container_manager_linux.go @@ -28,6 +28,7 @@ import ( "github.com/opencontainers/runc/libcontainer/cgroups" cgroupfs "github.com/opencontainers/runc/libcontainer/cgroups/fs" "github.com/opencontainers/runc/libcontainer/configs" + libcontainerdevices "github.com/opencontainers/runc/libcontainer/devices" utilversion "k8s.io/apimachinery/pkg/util/version" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/klog/v2" @@ -88,19 +89,19 @@ func (m *containerManager) Start() error { func (m *containerManager) doWork() { v, err := m.client.Version() if err != nil { - klog.Errorf("Unable to get docker version: %v", err) + klog.ErrorS(err, "Unable to get docker version") return } version, err := utilversion.ParseGeneric(v.APIVersion) if err != nil { - klog.Errorf("Unable to parse docker version %q: %v", v.APIVersion, err) + klog.ErrorS(err, "Unable to parse docker version", "dockerVersion", v.APIVersion) return } // EnsureDockerInContainer does two things. // 1. Ensure processes run in the cgroups if m.cgroupsManager is not nil. // 2. Ensure processes have the OOM score applied. if err := kubecm.EnsureDockerInContainer(version, dockerOOMScoreAdj, m.cgroupsManager); err != nil { - klog.Errorf("Unable to ensure the docker processes run in the desired containers: %v", err) + klog.ErrorS(err, "Unable to ensure the docker processes run in the desired containers") } } @@ -109,7 +110,7 @@ func createCgroupManager(name string) (cgroups.Manager, error) { memoryCapacity, err := getMemoryCapacity() if err != nil { - klog.Errorf("Failed to get the memory capacity on machine: %v", err) + klog.ErrorS(err, "Failed to get the memory capacity on machine") } else { memoryLimit = memoryCapacity * dockerMemoryLimitThresholdPercent / 100 } @@ -117,7 +118,7 @@ func createCgroupManager(name string) (cgroups.Manager, error) { if err != nil || memoryLimit < minDockerMemoryLimit { memoryLimit = minDockerMemoryLimit } - klog.V(2).Infof("Configure resource-only container %q with memory limit: %d", name, memoryLimit) + klog.V(2).InfoS("Configure resource-only container with memory limit", "containerName", name, "memoryLimit", memoryLimit) cg := &configs.Cgroup{ Parent: "/", @@ -126,10 +127,10 @@ func createCgroupManager(name string) (cgroups.Manager, error) { Memory: int64(memoryLimit), MemorySwap: -1, SkipDevices: true, - Devices: []*configs.DeviceRule{ + Devices: []*libcontainerdevices.Rule{ { - Minor: configs.Wildcard, - Major: configs.Wildcard, + Minor: libcontainerdevices.Wildcard, + Major: libcontainerdevices.Wildcard, Type: 'a', Permissions: "rwm", Allow: true, diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_container.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_container.go index 3c61e13cf914..55d8b90908c2 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_container.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_container.go @@ -73,7 +73,7 @@ func (ds *dockerService) ListContainers(_ context.Context, r *runtimeapi.ListCon converted, err := toRuntimeAPIContainer(&c) if err != nil { - klog.V(4).Infof("Unable to convert docker to runtime API container: %v", err) + klog.V(4).InfoS("Unable to convert docker to runtime API container", "err", err) continue } @@ -234,7 +234,7 @@ func (ds *dockerService) createContainerLogSymlink(containerID string) error { } if path == "" { - klog.V(5).Infof("Container %s log path isn't specified, will not create the symlink", containerID) + klog.V(5).InfoS("Container log path isn't specified, will not create the symlink", "containerID", containerID) return nil } @@ -242,7 +242,7 @@ func (ds *dockerService) createContainerLogSymlink(containerID string) error { // Only create the symlink when container log path is specified and log file exists. // Delete possibly existing file first if err = ds.os.Remove(path); err == nil { - klog.Warningf("Deleted previously existing symlink file: %q", path) + klog.InfoS("Deleted previously existing symlink file", "path", path) } if err = ds.os.Symlink(realPath, path); err != nil { return fmt.Errorf("failed to create symbolic link %q to the container log file %q for container %q: %v", @@ -251,14 +251,14 @@ func (ds *dockerService) createContainerLogSymlink(containerID string) error { } else { supported, err := ds.IsCRISupportedLogDriver() if err != nil { - klog.Warningf("Failed to check supported logging driver by CRI: %v", err) + klog.InfoS("Failed to check supported logging driver by CRI", "err", err) return nil } if supported { - klog.Warningf("Cannot create symbolic link because container log file doesn't exist!") + klog.InfoS("Cannot create symbolic link because container log file doesn't exist!") } else { - klog.V(5).Infof("Unsupported logging driver by CRI") + klog.V(5).InfoS("Unsupported logging driver by CRI") } } @@ -371,7 +371,7 @@ func (ds *dockerService) ContainerStatus(_ context.Context, req *runtimeapi.Cont if !libdocker.IsImageNotFoundError(err) { return nil, fmt.Errorf("unable to inspect docker image %q while inspecting docker container %q: %v", r.Image, containerID, err) } - klog.Warningf("ignore error image %q not found while inspecting docker container %q: %v", r.Image, containerID, err) + klog.InfoS("Ignore error image not found while inspecting docker container", "containerID", containerID, "image", r.Image, "err", err) } imageID := toPullableImageID(r.Image, ir) @@ -387,12 +387,15 @@ func (ds *dockerService) ContainerStatus(_ context.Context, req *runtimeapi.Cont // Note: Can't set SeLinuxRelabel }) } - // Interpret container states. + // Interpret container states and convert time to unix timestamps. var state runtimeapi.ContainerState var reason, message string + ct, st, ft := createdAt.UnixNano(), int64(0), int64(0) if r.State.Running { // Container is running. state = runtimeapi.ContainerState_CONTAINER_RUNNING + // If container is not in the exited state, not set finished timestamp + st = startedAt.UnixNano() } else { // Container is *not* running. We need to get more details. // * Case 1: container has run and exited with non-zero finishedAt @@ -402,6 +405,7 @@ func (ds *dockerService) ContainerStatus(_ context.Context, req *runtimeapi.Cont // * Case 3: container has been created, but not started (yet). if !finishedAt.IsZero() { // Case 1 state = runtimeapi.ContainerState_CONTAINER_EXITED + st, ft = startedAt.UnixNano(), finishedAt.UnixNano() switch { case r.State.OOMKilled: // TODO: consider exposing OOMKilled via the runtimeAPI. @@ -415,18 +419,15 @@ func (ds *dockerService) ContainerStatus(_ context.Context, req *runtimeapi.Cont } } else if r.State.ExitCode != 0 { // Case 2 state = runtimeapi.ContainerState_CONTAINER_EXITED - // Adjust finshedAt and startedAt time to createdAt time to avoid + // Adjust finished and started timestamp to createdAt time to avoid // the confusion. - finishedAt, startedAt = createdAt, createdAt + st, ft = createdAt.UnixNano(), createdAt.UnixNano() reason = "ContainerCannotRun" } else { // Case 3 state = runtimeapi.ContainerState_CONTAINER_CREATED } message = r.State.Error } - - // Convert to unix timestamps. - ct, st, ft := createdAt.UnixNano(), startedAt.UnixNano(), finishedAt.UnixNano() exitCode := int32(r.State.ExitCode) metadata, err := parseContainerName(r.Name) @@ -498,7 +499,7 @@ func (ds *dockerService) performPlatformSpecificContainerCleanupAndLogErrors(con errors := ds.performPlatformSpecificContainerCleanup(cleanupInfo) for _, err := range errors { - klog.Warningf("error when cleaning up after container %q: %v", containerNameOrID, err) + klog.InfoS("Error when cleaning up after container", "containerNameOrID", containerNameOrID, "err", err) } return errors diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_image.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_image.go index de213fd426e5..0ddf3aa9f0e0 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_image.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_image.go @@ -54,7 +54,7 @@ func (ds *dockerService) ListImages(_ context.Context, r *runtimeapi.ListImagesR for _, i := range images { apiImage, err := imageToRuntimeAPIImage(&i) if err != nil { - klog.V(5).Infof("Failed to convert docker API image %+v to runtime API image: %v", i, err) + klog.V(5).InfoS("Failed to convert docker API image to runtime API image", "image", i, "err", err) continue } result = append(result, apiImage) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_image_linux.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_image_linux.go index 1c386d3ead40..021717c36d60 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_image_linux.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_image_linux.go @@ -33,7 +33,7 @@ import ( func (ds *dockerService) ImageFsInfo(_ context.Context, _ *runtimeapi.ImageFsInfoRequest) (*runtimeapi.ImageFsInfoResponse, error) { info, err := ds.client.Info() if err != nil { - klog.Errorf("Failed to get docker info: %v", err) + klog.ErrorS(err, "Failed to get docker info") return nil, err } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_image_windows.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_image_windows.go index 90da2e0f1ad0..2a74adf7e7e6 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_image_windows.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_image_windows.go @@ -32,14 +32,14 @@ import ( func (ds *dockerService) ImageFsInfo(_ context.Context, _ *runtimeapi.ImageFsInfoRequest) (*runtimeapi.ImageFsInfoResponse, error) { info, err := ds.client.Info() if err != nil { - klog.Errorf("Failed to get docker info: %v", err) + klog.ErrorS(err, "Failed to get docker info") return nil, err } statsClient := &winstats.StatsClient{} fsinfo, err := statsClient.GetDirFsInfo(info.DockerRootDir) if err != nil { - klog.Errorf("Failed to get dir fsInfo for %q: %v", info.DockerRootDir, err) + klog.ErrorS(err, "Failed to get fsInfo for dockerRootDir", "path", info.DockerRootDir) return nil, err } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_legacy_service.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_legacy_service.go index 6fae022c9bdd..ec10637cfc50 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_legacy_service.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_legacy_service.go @@ -43,7 +43,7 @@ import ( // `DockerLegacyService`, and we want to be able to build the `kubelet` without // relying on `github.com/docker/docker` or `pkg/kubelet/dockershim`. // -// See https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/20200205-build-kubelet-without-docker.md +// See https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/1547-building-kubelet-without-docker/README.md // for details. // GetContainerLogs get container logs directly from docker daemon. @@ -85,7 +85,7 @@ func (d *dockerService) GetContainerLogs(_ context.Context, pod *v1.Pod, contain } err = d.client.Logs(containerID.ID, opts, sopts) if errors.Is(err, errMaximumWrite) { - klog.V(2).Infof("finished logs, hit byte limit %d", *logOptions.LimitBytes) + klog.V(2).InfoS("Finished logs, hit byte limit", "byteLimit", *logOptions.LimitBytes) err = nil } return err diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_sandbox.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_sandbox.go index 81f8b771897b..793698341895 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_sandbox.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_sandbox.go @@ -40,7 +40,7 @@ import ( ) const ( - defaultSandboxImage = "k8s.gcr.io/pause:3.2" + defaultSandboxImage = "k8s.gcr.io/pause:3.4.1" // Various default sandbox resources requests/limits. defaultSandboxCPUshares int64 = 2 @@ -233,12 +233,11 @@ func (ds *dockerService) StopPodSandbox(ctx context.Context, r *runtimeapi.StopP if checkpointErr != errors.ErrCheckpointNotFound { err := ds.checkpointManager.RemoveCheckpoint(podSandboxID) if err != nil { - klog.Errorf("Failed to delete corrupt checkpoint for sandbox %q: %v", podSandboxID, err) + klog.ErrorS(err, "Failed to delete corrupt checkpoint for sandbox", "podSandboxID", podSandboxID) } } if libdocker.IsContainerNotFoundError(statusErr) { - klog.Warningf("Both sandbox container and checkpoint for id %q could not be found. "+ - "Proceed without further sandbox information.", podSandboxID) + klog.InfoS("Both sandbox container and checkpoint could not be found. Proceed without further sandbox information.", "podSandboxID", podSandboxID) } else { return nil, utilerrors.NewAggregate([]error{ fmt.Errorf("failed to get checkpoint for sandbox %q: %v", podSandboxID, checkpointErr), @@ -272,7 +271,7 @@ func (ds *dockerService) StopPodSandbox(ctx context.Context, r *runtimeapi.StopP if err := ds.client.StopContainer(podSandboxID, defaultSandboxGracePeriod); err != nil { // Do not return error if the container does not exist if !libdocker.IsContainerNotFoundError(err) { - klog.Errorf("Failed to stop sandbox %q: %v", podSandboxID, err) + klog.ErrorS(err, "Failed to stop sandbox", "podSandboxID", podSandboxID) errList = append(errList, err) } else { // remove the checkpoint for any sandbox that is not found in the runtime @@ -399,7 +398,7 @@ func (ds *dockerService) getIPs(podSandboxID string, sandbox *dockertypes.Contai // If all else fails, warn but don't return an error, as pod status // should generally not return anything except fatal errors // FIXME: handle network errors by restarting the pod somehow? - klog.Warningf("failed to read pod IP from plugin/docker: %v", err) + klog.InfoS("Failed to read pod IP from plugin/docker", "err", err) return ips } @@ -532,7 +531,7 @@ func (ds *dockerService) ListPodSandbox(_ context.Context, r *runtimeapi.ListPod if filter == nil { checkpoints, err = ds.checkpointManager.ListCheckpoints() if err != nil { - klog.Errorf("Failed to list checkpoints: %v", err) + klog.ErrorS(err, "Failed to list checkpoints") } } @@ -549,7 +548,7 @@ func (ds *dockerService) ListPodSandbox(_ context.Context, r *runtimeapi.ListPod c := containers[i] converted, err := containerToRuntimeAPISandbox(&c) if err != nil { - klog.V(4).Infof("Unable to convert docker to runtime API sandbox %+v: %v", c, err) + klog.V(4).InfoS("Unable to convert docker to runtime API sandbox", "containerName", c.Names, "err", err) continue } if filterOutReadySandboxes && converted.State == runtimeapi.PodSandboxState_SANDBOX_READY { @@ -569,11 +568,11 @@ func (ds *dockerService) ListPodSandbox(_ context.Context, r *runtimeapi.ListPod checkpoint := NewPodSandboxCheckpoint("", "", &CheckpointData{}) err := ds.checkpointManager.GetCheckpoint(id, checkpoint) if err != nil { - klog.Errorf("Failed to retrieve checkpoint for sandbox %q: %v", id, err) + klog.ErrorS(err, "Failed to retrieve checkpoint for sandbox", "sandboxID", id) if err == errors.ErrCorruptCheckpoint { err = ds.checkpointManager.RemoveCheckpoint(id) if err != nil { - klog.Errorf("Failed to delete corrupt checkpoint for sandbox %q: %v", id, err) + klog.ErrorS(err, "Failed to delete corrupt checkpoint for sandbox", "sandboxID", id) } } continue @@ -662,7 +661,6 @@ func (ds *dockerService) makeSandboxDockerConfig(c *runtimeapi.PodSandboxConfig, securityOpts := ds.getSandBoxSecurityOpts(securityOptSeparator) hc.SecurityOpt = append(hc.SecurityOpt, securityOpts...) - applyExperimentalCreateConfig(createConfig, c.Annotations) return createConfig, nil } @@ -720,14 +718,14 @@ func toCheckpointProtocol(protocol runtimeapi.Protocol) Protocol { case runtimeapi.Protocol_SCTP: return protocolSCTP } - klog.Warningf("Unknown protocol %q: defaulting to TCP", protocol) + klog.InfoS("Unknown protocol, defaulting to TCP", "protocol", protocol) return protocolTCP } // rewriteResolvFile rewrites resolv.conf file generated by docker. func rewriteResolvFile(resolvFilePath string, dns []string, dnsSearch []string, dnsOptions []string) error { if len(resolvFilePath) == 0 { - klog.Errorf("ResolvConfPath is empty.") + klog.ErrorS(nil, "ResolvConfPath is empty.") return nil } @@ -752,9 +750,9 @@ func rewriteResolvFile(resolvFilePath string, dns []string, dnsSearch []string, resolvFileContentStr := strings.Join(resolvFileContent, "\n") resolvFileContentStr += "\n" - klog.V(4).Infof("Will attempt to re-write config file %s with: \n%s", resolvFilePath, resolvFileContent) + klog.V(4).InfoS("Will attempt to re-write config file", "path", resolvFilePath, "fileContent", resolvFileContent) if err := rewriteFile(resolvFilePath, resolvFileContentStr); err != nil { - klog.Errorf("resolv.conf could not be updated: %v", err) + klog.ErrorS(err, "Resolv.conf could not be updated") return err } } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_service.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_service.go index 48581c95614e..e402ef0c3bb4 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_service.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_service.go @@ -22,8 +22,10 @@ import ( "context" "fmt" "net/http" + "os" "path" "path/filepath" + "runtime" "sync" "time" @@ -237,7 +239,7 @@ func NewDockerService(config *ClientConfig, podSandboxImage string, streamingCon // lead to retries of the same failure, so just fail hard. return nil, err } - klog.Infof("Hairpin mode set to %q", pluginSettings.HairpinMode) + klog.InfoS("Hairpin mode is set", "hairpinMode", pluginSettings.HairpinMode) // dockershim currently only supports CNI plugins. pluginSettings.PluginBinDirs = cni.SplitDirs(pluginSettings.PluginBinDirString) @@ -252,26 +254,30 @@ func NewDockerService(config *ClientConfig, podSandboxImage string, streamingCon return nil, fmt.Errorf("didn't find compatible CNI plugin with given settings %+v: %v", pluginSettings, err) } ds.network = network.NewPluginManager(plug) - klog.Infof("Docker cri networking managed by %v", plug.Name()) - - // NOTE: cgroup driver is only detectable in docker 1.11+ - cgroupDriver := defaultCgroupDriver - dockerInfo, err := ds.client.Info() - klog.Infof("Docker Info: %+v", dockerInfo) - if err != nil { - klog.Errorf("Failed to execute Info() call to the Docker client: %v", err) - klog.Warningf("Falling back to use the default driver: %q", cgroupDriver) - } else if len(dockerInfo.CgroupDriver) == 0 { - klog.Warningf("No cgroup driver is set in Docker") - klog.Warningf("Falling back to use the default driver: %q", cgroupDriver) - } else { - cgroupDriver = dockerInfo.CgroupDriver - } - if len(kubeCgroupDriver) != 0 && kubeCgroupDriver != cgroupDriver { - return nil, fmt.Errorf("misconfiguration: kubelet cgroup driver: %q is different from docker cgroup driver: %q", kubeCgroupDriver, cgroupDriver) + klog.InfoS("Docker cri networking managed by the network plugin", "networkPluginName", plug.Name()) + + // skipping cgroup driver checks for Windows + if runtime.GOOS == "linux" { + // NOTE: cgroup driver is only detectable in docker 1.11+ + cgroupDriver := defaultCgroupDriver + dockerInfo, err := ds.client.Info() + klog.InfoS("Docker Info", "dockerInfo", dockerInfo) + if err != nil { + klog.ErrorS(err, "Failed to execute Info() call to the Docker client") + klog.InfoS("Falling back to use the default driver", "cgroupDriver", cgroupDriver) + } else if len(dockerInfo.CgroupDriver) == 0 { + klog.InfoS("No cgroup driver is set in Docker") + klog.InfoS("Falling back to use the default driver", "cgroupDriver", cgroupDriver) + } else { + cgroupDriver = dockerInfo.CgroupDriver + } + if len(kubeCgroupDriver) != 0 && kubeCgroupDriver != cgroupDriver { + return nil, fmt.Errorf("misconfiguration: kubelet cgroup driver: %q is different from docker cgroup driver: %q", kubeCgroupDriver, cgroupDriver) + } + klog.InfoS("Setting cgroupDriver", "cgroupDriver", cgroupDriver) + ds.cgroupDriver = cgroupDriver } - klog.Infof("Setting cgroupDriver to %s", cgroupDriver) - ds.cgroupDriver = cgroupDriver + ds.versionCache = cache.NewObjectCache( func() (interface{}, error) { return ds.getDockerVersion() @@ -350,7 +356,7 @@ func (ds *dockerService) UpdateRuntimeConfig(_ context.Context, r *runtimeapi.Up return &runtimeapi.UpdateRuntimeConfigResponse{}, nil } - klog.Infof("docker cri received runtime config %+v", runtimeConfig) + klog.InfoS("Docker cri received runtime config", "runtimeConfig", runtimeConfig) if ds.network != nil && runtimeConfig.NetworkConfig.PodCidr != "" { event := make(map[string]interface{}) event[network.NET_PLUGIN_EVENT_POD_CIDR_CHANGE_DETAIL_CIDR] = runtimeConfig.NetworkConfig.PodCidr @@ -383,7 +389,7 @@ func (ds *dockerService) GetPodPortMappings(podSandboxID string) ([]*hostport.Po } errRem := ds.checkpointManager.RemoveCheckpoint(podSandboxID) if errRem != nil { - klog.Errorf("Failed to delete corrupt checkpoint for sandbox %q: %v", podSandboxID, errRem) + klog.ErrorS(errRem, "Failed to delete corrupt checkpoint for sandbox", "podSandboxID", podSandboxID) } return nil, err } @@ -407,7 +413,8 @@ func (ds *dockerService) Start() error { go func() { if err := ds.streamingServer.Start(true); err != nil { - klog.Fatalf("Streaming server stopped unexpectedly: %v", err) + klog.ErrorS(err, "Streaming server stopped unexpectedly") + os.Exit(1) } }() @@ -420,7 +427,7 @@ func (ds *dockerService) initCleanup() { errors := ds.platformSpecificContainerInitCleanup() for _, err := range errors { - klog.Warningf("initialization error: %v", err) + klog.InfoS("Initialization error", "err", err) } } @@ -469,7 +476,7 @@ func (ds *dockerService) GenerateExpectedCgroupParent(cgroupParent string) (stri cgroupParent = path.Base(cgroupParent) } } - klog.V(3).Infof("Setting cgroup parent to: %q", cgroupParent) + klog.V(3).InfoS("Setting cgroup parent", "cgroupParent", cgroupParent) return cgroupParent, nil } @@ -537,7 +544,7 @@ func toAPIProtocol(protocol Protocol) v1.Protocol { case protocolSCTP: return v1.ProtocolSCTP } - klog.Warningf("Unknown protocol %q: defaulting to TCP", protocol) + klog.InfoS("Unknown protocol, defaulting to TCP", "protocol", protocol) return v1.ProtocolTCP } @@ -556,7 +563,7 @@ func effectiveHairpinMode(s *NetworkPluginSettings) error { // This is not a valid combination, since promiscuous-bridge only works on kubenet. Users might be using the // default values (from before the hairpin-mode flag existed) and we // should keep the old behavior. - klog.Warningf("Hairpin mode set to %q but kubenet is not enabled, falling back to %q", s.HairpinMode, kubeletconfig.HairpinVeth) + klog.InfoS("Hairpin mode is set but kubenet is not enabled, falling back to HairpinVeth", "hairpinMode", s.HairpinMode) s.HairpinMode = kubeletconfig.HairpinVeth return nil } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_stats_windows.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_stats_windows.go index 646bfbd5aa1d..451a183aab04 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_stats_windows.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_stats_windows.go @@ -20,6 +20,7 @@ package dockershim import ( "context" + "strings" "time" "github.com/Microsoft/hcsshim" @@ -39,19 +40,29 @@ func (ds *dockerService) getContainerStats(containerID string) (*runtimeapi.Cont // That will typically happen with init-containers in Exited state. Docker still knows about them but the HCS does not. // As we don't want to block stats retrieval for other containers, we only log errors. if !hcsshim.IsNotExist(err) && !hcsshim.IsAlreadyStopped(err) { - klog.Errorf("Error opening container (stats will be missing) '%s': %v", containerID, err) + klog.V(4).InfoS("Error opening container (stats will be missing)", "containerID", containerID, "err", err) } return nil, nil } defer func() { closeErr := hcsshimContainer.Close() if closeErr != nil { - klog.Errorf("Error closing container '%s': %v", containerID, closeErr) + klog.ErrorS(closeErr, "Error closing container", "containerID", containerID) } }() stats, err := hcsshimContainer.Statistics() if err != nil { + if strings.Contains(err.Error(), "0x5") || strings.Contains(err.Error(), "0xc0370105") { + // When the container is just created, querying for stats causes access errors because it hasn't started yet + // This is transient; skip container for now + // + // These hcs errors do not have helpers exposed in public package so need to query for the known codes + // https://github.com/microsoft/hcsshim/blob/master/internal/hcs/errors.go + // PR to expose helpers in hcsshim: https://github.com/microsoft/hcsshim/pull/933 + klog.V(4).InfoS("Container is not in a state that stats can be accessed. This occurs when the container is created but not started.", "containerID", containerID, "err", err) + return nil, nil + } return nil, err } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_streaming_others.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_streaming_others.go index 05035231fd2e..e4648706e6b7 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_streaming_others.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_streaming_others.go @@ -52,7 +52,7 @@ func (r *streamingRuntime) portForward(podSandboxID string, port int32, stream i } commandString := fmt.Sprintf("%s %s", nsenterPath, strings.Join(args, " ")) - klog.V(4).Infof("executing port forwarding command: %s", commandString) + klog.V(4).InfoS("Executing port forwarding command", "command", commandString) command := exec.Command(nsenterPath, args...) command.Stdout = stream diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/exec.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/exec.go index a735759a6151..b59867156ff7 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/exec.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/exec.go @@ -150,7 +150,7 @@ func (*NativeExecHandler) ExecInContainer(ctx context.Context, client libdocker. retries++ if retries == maxRetries { - klog.Errorf("Exec session %s in container %s terminated but process still running!", execObj.ID, container.ID) + klog.ErrorS(nil, "Exec session in the container terminated but process still running!", "execSession", execObj.ID, "containerID", container.ID) return nil } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/helpers.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/helpers.go index 87872f2778e7..44cc003601a0 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/helpers.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/helpers.go @@ -147,7 +147,7 @@ func generateMountBindings(mounts []*runtimeapi.Mount) []string { case runtimeapi.MountPropagation_PROPAGATION_HOST_TO_CONTAINER: attrs = append(attrs, "rslave") default: - klog.Warningf("unknown propagation mode for hostPath %q", m.HostPath) + klog.InfoS("Unknown propagation mode for hostPath", "path", m.HostPath) // Falls back to "private" } @@ -180,7 +180,7 @@ func makePortsAndBindings(pm []*runtimeapi.PortMapping) (dockernat.PortSet, map[ case runtimeapi.Protocol_SCTP: protocol = "/sctp" default: - klog.Warningf("Unknown protocol %q: defaulting to TCP", port.Protocol) + klog.InfoS("Unknown protocol, defaulting to TCP", "protocol", port.Protocol) protocol = "/tcp" } @@ -288,13 +288,13 @@ func recoverFromCreationConflictIfNeeded(client libdocker.Interface, createConfi } id := matches[1] - klog.Warningf("Unable to create pod sandbox due to conflict. Attempting to remove sandbox %q", id) + klog.InfoS("Unable to create pod sandbox due to conflict. Attempting to remove sandbox", "containerID", id) rmErr := client.RemoveContainer(id, dockertypes.ContainerRemoveOptions{RemoveVolumes: true}) if rmErr == nil { - klog.V(2).Infof("Successfully removed conflicting container %q", id) + klog.V(2).InfoS("Successfully removed conflicting container", "containerID", id) return nil, err } - klog.Errorf("Failed to remove the conflicting container %q: %v", id, rmErr) + klog.ErrorS(rmErr, "Failed to remove the conflicting container", "containerID", id) // Return if the error is not container not found error. if !libdocker.IsContainerNotFoundError(rmErr) { return nil, err @@ -302,7 +302,7 @@ func recoverFromCreationConflictIfNeeded(client libdocker.Interface, createConfi // randomize the name to avoid conflict. createConfig.Name = randomizeName(createConfig.Name) - klog.V(2).Infof("Create the container with randomized name %s", createConfig.Name) + klog.V(2).InfoS("Create the container with the randomized name", "containerName", createConfig.Name) return client.CreateContainer(createConfig) } @@ -337,7 +337,7 @@ func ensureSandboxImageExists(client libdocker.Interface, image string) error { keyring := credentialprovider.NewDockerKeyring() creds, withCredentials := keyring.Lookup(repoToPull) if !withCredentials { - klog.V(3).Infof("Pulling image %q without credentials", image) + klog.V(3).InfoS("Pulling the image without credentials", "image", image) err := client.PullImage(image, dockertypes.AuthConfig{}, dockertypes.ImagePullOptions{}) if err != nil { diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/helpers_linux.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/helpers_linux.go index dfc09da575ef..0020d1886d0f 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/helpers_linux.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/helpers_linux.go @@ -119,6 +119,7 @@ func (ds *dockerService) updateCreateConfig( CPUQuota: rOpts.CpuQuota, CPUPeriod: rOpts.CpuPeriod, CpusetCpus: rOpts.CpusetCpus, + CpusetMems: rOpts.CpusetMems, } createConfig.HostConfig.OomScoreAdj = int(rOpts.OomScoreAdj) } @@ -154,7 +155,3 @@ func getNetworkNamespace(c *dockertypes.ContainerJSON) (string, error) { } return fmt.Sprintf(dockerNetNSFmt, c.State.Pid), nil } - -// applyExperimentalCreateConfig applys experimental configures from sandbox annotations. -func applyExperimentalCreateConfig(createConfig *dockertypes.ContainerCreateConfig, annotations map[string]string) { -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/helpers_unsupported.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/helpers_unsupported.go index c81ba00c9811..b82894721c9a 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/helpers_unsupported.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/helpers_unsupported.go @@ -33,12 +33,12 @@ func DefaultMemorySwap() int64 { } func (ds *dockerService) getSecurityOpts(seccompProfile string, separator rune) ([]string, error) { - klog.Warningf("getSecurityOpts is unsupported in this build") + klog.InfoS("getSecurityOpts is unsupported in this build") return nil, nil } func (ds *dockerService) getSandBoxSecurityOpts(separator rune) []string { - klog.Warningf("getSandBoxSecurityOpts is unsupported in this build") + klog.InfoS("getSandBoxSecurityOpts is unsupported in this build") return nil } @@ -47,19 +47,15 @@ func (ds *dockerService) updateCreateConfig( config *runtimeapi.ContainerConfig, sandboxConfig *runtimeapi.PodSandboxConfig, podSandboxID string, securityOptSep rune, apiVersion *semver.Version) error { - klog.Warningf("updateCreateConfig is unsupported in this build") + klog.InfoS("updateCreateConfig is unsupported in this build") return nil } func (ds *dockerService) determinePodIPBySandboxID(uid string) []string { - klog.Warningf("determinePodIPBySandboxID is unsupported in this build") + klog.InfoS("determinePodIPBySandboxID is unsupported in this build") return nil } func getNetworkNamespace(c *dockertypes.ContainerJSON) (string, error) { return "", fmt.Errorf("unsupported platform") } - -// applyExperimentalCreateConfig applies experimental configures from sandbox annotations. -func applyExperimentalCreateConfig(createConfig *dockertypes.ContainerCreateConfig, annotations map[string]string) { -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/helpers_windows.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/helpers_windows.go index e94a0a4bd645..dcc258154f08 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/helpers_windows.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/helpers_windows.go @@ -29,7 +29,6 @@ import ( "k8s.io/klog/v2" runtimeapi "k8s.io/cri-api/pkg/apis/runtime/v1alpha2" - kubeletapis "k8s.io/kubernetes/pkg/kubelet/apis" ) // DefaultMemorySwap always returns 0 for no memory swap in a sandbox @@ -39,7 +38,7 @@ func DefaultMemorySwap() int64 { func (ds *dockerService) getSecurityOpts(seccompProfile string, separator rune) ([]string, error) { if seccompProfile != "" { - klog.Warningf("seccomp annotations are not supported on windows") + klog.InfoS("seccomp annotations are not supported on windows") } return nil, nil } @@ -50,17 +49,6 @@ func (ds *dockerService) getSandBoxSecurityOpts(separator rune) []string { return nil } -// applyExperimentalCreateConfig applys experimental configures from sandbox annotations. -func applyExperimentalCreateConfig(createConfig *dockertypes.ContainerCreateConfig, annotations map[string]string) { - if kubeletapis.ShouldIsolatedByHyperV(annotations) { - createConfig.HostConfig.Isolation = kubeletapis.HypervIsolationValue - - if networkMode := os.Getenv("CONTAINER_NETWORK"); networkMode == "" { - createConfig.HostConfig.NetworkMode = dockercontainer.NetworkMode("none") - } - } -} - func (ds *dockerService) updateCreateConfig( createConfig *dockertypes.ContainerCreateConfig, config *runtimeapi.ContainerConfig, @@ -68,7 +56,7 @@ func (ds *dockerService) updateCreateConfig( podSandboxID string, securityOptSep rune, apiVersion *semver.Version) error { if networkMode := os.Getenv("CONTAINER_NETWORK"); networkMode != "" { createConfig.HostConfig.NetworkMode = dockercontainer.NetworkMode(networkMode) - } else if !kubeletapis.ShouldIsolatedByHyperV(sandboxConfig.Annotations) { + } else { // Todo: Refactor this call in future for calling methods directly in security_context.go modifyHostOptionsForContainer(nil, podSandboxID, createConfig.HostConfig) } @@ -90,8 +78,6 @@ func (ds *dockerService) updateCreateConfig( applyWindowsContainerSecurityContext(wc.GetSecurityContext(), createConfig.Config, createConfig.HostConfig) } - applyExperimentalCreateConfig(createConfig, sandboxConfig.Annotations) - return nil } @@ -149,21 +135,12 @@ func (ds *dockerService) determinePodIPBySandboxID(sandboxID string) []string { // Instead of relying on this call, an explicit call to addToNetwork should be // done immediately after ContainerCreation, in case of Windows only. TBD Issue # to handle this - if r.HostConfig.Isolation == kubeletapis.HypervIsolationValue { - // Hyper-V only supports one container per Pod yet and the container will have a different - // IP address from sandbox. Return the first non-sandbox container IP as POD IP. - // TODO(feiskyer): remove this workaround after Hyper-V supports multiple containers per Pod. - if containerIPs := ds.getIPs(c.ID, r); len(containerIPs) != 0 { - return containerIPs - } - } else { - // Do not return any IP, so that we would continue and get the IP of the Sandbox. - // Windows 1709 and 1803 doesn't have the Namespace support, so getIP() is called - // to replicate the DNS registry key to the Workload container (IP/Gateway/MAC is - // set separately than DNS). - // TODO(feiskyer): remove this workaround after Namespace is supported in Windows RS5. - ds.getIPs(sandboxID, r) - } + // Do not return any IP, so that we would continue and get the IP of the Sandbox. + // Windows 1709 and 1803 doesn't have the Namespace support, so getIP() is called + // to replicate the DNS registry key to the Workload container (IP/Gateway/MAC is + // set separately than DNS). + // TODO(feiskyer): remove this workaround after Namespace is supported in Windows RS5. + ds.getIPs(sandboxID, r) } else { // ds.getIP will call the CNI plugin to fetch the IP if containerIPs := ds.getIPs(c.ID, r); len(containerIPs) != 0 { diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/libdocker/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/libdocker/BUILD deleted file mode 100644 index ff0cec6fc195..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/libdocker/BUILD +++ /dev/null @@ -1,62 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "helpers_test.go", - "kube_docker_client_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//vendor/github.com/docker/docker/api/types:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "client.go", - "fake_client.go", - "helpers.go", - "instrumented_client.go", - "kube_docker_client.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/dockershim/libdocker", - deps = [ - "//pkg/kubelet/dockershim/metrics:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//vendor/github.com/docker/distribution/reference:go_default_library", - "//vendor/github.com/docker/docker/api/types:go_default_library", - "//vendor/github.com/docker/docker/api/types/container:go_default_library", - "//vendor/github.com/docker/docker/api/types/image:go_default_library", - "//vendor/github.com/docker/docker/client:go_default_library", - "//vendor/github.com/docker/docker/pkg/jsonmessage:go_default_library", - "//vendor/github.com/docker/docker/pkg/stdcopy:go_default_library", - "//vendor/github.com/opencontainers/go-digest:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/kubelet/dockershim/libdocker/testing:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/libdocker/client.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/libdocker/client.go index 2e454ebc56db..c5886f83aa7a 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/libdocker/client.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/libdocker/client.go @@ -19,6 +19,7 @@ limitations under the License. package libdocker import ( + "os" "time" dockertypes "github.com/docker/docker/api/types" @@ -74,7 +75,7 @@ type Interface interface { // DOCKER_HOST, DOCKER_TLS_VERIFY, and DOCKER_CERT path per their spec func getDockerClient(dockerEndpoint string) (*dockerapi.Client, error) { if len(dockerEndpoint) > 0 { - klog.Infof("Connecting to docker on %s", dockerEndpoint) + klog.InfoS("Connecting to docker on the dockerEndpoint", "endpoint", dockerEndpoint) return dockerapi.NewClientWithOpts(dockerapi.WithHost(dockerEndpoint), dockerapi.WithVersion("")) } return dockerapi.NewClientWithOpts(dockerapi.FromEnv) @@ -89,8 +90,10 @@ func getDockerClient(dockerEndpoint string) (*dockerapi.Client, error) { func ConnectToDockerOrDie(dockerEndpoint string, requestTimeout, imagePullProgressDeadline time.Duration) Interface { client, err := getDockerClient(dockerEndpoint) if err != nil { - klog.Fatalf("Couldn't connect to docker: %v", err) + klog.ErrorS(err, "Couldn't connect to docker") + os.Exit(1) + } - klog.Infof("Start docker client with request timeout=%v", requestTimeout) + klog.InfoS("Start docker client with request timeout", "timeout", requestTimeout) return newKubeDockerClient(client, requestTimeout, imagePullProgressDeadline) } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/libdocker/helpers.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/libdocker/helpers.go index 84aa0a2d16be..af171493b6cd 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/libdocker/helpers.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/libdocker/helpers.go @@ -44,7 +44,7 @@ func matchImageTagOrSHA(inspected dockertypes.ImageInspect, image string) bool { // https://github.com/docker/distribution/blob/master/reference/reference.go#L4 named, err := dockerref.ParseNormalizedNamed(image) if err != nil { - klog.V(4).Infof("couldn't parse image reference %q: %v", image, err) + klog.V(4).InfoS("Couldn't parse image reference", "image", image, "err", err) return false } _, isTagged := named.(dockerref.Tagged) @@ -102,7 +102,7 @@ func matchImageTagOrSHA(inspected dockertypes.ImageInspect, image string) bool { for _, repoDigest := range inspected.RepoDigests { named, err := dockerref.ParseNormalizedNamed(repoDigest) if err != nil { - klog.V(4).Infof("couldn't parse image RepoDigest reference %q: %v", repoDigest, err) + klog.V(4).InfoS("Couldn't parse image RepoDigest reference", "digest", repoDigest, "err", err) continue } if d, isDigested := named.(dockerref.Digested); isDigested { @@ -116,14 +116,14 @@ func matchImageTagOrSHA(inspected dockertypes.ImageInspect, image string) bool { // process the ID as a digest id, err := godigest.Parse(inspected.ID) if err != nil { - klog.V(4).Infof("couldn't parse image ID reference %q: %v", id, err) + klog.V(4).InfoS("Couldn't parse image ID reference", "imageID", id, "err", err) return false } if digest.Digest().Algorithm().String() == id.Algorithm().String() && digest.Digest().Hex() == id.Hex() { return true } } - klog.V(4).Infof("Inspected image (%q) does not match %s", inspected.ID, image) + klog.V(4).InfoS("Inspected image ID does not match image", "inspectedImageID", inspected.ID, "image", image) return false } @@ -140,19 +140,19 @@ func matchImageIDOnly(inspected dockertypes.ImageInspect, image string) bool { // Otherwise, we should try actual parsing to be more correct ref, err := dockerref.Parse(image) if err != nil { - klog.V(4).Infof("couldn't parse image reference %q: %v", image, err) + klog.V(4).InfoS("Couldn't parse image reference", "image", image, "err", err) return false } digest, isDigested := ref.(dockerref.Digested) if !isDigested { - klog.V(4).Infof("the image reference %q was not a digest reference", image) + klog.V(4).InfoS("The image reference was not a digest reference", "image", image) return false } id, err := godigest.Parse(inspected.ID) if err != nil { - klog.V(4).Infof("couldn't parse image ID reference %q: %v", id, err) + klog.V(4).InfoS("Couldn't parse image ID reference", "imageID", id, "err", err) return false } @@ -160,6 +160,6 @@ func matchImageIDOnly(inspected dockertypes.ImageInspect, image string) bool { return true } - klog.V(4).Infof("The reference %s does not directly refer to the given image's ID (%q)", image, inspected.ID) + klog.V(4).InfoS("The image reference does not directly refer to the given image's ID", "image", image, "inspectedImageID", inspected.ID) return false } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/libdocker/kube_docker_client.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/libdocker/kube_docker_client.go index 804b5cd9fda4..3dfe4cf0145b 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/libdocker/kube_docker_client.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/libdocker/kube_docker_client.go @@ -145,7 +145,7 @@ func (d *kubeDockerClient) CreateContainer(opts dockertypes.ContainerCreateConfi if opts.HostConfig != nil && opts.HostConfig.ShmSize <= 0 { opts.HostConfig.ShmSize = defaultShmSize } - createResp, err := d.client.ContainerCreate(ctx, opts.Config, opts.HostConfig, opts.NetworkingConfig, opts.Name) + createResp, err := d.client.ContainerCreate(ctx, opts.Config, opts.HostConfig, opts.NetworkingConfig, nil, opts.Name) if ctxErr := contextError(ctx); ctxErr != nil { return nil, ctxErr } @@ -337,14 +337,14 @@ func (p *progressReporter) start() { progress, timestamp := p.progress.get() // If there is no progress for p.imagePullProgressDeadline, cancel the operation. if time.Since(timestamp) > p.imagePullProgressDeadline { - klog.Errorf("Cancel pulling image %q because of no progress for %v, latest progress: %q", p.image, p.imagePullProgressDeadline, progress) + klog.ErrorS(nil, "Cancel pulling image because of exceed image pull deadline, record latest progress", "image", p.image, "deadline", p.imagePullProgressDeadline, "progress", progress) p.cancel() return } - klog.V(2).Infof("Pulling image %q: %q", p.image, progress) + klog.V(2).InfoS("Pulling image", "image", p.image, "progress", progress) case <-p.stopCh: progress, _ := p.progress.get() - klog.V(2).Infof("Stop pulling image %q: %q", p.image, progress) + klog.V(2).InfoS("Stop pulling image", "image", p.image, "progress", progress) return } } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/metrics/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/metrics/BUILD deleted file mode 100644 index 30222f96444f..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/metrics/BUILD +++ /dev/null @@ -1,26 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["metrics.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/dockershim/metrics", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/BUILD deleted file mode 100644 index 96dc3441384d..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/BUILD +++ /dev/null @@ -1,59 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "network.go", - "plugins.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/dockershim/network", - visibility = ["//visibility:public"], - deps = [ - "//pkg/features:go_default_library", - "//pkg/kubelet/apis/config:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/dockershim/network/hostport:go_default_library", - "//pkg/kubelet/dockershim/network/metrics:go_default_library", - "//pkg/util/sysctl:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/kubelet/dockershim/network/cni:all-srcs", - "//pkg/kubelet/dockershim/network/hairpin:all-srcs", - "//pkg/kubelet/dockershim/network/hostport:all-srcs", - "//pkg/kubelet/dockershim/network/kubenet:all-srcs", - "//pkg/kubelet/dockershim/network/metrics:all-srcs", - "//pkg/kubelet/dockershim/network/testing:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["plugins_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/dockershim/network/metrics:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - "//staging/src/k8s.io/component-base/metrics/testutil:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/cni/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/cni/BUILD deleted file mode 100644 index 1c723a0d1dcd..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/cni/BUILD +++ /dev/null @@ -1,94 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "cni.go", - "cni_others.go", - "cni_windows.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/dockershim/network/cni", - deps = [ - "//pkg/kubelet/apis/config:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/dockershim/network:go_default_library", - "//pkg/util/bandwidth:go_default_library", - "//pkg/util/slice:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/cri-api/pkg/apis/runtime/v1alpha2:go_default_library", - "//vendor/github.com/containernetworking/cni/libcni:go_default_library", - "//vendor/github.com/containernetworking/cni/pkg/types:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - ] + select({ - "@io_bazel_rules_go//go/platform:windows": [ - "//vendor/github.com/containernetworking/cni/pkg/types/020:go_default_library", - ], - "//conditions:default": [], - }), -) - -go_test( - name = "go_default_test", - srcs = ["cni_test.go"], - embed = [":go_default_library"], - deps = select({ - "@io_bazel_rules_go//go/platform:android": [ - "//pkg/kubelet/apis/config:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/container/testing:go_default_library", - "//pkg/kubelet/dockershim/network:go_default_library", - "//pkg/kubelet/dockershim/network/cni/testing:go_default_library", - "//pkg/kubelet/dockershim/network/hostport:go_default_library", - "//pkg/kubelet/dockershim/network/testing:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/util/testing:go_default_library", - "//vendor/github.com/containernetworking/cni/pkg/types/020:go_default_library", - "//vendor/github.com/stretchr/testify/mock:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - "//vendor/k8s.io/utils/exec/testing:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//pkg/kubelet/apis/config:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/container/testing:go_default_library", - "//pkg/kubelet/dockershim/network:go_default_library", - "//pkg/kubelet/dockershim/network/cni/testing:go_default_library", - "//pkg/kubelet/dockershim/network/hostport:go_default_library", - "//pkg/kubelet/dockershim/network/testing:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/util/testing:go_default_library", - "//vendor/github.com/containernetworking/cni/pkg/types/020:go_default_library", - "//vendor/github.com/stretchr/testify/mock:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - "//vendor/k8s.io/utils/exec/testing:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/kubelet/dockershim/network/cni/testing:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/cni/cni.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/cni/cni.go index d977abd027bb..17fb268c4fa0 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/cni/cni.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/cni/cni.go @@ -170,30 +170,30 @@ func getDefaultCNINetwork(confDir string, binDirs []string) (*cniNetwork, error) if strings.HasSuffix(confFile, ".conflist") { confList, err = libcni.ConfListFromFile(confFile) if err != nil { - klog.Warningf("Error loading CNI config list file %s: %v", confFile, err) + klog.InfoS("Error loading CNI config list file", "path", confFile, "err", err) continue } } else { conf, err := libcni.ConfFromFile(confFile) if err != nil { - klog.Warningf("Error loading CNI config file %s: %v", confFile, err) + klog.InfoS("Error loading CNI config file", "path", confFile, "err", err) continue } // Ensure the config has a "type" so we know what plugin to run. // Also catches the case where somebody put a conflist into a conf file. if conf.Network.Type == "" { - klog.Warningf("Error loading CNI config file %s: no 'type'; perhaps this is a .conflist?", confFile) + klog.InfoS("Error loading CNI config file: no 'type'; perhaps this is a .conflist?", "path", confFile) continue } confList, err = libcni.ConfListFromConf(conf) if err != nil { - klog.Warningf("Error converting CNI config file %s to list: %v", confFile, err) + klog.InfoS("Error converting CNI config file to list", "path", confFile, "err", err) continue } } if len(confList.Plugins) == 0 { - klog.Warningf("CNI config list %s has no networks, skipping", string(confList.Bytes[:maxStringLengthInLog(len(confList.Bytes))])) + klog.InfoS("CNI config list has no networks, skipping", "configList", string(confList.Bytes[:maxStringLengthInLog(len(confList.Bytes))])) continue } @@ -201,11 +201,11 @@ func getDefaultCNINetwork(confDir string, binDirs []string) (*cniNetwork, error) // all plugins of this config exist on disk caps, err := cniConfig.ValidateNetworkList(context.TODO(), confList) if err != nil { - klog.Warningf("Error validating CNI config list %s: %v", string(confList.Bytes[:maxStringLengthInLog(len(confList.Bytes))]), err) + klog.InfoS("Error validating CNI config list", "configList", string(confList.Bytes[:maxStringLengthInLog(len(confList.Bytes))]), "err", err) continue } - klog.V(4).Infof("Using CNI configuration file %s", confFile) + klog.V(4).InfoS("Using CNI configuration file", "path", confFile) return &cniNetwork{ name: confList.Name, @@ -236,7 +236,7 @@ func (plugin *cniNetworkPlugin) Init(host network.Host, hairpinMode kubeletconfi func (plugin *cniNetworkPlugin) syncNetworkConfig() { network, err := getDefaultCNINetwork(plugin.confDir, plugin.binDirs) if err != nil { - klog.Warningf("Unable to update cni config: %s", err) + klog.InfoS("Unable to update cni config", "err", err) return } plugin.setDefaultNetwork(network) @@ -278,12 +278,12 @@ func (plugin *cniNetworkPlugin) Event(name string, details map[string]interface{ podCIDR, ok := details[network.NET_PLUGIN_EVENT_POD_CIDR_CHANGE_DETAIL_CIDR].(string) if !ok { - klog.Warningf("%s event didn't contain pod CIDR", network.NET_PLUGIN_EVENT_POD_CIDR_CHANGE) + klog.InfoS("The event didn't contain pod CIDR", "event", network.NET_PLUGIN_EVENT_POD_CIDR_CHANGE) return } if plugin.podCidr != "" { - klog.Warningf("Ignoring subsequent pod CIDR update to %s", podCIDR) + klog.InfoS("Ignoring subsequent pod CIDR update to new cidr", "podCIDR", podCIDR) return } @@ -330,7 +330,7 @@ func (plugin *cniNetworkPlugin) TearDownPod(namespace string, name string, id ku // Lack of namespace should not be fatal on teardown netnsPath, err := plugin.host.GetNetNS(id.ID) if err != nil { - klog.Warningf("CNI failed to retrieve network namespace path: %v", err) + klog.InfoS("CNI failed to retrieve network namespace path", "err", err) } // Todo get the timeout from parent ctx @@ -340,54 +340,47 @@ func (plugin *cniNetworkPlugin) TearDownPod(namespace string, name string, id ku if plugin.loNetwork != nil { // Loopback network deletion failure should not be fatal on teardown if err := plugin.deleteFromNetwork(cniTimeoutCtx, plugin.loNetwork, name, namespace, id, netnsPath, nil); err != nil { - klog.Warningf("CNI failed to delete loopback network: %v", err) + klog.InfoS("CNI failed to delete loopback network", "err", err) } } return plugin.deleteFromNetwork(cniTimeoutCtx, plugin.getDefaultNetwork(), name, namespace, id, netnsPath, nil) } -func podDesc(namespace, name string, id kubecontainer.ContainerID) string { - return fmt.Sprintf("%s_%s/%s", namespace, name, id.ID) -} - func (plugin *cniNetworkPlugin) addToNetwork(ctx context.Context, network *cniNetwork, podName string, podNamespace string, podSandboxID kubecontainer.ContainerID, podNetnsPath string, annotations, options map[string]string) (cnitypes.Result, error) { rt, err := plugin.buildCNIRuntimeConf(podName, podNamespace, podSandboxID, podNetnsPath, annotations, options) if err != nil { - klog.Errorf("Error adding network when building cni runtime conf: %v", err) + klog.ErrorS(err, "Error adding network when building cni runtime conf") return nil, err } - pdesc := podDesc(podNamespace, podName, podSandboxID) netConf, cniNet := network.NetworkConfig, network.CNIConfig - klog.V(4).Infof("Adding %s to network %s/%s netns %q", pdesc, netConf.Plugins[0].Network.Type, netConf.Name, podNetnsPath) + klog.V(4).InfoS("Adding pod to network", "pod", klog.KRef(podNamespace, podName), "podSandboxID", podSandboxID, "podNetnsPath", podNetnsPath, "networkType", netConf.Plugins[0].Network.Type, "networkName", netConf.Name) res, err := cniNet.AddNetworkList(ctx, netConf, rt) if err != nil { - klog.Errorf("Error adding %s to network %s/%s: %v", pdesc, netConf.Plugins[0].Network.Type, netConf.Name, err) + klog.ErrorS(err, "Error adding pod to network", "pod", klog.KRef(podNamespace, podName), "podSandboxID", podSandboxID, "podNetnsPath", podNetnsPath, "networkType", netConf.Plugins[0].Network.Type, "networkName", netConf.Name) return nil, err } - klog.V(4).Infof("Added %s to network %s: %v", pdesc, netConf.Name, res) + klog.V(4).InfoS("Added pod to network", "pod", klog.KRef(podNamespace, podName), "podSandboxID", podSandboxID, "networkName", netConf.Name, "response", res) return res, nil } func (plugin *cniNetworkPlugin) deleteFromNetwork(ctx context.Context, network *cniNetwork, podName string, podNamespace string, podSandboxID kubecontainer.ContainerID, podNetnsPath string, annotations map[string]string) error { rt, err := plugin.buildCNIRuntimeConf(podName, podNamespace, podSandboxID, podNetnsPath, annotations, nil) if err != nil { - klog.Errorf("Error deleting network when building cni runtime conf: %v", err) + klog.ErrorS(err, "Error deleting network when building cni runtime conf") return err } - - pdesc := podDesc(podNamespace, podName, podSandboxID) netConf, cniNet := network.NetworkConfig, network.CNIConfig - klog.V(4).Infof("Deleting %s from network %s/%s netns %q", pdesc, netConf.Plugins[0].Network.Type, netConf.Name, podNetnsPath) + klog.V(4).InfoS("Deleting pod from network", "pod", klog.KRef(podNamespace, podName), "podSandboxID", podSandboxID, "podNetnsPath", podNetnsPath, "networkType", netConf.Plugins[0].Network.Type, "networkName", netConf.Name) err = cniNet.DelNetworkList(ctx, netConf, rt) // The pod may not get deleted successfully at the first time. // Ignore "no such file or directory" error in case the network has already been deleted in previous attempts. if err != nil && !strings.Contains(err.Error(), "no such file or directory") { - klog.Errorf("Error deleting %s from network %s/%s: %v", pdesc, netConf.Plugins[0].Network.Type, netConf.Name, err) + klog.ErrorS(err, "Error deleting pod from network", "pod", klog.KRef(podNamespace, podName), "podSandboxID", podSandboxID, "podNetnsPath", podNetnsPath, "networkType", netConf.Plugins[0].Network.Type, "networkName", netConf.Name) return err } - klog.V(4).Infof("Deleted %s from network %s/%s", pdesc, netConf.Plugins[0].Network.Type, netConf.Name) + klog.V(4).InfoS("Deleted pod from network", "pod", klog.KRef(podNamespace, podName), "podSandboxID", podSandboxID, "networkType", netConf.Plugins[0].Network.Type, "networkName", netConf.Name) return nil } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/cni/cni_windows.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/cni/cni_windows.go index e76f69816c99..e9952ddb9836 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/cni/cni_windows.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/cni/cni_windows.go @@ -54,9 +54,9 @@ func (plugin *cniNetworkPlugin) GetPodNetworkStatus(namespace string, name strin cniTimeoutCtx, cancelFunc := context.WithTimeout(context.Background(), network.CNITimeoutSec*time.Second) defer cancelFunc() result, err := plugin.addToNetwork(cniTimeoutCtx, plugin.getDefaultNetwork(), name, namespace, id, netnsPath, nil, nil) - klog.V(5).Infof("GetPodNetworkStatus result %+v", result) + klog.V(5).InfoS("GetPodNetworkStatus", "result", result) if err != nil { - klog.Errorf("error while adding to cni network: %s", err) + klog.ErrorS(err, "Got error while adding to cni network") return nil, err } @@ -64,7 +64,7 @@ func (plugin *cniNetworkPlugin) GetPodNetworkStatus(namespace string, name strin var result020 *cniTypes020.Result result020, err = cniTypes020.GetResult(result) if err != nil { - klog.Errorf("error while cni parsing result: %s", err) + klog.ErrorS(err, "Got error while cni parsing result") return nil, err } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/hostport/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/hostport/BUILD deleted file mode 100644 index 5cb0d7edd0a4..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/hostport/BUILD +++ /dev/null @@ -1,57 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "fake_iptables.go", - "hostport.go", - "hostport_manager.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/dockershim/network/hostport", - deps = [ - "//pkg/proxy/iptables:go_default_library", - "//pkg/util/conntrack:go_default_library", - "//pkg/util/iptables:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "fake_iptables_test.go", - "hostport_manager_test.go", - "hostport_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/util/iptables:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/hostport/fake_iptables.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/hostport/fake_iptables.go index 9080a58b3d58..e4715c2be58a 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/hostport/fake_iptables.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/hostport/fake_iptables.go @@ -123,6 +123,14 @@ func (f *fakeIPTables) DeleteChain(tableName utiliptables.Table, chainName utili return nil } +func (f *fakeIPTables) ChainExists(tableName utiliptables.Table, chainName utiliptables.Chain) (bool, error) { + _, _, err := f.getChain(tableName, chainName) + if err != nil { + return false, err + } + return true, nil +} + // Returns index of rule in array; < 0 if rule is not found func findRule(chain *fakeChain, rule string) int { for i, candidate := range chain.rules { @@ -148,14 +156,14 @@ func (f *fakeIPTables) ensureRule(position utiliptables.RulePosition, tableName return true, nil } - if position == utiliptables.Prepend { + switch position { + case utiliptables.Prepend: chain.rules = append([]string{rule}, chain.rules...) - } else if position == utiliptables.Append { + case utiliptables.Append: chain.rules = append(chain.rules, rule) - } else { + default: return false, fmt.Errorf("unknown position argument %q", position) } - return false, nil } @@ -185,7 +193,7 @@ func normalizeRule(rule string) (string, error) { // Normalize un-prefixed IP addresses like iptables does if net.ParseIP(arg) != nil { - arg = arg + "/32" + arg += "/32" } if len(normalized) > 0 { @@ -281,7 +289,10 @@ func (f *fakeIPTables) restore(restoreTableName utiliptables.Table, data []byte, if strings.HasPrefix(line, ":") { chainName := utiliptables.Chain(strings.Split(line[1:], " ")[0]) if flush == utiliptables.FlushTables { - table, chain, _ := f.getChain(tableName, chainName) + table, chain, err := f.getChain(tableName, chainName) + if err != nil { + return err + } if chain != nil { delete(table.chains, string(chainName)) } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/hostport/hostport.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/hostport/hostport.go index 9f3735f16f89..5891ba55d50d 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/hostport/hostport.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/hostport/hostport.go @@ -21,6 +21,7 @@ package hostport import ( "fmt" "net" + "strconv" "strings" "k8s.io/klog/v2" @@ -53,7 +54,18 @@ type PodPortMapping struct { IP net.IP } +// ipFamily refers to a specific family if not empty, i.e. "4" or "6". +type ipFamily string + +// Constants for valid IPFamily: +const ( + IPv4 ipFamily = "4" + IPv6 ipFamily = "6" +) + type hostport struct { + ipFamily ipFamily + ip string port int32 protocol string } @@ -78,19 +90,23 @@ func openLocalPort(hp *hostport) (closeable, error) { // bind()ed but not listen()ed, and at least the default debian netcat // has no way to avoid about 10 seconds of retries. var socket closeable + // open the socket on the HostIP and HostPort specified + address := net.JoinHostPort(hp.ip, strconv.Itoa(int(hp.port))) switch hp.protocol { case "tcp": - listener, err := net.Listen("tcp", fmt.Sprintf(":%d", hp.port)) + network := "tcp" + string(hp.ipFamily) + listener, err := net.Listen(network, address) if err != nil { return nil, err } socket = listener case "udp": - addr, err := net.ResolveUDPAddr("udp", fmt.Sprintf(":%d", hp.port)) + network := "udp" + string(hp.ipFamily) + addr, err := net.ResolveUDPAddr(network, address) if err != nil { return nil, err } - conn, err := net.ListenUDP("udp", addr) + conn, err := net.ListenUDP(network, addr) if err != nil { return nil, err } @@ -98,13 +114,15 @@ func openLocalPort(hp *hostport) (closeable, error) { default: return nil, fmt.Errorf("unknown protocol %q", hp.protocol) } - klog.V(3).Infof("Opened local port %s", hp.String()) + klog.V(3).InfoS("Opened local port", "port", hp.String()) return socket, nil } // portMappingToHostport creates hostport structure based on input portmapping -func portMappingToHostport(portMapping *PortMapping) hostport { +func portMappingToHostport(portMapping *PortMapping, family ipFamily) hostport { return hostport{ + ipFamily: family, + ip: portMapping.HostIP, port: portMapping.HostPort, protocol: strings.ToLower(string(portMapping.Protocol)), } @@ -112,7 +130,7 @@ func portMappingToHostport(portMapping *PortMapping) hostport { // ensureKubeHostportChains ensures the KUBE-HOSTPORTS chain is setup correctly func ensureKubeHostportChains(iptables utiliptables.Interface, natInterfaceName string) error { - klog.V(4).Info("Ensuring kubelet hostport chains") + klog.V(4).InfoS("Ensuring kubelet hostport chains") // Ensure kubeHostportChain if _, err := iptables.EnsureChain(utiliptables.TableNAT, kubeHostportsChain); err != nil { return fmt.Errorf("failed to ensure that %s chain %s exists: %v", utiliptables.TableNAT, kubeHostportsChain, err) @@ -124,9 +142,11 @@ func ensureKubeHostportChains(iptables utiliptables.Interface, natInterfaceName {utiliptables.TableNAT, utiliptables.ChainOutput}, {utiliptables.TableNAT, utiliptables.ChainPrerouting}, } - args := []string{"-m", "comment", "--comment", "kube hostport portals", + args := []string{ + "-m", "comment", "--comment", "kube hostport portals", "-m", "addrtype", "--dst-type", "LOCAL", - "-j", string(kubeHostportsChain)} + "-j", string(kubeHostportsChain), + } for _, tc := range tableChainsNeedJumpServices { // KUBE-HOSTPORTS chain needs to be appended to the system chains. // This ensures KUBE-SERVICES chain gets processed first. diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/hostport/hostport_manager.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/hostport/hostport_manager.go index 9eb7d30121e7..9dc44e7d57d7 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/hostport/hostport_manager.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/hostport/hostport_manager.go @@ -59,6 +59,7 @@ type hostportManager struct { mu sync.Mutex } +// NewHostportManager creates a new HostPortManager func NewHostportManager(iptables utiliptables.Interface) HostPortManager { h := &hostportManager{ hostPortMap: make(map[hostport]closeable), @@ -68,7 +69,7 @@ func NewHostportManager(iptables utiliptables.Interface) HostPortManager { } h.conntrackFound = conntrack.Exists(h.execer) if !h.conntrackFound { - klog.Warningf("The binary conntrack is not installed, this can cause failures in network connection cleanup.") + klog.InfoS("The binary conntrack is not installed, this can cause failures in network connection cleanup.") } return h } @@ -78,13 +79,6 @@ func (hm *hostportManager) Add(id string, podPortMapping *PodPortMapping, natInt return nil } podFullName := getPodFullName(podPortMapping) - - // skip if there is no hostport needed - hostportMappings := gatherHostportMappings(podPortMapping) - if len(hostportMappings) == 0 { - return nil - } - // IP.To16() returns nil if IP is not a valid IPv4 or IPv6 address if podPortMapping.IP.To16() == nil { return fmt.Errorf("invalid or missing IP of pod %s", podFullName) @@ -92,11 +86,17 @@ func (hm *hostportManager) Add(id string, podPortMapping *PodPortMapping, natInt podIP := podPortMapping.IP.String() isIPv6 := utilnet.IsIPv6(podPortMapping.IP) + // skip if there is no hostport needed + hostportMappings := gatherHostportMappings(podPortMapping, isIPv6) + if len(hostportMappings) == 0 { + return nil + } + if isIPv6 != hm.iptables.IsIPv6() { return fmt.Errorf("HostPortManager IP family mismatch: %v, isIPv6 - %v", podIP, isIPv6) } - if err = ensureKubeHostportChains(hm.iptables, natInterfaceName); err != nil { + if err := ensureKubeHostportChains(hm.iptables, natInterfaceName); err != nil { return err } @@ -152,10 +152,17 @@ func (hm *hostportManager) Add(id string, podPortMapping *PodPortMapping, natInt // DNAT to the podIP:containerPort hostPortBinding := net.JoinHostPort(podIP, strconv.Itoa(int(pm.ContainerPort))) - writeLine(natRules, "-A", string(chain), - "-m", "comment", "--comment", fmt.Sprintf(`"%s hostport %d"`, podFullName, pm.HostPort), - "-m", protocol, "-p", protocol, - "-j", "DNAT", fmt.Sprintf("--to-destination=%s", hostPortBinding)) + if pm.HostIP == "" || pm.HostIP == "0.0.0.0" || pm.HostIP == "::" { + writeLine(natRules, "-A", string(chain), + "-m", "comment", "--comment", fmt.Sprintf(`"%s hostport %d"`, podFullName, pm.HostPort), + "-m", protocol, "-p", protocol, + "-j", "DNAT", fmt.Sprintf("--to-destination=%s", hostPortBinding)) + } else { + writeLine(natRules, "-A", string(chain), + "-m", "comment", "--comment", fmt.Sprintf(`"%s hostport %d"`, podFullName, pm.HostPort), + "-m", protocol, "-p", protocol, "-d", pm.HostIP, + "-j", "DNAT", fmt.Sprintf("--to-destination=%s", hostPortBinding)) + } } // getHostportChain should be able to provide unique hostport chain name using hash @@ -182,11 +189,11 @@ func (hm *hostportManager) Add(id string, podPortMapping *PodPortMapping, natInt // create a new conntrack entry without any DNAT. That will result in blackhole of the traffic even after correct // iptables rules have been added back. if hm.execer != nil && hm.conntrackFound { - klog.Infof("Starting to delete udp conntrack entries: %v, isIPv6 - %v", conntrackPortsToRemove, isIPv6) + klog.InfoS("Starting to delete udp conntrack entries", "conntrackEntries", conntrackPortsToRemove, "isIPv6", isIPv6) for _, port := range conntrackPortsToRemove { err = conntrack.ClearEntriesForPort(hm.execer, port, isIPv6, v1.ProtocolUDP) if err != nil { - klog.Errorf("Failed to clear udp conntrack for port %d, error: %v", port, err) + klog.ErrorS(err, "Failed to clear udp conntrack for port", "port", port) } } } @@ -198,8 +205,8 @@ func (hm *hostportManager) Remove(id string, podPortMapping *PodPortMapping) (er return nil } - hostportMappings := gatherHostportMappings(podPortMapping) - if len(hostportMappings) <= 0 { + hostportMappings := gatherHostportMappings(podPortMapping, hm.iptables.IsIPv6()) + if len(hostportMappings) == 0 { return nil } @@ -231,6 +238,12 @@ func (hm *hostportManager) Remove(id string, podPortMapping *PodPortMapping) (er } } + // exit if there is nothing to remove + // don´t forget to clean up opened pod host ports + if len(existingChainsToRemove) == 0 { + return hm.closeHostports(hostportMappings) + } + natChains := bytes.NewBuffer(nil) natRules := bytes.NewBuffer(nil) writeLine(natChains, "*nat") @@ -245,7 +258,7 @@ func (hm *hostportManager) Remove(id string, podPortMapping *PodPortMapping) (er } writeLine(natRules, "COMMIT") - if err = hm.syncIPTables(append(natChains.Bytes(), natRules.Bytes()...)); err != nil { + if err := hm.syncIPTables(append(natChains.Bytes(), natRules.Bytes()...)); err != nil { return err } @@ -255,7 +268,7 @@ func (hm *hostportManager) Remove(id string, podPortMapping *PodPortMapping) (er // syncIPTables executes iptables-restore with given lines func (hm *hostportManager) syncIPTables(lines []byte) error { - klog.V(3).Infof("Restoring iptables rules: %s", lines) + klog.V(3).InfoS("Restoring iptables rules", "iptableRules", lines) err := hm.iptables.RestoreAll(lines, utiliptables.NoFlushTables, utiliptables.RestoreCounters) if err != nil { return fmt.Errorf("failed to execute iptables-restore: %v", err) @@ -279,7 +292,12 @@ func (hm *hostportManager) openHostports(podPortMapping *PodPortMapping) (map[ho continue } - hp := portMappingToHostport(pm) + // HostIP IP family is not handled by this port opener + if pm.HostIP != "" && utilnet.IsIPv6String(pm.HostIP) != hm.iptables.IsIPv6() { + continue + } + + hp := portMappingToHostport(pm, hm.getIPFamily()) socket, err := hm.portOpener(&hp) if err != nil { retErr = fmt.Errorf("cannot open hostport %d for pod %s: %v", pm.HostPort, getPodFullName(podPortMapping), err) @@ -292,7 +310,7 @@ func (hm *hostportManager) openHostports(podPortMapping *PodPortMapping) (map[ho if retErr != nil { for hp, socket := range ports { if err := socket.Close(); err != nil { - klog.Errorf("Cannot clean up hostport %d for pod %s: %v", hp.port, getPodFullName(podPortMapping), err) + klog.ErrorS(err, "Cannot clean up hostport for the pod", "podFullName", getPodFullName(podPortMapping), "port", hp.port) } } return nil, retErr @@ -304,19 +322,30 @@ func (hm *hostportManager) openHostports(podPortMapping *PodPortMapping) (map[ho func (hm *hostportManager) closeHostports(hostportMappings []*PortMapping) error { errList := []error{} for _, pm := range hostportMappings { - hp := portMappingToHostport(pm) + hp := portMappingToHostport(pm, hm.getIPFamily()) if socket, ok := hm.hostPortMap[hp]; ok { - klog.V(2).Infof("Closing host port %s", hp.String()) + klog.V(2).InfoS("Closing host port", "port", hp.String()) if err := socket.Close(); err != nil { errList = append(errList, fmt.Errorf("failed to close host port %s: %v", hp.String(), err)) continue } delete(hm.hostPortMap, hp) + } else { + klog.V(5).InfoS("Host port does not have an open socket", "port", hp.String()) } } return utilerrors.NewAggregate(errList) } +// getIPFamily returns the hostPortManager IP family +func (hm *hostportManager) getIPFamily() ipFamily { + family := IPv4 + if hm.iptables.IsIPv6() { + family = IPv6 + } + return family +} + // getHostportChain takes id, hostport and protocol for a pod and returns associated iptables chain. // This is computed by hashing (sha256) then encoding to base32 and truncating with the prefix // "KUBE-HP-". We do this because IPTables Chain Names must be <= 28 chars long, and the longer @@ -324,18 +353,22 @@ func (hm *hostportManager) closeHostports(hostportMappings []*PortMapping) error // WARNING: Please do not change this function. Otherwise, HostportManager may not be able to // identify existing iptables chains. func getHostportChain(id string, pm *PortMapping) utiliptables.Chain { - hash := sha256.Sum256([]byte(id + strconv.Itoa(int(pm.HostPort)) + string(pm.Protocol))) + hash := sha256.Sum256([]byte(id + strconv.Itoa(int(pm.HostPort)) + string(pm.Protocol) + pm.HostIP)) encoded := base32.StdEncoding.EncodeToString(hash[:]) return utiliptables.Chain(kubeHostportChainPrefix + encoded[:16]) } // gatherHostportMappings returns all the PortMappings which has hostport for a pod -func gatherHostportMappings(podPortMapping *PodPortMapping) []*PortMapping { +// it filters the PortMappings that use HostIP and doesn't match the IP family specified +func gatherHostportMappings(podPortMapping *PodPortMapping, isIPv6 bool) []*PortMapping { mappings := []*PortMapping{} for _, pm := range podPortMapping.PortMappings { if pm.HostPort <= 0 { continue } + if pm.HostIP != "" && utilnet.IsIPv6String(pm.HostIP) != isIPv6 { + continue + } mappings = append(mappings, pm) } return mappings diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/kubenet/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/kubenet/BUILD deleted file mode 100644 index e6c1aa4d99ed..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/kubenet/BUILD +++ /dev/null @@ -1,187 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "kubenet.go", - "kubenet_linux.go", - "kubenet_unsupported.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/dockershim/network/kubenet", - deps = select({ - "@io_bazel_rules_go//go/platform:aix": [ - "//pkg/kubelet/apis/config:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/dockershim/network:go_default_library", - ], - "@io_bazel_rules_go//go/platform:android": [ - "//pkg/features:go_default_library", - "//pkg/kubelet/apis/config:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/dockershim/network:go_default_library", - "//pkg/kubelet/dockershim/network/hostport:go_default_library", - "//pkg/util/bandwidth:go_default_library", - "//pkg/util/iptables:go_default_library", - "//pkg/util/sysctl:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/github.com/containernetworking/cni/libcni:go_default_library", - "//vendor/github.com/containernetworking/cni/pkg/types:go_default_library", - "//vendor/github.com/containernetworking/cni/pkg/types/020:go_default_library", - "//vendor/github.com/vishvananda/netlink:go_default_library", - "//vendor/golang.org/x/sys/unix:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - "//vendor/k8s.io/utils/net/ebtables:go_default_library", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "//pkg/kubelet/apis/config:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/dockershim/network:go_default_library", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "//pkg/kubelet/apis/config:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/dockershim/network:go_default_library", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "//pkg/kubelet/apis/config:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/dockershim/network:go_default_library", - ], - "@io_bazel_rules_go//go/platform:illumos": [ - "//pkg/kubelet/apis/config:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/dockershim/network:go_default_library", - ], - "@io_bazel_rules_go//go/platform:ios": [ - "//pkg/kubelet/apis/config:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/dockershim/network:go_default_library", - ], - "@io_bazel_rules_go//go/platform:js": [ - "//pkg/kubelet/apis/config:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/dockershim/network:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//pkg/features:go_default_library", - "//pkg/kubelet/apis/config:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/dockershim/network:go_default_library", - "//pkg/kubelet/dockershim/network/hostport:go_default_library", - "//pkg/util/bandwidth:go_default_library", - "//pkg/util/iptables:go_default_library", - "//pkg/util/sysctl:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/github.com/containernetworking/cni/libcni:go_default_library", - "//vendor/github.com/containernetworking/cni/pkg/types:go_default_library", - "//vendor/github.com/containernetworking/cni/pkg/types/020:go_default_library", - "//vendor/github.com/vishvananda/netlink:go_default_library", - "//vendor/golang.org/x/sys/unix:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - "//vendor/k8s.io/utils/net/ebtables:go_default_library", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "//pkg/kubelet/apis/config:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/dockershim/network:go_default_library", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "//pkg/kubelet/apis/config:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/dockershim/network:go_default_library", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "//pkg/kubelet/apis/config:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/dockershim/network:go_default_library", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "//pkg/kubelet/apis/config:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/dockershim/network:go_default_library", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "//pkg/kubelet/apis/config:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/dockershim/network:go_default_library", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "//pkg/kubelet/apis/config:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/dockershim/network:go_default_library", - ], - "//conditions:default": [], - }), -) - -go_test( - name = "go_default_test", - srcs = ["kubenet_linux_test.go"], - embed = [":go_default_library"], - deps = select({ - "@io_bazel_rules_go//go/platform:android": [ - "//pkg/kubelet/apis/config:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/dockershim/network:go_default_library", - "//pkg/kubelet/dockershim/network/cni/testing:go_default_library", - "//pkg/kubelet/dockershim/network/testing:go_default_library", - "//pkg/util/bandwidth:go_default_library", - "//pkg/util/iptables/testing:go_default_library", - "//pkg/util/sysctl/testing:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/github.com/containernetworking/cni/libcni:go_default_library", - "//vendor/github.com/containernetworking/cni/pkg/types:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/mock:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - "//vendor/k8s.io/utils/exec/testing:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//pkg/kubelet/apis/config:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/dockershim/network:go_default_library", - "//pkg/kubelet/dockershim/network/cni/testing:go_default_library", - "//pkg/kubelet/dockershim/network/testing:go_default_library", - "//pkg/util/bandwidth:go_default_library", - "//pkg/util/iptables/testing:go_default_library", - "//pkg/util/sysctl/testing:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/github.com/containernetworking/cni/libcni:go_default_library", - "//vendor/github.com/containernetworking/cni/pkg/types:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/mock:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - "//vendor/k8s.io/utils/exec/testing:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/kubenet/kubenet_linux.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/kubenet/kubenet_linux.go index 4b063942e713..2f82a157d25e 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/kubenet/kubenet_linux.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/kubenet/kubenet_linux.go @@ -143,10 +143,10 @@ func (plugin *kubenetNetworkPlugin) Init(host network.Host, hairpinMode kubeletc if mtu == network.UseDefaultMTU { if link, err := findMinMTU(); err == nil { plugin.mtu = link.MTU - klog.V(5).Infof("Using interface %s MTU %d as bridge MTU", link.Name, link.MTU) + klog.V(5).InfoS("Using the interface MTU value as bridge MTU", "interfaceName", link.Name, "mtuValue", link.MTU) } else { plugin.mtu = fallbackMTU - klog.Warningf("Failed to find default bridge MTU, using %d: %v", fallbackMTU, err) + klog.InfoS("Failed to find default bridge MTU, using default value", "mtuValue", fallbackMTU, "err", err) } } else { plugin.mtu = mtu @@ -161,7 +161,7 @@ func (plugin *kubenetNetworkPlugin) Init(host network.Host, hairpinMode kubeletc plugin.execer.Command("modprobe", "br-netfilter").CombinedOutput() err := plugin.sysctl.SetSysctl(sysctlBridgeCallIPTables, 1) if err != nil { - klog.Warningf("can't set sysctl %s: %v", sysctlBridgeCallIPTables, err) + klog.InfoS("can't set sysctl bridge-nf-call-iptables", "err", err) } plugin.loConfig, err = libcni.ConfFromBytes([]byte(`{ @@ -240,28 +240,28 @@ func (plugin *kubenetNetworkPlugin) Event(name string, details map[string]interf podCIDR, ok := details[network.NET_PLUGIN_EVENT_POD_CIDR_CHANGE_DETAIL_CIDR].(string) if !ok { - klog.Warningf("%s event didn't contain pod CIDR", network.NET_PLUGIN_EVENT_POD_CIDR_CHANGE) + klog.InfoS("The event didn't contain pod CIDR", "event", network.NET_PLUGIN_EVENT_POD_CIDR_CHANGE) return } if plugin.netConfig != nil { - klog.Warningf("Ignoring subsequent pod CIDR update to %s", podCIDR) + klog.InfoS("Ignoring subsequent pod CIDR update to new cidr", "podCIDR", podCIDR) return } - klog.V(4).Infof("kubenet: PodCIDR is set to %q", podCIDR) + klog.V(4).InfoS("Kubenet: PodCIDR is set to new value", "podCIDR", podCIDR) podCIDRs := strings.Split(podCIDR, ",") // reset to one cidr if dual stack is not enabled if !utilfeature.DefaultFeatureGate.Enabled(kubefeatures.IPv6DualStack) && len(podCIDRs) > 1 { - klog.V(2).Infof("This node has multiple pod cidrs assigned and dual stack is not enabled. ignoring all except first cidr") + klog.V(2).InfoS("This node has multiple pod cidrs assigned and dual stack is not enabled. ignoring all except first cidr") podCIDRs = podCIDRs[0:1] } for idx, currentPodCIDR := range podCIDRs { _, cidr, err := net.ParseCIDR(currentPodCIDR) if nil != err { - klog.Warningf("Failed to generate CNI network config with cidr %s at index:%v: %v", currentPodCIDR, idx, err) + klog.InfoS("Failed to generate CNI network config with cidr at the index", "podCIDR", currentPodCIDR, "index", idx, "err", err) return } // create list of ips @@ -272,10 +272,10 @@ func (plugin *kubenetNetworkPlugin) Event(name string, details map[string]interf setHairpin := plugin.hairpinMode == kubeletconfig.HairpinVeth json := fmt.Sprintf(NET_CONFIG_TEMPLATE, BridgeName, plugin.mtu, network.DefaultInterfaceName, setHairpin, plugin.getRangesConfig(), plugin.getRoutesConfig()) - klog.V(4).Infof("CNI network config set to %v", json) + klog.V(4).InfoS("CNI network config set to json format", "cniNetworkConfig", json) plugin.netConfig, err = libcni.ConfFromBytes([]byte(json)) if err != nil { - klog.Warningf("** failed to set up CNI with %v err:%v", json, err) + klog.InfoS("** failed to set up CNI with json format", "cniNetworkConfig", json, "err", err) // just incase it was set by mistake plugin.netConfig = nil // we bail out by clearing the *entire* list @@ -302,13 +302,13 @@ func (plugin *kubenetNetworkPlugin) clearUnusedBridgeAddresses() { addrs, err := netlink.AddrList(bridge, unix.AF_INET) if err != nil { - klog.V(2).Infof("attempting to get address for interface: %s failed with err:%v", BridgeName, err) + klog.V(2).InfoS("Attempting to get address for the interface failed", "interfaceName", BridgeName, "err", err) return } for _, addr := range addrs { if !cidrIncluded(plugin.podCIDRs, addr.IPNet) { - klog.V(2).Infof("Removing old address %s from %s", addr.IPNet.String(), BridgeName) + klog.V(2).InfoS("Removing old address from the interface", "interfaceName", BridgeName, "address", addr.IPNet.String()) netlink.AddrDel(bridge, &addr) } } @@ -330,7 +330,7 @@ func (plugin *kubenetNetworkPlugin) setup(namespace string, name string, id kube // Disable DAD so we skip the kernel delay on bringing up new interfaces. if err := plugin.disableContainerDAD(id); err != nil { - klog.V(3).Infof("Failed to disable DAD in container: %v", err) + klog.V(3).InfoS("Failed to disable DAD in container", "err", err) } // Bring up container loopback interface @@ -476,20 +476,20 @@ func (plugin *kubenetNetworkPlugin) SetUpPod(namespace string, name string, id k } defer func() { - klog.V(4).Infof("SetUpPod took %v for %s/%s", time.Since(start), namespace, name) + klog.V(4).InfoS("SetUpPod took time", "pod", klog.KRef(namespace, name), "duration", time.Since(start)) }() if err := plugin.setup(namespace, name, id, annotations); err != nil { if err := plugin.teardown(namespace, name, id); err != nil { // Not a hard error or warning - klog.V(4).Infof("Failed to clean up %s/%s after SetUpPod failure: %v", namespace, name, err) + klog.V(4).InfoS("Failed to clean up pod after SetUpPod failure", "pod", klog.KRef(namespace, name), "err", err) } return err } // Need to SNAT outbound traffic from cluster if err := plugin.ensureMasqRule(); err != nil { - klog.Errorf("Failed to ensure MASQ rule: %v", err) + klog.ErrorS(err, "Failed to ensure MASQ rule") } return nil @@ -502,21 +502,21 @@ func (plugin *kubenetNetworkPlugin) teardown(namespace string, name string, id k // Loopback network deletion failure should not be fatal on teardown if err := plugin.delContainerFromNetwork(plugin.loConfig, "lo", namespace, name, id); err != nil { - klog.Warningf("Failed to delete loopback network: %v", err) + klog.InfoS("Failed to delete loopback network", "err", err) errList = append(errList, err) } // no ip dependent actions if err := plugin.delContainerFromNetwork(plugin.netConfig, network.DefaultInterfaceName, namespace, name, id); err != nil { - klog.Warningf("Failed to delete %q network: %v", network.DefaultInterfaceName, err) + klog.InfoS("Failed to delete the interface network", "interfaceName", network.DefaultInterfaceName, "err", err) errList = append(errList, err) } // If there are no IPs registered we can't teardown pod's IP dependencies iplist, exists := plugin.getCachedPodIPs(id) if !exists || len(iplist) == 0 { - klog.V(5).Infof("container %s (%s/%s) does not have recorded. ignoring teardown call", id, name, namespace) + klog.V(5).InfoS("Container does not have IP registered. Ignoring teardown call", "containerID", id, "pod", klog.KRef(namespace, name)) return nil } @@ -529,7 +529,7 @@ func (plugin *kubenetNetworkPlugin) teardown(namespace string, name string, id k // process each pod IP for _, ip := range iplist { isV6 := netutils.IsIPv6String(ip) - klog.V(5).Infof("Removing pod port mappings from IP %s", ip) + klog.V(5).InfoS("Removing pod port mappings from the IP", "IP", ip) if portMappings != nil && len(portMappings) > 0 { if isV6 { if err = plugin.hostportManagerv6.Remove(id.ID, &hostport.PodPortMapping{ @@ -552,7 +552,7 @@ func (plugin *kubenetNetworkPlugin) teardown(namespace string, name string, id k } } - klog.V(5).Infof("Removing pod IP %s from shaper for (%s/%s)", ip, name, namespace) + klog.V(5).InfoS("Removing pod IP from shaper for the pod", "pod", klog.KRef(namespace, name), "IP", ip) // shaper uses a cidr, but we are using a single IP. mask := "32" if isV6 { @@ -561,7 +561,7 @@ func (plugin *kubenetNetworkPlugin) teardown(namespace string, name string, id k if err := plugin.shaper().Reset(fmt.Sprintf("%s/%s", ip, mask)); err != nil { // Possible bandwidth shaping wasn't enabled for this pod anyways - klog.V(4).Infof("Failed to remove pod IP %s from shaper: %v", ip, err) + klog.V(4).InfoS("Failed to remove pod IP from shaper", "IP", ip, "err", err) } plugin.removePodIP(id, ip) @@ -572,7 +572,7 @@ func (plugin *kubenetNetworkPlugin) teardown(namespace string, name string, id k func (plugin *kubenetNetworkPlugin) TearDownPod(namespace string, name string, id kubecontainer.ContainerID) error { start := time.Now() defer func() { - klog.V(4).Infof("TearDownPod took %v for %s/%s", time.Since(start), namespace, name) + klog.V(4).InfoS("TearDownPod took time", "pod", klog.KRef(namespace, name), "duration", time.Since(start)) }() if plugin.netConfig == nil { @@ -585,7 +585,7 @@ func (plugin *kubenetNetworkPlugin) TearDownPod(namespace string, name string, i // Need to SNAT outbound traffic from cluster if err := plugin.ensureMasqRule(); err != nil { - klog.Errorf("Failed to ensure MASQ rule: %v", err) + klog.ErrorS(err, "Failed to ensure MASQ rule") } return nil } @@ -690,7 +690,7 @@ func (plugin *kubenetNetworkPlugin) checkRequiredCNIPluginsInOneDir(dir string) func (plugin *kubenetNetworkPlugin) buildCNIRuntimeConf(ifName string, id kubecontainer.ContainerID, needNetNs bool) (*libcni.RuntimeConf, error) { netnsPath, err := plugin.host.GetNetNS(id.ID) if needNetNs && err != nil { - klog.Errorf("Kubenet failed to retrieve network namespace path: %v", err) + klog.ErrorS(err, "Kubenet failed to retrieve network namespace path") } return &libcni.RuntimeConf{ @@ -707,7 +707,7 @@ func (plugin *kubenetNetworkPlugin) addContainerToNetwork(config *libcni.Network return nil, fmt.Errorf("error building CNI config: %v", err) } - klog.V(3).Infof("Adding %s/%s to '%s' with CNI '%s' plugin and runtime: %+v", namespace, name, config.Network.Name, config.Network.Type, rt) + klog.V(3).InfoS("Adding pod to network with CNI plugin and runtime", "pod", klog.KRef(namespace, name), "networkName", config.Network.Name, "networkType", config.Network.Type, "rt", rt) // Because the default remote runtime request timeout is 4 min,so set slightly less than 240 seconds // Todo get the timeout from parent ctx cniTimeoutCtx, cancelFunc := context.WithTimeout(context.Background(), network.CNITimeoutSec*time.Second) @@ -725,7 +725,7 @@ func (plugin *kubenetNetworkPlugin) delContainerFromNetwork(config *libcni.Netwo return fmt.Errorf("error building CNI config: %v", err) } - klog.V(3).Infof("Removing %s/%s from '%s' with CNI '%s' plugin and runtime: %+v", namespace, name, config.Network.Name, config.Network.Type, rt) + klog.V(3).InfoS("Removing pod from network with CNI plugin and runtime", "pod", klog.KRef(namespace, name), "networkName", config.Network.Name, "networkType", config.Network.Type, "rt", rt) // Because the default remote runtime request timeout is 4 min,so set slightly less than 240 seconds // Todo get the timeout from parent ctx cniTimeoutCtx, cancelFunc := context.WithTimeout(context.Background(), network.CNITimeoutSec*time.Second) @@ -755,34 +755,34 @@ func (plugin *kubenetNetworkPlugin) shaper() bandwidth.Shaper { func (plugin *kubenetNetworkPlugin) syncEbtablesDedupRules(macAddr net.HardwareAddr, podCIDRs []net.IPNet, podGateways []net.IP) { if plugin.ebtables == nil { plugin.ebtables = utilebtables.New(plugin.execer) - klog.V(3).Infof("Flushing dedup chain") + klog.V(3).InfoS("Flushing dedup chain") if err := plugin.ebtables.FlushChain(utilebtables.TableFilter, dedupChain); err != nil { - klog.Errorf("Failed to flush dedup chain: %v", err) + klog.ErrorS(err, "Failed to flush dedup chain") } } _, err := plugin.ebtables.GetVersion() if err != nil { - klog.Warningf("Failed to get ebtables version. Skip syncing ebtables dedup rules: %v", err) + klog.InfoS("Failed to get ebtables version. Skip syncing ebtables dedup rules", "err", err) return } // ensure custom chain exists _, err = plugin.ebtables.EnsureChain(utilebtables.TableFilter, dedupChain) if err != nil { - klog.Errorf("Failed to ensure %v chain %v", utilebtables.TableFilter, dedupChain) + klog.ErrorS(nil, "Failed to ensure filter table KUBE-DEDUP chain") return } // jump to custom chain to the chain from core tables _, err = plugin.ebtables.EnsureRule(utilebtables.Append, utilebtables.TableFilter, utilebtables.ChainOutput, "-j", string(dedupChain)) if err != nil { - klog.Errorf("Failed to ensure %v chain %v jump to %v chain: %v", utilebtables.TableFilter, utilebtables.ChainOutput, dedupChain, err) + klog.ErrorS(err, "Failed to ensure filter table OUTPUT chain jump to KUBE-DEDUP chain") return } // per gateway rule for idx, gw := range podGateways { - klog.V(3).Infof("Filtering packets with ebtables on mac address: %v, gateway: %v, pod CIDR: %v", macAddr.String(), gw.String(), podCIDRs[idx].String()) + klog.V(3).InfoS("Filtering packets with ebtables", "mac", macAddr.String(), "gateway", gw.String(), "podCIDR", podCIDRs[idx].String()) bIsV6 := netutils.IsIPv6(gw) IPFamily := "IPv4" @@ -794,13 +794,13 @@ func (plugin *kubenetNetworkPlugin) syncEbtablesDedupRules(macAddr net.HardwareA commonArgs := []string{"-p", IPFamily, "-s", macAddr.String(), "-o", "veth+"} _, err = plugin.ebtables.EnsureRule(utilebtables.Prepend, utilebtables.TableFilter, dedupChain, append(commonArgs, ipSrc, gw.String(), "-j", "ACCEPT")...) if err != nil { - klog.Errorf("Failed to ensure packets from cbr0 gateway:%v to be accepted with error:%v", gw.String(), err) + klog.ErrorS(err, "Failed to ensure packets from cbr0 gateway to be accepted with error", "gateway", gw.String()) return } _, err = plugin.ebtables.EnsureRule(utilebtables.Append, utilebtables.TableFilter, dedupChain, append(commonArgs, ipSrc, podCIDRs[idx].String(), "-j", "DROP")...) if err != nil { - klog.Errorf("Failed to ensure packets from podCidr[%v] but has mac address of cbr0 to get dropped. err:%v", podCIDRs[idx].String(), err) + klog.ErrorS(err, "Failed to ensure packets from podCidr but has mac address of cbr0 to get dropped.", "podCIDR", podCIDRs[idx].String()) return } } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/metrics/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/metrics/BUILD deleted file mode 100644 index 4d10bf852b4f..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/metrics/BUILD +++ /dev/null @@ -1,26 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["metrics.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/dockershim/network/metrics", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/plugins.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/plugins.go index 85b5146019ea..ce715f5d05af 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/plugins.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/plugins.go @@ -165,7 +165,7 @@ func InitNetworkPlugin(plugins []NetworkPlugin, networkPluginName string, host H if err != nil { allErrs = append(allErrs, fmt.Errorf("network plugin %q failed init: %v", networkPluginName, err)) } else { - klog.V(1).Infof("Loaded network plugin %q", networkPluginName) + klog.V(1).InfoS("Loaded network plugin", "networkPluginName", networkPluginName) } } else { allErrs = append(allErrs, fmt.Errorf("network plugin %q not found", networkPluginName)) @@ -192,12 +192,12 @@ func (plugin *NoopNetworkPlugin) Init(host Host, hairpinMode kubeletconfig.Hairp // it was built-in. utilexec.New().Command("modprobe", "br-netfilter").CombinedOutput() if err := plugin.Sysctl.SetSysctl(sysctlBridgeCallIPTables, 1); err != nil { - klog.Warningf("can't set sysctl %s: %v", sysctlBridgeCallIPTables, err) + klog.InfoS("can't set sysctl bridge-nf-call-iptables", "err", err) } if val, err := plugin.Sysctl.GetSysctl(sysctlBridgeCallIP6Tables); err == nil { if val != 1 { if err = plugin.Sysctl.SetSysctl(sysctlBridgeCallIP6Tables, 1); err != nil { - klog.Warningf("can't set sysctl %s: %v", sysctlBridgeCallIP6Tables, err) + klog.InfoS("can't set sysctl bridge-nf-call-ip6tables", "err", err) } } } @@ -365,12 +365,12 @@ func (pm *PluginManager) podUnlock(fullPodName string) { lock, ok := pm.pods[fullPodName] if !ok { - klog.Warningf("Unbalanced pod lock unref for %s", fullPodName) + klog.InfoS("Unbalanced pod lock unref for the pod", "podFullName", fullPodName) return } else if lock.refcount == 0 { // This should never ever happen, but handle it anyway delete(pm.pods, fullPodName) - klog.Warningf("Pod lock for %s still in map with zero refcount", fullPodName) + klog.InfoS("Pod lock for the pod still in map with zero refcount", "podFullName", fullPodName) return } lock.refcount-- @@ -414,7 +414,7 @@ func (pm *PluginManager) SetUpPod(podNamespace, podName string, id kubecontainer pm.podLock(fullPodName).Lock() defer pm.podUnlock(fullPodName) - klog.V(3).Infof("Calling network plugin %s to set up pod %q", pm.plugin.Name(), fullPodName) + klog.V(3).InfoS("Calling network plugin to set up the pod", "pod", klog.KRef(podNamespace, podName), "networkPluginName", pm.plugin.Name()) if err := pm.plugin.SetUpPod(podNamespace, podName, id, annotations, options); err != nil { recordError(operation) return fmt.Errorf("networkPlugin %s failed to set up pod %q network: %v", pm.plugin.Name(), fullPodName, err) @@ -430,7 +430,7 @@ func (pm *PluginManager) TearDownPod(podNamespace, podName string, id kubecontai pm.podLock(fullPodName).Lock() defer pm.podUnlock(fullPodName) - klog.V(3).Infof("Calling network plugin %s to tear down pod %q", pm.plugin.Name(), fullPodName) + klog.V(3).InfoS("Calling network plugin to tear down the pod", "pod", klog.KRef(podNamespace, podName), "networkPluginName", pm.plugin.Name()) if err := pm.plugin.TearDownPod(podNamespace, podName, id); err != nil { recordError(operation) return fmt.Errorf("networkPlugin %s failed to teardown pod %q network: %v", pm.plugin.Name(), fullPodName, err) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/remote/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/remote/BUILD deleted file mode 100644 index ac203624c910..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/remote/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["docker_server.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/dockershim/remote", - deps = [ - "//pkg/kubelet/dockershim:go_default_library", - "//pkg/kubelet/util:go_default_library", - "//staging/src/k8s.io/cri-api/pkg/apis/runtime/v1alpha2:go_default_library", - "//vendor/google.golang.org/grpc:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/remote/docker_server.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/remote/docker_server.go index e5be0d6875bd..c9bd69ca417d 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/remote/docker_server.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/remote/docker_server.go @@ -20,6 +20,7 @@ package remote import ( "fmt" + "os" "google.golang.org/grpc" runtimeapi "k8s.io/cri-api/pkg/apis/runtime/v1alpha2" @@ -54,11 +55,11 @@ func NewDockerServer(endpoint string, s dockershim.CRIService) *DockerServer { func (s *DockerServer) Start() error { // Start the internal service. if err := s.service.Start(); err != nil { - klog.Errorf("Unable to start docker service") + klog.ErrorS(err, "Unable to start docker service") return err } - klog.V(2).Infof("Start dockershim grpc server") + klog.V(2).InfoS("Start dockershim grpc server") l, err := util.CreateListener(s.endpoint) if err != nil { return fmt.Errorf("failed to listen on %q: %v", s.endpoint, err) @@ -72,7 +73,8 @@ func (s *DockerServer) Start() error { runtimeapi.RegisterImageServiceServer(s.server, s.service) go func() { if err := s.server.Serve(l); err != nil { - klog.Fatalf("Failed to serve connections: %v", err) + klog.ErrorS(err, "Failed to serve connections") + os.Exit(1) } }() return nil diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/security_context.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/security_context.go index 571fdd33767c..6c6d313f271d 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/security_context.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/security_context.go @@ -43,6 +43,7 @@ func applySandboxSecurityContext(lc *runtimeapi.LinuxPodSandboxConfig, config *d ReadonlyRootfs: lc.SecurityContext.ReadonlyRootfs, SelinuxOptions: lc.SecurityContext.SelinuxOptions, NamespaceOptions: lc.SecurityContext.NamespaceOptions, + Privileged: lc.SecurityContext.Privileged, } } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/envvars/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/envvars/BUILD deleted file mode 100644 index 21ad908ffec9..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/envvars/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "envvars.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/envvars", - deps = [ - "//pkg/apis/core/v1/helper:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["envvars_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/events/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/events/BUILD deleted file mode 100644 index 2c43d69c129a..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/events/BUILD +++ /dev/null @@ -1,25 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["event.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/events", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/BUILD deleted file mode 100644 index 6b7f0068477d..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/BUILD +++ /dev/null @@ -1,98 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "eviction_manager_test.go", - "helpers_test.go", - "memory_threshold_notifier_test.go", - "mock_threshold_notifier_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/scheduling:go_default_library", - "//pkg/features:go_default_library", - "//pkg/kubelet/eviction/api:go_default_library", - "//pkg/kubelet/lifecycle:go_default_library", - "//pkg/kubelet/types:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - "//staging/src/k8s.io/kubelet/pkg/apis/stats/v1alpha1:go_default_library", - "//vendor/github.com/stretchr/testify/mock:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "eviction_manager.go", - "helpers.go", - "memory_threshold_notifier.go", - "threshold_notifier_linux.go", - "threshold_notifier_unsupported.go", - "types.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/eviction", - deps = [ - "//pkg/api/v1/resource:go_default_library", - "//pkg/apis/core/v1/helper:go_default_library", - "//pkg/apis/core/v1/helper/qos:go_default_library", - "//pkg/features:go_default_library", - "//pkg/kubelet/cm:go_default_library", - "//pkg/kubelet/eviction/api:go_default_library", - "//pkg/kubelet/lifecycle:go_default_library", - "//pkg/kubelet/metrics:go_default_library", - "//pkg/kubelet/server/stats:go_default_library", - "//pkg/kubelet/types:go_default_library", - "//pkg/kubelet/util/format:go_default_library", - "//pkg/volume/util:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/component-helpers/scheduling/corev1:go_default_library", - "//staging/src/k8s.io/kubelet/pkg/apis/stats/v1alpha1:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/kubelet/eviction/api:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/api/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/api/BUILD deleted file mode 100644 index b66673dffe9a..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/api/BUILD +++ /dev/null @@ -1,26 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["types.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/eviction/api", - deps = ["//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/api/types.go b/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/api/types.go index 68bc0bb58e4e..b5a6d36a4317 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/api/types.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/api/types.go @@ -58,12 +58,13 @@ const ( // from either above or below, never both). There is thus no reason to expose the // operator in the Kubelet's public API. Instead, we internally map signal types to operators. var OpForSignal = map[Signal]ThresholdOperator{ - SignalMemoryAvailable: OpLessThan, - SignalNodeFsAvailable: OpLessThan, - SignalNodeFsInodesFree: OpLessThan, - SignalImageFsAvailable: OpLessThan, - SignalImageFsInodesFree: OpLessThan, - SignalPIDAvailable: OpLessThan, + SignalMemoryAvailable: OpLessThan, + SignalNodeFsAvailable: OpLessThan, + SignalNodeFsInodesFree: OpLessThan, + SignalImageFsAvailable: OpLessThan, + SignalImageFsInodesFree: OpLessThan, + SignalAllocatableMemoryAvailable: OpLessThan, + SignalPIDAvailable: OpLessThan, } // ThresholdValue is a value holder that abstracts literal versus percentage based quantity diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/eviction_manager.go b/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/eviction_manager.go index 5c393917f77e..db43a652cf0c 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/eviction_manager.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/eviction_manager.go @@ -26,13 +26,12 @@ import ( v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" - "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/clock" utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/client-go/tools/record" + v1helper "k8s.io/component-helpers/scheduling/corev1" statsapi "k8s.io/kubelet/pkg/apis/stats/v1alpha1" apiv1resource "k8s.io/kubernetes/pkg/api/v1/resource" - v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper" v1qos "k8s.io/kubernetes/pkg/apis/core/v1/helper/qos" "k8s.io/kubernetes/pkg/features" evictionapi "k8s.io/kubernetes/pkg/kubelet/eviction/api" @@ -99,8 +98,6 @@ type managerImpl struct { thresholdNotifiers []ThresholdNotifier // thresholdsLastUpdated is the last time the thresholdNotifiers were updated. thresholdsLastUpdated time.Time - // etcHostsPath is a function that will get the etc-hosts file's path for a pod given its UID - etcHostsPath func(podUID types.UID) string } // ensure it implements the required interface @@ -117,7 +114,6 @@ func NewManager( recorder record.EventRecorder, nodeRef *v1.ObjectReference, clock clock.Clock, - etcHostsPath func(types.UID) string, ) (Manager, lifecycle.PodAdmitHandler) { manager := &managerImpl{ clock: clock, @@ -133,7 +129,6 @@ func NewManager( thresholdsFirstObservedAt: thresholdsObservedAt{}, dedicatedImageFs: nil, thresholdNotifiers: []ThresholdNotifier{}, - etcHostsPath: etcHostsPath, } return manager, manager } @@ -170,7 +165,7 @@ func (m *managerImpl) Admit(attrs *lifecycle.PodAdmitAttributes) lifecycle.PodAd } // reject pods when under memory pressure (if pod is best effort), or if under disk pressure. - klog.Warningf("Failed to admit pod %s - node has conditions: %v", format.Pod(attrs.Pod), m.nodeConditions) + klog.InfoS("Failed to admit pod to node", "pod", klog.KObj(attrs.Pod), "nodeCondition", m.nodeConditions) return lifecycle.PodAdmitResult{ Admit: false, Reason: Reason, @@ -181,7 +176,7 @@ func (m *managerImpl) Admit(attrs *lifecycle.PodAdmitAttributes) lifecycle.PodAd // Start starts the control loop to observe and response to low compute resources. func (m *managerImpl) Start(diskInfoProvider DiskInfoProvider, podFunc ActivePodsFunc, podCleanedUpFunc PodCleanedUpFunc, monitoringInterval time.Duration) { thresholdHandler := func(message string) { - klog.Infof(message) + klog.InfoS(message) m.synchronize(diskInfoProvider, podFunc) } if m.config.KernelMemcgNotification { @@ -189,7 +184,7 @@ func (m *managerImpl) Start(diskInfoProvider DiskInfoProvider, podFunc ActivePod if threshold.Signal == evictionapi.SignalMemoryAvailable || threshold.Signal == evictionapi.SignalAllocatableMemoryAvailable { notifier, err := NewMemoryThresholdNotifier(threshold, m.config.PodCgroupRoot, &CgroupNotifierFactory{}, thresholdHandler) if err != nil { - klog.Warningf("eviction manager: failed to create memory threshold notifier: %v", err) + klog.InfoS("Eviction manager: failed to create memory threshold notifier", "err", err) } else { go notifier.Start() m.thresholdNotifiers = append(m.thresholdNotifiers, notifier) @@ -201,7 +196,7 @@ func (m *managerImpl) Start(diskInfoProvider DiskInfoProvider, podFunc ActivePod go func() { for { if evictedPods := m.synchronize(diskInfoProvider, podFunc); evictedPods != nil { - klog.Infof("eviction manager: pods %s evicted, waiting for pod to be cleaned up", format.Pods(evictedPods)) + klog.InfoS("Eviction manager: pods evicted, waiting for pod to be cleaned up", "pods", format.Pods(evictedPods)) m.waitForPodsCleanup(podCleanedUpFunc, evictedPods) } else { time.Sleep(monitoringInterval) @@ -240,7 +235,7 @@ func (m *managerImpl) synchronize(diskInfoProvider DiskInfoProvider, podFunc Act return nil } - klog.V(3).Infof("eviction manager: synchronize housekeeping") + klog.V(3).InfoS("Eviction manager: synchronize housekeeping") // build the ranking functions (if not yet known) // TODO: have a function in cadvisor that lets us know if global housekeeping has completed if m.dedicatedImageFs == nil { @@ -257,7 +252,7 @@ func (m *managerImpl) synchronize(diskInfoProvider DiskInfoProvider, podFunc Act updateStats := true summary, err := m.summaryProvider.Get(updateStats) if err != nil { - klog.Errorf("eviction manager: failed to get summary stats: %v", err) + klog.ErrorS(err, "Eviction manager: failed to get summary stats") return nil } @@ -265,7 +260,7 @@ func (m *managerImpl) synchronize(diskInfoProvider DiskInfoProvider, podFunc Act m.thresholdsLastUpdated = m.clock.Now() for _, notifier := range m.thresholdNotifiers { if err := notifier.UpdateThreshold(summary); err != nil { - klog.Warningf("eviction manager: failed to update %s: %v", notifier.Description(), err) + klog.InfoS("Eviction manager: failed to update notifier", "notifier", notifier.Description(), "err", err) } } } @@ -292,7 +287,7 @@ func (m *managerImpl) synchronize(diskInfoProvider DiskInfoProvider, podFunc Act // the set of node conditions that are triggered by currently observed thresholds nodeConditions := nodeConditions(thresholds) if len(nodeConditions) > 0 { - klog.V(3).Infof("eviction manager: node conditions - observed: %v", nodeConditions) + klog.V(3).InfoS("Eviction manager: node conditions - observed", "nodeCondition", nodeConditions) } // track when a node condition was last observed @@ -301,7 +296,7 @@ func (m *managerImpl) synchronize(diskInfoProvider DiskInfoProvider, podFunc Act // node conditions report true if it has been observed within the transition period window nodeConditions = nodeConditionsObservedSince(nodeConditionsLastObservedAt, m.config.PressureTransitionPeriod, now) if len(nodeConditions) > 0 { - klog.V(3).Infof("eviction manager: node conditions - transition period not met: %v", nodeConditions) + klog.V(3).InfoS("Eviction manager: node conditions - transition period not met", "nodeCondition", nodeConditions) } // determine the set of thresholds we need to drive eviction behavior (i.e. all grace periods are met) @@ -331,7 +326,7 @@ func (m *managerImpl) synchronize(diskInfoProvider DiskInfoProvider, podFunc Act } if len(thresholds) == 0 { - klog.V(3).Infof("eviction manager: no resources are starved") + klog.V(3).InfoS("Eviction manager: no resources are starved") return nil } @@ -341,36 +336,36 @@ func (m *managerImpl) synchronize(diskInfoProvider DiskInfoProvider, podFunc Act if !foundAny { return nil } - klog.Warningf("eviction manager: attempting to reclaim %v", resourceToReclaim) + klog.InfoS("Eviction manager: attempting to reclaim", "resourceName", resourceToReclaim) // record an event about the resources we are now attempting to reclaim via eviction m.recorder.Eventf(m.nodeRef, v1.EventTypeWarning, "EvictionThresholdMet", "Attempting to reclaim %s", resourceToReclaim) // check if there are node-level resources we can reclaim to reduce pressure before evicting end-user pods. if m.reclaimNodeLevelResources(thresholdToReclaim.Signal, resourceToReclaim) { - klog.Infof("eviction manager: able to reduce %v pressure without evicting pods.", resourceToReclaim) + klog.InfoS("Eviction manager: able to reduce resource pressure without evicting pods.", "resourceName", resourceToReclaim) return nil } - klog.Infof("eviction manager: must evict pod(s) to reclaim %v", resourceToReclaim) + klog.InfoS("Eviction manager: must evict pod(s) to reclaim", "resourceName", resourceToReclaim) // rank the pods for eviction rank, ok := m.signalToRankFunc[thresholdToReclaim.Signal] if !ok { - klog.Errorf("eviction manager: no ranking function for signal %s", thresholdToReclaim.Signal) + klog.ErrorS(nil, "Eviction manager: no ranking function for signal", "threshold", thresholdToReclaim.Signal) return nil } // the only candidates viable for eviction are those pods that had anything running. if len(activePods) == 0 { - klog.Errorf("eviction manager: eviction thresholds have been met, but no pods are active to evict") + klog.ErrorS(nil, "Eviction manager: eviction thresholds have been met, but no pods are active to evict") return nil } // rank the running pods for eviction for the specified resource rank(activePods, statsFunc) - klog.Infof("eviction manager: pods ranked for eviction: %s", format.Pods(activePods)) + klog.InfoS("Eviction manager: pods ranked for eviction", "pods", format.Pods(activePods)) //record age of metrics for met thresholds that we are using for evictions. for _, t := range thresholds { @@ -393,7 +388,7 @@ func (m *managerImpl) synchronize(diskInfoProvider DiskInfoProvider, podFunc Act return []*v1.Pod{pod} } } - klog.Infof("eviction manager: unable to evict any pods from the node") + klog.InfoS("Eviction manager: unable to evict any pods from the node") return nil } @@ -405,7 +400,7 @@ func (m *managerImpl) waitForPodsCleanup(podCleanedUpFunc PodCleanedUpFunc, pods for { select { case <-timeout.C(): - klog.Warningf("eviction manager: timed out waiting for pods %s to be cleaned up", format.Pods(pods)) + klog.InfoS("Eviction manager: timed out waiting for pods to be cleaned up", "pods", format.Pods(pods)) return case <-ticker.C(): for i, pod := range pods { @@ -413,7 +408,7 @@ func (m *managerImpl) waitForPodsCleanup(podCleanedUpFunc PodCleanedUpFunc, pods break } if i == len(pods)-1 { - klog.Infof("eviction manager: pods %s successfully cleaned up", format.Pods(pods)) + klog.InfoS("Eviction manager: pods successfully cleaned up", "pods", format.Pods(pods)) return } } @@ -427,14 +422,14 @@ func (m *managerImpl) reclaimNodeLevelResources(signalToReclaim evictionapi.Sign for _, nodeReclaimFunc := range nodeReclaimFuncs { // attempt to reclaim the pressured resource. if err := nodeReclaimFunc(); err != nil { - klog.Warningf("eviction manager: unexpected error when attempting to reduce %v pressure: %v", resourceToReclaim, err) + klog.InfoS("Eviction manager: unexpected error when attempting to reduce resource pressure", "resourceName", resourceToReclaim, "err", err) } } if len(nodeReclaimFuncs) > 0 { summary, err := m.summaryProvider.Get(true) if err != nil { - klog.Errorf("eviction manager: failed to get summary stats after resource reclaim: %v", err) + klog.ErrorS(err, "Eviction manager: failed to get summary stats after resource reclaim") return false } @@ -512,20 +507,11 @@ func (m *managerImpl) podEphemeralStorageLimitEviction(podStats statsapi.PodStat return false } + // pod stats api summarizes ephemeral storage usage (container, emptyDir, host[etc-hosts, logs]) podEphemeralStorageTotalUsage := &resource.Quantity{} - var fsStatsSet []fsStatsType - if *m.dedicatedImageFs { - fsStatsSet = []fsStatsType{fsStatsLogs, fsStatsLocalVolumeSource} - } else { - fsStatsSet = []fsStatsType{fsStatsRoot, fsStatsLogs, fsStatsLocalVolumeSource} + if podStats.EphemeralStorage != nil && podStats.EphemeralStorage.UsedBytes != nil { + podEphemeralStorageTotalUsage = resource.NewQuantity(int64(*podStats.EphemeralStorage.UsedBytes), resource.BinarySI) } - podEphemeralUsage, err := podLocalEphemeralStorageUsage(podStats, pod, fsStatsSet, m.etcHostsPath(pod.UID)) - if err != nil { - klog.Errorf("eviction manager: error getting pod disk usage %v", err) - return false - } - - podEphemeralStorageTotalUsage.Add(podEphemeralUsage[v1.ResourceEphemeralStorage]) podEphemeralStorageLimit := podLimits[v1.ResourceEphemeralStorage] if podEphemeralStorageTotalUsage.Cmp(podEphemeralStorageLimit) > 0 { // the total usage of pod exceeds the total size limit of containers, evict the pod @@ -571,7 +557,7 @@ func (m *managerImpl) evictPod(pod *v1.Pod, gracePeriodOverride int64, evictMsg // do not evict such pods. Static pods are not re-admitted after evictions. // https://github.com/kubernetes/kubernetes/issues/40573 has more details. if kubelettypes.IsCriticalPod(pod) { - klog.Errorf("eviction manager: cannot evict a critical pod %s", format.Pod(pod)) + klog.ErrorS(nil, "Eviction manager: cannot evict a critical pod", "pod", klog.KObj(pod)) return false } status := v1.PodStatus{ @@ -584,9 +570,9 @@ func (m *managerImpl) evictPod(pod *v1.Pod, gracePeriodOverride int64, evictMsg // this is a blocking call and should only return when the pod and its containers are killed. err := m.killPodFunc(pod, status, &gracePeriodOverride) if err != nil { - klog.Errorf("eviction manager: pod %s failed to evict %v", format.Pod(pod), err) + klog.ErrorS(err, "Eviction manager: pod failed to evict", "pod", klog.KObj(pod)) } else { - klog.Infof("eviction manager: pod %s is evicted successfully", format.Pod(pod)) + klog.InfoS("Eviction manager: pod is evicted successfully", "pod", klog.KObj(pod)) } return true } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/helpers.go b/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/helpers.go index 3d479318482f..23fe1b3cf442 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/helpers.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/helpers.go @@ -18,7 +18,6 @@ package eviction import ( "fmt" - "os" "sort" "strconv" "strings" @@ -104,7 +103,7 @@ func getReclaimableThreshold(thresholds []evictionapi.Threshold) (evictionapi.Th if resourceToReclaim, ok := signalToResource[thresholdToReclaim.Signal]; ok { return thresholdToReclaim, resourceToReclaim, true } - klog.V(3).Infof("eviction manager: threshold %s was crossed, but reclaim is not implemented for this threshold.", thresholdToReclaim.Signal) + klog.V(3).InfoS("Eviction manager: threshold was crossed, but reclaim is not implemented for this threshold.", "threshold", thresholdToReclaim.Signal) } return evictionapi.Threshold{}, "", false } @@ -205,7 +204,8 @@ func parseThresholdStatement(signal evictionapi.Signal, val string) (*evictionap if percentage < 0 { return nil, fmt.Errorf("eviction percentage threshold %v must be >= 0%%: %s", signal, val) } - if percentage > 100 { + // percentage is a float and should not be greater than 1 (100%) + if percentage > 1 { return nil, fmt.Errorf("eviction percentage threshold %v must be <= 100%%: %s", signal, val) } return &evictionapi.Threshold{ @@ -344,9 +344,7 @@ func localVolumeNames(pod *v1.Pod) []string { result := []string{} for _, volume := range pod.Spec.Volumes { if volume.HostPath != nil || - (volume.EmptyDir != nil && volume.EmptyDir.Medium != v1.StorageMediumMemory) || - volume.ConfigMap != nil || - volume.GitRepo != nil { + volumeutils.IsLocalEphemeralVolume(volume) { result = append(result, volume.Name) } } @@ -413,44 +411,6 @@ func podDiskUsage(podStats statsapi.PodStats, pod *v1.Pod, statsToMeasure []fsSt }, nil } -// localEphemeralVolumeNames returns the set of ephemeral volumes for the pod that are local -func localEphemeralVolumeNames(pod *v1.Pod) []string { - result := []string{} - for _, volume := range pod.Spec.Volumes { - if volumeutils.IsLocalEphemeralVolume(volume) { - result = append(result, volume.Name) - } - } - return result -} - -// podLocalEphemeralStorageUsage aggregates pod local ephemeral storage usage and inode consumption for the specified stats to measure. -func podLocalEphemeralStorageUsage(podStats statsapi.PodStats, pod *v1.Pod, statsToMeasure []fsStatsType, etcHostsPath string) (v1.ResourceList, error) { - disk := resource.Quantity{Format: resource.BinarySI} - inodes := resource.Quantity{Format: resource.DecimalSI} - - containerUsageList := containerUsage(podStats, statsToMeasure) - disk.Add(containerUsageList[v1.ResourceEphemeralStorage]) - inodes.Add(containerUsageList[resourceInodes]) - - if hasFsStatsType(statsToMeasure, fsStatsLocalVolumeSource) { - volumeNames := localEphemeralVolumeNames(pod) - podLocalVolumeUsageList := podLocalVolumeUsage(volumeNames, podStats) - disk.Add(podLocalVolumeUsageList[v1.ResourceEphemeralStorage]) - inodes.Add(podLocalVolumeUsageList[resourceInodes]) - } - if len(etcHostsPath) > 0 { - if stat, err := os.Stat(etcHostsPath); err == nil { - disk.Add(*resource.NewQuantity(int64(stat.Size()), resource.BinarySI)) - inodes.Add(*resource.NewQuantity(int64(1), resource.DecimalSI)) - } - } - return v1.ResourceList{ - v1.ResourceEphemeralStorage: disk, - resourceInodes: inodes, - }, nil -} - // formatThreshold formats a threshold for logging. func formatThreshold(threshold evictionapi.Threshold) string { return fmt.Sprintf("threshold(signal=%v, operator=%v, value=%v, gracePeriod=%v)", threshold.Signal, threshold.Operator, evictionapi.ThresholdValue(threshold.Value), threshold.GracePeriod) @@ -710,7 +670,7 @@ func makeSignalObservations(summary *statsapi.Summary) (signalObservations, stat } } if allocatableContainer, err := getSysContainer(summary.Node.SystemContainers, statsapi.SystemContainerPods); err != nil { - klog.Errorf("eviction manager: failed to construct signal: %q error: %v", evictionapi.SignalAllocatableMemoryAvailable, err) + klog.ErrorS(err, "Eviction manager: failed to construct signal", "signal", evictionapi.SignalAllocatableMemoryAvailable) } else { if memory := allocatableContainer.Memory; memory != nil && memory.AvailableBytes != nil && memory.WorkingSetBytes != nil { result[evictionapi.SignalAllocatableMemoryAvailable] = signalObservation{ @@ -783,7 +743,7 @@ func thresholdsMet(thresholds []evictionapi.Threshold, observations signalObserv threshold := thresholds[i] observed, found := observations[threshold.Signal] if !found { - klog.Warningf("eviction manager: no observation found for eviction signal %v", threshold.Signal) + klog.InfoS("Eviction manager: no observation found for eviction signal", "signal", threshold.Signal) continue } // determine if we have met the specified threshold @@ -811,9 +771,9 @@ func debugLogObservations(logPrefix string, observations signalObservations) { } for k, v := range observations { if !v.time.IsZero() { - klog.Infof("eviction manager: %v: signal=%v, available: %v, capacity: %v, time: %v", logPrefix, k, v.available, v.capacity, v.time) + klog.InfoS("Eviction manager:", "log", logPrefix, "signal", k, "resourceName", v.available, "capacity", v.capacity, "time", v.time) } else { - klog.Infof("eviction manager: %v: signal=%v, available: %v, capacity: %v", logPrefix, k, v.available, v.capacity) + klog.InfoS("Eviction manager:", "log", logPrefix, "signal", k, "resourceName", v.available, "capacity", v.capacity) } } } @@ -827,9 +787,9 @@ func debugLogThresholdsWithObservation(logPrefix string, thresholds []evictionap observed, found := observations[threshold.Signal] if found { quantity := evictionapi.GetThresholdQuantity(threshold.Value, observed.capacity) - klog.Infof("eviction manager: %v: threshold [signal=%v, quantity=%v] observed %v", logPrefix, threshold.Signal, quantity, observed.available) + klog.InfoS("Eviction manager: threshold observed resource", "log", logPrefix, "signal", threshold.Signal, "quantity", quantity, "resource", observed.available) } else { - klog.Infof("eviction manager: %v: threshold [signal=%v] had no observation", logPrefix, threshold.Signal) + klog.InfoS("Eviction manager: threshold had no observation", "log", logPrefix, "signal", threshold.Signal) } } } @@ -840,7 +800,7 @@ func thresholdsUpdatedStats(thresholds []evictionapi.Threshold, observations, la threshold := thresholds[i] observed, found := observations[threshold.Signal] if !found { - klog.Warningf("eviction manager: no observation found for eviction signal %v", threshold.Signal) + klog.InfoS("Eviction manager: no observation found for eviction signal", "signal", threshold.Signal) continue } last, found := lastObservations[threshold.Signal] @@ -870,7 +830,7 @@ func thresholdsMetGracePeriod(observedAt thresholdsObservedAt, now time.Time) [] for threshold, at := range observedAt { duration := now.Sub(at) if duration < threshold.GracePeriod { - klog.V(2).Infof("eviction manager: eviction criteria not yet met for %v, duration: %v", formatThreshold(threshold), duration) + klog.V(2).InfoS("Eviction manager: eviction criteria not yet met", "threshold", formatThreshold(threshold), "duration", duration) continue } results = append(results, threshold) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/memory_threshold_notifier.go b/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/memory_threshold_notifier.go index a899c98adcd4..3ce5fb811e14 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/memory_threshold_notifier.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/memory_threshold_notifier.go @@ -71,7 +71,7 @@ func NewMemoryThresholdNotifier(threshold evictionapi.Threshold, cgroupRoot stri } func (m *memoryThresholdNotifier) Start() { - klog.Infof("eviction manager: created %s", m.Description()) + klog.InfoS("Eviction manager: created memoryThresholdNotifier", "notifier", m.Description()) for range m.events { m.handler(fmt.Sprintf("eviction manager: %s crossed", m.Description())) } @@ -98,7 +98,7 @@ func (m *memoryThresholdNotifier) UpdateThreshold(summary *statsapi.Summary) err memcgThreshold.Sub(*evictionThresholdQuantity) memcgThreshold.Add(*inactiveFile) - klog.V(3).Infof("eviction manager: setting %s to %s\n", m.Description(), memcgThreshold.String()) + klog.V(3).InfoS("Eviction manager: setting notifier to capacity", "notifier", m.Description(), "capacity", memcgThreshold.String()) if m.notifier != nil { m.notifier.Stop() } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/threshold_notifier_linux.go b/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/threshold_notifier_linux.go index 270a7452db9f..891bc4d001c9 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/threshold_notifier_linux.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/threshold_notifier_linux.go @@ -104,7 +104,7 @@ func (n *linuxCgroupNotifier) Start(eventCh chan<- struct{}) { Events: unix.EPOLLIN, }) if err != nil { - klog.Warningf("eviction manager: error adding epoll eventfd: %v", err) + klog.InfoS("Eviction manager: error adding epoll eventfd", "err", err) return } for { @@ -115,7 +115,7 @@ func (n *linuxCgroupNotifier) Start(eventCh chan<- struct{}) { } event, err := wait(n.epfd, n.eventfd, notifierRefreshInterval) if err != nil { - klog.Warningf("eviction manager: error while waiting for memcg events: %v", err) + klog.InfoS("Eviction manager: error while waiting for memcg events", "err", err) return } else if !event { // Timeout on wait. This is expected if the threshold was not crossed @@ -125,7 +125,7 @@ func (n *linuxCgroupNotifier) Start(eventCh chan<- struct{}) { buf := make([]byte, eventSize) _, err = unix.Read(n.eventfd, buf) if err != nil { - klog.Warningf("eviction manager: error reading memcg events: %v", err) + klog.InfoS("Eviction manager: error reading memcg events", "err", err) return } eventCh <- struct{}{} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/threshold_notifier_unsupported.go b/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/threshold_notifier_unsupported.go index c82954e25dda..0b334caa0b29 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/threshold_notifier_unsupported.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/threshold_notifier_unsupported.go @@ -22,7 +22,7 @@ import "k8s.io/klog/v2" // NewCgroupNotifier creates a cgroup notifier that does nothing because cgroups do not exist on non-linux systems. func NewCgroupNotifier(path, attribute string, threshold int64) (CgroupNotifier, error) { - klog.V(5).Infof("cgroup notifications not supported") + klog.V(5).InfoS("cgroup notifications not supported") return &unsupportedThresholdNotifier{}, nil } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/images/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/images/BUILD deleted file mode 100644 index 7e19692534f2..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/images/BUILD +++ /dev/null @@ -1,70 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "helpers.go", - "image_gc_manager.go", - "image_manager.go", - "puller.go", - "types.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/images", - deps = [ - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/events:go_default_library", - "//pkg/kubelet/util/sliceutils:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/cri-api/pkg/apis/runtime/v1alpha2:go_default_library", - "//staging/src/k8s.io/kubelet/pkg/apis/stats/v1alpha1:go_default_library", - "//vendor/github.com/docker/distribution/reference:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "image_gc_manager_test.go", - "image_manager_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/container/testing:go_default_library", - "//pkg/kubelet/server/stats/testing:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/kubelet/pkg/apis/stats/v1alpha1:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/images/image_gc_manager.go b/vendor/k8s.io/kubernetes/pkg/kubelet/images/image_gc_manager.go index e168b1d2634f..ac1651d25181 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/images/image_gc_manager.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/images/image_gc_manager.go @@ -183,7 +183,7 @@ func (im *realImageGCManager) Start() { } _, err := im.detectImages(ts) if err != nil { - klog.Warningf("[imageGCManager] Failed to monitor images: %v", err) + klog.InfoS("Failed to monitor images", "err", err) } else { im.initialized = true } @@ -193,7 +193,7 @@ func (im *realImageGCManager) Start() { go wait.Until(func() { images, err := im.runtime.ListImages() if err != nil { - klog.Warningf("[imageGCManager] Failed to update image list: %v", err) + klog.InfoS("Failed to update image list", "err", err) } else { im.imageCache.set(images) } @@ -227,7 +227,7 @@ func (im *realImageGCManager) detectImages(detectTime time.Time) (sets.String, e // Make a set of images in use by containers. for _, pod := range pods { for _, container := range pod.Containers { - klog.V(5).Infof("Pod %s/%s, container %s uses image %s(%s)", pod.Namespace, pod.Name, container.Name, container.Image, container.ImageID) + klog.V(5).InfoS("Container uses image", "pod", klog.KRef(pod.Namespace, pod.Name), "containerName", container.Name, "containerImage", container.Image, "imageID", container.ImageID) imagesInUse.Insert(container.ImageID) } } @@ -238,12 +238,12 @@ func (im *realImageGCManager) detectImages(detectTime time.Time) (sets.String, e im.imageRecordsLock.Lock() defer im.imageRecordsLock.Unlock() for _, image := range images { - klog.V(5).Infof("Adding image ID %s to currentImages", image.ID) + klog.V(5).InfoS("Adding image ID to currentImages", "imageID", image.ID) currentImages.Insert(image.ID) // New image, set it as detected now. if _, ok := im.imageRecords[image.ID]; !ok { - klog.V(5).Infof("Image ID %s is new", image.ID) + klog.V(5).InfoS("Image ID is new", "imageID", image.ID) im.imageRecords[image.ID] = &imageRecord{ firstDetected: detectTime, } @@ -251,18 +251,18 @@ func (im *realImageGCManager) detectImages(detectTime time.Time) (sets.String, e // Set last used time to now if the image is being used. if isImageUsed(image.ID, imagesInUse) { - klog.V(5).Infof("Setting Image ID %s lastUsed to %v", image.ID, now) + klog.V(5).InfoS("Setting Image ID lastUsed", "imageID", image.ID, "lastUsed", now) im.imageRecords[image.ID].lastUsed = now } - klog.V(5).Infof("Image ID %s has size %d", image.ID, image.Size) + klog.V(5).InfoS("Image ID has size", "imageID", image.ID, "size", image.Size) im.imageRecords[image.ID].size = image.Size } // Remove old images from our records. for image := range im.imageRecords { if !currentImages.Has(image) { - klog.V(5).Infof("Image ID %s is no longer present; removing from imageRecords", image) + klog.V(5).InfoS("Image ID is no longer present; removing from imageRecords", "imageID", image) delete(im.imageRecords, image) } } @@ -286,7 +286,7 @@ func (im *realImageGCManager) GarbageCollect() error { } if available > capacity { - klog.Warningf("available %d is larger than capacity %d", available, capacity) + klog.InfoS("Availability is larger than capacity", "available", available, "capacity", capacity) available = capacity } @@ -301,7 +301,7 @@ func (im *realImageGCManager) GarbageCollect() error { usagePercent := 100 - int(available*100/capacity) if usagePercent >= im.policy.HighThresholdPercent { amountToFree := capacity*int64(100-im.policy.LowThresholdPercent)/100 - available - klog.Infof("[imageGCManager]: Disk usage on image filesystem is at %d%% which is over the high threshold (%d%%). Trying to free %d bytes down to the low threshold (%d%%).", usagePercent, im.policy.HighThresholdPercent, amountToFree, im.policy.LowThresholdPercent) + klog.InfoS("Disk usage on image filesystem is over the high threshold, trying to free bytes down to the low threshold", "usage", usagePercent, "highThreshold", im.policy.HighThresholdPercent, "amountToFree", amountToFree, "lowThreshold", im.policy.LowThresholdPercent) freed, err := im.freeSpace(amountToFree, time.Now()) if err != nil { return err @@ -318,7 +318,7 @@ func (im *realImageGCManager) GarbageCollect() error { } func (im *realImageGCManager) DeleteUnusedImages() error { - klog.Infof("attempting to delete unused images") + klog.InfoS("Attempting to delete unused images") _, err := im.freeSpace(math.MaxInt64, time.Now()) return err } @@ -342,7 +342,7 @@ func (im *realImageGCManager) freeSpace(bytesToFree int64, freeTime time.Time) ( images := make([]evictionInfo, 0, len(im.imageRecords)) for image, record := range im.imageRecords { if isImageUsed(image, imagesInUse) { - klog.V(5).Infof("Image ID %s is being used", image) + klog.V(5).InfoS("Image ID is being used", "imageID", image) continue } images = append(images, evictionInfo{ @@ -356,10 +356,10 @@ func (im *realImageGCManager) freeSpace(bytesToFree int64, freeTime time.Time) ( var deletionErrors []error spaceFreed := int64(0) for _, image := range images { - klog.V(5).Infof("Evaluating image ID %s for possible garbage collection", image.id) + klog.V(5).InfoS("Evaluating image ID for possible garbage collection", "imageID", image.id) // Images that are currently in used were given a newer lastUsed. if image.lastUsed.Equal(freeTime) || image.lastUsed.After(freeTime) { - klog.V(5).Infof("Image ID %s has lastUsed=%v which is >= freeTime=%v, not eligible for garbage collection", image.id, image.lastUsed, freeTime) + klog.V(5).InfoS("Image ID was used too recently, not eligible for garbage collection", "imageID", image.id, "lastUsed", image.lastUsed, "freeTime", freeTime) continue } @@ -367,12 +367,12 @@ func (im *realImageGCManager) freeSpace(bytesToFree int64, freeTime time.Time) ( // In such a case, the image may have just been pulled down, and will be used by a container right away. if freeTime.Sub(image.firstDetected) < im.policy.MinAge { - klog.V(5).Infof("Image ID %s has age %v which is less than the policy's minAge of %v, not eligible for garbage collection", image.id, freeTime.Sub(image.firstDetected), im.policy.MinAge) + klog.V(5).InfoS("Image ID's age is less than the policy's minAge, not eligible for garbage collection", "imageID", image.id, "age", freeTime.Sub(image.firstDetected), "minAge", im.policy.MinAge) continue } // Remove image. Continue despite errors. - klog.Infof("[imageGCManager]: Removing image %q to free %d bytes", image.id, image.size) + klog.InfoS("Removing image to free bytes", "imageID", image.id, "size", image.size) err := im.runtime.RemoveImage(container.ImageSpec{Image: image.id}) if err != nil { deletionErrors = append(deletionErrors, err) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/images/image_manager.go b/vendor/k8s.io/kubernetes/pkg/kubelet/images/image_manager.go index d41ebcebc38a..6d8b5f334294 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/images/image_manager.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/images/image_manager.go @@ -90,7 +90,7 @@ func (m *imageManager) EnsureImageExists(pod *v1.Pod, container *v1.Container, p logPrefix := fmt.Sprintf("%s/%s/%s", pod.Namespace, pod.Name, container.Image) ref, err := kubecontainer.GenerateContainerRef(pod, container) if err != nil { - klog.Errorf("Couldn't make a ref to pod %v, container %v: '%v'", pod.Name, container.Name, err) + klog.ErrorS(err, "Couldn't make a ref to pod", "pod", klog.KObj(pod), "containerName", container.Name) } // If the image contains no tag or digest, a default tag should be applied. diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet.go index 1367f248250a..e4b67b3f0ff1 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet.go @@ -81,6 +81,7 @@ import ( "k8s.io/kubernetes/pkg/kubelet/legacy" "k8s.io/kubernetes/pkg/kubelet/lifecycle" "k8s.io/kubernetes/pkg/kubelet/logs" + "k8s.io/kubernetes/pkg/kubelet/managed" "k8s.io/kubernetes/pkg/kubelet/metrics" "k8s.io/kubernetes/pkg/kubelet/metrics/collectors" "k8s.io/kubernetes/pkg/kubelet/network/dns" @@ -144,7 +145,8 @@ const ( evictionMonitoringPeriod = time.Second * 10 // The path in containers' filesystems where the hosts file is mounted. - etcHostsPath = "/etc/hosts" + linuxEtcHostsPath = "/etc/hosts" + windowsEtcHostsPath = "C:\\Windows\\System32\\drivers\\etc\\hosts" // Capacity of the channel for receiving pod lifecycle events. This number // is a bit arbitrary and may be adjusted in the future. @@ -177,6 +179,15 @@ const ( nodeLeaseRenewIntervalFraction = 0.25 ) +var etcHostsPath = getContainerEtcHostsPath() + +func getContainerEtcHostsPath() string { + if sysruntime.GOOS == "windows" { + return windowsEtcHostsPath + } + return linuxEtcHostsPath +} + // SyncHandler is an interface implemented by Kubelet, for testability type SyncHandler interface { HandlePodAdditions(pods []*v1.Pod) @@ -195,8 +206,8 @@ type Bootstrap interface { GetConfiguration() kubeletconfiginternal.KubeletConfiguration BirthCry() StartGarbageCollection() - ListenAndServe(address net.IP, port uint, tlsOptions *server.TLSOptions, auth server.AuthInterface, enableCAdvisorJSONEndpoints, enableDebuggingHandlers, enableContentionProfiling, enableSystemLogHandler bool) - ListenAndServeReadOnly(address net.IP, port uint, enableCAdvisorJSONEndpoints bool) + ListenAndServe(kubeCfg *kubeletconfiginternal.KubeletConfiguration, tlsOptions *server.TLSOptions, auth server.AuthInterface) + ListenAndServeReadOnly(address net.IP, port uint) ListenAndServePodResources() Run(<-chan kubetypes.PodUpdate) RunOnce(<-chan kubetypes.PodUpdate) ([]RunPodResult, error) @@ -262,18 +273,18 @@ func makePodSourceConfig(kubeCfg *kubeletconfiginternal.KubeletConfiguration, ku // define file config source if kubeCfg.StaticPodPath != "" { - klog.Infof("Adding pod path: %v", kubeCfg.StaticPodPath) + klog.InfoS("Adding static pod path", "path", kubeCfg.StaticPodPath) config.NewSourceFile(kubeCfg.StaticPodPath, nodeName, kubeCfg.FileCheckFrequency.Duration, cfg.Channel(kubetypes.FileSource)) } // define url config source if kubeCfg.StaticPodURL != "" { - klog.Infof("Adding pod url %q with HTTP header %v", kubeCfg.StaticPodURL, manifestURLHeader) + klog.InfoS("Adding pod URL with HTTP header", "URL", kubeCfg.StaticPodURL, "header", manifestURLHeader) config.NewSourceURL(kubeCfg.StaticPodURL, manifestURLHeader, nodeName, kubeCfg.HTTPCheckFrequency.Duration, cfg.Channel(kubetypes.HTTPSource)) } if kubeDeps.KubeClient != nil { - klog.Infof("Watching apiserver") + klog.InfoS("Watching apiserver") config.NewSourceApiserver(kubeDeps.KubeClient, nodeName, cfg.Channel(kubetypes.ApiserverSource)) } return cfg, nil @@ -297,7 +308,7 @@ func PreInitRuntimeService(kubeCfg *kubeletconfiginternal.KubeletConfiguration, switch containerRuntime { case kubetypes.DockerContainerRuntime: - klog.Warningf("Using dockershim is deprecated, please consider using a full-fledged CRI implementation") + klog.InfoS("Using dockershim is deprecated, please consider using a full-fledged CRI implementation") if err := runDockershim( kubeCfg, kubeDeps, @@ -423,6 +434,8 @@ func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration, var serviceLister corelisters.ServiceLister var serviceHasSynced cache.InformerSynced + // If kubeClient == nil, we are running in standalone mode (i.e. no API servers) + // If not nil, we are running as part of a cluster and should sync w/API if kubeDeps.KubeClient != nil { kubeInformers := informers.NewSharedInformerFactory(kubeDeps.KubeClient, 0) serviceLister = kubeInformers.Core().V1().Services().Lister() @@ -439,24 +452,24 @@ func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration, if kubeDeps.KubeClient != nil { kubeInformers := informers.NewSharedInformerFactoryWithOptions(kubeDeps.KubeClient, 0, informers.WithTweakListOptions(func(options *metav1.ListOptions) { - options.FieldSelector = fields.Set{api.ObjectNameField: string(nodeName)}.String() + options.FieldSelector = fields.Set{metav1.ObjectNameField: string(nodeName)}.String() })) nodeLister = kubeInformers.Core().V1().Nodes().Lister() nodeHasSynced = func() bool { if kubeInformers.Core().V1().Nodes().Informer().HasSynced() { return true } - klog.Infof("kubelet nodes not sync") + klog.InfoS("Kubelet nodes not sync") return false } kubeInformers.Start(wait.NeverStop) - klog.Info("Kubelet client is not nil") + klog.InfoS("Kubelet client is not nil") } else { // we dont have a client to sync! nodeIndexer := cache.NewIndexer(cache.MetaNamespaceKeyFunc, cache.Indexers{}) nodeLister = corelisters.NewNodeLister(nodeIndexer) nodeHasSynced = func() bool { return true } - klog.Info("Kubelet client is nil") + klog.InfoS("Kubelet client is nil") } // construct a node reference used for events @@ -476,7 +489,7 @@ func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration, for _, ipEntry := range kubeCfg.ClusterDNS { ip := net.ParseIP(ipEntry) if ip == nil { - klog.Warningf("Invalid clusterDNS ip '%q'", ipEntry) + klog.InfoS("Invalid clusterDNS IP", "IP", ipEntry) } else { clusterDNS = append(clusterDNS, ip) } @@ -546,8 +559,8 @@ func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration, var configMapManager configmap.Manager switch kubeCfg.ConfigMapAndSecretChangeDetectionStrategy { case kubeletconfiginternal.WatchChangeDetectionStrategy: - secretManager = secret.NewWatchingSecretManager(kubeDeps.KubeClient) - configMapManager = configmap.NewWatchingConfigMapManager(kubeDeps.KubeClient) + secretManager = secret.NewWatchingSecretManager(kubeDeps.KubeClient, klet.resyncInterval) + configMapManager = configmap.NewWatchingConfigMapManager(kubeDeps.KubeClient, klet.resyncInterval) case kubeletconfiginternal.TTLCacheChangeDetectionStrategy: secretManager = secret.NewCachingSecretManager( kubeDeps.KubeClient, manager.GetObjectTTLFromNodeFunc(klet.GetNode)) @@ -564,7 +577,7 @@ func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration, klet.configMapManager = configMapManager if klet.experimentalHostUserNamespaceDefaulting { - klog.Infof("Experimental host user namespace defaulting is enabled.") + klog.InfoS("Experimental host user namespace defaulting is enabled") } machineInfo, err := klet.cadvisor.MachineInfo() @@ -579,6 +592,7 @@ func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration, imageBackOff := flowcontrol.NewBackOff(backOffPeriod, MaxContainerBackOff) klet.livenessManager = proberesults.NewManager() + klet.readinessManager = proberesults.NewManager() klet.startupManager = proberesults.NewManager() klet.podCache = kubecontainer.NewCache() @@ -588,16 +602,20 @@ func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration, klet.statusManager = status.NewManager(klet.kubeClient, klet.podManager, klet) - klet.resourceAnalyzer = serverstats.NewResourceAnalyzer(klet, kubeCfg.VolumeStatsAggPeriod.Duration) + klet.resourceAnalyzer = serverstats.NewResourceAnalyzer(klet, kubeCfg.VolumeStatsAggPeriod.Duration, kubeDeps.Recorder) klet.dockerLegacyService = kubeDeps.dockerLegacyService klet.runtimeService = kubeDeps.RemoteRuntimeService + if managed.IsEnabled() { + klog.InfoS("Pinned Workload Management Enabled") + } + if kubeDeps.KubeClient != nil { klet.runtimeClassManager = runtimeclass.NewManager(kubeDeps.KubeClient) } - if containerRuntime == kubetypes.RemoteContainerRuntime && utilfeature.DefaultFeatureGate.Enabled(features.CRIContainerLogRotation) { + if containerRuntime == kubetypes.RemoteContainerRuntime { // setup containerLogManager for CRI container runtime containerLogManager, err := logs.NewContainerLogManager( klet.runtimeService, @@ -616,6 +634,7 @@ func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration, runtime, err := kuberuntime.NewKubeGenericRuntimeManager( kubecontainer.FilterEventRecorder(kubeDeps.Recorder), klet.livenessManager, + klet.readinessManager, klet.startupManager, seccompProfileRoot, machineInfo, @@ -651,6 +670,10 @@ func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration, } klet.runtimeCache = runtimeCache + // common provider to get host file system usage associated with a pod managed by kubelet + hostStatsProvider := stats.NewHostStatsProvider(kubecontainer.RealOS{}, func(podUID types.UID) (string, bool) { + return getEtcHostsPath(klet.getPodDir(podUID)), klet.containerRuntime.SupportsSingleFileMapping() + }) if kubeDeps.useLegacyCadvisorStats { klet.StatsProvider = stats.NewCadvisorStatsProvider( klet.cadvisor, @@ -658,7 +681,8 @@ func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration, klet.podManager, klet.runtimeCache, klet.containerRuntime, - klet.statusManager) + klet.statusManager, + hostStatsProvider) } else { klet.StatsProvider = stats.NewCRIStatsProvider( klet.cadvisor, @@ -667,15 +691,14 @@ func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration, klet.runtimeCache, kubeDeps.RemoteRuntimeService, kubeDeps.RemoteImageService, - stats.NewLogMetricsService(), - kubecontainer.RealOS{}) + hostStatsProvider) } klet.pleg = pleg.NewGenericPLEG(klet.containerRuntime, plegChannelCapacity, plegRelistPeriod, klet.podCache, clock.RealClock{}) klet.runtimeState = newRuntimeState(maxWaitForContainerRuntime) klet.runtimeState.addHealthCheck("PLEG", klet.pleg.Healthy) if _, err := klet.updatePodCIDR(kubeCfg.PodCIDR); err != nil { - klog.Errorf("Pod CIDR update failed %v", err) + klog.ErrorS(err, "Pod CIDR update failed") } // setup containerGC @@ -710,6 +733,7 @@ func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration, klet.probeManager = prober.NewManager( klet.statusManager, klet.livenessManager, + klet.readinessManager, klet.startupManager, klet.runner, kubeDeps.Recorder) @@ -762,23 +786,20 @@ func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration, klet.backOff = flowcontrol.NewBackOff(backOffPeriod, MaxContainerBackOff) klet.podKiller = NewPodKiller(klet) - etcHostsPathFunc := func(podUID types.UID) string { return getEtcHostsPath(klet.getPodDir(podUID)) } // setup eviction manager - evictionManager, evictionAdmitHandler := eviction.NewManager(klet.resourceAnalyzer, evictionConfig, killPodNow(klet.podWorkers, kubeDeps.Recorder), klet.podManager.GetMirrorPodByPod, klet.imageManager, klet.containerGC, kubeDeps.Recorder, nodeRef, klet.clock, etcHostsPathFunc) + evictionManager, evictionAdmitHandler := eviction.NewManager(klet.resourceAnalyzer, evictionConfig, killPodNow(klet.podWorkers, kubeDeps.Recorder), klet.podManager.GetMirrorPodByPod, klet.imageManager, klet.containerGC, kubeDeps.Recorder, nodeRef, klet.clock) klet.evictionManager = evictionManager klet.admitHandlers.AddPodAdmitHandler(evictionAdmitHandler) - if utilfeature.DefaultFeatureGate.Enabled(features.Sysctls) { - // Safe, whitelisted sysctls can always be used as unsafe sysctls in the spec. - // Hence, we concatenate those two lists. - safeAndUnsafeSysctls := append(sysctlwhitelist.SafeSysctlWhitelist(), allowedUnsafeSysctls...) - sysctlsWhitelist, err := sysctl.NewWhitelist(safeAndUnsafeSysctls) - if err != nil { - return nil, err - } - klet.admitHandlers.AddPodAdmitHandler(sysctlsWhitelist) + // Safe, whitelisted sysctls can always be used as unsafe sysctls in the spec. + // Hence, we concatenate those two lists. + safeAndUnsafeSysctls := append(sysctlwhitelist.SafeSysctlWhitelist(), allowedUnsafeSysctls...) + sysctlsWhitelist, err := sysctl.NewWhitelist(safeAndUnsafeSysctls) + if err != nil { + return nil, err } + klet.admitHandlers.AddPodAdmitHandler(sysctlsWhitelist) // enable active deadline handler activeDeadlineHandler, err := newActiveDeadlineHandler(klet.statusManager, kubeDeps.Recorder, klet.clock) @@ -817,7 +838,11 @@ func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration, v1.NamespaceNodeLease, util.SetNodeOwnerFunc(klet.heartbeatClient, string(klet.nodeName))) - klet.shutdownManager = nodeshutdown.NewManager(klet.GetActivePods, killPodNow(klet.podWorkers, kubeDeps.Recorder), kubeCfg.ShutdownGracePeriod.Duration, kubeCfg.ShutdownGracePeriodCriticalPods.Duration) + // setup node shutdown manager + shutdownManager, shutdownAdmitHandler := nodeshutdown.NewManager(klet.GetActivePods, killPodNow(klet.podWorkers, kubeDeps.Recorder), klet.syncNodeStatus, kubeCfg.ShutdownGracePeriod.Duration, kubeCfg.ShutdownGracePeriodCriticalPods.Duration) + + klet.shutdownManager = shutdownManager + klet.admitHandlers.AddPodAdmitHandler(shutdownAdmitHandler) // Finally, put the most recent version of the config on the Kubelet, so // people can see how it was configured. @@ -917,8 +942,9 @@ type Kubelet struct { // Handles container probing. probeManager prober.Manager // Manages container health check results. - livenessManager proberesults.Manager - startupManager proberesults.Manager + livenessManager proberesults.Manager + readinessManager proberesults.Manager + startupManager proberesults.Manager // How long to keep idle streaming command execution/port forwarding // connections open before terminating them @@ -1246,11 +1272,11 @@ func (kl *Kubelet) setupDataDirs() error { if selinux.SELinuxEnabled() { err := selinux.SetFileLabel(pluginRegistrationDir, config.KubeletPluginsDirSELinuxLabel) if err != nil { - klog.Warningf("Unprivileged containerized plugins might not work. Could not set selinux context on %s: %v", pluginRegistrationDir, err) + klog.InfoS("Unprivileged containerized plugins might not work, could not set selinux context on plugin registration dir", "path", pluginRegistrationDir, "err", err) } err = selinux.SetFileLabel(pluginsDir, config.KubeletPluginsDirSELinuxLabel) if err != nil { - klog.Warningf("Unprivileged containerized plugins might not work. Could not set selinux context on %s: %v", pluginsDir, err) + klog.InfoS("Unprivileged containerized plugins might not work, could not set selinux context on plugins dir", "path", pluginsDir, "err", err) } } return nil @@ -1261,7 +1287,7 @@ func (kl *Kubelet) StartGarbageCollection() { loggedContainerGCFailure := false go wait.Until(func() { if err := kl.containerGC.GarbageCollect(); err != nil { - klog.Errorf("Container garbage collection failed: %v", err) + klog.ErrorS(err, "Container garbage collection failed") kl.recorder.Eventf(kl.nodeRef, v1.EventTypeWarning, events.ContainerGCFailed, err.Error()) loggedContainerGCFailure = true } else { @@ -1271,13 +1297,13 @@ func (kl *Kubelet) StartGarbageCollection() { loggedContainerGCFailure = false } - klog.V(vLevel).Infof("Container garbage collection succeeded") + klog.V(vLevel).InfoS("Container garbage collection succeeded") } }, ContainerGCPeriod, wait.NeverStop) // when the high threshold is set to 100, stub the image GC manager if kl.kubeletConfiguration.ImageGCHighThresholdPercent == 100 { - klog.V(2).Infof("ImageGCHighThresholdPercent is set 100, Disable image GC") + klog.V(2).InfoS("ImageGCHighThresholdPercent is set 100, Disable image GC") return } @@ -1285,11 +1311,11 @@ func (kl *Kubelet) StartGarbageCollection() { go wait.Until(func() { if err := kl.imageManager.GarbageCollect(); err != nil { if prevImageGCFailed { - klog.Errorf("Image garbage collection failed multiple times in a row: %v", err) + klog.ErrorS(err, "Image garbage collection failed multiple times in a row") // Only create an event for repeated failures kl.recorder.Eventf(kl.nodeRef, v1.EventTypeWarning, events.ImageGCFailed, err.Error()) } else { - klog.Errorf("Image garbage collection failed once. Stats initialization may not have completed yet: %v", err) + klog.ErrorS(err, "Image garbage collection failed once. Stats initialization may not have completed yet") } prevImageGCFailed = true } else { @@ -1299,7 +1325,7 @@ func (kl *Kubelet) StartGarbageCollection() { prevImageGCFailed = false } - klog.V(vLevel).Infof("Image garbage collection succeeded") + klog.V(vLevel).InfoS("Image garbage collection succeeded") } }, ImageGCPeriod, wait.NeverStop) } @@ -1350,7 +1376,8 @@ func (kl *Kubelet) initializeModules() error { func (kl *Kubelet) initializeRuntimeDependentModules() { if err := kl.cadvisor.Start(); err != nil { // Fail kubelet and rely on the babysitter to retry starting kubelet. - klog.Fatalf("Failed to start cAdvisor %v", err) + klog.ErrorS(err, "Failed to start cAdvisor") + os.Exit(1) } // trigger on-demand stats collection once so that we have capacity information for ephemeral storage. @@ -1360,12 +1387,14 @@ func (kl *Kubelet) initializeRuntimeDependentModules() { node, err := kl.getNodeAnyWay() if err != nil { // Fail kubelet and rely on the babysitter to retry starting kubelet. - klog.Fatalf("Kubelet failed to get node info: %v", err) + klog.ErrorS(err, "Kubelet failed to get node info") + os.Exit(1) } // containerManager must start after cAdvisor because it needs filesystem capacity information if err := kl.containerManager.Start(node, kl.GetActivePods, kl.sourcesReady, kl.statusManager, kl.runtimeService); err != nil { // Fail kubelet and rely on the babysitter to retry starting kubelet. - klog.Fatalf("Failed to start ContainerManager %v", err) + klog.ErrorS(err, "Failed to start ContainerManager") + os.Exit(1) } // eviction manager must start after cadvisor because it needs to know if the container runtime has a dedicated imagefs kl.evictionManager.Start(kl.StatsProvider, kl.GetActivePods, kl.podResourcesAreReclaimed, evictionMonitoringPeriod) @@ -1378,13 +1407,13 @@ func (kl *Kubelet) initializeRuntimeDependentModules() { // Adding Registration Callback function for Device Manager kl.pluginManager.AddHandler(pluginwatcherapi.DevicePlugin, kl.containerManager.GetPluginRegistrationHandler()) // Start the plugin manager - klog.V(4).Infof("starting plugin manager") + klog.V(4).InfoS("Starting plugin manager") go kl.pluginManager.Run(kl.sourcesReady, wait.NeverStop) err = kl.shutdownManager.Start() if err != nil { // The shutdown manager is not critical for kubelet, so log failure, but don't block Kubelet startup if there was a failure starting it. - klog.Errorf("Failed to start node shutdown manager: %v", err) + klog.ErrorS(err, "Failed to start node shutdown manager") } } @@ -1401,7 +1430,7 @@ func (kl *Kubelet) Run(updates <-chan kubetypes.PodUpdate) { })) } if kl.kubeClient == nil { - klog.Warning("No api server defined - no node status update will be sent.") + klog.InfoS("No API server defined - no node status update will be sent") } // Start the cloud provider sync manager @@ -1411,7 +1440,8 @@ func (kl *Kubelet) Run(updates <-chan kubetypes.PodUpdate) { if err := kl.initializeModules(); err != nil { kl.recorder.Eventf(kl.nodeRef, v1.EventTypeWarning, events.KubeletSetupFailed, err.Error()) - klog.Fatal(err) + klog.ErrorS(err, "failed to intialize internal modules") + os.Exit(1) } // Start volume manager @@ -1438,7 +1468,6 @@ func (kl *Kubelet) Run(updates <-chan kubetypes.PodUpdate) { // Start component sync loops. kl.statusManager.Start() - kl.probeManager.Start() // Start syncing RuntimeClasses if enabled. if kl.runtimeClassManager != nil { @@ -1526,7 +1555,9 @@ func (kl *Kubelet) syncPod(o syncPodOptions) error { // since kubelet first saw the pod if firstSeenTime is set. metrics.PodWorkerStartDuration.Observe(metrics.SinceInSeconds(firstSeenTime)) } else { - klog.V(3).Infof("First seen time not recorded for pod %q", pod.UID) + klog.V(3).InfoS("First seen time not recorded for pod", + "podUID", pod.UID, + "pod", klog.KObj(pod)) } } @@ -1621,7 +1652,7 @@ func (kl *Kubelet) syncPod(o syncPodOptions) error { if err := kl.killPod(pod, nil, podStatus, nil); err == nil { podKilled = true } else { - klog.Errorf("killPod for pod %q (podStatus=%v) failed: %v", format.Pod(pod), podStatus, err) + klog.ErrorS(err, "killPod failed", "pod", klog.KObj(pod), "podStatus", podStatus) } } // Create and Update pod's Cgroups @@ -1634,7 +1665,7 @@ func (kl *Kubelet) syncPod(o syncPodOptions) error { if !(podKilled && pod.Spec.RestartPolicy == v1.RestartPolicyNever) { if !pcm.Exists(pod) { if err := kl.containerManager.UpdateQOSCgroups(); err != nil { - klog.V(2).Infof("Failed to update QoS cgroups while syncing pod: %v", err) + klog.V(2).InfoS("Failed to update QoS cgroups while syncing pod", "pod", klog.KObj(pod), "err", err) } if err := pcm.EnsureExists(pod); err != nil { kl.recorder.Eventf(pod, v1.EventTypeWarning, events.FailedToCreatePodContainer, "unable to ensure pod container exists: %v", err) @@ -1651,24 +1682,24 @@ func (kl *Kubelet) syncPod(o syncPodOptions) error { if mirrorPod.DeletionTimestamp != nil || !kl.podManager.IsMirrorPodOf(mirrorPod, pod) { // The mirror pod is semantically different from the static pod. Remove // it. The mirror pod will get recreated later. - klog.Infof("Trying to delete pod %s %v", podFullName, mirrorPod.ObjectMeta.UID) + klog.InfoS("Trying to delete pod", "pod", klog.KObj(pod), "podUID", mirrorPod.ObjectMeta.UID) var err error deleted, err = kl.podManager.DeleteMirrorPod(podFullName, &mirrorPod.ObjectMeta.UID) if deleted { - klog.Warningf("Deleted mirror pod %q because it is outdated", format.Pod(mirrorPod)) + klog.InfoS("Deleted mirror pod because it is outdated", "pod", klog.KObj(mirrorPod)) } else if err != nil { - klog.Errorf("Failed deleting mirror pod %q: %v", format.Pod(mirrorPod), err) + klog.ErrorS(err, "Failed deleting mirror pod", "pod", klog.KObj(mirrorPod)) } } } if mirrorPod == nil || deleted { node, err := kl.GetNode() if err != nil || node.DeletionTimestamp != nil { - klog.V(4).Infof("No need to create a mirror pod, since node %q has been removed from the cluster", kl.nodeName) + klog.V(4).InfoS("No need to create a mirror pod, since node has been removed from the cluster", "node", klog.KRef("", string(kl.nodeName))) } else { - klog.V(4).Infof("Creating a mirror pod for static pod %q", format.Pod(pod)) + klog.V(4).InfoS("Creating a mirror pod for static pod", "pod", klog.KObj(pod)) if err := kl.podManager.CreateMirrorPod(pod); err != nil { - klog.Errorf("Failed creating a mirror pod for %q: %v", format.Pod(pod), err) + klog.ErrorS(err, "Failed creating a mirror pod for", "pod", klog.KObj(pod)) } } } @@ -1677,7 +1708,7 @@ func (kl *Kubelet) syncPod(o syncPodOptions) error { // Make data directories for the pod if err := kl.makePodDataDirs(pod); err != nil { kl.recorder.Eventf(pod, v1.EventTypeWarning, events.FailedToMakePodDataDirectories, "error making pod data directories: %v", err) - klog.Errorf("Unable to make pod data directories for pod %q: %v", format.Pod(pod), err) + klog.ErrorS(err, "Unable to make pod data directories for pod", "pod", klog.KObj(pod)) return err } @@ -1686,7 +1717,7 @@ func (kl *Kubelet) syncPod(o syncPodOptions) error { // Wait for volumes to attach/mount if err := kl.volumeManager.WaitForAttachAndMount(pod); err != nil { kl.recorder.Eventf(pod, v1.EventTypeWarning, events.FailedMountVolume, "Unable to attach or mount volumes: %v", err) - klog.Errorf("Unable to attach or mount volumes for pod %q: %v; skipping pod", format.Pod(pod), err) + klog.ErrorS(err, "Unable to attach or mount volumes for pod; skipping pod", "pod", klog.KObj(pod)) return err } } @@ -1831,7 +1862,7 @@ func (kl *Kubelet) canRunPod(pod *v1.Pod) lifecycle.PodAdmitResult { // no changes are seen to the configuration, will synchronize the last known desired // state every sync-frequency seconds. Never returns. func (kl *Kubelet) syncLoop(updates <-chan kubetypes.PodUpdate, handler SyncHandler) { - klog.Info("Starting kubelet main sync loop.") + klog.InfoS("Starting kubelet main sync loop") // The syncTicker wakes up kubelet to checks if there are any pod workers // that need to be sync'd. A one-second period is sufficient because the // sync interval is defaulted to 10s. @@ -1855,7 +1886,7 @@ func (kl *Kubelet) syncLoop(updates <-chan kubetypes.PodUpdate, handler SyncHand for { if err := kl.runtimeState.runtimeErrors(); err != nil { - klog.Errorf("skipping pod synchronization - %v", err) + klog.ErrorS(err, "Skipping pod synchronization") // exponential backoff time.Sleep(duration) duration = time.Duration(math.Min(float64(max), factor*float64(duration))) @@ -1902,8 +1933,8 @@ func (kl *Kubelet) syncLoop(updates <-chan kubetypes.PodUpdate, handler SyncHand // * plegCh: update the runtime cache; sync pod // * syncCh: sync all pods waiting for sync // * housekeepingCh: trigger cleanup of pods -// * liveness manager: sync pods that have failed or in which one or more -// containers have failed liveness checks +// * health manager: sync pods that have failed or in which one or more +// containers have failed health checks func (kl *Kubelet) syncLoopIteration(configCh <-chan kubetypes.PodUpdate, handler SyncHandler, syncCh <-chan time.Time, housekeepingCh <-chan time.Time, plegCh <-chan *pleg.PodLifecycleEvent) bool { select { @@ -1911,36 +1942,36 @@ func (kl *Kubelet) syncLoopIteration(configCh <-chan kubetypes.PodUpdate, handle // Update from a config source; dispatch it to the right handler // callback. if !open { - klog.Errorf("Update channel is closed. Exiting the sync loop.") + klog.ErrorS(nil, "Update channel is closed, exiting the sync loop") return false } switch u.Op { case kubetypes.ADD: - klog.V(2).Infof("SyncLoop (ADD, %q): %q", u.Source, format.Pods(u.Pods)) + klog.V(2).InfoS("SyncLoop ADD", "source", u.Source, "pods", format.Pods(u.Pods)) // After restarting, kubelet will get all existing pods through // ADD as if they are new pods. These pods will then go through the // admission process and *may* be rejected. This can be resolved // once we have checkpointing. handler.HandlePodAdditions(u.Pods) case kubetypes.UPDATE: - klog.V(2).Infof("SyncLoop (UPDATE, %q): %q", u.Source, format.PodsWithDeletionTimestamps(u.Pods)) + klog.V(2).InfoS("SyncLoop UPDATE", "source", u.Source, "pods", format.Pods(u.Pods)) handler.HandlePodUpdates(u.Pods) case kubetypes.REMOVE: - klog.V(2).Infof("SyncLoop (REMOVE, %q): %q", u.Source, format.Pods(u.Pods)) + klog.V(2).InfoS("SyncLoop REMOVE", "source", u.Source, "pods", format.Pods(u.Pods)) handler.HandlePodRemoves(u.Pods) case kubetypes.RECONCILE: - klog.V(4).Infof("SyncLoop (RECONCILE, %q): %q", u.Source, format.Pods(u.Pods)) + klog.V(4).InfoS("SyncLoop RECONCILE", "source", u.Source, "pods", format.Pods(u.Pods)) handler.HandlePodReconcile(u.Pods) case kubetypes.DELETE: - klog.V(2).Infof("SyncLoop (DELETE, %q): %q", u.Source, format.Pods(u.Pods)) + klog.V(2).InfoS("SyncLoop DELETE", "source", u.Source, "pods", format.Pods(u.Pods)) // DELETE is treated as a UPDATE because of graceful deletion. handler.HandlePodUpdates(u.Pods) case kubetypes.SET: // TODO: Do we want to support this? - klog.Errorf("Kubelet does not support snapshot update") + klog.ErrorS(nil, "Kubelet does not support snapshot update") default: - klog.Errorf("Invalid event type received: %d.", u.Op) + klog.ErrorS(nil, "Invalid operation type received", "operation", u.Op) } kl.sourcesReady.AddSource(u.Source) @@ -1955,11 +1986,11 @@ func (kl *Kubelet) syncLoopIteration(configCh <-chan kubetypes.PodUpdate, handle if isSyncPodWorthy(e) { // PLEG event for a pod; sync it. if pod, ok := kl.podManager.GetPodByUID(e.ID); ok { - klog.V(2).Infof("SyncLoop (PLEG): %q, event: %#v", format.Pod(pod), e) + klog.V(2).InfoS("SyncLoop (PLEG): event for pod", "pod", klog.KObj(pod), "event", e) handler.HandlePodSyncs([]*v1.Pod{pod}) } else { // If the pod no longer exists, ignore the event. - klog.V(4).Infof("SyncLoop (PLEG): ignore irrelevant event: %#v", e) + klog.V(4).InfoS("SyncLoop (PLEG): pod does not exist, ignore irrelevant event", "event", e) } } @@ -1974,52 +2005,62 @@ func (kl *Kubelet) syncLoopIteration(configCh <-chan kubetypes.PodUpdate, handle if len(podsToSync) == 0 { break } - klog.V(4).Infof("SyncLoop (SYNC): %d pods; %s", len(podsToSync), format.Pods(podsToSync)) + klog.V(4).InfoS("SyncLoop (SYNC) pods", "total", len(podsToSync), "pods", format.Pods(podsToSync)) handler.HandlePodSyncs(podsToSync) case update := <-kl.livenessManager.Updates(): if update.Result == proberesults.Failure { - // The liveness manager detected a failure; sync the pod. - - // We should not use the pod from livenessManager, because it is never updated after - // initialization. - pod, ok := kl.podManager.GetPodByUID(update.PodUID) - if !ok { - // If the pod no longer exists, ignore the update. - klog.V(4).Infof("SyncLoop (container unhealthy): ignore irrelevant update: %#v", update) - break - } - klog.V(1).Infof("SyncLoop (container unhealthy): %q", format.Pod(pod)) - handler.HandlePodSyncs([]*v1.Pod{pod}) + handleProbeSync(kl, update, handler, "liveness", "unhealthy") } + case update := <-kl.readinessManager.Updates(): + ready := update.Result == proberesults.Success + kl.statusManager.SetContainerReadiness(update.PodUID, update.ContainerID, ready) + handleProbeSync(kl, update, handler, "readiness", map[bool]string{true: "ready", false: ""}[ready]) + case update := <-kl.startupManager.Updates(): + started := update.Result == proberesults.Success + kl.statusManager.SetContainerStartup(update.PodUID, update.ContainerID, started) + handleProbeSync(kl, update, handler, "startup", map[bool]string{true: "started", false: "unhealthy"}[started]) case <-housekeepingCh: if !kl.sourcesReady.AllReady() { // If the sources aren't ready or volume manager has not yet synced the states, // skip housekeeping, as we may accidentally delete pods from unready sources. - klog.V(4).Infof("SyncLoop (housekeeping, skipped): sources aren't ready yet.") + klog.V(4).InfoS("SyncLoop (housekeeping, skipped): sources aren't ready yet") } else { - klog.V(4).Infof("SyncLoop (housekeeping)") + klog.V(4).InfoS("SyncLoop (housekeeping)") if err := handler.HandlePodCleanups(); err != nil { - klog.Errorf("Failed cleaning pods: %v", err) + klog.ErrorS(err, "Failed cleaning pods") } } } return true } +func handleProbeSync(kl *Kubelet, update proberesults.Update, handler SyncHandler, probe, status string) { + // We should not use the pod from manager, because it is never updated after initialization. + pod, ok := kl.podManager.GetPodByUID(update.PodUID) + if !ok { + // If the pod no longer exists, ignore the update. + klog.V(4).InfoS("SyncLoop (probe): ignore irrelevant update", "probe", probe, "status", status, "update", update) + return + } + klog.V(1).InfoS("SyncLoop (probe)", "probe", probe, "status", status, "pod", klog.KObj(pod)) + handler.HandlePodSyncs([]*v1.Pod{pod}) +} + // dispatchWork starts the asynchronous sync of the pod in a pod worker. // If the pod has completed termination, dispatchWork will perform no action. func (kl *Kubelet) dispatchWork(pod *v1.Pod, syncType kubetypes.SyncPodType, mirrorPod *v1.Pod, start time.Time) { // check whether we are ready to delete the pod from the API server (all status up to date) containersTerminal, podWorkerTerminal := kl.podAndContainersAreTerminal(pod) if pod.DeletionTimestamp != nil && containersTerminal { - klog.V(4).Infof("Pod %q has completed execution and should be deleted from the API server: %s", format.Pod(pod), syncType) + klog.V(4).InfoS("Pod has completed execution and should be deleted from the API server", "pod", klog.KObj(pod), "syncType", syncType) kl.statusManager.TerminatePod(pod) return } // optimization: avoid invoking the pod worker if no further changes are possible to the pod definition - if podWorkerTerminal { - klog.V(4).Infof("Pod %q has completed, ignoring remaining sync work: %s", format.Pod(pod), syncType) + // (i.e. the pod has completed and its containers have been terminated) + if podWorkerTerminal && containersTerminal { + klog.V(4).InfoS("Pod has completed and its containers have been terminated, ignoring remaining sync work", "pod", klog.KObj(pod), "syncType", syncType) return } @@ -2116,7 +2157,7 @@ func (kl *Kubelet) HandlePodRemoves(pods []*v1.Pod) { // Deletion is allowed to fail because the periodic cleanup routine // will trigger deletion again. if err := kl.deletePod(pod); err != nil { - klog.V(2).Infof("Failed to delete pod %q, err: %v", format.Pod(pod), err) + klog.V(2).InfoS("Failed to delete pod", "pod", klog.KObj(pod), "err", err) } kl.probeManager.RemovePod(pod) } @@ -2175,19 +2216,19 @@ func (kl *Kubelet) updateRuntimeUp() { s, err := kl.containerRuntime.Status() if err != nil { - klog.Errorf("Container runtime sanity check failed: %v", err) + klog.ErrorS(err, "Container runtime sanity check failed") return } if s == nil { - klog.Errorf("Container runtime status is nil") + klog.ErrorS(nil, "Container runtime status is nil") return } // Periodically log the whole runtime status for debugging. - klog.V(4).Infof("Container runtime status: %v", s) + klog.V(4).InfoS("Container runtime status", "status", s) networkReady := s.GetRuntimeCondition(kubecontainer.NetworkReady) if networkReady == nil || !networkReady.Status { - klog.Errorf("Container runtime network not ready: %v", networkReady) - kl.runtimeState.setNetworkState(fmt.Errorf("runtime network not ready: %v", networkReady)) + klog.ErrorS(nil, "Container runtime network not ready", "networkReady", networkReady) + kl.runtimeState.setNetworkState(fmt.Errorf("container runtime network not ready: %v", networkReady)) } else { // Set nil if the container runtime network is ready. kl.runtimeState.setNetworkState(nil) @@ -2196,9 +2237,8 @@ func (kl *Kubelet) updateRuntimeUp() { runtimeReady := s.GetRuntimeCondition(kubecontainer.RuntimeReady) // If RuntimeReady is not set or is false, report an error. if runtimeReady == nil || !runtimeReady.Status { - err := fmt.Errorf("Container runtime not ready: %v", runtimeReady) - klog.Error(err) - kl.runtimeState.setRuntimeState(err) + klog.ErrorS(nil, "Container runtime not ready", "runtimeReady", runtimeReady) + kl.runtimeState.setRuntimeState(fmt.Errorf("container runtime not ready: %v", runtimeReady)) return } kl.runtimeState.setRuntimeState(nil) @@ -2223,20 +2263,21 @@ func (kl *Kubelet) ResyncInterval() time.Duration { } // ListenAndServe runs the kubelet HTTP server. -func (kl *Kubelet) ListenAndServe(address net.IP, port uint, tlsOptions *server.TLSOptions, auth server.AuthInterface, enableCAdvisorJSONEndpoints, enableDebuggingHandlers, enableContentionProfiling, enableSystemLogHandler bool) { - server.ListenAndServeKubeletServer(kl, kl.resourceAnalyzer, address, port, tlsOptions, auth, enableCAdvisorJSONEndpoints, enableDebuggingHandlers, enableContentionProfiling, enableSystemLogHandler) +func (kl *Kubelet) ListenAndServe(kubeCfg *kubeletconfiginternal.KubeletConfiguration, tlsOptions *server.TLSOptions, + auth server.AuthInterface) { + server.ListenAndServeKubeletServer(kl, kl.resourceAnalyzer, kubeCfg, tlsOptions, auth) } // ListenAndServeReadOnly runs the kubelet HTTP server in read-only mode. -func (kl *Kubelet) ListenAndServeReadOnly(address net.IP, port uint, enableCAdvisorJSONEndpoints bool) { - server.ListenAndServeKubeletReadOnlyServer(kl, kl.resourceAnalyzer, address, port, enableCAdvisorJSONEndpoints) +func (kl *Kubelet) ListenAndServeReadOnly(address net.IP, port uint) { + server.ListenAndServeKubeletReadOnlyServer(kl, kl.resourceAnalyzer, address, port) } // ListenAndServePodResources runs the kubelet podresources grpc service func (kl *Kubelet) ListenAndServePodResources() { socket, err := util.LocalEndpoint(kl.getPodResourcesDir(), podresources.Socket) if err != nil { - klog.V(2).Infof("Failed to get local endpoint for PodResources endpoint: %v", err) + klog.V(2).InfoS("Failed to get local endpoint for PodResources endpoint", "err", err) return } server.ListenAndServePodResources(socket, kl.podManager, kl.containerManager, kl.containerManager) @@ -2266,13 +2307,13 @@ func (kl *Kubelet) fastStatusUpdateOnce() { time.Sleep(100 * time.Millisecond) node, err := kl.GetNode() if err != nil { - klog.Errorf(err.Error()) + klog.ErrorS(err, "Error getting node") continue } if len(node.Spec.PodCIDRs) != 0 { podCIDRs := strings.Join(node.Spec.PodCIDRs, ",") if _, err := kl.updatePodCIDR(podCIDRs); err != nil { - klog.Errorf("Pod CIDR update to %v failed %v", podCIDRs, err) + klog.ErrorS(err, "Pod CIDR update failed", "CIDR", podCIDRs) continue } kl.updateRuntimeUp() diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_dockershim.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_dockershim.go index b5de50cba3b5..522625bba228 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_dockershim.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_dockershim.go @@ -58,10 +58,9 @@ func runDockershim(kubeCfg *kubeletconfiginternal.KubeletConfiguration, } // The unix socket for kubelet <-> dockershim communication, dockershim start before runtime service init. - klog.V(5).Infof("RemoteRuntimeEndpoint: %q, RemoteImageEndpoint: %q", - remoteRuntimeEndpoint, - remoteImageEndpoint) - klog.V(2).Infof("Starting the GRPC server for the docker CRI shim.") + klog.V(5).InfoS("Using remote runtime endpoint and image endpoint", "runtimeEndpoint", remoteRuntimeEndpoint, "imageEndpoint", remoteImageEndpoint) + klog.V(2).InfoS("Starting the GRPC server for the docker CRI shim.") + dockerServer := dockerremote.NewDockerServer(remoteRuntimeEndpoint, ds) if err := dockerServer.Start(); err != nil { return err diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_getters.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_getters.go index e8e2146d7444..453895f20090 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_getters.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_getters.go @@ -308,13 +308,13 @@ func (kl *Kubelet) getPodVolumePathListFromDisk(podUID types.UID) ([]string, err if pathExists, pathErr := mount.PathExists(podVolDir); pathErr != nil { return volumes, fmt.Errorf("error checking if path %q exists: %v", podVolDir, pathErr) } else if !pathExists { - klog.Warningf("Path %q does not exist", podVolDir) + klog.InfoS("Path does not exist", "path", podVolDir) return volumes, nil } volumePluginDirs, err := ioutil.ReadDir(podVolDir) if err != nil { - klog.Errorf("Could not read directory %s: %v", podVolDir, err) + klog.ErrorS(err, "Could not read directory", "path", podVolDir) return volumes, err } for _, volumePluginDir := range volumePluginDirs { @@ -368,17 +368,46 @@ func (kl *Kubelet) getMountedVolumePathListFromDisk(podUID types.UID) ([]string, return mountedVolumes, nil } -// podVolumesSubpathsDirExists returns true if the pod volume-subpaths directory for -// a given pod exists -func (kl *Kubelet) podVolumeSubpathsDirExists(podUID types.UID) (bool, error) { - podVolDir := kl.getPodVolumeSubpathsDir(podUID) +// getPodVolumeSubpathListFromDisk returns a list of the volume-subpath paths by reading the +// subpath directories for the given pod from the disk. +func (kl *Kubelet) getPodVolumeSubpathListFromDisk(podUID types.UID) ([]string, error) { + volumes := []string{} + podSubpathsDir := kl.getPodVolumeSubpathsDir(podUID) - if pathExists, pathErr := mount.PathExists(podVolDir); pathErr != nil { - return true, fmt.Errorf("error checking if path %q exists: %v", podVolDir, pathErr) + if pathExists, pathErr := mount.PathExists(podSubpathsDir); pathErr != nil { + return nil, fmt.Errorf("error checking if path %q exists: %v", podSubpathsDir, pathErr) } else if !pathExists { - return false, nil + return volumes, nil } - return true, nil + + // Explicitly walks /// + volumePluginDirs, err := ioutil.ReadDir(podSubpathsDir) + if err != nil { + klog.ErrorS(err, "Could not read directory", "path", podSubpathsDir) + return volumes, err + } + for _, volumePluginDir := range volumePluginDirs { + volumePluginName := volumePluginDir.Name() + volumePluginPath := filepath.Join(podSubpathsDir, volumePluginName) + containerDirs, err := ioutil.ReadDir(volumePluginPath) + if err != nil { + return volumes, fmt.Errorf("could not read directory %s: %v", volumePluginPath, err) + } + for _, containerDir := range containerDirs { + containerName := containerDir.Name() + containerPath := filepath.Join(volumePluginPath, containerName) + // Switch to ReadDirNoStat at the subPathIndex level to prevent issues with stat'ing + // mount points that may not be responsive + subPaths, err := utilpath.ReadDirNoStat(containerPath) + if err != nil { + return volumes, fmt.Errorf("could not read directory %s: %v", containerPath, err) + } + for _, subPathDir := range subPaths { + volumes = append(volumes, filepath.Join(containerPath, subPathDir)) + } + } + } + return volumes, nil } // GetRequestedContainersInfo returns container info. diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_network.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_network.go index de4c8174f6d0..ae030a48dbb6 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_network.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_network.go @@ -73,8 +73,7 @@ func (kl *Kubelet) updatePodCIDR(cidr string) (bool, error) { // But it is better to be on the safe side to still return true here. return true, fmt.Errorf("failed to update pod CIDR: %v", err) } - - klog.Infof("Setting Pod CIDR: %v -> %v", podCIDR, cidr) + klog.InfoS("Updating Pod CIDR", "originalPodCIDR", podCIDR, "newPodCIDR", cidr) kl.runtimeState.setPodCIDR(cidr) return true, nil } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_network_linux.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_network_linux.go index 72ab2a927bc5..421112cb9cf8 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_network_linux.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_network_linux.go @@ -53,7 +53,7 @@ func (kl *Kubelet) initNetworkUtil() { for i := range iptClients { iptClient := iptClients[i] if kl.syncNetworkUtil(iptClient) { - klog.Infof("Initialized %s iptables rules.", protocols[i]) + klog.InfoS("Initialized protocol iptables rules.", "protocol", protocols[i]) go iptClient.Monitor( utiliptables.Chain("KUBE-KUBELET-CANARY"), []utiliptables.Table{utiliptables.TableMangle, utiliptables.TableNAT, utiliptables.TableFilter}, @@ -61,7 +61,7 @@ func (kl *Kubelet) initNetworkUtil() { 1*time.Minute, wait.NeverStop, ) } else { - klog.Warningf("Failed to initialize %s iptables rules; some functionality may be missing.", protocols[i]) + klog.InfoS("Failed to initialize protocol iptables rules; some functionality may be missing.", "protocol", protocols[i]) } } } @@ -76,22 +76,22 @@ func (kl *Kubelet) syncNetworkUtil(iptClient utiliptables.Interface) bool { // Setup KUBE-MARK-DROP rules dropMark := getIPTablesMark(kl.iptablesDropBit) if _, err := iptClient.EnsureChain(utiliptables.TableNAT, KubeMarkDropChain); err != nil { - klog.Errorf("Failed to ensure that %s chain %s exists: %v", utiliptables.TableNAT, KubeMarkDropChain, err) + klog.ErrorS(err, "Failed to ensure that nat chain exists KUBE-MARK-DROP chain") return false } if _, err := iptClient.EnsureRule(utiliptables.Append, utiliptables.TableNAT, KubeMarkDropChain, "-j", "MARK", "--or-mark", dropMark); err != nil { - klog.Errorf("Failed to ensure marking rule for %v: %v", KubeMarkDropChain, err) + klog.ErrorS(err, "Failed to ensure marking rule for KUBE-MARK-DROP chain") return false } if _, err := iptClient.EnsureChain(utiliptables.TableFilter, KubeFirewallChain); err != nil { - klog.Errorf("Failed to ensure that %s chain %s exists: %v", utiliptables.TableFilter, KubeFirewallChain, err) + klog.ErrorS(err, "Failed to ensure that filter table exists KUBE-FIREWALL chain") return false } if _, err := iptClient.EnsureRule(utiliptables.Append, utiliptables.TableFilter, KubeFirewallChain, "-m", "comment", "--comment", "kubernetes firewall for dropping marked packets", "-m", "mark", "--mark", fmt.Sprintf("%s/%s", dropMark, dropMark), "-j", "DROP"); err != nil { - klog.Errorf("Failed to ensure rule to drop packet marked by %v in %v chain %v: %v", KubeMarkDropChain, utiliptables.TableFilter, KubeFirewallChain, err) + klog.ErrorS(err, "Failed to ensure rule to drop packet marked by the KUBE-MARK-DROP in KUBE-FIREWALL chain") return false } @@ -105,37 +105,37 @@ func (kl *Kubelet) syncNetworkUtil(iptClient utiliptables.Interface) bool { "-m", "conntrack", "!", "--ctstate", "RELATED,ESTABLISHED,DNAT", "-j", "DROP"); err != nil { - klog.Errorf("Failed to ensure rule to drop invalid localhost packets in %v chain %v: %v", utiliptables.TableFilter, KubeFirewallChain, err) + klog.ErrorS(err, "Failed to ensure rule to drop invalid localhost packets in filter table KUBE-FIREWALL chain") return false } } if _, err := iptClient.EnsureRule(utiliptables.Prepend, utiliptables.TableFilter, utiliptables.ChainOutput, "-j", string(KubeFirewallChain)); err != nil { - klog.Errorf("Failed to ensure that %s chain %s jumps to %s: %v", utiliptables.TableFilter, utiliptables.ChainOutput, KubeFirewallChain, err) + klog.ErrorS(err, "Failed to ensure that filter table from OUTPUT chain jumps to KUBE-FIREWALL chain") return false } if _, err := iptClient.EnsureRule(utiliptables.Prepend, utiliptables.TableFilter, utiliptables.ChainInput, "-j", string(KubeFirewallChain)); err != nil { - klog.Errorf("Failed to ensure that %s chain %s jumps to %s: %v", utiliptables.TableFilter, utiliptables.ChainInput, KubeFirewallChain, err) + klog.ErrorS(err, "Failed to ensure that filter table INPUT chain jumps to KUBE-FIREWALL chain") return false } // Setup KUBE-MARK-MASQ rules masqueradeMark := getIPTablesMark(kl.iptablesMasqueradeBit) if _, err := iptClient.EnsureChain(utiliptables.TableNAT, KubeMarkMasqChain); err != nil { - klog.Errorf("Failed to ensure that %s chain %s exists: %v", utiliptables.TableNAT, KubeMarkMasqChain, err) + klog.ErrorS(err, "Failed to ensure that nat table exists KUBE-MARK-MASQ chain") return false } if _, err := iptClient.EnsureChain(utiliptables.TableNAT, KubePostroutingChain); err != nil { - klog.Errorf("Failed to ensure that %s chain %s exists: %v", utiliptables.TableNAT, KubePostroutingChain, err) + klog.ErrorS(err, "Failed to ensure that nat table exists kube POSTROUTING chain") return false } if _, err := iptClient.EnsureRule(utiliptables.Append, utiliptables.TableNAT, KubeMarkMasqChain, "-j", "MARK", "--or-mark", masqueradeMark); err != nil { - klog.Errorf("Failed to ensure marking rule for %v: %v", KubeMarkMasqChain, err) + klog.ErrorS(err, "Failed to ensure marking rule for KUBE-MARK-MASQ chain") return false } if _, err := iptClient.EnsureRule(utiliptables.Prepend, utiliptables.TableNAT, utiliptables.ChainPostrouting, "-m", "comment", "--comment", "kubernetes postrouting rules", "-j", string(KubePostroutingChain)); err != nil { - klog.Errorf("Failed to ensure that %s chain %s jumps to %s: %v", utiliptables.TableNAT, utiliptables.ChainPostrouting, KubePostroutingChain, err) + klog.ErrorS(err, "Failed to ensure that nat table from POSTROUTING chain jumps to KUBE-POSTROUTING chain") return false } @@ -145,7 +145,7 @@ func (kl *Kubelet) syncNetworkUtil(iptClient utiliptables.Interface) bool { if _, err := iptClient.EnsureRule(utiliptables.Append, utiliptables.TableNAT, KubePostroutingChain, "-m", "mark", "!", "--mark", fmt.Sprintf("%s/%s", masqueradeMark, masqueradeMark), "-j", "RETURN"); err != nil { - klog.Errorf("Failed to ensure filtering rule for %v: %v", KubePostroutingChain, err) + klog.ErrorS(err, "Failed to ensure filtering rule for KUBE-POSTROUTING chain") return false } // Clear the mark to avoid re-masquerading if the packet re-traverses the network stack. @@ -153,7 +153,7 @@ func (kl *Kubelet) syncNetworkUtil(iptClient utiliptables.Interface) bool { // to Sprintf another bitmask). if _, err := iptClient.EnsureRule(utiliptables.Append, utiliptables.TableNAT, KubePostroutingChain, "-j", "MARK", "--xor-mark", masqueradeMark); err != nil { - klog.Errorf("Failed to ensure unmarking rule for %v: %v", KubePostroutingChain, err) + klog.ErrorS(err, "Failed to ensure unmarking rule for KUBE-POSTROUTING chain") return false } masqRule := []string{ @@ -164,7 +164,7 @@ func (kl *Kubelet) syncNetworkUtil(iptClient utiliptables.Interface) bool { masqRule = append(masqRule, "--random-fully") } if _, err := iptClient.EnsureRule(utiliptables.Append, utiliptables.TableNAT, KubePostroutingChain, masqRule...); err != nil { - klog.Errorf("Failed to ensure SNAT rule for packets marked by %v in %v chain %v: %v", KubeMarkMasqChain, utiliptables.TableNAT, KubePostroutingChain, err) + klog.ErrorS(err, "Failed to ensure SNAT rule for packets marked by KUBE-MARK-MASQ chain in nat table KUBE-POSTROUTING chain") return false } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_node_status.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_node_status.go index 0e48875a5d34..3b3fe8849aba 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_node_status.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_node_status.go @@ -35,10 +35,12 @@ import ( cloudprovider "k8s.io/cloud-provider" cloudproviderapi "k8s.io/cloud-provider/api" "k8s.io/klog/v2" + kubeletapis "k8s.io/kubelet/pkg/apis" k8s_api_v1 "k8s.io/kubernetes/pkg/apis/core/v1" v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper" - kubeletapis "k8s.io/kubernetes/pkg/kubelet/apis" + "k8s.io/kubernetes/pkg/kubelet/cadvisor" "k8s.io/kubernetes/pkg/kubelet/events" + "k8s.io/kubernetes/pkg/kubelet/managed" "k8s.io/kubernetes/pkg/kubelet/nodestatus" "k8s.io/kubernetes/pkg/kubelet/util" nodeutil "k8s.io/kubernetes/pkg/util/node" @@ -64,14 +66,14 @@ func (kl *Kubelet) registerWithAPIServer() { node, err := kl.initialNode(context.TODO()) if err != nil { - klog.Errorf("Unable to construct v1.Node object for kubelet: %v", err) + klog.ErrorS(err, "Unable to construct v1.Node object for kubelet") continue } - klog.Infof("Attempting to register node %s", node.Name) + klog.InfoS("Attempting to register node", "node", klog.KObj(node)) registered := kl.tryRegisterWithAPIServer(node) if registered { - klog.Infof("Successfully registered node %s", node.Name) + klog.InfoS("Successfully registered node", "node", klog.KObj(node)) kl.registrationCompleted = true return } @@ -90,23 +92,23 @@ func (kl *Kubelet) tryRegisterWithAPIServer(node *v1.Node) bool { } if !apierrors.IsAlreadyExists(err) { - klog.Errorf("Unable to register node %q with API server: %v", kl.nodeName, err) + klog.ErrorS(err, "Unable to register node with API server", "node", klog.KObj(node)) return false } existingNode, err := kl.kubeClient.CoreV1().Nodes().Get(context.TODO(), string(kl.nodeName), metav1.GetOptions{}) if err != nil { - klog.Errorf("Unable to register node %q with API server: error getting existing node: %v", kl.nodeName, err) + klog.ErrorS(err, "Unable to register node with API server, error getting existing node", "node", klog.KObj(node)) return false } if existingNode == nil { - klog.Errorf("Unable to register node %q with API server: no node instance returned", kl.nodeName) + klog.InfoS("Unable to register node with API server, no node instance returned", "node", klog.KObj(node)) return false } originalNode := existingNode.DeepCopy() - klog.Infof("Node %s was previously registered", kl.nodeName) + klog.InfoS("Node was previously registered", "node", klog.KObj(node)) // Edge case: the node was previously registered; reconcile // the value of the controller-managed attach-detach @@ -115,9 +117,12 @@ func (kl *Kubelet) tryRegisterWithAPIServer(node *v1.Node) bool { requiresUpdate = kl.updateDefaultLabels(node, existingNode) || requiresUpdate requiresUpdate = kl.reconcileExtendedResource(node, existingNode) || requiresUpdate requiresUpdate = kl.reconcileHugePageResource(node, existingNode) || requiresUpdate + if managed.IsEnabled() { + requiresUpdate = kl.addManagementNodeCapacity(node, existingNode) || requiresUpdate + } if requiresUpdate { if _, _, err := nodeutil.PatchNodeStatus(kl.kubeClient.CoreV1(), types.NodeName(kl.nodeName), originalNode, existingNode); err != nil { - klog.Errorf("Unable to reconcile node %q with API server: error updating node: %v", kl.nodeName, err) + klog.ErrorS(err, "Unable to reconcile node with API server,error updating node", "node", klog.KObj(node)) return false } } @@ -125,6 +130,25 @@ func (kl *Kubelet) tryRegisterWithAPIServer(node *v1.Node) bool { return true } +// addManagementNodeCapacity adds the managednode capacity to the node +func (kl *Kubelet) addManagementNodeCapacity(initialNode, existingNode *v1.Node) bool { + updateDefaultResources(initialNode, existingNode) + machineInfo, err := kl.cadvisor.MachineInfo() + if err != nil { + klog.Errorf("Unable to calculate managed node capacity for %q: %v", kl.nodeName, err) + return false + } + cpuRequest := cadvisor.CapacityFromMachineInfo(machineInfo)[v1.ResourceCPU] + cpuRequestInMilli := cpuRequest.MilliValue() + newCPURequest := resource.NewMilliQuantity(cpuRequestInMilli*1000, cpuRequest.Format) + managedResourceName := managed.GenerateResourceName("management") + if existingCapacity, ok := existingNode.Status.Capacity[managedResourceName]; ok && existingCapacity.Equal(*newCPURequest) { + return false + } + existingNode.Status.Capacity[managedResourceName] = *newCPURequest + return true +} + // reconcileHugePageResource will update huge page capacity for each page size and remove huge page sizes no longer supported func (kl *Kubelet) reconcileHugePageResource(initialNode, existingNode *v1.Node) bool { requiresUpdate := updateDefaultResources(initialNode, existingNode) @@ -165,7 +189,7 @@ func (kl *Kubelet) reconcileHugePageResource(initialNode, existingNode *v1.Node) if !supportedHugePageResources.Has(string(resourceName)) { delete(existingNode.Status.Capacity, resourceName) delete(existingNode.Status.Allocatable, resourceName) - klog.Infof("Removing now unsupported huge page resource named: %s", resourceName) + klog.InfoS("Removing huge page resource which is no longer supported", "resourceName", resourceName) requiresUpdate = true } } @@ -179,7 +203,7 @@ func (kl *Kubelet) reconcileExtendedResource(initialNode, node *v1.Node) bool { if kl.containerManager.ShouldResetExtendedResourceCapacity() { for k := range node.Status.Capacity { if v1helper.IsExtendedResourceName(k) { - klog.Infof("Zero out resource %s capacity in existing node.", k) + klog.InfoS("Zero out resource capacity in existing node", "resourceName", k, "node", klog.KObj(node)) node.Status.Capacity[k] = *resource.NewQuantity(int64(0), resource.DecimalSI) node.Status.Allocatable[k] = *resource.NewQuantity(int64(0), resource.DecimalSI) requiresUpdate = true @@ -269,10 +293,10 @@ func (kl *Kubelet) reconcileCMADAnnotationWithExistingNode(node, existingNode *v // not have the same value, update the existing node with // the correct value of the annotation. if !newSet { - klog.Info("Controller attach-detach setting changed to false; updating existing Node") + klog.InfoS("Controller attach-detach setting changed to false; updating existing Node") delete(existingNode.Annotations, volutil.ControllerManagedAttachAnnotation) } else { - klog.Info("Controller attach-detach setting changed to true; updating existing Node") + klog.InfoS("Controller attach-detach setting changed to true; updating existing Node") if existingNode.Annotations == nil { existingNode.Annotations = make(map[string]string) } @@ -359,24 +383,24 @@ func (kl *Kubelet) initialNode(ctx context.Context) (*v1.Node, error) { node.Annotations = make(map[string]string) } - klog.V(2).Infof("Setting node annotation to enable volume controller attach/detach") + klog.V(2).InfoS("Setting node annotation to enable volume controller attach/detach") node.Annotations[volutil.ControllerManagedAttachAnnotation] = "true" } else { - klog.V(2).Infof("Controller attach/detach is disabled for this node; Kubelet will attach and detach volumes") + klog.V(2).InfoS("Controller attach/detach is disabled for this node; Kubelet will attach and detach volumes") } if kl.keepTerminatedPodVolumes { if node.Annotations == nil { node.Annotations = make(map[string]string) } - klog.V(2).Infof("Setting node annotation to keep pod volumes of terminated pods attached to the node") + klog.V(2).InfoS("Setting node annotation to keep pod volumes of terminated pods attached to the node") node.Annotations[volutil.KeepTerminatedPodVolumesAnnotation] = "true" } // @question: should this be place after the call to the cloud provider? which also applies labels for k, v := range kl.nodeLabels { if cv, found := node.ObjectMeta.Labels[k]; found { - klog.Warningf("the node label %s=%s will overwrite default setting %s", k, v, cv) + klog.InfoS("the node label will overwrite default setting", "labelKey", k, "labelValue", v, "default", cv) } node.ObjectMeta.Labels[k] = v } @@ -407,9 +431,9 @@ func (kl *Kubelet) initialNode(ctx context.Context) (*v1.Node, error) { return nil, err } if instanceType != "" { - klog.Infof("Adding node label from cloud provider: %s=%s", v1.LabelInstanceType, instanceType) + klog.InfoS("Adding label from cloud provider", "labelKey", v1.LabelInstanceType, "labelValue", instanceType) node.ObjectMeta.Labels[v1.LabelInstanceType] = instanceType - klog.Infof("Adding node label from cloud provider: %s=%s", v1.LabelInstanceTypeStable, instanceType) + klog.InfoS("Adding node label from cloud provider", "labelKey", v1.LabelInstanceTypeStable, "labelValue", instanceType) node.ObjectMeta.Labels[v1.LabelInstanceTypeStable] = instanceType } // If the cloud has zone information, label the node with the zone information @@ -420,19 +444,22 @@ func (kl *Kubelet) initialNode(ctx context.Context) (*v1.Node, error) { return nil, fmt.Errorf("failed to get zone from cloud provider: %v", err) } if zone.FailureDomain != "" { - klog.Infof("Adding node label from cloud provider: %s=%s", v1.LabelFailureDomainBetaZone, zone.FailureDomain) + klog.InfoS("Adding node label from cloud provider", "labelKey", v1.LabelFailureDomainBetaZone, "labelValue", zone.FailureDomain) node.ObjectMeta.Labels[v1.LabelFailureDomainBetaZone] = zone.FailureDomain - klog.Infof("Adding node label from cloud provider: %s=%s", v1.LabelTopologyZone, zone.FailureDomain) + klog.InfoS("Adding node label from cloud provider", "labelKey", v1.LabelTopologyZone, "labelValue", zone.FailureDomain) node.ObjectMeta.Labels[v1.LabelTopologyZone] = zone.FailureDomain } if zone.Region != "" { - klog.Infof("Adding node label from cloud provider: %s=%s", v1.LabelFailureDomainBetaRegion, zone.Region) + klog.InfoS("Adding node label from cloud provider", "labelKey", v1.LabelFailureDomainBetaRegion, "labelValue", zone.Region) node.ObjectMeta.Labels[v1.LabelFailureDomainBetaRegion] = zone.Region - klog.Infof("Adding node label from cloud provider: %s=%s", v1.LabelTopologyRegion, zone.Region) + klog.InfoS("Adding node label from cloud provider", "labelKey", v1.LabelTopologyRegion, "labelValue", zone.Region) node.ObjectMeta.Labels[v1.LabelTopologyRegion] = zone.Region } } } + if managed.IsEnabled() { + kl.addManagementNodeCapacity(node, node) + } kl.setNodeStatus(node) @@ -454,20 +481,20 @@ func (kl *Kubelet) syncNodeStatus() { kl.registerWithAPIServer() } if err := kl.updateNodeStatus(); err != nil { - klog.Errorf("Unable to update node status: %v", err) + klog.ErrorS(err, "Unable to update node status") } } // updateNodeStatus updates node status to master with retries if there is any // change or enough time passed from the last sync. func (kl *Kubelet) updateNodeStatus() error { - klog.V(5).Infof("Updating node status") + klog.V(5).InfoS("Updating node status") for i := 0; i < nodeStatusUpdateRetry; i++ { if err := kl.tryUpdateNodeStatus(i); err != nil { if i > 0 && kl.onRepeatedHeartbeatFailure != nil { kl.onRepeatedHeartbeatFailure() } - klog.Errorf("Error updating node status, will retry: %v", err) + klog.ErrorS(err, "Error updating node status, will retry") } else { return nil } @@ -505,7 +532,7 @@ func (kl *Kubelet) tryUpdateNodeStatus(tryNumber int) error { // actually changed. podCIDRs := strings.Join(node.Spec.PodCIDRs, ",") if podCIDRChanged, err = kl.updatePodCIDR(podCIDRs); err != nil { - klog.Errorf(err.Error()) + klog.ErrorS(err, "Error updating pod CIDR") } } @@ -551,7 +578,7 @@ func (kl *Kubelet) tryUpdateNodeStatus(tryNumber int) error { // recordNodeStatusEvent records an event of the given type with the given // message for the node. func (kl *Kubelet) recordNodeStatusEvent(eventType, event string) { - klog.V(2).Infof("Recording %s event message for node %s", event, kl.nodeName) + klog.V(2).InfoS("Recording event message for node", "node", klog.KRef("", string(kl.nodeName)), "event", event) kl.recorder.Eventf(kl.nodeRef, eventType, event, "Node %s status is now: %s", kl.nodeName, event) } @@ -581,9 +608,9 @@ func (kl *Kubelet) recordNodeSchedulableEvent(node *v1.Node) error { // refactor the node status condition code out to a different file. func (kl *Kubelet) setNodeStatus(node *v1.Node) { for i, f := range kl.setNodeStatusFuncs { - klog.V(5).Infof("Setting node status at position %v", i) + klog.V(5).InfoS("Setting node status condition code", "position", i, "node", klog.KObj(node)) if err := f(node); err != nil { - klog.Errorf("Failed to set some node status fields: %s", err) + klog.ErrorS(err, "Failed to set some node status fields", "node", klog.KObj(node)) } } } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_pods.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_pods.go index fbd70f3cbd88..b610b47ff7fd 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_pods.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_pods.go @@ -59,13 +59,13 @@ import ( "k8s.io/kubernetes/pkg/kubelet/status" kubetypes "k8s.io/kubernetes/pkg/kubelet/types" "k8s.io/kubernetes/pkg/kubelet/util" - "k8s.io/kubernetes/pkg/kubelet/util/format" volumeutil "k8s.io/kubernetes/pkg/volume/util" "k8s.io/kubernetes/pkg/volume/util/hostutil" "k8s.io/kubernetes/pkg/volume/util/subpath" "k8s.io/kubernetes/pkg/volume/util/volumepathhandler" volumevalidation "k8s.io/kubernetes/pkg/volume/validation" "k8s.io/kubernetes/third_party/forked/golang/expansion" + utilnet "k8s.io/utils/net" ) const ( @@ -78,6 +78,12 @@ const ( podKillingChannelCapacity = 50 ) +// Container state reason list +const ( + PodInitializing = "PodInitializing" + ContainerCreating = "ContainerCreating" +) + // Get a list of pods that have data directories. func (kl *Kubelet) listPodsFromDisk() ([]types.UID, error) { podInfos, err := ioutil.ReadDir(kl.getPodsDir()) @@ -111,7 +117,7 @@ func (kl *Kubelet) makeBlockVolumes(pod *v1.Pod, container *v1.Container, podVol } vol, ok := podVolumes[device.Name] if !ok || vol.BlockVolumeMapper == nil { - klog.Errorf("Block volume cannot be satisfied for container %q, because the volume is missing or the volume mapper is nil: %+v", container.Name, device) + klog.ErrorS(nil, "Block volume cannot be satisfied for container, because the volume is missing or the volume mapper is nil", "containerName", container.Name, "device", device) return nil, fmt.Errorf("cannot find volume %q to pass into container %q", device.Name, container.Name) } // Get a symbolic link associated to a block device under pod device path @@ -125,7 +131,7 @@ func (kl *Kubelet) makeBlockVolumes(pod *v1.Pod, container *v1.Container, podVol if vol.ReadOnly { permission = "r" } - klog.V(4).Infof("Device will be attached to container %q. Path on host: %v", container.Name, symlinkPath) + klog.V(4).InfoS("Device will be attached to container in the corresponding path on host", "containerName", container.Name, "path", symlinkPath) devices = append(devices, kubecontainer.DeviceInfo{PathOnHost: symlinkPath, PathInContainer: device.DevicePath, Permissions: permission}) } } @@ -134,15 +140,16 @@ func (kl *Kubelet) makeBlockVolumes(pod *v1.Pod, container *v1.Container, podVol } // makeMounts determines the mount points for the given container. -func makeMounts(pod *v1.Pod, podDir string, container *v1.Container, hostName, hostDomain string, podIPs []string, podVolumes kubecontainer.VolumeMap, hu hostutil.HostUtils, subpather subpath.Interface, expandEnvs []kubecontainer.EnvVar) ([]kubecontainer.Mount, func(), error) { +func makeMounts(pod *v1.Pod, podDir string, container *v1.Container, hostName, hostDomain string, podIPs []string, podVolumes kubecontainer.VolumeMap, hu hostutil.HostUtils, subpather subpath.Interface, expandEnvs []kubecontainer.EnvVar, supportsSingleFileMapping bool) ([]kubecontainer.Mount, func(), error) { // Kubernetes only mounts on /etc/hosts if: // - container is not an infrastructure (pause) container // - container is not already mounting on /etc/hosts // - OS is not Windows + // - if it is Windows, ContainerD is used. // Kubernetes will not mount /etc/hosts if: // - when the Pod sandbox is being created, its IP is still unknown. Hence, PodIP will not have been set. - mountEtcHostsFile := len(podIPs) > 0 && runtime.GOOS != "windows" - klog.V(3).Infof("container: %v/%v/%v podIPs: %q creating hosts mount: %v", pod.Namespace, pod.Name, container.Name, podIPs, mountEtcHostsFile) + mountEtcHostsFile := len(podIPs) > 0 && supportsSingleFileMapping + klog.V(3).InfoS("Creating hosts mount for container", "pod", klog.KObj(pod), "containerName", container.Name, "podIPs", podIPs, "path", mountEtcHostsFile) mounts := []kubecontainer.Mount{} var cleanupAction func() for i, mount := range container.VolumeMounts { @@ -150,7 +157,8 @@ func makeMounts(pod *v1.Pod, podDir string, container *v1.Container, hostName, h mountEtcHostsFile = mountEtcHostsFile && (mount.MountPath != etcHostsPath) vol, ok := podVolumes[mount.Name] if !ok || vol.Mounter == nil { - klog.Errorf("Mount cannot be satisfied for container %q, because the volume is missing or the volume mounter is nil: %+v", container.Name, mount) + klog.ErrorS(nil, "Mount cannot be satisfied for the container, because the volume is missing or the volume mounter (vol.Mounter) is nil", + "containerName", container.Name, "ok", ok, "volumeMounter", mount) return nil, cleanupAction, fmt.Errorf("cannot find volume %q to mount into container %q", mount.Name, container.Name) } @@ -198,7 +206,7 @@ func makeMounts(pod *v1.Pod, podDir string, container *v1.Container, hostName, h hostPath = filepath.Join(volumePath, subPath) if subPathExists, err := hu.PathExists(hostPath); err != nil { - klog.Errorf("Could not determine if subPath %s exists; will not attempt to change its permissions", hostPath) + klog.ErrorS(nil, "Could not determine if subPath exists, will not attempt to change its permissions", "path", hostPath) } else if !subPathExists { // Create the sub path now because if it's auto-created later when referenced, it may have an // incorrect ownership and mode. For example, the sub path directory must have at least g+rwx @@ -211,7 +219,7 @@ func makeMounts(pod *v1.Pod, podDir string, container *v1.Container, hostName, h } if err := subpather.SafeMakeDir(subPath, volumePath, perm); err != nil { // Don't pass detailed error back to the user because it could give information about host filesystem - klog.Errorf("failed to create subPath directory for volumeMount %q of container %q: %v", mount.Name, container.Name, err) + klog.ErrorS(err, "Failed to create subPath directory for volumeMount of the container", "containerName", container.Name, "volumeMountName", mount.Name) return nil, cleanupAction, fmt.Errorf("failed to create subPath directory for volumeMount %q of container %q", mount.Name, container.Name) } } @@ -225,7 +233,7 @@ func makeMounts(pod *v1.Pod, podDir string, container *v1.Container, hostName, h }) if err != nil { // Don't pass detailed error back to the user because it could give information about host filesystem - klog.Errorf("failed to prepare subPath for volumeMount %q of container %q: %v", mount.Name, container.Name, err) + klog.ErrorS(err, "Failed to prepare subPath for volumeMount of the container", "containerName", container.Name, "volumeMountName", mount.Name) return nil, cleanupAction, fmt.Errorf("failed to prepare subPath for volumeMount %q of container %q", mount.Name, container.Name) } } @@ -245,8 +253,7 @@ func makeMounts(pod *v1.Pod, podDir string, container *v1.Container, hostName, h if err != nil { return nil, cleanupAction, err } - klog.V(5).Infof("Pod %q container %q mount %q has propagation %q", format.Pod(pod), container.Name, mount.Name, propagation) - + klog.V(5).InfoS("Mount has propagation", "pod", klog.KObj(pod), "containerName", container.Name, "volumeMountName", mount.Name, "propagation", propagation) mustMountRO := vol.Mounter.GetAttributes().ReadOnly mounts = append(mounts, kubecontainer.Mount{ @@ -295,7 +302,9 @@ func translateMountPropagation(mountMode *v1.MountPropagationMode) (runtimeapi.M // getEtcHostsPath returns the full host-side path to a pod's generated /etc/hosts file func getEtcHostsPath(podDir string) string { - return path.Join(podDir, "etc-hosts") + hostsFilePath := path.Join(podDir, "etc-hosts") + // Volume Mounts fail on Windows if it is not of the form C:/ + return volumeutil.MakeAbsolutePath(runtime.GOOS, hostsFilePath) } // makeHostsMount makes the mountpoint for the hosts file that the containers @@ -400,7 +409,7 @@ func truncatePodHostnameIfNeeded(podName, hostname string) (string, error) { return hostname, nil } truncated := hostname[:hostnameMaxLen] - klog.Errorf("hostname for pod:%q was longer than %d. Truncated hostname to :%q", podName, hostnameMaxLen, truncated) + klog.ErrorS(nil, "Hostname for pod was too long, truncated it", "podName", podName, "hostnameMaxLen", hostnameMaxLen, "truncatedHostname", truncated) // hostname should not end with '-' or '.' truncated = strings.TrimRight(truncated, "-.") if len(truncated) == 0 { @@ -481,8 +490,10 @@ func (kl *Kubelet) GenerateRunContainerOptions(pod *v1.Pod, container *v1.Contai } opts.Envs = append(opts.Envs, envs...) + // we can only mount individual files (e.g.: /etc/hosts, termination-log files) on Windows only if we're using Containerd. + supportsSingleFileMapping := kl.containerRuntime.SupportsSingleFileMapping() // only podIPs is sent to makeMounts, as podIPs is populated even if dual-stack feature flag is not enabled. - mounts, cleanupAction, err := makeMounts(pod, kl.getPodDir(pod.UID), container, hostname, hostDomainName, podIPs, volumes, kl.hostutil, kl.subpather, opts.Envs) + mounts, cleanupAction, err := makeMounts(pod, kl.getPodDir(pod.UID), container, hostname, hostDomainName, podIPs, volumes, kl.hostutil, kl.subpather, opts.Envs, supportsSingleFileMapping) if err != nil { return nil, cleanupAction, err } @@ -490,11 +501,10 @@ func (kl *Kubelet) GenerateRunContainerOptions(pod *v1.Pod, container *v1.Contai // adding TerminationMessagePath on Windows is only allowed if ContainerD is used. Individual files cannot // be mounted as volumes using Docker for Windows. - supportsSingleFileMapping := kl.containerRuntime.SupportsSingleFileMapping() if len(container.TerminationMessagePath) != 0 && supportsSingleFileMapping { p := kl.getPodContainerDir(pod.UID, container.Name) if err := os.MkdirAll(p, 0750); err != nil { - klog.Errorf("Error on creating %q: %v", p, err) + klog.ErrorS(err, "Error on creating dir", "path", p) } else { opts.PodContainerDir = p } @@ -849,7 +859,7 @@ func (kl *Kubelet) killPod(pod *v1.Pod, runningPod *kubecontainer.Pod, status *k return err } if err := kl.containerManager.UpdateQOSCgroups(); err != nil { - klog.V(2).Infof("Failed to update QoS cgroups while killing pod: %v", err) + klog.V(2).InfoS("Failed to update QoS cgroups while killing pod", "err", err) } return nil } @@ -875,9 +885,14 @@ func (kl *Kubelet) getPullSecretsForPod(pod *v1.Pod) []v1.Secret { pullSecrets := []v1.Secret{} for _, secretRef := range pod.Spec.ImagePullSecrets { + if len(secretRef.Name) == 0 { + // API validation permitted entries with empty names (http://issue.k8s.io/99454#issuecomment-787838112). + // Ignore to avoid unnecessary warnings. + continue + } secret, err := kl.secretManager.GetSecret(pod.Namespace, secretRef.Name) if err != nil { - klog.Warningf("Unable to retrieve pull secret %s/%s for %s/%s due to %v. The image pull may not succeed.", pod.Namespace, secretRef.Name, pod.Namespace, pod.Name, err) + klog.InfoS("Unable to retrieve pull secret, the image pull may not succeed.", "pod", klog.KObj(pod), "secret", klog.KObj(secret), "err", err) continue } @@ -949,13 +964,13 @@ func (kl *Kubelet) IsPodDeleted(uid types.UID) bool { func (kl *Kubelet) PodResourcesAreReclaimed(pod *v1.Pod, status v1.PodStatus) bool { if !notRunning(status.ContainerStatuses) { // We shouldn't delete pods that still have running containers - klog.V(3).Infof("Pod %q is terminated, but some containers are still running", format.Pod(pod)) + klog.V(3).InfoS("Pod is terminated, but some containers are still running", "pod", klog.KObj(pod)) return false } // pod's containers should be deleted runtimeStatus, err := kl.podCache.Get(pod.UID) if err != nil { - klog.V(3).Infof("Pod %q is terminated, Error getting runtimeStatus from the podCache: %s", format.Pod(pod), err) + klog.V(3).InfoS("Pod is terminated, Error getting runtimeStatus from the podCache", "pod", klog.KObj(pod), "err", err) return false } if len(runtimeStatus.ContainerStatuses) > 0 { @@ -963,18 +978,18 @@ func (kl *Kubelet) PodResourcesAreReclaimed(pod *v1.Pod, status v1.PodStatus) bo for _, status := range runtimeStatus.ContainerStatuses { statusStr += fmt.Sprintf("%+v ", *status) } - klog.V(3).Infof("Pod %q is terminated, but some containers have not been cleaned up: %s", format.Pod(pod), statusStr) + klog.V(3).InfoS("Pod is terminated, but some containers have not been cleaned up", "pod", klog.KObj(pod), "status", statusStr) return false } if kl.podVolumesExist(pod.UID) && !kl.keepTerminatedPodVolumes { // We shouldn't delete pods whose volumes have not been cleaned up if we are not keeping terminated pod volumes - klog.V(3).Infof("Pod %q is terminated, but some volumes have not been cleaned up", format.Pod(pod)) + klog.V(3).InfoS("Pod is terminated, but some volumes have not been cleaned up", "pod", klog.KObj(pod)) return false } if kl.kubeletConfiguration.CgroupsPerQOS { pcm := kl.containerManager.NewPodContainerManager() if pcm.Exists(pod) { - klog.V(3).Infof("Pod %q is terminated, but pod cgroup sandbox has not been cleaned up", format.Pod(pod)) + klog.V(3).InfoS("Pod is terminated, but pod cgroup sandbox has not been cleaned up", "pod", klog.KObj(pod)) return false } } @@ -1036,9 +1051,9 @@ func (kl *Kubelet) deleteOrphanedMirrorPods() { if !kl.podKiller.IsPodPendingTerminationByPodName(podFullname) { _, err := kl.podManager.DeleteMirrorPod(podFullname, nil) if err != nil { - klog.Errorf("encountered error when deleting mirror pod %q : %v", podFullname, err) + klog.ErrorS(err, "Encountered error when deleting mirror pod", "podName", podFullname) } else { - klog.V(3).Infof("deleted pod %q", podFullname) + klog.V(3).InfoS("Deleted pod", "podName", podFullname) } } } @@ -1089,7 +1104,7 @@ func (kl *Kubelet) HandlePodCleanups() error { runningPods, err := kl.runtimeCache.GetPods() if err != nil { - klog.Errorf("Error listing containers: %#v", err) + klog.ErrorS(err, "Error listing containers") return err } for _, pod := range runningPods { @@ -1105,7 +1120,7 @@ func (kl *Kubelet) HandlePodCleanups() error { // TODO: Evaluate the performance impact of bypassing the runtime cache. runningPods, err = kl.containerRuntime.GetPods(false) if err != nil { - klog.Errorf("Error listing containers: %#v", err) + klog.ErrorS(err, "Error listing containers") return err } @@ -1118,7 +1133,7 @@ func (kl *Kubelet) HandlePodCleanups() error { // We want all cleanup tasks to be run even if one of them failed. So // we just log an error here and continue other cleanup tasks. // This also applies to the other clean up tasks. - klog.Errorf("Failed cleaning up orphaned pod directories: %v", err) + klog.ErrorS(err, "Failed cleaning up orphaned pod directories") } // Remove any orphaned mirror pods. @@ -1137,7 +1152,7 @@ func (kl *Kubelet) HandlePodCleanups() error { // PodKiller handles requests for killing pods type PodKiller interface { // KillPod receives pod speficier representing the pod to kill - KillPod(pair *kubecontainer.PodPair) + KillPod(podPair *kubecontainer.PodPair) // PerformPodKillingWork performs the actual pod killing work via calling CRI // It returns after its Close() func is called and all outstanding pod killing requests are served PerformPodKillingWork() @@ -1208,17 +1223,16 @@ func (pk *podKillerWithChannel) IsPodPendingTerminationByPodName(podFullname str } func (pk *podKillerWithChannel) markPodTerminated(uid string) { - klog.V(4).Infof("marking pod termination %q", uid) + klog.V(4).InfoS("Marking pod termination", "podUID", uid) pk.podKillingLock.Lock() defer pk.podKillingLock.Unlock() delete(pk.mirrorPodTerminationMap, uid) delete(pk.podTerminationMap, uid) } -// checkAndMarkPodPendingTerminationByPod checks to see if the pod is being -// killed and returns true if it is, otherwise the pod is added to the map and -// returns false -func (pk *podKillerWithChannel) checkAndMarkPodPendingTerminationByPod(podPair *kubecontainer.PodPair) bool { +// KillPod sends pod killing request to the killer after marks the pod +// unless the given pod has been marked to be killed +func (pk *podKillerWithChannel) KillPod(podPair *kubecontainer.PodPair) { pk.podKillingLock.Lock() defer pk.podKillingLock.Unlock() var apiPodExists bool @@ -1228,7 +1242,7 @@ func (pk *podKillerWithChannel) checkAndMarkPodPendingTerminationByPod(podPair * _, apiPodExists = pk.mirrorPodTerminationMap[uid] if !apiPodExists { fullname := kubecontainer.GetPodFullName(podPair.APIPod) - klog.V(4).Infof("marking api pod pending termination %q : %q", uid, fullname) + klog.V(4).InfoS("Marking api pod pending termination", "podName", fullname, "podUID", uid) pk.mirrorPodTerminationMap[uid] = fullname } } @@ -1237,21 +1251,22 @@ func (pk *podKillerWithChannel) checkAndMarkPodPendingTerminationByPod(podPair * _, runningPodExists = pk.podTerminationMap[uid] if !runningPodExists { fullname := podPair.RunningPod.Name - klog.V(4).Infof("marking running pod pending termination %q: %q", uid, fullname) + klog.V(4).InfoS("Marking running pod pending termination", "podName", fullname, "podUID", uid) pk.podTerminationMap[uid] = fullname } } if apiPodExists || runningPodExists { if apiPodExists && runningPodExists { - klog.V(4).Infof("api pod %q and running pod %q is pending termination", podPair.APIPod.UID, podPair.RunningPod.ID) + klog.V(4).InfoS("Api pod and running pod are pending termination", "apiPodUID", podPair.APIPod.UID, "runningPodUID", podPair.RunningPod.ID) } else if apiPodExists { - klog.V(4).Infof("api pod %q is pending termination", podPair.APIPod.UID) + klog.V(4).InfoS("Api pod is pending termination", "podUID", podPair.APIPod.UID) } else { - klog.V(4).Infof("running pod %q is pending termination", podPair.RunningPod.ID) + klog.V(4).InfoS("Running pod is pending termination", "podUID", podPair.RunningPod.ID) } - return true + return } - return false + // Limit to one request per pod + pk.podKillingCh <- podPair } // Close closes the channel through which requests are delivered @@ -1259,28 +1274,18 @@ func (pk *podKillerWithChannel) Close() { close(pk.podKillingCh) } -// KillPod sends pod killing request to the killer -func (pk *podKillerWithChannel) KillPod(pair *kubecontainer.PodPair) { - pk.podKillingCh <- pair -} - // PerformPodKillingWork launches a goroutine to kill a pod received from the channel if // another goroutine isn't already in action. func (pk *podKillerWithChannel) PerformPodKillingWork() { for podPair := range pk.podKillingCh { - if pk.checkAndMarkPodPendingTerminationByPod(podPair) { - // Pod is already being killed - continue - } - runningPod := podPair.RunningPod apiPod := podPair.APIPod go func(apiPod *v1.Pod, runningPod *kubecontainer.Pod) { - klog.V(2).Infof("Killing unwanted pod %q", runningPod.Name) + klog.V(2).InfoS("Killing unwanted pod", "podName", runningPod.Name) err := pk.killPod(apiPod, runningPod, nil, nil) if err != nil { - klog.Errorf("Failed killing the pod %q: %v", runningPod.Name, err) + klog.ErrorS(err, "Failed killing the pod", "podName", runningPod.Name) } pk.markPodTerminated(string(runningPod.ID)) }(apiPod, runningPod) @@ -1477,7 +1482,7 @@ func getPhase(spec *v1.PodSpec, info []v1.ContainerStatus) v1.PodPhase { case pendingInitialization > 0: fallthrough case waiting > 0: - klog.V(5).Infof("pod waiting > 0, pending") + klog.V(5).InfoS("Pod waiting > 0, pending") // One or more containers has not been started return v1.PodPending case running > 0 && unknown == 0: @@ -1504,7 +1509,7 @@ func getPhase(spec *v1.PodSpec, info []v1.ContainerStatus) v1.PodPhase { // and in the process of restarting return v1.PodRunning default: - klog.V(5).Infof("pod default case, pending") + klog.V(5).InfoS("Pod default case, pending") return v1.PodPending } } @@ -1512,7 +1517,7 @@ func getPhase(spec *v1.PodSpec, info []v1.ContainerStatus) v1.PodPhase { // generateAPIPodStatus creates the final API pod status for a pod, given the // internal pod status. func (kl *Kubelet) generateAPIPodStatus(pod *v1.Pod, podStatus *kubecontainer.PodStatus) v1.PodStatus { - klog.V(3).Infof("Generating status for %q", format.Pod(pod)) + klog.V(3).InfoS("Generating pod status", "pod", klog.KObj(pod)) s := kl.convertStatusToAPIStatus(pod, podStatus) @@ -1534,7 +1539,7 @@ func (kl *Kubelet) generateAPIPodStatus(pod *v1.Pod, podStatus *kubecontainer.Po if pod.Status.Phase == v1.PodFailed || pod.Status.Phase == v1.PodSucceeded { // API server shows terminal phase; transitions are not allowed if s.Phase != pod.Status.Phase { - klog.Errorf("Pod attempted illegal phase transition from %s to %s: %v", pod.Status.Phase, s.Phase, s) + klog.ErrorS(nil, "Pod attempted illegal phase transition", "originalStatusPhase", pod.Status.Phase, "apiStatusPhase", s.Phase, "apiStatus", s) // Force back to phase from the API server s.Phase = pod.Status.Phase } @@ -1554,7 +1559,7 @@ func (kl *Kubelet) generateAPIPodStatus(pod *v1.Pod, podStatus *kubecontainer.Po if kl.kubeClient != nil { hostIPs, err := kl.getHostIPsAnyWay() if err != nil { - klog.V(4).Infof("Cannot get host IPs: %v", err) + klog.V(4).InfoS("Cannot get host IPs", "err", err) } else { s.HostIP = hostIPs[0].String() if kubecontainer.IsHostNetworkPod(pod) && s.PodIP == "" { @@ -1575,16 +1580,36 @@ func (kl *Kubelet) generateAPIPodStatus(pod *v1.Pod, podStatus *kubecontainer.Po // alter the kubelet state at all. func (kl *Kubelet) convertStatusToAPIStatus(pod *v1.Pod, podStatus *kubecontainer.PodStatus) *v1.PodStatus { var apiPodStatus v1.PodStatus - apiPodStatus.PodIPs = make([]v1.PodIP, 0, len(podStatus.IPs)) + + // The runtime pod status may have an arbitrary number of IPs, in an arbitrary + // order. Pick out the first returned IP of the same IP family as the node IP + // first, followed by the first IP of the opposite IP family (if any). + podIPs := make([]v1.PodIP, 0, len(podStatus.IPs)) + var validPrimaryIP, validSecondaryIP func(ip string) bool + if len(kl.nodeIPs) == 0 || utilnet.IsIPv4(kl.nodeIPs[0]) { + validPrimaryIP = utilnet.IsIPv4String + validSecondaryIP = utilnet.IsIPv6String + } else { + validPrimaryIP = utilnet.IsIPv6String + validSecondaryIP = utilnet.IsIPv4String + } for _, ip := range podStatus.IPs { - apiPodStatus.PodIPs = append(apiPodStatus.PodIPs, v1.PodIP{ - IP: ip, - }) + if validPrimaryIP(ip) { + podIPs = append(podIPs, v1.PodIP{IP: ip}) + break + } } - - if len(apiPodStatus.PodIPs) > 0 { - apiPodStatus.PodIP = apiPodStatus.PodIPs[0].IP + for _, ip := range podStatus.IPs { + if validSecondaryIP(ip) { + podIPs = append(podIPs, v1.PodIP{IP: ip}) + break + } + } + apiPodStatus.PodIPs = podIPs + if len(podIPs) > 0 { + apiPodStatus.PodIP = podIPs[0].IP } + // set status for Pods created on versions of kube older than 1.6 apiPodStatus.QOSClass = v1qos.GetPodQOS(pod) @@ -1703,9 +1728,9 @@ func (kl *Kubelet) convertToAPIContainerStatuses(pod *v1.Pod, podStatus *kubecon // Set all container statuses to default waiting state statuses := make(map[string]*v1.ContainerStatus, len(containers)) - defaultWaitingState := v1.ContainerState{Waiting: &v1.ContainerStateWaiting{Reason: "ContainerCreating"}} + defaultWaitingState := v1.ContainerState{Waiting: &v1.ContainerStateWaiting{Reason: ContainerCreating}} if hasInitContainers { - defaultWaitingState = v1.ContainerState{Waiting: &v1.ContainerStateWaiting{Reason: "PodInitializing"}} + defaultWaitingState = v1.ContainerState{Waiting: &v1.ContainerStateWaiting{Reason: PodInitializing}} } for _, container := range containers { @@ -1769,9 +1794,9 @@ func (kl *Kubelet) convertToAPIContainerStatuses(pod *v1.Pod, podStatus *kubecon status := statuses[container.Name] // if the status we're about to write indicates the default, the Waiting status will force this pod back into Pending. // That isn't true, we know the pod is going away. - isDefaultWaitingStatus := status.State.Waiting != nil && status.State.Waiting.Reason == "ContainerCreating" + isDefaultWaitingStatus := status.State.Waiting != nil && status.State.Waiting.Reason == ContainerCreating if hasInitContainers { - isDefaultWaitingStatus = status.State.Waiting != nil && status.State.Waiting.Reason == "PodInitializing" + isDefaultWaitingStatus = status.State.Waiting != nil && status.State.Waiting.Reason == PodInitializing } if !isDefaultWaitingStatus { // we the status was written, don't override @@ -1977,7 +2002,7 @@ func (kl *Kubelet) cleanupOrphanedPodCgroups(pcm cm.PodContainerManager, cgroupP // if the pod is within termination grace period, we shouldn't cleanup the underlying cgroup if kl.podKiller.IsPodPendingTerminationByUID(uid) { - klog.V(3).Infof("pod %q is pending termination", uid) + klog.V(3).InfoS("Pod is pending termination", "podUID", uid) continue } // If volumes have not been unmounted/detached, do not delete the cgroup @@ -1986,13 +2011,13 @@ func (kl *Kubelet) cleanupOrphanedPodCgroups(pcm cm.PodContainerManager, cgroupP // process in the cgroup to the minimum value while we wait. if the kubelet // is configured to keep terminated volumes, we will delete the cgroup and not block. if podVolumesExist := kl.podVolumesExist(uid); podVolumesExist && !kl.keepTerminatedPodVolumes { - klog.V(3).Infof("Orphaned pod %q found, but volumes not yet removed. Reducing cpu to minimum", uid) + klog.V(3).InfoS("Orphaned pod found, but volumes not yet removed. Reducing cpu to minimum", "podUID", uid) if err := pcm.ReduceCPULimits(val); err != nil { - klog.Warningf("Failed to reduce cpu time for pod %q pending volume cleanup due to %v", uid, err) + klog.InfoS("Failed to reduce cpu time for pod pending volume cleanup", "podUID", uid, "err", err) } continue } - klog.V(3).Infof("Orphaned pod %q found, removing pod cgroups", uid) + klog.V(3).InfoS("Orphaned pod found, removing pod cgroups", "podUID", uid) // Destroy all cgroups of pod that should not be running, // by first killing all the attached processes to these cgroups. // We ignore errors thrown by the method, as the housekeeping loop would @@ -2055,13 +2080,13 @@ func (kl *Kubelet) hasHostMountPVC(pod *v1.Pod) bool { if volume.PersistentVolumeClaim != nil { pvc, err := kl.kubeClient.CoreV1().PersistentVolumeClaims(pod.Namespace).Get(context.TODO(), volume.PersistentVolumeClaim.ClaimName, metav1.GetOptions{}) if err != nil { - klog.Warningf("unable to retrieve pvc %s:%s - %v", pod.Namespace, volume.PersistentVolumeClaim.ClaimName, err) + klog.InfoS("Unable to retrieve pvc", "pvc", klog.KRef(pod.Namespace, volume.PersistentVolumeClaim.ClaimName), "err", err) continue } if pvc != nil { referencedVolume, err := kl.kubeClient.CoreV1().PersistentVolumes().Get(context.TODO(), pvc.Spec.VolumeName, metav1.GetOptions{}) if err != nil { - klog.Warningf("unable to retrieve pv %s - %v", pvc.Spec.VolumeName, err) + klog.InfoS("Unable to retrieve pv", "pvName", pvc.Spec.VolumeName, "err", err) continue } if referencedVolume != nil && referencedVolume.Spec.HostPath != nil { diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_resources.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_resources.go index a453e015553d..0c737bb6bdff 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_resources.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_resources.go @@ -42,7 +42,7 @@ func (kl *Kubelet) defaultPodLimitsForDownwardAPI(pod *v1.Pod, container *v1.Con return nil, nil, fmt.Errorf("failed to find node object, expected a node") } allocatable := node.Status.Allocatable - klog.Infof("allocatable: %v", allocatable) + klog.InfoS("Allocatable", "allocatable", allocatable) outputPod := pod.DeepCopy() for idx := range outputPod.Spec.Containers { resource.MergeContainerResourceLimits(&outputPod.Spec.Containers[idx], allocatable) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_volumes.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_volumes.go index ac8e3e2baee9..e2b11841f617 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_volumes.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_volumes.go @@ -18,6 +18,7 @@ package kubelet import ( "fmt" + "syscall" v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" @@ -62,11 +63,11 @@ func (kl *Kubelet) podVolumesExist(podUID types.UID) bool { // There are some volume plugins such as flexvolume might not have mounts. See issue #61229 volumePaths, err := kl.getMountedVolumePathListFromDisk(podUID) if err != nil { - klog.Errorf("pod %q found, but error %v occurred during checking mounted volumes from disk", podUID, err) + klog.ErrorS(err, "Pod found, but error occurred during checking mounted volumes from disk", "podUID", podUID) return true } if len(volumePaths) > 0 { - klog.V(4).Infof("pod %q found, but volumes are still mounted on disk %v", podUID, volumePaths) + klog.V(4).InfoS("Pod found, but volumes are still mounted on disk", "podUID", podUID, "paths", volumePaths) return true } @@ -85,7 +86,7 @@ func (kl *Kubelet) newVolumeMounterFromPlugins(spec *volume.Spec, pod *v1.Pod, o if err != nil { return nil, fmt.Errorf("failed to instantiate mounter for volume: %s using plugin: %s with a root cause: %v", spec.Name(), plugin.GetPluginName(), err) } - klog.V(10).Infof("Using volume plugin %q to mount %s", plugin.GetPluginName(), spec.Name()) + klog.V(10).InfoS("Using volume plugin for mount", "volumePluginName", plugin.GetPluginName(), "volumeName", spec.Name()) return physicalMounter, nil } @@ -117,43 +118,67 @@ func (kl *Kubelet) cleanupOrphanedPodDirs(pods []*v1.Pod, runningPods []*kubecon // TODO: getMountedVolumePathListFromDisk() call may be redundant with // kl.getPodVolumePathListFromDisk(). Can this be cleaned up? if podVolumesExist := kl.podVolumesExist(uid); podVolumesExist { - klog.V(3).Infof("Orphaned pod %q found, but volumes are not cleaned up", uid) + klog.V(3).InfoS("Orphaned pod found, but volumes are not cleaned up", "podUID", uid) continue } - // If there are still volume directories, do not delete directory + + allVolumesCleanedUp := true + + // If there are still volume directories, attempt to rmdir them volumePaths, err := kl.getPodVolumePathListFromDisk(uid) if err != nil { orphanVolumeErrors = append(orphanVolumeErrors, fmt.Errorf("orphaned pod %q found, but error %v occurred during reading volume dir from disk", uid, err)) continue } if len(volumePaths) > 0 { - orphanVolumeErrors = append(orphanVolumeErrors, fmt.Errorf("orphaned pod %q found, but volume paths are still present on disk", uid)) - continue + for _, volumePath := range volumePaths { + if err := syscall.Rmdir(volumePath); err != nil { + orphanVolumeErrors = append(orphanVolumeErrors, fmt.Errorf("orphaned pod %q found, but failed to rmdir() volume at path %v: %v", uid, volumePath, err)) + allVolumesCleanedUp = false + } else { + klog.InfoS("Cleaned up orphaned volume from pod", "podUID", uid, "path", volumePath) + } + } } - // If there are any volume-subpaths, do not cleanup directories - volumeSubpathExists, err := kl.podVolumeSubpathsDirExists(uid) + // If there are any volume-subpaths, attempt to rmdir them + subpathVolumePaths, err := kl.getPodVolumeSubpathListFromDisk(uid) if err != nil { orphanVolumeErrors = append(orphanVolumeErrors, fmt.Errorf("orphaned pod %q found, but error %v occurred during reading of volume-subpaths dir from disk", uid, err)) continue } - if volumeSubpathExists { - orphanVolumeErrors = append(orphanVolumeErrors, fmt.Errorf("orphaned pod %q found, but volume subpaths are still present on disk", uid)) + if len(subpathVolumePaths) > 0 { + for _, subpathVolumePath := range subpathVolumePaths { + if err := syscall.Rmdir(subpathVolumePath); err != nil { + orphanVolumeErrors = append(orphanVolumeErrors, fmt.Errorf("orphaned pod %q found, but failed to rmdir() subpath at path %v: %v", uid, subpathVolumePath, err)) + allVolumesCleanedUp = false + } else { + klog.InfoS("Cleaned up orphaned volume subpath from pod", "podUID", uid, "path", subpathVolumePath) + } + } + } + + if !allVolumesCleanedUp { + // Not all volumes were removed, so don't clean up the pod directory yet. It is likely + // that there are still mountpoints left which could stall RemoveAllOneFilesystem which + // would otherwise be called below. + // Errors for all removal operations have already been recorded, so don't add another + // one here. continue } - klog.V(3).Infof("Orphaned pod %q found, removing", uid) + klog.V(3).InfoS("Orphaned pod found, removing", "podUID", uid) if err := removeall.RemoveAllOneFilesystem(kl.mounter, kl.getPodDir(uid)); err != nil { - klog.Errorf("Failed to remove orphaned pod %q dir; err: %v", uid, err) + klog.ErrorS(err, "Failed to remove orphaned pod dir", "podUID", uid) orphanRemovalErrors = append(orphanRemovalErrors, err) } } logSpew := func(errs []error) { if len(errs) > 0 { - klog.Errorf("%v : There were a total of %v errors similar to this. Turn up verbosity to see them.", errs[0], len(errs)) + klog.ErrorS(errs[0], "There were many similar errors. Turn up verbosity to see them.", "numErrs", len(errs)) for _, err := range errs { - klog.V(5).Infof("Orphan pod: %v", err) + klog.V(5).InfoS("Orphan pod", "err", err) } } } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/BUILD deleted file mode 100644 index 12bb01b11ce8..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/BUILD +++ /dev/null @@ -1,69 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "configsync.go", - "controller.go", - "watch.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/kubeletconfig", - deps = [ - "//pkg/kubelet/apis/config:go_default_library", - "//pkg/kubelet/apis/config/validation:go_default_library", - "//pkg/kubelet/kubeletconfig/checkpoint:go_default_library", - "//pkg/kubelet/kubeletconfig/checkpoint/store:go_default_library", - "//pkg/kubelet/kubeletconfig/status:go_default_library", - "//pkg/kubelet/kubeletconfig/util/log:go_default_library", - "//pkg/kubelet/kubeletconfig/util/panic:go_default_library", - "//pkg/util/filesystem:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/kubelet/kubeletconfig/checkpoint:all-srcs", - "//pkg/kubelet/kubeletconfig/configfiles:all-srcs", - "//pkg/kubelet/kubeletconfig/status:all-srcs", - "//pkg/kubelet/kubeletconfig/util/codec:all-srcs", - "//pkg/kubelet/kubeletconfig/util/equal:all-srcs", - "//pkg/kubelet/kubeletconfig/util/files:all-srcs", - "//pkg/kubelet/kubeletconfig/util/log:all-srcs", - "//pkg/kubelet/kubeletconfig/util/panic:all-srcs", - "//pkg/kubelet/kubeletconfig/util/test:all-srcs", - ], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["controller_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/kubeletconfig/checkpoint:go_default_library", - "//pkg/kubelet/kubeletconfig/checkpoint/store:go_default_library", - "//pkg/kubelet/kubeletconfig/status:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/BUILD deleted file mode 100644 index b9053f08d7a7..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/BUILD +++ /dev/null @@ -1,67 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "configmap_test.go", - "download_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/kubeletconfig/util/test:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//vendor/github.com/davecgh/go-spew/spew:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "configmap.go", - "download.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint", - deps = [ - "//pkg/kubelet/apis/config:go_default_library", - "//pkg/kubelet/apis/config/scheme:go_default_library", - "//pkg/kubelet/kubeletconfig/status:go_default_library", - "//pkg/kubelet/kubeletconfig/util/codec:go_default_library", - "//pkg/kubelet/kubeletconfig/util/log:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/kubelet/config/v1beta1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/kubelet/kubeletconfig/checkpoint/store:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/download.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/download.go index aa9c6746f9db..1b2a3c852ada 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/download.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/download.go @@ -19,6 +19,7 @@ package checkpoint import ( "context" "fmt" + "k8s.io/klog/v2" "math/rand" "time" @@ -35,7 +36,6 @@ import ( "k8s.io/kubernetes/pkg/kubelet/apis/config/scheme" "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/status" utilcodec "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/codec" - utillog "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/log" ) // Payload represents a local copy of a config source (payload) object @@ -178,25 +178,25 @@ func (r *remoteConfigMap) Download(client clientset.Interface, store cache.Store ) // check the in-memory store for the ConfigMap, so we can skip unnecessary downloads if store != nil { - utillog.Infof("checking in-memory store for %s", r.APIPath()) + klog.InfoS("Kubelet config controller checking in-memory store for remoteConfigMap", "apiPath", r.APIPath()) cm, err = getConfigMapFromStore(store, r.source.ConfigMap.Namespace, r.source.ConfigMap.Name) if err != nil { // just log the error, we'll attempt a direct download instead - utillog.Errorf("failed to check in-memory store for %s, error: %v", r.APIPath(), err) + klog.ErrorS(err, "Kubelet config controller failed to check in-memory store for remoteConfigMap", "apiPath", r.APIPath()) } else if cm != nil { - utillog.Infof("found %s in in-memory store, UID: %s, ResourceVersion: %s", r.APIPath(), cm.UID, cm.ResourceVersion) + klog.InfoS("Kubelet config controller found remoteConfigMap in in-memory store", "apiPath", r.APIPath(), "configMapUID", cm.UID, "resourceVersion", cm.ResourceVersion) } else { - utillog.Infof("did not find %s in in-memory store", r.APIPath()) + klog.InfoS("Kubelet config controller did not find remoteConfigMap in in-memory store", "apiPath", r.APIPath()) } } // if we didn't find the ConfigMap in the in-memory store, download it from the API server if cm == nil { - utillog.Infof("attempting to download %s", r.APIPath()) + klog.InfoS("Kubelet config controller attempting to download remoteConfigMap", "apiPath", r.APIPath()) cm, err = client.CoreV1().ConfigMaps(r.source.ConfigMap.Namespace).Get(context.TODO(), r.source.ConfigMap.Name, metav1.GetOptions{}) if err != nil { return nil, status.DownloadError, fmt.Errorf("%s, error: %v", status.DownloadError, err) } - utillog.Infof("successfully downloaded %s, UID: %s, ResourceVersion: %s", r.APIPath(), cm.UID, cm.ResourceVersion) + klog.InfoS("Kubelet config controller successfully downloaded remoteConfigMap", "apiPath", r.APIPath(), "configMapUID", cm.UID, "resourceVersion", cm.ResourceVersion) } // Assert: Now we have a non-nil ConfigMap // construct Payload from the ConfigMap payload, err := NewConfigMapPayload(cm) @@ -255,7 +255,7 @@ func getConfigMapFromStore(store cache.Store, namespace, name string) (*apiv1.Co cm, ok := obj.(*apiv1.ConfigMap) if !ok { err := fmt.Errorf("failed to cast object %s from informer's store to ConfigMap", key) - utillog.Errorf(err.Error()) + klog.ErrorS(err, "Kubelet config controller") return nil, err } return cm, nil diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/store/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/store/BUILD deleted file mode 100644 index a41e348120e3..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/store/BUILD +++ /dev/null @@ -1,61 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "fsstore_test.go", - "store_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/apis/config:go_default_library", - "//pkg/kubelet/apis/config/scheme:go_default_library", - "//pkg/kubelet/kubeletconfig/checkpoint:go_default_library", - "//pkg/kubelet/kubeletconfig/util/codec:go_default_library", - "//pkg/kubelet/kubeletconfig/util/files:go_default_library", - "//pkg/kubelet/kubeletconfig/util/test:go_default_library", - "//pkg/util/filesystem:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/kubelet/config/v1beta1:go_default_library", - "//vendor/github.com/davecgh/go-spew/spew:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "fakestore.go", - "fsstore.go", - "store.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/store", - deps = [ - "//pkg/kubelet/apis/config:go_default_library", - "//pkg/kubelet/kubeletconfig/checkpoint:go_default_library", - "//pkg/kubelet/kubeletconfig/configfiles:go_default_library", - "//pkg/kubelet/kubeletconfig/util/files:go_default_library", - "//pkg/kubelet/kubeletconfig/util/log:go_default_library", - "//pkg/util/filesystem:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/store/fsstore.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/store/fsstore.go index 26c48d06f267..ca5aa9a7efa9 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/store/fsstore.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/store/fsstore.go @@ -18,6 +18,7 @@ package store import ( "fmt" + "k8s.io/klog/v2" "path/filepath" "time" @@ -25,7 +26,6 @@ import ( "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint" "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/configfiles" utilfiles "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/files" - utillog "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/log" utilfs "k8s.io/kubernetes/pkg/util/filesystem" ) @@ -56,7 +56,7 @@ func NewFsStore(fs utilfs.Filesystem, dir string) Store { } func (s *fsStore) Initialize() error { - utillog.Infof("initializing config checkpoints directory %q", s.dir) + klog.InfoS("Kubelet config controller initializing config checkpoints directory", "path", s.dir) // ensure top-level dir for store if err := utilfiles.EnsureDir(s.fs, s.dir); err != nil { return err @@ -113,7 +113,7 @@ func (s *fsStore) Load(source checkpoint.RemoteConfigSource) (*kubeletconfig.Kub return nil, fmt.Errorf("no checkpoint for source %s", sourceFmt) } // load the kubelet config file - utillog.Infof("loading Kubelet configuration checkpoint for source %s", sourceFmt) + klog.InfoS("Kubelet config controller loading Kubelet configuration checkpoint for source", "apiPath", source.APIPath(), "sourceUID", source.UID(), "resourceVersion", source.ResourceVersion()) loader, err := configfiles.NewFsLoader(s.fs, filepath.Join(s.checkpointPath(source.UID(), source.ResourceVersion()), source.KubeletFilename())) if err != nil { return nil, err diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/configfiles/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/configfiles/BUILD deleted file mode 100644 index d32ca1c33bbd..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/configfiles/BUILD +++ /dev/null @@ -1,50 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["configfiles.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/configfiles", - deps = [ - "//pkg/kubelet/apis/config:go_default_library", - "//pkg/kubelet/apis/config/scheme:go_default_library", - "//pkg/kubelet/kubeletconfig/util/codec:go_default_library", - "//pkg/util/filesystem:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["configfiles_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/apis/config:go_default_library", - "//pkg/kubelet/apis/config/scheme:go_default_library", - "//pkg/kubelet/kubeletconfig/util/files:go_default_library", - "//pkg/kubelet/kubeletconfig/util/test:go_default_library", - "//pkg/util/filesystem:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/kubelet/config/v1beta1:go_default_library", - "//vendor/github.com/pkg/errors:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/configsync.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/configsync.go index fc8706bbc18e..f4dea057d194 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/configsync.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/configsync.go @@ -32,7 +32,6 @@ import ( "k8s.io/client-go/tools/cache" "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint" "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/status" - utillog "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/log" ) const ( @@ -65,7 +64,7 @@ func (cc *Controller) syncConfigSource(client clientset.Interface, eventClient v var syncerr error defer func() { if syncerr != nil { - utillog.Errorf(syncerr.Error()) + klog.ErrorS(syncerr, "Kubelet config controller") cc.pokeConfigSourceWorker() } }() @@ -80,7 +79,7 @@ func (cc *Controller) syncConfigSource(client clientset.Interface, eventClient v // a nil source simply means we reset to local defaults if source == nil { - utillog.Infof("Node.Spec.ConfigSource is empty, will reset assigned and last-known-good to defaults") + klog.InfoS("Kubelet config controller Node.Spec.ConfigSource is empty, will reset assigned and last-known-good to defaults") if updated, reason, err := cc.resetConfig(); err != nil { reason = fmt.Sprintf(status.SyncErrorFmt, reason) cc.configStatus.SetErrorOverride(reason) @@ -93,7 +92,7 @@ func (cc *Controller) syncConfigSource(client clientset.Interface, eventClient v } // a non-nil source means we should attempt to download the config, and checkpoint it if necessary - utillog.Infof("Node.Spec.ConfigSource is non-empty, will checkpoint source and update config if necessary") + klog.InfoS("Kubelet config controller Node.Spec.ConfigSource is non-empty, will checkpoint source and update config if necessary") // TODO(mtaufen): It would be nice if we could check the payload's metadata before (re)downloading the whole payload // we at least try pulling the latest configmap out of the local informer store. @@ -156,7 +155,7 @@ func (cc *Controller) saveConfigCheckpoint(source checkpoint.RemoteConfigSource, return status.InternalError, fmt.Errorf("%s, error: %v", status.InternalError, err) } if ok { - utillog.Infof("checkpoint already exists for %s, UID: %s, ResourceVersion: %s", source.APIPath(), payload.UID(), payload.ResourceVersion()) + klog.InfoS("Kubelet config controller checkpoint already exists for source", "apiPath", source.APIPath(), "checkpointUID", payload.UID(), "resourceVersion", payload.ResourceVersion()) return "", nil } if err := cc.checkpointStore.Save(payload); err != nil { @@ -198,11 +197,11 @@ func restartForNewConfig(eventClient v1core.EventsGetter, nodeName string, sourc // we directly log and send the event, instead of using the event recorder, // because the event recorder won't flush its queue before we exit (we'd lose the event) event := makeEvent(nodeName, apiv1.EventTypeNormal, KubeletConfigChangedEventReason, message) - klog.V(3).Infof("Event(%#v): type: '%v' reason: '%v' %v", event.InvolvedObject, event.Type, event.Reason, event.Message) + klog.V(3).InfoS("Event created", "event", klog.KObj(event), "involvedObject", event.InvolvedObject, "eventType", event.Type, "reason", event.Reason, "message", event.Message) if _, err := eventClient.Events(apiv1.NamespaceDefault).Create(context.TODO(), event, metav1.CreateOptions{}); err != nil { - utillog.Errorf("failed to send event, error: %v", err) + klog.ErrorS(err, "Kubelet config controller failed to send event") } - utillog.Infof(message) + klog.InfoS("Kubelet config controller event", "message", message) os.Exit(0) } @@ -211,17 +210,17 @@ func latestNodeConfigSource(store cache.Store, nodeName string) (*apiv1.NodeConf obj, ok, err := store.GetByKey(nodeName) if err != nil { err := fmt.Errorf("failed to retrieve Node %q from informer's store, error: %v", nodeName, err) - utillog.Errorf(err.Error()) + klog.ErrorS(err, "Kubelet config controller") return nil, err } else if !ok { err := fmt.Errorf("node %q does not exist in the informer's store, can't sync config source", nodeName) - utillog.Errorf(err.Error()) + klog.ErrorS(err, "Kubelet config controller") return nil, err } node, ok := obj.(*apiv1.Node) if !ok { err := fmt.Errorf("failed to cast object from informer's store to Node, can't sync config source for Node %q", nodeName) - utillog.Errorf(err.Error()) + klog.ErrorS(err, "Kubelet config controller") return nil, err } // Copy the source, so anyone who modifies it after here doesn't mess up the informer's store! diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/controller.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/controller.go index 50b65a67a3ae..45272af94b19 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/controller.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/controller.go @@ -18,6 +18,7 @@ package kubeletconfig import ( "fmt" + "k8s.io/klog/v2" "path/filepath" "time" @@ -32,7 +33,6 @@ import ( "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint" "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/store" "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/status" - utillog "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/log" utilpanic "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/panic" utilfs "k8s.io/kubernetes/pkg/util/filesystem" ) @@ -98,7 +98,7 @@ func NewController(dynamicConfigDir string, transform TransformFunc) *Controller // or returns an error if no valid configuration could be produced. Bootstrap should be called synchronously before StartSync. // If the pre-existing local configuration should be used, Bootstrap returns a nil config. func (cc *Controller) Bootstrap() (*kubeletconfig.KubeletConfiguration, error) { - utillog.Infof("starting controller") + klog.InfoS("Kubelet config controller starting controller") // ensure the filesystem is initialized if err := cc.initializeDynamicConfigDir(); err != nil { @@ -148,7 +148,7 @@ func (cc *Controller) Bootstrap() (*kubeletconfig.KubeletConfiguration, error) { // or something else scary // log the reason and error details for the failure to load the assigned config - utillog.Errorf(fmt.Sprintf("%s, error: %v", reason, err)) + klog.ErrorS(err, "Kubelet config controller", "reason", reason) // set status to indicate the failure with the assigned config cc.configStatus.SetError(reason) @@ -194,7 +194,7 @@ func (cc *Controller) StartSync(client clientset.Interface, eventClient v1core.E // status sync worker statusSyncLoopFunc := utilpanic.HandlePanic(func() { - utillog.Infof("starting status sync loop") + klog.InfoS("Kubelet config controller starting status sync loop") wait.JitterUntil(func() { cc.configStatus.Sync(client, nodeName) }, 10*time.Second, 0.2, true, wait.NeverStop) @@ -204,7 +204,7 @@ func (cc *Controller) StartSync(client clientset.Interface, eventClient v1core.E if err != nil { return fmt.Errorf(errFmt, err) } else if assignedSource == nil { - utillog.Infof("local source is assigned, will not start remote config source informer") + klog.InfoS("Kubelet config controller local source is assigned, will not start remote config source informer") } else { cc.remoteConfigSourceInformer = assignedSource.Informer(client, cache.ResourceEventHandlerFuncs{ AddFunc: cc.onAddRemoteConfigSourceEvent, @@ -215,7 +215,7 @@ func (cc *Controller) StartSync(client clientset.Interface, eventClient v1core.E } remoteConfigSourceInformerFunc := utilpanic.HandlePanic(func() { if cc.remoteConfigSourceInformer != nil { - utillog.Infof("starting remote config source informer") + klog.InfoS("Kubelet config controller starting remote config source informer") cc.remoteConfigSourceInformer.Run(wait.NeverStop) } }) @@ -223,12 +223,12 @@ func (cc *Controller) StartSync(client clientset.Interface, eventClient v1core.E cc.nodeInformer = newSharedNodeInformer(client, nodeName, cc.onAddNodeEvent, cc.onUpdateNodeEvent, cc.onDeleteNodeEvent) nodeInformerFunc := utilpanic.HandlePanic(func() { - utillog.Infof("starting Node informer") + klog.InfoS("Kubelet config controller starting Node informer") cc.nodeInformer.Run(wait.NeverStop) }) // config sync worker configSyncLoopFunc := utilpanic.HandlePanic(func() { - utillog.Infof("starting Kubelet config sync loop") + klog.InfoS("Kubelet config controller starting Kubelet config sync loop") wait.JitterUntil(func() { cc.syncConfigSource(client, eventClient, nodeName) }, 10*time.Second, 0.2, true, wait.NeverStop) @@ -264,7 +264,7 @@ func (cc *Controller) loadConfig(source checkpoint.RemoteConfigSource) (*kubelet // initializeDynamicConfigDir makes sure that the storage layers for various controller components are set up correctly func (cc *Controller) initializeDynamicConfigDir() error { - utillog.Infof("ensuring filesystem is set up correctly") + klog.InfoS("Kubelet config controller ensuring filesystem is set up correctly") // initializeDynamicConfigDir local checkpoint storage location return cc.checkpointStore.Initialize() } @@ -273,10 +273,10 @@ func (cc *Controller) initializeDynamicConfigDir() error { func (cc *Controller) checkTrial(duration time.Duration) { // when the trial period is over, the assigned config becomes the last-known-good if trial, err := cc.inTrial(duration); err != nil { - utillog.Errorf("failed to check trial period for assigned config, error: %v", err) + klog.ErrorS(err, "Kubelet config controller failed to check trial period for assigned config") } else if !trial { if err := cc.graduateAssignedToLastKnownGood(); err != nil { - utillog.Errorf("failed to set last-known-good to assigned config, error: %v", err) + klog.ErrorS(err, "failed to set last-known-good to assigned config") } } } @@ -319,6 +319,6 @@ func (cc *Controller) graduateAssignedToLastKnownGood() error { } // update the status to reflect the new last-known-good config cc.configStatus.SetLastKnownGood(assigned.NodeConfigSource()) - utillog.Infof("updated last-known-good config to %s, UID: %s, ResourceVersion: %s", assigned.APIPath(), assigned.UID(), assigned.ResourceVersion()) + klog.InfoS("Kubelet config controller updated last-known-good config to new checkpointStore", "apiPath", assigned.APIPath(), "checkpointUID", assigned.UID(), "resourceVersion", assigned.ResourceVersion()) return nil } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/status/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/status/BUILD deleted file mode 100644 index 7e9bdc9db898..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/status/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["status.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/status", - deps = [ - "//pkg/kubelet/kubeletconfig/util/log:go_default_library", - "//pkg/kubelet/metrics:go_default_library", - "//pkg/util/node:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/status/status.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/status/status.go index ad2cf898c860..aad5c0b395da 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/status/status.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/status/status.go @@ -19,13 +19,13 @@ package status import ( "context" "fmt" + "k8s.io/klog/v2" "sync" apiv1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" clientset "k8s.io/client-go/kubernetes" - utillog "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/log" "k8s.io/kubernetes/pkg/kubelet/metrics" nodeutil "k8s.io/kubernetes/pkg/util/node" ) @@ -143,7 +143,7 @@ func (s *nodeConfigStatus) Sync(client clientset.Interface, nodeName string) { return } - utillog.Infof("updating Node.Status.Config") + klog.InfoS("Kubelet config controller updating Node.Status.Config") // grab the lock s.mux.Lock() @@ -153,7 +153,7 @@ func (s *nodeConfigStatus) Sync(client clientset.Interface, nodeName string) { var err error defer func() { if err != nil { - utillog.Errorf(err.Error()) + klog.ErrorS(err, "Kubelet config controller") s.sync() } }() @@ -198,6 +198,6 @@ func (s *nodeConfigStatus) Sync(client clientset.Interface, nodeName string) { // patch the node with the new status if _, _, err := nodeutil.PatchNodeStatus(client.CoreV1(), types.NodeName(nodeName), oldNode, newNode); err != nil { - utillog.Errorf("failed to patch node status, error: %v", err) + klog.ErrorS(err, "Kubelet config controller failed to patch node status") } } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/codec/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/codec/BUILD deleted file mode 100644 index 78801be11b8a..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/codec/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["codec.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/codec", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/core/install:go_default_library", - "//pkg/kubelet/apis/config:go_default_library", - "//pkg/kubelet/apis/config/scheme:go_default_library", - "//pkg/kubelet/apis/config/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/component-base/codec:go_default_library", - "//vendor/github.com/pkg/errors:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/codec/codec.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/codec/codec.go index c4adc4fc7c4e..37e8269106f7 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/codec/codec.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/codec/codec.go @@ -115,7 +115,7 @@ func DecodeKubeletConfiguration(kubeletCodecs *serializer.CodecFactory, data []b return nil, fmt.Errorf("failed lenient decoding: %v", err) } // Continue with the v1beta1 object that was decoded leniently, but emit a warning. - klog.Warningf("using lenient decoding as strict decoding failed: %v", err) + klog.InfoS("Using lenient decoding as strict decoding failed", "err", err) } internalKC, ok := obj.(*kubeletconfig.KubeletConfiguration) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/files/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/files/BUILD deleted file mode 100644 index 5f6e0c1e0f9d..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/files/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["files.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/files", - deps = ["//pkg/util/filesystem:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["files_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/kubeletconfig/util/test:go_default_library", - "//pkg/util/filesystem:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/files/files.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/files/files.go index fc42151a7290..6dfbe3840cd2 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/files/files.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/files/files.go @@ -26,7 +26,7 @@ import ( const ( defaultPerm = 0755 - tmptag = "tmp_" // additional prefix to prevent accidental collisions + tmpTag = "tmp_" // additional prefix to prevent accidental collisions ) // FileExists returns true if a regular file exists at `path`, false if `path` does not exist, otherwise an error @@ -70,7 +70,7 @@ func EnsureFile(fs utilfs.Filesystem, path string) error { // Expects the parent directory to exist. func WriteTmpFile(fs utilfs.Filesystem, path string, data []byte) (tmpPath string, retErr error) { dir := filepath.Dir(path) - prefix := tmptag + filepath.Base(path) + prefix := tmpTag + filepath.Base(path) // create the tmp file tmpFile, err := fs.TempFile(dir, prefix) @@ -174,7 +174,7 @@ func WriteTempDir(fs utilfs.Filesystem, path string, files map[string]string) (t // write the temp directory in parent dir and return path to the tmp directory dir := filepath.Dir(path) - prefix := tmptag + filepath.Base(path) + prefix := tmpTag + filepath.Base(path) // create the tmp dir var err error diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/log/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/log/BUILD deleted file mode 100644 index 082117e939fd..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/log/BUILD +++ /dev/null @@ -1,26 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["log.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/log", - deps = ["//vendor/k8s.io/klog/v2:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/log/log.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/log/log.go deleted file mode 100644 index ff76ff8f029f..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/log/log.go +++ /dev/null @@ -1,49 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package log - -import ( - "fmt" - - "k8s.io/klog/v2" -) - -const logFmt = "kubelet config controller: %s" - -// Errorf shim that inserts "kubelet config controller" at the beginning of the log message, -// while still reporting the call site of the logging function. -func Errorf(format string, args ...interface{}) { - var s string - if len(args) > 0 { - s = fmt.Sprintf(format, args...) - } else { - s = format - } - klog.ErrorDepth(1, fmt.Sprintf(logFmt, s)) -} - -// Infof shim that inserts "kubelet config controller" at the beginning of the log message, -// while still reporting the call site of the logging function. -func Infof(format string, args ...interface{}) { - var s string - if len(args) > 0 { - s = fmt.Sprintf(format, args...) - } else { - s = format - } - klog.InfoDepth(1, fmt.Sprintf(logFmt, s)) -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/panic/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/panic/BUILD deleted file mode 100644 index d5e3db34d25b..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/panic/BUILD +++ /dev/null @@ -1,26 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["panic.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/panic", - deps = ["//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/watch.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/watch.go index bc247962ea72..229d23e10151 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/watch.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/watch.go @@ -17,6 +17,7 @@ limitations under the License. package kubeletconfig import ( + "k8s.io/klog/v2" "math/rand" "time" @@ -26,7 +27,6 @@ import ( "k8s.io/apimachinery/pkg/fields" clientset "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/cache" - utillog "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/log" ) // newSharedNodeInformer returns a shared informer that uses `client` to watch the Node with @@ -67,22 +67,22 @@ func (cc *Controller) onAddNodeEvent(newObj interface{}) { func (cc *Controller) onUpdateNodeEvent(oldObj interface{}, newObj interface{}) { newNode, ok := newObj.(*apiv1.Node) if !ok { - utillog.Errorf("failed to cast new object to Node, couldn't handle event") + klog.ErrorS(nil, "Kubelet config controller failed to cast new object to Node, couldn't handle event") return } if oldObj == nil { // Node was just added, need to sync - utillog.Infof("initial Node watch event") + klog.InfoS("Kubelet config controller initial Node watch event") cc.pokeConfigSourceWorker() return } oldNode, ok := oldObj.(*apiv1.Node) if !ok { - utillog.Errorf("failed to cast old object to Node, couldn't handle event") + klog.ErrorS(nil, "Kubelet config controller failed to cast old object to Node, couldn't handle event") return } if !apiequality.Semantic.DeepEqual(oldNode.Spec.ConfigSource, newNode.Spec.ConfigSource) { - utillog.Infof("Node.Spec.ConfigSource was updated") + klog.InfoS("Kubelet config controller Node.Spec.ConfigSource was updated") cc.pokeConfigSourceWorker() } } @@ -96,7 +96,7 @@ func (cc *Controller) onDeleteNodeEvent(deletedObj interface{}) { // For this case, we just log the event. // We don't want to poke the worker, because a temporary deletion isn't worth reporting an error for. // If the Node is deleted because the VM is being deleted, then the Kubelet has nothing to do. - utillog.Infof("Node was deleted") + klog.InfoS("Kubelet config controller Node was deleted") } // onAddRemoteConfigSourceEvent calls onUpdateConfigMapEvent with the new object and a nil old object @@ -110,22 +110,22 @@ func (cc *Controller) onUpdateRemoteConfigSourceEvent(oldObj interface{}, newObj // since ConfigMap is currently the only source type, we handle that here newConfigMap, ok := newObj.(*apiv1.ConfigMap) if !ok { - utillog.Errorf("failed to cast new object to ConfigMap, couldn't handle event") + klog.ErrorS(nil, "Kubelet config controller failed to cast new object to ConfigMap, couldn't handle event") return } if oldObj == nil { // ConfigMap was just added, need to sync - utillog.Infof("initial ConfigMap watch event") + klog.InfoS("Kubelet config controller initial ConfigMap watch event") cc.pokeConfigSourceWorker() return } oldConfigMap, ok := oldObj.(*apiv1.ConfigMap) if !ok { - utillog.Errorf("failed to cast old object to ConfigMap, couldn't handle event") + klog.ErrorS(nil, "Kubelet config controller failed to cast old object to ConfigMap, couldn't handle event") return } if !apiequality.Semantic.DeepEqual(oldConfigMap, newConfigMap) { - utillog.Infof("assigned ConfigMap was updated") + klog.InfoS("Kubelet config controller assigned ConfigMap was updated") cc.pokeConfigSourceWorker() } } @@ -135,6 +135,6 @@ func (cc *Controller) onDeleteRemoteConfigSourceEvent(deletedObj interface{}) { // If the ConfigMap we're watching is deleted, we log the event and poke the sync worker. // This requires a sync, because if the Node is still configured to use the deleted ConfigMap, // the Kubelet should report a DownloadError. - utillog.Infof("assigned ConfigMap was deleted") + klog.InfoS("Kubelet config controller assigned ConfigMap was deleted") cc.pokeConfigSourceWorker() } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/BUILD deleted file mode 100644 index 6827346f5d17..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/BUILD +++ /dev/null @@ -1,171 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "convert.go", - "doc.go", - "fake_kuberuntime_manager.go", - "helpers.go", - "helpers_linux.go", - "helpers_unsupported.go", - "instrumented_services.go", - "kuberuntime_container.go", - "kuberuntime_container_linux.go", - "kuberuntime_container_unsupported.go", - "kuberuntime_container_windows.go", - "kuberuntime_gc.go", - "kuberuntime_image.go", - "kuberuntime_logs.go", - "kuberuntime_manager.go", - "kuberuntime_sandbox.go", - "labels.go", - "legacy.go", - "security_context.go", - "security_context_others.go", - "security_context_windows.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/kuberuntime", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/credentialprovider:go_default_library", - "//pkg/credentialprovider/plugin:go_default_library", - "//pkg/credentialprovider/secrets:go_default_library", - "//pkg/features:go_default_library", - "//pkg/kubelet/cm:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/events:go_default_library", - "//pkg/kubelet/images:go_default_library", - "//pkg/kubelet/kuberuntime/logs:go_default_library", - "//pkg/kubelet/lifecycle:go_default_library", - "//pkg/kubelet/logs:go_default_library", - "//pkg/kubelet/metrics:go_default_library", - "//pkg/kubelet/prober/results:go_default_library", - "//pkg/kubelet/runtimeclass:go_default_library", - "//pkg/kubelet/types:go_default_library", - "//pkg/kubelet/util:go_default_library", - "//pkg/kubelet/util/cache:go_default_library", - "//pkg/kubelet/util/format:go_default_library", - "//pkg/security/apparmor:go_default_library", - "//pkg/securitycontext:go_default_library", - "//pkg/util/parsers:go_default_library", - "//pkg/util/selinux:go_default_library", - "//pkg/util/tail:go_default_library", - "//pkg/volume/util:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/version:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/client-go/tools/reference:go_default_library", - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/component-base/logs/logreduction:go_default_library", - "//staging/src/k8s.io/cri-api/pkg/apis:go_default_library", - "//staging/src/k8s.io/cri-api/pkg/apis/runtime/v1alpha2:go_default_library", - "//vendor/github.com/armon/circbuf:go_default_library", - "//vendor/github.com/google/cadvisor/info/v1:go_default_library", - "//vendor/google.golang.org/grpc/status:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "//pkg/apis/core/v1/helper:go_default_library", - "//pkg/kubelet/qos:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//pkg/apis/core/v1/helper:go_default_library", - "//pkg/kubelet/qos:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs:go_default_library", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "//pkg/kubelet/apis:go_default_library", - ], - "//conditions:default": [], - }), -) - -go_test( - name = "go_default_test", - srcs = [ - "convert_test.go", - "helpers_linux_test.go", - "helpers_test.go", - "instrumented_services_test.go", - "kuberuntime_container_linux_test.go", - "kuberuntime_container_test.go", - "kuberuntime_gc_test.go", - "kuberuntime_image_test.go", - "kuberuntime_manager_test.go", - "kuberuntime_sandbox_test.go", - "labels_test.go", - "legacy_test.go", - "security_context_others_test.go", - "security_context_windows_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/api/v1/pod:go_default_library", - "//pkg/credentialprovider:go_default_library", - "//pkg/features:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/container/testing:go_default_library", - "//pkg/kubelet/lifecycle:go_default_library", - "//pkg/kubelet/metrics:go_default_library", - "//pkg/kubelet/prober/results:go_default_library", - "//pkg/kubelet/runtimeclass:go_default_library", - "//pkg/kubelet/runtimeclass/testing:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - "//staging/src/k8s.io/cri-api/pkg/apis/runtime/v1alpha2:go_default_library", - "//staging/src/k8s.io/cri-api/pkg/apis/testing:go_default_library", - "//vendor/github.com/golang/mock/gomock:go_default_library", - "//vendor/github.com/google/cadvisor/info/v1:go_default_library", - "//vendor/github.com/google/go-cmp/cmp:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/kubelet/kuberuntime/logs:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/fake_kuberuntime_manager.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/fake_kuberuntime_manager.go index a7190df20876..bf6cec514eae 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/fake_kuberuntime_manager.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/fake_kuberuntime_manager.go @@ -101,7 +101,9 @@ func newFakeKubeRuntimeManager(runtimeService internalapi.RuntimeService, imageS return nil, err } - kubeRuntimeManager.containerGC = newContainerGC(runtimeService, newFakePodStateProvider(), kubeRuntimeManager) + podStateProvider := newFakePodStateProvider() + kubeRuntimeManager.containerGC = newContainerGC(runtimeService, podStateProvider, kubeRuntimeManager) + kubeRuntimeManager.podStateProvider = podStateProvider kubeRuntimeManager.runtimeName = typedVersion.RuntimeName kubeRuntimeManager.imagePuller = images.NewImageManager( kubecontainer.FilterEventRecorder(recorder), diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/helpers.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/helpers.go index 6db2698cb59b..7b4fb7c5d54b 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/helpers.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/helpers.go @@ -81,7 +81,7 @@ func toRuntimeProtocol(protocol v1.Protocol) runtimeapi.Protocol { return runtimeapi.Protocol_SCTP } - klog.Warningf("Unknown protocol %q: defaulting to TCP", protocol) + klog.InfoS("Unknown protocol, defaulting to TCP", "protocol", protocol) return runtimeapi.Protocol_TCP } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_container.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_container.go index c28a66bec941..9883bc6b7142 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_container.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_container.go @@ -75,7 +75,7 @@ var ( func (m *kubeGenericRuntimeManager) recordContainerEvent(pod *v1.Pod, container *v1.Container, containerID, eventType, reason, message string, args ...interface{}) { ref, err := kubecontainer.GenerateContainerRef(pod, container) if err != nil { - klog.Errorf("Can't make a ref to pod %q, container %v: %v", format.Pod(pod), container.Name, err) + klog.ErrorS(err, "Can't make a container ref", "pod", klog.KObj(pod), "podUID", pod.UID, "containerName", container.Name) return } eventMessage := message @@ -214,8 +214,8 @@ func (m *kubeGenericRuntimeManager) startContainer(podSandboxID string, podSandb // to create it in the first place. it happens when journald logging driver is used with docker. if _, err := m.osInterface.Stat(containerLog); !os.IsNotExist(err) { if err := m.osInterface.Symlink(containerLog, legacySymlink); err != nil { - klog.Errorf("Failed to create legacy symbolic link %q to container %q log %q: %v", - legacySymlink, containerID, containerLog, err) + klog.ErrorS(err, "Failed to create legacy symbolic link", "path", legacySymlink, + "containerID", containerID, "containerLogPath", containerLog) } } @@ -228,9 +228,9 @@ func (m *kubeGenericRuntimeManager) startContainer(podSandboxID string, podSandb msg, handlerErr := m.runner.Run(kubeContainerID, pod, container, container.Lifecycle.PostStart) if handlerErr != nil { m.recordContainerEvent(pod, container, kubeContainerID.ID, v1.EventTypeWarning, events.FailedPostStartHook, msg) - if err := m.killContainer(pod, kubeContainerID, container.Name, "FailedPostStartHook", nil); err != nil { - klog.Errorf("Failed to kill container %q(id=%q) in pod %q: %v, %v", - container.Name, kubeContainerID.String(), format.Pod(pod), ErrPostStartHook, err) + if err := m.killContainer(pod, kubeContainerID, container.Name, "FailedPostStartHook", reasonFailedPostStartHook, nil); err != nil { + klog.ErrorS(fmt.Errorf("%s: %v", ErrPostStartHook, handlerErr), "Failed to kill container", "pod", klog.KObj(pod), + "podUID", pod.UID, "containerName", container.Name, "containerID", kubeContainerID.String()) } return msg, fmt.Errorf("%s: %v", ErrPostStartHook, handlerErr) } @@ -389,7 +389,7 @@ func (m *kubeGenericRuntimeManager) getKubeletContainers(allContainers bool) ([] containers, err := m.runtimeService.ListContainers(filter) if err != nil { - klog.Errorf("getKubeletContainers failed: %v", err) + klog.ErrorS(err, "ListContainers failed") return nil, err } @@ -444,7 +444,7 @@ func (m *kubeGenericRuntimeManager) getPodContainerStatuses(uid kubetypes.UID, n LabelSelector: map[string]string{types.KubernetesPodUIDLabel: string(uid)}, }) if err != nil { - klog.Errorf("ListContainers error: %v", err) + klog.ErrorS(err, "ListContainers error") return nil, err } @@ -454,7 +454,7 @@ func (m *kubeGenericRuntimeManager) getPodContainerStatuses(uid kubetypes.UID, n status, err := m.runtimeService.ContainerStatus(c.Id) if err != nil { // Merely log this here; GetPodStatus will actually report the error out. - klog.V(4).Infof("ContainerStatus for %s error: %v", c.Id, err) + klog.V(4).InfoS("ContainerStatus return error", "containerID", c.Id, "err", err) return nil, err } cStatus := toKubeContainerStatus(status, m.runtimeName) @@ -524,7 +524,7 @@ func toKubeContainerStatus(status *runtimeapi.ContainerStatus, runtimeName strin // executePreStopHook runs the pre-stop lifecycle hooks if applicable and returns the duration it takes. func (m *kubeGenericRuntimeManager) executePreStopHook(pod *v1.Pod, containerID kubecontainer.ContainerID, containerSpec *v1.Container, gracePeriod int64) int64 { - klog.V(3).Infof("Running preStop hook for container %q", containerID.String()) + klog.V(3).InfoS("Running preStop hook", "pod", klog.KObj(pod), "podUID", pod.UID, "containerName", containerSpec.Name, "containerID", containerID.String()) start := metav1.Now() done := make(chan struct{}) @@ -532,16 +532,19 @@ func (m *kubeGenericRuntimeManager) executePreStopHook(pod *v1.Pod, containerID defer close(done) defer utilruntime.HandleCrash() if msg, err := m.runner.Run(containerID, pod, containerSpec, containerSpec.Lifecycle.PreStop); err != nil { - klog.Errorf("preStop hook for container %q failed: %v", containerSpec.Name, err) + klog.ErrorS(err, "PreStop hook failed", "pod", klog.KObj(pod), "podUID", pod.UID, + "containerName", containerSpec.Name, "containerID", containerID.String()) m.recordContainerEvent(pod, containerSpec, containerID.ID, v1.EventTypeWarning, events.FailedPreStopHook, msg) } }() select { case <-time.After(time.Duration(gracePeriod) * time.Second): - klog.V(2).Infof("preStop hook for container %q did not complete in %d seconds", containerID, gracePeriod) + klog.V(2).InfoS("PreStop hook not completed in grace period", "pod", klog.KObj(pod), "podUID", pod.UID, + "containerName", containerSpec.Name, "containerID", containerID.String(), "gracePeriod", gracePeriod) case <-done: - klog.V(3).Infof("preStop hook for container %q completed", containerID) + klog.V(3).InfoS("PreStop hook completed", "pod", klog.KObj(pod), "podUID", pod.UID, + "containerName", containerSpec.Name, "containerID", containerID.String()) } return int64(metav1.Now().Sub(start.Time).Seconds()) @@ -594,11 +597,11 @@ func (m *kubeGenericRuntimeManager) restoreSpecsFromContainerLabels(containerID // killContainer kills a container through the following steps: // * Run the pre-stop lifecycle hooks (if applicable). // * Stop the container. -func (m *kubeGenericRuntimeManager) killContainer(pod *v1.Pod, containerID kubecontainer.ContainerID, containerName string, message string, gracePeriodOverride *int64) error { +func (m *kubeGenericRuntimeManager) killContainer(pod *v1.Pod, containerID kubecontainer.ContainerID, containerName string, message string, reason containerKillReason, gracePeriodOverride *int64) error { var containerSpec *v1.Container if pod != nil { if containerSpec = kubecontainer.GetContainerSpec(pod, containerName); containerSpec == nil { - return fmt.Errorf("failed to get containerSpec %q(id=%q) in pod %q when killing container for reason %q", + return fmt.Errorf("failed to get containerSpec %q (id=%q) in pod %q when killing container for reason %q", containerName, containerID.String(), format.Pod(pod), message) } } else { @@ -617,6 +620,20 @@ func (m *kubeGenericRuntimeManager) killContainer(pod *v1.Pod, containerID kubec gracePeriod = *pod.DeletionGracePeriodSeconds case pod.Spec.TerminationGracePeriodSeconds != nil: gracePeriod = *pod.Spec.TerminationGracePeriodSeconds + + if utilfeature.DefaultFeatureGate.Enabled(features.ProbeTerminationGracePeriod) { + switch reason { + case reasonStartupProbe: + if containerSpec.StartupProbe != nil && containerSpec.StartupProbe.TerminationGracePeriodSeconds != nil { + gracePeriod = *containerSpec.StartupProbe.TerminationGracePeriodSeconds + } + case reasonLivenessProbe: + if containerSpec.LivenessProbe != nil && containerSpec.LivenessProbe.TerminationGracePeriodSeconds != nil { + gracePeriod = *containerSpec.LivenessProbe.TerminationGracePeriodSeconds + } + } + } + if annotationGracePeriod, found := pod.ObjectMeta.Annotations["unsupported.do-not-use.openshift.io/override-liveness-grace-period-seconds"]; found { if val, err := strconv.ParseUint(annotationGracePeriod, 10, 64); err == nil && val > 0 { gracePeriod = int64(val) @@ -644,16 +661,20 @@ func (m *kubeGenericRuntimeManager) killContainer(pod *v1.Pod, containerID kubec } if gracePeriodOverride != nil { gracePeriod = *gracePeriodOverride - klog.V(3).Infof("Killing container %q, but using a %d second grace period override", containerID, gracePeriod) + klog.V(3).InfoS("Killing container with a grace period override", "pod", klog.KObj(pod), "podUID", pod.UID, + "containerName", containerName, "containerID", containerID.String(), "gracePeriod", gracePeriod) } - klog.V(2).Infof("Killing container %q with a %d second grace period", containerID.String(), gracePeriod) + klog.V(2).InfoS("Killing container with a grace period override", "pod", klog.KObj(pod), "podUID", pod.UID, + "containerName", containerName, "containerID", containerID.String(), "gracePeriod", gracePeriod) err := m.runtimeService.StopContainer(containerID.ID, gracePeriod) if err != nil { - klog.Errorf("Container %q termination failed with gracePeriod %d: %v", containerID.String(), gracePeriod, err) + klog.ErrorS(err, "Container termination failed with gracePeriod", "pod", klog.KObj(pod), "podUID", pod.UID, + "containerName", containerName, "containerID", containerID.String(), "gracePeriod", gracePeriod) } else { - klog.V(3).Infof("Container %q exited normally", containerID.String()) + klog.V(3).InfoS("Container exited normally", "pod", klog.KObj(pod), "podUID", pod.UID, + "containerName", containerName, "containerID", containerID.String()) } return err @@ -671,9 +692,11 @@ func (m *kubeGenericRuntimeManager) killContainersWithSyncResult(pod *v1.Pod, ru defer wg.Done() killContainerResult := kubecontainer.NewSyncResult(kubecontainer.KillContainer, container.Name) - if err := m.killContainer(pod, container.ID, container.Name, "", gracePeriodOverride); err != nil { + if err := m.killContainer(pod, container.ID, container.Name, "", reasonUnknown, gracePeriodOverride); err != nil { killContainerResult.Fail(kubecontainer.ErrKillContainer, err.Error()) - klog.Errorf("killContainer %q(id=%q) for pod %q failed: %v", container.Name, container.ID, format.Pod(pod), err) + // Use runningPod for logging as the pod passed in could be *nil*. + klog.ErrorS(err, "Kill container failed", "pod", klog.KRef(runningPod.Namespace, runningPod.Name), "podUID", runningPod.ID, + "containerName", container.Name, "containerID", container.ID) } containerResults <- killContainerResult }(container) @@ -715,7 +738,7 @@ func (m *kubeGenericRuntimeManager) pruneInitContainersBeforeStart(pod *v1.Pod, continue } // prune all other init containers that match this container name - klog.V(4).Infof("Removing init container %q instance %q %d", status.Name, status.ID.ID, count) + klog.V(4).InfoS("Removing init container", "containerName", status.Name, "containerID", status.ID.ID, "count", count) if err := m.removeContainer(status.ID.ID); err != nil { utilruntime.HandleError(fmt.Errorf("failed to remove pod init container %q: %v; Skipping pod %q", status.Name, err, format.Pod(pod))) continue @@ -724,7 +747,7 @@ func (m *kubeGenericRuntimeManager) pruneInitContainersBeforeStart(pod *v1.Pod, } } -// Remove all init containres. Note that this function does not check the state +// Remove all init containers. Note that this function does not check the state // of the container because it assumes all init containers have been stopped // before the call happens. func (m *kubeGenericRuntimeManager) purgeInitContainers(pod *v1.Pod, podStatus *kubecontainer.PodStatus) { @@ -740,7 +763,7 @@ func (m *kubeGenericRuntimeManager) purgeInitContainers(pod *v1.Pod, podStatus * } count++ // Purge all init containers that match this container name - klog.V(4).Infof("Removing init container %q instance %q %d", status.Name, status.ID.ID, count) + klog.V(4).InfoS("Removing init container", "containerName", status.Name, "containerID", status.ID.ID, "count", count) if err := m.removeContainer(status.ID.ID); err != nil { utilruntime.HandleError(fmt.Errorf("failed to remove pod init container %q: %v; Skipping pod %q", status.Name, err, format.Pod(pod))) continue @@ -810,7 +833,7 @@ func findNextInitContainerToRun(pod *v1.Pod, podStatus *kubecontainer.PodStatus) func (m *kubeGenericRuntimeManager) GetContainerLogs(ctx context.Context, pod *v1.Pod, containerID kubecontainer.ContainerID, logOptions *v1.PodLogOptions, stdout, stderr io.Writer) (err error) { status, err := m.runtimeService.ContainerStatus(containerID.ID) if err != nil { - klog.V(4).Infof("failed to get container status for %v: %v", containerID.String(), err) + klog.V(4).InfoS("Failed to get container status", "containerID", containerID.String(), "err", err) return fmt.Errorf("unable to retrieve container logs for %v", containerID.String()) } return m.ReadLogs(ctx, status.GetLogPath(), containerID.ID, logOptions, stdout, stderr) @@ -866,7 +889,7 @@ func (m *kubeGenericRuntimeManager) RunInContainer(id kubecontainer.ContainerID, // Notice that we assume that the container should only be removed in non-running state, and // it will not write container logs anymore in that state. func (m *kubeGenericRuntimeManager) removeContainer(containerID string) error { - klog.V(4).Infof("Removing container %q", containerID) + klog.V(4).InfoS("Removing container", "containerID", containerID) // Call internal container post-stop lifecycle hook. if err := m.internalLifecycle.PostStopContainer(containerID); err != nil { return err diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_container_linux.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_container_linux.go index 0f4fab34c049..85ad47772e86 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_container_linux.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_container_linux.go @@ -112,13 +112,13 @@ func GetHugepageLimitsFromResources(resources v1.ResourceRequirements) []*runtim pageSize, err := v1helper.HugePageSizeFromResourceName(resourceObj) if err != nil { - klog.Warningf("Failed to get hugepage size from resource name: %v", err) + klog.InfoS("Failed to get hugepage size from resource", "object", resourceObj, "err", err) continue } sizeString, err := v1helper.HugePageUnitSizeFromByteSize(pageSize.Value()) if err != nil { - klog.Warningf("pageSize is invalid: %v", err) + klog.InfoS("Size is invalid", "object", resourceObj, "err", err) continue } requiredHugepageLimits[sizeString] = uint64(amountObj.Value()) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_container_windows.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_container_windows.go index 49fec206c4ae..5b4910e5fbfb 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_container_windows.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_container_windows.go @@ -22,10 +22,7 @@ import ( "runtime" "k8s.io/api/core/v1" - utilfeature "k8s.io/apiserver/pkg/util/feature" runtimeapi "k8s.io/cri-api/pkg/apis/runtime/v1alpha2" - kubefeatures "k8s.io/kubernetes/pkg/features" - kubeletapis "k8s.io/kubernetes/pkg/kubelet/apis" kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" "k8s.io/kubernetes/pkg/securitycontext" @@ -52,7 +49,6 @@ func (m *kubeGenericRuntimeManager) generateWindowsContainerConfig(container *v1 } cpuLimit := container.Resources.Limits.Cpu() - isolatedByHyperv := kubeletapis.ShouldIsolatedByHyperV(pod.Annotations) if !cpuLimit.IsZero() { // Note that sysinfo.NumCPU() is limited to 64 CPUs on Windows due to Processor Groups, // as only 64 processors are available for execution by a given process. This causes @@ -85,16 +81,6 @@ func (m *kubeGenericRuntimeManager) generateWindowsContainerConfig(container *v1 cpuMaximum := 10000 * cpuLimit.MilliValue() / int64(runtime.NumCPU()) / 1000 - // TODO: This should be reviewed or removed once Hyper-V support is implemented with CRI-ContainerD - // in a future release. cpuCount may or may not be required if cpuMaximum is set. - if isolatedByHyperv { - cpuCount := int64(cpuLimit.MilliValue()+999) / 1000 - wc.Resources.CpuCount = cpuCount - - if cpuCount != 0 { - cpuMaximum = cpuLimit.MilliValue() / cpuCount * 10000 / 1000 - } - } // ensure cpuMaximum is in range [1, 10000]. if cpuMaximum < 1 { cpuMaximum = 1 @@ -105,15 +91,13 @@ func (m *kubeGenericRuntimeManager) generateWindowsContainerConfig(container *v1 wc.Resources.CpuMaximum = cpuMaximum } - if !isolatedByHyperv { - // The processor resource controls are mutually exclusive on - // Windows Server Containers, the order of precedence is - // CPUCount first, then CPUMaximum. - if wc.Resources.CpuCount > 0 { - if wc.Resources.CpuMaximum > 0 { - wc.Resources.CpuMaximum = 0 - klog.Warningf("Mutually exclusive options: CPUCount priority > CPUMaximum priority on Windows Server Containers. CPUMaximum should be ignored") - } + // The processor resource controls are mutually exclusive on + // Windows Server Containers, the order of precedence is + // CPUCount first, then CPUMaximum. + if wc.Resources.CpuCount > 0 { + if wc.Resources.CpuMaximum > 0 { + wc.Resources.CpuMaximum = 0 + klog.InfoS("Mutually exclusive options: CPUCount priority > CPUMaximum priority on Windows Server Containers. CPUMaximum should be ignored") } } @@ -128,8 +112,7 @@ func (m *kubeGenericRuntimeManager) generateWindowsContainerConfig(container *v1 if username != "" { wc.SecurityContext.RunAsUsername = username } - if utilfeature.DefaultFeatureGate.Enabled(kubefeatures.WindowsGMSA) && - effectiveSc.WindowsOptions != nil && + if effectiveSc.WindowsOptions != nil && effectiveSc.WindowsOptions.GMSACredentialSpec != nil { wc.SecurityContext.CredentialSpec = *effectiveSc.WindowsOptions.GMSACredentialSpec } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_gc.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_gc.go index 8c4f786db9b1..a93cc5a88764 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_gc.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_gc.go @@ -137,13 +137,13 @@ func (cgc *containerGC) removeOldestN(containers []containerGCInfo, toRemove int ID: containers[i].id, } message := "Container is in unknown state, try killing it before removal" - if err := cgc.manager.killContainer(nil, id, containers[i].name, message, nil); err != nil { - klog.Errorf("Failed to stop container %q: %v", containers[i].id, err) + if err := cgc.manager.killContainer(nil, id, containers[i].name, message, reasonUnknown, nil); err != nil { + klog.ErrorS(err, "Failed to stop container", "containerID", containers[i].id) continue } } if err := cgc.manager.removeContainer(containers[i].id); err != nil { - klog.Errorf("Failed to remove container %q: %v", containers[i].id, err) + klog.ErrorS(err, "Failed to remove container", "containerID", containers[i].id) } } @@ -168,16 +168,16 @@ func (cgc *containerGC) removeOldestNSandboxes(sandboxes []sandboxGCInfo, toRemo // removeSandbox removes the sandbox by sandboxID. func (cgc *containerGC) removeSandbox(sandboxID string) { - klog.V(4).Infof("Removing sandbox %q", sandboxID) + klog.V(4).InfoS("Removing sandbox", "sandboxID", sandboxID) // In normal cases, kubelet should've already called StopPodSandbox before // GC kicks in. To guard against the rare cases where this is not true, try // stopping the sandbox before removing it. if err := cgc.client.StopPodSandbox(sandboxID); err != nil { - klog.Errorf("Failed to stop sandbox %q before removing: %v", sandboxID, err) + klog.ErrorS(err, "Failed to stop sandbox before removing", "sandboxID", sandboxID) return } if err := cgc.client.RemovePodSandbox(sandboxID); err != nil { - klog.Errorf("Failed to remove sandbox %q: %v", sandboxID, err) + klog.ErrorS(err, "Failed to remove sandbox", "sandboxID", sandboxID) } } @@ -342,7 +342,7 @@ func (cgc *containerGC) evictPodLogsDirectories(allSourcesReady bool) error { } err := osInterface.RemoveAll(filepath.Join(podLogsRootDirectory, name)) if err != nil { - klog.Errorf("Failed to remove pod logs directory %q: %v", name, err) + klog.ErrorS(err, "Failed to remove pod logs directory", "path", name) } } } @@ -357,7 +357,7 @@ func (cgc *containerGC) evictPodLogsDirectories(allSourcesReady bool) error { if err != nil { // TODO: we should handle container not found (i.e. container was deleted) case differently // once https://github.com/kubernetes/kubernetes/issues/63336 is resolved - klog.Infof("Error getting ContainerStatus for containerID %q: %v", containerID, err) + klog.InfoS("Error getting ContainerStatus for containerID", "containerID", containerID, "err", err) } else if status.State != runtimeapi.ContainerState_CONTAINER_EXITED { // Here is how container log rotation works (see containerLogManager#rotateLatestLog): // @@ -370,17 +370,17 @@ func (cgc *containerGC) evictPodLogsDirectories(allSourcesReady bool) error { // See https://github.com/kubernetes/kubernetes/issues/52172 // // We only remove unhealthy symlink for dead containers - klog.V(5).Infof("Container %q is still running, not removing symlink %q.", containerID, logSymlink) + klog.V(5).InfoS("Container is still running, not removing symlink", "containerID", containerID, "path", logSymlink) continue } } else { - klog.V(4).Infof("unable to obtain container Id: %v", err) + klog.V(4).InfoS("Unable to obtain container ID", "err", err) } err := osInterface.Remove(logSymlink) if err != nil { - klog.Errorf("Failed to remove container log dead symlink %q: %v", logSymlink, err) + klog.ErrorS(err, "Failed to remove container log dead symlink", "path", logSymlink) } else { - klog.V(4).Infof("removed symlink %s", logSymlink) + klog.V(4).InfoS("Removed symlink", "path", logSymlink) } } } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_image.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_image.go index 146e5aac408a..1255335bd357 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_image.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_image.go @@ -44,11 +44,11 @@ func (m *kubeGenericRuntimeManager) PullImage(image kubecontainer.ImageSpec, pul creds, withCredentials := keyring.Lookup(repoToPull) if !withCredentials { - klog.V(3).Infof("Pulling image %q without credentials", img) + klog.V(3).InfoS("Pulling image without credentials", "image", img) imageRef, err := m.imageService.PullImage(imgSpec, nil, podSandboxConfig) if err != nil { - klog.Errorf("Pull image %q failed: %v", img, err) + klog.ErrorS(err, "Failed to pull image", "image", img) return "", err } @@ -83,7 +83,7 @@ func (m *kubeGenericRuntimeManager) PullImage(image kubecontainer.ImageSpec, pul func (m *kubeGenericRuntimeManager) GetImageRef(image kubecontainer.ImageSpec) (string, error) { status, err := m.imageService.ImageStatus(toRuntimeAPIImageSpec(image)) if err != nil { - klog.Errorf("ImageStatus for image %q failed: %v", image, err) + klog.ErrorS(err, "Failed to get image status", "image", image.Image) return "", err } if status == nil { @@ -98,7 +98,7 @@ func (m *kubeGenericRuntimeManager) ListImages() ([]kubecontainer.Image, error) allImages, err := m.imageService.ListImages(nil) if err != nil { - klog.Errorf("ListImages failed: %v", err) + klog.ErrorS(err, "Failed to list images") return nil, err } @@ -119,7 +119,7 @@ func (m *kubeGenericRuntimeManager) ListImages() ([]kubecontainer.Image, error) func (m *kubeGenericRuntimeManager) RemoveImage(image kubecontainer.ImageSpec) error { err := m.imageService.RemoveImage(&runtimeapi.ImageSpec{Image: image.Image}) if err != nil { - klog.Errorf("Remove image %q failed: %v", image.Image, err) + klog.ErrorS(err, "Failed to remove image", "image", image.Image) return err } @@ -133,7 +133,7 @@ func (m *kubeGenericRuntimeManager) RemoveImage(image kubecontainer.ImageSpec) e func (m *kubeGenericRuntimeManager) ImageStats() (*kubecontainer.ImageStats, error) { allImages, err := m.imageService.ListImages(nil) if err != nil { - klog.Errorf("ListImages failed: %v", err) + klog.ErrorS(err, "Failed to list images") return nil, err } stats := &kubecontainer.ImageStats{} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_manager.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_manager.go index 7bc8e7799e6a..d83e75e300a2 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_manager.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_manager.go @@ -101,8 +101,9 @@ type kubeGenericRuntimeManager struct { runtimeHelper kubecontainer.RuntimeHelper // Health check results. - livenessManager proberesults.Manager - startupManager proberesults.Manager + livenessManager proberesults.Manager + readinessManager proberesults.Manager + startupManager proberesults.Manager // If true, enforce container cpu limits with CFS quota support cpuCFSQuota bool @@ -137,6 +138,9 @@ type kubeGenericRuntimeManager struct { // Cache last per-container error message to reduce log spam logReduction *logreduction.LogReduction + + // PodState provider instance + podStateProvider podStateProvider } // KubeGenericRuntime is a interface contains interfaces for container runtime and command. @@ -156,6 +160,7 @@ type LegacyLogProvider interface { func NewKubeGenericRuntimeManager( recorder record.EventRecorder, livenessManager proberesults.Manager, + readinessManager proberesults.Manager, startupManager proberesults.Manager, seccompProfileRoot string, machineInfo *cadvisorapi.MachineInfo, @@ -184,6 +189,7 @@ func NewKubeGenericRuntimeManager( cpuCFSQuotaPeriod: cpuCFSQuotaPeriod, seccompProfileRoot: seccompProfileRoot, livenessManager: livenessManager, + readinessManager: readinessManager, startupManager: startupManager, machineInfo: machineInfo, osInterface: osInterface, @@ -199,42 +205,43 @@ func NewKubeGenericRuntimeManager( typedVersion, err := kubeRuntimeManager.getTypedVersion() if err != nil { - klog.Errorf("Get runtime version failed: %v", err) + klog.ErrorS(err, "Get runtime version failed") return nil, err } // Only matching kubeRuntimeAPIVersion is supported now // TODO: Runtime API machinery is under discussion at https://github.com/kubernetes/kubernetes/issues/28642 if typedVersion.Version != kubeRuntimeAPIVersion { - klog.Errorf("Runtime api version %s is not supported, only %s is supported now", - typedVersion.Version, - kubeRuntimeAPIVersion) + klog.ErrorS(err, "This runtime api version is not supported", + "apiVersion", typedVersion.Version, + "supportedAPIVersion", kubeRuntimeAPIVersion) return nil, ErrVersionNotSupported } kubeRuntimeManager.runtimeName = typedVersion.RuntimeName - klog.Infof("Container runtime %s initialized, version: %s, apiVersion: %s", - typedVersion.RuntimeName, - typedVersion.RuntimeVersion, - typedVersion.RuntimeApiVersion) + klog.InfoS("Container runtime initialized", + "containerRuntime", typedVersion.RuntimeName, + "version", typedVersion.RuntimeVersion, + "apiVersion", typedVersion.RuntimeApiVersion) // If the container logs directory does not exist, create it. // TODO: create podLogsRootDirectory at kubelet.go when kubelet is refactored to // new runtime interface if _, err := osInterface.Stat(podLogsRootDirectory); os.IsNotExist(err) { if err := osInterface.MkdirAll(podLogsRootDirectory, 0755); err != nil { - klog.Errorf("Failed to create directory %q: %v", podLogsRootDirectory, err) + klog.ErrorS(err, "Failed to create pod log directory", "path", podLogsRootDirectory) } } if !utilfeature.DefaultFeatureGate.Enabled(features.KubeletCredentialProviders) && (imageCredentialProviderConfigFile != "" || imageCredentialProviderBinDir != "") { - klog.Warningf("Flags --image-credential-provider-config or --image-credential-provider-bin-dir were set but the feature gate %s was disabled, these flags will be ignored", - features.KubeletCredentialProviders) + klog.InfoS("Flags --image-credential-provider-config or --image-credential-provider-bin-dir were set but the feature gate was disabled, these flags will be ignored", + "featureGate", features.KubeletCredentialProviders) } if utilfeature.DefaultFeatureGate.Enabled(features.KubeletCredentialProviders) && (imageCredentialProviderConfigFile != "" || imageCredentialProviderBinDir != "") { if err := plugin.RegisterCredentialProviderPlugins(imageCredentialProviderConfigFile, imageCredentialProviderBinDir); err != nil { - klog.Fatalf("Failed to register CRI auth plugins: %v", err) + klog.ErrorS(err, "Failed to register CRI auth plugins") + os.Exit(1) } } kubeRuntimeManager.keyring = credentialprovider.NewDockerKeyring() @@ -248,6 +255,7 @@ func NewKubeGenericRuntimeManager( imagePullBurst) kubeRuntimeManager.runner = lifecycle.NewHandlerRunner(httpClient, kubeRuntimeManager, kubeRuntimeManager) kubeRuntimeManager.containerGC = newContainerGC(runtimeService, podStateProvider, kubeRuntimeManager) + kubeRuntimeManager.podStateProvider = podStateProvider kubeRuntimeManager.versionCache = cache.NewObjectCache( func() (interface{}, error) { @@ -335,7 +343,7 @@ func (m *kubeGenericRuntimeManager) GetPods(all bool) ([]*kubecontainer.Pod, err for i := range sandboxes { s := sandboxes[i] if s.Metadata == nil { - klog.V(4).Infof("Sandbox does not have metadata: %+v", s) + klog.V(4).InfoS("Sandbox does not have metadata", "sandbox", s) continue } podUID := kubetypes.UID(s.Metadata.Uid) @@ -349,7 +357,7 @@ func (m *kubeGenericRuntimeManager) GetPods(all bool) ([]*kubecontainer.Pod, err p := pods[podUID] converted, err := m.sandboxToKubeContainer(s) if err != nil { - klog.V(4).Infof("Convert %q sandbox %v of pod %q failed: %v", m.runtimeName, s, podUID, err) + klog.V(4).InfoS("Convert sandbox of pod failed", "runtimeName", m.runtimeName, "sandbox", s, "podUID", podUID, "err", err) continue } p.Sandboxes = append(p.Sandboxes, converted) @@ -362,7 +370,7 @@ func (m *kubeGenericRuntimeManager) GetPods(all bool) ([]*kubecontainer.Pod, err for i := range containers { c := containers[i] if c.Metadata == nil { - klog.V(4).Infof("Container does not have metadata: %+v", c) + klog.V(4).InfoS("Container does not have metadata", "container", c) continue } @@ -379,7 +387,7 @@ func (m *kubeGenericRuntimeManager) GetPods(all bool) ([]*kubecontainer.Pod, err converted, err := m.toKubeContainer(c) if err != nil { - klog.V(4).Infof("Convert %s container %v of pod %q failed: %v", m.runtimeName, c, labelledInfo.PodUID, err) + klog.V(4).InfoS("Convert container of pod failed", "runtimeName", m.runtimeName, "container", c, "podUID", labelledInfo.PodUID, "err", err) continue } @@ -395,6 +403,16 @@ func (m *kubeGenericRuntimeManager) GetPods(all bool) ([]*kubecontainer.Pod, err return result, nil } +// containerKillReason explains what killed a given container +type containerKillReason string + +const ( + reasonStartupProbe containerKillReason = "StartupProbe" + reasonLivenessProbe containerKillReason = "LivenessProbe" + reasonFailedPostStartHook containerKillReason = "FailedPostStartHook" + reasonUnknown containerKillReason = "Unknown" +) + // containerToKillInfo contains necessary information to kill a container. type containerToKillInfo struct { // The spec of the container. @@ -403,6 +421,9 @@ type containerToKillInfo struct { name string // The message indicates why the container will be killed. message string + // The reason is a clearer source of info on why a container will be killed + // TODO: replace message with reason? + reason containerKillReason } // podActions keeps information what to do for a pod. @@ -436,7 +457,7 @@ type podActions struct { // (changed, new attempt, original sandboxID if exist). func (m *kubeGenericRuntimeManager) podSandboxChanged(pod *v1.Pod, podStatus *kubecontainer.PodStatus) (bool, uint32, string) { if len(podStatus.SandboxStatuses) == 0 { - klog.V(2).Infof("No sandbox for pod %q can be found. Need to start a new one", format.Pod(pod)) + klog.V(2).InfoS("No sandbox for pod can be found. Need to start a new one", "pod", klog.KObj(pod)) return true, 0, "" } @@ -450,23 +471,24 @@ func (m *kubeGenericRuntimeManager) podSandboxChanged(pod *v1.Pod, podStatus *ku // Needs to create a new sandbox when readySandboxCount > 1 or the ready sandbox is not the latest one. sandboxStatus := podStatus.SandboxStatuses[0] if readySandboxCount > 1 { - klog.V(2).Infof("Multiple sandboxes are ready for Pod %q. Need to reconcile them", format.Pod(pod)) + klog.V(2).InfoS("Multiple sandboxes are ready for Pod. Need to reconcile them", "pod", klog.KObj(pod)) + return true, sandboxStatus.Metadata.Attempt + 1, sandboxStatus.Id } if sandboxStatus.State != runtimeapi.PodSandboxState_SANDBOX_READY { - klog.V(2).Infof("No ready sandbox for pod %q can be found. Need to start a new one", format.Pod(pod)) + klog.V(2).InfoS("No ready sandbox for pod can be found. Need to start a new one", "pod", klog.KObj(pod)) return true, sandboxStatus.Metadata.Attempt + 1, sandboxStatus.Id } // Needs to create a new sandbox when network namespace changed. if sandboxStatus.GetLinux().GetNamespaces().GetOptions().GetNetwork() != networkNamespaceForPod(pod) { - klog.V(2).Infof("Sandbox for pod %q has changed. Need to start a new one", format.Pod(pod)) + klog.V(2).InfoS("Sandbox for pod has changed. Need to start a new one", "pod", klog.KObj(pod)) return true, sandboxStatus.Metadata.Attempt + 1, "" } // Needs to create a new sandbox when the sandbox does not have an IP address. if !kubecontainer.IsHostNetworkPod(pod) && sandboxStatus.Network.Ip == "" { - klog.V(2).Infof("Sandbox for pod %q has no IP address. Need to start a new one", format.Pod(pod)) + klog.V(2).InfoS("Sandbox for pod has no IP address. Need to start a new one", "pod", klog.KObj(pod)) return true, sandboxStatus.Metadata.Attempt + 1, sandboxStatus.Id } @@ -492,7 +514,7 @@ func containerSucceeded(c *v1.Container, podStatus *kubecontainer.PodStatus) boo // computePodActions checks whether the pod spec has changed and returns the changes if true. func (m *kubeGenericRuntimeManager) computePodActions(pod *v1.Pod, podStatus *kubecontainer.PodStatus) podActions { - klog.V(5).Infof("Syncing Pod %q: %+v", format.Pod(pod), pod) + klog.V(5).InfoS("Syncing Pod", "pod", klog.KObj(pod)) createPodSandbox, attempt, sandboxID := m.podSandboxChanged(pod, podStatus) changes := podActions{ @@ -573,6 +595,7 @@ func (m *kubeGenericRuntimeManager) computePodActions(pod *v1.Pod, podStatus *ku container: next, message: fmt.Sprintf("Init container is in %q state, try killing it before restart", initLastStatus.State), + reason: reasonUnknown, } } changes.NextInitContainerToStart = next @@ -594,8 +617,8 @@ func (m *kubeGenericRuntimeManager) computePodActions(pod *v1.Pod, podStatus *ku // to it. if containerStatus != nil && containerStatus.State != kubecontainer.ContainerStateRunning { if err := m.internalLifecycle.PostStopContainer(containerStatus.ID.ID); err != nil { - klog.Errorf("internal container post-stop lifecycle hook failed for container %v in pod %v with error %v", - container.Name, pod.Name, err) + klog.ErrorS(err, "Internal container post-stop lifecycle hook failed for container in pod with error", + "containerName", container.Name, "pod", klog.KObj(pod)) } } @@ -603,8 +626,7 @@ func (m *kubeGenericRuntimeManager) computePodActions(pod *v1.Pod, podStatus *ku // need to restart it. if containerStatus == nil || containerStatus.State != kubecontainer.ContainerStateRunning { if kubecontainer.ShouldContainerBeRestarted(&container, pod, podStatus) { - message := fmt.Sprintf("Container %q of pod %q is not in the desired state and shall be started", container.Name, format.Pod(pod)) - klog.V(3).Infof(message) + klog.V(3).InfoS("Container of pod is not in the desired state and shall be started", "containerName", container.Name, "pod", klog.KObj(pod)) changes.ContainersToStart = append(changes.ContainersToStart, idx) if containerStatus != nil && containerStatus.State == kubecontainer.ContainerStateUnknown { // If container is in unknown state, we don't know whether it @@ -615,6 +637,7 @@ func (m *kubeGenericRuntimeManager) computePodActions(pod *v1.Pod, podStatus *ku container: &pod.Spec.Containers[idx], message: fmt.Sprintf("Container is in %q state, try killing it before restart", containerStatus.State), + reason: reasonUnknown, } } } @@ -622,6 +645,7 @@ func (m *kubeGenericRuntimeManager) computePodActions(pod *v1.Pod, podStatus *ku } // The container is running, but kill the container if any of the following condition is met. var message string + var reason containerKillReason restart := shouldRestartOnFailure(pod) if _, _, changed := containerChanged(&container, containerStatus); changed { message = fmt.Sprintf("Container %s definition changed", container.Name) @@ -631,9 +655,11 @@ func (m *kubeGenericRuntimeManager) computePodActions(pod *v1.Pod, podStatus *ku } else if liveness, found := m.livenessManager.Get(containerStatus.ID); found && liveness == proberesults.Failure { // If the container failed the liveness probe, we should kill it. message = fmt.Sprintf("Container %s failed liveness probe", container.Name) + reason = reasonLivenessProbe } else if startup, found := m.startupManager.Get(containerStatus.ID); found && startup == proberesults.Failure { // If the container failed the startup probe, we should kill it. message = fmt.Sprintf("Container %s failed startup probe", container.Name) + reason = reasonStartupProbe } else { // Keep the container. keepCount++ @@ -652,8 +678,9 @@ func (m *kubeGenericRuntimeManager) computePodActions(pod *v1.Pod, podStatus *ku name: containerStatus.Name, container: &pod.Spec.Containers[idx], message: message, + reason: reason, } - klog.V(2).Infof("Container %q (%q) of pod %s: %s", container.Name, containerStatus.ID, format.Pod(pod), message) + klog.V(2).InfoS("Message for Container of pod", "containerName", container.Name, "containerStatusID", containerStatus.ID, "pod", klog.KObj(pod), "containerMessage", message) } if keepCount == 0 && len(changes.ContainersToStart) == 0 { @@ -675,31 +702,31 @@ func (m *kubeGenericRuntimeManager) computePodActions(pod *v1.Pod, podStatus *ku func (m *kubeGenericRuntimeManager) SyncPod(pod *v1.Pod, podStatus *kubecontainer.PodStatus, pullSecrets []v1.Secret, backOff *flowcontrol.Backoff) (result kubecontainer.PodSyncResult) { // Step 1: Compute sandbox and container changes. podContainerChanges := m.computePodActions(pod, podStatus) - klog.V(3).Infof("computePodActions got %+v for pod %q", podContainerChanges, format.Pod(pod)) + klog.V(3).InfoS("computePodActions got for pod", "podActions", podContainerChanges, "pod", klog.KObj(pod)) if podContainerChanges.CreateSandbox { ref, err := ref.GetReference(legacyscheme.Scheme, pod) if err != nil { - klog.Errorf("Couldn't make a ref to pod %q: '%v'", format.Pod(pod), err) + klog.ErrorS(err, "Couldn't make a ref to pod", "pod", klog.KObj(pod)) } if podContainerChanges.SandboxID != "" { m.recorder.Eventf(ref, v1.EventTypeNormal, events.SandboxChanged, "Pod sandbox changed, it will be killed and re-created.") } else { - klog.V(4).Infof("SyncPod received new pod %q, will create a sandbox for it", format.Pod(pod)) + klog.V(4).InfoS("SyncPod received new pod, will create a sandbox for it", "pod", klog.KObj(pod)) } } // Step 2: Kill the pod if the sandbox has changed. if podContainerChanges.KillPod { if podContainerChanges.CreateSandbox { - klog.V(4).Infof("Stopping PodSandbox for %q, will start new one", format.Pod(pod)) + klog.V(4).InfoS("Stopping PodSandbox for pod, will start new one", "pod", klog.KObj(pod)) } else { - klog.V(4).Infof("Stopping PodSandbox for %q because all other containers are dead.", format.Pod(pod)) + klog.V(4).InfoS("Stopping PodSandbox for pod, because all other containers are dead", "pod", klog.KObj(pod)) } killResult := m.killPodWithSyncResult(pod, kubecontainer.ConvertPodStatusToRunningPod(m.runtimeName, podStatus), nil) result.AddPodSyncResult(killResult) if killResult.Error() != nil { - klog.Errorf("killPodWithSyncResult failed: %v", killResult.Error()) + klog.ErrorS(killResult.Error(), "killPodWithSyncResult failed") return } @@ -709,12 +736,12 @@ func (m *kubeGenericRuntimeManager) SyncPod(pod *v1.Pod, podStatus *kubecontaine } else { // Step 3: kill any running containers in this pod which are not to keep. for containerID, containerInfo := range podContainerChanges.ContainersToKill { - klog.V(3).Infof("Killing unwanted container %q(id=%q) for pod %q", containerInfo.name, containerID, format.Pod(pod)) + klog.V(3).InfoS("Killing unwanted container for pod", "containerName", containerInfo.name, "containerID", containerID, "pod", klog.KObj(pod)) killContainerResult := kubecontainer.NewSyncResult(kubecontainer.KillContainer, containerInfo.name) result.AddSyncResult(killContainerResult) - if err := m.killContainer(pod, containerID, containerInfo.name, containerInfo.message, nil); err != nil { + if err := m.killContainer(pod, containerID, containerInfo.name, containerInfo.message, containerInfo.reason, nil); err != nil { killContainerResult.Fail(kubecontainer.ErrKillContainer, err.Error()) - klog.Errorf("killContainer %q(id=%q) for pod %q failed: %v", containerInfo.name, containerID, format.Pod(pod), err) + klog.ErrorS(err, "killContainer for pod failed", "containerName", containerInfo.name, "containerID", containerID, "pod", klog.KObj(pod)) return } } @@ -746,30 +773,38 @@ func (m *kubeGenericRuntimeManager) SyncPod(pod *v1.Pod, podStatus *kubecontaine var msg string var err error - klog.V(4).Infof("Creating PodSandbox for pod %q", format.Pod(pod)) + klog.V(4).InfoS("Creating PodSandbox for pod", "pod", klog.KObj(pod)) createSandboxResult := kubecontainer.NewSyncResult(kubecontainer.CreatePodSandbox, format.Pod(pod)) result.AddSyncResult(createSandboxResult) podSandboxID, msg, err = m.createPodSandbox(pod, podContainerChanges.Attempt) if err != nil { + // createPodSandbox can return an error from CNI, CSI, + // or CRI if the Pod has been deleted while the POD is + // being created. If the pod has been deleted then it's + // not a real error. + if m.podStateProvider.IsPodDeleted(pod.UID) { + klog.V(4).InfoS("Pod was deleted and sandbox failed to be created", "pod", klog.KObj(pod), "podUID", pod.UID) + return + } createSandboxResult.Fail(kubecontainer.ErrCreatePodSandbox, msg) - klog.Errorf("createPodSandbox for pod %q failed: %v", format.Pod(pod), err) + klog.ErrorS(err, "CreatePodSandbox for pod failed", "pod", klog.KObj(pod)) ref, referr := ref.GetReference(legacyscheme.Scheme, pod) if referr != nil { - klog.Errorf("Couldn't make a ref to pod %q: '%v'", format.Pod(pod), referr) + klog.ErrorS(referr, "Couldn't make a ref to pod", "pod", klog.KObj(pod)) } m.recorder.Eventf(ref, v1.EventTypeWarning, events.FailedCreatePodSandBox, "Failed to create pod sandbox: %v", err) return } - klog.V(4).Infof("Created PodSandbox %q for pod %q", podSandboxID, format.Pod(pod)) + klog.V(4).InfoS("Created PodSandbox for pod", "podSandboxID", podSandboxID, "pod", klog.KObj(pod)) podSandboxStatus, err := m.runtimeService.PodSandboxStatus(podSandboxID) if err != nil { ref, referr := ref.GetReference(legacyscheme.Scheme, pod) if referr != nil { - klog.Errorf("Couldn't make a ref to pod %q: '%v'", format.Pod(pod), referr) + klog.ErrorS(referr, "Couldn't make a ref to pod", "pod", klog.KObj(pod)) } m.recorder.Eventf(ref, v1.EventTypeWarning, events.FailedStatusPodSandBox, "Unable to get pod sandbox status: %v", err) - klog.Errorf("Failed to get pod sandbox status: %v; Skipping pod %q", err, format.Pod(pod)) + klog.ErrorS(err, "Failed to get pod sandbox status; Skipping pod", "pod", klog.KObj(pod)) result.Fail(err) return } @@ -779,7 +814,7 @@ func (m *kubeGenericRuntimeManager) SyncPod(pod *v1.Pod, podStatus *kubecontaine if !kubecontainer.IsHostNetworkPod(pod) { // Overwrite the podIPs passed in the pod status, since we just started the pod sandbox. podIPs = m.determinePodSandboxIPs(pod.Namespace, pod.Name, podSandboxStatus) - klog.V(4).Infof("Determined the ip %v for pod %q after sandbox changed", podIPs, format.Pod(pod)) + klog.V(4).InfoS("Determined the ip for pod after sandbox changed", "IPs", podIPs, "pod", klog.KObj(pod)) } } @@ -797,7 +832,7 @@ func (m *kubeGenericRuntimeManager) SyncPod(pod *v1.Pod, podStatus *kubecontaine podSandboxConfig, err := m.generatePodSandboxConfig(pod, podContainerChanges.Attempt) if err != nil { message := fmt.Sprintf("GeneratePodSandboxConfig for pod %q failed: %v", format.Pod(pod), err) - klog.Error(message) + klog.ErrorS(err, "GeneratePodSandboxConfig for pod failed", "pod", klog.KObj(pod)) configPodSandboxResult.Fail(kubecontainer.ErrConfigPodSandbox, message) return } @@ -812,11 +847,11 @@ func (m *kubeGenericRuntimeManager) SyncPod(pod *v1.Pod, podStatus *kubecontaine isInBackOff, msg, err := m.doBackOff(pod, spec.container, podStatus, backOff) if isInBackOff { startContainerResult.Fail(err, msg) - klog.V(4).Infof("Backing Off restarting %v %+v in pod %v", typeName, spec.container, format.Pod(pod)) + klog.V(4).InfoS("Backing Off restarting container in pod", "containerType", typeName, "container", spec.container, "pod", klog.KObj(pod)) return err } - klog.V(4).Infof("Creating %v %+v in pod %v", typeName, spec.container, format.Pod(pod)) + klog.V(4).InfoS("Creating container in pod", "containerType", typeName, "container", spec.container, "pod", klog.KObj(pod)) // NOTE (aramase) podIPs are populated for single stack and dual stack clusters. Send only podIPs. if msg, err := m.startContainer(podSandboxID, podSandboxConfig, spec, pod, podStatus, pullSecrets, podIP, podIPs); err != nil { startContainerResult.Fail(err, msg) @@ -824,7 +859,7 @@ func (m *kubeGenericRuntimeManager) SyncPod(pod *v1.Pod, podStatus *kubecontaine // repetitive log spam switch { case err == images.ErrImagePullBackOff: - klog.V(3).Infof("%v %+v start failed in pod %v: %v: %s", typeName, spec.container, format.Pod(pod), err, msg) + klog.V(3).InfoS("Container start failed in pod", "containerType", typeName, "container", spec.container, "pod", klog.KObj(pod), "containerMessage", msg, "err", err) default: utilruntime.HandleError(fmt.Errorf("%v %+v start failed in pod %v: %v: %s", typeName, spec.container, format.Pod(pod), err, msg)) } @@ -852,7 +887,7 @@ func (m *kubeGenericRuntimeManager) SyncPod(pod *v1.Pod, podStatus *kubecontaine } // Successfully started the container; clear the entry in the failure - klog.V(4).Infof("Completed init container %q for pod %q", container.Name, format.Pod(pod)) + klog.V(4).InfoS("Completed init container for pod", "containerName", container.Name, "pod", klog.KObj(pod)) } // Step 7: start containers in podContainerChanges.ContainersToStart. @@ -878,17 +913,17 @@ func (m *kubeGenericRuntimeManager) doBackOff(pod *v1.Pod, container *v1.Contain return false, "", nil } - klog.V(3).Infof("checking backoff for container %q in pod %q", container.Name, format.Pod(pod)) + klog.V(3).InfoS("Checking backoff for container in pod", "containerName", container.Name, "pod", klog.KObj(pod)) // Use the finished time of the latest exited container as the start point to calculate whether to do back-off. ts := cStatus.FinishedAt // backOff requires a unique key to identify the container. key := getStableKey(pod, container) if backOff.IsInBackOffSince(key, ts) { - if ref, err := kubecontainer.GenerateContainerRef(pod, container); err == nil { - m.recorder.Eventf(ref, v1.EventTypeWarning, events.BackOffStartContainer, "Back-off restarting failed container") + if containerRef, err := kubecontainer.GenerateContainerRef(pod, container); err == nil { + m.recorder.Eventf(containerRef, v1.EventTypeWarning, events.BackOffStartContainer, "Back-off restarting failed container") } err := fmt.Errorf("back-off %s restarting failed container=%s pod=%s", backOff.Get(key), container.Name, format.Pod(pod)) - klog.V(3).Infof("%s", err.Error()) + klog.V(3).InfoS("Back-off restarting failed container", "err", err.Error()) return true, err.Error(), kubecontainer.ErrCrashLoopBackOff } @@ -920,7 +955,7 @@ func (m *kubeGenericRuntimeManager) killPodWithSyncResult(pod *v1.Pod, runningPo for _, podSandbox := range runningPod.Sandboxes { if err := m.runtimeService.StopPodSandbox(podSandbox.ID.ID); err != nil { killSandboxResult.Fail(kubecontainer.ErrKillPodSandbox, err.Error()) - klog.Errorf("Failed to stop sandbox %q", podSandbox.ID) + klog.ErrorS(nil, "Failed to stop sandbox", "podSandboxID", podSandbox.ID) } } @@ -948,21 +983,24 @@ func (m *kubeGenericRuntimeManager) GetPodStatus(uid kubetypes.UID, name, namesp return nil, err } - podFullName := format.Pod(&v1.Pod{ + pod := &v1.Pod{ ObjectMeta: metav1.ObjectMeta{ Name: name, Namespace: namespace, UID: uid, }, - }) - klog.V(4).Infof("getSandboxIDByPodUID got sandbox IDs %q for pod %q", podSandboxIDs, podFullName) + } + + podFullName := format.Pod(pod) + + klog.V(4).InfoS("getSandboxIDByPodUID got sandbox IDs for pod", "podSandboxID", podSandboxIDs, "pod", klog.KObj(pod)) sandboxStatuses := make([]*runtimeapi.PodSandboxStatus, len(podSandboxIDs)) podIPs := []string{} for idx, podSandboxID := range podSandboxIDs { podSandboxStatus, err := m.runtimeService.PodSandboxStatus(podSandboxID) if err != nil { - klog.Errorf("PodSandboxStatus of sandbox %q for pod %q error: %v", podSandboxID, podFullName, err) + klog.ErrorS(err, "PodSandboxStatus of sandbox for pod", "podSandboxID", podSandboxID, "pod", klog.KObj(pod)) return nil, err } sandboxStatuses[idx] = podSandboxStatus @@ -977,7 +1015,7 @@ func (m *kubeGenericRuntimeManager) GetPodStatus(uid kubetypes.UID, name, namesp containerStatuses, err := m.getPodContainerStatuses(uid, name, namespace) if err != nil { if m.logReduction.ShouldMessageBePrinted(err.Error(), podFullName) { - klog.Errorf("getPodContainerStatuses for pod %q failed: %v", podFullName, err) + klog.ErrorS(err, "getPodContainerStatuses for pod failed", "pod", klog.KObj(pod)) } return nil, err } @@ -1003,7 +1041,7 @@ func (m *kubeGenericRuntimeManager) GarbageCollect(gcPolicy kubecontainer.GCPoli func (m *kubeGenericRuntimeManager) UpdatePodCIDR(podCIDR string) error { // TODO(#35531): do we really want to write a method on this manager for each // field of the config? - klog.Infof("updating runtime config through cri with podcidr %v", podCIDR) + klog.InfoS("Updating runtime config through cri with podcidr", "CIDR", podCIDR) return m.runtimeService.UpdateRuntimeConfig( &runtimeapi.RuntimeConfig{ NetworkConfig: &runtimeapi.NetworkConfig{ diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_sandbox.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_sandbox.go index b09edd08d7f9..60cc9dbb04a1 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_sandbox.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_sandbox.go @@ -25,10 +25,8 @@ import ( v1 "k8s.io/api/core/v1" kubetypes "k8s.io/apimachinery/pkg/types" - utilfeature "k8s.io/apiserver/pkg/util/feature" runtimeapi "k8s.io/cri-api/pkg/apis/runtime/v1alpha2" "k8s.io/klog/v2" - "k8s.io/kubernetes/pkg/features" kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" "k8s.io/kubernetes/pkg/kubelet/types" "k8s.io/kubernetes/pkg/kubelet/util" @@ -39,16 +37,16 @@ import ( func (m *kubeGenericRuntimeManager) createPodSandbox(pod *v1.Pod, attempt uint32) (string, string, error) { podSandboxConfig, err := m.generatePodSandboxConfig(pod, attempt) if err != nil { - message := fmt.Sprintf("GeneratePodSandboxConfig for pod %q failed: %v", format.Pod(pod), err) - klog.Error(message) + message := fmt.Sprintf("Failed to generate sandbox config for pod %q: %v", format.Pod(pod), err) + klog.ErrorS(err, "Failed to generate sandbox config for pod", "pod", klog.KObj(pod)) return "", message, err } // Create pod logs directory err = m.osInterface.MkdirAll(podSandboxConfig.LogDirectory, 0755) if err != nil { - message := fmt.Sprintf("Create pod log directory for pod %q failed: %v", format.Pod(pod), err) - klog.Errorf(message) + message := fmt.Sprintf("Failed to create log directory for pod %q: %v", format.Pod(pod), err) + klog.ErrorS(err, "Failed to create log directory for pod", "pod", klog.KObj(pod)) return "", message, err } @@ -56,18 +54,18 @@ func (m *kubeGenericRuntimeManager) createPodSandbox(pod *v1.Pod, attempt uint32 if m.runtimeClassManager != nil { runtimeHandler, err = m.runtimeClassManager.LookupRuntimeHandler(pod.Spec.RuntimeClassName) if err != nil { - message := fmt.Sprintf("CreatePodSandbox for pod %q failed: %v", format.Pod(pod), err) + message := fmt.Sprintf("Failed to create sandbox for pod %q: %v", format.Pod(pod), err) return "", message, err } if runtimeHandler != "" { - klog.V(2).Infof("Running pod %s with RuntimeHandler %q", format.Pod(pod), runtimeHandler) + klog.V(2).InfoS("Running pod with runtime handler", "pod", klog.KObj(pod), "runtimeHandler", runtimeHandler) } } podSandBoxID, err := m.runtimeService.RunPodSandbox(podSandboxConfig, runtimeHandler) if err != nil { - message := fmt.Sprintf("CreatePodSandbox for pod %q failed: %v", format.Pod(pod), err) - klog.Error(message) + message := fmt.Sprintf("Failed to create sandbox for pod %q: %v", format.Pod(pod), err) + klog.ErrorS(err, "Failed to create sandbox for pod", "pod", klog.KObj(pod)) return "", message, err } @@ -166,11 +164,9 @@ func (m *kubeGenericRuntimeManager) generatePodSandboxLinuxConfig(pod *v1.Pod) ( } sysctls := make(map[string]string) - if utilfeature.DefaultFeatureGate.Enabled(features.Sysctls) { - if pod.Spec.SecurityContext != nil { - for _, c := range pod.Spec.SecurityContext.Sysctls { - sysctls[c.Name] = c.Value - } + if pod.Spec.SecurityContext != nil { + for _, c := range pod.Spec.SecurityContext.Sysctls { + sysctls[c.Name] = c.Value } } @@ -224,7 +220,7 @@ func (m *kubeGenericRuntimeManager) getKubeletSandboxes(all bool) ([]*runtimeapi resp, err := m.runtimeService.ListPodSandbox(filter) if err != nil { - klog.Errorf("ListPodSandbox failed: %v", err) + klog.ErrorS(err, "Failed to list pod sandboxes") return nil, err } @@ -235,7 +231,7 @@ func (m *kubeGenericRuntimeManager) getKubeletSandboxes(all bool) ([]*runtimeapi func (m *kubeGenericRuntimeManager) determinePodSandboxIPs(podNamespace, podName string, podSandbox *runtimeapi.PodSandboxStatus) []string { podIPs := make([]string, 0) if podSandbox.Network == nil { - klog.Warningf("Pod Sandbox status doesn't have network information, cannot report IPs") + klog.InfoS("Pod Sandbox status doesn't have network information, cannot report IPs", "pod", klog.KRef(podNamespace, podName)) return podIPs } @@ -245,7 +241,7 @@ func (m *kubeGenericRuntimeManager) determinePodSandboxIPs(podNamespace, podName // pick primary IP if len(podSandbox.Network.Ip) != 0 { if net.ParseIP(podSandbox.Network.Ip) == nil { - klog.Warningf("Pod Sandbox reported an unparseable IP (Primary) %v", podSandbox.Network.Ip) + klog.InfoS("Pod Sandbox reported an unparseable primary IP", "pod", klog.KRef(podNamespace, podName), "IP", podSandbox.Network.Ip) return nil } podIPs = append(podIPs, podSandbox.Network.Ip) @@ -254,7 +250,7 @@ func (m *kubeGenericRuntimeManager) determinePodSandboxIPs(podNamespace, podName // pick additional ips, if cri reported them for _, podIP := range podSandbox.Network.AdditionalIps { if nil == net.ParseIP(podIP.Ip) { - klog.Warningf("Pod Sandbox reported an unparseable IP (additional) %v", podIP.Ip) + klog.InfoS("Pod Sandbox reported an unparseable additional IP", "pod", klog.KRef(podNamespace, podName), "IP", podIP.Ip) return nil } podIPs = append(podIPs, podIP.Ip) @@ -276,7 +272,7 @@ func (m *kubeGenericRuntimeManager) getSandboxIDByPodUID(podUID kubetypes.UID, s } sandboxes, err := m.runtimeService.ListPodSandbox(filter) if err != nil { - klog.Errorf("ListPodSandbox with pod UID %q failed: %v", podUID, err) + klog.ErrorS(err, "Failed to list sandboxes for pod", "podUID", podUID) return nil, err } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/labels.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/labels.go index 6f9e15fd882e..2aaa1743ac67 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/labels.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/labels.go @@ -20,12 +20,11 @@ import ( "encoding/json" "strconv" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" kubetypes "k8s.io/apimachinery/pkg/types" "k8s.io/klog/v2" kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" "k8s.io/kubernetes/pkg/kubelet/types" - "k8s.io/kubernetes/pkg/kubelet/util/format" ) const ( @@ -129,7 +128,7 @@ func newContainerAnnotations(container *v1.Container, pod *v1.Pod, restartCount // Using json encoding so that the PreStop handler object is readable after writing as a label rawPreStop, err := json.Marshal(container.Lifecycle.PreStop) if err != nil { - klog.Errorf("Unable to marshal lifecycle PreStop handler for container %q of pod %q: %v", container.Name, format.Pod(pod), err) + klog.ErrorS(err, "Unable to marshal lifecycle PreStop handler for container", "containerName", container.Name, "pod", klog.KObj(pod)) } else { annotations[containerPreStopHandlerLabel] = string(rawPreStop) } @@ -138,7 +137,7 @@ func newContainerAnnotations(container *v1.Container, pod *v1.Pod, restartCount if len(container.Ports) > 0 { rawContainerPorts, err := json.Marshal(container.Ports) if err != nil { - klog.Errorf("Unable to marshal container ports for container %q for pod %q: %v", container.Name, format.Pod(pod), err) + klog.ErrorS(err, "Unable to marshal container ports for container", "containerName", container.Name, "pod", klog.KObj(pod)) } else { annotations[containerPortsLabel] = string(rawContainerPorts) } @@ -192,28 +191,28 @@ func getContainerInfoFromAnnotations(annotations map[string]string) *annotatedCo } if containerInfo.Hash, err = getUint64ValueFromLabel(annotations, containerHashLabel); err != nil { - klog.Errorf("Unable to get %q from annotations %q: %v", containerHashLabel, annotations, err) + klog.ErrorS(err, "Unable to get label value from annotations", "label", containerHashLabel, "annotations", annotations) } if containerInfo.RestartCount, err = getIntValueFromLabel(annotations, containerRestartCountLabel); err != nil { - klog.Errorf("Unable to get %q from annotations %q: %v", containerRestartCountLabel, annotations, err) + klog.ErrorS(err, "Unable to get label value from annotations", "label", containerRestartCountLabel, "annotations", annotations) } if containerInfo.PodDeletionGracePeriod, err = getInt64PointerFromLabel(annotations, podDeletionGracePeriodLabel); err != nil { - klog.Errorf("Unable to get %q from annotations %q: %v", podDeletionGracePeriodLabel, annotations, err) + klog.ErrorS(err, "Unable to get label value from annotations", "label", podDeletionGracePeriodLabel, "annotations", annotations) } if containerInfo.PodTerminationGracePeriod, err = getInt64PointerFromLabel(annotations, podTerminationGracePeriodLabel); err != nil { - klog.Errorf("Unable to get %q from annotations %q: %v", podTerminationGracePeriodLabel, annotations, err) + klog.ErrorS(err, "Unable to get label value from annotations", "label", podTerminationGracePeriodLabel, "annotations", annotations) } preStopHandler := &v1.Handler{} if found, err := getJSONObjectFromLabel(annotations, containerPreStopHandlerLabel, preStopHandler); err != nil { - klog.Errorf("Unable to get %q from annotations %q: %v", containerPreStopHandlerLabel, annotations, err) + klog.ErrorS(err, "Unable to get label value from annotations", "label", containerPreStopHandlerLabel, "annotations", annotations) } else if found { containerInfo.PreStopHandler = preStopHandler } containerPorts := []v1.ContainerPort{} if found, err := getJSONObjectFromLabel(annotations, containerPortsLabel, &containerPorts); err != nil { - klog.Errorf("Unable to get %q from annotations %q: %v", containerPortsLabel, annotations, err) + klog.ErrorS(err, "Unable to get label value from annotations", "label", containerPortsLabel, "annotations", annotations) } else if found { containerInfo.ContainerPorts = containerPorts } @@ -226,7 +225,7 @@ func getStringValueFromLabel(labels map[string]string, label string) string { return value } // Do not report error, because there should be many old containers without label now. - klog.V(3).Infof("Container doesn't have label %s, it may be an old or invalid container", label) + klog.V(3).InfoS("Container doesn't have requested label, it may be an old or invalid container", "label", label) // Return empty string "" for these containers, the caller will get value by other ways. return "" } @@ -241,7 +240,7 @@ func getIntValueFromLabel(labels map[string]string, label string) (int, error) { return intValue, nil } // Do not report error, because there should be many old containers without label now. - klog.V(3).Infof("Container doesn't have label %s, it may be an old or invalid container", label) + klog.V(3).InfoS("Container doesn't have requested label, it may be an old or invalid container", "label", label) // Just set the value to 0 return 0, nil } @@ -256,7 +255,7 @@ func getUint64ValueFromLabel(labels map[string]string, label string) (uint64, er return intValue, nil } // Do not report error, because there should be many old containers without label now. - klog.V(3).Infof("Container doesn't have label %s, it may be an old or invalid container", label) + klog.V(3).InfoS("Container doesn't have requested label, it may be an old or invalid container", "label", label) // Just set the value to 0 return 0, nil } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/logs/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/logs/BUILD deleted file mode 100644 index 42cde17e300f..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/logs/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["logs.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/kuberuntime/logs", - visibility = ["//visibility:public"], - deps = [ - "//pkg/kubelet/types:go_default_library", - "//pkg/util/tail:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/cri-api/pkg/apis:go_default_library", - "//staging/src/k8s.io/cri-api/pkg/apis/runtime/v1alpha2:go_default_library", - "//vendor/github.com/fsnotify/fsnotify:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["logs_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/cri-api/pkg/apis/runtime/v1alpha2:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/logs/logs.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/logs/logs.go index 80809fa4e7ad..428cc2eb65bb 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/logs/logs.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/logs/logs.go @@ -32,7 +32,7 @@ import ( "github.com/fsnotify/fsnotify" "k8s.io/klog/v2" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" internalapi "k8s.io/cri-api/pkg/apis" runtimeapi "k8s.io/cri-api/pkg/apis/runtime/v1alpha2" "k8s.io/kubernetes/pkg/kubelet/types" @@ -155,7 +155,7 @@ func parseCRILog(log []byte, msg *logMessage) error { } // Keep this forward compatible. tags := bytes.Split(log[:idx], tagDelimiter) - partial := (runtimeapi.LogTag(tags[0]) == runtimeapi.LogTagPartial) + partial := runtimeapi.LogTag(tags[0]) == runtimeapi.LogTagPartial // Trim the tailing new line if this is a partial line. if partial && len(log) > 0 && log[len(log)-1] == '\n' { log = log[:len(log)-1] @@ -303,6 +303,8 @@ func ReadLogs(ctx context.Context, path, containerID string, opts *LogOptions, r return fmt.Errorf("failed to seek %d in log file %q: %v", start, path, err) } + limitedMode := (opts.tail >= 0) && (!opts.follow) + limitedNum := opts.tail // Start parsing the logs. r := bufio.NewReader(f) // Do not create watcher here because it is not needed if `Follow` is false. @@ -313,8 +315,8 @@ func ReadLogs(ctx context.Context, path, containerID string, opts *LogOptions, r writer := newLogWriter(stdout, stderr, opts) msg := &logMessage{} for { - if stop { - klog.V(2).Infof("Finish parsing log file %q", path) + if stop || (limitedMode && limitedNum == 0) { + klog.V(2).InfoS("Finished parsing log file", "path", path) return nil } l, err := r.ReadBytes(eol[0]) @@ -361,7 +363,7 @@ func ReadLogs(ctx context.Context, path, containerID string, opts *LogOptions, r } f.Close() if err := watcher.Remove(f.Name()); err != nil && !os.IsNotExist(err) { - klog.Errorf("failed to remove file watch %q: %v", f.Name(), err) + klog.ErrorS(err, "Failed to remove file watch", "path", f.Name()) } f = newF if err := watcher.Add(f.Name()); err != nil { @@ -377,7 +379,7 @@ func ReadLogs(ctx context.Context, path, containerID string, opts *LogOptions, r if len(l) == 0 { continue } - klog.Warningf("Incomplete line in log file %q: %q", path, l) + klog.InfoS("Incomplete line in log file", "path", path, "line", l) } if parse == nil { // Initialize the log parsing function. @@ -389,18 +391,22 @@ func ReadLogs(ctx context.Context, path, containerID string, opts *LogOptions, r // Parse the log line. msg.reset() if err := parse(l, msg); err != nil { - klog.Errorf("Failed with err %v when parsing log for log file %q: %q", err, path, l) + klog.ErrorS(err, "Failed when parsing line in log file", "path", path, "line", l) continue } // Write the log line into the stream. if err := writer.write(msg); err != nil { if err == errMaximumWrite { - klog.V(2).Infof("Finish parsing log file %q, hit bytes limit %d(bytes)", path, opts.bytes) + klog.V(2).InfoS("Finished parsing log file, hit bytes limit", "path", path, "limit", opts.bytes) return nil } - klog.Errorf("Failed with err %v when writing log for log file %q: %+v", err, path, msg) + klog.ErrorS(err, "Failed when writing line to log file", "path", path, "line", msg) return err } + if limitedMode { + limitedNum-- + } + } } @@ -411,7 +417,7 @@ func isContainerRunning(id string, r internalapi.RuntimeService) (bool, error) { } // Only keep following container log when it is running. if s.State != runtimeapi.ContainerState_CONTAINER_RUNNING { - klog.V(5).Infof("Container %q is not running (state=%q)", id, s.State) + klog.V(5).InfoS("Container is not running", "containerId", id, "state", s.State) // Do not return error because it's normal that the container stops // during waiting. return false, nil @@ -445,10 +451,10 @@ func waitLogs(ctx context.Context, id string, w *fsnotify.Watcher, runtimeServic case fsnotify.Chmod: return true, true, nil default: - klog.Errorf("Unexpected fsnotify event: %v, retrying...", e) + klog.ErrorS(nil, "Received unexpected fsnotify event, retrying", "event", e) } case err := <-w.Errors: - klog.Errorf("Fsnotify watch error: %v, %d error retries remaining", err, errRetry) + klog.ErrorS(err, "Received fsnotify watch error, retrying unless no more retries left", "retries", errRetry) if errRetry == 0 { return false, false, err } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/security_context_windows.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/security_context_windows.go index 6320d217737e..343757c0098e 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/security_context_windows.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/security_context_windows.go @@ -31,7 +31,7 @@ var ( ) // verifyRunAsNonRoot verifies RunAsNonRoot on windows. -// https://github.com/kubernetes/enhancements/blob/master/keps/sig-windows/20190103-windows-node-support.md#v1container +// https://github.com/kubernetes/enhancements/tree/master/keps/sig-windows/116-windows-node-support#v1container // Windows does not have a root user, we cannot judge the root identity of the windows container by the way to judge the root(uid=0) of the linux container. // According to the discussion of sig-windows, at present, we assume that ContainerAdministrator is the windows container root user, // and then optimize this logic according to the best time. @@ -43,13 +43,15 @@ func verifyRunAsNonRoot(pod *v1.Pod, container *v1.Container, uid *int64, userna return nil } if effectiveSc.RunAsUser != nil { - klog.Warningf("Windows container does not support SecurityContext.RunAsUser, please use SecurityContext.WindowsOptions (pod: %q, container: %s)", format.Pod(pod), container.Name) + klog.InfoS("Windows container does not support SecurityContext.RunAsUser, please use SecurityContext.WindowsOptions", + "pod", klog.KObj(pod), "containerName", container.Name) } if effectiveSc.SELinuxOptions != nil { - klog.Warningf("Windows container does not support SecurityContext.SELinuxOptions, please use SecurityContext.WindowsOptions (pod: %q, container: %s)", format.Pod(pod), container.Name) + klog.InfoS("Windows container does not support SecurityContext.SELinuxOptions, please use SecurityContext.WindowsOptions", + "pod", klog.KObj(pod), "containerName", container.Name) } if effectiveSc.RunAsGroup != nil { - klog.Warningf("Windows container does not support SecurityContext.RunAsGroup (pod: %q, container: %s)", format.Pod(pod), container.Name) + klog.InfoS("Windows container does not support SecurityContext.RunAsGroup", "pod", klog.KObj(pod), "containerName", container.Name) } if effectiveSc.WindowsOptions != nil { if effectiveSc.WindowsOptions.RunAsUserName != nil { diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/leaky/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/leaky/BUILD deleted file mode 100644 index 9b5b362fa019..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/leaky/BUILD +++ /dev/null @@ -1,25 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["leaky.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/leaky", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/legacy/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/legacy/BUILD deleted file mode 100644 index c420c57af3c7..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/legacy/BUILD +++ /dev/null @@ -1,27 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["logs.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/legacy", - visibility = ["//visibility:public"], - deps = [ - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/kuberuntime:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/lifecycle/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/lifecycle/BUILD deleted file mode 100644 index d08f5ee1d94d..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/lifecycle/BUILD +++ /dev/null @@ -1,71 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "admission_failure_handler_stub.go", - "doc.go", - "handlers.go", - "interfaces.go", - "predicate.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/lifecycle", - deps = [ - "//pkg/apis/core/v1/helper:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/types:go_default_library", - "//pkg/kubelet/util/format:go_default_library", - "//pkg/scheduler/framework:go_default_library", - "//pkg/scheduler/framework/plugins/helper:go_default_library", - "//pkg/scheduler/framework/plugins/nodeaffinity:go_default_library", - "//pkg/scheduler/framework/plugins/nodename:go_default_library", - "//pkg/scheduler/framework/plugins/nodeports:go_default_library", - "//pkg/scheduler/framework/plugins/noderesources:go_default_library", - "//pkg/security/apparmor:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/io:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "handlers_test.go", - "predicate_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core/v1/helper:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/util/format:go_default_library", - "//pkg/scheduler/framework:go_default_library", - "//pkg/scheduler/framework/plugins/nodename:go_default_library", - "//pkg/scheduler/framework/plugins/nodeports:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/lifecycle/handlers.go b/vendor/k8s.io/kubernetes/pkg/kubelet/lifecycle/handlers.go index b71682f4beb5..b4f804c3d74d 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/lifecycle/handlers.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/lifecycle/handlers.go @@ -64,20 +64,20 @@ func (hr *handlerRunner) Run(containerID kubecontainer.ContainerID, pod *v1.Pod, output, err := hr.commandRunner.RunInContainer(containerID, handler.Exec.Command, 0) if err != nil { msg = fmt.Sprintf("Exec lifecycle hook (%v) for Container %q in Pod %q failed - error: %v, message: %q", handler.Exec.Command, container.Name, format.Pod(pod), err, string(output)) - klog.V(1).Infof(msg) + klog.V(1).ErrorS(err, "Exec lifecycle hook for Container in Pod failed", "execCommand", handler.Exec.Command, "containerName", container.Name, "pod", klog.KObj(pod), "message", string(output)) } return msg, err case handler.HTTPGet != nil: msg, err := hr.runHTTPHandler(pod, container, handler) if err != nil { - msg = fmt.Sprintf("Http lifecycle hook (%s) for Container %q in Pod %q failed - error: %v, message: %q", handler.HTTPGet.Path, container.Name, format.Pod(pod), err, msg) - klog.V(1).Infof(msg) + msg = fmt.Sprintf("HTTP lifecycle hook (%s) for Container %q in Pod %q failed - error: %v, message: %q", handler.HTTPGet.Path, container.Name, format.Pod(pod), err, msg) + klog.V(1).ErrorS(err, "HTTP lifecycle hook for Container in Pod failed", "path", handler.HTTPGet.Path, "containerName", container.Name, "pod", klog.KObj(pod)) } return msg, err default: err := fmt.Errorf("invalid handler: %v", handler) msg := fmt.Sprintf("Cannot run handler: %v", err) - klog.Errorf(msg) + klog.ErrorS(err, "Cannot run handler") return msg, err } } @@ -110,7 +110,7 @@ func (hr *handlerRunner) runHTTPHandler(pod *v1.Pod, container *v1.Container, ha if len(host) == 0 { status, err := hr.containerManager.GetPodStatus(pod.UID, pod.Name, pod.Namespace) if err != nil { - klog.Errorf("Unable to get pod info, event handlers may be invalid.") + klog.ErrorS(err, "Unable to get pod info, event handlers may be invalid.") return "", err } if len(status.IPs) == 0 { diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/lifecycle/predicate.go b/vendor/k8s.io/kubernetes/pkg/kubelet/lifecycle/predicate.go index a5b2bbf5a0ce..07b8792dc36c 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/lifecycle/predicate.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/lifecycle/predicate.go @@ -62,7 +62,7 @@ func NewPredicateAdmitHandler(getNodeAnyWayFunc getNodeAnyWayFuncType, admission func (w *predicateAdmitHandler) Admit(attrs *PodAdmitAttributes) PodAdmitResult { node, err := w.getNodeAnyWayFunc() if err != nil { - klog.Errorf("Cannot get Node info: %v", err) + klog.ErrorS(err, "Cannot get Node info") return PodAdmitResult{ Admit: false, Reason: "InvalidNodeInfo", @@ -76,7 +76,7 @@ func (w *predicateAdmitHandler) Admit(attrs *PodAdmitAttributes) PodAdmitResult // ensure the node has enough plugin resources for that required in pods if err = w.pluginResourceUpdateFunc(nodeInfo, attrs); err != nil { message := fmt.Sprintf("Update plugin resources failed due to %v, which is unexpected.", err) - klog.Warningf("Failed to admit pod %v - %s", format.Pod(admitPod), message) + klog.InfoS("Failed to admit pod", "pod", klog.KObj(admitPod), "message", message) return PodAdmitResult{ Admit: false, Reason: "UnexpectedAdmissionError", @@ -98,7 +98,7 @@ func (w *predicateAdmitHandler) Admit(attrs *PodAdmitAttributes) PodAdmitResult fit := len(reasons) == 0 && err == nil if err != nil { message := fmt.Sprintf("GeneralPredicates failed due to %v, which is unexpected.", err) - klog.Warningf("Failed to admit pod %v - %s", format.Pod(admitPod), message) + klog.InfoS("Failed to admit pod, GeneralPredicates failed", "pod", klog.KObj(admitPod), "err", err) return PodAdmitResult{ Admit: fit, Reason: "UnexpectedAdmissionError", @@ -110,7 +110,7 @@ func (w *predicateAdmitHandler) Admit(attrs *PodAdmitAttributes) PodAdmitResult fit = len(reasons) == 0 && err == nil if err != nil { message := fmt.Sprintf("Unexpected error while attempting to recover from admission failure: %v", err) - klog.Warningf("Failed to admit pod %v - %s", format.Pod(admitPod), message) + klog.InfoS("Failed to admit pod, unexpected error while attempting to recover from admission failure", "pod", klog.KObj(admitPod), "err", err) return PodAdmitResult{ Admit: fit, Reason: "UnexpectedAdmissionError", @@ -123,7 +123,7 @@ func (w *predicateAdmitHandler) Admit(attrs *PodAdmitAttributes) PodAdmitResult var message string if len(reasons) == 0 { message = fmt.Sprint("GeneralPredicates failed due to unknown reason, which is unexpected.") - klog.Warningf("Failed to admit pod %v - %s", format.Pod(admitPod), message) + klog.InfoS("Failed to admit pod: GeneralPredicates failed due to unknown reason, which is unexpected", "pod", klog.KObj(admitPod)) return PodAdmitResult{ Admit: fit, Reason: "UnknownReason", @@ -136,15 +136,15 @@ func (w *predicateAdmitHandler) Admit(attrs *PodAdmitAttributes) PodAdmitResult case *PredicateFailureError: reason = re.PredicateName message = re.Error() - klog.V(2).Infof("Predicate failed on Pod: %v, for reason: %v", format.Pod(admitPod), message) + klog.V(2).InfoS("Predicate failed on Pod", "pod", format.Pod(admitPod), "err", message) case *InsufficientResourceError: reason = fmt.Sprintf("OutOf%s", re.ResourceName) message = re.Error() - klog.V(2).Infof("Predicate failed on Pod: %v, for reason: %v", format.Pod(admitPod), message) + klog.V(2).InfoS("Predicate failed on Pod", "pod", format.Pod(admitPod), "err", message) default: reason = "UnexpectedPredicateFailureType" message = fmt.Sprintf("GeneralPredicates failed due to %v, which is unexpected.", r) - klog.Warningf("Failed to admit pod %v - %s", format.Pod(admitPod), message) + klog.InfoS("Failed to admit pod", "pod", klog.KObj(admitPod), "err", message) } return PodAdmitResult{ Admit: fit, diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/logs/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/logs/BUILD deleted file mode 100644 index 0b7a608c0508..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/logs/BUILD +++ /dev/null @@ -1,48 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "container_log_manager.go", - "container_log_manager_stub.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/logs", - visibility = ["//visibility:public"], - deps = [ - "//pkg/kubelet/container:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/cri-api/pkg/apis:go_default_library", - "//staging/src/k8s.io/cri-api/pkg/apis/runtime/v1alpha2:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["container_log_manager_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/container:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/cri-api/pkg/apis/runtime/v1alpha2:go_default_library", - "//staging/src/k8s.io/cri-api/pkg/apis/testing:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/logs/container_log_manager.go b/vendor/k8s.io/kubernetes/pkg/kubelet/logs/container_log_manager.go index 56e4f31169d8..148922998aa3 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/logs/container_log_manager.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/logs/container_log_manager.go @@ -179,7 +179,7 @@ func (c *containerLogManager) Start() { // Start a goroutine periodically does container log rotation. go wait.Forever(func() { if err := c.rotateLogs(); err != nil { - klog.Errorf("Failed to rotate container logs: %v", err) + klog.ErrorS(err, "Failed to rotate container logs") } }, logMonitorPeriod) } @@ -226,27 +226,27 @@ func (c *containerLogManager) rotateLogs() error { // Note that we should not block log rotate for an error of a single container. status, err := c.runtimeService.ContainerStatus(id) if err != nil { - klog.Errorf("Failed to get container status for %q: %v", id, err) + klog.ErrorS(err, "Failed to get container status", "containerID", id) continue } path := status.GetLogPath() info, err := c.osInterface.Stat(path) if err != nil { if !os.IsNotExist(err) { - klog.Errorf("Failed to stat container log %q: %v", path, err) + klog.ErrorS(err, "Failed to stat container log", "path", path) continue } // In rotateLatestLog, there are several cases that we may // lose original container log after ReopenContainerLog fails. // We try to recover it by reopening container log. if err := c.runtimeService.ReopenContainerLog(id); err != nil { - klog.Errorf("Container %q log %q doesn't exist, reopen container log failed: %v", id, path, err) + klog.ErrorS(err, "Container log doesn't exist, reopen container log failed", "containerID", id, "path", path) continue } // The container log should be recovered. info, err = c.osInterface.Stat(path) if err != nil { - klog.Errorf("Failed to stat container log %q after reopen: %v", path, err) + klog.ErrorS(err, "Failed to stat container log after reopen", "path", path) continue } } @@ -255,7 +255,7 @@ func (c *containerLogManager) rotateLogs() error { } // Perform log rotation. if err := c.rotateLog(id, path); err != nil { - klog.Errorf("Failed to rotate log %q for container %q: %v", path, id, err) + klog.ErrorS(err, "Failed to rotate log for container", "path", path, "containerID", id) continue } } @@ -412,7 +412,7 @@ func (c *containerLogManager) rotateLatestLog(id, log string) error { // This shouldn't happen. // Report an error if this happens, because we will lose original // log. - klog.Errorf("Failed to rename rotated log %q back to %q: %v, reopen container log error: %v", rotated, log, renameErr, err) + klog.ErrorS(renameErr, "Failed to rename rotated log", "rotatedLog", rotated, "newLog", log, "containerID", id) } return fmt.Errorf("failed to reopen container log %q: %v", id, err) } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/managed/cpu_shares.go b/vendor/k8s.io/kubernetes/pkg/kubelet/managed/cpu_shares.go new file mode 100644 index 000000000000..de60b6d6e755 --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/managed/cpu_shares.go @@ -0,0 +1,30 @@ +package managed + +const ( + // These limits are defined in the kernel: + // https://github.com/torvalds/linux/blob/0bddd227f3dc55975e2b8dfa7fc6f959b062a2c7/kernel/sched/sched.h#L427-L428 + MinShares = 2 + MaxShares = 262144 + + SharesPerCPU = 1024 + MilliCPUToCPU = 1000 +) + +// MilliCPUToShares converts the milliCPU to CFS shares. +func MilliCPUToShares(milliCPU int64) uint64 { + if milliCPU == 0 { + // Docker converts zero milliCPU to unset, which maps to kernel default + // for unset: 1024. Return 2 here to really match kernel default for + // zero milliCPU. + return MinShares + } + // Conceptually (milliCPU / milliCPUToCPU) * sharesPerCPU, but factored to improve rounding. + shares := (milliCPU * SharesPerCPU) / MilliCPUToCPU + if shares < MinShares { + return MinShares + } + if shares > MaxShares { + return MaxShares + } + return uint64(shares) +} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/managed/managed.go b/vendor/k8s.io/kubernetes/pkg/kubelet/managed/managed.go new file mode 100644 index 000000000000..a5ae099acb37 --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/managed/managed.go @@ -0,0 +1,100 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +package managed + +import ( + "fmt" + "os" + "strings" + + v1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" +) + +var ( + pinnedManagementEnabled bool + pinnedManagementFilename = "/etc/kubernetes/openshift-workload-pinning" + WorkloadsAnnotationPrefix = "workload.openshift.io/" + WorkloadsCapacitySuffix = "workload.openshift.io/cores" + ContainerCpuAnnotationFormat = "io.openshift.workload.%v.cpushares/%v" +) + +func init() { + readEnablementFile() +} + +func readEnablementFile() { + if _, err := os.Stat(pinnedManagementFilename); err == nil { + pinnedManagementEnabled = true + } +} + +func IsEnabled() bool { + return pinnedManagementEnabled +} + +/// IsPodManaged returns true and the name of the workload if enabled +func IsPodManaged(pod *v1.Pod) (bool, string) { + if pod.ObjectMeta.Annotations == nil { + return false, "" + } + for annotation := range pod.ObjectMeta.Annotations { + if strings.HasPrefix(annotation, WorkloadsAnnotationPrefix) { + return true, strings.TrimPrefix(annotation, WorkloadsAnnotationPrefix) + } + } + return false, "" +} + +func ModifyStaticPodForPinnedManagement(pod *v1.Pod) (bool, string) { + enabled, workloadName := IsPodManaged(pod) + if !enabled { + return false, "" + } + if pod.Annotations == nil { + pod.Annotations = make(map[string]string) + } + pod.Annotations[fmt.Sprintf("%v%v", WorkloadsAnnotationPrefix, workloadName)] = "" + updateContainers(workloadName, pod, pod.Spec.Containers) + updateContainers(workloadName, pod, pod.Spec.InitContainers) + return true, workloadName +} + +func GenerateResourceName(workloadName string) v1.ResourceName { + return v1.ResourceName(fmt.Sprintf("%v.%v", workloadName, WorkloadsCapacitySuffix)) +} + +func updateContainers(workloadName string, pod *v1.Pod, containers []v1.Container) { + for _, container := range containers { + if _, ok := container.Resources.Requests[v1.ResourceCPU]; !ok { + continue + } + if _, ok := container.Resources.Requests[v1.ResourceMemory]; !ok { + continue + } + cpuRequest := container.Resources.Requests[v1.ResourceCPU] + cpuRequestInMilli := cpuRequest.MilliValue() + resourceLimit := fmt.Sprintf("%v", MilliCPUToShares(cpuRequestInMilli)) + + containerNameKey := fmt.Sprintf(ContainerCpuAnnotationFormat, workloadName, container.Name) + pod.Annotations[containerNameKey] = resourceLimit + + newCPURequest := resource.NewMilliQuantity(cpuRequestInMilli*1000, cpuRequest.Format) + container.Resources.Requests[GenerateResourceName(workloadName)] = *newCPURequest + + delete(container.Resources.Requests, v1.ResourceCPU) + } +} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/metrics/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/metrics/BUILD deleted file mode 100644 index 9887c700e7e4..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/metrics/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["metrics.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/metrics", - deps = [ - "//pkg/features:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/kubelet/metrics/collectors:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/metrics/collectors/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/metrics/collectors/BUILD deleted file mode 100644 index 4d575d5bf275..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/metrics/collectors/BUILD +++ /dev/null @@ -1,51 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "log_metrics.go", - "resource_metrics.go", - "volume_stats.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/metrics/collectors", - visibility = ["//visibility:public"], - deps = [ - "//pkg/kubelet/metrics:go_default_library", - "//pkg/kubelet/server/stats:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//staging/src/k8s.io/kubelet/pkg/apis/stats/v1alpha1:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "log_metrics_test.go", - "resource_metrics_test.go", - "volume_stats_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/server/stats/testing:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/component-base/metrics/testutil:go_default_library", - "//staging/src/k8s.io/kubelet/pkg/apis/stats/v1alpha1:go_default_library", - "//vendor/github.com/stretchr/testify/mock:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/metrics/collectors/log_metrics.go b/vendor/k8s.io/kubernetes/pkg/kubelet/metrics/collectors/log_metrics.go index 94a5d356e10d..c542c5ba3da9 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/metrics/collectors/log_metrics.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/metrics/collectors/log_metrics.go @@ -63,7 +63,7 @@ func (c *logMetricsCollector) DescribeWithStability(ch chan<- *metrics.Desc) { func (c *logMetricsCollector) CollectWithStability(ch chan<- metrics.Metric) { podStats, err := c.podStats() if err != nil { - klog.Errorf("failed to get pod stats: %v", err) + klog.ErrorS(err, "Failed to get pod stats") return } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/metrics/collectors/resource_metrics.go b/vendor/k8s.io/kubernetes/pkg/kubelet/metrics/collectors/resource_metrics.go index 0a98bd858822..057ebfb95180 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/metrics/collectors/resource_metrics.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/metrics/collectors/resource_metrics.go @@ -115,7 +115,7 @@ func (rc *resourceMetricsCollector) CollectWithStability(ch chan<- metrics.Metri statsSummary, err := rc.provider.GetCPUAndMemoryStats() if err != nil { errorCount = 1 - klog.Warningf("Error getting summary for resourceMetric prometheus endpoint: %v", err) + klog.ErrorS(err, "Error getting summary for resourceMetric prometheus endpoint") return } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/metrics/metrics.go b/vendor/k8s.io/kubernetes/pkg/kubelet/metrics/metrics.go index d47d5ac0a6e1..6fb40e1875ba 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/metrics/metrics.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/metrics/metrics.go @@ -53,6 +53,8 @@ const ( VolumeStatsInodesKey = "volume_stats_inodes" VolumeStatsInodesFreeKey = "volume_stats_inodes_free" VolumeStatsInodesUsedKey = "volume_stats_inodes_used" + RunningPodsKey = "running_pods" + RunningContainersKey = "running_containers" // Metrics keys of remote runtime operations RuntimeOperationsKey = "runtime_operations_total" RuntimeOperationsDurationKey = "runtime_operations_duration_seconds" @@ -61,7 +63,11 @@ const ( DevicePluginRegistrationCountKey = "device_plugin_registration_total" DevicePluginAllocationDurationKey = "device_plugin_alloc_duration_seconds" // Metrics keys of pod resources operations - PodResourcesEndpointRequestsTotalKey = "pod_resources_endpoint_requests_total" + PodResourcesEndpointRequestsTotalKey = "pod_resources_endpoint_requests_total" + PodResourcesEndpointRequestsListKey = "pod_resources_endpoint_requests_list" + PodResourcesEndpointRequestsGetAllocatableKey = "pod_resources_endpoint_requests_get_allocatable" + PodResourcesEndpointErrorsListKey = "pod_resources_endpoint_errors_list" + PodResourcesEndpointErrorsGetAllocatableKey = "pod_resources_endpoint_errors_get_allocatable" // Metric keys for node config AssignedConfigKey = "node_config_assigned" @@ -90,13 +96,13 @@ var ( }, []string{NodeLabelKey}, ) - // ContainersPerPodCount is a Counter that tracks the number of containers per pod. + // ContainersPerPodCount is a Histogram that tracks the number of containers per pod. ContainersPerPodCount = metrics.NewHistogram( &metrics.HistogramOpts{ Subsystem: KubeletSubsystem, Name: "containers_per_pod_count", Help: "The number of containers per pod.", - Buckets: metrics.DefBuckets, + Buckets: metrics.ExponentialBuckets(1, 2, 5), StabilityLevel: metrics.ALPHA, }, ) @@ -291,6 +297,54 @@ var ( []string{"server_api_version"}, ) + // PodResourcesEndpointRequestsListCount is a Counter that tracks the number of requests to the PodResource List() endpoint. + // Broken down by server API version. + PodResourcesEndpointRequestsListCount = metrics.NewCounterVec( + &metrics.CounterOpts{ + Subsystem: KubeletSubsystem, + Name: PodResourcesEndpointRequestsListKey, + Help: "Number of requests to the PodResource List endpoint. Broken down by server api version.", + StabilityLevel: metrics.ALPHA, + }, + []string{"server_api_version"}, + ) + + // PodResourcesEndpointRequestsGetAllocatableCount is a Counter that tracks the number of requests to the PodResource GetAllocatableResources() endpoint. + // Broken down by server API version. + PodResourcesEndpointRequestsGetAllocatableCount = metrics.NewCounterVec( + &metrics.CounterOpts{ + Subsystem: KubeletSubsystem, + Name: PodResourcesEndpointRequestsGetAllocatableKey, + Help: "Number of requests to the PodResource GetAllocatableResources endpoint. Broken down by server api version.", + StabilityLevel: metrics.ALPHA, + }, + []string{"server_api_version"}, + ) + + // PodResourcesEndpointErrorsListCount is a Counter that tracks the number of errors returned by he PodResource List() endpoint. + // Broken down by server API version. + PodResourcesEndpointErrorsListCount = metrics.NewCounterVec( + &metrics.CounterOpts{ + Subsystem: KubeletSubsystem, + Name: PodResourcesEndpointErrorsListKey, + Help: "Number of requests to the PodResource List endpoint which returned error. Broken down by server api version.", + StabilityLevel: metrics.ALPHA, + }, + []string{"server_api_version"}, + ) + + // PodResourcesEndpointErrorsGetAllocatableCount is a Counter that tracks the number of errors returned by the PodResource GetAllocatableResources() endpoint. + // Broken down by server API version. + PodResourcesEndpointErrorsGetAllocatableCount = metrics.NewCounterVec( + &metrics.CounterOpts{ + Subsystem: KubeletSubsystem, + Name: PodResourcesEndpointErrorsGetAllocatableKey, + Help: "Number of requests to the PodResource GetAllocatableResources endpoint which returned error. Broken down by server api version.", + StabilityLevel: metrics.ALPHA, + }, + []string{"server_api_version"}, + ) + // Metrics for node config // AssignedConfig is a Gauge that is set 1 if the Kubelet has a NodeConfig assigned. @@ -362,7 +416,7 @@ var ( RunningPodCount = metrics.NewGauge( &metrics.GaugeOpts{ Subsystem: KubeletSubsystem, - Name: "running_pods", + Name: RunningPodsKey, Help: "Number of pods currently running", StabilityLevel: metrics.ALPHA, }, @@ -371,7 +425,7 @@ var ( RunningContainerCount = metrics.NewGaugeVec( &metrics.GaugeOpts{ Subsystem: KubeletSubsystem, - Name: "running_containers", + Name: RunningContainersKey, Help: "Number of containers currently running", StabilityLevel: metrics.ALPHA, }, @@ -465,7 +519,7 @@ func SetAssignedConfig(source *corev1.NodeConfigSource) error { } // clean up the old timeseries (WithLabelValues creates a new one for each distinct label set) if !AssignedConfig.Delete(assignedConfigLabels) { - klog.Warningf("Failed to delete metric for labels %v. This may result in ambiguity from multiple metrics concurrently indicating different assigned configs.", assignedConfigLabels) + klog.InfoS("Failed to delete metric for labels. This may result in ambiguity from multiple metrics concurrently indicating different assigned configs.", "labels", assignedConfigLabels) } // record the new timeseries assignedConfigLabels = labels @@ -487,7 +541,7 @@ func SetActiveConfig(source *corev1.NodeConfigSource) error { } // clean up the old timeseries (WithLabelValues creates a new one for each distinct label set) if !ActiveConfig.Delete(activeConfigLabels) { - klog.Warningf("Failed to delete metric for labels %v. This may result in ambiguity from multiple metrics concurrently indicating different active configs.", activeConfigLabels) + klog.InfoS("Failed to delete metric for labels. This may result in ambiguity from multiple metrics concurrently indicating different active configs.", "labels", activeConfigLabels) } // record the new timeseries activeConfigLabels = labels @@ -509,7 +563,7 @@ func SetLastKnownGoodConfig(source *corev1.NodeConfigSource) error { } // clean up the old timeseries (WithLabelValues creates a new one for each distinct label set) if !LastKnownGoodConfig.Delete(lastKnownGoodConfigLabels) { - klog.Warningf("Failed to delete metric for labels %v. This may result in ambiguity from multiple metrics concurrently indicating different last known good configs.", lastKnownGoodConfigLabels) + klog.InfoS("Failed to delete metric for labels. This may result in ambiguity from multiple metrics concurrently indicating different last known good configs.", "labels", lastKnownGoodConfigLabels) } // record the new timeseries lastKnownGoodConfigLabels = labels diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/network/dns/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/network/dns/BUILD deleted file mode 100644 index 438d69b76a99..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/network/dns/BUILD +++ /dev/null @@ -1,50 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["dns.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/network/dns", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/core/validation:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/util/format:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/cri-api/pkg/apis/runtime/v1alpha2:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/io:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["dns_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/cri-api/pkg/apis/runtime/v1alpha2:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/network/dns/dns.go b/vendor/k8s.io/kubernetes/pkg/kubelet/network/dns/dns.go index 0999b0618c7b..7d5dec8a7c2c 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/network/dns/dns.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/network/dns/dns.go @@ -121,9 +121,9 @@ func (c *Configurer) formDNSSearchFitsLimits(composedSearch []string, pod *v1.Po } if limitsExceeded { - log := fmt.Sprintf("Search Line limits were exceeded, some search paths have been omitted, the applied search line is: %s", strings.Join(composedSearch, " ")) - c.recorder.Event(pod, v1.EventTypeWarning, "DNSConfigForming", log) - klog.Error(log) + err := fmt.Errorf("Search Line limits were exceeded, some search paths have been omitted, the applied search line is: %s", strings.Join(composedSearch, " ")) + c.recorder.Event(pod, v1.EventTypeWarning, "DNSConfigForming", err.Error()) + klog.ErrorS(err, "Search Line limits exceeded") } return composedSearch } @@ -131,9 +131,9 @@ func (c *Configurer) formDNSSearchFitsLimits(composedSearch []string, pod *v1.Po func (c *Configurer) formDNSNameserversFitsLimits(nameservers []string, pod *v1.Pod) []string { if len(nameservers) > validation.MaxDNSNameservers { nameservers = nameservers[0:validation.MaxDNSNameservers] - log := fmt.Sprintf("Nameserver limits were exceeded, some nameservers have been omitted, the applied nameserver line is: %s", strings.Join(nameservers, " ")) - c.recorder.Event(pod, v1.EventTypeWarning, "DNSConfigForming", log) - klog.Error(log) + err := fmt.Errorf("Nameserver limits were exceeded, some nameservers have been omitted, the applied nameserver line is: %s", strings.Join(nameservers, " ")) + c.recorder.Event(pod, v1.EventTypeWarning, "DNSConfigForming", err.Error()) + klog.ErrorS(err, "Nameserver limits exceeded") } return nameservers } @@ -161,7 +161,7 @@ func (c *Configurer) CheckLimitsForResolvConf() { f, err := os.Open(c.ResolverConfig) if err != nil { c.recorder.Event(c.nodeRef, v1.EventTypeWarning, "CheckLimitsForResolvConf", err.Error()) - klog.V(4).Infof("CheckLimitsForResolvConf: " + err.Error()) + klog.V(4).InfoS("Check limits for resolv.conf failed at file open", "err", err) return } defer f.Close() @@ -169,7 +169,7 @@ func (c *Configurer) CheckLimitsForResolvConf() { _, hostSearch, _, err := parseResolvConf(f) if err != nil { c.recorder.Event(c.nodeRef, v1.EventTypeWarning, "CheckLimitsForResolvConf", err.Error()) - klog.V(4).Infof("CheckLimitsForResolvConf: " + err.Error()) + klog.V(4).InfoS("Check limits for resolv.conf failed at parse resolv.conf", "err", err) return } @@ -182,14 +182,14 @@ func (c *Configurer) CheckLimitsForResolvConf() { if len(hostSearch) > domainCountLimit { log := fmt.Sprintf("Resolv.conf file '%s' contains search line consisting of more than %d domains!", c.ResolverConfig, domainCountLimit) c.recorder.Event(c.nodeRef, v1.EventTypeWarning, "CheckLimitsForResolvConf", log) - klog.V(4).Infof("CheckLimitsForResolvConf: " + log) + klog.V(4).InfoS("Check limits for resolv.conf failed", "eventlog", log) return } if len(strings.Join(hostSearch, " ")) > validation.MaxDNSSearchListChars { log := fmt.Sprintf("Resolv.conf file '%s' contains search line which length is more than allowed %d chars!", c.ResolverConfig, validation.MaxDNSSearchListChars) c.recorder.Event(c.nodeRef, v1.EventTypeWarning, "CheckLimitsForResolvConf", log) - klog.V(4).Infof("CheckLimitsForResolvConf: " + log) + klog.V(4).InfoS("Check limits for resolv.conf failed", "eventlog", log) return } } @@ -278,7 +278,7 @@ func getPodDNSType(pod *v1.Pod) (podDNSType, error) { if !kubecontainer.IsHostNetworkPod(pod) { return podDNSCluster, nil } - // Fallback to DNSDefault for pod on hostnetowrk. + // Fallback to DNSDefault for pod on hostnetwork. fallthrough case v1.DNSDefault: return podDNSHost, nil @@ -337,7 +337,7 @@ func (c *Configurer) GetPodDNS(pod *v1.Pod) (*runtimeapi.DNSConfig, error) { dnsType, err := getPodDNSType(pod) if err != nil { - klog.Errorf("Failed to get DNS type for pod %q: %v. Falling back to DNSClusterFirst policy.", format.Pod(pod), err) + klog.ErrorS(err, "Failed to get DNS type for pod. Falling back to DNSClusterFirst policy.", "pod", klog.KObj(pod)) dnsType = podDNSCluster } switch dnsType { @@ -404,12 +404,12 @@ func (c *Configurer) SetupDNSinContainerizedMounter(mounterPath string) { if c.ResolverConfig != "" { f, err := os.Open(c.ResolverConfig) if err != nil { - klog.Error("Could not open resolverConf file") + klog.ErrorS(err, "Could not open resolverConf file") } else { defer f.Close() _, hostSearch, _, err := parseResolvConf(f) if err != nil { - klog.Errorf("Error for parsing the resolv.conf file: %v", err) + klog.ErrorS(err, "Error for parsing the resolv.conf file") } else { dnsString = dnsString + "search" for _, search := range hostSearch { @@ -420,6 +420,6 @@ func (c *Configurer) SetupDNSinContainerizedMounter(mounterPath string) { } } if err := ioutil.WriteFile(resolvePath, []byte(dnsString), 0600); err != nil { - klog.Errorf("Could not write dns nameserver in file %s, with error %v", resolvePath, err) + klog.ErrorS(err, "Could not write dns nameserver in the file", "path", resolvePath) } } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/nodeshutdown/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/nodeshutdown/BUILD deleted file mode 100644 index 125c4c43c821..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/nodeshutdown/BUILD +++ /dev/null @@ -1,127 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "nodeshutdown_manager_linux.go", - "nodeshutdown_manager_others.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/nodeshutdown", - visibility = ["//visibility:public"], - deps = select({ - "@io_bazel_rules_go//go/platform:aix": [ - "//pkg/kubelet/eviction:go_default_library", - ], - "@io_bazel_rules_go//go/platform:android": [ - "//pkg/features:go_default_library", - "//pkg/kubelet/eviction:go_default_library", - "//pkg/kubelet/nodeshutdown/systemd:go_default_library", - "//pkg/kubelet/types:go_default_library", - "//pkg/kubelet/util/format:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/github.com/godbus/dbus/v5:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "//pkg/kubelet/eviction:go_default_library", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "//pkg/kubelet/eviction:go_default_library", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "//pkg/kubelet/eviction:go_default_library", - ], - "@io_bazel_rules_go//go/platform:illumos": [ - "//pkg/kubelet/eviction:go_default_library", - ], - "@io_bazel_rules_go//go/platform:ios": [ - "//pkg/kubelet/eviction:go_default_library", - ], - "@io_bazel_rules_go//go/platform:js": [ - "//pkg/kubelet/eviction:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//pkg/features:go_default_library", - "//pkg/kubelet/eviction:go_default_library", - "//pkg/kubelet/nodeshutdown/systemd:go_default_library", - "//pkg/kubelet/types:go_default_library", - "//pkg/kubelet/util/format:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/github.com/godbus/dbus/v5:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "//pkg/kubelet/eviction:go_default_library", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "//pkg/kubelet/eviction:go_default_library", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "//pkg/kubelet/eviction:go_default_library", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "//pkg/kubelet/eviction:go_default_library", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "//pkg/kubelet/eviction:go_default_library", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "//pkg/kubelet/eviction:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/kubelet/nodeshutdown/systemd:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["nodeshutdown_manager_linux_test.go"], - embed = [":go_default_library"], - deps = select({ - "@io_bazel_rules_go//go/platform:android": [ - "//pkg/apis/scheduling:go_default_library", - "//pkg/features:go_default_library", - "//pkg/kubelet/nodeshutdown/systemd:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//pkg/apis/scheduling:go_default_library", - "//pkg/features:go_default_library", - "//pkg/kubelet/nodeshutdown/systemd:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], - "//conditions:default": [], - }), -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/nodeshutdown/nodeshutdown_manager_linux.go b/vendor/k8s.io/kubernetes/pkg/kubelet/nodeshutdown/nodeshutdown_manager_linux.go index 43adac645fcb..6e29bfd958af 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/nodeshutdown/nodeshutdown_manager_linux.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/nodeshutdown/nodeshutdown_manager_linux.go @@ -31,14 +31,15 @@ import ( "k8s.io/klog/v2" "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/pkg/kubelet/eviction" + "k8s.io/kubernetes/pkg/kubelet/lifecycle" "k8s.io/kubernetes/pkg/kubelet/nodeshutdown/systemd" kubelettypes "k8s.io/kubernetes/pkg/kubelet/types" - "k8s.io/kubernetes/pkg/kubelet/util/format" ) const ( - nodeShutdownReason = "Shutdown" - nodeShutdownMessage = "Node is shutting, evicting pods" + nodeShutdownReason = "Shutdown" + nodeShutdownMessage = "Node is shutting, evicting pods" + nodeShutdownNotAdmitMessage = "Node is in progress of shutting down, not admitting any new pods" ) var systemDbus = func() (dbusInhibiter, error) { @@ -63,8 +64,9 @@ type Manager struct { shutdownGracePeriodRequested time.Duration shutdownGracePeriodCriticalPods time.Duration - getPods eviction.ActivePodsFunc - killPod eviction.KillPodFunc + getPods eviction.ActivePodsFunc + killPod eviction.KillPodFunc + syncNodeStatus func() dbusCon dbusInhibiter inhibitLock systemd.InhibitLock @@ -76,22 +78,35 @@ type Manager struct { } // NewManager returns a new node shutdown manager. -func NewManager(getPodsFunc eviction.ActivePodsFunc, killPodFunc eviction.KillPodFunc, shutdownGracePeriodRequested, shutdownGracePeriodCriticalPods time.Duration) *Manager { - return &Manager{ +func NewManager(getPodsFunc eviction.ActivePodsFunc, killPodFunc eviction.KillPodFunc, syncNodeStatus func(), shutdownGracePeriodRequested, shutdownGracePeriodCriticalPods time.Duration) (*Manager, lifecycle.PodAdmitHandler) { + manager := &Manager{ getPods: getPodsFunc, killPod: killPodFunc, + syncNodeStatus: syncNodeStatus, shutdownGracePeriodRequested: shutdownGracePeriodRequested, shutdownGracePeriodCriticalPods: shutdownGracePeriodCriticalPods, clock: clock.RealClock{}, } + return manager, manager +} + +// Admit rejects all pods if node is shutting +func (m *Manager) Admit(attrs *lifecycle.PodAdmitAttributes) lifecycle.PodAdmitResult { + nodeShuttingDown := m.ShutdownStatus() != nil + + if nodeShuttingDown { + return lifecycle.PodAdmitResult{ + Admit: false, + Reason: nodeShutdownReason, + Message: nodeShutdownNotAdmitMessage, + } + } + return lifecycle.PodAdmitResult{Admit: true} } // Start starts the node shutdown manager and will start watching the node for shutdown events. func (m *Manager) Start() error { - if !utilfeature.DefaultFeatureGate.Enabled(features.GracefulNodeShutdown) { - return nil - } - if m.shutdownGracePeriodRequested == 0 { + if !m.isFeatureEnabled() { return nil } @@ -151,13 +166,16 @@ func (m *Manager) Start() error { for { select { case isShuttingDown := <-events: - klog.V(1).Infof("Shutdown manager detected new shutdown event, isNodeShuttingDownNow: %t", isShuttingDown) + klog.V(1).InfoS("Shutdown manager detected new shutdown event, isNodeShuttingDownNow", "event", isShuttingDown) m.nodeShuttingDownMutex.Lock() m.nodeShuttingDownNow = isShuttingDown m.nodeShuttingDownMutex.Unlock() if isShuttingDown { + // Update node status and ready condition + go m.syncNodeStatus() + m.processShutdownEvent() } else { m.aquireInhibitLock() @@ -173,13 +191,21 @@ func (m *Manager) aquireInhibitLock() error { if err != nil { return err } + if m.inhibitLock != 0 { + m.dbusCon.ReleaseInhibitLock(m.inhibitLock) + } m.inhibitLock = lock return nil } +// Returns if the feature is enabled +func (m *Manager) isFeatureEnabled() bool { + return utilfeature.DefaultFeatureGate.Enabled(features.GracefulNodeShutdown) && m.shutdownGracePeriodRequested > 0 +} + // ShutdownStatus will return an error if the node is currently shutting down. func (m *Manager) ShutdownStatus() error { - if !utilfeature.DefaultFeatureGate.Enabled(features.GracefulNodeShutdown) { + if !m.isFeatureEnabled() { return nil } @@ -193,7 +219,7 @@ func (m *Manager) ShutdownStatus() error { } func (m *Manager) processShutdownEvent() error { - klog.V(1).Infof("Shutdown manager processing shutdown event") + klog.V(1).InfoS("Shutdown manager processing shutdown event") activePods := m.getPods() nonCriticalPodGracePeriod := m.shutdownGracePeriodRequested - m.shutdownGracePeriodCriticalPods @@ -217,7 +243,7 @@ func (m *Manager) processShutdownEvent() error { gracePeriodOverride = *pod.Spec.TerminationGracePeriodSeconds } - klog.V(1).Infof("Shutdown manager killing pod %q with gracePeriod: %v seconds", format.Pod(pod), gracePeriodOverride) + klog.V(1).InfoS("Shutdown manager killing pod with gracePeriod", "pod", klog.KObj(pod), "gracePeriod", gracePeriodOverride) status := v1.PodStatus{ Phase: v1.PodFailed, @@ -227,9 +253,9 @@ func (m *Manager) processShutdownEvent() error { err := m.killPod(pod, status, &gracePeriodOverride) if err != nil { - klog.V(1).Infof("Shutdown manager failed killing pod %q: %v", format.Pod(pod), err) + klog.V(1).InfoS("Shutdown manager failed killing pod", "pod", klog.KObj(pod), "err", err) } else { - klog.V(1).Infof("Shutdown manager finished killing pod %q", format.Pod(pod)) + klog.V(1).InfoS("Shutdown manager finished killing pod", "pod", klog.KObj(pod)) } }(pod) } @@ -245,11 +271,11 @@ func (m *Manager) processShutdownEvent() error { case <-c: break case <-time.After(m.shutdownGracePeriodRequested): - klog.V(1).Infof("Shutdown manager pod killing did not complete in %v", m.shutdownGracePeriodRequested) + klog.V(1).InfoS("Shutdown manager pod killing time out", "gracePeriod", m.shutdownGracePeriodRequested) } m.dbusCon.ReleaseInhibitLock(m.inhibitLock) - klog.V(1).Infof("Shutdown manager completed processing shutdown event, node will shutdown shortly") + klog.V(1).InfoS("Shutdown manager completed processing shutdown event, node will shutdown shortly") return nil } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/nodeshutdown/nodeshutdown_manager_others.go b/vendor/k8s.io/kubernetes/pkg/kubelet/nodeshutdown/nodeshutdown_manager_others.go index 42ea8ba83f3d..44228f8be585 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/nodeshutdown/nodeshutdown_manager_others.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/nodeshutdown/nodeshutdown_manager_others.go @@ -22,14 +22,21 @@ import ( "time" "k8s.io/kubernetes/pkg/kubelet/eviction" + "k8s.io/kubernetes/pkg/kubelet/lifecycle" ) // Manager is a fake node shutdown manager for non linux platforms. type Manager struct{} // NewManager returns a fake node shutdown manager for non linux platforms. -func NewManager(getPodsFunc eviction.ActivePodsFunc, killPodFunc eviction.KillPodFunc, shutdownGracePeriodRequested, shutdownGracePeriodCriticalPods time.Duration) *Manager { - return &Manager{} +func NewManager(getPodsFunc eviction.ActivePodsFunc, killPodFunc eviction.KillPodFunc, syncNodeStatus func(), shutdownGracePeriodRequested, shutdownGracePeriodCriticalPods time.Duration) (*Manager, lifecycle.PodAdmitHandler) { + m := &Manager{} + return m, m +} + +// Admit returns a fake Pod admission which always returns true +func (m *Manager) Admit(attrs *lifecycle.PodAdmitAttributes) lifecycle.PodAdmitResult { + return lifecycle.PodAdmitResult{Admit: true} } // Start is a no-op always returning nil for non linux platforms. diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/nodeshutdown/systemd/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/nodeshutdown/systemd/BUILD deleted file mode 100644 index f13e15f2b745..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/nodeshutdown/systemd/BUILD +++ /dev/null @@ -1,54 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "inhibit_linux.go", - "inhibit_others.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/nodeshutdown/systemd", - visibility = ["//visibility:public"], - deps = select({ - "@io_bazel_rules_go//go/platform:android": [ - "//vendor/github.com/godbus/dbus/v5:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//vendor/github.com/godbus/dbus/v5:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], - "//conditions:default": [], - }), -) - -go_test( - name = "go_default_test", - srcs = ["inhibit_linux_test.go"], - embed = [":go_default_library"], - deps = select({ - "@io_bazel_rules_go//go/platform:android": [ - "//vendor/github.com/godbus/dbus/v5:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//vendor/github.com/godbus/dbus/v5:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/nodeshutdown/systemd/inhibit_linux.go b/vendor/k8s.io/kubernetes/pkg/kubelet/nodeshutdown/systemd/inhibit_linux.go index a27bd4e8f707..bf7056f3a749 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/nodeshutdown/systemd/inhibit_linux.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/nodeshutdown/systemd/inhibit_linux.go @@ -141,12 +141,13 @@ func (bus *DBusCon) MonitorShutdown() (<-chan bool, error) { select { case event := <-busChan: if event == nil || len(event.Body) == 0 { - klog.Errorf("Failed obtaining shutdown event, PrepareForShutdown event was empty") + klog.ErrorS(nil, "Failed obtaining shutdown event, PrepareForShutdown event was empty") + continue } shutdownActive, ok := event.Body[0].(bool) if !ok { - klog.Errorf("Failed obtaining shutdown event, PrepareForShutdown event was not bool type as expected") - return + klog.ErrorS(nil, "Failed obtaining shutdown event, PrepareForShutdown event was not bool type as expected") + continue } shutdownChan <- shutdownActive } @@ -178,7 +179,7 @@ InhibitDelayMaxSec=%.0f `, inhibitDelayMax.Seconds()) logindOverridePath := filepath.Join(logindConfigDirectory, kubeletLogindConf) - if err := ioutil.WriteFile(logindOverridePath, []byte(inhibitOverride), 0755); err != nil { + if err := ioutil.WriteFile(logindOverridePath, []byte(inhibitOverride), 0644); err != nil { return fmt.Errorf("failed writing logind shutdown inhibit override file %v: %v", logindOverridePath, err) } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/nodestatus/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/nodestatus/BUILD deleted file mode 100644 index c6535d8559a7..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/nodestatus/BUILD +++ /dev/null @@ -1,70 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["setters.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/nodestatus", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/core/v1/helper:go_default_library", - "//pkg/features:go_default_library", - "//pkg/kubelet/cadvisor:go_default_library", - "//pkg/kubelet/cm:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/events:go_default_library", - "//pkg/volume:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/cloud-provider:go_default_library", - "//staging/src/k8s.io/cloud-provider/api:go_default_library", - "//staging/src/k8s.io/component-base/version:go_default_library", - "//vendor/github.com/google/cadvisor/info/v1:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["setters_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/cm:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/container/testing:go_default_library", - "//pkg/kubelet/events:go_default_library", - "//pkg/kubelet/util/sliceutils:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/testing:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/rand:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/cloud-provider:go_default_library", - "//staging/src/k8s.io/cloud-provider/fake:go_default_library", - "//staging/src/k8s.io/component-base/version:go_default_library", - "//vendor/github.com/google/cadvisor/info/v1:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/nodestatus/setters.go b/vendor/k8s.io/kubernetes/pkg/kubelet/nodestatus/setters.go index 71275f1510bc..52f12178b66e 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/nodestatus/setters.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/nodestatus/setters.go @@ -26,7 +26,7 @@ import ( cadvisorapiv1 "github.com/google/cadvisor/info/v1" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/errors" @@ -83,13 +83,13 @@ func NodeAddress(nodeIPs []net.IP, // typically Kubelet.nodeIPs if err := validateNodeIPFunc(nodeIP); err != nil { return fmt.Errorf("failed to validate nodeIP: %v", err) } - klog.V(2).Infof("Using node IP: %q", nodeIP.String()) + klog.V(4).InfoS("Using node IP", "IP", nodeIP.String()) } if secondaryNodeIPSpecified { if err := validateNodeIPFunc(secondaryNodeIP); err != nil { return fmt.Errorf("failed to validate secondaryNodeIP: %v", err) } - klog.V(2).Infof("Using secondary node IP: %q", secondaryNodeIP.String()) + klog.V(4).InfoS("Using secondary node IP", "IP", secondaryNodeIP.String()) } if externalCloudProvider { @@ -191,11 +191,11 @@ func NodeAddress(nodeIPs []net.IP, // typically Kubelet.nodeIPs if existingHostnameAddress == nil { // no existing Hostname address found, add it - klog.Warningf("adding overridden hostname of %v to cloudprovider-reported addresses", hostname) + klog.InfoS("Adding overridden hostname to cloudprovider-reported addresses", "hostname", hostname) nodeAddresses = append(nodeAddresses, v1.NodeAddress{Type: v1.NodeHostName, Address: hostname}) } else if existingHostnameAddress.Address != hostname { // override the Hostname address reported by the cloud provider - klog.Warningf("replacing cloudprovider-reported hostname of %v with overridden hostname of %v", existingHostnameAddress.Address, hostname) + klog.InfoS("Replacing cloudprovider-reported hostname with overridden hostname", "cloudProviderHostname", existingHostnameAddress.Address, "overriddenHostname", hostname) existingHostnameAddress.Address = hostname } } @@ -300,7 +300,7 @@ func MachineInfo(nodeName string, node.Status.Capacity[v1.ResourceCPU] = *resource.NewMilliQuantity(0, resource.DecimalSI) node.Status.Capacity[v1.ResourceMemory] = resource.MustParse("0Gi") node.Status.Capacity[v1.ResourcePods] = *resource.NewQuantity(int64(maxPods), resource.DecimalSI) - klog.Errorf("Error getting machine info: %v", err) + klog.ErrorS(err, "Error getting machine info") } else { node.Status.NodeInfo.MachineID = info.MachineID node.Status.NodeInfo.SystemUUID = info.SystemUUID @@ -340,13 +340,13 @@ func MachineInfo(nodeName string, devicePluginCapacity, devicePluginAllocatable, removedDevicePlugins = devicePluginResourceCapacityFunc() for k, v := range devicePluginCapacity { if old, ok := node.Status.Capacity[k]; !ok || old.Value() != v.Value() { - klog.V(2).Infof("Update capacity for %s to %d", k, v.Value()) + klog.V(2).InfoS("Updated capacity for device plugin", "plugin", k, "capacity", v.Value()) } node.Status.Capacity[k] = v } for _, removedResource := range removedDevicePlugins { - klog.V(2).Infof("Set capacity for %s to 0 on device removal", removedResource) + klog.V(2).InfoS("Set capacity for removed resource to 0 on device removal", "device", removedResource) // Set the capacity of the removed resource to 0 instead of // removing the resource from the node status. This is to indicate // that the resource is managed by device plugin and had been @@ -386,7 +386,7 @@ func MachineInfo(nodeName string, for k, v := range devicePluginAllocatable { if old, ok := node.Status.Allocatable[k]; !ok || old.Value() != v.Value() { - klog.V(2).Infof("Update allocatable for %s to %d", k, v.Value()) + klog.V(2).InfoS("Updated allocatable", "device", k, "allocatable", v.Value()) } node.Status.Allocatable[k] = v } @@ -574,7 +574,7 @@ func ReadyCondition( recordEventFunc(v1.EventTypeNormal, events.NodeReady) } else { recordEventFunc(v1.EventTypeNormal, events.NodeNotReady) - klog.Infof("Node became not ready: %+v", newNodeReadyCondition) + klog.InfoS("Node became not ready", "node", klog.KObj(node), "condition", newNodeReadyCondition) } } return nil @@ -792,7 +792,7 @@ func VolumeLimits(volumePluginListFunc func() []volume.VolumePluginWithAttachLim for _, volumePlugin := range pluginWithLimits { attachLimits, err := volumePlugin.GetVolumeLimits() if err != nil { - klog.V(4).Infof("Error getting volume limit for plugin %s", volumePlugin.GetPluginName()) + klog.V(4).InfoS("Error getting volume limit for plugin", "plugin", volumePlugin.GetPluginName()) continue } for limitKey, value := range attachLimits { diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/oom/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/oom/BUILD deleted file mode 100644 index e38b2f80a37f..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/oom/BUILD +++ /dev/null @@ -1,103 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "oom_watcher_linux.go", - "oom_watcher_unsupported.go", - "types.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/oom", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - ] + select({ - "@io_bazel_rules_go//go/platform:aix": [ - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - ], - "@io_bazel_rules_go//go/platform:android": [ - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//vendor/github.com/google/cadvisor/utils/oomparser:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - ], - "@io_bazel_rules_go//go/platform:illumos": [ - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - ], - "@io_bazel_rules_go//go/platform:ios": [ - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - ], - "@io_bazel_rules_go//go/platform:js": [ - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//vendor/github.com/google/cadvisor/utils/oomparser:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - ], - "//conditions:default": [], - }), -) - -go_test( - name = "go_default_test", - srcs = ["oom_watcher_linux_test.go"], - embed = [":go_default_library"], - deps = select({ - "@io_bazel_rules_go//go/platform:android": [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//vendor/github.com/google/cadvisor/utils/oomparser:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//vendor/github.com/google/cadvisor/utils/oomparser:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/oom/oom_watcher_linux.go b/vendor/k8s.io/kubernetes/pkg/kubelet/oom/oom_watcher_linux.go index 21dc72315599..e5c7ab47a225 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/oom/oom_watcher_linux.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/oom/oom_watcher_linux.go @@ -73,7 +73,7 @@ func (ow *realWatcher) Start(ref *v1.ObjectReference) error { for event := range outStream { if event.VictimContainerName == recordEventContainerName { - klog.V(1).Infof("Got sys oom event: %v", event) + klog.V(1).InfoS("Got sys oom event", "event", event) eventMsg := "System OOM encountered" if event.ProcessName != "" && event.Pid != 0 { eventMsg = fmt.Sprintf("%s, victim process: %s, pid: %d", eventMsg, event.ProcessName, event.Pid) @@ -81,7 +81,7 @@ func (ow *realWatcher) Start(ref *v1.ObjectReference) error { ow.recorder.Eventf(ref, v1.EventTypeWarning, systemOOMEvent, eventMsg) } } - klog.Errorf("Unexpectedly stopped receiving OOM notifications") + klog.ErrorS(nil, "Unexpectedly stopped receiving OOM notifications") }() return nil } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/pleg/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/pleg/BUILD deleted file mode 100644 index 4e92c1be90f4..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/pleg/BUILD +++ /dev/null @@ -1,56 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generic.go", - "pleg.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/pleg", - deps = [ - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/metrics:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/cri-api/pkg/apis/runtime/v1alpha2:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["generic_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/container/testing:go_default_library", - "//pkg/kubelet/metrics:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/component-base/metrics/testutil:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/pleg/generic.go b/vendor/k8s.io/kubernetes/pkg/kubelet/pleg/generic.go index bad984fb0945..3b9ba505e7b4 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/pleg/generic.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/pleg/generic.go @@ -152,7 +152,7 @@ func generateEvents(podID types.UID, cid string, oldState, newState plegContaine return nil } - klog.V(4).Infof("GenericPLEG: %v/%v: %v -> %v", podID, cid, oldState, newState) + klog.V(4).InfoS("GenericPLEG", "podUID", podID, "containerID", cid, "oldState", oldState, "newState", newState) switch newState { case plegContainerRunning: return []*PodLifecycleEvent{{ID: podID, Type: ContainerStarted, Data: cid}} @@ -188,7 +188,7 @@ func (g *GenericPLEG) updateRelistTime(timestamp time.Time) { // relist queries the container runtime for list of pods/containers, compare // with the internal pods/containers, and generates events accordingly. func (g *GenericPLEG) relist() { - klog.V(5).Infof("GenericPLEG: Relisting") + klog.V(5).InfoS("GenericPLEG: Relisting") if lastRelistTime := g.getRelistTime(); !lastRelistTime.IsZero() { metrics.PLEGRelistInterval.Observe(metrics.SinceInSeconds(lastRelistTime)) @@ -202,7 +202,7 @@ func (g *GenericPLEG) relist() { // Get all the pods. podList, err := g.runtime.GetPods(true) if err != nil { - klog.Errorf("GenericPLEG: Unable to retrieve pods: %v", err) + klog.ErrorS(err, "GenericPLEG: Unable to retrieve pods") return } @@ -249,7 +249,7 @@ func (g *GenericPLEG) relist() { // parallelize if needed. if err := g.updateCache(pod, pid); err != nil { // Rely on updateCache calling GetPodStatus to log the actual error. - klog.V(4).Infof("PLEG: Ignoring events for pod %s/%s: %v", pod.Name, pod.Namespace, err) + klog.V(4).ErrorS(err, "PLEG: Ignoring events for pod", "pod", klog.KRef(pod.Namespace, pod.Name)) // make sure we try to reinspect the pod during the next relisting needsReinspection[pid] = pod @@ -273,7 +273,7 @@ func (g *GenericPLEG) relist() { case g.eventChannel <- events[i]: default: metrics.PLEGDiscardEvents.Inc() - klog.Error("event channel is full, discard this relist() cycle event") + klog.ErrorS(nil, "Event channel is full, discard this relist() cycle event") } } } @@ -281,11 +281,11 @@ func (g *GenericPLEG) relist() { if g.cacheEnabled() { // reinspect any pods that failed inspection during the previous relist if len(g.podsToReinspect) > 0 { - klog.V(5).Infof("GenericPLEG: Reinspecting pods that previously failed inspection") + klog.V(5).InfoS("GenericPLEG: Reinspecting pods that previously failed inspection") for pid, pod := range g.podsToReinspect { if err := g.updateCache(pod, pid); err != nil { // Rely on updateCache calling GetPodStatus to log the actual error. - klog.V(5).Infof("PLEG: pod %s/%s failed reinspection: %v", pod.Name, pod.Namespace, err) + klog.V(5).ErrorS(err, "PLEG: pod failed reinspection", "pod", klog.KRef(pod.Namespace, pod.Name)) needsReinspection[pid] = pod } } @@ -374,7 +374,7 @@ func (g *GenericPLEG) updateCache(pod *kubecontainer.Pod, pid types.UID) error { if pod == nil { // The pod is missing in the current relist. This means that // the pod has no visible (active or inactive) containers. - klog.V(4).Infof("PLEG: Delete status for pod %q", string(pid)) + klog.V(4).InfoS("PLEG: Delete status for pod", "podUID", string(pid)) g.cache.Delete(pid) return nil } @@ -383,7 +383,11 @@ func (g *GenericPLEG) updateCache(pod *kubecontainer.Pod, pid types.UID) error { // GetPodStatus(pod *kubecontainer.Pod) so that Docker can avoid listing // all containers again. status, err := g.runtime.GetPodStatus(pod.ID, pod.Name, pod.Namespace) - klog.V(4).Infof("PLEG: Write status for %s/%s: %#v (err: %v)", pod.Name, pod.Namespace, status, err) + if klog.V(6).Enabled() { + klog.V(6).ErrorS(err, "PLEG: Write status", "pod", klog.KRef(pod.Namespace, pod.Name), "podStatus", status) + } else { + klog.V(4).ErrorS(err, "PLEG: Write status", "pod", klog.KRef(pod.Namespace, pod.Name)) + } if err == nil { // Preserve the pod IP across cache updates if the new IP is empty. // When a pod is torn down, kubelet may race with PLEG and retrieve diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/BUILD deleted file mode 100644 index dc38fb0bc94e..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/BUILD +++ /dev/null @@ -1,55 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["plugin_manager.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/pluginmanager", - visibility = ["//visibility:public"], - deps = [ - "//pkg/kubelet/config:go_default_library", - "//pkg/kubelet/pluginmanager/cache:go_default_library", - "//pkg/kubelet/pluginmanager/metrics:go_default_library", - "//pkg/kubelet/pluginmanager/operationexecutor:go_default_library", - "//pkg/kubelet/pluginmanager/pluginwatcher:go_default_library", - "//pkg/kubelet/pluginmanager/reconciler:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/kubelet/pluginmanager/cache:all-srcs", - "//pkg/kubelet/pluginmanager/metrics:all-srcs", - "//pkg/kubelet/pluginmanager/operationexecutor:all-srcs", - "//pkg/kubelet/pluginmanager/pluginwatcher:all-srcs", - "//pkg/kubelet/pluginmanager/reconciler:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["plugin_manager_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/config:go_default_library", - "//pkg/kubelet/pluginmanager/pluginwatcher:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/kubelet/pkg/apis/pluginregistration/v1:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/cache/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/cache/BUILD deleted file mode 100644 index 8792e4323544..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/cache/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "actual_state_of_world.go", - "desired_state_of_world.go", - "types.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/pluginmanager/cache", - visibility = ["//visibility:public"], - deps = ["//vendor/k8s.io/klog/v2:go_default_library"], -) - -go_test( - name = "go_default_test", - srcs = [ - "actual_state_of_world_test.go", - "desired_state_of_world_test.go", - ], - embed = [":go_default_library"], - deps = ["//vendor/github.com/stretchr/testify/require:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/cache/actual_state_of_world.go b/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/cache/actual_state_of_world.go index 1fac9d9465a6..cdf6a0c50a9b 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/cache/actual_state_of_world.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/cache/actual_state_of_world.go @@ -91,7 +91,7 @@ func (asw *actualStateOfWorld) AddPlugin(pluginInfo PluginInfo) error { return fmt.Errorf("socket path is empty") } if _, ok := asw.socketFileToInfo[pluginInfo.SocketPath]; ok { - klog.V(2).Infof("Plugin (Path %s) exists in actual state cache", pluginInfo.SocketPath) + klog.V(2).InfoS("Plugin exists in actual state cache", "path", pluginInfo.SocketPath) } asw.socketFileToInfo[pluginInfo.SocketPath] = pluginInfo return nil diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/cache/desired_state_of_world.go b/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/cache/desired_state_of_world.go index d8f504d0b62a..a190e7707a01 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/cache/desired_state_of_world.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/cache/desired_state_of_world.go @@ -128,7 +128,7 @@ func (dsw *desiredStateOfWorld) AddOrUpdatePlugin(socketPath string) error { return fmt.Errorf("socket path is empty") } if _, ok := dsw.socketFileToInfo[socketPath]; ok { - klog.V(2).Infof("Plugin (Path %s) exists in actual state cache, timestamp will be updated", socketPath) + klog.V(2).InfoS("Plugin exists in actual state cache, timestamp will be updated", "path", socketPath) } // Update the PluginInfo object. diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/metrics/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/metrics/BUILD deleted file mode 100644 index d3e803bbafde..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/metrics/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["metrics.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/pluginmanager/metrics", - visibility = ["//visibility:public"], - deps = [ - "//pkg/kubelet/pluginmanager/cache:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["metrics_test.go"], - embed = [":go_default_library"], - deps = ["//pkg/kubelet/pluginmanager/cache:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/operationexecutor/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/operationexecutor/BUILD deleted file mode 100644 index 228b7632a864..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/operationexecutor/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "operation_executor.go", - "operation_generator.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/pluginmanager/operationexecutor", - visibility = ["//visibility:public"], - deps = [ - "//pkg/kubelet/pluginmanager/cache:go_default_library", - "//pkg/util/goroutinemap:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/kubelet/pkg/apis/pluginregistration/v1:go_default_library", - "//vendor/github.com/pkg/errors:go_default_library", - "//vendor/google.golang.org/grpc:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["operation_executor_test.go"], - embed = [":go_default_library"], - deps = ["//pkg/kubelet/pluginmanager/cache:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/operationexecutor/operation_generator.go b/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/operationexecutor/operation_generator.go index bc643e458f2e..db6e8d41acbe 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/operationexecutor/operation_generator.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/operationexecutor/operation_generator.go @@ -118,7 +118,7 @@ func (og *operationGenerator) GenerateRegisterPluginFunc( Name: infoResp.Name, }) if err != nil { - klog.Errorf("RegisterPlugin error -- failed to add plugin at socket %s, err: %v", socketPath, err) + klog.ErrorS(err, "RegisterPlugin error -- failed to add plugin", "path", socketPath) } if err := handler.RegisterPlugin(infoResp.Name, infoResp.Endpoint, infoResp.SupportedVersions); err != nil { return og.notifyPlugin(client, false, fmt.Sprintf("RegisterPlugin error -- plugin registration failed with err: %v", err)) @@ -147,7 +147,7 @@ func (og *operationGenerator) GenerateUnregisterPluginFunc( pluginInfo.Handler.DeRegisterPlugin(pluginInfo.Name) - klog.V(4).Infof("DeRegisterPlugin called for %s on %v", pluginInfo.Name, pluginInfo.Handler) + klog.V(4).InfoS("DeRegisterPlugin called", "pluginName", pluginInfo.Name, "pluginHandler", pluginInfo.Handler) return nil } return unregisterPluginFunc diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/plugin_manager.go b/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/plugin_manager.go index 2697fda873f7..79e0c8c46b7d 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/plugin_manager.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/plugin_manager.go @@ -109,14 +109,14 @@ func (pm *pluginManager) Run(sourcesReady config.SourcesReady, stopCh <-chan str defer runtime.HandleCrash() pm.desiredStateOfWorldPopulator.Start(stopCh) - klog.V(2).Infof("The desired_state_of_world populator (plugin watcher) starts") + klog.V(2).InfoS("The desired_state_of_world populator (plugin watcher) starts") - klog.Infof("Starting Kubelet Plugin Manager") + klog.InfoS("Starting Kubelet Plugin Manager") go pm.reconciler.Run(stopCh) metrics.Register(pm.actualStateOfWorld, pm.desiredStateOfWorld) <-stopCh - klog.Infof("Shutting down Kubelet Plugin Manager") + klog.InfoS("Shutting down Kubelet Plugin Manager") } func (pm *pluginManager) AddHandler(pluginType string, handler cache.PluginHandler) { diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/pluginwatcher/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/pluginwatcher/BUILD deleted file mode 100644 index 33e6cd057178..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/pluginwatcher/BUILD +++ /dev/null @@ -1,54 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "example_handler.go", - "example_plugin.go", - "plugin_watcher.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/pluginmanager/pluginwatcher", - visibility = ["//visibility:public"], - deps = [ - "//pkg/kubelet/pluginmanager/cache:go_default_library", - "//pkg/kubelet/pluginmanager/pluginwatcher/example_plugin_apis/v1beta1:go_default_library", - "//pkg/kubelet/pluginmanager/pluginwatcher/example_plugin_apis/v1beta2:go_default_library", - "//pkg/kubelet/util:go_default_library", - "//pkg/util/filesystem:go_default_library", - "//staging/src/k8s.io/kubelet/pkg/apis/pluginregistration/v1:go_default_library", - "//vendor/github.com/fsnotify/fsnotify:go_default_library", - "//vendor/google.golang.org/grpc:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["plugin_watcher_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/pluginmanager/cache:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/kubelet/pkg/apis/pluginregistration/v1:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/kubelet/pluginmanager/pluginwatcher/example_plugin_apis/v1beta1:all-srcs", - "//pkg/kubelet/pluginmanager/pluginwatcher/example_plugin_apis/v1beta2:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/pluginwatcher/example_handler.go b/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/pluginwatcher/example_handler.go index 8b8228af8674..6978826c9ced 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/pluginwatcher/example_handler.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/pluginwatcher/example_handler.go @@ -121,7 +121,7 @@ func (p *exampleHandler) EventChan(pluginName string) chan examplePluginEvent { } func (p *exampleHandler) SendEvent(pluginName string, event examplePluginEvent) { - klog.V(2).Infof("Sending %v for plugin %s over chan %v", event, pluginName, p.eventChans[pluginName]) + klog.V(2).InfoS("Sending event for plugin", "pluginName", pluginName, "event", event, "channel", p.eventChans[pluginName]) p.eventChans[pluginName] <- event } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/pluginwatcher/example_plugin.go b/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/pluginwatcher/example_plugin.go index d0859cc89672..c6be96c9ce48 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/pluginwatcher/example_plugin.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/pluginwatcher/example_plugin.go @@ -50,7 +50,7 @@ type pluginServiceV1Beta1 struct { } func (s *pluginServiceV1Beta1) GetExampleInfo(ctx context.Context, rqt *v1beta1.ExampleRequest) (*v1beta1.ExampleResponse, error) { - klog.Infof("GetExampleInfo v1beta1field: %s", rqt.V1Beta1Field) + klog.InfoS("GetExampleInfo v1beta1field", "field", rqt.V1Beta1Field) return &v1beta1.ExampleResponse{}, nil } @@ -63,7 +63,7 @@ type pluginServiceV1Beta2 struct { } func (s *pluginServiceV1Beta2) GetExampleInfo(ctx context.Context, rqt *v1beta2.ExampleRequest) (*v1beta2.ExampleResponse, error) { - klog.Infof("GetExampleInfo v1beta2_field: %s", rqt.V1Beta2Field) + klog.InfoS("GetExampleInfo v1beta2_field", "field", rqt.V1Beta2Field) return &v1beta2.ExampleResponse{}, nil } @@ -105,7 +105,7 @@ func (e *examplePlugin) GetInfo(ctx context.Context, req *registerapi.InfoReques } func (e *examplePlugin) NotifyRegistrationStatus(ctx context.Context, status *registerapi.RegistrationStatus) (*registerapi.RegistrationStatusResponse, error) { - klog.Errorf("Registration is: %v\n", status) + klog.InfoS("Notify registration status", "status", status) if e.registrationStatus != nil { e.registrationStatus <- *status @@ -116,13 +116,13 @@ func (e *examplePlugin) NotifyRegistrationStatus(ctx context.Context, status *re // Serve starts a pluginwatcher server and one or more of the plugin services func (e *examplePlugin) Serve(services ...string) error { - klog.Infof("starting example server at: %s\n", e.endpoint) + klog.InfoS("Starting example server", "endpoint", e.endpoint) lis, err := net.Listen("unix", e.endpoint) if err != nil { return err } - klog.Infof("example server started at: %s\n", e.endpoint) + klog.InfoS("Example server started", "endpoint", e.endpoint) e.grpcServer = grpc.NewServer() // Registers kubelet plugin watcher api. @@ -147,7 +147,7 @@ func (e *examplePlugin) Serve(services ...string) error { defer e.wg.Done() // Blocking call to accept incoming connections. if err := e.grpcServer.Serve(lis); err != nil { - klog.Errorf("example server stopped serving: %v", err) + klog.ErrorS(err, "Example server stopped serving") } }() @@ -155,7 +155,7 @@ func (e *examplePlugin) Serve(services ...string) error { } func (e *examplePlugin) Stop() error { - klog.Infof("Stopping example server at: %s\n", e.endpoint) + klog.InfoS("Stopping example server", "endpoint", e.endpoint) e.grpcServer.Stop() c := make(chan struct{}) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/pluginwatcher/example_plugin_apis/v1beta1/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/pluginwatcher/example_plugin_apis/v1beta1/BUILD deleted file mode 100644 index 3ae3f7e62e47..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/pluginwatcher/example_plugin_apis/v1beta1/BUILD +++ /dev/null @@ -1,29 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["api.pb.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/pluginmanager/pluginwatcher/example_plugin_apis/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//vendor/github.com/gogo/protobuf/gogoproto:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/google.golang.org/grpc:go_default_library", - "//vendor/google.golang.org/grpc/codes:go_default_library", - "//vendor/google.golang.org/grpc/status:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/pluginwatcher/example_plugin_apis/v1beta1/api.pb.go b/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/pluginwatcher/example_plugin_apis/v1beta1/api.pb.go index 7628a199b73b..bbe39bddeaa5 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/pluginwatcher/example_plugin_apis/v1beta1/api.pb.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/pluginwatcher/example_plugin_apis/v1beta1/api.pb.go @@ -491,10 +491,7 @@ func (m *ExampleRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -576,10 +573,7 @@ func (m *ExampleResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/pluginwatcher/example_plugin_apis/v1beta2/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/pluginwatcher/example_plugin_apis/v1beta2/BUILD deleted file mode 100644 index d9a103008203..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/pluginwatcher/example_plugin_apis/v1beta2/BUILD +++ /dev/null @@ -1,29 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["api.pb.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/pluginmanager/pluginwatcher/example_plugin_apis/v1beta2", - visibility = ["//visibility:public"], - deps = [ - "//vendor/github.com/gogo/protobuf/gogoproto:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/google.golang.org/grpc:go_default_library", - "//vendor/google.golang.org/grpc/codes:go_default_library", - "//vendor/google.golang.org/grpc/status:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/pluginwatcher/example_plugin_apis/v1beta2/api.pb.go b/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/pluginwatcher/example_plugin_apis/v1beta2/api.pb.go index 79f40af45202..85bfc66c3bc8 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/pluginwatcher/example_plugin_apis/v1beta2/api.pb.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/pluginwatcher/example_plugin_apis/v1beta2/api.pb.go @@ -492,10 +492,7 @@ func (m *ExampleRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { @@ -577,10 +574,7 @@ func (m *ExampleResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApi } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/pluginwatcher/plugin_watcher.go b/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/pluginwatcher/plugin_watcher.go index f4cacfe03160..b3a1a8b67e40 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/pluginwatcher/plugin_watcher.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/pluginwatcher/plugin_watcher.go @@ -49,7 +49,7 @@ func NewWatcher(sockDir string, desiredStateOfWorld cache.DesiredStateOfWorld) * // Start watches for the creation and deletion of plugin sockets at the path func (w *Watcher) Start(stopCh <-chan struct{}) error { - klog.V(2).Infof("Plugin Watcher Start at %s", w.path) + klog.V(2).InfoS("Plugin Watcher Start", "path", w.path) // Creating the directory to be watched if it doesn't exist yet, // and walks through the directory to discover the existing plugins. @@ -65,7 +65,7 @@ func (w *Watcher) Start(stopCh <-chan struct{}) error { // Traverse plugin dir and add filesystem watchers before starting the plugin processing goroutine. if err := w.traversePluginDir(w.path); err != nil { - klog.Errorf("failed to traverse plugin socket path %q, err: %v", w.path, err) + klog.ErrorS(err, "Failed to traverse plugin socket path", "path", w.path) } go func(fsWatcher *fsnotify.Watcher) { @@ -76,7 +76,7 @@ func (w *Watcher) Start(stopCh <-chan struct{}) error { if event.Op&fsnotify.Create == fsnotify.Create { err := w.handleCreateEvent(event) if err != nil { - klog.Errorf("error %v when handling create event: %s", err, event) + klog.ErrorS(err, "Error when handling create event", "event", event) } } else if event.Op&fsnotify.Remove == fsnotify.Remove { w.handleDeleteEvent(event) @@ -84,7 +84,7 @@ func (w *Watcher) Start(stopCh <-chan struct{}) error { continue case err := <-fsWatcher.Errors: if err != nil { - klog.Errorf("fsWatcher received error: %v", err) + klog.ErrorS(err, "FsWatcher received error") } continue case <-stopCh: @@ -98,7 +98,7 @@ func (w *Watcher) Start(stopCh <-chan struct{}) error { } func (w *Watcher) init() error { - klog.V(4).Infof("Ensuring Plugin directory at %s ", w.path) + klog.V(4).InfoS("Ensuring Plugin directory", "path", w.path) if err := w.fs.MkdirAll(w.path, 0755); err != nil { return fmt.Errorf("error (re-)creating root %s: %v", w.path, err) @@ -122,7 +122,7 @@ func (w *Watcher) traversePluginDir(dir string) error { return fmt.Errorf("error accessing path: %s error: %v", path, err) } - klog.Errorf("error accessing path: %s error: %v", path, err) + klog.ErrorS(err, "Error accessing path", "path", path) return nil } @@ -143,10 +143,10 @@ func (w *Watcher) traversePluginDir(dir string) error { } //TODO: Handle errors by taking corrective measures if err := w.handleCreateEvent(event); err != nil { - klog.Errorf("error %v when handling create event: %s", err, event) + klog.ErrorS(err, "Error when handling create", "event", event) } default: - klog.V(5).Infof("Ignoring file %s with mode %v", path, mode) + klog.V(5).InfoS("Ignoring file", "path", path, "mode", mode) } return nil @@ -157,15 +157,21 @@ func (w *Watcher) traversePluginDir(dir string) error { // Files names: // - MUST NOT start with a '.' func (w *Watcher) handleCreateEvent(event fsnotify.Event) error { - klog.V(6).Infof("Handling create event: %v", event) + klog.V(6).InfoS("Handling create event", "event", event) fi, err := os.Stat(event.Name) + // TODO: This is a workaround for Windows 20H2 issue for os.Stat(). Please see + // microsoft/Windows-Containers#97 for details. + // Once the issue is resvolved, the following os.Lstat() is not needed. + if err != nil && runtime.GOOS == "windows" { + fi, err = os.Lstat(event.Name) + } if err != nil { return fmt.Errorf("stat file %s failed: %v", event.Name, err) } if strings.HasPrefix(fi.Name(), ".") { - klog.V(5).Infof("Ignoring file (starts with '.'): %s", fi.Name()) + klog.V(5).InfoS("Ignoring file (starts with '.')", "path", fi.Name()) return nil } @@ -175,7 +181,7 @@ func (w *Watcher) handleCreateEvent(event fsnotify.Event) error { return fmt.Errorf("failed to determine if file: %s is a unix domain socket: %v", event.Name, err) } if !isSocket { - klog.V(5).Infof("Ignoring non socket file %s", fi.Name()) + klog.V(5).InfoS("Ignoring non socket file", "path", fi.Name()) return nil } @@ -194,7 +200,7 @@ func (w *Watcher) handlePluginRegistration(socketPath string) error { // a possibility that it has been deleted and recreated again before it is // removed from the desired world cache, so we still need to call AddOrUpdatePlugin // in this case to update the timestamp - klog.V(2).Infof("Adding socket path or updating timestamp %s to desired state cache", socketPath) + klog.V(2).InfoS("Adding socket path or updating timestamp to desired state cache", "path", socketPath) err := w.desiredStateOfWorld.AddOrUpdatePlugin(socketPath) if err != nil { return fmt.Errorf("error adding socket path %s or updating timestamp to desired state cache: %v", socketPath, err) @@ -203,9 +209,9 @@ func (w *Watcher) handlePluginRegistration(socketPath string) error { } func (w *Watcher) handleDeleteEvent(event fsnotify.Event) { - klog.V(6).Infof("Handling delete event: %v", event) + klog.V(6).InfoS("Handling delete event", "event", event) socketPath := event.Name - klog.V(2).Infof("Removing socket path %s from desired state cache", socketPath) + klog.V(2).InfoS("Removing socket path from desired state cache", "path", socketPath) w.desiredStateOfWorld.RemovePlugin(socketPath) } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/reconciler/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/reconciler/BUILD deleted file mode 100644 index d4f4962f9f77..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/reconciler/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["reconciler.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/pluginmanager/reconciler", - visibility = ["//visibility:public"], - deps = [ - "//pkg/kubelet/pluginmanager/cache:go_default_library", - "//pkg/kubelet/pluginmanager/operationexecutor:go_default_library", - "//pkg/util/goroutinemap:go_default_library", - "//pkg/util/goroutinemap/exponentialbackoff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["reconciler_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/pluginmanager/cache:go_default_library", - "//pkg/kubelet/pluginmanager/operationexecutor:go_default_library", - "//pkg/kubelet/pluginmanager/pluginwatcher:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/kubelet/pkg/apis/pluginregistration/v1:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/reconciler/reconciler.go b/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/reconciler/reconciler.go index 2f12da550653..d8f104eb8092 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/reconciler/reconciler.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/pluginmanager/reconciler/reconciler.go @@ -100,7 +100,11 @@ func (rc *reconciler) getHandlers() map[string]cache.PluginHandler { rc.RLock() defer rc.RUnlock() - return rc.handlers + var copyHandlers = make(map[string]cache.PluginHandler) + for pluginType, handler := range rc.handlers { + copyHandlers[pluginType] = handler + } + return copyHandlers } func (rc *reconciler) reconcile() { @@ -118,7 +122,7 @@ func (rc *reconciler) reconcile() { // with the same socket path but different timestamp. for _, dswPlugin := range rc.desiredStateOfWorld.GetPluginsToRegister() { if dswPlugin.SocketPath == registeredPlugin.SocketPath && dswPlugin.Timestamp != registeredPlugin.Timestamp { - klog.V(5).Infof(registeredPlugin.GenerateMsgDetailed("An updated version of plugin has been found, unregistering the plugin first before reregistering", "")) + klog.V(5).InfoS("An updated version of plugin has been found, unregistering the plugin first before reregistering", "plugin", registeredPlugin) unregisterPlugin = true break } @@ -126,17 +130,17 @@ func (rc *reconciler) reconcile() { } if unregisterPlugin { - klog.V(5).Infof(registeredPlugin.GenerateMsgDetailed("Starting operationExecutor.UnregisterPlugin", "")) + klog.V(5).InfoS("Starting operationExecutor.UnregisterPlugin", "plugin", registeredPlugin) err := rc.operationExecutor.UnregisterPlugin(registeredPlugin, rc.actualStateOfWorld) if err != nil && !goroutinemap.IsAlreadyExists(err) && !exponentialbackoff.IsExponentialBackoff(err) { // Ignore goroutinemap.IsAlreadyExists and exponentialbackoff.IsExponentialBackoff errors, they are expected. // Log all other errors. - klog.Errorf(registeredPlugin.GenerateErrorDetailed("operationExecutor.UnregisterPlugin failed", err).Error()) + klog.ErrorS(err, "OperationExecutor.UnregisterPlugin failed", "plugin", registeredPlugin) } if err == nil { - klog.V(1).Infof(registeredPlugin.GenerateMsgDetailed("operationExecutor.UnregisterPlugin started", "")) + klog.V(1).InfoS("OperationExecutor.UnregisterPlugin started", "plugin", registeredPlugin) } } } @@ -144,16 +148,16 @@ func (rc *reconciler) reconcile() { // Ensure plugins that should be registered are registered for _, pluginToRegister := range rc.desiredStateOfWorld.GetPluginsToRegister() { if !rc.actualStateOfWorld.PluginExistsWithCorrectTimestamp(pluginToRegister) { - klog.V(5).Infof(pluginToRegister.GenerateMsgDetailed("Starting operationExecutor.RegisterPlugin", "")) + klog.V(5).InfoS("Starting operationExecutor.RegisterPlugin", "plugin", pluginToRegister) err := rc.operationExecutor.RegisterPlugin(pluginToRegister.SocketPath, pluginToRegister.Timestamp, rc.getHandlers(), rc.actualStateOfWorld) if err != nil && !goroutinemap.IsAlreadyExists(err) && !exponentialbackoff.IsExponentialBackoff(err) { // Ignore goroutinemap.IsAlreadyExists and exponentialbackoff.IsExponentialBackoff errors, they are expected. - klog.Errorf(pluginToRegister.GenerateErrorDetailed("operationExecutor.RegisterPlugin failed", err).Error()) + klog.ErrorS(err, "OperationExecutor.RegisterPlugin failed", "plugin", pluginToRegister) } if err == nil { - klog.V(1).Infof(pluginToRegister.GenerateMsgDetailed("operationExecutor.RegisterPlugin started", "")) + klog.V(1).InfoS("OperationExecutor.RegisterPlugin started", "plugin", pluginToRegister) } } } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/pod/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/pod/BUILD deleted file mode 100644 index 78a3b0f46326..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/pod/BUILD +++ /dev/null @@ -1,67 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "mirror_client.go", - "pod_manager.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/pod", - deps = [ - "//pkg/kubelet/configmap:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/secret:go_default_library", - "//pkg/kubelet/types:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "mirror_client_test.go", - "pod_manager_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/configmap:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/pod/testing:go_default_library", - "//pkg/kubelet/secret:go_default_library", - "//pkg/kubelet/types:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/kubelet/pod/testing:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/pod/mirror_client.go b/vendor/k8s.io/kubernetes/pkg/kubelet/pod/mirror_client.go index 6cfa476bda20..e349a22bbfeb 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/pod/mirror_client.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/pod/mirror_client.go @@ -119,17 +119,17 @@ func (mc *basicMirrorClient) DeleteMirrorPod(podFullName string, uid *types.UID) } name, namespace, err := kubecontainer.ParsePodFullName(podFullName) if err != nil { - klog.Errorf("Failed to parse a pod full name %q", podFullName) + klog.ErrorS(err, "Failed to parse a pod full name", "podFullName", podFullName) return false, err } - klog.V(2).Infof("Deleting a mirror pod %q (uid %#v)", podFullName, uid) + klog.V(2).InfoS("Deleting a mirror pod", "pod", klog.KRef(namespace, name), "podUID", uid) var GracePeriodSeconds int64 if err := mc.apiserverClient.CoreV1().Pods(namespace).Delete(context.TODO(), name, metav1.DeleteOptions{GracePeriodSeconds: &GracePeriodSeconds, Preconditions: &metav1.Preconditions{UID: uid}}); err != nil { // Unfortunately, there's no generic error for failing a precondition if !(apierrors.IsNotFound(err) || apierrors.IsConflict(err)) { // We should return the error here, but historically this routine does // not return an error unless it can't parse the pod name - klog.Errorf("Failed deleting a mirror pod %q: %v", podFullName, err) + klog.ErrorS(err, "Failed deleting a mirror pod", "pod", klog.KRef(namespace, name)) } return false, nil } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/pod_container_deletor.go b/vendor/k8s.io/kubernetes/pkg/kubelet/pod_container_deletor.go index 4000cfb9c181..975148ce4e50 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/pod_container_deletor.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/pod_container_deletor.go @@ -49,7 +49,7 @@ func newPodContainerDeletor(runtime kubecontainer.Runtime, containersToKeep int) for { id := <-buffer if err := runtime.DeleteContainer(id); err != nil { - klog.Warningf("[pod_container_deletor] DeleteContainer returned error for (id=%v): %v", id, err) + klog.InfoS("DeleteContainer returned error", "containerID", id, "err", err) } } }, 0, wait.NeverStop) @@ -76,7 +76,7 @@ func getContainersToDeleteInPod(filterContainerID string, podStatus *kubecontain }(filterContainerID, podStatus) if filterContainerID != "" && matchedContainer == nil { - klog.Warningf("Container %q not found in pod's containers", filterContainerID) + klog.InfoS("Container not found in pod's containers", "containerID", filterContainerID) return containerStatusbyCreatedList{} } @@ -110,7 +110,7 @@ func (p *podContainerDeletor) deleteContainersInPod(filterContainerID string, po select { case p.worker <- candidate.ID: default: - klog.Warningf("Failed to issue the request to remove container %v", candidate.ID) + klog.InfoS("Failed to issue the request to remove container", "containerID", candidate.ID) } } } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/pod_workers.go b/vendor/k8s.io/kubernetes/pkg/kubelet/pod_workers.go index 2fecf534b719..fcf059f56e33 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/pod_workers.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/pod_workers.go @@ -33,7 +33,6 @@ import ( "k8s.io/kubernetes/pkg/kubelet/events" "k8s.io/kubernetes/pkg/kubelet/eviction" kubetypes "k8s.io/kubernetes/pkg/kubelet/types" - "k8s.io/kubernetes/pkg/kubelet/util/format" "k8s.io/kubernetes/pkg/kubelet/util/queue" ) @@ -188,7 +187,7 @@ func (p *podWorkers) managePodLoop(podUpdates <-chan UpdatePodOptions) { } if err != nil { // IMPORTANT: we do not log errors here, the syncPodFn is responsible for logging errors - klog.Errorf("Error syncing pod %s (%q), skipping: %v", update.Pod.UID, format.Pod(update.Pod), err) + klog.ErrorS(err, "Error syncing pod, skipping", "pod", klog.KObj(update.Pod), "podUID", update.Pod.UID) } p.wrapUp(update.Pod.UID, err) } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/preemption/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/preemption/BUILD deleted file mode 100644 index 96671988d051..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/preemption/BUILD +++ /dev/null @@ -1,53 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["preemption.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/preemption", - deps = [ - "//pkg/api/v1/resource:go_default_library", - "//pkg/apis/core/v1/helper/qos:go_default_library", - "//pkg/kubelet/events:go_default_library", - "//pkg/kubelet/eviction:go_default_library", - "//pkg/kubelet/lifecycle:go_default_library", - "//pkg/kubelet/metrics:go_default_library", - "//pkg/kubelet/types:go_default_library", - "//pkg/kubelet/util/format:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["preemption_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/scheduling:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/preemption/preemption.go b/vendor/k8s.io/kubernetes/pkg/kubelet/preemption/preemption.go index 04db4ae0dc18..89ee669dcc04 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/preemption/preemption.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/preemption/preemption.go @@ -30,7 +30,6 @@ import ( "k8s.io/kubernetes/pkg/kubelet/lifecycle" "k8s.io/kubernetes/pkg/kubelet/metrics" kubetypes "k8s.io/kubernetes/pkg/kubelet/types" - "k8s.io/kubernetes/pkg/kubelet/util/format" ) const message = "Preempted in order to admit critical pod" @@ -95,7 +94,8 @@ func (c *CriticalPodAdmissionHandler) evictPodsToFreeRequests(admitPod *v1.Pod, if err != nil { return fmt.Errorf("preemption: error finding a set of pods to preempt: %v", err) } - klog.Infof("preemption: attempting to evict pods %v, in order to free up resources: %s", podsToPreempt, insufficientResources.toString()) + klog.InfoS("Attempting to evict pods in order to free up resources", "pods", podsToPreempt, + "insufficientResources", insufficientResources.toString()) for _, pod := range podsToPreempt { status := v1.PodStatus{ Phase: v1.PodFailed, @@ -107,7 +107,7 @@ func (c *CriticalPodAdmissionHandler) evictPodsToFreeRequests(admitPod *v1.Pod, // this is a blocking call and should only return when the pod and its containers are killed. err := c.killPodFunc(pod, status, nil) if err != nil { - klog.Warningf("preemption: pod %s failed to evict %v", format.Pod(pod), err) + klog.ErrorS(err, "Failed to evict pod", "pod", klog.KObj(pod)) // In future syncPod loops, the kubelet will retry the pod deletion steps that it was stuck on. continue } @@ -116,7 +116,7 @@ func (c *CriticalPodAdmissionHandler) evictPodsToFreeRequests(admitPod *v1.Pod, } else { metrics.Preemptions.WithLabelValues("").Inc() } - klog.Infof("preemption: pod %s evicted successfully", format.Pod(pod)) + klog.InfoS("Pod evicted successfully", "pod", klog.KObj(pod)) } return nil } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/prober/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/prober/BUILD deleted file mode 100644 index d5e610d5a65d..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/prober/BUILD +++ /dev/null @@ -1,89 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "prober.go", - "prober_manager.go", - "worker.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/prober", - deps = [ - "//pkg/api/v1/pod:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/events:go_default_library", - "//pkg/kubelet/prober/results:go_default_library", - "//pkg/kubelet/status:go_default_library", - "//pkg/kubelet/util/format:go_default_library", - "//pkg/probe:go_default_library", - "//pkg/probe/exec:go_default_library", - "//pkg/probe/http:go_default_library", - "//pkg/probe/tcp:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "common_test.go", - "prober_manager_test.go", - "prober_test.go", - "worker_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/container/testing:go_default_library", - "//pkg/kubelet/pod:go_default_library", - "//pkg/kubelet/prober/results:go_default_library", - "//pkg/kubelet/status:go_default_library", - "//pkg/kubelet/status/testing:go_default_library", - "//pkg/kubelet/util/ioutils:go_default_library", - "//pkg/probe:go_default_library", - "//pkg/probe/exec:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/kubelet/prober/results:all-srcs", - "//pkg/kubelet/prober/testing:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/prober/patch_prober.go b/vendor/k8s.io/kubernetes/pkg/kubelet/prober/patch_prober.go new file mode 100644 index 000000000000..66912c3f7df1 --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/prober/patch_prober.go @@ -0,0 +1,49 @@ +package prober + +import ( + "net/http" + "net/url" + "strings" + "time" + + v1 "k8s.io/api/core/v1" + "k8s.io/klog/v2" + "k8s.io/kubernetes/pkg/probe" + httpprobe "k8s.io/kubernetes/pkg/probe/http" +) + +func (pb *prober) maybeProbeForBody(prober httpprobe.Prober, url *url.URL, headers http.Header, timeout time.Duration, pod *v1.Pod, container v1.Container, probeType probeType) (probe.Result, string, error) { + if !isInterestingPod(pod) { + return prober.Probe(url, headers, timeout) + } + bodyProber, ok := prober.(httpprobe.DetailedProber) + if !ok { + return prober.Probe(url, headers, timeout) + } + result, output, body, probeError := bodyProber.ProbeForBody(url, headers, timeout) + switch result { + case probe.Success: + return result, output, probeError + case probe.Warning, probe.Failure, probe.Unknown: + // these pods are interesting enough to show the body content + klog.Infof("interesting pod/%s container/%s namespace/%s: %s probe status=%v output=%q start-of-body=%s", + pod.Name, container.Name, pod.Namespace, probeType, result, output, body) + + // in fact, they are so interesting we'll try to send events for them + pb.recordContainerEvent(pod, &container, v1.EventTypeWarning, "ProbeError", "%s probe error: %s\nbody: %s\n", probeType, output, body) + return result, output, probeError + default: + return result, output, probeError + } +} + +func isInterestingPod(pod *v1.Pod) bool { + if pod == nil { + return false + } + if strings.HasPrefix(pod.Namespace, "openshift-") { + return true + } + + return false +} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/prober/prober.go b/vendor/k8s.io/kubernetes/pkg/kubelet/prober/prober.go index 713adf3cd0e2..c53c63d01d73 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/prober/prober.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/prober/prober.go @@ -81,7 +81,7 @@ func newProber( func (pb *prober) recordContainerEvent(pod *v1.Pod, container *v1.Container, eventType, reason, message string, args ...interface{}) { ref, err := kubecontainer.GenerateContainerRef(pod, container) if err != nil { - klog.Errorf("Can't make a ref to pod %q, container %v: %v", format.Pod(pod), container.Name, err) + klog.ErrorS(err, "Can't make a ref to pod and container", "pod", klog.KObj(pod), "containerName", container.Name) return } pb.recorder.Eventf(ref, eventType, reason, message, args...) @@ -101,9 +101,8 @@ func (pb *prober) probe(probeType probeType, pod *v1.Pod, status v1.PodStatus, c return results.Failure, fmt.Errorf("unknown probe type: %q", probeType) } - ctrName := fmt.Sprintf("%s:%s", format.Pod(pod), container.Name) if probeSpec == nil { - klog.Warningf("%s probe for %s is nil", probeType, ctrName) + klog.InfoS("Probe is nil", "probeType", probeType, "pod", klog.KObj(pod), "podUID", pod.UID, "containerName", container.Name) return results.Success, nil } @@ -111,19 +110,19 @@ func (pb *prober) probe(probeType probeType, pod *v1.Pod, status v1.PodStatus, c if err != nil || (result != probe.Success && result != probe.Warning) { // Probe failed in one way or another. if err != nil { - klog.V(1).Infof("%s probe for %q errored: %v", probeType, ctrName, err) + klog.V(1).ErrorS(err, "Probe errored", "probeType", probeType, "pod", klog.KObj(pod), "podUID", pod.UID, "containerName", container.Name) pb.recordContainerEvent(pod, &container, v1.EventTypeWarning, events.ContainerUnhealthy, "%s probe errored: %v", probeType, err) } else { // result != probe.Success - klog.V(1).Infof("%s probe for %q failed (%v): %s", probeType, ctrName, result, output) + klog.V(1).InfoS("Probe failed", "probeType", probeType, "pod", klog.KObj(pod), "podUID", pod.UID, "containerName", container.Name, "probeResult", result, "output", output) pb.recordContainerEvent(pod, &container, v1.EventTypeWarning, events.ContainerUnhealthy, "%s probe failed: %s", probeType, output) } return results.Failure, err } if result == probe.Warning { pb.recordContainerEvent(pod, &container, v1.EventTypeWarning, events.ContainerProbeWarning, "%s probe warning: %s", probeType, output) - klog.V(3).Infof("%s probe for %q succeeded with a warning: %s", probeType, ctrName, output) + klog.V(3).InfoS("Probe succeeded with a warning", "probeType", probeType, "pod", klog.KObj(pod), "podUID", pod.UID, "containerName", container.Name, "output", output) } else { - klog.V(3).Infof("%s probe for %q succeeded", probeType, ctrName) + klog.V(3).InfoS("Probe succeeded", "probeType", probeType, "pod", klog.KObj(pod), "podUID", pod.UID, "containerName", container.Name) } return results.Success, nil } @@ -156,7 +155,7 @@ func buildHeader(headerList []v1.HTTPHeader) http.Header { func (pb *prober) runProbe(probeType probeType, p *v1.Probe, pod *v1.Pod, status v1.PodStatus, container v1.Container, containerID kubecontainer.ContainerID) (probe.Result, string, error) { timeout := time.Duration(p.TimeoutSeconds) * time.Second if p.Exec != nil { - klog.V(4).Infof("Exec-Probe Pod: %v, Container: %v, Command: %v", pod.Name, container.Name, p.Exec.Command) + klog.V(4).InfoS("Exec-Probe runProbe", "pod", klog.KObj(pod), "containerName", container.Name, "execCommand", p.Exec.Command) command := kubecontainer.ExpandContainerCommandOnlyStatic(p.Exec.Command, container.Env) return pb.exec.Probe(pb.newExecInContainer(container, containerID, command, timeout)) } @@ -171,17 +170,17 @@ func (pb *prober) runProbe(probeType probeType, p *v1.Probe, pod *v1.Pod, status return probe.Unknown, "", err } path := p.HTTPGet.Path - klog.V(4).Infof("HTTP-Probe Host: %v://%v, Port: %v, Path: %v", scheme, host, port, path) + klog.V(4).InfoS("HTTP-Probe Host", "scheme", scheme, "host", host, "port", port, "path", path) url := formatURL(scheme, host, port, path) headers := buildHeader(p.HTTPGet.HTTPHeaders) - klog.V(4).Infof("HTTP-Probe Headers: %v", headers) + klog.V(4).InfoS("HTTP-Probe Headers", "headers", headers) switch probeType { case liveness: - return pb.livenessHTTP.Probe(url, headers, timeout) + return pb.maybeProbeForBody(pb.livenessHTTP, url, headers, timeout, pod, container, probeType) case startup: - return pb.startupHTTP.Probe(url, headers, timeout) + return pb.maybeProbeForBody(pb.startupHTTP, url, headers, timeout, pod, container, probeType) default: - return pb.readinessHTTP.Probe(url, headers, timeout) + return pb.maybeProbeForBody(pb.readinessHTTP, url, headers, timeout, pod, container, probeType) } } if p.TCPSocket != nil { @@ -193,10 +192,10 @@ func (pb *prober) runProbe(probeType probeType, p *v1.Probe, pod *v1.Pod, status if host == "" { host = status.PodIP } - klog.V(4).Infof("TCP-Probe Host: %v, Port: %v, Timeout: %v", host, port, timeout) + klog.V(4).InfoS("TCP-Probe Host", "host", host, "port", port, "timeout", timeout) return pb.tcp.Probe(host, port, timeout) } - klog.Warningf("Failed to find probe builder for container: %v", container) + klog.InfoS("Failed to find probe builder for container", "containerName", container.Name) return probe.Unknown, "", fmt.Errorf("missing probe handler for %s:%s", format.Pod(pod), container.Name) } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/prober/prober_manager.go b/vendor/k8s.io/kubernetes/pkg/kubelet/prober/prober_manager.go index be2779047213..af6c723ec088 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/prober/prober_manager.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/prober/prober_manager.go @@ -18,18 +18,18 @@ package prober import ( "sync" + "time" v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/clock" "k8s.io/apimachinery/pkg/util/sets" - "k8s.io/apimachinery/pkg/util/wait" "k8s.io/client-go/tools/record" "k8s.io/component-base/metrics" "k8s.io/klog/v2" kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" "k8s.io/kubernetes/pkg/kubelet/prober/results" "k8s.io/kubernetes/pkg/kubelet/status" - "k8s.io/kubernetes/pkg/kubelet/util/format" ) // ProberResults stores the cumulative number of a probe by result as prometheus metrics. @@ -69,9 +69,6 @@ type Manager interface { // UpdatePodStatus modifies the given PodStatus with the appropriate Ready state for each // container based on container running status, cached probe results and worker states. UpdatePodStatus(types.UID, *v1.PodStatus) - - // Start starts the Manager sync loops. - Start() } type manager struct { @@ -94,18 +91,20 @@ type manager struct { // prober executes the probe actions. prober *prober + + start time.Time } // NewManager creates a Manager for pod probing. func NewManager( statusManager status.Manager, livenessManager results.Manager, + readinessManager results.Manager, startupManager results.Manager, runner kubecontainer.CommandRunner, recorder record.EventRecorder) Manager { prober := newProber(runner, recorder) - readinessManager := results.NewManager() return &manager{ statusManager: statusManager, prober: prober, @@ -113,17 +112,10 @@ func NewManager( livenessManager: livenessManager, startupManager: startupManager, workers: make(map[probeKey]*worker), + start: clock.RealClock{}.Now(), } } -// Start syncing probe status. This should only be called once. -func (m *manager) Start() { - // Start syncing readiness. - go wait.Forever(m.updateReadiness, 0) - // Start syncing startup. - go wait.Forever(m.updateStartup, 0) -} - // Key uniquely identifying container probes type probeKey struct { podUID types.UID @@ -169,8 +161,8 @@ func (m *manager) AddPod(pod *v1.Pod) { if c.StartupProbe != nil { key.probeType = startup if _, ok := m.workers[key]; ok { - klog.Errorf("Startup probe already exists! %v - %v", - format.Pod(pod), c.Name) + klog.ErrorS(nil, "Startup probe already exists for container", + "pod", klog.KObj(pod), "containerName", c.Name) return } w := newWorker(m, startup, pod, c) @@ -181,8 +173,8 @@ func (m *manager) AddPod(pod *v1.Pod) { if c.ReadinessProbe != nil { key.probeType = readiness if _, ok := m.workers[key]; ok { - klog.Errorf("Readiness probe already exists! %v - %v", - format.Pod(pod), c.Name) + klog.ErrorS(nil, "Readiness probe already exists for container", + "pod", klog.KObj(pod), "containerName", c.Name) return } w := newWorker(m, readiness, pod, c) @@ -193,8 +185,8 @@ func (m *manager) AddPod(pod *v1.Pod) { if c.LivenessProbe != nil { key.probeType = liveness if _, ok := m.workers[key]; ok { - klog.Errorf("Liveness probe already exists! %v - %v", - format.Pod(pod), c.Name) + klog.ErrorS(nil, "Liveness probe already exists for container", + "pod", klog.KObj(pod), "containerName", c.Name) return } w := newWorker(m, liveness, pod, c) @@ -253,8 +245,16 @@ func (m *manager) UpdatePodStatus(podUID types.UID, podStatus *v1.PodStatus) { ready = result == results.Success } else { // The check whether there is a probe which hasn't run yet. - _, exists := m.getWorker(podUID, c.Name, readiness) - ready = !exists + w, exists := m.getWorker(podUID, c.Name, readiness) + ready = !exists // no readinessProbe -> always ready + if exists { + // Trigger an immediate run of the readinessProbe to update ready state + select { + case w.manualTriggerCh <- struct{}{}: + default: // Non-blocking. + klog.InfoS("Failed to trigger a manual run", "probe", w.probeType.String()) + } + } } podStatus.ContainerStatuses[i].Ready = ready } @@ -290,17 +290,3 @@ func (m *manager) workerCount() int { defer m.workerLock.RUnlock() return len(m.workers) } - -func (m *manager) updateReadiness() { - update := <-m.readinessManager.Updates() - - ready := update.Result == results.Success - m.statusManager.SetContainerReadiness(update.PodUID, update.ContainerID, ready) -} - -func (m *manager) updateStartup() { - update := <-m.startupManager.Updates() - - started := update.Result == results.Success - m.statusManager.SetContainerStartup(update.PodUID, update.ContainerID, started) -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/prober/results/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/prober/results/BUILD deleted file mode 100644 index 2df22b0ea0fc..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/prober/results/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["results_manager.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/prober/results", - deps = [ - "//pkg/kubelet/container:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["results_manager_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/container:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/prober/worker.go b/vendor/k8s.io/kubernetes/pkg/kubelet/prober/worker.go index 1efffe5888fa..f627a79d036b 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/prober/worker.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/prober/worker.go @@ -20,14 +20,13 @@ import ( "math/rand" "time" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/component-base/metrics" "k8s.io/klog/v2" podutil "k8s.io/kubernetes/pkg/api/v1/pod" kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" "k8s.io/kubernetes/pkg/kubelet/prober/results" - "k8s.io/kubernetes/pkg/kubelet/util/format" ) // worker handles the periodic probing of its assigned container. Each worker has a go-routine @@ -38,6 +37,9 @@ type worker struct { // Channel for stopping the probe. stopCh chan struct{} + // Channel for triggering the probe manually. + manualTriggerCh chan struct{} + // The pod containing this probe (read-only) pod *v1.Pod @@ -82,11 +84,12 @@ func newWorker( container v1.Container) *worker { w := &worker{ - stopCh: make(chan struct{}, 1), // Buffer so stop() can be non-blocking. - pod: pod, - container: container, - probeType: probeType, - probeManager: m, + stopCh: make(chan struct{}, 1), // Buffer so stop() can be non-blocking. + manualTriggerCh: make(chan struct{}, 1), // Buffer so prober_manager can do non-blocking calls to doProbe. + pod: pod, + container: container, + probeType: probeType, + probeManager: m, } switch probeType { @@ -130,7 +133,10 @@ func (w *worker) run() { // If kubelet restarted the probes could be started in rapid succession. // Let the worker wait for a random portion of tickerPeriod before probing. - time.Sleep(time.Duration(rand.Float64() * float64(probeTickerPeriod))) + // Do it only if the kubelet has started recently. + if probeTickerPeriod > time.Since(w.probeManager.start) { + time.Sleep(time.Duration(rand.Float64() * float64(probeTickerPeriod))) + } probeTicker := time.NewTicker(probeTickerPeriod) @@ -154,6 +160,7 @@ probeLoop: case <-w.stopCh: break probeLoop case <-probeTicker.C: + case <-w.manualTriggerCh: // continue } } @@ -177,22 +184,22 @@ func (w *worker) doProbe() (keepGoing bool) { status, ok := w.probeManager.statusManager.GetPodStatus(w.pod.UID) if !ok { // Either the pod has not been created yet, or it was already deleted. - klog.V(3).Infof("No status for pod: %v", format.Pod(w.pod)) + klog.V(3).InfoS("No status for pod", "pod", klog.KObj(w.pod)) return true } // Worker should terminate if pod is terminated. if status.Phase == v1.PodFailed || status.Phase == v1.PodSucceeded { - klog.V(3).Infof("Pod %v %v, exiting probe worker", - format.Pod(w.pod), status.Phase) + klog.V(3).InfoS("Pod is terminated, exiting probe worker", + "pod", klog.KObj(w.pod), "phase", status.Phase) return false } c, ok := podutil.GetContainerStatus(status.ContainerStatuses, w.container.Name) if !ok || len(c.ContainerID) == 0 { // Either the container has not been created yet, or it was deleted. - klog.V(3).Infof("Probe target container not found: %v - %v", - format.Pod(w.pod), w.container.Name) + klog.V(3).InfoS("Probe target container not found", + "pod", klog.KObj(w.pod), "containerName", w.container.Name) return true // Wait for more information. } @@ -212,8 +219,8 @@ func (w *worker) doProbe() (keepGoing bool) { } if c.State.Running == nil { - klog.V(3).Infof("Non-running container probed: %v - %v", - format.Pod(w.pod), w.container.Name) + klog.V(3).InfoS("Non-running container probed", + "pod", klog.KObj(w.pod), "containerName", w.container.Name) if !w.containerID.IsEmpty() { w.resultsManager.Set(w.containerID, results.Failure, w.pod) } @@ -222,6 +229,20 @@ func (w *worker) doProbe() (keepGoing bool) { w.pod.Spec.RestartPolicy != v1.RestartPolicyNever } + // Graceful shutdown of the pod. + if w.pod.ObjectMeta.DeletionTimestamp != nil && (w.probeType == liveness || w.probeType == startup) { + klog.V(3).InfoS("Pod deletion requested, setting probe result to success", + "probeType", w.probeType, "pod", klog.KObj(w.pod), "containerName", w.container.Name) + if w.probeType == startup { + klog.InfoS("Pod deletion requested before container has fully started", + "pod", klog.KObj(w.pod), "containerName", w.container.Name) + } + // Set a last result to ensure quiet shutdown. + w.resultsManager.Set(w.containerID, results.Success, w.pod) + // Stop probing at this point. + return false + } + // Probe disabled for InitialDelaySeconds. if int32(time.Since(c.State.Running.StartedAt.Time).Seconds()) < w.spec.InitialDelaySeconds { return true @@ -229,6 +250,7 @@ func (w *worker) doProbe() (keepGoing bool) { if c.Started != nil && *c.Started { // Stop probing for startup once container has started. + // we keep it running to make sure it will work for restarted container. if w.probeType == startup { return true } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/qos/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/qos/BUILD deleted file mode 100644 index e068804aabe9..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/qos/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["policy_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/scheduling:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "policy.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/qos", - deps = [ - "//pkg/apis/core/v1/helper/qos:go_default_library", - "//pkg/kubelet/types:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/qos/policy.go b/vendor/k8s.io/kubernetes/pkg/kubelet/qos/policy.go index fc4289213480..93d0934c2800 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/qos/policy.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/qos/policy.go @@ -38,8 +38,8 @@ const ( // and 1000. Containers with higher OOM scores are killed if the system runs out of memory. // See https://lwn.net/Articles/391222/ for more information. func GetContainerOOMScoreAdjust(pod *v1.Pod, container *v1.Container, memoryCapacity int64) int { - if types.IsCriticalPod(pod) { - // Critical pods should be the last to get killed. + if types.IsNodeCriticalPod(pod) { + // Only node critical pod should be the last to get killed. return guaranteedOOMScoreAdj } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/runonce.go b/vendor/k8s.io/kubernetes/pkg/kubelet/runonce.go index 1da9c2251865..3272bccfda70 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/runonce.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/runonce.go @@ -51,15 +51,15 @@ func (kl *Kubelet) RunOnce(updates <-chan kubetypes.PodUpdate) ([]RunPodResult, // If the container logs directory does not exist, create it. if _, err := os.Stat(ContainerLogsDir); err != nil { if err := kl.os.MkdirAll(ContainerLogsDir, 0755); err != nil { - klog.Errorf("Failed to create directory %q: %v", ContainerLogsDir, err) + klog.ErrorS(err, "Failed to create directory", "path", ContainerLogsDir) } } select { case u := <-updates: - klog.Infof("processing manifest with %d pods", len(u.Pods)) + klog.InfoS("Processing manifest with pods", "numPods", len(u.Pods)) result, err := kl.runOnce(u.Pods, runOnceRetryDelay) - klog.Infof("finished processing %d pods", len(u.Pods)) + klog.InfoS("Finished processing pods", "numPods", len(u.Pods)) return result, err case <-time.After(runOnceManifestDelay): return nil, fmt.Errorf("no pod manifest update after %v", runOnceManifestDelay) @@ -85,27 +85,27 @@ func (kl *Kubelet) runOnce(pods []*v1.Pod, retryDelay time.Duration) (results [] }(pod) } - klog.Infof("Waiting for %d pods", len(admitted)) + klog.InfoS("Waiting for pods", "numPods", len(admitted)) failedPods := []string{} for i := 0; i < len(admitted); i++ { res := <-ch results = append(results, res) if res.Err != nil { - faliedContainerName, err := kl.getFailedContainers(res.Pod) + failedContainerName, err := kl.getFailedContainers(res.Pod) if err != nil { - klog.Infof("unable to get failed containers' names for pod %q, error:%v", format.Pod(res.Pod), err) + klog.InfoS("Unable to get failed containers' names for pod", "pod", klog.KObj(res.Pod), "err", err) } else { - klog.Infof("unable to start pod %q because container:%v failed", format.Pod(res.Pod), faliedContainerName) + klog.InfoS("Unable to start pod because container failed", "pod", klog.KObj(res.Pod), "containerName", failedContainerName) } failedPods = append(failedPods, format.Pod(res.Pod)) } else { - klog.Infof("started pod %q", format.Pod(res.Pod)) + klog.InfoS("Started pod", "pod", klog.KObj(res.Pod)) } } if len(failedPods) > 0 { return results, fmt.Errorf("error running pods: %v", failedPods) } - klog.Infof("%d pods started", len(pods)) + klog.InfoS("Pods started", "numPods", len(pods)) return results, err } @@ -120,14 +120,14 @@ func (kl *Kubelet) runPod(pod *v1.Pod, retryDelay time.Duration) error { } if kl.isPodRunning(pod, status) { - klog.Infof("pod %q containers running", format.Pod(pod)) + klog.InfoS("Pod's containers running", "pod", klog.KObj(pod)) return nil } - klog.Infof("pod %q containers not running: syncing", format.Pod(pod)) + klog.InfoS("Pod's containers not running: syncing", "pod", klog.KObj(pod)) - klog.Infof("Creating a mirror pod for static pod %q", format.Pod(pod)) + klog.InfoS("Creating a mirror pod for static pod", "pod", klog.KObj(pod)) if err := kl.podManager.CreateMirrorPod(pod); err != nil { - klog.Errorf("Failed creating a mirror pod %q: %v", format.Pod(pod), err) + klog.ErrorS(err, "Failed creating a mirror pod", "pod", klog.KObj(pod)) } mirrorPod, _ := kl.podManager.GetMirrorPodByPod(pod) if err = kl.syncPod(syncPodOptions{ @@ -142,7 +142,7 @@ func (kl *Kubelet) runPod(pod *v1.Pod, retryDelay time.Duration) error { return fmt.Errorf("timeout error: pod %q containers not running after %d retries", format.Pod(pod), runOnceMaxRetries) } // TODO(proppy): health checking would be better than waiting + checking the state at the next iteration. - klog.Infof("pod %q containers synced, waiting for %v", format.Pod(pod), delay) + klog.InfoS("Pod's containers synced, waiting", "pod", klog.KObj(pod), "duration", delay) time.Sleep(delay) retry++ delay *= runOnceRetryDelayBackoff @@ -154,7 +154,7 @@ func (kl *Kubelet) isPodRunning(pod *v1.Pod, status *kubecontainer.PodStatus) bo for _, c := range pod.Spec.Containers { cs := status.FindContainerStatusByName(c.Name) if cs == nil || cs.State != kubecontainer.ContainerStateRunning { - klog.Infof("Container %q for pod %q not running", c.Name, format.Pod(pod)) + klog.InfoS("Container not running", "pod", klog.KObj(pod), "containerName", c.Name) return false } } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/runtimeclass/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/runtimeclass/BUILD deleted file mode 100644 index 8e2db9bf6cce..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/runtimeclass/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["runtimeclass_manager.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/runtimeclass", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/node/v1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/kubelet/runtimeclass/testing:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["runtimeclass_manager_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/runtimeclass/testing:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/runtimeclass/testing/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/runtimeclass/testing/BUILD deleted file mode 100644 index bc8104fd9aaa..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/runtimeclass/testing/BUILD +++ /dev/null @@ -1,29 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["fake_manager.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/runtimeclass/testing", - visibility = ["//visibility:public"], - deps = [ - "//pkg/kubelet/runtimeclass:go_default_library", - "//staging/src/k8s.io/api/node/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/secret/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/secret/BUILD deleted file mode 100644 index d3cc1773a53c..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/secret/BUILD +++ /dev/null @@ -1,56 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["secret_manager_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/util/manager:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "fake_manager.go", - "secret_manager.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/secret", - deps = [ - "//pkg/api/v1/pod:go_default_library", - "//pkg/apis/core/v1:go_default_library", - "//pkg/kubelet/util/manager:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/secret/secret_manager.go b/vendor/k8s.io/kubernetes/pkg/kubelet/secret/secret_manager.go index 3aa132a5bfaf..0e7485fc4ab8 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/secret/secret_manager.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/secret/secret_manager.go @@ -34,7 +34,7 @@ import ( "k8s.io/apimachinery/pkg/watch" ) -// Manager manages Kubernets secrets. This includes retrieving +// Manager manages Kubernetes secrets. This includes retrieving // secrets or registering/unregistering them via Pods. type Manager interface { // Get secret by secret namespace and name. @@ -136,7 +136,7 @@ func NewCachingSecretManager(kubeClient clientset.Interface, getTTL manager.GetO // - whenever a pod is created or updated, we start individual watches for all // referenced objects that aren't referenced from other registered pods // - every GetObject() returns a value from local cache propagated via watches -func NewWatchingSecretManager(kubeClient clientset.Interface) Manager { +func NewWatchingSecretManager(kubeClient clientset.Interface, resyncInterval time.Duration) Manager { listSecret := func(namespace string, opts metav1.ListOptions) (runtime.Object, error) { return kubeClient.CoreV1().Secrets(namespace).List(context.TODO(), opts) } @@ -154,6 +154,6 @@ func NewWatchingSecretManager(kubeClient clientset.Interface) Manager { } gr := corev1.Resource("secret") return &secretManager{ - manager: manager.NewWatchBasedManager(listSecret, watchSecret, newSecret, isImmutable, gr, getSecretNames), + manager: manager.NewWatchBasedManager(listSecret, watchSecret, newSecret, isImmutable, gr, resyncInterval, getSecretNames), } } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/server/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/server/BUILD deleted file mode 100644 index 2d6bf8332376..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/server/BUILD +++ /dev/null @@ -1,119 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "auth.go", - "doc.go", - "server.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/server", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/v1/validation:go_default_library", - "//pkg/features:go_default_library", - "//pkg/kubelet/apis/podresources:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/cri/streaming:go_default_library", - "//pkg/kubelet/cri/streaming/portforward:go_default_library", - "//pkg/kubelet/cri/streaming/remotecommand:go_default_library", - "//pkg/kubelet/metrics/collectors:go_default_library", - "//pkg/kubelet/prober:go_default_library", - "//pkg/kubelet/server/metrics:go_default_library", - "//pkg/kubelet/server/stats:go_default_library", - "//pkg/kubelet/types:go_default_library", - "//pkg/kubelet/util:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/proxy:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/healthz:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/httplog:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/routes:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/flushwriter:go_default_library", - "//staging/src/k8s.io/component-base/configz:go_default_library", - "//staging/src/k8s.io/component-base/logs:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - "//staging/src/k8s.io/kubelet/pkg/apis/podresources/v1:go_default_library", - "//staging/src/k8s.io/kubelet/pkg/apis/podresources/v1alpha1:go_default_library", - "//vendor/github.com/emicklei/go-restful:go_default_library", - "//vendor/github.com/google/cadvisor/container:go_default_library", - "//vendor/github.com/google/cadvisor/info/v1:go_default_library", - "//vendor/github.com/google/cadvisor/info/v2:go_default_library", - "//vendor/github.com/google/cadvisor/metrics:go_default_library", - "//vendor/google.golang.org/grpc:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/clock:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "auth_test.go", - "server_test.go", - "server_websocket_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/install:go_default_library", - "//pkg/kubelet/cm:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/cri/streaming:go_default_library", - "//pkg/kubelet/cri/streaming/portforward:go_default_library", - "//pkg/kubelet/cri/streaming/remotecommand:go_default_library", - "//pkg/kubelet/server/stats:go_default_library", - "//pkg/volume:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/httpstream/spdy:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//staging/src/k8s.io/client-go/tools/remotecommand:go_default_library", - "//staging/src/k8s.io/cri-api/pkg/apis/runtime/v1alpha2:go_default_library", - "//staging/src/k8s.io/kubelet/pkg/apis/stats/v1alpha1:go_default_library", - "//vendor/github.com/google/cadvisor/info/v1:go_default_library", - "//vendor/github.com/google/cadvisor/info/v2:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - "//vendor/golang.org/x/net/websocket:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/kubelet/server/metrics:all-srcs", - "//pkg/kubelet/server/stats:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/server/auth.go b/vendor/k8s.io/kubernetes/pkg/kubelet/server/auth.go index 164984a073c2..469039b9d2b1 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/server/auth.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/server/auth.go @@ -62,7 +62,6 @@ func isSubpath(subpath, path string) bool { // /stats/* => verb=, resource=nodes, name=, subresource=stats // /metrics/* => verb=, resource=nodes, name=, subresource=metrics // /logs/* => verb=, resource=nodes, name=, subresource=log -// /spec/* => verb=, resource=nodes, name=, subresource=spec func (n nodeAuthorizerAttributesGetter) GetRequestAttributes(u user.Info, r *http.Request) authorizer.Attributes { apiVerb := "" @@ -105,11 +104,9 @@ func (n nodeAuthorizerAttributesGetter) GetRequestAttributes(u user.Info, r *htt case isSubpath(requestPath, logsPath): // "log" to match other log subresources (pods/log, etc) attrs.Subresource = "log" - case isSubpath(requestPath, specPath): - attrs.Subresource = "spec" } - klog.V(5).Infof("Node request attributes: user=%#v attrs=%#v", attrs.GetUser(), attrs) + klog.V(5).InfoS("Node request attributes", "user", attrs.GetUser().GetName(), "verb", attrs.GetVerb(), "resource", attrs.GetResource(), "subresource", attrs.GetSubresource()) return attrs } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/server/metrics/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/server/metrics/BUILD deleted file mode 100644 index 5afe16064aaf..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/server/metrics/BUILD +++ /dev/null @@ -1,29 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["metrics.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/server/metrics", - deps = [ - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/server/server.go b/vendor/k8s.io/kubernetes/pkg/kubelet/server/server.go index f7250665ac49..0bf9ad9b4511 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/server/server.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/server/server.go @@ -25,6 +25,7 @@ import ( "net/http" "net/http/pprof" "net/url" + "os" "reflect" goruntime "runtime" "strconv" @@ -66,6 +67,7 @@ import ( api "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/apis/core/v1/validation" "k8s.io/kubernetes/pkg/features" + kubeletconfiginternal "k8s.io/kubernetes/pkg/kubelet/apis/config" "k8s.io/kubernetes/pkg/kubelet/apis/podresources" kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" "k8s.io/kubernetes/pkg/kubelet/cri/streaming" @@ -83,9 +85,10 @@ const ( cadvisorMetricsPath = "/metrics/cadvisor" resourceMetricsPath = "/metrics/resource" proberMetricsPath = "/metrics/probes" - specPath = "/spec/" statsPath = "/stats/" logsPath = "/logs/" + pprofBasePath = "/debug/pprof/" + debugFlagPath = "/debug/flags/v" ) // Server is a http.Handler which exposes kubelet functionality over HTTP. @@ -137,16 +140,14 @@ func (a *filteringContainer) RegisteredHandlePaths() []string { func ListenAndServeKubeletServer( host HostInterface, resourceAnalyzer stats.ResourceAnalyzer, - address net.IP, - port uint, + kubeCfg *kubeletconfiginternal.KubeletConfiguration, tlsOptions *TLSOptions, - auth AuthInterface, - enableCAdvisorJSONEndpoints, - enableDebuggingHandlers, - enableContentionProfiling, - enableSystemLogHandler bool) { - klog.Infof("Starting to listen on %s:%d", address, port) - handler := NewServer(host, resourceAnalyzer, auth, enableCAdvisorJSONEndpoints, enableDebuggingHandlers, enableContentionProfiling, enableSystemLogHandler) + auth AuthInterface) { + + address := net.ParseIP(kubeCfg.Address) + port := uint(kubeCfg.Port) + klog.InfoS("Starting to listen", "address", address, "port", port) + handler := NewServer(host, resourceAnalyzer, auth, kubeCfg) s := &http.Server{ Addr: net.JoinHostPort(address.String(), strconv.FormatUint(uint64(port), 10)), Handler: &handler, @@ -159,23 +160,31 @@ func ListenAndServeKubeletServer( // Passing empty strings as the cert and key files means no // cert/keys are specified and GetCertificate in the TLSConfig // should be called instead. - klog.Fatal(s.ListenAndServeTLS(tlsOptions.CertFile, tlsOptions.KeyFile)) - } else { - klog.Fatal(s.ListenAndServe()) + if err := s.ListenAndServeTLS(tlsOptions.CertFile, tlsOptions.KeyFile); err != nil { + klog.ErrorS(err, "Failed to listen and serve") + os.Exit(1) + } + } else if err := s.ListenAndServe(); err != nil { + klog.ErrorS(err, "Failed to listen and serve") + os.Exit(1) } } // ListenAndServeKubeletReadOnlyServer initializes a server to respond to HTTP network requests on the Kubelet. -func ListenAndServeKubeletReadOnlyServer(host HostInterface, resourceAnalyzer stats.ResourceAnalyzer, address net.IP, port uint, enableCAdvisorJSONEndpoints bool) { - klog.V(1).Infof("Starting to listen read-only on %s:%d", address, port) - s := NewServer(host, resourceAnalyzer, nil, enableCAdvisorJSONEndpoints, false, false, false) +func ListenAndServeKubeletReadOnlyServer(host HostInterface, resourceAnalyzer stats.ResourceAnalyzer, address net.IP, port uint) { + klog.InfoS("Starting to listen read-only", "address", address, "port", port) + s := NewServer(host, resourceAnalyzer, nil, nil) server := &http.Server{ Addr: net.JoinHostPort(address.String(), strconv.FormatUint(uint64(port), 10)), Handler: &s, MaxHeaderBytes: 1 << 20, } - klog.Fatal(server.ListenAndServe()) + + if err := server.ListenAndServe(); err != nil { + klog.ErrorS(err, "Failed to listen and serve") + os.Exit(1) + } } // ListenAndServePodResources initializes a gRPC server to serve the PodResources service @@ -185,9 +194,14 @@ func ListenAndServePodResources(socket string, podsProvider podresources.PodsPro podresourcesapi.RegisterPodResourcesListerServer(server, podresources.NewV1PodResourcesServer(podsProvider, devicesProvider, cpusProvider)) l, err := util.CreateListener(socket) if err != nil { - klog.Fatalf("Failed to create listener for podResources endpoint: %v", err) + klog.ErrorS(err, "Failed to create listener for podResources endpoint") + os.Exit(1) + } + + if err := server.Serve(l); err != nil { + klog.ErrorS(err, "Failed to serve") + os.Exit(1) } - klog.Fatal(server.Serve(l)) } // AuthInterface contains all methods required by the auth filters @@ -220,10 +234,7 @@ func NewServer( host HostInterface, resourceAnalyzer stats.ResourceAnalyzer, auth AuthInterface, - enableCAdvisorJSONEndpoints, - enableDebuggingHandlers, - enableContentionProfiling, - enableSystemLogHandler bool) Server { + kubeCfg *kubeletconfiginternal.KubeletConfiguration) Server { server := Server{ host: host, resourceAnalyzer: resourceAnalyzer, @@ -235,15 +246,14 @@ func NewServer( if auth != nil { server.InstallAuthFilter() } - server.InstallDefaultHandlers(enableCAdvisorJSONEndpoints) - if enableDebuggingHandlers { + server.InstallDefaultHandlers() + if kubeCfg != nil && kubeCfg.EnableDebuggingHandlers { server.InstallDebuggingHandlers() - // To maintain backward compatibility serve logs only when enableDebuggingHandlers is also enabled + // To maintain backward compatibility serve logs and pprof only when enableDebuggingHandlers is also enabled // see https://github.com/kubernetes/kubernetes/pull/87273 - server.InstallSystemLogHandler(enableSystemLogHandler) - if enableContentionProfiling { - goruntime.SetBlockProfileRate(1) - } + server.InstallSystemLogHandler(kubeCfg.EnableSystemLogHandler) + server.InstallProfilingHandler(kubeCfg.EnableProfilingHandler, kubeCfg.EnableContentionProfiling) + server.InstallDebugFlagsHandler(kubeCfg.EnableDebugFlagsHandler) } else { server.InstallDebuggingDisabledHandlers() } @@ -256,7 +266,7 @@ func (s *Server) InstallAuthFilter() { // Authenticate info, ok, err := s.auth.AuthenticateRequest(req.Request) if err != nil { - klog.Errorf("Unable to authenticate the request due to an error: %v", err) + klog.ErrorS(err, "Unable to authenticate the request due to an error") resp.WriteErrorString(http.StatusUnauthorized, "Unauthorized") return } @@ -271,14 +281,14 @@ func (s *Server) InstallAuthFilter() { // Authorize decision, _, err := s.auth.Authorize(req.Request.Context(), attrs) if err != nil { + klog.ErrorS(err, "Authorization error", "user", attrs.GetUser().GetName(), "verb", attrs.GetVerb(), "resource", attrs.GetResource(), "subresource", attrs.GetSubresource()) msg := fmt.Sprintf("Authorization error (user=%s, verb=%s, resource=%s, subresource=%s)", attrs.GetUser().GetName(), attrs.GetVerb(), attrs.GetResource(), attrs.GetSubresource()) - klog.Errorf(msg, err) resp.WriteErrorString(http.StatusInternalServerError, msg) return } if decision != authorizer.DecisionAllow { + klog.V(2).InfoS("Forbidden", "user", attrs.GetUser().GetName(), "verb", attrs.GetVerb(), "resource", attrs.GetResource(), "subresource", attrs.GetSubresource()) msg := fmt.Sprintf("Forbidden (user=%s, verb=%s, resource=%s, subresource=%s)", attrs.GetUser().GetName(), attrs.GetVerb(), attrs.GetResource(), attrs.GetSubresource()) - klog.V(2).Info(msg) resp.WriteErrorString(http.StatusForbidden, msg) return } @@ -313,7 +323,7 @@ func (s *Server) getMetricMethodBucket(method string) string { // InstallDefaultHandlers registers the default set of supported HTTP request // patterns with the restful Container. -func (s *Server) InstallDefaultHandlers(enableCAdvisorJSONEndpoints bool) { +func (s *Server) InstallDefaultHandlers() { s.addMetricsBucketMatcher("healthz") healthz.InstallHandler(s.restfulCont, healthz.PingHealthz, @@ -332,7 +342,7 @@ func (s *Server) InstallDefaultHandlers(enableCAdvisorJSONEndpoints bool) { s.restfulCont.Add(ws) s.addMetricsBucketMatcher("stats") - s.restfulCont.Add(stats.CreateHandlers(statsPath, s.host, s.resourceAnalyzer, enableCAdvisorJSONEndpoints)) + s.restfulCont.Add(stats.CreateHandlers(statsPath, s.host, s.resourceAnalyzer)) s.addMetricsBucketMatcher("metrics") s.addMetricsBucketMatcher("metrics/cadvisor") @@ -388,26 +398,11 @@ func (s *Server) InstallDefaultHandlers(enableCAdvisorJSONEndpoints bool) { s.restfulCont.Handle(proberMetricsPath, compbasemetrics.HandlerFor(p, compbasemetrics.HandlerOpts{ErrorHandling: compbasemetrics.ContinueOnError}), ) - - s.addMetricsBucketMatcher("spec") - if enableCAdvisorJSONEndpoints { - ws := new(restful.WebService) - ws. - Path(specPath). - Produces(restful.MIME_JSON) - ws.Route(ws.GET(""). - To(s.getSpec). - Operation("getSpec"). - Writes(cadvisorapi.MachineInfo{})) - s.restfulCont.Add(ws) - } } -const pprofBasePath = "/debug/pprof/" - // InstallDebuggingHandlers registers the HTTP request patterns that serve logs or run commands/containers func (s *Server) InstallDebuggingHandlers() { - klog.Infof("Adding debug handlers to kubelet server.") + klog.InfoS("Adding debug handlers to kubelet server") s.addMetricsBucketMatcher("run") ws := new(restful.WebService) @@ -487,33 +482,6 @@ func (s *Server) InstallDebuggingHandlers() { s.addMetricsBucketMatcher("configz") configz.InstallHandler(s.restfulCont) - s.addMetricsBucketMatcher("debug") - handlePprofEndpoint := func(req *restful.Request, resp *restful.Response) { - name := strings.TrimPrefix(req.Request.URL.Path, pprofBasePath) - switch name { - case "profile": - pprof.Profile(resp, req.Request) - case "symbol": - pprof.Symbol(resp, req.Request) - case "cmdline": - pprof.Cmdline(resp, req.Request) - case "trace": - pprof.Trace(resp, req.Request) - default: - pprof.Index(resp, req.Request) - } - } - // Setup pprof handlers. - ws = new(restful.WebService).Path(pprofBasePath) - ws.Route(ws.GET("/{subpath:*}").To(func(req *restful.Request, resp *restful.Response) { - handlePprofEndpoint(req, resp) - })).Doc("pprof endpoint") - s.restfulCont.Add(ws) - - // Setup flags handlers. - // so far, only logging related endpoints are considered valid to add for these debug flags. - s.restfulCont.Handle("/debug/flags/v", routes.StringFlagPutHandler(logs.GlogSetter)) - // The /runningpods endpoint is used for testing only. s.addMetricsBucketMatcher("runningpods") ws = new(restful.WebService) @@ -563,10 +531,59 @@ func (s *Server) InstallSystemLogHandler(enableSystemLogHandler bool) { Param(ws.PathParameter("logpath", "path to the log").DataType("string"))) s.restfulCont.Add(ws) } else { - h := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - http.Error(w, "logs endpoint is disabled.", http.StatusMethodNotAllowed) - }) - s.restfulCont.Handle(logsPath, h) + s.restfulCont.Handle(logsPath, getHandlerForDisabledEndpoint("logs endpoint is disabled.")) + } +} + +func getHandlerForDisabledEndpoint(errorMessage string) http.HandlerFunc { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + http.Error(w, errorMessage, http.StatusMethodNotAllowed) + }) +} + +// InstallDebugFlagsHandler registers the HTTP request patterns for /debug/flags/v endpoint. +func (s *Server) InstallDebugFlagsHandler(enableDebugFlagsHandler bool) { + if enableDebugFlagsHandler { + // Setup flags handlers. + // so far, only logging related endpoints are considered valid to add for these debug flags. + s.restfulCont.Handle(debugFlagPath, routes.StringFlagPutHandler(logs.GlogSetter)) + } else { + s.restfulCont.Handle(debugFlagPath, getHandlerForDisabledEndpoint("flags endpoint is disabled.")) + return + } +} + +// InstallProfilingHandler registers the HTTP request patterns for /debug/pprof endpoint. +func (s *Server) InstallProfilingHandler(enableProfilingLogHandler bool, enableContentionProfiling bool) { + s.addMetricsBucketMatcher("debug") + if !enableProfilingLogHandler { + s.restfulCont.Handle(pprofBasePath, getHandlerForDisabledEndpoint("profiling endpoint is disabled.")) + return + } + + handlePprofEndpoint := func(req *restful.Request, resp *restful.Response) { + name := strings.TrimPrefix(req.Request.URL.Path, pprofBasePath) + switch name { + case "profile": + pprof.Profile(resp, req.Request) + case "symbol": + pprof.Symbol(resp, req.Request) + case "cmdline": + pprof.Cmdline(resp, req.Request) + case "trace": + pprof.Trace(resp, req.Request) + default: + pprof.Index(resp, req.Request) + } + } + + // Setup pprof handlers. + ws := new(restful.WebService).Path(pprofBasePath) + ws.Route(ws.GET("/{subpath:*}").To(handlePprofEndpoint)).Doc("pprof endpoint") + s.restfulCont.Add(ws) + + if enableContentionProfiling { + goruntime.SetBlockProfileRate(1) } } @@ -699,16 +716,6 @@ func (s *Server) getLogs(request *restful.Request, response *restful.Response) { s.host.ServeLogs(response, request.Request) } -// getSpec handles spec requests against the Kubelet. -func (s *Server) getSpec(request *restful.Request, response *restful.Response) { - info, err := s.host.GetCachedMachineInfo() - if err != nil { - response.WriteError(http.StatusInternalServerError, err) - return - } - response.WriteEntity(info) -} - type execRequestParams struct { podNamespace string podName string @@ -744,7 +751,7 @@ func getPortForwardRequestParams(req *restful.Request) portForwardRequestParams type responder struct{} func (r *responder) Error(w http.ResponseWriter, req *http.Request, err error) { - klog.Errorf("Error while proxying request: %v", err) + klog.ErrorS(err, "Error while proxying request") http.Error(w, err.Error(), http.StatusInternalServerError) } @@ -833,7 +840,7 @@ func writeJSONResponse(response *restful.Response, data []byte) { response.Header().Set(restful.HEADER_ContentType, restful.MIME_JSON) response.WriteHeader(http.StatusOK) if _, err := response.Write(data); err != nil { - klog.Errorf("Error writing response: %v", err) + klog.ErrorS(err, "Error writing response") } } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/BUILD deleted file mode 100644 index c932cad4b765..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/BUILD +++ /dev/null @@ -1,132 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fs_resource_analyzer.go", - "handler.go", - "resource_analyzer.go", - "summary.go", - "summary_sys_containers.go", - "summary_sys_containers_windows.go", - "volume_stat_calculator.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/server/stats", - visibility = ["//visibility:public"], - deps = [ - "//pkg/kubelet/cm:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/util:go_default_library", - "//pkg/kubelet/util/format:go_default_library", - "//pkg/volume:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/kubelet/pkg/apis/stats/v1alpha1:go_default_library", - "//vendor/github.com/emicklei/go-restful:go_default_library", - "//vendor/github.com/google/cadvisor/info/v1:go_default_library", - "//vendor/github.com/google/cadvisor/info/v2:go_default_library", - "//vendor/github.com/pkg/errors:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "summary_test.go", - "summary_windows_test.go", - "volume_stat_calculator_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/server/stats/testing:go_default_library", - "//pkg/volume:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/kubelet/pkg/apis/stats/v1alpha1:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ] + select({ - "@io_bazel_rules_go//go/platform:aix": [ - "//pkg/kubelet/cm:go_default_library", - "//vendor/github.com/google/gofuzz:go_default_library", - ], - "@io_bazel_rules_go//go/platform:android": [ - "//pkg/kubelet/cm:go_default_library", - "//vendor/github.com/google/gofuzz:go_default_library", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "//pkg/kubelet/cm:go_default_library", - "//vendor/github.com/google/gofuzz:go_default_library", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "//pkg/kubelet/cm:go_default_library", - "//vendor/github.com/google/gofuzz:go_default_library", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "//pkg/kubelet/cm:go_default_library", - "//vendor/github.com/google/gofuzz:go_default_library", - ], - "@io_bazel_rules_go//go/platform:illumos": [ - "//pkg/kubelet/cm:go_default_library", - "//vendor/github.com/google/gofuzz:go_default_library", - ], - "@io_bazel_rules_go//go/platform:ios": [ - "//pkg/kubelet/cm:go_default_library", - "//vendor/github.com/google/gofuzz:go_default_library", - ], - "@io_bazel_rules_go//go/platform:js": [ - "//pkg/kubelet/cm:go_default_library", - "//vendor/github.com/google/gofuzz:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//pkg/kubelet/cm:go_default_library", - "//vendor/github.com/google/gofuzz:go_default_library", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "//pkg/kubelet/cm:go_default_library", - "//vendor/github.com/google/gofuzz:go_default_library", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "//pkg/kubelet/cm:go_default_library", - "//vendor/github.com/google/gofuzz:go_default_library", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "//pkg/kubelet/cm:go_default_library", - "//vendor/github.com/google/gofuzz:go_default_library", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "//pkg/kubelet/cm:go_default_library", - "//vendor/github.com/google/gofuzz:go_default_library", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "//pkg/kubelet/cm:go_default_library", - "//vendor/github.com/google/gofuzz:go_default_library", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "//pkg/kubelet/cm:go_default_library", - "//vendor/github.com/google/gofuzz:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/kubelet/server/stats/testing:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/fs_resource_analyzer.go b/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/fs_resource_analyzer.go index cf93ece833c2..01ad396422ac 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/fs_resource_analyzer.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/fs_resource_analyzer.go @@ -23,6 +23,7 @@ import ( "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/client-go/tools/record" "k8s.io/klog/v2" ) @@ -40,15 +41,17 @@ type fsResourceAnalyzer struct { calcPeriod time.Duration cachedVolumeStats atomic.Value startOnce sync.Once + eventRecorder record.EventRecorder } var _ fsResourceAnalyzerInterface = &fsResourceAnalyzer{} // newFsResourceAnalyzer returns a new fsResourceAnalyzer implementation -func newFsResourceAnalyzer(statsProvider Provider, calcVolumePeriod time.Duration) *fsResourceAnalyzer { +func newFsResourceAnalyzer(statsProvider Provider, calcVolumePeriod time.Duration, eventRecorder record.EventRecorder) *fsResourceAnalyzer { r := &fsResourceAnalyzer{ statsProvider: statsProvider, calcPeriod: calcVolumePeriod, + eventRecorder: eventRecorder, } r.cachedVolumeStats.Store(make(statCache)) return r @@ -58,10 +61,10 @@ func newFsResourceAnalyzer(statsProvider Provider, calcVolumePeriod time.Duratio func (s *fsResourceAnalyzer) Start() { s.startOnce.Do(func() { if s.calcPeriod <= 0 { - klog.Info("Volume stats collection disabled.") + klog.InfoS("Volume stats collection disabled") return } - klog.Info("Starting FS ResourceAnalyzer") + klog.InfoS("Starting FS ResourceAnalyzer") go wait.Forever(func() { s.updateCachedPodVolumeStats() }, s.calcPeriod) }) } @@ -74,7 +77,7 @@ func (s *fsResourceAnalyzer) updateCachedPodVolumeStats() { // Copy existing entries to new map, creating/starting new entries for pods missing from the cache for _, pod := range s.statsProvider.GetPods() { if value, found := oldCache[pod.GetUID()]; !found { - newCache[pod.GetUID()] = newVolumeStatCalculator(s.statsProvider, s.calcPeriod, pod).StartOnce() + newCache[pod.GetUID()] = newVolumeStatCalculator(s.statsProvider, s.calcPeriod, pod, s.eventRecorder).StartOnce() } else { newCache[pod.GetUID()] = value } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/handler.go b/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/handler.go index 3d2260c48b60..c3781cf9b210 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/handler.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/handler.go @@ -17,12 +17,8 @@ limitations under the License. package stats import ( - "encoding/json" "fmt" - "io" "net/http" - "path" - "time" restful "github.com/emicklei/go-restful" cadvisorapi "github.com/google/cadvisor/info/v1" @@ -31,7 +27,6 @@ import ( "k8s.io/klog/v2" "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" statsapi "k8s.io/kubelet/pkg/apis/stats/v1alpha1" "k8s.io/kubernetes/pkg/kubelet/cm" @@ -113,31 +108,20 @@ type handler struct { } // CreateHandlers creates the REST handlers for the stats. -func CreateHandlers(rootPath string, provider Provider, summaryProvider SummaryProvider, enableCAdvisorJSONEndpoints bool) *restful.WebService { +func CreateHandlers(rootPath string, provider Provider, summaryProvider SummaryProvider) *restful.WebService { h := &handler{provider, summaryProvider} ws := &restful.WebService{} ws.Path(rootPath). Produces(restful.MIME_JSON) - type endpoint struct { + endpoints := []struct { path string handler restful.RouteFunction - } - - endpoints := []endpoint{ + }{ {"/summary", h.handleSummary}, } - if enableCAdvisorJSONEndpoints { - endpoints = append(endpoints, - endpoint{"", h.handleStats}, - endpoint{"/container", h.handleSystemContainer}, - endpoint{"/{podName}/{containerName}", h.handlePodContainer}, - endpoint{"/{namespace}/{podName}/{uid}/{containerName}", h.handlePodContainer}, - ) - } - for _, e := range endpoints { for _, method := range []string{"GET", "POST"} { ws.Route(ws. @@ -150,72 +134,6 @@ func CreateHandlers(rootPath string, provider Provider, summaryProvider SummaryP return ws } -type statsRequest struct { - // The name of the container for which to request stats. - // Default: / - // +optional - ContainerName string `json:"containerName,omitempty"` - - // Max number of stats to return. - // If start and end time are specified this limit is ignored. - // Default: 60 - // +optional - NumStats int `json:"num_stats,omitempty"` - - // Start time for which to query information. - // If omitted, the beginning of time is assumed. - // +optional - Start time.Time `json:"start,omitempty"` - - // End time for which to query information. - // If omitted, current time is assumed. - // +optional - End time.Time `json:"end,omitempty"` - - // Whether to also include information from subcontainers. - // Default: false. - // +optional - Subcontainers bool `json:"subcontainers,omitempty"` -} - -func (r *statsRequest) cadvisorRequest() *cadvisorapi.ContainerInfoRequest { - return &cadvisorapi.ContainerInfoRequest{ - NumStats: r.NumStats, - Start: r.Start, - End: r.End, - } -} - -func parseStatsRequest(request *restful.Request) (statsRequest, error) { - // Default request. - query := statsRequest{ - NumStats: 60, - } - - err := json.NewDecoder(request.Request.Body).Decode(&query) - if err != nil && err != io.EOF { - return query, err - } - return query, nil -} - -// Handles root container stats requests to /stats -func (h *handler) handleStats(request *restful.Request, response *restful.Response) { - query, err := parseStatsRequest(request) - if err != nil { - handleError(response, "/stats", err) - return - } - - // Root container stats. - statsMap, err := h.provider.GetRawContainerInfo("/", query.cadvisorRequest(), false) - if err != nil { - handleError(response, fmt.Sprintf("/stats %v", query), err) - return - } - writeResponse(response, statsMap["/"]) -} - // Handles stats summary requests to /stats/summary // If "only_cpu_and_memory" GET param is true then only cpu and memory is returned in response. func (h *handler) handleSummary(request *restful.Request, response *restful.Response) { @@ -244,77 +162,9 @@ func (h *handler) handleSummary(request *restful.Request, response *restful.Resp } } -// Handles non-kubernetes container stats requests to /stats/container/ -func (h *handler) handleSystemContainer(request *restful.Request, response *restful.Response) { - query, err := parseStatsRequest(request) - if err != nil { - handleError(response, "/stats/container", err) - return - } - - // Non-Kubernetes container stats. - containerName := path.Join("/", query.ContainerName) - stats, err := h.provider.GetRawContainerInfo( - containerName, query.cadvisorRequest(), query.Subcontainers) - if err != nil { - if _, ok := stats[containerName]; ok { - // If the failure is partial, log it and return a best-effort response. - klog.Errorf("Partial failure issuing GetRawContainerInfo(%v): %v", query, err) - } else { - handleError(response, fmt.Sprintf("/stats/container %v", query), err) - return - } - } - writeResponse(response, stats) -} - -// Handles kubernetes pod/container stats requests to: -// /stats// -// /stats//// -func (h *handler) handlePodContainer(request *restful.Request, response *restful.Response) { - query, err := parseStatsRequest(request) - if err != nil { - handleError(response, request.Request.URL.String(), err) - return - } - - // Default parameters. - params := map[string]string{ - "namespace": metav1.NamespaceDefault, - "uid": "", - } - for k, v := range request.PathParameters() { - params[k] = v - } - - if params["podName"] == "" || params["containerName"] == "" { - response.WriteErrorString(http.StatusBadRequest, - fmt.Sprintf("Invalid pod container request: %v", params)) - return - } - - pod, ok := h.provider.GetPodByName(params["namespace"], params["podName"]) - if !ok { - klog.V(4).Infof("Container not found: %v", params) - response.WriteError(http.StatusNotFound, kubecontainer.ErrContainerNotFound) - return - } - stats, err := h.provider.GetContainerInfo( - kubecontainer.GetPodFullName(pod), - types.UID(params["uid"]), - params["containerName"], - query.cadvisorRequest()) - - if err != nil { - handleError(response, fmt.Sprintf("%s %v", request.Request.URL.String(), query), err) - return - } - writeResponse(response, stats) -} - func writeResponse(response *restful.Response, stats interface{}) { if err := response.WriteAsJson(stats); err != nil { - klog.Errorf("Error writing response: %v", err) + klog.ErrorS(err, "Error writing response") } } @@ -326,7 +176,7 @@ func handleError(response *restful.Response, request string, err error) { response.WriteError(http.StatusNotFound, err) default: msg := fmt.Sprintf("Internal Error: %v", err) - klog.Errorf("HTTP InternalServerError serving %s: %s", request, msg) + klog.ErrorS(err, "HTTP InternalServerError serving", "request", request) response.WriteErrorString(http.StatusInternalServerError, msg) } } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/resource_analyzer.go b/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/resource_analyzer.go index bcddff0b3c41..853eeb67b0f4 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/resource_analyzer.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/resource_analyzer.go @@ -17,6 +17,7 @@ limitations under the License. package stats import ( + "k8s.io/client-go/tools/record" "time" ) @@ -37,8 +38,8 @@ type resourceAnalyzer struct { var _ ResourceAnalyzer = &resourceAnalyzer{} // NewResourceAnalyzer returns a new ResourceAnalyzer -func NewResourceAnalyzer(statsProvider Provider, calVolumeFrequency time.Duration) ResourceAnalyzer { - fsAnalyzer := newFsResourceAnalyzer(statsProvider, calVolumeFrequency) +func NewResourceAnalyzer(statsProvider Provider, calVolumeFrequency time.Duration, eventRecorder record.EventRecorder) ResourceAnalyzer { + fsAnalyzer := newFsResourceAnalyzer(statsProvider, calVolumeFrequency, eventRecorder) summaryProvider := NewSummaryProvider(statsProvider) return &resourceAnalyzer{fsAnalyzer, summaryProvider} } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/summary.go b/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/summary.go index fffa38c70121..0bc1154f7821 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/summary.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/summary.go @@ -54,7 +54,7 @@ func NewSummaryProvider(statsProvider Provider) SummaryProvider { bootTime, err := util.GetBootTime() if err != nil { // bootTime will be zero if we encounter an error getting the boot time. - klog.Warningf("Error getting system boot time. Node metrics will have an incorrect start time: %v", err) + klog.InfoS("Error getting system boot time. Node metrics will have an incorrect start time", "err", err) } return &summaryProviderImpl{ diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/summary_sys_containers.go b/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/summary_sys_containers.go index 38d6685dd6e6..bfbe6484344d 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/summary_sys_containers.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/summary_sys_containers.go @@ -44,7 +44,7 @@ func (sp *summaryProviderImpl) GetSystemContainersStats(nodeConfig cm.NodeConfig } s, _, err := sp.provider.GetCgroupStats(cont.name, cont.forceStatsUpdate) if err != nil { - klog.Errorf("Failed to get system container stats for %q: %v", cont.name, err) + klog.ErrorS(err, "Failed to get system container stats", "containerName", cont.name) continue } // System containers don't have a filesystem associated with them. @@ -79,7 +79,7 @@ func (sp *summaryProviderImpl) GetSystemContainersCPUAndMemoryStats(nodeConfig c } s, err := sp.provider.GetCgroupCPUAndMemoryStats(cont.name, cont.forceStatsUpdate) if err != nil { - klog.Errorf("Failed to get system container stats for %q: %v", cont.name, err) + klog.ErrorS(err, "Failed to get system container stats", "containerName", cont.name) continue } s.Name = sys diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/volume_stat_calculator.go b/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/volume_stat_calculator.go index 1cc8c2d7af6d..b12349a1e5a1 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/volume_stat_calculator.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/volume_stat_calculator.go @@ -17,17 +17,20 @@ limitations under the License. package stats import ( + "fmt" "sync" "sync/atomic" "time" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/util/wait" + utilfeature "k8s.io/apiserver/pkg/util/feature" + "k8s.io/client-go/tools/record" + "k8s.io/klog/v2" stats "k8s.io/kubelet/pkg/apis/stats/v1alpha1" - "k8s.io/kubernetes/pkg/kubelet/util/format" + "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/pkg/volume" - - "k8s.io/klog/v2" + "k8s.io/kubernetes/pkg/volume/util" ) // volumeStatCalculator calculates volume metrics for a given pod periodically in the background and caches the result @@ -39,6 +42,7 @@ type volumeStatCalculator struct { startO sync.Once stopO sync.Once latest atomic.Value + eventRecorder record.EventRecorder } // PodVolumeStats encapsulates the VolumeStats for a pod. @@ -49,12 +53,13 @@ type PodVolumeStats struct { } // newVolumeStatCalculator creates a new VolumeStatCalculator -func newVolumeStatCalculator(statsProvider Provider, jitterPeriod time.Duration, pod *v1.Pod) *volumeStatCalculator { +func newVolumeStatCalculator(statsProvider Provider, jitterPeriod time.Duration, pod *v1.Pod, eventRecorder record.EventRecorder) *volumeStatCalculator { return &volumeStatCalculator{ statsProvider: statsProvider, jitterPeriod: jitterPeriod, pod: pod, stopChannel: make(chan struct{}), + eventRecorder: eventRecorder, } } @@ -109,7 +114,7 @@ func (s *volumeStatCalculator) calcAndStoreStats() { if err != nil { // Expected for Volumes that don't support Metrics if !volume.IsNotSupported(err) { - klog.V(4).Infof("Failed to calculate volume metrics for pod %s volume %s: %+v", format.Pod(s.pod), name, err) + klog.V(4).InfoS("Failed to calculate volume metrics", "pod", klog.KObj(s.pod), "podUID", s.pod.UID, "volumeName", name, "err", err) } continue } @@ -123,12 +128,17 @@ func (s *volumeStatCalculator) calcAndStoreStats() { } } volumeStats := s.parsePodVolumeStats(name, pvcRef, metric, volSpec) - if isVolumeEphemeral(volSpec) { + if util.IsLocalEphemeralVolume(volSpec) { ephemeralStats = append(ephemeralStats, volumeStats) } else { persistentStats = append(persistentStats, volumeStats) } + if utilfeature.DefaultFeatureGate.Enabled(features.CSIVolumeHealth) { + if metric.Abnormal != nil && metric.Message != nil && (*metric.Abnormal) { + s.eventRecorder.Event(s.pod, v1.EventTypeWarning, "VolumeConditionAbnormal", fmt.Sprintf("Volume %s: %s", name, *metric.Message)) + } + } } // Store the new stats @@ -166,11 +176,3 @@ func (s *volumeStatCalculator) parsePodVolumeStats(podName string, pvcRef *stats UsedBytes: &used, Inodes: &inodes, InodesFree: &inodesFree, InodesUsed: &inodesUsed}, } } - -func isVolumeEphemeral(volume v1.Volume) bool { - if (volume.EmptyDir != nil && volume.EmptyDir.Medium == v1.StorageMediumDefault) || - volume.ConfigMap != nil || volume.GitRepo != nil { - return true - } - return false -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/stats/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/stats/BUILD deleted file mode 100644 index 6ae531b74f40..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/stats/BUILD +++ /dev/null @@ -1,101 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "cadvisor_stats_provider.go", - "cri_stats_provider.go", - "cri_stats_provider_others.go", - "cri_stats_provider_windows.go", - "helper.go", - "log_metrics_provider.go", - "provider.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/stats", - visibility = ["//visibility:public"], - deps = [ - "//pkg/kubelet/cadvisor:go_default_library", - "//pkg/kubelet/cm:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/kuberuntime:go_default_library", - "//pkg/kubelet/leaky:go_default_library", - "//pkg/kubelet/pod:go_default_library", - "//pkg/kubelet/server/stats:go_default_library", - "//pkg/kubelet/stats/pidlimit:go_default_library", - "//pkg/kubelet/status:go_default_library", - "//pkg/kubelet/types:go_default_library", - "//pkg/volume:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/cri-api/pkg/apis:go_default_library", - "//staging/src/k8s.io/cri-api/pkg/apis/runtime/v1alpha2:go_default_library", - "//staging/src/k8s.io/kubelet/pkg/apis/stats/v1alpha1:go_default_library", - "//vendor/github.com/google/cadvisor/fs:go_default_library", - "//vendor/github.com/google/cadvisor/info/v1:go_default_library", - "//vendor/github.com/google/cadvisor/info/v2:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ] + select({ - "@io_bazel_rules_go//go/platform:windows": [ - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/github.com/Microsoft/hcsshim:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/kubelet/stats/pidlimit:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = [ - "cadvisor_stats_provider_test.go", - "cri_stats_provider_test.go", - "helper_test.go", - "log_metrics_provider_test.go", - "provider_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/cadvisor/testing:go_default_library", - "//pkg/kubelet/cm:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/container/testing:go_default_library", - "//pkg/kubelet/kuberuntime:go_default_library", - "//pkg/kubelet/leaky:go_default_library", - "//pkg/kubelet/pod/testing:go_default_library", - "//pkg/kubelet/server/stats:go_default_library", - "//pkg/kubelet/status/testing:go_default_library", - "//pkg/kubelet/types:go_default_library", - "//pkg/volume:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/cri-api/pkg/apis/runtime/v1alpha2:go_default_library", - "//staging/src/k8s.io/cri-api/pkg/apis/testing:go_default_library", - "//staging/src/k8s.io/kubelet/pkg/apis/stats/v1alpha1:go_default_library", - "//vendor/github.com/golang/mock/gomock:go_default_library", - "//vendor/github.com/google/cadvisor/fs:go_default_library", - "//vendor/github.com/google/cadvisor/info/v1:go_default_library", - "//vendor/github.com/google/cadvisor/info/v2:go_default_library", - "//vendor/github.com/google/gofuzz:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/stats/cadvisor_stats_provider.go b/vendor/k8s.io/kubernetes/pkg/kubelet/stats/cadvisor_stats_provider.go index 36a402ae96dc..7fa1dc64d1f7 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/stats/cadvisor_stats_provider.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/stats/cadvisor_stats_provider.go @@ -52,6 +52,8 @@ type cadvisorStatsProvider struct { imageService kubecontainer.ImageService // statusProvider is used to get pod metadata statusProvider status.PodStatusProvider + // hostStatsProvider is used to get pod host stat usage. + hostStatsProvider HostStatsProvider } // newCadvisorStatsProvider returns a containerStatsProvider that provides @@ -61,12 +63,14 @@ func newCadvisorStatsProvider( resourceAnalyzer stats.ResourceAnalyzer, imageService kubecontainer.ImageService, statusProvider status.PodStatusProvider, + hostStatsProvider HostStatsProvider, ) containerStatsProvider { return &cadvisorStatsProvider{ - cadvisor: cadvisor, - resourceAnalyzer: resourceAnalyzer, - imageService: imageService, - statusProvider: statusProvider, + cadvisor: cadvisor, + resourceAnalyzer: resourceAnalyzer, + imageService: imageService, + statusProvider: statusProvider, + hostStatsProvider: hostStatsProvider, } } @@ -137,7 +141,17 @@ func (p *cadvisorStatsProvider) ListPodStats() ([]statsapi.PodStats, error) { copy(ephemeralStats, vstats.EphemeralVolumes) podStats.VolumeStats = append(append([]statsapi.VolumeStats{}, vstats.EphemeralVolumes...), vstats.PersistentVolumes...) } - podStats.EphemeralStorage = calcEphemeralStorage(podStats.Containers, ephemeralStats, &rootFsInfo, nil, false) + + logStats, err := p.hostStatsProvider.getPodLogStats(podStats.PodRef.Namespace, podStats.PodRef.Name, podUID, &rootFsInfo) + if err != nil { + klog.ErrorS(err, "Unable to fetch pod log stats", "pod", klog.KRef(podStats.PodRef.Namespace, podStats.PodRef.Name)) + } + etcHostsStats, err := p.hostStatsProvider.getPodEtcHostsStats(podUID, &rootFsInfo) + if err != nil { + klog.ErrorS(err, "Unable to fetch pod etc hosts stats", "pod", klog.KRef(podStats.PodRef.Namespace, podStats.PodRef.Name)) + } + + podStats.EphemeralStorage = calcEphemeralStorage(podStats.Containers, ephemeralStats, &rootFsInfo, logStats, etcHostsStats, false) // Lookup the pod-level cgroup's CPU and memory stats podInfo := getCadvisorPodInfoFromPodUID(podUID, allInfos) if podInfo != nil { @@ -280,9 +294,9 @@ func isPodManagedContainer(cinfo *cadvisorapiv2.ContainerInfo) bool { podNamespace := kubetypes.GetPodNamespace(cinfo.Spec.Labels) managed := podName != "" && podNamespace != "" if !managed && podName != podNamespace { - klog.Warningf( - "Expect container to have either both podName (%s) and podNamespace (%s) labels, or neither.", - podName, podNamespace) + klog.InfoS( + "Expect container to have either both podName and podNamespace labels, or neither", + "podNameLabel", podName, "podNamespaceLabel", podNamespace) } return managed } @@ -398,7 +412,7 @@ func getCadvisorContainerInfo(ca cadvisor.Interface) (map[string]cadvisorapiv2.C if _, ok := infos["/"]; ok { // If the failure is partial, log it and return a best-effort // response. - klog.Errorf("Partial failure issuing cadvisor.ContainerInfoV2: %v", err) + klog.ErrorS(err, "Partial failure issuing cadvisor.ContainerInfoV2") } else { return nil, fmt.Errorf("failed to get root cgroup stats: %v", err) } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/stats/cri_stats_provider.go b/vendor/k8s.io/kubernetes/pkg/kubelet/stats/cri_stats_provider.go index 32802f9b8231..e8fe923e41f5 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/stats/cri_stats_provider.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/stats/cri_stats_provider.go @@ -20,7 +20,6 @@ import ( "errors" "fmt" "path" - "path/filepath" "sort" "strings" "sync" @@ -35,8 +34,6 @@ import ( "k8s.io/klog/v2" statsapi "k8s.io/kubelet/pkg/apis/stats/v1alpha1" "k8s.io/kubernetes/pkg/kubelet/cadvisor" - kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" - "k8s.io/kubernetes/pkg/kubelet/kuberuntime" "k8s.io/kubernetes/pkg/kubelet/server/stats" kubetypes "k8s.io/kubernetes/pkg/kubelet/types" ) @@ -66,10 +63,8 @@ type criStatsProvider struct { runtimeService internalapi.RuntimeService // imageService is used to get the stats of the image filesystem. imageService internalapi.ImageManagerService - // logMetrics provides the metrics for container logs - logMetricsService LogMetricsService - // osInterface is the interface for syscalls. - osInterface kubecontainer.OSInterface + // hostStatsProvider is used to get the status of the host filesystem consumed by pods. + hostStatsProvider HostStatsProvider // cpuUsageCache caches the cpu usage for containers. cpuUsageCache map[string]*cpuUsageRecord @@ -83,16 +78,14 @@ func newCRIStatsProvider( resourceAnalyzer stats.ResourceAnalyzer, runtimeService internalapi.RuntimeService, imageService internalapi.ImageManagerService, - logMetricsService LogMetricsService, - osInterface kubecontainer.OSInterface, + hostStatsProvider HostStatsProvider, ) containerStatsProvider { return &criStatsProvider{ cadvisor: cadvisor, resourceAnalyzer: resourceAnalyzer, runtimeService: runtimeService, imageService: imageService, - logMetricsService: logMetricsService, - osInterface: osInterface, + hostStatsProvider: hostStatsProvider, cpuUsageCache: make(map[string]*cpuUsageRecord), } } @@ -205,7 +198,7 @@ func (p *criStatsProvider) listPodStats(updateCPUNanoCoreUsage bool) ([]statsapi // container stats caStats, caFound := caInfos[containerID] if !caFound { - klog.V(5).Infof("Unable to find cadvisor stats for %q", containerID) + klog.V(5).InfoS("Unable to find cadvisor stats for container", "containerID", containerID) } else { p.addCadvisorContainerStats(cs, &caStats) } @@ -290,9 +283,9 @@ func (p *criStatsProvider) ListPodCPUAndMemoryStats() ([]statsapi.PodStats, erro // container stats caStats, caFound := caInfos[containerID] if !caFound { - klog.V(4).Infof("Unable to find cadvisor stats for %q", containerID) + klog.V(4).InfoS("Unable to find cadvisor stats for container", "containerID", containerID) } else { - p.addCadvisorContainerStats(cs, &caStats) + p.addCadvisorContainerCPUAndMemoryStats(cs, &caStats) } ps.Containers = append(ps.Containers, *cs) } @@ -363,17 +356,17 @@ func (p *criStatsProvider) ImageFsDevice() (string, error) { // nil. func (p *criStatsProvider) getFsInfo(fsID *runtimeapi.FilesystemIdentifier) *cadvisorapiv2.FsInfo { if fsID == nil { - klog.V(2).Infof("Failed to get filesystem info: fsID is nil.") + klog.V(2).InfoS("Failed to get filesystem info: fsID is nil") return nil } mountpoint := fsID.GetMountpoint() fsInfo, err := p.cadvisor.GetDirFsInfo(mountpoint) if err != nil { - msg := fmt.Sprintf("Failed to get the info of the filesystem with mountpoint %q: %v.", mountpoint, err) + msg := "Failed to get the info of the filesystem with mountpoint" if err == cadvisorfs.ErrNoSuchDevice { - klog.V(2).Info(msg) + klog.V(2).InfoS(msg, "mountpoint", mountpoint, "err", err) } else { - klog.Error(msg) + klog.ErrorS(err, msg, "mountpoint", mountpoint) } return nil } @@ -401,19 +394,22 @@ func (p *criStatsProvider) makePodStorageStats(s *statsapi.PodStats, rootFsInfo if !found { return } - podLogDir := kuberuntime.BuildPodLogsDirectory(podNs, podName, podUID) - logStats, err := p.getPodLogStats(podLogDir, rootFsInfo) + logStats, err := p.hostStatsProvider.getPodLogStats(podNs, podName, podUID, rootFsInfo) if err != nil { - klog.Errorf("Unable to fetch pod log stats for path %s: %v ", podLogDir, err) + klog.ErrorS(err, "Unable to fetch pod log stats", "pod", klog.KRef(podNs, podName)) // If people do in-place upgrade, there might be pods still using // the old log path. For those pods, no pod log stats is returned. // We should continue generating other stats in that case. // calcEphemeralStorage tolerants logStats == nil. } + etcHostsStats, err := p.hostStatsProvider.getPodEtcHostsStats(podUID, rootFsInfo) + if err != nil { + klog.ErrorS(err, "Unable to fetch pod etc hosts stats", "pod", klog.KRef(podNs, podName)) + } ephemeralStats := make([]statsapi.VolumeStats, len(vstats.EphemeralVolumes)) copy(ephemeralStats, vstats.EphemeralVolumes) s.VolumeStats = append(append([]statsapi.VolumeStats{}, vstats.EphemeralVolumes...), vstats.PersistentVolumes...) - s.EphemeralStorage = calcEphemeralStorage(s.Containers, ephemeralStats, rootFsInfo, logStats, true) + s.EphemeralStorage = calcEphemeralStorage(s.Containers, ephemeralStats, rootFsInfo, logStats, etcHostsStats, true) } func (p *criStatsProvider) addPodNetworkStats( @@ -440,7 +436,7 @@ func (p *criStatsProvider) addPodNetworkStats( } // TODO: sum Pod network stats from container stats. - klog.V(4).Infof("Unable to find network stats for sandbox %q", podSandboxID) + klog.V(4).InfoS("Unable to find network stats for sandbox", "sandboxID", podSandboxID) } func (p *criStatsProvider) addPodCPUMemoryStats( @@ -581,14 +577,10 @@ func (p *criStatsProvider) makeContainerStats( // NOTE: This doesn't support the old pod log path, `/var/log/pods/UID`. For containers // using old log path, empty log stats are returned. This is fine, because we don't // officially support in-place upgrade anyway. - var ( - containerLogPath = kuberuntime.BuildContainerLogsDirectory(meta.GetNamespace(), - meta.GetName(), types.UID(meta.GetUid()), container.GetMetadata().GetName()) - err error - ) - result.Logs, err = p.getPathFsStats(containerLogPath, rootFsInfo) + var err error + result.Logs, err = p.hostStatsProvider.getPodContainerLogStats(meta.GetNamespace(), meta.GetName(), types.UID(meta.GetUid()), container.GetMetadata().GetName(), rootFsInfo) if err != nil { - klog.Errorf("Unable to fetch container log stats for path %s: %v ", containerLogPath, err) + klog.ErrorS(err, "Unable to fetch container log stats", "containerName", container.GetMetadata().GetName()) } return result } @@ -688,7 +680,7 @@ func (p *criStatsProvider) getAndUpdateContainerUsageNanoCores(stats *runtimeapi if err != nil { // This should not happen. Log now to raise visibility - klog.Errorf("failed updating cpu usage nano core: %v", err) + klog.ErrorS(err, "Failed updating cpu usage nano core") } return usage } @@ -785,6 +777,25 @@ func (p *criStatsProvider) addCadvisorContainerStats( cs.UserDefinedMetrics = cadvisorInfoToUserDefinedMetrics(caPodStats) } + cpu, memory := cadvisorInfoToCPUandMemoryStats(caPodStats) + if cpu != nil { + cs.CPU = cpu + } + if memory != nil { + cs.Memory = memory + } + accelerators := cadvisorInfoToAcceleratorStats(caPodStats) + cs.Accelerators = accelerators +} + +func (p *criStatsProvider) addCadvisorContainerCPUAndMemoryStats( + cs *statsapi.ContainerStats, + caPodStats *cadvisorapiv2.ContainerInfo, +) { + if caPodStats.Spec.HasCustomMetrics { + cs.UserDefinedMetrics = cadvisorInfoToUserDefinedMetrics(caPodStats) + } + cpu, memory := cadvisorInfoToCPUandMemoryStats(caPodStats) if cpu != nil { cs.CPU = cpu @@ -813,58 +824,3 @@ func getCRICadvisorStats(infos map[string]cadvisorapiv2.ContainerInfo) map[strin } return stats } - -func (p *criStatsProvider) getPathFsStats(path string, rootFsInfo *cadvisorapiv2.FsInfo) (*statsapi.FsStats, error) { - m := p.logMetricsService.createLogMetricsProvider(path) - logMetrics, err := m.GetMetrics() - if err != nil { - return nil, err - } - result := &statsapi.FsStats{ - Time: metav1.NewTime(rootFsInfo.Timestamp), - AvailableBytes: &rootFsInfo.Available, - CapacityBytes: &rootFsInfo.Capacity, - InodesFree: rootFsInfo.InodesFree, - Inodes: rootFsInfo.Inodes, - } - usedbytes := uint64(logMetrics.Used.Value()) - result.UsedBytes = &usedbytes - inodesUsed := uint64(logMetrics.InodesUsed.Value()) - result.InodesUsed = &inodesUsed - result.Time = maxUpdateTime(&result.Time, &logMetrics.Time) - return result, nil -} - -// getPodLogStats gets stats for logs under the pod log directory. Container logs usually exist -// under the container log directory. However, for some container runtimes, e.g. kata, gvisor, -// they may want to keep some pod level logs, in that case they can put those logs directly under -// the pod log directory. And kubelet will take those logs into account as part of pod ephemeral -// storage. -func (p *criStatsProvider) getPodLogStats(path string, rootFsInfo *cadvisorapiv2.FsInfo) (*statsapi.FsStats, error) { - files, err := p.osInterface.ReadDir(path) - if err != nil { - return nil, err - } - result := &statsapi.FsStats{ - Time: metav1.NewTime(rootFsInfo.Timestamp), - AvailableBytes: &rootFsInfo.Available, - CapacityBytes: &rootFsInfo.Capacity, - InodesFree: rootFsInfo.InodesFree, - Inodes: rootFsInfo.Inodes, - } - for _, f := range files { - if f.IsDir() { - continue - } - // Only include *files* under pod log directory. - fpath := filepath.Join(path, f.Name()) - fstats, err := p.getPathFsStats(fpath, rootFsInfo) - if err != nil { - return nil, fmt.Errorf("failed to get fsstats for %q: %v", fpath, err) - } - result.UsedBytes = addUsage(result.UsedBytes, fstats.UsedBytes) - result.InodesUsed = addUsage(result.InodesUsed, fstats.InodesUsed) - result.Time = maxUpdateTime(&result.Time, &fstats.Time) - } - return result, nil -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/stats/cri_stats_provider_windows.go b/vendor/k8s.io/kubernetes/pkg/kubelet/stats/cri_stats_provider_windows.go index 897598bb409a..617a1f455466 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/stats/cri_stats_provider_windows.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/stats/cri_stats_provider_windows.go @@ -43,7 +43,7 @@ func (p *criStatsProvider) listContainerNetworkStats() (map[string]*statsapi.Net for _, c := range containers { cstats, err := fetchContainerStats(c) if err != nil { - klog.V(4).Infof("Failed to fetch statistics for container %q with error '%v', continue to get stats for other containers", c.ID, err) + klog.V(4).InfoS("Failed to fetch statistics for container, continue to get stats for other containers", "containerID", c.ID, "err", err) continue } if len(cstats.Network) > 0 { @@ -86,7 +86,7 @@ func hcsStatsToNetworkStats(timestamp time.Time, hcsStats []hcsshim.NetworkStats for _, stat := range hcsStats { iStat, err := hcsStatsToInterfaceStats(stat) if err != nil { - klog.Warningf("Failed to get HNS endpoint %q with error '%v', continue to get stats for other endpoints", stat.EndpointId, err) + klog.InfoS("Failed to get HNS endpoint, continue to get stats for other endpoints", "endpointID", stat.EndpointId, "err", err) continue } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/stats/helper.go b/vendor/k8s.io/kubernetes/pkg/kubelet/stats/helper.go index 8618b36e0131..6af80ce3d97a 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/stats/helper.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/stats/helper.go @@ -153,6 +153,27 @@ func cadvisorInfoToContainerCPUAndMemoryStats(name string, info *cadvisorapiv2.C return result } +// cadvisorInfoToAcceleratorStats returns the statsapi.AcceleratorStats converted from +// the container info from cadvisor. +func cadvisorInfoToAcceleratorStats(info *cadvisorapiv2.ContainerInfo) []statsapi.AcceleratorStats { + cstat, found := latestContainerStats(info) + if !found || cstat.Accelerators == nil { + return nil + } + var result []statsapi.AcceleratorStats + for _, acc := range cstat.Accelerators { + result = append(result, statsapi.AcceleratorStats{ + Make: acc.Make, + Model: acc.Model, + ID: acc.ID, + MemoryTotal: acc.MemoryTotal, + MemoryUsed: acc.MemoryUsed, + DutyCycle: acc.DutyCycle, + }) + } + return result +} + func cadvisorInfoToProcessStats(info *cadvisorapiv2.ContainerInfo) *statsapi.ProcessStats { cstat, found := latestContainerStats(info) if !found || cstat.Processes == nil { @@ -225,7 +246,7 @@ func cadvisorInfoToUserDefinedMetrics(info *cadvisorapiv2.ContainerInfo) []stats for name, values := range stat.CustomMetrics { specVal, ok := udmMap[name] if !ok { - klog.Warningf("spec for custom metric %q is missing from cAdvisor output. Spec: %+v, Metrics: %+v", name, info.Spec, stat.CustomMetrics) + klog.InfoS("Spec for custom metric is missing from cAdvisor output", "metric", name, "spec", info.Spec, "metrics", stat.CustomMetrics) continue } for _, value := range values { @@ -351,7 +372,7 @@ func uint64Ptr(i uint64) *uint64 { } func calcEphemeralStorage(containers []statsapi.ContainerStats, volumes []statsapi.VolumeStats, rootFsInfo *cadvisorapiv2.FsInfo, - podLogStats *statsapi.FsStats, isCRIStatsProvider bool) *statsapi.FsStats { + podLogStats *statsapi.FsStats, etcHostsStats *statsapi.FsStats, isCRIStatsProvider bool) *statsapi.FsStats { result := &statsapi.FsStats{ Time: metav1.NewTime(rootFsInfo.Timestamp), AvailableBytes: &rootFsInfo.Available, @@ -372,6 +393,11 @@ func calcEphemeralStorage(containers []statsapi.ContainerStats, volumes []statsa result.InodesUsed = addUsage(result.InodesUsed, podLogStats.InodesUsed) result.Time = maxUpdateTime(&result.Time, &podLogStats.Time) } + if etcHostsStats != nil { + result.UsedBytes = addUsage(result.UsedBytes, etcHostsStats.UsedBytes) + result.InodesUsed = addUsage(result.InodesUsed, etcHostsStats.InodesUsed) + result.Time = maxUpdateTime(&result.Time, &etcHostsStats.Time) + } return result } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/stats/host_stats_provider.go b/vendor/k8s.io/kubernetes/pkg/kubelet/stats/host_stats_provider.go new file mode 100644 index 000000000000..108fbfb8f142 --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/stats/host_stats_provider.go @@ -0,0 +1,156 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package stats + +import ( + "fmt" + "path/filepath" + + cadvisorapiv2 "github.com/google/cadvisor/info/v2" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + statsapi "k8s.io/kubelet/pkg/apis/stats/v1alpha1" + kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" + "k8s.io/kubernetes/pkg/kubelet/kuberuntime" + "k8s.io/kubernetes/pkg/volume" +) + +// PodEtcHostsPathFunc is a function to fetch a etc hosts path by pod uid and whether etc host path is supported by the runtime +type PodEtcHostsPathFunc func(podUID types.UID) (string, bool) + +// metricsProviderByPath maps a path to its metrics provider +type metricsProviderByPath map[string]volume.MetricsProvider + +// HostStatsProvider defines an interface for providing host stats associated with pod. +type HostStatsProvider interface { + // getPodLogStats gets stats associated with pod log usage + getPodLogStats(podNamespace, podName string, podUID types.UID, rootFsInfo *cadvisorapiv2.FsInfo) (*statsapi.FsStats, error) + // getPodContainerLogStats gets stats associated with container log usage + getPodContainerLogStats(podNamespace, podName string, podUID types.UID, containerName string, rootFsInfo *cadvisorapiv2.FsInfo) (*statsapi.FsStats, error) + // getPodEtcHostsStats gets stats associated with pod etc-hosts usage + getPodEtcHostsStats(podUID types.UID, rootFsInfo *cadvisorapiv2.FsInfo) (*statsapi.FsStats, error) +} + +type hostStatsProvider struct { + // osInterface is the interface for syscalls. + osInterface kubecontainer.OSInterface + // podEtcHostsPathFunc fetches a pod etc hosts path by uid. + podEtcHostsPathFunc PodEtcHostsPathFunc +} + +// NewHostStatsProvider returns a new HostStatsProvider type struct. +func NewHostStatsProvider(osInterface kubecontainer.OSInterface, podEtcHostsPathFunc PodEtcHostsPathFunc) HostStatsProvider { + return hostStatsProvider{ + osInterface: osInterface, + podEtcHostsPathFunc: podEtcHostsPathFunc, + } +} + +func (h hostStatsProvider) getPodLogStats(podNamespace, podName string, podUID types.UID, rootFsInfo *cadvisorapiv2.FsInfo) (*statsapi.FsStats, error) { + metricsByPath, err := h.podLogMetrics(podNamespace, podName, podUID) + if err != nil { + return nil, err + } + return metricsByPathToFsStats(metricsByPath, rootFsInfo) +} + +// getPodContainerLogStats gets stats for container +func (h hostStatsProvider) getPodContainerLogStats(podNamespace, podName string, podUID types.UID, containerName string, rootFsInfo *cadvisorapiv2.FsInfo) (*statsapi.FsStats, error) { + metricsByPath, err := h.podContainerLogMetrics(podNamespace, podName, podUID, containerName) + if err != nil { + return nil, err + } + return metricsByPathToFsStats(metricsByPath, rootFsInfo) +} + +// getPodEtcHostsStats gets status for pod etc hosts usage +func (h hostStatsProvider) getPodEtcHostsStats(podUID types.UID, rootFsInfo *cadvisorapiv2.FsInfo) (*statsapi.FsStats, error) { + // Runtimes may not support etc hosts file (Windows with docker) + podEtcHostsPath, isEtcHostsSupported := h.podEtcHostsPathFunc(podUID) + if !isEtcHostsSupported { + return nil, nil + } + + metrics := volume.NewMetricsDu(podEtcHostsPath) + hostMetrics, err := metrics.GetMetrics() + if err != nil { + return nil, fmt.Errorf("failed to get stats %v", err) + } + result := rootFsInfoToFsStats(rootFsInfo) + usedBytes := uint64(hostMetrics.Used.Value()) + inodesUsed := uint64(hostMetrics.InodesUsed.Value()) + result.UsedBytes = addUsage(result.UsedBytes, &usedBytes) + result.InodesUsed = addUsage(result.InodesUsed, &inodesUsed) + result.Time = maxUpdateTime(&result.Time, &hostMetrics.Time) + return result, nil +} + +func (h hostStatsProvider) podLogMetrics(podNamespace, podName string, podUID types.UID) (metricsProviderByPath, error) { + podLogsDirectoryPath := kuberuntime.BuildPodLogsDirectory(podNamespace, podName, podUID) + return h.fileMetricsByDir(podLogsDirectoryPath) +} + +func (h hostStatsProvider) podContainerLogMetrics(podNamespace, podName string, podUID types.UID, containerName string) (metricsProviderByPath, error) { + podContainerLogsDirectoryPath := kuberuntime.BuildContainerLogsDirectory(podNamespace, podName, podUID, containerName) + return h.fileMetricsByDir(podContainerLogsDirectoryPath) +} + +// fileMetricsByDir returns metrics by path for each file under specified directory +func (h hostStatsProvider) fileMetricsByDir(dirname string) (metricsProviderByPath, error) { + files, err := h.osInterface.ReadDir(dirname) + if err != nil { + return nil, err + } + results := metricsProviderByPath{} + for _, f := range files { + if f.IsDir() { + continue + } + // Only include *files* under pod log directory. + fpath := filepath.Join(dirname, f.Name()) + results[fpath] = volume.NewMetricsDu(fpath) + } + return results, nil +} + +// metricsByPathToFsStats converts a metrics provider by path to fs stats +func metricsByPathToFsStats(metricsByPath metricsProviderByPath, rootFsInfo *cadvisorapiv2.FsInfo) (*statsapi.FsStats, error) { + result := rootFsInfoToFsStats(rootFsInfo) + for fpath, metrics := range metricsByPath { + hostMetrics, err := metrics.GetMetrics() + if err != nil { + return nil, fmt.Errorf("failed to get fsstats for %q: %v", fpath, err) + } + usedBytes := uint64(hostMetrics.Used.Value()) + inodesUsed := uint64(hostMetrics.InodesUsed.Value()) + result.UsedBytes = addUsage(result.UsedBytes, &usedBytes) + result.InodesUsed = addUsage(result.InodesUsed, &inodesUsed) + result.Time = maxUpdateTime(&result.Time, &hostMetrics.Time) + } + return result, nil +} + +// rootFsInfoToFsStats is a utility to convert rootFsInfo into statsapi.FsStats +func rootFsInfoToFsStats(rootFsInfo *cadvisorapiv2.FsInfo) *statsapi.FsStats { + return &statsapi.FsStats{ + Time: metav1.NewTime(rootFsInfo.Timestamp), + AvailableBytes: &rootFsInfo.Available, + CapacityBytes: &rootFsInfo.Capacity, + InodesFree: rootFsInfo.InodesFree, + Inodes: rootFsInfo.Inodes, + } +} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/stats/host_stats_provider_fake.go b/vendor/k8s.io/kubernetes/pkg/kubelet/stats/host_stats_provider_fake.go new file mode 100644 index 000000000000..3d68e36badd8 --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/stats/host_stats_provider_fake.go @@ -0,0 +1,110 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package stats + +import ( + "fmt" + "path/filepath" + + cadvisorapiv2 "github.com/google/cadvisor/info/v2" + "k8s.io/apimachinery/pkg/types" + statsapi "k8s.io/kubelet/pkg/apis/stats/v1alpha1" + kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" + kubecontainertest "k8s.io/kubernetes/pkg/kubelet/container/testing" + "k8s.io/kubernetes/pkg/kubelet/kuberuntime" + "k8s.io/kubernetes/pkg/volume" +) + +type fakeHostStatsProvider struct { + fakeStats map[string]*volume.Metrics + osInterface kubecontainer.OSInterface +} + +// NewFakeHostStatsProvider provides a way to test with fake host statistics +func NewFakeHostStatsProvider() HostStatsProvider { + return &fakeHostStatsProvider{ + osInterface: &kubecontainertest.FakeOS{}, + } +} + +// NewFakeHostStatsProviderWithData provides a way to test with fake host statistics +func NewFakeHostStatsProviderWithData(fakeStats map[string]*volume.Metrics, osInterface kubecontainer.OSInterface) HostStatsProvider { + return &fakeHostStatsProvider{ + fakeStats: fakeStats, + osInterface: osInterface, + } +} + +func (f *fakeHostStatsProvider) getPodLogStats(podNamespace, podName string, podUID types.UID, rootFsInfo *cadvisorapiv2.FsInfo) (*statsapi.FsStats, error) { + path := kuberuntime.BuildPodLogsDirectory(podNamespace, podName, podUID) + files, err := f.osInterface.ReadDir(path) + if err != nil { + return nil, err + } + var results []volume.MetricsProvider + for _, file := range files { + if file.IsDir() { + continue + } + // Only include *files* under pod log directory. + fpath := filepath.Join(path, file.Name()) + results = append(results, NewFakeMetricsDu(fpath, f.fakeStats[fpath])) + } + return fakeMetricsProvidersToStats(results, rootFsInfo) +} + +func (f *fakeHostStatsProvider) getPodContainerLogStats(podNamespace, podName string, podUID types.UID, containerName string, rootFsInfo *cadvisorapiv2.FsInfo) (*statsapi.FsStats, error) { + path := kuberuntime.BuildContainerLogsDirectory(podNamespace, podName, podUID, containerName) + metricsProvider := NewFakeMetricsDu(path, f.fakeStats[path]) + return fakeMetricsProvidersToStats([]volume.MetricsProvider{metricsProvider}, rootFsInfo) +} + +func (f *fakeHostStatsProvider) getPodEtcHostsStats(podUID types.UID, rootFsInfo *cadvisorapiv2.FsInfo) (*statsapi.FsStats, error) { + return nil, fmt.Errorf("not implemented") +} + +func fakeMetricsProvidersToStats(metricsProviders []volume.MetricsProvider, rootFsInfo *cadvisorapiv2.FsInfo) (*statsapi.FsStats, error) { + result := rootFsInfoToFsStats(rootFsInfo) + for i, metricsProvider := range metricsProviders { + hostMetrics, err := metricsProvider.GetMetrics() + if err != nil { + return nil, fmt.Errorf("failed to get stats for item %d: %v", i, err) + } + usedBytes := uint64(hostMetrics.Used.Value()) + inodesUsed := uint64(hostMetrics.InodesUsed.Value()) + result.UsedBytes = addUsage(result.UsedBytes, &usedBytes) + result.InodesUsed = addUsage(result.InodesUsed, &inodesUsed) + result.Time = maxUpdateTime(&result.Time, &hostMetrics.Time) + } + return result, nil +} + +type fakeMetricsDu struct { + fakeStats *volume.Metrics +} + +// NewFakeMetricsDu inserts fake statistics when asked for metrics +func NewFakeMetricsDu(path string, stats *volume.Metrics) volume.MetricsProvider { + return &fakeMetricsDu{fakeStats: stats} +} + +func (f *fakeMetricsDu) GetMetrics() (*volume.Metrics, error) { + if f.fakeStats == nil { + return nil, fmt.Errorf("no stats provided") + } + return f.fakeStats, nil +} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/stats/log_metrics_provider.go b/vendor/k8s.io/kubernetes/pkg/kubelet/stats/log_metrics_provider.go deleted file mode 100644 index 4a53eef74a30..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/stats/log_metrics_provider.go +++ /dev/null @@ -1,37 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package stats - -import ( - "k8s.io/kubernetes/pkg/volume" -) - -// LogMetricsService defines an interface for providing LogMetrics functionality. -type LogMetricsService interface { - createLogMetricsProvider(path string) volume.MetricsProvider -} - -type logMetrics struct{} - -// NewLogMetricsService returns a new LogMetricsService type struct. -func NewLogMetricsService() LogMetricsService { - return logMetrics{} -} - -func (l logMetrics) createLogMetricsProvider(path string) volume.MetricsProvider { - return volume.NewMetricsDu(path) -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/stats/pidlimit/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/stats/pidlimit/BUILD deleted file mode 100644 index b9f8ef5ebcb4..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/stats/pidlimit/BUILD +++ /dev/null @@ -1,78 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "pidlimit.go", - "pidlimit_linux.go", - "pidlimit_unsupported.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/stats/pidlimit", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - ] + select({ - "@io_bazel_rules_go//go/platform:aix": [ - "//staging/src/k8s.io/kubelet/pkg/apis/stats/v1alpha1:go_default_library", - ], - "@io_bazel_rules_go//go/platform:android": [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/kubelet/pkg/apis/stats/v1alpha1:go_default_library", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "//staging/src/k8s.io/kubelet/pkg/apis/stats/v1alpha1:go_default_library", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "//staging/src/k8s.io/kubelet/pkg/apis/stats/v1alpha1:go_default_library", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "//staging/src/k8s.io/kubelet/pkg/apis/stats/v1alpha1:go_default_library", - ], - "@io_bazel_rules_go//go/platform:illumos": [ - "//staging/src/k8s.io/kubelet/pkg/apis/stats/v1alpha1:go_default_library", - ], - "@io_bazel_rules_go//go/platform:ios": [ - "//staging/src/k8s.io/kubelet/pkg/apis/stats/v1alpha1:go_default_library", - ], - "@io_bazel_rules_go//go/platform:js": [ - "//staging/src/k8s.io/kubelet/pkg/apis/stats/v1alpha1:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/kubelet/pkg/apis/stats/v1alpha1:go_default_library", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "//staging/src/k8s.io/kubelet/pkg/apis/stats/v1alpha1:go_default_library", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "//staging/src/k8s.io/kubelet/pkg/apis/stats/v1alpha1:go_default_library", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "//staging/src/k8s.io/kubelet/pkg/apis/stats/v1alpha1:go_default_library", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "//staging/src/k8s.io/kubelet/pkg/apis/stats/v1alpha1:go_default_library", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "//staging/src/k8s.io/kubelet/pkg/apis/stats/v1alpha1:go_default_library", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "//staging/src/k8s.io/kubelet/pkg/apis/stats/v1alpha1:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/stats/provider.go b/vendor/k8s.io/kubernetes/pkg/kubelet/stats/provider.go index 5bea8d0947db..3ea8633200f5 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/stats/provider.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/stats/provider.go @@ -41,11 +41,10 @@ func NewCRIStatsProvider( runtimeCache kubecontainer.RuntimeCache, runtimeService internalapi.RuntimeService, imageService internalapi.ImageManagerService, - logMetricsService LogMetricsService, - osInterface kubecontainer.OSInterface, + hostStatsProvider HostStatsProvider, ) *Provider { return newStatsProvider(cadvisor, podManager, runtimeCache, newCRIStatsProvider(cadvisor, resourceAnalyzer, - runtimeService, imageService, logMetricsService, osInterface)) + runtimeService, imageService, hostStatsProvider)) } // NewCadvisorStatsProvider returns a containerStatsProvider that provides both @@ -57,8 +56,9 @@ func NewCadvisorStatsProvider( runtimeCache kubecontainer.RuntimeCache, imageService kubecontainer.ImageService, statusProvider status.PodStatusProvider, + hostStatsProvider HostStatsProvider, ) *Provider { - return newStatsProvider(cadvisor, podManager, runtimeCache, newCadvisorStatsProvider(cadvisor, resourceAnalyzer, imageService, statusProvider)) + return newStatsProvider(cadvisor, podManager, runtimeCache, newCadvisorStatsProvider(cadvisor, resourceAnalyzer, imageService, statusProvider, hostStatsProvider)) } // newStatsProvider returns a new Provider that provides node stats from diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/status/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/status/BUILD deleted file mode 100644 index 0bb5d3f162f0..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/status/BUILD +++ /dev/null @@ -1,79 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "generate.go", - "status_manager.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/status", - deps = [ - "//pkg/api/v1/pod:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/pod:go_default_library", - "//pkg/kubelet/types:go_default_library", - "//pkg/kubelet/util/format:go_default_library", - "//pkg/util/pod:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "generate_test.go", - "status_manager_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/api/v1/pod:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/kubelet/configmap:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/pod:go_default_library", - "//pkg/kubelet/pod/testing:go_default_library", - "//pkg/kubelet/secret:go_default_library", - "//pkg/kubelet/status/testing:go_default_library", - "//pkg/kubelet/types:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/kubelet/status/testing:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/status/status_manager.go b/vendor/k8s.io/kubernetes/pkg/kubelet/status/status_manager.go index e4c30ffbfd97..fb607ea8f8f0 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/status/status_manager.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/status/status_manager.go @@ -37,7 +37,6 @@ import ( kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" kubepod "k8s.io/kubernetes/pkg/kubelet/pod" kubetypes "k8s.io/kubernetes/pkg/kubelet/types" - "k8s.io/kubernetes/pkg/kubelet/util/format" statusutil "k8s.io/kubernetes/pkg/util/pod" ) @@ -151,11 +150,11 @@ func (m *manager) Start() { // on the master, where the kubelet is responsible for bootstrapping the pods // of the master components. if m.kubeClient == nil { - klog.Infof("Kubernetes client is nil, not starting status manager.") + klog.InfoS("Kubernetes client is nil, not starting status manager") return } - klog.Info("Starting to sync pod status with apiserver") + klog.InfoS("Starting to sync pod status with apiserver") //lint:ignore SA1015 Ticker can link since this is only called once and doesn't handle termination. syncTicker := time.Tick(syncPeriod) // syncPod and syncBatch share the same go routine to avoid sync races. @@ -163,11 +162,13 @@ func (m *manager) Start() { for { select { case syncRequest := <-m.podStatusChannel: - klog.V(5).Infof("Status Manager: syncing pod: %q, with status: (%d, %v) from podStatusChannel", - syncRequest.podUID, syncRequest.status.version, syncRequest.status.status) + klog.V(5).InfoS("Status Manager: syncing pod with status from podStatusChannel", + "podUID", syncRequest.podUID, + "statusVersion", syncRequest.status.version, + "status", syncRequest.status.status) m.syncPod(syncRequest.podUID, syncRequest.status) case <-syncTicker: - klog.V(5).Infof("Status Manager: syncing batch") + klog.V(5).InfoS("Status Manager: syncing batch") // remove any entries in the status channel since the batch will handle them for i := len(m.podStatusChannel); i > 0; i-- { <-m.podStatusChannel @@ -204,28 +205,32 @@ func (m *manager) SetContainerReadiness(podUID types.UID, containerID kubecontai pod, ok := m.podManager.GetPodByUID(podUID) if !ok { - klog.V(4).Infof("Pod %q has been deleted, no need to update readiness", string(podUID)) + klog.V(4).InfoS("Pod has been deleted, no need to update readiness", "podUID", string(podUID)) return } oldStatus, found := m.podStatuses[pod.UID] if !found { - klog.Warningf("Container readiness changed before pod has synced: %q - %q", - format.Pod(pod), containerID.String()) + klog.InfoS("Container readiness changed before pod has synced", + "pod", klog.KObj(pod), + "containerID", containerID.String()) return } // Find the container to update. containerStatus, _, ok := findContainerStatus(&oldStatus.status, containerID.String()) if !ok { - klog.Warningf("Container readiness changed for unknown container: %q - %q", - format.Pod(pod), containerID.String()) + klog.InfoS("Container readiness changed for unknown container", + "pod", klog.KObj(pod), + "containerID", containerID.String()) return } if containerStatus.Ready == ready { - klog.V(4).Infof("Container readiness unchanged (%v): %q - %q", ready, - format.Pod(pod), containerID.String()) + klog.V(4).InfoS("Container readiness unchanged", + "ready", ready, + "pod", klog.KObj(pod), + "containerID", containerID.String()) return } @@ -246,7 +251,7 @@ func (m *manager) SetContainerReadiness(podUID types.UID, containerID kubecontai if conditionIndex != -1 { status.Conditions[conditionIndex] = condition } else { - klog.Warningf("PodStatus missing %s type condition: %+v", conditionType, status) + klog.InfoS("PodStatus missing condition type", "conditionType", conditionType, "status", status) status.Conditions = append(status.Conditions, condition) } } @@ -261,28 +266,31 @@ func (m *manager) SetContainerStartup(podUID types.UID, containerID kubecontaine pod, ok := m.podManager.GetPodByUID(podUID) if !ok { - klog.V(4).Infof("Pod %q has been deleted, no need to update startup", string(podUID)) + klog.V(4).InfoS("Pod has been deleted, no need to update startup", "podUID", string(podUID)) return } oldStatus, found := m.podStatuses[pod.UID] if !found { - klog.Warningf("Container startup changed before pod has synced: %q - %q", - format.Pod(pod), containerID.String()) + klog.InfoS("Container startup changed before pod has synced", + "pod", klog.KObj(pod), + "containerID", containerID.String()) return } // Find the container to update. containerStatus, _, ok := findContainerStatus(&oldStatus.status, containerID.String()) if !ok { - klog.Warningf("Container startup changed for unknown container: %q - %q", - format.Pod(pod), containerID.String()) + klog.InfoS("Container startup changed for unknown container", + "pod", klog.KObj(pod), + "containerID", containerID.String()) return } if containerStatus.Started != nil && *containerStatus.Started == started { - klog.V(4).Infof("Container startup unchanged (%v): %q - %q", started, - format.Pod(pod), containerID.String()) + klog.V(4).InfoS("Container startup unchanged", + "pod", klog.KObj(pod), + "containerID", containerID.String()) return } @@ -393,11 +401,11 @@ func (m *manager) updateStatusInternal(pod *v1.Pod, status v1.PodStatus, forceUp // Check for illegal state transition in containers if err := checkContainerStateTransition(oldStatus.ContainerStatuses, status.ContainerStatuses, pod.Spec.RestartPolicy); err != nil { - klog.Errorf("Status update on pod %v/%v aborted: %v", pod.Namespace, pod.Name, err) + klog.ErrorS(err, "Status update on pod aborted", "pod", klog.KObj(pod)) return false } if err := checkContainerStateTransition(oldStatus.InitContainerStatuses, status.InitContainerStatuses, pod.Spec.RestartPolicy); err != nil { - klog.Errorf("Status update on pod %v/%v aborted: %v", pod.Namespace, pod.Name, err) + klog.ErrorS(err, "Status update on pod aborted", "pod", klog.KObj(pod)) return false } @@ -426,7 +434,7 @@ func (m *manager) updateStatusInternal(pod *v1.Pod, status v1.PodStatus, forceUp // The intent here is to prevent concurrent updates to a pod's status from // clobbering each other so the phase of a pod progresses monotonically. if isCached && isPodStatusByKubeletEqual(&cachedStatus.status, &status) && !forceUpdate { - klog.V(3).Infof("Ignoring same status for pod %q, status: %+v", format.Pod(pod), status) + klog.V(5).InfoS("Ignoring same status for pod", "pod", klog.KObj(pod), "status", status) return false // No new status. } @@ -440,14 +448,18 @@ func (m *manager) updateStatusInternal(pod *v1.Pod, status v1.PodStatus, forceUp select { case m.podStatusChannel <- podStatusSyncRequest{pod.UID, newStatus}: - klog.V(5).Infof("Status Manager: adding pod: %q, with status: (%d, %v) to podStatusChannel", - pod.UID, newStatus.version, newStatus.status) + klog.V(5).InfoS("Status Manager: adding pod with new status to podStatusChannel", + "pod", klog.KObj(pod), + "podUID", pod.UID, + "statusVersion", newStatus.version, + "status", newStatus.status) return true default: // Let the periodic syncBatch handle the update if the channel is full. // We can't block, since we hold the mutex lock. - klog.V(4).Infof("Skipping the status update for pod %q for now because the channel is full; status: %+v", - format.Pod(pod), status) + klog.V(4).InfoS("Skipping the status update for pod for now because the channel is full", + "pod", klog.KObj(pod), + "status", status) return false } } @@ -480,7 +492,7 @@ func (m *manager) RemoveOrphanedStatuses(podUIDs map[types.UID]bool) { defer m.podStatusesLock.Unlock() for key := range m.podStatuses { if _, ok := podUIDs[key]; !ok { - klog.V(5).Infof("Removing %q from status map.", key) + klog.V(5).InfoS("Removing pod from status map.", "podUID", key) delete(m.podStatuses, key) } } @@ -507,7 +519,9 @@ func (m *manager) syncBatch() { syncedUID := kubetypes.MirrorPodUID(uid) if mirrorUID, ok := podToMirror[kubetypes.ResolvedPodUID(uid)]; ok { if mirrorUID == "" { - klog.V(5).Infof("Static pod %q (%s/%s) does not have a corresponding mirror pod; skipping", uid, status.podName, status.podNamespace) + klog.V(5).InfoS("Static pod does not have a corresponding mirror pod; skipping", + "podUID", uid, + "pod", klog.KRef(status.podNamespace, status.podName)) continue } syncedUID = mirrorUID @@ -526,7 +540,7 @@ func (m *manager) syncBatch() { }() for _, update := range updatedStatuses { - klog.V(5).Infof("Status Manager: syncPod in syncbatch. pod UID: %q", update.podUID) + klog.V(5).InfoS("Status Manager: syncPod in syncbatch", "podUID", update.podUID) m.syncPod(update.podUID, update.status) } } @@ -534,42 +548,51 @@ func (m *manager) syncBatch() { // syncPod syncs the given status with the API server. The caller must not hold the lock. func (m *manager) syncPod(uid types.UID, status versionedPodStatus) { if !m.needsUpdate(uid, status) { - klog.V(1).Infof("Status for pod %q is up-to-date; skipping", uid) + klog.V(1).InfoS("Status for pod is up-to-date; skipping", "podUID", uid) return } // TODO: make me easier to express from client code pod, err := m.kubeClient.CoreV1().Pods(status.podNamespace).Get(context.TODO(), status.podName, metav1.GetOptions{}) if errors.IsNotFound(err) { - klog.V(3).Infof("Pod %q does not exist on the server", format.PodDesc(status.podName, status.podNamespace, uid)) + klog.V(3).InfoS("Pod does not exist on the server", + "podUID", uid, + "pod", klog.KRef(status.podNamespace, status.podName)) // If the Pod is deleted the status will be cleared in // RemoveOrphanedStatuses, so we just ignore the update here. return } if err != nil { - klog.Warningf("Failed to get status for pod %q: %v", format.PodDesc(status.podName, status.podNamespace, uid), err) + klog.InfoS("Failed to get status for pod", + "podUID", uid, + "pod", klog.KRef(status.podNamespace, status.podName), + "error", err) return } translatedUID := m.podManager.TranslatePodUID(pod.UID) // Type convert original uid just for the purpose of comparison. if len(translatedUID) > 0 && translatedUID != kubetypes.ResolvedPodUID(uid) { - klog.V(2).Infof("Pod %q was deleted and then recreated, skipping status update; old UID %q, new UID %q", format.Pod(pod), uid, translatedUID) + klog.V(2).InfoS("Pod was deleted and then recreated, skipping status update", + "pod", klog.KObj(pod), + "oldPodUID", uid, + "podUID", translatedUID) m.deletePodStatus(uid) return } oldStatus := pod.Status.DeepCopy() newPod, patchBytes, unchanged, err := statusutil.PatchPodStatus(m.kubeClient, pod.Namespace, pod.Name, pod.UID, *oldStatus, mergePodStatus(*oldStatus, status.status)) - klog.V(3).Infof("Patch status for pod %q with %q", format.Pod(pod), patchBytes) + klog.V(3).InfoS("Patch status for pod", "pod", klog.KObj(pod), "patchBytes", patchBytes) + if err != nil { - klog.Warningf("Failed to update status for pod %q: %v", format.Pod(pod), err) + klog.InfoS("Failed to update status for pod", "pod", klog.KObj(pod), "err", err) return } if unchanged { - klog.V(3).Infof("Status for pod %q is up-to-date: (%d)", format.Pod(pod), status.version) + klog.V(3).InfoS("Status for pod is up-to-date", "pod", klog.KObj(pod), "statusVersion", status.version) } else { - klog.V(3).Infof("Status for pod %q updated successfully: (%d, %+v)", format.Pod(pod), status.version, status.status) + klog.V(3).InfoS("Status for pod updated successfully", "pod", klog.KObj(pod), "statusVersion", status.version, "status", status.status) pod = newPod } @@ -585,10 +608,10 @@ func (m *manager) syncPod(uid types.UID, status versionedPodStatus) { } err = m.kubeClient.CoreV1().Pods(pod.Namespace).Delete(context.TODO(), pod.Name, deleteOptions) if err != nil { - klog.Warningf("Failed to delete status for pod %q: %v", format.Pod(pod), err) + klog.InfoS("Failed to delete status for pod", "pod", klog.KObj(pod), "err", err) return } - klog.V(3).Infof("Pod %q fully terminated and removed from etcd", format.Pod(pod)) + klog.V(3).InfoS("Pod fully terminated and removed from etcd", "pod", klog.KObj(pod)) m.deletePodStatus(uid) } } @@ -627,14 +650,14 @@ func (m *manager) needsReconcile(uid types.UID, status v1.PodStatus) bool { // The pod could be a static pod, so we should translate first. pod, ok := m.podManager.GetPodByUID(uid) if !ok { - klog.V(4).Infof("Pod %q has been deleted, no need to reconcile", string(uid)) + klog.V(4).InfoS("Pod has been deleted, no need to reconcile", "podUID", string(uid)) return false } // If the pod is a static pod, we should check its mirror pod, because only status in mirror pod is meaningful to us. if kubetypes.IsStaticPod(pod) { mirrorPod, ok := m.podManager.GetMirrorPodByPod(pod) if !ok { - klog.V(4).Infof("Static pod %q has no corresponding mirror pod, no need to reconcile", format.Pod(pod)) + klog.V(4).InfoS("Static pod has no corresponding mirror pod, no need to reconcile", "pod", klog.KObj(pod)) return false } pod = mirrorPod @@ -648,8 +671,9 @@ func (m *manager) needsReconcile(uid types.UID, status v1.PodStatus) bool { // reconcile is not needed. Just return. return false } - klog.V(3).Infof("Pod status is inconsistent with cached status for pod %q, a reconciliation should be triggered:\n %s", format.Pod(pod), - diff.ObjectDiff(podStatus, &status)) + klog.V(3).InfoS("Pod status is inconsistent with cached status for pod, a reconciliation should be triggered", + "pod", klog.KObj(pod), + "statusDiff", diff.ObjectDiff(podStatus, &status)) return true } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/sysctl/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/sysctl/BUILD deleted file mode 100644 index d9d32b5abda8..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/sysctl/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "namespace.go", - "whitelist.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/sysctl", - deps = [ - "//pkg/apis/core/validation:go_default_library", - "//pkg/apis/policy/validation:go_default_library", - "//pkg/kubelet/lifecycle:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "namespace_test.go", - "whitelist_test.go", - ], - embed = [":go_default_library"], - deps = ["//pkg/security/podsecuritypolicy/sysctl:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/token/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/token/BUILD deleted file mode 100644 index d317fbe9083a..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/token/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_library( - name = "go_default_library", - srcs = ["token_manager.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/token", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/authentication/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["token_manager_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/authentication/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/token/token_manager.go b/vendor/k8s.io/kubernetes/pkg/kubelet/token/token_manager.go index 1497be509bcf..7901c958f014 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/token/token_manager.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/token/token_manager.go @@ -118,7 +118,7 @@ func (m *Manager) GetServiceAccountToken(namespace, name string, tr *authenticat case m.expired(ctr): return nil, fmt.Errorf("token %s expired and refresh failed: %v", key, err) default: - klog.Errorf("couldn't update token %s: %v", key, err) + klog.ErrorS(err, "Couldn't update token", "cacheKey", key) return ctr, nil } } @@ -172,7 +172,7 @@ func (m *Manager) requiresRefresh(tr *authenticationv1.TokenRequest) bool { if tr.Spec.ExpirationSeconds == nil { cpy := tr.DeepCopy() cpy.Status.Token = "" - klog.Errorf("expiration seconds was nil for tr: %#v", cpy) + klog.ErrorS(nil, "Expiration seconds was nil for token request", "tokenRequest", cpy) return false } now := m.clock.Now() diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/types/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/types/BUILD deleted file mode 100644 index 2f4e1abe1918..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/types/BUILD +++ /dev/null @@ -1,56 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "constants.go", - "doc.go", - "labels.go", - "pod_status.go", - "pod_update.go", - "types.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/types", - deps = [ - "//pkg/apis/scheduling:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "labels_test.go", - "pod_status_test.go", - "pod_update_test.go", - "types_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/scheduling:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/types/constants.go b/vendor/k8s.io/kubernetes/pkg/kubelet/types/constants.go index 378c23efb2e6..80707645d060 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/types/constants.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/types/constants.go @@ -17,21 +17,24 @@ limitations under the License. package types const ( - // system default DNS resolver configuration + // ResolvConfDefault is the system default DNS resolver configuration. ResolvConfDefault = "/etc/resolv.conf" + // RFC3339NanoFixed is the fixed width version of time.RFC3339Nano. + RFC3339NanoFixed = "2006-01-02T15:04:05.000000000Z07:00" + // RFC3339NanoLenient is the variable width RFC3339 time format for lenient parsing of strings into timestamps. + RFC3339NanoLenient = "2006-01-02T15:04:05.999999999Z07:00" +) - // different container runtimes +// Different container runtimes. +const ( DockerContainerRuntime = "docker" RemoteContainerRuntime = "remote" +) - // User visible keys for managing node allocatable enforcement on the node. +// User visible keys for managing node allocatable enforcement on the node. +const ( NodeAllocatableEnforcementKey = "pods" SystemReservedEnforcementKey = "system-reserved" KubeReservedEnforcementKey = "kube-reserved" NodeAllocatableNoneKey = "none" - - // fixed width version of time.RFC3339Nano - RFC3339NanoFixed = "2006-01-02T15:04:05.000000000Z07:00" - // variable width RFC3339 time format for lenient parsing of strings into timestamps - RFC3339NanoLenient = "2006-01-02T15:04:05.999999999Z07:00" ) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/types/doc.go b/vendor/k8s.io/kubernetes/pkg/kubelet/types/doc.go index 88e345636eb1..814bf6db38cb 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/types/doc.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/types/doc.go @@ -14,5 +14,5 @@ See the License for the specific language governing permissions and limitations under the License. */ -// Common types in the Kubelet. +// Package types contains common types in the Kubelet. package types // import "k8s.io/kubernetes/pkg/kubelet/types" diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/types/labels.go b/vendor/k8s.io/kubernetes/pkg/kubelet/types/labels.go index c4dad6302e55..aeeee2c624ac 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/types/labels.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/types/labels.go @@ -16,6 +16,7 @@ limitations under the License. package types +// Label keys for labels used in this package. const ( KubernetesPodNameLabel = "io.kubernetes.pod.name" KubernetesPodNamespaceLabel = "io.kubernetes.pod.namespace" @@ -23,18 +24,22 @@ const ( KubernetesContainerNameLabel = "io.kubernetes.container.name" ) +// GetContainerName returns the value of the KubernetesContainerNameLabel. func GetContainerName(labels map[string]string) string { return labels[KubernetesContainerNameLabel] } +// GetPodName returns the value of the KubernetesPodNameLabel. func GetPodName(labels map[string]string) string { return labels[KubernetesPodNameLabel] } +// GetPodUID returns the value of the KubernetesPodUIDLabel. func GetPodUID(labels map[string]string) string { return labels[KubernetesPodUIDLabel] } +// GetPodNamespace returns the value of the KubernetesPodNamespaceLabel. func GetPodNamespace(labels map[string]string) string { return labels[KubernetesPodNamespaceLabel] } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/types/pod_update.go b/vendor/k8s.io/kubernetes/pkg/kubelet/types/pod_update.go index 8b64ea1de3cb..9420eef1eb32 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/types/pod_update.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/types/pod_update.go @@ -24,6 +24,7 @@ import ( "k8s.io/kubernetes/pkg/apis/scheduling" ) +// Annotation keys for annotations used in this package. const ( ConfigSourceAnnotationKey = "kubernetes.io/config.source" ConfigMirrorAnnotationKey = v1.MirrorPodAnnotationKey @@ -34,34 +35,38 @@ const ( // PodOperation defines what changes will be made on a pod configuration. type PodOperation int +// These constants identify the PodOperations that can be made on a pod configuration. const ( - // This is the current pod configuration + // SET is the current pod configuration. SET PodOperation = iota - // Pods with the given ids are new to this source + // ADD signifies pods that are new to this source. ADD - // Pods with the given ids are gracefully deleted from this source + // DELETE signifies pods that are gracefully deleted from this source. DELETE - // Pods with the given ids have been removed from this source + // REMOVE signifies pods that have been removed from this source. REMOVE - // Pods with the given ids have been updated in this source + // UPDATE signifies pods have been updated in this source. UPDATE - // Pods with the given ids have unexpected status in this source, - // kubelet should reconcile status with this source + // RECONCILE signifies pods that have unexpected status in this source, + // kubelet should reconcile status with this source. RECONCILE +) - // These constants identify the sources of pods - // Updates from a file +// These constants identify the sources of pods. +const ( + // Filesource idenitified updates from a file. FileSource = "file" - // Updates from querying a web page + // HTTPSource identifies updates from querying a web page. HTTPSource = "http" - // Updates from Kubernetes API Server + // ApiserverSource identifies updates from Kubernetes API Server. ApiserverSource = "api" - // Updates from all sources + // AllSource identifies updates from all sources. AllSource = "*" - - NamespaceDefault = metav1.NamespaceDefault ) +// NamespaceDefault is a string representing the default namespace. +const NamespaceDefault = metav1.NamespaceDefault + // PodUpdate defines an operation sent on the channel. You can add or remove single services by // sending an array of size one and Op == ADD|REMOVE (with REMOVE, only the ID is required). // For setting the state of the system to a given state for this source configuration, set @@ -77,7 +82,7 @@ type PodUpdate struct { Source string } -// Gets all validated sources from the specified sources. +// GetValidatedSources gets all validated sources from the specified sources. func GetValidatedSources(sources []string) ([]string, error) { validated := make([]string, 0, len(sources)) for _, source := range sources { @@ -179,3 +184,8 @@ func Preemptable(preemptor, preemptee *v1.Pod) bool { func IsCriticalPodBasedOnPriority(priority int32) bool { return priority >= scheduling.SystemCriticalPriority } + +// IsNodeCriticalPod checks if the given pod is a system-node-critical +func IsNodeCriticalPod(pod *v1.Pod) bool { + return IsCriticalPod(pod) && (pod.Spec.PriorityClassName == scheduling.SystemNodeCritical) +} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/types/types.go b/vendor/k8s.io/kubernetes/pkg/kubelet/types/types.go index b20d289a4b66..2ed7f1c991e5 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/types/types.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/types/types.go @@ -20,7 +20,7 @@ import ( "net/http" "time" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" ) @@ -61,7 +61,7 @@ func (t *Timestamp) GetString() string { return t.time.Format(RFC3339NanoFixed) } -// A type to help sort container statuses based on container names. +// SortedContainerStatuses is a type to help sort container statuses based on container names. type SortedContainerStatuses []v1.ContainerStatus func (s SortedContainerStatuses) Len() int { return len(s) } @@ -87,6 +87,8 @@ func SortInitContainerStatuses(p *v1.Pod, statuses []v1.ContainerStatus) { } } +// SortStatusesOfInitContainers returns the statuses of InitContainers of pod p, +// in the order that they appear in its spec. func SortStatusesOfInitContainers(p *v1.Pod, statusMap map[string]*v1.ContainerStatus) []v1.ContainerStatus { containers := p.Spec.InitContainers statuses := []v1.ContainerStatus{} @@ -106,8 +108,8 @@ type Reservation struct { Kubernetes v1.ResourceList } -// A pod UID which has been translated/resolved to the representation known to kubelets. +// ResolvedPodUID is a pod UID which has been translated/resolved to the representation known to kubelets. type ResolvedPodUID types.UID -// A pod UID for a mirror pod. +// MirrorPodUID is a pod UID for a mirror pod. type MirrorPodUID types.UID diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/util/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/util/BUILD deleted file mode 100644 index bb598accc6be..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/util/BUILD +++ /dev/null @@ -1,107 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "bootime_util_linux_test.go", - "util_test.go", - "util_unix_test.go", - "util_windows_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "//vendor/github.com/stretchr/testify/require:go_default_library", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "//vendor/github.com/stretchr/testify/require:go_default_library", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "//vendor/github.com/stretchr/testify/require:go_default_library", - ], - "@io_bazel_rules_go//go/platform:ios": [ - "//vendor/github.com/stretchr/testify/require:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//vendor/github.com/stretchr/testify/require:go_default_library", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "//vendor/github.com/Microsoft/go-winio:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - ], - "//conditions:default": [], - }), -) - -go_library( - name = "go_default_library", - srcs = [ - "boottime_util_darwin.go", - "boottime_util_linux.go", - "doc.go", - "nodelease.go", - "util.go", - "util_unix.go", - "util_unsupported.go", - "util_windows.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/util", - deps = [ - "//staging/src/k8s.io/api/coordination/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:ios": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "//vendor/github.com/Microsoft/go-winio:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/kubelet/util/cache:all-srcs", - "//pkg/kubelet/util/format:all-srcs", - "//pkg/kubelet/util/ioutils:all-srcs", - "//pkg/kubelet/util/manager:all-srcs", - "//pkg/kubelet/util/queue:all-srcs", - "//pkg/kubelet/util/sliceutils:all-srcs", - "//pkg/kubelet/util/store:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/util/boottime_util_freebsd.go b/vendor/k8s.io/kubernetes/pkg/kubelet/util/boottime_util_freebsd.go new file mode 100644 index 000000000000..ae1128cc6726 --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/util/boottime_util_freebsd.go @@ -0,0 +1,39 @@ +// +build freebsd + +/* +Copyright 2020 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package util + +import ( + "fmt" + "time" + + "golang.org/x/sys/unix" + "unsafe" +) + +// GetBootTime returns the time at which the machine was started, truncated to the nearest second +func GetBootTime() (time.Time, error) { + currentTime := time.Now() + ts := &unix.Timeval{} + _, _, e1 := unix.Syscall(uintptr(unix.SYS_CLOCK_GETTIME), uintptr(unix.CLOCK_UPTIME), uintptr(unsafe.Pointer(ts)), 0) + if e1 != 0 { + return time.Time{}, fmt.Errorf("error getting system uptime") + } + + return currentTime.Add(-time.Duration(ts.Sec) * time.Second).Truncate(time.Second), nil +} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/util/boottime_util_linux.go b/vendor/k8s.io/kubernetes/pkg/kubelet/util/boottime_util_linux.go index f00e7c06bfa5..c39b70f7c882 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/util/boottime_util_linux.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/util/boottime_util_linux.go @@ -1,4 +1,4 @@ -// +build freebsd linux +// +build linux /* Copyright 2018 The Kubernetes Authors. diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/util/cache/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/util/cache/BUILD deleted file mode 100644 index 8f1b41605ddd..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/util/cache/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["object_cache.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/util/cache", - deps = ["//staging/src/k8s.io/client-go/tools/cache:go_default_library"], -) - -go_test( - name = "go_default_test", - srcs = ["object_cache_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/util/format/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/util/format/BUILD deleted file mode 100644 index a3cc202f77fe..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/util/format/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "pod.go", - "resources.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/util/format", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "pod_test.go", - "resources_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/util/format/pod.go b/vendor/k8s.io/kubernetes/pkg/kubelet/util/format/pod.go index e05296e01e44..7a3f1aba400d 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/util/format/pod.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/util/format/pod.go @@ -18,15 +18,13 @@ package format import ( "fmt" - "strings" "time" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" + "k8s.io/klog/v2" ) -type podHandler func(*v1.Pod) string - // Pod returns a string representing a pod in a consistent human readable format, // with pod UID as part of the string. func Pod(pod *v1.Pod) string { @@ -57,22 +55,13 @@ func PodWithDeletionTimestamp(pod *v1.Pod) string { return Pod(pod) + deletionTimestamp } -// Pods returns a string representation a list of pods in a human -// readable format. -func Pods(pods []*v1.Pod) string { - return aggregatePods(pods, Pod) -} - -// PodsWithDeletionTimestamps is the same as Pods. In addition, it prints the -// deletion timestamps of the pods if they are not nil. -func PodsWithDeletionTimestamps(pods []*v1.Pod) string { - return aggregatePods(pods, PodWithDeletionTimestamp) -} - -func aggregatePods(pods []*v1.Pod, handler podHandler) string { - podStrings := make([]string, 0, len(pods)) - for _, pod := range pods { - podStrings = append(podStrings, handler(pod)) +// Pods returns a list of pods as ObjectRef +func Pods(pods []*v1.Pod) []klog.ObjectRef { + podKObjs := make([]klog.ObjectRef, 0, len(pods)) + for _, p := range pods { + if p != nil { + podKObjs = append(podKObjs, klog.KObj(p)) + } } - return strings.Join(podStrings, ", ") + return podKObjs } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/util/ioutils/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/util/ioutils/BUILD deleted file mode 100644 index 43bd26260847..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/util/ioutils/BUILD +++ /dev/null @@ -1,29 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["ioutils.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/util/ioutils", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["ioutils_test.go"], - embed = [":go_default_library"], - deps = ["//vendor/github.com/stretchr/testify/assert:go_default_library"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/util/manager/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/util/manager/BUILD deleted file mode 100644 index 2b569138a755..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/util/manager/BUILD +++ /dev/null @@ -1,73 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "cache_based_manager.go", - "manager.go", - "watch_based_manager.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/util/manager", - visibility = ["//visibility:public"], - deps = [ - "//pkg/features:go_default_library", - "//pkg/kubelet/util:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "cache_based_manager_test.go", - "watch_based_manager_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/api/v1/pod:go_default_library", - "//pkg/apis/core/v1:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/util/manager/watch_based_manager.go b/vendor/k8s.io/kubernetes/pkg/kubelet/util/manager/watch_based_manager.go index 4dfe10375393..ba0bfe35bc04 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/util/manager/watch_based_manager.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/util/manager/watch_based_manager.go @@ -31,11 +31,10 @@ import ( "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/util/clock" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/apimachinery/pkg/watch" - utilfeature "k8s.io/apiserver/pkg/util/feature" - "k8s.io/kubernetes/pkg/features" ) type listObjectFunc func(string, metav1.ListOptions) (runtime.Object, error) @@ -46,25 +45,108 @@ type isImmutableFunc func(runtime.Object) bool // objectCacheItem is a single item stored in objectCache. type objectCacheItem struct { refCount int - store cache.Store + store *cacheStore + reflector *cache.Reflector + hasSynced func() (bool, error) - // lock is protecting from closing stopCh multiple times. - lock sync.Mutex - stopCh chan struct{} + // waitGroup is used to ensure that there won't be two concurrent calls to reflector.Run + waitGroup sync.WaitGroup + + // lock is to ensure the access and modify of lastAccessTime, stopped, and immutable are thread safety, + // and protecting from closing stopCh multiple times. + lock sync.Mutex + lastAccessTime time.Time + stopped bool + immutable bool + stopCh chan struct{} } func (i *objectCacheItem) stop() bool { i.lock.Lock() defer i.lock.Unlock() - select { - case <-i.stopCh: - // This means that channel is already closed. + return i.stopThreadUnsafe() +} + +func (i *objectCacheItem) stopThreadUnsafe() bool { + if i.stopped { return false - default: - close(i.stopCh) - return true } + i.stopped = true + close(i.stopCh) + if !i.immutable { + i.store.unsetInitialized() + } + return true +} + +func (i *objectCacheItem) setLastAccessTime(time time.Time) { + i.lock.Lock() + defer i.lock.Unlock() + i.lastAccessTime = time +} + +func (i *objectCacheItem) setImmutable() { + i.lock.Lock() + defer i.lock.Unlock() + i.immutable = true +} + +func (i *objectCacheItem) stopIfIdle(now time.Time, maxIdleTime time.Duration) bool { + i.lock.Lock() + defer i.lock.Unlock() + if !i.stopped && now.After(i.lastAccessTime.Add(maxIdleTime)) { + return i.stopThreadUnsafe() + } + return false +} + +func (i *objectCacheItem) restartReflectorIfNeeded() { + i.lock.Lock() + defer i.lock.Unlock() + if i.immutable || !i.stopped { + return + } + i.stopCh = make(chan struct{}) + i.stopped = false + go i.startReflector() +} + +func (i *objectCacheItem) startReflector() { + i.waitGroup.Wait() + i.waitGroup.Add(1) + defer i.waitGroup.Done() + i.reflector.Run(i.stopCh) +} + +// cacheStore is in order to rewrite Replace function to mark initialized flag +type cacheStore struct { + cache.Store + lock sync.Mutex + initialized bool +} + +func (c *cacheStore) Replace(list []interface{}, resourceVersion string) error { + c.lock.Lock() + defer c.lock.Unlock() + err := c.Store.Replace(list, resourceVersion) + if err != nil { + return err + } + c.initialized = true + return nil +} + +func (c *cacheStore) hasSynced() bool { + c.lock.Lock() + defer c.lock.Unlock() + return c.initialized +} + +func (c *cacheStore) unsetInitialized() { + c.lock.Lock() + defer c.lock.Unlock() + c.initialized = false } // objectCache is a local cache of objects propagated via @@ -75,35 +157,53 @@ type objectCache struct { newObject newObjectFunc isImmutable isImmutableFunc groupResource schema.GroupResource + clock clock.Clock + maxIdleTime time.Duration lock sync.RWMutex items map[objectKey]*objectCacheItem } +const minIdleTime = 1 * time.Minute + // NewObjectCache returns a new watch-based instance of Store interface. func NewObjectCache( listObject listObjectFunc, watchObject watchObjectFunc, newObject newObjectFunc, isImmutable isImmutableFunc, - groupResource schema.GroupResource) Store { - return &objectCache{ + groupResource schema.GroupResource, + clock clock.Clock, + maxIdleTime time.Duration) Store { + + if maxIdleTime < minIdleTime { + maxIdleTime = minIdleTime + } + + store := &objectCache{ listObject: listObject, watchObject: watchObject, newObject: newObject, isImmutable: isImmutable, groupResource: groupResource, + clock: clock, + maxIdleTime: maxIdleTime, items: make(map[objectKey]*objectCacheItem), } + + // TODO propagate stopCh from the higher level. + go wait.Until(store.startRecycleIdleWatch, time.Minute, wait.NeverStop) + return store } -func (c *objectCache) newStore() cache.Store { +func (c *objectCache) newStore() *cacheStore { // TODO: We may consider created a dedicated store keeping just a single // item, instead of using a generic store implementation for this purpose. // However, simple benchmarks show that memory overhead in that case is // decrease from ~600B to ~300B per object. So we are not optimizing it // until we will see a good reason for that. - return cache.NewStore(cache.MetaNamespaceKeyFunc) + store := cache.NewStore(cache.MetaNamespaceKeyFunc) + return &cacheStore{store, sync.Mutex{}, false} } func (c *objectCache) newReflector(namespace, name string) *objectCacheItem { @@ -124,14 +224,15 @@ func (c *objectCache) newReflector(namespace, name string) *objectCacheItem { store, 0, ) - stopCh := make(chan struct{}) - go reflector.Run(stopCh) - return &objectCacheItem{ + item := &objectCacheItem{ refCount: 0, store: store, - hasSynced: func() (bool, error) { return reflector.LastSyncResourceVersion() != "", nil }, - stopCh: stopCh, + reflector: reflector, + hasSynced: func() (bool, error) { return store.hasSynced(), nil }, + stopCh: make(chan struct{}), } + go item.startReflector() + return item } func (c *objectCache) AddReference(namespace, name string) { @@ -186,10 +287,11 @@ func (c *objectCache) Get(namespace, name string) (runtime.Object, error) { if !exists { return nil, fmt.Errorf("object %q/%q not registered", namespace, name) } + item.restartReflectorIfNeeded() if err := wait.PollImmediate(10*time.Millisecond, time.Second, item.hasSynced); err != nil { return nil, fmt.Errorf("failed to sync %s cache: %v", c.groupResource.String(), err) } - + item.setLastAccessTime(c.clock.Now()) obj, exists, err := item.store.GetByKey(c.key(namespace, name)) if err != nil { return nil, err @@ -208,9 +310,10 @@ func (c *objectCache) Get(namespace, name string) (runtime.Object, error) { // already have it from here // - doing that would require significant refactoring to reflector // we limit ourselves to just quickly stop the reflector here. - if utilfeature.DefaultFeatureGate.Enabled(features.ImmutableEphemeralVolumes) && c.isImmutable(object) { + if c.isImmutable(object) { + item.setImmutable() if item.stop() { - klog.V(4).Infof("Stopped watching for changes of %q/%q - object is immutable", namespace, name) + klog.V(4).InfoS("Stopped watching for changes - object is immutable", "obj", klog.KRef(namespace, name)) } } return object, nil @@ -218,6 +321,17 @@ func (c *objectCache) Get(namespace, name string) (runtime.Object, error) { return nil, fmt.Errorf("unexpected object type: %v", obj) } +func (c *objectCache) startRecycleIdleWatch() { + c.lock.Lock() + defer c.lock.Unlock() + + for key, item := range c.items { + if item.stopIfIdle(c.clock.Now(), c.maxIdleTime) { + klog.V(4).InfoS("Not acquired for long time, Stopped watching for changes", "objectKey", key, "maxIdleTime", c.maxIdleTime) + } + } +} + // NewWatchBasedManager creates a manager that keeps a cache of all objects // necessary for registered pods. // It implements the following logic: @@ -230,7 +344,15 @@ func NewWatchBasedManager( newObject newObjectFunc, isImmutable isImmutableFunc, groupResource schema.GroupResource, + resyncInterval time.Duration, getReferencedObjects func(*v1.Pod) sets.String) Manager { - objectStore := NewObjectCache(listObject, watchObject, newObject, isImmutable, groupResource) + + // If a configmap/secret is used as a volume, the volumeManager will visit the objectCacheItem every resyncInterval cycle, + // We just want to stop the objectCacheItem referenced by environment variables, + // So, maxIdleTime is set to an integer multiple of resyncInterval, + // We currently set it to 5 times. + maxIdleTime := resyncInterval * 5 + + objectStore := NewObjectCache(listObject, watchObject, newObject, isImmutable, groupResource, clock.RealClock{}, maxIdleTime) return NewCacheBasedManager(objectStore, getReferencedObjects) } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/util/nodelease.go b/vendor/k8s.io/kubernetes/pkg/kubelet/util/nodelease.go index ce5203967344..9e1b00b76242 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/util/nodelease.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/util/nodelease.go @@ -46,7 +46,7 @@ func SetNodeOwnerFunc(c clientset.Interface, nodeName string) func(lease *coordi }, } } else { - klog.Errorf("failed to get node %q when trying to set owner ref to the node lease: %v", nodeName, err) + klog.ErrorS(err, "Failed to get node when trying to set owner ref to the node lease", "node", klog.KRef("", nodeName)) return err } } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/util/queue/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/util/queue/BUILD deleted file mode 100644 index 997eeb6e954f..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/util/queue/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["work_queue.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/util/queue", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["work_queue_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/util/sliceutils/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/util/sliceutils/BUILD deleted file mode 100644 index 053eeddf882c..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/util/sliceutils/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["sliceutils.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/util/sliceutils", - deps = [ - "//pkg/kubelet/container:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["sliceutils_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/container:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/util/store/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/util/store/BUILD deleted file mode 100644 index 8697660d7d74..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/util/store/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "filestore.go", - "store.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/util/store", - visibility = ["//visibility:public"], - deps = ["//pkg/util/filesystem:go_default_library"], -) - -go_test( - name = "go_default_test", - srcs = [ - "filestore_test.go", - "store_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/util/filesystem:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/util/util_unix.go b/vendor/k8s.io/kubernetes/pkg/kubelet/util/util_unix.go index 4aa5e5b55483..dafc22471b7e 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/util/util_unix.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/util/util_unix.go @@ -100,7 +100,7 @@ func parseEndpointWithFallbackProtocol(endpoint string, fallbackProtocol string) fallbackEndpoint := fallbackProtocol + "://" + endpoint protocol, addr, err = parseEndpoint(fallbackEndpoint) if err == nil { - klog.Warningf("Using %q as endpoint is deprecated, please consider using full url format %q.", endpoint, fallbackEndpoint) + klog.InfoS("Using this endpoint is deprecated, please consider using full URL format", "endpoint", endpoint, "URL", fallbackEndpoint) } } return diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/volume_host.go b/vendor/k8s.io/kubernetes/pkg/kubelet/volume_host.go index c724e8aaee4a..d2e538539bd3 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/volume_host.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/volume_host.go @@ -72,7 +72,7 @@ func NewInitializedVolumePluginMgr( csiDriversSynced = csiDriverInformer.Informer().HasSynced } else { - klog.Warning("kubeClient is nil. Skip initialization of CSIDriverLister") + klog.InfoS("KubeClient is nil. Skip initialization of CSIDriverLister") } kvh := &kubeletVolumeHost{ @@ -176,13 +176,13 @@ func (kvh *kubeletVolumeHost) CSIDriversSynced() cache.InformerSynced { // WaitForCacheSync is a helper function that waits for cache sync for CSIDriverLister func (kvh *kubeletVolumeHost) WaitForCacheSync() error { if kvh.csiDriversSynced == nil { - klog.Error("csiDriversSynced not found on KubeletVolumeHost") + klog.ErrorS(nil, "CsiDriversSynced not found on KubeletVolumeHost") return fmt.Errorf("csiDriversSynced not found on KubeletVolumeHost") } synced := []cache.InformerSynced{kvh.csiDriversSynced} if !cache.WaitForCacheSync(wait.NeverStop, synced...) { - klog.Warning("failed to wait for cache sync for CSIDriverLister") + klog.InfoS("Failed to wait for cache sync for CSIDriverLister") return fmt.Errorf("failed to wait for cache sync for CSIDriverLister") } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/BUILD deleted file mode 100644 index 1f168c9bf159..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/BUILD +++ /dev/null @@ -1,93 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "volume_manager.go", - "volume_manager_fake.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/volumemanager", - deps = [ - "//pkg/kubelet/config:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/pod:go_default_library", - "//pkg/kubelet/status:go_default_library", - "//pkg/kubelet/util/format:go_default_library", - "//pkg/kubelet/volumemanager/cache:go_default_library", - "//pkg/kubelet/volumemanager/metrics:go_default_library", - "//pkg/kubelet/volumemanager/populator:go_default_library", - "//pkg/kubelet/volumemanager/reconciler:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/csimigration:go_default_library", - "//pkg/volume/util:go_default_library", - "//pkg/volume/util/hostutil:go_default_library", - "//pkg/volume/util/operationexecutor:go_default_library", - "//pkg/volume/util/types:go_default_library", - "//pkg/volume/util/volumepathhandler:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/csi-translation-lib:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["volume_manager_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/config:go_default_library", - "//pkg/kubelet/configmap:go_default_library", - "//pkg/kubelet/container/testing:go_default_library", - "//pkg/kubelet/pod:go_default_library", - "//pkg/kubelet/pod/testing:go_default_library", - "//pkg/kubelet/secret:go_default_library", - "//pkg/kubelet/status:go_default_library", - "//pkg/kubelet/status/testing:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/testing:go_default_library", - "//pkg/volume/util:go_default_library", - "//pkg/volume/util/hostutil:go_default_library", - "//pkg/volume/util/types:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/client-go/util/testing:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/kubelet/volumemanager/cache:all-srcs", - "//pkg/kubelet/volumemanager/metrics:all-srcs", - "//pkg/kubelet/volumemanager/populator:all-srcs", - "//pkg/kubelet/volumemanager/reconciler:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/OWNERS b/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/OWNERS index 26531173539e..22ed1d227024 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/OWNERS +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/OWNERS @@ -4,6 +4,7 @@ approvers: - saad-ali - jsafrane - msau42 +- jingxu97 reviewers: - jsafrane - gnufied diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/cache/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/cache/BUILD deleted file mode 100644 index 6a526caf3c88..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/cache/BUILD +++ /dev/null @@ -1,63 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "actual_state_of_world.go", - "desired_state_of_world.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/volumemanager/cache", - deps = [ - "//pkg/api/v1/resource:go_default_library", - "//pkg/features:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/util:go_default_library", - "//pkg/volume/util/operationexecutor:go_default_library", - "//pkg/volume/util/types:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "actual_state_of_world_test.go", - "desired_state_of_world_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/volume:go_default_library", - "//pkg/volume/testing:go_default_library", - "//pkg/volume/util:go_default_library", - "//pkg/volume/util/operationexecutor:go_default_library", - "//pkg/volume/util/types:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/cache/actual_state_of_world.go b/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/cache/actual_state_of_world.go index 155caebd7801..70a4c3d34097 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/cache/actual_state_of_world.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/cache/actual_state_of_world.go @@ -461,9 +461,7 @@ func (asw *actualStateOfWorld) addVolume( } else { // If volume object already exists, update the fields such as device path volumeObj.devicePath = devicePath - klog.V(2).Infof("Volume %q is already added to attachedVolume list, update device path %q", - volumeName, - devicePath) + klog.V(2).InfoS("Volume is already added to attachedVolume list, update device path", "volumeName", volumeName, "path", devicePath) } asw.attachedVolumes[volumeName] = volumeObj @@ -530,9 +528,7 @@ func (asw *actualStateOfWorld) MarkVolumeAsResized( podName, volumeName) } - - klog.V(5).Infof("Volume %s(OuterVolumeSpecName %s) of pod %s has been resized", - volumeName, podObj.outerVolumeSpecName, podName) + klog.V(5).InfoS("Pod volume has been resized", "uniquePodName", podName, "volumeName", volumeName, "outerVolumeSpecName", podObj.outerVolumeSpecName) podObj.fsResizeRequired = false asw.attachedVolumes[volumeName].mountedPods[podName] = podObj return nil @@ -548,12 +544,7 @@ func (asw *actualStateOfWorld) MarkRemountRequired( asw.volumePluginMgr.FindPluginBySpec(podObj.volumeSpec) if err != nil || volumePlugin == nil { // Log and continue processing - klog.Errorf( - "MarkRemountRequired failed to FindPluginBySpec for pod %q (podUid %q) volume: %q (volSpecName: %q)", - podObj.podName, - podObj.podUID, - volumeObj.volumeName, - podObj.volumeSpec.Name()) + klog.ErrorS(nil, "MarkRemountRequired failed to FindPluginBySpec for volume", "uniquePodName", podObj.podName, "podUID", podObj.podUID, "volumeName", volumeName, "volumeSpecName", podObj.volumeSpec.Name()) continue } @@ -572,14 +563,13 @@ func (asw *actualStateOfWorld) MarkFSResizeRequired( defer asw.Unlock() volumeObj, volumeExists := asw.attachedVolumes[volumeName] if !volumeExists { - klog.Warningf("MarkFSResizeRequired for volume %s failed as volume not exist", volumeName) + klog.InfoS("MarkFSResizeRequired for volume failed as volume does not exist", "volumeName", volumeName) return } podObj, podExists := volumeObj.mountedPods[podName] if !podExists { - klog.Warningf("MarkFSResizeRequired for volume %s failed "+ - "as pod(%s) not exist", volumeName, podName) + klog.InfoS("MarkFSResizeRequired for volume failed because the pod does not exist", "uniquePodName", podName, "volumeName", volumeName) return } @@ -587,18 +577,13 @@ func (asw *actualStateOfWorld) MarkFSResizeRequired( asw.volumePluginMgr.FindNodeExpandablePluginBySpec(podObj.volumeSpec) if err != nil || volumePlugin == nil { // Log and continue processing - klog.Errorf( - "MarkFSResizeRequired failed to find expandable plugin for pod %q volume: %q (volSpecName: %q)", - podObj.podName, - volumeObj.volumeName, - podObj.volumeSpec.Name()) + klog.ErrorS(nil, "MarkFSResizeRequired failed to find expandable plugin for volume", "uniquePodName", podObj.podName, "volumeName", volumeObj.volumeName, "volumeSpecName", podObj.volumeSpec.Name()) return } if volumePlugin.RequiresFSResize() { if !podObj.fsResizeRequired { - klog.V(3).Infof("PVC volume %s(OuterVolumeSpecName %s) of pod %s requires file system resize", - volumeName, podObj.outerVolumeSpecName, podName) + klog.V(3).InfoS("PVC volume of the pod requires file system resize", "uniquePodName", podName, "volumeName", volumeName, "outerVolumeSpecName", podObj.outerVolumeSpecName) podObj.fsResizeRequired = true } asw.attachedVolumes[volumeName].mountedPods[podName] = podObj diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/metrics/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/metrics/BUILD deleted file mode 100644 index d39ab810a234..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/metrics/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["metrics.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/volumemanager/metrics", - visibility = ["//visibility:public"], - deps = [ - "//pkg/kubelet/volumemanager/cache:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/util:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["metrics_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/volumemanager/cache:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/testing:go_default_library", - "//pkg/volume/util:go_default_library", - "//pkg/volume/util/operationexecutor:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/populator/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/populator/BUILD deleted file mode 100644 index a8d6502dbfde..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/populator/BUILD +++ /dev/null @@ -1,79 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["desired_state_of_world_populator.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/volumemanager/populator", - deps = [ - "//pkg/features:go_default_library", - "//pkg/kubelet/config:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/pod:go_default_library", - "//pkg/kubelet/status:go_default_library", - "//pkg/kubelet/util/format:go_default_library", - "//pkg/kubelet/volumemanager/cache:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/csimigration:go_default_library", - "//pkg/volume/util:go_default_library", - "//pkg/volume/util/types:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["desired_state_of_world_populator_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/features:go_default_library", - "//pkg/kubelet/configmap:go_default_library", - "//pkg/kubelet/container/testing:go_default_library", - "//pkg/kubelet/pod:go_default_library", - "//pkg/kubelet/pod/testing:go_default_library", - "//pkg/kubelet/secret:go_default_library", - "//pkg/kubelet/status:go_default_library", - "//pkg/kubelet/status/testing:go_default_library", - "//pkg/kubelet/volumemanager/cache:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/csimigration:go_default_library", - "//pkg/volume/testing:go_default_library", - "//pkg/volume/util:go_default_library", - "//pkg/volume/util/operationexecutor:go_default_library", - "//pkg/volume/util/types:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - "//staging/src/k8s.io/csi-translation-lib:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/populator/desired_state_of_world_populator.go b/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/populator/desired_state_of_world_populator.go index 6cd4d58761be..56f6a0a9063c 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/populator/desired_state_of_world_populator.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/populator/desired_state_of_world_populator.go @@ -41,7 +41,6 @@ import ( kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" "k8s.io/kubernetes/pkg/kubelet/pod" "k8s.io/kubernetes/pkg/kubelet/status" - "k8s.io/kubernetes/pkg/kubelet/util/format" "k8s.io/kubernetes/pkg/kubelet/volumemanager/cache" "k8s.io/kubernetes/pkg/volume" "k8s.io/kubernetes/pkg/volume/csimigration" @@ -139,7 +138,7 @@ type processedPods struct { func (dswp *desiredStateOfWorldPopulator) Run(sourcesReady config.SourcesReady, stopCh <-chan struct{}) { // Wait for the completion of a loop that started after sources are all ready, then set hasAddedPods accordingly - klog.Infof("Desired state populator starts to run") + klog.InfoS("Desired state populator starts to run") wait.PollUntil(dswp.loopSleepDuration, func() (bool, error) { done := sourcesReady.AllReady() dswp.populatorLoop() @@ -171,11 +170,7 @@ func (dswp *desiredStateOfWorldPopulator) populatorLoop() { // findAndRemoveDeletedPods() is called independently of the main // populator loop. if time.Since(dswp.timeOfLastGetPodStatus) < dswp.getPodStatusRetryDuration { - klog.V(5).Infof( - "Skipping findAndRemoveDeletedPods(). Not permitted until %v (getPodStatusRetryDuration %v).", - dswp.timeOfLastGetPodStatus.Add(dswp.getPodStatusRetryDuration), - dswp.getPodStatusRetryDuration) - + klog.V(5).InfoS("Skipping findAndRemoveDeletedPods(). ", "nextRetryTime", dswp.timeOfLastGetPodStatus.Add(dswp.getPodStatusRetryDuration), "retryDuration", dswp.getPodStatusRetryDuration) return } @@ -234,7 +229,7 @@ func (dswp *desiredStateOfWorldPopulator) findAndRemoveDeletedPods() { // It is not possible right now for a CSI plugin to be both attachable and non-deviceMountable // So the uniqueVolumeName should remain the same after the attachability change dswp.desiredStateOfWorld.MarkVolumeAttachability(volumeToMount.VolumeName, false) - klog.Infof("Volume %v changes from attachable to non-attachable.", volumeToMount.VolumeName) + klog.InfoS("Volume changes from attachable to non-attachable", "volumeName", volumeToMount.VolumeName) continue } } @@ -256,9 +251,7 @@ func (dswp *desiredStateOfWorldPopulator) findAndRemoveDeletedPods() { var getPodsErr error runningPods, getPodsErr = dswp.kubeContainerRuntime.GetPods(false) if getPodsErr != nil { - klog.Errorf( - "kubeContainerRuntime.findAndRemoveDeletedPods returned error %v.", - getPodsErr) + klog.ErrorS(getPodsErr, "kubeContainerRuntime.findAndRemoveDeletedPods returned error") continue } @@ -269,7 +262,11 @@ func (dswp *desiredStateOfWorldPopulator) findAndRemoveDeletedPods() { runningContainers := false for _, runningPod := range runningPods { if runningPod.ID == volumeToMount.Pod.UID { - if len(runningPod.Containers) > 0 { + // runningPod.Containers only include containers in the running state, + // excluding containers in the creating process. + // By adding a non-empty judgment for runningPod.Sandboxes, + // ensure that all containers of the pod have been terminated. + if len(runningPod.Sandboxes) > 0 || len(runningPod.Containers) > 0 { runningContainers = true } @@ -278,19 +275,19 @@ func (dswp *desiredStateOfWorldPopulator) findAndRemoveDeletedPods() { } if runningContainers { - klog.V(4).Infof( - "Pod %q still has one or more containers in the non-exited state. Therefore, it will not be removed from desired state.", - format.Pod(volumeToMount.Pod)) + klog.V(4).InfoS("Pod still has one or more containers in the non-exited state and will not be removed from desired state", "pod", klog.KObj(volumeToMount.Pod)) continue } exists, _, _ := dswp.actualStateOfWorld.PodExistsInVolume(volumeToMount.PodName, volumeToMount.VolumeName) + var volumeToMountSpecName string + if volumeToMount.VolumeSpec != nil { + volumeToMountSpecName = volumeToMount.VolumeSpec.Name() + } if !exists && podExists { - klog.V(4).Infof( - volumeToMount.GenerateMsgDetailed(fmt.Sprintf("Actual state has not yet has this volume mounted information and pod (%q) still exists in pod manager, skip removing volume from desired state", - format.Pod(volumeToMount.Pod)), "")) + klog.V(4).InfoS("Actual state does not yet have volume mount information and pod still exists in pod manager, skip removing volume from desired state", "pod", klog.KObj(volumeToMount.Pod), "podUID", volumeToMount.Pod.UID, "volumeName", volumeToMountSpecName) continue } - klog.V(4).Infof(volumeToMount.GenerateMsgDetailed("Removing volume from desired state", "")) + klog.V(4).InfoS("Removing volume from desired state", "pod", klog.KObj(volumeToMount.Pod), "podUID", volumeToMount.Pod.UID, "volumeName", volumeToMountSpecName) dswp.desiredStateOfWorld.DeletePodFromVolume( volumeToMount.PodName, volumeToMount.VolumeName) @@ -328,18 +325,14 @@ func (dswp *desiredStateOfWorldPopulator) processPodVolumes( for _, podVolume := range pod.Spec.Volumes { if !mounts.Has(podVolume.Name) && !devices.Has(podVolume.Name) { // Volume is not used in the pod, ignore it. - klog.V(4).Infof("Skipping unused volume %q for pod %q", podVolume.Name, format.Pod(pod)) + klog.V(4).InfoS("Skipping unused volume", "pod", klog.KObj(pod), "volumeName", podVolume.Name) continue } pvc, volumeSpec, volumeGidValue, err := dswp.createVolumeSpec(podVolume, pod, mounts, devices) if err != nil { - klog.Errorf( - "Error processing volume %q for pod %q: %v", - podVolume.Name, - format.Pod(pod), - err) + klog.ErrorS(err, "Error processing volume", "pod", klog.KObj(pod), "volumeName", podVolume.Name) dswp.desiredStateOfWorld.AddErrorToPod(uniquePodName, err.Error()) allVolumesAdded = false continue @@ -349,20 +342,11 @@ func (dswp *desiredStateOfWorldPopulator) processPodVolumes( _, err = dswp.desiredStateOfWorld.AddPodToVolume( uniquePodName, pod, volumeSpec, podVolume.Name, volumeGidValue) if err != nil { - klog.Errorf( - "Failed to add volume %s (specName: %s) for pod %q to desiredStateOfWorld: %v", - podVolume.Name, - volumeSpec.Name(), - uniquePodName, - err) + klog.ErrorS(err, "Failed to add volume to desiredStateOfWorld", "pod", klog.KObj(pod), "volumeName", podVolume.Name, "volumeSpecName", volumeSpec.Name()) dswp.desiredStateOfWorld.AddErrorToPod(uniquePodName, err.Error()) allVolumesAdded = false } else { - klog.V(4).Infof( - "Added volume %q (volSpec=%q) for pod %q to desired state.", - podVolume.Name, - volumeSpec.Name(), - uniquePodName) + klog.V(4).InfoS("Added volume to desired state", "pod", klog.KObj(pod), "volumeName", podVolume.Name, "volumeSpecName", volumeSpec.Name()) } if expandInUsePV { @@ -425,8 +409,7 @@ func (dswp *desiredStateOfWorldPopulator) checkVolumeFSResize( // we should use it here. This value comes from Pod.spec.volumes.persistentVolumeClaim.readOnly. if volumeSpec.ReadOnly { // This volume is used as read only by this pod, we don't perform resize for read only volumes. - klog.V(5).Infof("Skip file system resize check for volume %s in pod %s/%s "+ - "as the volume is mounted as readonly", podVolume.Name, pod.Namespace, pod.Name) + klog.V(5).InfoS("Skip file system resize check for the volume, as the volume is mounted as readonly", "pod", klog.KObj(pod), "volumeName", podVolume.Name) return } if volumeRequiresFSResize(pvc, volumeSpec.PersistentVolume) { @@ -512,24 +495,29 @@ func (dswp *desiredStateOfWorldPopulator) createVolumeSpec( pvcSource := podVolume.VolumeSource.PersistentVolumeClaim ephemeral := false if pvcSource == nil && - podVolume.VolumeSource.Ephemeral != nil && - utilfeature.DefaultFeatureGate.Enabled(features.GenericEphemeralVolume) { + podVolume.VolumeSource.Ephemeral != nil { + if !utilfeature.DefaultFeatureGate.Enabled(features.GenericEphemeralVolume) { + // Provide an unambiguous error message that + // explains why the volume cannot be + // processed. If we just ignore the volume + // source, the error is just a vague "unknown + // volume source". + return nil, nil, "", fmt.Errorf( + "volume %s is a generic ephemeral volume, but that feature is disabled in kubelet", + podVolume.Name, + ) + } // Generic ephemeral inline volumes are handled the // same way as a PVC reference. The only additional // constraint (checked below) is that the PVC must be // owned by the pod. pvcSource = &v1.PersistentVolumeClaimVolumeSource{ ClaimName: pod.Name + "-" + podVolume.Name, - ReadOnly: podVolume.VolumeSource.Ephemeral.ReadOnly, } ephemeral = true } if pvcSource != nil { - klog.V(5).Infof( - "Found PVC, ClaimName: %q/%q", - pod.Namespace, - pvcSource.ClaimName) - + klog.V(5).InfoS("Found PVC", "PVC", klog.KRef(pod.Namespace, pvcSource.ClaimName)) // If podVolume is a PVC, fetch the real PV behind the claim pvc, err := dswp.getPVCExtractPV( pod.Namespace, pvcSource.ClaimName) @@ -548,14 +536,7 @@ func (dswp *desiredStateOfWorldPopulator) createVolumeSpec( ) } pvName, pvcUID := pvc.Spec.VolumeName, pvc.UID - - klog.V(5).Infof( - "Found bound PV for PVC (ClaimName %q/%q pvcUID %v): pvName=%q", - pod.Namespace, - pvcSource.ClaimName, - pvcUID, - pvName) - + klog.V(5).InfoS("Found bound PV for PVC", "PVC", klog.KRef(pod.Namespace, pvcSource.ClaimName), "PVCUID", pvcUID, "PVName", pvName) // Fetch actual PV object volumeSpec, volumeGidValue, err := dswp.getPVSpec(pvName, pvcSource.ReadOnly, pvcUID) @@ -566,15 +547,7 @@ func (dswp *desiredStateOfWorldPopulator) createVolumeSpec( pvcSource.ClaimName, err) } - - klog.V(5).Infof( - "Extracted volumeSpec (%v) from bound PV (pvName %q) and PVC (ClaimName %q/%q pvcUID %v)", - volumeSpec.Name(), - pvName, - pod.Namespace, - pvcSource.ClaimName, - pvcUID) - + klog.V(5).InfoS("Extracted volumeSpec from bound PV and PVC", "PVC", klog.KRef(pod.Namespace, pvcSource.ClaimName), "PVCUID", pvcUID, "PVName", pvName, "volumeSpecName", volumeSpec.Name()) migratable, err := dswp.csiMigratedPluginManager.IsMigratable(volumeSpec) if err != nil { return nil, nil, "", err diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/reconciler/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/reconciler/BUILD deleted file mode 100644 index c96ea3114d07..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/reconciler/BUILD +++ /dev/null @@ -1,77 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["reconciler.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/volumemanager/reconciler", - deps = [ - "//pkg/features:go_default_library", - "//pkg/kubelet/config:go_default_library", - "//pkg/kubelet/volumemanager/cache:go_default_library", - "//pkg/util/goroutinemap/exponentialbackoff:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/util:go_default_library", - "//pkg/volume/util/hostutil:go_default_library", - "//pkg/volume/util/nestedpendingoperations:go_default_library", - "//pkg/volume/util/operationexecutor:go_default_library", - "//pkg/volume/util/types:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/path:go_default_library", - "//vendor/k8s.io/utils/strings:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["reconciler_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/features:go_default_library", - "//pkg/kubelet/volumemanager/cache:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/testing:go_default_library", - "//pkg/volume/util:go_default_library", - "//pkg/volume/util/hostutil:go_default_library", - "//pkg/volume/util/operationexecutor:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/reconciler/reconciler.go b/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/reconciler/reconciler.go index 284a46bae646..e09e269f1bcc 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/reconciler/reconciler.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/reconciler/reconciler.go @@ -154,7 +154,7 @@ func (rc *reconciler) reconciliationLoopFunc() func() { // Otherwise, the reconstruct process may clean up pods' volumes that are still in use because // desired state of world does not contain a complete list of pods. if rc.populatorHasAddedPods() && !rc.StatesHasBeenSynced() { - klog.Infof("Reconciler: start to sync state") + klog.InfoS("Reconciler: start to sync state") rc.sync() } } @@ -182,7 +182,7 @@ func (rc *reconciler) unmountVolumes() { for _, mountedVolume := range rc.actualStateOfWorld.GetAllMountedVolumes() { if !rc.desiredStateOfWorld.PodExistsInVolume(mountedVolume.PodName, mountedVolume.VolumeName) { // Volume is mounted, unmount it - klog.V(5).Infof(mountedVolume.GenerateMsgDetailed("Starting operationExecutor.UnmountVolume", "")) + klog.V(5).InfoS(mountedVolume.GenerateMsgDetailed("Starting operationExecutor.UnmountVolume", "")) err := rc.operationExecutor.UnmountVolume( mountedVolume.MountedVolume, rc.actualStateOfWorld, rc.kubeletPodsDir) if err != nil && @@ -190,10 +190,10 @@ func (rc *reconciler) unmountVolumes() { !exponentialbackoff.IsExponentialBackoff(err) { // Ignore nestedpendingoperations.IsAlreadyExists and exponentialbackoff.IsExponentialBackoff errors, they are expected. // Log all other errors. - klog.Errorf(mountedVolume.GenerateErrorDetailed(fmt.Sprintf("operationExecutor.UnmountVolume failed (controllerAttachDetachEnabled %v)", rc.controllerAttachDetachEnabled), err).Error()) + klog.ErrorS(err, mountedVolume.GenerateErrorDetailed(fmt.Sprintf("operationExecutor.UnmountVolume failed (controllerAttachDetachEnabled %v)", rc.controllerAttachDetachEnabled), err).Error()) } if err == nil { - klog.Infof(mountedVolume.GenerateMsgDetailed("operationExecutor.UnmountVolume started", "")) + klog.InfoS(mountedVolume.GenerateMsgDetailed("operationExecutor.UnmountVolume started", "")) } } } @@ -208,7 +208,7 @@ func (rc *reconciler) mountAttachVolumes() { if rc.controllerAttachDetachEnabled || !volumeToMount.PluginIsAttachable { // Volume is not attached (or doesn't implement attacher), kubelet attach is disabled, wait // for controller to finish attaching volume. - klog.V(5).Infof(volumeToMount.GenerateMsgDetailed("Starting operationExecutor.VerifyControllerAttachedVolume", "")) + klog.V(5).InfoS(volumeToMount.GenerateMsgDetailed("Starting operationExecutor.VerifyControllerAttachedVolume", "")) err := rc.operationExecutor.VerifyControllerAttachedVolume( volumeToMount.VolumeToMount, rc.nodeName, @@ -218,10 +218,10 @@ func (rc *reconciler) mountAttachVolumes() { !exponentialbackoff.IsExponentialBackoff(err) { // Ignore nestedpendingoperations.IsAlreadyExists and exponentialbackoff.IsExponentialBackoff errors, they are expected. // Log all other errors. - klog.Errorf(volumeToMount.GenerateErrorDetailed(fmt.Sprintf("operationExecutor.VerifyControllerAttachedVolume failed (controllerAttachDetachEnabled %v)", rc.controllerAttachDetachEnabled), err).Error()) + klog.ErrorS(err, volumeToMount.GenerateErrorDetailed(fmt.Sprintf("operationExecutor.VerifyControllerAttachedVolume failed (controllerAttachDetachEnabled %v)", rc.controllerAttachDetachEnabled), err).Error()) } if err == nil { - klog.Infof(volumeToMount.GenerateMsgDetailed("operationExecutor.VerifyControllerAttachedVolume started", "")) + klog.InfoS(volumeToMount.GenerateMsgDetailed("operationExecutor.VerifyControllerAttachedVolume started", "")) } } else { // Volume is not attached to node, kubelet attach is enabled, volume implements an attacher, @@ -231,17 +231,17 @@ func (rc *reconciler) mountAttachVolumes() { VolumeSpec: volumeToMount.VolumeSpec, NodeName: rc.nodeName, } - klog.V(5).Infof(volumeToAttach.GenerateMsgDetailed("Starting operationExecutor.AttachVolume", "")) + klog.V(5).InfoS(volumeToAttach.GenerateMsgDetailed("Starting operationExecutor.AttachVolume", "")) err := rc.operationExecutor.AttachVolume(volumeToAttach, rc.actualStateOfWorld) if err != nil && !nestedpendingoperations.IsAlreadyExists(err) && !exponentialbackoff.IsExponentialBackoff(err) { // Ignore nestedpendingoperations.IsAlreadyExists and exponentialbackoff.IsExponentialBackoff errors, they are expected. // Log all other errors. - klog.Errorf(volumeToMount.GenerateErrorDetailed(fmt.Sprintf("operationExecutor.AttachVolume failed (controllerAttachDetachEnabled %v)", rc.controllerAttachDetachEnabled), err).Error()) + klog.ErrorS(err, volumeToMount.GenerateErrorDetailed(fmt.Sprintf("operationExecutor.AttachVolume failed (controllerAttachDetachEnabled %v)", rc.controllerAttachDetachEnabled), err).Error()) } if err == nil { - klog.Infof(volumeToMount.GenerateMsgDetailed("operationExecutor.AttachVolume started", "")) + klog.InfoS(volumeToMount.GenerateMsgDetailed("operationExecutor.AttachVolume started", "")) } } } else if !volMounted || cache.IsRemountRequiredError(err) { @@ -251,7 +251,7 @@ func (rc *reconciler) mountAttachVolumes() { if isRemount { remountingLogStr = "Volume is already mounted to pod, but remount was requested." } - klog.V(4).Infof(volumeToMount.GenerateMsgDetailed("Starting operationExecutor.MountVolume", remountingLogStr)) + klog.V(4).InfoS(volumeToMount.GenerateMsgDetailed("Starting operationExecutor.MountVolume", remountingLogStr)) err := rc.operationExecutor.MountVolume( rc.waitForAttachTimeout, volumeToMount.VolumeToMount, @@ -262,18 +262,18 @@ func (rc *reconciler) mountAttachVolumes() { !exponentialbackoff.IsExponentialBackoff(err) { // Ignore nestedpendingoperations.IsAlreadyExists and exponentialbackoff.IsExponentialBackoff errors, they are expected. // Log all other errors. - klog.Errorf(volumeToMount.GenerateErrorDetailed(fmt.Sprintf("operationExecutor.MountVolume failed (controllerAttachDetachEnabled %v)", rc.controllerAttachDetachEnabled), err).Error()) + klog.ErrorS(err, volumeToMount.GenerateErrorDetailed(fmt.Sprintf("operationExecutor.MountVolume failed (controllerAttachDetachEnabled %v)", rc.controllerAttachDetachEnabled), err).Error()) } if err == nil { if remountingLogStr == "" { - klog.V(1).Infof(volumeToMount.GenerateMsgDetailed("operationExecutor.MountVolume started", remountingLogStr)) + klog.V(1).InfoS(volumeToMount.GenerateMsgDetailed("operationExecutor.MountVolume started", remountingLogStr)) } else { - klog.V(5).Infof(volumeToMount.GenerateMsgDetailed("operationExecutor.MountVolume started", remountingLogStr)) + klog.V(5).InfoS(volumeToMount.GenerateMsgDetailed("operationExecutor.MountVolume started", remountingLogStr)) } } } else if cache.IsFSResizeRequiredError(err) && utilfeature.DefaultFeatureGate.Enabled(features.ExpandInUsePersistentVolumes) { - klog.V(4).Infof(volumeToMount.GenerateMsgDetailed("Starting operationExecutor.ExpandInUseVolume", "")) + klog.V(4).InfoS(volumeToMount.GenerateMsgDetailed("Starting operationExecutor.ExpandInUseVolume", "")) err := rc.operationExecutor.ExpandInUseVolume( volumeToMount.VolumeToMount, rc.actualStateOfWorld) @@ -282,10 +282,10 @@ func (rc *reconciler) mountAttachVolumes() { !exponentialbackoff.IsExponentialBackoff(err) { // Ignore nestedpendingoperations.IsAlreadyExists and exponentialbackoff.IsExponentialBackoff errors, they are expected. // Log all other errors. - klog.Errorf(volumeToMount.GenerateErrorDetailed("operationExecutor.ExpandInUseVolume failed", err).Error()) + klog.ErrorS(err, volumeToMount.GenerateErrorDetailed("operationExecutor.ExpandInUseVolume failed", err).Error()) } if err == nil { - klog.V(4).Infof(volumeToMount.GenerateMsgDetailed("operationExecutor.ExpandInUseVolume started", "")) + klog.V(4).InfoS(volumeToMount.GenerateMsgDetailed("operationExecutor.ExpandInUseVolume started", "")) } } } @@ -298,7 +298,7 @@ func (rc *reconciler) unmountDetachDevices() { !rc.operationExecutor.IsOperationPending(attachedVolume.VolumeName, nestedpendingoperations.EmptyUniquePodName, nestedpendingoperations.EmptyNodeName) { if attachedVolume.DeviceMayBeMounted() { // Volume is globally mounted to device, unmount it - klog.V(5).Infof(attachedVolume.GenerateMsgDetailed("Starting operationExecutor.UnmountDevice", "")) + klog.V(5).InfoS(attachedVolume.GenerateMsgDetailed("Starting operationExecutor.UnmountDevice", "")) err := rc.operationExecutor.UnmountDevice( attachedVolume.AttachedVolume, rc.actualStateOfWorld, rc.hostutil) if err != nil && @@ -306,20 +306,20 @@ func (rc *reconciler) unmountDetachDevices() { !exponentialbackoff.IsExponentialBackoff(err) { // Ignore nestedpendingoperations.IsAlreadyExists and exponentialbackoff.IsExponentialBackoff errors, they are expected. // Log all other errors. - klog.Errorf(attachedVolume.GenerateErrorDetailed(fmt.Sprintf("operationExecutor.UnmountDevice failed (controllerAttachDetachEnabled %v)", rc.controllerAttachDetachEnabled), err).Error()) + klog.ErrorS(err, attachedVolume.GenerateErrorDetailed(fmt.Sprintf("operationExecutor.UnmountDevice failed (controllerAttachDetachEnabled %v)", rc.controllerAttachDetachEnabled), err).Error()) } if err == nil { - klog.Infof(attachedVolume.GenerateMsgDetailed("operationExecutor.UnmountDevice started", "")) + klog.InfoS(attachedVolume.GenerateMsgDetailed("operationExecutor.UnmountDevice started", "")) } } else { // Volume is attached to node, detach it // Kubelet not responsible for detaching or this volume has a non-attachable volume plugin. if rc.controllerAttachDetachEnabled || !attachedVolume.PluginIsAttachable { rc.actualStateOfWorld.MarkVolumeAsDetached(attachedVolume.VolumeName, attachedVolume.NodeName) - klog.Infof(attachedVolume.GenerateMsgDetailed("Volume detached", fmt.Sprintf("DevicePath %q", attachedVolume.DevicePath))) + klog.InfoS(attachedVolume.GenerateMsgDetailed("Volume detached", fmt.Sprintf("DevicePath %q", attachedVolume.DevicePath))) } else { // Only detach if kubelet detach is enabled - klog.V(5).Infof(attachedVolume.GenerateMsgDetailed("Starting operationExecutor.DetachVolume", "")) + klog.V(5).InfoS(attachedVolume.GenerateMsgDetailed("Starting operationExecutor.DetachVolume", "")) err := rc.operationExecutor.DetachVolume( attachedVolume.AttachedVolume, false /* verifySafeToDetach */, rc.actualStateOfWorld) if err != nil && @@ -327,10 +327,10 @@ func (rc *reconciler) unmountDetachDevices() { !exponentialbackoff.IsExponentialBackoff(err) { // Ignore nestedpendingoperations.IsAlreadyExists && exponentialbackoff.IsExponentialBackoff errors, they are expected. // Log all other errors. - klog.Errorf(attachedVolume.GenerateErrorDetailed(fmt.Sprintf("operationExecutor.DetachVolume failed (controllerAttachDetachEnabled %v)", rc.controllerAttachDetachEnabled), err).Error()) + klog.ErrorS(err, attachedVolume.GenerateErrorDetailed(fmt.Sprintf("operationExecutor.DetachVolume failed (controllerAttachDetachEnabled %v)", rc.controllerAttachDetachEnabled), err).Error()) } if err == nil { - klog.Infof(attachedVolume.GenerateMsgDetailed("operationExecutor.DetachVolume started", "")) + klog.InfoS(attachedVolume.GenerateMsgDetailed("operationExecutor.DetachVolume started", "")) } } } @@ -386,14 +386,14 @@ func (rc *reconciler) syncStates() { // Get volumes information by reading the pod's directory podVolumes, err := getVolumesFromPodDir(rc.kubeletPodsDir) if err != nil { - klog.Errorf("Cannot get volumes from disk %v", err) + klog.ErrorS(err, "Cannot get volumes from disk") return } volumesNeedUpdate := make(map[v1.UniqueVolumeName]*reconstructedVolume) volumeNeedReport := []v1.UniqueVolumeName{} for _, volume := range podVolumes { if rc.actualStateOfWorld.VolumeExistsWithSpecName(volume.podName, volume.volumeSpecName) { - klog.V(4).Infof("Volume exists in actual state (volume.SpecName %s, pod.UID %s), skip cleaning up mounts", volume.volumeSpecName, volume.podName) + klog.V(4).InfoS("Volume exists in actual state, skip cleaning up mounts", "podName", volume.podName, "volumeSpecName", volume.volumeSpecName) // There is nothing to reconstruct continue } @@ -404,11 +404,11 @@ func (rc *reconciler) syncStates() { if volumeInDSW { // Some pod needs the volume, don't clean it up and hope that // reconcile() calls SetUp and reconstructs the volume in ASW. - klog.V(4).Infof("Volume exists in desired state (volume.SpecName %s, pod.UID %s), skip cleaning up mounts", volume.volumeSpecName, volume.podName) + klog.V(4).InfoS("Volume exists in desired state, skip cleaning up mounts", "podName", volume.podName, "volumeSpecName", volume.volumeSpecName) continue } // No pod needs the volume. - klog.Warningf("Could not construct volume information, cleanup the mounts. (pod.UID %s, volume.SpecName %s): %v", volume.podName, volume.volumeSpecName, err) + klog.InfoS("Could not construct volume information, cleaning up mounts", "podName", volume.podName, "volumeSpecName", volume.volumeSpecName, "error", err) rc.cleanupMounts(volume) continue } @@ -419,22 +419,20 @@ func (rc *reconciler) syncStates() { // this new kubelet so reconcile() calls SetUp and re-mounts the // volume if it's necessary. volumeNeedReport = append(volumeNeedReport, reconstructedVolume.volumeName) - klog.V(4).Infof("Volume exists in desired state (volume.SpecName %s, pod.UID %s), marking as InUse", volume.volumeSpecName, volume.podName) + klog.V(4).InfoS("Volume exists in desired state, marking as InUse", "podName", volume.podName, "volumeSpecName", volume.volumeSpecName) continue } // There is no pod that uses the volume. if rc.operationExecutor.IsOperationPending(reconstructedVolume.volumeName, nestedpendingoperations.EmptyUniquePodName, nestedpendingoperations.EmptyNodeName) { - klog.Warning("Volume is in pending operation, skip cleaning up mounts") + klog.InfoS("Volume is in pending operation, skip cleaning up mounts") } - klog.V(2).Infof( - "Reconciler sync states: could not find pod information in desired state, update it in actual state: %+v", - reconstructedVolume) + klog.V(2).InfoS("Reconciler sync states: could not find pod information in desired state, update it in actual state", "reconstructedVolume", reconstructedVolume) volumesNeedUpdate[reconstructedVolume.volumeName] = reconstructedVolume } if len(volumesNeedUpdate) > 0 { if err = rc.updateStates(volumesNeedUpdate); err != nil { - klog.Errorf("Error occurred during reconstruct volume from disk: %v", err) + klog.ErrorS(err, "Error occurred during reconstruct volume from disk") } } if len(volumeNeedReport) > 0 { @@ -443,8 +441,7 @@ func (rc *reconciler) syncStates() { } func (rc *reconciler) cleanupMounts(volume podVolume) { - klog.V(2).Infof("Reconciler sync states: could not find information (PID: %s) (Volume SpecName: %s) in desired state, clean up the mount points", - volume.podName, volume.volumeSpecName) + klog.V(2).InfoS("Reconciler sync states: could not find volume information in desired state, clean up the mount points", "podName", volume.podName, "volumeSpecName", volume.volumeSpecName) mountedVolume := operationexecutor.MountedVolume{ PodName: volume.podName, VolumeName: v1.UniqueVolumeName(volume.volumeSpecName), @@ -456,7 +453,7 @@ func (rc *reconciler) cleanupMounts(volume podVolume) { // to unmount both volume and device in the same routine. err := rc.operationExecutor.UnmountVolume(mountedVolume, rc.actualStateOfWorld, rc.kubeletPodsDir) if err != nil { - klog.Errorf(mountedVolume.GenerateErrorDetailed("volumeHandler.UnmountVolumeHandler for UnmountVolume failed", err).Error()) + klog.ErrorS(err, mountedVolume.GenerateErrorDetailed("volumeHandler.UnmountVolumeHandler for UnmountVolume failed", err).Error()) return } } @@ -600,13 +597,13 @@ func (rc *reconciler) reconstructVolume(volume podVolume) (*reconstructedVolume, func (rc *reconciler) updateDevicePath(volumesNeedUpdate map[v1.UniqueVolumeName]*reconstructedVolume) { node, fetchErr := rc.kubeClient.CoreV1().Nodes().Get(context.TODO(), string(rc.nodeName), metav1.GetOptions{}) if fetchErr != nil { - klog.Errorf("updateStates in reconciler: could not get node status with error %v", fetchErr) + klog.ErrorS(fetchErr, "UpdateStates in reconciler: could not get node status with error") } else { for _, attachedVolume := range node.Status.VolumesAttached { if volume, exists := volumesNeedUpdate[attachedVolume.Name]; exists { volume.devicePath = attachedVolume.DevicePath volumesNeedUpdate[attachedVolume.Name] = volume - klog.V(4).Infof("Update devicePath from node status for volume (%q): %q", attachedVolume.Name, volume.devicePath) + klog.V(4).InfoS("Update devicePath from node status for volume", "volumeName", attachedVolume.Name, "path", volume.devicePath) } } } @@ -636,7 +633,7 @@ func (rc *reconciler) updateStates(volumesNeedUpdate map[v1.UniqueVolumeName]*re //TODO: the devicePath might not be correct for some volume plugins: see issue #54108 volume.volumeName, volume.volumeSpec, "" /* nodeName */, volume.devicePath) if err != nil { - klog.Errorf("Could not add volume information to actual state of world: %v", err) + klog.ErrorS(err, "Could not add volume information to actual state of world") continue } markVolumeOpts := operationexecutor.MarkVolumeOpts{ @@ -652,23 +649,23 @@ func (rc *reconciler) updateStates(volumesNeedUpdate map[v1.UniqueVolumeName]*re } err = rc.actualStateOfWorld.MarkVolumeAsMounted(markVolumeOpts) if err != nil { - klog.Errorf("Could not add pod to volume information to actual state of world: %v", err) + klog.ErrorS(err, "Could not add pod to volume information to actual state of world") continue } - klog.V(4).Infof("Volume: %s (pod UID %s) is marked as mounted and added into the actual state", volume.volumeName, volume.podName) + klog.V(4).InfoS("Volume is marked as mounted and added into the actual state", "podName", volume.podName, "volumeName", volume.volumeName) // If the volume has device to mount, we mark its device as mounted. if volume.deviceMounter != nil || volume.blockVolumeMapper != nil { deviceMountPath, err := getDeviceMountPath(volume) if err != nil { - klog.Errorf("Could not find device mount path for volume %s", volume.volumeName) + klog.ErrorS(err, "Could not find device mount path for volume", "volumeName", volume.volumeName) continue } err = rc.actualStateOfWorld.MarkDeviceAsMounted(volume.volumeName, volume.devicePath, deviceMountPath) if err != nil { - klog.Errorf("Could not mark device is mounted to actual state of world: %v", err) + klog.ErrorS(err, "Could not mark device is mounted to actual state of world") continue } - klog.V(4).Infof("Volume: %s (pod UID %s) is marked device as mounted and added into the actual state", volume.volumeName, volume.podName) + klog.V(4).InfoS("Volume is marked device as mounted and added into the actual state", "podName", volume.podName, "volumeName", volume.volumeName) } } return nil @@ -710,13 +707,13 @@ func getVolumesFromPodDir(podDir string) ([]podVolume, error) { volumePluginPath := path.Join(volumesDir, pluginName) volumePluginDirs, err := utilpath.ReadDirNoStat(volumePluginPath) if err != nil { - klog.Errorf("Could not read volume plugin directory %q: %v", volumePluginPath, err) + klog.ErrorS(err, "Could not read volume plugin directory", "volumePluginPath", volumePluginPath) continue } unescapePluginName := utilstrings.UnescapeQualifiedName(pluginName) for _, volumeName := range volumePluginDirs { volumePath := path.Join(volumePluginPath, volumeName) - klog.V(5).Infof("podName: %v, volume path from volume plugin directory: %v, ", podName, volumePath) + klog.V(5).InfoS("Volume path from volume plugin directory", "podName", podName, "volumePath", volumePath) volumes = append(volumes, podVolume{ podName: volumetypes.UniquePodName(podName), volumeSpecName: volumeName, @@ -728,6 +725,6 @@ func getVolumesFromPodDir(podDir string) ([]podVolume, error) { } } } - klog.V(4).Infof("Get volumes from pod directory %q %+v", podDir, volumes) + klog.V(4).InfoS("Get volumes from pod directory", "path", podDir, "volumes", volumes) return volumes, nil } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/volume_manager.go b/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/volume_manager.go index 86f77e517ad3..72e5f494b3db 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/volume_manager.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/volume_manager.go @@ -24,6 +24,7 @@ import ( "strings" "time" + utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/klog/v2" "k8s.io/mount-utils" @@ -39,7 +40,6 @@ import ( "k8s.io/kubernetes/pkg/kubelet/container" "k8s.io/kubernetes/pkg/kubelet/pod" "k8s.io/kubernetes/pkg/kubelet/status" - "k8s.io/kubernetes/pkg/kubelet/util/format" "k8s.io/kubernetes/pkg/kubelet/volumemanager/cache" "k8s.io/kubernetes/pkg/kubelet/volumemanager/metrics" "k8s.io/kubernetes/pkg/kubelet/volumemanager/populator" @@ -178,7 +178,7 @@ func NewVolumeManager( } intreeToCSITranslator := csitrans.New() - csiMigratedPluginManager := csimigration.NewPluginManager(intreeToCSITranslator) + csiMigratedPluginManager := csimigration.NewPluginManager(intreeToCSITranslator, utilfeature.DefaultFeatureGate) vm.intreeToCSITranslator = intreeToCSITranslator vm.csiMigratedPluginManager = csiMigratedPluginManager @@ -266,15 +266,15 @@ func (vm *volumeManager) Run(sourcesReady config.SourcesReady, stopCh <-chan str } go vm.desiredStateOfWorldPopulator.Run(sourcesReady, stopCh) - klog.V(2).Infof("The desired_state_of_world populator starts") + klog.V(2).InfoS("The desired_state_of_world populator starts") - klog.Infof("Starting Kubelet Volume Manager") + klog.InfoS("Starting Kubelet Volume Manager") go vm.reconciler.Run(stopCh) metrics.Register(vm.actualStateOfWorld, vm.desiredStateOfWorld, vm.volumePluginMgr) <-stopCh - klog.Infof("Shutting down Kubelet Volume Manager") + klog.InfoS("Shutting down Kubelet Volume Manager") } func (vm *volumeManager) GetMountedVolumesForPod(podName types.UniquePodName) container.VolumeMap { @@ -370,7 +370,7 @@ func (vm *volumeManager) WaitForAttachAndMount(pod *v1.Pod) error { return nil } - klog.V(3).Infof("Waiting for volumes to attach and mount for pod %q", format.Pod(pod)) + klog.V(3).InfoS("Waiting for volumes to attach and mount for pod", "pod", klog.KObj(pod)) uniquePodName := util.GetUniquePodName(pod) // Some pods expect to have Setup called over and over again to update. @@ -401,7 +401,7 @@ func (vm *volumeManager) WaitForAttachAndMount(pod *v1.Pod) error { err) } - klog.V(3).Infof("All volumes are attached and mounted for pod %q", format.Pod(pod)) + klog.V(3).InfoS("All volumes are attached and mounted for pod", "pod", klog.KObj(pod)) return nil } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/winstats/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/winstats/BUILD deleted file mode 100644 index 42dcc0ca22ff..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/winstats/BUILD +++ /dev/null @@ -1,56 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "network_stats.go", - "perfcounter_nodestats.go", - "perfcounters.go", - "version.go", - "winstats.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/winstats", - visibility = ["//visibility:public"], - deps = select({ - "@io_bazel_rules_go//go/platform:windows": [ - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/github.com/JeffAshton/win_pdh:go_default_library", - "//vendor/github.com/google/cadvisor/info/v1:go_default_library", - "//vendor/github.com/google/cadvisor/info/v2:go_default_library", - "//vendor/golang.org/x/sys/windows:go_default_library", - "//vendor/golang.org/x/sys/windows/registry:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], - "//conditions:default": [], - }), -) - -go_test( - name = "go_default_test", - srcs = ["winstats_test.go"], - embed = [":go_default_library"], - deps = select({ - "@io_bazel_rules_go//go/platform:windows": [ - "//vendor/github.com/google/cadvisor/info/v1:go_default_library", - "//vendor/github.com/google/cadvisor/info/v2:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/winstats/network_stats.go b/vendor/k8s.io/kubernetes/pkg/kubelet/winstats/network_stats.go index d3acda6d54ea..242269820a99 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/winstats/network_stats.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/winstats/network_stats.go @@ -109,49 +109,49 @@ func newNetworkCounters() (*networkCounter, error) { func (n *networkCounter) getData() ([]cadvisorapi.InterfaceStats, error) { packetsReceivedPerSecondData, err := n.packetsReceivedPerSecondCounter.getDataList() if err != nil { - klog.Errorf("Unable to get packetsReceivedPerSecond perf counter data; err: %v", err) + klog.ErrorS(err, "Unable to get packetsReceivedPerSecond perf counter data") return nil, err } packetsSentPerSecondData, err := n.packetsSentPerSecondCounter.getDataList() if err != nil { - klog.Errorf("Unable to get packetsSentPerSecond perf counter data; err: %v", err) + klog.ErrorS(err, "Unable to get packetsSentPerSecond perf counter data") return nil, err } bytesReceivedPerSecondData, err := n.bytesReceivedPerSecondCounter.getDataList() if err != nil { - klog.Errorf("Unable to get bytesReceivedPerSecond perf counter data; err: %v", err) + klog.ErrorS(err, "Unable to get bytesReceivedPerSecond perf counter data") return nil, err } bytesSentPerSecondData, err := n.bytesSentPerSecondCounter.getDataList() if err != nil { - klog.Errorf("Unable to get bytesSentPerSecond perf counter data; err: %v", err) + klog.ErrorS(err, "Unable to get bytesSentPerSecond perf counter data") return nil, err } packetsReceivedDiscardedData, err := n.packetsReceivedDiscardedCounter.getDataList() if err != nil { - klog.Errorf("Unable to get packetsReceivedDiscarded perf counter data; err: %v", err) + klog.ErrorS(err, "Unable to get packetsReceivedDiscarded perf counter data") return nil, err } packetsReceivedErrorsData, err := n.packetsReceivedErrorsCounter.getDataList() if err != nil { - klog.Errorf("Unable to get packetsReceivedErrors perf counter data; err: %v", err) + klog.ErrorS(err, "Unable to get packetsReceivedErrors perf counter data") return nil, err } packetsOutboundDiscardedData, err := n.packetsOutboundDiscardedCounter.getDataList() if err != nil { - klog.Errorf("Unable to get packetsOutboundDiscarded perf counter data; err: %v", err) + klog.ErrorS(err, "Unable to get packetsOutboundDiscarded perf counter data") return nil, err } packetsOutboundErrorsData, err := n.packetsOutboundErrorsCounter.getDataList() if err != nil { - klog.Errorf("Unable to get packetsOutboundErrors perf counter data; err: %v", err) + klog.ErrorS(err, "Unable to get packetsOutboundErrors perf counter data") return nil, err } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/winstats/perfcounter_nodestats.go b/vendor/k8s.io/kubernetes/pkg/kubelet/winstats/perfcounter_nodestats.go index 265debf096cd..11bd9153a417 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/winstats/perfcounter_nodestats.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/winstats/perfcounter_nodestats.go @@ -26,6 +26,7 @@ import ( "runtime" "strings" "sync" + "syscall" "time" "unsafe" @@ -50,10 +51,13 @@ type MemoryStatusEx struct { } var ( - modkernel32 = windows.NewLazySystemDLL("kernel32.dll") - procGlobalMemoryStatusEx = modkernel32.NewProc("GlobalMemoryStatusEx") + modkernel32 = windows.NewLazySystemDLL("kernel32.dll") + procGlobalMemoryStatusEx = modkernel32.NewProc("GlobalMemoryStatusEx") + procGetActiveProcessorCount = modkernel32.NewProc("GetActiveProcessorCount") ) +const allProcessorGroups = 0xFFFF + // NewPerfCounterClient creates a client using perf counters func NewPerfCounterClient() (Client, error) { // Initialize the cache @@ -140,13 +144,33 @@ func (p *perfCounterNodeStatsClient) getMachineInfo() (*cadvisorapi.MachineInfo, } return &cadvisorapi.MachineInfo{ - NumCores: runtime.NumCPU(), + NumCores: processorCount(), MemoryCapacity: p.nodeInfo.memoryPhysicalCapacityBytes, MachineID: hostname, SystemUUID: systemUUID, }, nil } +// runtime.NumCPU() will only return the information for a single Processor Group. +// Since a single group can only hold 64 logical processors, this +// means when there are more they will be divided into multiple groups. +// For the above reason, procGetActiveProcessorCount is used to get the +// cpu count for all processor groups of the windows node. +// more notes for this issue: +// same issue in moby: https://github.com/moby/moby/issues/38935#issuecomment-744638345 +// solution in hcsshim: https://github.com/microsoft/hcsshim/blob/master/internal/processorinfo/processor_count.go +func processorCount() int { + if amount := getActiveProcessorCount(allProcessorGroups); amount != 0 { + return int(amount) + } + return runtime.NumCPU() +} + +func getActiveProcessorCount(groupNumber uint16) int { + r0, _, _ := syscall.Syscall(procGetActiveProcessorCount.Addr(), 1, uintptr(groupNumber), 0, 0) + return int(r0) +} + func (p *perfCounterNodeStatsClient) getVersionInfo() (*cadvisorapi.VersionInfo, error) { return &cadvisorapi.VersionInfo{ KernelVersion: p.nodeInfo.kernelVersion, @@ -168,25 +192,25 @@ func (p *perfCounterNodeStatsClient) collectMetricsData(cpuCounter, memWorkingSe cpuValue, err := cpuCounter.getData() cpuCores := runtime.NumCPU() if err != nil { - klog.Errorf("Unable to get cpu perf counter data; err: %v", err) + klog.ErrorS(err, "Unable to get cpu perf counter data") return } memWorkingSetValue, err := memWorkingSetCounter.getData() if err != nil { - klog.Errorf("Unable to get memWorkingSet perf counter data; err: %v", err) + klog.ErrorS(err, "Unable to get memWorkingSet perf counter data") return } memCommittedBytesValue, err := memCommittedBytesCounter.getData() if err != nil { - klog.Errorf("Unable to get memCommittedBytes perf counter data; err: %v", err) + klog.ErrorS(err, "Unable to get memCommittedBytes perf counter data") return } networkAdapterStats, err := networkAdapterCounter.getData() if err != nil { - klog.Errorf("Unable to get network adapter perf counter data; err: %v", err) + klog.ErrorS(err, "Unable to get network adapter perf counter data") return } diff --git a/vendor/k8s.io/kubernetes/pkg/kubemark/BUILD b/vendor/k8s.io/kubernetes/pkg/kubemark/BUILD deleted file mode 100644 index 739895b83f03..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/kubemark/BUILD +++ /dev/null @@ -1,90 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "controller.go", - "hollow_kubelet.go", - "hollow_proxy.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubemark", - deps = [ - "//cmd/kube-proxy/app:go_default_library", - "//cmd/kubelet/app:go_default_library", - "//cmd/kubelet/app/options:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/kubelet:go_default_library", - "//pkg/kubelet/apis/config:go_default_library", - "//pkg/kubelet/cadvisor:go_default_library", - "//pkg/kubelet/cm:go_default_library", - "//pkg/kubelet/container/testing:go_default_library", - "//pkg/kubelet/types:go_default_library", - "//pkg/proxy:go_default_library", - "//pkg/proxy/config:go_default_library", - "//pkg/proxy/iptables:go_default_library", - "//pkg/proxy/util/iptables:go_default_library", - "//pkg/util/iptables:go_default_library", - "//pkg/util/node:go_default_library", - "//pkg/util/oom:go_default_library", - "//pkg/util/sysctl:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/cephfs:go_default_library", - "//pkg/volume/configmap:go_default_library", - "//pkg/volume/csi:go_default_library", - "//pkg/volume/downwardapi:go_default_library", - "//pkg/volume/emptydir:go_default_library", - "//pkg/volume/fc:go_default_library", - "//pkg/volume/flocker:go_default_library", - "//pkg/volume/git_repo:go_default_library", - "//pkg/volume/glusterfs:go_default_library", - "//pkg/volume/hostpath:go_default_library", - "//pkg/volume/iscsi:go_default_library", - "//pkg/volume/local:go_default_library", - "//pkg/volume/nfs:go_default_library", - "//pkg/volume/portworx:go_default_library", - "//pkg/volume/projected:go_default_library", - "//pkg/volume/quobyte:go_default_library", - "//pkg/volume/rbd:go_default_library", - "//pkg/volume/scaleio:go_default_library", - "//pkg/volume/secret:go_default_library", - "//pkg/volume/storageos:go_default_library", - "//pkg/volume/util/hostutil:go_default_library", - "//pkg/volume/util/subpath:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/informers/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/cri-api/pkg/apis:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//test/utils:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubemark/OWNERS b/vendor/k8s.io/kubernetes/pkg/kubemark/OWNERS index f9874e1757c9..df1812090709 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubemark/OWNERS +++ b/vendor/k8s.io/kubernetes/pkg/kubemark/OWNERS @@ -1,12 +1,13 @@ # See the OWNERS docs at https://go.k8s.io/owners reviewers: - - gmarek - shyamjvs - sig-scalability-reviewers - wojtek-t approvers: - - gmarek - shyamjvs - sig-scalability-approvers - wojtek-t + +emeritus_approvers: +- gmarek diff --git a/vendor/k8s.io/kubernetes/pkg/kubemark/hollow_kubelet.go b/vendor/k8s.io/kubernetes/pkg/kubemark/hollow_kubelet.go index 254b71101c85..0e7d067b50b9 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubemark/hollow_kubelet.go +++ b/vendor/k8s.io/kubernetes/pkg/kubemark/hollow_kubelet.go @@ -167,6 +167,7 @@ func GetHollowKubeletConfig(opt *HollowKubletOptions) (*options.KubeletFlags, *k f.RegisterNode = true f.RegisterSchedulable = true f.RegisterWithTaints = opt.RegisterWithTaints + f.RemoteImageEndpoint = "/run/containerd/containerd.sock" // Config struct c, err := options.NewKubeletConfiguration() diff --git a/vendor/k8s.io/kubernetes/pkg/printers/BUILD b/vendor/k8s.io/kubernetes/pkg/printers/BUILD deleted file mode 100644 index 60d3a894d376..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/printers/BUILD +++ /dev/null @@ -1,47 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "interface.go", - "tablegenerator.go", - ], - importpath = "k8s.io/kubernetes/pkg/printers", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/printers/internalversion:all-srcs", - "//pkg/printers/storage:all-srcs", - ], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["tablegenerator_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/printers/internalversion/BUILD b/vendor/k8s.io/kubernetes/pkg/printers/internalversion/BUILD deleted file mode 100644 index 0ad93c6bc143..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/printers/internalversion/BUILD +++ /dev/null @@ -1,124 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "printers_test.go", - "sorted_resource_name_list_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/apiserverinternal:go_default_library", - "//pkg/apis/apps:go_default_library", - "//pkg/apis/autoscaling:go_default_library", - "//pkg/apis/batch:go_default_library", - "//pkg/apis/certificates:go_default_library", - "//pkg/apis/coordination:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/discovery:go_default_library", - "//pkg/apis/flowcontrol:go_default_library", - "//pkg/apis/networking:go_default_library", - "//pkg/apis/node:go_default_library", - "//pkg/apis/policy:go_default_library", - "//pkg/apis/rbac:go_default_library", - "//pkg/apis/scheduling:go_default_library", - "//pkg/apis/storage:go_default_library", - "//pkg/printers:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "import_known_versions.go", - "printers.go", - ], - importpath = "k8s.io/kubernetes/pkg/printers/internalversion", - deps = [ - "//pkg/apis/admissionregistration:go_default_library", - "//pkg/apis/apiserverinternal:go_default_library", - "//pkg/apis/apps:go_default_library", - "//pkg/apis/apps/install:go_default_library", - "//pkg/apis/authentication/install:go_default_library", - "//pkg/apis/authorization/install:go_default_library", - "//pkg/apis/autoscaling:go_default_library", - "//pkg/apis/autoscaling/install:go_default_library", - "//pkg/apis/batch:go_default_library", - "//pkg/apis/batch/install:go_default_library", - "//pkg/apis/certificates:go_default_library", - "//pkg/apis/certificates/install:go_default_library", - "//pkg/apis/coordination:go_default_library", - "//pkg/apis/coordination/install:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/helper:go_default_library", - "//pkg/apis/core/install:go_default_library", - "//pkg/apis/discovery:go_default_library", - "//pkg/apis/discovery/install:go_default_library", - "//pkg/apis/events/install:go_default_library", - "//pkg/apis/extensions/install:go_default_library", - "//pkg/apis/flowcontrol:go_default_library", - "//pkg/apis/flowcontrol/util:go_default_library", - "//pkg/apis/networking:go_default_library", - "//pkg/apis/node:go_default_library", - "//pkg/apis/policy:go_default_library", - "//pkg/apis/policy/install:go_default_library", - "//pkg/apis/rbac:go_default_library", - "//pkg/apis/rbac/install:go_default_library", - "//pkg/apis/scheduling:go_default_library", - "//pkg/apis/scheduling/install:go_default_library", - "//pkg/apis/storage:go_default_library", - "//pkg/apis/storage/install:go_default_library", - "//pkg/apis/storage/util:go_default_library", - "//pkg/features:go_default_library", - "//pkg/printers:go_default_library", - "//pkg/util/node:go_default_library", - "//staging/src/k8s.io/api/apiserverinternal/v1alpha1:go_default_library", - "//staging/src/k8s.io/api/apps/v1beta1:go_default_library", - "//staging/src/k8s.io/api/autoscaling/v2beta1:go_default_library", - "//staging/src/k8s.io/api/batch/v1:go_default_library", - "//staging/src/k8s.io/api/batch/v1beta1:go_default_library", - "//staging/src/k8s.io/api/certificates/v1beta1:go_default_library", - "//staging/src/k8s.io/api/coordination/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/discovery/v1beta1:go_default_library", - "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", - "//staging/src/k8s.io/api/flowcontrol/v1beta1:go_default_library", - "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/api/rbac/v1beta1:go_default_library", - "//staging/src/k8s.io/api/scheduling/v1:go_default_library", - "//staging/src/k8s.io/api/storage/v1:go_default_library", - "//staging/src/k8s.io/api/storage/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/duration:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/printers/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/printers/storage/BUILD deleted file mode 100644 index a4bdb03a7347..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/printers/storage/BUILD +++ /dev/null @@ -1,30 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/printers/storage", - deps = [ - "//pkg/printers:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/probe/BUILD b/vendor/k8s.io/kubernetes/pkg/probe/BUILD deleted file mode 100644 index 51c23b1de958..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/probe/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "probe.go", - ], - importpath = "k8s.io/kubernetes/pkg/probe", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/probe/exec:all-srcs", - "//pkg/probe/http:all-srcs", - "//pkg/probe/tcp:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/probe/OWNERS b/vendor/k8s.io/kubernetes/pkg/probe/OWNERS index 997fa9156da3..c6b409276c6e 100644 --- a/vendor/k8s.io/kubernetes/pkg/probe/OWNERS +++ b/vendor/k8s.io/kubernetes/pkg/probe/OWNERS @@ -1,11 +1,9 @@ # See the OWNERS docs at https://go.k8s.io/owners approvers: - - Random-Liu - - dchen1107 - - derekwaynecarr - - tallclair - - vishh - - yujuhong + - sig-node-approvers reviewers: - sig-node-reviewers + +labels: +- sig/node diff --git a/vendor/k8s.io/kubernetes/pkg/probe/exec/BUILD b/vendor/k8s.io/kubernetes/pkg/probe/exec/BUILD deleted file mode 100644 index 80186df8ca9a..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/probe/exec/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "errors.go", - "exec.go", - ], - importpath = "k8s.io/kubernetes/pkg/probe/exec", - deps = [ - "//pkg/features:go_default_library", - "//pkg/kubelet/util/ioutils:go_default_library", - "//pkg/probe:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["exec_test.go"], - embed = [":go_default_library"], - deps = ["//pkg/probe:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/probe/http/BUILD b/vendor/k8s.io/kubernetes/pkg/probe/http/BUILD deleted file mode 100644 index e16bcdfe6799..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/probe/http/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["http.go"], - importpath = "k8s.io/kubernetes/pkg/probe/http", - deps = [ - "//pkg/probe:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/component-base/version:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/io:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["http_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/probe:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/probe/http/http.go b/vendor/k8s.io/kubernetes/pkg/probe/http/http.go index 5e04ff28be73..41c9fe188d1c 100644 --- a/vendor/k8s.io/kubernetes/pkg/probe/http/http.go +++ b/vendor/k8s.io/kubernetes/pkg/probe/http/http.go @@ -76,7 +76,8 @@ func (pr httpProber) Probe(url *url.URL, headers http.Header, timeout time.Durat Transport: pr.transport, CheckRedirect: redirectChecker(pr.followNonLocalRedirects), } - return DoHTTPProbe(url, headers, client) + result, details, _, err := DoHTTPProbe(url, headers, client) + return result, details, err } // GetHTTPInterface is an interface for making HTTP requests, that returns a response and error. @@ -88,11 +89,11 @@ type GetHTTPInterface interface { // If the HTTP response code is successful (i.e. 400 > code >= 200), it returns Success. // If the HTTP response code is unsuccessful or HTTP communication fails, it returns Failure. // This is exported because some other packages may want to do direct HTTP probes. -func DoHTTPProbe(url *url.URL, headers http.Header, client GetHTTPInterface) (probe.Result, string, error) { +func DoHTTPProbe(url *url.URL, headers http.Header, client GetHTTPInterface) (probe.Result, string, string, error) { req, err := http.NewRequest("GET", url.String(), nil) if err != nil { // Convert errors into failures to catch timeouts. - return probe.Failure, err.Error(), nil + return probe.Failure, err.Error(), "", nil } if _, ok := headers["User-Agent"]; !ok { if headers == nil { @@ -114,7 +115,7 @@ func DoHTTPProbe(url *url.URL, headers http.Header, client GetHTTPInterface) (pr res, err := client.Do(req) if err != nil { // Convert errors into failures to catch timeouts. - return probe.Failure, err.Error(), nil + return probe.Failure, err.Error(), "", nil } defer res.Body.Close() b, err := utilio.ReadAtMost(res.Body, maxRespBodyLength) @@ -122,20 +123,20 @@ func DoHTTPProbe(url *url.URL, headers http.Header, client GetHTTPInterface) (pr if err == utilio.ErrLimitReached { klog.V(4).Infof("Non fatal body truncation for %s, Response: %v", url.String(), *res) } else { - return probe.Failure, "", err + return probe.Failure, "", "", err } } body := string(b) if res.StatusCode >= http.StatusOK && res.StatusCode < http.StatusBadRequest { if res.StatusCode >= http.StatusMultipleChoices { // Redirect klog.V(4).Infof("Probe terminated redirects for %s, Response: %v", url.String(), *res) - return probe.Warning, body, nil + return probe.Warning, body, body, nil } klog.V(4).Infof("Probe succeeded for %s, Response: %v", url.String(), *res) - return probe.Success, body, nil + return probe.Success, body, body, nil } klog.V(4).Infof("Probe failed for %s with request headers %v, response body: %v", url.String(), headers, body) - return probe.Failure, fmt.Sprintf("HTTP probe failed with statuscode: %d", res.StatusCode), nil + return probe.Failure, fmt.Sprintf("HTTP probe failed with statuscode: %d", res.StatusCode), body, nil } func redirectChecker(followNonLocalRedirects bool) func(*http.Request, []*http.Request) error { diff --git a/vendor/k8s.io/kubernetes/pkg/probe/http/patch_http.go b/vendor/k8s.io/kubernetes/pkg/probe/http/patch_http.go new file mode 100644 index 000000000000..b5db3726d079 --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/probe/http/patch_http.go @@ -0,0 +1,26 @@ +package http + +import ( + "net/http" + "net/url" + "time" + + "k8s.io/kubernetes/pkg/probe" +) + +// Prober is an interface that defines the Probe function for doing HTTP readiness/liveness checks. +type DetailedProber interface { + ProbeForBody(url *url.URL, headers http.Header, timeout time.Duration) (probe.Result, string, string, error) +} + +// ProbeForBody returns a ProbeRunner capable of running an HTTP check. +// returns result, details, body, error +func (pr httpProber) ProbeForBody(url *url.URL, headers http.Header, timeout time.Duration) (probe.Result, string, string, error) { + pr.transport.DisableCompression = true // removes Accept-Encoding header + client := &http.Client{ + Timeout: timeout, + Transport: pr.transport, + CheckRedirect: redirectChecker(pr.followNonLocalRedirects), + } + return DoHTTPProbe(url, headers, client) +} diff --git a/vendor/k8s.io/kubernetes/pkg/probe/tcp/BUILD b/vendor/k8s.io/kubernetes/pkg/probe/tcp/BUILD deleted file mode 100644 index 16bf0e04eb4b..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/probe/tcp/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["tcp.go"], - importpath = "k8s.io/kubernetes/pkg/probe/tcp", - deps = [ - "//pkg/probe:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["tcp_test.go"], - embed = [":go_default_library"], - deps = ["//pkg/probe:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/proxy/BUILD b/vendor/k8s.io/kubernetes/pkg/proxy/BUILD deleted file mode 100644 index 089a9d6df968..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/proxy/BUILD +++ /dev/null @@ -1,83 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "endpoints.go", - "endpointslicecache.go", - "service.go", - "topology.go", - "types.go", - ], - importpath = "k8s.io/kubernetes/pkg/proxy", - deps = [ - "//pkg/api/v1/service:go_default_library", - "//pkg/features:go_default_library", - "//pkg/proxy/config:go_default_library", - "//pkg/proxy/metrics:go_default_library", - "//pkg/proxy/util:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/discovery/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/proxy/apis:all-srcs", - "//pkg/proxy/config:all-srcs", - "//pkg/proxy/healthcheck:all-srcs", - "//pkg/proxy/iptables:all-srcs", - "//pkg/proxy/ipvs:all-srcs", - "//pkg/proxy/metaproxier:all-srcs", - "//pkg/proxy/metrics:all-srcs", - "//pkg/proxy/userspace:all-srcs", - "//pkg/proxy/util:all-srcs", - "//pkg/proxy/winkernel:all-srcs", - "//pkg/proxy/winuserspace:all-srcs", - ], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = [ - "endpoints_test.go", - "endpointslicecache_test.go", - "service_test.go", - "topology_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/discovery/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/github.com/davecgh/go-spew/spew:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/proxy/apis/BUILD b/vendor/k8s.io/kubernetes/pkg/proxy/apis/BUILD deleted file mode 100644 index e75326ca83e2..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/proxy/apis/BUILD +++ /dev/null @@ -1,28 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["well_known_labels.go"], - importpath = "k8s.io/kubernetes/pkg/proxy/apis", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/proxy/apis/config:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/proxy/apis/config/BUILD b/vendor/k8s.io/kubernetes/pkg/proxy/apis/config/BUILD deleted file mode 100644 index 6b9f48df8bc2..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/proxy/apis/config/BUILD +++ /dev/null @@ -1,49 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/kubernetes/pkg/proxy/apis/config", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/component-base/config:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/proxy/apis/config/fuzzer:all-srcs", - "//pkg/proxy/apis/config/scheme:all-srcs", - "//pkg/proxy/apis/config/v1alpha1:all-srcs", - "//pkg/proxy/apis/config/validation:all-srcs", - ], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["register_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/component-base/config/testing:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/proxy/apis/config/scheme/BUILD b/vendor/k8s.io/kubernetes/pkg/proxy/apis/config/scheme/BUILD deleted file mode 100644 index 87c3ddef4351..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/proxy/apis/config/scheme/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["scheme.go"], - importpath = "k8s.io/kubernetes/pkg/proxy/apis/config/scheme", - visibility = ["//visibility:public"], - deps = [ - "//pkg/proxy/apis/config:go_default_library", - "//pkg/proxy/apis/config/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["scheme_test.go"], - data = glob(["testdata/**"]), - embed = [":go_default_library"], - deps = [ - "//pkg/proxy/apis/config/fuzzer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/apitesting/roundtrip:go_default_library", - "//staging/src/k8s.io/component-base/config/testing:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/proxy/apis/config/v1alpha1/BUILD b/vendor/k8s.io/kubernetes/pkg/proxy/apis/config/v1alpha1/BUILD deleted file mode 100644 index 91920cdcd9ae..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/proxy/apis/config/v1alpha1/BUILD +++ /dev/null @@ -1,58 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "defaults.go", - "doc.go", - "register.go", - "zz_generated.conversion.go", - "zz_generated.deepcopy.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/pkg/proxy/apis/config/v1alpha1", - deps = [ - "//pkg/cluster/ports:go_default_library", - "//pkg/kubelet/qos:go_default_library", - "//pkg/proxy/apis/config:go_default_library", - "//pkg/proxy/util:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/component-base/config/v1alpha1:go_default_library", - "//staging/src/k8s.io/kube-proxy/config/v1alpha1:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["defaults_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/component-base/config/v1alpha1:go_default_library", - "//staging/src/k8s.io/kube-proxy/config/v1alpha1:go_default_library", - "//vendor/github.com/google/go-cmp/cmp:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/proxy/apis/config/validation/BUILD b/vendor/k8s.io/kubernetes/pkg/proxy/apis/config/validation/BUILD deleted file mode 100644 index ac34aeb49399..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/proxy/apis/config/validation/BUILD +++ /dev/null @@ -1,51 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["validation.go"], - importpath = "k8s.io/kubernetes/pkg/proxy/apis/config/validation", - deps = [ - "//pkg/apis/core/validation:go_default_library", - "//pkg/features:go_default_library", - "//pkg/proxy/apis/config:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/config:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["validation_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/proxy/apis/config:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/component-base/config:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/proxy/apis/config/validation/validation.go b/vendor/k8s.io/kubernetes/pkg/proxy/apis/config/validation/validation.go index 0856bc97bd65..8c49dd18ebd7 100644 --- a/vendor/k8s.io/kubernetes/pkg/proxy/apis/config/validation/validation.go +++ b/vendor/k8s.io/kubernetes/pkg/proxy/apis/config/validation/validation.go @@ -76,14 +76,6 @@ func Validate(config *kubeproxyconfig.KubeProxyConfiguration) field.ErrorList { allErrs = append(allErrs, validateHostPort(config.MetricsBindAddress, newPath.Child("MetricsBindAddress"))...) dualStackEnabled := effectiveFeatures.Enabled(kubefeatures.IPv6DualStack) - endpointSliceEnabled := effectiveFeatures.Enabled(kubefeatures.EndpointSlice) - - // dual stack has strong dependency on endpoint slice since - // endpoint slice controller is the only capabable of producing - // slices for *all* clusterIPs - if dualStackEnabled && !endpointSliceEnabled { - allErrs = append(allErrs, field.Invalid(newPath.Child("FeatureGates"), config.FeatureGates, "EndpointSlice feature flag must be turned on when turning on DualStack")) - } if config.ClusterCIDR != "" { cidrs := strings.Split(config.ClusterCIDR, ",") diff --git a/vendor/k8s.io/kubernetes/pkg/proxy/config/BUILD b/vendor/k8s.io/kubernetes/pkg/proxy/config/BUILD deleted file mode 100644 index 06e1ff8da5d4..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/proxy/config/BUILD +++ /dev/null @@ -1,57 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "config.go", - "doc.go", - ], - importpath = "k8s.io/kubernetes/pkg/proxy/config", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/discovery/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/client-go/informers/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/informers/discovery/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "api_test.go", - "config_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/proxy/endpoints.go b/vendor/k8s.io/kubernetes/pkg/proxy/endpoints.go index 0de805dc2c12..8224f30954da 100644 --- a/vendor/k8s.io/kubernetes/pkg/proxy/endpoints.go +++ b/vendor/k8s.io/kubernetes/pkg/proxy/endpoints.go @@ -49,6 +49,26 @@ type BaseEndpointInfo struct { // IsLocal indicates whether the endpoint is running in same host as kube-proxy. IsLocal bool Topology map[string]string + + // ZoneHints represent the zone hints for the endpoint. This is based on + // endpoint.hints.forZones[*].name in the EndpointSlice API. + ZoneHints sets.String + // Ready indicates whether this endpoint is ready and NOT terminating. + // For pods, this is true if a pod has a ready status and a nil deletion timestamp. + // This is only set when watching EndpointSlices. If using Endpoints, this is always + // true since only ready endpoints are read from Endpoints. + // TODO: Ready can be inferred from Serving and Terminating below when enabled by default. + Ready bool + // Serving indiciates whether this endpoint is ready regardless of its terminating state. + // For pods this is true if it has a ready status regardless of its deletion timestamp. + // This is only set when watching EndpointSlices. If using Endpoints, this is always + // true since only ready endpoints are read from Endpoints. + Serving bool + // Terminating indicates whether this endpoint is terminating. + // For pods this is true if it has a non-nil deletion timestamp. + // This is only set when watching EndpointSlices. If using Endpoints, this is always + // false since terminating endpoints are always excluded from Endpoints. + Terminating bool } var _ Endpoint = &BaseEndpointInfo{} @@ -63,11 +83,33 @@ func (info *BaseEndpointInfo) GetIsLocal() bool { return info.IsLocal } +// IsReady returns true if an endpoint is ready and not terminating. +func (info *BaseEndpointInfo) IsReady() bool { + return info.Ready +} + +// IsServing returns true if an endpoint is ready, regardless of if the +// endpoint is terminating. +func (info *BaseEndpointInfo) IsServing() bool { + return info.Serving +} + +// IsTerminating retruns true if an endpoint is terminating. For pods, +// that is any pod with a deletion timestamp. +func (info *BaseEndpointInfo) IsTerminating() bool { + return info.Terminating +} + // GetTopology returns the topology information of the endpoint. func (info *BaseEndpointInfo) GetTopology() map[string]string { return info.Topology } +// GetZoneHints returns the zone hint for the endpoint. +func (info *BaseEndpointInfo) GetZoneHints() sets.String { + return info.ZoneHints +} + // IP returns just the IP part of the endpoint, it's a part of proxy.Endpoint interface. func (info *BaseEndpointInfo) IP() string { return utilproxy.IPPart(info.Endpoint) @@ -83,11 +125,16 @@ func (info *BaseEndpointInfo) Equal(other Endpoint) bool { return info.String() == other.String() && info.GetIsLocal() == other.GetIsLocal() } -func newBaseEndpointInfo(IP string, port int, isLocal bool, topology map[string]string) *BaseEndpointInfo { +func newBaseEndpointInfo(IP string, port int, isLocal bool, topology map[string]string, + ready, serving, terminating bool, zoneHints sets.String) *BaseEndpointInfo { return &BaseEndpointInfo{ - Endpoint: net.JoinHostPort(IP, strconv.Itoa(port)), - IsLocal: isLocal, - Topology: topology, + Endpoint: net.JoinHostPort(IP, strconv.Itoa(port)), + IsLocal: isLocal, + Topology: topology, + Ready: ready, + Serving: serving, + Terminating: terminating, + ZoneHints: zoneHints, } } @@ -331,7 +378,7 @@ func (em EndpointsMap) Update(changes *EndpointChangeTracker) (result UpdateEndp // TODO: If this will appear to be computationally expensive, consider // computing this incrementally similarly to endpointsMap. result.HCEndpointsLocalIPSize = make(map[types.NamespacedName]int) - localIPs := em.getLocalEndpointIPs() + localIPs := em.getLocalReadyEndpointIPs() for nsn, ips := range localIPs { result.HCEndpointsLocalIPSize[nsn] = len(ips) } @@ -383,8 +430,16 @@ func (ect *EndpointChangeTracker) endpointsToEndpointsMap(endpoints *v1.Endpoint continue } + // it is safe to assume that any address in endpoints.subsets[*].addresses is + // ready and NOT terminating + isReady := true + isServing := true + isTerminating := false isLocal := addr.NodeName != nil && *addr.NodeName == ect.hostname - baseEndpointInfo := newBaseEndpointInfo(addr.IP, int(port.Port), isLocal, nil) + // Only supported with EndpointSlice API + zoneHints := sets.String{} + + baseEndpointInfo := newBaseEndpointInfo(addr.IP, int(port.Port), isLocal, nil, isReady, isServing, isTerminating, zoneHints) if ect.makeEndpointInfo != nil { endpointsMap[svcPortName] = append(endpointsMap[svcPortName], ect.makeEndpointInfo(baseEndpointInfo)) } else { @@ -437,10 +492,16 @@ func (em EndpointsMap) unmerge(other EndpointsMap) { } // GetLocalEndpointIPs returns endpoints IPs if given endpoint is local - local means the endpoint is running in same host as kube-proxy. -func (em EndpointsMap) getLocalEndpointIPs() map[types.NamespacedName]sets.String { +func (em EndpointsMap) getLocalReadyEndpointIPs() map[types.NamespacedName]sets.String { localIPs := make(map[types.NamespacedName]sets.String) for svcPortName, epList := range em { for _, ep := range epList { + // Only add ready endpoints for health checking. Terminating endpoints may still serve traffic + // but the health check signal should fail if there are only terminating endpoints on a node. + if !ep.IsReady() { + continue + } + if ep.GetIsLocal() { nsn := svcPortName.NamespacedName if localIPs[nsn] == nil { diff --git a/vendor/k8s.io/kubernetes/pkg/proxy/endpointslicecache.go b/vendor/k8s.io/kubernetes/pkg/proxy/endpointslicecache.go index bb180adcfcdf..ec3bb8b3292a 100644 --- a/vendor/k8s.io/kubernetes/pkg/proxy/endpointslicecache.go +++ b/vendor/k8s.io/kubernetes/pkg/proxy/endpointslicecache.go @@ -23,9 +23,10 @@ import ( "strings" "sync" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" discovery "k8s.io/api/discovery/v1beta1" "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/sets" utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/client-go/tools/record" "k8s.io/klog/v2" @@ -80,6 +81,11 @@ type endpointInfo struct { Addresses []string NodeName *string Topology map[string]string + ZoneHints sets.String + + Ready bool + Serving bool + Terminating bool } // spToEndpointMap stores groups Endpoint objects by ServicePortName and @@ -122,16 +128,28 @@ func newEndpointSliceInfo(endpointSlice *discovery.EndpointSlice, remove bool) * if !remove { for _, endpoint := range endpointSlice.Endpoints { - if endpoint.Conditions.Ready == nil || *endpoint.Conditions.Ready { - eInfo := endpointInfo{ - Addresses: endpoint.Addresses, - Topology: endpoint.Topology, - } - if utilfeature.DefaultFeatureGate.Enabled(features.EndpointSliceNodeName) { - eInfo.NodeName = endpoint.NodeName + epInfo := &endpointInfo{ + Addresses: endpoint.Addresses, + Topology: endpoint.Topology, + + // conditions + Ready: endpoint.Conditions.Ready == nil || *endpoint.Conditions.Ready, + Serving: endpoint.Conditions.Serving == nil || *endpoint.Conditions.Serving, + Terminating: endpoint.Conditions.Terminating != nil && *endpoint.Conditions.Terminating, + } + + epInfo.NodeName = endpoint.NodeName + + if utilfeature.DefaultFeatureGate.Enabled(features.TopologyAwareHints) { + if endpoint.Hints != nil && len(endpoint.Hints.ForZones) > 0 { + epInfo.ZoneHints = sets.String{} + for _, zone := range endpoint.Hints.ForZones { + epInfo.ZoneHints.Insert(zone.Name) + } } - esInfo.Endpoints = append(esInfo.Endpoints, &eInfo) } + + esInfo.Endpoints = append(esInfo.Endpoints, epInfo) } sort.Sort(byAddress(esInfo.Endpoints)) @@ -269,7 +287,8 @@ func (cache *EndpointSliceCache) addEndpointsByIP(serviceNN types.NamespacedName isLocal = cache.isLocal(endpoint.Topology[v1.LabelHostname]) } - endpointInfo := newBaseEndpointInfo(endpoint.Addresses[0], portNum, isLocal, endpoint.Topology) + endpointInfo := newBaseEndpointInfo(endpoint.Addresses[0], portNum, isLocal, endpoint.Topology, + endpoint.Ready, endpoint.Serving, endpoint.Terminating, endpoint.ZoneHints) // This logic ensures we're deduping potential overlapping endpoints // isLocal should not vary between matching IPs, but if it does, we diff --git a/vendor/k8s.io/kubernetes/pkg/proxy/healthcheck/BUILD b/vendor/k8s.io/kubernetes/pkg/proxy/healthcheck/BUILD deleted file mode 100644 index 91468cd13f4b..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/proxy/healthcheck/BUILD +++ /dev/null @@ -1,52 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "common.go", - "doc.go", - "proxier_health.go", - "service_health.go", - ], - importpath = "k8s.io/kubernetes/pkg/proxy/healthcheck", - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//vendor/github.com/lithammer/dedent:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["healthcheck_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/github.com/davecgh/go-spew/spew:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/proxy/iptables/BUILD b/vendor/k8s.io/kubernetes/pkg/proxy/iptables/BUILD deleted file mode 100644 index 2bd97cf9eef8..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/proxy/iptables/BUILD +++ /dev/null @@ -1,75 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["proxier.go"], - importpath = "k8s.io/kubernetes/pkg/proxy/iptables", - deps = [ - "//pkg/features:go_default_library", - "//pkg/proxy:go_default_library", - "//pkg/proxy/healthcheck:go_default_library", - "//pkg/proxy/metaproxier:go_default_library", - "//pkg/proxy/metrics:go_default_library", - "//pkg/proxy/util:go_default_library", - "//pkg/proxy/util/iptables:go_default_library", - "//pkg/util/async:go_default_library", - "//pkg/util/conntrack:go_default_library", - "//pkg/util/iptables:go_default_library", - "//pkg/util/sysctl:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/discovery/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["proxier_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/proxy:go_default_library", - "//pkg/proxy/healthcheck:go_default_library", - "//pkg/proxy/util:go_default_library", - "//pkg/proxy/util/iptables:go_default_library", - "//pkg/proxy/util/testing:go_default_library", - "//pkg/util/async:go_default_library", - "//pkg/util/conntrack:go_default_library", - "//pkg/util/iptables:go_default_library", - "//pkg/util/iptables/testing:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/discovery/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - "//vendor/k8s.io/utils/exec/testing:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/proxy/iptables/proxier.go b/vendor/k8s.io/kubernetes/pkg/proxy/iptables/proxier.go index 50d13c573085..1d6b5551036e 100644 --- a/vendor/k8s.io/kubernetes/pkg/proxy/iptables/proxier.go +++ b/vendor/k8s.io/kubernetes/pkg/proxy/iptables/proxier.go @@ -36,6 +36,7 @@ import ( v1 "k8s.io/api/core/v1" discovery "k8s.io/api/discovery/v1beta1" "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/wait" utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/client-go/tools/record" @@ -76,6 +77,9 @@ const ( // the kubernetes forward chain kubeForwardChain utiliptables.Chain = "KUBE-FORWARD" + + // kube proxy canary chain is used for monitoring rule reload + kubeProxyCanaryChain utiliptables.Chain = "KUBE-PROXY-CANARY" ) // KernelCompatTester tests whether the required kernel capabilities are @@ -154,7 +158,7 @@ func newEndpointInfo(baseInfo *proxy.BaseEndpointInfo) proxy.Endpoint { func (e *endpointsInfo) Equal(other proxy.Endpoint) bool { o, ok := other.(*endpointsInfo) if !ok { - klog.Error("Failed to cast endpointsInfo") + klog.ErrorS(nil, "Failed to cast endpointsInfo") return false } return e.Endpoint == o.Endpoint && @@ -185,7 +189,7 @@ type Proxier struct { mu sync.Mutex // protects the following fields serviceMap proxy.ServiceMap endpointsMap proxy.EndpointsMap - portsMap map[utilproxy.LocalPort]utilproxy.Closeable + portsMap map[utilnet.LocalPort]utilnet.Closeable nodeLabels map[string]string // endpointsSynced, endpointSlicesSynced, and servicesSynced are set to true // when corresponding objects are synced after startup. This is used to avoid @@ -205,7 +209,7 @@ type Proxier struct { localDetector proxyutiliptables.LocalTrafficDetector hostname string nodeIP net.IP - portMapper utilproxy.PortOpener + portMapper utilnet.PortOpener recorder record.EventRecorder serviceHealthServer healthcheck.ServiceHealthServer @@ -238,14 +242,6 @@ type Proxier struct { networkInterfacer utilproxy.NetworkInterfacer } -// listenPortOpener opens ports by calling bind() and listen(). -type listenPortOpener struct{} - -// OpenLocalPort holds the given local port open. -func (l *listenPortOpener) OpenLocalPort(lp *utilproxy.LocalPort, isIPv6 bool) (utilproxy.Closeable, error) { - return openLocalPort(lp, isIPv6) -} - // Proxier implements proxy.Provider var _ proxy.Provider = &Proxier{} @@ -277,13 +273,13 @@ func NewProxier(ipt utiliptables.Interface, // are connected to a Linux bridge (but not SDN bridges). Until most // plugins handle this, log when config is missing if val, err := sysctl.GetSysctl(sysctlBridgeCallIPTables); err == nil && val != 1 { - klog.Warning("missing br-netfilter module or unset sysctl br-nf-call-iptables; proxy may not work as intended") + klog.InfoS("missing br-netfilter module or unset sysctl br-nf-call-iptables; proxy may not work as intended") } // Generate the masquerade mark to use for SNAT rules. masqueradeValue := 1 << uint(masqueradeBit) masqueradeMark := fmt.Sprintf("%#08x", masqueradeValue) - klog.V(2).Infof("iptables(%s) masquerade mark: %s", ipt.Protocol(), masqueradeMark) + klog.V(2).InfoS("using iptables mark for masquerade", "ipFamily", ipt.Protocol(), "mark", masqueradeMark) endpointSlicesEnabled := utilfeature.DefaultFeatureGate.Enabled(features.EndpointSliceProxying) @@ -294,14 +290,15 @@ func NewProxier(ipt utiliptables.Interface, ipFamily = v1.IPv6Protocol } - var incorrectAddresses []string - nodePortAddresses, incorrectAddresses = utilproxy.FilterIncorrectCIDRVersion(nodePortAddresses, ipFamily) - if len(incorrectAddresses) > 0 { - klog.Warningf("NodePortAddresses of wrong family; %s", incorrectAddresses) + ipFamilyMap := utilproxy.MapCIDRsByIPFamily(nodePortAddresses) + nodePortAddresses = ipFamilyMap[ipFamily] + // Log the IPs not matching the ipFamily + if ips, ok := ipFamilyMap[utilproxy.OtherIPFamily(ipFamily)]; ok && len(ips) > 0 { + klog.InfoS("found node IPs of the wrong family", "ipFamily", ipFamily, "ips", strings.Join(ips, ",")) } proxier := &Proxier{ - portsMap: make(map[utilproxy.LocalPort]utilproxy.Closeable), + portsMap: make(map[utilnet.LocalPort]utilnet.Closeable), serviceMap: make(proxy.ServiceMap), serviceChanges: proxy.NewServiceChangeTracker(newServiceInfo, ipFamily, recorder, nil), endpointsMap: make(proxy.EndpointsMap), @@ -314,7 +311,7 @@ func NewProxier(ipt utiliptables.Interface, localDetector: localDetector, hostname: hostname, nodeIP: nodeIP, - portMapper: &listenPortOpener{}, + portMapper: &utilnet.ListenPortOpener, recorder: recorder, serviceHealthServer: serviceHealthServer, healthzServer: healthzServer, @@ -330,21 +327,19 @@ func NewProxier(ipt utiliptables.Interface, } burstSyncs := 2 - klog.V(2).Infof("iptables(%s) sync params: minSyncPeriod=%v, syncPeriod=%v, burstSyncs=%d", - ipt.Protocol(), minSyncPeriod, syncPeriod, burstSyncs) + klog.V(2).InfoS("iptables sync params", "ipFamily", ipt.Protocol(), "minSyncPeriod", minSyncPeriod, "syncPeriod", syncPeriod, "burstSyncs", burstSyncs) // We pass syncPeriod to ipt.Monitor, which will call us only if it needs to. // We need to pass *some* maxInterval to NewBoundedFrequencyRunner anyway though. // time.Hour is arbitrary. proxier.syncRunner = async.NewBoundedFrequencyRunner("sync-runner", proxier.syncProxyRules, minSyncPeriod, time.Hour, burstSyncs) - go ipt.Monitor(utiliptables.Chain("KUBE-PROXY-CANARY"), - []utiliptables.Table{utiliptables.TableMangle, utiliptables.TableNAT, utiliptables.TableFilter}, + go ipt.Monitor(kubeProxyCanaryChain, []utiliptables.Table{utiliptables.TableMangle, utiliptables.TableNAT, utiliptables.TableFilter}, proxier.syncProxyRules, syncPeriod, wait.NeverStop) if ipt.HasRandomFully() { - klog.V(2).Infof("iptables(%s) supports --random-fully", ipt.Protocol()) + klog.V(2).InfoS("iptables supports --random-fully", "ipFamily", ipt.Protocol()) } else { - klog.V(2).Infof("iptables(%s) does not support --random-fully", ipt.Protocol()) + klog.V(2).InfoS("iptables does not support --random-fully", "ipFamily", ipt.Protocol()) } return proxier, nil @@ -367,17 +362,17 @@ func NewDualStackProxier( nodePortAddresses []string, ) (proxy.Provider, error) { // Create an ipv4 instance of the single-stack proxier - nodePortAddresses4, nodePortAddresses6 := utilproxy.FilterIncorrectCIDRVersion(nodePortAddresses, v1.IPv4Protocol) + ipFamilyMap := utilproxy.MapCIDRsByIPFamily(nodePortAddresses) ipv4Proxier, err := NewProxier(ipt[0], sysctl, exec, syncPeriod, minSyncPeriod, masqueradeAll, masqueradeBit, localDetectors[0], hostname, - nodeIP[0], recorder, healthzServer, nodePortAddresses4) + nodeIP[0], recorder, healthzServer, ipFamilyMap[v1.IPv4Protocol]) if err != nil { return nil, fmt.Errorf("unable to create ipv4 proxier: %v", err) } ipv6Proxier, err := NewProxier(ipt[1], sysctl, exec, syncPeriod, minSyncPeriod, masqueradeAll, masqueradeBit, localDetectors[1], hostname, - nodeIP[1], recorder, healthzServer, nodePortAddresses6) + nodeIP[1], recorder, healthzServer, ipFamilyMap[v1.IPv6Protocol]) if err != nil { return nil, fmt.Errorf("unable to create ipv6 proxier: %v", err) } @@ -395,6 +390,7 @@ type iptablesJumpChain struct { var iptablesJumpChains = []iptablesJumpChain{ {utiliptables.TableFilter, kubeExternalServicesChain, utiliptables.ChainInput, "kubernetes externally-visible service portals", []string{"-m", "conntrack", "--ctstate", "NEW"}}, {utiliptables.TableFilter, kubeExternalServicesChain, utiliptables.ChainForward, "kubernetes externally-visible service portals", []string{"-m", "conntrack", "--ctstate", "NEW"}}, + {utiliptables.TableFilter, kubeNodePortsChain, utiliptables.ChainInput, "kubernetes health check service ports", nil}, {utiliptables.TableFilter, kubeServicesChain, utiliptables.ChainForward, "kubernetes service portals", []string{"-m", "conntrack", "--ctstate", "NEW"}}, {utiliptables.TableFilter, kubeServicesChain, utiliptables.ChainOutput, "kubernetes service portals", []string{"-m", "conntrack", "--ctstate", "NEW"}}, {utiliptables.TableFilter, kubeForwardChain, utiliptables.ChainForward, "kubernetes forwarding rules", nil}, @@ -426,7 +422,7 @@ func CleanupLeftovers(ipt utiliptables.Interface) (encounteredError bool) { ) if err := ipt.DeleteRule(jump.table, jump.srcChain, args...); err != nil { if !utiliptables.IsNotFoundError(err) { - klog.Errorf("Error removing pure-iptables proxy rule: %v", err) + klog.ErrorS(err, "Error removing pure-iptables proxy rule") encounteredError = true } } @@ -435,35 +431,35 @@ func CleanupLeftovers(ipt utiliptables.Interface) (encounteredError bool) { // Flush and remove all of our "-t nat" chains. iptablesData := bytes.NewBuffer(nil) if err := ipt.SaveInto(utiliptables.TableNAT, iptablesData); err != nil { - klog.Errorf("Failed to execute iptables-save for %s: %v", utiliptables.TableNAT, err) + klog.ErrorS(err, "Failed to execute iptables-save", "table", utiliptables.TableNAT) encounteredError = true } else { existingNATChains := utiliptables.GetChainLines(utiliptables.TableNAT, iptablesData.Bytes()) natChains := bytes.NewBuffer(nil) natRules := bytes.NewBuffer(nil) - writeLine(natChains, "*nat") + utilproxy.WriteLine(natChains, "*nat") // Start with chains we know we need to remove. for _, chain := range []utiliptables.Chain{kubeServicesChain, kubeNodePortsChain, kubePostroutingChain} { if _, found := existingNATChains[chain]; found { chainString := string(chain) - writeBytesLine(natChains, existingNATChains[chain]) // flush - writeLine(natRules, "-X", chainString) // delete + utilproxy.WriteBytesLine(natChains, existingNATChains[chain]) // flush + utilproxy.WriteLine(natRules, "-X", chainString) // delete } } // Hunt for service and endpoint chains. for chain := range existingNATChains { chainString := string(chain) if strings.HasPrefix(chainString, "KUBE-SVC-") || strings.HasPrefix(chainString, "KUBE-SEP-") || strings.HasPrefix(chainString, "KUBE-FW-") || strings.HasPrefix(chainString, "KUBE-XLB-") { - writeBytesLine(natChains, existingNATChains[chain]) // flush - writeLine(natRules, "-X", chainString) // delete + utilproxy.WriteBytesLine(natChains, existingNATChains[chain]) // flush + utilproxy.WriteLine(natRules, "-X", chainString) // delete } } - writeLine(natRules, "COMMIT") + utilproxy.WriteLine(natRules, "COMMIT") natLines := append(natChains.Bytes(), natRules.Bytes()...) // Write it. err = ipt.Restore(utiliptables.TableNAT, natLines, utiliptables.NoFlushTables, utiliptables.RestoreCounters) if err != nil { - klog.Errorf("Failed to execute iptables-restore for %s: %v", utiliptables.TableNAT, err) + klog.ErrorS(err, "Failed to execute iptables-restore", "table", utiliptables.TableNAT) metrics.IptablesRestoreFailuresTotal.Inc() encounteredError = true } @@ -472,25 +468,25 @@ func CleanupLeftovers(ipt utiliptables.Interface) (encounteredError bool) { // Flush and remove all of our "-t filter" chains. iptablesData.Reset() if err := ipt.SaveInto(utiliptables.TableFilter, iptablesData); err != nil { - klog.Errorf("Failed to execute iptables-save for %s: %v", utiliptables.TableFilter, err) + klog.ErrorS(err, "Failed to execute iptables-save", "table", utiliptables.TableFilter) encounteredError = true } else { existingFilterChains := utiliptables.GetChainLines(utiliptables.TableFilter, iptablesData.Bytes()) filterChains := bytes.NewBuffer(nil) filterRules := bytes.NewBuffer(nil) - writeLine(filterChains, "*filter") - for _, chain := range []utiliptables.Chain{kubeServicesChain, kubeExternalServicesChain, kubeForwardChain} { + utilproxy.WriteLine(filterChains, "*filter") + for _, chain := range []utiliptables.Chain{kubeServicesChain, kubeExternalServicesChain, kubeForwardChain, kubeNodePortsChain} { if _, found := existingFilterChains[chain]; found { chainString := string(chain) - writeBytesLine(filterChains, existingFilterChains[chain]) - writeLine(filterRules, "-X", chainString) + utilproxy.WriteBytesLine(filterChains, existingFilterChains[chain]) + utilproxy.WriteLine(filterRules, "-X", chainString) } } - writeLine(filterRules, "COMMIT") + utilproxy.WriteLine(filterRules, "COMMIT") filterLines := append(filterChains.Bytes(), filterRules.Bytes()...) // Write it. if err := ipt.Restore(utiliptables.TableFilter, filterLines, utiliptables.NoFlushTables, utiliptables.RestoreCounters); err != nil { - klog.Errorf("Failed to execute iptables-restore for %s: %v", utiliptables.TableFilter, err) + klog.ErrorS(err, "Failed to execute iptables-restore", "table", utiliptables.TableFilter) metrics.IptablesRestoreFailuresTotal.Inc() encounteredError = true } @@ -662,7 +658,8 @@ func (proxier *Proxier) OnEndpointSlicesSynced() { // is observed. func (proxier *Proxier) OnNodeAdd(node *v1.Node) { if node.Name != proxier.hostname { - klog.Errorf("Received a watch event for a node %s that doesn't match the current node %v", node.Name, proxier.hostname) + klog.ErrorS(nil, "Received a watch event for a node that doesn't match the current node", + "eventNode", node.Name, "currentNode", proxier.hostname) return } @@ -681,7 +678,8 @@ func (proxier *Proxier) OnNodeAdd(node *v1.Node) { // node object is observed. func (proxier *Proxier) OnNodeUpdate(oldNode, node *v1.Node) { if node.Name != proxier.hostname { - klog.Errorf("Received a watch event for a node %s that doesn't match the current node %v", node.Name, proxier.hostname) + klog.ErrorS(nil, "Received a watch event for a node that doesn't match the current node", + "eventNode", node.Name, "currentNode", proxier.hostname) return } @@ -700,7 +698,8 @@ func (proxier *Proxier) OnNodeUpdate(oldNode, node *v1.Node) { // object is observed. func (proxier *Proxier) OnNodeDelete(node *v1.Node) { if node.Name != proxier.hostname { - klog.Errorf("Received a watch event for a node %s that doesn't match the current node %v", node.Name, proxier.hostname) + klog.ErrorS(nil, "Received a watch event for a node that doesn't match the current node", + "eventNode", node.Name, "currentNode", proxier.hostname) return } proxier.mu.Lock() @@ -769,23 +768,23 @@ func (proxier *Proxier) deleteEndpointConnections(connectionMap []proxy.ServiceE if nodePort != 0 { err = conntrack.ClearEntriesForPortNAT(proxier.exec, endpointIP, nodePort, svcProto) if err != nil { - klog.Errorf("Failed to delete nodeport-related %s endpoint connections, error: %v", epSvcPair.ServicePortName.String(), err) + klog.ErrorS(err, "Failed to delete nodeport-related endpoint connections", "servicePortName", epSvcPair.ServicePortName.String()) } } err = conntrack.ClearEntriesForNAT(proxier.exec, svcInfo.ClusterIP().String(), endpointIP, svcProto) if err != nil { - klog.Errorf("Failed to delete %s endpoint connections, error: %v", epSvcPair.ServicePortName.String(), err) + klog.ErrorS(err, "Failed to delete endpoint connections", "servicePortName", epSvcPair.ServicePortName.String()) } for _, extIP := range svcInfo.ExternalIPStrings() { err := conntrack.ClearEntriesForNAT(proxier.exec, extIP, endpointIP, svcProto) if err != nil { - klog.Errorf("Failed to delete %s endpoint connections for externalIP %s, error: %v", epSvcPair.ServicePortName.String(), extIP, err) + klog.ErrorS(err, "Failed to delete endpoint connections for externalIP", "servicePortName", epSvcPair.ServicePortName.String(), "externalIP", extIP) } } for _, lbIP := range svcInfo.LoadBalancerIPStrings() { err := conntrack.ClearEntriesForNAT(proxier.exec, lbIP, endpointIP, svcProto) if err != nil { - klog.Errorf("Failed to delete %s endpoint connections for LoabBalancerIP %s, error: %v", epSvcPair.ServicePortName.String(), lbIP, err) + klog.ErrorS(err, "Failed to delete endpoint connections for LoadBalancerIP", "servicePortName", epSvcPair.ServicePortName.String(), "loadBalancerIP", lbIP) } } } @@ -814,7 +813,7 @@ func (proxier *Proxier) syncProxyRules() { // don't sync rules till we've received services and endpoints if !proxier.isInitialized() { - klog.V(2).Info("Not syncing iptables until Services and Endpoints have been received from master") + klog.V(2).InfoS("Not syncing iptables until Services and Endpoints have been received from master") return } @@ -822,48 +821,42 @@ func (proxier *Proxier) syncProxyRules() { start := time.Now() defer func() { metrics.SyncProxyRulesLatency.Observe(metrics.SinceInSeconds(start)) - klog.V(2).Infof("syncProxyRules took %v", time.Since(start)) + klog.V(2).InfoS("syncProxyRules complete", "elapsed", time.Since(start)) }() - localAddrs, err := utilproxy.GetLocalAddrs() - if err != nil { - klog.Errorf("Failed to get local addresses during proxy sync: %v, assuming external IPs are not local", err) - } else if len(localAddrs) == 0 { - klog.Warning("No local addresses found, assuming all external IPs are not local") - } - - localAddrSet := utilnet.IPSet{} - localAddrSet.Insert(localAddrs...) - - nodeAddresses, err := utilproxy.GetNodeAddresses(proxier.nodePortAddresses, proxier.networkInterfacer) - if err != nil { - klog.Errorf("Failed to get node ip address matching nodeport cidrs %v, services with nodeport may not work as intended: %v", proxier.nodePortAddresses, err) - } - // We assume that if this was called, we really want to sync them, // even if nothing changed in the meantime. In other words, callers are // responsible for detecting no-op changes and not calling this function. - serviceUpdateResult := proxy.UpdateServiceMap(proxier.serviceMap, proxier.serviceChanges) + serviceUpdateResult := proxier.serviceMap.Update(proxier.serviceChanges) endpointUpdateResult := proxier.endpointsMap.Update(proxier.endpointsChanges) - staleServices := serviceUpdateResult.UDPStaleClusterIP + // We need to detect stale connections to UDP Services so we + // can clean dangling conntrack entries that can blackhole traffic. + conntrackCleanupServiceIPs := serviceUpdateResult.UDPStaleClusterIP + conntrackCleanupServiceNodePorts := sets.NewInt() // merge stale services gathered from updateEndpointsMap + // an UDP service that changes from 0 to non-0 endpoints is considered stale. for _, svcPortName := range endpointUpdateResult.StaleServiceNames { if svcInfo, ok := proxier.serviceMap[svcPortName]; ok && svcInfo != nil && conntrack.IsClearConntrackNeeded(svcInfo.Protocol()) { - klog.V(2).Infof("Stale %s service %v -> %s", strings.ToLower(string(svcInfo.Protocol())), svcPortName, svcInfo.ClusterIP().String()) - staleServices.Insert(svcInfo.ClusterIP().String()) + klog.V(2).InfoS("Stale service", "protocol", strings.ToLower(string(svcInfo.Protocol())), "svcPortName", svcPortName.String(), "clusterIP", svcInfo.ClusterIP().String()) + conntrackCleanupServiceIPs.Insert(svcInfo.ClusterIP().String()) for _, extIP := range svcInfo.ExternalIPStrings() { - staleServices.Insert(extIP) + conntrackCleanupServiceIPs.Insert(extIP) + } + nodePort := svcInfo.NodePort() + if svcInfo.Protocol() == v1.ProtocolUDP && nodePort != 0 { + klog.V(2).Infof("Stale %s service NodePort %v -> %d", strings.ToLower(string(svcInfo.Protocol())), svcPortName, nodePort) + conntrackCleanupServiceNodePorts.Insert(nodePort) } } } - klog.V(2).Info("Syncing iptables rules") + klog.V(2).InfoS("Syncing iptables rules") success := false defer func() { if !success { - klog.Infof("Sync failed; retrying in %s", proxier.syncPeriod) + klog.InfoS("Sync failed", "retryingTime", proxier.syncPeriod) proxier.syncRunner.RetryAfter(proxier.syncPeriod) } }() @@ -871,7 +864,7 @@ func (proxier *Proxier) syncProxyRules() { // Create and link the kube chains. for _, jump := range iptablesJumpChains { if _, err := proxier.iptables.EnsureChain(jump.table, jump.dstChain); err != nil { - klog.Errorf("Failed to ensure that %s chain %s exists: %v", jump.table, jump.dstChain, err) + klog.ErrorS(err, "Failed to ensure chain exists", "table", jump.table, "chain", jump.dstChain) return } args := append(jump.extraArgs, @@ -879,7 +872,7 @@ func (proxier *Proxier) syncProxyRules() { "-j", string(jump.dstChain), ) if _, err := proxier.iptables.EnsureRule(utiliptables.Prepend, jump.table, jump.srcChain, args...); err != nil { - klog.Errorf("Failed to ensure that %s chain %s jumps to %s: %v", jump.table, jump.srcChain, jump.dstChain, err) + klog.ErrorS(err, "Failed to ensure chain jumps", "table", jump.table, "srcChain", jump.srcChain, "dstChain", jump.dstChain) return } } @@ -887,7 +880,7 @@ func (proxier *Proxier) syncProxyRules() { // ensure KUBE-MARK-DROP chain exist but do not change any rules for _, ch := range iptablesEnsureChains { if _, err := proxier.iptables.EnsureChain(ch.table, ch.chain); err != nil { - klog.Errorf("Failed to ensure that %s chain %s exists: %v", ch.table, ch.chain, err) + klog.ErrorS(err, "Failed to ensure chain exists", "table", ch.table, "chain", ch.chain) return } } @@ -900,9 +893,9 @@ func (proxier *Proxier) syncProxyRules() { // This will be a map of chain name to chain with rules as stored in iptables-save/iptables-restore existingFilterChains := make(map[utiliptables.Chain][]byte) proxier.existingFilterChainsData.Reset() - err = proxier.iptables.SaveInto(utiliptables.TableFilter, proxier.existingFilterChainsData) + err := proxier.iptables.SaveInto(utiliptables.TableFilter, proxier.existingFilterChainsData) if err != nil { // if we failed to get any rules - klog.Errorf("Failed to execute iptables-save, syncing all rules: %v", err) + klog.ErrorS(err, "Failed to execute iptables-save, syncing all rules") } else { // otherwise parse the output existingFilterChains = utiliptables.GetChainLines(utiliptables.TableFilter, proxier.existingFilterChainsData.Bytes()) } @@ -912,7 +905,7 @@ func (proxier *Proxier) syncProxyRules() { proxier.iptablesData.Reset() err = proxier.iptables.SaveInto(utiliptables.TableNAT, proxier.iptablesData) if err != nil { // if we failed to get any rules - klog.Errorf("Failed to execute iptables-save, syncing all rules: %v", err) + klog.ErrorS(err, "Failed to execute iptables-save, syncing all rules") } else { // otherwise parse the output existingNATChains = utiliptables.GetChainLines(utiliptables.TableNAT, proxier.iptablesData.Bytes()) } @@ -925,23 +918,23 @@ func (proxier *Proxier) syncProxyRules() { proxier.natRules.Reset() // Write table headers. - writeLine(proxier.filterChains, "*filter") - writeLine(proxier.natChains, "*nat") + utilproxy.WriteLine(proxier.filterChains, "*filter") + utilproxy.WriteLine(proxier.natChains, "*nat") // Make sure we keep stats for the top-level chains, if they existed // (which most should have because we created them above). - for _, chainName := range []utiliptables.Chain{kubeServicesChain, kubeExternalServicesChain, kubeForwardChain} { + for _, chainName := range []utiliptables.Chain{kubeServicesChain, kubeExternalServicesChain, kubeForwardChain, kubeNodePortsChain} { if chain, ok := existingFilterChains[chainName]; ok { - writeBytesLine(proxier.filterChains, chain) + utilproxy.WriteBytesLine(proxier.filterChains, chain) } else { - writeLine(proxier.filterChains, utiliptables.MakeChainLine(chainName)) + utilproxy.WriteLine(proxier.filterChains, utiliptables.MakeChainLine(chainName)) } } for _, chainName := range []utiliptables.Chain{kubeServicesChain, kubeNodePortsChain, kubePostroutingChain, KubeMarkMasqChain} { if chain, ok := existingNATChains[chainName]; ok { - writeBytesLine(proxier.natChains, chain) + utilproxy.WriteBytesLine(proxier.natChains, chain) } else { - writeLine(proxier.natChains, utiliptables.MakeChainLine(chainName)) + utilproxy.WriteLine(proxier.natChains, utiliptables.MakeChainLine(chainName)) } } @@ -949,13 +942,13 @@ func (proxier *Proxier) syncProxyRules() { // this so that it is easier to flush and change, for example if the mark // value should ever change. // NB: THIS MUST MATCH the corresponding code in the kubelet - writeLine(proxier.natRules, []string{ + utilproxy.WriteLine(proxier.natRules, []string{ "-A", string(kubePostroutingChain), "-m", "mark", "!", "--mark", fmt.Sprintf("%s/%s", proxier.masqueradeMark, proxier.masqueradeMark), "-j", "RETURN", }...) // Clear the mark to avoid re-masquerading if the packet re-traverses the network stack. - writeLine(proxier.natRules, []string{ + utilproxy.WriteLine(proxier.natRules, []string{ "-A", string(kubePostroutingChain), // XOR proxier.masqueradeMark to unset it "-j", "MARK", "--xor-mark", proxier.masqueradeMark, @@ -968,12 +961,12 @@ func (proxier *Proxier) syncProxyRules() { if proxier.iptables.HasRandomFully() { masqRule = append(masqRule, "--random-fully") } - writeLine(proxier.natRules, masqRule...) + utilproxy.WriteLine(proxier.natRules, masqRule...) // Install the kubernetes-specific masquerade mark rule. We use a whole chain for // this so that it is easier to flush and change, for example if the mark // value should ever change. - writeLine(proxier.natRules, []string{ + utilproxy.WriteLine(proxier.natRules, []string{ "-A", string(KubeMarkMasqChain), "-j", "MARK", "--or-mark", proxier.masqueradeMark, }...) @@ -982,7 +975,7 @@ func (proxier *Proxier) syncProxyRules() { activeNATChains := map[utiliptables.Chain]bool{} // use a map as a set // Accumulate the set of local ports that we will be holding open once this update is complete - replacementPortsMap := map[utilproxy.LocalPort]utilproxy.Closeable{} + replacementPortsMap := map[utilnet.LocalPort]utilnet.Closeable{} // We are creating those slices ones here to avoid memory reallocations // in every loop. Note that reuse the memory, instead of doing: @@ -1004,50 +997,64 @@ func (proxier *Proxier) syncProxyRules() { proxier.endpointChainsNumber += len(proxier.endpointsMap[svcName]) } + localAddrSet := utilproxy.GetLocalAddrSet() + nodeAddresses, err := utilproxy.GetNodeAddresses(proxier.nodePortAddresses, proxier.networkInterfacer) + if err != nil { + klog.ErrorS(err, "Failed to get node ip address matching nodeport cidrs, services with nodeport may not work as intended", "CIDRs", proxier.nodePortAddresses) + } + // Build rules for each service. for svcName, svc := range proxier.serviceMap { svcInfo, ok := svc.(*serviceInfo) if !ok { - klog.Errorf("Failed to cast serviceInfo %q", svcName.String()) + klog.ErrorS(nil, "Failed to cast serviceInfo", "svcName", svcName.String()) continue } isIPv6 := utilnet.IsIPv6(svcInfo.ClusterIP()) + localPortIPFamily := utilnet.IPv4 + if isIPv6 { + localPortIPFamily = utilnet.IPv6 + } protocol := strings.ToLower(string(svcInfo.Protocol())) svcNameString := svcInfo.serviceNameString allEndpoints := proxier.endpointsMap[svcName] - hasEndpoints := len(allEndpoints) > 0 + // Filtering for topology aware endpoints. This function will only + // filter endpoints if appropriate feature gates are enabled and the + // Service does not have conflicting configuration such as + // externalTrafficPolicy=Local. + allEndpoints = proxy.FilterEndpoints(allEndpoints, svcInfo, proxier.nodeLabels) + + readyEndpoints := make([]proxy.Endpoint, 0, len(allEndpoints)) + for _, endpoint := range allEndpoints { + if !endpoint.IsReady() { + continue + } - // Service Topology will not be enabled in the following cases: - // 1. externalTrafficPolicy=Local (mutually exclusive with service topology). - // 2. ServiceTopology is not enabled. - // 3. EndpointSlice is not enabled (service topology depends on endpoint slice - // to get topology information). - if !svcInfo.OnlyNodeLocalEndpoints() && utilfeature.DefaultFeatureGate.Enabled(features.ServiceTopology) && utilfeature.DefaultFeatureGate.Enabled(features.EndpointSliceProxying) { - allEndpoints = proxy.FilterTopologyEndpoint(proxier.nodeLabels, svcInfo.TopologyKeys(), allEndpoints) - hasEndpoints = len(allEndpoints) > 0 + readyEndpoints = append(readyEndpoints, endpoint) } + hasEndpoints := len(readyEndpoints) > 0 svcChain := svcInfo.servicePortChainName if hasEndpoints { // Create the per-service chain, retaining counters if possible. if chain, ok := existingNATChains[svcChain]; ok { - writeBytesLine(proxier.natChains, chain) + utilproxy.WriteBytesLine(proxier.natChains, chain) } else { - writeLine(proxier.natChains, utiliptables.MakeChainLine(svcChain)) + utilproxy.WriteLine(proxier.natChains, utiliptables.MakeChainLine(svcChain)) } activeNATChains[svcChain] = true } svcXlbChain := svcInfo.serviceLBChainName - if svcInfo.OnlyNodeLocalEndpoints() { + if svcInfo.NodeLocalExternal() { // Only for services request OnlyLocal traffic // create the per-service LB chain, retaining counters if possible. if lbChain, ok := existingNATChains[svcXlbChain]; ok { - writeBytesLine(proxier.natChains, lbChain) + utilproxy.WriteBytesLine(proxier.natChains, lbChain) } else { - writeLine(proxier.natChains, utiliptables.MakeChainLine(svcXlbChain)) + utilproxy.WriteLine(proxier.natChains, utiliptables.MakeChainLine(svcXlbChain)) } activeNATChains[svcXlbChain] = true } @@ -1062,19 +1069,19 @@ func (proxier *Proxier) syncProxyRules() { "--dport", strconv.Itoa(svcInfo.Port()), ) if proxier.masqueradeAll { - writeLine(proxier.natRules, append(args, "-j", string(KubeMarkMasqChain))...) + utilproxy.WriteLine(proxier.natRules, append(args, "-j", string(KubeMarkMasqChain))...) } else if proxier.localDetector.IsImplemented() { // This masquerades off-cluster traffic to a service VIP. The idea // is that you can establish a static route for your Service range, // routing to any node, and that node will bridge into the Service // for you. Since that might bounce off-node, we masquerade here. // If/when we support "Local" policy for VIPs, we should update this. - writeLine(proxier.natRules, proxier.localDetector.JumpIfNotLocal(args, string(KubeMarkMasqChain))...) + utilproxy.WriteLine(proxier.natRules, proxier.localDetector.JumpIfNotLocal(args, string(KubeMarkMasqChain))...) } - writeLine(proxier.natRules, append(args, "-j", string(svcChain))...) + utilproxy.WriteLine(proxier.natRules, append(args, "-j", string(svcChain))...) } else { // No endpoints. - writeLine(proxier.filterRules, + utilproxy.WriteLine(proxier.filterRules, "-A", string(kubeServicesChain), "-m", "comment", "--comment", fmt.Sprintf(`"%s has no endpoints"`, svcNameString), "-m", protocol, "-p", protocol, @@ -1090,17 +1097,18 @@ func (proxier *Proxier) syncProxyRules() { // machine, hold the local port open so no other process can open it // (because the socket might open but it would never work). if (svcInfo.Protocol() != v1.ProtocolSCTP) && localAddrSet.Has(net.ParseIP(externalIP)) { - lp := utilproxy.LocalPort{ + lp := utilnet.LocalPort{ Description: "externalIP for " + svcNameString, IP: externalIP, + IPFamily: localPortIPFamily, Port: svcInfo.Port(), - Protocol: protocol, + Protocol: utilnet.Protocol(svcInfo.Protocol()), } if proxier.portsMap[lp] != nil { - klog.V(4).Infof("Port %s was open before and is still needed", lp.String()) + klog.V(4).InfoS("Port was open before and is still needed", "port", lp.String()) replacementPortsMap[lp] = proxier.portsMap[lp] } else { - socket, err := proxier.portMapper.OpenLocalPort(&lp, isIPv6) + socket, err := proxier.portMapper.OpenLocalPort(&lp) if err != nil { msg := fmt.Sprintf("can't open %s, skipping this externalIP: %v", lp.String(), err) @@ -1111,9 +1119,10 @@ func (proxier *Proxier) syncProxyRules() { UID: types.UID(proxier.hostname), Namespace: "", }, v1.EventTypeWarning, err.Error(), msg) - klog.Error(msg) + klog.ErrorS(err, "can't open port, skipping externalIP", "port", lp.String()) continue } + klog.V(2).InfoS("Opened local port", "port", lp.String()) replacementPortsMap[lp] = socket } } @@ -1128,27 +1137,25 @@ func (proxier *Proxier) syncProxyRules() { ) destChain := svcXlbChain - // We have to SNAT packets to external IPs if externalTrafficPolicy is cluster. - if !svcInfo.OnlyNodeLocalEndpoints() { + // We have to SNAT packets to external IPs if externalTrafficPolicy is cluster + // and the traffic is NOT Local. Local traffic coming from Pods and Nodes will + // be always forwarded to the corresponding Service, so no need to SNAT + // If we can't differentiate the local traffic we always SNAT. + if !svcInfo.NodeLocalExternal() { destChain = svcChain - writeLine(proxier.natRules, append(args, "-j", string(KubeMarkMasqChain))...) + // This masquerades off-cluster traffic to a External IP. + if proxier.localDetector.IsImplemented() { + utilproxy.WriteLine(proxier.natRules, proxier.localDetector.JumpIfNotLocal(args, string(KubeMarkMasqChain))...) + } else { + utilproxy.WriteLine(proxier.natRules, append(args, "-j", string(KubeMarkMasqChain))...) + } } + // Sent traffic bound for external IPs to the service chain. + utilproxy.WriteLine(proxier.natRules, append(args, "-j", string(destChain))...) - // Allow traffic for external IPs that does not come from a bridge (i.e. not from a container) - // nor from a local process to be forwarded to the service. - // This rule roughly translates to "all traffic from off-machine". - // This is imperfect in the face of network plugins that might not use a bridge, but we can revisit that later. - externalTrafficOnlyArgs := append(args, - "-m", "physdev", "!", "--physdev-is-in", - "-m", "addrtype", "!", "--src-type", "LOCAL") - writeLine(proxier.natRules, append(externalTrafficOnlyArgs, "-j", string(destChain))...) - dstLocalOnlyArgs := append(args, "-m", "addrtype", "--dst-type", "LOCAL") - // Allow traffic bound for external IPs that happen to be recognized as local IPs to stay local. - // This covers cases like GCE load-balancers which get added to the local routing table. - writeLine(proxier.natRules, append(dstLocalOnlyArgs, "-j", string(destChain))...) } else { // No endpoints. - writeLine(proxier.filterRules, + utilproxy.WriteLine(proxier.filterRules, "-A", string(kubeExternalServicesChain), "-m", "comment", "--comment", fmt.Sprintf(`"%s has no endpoints"`, svcNameString), "-m", protocol, "-p", protocol, @@ -1166,9 +1173,9 @@ func (proxier *Proxier) syncProxyRules() { if hasEndpoints { // create service firewall chain if chain, ok := existingNATChains[fwChain]; ok { - writeBytesLine(proxier.natChains, chain) + utilproxy.WriteBytesLine(proxier.natChains, chain) } else { - writeLine(proxier.natChains, utiliptables.MakeChainLine(fwChain)) + utilproxy.WriteLine(proxier.natChains, utiliptables.MakeChainLine(fwChain)) } activeNATChains[fwChain] = true // The service firewall rules are created based on ServiceSpec.loadBalancerSourceRanges field. @@ -1183,7 +1190,7 @@ func (proxier *Proxier) syncProxyRules() { "--dport", strconv.Itoa(svcInfo.Port()), ) // jump to service firewall chain - writeLine(proxier.natRules, append(args, "-j", string(fwChain))...) + utilproxy.WriteLine(proxier.natRules, append(args, "-j", string(fwChain))...) args = append(args[:0], "-A", string(fwChain), @@ -1194,22 +1201,22 @@ func (proxier *Proxier) syncProxyRules() { chosenChain := svcXlbChain // If we are proxying globally, we need to masquerade in case we cross nodes. // If we are proxying only locally, we can retain the source IP. - if !svcInfo.OnlyNodeLocalEndpoints() { - writeLine(proxier.natRules, append(args, "-j", string(KubeMarkMasqChain))...) + if !svcInfo.NodeLocalExternal() { + utilproxy.WriteLine(proxier.natRules, append(args, "-j", string(KubeMarkMasqChain))...) chosenChain = svcChain } if len(svcInfo.LoadBalancerSourceRanges()) == 0 { // allow all sources, so jump directly to the KUBE-SVC or KUBE-XLB chain - writeLine(proxier.natRules, append(args, "-j", string(chosenChain))...) + utilproxy.WriteLine(proxier.natRules, append(args, "-j", string(chosenChain))...) } else { // firewall filter based on each source range allowFromNode := false for _, src := range svcInfo.LoadBalancerSourceRanges() { - writeLine(proxier.natRules, append(args, "-s", src, "-j", string(chosenChain))...) + utilproxy.WriteLine(proxier.natRules, append(args, "-s", src, "-j", string(chosenChain))...) _, cidr, err := net.ParseCIDR(src) if err != nil { - klog.Errorf("Error parsing %s CIDR in LoadBalancerSourceRanges, dropping: %v", cidr, err) + klog.ErrorS(err, "Error parsing CIDR in LoadBalancerSourceRanges, dropping it", "cidr", cidr) } else if cidr.Contains(proxier.nodeIP) { allowFromNode = true } @@ -1218,16 +1225,16 @@ func (proxier *Proxier) syncProxyRules() { // loadbalancer's backend hosts. In this case, request will not hit the loadbalancer but loop back directly. // Need to add the following rule to allow request on host. if allowFromNode { - writeLine(proxier.natRules, append(args, "-s", utilproxy.ToCIDR(net.ParseIP(ingress)), "-j", string(chosenChain))...) + utilproxy.WriteLine(proxier.natRules, append(args, "-s", utilproxy.ToCIDR(net.ParseIP(ingress)), "-j", string(chosenChain))...) } } // If the packet was able to reach the end of firewall chain, then it did not get DNATed. // It means the packet cannot go thru the firewall, then mark it for DROP - writeLine(proxier.natRules, append(args, "-j", string(KubeMarkDropChain))...) + utilproxy.WriteLine(proxier.natRules, append(args, "-j", string(KubeMarkDropChain))...) } else { // No endpoints. - writeLine(proxier.filterRules, + utilproxy.WriteLine(proxier.filterRules, "-A", string(kubeExternalServicesChain), "-m", "comment", "--comment", fmt.Sprintf(`"%s has no endpoints"`, svcNameString), "-m", protocol, "-p", protocol, @@ -1249,13 +1256,14 @@ func (proxier *Proxier) syncProxyRules() { continue } - lps := make([]utilproxy.LocalPort, 0) + lps := make([]utilnet.LocalPort, 0) for address := range nodeAddresses { - lp := utilproxy.LocalPort{ + lp := utilnet.LocalPort{ Description: "nodePort for " + svcNameString, IP: address, + IPFamily: localPortIPFamily, Port: svcInfo.NodePort(), - Protocol: protocol, + Protocol: utilnet.Protocol(svcInfo.Protocol()), } if utilproxy.IsZeroCIDR(address) { // Empty IP address means all @@ -1270,24 +1278,15 @@ func (proxier *Proxier) syncProxyRules() { // For ports on node IPs, open the actual port and hold it. for _, lp := range lps { if proxier.portsMap[lp] != nil { - klog.V(4).Infof("Port %s was open before and is still needed", lp.String()) + klog.V(4).InfoS("Port was open before and is still needed", "port", lp.String()) replacementPortsMap[lp] = proxier.portsMap[lp] } else if svcInfo.Protocol() != v1.ProtocolSCTP { - socket, err := proxier.portMapper.OpenLocalPort(&lp, isIPv6) + socket, err := proxier.portMapper.OpenLocalPort(&lp) if err != nil { - klog.Errorf("can't open %s, skipping this nodePort: %v", lp.String(), err) + klog.ErrorS(err, "can't open port, skipping this nodePort", "port", lp.String()) continue } - if lp.Protocol == "udp" { - // TODO: We might have multiple services using the same port, and this will clear conntrack for all of them. - // This is very low impact. The NodePort range is intentionally obscure, and unlikely to actually collide with real Services. - // This only affects UDP connections, which are not common. - // See issue: https://github.com/kubernetes/kubernetes/issues/49881 - err := conntrack.ClearEntriesForPort(proxier.exec, lp.Port, isIPv6, v1.ProtocolUDP) - if err != nil { - klog.Errorf("Failed to clear udp conntrack for port %d, error: %v", lp.Port, err) - } - } + klog.V(2).InfoS("Opened local port", "port", lp.String()) replacementPortsMap[lp] = socket } } @@ -1299,11 +1298,11 @@ func (proxier *Proxier) syncProxyRules() { "-m", protocol, "-p", protocol, "--dport", strconv.Itoa(svcInfo.NodePort()), ) - if !svcInfo.OnlyNodeLocalEndpoints() { + if !svcInfo.NodeLocalExternal() { // Nodeports need SNAT, unless they're local. - writeLine(proxier.natRules, append(args, "-j", string(KubeMarkMasqChain))...) + utilproxy.WriteLine(proxier.natRules, append(args, "-j", string(KubeMarkMasqChain))...) // Jump to the service chain. - writeLine(proxier.natRules, append(args, "-j", string(svcChain))...) + utilproxy.WriteLine(proxier.natRules, append(args, "-j", string(svcChain))...) } else { // TODO: Make all nodePorts jump to the firewall chain. // Currently we only create it for loadbalancers (#33586). @@ -1313,12 +1312,12 @@ func (proxier *Proxier) syncProxyRules() { if isIPv6 { loopback = "::1/128" } - writeLine(proxier.natRules, append(args, "-s", loopback, "-j", string(KubeMarkMasqChain))...) - writeLine(proxier.natRules, append(args, "-j", string(svcXlbChain))...) + utilproxy.WriteLine(proxier.natRules, append(args, "-s", loopback, "-j", string(KubeMarkMasqChain))...) + utilproxy.WriteLine(proxier.natRules, append(args, "-j", string(svcXlbChain))...) } } else { // No endpoints. - writeLine(proxier.filterRules, + utilproxy.WriteLine(proxier.filterRules, "-A", string(kubeExternalServicesChain), "-m", "comment", "--comment", fmt.Sprintf(`"%s has no endpoints"`, svcNameString), "-m", "addrtype", "--dst-type", "LOCAL", @@ -1329,6 +1328,19 @@ func (proxier *Proxier) syncProxyRules() { } } + // Capture healthCheckNodePorts. + if svcInfo.HealthCheckNodePort() != 0 { + // no matter if node has local endpoints, healthCheckNodePorts + // need to add a rule to accept the incoming connection + utilproxy.WriteLine(proxier.filterRules, + "-A", string(kubeNodePortsChain), + "-m", "comment", "--comment", fmt.Sprintf(`"%s health check node port"`, svcNameString), + "-m", "tcp", "-p", "tcp", + "--dport", strconv.Itoa(svcInfo.HealthCheckNodePort()), + "-j", "ACCEPT", + ) + } + if !hasEndpoints { continue } @@ -1339,10 +1351,10 @@ func (proxier *Proxier) syncProxyRules() { endpoints = endpoints[:0] endpointChains = endpointChains[:0] var endpointChain utiliptables.Chain - for _, ep := range allEndpoints { + for _, ep := range readyEndpoints { epInfo, ok := ep.(*endpointsInfo) if !ok { - klog.Errorf("Failed to cast endpointsInfo %q", ep.String()) + klog.ErrorS(err, "Failed to cast endpointsInfo", "endpointsInfo", ep.String()) continue } @@ -1351,10 +1363,10 @@ func (proxier *Proxier) syncProxyRules() { endpointChains = append(endpointChains, endpointChain) // Create the endpoint chain, retaining counters if possible. - if chain, ok := existingNATChains[utiliptables.Chain(endpointChain)]; ok { - writeBytesLine(proxier.natChains, chain) + if chain, ok := existingNATChains[endpointChain]; ok { + utilproxy.WriteBytesLine(proxier.natChains, chain) } else { - writeLine(proxier.natChains, utiliptables.MakeChainLine(endpointChain)) + utilproxy.WriteLine(proxier.natChains, utiliptables.MakeChainLine(endpointChain)) } activeNATChains[endpointChain] = true } @@ -1371,7 +1383,7 @@ func (proxier *Proxier) syncProxyRules() { "--rcheck", "--seconds", strconv.Itoa(svcInfo.StickyMaxAgeSeconds()), "--reap", "-j", string(endpointChain), ) - writeLine(proxier.natRules, args...) + utilproxy.WriteLine(proxier.natRules, args...) } } @@ -1380,7 +1392,7 @@ func (proxier *Proxier) syncProxyRules() { localEndpointChains := make([]utiliptables.Chain, 0) for i, endpointChain := range endpointChains { // Write ingress loadbalancing & DNAT rules only for services that request OnlyLocal traffic. - if svcInfo.OnlyNodeLocalEndpoints() && endpoints[i].IsLocal { + if svcInfo.NodeLocalExternal() && endpoints[i].IsLocal { localEndpointChains = append(localEndpointChains, endpointChains[i]) } @@ -1402,13 +1414,13 @@ func (proxier *Proxier) syncProxyRules() { } // The final (or only if n == 1) rule is a guaranteed match. args = append(args, "-j", string(endpointChain)) - writeLine(proxier.natRules, args...) + utilproxy.WriteLine(proxier.natRules, args...) // Rules in the per-endpoint chain. args = append(args[:0], "-A", string(endpointChain)) args = proxier.appendServiceCommentLocked(args, svcNameString) // Handle traffic that loops back to the originator with SNAT. - writeLine(proxier.natRules, append(args, + utilproxy.WriteLine(proxier.natRules, append(args, "-s", utilproxy.ToCIDR(net.ParseIP(epIP)), "-j", string(KubeMarkMasqChain))...) // Update client-affinity lists. @@ -1417,11 +1429,11 @@ func (proxier *Proxier) syncProxyRules() { } // DNAT to final destination. args = append(args, "-m", protocol, "-p", protocol, "-j", "DNAT", "--to-destination", endpoints[i].Endpoint) - writeLine(proxier.natRules, args...) + utilproxy.WriteLine(proxier.natRules, args...) } // The logic below this applies only if this service is marked as OnlyLocal - if !svcInfo.OnlyNodeLocalEndpoints() { + if !svcInfo.NodeLocalExternal() { continue } @@ -1434,17 +1446,17 @@ func (proxier *Proxier) syncProxyRules() { "-m", "comment", "--comment", `"Redirect pods trying to reach external loadbalancer VIP to clusterIP"`, ) - writeLine(proxier.natRules, proxier.localDetector.JumpIfLocal(args, string(svcChain))...) + utilproxy.WriteLine(proxier.natRules, proxier.localDetector.JumpIfLocal(args, string(svcChain))...) } // Next, redirect all src-type=LOCAL -> LB IP to the service chain for externalTrafficPolicy=Local // This allows traffic originating from the host to be redirected to the service correctly, // otherwise traffic to LB IPs are dropped if there are no local endpoints. args = append(args[:0], "-A", string(svcXlbChain)) - writeLine(proxier.natRules, append(args, + utilproxy.WriteLine(proxier.natRules, append(args, "-m", "comment", "--comment", fmt.Sprintf(`"masquerade LOCAL traffic for %s LB IP"`, svcNameString), "-m", "addrtype", "--src-type", "LOCAL", "-j", string(KubeMarkMasqChain))...) - writeLine(proxier.natRules, append(args, + utilproxy.WriteLine(proxier.natRules, append(args, "-m", "comment", "--comment", fmt.Sprintf(`"route LOCAL traffic for %s LB IP to service chain"`, svcNameString), "-m", "addrtype", "--src-type", "LOCAL", "-j", string(svcChain))...) @@ -1458,12 +1470,12 @@ func (proxier *Proxier) syncProxyRules() { "-j", string(KubeMarkDropChain), ) - writeLine(proxier.natRules, args...) + utilproxy.WriteLine(proxier.natRules, args...) } else { // First write session affinity rules only over local endpoints, if applicable. if svcInfo.SessionAffinityType() == v1.ServiceAffinityClientIP { for _, endpointChain := range localEndpointChains { - writeLine(proxier.natRules, + utilproxy.WriteLine(proxier.natRules, "-A", string(svcXlbChain), "-m", "comment", "--comment", svcNameString, "-m", "recent", "--name", string(endpointChain), @@ -1489,7 +1501,7 @@ func (proxier *Proxier) syncProxyRules() { } // The final (or only if n == 1) rule is a guaranteed match. args = append(args, "-j", string(endpointChain)) - writeLine(proxier.natRules, args...) + utilproxy.WriteLine(proxier.natRules, args...) } } } @@ -1505,8 +1517,8 @@ func (proxier *Proxier) syncProxyRules() { // We must (as per iptables) write a chain-line for it, which has // the nice effect of flushing the chain. Then we can remove the // chain. - writeBytesLine(proxier.natChains, existingNATChains[chain]) - writeLine(proxier.natRules, "-X", chainString) + utilproxy.WriteBytesLine(proxier.natChains, existingNATChains[chain]) + utilproxy.WriteLine(proxier.natRules, "-X", chainString) } } @@ -1521,13 +1533,13 @@ func (proxier *Proxier) syncProxyRules() { "-m", "comment", "--comment", `"kubernetes service nodeports; NOTE: this must be the last rule in this chain"`, "-m", "addrtype", "--dst-type", "LOCAL", "-j", string(kubeNodePortsChain)) - writeLine(proxier.natRules, args...) + utilproxy.WriteLine(proxier.natRules, args...) // Nothing else matters after the zero CIDR. break } // Ignore IP addresses with incorrect version if isIPv6 && !utilnet.IsIPv6String(address) || !isIPv6 && utilnet.IsIPv6String(address) { - klog.Errorf("IP address %s has incorrect IP version", address) + klog.ErrorS(nil, "IP has incorrect IP version", "ip", address) continue } // create nodeport rules for each IP one by one @@ -1536,13 +1548,13 @@ func (proxier *Proxier) syncProxyRules() { "-m", "comment", "--comment", `"kubernetes service nodeports; NOTE: this must be the last rule in this chain"`, "-d", address, "-j", string(kubeNodePortsChain)) - writeLine(proxier.natRules, args...) + utilproxy.WriteLine(proxier.natRules, args...) } // Drop the packets in INVALID state, which would potentially cause // unexpected connection reset. // https://github.com/kubernetes/kubernetes/issues/74839 - writeLine(proxier.filterRules, + utilproxy.WriteLine(proxier.filterRules, "-A", string(kubeForwardChain), "-m", "conntrack", "--ctstate", "INVALID", @@ -1552,7 +1564,7 @@ func (proxier *Proxier) syncProxyRules() { // If the masqueradeMark has been added then we want to forward that same // traffic, this allows NodePort traffic to be forwarded even if the default // FORWARD policy is not accept. - writeLine(proxier.filterRules, + utilproxy.WriteLine(proxier.filterRules, "-A", string(kubeForwardChain), "-m", "comment", "--comment", `"kubernetes forwarding rules"`, "-m", "mark", "--mark", fmt.Sprintf("%s/%s", proxier.masqueradeMark, proxier.masqueradeMark), @@ -1562,14 +1574,14 @@ func (proxier *Proxier) syncProxyRules() { // The following two rules ensure the traffic after the initial packet // accepted by the "kubernetes forwarding rules" rule above will be // accepted. - writeLine(proxier.filterRules, + utilproxy.WriteLine(proxier.filterRules, "-A", string(kubeForwardChain), "-m", "comment", "--comment", `"kubernetes forwarding conntrack pod source rule"`, "-m", "conntrack", "--ctstate", "RELATED,ESTABLISHED", "-j", "ACCEPT", ) - writeLine(proxier.filterRules, + utilproxy.WriteLine(proxier.filterRules, "-A", string(kubeForwardChain), "-m", "comment", "--comment", `"kubernetes forwarding conntrack pod destination rule"`, "-m", "conntrack", @@ -1578,8 +1590,8 @@ func (proxier *Proxier) syncProxyRules() { ) // Write the end-of-table markers. - writeLine(proxier.filterRules, "COMMIT") - writeLine(proxier.natRules, "COMMIT") + utilproxy.WriteLine(proxier.filterRules, "COMMIT") + utilproxy.WriteLine(proxier.natRules, "COMMIT") // Sync rules. // NOTE: NoFlushTables is used so we don't flush non-kubernetes chains in the table @@ -1589,13 +1601,18 @@ func (proxier *Proxier) syncProxyRules() { proxier.iptablesData.Write(proxier.natChains.Bytes()) proxier.iptablesData.Write(proxier.natRules.Bytes()) - klog.V(5).Infof("Restoring iptables rules: %s", proxier.iptablesData.Bytes()) + numberFilterIptablesRules := utilproxy.CountBytesLines(proxier.filterRules.Bytes()) + metrics.IptablesRulesTotal.WithLabelValues(string(utiliptables.TableFilter)).Set(float64(numberFilterIptablesRules)) + numberNatIptablesRules := utilproxy.CountBytesLines(proxier.natRules.Bytes()) + metrics.IptablesRulesTotal.WithLabelValues(string(utiliptables.TableNAT)).Set(float64(numberNatIptablesRules)) + + klog.V(5).InfoS("Restoring iptables", "rules", proxier.iptablesData.Bytes()) err = proxier.iptables.RestoreAll(proxier.iptablesData.Bytes(), utiliptables.NoFlushTables, utiliptables.RestoreCounters) if err != nil { - klog.Errorf("Failed to execute iptables-restore: %v", err) + klog.ErrorS(err, "Failed to execute iptables-restore") metrics.IptablesRestoreFailuresTotal.Inc() // Revert new local ports. - klog.V(2).Infof("Closing local ports after iptables-restore failure") + klog.V(2).InfoS("Closing local ports after iptables-restore failure") utilproxy.RevertPorts(replacementPortsMap, proxier.portsMap) return } @@ -1605,7 +1622,7 @@ func (proxier *Proxier) syncProxyRules() { for _, lastChangeTriggerTime := range lastChangeTriggerTimes { latency := metrics.SinceInSeconds(lastChangeTriggerTime) metrics.NetworkProgrammingLatency.Observe(latency) - klog.V(4).Infof("Network programming of %s took %f seconds", name, latency) + klog.V(4).InfoS("Network programming", "endpoint", klog.KRef(name.Namespace, name.Name), "elapsed", latency) } } @@ -1626,84 +1643,28 @@ func (proxier *Proxier) syncProxyRules() { // not "OnlyLocal", but the services list will not, and the serviceHealthServer // will just drop those endpoints. if err := proxier.serviceHealthServer.SyncServices(serviceUpdateResult.HCServiceNodePorts); err != nil { - klog.Errorf("Error syncing healthcheck services: %v", err) + klog.ErrorS(err, "Error syncing healthcheck services") } if err := proxier.serviceHealthServer.SyncEndpoints(endpointUpdateResult.HCEndpointsLocalIPSize); err != nil { - klog.Errorf("Error syncing healthcheck endpoints: %v", err) + klog.ErrorS(err, "Error syncing healthcheck endpoints") } // Finish housekeeping. + // Clear stale conntrack entries for UDP Services, this has to be done AFTER the iptables rules are programmed. // TODO: these could be made more consistent. - klog.V(4).Infof("Deleting stale services IPs: %v", staleServices.UnsortedList()) - for _, svcIP := range staleServices.UnsortedList() { + klog.V(4).InfoS("Deleting conntrack stale entries for Services", "ips", conntrackCleanupServiceIPs.UnsortedList()) + for _, svcIP := range conntrackCleanupServiceIPs.UnsortedList() { if err := conntrack.ClearEntriesForIP(proxier.exec, svcIP, v1.ProtocolUDP); err != nil { - klog.Errorf("Failed to delete stale service IP %s connections, error: %v", svcIP, err) + klog.ErrorS(err, "Failed to delete stale service connections", "ip", svcIP) } } - klog.V(4).Infof("Deleting stale endpoint connections: %v", endpointUpdateResult.StaleEndpoints) - proxier.deleteEndpointConnections(endpointUpdateResult.StaleEndpoints) -} - -// Join all words with spaces, terminate with newline and write to buf. -func writeLine(buf *bytes.Buffer, words ...string) { - // We avoid strings.Join for performance reasons. - for i := range words { - buf.WriteString(words[i]) - if i < len(words)-1 { - buf.WriteByte(' ') - } else { - buf.WriteByte('\n') - } - } -} - -func writeBytesLine(buf *bytes.Buffer, bytes []byte) { - buf.Write(bytes) - buf.WriteByte('\n') -} - -func openLocalPort(lp *utilproxy.LocalPort, isIPv6 bool) (utilproxy.Closeable, error) { - // For ports on node IPs, open the actual port and hold it, even though we - // use iptables to redirect traffic. - // This ensures a) that it's safe to use that port and b) that (a) stays - // true. The risk is that some process on the node (e.g. sshd or kubelet) - // is using a port and we give that same port out to a Service. That would - // be bad because iptables would silently claim the traffic but the process - // would never know. - // NOTE: We should not need to have a real listen()ing socket - bind() - // should be enough, but I can't figure out a way to e2e test without - // it. Tools like 'ss' and 'netstat' do not show sockets that are - // bind()ed but not listen()ed, and at least the default debian netcat - // has no way to avoid about 10 seconds of retries. - var socket utilproxy.Closeable - switch lp.Protocol { - case "tcp": - network := "tcp4" - if isIPv6 { - network = "tcp6" - } - listener, err := net.Listen(network, net.JoinHostPort(lp.IP, strconv.Itoa(lp.Port))) - if err != nil { - return nil, err - } - socket = listener - case "udp": - network := "udp4" - if isIPv6 { - network = "udp6" - } - addr, err := net.ResolveUDPAddr(network, net.JoinHostPort(lp.IP, strconv.Itoa(lp.Port))) + klog.V(4).InfoS("Deleting conntrack stale entries for Services", "nodeports", conntrackCleanupServiceNodePorts.UnsortedList()) + for _, nodePort := range conntrackCleanupServiceNodePorts.UnsortedList() { + err := conntrack.ClearEntriesForPort(proxier.exec, nodePort, isIPv6, v1.ProtocolUDP) if err != nil { - return nil, err + klog.ErrorS(err, "Failed to clear udp conntrack", "port", nodePort) } - conn, err := net.ListenUDP(network, addr) - if err != nil { - return nil, err - } - socket = conn - default: - return nil, fmt.Errorf("unknown protocol %q", lp.Protocol) } - klog.V(2).Infof("Opened local port %s", lp.String()) - return socket, nil + klog.V(4).InfoS("Deleting stale endpoint connections", "endpoints", endpointUpdateResult.StaleEndpoints) + proxier.deleteEndpointConnections(endpointUpdateResult.StaleEndpoints) } diff --git a/vendor/k8s.io/kubernetes/pkg/proxy/ipvs/BUILD b/vendor/k8s.io/kubernetes/pkg/proxy/ipvs/BUILD deleted file mode 100644 index f10643ece386..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/proxy/ipvs/BUILD +++ /dev/null @@ -1,109 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "graceful_termination_test.go", - "ipset_test.go", - "proxier_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/proxy:go_default_library", - "//pkg/proxy/healthcheck:go_default_library", - "//pkg/proxy/ipvs/testing:go_default_library", - "//pkg/proxy/util:go_default_library", - "//pkg/proxy/util/iptables:go_default_library", - "//pkg/proxy/util/testing:go_default_library", - "//pkg/util/async:go_default_library", - "//pkg/util/ipset:go_default_library", - "//pkg/util/ipset/testing:go_default_library", - "//pkg/util/iptables:go_default_library", - "//pkg/util/iptables/testing:go_default_library", - "//pkg/util/ipvs:go_default_library", - "//pkg/util/ipvs/testing:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/discovery/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - "//vendor/k8s.io/utils/exec/testing:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "graceful_termination.go", - "ipset.go", - "netlink.go", - "netlink_linux.go", - "netlink_unsupported.go", - "proxier.go", - "safe_ipset.go", - ], - importpath = "k8s.io/kubernetes/pkg/proxy/ipvs", - deps = [ - "//pkg/features:go_default_library", - "//pkg/proxy:go_default_library", - "//pkg/proxy/healthcheck:go_default_library", - "//pkg/proxy/metaproxier:go_default_library", - "//pkg/proxy/metrics:go_default_library", - "//pkg/proxy/util:go_default_library", - "//pkg/proxy/util/iptables:go_default_library", - "//pkg/util/async:go_default_library", - "//pkg/util/conntrack:go_default_library", - "//pkg/util/ipset:go_default_library", - "//pkg/util/iptables:go_default_library", - "//pkg/util/ipvs:go_default_library", - "//pkg/util/sysctl:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/discovery/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/version:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "//vendor/github.com/vishvananda/netlink:go_default_library", - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//vendor/github.com/vishvananda/netlink:go_default_library", - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/proxy/ipvs/testing:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/proxy/ipvs/ipset.go b/vendor/k8s.io/kubernetes/pkg/proxy/ipvs/ipset.go index 4ed9790cc7c4..02eb60d80748 100644 --- a/vendor/k8s.io/kubernetes/pkg/proxy/ipvs/ipset.go +++ b/vendor/k8s.io/kubernetes/pkg/proxy/ipvs/ipset.go @@ -75,6 +75,9 @@ const ( kubeNodePortLocalSetSCTPComment = "Kubernetes nodeport SCTP port with externalTrafficPolicy=local with type 'hash ip:port'" kubeNodePortLocalSetSCTP = "KUBE-NODE-PORT-LOCAL-SCTP-HASH" + + kubeHealthCheckNodePortSetComment = "Kubernetes health check node port" + kubeHealthCheckNodePortSet = "KUBE-HEALTH-CHECK-NODE-PORT" ) // IPSetVersioner can query the current ipset version. diff --git a/vendor/k8s.io/kubernetes/pkg/proxy/ipvs/netlink_linux.go b/vendor/k8s.io/kubernetes/pkg/proxy/ipvs/netlink_linux.go index cb27c620807d..156c1f0733c2 100644 --- a/vendor/k8s.io/kubernetes/pkg/proxy/ipvs/netlink_linux.go +++ b/vendor/k8s.io/kubernetes/pkg/proxy/ipvs/netlink_linux.go @@ -150,7 +150,7 @@ func (h *netlinkHandle) GetLocalAddresses(dev, filterDev string) (sets.String, e if dev != "" { link, err := h.LinkByName(dev) if err != nil { - return nil, fmt.Errorf("error get device %s, err: %v", filterDev, err) + return nil, fmt.Errorf("error get device %s, err: %v", dev, err) } chosenLinkIndex = link.Attrs().Index } else if filterDev != "" { diff --git a/vendor/k8s.io/kubernetes/pkg/proxy/ipvs/proxier.go b/vendor/k8s.io/kubernetes/pkg/proxy/ipvs/proxier.go index 7d67008332c3..4961381c8ae2 100644 --- a/vendor/k8s.io/kubernetes/pkg/proxy/ipvs/proxier.go +++ b/vendor/k8s.io/kubernetes/pkg/proxy/ipvs/proxier.go @@ -18,6 +18,7 @@ package ipvs import ( "bytes" + "errors" "fmt" "io" "io/ioutil" @@ -105,6 +106,7 @@ var iptablesJumpChain = []struct { {utiliptables.TableNAT, utiliptables.ChainPrerouting, kubeServicesChain, "kubernetes service portals"}, {utiliptables.TableNAT, utiliptables.ChainPostrouting, kubePostroutingChain, "kubernetes postrouting rules"}, {utiliptables.TableFilter, utiliptables.ChainForward, KubeForwardChain, "kubernetes forwarding rules"}, + {utiliptables.TableFilter, utiliptables.ChainInput, KubeNodePortChain, "kubernetes health check rules"}, } var iptablesChains = []struct { @@ -118,6 +120,7 @@ var iptablesChains = []struct { {utiliptables.TableNAT, KubeLoadBalancerChain}, {utiliptables.TableNAT, KubeMarkMasqChain}, {utiliptables.TableFilter, KubeForwardChain}, + {utiliptables.TableFilter, KubeNodePortChain}, } var iptablesEnsureChains = []struct { @@ -160,6 +163,7 @@ var ipsetInfo = []struct { {kubeNodePortLocalSetUDP, utilipset.BitmapPort, kubeNodePortLocalSetUDPComment}, {kubeNodePortSetSCTP, utilipset.HashIPPort, kubeNodePortSetSCTPComment}, {kubeNodePortLocalSetSCTP, utilipset.HashIPPort, kubeNodePortLocalSetSCTPComment}, + {kubeHealthCheckNodePortSet, utilipset.BitmapPort, kubeHealthCheckNodePortSetComment}, } // ipsetWithIptablesChain is the ipsets list with iptables source chain and the chain jump to @@ -180,24 +184,25 @@ var ipsetWithIptablesChain = []struct { {kubeLoadBalancerSourceCIDRSet, string(KubeFireWallChain), "RETURN", "dst,dst,src", ""}, {kubeLoadBalancerSourceIPSet, string(KubeFireWallChain), "RETURN", "dst,dst,src", ""}, {kubeLoadBalancerLocalSet, string(KubeLoadBalancerChain), "RETURN", "dst,dst", ""}, - {kubeNodePortLocalSetTCP, string(KubeNodePortChain), "RETURN", "dst", "tcp"}, - {kubeNodePortSetTCP, string(KubeNodePortChain), string(KubeMarkMasqChain), "dst", "tcp"}, - {kubeNodePortLocalSetUDP, string(KubeNodePortChain), "RETURN", "dst", "udp"}, - {kubeNodePortSetUDP, string(KubeNodePortChain), string(KubeMarkMasqChain), "dst", "udp"}, - {kubeNodePortSetSCTP, string(KubeNodePortChain), string(KubeMarkMasqChain), "dst,dst", "sctp"}, - {kubeNodePortLocalSetSCTP, string(KubeNodePortChain), "RETURN", "dst,dst", "sctp"}, + {kubeNodePortLocalSetTCP, string(KubeNodePortChain), "RETURN", "dst", utilipset.ProtocolTCP}, + {kubeNodePortSetTCP, string(KubeNodePortChain), string(KubeMarkMasqChain), "dst", utilipset.ProtocolTCP}, + {kubeNodePortLocalSetUDP, string(KubeNodePortChain), "RETURN", "dst", utilipset.ProtocolUDP}, + {kubeNodePortSetUDP, string(KubeNodePortChain), string(KubeMarkMasqChain), "dst", utilipset.ProtocolUDP}, + {kubeNodePortSetSCTP, string(KubeNodePortChain), string(KubeMarkMasqChain), "dst,dst", utilipset.ProtocolSCTP}, + {kubeNodePortLocalSetSCTP, string(KubeNodePortChain), "RETURN", "dst,dst", utilipset.ProtocolSCTP}, } // In IPVS proxy mode, the following flags need to be set -const sysctlRouteLocalnet = "net/ipv4/conf/all/route_localnet" -const sysctlBridgeCallIPTables = "net/bridge/bridge-nf-call-iptables" -const sysctlVSConnTrack = "net/ipv4/vs/conntrack" -const sysctlConnReuse = "net/ipv4/vs/conn_reuse_mode" -const sysctlExpireNoDestConn = "net/ipv4/vs/expire_nodest_conn" -const sysctlExpireQuiescentTemplate = "net/ipv4/vs/expire_quiescent_template" -const sysctlForward = "net/ipv4/ip_forward" -const sysctlArpIgnore = "net/ipv4/conf/all/arp_ignore" -const sysctlArpAnnounce = "net/ipv4/conf/all/arp_announce" +const ( + sysctlBridgeCallIPTables = "net/bridge/bridge-nf-call-iptables" + sysctlVSConnTrack = "net/ipv4/vs/conntrack" + sysctlConnReuse = "net/ipv4/vs/conn_reuse_mode" + sysctlExpireNoDestConn = "net/ipv4/vs/expire_nodest_conn" + sysctlExpireQuiescentTemplate = "net/ipv4/vs/expire_quiescent_template" + sysctlForward = "net/ipv4/ip_forward" + sysctlArpIgnore = "net/ipv4/conf/all/arp_ignore" + sysctlArpAnnounce = "net/ipv4/conf/all/arp_announce" +) // Proxier is an ipvs based proxy for connections between a localhost:lport // and services that provide the actual backends. @@ -214,7 +219,7 @@ type Proxier struct { mu sync.Mutex // protects the following fields serviceMap proxy.ServiceMap endpointsMap proxy.EndpointsMap - portsMap map[utilproxy.LocalPort]utilproxy.Closeable + portsMap map[utilnet.LocalPort]utilnet.Closeable nodeLabels map[string]string // endpointsSynced, endpointSlicesSynced, and servicesSynced are set to true when // corresponding objects are synced after startup. This is used to avoid updating @@ -241,7 +246,7 @@ type Proxier struct { localDetector proxyutiliptables.LocalTrafficDetector hostname string nodeIP net.IP - portMapper utilproxy.PortOpener + portMapper utilnet.PortOpener recorder record.EventRecorder serviceHealthServer healthcheck.ServiceHealthServer @@ -360,11 +365,6 @@ func NewProxier(ipt utiliptables.Interface, nodePortAddresses []string, kernelHandler KernelHandler, ) (*Proxier, error) { - // Set the route_localnet sysctl we need for - if err := utilproxy.EnsureSysctl(sysctl, sysctlRouteLocalnet, 1); err != nil { - return nil, err - } - // Proxy needs br_netfilter and bridge-nf-call-iptables=1 when containers // are connected to a Linux bridge (but not SDN bridges). Until most // plugins handle this, log when config is missing @@ -450,14 +450,16 @@ func NewProxier(ipt utiliptables.Interface, endpointSlicesEnabled := utilfeature.DefaultFeatureGate.Enabled(features.EndpointSliceProxying) - var incorrectAddresses []string - nodePortAddresses, incorrectAddresses = utilproxy.FilterIncorrectCIDRVersion(nodePortAddresses, ipFamily) - if len(incorrectAddresses) > 0 { - klog.Warningf("NodePortAddresses of wrong family; %s", incorrectAddresses) + ipFamilyMap := utilproxy.MapCIDRsByIPFamily(nodePortAddresses) + nodePortAddresses = ipFamilyMap[ipFamily] + // Log the IPs not matching the ipFamily + if ips, ok := ipFamilyMap[utilproxy.OtherIPFamily(ipFamily)]; ok && len(ips) > 0 { + klog.Warningf("IP Family: %s, NodePortAddresses of wrong family; %s", ipFamily, strings.Join(ips, ",")) } + proxier := &Proxier{ ipFamily: ipFamily, - portsMap: make(map[utilproxy.LocalPort]utilproxy.Closeable), + portsMap: make(map[utilnet.LocalPort]utilnet.Closeable), serviceMap: make(proxy.ServiceMap), serviceChanges: proxy.NewServiceChangeTracker(newServiceInfo, ipFamily, recorder, nil), endpointsMap: make(proxy.EndpointsMap), @@ -472,7 +474,7 @@ func NewProxier(ipt utiliptables.Interface, localDetector: localDetector, hostname: hostname, nodeIP: nodeIP, - portMapper: &listenPortOpener{}, + portMapper: &utilnet.ListenPortOpener, recorder: recorder, serviceHealthServer: serviceHealthServer, healthzServer: healthzServer, @@ -532,14 +534,14 @@ func NewDualStackProxier( safeIpset := newSafeIpset(ipset) - nodePortAddresses4, nodePortAddresses6 := utilproxy.FilterIncorrectCIDRVersion(nodePortAddresses, v1.IPv4Protocol) + ipFamilyMap := utilproxy.MapCIDRsByIPFamily(nodePortAddresses) // Create an ipv4 instance of the single-stack proxier ipv4Proxier, err := NewProxier(ipt[0], ipvs, safeIpset, sysctl, exec, syncPeriod, minSyncPeriod, filterCIDRs(false, excludeCIDRs), strictARP, tcpTimeout, tcpFinTimeout, udpTimeout, masqueradeAll, masqueradeBit, localDetectors[0], hostname, nodeIP[0], - recorder, healthzServer, scheduler, nodePortAddresses4, kernelHandler) + recorder, healthzServer, scheduler, ipFamilyMap[v1.IPv4Protocol], kernelHandler) if err != nil { return nil, fmt.Errorf("unable to create ipv4 proxier: %v", err) } @@ -548,7 +550,7 @@ func NewDualStackProxier( exec, syncPeriod, minSyncPeriod, filterCIDRs(true, excludeCIDRs), strictARP, tcpTimeout, tcpFinTimeout, udpTimeout, masqueradeAll, masqueradeBit, localDetectors[1], hostname, nodeIP[1], - nil, nil, scheduler, nodePortAddresses6, kernelHandler) + nil, nil, scheduler, ipFamilyMap[v1.IPv6Protocol], kernelHandler) if err != nil { return nil, fmt.Errorf("unable to create ipv6 proxier: %v", err) } @@ -801,13 +803,9 @@ func cleanupIptablesLeftovers(ipt utiliptables.Interface) (encounteredError bool } // CleanupLeftovers clean up all ipvs and iptables rules created by ipvs Proxier. -func CleanupLeftovers(ipvs utilipvs.Interface, ipt utiliptables.Interface, ipset utilipset.Interface, cleanupIPVS bool) (encounteredError bool) { - if cleanupIPVS { - // Return immediately when ipvs interface is nil - Probably initialization failed in somewhere. - if ipvs == nil { - return true - } - encounteredError = false +func CleanupLeftovers(ipvs utilipvs.Interface, ipt utiliptables.Interface, ipset utilipset.Interface) (encounteredError bool) { + // Clear all ipvs rules + if ipvs != nil { err := ipvs.Flush() if err != nil { klog.Errorf("Error flushing IPVS rules: %v", err) @@ -1044,20 +1042,10 @@ func (proxier *Proxier) syncProxyRules() { klog.V(4).Infof("syncProxyRules took %v", time.Since(start)) }() - localAddrs, err := utilproxy.GetLocalAddrs() - if err != nil { - klog.Errorf("Failed to get local addresses during proxy sync: %v, assuming external IPs are not local", err) - } else if len(localAddrs) == 0 { - klog.Warning("No local addresses found, assuming all external IPs are not local") - } - - localAddrSet := utilnet.IPSet{} - localAddrSet.Insert(localAddrs...) - // We assume that if this was called, we really want to sync them, // even if nothing changed in the meantime. In other words, callers are // responsible for detecting no-op changes and not calling this function. - serviceUpdateResult := proxy.UpdateServiceMap(proxier.serviceMap, proxier.serviceChanges) + serviceUpdateResult := proxier.serviceMap.Update(proxier.serviceChanges) endpointUpdateResult := proxier.endpointsMap.Update(proxier.endpointsChanges) staleServices := serviceUpdateResult.UDPStaleClusterIP @@ -1084,13 +1072,13 @@ func (proxier *Proxier) syncProxyRules() { proxier.filterRules.Reset() // Write table headers. - writeLine(proxier.filterChains, "*filter") - writeLine(proxier.natChains, "*nat") + utilproxy.WriteLine(proxier.filterChains, "*filter") + utilproxy.WriteLine(proxier.natChains, "*nat") - proxier.createAndLinkeKubeChain() + proxier.createAndLinkKubeChain() // make sure dummy interface exists in the system where ipvs Proxier will bind service address on it - _, err = proxier.netlinkHandle.EnsureDummyDevice(DefaultDummyDevice) + _, err := proxier.netlinkHandle.EnsureDummyDevice(DefaultDummyDevice) if err != nil { klog.Errorf("Failed to create dummy interface: %s, error: %v", DefaultDummyDevice, err) return @@ -1105,7 +1093,7 @@ func (proxier *Proxier) syncProxyRules() { } // Accumulate the set of local ports that we will be holding open once this update is complete - replacementPortsMap := map[utilproxy.LocalPort]utilproxy.Closeable{} + replacementPortsMap := map[utilnet.LocalPort]utilnet.Closeable{} // activeIPVSServices represents IPVS service successfully created in this round of sync activeIPVSServices := map[string]bool{} // currentIPVSServices represent IPVS services listed from the system @@ -1166,6 +1154,8 @@ func (proxier *Proxier) syncProxyRules() { // reset slice to filtered entries nodeIPs = nodeIPs[:idx] + localAddrSet := utilproxy.GetLocalAddrSet() + // Build IPVS rules for each service. for svcName, svc := range proxier.serviceMap { svcInfo, ok := svc.(*serviceInfo) @@ -1174,6 +1164,10 @@ func (proxier *Proxier) syncProxyRules() { continue } isIPv6 := utilnet.IsIPv6(svcInfo.ClusterIP()) + localPortIPFamily := utilnet.IPv4 + if isIPv6 { + localPortIPFamily = utilnet.IPv6 + } protocol := strings.ToLower(string(svcInfo.Protocol())) // Precompute svcNameString; with many services the many calls // to ServicePortName.String() show up in CPU profiles. @@ -1242,7 +1236,7 @@ func (proxier *Proxier) syncProxyRules() { activeBindAddrs[serv.Address.String()] = true // ExternalTrafficPolicy only works for NodePort and external LB traffic, does not affect ClusterIP // So we still need clusterIP rules in onlyNodeLocalEndpoints mode. - if err := proxier.syncEndpoint(svcName, false, serv); err != nil { + if err := proxier.syncEndpoint(svcName, false, svcInfo.NodeLocalInternal(), serv); err != nil { klog.Errorf("Failed to sync endpoint for service: %v, err: %v", serv, err) } } else { @@ -1256,17 +1250,18 @@ func (proxier *Proxier) syncProxyRules() { // (because the socket might open but it would never work). if (svcInfo.Protocol() != v1.ProtocolSCTP) && localAddrSet.Has(net.ParseIP(externalIP)) { // We do not start listening on SCTP ports, according to our agreement in the SCTP support KEP - lp := utilproxy.LocalPort{ + lp := utilnet.LocalPort{ Description: "externalIP for " + svcNameString, IP: externalIP, + IPFamily: localPortIPFamily, Port: svcInfo.Port(), - Protocol: protocol, + Protocol: utilnet.Protocol(svcInfo.Protocol()), } if proxier.portsMap[lp] != nil { klog.V(4).Infof("Port %s was open before and is still needed", lp.String()) replacementPortsMap[lp] = proxier.portsMap[lp] } else { - socket, err := proxier.portMapper.OpenLocalPort(&lp, isIPv6) + socket, err := proxier.portMapper.OpenLocalPort(&lp) if err != nil { msg := fmt.Sprintf("can't open %s, skipping this externalIP: %v", lp.String(), err) @@ -1280,6 +1275,7 @@ func (proxier *Proxier) syncProxyRules() { klog.Error(msg) continue } + klog.V(2).Infof("Opened local port %s", lp.String()) replacementPortsMap[lp] = socket } } // We're holding the port, so it's OK to install IPVS rules. @@ -1292,7 +1288,7 @@ func (proxier *Proxier) syncProxyRules() { SetType: utilipset.HashIPPort, } - if svcInfo.OnlyNodeLocalEndpoints() { + if svcInfo.NodeLocalExternal() { if valid := proxier.ipsetList[kubeExternalIPLocalSet].validateEntry(entry); !valid { klog.Errorf("%s", fmt.Sprintf(EntryInvalidErr, entry, proxier.ipsetList[kubeExternalIPLocalSet].Name)) continue @@ -1322,8 +1318,9 @@ func (proxier *Proxier) syncProxyRules() { activeIPVSServices[serv.String()] = true activeBindAddrs[serv.Address.String()] = true - onlyNodeLocalEndpoints := svcInfo.OnlyNodeLocalEndpoints() - if err := proxier.syncEndpoint(svcName, onlyNodeLocalEndpoints, serv); err != nil { + onlyNodeLocalEndpoints := svcInfo.NodeLocalExternal() + onlyNodeLocalEndpointsForInternal := svcInfo.NodeLocalInternal() + if err := proxier.syncEndpoint(svcName, onlyNodeLocalEndpoints, onlyNodeLocalEndpointsForInternal, serv); err != nil { klog.Errorf("Failed to sync endpoint for service: %v, err: %v", serv, err) } } else { @@ -1351,7 +1348,7 @@ func (proxier *Proxier) syncProxyRules() { } proxier.ipsetList[kubeLoadBalancerSet].activeEntries.Insert(entry.String()) // insert loadbalancer entry to lbIngressLocalSet if service externaltrafficpolicy=local - if svcInfo.OnlyNodeLocalEndpoints() { + if svcInfo.NodeLocalExternal() { if valid := proxier.ipsetList[kubeLoadBalancerLocalSet].validateEntry(entry); !valid { klog.Errorf("%s", fmt.Sprintf(EntryInvalidErr, entry, proxier.ipsetList[kubeLoadBalancerLocalSet].Name)) continue @@ -1424,7 +1421,7 @@ func (proxier *Proxier) syncProxyRules() { if err := proxier.syncService(svcNameString, serv, true, bindedAddresses); err == nil { activeIPVSServices[serv.String()] = true activeBindAddrs[serv.Address.String()] = true - if err := proxier.syncEndpoint(svcName, svcInfo.OnlyNodeLocalEndpoints(), serv); err != nil { + if err := proxier.syncEndpoint(svcName, svcInfo.NodeLocalExternal(), svcInfo.NodeLocalInternal(), serv); err != nil { klog.Errorf("Failed to sync endpoint for service: %v, err: %v", serv, err) } } else { @@ -1440,13 +1437,14 @@ func (proxier *Proxier) syncProxyRules() { continue } - var lps []utilproxy.LocalPort + var lps []utilnet.LocalPort for _, address := range nodeAddresses { - lp := utilproxy.LocalPort{ + lp := utilnet.LocalPort{ Description: "nodePort for " + svcNameString, IP: address, + IPFamily: localPortIPFamily, Port: svcInfo.NodePort(), - Protocol: protocol, + Protocol: utilnet.Protocol(svcInfo.Protocol()), } if utilproxy.IsZeroCIDR(address) { // Empty IP address means all @@ -1466,12 +1464,14 @@ func (proxier *Proxier) syncProxyRules() { // We do not start listening on SCTP ports, according to our agreement in the // SCTP support KEP } else if svcInfo.Protocol() != v1.ProtocolSCTP { - socket, err := proxier.portMapper.OpenLocalPort(&lp, isIPv6) + socket, err := proxier.portMapper.OpenLocalPort(&lp) if err != nil { klog.Errorf("can't open %s, skipping this nodePort: %v", lp.String(), err) continue } - if lp.Protocol == "udp" { + klog.V(2).Infof("Opened local port %s", lp.String()) + + if lp.Protocol == utilnet.UDP { conntrack.ClearEntriesForPort(proxier.exec, lp.Port, isIPv6, v1.ProtocolUDP) } replacementPortsMap[lp] = socket @@ -1487,7 +1487,7 @@ func (proxier *Proxier) syncProxyRules() { ) switch protocol { - case "tcp": + case utilipset.ProtocolTCP: nodePortSet = proxier.ipsetList[kubeNodePortSetTCP] entries = []*utilipset.Entry{{ // No need to provide ip info @@ -1495,7 +1495,7 @@ func (proxier *Proxier) syncProxyRules() { Protocol: protocol, SetType: utilipset.BitmapPort, }} - case "udp": + case utilipset.ProtocolUDP: nodePortSet = proxier.ipsetList[kubeNodePortSetUDP] entries = []*utilipset.Entry{{ // No need to provide ip info @@ -1503,7 +1503,7 @@ func (proxier *Proxier) syncProxyRules() { Protocol: protocol, SetType: utilipset.BitmapPort, }} - case "sctp": + case utilipset.ProtocolSCTP: nodePortSet = proxier.ipsetList[kubeNodePortSetSCTP] // Since hash ip:port is used for SCTP, all the nodeIPs to be used in the SCTP ipset entries. entries = []*utilipset.Entry{} @@ -1535,14 +1535,14 @@ func (proxier *Proxier) syncProxyRules() { } // Add externaltrafficpolicy=local type nodeport entry - if svcInfo.OnlyNodeLocalEndpoints() { + if svcInfo.NodeLocalExternal() { var nodePortLocalSet *IPSet switch protocol { - case "tcp": + case utilipset.ProtocolTCP: nodePortLocalSet = proxier.ipsetList[kubeNodePortLocalSetTCP] - case "udp": + case utilipset.ProtocolUDP: nodePortLocalSet = proxier.ipsetList[kubeNodePortLocalSetUDP] - case "sctp": + case utilipset.ProtocolSCTP: nodePortLocalSet = proxier.ipsetList[kubeNodePortLocalSetSCTP] default: // It should never hit @@ -1580,7 +1580,7 @@ func (proxier *Proxier) syncProxyRules() { // There is no need to bind Node IP to dummy interface, so set parameter `bindAddr` to `false`. if err := proxier.syncService(svcNameString, serv, false, bindedAddresses); err == nil { activeIPVSServices[serv.String()] = true - if err := proxier.syncEndpoint(svcName, svcInfo.OnlyNodeLocalEndpoints(), serv); err != nil { + if err := proxier.syncEndpoint(svcName, svcInfo.NodeLocalExternal(), svcInfo.NodeLocalInternal(), serv); err != nil { klog.Errorf("Failed to sync endpoint for service: %v, err: %v", serv, err) } } else { @@ -1588,6 +1588,22 @@ func (proxier *Proxier) syncProxyRules() { } } } + + if svcInfo.HealthCheckNodePort() != 0 { + nodePortSet := proxier.ipsetList[kubeHealthCheckNodePortSet] + entry := &utilipset.Entry{ + // No need to provide ip info + Port: svcInfo.HealthCheckNodePort(), + Protocol: "tcp", + SetType: utilipset.BitmapPort, + } + + if valid := nodePortSet.validateEntry(entry); !valid { + klog.Errorf("%s", fmt.Sprintf(EntryInvalidErr, entry, nodePortSet.Name)) + continue + } + nodePortSet.activeEntries.Insert(entry.String()) + } } // sync ipset entries @@ -1703,7 +1719,7 @@ func (proxier *Proxier) writeIptablesRules() { "-m", "set", "--match-set", proxier.ipsetList[set.name].Name, set.matchType, ) - writeLine(proxier.natRules, append(args, "-j", set.to)...) + utilproxy.WriteLine(proxier.natRules, append(args, "-j", set.to)...) } } @@ -1714,14 +1730,14 @@ func (proxier *Proxier) writeIptablesRules() { "-m", "set", "--match-set", proxier.ipsetList[kubeClusterIPSet].Name, ) if proxier.masqueradeAll { - writeLine(proxier.natRules, append(args, "dst,dst", "-j", string(KubeMarkMasqChain))...) + utilproxy.WriteLine(proxier.natRules, append(args, "dst,dst", "-j", string(KubeMarkMasqChain))...) } else if proxier.localDetector.IsImplemented() { // This masquerades off-cluster traffic to a service VIP. The idea // is that you can establish a static route for your Service range, // routing to any node, and that node will bridge into the Service // for you. Since that might bounce off-node, we masquerade here. // If/when we support "Local" policy for VIPs, we should update this. - writeLine(proxier.natRules, proxier.localDetector.JumpIfNotLocal(append(args, "dst,dst"), string(KubeMarkMasqChain))...) + utilproxy.WriteLine(proxier.natRules, proxier.localDetector.JumpIfNotLocal(append(args, "dst,dst"), string(KubeMarkMasqChain))...) } else { // Masquerade all OUTPUT traffic coming from a service ip. // The kube dummy interface has all service VIPs assigned which @@ -1730,7 +1746,7 @@ func (proxier *Proxier) writeIptablesRules() { // VIP:. // Always masquerading OUTPUT (node-originating) traffic with a VIP // source ip and service port destination fixes the outgoing connections. - writeLine(proxier.natRules, append(args, "src,dst", "-j", string(KubeMarkMasqChain))...) + utilproxy.WriteLine(proxier.natRules, append(args, "src,dst", "-j", string(KubeMarkMasqChain))...) } } @@ -1743,11 +1759,11 @@ func (proxier *Proxier) writeIptablesRules() { externalTrafficOnlyArgs := append(args, "-m", "physdev", "!", "--physdev-is-in", "-m", "addrtype", "!", "--src-type", "LOCAL") - writeLine(proxier.natRules, append(externalTrafficOnlyArgs, "-j", "ACCEPT")...) + utilproxy.WriteLine(proxier.natRules, append(externalTrafficOnlyArgs, "-j", "ACCEPT")...) dstLocalOnlyArgs := append(args, "-m", "addrtype", "--dst-type", "LOCAL") // Allow traffic bound for external IPs that happen to be recognized as local IPs to stay local. // This covers cases like GCE load-balancers which get added to the local routing table. - writeLine(proxier.natRules, append(dstLocalOnlyArgs, "-j", "ACCEPT")...) + utilproxy.WriteLine(proxier.natRules, append(dstLocalOnlyArgs, "-j", "ACCEPT")...) } if !proxier.ipsetList[kubeExternalIPSet].isEmpty() { @@ -1758,7 +1774,7 @@ func (proxier *Proxier) writeIptablesRules() { "-m", "set", "--match-set", proxier.ipsetList[kubeExternalIPSet].Name, "dst,dst", ) - writeLine(proxier.natRules, append(args, "-j", string(KubeMarkMasqChain))...) + utilproxy.WriteLine(proxier.natRules, append(args, "-j", string(KubeMarkMasqChain))...) externalIPRules(args) } @@ -1777,16 +1793,16 @@ func (proxier *Proxier) writeIptablesRules() { "-A", string(kubeServicesChain), "-m", "addrtype", "--dst-type", "LOCAL", ) - writeLine(proxier.natRules, append(args, "-j", string(KubeNodePortChain))...) + utilproxy.WriteLine(proxier.natRules, append(args, "-j", string(KubeNodePortChain))...) // mark drop for KUBE-LOAD-BALANCER - writeLine(proxier.natRules, []string{ + utilproxy.WriteLine(proxier.natRules, []string{ "-A", string(KubeLoadBalancerChain), "-j", string(KubeMarkMasqChain), }...) // mark drop for KUBE-FIRE-WALL - writeLine(proxier.natRules, []string{ + utilproxy.WriteLine(proxier.natRules, []string{ "-A", string(KubeFireWallChain), "-j", string(KubeMarkDropChain), }...) @@ -1799,7 +1815,7 @@ func (proxier *Proxier) writeIptablesRules() { // If the masqueradeMark has been added then we want to forward that same // traffic, this allows NodePort traffic to be forwarded even if the default // FORWARD policy is not accept. - writeLine(proxier.filterRules, + utilproxy.WriteLine(proxier.filterRules, "-A", string(KubeForwardChain), "-m", "comment", "--comment", `"kubernetes forwarding rules"`, "-m", "mark", "--mark", fmt.Sprintf("%s/%s", proxier.masqueradeMark, proxier.masqueradeMark), @@ -1809,14 +1825,14 @@ func (proxier *Proxier) writeIptablesRules() { // The following two rules ensure the traffic after the initial packet // accepted by the "kubernetes forwarding rules" rule above will be // accepted. - writeLine(proxier.filterRules, + utilproxy.WriteLine(proxier.filterRules, "-A", string(KubeForwardChain), "-m", "comment", "--comment", `"kubernetes forwarding conntrack pod source rule"`, "-m", "conntrack", "--ctstate", "RELATED,ESTABLISHED", "-j", "ACCEPT", ) - writeLine(proxier.filterRules, + utilproxy.WriteLine(proxier.filterRules, "-A", string(KubeForwardChain), "-m", "comment", "--comment", `"kubernetes forwarding conntrack pod destination rule"`, "-m", "conntrack", @@ -1824,17 +1840,25 @@ func (proxier *Proxier) writeIptablesRules() { "-j", "ACCEPT", ) + // Add rule to accept traffic towards health check node port + utilproxy.WriteLine(proxier.filterRules, + "-A", string(KubeNodePortChain), + "-m", "comment", "--comment", proxier.ipsetList[kubeHealthCheckNodePortSet].getComment(), + "-m", "set", "--match-set", proxier.ipsetList[kubeHealthCheckNodePortSet].Name, "dst", + "-j", "ACCEPT", + ) + // Install the kubernetes-specific postrouting rules. We use a whole chain for // this so that it is easier to flush and change, for example if the mark // value should ever change. // NB: THIS MUST MATCH the corresponding code in the kubelet - writeLine(proxier.natRules, []string{ + utilproxy.WriteLine(proxier.natRules, []string{ "-A", string(kubePostroutingChain), "-m", "mark", "!", "--mark", fmt.Sprintf("%s/%s", proxier.masqueradeMark, proxier.masqueradeMark), "-j", "RETURN", }...) // Clear the mark to avoid re-masquerading if the packet re-traverses the network stack. - writeLine(proxier.natRules, []string{ + utilproxy.WriteLine(proxier.natRules, []string{ "-A", string(kubePostroutingChain), // XOR proxier.masqueradeMark to unset it "-j", "MARK", "--xor-mark", proxier.masqueradeMark, @@ -1847,19 +1871,19 @@ func (proxier *Proxier) writeIptablesRules() { if proxier.iptables.HasRandomFully() { masqRule = append(masqRule, "--random-fully") } - writeLine(proxier.natRules, masqRule...) + utilproxy.WriteLine(proxier.natRules, masqRule...) // Install the kubernetes-specific masquerade mark rule. We use a whole chain for // this so that it is easier to flush and change, for example if the mark // value should ever change. - writeLine(proxier.natRules, []string{ + utilproxy.WriteLine(proxier.natRules, []string{ "-A", string(KubeMarkMasqChain), "-j", "MARK", "--or-mark", proxier.masqueradeMark, }...) // Write the end-of-table markers. - writeLine(proxier.filterRules, "COMMIT") - writeLine(proxier.natRules, "COMMIT") + utilproxy.WriteLine(proxier.filterRules, "COMMIT") + utilproxy.WriteLine(proxier.natRules, "COMMIT") } func (proxier *Proxier) acceptIPVSTraffic() { @@ -1873,7 +1897,7 @@ func (proxier *Proxier) acceptIPVSTraffic() { default: matchType = "dst,dst" } - writeLine(proxier.natRules, []string{ + utilproxy.WriteLine(proxier.natRules, []string{ "-A", string(kubeServicesChain), "-m", "set", "--match-set", proxier.ipsetList[set].Name, matchType, "-j", "ACCEPT", @@ -1882,8 +1906,8 @@ func (proxier *Proxier) acceptIPVSTraffic() { } } -// createAndLinkeKubeChain create all kube chains that ipvs proxier need and write basic link. -func (proxier *Proxier) createAndLinkeKubeChain() { +// createAndLinkKubeChain create all kube chains that ipvs proxier need and write basic link. +func (proxier *Proxier) createAndLinkKubeChain() { existingFilterChains := proxier.getExistingChains(proxier.filterChainsData, utiliptables.TableFilter) existingNATChains := proxier.getExistingChains(proxier.iptablesData, utiliptables.TableNAT) @@ -1903,15 +1927,15 @@ func (proxier *Proxier) createAndLinkeKubeChain() { } if ch.table == utiliptables.TableNAT { if chain, ok := existingNATChains[ch.chain]; ok { - writeBytesLine(proxier.natChains, chain) + utilproxy.WriteBytesLine(proxier.natChains, chain) } else { - writeLine(proxier.natChains, utiliptables.MakeChainLine(kubePostroutingChain)) + utilproxy.WriteLine(proxier.natChains, utiliptables.MakeChainLine(ch.chain)) } } else { - if chain, ok := existingFilterChains[KubeForwardChain]; ok { - writeBytesLine(proxier.filterChains, chain) + if chain, ok := existingFilterChains[ch.chain]; ok { + utilproxy.WriteBytesLine(proxier.filterChains, chain) } else { - writeLine(proxier.filterChains, utiliptables.MakeChainLine(KubeForwardChain)) + utilproxy.WriteLine(proxier.filterChains, utiliptables.MakeChainLine(ch.chain)) } } } @@ -2007,12 +2031,15 @@ func (proxier *Proxier) syncService(svcName string, vs *utilipvs.VirtualServer, return nil } -func (proxier *Proxier) syncEndpoint(svcPortName proxy.ServicePortName, onlyNodeLocalEndpoints bool, vs *utilipvs.VirtualServer) error { +func (proxier *Proxier) syncEndpoint(svcPortName proxy.ServicePortName, onlyNodeLocalEndpoints bool, onlyNodeLocalEndpointsForInternal bool, vs *utilipvs.VirtualServer) error { appliedVirtualServer, err := proxier.ipvs.GetVirtualServer(vs) - if err != nil || appliedVirtualServer == nil { + if err != nil { klog.Errorf("Failed to get IPVS service, error: %v", err) return err } + if appliedVirtualServer == nil { + return errors.New("IPVS virtual service does not exist") + } // curEndpoints represents IPVS destinations listed from current system. curEndpoints := sets.NewString() @@ -2030,19 +2057,26 @@ func (proxier *Proxier) syncEndpoint(svcPortName proxy.ServicePortName, onlyNode endpoints := proxier.endpointsMap[svcPortName] - // Service Topology will not be enabled in the following cases: - // 1. externalTrafficPolicy=Local (mutually exclusive with service topology). - // 2. ServiceTopology is not enabled. - // 3. EndpointSlice is not enabled (service topology depends on endpoint slice - // to get topology information). - if !onlyNodeLocalEndpoints && utilfeature.DefaultFeatureGate.Enabled(features.ServiceTopology) && utilfeature.DefaultFeatureGate.Enabled(features.EndpointSliceProxying) { - endpoints = proxy.FilterTopologyEndpoint(proxier.nodeLabels, proxier.serviceMap[svcPortName].TopologyKeys(), endpoints) + // Filtering for topology aware endpoints. This function will only + // filter endpoints if appropriate feature gates are enabled and the + // Service does not have conflicting configuration such as + // externalTrafficPolicy=Local. + svcInfo, ok := proxier.serviceMap[svcPortName] + if !ok { + klog.Warningf("Unable to filter endpoints due to missing Service info for %s", svcPortName) + } else { + endpoints = proxy.FilterEndpoints(endpoints, svcInfo, proxier.nodeLabels) } for _, epInfo := range endpoints { + if !epInfo.IsReady() { + continue + } + if onlyNodeLocalEndpoints && !epInfo.GetIsLocal() { continue } + newEndpoints.Insert(epInfo.String()) } @@ -2172,78 +2206,6 @@ func (proxier *Proxier) getLegacyBindAddr(activeBindAddrs map[string]bool, curre return legacyAddrs } -// Join all words with spaces, terminate with newline and write to buff. -func writeLine(buf *bytes.Buffer, words ...string) { - // We avoid strings.Join for performance reasons. - for i := range words { - buf.WriteString(words[i]) - if i < len(words)-1 { - buf.WriteByte(' ') - } else { - buf.WriteByte('\n') - } - } -} - -func writeBytesLine(buf *bytes.Buffer, bytes []byte) { - buf.Write(bytes) - buf.WriteByte('\n') -} - -// listenPortOpener opens ports by calling bind() and listen(). -type listenPortOpener struct{} - -// OpenLocalPort holds the given local port open. -func (l *listenPortOpener) OpenLocalPort(lp *utilproxy.LocalPort, isIPv6 bool) (utilproxy.Closeable, error) { - return openLocalPort(lp, isIPv6) -} - -func openLocalPort(lp *utilproxy.LocalPort, isIPv6 bool) (utilproxy.Closeable, error) { - // For ports on node IPs, open the actual port and hold it, even though we - // use ipvs to redirect traffic. - // This ensures a) that it's safe to use that port and b) that (a) stays - // true. The risk is that some process on the node (e.g. sshd or kubelet) - // is using a port and we give that same port out to a Service. That would - // be bad because ipvs would silently claim the traffic but the process - // would never know. - // NOTE: We should not need to have a real listen()ing socket - bind() - // should be enough, but I can't figure out a way to e2e test without - // it. Tools like 'ss' and 'netstat' do not show sockets that are - // bind()ed but not listen()ed, and at least the default debian netcat - // has no way to avoid about 10 seconds of retries. - var socket utilproxy.Closeable - switch lp.Protocol { - case "tcp": - network := "tcp4" - if isIPv6 { - network = "tcp6" - } - listener, err := net.Listen(network, net.JoinHostPort(lp.IP, strconv.Itoa(lp.Port))) - if err != nil { - return nil, err - } - socket = listener - case "udp": - network := "udp4" - if isIPv6 { - network = "udp6" - } - addr, err := net.ResolveUDPAddr(network, net.JoinHostPort(lp.IP, strconv.Itoa(lp.Port))) - if err != nil { - return nil, err - } - conn, err := net.ListenUDP(network, addr) - if err != nil { - return nil, err - } - socket = conn - default: - return nil, fmt.Errorf("unknown protocol %q", lp.Protocol) - } - klog.V(2).Infof("Opened local port %s", lp.String()) - return socket, nil -} - // ipvs Proxier fall back on iptables when it needs to do SNAT for engress packets // It will only operate iptables *nat table. // Create and link the kube postrouting chain for SNAT packets. diff --git a/vendor/k8s.io/kubernetes/pkg/proxy/metaproxier/BUILD b/vendor/k8s.io/kubernetes/pkg/proxy/metaproxier/BUILD deleted file mode 100644 index 07ec2c8a99ac..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/proxy/metaproxier/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["meta_proxier.go"], - importpath = "k8s.io/kubernetes/pkg/proxy/metaproxier", - deps = [ - "//pkg/proxy:go_default_library", - "//pkg/proxy/config:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/discovery/v1beta1:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["meta_proxier_test.go"], - embed = [":go_default_library"], - deps = ["//staging/src/k8s.io/api/core/v1:go_default_library"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/proxy/metrics/BUILD b/vendor/k8s.io/kubernetes/pkg/proxy/metrics/BUILD deleted file mode 100644 index 712222f5d19f..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/proxy/metrics/BUILD +++ /dev/null @@ -1,26 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["metrics.go"], - importpath = "k8s.io/kubernetes/pkg/proxy/metrics", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/proxy/metrics/metrics.go b/vendor/k8s.io/kubernetes/pkg/proxy/metrics/metrics.go index e917704c7c5e..9c1aeca55ba9 100644 --- a/vendor/k8s.io/kubernetes/pkg/proxy/metrics/metrics.go +++ b/vendor/k8s.io/kubernetes/pkg/proxy/metrics/metrics.go @@ -126,6 +126,17 @@ var ( }, ) + // IptablesRulesTotal is the number of iptables rules that the iptables proxy installs. + IptablesRulesTotal = metrics.NewGaugeVec( + &metrics.GaugeOpts{ + Subsystem: kubeProxySubsystem, + Name: "sync_proxy_rules_iptables_total", + Help: "Number of proxy iptables rules programmed", + StabilityLevel: metrics.ALPHA, + }, + []string{"table"}, + ) + // SyncProxyRulesLastQueuedTimestamp is the last time a proxy sync was // requested. If this is much larger than // kubeproxy_sync_proxy_rules_last_timestamp_seconds, then something is hung. @@ -151,6 +162,7 @@ func RegisterMetrics() { legacyregistry.MustRegister(EndpointChangesTotal) legacyregistry.MustRegister(ServiceChangesPending) legacyregistry.MustRegister(ServiceChangesTotal) + legacyregistry.MustRegister(IptablesRulesTotal) legacyregistry.MustRegister(IptablesRestoreFailuresTotal) legacyregistry.MustRegister(SyncProxyRulesLastQueuedTimestamp) }) diff --git a/vendor/k8s.io/kubernetes/pkg/proxy/service.go b/vendor/k8s.io/kubernetes/pkg/proxy/service.go index a00b2ddab1c4..d56e0aed81a0 100644 --- a/vendor/k8s.io/kubernetes/pkg/proxy/service.go +++ b/vendor/k8s.io/kubernetes/pkg/proxy/service.go @@ -28,8 +28,10 @@ import ( v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/sets" + utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/client-go/tools/record" apiservice "k8s.io/kubernetes/pkg/api/v1/service" + "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/pkg/proxy/metrics" utilproxy "k8s.io/kubernetes/pkg/proxy/util" ) @@ -49,8 +51,11 @@ type BaseServiceInfo struct { externalIPs []string loadBalancerSourceRanges []string healthCheckNodePort int - onlyNodeLocalEndpoints bool + nodeLocalExternal bool + nodeLocalInternal bool + internalTrafficPolicy *v1.ServiceInternalTrafficPolicyType topologyKeys []string + hintsAnnotation string } var _ ServicePort = &BaseServiceInfo{} @@ -114,9 +119,19 @@ func (info *BaseServiceInfo) LoadBalancerIPStrings() []string { return ips } -// OnlyNodeLocalEndpoints is part of ServicePort interface. -func (info *BaseServiceInfo) OnlyNodeLocalEndpoints() bool { - return info.onlyNodeLocalEndpoints +// NodeLocalExternal is part of ServicePort interface. +func (info *BaseServiceInfo) NodeLocalExternal() bool { + return info.nodeLocalExternal +} + +// NodeLocalInternal is part of ServicePort interface +func (info *BaseServiceInfo) NodeLocalInternal() bool { + return info.nodeLocalInternal +} + +// InternalTrafficPolicy is part of ServicePort interface +func (info *BaseServiceInfo) InternalTrafficPolicy() *v1.ServiceInternalTrafficPolicyType { + return info.internalTrafficPolicy } // TopologyKeys is part of ServicePort interface. @@ -124,10 +139,19 @@ func (info *BaseServiceInfo) TopologyKeys() []string { return info.topologyKeys } +// HintsAnnotation is part of ServicePort interface. +func (info *BaseServiceInfo) HintsAnnotation() string { + return info.hintsAnnotation +} + func (sct *ServiceChangeTracker) newBaseServiceInfo(port *v1.ServicePort, service *v1.Service) *BaseServiceInfo { - onlyNodeLocalEndpoints := false + nodeLocalExternal := false if apiservice.RequestsOnlyLocalTraffic(service) { - onlyNodeLocalEndpoints = true + nodeLocalExternal = true + } + nodeLocalInternal := false + if utilfeature.DefaultFeatureGate.Enabled(features.ServiceInternalTrafficPolicy) { + nodeLocalInternal = apiservice.RequestsOnlyLocalTrafficForInternal(service) } var stickyMaxAgeSeconds int if service.Spec.SessionAffinity == v1.ServiceAffinityClientIP { @@ -137,14 +161,17 @@ func (sct *ServiceChangeTracker) newBaseServiceInfo(port *v1.ServicePort, servic clusterIP := utilproxy.GetClusterIPByFamily(sct.ipFamily, service) info := &BaseServiceInfo{ - clusterIP: net.ParseIP(clusterIP), - port: int(port.Port), - protocol: port.Protocol, - nodePort: int(port.NodePort), - sessionAffinityType: service.Spec.SessionAffinity, - stickyMaxAgeSeconds: stickyMaxAgeSeconds, - onlyNodeLocalEndpoints: onlyNodeLocalEndpoints, - topologyKeys: service.Spec.TopologyKeys, + clusterIP: net.ParseIP(clusterIP), + port: int(port.Port), + protocol: port.Protocol, + nodePort: int(port.NodePort), + sessionAffinityType: service.Spec.SessionAffinity, + stickyMaxAgeSeconds: stickyMaxAgeSeconds, + nodeLocalExternal: nodeLocalExternal, + nodeLocalInternal: nodeLocalInternal, + internalTrafficPolicy: service.Spec.InternalTrafficPolicy, + topologyKeys: service.Spec.TopologyKeys, + hintsAnnotation: service.Annotations[v1.AnnotationTopologyAwareHints], } loadBalancerSourceRanges := make([]string, len(service.Spec.LoadBalancerSourceRanges)) @@ -156,15 +183,19 @@ func (sct *ServiceChangeTracker) newBaseServiceInfo(port *v1.ServicePort, servic // services, this is actually expected. Hence we downgraded from reporting by events // to just log lines with high verbosity - var incorrectIPs []string - info.externalIPs, incorrectIPs = utilproxy.FilterIncorrectIPVersion(service.Spec.ExternalIPs, sct.ipFamily) - if len(incorrectIPs) > 0 { - klog.V(4).Infof("service change tracker(%v) ignored the following external IPs(%s) for service %v/%v as they don't match IPFamily", sct.ipFamily, strings.Join(incorrectIPs, ","), service.Namespace, service.Name) + ipFamilyMap := utilproxy.MapIPsByIPFamily(service.Spec.ExternalIPs) + info.externalIPs = ipFamilyMap[sct.ipFamily] + + // Log the IPs not matching the ipFamily + if ips, ok := ipFamilyMap[utilproxy.OtherIPFamily(sct.ipFamily)]; ok && len(ips) > 0 { + klog.V(4).Infof("service change tracker(%v) ignored the following external IPs(%s) for service %v/%v as they don't match IPFamily", sct.ipFamily, strings.Join(ips, ","), service.Namespace, service.Name) } - info.loadBalancerSourceRanges, incorrectIPs = utilproxy.FilterIncorrectCIDRVersion(loadBalancerSourceRanges, sct.ipFamily) - if len(incorrectIPs) > 0 { - klog.V(4).Infof("service change tracker(%v) ignored the following load balancer source ranges(%s) for service %v/%v as they don't match IPFamily", sct.ipFamily, strings.Join(incorrectIPs, ","), service.Namespace, service.Name) + ipFamilyMap = utilproxy.MapCIDRsByIPFamily(loadBalancerSourceRanges) + info.loadBalancerSourceRanges = ipFamilyMap[sct.ipFamily] + // Log the CIDRs not matching the ipFamily + if cidrs, ok := ipFamilyMap[utilproxy.OtherIPFamily(sct.ipFamily)]; ok && len(cidrs) > 0 { + klog.V(4).Infof("service change tracker(%v) ignored the following load balancer source ranges(%s) for service %v/%v as they don't match IPFamily", sct.ipFamily, strings.Join(cidrs, ","), service.Namespace, service.Name) } // Obtain Load Balancer Ingress IPs @@ -174,14 +205,14 @@ func (sct *ServiceChangeTracker) newBaseServiceInfo(port *v1.ServicePort, servic } if len(ips) > 0 { - correctIPs, incorrectIPs := utilproxy.FilterIncorrectIPVersion(ips, sct.ipFamily) + ipFamilyMap = utilproxy.MapIPsByIPFamily(ips) - if len(incorrectIPs) > 0 { - klog.V(4).Infof("service change tracker(%v) ignored the following load balancer(%s) ingress ips for service %v/%v as they don't match IPFamily", sct.ipFamily, strings.Join(incorrectIPs, ","), service.Namespace, service.Name) + if ipList, ok := ipFamilyMap[utilproxy.OtherIPFamily(sct.ipFamily)]; ok && len(ipList) > 0 { + klog.V(4).Infof("service change tracker(%v) ignored the following load balancer(%s) ingress ips for service %v/%v as they don't match IPFamily", sct.ipFamily, strings.Join(ipList, ","), service.Namespace, service.Name) } // Create the LoadBalancerStatus with the filtered IPs - for _, ip := range correctIPs { + for _, ip := range ipFamilyMap[sct.ipFamily] { info.loadBalancerStatus.Ingress = append(info.loadBalancerStatus.Ingress, v1.LoadBalancerIngress{IP: ip}) } } @@ -288,15 +319,15 @@ type UpdateServiceMapResult struct { UDPStaleClusterIP sets.String } -// UpdateServiceMap updates ServiceMap based on the given changes. -func UpdateServiceMap(serviceMap ServiceMap, changes *ServiceChangeTracker) (result UpdateServiceMapResult) { +// Update updates ServiceMap base on the given changes. +func (sm ServiceMap) Update(changes *ServiceChangeTracker) (result UpdateServiceMapResult) { result.UDPStaleClusterIP = sets.NewString() - serviceMap.apply(changes, result.UDPStaleClusterIP) + sm.apply(changes, result.UDPStaleClusterIP) // TODO: If this will appear to be computationally expensive, consider // computing this incrementally similarly to serviceMap. result.HCServiceNodePorts = make(map[types.NamespacedName]uint16) - for svcPortName, info := range serviceMap { + for svcPortName, info := range sm { if info.HealthCheckNodePort() != 0 { result.HCServiceNodePorts[svcPortName.NamespacedName] = uint16(info.HealthCheckNodePort()) } diff --git a/vendor/k8s.io/kubernetes/pkg/proxy/topology.go b/vendor/k8s.io/kubernetes/pkg/proxy/topology.go index fda3348e4107..036571858224 100644 --- a/vendor/k8s.io/kubernetes/pkg/proxy/topology.go +++ b/vendor/k8s.io/kubernetes/pkg/proxy/topology.go @@ -18,10 +18,81 @@ package proxy import ( v1 "k8s.io/api/core/v1" + utilfeature "k8s.io/apiserver/pkg/util/feature" + "k8s.io/klog/v2" + "k8s.io/kubernetes/pkg/features" ) -// FilterTopologyEndpoint returns the appropriate endpoints based on the cluster -// topology. +// FilterEndpoints filters endpoints based on Service configuration, node +// labels, and enabled feature gates. This is primarily used to enable topology +// aware routing. +func FilterEndpoints(endpoints []Endpoint, svcInfo ServicePort, nodeLabels map[string]string) []Endpoint { + if svcInfo.NodeLocalExternal() || !utilfeature.DefaultFeatureGate.Enabled(features.EndpointSliceProxying) { + return endpoints + } + + if utilfeature.DefaultFeatureGate.Enabled(features.ServiceTopology) { + return deprecatedTopologyFilter(nodeLabels, svcInfo.TopologyKeys(), endpoints) + } + + if utilfeature.DefaultFeatureGate.Enabled(features.ServiceInternalTrafficPolicy) && svcInfo.NodeLocalInternal() { + return filterEndpointsInternalTrafficPolicy(svcInfo.InternalTrafficPolicy(), endpoints) + } + + if utilfeature.DefaultFeatureGate.Enabled(features.TopologyAwareHints) { + return filterEndpointsWithHints(endpoints, svcInfo.HintsAnnotation(), nodeLabels) + } + + return endpoints +} + +// filterEndpointsWithHints provides filtering based on the hints included in +// EndpointSlices. If any of the following are true, the full list of endpoints +// will be returned without any filtering: +// * The AnnotationTopologyAwareHints annotation is not set to "auto" for this +// Service. +// * No zone is specified in node labels. +// * No endpoints for this Service have a hint pointing to the zone this +// instance of kube-proxy is running in. +// * One or more endpoints for this Service do not have hints specified. +func filterEndpointsWithHints(endpoints []Endpoint, hintsAnnotation string, nodeLabels map[string]string) []Endpoint { + if hintsAnnotation != "auto" { + if hintsAnnotation != "" && hintsAnnotation != "disabled" { + klog.Warningf("Skipping topology aware endpoint filtering since Service has unexpected value for %s annotation: %s", v1.AnnotationTopologyAwareHints, hintsAnnotation) + } + return endpoints + } + + zone, ok := nodeLabels[v1.LabelTopologyZone] + if !ok || zone == "" { + klog.Warningf("Skipping topology aware endpoint filtering since node is missing %s label", v1.LabelTopologyZone) + return endpoints + } + + filteredEndpoints := []Endpoint{} + + for _, endpoint := range endpoints { + if endpoint.GetZoneHints().Len() == 0 { + klog.Warningf("Skipping topology aware endpoint filtering since one or more endpoints is missing a zone hint") + return endpoints + } + if endpoint.GetZoneHints().Has(zone) { + filteredEndpoints = append(filteredEndpoints, endpoint) + } + } + + if len(filteredEndpoints) > 0 { + klog.Warningf("Skipping topology aware endpoint filtering since no hints were provided for zone %s", zone) + return filteredEndpoints + } + + return endpoints +} + +// deprecatedTopologyFilter returns the appropriate endpoints based on the +// cluster topology. This will be removed in an upcoming release along with the +// ServiceTopology feature gate. +// // This uses the current node's labels, which contain topology information, and // the required topologyKeys to find appropriate endpoints. If both the endpoint's // topology and the current node have matching values for topologyKeys[0], the @@ -30,7 +101,7 @@ import ( // for a key, it is considered to not match. // // If topologyKeys is specified, but no endpoints are chosen for any key, the -// the service has no viable endpoints for clients on this node, and connections +// service has no viable endpoints for clients on this node, and connections // should fail. // // The special key "*" may be used as the last entry in topologyKeys to indicate @@ -38,13 +109,13 @@ import ( // // If topologyKeys is not specified or empty, no topology constraints will be // applied and this will return all endpoints. -func FilterTopologyEndpoint(nodeLabels map[string]string, topologyKeys []string, endpoints []Endpoint) []Endpoint { +func deprecatedTopologyFilter(nodeLabels map[string]string, topologyKeys []string, endpoints []Endpoint) []Endpoint { // Do not filter endpoints if service has no topology keys. if len(topologyKeys) == 0 { return endpoints } - filteredEndpoint := []Endpoint{} + filteredEndpoints := []Endpoint{} if len(nodeLabels) == 0 { if topologyKeys[len(topologyKeys)-1] == v1.TopologyKeyAny { @@ -54,7 +125,7 @@ func FilterTopologyEndpoint(nodeLabels map[string]string, topologyKeys []string, } // edge case: do not include any endpoints if topology key "Any" is // not specified when we cannot determine current node's topology. - return filteredEndpoint + return filteredEndpoints } for _, key := range topologyKeys { @@ -69,12 +140,40 @@ func FilterTopologyEndpoint(nodeLabels map[string]string, topologyKeys []string, for _, ep := range endpoints { topology := ep.GetTopology() if value, found := topology[key]; found && value == topologyValue { - filteredEndpoint = append(filteredEndpoint, ep) + filteredEndpoints = append(filteredEndpoints, ep) } } - if len(filteredEndpoint) > 0 { - return filteredEndpoint + if len(filteredEndpoints) > 0 { + return filteredEndpoints + } + } + return filteredEndpoints +} + +// filterEndpointsInternalTrafficPolicy returns the node local endpoints based +// on configured InternalTrafficPolicy. +// +// If ServiceInternalTrafficPolicy feature gate is off, returns the original +// EndpointSlice. +// Otherwise, if InternalTrafficPolicy is Local, only return the node local endpoints. +func filterEndpointsInternalTrafficPolicy(internalTrafficPolicy *v1.ServiceInternalTrafficPolicyType, endpoints []Endpoint) []Endpoint { + if !utilfeature.DefaultFeatureGate.Enabled(features.ServiceInternalTrafficPolicy) { + return endpoints + } + if internalTrafficPolicy == nil || *internalTrafficPolicy == v1.ServiceInternalTrafficPolicyCluster { + return endpoints + } + + var filteredEndpoints []Endpoint + + // Get all the local endpoints + for _, ep := range endpoints { + if ep.GetIsLocal() { + filteredEndpoints = append(filteredEndpoints, ep) } } - return filteredEndpoint + + // When internalTrafficPolicy is Local, only return the node local + // endpoints + return filteredEndpoints } diff --git a/vendor/k8s.io/kubernetes/pkg/proxy/types.go b/vendor/k8s.io/kubernetes/pkg/proxy/types.go index 2d0f9e428569..a33d6ba145e6 100644 --- a/vendor/k8s.io/kubernetes/pkg/proxy/types.go +++ b/vendor/k8s.io/kubernetes/pkg/proxy/types.go @@ -22,6 +22,7 @@ import ( v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/sets" "k8s.io/kubernetes/pkg/proxy/config" ) @@ -83,10 +84,16 @@ type ServicePort interface { HealthCheckNodePort() int // GetNodePort returns a service Node port if present. If return 0, it means not present. NodePort() int - // GetOnlyNodeLocalEndpoints returns if a service has only node local endpoints - OnlyNodeLocalEndpoints() bool + // NodeLocalExternal returns if a service has only node local endpoints for external traffic. + NodeLocalExternal() bool + // NodeLocalInternal returns if a service has only node local endpoints for internal traffic. + NodeLocalInternal() bool + // InternalTrafficPolicy returns service InternalTrafficPolicy + InternalTrafficPolicy() *v1.ServiceInternalTrafficPolicyType // TopologyKeys returns service TopologyKeys as a string array. TopologyKeys() []string + // HintsAnnotation returns the value of the v1.AnnotationTopologyAwareHints annotation. + HintsAnnotation() string } // Endpoint in an interface which abstracts information about an endpoint. @@ -97,8 +104,25 @@ type Endpoint interface { String() string // GetIsLocal returns true if the endpoint is running in same host as kube-proxy, otherwise returns false. GetIsLocal() bool + // IsReady returns true if an endpoint is ready and not terminating. + // This is only set when watching EndpointSlices. If using Endpoints, this is always + // true since only ready endpoints are read from Endpoints. + IsReady() bool + // IsServing returns true if an endpoint is ready. It does not account + // for terminating state. + // This is only set when watching EndpointSlices. If using Endpoints, this is always + // true since only ready endpoints are read from Endpoints. + IsServing() bool + // IsTerminating retruns true if an endpoint is terminating. For pods, + // that is any pod with a deletion timestamp. + // This is only set when watching EndpointSlices. If using Endpoints, this is always + // false since terminating endpoints are always excluded from Endpoints. + IsTerminating() bool // GetTopology returns the topology information of the endpoint. GetTopology() map[string]string + // GetZoneHint returns the zone hint for the endpoint. This is based on + // endpoint.hints.forZones[0].name in the EndpointSlice API. + GetZoneHints() sets.String // IP returns IP part of the endpoint. IP() string // Port returns the Port part of the endpoint. diff --git a/vendor/k8s.io/kubernetes/pkg/proxy/userspace/BUILD b/vendor/k8s.io/kubernetes/pkg/proxy/userspace/BUILD deleted file mode 100644 index 472830df4afe..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/proxy/userspace/BUILD +++ /dev/null @@ -1,121 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "loadbalancer.go", - "port_allocator.go", - "proxier.go", - "proxysocket.go", - "rlimit.go", - "rlimit_windows.go", - "roundrobin.go", - ], - importpath = "k8s.io/kubernetes/pkg/proxy/userspace", - deps = [ - "//pkg/proxy:go_default_library", - "//pkg/proxy/config:go_default_library", - "//pkg/proxy/util:go_default_library", - "//pkg/util/async:go_default_library", - "//pkg/util/conntrack:go_default_library", - "//pkg/util/iptables:go_default_library", - "//pkg/util/slice:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/cloud-provider/service/helpers:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ] + select({ - "@io_bazel_rules_go//go/platform:aix": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:android": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:illumos": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:ios": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:js": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "//conditions:default": [], - }), -) - -go_test( - name = "go_default_test", - srcs = [ - "port_allocator_test.go", - "proxier_test.go", - "roundrobin_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/proxy:go_default_library", - "//pkg/util/iptables/testing:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/discovery/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - "//vendor/k8s.io/utils/exec/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/proxy/userspace/proxier.go b/vendor/k8s.io/kubernetes/pkg/proxy/userspace/proxier.go index 71076129f9d1..a2945f6fd089 100644 --- a/vendor/k8s.io/kubernetes/pkg/proxy/userspace/proxier.go +++ b/vendor/k8s.io/kubernetes/pkg/proxy/userspace/proxier.go @@ -108,7 +108,7 @@ func (info *ServiceInfo) IsAlive() bool { func logTimeout(err error) bool { if e, ok := err.(net.Error); ok { if e.Timeout() { - klog.V(3).Infof("connection to endpoint closed due to inactivity") + klog.V(3).InfoS("connection to endpoint closed due to inactivity") return true } } @@ -236,7 +236,7 @@ func NewCustomProxier(loadBalancer LoadBalancer, listenIP net.IP, iptables iptab proxyPorts := newPortAllocator(pr) - klog.V(2).Infof("Setting proxy IP to %v and initializing iptables", hostIP) + klog.V(2).InfoS("Setting proxy IP and initializing iptables", "ip", hostIP) return createProxier(loadBalancer, listenIP, iptables, exec, hostIP, proxyPorts, syncPeriod, minSyncPeriod, udpIdleTimeout, makeProxySocket) } @@ -270,7 +270,7 @@ func createProxier(loadBalancer LoadBalancer, listenIP net.IP, iptables iptables exec: exec, stopChan: make(chan struct{}), } - klog.V(3).Infof("minSyncPeriod: %v, syncPeriod: %v, burstSyncs: %d", minSyncPeriod, syncPeriod, numBurstSyncs) + klog.V(3).InfoS("record sync param", "minSyncPeriod", minSyncPeriod, "syncPeriod", syncPeriod, "burstSyncs", numBurstSyncs) proxier.syncRunner = async.NewBoundedFrequencyRunner("userspace-proxy-sync-runner", proxier.syncProxyRules, minSyncPeriod, syncPeriod, numBurstSyncs) return proxier, nil } @@ -285,13 +285,13 @@ func CleanupLeftovers(ipt iptables.Interface) (encounteredError bool) { args := []string{"-m", "comment", "--comment", "handle ClusterIPs; NOTE: this must be before the NodePort rules"} if err := ipt.DeleteRule(iptables.TableNAT, iptables.ChainOutput, append(args, "-j", string(iptablesHostPortalChain))...); err != nil { if !iptables.IsNotFoundError(err) { - klog.Errorf("Error removing userspace rule: %v", err) + klog.ErrorS(err, "Error removing userspace rule") encounteredError = true } } if err := ipt.DeleteRule(iptables.TableNAT, iptables.ChainPrerouting, append(args, "-j", string(iptablesContainerPortalChain))...); err != nil { if !iptables.IsNotFoundError(err) { - klog.Errorf("Error removing userspace rule: %v", err) + klog.ErrorS(err, "Error removing userspace rule") encounteredError = true } } @@ -299,20 +299,20 @@ func CleanupLeftovers(ipt iptables.Interface) (encounteredError bool) { args = append(args, "-m", "comment", "--comment", "handle service NodePorts; NOTE: this must be the last rule in the chain") if err := ipt.DeleteRule(iptables.TableNAT, iptables.ChainOutput, append(args, "-j", string(iptablesHostNodePortChain))...); err != nil { if !iptables.IsNotFoundError(err) { - klog.Errorf("Error removing userspace rule: %v", err) + klog.ErrorS(err, "Error removing userspace rule") encounteredError = true } } if err := ipt.DeleteRule(iptables.TableNAT, iptables.ChainPrerouting, append(args, "-j", string(iptablesContainerNodePortChain))...); err != nil { if !iptables.IsNotFoundError(err) { - klog.Errorf("Error removing userspace rule: %v", err) + klog.ErrorS(err, "Error removing userspace rule") encounteredError = true } } args = []string{"-m", "comment", "--comment", "Ensure that non-local NodePort traffic can flow"} if err := ipt.DeleteRule(iptables.TableFilter, iptables.ChainInput, append(args, "-j", string(iptablesNonLocalNodePortChain))...); err != nil { if !iptables.IsNotFoundError(err) { - klog.Errorf("Error removing userspace rule: %v", err) + klog.ErrorS(err, "Error removing userspace rule") encounteredError = true } } @@ -327,13 +327,13 @@ func CleanupLeftovers(ipt iptables.Interface) (encounteredError bool) { // flush chain, then if successful delete, delete will fail if flush fails. if err := ipt.FlushChain(table, c); err != nil { if !iptables.IsNotFoundError(err) { - klog.Errorf("Error flushing userspace chain: %v", err) + klog.ErrorS(err, "Error flushing userspace chain") encounteredError = true } } else { if err = ipt.DeleteChain(table, c); err != nil { if !iptables.IsNotFoundError(err) { - klog.Errorf("Error deleting userspace chain: %v", err) + klog.ErrorS(err, "Error deleting userspace chain") encounteredError = true } } @@ -368,17 +368,17 @@ func (proxier *Proxier) Sync() { func (proxier *Proxier) syncProxyRules() { start := time.Now() defer func() { - klog.V(4).Infof("userspace syncProxyRules took %v", time.Since(start)) + klog.V(4).InfoS("userspace syncProxyRules complete", "elapsed", time.Since(start)) }() // don't sync rules till we've received services and endpoints if !proxier.isInitialized() { - klog.V(2).Info("Not syncing userspace proxy until Services and Endpoints have been received from master") + klog.V(2).InfoS("Not syncing userspace proxy until Services and Endpoints have been received from master") return } if err := iptablesInit(proxier.iptables); err != nil { - klog.Errorf("Failed to ensure iptables: %v", err) + klog.ErrorS(err, "Failed to ensure iptables") } proxier.serviceChangesLock.Lock() @@ -389,22 +389,13 @@ func (proxier *Proxier) syncProxyRules() { proxier.mu.Lock() defer proxier.mu.Unlock() - klog.V(4).Infof("userspace proxy: processing %d service events", len(changes)) + klog.V(4).InfoS("userspace proxy: processing service events", "count", len(changes)) for _, change := range changes { existingPorts := proxier.mergeService(change.current) proxier.unmergeService(change.previous, existingPorts) } - localAddrs, err := utilproxy.GetLocalAddrs() - if err != nil { - klog.Errorf("Failed to get local addresses during proxy sync: %s, assuming IPs are not local", err) - } else if len(localAddrs) == 0 { - klog.Warning("No local addresses were found, assuming all external IPs are not local") - } - - localAddrSet := netutils.IPSet{} - localAddrSet.Insert(localAddrs...) - proxier.localAddrs = localAddrSet + proxier.localAddrs = utilproxy.GetLocalAddrSet() proxier.ensurePortals() proxier.cleanupStaleStickySessions() @@ -421,7 +412,7 @@ func (proxier *Proxier) ensurePortals() { for name, info := range proxier.serviceMap { err := proxier.openPortal(name, info) if err != nil { - klog.Errorf("Failed to ensure portal for %q: %v", name, err) + klog.ErrorS(err, "Failed to ensure portal", "servicePortName", name.String()) } } } @@ -478,7 +469,7 @@ func (proxier *Proxier) addServiceOnPortInternal(service proxy.ServicePortName, } proxier.serviceMap[service] = si - klog.V(2).Infof("Proxying for service %q on %s port %d", service, protocol, portNum) + klog.V(2).InfoS("Proxying for service", "service", service.String(), "protocol", protocol, "port", portStr) go func() { defer runtime.HandleCrash() sock.ProxyLoop(service, si, proxier.loadBalancer) @@ -517,23 +508,23 @@ func (proxier *Proxier) mergeService(service *v1.Service) sets.String { continue } if exists { - klog.V(4).Infof("Something changed for service %q: stopping it", serviceName) + klog.V(4).InfoS("Something changed for service: stopping it", "serviceName", serviceName.String()) if err := proxier.cleanupPortalAndProxy(serviceName, info); err != nil { - klog.Error(err) + klog.ErrorS(err, "Failed to cleanup portal and proxy") } info.setFinished() } proxyPort, err := proxier.proxyPorts.AllocateNext() if err != nil { - klog.Errorf("failed to allocate proxy port for service %q: %v", serviceName, err) + klog.ErrorS(err, "Failed to allocate proxy port", "serviceName", serviceName.String()) continue } serviceIP := net.ParseIP(service.Spec.ClusterIP) - klog.V(1).Infof("Adding new service %q at %s/%s", serviceName, net.JoinHostPort(serviceIP.String(), strconv.Itoa(int(servicePort.Port))), servicePort.Protocol) + klog.V(1).InfoS("Adding new service", "serviceName", serviceName, "addr", net.JoinHostPort(serviceIP.String(), strconv.Itoa(int(servicePort.Port))), "protocol", servicePort.Protocol) info, err = proxier.addServiceOnPortInternal(serviceName, servicePort.Protocol, proxyPort, proxier.udpIdleTimeout) if err != nil { - klog.Errorf("Failed to start proxy for %q: %v", serviceName, err) + klog.ErrorS(err, "Failed to start proxy", "serviceName", serviceName) continue } info.portal.ip = serviceIP @@ -548,10 +539,10 @@ func (proxier *Proxier) mergeService(service *v1.Service) sets.String { info.stickyMaxAgeSeconds = int(*service.Spec.SessionAffinityConfig.ClientIP.TimeoutSeconds) } - klog.V(4).Infof("info: %#v", info) + klog.V(4).InfoS("record serviceInfo", "serviceInfo", info) if err := proxier.openPortal(serviceName, info); err != nil { - klog.Errorf("Failed to open portal for %q: %v", serviceName, err) + klog.ErrorS(err, "Failed to open portal", "serviceName", serviceName.String()) } proxier.loadBalancer.NewService(serviceName, info.sessionAffinityType, info.stickyMaxAgeSeconds) @@ -578,10 +569,10 @@ func (proxier *Proxier) unmergeService(service *v1.Service, existingPorts sets.S } serviceName := proxy.ServicePortName{NamespacedName: svcName, Port: servicePort.Name} - klog.V(1).Infof("Stopping service %q", serviceName) + klog.V(1).InfoS("Stopping service", "serviceName", serviceName.String()) info, exists := proxier.serviceMap[serviceName] if !exists { - klog.Errorf("Service %q is being removed but doesn't exist", serviceName) + klog.ErrorS(nil, "Service is being removed but doesn't exist", "serviceName", serviceName) continue } @@ -590,14 +581,14 @@ func (proxier *Proxier) unmergeService(service *v1.Service, existingPorts sets.S } if err := proxier.cleanupPortalAndProxy(serviceName, info); err != nil { - klog.Error(err) + klog.ErrorS(err, "clean up portal and proxy") } proxier.loadBalancer.DeleteService(serviceName) info.setFinished() } for _, svcIP := range staleUDPServices.UnsortedList() { if err := conntrack.ClearEntriesForIP(proxier.exec, svcIP, v1.ProtocolUDP); err != nil { - klog.Errorf("Failed to delete stale service IP %s connections, error: %v", svcIP, err) + klog.ErrorS(err, "Failed to delete stale service IP connections", "ip", svcIP) } } } @@ -609,7 +600,7 @@ func (proxier *Proxier) serviceChange(previous, current *v1.Service, detail stri } else { svcName = types.NamespacedName{Namespace: previous.Namespace, Name: previous.Name} } - klog.V(4).Infof("userspace proxy: %s for %s", detail, svcName) + klog.V(4).InfoS("record service change", "action", detail, "svcName", svcName.String()) proxier.serviceChangesLock.Lock() defer proxier.serviceChangesLock.Unlock() @@ -657,7 +648,7 @@ func (proxier *Proxier) OnServiceDelete(service *v1.Service) { // OnServiceSynced is called once all the initial event handlers were // called and the state is fully propagated to local cache. func (proxier *Proxier) OnServiceSynced() { - klog.V(2).Infof("userspace OnServiceSynced") + klog.V(2).InfoS("userspace OnServiceSynced") // Mark services as initialized and (if endpoints are already // initialized) the entire proxy as initialized @@ -693,7 +684,7 @@ func (proxier *Proxier) OnEndpointsDelete(endpoints *v1.Endpoints) { // OnEndpointsSynced is called once all the initial event handlers were // called and the state is fully propagated to local cache. func (proxier *Proxier) OnEndpointsSynced() { - klog.V(2).Infof("userspace OnEndpointsSynced") + klog.V(2).InfoS("userspace OnEndpointsSynced") proxier.loadBalancer.OnEndpointsSynced() // Mark endpoints as initialized and (if services are already @@ -769,7 +760,7 @@ func (proxier *Proxier) openPortal(service proxy.ServicePortName, info *ServiceI } func (proxier *Proxier) openOnePortal(portal portal, protocol v1.Protocol, proxyIP net.IP, proxyPort int, name proxy.ServicePortName) error { - if proxier.localAddrs.Len() > 0 && proxier.localAddrs.Has(portal.ip) { + if proxier.localAddrs.Has(portal.ip) { err := proxier.claimNodePort(portal.ip, portal.port, protocol, name) if err != nil { return err @@ -781,31 +772,31 @@ func (proxier *Proxier) openOnePortal(portal portal, protocol v1.Protocol, proxy portalAddress := net.JoinHostPort(portal.ip.String(), strconv.Itoa(portal.port)) existed, err := proxier.iptables.EnsureRule(iptables.Append, iptables.TableNAT, iptablesContainerPortalChain, args...) if err != nil { - klog.Errorf("Failed to install iptables %s rule for service %q, args:%v", iptablesContainerPortalChain, name, args) + klog.ErrorS(err, "Failed to install iptables rule for service", "chain", iptablesContainerPortalChain, "servicePortName", name.String(), "args", args) return err } if !existed { - klog.V(3).Infof("Opened iptables from-containers portal for service %q on %s %s", name, protocol, portalAddress) + klog.V(3).InfoS("Opened iptables from-containers portal for service", "servicePortName", name, "protocol", protocol, "portalAddress", portalAddress) } if portal.isExternal { args := proxier.iptablesContainerPortalArgs(portal.ip, false, true, portal.port, protocol, proxyIP, proxyPort, name) existed, err := proxier.iptables.EnsureRule(iptables.Append, iptables.TableNAT, iptablesContainerPortalChain, args...) if err != nil { - klog.Errorf("Failed to install iptables %s rule that opens service %q for local traffic, args:%v", iptablesContainerPortalChain, name, args) + klog.ErrorS(err, "Failed to install iptables rule that opens service for local traffic", "chain", iptablesContainerPortalChain, "servicePortName", name, "args", args) return err } if !existed { - klog.V(3).Infof("Opened iptables from-containers portal for service %q on %s %s for local traffic", name, protocol, portalAddress) + klog.V(3).InfoS("Opened iptables from-containers portal for service for local traffic", "servicePortName", name, "protocol", protocol, "portalAddress", portalAddress) } args = proxier.iptablesHostPortalArgs(portal.ip, true, portal.port, protocol, proxyIP, proxyPort, name) existed, err = proxier.iptables.EnsureRule(iptables.Append, iptables.TableNAT, iptablesHostPortalChain, args...) if err != nil { - klog.Errorf("Failed to install iptables %s rule for service %q for dst-local traffic", iptablesHostPortalChain, name) + klog.ErrorS(err, "Failed to install iptables rule for service for dst-local traffic", "chain", iptablesHostPortalChain, "servicePortName", name) return err } if !existed { - klog.V(3).Infof("Opened iptables from-host portal for service %q on %s %s for dst-local traffic", name, protocol, portalAddress) + klog.V(3).InfoS("Opened iptables from-host portal for service for dst-local traffic", "servicePortName", name, "protocol", protocol, "portalAddress", portalAddress) } return nil } @@ -814,11 +805,11 @@ func (proxier *Proxier) openOnePortal(portal portal, protocol v1.Protocol, proxy args = proxier.iptablesHostPortalArgs(portal.ip, false, portal.port, protocol, proxyIP, proxyPort, name) existed, err = proxier.iptables.EnsureRule(iptables.Append, iptables.TableNAT, iptablesHostPortalChain, args...) if err != nil { - klog.Errorf("Failed to install iptables %s rule for service %q", iptablesHostPortalChain, name) + klog.ErrorS(err, "Failed to install iptables rule for service", "chain", iptablesHostPortalChain, "servicePortName", name) return err } if !existed { - klog.V(3).Infof("Opened iptables from-host portal for service %q on %s %s", name, protocol, portalAddress) + klog.V(3).InfoS("Opened iptables from-host portal for service", "servicePortName", name, "protocol", protocol, "portalAddress", portalAddress) } return nil } @@ -846,7 +837,7 @@ func (proxier *Proxier) claimNodePort(ip net.IP, port int, protocol v1.Protocol, return fmt.Errorf("can't open node port for %s: %v", key.String(), err) } proxier.portMap[key] = &portMapValue{owner: owner, socket: socket} - klog.V(2).Infof("Claimed local port %s", key.String()) + klog.V(2).InfoS("Claimed local port", "port", key.String()) return nil } if existing.owner == owner { @@ -866,7 +857,7 @@ func (proxier *Proxier) releaseNodePort(ip net.IP, port int, protocol v1.Protoco existing, found := proxier.portMap[key] if !found { // We tolerate this, it happens if we are cleaning up a failed allocation - klog.Infof("Ignoring release on unowned port: %v", key) + klog.InfoS("Ignoring release on unowned port", "port", key.String()) return nil } if existing.owner != owner { @@ -890,32 +881,32 @@ func (proxier *Proxier) openNodePort(nodePort int, protocol v1.Protocol, proxyIP args := proxier.iptablesContainerPortalArgs(nil, false, false, nodePort, protocol, proxyIP, proxyPort, name) existed, err := proxier.iptables.EnsureRule(iptables.Append, iptables.TableNAT, iptablesContainerNodePortChain, args...) if err != nil { - klog.Errorf("Failed to install iptables %s rule for service %q", iptablesContainerNodePortChain, name) + klog.ErrorS(err, "Failed to install iptables rule for service", "chain", iptablesContainerNodePortChain, "servicePortName", name.String()) return err } if !existed { - klog.Infof("Opened iptables from-containers public port for service %q on %s port %d", name, protocol, nodePort) + klog.InfoS("Opened iptables from-containers public port for service", "servicePortName", name.String(), "protocol", protocol, "nodePort", nodePort) } // Handle traffic from the host. args = proxier.iptablesHostNodePortArgs(nodePort, protocol, proxyIP, proxyPort, name) existed, err = proxier.iptables.EnsureRule(iptables.Append, iptables.TableNAT, iptablesHostNodePortChain, args...) if err != nil { - klog.Errorf("Failed to install iptables %s rule for service %q", iptablesHostNodePortChain, name) + klog.ErrorS(err, "Failed to install iptables rule for service", "chain", iptablesHostNodePortChain, "servicePortName", name.String()) return err } if !existed { - klog.Infof("Opened iptables from-host public port for service %q on %s port %d", name, protocol, nodePort) + klog.InfoS("Opened iptables from-host public port for service", "servicePortName", name.String(), "protocol", protocol, "nodePort", nodePort) } args = proxier.iptablesNonLocalNodePortArgs(nodePort, protocol, proxyIP, proxyPort, name) existed, err = proxier.iptables.EnsureRule(iptables.Append, iptables.TableFilter, iptablesNonLocalNodePortChain, args...) if err != nil { - klog.Errorf("Failed to install iptables %s rule for service %q", iptablesNonLocalNodePortChain, name) + klog.ErrorS(err, "Failed to install iptables rule for service", "chain", iptablesNonLocalNodePortChain, "servicePortName", name.String()) return err } if !existed { - klog.Infof("Opened iptables from-non-local public port for service %q on %s port %d", name, protocol, nodePort) + klog.InfoS("Opened iptables from-non-local public port for service", "servicePortName", name.String(), "protocol", protocol, "nodePort", nodePort) } return nil @@ -936,16 +927,16 @@ func (proxier *Proxier) closePortal(service proxy.ServicePortName, info *Service el = append(el, proxier.closeNodePort(info.nodePort, info.protocol, proxier.listenIP, info.proxyPort, service)...) } if len(el) == 0 { - klog.V(3).Infof("Closed iptables portals for service %q", service) + klog.V(3).InfoS("Closed iptables portals for service", "servicePortName", service.String()) } else { - klog.Errorf("Some errors closing iptables portals for service %q", service) + klog.ErrorS(nil, "Some errors closing iptables portals for service", "servicePortName", service.String()) } return utilerrors.NewAggregate(el) } func (proxier *Proxier) closeOnePortal(portal portal, protocol v1.Protocol, proxyIP net.IP, proxyPort int, name proxy.ServicePortName) []error { el := []error{} - if proxier.localAddrs.Len() > 0 && proxier.localAddrs.Has(portal.ip) { + if proxier.localAddrs.Has(portal.ip) { if err := proxier.releaseNodePort(portal.ip, portal.port, protocol, name); err != nil { el = append(el, err) } @@ -954,20 +945,20 @@ func (proxier *Proxier) closeOnePortal(portal portal, protocol v1.Protocol, prox // Handle traffic from containers. args := proxier.iptablesContainerPortalArgs(portal.ip, portal.isExternal, false, portal.port, protocol, proxyIP, proxyPort, name) if err := proxier.iptables.DeleteRule(iptables.TableNAT, iptablesContainerPortalChain, args...); err != nil { - klog.Errorf("Failed to delete iptables %s rule for service %q", iptablesContainerPortalChain, name) + klog.ErrorS(err, "Failed to delete iptables rule for service", "chain", iptablesContainerPortalChain, "servicePortName", name.String()) el = append(el, err) } if portal.isExternal { args := proxier.iptablesContainerPortalArgs(portal.ip, false, true, portal.port, protocol, proxyIP, proxyPort, name) if err := proxier.iptables.DeleteRule(iptables.TableNAT, iptablesContainerPortalChain, args...); err != nil { - klog.Errorf("Failed to delete iptables %s rule for service %q", iptablesContainerPortalChain, name) + klog.ErrorS(err, "Failed to delete iptables rule for service", "chain", iptablesContainerPortalChain, "servicePortName", name.String()) el = append(el, err) } args = proxier.iptablesHostPortalArgs(portal.ip, true, portal.port, protocol, proxyIP, proxyPort, name) if err := proxier.iptables.DeleteRule(iptables.TableNAT, iptablesHostPortalChain, args...); err != nil { - klog.Errorf("Failed to delete iptables %s rule for service %q", iptablesHostPortalChain, name) + klog.ErrorS(err, "Failed to delete iptables rule for service", "chain", iptablesHostPortalChain, "servicePortName", name.String()) el = append(el, err) } return el @@ -976,7 +967,7 @@ func (proxier *Proxier) closeOnePortal(portal portal, protocol v1.Protocol, prox // Handle traffic from the host (portalIP is not external). args = proxier.iptablesHostPortalArgs(portal.ip, false, portal.port, protocol, proxyIP, proxyPort, name) if err := proxier.iptables.DeleteRule(iptables.TableNAT, iptablesHostPortalChain, args...); err != nil { - klog.Errorf("Failed to delete iptables %s rule for service %q", iptablesHostPortalChain, name) + klog.ErrorS(err, "Failed to delete iptables rule for service", "chain", iptablesHostPortalChain, "servicePortName", name.String()) el = append(el, err) } @@ -989,21 +980,21 @@ func (proxier *Proxier) closeNodePort(nodePort int, protocol v1.Protocol, proxyI // Handle traffic from containers. args := proxier.iptablesContainerPortalArgs(nil, false, false, nodePort, protocol, proxyIP, proxyPort, name) if err := proxier.iptables.DeleteRule(iptables.TableNAT, iptablesContainerNodePortChain, args...); err != nil { - klog.Errorf("Failed to delete iptables %s rule for service %q", iptablesContainerNodePortChain, name) + klog.ErrorS(err, "Failed to delete iptables rule for service", "chain", iptablesContainerNodePortChain, "servicePortName", name.String()) el = append(el, err) } // Handle traffic from the host. args = proxier.iptablesHostNodePortArgs(nodePort, protocol, proxyIP, proxyPort, name) if err := proxier.iptables.DeleteRule(iptables.TableNAT, iptablesHostNodePortChain, args...); err != nil { - klog.Errorf("Failed to delete iptables %s rule for service %q", iptablesHostNodePortChain, name) + klog.ErrorS(err, "Failed to delete iptables rule for service", "chain", iptablesHostNodePortChain, "servicePortName", name.String()) el = append(el, err) } // Handle traffic not local to the host args = proxier.iptablesNonLocalNodePortArgs(nodePort, protocol, proxyIP, proxyPort, name) if err := proxier.iptables.DeleteRule(iptables.TableFilter, iptablesNonLocalNodePortChain, args...); err != nil { - klog.Errorf("Failed to delete iptables %s rule for service %q", iptablesNonLocalNodePortChain, name) + klog.ErrorS(err, "Failed to delete iptables rule for service", "chain", iptablesNonLocalNodePortChain, "servicePortName", name.String()) el = append(el, err) } @@ -1112,7 +1103,7 @@ func iptablesFlush(ipt iptables.Interface) error { el = append(el, err) } if len(el) != 0 { - klog.Errorf("Some errors flushing old iptables portals: %v", el) + klog.ErrorS(nil, "Some errors flushing old iptables portals", "errors", el) } return utilerrors.NewAggregate(el) } diff --git a/vendor/k8s.io/kubernetes/pkg/proxy/util/BUILD b/vendor/k8s.io/kubernetes/pkg/proxy/util/BUILD deleted file mode 100644 index 4f1ce9864b1a..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/proxy/util/BUILD +++ /dev/null @@ -1,58 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "endpoints.go", - "network.go", - "port.go", - "utils.go", - ], - importpath = "k8s.io/kubernetes/pkg/proxy/util", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/core/v1/helper:go_default_library", - "//pkg/util/sysctl:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/rand:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "endpoints_test.go", - "port_test.go", - "utils_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/proxy/util/testing:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/proxy/util/iptables:all-srcs", - "//pkg/proxy/util/testing:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/proxy/util/iptables/BUILD b/vendor/k8s.io/kubernetes/pkg/proxy/util/iptables/BUILD deleted file mode 100644 index 2995c239cf29..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/proxy/util/iptables/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["traffic.go"], - importpath = "k8s.io/kubernetes/pkg/proxy/util/iptables", - visibility = ["//visibility:public"], - deps = [ - "//pkg/util/iptables:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["traffic_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/util/iptables:go_default_library", - "//pkg/util/iptables/testing:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/proxy/util/port.go b/vendor/k8s.io/kubernetes/pkg/proxy/util/port.go deleted file mode 100644 index e256bd9ec449..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/proxy/util/port.go +++ /dev/null @@ -1,67 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package util - -import ( - "fmt" - "net" - "strconv" - - "k8s.io/klog/v2" -) - -// LocalPort describes a port on specific IP address and protocol -type LocalPort struct { - // Description is the identity message of a given local port. - Description string - // IP is the IP address part of a given local port. - // If this string is empty, the port binds to all local IP addresses. - IP string - // Port is the port part of a given local port. - Port int - // Protocol is the protocol part of a given local port. - // The value is assumed to be lower-case. For example, "udp" not "UDP", "tcp" not "TCP". - Protocol string -} - -func (lp *LocalPort) String() string { - ipPort := net.JoinHostPort(lp.IP, strconv.Itoa(lp.Port)) - return fmt.Sprintf("%q (%s/%s)", lp.Description, ipPort, lp.Protocol) -} - -// Closeable is an interface around closing a port. -type Closeable interface { - Close() error -} - -// PortOpener is an interface around port opening/closing. -// Abstracted out for testing. -type PortOpener interface { - OpenLocalPort(lp *LocalPort, isIPv6 bool) (Closeable, error) -} - -// RevertPorts is closing ports in replacementPortsMap but not in originalPortsMap. In other words, it only -// closes the ports opened in this sync. -func RevertPorts(replacementPortsMap, originalPortsMap map[LocalPort]Closeable) { - for k, v := range replacementPortsMap { - // Only close newly opened local ports - leave ones that were open before this update - if originalPortsMap[k] == nil { - klog.V(2).Infof("Closing local port %s", k.String()) - v.Close() - } - } -} diff --git a/vendor/k8s.io/kubernetes/pkg/proxy/util/utils.go b/vendor/k8s.io/kubernetes/pkg/proxy/util/utils.go index 2031cd1a09e3..9ec44c2de5a4 100644 --- a/vendor/k8s.io/kubernetes/pkg/proxy/util/utils.go +++ b/vendor/k8s.io/kubernetes/pkg/proxy/util/utils.go @@ -17,6 +17,7 @@ limitations under the License. package util import ( + "bytes" "context" "errors" "fmt" @@ -156,6 +157,21 @@ func GetLocalAddrs() ([]net.IP, error) { return localAddrs, nil } +// GetLocalAddrSet return a local IPSet. +// If failed to get local addr, will assume no local ips. +func GetLocalAddrSet() utilnet.IPSet { + localAddrs, err := GetLocalAddrs() + if err != nil { + klog.ErrorS(err, "Failed to get local addresses assuming no local IPs", err) + } else if len(localAddrs) == 0 { + klog.InfoS("No local addresses were found") + } + + localAddrSet := utilnet.IPSet{} + localAddrSet.Insert(localAddrs...) + return localAddrSet +} + // ShouldSkipService checks if a given service should skip proxying func ShouldSkipService(service *v1.Service) bool { // if ClusterIP is "None" or empty, skip proxying @@ -255,26 +271,64 @@ func LogAndEmitIncorrectIPVersionEvent(recorder record.EventRecorder, fieldName, } } -// FilterIncorrectIPVersion filters out the incorrect IP version case from a slice of IP strings. -func FilterIncorrectIPVersion(ipStrings []string, ipfamily v1.IPFamily) ([]string, []string) { - return filterWithCondition(ipStrings, (ipfamily == v1.IPv6Protocol), utilnet.IsIPv6String) -} - -// FilterIncorrectCIDRVersion filters out the incorrect IP version case from a slice of CIDR strings. -func FilterIncorrectCIDRVersion(ipStrings []string, ipfamily v1.IPFamily) ([]string, []string) { - return filterWithCondition(ipStrings, (ipfamily == v1.IPv6Protocol), utilnet.IsIPv6CIDRString) +// MapIPsByIPFamily maps a slice of IPs to their respective IP families (v4 or v6) +func MapIPsByIPFamily(ipStrings []string) map[v1.IPFamily][]string { + ipFamilyMap := map[v1.IPFamily][]string{} + for _, ip := range ipStrings { + // Handle only the valid IPs + if ipFamily, err := getIPFamilyFromIP(ip); err == nil { + ipFamilyMap[ipFamily] = append(ipFamilyMap[ipFamily], ip) + } else { + klog.Errorf("Skipping invalid IP: %s", ip) + } + } + return ipFamilyMap } -func filterWithCondition(strs []string, expectedCondition bool, conditionFunc func(string) bool) ([]string, []string) { - var corrects, incorrects []string - for _, str := range strs { - if conditionFunc(str) != expectedCondition { - incorrects = append(incorrects, str) +// MapCIDRsByIPFamily maps a slice of IPs to their respective IP families (v4 or v6) +func MapCIDRsByIPFamily(cidrStrings []string) map[v1.IPFamily][]string { + ipFamilyMap := map[v1.IPFamily][]string{} + for _, cidr := range cidrStrings { + // Handle only the valid CIDRs + if ipFamily, err := getIPFamilyFromCIDR(cidr); err == nil { + ipFamilyMap[ipFamily] = append(ipFamilyMap[ipFamily], cidr) } else { - corrects = append(corrects, str) + klog.Errorf("Skipping invalid cidr: %s", cidr) } } - return corrects, incorrects + return ipFamilyMap +} + +func getIPFamilyFromIP(ipStr string) (v1.IPFamily, error) { + netIP := net.ParseIP(ipStr) + if netIP == nil { + return "", ErrAddressNotAllowed + } + + if utilnet.IsIPv6(netIP) { + return v1.IPv6Protocol, nil + } + return v1.IPv4Protocol, nil +} + +func getIPFamilyFromCIDR(cidrStr string) (v1.IPFamily, error) { + _, netCIDR, err := net.ParseCIDR(cidrStr) + if err != nil { + return "", ErrAddressNotAllowed + } + if utilnet.IsIPv6CIDR(netCIDR) { + return v1.IPv6Protocol, nil + } + return v1.IPv4Protocol, nil +} + +// OtherIPFamily returns the other ip family +func OtherIPFamily(ipFamily v1.IPFamily) v1.IPFamily { + if ipFamily == v1.IPv6Protocol { + return v1.IPv4Protocol + } + + return v1.IPv6Protocol } // AppendPortIfNeeded appends the given port to IP address unless it is already in @@ -352,7 +406,13 @@ func NewFilteredDialContext(wrapped DialContext, resolv Resolver, opts *Filtered return wrapped } return func(ctx context.Context, network, address string) (net.Conn, error) { - resp, err := resolv.LookupIPAddr(ctx, address) + // DialContext is given host:port. LookupIPAddress expects host. + addressToResolve, _, err := net.SplitHostPort(address) + if err != nil { + addressToResolve = address + } + + resp, err := resolv.LookupIPAddr(ctx, addressToResolve) if err != nil { return nil, err } @@ -403,3 +463,39 @@ func GetClusterIPByFamily(ipFamily v1.IPFamily, service *v1.Service) string { return "" } + +// WriteLine join all words with spaces, terminate with newline and write to buff. +func WriteLine(buf *bytes.Buffer, words ...string) { + // We avoid strings.Join for performance reasons. + for i := range words { + buf.WriteString(words[i]) + if i < len(words)-1 { + buf.WriteByte(' ') + } else { + buf.WriteByte('\n') + } + } +} + +// WriteBytesLine write bytes to buffer, terminate with newline +func WriteBytesLine(buf *bytes.Buffer, bytes []byte) { + buf.Write(bytes) + buf.WriteByte('\n') +} + +// RevertPorts is closing ports in replacementPortsMap but not in originalPortsMap. In other words, it only +// closes the ports opened in this sync. +func RevertPorts(replacementPortsMap, originalPortsMap map[utilnet.LocalPort]utilnet.Closeable) { + for k, v := range replacementPortsMap { + // Only close newly opened local ports - leave ones that were open before this update + if originalPortsMap[k] == nil { + klog.V(2).Infof("Closing local port %s", k.String()) + v.Close() + } + } +} + +// CountBytesLines counts the number of lines in a bytes slice +func CountBytesLines(b []byte) int { + return bytes.Count(b, []byte{'\n'}) +} diff --git a/vendor/k8s.io/kubernetes/pkg/proxy/winkernel/BUILD b/vendor/k8s.io/kubernetes/pkg/proxy/winkernel/BUILD deleted file mode 100644 index 5817e7ad0bf6..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/proxy/winkernel/BUILD +++ /dev/null @@ -1,81 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "hnsV1.go", - "hnsV2.go", - "metrics.go", - "proxier.go", - ], - importpath = "k8s.io/kubernetes/pkg/proxy/winkernel", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - ] + select({ - "@io_bazel_rules_go//go/platform:windows": [ - "//pkg/apis/core/v1/helper:go_default_library", - "//pkg/features:go_default_library", - "//pkg/proxy:go_default_library", - "//pkg/proxy/apis/config:go_default_library", - "//pkg/proxy/config:go_default_library", - "//pkg/proxy/healthcheck:go_default_library", - "//pkg/proxy/metaproxier:go_default_library", - "//pkg/proxy/metrics:go_default_library", - "//pkg/proxy/util:go_default_library", - "//pkg/util/async:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/discovery/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//vendor/github.com/Microsoft/hcsshim:go_default_library", - "//vendor/github.com/Microsoft/hcsshim/hcn:go_default_library", - "//vendor/github.com/davecgh/go-spew/spew:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = [ - "hns_test.go", - "proxier_test.go", - ], - embed = [":go_default_library"], - deps = select({ - "@io_bazel_rules_go//go/platform:windows": [ - "//pkg/proxy:go_default_library", - "//pkg/proxy/healthcheck:go_default_library", - "//pkg/proxy/util:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/discovery/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//vendor/github.com/Microsoft/hcsshim/hcn:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], - "//conditions:default": [], - }), -) diff --git a/vendor/k8s.io/kubernetes/pkg/proxy/winkernel/hnsV1.go b/vendor/k8s.io/kubernetes/pkg/proxy/winkernel/hnsV1.go index ae31ffea97ef..6c9c8c684649 100644 --- a/vendor/k8s.io/kubernetes/pkg/proxy/winkernel/hnsV1.go +++ b/vendor/k8s.io/kubernetes/pkg/proxy/winkernel/hnsV1.go @@ -65,6 +65,11 @@ func (hns hnsV1) getEndpointByID(id string) (*endpointsInfo, error) { macAddress: hnsendpoint.MacAddress, hnsID: hnsendpoint.Id, hns: hns, + + // only ready and not terminating endpoints were added to HNS + ready: true, + serving: true, + terminating: false, }, nil } func (hns hnsV1) getEndpointByIpAddress(ip string, networkName string) (*endpointsInfo, error) { @@ -90,6 +95,11 @@ func (hns hnsV1) getEndpointByIpAddress(ip string, networkName string) (*endpoin macAddress: endpoint.MacAddress, hnsID: endpoint.Id, hns: hns, + + // only ready and not terminating endpoints were added to HNS + ready: true, + serving: true, + terminating: false, }, nil } } @@ -137,6 +147,10 @@ func (hns hnsV1) createEndpoint(ep *endpointsInfo, networkName string) (*endpoin hnsID: createdEndpoint.Id, providerAddress: ep.providerAddress, //TODO get from createdEndpoint hns: hns, + + ready: ep.ready, + serving: ep.serving, + terminating: ep.terminating, }, nil } func (hns hnsV1) deleteEndpoint(hnsID string) error { @@ -178,7 +192,7 @@ func (hns hnsV1) getLoadBalancer(endpoints []endpointsInfo, flags loadBalancerFl } else if len(elbPolicy.VIPs) != 0 { continue } - LogJson(plist, "Found existing Hns loadbalancer policy resource", 1) + LogJson("policyList", plist, "Found existing Hns loadbalancer policy resource", 1) return &loadBalancerInfo{ hnsID: plist.ID, }, nil @@ -204,7 +218,7 @@ func (hns hnsV1) getLoadBalancer(endpoints []endpointsInfo, flags loadBalancerFl ) if err == nil { - LogJson(lb, "Hns loadbalancer policy resource", 1) + LogJson("policyList", lb, "Hns loadbalancer policy resource", 1) } else { return nil, err } @@ -223,7 +237,7 @@ func (hns hnsV1) deleteLoadBalancer(hnsID string) error { if err != nil { return err } - LogJson(hnsloadBalancer, "Removing Policy", 2) + LogJson("policyList", hnsloadBalancer, "Removing Policy", 2) _, err = hnsloadBalancer.Delete() return err diff --git a/vendor/k8s.io/kubernetes/pkg/proxy/winkernel/hnsV2.go b/vendor/k8s.io/kubernetes/pkg/proxy/winkernel/hnsV2.go index 54c6b92a01cc..298ad544f18b 100644 --- a/vendor/k8s.io/kubernetes/pkg/proxy/winkernel/hnsV2.go +++ b/vendor/k8s.io/kubernetes/pkg/proxy/winkernel/hnsV2.go @@ -201,7 +201,7 @@ func (hns hnsV2) getLoadBalancer(endpoints []endpointsInfo, flags loadBalancerFl } else if len(plist.FrontendVIPs) != 0 { continue } - LogJson(plist, "Found existing Hns loadbalancer policy resource", 1) + LogJson("policyList", plist, "Found existing Hns loadbalancer policy resource", 1) return &loadBalancerInfo{ hnsID: plist.Id, }, nil @@ -280,7 +280,7 @@ func (hns hnsV2) getLoadBalancer(endpoints []endpointsInfo, flags loadBalancerFl return nil, err } - LogJson(lb, "Hns loadbalancer policy resource", 1) + LogJson("hostComputeLoadBalancer", lb, "Hns loadbalancer policy resource", 1) return &loadBalancerInfo{ hnsID: lb.Id, diff --git a/vendor/k8s.io/kubernetes/pkg/proxy/winkernel/proxier.go b/vendor/k8s.io/kubernetes/pkg/proxy/winkernel/proxier.go index 47b449e37148..382d8023d736 100644 --- a/vendor/k8s.io/kubernetes/pkg/proxy/winkernel/proxier.go +++ b/vendor/k8s.io/kubernetes/pkg/proxy/winkernel/proxier.go @@ -24,6 +24,7 @@ import ( "net" "os" "strconv" + "strings" "sync" "sync/atomic" "time" @@ -36,6 +37,7 @@ import ( v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/intstr" + "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/wait" utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/client-go/tools/record" @@ -49,7 +51,6 @@ import ( "k8s.io/kubernetes/pkg/proxy/healthcheck" "k8s.io/kubernetes/pkg/proxy/metaproxier" "k8s.io/kubernetes/pkg/proxy/metrics" - utilproxy "k8s.io/kubernetes/pkg/proxy/util" "k8s.io/kubernetes/pkg/util/async" utilnet "k8s.io/utils/net" ) @@ -135,14 +136,16 @@ type remoteSubnetInfo struct { drMacAddress string } +const NETWORK_TYPE_OVERLAY = "overlay" + func Log(v interface{}, message string, level klog.Level) { - klog.V(level).Infof("%s, %s", message, spewSdump(v)) + klog.V(level).InfoS("%s", message, "spewConfig", spewSdump(v)) } -func LogJson(v interface{}, message string, level klog.Level) { +func LogJson(interfaceName string, v interface{}, message string, level klog.Level) { jsonString, err := json.Marshal(v) if err == nil { - klog.V(level).Infof("%s, %s", message, string(jsonString)) + klog.V(level).InfoS("%s", message, interfaceName, string(jsonString)) } } @@ -162,6 +165,11 @@ type endpointsInfo struct { refCount *uint16 providerAddress string hns HostNetworkService + + // conditions + ready bool + serving bool + terminating bool } // String is part of proxy.Endpoint interface. @@ -174,11 +182,31 @@ func (info *endpointsInfo) GetIsLocal() bool { return info.isLocal } +// IsReady returns true if an endpoint is ready and not terminating. +func (info *endpointsInfo) IsReady() bool { + return info.ready +} + +// IsServing returns true if an endpoint is ready, regardless of it's terminating state. +func (info *endpointsInfo) IsServing() bool { + return info.serving +} + +// IsTerminating returns true if an endpoint is terminating. +func (info *endpointsInfo) IsTerminating() bool { + return info.terminating +} + // GetTopology returns the topology information of the endpoint. func (info *endpointsInfo) GetTopology() map[string]string { return nil } +// GetZoneHint returns the zone hint for the endpoint. +func (info *endpointsInfo) GetZoneHints() sets.String { + return sets.String{} +} + // IP returns just the IP part of the endpoint, it's a part of proxy.Endpoint interface. func (info *endpointsInfo) IP() string { return info.ip @@ -227,15 +255,15 @@ func (proxier *Proxier) onEndpointsMapChange(svcPortName *proxy.ServicePortName) svcInfo, ok := svc.(*serviceInfo) if !ok { - klog.Errorf("Failed to cast serviceInfo %q", svcPortName.String()) + klog.ErrorS(nil, "Failed to cast serviceInfo", "svcPortName", svcPortName.String()) return } - klog.V(3).Infof("Endpoints are modified. Service [%v] is stale", *svcPortName) + klog.V(3).InfoS("Endpoints are modified. Service is stale", "svcPortName", svcPortName.String()) svcInfo.cleanupAllPolicies(proxier.endpointsMap[*svcPortName]) } else { // If no service exists, just cleanup the remote endpoints - klog.V(3).Infof("Endpoints are orphaned. Cleaning up") + klog.V(3).InfoS("Endpoints are orphaned. Cleaning up") // Cleanup Endpoints references epInfos, exists := proxier.endpointsMap[*svcPortName] @@ -274,11 +302,11 @@ func (proxier *Proxier) onServiceMapChange(svcPortName *proxy.ServicePortName) { svcInfo, ok := svc.(*serviceInfo) if !ok { - klog.Errorf("Failed to cast serviceInfo %q", svcPortName.String()) + klog.ErrorS(nil, "Failed to cast serviceInfo", "svcPortName", svcPortName.String()) return } - klog.V(3).Infof("Updating existing service port %q at %s:%d/%s", svcPortName, svcInfo.ClusterIP(), svcInfo.Port(), svcInfo.Protocol()) + klog.V(3).InfoS("Updating existing service port", "svcPortName", svcPortName.String(), "clusterIP", svcInfo.ClusterIP(), "port", svcInfo.Port(), "protocol", svcInfo.Protocol()) svcInfo.cleanupAllPolicies(proxier.endpointsMap[*svcPortName]) } } @@ -300,6 +328,10 @@ func (proxier *Proxier) newEndpointInfo(baseInfo *proxy.BaseEndpointInfo) proxy. refCount: new(uint16), hnsID: "", hns: proxier.hns, + + ready: baseInfo.Ready, + serving: baseInfo.Serving, + terminating: baseInfo.Terminating, } return info @@ -311,6 +343,10 @@ func newSourceVIP(hns HostNetworkService, network string, ip string, mac string, isLocal: true, macAddress: mac, providerAddress: providerAddress, + + ready: true, + serving: true, + terminating: false, } ep, err := hns.createEndpoint(hnsEndpoint, network) return ep, err @@ -325,12 +361,12 @@ func (ep *endpointsInfo) Cleanup() { // Never delete a Local Endpoint. Local Endpoints are already created by other entities. // Remove only remote endpoints created by this service if *ep.refCount <= 0 && !ep.GetIsLocal() { - klog.V(4).Infof("Removing endpoints for %v, since no one is referencing it", ep) + klog.V(4).InfoS("Removing endpoints, since no one is referencing it", "endpoint", ep.String()) err := ep.hns.deleteEndpoint(ep.hnsID) if err == nil { ep.hnsID = "" } else { - klog.Errorf("Endpoint deletion failed for %v: %v", ep.IP(), err) + klog.ErrorS(err, "Endpoint deletion failed", "ip", ep.IP()) } } @@ -374,7 +410,9 @@ func (proxier *Proxier) newServiceInfo(port *v1.ServicePort, service *v1.Service } for _, ingress := range service.Status.LoadBalancer.Ingress { - info.loadBalancerIngressIPs = append(info.loadBalancerIngressIPs, &loadBalancerIngressInfo{ip: ingress.IP}) + if net.ParseIP(ingress.IP) != nil { + info.loadBalancerIngressIPs = append(info.loadBalancerIngressIPs, &loadBalancerIngressInfo{ip: ingress.IP}) + } } return info } @@ -384,7 +422,7 @@ func (network hnsNetworkInfo) findRemoteSubnetProviderAddress(ip string) string for _, rs := range network.remoteSubnets { _, ipNet, err := net.ParseCIDR(rs.destinationPrefix) if err != nil { - klog.Fatalf("%v", err) + klog.ErrorS(err, "Failed to parse CIDR") } if ipNet.Contains(net.ParseIP(ip)) { providerAddress = rs.providerAddress @@ -415,7 +453,6 @@ type Proxier struct { mu sync.Mutex // protects the following fields serviceMap proxy.ServiceMap endpointsMap proxy.EndpointsMap - portsMap map[utilproxy.LocalPort]utilproxy.Closeable // endpointsSynced and servicesSynced are set to true when corresponding // objects are synced after startup. This is used to avoid updating hns policies // with some partial data after kube-proxy restart. @@ -497,12 +534,12 @@ func NewProxier( masqueradeMark := fmt.Sprintf("%#08x/%#08x", masqueradeValue, masqueradeValue) if nodeIP == nil { - klog.Warningf("invalid nodeIP, initializing kube-proxy with 127.0.0.1 as nodeIP") + klog.InfoS("invalid nodeIP, initializing kube-proxy with 127.0.0.1 as nodeIP") nodeIP = net.ParseIP("127.0.0.1") } if len(clusterCIDR) == 0 { - klog.Warningf("clusterCIDR not specified, unable to distinguish between internal and external traffic") + klog.InfoS("clusterCIDR not specified, unable to distinguish between internal and external traffic") } serviceHealthServer := healthcheck.NewServiceHealthServer(hostname, recorder) @@ -515,27 +552,27 @@ func NewProxier( hnsNetworkName := config.NetworkName if len(hnsNetworkName) == 0 { - klog.V(3).Infof("network-name flag not set. Checking environment variable") + klog.V(3).InfoS("network-name flag not set. Checking environment variable") hnsNetworkName = os.Getenv("KUBE_NETWORK") if len(hnsNetworkName) == 0 { return nil, fmt.Errorf("Environment variable KUBE_NETWORK and network-flag not initialized") } } - klog.V(3).Infof("Cleaning up old HNS policy lists") + klog.V(3).InfoS("Cleaning up old HNS policy lists") deleteAllHnsLoadBalancerPolicy() // Get HNS network information hnsNetworkInfo, err := hns.getNetworkByName(hnsNetworkName) for err != nil { - klog.Errorf("Unable to find HNS Network specified by %s. Please check network name and CNI deployment", hnsNetworkName) + klog.ErrorS(err, "Unable to find HNS Network specified. Please check network name and CNI deployment", "hnsNetworkName", hnsNetworkName) time.Sleep(1 * time.Second) hnsNetworkInfo, err = hns.getNetworkByName(hnsNetworkName) } // Network could have been detected before Remote Subnet Routes are applied or ManagementIP is updated // Sleep and update the network to include new information - if hnsNetworkInfo.networkType == "Overlay" { + if strings.EqualFold(hnsNetworkInfo.networkType, NETWORK_TYPE_OVERLAY) { time.Sleep(10 * time.Second) hnsNetworkInfo, err = hns.getNetworkByName(hnsNetworkName) if err != nil { @@ -543,7 +580,7 @@ func NewProxier( } } - klog.V(1).Infof("Hns Network loaded with info = %v", hnsNetworkInfo) + klog.V(1).InfoS("Hns Network loaded", "hnsNetworkInfo", hnsNetworkInfo) isDSR := config.EnableDSR if isDSR && !utilfeature.DefaultFeatureGate.Enabled(kubefeatures.WinDSR) { return nil, fmt.Errorf("WinDSR feature gate not enabled") @@ -555,7 +592,7 @@ func NewProxier( var sourceVip string var hostMac string - if hnsNetworkInfo.networkType == "Overlay" { + if strings.EqualFold(hnsNetworkInfo.networkType, NETWORK_TYPE_OVERLAY) { if !utilfeature.DefaultFeatureGate.Enabled(kubefeatures.WinOverlay) { return nil, fmt.Errorf("WinOverlay feature gate not enabled") } @@ -574,7 +611,7 @@ func NewProxier( for _, addr := range addresses { addrIP, _, _ := net.ParseCIDR(addr.String()) if addrIP.String() == nodeIP.String() { - klog.V(2).Infof("Host MAC address is %s", inter.HardwareAddr.String()) + klog.V(2).InfoS("record Host MAC address", "addr", inter.HardwareAddr.String()) hostMac = inter.HardwareAddr.String() } } @@ -588,7 +625,6 @@ func NewProxier( endpointSlicesEnabled := utilfeature.DefaultFeatureGate.Enabled(features.WindowsEndpointSliceProxying) proxier := &Proxier{ endPointsRefCount: make(endPointsReferenceCountMap), - portsMap: make(map[utilproxy.LocalPort]utilproxy.Closeable), serviceMap: make(proxy.ServiceMap), endpointsMap: make(proxy.EndpointsMap), masqueradeAll: masqueradeAll, @@ -618,7 +654,7 @@ func NewProxier( proxier.serviceChanges = serviceChanges burstSyncs := 2 - klog.V(3).Infof("minSyncPeriod: %v, syncPeriod: %v, burstSyncs: %d", minSyncPeriod, syncPeriod, burstSyncs) + klog.V(3).InfoS("record sync param", "minSyncPeriod", minSyncPeriod, "syncPeriod", syncPeriod, "burstSyncs", burstSyncs) proxier.syncRunner = async.NewBoundedFrequencyRunner("sync-runner", proxier.syncProxyRules, minSyncPeriod, syncPeriod, burstSyncs) return proxier, nil } @@ -709,10 +745,10 @@ func deleteAllHnsLoadBalancerPolicy() { return } for _, plist := range plists { - LogJson(plist, "Remove Policy", 3) + LogJson("policyList", plist, "Remove Policy", 3) _, err = plist.Delete() if err != nil { - klog.Errorf("%v", err) + klog.ErrorS(err, "Failed to delete policy list") } } @@ -721,7 +757,7 @@ func deleteAllHnsLoadBalancerPolicy() { func getHnsNetworkInfo(hnsNetworkName string) (*hnsNetworkInfo, error) { hnsnetwork, err := hcsshim.GetHNSNetworkByName(hnsNetworkName) if err != nil { - klog.Errorf("%v", err) + klog.ErrorS(err, "Failed to get HNS Network by name") return nil, err } @@ -803,12 +839,12 @@ func (proxier *Proxier) OnServiceSynced() { func shouldSkipService(svcName types.NamespacedName, service *v1.Service) bool { // if ClusterIP is "None" or empty, skip proxying if !helper.IsServiceIPSet(service) { - klog.V(3).Infof("Skipping service %s due to clusterIP = %q", svcName, service.Spec.ClusterIP) + klog.V(3).InfoS("Skipping service due to clusterIP", "svcName", svcName.String(), "clusterIP", service.Spec.ClusterIP) return true } // Even if ClusterIP is set, ServiceTypeExternalName services don't get proxied if service.Spec.Type == v1.ServiceTypeExternalName { - klog.V(3).Infof("Skipping service %s due to Type=ExternalName", svcName) + klog.V(3).InfoS("Skipping service due to Type=ExternalName", "svcName", svcName.String()) return true } return false @@ -887,7 +923,7 @@ func (proxier *Proxier) cleanupAllPolicies() { for svcName, svc := range proxier.serviceMap { svcInfo, ok := svc.(*serviceInfo) if !ok { - klog.Errorf("Failed to cast serviceInfo %q", svcName.String()) + klog.ErrorS(nil, "Failed to cast serviceInfo", "svcName", svcName.String()) continue } svcInfo.cleanupAllPolicies(proxier.endpointsMap[svcName]) @@ -916,11 +952,11 @@ func (proxier *Proxier) syncProxyRules() { start := time.Now() defer func() { SyncProxyRulesLatency.Observe(metrics.SinceInSeconds(start)) - klog.V(4).Infof("syncProxyRules took %v", time.Since(start)) + klog.V(4).InfoS("syncProxyRules complete", "elapsed", time.Since(start)) }() // don't sync rules till we've received services and endpoints if !proxier.isInitialized() { - klog.V(2).Info("Not syncing hns until Services and Endpoints have been received from master") + klog.V(2).InfoS("Not syncing hns until Services and Endpoints have been received from master") return } @@ -930,7 +966,7 @@ func (proxier *Proxier) syncProxyRules() { prevNetworkID := proxier.network.id updatedNetwork, err := hns.getNetworkByName(hnsNetworkName) if updatedNetwork == nil || updatedNetwork.id != prevNetworkID || isNetworkNotFoundError(err) { - klog.Infof("The HNS network %s is not present or has changed since the last sync. Please check the CNI deployment", hnsNetworkName) + klog.InfoS("The HNS network %s is not present or has changed since the last sync. Please check the CNI deployment", "hnsNetworkName", hnsNetworkName) proxier.cleanupAllPolicies() if updatedNetwork != nil { proxier.network = *updatedNetwork @@ -941,48 +977,48 @@ func (proxier *Proxier) syncProxyRules() { // We assume that if this was called, we really want to sync them, // even if nothing changed in the meantime. In other words, callers are // responsible for detecting no-op changes and not calling this function. - serviceUpdateResult := proxy.UpdateServiceMap(proxier.serviceMap, proxier.serviceChanges) + serviceUpdateResult := proxier.serviceMap.Update(proxier.serviceChanges) endpointUpdateResult := proxier.endpointsMap.Update(proxier.endpointsChanges) staleServices := serviceUpdateResult.UDPStaleClusterIP // merge stale services gathered from updateEndpointsMap for _, svcPortName := range endpointUpdateResult.StaleServiceNames { if svcInfo, ok := proxier.serviceMap[svcPortName]; ok && svcInfo != nil && svcInfo.Protocol() == v1.ProtocolUDP { - klog.V(2).Infof("Stale udp service %v -> %s", svcPortName, svcInfo.ClusterIP().String()) + klog.V(2).InfoS("Stale udp service", "svcPortName", svcPortName.String(), "clusterIP", svcInfo.ClusterIP().String()) staleServices.Insert(svcInfo.ClusterIP().String()) } } - if proxier.network.networkType == "Overlay" { + if strings.EqualFold(proxier.network.networkType, NETWORK_TYPE_OVERLAY) { existingSourceVip, err := hns.getEndpointByIpAddress(proxier.sourceVip, hnsNetworkName) if existingSourceVip == nil { _, err = newSourceVIP(hns, hnsNetworkName, proxier.sourceVip, proxier.hostMac, proxier.nodeIP.String()) } if err != nil { - klog.Errorf("Source Vip endpoint creation failed: %v", err) + klog.ErrorS(err, "Source Vip endpoint creation failed") return } } - klog.V(3).Infof("Syncing Policies") + klog.V(3).InfoS("Syncing Policies") // Program HNS by adding corresponding policies for each service. for svcName, svc := range proxier.serviceMap { svcInfo, ok := svc.(*serviceInfo) if !ok { - klog.Errorf("Failed to cast serviceInfo %q", svcName.String()) + klog.ErrorS(nil, "Failed to cast serviceInfo", "svcName", svcName.String()) continue } if svcInfo.policyApplied { - klog.V(4).Infof("Policy already applied for %s", spewSdump(svcInfo)) + klog.V(4).InfoS("Policy already applied", "spewConfig", spewSdump(svcInfo)) continue } - if proxier.network.networkType == "Overlay" { + if strings.EqualFold(proxier.network.networkType, NETWORK_TYPE_OVERLAY) { serviceVipEndpoint, _ := hns.getEndpointByIpAddress(svcInfo.ClusterIP().String(), hnsNetworkName) if serviceVipEndpoint == nil { - klog.V(4).Infof("No existing remote endpoint for service VIP %v", svcInfo.ClusterIP().String()) + klog.V(4).InfoS("No existing remote endpoint", "ip", svcInfo.ClusterIP().String()) hnsEndpoint := &endpointsInfo{ ip: svcInfo.ClusterIP().String(), isLocal: false, @@ -992,7 +1028,7 @@ func (proxier *Proxier) syncProxyRules() { newHnsEndpoint, err := hns.createEndpoint(hnsEndpoint, hnsNetworkName) if err != nil { - klog.Errorf("Remote endpoint creation failed for service VIP: %v", err) + klog.ErrorS(err, "Remote endpoint creation failed for service VIP") continue } @@ -1004,16 +1040,19 @@ func (proxier *Proxier) syncProxyRules() { var hnsEndpoints []endpointsInfo var hnsLocalEndpoints []endpointsInfo - klog.V(4).Infof("====Applying Policy for %s====", svcName) + klog.V(4).InfoS("Applying Policy", "serviceInfo", svcName.String()) // Create Remote endpoints for every endpoint, corresponding to the service containsPublicIP := false containsNodeIP := false for _, epInfo := range proxier.endpointsMap[svcName] { - ep, ok := epInfo.(*endpointsInfo) if !ok { - klog.Errorf("Failed to cast endpointsInfo %q", svcName.String()) + klog.ErrorS(nil, "Failed to cast endpointsInfo", "svcName", svcName.String()) + continue + } + + if !ep.IsReady() { continue } @@ -1040,23 +1079,23 @@ func (proxier *Proxier) syncProxyRules() { } if newHnsEndpoint == nil { if ep.GetIsLocal() { - klog.Errorf("Local endpoint not found for %v: err: %v on network %s", ep.IP(), err, hnsNetworkName) + klog.ErrorS(err, "Local endpoint not found: on network", "ip", ep.IP(), "hnsNetworkName", hnsNetworkName) continue } - if proxier.network.networkType == "Overlay" { - klog.Infof("Updating network %v to check for new remote subnet policies", proxier.network.name) + if strings.EqualFold(proxier.network.networkType, NETWORK_TYPE_OVERLAY) { + klog.InfoS("Updating network to check for new remote subnet policies", "networkName", proxier.network.name) networkName := proxier.network.name updatedNetwork, err := hns.getNetworkByName(networkName) if err != nil { - klog.Errorf("Unable to find HNS Network specified by %s. Please check network name and CNI deployment", hnsNetworkName) + klog.ErrorS(err, "Unable to find HNS Network specified. Please check network name and CNI deployment", "hnsNetworkName", hnsNetworkName) proxier.cleanupAllPolicies() return } proxier.network = *updatedNetwork providerAddress := proxier.network.findRemoteSubnetProviderAddress(ep.IP()) if len(providerAddress) == 0 { - klog.Infof("Could not find provider address for %s. Assuming it is a public IP", ep.IP()) + klog.InfoS("Could not find provider address. Assuming it is a public IP", "ip", ep.IP()) providerAddress = proxier.nodeIP.String() } @@ -1069,7 +1108,7 @@ func (proxier *Proxier) syncProxyRules() { newHnsEndpoint, err = hns.createEndpoint(hnsEndpoint, hnsNetworkName) if err != nil { - klog.Errorf("Remote endpoint creation failed: %v, %s", err, spewSdump(hnsEndpoint)) + klog.ErrorS(err, "Remote endpoint creation failed", "spewConfig", spewSdump(hnsEndpoint)) continue } } else { @@ -1082,7 +1121,7 @@ func (proxier *Proxier) syncProxyRules() { newHnsEndpoint, err = hns.createEndpoint(hnsEndpoint, hnsNetworkName) if err != nil { - klog.Errorf("Remote endpoint creation failed: %v", err) + klog.ErrorS(err, "Remote endpoint creation failed") continue } } @@ -1099,19 +1138,19 @@ func (proxier *Proxier) syncProxyRules() { // a) Endpoints are any IP's outside the cluster ==> Choose NodeIP as the SourceVIP // b) Endpoints are IP addresses of a remote node => Choose NodeIP as the SourceVIP // c) Everything else (Local POD's, Remote POD's, Node IP of current node) ==> Choose the configured SourceVIP - if proxier.network.networkType == "Overlay" && !ep.GetIsLocal() { + if strings.EqualFold(proxier.network.networkType, NETWORK_TYPE_OVERLAY) && !ep.GetIsLocal() { providerAddress := proxier.network.findRemoteSubnetProviderAddress(ep.IP()) isNodeIP := (ep.IP() == providerAddress) isPublicIP := (len(providerAddress) == 0) - klog.Infof("Endpoint %s on overlay network %s is classified as NodeIp: %v, Public Ip: %v", ep.IP(), hnsNetworkName, isNodeIP, isPublicIP) + klog.InfoS("Endpoint on overlay network", "ip", ep.IP(), "hnsNetworkName", hnsNetworkName, "isNodeIP", isNodeIP, "isPublicIP", isPublicIP) containsNodeIP = containsNodeIP || isNodeIP containsPublicIP = containsPublicIP || isPublicIP } // Save the hnsId for reference - LogJson(newHnsEndpoint, "Hns Endpoint resource", 1) + LogJson("endpointInfo", newHnsEndpoint, "Hns Endpoint resource", 1) hnsEndpoints = append(hnsEndpoints, *newHnsEndpoint) if newHnsEndpoint.GetIsLocal() { hnsLocalEndpoints = append(hnsLocalEndpoints, *newHnsEndpoint) @@ -1126,19 +1165,19 @@ func (proxier *Proxier) syncProxyRules() { Log(ep, "Endpoint resource found", 3) } - klog.V(3).Infof("Associated endpoints [%s] for service [%s]", spewSdump(hnsEndpoints), svcName) + klog.V(3).InfoS("Associated endpoints for service", "spewConfig", spewSdump(hnsEndpoints), "svcName", svcName.String()) if len(svcInfo.hnsID) > 0 { // This should not happen - klog.Warningf("Load Balancer already exists %s -- Debug ", svcInfo.hnsID) + klog.InfoS("Load Balancer already exists -- Debug ", "hnsID", svcInfo.hnsID) } if len(hnsEndpoints) == 0 { - klog.Errorf("Endpoint information not available for service %s. Not applying any policy", svcName) + klog.ErrorS(nil, "Endpoint information not available for service. Not applying any policy", "svcName", svcName.String()) continue } - klog.V(4).Infof("Trying to Apply Policies for service %s", spewSdump(svcInfo)) + klog.V(4).Infof("Trying to Apply Policies for service", "spewConfig", spewSdump(svcInfo)) var hnsLoadBalancer *loadBalancerInfo var sourceVip = proxier.sourceVip if containsPublicIP || containsNodeIP { @@ -1147,7 +1186,7 @@ func (proxier *Proxier) syncProxyRules() { sessionAffinityClientIP := svcInfo.SessionAffinityType() == v1.ServiceAffinityClientIP if sessionAffinityClientIP && !proxier.supportedFeatures.SessionAffinity { - klog.Warningf("Session Affinity is not supported on this version of Windows.") + klog.InfoS("Session Affinity is not supported on this version of Windows.") } hnsLoadBalancer, err := hns.getLoadBalancer( @@ -1160,12 +1199,12 @@ func (proxier *Proxier) syncProxyRules() { uint16(svcInfo.Port()), ) if err != nil { - klog.Errorf("Policy creation failed: %v", err) + klog.ErrorS(err, "Policy creation failed") continue } svcInfo.hnsID = hnsLoadBalancer.hnsID - klog.V(3).Infof("Hns LoadBalancer resource created for cluster ip resources %v, Id [%s]", svcInfo.ClusterIP(), hnsLoadBalancer.hnsID) + klog.V(3).InfoS("Hns LoadBalancer resource created for cluster ip resources", "clusterIP", svcInfo.ClusterIP(), "hnsID", hnsLoadBalancer.hnsID) // If nodePort is specified, user should be able to use nodeIP:nodePort to reach the backend endpoints if svcInfo.NodePort() > 0 { @@ -1185,12 +1224,12 @@ func (proxier *Proxier) syncProxyRules() { uint16(svcInfo.NodePort()), ) if err != nil { - klog.Errorf("Policy creation failed: %v", err) + klog.ErrorS(err, "Policy creation failed") continue } svcInfo.nodePorthnsID = hnsLoadBalancer.hnsID - klog.V(3).Infof("Hns LoadBalancer resource created for nodePort resources %v, Id [%s]", svcInfo.ClusterIP(), hnsLoadBalancer.hnsID) + klog.V(3).InfoS("Hns LoadBalancer resource created for nodePort resources", "clusterIP", svcInfo.ClusterIP(), "hnsID", hnsLoadBalancer.hnsID) } // Create a Load Balancer Policy for each external IP @@ -1211,11 +1250,11 @@ func (proxier *Proxier) syncProxyRules() { uint16(svcInfo.Port()), ) if err != nil { - klog.Errorf("Policy creation failed: %v", err) + klog.ErrorS(err, "Policy creation failed", err) continue } externalIP.hnsID = hnsLoadBalancer.hnsID - klog.V(3).Infof("Hns LoadBalancer resource created for externalIP resources %v, Id[%s]", externalIP, hnsLoadBalancer.hnsID) + klog.V(3).InfoS("Hns LoadBalancer resource created for externalIP resources", "externalIP", externalIP, "hnsID", hnsLoadBalancer.hnsID) } // Create a Load Balancer Policy for each loadbalancer ingress for _, lbIngressIP := range svcInfo.loadBalancerIngressIPs { @@ -1234,11 +1273,11 @@ func (proxier *Proxier) syncProxyRules() { uint16(svcInfo.Port()), ) if err != nil { - klog.Errorf("Policy creation failed: %v", err) + klog.ErrorS(err, "Policy creation failed") continue } lbIngressIP.hnsID = hnsLoadBalancer.hnsID - klog.V(3).Infof("Hns LoadBalancer resource created for loadBalancer Ingress resources %v", lbIngressIP) + klog.V(3).InfoS("Hns LoadBalancer resource created for loadBalancer Ingress resources", "lbIngressIP", lbIngressIP) } svcInfo.policyApplied = true Log(svcInfo, "+++Policy Successfully applied for service +++", 2) @@ -1253,17 +1292,17 @@ func (proxier *Proxier) syncProxyRules() { // not "OnlyLocal", but the services list will not, and the serviceHealthServer // will just drop those endpoints. if err := proxier.serviceHealthServer.SyncServices(serviceUpdateResult.HCServiceNodePorts); err != nil { - klog.Errorf("Error syncing healthcheck services: %v", err) + klog.ErrorS(err, "Error syncing healthcheck services") } if err := proxier.serviceHealthServer.SyncEndpoints(endpointUpdateResult.HCEndpointsLocalIPSize); err != nil { - klog.Errorf("Error syncing healthcheck endpoints: %v", err) + klog.ErrorS(err, "Error syncing healthcheck endpoints") } // Finish housekeeping. // TODO: these could be made more consistent. for _, svcIP := range staleServices.UnsortedList() { // TODO : Check if this is required to cleanup stale services here - klog.V(5).Infof("Pending delete stale service IP %s connections", svcIP) + klog.V(5).InfoS("Pending delete stale service IP connections", "ip", svcIP) } // remove stale endpoint refcount entries diff --git a/vendor/k8s.io/kubernetes/pkg/proxy/winuserspace/BUILD b/vendor/k8s.io/kubernetes/pkg/proxy/winuserspace/BUILD deleted file mode 100644 index 1b6df844031c..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/proxy/winuserspace/BUILD +++ /dev/null @@ -1,66 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "loadbalancer.go", - "proxier.go", - "proxysocket.go", - "roundrobin.go", - "types.go", - ], - importpath = "k8s.io/kubernetes/pkg/proxy/winuserspace", - deps = [ - "//pkg/apis/core/v1/helper:go_default_library", - "//pkg/proxy:go_default_library", - "//pkg/proxy/config:go_default_library", - "//pkg/proxy/util:go_default_library", - "//pkg/util/ipconfig:go_default_library", - "//pkg/util/netsh:go_default_library", - "//pkg/util/slice:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//vendor/github.com/miekg/dns:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "proxier_test.go", - "roundrobin_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/proxy:go_default_library", - "//pkg/util/netsh/testing:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/discovery/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/proxy/winuserspace/proxier.go b/vendor/k8s.io/kubernetes/pkg/proxy/winuserspace/proxier.go index 1fd1fcbaaa33..5991d12aa8e8 100644 --- a/vendor/k8s.io/kubernetes/pkg/proxy/winuserspace/proxier.go +++ b/vendor/k8s.io/kubernetes/pkg/proxy/winuserspace/proxier.go @@ -71,7 +71,7 @@ func (info *serviceInfo) isAlive() bool { func logTimeout(err error) bool { if e, ok := err.(net.Error); ok { if e.Timeout() { - klog.V(3).Infof("connection to endpoint closed due to inactivity") + klog.V(3).InfoS("connection to endpoint closed due to inactivity") return true } } @@ -124,7 +124,7 @@ func NewProxier(loadBalancer LoadBalancer, listenIP net.IP, netsh netsh.Interfac return nil, fmt.Errorf("failed to select a host interface: %v", err) } - klog.V(2).Infof("Setting proxy IP to %v", hostIP) + klog.V(2).InfoS("Setting proxy", "ip", hostIP) return createProxier(loadBalancer, listenIP, netsh, hostIP, syncPeriod, udpIdleTimeout) } @@ -150,7 +150,7 @@ func (proxier *Proxier) SyncLoop() { defer t.Stop() for { <-t.C - klog.V(6).Infof("Periodic sync") + klog.V(6).InfoS("Periodic sync") proxier.Sync() } } @@ -217,7 +217,7 @@ func (proxier *Proxier) addServicePortPortal(servicePortPortalName ServicePortPo if existed, err := proxier.netsh.EnsureIPAddress(args, serviceIP); err != nil { return nil, err } else if !existed { - klog.V(3).Infof("Added ip address to fowarder interface for service %q at %s/%s", servicePortPortalName, net.JoinHostPort(listenIP, strconv.Itoa(port)), protocol) + klog.V(3).InfoS("Added ip address to fowarder interface for service", "servicePortPortalName", servicePortPortalName.String(), "addr", net.JoinHostPort(listenIP, strconv.Itoa(port)), "protocol", protocol) } } @@ -242,7 +242,7 @@ func (proxier *Proxier) addServicePortPortal(servicePortPortalName ServicePortPo } proxier.setServiceInfo(servicePortPortalName, si) - klog.V(2).Infof("Proxying for service %q at %s/%s", servicePortPortalName, net.JoinHostPort(listenIP, strconv.Itoa(port)), protocol) + klog.V(2).InfoS("Proxying for service", "servicePortPortalName", servicePortPortalName.String(), "addr", net.JoinHostPort(listenIP, strconv.Itoa(port)), "protocol", protocol) go func(service ServicePortPortalName, proxier *Proxier) { defer runtime.HandleCrash() atomic.AddInt32(&proxier.numProxyLoops, 1) @@ -296,7 +296,7 @@ func (proxier *Proxier) mergeService(service *v1.Service) map[ServicePortPortalN } svcName := types.NamespacedName{Namespace: service.Namespace, Name: service.Name} if !helper.IsServiceIPSet(service) { - klog.V(3).Infof("Skipping service %s due to clusterIP = %q", svcName, service.Spec.ClusterIP) + klog.V(3).InfoS("Skipping service due to clusterIP", "svcName", svcName, "ip", service.Spec.ClusterIP) return nil } existingPortPortals := make(map[ServicePortPortalName]bool) @@ -320,19 +320,19 @@ func (proxier *Proxier) mergeService(service *v1.Service) map[ServicePortPortalN continue } if exists { - klog.V(4).Infof("Something changed for service %q: stopping it", servicePortPortalName) + klog.V(4).InfoS("Something changed for service: stopping it", "servicePortPortalName", servicePortPortalName.String()) if err := proxier.closeServicePortPortal(servicePortPortalName, info); err != nil { - klog.Errorf("Failed to close service port portal %q: %v", servicePortPortalName, err) + klog.ErrorS(err, "Failed to close service port portal", "servicePortPortalName", servicePortPortalName.String()) } } - klog.V(1).Infof("Adding new service %q at %s/%s", servicePortPortalName, net.JoinHostPort(listenIP, strconv.Itoa(listenPort)), protocol) + klog.V(1).InfoS("Adding new service", "servicePortPortalName", servicePortPortalName.String(), "addr", net.JoinHostPort(listenIP, strconv.Itoa(listenPort)), "protocol", protocol) info, err := proxier.addServicePortPortal(servicePortPortalName, protocol, listenIP, listenPort, proxier.udpIdleTimeout) if err != nil { - klog.Errorf("Failed to start proxy for %q: %v", servicePortPortalName, err) + klog.ErrorS(err, "Failed to start proxy", "servicePortPortalName", servicePortPortalName.String()) continue } info.sessionAffinityType = service.Spec.SessionAffinity - klog.V(10).Infof("info: %#v", info) + klog.V(10).InfoS("record serviceInfo", "info", info) } if len(listenIPPortMap) > 0 { // only one loadbalancer per service port portal @@ -360,7 +360,7 @@ func (proxier *Proxier) unmergeService(service *v1.Service, existingPortPortals } svcName := types.NamespacedName{Namespace: service.Namespace, Name: service.Name} if !helper.IsServiceIPSet(service) { - klog.V(3).Infof("Skipping service %s due to clusterIP = %q", svcName, service.Spec.ClusterIP) + klog.V(3).InfoS("Skipping service due to clusterIP", "svcName", svcName, "ip", service.Spec.ClusterIP) return } @@ -392,15 +392,15 @@ func (proxier *Proxier) unmergeService(service *v1.Service, existingPortPortals continue } - klog.V(1).Infof("Stopping service %q", servicePortPortalName) + klog.V(1).InfoS("Stopping service", "servicePortPortalName", servicePortPortalName.String()) info, exists := proxier.getServiceInfo(servicePortPortalName) if !exists { - klog.Errorf("Service %q is being removed but doesn't exist", servicePortPortalName) + klog.ErrorS(nil, "Service is being removed but doesn't exist", "servicePortPortalName", servicePortPortalName.String()) continue } if err := proxier.closeServicePortPortal(servicePortPortalName, info); err != nil { - klog.Errorf("Failed to close service port portal %q: %v", servicePortPortalName, err) + klog.ErrorS(err, "Failed to close service port portal", "servicePortPortalName", servicePortPortalName) } } diff --git a/vendor/k8s.io/kubernetes/pkg/quota/v1/evaluator/core/BUILD b/vendor/k8s.io/kubernetes/pkg/quota/v1/evaluator/core/BUILD deleted file mode 100644 index 63d948d83087..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/quota/v1/evaluator/core/BUILD +++ /dev/null @@ -1,71 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "persistent_volume_claims.go", - "pods.go", - "registry.go", - "services.go", - ], - importpath = "k8s.io/kubernetes/pkg/quota/v1/evaluator/core", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/v1:go_default_library", - "//pkg/apis/core/v1/helper:go_default_library", - "//pkg/apis/core/v1/helper/qos:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/quota/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/quota/v1/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "persistent_volume_claims_test.go", - "pods_test.go", - "services_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/util/node:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/quota/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/quota/v1/generic:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/quota/v1/evaluator/core/persistent_volume_claims.go b/vendor/k8s.io/kubernetes/pkg/quota/v1/evaluator/core/persistent_volume_claims.go index 41996d7afa1f..a8caa892439c 100644 --- a/vendor/k8s.io/kubernetes/pkg/quota/v1/evaluator/core/persistent_volume_claims.go +++ b/vendor/k8s.io/kubernetes/pkg/quota/v1/evaluator/core/persistent_volume_claims.go @@ -28,9 +28,9 @@ import ( quota "k8s.io/apiserver/pkg/quota/v1" "k8s.io/apiserver/pkg/quota/v1/generic" utilfeature "k8s.io/apiserver/pkg/util/feature" + storagehelpers "k8s.io/component-helpers/storage/volume" api "k8s.io/kubernetes/pkg/apis/core" k8s_api_v1 "k8s.io/kubernetes/pkg/apis/core/v1" - "k8s.io/kubernetes/pkg/apis/core/v1/helper" k8sfeatures "k8s.io/kubernetes/pkg/features" ) @@ -153,7 +153,7 @@ func (p *pvcEvaluator) Usage(item runtime.Object) (corev1.ResourceList, error) { // charge for claim result[corev1.ResourcePersistentVolumeClaims] = *(resource.NewQuantity(1, resource.DecimalSI)) result[pvcObjectCountName] = *(resource.NewQuantity(1, resource.DecimalSI)) - storageClassRef := helper.GetPersistentVolumeClaimClass(pvc) + storageClassRef := storagehelpers.GetPersistentVolumeClaimClass(pvc) if len(storageClassRef) > 0 { storageClassClaim := corev1.ResourceName(storageClassRef + storageClassSuffix + string(corev1.ResourcePersistentVolumeClaims)) result[storageClassClaim] = *(resource.NewQuantity(1, resource.DecimalSI)) diff --git a/vendor/k8s.io/kubernetes/pkg/quota/v1/evaluator/core/pods.go b/vendor/k8s.io/kubernetes/pkg/quota/v1/evaluator/core/pods.go index ede379ca63b2..6051d24eb85a 100644 --- a/vendor/k8s.io/kubernetes/pkg/quota/v1/evaluator/core/pods.go +++ b/vendor/k8s.io/kubernetes/pkg/quota/v1/evaluator/core/pods.go @@ -26,16 +26,17 @@ import ( "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/apimachinery/pkg/util/clock" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apiserver/pkg/admission" quota "k8s.io/apiserver/pkg/quota/v1" "k8s.io/apiserver/pkg/quota/v1/generic" + "k8s.io/apiserver/pkg/util/feature" api "k8s.io/kubernetes/pkg/apis/core" k8s_api_v1 "k8s.io/kubernetes/pkg/apis/core/v1" "k8s.io/kubernetes/pkg/apis/core/v1/helper" "k8s.io/kubernetes/pkg/apis/core/v1/helper/qos" + "k8s.io/kubernetes/pkg/features" ) // the name used for object count quota @@ -308,6 +309,8 @@ func podMatchesScopeFunc(selector corev1.ScopedResourceSelectorRequirement, obje return !isBestEffort(pod), nil case corev1.ResourceQuotaScopePriorityClass: return podMatchesSelector(pod, selector) + case corev1.ResourceQuotaScopeCrossNamespacePodAffinity: + return usesCrossNamespacePodAffinity(pod), nil } return false, nil } @@ -351,6 +354,10 @@ func PodUsageFunc(obj runtime.Object, clock clock.Clock) (corev1.ResourceList, e limits = quota.Max(limits, pod.Spec.InitContainers[i].Resources.Limits) } + if feature.DefaultFeatureGate.Enabled(features.PodOverhead) { + requests = quota.Add(requests, pod.Spec.Overhead) + limits = quota.Add(limits, pod.Spec.Overhead) + } result = quota.Add(result, podComputeUsageHelper(requests, limits)) return result, nil } @@ -381,6 +388,59 @@ func podMatchesSelector(pod *corev1.Pod, selector corev1.ScopedResourceSelectorR return false, nil } +func crossNamespacePodAffinityTerm(term *corev1.PodAffinityTerm) bool { + return len(term.Namespaces) != 0 || term.NamespaceSelector != nil +} + +func crossNamespacePodAffinityTerms(terms []corev1.PodAffinityTerm) bool { + for _, t := range terms { + if crossNamespacePodAffinityTerm(&t) { + return true + } + } + return false +} + +func crossNamespaceWeightedPodAffinityTerms(terms []corev1.WeightedPodAffinityTerm) bool { + for _, t := range terms { + if crossNamespacePodAffinityTerm(&t.PodAffinityTerm) { + return true + } + } + return false +} + +func usesCrossNamespacePodAffinity(pod *corev1.Pod) bool { + if !feature.DefaultFeatureGate.Enabled(features.PodAffinityNamespaceSelector) { + return false + } + if pod == nil || pod.Spec.Affinity == nil { + return false + } + + affinity := pod.Spec.Affinity.PodAffinity + if affinity != nil { + if crossNamespacePodAffinityTerms(affinity.RequiredDuringSchedulingIgnoredDuringExecution) { + return true + } + if crossNamespaceWeightedPodAffinityTerms(affinity.PreferredDuringSchedulingIgnoredDuringExecution) { + return true + } + } + + antiAffinity := pod.Spec.Affinity.PodAntiAffinity + if antiAffinity != nil { + if crossNamespacePodAffinityTerms(antiAffinity.RequiredDuringSchedulingIgnoredDuringExecution) { + return true + } + if crossNamespaceWeightedPodAffinityTerms(antiAffinity.PreferredDuringSchedulingIgnoredDuringExecution) { + return true + } + } + + return false +} + // QuotaV1Pod returns true if the pod is eligible to track against a quota // if it's not in a terminal state according to its phase. func QuotaV1Pod(pod *corev1.Pod, clock clock.Clock) bool { diff --git a/vendor/k8s.io/kubernetes/pkg/quota/v1/evaluator/core/services.go b/vendor/k8s.io/kubernetes/pkg/quota/v1/evaluator/core/services.go index d90afe0b4f8b..ab5c8a9f48e7 100644 --- a/vendor/k8s.io/kubernetes/pkg/quota/v1/evaluator/core/services.go +++ b/vendor/k8s.io/kubernetes/pkg/quota/v1/evaluator/core/services.go @@ -26,8 +26,10 @@ import ( "k8s.io/apiserver/pkg/admission" quota "k8s.io/apiserver/pkg/quota/v1" "k8s.io/apiserver/pkg/quota/v1/generic" + "k8s.io/apiserver/pkg/util/feature" api "k8s.io/kubernetes/pkg/apis/core" k8s_api_v1 "k8s.io/kubernetes/pkg/apis/core/v1" + "k8s.io/kubernetes/pkg/features" ) // the name used for object count quota @@ -128,14 +130,33 @@ func (p *serviceEvaluator) Usage(item runtime.Object) (corev1.ResourceList, erro value := resource.NewQuantity(int64(ports), resource.DecimalSI) result[corev1.ResourceServicesNodePorts] = *value case corev1.ServiceTypeLoadBalancer: - // load balancer services need to count node ports and load balancers - value := resource.NewQuantity(int64(ports), resource.DecimalSI) - result[corev1.ResourceServicesNodePorts] = *value + // load balancer services need to count node ports. If creation of node ports + // is suppressed only ports with explicit NodePort values are counted. + // nodeports won't be allocated yet, so we can't simply count the actual values. + // We need to look at the intent. + if feature.DefaultFeatureGate.Enabled(features.ServiceLBNodePortControl) && + svc.Spec.AllocateLoadBalancerNodePorts != nil && + *svc.Spec.AllocateLoadBalancerNodePorts == false { + result[corev1.ResourceServicesNodePorts] = *portsWithNodePorts(svc) + } else { + value := resource.NewQuantity(int64(ports), resource.DecimalSI) + result[corev1.ResourceServicesNodePorts] = *value + } result[corev1.ResourceServicesLoadBalancers] = *(resource.NewQuantity(1, resource.DecimalSI)) } return result, nil } +func portsWithNodePorts(svc *corev1.Service) *resource.Quantity { + count := 0 + for _, p := range svc.Spec.Ports { + if p.NodePort != 0 { + count++ + } + } + return resource.NewQuantity(int64(count), resource.DecimalSI) +} + // UsageStats calculates aggregate usage for the object. func (p *serviceEvaluator) UsageStats(options quota.UsageStatsOptions) (quota.UsageStats, error) { return generic.CalculateUsageStats(options, p.listFuncByNamespace, generic.MatchesNoScopeFunc, p.Usage) diff --git a/vendor/k8s.io/kubernetes/pkg/quota/v1/install/BUILD b/vendor/k8s.io/kubernetes/pkg/quota/v1/install/BUILD deleted file mode 100644 index 66fecf77b4ff..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/quota/v1/install/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["registry.go"], - importpath = "k8s.io/kubernetes/pkg/quota/v1/install", - deps = [ - "//pkg/quota/v1/evaluator/core:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/quota/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/quota/v1/generic:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/admissionregistration/mutatingwebhookconfiguration/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/admissionregistration/mutatingwebhookconfiguration/BUILD deleted file mode 100644 index 978148847e08..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/admissionregistration/mutatingwebhookconfiguration/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "strategy.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/admissionregistration/mutatingwebhookconfiguration", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/admissionregistration:go_default_library", - "//pkg/apis/admissionregistration/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/admissionregistration/mutatingwebhookconfiguration/storage:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/admissionregistration/mutatingwebhookconfiguration/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/admissionregistration/mutatingwebhookconfiguration/storage/BUILD deleted file mode 100644 index 1caa89ef5fd4..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/admissionregistration/mutatingwebhookconfiguration/storage/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/admissionregistration/mutatingwebhookconfiguration/storage", - deps = [ - "//pkg/apis/admissionregistration:go_default_library", - "//pkg/printers:go_default_library", - "//pkg/printers/internalversion:go_default_library", - "//pkg/printers/storage:go_default_library", - "//pkg/registry/admissionregistration/mutatingwebhookconfiguration:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/admissionregistration/rest/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/admissionregistration/rest/BUILD deleted file mode 100644 index 8827479c7736..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/admissionregistration/rest/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["storage_apiserver.go"], - importpath = "k8s.io/kubernetes/pkg/registry/admissionregistration/rest", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/admissionregistration:go_default_library", - "//pkg/registry/admissionregistration/mutatingwebhookconfiguration/storage:go_default_library", - "//pkg/registry/admissionregistration/validatingwebhookconfiguration/storage:go_default_library", - "//staging/src/k8s.io/api/admissionregistration/v1:go_default_library", - "//staging/src/k8s.io/api/admissionregistration/v1beta1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/storage:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/admissionregistration/validatingwebhookconfiguration/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/admissionregistration/validatingwebhookconfiguration/BUILD deleted file mode 100644 index 850759259805..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/admissionregistration/validatingwebhookconfiguration/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "strategy.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/admissionregistration/validatingwebhookconfiguration", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/admissionregistration:go_default_library", - "//pkg/apis/admissionregistration/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/admissionregistration/validatingwebhookconfiguration/storage:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/admissionregistration/validatingwebhookconfiguration/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/admissionregistration/validatingwebhookconfiguration/storage/BUILD deleted file mode 100644 index c3facddc56ac..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/admissionregistration/validatingwebhookconfiguration/storage/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/admissionregistration/validatingwebhookconfiguration/storage", - deps = [ - "//pkg/apis/admissionregistration:go_default_library", - "//pkg/printers:go_default_library", - "//pkg/printers/internalversion:go_default_library", - "//pkg/printers/storage:go_default_library", - "//pkg/registry/admissionregistration/validatingwebhookconfiguration:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/apiserverinternal/rest/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/apiserverinternal/rest/BUILD deleted file mode 100644 index 9e081ef387e4..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/apiserverinternal/rest/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/apiserverinternal/rest", - visibility = ["//visibility:public"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/apiserverinternal:go_default_library", - "//pkg/registry/apiserverinternal/storageversion/storage:go_default_library", - "//staging/src/k8s.io/api/apiserverinternal/v1alpha1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/storage:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/apiserverinternal/storageversion/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/apiserverinternal/storageversion/BUILD deleted file mode 100644 index c9243163e7c1..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/apiserverinternal/storageversion/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "strategy.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/apiserverinternal/storageversion", - visibility = ["//visibility:public"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/apiserverinternal:go_default_library", - "//pkg/apis/apiserverinternal/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/apiserverinternal/storageversion/storage:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/apiserverinternal/storageversion/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/apiserverinternal/storageversion/storage/BUILD deleted file mode 100644 index e6df631f1de3..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/apiserverinternal/storageversion/storage/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/apiserverinternal/storageversion/storage", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/apiserverinternal:go_default_library", - "//pkg/printers:go_default_library", - "//pkg/printers/internalversion:go_default_library", - "//pkg/printers/storage:go_default_library", - "//pkg/registry/apiserverinternal/storageversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/apiserverinternal/storageversion/storage/storage.go b/vendor/k8s.io/kubernetes/pkg/registry/apiserverinternal/storageversion/storage/storage.go index a6157b7b5a3b..3a0901391e9b 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/apiserverinternal/storageversion/storage/storage.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/apiserverinternal/storageversion/storage/storage.go @@ -29,6 +29,7 @@ import ( printersinternal "k8s.io/kubernetes/pkg/printers/internalversion" printerstorage "k8s.io/kubernetes/pkg/printers/storage" strategy "k8s.io/kubernetes/pkg/registry/apiserverinternal/storageversion" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // REST implements a RESTStorage for storage version against etcd @@ -46,10 +47,11 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, error) { }, DefaultQualifiedResource: apiserverinternal.Resource("storageversions"), - CreateStrategy: strategy.Strategy, - UpdateStrategy: strategy.Strategy, - DeleteStrategy: strategy.Strategy, - TableConvertor: printerstorage.TableConvertor{TableGenerator: printers.NewTableGenerator().With(printersinternal.AddHandlers)}, + CreateStrategy: strategy.Strategy, + UpdateStrategy: strategy.Strategy, + DeleteStrategy: strategy.Strategy, + ResetFieldsStrategy: strategy.Strategy, + TableConvertor: printerstorage.TableConvertor{TableGenerator: printers.NewTableGenerator().With(printersinternal.AddHandlers)}, } options := &generic.StoreOptions{RESTOptions: optsGetter} if err := store.CompleteWithOptions(options); err != nil { @@ -57,6 +59,7 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, error) { } statusStore := *store statusStore.UpdateStrategy = strategy.StatusStrategy + statusStore.ResetFieldsStrategy = strategy.StatusStrategy return &REST{store}, &StatusREST{store: &statusStore}, nil } @@ -81,3 +84,8 @@ func (r *StatusREST) Update(ctx context.Context, name string, objInfo rest.Updat // subresources should never allow create on update. return r.store.Update(ctx, name, objInfo, createValidation, updateValidation, false, options) } + +// GetResetFields implements rest.ResetFieldsStrategy +func (r *StatusREST) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + return r.store.GetResetFields() +} diff --git a/vendor/k8s.io/kubernetes/pkg/registry/apiserverinternal/storageversion/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/apiserverinternal/storageversion/strategy.go index 5a1f2982760f..535d31d142c5 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/apiserverinternal/storageversion/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/apiserverinternal/storageversion/strategy.go @@ -26,6 +26,7 @@ import ( "k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/apis/apiserverinternal" "k8s.io/kubernetes/pkg/apis/apiserverinternal/validation" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // storageVersionStrategy implements verification logic for StorageVersion. @@ -42,6 +43,18 @@ func (storageVersionStrategy) NamespaceScoped() bool { return false } +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (storageVersionStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + fields := map[fieldpath.APIVersion]*fieldpath.Set{ + "internal.apiserver.k8s.io/v1alpha1": fieldpath.NewSet( + fieldpath.MakePathOrDie("status"), + ), + } + + return fields +} + // PrepareForCreate clears the status of an StorageVersion before creation. func (storageVersionStrategy) PrepareForCreate(ctx context.Context, obj runtime.Object) { sv := obj.(*apiserverinternal.StorageVersion) @@ -90,6 +103,19 @@ type storageVersionStatusStrategy struct { // StatusStrategy is the default logic invoked when updating object status. var StatusStrategy = storageVersionStatusStrategy{Strategy} +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (storageVersionStatusStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + fields := map[fieldpath.APIVersion]*fieldpath.Set{ + "internal.apiserver.k8s.io/v1alpha1": fieldpath.NewSet( + fieldpath.MakePathOrDie("metadata"), + fieldpath.MakePathOrDie("spec"), + ), + } + + return fields +} + func (storageVersionStatusStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object) { newSV := obj.(*apiserverinternal.StorageVersion) oldSV := old.(*apiserverinternal.StorageVersion) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/apps/controllerrevision/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/apps/controllerrevision/BUILD deleted file mode 100644 index 11efe74a7689..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/apps/controllerrevision/BUILD +++ /dev/null @@ -1,54 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["strategy_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/apps:go_default_library", - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "strategy.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/apps/controllerrevision", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/apps:go_default_library", - "//pkg/apis/apps/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/apps/controllerrevision/storage:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/apps/controllerrevision/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/apps/controllerrevision/storage/BUILD deleted file mode 100644 index 845bce9a9863..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/apps/controllerrevision/storage/BUILD +++ /dev/null @@ -1,54 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["storage_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/apps:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/registry/registrytest:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/testing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/testing:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/apps/controllerrevision/storage", - deps = [ - "//pkg/apis/apps:go_default_library", - "//pkg/printers:go_default_library", - "//pkg/printers/internalversion:go_default_library", - "//pkg/printers/storage:go_default_library", - "//pkg/registry/apps/controllerrevision:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/apps/daemonset/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/apps/daemonset/BUILD deleted file mode 100644 index 68ae8aefac1b..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/apps/daemonset/BUILD +++ /dev/null @@ -1,62 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "strategy.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/apps/daemonset", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/api/pod:go_default_library", - "//pkg/apis/apps:go_default_library", - "//pkg/apis/apps/validation:go_default_library", - "//staging/src/k8s.io/api/apps/v1beta2:go_default_library", - "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["strategy_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/apps:go_default_library", - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/apps/daemonset/storage:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/apps/daemonset/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/apps/daemonset/storage/BUILD deleted file mode 100644 index 71715545454b..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/apps/daemonset/storage/BUILD +++ /dev/null @@ -1,56 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["storage_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/apps:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/registry/registrytest:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/testing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/testing:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/apps/daemonset/storage", - deps = [ - "//pkg/apis/apps:go_default_library", - "//pkg/printers:go_default_library", - "//pkg/printers/internalversion:go_default_library", - "//pkg/printers/storage:go_default_library", - "//pkg/registry/apps/daemonset:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/apps/daemonset/storage/storage.go b/vendor/k8s.io/kubernetes/pkg/registry/apps/daemonset/storage/storage.go index e824f2001430..ec337f19a772 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/apps/daemonset/storage/storage.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/apps/daemonset/storage/storage.go @@ -29,6 +29,7 @@ import ( printersinternal "k8s.io/kubernetes/pkg/printers/internalversion" printerstorage "k8s.io/kubernetes/pkg/printers/storage" "k8s.io/kubernetes/pkg/registry/apps/daemonset" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // REST implements a RESTStorage for DaemonSets @@ -44,9 +45,10 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, error) { NewListFunc: func() runtime.Object { return &apps.DaemonSetList{} }, DefaultQualifiedResource: apps.Resource("daemonsets"), - CreateStrategy: daemonset.Strategy, - UpdateStrategy: daemonset.Strategy, - DeleteStrategy: daemonset.Strategy, + CreateStrategy: daemonset.Strategy, + UpdateStrategy: daemonset.Strategy, + DeleteStrategy: daemonset.Strategy, + ResetFieldsStrategy: daemonset.Strategy, TableConvertor: printerstorage.TableConvertor{TableGenerator: printers.NewTableGenerator().With(printersinternal.AddHandlers)}, } @@ -57,6 +59,7 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, error) { statusStore := *store statusStore.UpdateStrategy = daemonset.StatusStrategy + statusStore.ResetFieldsStrategy = daemonset.StatusStrategy return &REST{store, []string{"all"}}, &StatusREST{store: &statusStore}, nil } @@ -103,3 +106,8 @@ func (r *StatusREST) Update(ctx context.Context, name string, objInfo rest.Updat // subresources should never allow create on update. return r.store.Update(ctx, name, objInfo, createValidation, updateValidation, false, options) } + +// GetResetFields implements rest.ResetFieldsStrategy +func (r *StatusREST) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + return r.store.GetResetFields() +} diff --git a/vendor/k8s.io/kubernetes/pkg/registry/apps/daemonset/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/apps/daemonset/strategy.go index 03bdaa895832..cd60ad024953 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/apps/daemonset/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/apps/daemonset/strategy.go @@ -25,14 +25,18 @@ import ( apivalidation "k8s.io/apimachinery/pkg/api/validation" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/apimachinery/pkg/util/validation/field" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" "k8s.io/apiserver/pkg/registry/rest" "k8s.io/apiserver/pkg/storage/names" + utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/api/pod" "k8s.io/kubernetes/pkg/apis/apps" "k8s.io/kubernetes/pkg/apis/apps/validation" + "k8s.io/kubernetes/pkg/features" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // daemonSetStrategy implements verification logic for daemon sets. @@ -65,6 +69,18 @@ func (daemonSetStrategy) NamespaceScoped() bool { return true } +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (daemonSetStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + fields := map[fieldpath.APIVersion]*fieldpath.Set{ + "apps/v1": fieldpath.NewSet( + fieldpath.MakePathOrDie("status"), + ), + } + + return fields +} + // PrepareForCreate clears the status of a daemon set before creation. func (daemonSetStrategy) PrepareForCreate(ctx context.Context, obj runtime.Object) { daemonSet := obj.(*apps.DaemonSet) @@ -75,6 +91,7 @@ func (daemonSetStrategy) PrepareForCreate(ctx context.Context, obj runtime.Objec daemonSet.Spec.TemplateGeneration = 1 } + dropDaemonSetDisabledFields(daemonSet, nil) pod.DropDisabledTemplateFields(&daemonSet.Spec.Template, nil) } @@ -83,6 +100,7 @@ func (daemonSetStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime. newDaemonSet := obj.(*apps.DaemonSet) oldDaemonSet := old.(*apps.DaemonSet) + dropDaemonSetDisabledFields(newDaemonSet, oldDaemonSet) pod.DropDisabledTemplateFields(&newDaemonSet.Spec.Template, &oldDaemonSet.Spec.Template) // update is not allowed to set status @@ -112,6 +130,35 @@ func (daemonSetStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime. } } +// dropDaemonSetDisabledFields drops fields that are not used if their associated feature gates +// are not enabled. The typical pattern is: +// if !utilfeature.DefaultFeatureGate.Enabled(features.MyFeature) && !myFeatureInUse(oldSvc) { +// newSvc.Spec.MyFeature = nil +// } +func dropDaemonSetDisabledFields(newDS *apps.DaemonSet, oldDS *apps.DaemonSet) { + if !utilfeature.DefaultFeatureGate.Enabled(features.DaemonSetUpdateSurge) { + if r := newDS.Spec.UpdateStrategy.RollingUpdate; r != nil { + if daemonSetSurgeFieldsInUse(oldDS) { + // we need to ensure that MaxUnavailable is non-zero to preserve previous behavior + if r.MaxUnavailable.IntVal == 0 && r.MaxUnavailable.StrVal == "0%" { + r.MaxUnavailable = intstr.FromInt(1) + } + } else { + // clear the MaxSurge field and let validation deal with MaxUnavailable + r.MaxSurge = intstr.IntOrString{} + } + } + } +} + +// daemonSetSurgeFieldsInUse returns true if fields related to daemonset update surge are set +func daemonSetSurgeFieldsInUse(ds *apps.DaemonSet) bool { + if ds == nil { + return false + } + return ds.Spec.UpdateStrategy.RollingUpdate != nil && (ds.Spec.UpdateStrategy.RollingUpdate.MaxSurge.IntVal != 0 || ds.Spec.UpdateStrategy.RollingUpdate.MaxSurge.StrVal != "") +} + // Validate validates a new daemon set. func (daemonSetStrategy) Validate(ctx context.Context, obj runtime.Object) field.ErrorList { daemonSet := obj.(*apps.DaemonSet) @@ -168,6 +215,16 @@ type daemonSetStatusStrategy struct { // StatusStrategy is the default logic invoked when updating object status. var StatusStrategy = daemonSetStatusStrategy{Strategy} +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (daemonSetStatusStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + return map[fieldpath.APIVersion]*fieldpath.Set{ + "apps/v1": fieldpath.NewSet( + fieldpath.MakePathOrDie("spec"), + ), + } +} + func (daemonSetStatusStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object) { newDaemonSet := obj.(*apps.DaemonSet) oldDaemonSet := old.(*apps.DaemonSet) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/apps/deployment/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/apps/deployment/BUILD deleted file mode 100644 index 1ba9a291035d..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/apps/deployment/BUILD +++ /dev/null @@ -1,65 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "strategy.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/apps/deployment", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/api/pod:go_default_library", - "//pkg/apis/apps:go_default_library", - "//pkg/apis/apps/validation:go_default_library", - "//staging/src/k8s.io/api/apps/v1beta1:go_default_library", - "//staging/src/k8s.io/api/apps/v1beta2:go_default_library", - "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["strategy_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/apps:go_default_library", - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/apps/deployment/storage:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/apps/deployment/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/apps/deployment/storage/BUILD deleted file mode 100644 index 8f7fc621a3a5..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/apps/deployment/storage/BUILD +++ /dev/null @@ -1,76 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["storage_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/apps:go_default_library", - "//pkg/apis/autoscaling:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/registry/registrytest:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/testing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/errors:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/testing:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/apps/deployment/storage", - deps = [ - "//pkg/apis/apps:go_default_library", - "//pkg/apis/apps/v1beta1:go_default_library", - "//pkg/apis/apps/v1beta2:go_default_library", - "//pkg/apis/apps/validation:go_default_library", - "//pkg/apis/autoscaling:go_default_library", - "//pkg/apis/autoscaling/v1:go_default_library", - "//pkg/apis/autoscaling/validation:go_default_library", - "//pkg/apis/extensions/v1beta1:go_default_library", - "//pkg/printers:go_default_library", - "//pkg/printers/internalversion:go_default_library", - "//pkg/printers/storage:go_default_library", - "//pkg/registry/apps/deployment:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/errors:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/dryrun:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/apps/deployment/storage/storage.go b/vendor/k8s.io/kubernetes/pkg/registry/apps/deployment/storage/storage.go index 8bbe4690ceae..8b2b48c6a54f 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/apps/deployment/storage/storage.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/apps/deployment/storage/storage.go @@ -43,6 +43,7 @@ import ( printersinternal "k8s.io/kubernetes/pkg/printers/internalversion" printerstorage "k8s.io/kubernetes/pkg/printers/storage" "k8s.io/kubernetes/pkg/registry/apps/deployment" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // DeploymentStorage includes dummy storage for Deployments and for Scale subresource. @@ -81,9 +82,10 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, *Rollbac NewListFunc: func() runtime.Object { return &apps.DeploymentList{} }, DefaultQualifiedResource: apps.Resource("deployments"), - CreateStrategy: deployment.Strategy, - UpdateStrategy: deployment.Strategy, - DeleteStrategy: deployment.Strategy, + CreateStrategy: deployment.Strategy, + UpdateStrategy: deployment.Strategy, + DeleteStrategy: deployment.Strategy, + ResetFieldsStrategy: deployment.Strategy, TableConvertor: printerstorage.TableConvertor{TableGenerator: printers.NewTableGenerator().With(printersinternal.AddHandlers)}, } @@ -94,6 +96,7 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, *Rollbac statusStore := *store statusStore.UpdateStrategy = deployment.StatusStrategy + statusStore.ResetFieldsStrategy = deployment.StatusStrategy return &REST{store, []string{"all"}}, &StatusREST{store: &statusStore}, &RollbackREST{store: store}, nil } @@ -141,6 +144,11 @@ func (r *StatusREST) Update(ctx context.Context, name string, objInfo rest.Updat return r.store.Update(ctx, name, objInfo, createValidation, updateValidation, false, options) } +// GetResetFields implements rest.ResetFieldsStrategy +func (r *StatusREST) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + return r.store.GetResetFields() +} + // RollbackREST implements the REST endpoint for initiating the rollback of a deployment type RollbackREST struct { store *genericregistry.Store diff --git a/vendor/k8s.io/kubernetes/pkg/registry/apps/deployment/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/apps/deployment/strategy.go index e3aab529a25f..15a115e09ab3 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/apps/deployment/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/apps/deployment/strategy.go @@ -34,6 +34,7 @@ import ( "k8s.io/kubernetes/pkg/api/pod" "k8s.io/kubernetes/pkg/apis/apps" "k8s.io/kubernetes/pkg/apis/apps/validation" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // deploymentStrategy implements behavior for Deployments. @@ -67,6 +68,18 @@ func (deploymentStrategy) NamespaceScoped() bool { return true } +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (deploymentStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + fields := map[fieldpath.APIVersion]*fieldpath.Set{ + "apps/v1": fieldpath.NewSet( + fieldpath.MakePathOrDie("status"), + ), + } + + return fields +} + // PrepareForCreate clears fields that are not allowed to be set by end users on creation. func (deploymentStrategy) PrepareForCreate(ctx context.Context, obj runtime.Object) { deployment := obj.(*apps.Deployment) @@ -147,6 +160,17 @@ type deploymentStatusStrategy struct { // StatusStrategy is the default logic invoked when updating object status. var StatusStrategy = deploymentStatusStrategy{Strategy} +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (deploymentStatusStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + return map[fieldpath.APIVersion]*fieldpath.Set{ + "apps/v1": fieldpath.NewSet( + fieldpath.MakePathOrDie("spec"), + fieldpath.MakePathOrDie("metadata", "labels"), + ), + } +} + // PrepareForUpdate clears fields that are not allowed to be set by end users on update of status func (deploymentStatusStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object) { newDeployment := obj.(*apps.Deployment) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/apps/replicaset/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/apps/replicaset/BUILD deleted file mode 100644 index bce7b57ba805..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/apps/replicaset/BUILD +++ /dev/null @@ -1,66 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "strategy.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/apps/replicaset", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/api/pod:go_default_library", - "//pkg/apis/apps:go_default_library", - "//pkg/apis/apps/validation:go_default_library", - "//staging/src/k8s.io/api/apps/v1beta2:go_default_library", - "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["strategy_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/apps:go_default_library", - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/apps/replicaset/storage:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/apps/replicaset/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/apps/replicaset/storage/BUILD deleted file mode 100644 index 52b4de40e895..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/apps/replicaset/storage/BUILD +++ /dev/null @@ -1,70 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["storage_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/apps:go_default_library", - "//pkg/apis/autoscaling:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/registry/registrytest:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/testing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/testing:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/apps/replicaset/storage", - deps = [ - "//pkg/apis/apps:go_default_library", - "//pkg/apis/apps/v1beta1:go_default_library", - "//pkg/apis/apps/v1beta2:go_default_library", - "//pkg/apis/autoscaling:go_default_library", - "//pkg/apis/autoscaling/v1:go_default_library", - "//pkg/apis/autoscaling/validation:go_default_library", - "//pkg/apis/extensions/v1beta1:go_default_library", - "//pkg/printers:go_default_library", - "//pkg/printers/internalversion:go_default_library", - "//pkg/printers/storage:go_default_library", - "//pkg/registry/apps/replicaset:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/apps/replicaset/storage/storage.go b/vendor/k8s.io/kubernetes/pkg/registry/apps/replicaset/storage/storage.go index 7a751ef0964a..be129c7ea82c 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/apps/replicaset/storage/storage.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/apps/replicaset/storage/storage.go @@ -40,6 +40,7 @@ import ( printersinternal "k8s.io/kubernetes/pkg/printers/internalversion" printerstorage "k8s.io/kubernetes/pkg/printers/storage" "k8s.io/kubernetes/pkg/registry/apps/replicaset" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // ReplicaSetStorage includes dummy storage for ReplicaSets and for Scale subresource. @@ -77,9 +78,10 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, error) { PredicateFunc: replicaset.MatchReplicaSet, DefaultQualifiedResource: apps.Resource("replicasets"), - CreateStrategy: replicaset.Strategy, - UpdateStrategy: replicaset.Strategy, - DeleteStrategy: replicaset.Strategy, + CreateStrategy: replicaset.Strategy, + UpdateStrategy: replicaset.Strategy, + DeleteStrategy: replicaset.Strategy, + ResetFieldsStrategy: replicaset.Strategy, TableConvertor: printerstorage.TableConvertor{TableGenerator: printers.NewTableGenerator().With(printersinternal.AddHandlers)}, } @@ -90,6 +92,7 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, error) { statusStore := *store statusStore.UpdateStrategy = replicaset.StatusStrategy + statusStore.ResetFieldsStrategy = replicaset.StatusStrategy return &REST{store, []string{"all"}}, &StatusREST{store: &statusStore}, nil } @@ -138,6 +141,11 @@ func (r *StatusREST) Update(ctx context.Context, name string, objInfo rest.Updat return r.store.Update(ctx, name, objInfo, createValidation, updateValidation, false, options) } +// GetResetFields implements rest.ResetFieldsStrategy +func (r *StatusREST) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + return r.store.GetResetFields() +} + // ScaleREST implements a Scale for ReplicaSet. type ScaleREST struct { store *genericregistry.Store diff --git a/vendor/k8s.io/kubernetes/pkg/registry/apps/replicaset/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/apps/replicaset/strategy.go index e1328fe46cb8..0f54eca3992e 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/apps/replicaset/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/apps/replicaset/strategy.go @@ -41,6 +41,7 @@ import ( "k8s.io/kubernetes/pkg/api/pod" "k8s.io/kubernetes/pkg/apis/apps" "k8s.io/kubernetes/pkg/apis/apps/validation" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // rsStrategy implements verification logic for ReplicaSets. @@ -73,6 +74,18 @@ func (rsStrategy) NamespaceScoped() bool { return true } +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (rsStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + fields := map[fieldpath.APIVersion]*fieldpath.Set{ + "apps/v1": fieldpath.NewSet( + fieldpath.MakePathOrDie("status"), + ), + } + + return fields +} + // PrepareForCreate clears the status of a ReplicaSet before creation. func (rsStrategy) PrepareForCreate(ctx context.Context, obj runtime.Object) { rs := obj.(*apps.ReplicaSet) @@ -189,6 +202,16 @@ type rsStatusStrategy struct { // StatusStrategy is the default logic invoked when updating object status. var StatusStrategy = rsStatusStrategy{Strategy} +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (rsStatusStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + return map[fieldpath.APIVersion]*fieldpath.Set{ + "apps/v1": fieldpath.NewSet( + fieldpath.MakePathOrDie("spec"), + ), + } +} + func (rsStatusStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object) { newRS := obj.(*apps.ReplicaSet) oldRS := old.(*apps.ReplicaSet) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/apps/rest/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/apps/rest/BUILD deleted file mode 100644 index ab06c122c470..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/apps/rest/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["storage_apps.go"], - importpath = "k8s.io/kubernetes/pkg/registry/apps/rest", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/apps:go_default_library", - "//pkg/registry/apps/controllerrevision/storage:go_default_library", - "//pkg/registry/apps/daemonset/storage:go_default_library", - "//pkg/registry/apps/deployment/storage:go_default_library", - "//pkg/registry/apps/replicaset/storage:go_default_library", - "//pkg/registry/apps/statefulset/storage:go_default_library", - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/storage:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/apps/statefulset/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/apps/statefulset/BUILD deleted file mode 100644 index 91d62f930922..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/apps/statefulset/BUILD +++ /dev/null @@ -1,60 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "strategy.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/apps/statefulset", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/api/pod:go_default_library", - "//pkg/apis/apps:go_default_library", - "//pkg/apis/apps/validation:go_default_library", - "//staging/src/k8s.io/api/apps/v1beta1:go_default_library", - "//staging/src/k8s.io/api/apps/v1beta2:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["strategy_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/apps:go_default_library", - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/apps/statefulset/storage:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/apps/statefulset/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/apps/statefulset/storage/BUILD deleted file mode 100644 index ac35776facf7..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/apps/statefulset/storage/BUILD +++ /dev/null @@ -1,69 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["storage_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/apps:go_default_library", - "//pkg/apis/autoscaling:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/registry/registrytest:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/testing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/testing:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/apps/statefulset/storage", - deps = [ - "//pkg/apis/apps:go_default_library", - "//pkg/apis/apps/v1beta1:go_default_library", - "//pkg/apis/apps/v1beta2:go_default_library", - "//pkg/apis/autoscaling:go_default_library", - "//pkg/apis/autoscaling/v1:go_default_library", - "//pkg/apis/autoscaling/validation:go_default_library", - "//pkg/printers:go_default_library", - "//pkg/printers/internalversion:go_default_library", - "//pkg/printers/storage:go_default_library", - "//pkg/registry/apps/statefulset:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/apps/statefulset/storage/storage.go b/vendor/k8s.io/kubernetes/pkg/registry/apps/statefulset/storage/storage.go index 34e31723f128..0afa6b69098d 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/apps/statefulset/storage/storage.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/apps/statefulset/storage/storage.go @@ -37,6 +37,7 @@ import ( printersinternal "k8s.io/kubernetes/pkg/printers/internalversion" printerstorage "k8s.io/kubernetes/pkg/printers/storage" "k8s.io/kubernetes/pkg/registry/apps/statefulset" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // StatefulSetStorage includes dummy storage for StatefulSets, and their Status and Scale subresource. @@ -72,9 +73,10 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, error) { NewListFunc: func() runtime.Object { return &apps.StatefulSetList{} }, DefaultQualifiedResource: apps.Resource("statefulsets"), - CreateStrategy: statefulset.Strategy, - UpdateStrategy: statefulset.Strategy, - DeleteStrategy: statefulset.Strategy, + CreateStrategy: statefulset.Strategy, + UpdateStrategy: statefulset.Strategy, + DeleteStrategy: statefulset.Strategy, + ResetFieldsStrategy: statefulset.Strategy, TableConvertor: printerstorage.TableConvertor{TableGenerator: printers.NewTableGenerator().With(printersinternal.AddHandlers)}, } @@ -85,6 +87,7 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, error) { statusStore := *store statusStore.UpdateStrategy = statefulset.StatusStrategy + statusStore.ResetFieldsStrategy = statefulset.StatusStrategy return &REST{store}, &StatusREST{store: &statusStore}, nil } @@ -118,6 +121,11 @@ func (r *StatusREST) Update(ctx context.Context, name string, objInfo rest.Updat return r.store.Update(ctx, name, objInfo, createValidation, updateValidation, false, options) } +// GetResetFields implements rest.ResetFieldsStrategy +func (r *StatusREST) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + return r.store.GetResetFields() +} + // Implement ShortNamesProvider var _ rest.ShortNamesProvider = &REST{} diff --git a/vendor/k8s.io/kubernetes/pkg/registry/apps/statefulset/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/apps/statefulset/strategy.go index 4bca4d693eb1..b718746415aa 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/apps/statefulset/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/apps/statefulset/strategy.go @@ -32,6 +32,7 @@ import ( "k8s.io/kubernetes/pkg/api/pod" "k8s.io/kubernetes/pkg/apis/apps" "k8s.io/kubernetes/pkg/apis/apps/validation" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // statefulSetStrategy implements verification logic for Replication StatefulSets. @@ -64,6 +65,18 @@ func (statefulSetStrategy) NamespaceScoped() bool { return true } +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (statefulSetStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + fields := map[fieldpath.APIVersion]*fieldpath.Set{ + "apps/v1": fieldpath.NewSet( + fieldpath.MakePathOrDie("status"), + ), + } + + return fields +} + // PrepareForCreate clears the status of an StatefulSet before creation. func (statefulSetStrategy) PrepareForCreate(ctx context.Context, obj runtime.Object) { statefulSet := obj.(*apps.StatefulSet) @@ -96,7 +109,8 @@ func (statefulSetStrategy) PrepareForUpdate(ctx context.Context, obj, old runtim // Validate validates a new StatefulSet. func (statefulSetStrategy) Validate(ctx context.Context, obj runtime.Object) field.ErrorList { statefulSet := obj.(*apps.StatefulSet) - return validation.ValidateStatefulSet(statefulSet) + opts := pod.GetValidationOptionsFromPodTemplate(&statefulSet.Spec.Template, nil) + return validation.ValidateStatefulSet(statefulSet, opts) } // Canonicalize normalizes the object after validation. @@ -112,7 +126,9 @@ func (statefulSetStrategy) AllowCreateOnUpdate() bool { func (statefulSetStrategy) ValidateUpdate(ctx context.Context, obj, old runtime.Object) field.ErrorList { newStatefulSet := obj.(*apps.StatefulSet) oldStatefulSet := old.(*apps.StatefulSet) - validationErrorList := validation.ValidateStatefulSet(newStatefulSet) + + opts := pod.GetValidationOptionsFromPodTemplate(&newStatefulSet.Spec.Template, &oldStatefulSet.Spec.Template) + validationErrorList := validation.ValidateStatefulSet(newStatefulSet, opts) updateErrorList := validation.ValidateStatefulSetUpdate(newStatefulSet, oldStatefulSet) return append(validationErrorList, updateErrorList...) } @@ -129,6 +145,16 @@ type statefulSetStatusStrategy struct { // StatusStrategy is the default logic invoked when updating object status. var StatusStrategy = statefulSetStatusStrategy{Strategy} +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (statefulSetStatusStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + return map[fieldpath.APIVersion]*fieldpath.Set{ + "apps/v1": fieldpath.NewSet( + fieldpath.MakePathOrDie("spec"), + ), + } +} + // PrepareForUpdate clears fields that are not allowed to be set by end users on update of status func (statefulSetStatusStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object) { newStatefulSet := obj.(*apps.StatefulSet) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/authentication/rest/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/authentication/rest/BUILD deleted file mode 100644 index e04027f9a387..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/authentication/rest/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["storage_authentication.go"], - importpath = "k8s.io/kubernetes/pkg/registry/authentication/rest", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/authentication:go_default_library", - "//pkg/registry/authentication/tokenreview:go_default_library", - "//staging/src/k8s.io/api/authentication/v1:go_default_library", - "//staging/src/k8s.io/api/authentication/v1beta1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/storage:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/authentication/tokenreview/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/authentication/tokenreview/BUILD deleted file mode 100644 index fe6f590ef521..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/authentication/tokenreview/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/authentication/tokenreview", - deps = [ - "//pkg/apis/authentication:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/authorization/localsubjectaccessreview/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/authorization/localsubjectaccessreview/BUILD deleted file mode 100644 index a91a80a92478..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/authorization/localsubjectaccessreview/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["rest.go"], - importpath = "k8s.io/kubernetes/pkg/registry/authorization/localsubjectaccessreview", - deps = [ - "//pkg/apis/authorization:go_default_library", - "//pkg/apis/authorization/validation:go_default_library", - "//pkg/registry/authorization/util:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/authorization/rest/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/authorization/rest/BUILD deleted file mode 100644 index 3f6f69b92576..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/authorization/rest/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["storage_authorization.go"], - importpath = "k8s.io/kubernetes/pkg/registry/authorization/rest", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/authorization:go_default_library", - "//pkg/registry/authorization/localsubjectaccessreview:go_default_library", - "//pkg/registry/authorization/selfsubjectaccessreview:go_default_library", - "//pkg/registry/authorization/selfsubjectrulesreview:go_default_library", - "//pkg/registry/authorization/subjectaccessreview:go_default_library", - "//staging/src/k8s.io/api/authorization/v1:go_default_library", - "//staging/src/k8s.io/api/authorization/v1beta1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/storage:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/authorization/selfsubjectaccessreview/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/authorization/selfsubjectaccessreview/BUILD deleted file mode 100644 index ac53dcfec8aa..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/authorization/selfsubjectaccessreview/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["rest.go"], - importpath = "k8s.io/kubernetes/pkg/registry/authorization/selfsubjectaccessreview", - deps = [ - "//pkg/apis/authorization:go_default_library", - "//pkg/apis/authorization/validation:go_default_library", - "//pkg/registry/authorization/util:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/authorization/selfsubjectrulesreview/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/authorization/selfsubjectrulesreview/BUILD deleted file mode 100644 index 46a86fdd1368..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/authorization/selfsubjectrulesreview/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["rest.go"], - importpath = "k8s.io/kubernetes/pkg/registry/authorization/selfsubjectrulesreview", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/authorization:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/authorization/subjectaccessreview/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/authorization/subjectaccessreview/BUILD deleted file mode 100644 index 7aa80d685206..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/authorization/subjectaccessreview/BUILD +++ /dev/null @@ -1,50 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["rest.go"], - importpath = "k8s.io/kubernetes/pkg/registry/authorization/subjectaccessreview", - deps = [ - "//pkg/apis/authorization:go_default_library", - "//pkg/apis/authorization/validation:go_default_library", - "//pkg/registry/authorization/util:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["rest_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/authorization:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/authorization/util/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/authorization/util/BUILD deleted file mode 100644 index a86e322b874b..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/authorization/util/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["helpers.go"], - importpath = "k8s.io/kubernetes/pkg/registry/authorization/util", - deps = [ - "//pkg/apis/authorization:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["helpers_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/authorization:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/autoscaling/horizontalpodautoscaler/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/autoscaling/horizontalpodautoscaler/BUILD deleted file mode 100644 index 1cd20e7bd793..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/autoscaling/horizontalpodautoscaler/BUILD +++ /dev/null @@ -1,56 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "strategy.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/autoscaling/horizontalpodautoscaler", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/autoscaling:go_default_library", - "//pkg/apis/autoscaling/validation:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/autoscaling/horizontalpodautoscaler/storage:all-srcs", - ], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["strategy_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/autoscaling:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/autoscaling/horizontalpodautoscaler/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/autoscaling/horizontalpodautoscaler/storage/BUILD deleted file mode 100644 index 48b48426e034..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/autoscaling/horizontalpodautoscaler/storage/BUILD +++ /dev/null @@ -1,61 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["storage_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/autoscaling:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/registry/registrytest:go_default_library", - "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/testing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/testing:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/autoscaling/horizontalpodautoscaler/storage", - deps = [ - "//pkg/apis/autoscaling:go_default_library", - "//pkg/printers:go_default_library", - "//pkg/printers/internalversion:go_default_library", - "//pkg/printers/storage:go_default_library", - "//pkg/registry/autoscaling/horizontalpodautoscaler:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/autoscaling/horizontalpodautoscaler/storage/storage.go b/vendor/k8s.io/kubernetes/pkg/registry/autoscaling/horizontalpodautoscaler/storage/storage.go index 2a8f90015a68..8e17de502127 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/autoscaling/horizontalpodautoscaler/storage/storage.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/autoscaling/horizontalpodautoscaler/storage/storage.go @@ -29,6 +29,7 @@ import ( printersinternal "k8s.io/kubernetes/pkg/printers/internalversion" printerstorage "k8s.io/kubernetes/pkg/printers/storage" "k8s.io/kubernetes/pkg/registry/autoscaling/horizontalpodautoscaler" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // REST implements a RESTStorage for pod disruption budgets against etcd @@ -43,9 +44,10 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, error) { NewListFunc: func() runtime.Object { return &autoscaling.HorizontalPodAutoscalerList{} }, DefaultQualifiedResource: autoscaling.Resource("horizontalpodautoscalers"), - CreateStrategy: horizontalpodautoscaler.Strategy, - UpdateStrategy: horizontalpodautoscaler.Strategy, - DeleteStrategy: horizontalpodautoscaler.Strategy, + CreateStrategy: horizontalpodautoscaler.Strategy, + UpdateStrategy: horizontalpodautoscaler.Strategy, + DeleteStrategy: horizontalpodautoscaler.Strategy, + ResetFieldsStrategy: horizontalpodautoscaler.Strategy, TableConvertor: printerstorage.TableConvertor{TableGenerator: printers.NewTableGenerator().With(printersinternal.AddHandlers)}, } @@ -56,6 +58,7 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, error) { statusStore := *store statusStore.UpdateStrategy = horizontalpodautoscaler.StatusStrategy + statusStore.ResetFieldsStrategy = horizontalpodautoscaler.StatusStrategy return &REST{store}, &StatusREST{store: &statusStore}, nil } @@ -96,3 +99,8 @@ func (r *StatusREST) Update(ctx context.Context, name string, objInfo rest.Updat // subresources should never allow create on update. return r.store.Update(ctx, name, objInfo, createValidation, updateValidation, false, options) } + +// GetResetFields implements rest.ResetFieldsStrategy +func (r *StatusREST) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + return r.store.GetResetFields() +} diff --git a/vendor/k8s.io/kubernetes/pkg/registry/autoscaling/horizontalpodautoscaler/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/autoscaling/horizontalpodautoscaler/strategy.go index 75b8e4eccdd7..edddda37dcba 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/autoscaling/horizontalpodautoscaler/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/autoscaling/horizontalpodautoscaler/strategy.go @@ -27,6 +27,7 @@ import ( "k8s.io/kubernetes/pkg/apis/autoscaling" "k8s.io/kubernetes/pkg/apis/autoscaling/validation" "k8s.io/kubernetes/pkg/features" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // autoscalerStrategy implements behavior for HorizontalPodAutoscalers @@ -44,6 +45,24 @@ func (autoscalerStrategy) NamespaceScoped() bool { return true } +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (autoscalerStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + fields := map[fieldpath.APIVersion]*fieldpath.Set{ + "autoscaling/v1": fieldpath.NewSet( + fieldpath.MakePathOrDie("status"), + ), + "autoscaling/v2beta1": fieldpath.NewSet( + fieldpath.MakePathOrDie("status"), + ), + "autoscaling/v2beta2": fieldpath.NewSet( + fieldpath.MakePathOrDie("status"), + ), + } + + return fields +} + // PrepareForCreate clears fields that are not allowed to be set by end users on creation. func (autoscalerStrategy) PrepareForCreate(ctx context.Context, obj runtime.Object) { newHPA := obj.(*autoscaling.HorizontalPodAutoscaler) @@ -115,6 +134,24 @@ type autoscalerStatusStrategy struct { // StatusStrategy is the default logic invoked when updating object status. var StatusStrategy = autoscalerStatusStrategy{Strategy} +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (autoscalerStatusStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + fields := map[fieldpath.APIVersion]*fieldpath.Set{ + "autoscaling/v1": fieldpath.NewSet( + fieldpath.MakePathOrDie("spec"), + ), + "autoscaling/v2beta1": fieldpath.NewSet( + fieldpath.MakePathOrDie("spec"), + ), + "autoscaling/v2beta2": fieldpath.NewSet( + fieldpath.MakePathOrDie("spec"), + ), + } + + return fields +} + func (autoscalerStatusStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object) { newAutoscaler := obj.(*autoscaling.HorizontalPodAutoscaler) oldAutoscaler := old.(*autoscaling.HorizontalPodAutoscaler) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/autoscaling/rest/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/autoscaling/rest/BUILD deleted file mode 100644 index cc96b1f38c8a..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/autoscaling/rest/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["storage_autoscaling.go"], - importpath = "k8s.io/kubernetes/pkg/registry/autoscaling/rest", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/autoscaling:go_default_library", - "//pkg/apis/autoscaling/v2beta2:go_default_library", - "//pkg/registry/autoscaling/horizontalpodautoscaler/storage:go_default_library", - "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", - "//staging/src/k8s.io/api/autoscaling/v2beta1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/storage:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/batch/cronjob/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/batch/cronjob/BUILD deleted file mode 100644 index 40cc472645c0..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/batch/cronjob/BUILD +++ /dev/null @@ -1,59 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "strategy.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/batch/cronjob", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/api/pod:go_default_library", - "//pkg/apis/batch:go_default_library", - "//pkg/apis/batch/validation:go_default_library", - "//staging/src/k8s.io/api/batch/v1beta1:go_default_library", - "//staging/src/k8s.io/api/batch/v2alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["strategy_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/batch:go_default_library", - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/batch/cronjob/storage:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/batch/cronjob/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/batch/cronjob/storage/BUILD deleted file mode 100644 index c72918787ab0..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/batch/cronjob/storage/BUILD +++ /dev/null @@ -1,56 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["storage_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/batch:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/registry/registrytest:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/testing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/testing:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/batch/cronjob/storage", - deps = [ - "//pkg/apis/batch:go_default_library", - "//pkg/printers:go_default_library", - "//pkg/printers/internalversion:go_default_library", - "//pkg/printers/storage:go_default_library", - "//pkg/registry/batch/cronjob:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/batch/cronjob/storage/storage.go b/vendor/k8s.io/kubernetes/pkg/registry/batch/cronjob/storage/storage.go index 7fba3f5d08bb..06724df16721 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/batch/cronjob/storage/storage.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/batch/cronjob/storage/storage.go @@ -29,6 +29,7 @@ import ( printersinternal "k8s.io/kubernetes/pkg/printers/internalversion" printerstorage "k8s.io/kubernetes/pkg/printers/storage" "k8s.io/kubernetes/pkg/registry/batch/cronjob" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // REST implements a RESTStorage for scheduled jobs against etcd @@ -43,9 +44,10 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, error) { NewListFunc: func() runtime.Object { return &batch.CronJobList{} }, DefaultQualifiedResource: batch.Resource("cronjobs"), - CreateStrategy: cronjob.Strategy, - UpdateStrategy: cronjob.Strategy, - DeleteStrategy: cronjob.Strategy, + CreateStrategy: cronjob.Strategy, + UpdateStrategy: cronjob.Strategy, + DeleteStrategy: cronjob.Strategy, + ResetFieldsStrategy: cronjob.Strategy, TableConvertor: printerstorage.TableConvertor{TableGenerator: printers.NewTableGenerator().With(printersinternal.AddHandlers)}, } @@ -56,6 +58,7 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, error) { statusStore := *store statusStore.UpdateStrategy = cronjob.StatusStrategy + statusStore.ResetFieldsStrategy = cronjob.StatusStrategy return &REST{store}, &StatusREST{store: &statusStore}, nil } @@ -94,3 +97,8 @@ func (r *StatusREST) Update(ctx context.Context, name string, objInfo rest.Updat // subresources should never allow create on update. return r.store.Update(ctx, name, objInfo, createValidation, updateValidation, false, options) } + +// GetResetFields implements rest.ResetFieldsStrategy +func (r *StatusREST) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + return r.store.GetResetFields() +} diff --git a/vendor/k8s.io/kubernetes/pkg/registry/batch/cronjob/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/batch/cronjob/strategy.go index 983932834d71..46e7d5b6797f 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/batch/cronjob/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/batch/cronjob/strategy.go @@ -20,7 +20,6 @@ import ( "context" batchv1beta1 "k8s.io/api/batch/v1beta1" - batchv2alpha1 "k8s.io/api/batch/v2alpha1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/util/validation/field" @@ -31,6 +30,7 @@ import ( "k8s.io/kubernetes/pkg/api/pod" "k8s.io/kubernetes/pkg/apis/batch" "k8s.io/kubernetes/pkg/apis/batch/validation" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // cronJobStrategy implements verification logic for Replication Controllers. @@ -42,7 +42,7 @@ type cronJobStrategy struct { // Strategy is the default logic that applies when creating and updating CronJob objects. var Strategy = cronJobStrategy{legacyscheme.Scheme, names.SimpleNameGenerator} -// DefaultGarbageCollectionPolicy returns OrphanDependents for batch/v1beta1 and batch/v2alpha1 for backwards compatibility, +// DefaultGarbageCollectionPolicy returns OrphanDependents for batch/v1beta1 for backwards compatibility, // and DeleteDependents for all other versions. func (cronJobStrategy) DefaultGarbageCollectionPolicy(ctx context.Context) rest.GarbageCollectionPolicy { var groupVersion schema.GroupVersion @@ -50,7 +50,7 @@ func (cronJobStrategy) DefaultGarbageCollectionPolicy(ctx context.Context) rest. groupVersion = schema.GroupVersion{Group: requestInfo.APIGroup, Version: requestInfo.APIVersion} } switch groupVersion { - case batchv1beta1.SchemeGroupVersion, batchv2alpha1.SchemeGroupVersion: + case batchv1beta1.SchemeGroupVersion: // for back compatibility return rest.OrphanDependents default: @@ -63,6 +63,21 @@ func (cronJobStrategy) NamespaceScoped() bool { return true } +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (cronJobStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + fields := map[fieldpath.APIVersion]*fieldpath.Set{ + "batch/v1": fieldpath.NewSet( + fieldpath.MakePathOrDie("status"), + ), + "batch/v1beta1": fieldpath.NewSet( + fieldpath.MakePathOrDie("status"), + ), + } + + return fields +} + // PrepareForCreate clears the status of a scheduled job before creation. func (cronJobStrategy) PrepareForCreate(ctx context.Context, obj runtime.Object) { cronJob := obj.(*batch.CronJob) @@ -116,6 +131,19 @@ type cronJobStatusStrategy struct { // StatusStrategy is the default logic invoked when updating object status. var StatusStrategy = cronJobStatusStrategy{Strategy} +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (cronJobStatusStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + return map[fieldpath.APIVersion]*fieldpath.Set{ + "batch/v1": fieldpath.NewSet( + fieldpath.MakePathOrDie("spec"), + ), + "batch/v1beta1": fieldpath.NewSet( + fieldpath.MakePathOrDie("spec"), + ), + } +} + func (cronJobStatusStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object) { newJob := obj.(*batch.CronJob) oldJob := old.(*batch.CronJob) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/batch/job/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/batch/job/BUILD deleted file mode 100644 index 9e886479452e..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/batch/job/BUILD +++ /dev/null @@ -1,71 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "strategy.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/batch/job", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/api/pod:go_default_library", - "//pkg/apis/batch:go_default_library", - "//pkg/apis/batch/validation:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/api/batch/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["strategy_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/api/testing:go_default_library", - "//pkg/apis/batch:go_default_library", - "//pkg/apis/batch/install:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/batch/job/storage:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/batch/job/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/batch/job/storage/BUILD deleted file mode 100644 index 38c2e13895dd..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/batch/job/storage/BUILD +++ /dev/null @@ -1,56 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["storage_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/batch:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/registry/registrytest:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/testing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/testing:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/batch/job/storage", - deps = [ - "//pkg/apis/batch:go_default_library", - "//pkg/printers:go_default_library", - "//pkg/printers/internalversion:go_default_library", - "//pkg/printers/storage:go_default_library", - "//pkg/registry/batch/job:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/batch/job/storage/storage.go b/vendor/k8s.io/kubernetes/pkg/registry/batch/job/storage/storage.go index b7390780717e..66ce3f58126e 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/batch/job/storage/storage.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/batch/job/storage/storage.go @@ -29,6 +29,7 @@ import ( printersinternal "k8s.io/kubernetes/pkg/printers/internalversion" printerstorage "k8s.io/kubernetes/pkg/printers/storage" "k8s.io/kubernetes/pkg/registry/batch/job" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // JobStorage includes dummy storage for Job. @@ -63,9 +64,10 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, error) { PredicateFunc: job.MatchJob, DefaultQualifiedResource: batch.Resource("jobs"), - CreateStrategy: job.Strategy, - UpdateStrategy: job.Strategy, - DeleteStrategy: job.Strategy, + CreateStrategy: job.Strategy, + UpdateStrategy: job.Strategy, + DeleteStrategy: job.Strategy, + ResetFieldsStrategy: job.Strategy, TableConvertor: printerstorage.TableConvertor{TableGenerator: printers.NewTableGenerator().With(printersinternal.AddHandlers)}, } @@ -76,6 +78,7 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, error) { statusStore := *store statusStore.UpdateStrategy = job.StatusStrategy + statusStore.ResetFieldsStrategy = job.StatusStrategy return &REST{store}, &StatusREST{store: &statusStore}, nil } @@ -109,3 +112,8 @@ func (r *StatusREST) Update(ctx context.Context, name string, objInfo rest.Updat // subresources should never allow create on update. return r.store.Update(ctx, name, objInfo, createValidation, updateValidation, false, options) } + +// GetResetFields implements rest.ResetFieldsStrategy +func (r *StatusREST) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + return r.store.GetResetFields() +} diff --git a/vendor/k8s.io/kubernetes/pkg/registry/batch/job/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/batch/job/strategy.go index 906ca95c4a88..6aa8ec1548fe 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/batch/job/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/batch/job/strategy.go @@ -39,6 +39,7 @@ import ( "k8s.io/kubernetes/pkg/apis/batch" "k8s.io/kubernetes/pkg/apis/batch/validation" "k8s.io/kubernetes/pkg/features" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // jobStrategy implements verification logic for Replication Controllers. @@ -71,6 +72,18 @@ func (jobStrategy) NamespaceScoped() bool { return true } +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (jobStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + fields := map[fieldpath.APIVersion]*fieldpath.Set{ + "batch/v1": fieldpath.NewSet( + fieldpath.MakePathOrDie("status"), + ), + } + + return fields +} + // PrepareForCreate clears the status of a job before creation. func (jobStrategy) PrepareForCreate(ctx context.Context, obj runtime.Object) { job := obj.(*batch.Job) @@ -80,6 +93,14 @@ func (jobStrategy) PrepareForCreate(ctx context.Context, obj runtime.Object) { job.Spec.TTLSecondsAfterFinished = nil } + if !utilfeature.DefaultFeatureGate.Enabled(features.IndexedJob) { + job.Spec.CompletionMode = nil + } + + if !utilfeature.DefaultFeatureGate.Enabled(features.SuspendJob) { + job.Spec.Suspend = nil + } + pod.DropDisabledTemplateFields(&job.Spec.Template, nil) } @@ -93,6 +114,20 @@ func (jobStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object newJob.Spec.TTLSecondsAfterFinished = nil } + if !utilfeature.DefaultFeatureGate.Enabled(features.IndexedJob) && oldJob.Spec.CompletionMode == nil { + newJob.Spec.CompletionMode = nil + } + + if !utilfeature.DefaultFeatureGate.Enabled(features.SuspendJob) { + // There are 3 possible values (nil, true, false) for each flag, so 9 + // combinations. We want to disallow everything except true->false and + // true->nil when the feature gate is disabled. Or, basically allow this + // only when oldJob is true. + if oldJob.Spec.Suspend == nil || !*oldJob.Spec.Suspend { + newJob.Spec.Suspend = oldJob.Spec.Suspend + } + } + pod.DropDisabledTemplateFields(&newJob.Spec.Template, &oldJob.Spec.Template) } @@ -187,6 +222,16 @@ type jobStatusStrategy struct { var StatusStrategy = jobStatusStrategy{Strategy} +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (jobStatusStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + return map[fieldpath.APIVersion]*fieldpath.Set{ + "batch/v1": fieldpath.NewSet( + fieldpath.MakePathOrDie("spec"), + ), + } +} + func (jobStatusStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object) { newJob := obj.(*batch.Job) oldJob := old.(*batch.Job) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/batch/rest/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/batch/rest/BUILD deleted file mode 100644 index 8d597554ce7d..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/batch/rest/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["storage_batch.go"], - importpath = "k8s.io/kubernetes/pkg/registry/batch/rest", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/batch:go_default_library", - "//pkg/registry/batch/cronjob/storage:go_default_library", - "//pkg/registry/batch/job/storage:go_default_library", - "//staging/src/k8s.io/api/batch/v1:go_default_library", - "//staging/src/k8s.io/api/batch/v1beta1:go_default_library", - "//staging/src/k8s.io/api/batch/v2alpha1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/storage:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/batch/rest/storage_batch.go b/vendor/k8s.io/kubernetes/pkg/registry/batch/rest/storage_batch.go index bffa3f2180e2..638e324f0007 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/batch/rest/storage_batch.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/batch/rest/storage_batch.go @@ -19,7 +19,6 @@ package rest import ( batchapiv1 "k8s.io/api/batch/v1" batchapiv1beta1 "k8s.io/api/batch/v1beta1" - batchapiv2alpha1 "k8s.io/api/batch/v2alpha1" "k8s.io/apiserver/pkg/registry/generic" "k8s.io/apiserver/pkg/registry/rest" genericapiserver "k8s.io/apiserver/pkg/server" @@ -51,13 +50,6 @@ func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource serverstorag apiGroupInfo.VersionedResourcesStorageMap[batchapiv1beta1.SchemeGroupVersion.Version] = storageMap } } - if apiResourceConfigSource.VersionEnabled(batchapiv2alpha1.SchemeGroupVersion) { - if storageMap, err := p.v2alpha1Storage(apiResourceConfigSource, restOptionsGetter); err != nil { - return genericapiserver.APIGroupInfo{}, false, err - } else { - apiGroupInfo.VersionedResourcesStorageMap[batchapiv2alpha1.SchemeGroupVersion.Version] = storageMap - } - } return apiGroupInfo, true, nil } @@ -72,11 +64,6 @@ func (p RESTStorageProvider) v1Storage(apiResourceConfigSource serverstorage.API storage["jobs"] = jobsStorage storage["jobs/status"] = jobsStatusStorage - return storage, err -} - -func (p RESTStorageProvider) v1beta1Storage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (map[string]rest.Storage, error) { - storage := map[string]rest.Storage{} // cronjobs cronJobsStorage, cronJobsStatusStorage, err := cronjobstore.NewREST(restOptionsGetter) if err != nil { @@ -88,7 +75,7 @@ func (p RESTStorageProvider) v1beta1Storage(apiResourceConfigSource serverstorag return storage, err } -func (p RESTStorageProvider) v2alpha1Storage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (map[string]rest.Storage, error) { +func (p RESTStorageProvider) v1beta1Storage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (map[string]rest.Storage, error) { storage := map[string]rest.Storage{} // cronjobs cronJobsStorage, cronJobsStatusStorage, err := cronjobstore.NewREST(restOptionsGetter) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/certificates/certificates/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/certificates/certificates/BUILD deleted file mode 100644 index 094ffb1dfa76..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/certificates/certificates/BUILD +++ /dev/null @@ -1,61 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "strategy.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/certificates/certificates", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/certificates:go_default_library", - "//pkg/apis/certificates/validation:go_default_library", - "//staging/src/k8s.io/api/certificates/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["strategy_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/certificates:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/certificates/certificates/storage:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/certificates/certificates/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/certificates/certificates/storage/BUILD deleted file mode 100644 index 5d95e7b8d531..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/certificates/certificates/storage/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/certificates/certificates/storage", - deps = [ - "//pkg/apis/certificates:go_default_library", - "//pkg/printers:go_default_library", - "//pkg/printers/internalversion:go_default_library", - "//pkg/printers/storage:go_default_library", - "//pkg/registry/certificates/certificates:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/certificates/certificates/storage/storage.go b/vendor/k8s.io/kubernetes/pkg/registry/certificates/certificates/storage/storage.go index 8de9d57a58ec..dd4bd8c88aeb 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/certificates/certificates/storage/storage.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/certificates/certificates/storage/storage.go @@ -29,6 +29,7 @@ import ( printersinternal "k8s.io/kubernetes/pkg/printers/internalversion" printerstorage "k8s.io/kubernetes/pkg/printers/storage" csrregistry "k8s.io/kubernetes/pkg/registry/certificates/certificates" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // REST implements a RESTStorage for CertificateSigningRequest. @@ -43,10 +44,10 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, *Approva NewListFunc: func() runtime.Object { return &certificates.CertificateSigningRequestList{} }, DefaultQualifiedResource: certificates.Resource("certificatesigningrequests"), - CreateStrategy: csrregistry.Strategy, - UpdateStrategy: csrregistry.Strategy, - DeleteStrategy: csrregistry.Strategy, - ExportStrategy: csrregistry.Strategy, + CreateStrategy: csrregistry.Strategy, + UpdateStrategy: csrregistry.Strategy, + DeleteStrategy: csrregistry.Strategy, + ResetFieldsStrategy: csrregistry.Strategy, TableConvertor: printerstorage.TableConvertor{TableGenerator: printers.NewTableGenerator().With(printersinternal.AddHandlers)}, } @@ -60,9 +61,11 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, *Approva // dedicated strategies. statusStore := *store statusStore.UpdateStrategy = csrregistry.StatusStrategy + statusStore.ResetFieldsStrategy = csrregistry.StatusStrategy approvalStore := *store approvalStore.UpdateStrategy = csrregistry.ApprovalStrategy + approvalStore.ResetFieldsStrategy = csrregistry.ApprovalStrategy return &REST{store}, &StatusREST{store: &statusStore}, &ApprovalREST{store: &approvalStore}, nil } @@ -97,6 +100,11 @@ func (r *StatusREST) Update(ctx context.Context, name string, objInfo rest.Updat return r.store.Update(ctx, name, objInfo, createValidation, updateValidation, false, options) } +// GetResetFields implements rest.ResetFieldsStrategy +func (r *StatusREST) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + return r.store.GetResetFields() +} + var _ = rest.Patcher(&StatusREST{}) // ApprovalREST implements the REST endpoint for changing the approval state of a CSR. @@ -121,4 +129,9 @@ func (r *ApprovalREST) Update(ctx context.Context, name string, objInfo rest.Upd return r.store.Update(ctx, name, objInfo, createValidation, updateValidation, false, options) } +// GetResetFields implements rest.ResetFieldsStrategy +func (r *ApprovalREST) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + return r.store.GetResetFields() +} + var _ = rest.Patcher(&ApprovalREST{}) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/certificates/certificates/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/certificates/certificates/strategy.go index 13d61c10d955..c88ff0fdce9a 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/certificates/certificates/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/certificates/certificates/strategy.go @@ -33,6 +33,7 @@ import ( "k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/apis/certificates" "k8s.io/kubernetes/pkg/apis/certificates/validation" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // csrStrategy implements behavior for CSRs @@ -50,6 +51,23 @@ func (csrStrategy) NamespaceScoped() bool { return false } +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (csrStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + fields := map[fieldpath.APIVersion]*fieldpath.Set{ + "certificates.k8s.io/v1": fieldpath.NewSet( + fieldpath.MakePathOrDie("spec"), + fieldpath.MakePathOrDie("status"), + ), + "certificates.k8s.io/v1beta1": fieldpath.NewSet( + fieldpath.MakePathOrDie("spec"), + fieldpath.MakePathOrDie("status"), + ), + } + + return fields +} + // AllowCreateOnUpdate is false for CSRs. func (csrStrategy) AllowCreateOnUpdate() bool { return false @@ -118,21 +136,6 @@ func (csrStrategy) AllowUnconditionalUpdate() bool { return true } -func (s csrStrategy) Export(ctx context.Context, obj runtime.Object, exact bool) error { - csr, ok := obj.(*certificates.CertificateSigningRequest) - if !ok { - // unexpected programmer error - return fmt.Errorf("unexpected object: %v", obj) - } - s.PrepareForCreate(ctx, obj) - if exact { - return nil - } - // CSRs allow direct subresource edits, we clear them without exact so the CSR value can be reused. - csr.Status = certificates.CertificateSigningRequestStatus{} - return nil -} - // Storage strategy for the Status subresource type csrStatusStrategy struct { csrStrategy @@ -140,6 +143,23 @@ type csrStatusStrategy struct { var StatusStrategy = csrStatusStrategy{Strategy} +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (csrStatusStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + fields := map[fieldpath.APIVersion]*fieldpath.Set{ + "certificates.k8s.io/v1": fieldpath.NewSet( + fieldpath.MakePathOrDie("spec"), + fieldpath.MakePathOrDie("status", "conditions"), + ), + "certificates.k8s.io/v1beta1": fieldpath.NewSet( + fieldpath.MakePathOrDie("spec"), + fieldpath.MakePathOrDie("status", "conditions"), + ), + } + + return fields +} + func (csrStatusStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object) { newCSR := obj.(*certificates.CertificateSigningRequest) oldCSR := old.(*certificates.CertificateSigningRequest) @@ -235,6 +255,23 @@ type csrApprovalStrategy struct { var ApprovalStrategy = csrApprovalStrategy{Strategy} +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (csrApprovalStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + fields := map[fieldpath.APIVersion]*fieldpath.Set{ + "certificates.k8s.io/v1": fieldpath.NewSet( + fieldpath.MakePathOrDie("spec"), + fieldpath.MakePathOrDie("status", "certificate"), + ), + "certificates.k8s.io/v1beta1": fieldpath.NewSet( + fieldpath.MakePathOrDie("spec"), + fieldpath.MakePathOrDie("status", "certificate"), + ), + } + + return fields +} + // PrepareForUpdate prepares the new certificate signing request by limiting // the data that is updated to only the conditions and populating condition timestamps func (csrApprovalStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object) { diff --git a/vendor/k8s.io/kubernetes/pkg/registry/certificates/rest/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/certificates/rest/BUILD deleted file mode 100644 index ce1a0f9e9f80..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/certificates/rest/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["storage_certificates.go"], - importpath = "k8s.io/kubernetes/pkg/registry/certificates/rest", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/certificates:go_default_library", - "//pkg/registry/certificates/certificates/storage:go_default_library", - "//staging/src/k8s.io/api/certificates/v1:go_default_library", - "//staging/src/k8s.io/api/certificates/v1beta1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/storage:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/coordination/lease/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/coordination/lease/BUILD deleted file mode 100644 index 98326cf76763..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/coordination/lease/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "strategy.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/coordination/lease", - visibility = ["//visibility:public"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/coordination:go_default_library", - "//pkg/apis/coordination/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/coordination/lease/storage:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/coordination/lease/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/coordination/lease/storage/BUILD deleted file mode 100644 index 1b492b0b51d1..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/coordination/lease/storage/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/coordination/lease/storage", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/coordination:go_default_library", - "//pkg/printers:go_default_library", - "//pkg/printers/internalversion:go_default_library", - "//pkg/printers/storage:go_default_library", - "//pkg/registry/coordination/lease:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/coordination/rest/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/coordination/rest/BUILD deleted file mode 100644 index 3be73700ee70..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/coordination/rest/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["storage_coordination.go"], - importpath = "k8s.io/kubernetes/pkg/registry/coordination/rest", - visibility = ["//visibility:public"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/coordination:go_default_library", - "//pkg/registry/coordination/lease/storage:go_default_library", - "//staging/src/k8s.io/api/coordination/v1:go_default_library", - "//staging/src/k8s.io/api/coordination/v1beta1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/storage:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/componentstatus/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/core/componentstatus/BUILD deleted file mode 100644 index f15804a166e5..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/componentstatus/BUILD +++ /dev/null @@ -1,66 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "rest.go", - "validator.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/core/componentstatus", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/printers:go_default_library", - "//pkg/printers/internalversion:go_default_library", - "//pkg/printers/storage:go_default_library", - "//pkg/probe:go_default_library", - "//pkg/probe/http:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "rest_test.go", - "validator_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/probe:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/componentstatus/validator.go b/vendor/k8s.io/kubernetes/pkg/registry/core/componentstatus/validator.go index 2c237ade28a2..f3221745a7c0 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/componentstatus/validator.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/core/componentstatus/validator.go @@ -78,12 +78,12 @@ func (server *Server) DoServerCheck() (probe.Result, string, error) { return probe.Unknown, "", err } if result == probe.Failure { - return probe.Failure, string(data), err + return probe.Failure, data, err } if server.Validate != nil { if err := server.Validate([]byte(data)); err != nil { - return probe.Failure, string(data), err + return probe.Failure, data, err } } - return result, string(data), nil + return result, data, nil } diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/configmap/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/core/configmap/BUILD deleted file mode 100644 index 855b4083df27..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/configmap/BUILD +++ /dev/null @@ -1,58 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "strategy.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/core/configmap", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/validation:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["strategy_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/core/configmap/storage:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/configmap/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/core/configmap/storage/BUILD deleted file mode 100644 index b246229cb72d..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/configmap/storage/BUILD +++ /dev/null @@ -1,55 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["storage_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/registry/registrytest:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/testing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/testing:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/core/configmap/storage", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/printers:go_default_library", - "//pkg/printers/internalversion:go_default_library", - "//pkg/printers/storage:go_default_library", - "//pkg/registry/core/configmap:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/configmap/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/core/configmap/strategy.go index d592c181c0c2..12f021ce40cb 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/configmap/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/core/configmap/strategy.go @@ -28,11 +28,9 @@ import ( "k8s.io/apiserver/pkg/registry/rest" pkgstorage "k8s.io/apiserver/pkg/storage" "k8s.io/apiserver/pkg/storage/names" - utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/kubernetes/pkg/api/legacyscheme" api "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/apis/core/validation" - "k8s.io/kubernetes/pkg/features" ) // strategy implements behavior for ConfigMap objects @@ -86,14 +84,7 @@ func (strategy) ValidateUpdate(ctx context.Context, newObj, oldObj runtime.Objec return validation.ValidateConfigMapUpdate(newCfg, oldCfg) } -func isImmutableInUse(configMap *api.ConfigMap) bool { - return configMap != nil && configMap.Immutable != nil -} - func dropDisabledFields(configMap *api.ConfigMap, oldConfigMap *api.ConfigMap) { - if !utilfeature.DefaultFeatureGate.Enabled(features.ImmutableEphemeralVolumes) && !isImmutableInUse(oldConfigMap) { - configMap.Immutable = nil - } } func (strategy) AllowUnconditionalUpdate() bool { diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/endpoint/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/core/endpoint/BUILD deleted file mode 100644 index 76bd3e14fb6b..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/endpoint/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "strategy.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/core/endpoint", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/core/endpoint/storage:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/endpoint/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/core/endpoint/storage/BUILD deleted file mode 100644 index d5a7d93af051..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/endpoint/storage/BUILD +++ /dev/null @@ -1,54 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["storage_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/registry/registrytest:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/testing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/testing:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/core/endpoint/storage", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/printers:go_default_library", - "//pkg/printers/internalversion:go_default_library", - "//pkg/printers/storage:go_default_library", - "//pkg/registry/core/endpoint:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/event/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/core/event/BUILD deleted file mode 100644 index 8d16680aadfd..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/event/BUILD +++ /dev/null @@ -1,61 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "strategy.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/core/event", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["strategy_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/api/testing:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/install:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/core/event/storage:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/event/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/core/event/storage/BUILD deleted file mode 100644 index a65214f00066..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/event/storage/BUILD +++ /dev/null @@ -1,52 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["storage_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/registry/registrytest:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/testing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/testing:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/core/event/storage", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/printers:go_default_library", - "//pkg/printers/internalversion:go_default_library", - "//pkg/printers/storage:go_default_library", - "//pkg/registry/core/event:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/limitrange/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/core/limitrange/BUILD deleted file mode 100644 index e015fb6b8bc8..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/limitrange/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "strategy.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/core/limitrange", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/core/limitrange/storage:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/limitrange/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/core/limitrange/storage/BUILD deleted file mode 100644 index bb26c9664487..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/limitrange/storage/BUILD +++ /dev/null @@ -1,53 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["storage_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/install:go_default_library", - "//pkg/registry/registrytest:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/testing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/testing:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/core/limitrange/storage", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/registry/core/limitrange:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/limitrange/storage/storage.go b/vendor/k8s.io/kubernetes/pkg/registry/core/limitrange/storage/storage.go index 95af1d4fd1d9..b3fd401f7014 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/limitrange/storage/storage.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/core/limitrange/storage/storage.go @@ -40,7 +40,6 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, error) { CreateStrategy: limitrange.Strategy, UpdateStrategy: limitrange.Strategy, DeleteStrategy: limitrange.Strategy, - ExportStrategy: limitrange.Strategy, // TODO: define table converter that exposes more than name/creation timestamp TableConvertor: rest.NewDefaultTableConvertor(api.Resource("limitranges")), diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/limitrange/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/core/limitrange/strategy.go index 17e506e46d3d..d9af7051a376 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/limitrange/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/core/limitrange/strategy.go @@ -72,10 +72,3 @@ func (limitrangeStrategy) ValidateUpdate(ctx context.Context, obj, old runtime.O func (limitrangeStrategy) AllowUnconditionalUpdate() bool { return true } - -func (limitrangeStrategy) Export(context.Context, runtime.Object, bool) error { - // Copied from OpenShift exporter - // TODO: this needs to be fixed - // limitrange.Strategy.PrepareForCreate(ctx, obj) - return nil -} diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/namespace/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/core/namespace/BUILD deleted file mode 100644 index 91f138f146b6..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/namespace/BUILD +++ /dev/null @@ -1,57 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "strategy.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/core/namespace", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["strategy_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/api/testing:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/install:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/core/namespace/storage:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/namespace/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/core/namespace/storage/BUILD deleted file mode 100644 index 814fb71f8512..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/namespace/storage/BUILD +++ /dev/null @@ -1,65 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["storage_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/registry/registrytest:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/testing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/testing:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/core/namespace/storage", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/printers:go_default_library", - "//pkg/printers/internalversion:go_default_library", - "//pkg/printers/storage:go_default_library", - "//pkg/registry/core/namespace:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/errors:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/dryrun:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/namespace/storage/storage.go b/vendor/k8s.io/kubernetes/pkg/registry/core/namespace/storage/storage.go index 91c923533a3a..375445e3a0f1 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/namespace/storage/storage.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/core/namespace/storage/storage.go @@ -24,6 +24,7 @@ import ( metainternalversion "k8s.io/apimachinery/pkg/apis/meta/internalversion" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/apimachinery/pkg/watch" "k8s.io/apiserver/pkg/registry/generic" genericregistry "k8s.io/apiserver/pkg/registry/generic/registry" @@ -31,13 +32,12 @@ import ( "k8s.io/apiserver/pkg/storage" storageerr "k8s.io/apiserver/pkg/storage/errors" "k8s.io/apiserver/pkg/util/dryrun" - - utilruntime "k8s.io/apimachinery/pkg/util/runtime" api "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/printers" printersinternal "k8s.io/kubernetes/pkg/printers/internalversion" printerstorage "k8s.io/kubernetes/pkg/printers/storage" "k8s.io/kubernetes/pkg/registry/core/namespace" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // rest implements a RESTStorage for namespaces @@ -67,6 +67,7 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, *Finaliz CreateStrategy: namespace.Strategy, UpdateStrategy: namespace.Strategy, DeleteStrategy: namespace.Strategy, + ResetFieldsStrategy: namespace.Strategy, ReturnDeletedObject: true, ShouldDeleteDuringUpdate: ShouldDeleteNamespaceDuringUpdate, @@ -80,9 +81,11 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, *Finaliz statusStore := *store statusStore.UpdateStrategy = namespace.StatusStrategy + statusStore.ResetFieldsStrategy = namespace.StatusStrategy finalizeStore := *store finalizeStore.UpdateStrategy = namespace.FinalizeStrategy + finalizeStore.ResetFieldsStrategy = namespace.FinalizeStrategy return &REST{store: store, status: &statusStore}, &StatusREST{store: &statusStore}, &FinalizeREST{store: &finalizeStore}, nil } @@ -119,10 +122,6 @@ func (r *REST) Watch(ctx context.Context, options *metainternalversion.ListOptio return r.store.Watch(ctx, options) } -func (r *REST) Export(ctx context.Context, name string, opts metav1.ExportOptions) (runtime.Object, error) { - return r.store.Export(ctx, name, opts) -} - // Delete enforces life-cycle rules for namespace termination func (r *REST) Delete(ctx context.Context, name string, deleteValidation rest.ValidateObjectFunc, options *metav1.DeleteOptions) (runtime.Object, bool, error) { nsObj, err := r.Get(ctx, name, &metav1.GetOptions{}) @@ -295,6 +294,10 @@ func (r *REST) StorageVersion() runtime.GroupVersioner { return r.store.StorageVersion() } +// GetResetFields implements rest.ResetFieldsStrategy +func (r *REST) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + return r.store.GetResetFields() +} func (r *StatusREST) New() runtime.Object { return r.store.New() } @@ -311,6 +314,10 @@ func (r *StatusREST) Update(ctx context.Context, name string, objInfo rest.Updat return r.store.Update(ctx, name, objInfo, createValidation, updateValidation, false, options) } +// GetResetFields implements rest.ResetFieldsStrategy +func (r *StatusREST) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + return r.store.GetResetFields() +} func (r *FinalizeREST) New() runtime.Object { return r.store.New() } @@ -321,3 +328,8 @@ func (r *FinalizeREST) Update(ctx context.Context, name string, objInfo rest.Upd // subresources should never allow create on update. return r.store.Update(ctx, name, objInfo, createValidation, updateValidation, false, options) } + +// GetResetFields implements rest.ResetFieldsStrategy +func (r *FinalizeREST) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + return r.store.GetResetFields() +} diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/namespace/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/core/namespace/strategy.go index bb27621f2e01..1dc84284f7f3 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/namespace/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/core/namespace/strategy.go @@ -20,6 +20,7 @@ import ( "context" "fmt" + v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" @@ -27,9 +28,12 @@ import ( "k8s.io/apiserver/pkg/registry/generic" apistorage "k8s.io/apiserver/pkg/storage" "k8s.io/apiserver/pkg/storage/names" + utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/kubernetes/pkg/api/legacyscheme" api "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/apis/core/validation" + "k8s.io/kubernetes/pkg/features" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // namespaceStrategy implements behavior for Namespaces @@ -47,6 +51,16 @@ func (namespaceStrategy) NamespaceScoped() bool { return false } +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (namespaceStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + return map[fieldpath.APIVersion]*fieldpath.Set{ + "v1": fieldpath.NewSet( + fieldpath.MakePathOrDie("status"), + ), + } +} + // PrepareForCreate clears fields that are not allowed to be set by end users on creation. func (namespaceStrategy) PrepareForCreate(ctx context.Context, obj runtime.Object) { // on create, status is active @@ -88,6 +102,30 @@ func (namespaceStrategy) Validate(ctx context.Context, obj runtime.Object) field // Canonicalize normalizes the object after validation. func (namespaceStrategy) Canonicalize(obj runtime.Object) { + // Ensure the label matches the name for namespaces just created using GenerateName, + // where the final name wasn't available for defaulting to make this change. + // This code needs to be kept in sync with the implementation that exists + // in Namespace defaulting (pkg/apis/core/v1) + // Why this hook *and* defaults.go? + // + // CREATE: + // Defaulting and PrepareForCreate happen before generateName is completed + // (i.e. the name is not yet known). Validation happens after generateName + // but should not modify objects. Canonicalize happens later, which makes + // it the best hook for setting the label. + // + // UPDATE: + // Defaulting and Canonicalize will both trigger with the full name. + // + // GET: + // Only defaulting will be applied. + ns := obj.(*api.Namespace) + if utilfeature.DefaultFeatureGate.Enabled(features.NamespaceDefaultLabelName) { + if ns.Labels == nil { + ns.Labels = map[string]string{} + } + ns.Labels[v1.LabelMetadataName] = ns.Name + } } // AllowCreateOnUpdate is false for namespaces. @@ -111,6 +149,16 @@ type namespaceStatusStrategy struct { var StatusStrategy = namespaceStatusStrategy{Strategy} +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (namespaceStatusStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + return map[fieldpath.APIVersion]*fieldpath.Set{ + "v1": fieldpath.NewSet( + fieldpath.MakePathOrDie("spec"), + ), + } +} + func (namespaceStatusStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object) { newNamespace := obj.(*api.Namespace) oldNamespace := old.(*api.Namespace) @@ -131,6 +179,16 @@ func (namespaceFinalizeStrategy) ValidateUpdate(ctx context.Context, obj, old ru return validation.ValidateNamespaceFinalizeUpdate(obj.(*api.Namespace), old.(*api.Namespace)) } +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (namespaceFinalizeStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + return map[fieldpath.APIVersion]*fieldpath.Set{ + "v1": fieldpath.NewSet( + fieldpath.MakePathOrDie("status"), + ), + } +} + // PrepareForUpdate clears fields that are not allowed to be set by end users on update. func (namespaceFinalizeStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object) { newNamespace := obj.(*api.Namespace) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/node/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/core/node/BUILD deleted file mode 100644 index 0a76925b89bb..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/node/BUILD +++ /dev/null @@ -1,72 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "strategy.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/core/node", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/validation:go_default_library", - "//pkg/features:go_default_library", - "//pkg/kubelet/client:go_default_library", - "//pkg/proxy/util:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["strategy_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/api/testing:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/install:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/core/node/rest:all-srcs", - "//pkg/registry/core/node/storage:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/node/rest/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/core/node/rest/BUILD deleted file mode 100644 index 04564fdcf966..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/node/rest/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["proxy.go"], - importpath = "k8s.io/kubernetes/pkg/registry/core/node/rest", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/capabilities:go_default_library", - "//pkg/kubelet/client:go_default_library", - "//pkg/registry/core/node:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/proxy:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/node/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/core/node/storage/BUILD deleted file mode 100644 index da7362cafb7e..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/node/storage/BUILD +++ /dev/null @@ -1,62 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["storage_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/kubelet/client:go_default_library", - "//pkg/registry/registrytest:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/testing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/testing:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/core/node/storage", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/v1:go_default_library", - "//pkg/kubelet/client:go_default_library", - "//pkg/printers:go_default_library", - "//pkg/printers/internalversion:go_default_library", - "//pkg/printers/storage:go_default_library", - "//pkg/registry/core/node:go_default_library", - "//pkg/registry/core/node/rest:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/node/storage/storage.go b/vendor/k8s.io/kubernetes/pkg/registry/core/node/storage/storage.go index 2716190f2b06..695596cde8f9 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/node/storage/storage.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/core/node/storage/storage.go @@ -37,6 +37,7 @@ import ( printerstorage "k8s.io/kubernetes/pkg/printers/storage" "k8s.io/kubernetes/pkg/registry/core/node" noderest "k8s.io/kubernetes/pkg/registry/core/node/rest" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // NodeStorage includes storage for nodes and all sub resources. @@ -77,6 +78,11 @@ func (r *StatusREST) Update(ctx context.Context, name string, objInfo rest.Updat return r.store.Update(ctx, name, objInfo, createValidation, updateValidation, false, options) } +// GetResetFields implements rest.ResetFieldsStrategy +func (r *StatusREST) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + return r.store.GetResetFields() +} + // NewStorage returns a NodeStorage object that will work against nodes. func NewStorage(optsGetter generic.RESTOptionsGetter, kubeletClientConfig client.KubeletClientConfig, proxyTransport http.RoundTripper) (*NodeStorage, error) { store := &genericregistry.Store{ @@ -85,10 +91,10 @@ func NewStorage(optsGetter generic.RESTOptionsGetter, kubeletClientConfig client PredicateFunc: node.MatchNode, DefaultQualifiedResource: api.Resource("nodes"), - CreateStrategy: node.Strategy, - UpdateStrategy: node.Strategy, - DeleteStrategy: node.Strategy, - ExportStrategy: node.Strategy, + CreateStrategy: node.Strategy, + UpdateStrategy: node.Strategy, + DeleteStrategy: node.Strategy, + ResetFieldsStrategy: node.Strategy, TableConvertor: printerstorage.TableConvertor{TableGenerator: printers.NewTableGenerator().With(printersinternal.AddHandlers)}, } @@ -103,6 +109,7 @@ func NewStorage(optsGetter generic.RESTOptionsGetter, kubeletClientConfig client statusStore := *store statusStore.UpdateStrategy = node.StatusStrategy + statusStore.ResetFieldsStrategy = node.StatusStrategy // Set up REST handlers nodeREST := &REST{Store: store, proxyTransport: proxyTransport} diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/node/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/core/node/strategy.go index aaddb69e72a4..2fe255155bcb 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/node/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/core/node/strategy.go @@ -41,6 +41,7 @@ import ( "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/pkg/kubelet/client" proxyutil "k8s.io/kubernetes/pkg/proxy/util" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // nodeStrategy implements behavior for nodes @@ -58,6 +59,18 @@ func (nodeStrategy) NamespaceScoped() bool { return false } +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (nodeStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + fields := map[fieldpath.APIVersion]*fieldpath.Set{ + "v1": fieldpath.NewSet( + fieldpath.MakePathOrDie("status"), + ), + } + + return fields +} + // AllowCreateOnUpdate is false for nodes. func (nodeStrategy) AllowCreateOnUpdate() bool { return false @@ -141,28 +154,24 @@ func (nodeStrategy) AllowUnconditionalUpdate() bool { return true } -func (ns nodeStrategy) Export(ctx context.Context, obj runtime.Object, exact bool) error { - n, ok := obj.(*api.Node) - if !ok { - // unexpected programmer error - return fmt.Errorf("unexpected object: %v", obj) - } - ns.PrepareForCreate(ctx, obj) - if exact { - return nil - } - // Nodes are the only resources that allow direct status edits, therefore - // we clear that without exact so that the node value can be reused. - n.Status = api.NodeStatus{} - return nil -} - type nodeStatusStrategy struct { nodeStrategy } var StatusStrategy = nodeStatusStrategy{Strategy} +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (nodeStatusStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + fields := map[fieldpath.APIVersion]*fieldpath.Set{ + "v1": fieldpath.NewSet( + fieldpath.MakePathOrDie("spec"), + ), + } + + return fields +} + func (nodeStatusStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object) { newNode := obj.(*api.Node) oldNode := old.(*api.Node) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/persistentvolume/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/core/persistentvolume/BUILD deleted file mode 100644 index 2369e2ce8c40..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/persistentvolume/BUILD +++ /dev/null @@ -1,57 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "strategy.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/core/persistentvolume", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/api/persistentvolume:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/validation:go_default_library", - "//pkg/volume/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["strategy_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/api/testing:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/install:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/core/persistentvolume/storage:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/persistentvolume/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/core/persistentvolume/storage/BUILD deleted file mode 100644 index 760e5c54ff5e..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/persistentvolume/storage/BUILD +++ /dev/null @@ -1,60 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["storage_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/registry/registrytest:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/testing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/testing:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/core/persistentvolume/storage", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/printers:go_default_library", - "//pkg/printers/internalversion:go_default_library", - "//pkg/printers/storage:go_default_library", - "//pkg/registry/core/persistentvolume:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/persistentvolume/storage/storage.go b/vendor/k8s.io/kubernetes/pkg/registry/core/persistentvolume/storage/storage.go index 6b4cec9819a8..f4f303bac99b 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/persistentvolume/storage/storage.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/core/persistentvolume/storage/storage.go @@ -29,6 +29,7 @@ import ( printersinternal "k8s.io/kubernetes/pkg/printers/internalversion" printerstorage "k8s.io/kubernetes/pkg/printers/storage" "k8s.io/kubernetes/pkg/registry/core/persistentvolume" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // REST implements a RESTStorage for persistent volumes. @@ -48,6 +49,7 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, error) { UpdateStrategy: persistentvolume.Strategy, DeleteStrategy: persistentvolume.Strategy, ReturnDeletedObject: true, + ResetFieldsStrategy: persistentvolume.Strategy, TableConvertor: printerstorage.TableConvertor{TableGenerator: printers.NewTableGenerator().With(printersinternal.AddHandlers)}, } @@ -58,6 +60,7 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, error) { statusStore := *store statusStore.UpdateStrategy = persistentvolume.StatusStrategy + statusStore.ResetFieldsStrategy = persistentvolume.StatusStrategy return &REST{store}, &StatusREST{store: &statusStore}, nil } @@ -91,3 +94,8 @@ func (r *StatusREST) Update(ctx context.Context, name string, objInfo rest.Updat // subresources should never allow create on update. return r.store.Update(ctx, name, objInfo, createValidation, updateValidation, false, options) } + +// GetResetFields implements rest.ResetFieldsStrategy +func (r *StatusREST) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + return r.store.GetResetFields() +} diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/persistentvolume/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/core/persistentvolume/strategy.go index 5ab7d1edd4ac..2cabf3946214 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/persistentvolume/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/core/persistentvolume/strategy.go @@ -32,6 +32,7 @@ import ( api "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/apis/core/validation" volumevalidation "k8s.io/kubernetes/pkg/volume/validation" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // persistentvolumeStrategy implements behavior for PersistentVolume objects @@ -48,6 +49,18 @@ func (persistentvolumeStrategy) NamespaceScoped() bool { return false } +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (persistentvolumeStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + fields := map[fieldpath.APIVersion]*fieldpath.Set{ + "v1": fieldpath.NewSet( + fieldpath.MakePathOrDie("status"), + ), + } + + return fields +} + // ResetBeforeCreate clears the Status field which is not allowed to be set by end users on creation. func (persistentvolumeStrategy) PrepareForCreate(ctx context.Context, obj runtime.Object) { pv := obj.(*api.PersistentVolume) @@ -96,6 +109,18 @@ type persistentvolumeStatusStrategy struct { var StatusStrategy = persistentvolumeStatusStrategy{Strategy} +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (persistentvolumeStatusStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + fields := map[fieldpath.APIVersion]*fieldpath.Set{ + "v1": fieldpath.NewSet( + fieldpath.MakePathOrDie("spec"), + ), + } + + return fields +} + // PrepareForUpdate sets the Spec field which is not allowed to be changed when updating a PV's Status func (persistentvolumeStatusStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object) { newPv := obj.(*api.PersistentVolume) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/persistentvolumeclaim/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/core/persistentvolumeclaim/BUILD deleted file mode 100644 index 08052378abab..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/persistentvolumeclaim/BUILD +++ /dev/null @@ -1,63 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "strategy.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/core/persistentvolumeclaim", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/api/persistentvolumeclaim:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/validation:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["strategy_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/api/testing:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/install:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/core/persistentvolumeclaim/storage:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/persistentvolumeclaim/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/core/persistentvolumeclaim/storage/BUILD deleted file mode 100644 index 48ad64311d81..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/persistentvolumeclaim/storage/BUILD +++ /dev/null @@ -1,60 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["storage_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/registry/registrytest:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/testing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/testing:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/core/persistentvolumeclaim/storage", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/printers:go_default_library", - "//pkg/printers/internalversion:go_default_library", - "//pkg/printers/storage:go_default_library", - "//pkg/registry/core/persistentvolumeclaim:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/persistentvolumeclaim/storage/storage.go b/vendor/k8s.io/kubernetes/pkg/registry/core/persistentvolumeclaim/storage/storage.go index 560b7264371e..409e0695365e 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/persistentvolumeclaim/storage/storage.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/core/persistentvolumeclaim/storage/storage.go @@ -29,6 +29,7 @@ import ( printersinternal "k8s.io/kubernetes/pkg/printers/internalversion" printerstorage "k8s.io/kubernetes/pkg/printers/storage" "k8s.io/kubernetes/pkg/registry/core/persistentvolumeclaim" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // REST implements a RESTStorage for persistent volume claims. @@ -48,6 +49,7 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, error) { UpdateStrategy: persistentvolumeclaim.Strategy, DeleteStrategy: persistentvolumeclaim.Strategy, ReturnDeletedObject: true, + ResetFieldsStrategy: persistentvolumeclaim.Strategy, TableConvertor: printerstorage.TableConvertor{TableGenerator: printers.NewTableGenerator().With(printersinternal.AddHandlers)}, } @@ -58,6 +60,7 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, error) { statusStore := *store statusStore.UpdateStrategy = persistentvolumeclaim.StatusStrategy + statusStore.ResetFieldsStrategy = persistentvolumeclaim.StatusStrategy return &REST{store}, &StatusREST{store: &statusStore}, nil } @@ -91,3 +94,8 @@ func (r *StatusREST) Update(ctx context.Context, name string, objInfo rest.Updat // subresources should never allow create on update. return r.store.Update(ctx, name, objInfo, createValidation, updateValidation, false, options) } + +// GetResetFields implements rest.ResetFieldsStrategy +func (r *StatusREST) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + return r.store.GetResetFields() +} diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/persistentvolumeclaim/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/core/persistentvolumeclaim/strategy.go index 14e0d26a1636..23b7acb3c9d4 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/persistentvolumeclaim/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/core/persistentvolumeclaim/strategy.go @@ -33,6 +33,7 @@ import ( api "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/apis/core/validation" "k8s.io/kubernetes/pkg/features" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // persistentvolumeclaimStrategy implements behavior for PersistentVolumeClaim objects @@ -49,6 +50,18 @@ func (persistentvolumeclaimStrategy) NamespaceScoped() bool { return true } +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (persistentvolumeclaimStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + fields := map[fieldpath.APIVersion]*fieldpath.Set{ + "v1": fieldpath.NewSet( + fieldpath.MakePathOrDie("status"), + ), + } + + return fields +} + // PrepareForCreate clears the Status field which is not allowed to be set by end users on creation. func (persistentvolumeclaimStrategy) PrepareForCreate(ctx context.Context, obj runtime.Object) { pvc := obj.(*api.PersistentVolumeClaim) @@ -94,6 +107,18 @@ type persistentvolumeclaimStatusStrategy struct { var StatusStrategy = persistentvolumeclaimStatusStrategy{Strategy} +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (persistentvolumeclaimStatusStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + fields := map[fieldpath.APIVersion]*fieldpath.Set{ + "v1": fieldpath.NewSet( + fieldpath.MakePathOrDie("spec"), + ), + } + + return fields +} + // PrepareForUpdate sets the Spec field which is not allowed to be changed when updating a PV's Status func (persistentvolumeclaimStatusStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object) { newPv := obj.(*api.PersistentVolumeClaim) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/pod/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/core/pod/BUILD deleted file mode 100644 index 47b3f4794108..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/pod/BUILD +++ /dev/null @@ -1,84 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "strategy.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/core/pod", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/api/pod:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/helper/qos:go_default_library", - "//pkg/apis/core/validation:go_default_library", - "//pkg/features:go_default_library", - "//pkg/kubelet/client:go_default_library", - "//pkg/proxy/util:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/features:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["strategy_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/api/testing:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/install:go_default_library", - "//pkg/features:go_default_library", - "//pkg/kubelet/client:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/core/pod/rest:all-srcs", - "//pkg/registry/core/pod/storage:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/pod/rest/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/core/pod/rest/BUILD deleted file mode 100644 index e61a2ff13cf4..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/pod/rest/BUILD +++ /dev/null @@ -1,61 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "log.go", - "subresources.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/core/pod/rest", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/install:go_default_library", - "//pkg/apis/core/validation:go_default_library", - "//pkg/capabilities:go_default_library", - "//pkg/features:go_default_library", - "//pkg/kubelet/client:go_default_library", - "//pkg/registry/core/pod:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/proxy:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/features:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["log_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/registry/registrytest:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/pod/rest/log.go b/vendor/k8s.io/kubernetes/pkg/registry/core/pod/rest/log.go index 9eb14ec8bac4..9d5f320978e0 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/pod/rest/log.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/core/pod/rest/log.go @@ -20,15 +20,15 @@ import ( "context" "fmt" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" + "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/runtime" genericregistry "k8s.io/apiserver/pkg/registry/generic/registry" genericrest "k8s.io/apiserver/pkg/registry/generic/rest" "k8s.io/apiserver/pkg/registry/rest" - utilfeature "k8s.io/apiserver/pkg/util/feature" api "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/apis/core/validation" - "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/pkg/kubelet/client" "k8s.io/kubernetes/pkg/registry/core/pod" @@ -70,13 +70,15 @@ func (r *LogREST) ProducesObject(verb string) interface{} { // Get retrieves a runtime.Object that will stream the contents of the pod log func (r *LogREST) Get(ctx context.Context, name string, opts runtime.Object) (runtime.Object, error) { + // register the metrics if the context is used. This assumes sync.Once is fast. If it's not, it could be an init block. + registerMetrics() + logOpts, ok := opts.(*api.PodLogOptions) if !ok { return nil, fmt.Errorf("invalid options object: %#v", opts) } - if !utilfeature.DefaultFeatureGate.Enabled(features.AllowInsecureBackendProxy) { - logOpts.InsecureSkipTLSVerifyBackend = false - } + + countSkipTLSMetric(logOpts.InsecureSkipTLSVerifyBackend) if errs := validation.ValidatePodLogOptions(logOpts); len(errs) > 0 { return nil, errors.NewInvalid(api.Kind("PodLogOptions"), name, errs) @@ -86,15 +88,30 @@ func (r *LogREST) Get(ctx context.Context, name string, opts runtime.Object) (ru return nil, err } return &genericrest.LocationStreamer{ - Location: location, - Transport: transport, - ContentType: "text/plain", - Flush: logOpts.Follow, - ResponseChecker: genericrest.NewGenericHttpResponseChecker(api.Resource("pods/log"), name), - RedirectChecker: genericrest.PreventRedirects, + Location: location, + Transport: transport, + ContentType: "text/plain", + Flush: logOpts.Follow, + ResponseChecker: genericrest.NewGenericHttpResponseChecker(api.Resource("pods/log"), name), + RedirectChecker: genericrest.PreventRedirects, + TLSVerificationErrorCounter: podLogsTLSFailure, }, nil } +func countSkipTLSMetric(insecureSkipTLSVerifyBackend bool) { + usageType := usageEnforce + if insecureSkipTLSVerifyBackend { + usageType = usageSkipAllowed + } + + counter, err := podLogsUsage.GetMetricWithLabelValues(usageType) + if err != nil { + utilruntime.HandleError(err) + return + } + counter.Inc() +} + // NewGetOptions creates a new options object func (r *LogREST) NewGetOptions() (runtime.Object, bool, string) { return &api.PodLogOptions{}, false, "" diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/pod/rest/metrics.go b/vendor/k8s.io/kubernetes/pkg/registry/core/pod/rest/metrics.go new file mode 100644 index 000000000000..7286c4d7ab64 --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/registry/core/pod/rest/metrics.go @@ -0,0 +1,67 @@ +/* +Copyright 2020 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package rest + +import ( + "sync" + + "k8s.io/component-base/metrics" + "k8s.io/component-base/metrics/legacyregistry" +) + +const ( + namespace = "kube_apiserver" + subsystem = "pod_logs" + + usageEnforce = "enforce_tls" + usageSkipAllowed = "skip_tls_allowed" + usageSkipDenied = "skip_tls_denied" +) + +var ( + // podLogsUsage counts and categorizes how the insecure backend skip TLS option is used and allowed. + podLogsUsage = metrics.NewCounterVec( + &metrics.CounterOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "pods_logs_insecure_backend_total", + Help: "Total number of requests for pods/logs sliced by usage type: enforce_tls, skip_tls_allowed, skip_tls_denied", + StabilityLevel: metrics.ALPHA, + }, + []string{"usage"}, + ) + + // podLogsTLSFailure counts how many attempts to get pod logs fail on tls verification + podLogsTLSFailure = metrics.NewCounter( + &metrics.CounterOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "pods_logs_backend_tls_failure_total", + Help: "Total number of requests for pods/logs that failed due to kubelet server TLS verification", + StabilityLevel: metrics.ALPHA, + }, + ) +) + +var registerMetricsOnce sync.Once + +func registerMetrics() { + registerMetricsOnce.Do(func() { + legacyregistry.MustRegister(podLogsUsage) + legacyregistry.MustRegister(podLogsTLSFailure) + }) +} diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/pod/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/core/pod/storage/BUILD deleted file mode 100644 index d209cfb07ab0..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/pod/storage/BUILD +++ /dev/null @@ -1,96 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "eviction_test.go", - "storage_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/api/pod:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/policy:go_default_library", - "//pkg/registry/registrytest:go_default_library", - "//pkg/securitycontext:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/testing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/errors:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/testing:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "eviction.go", - "storage.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/core/pod/storage", - deps = [ - "//pkg/api/pod:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/validation:go_default_library", - "//pkg/apis/policy:go_default_library", - "//pkg/features:go_default_library", - "//pkg/kubelet/client:go_default_library", - "//pkg/printers:go_default_library", - "//pkg/printers/internalversion:go_default_library", - "//pkg/printers/storage:go_default_library", - "//pkg/registry/core/pod:go_default_library", - "//pkg/registry/core/pod/rest:go_default_library", - "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/errors:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/dryrun:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/util/retry:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/pod/storage/eviction.go b/vendor/k8s.io/kubernetes/pkg/registry/core/pod/storage/eviction.go index 28bf90e380a4..a4aa690cf8eb 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/pod/storage/eviction.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/core/pod/storage/eviction.go @@ -22,7 +22,7 @@ import ( "reflect" "time" - policyv1beta1 "k8s.io/api/policy/v1beta1" + policyv1 "k8s.io/api/policy/v1" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" @@ -31,8 +31,9 @@ import ( "k8s.io/apimachinery/pkg/util/wait" "k8s.io/apiserver/pkg/registry/rest" "k8s.io/apiserver/pkg/util/dryrun" - policyclient "k8s.io/client-go/kubernetes/typed/policy/v1beta1" + policyclient "k8s.io/client-go/kubernetes/typed/policy/v1" "k8s.io/client-go/util/retry" + pdbhelper "k8s.io/component-helpers/apps/poddisruptionbudget" podutil "k8s.io/kubernetes/pkg/api/pod" api "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/apis/policy" @@ -303,17 +304,17 @@ func resourceVersionIsUnset(options *metav1.DeleteOptions) bool { } func createTooManyRequestsError(name string) error { - // TODO(mml): Add a Retry-After header. Once there are time-based + // TODO: Once there are time-based // budgets, we can sometimes compute a sensible suggested value. But - // even without that, we can give a suggestion (10 minutes?) that + // even without that, we can give a suggestion (even if small) that // prevents well-behaved clients from hammering us. - err := errors.NewTooManyRequests("Cannot evict pod as it would violate the pod's disruption budget.", 0) + err := errors.NewTooManyRequests("Cannot evict pod as it would violate the pod's disruption budget.", 10) err.ErrStatus.Details.Causes = append(err.ErrStatus.Details.Causes, metav1.StatusCause{Type: "DisruptionBudget", Message: fmt.Sprintf("The disruption budget %s is still being processed by the server.", name)}) return err } // checkAndDecrement checks if the provided PodDisruptionBudget allows any disruption. -func (r *EvictionREST) checkAndDecrement(namespace string, podName string, pdb policyv1beta1.PodDisruptionBudget, dryRun bool) error { +func (r *EvictionREST) checkAndDecrement(namespace string, podName string, pdb policyv1.PodDisruptionBudget, dryRun bool) error { if pdb.Status.ObservedGeneration < pdb.Generation { return createTooManyRequestsError(pdb.Name) @@ -331,6 +332,10 @@ func (r *EvictionREST) checkAndDecrement(namespace string, podName string, pdb p } pdb.Status.DisruptionsAllowed-- + if pdb.Status.DisruptionsAllowed == 0 { + pdbhelper.UpdateDisruptionAllowedCondition(&pdb) + } + // If this is a dry-run, we don't need to go any further than that. if dryRun == true { return nil @@ -353,17 +358,13 @@ func (r *EvictionREST) checkAndDecrement(namespace string, podName string, pdb p } // getPodDisruptionBudgets returns any PDBs that match the pod or err if there's an error. -func (r *EvictionREST) getPodDisruptionBudgets(ctx context.Context, pod *api.Pod) ([]policyv1beta1.PodDisruptionBudget, error) { - if len(pod.Labels) == 0 { - return nil, nil - } - +func (r *EvictionREST) getPodDisruptionBudgets(ctx context.Context, pod *api.Pod) ([]policyv1.PodDisruptionBudget, error) { pdbList, err := r.podDisruptionBudgetClient.PodDisruptionBudgets(pod.Namespace).List(context.TODO(), metav1.ListOptions{}) if err != nil { return nil, err } - var pdbs []policyv1beta1.PodDisruptionBudget + var pdbs []policyv1.PodDisruptionBudget for _, pdb := range pdbList.Items { if pdb.Namespace != pod.Namespace { continue diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/pod/storage/storage.go b/vendor/k8s.io/kubernetes/pkg/registry/core/pod/storage/storage.go index e82bb4c5db91..786560a8110e 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/pod/storage/storage.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/core/pod/storage/storage.go @@ -33,7 +33,7 @@ import ( storeerr "k8s.io/apiserver/pkg/storage/errors" "k8s.io/apiserver/pkg/util/dryrun" utilfeature "k8s.io/apiserver/pkg/util/feature" - policyclient "k8s.io/client-go/kubernetes/typed/policy/v1beta1" + policyclient "k8s.io/client-go/kubernetes/typed/policy/v1" podutil "k8s.io/kubernetes/pkg/api/pod" api "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/apis/core/validation" @@ -44,6 +44,7 @@ import ( printerstorage "k8s.io/kubernetes/pkg/printers/storage" registrypod "k8s.io/kubernetes/pkg/registry/core/pod" podrest "k8s.io/kubernetes/pkg/registry/core/pod/rest" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // PodStorage includes storage for pods and all sub resources @@ -79,6 +80,7 @@ func NewStorage(optsGetter generic.RESTOptionsGetter, k client.ConnectionInfoGet CreateStrategy: registrypod.Strategy, UpdateStrategy: registrypod.Strategy, DeleteStrategy: registrypod.Strategy, + ResetFieldsStrategy: registrypod.Strategy, ReturnDeletedObject: true, TableConvertor: printerstorage.TableConvertor{TableGenerator: printers.NewTableGenerator().With(printersinternal.AddHandlers)}, @@ -95,6 +97,7 @@ func NewStorage(optsGetter generic.RESTOptionsGetter, k client.ConnectionInfoGet statusStore := *store statusStore.UpdateStrategy = registrypod.StatusStrategy + statusStore.ResetFieldsStrategy = registrypod.StatusStrategy ephemeralContainersStore := *store ephemeralContainersStore.UpdateStrategy = registrypod.EphemeralContainersStrategy @@ -278,6 +281,11 @@ func (r *StatusREST) Update(ctx context.Context, name string, objInfo rest.Updat return r.store.Update(ctx, name, objInfo, createValidation, updateValidation, false, options) } +// GetResetFields implements rest.ResetFieldsStrategy +func (r *StatusREST) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + return r.store.GetResetFields() +} + // EphemeralContainersREST implements the REST endpoint for adding EphemeralContainers type EphemeralContainersREST struct { store *genericregistry.Store diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/pod/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/core/pod/strategy.go index cdf42f4a0dee..15aeb7b5d388 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/pod/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/core/pod/strategy.go @@ -46,9 +46,9 @@ import ( api "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/apis/core/helper/qos" "k8s.io/kubernetes/pkg/apis/core/validation" - "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/pkg/kubelet/client" proxyutil "k8s.io/kubernetes/pkg/proxy/util" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // podStrategy implements behavior for Pods @@ -66,6 +66,18 @@ func (podStrategy) NamespaceScoped() bool { return true } +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (podStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + fields := map[fieldpath.APIVersion]*fieldpath.Set{ + "v1": fieldpath.NewSet( + fieldpath.MakePathOrDie("status"), + ), + } + + return fields +} + // PrepareForCreate clears fields that are not allowed to be set by end users on creation. func (podStrategy) PrepareForCreate(ctx context.Context, obj runtime.Object) { pod := obj.(*api.Pod) @@ -91,7 +103,7 @@ func (podStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object // Validate validates a new pod. func (podStrategy) Validate(ctx context.Context, obj runtime.Object) field.ErrorList { pod := obj.(*api.Pod) - opts := podutil.GetValidationOptionsFromPodSpec(&pod.Spec, nil) + opts := podutil.GetValidationOptionsFromPodSpecAndMeta(&pod.Spec, nil, &pod.ObjectMeta, nil) return validation.ValidatePodCreate(pod, opts) } @@ -109,7 +121,7 @@ func (podStrategy) ValidateUpdate(ctx context.Context, obj, old runtime.Object) // Allow downward api usage of hugepages on pod update if feature is enabled or if the old pod already had used them. pod := obj.(*api.Pod) oldPod := old.(*api.Pod) - opts := podutil.GetValidationOptionsFromPodSpec(&pod.Spec, &oldPod.Spec) + opts := podutil.GetValidationOptionsFromPodSpecAndMeta(&pod.Spec, &oldPod.Spec, &pod.ObjectMeta, &oldPod.ObjectMeta) return validation.ValidatePodUpdate(obj.(*api.Pod), old.(*api.Pod), opts) } @@ -155,6 +167,18 @@ type podStatusStrategy struct { // StatusStrategy wraps and exports the used podStrategy for the storage package. var StatusStrategy = podStatusStrategy{Strategy} +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (podStatusStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + return map[fieldpath.APIVersion]*fieldpath.Set{ + "v1": fieldpath.NewSet( + fieldpath.MakePathOrDie("spec"), + fieldpath.MakePathOrDie("metadata", "deletionTimestamp"), + fieldpath.MakePathOrDie("metadata", "ownerReferences"), + ), + } +} + func (podStatusStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object) { newPod := obj.(*api.Pod) oldPod := old.(*api.Pod) @@ -167,7 +191,11 @@ func (podStatusStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime. } func (podStatusStrategy) ValidateUpdate(ctx context.Context, obj, old runtime.Object) field.ErrorList { - return validation.ValidatePodStatusUpdate(obj.(*api.Pod), old.(*api.Pod)) + pod := obj.(*api.Pod) + oldPod := old.(*api.Pod) + opts := podutil.GetValidationOptionsFromPodSpecAndMeta(&pod.Spec, &oldPod.Spec, &pod.ObjectMeta, &oldPod.ObjectMeta) + + return validation.ValidatePodStatusUpdate(obj.(*api.Pod), old.(*api.Pod), opts) } type podEphemeralContainersStrategy struct { @@ -180,7 +208,7 @@ var EphemeralContainersStrategy = podEphemeralContainersStrategy{Strategy} func (podEphemeralContainersStrategy) ValidateUpdate(ctx context.Context, obj, old runtime.Object) field.ErrorList { newPod := obj.(*api.Pod) oldPod := old.(*api.Pod) - opts := podutil.GetValidationOptionsFromPodSpec(&newPod.Spec, &oldPod.Spec) + opts := podutil.GetValidationOptionsFromPodSpecAndMeta(&newPod.Spec, &oldPod.Spec, &newPod.ObjectMeta, &oldPod.ObjectMeta) return validation.ValidatePodEphemeralContainersUpdate(newPod, oldPod, opts) } @@ -382,7 +410,7 @@ func LogLocation( RawQuery: params.Encode(), } - if opts.InsecureSkipTLSVerifyBackend && utilfeature.DefaultFeatureGate.Enabled(features.AllowInsecureBackendProxy) { + if opts.InsecureSkipTLSVerifyBackend { return loc, nodeInfo.InsecureSkipTLSVerifyTransport, nil } return loc, nodeInfo.Transport, nil @@ -574,7 +602,7 @@ func validateContainer(container string, pod *api.Pod) (string, error) { } // applySeccompVersionSkew implements the version skew behavior described in: -// https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/20190717-seccomp-ga.md#version-skew-strategy +// https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/135-seccomp#version-skew-strategy func applySeccompVersionSkew(pod *api.Pod) { // get possible annotation and field annotation, hasAnnotation := pod.Annotations[v1.SeccompPodAnnotationKey] diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/podtemplate/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/core/podtemplate/BUILD deleted file mode 100644 index 59f6d4e701c9..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/podtemplate/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "strategy.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/core/podtemplate", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/api/pod:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/core/podtemplate/storage:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/podtemplate/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/core/podtemplate/storage/BUILD deleted file mode 100644 index f700a9f66d1f..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/podtemplate/storage/BUILD +++ /dev/null @@ -1,53 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["storage_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/registry/registrytest:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/testing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/testing:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/core/podtemplate/storage", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/printers:go_default_library", - "//pkg/printers/internalversion:go_default_library", - "//pkg/printers/storage:go_default_library", - "//pkg/registry/core/podtemplate:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/podtemplate/storage/storage.go b/vendor/k8s.io/kubernetes/pkg/registry/core/podtemplate/storage/storage.go index 624290c067b7..d7dca23868a0 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/podtemplate/storage/storage.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/core/podtemplate/storage/storage.go @@ -42,7 +42,6 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, error) { CreateStrategy: podtemplate.Strategy, UpdateStrategy: podtemplate.Strategy, DeleteStrategy: podtemplate.Strategy, - ExportStrategy: podtemplate.Strategy, ReturnDeletedObject: true, diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/podtemplate/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/core/podtemplate/strategy.go index 65055785a060..1b26dfab3514 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/podtemplate/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/core/podtemplate/strategy.go @@ -87,8 +87,3 @@ func (podTemplateStrategy) ValidateUpdate(ctx context.Context, obj, old runtime. func (podTemplateStrategy) AllowUnconditionalUpdate() bool { return true } - -func (podTemplateStrategy) Export(ctx context.Context, obj runtime.Object, exact bool) error { - // Do nothing - return nil -} diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/rangeallocation/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/core/rangeallocation/BUILD deleted file mode 100644 index 8b55dd09d809..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/rangeallocation/BUILD +++ /dev/null @@ -1,29 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "registry.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/core/rangeallocation", - deps = ["//pkg/apis/core:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/replicationcontroller/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/core/replicationcontroller/BUILD deleted file mode 100644 index 1586a9a18d86..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/replicationcontroller/BUILD +++ /dev/null @@ -1,64 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "strategy.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/core/replicationcontroller", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/api/pod:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/helper:go_default_library", - "//pkg/apis/core/validation:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["strategy_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/api/testing:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/install:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/core/replicationcontroller/storage:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/replicationcontroller/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/core/replicationcontroller/storage/BUILD deleted file mode 100644 index 0c31ab0367b7..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/replicationcontroller/storage/BUILD +++ /dev/null @@ -1,68 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["storage_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/autoscaling:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/registry/registrytest:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/testing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/testing:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/core/replicationcontroller/storage", - deps = [ - "//pkg/apis/autoscaling:go_default_library", - "//pkg/apis/autoscaling/v1:go_default_library", - "//pkg/apis/autoscaling/validation:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/extensions/v1beta1:go_default_library", - "//pkg/printers:go_default_library", - "//pkg/printers/internalversion:go_default_library", - "//pkg/printers/storage:go_default_library", - "//pkg/registry/core/replicationcontroller:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/replicationcontroller/storage/storage.go b/vendor/k8s.io/kubernetes/pkg/registry/core/replicationcontroller/storage/storage.go index 1eac4333c3d7..8ae12247f185 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/replicationcontroller/storage/storage.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/core/replicationcontroller/storage/storage.go @@ -39,6 +39,7 @@ import ( printersinternal "k8s.io/kubernetes/pkg/printers/internalversion" printerstorage "k8s.io/kubernetes/pkg/printers/storage" "k8s.io/kubernetes/pkg/registry/core/replicationcontroller" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // ControllerStorage includes dummy storage for Replication Controllers and for Scale subresource. @@ -73,9 +74,10 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, error) { PredicateFunc: replicationcontroller.MatchController, DefaultQualifiedResource: api.Resource("replicationcontrollers"), - CreateStrategy: replicationcontroller.Strategy, - UpdateStrategy: replicationcontroller.Strategy, - DeleteStrategy: replicationcontroller.Strategy, + CreateStrategy: replicationcontroller.Strategy, + UpdateStrategy: replicationcontroller.Strategy, + DeleteStrategy: replicationcontroller.Strategy, + ResetFieldsStrategy: replicationcontroller.Strategy, TableConvertor: printerstorage.TableConvertor{TableGenerator: printers.NewTableGenerator().With(printersinternal.AddHandlers)}, } @@ -86,6 +88,7 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, error) { statusStore := *store statusStore.UpdateStrategy = replicationcontroller.StatusStrategy + statusStore.ResetFieldsStrategy = replicationcontroller.StatusStrategy return &REST{store}, &StatusREST{store: &statusStore}, nil } @@ -127,6 +130,11 @@ func (r *StatusREST) Update(ctx context.Context, name string, objInfo rest.Updat return r.store.Update(ctx, name, objInfo, createValidation, updateValidation, false, options) } +// GetResetFields implements rest.ResetFieldsStrategy +func (r *StatusREST) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + return r.store.GetResetFields() +} + type ScaleREST struct { store *genericregistry.Store } diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/replicationcontroller/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/core/replicationcontroller/strategy.go index 3ae193d6a71f..3722365cd435 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/replicationcontroller/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/core/replicationcontroller/strategy.go @@ -41,6 +41,7 @@ import ( api "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/apis/core/helper" "k8s.io/kubernetes/pkg/apis/core/validation" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // rcStrategy implements verification logic for Replication Controllers. @@ -73,6 +74,18 @@ func (rcStrategy) NamespaceScoped() bool { return true } +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (rcStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + fields := map[fieldpath.APIVersion]*fieldpath.Set{ + "v1": fieldpath.NewSet( + fieldpath.MakePathOrDie("status"), + ), + } + + return fields +} + // PrepareForCreate clears the status of a replication controller before creation. func (rcStrategy) PrepareForCreate(ctx context.Context, obj runtime.Object) { controller := obj.(*api.ReplicationController) @@ -192,6 +205,16 @@ type rcStatusStrategy struct { // StatusStrategy is the default logic invoked when updating object status. var StatusStrategy = rcStatusStrategy{Strategy} +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (rcStatusStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + return map[fieldpath.APIVersion]*fieldpath.Set{ + "v1": fieldpath.NewSet( + fieldpath.MakePathOrDie("spec"), + ), + } +} + func (rcStatusStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object) { newRc := obj.(*api.ReplicationController) oldRc := old.(*api.ReplicationController) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/resourcequota/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/core/resourcequota/BUILD deleted file mode 100644 index 54bba4eaa488..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/resourcequota/BUILD +++ /dev/null @@ -1,52 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "strategy.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/core/resourcequota", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["strategy_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/core/resourcequota/storage:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/resourcequota/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/core/resourcequota/storage/BUILD deleted file mode 100644 index 0de7aa37ee67..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/resourcequota/storage/BUILD +++ /dev/null @@ -1,59 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["storage_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/registry/registrytest:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/testing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/testing:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/core/resourcequota/storage", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/printers:go_default_library", - "//pkg/printers/internalversion:go_default_library", - "//pkg/printers/storage:go_default_library", - "//pkg/registry/core/resourcequota:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/resourcequota/storage/storage.go b/vendor/k8s.io/kubernetes/pkg/registry/core/resourcequota/storage/storage.go index de470913676d..961905e48324 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/resourcequota/storage/storage.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/core/resourcequota/storage/storage.go @@ -29,6 +29,7 @@ import ( printersinternal "k8s.io/kubernetes/pkg/printers/internalversion" printerstorage "k8s.io/kubernetes/pkg/printers/storage" "k8s.io/kubernetes/pkg/registry/core/resourcequota" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // REST implements a RESTStorage for resource quotas. @@ -46,6 +47,7 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, error) { CreateStrategy: resourcequota.Strategy, UpdateStrategy: resourcequota.Strategy, DeleteStrategy: resourcequota.Strategy, + ResetFieldsStrategy: resourcequota.Strategy, ReturnDeletedObject: true, TableConvertor: printerstorage.TableConvertor{TableGenerator: printers.NewTableGenerator().With(printersinternal.AddHandlers)}, @@ -57,6 +59,7 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, error) { statusStore := *store statusStore.UpdateStrategy = resourcequota.StatusStrategy + statusStore.ResetFieldsStrategy = resourcequota.StatusStrategy return &REST{store}, &StatusREST{store: &statusStore}, nil } @@ -90,3 +93,8 @@ func (r *StatusREST) Update(ctx context.Context, name string, objInfo rest.Updat // subresources should never allow create on update. return r.store.Update(ctx, name, objInfo, createValidation, updateValidation, false, options) } + +// GetResetFields implements rest.ResetFieldsStrategy +func (r *StatusREST) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + return r.store.GetResetFields() +} diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/resourcequota/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/core/resourcequota/strategy.go index aa123e19ebed..63b3f6089d45 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/resourcequota/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/core/resourcequota/strategy.go @@ -22,9 +22,12 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" "k8s.io/apiserver/pkg/storage/names" + utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/kubernetes/pkg/api/legacyscheme" api "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/apis/core/validation" + "k8s.io/kubernetes/pkg/features" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // resourcequotaStrategy implements behavior for ResourceQuota objects @@ -42,6 +45,18 @@ func (resourcequotaStrategy) NamespaceScoped() bool { return true } +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (resourcequotaStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + fields := map[fieldpath.APIVersion]*fieldpath.Set{ + "v1": fieldpath.NewSet( + fieldpath.MakePathOrDie("status"), + ), + } + + return fields +} + // PrepareForCreate clears fields that are not allowed to be set by end users on creation. func (resourcequotaStrategy) PrepareForCreate(ctx context.Context, obj runtime.Object) { resourcequota := obj.(*api.ResourceQuota) @@ -58,7 +73,8 @@ func (resourcequotaStrategy) PrepareForUpdate(ctx context.Context, obj, old runt // Validate validates a new resourcequota. func (resourcequotaStrategy) Validate(ctx context.Context, obj runtime.Object) field.ErrorList { resourcequota := obj.(*api.ResourceQuota) - return validation.ValidateResourceQuota(resourcequota) + opts := getValidationOptionsFromResourceQuota(resourcequota, nil) + return validation.ValidateResourceQuota(resourcequota, opts) } // Canonicalize normalizes the object after validation. @@ -72,8 +88,9 @@ func (resourcequotaStrategy) AllowCreateOnUpdate() bool { // ValidateUpdate is the default update validation for an end user. func (resourcequotaStrategy) ValidateUpdate(ctx context.Context, obj, old runtime.Object) field.ErrorList { - errorList := validation.ValidateResourceQuota(obj.(*api.ResourceQuota)) - return append(errorList, validation.ValidateResourceQuotaUpdate(obj.(*api.ResourceQuota), old.(*api.ResourceQuota))...) + newObj, oldObj := obj.(*api.ResourceQuota), old.(*api.ResourceQuota) + opts := getValidationOptionsFromResourceQuota(newObj, oldObj) + return validation.ValidateResourceQuotaUpdate(newObj, oldObj, opts) } func (resourcequotaStrategy) AllowUnconditionalUpdate() bool { @@ -87,6 +104,18 @@ type resourcequotaStatusStrategy struct { // StatusStrategy is the default logic invoked when updating object status. var StatusStrategy = resourcequotaStatusStrategy{Strategy} +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (resourcequotaStatusStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + fields := map[fieldpath.APIVersion]*fieldpath.Set{ + "v1": fieldpath.NewSet( + fieldpath.MakePathOrDie("spec"), + ), + } + + return fields +} + func (resourcequotaStatusStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object) { newResourcequota := obj.(*api.ResourceQuota) oldResourcequota := old.(*api.ResourceQuota) @@ -96,3 +125,37 @@ func (resourcequotaStatusStrategy) PrepareForUpdate(ctx context.Context, obj, ol func (resourcequotaStatusStrategy) ValidateUpdate(ctx context.Context, obj, old runtime.Object) field.ErrorList { return validation.ValidateResourceQuotaStatusUpdate(obj.(*api.ResourceQuota), old.(*api.ResourceQuota)) } + +func getValidationOptionsFromResourceQuota(newObj *api.ResourceQuota, oldObj *api.ResourceQuota) validation.ResourceQuotaValidationOptions { + opts := validation.ResourceQuotaValidationOptions{ + AllowPodAffinityNamespaceSelector: utilfeature.DefaultFeatureGate.Enabled(features.PodAffinityNamespaceSelector), + } + + if oldObj == nil { + return opts + } + + opts.AllowPodAffinityNamespaceSelector = opts.AllowPodAffinityNamespaceSelector || hasCrossNamespacePodAffinityScope(&oldObj.Spec) + return opts +} + +func hasCrossNamespacePodAffinityScope(spec *api.ResourceQuotaSpec) bool { + if spec == nil { + return false + } + for _, scope := range spec.Scopes { + if scope == api.ResourceQuotaScopeCrossNamespacePodAffinity { + return true + } + } + + if spec.ScopeSelector == nil { + return false + } + for _, req := range spec.ScopeSelector.MatchExpressions { + if req.ScopeName == api.ResourceQuotaScopeCrossNamespacePodAffinity { + return true + } + } + return false +} diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/rest/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/core/rest/BUILD deleted file mode 100644 index 42a6b13e17c5..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/rest/BUILD +++ /dev/null @@ -1,80 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["storage_core_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/storage:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/storagebackend:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["storage_core.go"], - importpath = "k8s.io/kubernetes/pkg/registry/core/rest", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/cluster/ports:go_default_library", - "//pkg/features:go_default_library", - "//pkg/kubelet/client:go_default_library", - "//pkg/registry/core/componentstatus:go_default_library", - "//pkg/registry/core/configmap/storage:go_default_library", - "//pkg/registry/core/endpoint/storage:go_default_library", - "//pkg/registry/core/event/storage:go_default_library", - "//pkg/registry/core/limitrange/storage:go_default_library", - "//pkg/registry/core/namespace/storage:go_default_library", - "//pkg/registry/core/node/storage:go_default_library", - "//pkg/registry/core/persistentvolume/storage:go_default_library", - "//pkg/registry/core/persistentvolumeclaim/storage:go_default_library", - "//pkg/registry/core/pod/storage:go_default_library", - "//pkg/registry/core/podtemplate/storage:go_default_library", - "//pkg/registry/core/rangeallocation:go_default_library", - "//pkg/registry/core/replicationcontroller/storage:go_default_library", - "//pkg/registry/core/resourcequota/storage:go_default_library", - "//pkg/registry/core/secret/storage:go_default_library", - "//pkg/registry/core/service/allocator:go_default_library", - "//pkg/registry/core/service/allocator/storage:go_default_library", - "//pkg/registry/core/service/ipallocator:go_default_library", - "//pkg/registry/core/service/portallocator:go_default_library", - "//pkg/registry/core/service/storage:go_default_library", - "//pkg/registry/core/serviceaccount/storage:go_default_library", - "//pkg/scheduler/apis/config:go_default_library", - "//pkg/serviceaccount:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/storage:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/rest/storage_core.go b/vendor/k8s.io/kubernetes/pkg/registry/core/rest/storage_core.go index 40aed6226c78..f9323413ea2d 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/rest/storage_core.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/core/rest/storage_core.go @@ -35,7 +35,7 @@ import ( serverstorage "k8s.io/apiserver/pkg/server/storage" "k8s.io/apiserver/pkg/storage/etcd3" utilfeature "k8s.io/apiserver/pkg/util/feature" - policyclient "k8s.io/client-go/kubernetes/typed/policy/v1beta1" + policyclient "k8s.io/client-go/kubernetes/typed/policy/v1" restclient "k8s.io/client-go/rest" "k8s.io/kubernetes/pkg/api/legacyscheme" api "k8s.io/kubernetes/pkg/apis/core" @@ -110,13 +110,9 @@ func (c LegacyRESTStorageProvider) NewLegacyRESTStorage(restOptionsGetter generi NegotiatedSerializer: legacyscheme.Codecs, } - var podDisruptionClient policyclient.PodDisruptionBudgetsGetter - if policyGroupVersion := (schema.GroupVersion{Group: "policy", Version: "v1beta1"}); legacyscheme.Scheme.IsVersionRegistered(policyGroupVersion) { - var err error - podDisruptionClient, err = policyclient.NewForConfig(c.LoopbackClientConfig) - if err != nil { - return LegacyRESTStorage{}, genericapiserver.APIGroupInfo{}, err - } + podDisruptionClient, err := policyclient.NewForConfig(c.LoopbackClientConfig) + if err != nil { + return LegacyRESTStorage{}, genericapiserver.APIGroupInfo{}, err } restStorage := LegacyRESTStorage{} diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/secret/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/core/secret/BUILD deleted file mode 100644 index c600ddb1aa1f..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/secret/BUILD +++ /dev/null @@ -1,62 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "strategy.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/core/secret", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/validation:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["strategy_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/api/testing:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/install:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/core/secret/storage:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/secret/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/core/secret/storage/BUILD deleted file mode 100644 index 295be7876377..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/secret/storage/BUILD +++ /dev/null @@ -1,54 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["storage_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/registry/registrytest:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/testing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/testing:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/core/secret/storage", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/printers:go_default_library", - "//pkg/printers/internalversion:go_default_library", - "//pkg/printers/storage:go_default_library", - "//pkg/registry/core/secret:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/secret/storage/storage.go b/vendor/k8s.io/kubernetes/pkg/registry/core/secret/storage/storage.go index 8faf5f9a3b53..81e2892df57f 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/secret/storage/storage.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/core/secret/storage/storage.go @@ -44,7 +44,6 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, error) { CreateStrategy: secret.Strategy, UpdateStrategy: secret.Strategy, DeleteStrategy: secret.Strategy, - ExportStrategy: secret.Strategy, TableConvertor: printerstorage.TableConvertor{TableGenerator: printers.NewTableGenerator().With(printersinternal.AddHandlers)}, } diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/secret/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/core/secret/strategy.go index 0d5908d8975f..2970c32f3ddf 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/secret/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/core/secret/strategy.go @@ -20,7 +20,6 @@ import ( "context" "fmt" - "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" @@ -29,11 +28,9 @@ import ( "k8s.io/apiserver/pkg/registry/rest" pkgstorage "k8s.io/apiserver/pkg/storage" "k8s.io/apiserver/pkg/storage/names" - utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/kubernetes/pkg/api/legacyscheme" api "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/apis/core/validation" - "k8s.io/kubernetes/pkg/features" ) // strategy implements behavior for Secret objects @@ -73,6 +70,12 @@ func (strategy) AllowCreateOnUpdate() bool { func (strategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object) { newSecret := obj.(*api.Secret) oldSecret := old.(*api.Secret) + + // this is weird, but consistent with what the validatedUpdate function used to do. + if len(newSecret.Type) == 0 { + newSecret.Type = oldSecret.Type + } + dropDisabledFields(newSecret, oldSecret) } @@ -80,40 +83,13 @@ func (strategy) ValidateUpdate(ctx context.Context, obj, old runtime.Object) fie return validation.ValidateSecretUpdate(obj.(*api.Secret), old.(*api.Secret)) } -func isImmutableInUse(secret *api.Secret) bool { - return secret != nil && secret.Immutable != nil -} - func dropDisabledFields(secret *api.Secret, oldSecret *api.Secret) { - if !utilfeature.DefaultFeatureGate.Enabled(features.ImmutableEphemeralVolumes) && !isImmutableInUse(oldSecret) { - secret.Immutable = nil - } } func (strategy) AllowUnconditionalUpdate() bool { return true } -func (s strategy) Export(ctx context.Context, obj runtime.Object, exact bool) error { - t, ok := obj.(*api.Secret) - if !ok { - // unexpected programmer error - return fmt.Errorf("unexpected object: %v", obj) - } - s.PrepareForCreate(ctx, obj) - if exact { - return nil - } - // secrets that are tied to the UID of a service account cannot be exported anyway - if t.Type == api.SecretTypeServiceAccountToken || len(t.Annotations[api.ServiceAccountUIDKey]) > 0 { - errs := []*field.Error{ - field.Invalid(field.NewPath("type"), t, "can not export service account secrets"), - } - return errors.NewInvalid(api.Kind("Secret"), t.Name, errs) - } - return nil -} - // GetAttrs returns labels and fields of a given object for filtering purposes. func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) { secret, ok := obj.(*api.Secret) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/service/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/core/service/BUILD deleted file mode 100644 index 92d6c0555edd..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/service/BUILD +++ /dev/null @@ -1,73 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "proxy.go", - "strategy.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/core/service", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/validation:go_default_library", - "//pkg/capabilities:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/proxy:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["strategy_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/install:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/core/service/allocator:all-srcs", - "//pkg/registry/core/service/ipallocator:all-srcs", - "//pkg/registry/core/service/portallocator:all-srcs", - "//pkg/registry/core/service/storage:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/service/allocator/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/core/service/allocator/BUILD deleted file mode 100644 index 3728f20744ff..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/service/allocator/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "bitmap.go", - "interfaces.go", - "utils.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/core/service/allocator", -) - -go_test( - name = "go_default_test", - srcs = [ - "bitmap_test.go", - "utils_test.go", - ], - embed = [":go_default_library"], - deps = ["//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/core/service/allocator/storage:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/service/allocator/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/core/service/allocator/storage/BUILD deleted file mode 100644 index 242669b69604..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/service/allocator/storage/BUILD +++ /dev/null @@ -1,54 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["storage_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/registry/core/service/allocator:go_default_library", - "//pkg/registry/registrytest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/testing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/storagebackend:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/core/service/allocator/storage", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/install:go_default_library", - "//pkg/registry/core/rangeallocation:go_default_library", - "//pkg/registry/core/service/allocator:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/errors:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/storagebackend:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/service/ipallocator/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/core/service/ipallocator/BUILD deleted file mode 100644 index 67b931e3f6df..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/service/ipallocator/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["allocator.go"], - importpath = "k8s.io/kubernetes/pkg/registry/core/service/ipallocator", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/registry/core/service/allocator:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["allocator_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/core/service/ipallocator/controller:all-srcs", - "//pkg/registry/core/service/ipallocator/storage:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/service/ipallocator/controller/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/core/service/ipallocator/controller/BUILD deleted file mode 100644 index ad8f45f1e44c..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/service/ipallocator/controller/BUILD +++ /dev/null @@ -1,58 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["repair.go"], - importpath = "k8s.io/kubernetes/pkg/registry/core/service/ipallocator/controller", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/v1/helper:go_default_library", - "//pkg/registry/core/rangeallocation:go_default_library", - "//pkg/registry/core/service/ipallocator:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/client-go/util/retry:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["repair_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/features:go_default_library", - "//pkg/registry/core/service/ipallocator:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/service/portallocator/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/core/service/portallocator/BUILD deleted file mode 100644 index 4f42bb77b3e5..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/service/portallocator/BUILD +++ /dev/null @@ -1,53 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "allocator.go", - "operation.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/core/service/portallocator", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/registry/core/service/allocator:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "allocator_test.go", - "operation_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/core/service/portallocator/controller:all-srcs", - "//pkg/registry/core/service/portallocator/storage:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/service/portallocator/controller/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/core/service/portallocator/controller/BUILD deleted file mode 100644 index 0b2a189494e9..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/service/portallocator/controller/BUILD +++ /dev/null @@ -1,56 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["repair.go"], - importpath = "k8s.io/kubernetes/pkg/registry/core/service/portallocator/controller", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/registry/core/rangeallocation:go_default_library", - "//pkg/registry/core/service/portallocator:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/client-go/util/retry:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["repair_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/registry/core/service/portallocator:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/service/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/core/service/storage/BUILD deleted file mode 100644 index 92d55e383a4a..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/service/storage/BUILD +++ /dev/null @@ -1,96 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "rest_test.go", - "storage_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/api/service:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/features:go_default_library", - "//pkg/registry/core/endpoint/storage:go_default_library", - "//pkg/registry/core/pod/storage:go_default_library", - "//pkg/registry/core/service/ipallocator:go_default_library", - "//pkg/registry/core/service/portallocator:go_default_library", - "//pkg/registry/registrytest:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/testing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/testing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/dryrun:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "rest.go", - "storage.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/core/service/storage", - deps = [ - "//pkg/api/service:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/validation:go_default_library", - "//pkg/features:go_default_library", - "//pkg/printers:go_default_library", - "//pkg/printers/internalversion:go_default_library", - "//pkg/printers/storage:go_default_library", - "//pkg/registry/core/service:go_default_library", - "//pkg/registry/core/service/ipallocator:go_default_library", - "//pkg/registry/core/service/portallocator:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/dryrun:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/service/storage/rest.go b/vendor/k8s.io/kubernetes/pkg/registry/core/service/storage/rest.go index 694120a23027..95ea56b54bf4 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/service/storage/rest.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/core/service/storage/rest.go @@ -36,18 +36,17 @@ import ( genericapirequest "k8s.io/apiserver/pkg/endpoints/request" "k8s.io/apiserver/pkg/registry/rest" "k8s.io/apiserver/pkg/util/dryrun" + utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/klog/v2" - apiservice "k8s.io/kubernetes/pkg/api/service" api "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/apis/core/validation" + "k8s.io/kubernetes/pkg/features" registry "k8s.io/kubernetes/pkg/registry/core/service" "k8s.io/kubernetes/pkg/registry/core/service/ipallocator" "k8s.io/kubernetes/pkg/registry/core/service/portallocator" netutil "k8s.io/utils/net" - - utilfeature "k8s.io/apiserver/pkg/util/feature" - "k8s.io/kubernetes/pkg/features" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // REST adapts a service registry into apiserver's RESTStorage model. @@ -79,8 +78,8 @@ type ServiceStorage interface { rest.CreaterUpdater rest.GracefulDeleter rest.Watcher - rest.Exporter rest.StorageVersionProvider + rest.ResetFieldsStrategy } type EndpointsStorage interface { @@ -189,10 +188,6 @@ func (rs *REST) Watch(ctx context.Context, options *metainternalversion.ListOpti return rs.services.Watch(ctx, options) } -func (rs *REST) Export(ctx context.Context, name string, opts metav1.ExportOptions) (runtime.Object, error) { - return rs.services.Export(ctx, name, opts) -} - func (rs *REST) Create(ctx context.Context, obj runtime.Object, createValidation rest.ValidateObjectFunc, options *metav1.CreateOptions) (runtime.Object, error) { service := obj.(*api.Service) @@ -519,6 +514,11 @@ func (rs *REST) Update(ctx context.Context, name string, objInfo rest.UpdatedObj return out, created, err } +// GetResetFields implements rest.ResetFieldsStrategy +func (rs *REST) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + return rs.services.GetResetFields() +} + // Implement Redirector. var _ = rest.Redirector(&REST{}) @@ -877,7 +877,7 @@ func (rs *REST) tryDefaultValidateServiceClusterIPFields(service *api.Service) e } } - // default families according to cluster IPs + // Infer IPFamilies[] from ClusterIPs[]. for i, ip := range service.Spec.ClusterIPs { if ip == api.ClusterIPNone { break @@ -887,8 +887,8 @@ func (rs *REST) tryDefaultValidateServiceClusterIPFields(service *api.Service) e // so the following is safe to do isIPv6 := netutil.IsIPv6String(ip) - // family is not there. - if i > len(service.Spec.IPFamilies)-1 { + // Family is not specified yet. + if i >= len(service.Spec.IPFamilies) { if isIPv6 { // first make sure that family(ip) is configured if _, found := rs.serviceIPAllocatorsByFamily[api.IPv6Protocol]; !found { @@ -907,15 +907,23 @@ func (rs *REST) tryDefaultValidateServiceClusterIPFields(service *api.Service) e } } - // default headless+selectorless - if len(service.Spec.ClusterIPs) > 0 && service.Spec.ClusterIPs[0] == api.ClusterIPNone && len(service.Spec.Selector) == 0 { + // Infer IPFamilyPolicy from IPFamilies[]. This block does not handle the + // final defaulting - that happens a bit later, after special-cases. + if service.Spec.IPFamilyPolicy == nil && len(service.Spec.IPFamilies) == 2 { + requireDualStack := api.IPFamilyPolicyRequireDualStack + service.Spec.IPFamilyPolicy = &requireDualStack + } + // Special-case: headless+selectorless + if len(service.Spec.ClusterIPs) > 0 && service.Spec.ClusterIPs[0] == api.ClusterIPNone && len(service.Spec.Selector) == 0 { + // If the use said nothing about policy and we can't infer it, they get dual-stack if service.Spec.IPFamilyPolicy == nil { requireDualStack := api.IPFamilyPolicyRequireDualStack service.Spec.IPFamilyPolicy = &requireDualStack } - // if not set by user + // If IPFamilies was not set by the user, start with the default + // family. if len(service.Spec.IPFamilies) == 0 { service.Spec.IPFamilies = []api.IPFamily{rs.defaultServiceIPFamily} } @@ -924,8 +932,7 @@ func (rs *REST) tryDefaultValidateServiceClusterIPFields(service *api.Service) e // cluster the user is allowed to create headless services that has multi families // the validation allows it if len(service.Spec.IPFamilies) < 2 { - if *(service.Spec.IPFamilyPolicy) == api.IPFamilyPolicyRequireDualStack || - (*(service.Spec.IPFamilyPolicy) == api.IPFamilyPolicyPreferDualStack && len(rs.serviceIPAllocatorsByFamily) == 2) { + if *(service.Spec.IPFamilyPolicy) != api.IPFamilyPolicySingleStack { // add the alt ipfamily if service.Spec.IPFamilies[0] == api.IPv4Protocol { service.Spec.IPFamilies = append(service.Spec.IPFamilies, api.IPv6Protocol) @@ -961,8 +968,8 @@ func (rs *REST) tryDefaultValidateServiceClusterIPFields(service *api.Service) e return errors.NewInvalid(api.Kind("Service"), service.Name, el) } - // default ipFamilyPolicy to SingleStack. if there are - // web hooks, they must have already ran by now + // Finally, if IPFamilyPolicy is *still* not set, we can default it to + // SingleStack. If there are any webhooks, they have already run. if service.Spec.IPFamilyPolicy == nil { singleStack := api.IPFamilyPolicySingleStack service.Spec.IPFamilyPolicy = &singleStack diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/service/storage/storage.go b/vendor/k8s.io/kubernetes/pkg/registry/core/service/storage/storage.go index ba7d86980aa5..0e706bea01dc 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/service/storage/storage.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/core/service/storage/storage.go @@ -34,6 +34,7 @@ import ( "k8s.io/kubernetes/pkg/registry/core/service" registry "k8s.io/kubernetes/pkg/registry/core/service" svcreg "k8s.io/kubernetes/pkg/registry/core/service" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" netutil "k8s.io/utils/net" ) @@ -54,10 +55,10 @@ func NewGenericREST(optsGetter generic.RESTOptionsGetter, serviceCIDR net.IPNet, DefaultQualifiedResource: api.Resource("services"), ReturnDeletedObject: true, - CreateStrategy: strategy, - UpdateStrategy: strategy, - DeleteStrategy: strategy, - ExportStrategy: strategy, + CreateStrategy: strategy, + UpdateStrategy: strategy, + DeleteStrategy: strategy, + ResetFieldsStrategy: strategy, TableConvertor: printerstorage.TableConvertor{TableGenerator: printers.NewTableGenerator().With(printersinternal.AddHandlers)}, } @@ -67,12 +68,14 @@ func NewGenericREST(optsGetter generic.RESTOptionsGetter, serviceCIDR net.IPNet, } statusStore := *store - statusStore.UpdateStrategy = service.NewServiceStatusStrategy(strategy) + statusStrategy := service.NewServiceStatusStrategy(strategy) + statusStore.UpdateStrategy = statusStrategy + statusStore.ResetFieldsStrategy = statusStrategy ipv4 := api.IPv4Protocol ipv6 := api.IPv6Protocol - var primaryIPFamily *api.IPFamily = nil - var secondaryFamily *api.IPFamily = nil + var primaryIPFamily *api.IPFamily + var secondaryFamily *api.IPFamily if netutil.IsIPv6CIDR(&serviceCIDR) { primaryIPFamily = &ipv6 if hasSecondary { @@ -126,47 +129,43 @@ func (r *StatusREST) Update(ctx context.Context, name string, objInfo rest.Updat return r.store.Update(ctx, name, objInfo, createValidation, updateValidation, false, options) } +// GetResetFields implements rest.ResetFieldsStrategy +func (r *StatusREST) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + return r.store.GetResetFields() +} + // defaultOnRead sets interlinked fields that were not previously set on read. // We can't do this in the normal defaulting path because that same logic // applies on Get, Create, and Update, but we need to distinguish between them. // // This will be called on both Service and ServiceList types. -func (r *GenericREST) defaultOnRead(obj runtime.Object) error { - service, ok := obj.(*api.Service) - if ok { - return r.defaultOnReadService(service) +func (r *GenericREST) defaultOnRead(obj runtime.Object) { + switch s := obj.(type) { + case *api.Service: + r.defaultOnReadService(s) + case *api.ServiceList: + r.defaultOnReadServiceList(s) + default: + // This was not an object we can default. This is not an error, as the + // caching layer can pass through here, too. } - - serviceList, ok := obj.(*api.ServiceList) - if ok { - return r.defaultOnReadServiceList(serviceList) - } - - // This was not an object we can default. This is not an error, as the - // caching layer can pass through here, too. - return nil } // defaultOnReadServiceList defaults a ServiceList. -func (r *GenericREST) defaultOnReadServiceList(serviceList *api.ServiceList) error { +func (r *GenericREST) defaultOnReadServiceList(serviceList *api.ServiceList) { if serviceList == nil { - return nil + return } for i := range serviceList.Items { - err := r.defaultOnReadService(&serviceList.Items[i]) - if err != nil { - return err - } + r.defaultOnReadService(&serviceList.Items[i]) } - - return nil } // defaultOnReadService defaults a single Service. -func (r *GenericREST) defaultOnReadService(service *api.Service) error { +func (r *GenericREST) defaultOnReadService(service *api.Service) { if service == nil { - return nil + return } // We might find Services that were written before ClusterIP became plural. @@ -176,11 +175,11 @@ func (r *GenericREST) defaultOnReadService(service *api.Service) error { // The rest of this does not apply unless dual-stack is enabled. if !utilfeature.DefaultFeatureGate.Enabled(features.IPv6DualStack) { - return nil + return } if len(service.Spec.IPFamilies) > 0 { - return nil // already defaulted + return // already defaulted } // set clusterIPs based on ClusterIP @@ -222,7 +221,6 @@ func (r *GenericREST) defaultOnReadService(service *api.Service) error { service.Spec.IPFamilyPolicy = &singleStack } } - } else { // headful // make sure a slice exists to receive the families @@ -241,6 +239,4 @@ func (r *GenericREST) defaultOnReadService(service *api.Service) error { } } } - - return nil } diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/service/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/core/service/strategy.go index 79c8b7c7d8b7..db60cc2290f6 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/service/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/core/service/strategy.go @@ -18,7 +18,6 @@ package service import ( "context" - "fmt" "net" "reflect" @@ -33,11 +32,12 @@ import ( "k8s.io/kubernetes/pkg/apis/core/validation" "k8s.io/kubernetes/pkg/features" netutil "k8s.io/utils/net" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) type Strategy interface { rest.RESTCreateUpdateStrategy - rest.RESTExportStrategy + rest.ResetFieldsStrategy } // svcStrategy implements behavior for Services @@ -92,6 +92,18 @@ func (svcStrategy) NamespaceScoped() bool { return true } +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (svcStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + fields := map[fieldpath.APIVersion]*fieldpath.Set{ + "v1": fieldpath.NewSet( + fieldpath.MakePathOrDie("status"), + ), + } + + return fields +} + // PrepareForCreate sets contextual defaults and clears fields that are not allowed to be set by end users on creation. func (strategy svcStrategy) PrepareForCreate(ctx context.Context, obj runtime.Object) { service := obj.(*api.Service) @@ -139,30 +151,6 @@ func (svcStrategy) AllowUnconditionalUpdate() bool { return true } -func (svcStrategy) Export(ctx context.Context, obj runtime.Object, exact bool) error { - t, ok := obj.(*api.Service) - if !ok { - // unexpected programmer error - return fmt.Errorf("unexpected object: %v", obj) - } - // TODO: service does not yet have a prepare create strategy (see above) - t.Status = api.ServiceStatus{} - if exact { - return nil - } - //set ClusterIPs as nil - if ClusterIPs[0] != None - if len(t.Spec.ClusterIPs) > 0 && t.Spec.ClusterIPs[0] != api.ClusterIPNone { - t.Spec.ClusterIP = "" - t.Spec.ClusterIPs = nil - } - if t.Spec.Type == api.ServiceTypeNodePort { - for i := range t.Spec.Ports { - t.Spec.Ports[i].NodePort = 0 - } - } - return nil -} - // dropServiceDisabledFields drops fields that are not used if their associated feature gates // are not enabled. The typical pattern is: // if !utilfeature.DefaultFeatureGate.Enabled(features.MyFeature) && !myFeatureInUse(oldSvc) { @@ -182,7 +170,7 @@ func dropServiceDisabledFields(newSvc *api.Service, oldSvc *api.Service) { newSvc.Spec.TopologyKeys = nil } - // Clear AllocateLoadBalancerNodePorts if ServiceLBNodePortControl if not enabled + // Clear AllocateLoadBalancerNodePorts if ServiceLBNodePortControl is not enabled if !utilfeature.DefaultFeatureGate.Enabled(features.ServiceLBNodePortControl) { if !allocateLoadBalancerNodePortsInUse(oldSvc) { newSvc.Spec.AllocateLoadBalancerNodePorts = nil @@ -199,6 +187,20 @@ func dropServiceDisabledFields(newSvc *api.Service, oldSvc *api.Service) { } } } + + // Drop LoadBalancerClass if LoadBalancerClass is not enabled + if !utilfeature.DefaultFeatureGate.Enabled(features.ServiceLoadBalancerClass) { + if !loadBalancerClassInUse(oldSvc) { + newSvc.Spec.LoadBalancerClass = nil + } + } + + // Clear InternalTrafficPolicy if not enabled + if !utilfeature.DefaultFeatureGate.Enabled(features.ServiceInternalTrafficPolicy) { + if !serviceInternalTrafficPolicyInUse(oldSvc) { + newSvc.Spec.InternalTrafficPolicy = nil + } + } } // returns true if svc.Spec.AllocateLoadBalancerNodePorts field is in use @@ -251,6 +253,21 @@ func loadBalancerPortsInUse(svc *api.Service) bool { return false } +// returns true if svc.Spec.LoadBalancerClass field is in use +func loadBalancerClassInUse(svc *api.Service) bool { + if svc == nil { + return false + } + return svc.Spec.LoadBalancerClass != nil +} + +func serviceInternalTrafficPolicyInUse(svc *api.Service) bool { + if svc == nil { + return false + } + return svc.Spec.InternalTrafficPolicy != nil +} + type serviceStatusStrategy struct { Strategy } @@ -260,6 +277,18 @@ func NewServiceStatusStrategy(strategy Strategy) Strategy { return serviceStatusStrategy{strategy} } +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (serviceStatusStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + fields := map[fieldpath.APIVersion]*fieldpath.Set{ + "v1": fieldpath.NewSet( + fieldpath.MakePathOrDie("spec"), + ), + } + + return fields +} + // PrepareForUpdate clears fields that are not allowed to be set by end users on update of status func (serviceStatusStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object) { newService := obj.(*api.Service) @@ -416,6 +445,12 @@ func dropTypeDependentFields(newSvc *api.Service, oldSvc *api.Service) { } } + // If a user is switching to a type that doesn't need LoadBalancerClass AND they did not change + // this field, it is safe to drop it. + if canSetLoadBalancerClass(oldSvc) && !canSetLoadBalancerClass(newSvc) && sameLoadBalancerClass(oldSvc, newSvc) { + newSvc.Spec.LoadBalancerClass = nil + } + // NOTE: there are other fields like `selector` which we could wipe. // Historically we did not wipe them and they are not allocated from // finite pools, so we are (currently) choosing to leave them alone. @@ -490,6 +525,20 @@ func sameHCNodePort(oldSvc, newSvc *api.Service) bool { return oldSvc.Spec.HealthCheckNodePort == newSvc.Spec.HealthCheckNodePort } +func canSetLoadBalancerClass(svc *api.Service) bool { + return svc.Spec.Type == api.ServiceTypeLoadBalancer +} + +func sameLoadBalancerClass(oldSvc, newSvc *api.Service) bool { + if (oldSvc.Spec.LoadBalancerClass == nil) != (newSvc.Spec.LoadBalancerClass == nil) { + return false + } + if oldSvc.Spec.LoadBalancerClass == nil { + return true // both are nil + } + return *oldSvc.Spec.LoadBalancerClass == *newSvc.Spec.LoadBalancerClass +} + // this func allows user to downgrade a service by just changing // IPFamilyPolicy to SingleStack func trimFieldsForDualStackDowngrade(newService, oldService *api.Service) { diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/serviceaccount/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/core/serviceaccount/BUILD deleted file mode 100644 index 8d7784d0f547..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/serviceaccount/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "strategy.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/core/serviceaccount", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/core/serviceaccount/storage:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/core/serviceaccount/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/core/serviceaccount/storage/BUILD deleted file mode 100644 index 0374aa9e8c61..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/core/serviceaccount/storage/BUILD +++ /dev/null @@ -1,67 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["storage_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/registry/registrytest:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/testing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/testing:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "storage.go", - "token.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/core/serviceaccount/storage", - deps = [ - "//pkg/apis/authentication:go_default_library", - "//pkg/apis/authentication/validation:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/printers:go_default_library", - "//pkg/printers/internalversion:go_default_library", - "//pkg/printers/storage:go_default_library", - "//pkg/registry/core/serviceaccount:go_default_library", - "//pkg/serviceaccount:go_default_library", - "//staging/src/k8s.io/api/authentication/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/discovery/endpointslice/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/discovery/endpointslice/BUILD deleted file mode 100644 index 53821cb6d34f..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/discovery/endpointslice/BUILD +++ /dev/null @@ -1,54 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "strategy.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/discovery/endpointslice", - visibility = ["//visibility:public"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/discovery:go_default_library", - "//pkg/apis/discovery/validation:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/discovery/endpointslice/storage:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["strategy_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/discovery:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/discovery/endpointslice/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/discovery/endpointslice/storage/BUILD deleted file mode 100644 index b7cdad488fe8..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/discovery/endpointslice/storage/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/discovery/endpointslice/storage", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/discovery:go_default_library", - "//pkg/printers:go_default_library", - "//pkg/printers/internalversion:go_default_library", - "//pkg/printers/storage:go_default_library", - "//pkg/registry/discovery/endpointslice:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/discovery/endpointslice/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/discovery/endpointslice/strategy.go index 92cb2e65e063..c5e20b64bc2a 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/discovery/endpointslice/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/discovery/endpointslice/strategy.go @@ -19,10 +19,13 @@ package endpointslice import ( "context" + discoveryv1beta1 "k8s.io/api/discovery/v1beta1" apiequality "k8s.io/apimachinery/pkg/api/equality" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/util/validation/field" + genericapirequest "k8s.io/apiserver/pkg/endpoints/request" "k8s.io/apiserver/pkg/storage/names" utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/kubernetes/pkg/api/legacyscheme" @@ -51,6 +54,7 @@ func (endpointSliceStrategy) PrepareForCreate(ctx context.Context, obj runtime.O endpointSlice.Generation = 1 dropDisabledFieldsOnCreate(endpointSlice) + dropTopologyOnV1(ctx, nil, endpointSlice) } // PrepareForUpdate clears fields that are not allowed to be set by end users on update. @@ -62,10 +66,10 @@ func (endpointSliceStrategy) PrepareForUpdate(ctx context.Context, obj, old runt // This needs to be changed if a status attribute is added to EndpointSlice ogNewMeta := newEPS.ObjectMeta ogOldMeta := oldEPS.ObjectMeta - newEPS.ObjectMeta = v1.ObjectMeta{} - oldEPS.ObjectMeta = v1.ObjectMeta{} + newEPS.ObjectMeta = metav1.ObjectMeta{} + oldEPS.ObjectMeta = metav1.ObjectMeta{} - if !apiequality.Semantic.DeepEqual(newEPS, oldEPS) { + if !apiequality.Semantic.DeepEqual(newEPS, oldEPS) || !apiequality.Semantic.DeepEqual(ogNewMeta.Labels, ogOldMeta.Labels) { ogNewMeta.Generation = ogOldMeta.Generation + 1 } @@ -73,6 +77,7 @@ func (endpointSliceStrategy) PrepareForUpdate(ctx context.Context, obj, old runt oldEPS.ObjectMeta = ogOldMeta dropDisabledFieldsOnUpdate(oldEPS, newEPS) + dropTopologyOnV1(ctx, oldEPS, newEPS) } // Validate validates a new EndpointSlice. @@ -105,18 +110,18 @@ func (endpointSliceStrategy) AllowUnconditionalUpdate() bool { // dropDisabledConditionsOnCreate will drop any fields that are disabled. func dropDisabledFieldsOnCreate(endpointSlice *discovery.EndpointSlice) { - dropNodeName := !utilfeature.DefaultFeatureGate.Enabled(features.EndpointSliceNodeName) dropTerminating := !utilfeature.DefaultFeatureGate.Enabled(features.EndpointSliceTerminatingCondition) + dropHints := !utilfeature.DefaultFeatureGate.Enabled(features.TopologyAwareHints) - if dropNodeName || dropTerminating { + if dropHints || dropTerminating { for i := range endpointSlice.Endpoints { - if dropNodeName { - endpointSlice.Endpoints[i].NodeName = nil - } if dropTerminating { endpointSlice.Endpoints[i].Conditions.Serving = nil endpointSlice.Endpoints[i].Conditions.Terminating = nil } + if dropHints { + endpointSlice.Endpoints[i].Hints = nil + } } } } @@ -124,35 +129,58 @@ func dropDisabledFieldsOnCreate(endpointSlice *discovery.EndpointSlice) { // dropDisabledFieldsOnUpdate will drop any disable fields that have not already // been set on the EndpointSlice. func dropDisabledFieldsOnUpdate(oldEPS, newEPS *discovery.EndpointSlice) { - dropNodeName := !utilfeature.DefaultFeatureGate.Enabled(features.EndpointSliceNodeName) - if dropNodeName { + dropTerminating := !utilfeature.DefaultFeatureGate.Enabled(features.EndpointSliceTerminatingCondition) + if dropTerminating { for _, ep := range oldEPS.Endpoints { - if ep.NodeName != nil { - dropNodeName = false + if ep.Conditions.Serving != nil || ep.Conditions.Terminating != nil { + dropTerminating = false break } } } - dropTerminating := !utilfeature.DefaultFeatureGate.Enabled(features.EndpointSliceTerminatingCondition) - if dropTerminating { + dropHints := !utilfeature.DefaultFeatureGate.Enabled(features.TopologyAwareHints) + if dropHints { for _, ep := range oldEPS.Endpoints { - if ep.Conditions.Serving != nil || ep.Conditions.Terminating != nil { - dropTerminating = false + if ep.Hints != nil { + dropHints = false break } } } - if dropNodeName || dropTerminating { + if dropHints || dropTerminating { for i := range newEPS.Endpoints { - if dropNodeName { - newEPS.Endpoints[i].NodeName = nil - } if dropTerminating { newEPS.Endpoints[i].Conditions.Serving = nil newEPS.Endpoints[i].Conditions.Terminating = nil } + if dropHints { + newEPS.Endpoints[i].Hints = nil + } + } + } +} + +// dropTopologyOnV1 on V1 request wipes the DeprecatedTopology field and copies +// the NodeName value into DeprecatedTopology +func dropTopologyOnV1(ctx context.Context, oldEPS, newEPS *discovery.EndpointSlice) { + if info, ok := genericapirequest.RequestInfoFrom(ctx); ok { + requestGV := schema.GroupVersion{Group: info.APIGroup, Version: info.APIVersion} + if requestGV == discoveryv1beta1.SchemeGroupVersion { + return + } + + // do not drop topology if endpoints have not been changed + if oldEPS != nil && apiequality.Semantic.DeepEqual(oldEPS.Endpoints, newEPS.Endpoints) { + return + } + + for i := range newEPS.Endpoints { + ep := &newEPS.Endpoints[i] + + //Silently clear out DeprecatedTopology + ep.DeprecatedTopology = nil } } } diff --git a/vendor/k8s.io/kubernetes/pkg/registry/discovery/rest/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/discovery/rest/BUILD deleted file mode 100644 index ed4cdf9723fd..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/discovery/rest/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["storage_discovery.go"], - importpath = "k8s.io/kubernetes/pkg/registry/discovery/rest", - visibility = ["//visibility:public"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/discovery:go_default_library", - "//pkg/registry/discovery/endpointslice/storage:go_default_library", - "//staging/src/k8s.io/api/discovery/v1alpha1:go_default_library", - "//staging/src/k8s.io/api/discovery/v1beta1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/storage:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/discovery/rest/storage_discovery.go b/vendor/k8s.io/kubernetes/pkg/registry/discovery/rest/storage_discovery.go index a9354b416612..527a236eaad3 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/discovery/rest/storage_discovery.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/discovery/rest/storage_discovery.go @@ -17,7 +17,7 @@ limitations under the License. package rest import ( - discoveryv1alpha1 "k8s.io/api/discovery/v1alpha1" + discoveryv1 "k8s.io/api/discovery/v1" discoveryv1beta1 "k8s.io/api/discovery/v1beta1" "k8s.io/apiserver/pkg/registry/generic" "k8s.io/apiserver/pkg/registry/rest" @@ -37,26 +37,26 @@ func (p StorageProvider) NewRESTStorage(apiResourceConfigSource serverstorage.AP // If you add a version here, be sure to add an entry in `k8s.io/kubernetes/cmd/kube-apiserver/app/aggregator.go with specific priorities. // TODO refactor the plumbing to provide the information in the APIGroupInfo - if apiResourceConfigSource.VersionEnabled(discoveryv1alpha1.SchemeGroupVersion) { - storageMap, err := p.v1alpha1Storage(apiResourceConfigSource, restOptionsGetter) + if apiResourceConfigSource.VersionEnabled(discoveryv1beta1.SchemeGroupVersion) { + storageMap, err := p.v1beta1Storage(apiResourceConfigSource, restOptionsGetter) if err != nil { return genericapiserver.APIGroupInfo{}, false, err } - apiGroupInfo.VersionedResourcesStorageMap[discoveryv1alpha1.SchemeGroupVersion.Version] = storageMap + apiGroupInfo.VersionedResourcesStorageMap[discoveryv1beta1.SchemeGroupVersion.Version] = storageMap } - if apiResourceConfigSource.VersionEnabled(discoveryv1beta1.SchemeGroupVersion) { - storageMap, err := p.v1beta1Storage(apiResourceConfigSource, restOptionsGetter) + if apiResourceConfigSource.VersionEnabled(discoveryv1.SchemeGroupVersion) { + storageMap, err := p.v1Storage(apiResourceConfigSource, restOptionsGetter) if err != nil { return genericapiserver.APIGroupInfo{}, false, err } - apiGroupInfo.VersionedResourcesStorageMap[discoveryv1beta1.SchemeGroupVersion.Version] = storageMap + apiGroupInfo.VersionedResourcesStorageMap[discoveryv1.SchemeGroupVersion.Version] = storageMap } return apiGroupInfo, true, nil } -func (p StorageProvider) v1alpha1Storage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (map[string]rest.Storage, error) { +func (p StorageProvider) v1beta1Storage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (map[string]rest.Storage, error) { storage := map[string]rest.Storage{} endpointSliceStorage, err := endpointslicestorage.NewREST(restOptionsGetter) @@ -68,7 +68,7 @@ func (p StorageProvider) v1alpha1Storage(apiResourceConfigSource serverstorage.A return storage, err } -func (p StorageProvider) v1beta1Storage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (map[string]rest.Storage, error) { +func (p StorageProvider) v1Storage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (map[string]rest.Storage, error) { storage := map[string]rest.Storage{} endpointSliceStorage, err := endpointslicestorage.NewREST(restOptionsGetter) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/events/rest/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/events/rest/BUILD deleted file mode 100644 index 80e21b53ef98..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/events/rest/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["storage_events.go"], - importpath = "k8s.io/kubernetes/pkg/registry/events/rest", - visibility = ["//visibility:public"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/events:go_default_library", - "//pkg/registry/core/event/storage:go_default_library", - "//staging/src/k8s.io/api/events/v1:go_default_library", - "//staging/src/k8s.io/api/events/v1beta1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/storage:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/extensions/rest/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/extensions/rest/BUILD deleted file mode 100644 index a1369a1a235a..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/extensions/rest/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["storage_extensions.go"], - importpath = "k8s.io/kubernetes/pkg/registry/extensions/rest", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/extensions:go_default_library", - "//pkg/registry/networking/ingress/storage:go_default_library", - "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/storage:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/flowcontrol/flowschema/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/flowcontrol/flowschema/BUILD deleted file mode 100644 index 6295fe2afeb0..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/flowcontrol/flowschema/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "strategy.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/flowcontrol/flowschema", - visibility = ["//visibility:public"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/flowcontrol:go_default_library", - "//pkg/apis/flowcontrol/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/flowcontrol/flowschema/storage:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/flowcontrol/flowschema/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/flowcontrol/flowschema/storage/BUILD deleted file mode 100644 index 456278794ceb..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/flowcontrol/flowschema/storage/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/flowcontrol/flowschema/storage", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/flowcontrol:go_default_library", - "//pkg/printers:go_default_library", - "//pkg/printers/internalversion:go_default_library", - "//pkg/printers/storage:go_default_library", - "//pkg/registry/flowcontrol/flowschema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/flowcontrol/flowschema/storage/storage.go b/vendor/k8s.io/kubernetes/pkg/registry/flowcontrol/flowschema/storage/storage.go index e5b90b7fb7b4..d8f14b9fd167 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/flowcontrol/flowschema/storage/storage.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/flowcontrol/flowschema/storage/storage.go @@ -29,6 +29,7 @@ import ( printersinternal "k8s.io/kubernetes/pkg/printers/internalversion" printerstorage "k8s.io/kubernetes/pkg/printers/storage" "k8s.io/kubernetes/pkg/registry/flowcontrol/flowschema" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // FlowSchemaStorage implements storage for flow schema. @@ -49,9 +50,10 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, error) { NewListFunc: func() runtime.Object { return &flowcontrol.FlowSchemaList{} }, DefaultQualifiedResource: flowcontrol.Resource("flowschemas"), - CreateStrategy: flowschema.Strategy, - UpdateStrategy: flowschema.Strategy, - DeleteStrategy: flowschema.Strategy, + CreateStrategy: flowschema.Strategy, + UpdateStrategy: flowschema.Strategy, + DeleteStrategy: flowschema.Strategy, + ResetFieldsStrategy: flowschema.Strategy, TableConvertor: printerstorage.TableConvertor{TableGenerator: printers.NewTableGenerator().With(printersinternal.AddHandlers)}, } @@ -64,6 +66,7 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, error) { statusStore.CreateStrategy = nil statusStore.UpdateStrategy = flowschema.StatusStrategy statusStore.DeleteStrategy = nil + statusStore.ResetFieldsStrategy = flowschema.StatusStrategy return &REST{store}, &StatusREST{store: &statusStore}, nil } @@ -89,3 +92,8 @@ func (r *StatusREST) Update(ctx context.Context, name string, objInfo rest.Updat // subresources should never allow create on update. return r.store.Update(ctx, name, objInfo, createValidation, updateValidation, false, options) } + +// GetResetFields implements rest.ResetFieldsStrategy +func (r *StatusREST) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + return r.store.GetResetFields() +} diff --git a/vendor/k8s.io/kubernetes/pkg/registry/flowcontrol/flowschema/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/flowcontrol/flowschema/strategy.go index 6286e1a1cc05..fd18476dc777 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/flowcontrol/flowschema/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/flowcontrol/flowschema/strategy.go @@ -26,6 +26,7 @@ import ( "k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/apis/flowcontrol" "k8s.io/kubernetes/pkg/apis/flowcontrol/validation" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // flowSchemaStrategy implements verification logic for FlowSchema. @@ -42,6 +43,21 @@ func (flowSchemaStrategy) NamespaceScoped() bool { return false } +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (flowSchemaStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + fields := map[fieldpath.APIVersion]*fieldpath.Set{ + "flowcontrol.apiserver.k8s.io/v1alpha1": fieldpath.NewSet( + fieldpath.MakePathOrDie("status"), + ), + "flowcontrol.apiserver.k8s.io/v1beta1": fieldpath.NewSet( + fieldpath.MakePathOrDie("status"), + ), + } + + return fields +} + // PrepareForCreate clears the status of a flow-schema before creation. func (flowSchemaStrategy) PrepareForCreate(ctx context.Context, obj runtime.Object) { fl := obj.(*flowcontrol.FlowSchema) @@ -91,6 +107,23 @@ type flowSchemaStatusStrategy struct { // StatusStrategy is the default logic that applies when updating flow-schema objects' status. var StatusStrategy = flowSchemaStatusStrategy{Strategy} +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (flowSchemaStatusStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + fields := map[fieldpath.APIVersion]*fieldpath.Set{ + "flowcontrol.apiserver.k8s.io/v1alpha1": fieldpath.NewSet( + fieldpath.MakePathOrDie("metadata"), + fieldpath.MakePathOrDie("spec"), + ), + "flowcontrol.apiserver.k8s.io/v1beta1": fieldpath.NewSet( + fieldpath.MakePathOrDie("metadata"), + fieldpath.MakePathOrDie("spec"), + ), + } + + return fields +} + func (flowSchemaStatusStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object) { newFlowSchema := obj.(*flowcontrol.FlowSchema) oldFlowSchema := old.(*flowcontrol.FlowSchema) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/flowcontrol/prioritylevelconfiguration/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/flowcontrol/prioritylevelconfiguration/BUILD deleted file mode 100644 index 8d72cd56a0a9..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/flowcontrol/prioritylevelconfiguration/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "strategy.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/flowcontrol/prioritylevelconfiguration", - visibility = ["//visibility:public"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/flowcontrol:go_default_library", - "//pkg/apis/flowcontrol/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/flowcontrol/prioritylevelconfiguration/storage:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/flowcontrol/prioritylevelconfiguration/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/flowcontrol/prioritylevelconfiguration/storage/BUILD deleted file mode 100644 index a9cdffe9b004..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/flowcontrol/prioritylevelconfiguration/storage/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/flowcontrol/prioritylevelconfiguration/storage", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/flowcontrol:go_default_library", - "//pkg/printers:go_default_library", - "//pkg/printers/internalversion:go_default_library", - "//pkg/printers/storage:go_default_library", - "//pkg/registry/flowcontrol/prioritylevelconfiguration:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/flowcontrol/prioritylevelconfiguration/storage/storage.go b/vendor/k8s.io/kubernetes/pkg/registry/flowcontrol/prioritylevelconfiguration/storage/storage.go index 4e5e5976354d..baa80be83812 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/flowcontrol/prioritylevelconfiguration/storage/storage.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/flowcontrol/prioritylevelconfiguration/storage/storage.go @@ -29,6 +29,7 @@ import ( printersinternal "k8s.io/kubernetes/pkg/printers/internalversion" printerstorage "k8s.io/kubernetes/pkg/printers/storage" "k8s.io/kubernetes/pkg/registry/flowcontrol/prioritylevelconfiguration" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // PriorityLevelConfigurationStorage implements storage for priority level configuration. @@ -49,9 +50,10 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, error) { NewListFunc: func() runtime.Object { return &flowcontrol.PriorityLevelConfigurationList{} }, DefaultQualifiedResource: flowcontrol.Resource("prioritylevelconfigurations"), - CreateStrategy: prioritylevelconfiguration.Strategy, - UpdateStrategy: prioritylevelconfiguration.Strategy, - DeleteStrategy: prioritylevelconfiguration.Strategy, + CreateStrategy: prioritylevelconfiguration.Strategy, + UpdateStrategy: prioritylevelconfiguration.Strategy, + DeleteStrategy: prioritylevelconfiguration.Strategy, + ResetFieldsStrategy: prioritylevelconfiguration.Strategy, TableConvertor: printerstorage.TableConvertor{TableGenerator: printers.NewTableGenerator().With(printersinternal.AddHandlers)}, } @@ -64,6 +66,7 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, error) { statusStore.CreateStrategy = nil statusStore.UpdateStrategy = prioritylevelconfiguration.StatusStrategy statusStore.DeleteStrategy = nil + statusStore.ResetFieldsStrategy = prioritylevelconfiguration.StatusStrategy return &REST{store}, &StatusREST{store: &statusStore}, nil } @@ -89,3 +92,8 @@ func (r *StatusREST) Update(ctx context.Context, name string, objInfo rest.Updat // subresources should never allow create on update. return r.store.Update(ctx, name, objInfo, createValidation, updateValidation, false, options) } + +// GetResetFields implements rest.ResetFieldsStrategy +func (r *StatusREST) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + return r.store.GetResetFields() +} diff --git a/vendor/k8s.io/kubernetes/pkg/registry/flowcontrol/prioritylevelconfiguration/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/flowcontrol/prioritylevelconfiguration/strategy.go index 9cc7877a4d75..54208747eaa7 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/flowcontrol/prioritylevelconfiguration/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/flowcontrol/prioritylevelconfiguration/strategy.go @@ -26,6 +26,7 @@ import ( "k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/apis/flowcontrol" "k8s.io/kubernetes/pkg/apis/flowcontrol/validation" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // priorityLevelConfigurationStrategy implements verification logic for priority level configurations. @@ -42,6 +43,21 @@ func (priorityLevelConfigurationStrategy) NamespaceScoped() bool { return false } +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (priorityLevelConfigurationStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + fields := map[fieldpath.APIVersion]*fieldpath.Set{ + "flowcontrol.apiserver.k8s.io/v1alpha1": fieldpath.NewSet( + fieldpath.MakePathOrDie("status"), + ), + "flowcontrol.apiserver.k8s.io/v1beta1": fieldpath.NewSet( + fieldpath.MakePathOrDie("status"), + ), + } + + return fields +} + // PrepareForCreate clears the status of a priority-level-configuration before creation. func (priorityLevelConfigurationStrategy) PrepareForCreate(ctx context.Context, obj runtime.Object) { pl := obj.(*flowcontrol.PriorityLevelConfiguration) @@ -91,6 +107,23 @@ type priorityLevelConfigurationStatusStrategy struct { // StatusStrategy is the default logic that applies when updating priority level configuration objects' status. var StatusStrategy = priorityLevelConfigurationStatusStrategy{Strategy} +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (priorityLevelConfigurationStatusStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + fields := map[fieldpath.APIVersion]*fieldpath.Set{ + "flowcontrol.apiserver.k8s.io/v1alpha1": fieldpath.NewSet( + fieldpath.MakePathOrDie("spec"), + fieldpath.MakePathOrDie("metadata"), + ), + "flowcontrol.apiserver.k8s.io/v1beta1": fieldpath.NewSet( + fieldpath.MakePathOrDie("spec"), + fieldpath.MakePathOrDie("metadata"), + ), + } + + return fields +} + func (priorityLevelConfigurationStatusStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object) { newPriorityLevelConfiguration := obj.(*flowcontrol.PriorityLevelConfiguration) oldPriorityLevelConfiguration := old.(*flowcontrol.PriorityLevelConfiguration) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/flowcontrol/rest/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/flowcontrol/rest/BUILD deleted file mode 100644 index fd685e47a931..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/flowcontrol/rest/BUILD +++ /dev/null @@ -1,57 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["storage_flowcontrol.go"], - importpath = "k8s.io/kubernetes/pkg/registry/flowcontrol/rest", - visibility = ["//visibility:public"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/flowcontrol:go_default_library", - "//pkg/apis/flowcontrol/v1alpha1:go_default_library", - "//pkg/apis/flowcontrol/v1beta1:go_default_library", - "//pkg/registry/flowcontrol/flowschema/storage:go_default_library", - "//pkg/registry/flowcontrol/prioritylevelconfiguration/storage:go_default_library", - "//staging/src/k8s.io/api/flowcontrol/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/flowcontrol/bootstrap:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/storage:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta1:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["storage_flowcontrol_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/flowcontrol/v1beta1:go_default_library", - "//staging/src/k8s.io/api/flowcontrol/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/flowcontrol/bootstrap:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/flowcontrol/rest/storage_flowcontrol.go b/vendor/k8s.io/kubernetes/pkg/registry/flowcontrol/rest/storage_flowcontrol.go index 9dc7a81d9aa6..f968068b46e6 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/flowcontrol/rest/storage_flowcontrol.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/flowcontrol/rest/storage_flowcontrol.go @@ -53,17 +53,22 @@ const PostStartHookName = "priority-and-fairness-config-producer" func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool, error) { apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(flowcontrol.GroupName, legacyscheme.Scheme, legacyscheme.ParameterCodec, legacyscheme.Codecs) - // Flow control storage is shared across different versions. - flowControlStorage, err := p.storage(apiResourceConfigSource, restOptionsGetter) - if err != nil { - return genericapiserver.APIGroupInfo{}, false, err - } if apiResourceConfigSource.VersionEnabled(flowcontrolapisv1alpha1.SchemeGroupVersion) { + flowControlStorage, err := p.storage(apiResourceConfigSource, restOptionsGetter) + if err != nil { + return genericapiserver.APIGroupInfo{}, false, err + } apiGroupInfo.VersionedResourcesStorageMap[flowcontrolapisv1alpha1.SchemeGroupVersion.Version] = flowControlStorage } + if apiResourceConfigSource.VersionEnabled(flowcontrolapisv1beta1.SchemeGroupVersion) { + flowControlStorage, err := p.storage(apiResourceConfigSource, restOptionsGetter) + if err != nil { + return genericapiserver.APIGroupInfo{}, false, err + } apiGroupInfo.VersionedResourcesStorageMap[flowcontrolapisv1beta1.SchemeGroupVersion.Version] = flowControlStorage } + return apiGroupInfo, true, nil } @@ -100,7 +105,7 @@ func (p RESTStorageProvider) PostStartHook() (string, genericapiserver.PostStart flowcontrolClientSet := flowcontrolclient.NewForConfigOrDie(hookContext.LoopbackClientConfig) go func() { const retryCreatingSuggestedSettingsInterval = time.Second - _ = wait.PollImmediateUntil( + err := wait.PollImmediateUntil( retryCreatingSuggestedSettingsInterval, func() (bool, error) { should, err := shouldEnsureSuggested(flowcontrolClientSet) @@ -122,6 +127,17 @@ func (p RESTStorageProvider) PostStartHook() (string, genericapiserver.PostStart return true, nil }, hookContext.StopCh) + if err != nil { + klog.ErrorS(err, "Ensuring suggested configuration failed") + + // We should not attempt creation of mandatory objects if ensuring the suggested + // configuration resulted in an error. + // This only happens when the stop channel is closed. + // We rely on the presence of the "exempt" priority level configuration object in the cluster + // to indicate whether we should ensure suggested configuration. + return + } + const retryCreatingMandatorySettingsInterval = time.Minute _ = wait.PollImmediateUntil( retryCreatingMandatorySettingsInterval, @@ -129,7 +145,7 @@ func (p RESTStorageProvider) PostStartHook() (string, genericapiserver.PostStart if err := upgrade( flowcontrolClientSet, flowcontrolbootstrap.MandatoryFlowSchemas, - // Note: the "exempt" priority-level is supposed tobe the last item in the pre-defined + // Note: the "exempt" priority-level is supposed to be the last item in the pre-defined // list, so that a crash in the midst of the first kube-apiserver startup does not prevent // the full initial set of objects from being created. flowcontrolbootstrap.MandatoryPriorityLevelConfigurations, diff --git a/vendor/k8s.io/kubernetes/pkg/registry/networking/ingress/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/networking/ingress/BUILD deleted file mode 100644 index 4302bd4186e7..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/networking/ingress/BUILD +++ /dev/null @@ -1,55 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "strategy.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/networking/ingress", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/networking:go_default_library", - "//pkg/apis/networking/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["strategy_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/networking:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/networking/ingress/storage:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/networking/ingress/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/networking/ingress/storage/BUILD deleted file mode 100644 index ae7e9787afe1..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/networking/ingress/storage/BUILD +++ /dev/null @@ -1,59 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["storage_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/extensions/install:go_default_library", - "//pkg/apis/networking:go_default_library", - "//pkg/apis/networking/install:go_default_library", - "//pkg/registry/registrytest:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/testing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/testing:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/networking/ingress/storage", - deps = [ - "//pkg/apis/networking:go_default_library", - "//pkg/printers:go_default_library", - "//pkg/printers/internalversion:go_default_library", - "//pkg/printers/storage:go_default_library", - "//pkg/registry/networking/ingress:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/networking/ingress/storage/storage.go b/vendor/k8s.io/kubernetes/pkg/registry/networking/ingress/storage/storage.go index 6c04f71ed326..0280c27b030f 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/networking/ingress/storage/storage.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/networking/ingress/storage/storage.go @@ -29,6 +29,7 @@ import ( printersinternal "k8s.io/kubernetes/pkg/printers/internalversion" printerstorage "k8s.io/kubernetes/pkg/printers/storage" "k8s.io/kubernetes/pkg/registry/networking/ingress" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // REST implements a RESTStorage for replication controllers @@ -43,9 +44,10 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, error) { NewListFunc: func() runtime.Object { return &networking.IngressList{} }, DefaultQualifiedResource: networking.Resource("ingresses"), - CreateStrategy: ingress.Strategy, - UpdateStrategy: ingress.Strategy, - DeleteStrategy: ingress.Strategy, + CreateStrategy: ingress.Strategy, + UpdateStrategy: ingress.Strategy, + DeleteStrategy: ingress.Strategy, + ResetFieldsStrategy: ingress.Strategy, TableConvertor: printerstorage.TableConvertor{TableGenerator: printers.NewTableGenerator().With(printersinternal.AddHandlers)}, } @@ -56,6 +58,7 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, error) { statusStore := *store statusStore.UpdateStrategy = ingress.StatusStrategy + statusStore.ResetFieldsStrategy = ingress.StatusStrategy return &REST{store}, &StatusREST{store: &statusStore}, nil } @@ -88,3 +91,8 @@ func (r *StatusREST) Update(ctx context.Context, name string, objInfo rest.Updat // subresources should never allow create on update. return r.store.Update(ctx, name, objInfo, createValidation, updateValidation, false, options) } + +// GetResetFields implements rest.ResetFieldsStrategy +func (r *StatusREST) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + return r.store.GetResetFields() +} diff --git a/vendor/k8s.io/kubernetes/pkg/registry/networking/ingress/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/networking/ingress/strategy.go index 5fac2499815f..01e0ff339969 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/networking/ingress/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/networking/ingress/strategy.go @@ -18,6 +18,7 @@ package ingress import ( "context" + apiequality "k8s.io/apimachinery/pkg/api/equality" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" @@ -27,6 +28,7 @@ import ( "k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/apis/networking" "k8s.io/kubernetes/pkg/apis/networking/validation" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // ingressStrategy implements verification logic for Replication Ingress. @@ -43,6 +45,24 @@ func (ingressStrategy) NamespaceScoped() bool { return true } +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (ingressStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + fields := map[fieldpath.APIVersion]*fieldpath.Set{ + "extensions/v1beta1": fieldpath.NewSet( + fieldpath.MakePathOrDie("status"), + ), + "networking.k8s.io/v1beta1": fieldpath.NewSet( + fieldpath.MakePathOrDie("status"), + ), + "networking.k8s.io/v1": fieldpath.NewSet( + fieldpath.MakePathOrDie("status"), + ), + } + + return fields +} + // PrepareForCreate clears the status of an Ingress before creation. func (ingressStrategy) PrepareForCreate(ctx context.Context, obj runtime.Object) { ingress := obj.(*networking.Ingress) @@ -108,6 +128,24 @@ type ingressStatusStrategy struct { // StatusStrategy implements logic used to validate and prepare for updates of the status subresource var StatusStrategy = ingressStatusStrategy{Strategy} +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (ingressStatusStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + fields := map[fieldpath.APIVersion]*fieldpath.Set{ + "extensions/v1beta1": fieldpath.NewSet( + fieldpath.MakePathOrDie("spec"), + ), + "networking.k8s.io/v1beta1": fieldpath.NewSet( + fieldpath.MakePathOrDie("spec"), + ), + "networking.k8s.io/v1": fieldpath.NewSet( + fieldpath.MakePathOrDie("spec"), + ), + } + + return fields +} + // PrepareForUpdate clears fields that are not allowed to be set by end users on update of status func (ingressStatusStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object) { newIngress := obj.(*networking.Ingress) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/networking/ingressclass/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/networking/ingressclass/BUILD deleted file mode 100644 index bbe684aae9e8..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/networking/ingressclass/BUILD +++ /dev/null @@ -1,48 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "strategy.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/networking/ingressclass", - visibility = ["//visibility:public"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/networking:go_default_library", - "//pkg/apis/networking/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["strategy_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/networking:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/networking/ingressclass/storage:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/networking/ingressclass/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/networking/ingressclass/storage/BUILD deleted file mode 100644 index f0a43f29f116..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/networking/ingressclass/storage/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/networking/ingressclass/storage", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/networking:go_default_library", - "//pkg/printers:go_default_library", - "//pkg/printers/internalversion:go_default_library", - "//pkg/printers/storage:go_default_library", - "//pkg/registry/networking/ingressclass:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/networking/ingressclass/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/networking/ingressclass/strategy.go index af00a4e915c9..ccd656cbf998 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/networking/ingressclass/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/networking/ingressclass/strategy.go @@ -23,9 +23,11 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" "k8s.io/apiserver/pkg/storage/names" + utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/apis/networking" "k8s.io/kubernetes/pkg/apis/networking/validation" + "k8s.io/kubernetes/pkg/features" ) // ingressClassStrategy implements verification logic for IngressClass @@ -49,6 +51,10 @@ func (ingressClassStrategy) NamespaceScoped() bool { func (ingressClassStrategy) PrepareForCreate(ctx context.Context, obj runtime.Object) { ingressClass := obj.(*networking.IngressClass) ingressClass.Generation = 1 + + if !utilfeature.DefaultFeatureGate.Enabled(features.IngressClassNamespacedParams) { + dropIngressClassParametersReferenceScope(ingressClass) + } } // PrepareForUpdate clears fields that are not allowed to be set by end users on @@ -63,6 +69,9 @@ func (ingressClassStrategy) PrepareForUpdate(ctx context.Context, obj, old runti newIngressClass.Generation = oldIngressClass.Generation + 1 } + if !utilfeature.DefaultFeatureGate.Enabled(features.IngressClassNamespacedParams) && !scopeInUse(oldIngressClass) { + dropIngressClassParametersReferenceScope(newIngressClass) + } } // Validate validates a new IngressClass. @@ -94,3 +103,15 @@ func (ingressClassStrategy) ValidateUpdate(ctx context.Context, obj, old runtime func (ingressClassStrategy) AllowUnconditionalUpdate() bool { return true } + +func scopeInUse(ingressClass *networking.IngressClass) bool { + return ingressClass.Spec.Parameters != nil && ingressClass.Spec.Parameters.Scope != nil +} + +// Drops Scope and Namespace field from IngressClass's parameters. +func dropIngressClassParametersReferenceScope(ingressClass *networking.IngressClass) { + if ingressClass.Spec.Parameters != nil { + ingressClass.Spec.Parameters.Scope = nil + ingressClass.Spec.Parameters.Namespace = nil + } +} diff --git a/vendor/k8s.io/kubernetes/pkg/registry/networking/networkpolicy/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/networking/networkpolicy/BUILD deleted file mode 100644 index 2c86b95be8f4..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/networking/networkpolicy/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "strategy.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/networking/networkpolicy", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/networking:go_default_library", - "//pkg/apis/networking/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/networking/networkpolicy/storage:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/networking/networkpolicy/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/networking/networkpolicy/storage/BUILD deleted file mode 100644 index 6191ff89c540..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/networking/networkpolicy/storage/BUILD +++ /dev/null @@ -1,57 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/networking/networkpolicy/storage", - deps = [ - "//pkg/apis/networking:go_default_library", - "//pkg/printers:go_default_library", - "//pkg/printers/internalversion:go_default_library", - "//pkg/printers/storage:go_default_library", - "//pkg/registry/networking/networkpolicy:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["storage_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/networking:go_default_library", - "//pkg/apis/networking/install:go_default_library", - "//pkg/registry/registrytest:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/testing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/testing:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/networking/networkpolicy/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/networking/networkpolicy/strategy.go index 8dc3ea7edea6..5ccd9de66a12 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/networking/networkpolicy/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/networking/networkpolicy/strategy.go @@ -23,9 +23,11 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" "k8s.io/apiserver/pkg/storage/names" + utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/apis/networking" "k8s.io/kubernetes/pkg/apis/networking/validation" + "k8s.io/kubernetes/pkg/features" ) // networkPolicyStrategy implements verification logic for NetworkPolicies @@ -46,6 +48,10 @@ func (networkPolicyStrategy) NamespaceScoped() bool { func (networkPolicyStrategy) PrepareForCreate(ctx context.Context, obj runtime.Object) { networkPolicy := obj.(*networking.NetworkPolicy) networkPolicy.Generation = 1 + + if !utilfeature.DefaultFeatureGate.Enabled(features.NetworkPolicyEndPort) { + dropNetworkPolicyEndPort(networkPolicy) + } } // PrepareForUpdate clears fields that are not allowed to be set by end users on update. @@ -53,6 +59,10 @@ func (networkPolicyStrategy) PrepareForUpdate(ctx context.Context, obj, old runt newNetworkPolicy := obj.(*networking.NetworkPolicy) oldNetworkPolicy := old.(*networking.NetworkPolicy) + if !utilfeature.DefaultFeatureGate.Enabled(features.NetworkPolicyEndPort) && !endPortInUse(oldNetworkPolicy) { + dropNetworkPolicyEndPort(newNetworkPolicy) + } + // Any changes to the spec increment the generation number, any changes to the // status should reflect the generation number of the corresponding object. // See metav1.ObjectMeta description for more information on Generation. @@ -86,3 +96,42 @@ func (networkPolicyStrategy) ValidateUpdate(ctx context.Context, obj, old runtim func (networkPolicyStrategy) AllowUnconditionalUpdate() bool { return true } + +// Drops Network Policy EndPort fields if Feature Gate is also disabled. +// This should be used in future Network Policy evolutions +func dropNetworkPolicyEndPort(netPol *networking.NetworkPolicy) { + for idx, ingressSpec := range netPol.Spec.Ingress { + for idxPort, port := range ingressSpec.Ports { + if port.EndPort != nil { + netPol.Spec.Ingress[idx].Ports[idxPort].EndPort = nil + } + } + } + + for idx, egressSpec := range netPol.Spec.Egress { + for idxPort, port := range egressSpec.Ports { + if port.EndPort != nil { + netPol.Spec.Egress[idx].Ports[idxPort].EndPort = nil + } + } + } +} + +func endPortInUse(netPol *networking.NetworkPolicy) bool { + for _, ingressSpec := range netPol.Spec.Ingress { + for _, port := range ingressSpec.Ports { + if port.EndPort != nil { + return true + } + } + } + + for _, egressSpec := range netPol.Spec.Egress { + for _, port := range egressSpec.Ports { + if port.EndPort != nil { + return true + } + } + } + return false +} diff --git a/vendor/k8s.io/kubernetes/pkg/registry/networking/rest/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/networking/rest/BUILD deleted file mode 100644 index 23fea07fef80..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/networking/rest/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["storage_settings.go"], - importpath = "k8s.io/kubernetes/pkg/registry/networking/rest", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/networking:go_default_library", - "//pkg/registry/networking/ingress/storage:go_default_library", - "//pkg/registry/networking/ingressclass/storage:go_default_library", - "//pkg/registry/networking/networkpolicy/storage:go_default_library", - "//staging/src/k8s.io/api/networking/v1:go_default_library", - "//staging/src/k8s.io/api/networking/v1beta1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/storage:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/node/rest/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/node/rest/BUILD deleted file mode 100644 index 7e4086139a46..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/node/rest/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["runtime_class.go"], - importpath = "k8s.io/kubernetes/pkg/registry/node/rest", - visibility = ["//visibility:public"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/node:go_default_library", - "//pkg/registry/node/runtimeclass/storage:go_default_library", - "//staging/src/k8s.io/api/node/v1:go_default_library", - "//staging/src/k8s.io/api/node/v1alpha1:go_default_library", - "//staging/src/k8s.io/api/node/v1beta1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/storage:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/node/runtimeclass/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/node/runtimeclass/BUILD deleted file mode 100644 index 8fc3f12a927a..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/node/runtimeclass/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "strategy.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/node/runtimeclass", - visibility = ["//visibility:public"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/node:go_default_library", - "//pkg/apis/node/validation:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/node/runtimeclass/storage:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/node/runtimeclass/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/node/runtimeclass/storage/BUILD deleted file mode 100644 index 50c9da371d14..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/node/runtimeclass/storage/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/node/runtimeclass/storage", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/node:go_default_library", - "//pkg/printers:go_default_library", - "//pkg/printers/internalversion:go_default_library", - "//pkg/printers/storage:go_default_library", - "//pkg/registry/node/runtimeclass:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/policy/poddisruptionbudget/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/policy/poddisruptionbudget/BUILD deleted file mode 100644 index cfe77bd14ace..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/policy/poddisruptionbudget/BUILD +++ /dev/null @@ -1,53 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "strategy.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/policy/poddisruptionbudget", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/policy:go_default_library", - "//pkg/apis/policy/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["strategy_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/policy:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/policy/poddisruptionbudget/storage:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/policy/poddisruptionbudget/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/policy/poddisruptionbudget/storage/BUILD deleted file mode 100644 index c94cb3916980..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/policy/poddisruptionbudget/storage/BUILD +++ /dev/null @@ -1,57 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["storage_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/policy:go_default_library", - "//pkg/registry/registrytest:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/testing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/testing:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/policy/poddisruptionbudget/storage", - deps = [ - "//pkg/apis/policy:go_default_library", - "//pkg/printers:go_default_library", - "//pkg/printers/internalversion:go_default_library", - "//pkg/printers/storage:go_default_library", - "//pkg/registry/policy/poddisruptionbudget:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/policy/poddisruptionbudget/storage/storage.go b/vendor/k8s.io/kubernetes/pkg/registry/policy/poddisruptionbudget/storage/storage.go index 687baaafd5a0..f402cfc5391a 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/policy/poddisruptionbudget/storage/storage.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/policy/poddisruptionbudget/storage/storage.go @@ -29,6 +29,7 @@ import ( printersinternal "k8s.io/kubernetes/pkg/printers/internalversion" printerstorage "k8s.io/kubernetes/pkg/printers/storage" "k8s.io/kubernetes/pkg/registry/policy/poddisruptionbudget" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // REST implements a RESTStorage for pod disruption budgets against etcd. @@ -43,9 +44,10 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, error) { NewListFunc: func() runtime.Object { return &policyapi.PodDisruptionBudgetList{} }, DefaultQualifiedResource: policyapi.Resource("poddisruptionbudgets"), - CreateStrategy: poddisruptionbudget.Strategy, - UpdateStrategy: poddisruptionbudget.Strategy, - DeleteStrategy: poddisruptionbudget.Strategy, + CreateStrategy: poddisruptionbudget.Strategy, + UpdateStrategy: poddisruptionbudget.Strategy, + DeleteStrategy: poddisruptionbudget.Strategy, + ResetFieldsStrategy: poddisruptionbudget.Strategy, TableConvertor: printerstorage.TableConvertor{TableGenerator: printers.NewTableGenerator().With(printersinternal.AddHandlers)}, } @@ -56,6 +58,7 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, error) { statusStore := *store statusStore.UpdateStrategy = poddisruptionbudget.StatusStrategy + statusStore.ResetFieldsStrategy = poddisruptionbudget.StatusStrategy return &REST{store}, &StatusREST{store: &statusStore}, nil } @@ -85,3 +88,8 @@ func (r *StatusREST) Update(ctx context.Context, name string, objInfo rest.Updat // subresources should never allow create on update. return r.store.Update(ctx, name, objInfo, createValidation, updateValidation, false, options) } + +// GetResetFields implements rest.ResetFieldsStrategy +func (r *StatusREST) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + return r.store.GetResetFields() +} diff --git a/vendor/k8s.io/kubernetes/pkg/registry/policy/poddisruptionbudget/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/policy/poddisruptionbudget/strategy.go index 5a4f8dc21229..dfb19b5b438c 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/policy/poddisruptionbudget/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/policy/poddisruptionbudget/strategy.go @@ -21,11 +21,14 @@ import ( apiequality "k8s.io/apimachinery/pkg/api/equality" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/util/validation/field" + genericapirequest "k8s.io/apiserver/pkg/endpoints/request" "k8s.io/apiserver/pkg/storage/names" "k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/apis/policy" "k8s.io/kubernetes/pkg/apis/policy/validation" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // podDisruptionBudgetStrategy implements verification logic for PodDisruptionBudgets. @@ -42,6 +45,21 @@ func (podDisruptionBudgetStrategy) NamespaceScoped() bool { return true } +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (podDisruptionBudgetStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + fields := map[fieldpath.APIVersion]*fieldpath.Set{ + "policy/v1beta1": fieldpath.NewSet( + fieldpath.MakePathOrDie("status"), + ), + "policy/v1": fieldpath.NewSet( + fieldpath.MakePathOrDie("status"), + ), + } + + return fields +} + // PrepareForCreate clears the status of an PodDisruptionBudget before creation. func (podDisruptionBudgetStrategy) PrepareForCreate(ctx context.Context, obj runtime.Object) { podDisruptionBudget := obj.(*policy.PodDisruptionBudget) @@ -99,6 +117,21 @@ type podDisruptionBudgetStatusStrategy struct { // StatusStrategy is the default logic invoked when updating object status. var StatusStrategy = podDisruptionBudgetStatusStrategy{Strategy} +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (podDisruptionBudgetStatusStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + fields := map[fieldpath.APIVersion]*fieldpath.Set{ + "policy/v1beta1": fieldpath.NewSet( + fieldpath.MakePathOrDie("spec"), + ), + "policy/v1": fieldpath.NewSet( + fieldpath.MakePathOrDie("spec"), + ), + } + + return fields +} + // PrepareForUpdate clears fields that are not allowed to be set by end users on update of status func (podDisruptionBudgetStatusStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object) { newPodDisruptionBudget := obj.(*policy.PodDisruptionBudget) @@ -109,7 +142,13 @@ func (podDisruptionBudgetStatusStrategy) PrepareForUpdate(ctx context.Context, o // ValidateUpdate is the default update validation for an end user updating status func (podDisruptionBudgetStatusStrategy) ValidateUpdate(ctx context.Context, obj, old runtime.Object) field.ErrorList { - // TODO: Validate status updates. - return field.ErrorList{} - // return validation.ValidatePodDisruptionBudgetStatusUpdate(obj.(*policy.PodDisruptionBudget), old.(*policy.PodDisruptionBudget)) + var apiVersion schema.GroupVersion + if requestInfo, found := genericapirequest.RequestInfoFrom(ctx); found { + apiVersion = schema.GroupVersion{ + Group: requestInfo.APIGroup, + Version: requestInfo.APIVersion, + } + } + return validation.ValidatePodDisruptionBudgetStatusUpdate(obj.(*policy.PodDisruptionBudget).Status, + old.(*policy.PodDisruptionBudget).Status, field.NewPath("status"), apiVersion) } diff --git a/vendor/k8s.io/kubernetes/pkg/registry/policy/podsecuritypolicy/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/policy/podsecuritypolicy/BUILD deleted file mode 100644 index cb5abb2c5c9a..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/policy/podsecuritypolicy/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "strategy.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/policy/podsecuritypolicy", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/api/podsecuritypolicy:go_default_library", - "//pkg/apis/policy:go_default_library", - "//pkg/apis/policy/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/policy/podsecuritypolicy/storage:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/policy/podsecuritypolicy/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/policy/podsecuritypolicy/storage/BUILD deleted file mode 100644 index f33aa451284a..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/policy/podsecuritypolicy/storage/BUILD +++ /dev/null @@ -1,54 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["storage_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/policy:go_default_library", - "//pkg/registry/registrytest:go_default_library", - "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/testing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/testing:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/policy/podsecuritypolicy/storage", - deps = [ - "//pkg/apis/policy:go_default_library", - "//pkg/printers:go_default_library", - "//pkg/printers/internalversion:go_default_library", - "//pkg/printers/storage:go_default_library", - "//pkg/registry/policy/podsecuritypolicy:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/policy/podsecuritypolicy/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/policy/podsecuritypolicy/strategy.go index e09d76239e3f..9403eb36ac5a 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/policy/podsecuritypolicy/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/policy/podsecuritypolicy/strategy.go @@ -23,10 +23,12 @@ import ( "k8s.io/apimachinery/pkg/util/validation/field" "k8s.io/apiserver/pkg/registry/rest" "k8s.io/apiserver/pkg/storage/names" + utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/kubernetes/pkg/api/legacyscheme" psputil "k8s.io/kubernetes/pkg/api/podsecuritypolicy" "k8s.io/kubernetes/pkg/apis/policy" "k8s.io/kubernetes/pkg/apis/policy/validation" + "k8s.io/kubernetes/pkg/features" ) // strategy implements behavior for PodSecurityPolicy objects @@ -72,9 +74,31 @@ func (strategy) Canonicalize(obj runtime.Object) { } func (strategy) Validate(ctx context.Context, obj runtime.Object) field.ErrorList { - return validation.ValidatePodSecurityPolicy(obj.(*policy.PodSecurityPolicy)) + opts := validation.PodSecurityPolicyValidationOptions{ + // Only allowed if the feature is enabled. + AllowEphemeralVolumeType: utilfeature.DefaultFeatureGate.Enabled(features.GenericEphemeralVolume), + } + return validation.ValidatePodSecurityPolicy(obj.(*policy.PodSecurityPolicy), opts) } func (strategy) ValidateUpdate(ctx context.Context, obj, old runtime.Object) field.ErrorList { - return validation.ValidatePodSecurityPolicyUpdate(old.(*policy.PodSecurityPolicy), obj.(*policy.PodSecurityPolicy)) + opts := validation.PodSecurityPolicyValidationOptions{ + // Allowed if the feature is enabled or the old policy already had it. + // A policy that had the type set when that was valid must remain valid. + AllowEphemeralVolumeType: utilfeature.DefaultFeatureGate.Enabled(features.GenericEphemeralVolume) || + volumeInUse(old.(*policy.PodSecurityPolicy), policy.Ephemeral), + } + return validation.ValidatePodSecurityPolicyUpdate(old.(*policy.PodSecurityPolicy), obj.(*policy.PodSecurityPolicy), opts) +} + +func volumeInUse(oldPSP *policy.PodSecurityPolicy, volume policy.FSType) bool { + if oldPSP == nil { + return false + } + for _, v := range oldPSP.Spec.Volumes { + if v == volume { + return true + } + } + return false } diff --git a/vendor/k8s.io/kubernetes/pkg/registry/policy/rest/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/policy/rest/BUILD deleted file mode 100644 index bc89503f2eab..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/policy/rest/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["storage_policy.go"], - importpath = "k8s.io/kubernetes/pkg/registry/policy/rest", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/policy:go_default_library", - "//pkg/registry/policy/poddisruptionbudget/storage:go_default_library", - "//pkg/registry/policy/podsecuritypolicy/storage:go_default_library", - "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/storage:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/policy/rest/storage_policy.go b/vendor/k8s.io/kubernetes/pkg/registry/policy/rest/storage_policy.go index f71b523e4ee7..a3c340796083 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/policy/rest/storage_policy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/policy/rest/storage_policy.go @@ -17,6 +17,7 @@ limitations under the License. package rest import ( + policyapiv1 "k8s.io/api/policy/v1" policyapiv1beta1 "k8s.io/api/policy/v1beta1" "k8s.io/apiserver/pkg/registry/generic" "k8s.io/apiserver/pkg/registry/rest" @@ -42,6 +43,14 @@ func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource serverstorag apiGroupInfo.VersionedResourcesStorageMap[policyapiv1beta1.SchemeGroupVersion.Version] = storageMap } } + + if apiResourceConfigSource.VersionEnabled(policyapiv1.SchemeGroupVersion) { + if storageMap, err := p.v1Storage(apiResourceConfigSource, restOptionsGetter); err != nil { + return genericapiserver.APIGroupInfo{}, false, err + } else { + apiGroupInfo.VersionedResourcesStorageMap[policyapiv1.SchemeGroupVersion.Version] = storageMap + } + } return apiGroupInfo, true, nil } @@ -64,6 +73,19 @@ func (p RESTStorageProvider) v1beta1Storage(apiResourceConfigSource serverstorag return storage, err } +func (p RESTStorageProvider) v1Storage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (map[string]rest.Storage, error) { + storage := map[string]rest.Storage{} + + poddisruptionbudgetStorage, poddisruptionbudgetStatusStorage, err := poddisruptionbudgetstore.NewREST(restOptionsGetter) + if err != nil { + return storage, err + } + storage["poddisruptionbudgets"] = poddisruptionbudgetStorage + storage["poddisruptionbudgets/status"] = poddisruptionbudgetStatusStorage + + return storage, err +} + func (p RESTStorageProvider) GroupName() string { return policy.GroupName } diff --git a/vendor/k8s.io/kubernetes/pkg/registry/rbac/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/rbac/BUILD deleted file mode 100644 index 9bc51a42e428..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/rbac/BUILD +++ /dev/null @@ -1,62 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "escalation_check.go", - "helpers.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/rbac", - deps = [ - "//pkg/apis/rbac:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/rbac/clusterrole:all-srcs", - "//pkg/registry/rbac/clusterrolebinding:all-srcs", - "//pkg/registry/rbac/rest:all-srcs", - "//pkg/registry/rbac/role:all-srcs", - "//pkg/registry/rbac/rolebinding:all-srcs", - "//pkg/registry/rbac/validation:all-srcs", - ], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["helpers_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/helper:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/github.com/google/gofuzz:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/rbac/clusterrole/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/rbac/clusterrole/BUILD deleted file mode 100644 index b036ee284b6b..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/rbac/clusterrole/BUILD +++ /dev/null @@ -1,46 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "registry.go", - "strategy.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/rbac/clusterrole", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/rbac:go_default_library", - "//pkg/apis/rbac/v1:go_default_library", - "//pkg/apis/rbac/validation:go_default_library", - "//staging/src/k8s.io/api/rbac/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/rbac/clusterrole/policybased:all-srcs", - "//pkg/registry/rbac/clusterrole/storage:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/rbac/clusterrole/policybased/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/rbac/clusterrole/policybased/BUILD deleted file mode 100644 index cf85355c0fbc..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/rbac/clusterrole/policybased/BUILD +++ /dev/null @@ -1,56 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/rbac/clusterrole/policybased", - deps = [ - "//pkg/apis/core/helper:go_default_library", - "//pkg/apis/rbac:go_default_library", - "//pkg/registry/rbac:go_default_library", - "//pkg/registry/rbac/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["storage_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/rbac:go_default_library", - "//pkg/apis/rbac/install:go_default_library", - "//pkg/registry/rbac/validation:go_default_library", - "//staging/src/k8s.io/api/rbac/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/rbac/clusterrole/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/rbac/clusterrole/storage/BUILD deleted file mode 100644 index 19c19bedfc72..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/rbac/clusterrole/storage/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/rbac/clusterrole/storage", - deps = [ - "//pkg/apis/rbac:go_default_library", - "//pkg/registry/rbac/clusterrole:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/rbac/clusterrolebinding/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/rbac/clusterrolebinding/BUILD deleted file mode 100644 index 9ad04a90f62a..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/rbac/clusterrolebinding/BUILD +++ /dev/null @@ -1,46 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "registry.go", - "strategy.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/rbac/clusterrolebinding", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/rbac:go_default_library", - "//pkg/apis/rbac/v1:go_default_library", - "//pkg/apis/rbac/validation:go_default_library", - "//staging/src/k8s.io/api/rbac/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/rbac/clusterrolebinding/policybased:all-srcs", - "//pkg/registry/rbac/clusterrolebinding/storage:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/rbac/clusterrolebinding/policybased/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/rbac/clusterrolebinding/policybased/BUILD deleted file mode 100644 index 405e7134c0d1..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/rbac/clusterrolebinding/policybased/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/rbac/clusterrolebinding/policybased", - deps = [ - "//pkg/apis/core/helper:go_default_library", - "//pkg/apis/rbac:go_default_library", - "//pkg/apis/rbac/v1:go_default_library", - "//pkg/registry/rbac:go_default_library", - "//pkg/registry/rbac/validation:go_default_library", - "//staging/src/k8s.io/api/rbac/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/rbac/clusterrolebinding/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/rbac/clusterrolebinding/storage/BUILD deleted file mode 100644 index 94c9ef2eb12c..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/rbac/clusterrolebinding/storage/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/rbac/clusterrolebinding/storage", - deps = [ - "//pkg/apis/rbac:go_default_library", - "//pkg/printers:go_default_library", - "//pkg/printers/internalversion:go_default_library", - "//pkg/printers/storage:go_default_library", - "//pkg/registry/rbac/clusterrolebinding:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/rbac/rest/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/rbac/rest/BUILD deleted file mode 100644 index 3c727d46ff7e..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/rbac/rest/BUILD +++ /dev/null @@ -1,61 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["storage_rbac.go"], - importpath = "k8s.io/kubernetes/pkg/registry/rbac/rest", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/rbac:go_default_library", - "//pkg/registry/rbac/clusterrole:go_default_library", - "//pkg/registry/rbac/clusterrole/policybased:go_default_library", - "//pkg/registry/rbac/clusterrole/storage:go_default_library", - "//pkg/registry/rbac/clusterrolebinding:go_default_library", - "//pkg/registry/rbac/clusterrolebinding/policybased:go_default_library", - "//pkg/registry/rbac/clusterrolebinding/storage:go_default_library", - "//pkg/registry/rbac/role:go_default_library", - "//pkg/registry/rbac/role/policybased:go_default_library", - "//pkg/registry/rbac/role/storage:go_default_library", - "//pkg/registry/rbac/rolebinding:go_default_library", - "//pkg/registry/rbac/rolebinding/policybased:go_default_library", - "//pkg/registry/rbac/rolebinding/storage:go_default_library", - "//pkg/registry/rbac/validation:go_default_library", - "//plugin/pkg/auth/authorizer/rbac/bootstrappolicy:go_default_library", - "//staging/src/k8s.io/api/rbac/v1:go_default_library", - "//staging/src/k8s.io/api/rbac/v1alpha1:go_default_library", - "//staging/src/k8s.io/api/rbac/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/storage:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1:go_default_library", - "//staging/src/k8s.io/client-go/util/retry:go_default_library", - "//staging/src/k8s.io/component-helpers/auth/rbac/reconciliation:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/rbac/rest/storage_rbac.go b/vendor/k8s.io/kubernetes/pkg/registry/rbac/rest/storage_rbac.go index cfcd4b3c2256..94995b9fee9a 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/rbac/rest/storage_rbac.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/rbac/rest/storage_rbac.go @@ -37,7 +37,7 @@ import ( "k8s.io/apiserver/pkg/registry/rest" genericapiserver "k8s.io/apiserver/pkg/server" serverstorage "k8s.io/apiserver/pkg/server/storage" - corev1client "k8s.io/client-go/kubernetes/typed/core/v1" + clientset "k8s.io/client-go/kubernetes" rbacv1client "k8s.io/client-go/kubernetes/typed/rbac/v1" "k8s.io/client-go/util/retry" "k8s.io/component-helpers/auth/rbac/reconciliation" @@ -174,182 +174,179 @@ func (p *PolicyData) EnsureRBACPolicy() genericapiserver.PostStartHookFunc { // initializing roles is really important. On some e2e runs, we've seen cases where etcd is down when the server // starts, the roles don't initialize, and nothing works. err := wait.Poll(1*time.Second, 30*time.Second, func() (done bool, err error) { - failedReconciliation := false - - coreclientset, err := corev1client.NewForConfig(hookContext.LoopbackClientConfig) + client, err := clientset.NewForConfig(hookContext.LoopbackClientConfig) if err != nil { - utilruntime.HandleError(fmt.Errorf("unable to initialize client: %v", err)) + utilruntime.HandleError(fmt.Errorf("unable to initialize client set: %v", err)) return false, nil } + return ensureRBACPolicy(p, client) + }) + // if we're never able to make it through initialization, kill the API server + if err != nil { + return fmt.Errorf("unable to initialize roles: %v", err) + } + + return nil + } +} + +func ensureRBACPolicy(p *PolicyData, client clientset.Interface) (done bool, err error) { + failedReconciliation := false + // Make sure etcd is responding before we start reconciling + if _, err := client.RbacV1().ClusterRoles().List(context.TODO(), metav1.ListOptions{}); err != nil { + utilruntime.HandleError(fmt.Errorf("unable to initialize clusterroles: %v", err)) + return false, nil + } + if _, err := client.RbacV1().ClusterRoleBindings().List(context.TODO(), metav1.ListOptions{}); err != nil { + utilruntime.HandleError(fmt.Errorf("unable to initialize clusterrolebindings: %v", err)) + return false, nil + } + + // if the new cluster roles to aggregate do not yet exist, then we need to copy the old roles if they don't exist + // in new locations + if err := primeAggregatedClusterRoles(p.ClusterRolesToAggregate, client.RbacV1()); err != nil { + utilruntime.HandleError(fmt.Errorf("unable to prime aggregated clusterroles: %v", err)) + return false, nil + } - clientset, err := rbacv1client.NewForConfig(hookContext.LoopbackClientConfig) + if err := primeSplitClusterRoleBindings(p.ClusterRoleBindingsToSplit, client.RbacV1()); err != nil { + utilruntime.HandleError(fmt.Errorf("unable to prime split ClusterRoleBindings: %v", err)) + return false, nil + } + + // ensure bootstrap roles are created or reconciled + for _, clusterRole := range p.ClusterRoles { + opts := reconciliation.ReconcileRoleOptions{ + Role: reconciliation.ClusterRoleRuleOwner{ClusterRole: &clusterRole}, + Client: reconciliation.ClusterRoleModifier{Client: client.RbacV1().ClusterRoles()}, + Confirm: true, + } + // ServiceUnavailble error is returned when the API server is blocked by storage version updates + err := retryOnConflictOrServiceUnavailable(retry.DefaultBackoff, func() error { + result, err := opts.Run() if err != nil { - utilruntime.HandleError(fmt.Errorf("unable to initialize client: %v", err)) - return false, nil - } - // Make sure etcd is responding before we start reconciling - if _, err := clientset.ClusterRoles().List(context.TODO(), metav1.ListOptions{}); err != nil { - utilruntime.HandleError(fmt.Errorf("unable to initialize clusterroles: %v", err)) - return false, nil + return err } - if _, err := clientset.ClusterRoleBindings().List(context.TODO(), metav1.ListOptions{}); err != nil { - utilruntime.HandleError(fmt.Errorf("unable to initialize clusterrolebindings: %v", err)) - return false, nil + switch { + case result.Protected && result.Operation != reconciliation.ReconcileNone: + klog.Warningf("skipped reconcile-protected clusterrole.%s/%s with missing permissions: %v", rbac.GroupName, clusterRole.Name, result.MissingRules) + case result.Operation == reconciliation.ReconcileUpdate: + klog.V(2).Infof("updated clusterrole.%s/%s with additional permissions: %v", rbac.GroupName, clusterRole.Name, result.MissingRules) + case result.Operation == reconciliation.ReconcileCreate: + klog.V(2).Infof("created clusterrole.%s/%s", rbac.GroupName, clusterRole.Name) } + return nil + }) + if err != nil { + // don't fail on failures, try to create as many as you can + utilruntime.HandleError(fmt.Errorf("unable to reconcile clusterrole.%s/%s: %v", rbac.GroupName, clusterRole.Name, err)) + failedReconciliation = true + } + } - // if the new cluster roles to aggregate do not yet exist, then we need to copy the old roles if they don't exist - // in new locations - if err := primeAggregatedClusterRoles(p.ClusterRolesToAggregate, clientset); err != nil { - utilruntime.HandleError(fmt.Errorf("unable to prime aggregated clusterroles: %v", err)) - return false, nil + // ensure bootstrap rolebindings are created or reconciled + for _, clusterRoleBinding := range p.ClusterRoleBindings { + opts := reconciliation.ReconcileRoleBindingOptions{ + RoleBinding: reconciliation.ClusterRoleBindingAdapter{ClusterRoleBinding: &clusterRoleBinding}, + Client: reconciliation.ClusterRoleBindingClientAdapter{Client: client.RbacV1().ClusterRoleBindings()}, + Confirm: true, + } + // ServiceUnavailble error is returned when the API server is blocked by storage version updates + err := retryOnConflictOrServiceUnavailable(retry.DefaultBackoff, func() error { + result, err := opts.Run() + if err != nil { + return err } - - if err := primeSplitClusterRoleBindings(p.ClusterRoleBindingsToSplit, clientset); err != nil { - utilruntime.HandleError(fmt.Errorf("unable to prime split ClusterRoleBindings: %v", err)) - return false, nil + switch { + case result.Protected && result.Operation != reconciliation.ReconcileNone: + klog.Warningf("skipped reconcile-protected clusterrolebinding.%s/%s with missing subjects: %v", rbac.GroupName, clusterRoleBinding.Name, result.MissingSubjects) + case result.Operation == reconciliation.ReconcileUpdate: + klog.V(2).Infof("updated clusterrolebinding.%s/%s with additional subjects: %v", rbac.GroupName, clusterRoleBinding.Name, result.MissingSubjects) + case result.Operation == reconciliation.ReconcileCreate: + klog.V(2).Infof("created clusterrolebinding.%s/%s", rbac.GroupName, clusterRoleBinding.Name) + case result.Operation == reconciliation.ReconcileRecreate: + klog.V(2).Infof("recreated clusterrolebinding.%s/%s", rbac.GroupName, clusterRoleBinding.Name) } + return nil + }) + if err != nil { + // don't fail on failures, try to create as many as you can + utilruntime.HandleError(fmt.Errorf("unable to reconcile clusterrolebinding.%s/%s: %v", rbac.GroupName, clusterRoleBinding.Name, err)) + failedReconciliation = true + } + } - // ensure bootstrap roles are created or reconciled - for _, clusterRole := range p.ClusterRoles { - opts := reconciliation.ReconcileRoleOptions{ - Role: reconciliation.ClusterRoleRuleOwner{ClusterRole: &clusterRole}, - Client: reconciliation.ClusterRoleModifier{Client: clientset.ClusterRoles()}, - Confirm: true, - } - // ServiceUnavailble error is returned when the API server is blocked by storage version updates - err := retryOnConflictOrServiceUnavailable(retry.DefaultBackoff, func() error { - result, err := opts.Run() - if err != nil { - return err - } - switch { - case result.Protected && result.Operation != reconciliation.ReconcileNone: - klog.Warningf("skipped reconcile-protected clusterrole.%s/%s with missing permissions: %v", rbac.GroupName, clusterRole.Name, result.MissingRules) - case result.Operation == reconciliation.ReconcileUpdate: - klog.V(2).Infof("updated clusterrole.%s/%s with additional permissions: %v", rbac.GroupName, clusterRole.Name, result.MissingRules) - case result.Operation == reconciliation.ReconcileCreate: - klog.V(2).Infof("created clusterrole.%s/%s", rbac.GroupName, clusterRole.Name) - } - return nil - }) - if err != nil { - // don't fail on failures, try to create as many as you can - utilruntime.HandleError(fmt.Errorf("unable to reconcile clusterrole.%s/%s: %v", rbac.GroupName, clusterRole.Name, err)) - failedReconciliation = true - } + // ensure bootstrap namespaced roles are created or reconciled + for namespace, roles := range p.Roles { + for _, role := range roles { + opts := reconciliation.ReconcileRoleOptions{ + Role: reconciliation.RoleRuleOwner{Role: &role}, + Client: reconciliation.RoleModifier{Client: client.RbacV1(), NamespaceClient: client.CoreV1().Namespaces()}, + Confirm: true, } - - // ensure bootstrap rolebindings are created or reconciled - for _, clusterRoleBinding := range p.ClusterRoleBindings { - opts := reconciliation.ReconcileRoleBindingOptions{ - RoleBinding: reconciliation.ClusterRoleBindingAdapter{ClusterRoleBinding: &clusterRoleBinding}, - Client: reconciliation.ClusterRoleBindingClientAdapter{Client: clientset.ClusterRoleBindings()}, - Confirm: true, - } - // ServiceUnavailble error is returned when the API server is blocked by storage version updates - err := retryOnConflictOrServiceUnavailable(retry.DefaultBackoff, func() error { - result, err := opts.Run() - if err != nil { - return err - } - switch { - case result.Protected && result.Operation != reconciliation.ReconcileNone: - klog.Warningf("skipped reconcile-protected clusterrolebinding.%s/%s with missing subjects: %v", rbac.GroupName, clusterRoleBinding.Name, result.MissingSubjects) - case result.Operation == reconciliation.ReconcileUpdate: - klog.V(2).Infof("updated clusterrolebinding.%s/%s with additional subjects: %v", rbac.GroupName, clusterRoleBinding.Name, result.MissingSubjects) - case result.Operation == reconciliation.ReconcileCreate: - klog.V(2).Infof("created clusterrolebinding.%s/%s", rbac.GroupName, clusterRoleBinding.Name) - case result.Operation == reconciliation.ReconcileRecreate: - klog.V(2).Infof("recreated clusterrolebinding.%s/%s", rbac.GroupName, clusterRoleBinding.Name) - } - return nil - }) + // ServiceUnavailble error is returned when the API server is blocked by storage version updates + err := retryOnConflictOrServiceUnavailable(retry.DefaultBackoff, func() error { + result, err := opts.Run() if err != nil { - // don't fail on failures, try to create as many as you can - utilruntime.HandleError(fmt.Errorf("unable to reconcile clusterrolebinding.%s/%s: %v", rbac.GroupName, clusterRoleBinding.Name, err)) - failedReconciliation = true + return err } - } - - // ensure bootstrap namespaced roles are created or reconciled - for namespace, roles := range p.Roles { - for _, role := range roles { - opts := reconciliation.ReconcileRoleOptions{ - Role: reconciliation.RoleRuleOwner{Role: &role}, - Client: reconciliation.RoleModifier{Client: clientset, NamespaceClient: coreclientset.Namespaces()}, - Confirm: true, - } - // ServiceUnavailble error is returned when the API server is blocked by storage version updates - err := retryOnConflictOrServiceUnavailable(retry.DefaultBackoff, func() error { - result, err := opts.Run() - if err != nil { - return err - } - switch { - case result.Protected && result.Operation != reconciliation.ReconcileNone: - klog.Warningf("skipped reconcile-protected role.%s/%s in %v with missing permissions: %v", rbac.GroupName, role.Name, namespace, result.MissingRules) - case result.Operation == reconciliation.ReconcileUpdate: - klog.V(2).Infof("updated role.%s/%s in %v with additional permissions: %v", rbac.GroupName, role.Name, namespace, result.MissingRules) - case result.Operation == reconciliation.ReconcileCreate: - klog.V(2).Infof("created role.%s/%s in %v", rbac.GroupName, role.Name, namespace) - } - return nil - }) - if err != nil { - // don't fail on failures, try to create as many as you can - utilruntime.HandleError(fmt.Errorf("unable to reconcile role.%s/%s in %v: %v", rbac.GroupName, role.Name, namespace, err)) - failedReconciliation = true - } + switch { + case result.Protected && result.Operation != reconciliation.ReconcileNone: + klog.Warningf("skipped reconcile-protected role.%s/%s in %v with missing permissions: %v", rbac.GroupName, role.Name, namespace, result.MissingRules) + case result.Operation == reconciliation.ReconcileUpdate: + klog.V(2).Infof("updated role.%s/%s in %v with additional permissions: %v", rbac.GroupName, role.Name, namespace, result.MissingRules) + case result.Operation == reconciliation.ReconcileCreate: + klog.V(2).Infof("created role.%s/%s in %v", rbac.GroupName, role.Name, namespace) } + return nil + }) + if err != nil { + // don't fail on failures, try to create as many as you can + utilruntime.HandleError(fmt.Errorf("unable to reconcile role.%s/%s in %v: %v", rbac.GroupName, role.Name, namespace, err)) + failedReconciliation = true } + } + } - // ensure bootstrap namespaced rolebindings are created or reconciled - for namespace, roleBindings := range p.RoleBindings { - for _, roleBinding := range roleBindings { - opts := reconciliation.ReconcileRoleBindingOptions{ - RoleBinding: reconciliation.RoleBindingAdapter{RoleBinding: &roleBinding}, - Client: reconciliation.RoleBindingClientAdapter{Client: clientset, NamespaceClient: coreclientset.Namespaces()}, - Confirm: true, - } - // ServiceUnavailble error is returned when the API server is blocked by storage version updates - err := retryOnConflictOrServiceUnavailable(retry.DefaultBackoff, func() error { - result, err := opts.Run() - if err != nil { - return err - } - switch { - case result.Protected && result.Operation != reconciliation.ReconcileNone: - klog.Warningf("skipped reconcile-protected rolebinding.%s/%s in %v with missing subjects: %v", rbac.GroupName, roleBinding.Name, namespace, result.MissingSubjects) - case result.Operation == reconciliation.ReconcileUpdate: - klog.V(2).Infof("updated rolebinding.%s/%s in %v with additional subjects: %v", rbac.GroupName, roleBinding.Name, namespace, result.MissingSubjects) - case result.Operation == reconciliation.ReconcileCreate: - klog.V(2).Infof("created rolebinding.%s/%s in %v", rbac.GroupName, roleBinding.Name, namespace) - case result.Operation == reconciliation.ReconcileRecreate: - klog.V(2).Infof("recreated rolebinding.%s/%s in %v", rbac.GroupName, roleBinding.Name, namespace) - } - return nil - }) - if err != nil { - // don't fail on failures, try to create as many as you can - utilruntime.HandleError(fmt.Errorf("unable to reconcile rolebinding.%s/%s in %v: %v", rbac.GroupName, roleBinding.Name, namespace, err)) - failedReconciliation = true - } - } + // ensure bootstrap namespaced rolebindings are created or reconciled + for namespace, roleBindings := range p.RoleBindings { + for _, roleBinding := range roleBindings { + opts := reconciliation.ReconcileRoleBindingOptions{ + RoleBinding: reconciliation.RoleBindingAdapter{RoleBinding: &roleBinding}, + Client: reconciliation.RoleBindingClientAdapter{Client: client.RbacV1(), NamespaceClient: client.CoreV1().Namespaces()}, + Confirm: true, } - // failed to reconcile some objects, retry - if failedReconciliation { - return false, nil + // ServiceUnavailble error is returned when the API server is blocked by storage version updates + err := retryOnConflictOrServiceUnavailable(retry.DefaultBackoff, func() error { + result, err := opts.Run() + if err != nil { + return err + } + switch { + case result.Protected && result.Operation != reconciliation.ReconcileNone: + klog.Warningf("skipped reconcile-protected rolebinding.%s/%s in %v with missing subjects: %v", rbac.GroupName, roleBinding.Name, namespace, result.MissingSubjects) + case result.Operation == reconciliation.ReconcileUpdate: + klog.V(2).Infof("updated rolebinding.%s/%s in %v with additional subjects: %v", rbac.GroupName, roleBinding.Name, namespace, result.MissingSubjects) + case result.Operation == reconciliation.ReconcileCreate: + klog.V(2).Infof("created rolebinding.%s/%s in %v", rbac.GroupName, roleBinding.Name, namespace) + case result.Operation == reconciliation.ReconcileRecreate: + klog.V(2).Infof("recreated rolebinding.%s/%s in %v", rbac.GroupName, roleBinding.Name, namespace) + } + return nil + }) + if err != nil { + // don't fail on failures, try to create as many as you can + utilruntime.HandleError(fmt.Errorf("unable to reconcile rolebinding.%s/%s in %v: %v", rbac.GroupName, roleBinding.Name, namespace, err)) + failedReconciliation = true } - - return true, nil - }) - // if we're never able to make it through initialization, kill the API server - if err != nil { - return fmt.Errorf("unable to initialize roles: %v", err) } - - return nil } + // failed to reconcile some objects, retry + if failedReconciliation { + return false, nil + } + + return true, nil } func (p RESTStorageProvider) GroupName() string { diff --git a/vendor/k8s.io/kubernetes/pkg/registry/rbac/role/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/rbac/role/BUILD deleted file mode 100644 index adedb72f3107..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/rbac/role/BUILD +++ /dev/null @@ -1,46 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "registry.go", - "strategy.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/rbac/role", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/rbac:go_default_library", - "//pkg/apis/rbac/v1:go_default_library", - "//pkg/apis/rbac/validation:go_default_library", - "//staging/src/k8s.io/api/rbac/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/rbac/role/policybased:all-srcs", - "//pkg/registry/rbac/role/storage:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/rbac/role/policybased/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/rbac/role/policybased/BUILD deleted file mode 100644 index 02a24d90eb54..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/rbac/role/policybased/BUILD +++ /dev/null @@ -1,56 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/rbac/role/policybased", - deps = [ - "//pkg/apis/core/helper:go_default_library", - "//pkg/apis/rbac:go_default_library", - "//pkg/registry/rbac:go_default_library", - "//pkg/registry/rbac/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["storage_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/rbac:go_default_library", - "//pkg/apis/rbac/install:go_default_library", - "//pkg/registry/rbac/validation:go_default_library", - "//staging/src/k8s.io/api/rbac/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/rbac/role/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/rbac/role/storage/BUILD deleted file mode 100644 index 51844b9d43f1..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/rbac/role/storage/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/rbac/role/storage", - deps = [ - "//pkg/apis/rbac:go_default_library", - "//pkg/registry/rbac/role:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/rbac/rolebinding/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/rbac/rolebinding/BUILD deleted file mode 100644 index 283c3473a269..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/rbac/rolebinding/BUILD +++ /dev/null @@ -1,46 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "registry.go", - "strategy.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/rbac/rolebinding", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/rbac:go_default_library", - "//pkg/apis/rbac/v1:go_default_library", - "//pkg/apis/rbac/validation:go_default_library", - "//staging/src/k8s.io/api/rbac/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/rbac/rolebinding/policybased:all-srcs", - "//pkg/registry/rbac/rolebinding/storage:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/rbac/rolebinding/policybased/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/rbac/rolebinding/policybased/BUILD deleted file mode 100644 index ef109e1d11f5..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/rbac/rolebinding/policybased/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/rbac/rolebinding/policybased", - deps = [ - "//pkg/apis/core/helper:go_default_library", - "//pkg/apis/rbac:go_default_library", - "//pkg/apis/rbac/v1:go_default_library", - "//pkg/registry/rbac:go_default_library", - "//pkg/registry/rbac/validation:go_default_library", - "//staging/src/k8s.io/api/rbac/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/rbac/rolebinding/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/rbac/rolebinding/storage/BUILD deleted file mode 100644 index 982dfa098f22..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/rbac/rolebinding/storage/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/rbac/rolebinding/storage", - deps = [ - "//pkg/apis/rbac:go_default_library", - "//pkg/printers:go_default_library", - "//pkg/printers/internalversion:go_default_library", - "//pkg/printers/storage:go_default_library", - "//pkg/registry/rbac/rolebinding:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/rbac/validation/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/rbac/validation/BUILD deleted file mode 100644 index 0786e3d04a65..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/rbac/validation/BUILD +++ /dev/null @@ -1,59 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "policy_compact_test.go", - "rule_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/rbac/v1:go_default_library", - "//staging/src/k8s.io/api/rbac/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/component-helpers/auth/rbac/validation:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "internal_version_adapter.go", - "policy_compact.go", - "rule.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/rbac/validation", - deps = [ - "//pkg/apis/rbac:go_default_library", - "//pkg/apis/rbac/v1:go_default_library", - "//staging/src/k8s.io/api/rbac/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/serviceaccount:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/component-helpers/auth/rbac/validation:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/registrytest/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/registrytest/BUILD deleted file mode 100644 index 2c2e1a75073c..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/registrytest/BUILD +++ /dev/null @@ -1,52 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "categoriesProvider.go", - "doc.go", - "endpoint.go", - "etcd.go", - "node.go", - "service.go", - "shortNamesProvider.go", - "validate.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/registrytest", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/kubeapiserver:go_default_library", - "//pkg/util/slice:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/options:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/storage:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/testing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/storagebackend:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/registrytest/OWNERS b/vendor/k8s.io/kubernetes/pkg/registry/registrytest/OWNERS index 350d4e212f1c..40ba5d3c680b 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/registrytest/OWNERS +++ b/vendor/k8s.io/kubernetes/pkg/registry/registrytest/OWNERS @@ -11,8 +11,6 @@ reviewers: - caesarxuchao - mikedanese - liggitt -- nikhiljindal -- gmarek - erictune - pmorie - timothysc diff --git a/vendor/k8s.io/kubernetes/pkg/registry/registrytest/service.go b/vendor/k8s.io/kubernetes/pkg/registry/registrytest/service.go index 490bc0e37e50..72a4a1fde6ff 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/registrytest/service.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/registrytest/service.go @@ -117,10 +117,3 @@ func (r *ServiceRegistry) WatchServices(ctx context.Context, options *metaintern return nil, r.Err } - -func (r *ServiceRegistry) ExportService(ctx context.Context, name string, options metav1.ExportOptions) (*api.Service, error) { - r.mu.Lock() - defer r.mu.Unlock() - - return r.Service, r.Err -} diff --git a/vendor/k8s.io/kubernetes/pkg/registry/registrytest/validate.go b/vendor/k8s.io/kubernetes/pkg/registry/registrytest/validate.go index 9016d57e5a1f..63612d0c546a 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/registrytest/validate.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/registrytest/validate.go @@ -21,17 +21,13 @@ import ( "k8s.io/apiserver/pkg/registry/generic/registry" "k8s.io/apiserver/pkg/registry/rest" - "k8s.io/kubernetes/pkg/util/slice" ) // ValidateStorageStrategies ensures any instances of the generic registry.Store in the given storage map // have expected strategies defined. -func ValidateStorageStrategies(storageMap map[string]rest.Storage, exceptions StrategyExceptions) []error { +func ValidateStorageStrategies(storageMap map[string]rest.Storage) []error { errs := []error{} - // Used to ensure we saw all the expected exceptions: - hasExportExceptionsSeen := []string{} - for k, storage := range storageMap { switch t := storage.(type) { case registry.GenericStore: @@ -46,27 +42,6 @@ func ValidateStorageStrategies(storageMap map[string]rest.Storage, exceptions St if t.GetDeleteStrategy() == nil { errs = append(errs, fmt.Errorf("store for type [%v] does not have a DeleteStrategy", k)) } - - // Check that ExportStrategy is set if applicable: - if slice.ContainsString(exceptions.HasExportStrategy, k, nil) { - hasExportExceptionsSeen = append(hasExportExceptionsSeen, k) - if t.GetExportStrategy() == nil { - errs = append(errs, fmt.Errorf("store for type [%v] does not have an ExportStrategy", k)) - } - } else { - // By default we expect Stores to not have additional export logic: - if t.GetExportStrategy() != nil { - errs = append(errs, fmt.Errorf("store for type [%v] has an unexpected ExportStrategy", k)) - } - } - - } - } - - // Ensure that we saw all our expected exceptions: - for _, expKey := range exceptions.HasExportStrategy { - if !slice.ContainsString(hasExportExceptionsSeen, expKey, nil) { - errs = append(errs, fmt.Errorf("no generic store seen for expected ExportStrategy: %v", expKey)) } } diff --git a/vendor/k8s.io/kubernetes/pkg/registry/scheduling/priorityclass/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/scheduling/priorityclass/BUILD deleted file mode 100644 index 061625814200..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/scheduling/priorityclass/BUILD +++ /dev/null @@ -1,52 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["strategy_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/scheduling:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "strategy.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/scheduling/priorityclass", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/scheduling:go_default_library", - "//pkg/apis/scheduling/util:go_default_library", - "//pkg/apis/scheduling/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/scheduling/priorityclass/storage:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/scheduling/priorityclass/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/scheduling/priorityclass/storage/BUILD deleted file mode 100644 index 31ca243e3458..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/scheduling/priorityclass/storage/BUILD +++ /dev/null @@ -1,60 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["storage_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/scheduling:go_default_library", - "//pkg/apis/scheduling/v1:go_default_library", - "//pkg/registry/registrytest:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/testing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/testing:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/scheduling/priorityclass/storage", - deps = [ - "//pkg/apis/scheduling:go_default_library", - "//pkg/apis/scheduling/v1:go_default_library", - "//pkg/printers:go_default_library", - "//pkg/printers/internalversion:go_default_library", - "//pkg/printers/storage:go_default_library", - "//pkg/registry/scheduling/priorityclass:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/scheduling/rest/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/scheduling/rest/BUILD deleted file mode 100644 index f8fd1c3f55b4..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/scheduling/rest/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["storage_scheduling.go"], - importpath = "k8s.io/kubernetes/pkg/registry/scheduling/rest", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/scheduling:go_default_library", - "//pkg/apis/scheduling/v1:go_default_library", - "//pkg/apis/scheduling/v1alpha1:go_default_library", - "//pkg/apis/scheduling/v1beta1:go_default_library", - "//pkg/registry/scheduling/priorityclass/storage:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/storage:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/scheduling/v1:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/storage/csidriver/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/storage/csidriver/BUILD deleted file mode 100644 index f565a857d822..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/storage/csidriver/BUILD +++ /dev/null @@ -1,54 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "strategy.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/storage/csidriver", - visibility = ["//visibility:public"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/storage:go_default_library", - "//pkg/apis/storage/validation:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/storage/csidriver/storage:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["strategy_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/storage:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/storage/csidriver/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/storage/csidriver/storage/BUILD deleted file mode 100644 index 7e899d908999..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/storage/csidriver/storage/BUILD +++ /dev/null @@ -1,49 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/storage/csidriver/storage", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/storage:go_default_library", - "//pkg/printers:go_default_library", - "//pkg/printers/internalversion:go_default_library", - "//pkg/printers/storage:go_default_library", - "//pkg/registry/storage/csidriver:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["storage_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/storage:go_default_library", - "//pkg/registry/registrytest:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/testing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/testing:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/storage/csidriver/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/storage/csidriver/strategy.go index ec600ac41092..46ae526493f8 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/storage/csidriver/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/storage/csidriver/strategy.go @@ -19,6 +19,7 @@ package csidriver import ( "context" + apiequality "k8s.io/apimachinery/pkg/api/equality" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" "k8s.io/apiserver/pkg/storage/names" @@ -64,10 +65,7 @@ func (csiDriverStrategy) PrepareForCreate(ctx context.Context, obj runtime.Objec func (csiDriverStrategy) Validate(ctx context.Context, obj runtime.Object) field.ErrorList { csiDriver := obj.(*storage.CSIDriver) - errs := validation.ValidateCSIDriver(csiDriver) - errs = append(errs, validation.ValidateCSIDriver(csiDriver)...) - - return errs + return validation.ValidateCSIDriver(csiDriver) } // Canonicalize normalizes the object after validation. @@ -82,31 +80,33 @@ func (csiDriverStrategy) AllowCreateOnUpdate() bool { // existing object does not already have that field set. This allows the field to remain when // downgrading to a version that has the feature disabled. func (csiDriverStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object) { - if old.(*storage.CSIDriver).Spec.StorageCapacity == nil && + newCSIDriver := obj.(*storage.CSIDriver) + oldCSIDriver := old.(*storage.CSIDriver) + + if oldCSIDriver.Spec.StorageCapacity == nil && !utilfeature.DefaultFeatureGate.Enabled(features.CSIStorageCapacity) { - newCSIDriver := obj.(*storage.CSIDriver) newCSIDriver.Spec.StorageCapacity = nil } - if old.(*storage.CSIDriver).Spec.VolumeLifecycleModes == nil && + if oldCSIDriver.Spec.VolumeLifecycleModes == nil && !utilfeature.DefaultFeatureGate.Enabled(features.CSIInlineVolume) { - newCSIDriver := obj.(*storage.CSIDriver) newCSIDriver.Spec.VolumeLifecycleModes = nil } - if old.(*storage.CSIDriver).Spec.FSGroupPolicy == nil && + if oldCSIDriver.Spec.FSGroupPolicy == nil && !utilfeature.DefaultFeatureGate.Enabled(features.CSIVolumeFSGroupPolicy) { - newCSIDriver := obj.(*storage.CSIDriver) newCSIDriver.Spec.FSGroupPolicy = nil } - if old.(*storage.CSIDriver).Spec.TokenRequests == nil && + if oldCSIDriver.Spec.TokenRequests == nil && !utilfeature.DefaultFeatureGate.Enabled(features.CSIServiceAccountToken) { - csiDriver := obj.(*storage.CSIDriver) - csiDriver.Spec.TokenRequests = nil + newCSIDriver.Spec.TokenRequests = nil } - - if old.(*storage.CSIDriver).Spec.RequiresRepublish == nil && + if oldCSIDriver.Spec.RequiresRepublish == nil && !utilfeature.DefaultFeatureGate.Enabled(features.CSIServiceAccountToken) { - csiDriver := obj.(*storage.CSIDriver) - csiDriver.Spec.RequiresRepublish = nil + newCSIDriver.Spec.RequiresRepublish = nil + } + + // Any changes to the mutable fields increment the generation number. + if !apiequality.Semantic.DeepEqual(oldCSIDriver.Spec.TokenRequests, newCSIDriver.Spec.TokenRequests) || !apiequality.Semantic.DeepEqual(oldCSIDriver.Spec.RequiresRepublish, newCSIDriver.Spec.RequiresRepublish) { + newCSIDriver.Generation = oldCSIDriver.Generation + 1 } } diff --git a/vendor/k8s.io/kubernetes/pkg/registry/storage/csinode/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/storage/csinode/BUILD deleted file mode 100644 index f14adabc1401..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/storage/csinode/BUILD +++ /dev/null @@ -1,49 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "strategy.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/storage/csinode", - visibility = ["//visibility:public"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/storage:go_default_library", - "//pkg/apis/storage/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/storage/csinode/storage:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["strategy_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/storage:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/storage/csinode/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/storage/csinode/storage/BUILD deleted file mode 100644 index e80352ce642c..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/storage/csinode/storage/BUILD +++ /dev/null @@ -1,49 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/storage/csinode/storage", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/storage:go_default_library", - "//pkg/printers:go_default_library", - "//pkg/printers/internalversion:go_default_library", - "//pkg/printers/storage:go_default_library", - "//pkg/registry/storage/csinode:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["storage_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/storage:go_default_library", - "//pkg/registry/registrytest:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/testing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/testing:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/storage/csinode/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/storage/csinode/strategy.go index d7ac8871e4f5..6581b1ded079 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/storage/csinode/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/storage/csinode/strategy.go @@ -48,8 +48,13 @@ func (csiNodeStrategy) PrepareForCreate(ctx context.Context, obj runtime.Object) func (csiNodeStrategy) Validate(ctx context.Context, obj runtime.Object) field.ErrorList { csiNode := obj.(*storage.CSINode) - errs := validation.ValidateCSINode(csiNode) - errs = append(errs, validation.ValidateCSINode(csiNode)...) + // in 1.21, on create, set AllowLongNodeID=false + // in 1.22, on create, set AllowLongNodeID=true + validateOptions := validation.CSINodeValidationOptions{ + AllowLongNodeID: false, + } + + errs := validation.ValidateCSINode(csiNode, validateOptions) return errs } @@ -69,8 +74,20 @@ func (csiNodeStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Ob func (csiNodeStrategy) ValidateUpdate(ctx context.Context, obj, old runtime.Object) field.ErrorList { newCSINodeObj := obj.(*storage.CSINode) oldCSINodeObj := old.(*storage.CSINode) - errorList := validation.ValidateCSINode(newCSINodeObj) - return append(errorList, validation.ValidateCSINodeUpdate(newCSINodeObj, oldCSINodeObj)...) + // in 1.21 on update, set AllowLongNodeID to true only if the old object already has a long node ID + // in 1.22 on update, set AllowLongNodeID=true + allowLongNodeID := false + for _, nodeDriver := range oldCSINodeObj.Spec.Drivers { + if validation.CSINodeLongerID(nodeDriver.NodeID) { + allowLongNodeID = true + } + } + validateOptions := validation.CSINodeValidationOptions{ + AllowLongNodeID: allowLongNodeID, + } + + errorList := validation.ValidateCSINode(newCSINodeObj, validateOptions) + return append(errorList, validation.ValidateCSINodeUpdate(newCSINodeObj, oldCSINodeObj, validateOptions)...) } func (csiNodeStrategy) AllowUnconditionalUpdate() bool { diff --git a/vendor/k8s.io/kubernetes/pkg/registry/storage/csistoragecapacity/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/storage/csistoragecapacity/BUILD deleted file mode 100644 index fe95c84fca63..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/storage/csistoragecapacity/BUILD +++ /dev/null @@ -1,53 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "strategy.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/storage/csistoragecapacity", - visibility = ["//visibility:public"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/storage:go_default_library", - "//pkg/apis/storage/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["strategy_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/storage:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/storage/csistoragecapacity/storage:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/storage/csistoragecapacity/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/storage/csistoragecapacity/storage/BUILD deleted file mode 100644 index d66268f11e21..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/storage/csistoragecapacity/storage/BUILD +++ /dev/null @@ -1,49 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/storage/csistoragecapacity/storage", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/storage:go_default_library", - "//pkg/registry/storage/csistoragecapacity:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["storage_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/storage:go_default_library", - "//pkg/apis/storage/install:go_default_library", - "//pkg/registry/registrytest:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/testing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/storage/rest/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/storage/rest/BUILD deleted file mode 100644 index e7608f24201b..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/storage/rest/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["storage_storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/storage/rest", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/storage:go_default_library", - "//pkg/features:go_default_library", - "//pkg/registry/storage/csidriver/storage:go_default_library", - "//pkg/registry/storage/csinode/storage:go_default_library", - "//pkg/registry/storage/csistoragecapacity/storage:go_default_library", - "//pkg/registry/storage/storageclass/storage:go_default_library", - "//pkg/registry/storage/volumeattachment/storage:go_default_library", - "//staging/src/k8s.io/api/storage/v1:go_default_library", - "//staging/src/k8s.io/api/storage/v1alpha1:go_default_library", - "//staging/src/k8s.io/api/storage/v1beta1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/storage:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/storage/rest/storage_storage.go b/vendor/k8s.io/kubernetes/pkg/registry/storage/rest/storage_storage.go index 9deb79e0f43c..bafb1ce2c361 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/storage/rest/storage_storage.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/storage/rest/storage_storage.go @@ -24,10 +24,8 @@ import ( "k8s.io/apiserver/pkg/registry/rest" genericapiserver "k8s.io/apiserver/pkg/server" serverstorage "k8s.io/apiserver/pkg/server/storage" - utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/kubernetes/pkg/api/legacyscheme" storageapi "k8s.io/kubernetes/pkg/apis/storage" - "k8s.io/kubernetes/pkg/features" csidriverstore "k8s.io/kubernetes/pkg/registry/storage/csidriver/storage" csinodestore "k8s.io/kubernetes/pkg/registry/storage/csinode/storage" csistoragecapacitystore "k8s.io/kubernetes/pkg/registry/storage/csistoragecapacity/storage" @@ -77,14 +75,12 @@ func (p RESTStorageProvider) v1alpha1Storage(apiResourceConfigSource serverstora } storage["volumeattachments"] = volumeAttachmentStorage.VolumeAttachment - // register csistoragecapacity if CSIStorageCapacity feature gate is enabled - if utilfeature.DefaultFeatureGate.Enabled(features.CSIStorageCapacity) { - csiStorageStorage, err := csistoragecapacitystore.NewStorage(restOptionsGetter) - if err != nil { - return storage, err - } - storage["csistoragecapacities"] = csiStorageStorage.CSIStorageCapacity + // register csistoragecapacities + csiStorageStorage, err := csistoragecapacitystore.NewStorage(restOptionsGetter) + if err != nil { + return storage, err } + storage["csistoragecapacities"] = csiStorageStorage.CSIStorageCapacity return storage, nil } @@ -105,14 +101,12 @@ func (p RESTStorageProvider) v1beta1Storage(apiResourceConfigSource serverstorag } storage["volumeattachments"] = volumeAttachmentStorage.VolumeAttachment - // register csinodes if CSINodeInfo feature gate is enabled - if utilfeature.DefaultFeatureGate.Enabled(features.CSINodeInfo) { - csiNodeStorage, err := csinodestore.NewStorage(restOptionsGetter) - if err != nil { - return storage, err - } - storage["csinodes"] = csiNodeStorage.CSINode + // register csinodes + csiNodeStorage, err := csinodestore.NewStorage(restOptionsGetter) + if err != nil { + return storage, err } + storage["csinodes"] = csiNodeStorage.CSINode // register csidrivers csiDriverStorage, err := csidriverstore.NewStorage(restOptionsGetter) @@ -121,6 +115,13 @@ func (p RESTStorageProvider) v1beta1Storage(apiResourceConfigSource serverstorag } storage["csidrivers"] = csiDriverStorage.CSIDriver + // register csistoragecapacities + csiStorageStorage, err := csistoragecapacitystore.NewStorage(restOptionsGetter) + if err != nil { + return storage, err + } + storage["csistoragecapacities"] = csiStorageStorage.CSIStorageCapacity + return storage, nil } @@ -143,14 +144,12 @@ func (p RESTStorageProvider) v1Storage(apiResourceConfigSource serverstorage.API "volumeattachments/status": volumeAttachmentStorage.Status, } - // register csinodes if CSINodeInfo feature gate is enabled - if utilfeature.DefaultFeatureGate.Enabled(features.CSINodeInfo) { - csiNodeStorage, err := csinodestore.NewStorage(restOptionsGetter) - if err != nil { - return nil, err - } - storage["csinodes"] = csiNodeStorage.CSINode + // register csinodes + csiNodeStorage, err := csinodestore.NewStorage(restOptionsGetter) + if err != nil { + return nil, err } + storage["csinodes"] = csiNodeStorage.CSINode // register csidrivers csiDriverStorage, err := csidriverstore.NewStorage(restOptionsGetter) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/storage/storageclass/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/storage/storageclass/BUILD deleted file mode 100644 index 6dc98c39d426..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/storage/storageclass/BUILD +++ /dev/null @@ -1,53 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "strategy.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/storage/storageclass", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/storage:go_default_library", - "//pkg/apis/storage/util:go_default_library", - "//pkg/apis/storage/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["strategy_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/storage:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/storage/storageclass/storage:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/storage/storageclass/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/storage/storageclass/storage/BUILD deleted file mode 100644 index 1ba8a31d7f45..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/storage/storageclass/storage/BUILD +++ /dev/null @@ -1,55 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["storage_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/storage:go_default_library", - "//pkg/registry/registrytest:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/testing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/testing:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/storage/storageclass/storage", - deps = [ - "//pkg/apis/storage:go_default_library", - "//pkg/printers:go_default_library", - "//pkg/printers/internalversion:go_default_library", - "//pkg/printers/storage:go_default_library", - "//pkg/registry/storage/storageclass:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/storage/volumeattachment/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/storage/volumeattachment/BUILD deleted file mode 100644 index c47461b83336..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/storage/volumeattachment/BUILD +++ /dev/null @@ -1,61 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "strategy.go", - ], - importpath = "k8s.io/kubernetes/pkg/registry/storage/volumeattachment", - visibility = ["//visibility:public"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/storage:go_default_library", - "//pkg/apis/storage/validation:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/api/storage/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["strategy_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/storage:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/registry/storage/volumeattachment/storage:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/storage/volumeattachment/storage/BUILD b/vendor/k8s.io/kubernetes/pkg/registry/storage/volumeattachment/storage/BUILD deleted file mode 100644 index 1d2862f8b960..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/registry/storage/volumeattachment/storage/BUILD +++ /dev/null @@ -1,55 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["storage.go"], - importpath = "k8s.io/kubernetes/pkg/registry/storage/volumeattachment/storage", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/storage:go_default_library", - "//pkg/printers:go_default_library", - "//pkg/printers/internalversion:go_default_library", - "//pkg/printers/storage:go_default_library", - "//pkg/registry/storage/volumeattachment:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["storage_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/storage:go_default_library", - "//pkg/registry/registrytest:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/testing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/storage/volumeattachment/storage/storage.go b/vendor/k8s.io/kubernetes/pkg/registry/storage/volumeattachment/storage/storage.go index fb74627126cd..6f8d291e1e42 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/storage/volumeattachment/storage/storage.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/storage/volumeattachment/storage/storage.go @@ -29,6 +29,7 @@ import ( printersinternal "k8s.io/kubernetes/pkg/printers/internalversion" printerstorage "k8s.io/kubernetes/pkg/printers/storage" "k8s.io/kubernetes/pkg/registry/storage/volumeattachment" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // VolumeAttachmentStorage includes storage for VolumeAttachments and all subresources @@ -52,6 +53,7 @@ func NewStorage(optsGetter generic.RESTOptionsGetter) (*VolumeAttachmentStorage, CreateStrategy: volumeattachment.Strategy, UpdateStrategy: volumeattachment.Strategy, DeleteStrategy: volumeattachment.Strategy, + ResetFieldsStrategy: volumeattachment.Strategy, ReturnDeletedObject: true, TableConvertor: printerstorage.TableConvertor{TableGenerator: printers.NewTableGenerator().With(printersinternal.AddHandlers)}, @@ -63,6 +65,7 @@ func NewStorage(optsGetter generic.RESTOptionsGetter) (*VolumeAttachmentStorage, statusStore := *store statusStore.UpdateStrategy = volumeattachment.StatusStrategy + statusStore.ResetFieldsStrategy = volumeattachment.StatusStrategy return &VolumeAttachmentStorage{ VolumeAttachment: &REST{store}, @@ -93,3 +96,8 @@ func (r *StatusREST) Update(ctx context.Context, name string, objInfo rest.Updat // subresources should never allow create on update. return r.store.Update(ctx, name, objInfo, createValidation, updateValidation, false, options) } + +// GetResetFields implements rest.ResetFieldsStrategy +func (r *StatusREST) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + return r.store.GetResetFields() +} diff --git a/vendor/k8s.io/kubernetes/pkg/registry/storage/volumeattachment/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/storage/volumeattachment/strategy.go index b00712c60221..e1d03c2682b8 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/storage/volumeattachment/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/storage/volumeattachment/strategy.go @@ -31,6 +31,7 @@ import ( "k8s.io/kubernetes/pkg/apis/storage" "k8s.io/kubernetes/pkg/apis/storage/validation" "k8s.io/kubernetes/pkg/features" + "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) // volumeAttachmentStrategy implements behavior for VolumeAttachment objects @@ -47,6 +48,18 @@ func (volumeAttachmentStrategy) NamespaceScoped() bool { return false } +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (volumeAttachmentStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + fields := map[fieldpath.APIVersion]*fieldpath.Set{ + "storage.k8s.io/v1": fieldpath.NewSet( + fieldpath.MakePathOrDie("status"), + ), + } + + return fields +} + // ResetBeforeCreate clears the Status field which is not allowed to be set by end users on creation. func (volumeAttachmentStrategy) PrepareForCreate(ctx context.Context, obj runtime.Object) { var groupVersion schema.GroupVersion @@ -143,6 +156,19 @@ type volumeAttachmentStatusStrategy struct { // VolumeAttachmentStatus subresource via the REST API. var StatusStrategy = volumeAttachmentStatusStrategy{Strategy} +// GetResetFields returns the set of fields that get reset by the strategy +// and should not be modified by the user. +func (volumeAttachmentStatusStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set { + fields := map[fieldpath.APIVersion]*fieldpath.Set{ + "storage.k8s.io/v1": fieldpath.NewSet( + fieldpath.MakePathOrDie("metadata"), + fieldpath.MakePathOrDie("spec"), + ), + } + + return fields +} + // PrepareForUpdate sets the Status fields which is not allowed to be set by an end user updating a VolumeAttachment func (volumeAttachmentStatusStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object) { newVolumeAttachment := obj.(*storage.VolumeAttachment) diff --git a/vendor/k8s.io/kubernetes/pkg/routes/BUILD b/vendor/k8s.io/kubernetes/pkg/routes/BUILD deleted file mode 100644 index 96a57471f3b1..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/routes/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "logs.go", - "openidmetadata.go", - ], - importpath = "k8s.io/kubernetes/pkg/routes", - deps = [ - "//pkg/serviceaccount:go_default_library", - "//vendor/github.com/emicklei/go-restful:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/routes/logs.go b/vendor/k8s.io/kubernetes/pkg/routes/logs.go index 1922a381ede9..ef9cd4ef616b 100644 --- a/vendor/k8s.io/kubernetes/pkg/routes/logs.go +++ b/vendor/k8s.io/kubernetes/pkg/routes/logs.go @@ -29,7 +29,7 @@ type Logs struct{} // Install func registers the logs handler. func (l Logs) Install(c *restful.Container) { // use restful: ws.Route(ws.GET("/logs/{logpath:*}").To(fileHandler)) - // See github.com/emicklei/go-restful/blob/master/examples/restful-serve-static.go + // See github.com/emicklei/go-restful/blob/master/examples/static/restful-serve-static.go ws := new(restful.WebService) ws.Path("/logs") ws.Doc("get log files") diff --git a/vendor/k8s.io/kubernetes/pkg/scheduler/apis/config/BUILD b/vendor/k8s.io/kubernetes/pkg/scheduler/apis/config/BUILD deleted file mode 100644 index 7291c0c6b7a3..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/scheduler/apis/config/BUILD +++ /dev/null @@ -1,51 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "legacy_types.go", - "register.go", - "types.go", - "types_pluginargs.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/kubernetes/pkg/scheduler/apis/config", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/component-base/config:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/scheduler/apis/config/scheme:all-srcs", - "//pkg/scheduler/apis/config/testing:all-srcs", - "//pkg/scheduler/apis/config/v1:all-srcs", - "//pkg/scheduler/apis/config/v1beta1:all-srcs", - "//pkg/scheduler/apis/config/validation:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["types_test.go"], - embed = [":go_default_library"], - deps = ["//vendor/github.com/google/go-cmp/cmp:go_default_library"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/scheduler/apis/config/types.go b/vendor/k8s.io/kubernetes/pkg/scheduler/apis/config/types.go index 13c1e60037c8..531f20d153ca 100644 --- a/vendor/k8s.io/kubernetes/pkg/scheduler/apis/config/types.go +++ b/vendor/k8s.io/kubernetes/pkg/scheduler/apis/config/types.go @@ -26,12 +26,6 @@ import ( ) const ( - // SchedulerDefaultLockObjectNamespace defines default scheduler lock object namespace ("kube-system") - SchedulerDefaultLockObjectNamespace string = metav1.NamespaceSystem - - // SchedulerDefaultLockObjectName defines default scheduler lock object name ("kube-scheduler") - SchedulerDefaultLockObjectName = "kube-scheduler" - // SchedulerPolicyConfigMapKey defines the key of the element in the // scheduler's policy ConfigMap that contains scheduler's policy config. SchedulerPolicyConfigMapKey = "policy.cfg" @@ -175,39 +169,39 @@ type SchedulerPolicyConfigMapSource struct { // be invoked before default plugins, default plugins must be disabled and re-enabled here in desired order. type Plugins struct { // QueueSort is a list of plugins that should be invoked when sorting pods in the scheduling queue. - QueueSort *PluginSet + QueueSort PluginSet // PreFilter is a list of plugins that should be invoked at "PreFilter" extension point of the scheduling framework. - PreFilter *PluginSet + PreFilter PluginSet // Filter is a list of plugins that should be invoked when filtering out nodes that cannot run the Pod. - Filter *PluginSet + Filter PluginSet // PostFilter is a list of plugins that are invoked after filtering phase, no matter whether filtering succeeds or not. - PostFilter *PluginSet + PostFilter PluginSet // PreScore is a list of plugins that are invoked before scoring. - PreScore *PluginSet + PreScore PluginSet // Score is a list of plugins that should be invoked when ranking nodes that have passed the filtering phase. - Score *PluginSet + Score PluginSet // Reserve is a list of plugins invoked when reserving/unreserving resources // after a node is assigned to run the pod. - Reserve *PluginSet + Reserve PluginSet // Permit is a list of plugins that control binding of a Pod. These plugins can prevent or delay binding of a Pod. - Permit *PluginSet + Permit PluginSet // PreBind is a list of plugins that should be invoked before a pod is bound. - PreBind *PluginSet + PreBind PluginSet // Bind is a list of plugins that should be invoked at "Bind" extension point of the scheduling framework. // The scheduler call these plugins in order. Scheduler skips the rest of these plugins as soon as one returns success. - Bind *PluginSet + Bind PluginSet // PostBind is a list of plugins that should be invoked after a pod is successfully bound. - PostBind *PluginSet + PostBind PluginSet } // PluginSet specifies enabled and disabled plugins for an extension point. @@ -258,14 +252,9 @@ const ( MaxWeight = MaxTotalScore / MaxCustomPriorityScore ) -func appendPluginSet(dst *PluginSet, src *PluginSet) *PluginSet { - if dst == nil { - dst = &PluginSet{} - } - if src != nil { - dst.Enabled = append(dst.Enabled, src.Enabled...) - dst.Disabled = append(dst.Disabled, src.Disabled...) - } +func appendPluginSet(dst PluginSet, src PluginSet) PluginSet { + dst.Enabled = append(dst.Enabled, src.Enabled...) + dst.Disabled = append(dst.Disabled, src.Disabled...) return dst } @@ -307,21 +296,14 @@ func (p *Plugins) Apply(customPlugins *Plugins) { p.PostBind = mergePluginSets(p.PostBind, customPlugins.PostBind) } -func mergePluginSets(defaultPluginSet, customPluginSet *PluginSet) *PluginSet { - if customPluginSet == nil { - customPluginSet = &PluginSet{} - } - - if defaultPluginSet == nil { - defaultPluginSet = &PluginSet{} - } +func mergePluginSets(defaultPluginSet, customPluginSet PluginSet) PluginSet { disabledPlugins := sets.NewString() for _, disabledPlugin := range customPluginSet.Disabled { disabledPlugins.Insert(disabledPlugin.Name) } - enabledPlugins := []Plugin{} + var enabledPlugins []Plugin if !disabledPlugins.Has("*") { for _, defaultEnabledPlugin := range defaultPluginSet.Enabled { if disabledPlugins.Has(defaultEnabledPlugin.Name) { @@ -334,7 +316,7 @@ func mergePluginSets(defaultPluginSet, customPluginSet *PluginSet) *PluginSet { enabledPlugins = append(enabledPlugins, customPluginSet.Enabled...) - return &PluginSet{Enabled: enabledPlugins} + return PluginSet{Enabled: enabledPlugins} } // Extender holds the parameters used to communicate with the extender. If a verb is unspecified/empty, diff --git a/vendor/k8s.io/kubernetes/pkg/scheduler/apis/config/validation/BUILD b/vendor/k8s.io/kubernetes/pkg/scheduler/apis/config/validation/BUILD deleted file mode 100644 index 02c2eaa18029..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/scheduler/apis/config/validation/BUILD +++ /dev/null @@ -1,56 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "validation.go", - "validation_pluginargs.go", - ], - importpath = "k8s.io/kubernetes/pkg/scheduler/apis/config/validation", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/core/v1/helper:go_default_library", - "//pkg/scheduler/apis/config:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/component-base/config/validation:go_default_library", - "//staging/src/k8s.io/component-helpers/scheduling/corev1/nodeaffinity:go_default_library", - "//vendor/github.com/google/go-cmp/cmp:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "validation_pluginargs_test.go", - "validation_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/scheduler/apis/config:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/component-base/config:go_default_library", - "//vendor/github.com/google/go-cmp/cmp:go_default_library", - "//vendor/github.com/google/go-cmp/cmp/cmpopts:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/scheduler/apis/config/validation/validation.go b/vendor/k8s.io/kubernetes/pkg/scheduler/apis/config/validation/validation.go index c50913a701fd..759d66e5f702 100644 --- a/vendor/k8s.io/kubernetes/pkg/scheduler/apis/config/validation/validation.go +++ b/vendor/k8s.io/kubernetes/pkg/scheduler/apis/config/validation/validation.go @@ -90,12 +90,12 @@ func validateKubeSchedulerProfile(path *field.Path, profile *config.KubeSchedule func validateCommonQueueSort(path *field.Path, profiles []config.KubeSchedulerProfile) field.ErrorList { allErrs := field.ErrorList{} - var canon *config.PluginSet + var canon config.PluginSet if profiles[0].Plugins != nil { canon = profiles[0].Plugins.QueueSort } for i := 1; i < len(profiles); i++ { - var curr *config.PluginSet + var curr config.PluginSet if profiles[i].Plugins != nil { curr = profiles[i].Plugins.QueueSort } diff --git a/vendor/k8s.io/kubernetes/pkg/scheduler/apis/config/validation/validation_pluginargs.go b/vendor/k8s.io/kubernetes/pkg/scheduler/apis/config/validation/validation_pluginargs.go index b60765b6c92f..182f616bf102 100644 --- a/vendor/k8s.io/kubernetes/pkg/scheduler/apis/config/validation/validation_pluginargs.go +++ b/vendor/k8s.io/kubernetes/pkg/scheduler/apis/config/validation/validation_pluginargs.go @@ -21,6 +21,7 @@ import ( v1 "k8s.io/api/core/v1" metav1validation "k8s.io/apimachinery/pkg/apis/meta/v1/validation" + "k8s.io/apimachinery/pkg/util/errors" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/validation/field" "k8s.io/component-helpers/scheduling/corev1/nodeaffinity" @@ -29,39 +30,46 @@ import ( // ValidateDefaultPreemptionArgs validates that DefaultPreemptionArgs are correct. func ValidateDefaultPreemptionArgs(args config.DefaultPreemptionArgs) error { - if err := validateMinCandidateNodesPercentage(args.MinCandidateNodesPercentage); err != nil { - return err + var path *field.Path + var allErrs field.ErrorList + percentagePath := path.Child("minCandidateNodesPercentage") + absolutePath := path.Child("minCandidateNodesAbsolute") + if err := validateMinCandidateNodesPercentage(args.MinCandidateNodesPercentage, percentagePath); err != nil { + allErrs = append(allErrs, err) } - if err := validateMinCandidateNodesAbsolute(args.MinCandidateNodesAbsolute); err != nil { - return err + if err := validateMinCandidateNodesAbsolute(args.MinCandidateNodesAbsolute, absolutePath); err != nil { + allErrs = append(allErrs, err) } if args.MinCandidateNodesPercentage == 0 && args.MinCandidateNodesAbsolute == 0 { - return fmt.Errorf("both minCandidateNodesPercentage and minCandidateNodesAbsolute cannot be zero") + allErrs = append(allErrs, + field.Invalid(percentagePath, args.MinCandidateNodesPercentage, "cannot be zero at the same time as minCandidateNodesAbsolute"), + field.Invalid(absolutePath, args.MinCandidateNodesAbsolute, "cannot be zero at the same time as minCandidateNodesPercentage")) } - return nil + return allErrs.ToAggregate() } // validateMinCandidateNodesPercentage validates that // minCandidateNodesPercentage is within the allowed range. -func validateMinCandidateNodesPercentage(minCandidateNodesPercentage int32) error { +func validateMinCandidateNodesPercentage(minCandidateNodesPercentage int32, p *field.Path) *field.Error { if minCandidateNodesPercentage < 0 || minCandidateNodesPercentage > 100 { - return fmt.Errorf("minCandidateNodesPercentage is not in the range [0, 100]") + return field.Invalid(p, minCandidateNodesPercentage, "not in valid range [0, 100]") } return nil } // validateMinCandidateNodesAbsolute validates that minCandidateNodesAbsolute // is within the allowed range. -func validateMinCandidateNodesAbsolute(minCandidateNodesAbsolute int32) error { +func validateMinCandidateNodesAbsolute(minCandidateNodesAbsolute int32, p *field.Path) *field.Error { if minCandidateNodesAbsolute < 0 { - return fmt.Errorf("minCandidateNodesAbsolute is not in the range [0, inf)") + return field.Invalid(p, minCandidateNodesAbsolute, "not in valid range [0, inf)") } return nil } // ValidateInterPodAffinityArgs validates that InterPodAffinityArgs are correct. func ValidateInterPodAffinityArgs(args config.InterPodAffinityArgs) error { - return ValidateHardPodAffinityWeight(field.NewPath("hardPodAffinityWeight"), args.HardPodAffinityWeight) + var path *field.Path + return ValidateHardPodAffinityWeight(path.Child("hardPodAffinityWeight"), args.HardPodAffinityWeight) } // ValidateHardPodAffinityWeight validates that weight is within allowed range. @@ -72,7 +80,7 @@ func ValidateHardPodAffinityWeight(path *field.Path, w int32) error { ) if w < minHardPodAffinityWeight || w > maxHardPodAffinityWeight { - msg := fmt.Sprintf("not in valid range [%d-%d]", minHardPodAffinityWeight, maxHardPodAffinityWeight) + msg := fmt.Sprintf("not in valid range [%d, %d]", minHardPodAffinityWeight, maxHardPodAffinityWeight) return field.Invalid(path, w, msg) } return nil @@ -80,44 +88,50 @@ func ValidateHardPodAffinityWeight(path *field.Path, w int32) error { // ValidateNodeLabelArgs validates that NodeLabelArgs are correct. func ValidateNodeLabelArgs(args config.NodeLabelArgs) error { - if err := validateNoConflict(args.PresentLabels, args.AbsentLabels); err != nil { - return err - } - if err := validateNoConflict(args.PresentLabelsPreference, args.AbsentLabelsPreference); err != nil { - return err - } - return nil + var path *field.Path + var allErrs field.ErrorList + + allErrs = append(allErrs, validateNoConflict(args.PresentLabels, args.AbsentLabels, + path.Child("presentLabels"), path.Child("absentLabels"))...) + allErrs = append(allErrs, validateNoConflict(args.PresentLabelsPreference, args.AbsentLabelsPreference, + path.Child("presentLabelsPreference"), path.Child("absentLabelsPreference"))...) + + return allErrs.ToAggregate() } // validateNoConflict validates that presentLabels and absentLabels do not conflict. -func validateNoConflict(presentLabels []string, absentLabels []string) error { - m := make(map[string]struct{}, len(presentLabels)) - for _, l := range presentLabels { - m[l] = struct{}{} +func validateNoConflict(presentLabels, absentLabels []string, presentPath, absentPath *field.Path) field.ErrorList { + var allErrs field.ErrorList + + m := make(map[string]int, len(presentLabels)) // label -> index + for i, l := range presentLabels { + m[l] = i } - for _, l := range absentLabels { - if _, ok := m[l]; ok { - return fmt.Errorf("detecting at least one label (e.g., %q) that exist in both the present(%+v) and absent(%+v) label list", l, presentLabels, absentLabels) + for i, l := range absentLabels { + if j, ok := m[l]; ok { + allErrs = append(allErrs, field.Invalid(presentPath.Index(j), l, + fmt.Sprintf("conflict with %v", absentPath.Index(i).String()))) } } - return nil + return allErrs } // ValidatePodTopologySpreadArgs validates that PodTopologySpreadArgs are correct. // It replicates the validation from pkg/apis/core/validation.validateTopologySpreadConstraints // with an additional check for .labelSelector to be nil. func ValidatePodTopologySpreadArgs(args *config.PodTopologySpreadArgs) error { + var path *field.Path var allErrs field.ErrorList - if err := validateDefaultingType(field.NewPath("defaultingType"), args.DefaultingType, args.DefaultConstraints); err != nil { + if err := validateDefaultingType(path.Child("defaultingType"), args.DefaultingType, args.DefaultConstraints); err != nil { allErrs = append(allErrs, err) } - path := field.NewPath("defaultConstraints") + defaultConstraintsPath := path.Child("defaultConstraints") for i, c := range args.DefaultConstraints { - p := path.Index(i) + p := defaultConstraintsPath.Index(i) if c.MaxSkew <= 0 { f := p.Child("maxSkew") - allErrs = append(allErrs, field.Invalid(f, c.MaxSkew, "must be greater than zero")) + allErrs = append(allErrs, field.Invalid(f, c.MaxSkew, "not in valid range (0, inf)")) } allErrs = append(allErrs, validateTopologyKey(p.Child("topologyKey"), c.TopologyKey)...) if err := validateWhenUnsatisfiable(p.Child("whenUnsatisfiable"), c.WhenUnsatisfiable); err != nil { @@ -127,7 +141,7 @@ func ValidatePodTopologySpreadArgs(args *config.PodTopologySpreadArgs) error { f := field.Forbidden(p.Child("labelSelector"), "constraint must not define a selector, as they deduced for each pod") allErrs = append(allErrs, f) } - if err := validateConstraintNotRepeat(path, args.DefaultConstraints, i); err != nil { + if err := validateConstraintNotRepeat(defaultConstraintsPath, args.DefaultConstraints, i); err != nil { allErrs = append(allErrs, err) } } @@ -139,7 +153,7 @@ func ValidatePodTopologySpreadArgs(args *config.PodTopologySpreadArgs) error { func validateDefaultingType(p *field.Path, v config.PodTopologySpreadConstraintsDefaulting, constraints []v1.TopologySpreadConstraint) *field.Error { if v != config.SystemDefaulting && v != config.ListDefaulting { - return field.Invalid(p, v, fmt.Sprintf("must be one of {%q, %q}", config.SystemDefaulting, config.ListDefaulting)) + return field.NotSupported(p, v, []string{string(config.SystemDefaulting), string(config.ListDefaulting)}) } if v == config.SystemDefaulting && len(constraints) > 0 { return field.Invalid(p, v, "when .defaultConstraints are not empty") @@ -182,16 +196,14 @@ func validateConstraintNotRepeat(path *field.Path, constraints []v1.TopologySpre // ValidateRequestedToCapacityRatioArgs validates that RequestedToCapacityRatioArgs are correct. func ValidateRequestedToCapacityRatioArgs(args config.RequestedToCapacityRatioArgs) error { - if err := validateFunctionShape(args.Shape); err != nil { - return err - } - if err := validateResourcesNoMax(args.Resources); err != nil { - return err - } - return nil + var path *field.Path + var allErrs field.ErrorList + allErrs = append(allErrs, validateFunctionShape(args.Shape, path.Child("shape"))...) + allErrs = append(allErrs, validateResourcesNoMax(args.Resources, path.Child("resources"))...) + return allErrs.ToAggregate() } -func validateFunctionShape(shape []config.UtilizationShapePoint) error { +func validateFunctionShape(shape []config.UtilizationShapePoint, path *field.Path) field.ErrorList { const ( minUtilization = 0 maxUtilization = 100 @@ -199,64 +211,68 @@ func validateFunctionShape(shape []config.UtilizationShapePoint) error { maxScore = int32(config.MaxCustomPriorityScore) ) + var allErrs field.ErrorList + if len(shape) == 0 { - return fmt.Errorf("at least one point must be specified") + allErrs = append(allErrs, field.Required(path, "at least one point must be specified")) + return allErrs } for i := 1; i < len(shape); i++ { if shape[i-1].Utilization >= shape[i].Utilization { - return fmt.Errorf("utilization values must be sorted. Utilization[%d]==%d >= Utilization[%d]==%d", i-1, shape[i-1].Utilization, i, shape[i].Utilization) + allErrs = append(allErrs, field.Invalid(path.Index(i).Child("utilization"), shape[i].Utilization, "utilization values must be sorted in increasing order")) + break } } for i, point := range shape { - if point.Utilization < minUtilization { - return fmt.Errorf("utilization values must not be less than %d. Utilization[%d]==%d", minUtilization, i, point.Utilization) - } - if point.Utilization > maxUtilization { - return fmt.Errorf("utilization values must not be greater than %d. Utilization[%d]==%d", maxUtilization, i, point.Utilization) + if point.Utilization < minUtilization || point.Utilization > maxUtilization { + msg := fmt.Sprintf("not in valid range [%d, %d]", minUtilization, maxUtilization) + allErrs = append(allErrs, field.Invalid(path.Index(i).Child("utilization"), point.Utilization, msg)) } - if point.Score < minScore { - return fmt.Errorf("score values must not be less than %d. Score[%d]==%d", minScore, i, point.Score) - } - if point.Score > maxScore { - return fmt.Errorf("score values must not be greater than %d. Score[%d]==%d", maxScore, i, point.Score) + + if point.Score < minScore || point.Score > maxScore { + msg := fmt.Sprintf("not in valid range [%d, %d]", minScore, maxScore) + allErrs = append(allErrs, field.Invalid(path.Index(i).Child("score"), point.Score, msg)) } } - return nil + return allErrs } // TODO potentially replace with validateResources -func validateResourcesNoMax(resources []config.ResourceSpec) error { - for _, r := range resources { +func validateResourcesNoMax(resources []config.ResourceSpec, p *field.Path) field.ErrorList { + var allErrs field.ErrorList + for i, r := range resources { if r.Weight < 1 { - return fmt.Errorf("resource %s weight %d must not be less than 1", string(r.Name), r.Weight) + allErrs = append(allErrs, field.Invalid(p.Index(i).Child("weight"), r.Weight, + fmt.Sprintf("resource weight of %s not in valid range [1, inf)", r.Name))) } } - return nil + return allErrs } // ValidateNodeResourcesLeastAllocatedArgs validates that NodeResourcesLeastAllocatedArgs are correct. func ValidateNodeResourcesLeastAllocatedArgs(args *config.NodeResourcesLeastAllocatedArgs) error { - return validateResources(args.Resources) + var path *field.Path + return validateResources(args.Resources, path.Child("resources")).ToAggregate() } // ValidateNodeResourcesMostAllocatedArgs validates that NodeResourcesMostAllocatedArgs are correct. func ValidateNodeResourcesMostAllocatedArgs(args *config.NodeResourcesMostAllocatedArgs) error { - return validateResources(args.Resources) + var path *field.Path + return validateResources(args.Resources, path.Child("resources")).ToAggregate() } -func validateResources(resources []config.ResourceSpec) error { - for _, resource := range resources { - if resource.Weight <= 0 { - return fmt.Errorf("resource Weight of %v should be a positive value, got %v", resource.Name, resource.Weight) - } - if resource.Weight > 100 { - return fmt.Errorf("resource Weight of %v should be less than 100, got %v", resource.Name, resource.Weight) +func validateResources(resources []config.ResourceSpec, p *field.Path) field.ErrorList { + var allErrs field.ErrorList + for i, resource := range resources { + if resource.Weight <= 0 || resource.Weight > 100 { + msg := fmt.Sprintf("resource weight of %v not in valid range (0, 100]", resource.Name) + allErrs = append(allErrs, field.Invalid(p.Index(i).Child("weight"), resource.Weight, msg)) } } - return nil + return allErrs } // ValidateNodeAffinityArgs validates that NodeAffinityArgs are correct. @@ -265,22 +281,32 @@ func ValidateNodeAffinityArgs(args *config.NodeAffinityArgs) error { return nil } affinity := args.AddedAffinity - f := field.NewPath("addedAffinity") - var allErrs field.ErrorList + path := field.NewPath("addedAffinity") + var errs []error if ns := affinity.RequiredDuringSchedulingIgnoredDuringExecution; ns != nil { - _, err := nodeaffinity.NewNodeSelector(ns) + _, err := nodeaffinity.NewNodeSelector(ns, field.WithPath(path.Child("requiredDuringSchedulingIgnoredDuringExecution"))) if err != nil { - // TODO(#96167): Expand all field.Error(s) returned once constructor use them. - allErrs = append(allErrs, field.Invalid(f.Child("requiredDuringSchedulingIgnoredDuringExecution"), affinity.RequiredDuringSchedulingIgnoredDuringExecution, err.Error())) + errs = append(errs, err) } } // TODO: Add validation for requiredDuringSchedulingRequiredDuringExecution when it gets added to the API. if terms := affinity.PreferredDuringSchedulingIgnoredDuringExecution; len(terms) != 0 { - _, err := nodeaffinity.NewPreferredSchedulingTerms(terms) + _, err := nodeaffinity.NewPreferredSchedulingTerms(terms, field.WithPath(path.Child("preferredDuringSchedulingIgnoredDuringExecution"))) if err != nil { - // TODO(#96167): Expand all field.Error(s) returned once constructor use them. - allErrs = append(allErrs, field.Invalid(f.Child("preferredDuringSchedulingIgnoredDuringExecution"), affinity.PreferredDuringSchedulingIgnoredDuringExecution, err.Error())) + errs = append(errs, err) } } - return allErrs.ToAggregate() + return errors.Flatten(errors.NewAggregate(errs)) +} + +// ValidateVolumeBindingArgs validates that VolumeBindingArgs are set correctly. +func ValidateVolumeBindingArgs(args *config.VolumeBindingArgs) error { + var path *field.Path + var err error + + if args.BindTimeoutSeconds < 0 { + err = field.Invalid(path.Child("bindTimeoutSeconds"), args.BindTimeoutSeconds, "invalid BindTimeoutSeconds, should not be a negative value") + } + + return err } diff --git a/vendor/k8s.io/kubernetes/pkg/scheduler/apis/config/zz_generated.deepcopy.go b/vendor/k8s.io/kubernetes/pkg/scheduler/apis/config/zz_generated.deepcopy.go index bc205cfed59c..b4ca51e5e45d 100644 --- a/vendor/k8s.io/kubernetes/pkg/scheduler/apis/config/zz_generated.deepcopy.go +++ b/vendor/k8s.io/kubernetes/pkg/scheduler/apis/config/zz_generated.deepcopy.go @@ -491,61 +491,17 @@ func (in *PluginSet) DeepCopy() *PluginSet { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Plugins) DeepCopyInto(out *Plugins) { *out = *in - if in.QueueSort != nil { - in, out := &in.QueueSort, &out.QueueSort - *out = new(PluginSet) - (*in).DeepCopyInto(*out) - } - if in.PreFilter != nil { - in, out := &in.PreFilter, &out.PreFilter - *out = new(PluginSet) - (*in).DeepCopyInto(*out) - } - if in.Filter != nil { - in, out := &in.Filter, &out.Filter - *out = new(PluginSet) - (*in).DeepCopyInto(*out) - } - if in.PostFilter != nil { - in, out := &in.PostFilter, &out.PostFilter - *out = new(PluginSet) - (*in).DeepCopyInto(*out) - } - if in.PreScore != nil { - in, out := &in.PreScore, &out.PreScore - *out = new(PluginSet) - (*in).DeepCopyInto(*out) - } - if in.Score != nil { - in, out := &in.Score, &out.Score - *out = new(PluginSet) - (*in).DeepCopyInto(*out) - } - if in.Reserve != nil { - in, out := &in.Reserve, &out.Reserve - *out = new(PluginSet) - (*in).DeepCopyInto(*out) - } - if in.Permit != nil { - in, out := &in.Permit, &out.Permit - *out = new(PluginSet) - (*in).DeepCopyInto(*out) - } - if in.PreBind != nil { - in, out := &in.PreBind, &out.PreBind - *out = new(PluginSet) - (*in).DeepCopyInto(*out) - } - if in.Bind != nil { - in, out := &in.Bind, &out.Bind - *out = new(PluginSet) - (*in).DeepCopyInto(*out) - } - if in.PostBind != nil { - in, out := &in.PostBind, &out.PostBind - *out = new(PluginSet) - (*in).DeepCopyInto(*out) - } + in.QueueSort.DeepCopyInto(&out.QueueSort) + in.PreFilter.DeepCopyInto(&out.PreFilter) + in.Filter.DeepCopyInto(&out.Filter) + in.PostFilter.DeepCopyInto(&out.PostFilter) + in.PreScore.DeepCopyInto(&out.PreScore) + in.Score.DeepCopyInto(&out.Score) + in.Reserve.DeepCopyInto(&out.Reserve) + in.Permit.DeepCopyInto(&out.Permit) + in.PreBind.DeepCopyInto(&out.PreBind) + in.Bind.DeepCopyInto(&out.Bind) + in.PostBind.DeepCopyInto(&out.PostBind) return } diff --git a/vendor/k8s.io/kubernetes/pkg/scheduler/framework/BUILD b/vendor/k8s.io/kubernetes/pkg/scheduler/framework/BUILD deleted file mode 100644 index af8bc8b75a51..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/scheduler/framework/BUILD +++ /dev/null @@ -1,67 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "cycle_state.go", - "extender.go", - "interface.go", - "listers.go", - "types.go", - ], - importpath = "k8s.io/kubernetes/pkg/scheduler/framework", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/core/v1/helper:go_default_library", - "//pkg/features:go_default_library", - "//pkg/scheduler/apis/config:go_default_library", - "//pkg/scheduler/util:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/tools/events:go_default_library", - "//staging/src/k8s.io/kube-scheduler/extender/v1:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/scheduler/framework/fake:all-srcs", - "//pkg/scheduler/framework/plugins:all-srcs", - "//pkg/scheduler/framework/runtime:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = [ - "cycle_state_test.go", - "interface_test.go", - "types_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/scheduler/framework/cycle_state.go b/vendor/k8s.io/kubernetes/pkg/scheduler/framework/cycle_state.go index 85e5a6c0169e..fd7f5543d8cc 100644 --- a/vendor/k8s.io/kubernetes/pkg/scheduler/framework/cycle_state.go +++ b/vendor/k8s.io/kubernetes/pkg/scheduler/framework/cycle_state.go @@ -21,9 +21,9 @@ import ( "sync" ) -const ( - // NotFound is the not found error message. - NotFound = "not found" +var ( + // ErrNotFound is the not found error message. + ErrNotFound = errors.New("not found") ) // StateData is a generic type for arbitrary data stored in CycleState. @@ -92,7 +92,7 @@ func (c *CycleState) Read(key StateKey) (StateData, error) { if v, ok := c.storage[key]; ok { return v, nil } - return nil, errors.New(NotFound) + return nil, ErrNotFound } // Write stores the given "val" in CycleState with the given "key". diff --git a/vendor/k8s.io/kubernetes/pkg/scheduler/framework/extender.go b/vendor/k8s.io/kubernetes/pkg/scheduler/framework/extender.go index 1dbc14b7a101..d47c89bf1e40 100644 --- a/vendor/k8s.io/kubernetes/pkg/scheduler/framework/extender.go +++ b/vendor/k8s.io/kubernetes/pkg/scheduler/framework/extender.go @@ -29,9 +29,11 @@ type Extender interface { Name() string // Filter based on extender-implemented predicate functions. The filtered list is - // expected to be a subset of the supplied list. failedNodesMap optionally contains - // the list of failed nodes and failure reasons. - Filter(pod *v1.Pod, nodes []*v1.Node) (filteredNodes []*v1.Node, failedNodesMap extenderv1.FailedNodesMap, err error) + // expected to be a subset of the supplied list. + // The failedNodes and failedAndUnresolvableNodes optionally contains the list + // of failed nodes and failure reasons, except nodes in the latter are + // unresolvable. + Filter(pod *v1.Pod, nodes []*v1.Node) (filteredNodes []*v1.Node, failedNodesMap extenderv1.FailedNodesMap, failedAndUnresolvable extenderv1.FailedNodesMap, err error) // Prioritize based on extender-implemented priority functions. The returned scores & weight // are used to compute the weighted score for an extender. The weighted scores are added to diff --git a/vendor/k8s.io/kubernetes/pkg/scheduler/framework/interface.go b/vendor/k8s.io/kubernetes/pkg/scheduler/framework/interface.go index a0ab27c719e9..87f5d8b84386 100644 --- a/vendor/k8s.io/kubernetes/pkg/scheduler/framework/interface.go +++ b/vendor/k8s.io/kubernetes/pkg/scheduler/framework/interface.go @@ -25,12 +25,15 @@ import ( "strings" "time" + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/informers" clientset "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/events" "k8s.io/kubernetes/pkg/scheduler/apis/config" + "k8s.io/kubernetes/pkg/scheduler/internal/parallelize" ) // NodeScoreList declares a list of nodes and their scores. @@ -63,7 +66,7 @@ const ( // scheduler skip preemption. // The accompanying status message should explain why the pod is unschedulable. Unschedulable - // UnschedulableAndUnresolvable is used when a PreFilter plugin finds a pod unschedulable and + // UnschedulableAndUnresolvable is used when a plugin finds a pod unschedulable and // preemption would not change anything. Plugins should return Unschedulable if it is possible // that the pod can get scheduled with preemption. // The accompanying status message should explain why the pod is unschedulable. @@ -77,6 +80,15 @@ const ( // This list should be exactly the same as the codes iota defined above in the same order. var codes = []string{"Success", "Error", "Unschedulable", "UnschedulableAndUnresolvable", "Wait", "Skip"} +// statusPrecedence defines a map from status to its precedence, larger value means higher precedent. +var statusPrecedence = map[Code]int{ + Error: 3, + UnschedulableAndUnresolvable: 2, + Unschedulable: 1, + // Any other statuses we know today, `Skip` or `Wait`, will take precedence over `Success`. + Success: -1, +} + func (c Code) String() string { return codes[c] } @@ -93,13 +105,16 @@ const ( ) // Status indicates the result of running a plugin. It consists of a code, a -// message and (optionally) an error. When the status code is not `Success`, -// the reasons should explain why. +// message, (optionally) an error and an plugin name it fails by. When the status +// code is not `Success`, the reasons should explain why. // NOTE: A nil Status is also considered as Success. type Status struct { code Code reasons []string err error + // failedPlugin is an optional field that records the plugin name a Pod failed by. + // It's set by the framework when code is Error, Unschedulable or UnschedulableAndUnresolvable. + failedPlugin string } // Code returns code of the Status. @@ -118,6 +133,23 @@ func (s *Status) Message() string { return strings.Join(s.reasons, ", ") } +// SetFailedPlugin sets the given plugin name to s.failedPlugin. +func (s *Status) SetFailedPlugin(plugin string) { + s.failedPlugin = plugin +} + +// WithFailedPlugin sets the given plugin name to s.failedPlugin, +// and returns the given status object. +func (s *Status) WithFailedPlugin(plugin string) *Status { + s.SetFailedPlugin(plugin) + return s +} + +// FailedPlugin returns the failed plugin name. +func (s *Status) FailedPlugin() string { + return s.failedPlugin +} + // Reasons returns reasons of the Status. func (s *Status) Reasons() []string { return s.reasons @@ -151,6 +183,21 @@ func (s *Status) AsError() error { return errors.New(s.Message()) } +// Equal checks equality of two statuses. This is useful for testing with +// cmp.Equal. +func (s *Status) Equal(x *Status) bool { + if s == nil || x == nil { + return s.IsSuccess() && x.IsSuccess() + } + if s.code != x.code { + return false + } + if s.code == Error { + return cmp.Equal(s.err, x.err, cmpopts.EquateErrors()) + } + return cmp.Equal(s.reasons, x.reasons) +} + // NewStatus makes a Status out of the given arguments and returns its pointer. func NewStatus(code Code, reasons ...string) *Status { s := &Status{ @@ -184,28 +231,21 @@ func (p PluginToStatus) Merge() *Status { } finalStatus := NewStatus(Success) - var hasUnschedulableAndUnresolvable, hasUnschedulable bool for _, s := range p { if s.Code() == Error { finalStatus.err = s.AsError() - } else if s.Code() == UnschedulableAndUnresolvable { - hasUnschedulableAndUnresolvable = true - } else if s.Code() == Unschedulable { - hasUnschedulable = true } - finalStatus.code = s.Code() + if statusPrecedence[s.Code()] > statusPrecedence[finalStatus.code] { + finalStatus.code = s.Code() + // Same as code, we keep the most relevant failedPlugin in the returned Status. + finalStatus.failedPlugin = s.FailedPlugin() + } + for _, r := range s.reasons { finalStatus.AppendReason(r) } } - if finalStatus.err != nil { - finalStatus.code = Error - } else if hasUnschedulableAndUnresolvable { - finalStatus.code = UnschedulableAndUnresolvable - } else if hasUnschedulable { - finalStatus.code = Unschedulable - } return finalStatus } @@ -220,7 +260,7 @@ type WaitingPod interface { // to unblock the pod. Allow(pluginName string) // Reject declares the waiting pod unschedulable. - Reject(msg string) + Reject(pluginName, msg string) } // Plugin is the parent type for all the scheduling framework plugins. @@ -240,16 +280,26 @@ type QueueSortPlugin interface { Less(*QueuedPodInfo, *QueuedPodInfo) bool } +// EnqueueExtensions is an optional interface that plugins can implement to efficiently +// move unschedulable Pods in internal scheduling queues. +type EnqueueExtensions interface { + // EventsToRegister returns a series of interested events that + // will be registered when instantiating the internal scheduling queue. + // Note: the returned list needs to be static (not depend on configuration parameters); + // otherwise it would lead to undefined behavior. + EventsToRegister() []ClusterEvent +} + // PreFilterExtensions is an interface that is included in plugins that allow specifying // callbacks to make incremental updates to its supposedly pre-calculated // state. type PreFilterExtensions interface { // AddPod is called by the framework while trying to evaluate the impact // of adding podToAdd to the node while scheduling podToSchedule. - AddPod(ctx context.Context, state *CycleState, podToSchedule *v1.Pod, podToAdd *v1.Pod, nodeInfo *NodeInfo) *Status + AddPod(ctx context.Context, state *CycleState, podToSchedule *v1.Pod, podInfoToAdd *PodInfo, nodeInfo *NodeInfo) *Status // RemovePod is called by the framework while trying to evaluate the impact // of removing podToRemove from the node while scheduling podToSchedule. - RemovePod(ctx context.Context, state *CycleState, podToSchedule *v1.Pod, podToRemove *v1.Pod, nodeInfo *NodeInfo) *Status + RemovePod(ctx context.Context, state *CycleState, podToSchedule *v1.Pod, podInfoToRemove *PodInfo, nodeInfo *NodeInfo) *Status } // PreFilterPlugin is an interface that must be implemented by "PreFilter" plugins. @@ -438,12 +488,12 @@ type Framework interface { // RunPreFilterExtensionAddPod calls the AddPod interface for the set of configured // PreFilter plugins. It returns directly if any of the plugins return any // status other than Success. - RunPreFilterExtensionAddPod(ctx context.Context, state *CycleState, podToSchedule *v1.Pod, podToAdd *v1.Pod, nodeInfo *NodeInfo) *Status + RunPreFilterExtensionAddPod(ctx context.Context, state *CycleState, podToSchedule *v1.Pod, podInfoToAdd *PodInfo, nodeInfo *NodeInfo) *Status // RunPreFilterExtensionRemovePod calls the RemovePod interface for the set of configured // PreFilter plugins. It returns directly if any of the plugins return any // status other than Success. - RunPreFilterExtensionRemovePod(ctx context.Context, state *CycleState, podToSchedule *v1.Pod, podToAdd *v1.Pod, nodeInfo *NodeInfo) *Status + RunPreFilterExtensionRemovePod(ctx context.Context, state *CycleState, podToSchedule *v1.Pod, podInfoToRemove *PodInfo, nodeInfo *NodeInfo) *Status // RunPreScorePlugins runs the set of configured PreScore plugins. If any // of these plugins returns any status other than "Success", the given pod is rejected. @@ -513,6 +563,10 @@ type Framework interface { // passed to the plugin factories at the time of plugin initialization. Plugins // must store and use this handle to call framework functions. type Handle interface { + // PodNominator abstracts operations to maintain nominated Pods. + PodNominator + // PluginsRunner abstracts operations to run some plugins. + PluginsRunner // SnapshotSharedLister returns listers from the latest NodeInfo Snapshot. The snapshot // is taken at the beginning of a scheduling cycle and remains unchanged until // a pod finishes "Permit" point. There is no guarantee that the information @@ -539,8 +593,14 @@ type Handle interface { SharedInformerFactory() informers.SharedInformerFactory - // TODO: unroll the wrapped interfaces to Handle. - PreemptHandle() PreemptHandle + // RunFilterPluginsWithNominatedPods runs the set of configured filter plugins for nominated pod on the given node. + RunFilterPluginsWithNominatedPods(ctx context.Context, state *CycleState, pod *v1.Pod, info *NodeInfo) *Status + + // Extenders returns registered scheduler extenders. + Extenders() []Extender + + // Parallelizer returns a parallelizer holding parallelism for scheduler. + Parallelizer() parallelize.Parallelizer } // PostFilterResult wraps needed info for scheduler framework to act upon PostFilter phase. @@ -548,27 +608,17 @@ type PostFilterResult struct { NominatedNodeName string } -// PreemptHandle incorporates all needed logic to run preemption logic. -type PreemptHandle interface { - // PodNominator abstracts operations to maintain nominated Pods. - PodNominator - // PluginsRunner abstracts operations to run some plugins. - PluginsRunner - // Extenders returns registered scheduler extenders. - Extenders() []Extender -} - // PodNominator abstracts operations to maintain nominated Pods. type PodNominator interface { // AddNominatedPod adds the given pod to the nominated pod map or // updates it if it already exists. - AddNominatedPod(pod *v1.Pod, nodeName string) + AddNominatedPod(pod *PodInfo, nodeName string) // DeleteNominatedPodIfExists deletes nominatedPod from internal cache. It's a no-op if it doesn't exist. DeleteNominatedPodIfExists(pod *v1.Pod) // UpdateNominatedPod updates the with . - UpdateNominatedPod(oldPod, newPod *v1.Pod) + UpdateNominatedPod(oldPod *v1.Pod, newPodInfo *PodInfo) // NominatedPodsForNode returns nominatedPods on the given node. - NominatedPodsForNode(nodeName string) []*v1.Pod + NominatedPodsForNode(nodeName string) []*PodInfo } // PluginsRunner abstracts operations to run some plugins. @@ -582,7 +632,7 @@ type PluginsRunner interface { // RunFilterPlugins runs the set of configured filter plugins for pod on the given node. RunFilterPlugins(context.Context, *CycleState, *v1.Pod, *NodeInfo) PluginToStatus // RunPreFilterExtensionAddPod calls the AddPod interface for the set of configured PreFilter plugins. - RunPreFilterExtensionAddPod(ctx context.Context, state *CycleState, podToSchedule *v1.Pod, podToAdd *v1.Pod, nodeInfo *NodeInfo) *Status + RunPreFilterExtensionAddPod(ctx context.Context, state *CycleState, podToSchedule *v1.Pod, podInfoToAdd *PodInfo, nodeInfo *NodeInfo) *Status // RunPreFilterExtensionRemovePod calls the RemovePod interface for the set of configured PreFilter plugins. - RunPreFilterExtensionRemovePod(ctx context.Context, state *CycleState, podToSchedule *v1.Pod, podToRemove *v1.Pod, nodeInfo *NodeInfo) *Status + RunPreFilterExtensionRemovePod(ctx context.Context, state *CycleState, podToSchedule *v1.Pod, podInfoToRemove *PodInfo, nodeInfo *NodeInfo) *Status } diff --git a/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/helper/BUILD b/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/helper/BUILD deleted file mode 100644 index 7a99d65d061a..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/helper/BUILD +++ /dev/null @@ -1,53 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "node_affinity.go", - "normalize_score.go", - "spread.go", - ], - importpath = "k8s.io/kubernetes/pkg/scheduler/framework/plugins/helper", - visibility = ["//visibility:public"], - deps = [ - "//pkg/scheduler/framework:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/client-go/listers/apps/v1:go_default_library", - "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", - "//staging/src/k8s.io/component-helpers/scheduling/corev1:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "node_affinity_test.go", - "normalize_score_test.go", - "spread_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/scheduler/framework:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/helper/node_affinity.go b/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/helper/node_affinity.go index 0f6046b83bae..29380e7dd11f 100644 --- a/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/helper/node_affinity.go +++ b/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/helper/node_affinity.go @@ -65,7 +65,6 @@ func NodeMatchesNodeAffinity(affinity *v1.NodeAffinity, node *v1.Node) bool { // nodeMatchesNodeSelector checks if a node's labels satisfy a list of node selector terms, // terms are ORed, and an empty list of terms will match nothing. func nodeMatchesNodeSelector(node *v1.Node, nodeSelector *v1.NodeSelector) bool { - // TODO(#96164): parse this error earlier in the plugin so we only need to do it once per Pod. matches, _ := corev1.MatchNodeSelectorTerms(node, nodeSelector) return matches } diff --git a/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/helper/shape_score.go b/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/helper/shape_score.go new file mode 100644 index 000000000000..4da1e76f17a8 --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/helper/shape_score.go @@ -0,0 +1,51 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package helper + +// FunctionShape represents a collection of FunctionShapePoint. +type FunctionShape []FunctionShapePoint + +// FunctionShapePoint represents a shape point. +type FunctionShapePoint struct { + // Utilization is function argument. + Utilization int64 + // Score is function value. + Score int64 +} + +// BuildBrokenLinearFunction creates a function which is built using linear segments. Segments are defined via shape array. +// Shape[i].Utilization slice represents points on "Utilization" axis where different segments meet. +// Shape[i].Score represents function values at meeting points. +// +// function f(p) is defined as: +// shape[0].Score for p < f[0].Utilization +// shape[i].Score for p == shape[i].Utilization +// shape[n-1].Score for p > shape[n-1].Utilization +// and linear between points (p < shape[i].Utilization) +func BuildBrokenLinearFunction(shape FunctionShape) func(int64) int64 { + return func(p int64) int64 { + for i := 0; i < len(shape); i++ { + if p <= int64(shape[i].Utilization) { + if i == 0 { + return shape[0].Score + } + return shape[i-1].Score + (shape[i].Score-shape[i-1].Score)*(p-shape[i-1].Utilization)/(shape[i].Utilization-shape[i-1].Utilization) + } + } + return shape[len(shape)-1].Score + } +} diff --git a/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodeaffinity/BUILD b/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodeaffinity/BUILD deleted file mode 100644 index 91d3fc796e4d..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodeaffinity/BUILD +++ /dev/null @@ -1,47 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["node_affinity.go"], - importpath = "k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodeaffinity", - visibility = ["//visibility:public"], - deps = [ - "//pkg/scheduler/apis/config:go_default_library", - "//pkg/scheduler/apis/config/validation:go_default_library", - "//pkg/scheduler/framework:go_default_library", - "//pkg/scheduler/framework/plugins/helper:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/component-helpers/scheduling/corev1/nodeaffinity:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["node_affinity_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/scheduler/apis/config:go_default_library", - "//pkg/scheduler/framework:go_default_library", - "//pkg/scheduler/framework/runtime:go_default_library", - "//pkg/scheduler/internal/cache:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/github.com/google/go-cmp/cmp:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodeaffinity/node_affinity.go b/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodeaffinity/node_affinity.go index 15107ef76d35..032ba2378993 100644 --- a/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodeaffinity/node_affinity.go +++ b/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodeaffinity/node_affinity.go @@ -43,8 +43,14 @@ const ( // Name is the name of the plugin used in the plugin registry and configurations. Name = "NodeAffinity" + // preScoreStateKey is the key in CycleState to NodeAffinity pre-computed data for Scoring. + preScoreStateKey = "PreScore" + Name + + // preFilterStateKey is the key in CycleState to NodeAffinity pre-compute data for Filtering. + preFilterStateKey = "PreFilter" + Name + // ErrReasonPod is the reason for Pod's node affinity/selector not matching. - ErrReasonPod = "node(s) didn't match Pod's node affinity" + ErrReasonPod = "node(s) didn't match Pod's node affinity/selector" // errReasonEnforced is the reason for added node affinity not matching. errReasonEnforced = "node(s) didn't match scheduler-enforced node affinity" @@ -55,6 +61,27 @@ func (pl *NodeAffinity) Name() string { return Name } +type preFilterState struct { + requiredNodeSelectorAndAffinity nodeaffinity.RequiredNodeAffinity +} + +// Clone just returns the same state because it is not affected by pod additions or deletions. +func (s *preFilterState) Clone() framework.StateData { + return s +} + +// PreFilter builds and writes cycle state used by Filter. +func (pl *NodeAffinity) PreFilter(ctx context.Context, cycleState *framework.CycleState, pod *v1.Pod) *framework.Status { + state := &preFilterState{requiredNodeSelectorAndAffinity: nodeaffinity.GetRequiredNodeAffinity(pod)} + cycleState.Write(preFilterStateKey, state) + return nil +} + +// PreFilterExtensions not necessary for this plugin as state doesn't depend on pod additions or deletions. +func (pl *NodeAffinity) PreFilterExtensions() framework.PreFilterExtensions { + return nil +} + // Filter checks if the Node matches the Pod .spec.affinity.nodeAffinity and // the plugin's added affinity. func (pl *NodeAffinity) Filter(ctx context.Context, state *framework.CycleState, pod *v1.Pod, nodeInfo *framework.NodeInfo) *framework.Status { @@ -65,9 +92,47 @@ func (pl *NodeAffinity) Filter(ctx context.Context, state *framework.CycleState, if pl.addedNodeSelector != nil && !pl.addedNodeSelector.Match(node) { return framework.NewStatus(framework.UnschedulableAndUnresolvable, errReasonEnforced) } - if !pluginhelper.PodMatchesNodeSelectorAndAffinityTerms(pod, node) { + + s, err := getPreFilterState(state) + if err != nil { + // Fallback to calculate requiredNodeSelector and requiredNodeAffinity + // here when PreFilter is disabled. + s = &preFilterState{requiredNodeSelectorAndAffinity: nodeaffinity.GetRequiredNodeAffinity(pod)} + } + + // Ignore parsing errors for backwards compatibility. + match, _ := s.requiredNodeSelectorAndAffinity.Match(node) + if !match { return framework.NewStatus(framework.UnschedulableAndUnresolvable, ErrReasonPod) } + + return nil +} + +// preScoreState computed at PreScore and used at Score. +type preScoreState struct { + preferredNodeAffinity *nodeaffinity.PreferredSchedulingTerms +} + +// Clone implements the mandatory Clone interface. We don't really copy the data since +// there is no need for that. +func (s *preScoreState) Clone() framework.StateData { + return s +} + +// PreScore builds and writes cycle state used by Score and NormalizeScore. +func (pl *NodeAffinity) PreScore(ctx context.Context, cycleState *framework.CycleState, pod *v1.Pod, nodes []*v1.Node) *framework.Status { + if len(nodes) == 0 { + return nil + } + preferredNodeAffinity, err := getPodPreferredNodeAffinity(pod) + if err != nil { + return framework.AsStatus(err) + } + state := &preScoreState{ + preferredNodeAffinity: preferredNodeAffinity, + } + cycleState.Write(preScoreStateKey, state) return nil } @@ -85,22 +150,25 @@ func (pl *NodeAffinity) Score(ctx context.Context, state *framework.CycleState, return 0, framework.AsStatus(fmt.Errorf("getting node %q from Snapshot: %w", nodeName, err)) } - affinity := pod.Spec.Affinity - var count int64 if pl.addedPrefSchedTerms != nil { count += pl.addedPrefSchedTerms.Score(node) } - // A nil element of PreferredDuringSchedulingIgnoredDuringExecution matches no objects. - // An element of PreferredDuringSchedulingIgnoredDuringExecution that refers to an - // empty PreferredSchedulingTerm matches all objects. - if affinity != nil && affinity.NodeAffinity != nil && affinity.NodeAffinity.PreferredDuringSchedulingIgnoredDuringExecution != nil { - // TODO(#96164): Do this in PreScore to avoid computing it for all nodes. - preferredNodeAffinity, err := nodeaffinity.NewPreferredSchedulingTerms(affinity.NodeAffinity.PreferredDuringSchedulingIgnoredDuringExecution) + + s, err := getPreScoreState(state) + if err != nil { + // Fallback to calculate preferredNodeAffinity here when PreScore is disabled. + preferredNodeAffinity, err := getPodPreferredNodeAffinity(pod) if err != nil { return 0, framework.AsStatus(err) } - count += preferredNodeAffinity.Score(node) + s = &preScoreState{ + preferredNodeAffinity: preferredNodeAffinity, + } + } + + if s.preferredNodeAffinity != nil { + count += s.preferredNodeAffinity.Score(node) } return count, nil @@ -150,3 +218,37 @@ func getArgs(obj runtime.Object) (config.NodeAffinityArgs, error) { } return *ptr, validation.ValidateNodeAffinityArgs(ptr) } + +func getPodPreferredNodeAffinity(pod *v1.Pod) (*nodeaffinity.PreferredSchedulingTerms, error) { + affinity := pod.Spec.Affinity + if affinity != nil && affinity.NodeAffinity != nil && affinity.NodeAffinity.PreferredDuringSchedulingIgnoredDuringExecution != nil { + return nodeaffinity.NewPreferredSchedulingTerms(affinity.NodeAffinity.PreferredDuringSchedulingIgnoredDuringExecution) + } + return nil, nil +} + +func getPreScoreState(cycleState *framework.CycleState) (*preScoreState, error) { + c, err := cycleState.Read(preScoreStateKey) + if err != nil { + return nil, fmt.Errorf("reading %q from cycleState: %w", preScoreStateKey, err) + } + + s, ok := c.(*preScoreState) + if !ok { + return nil, fmt.Errorf("invalid PreScore state, got type %T", c) + } + return s, nil +} + +func getPreFilterState(cycleState *framework.CycleState) (*preFilterState, error) { + c, err := cycleState.Read(preFilterStateKey) + if err != nil { + return nil, fmt.Errorf("reading %q from cycleState: %v", preFilterStateKey, err) + } + + s, ok := c.(*preFilterState) + if !ok { + return nil, fmt.Errorf("invalid PreFilter state, got type %T", c) + } + return s, nil +} diff --git a/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodename/BUILD b/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodename/BUILD deleted file mode 100644 index 8111ea835205..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodename/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["node_name.go"], - importpath = "k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodename", - visibility = ["//visibility:public"], - deps = [ - "//pkg/scheduler/framework:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["node_name_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/scheduler/framework:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodename/node_name.go b/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodename/node_name.go index ab716bc7b757..070170360ed3 100644 --- a/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodename/node_name.go +++ b/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodename/node_name.go @@ -34,7 +34,7 @@ const ( Name = "NodeName" // ErrReason returned when node name doesn't match. - ErrReason = "node(s) didn't match the requested hostname" + ErrReason = "node(s) didn't match the requested node name" ) // Name returns name of the plugin. It is used in logs, etc. diff --git a/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodeports/BUILD b/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodeports/BUILD deleted file mode 100644 index faa548655980..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodeports/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["node_ports.go"], - importpath = "k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodeports", - visibility = ["//visibility:public"], - deps = [ - "//pkg/scheduler/framework:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["node_ports_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/scheduler/framework:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/noderesources/BUILD b/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/noderesources/BUILD deleted file mode 100644 index 0396ab794a54..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/noderesources/BUILD +++ /dev/null @@ -1,74 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "balanced_allocation.go", - "fit.go", - "least_allocated.go", - "most_allocated.go", - "requested_to_capacity_ratio.go", - "resource_allocation.go", - "test_util.go", - ], - importpath = "k8s.io/kubernetes/pkg/scheduler/framework/plugins/noderesources", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/core/v1/helper:go_default_library", - "//pkg/features:go_default_library", - "//pkg/scheduler/apis/config:go_default_library", - "//pkg/scheduler/apis/config/validation:go_default_library", - "//pkg/scheduler/framework:go_default_library", - "//pkg/scheduler/util:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = [ - "balanced_allocation_test.go", - "fit_test.go", - "least_allocated_test.go", - "most_allocated_test.go", - "requested_to_capacity_ratio_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core/v1/helper:go_default_library", - "//pkg/features:go_default_library", - "//pkg/scheduler/apis/config:go_default_library", - "//pkg/scheduler/framework:go_default_library", - "//pkg/scheduler/framework/runtime:go_default_library", - "//pkg/scheduler/internal/cache:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/noderesources/fit.go b/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/noderesources/fit.go index 8d65cfeefc35..28c4dc0920b8 100644 --- a/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/noderesources/fit.go +++ b/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/noderesources/fit.go @@ -35,6 +35,7 @@ import ( var _ framework.PreFilterPlugin = &Fit{} var _ framework.FilterPlugin = &Fit{} +var _ framework.EnqueueExtensions = &Fit{} const ( // FitName is the name of the plugin used in the plugin registry and configurations. @@ -179,7 +180,7 @@ func getPreFilterState(cycleState *framework.CycleState) (*preFilterState, error c, err := cycleState.Read(preFilterStateKey) if err != nil { // preFilterState doesn't exist, likely PreFilter wasn't invoked. - return nil, fmt.Errorf("error reading %q from cycleState: %v", preFilterStateKey, err) + return nil, fmt.Errorf("error reading %q from cycleState: %w", preFilterStateKey, err) } s, ok := c.(*preFilterState) @@ -189,13 +190,25 @@ func getPreFilterState(cycleState *framework.CycleState) (*preFilterState, error return s, nil } +// EventsToRegister returns the possible events that may make a Pod +// failed by this plugin schedulable. +// NOTE: if in-place-update (KEP 1287) gets implemented, then PodUpdate event +// should be registered for this plugin since a Pod update may free up resources +// that make other Pods schedulable. +func (f *Fit) EventsToRegister() []framework.ClusterEvent { + return []framework.ClusterEvent{ + {Resource: framework.Pod, ActionType: framework.Delete}, + {Resource: framework.Node, ActionType: framework.Add | framework.UpdateNodeAllocatable}, + } +} + // Filter invoked at the filter extension point. // Checks if a node has sufficient resources, such as cpu, memory, gpu, opaque int resources etc to run a pod. // It returns a list of insufficient resources, if empty, then the node has all the resources requested by the pod. func (f *Fit) Filter(ctx context.Context, cycleState *framework.CycleState, pod *v1.Pod, nodeInfo *framework.NodeInfo) *framework.Status { s, err := getPreFilterState(cycleState) if err != nil { - return framework.NewStatus(framework.Error, err.Error()) + return framework.AsStatus(err) } insufficientResources := fitsRequest(s, nodeInfo, f.ignoredResources, f.ignoredResourceGroups) @@ -248,7 +261,7 @@ func fitsRequest(podRequest *preFilterState, nodeInfo *framework.NodeInfo, ignor return insufficientResources } - if nodeInfo.Allocatable.MilliCPU < podRequest.MilliCPU+nodeInfo.Requested.MilliCPU { + if podRequest.MilliCPU > (nodeInfo.Allocatable.MilliCPU - nodeInfo.Requested.MilliCPU) { insufficientResources = append(insufficientResources, InsufficientResource{ v1.ResourceCPU, "Insufficient cpu", @@ -257,7 +270,7 @@ func fitsRequest(podRequest *preFilterState, nodeInfo *framework.NodeInfo, ignor nodeInfo.Allocatable.MilliCPU, }) } - if nodeInfo.Allocatable.Memory < podRequest.Memory+nodeInfo.Requested.Memory { + if podRequest.Memory > (nodeInfo.Allocatable.Memory - nodeInfo.Requested.Memory) { insufficientResources = append(insufficientResources, InsufficientResource{ v1.ResourceMemory, "Insufficient memory", @@ -266,7 +279,7 @@ func fitsRequest(podRequest *preFilterState, nodeInfo *framework.NodeInfo, ignor nodeInfo.Allocatable.Memory, }) } - if nodeInfo.Allocatable.EphemeralStorage < podRequest.EphemeralStorage+nodeInfo.Requested.EphemeralStorage { + if podRequest.EphemeralStorage > (nodeInfo.Allocatable.EphemeralStorage - nodeInfo.Requested.EphemeralStorage) { insufficientResources = append(insufficientResources, InsufficientResource{ v1.ResourceEphemeralStorage, "Insufficient ephemeral-storage", @@ -288,7 +301,7 @@ func fitsRequest(podRequest *preFilterState, nodeInfo *framework.NodeInfo, ignor continue } } - if nodeInfo.Allocatable.ScalarResources[rName] < rQuant+nodeInfo.Requested.ScalarResources[rName] { + if rQuant > (nodeInfo.Allocatable.ScalarResources[rName] - nodeInfo.Requested.ScalarResources[rName]) { insufficientResources = append(insufficientResources, InsufficientResource{ rName, fmt.Sprintf("Insufficient %v", rName), diff --git a/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/noderesources/least_allocated.go b/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/noderesources/least_allocated.go index 32d77a7672c3..f196f30299a0 100644 --- a/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/noderesources/least_allocated.go +++ b/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/noderesources/least_allocated.go @@ -47,7 +47,7 @@ func (la *LeastAllocated) Name() string { func (la *LeastAllocated) Score(ctx context.Context, state *framework.CycleState, pod *v1.Pod, nodeName string) (int64, *framework.Status) { nodeInfo, err := la.handle.SnapshotSharedLister().NodeInfos().Get(nodeName) if err != nil { - return 0, framework.NewStatus(framework.Error, fmt.Sprintf("getting node %q from Snapshot: %v", nodeName, err)) + return 0, framework.AsStatus(fmt.Errorf("getting node %q from Snapshot: %w", nodeName, err)) } // la.score favors nodes with fewer requested resources. diff --git a/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/noderesources/most_allocated.go b/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/noderesources/most_allocated.go index 4df34e13017b..7a7929dfd920 100644 --- a/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/noderesources/most_allocated.go +++ b/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/noderesources/most_allocated.go @@ -46,8 +46,8 @@ func (ma *MostAllocated) Name() string { // Score invoked at the Score extension point. func (ma *MostAllocated) Score(ctx context.Context, state *framework.CycleState, pod *v1.Pod, nodeName string) (int64, *framework.Status) { nodeInfo, err := ma.handle.SnapshotSharedLister().NodeInfos().Get(nodeName) - if err != nil || nodeInfo.Node() == nil { - return 0, framework.NewStatus(framework.Error, fmt.Sprintf("getting node %q from Snapshot: %v, node is nil: %v", nodeName, err, nodeInfo.Node() == nil)) + if err != nil { + return 0, framework.AsStatus(fmt.Errorf("getting node %q from Snapshot: %w", nodeName, err)) } // ma.score favors nodes with most requested resources. diff --git a/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/noderesources/requested_to_capacity_ratio.go b/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/noderesources/requested_to_capacity_ratio.go index 6dd2f3badf3b..b0bf7ab4b485 100644 --- a/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/noderesources/requested_to_capacity_ratio.go +++ b/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/noderesources/requested_to_capacity_ratio.go @@ -26,24 +26,15 @@ import ( "k8s.io/kubernetes/pkg/scheduler/apis/config" "k8s.io/kubernetes/pkg/scheduler/apis/config/validation" "k8s.io/kubernetes/pkg/scheduler/framework" + "k8s.io/kubernetes/pkg/scheduler/framework/plugins/helper" ) const ( // RequestedToCapacityRatioName is the name of this plugin. RequestedToCapacityRatioName = "RequestedToCapacityRatio" - minUtilization = 0 maxUtilization = 100 ) -type functionShape []functionShapePoint - -type functionShapePoint struct { - // Utilization is function argument. - utilization int64 - // Score is function value. - score int64 -} - // NewRequestedToCapacityRatio initializes a new plugin and returns it. func NewRequestedToCapacityRatio(plArgs runtime.Object, handle framework.Handle) (framework.Plugin, error) { args, err := getRequestedToCapacityRatioArgs(plArgs) @@ -55,14 +46,14 @@ func NewRequestedToCapacityRatio(plArgs runtime.Object, handle framework.Handle) return nil, err } - shape := make([]functionShapePoint, 0, len(args.Shape)) + shape := make([]helper.FunctionShapePoint, 0, len(args.Shape)) for _, point := range args.Shape { - shape = append(shape, functionShapePoint{ - utilization: int64(point.Utilization), + shape = append(shape, helper.FunctionShapePoint{ + Utilization: int64(point.Utilization), // MaxCustomPriorityScore may diverge from the max score used in the scheduler and defined by MaxNodeScore, // therefore we need to scale the score returned by requested to capacity ratio to the score range // used by the scheduler. - score: int64(point.Score) * (framework.MaxNodeScore / config.MaxCustomPriorityScore), + Score: int64(point.Score) * (framework.MaxNodeScore / config.MaxCustomPriorityScore), }) } @@ -111,7 +102,7 @@ func (pl *RequestedToCapacityRatio) Name() string { func (pl *RequestedToCapacityRatio) Score(ctx context.Context, _ *framework.CycleState, pod *v1.Pod, nodeName string) (int64, *framework.Status) { nodeInfo, err := pl.handle.SnapshotSharedLister().NodeInfos().Get(nodeName) if err != nil { - return 0, framework.NewStatus(framework.Error, fmt.Sprintf("getting node %q from Snapshot: %v", nodeName, err)) + return 0, framework.AsStatus(fmt.Errorf("getting node %q from Snapshot: %w", nodeName, err)) } return pl.score(pod, nodeInfo) } @@ -121,8 +112,8 @@ func (pl *RequestedToCapacityRatio) ScoreExtensions() framework.ScoreExtensions return nil } -func buildRequestedToCapacityRatioScorerFunction(scoringFunctionShape functionShape, resourceToWeightMap resourceToWeightMap) func(resourceToValueMap, resourceToValueMap, bool, int, int) int64 { - rawScoringFunction := buildBrokenLinearFunction(scoringFunctionShape) +func buildRequestedToCapacityRatioScorerFunction(scoringFunctionShape helper.FunctionShape, resourceToWeightMap resourceToWeightMap) func(resourceToValueMap, resourceToValueMap, bool, int, int) int64 { + rawScoringFunction := helper.BuildBrokenLinearFunction(scoringFunctionShape) resourceScoringFunction := func(requested, capacity int64) int64 { if capacity == 0 || requested > capacity { return rawScoringFunction(maxUtilization) @@ -145,26 +136,3 @@ func buildRequestedToCapacityRatioScorerFunction(scoringFunctionShape functionSh return int64(math.Round(float64(nodeScore) / float64(weightSum))) } } - -// Creates a function which is built using linear segments. Segments are defined via shape array. -// Shape[i].utilization slice represents points on "utilization" axis where different segments meet. -// Shape[i].score represents function values at meeting points. -// -// function f(p) is defined as: -// shape[0].score for p < f[0].utilization -// shape[i].score for p == shape[i].utilization -// shape[n-1].score for p > shape[n-1].utilization -// and linear between points (p < shape[i].utilization) -func buildBrokenLinearFunction(shape functionShape) func(int64) int64 { - return func(p int64) int64 { - for i := 0; i < len(shape); i++ { - if p <= int64(shape[i].utilization) { - if i == 0 { - return shape[0].score - } - return shape[i-1].score + (shape[i].score-shape[i-1].score)*(p-shape[i-1].utilization)/(shape[i].utilization-shape[i-1].utilization) - } - } - return shape[len(shape)-1].score - } -} diff --git a/vendor/k8s.io/kubernetes/pkg/scheduler/framework/types.go b/vendor/k8s.io/kubernetes/pkg/scheduler/framework/types.go index 7b7f19256d15..a29c07915100 100644 --- a/vendor/k8s.io/kubernetes/pkg/scheduler/framework/types.go +++ b/vendor/k8s.io/kubernetes/pkg/scheduler/framework/types.go @@ -19,14 +19,17 @@ package framework import ( "errors" "fmt" + "sort" + "strings" "sync" "sync/atomic" "time" - v1 "k8s.io/api/core/v1" + "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" + utilerrors "k8s.io/apimachinery/pkg/util/errors" "k8s.io/apimachinery/pkg/util/sets" utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/klog/v2" @@ -37,11 +40,57 @@ import ( var generation int64 +// ActionType is an integer to represent one type of resource change. +// Different ActionTypes can be bit-wised to compose new semantics. +type ActionType int64 + +// Constants for ActionTypes. +const ( + Add ActionType = 1 << iota // 1 + Delete // 10 + // UpdateNodeXYZ is only applicable for Node events. + UpdateNodeAllocatable // 100 + UpdateNodeLabel // 1000 + UpdateNodeTaint // 10000 + UpdateNodeCondition // 100000 + + All ActionType = 1< r { + s = r + } else if s < 1 { + s = 1 + } + return s +} + +// Until is a wrapper around workqueue.ParallelizeUntil to use in scheduling algorithms. +func (p Parallelizer) Until(ctx context.Context, pieces int, doWorkPiece workqueue.DoWorkPieceFunc) { + workqueue.ParallelizeUntil(ctx, p.parallelism, pieces, doWorkPiece, workqueue.WithChunkSize(chunkSizeFor(pieces, p.parallelism))) +} diff --git a/vendor/k8s.io/kubernetes/pkg/scheduler/util/BUILD b/vendor/k8s.io/kubernetes/pkg/scheduler/util/BUILD deleted file mode 100644 index 3e7f83465d5c..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/scheduler/util/BUILD +++ /dev/null @@ -1,70 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "non_zero_test.go", - "topologies_test.go", - "utils_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/selection:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - "//staging/src/k8s.io/kube-scheduler/extender/v1:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "clock.go", - "non_zero.go", - "topologies.go", - "utils.go", - ], - importpath = "k8s.io/kubernetes/pkg/scheduler/util", - deps = [ - "//pkg/apis/core/v1/helper:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/component-helpers/scheduling/corev1:go_default_library", - "//staging/src/k8s.io/kube-scheduler/extender/v1:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/scheduler/util/topologies.go b/vendor/k8s.io/kubernetes/pkg/scheduler/util/topologies.go deleted file mode 100644 index bf5ee53ac01d..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/scheduler/util/topologies.go +++ /dev/null @@ -1,81 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package util - -import ( - "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/labels" - "k8s.io/apimachinery/pkg/util/sets" -) - -// GetNamespacesFromPodAffinityTerm returns a set of names -// according to the namespaces indicated in podAffinityTerm. -// If namespaces is empty it considers the given pod's namespace. -func GetNamespacesFromPodAffinityTerm(pod *v1.Pod, podAffinityTerm *v1.PodAffinityTerm) sets.String { - names := sets.String{} - if len(podAffinityTerm.Namespaces) == 0 { - names.Insert(pod.Namespace) - } else { - names.Insert(podAffinityTerm.Namespaces...) - } - return names -} - -// PodMatchesTermsNamespaceAndSelector returns true if the given -// matches the namespace and selector defined by `s . -func PodMatchesTermsNamespaceAndSelector(pod *v1.Pod, namespaces sets.String, selector labels.Selector) bool { - if !namespaces.Has(pod.Namespace) { - return false - } - - if !selector.Matches(labels.Set(pod.Labels)) { - return false - } - return true -} - -// NodesHaveSameTopologyKey checks if nodeA and nodeB have same label value with given topologyKey as label key. -// Returns false if topologyKey is empty. -func NodesHaveSameTopologyKey(nodeA, nodeB *v1.Node, topologyKey string) bool { - if len(topologyKey) == 0 { - return false - } - - if nodeA.Labels == nil || nodeB.Labels == nil { - return false - } - - nodeALabel, okA := nodeA.Labels[topologyKey] - nodeBLabel, okB := nodeB.Labels[topologyKey] - - // If found label in both nodes, check the label - if okB && okA { - return nodeALabel == nodeBLabel - } - - return false -} - -// Topologies contains topologies information of nodes. -type Topologies struct { - DefaultKeys []string -} - -// NodesHaveSameTopologyKey checks if nodeA and nodeB have same label value with given topologyKey as label key. -func (tps *Topologies) NodesHaveSameTopologyKey(nodeA, nodeB *v1.Node, topologyKey string) bool { - return NodesHaveSameTopologyKey(nodeA, nodeB, topologyKey) -} diff --git a/vendor/k8s.io/kubernetes/pkg/scheduler/util/utils.go b/vendor/k8s.io/kubernetes/pkg/scheduler/util/utils.go index 93ed14f39549..6836a2150b46 100644 --- a/vendor/k8s.io/kubernetes/pkg/scheduler/util/utils.go +++ b/vendor/k8s.io/kubernetes/pkg/scheduler/util/utils.go @@ -90,34 +90,6 @@ func MoreImportantPod(pod1, pod2 *v1.Pod) bool { return GetPodStartTime(pod1).Before(GetPodStartTime(pod2)) } -// GetPodAffinityTerms gets pod affinity terms by a pod affinity object. -func GetPodAffinityTerms(affinity *v1.Affinity) (terms []v1.PodAffinityTerm) { - if affinity != nil && affinity.PodAffinity != nil { - if len(affinity.PodAffinity.RequiredDuringSchedulingIgnoredDuringExecution) != 0 { - terms = affinity.PodAffinity.RequiredDuringSchedulingIgnoredDuringExecution - } - // TODO: Uncomment this block when implement RequiredDuringSchedulingRequiredDuringExecution. - //if len(affinity.PodAffinity.RequiredDuringSchedulingRequiredDuringExecution) != 0 { - // terms = append(terms, affinity.PodAffinity.RequiredDuringSchedulingRequiredDuringExecution...) - //} - } - return terms -} - -// GetPodAntiAffinityTerms gets pod affinity terms by a pod anti-affinity. -func GetPodAntiAffinityTerms(affinity *v1.Affinity) (terms []v1.PodAffinityTerm) { - if affinity != nil && affinity.PodAntiAffinity != nil { - if len(affinity.PodAntiAffinity.RequiredDuringSchedulingIgnoredDuringExecution) != 0 { - terms = affinity.PodAntiAffinity.RequiredDuringSchedulingIgnoredDuringExecution - } - // TODO: Uncomment this block when implement RequiredDuringSchedulingRequiredDuringExecution. - //if len(affinity.PodAntiAffinity.RequiredDuringSchedulingRequiredDuringExecution) != 0 { - // terms = append(terms, affinity.PodAntiAffinity.RequiredDuringSchedulingRequiredDuringExecution...) - //} - } - return terms -} - // PatchPod calculates the delta bytes change from to , // and then submit a request to API server to patch the pod changes. func PatchPod(cs kubernetes.Interface, old *v1.Pod, new *v1.Pod) error { diff --git a/vendor/k8s.io/kubernetes/pkg/security/apparmor/BUILD b/vendor/k8s.io/kubernetes/pkg/security/apparmor/BUILD deleted file mode 100644 index 3b46734c358e..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/security/apparmor/BUILD +++ /dev/null @@ -1,52 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "helpers.go", - "validate.go", - "validate_disabled.go", - ], - importpath = "k8s.io/kubernetes/pkg/security/apparmor", - deps = [ - "//pkg/api/v1/pod:go_default_library", - "//pkg/features:go_default_library", - "//pkg/kubelet/types:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/k8s.io/utils/path:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["validate_test.go"], - data = [ - "testdata/profiles", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/BUILD b/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/BUILD deleted file mode 100644 index eb60ea12175f..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/BUILD +++ /dev/null @@ -1,86 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "factory.go", - "provider.go", - "types.go", - ], - importpath = "k8s.io/kubernetes/pkg/security/podsecuritypolicy", - deps = [ - "//pkg/api/pod:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/pods:go_default_library", - "//pkg/features:go_default_library", - "//pkg/security/podsecuritypolicy/apparmor:go_default_library", - "//pkg/security/podsecuritypolicy/capabilities:go_default_library", - "//pkg/security/podsecuritypolicy/group:go_default_library", - "//pkg/security/podsecuritypolicy/seccomp:go_default_library", - "//pkg/security/podsecuritypolicy/selinux:go_default_library", - "//pkg/security/podsecuritypolicy/sysctl:go_default_library", - "//pkg/security/podsecuritypolicy/user:go_default_library", - "//pkg/security/podsecuritypolicy/util:go_default_library", - "//pkg/securitycontext:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["provider_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/v1:go_default_library", - "//pkg/features:go_default_library", - "//pkg/security/apparmor:go_default_library", - "//pkg/security/podsecuritypolicy/seccomp:go_default_library", - "//pkg/security/podsecuritypolicy/util:go_default_library", - "//plugin/pkg/admission/serviceaccount:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/security/podsecuritypolicy/apparmor:all-srcs", - "//pkg/security/podsecuritypolicy/capabilities:all-srcs", - "//pkg/security/podsecuritypolicy/group:all-srcs", - "//pkg/security/podsecuritypolicy/seccomp:all-srcs", - "//pkg/security/podsecuritypolicy/selinux:all-srcs", - "//pkg/security/podsecuritypolicy/sysctl:all-srcs", - "//pkg/security/podsecuritypolicy/user:all-srcs", - "//pkg/security/podsecuritypolicy/util:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/apparmor/BUILD b/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/apparmor/BUILD deleted file mode 100644 index 06297479ae06..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/apparmor/BUILD +++ /dev/null @@ -1,47 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["strategy.go"], - importpath = "k8s.io/kubernetes/pkg/security/podsecuritypolicy/apparmor", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/security/apparmor:go_default_library", - "//pkg/util/maps:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["strategy_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/util/maps:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/github.com/davecgh/go-spew/spew:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/capabilities/BUILD b/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/capabilities/BUILD deleted file mode 100644 index 7e01f351e4c5..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/capabilities/BUILD +++ /dev/null @@ -1,49 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "capabilities.go", - "doc.go", - "types.go", - ], - importpath = "k8s.io/kubernetes/pkg/security/podsecuritypolicy/capabilities", - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["capabilities_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/factory.go b/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/factory.go index e68cf647dd2a..ed019b223e3a 100644 --- a/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/factory.go +++ b/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/factory.go @@ -19,9 +19,6 @@ package podsecuritypolicy import ( "fmt" - utilfeature "k8s.io/apiserver/pkg/util/feature" - "k8s.io/kubernetes/pkg/features" - corev1 "k8s.io/api/core/v1" policy "k8s.io/api/policy/v1beta1" "k8s.io/apimachinery/pkg/util/errors" @@ -51,11 +48,9 @@ func (f *simpleStrategyFactory) CreateStrategies(psp *policy.PodSecurityPolicy, } var groupStrat group.GroupStrategy - if utilfeature.DefaultFeatureGate.Enabled(features.RunAsGroup) { - groupStrat, err = createRunAsGroupStrategy(psp.Spec.RunAsGroup) - if err != nil { - errs = append(errs, err) - } + groupStrat, err = createRunAsGroupStrategy(psp.Spec.RunAsGroup) + if err != nil { + errs = append(errs, err) } seLinuxStrat, err := createSELinuxStrategy(&psp.Spec.SELinux) diff --git a/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/group/BUILD b/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/group/BUILD deleted file mode 100644 index b3d58e2b8326..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/group/BUILD +++ /dev/null @@ -1,53 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "helpers.go", - "mayrunas.go", - "mustrunas.go", - "runasany.go", - "types.go", - ], - importpath = "k8s.io/kubernetes/pkg/security/podsecuritypolicy/group", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/security/podsecuritypolicy/util:go_default_library", - "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "mayrunas_test.go", - "mustrunas_test.go", - "runasany_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/provider.go b/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/provider.go index d3ee1dcbc758..eda587533c96 100644 --- a/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/provider.go +++ b/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/provider.go @@ -140,15 +140,12 @@ func (s *simpleProvider) mutateContainer(pod *api.Pod, container *api.Container) sc.SetRunAsUser(uid) } - if utilfeature.DefaultFeatureGate.Enabled(features.RunAsGroup) { - if sc.RunAsGroup() == nil { - gid, err := s.strategies.RunAsGroupStrategy.GenerateSingle(pod) - if err != nil { - return err - } - sc.SetRunAsGroup(gid) + if sc.RunAsGroup() == nil { + gid, err := s.strategies.RunAsGroupStrategy.GenerateSingle(pod) + if err != nil { + return err } - + sc.SetRunAsGroup(gid) } if sc.SELinuxOptions() == nil { @@ -337,14 +334,12 @@ func (s *simpleProvider) validateContainer(pod *api.Pod, container *api.Containe scPath := containerPath.Child("securityContext") allErrs = append(allErrs, s.strategies.RunAsUserStrategy.Validate(scPath, pod, container, sc.RunAsNonRoot(), sc.RunAsUser())...) - - if utilfeature.DefaultFeatureGate.Enabled(features.RunAsGroup) { - var runAsGroups []int64 - if sc.RunAsGroup() != nil { - runAsGroups = []int64{*sc.RunAsGroup()} - } - allErrs = append(allErrs, s.strategies.RunAsGroupStrategy.Validate(scPath, pod, runAsGroups)...) + var runAsGroups []int64 + if sc.RunAsGroup() != nil { + runAsGroups = []int64{*sc.RunAsGroup()} } + allErrs = append(allErrs, s.strategies.RunAsGroupStrategy.Validate(scPath, pod, runAsGroups)...) + allErrs = append(allErrs, s.strategies.SELinuxStrategy.Validate(scPath.Child("seLinuxOptions"), pod, container, sc.SELinuxOptions())...) allErrs = append(allErrs, s.strategies.AppArmorStrategy.Validate(pod, container)...) allErrs = append(allErrs, s.strategies.SeccompStrategy.ValidateContainer(pod, container)...) diff --git a/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/seccomp/BUILD b/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/seccomp/BUILD deleted file mode 100644 index a3b99b53ff3a..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/seccomp/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["strategy.go"], - importpath = "k8s.io/kubernetes/pkg/security/podsecuritypolicy/seccomp", - deps = [ - "//pkg/api/pod:go_default_library", - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["strategy_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/selinux/BUILD b/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/selinux/BUILD deleted file mode 100644 index 275659c1aaa4..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/selinux/BUILD +++ /dev/null @@ -1,53 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "mustrunas.go", - "runasany.go", - "types.go", - ], - importpath = "k8s.io/kubernetes/pkg/security/podsecuritypolicy/selinux", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/v1:go_default_library", - "//pkg/security/podsecuritypolicy/util:go_default_library", - "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "mustrunas_test.go", - "runasany_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/sysctl/BUILD b/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/sysctl/BUILD deleted file mode 100644 index 2a774ad86a60..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/sysctl/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "mustmatchpatterns.go", - "types.go", - ], - importpath = "k8s.io/kubernetes/pkg/security/podsecuritypolicy/sysctl", - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["mustmatchpatterns_test.go"], - embed = [":go_default_library"], - deps = ["//pkg/apis/core:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/user/BUILD b/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/user/BUILD deleted file mode 100644 index fcd52f258da5..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/user/BUILD +++ /dev/null @@ -1,53 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "mustrunas.go", - "nonroot.go", - "runasany.go", - "types.go", - ], - importpath = "k8s.io/kubernetes/pkg/security/podsecuritypolicy/user", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/security/podsecuritypolicy/util:go_default_library", - "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "mustrunas_test.go", - "nonroot_test.go", - "runasany_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/util/BUILD b/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/util/BUILD deleted file mode 100644 index 64421e269121..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/util/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "util.go", - ], - importpath = "k8s.io/kubernetes/pkg/security/podsecuritypolicy/util", - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["util_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/serviceaccount:go_default_library", - "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/util/util.go b/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/util/util.go index c607a23a6401..1405714f8bbc 100644 --- a/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/util/util.go +++ b/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/util/util.go @@ -29,6 +29,8 @@ const ( ValidatedPSPAnnotation = "kubernetes.io/psp" ) +// GetAllFSTypesExcept returns the result of GetAllFSTypesAsSet minus +// the given exceptions. func GetAllFSTypesExcept(exceptions ...string) sets.String { fstypes := GetAllFSTypesAsSet() for _, e := range exceptions { @@ -37,6 +39,8 @@ func GetAllFSTypesExcept(exceptions ...string) sets.String { return fstypes } +// GetAllFSTypesAsSet returns all actual volume types, regardless +// of feature gates. The special policy.All pseudo type is not included. func GetAllFSTypesAsSet() sets.String { fstypes := sets.NewString() fstypes.Insert( diff --git a/vendor/k8s.io/kubernetes/pkg/securitycontext/BUILD b/vendor/k8s.io/kubernetes/pkg/securitycontext/BUILD deleted file mode 100644 index 36b665b7de1b..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/securitycontext/BUILD +++ /dev/null @@ -1,50 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "accessors.go", - "doc.go", - "fake.go", - "util.go", - ], - importpath = "k8s.io/kubernetes/pkg/securitycontext", - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "accessors_test.go", - "util_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/serviceaccount/BUILD b/vendor/k8s.io/kubernetes/pkg/serviceaccount/BUILD deleted file mode 100644 index 0eb22c82ed02..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/serviceaccount/BUILD +++ /dev/null @@ -1,75 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "claims.go", - "jwt.go", - "legacy.go", - "metrics.go", - "openidmetadata.go", - ], - importpath = "k8s.io/kubernetes/pkg/serviceaccount", - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/audit:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/serviceaccount:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - "//vendor/gopkg.in/square/go-jose.v2:go_default_library", - "//vendor/gopkg.in/square/go-jose.v2/jwt:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = [ - "claims_test.go", - "jwt_test.go", - "openidmetadata_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/controller/serviceaccount:go_default_library", - "//pkg/routes:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/util/keyutil:go_default_library", - "//vendor/github.com/emicklei/go-restful:go_default_library", - "//vendor/github.com/google/go-cmp/cmp:go_default_library", - "//vendor/gopkg.in/square/go-jose.v2:go_default_library", - "//vendor/gopkg.in/square/go-jose.v2/jwt:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/serviceaccount/claims.go b/vendor/k8s.io/kubernetes/pkg/serviceaccount/claims.go index eb9937896815..80ebd7a51922 100644 --- a/vendor/k8s.io/kubernetes/pkg/serviceaccount/claims.go +++ b/vendor/k8s.io/kubernetes/pkg/serviceaccount/claims.go @@ -192,9 +192,9 @@ func (v *validator) Validate(ctx context.Context, _ string, public *jwt.Claims, secondsAfterWarn := nowTime.Unix() - warnafter.Time().Unix() auditInfo := fmt.Sprintf("subject: %s, seconds after warning threshold: %d", public.Subject, secondsAfterWarn) audit.AddAuditAnnotation(ctx, "authentication.k8s.io/stale-token", auditInfo) - staleTokensTotal.Inc() + staleTokensTotal.WithContext(ctx).Inc() } else { - validTokensTotal.Inc() + validTokensTotal.WithContext(ctx).Inc() } } diff --git a/vendor/k8s.io/kubernetes/pkg/serviceaccount/jwt.go b/vendor/k8s.io/kubernetes/pkg/serviceaccount/jwt.go index a90e9076c13c..c779957bdbe7 100644 --- a/vendor/k8s.io/kubernetes/pkg/serviceaccount/jwt.go +++ b/vendor/k8s.io/kubernetes/pkg/serviceaccount/jwt.go @@ -290,7 +290,7 @@ func (j *jwtTokenAuthenticator) AuthenticateToken(ctx context.Context, tokenData if len(tokenAudiences) == 0 { // only apiserver audiences are allowed for legacy tokens audit.AddAuditAnnotation(ctx, "authentication.k8s.io/legacy-token", public.Subject) - legacyTokensTotal.Inc() + legacyTokensTotal.WithContext(ctx).Inc() tokenAudiences = j.implicitAuds } diff --git a/vendor/k8s.io/kubernetes/pkg/ssh/BUILD b/vendor/k8s.io/kubernetes/pkg/ssh/BUILD deleted file mode 100644 index abf92918b3ae..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/ssh/BUILD +++ /dev/null @@ -1,46 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["ssh_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/golang.org/x/crypto/ssh:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["ssh.go"], - importpath = "k8s.io/kubernetes/pkg/ssh", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - "//vendor/golang.org/x/crypto/ssh:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/ssh/ssh.go b/vendor/k8s.io/kubernetes/pkg/ssh/ssh.go index 0f4fab5a1557..42309c426b9a 100644 --- a/vendor/k8s.io/kubernetes/pkg/ssh/ssh.go +++ b/vendor/k8s.io/kubernetes/pkg/ssh/ssh.go @@ -50,7 +50,7 @@ import ( /* * By default, all the following metrics are defined as falling under - * ALPHA stability level https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/20190404-kubernetes-control-plane-metrics-stability.md#stability-classes) + * ALPHA stability level https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/1209-metrics-stability/20190404-kubernetes-control-plane-metrics-stability.md#stability-classes) * * Promoting the stability level of the metric is a responsibility of the component owner, since it * involves explicitly acknowledging support for the metric across multiple releases, in accordance with diff --git a/vendor/k8s.io/kubernetes/pkg/util/async/BUILD b/vendor/k8s.io/kubernetes/pkg/util/async/BUILD deleted file mode 100644 index 651e634c27e2..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/util/async/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "bounded_frequency_runner.go", - "runner.go", - ], - importpath = "k8s.io/kubernetes/pkg/util/async", - deps = [ - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "bounded_frequency_runner_test.go", - "runner_test.go", - ], - embed = [":go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/util/bandwidth/BUILD b/vendor/k8s.io/kubernetes/pkg/util/bandwidth/BUILD deleted file mode 100644 index e01b4dcf30d8..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/util/bandwidth/BUILD +++ /dev/null @@ -1,72 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_shaper.go", - "interfaces.go", - "linux.go", - "unsupported.go", - "utils.go", - ], - importpath = "k8s.io/kubernetes/pkg/util/bandwidth", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - ], - "//conditions:default": [], - }), -) - -go_test( - name = "go_default_test", - srcs = [ - "linux_test.go", - "utils_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "//vendor/k8s.io/utils/exec:go_default_library", - "//vendor/k8s.io/utils/exec/testing:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//vendor/k8s.io/utils/exec:go_default_library", - "//vendor/k8s.io/utils/exec/testing:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/util/config/BUILD b/vendor/k8s.io/kubernetes/pkg/util/config/BUILD deleted file mode 100644 index 37e4a5f83ebf..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/util/config/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "config.go", - "doc.go", - ], - importpath = "k8s.io/kubernetes/pkg/util/config", - deps = ["//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library"], -) - -go_test( - name = "go_default_test", - srcs = ["config_test.go"], - embed = [":go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/util/conntrack/BUILD b/vendor/k8s.io/kubernetes/pkg/util/conntrack/BUILD deleted file mode 100644 index a3d89e15ed17..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/util/conntrack/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["conntrack.go"], - importpath = "k8s.io/kubernetes/pkg/util/conntrack", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["conntrack_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - "//vendor/k8s.io/utils/exec/testing:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/util/conntrack/conntrack.go b/vendor/k8s.io/kubernetes/pkg/util/conntrack/conntrack.go index edec3028b04d..609d1250d021 100644 --- a/vendor/k8s.io/kubernetes/pkg/util/conntrack/conntrack.go +++ b/vendor/k8s.io/kubernetes/pkg/util/conntrack/conntrack.go @@ -111,7 +111,7 @@ func ClearEntriesForNAT(execer exec.Interface, origin, dest string, protocol v1. return nil } -// ClearEntriesForPortNAT uses the conntrack tool to delete the contrack entries +// ClearEntriesForPortNAT uses the conntrack tool to delete the conntrack entries // for connections specified by the {dest IP, port} pair. // Known issue: // https://github.com/kubernetes/kubernetes/issues/59368 diff --git a/vendor/k8s.io/kubernetes/pkg/util/env/BUILD b/vendor/k8s.io/kubernetes/pkg/util/env/BUILD deleted file mode 100644 index 3300ed0449a5..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/util/env/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["env.go"], - importpath = "k8s.io/kubernetes/pkg/util/env", -) - -go_test( - name = "go_default_test", - srcs = ["env_test.go"], - embed = [":go_default_library"], - deps = ["//vendor/github.com/stretchr/testify/assert:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/util/filesystem/BUILD b/vendor/k8s.io/kubernetes/pkg/util/filesystem/BUILD deleted file mode 100644 index fb44f1442e67..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/util/filesystem/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "defaultfs.go", - "fakefs.go", - "filesystem.go", - "watcher.go", - ], - importpath = "k8s.io/kubernetes/pkg/util/filesystem", - deps = [ - "//vendor/github.com/fsnotify/fsnotify:go_default_library", - "//vendor/github.com/spf13/afero:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/util/flag/BUILD b/vendor/k8s.io/kubernetes/pkg/util/flag/BUILD deleted file mode 100644 index 4e5ac790111b..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/util/flag/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["flags.go"], - importpath = "k8s.io/kubernetes/pkg/util/flag", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//vendor/github.com/spf13/pflag:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["flags_test.go"], - embed = [":go_default_library"], - deps = ["//vendor/github.com/spf13/pflag:go_default_library"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/util/flag/flags.go b/vendor/k8s.io/kubernetes/pkg/util/flag/flags.go index 7c489e93ab37..9a4241d67bbb 100644 --- a/vendor/k8s.io/kubernetes/pkg/util/flag/flags.go +++ b/vendor/k8s.io/kubernetes/pkg/util/flag/flags.go @@ -19,10 +19,17 @@ package flag import ( "fmt" "net" + "sort" + "strconv" + "strings" "github.com/spf13/pflag" + v1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" utilnet "k8s.io/apimachinery/pkg/util/net" + corev1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper" + kubeletconfig "k8s.io/kubernetes/pkg/kubelet/apis/config" utilsnet "k8s.io/utils/net" ) @@ -32,6 +39,7 @@ var ( _ pflag.Value = &IPVar{} _ pflag.Value = &IPPortVar{} _ pflag.Value = &PortRangeVar{} + _ pflag.Value = &ReservedMemoryVar{} ) // IPVar is used for validating a command line option that represents an IP. It implements the pflag.Value interface @@ -151,3 +159,99 @@ func (v PortRangeVar) String() string { func (v PortRangeVar) Type() string { return "port-range" } + +// ReservedMemoryVar is used for validating a command line option that represents a reserved memory. It implements the pflag.Value interface +type ReservedMemoryVar struct { + Value *[]kubeletconfig.MemoryReservation + initialized bool // set to true after the first Set call +} + +// Set sets the flag value +func (v *ReservedMemoryVar) Set(s string) error { + if v.Value == nil { + return fmt.Errorf("no target (nil pointer to *[]MemoryReservation") + } + + if s == "" { + v.Value = nil + return nil + } + + if !v.initialized || *v.Value == nil { + *v.Value = make([]kubeletconfig.MemoryReservation, 0) + v.initialized = true + } + + if s == "" { + return nil + } + + numaNodeReservation := strings.Split(s, ":") + if len(numaNodeReservation) != 2 { + return fmt.Errorf("the reserved memory has incorrect format, expected numaNodeID:type=quantity[,type=quantity...], got %s", s) + } + + memoryTypeReservations := strings.Split(numaNodeReservation[1], ",") + if len(memoryTypeReservations) < 1 { + return fmt.Errorf("the reserved memory has incorrect format, expected numaNodeID:type=quantity[,type=quantity...], got %s", s) + } + + numaNodeID, err := strconv.Atoi(numaNodeReservation[0]) + if err != nil { + return fmt.Errorf("failed to convert the NUMA node ID, exptected integer, got %s", numaNodeReservation[0]) + } + + memoryReservation := kubeletconfig.MemoryReservation{ + NumaNode: int32(numaNodeID), + Limits: map[v1.ResourceName]resource.Quantity{}, + } + + for _, reservation := range memoryTypeReservations { + limit := strings.Split(reservation, "=") + if len(limit) != 2 { + return fmt.Errorf("the reserved limit has incorrect value, expected type=quantatity, got %s", reservation) + } + + resourceName := v1.ResourceName(limit[0]) + if resourceName != v1.ResourceMemory && !corev1helper.IsHugePageResourceName(resourceName) { + return fmt.Errorf("memory type conversion error, unknown type: %q", resourceName) + } + + q, err := resource.ParseQuantity(limit[1]) + if err != nil { + return fmt.Errorf("failed to parse the quantatity, expected quantatity, got %s", limit[1]) + } + + memoryReservation.Limits[v1.ResourceName(limit[0])] = q + } + + *v.Value = append(*v.Value, memoryReservation) + + return nil +} + +// String returns the flag value +func (v *ReservedMemoryVar) String() string { + if v == nil || v.Value == nil { + return "" + } + + var slices []string + for _, reservedMemory := range *v.Value { + var limits []string + for resourceName, q := range reservedMemory.Limits { + limits = append(limits, fmt.Sprintf("%s=%s", resourceName, q.String())) + } + + sort.Strings(limits) + slices = append(slices, fmt.Sprintf("%d:%s", reservedMemory.NumaNode, strings.Join(limits, ","))) + } + + sort.Strings(slices) + return strings.Join(slices, ",") +} + +// Type gets the flag type +func (v *ReservedMemoryVar) Type() string { + return "reserved-memory" +} diff --git a/vendor/k8s.io/kubernetes/pkg/util/flock/BUILD b/vendor/k8s.io/kubernetes/pkg/util/flock/BUILD deleted file mode 100644 index 970f6885addd..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/util/flock/BUILD +++ /dev/null @@ -1,55 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "flock_other.go", - "flock_unix.go", - ], - importpath = "k8s.io/kubernetes/pkg/util/flock", - deps = select({ - "@io_bazel_rules_go//go/platform:android": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:ios": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/util/goroutinemap/BUILD b/vendor/k8s.io/kubernetes/pkg/util/goroutinemap/BUILD deleted file mode 100644 index 823a4ffdef47..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/util/goroutinemap/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["goroutinemap.go"], - importpath = "k8s.io/kubernetes/pkg/util/goroutinemap", - deps = [ - "//pkg/util/goroutinemap/exponentialbackoff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["goroutinemap_test.go"], - embed = [":go_default_library"], - deps = ["//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/util/goroutinemap/exponentialbackoff:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/util/goroutinemap/exponentialbackoff/BUILD b/vendor/k8s.io/kubernetes/pkg/util/goroutinemap/exponentialbackoff/BUILD deleted file mode 100644 index 9f78c287368e..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/util/goroutinemap/exponentialbackoff/BUILD +++ /dev/null @@ -1,25 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["exponential_backoff.go"], - importpath = "k8s.io/kubernetes/pkg/util/goroutinemap/exponentialbackoff", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/util/hash/BUILD b/vendor/k8s.io/kubernetes/pkg/util/hash/BUILD deleted file mode 100644 index 93b2b3edff6f..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/util/hash/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["hash.go"], - importpath = "k8s.io/kubernetes/pkg/util/hash", - deps = ["//vendor/github.com/davecgh/go-spew/spew:go_default_library"], -) - -go_test( - name = "go_default_test", - srcs = ["hash_test.go"], - embed = [":go_default_library"], - deps = ["//vendor/github.com/davecgh/go-spew/spew:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/util/ipconfig/BUILD b/vendor/k8s.io/kubernetes/pkg/util/ipconfig/BUILD deleted file mode 100644 index 18ef0f8dea8e..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/util/ipconfig/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "ipconfig.go", - ], - importpath = "k8s.io/kubernetes/pkg/util/ipconfig", - deps = [ - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["ipconfig_test.go"], - embed = [":go_default_library"], - deps = ["//vendor/k8s.io/utils/exec:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/util/ipset/BUILD b/vendor/k8s.io/kubernetes/pkg/util/ipset/BUILD deleted file mode 100644 index f442a3a2ea89..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/util/ipset/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "ipset.go", - "types.go", - ], - importpath = "k8s.io/kubernetes/pkg/util/ipset", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["ipset_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - "//vendor/k8s.io/utils/exec/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/util/ipset/testing:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/util/iptables/BUILD b/vendor/k8s.io/kubernetes/pkg/util/iptables/BUILD deleted file mode 100644 index 505b2260257c..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/util/iptables/BUILD +++ /dev/null @@ -1,80 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "iptables.go", - "iptables_linux.go", - "iptables_unsupported.go", - "save_restore.go", - ], - importpath = "k8s.io/kubernetes/pkg/util/iptables", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/version:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - "//vendor/k8s.io/utils/trace:go_default_library", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "//conditions:default": [], - }), -) - -go_test( - name = "go_default_test", - srcs = [ - "iptables_test.go", - "monitor_test.go", - "save_restore_test.go", - ], - embed = [":go_default_library"], - deps = select({ - "@io_bazel_rules_go//go/platform:android": [ - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/version:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - "//vendor/k8s.io/utils/exec/testing:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/version:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - "//vendor/k8s.io/utils/exec/testing:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/util/iptables/testing:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/util/iptables/iptables.go b/vendor/k8s.io/kubernetes/pkg/util/iptables/iptables.go index 69c262bb345c..d8c5cc670541 100644 --- a/vendor/k8s.io/kubernetes/pkg/util/iptables/iptables.go +++ b/vendor/k8s.io/kubernetes/pkg/util/iptables/iptables.go @@ -51,6 +51,9 @@ type Interface interface { FlushChain(table Table, chain Chain) error // DeleteChain deletes the specified chain. If the chain did not exist, return error. DeleteChain(table Table, chain Chain) error + // ChainExists tests whether the specified chain exists, returning an error if it + // does not, or if it is unable to check. + ChainExists(table Table, chain Chain) (bool, error) // EnsureRule checks if the specified rule is present and, if not, creates it. If the rule existed, return true. EnsureRule(position RulePosition, table Table, chain Chain, args ...string) (bool, error) // DeleteRule checks if the specified rule is present and, if so, deletes it. @@ -570,7 +573,7 @@ func (runner *runner) Monitor(canary Chain, tables []Table, reloadFunc func(), i // Poll until stopCh is closed or iptables is flushed err := utilwait.PollUntil(interval, func() (bool, error) { - if exists, err := runner.chainExists(tables[0], canary); exists { + if exists, err := runner.ChainExists(tables[0], canary); exists { return false, nil } else if isResourceError(err) { klog.Warningf("Could not check for iptables canary %s/%s: %v", string(tables[0]), string(canary), err) @@ -582,7 +585,7 @@ func (runner *runner) Monitor(canary Chain, tables []Table, reloadFunc func(), i // so we don't start reloading too soon. err := utilwait.PollImmediate(iptablesFlushPollTime, iptablesFlushTimeout, func() (bool, error) { for i := 1; i < len(tables); i++ { - if exists, err := runner.chainExists(tables[i], canary); exists || isResourceError(err) { + if exists, err := runner.ChainExists(tables[i], canary); exists || isResourceError(err) { return false, nil } } @@ -607,15 +610,14 @@ func (runner *runner) Monitor(canary Chain, tables []Table, reloadFunc func(), i } } -// chainExists is used internally by Monitor; none of the public Interface methods can be -// used to distinguish "chain exists" from "chain does not exist" with no side effects -func (runner *runner) chainExists(table Table, chain Chain) (bool, error) { +// ChainExists is part of Interface +func (runner *runner) ChainExists(table Table, chain Chain) (bool, error) { fullArgs := makeFullArgs(table, chain) runner.mu.Lock() defer runner.mu.Unlock() - trace := utiltrace.New("iptables Monitor CANARY check") + trace := utiltrace.New("iptables ChainExists") defer trace.LogIfLong(2 * time.Second) _, err := runner.run(opListChain, fullArgs) diff --git a/vendor/k8s.io/kubernetes/pkg/util/ipvs/BUILD b/vendor/k8s.io/kubernetes/pkg/util/ipvs/BUILD deleted file mode 100644 index ddc7c45e917a..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/util/ipvs/BUILD +++ /dev/null @@ -1,110 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "ipvs_linux_test.go", - "ipvs_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/version:go_default_library", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "//vendor/github.com/moby/ipvs:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//vendor/github.com/moby/ipvs:go_default_library", - ], - "//conditions:default": [], - }), -) - -go_library( - name = "go_default_library", - srcs = [ - "ipvs.go", - "ipvs_linux.go", - "ipvs_unsupported.go", - "kernelcheck_unsupported.go", - ], - importpath = "k8s.io/kubernetes/pkg/util/ipvs", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/version:go_default_library", - ] + select({ - "@io_bazel_rules_go//go/platform:aix": [ - "//vendor/k8s.io/utils/exec:go_default_library", - ], - "@io_bazel_rules_go//go/platform:android": [ - "//vendor/github.com/moby/ipvs:go_default_library", - "//vendor/github.com/pkg/errors:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "//vendor/k8s.io/utils/exec:go_default_library", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "//vendor/k8s.io/utils/exec:go_default_library", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "//vendor/k8s.io/utils/exec:go_default_library", - ], - "@io_bazel_rules_go//go/platform:illumos": [ - "//vendor/k8s.io/utils/exec:go_default_library", - ], - "@io_bazel_rules_go//go/platform:ios": [ - "//vendor/k8s.io/utils/exec:go_default_library", - ], - "@io_bazel_rules_go//go/platform:js": [ - "//vendor/k8s.io/utils/exec:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//vendor/github.com/moby/ipvs:go_default_library", - "//vendor/github.com/pkg/errors:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "//vendor/k8s.io/utils/exec:go_default_library", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "//vendor/k8s.io/utils/exec:go_default_library", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "//vendor/k8s.io/utils/exec:go_default_library", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "//vendor/k8s.io/utils/exec:go_default_library", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "//vendor/k8s.io/utils/exec:go_default_library", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "//vendor/k8s.io/utils/exec:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/util/ipvs/testing:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/util/labels/BUILD b/vendor/k8s.io/kubernetes/pkg/util/labels/BUILD deleted file mode 100644 index bee6edb7249d..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/util/labels/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "labels.go", - ], - importpath = "k8s.io/kubernetes/pkg/util/labels", - deps = ["//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library"], -) - -go_test( - name = "go_default_test", - srcs = ["labels_test.go"], - embed = [":go_default_library"], - deps = ["//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/util/maps/BUILD b/vendor/k8s.io/kubernetes/pkg/util/maps/BUILD deleted file mode 100644 index 3c63137f084f..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/util/maps/BUILD +++ /dev/null @@ -1,28 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "string.go", - ], - importpath = "k8s.io/kubernetes/pkg/util/maps", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/util/netsh/BUILD b/vendor/k8s.io/kubernetes/pkg/util/netsh/BUILD deleted file mode 100644 index a98e15e56960..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/util/netsh/BUILD +++ /dev/null @@ -1,48 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "netsh.go", - ], - importpath = "k8s.io/kubernetes/pkg/util/netsh", - deps = [ - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/util/netsh/testing:all-srcs", - ], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["netsh_test.go"], - embed = [":go_default_library"], - deps = [ - "//vendor/github.com/pkg/errors:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - "//vendor/k8s.io/utils/exec/testing:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/util/node/BUILD b/vendor/k8s.io/kubernetes/pkg/util/node/BUILD deleted file mode 100644 index 1ebde8e50731..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/util/node/BUILD +++ /dev/null @@ -1,53 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["node.go"], - importpath = "k8s.io/kubernetes/pkg/util/node", - deps = [ - "//pkg/features:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["node_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/features:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/util/node/node.go b/vendor/k8s.io/kubernetes/pkg/util/node/node.go index e075ef4a5904..1f0e2f0f56cb 100644 --- a/vendor/k8s.io/kubernetes/pkg/util/node/node.go +++ b/vendor/k8s.io/kubernetes/pkg/util/node/node.go @@ -174,41 +174,6 @@ func GetNodeIP(client clientset.Interface, name string) net.IP { return nodeIP } -// GetZoneKey is a helper function that builds a string identifier that is unique per failure-zone; -// it returns empty-string for no zone. -// Since there are currently two separate zone keys: -// * "failure-domain.beta.kubernetes.io/zone" -// * "topology.kubernetes.io/zone" -// GetZoneKey will first check failure-domain.beta.kubernetes.io/zone and if not exists, will then check -// topology.kubernetes.io/zone -func GetZoneKey(node *v1.Node) string { - labels := node.Labels - if labels == nil { - return "" - } - - // TODO: prefer stable labels for zone in v1.18 - zone, ok := labels[v1.LabelFailureDomainBetaZone] - if !ok { - zone, _ = labels[v1.LabelTopologyZone] - } - - // TODO: prefer stable labels for region in v1.18 - region, ok := labels[v1.LabelFailureDomainBetaRegion] - if !ok { - region, _ = labels[v1.LabelTopologyRegion] - } - - if region == "" && zone == "" { - return "" - } - - // We include the null character just in case region or failureDomain has a colon - // (We do assume there's no null characters in a region or failureDomain) - // As a nice side-benefit, the null character is not printed by fmt.Print or glog - return region + ":\x00:" + zone -} - type nodeForConditionPatch struct { Status nodeStatusForPatch `json:"status"` } diff --git a/vendor/k8s.io/kubernetes/pkg/util/oom/BUILD b/vendor/k8s.io/kubernetes/pkg/util/oom/BUILD deleted file mode 100644 index 252d192b0df9..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/util/oom/BUILD +++ /dev/null @@ -1,60 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "oom.go", - "oom_fake.go", - "oom_linux.go", - "oom_unsupported.go", - ], - importpath = "k8s.io/kubernetes/pkg/util/oom", - deps = select({ - "@io_bazel_rules_go//go/platform:android": [ - "//pkg/kubelet/cm/util:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//pkg/kubelet/cm/util:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], - "//conditions:default": [], - }), -) - -go_test( - name = "go_default_test", - srcs = ["oom_linux_test.go"], - embed = [":go_default_library"], - deps = select({ - "@io_bazel_rules_go//go/platform:android": [ - "//vendor/github.com/opencontainers/runc/libcontainer/cgroups:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//vendor/github.com/opencontainers/runc/libcontainer/cgroups:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/util/parsers/BUILD b/vendor/k8s.io/kubernetes/pkg/util/parsers/BUILD deleted file mode 100644 index b78af091ee49..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/util/parsers/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["parsers.go"], - importpath = "k8s.io/kubernetes/pkg/util/parsers", - deps = ["//vendor/github.com/docker/distribution/reference:go_default_library"], -) - -go_test( - name = "go_default_test", - srcs = ["parsers_test.go"], - embed = [":go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/util/pod/BUILD b/vendor/k8s.io/kubernetes/pkg/util/pod/BUILD deleted file mode 100644 index 19dadbd6f861..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/util/pod/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["pod.go"], - importpath = "k8s.io/kubernetes/pkg/util/pod", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["pod_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/util/procfs/BUILD b/vendor/k8s.io/kubernetes/pkg/util/procfs/BUILD deleted file mode 100644 index 13de800b1b7d..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/util/procfs/BUILD +++ /dev/null @@ -1,61 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "procfs.go", - "procfs_fake.go", - "procfs_linux.go", - "procfs_unsupported.go", - ], - importpath = "k8s.io/kubernetes/pkg/util/procfs", - deps = select({ - "@io_bazel_rules_go//go/platform:android": [ - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], - "//conditions:default": [], - }), -) - -go_test( - name = "go_default_test", - srcs = ["procfs_linux_test.go"], - data = [ - "example_proc_cgroup", - ], - embed = [":go_default_library"], - deps = select({ - "@io_bazel_rules_go//go/platform:android": [ - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/util/removeall/BUILD b/vendor/k8s.io/kubernetes/pkg/util/removeall/BUILD deleted file mode 100644 index f5b54ea903c1..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/util/removeall/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["removeall_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/client-go/util/testing:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["removeall.go"], - importpath = "k8s.io/kubernetes/pkg/util/removeall", - deps = ["//staging/src/k8s.io/mount-utils:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/util/resizefs/BUILD b/vendor/k8s.io/kubernetes/pkg/util/resizefs/BUILD deleted file mode 100644 index 19f011b181a6..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/util/resizefs/BUILD +++ /dev/null @@ -1,75 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "resizefs_linux.go", - "resizefs_unsupported.go", - ], - importpath = "k8s.io/kubernetes/pkg/util/resizefs", - visibility = ["//visibility:public"], - deps = select({ - "@io_bazel_rules_go//go/platform:aix": [ - "//staging/src/k8s.io/mount-utils:go_default_library", - ], - "@io_bazel_rules_go//go/platform:android": [ - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "//staging/src/k8s.io/mount-utils:go_default_library", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "//staging/src/k8s.io/mount-utils:go_default_library", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "//staging/src/k8s.io/mount-utils:go_default_library", - ], - "@io_bazel_rules_go//go/platform:illumos": [ - "//staging/src/k8s.io/mount-utils:go_default_library", - ], - "@io_bazel_rules_go//go/platform:ios": [ - "//staging/src/k8s.io/mount-utils:go_default_library", - ], - "@io_bazel_rules_go//go/platform:js": [ - "//staging/src/k8s.io/mount-utils:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "//staging/src/k8s.io/mount-utils:go_default_library", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "//staging/src/k8s.io/mount-utils:go_default_library", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "//staging/src/k8s.io/mount-utils:go_default_library", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "//staging/src/k8s.io/mount-utils:go_default_library", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "//staging/src/k8s.io/mount-utils:go_default_library", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "//staging/src/k8s.io/mount-utils:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/util/resizefs/resizefs_linux.go b/vendor/k8s.io/kubernetes/pkg/util/resizefs/resizefs_linux.go deleted file mode 100644 index db47cacaa4aa..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/util/resizefs/resizefs_linux.go +++ /dev/null @@ -1,86 +0,0 @@ -// +build linux - -/* -Copyright 2017 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package resizefs - -import ( - "fmt" - - "k8s.io/klog/v2" - "k8s.io/mount-utils" -) - -// ResizeFs Provides support for resizing file systems -type ResizeFs struct { - mounter *mount.SafeFormatAndMount -} - -// NewResizeFs returns new instance of resizer -func NewResizeFs(mounter *mount.SafeFormatAndMount) *ResizeFs { - return &ResizeFs{mounter: mounter} -} - -// Resize perform resize of file system -func (resizefs *ResizeFs) Resize(devicePath string, deviceMountPath string) (bool, error) { - format, err := resizefs.mounter.GetDiskFormat(devicePath) - - if err != nil { - formatErr := fmt.Errorf("ResizeFS.Resize - error checking format for device %s: %v", devicePath, err) - return false, formatErr - } - - // If disk has no format, there is no need to resize the disk because mkfs.* - // by default will use whole disk anyways. - if format == "" { - return false, nil - } - - klog.V(3).Infof("ResizeFS.Resize - Expanding mounted volume %s", devicePath) - switch format { - case "ext3", "ext4": - return resizefs.extResize(devicePath) - case "xfs": - return resizefs.xfsResize(deviceMountPath) - } - return false, fmt.Errorf("ResizeFS.Resize - resize of format %s is not supported for device %s mounted at %s", format, devicePath, deviceMountPath) -} - -func (resizefs *ResizeFs) extResize(devicePath string) (bool, error) { - output, err := resizefs.mounter.Exec.Command("resize2fs", devicePath).CombinedOutput() - if err == nil { - klog.V(2).Infof("Device %s resized successfully", devicePath) - return true, nil - } - - resizeError := fmt.Errorf("resize of device %s failed: %v. resize2fs output: %s", devicePath, err, string(output)) - return false, resizeError - -} - -func (resizefs *ResizeFs) xfsResize(deviceMountPath string) (bool, error) { - args := []string{"-d", deviceMountPath} - output, err := resizefs.mounter.Exec.Command("xfs_growfs", args...).CombinedOutput() - - if err == nil { - klog.V(2).Infof("Device %s resized successfully", deviceMountPath) - return true, nil - } - - resizeError := fmt.Errorf("resize of device %s failed: %v. xfs_growfs output: %s", deviceMountPath, err, string(output)) - return false, resizeError -} diff --git a/vendor/k8s.io/kubernetes/pkg/util/rlimit/BUILD b/vendor/k8s.io/kubernetes/pkg/util/rlimit/BUILD deleted file mode 100644 index a151bcea398e..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/util/rlimit/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "rlimit_linux.go", - "rlimit_unsupported.go", - ], - importpath = "k8s.io/kubernetes/pkg/util/rlimit", - deps = select({ - "@io_bazel_rules_go//go/platform:android": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/util/selinux/BUILD b/vendor/k8s.io/kubernetes/pkg/util/selinux/BUILD deleted file mode 100644 index f77447b4d329..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/util/selinux/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "selinux.go", - "selinux_linux.go", - "selinux_unsupported.go", - ], - importpath = "k8s.io/kubernetes/pkg/util/selinux", - deps = select({ - "@io_bazel_rules_go//go/platform:android": [ - "//vendor/github.com/opencontainers/selinux/go-selinux:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//vendor/github.com/opencontainers/selinux/go-selinux:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/util/slice/BUILD b/vendor/k8s.io/kubernetes/pkg/util/slice/BUILD deleted file mode 100644 index 9b83415e5ac8..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/util/slice/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["slice.go"], - importpath = "k8s.io/kubernetes/pkg/util/slice", -) - -go_test( - name = "go_default_test", - srcs = ["slice_test.go"], - embed = [":go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/util/sysctl/BUILD b/vendor/k8s.io/kubernetes/pkg/util/sysctl/BUILD deleted file mode 100644 index 77d699884cc3..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/util/sysctl/BUILD +++ /dev/null @@ -1,28 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["sysctl.go"], - importpath = "k8s.io/kubernetes/pkg/util/sysctl", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/util/sysctl/testing:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/util/tail/BUILD b/vendor/k8s.io/kubernetes/pkg/util/tail/BUILD deleted file mode 100644 index 5c1b261c75b2..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/util/tail/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["tail_test.go"], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = ["tail.go"], - importpath = "k8s.io/kubernetes/pkg/util/tail", -) diff --git a/vendor/k8s.io/kubernetes/pkg/util/taints/BUILD b/vendor/k8s.io/kubernetes/pkg/util/taints/BUILD deleted file mode 100644 index 1409f61e8f1c..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/util/taints/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["taints.go"], - importpath = "k8s.io/kubernetes/pkg/util/taints", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/helper:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["taints_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//vendor/github.com/spf13/pflag:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/util/taints/taints.go b/vendor/k8s.io/kubernetes/pkg/util/taints/taints.go index a3eaca370366..3d7d560506ff 100644 --- a/vendor/k8s.io/kubernetes/pkg/util/taints/taints.go +++ b/vendor/k8s.io/kubernetes/pkg/util/taints/taints.go @@ -192,7 +192,7 @@ func deleteTaints(taintsToRemove []v1.Taint, newTaints *[]v1.Taint) ([]error, bo allErrs := []error{} var removed bool for _, taintToRemove := range taintsToRemove { - removed = false + removed = false // nolint:ineffassign if len(taintToRemove.Effect) > 0 { *newTaints, removed = DeleteTaint(*newTaints, &taintToRemove) } else { diff --git a/vendor/k8s.io/kubernetes/pkg/util/tolerations/BUILD b/vendor/k8s.io/kubernetes/pkg/util/tolerations/BUILD deleted file mode 100644 index 54e2e33d8057..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/util/tolerations/BUILD +++ /dev/null @@ -1,48 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "tolerations.go", - ], - importpath = "k8s.io/kubernetes/pkg/util/tolerations", - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["tolerations_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/BUILD deleted file mode 100644 index d92b63ec5e7f..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/BUILD +++ /dev/null @@ -1,134 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "metrics_cached.go", - "metrics_du.go", - "metrics_errors.go", - "metrics_nil.go", - "metrics_statfs.go", - "noop_expandable_plugin.go", - "plugins.go", - "volume.go", - "volume_linux.go", - "volume_unsupported.go", - ], - importpath = "k8s.io/kubernetes/pkg/volume", - visibility = ["//visibility:public"], - deps = [ - "//pkg/proxy/util:go_default_library", - "//pkg/volume/util/fs:go_default_library", - "//pkg/volume/util/hostutil:go_default_library", - "//pkg/volume/util/recyclerclient:go_default_library", - "//pkg/volume/util/subpath:go_default_library", - "//staging/src/k8s.io/api/authentication/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/storage/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/cloud-provider:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "//pkg/features:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//pkg/features:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - ], - "//conditions:default": [], - }), -) - -go_test( - name = "go_default_test", - srcs = [ - "metrics_du_test.go", - "metrics_nil_test.go", - "metrics_statfs_test.go", - "plugins_test.go", - "volume_linux_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/volume/testing:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/client-go/util/testing:go_default_library", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "//pkg/features:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//pkg/features:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/volume/awsebs:all-srcs", - "//pkg/volume/azure_file:all-srcs", - "//pkg/volume/azuredd:all-srcs", - "//pkg/volume/cephfs:all-srcs", - "//pkg/volume/cinder:all-srcs", - "//pkg/volume/configmap:all-srcs", - "//pkg/volume/csi:all-srcs", - "//pkg/volume/csimigration:all-srcs", - "//pkg/volume/downwardapi:all-srcs", - "//pkg/volume/emptydir:all-srcs", - "//pkg/volume/fc:all-srcs", - "//pkg/volume/flexvolume:all-srcs", - "//pkg/volume/flocker:all-srcs", - "//pkg/volume/gcepd:all-srcs", - "//pkg/volume/git_repo:all-srcs", - "//pkg/volume/glusterfs:all-srcs", - "//pkg/volume/hostpath:all-srcs", - "//pkg/volume/iscsi:all-srcs", - "//pkg/volume/local:all-srcs", - "//pkg/volume/nfs:all-srcs", - "//pkg/volume/portworx:all-srcs", - "//pkg/volume/projected:all-srcs", - "//pkg/volume/quobyte:all-srcs", - "//pkg/volume/rbd:all-srcs", - "//pkg/volume/scaleio:all-srcs", - "//pkg/volume/secret:all-srcs", - "//pkg/volume/storageos:all-srcs", - "//pkg/volume/testing:all-srcs", - "//pkg/volume/util:all-srcs", - "//pkg/volume/validation:all-srcs", - "//pkg/volume/vsphere_volume:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/awsebs/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/awsebs/BUILD deleted file mode 100644 index 47cf8e4571d5..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/awsebs/BUILD +++ /dev/null @@ -1,76 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "attacher.go", - "attacher_linux.go", - "attacher_unsupported.go", - "attacher_windows.go", - "aws_ebs.go", - "aws_ebs_block.go", - "aws_util.go", - "doc.go", - ], - importpath = "k8s.io/kubernetes/pkg/volume/awsebs", - deps = [ - "//pkg/volume:go_default_library", - "//pkg/volume/util:go_default_library", - "//pkg/volume/util/volumepathhandler:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/cloud-provider:go_default_library", - "//staging/src/k8s.io/cloud-provider/volume/helpers:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/aws:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/strings:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "attacher_test.go", - "aws_ebs_block_test.go", - "aws_ebs_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/volume:go_default_library", - "//pkg/volume/testing:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/util/testing:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/aws:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/awsebs/aws_util.go b/vendor/k8s.io/kubernetes/pkg/volume/awsebs/aws_util.go index 4a3ae61e9558..e5f8e7fc6132 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/awsebs/aws_util.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/awsebs/aws_util.go @@ -41,8 +41,9 @@ import ( ) const ( - diskPartitionSuffix = "" - checkSleepDuration = time.Second + diskPartitionSuffix = "" + nvmeDiskPartitionSuffix = "p" + checkSleepDuration = time.Second ) // AWSDiskUtil provides operations for EBS volume. @@ -240,6 +241,9 @@ func getDiskByIDPaths(volumeID aws.KubernetesVolumeID, partition string, deviceP if err != nil { klog.Warningf("error looking for nvme volume %q: %v", volumeID, err) } else if nvmePath != "" { + if partition != "" { + nvmePath = nvmePath + nvmeDiskPartitionSuffix + partition + } devicePaths = append(devicePaths, nvmePath) } } diff --git a/vendor/k8s.io/kubernetes/pkg/volume/azure_file/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/azure_file/BUILD deleted file mode 100644 index 9d7daa2ce379..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/azure_file/BUILD +++ /dev/null @@ -1,63 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "azure_file.go", - "azure_provision.go", - "azure_util.go", - "doc.go", - ], - importpath = "k8s.io/kubernetes/pkg/volume/azure_file", - visibility = ["//visibility:public"], - deps = [ - "//pkg/volume:go_default_library", - "//pkg/volume/util:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/cloud-provider:go_default_library", - "//staging/src/k8s.io/cloud-provider/volume/helpers:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/fileclient:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/storage/mgmt/2019-06-01/storage:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/strings:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["azure_file_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/volume:go_default_library", - "//pkg/volume/testing:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/cloud-provider/fake:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/to:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/azure_file/azure_file.go b/vendor/k8s.io/kubernetes/pkg/volume/azure_file/azure_file.go index 5723a44a48bd..77196a15e6ca 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/azure_file/azure_file.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/azure_file/azure_file.go @@ -55,7 +55,8 @@ var _ volume.PersistentVolumePlugin = &azureFilePlugin{} var _ volume.ExpandableVolumePlugin = &azureFilePlugin{} const ( - azureFilePluginName = "kubernetes.io/azure-file" + azureFilePluginName = "kubernetes.io/azure-file" + minimumPremiumShareSize = 100 // GB ) func getPath(uid types.UID, volName string, host volume.VolumeHost) string { diff --git a/vendor/k8s.io/kubernetes/pkg/volume/azure_file/azure_provision.go b/vendor/k8s.io/kubernetes/pkg/volume/azure_file/azure_provision.go index d547fc6e9b03..57e8cd17110c 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/azure_file/azure_provision.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/azure_file/azure_provision.go @@ -207,10 +207,15 @@ func (a *azureFileProvisioner) Provision(selectedNode *v1.Node, allowedTopologie resourceGroup = a.options.PVC.ObjectMeta.Annotations[resourceGroupAnnotation] } + fileShareSize := int(requestGiB) // when use azure file premium, account kind should be specified as FileStorage accountKind := string(storage.StorageV2) if strings.HasPrefix(strings.ToLower(sku), "premium") { accountKind = string(storage.FileStorage) + // when using azure file premium, the shares have a minimum size + if fileShareSize < minimumPremiumShareSize { + fileShareSize = minimumPremiumShareSize + } } accountOptions := &azure.AccountOptions{ @@ -225,7 +230,7 @@ func (a *azureFileProvisioner) Provision(selectedNode *v1.Node, allowedTopologie shareOptions := &fileclient.ShareOptions{ Name: shareName, Protocol: storage.SMB, - RequestGiB: requestGiB, + RequestGiB: fileShareSize, } account, key, err := a.azureProvider.CreateFileShare(accountOptions, shareOptions) @@ -252,7 +257,7 @@ func (a *azureFileProvisioner) Provision(selectedNode *v1.Node, allowedTopologie PersistentVolumeReclaimPolicy: a.options.PersistentVolumeReclaimPolicy, AccessModes: a.options.PVC.Spec.AccessModes, Capacity: v1.ResourceList{ - v1.ResourceName(v1.ResourceStorage): resource.MustParse(fmt.Sprintf("%dGi", requestGiB)), + v1.ResourceName(v1.ResourceStorage): resource.MustParse(fmt.Sprintf("%dGi", fileShareSize)), }, PersistentVolumeSource: v1.PersistentVolumeSource{ AzureFile: &v1.AzureFilePersistentVolumeSource{ diff --git a/vendor/k8s.io/kubernetes/pkg/volume/azure_file/azure_util.go b/vendor/k8s.io/kubernetes/pkg/volume/azure_file/azure_util.go index eab56cb563b4..017f1ac22069 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/azure_file/azure_util.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/azure_file/azure_util.go @@ -34,9 +34,12 @@ const ( dirMode = "dir_mode" gid = "gid" vers = "vers" + actimeo = "actimeo" + mfsymlinks = "mfsymlinks" defaultFileMode = "0777" defaultDirMode = "0777" defaultVers = "3.0" + defaultActimeo = "30" ) // Abstract interface to azure file operations. @@ -106,6 +109,8 @@ func appendDefaultMountOptions(mountOptions []string, fsGroup *int64) []string { dirModeFlag := false versFlag := false gidFlag := false + actimeoFlag := false + mfsymlinksFlag := false for _, mountOption := range mountOptions { if strings.HasPrefix(mountOption, fileMode) { @@ -120,6 +125,12 @@ func appendDefaultMountOptions(mountOptions []string, fsGroup *int64) []string { if strings.HasPrefix(mountOption, gid) { gidFlag = true } + if strings.HasPrefix(mountOption, actimeo) { + actimeoFlag = true + } + if strings.HasPrefix(mountOption, mfsymlinks) { + mfsymlinksFlag = true + } } allMountOptions := mountOptions @@ -138,5 +149,13 @@ func appendDefaultMountOptions(mountOptions []string, fsGroup *int64) []string { if !gidFlag && fsGroup != nil { allMountOptions = append(allMountOptions, fmt.Sprintf("%s=%d", gid, *fsGroup)) } + + if !actimeoFlag { + allMountOptions = append(allMountOptions, fmt.Sprintf("%s=%s", actimeo, defaultActimeo)) + } + + if !mfsymlinksFlag { + allMountOptions = append(allMountOptions, mfsymlinks) + } return allMountOptions } diff --git a/vendor/k8s.io/kubernetes/pkg/volume/azuredd/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/azuredd/BUILD deleted file mode 100644 index c37196f05ca0..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/azuredd/BUILD +++ /dev/null @@ -1,128 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "attacher.go", - "azure_common.go", - "azure_common_linux.go", - "azure_common_unsupported.go", - "azure_common_windows.go", - "azure_dd.go", - "azure_dd_block.go", - "azure_dd_max_disk_count.go", - "azure_mounter.go", - "azure_provision.go", - "doc.go", - ], - importpath = "k8s.io/kubernetes/pkg/volume/azuredd", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/util:go_default_library", - "//pkg/volume/util/volumepathhandler:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/cloud-provider:go_default_library", - "//staging/src/k8s.io/cloud-provider/volume/helpers:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/storage/mgmt/2019-06-01/storage:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/strings:go_default_library", - ] + select({ - "@io_bazel_rules_go//go/platform:aix": [ - "//vendor/k8s.io/utils/exec:go_default_library", - ], - "@io_bazel_rules_go//go/platform:android": [ - "//vendor/k8s.io/utils/exec:go_default_library", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "//vendor/k8s.io/utils/exec:go_default_library", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "//vendor/k8s.io/utils/exec:go_default_library", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "//vendor/k8s.io/utils/exec:go_default_library", - ], - "@io_bazel_rules_go//go/platform:illumos": [ - "//vendor/k8s.io/utils/exec:go_default_library", - ], - "@io_bazel_rules_go//go/platform:ios": [ - "//vendor/k8s.io/utils/exec:go_default_library", - ], - "@io_bazel_rules_go//go/platform:js": [ - "//vendor/k8s.io/utils/exec:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//vendor/k8s.io/utils/exec:go_default_library", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "//vendor/k8s.io/utils/exec:go_default_library", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "//vendor/k8s.io/utils/exec:go_default_library", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "//vendor/k8s.io/utils/exec:go_default_library", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "//vendor/k8s.io/utils/exec:go_default_library", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "//vendor/k8s.io/utils/exec:go_default_library", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "//vendor/k8s.io/utils/exec:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = [ - "attacher_test.go", - "azure_common_test.go", - "azure_dd_block_test.go", - "azure_dd_test.go", - "azure_provision_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/volume:go_default_library", - "//pkg/volume/testing:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/client-go/util/testing:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/azuredd/azure_mounter.go b/vendor/k8s.io/kubernetes/pkg/volume/azuredd/azure_mounter.go index d197d2b11ac4..84bfb019f367 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/azuredd/azure_mounter.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/azuredd/azure_mounter.go @@ -102,7 +102,6 @@ func (m *azureDiskMounter) SetUpAt(dir string, mounterArgs volume.MounterArgs) e klog.Errorf("azureDisk - Unmount directory %s failed with %v", dir, err) return err } - mountPoint = true } if runtime.GOOS != "windows" { diff --git a/vendor/k8s.io/kubernetes/pkg/volume/cephfs/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/cephfs/BUILD deleted file mode 100644 index a6366ca5b0c6..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/cephfs/BUILD +++ /dev/null @@ -1,53 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "cephfs.go", - "doc.go", - ], - importpath = "k8s.io/kubernetes/pkg/volume/cephfs", - deps = [ - "//pkg/volume:go_default_library", - "//pkg/volume/util:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/strings:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["cephfs_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/volume:go_default_library", - "//pkg/volume/testing:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/client-go/util/testing:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/cinder/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/cinder/BUILD deleted file mode 100644 index be71a643ea6a..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/cinder/BUILD +++ /dev/null @@ -1,76 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "attacher.go", - "cinder.go", - "cinder_block.go", - "cinder_util.go", - "doc.go", - ], - importpath = "k8s.io/kubernetes/pkg/volume/cinder", - deps = [ - "//pkg/volume:go_default_library", - "//pkg/volume/util:go_default_library", - "//pkg/volume/util/volumepathhandler:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/cloud-provider:go_default_library", - "//staging/src/k8s.io/cloud-provider/volume/helpers:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/openstack:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - "//vendor/k8s.io/utils/keymutex:go_default_library", - "//vendor/k8s.io/utils/strings:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "attacher_test.go", - "cinder_block_test.go", - "cinder_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/volume:go_default_library", - "//pkg/volume/testing:go_default_library", - "//pkg/volume/util:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/client-go/util/testing:go_default_library", - "//staging/src/k8s.io/cloud-provider:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/openstack:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/cinder/cinder_util.go b/vendor/k8s.io/kubernetes/pkg/volume/cinder/cinder_util.go index ba75cb2573ac..734c6abe60c4 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/cinder/cinder_util.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/cinder/cinder_util.go @@ -156,7 +156,7 @@ func getZonesFromNodes(kubeClient clientset.Interface) (sets.String, error) { return zones, err } for _, node := range nodes.Items { - if zone, ok := node.Labels[v1.LabelFailureDomainBetaZone]; ok { + if zone, ok := node.Labels[v1.LabelTopologyZone]; ok { zones.Insert(zone) } } @@ -229,10 +229,10 @@ func (util *DiskUtil) CreateVolume(c *cinderVolumeProvisioner, node *v1.Node, al volumeLabels = make(map[string]string) if IgnoreVolumeAZ == false { if volumeAZ != "" { - volumeLabels[v1.LabelFailureDomainBetaZone] = volumeAZ + volumeLabels[v1.LabelTopologyZone] = volumeAZ } if volumeRegion != "" { - volumeLabels[v1.LabelFailureDomainBetaRegion] = volumeRegion + volumeLabels[v1.LabelTopologyRegion] = volumeRegion } } return volumeID, volSizeGiB, volumeLabels, fstype, nil diff --git a/vendor/k8s.io/kubernetes/pkg/volume/configmap/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/configmap/BUILD deleted file mode 100644 index 2d1ab6d1e153..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/configmap/BUILD +++ /dev/null @@ -1,57 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "configmap.go", - "doc.go", - ], - importpath = "k8s.io/kubernetes/pkg/volume/configmap", - deps = [ - "//pkg/volume:go_default_library", - "//pkg/volume/util:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/strings:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["configmap_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/volume:go_default_library", - "//pkg/volume/emptydir:go_default_library", - "//pkg/volume/testing:go_default_library", - "//pkg/volume/util:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/csi/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/csi/BUILD deleted file mode 100644 index 62123c8ef55f..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/csi/BUILD +++ /dev/null @@ -1,121 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "csi_attacher.go", - "csi_block.go", - "csi_client.go", - "csi_drivers_store.go", - "csi_metrics.go", - "csi_mounter.go", - "csi_plugin.go", - "csi_util.go", - "expander.go", - ], - importpath = "k8s.io/kubernetes/pkg/volume/csi", - visibility = ["//visibility:public"], - deps = [ - "//pkg/features:go_default_library", - "//pkg/util/removeall:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/csi/nodeinfomanager:go_default_library", - "//pkg/volume/util:go_default_library", - "//pkg/volume/util/types:go_default_library", - "//staging/src/k8s.io/api/authentication/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/storage/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/version:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/storage/v1:go_default_library", - "//staging/src/k8s.io/csi-translation-lib/plugins:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/github.com/container-storage-interface/spec/lib/go/csi:go_default_library", - "//vendor/google.golang.org/grpc:go_default_library", - "//vendor/google.golang.org/grpc/codes:go_default_library", - "//vendor/google.golang.org/grpc/status:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/strings:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "csi_attacher_test.go", - "csi_block_test.go", - "csi_client_test.go", - "csi_drivers_store_test.go", - "csi_metrics_test.go", - "csi_mounter_test.go", - "csi_plugin_test.go", - "csi_test.go", - "csi_util_test.go", - "expander_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/authentication/v1:go_default_library", - "//pkg/apis/core/v1:go_default_library", - "//pkg/apis/storage/v1:go_default_library", - "//pkg/features:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/csi/fake:go_default_library", - "//pkg/volume/testing:go_default_library", - "//pkg/volume/util:go_default_library", - "//pkg/volume/util/types:go_default_library", - "//staging/src/k8s.io/api/authentication/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/storage/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/informers/storage/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/listers/storage/v1:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - "//staging/src/k8s.io/client-go/util/testing:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - "//vendor/github.com/container-storage-interface/spec/lib/go/csi:go_default_library", - "//vendor/github.com/google/go-cmp/cmp:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/google.golang.org/grpc/codes:go_default_library", - "//vendor/google.golang.org/grpc/status:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/volume/csi/fake:all-srcs", - "//pkg/volume/csi/nodeinfomanager:all-srcs", - "//pkg/volume/csi/testing:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_attacher.go b/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_attacher.go index 18c6c0a7899f..2cb6ec7bc8e8 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_attacher.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_attacher.go @@ -26,6 +26,7 @@ import ( "strings" "time" + "k8s.io/apimachinery/pkg/util/clock" "k8s.io/klog/v2" v1 "k8s.io/api/core/v1" @@ -34,6 +35,7 @@ import ( meta "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/wait" "k8s.io/apimachinery/pkg/watch" "k8s.io/client-go/kubernetes" "k8s.io/kubernetes/pkg/volume" @@ -46,9 +48,9 @@ const ( ) type csiAttacher struct { - plugin *csiPlugin - k8s kubernetes.Interface - waitSleepTime time.Duration + plugin *csiPlugin + k8s kubernetes.Interface + watchTimeout time.Duration csiClient csiClient } @@ -76,52 +78,56 @@ func (c *csiAttacher) Attach(spec *volume.Spec, nodeName types.NodeName) (string node := string(nodeName) attachID := getAttachmentName(pvSrc.VolumeHandle, pvSrc.Driver, node) - var vaSrc storage.VolumeAttachmentSource - if spec.InlineVolumeSpecForCSIMigration { - // inline PV scenario - use PV spec to populate VA source. - // The volume spec will be populated by CSI translation API - // for inline volumes. This allows fields required by the CSI - // attacher such as AccessMode and MountOptions (in addition to - // fields in the CSI persistent volume source) to be populated - // as part of CSI translation for inline volumes. - vaSrc = storage.VolumeAttachmentSource{ - InlineVolumeSpec: &spec.PersistentVolume.Spec, - } - } else { - // regular PV scenario - use PV name to populate VA source - pvName := spec.PersistentVolume.GetName() - vaSrc = storage.VolumeAttachmentSource{ - PersistentVolumeName: &pvName, - } + attachment, err := c.plugin.volumeAttachmentLister.Get(attachID) + if err != nil && !apierrors.IsNotFound(err) { + return "", errors.New(log("failed to get volume attachment from lister: %v", err)) } - attachment := &storage.VolumeAttachment{ - ObjectMeta: meta.ObjectMeta{ - Name: attachID, - }, - Spec: storage.VolumeAttachmentSpec{ - NodeName: node, - Attacher: pvSrc.Driver, - Source: vaSrc, - }, - } + if attachment == nil { + var vaSrc storage.VolumeAttachmentSource + if spec.InlineVolumeSpecForCSIMigration { + // inline PV scenario - use PV spec to populate VA source. + // The volume spec will be populated by CSI translation API + // for inline volumes. This allows fields required by the CSI + // attacher such as AccessMode and MountOptions (in addition to + // fields in the CSI persistent volume source) to be populated + // as part of CSI translation for inline volumes. + vaSrc = storage.VolumeAttachmentSource{ + InlineVolumeSpec: &spec.PersistentVolume.Spec, + } + } else { + // regular PV scenario - use PV name to populate VA source + pvName := spec.PersistentVolume.GetName() + vaSrc = storage.VolumeAttachmentSource{ + PersistentVolumeName: &pvName, + } + } - _, err = c.k8s.StorageV1().VolumeAttachments().Create(context.TODO(), attachment, metav1.CreateOptions{}) - alreadyExist := false - if err != nil { - if !apierrors.IsAlreadyExists(err) { - return "", errors.New(log("attacher.Attach failed: %v", err)) + attachment := &storage.VolumeAttachment{ + ObjectMeta: meta.ObjectMeta{ + Name: attachID, + }, + Spec: storage.VolumeAttachmentSpec{ + NodeName: node, + Attacher: pvSrc.Driver, + Source: vaSrc, + }, } - alreadyExist = true - } - if alreadyExist { - klog.V(4).Info(log("attachment [%v] for volume [%v] already exists (will not be recreated)", attachID, pvSrc.VolumeHandle)) - } else { - klog.V(4).Info(log("attachment [%v] for volume [%v] created successfully", attachID, pvSrc.VolumeHandle)) + _, err = c.k8s.StorageV1().VolumeAttachments().Create(context.TODO(), attachment, metav1.CreateOptions{}) + if err != nil { + if !apierrors.IsAlreadyExists(err) { + return "", errors.New(log("attacher.Attach failed: %v", err)) + } + klog.V(4).Info(log("attachment [%v] for volume [%v] already exists (will not be recreated)", attachID, pvSrc.VolumeHandle)) + } else { + klog.V(4).Info(log("attachment [%v] for volume [%v] created successfully", attachID, pvSrc.VolumeHandle)) + } } - if _, err := c.waitForVolumeAttachment(pvSrc.VolumeHandle, attachID, csiTimeout); err != nil { + // Attach and detach functionality is exclusive to the CSI plugin that runs in the AttachDetachController, + // and has access to a VolumeAttachment lister that can be polled for the current status. + if err := c.waitForVolumeAttachmentWithLister(pvSrc.VolumeHandle, attachID, c.watchTimeout); err != nil { return "", err } @@ -166,6 +172,32 @@ func (c *csiAttacher) waitForVolumeAttachmentInternal(volumeHandle, attachID str return attach.Name, nil } +func (c *csiAttacher) waitForVolumeAttachmentWithLister(volumeHandle, attachID string, timeout time.Duration) error { + klog.V(4).Info(log("probing VolumeAttachment [id=%v]", attachID)) + + verifyStatus := func() (bool, error) { + volumeAttachment, err := c.plugin.volumeAttachmentLister.Get(attachID) + if err != nil { + // Ignore "not found" errors in case the VolumeAttachment was just created and hasn't yet made it into the lister. + if !apierrors.IsNotFound(err) { + klog.Error(log("unexpected error waiting for volume attachment, %v", err)) + return false, err + } + + // The VolumeAttachment is not available yet and we will have to try again. + return false, nil + } + + successful, err := verifyAttachmentStatus(volumeAttachment, volumeHandle) + if err != nil { + return false, err + } + return successful, nil + } + + return c.waitForVolumeAttachDetachStatusWithLister(volumeHandle, attachID, timeout, verifyStatus, "Attach") +} + func (c *csiAttacher) VolumesAreAttached(specs []*volume.Spec, nodeName types.NodeName) (map[*volume.Spec]bool, error) { klog.V(4).Info(log("probing attachment status for %d volume(s) ", len(specs))) @@ -257,7 +289,7 @@ func (c *csiAttacher) MountDevice(spec *volume.Spec, devicePath string, deviceMo } csi := c.csiClient - ctx, cancel := context.WithTimeout(context.Background(), csiTimeout) + ctx, cancel := createCSIOperationContext(spec, c.watchTimeout) defer cancel() // Check whether "STAGE_UNSTAGE_VOLUME" is set stageUnstageSet, err := csi.NodeSupportsStageUnstage(ctx) @@ -296,13 +328,8 @@ func (c *csiAttacher) MountDevice(spec *volume.Spec, devicePath string, deviceMo volDataKey.volHandle: csiSource.VolumeHandle, volDataKey.driverName: csiSource.Driver, } - if err = saveVolumeData(dataDir, volDataFileName, data); err != nil { - klog.Error(log("failed to save volume info data: %v", err)) - if cleanErr := os.RemoveAll(dataDir); cleanErr != nil { - klog.Error(log("failed to remove dir after error [%s]: %v", dataDir, cleanErr)) - } - return err - } + + err = saveVolumeData(dataDir, volDataFileName, data) defer func() { // Only if there was an error and volume operation was considered // finished, we should remove the directory. @@ -315,6 +342,12 @@ func (c *csiAttacher) MountDevice(spec *volume.Spec, devicePath string, deviceMo } }() + if err != nil { + errMsg := log("failed to save volume info data: %v", err) + klog.Error(errMsg) + return errors.New(errMsg) + } + if !stageUnstageSet { klog.Infof(log("attacher.MountDevice STAGE_UNSTAGE_VOLUME capability not set. Skipping MountDevice...")) // defer does *not* remove the metadata file and it's correct - UnmountDevice needs it there. @@ -398,36 +431,70 @@ func (c *csiAttacher) Detach(volumeName string, nodeName types.NodeName) error { } klog.V(4).Info(log("detacher deleted ok VolumeAttachment.ID=%s", attachID)) - err := c.waitForVolumeDetachment(volID, attachID, csiTimeout) - return err -} - -func (c *csiAttacher) waitForVolumeDetachment(volumeHandle, attachID string, timeout time.Duration) error { - klog.V(4).Info(log("probing for updates from CSI driver for [attachment.ID=%v]", attachID)) - - timer := time.NewTimer(timeout) // TODO (vladimirvivien) investigate making this configurable - defer timer.Stop() - return c.waitForVolumeDetachmentInternal(volumeHandle, attachID, timer, timeout) + // Attach and detach functionality is exclusive to the CSI plugin that runs in the AttachDetachController, + // and has access to a VolumeAttachment lister that can be polled for the current status. + return c.waitForVolumeDetachmentWithLister(volID, attachID, c.watchTimeout) } -func (c *csiAttacher) waitForVolumeDetachmentInternal(volumeHandle, attachID string, timer *time.Timer, - timeout time.Duration) error { +func (c *csiAttacher) waitForVolumeDetachmentWithLister(volumeHandle, attachID string, timeout time.Duration) error { klog.V(4).Info(log("probing VolumeAttachment [id=%v]", attachID)) - attach, err := c.k8s.StorageV1().VolumeAttachments().Get(context.TODO(), attachID, meta.GetOptions{}) - if err != nil { - if apierrors.IsNotFound(err) { - //object deleted or never existed, done + + verifyStatus := func() (bool, error) { + volumeAttachment, err := c.plugin.volumeAttachmentLister.Get(attachID) + if err != nil { + if !apierrors.IsNotFound(err) { + return false, errors.New(log("detacher.WaitForDetach failed for volume [%s] (will continue to try): %v", volumeHandle, err)) + } + + // Detachment successful. klog.V(4).Info(log("VolumeAttachment object [%v] for volume [%v] not found, object deleted", attachID, volumeHandle)) - return nil + return true, nil } - return errors.New(log("detacher.WaitForDetach failed for volume [%s] (will continue to try): %v", volumeHandle, err)) + + // Detachment is only "successful" once the VolumeAttachment is deleted, however we perform + // this check to make sure the object does not contain any detach errors. + successful, err := verifyDetachmentStatus(volumeAttachment, volumeHandle) + if err != nil { + return false, err + } + return successful, nil } - err = c.waitForVolumeAttachDetachStatus(attach, volumeHandle, attachID, timer, timeout, verifyDetachmentStatus) - if err != nil { - return err + + return c.waitForVolumeAttachDetachStatusWithLister(volumeHandle, attachID, timeout, verifyStatus, "Detach") +} + +func (c *csiAttacher) waitForVolumeAttachDetachStatusWithLister(volumeHandle, attachID string, timeout time.Duration, verifyStatus func() (bool, error), operation string) error { + var ( + initBackoff = 500 * time.Millisecond + // This is approximately the duration between consecutive ticks after two minutes (CSI timeout). + maxBackoff = 7 * time.Second + resetDuration = time.Minute + backoffFactor = 1.05 + jitter = 0.1 + clock = &clock.RealClock{} + ) + backoffMgr := wait.NewExponentialBackoffManager(initBackoff, maxBackoff, resetDuration, backoffFactor, jitter, clock) + defer backoffMgr.Backoff().Stop() + + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + + for { + select { + case <-backoffMgr.Backoff().C(): + successful, err := verifyStatus() + if err != nil { + return err + } + if successful { + return nil + } + case <-ctx.Done(): + klog.Error(log("%s timeout after %v [volume=%v; attachment.ID=%v]", operation, timeout, volumeHandle, attachID)) + return fmt.Errorf("%s timeout for volume %v", operation, volumeHandle) + } } - return err } func (c *csiAttacher) waitForVolumeAttachDetachStatus(attach *storage.VolumeAttachment, volumeHandle, attachID string, @@ -515,7 +582,8 @@ func (c *csiAttacher) UnmountDevice(deviceMountPath string) error { } csi := c.csiClient - ctx, cancel := context.WithTimeout(context.Background(), csiTimeout) + // could not get whether this is migrated because there is no spec + ctx, cancel := createCSIOperationContext(nil, csiTimeout) defer cancel() // Check whether "STAGE_UNSTAGE_VOLUME" is set stageUnstageSet, err := csi.NodeSupportsStageUnstage(ctx) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_block.go b/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_block.go index e5ca3efec40a..2f1d542237aa 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_block.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_block.go @@ -256,9 +256,6 @@ func (m *csiBlockMapper) publishVolumeForBlock( // SetUpDevice ensures the device is attached returns path where the device is located. func (m *csiBlockMapper) SetUpDevice() (string, error) { - if !m.plugin.blockEnabled { - return "", errors.New("CSIBlockVolume feature not enabled") - } klog.V(4).Infof(log("blockMapper.SetUpDevice called")) // Get csiSource from spec @@ -319,9 +316,6 @@ func (m *csiBlockMapper) SetUpDevice() (string, error) { } func (m *csiBlockMapper) MapPodDevice() (string, error) { - if !m.plugin.blockEnabled { - return "", errors.New("CSIBlockVolume feature not enabled") - } klog.V(4).Infof(log("blockMapper.MapPodDevice called")) // Get csiSource from spec @@ -357,7 +351,7 @@ func (m *csiBlockMapper) MapPodDevice() (string, error) { accessMode = m.spec.PersistentVolume.Spec.AccessModes[0] } - ctx, cancel := context.WithTimeout(context.Background(), csiTimeout) + ctx, cancel := createCSIOperationContext(m.spec, csiTimeout) defer cancel() csiClient, err := m.csiClientGetter.Get() @@ -422,11 +416,7 @@ func (m *csiBlockMapper) unstageVolumeForBlock(ctx context.Context, csi csiClien // TearDownDevice removes traces of the SetUpDevice. func (m *csiBlockMapper) TearDownDevice(globalMapPath, devicePath string) error { - if !m.plugin.blockEnabled { - return errors.New("CSIBlockVolume feature not enabled") - } - - ctx, cancel := context.WithTimeout(context.Background(), csiTimeout) + ctx, cancel := createCSIOperationContext(m.spec, csiTimeout) defer cancel() csiClient, err := m.csiClientGetter.Get() @@ -489,9 +479,6 @@ func (m *csiBlockMapper) cleanupOrphanDeviceFiles() error { // UnmapPodDevice unmaps the block device path. func (m *csiBlockMapper) UnmapPodDevice() error { - if !m.plugin.blockEnabled { - return errors.New("CSIBlockVolume feature not enabled") - } publishPath := m.getPublishPath() csiClient, err := m.csiClientGetter.Get() @@ -499,7 +486,7 @@ func (m *csiBlockMapper) UnmapPodDevice() error { return errors.New(log("blockMapper.UnmapPodDevice failed to get CSI client: %v", err)) } - ctx, cancel := context.WithTimeout(context.Background(), csiTimeout) + ctx, cancel := createCSIOperationContext(m.spec, csiTimeout) defer cancel() // Call NodeUnpublishVolume. diff --git a/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_client.go b/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_client.go index 9c06736f7902..ce75b0bd589c 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_client.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_client.go @@ -30,7 +30,9 @@ import ( "google.golang.org/grpc/status" api "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" + utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/klog/v2" + "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/pkg/volume" volumetypes "k8s.io/kubernetes/pkg/volume/util/types" ) @@ -92,6 +94,7 @@ type csiDriverName string type csiDriverClient struct { driverName csiDriverName addr csiAddr + metricsManager *MetricsManager nodeV1ClientCreator nodeV1ClientCreator } @@ -111,7 +114,7 @@ type csiResizeOptions struct { var _ csiClient = &csiDriverClient{} -type nodeV1ClientCreator func(addr csiAddr) ( +type nodeV1ClientCreator func(addr csiAddr, metricsManager *MetricsManager) ( nodeClient csipbv1.NodeClient, closer io.Closer, err error, @@ -122,9 +125,9 @@ type nodeV1ClientCreator func(addr csiAddr) ( // the gRPC connection when the NodeClient is not used anymore. // This is the default implementation for the nodeV1ClientCreator, used in // newCsiDriverClient. -func newV1NodeClient(addr csiAddr) (nodeClient csipbv1.NodeClient, closer io.Closer, err error) { +func newV1NodeClient(addr csiAddr, metricsManager *MetricsManager) (nodeClient csipbv1.NodeClient, closer io.Closer, err error) { var conn *grpc.ClientConn - conn, err = newGrpcConn(addr) + conn, err = newGrpcConn(addr, metricsManager) if err != nil { return nil, nil, err } @@ -148,6 +151,7 @@ func newCsiDriverClient(driverName csiDriverName) (*csiDriverClient, error) { driverName: driverName, addr: csiAddr(existingDriver.endpoint), nodeV1ClientCreator: nodeV1ClientCreator, + metricsManager: NewCSIMetricsManager(string(driverName)), }, nil } @@ -172,7 +176,7 @@ func (c *csiDriverClient) nodeGetInfoV1(ctx context.Context) ( accessibleTopology map[string]string, err error) { - nodeClient, closer, err := c.nodeV1ClientCreator(c.addr) + nodeClient, closer, err := c.nodeV1ClientCreator(c.addr, c.metricsManager) if err != nil { return "", 0, nil, err } @@ -216,7 +220,7 @@ func (c *csiDriverClient) NodePublishVolume( } - nodeClient, closer, err := c.nodeV1ClientCreator(c.addr) + nodeClient, closer, err := c.nodeV1ClientCreator(c.addr, c.metricsManager) if err != nil { return err } @@ -275,7 +279,7 @@ func (c *csiDriverClient) NodeExpandVolume(ctx context.Context, opts csiResizeOp return opts.newSize, errors.New("size can not be less than 0") } - nodeClient, closer, err := c.nodeV1ClientCreator(c.addr) + nodeClient, closer, err := c.nodeV1ClientCreator(c.addr, c.metricsManager) if err != nil { return opts.newSize, err } @@ -331,7 +335,7 @@ func (c *csiDriverClient) NodeUnpublishVolume(ctx context.Context, volID string, return errors.New("nodeV1ClientCreate is nil") } - nodeClient, closer, err := c.nodeV1ClientCreator(c.addr) + nodeClient, closer, err := c.nodeV1ClientCreator(c.addr, c.metricsManager) if err != nil { return err } @@ -367,7 +371,7 @@ func (c *csiDriverClient) NodeStageVolume(ctx context.Context, return errors.New("nodeV1ClientCreate is nil") } - nodeClient, closer, err := c.nodeV1ClientCreator(c.addr) + nodeClient, closer, err := c.nodeV1ClientCreator(c.addr, c.metricsManager) if err != nil { return err } @@ -418,7 +422,7 @@ func (c *csiDriverClient) NodeUnstageVolume(ctx context.Context, volID, stagingT return errors.New("nodeV1ClientCreate is nil") } - nodeClient, closer, err := c.nodeV1ClientCreator(c.addr) + nodeClient, closer, err := c.nodeV1ClientCreator(c.addr, c.metricsManager) if err != nil { return err } @@ -438,7 +442,7 @@ func (c *csiDriverClient) NodeSupportsNodeExpand(ctx context.Context) (bool, err return false, errors.New("nodeV1ClientCreate is nil") } - nodeClient, closer, err := c.nodeV1ClientCreator(c.addr) + nodeClient, closer, err := c.nodeV1ClientCreator(c.addr, c.metricsManager) if err != nil { return false, err } @@ -469,7 +473,7 @@ func (c *csiDriverClient) NodeSupportsStageUnstage(ctx context.Context) (bool, e return false, errors.New("nodeV1ClientCreate is nil") } - nodeClient, closer, err := c.nodeV1ClientCreator(c.addr) + nodeClient, closer, err := c.nodeV1ClientCreator(c.addr, c.metricsManager) if err != nil { return false, err } @@ -508,7 +512,7 @@ func asCSIAccessModeV1(am api.PersistentVolumeAccessMode) csipbv1.VolumeCapabili return csipbv1.VolumeCapability_AccessMode_UNKNOWN } -func newGrpcConn(addr csiAddr) (*grpc.ClientConn, error) { +func newGrpcConn(addr csiAddr, metricsManager *MetricsManager) (*grpc.ClientConn, error) { network := "unix" klog.V(4).Infof(log("creating new gRPC connection for [%s://%s]", network, addr)) @@ -518,6 +522,7 @@ func newGrpcConn(addr csiAddr) (*grpc.ClientConn, error) { grpc.WithContextDialer(func(ctx context.Context, target string) (net.Conn, error) { return (&net.Dialer{}).DialContext(ctx, network, target) }), + grpc.WithChainUnaryInterceptor(metricsManager.RecordMetricsInterceptor), ) } @@ -560,7 +565,7 @@ func (c *csiDriverClient) NodeSupportsVolumeStats(ctx context.Context) (bool, er return false, errors.New("nodeV1ClientCreate is nil") } - nodeClient, closer, err := c.nodeV1ClientCreator(c.addr) + nodeClient, closer, err := c.nodeV1ClientCreator(c.addr, c.metricsManager) if err != nil { return false, err } @@ -594,7 +599,7 @@ func (c *csiDriverClient) NodeGetVolumeStats(ctx context.Context, volID string, return nil, errors.New("nodeV1ClientCreate is nil") } - nodeClient, closer, err := c.nodeV1ClientCreator(c.addr) + nodeClient, closer, err := c.nodeV1ClientCreator(c.addr, c.metricsManager) if err != nil { return nil, err } @@ -621,6 +626,19 @@ func (c *csiDriverClient) NodeGetVolumeStats(ctx context.Context, volID string, Inodes: resource.NewQuantity(int64(0), resource.BinarySI), InodesFree: resource.NewQuantity(int64(0), resource.BinarySI), } + + if utilfeature.DefaultFeatureGate.Enabled(features.CSIVolumeHealth) { + isSupportNodeVolumeCondition, err := supportNodeGetVolumeCondition(ctx, nodeClient) + if err != nil { + return nil, err + } + + if isSupportNodeVolumeCondition { + abnormal, message := resp.VolumeCondition.GetAbnormal(), resp.VolumeCondition.GetMessage() + metrics.Abnormal, metrics.Message = &abnormal, &message + } + } + for _, usage := range usages { if usage == nil { continue @@ -643,6 +661,30 @@ func (c *csiDriverClient) NodeGetVolumeStats(ctx context.Context, volID string, return metrics, nil } +func supportNodeGetVolumeCondition(ctx context.Context, nodeClient csipbv1.NodeClient) (supportNodeGetVolumeCondition bool, err error) { + req := csipbv1.NodeGetCapabilitiesRequest{} + rsp, err := nodeClient.NodeGetCapabilities(ctx, &req) + if err != nil { + return false, err + } + + for _, cap := range rsp.GetCapabilities() { + if cap == nil { + continue + } + rpc := cap.GetRpc() + if rpc == nil { + continue + } + t := rpc.GetType() + if t == csipbv1.NodeServiceCapability_RPC_VOLUME_CONDITION { + return true, nil + } + } + + return false, nil +} + func isFinalError(err error) bool { // Sources: // https://github.com/grpc/grpc/blob/master/doc/statuscodes.md diff --git a/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_metrics.go b/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_metrics.go index 2e0c984cad4e..96fcff66a875 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_metrics.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_metrics.go @@ -19,9 +19,12 @@ package csi import ( "context" "fmt" + "time" + "google.golang.org/grpc" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/kubernetes/pkg/volume" + volumeutil "k8s.io/kubernetes/pkg/volume/util" ) var _ volume.MetricsProvider = &metricsCsi{} @@ -79,3 +82,51 @@ func (mc *metricsCsi) GetMetrics() (*volume.Metrics, error) { metrics.Time = currentTime return metrics, nil } + +// MetricsManager defines the metrics mananger for CSI operation +type MetricsManager struct { + driverName string +} + +// NewCSIMetricsManager creates a CSIMetricsManager object +func NewCSIMetricsManager(driverName string) *MetricsManager { + cmm := MetricsManager{ + driverName: driverName, + } + return &cmm +} + +type additionalInfo struct { + Migrated string +} +type additionalInfoKeyType struct{} + +var additionalInfoKey additionalInfoKeyType + +// RecordMetricsInterceptor is a grpc interceptor that is used to +// record CSI operation +func (cmm *MetricsManager) RecordMetricsInterceptor( + ctx context.Context, + method string, + req, reply interface{}, + cc *grpc.ClientConn, + invoker grpc.UnaryInvoker, + opts ...grpc.CallOption) error { + start := time.Now() + err := invoker(ctx, method, req, reply, cc, opts...) + duration := time.Since(start) + // Check if this is migrated operation + additionalInfoVal := ctx.Value(additionalInfoKey) + migrated := "false" + if additionalInfoVal != nil { + additionalInfoVal, ok := additionalInfoVal.(additionalInfo) + if !ok { + return err + } + migrated = additionalInfoVal.Migrated + } + // Record the metric latency + volumeutil.RecordCSIOperationLatencyMetrics(cmm.driverName, method, err, duration, migrated) + + return err +} diff --git a/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_mounter.go b/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_mounter.go index 2ff94fe8c809..d632ffd1433b 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_mounter.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_mounter.go @@ -17,7 +17,6 @@ limitations under the License. package csi import ( - "context" "crypto/sha256" "encoding/json" "errors" @@ -114,7 +113,7 @@ func (c *csiMountMgr) SetUpAt(dir string, mounterArgs volume.MounterArgs) error return volumetypes.NewTransientOperationFailure(log("mounter.SetUpAt failed to get CSI client: %v", err)) } - ctx, cancel := context.WithTimeout(context.Background(), csiTimeout) + ctx, cancel := createCSIOperationContext(c.spec, csiTimeout) defer cancel() volSrc, pvSrc, err := getSourceFromSpec(c.spec) @@ -396,7 +395,8 @@ func (c *csiMountMgr) TearDownAt(dir string) error { return errors.New(log("mounter.SetUpAt failed to get CSI client: %v", err)) } - ctx, cancel := context.WithTimeout(context.Background(), csiTimeout) + // Could not get spec info on whether this is a migrated operation because c.spec is nil + ctx, cancel := createCSIOperationContext(c.spec, csiTimeout) defer cancel() if err := csi.NodeUnpublishVolume(ctx, volID, dir); err != nil { diff --git a/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_plugin.go b/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_plugin.go index 7fb89f688ba3..85c1c1f3db18 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_plugin.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_plugin.go @@ -43,6 +43,7 @@ import ( "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/pkg/volume" "k8s.io/kubernetes/pkg/volume/csi/nodeinfomanager" + volumetypes "k8s.io/kubernetes/pkg/volume/util/types" ) const ( @@ -61,7 +62,6 @@ const ( type csiPlugin struct { host volume.VolumeHost - blockEnabled bool csiDriverLister storagelisters.CSIDriverLister serviceAccountTokenGetter func(namespace, name string, tr *authenticationv1.TokenRequest) (*authenticationv1.TokenRequest, error) volumeAttachmentLister storagelisters.VolumeAttachmentLister @@ -70,8 +70,7 @@ type csiPlugin struct { // ProbeVolumePlugins returns implemented plugins func ProbeVolumePlugins() []volume.VolumePlugin { p := &csiPlugin{ - host: nil, - blockEnabled: utilfeature.DefaultFeatureGate.Enabled(features.CSIBlockVolume), + host: nil, } return []volume.VolumePlugin{p} } @@ -240,8 +239,7 @@ func (p *csiPlugin) Init(host volume.VolumeHost) error { // Initializing the label management channels nim = nodeinfomanager.NewNodeInfoManager(host.GetNodeName(), host, migratedPlugins) - if utilfeature.DefaultFeatureGate.Enabled(features.CSINodeInfo) && - utilfeature.DefaultFeatureGate.Enabled(features.CSIMigration) { + if utilfeature.DefaultFeatureGate.Enabled(features.CSIMigration) { // This function prevents Kubelet from posting Ready status until CSINode // is both installed and initialized if err := initializeCSINode(host); err != nil { @@ -457,11 +455,23 @@ func (p *csiPlugin) NewMounter( attachID := getAttachmentName(volumeHandle, driverName, node) volData[volDataKey.attachmentID] = attachID - if err := saveVolumeData(dataDir, volDataFileName, volData); err != nil { - if removeErr := os.RemoveAll(dataDir); removeErr != nil { - klog.Error(log("failed to remove dir after error [%s]: %v", dataDir, removeErr)) + err = saveVolumeData(dataDir, volDataFileName, volData) + defer func() { + // Only if there was an error and volume operation was considered + // finished, we should remove the directory. + if err != nil && volumetypes.IsOperationFinishedError(err) { + // attempt to cleanup volume mount dir. + if err = removeMountDir(p, dir); err != nil { + klog.Error(log("attacher.MountDevice failed to remove mount dir after error [%s]: %v", dir, err)) + } } - return nil, errors.New(log("failed to save volume info data: %v", err)) + }() + + if err != nil { + errorMsg := log("csi.NewMounter failed to save volume info data: %v", err) + klog.Error(errorMsg) + + return nil, errors.New(errorMsg) } klog.V(4).Info(log("mounter created successfully")) @@ -651,10 +661,6 @@ func (p *csiPlugin) GetDeviceMountRefs(deviceMountPath string) ([]string, error) var _ volume.BlockVolumePlugin = &csiPlugin{} func (p *csiPlugin) NewBlockVolumeMapper(spec *volume.Spec, podRef *api.Pod, opts volume.VolumeOptions) (volume.BlockVolumeMapper, error) { - if !p.blockEnabled { - return nil, errors.New("CSIBlockVolume feature not enabled") - } - pvSource, err := getCSISourceFromSpec(spec) if err != nil { return nil, err @@ -702,21 +708,27 @@ func (p *csiPlugin) NewBlockVolumeMapper(spec *volume.Spec, podRef *api.Pod, opt volDataKey.attachmentID: attachID, } - if err := saveVolumeData(dataDir, volDataFileName, volData); err != nil { - if removeErr := os.RemoveAll(dataDir); removeErr != nil { - klog.Error(log("failed to remove dir after error [%s]: %v", dataDir, removeErr)) + err = saveVolumeData(dataDir, volDataFileName, volData) + defer func() { + // Only if there was an error and volume operation was considered + // finished, we should remove the directory. + if err != nil && volumetypes.IsOperationFinishedError(err) { + // attempt to cleanup volume mount dir. + if err = removeMountDir(p, dataDir); err != nil { + klog.Error(log("attacher.MountDevice failed to remove mount dir after error [%s]: %v", dataDir, err)) + } } - return nil, errors.New(log("failed to save volume info data: %v", err)) + }() + if err != nil { + errorMsg := log("csi.NewBlockVolumeMapper failed to save volume info data: %v", err) + klog.Error(errorMsg) + return nil, errors.New(errorMsg) } return mapper, nil } func (p *csiPlugin) NewBlockVolumeUnmapper(volName string, podUID types.UID) (volume.BlockVolumeUnmapper, error) { - if !p.blockEnabled { - return nil, errors.New("CSIBlockVolume feature not enabled") - } - klog.V(4).Infof(log("setting up block unmapper for [Spec=%v, podUID=%v]", volName, podUID)) unmapper := &csiBlockMapper{ plugin: p, @@ -738,10 +750,6 @@ func (p *csiPlugin) NewBlockVolumeUnmapper(volName string, podUID types.UID) (vo } func (p *csiPlugin) ConstructBlockVolumeSpec(podUID types.UID, specVolName, mapPath string) (*volume.Spec, error) { - if !p.blockEnabled { - return nil, errors.New("CSIBlockVolume feature not enabled") - } - klog.V(4).Infof("plugin.ConstructBlockVolumeSpec [podUID=%s, specVolName=%s, path=%s]", string(podUID), specVolName, mapPath) dataDir := getVolumeDeviceDataDir(specVolName, p.host) @@ -859,7 +867,7 @@ func containsVolumeMode(modes []storage.VolumeLifecycleMode, mode storage.Volume // getVolumeLifecycleMode returns the mode for the specified spec: {persistent|ephemeral}. // 1) If mode cannot be determined, it will default to "persistent". // 2) If Mode cannot be resolved to either {persistent | ephemeral}, an error is returned -// See https://github.com/kubernetes/enhancements/blob/master/keps/sig-storage/20190122-csi-inline-volumes.md +// See https://github.com/kubernetes/enhancements/blob/master/keps/sig-storage/596-csi-inline-volumes/README.md func (p *csiPlugin) getVolumeLifecycleMode(spec *volume.Spec) (storage.VolumeLifecycleMode, error) { // 1) if volume.Spec.Volume.CSI != nil -> mode is ephemeral // 2) if volume.Spec.PersistentVolume.Spec.CSI != nil -> persistent @@ -945,9 +953,9 @@ func (p *csiPlugin) newAttacherDetacher() (*csiAttacher, error) { } return &csiAttacher{ - plugin: p, - k8s: k8s, - waitSleepTime: 1 * time.Second, + plugin: p, + k8s: k8s, + watchTimeout: csiTimeout, }, nil } diff --git a/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_util.go b/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_util.go index 05cf175daaec..dec72a46bad7 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_util.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_util.go @@ -23,6 +23,7 @@ import ( "fmt" "os" "path/filepath" + "strconv" "time" api "k8s.io/api/core/v1" @@ -193,3 +194,12 @@ func GetCSIDriverName(spec *volume.Spec) (string, error) { return "", errors.New(log("volume source not found in volume.Spec")) } } + +func createCSIOperationContext(volumeSpec *volume.Spec, timeout time.Duration) (context.Context, context.CancelFunc) { + migrated := false + if volumeSpec != nil { + migrated = volumeSpec.Migrated + } + ctx := context.WithValue(context.Background(), additionalInfoKey, additionalInfo{Migrated: strconv.FormatBool(migrated)}) + return context.WithTimeout(ctx, timeout) +} diff --git a/vendor/k8s.io/kubernetes/pkg/volume/csi/expander.go b/vendor/k8s.io/kubernetes/pkg/volume/csi/expander.go index bfa6d7147164..79f856a2feb9 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/csi/expander.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/csi/expander.go @@ -17,7 +17,6 @@ limitations under the License. package csi import ( - "context" "errors" "fmt" @@ -71,7 +70,7 @@ func (c *csiPlugin) nodeExpandWithClient( fsVolume bool) (bool, error) { driverName := csiSource.Driver - ctx, cancel := context.WithTimeout(context.Background(), csiTimeout) + ctx, cancel := createCSIOperationContext(resizeOptions.VolumeSpec, csiTimeout) defer cancel() nodeExpandSet, err := csClient.NodeSupportsNodeExpand(ctx) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/csi/nodeinfomanager/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/csi/nodeinfomanager/BUILD deleted file mode 100644 index f74ced56a9e7..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/csi/nodeinfomanager/BUILD +++ /dev/null @@ -1,66 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["nodeinfomanager.go"], - importpath = "k8s.io/kubernetes/pkg/volume/csi/nodeinfomanager", - visibility = ["//visibility:public"], - deps = [ - "//pkg/features:go_default_library", - "//pkg/util/node:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/util:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/storage/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["nodeinfomanager_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core/helper:go_default_library", - "//pkg/features:go_default_library", - "//pkg/volume/testing:go_default_library", - "//pkg/volume/util:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/storage/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - "//staging/src/k8s.io/client-go/util/testing:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/csi/nodeinfomanager/nodeinfomanager.go b/vendor/k8s.io/kubernetes/pkg/volume/csi/nodeinfomanager/nodeinfomanager.go index eaae5e3e7b3c..5168bdbd4e45 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/csi/nodeinfomanager/nodeinfomanager.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/csi/nodeinfomanager/nodeinfomanager.go @@ -37,10 +37,8 @@ import ( utilerrors "k8s.io/apimachinery/pkg/util/errors" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/wait" - utilfeature "k8s.io/apiserver/pkg/util/feature" clientset "k8s.io/client-go/kubernetes" "k8s.io/klog/v2" - "k8s.io/kubernetes/pkg/features" nodeutil "k8s.io/kubernetes/pkg/util/node" "k8s.io/kubernetes/pkg/volume" "k8s.io/kubernetes/pkg/volume/util" @@ -115,10 +113,7 @@ func (nim *nodeInfoManager) InstallCSIDriver(driverName string, driverNodeID str nodeUpdateFuncs := []nodeUpdateFunc{ updateNodeIDInNode(driverName, driverNodeID), - } - - if utilfeature.DefaultFeatureGate.Enabled(features.CSINodeInfo) { - nodeUpdateFuncs = append(nodeUpdateFuncs, updateTopologyLabels(topology)) + updateTopologyLabels(topology), } err := nim.updateNode(nodeUpdateFuncs...) @@ -126,28 +121,25 @@ func (nim *nodeInfoManager) InstallCSIDriver(driverName string, driverNodeID str return fmt.Errorf("error updating Node object with CSI driver node info: %v", err) } - if utilfeature.DefaultFeatureGate.Enabled(features.CSINodeInfo) { - err = nim.updateCSINode(driverName, driverNodeID, maxAttachLimit, topology) - if err != nil { - return fmt.Errorf("error updating CSINode object with CSI driver node info: %v", err) - } + err = nim.updateCSINode(driverName, driverNodeID, maxAttachLimit, topology) + if err != nil { + return fmt.Errorf("error updating CSINode object with CSI driver node info: %v", err) } + return nil } // UninstallCSIDriver removes the node ID annotation from the Node object and CSIDrivers field from the -// CSINode object. If the CSINOdeInfo object contains no CSIDrivers, it will be deleted. +// CSINode object. If the CSINodeInfo object contains no CSIDrivers, it will be deleted. // If multiple calls to UninstallCSIDriver() are made in parallel, some calls might receive Node or // CSINode update conflicts, which causes the function to retry the corresponding update. func (nim *nodeInfoManager) UninstallCSIDriver(driverName string) error { - if utilfeature.DefaultFeatureGate.Enabled(features.CSINodeInfo) { - err := nim.uninstallDriverFromCSINode(driverName) - if err != nil { - return fmt.Errorf("error uninstalling CSI driver from CSINode object %v", err) - } + err := nim.uninstallDriverFromCSINode(driverName) + if err != nil { + return fmt.Errorf("error uninstalling CSI driver from CSINode object %v", err) } - err := nim.updateNode( + err = nim.updateNode( removeMaxAttachLimit(driverName), removeNodeIDFromNode(driverName), ) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/csimigration/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/csimigration/BUILD deleted file mode 100644 index 4b70f22351a1..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/csimigration/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["plugin_manager.go"], - importpath = "k8s.io/kubernetes/pkg/volume/csimigration", - visibility = ["//visibility:public"], - deps = [ - "//pkg/features:go_default_library", - "//pkg/volume:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate:go_default_library", - "//staging/src/k8s.io/csi-translation-lib/plugins:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["plugin_manager_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/features:go_default_library", - "//pkg/volume:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - "//staging/src/k8s.io/csi-translation-lib:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/csimigration/patch_adc_plugin_manager.go b/vendor/k8s.io/kubernetes/pkg/volume/csimigration/patch_adc_plugin_manager.go new file mode 100644 index 000000000000..dc3a3bae86d6 --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/volume/csimigration/patch_adc_plugin_manager.go @@ -0,0 +1,44 @@ +package csimigration + +import ( + "k8s.io/component-base/featuregate" + csilibplugins "k8s.io/csi-translation-lib/plugins" + "k8s.io/kubernetes/pkg/features" +) + +// NewADCPluginManager returns a new PluginManager instance for the Attach Detach controller which uses different +// featuregates in openshift to control enablement/disablement which *DO NOT MATCH* the featuregates for the rest of the +// cluster. +func NewADCPluginManager(m PluginNameMapper, featureGate featuregate.FeatureGate) PluginManager { + ret := NewPluginManager(m, featureGate) + ret.useADCPluginManagerFeatureGates = true + return ret +} + +// adcIsMigrationEnabledForPlugin indicates whether CSI migration has been enabled +// for a particular storage plugin in Attach/Detach controller. +func (pm PluginManager) adcIsMigrationEnabledForPlugin(pluginName string) bool { + // CSIMigration feature should be enabled along with the plugin-specific one + if !pm.featureGate.Enabled(features.CSIMigration) { + return false + } + + switch pluginName { + case csilibplugins.AWSEBSInTreePluginName: + return pm.featureGate.Enabled(features.ADCCSIMigrationAWS) + case csilibplugins.CinderInTreePluginName: + return pm.featureGate.Enabled(features.ADCCSIMigrationCinder) + default: + return pm.isMigrationEnabledForPlugin(pluginName) + } +} + +// IsMigrationEnabledForPlugin indicates whether CSI migration has been enabled +// for a particular storage plugin +func (pm PluginManager) IsMigrationEnabledForPlugin(pluginName string) bool { + if pm.useADCPluginManagerFeatureGates { + return pm.adcIsMigrationEnabledForPlugin(pluginName) + } + + return pm.isMigrationEnabledForPlugin(pluginName) +} diff --git a/vendor/k8s.io/kubernetes/pkg/volume/csimigration/plugin_manager.go b/vendor/k8s.io/kubernetes/pkg/volume/csimigration/plugin_manager.go index 1d635166aedd..2cf8df980bb0 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/csimigration/plugin_manager.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/csimigration/plugin_manager.go @@ -20,8 +20,7 @@ import ( "errors" "fmt" - "k8s.io/api/core/v1" - utilfeature "k8s.io/apiserver/pkg/util/feature" + v1 "k8s.io/api/core/v1" "k8s.io/component-base/featuregate" csilibplugins "k8s.io/csi-translation-lib/plugins" "k8s.io/kubernetes/pkg/features" @@ -38,64 +37,67 @@ type PluginNameMapper interface { // PluginManager keeps track of migrated state of in-tree plugins type PluginManager struct { PluginNameMapper + featureGate featuregate.FeatureGate + + useADCPluginManagerFeatureGates bool } // NewPluginManager returns a new PluginManager instance -func NewPluginManager(m PluginNameMapper) PluginManager { +func NewPluginManager(m PluginNameMapper, featureGate featuregate.FeatureGate) PluginManager { return PluginManager{ PluginNameMapper: m, + featureGate: featureGate, } } // IsMigrationCompleteForPlugin indicates whether CSI migration has been completed -// for a particular storage plugin +// for a particular storage plugin. A complete migration will need to: +// 1. Enable CSIMigrationXX for the plugin +// 2. Unregister the in-tree plugin by setting the InTreePluginXXUnregister feature gate func (pm PluginManager) IsMigrationCompleteForPlugin(pluginName string) bool { - // CSIMigration feature and plugin specific migration feature flags should - // be enabled for plugin specific migration completion feature flags to be - // take effect + // CSIMigration feature and plugin specific InTreePluginUnregister feature flags should + // be enabled for plugin specific migration completion to be take effect if !pm.IsMigrationEnabledForPlugin(pluginName) { return false } switch pluginName { case csilibplugins.AWSEBSInTreePluginName: - return utilfeature.DefaultFeatureGate.Enabled(features.CSIMigrationAWSComplete) + return pm.featureGate.Enabled(features.InTreePluginAWSUnregister) case csilibplugins.GCEPDInTreePluginName: - return utilfeature.DefaultFeatureGate.Enabled(features.CSIMigrationGCEComplete) + return pm.featureGate.Enabled(features.InTreePluginGCEUnregister) case csilibplugins.AzureFileInTreePluginName: - return utilfeature.DefaultFeatureGate.Enabled(features.CSIMigrationAzureFileComplete) + return pm.featureGate.Enabled(features.InTreePluginAzureFileUnregister) case csilibplugins.AzureDiskInTreePluginName: - return utilfeature.DefaultFeatureGate.Enabled(features.CSIMigrationAzureDiskComplete) + return pm.featureGate.Enabled(features.InTreePluginAzureDiskUnregister) case csilibplugins.CinderInTreePluginName: - return utilfeature.DefaultFeatureGate.Enabled(features.CSIMigrationOpenStackComplete) + return pm.featureGate.Enabled(features.InTreePluginOpenStackUnregister) case csilibplugins.VSphereInTreePluginName: - return utilfeature.DefaultFeatureGate.Enabled(features.CSIMigrationvSphereComplete) + return pm.featureGate.Enabled(features.CSIMigrationvSphereComplete) || pm.featureGate.Enabled(features.InTreePluginvSphereUnregister) default: return false } } -// IsMigrationEnabledForPlugin indicates whether CSI migration has been enabled -// for a particular storage plugin -func (pm PluginManager) IsMigrationEnabledForPlugin(pluginName string) bool { +func (pm PluginManager) isMigrationEnabledForPlugin(pluginName string) bool { // CSIMigration feature should be enabled along with the plugin-specific one - if !utilfeature.DefaultFeatureGate.Enabled(features.CSIMigration) { + if !pm.featureGate.Enabled(features.CSIMigration) { return false } switch pluginName { case csilibplugins.AWSEBSInTreePluginName: - return utilfeature.DefaultFeatureGate.Enabled(features.CSIMigrationAWS) + return pm.featureGate.Enabled(features.CSIMigrationAWS) case csilibplugins.GCEPDInTreePluginName: - return utilfeature.DefaultFeatureGate.Enabled(features.CSIMigrationGCE) + return pm.featureGate.Enabled(features.CSIMigrationGCE) case csilibplugins.AzureFileInTreePluginName: - return utilfeature.DefaultFeatureGate.Enabled(features.CSIMigrationAzureFile) + return pm.featureGate.Enabled(features.CSIMigrationAzureFile) case csilibplugins.AzureDiskInTreePluginName: - return utilfeature.DefaultFeatureGate.Enabled(features.CSIMigrationAzureDisk) + return pm.featureGate.Enabled(features.CSIMigrationAzureDisk) case csilibplugins.CinderInTreePluginName: - return utilfeature.DefaultFeatureGate.Enabled(features.CSIMigrationOpenStack) + return pm.featureGate.Enabled(features.CSIMigrationOpenStack) case csilibplugins.VSphereInTreePluginName: - return utilfeature.DefaultFeatureGate.Enabled(features.CSIMigrationvSphere) + return pm.featureGate.Enabled(features.CSIMigrationvSphere) default: return false } @@ -141,6 +143,7 @@ func TranslateInTreeSpecToCSI(spec *volume.Spec, translator InTreeToCSITranslato return nil, fmt.Errorf("failed to translate in-tree pv to CSI: %v", err) } return &volume.Spec{ + Migrated: true, PersistentVolume: csiPV, ReadOnly: spec.ReadOnly, InlineVolumeSpecForCSIMigration: inlineVolume, @@ -148,13 +151,25 @@ func TranslateInTreeSpecToCSI(spec *volume.Spec, translator InTreeToCSITranslato } // CheckMigrationFeatureFlags checks the configuration of feature flags related -// to CSI Migration is valid -func CheckMigrationFeatureFlags(f featuregate.FeatureGate, pluginMigration, pluginMigrationComplete featuregate.Feature) error { +// to CSI Migration is valid. It will return whether the migration is complete +// by looking up the pluginMigrationComplete and pluginUnregister flag +func CheckMigrationFeatureFlags(f featuregate.FeatureGate, pluginMigration, + pluginMigrationComplete, pluginUnregister featuregate.Feature) (migrationComplete bool, err error) { if f.Enabled(pluginMigration) && !f.Enabled(features.CSIMigration) { - return fmt.Errorf("enabling %q requires CSIMigration to be enabled", pluginMigration) + return false, fmt.Errorf("enabling %q requires CSIMigration to be enabled", pluginMigration) + } + // TODO: Remove the following two checks once the CSIMigrationXXComplete flag is removed + if pluginMigrationComplete != "" && f.Enabled(pluginMigrationComplete) && !f.Enabled(pluginMigration) { + return false, fmt.Errorf("enabling %q requires %q to be enabled", pluginMigrationComplete, pluginMigration) + } + // This is only needed for vSphere since we will deprecate the CSIMigrationvSphereComplete flag soon + if pluginMigrationComplete != "" && f.Enabled(features.CSIMigration) && + f.Enabled(pluginMigration) && f.Enabled(pluginMigrationComplete) { + return true, nil } - if f.Enabled(pluginMigrationComplete) && !f.Enabled(pluginMigration) { - return fmt.Errorf("enabling %q requires %q to be enabled", pluginMigrationComplete, pluginMigration) + // This is for other in-tree plugin that get migration finished + if f.Enabled(pluginMigration) && f.Enabled(pluginUnregister) { + return true, nil } - return nil + return false, nil } diff --git a/vendor/k8s.io/kubernetes/pkg/volume/downwardapi/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/downwardapi/BUILD deleted file mode 100644 index f2c87f1365b2..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/downwardapi/BUILD +++ /dev/null @@ -1,55 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["downwardapi.go"], - importpath = "k8s.io/kubernetes/pkg/volume/downwardapi", - deps = [ - "//pkg/api/v1/resource:go_default_library", - "//pkg/fieldpath:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/util:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/strings:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["downwardapi_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/fieldpath:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/emptydir:go_default_library", - "//pkg/volume/testing:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/util/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/emptydir/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/emptydir/BUILD deleted file mode 100644 index 052a4ebaa2b0..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/emptydir/BUILD +++ /dev/null @@ -1,92 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "empty_dir.go", - "empty_dir_linux.go", - "empty_dir_unsupported.go", - ], - importpath = "k8s.io/kubernetes/pkg/volume/emptydir", - deps = [ - "//pkg/apis/core/v1/helper:go_default_library", - "//pkg/features:go_default_library", - "//pkg/kubelet/cm:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/util:go_default_library", - "//pkg/volume/util/fsquota:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/strings:go_default_library", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "//conditions:default": [], - }), -) - -go_test( - name = "go_default_test", - srcs = ["empty_dir_test.go"], - embed = [":go_default_library"], - deps = select({ - "@io_bazel_rules_go//go/platform:android": [ - "//pkg/features:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/testing:go_default_library", - "//pkg/volume/util:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/util/testing:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//pkg/features:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/testing:go_default_library", - "//pkg/volume/util:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/util/testing:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/fc/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/fc/BUILD deleted file mode 100644 index 4cc71cd94dde..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/fc/BUILD +++ /dev/null @@ -1,65 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "attacher.go", - "disk_manager.go", - "doc.go", - "fc.go", - "fc_util.go", - ], - importpath = "k8s.io/kubernetes/pkg/volume/fc", - deps = [ - "//pkg/volume:go_default_library", - "//pkg/volume/util:go_default_library", - "//pkg/volume/util/volumepathhandler:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - "//vendor/k8s.io/utils/strings:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "fc_test.go", - "fc_util_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/volume:go_default_library", - "//pkg/volume/testing:go_default_library", - "//pkg/volume/util:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/util/testing:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/k8s.io/utils/exec/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/fc/disk_manager.go b/vendor/k8s.io/kubernetes/pkg/volume/fc/disk_manager.go index 8a1a7e0ac598..bb054ea16618 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/fc/disk_manager.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/fc/disk_manager.go @@ -40,7 +40,7 @@ type diskManager interface { } // utility to mount a disk based filesystem -func diskSetUp(manager diskManager, b fcDiskMounter, volPath string, mounter mount.Interface, fsGroup *int64, fsGroupChangePolicy *v1.PodFSGroupChangePolicy, plugin volume.VolumePlugin) error { +func diskSetUp(manager diskManager, b fcDiskMounter, volPath string, mounter mount.Interface, fsGroup *int64, fsGroupChangePolicy *v1.PodFSGroupChangePolicy) error { globalPDPath := manager.MakeGlobalPDName(*b.fcDisk) noMnt, err := mounter.IsLikelyNotMountPoint(volPath) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/fc/fc.go b/vendor/k8s.io/kubernetes/pkg/volume/fc/fc.go index a70dab190213..ce441cd9e442 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/fc/fc.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/fc/fc.go @@ -364,7 +364,7 @@ func (b *fcDiskMounter) SetUp(mounterArgs volume.MounterArgs) error { func (b *fcDiskMounter) SetUpAt(dir string, mounterArgs volume.MounterArgs) error { // diskSetUp checks mountpoints and prevent repeated calls - err := diskSetUp(b.manager, *b, dir, b.mounter, mounterArgs.FsGroup, mounterArgs.FSGroupChangePolicy, b.plugin) + err := diskSetUp(b.manager, *b, dir, b.mounter, mounterArgs.FsGroup, mounterArgs.FSGroupChangePolicy) if err != nil { klog.Errorf("fc: failed to setup") } diff --git a/vendor/k8s.io/kubernetes/pkg/volume/flexvolume/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/flexvolume/BUILD deleted file mode 100644 index fc8c2ebc73f8..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/flexvolume/BUILD +++ /dev/null @@ -1,89 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "attacher.go", - "attacher-defaults.go", - "detacher.go", - "detacher-defaults.go", - "driver-call.go", - "expander.go", - "expander-defaults.go", - "fake_watcher.go", - "mounter.go", - "mounter-defaults.go", - "plugin.go", - "plugin-defaults.go", - "probe.go", - "unmounter.go", - "unmounter-defaults.go", - "util.go", - "volume.go", - ], - importpath = "k8s.io/kubernetes/pkg/volume/flexvolume", - deps = [ - "//pkg/util/filesystem:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/util:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/github.com/fsnotify/fsnotify:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - "//vendor/k8s.io/utils/strings:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "attacher_test.go", - "common_test.go", - "detacher_test.go", - "driver-call_test.go", - "flexvolume_test.go", - "mounter_test.go", - "plugin_test.go", - "probe_test.go", - "unmounter_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/util/filesystem:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/testing:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/client-go/util/testing:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//test/utils/harness:go_default_library", - "//vendor/github.com/fsnotify/fsnotify:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - "//vendor/k8s.io/utils/exec/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/flocker/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/flocker/BUILD deleted file mode 100644 index d5f8bfbe1ed0..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/flocker/BUILD +++ /dev/null @@ -1,67 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "flocker.go", - "flocker_util.go", - "flocker_volume.go", - ], - importpath = "k8s.io/kubernetes/pkg/volume/flocker", - deps = [ - "//pkg/util/env:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/util:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/rand:go_default_library", - "//staging/src/k8s.io/cloud-provider/volume/helpers:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/github.com/clusterhq/flocker-go:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/strings:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "flocker_test.go", - "flocker_util_test.go", - "flocker_volume_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/volume:go_default_library", - "//pkg/volume/testing:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/client-go/util/testing:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/github.com/clusterhq/flocker-go:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/gcepd/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/gcepd/BUILD deleted file mode 100644 index a7a240e641bd..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/gcepd/BUILD +++ /dev/null @@ -1,79 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "attacher.go", - "doc.go", - "gce_pd.go", - "gce_pd_block.go", - "gce_util.go", - ], - importpath = "k8s.io/kubernetes/pkg/volume/gcepd", - deps = [ - "//pkg/volume:go_default_library", - "//pkg/volume/util:go_default_library", - "//pkg/volume/util/volumepathhandler:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/cloud-provider:go_default_library", - "//staging/src/k8s.io/cloud-provider/volume:go_default_library", - "//staging/src/k8s.io/cloud-provider/volume/helpers:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/gce:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - "//vendor/k8s.io/utils/path:go_default_library", - "//vendor/k8s.io/utils/strings:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "attacher_test.go", - "gce_pd_block_test.go", - "gce_pd_test.go", - "gce_util_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/volume:go_default_library", - "//pkg/volume/testing:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/util/testing:go_default_library", - "//staging/src/k8s.io/cloud-provider:go_default_library", - "//staging/src/k8s.io/cloud-provider/volume:go_default_library", - "//staging/src/k8s.io/cloud-provider/volume/helpers:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/gce:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/gcepd/attacher.go b/vendor/k8s.io/kubernetes/pkg/volume/gcepd/attacher.go index 0629e62354a6..1579ff8be339 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/gcepd/attacher.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/gcepd/attacher.go @@ -269,6 +269,8 @@ func (attacher *gcePersistentDiskAttacher) WaitForAttach(spec *volume.Spec, devi // A device path has successfully been created for the PD klog.Infof("Successfully found attached GCE PD %q.", pdName) return path, nil + } else { + klog.V(4).Infof("could not verify GCE PD (%q) is attached, device path does not exist", pdName) } case <-timer.C: return "", fmt.Errorf("could not find attached GCE PD %q. Timeout waiting for mount paths to be created", pdName) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/gcepd/gce_pd.go b/vendor/k8s.io/kubernetes/pkg/volume/gcepd/gce_pd.go index c61ada63eb8c..de43a6cdad11 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/gcepd/gce_pd.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/gcepd/gce_pd.go @@ -428,8 +428,11 @@ func (b *gcePersistentDiskMounter) SetUpAt(dir string, mounterArgs volume.Mounte return fmt.Errorf("mount of disk %s failed: %v", dir, err) } + klog.V(4).Infof("mount of disk %s succeeded", dir) if !b.readOnly { - volume.SetVolumeOwnership(b, mounterArgs.FsGroup, mounterArgs.FSGroupChangePolicy, util.FSGroupCompleteHook(b.plugin, nil)) + if err := volume.SetVolumeOwnership(b, mounterArgs.FsGroup, mounterArgs.FSGroupChangePolicy, util.FSGroupCompleteHook(b.plugin, nil)); err != nil { + klog.Errorf("SetVolumeOwnership returns error %v", err) + } } return nil } @@ -542,7 +545,7 @@ func (c *gcePersistentDiskProvisioner) Provision(selectedNode *v1.Node, allowedT for k, v := range labels { pv.Labels[k] = v var values []string - if k == v1.LabelFailureDomainBetaZone { + if k == v1.LabelTopologyZone { values, err = volumehelpers.LabelZonesToList(v) if err != nil { return nil, fmt.Errorf("failed to convert label string for Zone: %s to a List: %v", v, err) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/gcepd/gce_util.go b/vendor/k8s.io/kubernetes/pkg/volume/gcepd/gce_util.go index b3b31a4d9eac..290630ae87ea 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/gcepd/gce_util.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/gcepd/gce_util.go @@ -356,7 +356,10 @@ func udevadmChangeToDrive(drivePath string) error { // Checks whether the given GCE PD volume spec is associated with a regional PD. func isRegionalPD(spec *volume.Spec) bool { if spec.PersistentVolume != nil { - zonesLabel := spec.PersistentVolume.Labels[v1.LabelFailureDomainBetaZone] + zonesLabel := spec.PersistentVolume.Labels[v1.LabelTopologyZone] + if zonesLabel == "" { + zonesLabel = spec.PersistentVolume.Labels[v1.LabelFailureDomainBetaZone] + } zones := strings.Split(zonesLabel, cloudvolume.LabelMultiZoneDelimiter) return len(zones) > 1 } diff --git a/vendor/k8s.io/kubernetes/pkg/volume/git_repo/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/git_repo/BUILD deleted file mode 100644 index 57a9e29bdf24..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/git_repo/BUILD +++ /dev/null @@ -1,53 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "git_repo.go", - ], - importpath = "k8s.io/kubernetes/pkg/volume/git_repo", - deps = [ - "//pkg/volume:go_default_library", - "//pkg/volume/util:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - "//vendor/k8s.io/utils/strings:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["git_repo_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/volume:go_default_library", - "//pkg/volume/emptydir:go_default_library", - "//pkg/volume/testing:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - "//vendor/k8s.io/utils/exec/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/glusterfs/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/glusterfs/BUILD deleted file mode 100644 index d7929e7f453f..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/glusterfs/BUILD +++ /dev/null @@ -1,73 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "glusterfs.go", - "glusterfs_minmax.go", - "glusterfs_util.go", - ], - importpath = "k8s.io/kubernetes/pkg/volume/glusterfs", - deps = [ - "//pkg/apis/core/v1/helper:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/util:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/cloud-provider/volume/helpers:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/github.com/heketi/heketi/client/api/go-client:go_default_library", - "//vendor/github.com/heketi/heketi/pkg/glusterfs/api:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/strings:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "glusterfs_minmax_test.go", - "glusterfs_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/volume:go_default_library", - "//pkg/volume/testing:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - "//staging/src/k8s.io/client-go/util/testing:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/github.com/heketi/heketi/pkg/glusterfs/api:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/glusterfs/glusterfs.go b/vendor/k8s.io/kubernetes/pkg/volume/glusterfs/glusterfs.go index 8c66ff4efa49..233917749542 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/glusterfs/glusterfs.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/glusterfs/glusterfs.go @@ -18,10 +18,12 @@ package glusterfs import ( "context" + "crypto/tls" "fmt" "math" "math/rand" "net" + "net/http" "os" "path/filepath" "runtime" @@ -45,7 +47,8 @@ import ( "k8s.io/apimachinery/pkg/util/uuid" clientset "k8s.io/client-go/kubernetes" volumehelpers "k8s.io/cloud-provider/volume/helpers" - v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper" + storagehelpers "k8s.io/component-helpers/storage/volume" + proxyutil "k8s.io/kubernetes/pkg/proxy/util" "k8s.io/kubernetes/pkg/volume" volutil "k8s.io/kubernetes/pkg/volume/util" ) @@ -548,7 +551,7 @@ func (plugin *glusterfsPlugin) collectGids(className string, gidTable *MinMaxAll return fmt.Errorf("failed to get existing persistent volumes") } for _, pv := range pvList.Items { - if v1helper.GetPersistentVolumeClass(&pv) != className { + if storagehelpers.GetPersistentVolumeClass(&pv) != className { continue } pvName := pv.ObjectMeta.Name @@ -662,7 +665,7 @@ func (d *glusterfsVolumeDeleter) Delete() error { return fmt.Errorf("failed to release gid %v: %v", gid, err) } } - cli := gcli.NewClient(d.url, d.user, d.secretValue) + cli := filterClient(gcli.NewClient(d.url, d.user, d.secretValue), d.plugin.host.GetFilteredDialOptions()) if cli == nil { klog.Errorf("failed to create glusterfs REST client") return fmt.Errorf("failed to create glusterfs REST client, REST server authentication failed") @@ -703,6 +706,20 @@ func (d *glusterfsVolumeDeleter) Delete() error { return nil } +func filterClient(client *gcli.Client, opts *proxyutil.FilteredDialOptions) *gcli.Client { + if opts == nil { + return client + } + dialer := proxyutil.NewFilteredDialContext(nil, nil, opts) + client.SetClientFunc(func(tlsConfig *tls.Config, checkRedirect gcli.CheckRedirectFunc) (gcli.HttpPerformer, error) { + transport := http.DefaultTransport.(*http.Transport).Clone() + transport.DialContext = dialer + transport.TLSClientConfig = tlsConfig + return &http.Client{Transport: transport, CheckRedirect: checkRedirect}, nil + }) + return client +} + func (p *glusterfsVolumeProvisioner) Provision(selectedNode *v1.Node, allowedTopologies []v1.TopologySelectorTerm) (*v1.PersistentVolume, error) { if !volutil.AccessModesContainedInAll(p.plugin.GetAccessModes(), p.options.PVC.Spec.AccessModes) { return nil, fmt.Errorf("invalid AccessModes %v: only AccessModes %v are supported", p.options.PVC.Spec.AccessModes, p.plugin.GetAccessModes()) @@ -715,7 +732,7 @@ func (p *glusterfsVolumeProvisioner) Provision(selectedNode *v1.Node, allowedTop return nil, fmt.Errorf("%s does not support block volume provisioning", p.plugin.GetPluginName()) } klog.V(4).Infof("provision volume with options %v", p.options) - scName := v1helper.GetPersistentVolumeClaimClass(p.options.PVC) + scName := storagehelpers.GetPersistentVolumeClaimClass(p.options.PVC) cfg, err := parseClassParameters(p.options.Parameters, p.plugin.host.GetKubeClient()) if err != nil { return nil, err @@ -794,7 +811,7 @@ func (p *glusterfsVolumeProvisioner) CreateVolume(gid int) (r *v1.GlusterfsPersi if p.url == "" { return nil, 0, "", fmt.Errorf("failed to create glusterfs REST client, REST URL is empty") } - cli := gcli.NewClient(p.url, p.user, p.secretValue) + cli := filterClient(gcli.NewClient(p.url, p.user, p.secretValue), p.plugin.host.GetFilteredDialOptions()) if cli == nil { return nil, 0, "", fmt.Errorf("failed to create glusterfs REST client, REST server authentication failed") } @@ -1205,7 +1222,7 @@ func (plugin *glusterfsPlugin) ExpandVolumeDevice(spec *volume.Spec, newSize res klog.V(4).Infof("expanding volume: %q", volumeID) //Create REST server connection - cli := gcli.NewClient(cfg.url, cfg.user, cfg.secretValue) + cli := filterClient(gcli.NewClient(cfg.url, cfg.user, cfg.secretValue), plugin.host.GetFilteredDialOptions()) if cli == nil { klog.Errorf("failed to create glusterfs REST client") return oldSize, fmt.Errorf("failed to create glusterfs REST client, REST server authentication failed") diff --git a/vendor/k8s.io/kubernetes/pkg/volume/hostpath/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/hostpath/BUILD deleted file mode 100644 index 00e2c435e414..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/hostpath/BUILD +++ /dev/null @@ -1,59 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "host_path.go", - ], - importpath = "k8s.io/kubernetes/pkg/volume/hostpath", - deps = [ - "//pkg/volume:go_default_library", - "//pkg/volume/util:go_default_library", - "//pkg/volume/util/hostutil:go_default_library", - "//pkg/volume/util/recyclerclient:go_default_library", - "//pkg/volume/validation:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["host_path_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/volume:go_default_library", - "//pkg/volume/testing:go_default_library", - "//pkg/volume/util/hostutil:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//vendor/k8s.io/utils/path:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/iscsi/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/iscsi/BUILD deleted file mode 100644 index 4510cb6d830d..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/iscsi/BUILD +++ /dev/null @@ -1,68 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "attacher.go", - "disk_manager.go", - "doc.go", - "iscsi.go", - "iscsi_util.go", - ], - importpath = "k8s.io/kubernetes/pkg/volume/iscsi", - deps = [ - "//pkg/kubelet/config:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/util:go_default_library", - "//pkg/volume/util/types:go_default_library", - "//pkg/volume/util/volumepathhandler:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - "//vendor/k8s.io/utils/keymutex:go_default_library", - "//vendor/k8s.io/utils/strings:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "iscsi_test.go", - "iscsi_util_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/config:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/testing:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/util/testing:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/k8s.io/utils/exec/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/iscsi/disk_manager.go b/vendor/k8s.io/kubernetes/pkg/volume/iscsi/disk_manager.go index 150ce46ac878..6d60e44efaf0 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/iscsi/disk_manager.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/iscsi/disk_manager.go @@ -42,7 +42,7 @@ type diskManager interface { // utility to mount a disk based filesystem // globalPDPath: global mount path like, /var/lib/kubelet/plugins/kubernetes.io/iscsi/{ifaceName}/{portal-some_iqn-lun-lun_id} // volPath: pod volume dir path like, /var/lib/kubelet/pods/{podUID}/volumes/kubernetes.io~iscsi/{volumeName} -func diskSetUp(manager diskManager, b iscsiDiskMounter, volPath string, mounter mount.Interface, fsGroup *int64, fsGroupChangePolicy *v1.PodFSGroupChangePolicy, plugin volume.VolumePlugin) error { +func diskSetUp(manager diskManager, b iscsiDiskMounter, volPath string, mounter mount.Interface, fsGroup *int64, fsGroupChangePolicy *v1.PodFSGroupChangePolicy) error { notMnt, err := mounter.IsLikelyNotMountPoint(volPath) if err != nil && !os.IsNotExist(err) { klog.Errorf("cannot validate mountpoint: %s", volPath) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/iscsi/iscsi.go b/vendor/k8s.io/kubernetes/pkg/volume/iscsi/iscsi.go index 645a88340331..8017c2d0d1e9 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/iscsi/iscsi.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/iscsi/iscsi.go @@ -345,7 +345,7 @@ func (b *iscsiDiskMounter) SetUp(mounterArgs volume.MounterArgs) error { func (b *iscsiDiskMounter) SetUpAt(dir string, mounterArgs volume.MounterArgs) error { // diskSetUp checks mountpoints and prevent repeated calls - err := diskSetUp(b.manager, *b, dir, b.mounter, mounterArgs.FsGroup, mounterArgs.FSGroupChangePolicy, b.plugin) + err := diskSetUp(b.manager, *b, dir, b.mounter, mounterArgs.FsGroup, mounterArgs.FSGroupChangePolicy) if err != nil { klog.Errorf("iscsi: failed to setup") } diff --git a/vendor/k8s.io/kubernetes/pkg/volume/local/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/local/BUILD deleted file mode 100644 index c4492dcfbd41..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/local/BUILD +++ /dev/null @@ -1,102 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "local.go", - ], - importpath = "k8s.io/kubernetes/pkg/volume/local", - visibility = ["//visibility:public"], - deps = [ - "//pkg/kubelet/events:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/util:go_default_library", - "//pkg/volume/util/hostutil:go_default_library", - "//pkg/volume/validation:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/keymutex:go_default_library", - "//vendor/k8s.io/utils/strings:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "local_linux_test.go", - "local_test.go", - ], - embed = [":go_default_library"], - deps = select({ - "@io_bazel_rules_go//go/platform:android": [ - "//pkg/volume:go_default_library", - "//pkg/volume/testing:go_default_library", - "//pkg/volume/util/hostutil:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/client-go/util/testing:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "//pkg/volume:go_default_library", - "//pkg/volume/testing:go_default_library", - "//pkg/volume/util/hostutil:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/client-go/util/testing:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - ], - "@io_bazel_rules_go//go/platform:ios": [ - "//pkg/volume:go_default_library", - "//pkg/volume/testing:go_default_library", - "//pkg/volume/util/hostutil:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/client-go/util/testing:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//pkg/volume:go_default_library", - "//pkg/volume/testing:go_default_library", - "//pkg/volume/util/hostutil:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/client-go/util/testing:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "//pkg/volume:go_default_library", - "//pkg/volume/testing:go_default_library", - "//pkg/volume/util/hostutil:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/client-go/util/testing:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/metrics_du.go b/vendor/k8s.io/kubernetes/pkg/volume/metrics_du.go index 1cae99c10736..1491c30de76d 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/metrics_du.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/metrics_du.go @@ -87,7 +87,7 @@ func (md *metricsDu) runFind(metrics *Metrics) error { // getFsInfo writes metrics.Capacity and metrics.Available from the filesystem // info func (md *metricsDu) getFsInfo(metrics *Metrics) error { - available, capacity, _, inodes, inodesFree, _, err := fs.FsInfo(md.path) + available, capacity, _, inodes, inodesFree, _, err := fs.Info(md.path) if err != nil { return NewFsInfoFailedError(err) } diff --git a/vendor/k8s.io/kubernetes/pkg/volume/metrics_statfs.go b/vendor/k8s.io/kubernetes/pkg/volume/metrics_statfs.go index 66f99e30a7a8..29151457e076 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/metrics_statfs.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/metrics_statfs.go @@ -55,7 +55,7 @@ func (md *metricsStatFS) GetMetrics() (*Metrics, error) { // getFsInfo writes metrics.Capacity, metrics.Used and metrics.Available from the filesystem info func (md *metricsStatFS) getFsInfo(metrics *Metrics) error { - available, capacity, usage, inodes, inodesFree, inodesUsed, err := fs.FsInfo(md.path) + available, capacity, usage, inodes, inodesFree, inodesUsed, err := fs.Info(md.path) if err != nil { return NewFsInfoFailedError(err) } diff --git a/vendor/k8s.io/kubernetes/pkg/volume/nfs/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/nfs/BUILD deleted file mode 100644 index 0009671ebd01..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/nfs/BUILD +++ /dev/null @@ -1,56 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "nfs.go", - ], - importpath = "k8s.io/kubernetes/pkg/volume/nfs", - deps = [ - "//pkg/volume:go_default_library", - "//pkg/volume/util:go_default_library", - "//pkg/volume/util/recyclerclient:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/strings:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["nfs_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/volume:go_default_library", - "//pkg/volume/testing:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/util/testing:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/nfs/nfs.go b/vendor/k8s.io/kubernetes/pkg/volume/nfs/nfs.go index 34f838a82767..9f46118f556e 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/nfs/nfs.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/nfs/nfs.go @@ -20,6 +20,7 @@ import ( "fmt" "os" "runtime" + "time" "k8s.io/klog/v2" "k8s.io/mount-utils" @@ -61,7 +62,8 @@ var _ volume.PersistentVolumePlugin = &nfsPlugin{} var _ volume.RecyclableVolumePlugin = &nfsPlugin{} const ( - nfsPluginName = "kubernetes.io/nfs" + nfsPluginName = "kubernetes.io/nfs" + unMountTimeout = time.Minute ) func (plugin *nfsPlugin) Init(host volume.VolumeHost) error { @@ -302,6 +304,11 @@ func (c *nfsUnmounter) TearDownAt(dir string) error { // Use extensiveMountPointCheck to consult /proc/mounts. We can't use faster // IsLikelyNotMountPoint (lstat()), since there may be root_squash on the // NFS server and kubelet may not be able to do lstat/stat() there. + forceUmounter, ok := c.mounter.(mount.MounterForceUnmounter) + if ok { + klog.V(4).Infof("Using force unmounter interface") + return mount.CleanupMountWithForce(dir, forceUmounter, true /* extensiveMountPointCheck */, unMountTimeout) + } return mount.CleanupMountPoint(dir, c.mounter, true /* extensiveMountPointCheck */) } diff --git a/vendor/k8s.io/kubernetes/pkg/volume/plugins.go b/vendor/k8s.io/kubernetes/pkg/volume/plugins.go index 17ba4811cad8..3831ed216cd9 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/plugins.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/plugins.go @@ -459,7 +459,7 @@ type VolumeHost interface { // VolumePluginMgr tracks registered plugins. type VolumePluginMgr struct { - mutex sync.Mutex + mutex sync.RWMutex plugins map[string]VolumePlugin prober DynamicPluginProber probedPlugins map[string]VolumePlugin @@ -473,6 +473,7 @@ type Spec struct { PersistentVolume *v1.PersistentVolume ReadOnly bool InlineVolumeSpecForCSIMigration bool + Migrated bool } // Name returns the name of either Volume or PersistentVolume, one of which must not be nil. @@ -659,8 +660,8 @@ func (pm *VolumePluginMgr) initProbedPlugin(probedPlugin VolumePlugin) error { // specification. If no plugins can support or more than one plugin can // support it, return error. func (pm *VolumePluginMgr) FindPluginBySpec(spec *Spec) (VolumePlugin, error) { - pm.mutex.Lock() - defer pm.mutex.Unlock() + pm.mutex.RLock() + defer pm.mutex.RUnlock() if spec == nil { return nil, fmt.Errorf("Could not find plugin because volume spec is nil") @@ -699,8 +700,8 @@ func (pm *VolumePluginMgr) FindPluginBySpec(spec *Spec) (VolumePlugin, error) { // FindPluginByName fetches a plugin by name or by legacy name. If no plugin // is found, returns error. func (pm *VolumePluginMgr) FindPluginByName(name string) (VolumePlugin, error) { - pm.mutex.Lock() - defer pm.mutex.Unlock() + pm.mutex.RLock() + defer pm.mutex.RUnlock() // Once we can get rid of legacy names we can reduce this to a map lookup. matches := []VolumePlugin{} @@ -768,6 +769,9 @@ func (pm *VolumePluginMgr) refreshProbedPlugins() { // ListVolumePluginWithLimits returns plugins that have volume limits on nodes func (pm *VolumePluginMgr) ListVolumePluginWithLimits() []VolumePluginWithAttachLimits { + pm.mutex.RLock() + defer pm.mutex.RUnlock() + matchedPlugins := []VolumePluginWithAttachLimits{} for _, v := range pm.plugins { if plugin, ok := v.(VolumePluginWithAttachLimits); ok { diff --git a/vendor/k8s.io/kubernetes/pkg/volume/portworx/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/portworx/BUILD deleted file mode 100644 index a0cc829b303f..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/portworx/BUILD +++ /dev/null @@ -1,63 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["portworx_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/volume:go_default_library", - "//pkg/volume/testing:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/client-go/util/testing:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "portworx.go", - "portworx_util.go", - ], - importpath = "k8s.io/kubernetes/pkg/volume/portworx", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/util:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/cloud-provider/volume/helpers:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/github.com/libopenstorage/openstorage/api:go_default_library", - "//vendor/github.com/libopenstorage/openstorage/api/client:go_default_library", - "//vendor/github.com/libopenstorage/openstorage/api/client/volume:go_default_library", - "//vendor/github.com/libopenstorage/openstorage/api/spec:go_default_library", - "//vendor/github.com/libopenstorage/openstorage/volume:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/strings:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/projected/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/projected/BUILD deleted file mode 100644 index 6adc0b82d6e4..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/projected/BUILD +++ /dev/null @@ -1,66 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["projected_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/authentication/v1:go_default_library", - "//pkg/apis/core/v1:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/emptydir:go_default_library", - "//pkg/volume/testing:go_default_library", - "//pkg/volume/util:go_default_library", - "//staging/src/k8s.io/api/authentication/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - "//vendor/github.com/google/go-cmp/cmp:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["projected.go"], - importpath = "k8s.io/kubernetes/pkg/volume/projected", - deps = [ - "//pkg/volume:go_default_library", - "//pkg/volume/configmap:go_default_library", - "//pkg/volume/downwardapi:go_default_library", - "//pkg/volume/secret:go_default_library", - "//pkg/volume/util:go_default_library", - "//staging/src/k8s.io/api/authentication/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/strings:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/quobyte/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/quobyte/BUILD deleted file mode 100644 index 99adcb438606..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/quobyte/BUILD +++ /dev/null @@ -1,61 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "quobyte.go", - "quobyte_util.go", - ], - importpath = "k8s.io/kubernetes/pkg/volume/quobyte", - deps = [ - "//pkg/proxy/util:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/util:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/cloud-provider/volume/helpers:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/github.com/google/uuid:go_default_library", - "//vendor/github.com/quobyte/api:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/strings:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["quobyte_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/volume:go_default_library", - "//pkg/volume/testing:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/util/testing:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/rbd/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/rbd/BUILD deleted file mode 100644 index 1788f14e5222..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/rbd/BUILD +++ /dev/null @@ -1,71 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "attacher.go", - "disk_manager.go", - "doc.go", - "rbd.go", - "rbd_util.go", - ], - importpath = "k8s.io/kubernetes/pkg/volume/rbd", - deps = [ - "//pkg/util/node:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/util:go_default_library", - "//pkg/volume/util/volumepathhandler:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/cloud-provider/volume/helpers:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - "//vendor/k8s.io/utils/path:go_default_library", - "//vendor/k8s.io/utils/strings:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["rbd_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/volume:go_default_library", - "//pkg/volume/testing:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/util/testing:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/rbd/attacher.go b/vendor/k8s.io/kubernetes/pkg/volume/rbd/attacher.go index a7da9f07e30a..9b834da6ae52 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/rbd/attacher.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/rbd/attacher.go @@ -226,7 +226,7 @@ func (detacher *rbdDetacher) UnmountDevice(deviceMountPath string) error { if err = detacher.mounter.Unmount(deviceMountPath); err != nil { return err } - klog.V(3).Infof("rbd: successfully umount device mountpath %s", deviceMountPath) + klog.V(3).Infof("rbd: successfully unmount device mountpath %s", deviceMountPath) } // Get devicePath from deviceMountPath if devicePath is empty diff --git a/vendor/k8s.io/kubernetes/pkg/volume/rbd/disk_manager.go b/vendor/k8s.io/kubernetes/pkg/volume/rbd/disk_manager.go index c4d452afa265..edff33540f4d 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/rbd/disk_manager.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/rbd/disk_manager.go @@ -58,7 +58,7 @@ type diskManager interface { } // utility to mount a disk based filesystem -func diskSetUp(manager diskManager, b rbdMounter, volPath string, mounter mount.Interface, fsGroup *int64, fsGroupChangePolicy *v1.PodFSGroupChangePolicy, plugin volume.VolumePlugin) error { +func diskSetUp(manager diskManager, b rbdMounter, volPath string, mounter mount.Interface, fsGroup *int64, fsGroupChangePolicy *v1.PodFSGroupChangePolicy) error { globalPDPath := manager.MakeGlobalPDName(*b.rbd) notMnt, err := mounter.IsLikelyNotMountPoint(globalPDPath) if err != nil && !os.IsNotExist(err) { @@ -116,7 +116,7 @@ func diskTearDown(manager diskManager, c rbdUnmounter, volPath string, mounter m // Unmount the bind-mount inside this pod. if err := mounter.Unmount(volPath); err != nil { - klog.Errorf("failed to umount %s", volPath) + klog.Errorf("failed to unmount %s", volPath) return err } diff --git a/vendor/k8s.io/kubernetes/pkg/volume/rbd/rbd.go b/vendor/k8s.io/kubernetes/pkg/volume/rbd/rbd.go index e45385d6e966..a624d736aa7e 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/rbd/rbd.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/rbd/rbd.go @@ -837,7 +837,7 @@ func (b *rbdMounter) SetUp(mounterArgs volume.MounterArgs) error { func (b *rbdMounter) SetUpAt(dir string, mounterArgs volume.MounterArgs) error { // diskSetUp checks mountpoints and prevent repeated calls klog.V(4).Infof("rbd: attempting to setup at %s", dir) - err := diskSetUp(b.manager, *b, dir, b.mounter, mounterArgs.FsGroup, mounterArgs.FSGroupChangePolicy, b.plugin) + err := diskSetUp(b.manager, *b, dir, b.mounter, mounterArgs.FsGroup, mounterArgs.FSGroupChangePolicy) if err != nil { klog.Errorf("rbd: failed to setup at %s %v", dir, err) } diff --git a/vendor/k8s.io/kubernetes/pkg/volume/scaleio/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/scaleio/BUILD deleted file mode 100644 index 9842e808ce27..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/scaleio/BUILD +++ /dev/null @@ -1,74 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "sio_mgr_test.go", - "sio_util_test.go", - "sio_volume_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/volume:go_default_library", - "//pkg/volume/testing:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/util/testing:go_default_library", - "//staging/src/k8s.io/cloud-provider/volume/helpers:go_default_library", - "//vendor/github.com/thecodeteam/goscaleio/types/v1:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/exec/testing:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "sio_client.go", - "sio_mgr.go", - "sio_plugin.go", - "sio_util.go", - "sio_volume.go", - ], - importpath = "k8s.io/kubernetes/pkg/volume/scaleio", - deps = [ - "//pkg/proxy/util:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/util:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/cloud-provider/volume/helpers:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/github.com/thecodeteam/goscaleio:go_default_library", - "//vendor/github.com/thecodeteam/goscaleio/types/v1:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - "//vendor/k8s.io/utils/keymutex:go_default_library", - "//vendor/k8s.io/utils/strings:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/secret/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/secret/BUILD deleted file mode 100644 index 9ae55f0ac12a..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/secret/BUILD +++ /dev/null @@ -1,58 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "secret.go", - ], - importpath = "k8s.io/kubernetes/pkg/volume/secret", - deps = [ - "//pkg/volume:go_default_library", - "//pkg/volume/util:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/strings:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["secret_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/volume:go_default_library", - "//pkg/volume/emptydir:go_default_library", - "//pkg/volume/testing:go_default_library", - "//pkg/volume/util:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/storageos/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/storageos/BUILD deleted file mode 100644 index 4d046d5a5e6c..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/storageos/BUILD +++ /dev/null @@ -1,68 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "storageos.go", - "storageos_util.go", - ], - importpath = "k8s.io/kubernetes/pkg/volume/storageos", - deps = [ - "//pkg/proxy/util:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/util:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/cloud-provider/volume/helpers:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/github.com/storageos/go-api:go_default_library", - "//vendor/github.com/storageos/go-api/types:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - "//vendor/k8s.io/utils/strings:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "storageos_test.go", - "storageos_util_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/volume:go_default_library", - "//pkg/volume/testing:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/util/testing:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/github.com/storageos/go-api/types:go_default_library", - "//vendor/k8s.io/utils/exec/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/util/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/util/BUILD deleted file mode 100644 index 9f0e8621cc0e..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/util/BUILD +++ /dev/null @@ -1,113 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "atomic_writer.go", - "attach_limit.go", - "device_util.go", - "device_util_linux.go", - "device_util_unsupported.go", - "doc.go", - "finalizer.go", - "io_util.go", - "metrics.go", - "nested_volumes.go", - "resize_util.go", - "util.go", - ], - importpath = "k8s.io/kubernetes/pkg/volume/util", - visibility = ["//visibility:public"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/api/v1/pod:go_default_library", - "//pkg/apis/core/v1/helper:go_default_library", - "//pkg/features:go_default_library", - "//pkg/securitycontext:go_default_library", - "//pkg/util/resizefs:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/util/types:go_default_library", - "//pkg/volume/util/volumepathhandler:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/storage/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - "//staging/src/k8s.io/component-helpers/scheduling/corev1:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - "//vendor/k8s.io/utils/strings:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "atomic_writer_test.go", - "attach_limit_test.go", - "device_util_linux_test.go", - "metrics_test.go", - "nested_volumes_test.go", - "resize_util_test.go", - "util_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core/install:go_default_library", - "//pkg/apis/core/v1/helper:go_default_library", - "//pkg/features:go_default_library", - "//pkg/util/slice:go_default_library", - "//pkg/volume:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "//staging/src/k8s.io/client-go/util/testing:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//staging/src/k8s.io/client-go/util/testing:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/volume/util/fs:all-srcs", - "//pkg/volume/util/fsquota:all-srcs", - "//pkg/volume/util/hostutil:all-srcs", - "//pkg/volume/util/nestedpendingoperations:all-srcs", - "//pkg/volume/util/operationexecutor:all-srcs", - "//pkg/volume/util/recyclerclient:all-srcs", - "//pkg/volume/util/subpath:all-srcs", - "//pkg/volume/util/types:all-srcs", - "//pkg/volume/util/volumepathhandler:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/util/fs/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/util/fs/BUILD deleted file mode 100644 index b51ee597b530..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/util/fs/BUILD +++ /dev/null @@ -1,95 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "fs.go", - "fs_unsupported.go", - "fs_windows.go", - ], - importpath = "k8s.io/kubernetes/pkg/volume/util/fs", - visibility = ["//visibility:public"], - deps = select({ - "@io_bazel_rules_go//go/platform:aix": [ - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - ], - "@io_bazel_rules_go//go/platform:android": [ - "//pkg/volume/util/fsquota:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "//pkg/volume/util/fsquota:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - ], - "@io_bazel_rules_go//go/platform:illumos": [ - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - ], - "@io_bazel_rules_go//go/platform:ios": [ - "//pkg/volume/util/fsquota:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:js": [ - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//pkg/volume/util/fsquota:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/golang.org/x/sys/windows:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["fs_windows_test.go"], - embed = [":go_default_library"], - deps = select({ - "@io_bazel_rules_go//go/platform:windows": [ - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - ], - "//conditions:default": [], - }), -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/util/fs/fs.go b/vendor/k8s.io/kubernetes/pkg/volume/util/fs/fs.go index 0050c5fe48c7..a6114f259a66 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/util/fs/fs.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/util/fs/fs.go @@ -30,9 +30,9 @@ import ( "k8s.io/kubernetes/pkg/volume/util/fsquota" ) -// FsInfo linux returns (available bytes, byte capacity, byte usage, total inodes, inodes free, inode usage, error) +// Info linux returns (available bytes, byte capacity, byte usage, total inodes, inodes free, inode usage, error) // for the filesystem that path resides upon. -func FsInfo(path string) (int64, int64, int64, int64, int64, int64, error) { +func Info(path string) (int64, int64, int64, int64, int64, int64, error) { statfs := &unix.Statfs_t{} err := unix.Statfs(path, statfs) if err != nil { diff --git a/vendor/k8s.io/kubernetes/pkg/volume/util/fs/fs_unsupported.go b/vendor/k8s.io/kubernetes/pkg/volume/util/fs/fs_unsupported.go index 340b4fdc2254..8cadf72bd53e 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/util/fs/fs_unsupported.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/util/fs/fs_unsupported.go @@ -24,16 +24,17 @@ import ( "k8s.io/apimachinery/pkg/api/resource" ) -// FSInfo unsupported returns 0 values for available and capacity and an error. -func FsInfo(path string) (int64, int64, int64, int64, int64, int64, error) { - return 0, 0, 0, 0, 0, 0, fmt.Errorf("FsInfo not supported for this build.") +// Info unsupported returns 0 values for available and capacity and an error. +func Info(path string) (int64, int64, int64, int64, int64, int64, error) { + return 0, 0, 0, 0, 0, 0, fmt.Errorf("fsinfo not supported for this build") } // DiskUsage gets disk usage of specified path. func DiskUsage(path string) (*resource.Quantity, error) { - return nil, fmt.Errorf("Du not supported for this build.") + return nil, fmt.Errorf("du not supported for this build") } +// Find will always return zero since is on unsupported platform. func Find(path string) (int64, error) { - return 0, fmt.Errorf("Find not supported for this build.") + return 0, fmt.Errorf("find not supported for this build") } diff --git a/vendor/k8s.io/kubernetes/pkg/volume/util/fs/fs_windows.go b/vendor/k8s.io/kubernetes/pkg/volume/util/fs/fs_windows.go index 07c4e6bdbee7..8d16eabcefec 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/util/fs/fs_windows.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/util/fs/fs_windows.go @@ -21,6 +21,7 @@ package fs import ( "fmt" "os" + "path/filepath" "syscall" "unsafe" @@ -34,12 +35,17 @@ var ( procGetDiskFreeSpaceEx = modkernel32.NewProc("GetDiskFreeSpaceExW") ) -// FSInfo returns (available bytes, byte capacity, byte usage, total inodes, inodes free, inode usage, error) +// Info returns (available bytes, byte capacity, byte usage, total inodes, inodes free, inode usage, error) // for the filesystem that path resides upon. -func FsInfo(path string) (int64, int64, int64, int64, int64, int64, error) { +func Info(path string) (int64, int64, int64, int64, int64, int64, error) { var freeBytesAvailable, totalNumberOfBytes, totalNumberOfFreeBytes int64 var err error + // The equivalent linux call supports calls against files but the syscall for windows + // fails for files with error code: The directory name is invalid. (#99173) + // https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes--0-499- + // By always ensuring the directory path we meet all uses cases of this function + path = filepath.Dir(path) ret, _, err := syscall.Syscall6( procGetDiskFreeSpaceEx.Addr(), 4, @@ -77,7 +83,7 @@ func DiskUsage(path string) (*resource.Quantity, error) { return &used, nil } -// Always return zero since inodes is not supported on Windows. +// Find will always return zero since inodes is not supported on Windows. func Find(path string) (int64, error) { return 0, nil } diff --git a/vendor/k8s.io/kubernetes/pkg/volume/util/fsquota/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/util/fsquota/BUILD deleted file mode 100644 index ef48ca78a796..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/util/fsquota/BUILD +++ /dev/null @@ -1,78 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "project.go", - "quota.go", - "quota_linux.go", - "quota_unsupported.go", - ], - importpath = "k8s.io/kubernetes/pkg/volume/util/fsquota", - visibility = ["//visibility:public"], - deps = [ - "//pkg/features:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "//pkg/volume/util/fsquota/common:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//vendor/golang.org/x/sys/unix:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//pkg/volume/util/fsquota/common:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//vendor/golang.org/x/sys/unix:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], - "//conditions:default": [], - }), -) - -go_test( - name = "go_default_test", - srcs = ["quota_linux_test.go"], - embed = [":go_default_library"], - deps = select({ - "@io_bazel_rules_go//go/platform:android": [ - "//pkg/features:go_default_library", - "//pkg/volume/util/fsquota/common:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//pkg/features:go_default_library", - "//pkg/volume/util/fsquota/common:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/volume/util/fsquota/common:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/util/fsquota/common/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/util/fsquota/common/BUILD deleted file mode 100644 index 443359abc388..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/util/fsquota/common/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "quota_linux_common.go", - "quota_linux_common_impl.go", - ], - importpath = "k8s.io/kubernetes/pkg/volume/util/fsquota/common", - visibility = ["//visibility:public"], - deps = select({ - "@io_bazel_rules_go//go/platform:android": [ - "//vendor/k8s.io/klog/v2:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//vendor/k8s.io/klog/v2:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/util/hostutil/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/util/hostutil/BUILD deleted file mode 100644 index 57b546e76115..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/util/hostutil/BUILD +++ /dev/null @@ -1,65 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "fake_hostutil.go", - "hostutil.go", - "hostutil_linux.go", - "hostutil_unsupported.go", - "hostutil_windows.go", - ], - importpath = "k8s.io/kubernetes/pkg/volume/util/hostutil", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/mount-utils:go_default_library", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/path:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/path:go_default_library", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/path:go_default_library", - ], - "//conditions:default": [], - }), -) - -go_test( - name = "go_default_test", - srcs = [ - "hostutil_linux_test.go", - "hostutil_windows_test.go", - ], - embed = [":go_default_library"], - deps = select({ - "@io_bazel_rules_go//go/platform:android": [ - "//vendor/k8s.io/utils/exec:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//vendor/k8s.io/utils/exec:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/util/metrics.go b/vendor/k8s.io/kubernetes/pkg/volume/util/metrics.go index 67b3e9790a5b..2cacae3f8bb7 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/util/metrics.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/util/metrics.go @@ -18,13 +18,17 @@ package util import ( "fmt" + "strconv" "time" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/component-base/metrics" "k8s.io/component-base/metrics/legacyregistry" "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/pkg/volume" + "k8s.io/kubernetes/pkg/volume/util/types" ) const ( @@ -34,7 +38,7 @@ const ( /* * By default, all the following metrics are defined as falling under - * ALPHA stability level https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/20190404-kubernetes-control-plane-metrics-stability.md#stability-classes) + * ALPHA stability level https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/1209-metrics-stability/20190404-kubernetes-control-plane-metrics-stability.md#stability-classes) * * Promoting the stability level of the metric is a responsibility of the component owner, since it * involves explicitly acknowledging support for the metric across multiple releases, in accordance with @@ -47,13 +51,13 @@ var storageOperationMetric = metrics.NewHistogramVec( Buckets: []float64{.1, .25, .5, 1, 2.5, 5, 10, 15, 25, 50, 120, 300, 600}, StabilityLevel: metrics.ALPHA, }, - []string{"volume_plugin", "operation_name"}, + []string{"volume_plugin", "operation_name", "status", "migrated"}, ) var storageOperationErrorMetric = metrics.NewCounterVec( &metrics.CounterOpts{ Name: "storage_operation_errors_total", - Help: "Storage operation errors", + Help: "Storage operation errors (Deprecated since 1.21.0)", StabilityLevel: metrics.ALPHA, }, []string{"volume_plugin", "operation_name"}, @@ -62,7 +66,7 @@ var storageOperationErrorMetric = metrics.NewCounterVec( var storageOperationStatusMetric = metrics.NewCounterVec( &metrics.CounterOpts{ Name: "storage_operation_status_count", - Help: "Storage operation return statuses count", + Help: "Storage operation return statuses count (Deprecated since 1.21.0)", StabilityLevel: metrics.ALPHA, }, []string{"volume_plugin", "operation_name", "status"}, @@ -78,6 +82,17 @@ var storageOperationEndToEndLatencyMetric = metrics.NewHistogramVec( []string{"plugin_name", "operation_name"}, ) +var csiOperationsLatencyMetric = metrics.NewHistogramVec( + &metrics.HistogramOpts{ + Subsystem: "csi", + Name: "operations_seconds", + Help: "Container Storage Interface operation duration with gRPC error code status total", + Buckets: []float64{.1, .25, .5, 1, 2.5, 5, 10, 15, 25, 50, 120, 300, 600}, + StabilityLevel: metrics.ALPHA, + }, + []string{"driver_name", "method_name", "grpc_status_code", "migrated"}, +) + func init() { registerMetrics() } @@ -89,30 +104,34 @@ func registerMetrics() { legacyregistry.MustRegister(storageOperationErrorMetric) legacyregistry.MustRegister(storageOperationStatusMetric) legacyregistry.MustRegister(storageOperationEndToEndLatencyMetric) + legacyregistry.MustRegister(csiOperationsLatencyMetric) } // OperationCompleteHook returns a hook to call when an operation is completed -func OperationCompleteHook(plugin, operationName string) func(*error) { +func OperationCompleteHook(plugin, operationName string) func(types.CompleteFuncParam) { requestTime := time.Now() - opComplete := func(err *error) { + opComplete := func(c types.CompleteFuncParam) { timeTaken := time.Since(requestTime).Seconds() // Create metric with operation name and plugin name status := statusSuccess - if *err != nil { + if *c.Err != nil { // TODO: Establish well-known error codes to be able to distinguish // user configuration errors from system errors. status = statusFailUnknown storageOperationErrorMetric.WithLabelValues(plugin, operationName).Inc() - } else { - storageOperationMetric.WithLabelValues(plugin, operationName).Observe(timeTaken) } + migrated := false + if c.Migrated != nil { + migrated = *c.Migrated + } + storageOperationMetric.WithLabelValues(plugin, operationName, status, strconv.FormatBool(migrated)).Observe(timeTaken) storageOperationStatusMetric.WithLabelValues(plugin, operationName, status).Inc() } return opComplete } // FSGroupCompleteHook returns a hook to call when volume recursive permission is changed -func FSGroupCompleteHook(plugin volume.VolumePlugin, spec *volume.Spec) func(*error) { +func FSGroupCompleteHook(plugin volume.VolumePlugin, spec *volume.Spec) func(types.CompleteFuncParam) { return OperationCompleteHook(GetFullQualifiedPluginNameForVolume(plugin.GetPluginName(), spec), "volume_fsgroup_recursive_apply") } @@ -138,3 +157,28 @@ func GetFullQualifiedPluginNameForVolume(pluginName string, spec *volume.Spec) s func RecordOperationLatencyMetric(plugin, operationName string, secondsTaken float64) { storageOperationEndToEndLatencyMetric.WithLabelValues(plugin, operationName).Observe(secondsTaken) } + +// RecordCSIOperationLatencyMetrics records the CSI operation latency and grpc status +// into metric csi_kubelet_operations_seconds +func RecordCSIOperationLatencyMetrics(driverName string, + operationName string, + operationErr error, + operationDuration time.Duration, + migrated string) { + csiOperationsLatencyMetric.WithLabelValues(driverName, operationName, getErrorCode(operationErr), migrated).Observe(operationDuration.Seconds()) +} + +func getErrorCode(err error) string { + if err == nil { + return codes.OK.String() + } + + st, ok := status.FromError(err) + if !ok { + // This is not gRPC error. The operation must have failed before gRPC + // method was called, otherwise we would get gRPC error. + return "unknown-non-grpc" + } + + return st.Code().String() +} diff --git a/vendor/k8s.io/kubernetes/pkg/volume/util/nestedpendingoperations/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/util/nestedpendingoperations/BUILD deleted file mode 100644 index 0c0c3ff3e2de..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/util/nestedpendingoperations/BUILD +++ /dev/null @@ -1,47 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["nestedpendingoperations.go"], - importpath = "k8s.io/kubernetes/pkg/volume/util/nestedpendingoperations", - deps = [ - "//pkg/util/goroutinemap/exponentialbackoff:go_default_library", - "//pkg/volume/util/types:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["nestedpendingoperations_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/util/goroutinemap/exponentialbackoff:go_default_library", - "//pkg/volume/util/types:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/util/operationexecutor/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/util/operationexecutor/BUILD deleted file mode 100644 index c1fd890d6cfb..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/util/operationexecutor/BUILD +++ /dev/null @@ -1,81 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "fakegenerator.go", - "operation_executor.go", - "operation_generator.go", - ], - importpath = "k8s.io/kubernetes/pkg/volume/util/operationexecutor", - deps = [ - "//pkg/features:go_default_library", - "//pkg/kubelet/events:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/util:go_default_library", - "//pkg/volume/util/hostutil:go_default_library", - "//pkg/volume/util/nestedpendingoperations:go_default_library", - "//pkg/volume/util/types:go_default_library", - "//pkg/volume/util/volumepathhandler:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/cloud-provider/volume/errors:go_default_library", - "//staging/src/k8s.io/csi-translation-lib:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "operation_executor_test.go", - "operation_generator_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/volume:go_default_library", - "//pkg/volume/awsebs:go_default_library", - "//pkg/volume/csi/testing:go_default_library", - "//pkg/volume/gcepd:go_default_library", - "//pkg/volume/testing:go_default_library", - "//pkg/volume/util/hostutil:go_default_library", - "//pkg/volume/util/types:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - "//staging/src/k8s.io/csi-translation-lib:go_default_library", - "//staging/src/k8s.io/csi-translation-lib/plugins:go_default_library", - "//vendor/github.com/prometheus/client_model/go:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/util/operationexecutor/fakegenerator.go b/vendor/k8s.io/kubernetes/pkg/volume/util/operationexecutor/fakegenerator.go index 38d75763cd48..5513dd60db9b 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/util/operationexecutor/fakegenerator.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/util/operationexecutor/fakegenerator.go @@ -32,13 +32,13 @@ import ( type fakeOGCounter struct { // calledFuncs stores name and count of functions calledFuncs map[string]int - opFunc func() (error, error) + opFunc func() volumetypes.OperationContext } var _ OperationGenerator = &fakeOGCounter{} // NewFakeOGCounter returns a OperationGenerator -func NewFakeOGCounter(opFunc func() (error, error)) OperationGenerator { +func NewFakeOGCounter(opFunc func() volumetypes.OperationContext) OperationGenerator { return &fakeOGCounter{ calledFuncs: map[string]int{}, opFunc: opFunc, diff --git a/vendor/k8s.io/kubernetes/pkg/volume/util/operationexecutor/operation_generator.go b/vendor/k8s.io/kubernetes/pkg/volume/util/operationexecutor/operation_generator.go index 7d51ac806452..1fc15038f444 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/util/operationexecutor/operation_generator.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/util/operationexecutor/operation_generator.go @@ -185,7 +185,7 @@ func (og *operationGenerator) GenerateVolumesAreAttachedFunc( volumeSpecMap[volumeAttached.VolumeSpec] = volumeAttached.VolumeName } - volumesAreAttachedFunc := func() (error, error) { + volumesAreAttachedFunc := func() volumetypes.OperationContext { // For each volume plugin, pass the list of volume specs to VolumesAreAttached to check // whether the volumes are still attached. @@ -227,7 +227,8 @@ func (og *operationGenerator) GenerateVolumesAreAttachedFunc( } } - return nil, nil + // It is hard to differentiate migrated status for all volumes for verify_volumes_are_attached_per_node + return volumetypes.NewOperationContext(nil, nil, false) } return volumetypes.GeneratedOperations{ @@ -248,7 +249,7 @@ func (og *operationGenerator) GenerateBulkVolumeVerifyFunc( // function except volumeSpecMap which contains original volume names for // use with actualStateOfWorld - bulkVolumeVerifyFunc := func() (error, error) { + bulkVolumeVerifyFunc := func() volumetypes.OperationContext { attachableVolumePlugin, err := og.volumePluginMgr.FindAttachablePluginByName(pluginName) if err != nil || attachableVolumePlugin == nil { @@ -256,7 +257,7 @@ func (og *operationGenerator) GenerateBulkVolumeVerifyFunc( "BulkVerifyVolume.FindAttachablePluginBySpec failed for plugin %q with: %v", pluginName, err) - return nil, nil + return volumetypes.NewOperationContext(nil, nil, false) } volumeAttacher, newAttacherErr := attachableVolumePlugin.NewAttacher() @@ -266,19 +267,19 @@ func (og *operationGenerator) GenerateBulkVolumeVerifyFunc( "BulkVerifyVolume.NewAttacher failed for getting plugin %q with: %v", attachableVolumePlugin, newAttacherErr) - return nil, nil + return volumetypes.NewOperationContext(nil, nil, false) } bulkVolumeVerifier, ok := volumeAttacher.(volume.BulkVolumeVerifier) if !ok { klog.Errorf("BulkVerifyVolume failed to type assert attacher %q", bulkVolumeVerifier) - return nil, nil + return volumetypes.NewOperationContext(nil, nil, false) } attached, bulkAttachErr := bulkVolumeVerifier.BulkVerifyVolumes(pluginNodeVolumes) if bulkAttachErr != nil { klog.Errorf("BulkVerifyVolume.BulkVerifyVolumes Error checking volumes are attached with %v", bulkAttachErr) - return nil, nil + return volumetypes.NewOperationContext(nil, nil, false) } for nodeName, volumeSpecs := range pluginNodeVolumes { @@ -303,7 +304,8 @@ func (og *operationGenerator) GenerateBulkVolumeVerifyFunc( } } - return nil, nil + // It is hard to differentiate migrated status for all volumes for verify_volumes_are_attached + return volumetypes.NewOperationContext(nil, nil, false) } return volumetypes.GeneratedOperations{ @@ -319,16 +321,21 @@ func (og *operationGenerator) GenerateAttachVolumeFunc( volumeToAttach VolumeToAttach, actualStateOfWorld ActualStateOfWorldAttacherUpdater) volumetypes.GeneratedOperations { - attachVolumeFunc := func() (error, error) { + attachVolumeFunc := func() volumetypes.OperationContext { attachableVolumePlugin, err := og.volumePluginMgr.FindAttachablePluginBySpec(volumeToAttach.VolumeSpec) + + migrated := getMigratedStatusBySpec(volumeToAttach.VolumeSpec) + if err != nil || attachableVolumePlugin == nil { - return volumeToAttach.GenerateError("AttachVolume.FindAttachablePluginBySpec failed", err) + eventErr, detailedErr := volumeToAttach.GenerateError("AttachVolume.FindAttachablePluginBySpec failed", err) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } volumeAttacher, newAttacherErr := attachableVolumePlugin.NewAttacher() if newAttacherErr != nil { - return volumeToAttach.GenerateError("AttachVolume.NewAttacher failed", newAttacherErr) + eventErr, detailedErr := volumeToAttach.GenerateError("AttachVolume.NewAttacher failed", newAttacherErr) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } // Execute attach @@ -349,7 +356,8 @@ func (og *operationGenerator) GenerateAttachVolumeFunc( } // On failure, return error. Caller will log and retry. - return volumeToAttach.GenerateError("AttachVolume.Attach failed", attachErr) + eventErr, detailedErr := volumeToAttach.GenerateError("AttachVolume.Attach failed", attachErr) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } // Successful attach event is useful for user debugging @@ -364,10 +372,11 @@ func (og *operationGenerator) GenerateAttachVolumeFunc( v1.UniqueVolumeName(""), volumeToAttach.VolumeSpec, volumeToAttach.NodeName, devicePath) if addVolumeNodeErr != nil { // On failure, return error. Caller will log and retry. - return volumeToAttach.GenerateError("AttachVolume.MarkVolumeAsAttached failed", addVolumeNodeErr) + eventErr, detailedErr := volumeToAttach.GenerateError("AttachVolume.MarkVolumeAsAttached failed", addVolumeNodeErr) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } - return nil, nil + return volumetypes.NewOperationContext(nil, nil, migrated) } eventRecorderFunc := func(err *error) { @@ -452,7 +461,7 @@ func (og *operationGenerator) GenerateDetachVolumeFunc( return volumetypes.GeneratedOperations{}, volumeToDetach.GenerateErrorDetailed("DetachVolume.NewDetacher failed", err) } - getVolumePluginMgrFunc := func() (error, error) { + detachVolumeFunc := func() volumetypes.OperationContext { var err error if verifySafeToDetach { err = og.verifyVolumeIsSafeToDetach(volumeToDetach) @@ -460,11 +469,15 @@ func (og *operationGenerator) GenerateDetachVolumeFunc( if err == nil { err = volumeDetacher.Detach(volumeName, volumeToDetach.NodeName) } + + migrated := getMigratedStatusBySpec(volumeToDetach.VolumeSpec) + if err != nil { // On failure, add volume back to ReportAsAttached list actualStateOfWorld.AddVolumeToReportAsAttached( volumeToDetach.VolumeName, volumeToDetach.NodeName) - return volumeToDetach.GenerateError("DetachVolume.Detach failed", err) + eventErr, detailedErr := volumeToDetach.GenerateError("DetachVolume.Detach failed", err) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } klog.Infof(volumeToDetach.GenerateMsgDetailed("DetachVolume.Detach succeeded", "")) @@ -473,12 +486,12 @@ func (og *operationGenerator) GenerateDetachVolumeFunc( actualStateOfWorld.MarkVolumeAsDetached( volumeToDetach.VolumeName, volumeToDetach.NodeName) - return nil, nil + return volumetypes.NewOperationContext(nil, nil, migrated) } return volumetypes.GeneratedOperations{ OperationName: "volume_detach", - OperationFunc: getVolumePluginMgrFunc, + OperationFunc: detachVolumeFunc, CompleteFunc: util.OperationCompleteHook(util.GetFullQualifiedPluginNameForVolume(pluginName, volumeToDetach.VolumeSpec), "volume_detach"), EventRecorderFunc: nil, // nil because we do not want to generate event on error }, nil @@ -497,16 +510,21 @@ func (og *operationGenerator) GenerateMountVolumeFunc( volumePluginName = volumePlugin.GetPluginName() } - mountVolumeFunc := func() (error, error) { + mountVolumeFunc := func() volumetypes.OperationContext { // Get mounter plugin volumePlugin, err := og.volumePluginMgr.FindPluginBySpec(volumeToMount.VolumeSpec) + + migrated := getMigratedStatusBySpec(volumeToMount.VolumeSpec) + if err != nil || volumePlugin == nil { - return volumeToMount.GenerateError("MountVolume.FindPluginBySpec failed", err) + eventErr, detailedErr := volumeToMount.GenerateError("MountVolume.FindPluginBySpec failed", err) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } affinityErr := checkNodeAffinity(og, volumeToMount) if affinityErr != nil { - return volumeToMount.GenerateError("MountVolume.NodeAffinity check failed", affinityErr) + eventErr, detailedErr := volumeToMount.GenerateError("MountVolume.NodeAffinity check failed", affinityErr) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } volumeMounter, newMounterErr := volumePlugin.NewMounter( @@ -514,14 +532,15 @@ func (og *operationGenerator) GenerateMountVolumeFunc( volumeToMount.Pod, volume.VolumeOptions{}) if newMounterErr != nil { - return volumeToMount.GenerateError("MountVolume.NewMounter initialization failed", newMounterErr) - + eventErr, detailedErr := volumeToMount.GenerateError("MountVolume.NewMounter initialization failed", newMounterErr) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } mountCheckError := checkMountOptionSupport(og, volumeToMount, volumePlugin) if mountCheckError != nil { - return volumeToMount.GenerateError("MountVolume.MountOptionSupport check failed", mountCheckError) + eventErr, detailedErr := volumeToMount.GenerateError("MountVolume.MountOptionSupport check failed", mountCheckError) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } // Get attacher, if possible @@ -559,7 +578,8 @@ func (og *operationGenerator) GenerateMountVolumeFunc( volumeToMount.VolumeSpec, devicePath, volumeToMount.Pod, waitForAttachTimeout) if err != nil { // On failure, return error. Caller will log and retry. - return volumeToMount.GenerateError("MountVolume.WaitForAttach failed", err) + eventErr, detailedErr := volumeToMount.GenerateError("MountVolume.WaitForAttach failed", err) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } klog.Infof(volumeToMount.GenerateMsgDetailed("MountVolume.WaitForAttach succeeded", fmt.Sprintf("DevicePath %q", devicePath))) @@ -576,7 +596,8 @@ func (og *operationGenerator) GenerateMountVolumeFunc( volumeDeviceMounter.GetDeviceMountPath(volumeToMount.VolumeSpec) if err != nil { // On failure, return error. Caller will log and retry. - return volumeToMount.GenerateError("MountVolume.GetDeviceMountPath failed", err) + eventErr, detailedErr := volumeToMount.GenerateError("MountVolume.GetDeviceMountPath failed", err) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } // Mount device to global mount path @@ -588,7 +609,8 @@ func (og *operationGenerator) GenerateMountVolumeFunc( og.checkForFailedMount(volumeToMount, err) og.markDeviceErrorState(volumeToMount, devicePath, deviceMountPath, err, actualStateOfWorld) // On failure, return error. Caller will log and retry. - return volumeToMount.GenerateError("MountVolume.MountDevice failed", err) + eventErr, detailedErr := volumeToMount.GenerateError("MountVolume.MountDevice failed", err) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } klog.Infof(volumeToMount.GenerateMsgDetailed("MountVolume.MountDevice succeeded", fmt.Sprintf("device mount path %q", deviceMountPath))) @@ -598,7 +620,8 @@ func (og *operationGenerator) GenerateMountVolumeFunc( volumeToMount.VolumeName, devicePath, deviceMountPath) if markDeviceMountedErr != nil { // On failure, return error. Caller will log and retry. - return volumeToMount.GenerateError("MountVolume.MarkDeviceAsMounted failed", markDeviceMountedErr) + eventErr, detailedErr := volumeToMount.GenerateError("MountVolume.MarkDeviceAsMounted failed", markDeviceMountedErr) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } // If volume expansion is performed after MountDevice but before SetUp then @@ -626,7 +649,8 @@ func (og *operationGenerator) GenerateMountVolumeFunc( "MountVolume.MountDevice failed to mark volume as uncertain", markDeviceUncertainErr.Error())) } - return volumeToMount.GenerateError("MountVolume.MountDevice failed while expanding volume", resizeError) + eventErr, detailedErr := volumeToMount.GenerateError("MountVolume.MountDevice failed while expanding volume", resizeError) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } } @@ -635,7 +659,8 @@ func (og *operationGenerator) GenerateMountVolumeFunc( err = fmt.Errorf( "verify that your node machine has the required components before attempting to mount this volume type. %s", canMountErr) - return volumeToMount.GenerateError("MountVolume.CanMount failed", err) + eventErr, detailedErr := volumeToMount.GenerateError("MountVolume.CanMount failed", err) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } } @@ -661,7 +686,8 @@ func (og *operationGenerator) GenerateMountVolumeFunc( og.checkForFailedMount(volumeToMount, mountErr) og.markVolumeErrorState(volumeToMount, markOpts, mountErr, actualStateOfWorld) // On failure, return error. Caller will log and retry. - return volumeToMount.GenerateError("MountVolume.SetUp failed", mountErr) + eventErr, detailedErr := volumeToMount.GenerateError("MountVolume.SetUp failed", mountErr) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } _, detailedMsg := volumeToMount.GenerateMsg("MountVolume.SetUp succeeded", "") @@ -681,17 +707,19 @@ func (og *operationGenerator) GenerateMountVolumeFunc( _, resizeError = og.nodeExpandVolume(volumeToMount, actualStateOfWorld, resizeOptions) if resizeError != nil { klog.Errorf("MountVolume.NodeExpandVolume failed with %v", resizeError) - return volumeToMount.GenerateError("MountVolume.Setup failed while expanding volume", resizeError) + eventErr, detailedErr := volumeToMount.GenerateError("MountVolume.Setup failed while expanding volume", resizeError) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } } markVolMountedErr := actualStateOfWorld.MarkVolumeAsMounted(markOpts) if markVolMountedErr != nil { // On failure, return error. Caller will log and retry. - return volumeToMount.GenerateError("MountVolume.MarkVolumeAsMounted failed", markVolMountedErr) + eventErr, detailedErr := volumeToMount.GenerateError("MountVolume.MarkVolumeAsMounted failed", markVolMountedErr) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } - return nil, nil + return volumetypes.NewOperationContext(nil, nil, migrated) } eventRecorderFunc := func(err *error) { @@ -778,20 +806,24 @@ func (og *operationGenerator) GenerateUnmountVolumeFunc( return volumetypes.GeneratedOperations{}, volumeToUnmount.GenerateErrorDetailed("UnmountVolume.NewUnmounter failed", newUnmounterErr) } - unmountVolumeFunc := func() (error, error) { + unmountVolumeFunc := func() volumetypes.OperationContext { subpather := og.volumePluginMgr.Host.GetSubpather() + migrated := getMigratedStatusBySpec(volumeToUnmount.VolumeSpec) + // Remove all bind-mounts for subPaths podDir := filepath.Join(podsDir, string(volumeToUnmount.PodUID)) if err := subpather.CleanSubPaths(podDir, volumeToUnmount.InnerVolumeSpecName); err != nil { - return volumeToUnmount.GenerateError("error cleaning subPath mounts", err) + eventErr, detailedErr := volumeToUnmount.GenerateError("error cleaning subPath mounts", err) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } // Execute unmount unmountErr := volumeUnmounter.TearDown() if unmountErr != nil { // On failure, return error. Caller will log and retry. - return volumeToUnmount.GenerateError("UnmountVolume.TearDown failed", unmountErr) + eventErr, detailedErr := volumeToUnmount.GenerateError("UnmountVolume.TearDown failed", unmountErr) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } klog.Infof( @@ -812,7 +844,7 @@ func (og *operationGenerator) GenerateUnmountVolumeFunc( klog.Errorf(volumeToUnmount.GenerateErrorDetailed("UnmountVolume.MarkVolumeAsUnmounted failed", markVolMountedErr).Error()) } - return nil, nil + return volumetypes.NewOperationContext(nil, nil, migrated) } return volumetypes.GeneratedOperations{ @@ -834,9 +866,9 @@ func (og *operationGenerator) GenerateUnmountDeviceFunc( return volumetypes.GeneratedOperations{}, deviceToDetach.GenerateErrorDetailed("UnmountDevice.FindDeviceMountablePluginByName failed", err) } - volumeDeviceUmounter, err := deviceMountableVolumePlugin.NewDeviceUnmounter() + volumeDeviceUnmounter, err := deviceMountableVolumePlugin.NewDeviceUnmounter() if err != nil { - return volumetypes.GeneratedOperations{}, deviceToDetach.GenerateErrorDetailed("UnmountDevice.NewDeviceUmounter failed", err) + return volumetypes.GeneratedOperations{}, deviceToDetach.GenerateErrorDetailed("UnmountDevice.NewDeviceUnmounter failed", err) } volumeDeviceMounter, err := deviceMountableVolumePlugin.NewDeviceMounter() @@ -844,14 +876,18 @@ func (og *operationGenerator) GenerateUnmountDeviceFunc( return volumetypes.GeneratedOperations{}, deviceToDetach.GenerateErrorDetailed("UnmountDevice.NewDeviceMounter failed", err) } - unmountDeviceFunc := func() (error, error) { + unmountDeviceFunc := func() volumetypes.OperationContext { + + migrated := getMigratedStatusBySpec(deviceToDetach.VolumeSpec) + //deviceMountPath := deviceToDetach.DeviceMountPath deviceMountPath, err := volumeDeviceMounter.GetDeviceMountPath(deviceToDetach.VolumeSpec) if err != nil { // On failure other than "does not exist", return error. Caller will log and retry. if !strings.Contains(err.Error(), "does not exist") { - return deviceToDetach.GenerateError("GetDeviceMountPath failed", err) + eventErr, detailedErr := deviceToDetach.GenerateError("GetDeviceMountPath failed", err) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } // If the mount path could not be found, don't fail the unmount, but instead log a warning and proceed, // using the value from deviceToDetach.DeviceMountPath, so that the device can be marked as unmounted @@ -865,13 +901,15 @@ func (og *operationGenerator) GenerateUnmountDeviceFunc( if err == nil { err = fmt.Errorf("the device mount path %q is still mounted by other references %v", deviceMountPath, refs) } - return deviceToDetach.GenerateError("GetDeviceMountRefs check failed", err) + eventErr, detailedErr := deviceToDetach.GenerateError("GetDeviceMountRefs check failed", err) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } // Execute unmount - unmountDeviceErr := volumeDeviceUmounter.UnmountDevice(deviceMountPath) + unmountDeviceErr := volumeDeviceUnmounter.UnmountDevice(deviceMountPath) if unmountDeviceErr != nil { // On failure, return error. Caller will log and retry. - return deviceToDetach.GenerateError("UnmountDevice failed", unmountDeviceErr) + eventErr, detailedErr := deviceToDetach.GenerateError("UnmountDevice failed", unmountDeviceErr) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } // Before logging that UnmountDevice succeeded and moving on, // use hostutil.PathIsDevice to check if the path is a device, @@ -879,13 +917,14 @@ func (og *operationGenerator) GenerateUnmountDeviceFunc( // else on the system. Retry if it returns true. deviceOpened, deviceOpenedErr := isDeviceOpened(deviceToDetach, hostutil) if deviceOpenedErr != nil { - return nil, deviceOpenedErr + return volumetypes.NewOperationContext(nil, deviceOpenedErr, migrated) } // The device is still in use elsewhere. Caller will log and retry. if deviceOpened { - return deviceToDetach.GenerateError( + eventErr, detailedErr := deviceToDetach.GenerateError( "UnmountDevice failed", goerrors.New("the device is in use when it was no longer expected to be in use")) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } klog.Infof(deviceToDetach.GenerateMsg("UnmountDevice succeeded", "")) @@ -895,10 +934,11 @@ func (og *operationGenerator) GenerateUnmountDeviceFunc( deviceToDetach.VolumeName) if markDeviceUnmountedErr != nil { // On failure, return error. Caller will log and retry. - return deviceToDetach.GenerateError("MarkDeviceAsUnmounted failed", markDeviceUnmountedErr) + eventErr, detailedErr := deviceToDetach.GenerateError("MarkDeviceAsUnmounted failed", markDeviceUnmountedErr) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } - return nil, nil + return volumetypes.NewOperationContext(nil, nil, migrated) } return volumetypes.GeneratedOperations{ @@ -958,15 +998,19 @@ func (og *operationGenerator) GenerateMapVolumeFunc( volumeAttacher, _ = attachableVolumePlugin.NewAttacher() } - mapVolumeFunc := func() (simpleErr error, detailedErr error) { + mapVolumeFunc := func() (operationContext volumetypes.OperationContext) { var devicePath string var stagingPath string + + migrated := getMigratedStatusBySpec(volumeToMount.VolumeSpec) + // Set up global map path under the given plugin directory using symbolic link globalMapPath, err := blockVolumeMapper.GetGlobalMapPath(volumeToMount.VolumeSpec) if err != nil { // On failure, return error. Caller will log and retry. - return volumeToMount.GenerateError("MapVolume.GetGlobalMapPath failed", err) + eventErr, detailedErr := volumeToMount.GenerateError("MapVolume.GetGlobalMapPath failed", err) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } if volumeAttacher != nil { // Wait for attachable volumes to finish attaching @@ -976,7 +1020,8 @@ func (og *operationGenerator) GenerateMapVolumeFunc( volumeToMount.VolumeSpec, volumeToMount.DevicePath, volumeToMount.Pod, waitForAttachTimeout) if err != nil { // On failure, return error. Caller will log and retry. - return volumeToMount.GenerateError("MapVolume.WaitForAttach failed", err) + eventErr, detailedErr := volumeToMount.GenerateError("MapVolume.WaitForAttach failed", err) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } klog.Infof(volumeToMount.GenerateMsgDetailed("MapVolume.WaitForAttach succeeded", fmt.Sprintf("DevicePath %q", devicePath))) @@ -989,7 +1034,8 @@ func (og *operationGenerator) GenerateMapVolumeFunc( if mapErr != nil { og.markDeviceErrorState(volumeToMount, devicePath, globalMapPath, mapErr, actualStateOfWorld) // On failure, return error. Caller will log and retry. - return volumeToMount.GenerateError("MapVolume.SetUpDevice failed", mapErr) + eventErr, detailedErr := volumeToMount.GenerateError("MapVolume.SetUpDevice failed", mapErr) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } } @@ -999,7 +1045,8 @@ func (og *operationGenerator) GenerateMapVolumeFunc( volumeToMount.VolumeName, markedDevicePath, globalMapPath) if markDeviceMappedErr != nil { // On failure, return error. Caller will log and retry. - return volumeToMount.GenerateError("MapVolume.MarkDeviceAsMounted failed", markDeviceMappedErr) + eventErr, detailedErr := volumeToMount.GenerateError("MapVolume.MarkDeviceAsMounted failed", markDeviceMappedErr) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } markVolumeOpts := MarkVolumeOpts{ @@ -1020,14 +1067,15 @@ func (og *operationGenerator) GenerateMapVolumeFunc( if mapErr != nil { // On failure, return error. Caller will log and retry. og.markVolumeErrorState(volumeToMount, markVolumeOpts, mapErr, actualStateOfWorld) - return volumeToMount.GenerateError("MapVolume.MapPodDevice failed", mapErr) + eventErr, detailedErr := volumeToMount.GenerateError("MapVolume.MapPodDevice failed", mapErr) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } // From now on, the volume is mapped. Mark it as uncertain on error, // so it is is unmapped when corresponding pod is deleted. defer func() { - if simpleErr != nil { - errText := simpleErr.Error() + if operationContext.EventErr != nil { + errText := operationContext.EventErr.Error() og.markVolumeErrorState(volumeToMount, markVolumeOpts, volumetypes.NewUncertainProgressError(errText), actualStateOfWorld) } }() @@ -1038,7 +1086,8 @@ func (og *operationGenerator) GenerateMapVolumeFunc( devicePath = pluginDevicePath } if len(devicePath) == 0 { - return volumeToMount.GenerateError("MapVolume failed", goerrors.New("device path of the volume is empty")) + eventErr, detailedErr := volumeToMount.GenerateError("MapVolume failed", goerrors.New("device path of the volume is empty")) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } } @@ -1048,12 +1097,14 @@ func (og *operationGenerator) GenerateMapVolumeFunc( // AttachFileDevice will fail. If kubelet is not containerized, eval it anyway. kvh, ok := og.GetVolumePluginMgr().Host.(volume.KubeletVolumeHost) if !ok { - return volumeToMount.GenerateError("MapVolume type assertion error", fmt.Errorf("volume host does not implement KubeletVolumeHost interface")) + eventErr, detailedErr := volumeToMount.GenerateError("MapVolume type assertion error", fmt.Errorf("volume host does not implement KubeletVolumeHost interface")) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } hu := kvh.GetHostUtil() devicePath, err = hu.EvalHostSymlinks(devicePath) if err != nil { - return volumeToMount.GenerateError("MapVolume.EvalHostSymlinks failed", err) + eventErr, detailedErr := volumeToMount.GenerateError("MapVolume.EvalHostSymlinks failed", err) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } // Update actual state of world with the devicePath again, if devicePath has changed from markedDevicePath @@ -1063,7 +1114,8 @@ func (og *operationGenerator) GenerateMapVolumeFunc( volumeToMount.VolumeName, devicePath, globalMapPath) if markDeviceMappedErr != nil { // On failure, return error. Caller will log and retry. - return volumeToMount.GenerateError("MapVolume.MarkDeviceAsMounted failed", markDeviceMappedErr) + eventErr, detailedErr := volumeToMount.GenerateError("MapVolume.MarkDeviceAsMounted failed", markDeviceMappedErr) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } } @@ -1072,7 +1124,8 @@ func (og *operationGenerator) GenerateMapVolumeFunc( mapErr := util.MapBlockVolume(og.blkUtil, devicePath, globalMapPath, volumeMapPath, volName, volumeToMount.Pod.UID) if mapErr != nil { // On failure, return error. Caller will log and retry. - return volumeToMount.GenerateError("MapVolume.MapBlockVolume failed", mapErr) + eventErr, detailedErr := volumeToMount.GenerateError("MapVolume.MapBlockVolume failed", mapErr) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } // Device mapping for global map path succeeded @@ -1095,16 +1148,18 @@ func (og *operationGenerator) GenerateMapVolumeFunc( _, resizeError := og.nodeExpandVolume(volumeToMount, actualStateOfWorld, resizeOptions) if resizeError != nil { klog.Errorf("MapVolume.NodeExpandVolume failed with %v", resizeError) - return volumeToMount.GenerateError("MapVolume.MarkVolumeAsMounted failed while expanding volume", resizeError) + eventErr, detailedErr := volumeToMount.GenerateError("MapVolume.MarkVolumeAsMounted failed while expanding volume", resizeError) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } markVolMountedErr := actualStateOfWorld.MarkVolumeAsMounted(markVolumeOpts) if markVolMountedErr != nil { // On failure, return error. Caller will log and retry. - return volumeToMount.GenerateError("MapVolume.MarkVolumeAsMounted failed", markVolMountedErr) + eventErr, detailedErr := volumeToMount.GenerateError("MapVolume.MarkVolumeAsMounted failed", markVolMountedErr) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } - return nil, nil + return volumetypes.NewOperationContext(nil, nil, migrated) } eventRecorderFunc := func(err *error) { @@ -1144,7 +1199,10 @@ func (og *operationGenerator) GenerateUnmapVolumeFunc( return volumetypes.GeneratedOperations{}, volumeToUnmount.GenerateErrorDetailed("UnmapVolume.NewUnmapper failed", newUnmapperErr) } - unmapVolumeFunc := func() (error, error) { + unmapVolumeFunc := func() volumetypes.OperationContext { + + migrated := getMigratedStatusBySpec(volumeToUnmount.VolumeSpec) + // pods/{podUid}/volumeDevices/{escapeQualifiedPluginName}/{volumeName} podDeviceUnmapPath, volName := blockVolumeUnmapper.GetPodDeviceMapPath() // plugins/kubernetes.io/{PluginName}/volumeDevices/{volumePluginDependentPath}/{podUID} @@ -1154,7 +1212,8 @@ func (og *operationGenerator) GenerateUnmapVolumeFunc( unmapErr := util.UnmapBlockVolume(og.blkUtil, globalUnmapPath, podDeviceUnmapPath, volName, volumeToUnmount.PodUID) if unmapErr != nil { // On failure, return error. Caller will log and retry. - return volumeToUnmount.GenerateError("UnmapVolume.UnmapBlockVolume failed", unmapErr) + eventErr, detailedErr := volumeToUnmount.GenerateError("UnmapVolume.UnmapBlockVolume failed", unmapErr) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } // Call UnmapPodDevice if blockVolumeUnmapper implements CustomBlockVolumeUnmapper @@ -1163,7 +1222,8 @@ func (og *operationGenerator) GenerateUnmapVolumeFunc( unmapErr = customBlockVolumeUnmapper.UnmapPodDevice() if unmapErr != nil { // On failure, return error. Caller will log and retry. - return volumeToUnmount.GenerateError("UnmapVolume.UnmapPodDevice failed", unmapErr) + eventErr, detailedErr := volumeToUnmount.GenerateError("UnmapVolume.UnmapPodDevice failed", unmapErr) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } } @@ -1185,7 +1245,7 @@ func (og *operationGenerator) GenerateUnmapVolumeFunc( klog.Errorf(volumeToUnmount.GenerateErrorDetailed("UnmapVolume.MarkVolumeAsUnmounted failed", markVolUnmountedErr).Error()) } - return nil, nil + return volumetypes.NewOperationContext(nil, nil, migrated) } return volumetypes.GeneratedOperations{ @@ -1228,7 +1288,8 @@ func (og *operationGenerator) GenerateUnmapDeviceFunc( return volumetypes.GeneratedOperations{}, deviceToDetach.GenerateErrorDetailed("UnmapDevice.NewUnmapper failed", newUnmapperErr) } - unmapDeviceFunc := func() (error, error) { + unmapDeviceFunc := func() volumetypes.OperationContext { + migrated := getMigratedStatusBySpec(deviceToDetach.VolumeSpec) // Search under globalMapPath dir if all symbolic links from pods have been removed already. // If symbolic links are there, pods may still refer the volume. globalMapPath := deviceToDetach.DeviceMountPath @@ -1238,12 +1299,14 @@ func (og *operationGenerator) GenerateUnmapDeviceFunc( // Looks like SetupDevice did not complete. Fall through to TearDownDevice and mark the device as unmounted. refs = nil } else { - return deviceToDetach.GenerateError("UnmapDevice.GetDeviceBindMountRefs check failed", err) + eventErr, detailedErr := deviceToDetach.GenerateError("UnmapDevice.GetDeviceBindMountRefs check failed", err) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } } if len(refs) > 0 { err = fmt.Errorf("the device %q is still referenced from other Pods %v", globalMapPath, refs) - return deviceToDetach.GenerateError("UnmapDevice failed", err) + eventErr, detailedErr := deviceToDetach.GenerateError("UnmapDevice failed", err) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } // Call TearDownDevice if blockVolumeUnmapper implements CustomBlockVolumeUnmapper @@ -1252,7 +1315,8 @@ func (og *operationGenerator) GenerateUnmapDeviceFunc( unmapErr := customBlockVolumeUnmapper.TearDownDevice(globalMapPath, deviceToDetach.DevicePath) if unmapErr != nil { // On failure, return error. Caller will log and retry. - return deviceToDetach.GenerateError("UnmapDevice.TearDownDevice failed", unmapErr) + eventErr, detailedErr := deviceToDetach.GenerateError("UnmapDevice.TearDownDevice failed", unmapErr) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } } @@ -1261,7 +1325,8 @@ func (og *operationGenerator) GenerateUnmapDeviceFunc( removeMapPathErr := og.blkUtil.RemoveMapPath(globalMapPath) if removeMapPathErr != nil { // On failure, return error. Caller will log and retry. - return deviceToDetach.GenerateError("UnmapDevice.RemoveMapPath failed", removeMapPathErr) + eventErr, detailedErr := deviceToDetach.GenerateError("UnmapDevice.RemoveMapPath failed", removeMapPathErr) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } // Before logging that UnmapDevice succeeded and moving on, @@ -1270,13 +1335,14 @@ func (og *operationGenerator) GenerateUnmapDeviceFunc( // else on the system. Retry if it returns true. deviceOpened, deviceOpenedErr := isDeviceOpened(deviceToDetach, hostutil) if deviceOpenedErr != nil { - return nil, deviceOpenedErr + return volumetypes.NewOperationContext(nil, deviceOpenedErr, migrated) } // The device is still in use elsewhere. Caller will log and retry. if deviceOpened { - return deviceToDetach.GenerateError( + eventErr, detailedErr := deviceToDetach.GenerateError( "UnmapDevice failed", fmt.Errorf("the device is in use when it was no longer expected to be in use")) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } klog.Infof(deviceToDetach.GenerateMsgDetailed("UnmapDevice succeeded", "")) @@ -1286,10 +1352,11 @@ func (og *operationGenerator) GenerateUnmapDeviceFunc( deviceToDetach.VolumeName) if markDeviceUnmountedErr != nil { // On failure, return error. Caller will log and retry. - return deviceToDetach.GenerateError("MarkDeviceAsUnmounted failed", markDeviceUnmountedErr) + eventErr, detailedErr := deviceToDetach.GenerateError("MarkDeviceAsUnmounted failed", markDeviceUnmountedErr) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } - return nil, nil + return volumetypes.NewOperationContext(nil, nil, migrated) } return volumetypes.GeneratedOperations{ @@ -1310,7 +1377,8 @@ func (og *operationGenerator) GenerateVerifyControllerAttachedVolumeFunc( return volumetypes.GeneratedOperations{}, volumeToMount.GenerateErrorDetailed("VerifyControllerAttachedVolume.FindPluginBySpec failed", err) } - verifyControllerAttachedVolumeFunc := func() (error, error) { + verifyControllerAttachedVolumeFunc := func() volumetypes.OperationContext { + migrated := getMigratedStatusBySpec(volumeToMount.VolumeSpec) if !volumeToMount.PluginIsAttachable { // If the volume does not implement the attacher interface, it is // assumed to be attached and the actual state of the world is @@ -1320,10 +1388,11 @@ func (og *operationGenerator) GenerateVerifyControllerAttachedVolumeFunc( volumeToMount.VolumeName, volumeToMount.VolumeSpec, nodeName, "" /* devicePath */) if addVolumeNodeErr != nil { // On failure, return error. Caller will log and retry. - return volumeToMount.GenerateError("VerifyControllerAttachedVolume.MarkVolumeAsAttachedByUniqueVolumeName failed", addVolumeNodeErr) + eventErr, detailedErr := volumeToMount.GenerateError("VerifyControllerAttachedVolume.MarkVolumeAsAttachedByUniqueVolumeName failed", addVolumeNodeErr) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } - return nil, nil + return volumetypes.NewOperationContext(nil, nil, migrated) } if !volumeToMount.ReportedInUse { @@ -1333,21 +1402,24 @@ func (og *operationGenerator) GenerateVerifyControllerAttachedVolumeFunc( // periodically by kubelet, so it may take as much as 10 seconds // before this clears. // Issue #28141 to enable on demand status updates. - return volumeToMount.GenerateError("Volume has not been added to the list of VolumesInUse in the node's volume status", nil) + eventErr, detailedErr := volumeToMount.GenerateError("Volume has not been added to the list of VolumesInUse in the node's volume status", nil) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } // Fetch current node object node, fetchErr := og.kubeClient.CoreV1().Nodes().Get(context.TODO(), string(nodeName), metav1.GetOptions{}) if fetchErr != nil { // On failure, return error. Caller will log and retry. - return volumeToMount.GenerateError("VerifyControllerAttachedVolume failed fetching node from API server", fetchErr) + eventErr, detailedErr := volumeToMount.GenerateError("VerifyControllerAttachedVolume failed fetching node from API server", fetchErr) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } if node == nil { // On failure, return error. Caller will log and retry. - return volumeToMount.GenerateError( + eventErr, detailedErr := volumeToMount.GenerateError( "VerifyControllerAttachedVolume failed", fmt.Errorf("node object retrieved from API server is nil")) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } for _, attachedVolume := range node.Status.VolumesAttached { @@ -1357,14 +1429,16 @@ func (og *operationGenerator) GenerateVerifyControllerAttachedVolumeFunc( klog.Infof(volumeToMount.GenerateMsgDetailed("Controller attach succeeded", fmt.Sprintf("device path: %q", attachedVolume.DevicePath))) if addVolumeNodeErr != nil { // On failure, return error. Caller will log and retry. - return volumeToMount.GenerateError("VerifyControllerAttachedVolume.MarkVolumeAsAttached failed", addVolumeNodeErr) + eventErr, detailedErr := volumeToMount.GenerateError("VerifyControllerAttachedVolume.MarkVolumeAsAttached failed", addVolumeNodeErr) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } - return nil, nil + return volumetypes.NewOperationContext(nil, nil, migrated) } } // Volume not attached, return error. Caller will log and retry. - return volumeToMount.GenerateError("Volume not attached according to node status", nil) + eventErr, detailedErr := volumeToMount.GenerateError("Volume not attached according to node status", nil) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } return volumetypes.GeneratedOperations{ @@ -1425,7 +1499,10 @@ func (og *operationGenerator) GenerateExpandVolumeFunc( return volumetypes.GeneratedOperations{}, fmt.Errorf("can not find plugin for expanding volume: %q", util.GetPersistentVolumeClaimQualifiedName(pvc)) } - expandVolumeFunc := func() (error, error) { + expandVolumeFunc := func() volumetypes.OperationContext { + + migrated := false + newSize := pvc.Spec.Resources.Requests[v1.ResourceStorage] statusSize := pvc.Status.Capacity[v1.ResourceStorage] pvSize := pv.Spec.Capacity[v1.ResourceStorage] @@ -1436,7 +1513,7 @@ func (og *operationGenerator) GenerateExpandVolumeFunc( statusSize) if expandErr != nil { detailedErr := fmt.Errorf("error expanding volume %q of plugin %q: %v", util.GetPersistentVolumeClaimQualifiedName(pvc), volumePlugin.GetPluginName(), expandErr) - return detailedErr, detailedErr + return volumetypes.NewOperationContext(detailedErr, detailedErr, migrated) } klog.Infof("ExpandVolume succeeded for volume %s", util.GetPersistentVolumeClaimQualifiedName(pvc)) @@ -1448,7 +1525,7 @@ func (og *operationGenerator) GenerateExpandVolumeFunc( updateErr := util.UpdatePVSize(pv, newSize, og.kubeClient) if updateErr != nil { detailedErr := fmt.Errorf("error updating PV spec capacity for volume %q with : %v", util.GetPersistentVolumeClaimQualifiedName(pvc), updateErr) - return detailedErr, detailedErr + return volumetypes.NewOperationContext(detailedErr, detailedErr, migrated) } klog.Infof("ExpandVolume.UpdatePV succeeded for volume %s", util.GetPersistentVolumeClaimQualifiedName(pvc)) @@ -1463,7 +1540,7 @@ func (og *operationGenerator) GenerateExpandVolumeFunc( err := util.MarkResizeFinished(pvc, newSize, og.kubeClient) if err != nil { detailedErr := fmt.Errorf("error marking pvc %s as resized : %v", util.GetPersistentVolumeClaimQualifiedName(pvc), err) - return detailedErr, detailedErr + return volumetypes.NewOperationContext(detailedErr, detailedErr, migrated) } successMsg := fmt.Sprintf("ExpandVolume succeeded for volume %s", util.GetPersistentVolumeClaimQualifiedName(pvc)) og.recorder.Eventf(pvc, v1.EventTypeNormal, kevents.VolumeResizeSuccess, successMsg) @@ -1472,10 +1549,18 @@ func (og *operationGenerator) GenerateExpandVolumeFunc( if err != nil { detailedErr := fmt.Errorf("error updating pvc %s condition for fs resize : %v", util.GetPersistentVolumeClaimQualifiedName(pvc), err) klog.Warning(detailedErr) - return nil, nil + return volumetypes.NewOperationContext(nil, nil, migrated) + } + oldCapacity := pvc.Status.Capacity[v1.ResourceStorage] + err = util.AddAnnPreResizeCapacity(pv, oldCapacity, og.kubeClient) + if err != nil { + detailedErr := fmt.Errorf("error updating pv %s annotation (%s) with pre-resize capacity %s: %v", pv.ObjectMeta.Name, util.AnnPreResizeCapacity, oldCapacity.String(), err) + klog.Warning(detailedErr) + return volumetypes.NewOperationContext(nil, nil, migrated) } + } - return nil, nil + return volumetypes.NewOperationContext(nil, nil, migrated) } eventRecorderFunc := func(err *error) { @@ -1502,16 +1587,19 @@ func (og *operationGenerator) GenerateExpandInUseVolumeFunc( return volumetypes.GeneratedOperations{}, volumeToMount.GenerateErrorDetailed("NodeExpandVolume.FindPluginBySpec failed", err) } - fsResizeFunc := func() (error, error) { + fsResizeFunc := func() volumetypes.OperationContext { var resizeDone bool - var simpleErr, detailedErr error + var eventErr, detailedErr error + migrated := false + resizeOptions := volume.NodeResizeOptions{ VolumeSpec: volumeToMount.VolumeSpec, DevicePath: volumeToMount.DevicePath, } fsVolume, err := util.CheckVolumeModeFilesystem(volumeToMount.VolumeSpec) if err != nil { - return volumeToMount.GenerateError("NodeExpandvolume.CheckVolumeModeFilesystem failed", err) + eventErr, detailedErr = volumeToMount.GenerateError("NodeExpandvolume.CheckVolumeModeFilesystem failed", err) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } if fsVolume { @@ -1520,7 +1608,8 @@ func (og *operationGenerator) GenerateExpandInUseVolumeFunc( volumeToMount.Pod, volume.VolumeOptions{}) if newMounterErr != nil { - return volumeToMount.GenerateError("NodeExpandVolume.NewMounter initialization failed", newMounterErr) + eventErr, detailedErr = volumeToMount.GenerateError("NodeExpandVolume.NewMounter initialization failed", newMounterErr) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } resizeOptions.DeviceMountPath = volumeMounter.GetPath() @@ -1534,7 +1623,8 @@ func (og *operationGenerator) GenerateExpandInUseVolumeFunc( if volumeDeviceMounter != nil { deviceStagePath, err := volumeDeviceMounter.GetDeviceMountPath(volumeToMount.VolumeSpec) if err != nil { - return volumeToMount.GenerateError("NodeExpandVolume.GetDeviceMountPath failed", err) + eventErr, detailedErr = volumeToMount.GenerateError("NodeExpandVolume.GetDeviceMountPath failed", err) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } resizeOptions.DeviceStagePath = deviceStagePath } @@ -1543,11 +1633,13 @@ func (og *operationGenerator) GenerateExpandInUseVolumeFunc( blockVolumePlugin, err := og.volumePluginMgr.FindMapperPluginBySpec(volumeToMount.VolumeSpec) if err != nil { - return volumeToMount.GenerateError("MapVolume.FindMapperPluginBySpec failed", err) + eventErr, detailedErr = volumeToMount.GenerateError("MapVolume.FindMapperPluginBySpec failed", err) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } if blockVolumePlugin == nil { - return volumeToMount.GenerateError("MapVolume.FindMapperPluginBySpec failed to find BlockVolumeMapper plugin. Volume plugin is nil.", nil) + eventErr, detailedErr = volumeToMount.GenerateError("MapVolume.FindMapperPluginBySpec failed to find BlockVolumeMapper plugin. Volume plugin is nil.", nil) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } blockVolumeMapper, newMapperErr := blockVolumePlugin.NewBlockVolumeMapper( @@ -1555,7 +1647,8 @@ func (og *operationGenerator) GenerateExpandInUseVolumeFunc( volumeToMount.Pod, volume.VolumeOptions{}) if newMapperErr != nil { - return volumeToMount.GenerateError("MapVolume.NewBlockVolumeMapper initialization failed", newMapperErr) + eventErr, detailedErr = volumeToMount.GenerateError("MapVolume.NewBlockVolumeMapper initialization failed", newMapperErr) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } // if plugin supports custom mappers lets add DeviceStagePath @@ -1566,16 +1659,17 @@ func (og *operationGenerator) GenerateExpandInUseVolumeFunc( // if we are doing online expansion then volume is already published resizeOptions.CSIVolumePhase = volume.CSIVolumePublished - resizeDone, simpleErr, detailedErr = og.doOnlineExpansion(volumeToMount, actualStateOfWorld, resizeOptions) - if simpleErr != nil || detailedErr != nil { - return simpleErr, detailedErr + resizeDone, eventErr, detailedErr = og.doOnlineExpansion(volumeToMount, actualStateOfWorld, resizeOptions) + if eventErr != nil || detailedErr != nil { + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } if resizeDone { - return nil, nil + return volumetypes.NewOperationContext(nil, nil, migrated) } // This is a placeholder error - we should NEVER reach here. err = fmt.Errorf("volume resizing failed for unknown reason") - return volumeToMount.GenerateError("NodeExpandVolume.NodeExpandVolume failed to resize volume", err) + eventErr, detailedErr = volumeToMount.GenerateError("NodeExpandVolume.NodeExpandVolume failed to resize volume", err) + return volumetypes.NewOperationContext(eventErr, detailedErr, migrated) } eventRecorderFunc := func(err *error) { @@ -1762,3 +1856,11 @@ func findDetachablePluginBySpec(spec *volume.Spec, pm *volume.VolumePluginMgr) ( } return nil, nil } + +func getMigratedStatusBySpec(spec *volume.Spec) bool { + migrated := false + if spec != nil { + migrated = spec.Migrated + } + return migrated +} diff --git a/vendor/k8s.io/kubernetes/pkg/volume/util/recyclerclient/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/util/recyclerclient/BUILD deleted file mode 100644 index 54fde842be6e..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/util/recyclerclient/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["recycler_client.go"], - importpath = "k8s.io/kubernetes/pkg/volume/util/recyclerclient", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["recycler_client_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/util/resize_util.go b/vendor/k8s.io/kubernetes/pkg/volume/util/resize_util.go index 59d9c2a90c11..195819d14087 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/util/resize_util.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/util/resize_util.go @@ -21,9 +21,7 @@ import ( "encoding/json" "fmt" - "k8s.io/mount-utils" - - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -31,9 +29,9 @@ import ( "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/strategicpatch" clientset "k8s.io/client-go/kubernetes" - "k8s.io/kubernetes/pkg/util/resizefs" "k8s.io/kubernetes/pkg/volume" volumetypes "k8s.io/kubernetes/pkg/volume/util/types" + "k8s.io/mount-utils" ) var ( @@ -41,6 +39,12 @@ var ( v1.PersistentVolumeClaimFileSystemResizePending: true, v1.PersistentVolumeClaimResizing: true, } + + // AnnPreResizeCapacity annotation is added to a PV when expanding volume. + // Its value is status capacity of the PVC prior to the volume expansion + // Its value will be set by the external-resizer when it deems that filesystem resize is required after resizing volume. + // Its value will be used by pv_controller to determine pvc's status capacity when binding pvc and pv. + AnnPreResizeCapacity = "volume.alpha.kubernetes.io/pre-resize-capacity" ) type resizeProcessStatus struct { @@ -59,27 +63,67 @@ func UpdatePVSize( newSize resource.Quantity, kubeClient clientset.Interface) error { pvClone := pv.DeepCopy() + pvClone.Spec.Capacity[v1.ResourceStorage] = newSize - oldData, err := json.Marshal(pvClone) - if err != nil { - return fmt.Errorf("unexpected error marshaling old PV %q with error : %v", pvClone.Name, err) + return PatchPV(pv, pvClone, kubeClient) +} + +// AddAnnPreResizeCapacity adds volume.alpha.kubernetes.io/pre-resize-capacity from the pv +func AddAnnPreResizeCapacity( + pv *v1.PersistentVolume, + oldCapacity resource.Quantity, + kubeClient clientset.Interface) error { + // if the pv already has a resize annotation skip the process + if metav1.HasAnnotation(pv.ObjectMeta, AnnPreResizeCapacity) { + return nil } - pvClone.Spec.Capacity[v1.ResourceStorage] = newSize + pvClone := pv.DeepCopy() + if pvClone.ObjectMeta.Annotations == nil { + pvClone.ObjectMeta.Annotations = make(map[string]string) + } + pvClone.ObjectMeta.Annotations[AnnPreResizeCapacity] = oldCapacity.String() - newData, err := json.Marshal(pvClone) + return PatchPV(pv, pvClone, kubeClient) +} + +// DeleteAnnPreResizeCapacity deletes volume.alpha.kubernetes.io/pre-resize-capacity from the pv +func DeleteAnnPreResizeCapacity( + pv *v1.PersistentVolume, + kubeClient clientset.Interface) error { + // if the pv does not have a resize annotation skip the entire process + if !metav1.HasAnnotation(pv.ObjectMeta, AnnPreResizeCapacity) { + return nil + } + pvClone := pv.DeepCopy() + delete(pvClone.ObjectMeta.Annotations, AnnPreResizeCapacity) + + return PatchPV(pv, pvClone, kubeClient) +} + +// PatchPV creates and executes a patch for pv +func PatchPV( + oldPV *v1.PersistentVolume, + newPV *v1.PersistentVolume, + kubeClient clientset.Interface) error { + oldData, err := json.Marshal(oldPV) + if err != nil { + return fmt.Errorf("unexpected error marshaling old PV %q with error : %v", oldPV.Name, err) + } + + newData, err := json.Marshal(newPV) if err != nil { - return fmt.Errorf("unexpected error marshaling new PV %q with error : %v", pvClone.Name, err) + return fmt.Errorf("unexpected error marshaling new PV %q with error : %v", newPV.Name, err) } - patchBytes, err := strategicpatch.CreateTwoWayMergePatch(oldData, newData, pvClone) + patchBytes, err := strategicpatch.CreateTwoWayMergePatch(oldData, newData, oldPV) if err != nil { - return fmt.Errorf("error Creating two way merge patch for PV %q with error : %v", pvClone.Name, err) + return fmt.Errorf("error Creating two way merge patch for PV %q with error : %v", oldPV.Name, err) } - _, err = kubeClient.CoreV1().PersistentVolumes().Patch(context.TODO(), pvClone.Name, types.StrategicMergePatchType, patchBytes, metav1.PatchOptions{}) + _, err = kubeClient.CoreV1().PersistentVolumes().Patch(context.TODO(), oldPV.Name, types.StrategicMergePatchType, patchBytes, metav1.PatchOptions{}) if err != nil { - return fmt.Errorf("error Patching PV %q with error : %v", pvClone.Name, err) + return fmt.Errorf("error Patching PV %q with error : %v", oldPV.Name, err) } return nil } @@ -266,11 +310,6 @@ func MergeResizeConditionOnPVC( // GenericResizeFS : call generic filesystem resizer for plugins that don't have any special filesystem resize requirements func GenericResizeFS(host volume.VolumeHost, pluginName, devicePath, deviceMountPath string) (bool, error) { - mounter := host.GetMounter(pluginName) - diskFormatter := &mount.SafeFormatAndMount{ - Interface: mounter, - Exec: host.GetExec(pluginName), - } - resizer := resizefs.NewResizeFs(diskFormatter) + resizer := mount.NewResizeFs(host.GetExec(pluginName)) return resizer.Resize(devicePath, deviceMountPath) } diff --git a/vendor/k8s.io/kubernetes/pkg/volume/util/subpath/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/util/subpath/BUILD deleted file mode 100644 index 37908f614db4..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/util/subpath/BUILD +++ /dev/null @@ -1,118 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "subpath.go", - "subpath_linux.go", - "subpath_unsupported.go", - "subpath_windows.go", - ], - importpath = "k8s.io/kubernetes/pkg/volume/util/subpath", - visibility = ["//visibility:public"], - deps = select({ - "@io_bazel_rules_go//go/platform:aix": [ - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/k8s.io/utils/nsenter:go_default_library", - ], - "@io_bazel_rules_go//go/platform:android": [ - "//pkg/volume/util/hostutil:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/golang.org/x/sys/unix:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/k8s.io/utils/nsenter:go_default_library", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/k8s.io/utils/nsenter:go_default_library", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/k8s.io/utils/nsenter:go_default_library", - ], - "@io_bazel_rules_go//go/platform:illumos": [ - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/k8s.io/utils/nsenter:go_default_library", - ], - "@io_bazel_rules_go//go/platform:ios": [ - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/k8s.io/utils/nsenter:go_default_library", - ], - "@io_bazel_rules_go//go/platform:js": [ - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/k8s.io/utils/nsenter:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//pkg/volume/util/hostutil:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/golang.org/x/sys/unix:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/k8s.io/utils/nsenter:go_default_library", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/k8s.io/utils/nsenter:go_default_library", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/k8s.io/utils/nsenter:go_default_library", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/k8s.io/utils/nsenter:go_default_library", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/k8s.io/utils/nsenter:go_default_library", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/nsenter:go_default_library", - ], - "//conditions:default": [], - }), -) - -go_test( - name = "go_default_test", - srcs = [ - "subpath_linux_test.go", - "subpath_windows_test.go", - ], - embed = [":go_default_library"], - deps = select({ - "@io_bazel_rules_go//go/platform:android": [ - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/util/subpath/subpath_linux.go b/vendor/k8s.io/kubernetes/pkg/volume/util/subpath/subpath_linux.go index c04f0a78f370..1140f75ce5d6 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/util/subpath/subpath_linux.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/util/subpath/subpath_linux.go @@ -433,29 +433,29 @@ func doSafeMakeDir(pathname string, base string, perm os.FileMode) error { } parentFD = childFD childFD = -1 - } - // Everything was created. mkdirat(..., perm) above was affected by current - // umask and we must apply the right permissions to the last directory - // (that's the one that will be available to the container as subpath) - // so user can read/write it. This is the behavior of previous code. - // TODO: chmod all created directories, not just the last one. - // parentFD is the last created directory. + // Everything was created. mkdirat(..., perm) above was affected by current + // umask and we must apply the right permissions to the all created directory. + // (that's the one that will be available to the container as subpath) + // so user can read/write it. + // parentFD is the last created directory. - // Translate perm (os.FileMode) to uint32 that fchmod() expects - kernelPerm := uint32(perm & os.ModePerm) - if perm&os.ModeSetgid > 0 { - kernelPerm |= syscall.S_ISGID - } - if perm&os.ModeSetuid > 0 { - kernelPerm |= syscall.S_ISUID - } - if perm&os.ModeSticky > 0 { - kernelPerm |= syscall.S_ISVTX - } - if err = syscall.Fchmod(parentFD, kernelPerm); err != nil { - return fmt.Errorf("chmod %q failed: %s", currentPath, err) + // Translate perm (os.FileMode) to uint32 that fchmod() expects + kernelPerm := uint32(perm & os.ModePerm) + if perm&os.ModeSetgid > 0 { + kernelPerm |= syscall.S_ISGID + } + if perm&os.ModeSetuid > 0 { + kernelPerm |= syscall.S_ISUID + } + if perm&os.ModeSticky > 0 { + kernelPerm |= syscall.S_ISVTX + } + if err = syscall.Fchmod(parentFD, kernelPerm); err != nil { + return fmt.Errorf("chmod %q failed: %s", currentPath, err) + } } + return nil } diff --git a/vendor/k8s.io/kubernetes/pkg/volume/util/subpath/subpath_windows.go b/vendor/k8s.io/kubernetes/pkg/volume/util/subpath/subpath_windows.go index 0e9367eaf00d..3428e6395469 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/util/subpath/subpath_windows.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/util/subpath/subpath_windows.go @@ -75,7 +75,7 @@ func getUpperPath(path string) string { // Check whether a directory/file is a link type or not // LinkType could be SymbolicLink, Junction, or HardLink func isLinkPath(path string) (bool, error) { - cmd := fmt.Sprintf("(Get-Item -Path %s).LinkType", path) + cmd := fmt.Sprintf("(Get-Item -LiteralPath %q).LinkType", path) output, err := exec.Command("powershell", "/c", cmd).CombinedOutput() if err != nil { return false, err @@ -113,7 +113,7 @@ func evalSymlink(path string) (string, error) { } } // This command will give the target path of a given symlink - cmd := fmt.Sprintf("(Get-Item -Path %s).Target", upperpath) + cmd := fmt.Sprintf("(Get-Item -LiteralPath %q).Target", upperpath) output, err := exec.Command("powershell", "/c", cmd).CombinedOutput() if err != nil { return "", err diff --git a/vendor/k8s.io/kubernetes/pkg/volume/util/types/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/util/types/BUILD deleted file mode 100644 index 37f1f0f121dc..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/util/types/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["types.go"], - importpath = "k8s.io/kubernetes/pkg/volume/util/types", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["types_test.go"], - embed = [":go_default_library"], - deps = ["//staging/src/k8s.io/mount-utils:go_default_library"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/util/types/types.go b/vendor/k8s.io/kubernetes/pkg/volume/util/types/types.go index 9a9eb2f81fe7..c07dcfe215c5 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/util/types/types.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/util/types/types.go @@ -36,22 +36,48 @@ type UniquePVCName types.UID type GeneratedOperations struct { // Name of operation - could be used for resetting shared exponential backoff OperationName string - OperationFunc func() (eventErr error, detailedErr error) + OperationFunc func() (context OperationContext) EventRecorderFunc func(*error) - CompleteFunc func(*error) + CompleteFunc func(CompleteFuncParam) +} + +type OperationContext struct { + EventErr error + DetailedErr error + Migrated bool +} + +func NewOperationContext(eventErr, detailedErr error, migrated bool) OperationContext { + return OperationContext{ + EventErr: eventErr, + DetailedErr: detailedErr, + Migrated: migrated, + } +} + +type CompleteFuncParam struct { + Err *error + Migrated *bool } // Run executes the operations and its supporting functions func (o *GeneratedOperations) Run() (eventErr, detailedErr error) { + var context OperationContext if o.CompleteFunc != nil { - defer o.CompleteFunc(&detailedErr) + c := CompleteFuncParam{ + Err: &context.DetailedErr, + Migrated: &context.Migrated, + } + defer o.CompleteFunc(c) } if o.EventRecorderFunc != nil { defer o.EventRecorderFunc(&eventErr) } // Handle panic, if any, from operationFunc() defer runtime.RecoverFromPanic(&detailedErr) - return o.OperationFunc() + + context = o.OperationFunc() + return context.EventErr, context.DetailedErr } // FailedPrecondition error indicates CSI operation returned failed precondition diff --git a/vendor/k8s.io/kubernetes/pkg/volume/util/util.go b/vendor/k8s.io/kubernetes/pkg/volume/util/util.go index 367e05a0d1a0..fdc7bfb1b049 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/util/util.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/util/util.go @@ -20,6 +20,7 @@ import ( "context" "fmt" "io/ioutil" + storagehelpers "k8s.io/component-helpers/storage/volume" "os" "path/filepath" "reflect" @@ -42,7 +43,6 @@ import ( clientset "k8s.io/client-go/kubernetes" "k8s.io/kubernetes/pkg/api/legacyscheme" podutil "k8s.io/kubernetes/pkg/api/v1/pod" - v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper" "k8s.io/kubernetes/pkg/securitycontext" "k8s.io/kubernetes/pkg/volume" "k8s.io/kubernetes/pkg/volume/util/types" @@ -150,7 +150,7 @@ func GetClassForVolume(kubeClient clientset.Interface, pv *v1.PersistentVolume) if kubeClient == nil { return nil, fmt.Errorf("cannot get kube client") } - className := v1helper.GetPersistentVolumeClass(pv) + className := storagehelpers.GetPersistentVolumeClass(pv) if className == "" { return nil, fmt.Errorf("volume has no storage class") } @@ -583,10 +583,12 @@ func GetPluginMountDir(host volume.VolumeHost, name string) string { // IsLocalEphemeralVolume determines whether the argument is a local ephemeral // volume vs. some other type +// Local means the volume is using storage from the local disk that is managed by kubelet. +// Ephemeral means the lifecycle of the volume is the same as the Pod. func IsLocalEphemeralVolume(volume v1.Volume) bool { return volume.GitRepo != nil || - (volume.EmptyDir != nil && volume.EmptyDir.Medium != v1.StorageMediumMemory) || - volume.ConfigMap != nil || volume.DownwardAPI != nil + (volume.EmptyDir != nil && volume.EmptyDir.Medium == v1.StorageMediumDefault) || + volume.ConfigMap != nil } // GetPodVolumeNames returns names of volumes that are used in a pod, diff --git a/vendor/k8s.io/kubernetes/pkg/volume/util/volumepathhandler/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/util/volumepathhandler/BUILD deleted file mode 100644 index c9a3bde26668..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/util/volumepathhandler/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "volume_path_handler.go", - "volume_path_handler_linux.go", - "volume_path_handler_unsupported.go", - ], - importpath = "k8s.io/kubernetes/pkg/volume/util/volumepathhandler", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/validation/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/validation/BUILD deleted file mode 100644 index 1dc274dba708..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/validation/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["pv_validation_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["pv_validation.go"], - importpath = "k8s.io/kubernetes/pkg/volume/validation", - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/volume.go b/vendor/k8s.io/kubernetes/pkg/volume/volume.go index 85b8c4aaa525..2ec1e5233bab 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/volume.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/volume.go @@ -92,6 +92,17 @@ type Metrics struct { // a filesystem with the host (e.g. emptydir, hostpath), this is the free inodes // on the underlying storage, and is shared with host processes and other volumes InodesFree *resource.Quantity + + // Normal volumes are available for use and operating optimally. + // An abnormal volume does not meet these criteria. + // This field is OPTIONAL. Only some csi drivers which support NodeServiceCapability_RPC_VOLUME_CONDITION + // need to fill it. + Abnormal *bool + + // The message describing the condition of the volume. + // This field is OPTIONAL. Only some csi drivers which support capability_RPC_VOLUME_CONDITION + // need to fill it. + Message *string } // Attributes represents the attributes of this mounter. diff --git a/vendor/k8s.io/kubernetes/pkg/volume/volume_linux.go b/vendor/k8s.io/kubernetes/pkg/volume/volume_linux.go index 17a1d3ef7385..214e9db33023 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/volume_linux.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/volume_linux.go @@ -29,6 +29,7 @@ import ( utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/klog/v2" "k8s.io/kubernetes/pkg/features" + "k8s.io/kubernetes/pkg/volume/util/types" ) const ( @@ -40,7 +41,7 @@ const ( // SetVolumeOwnership modifies the given volume to be owned by // fsGroup, and sets SetGid so that newly created files are owned by // fsGroup. If fsGroup is nil nothing is done. -func SetVolumeOwnership(mounter Mounter, fsGroup *int64, fsGroupChangePolicy *v1.PodFSGroupChangePolicy, completeFunc func(*error)) error { +func SetVolumeOwnership(mounter Mounter, fsGroup *int64, fsGroupChangePolicy *v1.PodFSGroupChangePolicy, completeFunc func(types.CompleteFuncParam)) error { if fsGroup == nil { return nil } @@ -57,7 +58,9 @@ func SetVolumeOwnership(mounter Mounter, fsGroup *int64, fsGroupChangePolicy *v1 if !fsGroupPolicyEnabled { err := legacyOwnershipChange(mounter, fsGroup) if completeFunc != nil { - completeFunc(&err) + completeFunc(types.CompleteFuncParam{ + Err: &err, + }) } return err } @@ -74,7 +77,9 @@ func SetVolumeOwnership(mounter Mounter, fsGroup *int64, fsGroupChangePolicy *v1 return changeFilePermission(path, fsGroup, mounter.GetAttributes().ReadOnly, info) }) if completeFunc != nil { - completeFunc(&err) + completeFunc(types.CompleteFuncParam{ + Err: &err, + }) } return err } @@ -89,32 +94,22 @@ func legacyOwnershipChange(mounter Mounter, fsGroup *int64) error { } func changeFilePermission(filename string, fsGroup *int64, readonly bool, info os.FileInfo) error { - // chown and chmod pass through to the underlying file for symlinks. + err := os.Lchown(filename, -1, int(*fsGroup)) + if err != nil { + klog.Errorf("Lchown failed on %v: %v", filename, err) + } + + // chmod passes through to the underlying file for symlinks. // Symlinks have a mode of 777 but this really doesn't mean anything. // The permissions of the underlying file are what matter. // However, if one reads the mode of a symlink then chmods the symlink // with that mode, it changes the mode of the underlying file, overridden // the defaultMode and permissions initialized by the volume plugin, which - // is not what we want; thus, we skip chown/chmod for symlinks. + // is not what we want; thus, we skip chmod for symlinks. if info.Mode()&os.ModeSymlink != 0 { return nil } - stat, ok := info.Sys().(*syscall.Stat_t) - if !ok { - return nil - } - - if stat == nil { - klog.Errorf("Got nil stat_t for path %v while setting ownership of volume", filename) - return nil - } - - err := os.Chown(filename, int(stat.Uid), int(*fsGroup)) - if err != nil { - klog.Errorf("Chown failed on %v: %v", filename, err) - } - mask := rwMask if readonly { mask = roMask diff --git a/vendor/k8s.io/kubernetes/pkg/volume/volume_unsupported.go b/vendor/k8s.io/kubernetes/pkg/volume/volume_unsupported.go index 9cb094fe9e8a..dcd2065b5734 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/volume_unsupported.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/volume_unsupported.go @@ -20,8 +20,9 @@ package volume import ( v1 "k8s.io/api/core/v1" + "k8s.io/kubernetes/pkg/volume/util/types" ) -func SetVolumeOwnership(mounter Mounter, fsGroup *int64, fsGroupChangePolicy *v1.PodFSGroupChangePolicy, completeFunc func(*error)) error { +func SetVolumeOwnership(mounter Mounter, fsGroup *int64, fsGroupChangePolicy *v1.PodFSGroupChangePolicy, completeFunc func(types.CompleteFuncParam)) error { return nil } diff --git a/vendor/k8s.io/kubernetes/pkg/volume/vsphere_volume/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/vsphere_volume/BUILD deleted file mode 100644 index 7f53753eb677..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/vsphere_volume/BUILD +++ /dev/null @@ -1,78 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "attacher.go", - "doc.go", - "vsphere_volume.go", - "vsphere_volume_block.go", - "vsphere_volume_util.go", - "vsphere_volume_util_linux.go", - "vsphere_volume_util_unsupported.go", - "vsphere_volume_util_windows.go", - ], - importpath = "k8s.io/kubernetes/pkg/volume/vsphere_volume", - deps = [ - "//pkg/features:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/util:go_default_library", - "//pkg/volume/util/volumepathhandler:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/cloud-provider:go_default_library", - "//staging/src/k8s.io/cloud-provider/volume/helpers:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/vsphere:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/vsphere/vclib:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/keymutex:go_default_library", - "//vendor/k8s.io/utils/strings:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "attacher_test.go", - "vsphere_volume_block_test.go", - "vsphere_volume_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/volume:go_default_library", - "//pkg/volume/testing:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/client-go/util/testing:go_default_library", - "//staging/src/k8s.io/cloud-provider:go_default_library", - "//staging/src/k8s.io/cloud-provider/fake:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/vsphere:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/vsphere/vclib:go_default_library", - "//staging/src/k8s.io/mount-utils:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/vsphere_volume/attacher.go b/vendor/k8s.io/kubernetes/pkg/volume/vsphere_volume/attacher.go index dd4ad35d23fb..727d0ac2b641 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/vsphere_volume/attacher.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/vsphere_volume/attacher.go @@ -209,7 +209,7 @@ func (plugin *vsphereVolumePlugin) GetDeviceMountRefs(deviceMountPath string) ([ // MountDevice mounts device to global mount point. func (attacher *vsphereVMDKAttacher) MountDevice(spec *volume.Spec, devicePath string, deviceMountPath string) error { - klog.Info("vsphere MountDevice", devicePath, deviceMountPath) + klog.Infof("vsphere MountDevice mount %s to %s", devicePath, deviceMountPath) mounter := attacher.host.GetMounter(vsphereVolumePluginName) notMnt, err := mounter.IsLikelyNotMountPoint(deviceMountPath) if err != nil { diff --git a/vendor/k8s.io/kubernetes/pkg/volume/vsphere_volume/vsphere_volume_util.go b/vendor/k8s.io/kubernetes/pkg/volume/vsphere_volume/vsphere_volume_util.go index c3a878d0f02d..ab229b980fc7 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/vsphere_volume/vsphere_volume_util.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/vsphere_volume/vsphere_volume_util.go @@ -40,15 +40,22 @@ const ( checkSleepDuration = time.Second diskByIDPath = "/dev/disk/by-id/" diskSCSIPrefix = "wwn-0x" - diskformat = "diskformat" - datastore = "datastore" - StoragePolicyName = "storagepolicyname" + // diskformat parameter is deprecated as of Kubernetes v1.21.0 + diskformat = "diskformat" + datastore = "datastore" + StoragePolicyName = "storagepolicyname" - HostFailuresToTolerateCapability = "hostfailurestotolerate" - ForceProvisioningCapability = "forceprovisioning" - CacheReservationCapability = "cachereservation" - DiskStripesCapability = "diskstripes" - ObjectSpaceReservationCapability = "objectspacereservation" + // hostfailurestotolerate parameter is deprecated as of Kubernetes v1.19.0 + HostFailuresToTolerateCapability = "hostfailurestotolerate" + // forceprovisioning parameter is deprecated as of Kubernetes v1.19.0 + ForceProvisioningCapability = "forceprovisioning" + // cachereservation parameter is deprecated as of Kubernetes v1.19.0 + CacheReservationCapability = "cachereservation" + // diskstripes parameter is deprecated as of Kubernetes v1.19.0 + DiskStripesCapability = "diskstripes" + // objectspacereservation parameter is deprecated as of Kubernetes v1.19.0 + ObjectSpaceReservationCapability = "objectspacereservation" + // iopslimit parameter is deprecated as of Kubernetes v1.19.0 IopsLimitCapability = "iopslimit" HostFailuresToTolerateCapabilityMin = 0 HostFailuresToTolerateCapabilityMax = 3 diff --git a/vendor/k8s.io/kubernetes/pkg/windows/service/BUILD b/vendor/k8s.io/kubernetes/pkg/windows/service/BUILD deleted file mode 100644 index 3d84765d6678..000000000000 --- a/vendor/k8s.io/kubernetes/pkg/windows/service/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["service.go"], - importpath = "k8s.io/kubernetes/pkg/windows/service", - deps = select({ - "@io_bazel_rules_go//go/platform:windows": [ - "//staging/src/k8s.io/apiserver/pkg/server:go_default_library", - "//vendor/golang.org/x/sys/windows:go_default_library", - "//vendor/golang.org/x/sys/windows/svc:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/admission/admit/BUILD b/vendor/k8s.io/kubernetes/plugin/pkg/admission/admit/BUILD deleted file mode 100644 index 18a7c6110201..000000000000 --- a/vendor/k8s.io/kubernetes/plugin/pkg/admission/admit/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["admission.go"], - importpath = "k8s.io/kubernetes/plugin/pkg/admission/admit", - deps = [ - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["admission_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/admission/alwayspullimages/BUILD b/vendor/k8s.io/kubernetes/plugin/pkg/admission/alwayspullimages/BUILD deleted file mode 100644 index ef30baee7002..000000000000 --- a/vendor/k8s.io/kubernetes/plugin/pkg/admission/alwayspullimages/BUILD +++ /dev/null @@ -1,47 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["admission.go"], - importpath = "k8s.io/kubernetes/plugin/pkg/admission/alwayspullimages", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/pods:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["admission_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/admission/alwayspullimages/admission.go b/vendor/k8s.io/kubernetes/plugin/pkg/admission/alwayspullimages/admission.go index 9786b964263d..500a3f6db6c2 100644 --- a/vendor/k8s.io/kubernetes/plugin/pkg/admission/alwayspullimages/admission.go +++ b/vendor/k8s.io/kubernetes/plugin/pkg/admission/alwayspullimages/admission.go @@ -30,8 +30,10 @@ import ( apierrors "k8s.io/apimachinery/pkg/api/errors" utilerrors "k8s.io/apimachinery/pkg/util/errors" + "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/validation/field" "k8s.io/apiserver/pkg/admission" + "k8s.io/klog/v2" api "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/apis/core/pods" ) @@ -101,12 +103,49 @@ func (*AlwaysPullImages) Validate(ctx context.Context, attributes admission.Attr return nil } +// check if it's update and it doesn't change the images referenced by the pod spec +func isUpdateWithNoNewImages(attributes admission.Attributes) bool { + if attributes.GetOperation() != admission.Update { + return false + } + + pod, ok := attributes.GetObject().(*api.Pod) + if !ok { + klog.Warningf("Resource was marked with kind Pod but pod was unable to be converted.") + return false + } + + oldPod, ok := attributes.GetOldObject().(*api.Pod) + if !ok { + klog.Warningf("Resource was marked with kind Pod but old pod was unable to be converted.") + return false + } + + oldImages := sets.NewString() + pods.VisitContainersWithPath(&oldPod.Spec, field.NewPath("spec"), func(c *api.Container, _ *field.Path) bool { + oldImages.Insert(c.Image) + return true + }) + + hasNewImage := false + pods.VisitContainersWithPath(&pod.Spec, field.NewPath("spec"), func(c *api.Container, _ *field.Path) bool { + if !oldImages.Has(c.Image) { + hasNewImage = true + } + return !hasNewImage + }) + return !hasNewImage +} + func shouldIgnore(attributes admission.Attributes) bool { // Ignore all calls to subresources or resources other than pods. if len(attributes.GetSubresource()) != 0 || attributes.GetResource().GroupResource() != api.Resource("pods") { return true } + if isUpdateWithNoNewImages(attributes) { + return true + } return false } diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/admission/antiaffinity/BUILD b/vendor/k8s.io/kubernetes/plugin/pkg/admission/antiaffinity/BUILD deleted file mode 100644 index 3a6b033752b9..000000000000 --- a/vendor/k8s.io/kubernetes/plugin/pkg/admission/antiaffinity/BUILD +++ /dev/null @@ -1,48 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "admission.go", - "doc.go", - ], - importpath = "k8s.io/kubernetes/plugin/pkg/admission/antiaffinity", - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["admission_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/admission/certificates/BUILD b/vendor/k8s.io/kubernetes/plugin/pkg/admission/certificates/BUILD deleted file mode 100644 index adf66fda5690..000000000000 --- a/vendor/k8s.io/kubernetes/plugin/pkg/admission/certificates/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -package(default_visibility = ["//visibility:public"]) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//plugin/pkg/admission/certificates/approval:all-srcs", - "//plugin/pkg/admission/certificates/signing:all-srcs", - "//plugin/pkg/admission/certificates/subjectrestriction:all-srcs", - ], - tags = ["automanaged"], -) - -go_library( - name = "go_default_library", - srcs = ["util.go"], - importpath = "k8s.io/kubernetes/plugin/pkg/admission/certificates", - deps = [ - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/admission/certificates/approval/BUILD b/vendor/k8s.io/kubernetes/plugin/pkg/admission/certificates/approval/BUILD deleted file mode 100644 index 3fc477f70918..000000000000 --- a/vendor/k8s.io/kubernetes/plugin/pkg/admission/certificates/approval/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["admission.go"], - importpath = "k8s.io/kubernetes/plugin/pkg/admission/certificates/approval", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/certificates:go_default_library", - "//plugin/pkg/admission/certificates:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/initializer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["admission_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/certificates:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/admission/certificates/signing/BUILD b/vendor/k8s.io/kubernetes/plugin/pkg/admission/certificates/signing/BUILD deleted file mode 100644 index 175ef63cb829..000000000000 --- a/vendor/k8s.io/kubernetes/plugin/pkg/admission/certificates/signing/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["admission.go"], - importpath = "k8s.io/kubernetes/plugin/pkg/admission/certificates/signing", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/certificates:go_default_library", - "//plugin/pkg/admission/certificates:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/initializer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["admission_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/certificates:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/admission/certificates/subjectrestriction/BUILD b/vendor/k8s.io/kubernetes/plugin/pkg/admission/certificates/subjectrestriction/BUILD deleted file mode 100644 index 87d5f937f1f1..000000000000 --- a/vendor/k8s.io/kubernetes/plugin/pkg/admission/certificates/subjectrestriction/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["admission.go"], - importpath = "k8s.io/kubernetes/plugin/pkg/admission/certificates/subjectrestriction", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/certificates:go_default_library", - "//staging/src/k8s.io/api/certificates/v1beta1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["admission_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/certificates:go_default_library", - "//staging/src/k8s.io/api/certificates/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/admission/defaultingressclass/BUILD b/vendor/k8s.io/kubernetes/plugin/pkg/admission/defaultingressclass/BUILD deleted file mode 100644 index 367c3cf3b3d3..000000000000 --- a/vendor/k8s.io/kubernetes/plugin/pkg/admission/defaultingressclass/BUILD +++ /dev/null @@ -1,53 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["admission.go"], - importpath = "k8s.io/kubernetes/plugin/pkg/admission/defaultingressclass", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/networking:go_default_library", - "//staging/src/k8s.io/api/networking/v1:go_default_library", - "//staging/src/k8s.io/api/networking/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/initializer:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/listers/networking/v1:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["admission_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/networking:go_default_library", - "//pkg/controller:go_default_library", - "//staging/src/k8s.io/api/networking/v1:go_default_library", - "//staging/src/k8s.io/api/networking/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/testing:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/admission/defaulttolerationseconds/BUILD b/vendor/k8s.io/kubernetes/plugin/pkg/admission/defaulttolerationseconds/BUILD deleted file mode 100644 index 62cda20debdd..000000000000 --- a/vendor/k8s.io/kubernetes/plugin/pkg/admission/defaulttolerationseconds/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["admission_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/helper:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/testing:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["admission.go"], - importpath = "k8s.io/kubernetes/plugin/pkg/admission/defaulttolerationseconds", - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/admission/deny/BUILD b/vendor/k8s.io/kubernetes/plugin/pkg/admission/deny/BUILD deleted file mode 100644 index 0d5d74fe444b..000000000000 --- a/vendor/k8s.io/kubernetes/plugin/pkg/admission/deny/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["admission.go"], - importpath = "k8s.io/kubernetes/plugin/pkg/admission/deny", - deps = [ - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["admission_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/admission/eventratelimit/BUILD b/vendor/k8s.io/kubernetes/plugin/pkg/admission/eventratelimit/BUILD deleted file mode 100644 index 1f154fc3b66c..000000000000 --- a/vendor/k8s.io/kubernetes/plugin/pkg/admission/eventratelimit/BUILD +++ /dev/null @@ -1,71 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "admission_test.go", - "cache_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//plugin/pkg/admission/eventratelimit/apis/eventratelimit:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//vendor/github.com/hashicorp/golang-lru:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "admission.go", - "cache.go", - "clock.go", - "config.go", - "doc.go", - "limitenforcer.go", - ], - importpath = "k8s.io/kubernetes/plugin/pkg/admission/eventratelimit", - deps = [ - "//pkg/apis/core:go_default_library", - "//plugin/pkg/admission/eventratelimit/apis/eventratelimit:go_default_library", - "//plugin/pkg/admission/eventratelimit/apis/eventratelimit/install:go_default_library", - "//plugin/pkg/admission/eventratelimit/apis/eventratelimit/v1alpha1:go_default_library", - "//plugin/pkg/admission/eventratelimit/apis/eventratelimit/validation:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//vendor/github.com/hashicorp/golang-lru:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//plugin/pkg/admission/eventratelimit/apis/eventratelimit:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/admission/eventratelimit/apis/eventratelimit/BUILD b/vendor/k8s.io/kubernetes/plugin/pkg/admission/eventratelimit/apis/eventratelimit/BUILD deleted file mode 100644 index 61a31c743ab8..000000000000 --- a/vendor/k8s.io/kubernetes/plugin/pkg/admission/eventratelimit/apis/eventratelimit/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/kubernetes/plugin/pkg/admission/eventratelimit/apis/eventratelimit", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//plugin/pkg/admission/eventratelimit/apis/eventratelimit/install:all-srcs", - "//plugin/pkg/admission/eventratelimit/apis/eventratelimit/v1alpha1:all-srcs", - "//plugin/pkg/admission/eventratelimit/apis/eventratelimit/validation:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/admission/eventratelimit/apis/eventratelimit/install/BUILD b/vendor/k8s.io/kubernetes/plugin/pkg/admission/eventratelimit/apis/eventratelimit/install/BUILD deleted file mode 100644 index 588ee7368829..000000000000 --- a/vendor/k8s.io/kubernetes/plugin/pkg/admission/eventratelimit/apis/eventratelimit/install/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["install.go"], - importpath = "k8s.io/kubernetes/plugin/pkg/admission/eventratelimit/apis/eventratelimit/install", - deps = [ - "//plugin/pkg/admission/eventratelimit/apis/eventratelimit:go_default_library", - "//plugin/pkg/admission/eventratelimit/apis/eventratelimit/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/admission/eventratelimit/apis/eventratelimit/v1alpha1/BUILD b/vendor/k8s.io/kubernetes/plugin/pkg/admission/eventratelimit/apis/eventratelimit/v1alpha1/BUILD deleted file mode 100644 index 3f3116c90a86..000000000000 --- a/vendor/k8s.io/kubernetes/plugin/pkg/admission/eventratelimit/apis/eventratelimit/v1alpha1/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "defaults.go", - "doc.go", - "register.go", - "types.go", - "zz_generated.conversion.go", - "zz_generated.deepcopy.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/plugin/pkg/admission/eventratelimit/apis/eventratelimit/v1alpha1", - deps = [ - "//plugin/pkg/admission/eventratelimit/apis/eventratelimit:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/admission/eventratelimit/apis/eventratelimit/validation/BUILD b/vendor/k8s.io/kubernetes/plugin/pkg/admission/eventratelimit/apis/eventratelimit/validation/BUILD deleted file mode 100644 index 58ff16e138c9..000000000000 --- a/vendor/k8s.io/kubernetes/plugin/pkg/admission/eventratelimit/apis/eventratelimit/validation/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["validation.go"], - importpath = "k8s.io/kubernetes/plugin/pkg/admission/eventratelimit/apis/eventratelimit/validation", - deps = [ - "//plugin/pkg/admission/eventratelimit/apis/eventratelimit:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["validation_test.go"], - embed = [":go_default_library"], - deps = ["//plugin/pkg/admission/eventratelimit/apis/eventratelimit:go_default_library"], -) diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/admission/exec/BUILD b/vendor/k8s.io/kubernetes/plugin/pkg/admission/exec/BUILD deleted file mode 100644 index c7500ef3afa5..000000000000 --- a/vendor/k8s.io/kubernetes/plugin/pkg/admission/exec/BUILD +++ /dev/null @@ -1,50 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["admission.go"], - importpath = "k8s.io/kubernetes/plugin/pkg/admission/exec", - deps = [ - "//pkg/api/v1/pod:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/initializer:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["admission_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/admission/exec/admission.go b/vendor/k8s.io/kubernetes/plugin/pkg/admission/exec/admission.go deleted file mode 100644 index 059651c02b97..000000000000 --- a/vendor/k8s.io/kubernetes/plugin/pkg/admission/exec/admission.go +++ /dev/null @@ -1,163 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package exec - -import ( - "context" - "fmt" - "io" - - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apiserver/pkg/admission" - genericadmissioninitializer "k8s.io/apiserver/pkg/admission/initializer" - "k8s.io/client-go/kubernetes" - "k8s.io/klog/v2" - podutil "k8s.io/kubernetes/pkg/api/v1/pod" -) - -const ( - // DenyEscalatingExec indicates name of admission plugin. - // Deprecated, will be removed in v1.18. - // Use of PodSecurityPolicy or a custom admission plugin to limit creation of pods is recommended instead. - DenyEscalatingExec = "DenyEscalatingExec" - // DenyExecOnPrivileged indicates name of admission plugin. - // Deprecated, will be removed in v1.18. - // Use of PodSecurityPolicy or a custom admission plugin to limit creation of pods is recommended instead. - DenyExecOnPrivileged = "DenyExecOnPrivileged" -) - -// Register registers a plugin -func Register(plugins *admission.Plugins) { - plugins.Register(DenyEscalatingExec, func(config io.Reader) (admission.Interface, error) { - klog.Warningf("the %s admission plugin is deprecated and will be removed in v1.18", DenyEscalatingExec) - klog.Warningf("use of PodSecurityPolicy or a custom admission plugin to limit creation of pods is recommended instead") - return NewDenyEscalatingExec(), nil - }) - - // This is for legacy support of the DenyExecOnPrivileged admission controller. Most - // of the time DenyEscalatingExec should be preferred. - plugins.Register(DenyExecOnPrivileged, func(config io.Reader) (admission.Interface, error) { - klog.Warningf("the %s admission plugin is deprecated and will be removed in v1.18", DenyExecOnPrivileged) - klog.Warningf("use of PodSecurityPolicy or a custom admission plugin to limit creation of pods is recommended instead") - return NewDenyExecOnPrivileged(), nil - }) -} - -// DenyExec is an implementation of admission.Interface which says no to a pod/exec on -// a pod using host based configurations. -type DenyExec struct { - *admission.Handler - client kubernetes.Interface - - // these flags control which items will be checked to deny exec/attach - hostNetwork bool - hostIPC bool - hostPID bool - privileged bool -} - -var _ admission.ValidationInterface = &DenyExec{} -var _ = genericadmissioninitializer.WantsExternalKubeClientSet(&DenyExec{}) - -// NewDenyExecOnPrivileged creates a new admission controller that is only checking the privileged -// option. This is for legacy support of the DenyExecOnPrivileged admission controller. -// Most of the time NewDenyEscalatingExec should be preferred. -func NewDenyExecOnPrivileged() *DenyExec { - return &DenyExec{ - Handler: admission.NewHandler(admission.Connect), - hostNetwork: false, - hostIPC: false, - hostPID: false, - privileged: true, - } -} - -// NewDenyEscalatingExec creates a new admission controller that denies an exec operation on a pod -// using host based configurations. -func NewDenyEscalatingExec() *DenyExec { - return &DenyExec{ - Handler: admission.NewHandler(admission.Connect), - hostNetwork: true, - hostIPC: true, - hostPID: true, - privileged: true, - } -} - -// SetExternalKubeClientSet implements the WantsInternalKubeClientSet interface. -func (d *DenyExec) SetExternalKubeClientSet(client kubernetes.Interface) { - d.client = client -} - -// ValidateInitialization implements the InitializationValidator interface. -func (d *DenyExec) ValidateInitialization() error { - if d.client == nil { - return fmt.Errorf("missing client") - } - return nil -} - -// Validate makes an admission decision based on the request attributes -func (d *DenyExec) Validate(ctx context.Context, a admission.Attributes, o admission.ObjectInterfaces) (err error) { - path := a.GetResource().Resource - if subresource := a.GetSubresource(); subresource != "" { - path = path + "/" + subresource - } - // Only handle exec or attach requests on pods - if path != "pods/exec" && path != "pods/attach" { - return nil - } - pod, err := d.client.CoreV1().Pods(a.GetNamespace()).Get(context.TODO(), a.GetName(), metav1.GetOptions{}) - if err != nil { - return admission.NewForbidden(a, err) - } - - if d.hostNetwork && pod.Spec.HostNetwork { - return admission.NewForbidden(a, fmt.Errorf("cannot exec into or attach to a container using host network")) - } - - if d.hostPID && pod.Spec.HostPID { - return admission.NewForbidden(a, fmt.Errorf("cannot exec into or attach to a container using host pid")) - } - - if d.hostIPC && pod.Spec.HostIPC { - return admission.NewForbidden(a, fmt.Errorf("cannot exec into or attach to a container using host ipc")) - } - - if d.privileged && isPrivileged(pod) { - return admission.NewForbidden(a, fmt.Errorf("cannot exec into or attach to a privileged container")) - } - - return nil -} - -// isPrivileged will return true a pod has any privileged containers -func isPrivileged(pod *corev1.Pod) bool { - var privileged bool - podutil.VisitContainers(&pod.Spec, podutil.AllContainers, func(c *corev1.Container, containerType podutil.ContainerType) bool { - if c.SecurityContext == nil || c.SecurityContext.Privileged == nil { - return true - } - if *c.SecurityContext.Privileged { - privileged = true - return false - } - return true - }) - return privileged -} diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/admission/extendedresourcetoleration/BUILD b/vendor/k8s.io/kubernetes/plugin/pkg/admission/extendedresourcetoleration/BUILD deleted file mode 100644 index f93b250b105e..000000000000 --- a/vendor/k8s.io/kubernetes/plugin/pkg/admission/extendedresourcetoleration/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["admission.go"], - importpath = "k8s.io/kubernetes/plugin/pkg/admission/extendedresourcetoleration", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/helper:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["admission_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/helper:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/admission/gc/BUILD b/vendor/k8s.io/kubernetes/plugin/pkg/admission/gc/BUILD deleted file mode 100644 index 842479b5a9af..000000000000 --- a/vendor/k8s.io/kubernetes/plugin/pkg/admission/gc/BUILD +++ /dev/null @@ -1,58 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["gc_admission.go"], - importpath = "k8s.io/kubernetes/plugin/pkg/admission/gc", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["gc_admission_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/kubeapiserver/admission:go_default_library", - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/initializer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//staging/src/k8s.io/client-go/discovery/fake:go_default_library", - "//staging/src/k8s.io/client-go/restmapper:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/admission/gc/gc_admission.go b/vendor/k8s.io/kubernetes/plugin/pkg/admission/gc/gc_admission.go index afcded01deee..db0f3c12c102 100644 --- a/vendor/k8s.io/kubernetes/plugin/pkg/admission/gc/gc_admission.go +++ b/vendor/k8s.io/kubernetes/plugin/pkg/admission/gc/gc_admission.go @@ -28,6 +28,7 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/types" "k8s.io/apiserver/pkg/admission" + "k8s.io/apiserver/pkg/authentication/user" "k8s.io/apiserver/pkg/authorization/authorizer" ) @@ -122,6 +123,18 @@ func (a *gcPermissionsEnforcement) Validate(ctx context.Context, attributes admi // true. If so, only allows the change if the user has delete permission of // the _OWNER_ newBlockingRefs := newBlockingOwnerDeletionRefs(attributes.GetObject(), attributes.GetOldObject()) + if len(newBlockingRefs) == 0 { + return nil + } + + // There can be a case where a restMapper tries to hit discovery endpoints and times out if the network is inaccessible. + // This can prevent creating the pod to run the network to be able to do discovery and it appears as a timeout, not a rejection. + // Because the timeout is wrapper on admission/request, we can run a single check to see if the user can finalize any + // possible resource. + if decision, _, _ := a.authorizer.Authorize(ctx, finalizeAnythingRecord(attributes.GetUserInfo())); decision == authorizer.DecisionAllow { + return nil + } + for _, ref := range newBlockingRefs { records, err := a.ownerRefToDeleteAttributeRecords(ref, attributes) if err != nil { @@ -173,6 +186,20 @@ func isChangingOwnerReference(newObj, oldObj runtime.Object) bool { return false } +func finalizeAnythingRecord(userInfo user.Info) authorizer.AttributesRecord { + return authorizer.AttributesRecord{ + User: userInfo, + Verb: "update", + APIGroup: "*", + APIVersion: "*", + Resource: "*", + Subresource: "finalizers", + Name: "*", + ResourceRequest: true, + Path: "", + } +} + // Translates ref to a DeleteAttribute deleting the object referred by the ref. // OwnerReference only records the object kind, which might map to multiple // resources, so multiple DeleteAttribute might be returned. diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/admission/imagepolicy/BUILD b/vendor/k8s.io/kubernetes/plugin/pkg/admission/imagepolicy/BUILD deleted file mode 100644 index 360e5b5b09dd..000000000000 --- a/vendor/k8s.io/kubernetes/plugin/pkg/admission/imagepolicy/BUILD +++ /dev/null @@ -1,63 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "admission.go", - "config.go", - "doc.go", - ], - importpath = "k8s.io/kubernetes/plugin/pkg/admission/imagepolicy", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/imagepolicy/install:go_default_library", - "//staging/src/k8s.io/api/imagepolicy/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/cache:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/yaml:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/webhook:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "admission_test.go", - "certs_test.go", - "config_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/imagepolicy/install:go_default_library", - "//staging/src/k8s.io/api/imagepolicy/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/client-go/tools/clientcmd/api/v1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/admission/limitranger/BUILD b/vendor/k8s.io/kubernetes/plugin/pkg/admission/limitranger/BUILD deleted file mode 100644 index cd3344d1ab0e..000000000000 --- a/vendor/k8s.io/kubernetes/plugin/pkg/admission/limitranger/BUILD +++ /dev/null @@ -1,68 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "admission.go", - "interfaces.go", - ], - importpath = "k8s.io/kubernetes/plugin/pkg/admission/limitranger", - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/initializer:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", - "//vendor/github.com/hashicorp/golang-lru:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["admission_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/initializer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/testing:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/admission/namespace/autoprovision/BUILD b/vendor/k8s.io/kubernetes/plugin/pkg/admission/namespace/autoprovision/BUILD deleted file mode 100644 index e132d5024ebf..000000000000 --- a/vendor/k8s.io/kubernetes/plugin/pkg/admission/namespace/autoprovision/BUILD +++ /dev/null @@ -1,58 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["admission.go"], - importpath = "k8s.io/kubernetes/plugin/pkg/admission/namespace/autoprovision", - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/initializer:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["admission_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/initializer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/testing:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/admission/namespace/exists/BUILD b/vendor/k8s.io/kubernetes/plugin/pkg/admission/namespace/exists/BUILD deleted file mode 100644 index cb572441cc02..000000000000 --- a/vendor/k8s.io/kubernetes/plugin/pkg/admission/namespace/exists/BUILD +++ /dev/null @@ -1,55 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["admission.go"], - importpath = "k8s.io/kubernetes/plugin/pkg/admission/namespace/exists", - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/initializer:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["admission_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/initializer:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/admission/defaultingressclass/admission.go b/vendor/k8s.io/kubernetes/plugin/pkg/admission/network/defaultingressclass/admission.go similarity index 100% rename from vendor/k8s.io/kubernetes/plugin/pkg/admission/defaultingressclass/admission.go rename to vendor/k8s.io/kubernetes/plugin/pkg/admission/network/defaultingressclass/admission.go diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/admission/network/denyserviceexternalips/admission.go b/vendor/k8s.io/kubernetes/plugin/pkg/admission/network/denyserviceexternalips/admission.go new file mode 100644 index 000000000000..0a9330799117 --- /dev/null +++ b/vendor/k8s.io/kubernetes/plugin/pkg/admission/network/denyserviceexternalips/admission.go @@ -0,0 +1,114 @@ +/* +Copyright 2020 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package denyserviceexternalips + +import ( + "context" + "fmt" + "io" + + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apiserver/pkg/admission" + "k8s.io/klog/v2" + "k8s.io/kubernetes/pkg/apis/core" +) + +const ( + // PluginName is the name of this admission controller plugin + PluginName = "DenyServiceExternalIPs" +) + +// Register registers a plugin +func Register(plugins *admission.Plugins) { + plugins.Register(PluginName, func(config io.Reader) (admission.Interface, error) { + plugin := newPlugin() + return plugin, nil + }) +} + +// externalIPsDenierPlugin holds state for and implements the admission plugin. +type externalIPsDenierPlugin struct { + *admission.Handler +} + +var _ admission.Interface = &externalIPsDenierPlugin{} +var _ admission.ValidationInterface = &externalIPsDenierPlugin{} + +// newPlugin creates a new admission plugin. +func newPlugin() *externalIPsDenierPlugin { + return &externalIPsDenierPlugin{ + Handler: admission.NewHandler(admission.Create, admission.Update), + } +} + +// Admit ensures that modifications of the Service.Spec.ExternalIPs field are +// denied +func (plug *externalIPsDenierPlugin) Validate(ctx context.Context, attr admission.Attributes, o admission.ObjectInterfaces) error { + if attr.GetResource().GroupResource() != core.Resource("services") { + return nil + } + + if len(attr.GetSubresource()) != 0 { + return nil + } + + // if we can't convert then we don't handle this object so just return + newSvc, ok := attr.GetObject().(*core.Service) + if !ok { + klog.V(3).Infof("Expected Service resource, got: %v", attr.GetKind()) + return errors.NewInternalError(fmt.Errorf("Expected Service resource, got: %v", attr.GetKind())) + } + + var oldSvc *core.Service + if old := attr.GetOldObject(); old != nil { + tmp, ok := old.(*core.Service) + if !ok { + klog.V(3).Infof("Expected Service resource, got: %v", attr.GetKind()) + return errors.NewInternalError(fmt.Errorf("Expected Service resource, got: %v", attr.GetKind())) + } + oldSvc = tmp + } + + if isSubset(newSvc, oldSvc) { + return nil + } + + klog.V(4).Infof("Denying new use of ExternalIPs on Service %s/%s", newSvc.Namespace, newSvc.Name) + return admission.NewForbidden(attr, fmt.Errorf("Use of external IPs is denied by admission control")) +} + +func isSubset(newSvc, oldSvc *core.Service) bool { + // If new has none, it's a subset. + if len(newSvc.Spec.ExternalIPs) == 0 { + return true + } + // If we have some but it's not an update, it's not a subset. + if oldSvc == nil { + return false + } + oldIPs := map[string]bool{} + for _, ip := range oldSvc.Spec.ExternalIPs { + oldIPs[ip] = true + } + // Every IP in newSvc must be in oldSvc + for _, ip := range newSvc.Spec.ExternalIPs { + if oldIPs[ip] == false { + return false + } + } + return true +} diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/admission/noderestriction/BUILD b/vendor/k8s.io/kubernetes/plugin/pkg/admission/noderestriction/BUILD deleted file mode 100644 index 736a3d046b6d..000000000000 --- a/vendor/k8s.io/kubernetes/plugin/pkg/admission/noderestriction/BUILD +++ /dev/null @@ -1,77 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["admission.go"], - importpath = "k8s.io/kubernetes/plugin/pkg/admission/noderestriction", - deps = [ - "//pkg/api/pod:go_default_library", - "//pkg/apis/authentication:go_default_library", - "//pkg/apis/coordination:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/policy:go_default_library", - "//pkg/apis/storage:go_default_library", - "//pkg/auth/nodeidentifier:go_default_library", - "//pkg/features:go_default_library", - "//pkg/kubelet/apis:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/initializer:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", - "//staging/src/k8s.io/component-base/featuregate:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["admission_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/authentication:go_default_library", - "//pkg/apis/coordination:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/policy:go_default_library", - "//pkg/apis/storage:go_default_library", - "//pkg/auth/nodeidentifier:go_default_library", - "//pkg/features:go_default_library", - "//pkg/kubelet/apis:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/component-base/featuregate:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/admission/noderestriction/admission.go b/vendor/k8s.io/kubernetes/plugin/pkg/admission/noderestriction/admission.go index 23a379086ac8..1e01f32f69ec 100644 --- a/vendor/k8s.io/kubernetes/plugin/pkg/admission/noderestriction/admission.go +++ b/vendor/k8s.io/kubernetes/plugin/pkg/admission/noderestriction/admission.go @@ -34,6 +34,7 @@ import ( "k8s.io/client-go/informers" corev1lister "k8s.io/client-go/listers/core/v1" "k8s.io/component-base/featuregate" + kubeletapis "k8s.io/kubelet/pkg/apis" podutil "k8s.io/kubernetes/pkg/api/pod" authenticationapi "k8s.io/kubernetes/pkg/apis/authentication" coordapi "k8s.io/kubernetes/pkg/apis/coordination" @@ -42,7 +43,6 @@ import ( storage "k8s.io/kubernetes/pkg/apis/storage" "k8s.io/kubernetes/pkg/auth/nodeidentifier" "k8s.io/kubernetes/pkg/features" - kubeletapis "k8s.io/kubernetes/pkg/kubelet/apis" ) // PluginName is a string with the name of the plugin @@ -71,7 +71,6 @@ type Plugin struct { podsGetter corev1lister.PodLister nodesGetter corev1lister.NodeLister - csiNodeInfoEnabled bool expandPersistentVolumesEnabled bool } @@ -83,7 +82,6 @@ var ( // InspectFeatureGates allows setting bools without taking a dep on a global variable func (p *Plugin) InspectFeatureGates(featureGates featuregate.FeatureGate) { - p.csiNodeInfoEnabled = featureGates.Enabled(features.CSINodeInfo) p.expandPersistentVolumesEnabled = featureGates.Enabled(features.ExpandPersistentVolumes) } @@ -163,10 +161,7 @@ func (p *Plugin) Admit(ctx context.Context, a admission.Attributes, o admission. return p.admitLease(nodeName, a) case csiNodeResource: - if p.csiNodeInfoEnabled { - return p.admitCSINode(nodeName, a) - } - return admission.NewForbidden(a, fmt.Errorf("disabled by feature gates %s", features.CSINodeInfo)) + return p.admitCSINode(nodeName, a) default: return nil @@ -535,7 +530,7 @@ func (p *Plugin) admitServiceAccount(nodeName string, a admission.Attributes) er return admission.NewForbidden(a, err) } if ref.UID != pod.UID { - return admission.NewForbidden(a, fmt.Errorf("the UID in the bound object reference (%s) does not match the UID in record (%s). The object might have been deleted and then recreated", ref.UID, pod.UID)) + return admission.NewForbidden(a, fmt.Errorf("the UID in the bound object reference (%s) does not match the UID in record. The object might have been deleted and then recreated", ref.UID)) } if pod.Spec.NodeName != nodeName { return admission.NewForbidden(a, fmt.Errorf("node requested token bound to a pod scheduled on a different node")) diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/admission/nodetaint/BUILD b/vendor/k8s.io/kubernetes/plugin/pkg/admission/nodetaint/BUILD deleted file mode 100644 index ebf9616a4f58..000000000000 --- a/vendor/k8s.io/kubernetes/plugin/pkg/admission/nodetaint/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["admission.go"], - importpath = "k8s.io/kubernetes/plugin/pkg/admission/nodetaint", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["admission_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/admission/podnodeselector/BUILD b/vendor/k8s.io/kubernetes/plugin/pkg/admission/podnodeselector/BUILD deleted file mode 100644 index 1cb6bf33699d..000000000000 --- a/vendor/k8s.io/kubernetes/plugin/pkg/admission/podnodeselector/BUILD +++ /dev/null @@ -1,57 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["admission.go"], - importpath = "k8s.io/kubernetes/plugin/pkg/admission/podnodeselector", - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/yaml:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/initializer:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["admission_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/initializer:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/admission/podtolerationrestriction/BUILD b/vendor/k8s.io/kubernetes/plugin/pkg/admission/podtolerationrestriction/BUILD deleted file mode 100644 index 39913f47d689..000000000000 --- a/vendor/k8s.io/kubernetes/plugin/pkg/admission/podtolerationrestriction/BUILD +++ /dev/null @@ -1,74 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["admission_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/initializer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/testing:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "admission.go", - "config.go", - "doc.go", - ], - importpath = "k8s.io/kubernetes/plugin/pkg/admission/podtolerationrestriction", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/helper/qos:go_default_library", - "//pkg/apis/core/v1:go_default_library", - "//pkg/util/tolerations:go_default_library", - "//plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction:go_default_library", - "//plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/install:go_default_library", - "//plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/v1alpha1:go_default_library", - "//plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/validation:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/initializer:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/BUILD b/vendor/k8s.io/kubernetes/plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/BUILD deleted file mode 100644 index 49dce5a9d660..000000000000 --- a/vendor/k8s.io/kubernetes/plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/kubernetes/plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction", - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/install:all-srcs", - "//plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/v1alpha1:all-srcs", - "//plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/validation:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/install/BUILD b/vendor/k8s.io/kubernetes/plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/install/BUILD deleted file mode 100644 index 530f04f33938..000000000000 --- a/vendor/k8s.io/kubernetes/plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/install/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["install.go"], - importpath = "k8s.io/kubernetes/plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/install", - deps = [ - "//plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction:go_default_library", - "//plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/v1alpha1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/v1alpha1/BUILD b/vendor/k8s.io/kubernetes/plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/v1alpha1/BUILD deleted file mode 100644 index c65d05221b60..000000000000 --- a/vendor/k8s.io/kubernetes/plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/v1alpha1/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "defaults.go", - "doc.go", - "register.go", - "types.go", - "zz_generated.conversion.go", - "zz_generated.deepcopy.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/kubernetes/plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/v1alpha1", - deps = [ - "//pkg/apis/core:go_default_library", - "//plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/validation/BUILD b/vendor/k8s.io/kubernetes/plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/validation/BUILD deleted file mode 100644 index 188300c152ee..000000000000 --- a/vendor/k8s.io/kubernetes/plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/validation/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["validation.go"], - importpath = "k8s.io/kubernetes/plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/validation", - deps = [ - "//pkg/apis/core/validation:go_default_library", - "//plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["validation_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/admission/priority/BUILD b/vendor/k8s.io/kubernetes/plugin/pkg/admission/priority/BUILD deleted file mode 100644 index 7e385377e659..000000000000 --- a/vendor/k8s.io/kubernetes/plugin/pkg/admission/priority/BUILD +++ /dev/null @@ -1,63 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["admission_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/scheduling:go_default_library", - "//pkg/apis/scheduling/v1:go_default_library", - "//pkg/controller:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/api/scheduling/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/testing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["admission.go"], - importpath = "k8s.io/kubernetes/plugin/pkg/admission/priority", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/scheduling:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/scheduling/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/initializer:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/scheduling/v1:go_default_library", - "//staging/src/k8s.io/component-base/featuregate:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/admission/runtimeclass/BUILD b/vendor/k8s.io/kubernetes/plugin/pkg/admission/runtimeclass/BUILD deleted file mode 100644 index fba7dd54b862..000000000000 --- a/vendor/k8s.io/kubernetes/plugin/pkg/admission/runtimeclass/BUILD +++ /dev/null @@ -1,63 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["admission.go"], - importpath = "k8s.io/kubernetes/plugin/pkg/admission/runtimeclass", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/node:go_default_library", - "//pkg/apis/node/v1:go_default_library", - "//pkg/features:go_default_library", - "//pkg/util/tolerations:go_default_library", - "//staging/src/k8s.io/api/node/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/initializer:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/node/v1:go_default_library", - "//staging/src/k8s.io/client-go/listers/node/v1:go_default_library", - "//staging/src/k8s.io/component-base/featuregate:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["admission_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/controller:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/node/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/component-base/featuregate:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/admission/security/podsecuritypolicy/BUILD b/vendor/k8s.io/kubernetes/plugin/pkg/admission/security/podsecuritypolicy/BUILD deleted file mode 100644 index cc46abd64bfc..000000000000 --- a/vendor/k8s.io/kubernetes/plugin/pkg/admission/security/podsecuritypolicy/BUILD +++ /dev/null @@ -1,79 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["admission.go"], - importpath = "k8s.io/kubernetes/plugin/pkg/admission/security/podsecuritypolicy", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/extensions:go_default_library", - "//pkg/apis/policy:go_default_library", - "//pkg/registry/rbac:go_default_library", - "//pkg/security/podsecuritypolicy:go_default_library", - "//pkg/security/podsecuritypolicy/util:go_default_library", - "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/initializer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/serviceaccount:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/listers/policy/v1beta1:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["admission_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/v1:go_default_library", - "//pkg/controller:go_default_library", - "//pkg/features:go_default_library", - "//pkg/security/apparmor:go_default_library", - "//pkg/security/podsecuritypolicy:go_default_library", - "//pkg/security/podsecuritypolicy/seccomp:go_default_library", - "//pkg/security/podsecuritypolicy/util:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/testing:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/serviceaccount:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizerfactory:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/admission/securitycontext/scdeny/BUILD b/vendor/k8s.io/kubernetes/plugin/pkg/admission/securitycontext/scdeny/BUILD deleted file mode 100644 index 7e9ec6062403..000000000000 --- a/vendor/k8s.io/kubernetes/plugin/pkg/admission/securitycontext/scdeny/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["admission.go"], - importpath = "k8s.io/kubernetes/plugin/pkg/admission/securitycontext/scdeny", - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["admission_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/admission/serviceaccount/BUILD b/vendor/k8s.io/kubernetes/plugin/pkg/admission/serviceaccount/BUILD deleted file mode 100644 index bb035df45897..000000000000 --- a/vendor/k8s.io/kubernetes/plugin/pkg/admission/serviceaccount/BUILD +++ /dev/null @@ -1,72 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "admission.go", - "doc.go", - ], - importpath = "k8s.io/kubernetes/plugin/pkg/admission/serviceaccount", - deps = [ - "//pkg/api/pod:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/features:go_default_library", - "//pkg/serviceaccount:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/initializer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/serviceaccount:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", - "//staging/src/k8s.io/component-base/featuregate:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["admission_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/controller:go_default_library", - "//pkg/kubelet/types:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/testing:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/admission/storage/persistentvolume/label/BUILD b/vendor/k8s.io/kubernetes/plugin/pkg/admission/storage/persistentvolume/label/BUILD deleted file mode 100644 index 2e8e0b54dd38..000000000000 --- a/vendor/k8s.io/kubernetes/plugin/pkg/admission/storage/persistentvolume/label/BUILD +++ /dev/null @@ -1,59 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "admission.go", - "doc.go", - ], - importpath = "k8s.io/kubernetes/plugin/pkg/admission/storage/persistentvolume/label", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/v1:go_default_library", - "//pkg/controller/volume/persistentvolume/util:go_default_library", - "//pkg/kubeapiserver/admission:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/cloud-provider:go_default_library", - "//staging/src/k8s.io/cloud-provider/volume:go_default_library", - "//staging/src/k8s.io/cloud-provider/volume/helpers:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["admission_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/controller/volume/persistentvolume/util:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/testing:go_default_library", - "//staging/src/k8s.io/cloud-provider:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/admission/storage/persistentvolume/label/admission.go b/vendor/k8s.io/kubernetes/plugin/pkg/admission/storage/persistentvolume/label/admission.go index 36235e21792f..e2a1a088c4a6 100644 --- a/vendor/k8s.io/kubernetes/plugin/pkg/admission/storage/persistentvolume/label/admission.go +++ b/vendor/k8s.io/kubernetes/plugin/pkg/admission/storage/persistentvolume/label/admission.go @@ -24,9 +24,12 @@ import ( "io" "sync" + genericadmissioninitializer "k8s.io/apiserver/pkg/admission/initializer" + v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apiserver/pkg/admission" + "k8s.io/client-go/informers" cloudprovider "k8s.io/cloud-provider" cloudvolume "k8s.io/cloud-provider/volume" volumehelpers "k8s.io/cloud-provider/volume/helpers" @@ -51,12 +54,14 @@ func Register(plugins *admission.Plugins) { } var _ = admission.Interface(&persistentVolumeLabel{}) +var _ = genericadmissioninitializer.WantsExternalKubeInformerFactory(&persistentVolumeLabel{}) type persistentVolumeLabel struct { *admission.Handler mutex sync.Mutex cloudConfig []byte + sharedInformer informers.SharedInformerFactory awsPVLabeler cloudprovider.PVLabeler gcePVLabeler cloudprovider.PVLabeler azurePVLabeler cloudprovider.PVLabeler @@ -86,6 +91,20 @@ func (l *persistentVolumeLabel) SetCloudConfig(cloudConfig []byte) { l.cloudConfig = cloudConfig } +func (l *persistentVolumeLabel) SetExternalKubeInformerFactory(f informers.SharedInformerFactory) { + secretInformer := f.Core().V1().Secrets() + l.sharedInformer = f + l.SetReadyFunc(secretInformer.Informer().HasSynced) +} + +// ValidateInitialization ensures lister is set. +func (l *persistentVolumeLabel) ValidateInitialization() error { + if l.sharedInformer == nil { + return fmt.Errorf("missing shared informer") + } + return nil +} + func nodeSelectorRequirementKeysExistInNodeSelectorTerms(reqs []api.NodeSelectorRequirement, terms []api.NodeSelectorTerm) bool { for _, req := range reqs { for _, term := range terms { @@ -130,7 +149,7 @@ func (l *persistentVolumeLabel) Admit(ctx context.Context, a admission.Attribute // Set NodeSelectorRequirements based on the labels var values []string - if k == v1.LabelFailureDomainBetaZone { + if k == v1.LabelTopologyZone || k == v1.LabelFailureDomainBetaZone { zones, err := volumehelpers.LabelZonesToSet(v) if err != nil { return admission.NewForbidden(a, fmt.Errorf("failed to convert label string for Zone: %s to a Set", v)) @@ -172,15 +191,31 @@ func (l *persistentVolumeLabel) findVolumeLabels(volume *api.PersistentVolume) ( existingLabels := volume.Labels // All cloud providers set only these two labels. - domain, domainOK := existingLabels[v1.LabelFailureDomainBetaZone] - region, regionOK := existingLabels[v1.LabelFailureDomainBetaRegion] + topologyLabelGA := true + domain, domainOK := existingLabels[v1.LabelTopologyZone] + region, regionOK := existingLabels[v1.LabelTopologyRegion] + // If they dont have GA labels we should check for failuredomain beta labels + // TODO: remove this once all the cloud provider change to GA topology labels + if !domainOK || !regionOK { + topologyLabelGA = false + domain, domainOK = existingLabels[v1.LabelFailureDomainBetaZone] + region, regionOK = existingLabels[v1.LabelFailureDomainBetaRegion] + } + isDynamicallyProvisioned := metav1.HasAnnotation(volume.ObjectMeta, persistentvolume.AnnDynamicallyProvisioned) if isDynamicallyProvisioned && domainOK && regionOK { // PV already has all the labels and we can trust the dynamic provisioning that it provided correct values. + if topologyLabelGA { + return map[string]string{ + v1.LabelTopologyZone: domain, + v1.LabelTopologyRegion: region, + }, nil + } return map[string]string{ v1.LabelFailureDomainBetaZone: domain, v1.LabelFailureDomainBetaRegion: region, }, nil + } // Either missing labels or we don't trust the user provided correct values. @@ -380,6 +415,11 @@ func (l *persistentVolumeLabel) getOpenStackPVLabeler() (cloudprovider.PVLabeler return nil, err } + cloudProviderWithInformer, ok := cloudProvider.(cloudprovider.InformerUser) + if ok { + cloudProviderWithInformer.SetInformers(l.sharedInformer) + } + openStackPVLabeler, ok := cloudProvider.(cloudprovider.PVLabeler) if !ok { return nil, errors.New("OpenStack cloud provider does not implement PV labeling") diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/admission/storage/persistentvolume/resize/BUILD b/vendor/k8s.io/kubernetes/plugin/pkg/admission/storage/persistentvolume/resize/BUILD deleted file mode 100644 index 80368f05a4fe..000000000000 --- a/vendor/k8s.io/kubernetes/plugin/pkg/admission/storage/persistentvolume/resize/BUILD +++ /dev/null @@ -1,51 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["admission_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/controller:go_default_library", - "//staging/src/k8s.io/api/storage/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["admission.go"], - importpath = "k8s.io/kubernetes/plugin/pkg/admission/storage/persistentvolume/resize", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/helper:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/initializer:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/listers/storage/v1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/admission/storage/storageclass/setdefault/BUILD b/vendor/k8s.io/kubernetes/plugin/pkg/admission/storage/storageclass/setdefault/BUILD deleted file mode 100644 index e7ec9a9c8ccc..000000000000 --- a/vendor/k8s.io/kubernetes/plugin/pkg/admission/storage/storageclass/setdefault/BUILD +++ /dev/null @@ -1,56 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["admission.go"], - importpath = "k8s.io/kubernetes/plugin/pkg/admission/storage/storageclass/setdefault", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/helper:go_default_library", - "//pkg/apis/storage/util:go_default_library", - "//staging/src/k8s.io/api/storage/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/initializer:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/listers/storage/v1:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["admission_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/storage/util:go_default_library", - "//pkg/controller:go_default_library", - "//staging/src/k8s.io/api/storage/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/testing:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/admission/storage/storageobjectinuseprotection/BUILD b/vendor/k8s.io/kubernetes/plugin/pkg/admission/storage/storageobjectinuseprotection/BUILD deleted file mode 100644 index 1e4f1633a8ee..000000000000 --- a/vendor/k8s.io/kubernetes/plugin/pkg/admission/storage/storageobjectinuseprotection/BUILD +++ /dev/null @@ -1,46 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["admission.go"], - importpath = "k8s.io/kubernetes/plugin/pkg/admission/storage/storageobjectinuseprotection", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/features:go_default_library", - "//pkg/volume/util:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/initializer:go_default_library", - "//staging/src/k8s.io/component-base/featuregate:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["admission_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/volume/util:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", - "//vendor/github.com/davecgh/go-spew/spew:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/auth/authenticator/token/bootstrap/BUILD b/vendor/k8s.io/kubernetes/plugin/pkg/auth/authenticator/token/bootstrap/BUILD deleted file mode 100644 index 262782a571d0..000000000000 --- a/vendor/k8s.io/kubernetes/plugin/pkg/auth/authenticator/token/bootstrap/BUILD +++ /dev/null @@ -1,52 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["bootstrap_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/cluster-bootstrap/token/api:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["bootstrap.go"], - importpath = "k8s.io/kubernetes/plugin/pkg/auth/authenticator/token/bootstrap", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", - "//staging/src/k8s.io/cluster-bootstrap/token/api:go_default_library", - "//staging/src/k8s.io/cluster-bootstrap/util/secrets:go_default_library", - "//staging/src/k8s.io/cluster-bootstrap/util/tokens:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/auth/authorizer/node/BUILD b/vendor/k8s.io/kubernetes/plugin/pkg/auth/authorizer/node/BUILD deleted file mode 100644 index 5759c73e2675..000000000000 --- a/vendor/k8s.io/kubernetes/plugin/pkg/auth/authorizer/node/BUILD +++ /dev/null @@ -1,84 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "graph_test.go", - "intset_test.go", - "node_authorizer_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/auth/nodeidentifier:go_default_library", - "//pkg/features:go_default_library", - "//plugin/pkg/auth/authorizer/rbac/bootstrappolicy:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/storage/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "graph.go", - "graph_populator.go", - "intset.go", - "metrics.go", - "node_authorizer.go", - ], - importpath = "k8s.io/kubernetes/plugin/pkg/auth/authorizer/node", - deps = [ - "//pkg/api/v1/persistentvolume:go_default_library", - "//pkg/api/v1/pod:go_default_library", - "//pkg/apis/coordination:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/storage:go_default_library", - "//pkg/auth/nodeidentifier:go_default_library", - "//pkg/features:go_default_library", - "//plugin/pkg/auth/authorizer/rbac:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/rbac/v1:go_default_library", - "//staging/src/k8s.io/api/storage/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/informers/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/informers/storage/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/component-base/featuregate:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - "//third_party/forked/gonum/graph:go_default_library", - "//third_party/forked/gonum/graph/simple:go_default_library", - "//third_party/forked/gonum/graph/traverse:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/auth/authorizer/node/node_authorizer.go b/vendor/k8s.io/kubernetes/plugin/pkg/auth/authorizer/node/node_authorizer.go index 1da0c20ccec2..661ab96fbaca 100644 --- a/vendor/k8s.io/kubernetes/plugin/pkg/auth/authorizer/node/node_authorizer.go +++ b/vendor/k8s.io/kubernetes/plugin/pkg/auth/authorizer/node/node_authorizer.go @@ -127,10 +127,7 @@ func (r *NodeAuthorizer) Authorize(ctx context.Context, attrs authorizer.Attribu case leaseResource: return r.authorizeLease(nodeName, attrs) case csiNodeResource: - if r.features.Enabled(features.CSINodeInfo) { - return r.authorizeCSINode(nodeName, attrs) - } - return authorizer.DecisionNoOpinion, fmt.Sprintf("disabled by feature gates %s", features.CSINodeInfo), nil + return r.authorizeCSINode(nodeName, attrs) } } diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/auth/authorizer/rbac/BUILD b/vendor/k8s.io/kubernetes/plugin/pkg/auth/authorizer/rbac/BUILD deleted file mode 100644 index ac153ef428c4..000000000000 --- a/vendor/k8s.io/kubernetes/plugin/pkg/auth/authorizer/rbac/BUILD +++ /dev/null @@ -1,61 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "rbac.go", - "subject_locator.go", - ], - importpath = "k8s.io/kubernetes/plugin/pkg/auth/authorizer/rbac", - deps = [ - "//pkg/apis/rbac/v1:go_default_library", - "//pkg/registry/rbac/validation:go_default_library", - "//staging/src/k8s.io/api/rbac/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//staging/src/k8s.io/client-go/listers/rbac/v1:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "rbac_test.go", - "subject_locator_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/rbac/v1:go_default_library", - "//pkg/registry/rbac/validation:go_default_library", - "//plugin/pkg/auth/authorizer/rbac/bootstrappolicy:go_default_library", - "//staging/src/k8s.io/api/rbac/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//plugin/pkg/auth/authorizer/rbac/bootstrappolicy:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/BUILD b/vendor/k8s.io/kubernetes/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/BUILD deleted file mode 100644 index e8a672a2c510..000000000000 --- a/vendor/k8s.io/kubernetes/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/BUILD +++ /dev/null @@ -1,68 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "controller_policy.go", - "namespace_policy.go", - "policy.go", - ], - importpath = "k8s.io/kubernetes/plugin/pkg/auth/authorizer/rbac/bootstrappolicy", - deps = [ - "//pkg/apis/rbac/v1:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/api/certificates/v1beta1:go_default_library", - "//staging/src/k8s.io/api/rbac/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/serviceaccount:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "controller_policy_test.go", - "policy_test.go", - ], - data = glob(["testdata/**"]), - embed = [":go_default_library"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/install:go_default_library", - "//pkg/apis/rbac/install:go_default_library", - "//pkg/apis/rbac/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/rbac/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/component-helpers/auth/rbac/validation:go_default_library", - "//vendor/sigs.k8s.io/yaml:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/controller_policy.go b/vendor/k8s.io/kubernetes/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/controller_policy.go index 2d326c62767e..3cd6390a02c1 100644 --- a/vendor/k8s.io/kubernetes/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/controller_policy.go +++ b/vendor/k8s.io/kubernetes/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/controller_policy.go @@ -24,6 +24,7 @@ import ( capi "k8s.io/api/certificates/v1beta1" rbacv1 "k8s.io/api/rbac/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + genericfeatures "k8s.io/apiserver/pkg/features" utilfeature "k8s.io/apiserver/pkg/util/feature" rbacv1helpers "k8s.io/kubernetes/pkg/apis/rbac/v1" "k8s.io/kubernetes/pkg/features" @@ -74,7 +75,7 @@ func buildControllerRoles() ([]rbacv1.ClusterRole, []rbacv1.ClusterRoleBinding) } role.Rules = append(role.Rules, rbacv1helpers.NewRule("get", "watch", "list").Groups("storage.k8s.io").Resources("csidrivers").RuleOrDie()) - if utilfeature.DefaultFeatureGate.Enabled(features.CSINodeInfo) && utilfeature.DefaultFeatureGate.Enabled(features.CSIMigration) { + if utilfeature.DefaultFeatureGate.Enabled(features.CSIMigration) { role.Rules = append(role.Rules, rbacv1helpers.NewRule("get", "watch", "list").Groups("storage.k8s.io").Resources("csinodes").RuleOrDie()) } @@ -148,35 +149,33 @@ func buildControllerRoles() ([]rbacv1.ClusterRole, []rbacv1.ClusterRoleBinding) }, }) - if utilfeature.DefaultFeatureGate.Enabled(features.EndpointSlice) { - addControllerRole(&controllerRoles, &controllerRoleBindings, rbacv1.ClusterRole{ - ObjectMeta: metav1.ObjectMeta{Name: saRolePrefix + "endpointslice-controller"}, - Rules: []rbacv1.PolicyRule{ - rbacv1helpers.NewRule("get", "list", "watch").Groups(legacyGroup).Resources("services", "pods", "nodes").RuleOrDie(), - // The controller needs to be able to set a service's finalizers to be able to create an EndpointSlice - // resource that is owned by the service and sets blockOwnerDeletion=true in its ownerRef. - rbacv1helpers.NewRule("update").Groups(legacyGroup).Resources("services/finalizers").RuleOrDie(), - rbacv1helpers.NewRule("get", "list", "create", "update", "delete").Groups(discoveryGroup).Resources("endpointslices").RuleOrDie(), - eventsRule(), - }, - }) + addControllerRole(&controllerRoles, &controllerRoleBindings, rbacv1.ClusterRole{ + ObjectMeta: metav1.ObjectMeta{Name: saRolePrefix + "endpointslice-controller"}, + Rules: []rbacv1.PolicyRule{ + rbacv1helpers.NewRule("get", "list", "watch").Groups(legacyGroup).Resources("services", "pods", "nodes").RuleOrDie(), + // The controller needs to be able to set a service's finalizers to be able to create an EndpointSlice + // resource that is owned by the service and sets blockOwnerDeletion=true in its ownerRef. + rbacv1helpers.NewRule("update").Groups(legacyGroup).Resources("services/finalizers").RuleOrDie(), + rbacv1helpers.NewRule("get", "list", "create", "update", "delete").Groups(discoveryGroup).Resources("endpointslices").RuleOrDie(), + eventsRule(), + }, + }) - addControllerRole(&controllerRoles, &controllerRoleBindings, rbacv1.ClusterRole{ - ObjectMeta: metav1.ObjectMeta{Name: saRolePrefix + "endpointslicemirroring-controller"}, - Rules: []rbacv1.PolicyRule{ - rbacv1helpers.NewRule("get", "list", "watch").Groups(legacyGroup).Resources("services", "endpoints").RuleOrDie(), - // The controller needs to be able to set a service's finalizers to be able to create an EndpointSlice - // resource that is owned by the service and sets blockOwnerDeletion=true in its ownerRef. - rbacv1helpers.NewRule("update").Groups(legacyGroup).Resources("services/finalizers").RuleOrDie(), - // The controller needs to be able to set a service's finalizers to be able to create an EndpointSlice - // resource that is owned by the endpoint and sets blockOwnerDeletion=true in its ownerRef. - // see https://github.com/openshift/kubernetes/blob/8691466059314c3f7d6dcffcbb76d14596ca716c/pkg/controller/endpointslicemirroring/utils.go#L87-L88 - rbacv1helpers.NewRule("update").Groups(legacyGroup).Resources("endpoints/finalizers").RuleOrDie(), - rbacv1helpers.NewRule("get", "list", "create", "update", "delete").Groups(discoveryGroup).Resources("endpointslices").RuleOrDie(), - eventsRule(), - }, - }) - } + addControllerRole(&controllerRoles, &controllerRoleBindings, rbacv1.ClusterRole{ + ObjectMeta: metav1.ObjectMeta{Name: saRolePrefix + "endpointslicemirroring-controller"}, + Rules: []rbacv1.PolicyRule{ + rbacv1helpers.NewRule("get", "list", "watch").Groups(legacyGroup).Resources("services", "endpoints").RuleOrDie(), + // The controller needs to be able to set a service's finalizers to be able to create an EndpointSlice + // resource that is owned by the service and sets blockOwnerDeletion=true in its ownerRef. + rbacv1helpers.NewRule("update").Groups(legacyGroup).Resources("services/finalizers").RuleOrDie(), + // The controller needs to be able to set a service's finalizers to be able to create an EndpointSlice + // resource that is owned by the endpoint and sets blockOwnerDeletion=true in its ownerRef. + // see https://github.com/openshift/kubernetes/blob/8691466059314c3f7d6dcffcbb76d14596ca716c/pkg/controller/endpointslicemirroring/utils.go#L87-L88 + rbacv1helpers.NewRule("update").Groups(legacyGroup).Resources("endpoints/finalizers").RuleOrDie(), + rbacv1helpers.NewRule("get", "list", "create", "update", "delete").Groups(discoveryGroup).Resources("endpointslices").RuleOrDie(), + eventsRule(), + }, + }) if utilfeature.DefaultFeatureGate.Enabled(features.ExpandPersistentVolumes) { addControllerRole(&controllerRoles, &controllerRoleBindings, rbacv1.ClusterRole{ @@ -199,6 +198,7 @@ func buildControllerRoles() ([]rbacv1.ClusterRole, []rbacv1.ClusterRoleBinding) ObjectMeta: metav1.ObjectMeta{Name: saRolePrefix + "ephemeral-volume-controller"}, Rules: []rbacv1.PolicyRule{ rbacv1helpers.NewRule("get", "list", "watch").Groups(legacyGroup).Resources("pods").RuleOrDie(), + rbacv1helpers.NewRule("update").Groups(legacyGroup).Resources("pods/finalizers").RuleOrDie(), rbacv1helpers.NewRule("get", "list", "watch", "create").Groups(legacyGroup).Resources("persistentvolumeclaims").RuleOrDie(), eventsRule(), }, @@ -401,13 +401,23 @@ func buildControllerRoles() ([]rbacv1.ClusterRole, []rbacv1.ClusterRoleBinding) }, }) } - - if utilfeature.DefaultFeatureGate.Enabled(features.RootCAConfigMap) { + addControllerRole(&controllerRoles, &controllerRoleBindings, rbacv1.ClusterRole{ + ObjectMeta: metav1.ObjectMeta{Name: saRolePrefix + "root-ca-cert-publisher"}, + Rules: []rbacv1.PolicyRule{ + rbacv1helpers.NewRule("create", "update").Groups(legacyGroup).Resources("configmaps").RuleOrDie(), + eventsRule(), + }, + }) + if utilfeature.DefaultFeatureGate.Enabled(genericfeatures.StorageVersionAPI) && + utilfeature.DefaultFeatureGate.Enabled(genericfeatures.APIServerIdentity) { addControllerRole(&controllerRoles, &controllerRoleBindings, rbacv1.ClusterRole{ - ObjectMeta: metav1.ObjectMeta{Name: saRolePrefix + "root-ca-cert-publisher"}, + ObjectMeta: metav1.ObjectMeta{Name: saRolePrefix + "storage-version-garbage-collector"}, Rules: []rbacv1.PolicyRule{ - rbacv1helpers.NewRule("create", "update").Groups(legacyGroup).Resources("configmaps").RuleOrDie(), - eventsRule(), + rbacv1helpers.NewRule("get", "list", "watch").Groups(coordinationGroup).Resources("leases").RuleOrDie(), + rbacv1helpers.NewRule("get", "list", "watch", "patch", "update", "delete").Groups(internalAPIServerGroup). + Resources("storageversions").RuleOrDie(), + rbacv1helpers.NewRule("get", "patch", "update").Groups(internalAPIServerGroup). + Resources("storageversions/status").RuleOrDie(), }, }) } diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/policy.go b/vendor/k8s.io/kubernetes/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/policy.go index 0923c2102d8c..be1f1bb188a1 100644 --- a/vendor/k8s.io/kubernetes/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/policy.go +++ b/vendor/k8s.io/kubernetes/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/policy.go @@ -42,23 +42,24 @@ var ( ) const ( - legacyGroup = "" - appsGroup = "apps" - authenticationGroup = "authentication.k8s.io" - authorizationGroup = "authorization.k8s.io" - autoscalingGroup = "autoscaling" - batchGroup = "batch" - certificatesGroup = "certificates.k8s.io" - coordinationGroup = "coordination.k8s.io" - discoveryGroup = "discovery.k8s.io" - extensionsGroup = "extensions" - policyGroup = "policy" - rbacGroup = "rbac.authorization.k8s.io" - storageGroup = "storage.k8s.io" - resMetricsGroup = "metrics.k8s.io" - customMetricsGroup = "custom.metrics.k8s.io" - networkingGroup = "networking.k8s.io" - eventsGroup = "events.k8s.io" + legacyGroup = "" + appsGroup = "apps" + authenticationGroup = "authentication.k8s.io" + authorizationGroup = "authorization.k8s.io" + autoscalingGroup = "autoscaling" + batchGroup = "batch" + certificatesGroup = "certificates.k8s.io" + coordinationGroup = "coordination.k8s.io" + discoveryGroup = "discovery.k8s.io" + extensionsGroup = "extensions" + policyGroup = "policy" + rbacGroup = "rbac.authorization.k8s.io" + storageGroup = "storage.k8s.io" + resMetricsGroup = "metrics.k8s.io" + customMetricsGroup = "custom.metrics.k8s.io" + networkingGroup = "networking.k8s.io" + eventsGroup = "events.k8s.io" + internalAPIServerGroup = "internal.apiserver.k8s.io" ) func addDefaultMetadata(obj runtime.Object) { @@ -169,10 +170,8 @@ func NodeRules() []rbacv1.PolicyRule { // CSI csiDriverRule := rbacv1helpers.NewRule("get", "watch", "list").Groups("storage.k8s.io").Resources("csidrivers").RuleOrDie() nodePolicyRules = append(nodePolicyRules, csiDriverRule) - if utilfeature.DefaultFeatureGate.Enabled(features.CSINodeInfo) { - csiNodeInfoRule := rbacv1helpers.NewRule("get", "create", "update", "patch", "delete").Groups("storage.k8s.io").Resources("csinodes").RuleOrDie() - nodePolicyRules = append(nodePolicyRules, csiNodeInfoRule) - } + csiNodeInfoRule := rbacv1helpers.NewRule("get", "create", "update", "patch", "delete").Groups("storage.k8s.io").Resources("csinodes").RuleOrDie() + nodePolicyRules = append(nodePolicyRules, csiNodeInfoRule) // RuntimeClass nodePolicyRules = append(nodePolicyRules, rbacv1helpers.NewRule("get", "list", "watch").Groups("node.k8s.io").Resources("runtimeclasses").RuleOrDie()) @@ -504,18 +503,16 @@ func clusterRoles() []rbacv1.ClusterRole { }, } - if utilfeature.DefaultFeatureGate.Enabled(features.ServiceAccountIssuerDiscovery) { - // Add the cluster role for reading the ServiceAccountIssuerDiscovery endpoints - roles = append(roles, rbacv1.ClusterRole{ - ObjectMeta: metav1.ObjectMeta{Name: "system:service-account-issuer-discovery"}, - Rules: []rbacv1.PolicyRule{ - rbacv1helpers.NewRule("get").URLs( - "/.well-known/openid-configuration", - "/openid/v1/jwks", - ).RuleOrDie(), - }, - }) - } + // Add the cluster role for reading the ServiceAccountIssuerDiscovery endpoints + roles = append(roles, rbacv1.ClusterRole{ + ObjectMeta: metav1.ObjectMeta{Name: "system:service-account-issuer-discovery"}, + Rules: []rbacv1.PolicyRule{ + rbacv1helpers.NewRule("get").URLs( + "/.well-known/openid-configuration", + "/openid/v1/jwks", + ).RuleOrDie(), + }, + }) // node-proxier role is used by kube-proxy. nodeProxierRules := []rbacv1.PolicyRule{ @@ -524,9 +521,7 @@ func clusterRoles() []rbacv1.ClusterRole { eventsRule(), } - if utilfeature.DefaultFeatureGate.Enabled(features.EndpointSlice) { - nodeProxierRules = append(nodeProxierRules, rbacv1helpers.NewRule("list", "watch").Groups(discoveryGroup).Resources("endpointslices").RuleOrDie()) - } + nodeProxierRules = append(nodeProxierRules, rbacv1helpers.NewRule("list", "watch").Groups(discoveryGroup).Resources("endpointslices").RuleOrDie()) roles = append(roles, rbacv1.ClusterRole{ ObjectMeta: metav1.ObjectMeta{Name: "system:node-proxier"}, Rules: nodeProxierRules, @@ -559,6 +554,8 @@ func clusterRoles() []rbacv1.ClusterRole { rbacv1helpers.NewRule("create").Groups(authorizationGroup).Resources("subjectaccessreviews").RuleOrDie(), // Needed for volume limits rbacv1helpers.NewRule(Read...).Groups(storageGroup).Resources("csinodes").RuleOrDie(), + // Needed for namespaceSelector feature in pod affinity + rbacv1helpers.NewRule(Read...).Groups(legacyGroup).Resources("namespaces").RuleOrDie(), } if utilfeature.DefaultFeatureGate.Enabled(features.CSIStorageCapacity) { kubeSchedulerRules = append(kubeSchedulerRules, @@ -601,19 +598,17 @@ func clusterRoleBindings() []rbacv1.ClusterRoleBinding { }, } - if utilfeature.DefaultFeatureGate.Enabled(features.ServiceAccountIssuerDiscovery) { - // Allow all in-cluster workloads (via their service accounts) to read the OIDC discovery endpoints. - // Users with certain forms of write access (create pods, create secrets, create service accounts, etc) - // can gain access to a service account identity which would allow them to access this information. - // This includes the issuer URL, which is already present in the SA token JWT. Similarly, SAs can - // already gain this same info via introspection of their own token. Since this discovery endpoint - // points to what issued all service account tokens, it seems fitting for SAs to have this access. - // Defer to the cluster admin with regard to binding directly to all authenticated and/or - // unauthenticated users. - rolebindings = append(rolebindings, - rbacv1helpers.NewClusterBinding("system:service-account-issuer-discovery").Groups(serviceaccount.AllServiceAccountsGroup).BindingOrDie(), - ) - } + // Allow all in-cluster workloads (via their service accounts) to read the OIDC discovery endpoints. + // Users with certain forms of write access (create pods, create secrets, create service accounts, etc) + // can gain access to a service account identity which would allow them to access this information. + // This includes the issuer URL, which is already present in the SA token JWT. Similarly, SAs can + // already gain this same info via introspection of their own token. Since this discovery endpoint + // points to what issued all service account tokens, it seems fitting for SAs to have this access. + // Defer to the cluster admin with regard to binding directly to all authenticated and/or + // unauthenticated users. + rolebindings = append(rolebindings, + rbacv1helpers.NewClusterBinding("system:service-account-issuer-discovery").Groups(serviceaccount.AllServiceAccountsGroup).BindingOrDie(), + ) addClusterRoleBindingLabel(rolebindings) diff --git a/vendor/k8s.io/kubernetes/test/e2e/BUILD b/vendor/k8s.io/kubernetes/test/e2e/BUILD deleted file mode 100644 index 3c4b2b166279..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/BUILD +++ /dev/null @@ -1,139 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "//build:go.bzl", - go_test = "go_test_conditional_pure", -) -load("@io_bazel_rules_go//go:def.bzl", "go_library") -load("//staging/src/k8s.io/component-base/version:def.bzl", "version_x_defs") - -go_test( - name = "go_default_test", - srcs = [ - "e2e_test.go", - "viperconfig_test.go", - ], - out = "e2e.test", - embed = [":go_default_library"], - tags = ["e2e"], - x_defs = version_x_defs(), - deps = [ - "//staging/src/k8s.io/component-base/version:go_default_library", - "//test/e2e/apimachinery:go_default_library", - "//test/e2e/apps:go_default_library", - "//test/e2e/auth:go_default_library", - "//test/e2e/autoscaling:go_default_library", - "//test/e2e/cloud:go_default_library", - "//test/e2e/common:go_default_library", - "//test/e2e/framework:go_default_library", - "//test/e2e/framework/config:go_default_library", - "//test/e2e/framework/testfiles:go_default_library", - "//test/e2e/generated:go_default_library", - "//test/e2e/instrumentation:go_default_library", - "//test/e2e/kubectl:go_default_library", - "//test/e2e/lifecycle:go_default_library", - "//test/e2e/lifecycle/bootstrap:go_default_library", - "//test/e2e/network:go_default_library", - "//test/e2e/node:go_default_library", - "//test/e2e/scheduling:go_default_library", - "//test/e2e/storage:go_default_library", - "//test/e2e/storage/external:go_default_library", - "//test/e2e/ui:go_default_library", - "//test/e2e/windows:go_default_library", - "//test/utils/image:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - "//vendor/gopkg.in/yaml.v2:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "e2e.go", - "examples.go", - "gke_local_ssd.go", - "gke_node_pools.go", - "suites.go", - "viperconfig.go", - ], - importpath = "k8s.io/kubernetes/test/e2e", - deps = [ - "//pkg/api/v1/pod:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/rbac/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/serviceaccount:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/plugin/pkg/client/auth:go_default_library", - "//staging/src/k8s.io/component-base/logs:go_default_library", - "//staging/src/k8s.io/component-base/version:go_default_library", - "//test/e2e/common:go_default_library", - "//test/e2e/framework:go_default_library", - "//test/e2e/framework/auth:go_default_library", - "//test/e2e/framework/kubectl:go_default_library", - "//test/e2e/framework/manifest:go_default_library", - "//test/e2e/framework/metrics:go_default_library", - "//test/e2e/framework/node:go_default_library", - "//test/e2e/framework/pod:go_default_library", - "//test/e2e/framework/providers/aws:go_default_library", - "//test/e2e/framework/providers/azure:go_default_library", - "//test/e2e/framework/providers/gce:go_default_library", - "//test/e2e/framework/providers/kubemark:go_default_library", - "//test/e2e/framework/providers/openstack:go_default_library", - "//test/e2e/framework/providers/vsphere:go_default_library", - "//test/e2e/framework/skipper:go_default_library", - "//test/e2e/framework/testfiles:go_default_library", - "//test/e2e/reporters:go_default_library", - "//test/utils:go_default_library", - "//vendor/github.com/onsi/ginkgo:go_default_library", - "//vendor/github.com/onsi/ginkgo/config:go_default_library", - "//vendor/github.com/onsi/ginkgo/reporters:go_default_library", - "//vendor/github.com/onsi/gomega:go_default_library", - "//vendor/github.com/pkg/errors:go_default_library", - "//vendor/github.com/spf13/viper:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//test/e2e/apimachinery:all-srcs", - "//test/e2e/apps:all-srcs", - "//test/e2e/auth:all-srcs", - "//test/e2e/autoscaling:all-srcs", - "//test/e2e/chaosmonkey:all-srcs", - "//test/e2e/cloud:all-srcs", - "//test/e2e/common:all-srcs", - "//test/e2e/framework:all-srcs", - "//test/e2e/generated:all-srcs", - "//test/e2e/instrumentation:all-srcs", - "//test/e2e/kubectl:all-srcs", - "//test/e2e/lifecycle:all-srcs", - "//test/e2e/network:all-srcs", - "//test/e2e/node:all-srcs", - "//test/e2e/perftype:all-srcs", - "//test/e2e/reporters:all-srcs", - "//test/e2e/scheduling:all-srcs", - "//test/e2e/storage:all-srcs", - "//test/e2e/system:all-srcs", - "//test/e2e/testing-manifests:all-srcs", - "//test/e2e/ui:all-srcs", - "//test/e2e/upgrades:all-srcs", - "//test/e2e/windows:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/README.md b/vendor/k8s.io/kubernetes/test/e2e/README.md index 71b00676181b..3ff2135ea67e 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/README.md +++ b/vendor/k8s.io/kubernetes/test/e2e/README.md @@ -1 +1,80 @@ -See [e2e-tests](https://git.k8s.io/community/contributors/devel/sig-testing/e2e-tests.md) +# test/e2e + +This is home to e2e tests used for presubmit, periodic, and postsubmit jobs. + +Some of these jobs are merge-blocking, some are release-blocking. + +## e2e test ownership + +All e2e tests must adhere to the following policies: +- the test must be owned by one and only one SIG +- the test must live in/underneath a sig-owned package matching pattern: `test/e2e/[{subpath}/]{sig}/...`, e.g. + - `test/e2e/auth` - all tests owned by sig-`auth` + - `test/e2e/common/storage` - all tests `common` to cluster-level and node-level e2e tests, owned by sig-`node` + - `test/e2e/upgrade/apps` - all tests used in `upgrade` testing, owned by sig-`apps` +- each sig-owned package should have an OWNERS file defining relevant approvers and labels for the owning sig, e.g. +```yaml +# test/e2e/node/OWNERS +# See the OWNERS docs at https://go.k8s.io/owners + +approvers: +- alice +- bob +- cynthia +emeritus_approvers: +- dave +reviewers: +- sig-node-reviewers +labels: +- sig/node +``` +- packages that use `{subpath}` should have an `imports.go` file importing sig-owned packages (for ginkgo's benefit), e.g. +```golang +// test/e2e/common/imports.go +package common + +import ( + // ensure these packages are scanned by ginkgo for e2e tests + _ "k8s.io/kubernetes/test/e2e/common/network" + _ "k8s.io/kubernetes/test/e2e/common/node" + _ "k8s.io/kubernetes/test/e2e/common/storage" +) +``` +- test ownership must be declared via a top-level SIGDescribe call defined in the sig-owned package, e.g. +```golang +// test/e2e/lifecycle/framework.go +package lifecycle + +import "github.com/onsi/ginkgo" + +// SIGDescribe annotates the test with the SIG label. +func SIGDescribe(text string, body func()) bool { + return ginkgo.Describe("[sig-cluster-lifecycle] "+text, body) +} +``` +```golang +// test/e2e/lifecycle/bootstrap/bootstrap_signer.go + +package bootstrap + +import ( + "github.com/onsi/ginkgo" + "k8s.io/kubernetes/test/e2e/lifecycle" +) +var _ = lifecycle.SIGDescribe("[Feature:BootstrapTokens]", func() { + /* ... */ + ginkgo.It("should sign the new added bootstrap tokens", func() { + /* ... */ + }) + /* etc */ +}) +``` + +These polices are enforced: +- via the merge-blocking presubmit job `pull-kubernetes-verify` +- which ends up running `hack/verify-e2e-test-ownership.sh` +- which can also be run via `make verify WHAT=e2e-test-ownership` + +## more info + +See [kubernetes/community/.../e2e-tests.md](https://git.k8s.io/community/contributors/devel/sig-testing/e2e-tests.md) diff --git a/vendor/k8s.io/kubernetes/test/e2e/apimachinery/BUILD b/vendor/k8s.io/kubernetes/test/e2e/apimachinery/BUILD deleted file mode 100644 index 8195ebf0ee4d..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/apimachinery/BUILD +++ /dev/null @@ -1,129 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "aggregator.go", - "certs.go", - "chunking.go", - "crd_conversion_webhook.go", - "crd_publish_openapi.go", - "crd_watch.go", - "custom_resource_definition.go", - "discovery.go", - "etcd_failure.go", - "events.go", - "flowcontrol.go", - "framework.go", - "garbage_collector.go", - "generated_clientset.go", - "health_handlers.go", - "namespace.go", - "protocol.go", - "request_timeout.go", - "resource_quota.go", - "server_version.go", - "table_conversion.go", - "watch.go", - "webhook.go", - ], - importpath = "k8s.io/kubernetes/test/e2e/apimachinery", - deps = [ - "//pkg/api/v1/pod:go_default_library", - "//pkg/apis/rbac/v1:go_default_library", - "//pkg/quota/v1/evaluator/core:go_default_library", - "//staging/src/k8s.io/api/admissionregistration/v1:go_default_library", - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/authorization/v1:go_default_library", - "//staging/src/k8s.io/api/batch/v1:go_default_library", - "//staging/src/k8s.io/api/batch/v1beta1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/flowcontrol/v1beta1:go_default_library", - "//staging/src/k8s.io/api/rbac/v1:go_default_library", - "//staging/src/k8s.io/api/scheduling/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/validation:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/test/integration:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/test/integration/fixtures:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/version:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/version:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/discovery:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/features:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/storagebackend:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/cli-runtime/pkg/printers:go_default_library", - "//staging/src/k8s.io/client-go/discovery:go_default_library", - "//staging/src/k8s.io/client-go/dynamic:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/util/cert:go_default_library", - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/client-go/util/keyutil:go_default_library", - "//staging/src/k8s.io/client-go/util/retry:go_default_library", - "//staging/src/k8s.io/client-go/util/workqueue:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset:go_default_library", - "//staging/src/k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1:go_default_library", - "//test/e2e/apps:go_default_library", - "//test/e2e/framework:go_default_library", - "//test/e2e/framework/deployment:go_default_library", - "//test/e2e/framework/metrics:go_default_library", - "//test/e2e/framework/node:go_default_library", - "//test/e2e/framework/pod:go_default_library", - "//test/e2e/framework/rc:go_default_library", - "//test/e2e/framework/skipper:go_default_library", - "//test/e2e/framework/ssh:go_default_library", - "//test/utils:go_default_library", - "//test/utils/crd:go_default_library", - "//test/utils/image:go_default_library", - "//vendor/github.com/go-openapi/spec:go_default_library", - "//vendor/github.com/onsi/ginkgo:go_default_library", - "//vendor/github.com/onsi/gomega:go_default_library", - "//vendor/github.com/prometheus/common/expfmt:go_default_library", - "//vendor/github.com/prometheus/common/model:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/util:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/validation/spec:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - "//vendor/sigs.k8s.io/yaml:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/apimachinery/OWNERS b/vendor/k8s.io/kubernetes/test/e2e/apimachinery/OWNERS index 5ef61ab7cd0b..696f623151a3 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/apimachinery/OWNERS +++ b/vendor/k8s.io/kubernetes/test/e2e/apimachinery/OWNERS @@ -18,7 +18,6 @@ reviewers: - cheftako - mikedanese - liggitt -- gmarek - sttts - ncdc - logicalhan diff --git a/vendor/k8s.io/kubernetes/test/e2e/apimachinery/aggregator.go b/vendor/k8s.io/kubernetes/test/e2e/apimachinery/aggregator.go index 927f35b95b9b..a5afd2566317 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/apimachinery/aggregator.go +++ b/vendor/k8s.io/kubernetes/test/e2e/apimachinery/aggregator.go @@ -34,6 +34,7 @@ import ( "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" unstructuredv1 "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/client-go/discovery" @@ -90,7 +91,7 @@ var _ = SIGDescribe("Aggregator", func() { }) /* - Release: v1.17 + Release: v1.17, v1.21 Testname: aggregator-supports-the-sample-apiserver Description: Ensure that the sample-apiserver code from 1.17 and compiled against 1.17 will work on the current Aggregator/API-Server. @@ -99,6 +100,7 @@ var _ = SIGDescribe("Aggregator", func() { // Testing a 1.17 version of the sample-apiserver TestSampleAPIServer(f, aggrclient, imageutils.GetE2EImage(imageutils.APIServer)) }) + }) func cleanTest(client clientset.Interface, aggrclient *aggregatorclient.Clientset, namespace string) { @@ -491,6 +493,49 @@ func TestSampleAPIServer(f *framework.Framework, aggrclient *aggregatorclient.Cl framework.Failf("failed to get back the correct flunders list %v from the dynamic client", unstructuredList) } + ginkgo.By("Read Status for v1alpha1.wardle.example.com") + statusContent, err := restClient.Get(). + AbsPath("/apis/apiregistration.k8s.io/v1/apiservices/v1alpha1.wardle.example.com/status"). + SetHeader("Accept", "application/json").DoRaw(context.TODO()) + framework.ExpectNoError(err, "No response for .../apiservices/v1alpha1.wardle.example.com/status. Error: %v", err) + + var jr *apiregistrationv1.APIService + err = json.Unmarshal([]byte(statusContent), &jr) + framework.ExpectNoError(err, "Failed to process statusContent: %v | err: %v ", string(statusContent), err) + framework.ExpectEqual(jr.Status.Conditions[0].Message, "all checks passed", "The Message returned was %v", jr.Status.Conditions[0].Message) + + ginkgo.By("kubectl patch apiservice v1alpha1.wardle.example.com -p '{\"spec\":{\"versionPriority\": 400}}'") + patchContent, err := restClient.Patch(types.MergePatchType). + AbsPath("/apis/apiregistration.k8s.io/v1/apiservices/v1alpha1.wardle.example.com"). + SetHeader("Accept", "application/json"). + Body([]byte(`{"spec":{"versionPriority": 400}}`)).DoRaw(context.TODO()) + + framework.ExpectNoError(err, "Patch failed for .../apiservices/v1alpha1.wardle.example.com. Error: %v", err) + err = json.Unmarshal([]byte(patchContent), &jr) + framework.ExpectNoError(err, "Failed to process patchContent: %v | err: %v ", string(patchContent), err) + framework.ExpectEqual(jr.Spec.VersionPriority, int32(400), "The VersionPriority returned was %d", jr.Spec.VersionPriority) + + ginkgo.By("List APIServices") + listApiservices, err := restClient.Get(). + AbsPath("/apis/apiregistration.k8s.io/v1/apiservices"). + SetHeader("Accept", "application/json").DoRaw(context.TODO()) + + framework.ExpectNoError(err, "No response for /apis/apiregistration.k8s.io/v1/apiservices Error: %v", err) + + var list *apiregistrationv1.APIServiceList + err = json.Unmarshal([]byte(listApiservices), &list) + framework.ExpectNoError(err, "Failed to process APIServiceList: %v | err: %v ", list, err) + + locatedWardle := false + for _, item := range list.Items { + if item.Name == "v1alpha1.wardle.example.com" { + framework.Logf("Found v1alpha1.wardle.example.com in APIServiceList") + locatedWardle = true + break + } + } + framework.ExpectEqual(locatedWardle, true, "Unable to find v1alpha1.wardle.example.com in APIServiceList") + // kubectl delete flunder test-flunder err = dynamicClient.Delete(context.TODO(), flunderName, metav1.DeleteOptions{}) validateErrorWithDebugInfo(f, err, pods, "deleting flunders(%v) using dynamic client", unstructuredList.Items) diff --git a/vendor/k8s.io/kubernetes/test/e2e/apimachinery/apply.go b/vendor/k8s.io/kubernetes/test/e2e/apimachinery/apply.go new file mode 100644 index 000000000000..471f13043719 --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/apimachinery/apply.go @@ -0,0 +1,1181 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package apimachinery + +import ( + "context" + "encoding/json" + "fmt" + "reflect" + + appsv1 "k8s.io/api/apps/v1" + apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" + apiextensionclientset "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset" + "k8s.io/apiextensions-apiserver/test/integration/fixtures" + apierrors "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/types" + "k8s.io/client-go/dynamic" + clientset "k8s.io/client-go/kubernetes" + "k8s.io/kubernetes/test/e2e/framework" + e2edeployment "k8s.io/kubernetes/test/e2e/framework/deployment" + + "github.com/onsi/ginkgo" + + // ensure libs have a chance to initialize + _ "github.com/stretchr/testify/assert" +) + +var _ = SIGDescribe("ServerSideApply", func() { + f := framework.NewDefaultFramework("apply") + + var client clientset.Interface + var ns string + + ginkgo.BeforeEach(func() { + client = f.ClientSet + ns = f.Namespace.Name + }) + + ginkgo.AfterEach(func() { + _ = client.AppsV1().Deployments(ns).Delete(context.TODO(), "deployment", metav1.DeleteOptions{}) + _ = client.AppsV1().Deployments(ns).Delete(context.TODO(), "deployment-shared-unset", metav1.DeleteOptions{}) + _ = client.AppsV1().Deployments(ns).Delete(context.TODO(), "deployment-shared-map-item-removal", metav1.DeleteOptions{}) + _ = client.CoreV1().Pods(ns).Delete(context.TODO(), "test-pod", metav1.DeleteOptions{}) + }) + + /* + Release : v1.21 + Testname: Server Side Apply, Create + Description: Apply an object. An apply on an object that does not exist MUST create the object. + */ + ginkgo.It("should create an applied object if it does not already exist", func() { + testCases := []struct { + resource string + name string + body string + managedFields string + }{ + { + resource: "pods", + name: "test-pod", + body: `{ + "apiVersion": "v1", + "kind": "Pod", + "metadata": { + "name": "test-pod" + }, + "spec": { + "containers": [{ + "name": "test-container", + "image": "test-image" + }] + } + }`, + managedFields: `{"f:spec":{"f:containers":{"k:{\"name\":\"test-container\"}":{".":{},"f:image":{},"f:name":{}}}}}`, + }, { + resource: "services", + name: "test-svc", + body: `{ + "apiVersion": "v1", + "kind": "Service", + "metadata": { + "name": "test-svc" + }, + "spec": { + "ports": [{ + "port": 8080, + "protocol": "UDP" + }] + } + }`, + managedFields: `{"f:spec":{"f:ports":{"k:{\"port\":8080,\"protocol\":\"UDP\"}":{".":{},"f:port":{},"f:protocol":{}}}}}`, + }, + } + + for _, tc := range testCases { + _, err := client.CoreV1().RESTClient().Patch(types.ApplyPatchType). + Namespace(ns). + Resource(tc.resource). + Name(tc.name). + Param("fieldManager", "apply_test"). + Body([]byte(tc.body)). + Do(context.TODO()). + Get() + if err != nil { + framework.Failf("Failed to create object using Apply patch: %v", err) + } + + _, err = client.CoreV1().RESTClient().Get().Namespace(ns).Resource(tc.resource).Name(tc.name).Do(context.TODO()).Get() + if err != nil { + framework.Failf("Failed to retrieve object: %v", err) + } + + // Test that we can re apply with a different field manager and don't get conflicts + obj, err := client.CoreV1().RESTClient().Patch(types.ApplyPatchType). + Namespace(ns). + Resource(tc.resource). + Name(tc.name). + Param("fieldManager", "apply_test_2"). + Body([]byte(tc.body)). + Do(context.TODO()). + Get() + if err != nil { + framework.Failf("Failed to re-apply object using Apply patch: %v", err) + } + + // Verify that both appliers own the fields + accessor, err := meta.Accessor(obj) + framework.ExpectNoError(err, "getting ObjectMeta") + managedFields := accessor.GetManagedFields() + for _, entry := range managedFields { + if entry.Manager == "apply_test_2" || entry.Manager == "apply_test" { + if entry.FieldsV1.String() != tc.managedFields { + framework.Failf("Expected managed fields %s, got %s", tc.managedFields, entry.FieldsV1.String()) + } + } + } + } + }) + + /* + Release : v1.21 + Testname: Server Side Apply, Subresource + Description: Apply a resource and issue a subsequent apply on a subresource. The subresource MUST be updated with the applied object contents. + */ + ginkgo.It("should work for subresources", func() { + { + testCases := []struct { + resource string + name string + body string + statusPatch string + }{ + { + resource: "pods", + name: "test-pod", + body: `{ + "apiVersion": "v1", + "kind": "Pod", + "metadata": { + "name": "test-pod" + }, + "spec": { + "containers": [{ + "name": "nginx", + "image": "nginx:latest", + }] + } + }`, + statusPatch: `{ + "apiVersion": "v1", + "kind": "Pod", + "metadata": { + "name": "test-pod" + }, + "status": {"conditions": [{"type": "MyStatus", "status":"True"}]}}`, + }, + } + + for _, tc := range testCases { + _, err := client.CoreV1().RESTClient().Patch(types.ApplyPatchType). + Namespace(ns). + Resource(tc.resource). + Name(tc.name). + Param("fieldManager", "apply_test"). + Body([]byte(tc.body)). + Do(context.TODO()). + Get() + if err != nil { + framework.Failf("Failed to create object using Apply patch: %v", err) + } + + _, err = client.CoreV1().RESTClient().Get().Namespace(ns).Resource(tc.resource).Name(tc.name).Do(context.TODO()).Get() + if err != nil { + framework.Failf("Failed to retrieve object: %v", err) + } + + // Test that apply does not update subresources unless directed at a subresource endpoint + _, err = client.CoreV1().RESTClient().Patch(types.ApplyPatchType). + Namespace(ns). + Resource(tc.resource). + Name(tc.name). + Param("fieldManager", "apply_test2"). + Body([]byte(tc.statusPatch)). + Do(context.TODO()). + Get() + if err != nil { + framework.Failf("Failed to Apply Status using Apply patch: %v", err) + } + pod, err := client.CoreV1().Pods(ns).Get(context.TODO(), "test-pod", metav1.GetOptions{}) + framework.ExpectNoError(err, "retrieving test pod") + for _, c := range pod.Status.Conditions { + if c.Type == "MyStatus" { + framework.Failf("Apply should not update subresources unless the endpoint is specifically specified") + } + } + + // Test that apply to subresource updates the subresource + _, err = client.CoreV1().RESTClient().Patch(types.ApplyPatchType). + Namespace(ns). + Resource(tc.resource). + SubResource("status"). + Name(tc.name). + Param("fieldManager", "apply_test2"). + Body([]byte(tc.statusPatch)). + Do(context.TODO()). + Get() + if err != nil { + framework.Failf("Failed to Apply Status using Apply patch: %v", err) + } + + pod, err = client.CoreV1().Pods(ns).Get(context.TODO(), "test-pod", metav1.GetOptions{}) + framework.ExpectNoError(err, "retrieving test pod") + + myStatusFound := false + for _, c := range pod.Status.Conditions { + if c.Type == "MyStatus" { + myStatusFound = true + break + } + } + if myStatusFound == false { + framework.Failf("Expected pod to have applied status") + } + } + } + }) + + /* + Release : v1.21 + Testname: Server Side Apply, unset field + Description: Apply an object. Issue a subsequent apply that removes a field. The particular field MUST be removed. + */ + ginkgo.It("should remove a field if it is owned but removed in the apply request", func() { + obj := []byte(`{ + "apiVersion": "apps/v1", + "kind": "Deployment", + "metadata": { + "name": "deployment", + "labels": {"app": "nginx"} + }, + "spec": { + "replicas": 3, + "selector": { + "matchLabels": { + "app": "nginx" + } + }, + "template": { + "metadata": { + "labels": { + "app": "nginx" + } + }, + "spec": { + "containers": [{ + "name": "nginx", + "image": "nginx:latest", + "ports": [{ + "containerPort": 80, + "protocol": "TCP" + }] + }] + } + } + } + }`) + + _, err := client.CoreV1().RESTClient().Patch(types.ApplyPatchType). + AbsPath("/apis/apps/v1"). + Namespace(ns). + Resource("deployments"). + Name("deployment"). + Param("fieldManager", "apply_test"). + Body(obj).Do(context.TODO()).Get() + if err != nil { + framework.Failf("Failed to create object using Apply patch: %v", err) + } + + obj = []byte(`{ + "apiVersion": "apps/v1", + "kind": "Deployment", + "metadata": { + "name": "deployment", + "labels": {"app": "nginx"} + }, + "spec": { + "replicas": 3, + "selector": { + "matchLabels": { + "app": "nginx" + } + }, + "template": { + "metadata": { + "labels": { + "app": "nginx" + } + }, + "spec": { + "containers": [{ + "name": "nginx", + "image": "nginx:latest" + }] + } + } + } + }`) + + _, err = client.CoreV1().RESTClient().Patch(types.ApplyPatchType). + AbsPath("/apis/apps/v1"). + Namespace(ns). + Resource("deployments"). + Name("deployment"). + Param("fieldManager", "apply_test"). + Body(obj).Do(context.TODO()).Get() + if err != nil { + framework.Failf("Failed to remove container port using Apply patch: %v", err) + } + + deployment, err := client.AppsV1().Deployments(ns).Get(context.TODO(), "deployment", metav1.GetOptions{}) + if err != nil { + framework.Failf("Failed to retrieve object: %v", err) + } + + if len(deployment.Spec.Template.Spec.Containers[0].Ports) > 0 { + framework.Failf("Expected no container ports but got: %v, object: \n%#v", deployment.Spec.Template.Spec.Containers[0].Ports, deployment) + } + + }) + + /* + Release : v1.21 + Testname: Server Side Apply, unset field shared + Description: Apply an object. Unset ownership of a field that is also owned by other managers and make a subsequent apply request. The unset field MUST not be removed from the object. + */ + ginkgo.It("should not remove a field if an owner unsets the field but other managers still have ownership of the field", func() { + // spec.replicas is a optional, defaulted field + // spec.template.spec.hostname is an optional, non-defaulted field + apply := []byte(`{ + "apiVersion": "apps/v1", + "kind": "Deployment", + "metadata": { + "name": "deployment-shared-unset", + "labels": {"app": "nginx"} + }, + "spec": { + "replicas": 3, + "selector": { + "matchLabels": { + "app": "nginx" + } + }, + "template": { + "metadata": { + "labels": { + "app": "nginx" + } + }, + "spec": { + "hostname": "test-hostname", + "containers": [{ + "name": "nginx", + "image": "nginx:latest" + }] + } + } + } + }`) + + for _, fieldManager := range []string{"shared_owner_1", "shared_owner_2"} { + _, err := client.CoreV1().RESTClient().Patch(types.ApplyPatchType). + AbsPath("/apis/apps/v1"). + Namespace(ns). + Resource("deployments"). + Name("deployment-shared-unset"). + Param("fieldManager", fieldManager). + Body(apply). + Do(context.TODO()). + Get() + if err != nil { + framework.Failf("Failed to create object using Apply patch: %v", err) + } + } + + // unset spec.replicas and spec.template.spec.hostname + apply = []byte(`{ + "apiVersion": "apps/v1", + "kind": "Deployment", + "metadata": { + "name": "deployment-shared-unset", + "labels": {"app": "nginx"} + }, + "spec": { + "selector": { + "matchLabels": { + "app": "nginx" + } + }, + "template": { + "metadata": { + "labels": { + "app": "nginx" + } + }, + "spec": { + "containers": [{ + "name": "nginx", + "image": "nginx:latest" + }] + } + } + } + }`) + + patched, err := client.CoreV1().RESTClient().Patch(types.ApplyPatchType). + AbsPath("/apis/apps/v1"). + Namespace(ns). + Resource("deployments"). + Name("deployment-shared-unset"). + Param("fieldManager", "shared_owner_1"). + Body(apply). + Do(context.TODO()). + Get() + if err != nil { + framework.Failf("Failed to create object using Apply patch: %v", err) + } + + deployment, ok := patched.(*appsv1.Deployment) + if !ok { + framework.Failf("Failed to convert response object to Deployment") + } + if *deployment.Spec.Replicas != 3 { + framework.Failf("Expected deployment.spec.replicas to be 3, but got %d", deployment.Spec.Replicas) + } + if deployment.Spec.Template.Spec.Hostname != "test-hostname" { + framework.Failf("Expected deployment.spec.template.spec.hostname to be \"test-hostname\", but got %s", deployment.Spec.Template.Spec.Hostname) + } + }) + + /* + Release : v1.21 + Testname: Server Side Apply, Force Apply + Description: Apply an object. Force apply a modified version of the object such that a conflict will exist in the managed fields. The force apply MUST successfully update the object. + */ + ginkgo.It("should ignore conflict errors if force apply is used", func() { + obj := []byte(`{ + "apiVersion": "apps/v1", + "kind": "Deployment", + "metadata": { + "name": "deployment", + "labels": {"app": "nginx"} + }, + "spec": { + "replicas": 3, + "selector": { + "matchLabels": { + "app": "nginx" + } + }, + "template": { + "metadata": { + "labels": { + "app": "nginx" + } + }, + "spec": { + "containers": [{ + "name": "nginx", + "image": "nginx:latest" + }] + } + } + } + }`) + _, err := client.CoreV1().RESTClient().Patch(types.ApplyPatchType). + AbsPath("/apis/apps/v1"). + Namespace(ns). + Resource("deployments"). + Name("deployment"). + Param("fieldManager", "apply_test"). + Body(obj).Do(context.TODO()).Get() + if err != nil { + framework.Failf("Failed to create object using Apply patch: %v", err) + } + + _, err = client.CoreV1().RESTClient().Patch(types.MergePatchType). + AbsPath("/apis/apps/v1"). + Namespace(ns). + Resource("deployments"). + Name("deployment"). + Body([]byte(`{"spec":{"replicas": 5}}`)).Do(context.TODO()).Get() + if err != nil { + framework.Failf("Failed to patch object: %v", err) + } + + _, err = client.CoreV1().RESTClient().Patch(types.ApplyPatchType). + AbsPath("/apis/apps/v1"). + Namespace(ns). + Resource("deployments"). + Name("deployment"). + Param("fieldManager", "apply_test"). + Body([]byte(obj)).Do(context.TODO()).Get() + if err == nil { + framework.Failf("Expecting to get conflicts when applying object") + } + status, ok := err.(*apierrors.StatusError) + if !(ok && apierrors.IsConflict(status)) { + framework.Failf("Expecting to get conflicts as API error") + } + if len(status.Status().Details.Causes) < 1 { + framework.Failf("Expecting to get at least one conflict when applying object, got: %v", status.Status().Details.Causes) + } + + _, err = client.CoreV1().RESTClient().Patch(types.ApplyPatchType). + AbsPath("/apis/apps/v1"). + Namespace(ns). + Resource("deployments"). + Name("deployment"). + Param("force", "true"). + Param("fieldManager", "apply_test"). + Body([]byte(obj)).Do(context.TODO()).Get() + if err != nil { + framework.Failf("Failed to apply object with force: %v", err) + } + }) + + /* + Release : v1.21 + Testname: Server Side Apply, CRD + Description: Create a CRD and apply a CRD resource. Subsequent apply requests that do not conflict with the previous ones should update the object. Apply requests that cause conflicts should fail. + */ + ginkgo.It("should work for CRDs", func() { + config, err := framework.LoadConfig() + if err != nil { + framework.Failf("%s", err) + } + apiExtensionClient, err := apiextensionclientset.NewForConfig(config) + if err != nil { + framework.Failf("%s", err) + } + dynamicClient, err := dynamic.NewForConfig(config) + if err != nil { + framework.Failf("%s", err) + } + + noxuDefinition := fixtures.NewRandomNameMultipleVersionCustomResourceDefinition(apiextensionsv1.ClusterScoped) + + var c apiextensionsv1.CustomResourceValidation + err = json.Unmarshal([]byte(`{ + "openAPIV3Schema": { + "type": "object", + "properties": { + "spec": { + "type": "object", + "x-kubernetes-preserve-unknown-fields": true, + "properties": { + "cronSpec": { + "type": "string", + "pattern": "^(\\d+|\\*)(/\\d+)?(\\s+(\\d+|\\*)(/\\d+)?){4}$" + }, + "ports": { + "type": "array", + "x-kubernetes-list-map-keys": [ + "containerPort", + "protocol" + ], + "x-kubernetes-list-type": "map", + "items": { + "properties": { + "containerPort": { + "format": "int32", + "type": "integer" + }, + "hostIP": { + "type": "string" + }, + "hostPort": { + "format": "int32", + "type": "integer" + }, + "name": { + "type": "string" + }, + "protocol": { + "type": "string" + } + }, + "required": [ + "containerPort", + "protocol" + ], + "type": "object" + } + } + } + } + } + } + }`), &c) + if err != nil { + framework.Failf("%s", err) + } + for i := range noxuDefinition.Spec.Versions { + noxuDefinition.Spec.Versions[i].Schema = &c + } + + noxuDefinition, err = fixtures.CreateNewV1CustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient) + if err != nil { + framework.Failf("cannot create crd %s", err) + } + + defer func() { + err = fixtures.DeleteV1CustomResourceDefinition(noxuDefinition, apiExtensionClient) + framework.ExpectNoError(err, "deleting CustomResourceDefinition") + }() + + kind := noxuDefinition.Spec.Names.Kind + apiVersion := noxuDefinition.Spec.Group + "/" + noxuDefinition.Spec.Versions[0].Name + name := "mytest" + + rest := apiExtensionClient.Discovery().RESTClient() + yamlBody := []byte(fmt.Sprintf(` +apiVersion: %s +kind: %s +metadata: + name: %s + finalizers: + - test-finalizer +spec: + cronSpec: "* * * * */5" + replicas: 1 + ports: + - name: x + containerPort: 80 + protocol: TCP`, apiVersion, kind, name)) + result, err := rest.Patch(types.ApplyPatchType). + AbsPath("/apis", noxuDefinition.Spec.Group, noxuDefinition.Spec.Versions[0].Name, noxuDefinition.Spec.Names.Plural). + Name(name). + Param("fieldManager", "apply_test"). + Body(yamlBody). + DoRaw(context.TODO()) + if err != nil { + framework.Failf("failed to create custom resource with apply: %v:\n%v", err, string(result)) + } + verifyNumFinalizers(result, 1) + verifyFinalizersIncludes(result, "test-finalizer") + verifyReplicas(result, 1) + verifyNumPorts(result, 1) + + // Ensure that apply works with multiple resource versions + apiVersionBeta := noxuDefinition.Spec.Group + "/" + noxuDefinition.Spec.Versions[1].Name + yamlBodyBeta := []byte(fmt.Sprintf(` +apiVersion: %s +kind: %s +metadata: + name: %s +spec: + cronSpec: "* * * * */5" + replicas: 1 + ports: + - name: x + containerPort: 80 + protocol: TCP`, apiVersionBeta, kind, name)) + result, err = rest.Patch(types.ApplyPatchType). + AbsPath("/apis", noxuDefinition.Spec.Group, noxuDefinition.Spec.Versions[1].Name, noxuDefinition.Spec.Names.Plural). + Name(name). + Param("fieldManager", "apply_test"). + Body(yamlBodyBeta). + DoRaw(context.TODO()) + if err != nil { + framework.Failf("failed to create custom resource with apply: %v:\n%v", err, string(result)) + } + verifyReplicas(result, 1) + verifyNumPorts(result, 1) + + // Reset the finalizers after the test so the objects can be deleted + defer func() { + result, err = rest.Patch(types.MergePatchType). + AbsPath("/apis", noxuDefinition.Spec.Group, noxuDefinition.Spec.Versions[0].Name, noxuDefinition.Spec.Names.Plural). + Name(name). + Body([]byte(`{"metadata":{"finalizers":[]}}`)). + DoRaw(context.TODO()) + if err != nil { + framework.Failf("failed to reset finalizers: %v:\n%v", err, string(result)) + } + }() + + // Patch object to add another finalizer to the finalizers list + result, err = rest.Patch(types.MergePatchType). + AbsPath("/apis", noxuDefinition.Spec.Group, noxuDefinition.Spec.Versions[0].Name, noxuDefinition.Spec.Names.Plural). + Name(name). + Body([]byte(`{"metadata":{"finalizers":["test-finalizer","another-one"]}}`)). + DoRaw(context.TODO()) + if err != nil { + framework.Failf("failed to add finalizer with merge patch: %v:\n%v", err, string(result)) + } + verifyNumFinalizers(result, 2) + verifyFinalizersIncludes(result, "test-finalizer") + verifyFinalizersIncludes(result, "another-one") + + // Re-apply the same config, should work fine, since finalizers should have the list-type extension 'set'. + result, err = rest.Patch(types.ApplyPatchType). + AbsPath("/apis", noxuDefinition.Spec.Group, noxuDefinition.Spec.Versions[0].Name, noxuDefinition.Spec.Names.Plural). + Name(name). + Param("fieldManager", "apply_test"). + SetHeader("Accept", "application/json"). + Body(yamlBody). + DoRaw(context.TODO()) + if err != nil { + framework.Failf("failed to apply same config after adding a finalizer: %v:\n%v", err, string(result)) + } + verifyNumFinalizers(result, 2) + verifyFinalizersIncludes(result, "test-finalizer") + verifyFinalizersIncludes(result, "another-one") + + // Patch object to change the number of replicas + result, err = rest.Patch(types.MergePatchType). + AbsPath("/apis", noxuDefinition.Spec.Group, noxuDefinition.Spec.Versions[0].Name, noxuDefinition.Spec.Names.Plural). + Name(name). + Body([]byte(`{"spec":{"replicas": 5}}`)). + DoRaw(context.TODO()) + if err != nil { + framework.Failf("failed to update number of replicas with merge patch: %v:\n%v", err, string(result)) + } + verifyReplicas(result, 5) + + // Re-apply, we should get conflicts now, since the number of replicas was changed. + result, err = rest.Patch(types.ApplyPatchType). + AbsPath("/apis", noxuDefinition.Spec.Group, noxuDefinition.Spec.Versions[0].Name, noxuDefinition.Spec.Names.Plural). + Name(name). + Param("fieldManager", "apply_test"). + Body(yamlBody). + DoRaw(context.TODO()) + if err == nil { + framework.Failf("Expecting to get conflicts when applying object after updating replicas, got no error: %s", result) + } + status, ok := err.(*apierrors.StatusError) + if !ok { + framework.Failf("Expecting to get conflicts as API error") + } + if len(status.Status().Details.Causes) != 1 { + framework.Failf("Expecting to get one conflict when applying object after updating replicas, got: %v", status.Status().Details.Causes) + } + + // Re-apply with force, should work fine. + result, err = rest.Patch(types.ApplyPatchType). + AbsPath("/apis", noxuDefinition.Spec.Group, noxuDefinition.Spec.Versions[0].Name, noxuDefinition.Spec.Names.Plural). + Name(name). + Param("force", "true"). + Param("fieldManager", "apply_test"). + Body(yamlBody). + DoRaw(context.TODO()) + if err != nil { + framework.Failf("failed to apply object with force after updating replicas: %v:\n%v", err, string(result)) + } + verifyReplicas(result, 1) + + // New applier tries to edit an existing list item, we should get conflicts. + result, err = rest.Patch(types.ApplyPatchType). + AbsPath("/apis", noxuDefinition.Spec.Group, noxuDefinition.Spec.Versions[0].Name, noxuDefinition.Spec.Names.Plural). + Name(name). + Param("fieldManager", "apply_test_2"). + Body([]byte(fmt.Sprintf(` +apiVersion: %s +kind: %s +metadata: + name: %s +spec: + ports: + - name: "y" + containerPort: 80 + protocol: TCP`, apiVersion, kind, name))). + DoRaw(context.TODO()) + if err == nil { + framework.Failf("Expecting to get conflicts when a different applier updates existing list item, got no error: %s", result) + } + status, ok = err.(*apierrors.StatusError) + if !ok { + framework.Failf("Expecting to get conflicts as API error") + } + if len(status.Status().Details.Causes) != 1 { + framework.Failf("Expecting to get one conflict when a different applier updates existing list item, got: %v", status.Status().Details.Causes) + } + + // New applier tries to add a new list item, should work fine. + result, err = rest.Patch(types.ApplyPatchType). + AbsPath("/apis", noxuDefinition.Spec.Group, noxuDefinition.Spec.Versions[0].Name, noxuDefinition.Spec.Names.Plural). + Name(name). + Param("fieldManager", "apply_test_2"). + Body([]byte(fmt.Sprintf(` +apiVersion: %s +kind: %s +metadata: + name: %s +spec: + ports: + - name: "y" + containerPort: 8080 + protocol: TCP`, apiVersion, kind, name))). + SetHeader("Accept", "application/json"). + DoRaw(context.TODO()) + if err != nil { + framework.Failf("failed to add a new list item to the object as a different applier: %v:\n%v", err, string(result)) + } + verifyNumPorts(result, 2) + + // UpdateOnCreate + notExistingYAMLBody := []byte(fmt.Sprintf(` + { + "apiVersion": "%s", + "kind": "%s", + "metadata": { + "name": "%s", + "finalizers": [ + "test-finalizer" + ] + }, + "spec": { + "cronSpec": "* * * * */5", + "replicas": 1, + "ports": [ + { + "name": "x", + "containerPort": 80 + } + ] + }, + "protocol": "TCP" + }`, apiVersion, kind, "should-not-exist")) + _, err = rest.Put(). + AbsPath("/apis", noxuDefinition.Spec.Group, noxuDefinition.Spec.Versions[0].Name, noxuDefinition.Spec.Names.Plural). + Name("should-not-exist"). + Param("fieldManager", "apply_test"). + Body(notExistingYAMLBody). + DoRaw(context.TODO()) + if !apierrors.IsNotFound(err) { + framework.Failf("create on update should fail with notFound, got %v", err) + } + + // Create a CRD to test atomic lists + crd := fixtures.NewRandomNameV1CustomResourceDefinition(apiextensionsv1.ClusterScoped) + err = json.Unmarshal([]byte(`{ + "openAPIV3Schema": { + "type": "object", + "properties": { + "spec": { + "type": "object", + "x-kubernetes-preserve-unknown-fields": true, + "properties": { + "atomicList": { + "type": "array", + "x-kubernetes-list-type": "atomic", + "items": { + "type": "string" + } + } + } + } + } + } + }`), &c) + if err != nil { + framework.Failf("%s", err) + } + for i := range crd.Spec.Versions { + crd.Spec.Versions[i].Schema = &c + } + + crd, err = fixtures.CreateNewV1CustomResourceDefinition(crd, apiExtensionClient, dynamicClient) + if err != nil { + framework.Failf("cannot create crd %s", err) + } + + defer func() { + err = fixtures.DeleteV1CustomResourceDefinition(crd, apiExtensionClient) + framework.ExpectNoError(err, "deleting CustomResourceDefinition") + }() + + crdKind := crd.Spec.Names.Kind + crdApiVersion := crd.Spec.Group + "/" + crd.Spec.Versions[0].Name + + crdYamlBody := []byte(fmt.Sprintf(` +apiVersion: %s +kind: %s +metadata: + name: %s +spec: + atomicList: + - "item1"`, crdApiVersion, crdKind, name)) + result, err = rest.Patch(types.ApplyPatchType). + AbsPath("/apis", crd.Spec.Group, crd.Spec.Versions[0].Name, crd.Spec.Names.Plural). + Name(name). + Param("fieldManager", "apply_test"). + Body(crdYamlBody). + DoRaw(context.TODO()) + if err != nil { + framework.Failf("failed to create custom resource with apply: %v:\n%v", err, string(result)) + } + + verifyList(result, []interface{}{"item1"}) + + crdYamlBody = []byte(fmt.Sprintf(` +apiVersion: %s +kind: %s +metadata: + name: %s +spec: + atomicList: + - "item2"`, crdApiVersion, crdKind, name)) + result, err = rest.Patch(types.ApplyPatchType). + AbsPath("/apis", crd.Spec.Group, crd.Spec.Versions[0].Name, crd.Spec.Names.Plural). + Name(name). + Param("fieldManager", "apply_test_2"). + Param("force", "true"). + Body(crdYamlBody). + DoRaw(context.TODO()) + if err != nil { + framework.Failf("failed to create custom resource with apply: %v:\n%v", err, string(result)) + } + + // Since the list is atomic the contents of the list must completely be replaced by the latest apply + verifyList(result, []interface{}{"item2"}) + }) + + /* + Release : v1.21 + Testname: Server Side Apply, Update take ownership + Description: Apply an object. Send an Update request which should take ownership of a field. The field should be owned by the new manager and a subsequent apply from the original manager MUST not change the field it does not have ownership of. + */ + ginkgo.It("should give up ownership of a field if forced applied by a controller", func() { + // Applier creates a deployment with replicas set to 3 + apply := []byte(`{ + "apiVersion": "apps/v1", + "kind": "Deployment", + "metadata": { + "name": "deployment-shared-map-item-removal", + "labels": {"app": "nginx"} + }, + "spec": { + "replicas": 3, + "selector": { + "matchLabels": { + "app": "nginx" + } + }, + "template": { + "metadata": { + "labels": { + "app": "nginx" + } + }, + "spec": { + "containers": [{ + "name": "nginx", + "image": "nginx:latest", + }] + } + } + } + }`) + + _, err := client.CoreV1().RESTClient().Patch(types.ApplyPatchType). + AbsPath("/apis/apps/v1"). + Namespace(ns). + Resource("deployments"). + Name("deployment-shared-map-item-removal"). + Param("fieldManager", "test_applier"). + Body(apply). + Do(context.TODO()). + Get() + if err != nil { + framework.Failf("Failed to create object using Apply patch: %v", err) + } + + replicas := int32(4) + _, err = e2edeployment.UpdateDeploymentWithRetries(client, ns, "deployment-shared-map-item-removal", func(update *appsv1.Deployment) { + update.Spec.Replicas = &replicas + }) + framework.ExpectNoError(err) + + // applier omits replicas + apply = []byte(`{ + "apiVersion": "apps/v1", + "kind": "Deployment", + "metadata": { + "name": "deployment-shared-map-item-removal", + "labels": {"app": "nginx"} + }, + "spec": { + "selector": { + "matchLabels": { + "app": "nginx" + } + }, + "template": { + "metadata": { + "labels": { + "app": "nginx" + } + }, + "spec": { + "containers": [{ + "name": "nginx", + "image": "nginx:latest", + }] + } + } + } + }`) + + patched, err := client.CoreV1().RESTClient().Patch(types.ApplyPatchType). + AbsPath("/apis/apps/v1"). + Namespace(ns). + Resource("deployments"). + Name("deployment-shared-map-item-removal"). + Param("fieldManager", "test_applier"). + Body(apply). + Do(context.TODO()). + Get() + if err != nil { + framework.Failf("Failed to create object using Apply patch: %v", err) + } + + // ensure the container is deleted even though a controller updated a field of the container + deployment, ok := patched.(*appsv1.Deployment) + if !ok { + framework.Failf("Failed to convert response object to Deployment") + } + if *deployment.Spec.Replicas != 4 { + framework.Failf("Expected deployment.spec.replicas to be 4, but got %d", deployment.Spec.Replicas) + } + }) +}) + +// verifyNumFinalizers checks that len(.metadata.finalizers) == n +func verifyNumFinalizers(b []byte, n int) { + obj := unstructured.Unstructured{} + err := obj.UnmarshalJSON(b) + if err != nil { + framework.Failf("failed to unmarshal response: %v", err) + } + if actual, expected := len(obj.GetFinalizers()), n; actual != expected { + framework.Failf("expected %v finalizers but got %v:\n%v", expected, actual, string(b)) + } +} + +// verifyFinalizersIncludes checks that .metadata.finalizers includes e +func verifyFinalizersIncludes(b []byte, e string) { + obj := unstructured.Unstructured{} + err := obj.UnmarshalJSON(b) + if err != nil { + framework.Failf("failed to unmarshal response: %v", err) + } + for _, a := range obj.GetFinalizers() { + if a == e { + return + } + } + framework.Failf("expected finalizers to include %q but got: %v", e, obj.GetFinalizers()) +} + +// verifyReplicas checks that .spec.replicas == r +func verifyReplicas(b []byte, r int) { + obj := unstructured.Unstructured{} + err := obj.UnmarshalJSON(b) + if err != nil { + framework.Failf("failed to find replicas number in response: %v:\n%v", err, string(b)) + } + spec, ok := obj.Object["spec"] + if !ok { + framework.Failf("failed to find replicas number in response:\n%v", string(b)) + } + specMap, ok := spec.(map[string]interface{}) + if !ok { + framework.Failf("failed to find replicas number in response:\n%v", string(b)) + } + replicas, ok := specMap["replicas"] + if !ok { + framework.Failf("failed to find replicas number in response:\n%v", string(b)) + } + replicasNumber, ok := replicas.(int64) + if !ok { + framework.Failf("failed to find replicas number in response: expected int64 but got: %v", reflect.TypeOf(replicas)) + } + if actual, expected := replicasNumber, int64(r); actual != expected { + framework.Failf("expected %v ports but got %v:\n%v", expected, actual, string(b)) + } +} + +// verifyNumPorts checks that len(.spec.ports) == n +func verifyNumPorts(b []byte, n int) { + obj := unstructured.Unstructured{} + err := obj.UnmarshalJSON(b) + if err != nil { + framework.Failf("failed to find ports list in response: %v:\n%v", err, string(b)) + } + spec, ok := obj.Object["spec"] + if !ok { + framework.Failf("failed to find ports list in response:\n%v", string(b)) + } + specMap, ok := spec.(map[string]interface{}) + if !ok { + framework.Failf("failed to find ports list in response:\n%v", string(b)) + } + ports, ok := specMap["ports"] + if !ok { + framework.Failf("failed to find ports list in response:\n%v", string(b)) + } + portsList, ok := ports.([]interface{}) + if !ok { + framework.Failf("failed to find ports list in response: expected array but got: %v", reflect.TypeOf(ports)) + } + if actual, expected := len(portsList), n; actual != expected { + framework.Failf("expected %v ports but got %v:\n%v", expected, actual, string(b)) + } +} + +// verifyList checks that .spec.atomicList is the exact same as the expectedList provided +func verifyList(b []byte, expectedList []interface{}) { + obj := unstructured.Unstructured{} + err := obj.UnmarshalJSON(b) + if err != nil { + framework.Failf("failed to find atomicList in response: %v:\n%v", err, string(b)) + } + spec, ok := obj.Object["spec"] + if !ok { + framework.Failf("failed to find atomicList in response:\n%v", string(b)) + } + specMap, ok := spec.(map[string]interface{}) + if !ok { + framework.Failf("failed to find atomicList in response:\n%v", string(b)) + } + list, ok := specMap["atomicList"] + if !ok { + framework.Failf("failed to find atomicList in response:\n%v", string(b)) + } + listString, ok := list.([]interface{}) + if !ok { + framework.Failf("failed to find atomicList in response:\n%v", string(b)) + } + if !reflect.DeepEqual(listString, expectedList) { + framework.Failf("Expected list %s, got %s", expectedList, listString) + } +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/apimachinery/events.go b/vendor/k8s.io/kubernetes/test/e2e/apimachinery/events.go deleted file mode 100644 index 630be2722e67..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/apimachinery/events.go +++ /dev/null @@ -1,200 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package apimachinery - -import ( - "context" - "encoding/json" - "time" - - v1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/wait" - "k8s.io/kubernetes/test/e2e/framework" - - "github.com/onsi/ginkgo" - "k8s.io/apimachinery/pkg/types" -) - -const ( - eventRetryPeriod = 1 * time.Second - eventRetryTimeout = 1 * time.Minute -) - -var _ = ginkgo.Describe("[sig-api-machinery] Events", func() { - f := framework.NewDefaultFramework("events") - - /* - Release: v1.20 - Testname: Event resource lifecycle - Description: Create an event, the event MUST exist. - The event is patched with a new message, the check MUST have the update message. - The event is deleted and MUST NOT show up when listing all events. - */ - framework.ConformanceIt("should ensure that an event can be fetched, patched, deleted, and listed", func() { - eventTestName := "event-test" - - ginkgo.By("creating a test event") - // create a test event in test namespace - _, err := f.ClientSet.CoreV1().Events(f.Namespace.Name).Create(context.TODO(), &v1.Event{ - ObjectMeta: metav1.ObjectMeta{ - Name: eventTestName, - Labels: map[string]string{ - "testevent-constant": "true", - }, - }, - Message: "This is a test event", - Reason: "Test", - Type: "Normal", - Count: 1, - InvolvedObject: v1.ObjectReference{ - Namespace: f.Namespace.Name, - }, - }, metav1.CreateOptions{}) - framework.ExpectNoError(err, "failed to create test event") - - ginkgo.By("listing all events in all namespaces") - // get a list of Events in all namespaces to ensure endpoint coverage - eventsList, err := f.ClientSet.CoreV1().Events("").List(context.TODO(), metav1.ListOptions{ - LabelSelector: "testevent-constant=true", - }) - framework.ExpectNoError(err, "failed list all events") - - foundCreatedEvent := false - var eventCreatedName string - for _, val := range eventsList.Items { - if val.ObjectMeta.Name == eventTestName && val.ObjectMeta.Namespace == f.Namespace.Name { - foundCreatedEvent = true - eventCreatedName = val.ObjectMeta.Name - break - } - } - framework.ExpectEqual(foundCreatedEvent, true, "unable to find the test event") - - ginkgo.By("patching the test event") - // patch the event's message - eventPatchMessage := "This is a test event - patched" - eventPatch, err := json.Marshal(map[string]interface{}{ - "message": eventPatchMessage, - }) - framework.ExpectNoError(err, "failed to marshal the patch JSON payload") - - _, err = f.ClientSet.CoreV1().Events(f.Namespace.Name).Patch(context.TODO(), eventTestName, types.StrategicMergePatchType, []byte(eventPatch), metav1.PatchOptions{}) - framework.ExpectNoError(err, "failed to patch the test event") - - ginkgo.By("fetching the test event") - // get event by name - event, err := f.ClientSet.CoreV1().Events(f.Namespace.Name).Get(context.TODO(), eventCreatedName, metav1.GetOptions{}) - framework.ExpectNoError(err, "failed to fetch the test event") - framework.ExpectEqual(event.Message, eventPatchMessage, "test event message does not match patch message") - - ginkgo.By("deleting the test event") - // delete original event - err = f.ClientSet.CoreV1().Events(f.Namespace.Name).Delete(context.TODO(), eventCreatedName, metav1.DeleteOptions{}) - framework.ExpectNoError(err, "failed to delete the test event") - - ginkgo.By("listing all events in all namespaces") - // get a list of Events list namespace - eventsList, err = f.ClientSet.CoreV1().Events("").List(context.TODO(), metav1.ListOptions{ - LabelSelector: "testevent-constant=true", - }) - framework.ExpectNoError(err, "fail to list all events") - foundCreatedEvent = false - for _, val := range eventsList.Items { - if val.ObjectMeta.Name == eventTestName && val.ObjectMeta.Namespace == f.Namespace.Name { - foundCreatedEvent = true - break - } - } - framework.ExpectEqual(foundCreatedEvent, false, "should not have found test event after deletion") - }) - - /* - Release: v1.20 - Testname: Event, delete a collection - Description: A set of events is created with a label selector which MUST be found when listed. - The set of events is deleted and MUST NOT show up when listed by its label selector. - */ - framework.ConformanceIt("should delete a collection of events", func() { - eventTestNames := []string{"test-event-1", "test-event-2", "test-event-3"} - - ginkgo.By("Create set of events") - // create a test event in test namespace - for _, eventTestName := range eventTestNames { - eventMessage := "This is " + eventTestName - _, err := f.ClientSet.CoreV1().Events(f.Namespace.Name).Create(context.TODO(), &v1.Event{ - - ObjectMeta: metav1.ObjectMeta{ - Name: eventTestName, - Labels: map[string]string{"testevent-set": "true"}, - }, - Message: eventMessage, - Reason: "Test", - Type: "Normal", - Count: 1, - InvolvedObject: v1.ObjectReference{ - Namespace: f.Namespace.Name, - }, - }, metav1.CreateOptions{}) - framework.ExpectNoError(err, "failed to create event") - framework.Logf("created %v", eventTestName) - } - - ginkgo.By("get a list of Events with a label in the current namespace") - // get a list of events - eventList, err := f.ClientSet.CoreV1().Events(f.Namespace.Name).List(context.TODO(), metav1.ListOptions{ - LabelSelector: "testevent-set=true", - }) - framework.ExpectNoError(err, "failed to get a list of events") - - framework.ExpectEqual(len(eventList.Items), len(eventTestNames), "looking for expected number of pod templates events") - - ginkgo.By("delete collection of events") - // delete collection - - framework.Logf("requesting DeleteCollection of events") - err = f.ClientSet.CoreV1().Events(f.Namespace.Name).DeleteCollection(context.TODO(), metav1.DeleteOptions{}, metav1.ListOptions{ - LabelSelector: "testevent-set=true"}) - framework.ExpectNoError(err, "failed to delete the test event") - - ginkgo.By("check that the list of events matches the requested quantity") - - err = wait.PollImmediate(eventRetryPeriod, eventRetryTimeout, checkEventListQuantity(f, "testevent-set=true", 0)) - framework.ExpectNoError(err, "failed to count required events") - }) - -}) - -func checkEventListQuantity(f *framework.Framework, label string, quantity int) func() (bool, error) { - return func() (bool, error) { - var err error - - framework.Logf("requesting list of events to confirm quantity") - - eventList, err := f.ClientSet.CoreV1().Events(f.Namespace.Name).List(context.TODO(), metav1.ListOptions{ - LabelSelector: label}) - - if err != nil { - return false, err - } - - if len(eventList.Items) != quantity { - return false, err - } - return true, nil - } -} diff --git a/vendor/k8s.io/kubernetes/test/e2e/apimachinery/flowcontrol.go b/vendor/k8s.io/kubernetes/test/e2e/apimachinery/flowcontrol.go index 2ba7512d014a..256fcc7402a2 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/apimachinery/flowcontrol.go +++ b/vendor/k8s.io/kubernetes/test/e2e/apimachinery/flowcontrol.go @@ -19,6 +19,7 @@ package apimachinery import ( "bytes" "context" + "errors" "fmt" "io" "net/http" @@ -32,39 +33,60 @@ import ( flowcontrol "k8s.io/api/flowcontrol/v1beta1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/apiserver/pkg/util/apihelpers" + clientset "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" clientsideflowcontrol "k8s.io/client-go/util/flowcontrol" "k8s.io/kubernetes/test/e2e/framework" ) const ( - requestConcurrencyLimitMetricName = "apiserver_flowcontrol_request_concurrency_limit" - requestConcurrencyLimitMetricLabelName = "priority_level" + requestConcurrencyLimitMetricName = "apiserver_flowcontrol_request_concurrency_limit" + priorityLevelLabelName = "priority_level" +) + +var ( + errPriorityLevelNotFound = errors.New("cannot find a metric sample with a matching priority level name label") ) var _ = SIGDescribe("API priority and fairness", func() { f := framework.NewDefaultFramework("apf") - ginkgo.It("should ensure that requests can be classified by testing flow-schemas/priority-levels", func() { + ginkgo.It("should ensure that requests can be classified by adding FlowSchema and PriorityLevelConfiguration", func() { testingFlowSchemaName := "e2e-testing-flowschema" testingPriorityLevelName := "e2e-testing-prioritylevel" matchingUsername := "noxu" nonMatchingUsername := "foo" - ginkgo.By("creating a testing prioritylevel") + ginkgo.By("creating a testing PriorityLevelConfiguration object") createdPriorityLevel, cleanup := createPriorityLevel(f, testingPriorityLevelName, 1) defer cleanup() - ginkgo.By("creating a testing flowschema") + ginkgo.By("creating a testing FlowSchema object") createdFlowSchema, cleanup := createFlowSchema(f, testingFlowSchemaName, 1000, testingPriorityLevelName, []string{matchingUsername}) defer cleanup() - ginkgo.By("checking response headers contain flow-schema/priority-level uid") - if !testResponseHeaderMatches(f, matchingUsername, string(createdPriorityLevel.UID), string(createdFlowSchema.UID)) { - framework.Failf("matching user doesnt received UID for the testing priority-level and flow-schema") + ginkgo.By("waiting for testing FlowSchema and PriorityLevelConfiguration to reach steady state") + waitForSteadyState(f, testingFlowSchemaName, testingPriorityLevelName) + + var response *http.Response + ginkgo.By("response headers should contain the UID of the appropriate FlowSchema and PriorityLevelConfiguration for a matching user") + response = makeRequest(f, matchingUsername) + if plUIDWant, plUIDGot := string(createdPriorityLevel.UID), getPriorityLevelUID(response); plUIDWant != plUIDGot { + framework.Failf("expected PriorityLevelConfiguration UID in the response header: %s, but got: %s, response header: %#v", plUIDWant, plUIDGot, response.Header) + } + if fsUIDWant, fsUIDGot := string(createdFlowSchema.UID), getFlowSchemaUID(response); fsUIDWant != fsUIDGot { + framework.Failf("expected FlowSchema UID in the response header: %s, but got: %s, response header: %#v", fsUIDWant, fsUIDGot, response.Header) + } + + ginkgo.By("response headers should contain non-empty UID of FlowSchema and PriorityLevelConfiguration for a non-matching user") + response = makeRequest(f, nonMatchingUsername) + if plUIDGot := getPriorityLevelUID(response); plUIDGot == "" { + framework.Failf("expected a non-empty PriorityLevelConfiguration UID in the response header, but got: %s, response header: %#v", plUIDGot, response.Header) } - if testResponseHeaderMatches(f, nonMatchingUsername, string(createdPriorityLevel.UID), string(createdPriorityLevel.UID)) { - framework.Failf("non-matching user unexpectedly received UID for the testing priority-level and flow-schema") + if fsUIDGot := getFlowSchemaUID(response); fsUIDGot == "" { + framework.Failf("expected a non-empty FlowSchema UID in the response header but got: %s, response header: %#v", fsUIDGot, response.Header) } }) @@ -100,8 +122,8 @@ var _ = SIGDescribe("API priority and fairness", func() { // In contrast, "lowqps" stays under its concurrency shares. // Additionally, the "highqps" client also has a higher matching // precedence for its flow schema. - {username: highQPSClientName, qps: 100.0, concurrencyMultiplier: 2.0, matchingPrecedence: 999, expectedCompletedPercentage: 0.75}, - {username: lowQPSClientName, qps: 5.0, concurrencyMultiplier: 0.5, matchingPrecedence: 1000, expectedCompletedPercentage: 0.75}, + {username: highQPSClientName, qps: 90, concurrencyMultiplier: 2.0, matchingPrecedence: 999, expectedCompletedPercentage: 0.90}, + {username: lowQPSClientName, qps: 4, concurrencyMultiplier: 0.5, matchingPrecedence: 1000, expectedCompletedPercentage: 0.90}, } ginkgo.By("creating test priority levels and flow schemas") @@ -115,16 +137,20 @@ var _ = SIGDescribe("API priority and fairness", func() { framework.Logf("creating FlowSchema %q", clients[i].flowSchemaName) _, cleanup = createFlowSchema(f, clients[i].flowSchemaName, clients[i].matchingPrecedence, clients[i].priorityLevelName, []string{clients[i].username}) defer cleanup() + + ginkgo.By("waiting for testing FlowSchema and PriorityLevelConfiguration to reach steady state") + waitForSteadyState(f, clients[i].flowSchemaName, clients[i].priorityLevelName) } ginkgo.By("getting request concurrency from metrics") for i := range clients { - realConcurrency := getPriorityLevelConcurrency(f, clients[i].priorityLevelName) + realConcurrency, err := getPriorityLevelConcurrency(f.ClientSet, clients[i].priorityLevelName) + framework.ExpectNoError(err) clients[i].concurrency = int32(float64(realConcurrency) * clients[i].concurrencyMultiplier) if clients[i].concurrency < 1 { clients[i].concurrency = 1 } - framework.Logf("request concurrency for %q will be %d (concurrency share = %d)", clients[i].username, clients[i].concurrency, realConcurrency) + framework.Logf("request concurrency for %q will be %d (that is %d times client multiplier)", clients[i].username, clients[i].concurrency, realConcurrency) } ginkgo.By(fmt.Sprintf("starting uniform QPS load for %s", loadDuration.String())) @@ -142,7 +168,7 @@ var _ = SIGDescribe("API priority and fairness", func() { ginkgo.By("checking completed requests with expected values") for _, client := range clients { // Each client should have 95% of its ideal number of completed requests. - maxCompletedRequests := float64(client.concurrency) * client.qps * float64(loadDuration/time.Second) + maxCompletedRequests := float64(client.concurrency) * client.qps * loadDuration.Seconds() fractionCompleted := float64(client.completedRequests) / maxCompletedRequests framework.Logf("client %q completed %d/%d requests (%.1f%%)", client.username, client.completedRequests, int32(maxCompletedRequests), 100*fractionCompleted) if fractionCompleted < client.expectedCompletedPercentage { @@ -174,6 +200,9 @@ var _ = SIGDescribe("API priority and fairness", func() { _, cleanup = createFlowSchema(f, flowSchemaName, 1000, priorityLevelName, []string{highQPSClientName, lowQPSClientName}) defer cleanup() + ginkgo.By("waiting for testing flow schema and priority level to reach steady state") + waitForSteadyState(f, flowSchemaName, priorityLevelName) + type client struct { username string qps float64 @@ -183,12 +212,13 @@ var _ = SIGDescribe("API priority and fairness", func() { expectedCompletedPercentage float64 //lint:ignore U1000 field is actually used } clients := []client{ - {username: highQPSClientName, qps: 100.0, concurrencyMultiplier: 2.0, expectedCompletedPercentage: 0.75}, - {username: lowQPSClientName, qps: 5.0, concurrencyMultiplier: 0.5, expectedCompletedPercentage: 0.90}, + {username: highQPSClientName, qps: 90, concurrencyMultiplier: 2.0, expectedCompletedPercentage: 0.90}, + {username: lowQPSClientName, qps: 4, concurrencyMultiplier: 0.5, expectedCompletedPercentage: 0.90}, } framework.Logf("getting real concurrency") - realConcurrency := getPriorityLevelConcurrency(f, priorityLevelName) + realConcurrency, err := getPriorityLevelConcurrency(f.ClientSet, priorityLevelName) + framework.ExpectNoError(err) for i := range clients { clients[i].concurrency = int32(float64(realConcurrency) * clients[i].concurrencyMultiplier) if clients[i].concurrency < 1 { @@ -248,10 +278,11 @@ func createPriorityLevel(f *framework.Framework, priorityLevelName string, assur } } -//lint:ignore U1000 function is actually referenced -func getPriorityLevelConcurrency(f *framework.Framework, priorityLevelName string) int32 { - resp, err := f.ClientSet.CoreV1().RESTClient().Get().RequestURI("/metrics").DoRaw(context.TODO()) - framework.ExpectNoError(err) +func getPriorityLevelConcurrency(c clientset.Interface, priorityLevelName string) (int32, error) { + resp, err := c.CoreV1().RESTClient().Get().RequestURI("/metrics").DoRaw(context.TODO()) + if err != nil { + return 0, err + } sampleDecoder := expfmt.SampleDecoder{ Dec: expfmt.NewDecoder(bytes.NewBuffer(resp), expfmt.FmtText), Opts: &expfmt.DecodeOptions{}, @@ -259,22 +290,23 @@ func getPriorityLevelConcurrency(f *framework.Framework, priorityLevelName strin for { var v model.Vector err := sampleDecoder.Decode(&v) - if err == io.EOF { - break + if err != nil { + if err == io.EOF { + break + } + return 0, err } - framework.ExpectNoError(err) for _, metric := range v { if string(metric.Metric[model.MetricNameLabel]) != requestConcurrencyLimitMetricName { continue } - if string(metric.Metric[requestConcurrencyLimitMetricLabelName]) != priorityLevelName { + if string(metric.Metric[priorityLevelLabelName]) != priorityLevelName { continue } - return int32(metric.Value) + return int32(metric.Value), nil } } - framework.ExpectNoError(fmt.Errorf("cannot find metric %q with matching priority level name label %q", requestConcurrencyLimitMetricName, priorityLevelName)) - return 0 + return 0, errPriorityLevelNotFound } // createFlowSchema creates a flow schema referring to a particular priority @@ -324,6 +356,35 @@ func createFlowSchema(f *framework.Framework, flowSchemaName string, matchingPre } } +// waitForSteadyState repeatedly polls the API server to check if the newly +// created flow schema and priority level have been seen by the APF controller +// by checking: (1) the dangling priority level reference condition in the flow +// schema status, and (2) metrics. The function times out after 30 seconds. +func waitForSteadyState(f *framework.Framework, flowSchemaName string, priorityLevelName string) { + framework.ExpectNoError(wait.Poll(time.Second, 30*time.Second, func() (bool, error) { + fs, err := f.ClientSet.FlowcontrolV1beta1().FlowSchemas().Get(context.TODO(), flowSchemaName, metav1.GetOptions{}) + if err != nil { + return false, err + } + condition := apihelpers.GetFlowSchemaConditionByType(fs, flowcontrol.FlowSchemaConditionDangling) + if condition == nil || condition.Status != flowcontrol.ConditionFalse { + // The absence of the dangling status object implies that the APF + // controller isn't done with syncing the flow schema object. And, of + // course, the condition being anything but false means that steady state + // hasn't been achieved. + return false, nil + } + _, err = getPriorityLevelConcurrency(f.ClientSet, priorityLevelName) + if err != nil { + if err == errPriorityLevelNotFound { + return false, nil + } + return false, err + } + return true, nil + })) +} + // makeRequests creates a request to the API server and returns the response. func makeRequest(f *framework.Framework, username string) *http.Response { config := f.ClientConfig() @@ -341,15 +402,12 @@ func makeRequest(f *framework.Framework, username string) *http.Response { return response } -func testResponseHeaderMatches(f *framework.Framework, impersonatingUser, plUID, fsUID string) bool { - response := makeRequest(f, impersonatingUser) - if response.Header.Get(flowcontrol.ResponseHeaderMatchedFlowSchemaUID) != fsUID { - return false - } - if response.Header.Get(flowcontrol.ResponseHeaderMatchedPriorityLevelConfigurationUID) != plUID { - return false - } - return true +func getPriorityLevelUID(response *http.Response) string { + return response.Header.Get(flowcontrol.ResponseHeaderMatchedPriorityLevelConfigurationUID) +} + +func getFlowSchemaUID(response *http.Response) string { + return response.Header.Get(flowcontrol.ResponseHeaderMatchedFlowSchemaUID) } // uniformQPSLoadSingle loads the API server with requests at a uniform @@ -358,7 +416,7 @@ func testResponseHeaderMatches(f *framework.Framework, impersonatingUser, plUID, func uniformQPSLoadSingle(f *framework.Framework, username string, qps float64, loadDuration time.Duration) int32 { var completed int32 var wg sync.WaitGroup - ticker := time.NewTicker(time.Duration(1e9/qps) * time.Nanosecond) + ticker := time.NewTicker(time.Duration(float64(time.Second) / qps)) defer ticker.Stop() timer := time.NewTimer(loadDuration) for { diff --git a/vendor/k8s.io/kubernetes/test/e2e/apimachinery/resource_quota.go b/vendor/k8s.io/kubernetes/test/e2e/apimachinery/resource_quota.go index 3e0571c9e694..93f78844c330 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/apimachinery/resource_quota.go +++ b/vendor/k8s.io/kubernetes/test/e2e/apimachinery/resource_quota.go @@ -36,6 +36,7 @@ import ( "k8s.io/kubernetes/test/e2e/framework" "k8s.io/kubernetes/test/utils/crd" imageutils "k8s.io/kubernetes/test/utils/image" + "k8s.io/utils/pointer" "github.com/onsi/ginkgo" ) @@ -100,23 +101,37 @@ var _ = SIGDescribe("ResourceQuota", func() { framework.ExpectNoError(err) ginkgo.By("Creating a Service") - service := newTestServiceForQuota("test-service", v1.ServiceTypeClusterIP) + service := newTestServiceForQuota("test-service", v1.ServiceTypeClusterIP, false) service, err = f.ClientSet.CoreV1().Services(f.Namespace.Name).Create(context.TODO(), service, metav1.CreateOptions{}) framework.ExpectNoError(err) + ginkgo.By("Creating a NodePort Service") + nodeport := newTestServiceForQuota("test-service-np", v1.ServiceTypeNodePort, false) + nodeport, err = f.ClientSet.CoreV1().Services(f.Namespace.Name).Create(context.TODO(), nodeport, metav1.CreateOptions{}) + framework.ExpectNoError(err) + + ginkgo.By("Not allowing a LoadBalancer Service with NodePort to be created that exceeds remaining quota") + loadbalancer := newTestServiceForQuota("test-service-lb", v1.ServiceTypeLoadBalancer, false) + _, err = f.ClientSet.CoreV1().Services(f.Namespace.Name).Create(context.TODO(), loadbalancer, metav1.CreateOptions{}) + framework.ExpectError(err) + ginkgo.By("Ensuring resource quota status captures service creation") usedResources = v1.ResourceList{} usedResources[v1.ResourceQuotas] = resource.MustParse(strconv.Itoa(c + 1)) - usedResources[v1.ResourceServices] = resource.MustParse("1") + usedResources[v1.ResourceServices] = resource.MustParse("2") + usedResources[v1.ResourceServicesNodePorts] = resource.MustParse("1") err = waitForResourceQuota(f.ClientSet, f.Namespace.Name, quotaName, usedResources) framework.ExpectNoError(err) - ginkgo.By("Deleting a Service") + ginkgo.By("Deleting Services") err = f.ClientSet.CoreV1().Services(f.Namespace.Name).Delete(context.TODO(), service.Name, metav1.DeleteOptions{}) framework.ExpectNoError(err) + err = f.ClientSet.CoreV1().Services(f.Namespace.Name).Delete(context.TODO(), nodeport.Name, metav1.DeleteOptions{}) + framework.ExpectNoError(err) ginkgo.By("Ensuring resource quota status released usage") usedResources[v1.ResourceServices] = resource.MustParse("0") + usedResources[v1.ResourceServicesNodePorts] = resource.MustParse("0") err = waitForResourceQuota(f.ClientSet, f.Namespace.Name, quotaName, usedResources) framework.ExpectNoError(err) }) @@ -320,6 +335,7 @@ var _ = SIGDescribe("ResourceQuota", func() { ginkgo.By("Creating a ResourceQuota") quotaName := "test-quota" resourceQuota := newTestResourceQuota(quotaName) + resourceQuota.Spec.Hard[v1.ResourceConfigMaps] = resource.MustParse(hardConfigMaps) _, err = createResourceQuota(f.ClientSet, f.Namespace.Name, resourceQuota) framework.ExpectNoError(err) @@ -338,9 +354,6 @@ var _ = SIGDescribe("ResourceQuota", func() { ginkgo.By("Ensuring resource quota status captures configMap creation") usedResources = v1.ResourceList{} usedResources[v1.ResourceQuotas] = resource.MustParse(strconv.Itoa(c + 1)) - // we expect there to be two configmaps because each namespace will receive - // a ca.crt configmap by default. - // ref:https://github.com/kubernetes/kubernetes/pull/68812 usedResources[v1.ResourceConfigMaps] = resource.MustParse(hardConfigMaps) err = waitForResourceQuota(f.ClientSet, f.Namespace.Name, quotaName, usedResources) framework.ExpectNoError(err) @@ -465,7 +478,7 @@ var _ = SIGDescribe("ResourceQuota", func() { Delete the PVC. Deletion MUST succeed and resource usage count against its PVC and storage object MUST be released from ResourceQuotaStatus of the ResourceQuota. [NotConformancePromotable] as test suite do not have any e2e at this moment which are explicitly verifying PV and PVC behaviour. */ - ginkgo.It("should create a ResourceQuota and capture the life of a persistent volume claim. [sig-storage]", func() { + ginkgo.It("should create a ResourceQuota and capture the life of a persistent volume claim", func() { ginkgo.By("Counting existing ResourceQuota") c, err := countResourceQuota(f.ClientSet, f.Namespace.Name) framework.ExpectNoError(err) @@ -515,7 +528,7 @@ var _ = SIGDescribe("ResourceQuota", func() { Delete the PVC. Deletion MUST succeed and resource usage count against PVC, storageClass and storage object MUST be released from ResourceQuotaStatus of the ResourceQuota. [NotConformancePromotable] as test suite do not have any e2e at this moment which are explicitly verifying PV and PVC behaviour. */ - ginkgo.It("should create a ResourceQuota and capture the life of a persistent volume claim with a storage class. [sig-storage]", func() { + ginkgo.It("should create a ResourceQuota and capture the life of a persistent volume claim with a storage class", func() { ginkgo.By("Counting existing ResourceQuota") c, err := countResourceQuota(f.ClientSet, f.Namespace.Name) framework.ExpectNoError(err) @@ -1406,6 +1419,80 @@ var _ = SIGDescribe("ResourceQuota [Feature:PodPriority]", func() { }) +var _ = SIGDescribe("ResourceQuota [Feature:CrossNamespacePodAffinity] [alpha]", func() { + f := framework.NewDefaultFramework("cross-namespace-pod-affinity") + ginkgo.It("should verify ResourceQuota with cross namespace pod affinity scope using scope-selectors.", func() { + ginkgo.By("Creating a ResourceQuota with cross namespace pod affinity scope") + quota, err := createResourceQuota( + f.ClientSet, f.Namespace.Name, newTestResourceQuotaWithScopeSelector("quota-cross-namespace-pod-affinity", v1.ResourceQuotaScopeCrossNamespacePodAffinity)) + framework.ExpectNoError(err) + + ginkgo.By("Ensuring ResourceQuota status is calculated") + wantUsedResources := v1.ResourceList{v1.ResourcePods: resource.MustParse("0")} + err = waitForResourceQuota(f.ClientSet, f.Namespace.Name, quota.Name, wantUsedResources) + framework.ExpectNoError(err) + + ginkgo.By("Creating a pod that does not use cross namespace affinity") + pod := newTestPodWithAffinityForQuota(f, "no-cross-namespace-affinity", &v1.Affinity{ + PodAntiAffinity: &v1.PodAntiAffinity{ + RequiredDuringSchedulingIgnoredDuringExecution: []v1.PodAffinityTerm{{ + TopologyKey: "region", + }}}}) + pod, err = f.ClientSet.CoreV1().Pods(f.Namespace.Name).Create(context.TODO(), pod, metav1.CreateOptions{}) + framework.ExpectNoError(err) + + ginkgo.By("Creating a pod that uses namespaces field") + podWithNamespaces := newTestPodWithAffinityForQuota(f, "with-namespaces", &v1.Affinity{ + PodAntiAffinity: &v1.PodAntiAffinity{ + RequiredDuringSchedulingIgnoredDuringExecution: []v1.PodAffinityTerm{{ + TopologyKey: "region", + Namespaces: []string{"ns1"}, + }}}}) + podWithNamespaces, err = f.ClientSet.CoreV1().Pods(f.Namespace.Name).Create(context.TODO(), podWithNamespaces, metav1.CreateOptions{}) + framework.ExpectNoError(err) + + ginkgo.By("Ensuring resource quota captures podWithNamespaces usage") + wantUsedResources[v1.ResourcePods] = resource.MustParse("1") + err = waitForResourceQuota(f.ClientSet, f.Namespace.Name, quota.Name, wantUsedResources) + framework.ExpectNoError(err) + + ginkgo.By("Creating a pod that uses namespaceSelector field") + podWithNamespaceSelector := newTestPodWithAffinityForQuota(f, "with-namespace-selector", &v1.Affinity{ + PodAntiAffinity: &v1.PodAntiAffinity{ + RequiredDuringSchedulingIgnoredDuringExecution: []v1.PodAffinityTerm{{ + TopologyKey: "region", + NamespaceSelector: &metav1.LabelSelector{ + MatchExpressions: []metav1.LabelSelectorRequirement{ + { + Key: "team", + Operator: metav1.LabelSelectorOpIn, + Values: []string{"ads"}, + }, + }, + }}}}}) + podWithNamespaceSelector, err = f.ClientSet.CoreV1().Pods(f.Namespace.Name).Create(context.TODO(), podWithNamespaceSelector, metav1.CreateOptions{}) + framework.ExpectNoError(err) + + ginkgo.By("Ensuring resource quota captures podWithNamespaceSelector usage") + wantUsedResources[v1.ResourcePods] = resource.MustParse("2") + err = waitForResourceQuota(f.ClientSet, f.Namespace.Name, quota.Name, wantUsedResources) + framework.ExpectNoError(err) + + ginkgo.By("Deleting the pods") + err = f.ClientSet.CoreV1().Pods(f.Namespace.Name).Delete(context.TODO(), pod.Name, *metav1.NewDeleteOptions(0)) + framework.ExpectNoError(err) + err = f.ClientSet.CoreV1().Pods(f.Namespace.Name).Delete(context.TODO(), podWithNamespaces.Name, *metav1.NewDeleteOptions(0)) + framework.ExpectNoError(err) + err = f.ClientSet.CoreV1().Pods(f.Namespace.Name).Delete(context.TODO(), podWithNamespaceSelector.Name, *metav1.NewDeleteOptions(0)) + framework.ExpectNoError(err) + + ginkgo.By("Ensuring resource quota status released the pod usage") + wantUsedResources[v1.ResourcePods] = resource.MustParse("0") + err = waitForResourceQuota(f.ClientSet, f.Namespace.Name, quota.Name, wantUsedResources) + framework.ExpectNoError(err) + }) +}) + // newTestResourceQuotaWithScopeSelector returns a quota that enforces default constraints for testing with scopeSelectors func newTestResourceQuotaWithScopeSelector(name string, scope v1.ResourceQuotaScope) *v1.ResourceQuota { hard := v1.ResourceList{} @@ -1478,7 +1565,7 @@ func newTestResourceQuota(name string) *v1.ResourceQuota { hard[v1.ResourceQuotas] = resource.MustParse("1") hard[v1.ResourceCPU] = resource.MustParse("1") hard[v1.ResourceMemory] = resource.MustParse("500Mi") - hard[v1.ResourceConfigMaps] = resource.MustParse("2") + hard[v1.ResourceConfigMaps] = resource.MustParse("10") hard[v1.ResourceSecrets] = resource.MustParse("10") hard[v1.ResourcePersistentVolumeClaims] = resource.MustParse("10") hard[v1.ResourceRequestsStorage] = resource.MustParse("10Gi") @@ -1548,6 +1635,30 @@ func newTestPodForQuotaWithPriority(f *framework.Framework, name string, request } } +// newTestPodForQuota returns a pod that has the specified requests and limits +func newTestPodWithAffinityForQuota(f *framework.Framework, name string, affinity *v1.Affinity) *v1.Pod { + return &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + }, + Spec: v1.PodSpec{ + // prevent disruption to other test workloads in parallel test runs by ensuring the quota + // test pods don't get scheduled onto a node + NodeSelector: map[string]string{ + "x-test.k8s.io/unsatisfiable": "not-schedulable", + }, + Affinity: affinity, + Containers: []v1.Container{ + { + Name: "pause", + Image: imageutils.GetPauseImageName(), + Resources: v1.ResourceRequirements{}, + }, + }, + }, + } +} + // newTestPersistentVolumeClaimForQuota returns a simple persistent volume claim func newTestPersistentVolumeClaimForQuota(name string) *v1.PersistentVolumeClaim { return &v1.PersistentVolumeClaim{ @@ -1625,7 +1736,7 @@ func newTestReplicaSetForQuota(name, image string, replicas int32) *appsv1.Repli } // newTestServiceForQuota returns a simple service -func newTestServiceForQuota(name string, serviceType v1.ServiceType) *v1.Service { +func newTestServiceForQuota(name string, serviceType v1.ServiceType, allocateLoadBalancerNodePorts bool) *v1.Service { return &v1.Service{ ObjectMeta: metav1.ObjectMeta{ Name: name, @@ -1636,6 +1747,7 @@ func newTestServiceForQuota(name string, serviceType v1.ServiceType) *v1.Service Port: 80, TargetPort: intstr.FromInt(80), }}, + AllocateLoadBalancerNodePorts: pointer.BoolPtr(allocateLoadBalancerNodePorts), }, } } diff --git a/vendor/k8s.io/kubernetes/test/e2e/apimachinery/storage_version.go b/vendor/k8s.io/kubernetes/test/e2e/apimachinery/storage_version.go new file mode 100644 index 000000000000..f0fa4b95d6a4 --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/apimachinery/storage_version.go @@ -0,0 +1,82 @@ +/* +Copyright 2020 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package apimachinery + +import ( + "context" + "time" + + apiserverinternalv1alpha1 "k8s.io/api/apiserverinternal/v1alpha1" + apierrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/kubernetes/test/e2e/framework" + + "github.com/onsi/ginkgo" +) + +const ( + svName = "storageversion.e2e.test.foos" + idNonExist = "id-non-exist" +) + +var _ = SIGDescribe("StorageVersion resources [Feature:StorageVersionAPI]", func() { + f := framework.NewDefaultFramework("storage-version") + + ginkgo.It("storage version with non-existing id should be GC'ed", func() { + client := f.ClientSet + sv := &apiserverinternalv1alpha1.StorageVersion{ + ObjectMeta: metav1.ObjectMeta{ + GenerateName: svName, + }, + } + createdSV, err := client.InternalV1alpha1().StorageVersions().Create(context.TODO(), sv, metav1.CreateOptions{}) + framework.ExpectNoError(err, "creating storage version") + + // update the created sv with server storage version + version := "v1" + createdSV.Status = apiserverinternalv1alpha1.StorageVersionStatus{ + StorageVersions: []apiserverinternalv1alpha1.ServerStorageVersion{ + { + APIServerID: idNonExist, + EncodingVersion: version, + DecodableVersions: []string{version}, + }, + }, + CommonEncodingVersion: &version, + } + _, err = client.InternalV1alpha1().StorageVersions().UpdateStatus( + context.TODO(), createdSV, metav1.UpdateOptions{}) + framework.ExpectNoError(err, "updating storage version") + + // wait for sv to be GC'ed + framework.Logf("Waiting for storage version %v to be garbage collected", createdSV.Name) + err = wait.PollImmediate(100*time.Millisecond, wait.ForeverTestTimeout, func() (bool, error) { + _, err := client.InternalV1alpha1().StorageVersions().Get( + context.TODO(), createdSV.Name, metav1.GetOptions{}) + if apierrors.IsNotFound(err) { + return true, nil + } + if err != nil { + return false, err + } + framework.Logf("The storage version %v hasn't been garbage collected yet. Retrying", createdSV.Name) + return false, nil + }) + framework.ExpectNoError(err, "garbage-collecting storage version") + }) +}) diff --git a/vendor/k8s.io/kubernetes/test/e2e/apimachinery/webhook.go b/vendor/k8s.io/kubernetes/test/e2e/apimachinery/webhook.go index 006bb885c96a..75dec1288370 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/apimachinery/webhook.go +++ b/vendor/k8s.io/kubernetes/test/e2e/apimachinery/webhook.go @@ -18,6 +18,7 @@ package apimachinery import ( "context" + "encoding/json" "fmt" "reflect" "strings" @@ -2127,13 +2128,13 @@ func labelNamespace(f *framework.Framework, namespace string) { client := f.ClientSet // Add a unique label to the namespace - ns, err := client.CoreV1().Namespaces().Get(context.TODO(), namespace, metav1.GetOptions{}) - framework.ExpectNoError(err, "error getting namespace %s", namespace) - if ns.Labels == nil { - ns.Labels = map[string]string{} - } - ns.Labels[f.UniqueName] = "true" - _, err = client.CoreV1().Namespaces().Update(context.TODO(), ns, metav1.UpdateOptions{}) + nsPatch, err := json.Marshal(map[string]interface{}{ + "metadata": map[string]interface{}{ + "labels": map[string]string{f.UniqueName: "true"}, + }, + }) + framework.ExpectNoError(err, "error marshaling namespace %s", namespace) + _, err = client.CoreV1().Namespaces().Patch(context.TODO(), namespace, types.StrategicMergePatchType, nsPatch, metav1.PatchOptions{}) framework.ExpectNoError(err, "error labeling namespace %s", namespace) } diff --git a/vendor/k8s.io/kubernetes/test/e2e/apps/BUILD b/vendor/k8s.io/kubernetes/test/e2e/apps/BUILD deleted file mode 100644 index 3bf6384c0504..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/apps/BUILD +++ /dev/null @@ -1,101 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "cronjob.go", - "daemon_restart.go", - "daemon_set.go", - "deployment.go", - "disruption.go", - "framework.go", - "job.go", - "network_partition.go", - "rc.go", - "replica_set.go", - "statefulset.go", - "types.go", - "wait.go", - ], - importpath = "k8s.io/kubernetes/test/e2e/apps", - visibility = ["//visibility:public"], - deps = [ - "//pkg/api/v1/pod:go_default_library", - "//pkg/apis/apps:go_default_library", - "//pkg/apis/batch:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/extensions:go_default_library", - "//pkg/cluster/ports:go_default_library", - "//pkg/controller/daemon:go_default_library", - "//pkg/controller/deployment/util:go_default_library", - "//pkg/controller/job:go_default_library", - "//pkg/controller/nodelifecycle:go_default_library", - "//pkg/controller/replicaset:go_default_library", - "//pkg/controller/replication:go_default_library", - "//pkg/scheduler/apis/config:go_default_library", - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", - "//staging/src/k8s.io/api/batch/v1:go_default_library", - "//staging/src/k8s.io/api/batch/v1beta1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/json:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/dynamic:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/apps/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/tools/watch:go_default_library", - "//staging/src/k8s.io/client-go/util/retry:go_default_library", - "//test/e2e/common:go_default_library", - "//test/e2e/framework:go_default_library", - "//test/e2e/framework/deployment:go_default_library", - "//test/e2e/framework/job:go_default_library", - "//test/e2e/framework/network:go_default_library", - "//test/e2e/framework/node:go_default_library", - "//test/e2e/framework/pod:go_default_library", - "//test/e2e/framework/pv:go_default_library", - "//test/e2e/framework/rc:go_default_library", - "//test/e2e/framework/replicaset:go_default_library", - "//test/e2e/framework/resource:go_default_library", - "//test/e2e/framework/service:go_default_library", - "//test/e2e/framework/skipper:go_default_library", - "//test/e2e/framework/ssh:go_default_library", - "//test/e2e/framework/statefulset:go_default_library", - "//test/utils:go_default_library", - "//test/utils/image:go_default_library", - "//vendor/github.com/davecgh/go-spew/spew:go_default_library", - "//vendor/github.com/evanphx/json-patch:go_default_library", - "//vendor/github.com/onsi/ginkgo:go_default_library", - "//vendor/github.com/onsi/gomega:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/apps/cronjob.go b/vendor/k8s.io/kubernetes/test/e2e/apps/cronjob.go index a5fea77ce4c6..dd1feb7e0662 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/apps/cronjob.go +++ b/vendor/k8s.io/kubernetes/test/e2e/apps/cronjob.go @@ -18,6 +18,7 @@ package apps import ( "context" + "encoding/json" "fmt" "time" @@ -25,13 +26,17 @@ import ( "github.com/onsi/gomega" batchv1 "k8s.io/api/batch/v1" - batchv1beta1 "k8s.io/api/batch/v1beta1" v1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/apimachinery/pkg/watch" clientset "k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes/scheme" + "k8s.io/client-go/util/retry" batchinternal "k8s.io/kubernetes/pkg/apis/batch" "k8s.io/kubernetes/pkg/controller/job" "k8s.io/kubernetes/test/e2e/framework" @@ -59,10 +64,14 @@ var _ = SIGDescribe("CronJob", func() { e2eskipper.SkipIfMissingResource(f.DynamicClient, CronJobGroupVersionResourceBeta, f.Namespace.Name) }) - // multiple jobs running at once - ginkgo.It("should schedule multiple jobs concurrently", func() { + /* + Release: v1.21 + Testname: CronJob AllowConcurrent + Description: CronJob MUST support AllowConcurrent policy, allowing to run multiple jobs at the same time. + */ + framework.ConformanceIt("should schedule multiple jobs concurrently", func() { ginkgo.By("Creating a cronjob") - cronJob := newTestCronJob("concurrent", "*/1 * * * ?", batchv1beta1.AllowConcurrent, + cronJob := newTestCronJob("concurrent", "*/1 * * * ?", batchv1.AllowConcurrent, sleepCommand, nil, nil) cronJob, err := createCronJob(f.ClientSet, f.Namespace.Name, cronJob) framework.ExpectNoError(err, "Failed to create CronJob in namespace %s", f.Namespace.Name) @@ -82,10 +91,14 @@ var _ = SIGDescribe("CronJob", func() { framework.ExpectNoError(err, "Failed to delete CronJob %s in namespace %s", cronJob.Name, f.Namespace.Name) }) - // suspended should not schedule jobs - ginkgo.It("should not schedule jobs when suspended [Slow]", func() { + /* + Release: v1.21 + Testname: CronJob Suspend + Description: CronJob MUST support suspension, which suppresses creation of new jobs. + */ + framework.ConformanceIt("should not schedule jobs when suspended [Slow]", func() { ginkgo.By("Creating a suspended cronjob") - cronJob := newTestCronJob("suspended", "*/1 * * * ?", batchv1beta1.AllowConcurrent, + cronJob := newTestCronJob("suspended", "*/1 * * * ?", batchv1.AllowConcurrent, sleepCommand, nil, nil) t := true cronJob.Spec.Suspend = &t @@ -106,10 +119,14 @@ var _ = SIGDescribe("CronJob", func() { framework.ExpectNoError(err, "Failed to delete CronJob %s in namespace %s", cronJob.Name, f.Namespace.Name) }) - // only single active job is allowed for ForbidConcurrent - ginkgo.It("should not schedule new jobs when ForbidConcurrent [Slow]", func() { + /* + Release: v1.21 + Testname: CronJob FrobidConcurrent + Description: CronJob MUST support ForbidConcurrent policy, allowing to run single, previous job at the time. + */ + framework.ConformanceIt("should not schedule new jobs when ForbidConcurrent [Slow]", func() { ginkgo.By("Creating a ForbidConcurrent cronjob") - cronJob := newTestCronJob("forbid", "*/1 * * * ?", batchv1beta1.ForbidConcurrent, + cronJob := newTestCronJob("forbid", "*/1 * * * ?", batchv1.ForbidConcurrent, sleepCommand, nil, nil) cronJob, err := createCronJob(f.ClientSet, f.Namespace.Name, cronJob) framework.ExpectNoError(err, "Failed to create CronJob in namespace %s", f.Namespace.Name) @@ -138,10 +155,14 @@ var _ = SIGDescribe("CronJob", func() { framework.ExpectNoError(err, "Failed to delete CronJob %s in namespace %s", cronJob.Name, f.Namespace.Name) }) - // only single active job is allowed for ReplaceConcurrent - ginkgo.It("should replace jobs when ReplaceConcurrent", func() { + /* + Release: v1.21 + Testname: CronJob ReplaceConcurrent + Description: CronJob MUST support ReplaceConcurrent policy, allowing to run single, newer job at the time. + */ + framework.ConformanceIt("should replace jobs when ReplaceConcurrent", func() { ginkgo.By("Creating a ReplaceConcurrent cronjob") - cronJob := newTestCronJob("replace", "*/1 * * * ?", batchv1beta1.ReplaceConcurrent, + cronJob := newTestCronJob("replace", "*/1 * * * ?", batchv1.ReplaceConcurrent, sleepCommand, nil, nil) cronJob, err := createCronJob(f.ClientSet, f.Namespace.Name, cronJob) framework.ExpectNoError(err, "Failed to create CronJob in namespace %s", f.Namespace.Name) @@ -172,7 +193,7 @@ var _ = SIGDescribe("CronJob", func() { ginkgo.It("should be able to schedule after more than 100 missed schedule", func() { ginkgo.By("Creating a cronjob") - cronJob := newTestCronJob("concurrent", "*/1 * * * ?", batchv1beta1.ForbidConcurrent, + cronJob := newTestCronJob("concurrent", "*/1 * * * ?", batchv1.ForbidConcurrent, sleepCommand, nil, nil) creationTime := time.Now().Add(-99 * 24 * time.Hour) lastScheduleTime := creationTime.Add(-1 * 24 * time.Hour) @@ -199,7 +220,7 @@ var _ = SIGDescribe("CronJob", func() { // shouldn't give us unexpected warnings ginkgo.It("should not emit unexpected warnings", func() { ginkgo.By("Creating a cronjob") - cronJob := newTestCronJob("concurrent", "*/1 * * * ?", batchv1beta1.AllowConcurrent, + cronJob := newTestCronJob("concurrent", "*/1 * * * ?", batchv1.AllowConcurrent, nil, nil, nil) cronJob, err := createCronJob(f.ClientSet, f.Namespace.Name, cronJob) framework.ExpectNoError(err, "Failed to create CronJob in namespace %s", f.Namespace.Name) @@ -222,7 +243,7 @@ var _ = SIGDescribe("CronJob", func() { // deleted jobs should be removed from the active list ginkgo.It("should remove from active list jobs that have been deleted", func() { ginkgo.By("Creating a ForbidConcurrent cronjob") - cronJob := newTestCronJob("forbid", "*/1 * * * ?", batchv1beta1.ForbidConcurrent, + cronJob := newTestCronJob("forbid", "*/1 * * * ?", batchv1.ForbidConcurrent, sleepCommand, nil, nil) cronJob, err := createCronJob(f.ClientSet, f.Namespace.Name, cronJob) framework.ExpectNoError(err, "Failed to create CronJob in namespace %s", f.Namespace.Name) @@ -263,7 +284,7 @@ var _ = SIGDescribe("CronJob", func() { ginkgo.By("Creating an AllowConcurrent cronjob with custom history limit") successLimit := int32(1) failedLimit := int32(0) - cronJob := newTestCronJob("successful-jobs-history-limit", "*/1 * * * ?", batchv1beta1.AllowConcurrent, + cronJob := newTestCronJob("successful-jobs-history-limit", "*/1 * * * ?", batchv1.AllowConcurrent, successCommand, &successLimit, &failedLimit) ensureHistoryLimits(f.ClientSet, f.Namespace.Name, cronJob) @@ -274,15 +295,180 @@ var _ = SIGDescribe("CronJob", func() { ginkgo.By("Creating an AllowConcurrent cronjob with custom history limit") successLimit := int32(0) failedLimit := int32(1) - cronJob := newTestCronJob("failed-jobs-history-limit", "*/1 * * * ?", batchv1beta1.AllowConcurrent, + cronJob := newTestCronJob("failed-jobs-history-limit", "*/1 * * * ?", batchv1.AllowConcurrent, failureCommand, &successLimit, &failedLimit) ensureHistoryLimits(f.ClientSet, f.Namespace.Name, cronJob) }) + /* + Release: v1.21 + Testname: CronJob API Operations + Description: + CronJob MUST support create, get, list, watch, update, patch, delete, and deletecollection. + CronJob/status MUST support get, update and patch. + */ + framework.ConformanceIt("should support CronJob API operations", func() { + ginkgo.By("Creating a cronjob") + successLimit := int32(1) + failedLimit := int32(0) + cjTemplate := newTestCronJob("test-api", "* */1 * * ?", batchv1.AllowConcurrent, + successCommand, &successLimit, &failedLimit) + cjTemplate.Labels = map[string]string{ + "special-label": f.UniqueName, + } + + ns := f.Namespace.Name + cjVersion := "v1" + cjClient := f.ClientSet.BatchV1().CronJobs(ns) + + ginkgo.By("creating") + createdCronJob, err := cjClient.Create(context.TODO(), cjTemplate, metav1.CreateOptions{}) + framework.ExpectNoError(err) + + ginkgo.By("getting") + gottenCronJob, err := cjClient.Get(context.TODO(), createdCronJob.Name, metav1.GetOptions{}) + framework.ExpectNoError(err) + framework.ExpectEqual(gottenCronJob.UID, createdCronJob.UID) + + ginkgo.By("listing") + cjs, err := cjClient.List(context.TODO(), metav1.ListOptions{LabelSelector: "special-label=" + f.UniqueName}) + framework.ExpectNoError(err) + framework.ExpectEqual(len(cjs.Items), 1, "filtered list should have 1 item") + + ginkgo.By("watching") + framework.Logf("starting watch") + cjWatch, err := cjClient.Watch(context.TODO(), metav1.ListOptions{ResourceVersion: cjs.ResourceVersion, LabelSelector: "special-label=" + f.UniqueName}) + framework.ExpectNoError(err) + + // Test cluster-wide list and watch + clusterCJClient := f.ClientSet.BatchV1().CronJobs("") + ginkgo.By("cluster-wide listing") + clusterCJs, err := clusterCJClient.List(context.TODO(), metav1.ListOptions{LabelSelector: "special-label=" + f.UniqueName}) + framework.ExpectNoError(err) + framework.ExpectEqual(len(clusterCJs.Items), 1, "filtered list should have 1 items") + + ginkgo.By("cluster-wide watching") + framework.Logf("starting watch") + _, err = clusterCJClient.Watch(context.TODO(), metav1.ListOptions{ResourceVersion: cjs.ResourceVersion, LabelSelector: "special-label=" + f.UniqueName}) + framework.ExpectNoError(err) + + ginkgo.By("patching") + patchedCronJob, err := cjClient.Patch(context.TODO(), createdCronJob.Name, types.MergePatchType, + []byte(`{"metadata":{"annotations":{"patched":"true"}}}`), metav1.PatchOptions{}) + framework.ExpectNoError(err) + framework.ExpectEqual(patchedCronJob.Annotations["patched"], "true", "patched object should have the applied annotation") + + ginkgo.By("updating") + var cjToUpdate, updatedCronJob *batchv1.CronJob + err = retry.RetryOnConflict(retry.DefaultRetry, func() error { + cjToUpdate, err = cjClient.Get(context.TODO(), createdCronJob.Name, metav1.GetOptions{}) + if err != nil { + return err + } + cjToUpdate.Annotations["updated"] = "true" + updatedCronJob, err = cjClient.Update(context.TODO(), cjToUpdate, metav1.UpdateOptions{}) + return err + }) + framework.ExpectNoError(err) + framework.ExpectEqual(updatedCronJob.Annotations["updated"], "true", "updated object should have the applied annotation") + + framework.Logf("waiting for watch events with expected annotations") + for sawAnnotations := false; !sawAnnotations; { + select { + case evt, ok := <-cjWatch.ResultChan(): + framework.ExpectEqual(ok, true, "watch channel should not close") + framework.ExpectEqual(evt.Type, watch.Modified) + watchedCronJob, isCronJob := evt.Object.(*batchv1.CronJob) + framework.ExpectEqual(isCronJob, true, fmt.Sprintf("expected CronJob, got %T", evt.Object)) + if watchedCronJob.Annotations["patched"] == "true" { + framework.Logf("saw patched and updated annotations") + sawAnnotations = true + cjWatch.Stop() + } else { + framework.Logf("missing expected annotations, waiting: %#v", watchedCronJob.Annotations) + } + case <-time.After(wait.ForeverTestTimeout): + framework.Fail("timed out waiting for watch event") + } + } + + // /status subresource operations + ginkgo.By("patching /status") + // we need to use RFC3339 version since conversion over the wire cuts nanoseconds + now1 := metav1.Now().Rfc3339Copy() + cjStatus := batchv1.CronJobStatus{ + LastScheduleTime: &now1, + } + cjStatusJSON, err := json.Marshal(cjStatus) + framework.ExpectNoError(err) + patchedStatus, err := cjClient.Patch(context.TODO(), createdCronJob.Name, types.MergePatchType, + []byte(`{"metadata":{"annotations":{"patchedstatus":"true"}},"status":`+string(cjStatusJSON)+`}`), + metav1.PatchOptions{}, "status") + framework.ExpectNoError(err) + framework.ExpectEqual(patchedStatus.Status.LastScheduleTime.Equal(&now1), true, "patched object should have the applied lastScheduleTime status") + framework.ExpectEqual(patchedStatus.Annotations["patchedstatus"], "true", "patched object should have the applied annotation") + + ginkgo.By("updating /status") + // we need to use RFC3339 version since conversion over the wire cuts nanoseconds + now2 := metav1.Now().Rfc3339Copy() + var statusToUpdate, updatedStatus *batchv1.CronJob + err = retry.RetryOnConflict(retry.DefaultRetry, func() error { + statusToUpdate, err = cjClient.Get(context.TODO(), createdCronJob.Name, metav1.GetOptions{}) + if err != nil { + return err + } + statusToUpdate.Status.LastScheduleTime = &now2 + updatedStatus, err = cjClient.UpdateStatus(context.TODO(), statusToUpdate, metav1.UpdateOptions{}) + return err + }) + framework.ExpectNoError(err) + framework.ExpectEqual(updatedStatus.Status.LastScheduleTime.Equal(&now2), true, fmt.Sprintf("updated object status expected to have updated lastScheduleTime %#v, got %#v", statusToUpdate.Status.LastScheduleTime, updatedStatus.Status.LastScheduleTime)) + + ginkgo.By("get /status") + cjResource := schema.GroupVersionResource{Group: "batch", Version: cjVersion, Resource: "cronjobs"} + gottenStatus, err := f.DynamicClient.Resource(cjResource).Namespace(ns).Get(context.TODO(), createdCronJob.Name, metav1.GetOptions{}, "status") + framework.ExpectNoError(err) + statusUID, _, err := unstructured.NestedFieldCopy(gottenStatus.Object, "metadata", "uid") + framework.ExpectNoError(err) + framework.ExpectEqual(string(createdCronJob.UID), statusUID, fmt.Sprintf("createdCronJob.UID: %v expected to match statusUID: %v ", createdCronJob.UID, statusUID)) + + // CronJob resource delete operations + expectFinalizer := func(cj *batchv1.CronJob, msg string) { + framework.ExpectNotEqual(cj.DeletionTimestamp, nil, fmt.Sprintf("expected deletionTimestamp, got nil on step: %q, cronjob: %+v", msg, cj)) + framework.ExpectEqual(len(cj.Finalizers) > 0, true, fmt.Sprintf("expected finalizers on cronjob, got none on step: %q, cronjob: %+v", msg, cj)) + } + + ginkgo.By("deleting") + cjTemplate.Name = "for-removal" + forRemovalCronJob, err := cjClient.Create(context.TODO(), cjTemplate, metav1.CreateOptions{}) + framework.ExpectNoError(err) + err = cjClient.Delete(context.TODO(), forRemovalCronJob.Name, metav1.DeleteOptions{}) + framework.ExpectNoError(err) + cj, err := cjClient.Get(context.TODO(), forRemovalCronJob.Name, metav1.GetOptions{}) + // If controller does not support finalizers, we expect a 404. Otherwise we validate finalizer behavior. + if err == nil { + expectFinalizer(cj, "deleting cronjob") + } else { + framework.ExpectEqual(apierrors.IsNotFound(err), true, fmt.Sprintf("expected 404, got %v", err)) + } + + ginkgo.By("deleting a collection") + err = cjClient.DeleteCollection(context.TODO(), metav1.DeleteOptions{}, metav1.ListOptions{LabelSelector: "special-label=" + f.UniqueName}) + framework.ExpectNoError(err) + cjs, err = cjClient.List(context.TODO(), metav1.ListOptions{LabelSelector: "special-label=" + f.UniqueName}) + framework.ExpectNoError(err) + // Should have <= 2 items since some cronjobs might not have been deleted yet due to finalizers + framework.ExpectEqual(len(cjs.Items) <= 2, true, "filtered list should be <= 2") + // Validate finalizers + for _, cj := range cjs.Items { + expectFinalizer(&cj, "deleting cronjob collection") + } + }) + }) -func ensureHistoryLimits(c clientset.Interface, ns string, cronJob *batchv1beta1.CronJob) { +func ensureHistoryLimits(c clientset.Interface, ns string, cronJob *batchv1.CronJob) { cronJob, err := createCronJob(c, ns, cronJob) framework.ExpectNoError(err, "Failed to create allowconcurrent cronjob with custom history limits in namespace %s", ns) @@ -324,22 +510,22 @@ func ensureHistoryLimits(c clientset.Interface, ns string, cronJob *batchv1beta1 } // newTestCronJob returns a cronjob which does one of several testing behaviors. -func newTestCronJob(name, schedule string, concurrencyPolicy batchv1beta1.ConcurrencyPolicy, - command []string, successfulJobsHistoryLimit *int32, failedJobsHistoryLimit *int32) *batchv1beta1.CronJob { +func newTestCronJob(name, schedule string, concurrencyPolicy batchv1.ConcurrencyPolicy, + command []string, successfulJobsHistoryLimit *int32, failedJobsHistoryLimit *int32) *batchv1.CronJob { parallelism := int32(1) completions := int32(1) backofflimit := int32(1) - sj := &batchv1beta1.CronJob{ + sj := &batchv1.CronJob{ ObjectMeta: metav1.ObjectMeta{ Name: name, }, TypeMeta: metav1.TypeMeta{ Kind: "CronJob", }, - Spec: batchv1beta1.CronJobSpec{ + Spec: batchv1.CronJobSpec{ Schedule: schedule, ConcurrencyPolicy: concurrencyPolicy, - JobTemplate: batchv1beta1.JobTemplateSpec{ + JobTemplate: batchv1.JobTemplateSpec{ Spec: batchv1.JobSpec{ Parallelism: ¶llelism, Completions: &completions, @@ -381,17 +567,17 @@ func newTestCronJob(name, schedule string, concurrencyPolicy batchv1beta1.Concur return sj } -func createCronJob(c clientset.Interface, ns string, cronJob *batchv1beta1.CronJob) (*batchv1beta1.CronJob, error) { - return c.BatchV1beta1().CronJobs(ns).Create(context.TODO(), cronJob, metav1.CreateOptions{}) +func createCronJob(c clientset.Interface, ns string, cronJob *batchv1.CronJob) (*batchv1.CronJob, error) { + return c.BatchV1().CronJobs(ns).Create(context.TODO(), cronJob, metav1.CreateOptions{}) } -func getCronJob(c clientset.Interface, ns, name string) (*batchv1beta1.CronJob, error) { - return c.BatchV1beta1().CronJobs(ns).Get(context.TODO(), name, metav1.GetOptions{}) +func getCronJob(c clientset.Interface, ns, name string) (*batchv1.CronJob, error) { + return c.BatchV1().CronJobs(ns).Get(context.TODO(), name, metav1.GetOptions{}) } func deleteCronJob(c clientset.Interface, ns, name string) error { propagationPolicy := metav1.DeletePropagationBackground // Also delete jobs and pods related to cronjob - return c.BatchV1beta1().CronJobs(ns).Delete(context.TODO(), name, metav1.DeleteOptions{PropagationPolicy: &propagationPolicy}) + return c.BatchV1().CronJobs(ns).Delete(context.TODO(), name, metav1.DeleteOptions{PropagationPolicy: &propagationPolicy}) } // Wait for at least given amount of active jobs. diff --git a/vendor/k8s.io/kubernetes/test/e2e/apps/daemon_set.go b/vendor/k8s.io/kubernetes/test/e2e/apps/daemon_set.go index 329688eb3b9b..7229829d53d8 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/apps/daemon_set.go +++ b/vendor/k8s.io/kubernetes/test/e2e/apps/daemon_set.go @@ -17,10 +17,14 @@ limitations under the License. package apps import ( + "bytes" "context" "fmt" + "math/rand" "reflect" + "sort" "strings" + "text/tabwriter" "time" "github.com/onsi/ginkgo" @@ -32,6 +36,8 @@ import ( "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/intstr" + "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/wait" clientset "k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes/scheme" @@ -482,8 +488,334 @@ var _ = SIGDescribe("Daemon set [Serial]", func() { framework.ExpectEqual(rollbackPods[pod.Name], true, fmt.Sprintf("unexpected pod %s be restarted", pod.Name)) } }) + + // TODO: This test is expected to be promoted to conformance after the feature is promoted + ginkgo.It("should surge pods onto nodes when spec was updated and update strategy is RollingUpdate [Feature:DaemonSetUpdateSurge]", func() { + label := map[string]string{daemonsetNameLabel: dsName} + + framework.Logf("Creating surge daemon set %s", dsName) + maxSurgeOverlap := 60 * time.Second + maxSurge := 1 + surgePercent := intstr.FromString("20%") + zero := intstr.FromInt(0) + oldVersion := "1" + ds := newDaemonSet(dsName, image, label) + ds.Spec.Template.Spec.Containers[0].Env = []v1.EnvVar{ + {Name: "VERSION", Value: oldVersion}, + } + // delay shutdown by 15s to allow containers to overlap in time + ds.Spec.Template.Spec.Containers[0].Lifecycle = &v1.Lifecycle{ + PreStop: &v1.Handler{ + Exec: &v1.ExecAction{ + Command: []string{"/bin/sh", "-c", "sleep 15"}, + }, + }, + } + // use a readiness probe that can be forced to fail (by changing the contents of /var/tmp/ready) + ds.Spec.Template.Spec.Containers[0].ReadinessProbe = &v1.Probe{ + Handler: v1.Handler{ + Exec: &v1.ExecAction{ + Command: []string{"/bin/sh", "-ec", `touch /var/tmp/ready; [[ "$( cat /var/tmp/ready )" == "" ]]`}, + }, + }, + InitialDelaySeconds: 7, + PeriodSeconds: 3, + SuccessThreshold: 1, + FailureThreshold: 1, + } + // use a simple surge strategy + ds.Spec.UpdateStrategy = appsv1.DaemonSetUpdateStrategy{ + Type: appsv1.RollingUpdateDaemonSetStrategyType, + RollingUpdate: &appsv1.RollingUpdateDaemonSet{ + MaxUnavailable: &zero, + MaxSurge: &surgePercent, + }, + } + // The pod must be ready for at least 10s before we delete the old pod + ds.Spec.MinReadySeconds = 10 + + ds, err := c.AppsV1().DaemonSets(ns).Create(context.TODO(), ds, metav1.CreateOptions{}) + framework.ExpectNoError(err) + + ginkgo.By("Check that daemon pods launch on every node of the cluster.") + err = wait.PollImmediate(dsRetryPeriod, dsRetryTimeout, checkRunningOnAllNodes(f, ds)) + framework.ExpectNoError(err, "error waiting for daemon pod to start") + + // Check history and labels + ds, err = c.AppsV1().DaemonSets(ns).Get(context.TODO(), ds.Name, metav1.GetOptions{}) + framework.ExpectNoError(err) + waitForHistoryCreated(c, ns, label, 1) + cur := curHistory(listDaemonHistories(c, ns, label), ds) + hash := cur.Labels[appsv1.DefaultDaemonSetUniqueLabelKey] + framework.ExpectEqual(cur.Revision, int64(1)) + checkDaemonSetPodsLabels(listDaemonPods(c, ns, label), hash) + + newVersion := "2" + ginkgo.By("Update daemon pods environment var") + patch := fmt.Sprintf(`{"spec":{"template":{"spec":{"containers":[{"name":"%s","env":[{"name":"VERSION","value":"%s"}]}]}}}}`, ds.Spec.Template.Spec.Containers[0].Name, newVersion) + ds, err = c.AppsV1().DaemonSets(ns).Patch(context.TODO(), dsName, types.StrategicMergePatchType, []byte(patch), metav1.PatchOptions{}) + framework.ExpectNoError(err) + + // Time to complete the rolling upgrade is proportional to the number of nodes in the cluster. + // Get the number of nodes, and set the timeout appropriately. + nodes, err := c.CoreV1().Nodes().List(context.TODO(), metav1.ListOptions{}) + framework.ExpectNoError(err) + nodeCount := len(nodes.Items) + retryTimeout := dsRetryTimeout + time.Duration(nodeCount*30)*time.Second + + ginkgo.By("Check that daemon pods surge and invariants are preserved during that rollout") + ageOfOldPod := make(map[string]time.Time) + deliberatelyDeletedPods := sets.NewString() + err = wait.PollImmediate(dsRetryPeriod, retryTimeout, func() (bool, error) { + podList, err := c.CoreV1().Pods(ds.Namespace).List(context.TODO(), metav1.ListOptions{}) + if err != nil { + return false, err + } + pods := podList.Items + + var buf bytes.Buffer + pw := tabwriter.NewWriter(&buf, 1, 1, 1, ' ', 0) + fmt.Fprint(pw, "Node\tVersion\tName\tUID\tDeleted\tReady\n") + + now := time.Now() + podUIDs := sets.NewString() + deletedPodUIDs := sets.NewString() + nodes := sets.NewString() + versions := sets.NewString() + nodesToVersions := make(map[string]map[string]int) + nodesToDeletedVersions := make(map[string]map[string]int) + var surgeCount, newUnavailableCount, newDeliberatelyDeletedCount, oldUnavailableCount, nodesWithoutOldVersion int + for _, pod := range pods { + if !metav1.IsControlledBy(&pod, ds) { + continue + } + nodeName := pod.Spec.NodeName + nodes.Insert(nodeName) + podVersion := pod.Spec.Containers[0].Env[0].Value + if pod.DeletionTimestamp != nil { + if !deliberatelyDeletedPods.Has(string(pod.UID)) { + versions := nodesToDeletedVersions[nodeName] + if versions == nil { + versions = make(map[string]int) + nodesToDeletedVersions[nodeName] = versions + } + versions[podVersion]++ + } + } else { + versions := nodesToVersions[nodeName] + if versions == nil { + versions = make(map[string]int) + nodesToVersions[nodeName] = versions + } + versions[podVersion]++ + } + + ready := podutil.IsPodAvailable(&pod, ds.Spec.MinReadySeconds, metav1.Now()) + if podVersion == newVersion { + surgeCount++ + if !ready || pod.DeletionTimestamp != nil { + if deliberatelyDeletedPods.Has(string(pod.UID)) { + newDeliberatelyDeletedCount++ + } + newUnavailableCount++ + } + } else { + if !ready || pod.DeletionTimestamp != nil { + oldUnavailableCount++ + } + } + fmt.Fprintf(pw, "%s\t%s\t%s\t%s\t%t\t%t\n", pod.Spec.NodeName, podVersion, pod.Name, pod.UID, pod.DeletionTimestamp != nil, ready) + } + + // print a stable sorted list of pods by node for debugging + pw.Flush() + lines := strings.Split(buf.String(), "\n") + lines = lines[:len(lines)-1] + sort.Strings(lines[1:]) + for _, line := range lines { + framework.Logf("%s", line) + } + + // if there is an old and new pod at the same time, record a timestamp + deletedPerNode := make(map[string]int) + for _, pod := range pods { + if !metav1.IsControlledBy(&pod, ds) { + continue + } + // ignore deleted pods + if pod.DeletionTimestamp != nil { + deletedPodUIDs.Insert(string(pod.UID)) + if !deliberatelyDeletedPods.Has(string(pod.UID)) { + deletedPerNode[pod.Spec.NodeName]++ + } + continue + } + podUIDs.Insert(string(pod.UID)) + podVersion := pod.Spec.Containers[0].Env[0].Value + if podVersion == newVersion { + continue + } + // if this is a pod in an older version AND there is a new version of this pod, record when + // we started seeing this, otherwise delete the record (perhaps the node was drained) + if nodesToVersions[pod.Spec.NodeName][newVersion] > 0 { + if _, ok := ageOfOldPod[string(pod.UID)]; !ok { + ageOfOldPod[string(pod.UID)] = now + } + } else { + delete(ageOfOldPod, string(pod.UID)) + } + } + // purge the old pods list of any deleted pods + for uid := range ageOfOldPod { + if !podUIDs.Has(uid) { + delete(ageOfOldPod, uid) + } + } + deliberatelyDeletedPods = deliberatelyDeletedPods.Intersection(deletedPodUIDs) + + for _, versions := range nodesToVersions { + if versions[oldVersion] == 0 { + nodesWithoutOldVersion++ + } + } + + var errs []string + + // invariant: we should not see more than 1 deleted pod per node unless a severe node problem is occurring or the controller is misbehaving + for node, count := range deletedPerNode { + if count > 1 { + errs = append(errs, fmt.Sprintf("Node %s has %d deleted pods, which may indicate a problem on the node or a controller race condition", node, count)) + } + } + + // invariant: the controller must react to the new pod becoming ready within a reasonable timeframe (2x grace period) + for uid, firstSeen := range ageOfOldPod { + if now.Sub(firstSeen) > maxSurgeOverlap { + errs = append(errs, fmt.Sprintf("An old pod with UID %s has been running alongside a newer version for longer than %s", uid, maxSurgeOverlap)) + } + } + + // invariant: we should never have more than maxSurge + oldUnavailableCount instances of the new version unready unless a flake in the infrastructure happens, or + // if we deliberately deleted one of the new pods + if newUnavailableCount > (maxSurge + oldUnavailableCount + newDeliberatelyDeletedCount + nodesWithoutOldVersion) { + errs = append(errs, fmt.Sprintf("observed %d new unavailable pods greater than (surge count %d + old unavailable count %d + deliberately deleted new count %d + nodes without old version %d), may be infrastructure flake", newUnavailableCount, maxSurge, oldUnavailableCount, newDeliberatelyDeletedCount, nodesWithoutOldVersion)) + } + // invariant: the total number of versions created should be 2 + if versions.Len() > 2 { + errs = append(errs, fmt.Sprintf("observed %d versions running simultaneously, must have max 2", versions.Len())) + } + for _, node := range nodes.List() { + // ignore pods that haven't been scheduled yet + if len(node) == 0 { + continue + } + versionCount := make(map[string]int) + // invariant: surge should never have more than one instance of a pod per node running + for version, count := range nodesToVersions[node] { + if count > 1 { + errs = append(errs, fmt.Sprintf("node %s has %d instances of version %s running simultaneously, must have max 1", node, count, version)) + } + versionCount[version] += count + } + // invariant: when surging, the most number of pods we should allow to be deleted is 2 (if we are getting evicted) + for version, count := range nodesToDeletedVersions[node] { + if count > 2 { + errs = append(errs, fmt.Sprintf("node %s has %d deleted instances of version %s running simultaneously, must have max 1", node, count, version)) + } + versionCount[version] += count + } + // invariant: on any node, we should never have more than two instances of a version (if we are getting evicted) + for version, count := range versionCount { + if count > 2 { + errs = append(errs, fmt.Sprintf("node %s has %d total instances of version %s running simultaneously, must have max 2 (one deleted and one running)", node, count, version)) + } + } + } + + if len(errs) > 0 { + sort.Strings(errs) + return false, fmt.Errorf("invariants were violated during daemonset update:\n%s", strings.Join(errs, "\n")) + } + + // Make sure every daemon pod on the node has been updated + nodeNames := schedulableNodes(c, ds) + for _, node := range nodeNames { + switch { + case + // if we don't have the new version yet + nodesToVersions[node][newVersion] == 0, + // if there are more than one version on a node + len(nodesToVersions[node]) > 1, + // if there are still any deleted pods + len(nodesToDeletedVersions[node]) > 0, + // if any of the new pods are unavailable + newUnavailableCount > 0: + + // inject a failure randomly to ensure the controller recovers + switch rand.Intn(25) { + // cause a random old pod to go unready + case 0: + // select a not-deleted pod of the old version + if pod := randomPod(pods, func(pod *v1.Pod) bool { + return pod.DeletionTimestamp == nil && oldVersion == pod.Spec.Containers[0].Env[0].Value + }); pod != nil { + // make the /tmp/ready file read only, which will cause readiness to fail + if _, err := framework.RunKubectl(pod.Namespace, "exec", "-c", pod.Spec.Containers[0].Name, pod.Name, "--", "/bin/sh", "-ec", "echo 0 > /var/tmp/ready"); err != nil { + framework.Logf("Failed to mark pod %s as unready via exec: %v", pod.Name, err) + } else { + framework.Logf("Marked old pod %s as unready", pod.Name) + } + } + case 1: + // delete a random pod + if pod := randomPod(pods, func(pod *v1.Pod) bool { + return pod.DeletionTimestamp == nil + }); pod != nil { + if err := c.CoreV1().Pods(ds.Namespace).Delete(context.TODO(), pod.Name, metav1.DeleteOptions{}); err != nil { + framework.Logf("Failed to delete pod %s early: %v", pod.Name, err) + } else { + framework.Logf("Deleted pod %s prematurely", pod.Name) + deliberatelyDeletedPods.Insert(string(pod.UID)) + } + } + } + + // then wait + return false, nil + } + } + return true, nil + }) + framework.ExpectNoError(err) + + ginkgo.By("Check that daemon pods are still running on every node of the cluster.") + err = wait.PollImmediate(dsRetryPeriod, dsRetryTimeout, checkRunningOnAllNodes(f, ds)) + framework.ExpectNoError(err, "error waiting for daemon pod to start") + + // Check history and labels + ds, err = c.AppsV1().DaemonSets(ns).Get(context.TODO(), ds.Name, metav1.GetOptions{}) + framework.ExpectNoError(err) + waitForHistoryCreated(c, ns, label, 2) + cur = curHistory(listDaemonHistories(c, ns, label), ds) + hash = cur.Labels[appsv1.DefaultDaemonSetUniqueLabelKey] + framework.ExpectEqual(cur.Revision, int64(2)) + checkDaemonSetPodsLabels(listDaemonPods(c, ns, label), hash) + }) }) +// randomPod selects a random pod within pods that causes fn to return true, or nil +// if no pod can be found matching the criteria. +func randomPod(pods []v1.Pod, fn func(p *v1.Pod) bool) *v1.Pod { + podCount := len(pods) + for offset, i := rand.Intn(podCount), 0; i < (podCount - 1); i++ { + pod := &pods[(offset+i)%podCount] + if fn(pod) { + return pod + } + } + return nil +} + // getDaemonSetImagePatch generates a patch for updating a DaemonSet's container image func getDaemonSetImagePatch(containerName, containerImage string) string { return fmt.Sprintf(`{"spec":{"template":{"spec":{"containers":[{"name":"%s","image":"%s"}]}}}}`, containerName, containerImage) @@ -718,6 +1050,10 @@ func checkDaemonPodsImageAndAvailability(c clientset.Interface, ds *appsv1.Daemo unavailablePods := 0 nodesToUpdatedPodCount := make(map[string]int) for _, pod := range pods { + // Ignore the pod on the node that is supposed to be deleted + if pod.DeletionTimestamp != nil { + continue + } if !metav1.IsControlledBy(&pod, ds) { continue } @@ -748,10 +1084,14 @@ func checkDaemonPodsImageAndAvailability(c clientset.Interface, ds *appsv1.Daemo func checkDaemonSetPodsLabels(podList *v1.PodList, hash string) { for _, pod := range podList.Items { + // Ignore all the DS pods that will be deleted + if pod.DeletionTimestamp != nil { + continue + } podHash := pod.Labels[appsv1.DefaultDaemonSetUniqueLabelKey] gomega.Expect(len(podHash)).To(gomega.BeNumerically(">", 0)) if len(hash) > 0 { - framework.ExpectEqual(podHash, hash) + framework.ExpectEqual(podHash, hash, "unexpected hash for pod %s", pod.Name) } } } diff --git a/vendor/k8s.io/kubernetes/test/e2e/apps/deployment.go b/vendor/k8s.io/kubernetes/test/e2e/apps/deployment.go index f8d8ac0ac614..d26f2a114ed0 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/apps/deployment.go +++ b/vendor/k8s.io/kubernetes/test/e2e/apps/deployment.go @@ -18,6 +18,7 @@ package apps import ( "context" + "encoding/json" "fmt" "math/rand" "time" @@ -28,8 +29,8 @@ import ( "k8s.io/apimachinery/pkg/fields" "k8s.io/client-go/tools/cache" - "encoding/json" appsv1 "k8s.io/api/apps/v1" + autoscalingv1 "k8s.io/api/autoscaling/v1" //Added new v1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -132,6 +133,18 @@ var _ = SIGDescribe("Deployment", func() { ginkgo.It("test Deployment ReplicaSet orphaning and adoption regarding controllerRef", func() { testDeploymentsControllerRef(f) }) + + /* + Release: v1.21 + Testname: Deployment, completes the scaling of a Deployment subresource + Description: Create a Deployment with a single Pod. The Pod MUST be verified + that it is running. The Deployment MUST get and verify the scale subresource count. + The Deployment MUST update and verify the scale subresource. The Deployment MUST patch and verify + a scale subresource. + */ + framework.ConformanceIt("Deployment should have a working scale subresource", func() { + testDeploymentSubresources(f) + }) /* Release: v1.12 Testname: Deployment Proportional Scaling @@ -151,6 +164,9 @@ var _ = SIGDescribe("Deployment", func() { }) // TODO: add tests that cover deployment.Spec.MinReadySeconds once we solved clock-skew issues // See https://github.com/kubernetes/kubernetes/issues/29229 + // Add UnavailableReplicas check because ReadyReplicas or UpdatedReplicas might not represent + // the actual number of pods running successfully if some pods failed to start after update or patch. + // See issue ##100192 /* Release: v1.20 @@ -258,9 +274,8 @@ var _ = SIGDescribe("Deployment", func() { "spec": map[string]interface{}{ "TerminationGracePeriodSeconds": &zero, "containers": [1]map[string]interface{}{{ - "name": testDeploymentName, - "image": testDeploymentPatchImage, - "command": []string{"/bin/sleep", "100000"}, + "name": testDeploymentName, + "image": testDeploymentPatchImage, }}, }, }, @@ -297,6 +312,8 @@ var _ = SIGDescribe("Deployment", func() { found := deployment.ObjectMeta.Name == testDeployment.Name && deployment.ObjectMeta.Labels["test-deployment-static"] == "true" && deployment.Status.ReadyReplicas == testDeploymentMinimumReplicas && + deployment.Status.UpdatedReplicas == testDeploymentMinimumReplicas && + deployment.Status.UnavailableReplicas == 0 && deployment.Spec.Template.Spec.Containers[0].Image == testDeploymentPatchImage if !found { framework.Logf("observed Deployment %v in namespace %v with ReadyReplicas %v", deployment.ObjectMeta.Name, deployment.ObjectMeta.Namespace, deployment.Status.ReadyReplicas) @@ -373,7 +390,9 @@ var _ = SIGDescribe("Deployment", func() { if deployment, ok := event.Object.(*appsv1.Deployment); ok { found := deployment.ObjectMeta.Name == testDeployment.Name && deployment.ObjectMeta.Labels["test-deployment-static"] == "true" && - deployment.Status.ReadyReplicas == testDeploymentDefaultReplicas + deployment.Status.ReadyReplicas == testDeploymentDefaultReplicas && + deployment.Status.UpdatedReplicas == testDeploymentDefaultReplicas && + deployment.Status.UnavailableReplicas == 0 if !found { framework.Logf("observed Deployment %v in namespace %v with ReadyReplicas %v and labels %v", deployment.ObjectMeta.Name, deployment.ObjectMeta.Namespace, deployment.Status.ReadyReplicas, deployment.ObjectMeta.Labels) } @@ -426,6 +445,8 @@ var _ = SIGDescribe("Deployment", func() { found := deployment.ObjectMeta.Name == testDeployment.Name && deployment.ObjectMeta.Labels["test-deployment-static"] == "true" && deployment.Status.ReadyReplicas == testDeploymentDefaultReplicas && + deployment.Status.UpdatedReplicas == testDeploymentDefaultReplicas && + deployment.Status.UnavailableReplicas == 0 && deployment.Spec.Template.Spec.Containers[0].Image == testDeploymentUpdateImage if !found { framework.Logf("observed Deployment %v in namespace %v with ReadyReplicas %v", deployment.ObjectMeta.Name, deployment.ObjectMeta.Namespace, deployment.Status.ReadyReplicas) @@ -1476,3 +1497,66 @@ func waitForDeploymentCompleteAndCheckRolling(c clientset.Interface, d *appsv1.D func waitForDeploymentUpdatedReplicasGTE(c clientset.Interface, ns, deploymentName string, minUpdatedReplicas int32, desiredGeneration int64) error { return testutil.WaitForDeploymentUpdatedReplicasGTE(c, ns, deploymentName, minUpdatedReplicas, desiredGeneration, poll, pollLongTimeout) } + +// Deployment should have a working scale subresource +func testDeploymentSubresources(f *framework.Framework) { + ns := f.Namespace.Name + c := f.ClientSet + + deploymentName := "test-new-deployment" + framework.Logf("Creating simple deployment %s", deploymentName) + d := e2edeployment.NewDeployment("test-new-deployment", int32(1), map[string]string{"name": WebserverImageName}, WebserverImageName, WebserverImage, appsv1.RollingUpdateDeploymentStrategyType) + deploy, err := c.AppsV1().Deployments(ns).Create(context.TODO(), d, metav1.CreateOptions{}) + framework.ExpectNoError(err) + + // Wait for it to be updated to revision 1 + err = e2edeployment.WaitForDeploymentRevisionAndImage(c, ns, deploymentName, "1", WebserverImage) + framework.ExpectNoError(err) + + err = e2edeployment.WaitForDeploymentComplete(c, deploy) + framework.ExpectNoError(err) + + _, err = c.AppsV1().Deployments(ns).Get(context.TODO(), deploymentName, metav1.GetOptions{}) + framework.ExpectNoError(err) + + ginkgo.By("getting scale subresource") + scale, err := c.AppsV1().Deployments(ns).GetScale(context.TODO(), deploymentName, metav1.GetOptions{}) + if err != nil { + framework.Failf("Failed to get scale subresource: %v", err) + } + framework.ExpectEqual(scale.Spec.Replicas, int32(1)) + framework.ExpectEqual(scale.Status.Replicas, int32(1)) + + ginkgo.By("updating a scale subresource") + scale.ResourceVersion = "" // indicate the scale update should be unconditional + scale.Spec.Replicas = 2 + scaleResult, err := c.AppsV1().Deployments(ns).UpdateScale(context.TODO(), deploymentName, scale, metav1.UpdateOptions{}) + if err != nil { + framework.Failf("Failed to put scale subresource: %v", err) + } + framework.ExpectEqual(scaleResult.Spec.Replicas, int32(2)) + + ginkgo.By("verifying the deployment Spec.Replicas was modified") + deployment, err := c.AppsV1().Deployments(ns).Get(context.TODO(), deploymentName, metav1.GetOptions{}) + if err != nil { + framework.Failf("Failed to get deployment resource: %v", err) + } + framework.ExpectEqual(*(deployment.Spec.Replicas), int32(2)) + + ginkgo.By("Patch a scale subresource") + scale.ResourceVersion = "" // indicate the scale update should be unconditional + scale.Spec.Replicas = 4 // should be 2 after "UpdateScale" operation, now Patch to 4 + deploymentScalePatchPayload, err := json.Marshal(autoscalingv1.Scale{ + Spec: autoscalingv1.ScaleSpec{ + Replicas: scale.Spec.Replicas, + }, + }) + framework.ExpectNoError(err, "Could not Marshal JSON for patch payload") + + _, err = c.AppsV1().Deployments(ns).Patch(context.TODO(), deploymentName, types.StrategicMergePatchType, []byte(deploymentScalePatchPayload), metav1.PatchOptions{}, "scale") + framework.ExpectNoError(err, "Failed to patch deployment: %v", err) + + deployment, err = c.AppsV1().Deployments(ns).Get(context.TODO(), deploymentName, metav1.GetOptions{}) + framework.ExpectNoError(err, "Failed to get deployment resource: %v", err) + framework.ExpectEqual(*(deployment.Spec.Replicas), int32(4), "deployment should have 4 replicas") +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/apps/disruption.go b/vendor/k8s.io/kubernetes/test/e2e/apps/disruption.go index 235b485ecb46..4566f77b6c1f 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/apps/disruption.go +++ b/vendor/k8s.io/kubernetes/test/e2e/apps/disruption.go @@ -27,6 +27,7 @@ import ( appsv1 "k8s.io/api/apps/v1" v1 "k8s.io/api/core/v1" + policyv1 "k8s.io/api/policy/v1" policyv1beta1 "k8s.io/api/policy/v1beta1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -74,7 +75,12 @@ var _ = SIGDescribe("DisruptionController", func() { ginkgo.Context("Listing PodDisruptionBudgets for all namespaces", func() { anotherFramework := framework.NewDefaultFramework("disruption-2") - ginkgo.It("should list and delete a collection of PodDisruptionBudgets", func() { + /* + Release : v1.21 + Testname: PodDisruptionBudget: list and delete collection + Description: PodDisruptionBudget API must support list and deletecollection operations. + */ + framework.ConformanceIt("should list and delete a collection of PodDisruptionBudgets", func() { specialLabels := map[string]string{"foo_pdb": "bar_pdb"} labelSelector := labels.SelectorFromSet(specialLabels).String() createPDBMinAvailableOrDie(cs, ns, defaultName, intstr.FromInt(2), specialLabels) @@ -90,11 +96,45 @@ var _ = SIGDescribe("DisruptionController", func() { }) }) - ginkgo.It("should create a PodDisruptionBudget", func() { + /* + Release : v1.21 + Testname: PodDisruptionBudget: create, update, patch, and delete object + Description: PodDisruptionBudget API must support create, update, patch, and delete operations. + */ + framework.ConformanceIt("should create a PodDisruptionBudget", func() { + ginkgo.By("creating the pdb") createPDBMinAvailableOrDie(cs, ns, defaultName, intstr.FromString("1%"), defaultLabels) + + ginkgo.By("updating the pdb") + updatedPDB := updatePDBOrDie(cs, ns, defaultName, func(pdb *policyv1.PodDisruptionBudget) *policyv1.PodDisruptionBudget { + newMinAvailable := intstr.FromString("2%") + pdb.Spec.MinAvailable = &newMinAvailable + return pdb + }, cs.PolicyV1().PodDisruptionBudgets(ns).Update) + framework.ExpectEqual(updatedPDB.Spec.MinAvailable.String(), "2%") + + ginkgo.By("patching the pdb") + patchedPDB := patchPDBOrDie(cs, dc, ns, defaultName, func(old *policyv1.PodDisruptionBudget) (bytes []byte, err error) { + newBytes, err := json.Marshal(map[string]interface{}{ + "spec": map[string]interface{}{ + "minAvailable": "3%", + }, + }) + framework.ExpectNoError(err, "failed to marshal JSON for new data") + return newBytes, nil + }) + framework.ExpectEqual(patchedPDB.Spec.MinAvailable.String(), "3%") + + deletePDBOrDie(cs, ns, defaultName) }) - ginkgo.It("should observe PodDisruptionBudget status updated", func() { + /* + Release : v1.21 + Testname: PodDisruptionBudget: Status updates + Description: Disruption controller MUST update the PDB status with + how many disruptions are allowed. + */ + framework.ConformanceIt("should observe PodDisruptionBudget status updated", func() { createPDBMinAvailableOrDie(cs, ns, defaultName, intstr.FromInt(1), defaultLabels) createPodsOrDie(cs, ns, 3) @@ -103,7 +143,7 @@ var _ = SIGDescribe("DisruptionController", func() { // Since disruptionAllowed starts out 0, if we see it ever become positive, // that means the controller is working. err := wait.PollImmediate(framework.Poll, timeout, func() (bool, error) { - pdb, err := cs.PolicyV1beta1().PodDisruptionBudgets(ns).Get(context.TODO(), defaultName, metav1.GetOptions{}) + pdb, err := cs.PolicyV1().PodDisruptionBudgets(ns).Get(context.TODO(), defaultName, metav1.GetOptions{}) if err != nil { return false, err } @@ -112,7 +152,12 @@ var _ = SIGDescribe("DisruptionController", func() { framework.ExpectNoError(err) }) - ginkgo.It("should update/patch PodDisruptionBudget status", func() { + /* + Release : v1.21 + Testname: PodDisruptionBudget: update and patch status + Description: PodDisruptionBudget API must support update and patch operations on status subresource. + */ + framework.ConformanceIt("should update/patch PodDisruptionBudget status", func() { createPDBMinAvailableOrDie(cs, ns, defaultName, intstr.FromInt(1), defaultLabels) ginkgo.By("Updating PodDisruptionBudget status") @@ -121,17 +166,17 @@ var _ = SIGDescribe("DisruptionController", func() { createPodsOrDie(cs, ns, 1) waitForPodsOrDie(cs, ns, 1) pod, _ := locateRunningPod(cs, ns) - updatePDBOrDie(cs, ns, defaultName, func(old *policyv1beta1.PodDisruptionBudget) *policyv1beta1.PodDisruptionBudget { + updatePDBOrDie(cs, ns, defaultName, func(old *policyv1.PodDisruptionBudget) *policyv1.PodDisruptionBudget { old.Status.DisruptedPods = make(map[string]metav1.Time) old.Status.DisruptedPods[pod.Name] = metav1.NewTime(time.Now()) return old - }, cs.PolicyV1beta1().PodDisruptionBudgets(ns).UpdateStatus) + }, cs.PolicyV1().PodDisruptionBudgets(ns).UpdateStatus) // fetch again to make sure the update from API was effective updated := getPDBStatusOrDie(dc, ns, defaultName) framework.ExpectHaveKey(updated.Status.DisruptedPods, pod.Name, "Expecting the DisruptedPods have %s", pod.Name) ginkgo.By("Patching PodDisruptionBudget status") - patched := patchPDBOrDie(cs, dc, ns, defaultName, func(old *policyv1beta1.PodDisruptionBudget) (bytes []byte, err error) { + patched := patchPDBOrDie(cs, dc, ns, defaultName, func(old *policyv1.PodDisruptionBudget) (bytes []byte, err error) { oldBytes, err := json.Marshal(old) framework.ExpectNoError(err, "failed to marshal JSON for old data") old.Status.DisruptedPods = make(map[string]metav1.Time) @@ -290,11 +335,11 @@ var _ = SIGDescribe("DisruptionController", func() { gomega.Expect(err).Should(gomega.MatchError("Cannot evict pod as it would violate the pod's disruption budget.")) ginkgo.By("Updating the pdb to allow a pod to be evicted") - updatePDBOrDie(cs, ns, defaultName, func(pdb *policyv1beta1.PodDisruptionBudget) *policyv1beta1.PodDisruptionBudget { + updatePDBOrDie(cs, ns, defaultName, func(pdb *policyv1.PodDisruptionBudget) *policyv1.PodDisruptionBudget { newMinAvailable := intstr.FromInt(2) pdb.Spec.MinAvailable = &newMinAvailable return pdb - }, cs.PolicyV1beta1().PodDisruptionBudgets(ns).Update) + }, cs.PolicyV1().PodDisruptionBudgets(ns).Update) ginkgo.By("Trying to evict the same pod we tried earlier which should now be evictable") waitForPodsOrDie(cs, ns, 3) @@ -303,7 +348,7 @@ var _ = SIGDescribe("DisruptionController", func() { framework.ExpectNoError(err) // the eviction is now allowed ginkgo.By("Patching the pdb to disallow a pod to be evicted") - patchPDBOrDie(cs, dc, ns, defaultName, func(old *policyv1beta1.PodDisruptionBudget) (bytes []byte, err error) { + patchPDBOrDie(cs, dc, ns, defaultName, func(old *policyv1.PodDisruptionBudget) (bytes []byte, err error) { oldData, err := json.Marshal(old) framework.ExpectNoError(err, "failed to marshal JSON for old data") old.Spec.MinAvailable = nil @@ -338,45 +383,45 @@ var _ = SIGDescribe("DisruptionController", func() { }) func createPDBMinAvailableOrDie(cs kubernetes.Interface, ns string, name string, minAvailable intstr.IntOrString, labels map[string]string) { - pdb := policyv1beta1.PodDisruptionBudget{ + pdb := policyv1.PodDisruptionBudget{ ObjectMeta: metav1.ObjectMeta{ Name: name, Namespace: ns, Labels: labels, }, - Spec: policyv1beta1.PodDisruptionBudgetSpec{ + Spec: policyv1.PodDisruptionBudgetSpec{ Selector: &metav1.LabelSelector{MatchLabels: map[string]string{"foo": "bar"}}, MinAvailable: &minAvailable, }, } - _, err := cs.PolicyV1beta1().PodDisruptionBudgets(ns).Create(context.TODO(), &pdb, metav1.CreateOptions{}) + _, err := cs.PolicyV1().PodDisruptionBudgets(ns).Create(context.TODO(), &pdb, metav1.CreateOptions{}) framework.ExpectNoError(err, "Waiting for the pdb to be created with minAvailable %d in namespace %s", minAvailable.IntVal, ns) waitForPdbToBeProcessed(cs, ns, name) } func createPDBMaxUnavailableOrDie(cs kubernetes.Interface, ns string, name string, maxUnavailable intstr.IntOrString) { - pdb := policyv1beta1.PodDisruptionBudget{ + pdb := policyv1.PodDisruptionBudget{ ObjectMeta: metav1.ObjectMeta{ Name: name, Namespace: ns, }, - Spec: policyv1beta1.PodDisruptionBudgetSpec{ + Spec: policyv1.PodDisruptionBudgetSpec{ Selector: &metav1.LabelSelector{MatchLabels: map[string]string{"foo": "bar"}}, MaxUnavailable: &maxUnavailable, }, } - _, err := cs.PolicyV1beta1().PodDisruptionBudgets(ns).Create(context.TODO(), &pdb, metav1.CreateOptions{}) + _, err := cs.PolicyV1().PodDisruptionBudgets(ns).Create(context.TODO(), &pdb, metav1.CreateOptions{}) framework.ExpectNoError(err, "Waiting for the pdb to be created with maxUnavailable %d in namespace %s", maxUnavailable.IntVal, ns) waitForPdbToBeProcessed(cs, ns, name) } -type updateFunc func(pdb *policyv1beta1.PodDisruptionBudget) *policyv1beta1.PodDisruptionBudget -type updateRestAPI func(ctx context.Context, podDisruptionBudget *policyv1beta1.PodDisruptionBudget, opts metav1.UpdateOptions) (*policyv1beta1.PodDisruptionBudget, error) -type patchFunc func(pdb *policyv1beta1.PodDisruptionBudget) ([]byte, error) +type updateFunc func(pdb *policyv1.PodDisruptionBudget) *policyv1.PodDisruptionBudget +type updateRestAPI func(ctx context.Context, podDisruptionBudget *policyv1.PodDisruptionBudget, opts metav1.UpdateOptions) (*policyv1.PodDisruptionBudget, error) +type patchFunc func(pdb *policyv1.PodDisruptionBudget) ([]byte, error) -func updatePDBOrDie(cs kubernetes.Interface, ns string, name string, f updateFunc, api updateRestAPI) (updated *policyv1beta1.PodDisruptionBudget) { +func updatePDBOrDie(cs kubernetes.Interface, ns string, name string, f updateFunc, api updateRestAPI) (updated *policyv1.PodDisruptionBudget) { err := retry.RetryOnConflict(retry.DefaultRetry, func() error { - old, err := cs.PolicyV1beta1().PodDisruptionBudgets(ns).Get(context.TODO(), name, metav1.GetOptions{}) + old, err := cs.PolicyV1().PodDisruptionBudgets(ns).Get(context.TODO(), name, metav1.GetOptions{}) if err != nil { return err } @@ -392,12 +437,12 @@ func updatePDBOrDie(cs kubernetes.Interface, ns string, name string, f updateFun return updated } -func patchPDBOrDie(cs kubernetes.Interface, dc dynamic.Interface, ns string, name string, f patchFunc, subresources ...string) (updated *policyv1beta1.PodDisruptionBudget) { +func patchPDBOrDie(cs kubernetes.Interface, dc dynamic.Interface, ns string, name string, f patchFunc, subresources ...string) (updated *policyv1.PodDisruptionBudget) { err := retry.RetryOnConflict(retry.DefaultRetry, func() error { old := getPDBStatusOrDie(dc, ns, name) patchBytes, err := f(old) framework.ExpectNoError(err) - if updated, err = cs.PolicyV1beta1().PodDisruptionBudgets(ns).Patch(context.TODO(), old.Name, types.MergePatchType, patchBytes, metav1.PatchOptions{}, subresources...); err != nil { + if updated, err = cs.PolicyV1().PodDisruptionBudgets(ns).Patch(context.TODO(), old.Name, types.MergePatchType, patchBytes, metav1.PatchOptions{}, subresources...); err != nil { return err } framework.ExpectNoError(err) @@ -410,13 +455,13 @@ func patchPDBOrDie(cs kubernetes.Interface, dc dynamic.Interface, ns string, nam } func deletePDBOrDie(cs kubernetes.Interface, ns string, name string) { - err := cs.PolicyV1beta1().PodDisruptionBudgets(ns).Delete(context.TODO(), name, metav1.DeleteOptions{}) + err := cs.PolicyV1().PodDisruptionBudgets(ns).Delete(context.TODO(), name, metav1.DeleteOptions{}) framework.ExpectNoError(err, "Deleting pdb in namespace %s", ns) waitForPdbToBeDeleted(cs, ns, name) } func listPDBs(cs kubernetes.Interface, ns string, labelSelector string, count int, expectedPDBNames []string) { - pdbList, err := cs.PolicyV1beta1().PodDisruptionBudgets(ns).List(context.TODO(), metav1.ListOptions{LabelSelector: labelSelector}) + pdbList, err := cs.PolicyV1().PodDisruptionBudgets(ns).List(context.TODO(), metav1.ListOptions{LabelSelector: labelSelector}) framework.ExpectNoError(err, "Listing PDB set in namespace %s", ns) framework.ExpectEqual(len(pdbList.Items), count, "Expecting %d PDBs returned in namespace %s", count, ns) @@ -429,7 +474,7 @@ func listPDBs(cs kubernetes.Interface, ns string, labelSelector string, count in func deletePDBCollection(cs kubernetes.Interface, ns string) { ginkgo.By("deleting a collection of PDBs") - err := cs.PolicyV1beta1().PodDisruptionBudgets(ns).DeleteCollection(context.TODO(), metav1.DeleteOptions{}, metav1.ListOptions{}) + err := cs.PolicyV1().PodDisruptionBudgets(ns).DeleteCollection(context.TODO(), metav1.DeleteOptions{}, metav1.ListOptions{}) framework.ExpectNoError(err, "Deleting PDB set in namespace %s", ns) waitForPDBCollectionToBeDeleted(cs, ns) @@ -438,7 +483,7 @@ func deletePDBCollection(cs kubernetes.Interface, ns string) { func waitForPDBCollectionToBeDeleted(cs kubernetes.Interface, ns string) { ginkgo.By("Waiting for the PDB collection to be deleted") err := wait.PollImmediate(framework.Poll, schedulingTimeout, func() (bool, error) { - pdbList, err := cs.PolicyV1beta1().PodDisruptionBudgets(ns).List(context.TODO(), metav1.ListOptions{}) + pdbList, err := cs.PolicyV1().PodDisruptionBudgets(ns).List(context.TODO(), metav1.ListOptions{}) if err != nil { return false, err } @@ -564,7 +609,7 @@ func locateRunningPod(cs kubernetes.Interface, ns string) (pod *v1.Pod, err erro func waitForPdbToBeProcessed(cs kubernetes.Interface, ns string, name string) { ginkgo.By("Waiting for the pdb to be processed") err := wait.PollImmediate(framework.Poll, schedulingTimeout, func() (bool, error) { - pdb, err := cs.PolicyV1beta1().PodDisruptionBudgets(ns).Get(context.TODO(), name, metav1.GetOptions{}) + pdb, err := cs.PolicyV1().PodDisruptionBudgets(ns).Get(context.TODO(), name, metav1.GetOptions{}) if err != nil { return false, err } @@ -579,7 +624,7 @@ func waitForPdbToBeProcessed(cs kubernetes.Interface, ns string, name string) { func waitForPdbToBeDeleted(cs kubernetes.Interface, ns string, name string) { ginkgo.By("Waiting for the pdb to be deleted") err := wait.PollImmediate(framework.Poll, schedulingTimeout, func() (bool, error) { - _, err := cs.PolicyV1beta1().PodDisruptionBudgets(ns).Get(context.TODO(), name, metav1.GetOptions{}) + _, err := cs.PolicyV1().PodDisruptionBudgets(ns).Get(context.TODO(), name, metav1.GetOptions{}) if apierrors.IsNotFound(err) { return true, nil // done } @@ -594,7 +639,7 @@ func waitForPdbToBeDeleted(cs kubernetes.Interface, ns string, name string) { func waitForPdbToObserveHealthyPods(cs kubernetes.Interface, ns string, healthyCount int32) { ginkgo.By("Waiting for the pdb to observed all healthy pods") err := wait.PollImmediate(framework.Poll, wait.ForeverTestTimeout, func() (bool, error) { - pdb, err := cs.PolicyV1beta1().PodDisruptionBudgets(ns).Get(context.TODO(), "foo", metav1.GetOptions{}) + pdb, err := cs.PolicyV1().PodDisruptionBudgets(ns).Get(context.TODO(), "foo", metav1.GetOptions{}) if err != nil { return false, err } @@ -606,8 +651,8 @@ func waitForPdbToObserveHealthyPods(cs kubernetes.Interface, ns string, healthyC framework.ExpectNoError(err, "Waiting for the pdb in namespace %s to observed %d healthy pods", ns, healthyCount) } -func getPDBStatusOrDie(dc dynamic.Interface, ns string, name string) *policyv1beta1.PodDisruptionBudget { - pdbStatusResource := policyv1beta1.SchemeGroupVersion.WithResource("poddisruptionbudgets") +func getPDBStatusOrDie(dc dynamic.Interface, ns string, name string) *policyv1.PodDisruptionBudget { + pdbStatusResource := policyv1.SchemeGroupVersion.WithResource("poddisruptionbudgets") unstruct, err := dc.Resource(pdbStatusResource).Namespace(ns).Get(context.TODO(), name, metav1.GetOptions{}, "status") framework.ExpectNoError(err) pdb, err := unstructuredToPDB(unstruct) @@ -615,12 +660,12 @@ func getPDBStatusOrDie(dc dynamic.Interface, ns string, name string) *policyv1be return pdb } -func unstructuredToPDB(obj *unstructured.Unstructured) (*policyv1beta1.PodDisruptionBudget, error) { +func unstructuredToPDB(obj *unstructured.Unstructured) (*policyv1.PodDisruptionBudget, error) { json, err := runtime.Encode(unstructured.UnstructuredJSONScheme, obj) if err != nil { return nil, err } - pdb := &policyv1beta1.PodDisruptionBudget{} + pdb := &policyv1.PodDisruptionBudget{} err = runtime.DecodeInto(clientscheme.Codecs.LegacyCodec(v1.SchemeGroupVersion), json, pdb) pdb.Kind = "" pdb.APIVersion = "" diff --git a/vendor/k8s.io/kubernetes/test/e2e/apps/job.go b/vendor/k8s.io/kubernetes/test/e2e/apps/job.go index 352da6907b11..d5468945bfb2 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/apps/job.go +++ b/vendor/k8s.io/kubernetes/test/e2e/apps/job.go @@ -19,12 +19,14 @@ package apps import ( "context" "fmt" + "strconv" "time" batchv1 "k8s.io/api/batch/v1" v1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/wait" clientset "k8s.io/client-go/kubernetes" batchinternal "k8s.io/kubernetes/pkg/apis/batch" @@ -33,6 +35,7 @@ import ( e2enode "k8s.io/kubernetes/test/e2e/framework/node" e2epod "k8s.io/kubernetes/test/e2e/framework/pod" e2eresource "k8s.io/kubernetes/test/e2e/framework/resource" + "k8s.io/utils/pointer" "github.com/onsi/ginkgo" "github.com/onsi/gomega" @@ -67,6 +70,117 @@ var _ = SIGDescribe("Job", func() { framework.ExpectEqual(successes, completions, "epected %d successful job pods, but got %d", completions, successes) }) + // Requires the alpha level feature gate SuspendJob. This e2e test will not + // pass without the following flag being passed to kubetest: + // --test_args="--feature-gates=SuspendJob=true" + ginkgo.It("[Feature:SuspendJob] should not create pods when created in suspend state", func() { + ginkgo.By("Creating a job with suspend=true") + job := e2ejob.NewTestJob("succeed", "suspend-true-to-false", v1.RestartPolicyNever, parallelism, completions, nil, backoffLimit) + job.Spec.Suspend = pointer.BoolPtr(true) + job, err := e2ejob.CreateJob(f.ClientSet, f.Namespace.Name, job) + framework.ExpectNoError(err, "failed to create job in namespace: %s", f.Namespace.Name) + + ginkgo.By("Ensuring pods aren't created for job") + framework.ExpectEqual(wait.Poll(framework.Poll, wait.ForeverTestTimeout, func() (bool, error) { + pods, err := e2ejob.GetJobPods(f.ClientSet, f.Namespace.Name, job.Name) + if err != nil { + return false, err + } + return len(pods.Items) > 0, nil + }), wait.ErrWaitTimeout) + + ginkgo.By("Checking Job status to observe Suspended state") + job, err = e2ejob.GetJob(f.ClientSet, f.Namespace.Name, job.Name) + framework.ExpectNoError(err, "failed to retrieve latest job object") + exists := false + for _, c := range job.Status.Conditions { + if c.Type == batchv1.JobSuspended { + exists = true + break + } + } + framework.ExpectEqual(exists, true) + + ginkgo.By("Updating the job with suspend=false") + job.Spec.Suspend = pointer.BoolPtr(false) + job, err = e2ejob.UpdateJob(f.ClientSet, f.Namespace.Name, job) + framework.ExpectNoError(err, "failed to update job in namespace: %s", f.Namespace.Name) + + ginkgo.By("Waiting for job to complete") + err = e2ejob.WaitForJobComplete(f.ClientSet, f.Namespace.Name, job.Name, completions) + framework.ExpectNoError(err, "failed to ensure job completion in namespace: %s", f.Namespace.Name) + }) + + // Requires the alpha level feature gate SuspendJob. This e2e test will not + // pass without the following flag being passed to kubetest: + // --test_args="--feature-gates=SuspendJob=true" + ginkgo.It("[Feature:SuspendJob] should delete pods when suspended", func() { + ginkgo.By("Creating a job with suspend=false") + job := e2ejob.NewTestJob("notTerminate", "suspend-false-to-true", v1.RestartPolicyNever, parallelism, completions, nil, backoffLimit) + job.Spec.Suspend = pointer.BoolPtr(false) + job, err := e2ejob.CreateJob(f.ClientSet, f.Namespace.Name, job) + framework.ExpectNoError(err, "failed to create job in namespace: %s", f.Namespace.Name) + + ginkgo.By("Ensure pods equal to paralellism count is attached to the job") + err = e2ejob.WaitForAllJobPodsRunning(f.ClientSet, f.Namespace.Name, job.Name, parallelism) + framework.ExpectNoError(err, "failed to ensure number of pods associated with job %s is equal to parallelism count in namespace: %s", job.Name, f.Namespace.Name) + + ginkgo.By("Updating the job with suspend=true") + job, err = e2ejob.GetJob(f.ClientSet, f.Namespace.Name, job.Name) + framework.ExpectNoError(err, "failed to retrieve latest job object") + job.Spec.Suspend = pointer.BoolPtr(true) + job, err = e2ejob.UpdateJob(f.ClientSet, f.Namespace.Name, job) + framework.ExpectNoError(err, "failed to update job in namespace: %s", f.Namespace.Name) + + ginkgo.By("Ensuring pods are deleted") + err = e2ejob.WaitForAllJobPodsGone(f.ClientSet, f.Namespace.Name, job.Name) + framework.ExpectNoError(err, "failed to ensure pods are deleted after suspend=true") + + ginkgo.By("Checking Job status to observe Suspended state") + job, err = e2ejob.GetJob(f.ClientSet, f.Namespace.Name, job.Name) + framework.ExpectNoError(err, "failed to retrieve latest job object") + exists := false + for _, c := range job.Status.Conditions { + if c.Type == batchv1.JobSuspended { + exists = true + break + } + } + framework.ExpectEqual(exists, true) + }) + + /* + Testcase: Ensure Pods of an Indexed Job get a unique index. + Description: Create an Indexed Job, wait for completion, capture the output of the pods and verify that they contain the completion index. + */ + ginkgo.It("[Feature:IndexedJob] should create pods for an Indexed job with completion indexes", func() { + ginkgo.By("Creating Indexed job") + job := e2ejob.NewTestJob("succeed", "indexed-job", v1.RestartPolicyNever, parallelism, completions, nil, backoffLimit) + mode := batchv1.IndexedCompletion + job.Spec.CompletionMode = &mode + job, err := e2ejob.CreateJob(f.ClientSet, f.Namespace.Name, job) + framework.ExpectNoError(err, "failed to create indexed job in namespace %s", f.Namespace.Name) + + ginkgo.By("Ensuring job reaches completions") + err = e2ejob.WaitForJobComplete(f.ClientSet, f.Namespace.Name, job.Name, completions) + framework.ExpectNoError(err, "failed to ensure job completion in namespace: %s", f.Namespace.Name) + + ginkgo.By("Ensuring pods with index for job exist") + pods, err := e2ejob.GetJobPods(f.ClientSet, f.Namespace.Name, job.Name) + framework.ExpectNoError(err, "failed to get pod list for job in namespace: %s", f.Namespace.Name) + succeededIndexes := sets.NewInt() + for _, pod := range pods.Items { + if pod.Status.Phase == v1.PodSucceeded && pod.Annotations != nil { + ix, err := strconv.Atoi(pod.Annotations[batchv1.JobCompletionIndexAnnotationAlpha]) + framework.ExpectNoError(err, "failed obtaining completion index from pod in namespace: %s", f.Namespace.Name) + succeededIndexes.Insert(ix) + } + } + gotIndexes := succeededIndexes.List() + wantIndexes := []int{0, 1, 2, 3} + framework.ExpectEqual(gotIndexes, wantIndexes, "expected completed indexes %s, but got %s", gotIndexes, wantIndexes) + }) + /* Testcase: Ensure that the pods associated with the job are removed once the job is deleted Description: Create a job and ensure the associated pod count is equal to paralellism count. Delete the diff --git a/vendor/k8s.io/kubernetes/test/e2e/apps/network_partition.go b/vendor/k8s.io/kubernetes/test/e2e/apps/network_partition.go index c5d7800e5802..d1fc2a47a5b5 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/apps/network_partition.go +++ b/vendor/k8s.io/kubernetes/test/e2e/apps/network_partition.go @@ -33,7 +33,6 @@ import ( v1 "k8s.io/api/core/v1" clientset "k8s.io/client-go/kubernetes" - api "k8s.io/kubernetes/pkg/apis/core" nodepkg "k8s.io/kubernetes/pkg/controller/nodelifecycle" "k8s.io/kubernetes/test/e2e/common" "k8s.io/kubernetes/test/e2e/framework" @@ -128,7 +127,7 @@ var _ = SIGDescribe("Network Partition [Disruptive] [Slow]", func() { } }) - framework.KubeDescribe("Pods", func() { + ginkgo.Describe("Pods", func() { ginkgo.Context("should return to running and ready state after network partition is healed", func() { ginkgo.BeforeEach(func() { e2eskipper.SkipUnlessNodeCountIsAtLeast(2) @@ -152,7 +151,7 @@ var _ = SIGDescribe("Network Partition [Disruptive] [Slow]", func() { if !e2enode.IsConditionSetAsExpected(&node, v1.NodeReady, true) { return false } - podOpts = metav1.ListOptions{FieldSelector: fields.OneTermEqualSelector(api.PodHostField, node.Name).String()} + podOpts = metav1.ListOptions{FieldSelector: fields.OneTermEqualSelector("spec.nodeName", node.Name).String()} pods, err := c.CoreV1().Pods(metav1.NamespaceAll).List(context.TODO(), podOpts) if err != nil || len(pods.Items) <= 0 { return false @@ -163,7 +162,7 @@ var _ = SIGDescribe("Network Partition [Disruptive] [Slow]", func() { framework.Failf("No eligible node were found: %d", len(nodes.Items)) } node := nodes.Items[0] - podOpts = metav1.ListOptions{FieldSelector: fields.OneTermEqualSelector(api.PodHostField, node.Name).String()} + podOpts = metav1.ListOptions{FieldSelector: fields.OneTermEqualSelector("spec.nodeName", node.Name).String()} if err = e2epod.WaitForMatchPodsCondition(c, podOpts, "Running and Ready", podReadyTimeout, testutils.PodRunningReady); err != nil { framework.Failf("Pods on node %s are not ready and running within %v: %v", node.Name, podReadyTimeout, err) } @@ -238,7 +237,7 @@ var _ = SIGDescribe("Network Partition [Disruptive] [Slow]", func() { }) }) - framework.KubeDescribe("[ReplicationController]", func() { + ginkgo.Describe("[ReplicationController]", func() { ginkgo.It("should recreate pods scheduled on the unreachable node "+ "AND allow scheduling of pods on a node after it rejoins the cluster", func() { e2eskipper.SkipUnlessSSHKeyPresent() @@ -356,7 +355,7 @@ var _ = SIGDescribe("Network Partition [Disruptive] [Slow]", func() { }) }) - framework.KubeDescribe("[StatefulSet]", func() { + ginkgo.Describe("[StatefulSet]", func() { psName := "ss" labels := map[string]string{ "foo": "bar", @@ -431,7 +430,7 @@ var _ = SIGDescribe("Network Partition [Disruptive] [Slow]", func() { }) }) - framework.KubeDescribe("[Job]", func() { + ginkgo.Describe("[Job]", func() { ginkgo.It("should create new pods when node is partitioned", func() { e2eskipper.SkipUnlessSSHKeyPresent() @@ -478,7 +477,7 @@ var _ = SIGDescribe("Network Partition [Disruptive] [Slow]", func() { }) }) - framework.KubeDescribe("Pods", func() { + ginkgo.Describe("Pods", func() { ginkgo.Context("should be evicted from unready Node", func() { ginkgo.BeforeEach(func() { e2eskipper.SkipUnlessNodeCountIsAtLeast(2) @@ -501,7 +500,7 @@ var _ = SIGDescribe("Network Partition [Disruptive] [Slow]", func() { if !e2enode.IsConditionSetAsExpected(&node, v1.NodeReady, true) { return false } - podOpts = metav1.ListOptions{FieldSelector: fields.OneTermEqualSelector(api.PodHostField, node.Name).String()} + podOpts = metav1.ListOptions{FieldSelector: fields.OneTermEqualSelector("spec.nodeName", node.Name).String()} pods, err := c.CoreV1().Pods(metav1.NamespaceAll).List(context.TODO(), podOpts) if err != nil || len(pods.Items) <= 0 { return false @@ -512,7 +511,7 @@ var _ = SIGDescribe("Network Partition [Disruptive] [Slow]", func() { framework.Failf("No eligible node were found: %d", len(nodes.Items)) } node := nodes.Items[0] - podOpts = metav1.ListOptions{FieldSelector: fields.OneTermEqualSelector(api.PodHostField, node.Name).String()} + podOpts = metav1.ListOptions{FieldSelector: fields.OneTermEqualSelector("spec.nodeName", node.Name).String()} if err := e2epod.WaitForMatchPodsCondition(c, podOpts, "Running and Ready", podReadyTimeout, testutils.PodRunningReadyOrSucceeded); err != nil { framework.Failf("Pods on node %s are not ready and running within %v: %v", node.Name, podReadyTimeout, err) } diff --git a/vendor/k8s.io/kubernetes/test/e2e/apps/replica_set.go b/vendor/k8s.io/kubernetes/test/e2e/apps/replica_set.go index f08df5653f0c..95928fa10220 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/apps/replica_set.go +++ b/vendor/k8s.io/kubernetes/test/e2e/apps/replica_set.go @@ -18,10 +18,17 @@ package apps import ( "context" + "encoding/json" "fmt" "time" appsv1 "k8s.io/api/apps/v1" + autoscalingv1 "k8s.io/api/autoscaling/v1" + "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/watch" + "k8s.io/client-go/tools/cache" + watchtools "k8s.io/client-go/tools/watch" + v1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/resource" @@ -114,6 +121,29 @@ var _ = SIGDescribe("ReplicaSet", func() { framework.ConformanceIt("should adopt matching pods on creation and release no longer matching pods", func() { testRSAdoptMatchingAndReleaseNotMatching(f) }) + + /* + Release: v1.21 + Testname: ReplicaSet, completes the scaling of a ReplicaSet subresource + Description: Create a ReplicaSet (RS) with a single Pod. The Pod MUST be verified + that it is running. The RS MUST get and verify the scale subresource count. + The RS MUST update and verify the scale subresource. The RS MUST patch and verify + a scale subresource. + */ + framework.ConformanceIt("Replicaset should have a working scale subresource", func() { + testRSScaleSubresources(f) + }) + + /* + Release: v1.21 + Testname: ReplicaSet, is created, Replaced and Patched + Description: Create a ReplicaSet (RS) with a single Pod. The Pod MUST be verified + that it is running. The RS MUST scale to two replicas and verify the scale count + The RS MUST be patched and verify that patch succeeded. + */ + framework.ConformanceIt("Replace and Patch tests", func() { + testRSLifeCycle(f) + }) }) // A basic test to check the deployment of an image using a ReplicaSet. The @@ -340,3 +370,157 @@ func testRSAdoptMatchingAndReleaseNotMatching(f *framework.Framework) { }) framework.ExpectNoError(err) } + +func testRSScaleSubresources(f *framework.Framework) { + ns := f.Namespace.Name + c := f.ClientSet + + // Create webserver pods. + rsPodLabels := map[string]string{ + "name": "sample-pod", + "pod": WebserverImageName, + } + + rsName := "test-rs" + replicas := int32(1) + ginkgo.By(fmt.Sprintf("Creating replica set %q that asks for more than the allowed pod quota", rsName)) + rs := newRS(rsName, replicas, rsPodLabels, WebserverImageName, WebserverImage, nil) + _, err := c.AppsV1().ReplicaSets(ns).Create(context.TODO(), rs, metav1.CreateOptions{}) + framework.ExpectNoError(err) + + // Verify that the required pods have come up. + err = e2epod.VerifyPodsRunning(c, ns, "sample-pod", false, replicas) + framework.ExpectNoError(err, "error in waiting for pods to come up: %s", err) + + ginkgo.By("getting scale subresource") + scale, err := c.AppsV1().ReplicaSets(ns).GetScale(context.TODO(), rsName, metav1.GetOptions{}) + if err != nil { + framework.Failf("Failed to get scale subresource: %v", err) + } + framework.ExpectEqual(scale.Spec.Replicas, int32(1)) + framework.ExpectEqual(scale.Status.Replicas, int32(1)) + + ginkgo.By("updating a scale subresource") + scale.ResourceVersion = "" // indicate the scale update should be unconditional + scale.Spec.Replicas = 2 + scaleResult, err := c.AppsV1().ReplicaSets(ns).UpdateScale(context.TODO(), rsName, scale, metav1.UpdateOptions{}) + if err != nil { + framework.Failf("Failed to put scale subresource: %v", err) + } + framework.ExpectEqual(scaleResult.Spec.Replicas, int32(2)) + + ginkgo.By("verifying the replicaset Spec.Replicas was modified") + rs, err = c.AppsV1().ReplicaSets(ns).Get(context.TODO(), rsName, metav1.GetOptions{}) + if err != nil { + framework.Failf("Failed to get statefulset resource: %v", err) + } + framework.ExpectEqual(*(rs.Spec.Replicas), int32(2)) + + ginkgo.By("Patch a scale subresource") + scale.ResourceVersion = "" // indicate the scale update should be unconditional + scale.Spec.Replicas = 4 // should be 2 after "UpdateScale" operation, now Patch to 4 + rsScalePatchPayload, err := json.Marshal(autoscalingv1.Scale{ + Spec: autoscalingv1.ScaleSpec{ + Replicas: scale.Spec.Replicas, + }, + }) + framework.ExpectNoError(err, "Could not Marshal JSON for patch payload") + + _, err = c.AppsV1().ReplicaSets(ns).Patch(context.TODO(), rsName, types.StrategicMergePatchType, []byte(rsScalePatchPayload), metav1.PatchOptions{}, "scale") + framework.ExpectNoError(err, "Failed to patch replicaset: %v", err) + + rs, err = c.AppsV1().ReplicaSets(ns).Get(context.TODO(), rsName, metav1.GetOptions{}) + framework.ExpectNoError(err, "Failed to get replicaset resource: %v", err) + framework.ExpectEqual(*(rs.Spec.Replicas), int32(4), "replicaset should have 4 replicas") + +} + +// ReplicaSet Replace and Patch tests +func testRSLifeCycle(f *framework.Framework) { + ns := f.Namespace.Name + c := f.ClientSet + zero := int64(0) + + // Create webserver pods. + rsPodLabels := map[string]string{ + "name": "sample-pod", + "pod": WebserverImageName, + } + + rsName := "test-rs" + label := "test-rs=patched" + labelMap := map[string]string{"test-rs": "patched"} + replicas := int32(1) + rsPatchReplicas := int32(3) + rsPatchImage := imageutils.GetE2EImage(imageutils.Pause) + + w := &cache.ListWatch{ + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { + options.LabelSelector = label + return f.ClientSet.AppsV1().ReplicaSets(ns).Watch(context.TODO(), options) + }, + } + rsList, err := f.ClientSet.AppsV1().ReplicaSets("").List(context.TODO(), metav1.ListOptions{LabelSelector: label}) + framework.ExpectNoError(err, "failed to list rsList") + // Create a ReplicaSet + rs := newRS(rsName, replicas, rsPodLabels, WebserverImageName, WebserverImage, nil) + _, err = c.AppsV1().ReplicaSets(ns).Create(context.TODO(), rs, metav1.CreateOptions{}) + framework.ExpectNoError(err) + + // Verify that the required pods have come up. + err = e2epod.VerifyPodsRunning(c, ns, "sample-pod", false, replicas) + framework.ExpectNoError(err, "Failed to create pods: %s", err) + + // Scale the ReplicaSet + ginkgo.By(fmt.Sprintf("Scaling up %q replicaset ", rsName)) + _, err = e2ereplicaset.UpdateReplicaSetWithRetries(c, ns, rsName, func(update *appsv1.ReplicaSet) { + x := int32(2) + update.Spec.Replicas = &x + }) + framework.ExpectNoError(err, "ReplicaSet fail to scale to %q replicasets") + + // Patch the PeplicaSet + ginkgo.By("patching the ReplicaSet") + rsPatch, err := json.Marshal(map[string]interface{}{ + "metadata": map[string]interface{}{ + "labels": labelMap, + }, + "spec": map[string]interface{}{ + "replicas": rsPatchReplicas, + "template": map[string]interface{}{ + "spec": map[string]interface{}{ + "TerminationGracePeriodSeconds": &zero, + "containers": [1]map[string]interface{}{{ + "name": rsName, + "image": rsPatchImage, + }}, + }, + }, + }, + }) + framework.ExpectNoError(err, "failed to Marshal ReplicaSet JSON patch") + _, err = f.ClientSet.AppsV1().ReplicaSets(ns).Patch(context.TODO(), rsName, types.StrategicMergePatchType, []byte(rsPatch), metav1.PatchOptions{}) + framework.ExpectNoError(err, "failed to patch ReplicaSet") + + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + _, err = watchtools.Until(ctx, rsList.ResourceVersion, w, func(event watch.Event) (bool, error) { + if rset, ok := event.Object.(*appsv1.ReplicaSet); ok { + found := rset.ObjectMeta.Name == rsName && + rset.ObjectMeta.Labels["test-rs"] == "patched" && + rset.Status.ReadyReplicas == rsPatchReplicas && + rset.Status.AvailableReplicas == rsPatchReplicas && + rset.Spec.Template.Spec.Containers[0].Image == rsPatchImage + if !found { + framework.Logf("observed ReplicaSet %v in namespace %v with ReadyReplicas %v, AvailableReplicas %v", rset.ObjectMeta.Name, rset.ObjectMeta.Namespace, rset.Status.ReadyReplicas, + rset.Status.AvailableReplicas) + } else { + framework.Logf("observed Replicaset %v in namespace %v with ReadyReplicas %v found %v", rset.ObjectMeta.Name, rset.ObjectMeta.Namespace, rset.Status.ReadyReplicas, found) + } + return found, nil + } + return false, nil + }) + + framework.ExpectNoError(err, "failed to see replicas of %v in namespace %v scale to requested amount of %v", rs.Name, ns, rsPatchReplicas) +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/apps/statefulset.go b/vendor/k8s.io/kubernetes/test/e2e/apps/statefulset.go index b136689fb1ca..69dfb961d4fd 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/apps/statefulset.go +++ b/vendor/k8s.io/kubernetes/test/e2e/apps/statefulset.go @@ -18,6 +18,7 @@ package apps import ( "context" + "encoding/json" "fmt" "strings" "sync" @@ -27,6 +28,7 @@ import ( "github.com/onsi/gomega" appsv1 "k8s.io/api/apps/v1" + autoscalingv1 "k8s.io/api/autoscaling/v1" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/fields" @@ -90,7 +92,7 @@ var _ = SIGDescribe("StatefulSet", func() { ns = f.Namespace.Name }) - framework.KubeDescribe("Basic StatefulSet functionality [StatefulSetBasic]", func() { + ginkgo.Describe("Basic StatefulSet functionality [StatefulSetBasic]", func() { ssName := "ss" labels := map[string]string{ "foo": "bar", @@ -830,7 +832,7 @@ var _ = SIGDescribe("StatefulSet", func() { }) /* - Release: v1.16 + Release: v1.16, v1.21 Testname: StatefulSet resource Replica scaling Description: Create a StatefulSet resource. Newly created StatefulSet resource MUST have a scale of one. @@ -868,10 +870,28 @@ var _ = SIGDescribe("StatefulSet", func() { framework.Failf("Failed to get statefulset resource: %v", err) } framework.ExpectEqual(*(ss.Spec.Replicas), int32(2)) + + ginkgo.By("Patch a scale subresource") + scale.ResourceVersion = "" // indicate the scale update should be unconditional + scale.Spec.Replicas = 4 // should be 2 after "UpdateScale" operation, now Patch to 4 + ssScalePatchPayload, err := json.Marshal(autoscalingv1.Scale{ + Spec: autoscalingv1.ScaleSpec{ + Replicas: scale.Spec.Replicas, + }, + }) + framework.ExpectNoError(err, "Could not Marshal JSON for patch payload") + + _, err = c.AppsV1().StatefulSets(ns).Patch(context.TODO(), ssName, types.StrategicMergePatchType, []byte(ssScalePatchPayload), metav1.PatchOptions{}, "scale") + framework.ExpectNoError(err, "Failed to patch stateful set: %v", err) + + ginkgo.By("verifying the statefulset Spec.Replicas was modified") + ss, err = c.AppsV1().StatefulSets(ns).Get(context.TODO(), ssName, metav1.GetOptions{}) + framework.ExpectNoError(err, "Failed to get statefulset resource: %v", err) + framework.ExpectEqual(*(ss.Spec.Replicas), int32(4), "statefulset should have 4 replicas") }) }) - framework.KubeDescribe("Deploy clustered applications [Feature:StatefulSet] [Slow]", func() { + ginkgo.Describe("Deploy clustered applications [Feature:StatefulSet] [Slow]", func() { var appTester *clusterAppTester ginkgo.BeforeEach(func() { @@ -1317,7 +1337,7 @@ func deleteStatefulPodAtIndex(c clientset.Interface, index int, ss *appsv1.State } } -// getStatefulSetPodNameAtIndex gets formated pod name given index. +// getStatefulSetPodNameAtIndex gets formatted pod name given index. func getStatefulSetPodNameAtIndex(index int, ss *appsv1.StatefulSet) string { // TODO: we won't use "-index" as the name strategy forever, // pull the name out from an identity mapper. diff --git a/vendor/k8s.io/kubernetes/test/e2e/apps/ttl_after_finished.go b/vendor/k8s.io/kubernetes/test/e2e/apps/ttl_after_finished.go new file mode 100644 index 000000000000..085e1a5fd685 --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/apps/ttl_after_finished.go @@ -0,0 +1,151 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package apps + +import ( + "context" + "fmt" + "time" + + batchv1 "k8s.io/api/batch/v1" + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/wait" + clientset "k8s.io/client-go/kubernetes" + "k8s.io/kubernetes/pkg/util/slice" + "k8s.io/kubernetes/test/e2e/framework" + e2ejob "k8s.io/kubernetes/test/e2e/framework/job" + + "github.com/onsi/ginkgo" +) + +const ( + dummyFinalizer = "k8s.io/dummy-finalizer" + + // JobTimeout is how long to wait for a job to finish. + JobTimeout = 15 * time.Minute +) + +var _ = SIGDescribe("[Feature:TTLAfterFinished]", func() { + f := framework.NewDefaultFramework("ttlafterfinished") + + ginkgo.It("job should be deleted once it finishes after TTL seconds", func() { + testFinishedJob(f) + }) +}) + +func cleanupJob(f *framework.Framework, job *batchv1.Job) { + ns := f.Namespace.Name + c := f.ClientSet + + framework.Logf("Remove the Job's dummy finalizer; the Job should be deleted cascadingly") + removeFinalizerFunc := func(j *batchv1.Job) { + j.ObjectMeta.Finalizers = slice.RemoveString(j.ObjectMeta.Finalizers, dummyFinalizer, nil) + } + _, err := updateJobWithRetries(c, ns, job.Name, removeFinalizerFunc) + framework.ExpectNoError(err) + e2ejob.WaitForJobGone(c, ns, job.Name, wait.ForeverTestTimeout) + + err = e2ejob.WaitForAllJobPodsGone(c, ns, job.Name) + framework.ExpectNoError(err) +} + +func testFinishedJob(f *framework.Framework) { + ns := f.Namespace.Name + c := f.ClientSet + + parallelism := int32(1) + completions := int32(1) + backoffLimit := int32(2) + ttl := int32(10) + + job := e2ejob.NewTestJob("randomlySucceedOrFail", "rand-non-local", v1.RestartPolicyNever, parallelism, completions, nil, backoffLimit) + job.Spec.TTLSecondsAfterFinished = &ttl + job.ObjectMeta.Finalizers = []string{dummyFinalizer} + defer cleanupJob(f, job) + + framework.Logf("Create a Job %s/%s with TTL", ns, job.Name) + job, err := e2ejob.CreateJob(c, ns, job) + framework.ExpectNoError(err) + + framework.Logf("Wait for the Job to finish") + err = e2ejob.WaitForJobFinish(c, ns, job.Name) + framework.ExpectNoError(err) + + framework.Logf("Wait for TTL after finished controller to delete the Job") + err = waitForJobDeleting(c, ns, job.Name) + framework.ExpectNoError(err) + + framework.Logf("Check Job's deletionTimestamp and compare with the time when the Job finished") + job, err = e2ejob.GetJob(c, ns, job.Name) + framework.ExpectNoError(err) + jobFinishTime := finishTime(job) + finishTimeUTC := jobFinishTime.UTC() + framework.ExpectNotEqual(jobFinishTime.IsZero(), true) + + deleteAtUTC := job.ObjectMeta.DeletionTimestamp.UTC() + framework.ExpectNotEqual(deleteAtUTC, nil) + + expireAtUTC := finishTimeUTC.Add(time.Duration(ttl) * time.Second) + framework.ExpectEqual(deleteAtUTC.Before(expireAtUTC), false) +} + +// finishTime returns finish time of the specified job. +func finishTime(finishedJob *batchv1.Job) metav1.Time { + var finishTime metav1.Time + for _, c := range finishedJob.Status.Conditions { + if (c.Type == batchv1.JobComplete || c.Type == batchv1.JobFailed) && c.Status == v1.ConditionTrue { + return c.LastTransitionTime + } + } + return finishTime +} + +// updateJobWithRetries updates job with retries. +func updateJobWithRetries(c clientset.Interface, namespace, name string, applyUpdate func(*batchv1.Job)) (job *batchv1.Job, err error) { + jobs := c.BatchV1().Jobs(namespace) + var updateErr error + pollErr := wait.PollImmediate(framework.Poll, JobTimeout, func() (bool, error) { + if job, err = jobs.Get(context.TODO(), name, metav1.GetOptions{}); err != nil { + return false, err + } + // Apply the update, then attempt to push it to the apiserver. + applyUpdate(job) + if job, err = jobs.Update(context.TODO(), job, metav1.UpdateOptions{}); err == nil { + framework.Logf("Updating job %s", name) + return true, nil + } + updateErr = err + return false, nil + }) + if pollErr == wait.ErrWaitTimeout { + pollErr = fmt.Errorf("couldn't apply the provided updated to job %q: %v", name, updateErr) + } + return job, pollErr +} + +// waitForJobDeleting uses c to wait for the Job jobName in namespace ns to have +// a non-nil deletionTimestamp (i.e. being deleted). +func waitForJobDeleting(c clientset.Interface, ns, jobName string) error { + return wait.PollImmediate(framework.Poll, JobTimeout, func() (bool, error) { + curr, err := c.BatchV1().Jobs(ns).Get(context.TODO(), jobName, metav1.GetOptions{}) + if err != nil { + return false, err + } + return curr.ObjectMeta.DeletionTimestamp != nil, nil + }) +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/apps/types.go b/vendor/k8s.io/kubernetes/test/e2e/apps/types.go index 422ac66a6e3c..bbf4a8f61262 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/apps/types.go +++ b/vendor/k8s.io/kubernetes/test/e2e/apps/types.go @@ -28,18 +28,9 @@ const ( ) var ( - // CronJobGroupVersionResourceAlpha unambiguously identifies a resource of cronjob with alpha status - CronJobGroupVersionResourceAlpha = schema.GroupVersionResource{Group: "batch", Version: "v2alpha1", Resource: "cronjobs"} - // CronJobGroupVersionResourceBeta unambiguously identifies a resource of cronjob with beta status CronJobGroupVersionResourceBeta = schema.GroupVersionResource{Group: "batch", Version: "v1beta1", Resource: "cronjobs"} - // NautilusImage is the fully qualified URI to the Nautilus image - NautilusImage = imageutils.GetE2EImage(imageutils.Nautilus) - - // KittenImage is the fully qualified URI to the Kitten image - KittenImage = imageutils.GetE2EImage(imageutils.Kitten) - // WebserverImage is the fully qualified URI to the Httpd image WebserverImage = imageutils.GetE2EImage(imageutils.Httpd) diff --git a/vendor/k8s.io/kubernetes/test/e2e/auth/BUILD b/vendor/k8s.io/kubernetes/test/e2e/auth/BUILD deleted file mode 100644 index 602e0e4926fc..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/auth/BUILD +++ /dev/null @@ -1,67 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "certificates.go", - "framework.go", - "metadata_concealment.go", - "node_authn.go", - "node_authz.go", - "pod_security_policy.go", - "service_accounts.go", - ], - importpath = "k8s.io/kubernetes/test/e2e/auth", - visibility = ["//visibility:public"], - deps = [ - "//pkg/cluster/ports:go_default_library", - "//pkg/security/podsecuritypolicy/seccomp:go_default_library", - "//pkg/security/podsecuritypolicy/util:go_default_library", - "//plugin/pkg/admission/serviceaccount:go_default_library", - "//staging/src/k8s.io/api/authentication/v1:go_default_library", - "//staging/src/k8s.io/api/batch/v1:go_default_library", - "//staging/src/k8s.io/api/certificates/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/api/rbac/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/serviceaccount:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/certificates/v1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/util/cert:go_default_library", - "//test/e2e/framework:go_default_library", - "//test/e2e/framework/auth:go_default_library", - "//test/e2e/framework/job:go_default_library", - "//test/e2e/framework/kubectl:go_default_library", - "//test/e2e/framework/node:go_default_library", - "//test/e2e/framework/pod:go_default_library", - "//test/e2e/framework/skipper:go_default_library", - "//test/utils:go_default_library", - "//test/utils/image:go_default_library", - "//vendor/github.com/onsi/ginkgo:go_default_library", - "//vendor/github.com/onsi/gomega:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/auth/node_authz.go b/vendor/k8s.io/kubernetes/test/e2e/auth/node_authz.go index f235c0cf7245..77b472adaa33 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/auth/node_authz.go +++ b/vendor/k8s.io/kubernetes/test/e2e/auth/node_authz.go @@ -174,6 +174,13 @@ var _ = SIGDescribe("[Feature:NodeAuthorizer]", func() { } ginkgo.By(fmt.Sprintf("Create node foo by user: %v", asUser)) _, err := c.CoreV1().Nodes().Create(context.TODO(), node, metav1.CreateOptions{}) + + // NOTE: If the test fails and a new node IS created, we need to delete it. If we don't, we'd have + // a zombie node in a NotReady state which will delay further tests since we're waiting for all + // tests to be in the Ready state. + defer func() { + f.ClientSet.CoreV1().Nodes().Delete(context.TODO(), node.Name, metav1.DeleteOptions{}) + }() framework.ExpectEqual(apierrors.IsForbidden(err), true) }) diff --git a/vendor/k8s.io/kubernetes/test/e2e/auth/service_accounts.go b/vendor/k8s.io/kubernetes/test/e2e/auth/service_accounts.go index a3915ef0945d..f6825b77c2e6 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/auth/service_accounts.go +++ b/vendor/k8s.io/kubernetes/test/e2e/auth/service_accounts.go @@ -673,13 +673,23 @@ var _ = SIGDescribe("ServiceAccounts", func() { } }) - ginkgo.It("should support OIDC discovery of service account issuer [Feature:ServiceAccountIssuerDiscovery]", func() { + /* + Release: v1.21 + Testname: OIDC Discovery (ServiceAccountIssuerDiscovery) + Description: Ensure kube-apiserver serves correct OIDC discovery + endpoints by deploying a Pod that verifies its own + token against these endpoints. + */ + framework.ConformanceIt("ServiceAccountIssuerDiscovery should support OIDC discovery of service account issuer", func() { + // Allow the test pod access to the OIDC discovery non-resource URLs. // The role should have already been automatically created as part of the - // bootstrap policy, but not the role binding. + // RBAC bootstrap policy, but not the role binding. If RBAC is disabled, + // we skip creating the binding. We also make sure we clean up the + // binding after the test. const clusterRoleName = "system:service-account-issuer-discovery" crbName := fmt.Sprintf("%s-%s", f.Namespace.Name, clusterRoleName) - if _, err := f.ClientSet.RbacV1().ClusterRoleBindings().Create( + if crb, err := f.ClientSet.RbacV1().ClusterRoleBindings().Create( context.TODO(), &rbacv1.ClusterRoleBinding{ ObjectMeta: metav1.ObjectMeta{ @@ -699,8 +709,16 @@ var _ = SIGDescribe("ServiceAccounts", func() { Kind: "ClusterRole", }, }, - metav1.CreateOptions{}); err != nil && !apierrors.IsAlreadyExists(err) { - framework.Failf("Unexpected err creating ClusterRoleBinding %s: %v", crbName, err) + metav1.CreateOptions{}); err != nil { + // Tolerate RBAC not being enabled + framework.Logf("error granting ClusterRoleBinding %s: %v", crbName, err) + } else { + defer func() { + framework.ExpectNoError( + f.ClientSet.RbacV1().ClusterRoleBindings().Delete( + context.TODO(), + crb.Name, metav1.DeleteOptions{})) + }() } // Create the pod with tokens. @@ -857,7 +875,15 @@ var _ = SIGDescribe("ServiceAccounts", func() { framework.ExpectEqual(eventFound, true, "failed to find %v event", watch.Deleted) }) - ginkgo.It("should guarantee kube-root-ca.crt exist in any namespace", func() { + /* + Release: v1.21 + Testname: RootCA ConfigMap test + Description: Ensure every namespace exist a ConfigMap for root ca cert. + 1. Created automatically + 2. Recreated if deleted + 3. Reconciled if modified + */ + framework.ConformanceIt("should guarantee kube-root-ca.crt exist in any namespace", func() { const rootCAConfigMapName = "kube-root-ca.crt" framework.ExpectNoError(wait.PollImmediate(500*time.Millisecond, wait.ForeverTestTimeout, func() (bool, error) { diff --git a/vendor/k8s.io/kubernetes/test/e2e/autoscaling/BUILD b/vendor/k8s.io/kubernetes/test/e2e/autoscaling/BUILD deleted file mode 100644 index b85fddd603ef..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/autoscaling/BUILD +++ /dev/null @@ -1,72 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "autoscaling_timer.go", - "cluster_autoscaler_scalability.go", - "cluster_size_autoscaling.go", - "custom_metrics_stackdriver_autoscaling.go", - "dns_autoscaling.go", - "framework.go", - "horizontal_pod_autoscaling.go", - ], - importpath = "k8s.io/kubernetes/test/e2e/autoscaling", - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/autoscaling/v2beta1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/api/scheduling/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//test/e2e/framework:go_default_library", - "//test/e2e/framework/autoscaling:go_default_library", - "//test/e2e/framework/manifest:go_default_library", - "//test/e2e/framework/network:go_default_library", - "//test/e2e/framework/node:go_default_library", - "//test/e2e/framework/pod:go_default_library", - "//test/e2e/framework/pv:go_default_library", - "//test/e2e/framework/rc:go_default_library", - "//test/e2e/framework/skipper:go_default_library", - "//test/e2e/instrumentation/monitoring:go_default_library", - "//test/e2e/scheduling:go_default_library", - "//test/utils:go_default_library", - "//test/utils/image:go_default_library", - "//vendor/github.com/onsi/ginkgo:go_default_library", - "//vendor/golang.org/x/oauth2/google:go_default_library", - "//vendor/google.golang.org/api/monitoring/v3:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/autoscaling/autoscaling_timer.go b/vendor/k8s.io/kubernetes/test/e2e/autoscaling/autoscaling_timer.go index 2bb9a879823b..cad8aa1a0216 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/autoscaling/autoscaling_timer.go +++ b/vendor/k8s.io/kubernetes/test/e2e/autoscaling/autoscaling_timer.go @@ -34,7 +34,7 @@ import ( var _ = SIGDescribe("[Feature:ClusterSizeAutoscalingScaleUp] [Slow] Autoscaling", func() { f := framework.NewDefaultFramework("autoscaling") - SIGDescribe("Autoscaling a service", func() { + ginkgo.Describe("Autoscaling a service", func() { ginkgo.BeforeEach(func() { // Check if Cloud Autoscaler is enabled by trying to get its ConfigMap. _, err := f.ClientSet.CoreV1().ConfigMaps("kube-system").Get(context.TODO(), "cluster-autoscaler-status", metav1.GetOptions{}) diff --git a/vendor/k8s.io/kubernetes/test/e2e/autoscaling/cluster_autoscaler_scalability.go b/vendor/k8s.io/kubernetes/test/e2e/autoscaling/cluster_autoscaler_scalability.go index b07a26e7571a..c9bfc195d0bc 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/autoscaling/cluster_autoscaler_scalability.go +++ b/vendor/k8s.io/kubernetes/test/e2e/autoscaling/cluster_autoscaler_scalability.go @@ -59,7 +59,7 @@ type scaleUpTestConfig struct { expectedResult *clusterPredicates } -var _ = framework.KubeDescribe("Cluster size autoscaler scalability [Slow]", func() { +var _ = SIGDescribe("Cluster size autoscaler scalability [Slow]", func() { f := framework.NewDefaultFramework("autoscaling") var c clientset.Interface var nodeCount int diff --git a/vendor/k8s.io/kubernetes/test/e2e/autoscaling/cluster_size_autoscaling.go b/vendor/k8s.io/kubernetes/test/e2e/autoscaling/cluster_size_autoscaling.go index ba5a34527b14..1d17c2bebb4c 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/autoscaling/cluster_size_autoscaling.go +++ b/vendor/k8s.io/kubernetes/test/e2e/autoscaling/cluster_size_autoscaling.go @@ -30,7 +30,7 @@ import ( "time" v1 "k8s.io/api/core/v1" - policyv1beta1 "k8s.io/api/policy/v1beta1" + policyv1 "k8s.io/api/policy/v1" schedulingv1 "k8s.io/api/scheduling/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -43,7 +43,6 @@ import ( "k8s.io/apimachinery/pkg/util/wait" clientset "k8s.io/client-go/kubernetes" "k8s.io/klog/v2" - api "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/test/e2e/framework" e2emanifest "k8s.io/kubernetes/test/e2e/framework/manifest" e2enetwork "k8s.io/kubernetes/test/e2e/framework/network" @@ -178,7 +177,7 @@ var _ = SIGDescribe("Cluster size autoscaling [Slow]", func() { framework.ExpectNoError(err) for _, e := range events.Items { - if e.InvolvedObject.Kind == "Pod" && e.Reason == "NotTriggerScaleUp" && strings.Contains(e.Message, "it wouldn't fit if a new node is added") { + if e.InvolvedObject.Kind == "Pod" && e.Reason == "NotTriggerScaleUp" { ginkgo.By("NotTriggerScaleUp event found") eventFound = true break EventsLoop @@ -494,7 +493,7 @@ var _ = SIGDescribe("Cluster size autoscaling [Slow]", func() { pv, pvc, err := e2epv.CreatePVPVC(c, pvConfig, pvcConfig, f.Namespace.Name, false) framework.ExpectNoError(err) - framework.ExpectNoError(e2epv.WaitOnPVandPVC(c, f.Namespace.Name, pv, pvc)) + framework.ExpectNoError(e2epv.WaitOnPVandPVC(c, f.Timeouts, f.Namespace.Name, pv, pvc)) defer func() { errs := e2epv.PVPVCCleanup(c, f.Namespace.Name, pv, pvc) @@ -1029,20 +1028,20 @@ func runDrainTest(f *framework.Framework, migSizes map[string]int, namespace str ginkgo.By("Create a PodDisruptionBudget") minAvailable := intstr.FromInt(numPods - pdbSize) - pdb := &policyv1beta1.PodDisruptionBudget{ + pdb := &policyv1.PodDisruptionBudget{ ObjectMeta: metav1.ObjectMeta{ Name: "test_pdb", Namespace: namespace, }, - Spec: policyv1beta1.PodDisruptionBudgetSpec{ + Spec: policyv1.PodDisruptionBudgetSpec{ Selector: &metav1.LabelSelector{MatchLabels: labelMap}, MinAvailable: &minAvailable, }, } - _, err = f.ClientSet.PolicyV1beta1().PodDisruptionBudgets(namespace).Create(context.TODO(), pdb, metav1.CreateOptions{}) + _, err = f.ClientSet.PolicyV1().PodDisruptionBudgets(namespace).Create(context.TODO(), pdb, metav1.CreateOptions{}) defer func() { - f.ClientSet.PolicyV1beta1().PodDisruptionBudgets(namespace).Delete(context.TODO(), pdb.Name, metav1.DeleteOptions{}) + f.ClientSet.PolicyV1().PodDisruptionBudgets(namespace).Delete(context.TODO(), pdb.Name, metav1.DeleteOptions{}) }() framework.ExpectNoError(err) @@ -1450,7 +1449,7 @@ func drainNode(f *framework.Framework, node *v1.Node) { makeNodeUnschedulable(f.ClientSet, node) ginkgo.By("Manually drain the single node") - podOpts := metav1.ListOptions{FieldSelector: fields.OneTermEqualSelector(api.PodHostField, node.Name).String()} + podOpts := metav1.ListOptions{FieldSelector: fields.OneTermEqualSelector("spec.nodeName", node.Name).String()} pods, err := f.ClientSet.CoreV1().Pods(metav1.NamespaceAll).List(context.TODO(), podOpts) framework.ExpectNoError(err) for _, pod := range pods.Items { @@ -1882,7 +1881,7 @@ func addKubeSystemPdbs(f *framework.Framework) (func(), error) { var finalErr error for _, newPdbName := range newPdbs { ginkgo.By(fmt.Sprintf("Delete PodDisruptionBudget %v", newPdbName)) - err := f.ClientSet.PolicyV1beta1().PodDisruptionBudgets("kube-system").Delete(context.TODO(), newPdbName, metav1.DeleteOptions{}) + err := f.ClientSet.PolicyV1().PodDisruptionBudgets("kube-system").Delete(context.TODO(), newPdbName, metav1.DeleteOptions{}) if err != nil { // log error, but attempt to remove other pdbs klog.Errorf("Failed to delete PodDisruptionBudget %v, err: %v", newPdbName, err) @@ -1910,17 +1909,17 @@ func addKubeSystemPdbs(f *framework.Framework) (func(), error) { labelMap := map[string]string{"k8s-app": pdbData.label} pdbName := fmt.Sprintf("test-pdb-for-%v", pdbData.label) minAvailable := intstr.FromInt(pdbData.minAvailable) - pdb := &policyv1beta1.PodDisruptionBudget{ + pdb := &policyv1.PodDisruptionBudget{ ObjectMeta: metav1.ObjectMeta{ Name: pdbName, Namespace: "kube-system", }, - Spec: policyv1beta1.PodDisruptionBudgetSpec{ + Spec: policyv1.PodDisruptionBudgetSpec{ Selector: &metav1.LabelSelector{MatchLabels: labelMap}, MinAvailable: &minAvailable, }, } - _, err := f.ClientSet.PolicyV1beta1().PodDisruptionBudgets("kube-system").Create(context.TODO(), pdb, metav1.CreateOptions{}) + _, err := f.ClientSet.PolicyV1().PodDisruptionBudgets("kube-system").Create(context.TODO(), pdb, metav1.CreateOptions{}) newPdbs = append(newPdbs, pdbName) if err != nil { diff --git a/vendor/k8s.io/kubernetes/test/e2e/autoscaling/custom_metrics_stackdriver_autoscaling.go b/vendor/k8s.io/kubernetes/test/e2e/autoscaling/custom_metrics_stackdriver_autoscaling.go index 400a6c6a217e..a16a0c4e7d03 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/autoscaling/custom_metrics_stackdriver_autoscaling.go +++ b/vendor/k8s.io/kubernetes/test/e2e/autoscaling/custom_metrics_stackdriver_autoscaling.go @@ -22,6 +22,7 @@ import ( "time" gcm "google.golang.org/api/monitoring/v3" + "google.golang.org/api/option" appsv1 "k8s.io/api/apps/v1" as "k8s.io/api/autoscaling/v2beta1" v1 "k8s.io/api/core/v1" @@ -233,6 +234,9 @@ func (tc *CustomMetricTestCase) Run() { ctx := context.Background() client, err := google.DefaultClient(ctx, gcm.CloudPlatformScope) + if err != nil { + framework.Failf("Failed to initialize gcm default client, %v", err) + } // Hack for running tests locally, needed to authenticate in Stackdriver // If this is your use case, create application default credentials: @@ -247,7 +251,7 @@ func (tc *CustomMetricTestCase) Run() { client := oauth2.NewClient(oauth2.NoContext, ts) */ - gcmService, err := gcm.New(client) + gcmService, err := gcm.NewService(ctx, option.WithHTTPClient(client)) if err != nil { framework.Failf("Failed to create gcm service, %v", err) } diff --git a/vendor/k8s.io/kubernetes/test/e2e/autoscaling/dns_autoscaling.go b/vendor/k8s.io/kubernetes/test/e2e/autoscaling/dns_autoscaling.go index f81f22a8a28d..f9ea503d6cd3 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/autoscaling/dns_autoscaling.go +++ b/vendor/k8s.io/kubernetes/test/e2e/autoscaling/dns_autoscaling.go @@ -166,8 +166,7 @@ var _ = SIGDescribe("DNS horizontal autoscaling", func() { framework.ExpectNoError(err) }) - // TODO: Get rid of [DisabledForLargeClusters] tag when issue #55779 is fixed. - ginkgo.It("[DisabledForLargeClusters] kube-dns-autoscaler should scale kube-dns pods in both nonfaulty and faulty scenarios", func() { + ginkgo.It("kube-dns-autoscaler should scale kube-dns pods in both nonfaulty and faulty scenarios", func() { ginkgo.By("Replace the dns autoscaling parameters with testing parameters") err := updateDNSScalingConfigMap(c, packDNSScalingConfigMap(packLinearParams(&DNSParams1))) @@ -237,19 +236,19 @@ func getExpectReplicasFuncLinear(c clientset.Interface, params *DNSParamsLinear) return func(c clientset.Interface) int { var replicasFromNodes float64 var replicasFromCores float64 - nodes, err := e2enode.GetReadySchedulableNodes(c) + nodes, err := e2enode.GetReadyNodesIncludingTainted(c) framework.ExpectNoError(err) if params.nodesPerReplica > 0 { replicasFromNodes = math.Ceil(float64(len(nodes.Items)) / params.nodesPerReplica) } if params.coresPerReplica > 0 { - replicasFromCores = math.Ceil(float64(getScheduableCores(nodes.Items)) / params.coresPerReplica) + replicasFromCores = math.Ceil(float64(getSchedulableCores(nodes.Items)) / params.coresPerReplica) } return int(math.Max(1.0, math.Max(replicasFromNodes, replicasFromCores))) } } -func getScheduableCores(nodes []v1.Node) int64 { +func getSchedulableCores(nodes []v1.Node) int64 { var sc resource.Quantity for _, node := range nodes { if !node.Spec.Unschedulable { diff --git a/vendor/k8s.io/kubernetes/test/e2e/autoscaling/horizontal_pod_autoscaling.go b/vendor/k8s.io/kubernetes/test/e2e/autoscaling/horizontal_pod_autoscaling.go index 9e9fbb417568..9e277b7e6cc0 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/autoscaling/horizontal_pod_autoscaling.go +++ b/vendor/k8s.io/kubernetes/test/e2e/autoscaling/horizontal_pod_autoscaling.go @@ -29,44 +29,43 @@ import ( // These tests don't seem to be running properly in parallel: issue: #20338. // var _ = SIGDescribe("[Feature:HPA] Horizontal pod autoscaling (scale resource: CPU)", func() { - var rc *e2eautoscaling.ResourceConsumer f := framework.NewDefaultFramework("horizontal-pod-autoscaling") titleUp := "Should scale from 1 pod to 3 pods and from 3 to 5" titleDown := "Should scale from 5 pods to 3 pods and from 3 to 1" - SIGDescribe("[Serial] [Slow] Deployment", func() { + ginkgo.Describe("[Serial] [Slow] Deployment", func() { // CPU tests via deployments ginkgo.It(titleUp, func() { - scaleUp("test-deployment", e2eautoscaling.KindDeployment, false, rc, f) + scaleUp("test-deployment", e2eautoscaling.KindDeployment, false, f) }) ginkgo.It(titleDown, func() { - scaleDown("test-deployment", e2eautoscaling.KindDeployment, false, rc, f) + scaleDown("test-deployment", e2eautoscaling.KindDeployment, false, f) }) }) - SIGDescribe("[Serial] [Slow] ReplicaSet", func() { + ginkgo.Describe("[Serial] [Slow] ReplicaSet", func() { // CPU tests via ReplicaSets ginkgo.It(titleUp, func() { - scaleUp("rs", e2eautoscaling.KindReplicaSet, false, rc, f) + scaleUp("rs", e2eautoscaling.KindReplicaSet, false, f) }) ginkgo.It(titleDown, func() { - scaleDown("rs", e2eautoscaling.KindReplicaSet, false, rc, f) + scaleDown("rs", e2eautoscaling.KindReplicaSet, false, f) }) }) // These tests take ~20 minutes each. - SIGDescribe("[Serial] [Slow] ReplicationController", func() { + ginkgo.Describe("[Serial] [Slow] ReplicationController", func() { // CPU tests via replication controllers ginkgo.It(titleUp+" and verify decision stability", func() { - scaleUp("rc", e2eautoscaling.KindRC, true, rc, f) + scaleUp("rc", e2eautoscaling.KindRC, true, f) }) ginkgo.It(titleDown+" and verify decision stability", func() { - scaleDown("rc", e2eautoscaling.KindRC, true, rc, f) + scaleDown("rc", e2eautoscaling.KindRC, true, f) }) }) - SIGDescribe("ReplicationController light", func() { + ginkgo.Describe("ReplicationController light", func() { ginkgo.It("Should scale from 1 pod to 2 pods", func() { scaleTest := &HPAScaleTest{ initPods: 1, @@ -77,7 +76,7 @@ var _ = SIGDescribe("[Feature:HPA] Horizontal pod autoscaling (scale resource: C maxPods: 2, firstScale: 2, } - scaleTest.run("rc-light", e2eautoscaling.KindRC, rc, f) + scaleTest.run("rc-light", e2eautoscaling.KindRC, f) }) ginkgo.It("Should scale from 2 pods to 1 pod [Slow]", func() { scaleTest := &HPAScaleTest{ @@ -89,7 +88,7 @@ var _ = SIGDescribe("[Feature:HPA] Horizontal pod autoscaling (scale resource: C maxPods: 2, firstScale: 1, } - scaleTest.run("rc-light", e2eautoscaling.KindRC, rc, f) + scaleTest.run("rc-light", e2eautoscaling.KindRC, f) }) }) }) @@ -106,7 +105,6 @@ type HPAScaleTest struct { firstScaleStasis time.Duration cpuBurst int secondScale int32 - secondScaleStasis time.Duration } // run is a method which runs an HPA lifecycle, from a starting state, to an expected @@ -114,9 +112,9 @@ type HPAScaleTest struct { // The first state change is due to the CPU being consumed initially, which HPA responds to by changing pod counts. // The second state change (optional) is due to the CPU burst parameter, which HPA again responds to. // TODO The use of 3 states is arbitrary, we could eventually make this test handle "n" states once this test stabilizes. -func (scaleTest *HPAScaleTest) run(name string, kind schema.GroupVersionKind, rc *e2eautoscaling.ResourceConsumer, f *framework.Framework) { +func (scaleTest *HPAScaleTest) run(name string, kind schema.GroupVersionKind, f *framework.Framework) { const timeToWait = 15 * time.Minute - rc = e2eautoscaling.NewDynamicResourceConsumer(name, f.Namespace.Name, kind, scaleTest.initPods, scaleTest.totalInitialCPUUsage, 0, 0, scaleTest.perPodCPURequest, 200, f.ClientSet, f.ScalesGetter) + rc := e2eautoscaling.NewDynamicResourceConsumer(name, f.Namespace.Name, kind, scaleTest.initPods, scaleTest.totalInitialCPUUsage, 0, 0, scaleTest.perPodCPURequest, 200, f.ClientSet, f.ScalesGetter) defer rc.CleanUp() hpa := e2eautoscaling.CreateCPUHorizontalPodAutoscaler(rc, scaleTest.targetCPUUtilizationPercent, scaleTest.minPods, scaleTest.maxPods) defer e2eautoscaling.DeleteHorizontalPodAutoscaler(rc, hpa.Name) @@ -131,7 +129,7 @@ func (scaleTest *HPAScaleTest) run(name string, kind schema.GroupVersionKind, rc } } -func scaleUp(name string, kind schema.GroupVersionKind, checkStability bool, rc *e2eautoscaling.ResourceConsumer, f *framework.Framework) { +func scaleUp(name string, kind schema.GroupVersionKind, checkStability bool, f *framework.Framework) { stasis := 0 * time.Minute if checkStability { stasis = 10 * time.Minute @@ -148,10 +146,10 @@ func scaleUp(name string, kind schema.GroupVersionKind, checkStability bool, rc cpuBurst: 700, secondScale: 5, } - scaleTest.run(name, kind, rc, f) + scaleTest.run(name, kind, f) } -func scaleDown(name string, kind schema.GroupVersionKind, checkStability bool, rc *e2eautoscaling.ResourceConsumer, f *framework.Framework) { +func scaleDown(name string, kind schema.GroupVersionKind, checkStability bool, f *framework.Framework) { stasis := 0 * time.Minute if checkStability { stasis = 10 * time.Minute @@ -168,5 +166,5 @@ func scaleDown(name string, kind schema.GroupVersionKind, checkStability bool, r cpuBurst: 10, secondScale: 1, } - scaleTest.run(name, kind, rc, f) + scaleTest.run(name, kind, f) } diff --git a/vendor/k8s.io/kubernetes/test/e2e/chaosmonkey/BUILD b/vendor/k8s.io/kubernetes/test/e2e/chaosmonkey/BUILD deleted file mode 100644 index 90a159dda37e..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/chaosmonkey/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["chaosmonkey.go"], - importpath = "k8s.io/kubernetes/test/e2e/chaosmonkey", - deps = ["//vendor/github.com/onsi/ginkgo:go_default_library"], -) - -go_test( - name = "go_default_test", - srcs = ["chaosmonkey_test.go"], - embed = [":go_default_library"], - tags = ["e2e"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/BUILD b/vendor/k8s.io/kubernetes/test/e2e/common/BUILD deleted file mode 100644 index babd63cf9a36..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/common/BUILD +++ /dev/null @@ -1,108 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "configmap.go", - "configmap_volume.go", - "container.go", - "container_probe.go", - "docker_containers.go", - "downward_api.go", - "downwardapi_volume.go", - "empty_dir.go", - "expansion.go", - "host_path.go", - "init_container.go", - "kubelet.go", - "kubelet_etc_hosts.go", - "lease.go", - "lifecycle_hook.go", - "networking.go", - "node_lease.go", - "pods.go", - "podtemplates.go", - "privileged.go", - "projected_combined.go", - "projected_configmap.go", - "projected_downwardapi.go", - "projected_secret.go", - "runtime.go", - "runtimeclass.go", - "secrets.go", - "secrets_volume.go", - "security_context.go", - "sysctl.go", - "util.go", - "volumes.go", - ], - importpath = "k8s.io/kubernetes/test/e2e/common", - deps = [ - "//pkg/api/v1/pod:go_default_library", - "//pkg/client/conditions:go_default_library", - "//pkg/features:go_default_library", - "//pkg/kubelet:go_default_library", - "//pkg/kubelet/events:go_default_library", - "//pkg/kubelet/images:go_default_library", - "//pkg/kubelet/runtimeclass/testing:go_default_library", - "//staging/src/k8s.io/api/coordination/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/node/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/dynamic:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/tools/watch:go_default_library", - "//test/e2e/framework:go_default_library", - "//test/e2e/framework/events:go_default_library", - "//test/e2e/framework/network:go_default_library", - "//test/e2e/framework/node:go_default_library", - "//test/e2e/framework/pod:go_default_library", - "//test/e2e/framework/rc:go_default_library", - "//test/e2e/framework/skipper:go_default_library", - "//test/e2e/framework/volume:go_default_library", - "//test/e2e/framework/websocket:go_default_library", - "//test/utils:go_default_library", - "//test/utils/image:go_default_library", - "//vendor/github.com/onsi/ginkgo:go_default_library", - "//vendor/github.com/onsi/gomega:go_default_library", - "//vendor/github.com/onsi/gomega/types:go_default_library", - "//vendor/golang.org/x/net/websocket:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/configmap.go b/vendor/k8s.io/kubernetes/test/e2e/common/configmap.go deleted file mode 100644 index 95d4f3249a47..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/common/configmap.go +++ /dev/null @@ -1,269 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package common - -import ( - "context" - "encoding/json" - "fmt" - - v1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/util/uuid" - "k8s.io/kubernetes/test/e2e/framework" - imageutils "k8s.io/kubernetes/test/utils/image" - - "github.com/onsi/ginkgo" -) - -var _ = ginkgo.Describe("[sig-node] ConfigMap", func() { - f := framework.NewDefaultFramework("configmap") - - /* - Release: v1.9 - Testname: ConfigMap, from environment field - Description: Create a Pod with an environment variable value set using a value from ConfigMap. A ConfigMap value MUST be accessible in the container environment. - */ - framework.ConformanceIt("should be consumable via environment variable [NodeConformance]", func() { - name := "configmap-test-" + string(uuid.NewUUID()) - configMap := newConfigMap(f, name) - ginkgo.By(fmt.Sprintf("Creating configMap %v/%v", f.Namespace.Name, configMap.Name)) - var err error - if configMap, err = f.ClientSet.CoreV1().ConfigMaps(f.Namespace.Name).Create(context.TODO(), configMap, metav1.CreateOptions{}); err != nil { - framework.Failf("unable to create test configMap %s: %v", configMap.Name, err) - } - - pod := &v1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - Name: "pod-configmaps-" + string(uuid.NewUUID()), - }, - Spec: v1.PodSpec{ - Containers: []v1.Container{ - { - Name: "env-test", - Image: imageutils.GetE2EImage(imageutils.BusyBox), - Command: []string{"sh", "-c", "env"}, - Env: []v1.EnvVar{ - { - Name: "CONFIG_DATA_1", - ValueFrom: &v1.EnvVarSource{ - ConfigMapKeyRef: &v1.ConfigMapKeySelector{ - LocalObjectReference: v1.LocalObjectReference{ - Name: name, - }, - Key: "data-1", - }, - }, - }, - }, - }, - }, - RestartPolicy: v1.RestartPolicyNever, - }, - } - - f.TestContainerOutput("consume configMaps", pod, 0, []string{ - "CONFIG_DATA_1=value-1", - }) - }) - - /* - Release: v1.9 - Testname: ConfigMap, from environment variables - Description: Create a Pod with a environment source from ConfigMap. All ConfigMap values MUST be available as environment variables in the container. - */ - framework.ConformanceIt("should be consumable via the environment [NodeConformance]", func() { - name := "configmap-test-" + string(uuid.NewUUID()) - configMap := newEnvFromConfigMap(f, name) - ginkgo.By(fmt.Sprintf("Creating configMap %v/%v", f.Namespace.Name, configMap.Name)) - var err error - if configMap, err = f.ClientSet.CoreV1().ConfigMaps(f.Namespace.Name).Create(context.TODO(), configMap, metav1.CreateOptions{}); err != nil { - framework.Failf("unable to create test configMap %s: %v", configMap.Name, err) - } - - pod := &v1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - Name: "pod-configmaps-" + string(uuid.NewUUID()), - }, - Spec: v1.PodSpec{ - Containers: []v1.Container{ - { - Name: "env-test", - Image: imageutils.GetE2EImage(imageutils.BusyBox), - Command: []string{"sh", "-c", "env"}, - EnvFrom: []v1.EnvFromSource{ - { - ConfigMapRef: &v1.ConfigMapEnvSource{LocalObjectReference: v1.LocalObjectReference{Name: name}}, - }, - { - Prefix: "p_", - ConfigMapRef: &v1.ConfigMapEnvSource{LocalObjectReference: v1.LocalObjectReference{Name: name}}, - }, - }, - }, - }, - RestartPolicy: v1.RestartPolicyNever, - }, - } - - f.TestContainerOutput("consume configMaps", pod, 0, []string{ - "data_1=value-1", "data_2=value-2", "data_3=value-3", - "p_data_1=value-1", "p_data_2=value-2", "p_data_3=value-3", - }) - }) - - /* - Release: v1.14 - Testname: ConfigMap, with empty-key - Description: Attempt to create a ConfigMap with an empty key. The creation MUST fail. - */ - framework.ConformanceIt("should fail to create ConfigMap with empty key", func() { - configMap, err := newConfigMapWithEmptyKey(f) - framework.ExpectError(err, "created configMap %q with empty key in namespace %q", configMap.Name, f.Namespace.Name) - }) - - ginkgo.It("should update ConfigMap successfully", func() { - name := "configmap-test-" + string(uuid.NewUUID()) - configMap := newConfigMap(f, name) - ginkgo.By(fmt.Sprintf("Creating ConfigMap %v/%v", f.Namespace.Name, configMap.Name)) - _, err := f.ClientSet.CoreV1().ConfigMaps(f.Namespace.Name).Create(context.TODO(), configMap, metav1.CreateOptions{}) - framework.ExpectNoError(err, "failed to create ConfigMap") - - configMap.Data = map[string]string{ - "data": "value", - } - ginkgo.By(fmt.Sprintf("Updating configMap %v/%v", f.Namespace.Name, configMap.Name)) - _, err = f.ClientSet.CoreV1().ConfigMaps(f.Namespace.Name).Update(context.TODO(), configMap, metav1.UpdateOptions{}) - framework.ExpectNoError(err, "failed to update ConfigMap") - - configMapFromUpdate, err := f.ClientSet.CoreV1().ConfigMaps(f.Namespace.Name).Get(context.TODO(), name, metav1.GetOptions{}) - framework.ExpectNoError(err, "failed to get ConfigMap") - ginkgo.By(fmt.Sprintf("Verifying update of ConfigMap %v/%v", f.Namespace.Name, configMap.Name)) - framework.ExpectEqual(configMapFromUpdate.Data, configMap.Data) - }) - - /* - Release: v1.19 - Testname: ConfigMap lifecycle - Description: Attempt to create a ConfigMap. Patch the created ConfigMap. Fetching the ConfigMap MUST reflect changes. - By fetching all the ConfigMaps via a Label selector it MUST find the ConfigMap by it's static label and updated value. The ConfigMap must be deleted by Collection. - */ - framework.ConformanceIt("should run through a ConfigMap lifecycle", func() { - testNamespaceName := f.Namespace.Name - testConfigMapName := "test-configmap" + string(uuid.NewUUID()) - - testConfigMap := v1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Name: testConfigMapName, - Labels: map[string]string{ - "test-configmap-static": "true", - }, - }, - Data: map[string]string{ - "valueName": "value", - }, - } - - ginkgo.By("creating a ConfigMap") - _, err := f.ClientSet.CoreV1().ConfigMaps(testNamespaceName).Create(context.TODO(), &testConfigMap, metav1.CreateOptions{}) - framework.ExpectNoError(err, "failed to create ConfigMap") - - ginkgo.By("fetching the ConfigMap") - configMap, err := f.ClientSet.CoreV1().ConfigMaps(testNamespaceName).Get(context.TODO(), testConfigMapName, metav1.GetOptions{}) - framework.ExpectNoError(err, "failed to get ConfigMap") - framework.ExpectEqual(configMap.Data["valueName"], testConfigMap.Data["valueName"]) - framework.ExpectEqual(configMap.Labels["test-configmap-static"], testConfigMap.Labels["test-configmap-static"]) - - configMapPatchPayload, err := json.Marshal(v1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Labels: map[string]string{ - "test-configmap": "patched", - }, - }, - Data: map[string]string{ - "valueName": "value1", - }, - }) - framework.ExpectNoError(err, "failed to marshal patch data") - - ginkgo.By("patching the ConfigMap") - _, err = f.ClientSet.CoreV1().ConfigMaps(testNamespaceName).Patch(context.TODO(), testConfigMapName, types.StrategicMergePatchType, []byte(configMapPatchPayload), metav1.PatchOptions{}) - framework.ExpectNoError(err, "failed to patch ConfigMap") - - ginkgo.By("listing all ConfigMaps in all namespaces with a label selector") - configMapList, err := f.ClientSet.CoreV1().ConfigMaps("").List(context.TODO(), metav1.ListOptions{ - LabelSelector: "test-configmap=patched", - }) - framework.ExpectNoError(err, "failed to list ConfigMaps with LabelSelector") - testConfigMapFound := false - for _, cm := range configMapList.Items { - if cm.ObjectMeta.Name == testConfigMap.ObjectMeta.Name && - cm.ObjectMeta.Namespace == testNamespaceName && - cm.ObjectMeta.Labels["test-configmap-static"] == testConfigMap.ObjectMeta.Labels["test-configmap-static"] && - cm.ObjectMeta.Labels["test-configmap"] == "patched" && - cm.Data["valueName"] == "value1" { - testConfigMapFound = true - break - } - } - framework.ExpectEqual(testConfigMapFound, true, "failed to find ConfigMap by label selector") - - ginkgo.By("deleting the ConfigMap by collection with a label selector") - err = f.ClientSet.CoreV1().ConfigMaps(testNamespaceName).DeleteCollection(context.TODO(), metav1.DeleteOptions{}, metav1.ListOptions{ - LabelSelector: "test-configmap-static=true", - }) - framework.ExpectNoError(err, "failed to delete ConfigMap collection with LabelSelector") - - ginkgo.By("listing all ConfigMaps in test namespace") - configMapList, err = f.ClientSet.CoreV1().ConfigMaps(testNamespaceName).List(context.TODO(), metav1.ListOptions{ - LabelSelector: "test-configmap-static=true", - }) - framework.ExpectNoError(err, "failed to list ConfigMap by LabelSelector") - framework.ExpectEqual(len(configMapList.Items), 0, "ConfigMap is still present after being deleted by collection") - }) -}) - -func newEnvFromConfigMap(f *framework.Framework, name string) *v1.ConfigMap { - return &v1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: f.Namespace.Name, - Name: name, - }, - Data: map[string]string{ - "data_1": "value-1", - "data_2": "value-2", - "data_3": "value-3", - }, - } -} - -func newConfigMapWithEmptyKey(f *framework.Framework) (*v1.ConfigMap, error) { - name := "configmap-test-emptyKey-" + string(uuid.NewUUID()) - configMap := &v1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: f.Namespace.Name, - Name: name, - }, - Data: map[string]string{ - "": "value-1", - }, - } - - ginkgo.By(fmt.Sprintf("Creating configMap that has name %s", configMap.Name)) - return f.ClientSet.CoreV1().ConfigMaps(f.Namespace.Name).Create(context.TODO(), configMap, metav1.CreateOptions{}) -} diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/container.go b/vendor/k8s.io/kubernetes/test/e2e/common/container.go deleted file mode 100644 index cd5a2be9e906..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/common/container.go +++ /dev/null @@ -1,135 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package common - -import ( - "context" - "fmt" - "time" - - v1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/uuid" - podutil "k8s.io/kubernetes/pkg/api/v1/pod" - "k8s.io/kubernetes/test/e2e/framework" -) - -const ( - ContainerStatusRetryTimeout = time.Minute * 5 - ContainerStatusPollInterval = time.Second * 1 -) - -// One pod one container -type ConformanceContainer struct { - Container v1.Container - RestartPolicy v1.RestartPolicy - Volumes []v1.Volume - ImagePullSecrets []string - - PodClient *framework.PodClient - podName string - PodSecurityContext *v1.PodSecurityContext -} - -func (cc *ConformanceContainer) Create() { - cc.podName = cc.Container.Name + string(uuid.NewUUID()) - imagePullSecrets := []v1.LocalObjectReference{} - for _, s := range cc.ImagePullSecrets { - imagePullSecrets = append(imagePullSecrets, v1.LocalObjectReference{Name: s}) - } - pod := &v1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - Name: cc.podName, - }, - Spec: v1.PodSpec{ - RestartPolicy: cc.RestartPolicy, - Containers: []v1.Container{ - cc.Container, - }, - SecurityContext: cc.PodSecurityContext, - Volumes: cc.Volumes, - ImagePullSecrets: imagePullSecrets, - }, - } - cc.PodClient.Create(pod) -} - -func (cc *ConformanceContainer) Delete() error { - return cc.PodClient.Delete(context.TODO(), cc.podName, *metav1.NewDeleteOptions(0)) -} - -func (cc *ConformanceContainer) IsReady() (bool, error) { - pod, err := cc.PodClient.Get(context.TODO(), cc.podName, metav1.GetOptions{}) - if err != nil { - return false, err - } - return podutil.IsPodReady(pod), nil -} - -func (cc *ConformanceContainer) GetPhase() (v1.PodPhase, error) { - pod, err := cc.PodClient.Get(context.TODO(), cc.podName, metav1.GetOptions{}) - if err != nil { - return v1.PodUnknown, err - } - return pod.Status.Phase, nil -} - -func (cc *ConformanceContainer) GetStatus() (v1.ContainerStatus, error) { - pod, err := cc.PodClient.Get(context.TODO(), cc.podName, metav1.GetOptions{}) - if err != nil { - return v1.ContainerStatus{}, err - } - statuses := pod.Status.ContainerStatuses - if len(statuses) != 1 || statuses[0].Name != cc.Container.Name { - return v1.ContainerStatus{}, fmt.Errorf("unexpected container statuses %v", statuses) - } - return statuses[0], nil -} - -func (cc *ConformanceContainer) Present() (bool, error) { - _, err := cc.PodClient.Get(context.TODO(), cc.podName, metav1.GetOptions{}) - if err == nil { - return true, nil - } - if apierrors.IsNotFound(err) { - return false, nil - } - return false, err -} - -type ContainerState string - -const ( - ContainerStateWaiting ContainerState = "Waiting" - ContainerStateRunning ContainerState = "Running" - ContainerStateTerminated ContainerState = "Terminated" - ContainerStateUnknown ContainerState = "Unknown" -) - -func GetContainerState(state v1.ContainerState) ContainerState { - if state.Waiting != nil { - return ContainerStateWaiting - } - if state.Running != nil { - return ContainerStateRunning - } - if state.Terminated != nil { - return ContainerStateTerminated - } - return ContainerStateUnknown -} diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/downward_api.go b/vendor/k8s.io/kubernetes/test/e2e/common/downward_api.go deleted file mode 100644 index 22043de61776..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/common/downward_api.go +++ /dev/null @@ -1,426 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package common - -import ( - "fmt" - - v1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/resource" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/uuid" - "k8s.io/kubernetes/test/e2e/framework" - e2enetwork "k8s.io/kubernetes/test/e2e/framework/network" - e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" - imageutils "k8s.io/kubernetes/test/utils/image" - - "github.com/onsi/ginkgo" -) - -var _ = ginkgo.Describe("[sig-node] Downward API", func() { - f := framework.NewDefaultFramework("downward-api") - - /* - Release: v1.9 - Testname: DownwardAPI, environment for name, namespace and ip - Description: Downward API MUST expose Pod and Container fields as environment variables. Specify Pod Name, namespace and IP as environment variable in the Pod Spec are visible at runtime in the container. - */ - framework.ConformanceIt("should provide pod name, namespace and IP address as env vars [NodeConformance]", func() { - podName := "downward-api-" + string(uuid.NewUUID()) - env := []v1.EnvVar{ - { - Name: "POD_NAME", - ValueFrom: &v1.EnvVarSource{ - FieldRef: &v1.ObjectFieldSelector{ - APIVersion: "v1", - FieldPath: "metadata.name", - }, - }, - }, - { - Name: "POD_NAMESPACE", - ValueFrom: &v1.EnvVarSource{ - FieldRef: &v1.ObjectFieldSelector{ - APIVersion: "v1", - FieldPath: "metadata.namespace", - }, - }, - }, - { - Name: "POD_IP", - ValueFrom: &v1.EnvVarSource{ - FieldRef: &v1.ObjectFieldSelector{ - APIVersion: "v1", - FieldPath: "status.podIP", - }, - }, - }, - } - - expectations := []string{ - fmt.Sprintf("POD_NAME=%v", podName), - fmt.Sprintf("POD_NAMESPACE=%v", f.Namespace.Name), - fmt.Sprintf("POD_IP=%v|%v", e2enetwork.RegexIPv4, e2enetwork.RegexIPv6), - } - - testDownwardAPI(f, podName, env, expectations) - }) - - /* - Release: v1.9 - Testname: DownwardAPI, environment for host ip - Description: Downward API MUST expose Pod and Container fields as environment variables. Specify host IP as environment variable in the Pod Spec are visible at runtime in the container. - */ - framework.ConformanceIt("should provide host IP as an env var [NodeConformance]", func() { - podName := "downward-api-" + string(uuid.NewUUID()) - env := []v1.EnvVar{ - { - Name: "HOST_IP", - ValueFrom: &v1.EnvVarSource{ - FieldRef: &v1.ObjectFieldSelector{ - APIVersion: "v1", - FieldPath: "status.hostIP", - }, - }, - }, - } - - expectations := []string{ - fmt.Sprintf("HOST_IP=%v|%v", e2enetwork.RegexIPv4, e2enetwork.RegexIPv6), - } - - testDownwardAPI(f, podName, env, expectations) - }) - - ginkgo.It("should provide host IP and pod IP as an env var if pod uses host network [LinuxOnly]", func() { - podName := "downward-api-" + string(uuid.NewUUID()) - env := []v1.EnvVar{ - { - Name: "HOST_IP", - ValueFrom: &v1.EnvVarSource{ - FieldRef: &v1.ObjectFieldSelector{ - APIVersion: "v1", - FieldPath: "status.hostIP", - }, - }, - }, - { - Name: "POD_IP", - ValueFrom: &v1.EnvVarSource{ - FieldRef: &v1.ObjectFieldSelector{ - APIVersion: "v1", - FieldPath: "status.podIP", - }, - }, - }, - } - - expectations := []string{ - fmt.Sprintf("OK"), - } - - pod := &v1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - Name: podName, - Labels: map[string]string{"name": podName}, - }, - Spec: v1.PodSpec{ - Containers: []v1.Container{ - { - Name: "dapi-container", - Image: imageutils.GetE2EImage(imageutils.BusyBox), - Command: []string{"sh", "-c", `[[ "${HOST_IP:?}" == "${POD_IP:?}" ]] && echo 'OK' || echo "HOST_IP: '${HOST_IP}' != POD_IP: '${POD_IP}'"`}, - Env: env, - }, - }, - HostNetwork: true, - RestartPolicy: v1.RestartPolicyNever, - }, - } - - testDownwardAPIUsingPod(f, pod, env, expectations) - - }) - - /* - Release: v1.9 - Testname: DownwardAPI, environment for CPU and memory limits and requests - Description: Downward API MUST expose CPU request and Memory request set through environment variables at runtime in the container. - */ - framework.ConformanceIt("should provide container's limits.cpu/memory and requests.cpu/memory as env vars [NodeConformance]", func() { - podName := "downward-api-" + string(uuid.NewUUID()) - env := []v1.EnvVar{ - { - Name: "CPU_LIMIT", - ValueFrom: &v1.EnvVarSource{ - ResourceFieldRef: &v1.ResourceFieldSelector{ - Resource: "limits.cpu", - }, - }, - }, - { - Name: "MEMORY_LIMIT", - ValueFrom: &v1.EnvVarSource{ - ResourceFieldRef: &v1.ResourceFieldSelector{ - Resource: "limits.memory", - }, - }, - }, - { - Name: "CPU_REQUEST", - ValueFrom: &v1.EnvVarSource{ - ResourceFieldRef: &v1.ResourceFieldSelector{ - Resource: "requests.cpu", - }, - }, - }, - { - Name: "MEMORY_REQUEST", - ValueFrom: &v1.EnvVarSource{ - ResourceFieldRef: &v1.ResourceFieldSelector{ - Resource: "requests.memory", - }, - }, - }, - } - expectations := []string{ - "CPU_LIMIT=2", - "MEMORY_LIMIT=67108864", - "CPU_REQUEST=1", - "MEMORY_REQUEST=33554432", - } - - testDownwardAPI(f, podName, env, expectations) - }) - - /* - Release: v1.9 - Testname: DownwardAPI, environment for default CPU and memory limits and requests - Description: Downward API MUST expose CPU request and Memory limits set through environment variables at runtime in the container. - */ - framework.ConformanceIt("should provide default limits.cpu/memory from node allocatable [NodeConformance]", func() { - podName := "downward-api-" + string(uuid.NewUUID()) - env := []v1.EnvVar{ - { - Name: "CPU_LIMIT", - ValueFrom: &v1.EnvVarSource{ - ResourceFieldRef: &v1.ResourceFieldSelector{ - Resource: "limits.cpu", - }, - }, - }, - { - Name: "MEMORY_LIMIT", - ValueFrom: &v1.EnvVarSource{ - ResourceFieldRef: &v1.ResourceFieldSelector{ - Resource: "limits.memory", - }, - }, - }, - } - expectations := []string{ - "CPU_LIMIT=[1-9]", - "MEMORY_LIMIT=[1-9]", - } - pod := &v1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - Name: podName, - Labels: map[string]string{"name": podName}, - }, - Spec: v1.PodSpec{ - Containers: []v1.Container{ - { - Name: "dapi-container", - Image: imageutils.GetE2EImage(imageutils.BusyBox), - Command: []string{"sh", "-c", "env"}, - Env: env, - }, - }, - RestartPolicy: v1.RestartPolicyNever, - }, - } - - testDownwardAPIUsingPod(f, pod, env, expectations) - }) - - /* - Release: v1.9 - Testname: DownwardAPI, environment for Pod UID - Description: Downward API MUST expose Pod UID set through environment variables at runtime in the container. - */ - framework.ConformanceIt("should provide pod UID as env vars [NodeConformance]", func() { - podName := "downward-api-" + string(uuid.NewUUID()) - env := []v1.EnvVar{ - { - Name: "POD_UID", - ValueFrom: &v1.EnvVarSource{ - FieldRef: &v1.ObjectFieldSelector{ - APIVersion: "v1", - FieldPath: "metadata.uid", - }, - }, - }, - } - - expectations := []string{ - "POD_UID=[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}", - } - - testDownwardAPI(f, podName, env, expectations) - }) -}) - -var _ = framework.KubeDescribe("Downward API [Serial] [Disruptive] [NodeFeature:EphemeralStorage]", func() { - f := framework.NewDefaultFramework("downward-api") - - ginkgo.Context("Downward API tests for local ephemeral storage", func() { - ginkgo.BeforeEach(func() { - e2eskipper.SkipUnlessLocalEphemeralStorageEnabled() - }) - - ginkgo.It("should provide container's limits.ephemeral-storage and requests.ephemeral-storage as env vars", func() { - podName := "downward-api-" + string(uuid.NewUUID()) - env := []v1.EnvVar{ - { - Name: "EPHEMERAL_STORAGE_LIMIT", - ValueFrom: &v1.EnvVarSource{ - ResourceFieldRef: &v1.ResourceFieldSelector{ - Resource: "limits.ephemeral-storage", - }, - }, - }, - { - Name: "EPHEMERAL_STORAGE_REQUEST", - ValueFrom: &v1.EnvVarSource{ - ResourceFieldRef: &v1.ResourceFieldSelector{ - Resource: "requests.ephemeral-storage", - }, - }, - }, - } - expectations := []string{ - fmt.Sprintf("EPHEMERAL_STORAGE_LIMIT=%d", 64*1024*1024), - fmt.Sprintf("EPHEMERAL_STORAGE_REQUEST=%d", 32*1024*1024), - } - - testDownwardAPIForEphemeralStorage(f, podName, env, expectations) - }) - - ginkgo.It("should provide default limits.ephemeral-storage from node allocatable", func() { - podName := "downward-api-" + string(uuid.NewUUID()) - env := []v1.EnvVar{ - { - Name: "EPHEMERAL_STORAGE_LIMIT", - ValueFrom: &v1.EnvVarSource{ - ResourceFieldRef: &v1.ResourceFieldSelector{ - Resource: "limits.ephemeral-storage", - }, - }, - }, - } - expectations := []string{ - "EPHEMERAL_STORAGE_LIMIT=[1-9]", - } - pod := &v1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - Name: podName, - Labels: map[string]string{"name": podName}, - }, - Spec: v1.PodSpec{ - Containers: []v1.Container{ - { - Name: "dapi-container", - Image: imageutils.GetE2EImage(imageutils.BusyBox), - Command: []string{"sh", "-c", "env"}, - Env: env, - }, - }, - RestartPolicy: v1.RestartPolicyNever, - }, - } - - testDownwardAPIUsingPod(f, pod, env, expectations) - }) - }) - -}) - -func testDownwardAPI(f *framework.Framework, podName string, env []v1.EnvVar, expectations []string) { - pod := &v1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - Name: podName, - Labels: map[string]string{"name": podName}, - }, - Spec: v1.PodSpec{ - Containers: []v1.Container{ - { - Name: "dapi-container", - Image: imageutils.GetE2EImage(imageutils.BusyBox), - Command: []string{"sh", "-c", "env"}, - Resources: v1.ResourceRequirements{ - Requests: v1.ResourceList{ - v1.ResourceCPU: resource.MustParse("250m"), - v1.ResourceMemory: resource.MustParse("32Mi"), - }, - Limits: v1.ResourceList{ - v1.ResourceCPU: resource.MustParse("1250m"), - v1.ResourceMemory: resource.MustParse("64Mi"), - }, - }, - Env: env, - }, - }, - RestartPolicy: v1.RestartPolicyNever, - }, - } - - testDownwardAPIUsingPod(f, pod, env, expectations) -} - -func testDownwardAPIForEphemeralStorage(f *framework.Framework, podName string, env []v1.EnvVar, expectations []string) { - pod := &v1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - Name: podName, - Labels: map[string]string{"name": podName}, - }, - Spec: v1.PodSpec{ - Containers: []v1.Container{ - { - Name: "dapi-container", - Image: imageutils.GetE2EImage(imageutils.BusyBox), - Command: []string{"sh", "-c", "env"}, - Resources: v1.ResourceRequirements{ - Requests: v1.ResourceList{ - v1.ResourceEphemeralStorage: resource.MustParse("32Mi"), - }, - Limits: v1.ResourceList{ - v1.ResourceEphemeralStorage: resource.MustParse("64Mi"), - }, - }, - Env: env, - }, - }, - RestartPolicy: v1.RestartPolicyNever, - }, - } - - testDownwardAPIUsingPod(f, pod, env, expectations) -} - -func testDownwardAPIUsingPod(f *framework.Framework, pod *v1.Pod, env []v1.EnvVar, expectations []string) { - f.TestContainerOutputRegexp("downward api env vars", pod, 0, expectations) -} diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/imports.go b/vendor/k8s.io/kubernetes/test/e2e/common/imports.go new file mode 100644 index 000000000000..e916c9dea629 --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/common/imports.go @@ -0,0 +1,24 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package common + +import ( + // ensure these packages are scanned by ginkgo for e2e tests + _ "k8s.io/kubernetes/test/e2e/common/network" + _ "k8s.io/kubernetes/test/e2e/common/node" + _ "k8s.io/kubernetes/test/e2e/common/storage" +) diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/lease.go b/vendor/k8s.io/kubernetes/test/e2e/common/lease.go deleted file mode 100644 index c1025a3e344a..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/common/lease.go +++ /dev/null @@ -1,168 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package common - -import ( - "context" - "encoding/json" - "fmt" - "time" - - coordinationv1 "k8s.io/api/coordination/v1" - apiequality "k8s.io/apimachinery/pkg/api/equality" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/labels" - "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/util/strategicpatch" - "k8s.io/kubernetes/test/e2e/framework" - "k8s.io/utils/pointer" -) - -func getPatchBytes(oldLease, newLease *coordinationv1.Lease) ([]byte, error) { - oldData, err := json.Marshal(oldLease) - if err != nil { - return nil, fmt.Errorf("failed to Marshal oldData: %v", err) - } - newData, err := json.Marshal(newLease) - if err != nil { - return nil, fmt.Errorf("failed to Marshal newData: %v", err) - } - patchBytes, err := strategicpatch.CreateTwoWayMergePatch(oldData, newData, coordinationv1.Lease{}) - if err != nil { - return nil, fmt.Errorf("failed to CreateTwoWayMergePatch: %v", err) - } - return patchBytes, nil -} - -var _ = framework.KubeDescribe("Lease", func() { - f := framework.NewDefaultFramework("lease-test") - - /* - Release: v1.17 - Testname: lease API should be available - Description: Create Lease object, and get it; create and get MUST be successful and Spec of the - read Lease MUST match Spec of original Lease. Update the Lease and get it; update and get MUST - be successful and Spec of the read Lease MUST match Spec of updated Lease. Patch the Lease and - get it; patch and get MUST be successful and Spec of the read Lease MUST match Spec of patched - Lease. Create a second Lease with labels and list Leases; create and list MUST be successful and - list MUST return both leases. Delete the labels lease via delete collection; the delete MUST be - successful and MUST delete only the labels lease. List leases; list MUST be successful and MUST - return just the remaining lease. Delete the lease; delete MUST be successful. Get the lease; get - MUST return not found error. - */ - framework.ConformanceIt("lease API should be available", func() { - leaseClient := f.ClientSet.CoordinationV1().Leases(f.Namespace.Name) - - name := "lease" - lease := &coordinationv1.Lease{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - }, - Spec: coordinationv1.LeaseSpec{ - HolderIdentity: pointer.StringPtr("holder"), - LeaseDurationSeconds: pointer.Int32Ptr(30), - AcquireTime: &metav1.MicroTime{Time: time.Time{}.Add(2 * time.Second)}, - RenewTime: &metav1.MicroTime{Time: time.Time{}.Add(5 * time.Second)}, - LeaseTransitions: pointer.Int32Ptr(0), - }, - } - - createdLease, err := leaseClient.Create(context.TODO(), lease, metav1.CreateOptions{}) - framework.ExpectNoError(err, "creating Lease failed") - - readLease, err := leaseClient.Get(context.TODO(), name, metav1.GetOptions{}) - framework.ExpectNoError(err, "couldn't read Lease") - framework.ExpectEqual(apiequality.Semantic.DeepEqual(lease.Spec, readLease.Spec), true) - - createdLease.Spec = coordinationv1.LeaseSpec{ - HolderIdentity: pointer.StringPtr("holder2"), - LeaseDurationSeconds: pointer.Int32Ptr(30), - AcquireTime: &metav1.MicroTime{Time: time.Time{}.Add(20 * time.Second)}, - RenewTime: &metav1.MicroTime{Time: time.Time{}.Add(50 * time.Second)}, - LeaseTransitions: pointer.Int32Ptr(1), - } - - _, err = leaseClient.Update(context.TODO(), createdLease, metav1.UpdateOptions{}) - framework.ExpectNoError(err, "updating Lease failed") - - readLease, err = leaseClient.Get(context.TODO(), name, metav1.GetOptions{}) - framework.ExpectNoError(err, "couldn't read Lease") - framework.ExpectEqual(apiequality.Semantic.DeepEqual(createdLease.Spec, readLease.Spec), true) - - patchedLease := readLease.DeepCopy() - patchedLease.Spec = coordinationv1.LeaseSpec{ - HolderIdentity: pointer.StringPtr("holder3"), - LeaseDurationSeconds: pointer.Int32Ptr(60), - AcquireTime: &metav1.MicroTime{Time: time.Time{}.Add(50 * time.Second)}, - RenewTime: &metav1.MicroTime{Time: time.Time{}.Add(70 * time.Second)}, - LeaseTransitions: pointer.Int32Ptr(2), - } - patchBytes, err := getPatchBytes(readLease, patchedLease) - framework.ExpectNoError(err, "creating patch failed") - - _, err = leaseClient.Patch(context.TODO(), name, types.StrategicMergePatchType, patchBytes, metav1.PatchOptions{}) - framework.ExpectNoError(err, "patching Lease failed") - - readLease, err = leaseClient.Get(context.TODO(), name, metav1.GetOptions{}) - framework.ExpectNoError(err, "couldn't read Lease") - framework.ExpectEqual(apiequality.Semantic.DeepEqual(patchedLease.Spec, readLease.Spec), true) - - name2 := "lease2" - lease2 := &coordinationv1.Lease{ - ObjectMeta: metav1.ObjectMeta{ - Name: name2, - Labels: map[string]string{"deletecollection": "true"}, - }, - Spec: coordinationv1.LeaseSpec{ - HolderIdentity: pointer.StringPtr("holder"), - LeaseDurationSeconds: pointer.Int32Ptr(30), - AcquireTime: &metav1.MicroTime{Time: time.Time{}.Add(2 * time.Second)}, - RenewTime: &metav1.MicroTime{Time: time.Time{}.Add(5 * time.Second)}, - LeaseTransitions: pointer.Int32Ptr(0), - }, - } - _, err = leaseClient.Create(context.TODO(), lease2, metav1.CreateOptions{}) - framework.ExpectNoError(err, "creating Lease failed") - - leases, err := leaseClient.List(context.TODO(), metav1.ListOptions{}) - framework.ExpectNoError(err, "couldn't list Leases") - framework.ExpectEqual(len(leases.Items), 2) - - selector := labels.Set(map[string]string{"deletecollection": "true"}).AsSelector() - err = leaseClient.DeleteCollection(context.TODO(), metav1.DeleteOptions{}, metav1.ListOptions{LabelSelector: selector.String()}) - framework.ExpectNoError(err, "couldn't delete collection") - - leases, err = leaseClient.List(context.TODO(), metav1.ListOptions{}) - framework.ExpectNoError(err, "couldn't list Leases") - framework.ExpectEqual(len(leases.Items), 1) - - err = leaseClient.Delete(context.TODO(), name, metav1.DeleteOptions{}) - framework.ExpectNoError(err, "deleting Lease failed") - - _, err = leaseClient.Get(context.TODO(), name, metav1.GetOptions{}) - framework.ExpectEqual(apierrors.IsNotFound(err), true) - - leaseClient = f.ClientSet.CoordinationV1().Leases(metav1.NamespaceAll) - // Number of leases may be high in large clusters, as Lease object is - // created for every node by the corresponding Kubelet. - // That said, the objects themselves are small (~300B), so even with 5000 - // of them, that gives ~1.5MB, which is acceptable. - _, err = leaseClient.List(context.TODO(), metav1.ListOptions{}) - framework.ExpectNoError(err, "couldn't list Leases from all namespace") - }) -}) diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/network/OWNERS b/vendor/k8s.io/kubernetes/test/e2e/common/network/OWNERS new file mode 100644 index 000000000000..28e83cd675f9 --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/common/network/OWNERS @@ -0,0 +1,4 @@ +# See the OWNERS docs at https://go.k8s.io/owners + +labels: +- sig/network diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/network/framework.go b/vendor/k8s.io/kubernetes/test/e2e/common/network/framework.go new file mode 100644 index 000000000000..2a197e9e02a1 --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/common/network/framework.go @@ -0,0 +1,24 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package network + +import "github.com/onsi/ginkgo" + +// SIGDescribe annotates the test with the SIG label. +func SIGDescribe(text string, body func()) bool { + return ginkgo.Describe("[sig-network] "+text, body) +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/networking.go b/vendor/k8s.io/kubernetes/test/e2e/common/network/networking.go similarity index 99% rename from vendor/k8s.io/kubernetes/test/e2e/common/networking.go rename to vendor/k8s.io/kubernetes/test/e2e/common/network/networking.go index 6af8233b8315..55dc0d3e00a1 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/common/networking.go +++ b/vendor/k8s.io/kubernetes/test/e2e/common/network/networking.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package common +package network import ( "github.com/onsi/ginkgo" @@ -24,7 +24,7 @@ import ( e2enetwork "k8s.io/kubernetes/test/e2e/framework/network" ) -var _ = ginkgo.Describe("[sig-network] Networking", func() { +var _ = SIGDescribe("Networking", func() { f := framework.NewDefaultFramework("pod-network-test") ginkgo.Describe("Granular Checks: Pods", func() { diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/node/OWNERS b/vendor/k8s.io/kubernetes/test/e2e/common/node/OWNERS new file mode 100644 index 000000000000..796ef76252d6 --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/common/node/OWNERS @@ -0,0 +1,4 @@ +# See the OWNERS docs at https://go.k8s.io/owners + +labels: +- sig/node diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/node/configmap.go b/vendor/k8s.io/kubernetes/test/e2e/common/node/configmap.go new file mode 100644 index 000000000000..b9655fcbb876 --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/common/node/configmap.go @@ -0,0 +1,284 @@ +/* +Copyright 2016 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package node + +import ( + "context" + "encoding/json" + "fmt" + + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/uuid" + "k8s.io/kubernetes/test/e2e/framework" + imageutils "k8s.io/kubernetes/test/utils/image" + + "github.com/onsi/ginkgo" +) + +var _ = SIGDescribe("ConfigMap", func() { + f := framework.NewDefaultFramework("configmap") + + /* + Release: v1.9 + Testname: ConfigMap, from environment field + Description: Create a Pod with an environment variable value set using a value from ConfigMap. A ConfigMap value MUST be accessible in the container environment. + */ + framework.ConformanceIt("should be consumable via environment variable [NodeConformance]", func() { + name := "configmap-test-" + string(uuid.NewUUID()) + configMap := newConfigMap(f, name) + ginkgo.By(fmt.Sprintf("Creating configMap %v/%v", f.Namespace.Name, configMap.Name)) + var err error + if configMap, err = f.ClientSet.CoreV1().ConfigMaps(f.Namespace.Name).Create(context.TODO(), configMap, metav1.CreateOptions{}); err != nil { + framework.Failf("unable to create test configMap %s: %v", configMap.Name, err) + } + + pod := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pod-configmaps-" + string(uuid.NewUUID()), + }, + Spec: v1.PodSpec{ + Containers: []v1.Container{ + { + Name: "env-test", + Image: imageutils.GetE2EImage(imageutils.BusyBox), + Command: []string{"sh", "-c", "env"}, + Env: []v1.EnvVar{ + { + Name: "CONFIG_DATA_1", + ValueFrom: &v1.EnvVarSource{ + ConfigMapKeyRef: &v1.ConfigMapKeySelector{ + LocalObjectReference: v1.LocalObjectReference{ + Name: name, + }, + Key: "data-1", + }, + }, + }, + }, + }, + }, + RestartPolicy: v1.RestartPolicyNever, + }, + } + + f.TestContainerOutput("consume configMaps", pod, 0, []string{ + "CONFIG_DATA_1=value-1", + }) + }) + + /* + Release: v1.9 + Testname: ConfigMap, from environment variables + Description: Create a Pod with a environment source from ConfigMap. All ConfigMap values MUST be available as environment variables in the container. + */ + framework.ConformanceIt("should be consumable via the environment [NodeConformance]", func() { + name := "configmap-test-" + string(uuid.NewUUID()) + configMap := newEnvFromConfigMap(f, name) + ginkgo.By(fmt.Sprintf("Creating configMap %v/%v", f.Namespace.Name, configMap.Name)) + var err error + if configMap, err = f.ClientSet.CoreV1().ConfigMaps(f.Namespace.Name).Create(context.TODO(), configMap, metav1.CreateOptions{}); err != nil { + framework.Failf("unable to create test configMap %s: %v", configMap.Name, err) + } + + pod := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pod-configmaps-" + string(uuid.NewUUID()), + }, + Spec: v1.PodSpec{ + Containers: []v1.Container{ + { + Name: "env-test", + Image: imageutils.GetE2EImage(imageutils.BusyBox), + Command: []string{"sh", "-c", "env"}, + EnvFrom: []v1.EnvFromSource{ + { + ConfigMapRef: &v1.ConfigMapEnvSource{LocalObjectReference: v1.LocalObjectReference{Name: name}}, + }, + { + Prefix: "p_", + ConfigMapRef: &v1.ConfigMapEnvSource{LocalObjectReference: v1.LocalObjectReference{Name: name}}, + }, + }, + }, + }, + RestartPolicy: v1.RestartPolicyNever, + }, + } + + f.TestContainerOutput("consume configMaps", pod, 0, []string{ + "data_1=value-1", "data_2=value-2", "data_3=value-3", + "p_data_1=value-1", "p_data_2=value-2", "p_data_3=value-3", + }) + }) + + /* + Release: v1.14 + Testname: ConfigMap, with empty-key + Description: Attempt to create a ConfigMap with an empty key. The creation MUST fail. + */ + framework.ConformanceIt("should fail to create ConfigMap with empty key", func() { + configMap, err := newConfigMapWithEmptyKey(f) + framework.ExpectError(err, "created configMap %q with empty key in namespace %q", configMap.Name, f.Namespace.Name) + }) + + ginkgo.It("should update ConfigMap successfully", func() { + name := "configmap-test-" + string(uuid.NewUUID()) + configMap := newConfigMap(f, name) + ginkgo.By(fmt.Sprintf("Creating ConfigMap %v/%v", f.Namespace.Name, configMap.Name)) + _, err := f.ClientSet.CoreV1().ConfigMaps(f.Namespace.Name).Create(context.TODO(), configMap, metav1.CreateOptions{}) + framework.ExpectNoError(err, "failed to create ConfigMap") + + configMap.Data = map[string]string{ + "data": "value", + } + ginkgo.By(fmt.Sprintf("Updating configMap %v/%v", f.Namespace.Name, configMap.Name)) + _, err = f.ClientSet.CoreV1().ConfigMaps(f.Namespace.Name).Update(context.TODO(), configMap, metav1.UpdateOptions{}) + framework.ExpectNoError(err, "failed to update ConfigMap") + + configMapFromUpdate, err := f.ClientSet.CoreV1().ConfigMaps(f.Namespace.Name).Get(context.TODO(), name, metav1.GetOptions{}) + framework.ExpectNoError(err, "failed to get ConfigMap") + ginkgo.By(fmt.Sprintf("Verifying update of ConfigMap %v/%v", f.Namespace.Name, configMap.Name)) + framework.ExpectEqual(configMapFromUpdate.Data, configMap.Data) + }) + + /* + Release: v1.19 + Testname: ConfigMap lifecycle + Description: Attempt to create a ConfigMap. Patch the created ConfigMap. Fetching the ConfigMap MUST reflect changes. + By fetching all the ConfigMaps via a Label selector it MUST find the ConfigMap by it's static label and updated value. The ConfigMap must be deleted by Collection. + */ + framework.ConformanceIt("should run through a ConfigMap lifecycle", func() { + testNamespaceName := f.Namespace.Name + testConfigMapName := "test-configmap" + string(uuid.NewUUID()) + + testConfigMap := v1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: testConfigMapName, + Labels: map[string]string{ + "test-configmap-static": "true", + }, + }, + Data: map[string]string{ + "valueName": "value", + }, + } + + ginkgo.By("creating a ConfigMap") + _, err := f.ClientSet.CoreV1().ConfigMaps(testNamespaceName).Create(context.TODO(), &testConfigMap, metav1.CreateOptions{}) + framework.ExpectNoError(err, "failed to create ConfigMap") + + ginkgo.By("fetching the ConfigMap") + configMap, err := f.ClientSet.CoreV1().ConfigMaps(testNamespaceName).Get(context.TODO(), testConfigMapName, metav1.GetOptions{}) + framework.ExpectNoError(err, "failed to get ConfigMap") + framework.ExpectEqual(configMap.Data["valueName"], testConfigMap.Data["valueName"]) + framework.ExpectEqual(configMap.Labels["test-configmap-static"], testConfigMap.Labels["test-configmap-static"]) + + configMapPatchPayload, err := json.Marshal(v1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{ + "test-configmap": "patched", + }, + }, + Data: map[string]string{ + "valueName": "value1", + }, + }) + framework.ExpectNoError(err, "failed to marshal patch data") + + ginkgo.By("patching the ConfigMap") + _, err = f.ClientSet.CoreV1().ConfigMaps(testNamespaceName).Patch(context.TODO(), testConfigMapName, types.StrategicMergePatchType, []byte(configMapPatchPayload), metav1.PatchOptions{}) + framework.ExpectNoError(err, "failed to patch ConfigMap") + + ginkgo.By("listing all ConfigMaps in all namespaces with a label selector") + configMapList, err := f.ClientSet.CoreV1().ConfigMaps("").List(context.TODO(), metav1.ListOptions{ + LabelSelector: "test-configmap=patched", + }) + framework.ExpectNoError(err, "failed to list ConfigMaps with LabelSelector") + testConfigMapFound := false + for _, cm := range configMapList.Items { + if cm.ObjectMeta.Name == testConfigMap.ObjectMeta.Name && + cm.ObjectMeta.Namespace == testNamespaceName && + cm.ObjectMeta.Labels["test-configmap-static"] == testConfigMap.ObjectMeta.Labels["test-configmap-static"] && + cm.ObjectMeta.Labels["test-configmap"] == "patched" && + cm.Data["valueName"] == "value1" { + testConfigMapFound = true + break + } + } + framework.ExpectEqual(testConfigMapFound, true, "failed to find ConfigMap by label selector") + + ginkgo.By("deleting the ConfigMap by collection with a label selector") + err = f.ClientSet.CoreV1().ConfigMaps(testNamespaceName).DeleteCollection(context.TODO(), metav1.DeleteOptions{}, metav1.ListOptions{ + LabelSelector: "test-configmap-static=true", + }) + framework.ExpectNoError(err, "failed to delete ConfigMap collection with LabelSelector") + + ginkgo.By("listing all ConfigMaps in test namespace") + configMapList, err = f.ClientSet.CoreV1().ConfigMaps(testNamespaceName).List(context.TODO(), metav1.ListOptions{ + LabelSelector: "test-configmap-static=true", + }) + framework.ExpectNoError(err, "failed to list ConfigMap by LabelSelector") + framework.ExpectEqual(len(configMapList.Items), 0, "ConfigMap is still present after being deleted by collection") + }) +}) + +func newConfigMap(f *framework.Framework, name string) *v1.ConfigMap { + return &v1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: f.Namespace.Name, + Name: name, + }, + Data: map[string]string{ + "data-1": "value-1", + "data-2": "value-2", + "data-3": "value-3", + }, + } +} + +// TODO: Unify with newConfigMap +func newEnvFromConfigMap(f *framework.Framework, name string) *v1.ConfigMap { + return &v1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: f.Namespace.Name, + Name: name, + }, + Data: map[string]string{ + "data_1": "value-1", + "data_2": "value-2", + "data_3": "value-3", + }, + } +} + +func newConfigMapWithEmptyKey(f *framework.Framework) (*v1.ConfigMap, error) { + name := "configmap-test-emptyKey-" + string(uuid.NewUUID()) + configMap := &v1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: f.Namespace.Name, + Name: name, + }, + Data: map[string]string{ + "": "value-1", + }, + } + + ginkgo.By(fmt.Sprintf("Creating configMap that has name %s", configMap.Name)) + return f.ClientSet.CoreV1().ConfigMaps(f.Namespace.Name).Create(context.TODO(), configMap, metav1.CreateOptions{}) +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/node/container.go b/vendor/k8s.io/kubernetes/test/e2e/common/node/container.go new file mode 100644 index 000000000000..89efb24ae4b7 --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/common/node/container.go @@ -0,0 +1,150 @@ +/* +Copyright 2016 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package node + +import ( + "context" + "fmt" + "time" + + v1 "k8s.io/api/core/v1" + apierrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/uuid" + podutil "k8s.io/kubernetes/pkg/api/v1/pod" + "k8s.io/kubernetes/test/e2e/framework" +) + +const ( + // ContainerStatusRetryTimeout represents polling threshold before giving up to get the container status + ContainerStatusRetryTimeout = time.Minute * 5 + // ContainerStatusPollInterval represents duration between polls to get the container status + ContainerStatusPollInterval = time.Second * 1 +) + +// ConformanceContainer defines the types for running container conformance test cases +// One pod one container +type ConformanceContainer struct { + Container v1.Container + RestartPolicy v1.RestartPolicy + Volumes []v1.Volume + ImagePullSecrets []string + + PodClient *framework.PodClient + podName string + PodSecurityContext *v1.PodSecurityContext +} + +// Create creates the defined conformance container +func (cc *ConformanceContainer) Create() { + cc.podName = cc.Container.Name + string(uuid.NewUUID()) + imagePullSecrets := []v1.LocalObjectReference{} + for _, s := range cc.ImagePullSecrets { + imagePullSecrets = append(imagePullSecrets, v1.LocalObjectReference{Name: s}) + } + pod := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: cc.podName, + }, + Spec: v1.PodSpec{ + RestartPolicy: cc.RestartPolicy, + Containers: []v1.Container{ + cc.Container, + }, + SecurityContext: cc.PodSecurityContext, + Volumes: cc.Volumes, + ImagePullSecrets: imagePullSecrets, + }, + } + cc.PodClient.Create(pod) +} + +// Delete deletes the defined conformance container +func (cc *ConformanceContainer) Delete() error { + return cc.PodClient.Delete(context.TODO(), cc.podName, *metav1.NewDeleteOptions(0)) +} + +// IsReady returns whether this container is ready and error if any +func (cc *ConformanceContainer) IsReady() (bool, error) { + pod, err := cc.PodClient.Get(context.TODO(), cc.podName, metav1.GetOptions{}) + if err != nil { + return false, err + } + return podutil.IsPodReady(pod), nil +} + +// GetPhase returns the phase of the pod lifecycle and error if any +func (cc *ConformanceContainer) GetPhase() (v1.PodPhase, error) { + pod, err := cc.PodClient.Get(context.TODO(), cc.podName, metav1.GetOptions{}) + if err != nil { + return v1.PodUnknown, err + } + return pod.Status.Phase, nil +} + +// GetStatus returns the details of the current status of this container and error if any +func (cc *ConformanceContainer) GetStatus() (v1.ContainerStatus, error) { + pod, err := cc.PodClient.Get(context.TODO(), cc.podName, metav1.GetOptions{}) + if err != nil { + return v1.ContainerStatus{}, err + } + statuses := pod.Status.ContainerStatuses + if len(statuses) != 1 || statuses[0].Name != cc.Container.Name { + return v1.ContainerStatus{}, fmt.Errorf("unexpected container statuses %v", statuses) + } + return statuses[0], nil +} + +// Present returns whether this pod is present and error if any +func (cc *ConformanceContainer) Present() (bool, error) { + _, err := cc.PodClient.Get(context.TODO(), cc.podName, metav1.GetOptions{}) + if err == nil { + return true, nil + } + if apierrors.IsNotFound(err) { + return false, nil + } + return false, err +} + +// ContainerState represents different states of its lifecycle +type ContainerState string + +const ( + // ContainerStateWaiting represents 'Waiting' container state + ContainerStateWaiting ContainerState = "Waiting" + // ContainerStateRunning represents 'Running' container state + ContainerStateRunning ContainerState = "Running" + // ContainerStateTerminated represents 'Terminated' container state + ContainerStateTerminated ContainerState = "Terminated" + // ContainerStateUnknown represents 'Unknown' container state + ContainerStateUnknown ContainerState = "Unknown" +) + +// GetContainerState returns current state the container represents among its lifecyle +func GetContainerState(state v1.ContainerState) ContainerState { + if state.Waiting != nil { + return ContainerStateWaiting + } + if state.Running != nil { + return ContainerStateRunning + } + if state.Terminated != nil { + return ContainerStateTerminated + } + return ContainerStateUnknown +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/container_probe.go b/vendor/k8s.io/kubernetes/test/e2e/common/node/container_probe.go similarity index 84% rename from vendor/k8s.io/kubernetes/test/e2e/common/container_probe.go rename to vendor/k8s.io/kubernetes/test/e2e/common/node/container_probe.go index 59e0315ad9aa..87edaf575d79 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/common/container_probe.go +++ b/vendor/k8s.io/kubernetes/test/e2e/common/node/container_probe.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package common +package node import ( "context" @@ -32,6 +32,7 @@ import ( "k8s.io/kubernetes/test/e2e/framework" e2eevents "k8s.io/kubernetes/test/e2e/framework/events" e2epod "k8s.io/kubernetes/test/e2e/framework/pod" + e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" testutils "k8s.io/kubernetes/test/utils" "github.com/onsi/ginkgo" @@ -45,7 +46,7 @@ const ( defaultObservationTimeout = time.Minute * 4 ) -var _ = framework.KubeDescribe("Probing container", func() { +var _ = SIGDescribe("Probing container", func() { f := framework.NewDefaultFramework("container-probe") var podClient *framework.PodClient probe := webserverProbeBuilder{} @@ -210,10 +211,13 @@ var _ = framework.KubeDescribe("Probing container", func() { /* Release: v1.9 - Testname: Pod liveness probe, docker exec, restart - Description: A Pod is created with liveness probe with a Exec action on the Pod. If the liveness probe call does not return within the timeout specified, liveness probe MUST restart the Pod. + Testname: Pod liveness probe, container exec timeout, restart + Description: A Pod is created with liveness probe with a Exec action on the Pod. If the liveness probe call does not return within the timeout specified, liveness probe MUST restart the Pod. */ - ginkgo.It("should be restarted with a docker exec liveness probe with timeout ", func() { + ginkgo.It("should be restarted with an exec liveness probe with timeout [MinimumKubeletVersion:1.20] [NodeConformance]", func() { + // The ExecProbeTimeout feature gate exists to allow backwards-compatibility with pre-1.20 cluster behaviors, where livenessProbe timeouts were ignored + // If ExecProbeTimeout feature gate is disabled, timeout enforcement for exec livenessProbes is disabled, so we should skip this test + e2eskipper.SkipUnlessExecProbeTimeoutEnabled() cmd := []string{"/bin/sh", "-c", "sleep 600"} livenessProbe := &v1.Probe{ Handler: execHandler([]string{"/bin/sh", "-c", "sleep 10"}), @@ -227,10 +231,10 @@ var _ = framework.KubeDescribe("Probing container", func() { /* Release: v1.20 - Testname: Pod readiness probe, docker exec, not ready + Testname: Pod readiness probe, container exec timeout, not ready Description: A Pod is created with readiness probe with a Exec action on the Pod. If the readiness probe call does not return within the timeout specified, readiness probe MUST not be Ready. */ - ginkgo.It("should not be ready with a docker exec readiness probe timeout ", func() { + ginkgo.It("should not be ready with an exec readiness probe timeout [MinimumKubeletVersion:1.20] [NodeConformance]", func() { cmd := []string{"/bin/sh", "-c", "sleep 600"} readinessProbe := &v1.Probe{ Handler: execHandler([]string{"/bin/sh", "-c", "sleep 10"}), @@ -373,22 +377,15 @@ var _ = framework.KubeDescribe("Probing container", func() { Testname: Pod readiness probe, delayed by startup probe Description: A Pod is created with startup and readiness probes. The Container is started by creating /tmp/startup after 45 seconds, delaying the ready state by this amount of time. This is similar to the "Pod readiness probe, with initial delay" test. */ - ginkgo.It("should not be ready until startupProbe succeeds", func() { - cmd := []string{"/bin/sh", "-c", "echo ok >/tmp/health; sleep 45; echo ok >/tmp/startup; sleep 600"} + ginkgo.It("should be ready immediately after startupProbe succeeds", func() { + cmd := []string{"/bin/sh", "-c", "echo ok >/tmp/health; sleep 10; echo ok >/tmp/startup; sleep 600"} readinessProbe := &v1.Probe{ - Handler: v1.Handler{ - Exec: &v1.ExecAction{ - Command: []string{"cat", "/tmp/health"}, - }, - }, + Handler: execHandler([]string{"/bin/cat", "/tmp/health"}), InitialDelaySeconds: 0, + PeriodSeconds: 60, } startupProbe := &v1.Probe{ - Handler: v1.Handler{ - Exec: &v1.ExecAction{ - Command: []string{"cat", "/tmp/startup"}, - }, - }, + Handler: execHandler([]string{"/bin/cat", "/tmp/startup"}), InitialDelaySeconds: 0, FailureThreshold: 60, } @@ -397,7 +394,15 @@ var _ = framework.KubeDescribe("Probing container", func() { p, err := podClient.Get(context.TODO(), p.Name, metav1.GetOptions{}) framework.ExpectNoError(err) - e2epod.WaitTimeoutForPodReadyInNamespace(f.ClientSet, p.Name, f.Namespace.Name, framework.PodStartTimeout) + err = e2epod.WaitForPodContainerStarted(f.ClientSet, f.Namespace.Name, p.Name, 0, framework.PodStartTimeout) + framework.ExpectNoError(err) + startedTime := time.Now() + + // We assume the pod became ready when the container became ready. This + // is true for a single container pod. + err = e2epod.WaitTimeoutForPodReadyInNamespace(f.ClientSet, p.Name, f.Namespace.Name, framework.PodStartTimeout) + framework.ExpectNoError(err) + readyTime := time.Now() p, err = podClient.Get(context.TODO(), p.Name, metav1.GetOptions{}) framework.ExpectNoError(err) @@ -406,20 +411,79 @@ var _ = framework.KubeDescribe("Probing container", func() { framework.ExpectNoError(err) framework.ExpectEqual(isReady, true, "pod should be ready") - // We assume the pod became ready when the container became ready. This - // is true for a single container pod. - readyTime, err := GetTransitionTimeForReadyCondition(p) - framework.ExpectNoError(err) - startedTime, err := GetContainerStartedTime(p, "busybox") - framework.ExpectNoError(err) - - framework.Logf("Container started at %v, pod became ready at %v", startedTime, readyTime) - if readyTime.Sub(startedTime) < 40*time.Second { + readyIn := readyTime.Sub(startedTime) + framework.Logf("Container started at %v, pod became ready at %v, %v after startupProbe succeeded", startedTime, readyTime, readyIn) + if readyIn < 0 { framework.Failf("Pod became ready before startupProbe succeeded") } + if readyIn > 5*time.Second { + framework.Failf("Pod became ready in %v, more than 5s after startupProbe succeeded. It means that the delay readiness probes were not initiated immediately after startup finished.", readyIn) + } + }) + + /* + Release: v1.21 + Testname: Set terminationGracePeriodSeconds for livenessProbe + Description: A pod with a long terminationGracePeriod is created with a shorter livenessProbe-level terminationGracePeriodSeconds. We confirm the shorter termination period is used. + */ + ginkgo.It("should override timeoutGracePeriodSeconds when LivenessProbe field is set [Feature:ProbeTerminationGracePeriod]", func() { + pod := e2epod.NewAgnhostPod(f.Namespace.Name, "liveness-override-"+string(uuid.NewUUID()), nil, nil, nil, "/bin/sh", "-c", "sleep 1000") + longGracePeriod := int64(500) + pod.Spec.TerminationGracePeriodSeconds = &longGracePeriod + + // probe will fail since pod has no http endpoints + shortGracePeriod := int64(5) + pod.Spec.Containers[0].LivenessProbe = &v1.Probe{ + Handler: v1.Handler{ + HTTPGet: &v1.HTTPGetAction{ + Path: "/healthz", + Port: intstr.FromInt(8080), + }, + }, + InitialDelaySeconds: 10, + FailureThreshold: 1, + TerminationGracePeriodSeconds: &shortGracePeriod, + } + + // 10s delay + 10s period + 5s grace period = 25s < 30s << pod-level timeout 500 + RunLivenessTest(f, pod, 1, time.Second*30) + }) + + /* + Release: v1.21 + Testname: Set terminationGracePeriodSeconds for startupProbe + Description: A pod with a long terminationGracePeriod is created with a shorter startupProbe-level terminationGracePeriodSeconds. We confirm the shorter termination period is used. + */ + ginkgo.It("should override timeoutGracePeriodSeconds when StartupProbe field is set [Feature:ProbeTerminationGracePeriod]", func() { + pod := e2epod.NewAgnhostPod(f.Namespace.Name, "startup-override-"+string(uuid.NewUUID()), nil, nil, nil, "/bin/sh", "-c", "sleep 1000") + longGracePeriod := int64(500) + pod.Spec.TerminationGracePeriodSeconds = &longGracePeriod + + // startup probe will fail since pod will sleep for 1000s before becoming ready + shortGracePeriod := int64(5) + pod.Spec.Containers[0].StartupProbe = &v1.Probe{ + Handler: execHandler([]string{"/bin/cat", "/tmp/startup"}), + InitialDelaySeconds: 10, + FailureThreshold: 1, + TerminationGracePeriodSeconds: &shortGracePeriod, + } + // liveness probe always succeeds + pod.Spec.Containers[0].LivenessProbe = &v1.Probe{ + Handler: v1.Handler{ + Exec: &v1.ExecAction{ + Command: []string{"/bin/true"}, + }, + }, + InitialDelaySeconds: 15, + FailureThreshold: 1, + } + + // 10s delay + 10s period + 5s grace period = 25s < 30s << pod-level timeout 500 + RunLivenessTest(f, pod, 1, time.Second*30) }) }) +// GetContainerStartedTime returns the time when the given container started and error if any func GetContainerStartedTime(p *v1.Pod, containerName string) (time.Time, error) { for _, status := range p.Status.ContainerStatuses { if status.Name != containerName { @@ -433,6 +497,7 @@ func GetContainerStartedTime(p *v1.Pod, containerName string) (time.Time, error) return time.Time{}, fmt.Errorf("cannot find container named %q", containerName) } +// GetTransitionTimeForReadyCondition returns the time when the given pod became ready and error if any func GetTransitionTimeForReadyCondition(p *v1.Pod) (time.Time, error) { for _, cond := range p.Status.Conditions { if cond.Type == v1.PodReady { @@ -570,6 +635,7 @@ func (b webserverProbeBuilder) build() *v1.Probe { return probe } +// RunLivenessTest verifies the number of restarts for pod with given expected number of restarts func RunLivenessTest(f *framework.Framework, pod *v1.Pod, expectNumRestarts int, timeout time.Duration) { podClient := f.PodClient() ns := f.Namespace.Name diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/docker_containers.go b/vendor/k8s.io/kubernetes/test/e2e/common/node/docker_containers.go similarity index 98% rename from vendor/k8s.io/kubernetes/test/e2e/common/docker_containers.go rename to vendor/k8s.io/kubernetes/test/e2e/common/node/docker_containers.go index 7388c75857a7..9bd8ba685cad 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/common/docker_containers.go +++ b/vendor/k8s.io/kubernetes/test/e2e/common/node/docker_containers.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package common +package node import ( "github.com/onsi/gomega" @@ -25,7 +25,7 @@ import ( e2epod "k8s.io/kubernetes/test/e2e/framework/pod" ) -var _ = framework.KubeDescribe("Docker Containers", func() { +var _ = SIGDescribe("Docker Containers", func() { f := framework.NewDefaultFramework("containers") /* diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/node/downwardapi.go b/vendor/k8s.io/kubernetes/test/e2e/common/node/downwardapi.go new file mode 100644 index 000000000000..1f1b32be9144 --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/common/node/downwardapi.go @@ -0,0 +1,424 @@ +/* +Copyright 2016 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package node + +import ( + "fmt" + + v1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/uuid" + "k8s.io/kubernetes/test/e2e/framework" + e2enetwork "k8s.io/kubernetes/test/e2e/framework/network" + e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" + imageutils "k8s.io/kubernetes/test/utils/image" + + "github.com/onsi/ginkgo" +) + +var _ = SIGDescribe("Downward API", func() { + f := framework.NewDefaultFramework("downward-api") + + /* + Release: v1.9 + Testname: DownwardAPI, environment for name, namespace and ip + Description: Downward API MUST expose Pod and Container fields as environment variables. Specify Pod Name, namespace and IP as environment variable in the Pod Spec are visible at runtime in the container. + */ + framework.ConformanceIt("should provide pod name, namespace and IP address as env vars [NodeConformance]", func() { + podName := "downward-api-" + string(uuid.NewUUID()) + env := []v1.EnvVar{ + { + Name: "POD_NAME", + ValueFrom: &v1.EnvVarSource{ + FieldRef: &v1.ObjectFieldSelector{ + APIVersion: "v1", + FieldPath: "metadata.name", + }, + }, + }, + { + Name: "POD_NAMESPACE", + ValueFrom: &v1.EnvVarSource{ + FieldRef: &v1.ObjectFieldSelector{ + APIVersion: "v1", + FieldPath: "metadata.namespace", + }, + }, + }, + { + Name: "POD_IP", + ValueFrom: &v1.EnvVarSource{ + FieldRef: &v1.ObjectFieldSelector{ + APIVersion: "v1", + FieldPath: "status.podIP", + }, + }, + }, + } + + expectations := []string{ + fmt.Sprintf("POD_NAME=%v", podName), + fmt.Sprintf("POD_NAMESPACE=%v", f.Namespace.Name), + fmt.Sprintf("POD_IP=%v|%v", e2enetwork.RegexIPv4, e2enetwork.RegexIPv6), + } + + testDownwardAPI(f, podName, env, expectations) + }) + + /* + Release: v1.9 + Testname: DownwardAPI, environment for host ip + Description: Downward API MUST expose Pod and Container fields as environment variables. Specify host IP as environment variable in the Pod Spec are visible at runtime in the container. + */ + framework.ConformanceIt("should provide host IP as an env var [NodeConformance]", func() { + podName := "downward-api-" + string(uuid.NewUUID()) + env := []v1.EnvVar{ + { + Name: "HOST_IP", + ValueFrom: &v1.EnvVarSource{ + FieldRef: &v1.ObjectFieldSelector{ + APIVersion: "v1", + FieldPath: "status.hostIP", + }, + }, + }, + } + + expectations := []string{ + fmt.Sprintf("HOST_IP=%v|%v", e2enetwork.RegexIPv4, e2enetwork.RegexIPv6), + } + + testDownwardAPI(f, podName, env, expectations) + }) + + ginkgo.It("should provide host IP and pod IP as an env var if pod uses host network [LinuxOnly]", func() { + podName := "downward-api-" + string(uuid.NewUUID()) + env := []v1.EnvVar{ + { + Name: "HOST_IP", + ValueFrom: &v1.EnvVarSource{ + FieldRef: &v1.ObjectFieldSelector{ + APIVersion: "v1", + FieldPath: "status.hostIP", + }, + }, + }, + { + Name: "POD_IP", + ValueFrom: &v1.EnvVarSource{ + FieldRef: &v1.ObjectFieldSelector{ + APIVersion: "v1", + FieldPath: "status.podIP", + }, + }, + }, + } + + expectations := []string{ + fmt.Sprintf("OK"), + } + + pod := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: podName, + Labels: map[string]string{"name": podName}, + }, + Spec: v1.PodSpec{ + Containers: []v1.Container{ + { + Name: "dapi-container", + Image: imageutils.GetE2EImage(imageutils.BusyBox), + Command: []string{"sh", "-c", `[[ "${HOST_IP:?}" == "${POD_IP:?}" ]] && echo 'OK' || echo "HOST_IP: '${HOST_IP}' != POD_IP: '${POD_IP}'"`}, + Env: env, + }, + }, + HostNetwork: true, + RestartPolicy: v1.RestartPolicyNever, + }, + } + + testDownwardAPIUsingPod(f, pod, env, expectations) + + }) + + /* + Release: v1.9 + Testname: DownwardAPI, environment for CPU and memory limits and requests + Description: Downward API MUST expose CPU request and Memory request set through environment variables at runtime in the container. + */ + framework.ConformanceIt("should provide container's limits.cpu/memory and requests.cpu/memory as env vars [NodeConformance]", func() { + podName := "downward-api-" + string(uuid.NewUUID()) + env := []v1.EnvVar{ + { + Name: "CPU_LIMIT", + ValueFrom: &v1.EnvVarSource{ + ResourceFieldRef: &v1.ResourceFieldSelector{ + Resource: "limits.cpu", + }, + }, + }, + { + Name: "MEMORY_LIMIT", + ValueFrom: &v1.EnvVarSource{ + ResourceFieldRef: &v1.ResourceFieldSelector{ + Resource: "limits.memory", + }, + }, + }, + { + Name: "CPU_REQUEST", + ValueFrom: &v1.EnvVarSource{ + ResourceFieldRef: &v1.ResourceFieldSelector{ + Resource: "requests.cpu", + }, + }, + }, + { + Name: "MEMORY_REQUEST", + ValueFrom: &v1.EnvVarSource{ + ResourceFieldRef: &v1.ResourceFieldSelector{ + Resource: "requests.memory", + }, + }, + }, + } + expectations := []string{ + "CPU_LIMIT=2", + "MEMORY_LIMIT=67108864", + "CPU_REQUEST=1", + "MEMORY_REQUEST=33554432", + } + + testDownwardAPI(f, podName, env, expectations) + }) + + /* + Release: v1.9 + Testname: DownwardAPI, environment for default CPU and memory limits and requests + Description: Downward API MUST expose CPU request and Memory limits set through environment variables at runtime in the container. + */ + framework.ConformanceIt("should provide default limits.cpu/memory from node allocatable [NodeConformance]", func() { + podName := "downward-api-" + string(uuid.NewUUID()) + env := []v1.EnvVar{ + { + Name: "CPU_LIMIT", + ValueFrom: &v1.EnvVarSource{ + ResourceFieldRef: &v1.ResourceFieldSelector{ + Resource: "limits.cpu", + }, + }, + }, + { + Name: "MEMORY_LIMIT", + ValueFrom: &v1.EnvVarSource{ + ResourceFieldRef: &v1.ResourceFieldSelector{ + Resource: "limits.memory", + }, + }, + }, + } + expectations := []string{ + "CPU_LIMIT=[1-9]", + "MEMORY_LIMIT=[1-9]", + } + pod := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: podName, + Labels: map[string]string{"name": podName}, + }, + Spec: v1.PodSpec{ + Containers: []v1.Container{ + { + Name: "dapi-container", + Image: imageutils.GetE2EImage(imageutils.BusyBox), + Command: []string{"sh", "-c", "env"}, + Env: env, + }, + }, + RestartPolicy: v1.RestartPolicyNever, + }, + } + + testDownwardAPIUsingPod(f, pod, env, expectations) + }) + + /* + Release: v1.9 + Testname: DownwardAPI, environment for Pod UID + Description: Downward API MUST expose Pod UID set through environment variables at runtime in the container. + */ + framework.ConformanceIt("should provide pod UID as env vars [NodeConformance]", func() { + podName := "downward-api-" + string(uuid.NewUUID()) + env := []v1.EnvVar{ + { + Name: "POD_UID", + ValueFrom: &v1.EnvVarSource{ + FieldRef: &v1.ObjectFieldSelector{ + APIVersion: "v1", + FieldPath: "metadata.uid", + }, + }, + }, + } + + expectations := []string{ + "POD_UID=[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}", + } + + testDownwardAPI(f, podName, env, expectations) + }) +}) + +var _ = SIGDescribe("Downward API [Serial] [Disruptive] [NodeFeature:DownwardAPIHugePages]", func() { + f := framework.NewDefaultFramework("downward-api") + + ginkgo.Context("Downward API tests for hugepages", func() { + ginkgo.BeforeEach(func() { + e2eskipper.SkipUnlessDownwardAPIHugePagesEnabled() + }) + + ginkgo.It("should provide container's limits.hugepages- and requests.hugepages- as env vars", func() { + podName := "downward-api-" + string(uuid.NewUUID()) + env := []v1.EnvVar{ + { + Name: "HUGEPAGES_LIMIT", + ValueFrom: &v1.EnvVarSource{ + ResourceFieldRef: &v1.ResourceFieldSelector{ + Resource: "limits.hugepages-2Mi", + }, + }, + }, + { + Name: "HUGEPAGES_REQUEST", + ValueFrom: &v1.EnvVarSource{ + ResourceFieldRef: &v1.ResourceFieldSelector{ + Resource: "requests.hugepages-2Mi", + }, + }, + }, + } + + // Important: we explicitly request no hugepages so the test can run where none are present. + expectations := []string{ + fmt.Sprintf("HUGEPAGES_LIMIT=%d", 0), + fmt.Sprintf("HUGEPAGES_REQUEST=%d", 0), + } + pod := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: podName, + Labels: map[string]string{"name": podName}, + }, + Spec: v1.PodSpec{ + Containers: []v1.Container{ + { + Name: "dapi-container", + Image: imageutils.GetE2EImage(imageutils.BusyBox), + Command: []string{"sh", "-c", "env"}, + Resources: v1.ResourceRequirements{ + Requests: v1.ResourceList{ + "cpu": resource.MustParse("10m"), + "hugepages-2Mi": resource.MustParse("0Mi"), + }, + Limits: v1.ResourceList{ + "hugepages-2Mi": resource.MustParse("0Mi"), + }, + }, + Env: env, + }, + }, + RestartPolicy: v1.RestartPolicyNever, + }, + } + testDownwardAPIUsingPod(f, pod, env, expectations) + }) + + ginkgo.It("should provide default limits.hugepages- from node allocatable", func() { + podName := "downward-api-" + string(uuid.NewUUID()) + env := []v1.EnvVar{ + { + Name: "HUGEPAGES_LIMIT", + ValueFrom: &v1.EnvVarSource{ + ResourceFieldRef: &v1.ResourceFieldSelector{ + Resource: "limits.hugepages-2Mi", + }, + }, + }, + } + // Important: we allow for 0 so the test passes in environments where no hugepages are allocated. + expectations := []string{ + "HUGEPAGES_LIMIT=((0)|([1-9][0-9]*))\n", + } + pod := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: podName, + Labels: map[string]string{"name": podName}, + }, + Spec: v1.PodSpec{ + Containers: []v1.Container{ + { + Name: "dapi-container", + Image: imageutils.GetE2EImage(imageutils.BusyBox), + Command: []string{"sh", "-c", "env"}, + Env: env, + }, + }, + RestartPolicy: v1.RestartPolicyNever, + }, + } + + testDownwardAPIUsingPod(f, pod, env, expectations) + }) + }) + +}) + +func testDownwardAPI(f *framework.Framework, podName string, env []v1.EnvVar, expectations []string) { + pod := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: podName, + Labels: map[string]string{"name": podName}, + }, + Spec: v1.PodSpec{ + Containers: []v1.Container{ + { + Name: "dapi-container", + Image: imageutils.GetE2EImage(imageutils.BusyBox), + Command: []string{"sh", "-c", "env"}, + Resources: v1.ResourceRequirements{ + Requests: v1.ResourceList{ + v1.ResourceCPU: resource.MustParse("250m"), + v1.ResourceMemory: resource.MustParse("32Mi"), + }, + Limits: v1.ResourceList{ + v1.ResourceCPU: resource.MustParse("1250m"), + v1.ResourceMemory: resource.MustParse("64Mi"), + }, + }, + Env: env, + }, + }, + RestartPolicy: v1.RestartPolicyNever, + }, + } + + testDownwardAPIUsingPod(f, pod, env, expectations) +} + +func testDownwardAPIUsingPod(f *framework.Framework, pod *v1.Pod, env []v1.EnvVar, expectations []string) { + f.TestContainerOutputRegexp("downward api env vars", pod, 0, expectations) +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/expansion.go b/vendor/k8s.io/kubernetes/test/e2e/common/node/expansion.go similarity index 96% rename from vendor/k8s.io/kubernetes/test/e2e/common/expansion.go rename to vendor/k8s.io/kubernetes/test/e2e/common/node/expansion.go index a50206efb059..c0c2af2d9ba5 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/common/expansion.go +++ b/vendor/k8s.io/kubernetes/test/e2e/common/node/expansion.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package common +package node import ( v1 "k8s.io/api/core/v1" @@ -30,7 +30,7 @@ import ( // These tests exercise the Kubernetes expansion syntax $(VAR). // For more information, see: // https://github.com/kubernetes/community/blob/master/contributors/design-proposals/node/expansion.md -var _ = framework.KubeDescribe("Variable Expansion", func() { +var _ = SIGDescribe("Variable Expansion", func() { f := framework.NewDefaultFramework("var-expansion") /* @@ -106,7 +106,7 @@ var _ = framework.KubeDescribe("Variable Expansion", func() { Testname: VolumeSubpathEnvExpansion, subpath expansion Description: Make sure a container's subpath can be set using an expansion of environment variables. */ - framework.ConformanceIt("should allow substituting values in a volume subpath [sig-storage]", func() { + framework.ConformanceIt("should allow substituting values in a volume subpath", func() { envVars := []v1.EnvVar{ { Name: "POD_NAME", @@ -146,7 +146,7 @@ var _ = framework.KubeDescribe("Variable Expansion", func() { Testname: VolumeSubpathEnvExpansion, subpath with backticks Description: Make sure a container's subpath can not be set using an expansion of environment variables when backticks are supplied. */ - framework.ConformanceIt("should fail substituting values in a volume subpath with backticks [sig-storage][Slow]", func() { + framework.ConformanceIt("should fail substituting values in a volume subpath with backticks [Slow]", func() { envVars := []v1.EnvVar{ { @@ -180,7 +180,7 @@ var _ = framework.KubeDescribe("Variable Expansion", func() { Testname: VolumeSubpathEnvExpansion, subpath with absolute path Description: Make sure a container's subpath can not be set using an expansion of environment variables when absolute path is supplied. */ - framework.ConformanceIt("should fail substituting values in a volume subpath with absolute path [sig-storage][Slow]", func() { + framework.ConformanceIt("should fail substituting values in a volume subpath with absolute path [Slow]", func() { absolutePath := "/tmp" if framework.NodeOSDistroIs("windows") { // Windows does not typically have a C:\tmp folder. @@ -219,7 +219,7 @@ var _ = framework.KubeDescribe("Variable Expansion", func() { Testname: VolumeSubpathEnvExpansion, subpath ready from failed state Description: Verify that a failing subpath expansion can be modified during the lifecycle of a container. */ - framework.ConformanceIt("should verify that a failing subpath expansion can be modified during the lifecycle of a container [sig-storage][Slow]", func() { + framework.ConformanceIt("should verify that a failing subpath expansion can be modified during the lifecycle of a container [Slow]", func() { envVars := []v1.EnvVar{ { @@ -288,7 +288,7 @@ var _ = framework.KubeDescribe("Variable Expansion", func() { 3. successful expansion of the subpathexpr isn't required for volume cleanup */ - framework.ConformanceIt("should succeed in writing subpaths in container [sig-storage][Slow]", func() { + framework.ConformanceIt("should succeed in writing subpaths in container [Slow]", func() { envVars := []v1.EnvVar{ { diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/node/framework.go b/vendor/k8s.io/kubernetes/test/e2e/common/node/framework.go new file mode 100644 index 000000000000..f32393e98e16 --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/common/node/framework.go @@ -0,0 +1,24 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package node + +import "github.com/onsi/ginkgo" + +// SIGDescribe annotates the test with the SIG label. +func SIGDescribe(text string, body func()) bool { + return ginkgo.Describe("[sig-node] "+text, body) +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/init_container.go b/vendor/k8s.io/kubernetes/test/e2e/common/node/init_container.go similarity index 99% rename from vendor/k8s.io/kubernetes/test/e2e/common/init_container.go rename to vendor/k8s.io/kubernetes/test/e2e/common/node/init_container.go index 64529ff0860c..7164cbffd7c5 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/common/init_container.go +++ b/vendor/k8s.io/kubernetes/test/e2e/common/node/init_container.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package common +package node import ( "context" @@ -156,7 +156,7 @@ func initContainersInvariants(pod *v1.Pod) error { return nil } -var _ = framework.KubeDescribe("InitContainer [NodeConformance]", func() { +var _ = SIGDescribe("InitContainer [NodeConformance]", func() { f := framework.NewDefaultFramework("init-container") var podClient *framework.PodClient ginkgo.BeforeEach(func() { diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/kubelet.go b/vendor/k8s.io/kubernetes/test/e2e/common/node/kubelet.go similarity index 99% rename from vendor/k8s.io/kubernetes/test/e2e/common/kubelet.go rename to vendor/k8s.io/kubernetes/test/e2e/common/node/kubelet.go index c6182a01195c..8e5d722ec6e0 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/common/kubelet.go +++ b/vendor/k8s.io/kubernetes/test/e2e/common/node/kubelet.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package common +package node import ( "bytes" @@ -32,7 +32,7 @@ import ( "github.com/onsi/gomega" ) -var _ = framework.KubeDescribe("Kubelet", func() { +var _ = SIGDescribe("Kubelet", func() { f := framework.NewDefaultFramework("kubelet-test") var podClient *framework.PodClient ginkgo.BeforeEach(func() { diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/kubelet_etc_hosts.go b/vendor/k8s.io/kubernetes/test/e2e/common/node/kubelet_etc_hosts.go similarity index 97% rename from vendor/k8s.io/kubernetes/test/e2e/common/kubelet_etc_hosts.go rename to vendor/k8s.io/kubernetes/test/e2e/common/node/kubelet_etc_hosts.go index 701fbd78f3c6..1e0c860d1739 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/common/kubelet_etc_hosts.go +++ b/vendor/k8s.io/kubernetes/test/e2e/common/node/kubelet_etc_hosts.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package common +package node import ( "strings" @@ -36,13 +36,14 @@ const ( etcHostsOriginalPath = "/etc/hosts-original" ) +// KubeletManagedHostConfig defines the types for running managed etc hosts test cases type KubeletManagedHostConfig struct { hostNetworkPod *v1.Pod pod *v1.Pod f *framework.Framework } -var _ = framework.KubeDescribe("KubeletManagedEtcHosts", func() { +var _ = SIGDescribe("KubeletManagedEtcHosts", func() { f := framework.NewDefaultFramework("e2e-kubelet-etc-hosts") config := &KubeletManagedHostConfig{ f: f, diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/node/lease.go b/vendor/k8s.io/kubernetes/test/e2e/common/node/lease.go new file mode 100644 index 000000000000..b33f87905120 --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/common/node/lease.go @@ -0,0 +1,168 @@ +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package node + +import ( + "context" + "encoding/json" + "fmt" + "time" + + coordinationv1 "k8s.io/api/coordination/v1" + apiequality "k8s.io/apimachinery/pkg/api/equality" + apierrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/strategicpatch" + "k8s.io/kubernetes/test/e2e/framework" + "k8s.io/utils/pointer" +) + +func getPatchBytes(oldLease, newLease *coordinationv1.Lease) ([]byte, error) { + oldData, err := json.Marshal(oldLease) + if err != nil { + return nil, fmt.Errorf("failed to Marshal oldData: %v", err) + } + newData, err := json.Marshal(newLease) + if err != nil { + return nil, fmt.Errorf("failed to Marshal newData: %v", err) + } + patchBytes, err := strategicpatch.CreateTwoWayMergePatch(oldData, newData, coordinationv1.Lease{}) + if err != nil { + return nil, fmt.Errorf("failed to CreateTwoWayMergePatch: %v", err) + } + return patchBytes, nil +} + +var _ = SIGDescribe("Lease", func() { + f := framework.NewDefaultFramework("lease-test") + + /* + Release: v1.17 + Testname: lease API should be available + Description: Create Lease object, and get it; create and get MUST be successful and Spec of the + read Lease MUST match Spec of original Lease. Update the Lease and get it; update and get MUST + be successful and Spec of the read Lease MUST match Spec of updated Lease. Patch the Lease and + get it; patch and get MUST be successful and Spec of the read Lease MUST match Spec of patched + Lease. Create a second Lease with labels and list Leases; create and list MUST be successful and + list MUST return both leases. Delete the labels lease via delete collection; the delete MUST be + successful and MUST delete only the labels lease. List leases; list MUST be successful and MUST + return just the remaining lease. Delete the lease; delete MUST be successful. Get the lease; get + MUST return not found error. + */ + framework.ConformanceIt("lease API should be available", func() { + leaseClient := f.ClientSet.CoordinationV1().Leases(f.Namespace.Name) + + name := "lease" + lease := &coordinationv1.Lease{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + }, + Spec: coordinationv1.LeaseSpec{ + HolderIdentity: pointer.StringPtr("holder"), + LeaseDurationSeconds: pointer.Int32Ptr(30), + AcquireTime: &metav1.MicroTime{Time: time.Time{}.Add(2 * time.Second)}, + RenewTime: &metav1.MicroTime{Time: time.Time{}.Add(5 * time.Second)}, + LeaseTransitions: pointer.Int32Ptr(0), + }, + } + + createdLease, err := leaseClient.Create(context.TODO(), lease, metav1.CreateOptions{}) + framework.ExpectNoError(err, "creating Lease failed") + + readLease, err := leaseClient.Get(context.TODO(), name, metav1.GetOptions{}) + framework.ExpectNoError(err, "couldn't read Lease") + framework.ExpectEqual(apiequality.Semantic.DeepEqual(lease.Spec, readLease.Spec), true) + + createdLease.Spec = coordinationv1.LeaseSpec{ + HolderIdentity: pointer.StringPtr("holder2"), + LeaseDurationSeconds: pointer.Int32Ptr(30), + AcquireTime: &metav1.MicroTime{Time: time.Time{}.Add(20 * time.Second)}, + RenewTime: &metav1.MicroTime{Time: time.Time{}.Add(50 * time.Second)}, + LeaseTransitions: pointer.Int32Ptr(1), + } + + _, err = leaseClient.Update(context.TODO(), createdLease, metav1.UpdateOptions{}) + framework.ExpectNoError(err, "updating Lease failed") + + readLease, err = leaseClient.Get(context.TODO(), name, metav1.GetOptions{}) + framework.ExpectNoError(err, "couldn't read Lease") + framework.ExpectEqual(apiequality.Semantic.DeepEqual(createdLease.Spec, readLease.Spec), true) + + patchedLease := readLease.DeepCopy() + patchedLease.Spec = coordinationv1.LeaseSpec{ + HolderIdentity: pointer.StringPtr("holder3"), + LeaseDurationSeconds: pointer.Int32Ptr(60), + AcquireTime: &metav1.MicroTime{Time: time.Time{}.Add(50 * time.Second)}, + RenewTime: &metav1.MicroTime{Time: time.Time{}.Add(70 * time.Second)}, + LeaseTransitions: pointer.Int32Ptr(2), + } + patchBytes, err := getPatchBytes(readLease, patchedLease) + framework.ExpectNoError(err, "creating patch failed") + + _, err = leaseClient.Patch(context.TODO(), name, types.StrategicMergePatchType, patchBytes, metav1.PatchOptions{}) + framework.ExpectNoError(err, "patching Lease failed") + + readLease, err = leaseClient.Get(context.TODO(), name, metav1.GetOptions{}) + framework.ExpectNoError(err, "couldn't read Lease") + framework.ExpectEqual(apiequality.Semantic.DeepEqual(patchedLease.Spec, readLease.Spec), true) + + name2 := "lease2" + lease2 := &coordinationv1.Lease{ + ObjectMeta: metav1.ObjectMeta{ + Name: name2, + Labels: map[string]string{"deletecollection": "true"}, + }, + Spec: coordinationv1.LeaseSpec{ + HolderIdentity: pointer.StringPtr("holder"), + LeaseDurationSeconds: pointer.Int32Ptr(30), + AcquireTime: &metav1.MicroTime{Time: time.Time{}.Add(2 * time.Second)}, + RenewTime: &metav1.MicroTime{Time: time.Time{}.Add(5 * time.Second)}, + LeaseTransitions: pointer.Int32Ptr(0), + }, + } + _, err = leaseClient.Create(context.TODO(), lease2, metav1.CreateOptions{}) + framework.ExpectNoError(err, "creating Lease failed") + + leases, err := leaseClient.List(context.TODO(), metav1.ListOptions{}) + framework.ExpectNoError(err, "couldn't list Leases") + framework.ExpectEqual(len(leases.Items), 2) + + selector := labels.Set(map[string]string{"deletecollection": "true"}).AsSelector() + err = leaseClient.DeleteCollection(context.TODO(), metav1.DeleteOptions{}, metav1.ListOptions{LabelSelector: selector.String()}) + framework.ExpectNoError(err, "couldn't delete collection") + + leases, err = leaseClient.List(context.TODO(), metav1.ListOptions{}) + framework.ExpectNoError(err, "couldn't list Leases") + framework.ExpectEqual(len(leases.Items), 1) + + err = leaseClient.Delete(context.TODO(), name, metav1.DeleteOptions{}) + framework.ExpectNoError(err, "deleting Lease failed") + + _, err = leaseClient.Get(context.TODO(), name, metav1.GetOptions{}) + framework.ExpectEqual(apierrors.IsNotFound(err), true) + + leaseClient = f.ClientSet.CoordinationV1().Leases(metav1.NamespaceAll) + // Number of leases may be high in large clusters, as Lease object is + // created for every node by the corresponding Kubelet. + // That said, the objects themselves are small (~300B), so even with 5000 + // of them, that gives ~1.5MB, which is acceptable. + _, err = leaseClient.List(context.TODO(), metav1.ListOptions{}) + framework.ExpectNoError(err, "couldn't list Leases from all namespace") + }) +}) diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/lifecycle_hook.go b/vendor/k8s.io/kubernetes/test/e2e/common/node/lifecycle_hook.go similarity index 98% rename from vendor/k8s.io/kubernetes/test/e2e/common/lifecycle_hook.go rename to vendor/k8s.io/kubernetes/test/e2e/common/node/lifecycle_hook.go index 2eabcb65e7b7..9c230dfa44d7 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/common/lifecycle_hook.go +++ b/vendor/k8s.io/kubernetes/test/e2e/common/node/lifecycle_hook.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package common +package node import ( "fmt" @@ -32,7 +32,7 @@ import ( "github.com/onsi/gomega" ) -var _ = framework.KubeDescribe("Container Lifecycle Hook", func() { +var _ = SIGDescribe("Container Lifecycle Hook", func() { f := framework.NewDefaultFramework("container-lifecycle-hook") var podClient *framework.PodClient const ( diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/node_lease.go b/vendor/k8s.io/kubernetes/test/e2e/common/node/node_lease.go similarity index 99% rename from vendor/k8s.io/kubernetes/test/e2e/common/node_lease.go rename to vendor/k8s.io/kubernetes/test/e2e/common/node/node_lease.go index eb60dbfb4cdb..53965b94d20c 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/common/node_lease.go +++ b/vendor/k8s.io/kubernetes/test/e2e/common/node/node_lease.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package common +package node import ( "context" @@ -36,7 +36,7 @@ import ( "github.com/onsi/gomega" ) -var _ = framework.KubeDescribe("NodeLease", func() { +var _ = SIGDescribe("NodeLease", func() { var nodeName string f := framework.NewDefaultFramework("node-lease-test") diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/pods.go b/vendor/k8s.io/kubernetes/test/e2e/common/node/pods.go similarity index 98% rename from vendor/k8s.io/kubernetes/test/e2e/common/pods.go rename to vendor/k8s.io/kubernetes/test/e2e/common/node/pods.go index de8b7448137d..340aea757a27 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/common/pods.go +++ b/vendor/k8s.io/kubernetes/test/e2e/common/node/pods.go @@ -14,11 +14,12 @@ See the License for the specific language governing permissions and limitations under the License. */ -package common +package node import ( "bytes" "context" + "encoding/json" "fmt" "io" "runtime/debug" @@ -28,7 +29,6 @@ import ( "golang.org/x/net/websocket" - "encoding/json" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" @@ -59,7 +59,7 @@ const ( maxBackOffTolerance = time.Duration(1.3 * float64(kubelet.MaxContainerBackOff)) podRetryPeriod = 1 * time.Second podRetryTimeout = 1 * time.Minute - podReadyTimeout = 1 * time.Minute + podReadyTimeout = 2 * time.Minute ) // testHostIP tests that a pod gets a host IP @@ -179,7 +179,7 @@ func expectNoErrorWithRetries(fn func() error, maxRetries int, explain ...interf gomega.ExpectWithOffset(1, err).NotTo(gomega.HaveOccurred(), explain...) } -var _ = framework.KubeDescribe("Pods", func() { +var _ = SIGDescribe("Pods", func() { f := framework.NewDefaultFramework("pods") var podClient *framework.PodClient var dc dynamic.Interface @@ -813,7 +813,8 @@ var _ = framework.KubeDescribe("Pods", func() { } ginkgo.By("submitting the pod to kubernetes") - podClient.CreateSync(pod) + f.PodClient().Create(pod) + e2epod.WaitForPodNameRunningInNamespace(f.ClientSet, pod.Name, f.Namespace.Name) framework.ExpectEqual(podClient.PodIsReady(podName), false, "Expect pod's Ready condition to be false initially.") ginkgo.By(fmt.Sprintf("patching pod status with condition %q to true", readinessGate1)) @@ -939,10 +940,13 @@ var _ = framework.KubeDescribe("Pods", func() { pod.Labels["test-pod-static"] == "true" && pod.Status.Phase == v1.PodRunning if !found { - framework.Logf("observed Pod %v in namespace %v in phase %v conditions %v", pod.ObjectMeta.Name, pod.ObjectMeta.Namespace, pod.Status.Phase, pod.Status.Conditions) + framework.Logf("observed Pod %v in namespace %v in phase %v with labels: %v & conditions %v", pod.ObjectMeta.Name, pod.ObjectMeta.Namespace, pod.Status.Phase, pod.Labels, pod.Status.Conditions) + return false, nil } + framework.Logf("Found Pod %v in namespace %v in phase %v with labels: %v & conditions %v", pod.ObjectMeta.Name, pod.ObjectMeta.Namespace, pod.Status.Phase, pod.Labels, pod.Status.Conditions) return found, nil } + framework.Logf("Observed event: %+v", event.Object) return false, nil }) framework.ExpectNoError(err, "failed to see Pod %v in namespace %v running", testPod.ObjectMeta.Name, testNamespaceName) diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/podtemplates.go b/vendor/k8s.io/kubernetes/test/e2e/common/node/podtemplates.go similarity index 98% rename from vendor/k8s.io/kubernetes/test/e2e/common/podtemplates.go rename to vendor/k8s.io/kubernetes/test/e2e/common/node/podtemplates.go index dbf1354e9099..8c3388bf107c 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/common/podtemplates.go +++ b/vendor/k8s.io/kubernetes/test/e2e/common/node/podtemplates.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package common +package node import ( "context" @@ -38,7 +38,7 @@ const ( podTemplateRetryTimeout = 1 * time.Minute ) -var _ = ginkgo.Describe("[sig-node] PodTemplates", func() { +var _ = SIGDescribe("PodTemplates", func() { f := framework.NewDefaultFramework("podtemplate") /* Release: v1.19 diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/privileged.go b/vendor/k8s.io/kubernetes/test/e2e/common/node/privileged.go similarity index 97% rename from vendor/k8s.io/kubernetes/test/e2e/common/privileged.go rename to vendor/k8s.io/kubernetes/test/e2e/common/node/privileged.go index cec1614fb936..6f63b2022619 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/common/privileged.go +++ b/vendor/k8s.io/kubernetes/test/e2e/common/node/privileged.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package common +package node import ( "fmt" @@ -38,7 +38,7 @@ type PrivilegedPodTestConfig struct { pod *v1.Pod } -var _ = framework.KubeDescribe("PrivilegedPod [NodeConformance]", func() { +var _ = SIGDescribe("PrivilegedPod [NodeConformance]", func() { config := &PrivilegedPodTestConfig{ f: framework.NewDefaultFramework("e2e-privileged-pod"), privilegedPod: "privileged-pod", diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/node/runtime.go b/vendor/k8s.io/kubernetes/test/e2e/common/node/runtime.go new file mode 100644 index 000000000000..972103abf409 --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/common/node/runtime.go @@ -0,0 +1,404 @@ +/* +Copyright 2016 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package node + +import ( + "context" + "fmt" + "io/ioutil" + "path" + "time" + + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/uuid" + "k8s.io/kubernetes/pkg/kubelet/images" + "k8s.io/kubernetes/test/e2e/framework" + imageutils "k8s.io/kubernetes/test/utils/image" + + "github.com/onsi/ginkgo" + "github.com/onsi/gomega" + gomegatypes "github.com/onsi/gomega/types" +) + +var _ = SIGDescribe("Container Runtime", func() { + f := framework.NewDefaultFramework("container-runtime") + + ginkgo.Describe("blackbox test", func() { + ginkgo.Context("when starting a container that exits", func() { + + /* + Release: v1.13 + Testname: Container Runtime, Restart Policy, Pod Phases + Description: If the restart policy is set to 'Always', Pod MUST be restarted when terminated, If restart policy is 'OnFailure', Pod MUST be started only if it is terminated with non-zero exit code. If the restart policy is 'Never', Pod MUST never be restarted. All these three test cases MUST verify the restart counts accordingly. + */ + framework.ConformanceIt("should run with the expected status [NodeConformance]", func() { + restartCountVolumeName := "restart-count" + restartCountVolumePath := "/restart-count" + testContainer := v1.Container{ + Image: framework.BusyBoxImage, + VolumeMounts: []v1.VolumeMount{ + { + MountPath: restartCountVolumePath, + Name: restartCountVolumeName, + }, + }, + } + testVolumes := []v1.Volume{ + { + Name: restartCountVolumeName, + VolumeSource: v1.VolumeSource{ + EmptyDir: &v1.EmptyDirVolumeSource{Medium: v1.StorageMediumMemory}, + }, + }, + } + testCases := []struct { + Name string + RestartPolicy v1.RestartPolicy + Phase v1.PodPhase + State ContainerState + RestartCount int32 + Ready bool + }{ + {"terminate-cmd-rpa", v1.RestartPolicyAlways, v1.PodRunning, ContainerStateRunning, 2, true}, + {"terminate-cmd-rpof", v1.RestartPolicyOnFailure, v1.PodSucceeded, ContainerStateTerminated, 1, false}, + {"terminate-cmd-rpn", v1.RestartPolicyNever, v1.PodFailed, ContainerStateTerminated, 0, false}, + } + for _, testCase := range testCases { + + // It failed at the 1st run, then succeeded at 2nd run, then run forever + cmdScripts := ` +f=%s +count=$(echo 'hello' >> $f ; wc -l $f | awk {'print $1'}) +if [ $count -eq 1 ]; then + exit 1 +fi +if [ $count -eq 2 ]; then + exit 0 +fi +while true; do sleep 1; done +` + tmpCmd := fmt.Sprintf(cmdScripts, path.Join(restartCountVolumePath, "restartCount")) + testContainer.Name = testCase.Name + testContainer.Command = []string{"sh", "-c", tmpCmd} + terminateContainer := ConformanceContainer{ + PodClient: f.PodClient(), + Container: testContainer, + RestartPolicy: testCase.RestartPolicy, + Volumes: testVolumes, + } + terminateContainer.Create() + defer terminateContainer.Delete() + + ginkgo.By(fmt.Sprintf("Container '%s': should get the expected 'RestartCount'", testContainer.Name)) + gomega.Eventually(func() (int32, error) { + status, err := terminateContainer.GetStatus() + return status.RestartCount, err + }, ContainerStatusRetryTimeout, ContainerStatusPollInterval).Should(gomega.Equal(testCase.RestartCount)) + + ginkgo.By(fmt.Sprintf("Container '%s': should get the expected 'Phase'", testContainer.Name)) + gomega.Eventually(terminateContainer.GetPhase, ContainerStatusRetryTimeout, ContainerStatusPollInterval).Should(gomega.Equal(testCase.Phase)) + + ginkgo.By(fmt.Sprintf("Container '%s': should get the expected 'Ready' condition", testContainer.Name)) + isReady, err := terminateContainer.IsReady() + framework.ExpectEqual(isReady, testCase.Ready) + framework.ExpectNoError(err) + + status, err := terminateContainer.GetStatus() + framework.ExpectNoError(err) + + ginkgo.By(fmt.Sprintf("Container '%s': should get the expected 'State'", testContainer.Name)) + framework.ExpectEqual(GetContainerState(status.State), testCase.State) + + ginkgo.By(fmt.Sprintf("Container '%s': should be possible to delete [NodeConformance]", testContainer.Name)) + gomega.Expect(terminateContainer.Delete()).To(gomega.Succeed()) + gomega.Eventually(terminateContainer.Present, ContainerStatusRetryTimeout, ContainerStatusPollInterval).Should(gomega.BeFalse()) + } + }) + }) + + ginkgo.Context("on terminated container", func() { + rootUser := int64(0) + nonRootUser := int64(10000) + adminUserName := "ContainerAdministrator" + nonAdminUserName := "ContainerUser" + + // Create and then terminate the container under defined PodPhase to verify if termination message matches the expected output. Lastly delete the created container. + matchTerminationMessage := func(container v1.Container, expectedPhase v1.PodPhase, expectedMsg gomegatypes.GomegaMatcher) { + container.Name = "termination-message-container" + c := ConformanceContainer{ + PodClient: f.PodClient(), + Container: container, + RestartPolicy: v1.RestartPolicyNever, + } + + ginkgo.By("create the container") + c.Create() + defer c.Delete() + + ginkgo.By(fmt.Sprintf("wait for the container to reach %s", expectedPhase)) + gomega.Eventually(c.GetPhase, ContainerStatusRetryTimeout, ContainerStatusPollInterval).Should(gomega.Equal(expectedPhase)) + + ginkgo.By("get the container status") + status, err := c.GetStatus() + framework.ExpectNoError(err) + + ginkgo.By("the container should be terminated") + framework.ExpectEqual(GetContainerState(status.State), ContainerStateTerminated) + + ginkgo.By("the termination message should be set") + framework.Logf("Expected: %v to match Container's Termination Message: %v --", expectedMsg, status.State.Terminated.Message) + gomega.Expect(status.State.Terminated.Message).Should(expectedMsg) + + ginkgo.By("delete the container") + gomega.Expect(c.Delete()).To(gomega.Succeed()) + } + + ginkgo.It("should report termination message [LinuxOnly] if TerminationMessagePath is set [NodeConformance]", func() { + // Cannot mount files in Windows Containers. + // TODO(claudiub): Remove [LinuxOnly] tag once Containerd becomes the default + // container runtime on Windows. + container := v1.Container{ + Image: framework.BusyBoxImage, + Command: []string{"/bin/sh", "-c"}, + Args: []string{"/bin/echo -n DONE > /dev/termination-log"}, + TerminationMessagePath: "/dev/termination-log", + SecurityContext: &v1.SecurityContext{}, + } + if framework.NodeOSDistroIs("windows") { + container.SecurityContext.WindowsOptions = &v1.WindowsSecurityContextOptions{RunAsUserName: &adminUserName} + } else { + container.SecurityContext.RunAsUser = &rootUser + } + matchTerminationMessage(container, v1.PodSucceeded, gomega.Equal("DONE")) + }) + + /* + Release: v1.15 + Testname: Container Runtime, TerminationMessagePath, non-root user and non-default path + Description: Create a pod with a container to run it as a non-root user with a custom TerminationMessagePath set. Pod redirects the output to the provided path successfully. When the container is terminated, the termination message MUST match the expected output logged in the provided custom path. + [LinuxOnly]: Tagged LinuxOnly due to use of 'uid' and unable to mount files in Windows Containers. + */ + framework.ConformanceIt("should report termination message [LinuxOnly] if TerminationMessagePath is set as non-root user and at a non-default path [NodeConformance]", func() { + // TODO(claudiub): Remove [LinuxOnly] tag once Containerd becomes the default + // container runtime on Windows + container := v1.Container{ + Image: framework.BusyBoxImage, + Command: []string{"/bin/sh", "-c"}, + Args: []string{"/bin/echo -n DONE > /dev/termination-custom-log"}, + TerminationMessagePath: "/dev/termination-custom-log", + SecurityContext: &v1.SecurityContext{}, + } + if framework.NodeOSDistroIs("windows") { + container.SecurityContext.WindowsOptions = &v1.WindowsSecurityContextOptions{RunAsUserName: &nonAdminUserName} + } else { + container.SecurityContext.RunAsUser = &nonRootUser + } + matchTerminationMessage(container, v1.PodSucceeded, gomega.Equal("DONE")) + }) + + /* + Release: v1.15 + Testname: Container Runtime, TerminationMessage, from container's log output of failing container + Description: Create a pod with an container. Container's output is recorded in log and container exits with an error. When container is terminated, termination message MUST match the expected output recorded from container's log. + [LinuxOnly]: Cannot mount files in Windows Containers. + */ + framework.ConformanceIt("should report termination message [LinuxOnly] from log output if TerminationMessagePolicy FallbackToLogsOnError is set [NodeConformance]", func() { + container := v1.Container{ + Image: framework.BusyBoxImage, + Command: []string{"/bin/sh", "-c"}, + Args: []string{"/bin/echo -n DONE; /bin/false"}, + TerminationMessagePath: "/dev/termination-log", + TerminationMessagePolicy: v1.TerminationMessageFallbackToLogsOnError, + } + matchTerminationMessage(container, v1.PodFailed, gomega.Equal("DONE")) + }) + + /* + Release: v1.15 + Testname: Container Runtime, TerminationMessage, from log output of succeeding container + Description: Create a pod with an container. Container's output is recorded in log and container exits successfully without an error. When container is terminated, terminationMessage MUST have no content as container succeed. + [LinuxOnly]: Cannot mount files in Windows Containers. + */ + framework.ConformanceIt("should report termination message [LinuxOnly] as empty when pod succeeds and TerminationMessagePolicy FallbackToLogsOnError is set [NodeConformance]", func() { + container := v1.Container{ + Image: framework.BusyBoxImage, + Command: []string{"/bin/sh", "-c"}, + Args: []string{"/bin/echo -n DONE; /bin/true"}, + TerminationMessagePath: "/dev/termination-log", + TerminationMessagePolicy: v1.TerminationMessageFallbackToLogsOnError, + } + matchTerminationMessage(container, v1.PodSucceeded, gomega.Equal("")) + }) + + /* + Release: v1.15 + Testname: Container Runtime, TerminationMessage, from file of succeeding container + Description: Create a pod with an container. Container's output is recorded in a file and the container exits successfully without an error. When container is terminated, terminationMessage MUST match with the content from file. + [LinuxOnly]: Cannot mount files in Windows Containers. + */ + framework.ConformanceIt("should report termination message [LinuxOnly] from file when pod succeeds and TerminationMessagePolicy FallbackToLogsOnError is set [NodeConformance]", func() { + container := v1.Container{ + Image: framework.BusyBoxImage, + Command: []string{"/bin/sh", "-c"}, + Args: []string{"/bin/echo -n OK > /dev/termination-log; /bin/echo DONE; /bin/true"}, + TerminationMessagePath: "/dev/termination-log", + TerminationMessagePolicy: v1.TerminationMessageFallbackToLogsOnError, + } + matchTerminationMessage(container, v1.PodSucceeded, gomega.Equal("OK")) + }) + }) + + ginkgo.Context("when running a container with a new image", func() { + + // Images used for ConformanceContainer are not added into NodePrePullImageList, because this test is + // testing image pulling, these images don't need to be prepulled. The ImagePullPolicy + // is v1.PullAlways, so it won't be blocked by framework image pre-pull list check. + imagePullTest := func(image string, hasSecret bool, expectedPhase v1.PodPhase, expectedPullStatus bool, windowsImage bool) { + command := []string{"/bin/sh", "-c", "while true; do sleep 1; done"} + if windowsImage { + // -t: Ping the specified host until stopped. + command = []string{"ping", "-t", "localhost"} + } + container := ConformanceContainer{ + PodClient: f.PodClient(), + Container: v1.Container{ + Name: "image-pull-test", + Image: image, + Command: command, + ImagePullPolicy: v1.PullAlways, + }, + RestartPolicy: v1.RestartPolicyNever, + } + if hasSecret { + // The service account only has pull permission + auth := ` +{ + "auths": { + "https://gcr.io": { + "auth": "X2pzb25fa2V5OnsKICAidHlwZSI6ICJzZXJ2aWNlX2FjY291bnQiLAogICJwcm9qZWN0X2lkIjogImF1dGhlbnRpY2F0ZWQtaW1hZ2UtcHVsbGluZyIsCiAgInByaXZhdGVfa2V5X2lkIjogImI5ZjJhNjY0YWE5YjIwNDg0Y2MxNTg2MDYzZmVmZGExOTIyNGFjM2IiLAogICJwcml2YXRlX2tleSI6ICItLS0tLUJFR0lOIFBSSVZBVEUgS0VZLS0tLS1cbk1JSUV2UUlCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktjd2dnU2pBZ0VBQW9JQkFRQzdTSG5LVEVFaVlMamZcbkpmQVBHbUozd3JCY2VJNTBKS0xxS21GWE5RL3REWGJRK2g5YVl4aldJTDhEeDBKZTc0bVovS01uV2dYRjVLWlNcbm9BNktuSU85Yi9SY1NlV2VpSXRSekkzL1lYVitPNkNjcmpKSXl4anFWam5mVzJpM3NhMzd0OUE5VEZkbGZycm5cbjR6UkpiOWl4eU1YNGJMdHFGR3ZCMDNOSWl0QTNzVlo1ODhrb1FBZmgzSmhhQmVnTWorWjRSYko0aGVpQlFUMDNcbnZVbzViRWFQZVQ5RE16bHdzZWFQV2dydDZOME9VRGNBRTl4bGNJek11MjUzUG4vSzgySFpydEx4akd2UkhNVXhcbng0ZjhwSnhmQ3h4QlN3Z1NORit3OWpkbXR2b0wwRmE3ZGducFJlODZWRDY2ejNZenJqNHlLRXRqc2hLZHl5VWRcbkl5cVhoN1JSQWdNQkFBRUNnZ0VBT3pzZHdaeENVVlFUeEFka2wvSTVTRFVidi9NazRwaWZxYjJEa2FnbmhFcG9cbjFJajJsNGlWMTByOS9uenJnY2p5VlBBd3pZWk1JeDFBZVF0RDdoUzRHWmFweXZKWUc3NkZpWFpQUm9DVlB6b3VcbmZyOGRDaWFwbDV0enJDOWx2QXNHd29DTTdJWVRjZmNWdDdjRTEyRDNRS3NGNlo3QjJ6ZmdLS251WVBmK0NFNlRcbmNNMHkwaCtYRS9kMERvSERoVy96YU1yWEhqOFRvd2V1eXRrYmJzNGYvOUZqOVBuU2dET1lQd2xhbFZUcitGUWFcbkpSd1ZqVmxYcEZBUW14M0Jyd25rWnQzQ2lXV2lGM2QrSGk5RXRVYnRWclcxYjZnK1JRT0licWFtcis4YlJuZFhcbjZWZ3FCQWtKWjhSVnlkeFVQMGQxMUdqdU9QRHhCbkhCbmM0UW9rSXJFUUtCZ1FEMUNlaWN1ZGhXdGc0K2dTeGJcbnplanh0VjFONDFtZHVjQnpvMmp5b1dHbzNQVDh3ckJPL3lRRTM0cU9WSi9pZCs4SThoWjRvSWh1K0pBMDBzNmdcblRuSXErdi9kL1RFalk4MW5rWmlDa21SUFdiWHhhWXR4UjIxS1BYckxOTlFKS2ttOHRkeVh5UHFsOE1veUdmQ1dcbjJ2aVBKS05iNkhabnY5Q3lqZEo5ZzJMRG5RS0JnUUREcVN2eURtaGViOTIzSW96NGxlZ01SK205Z2xYVWdTS2dcbkVzZlllbVJmbU5XQitDN3ZhSXlVUm1ZNU55TXhmQlZXc3dXRldLYXhjK0krYnFzZmx6elZZdFpwMThNR2pzTURcbmZlZWZBWDZCWk1zVXQ3Qmw3WjlWSjg1bnRFZHFBQ0xwWitaLzN0SVJWdWdDV1pRMWhrbmxHa0dUMDI0SkVFKytcbk55SDFnM2QzUlFLQmdRQ1J2MXdKWkkwbVBsRklva0tGTkh1YTBUcDNLb1JTU1hzTURTVk9NK2xIckcxWHJtRjZcbkMwNGNTKzQ0N0dMUkxHOFVUaEpKbTRxckh0Ti9aK2dZOTYvMm1xYjRIakpORDM3TVhKQnZFYTN5ZUxTOHEvK1JcbjJGOU1LamRRaU5LWnhQcG84VzhOSlREWTVOa1BaZGh4a2pzSHdVNGRTNjZwMVRESUU0MGd0TFpaRFFLQmdGaldcbktyblFpTnEzOS9iNm5QOFJNVGJDUUFKbmR3anhTUU5kQTVmcW1rQTlhRk9HbCtqamsxQ1BWa0tNSWxLSmdEYkpcbk9heDl2OUc2Ui9NSTFIR1hmV3QxWU56VnRocjRIdHNyQTB0U3BsbWhwZ05XRTZWejZuQURqdGZQSnMyZUdqdlhcbmpQUnArdjhjY21MK3dTZzhQTGprM3ZsN2VlNXJsWWxNQndNdUdjUHhBb0dBZWRueGJXMVJMbVZubEFpSEx1L0xcbmxtZkF3RFdtRWlJMFVnK1BMbm9Pdk81dFE1ZDRXMS94RU44bFA0cWtzcGtmZk1Rbk5oNFNZR0VlQlQzMlpxQ1RcbkpSZ2YwWGpveXZ2dXA5eFhqTWtYcnBZL3ljMXpmcVRaQzBNTzkvMVVjMWJSR2RaMmR5M2xSNU5XYXA3T1h5Zk9cblBQcE5Gb1BUWGd2M3FDcW5sTEhyR3pNPVxuLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLVxuIiwKICAiY2xpZW50X2VtYWlsIjogImltYWdlLXB1bGxpbmdAYXV0aGVudGljYXRlZC1pbWFnZS1wdWxsaW5nLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwKICAiY2xpZW50X2lkIjogIjExMzc5NzkxNDUzMDA3MzI3ODcxMiIsCiAgImF1dGhfdXJpIjogImh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9vL29hdXRoMi9hdXRoIiwKICAidG9rZW5fdXJpIjogImh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9vL29hdXRoMi90b2tlbiIsCiAgImF1dGhfcHJvdmlkZXJfeDUwOV9jZXJ0X3VybCI6ICJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9vYXV0aDIvdjEvY2VydHMiLAogICJjbGllbnRfeDUwOV9jZXJ0X3VybCI6ICJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9yb2JvdC92MS9tZXRhZGF0YS94NTA5L2ltYWdlLXB1bGxpbmclNDBhdXRoZW50aWNhdGVkLWltYWdlLXB1bGxpbmcuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iCn0=", + "email": "image-pulling@authenticated-image-pulling.iam.gserviceaccount.com" + } + } +}` + // we might be told to use a different docker config JSON. + if framework.TestContext.DockerConfigFile != "" { + contents, err := ioutil.ReadFile(framework.TestContext.DockerConfigFile) + framework.ExpectNoError(err) + auth = string(contents) + } + secret := &v1.Secret{ + Data: map[string][]byte{v1.DockerConfigJsonKey: []byte(auth)}, + Type: v1.SecretTypeDockerConfigJson, + } + secret.Name = "image-pull-secret-" + string(uuid.NewUUID()) + ginkgo.By("create image pull secret") + _, err := f.ClientSet.CoreV1().Secrets(f.Namespace.Name).Create(context.TODO(), secret, metav1.CreateOptions{}) + framework.ExpectNoError(err) + defer f.ClientSet.CoreV1().Secrets(f.Namespace.Name).Delete(context.TODO(), secret.Name, metav1.DeleteOptions{}) + container.ImagePullSecrets = []string{secret.Name} + } + // checkContainerStatus checks whether the container status matches expectation. + checkContainerStatus := func() error { + status, err := container.GetStatus() + if err != nil { + return fmt.Errorf("failed to get container status: %v", err) + } + // We need to check container state first. The default pod status is pending, If we check pod phase first, + // and the expected pod phase is Pending, the container status may not even show up when we check it. + // Check container state + if !expectedPullStatus { + if status.State.Running == nil { + return fmt.Errorf("expected container state: Running, got: %q", + GetContainerState(status.State)) + } + } + if expectedPullStatus { + if status.State.Waiting == nil { + return fmt.Errorf("expected container state: Waiting, got: %q", + GetContainerState(status.State)) + } + reason := status.State.Waiting.Reason + if reason != images.ErrImagePull.Error() && + reason != images.ErrImagePullBackOff.Error() { + return fmt.Errorf("unexpected waiting reason: %q", reason) + } + } + // Check pod phase + phase, err := container.GetPhase() + if err != nil { + return fmt.Errorf("failed to get pod phase: %v", err) + } + if phase != expectedPhase { + return fmt.Errorf("expected pod phase: %q, got: %q", expectedPhase, phase) + } + return nil + } + + // The image registry is not stable, which sometimes causes the test to fail. Add retry mechanism to make this less flaky. + const flakeRetry = 3 + for i := 1; i <= flakeRetry; i++ { + var err error + ginkgo.By("create the container") + container.Create() + ginkgo.By("check the container status") + for start := time.Now(); time.Since(start) < ContainerStatusRetryTimeout; time.Sleep(ContainerStatusPollInterval) { + if err = checkContainerStatus(); err == nil { + break + } + } + ginkgo.By("delete the container") + container.Delete() + if err == nil { + break + } + if i < flakeRetry { + framework.Logf("No.%d attempt failed: %v, retrying...", i, err) + } else { + framework.Failf("All %d attempts failed: %v", flakeRetry, err) + } + } + } + + ginkgo.It("should not be able to pull image from invalid registry [NodeConformance]", func() { + image := imageutils.GetE2EImage(imageutils.InvalidRegistryImage) + imagePullTest(image, false, v1.PodPending, true, false) + }) + + ginkgo.It("should be able to pull image [NodeConformance]", func() { + // NOTE(claudiub): The agnhost image is supposed to work on both Linux and Windows. + image := imageutils.GetE2EImage(imageutils.Agnhost) + imagePullTest(image, false, v1.PodRunning, false, false) + }) + + ginkgo.It("should not be able to pull from private registry without secret [NodeConformance]", func() { + image := imageutils.GetE2EImage(imageutils.AuthenticatedAlpine) + imagePullTest(image, false, v1.PodPending, true, false) + }) + + ginkgo.It("should be able to pull from private registry with secret [NodeConformance]", func() { + image := imageutils.GetE2EImage(imageutils.AuthenticatedAlpine) + isWindows := false + if framework.NodeOSDistroIs("windows") { + image = imageutils.GetE2EImage(imageutils.AuthenticatedWindowsNanoServer) + isWindows = true + } + imagePullTest(image, true, v1.PodRunning, false, isWindows) + }) + }) + }) +}) diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/node/runtimeclass.go b/vendor/k8s.io/kubernetes/test/e2e/common/node/runtimeclass.go new file mode 100644 index 000000000000..c782c3a097bb --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/common/node/runtimeclass.go @@ -0,0 +1,288 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package node + +import ( + "context" + "fmt" + "time" + + v1 "k8s.io/api/core/v1" + nodev1 "k8s.io/api/node/v1" + apierrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/fields" + types "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/apimachinery/pkg/watch" + "k8s.io/kubernetes/pkg/kubelet/events" + runtimeclasstest "k8s.io/kubernetes/pkg/kubelet/runtimeclass/testing" + "k8s.io/kubernetes/test/e2e/framework" + e2eevents "k8s.io/kubernetes/test/e2e/framework/events" + e2enode "k8s.io/kubernetes/test/e2e/framework/node" + e2epod "k8s.io/kubernetes/test/e2e/framework/pod" + + "github.com/onsi/ginkgo" +) + +var _ = SIGDescribe("RuntimeClass", func() { + f := framework.NewDefaultFramework("runtimeclass") + + ginkgo.It("should reject a Pod requesting a non-existent RuntimeClass [NodeFeature:RuntimeHandler]", func() { + rcName := f.Namespace.Name + "-nonexistent" + expectPodRejection(f, e2enode.NewRuntimeClassPod(rcName)) + }) + + ginkgo.It("should reject a Pod requesting a RuntimeClass with an unconfigured handler [NodeFeature:RuntimeHandler]", func() { + handler := f.Namespace.Name + "-handler" + rcName := createRuntimeClass(f, "unconfigured-handler", handler) + pod := f.PodClient().Create(e2enode.NewRuntimeClassPod(rcName)) + expectSandboxFailureEvent(f, pod, handler) + }) + + // This test requires that the PreconfiguredRuntimeHandler has already been set up on nodes. + ginkgo.It("should run a Pod requesting a RuntimeClass with a configured handler [NodeFeature:RuntimeHandler]", func() { + // The built-in docker runtime does not support configuring runtime handlers. + handler := e2enode.PreconfiguredRuntimeClassHandler(framework.TestContext.ContainerRuntime) + + rcName := createRuntimeClass(f, "preconfigured-handler", handler) + pod := f.PodClient().Create(e2enode.NewRuntimeClassPod(rcName)) + expectPodSuccess(f, pod) + }) + + ginkgo.It("should reject a Pod requesting a deleted RuntimeClass [NodeFeature:RuntimeHandler]", func() { + rcName := createRuntimeClass(f, "delete-me", "runc") + rcClient := f.ClientSet.NodeV1().RuntimeClasses() + + ginkgo.By("Deleting RuntimeClass "+rcName, func() { + err := rcClient.Delete(context.TODO(), rcName, metav1.DeleteOptions{}) + framework.ExpectNoError(err, "failed to delete RuntimeClass %s", rcName) + + ginkgo.By("Waiting for the RuntimeClass to disappear") + framework.ExpectNoError(wait.PollImmediate(framework.Poll, time.Minute, func() (bool, error) { + _, err := rcClient.Get(context.TODO(), rcName, metav1.GetOptions{}) + if apierrors.IsNotFound(err) { + return true, nil // done + } + if err != nil { + return true, err // stop wait with error + } + return false, nil + })) + }) + + expectPodRejection(f, e2enode.NewRuntimeClassPod(rcName)) + }) + + /* + Release: v1.20 + Testname: RuntimeClass API + Description: + The node.k8s.io API group MUST exist in the /apis discovery document. + The node.k8s.io/v1 API group/version MUST exist in the /apis/mode.k8s.io discovery document. + The runtimeclasses resource MUST exist in the /apis/node.k8s.io/v1 discovery document. + The runtimeclasses resource must support create, get, list, watch, update, patch, delete, and deletecollection. + */ + framework.ConformanceIt(" should support RuntimeClasses API operations", func() { + // Setup + rcVersion := "v1" + rcClient := f.ClientSet.NodeV1().RuntimeClasses() + + // This is a conformance test that must configure opaque handlers to validate CRUD operations. + // Test should not use any existing handler like gVisor or runc + // + // All CRUD operations in this test are limited to the objects with the label test=f.UniqueName + rc := runtimeclasstest.NewRuntimeClass(f.UniqueName+"-handler", f.UniqueName+"-conformance-runtime-class") + rc.SetLabels(map[string]string{"test": f.UniqueName}) + rc2 := runtimeclasstest.NewRuntimeClass(f.UniqueName+"-handler2", f.UniqueName+"-conformance-runtime-class2") + rc2.SetLabels(map[string]string{"test": f.UniqueName}) + rc3 := runtimeclasstest.NewRuntimeClass(f.UniqueName+"-handler3", f.UniqueName+"-conformance-runtime-class3") + rc3.SetLabels(map[string]string{"test": f.UniqueName}) + + // Discovery + + ginkgo.By("getting /apis") + { + discoveryGroups, err := f.ClientSet.Discovery().ServerGroups() + framework.ExpectNoError(err) + found := false + for _, group := range discoveryGroups.Groups { + if group.Name == nodev1.GroupName { + for _, version := range group.Versions { + if version.Version == rcVersion { + found = true + break + } + } + } + } + framework.ExpectEqual(found, true, fmt.Sprintf("expected RuntimeClass API group/version, got %#v", discoveryGroups.Groups)) + } + + ginkgo.By("getting /apis/node.k8s.io") + { + group := &metav1.APIGroup{} + err := f.ClientSet.Discovery().RESTClient().Get().AbsPath("/apis/node.k8s.io").Do(context.TODO()).Into(group) + framework.ExpectNoError(err) + found := false + for _, version := range group.Versions { + if version.Version == rcVersion { + found = true + break + } + } + framework.ExpectEqual(found, true, fmt.Sprintf("expected RuntimeClass API version, got %#v", group.Versions)) + } + + ginkgo.By("getting /apis/node.k8s.io/" + rcVersion) + { + resources, err := f.ClientSet.Discovery().ServerResourcesForGroupVersion(nodev1.SchemeGroupVersion.String()) + framework.ExpectNoError(err) + found := false + for _, resource := range resources.APIResources { + switch resource.Name { + case "runtimeclasses": + found = true + } + } + framework.ExpectEqual(found, true, fmt.Sprintf("expected runtimeclasses, got %#v", resources.APIResources)) + } + + // Main resource create/read/update/watch operations + + ginkgo.By("creating") + createdRC, err := rcClient.Create(context.TODO(), rc, metav1.CreateOptions{}) + framework.ExpectNoError(err) + _, err = rcClient.Create(context.TODO(), rc, metav1.CreateOptions{}) + framework.ExpectEqual(apierrors.IsAlreadyExists(err), true, fmt.Sprintf("expected 409, got %#v", err)) + _, err = rcClient.Create(context.TODO(), rc2, metav1.CreateOptions{}) + framework.ExpectNoError(err) + + ginkgo.By("watching") + framework.Logf("starting watch") + rcWatch, err := rcClient.Watch(context.TODO(), metav1.ListOptions{LabelSelector: "test=" + f.UniqueName}) + framework.ExpectNoError(err) + + // added for a watch + _, err = rcClient.Create(context.TODO(), rc3, metav1.CreateOptions{}) + framework.ExpectNoError(err) + + ginkgo.By("getting") + gottenRC, err := rcClient.Get(context.TODO(), rc.Name, metav1.GetOptions{}) + framework.ExpectNoError(err) + framework.ExpectEqual(gottenRC.UID, createdRC.UID) + + ginkgo.By("listing") + rcs, err := rcClient.List(context.TODO(), metav1.ListOptions{LabelSelector: "test=" + f.UniqueName}) + framework.ExpectNoError(err) + framework.ExpectEqual(len(rcs.Items), 3, "filtered list should have 3 items") + + ginkgo.By("patching") + patchedRC, err := rcClient.Patch(context.TODO(), createdRC.Name, types.MergePatchType, []byte(`{"metadata":{"annotations":{"patched":"true"}}}`), metav1.PatchOptions{}) + framework.ExpectNoError(err) + framework.ExpectEqual(patchedRC.Annotations["patched"], "true", "patched object should have the applied annotation") + + ginkgo.By("updating") + csrToUpdate := patchedRC.DeepCopy() + csrToUpdate.Annotations["updated"] = "true" + updatedRC, err := rcClient.Update(context.TODO(), csrToUpdate, metav1.UpdateOptions{}) + framework.ExpectNoError(err) + framework.ExpectEqual(updatedRC.Annotations["updated"], "true", "updated object should have the applied annotation") + + framework.Logf("waiting for watch events with expected annotations") + for sawAdded, sawPatched, sawUpdated := false, false, false; !sawAdded && !sawPatched && !sawUpdated; { + select { + case evt, ok := <-rcWatch.ResultChan(): + framework.ExpectEqual(ok, true, "watch channel should not close") + if evt.Type == watch.Modified { + watchedRC, isRC := evt.Object.(*nodev1.RuntimeClass) + framework.ExpectEqual(isRC, true, fmt.Sprintf("expected RC, got %T", evt.Object)) + if watchedRC.Annotations["patched"] == "true" { + framework.Logf("saw patched annotations") + sawPatched = true + } else if watchedRC.Annotations["updated"] == "true" { + framework.Logf("saw updated annotations") + sawUpdated = true + } else { + framework.Logf("missing expected annotations, waiting: %#v", watchedRC.Annotations) + } + } else if evt.Type == watch.Added { + _, isRC := evt.Object.(*nodev1.RuntimeClass) + framework.ExpectEqual(isRC, true, fmt.Sprintf("expected RC, got %T", evt.Object)) + sawAdded = true + } + + case <-time.After(wait.ForeverTestTimeout): + framework.Fail("timed out waiting for watch event") + } + } + rcWatch.Stop() + + // main resource delete operations + + ginkgo.By("deleting") + err = rcClient.Delete(context.TODO(), createdRC.Name, metav1.DeleteOptions{}) + framework.ExpectNoError(err) + _, err = rcClient.Get(context.TODO(), createdRC.Name, metav1.GetOptions{}) + framework.ExpectEqual(apierrors.IsNotFound(err), true, fmt.Sprintf("expected 404, got %#v", err)) + rcs, err = rcClient.List(context.TODO(), metav1.ListOptions{LabelSelector: "test=" + f.UniqueName}) + framework.ExpectNoError(err) + framework.ExpectEqual(len(rcs.Items), 2, "filtered list should have 2 items") + + ginkgo.By("deleting a collection") + err = rcClient.DeleteCollection(context.TODO(), metav1.DeleteOptions{}, metav1.ListOptions{LabelSelector: "test=" + f.UniqueName}) + framework.ExpectNoError(err) + rcs, err = rcClient.List(context.TODO(), metav1.ListOptions{LabelSelector: "test=" + f.UniqueName}) + framework.ExpectNoError(err) + framework.ExpectEqual(len(rcs.Items), 0, "filtered list should have 0 items") + }) +}) + +// createRuntimeClass generates a RuntimeClass with the desired handler and a "namespaced" name, +// synchronously creates it, and returns the generated name. +func createRuntimeClass(f *framework.Framework, name, handler string) string { + uniqueName := fmt.Sprintf("%s-%s", f.Namespace.Name, name) + rc := runtimeclasstest.NewRuntimeClass(uniqueName, handler) + rc, err := f.ClientSet.NodeV1().RuntimeClasses().Create(context.TODO(), rc, metav1.CreateOptions{}) + framework.ExpectNoError(err, "failed to create RuntimeClass resource") + return rc.GetName() +} + +func expectPodRejection(f *framework.Framework, pod *v1.Pod) { + _, err := f.ClientSet.CoreV1().Pods(f.Namespace.Name).Create(context.TODO(), pod, metav1.CreateOptions{}) + framework.ExpectError(err, "should be forbidden") + framework.ExpectEqual(apierrors.IsForbidden(err), true, "should be forbidden error") +} + +// expectPodSuccess waits for the given pod to terminate successfully. +func expectPodSuccess(f *framework.Framework, pod *v1.Pod) { + framework.ExpectNoError(e2epod.WaitForPodSuccessInNamespace( + f.ClientSet, pod.Name, f.Namespace.Name)) +} + +// expectSandboxFailureEvent polls for an event with reason "FailedCreatePodSandBox" containing the +// expected message string. +func expectSandboxFailureEvent(f *framework.Framework, pod *v1.Pod, msg string) { + eventSelector := fields.Set{ + "involvedObject.kind": "Pod", + "involvedObject.name": pod.Name, + "involvedObject.namespace": f.Namespace.Name, + "reason": events.FailedCreatePodSandBox, + }.AsSelector().String() + framework.ExpectNoError(e2eevents.WaitTimeoutForEvent( + f.ClientSet, f.Namespace.Name, eventSelector, msg, framework.PodEventTimeout)) +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/node/secrets.go b/vendor/k8s.io/kubernetes/test/e2e/common/node/secrets.go new file mode 100644 index 000000000000..deca17d30458 --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/common/node/secrets.go @@ -0,0 +1,278 @@ +/* +Copyright 2014 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package node + +import ( + "context" + "encoding/json" + "fmt" + + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/uuid" + "k8s.io/kubernetes/test/e2e/framework" + imageutils "k8s.io/kubernetes/test/utils/image" + + "encoding/base64" + + "github.com/onsi/ginkgo" + "k8s.io/apimachinery/pkg/types" +) + +var _ = SIGDescribe("Secrets", func() { + f := framework.NewDefaultFramework("secrets") + + /* + Release: v1.9 + Testname: Secrets, pod environment field + Description: Create a secret. Create a Pod with Container that declares a environment variable which references the secret created to extract a key value from the secret. Pod MUST have the environment variable that contains proper value for the key to the secret. + */ + framework.ConformanceIt("should be consumable from pods in env vars [NodeConformance]", func() { + name := "secret-test-" + string(uuid.NewUUID()) + secret := secretForTest(f.Namespace.Name, name) + + ginkgo.By(fmt.Sprintf("Creating secret with name %s", secret.Name)) + var err error + if secret, err = f.ClientSet.CoreV1().Secrets(f.Namespace.Name).Create(context.TODO(), secret, metav1.CreateOptions{}); err != nil { + framework.Failf("unable to create test secret %s: %v", secret.Name, err) + } + + pod := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pod-secrets-" + string(uuid.NewUUID()), + }, + Spec: v1.PodSpec{ + Containers: []v1.Container{ + { + Name: "secret-env-test", + Image: imageutils.GetE2EImage(imageutils.BusyBox), + Command: []string{"sh", "-c", "env"}, + Env: []v1.EnvVar{ + { + Name: "SECRET_DATA", + ValueFrom: &v1.EnvVarSource{ + SecretKeyRef: &v1.SecretKeySelector{ + LocalObjectReference: v1.LocalObjectReference{ + Name: name, + }, + Key: "data-1", + }, + }, + }, + }, + }, + }, + RestartPolicy: v1.RestartPolicyNever, + }, + } + + f.TestContainerOutput("consume secrets", pod, 0, []string{ + "SECRET_DATA=value-1", + }) + }) + + /* + Release: v1.9 + Testname: Secrets, pod environment from source + Description: Create a secret. Create a Pod with Container that declares a environment variable using 'EnvFrom' which references the secret created to extract a key value from the secret. Pod MUST have the environment variable that contains proper value for the key to the secret. + */ + framework.ConformanceIt("should be consumable via the environment [NodeConformance]", func() { + name := "secret-test-" + string(uuid.NewUUID()) + secret := newEnvFromSecret(f.Namespace.Name, name) + ginkgo.By(fmt.Sprintf("creating secret %v/%v", f.Namespace.Name, secret.Name)) + var err error + if secret, err = f.ClientSet.CoreV1().Secrets(f.Namespace.Name).Create(context.TODO(), secret, metav1.CreateOptions{}); err != nil { + framework.Failf("unable to create test secret %s: %v", secret.Name, err) + } + + pod := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pod-configmaps-" + string(uuid.NewUUID()), + }, + Spec: v1.PodSpec{ + Containers: []v1.Container{ + { + Name: "env-test", + Image: imageutils.GetE2EImage(imageutils.BusyBox), + Command: []string{"sh", "-c", "env"}, + EnvFrom: []v1.EnvFromSource{ + { + SecretRef: &v1.SecretEnvSource{LocalObjectReference: v1.LocalObjectReference{Name: name}}, + }, + { + Prefix: "p_", + SecretRef: &v1.SecretEnvSource{LocalObjectReference: v1.LocalObjectReference{Name: name}}, + }, + }, + }, + }, + RestartPolicy: v1.RestartPolicyNever, + }, + } + + f.TestContainerOutput("consume secrets", pod, 0, []string{ + "data_1=value-1", "data_2=value-2", "data_3=value-3", + "p_data_1=value-1", "p_data_2=value-2", "p_data_3=value-3", + }) + }) + + /* + Release: v1.15 + Testname: Secrets, with empty-key + Description: Attempt to create a Secret with an empty key. The creation MUST fail. + */ + framework.ConformanceIt("should fail to create secret due to empty secret key", func() { + secret, err := createEmptyKeySecretForTest(f) + framework.ExpectError(err, "created secret %q with empty key in namespace %q", secret.Name, f.Namespace.Name) + }) + + /* + Release: v1.18 + Testname: Secret patching + Description: A Secret is created. + Listing all Secrets MUST return an empty list. + Given the patching and fetching of the Secret, the fields MUST equal the new values. + The Secret is deleted by it's static Label. + Secrets are listed finally, the list MUST NOT include the originally created Secret. + */ + framework.ConformanceIt("should patch a secret", func() { + ginkgo.By("creating a secret") + + secretTestName := "test-secret-" + string(uuid.NewUUID()) + + // create a secret in the test namespace + _, err := f.ClientSet.CoreV1().Secrets(f.Namespace.Name).Create(context.TODO(), &v1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: secretTestName, + Labels: map[string]string{ + "testsecret-constant": "true", + }, + }, + Data: map[string][]byte{ + "key": []byte("value"), + }, + Type: "Opaque", + }, metav1.CreateOptions{}) + framework.ExpectNoError(err, "failed to create secret") + + ginkgo.By("listing secrets in all namespaces to ensure that there are more than zero") + // list all secrets in all namespaces to ensure endpoint coverage + secretsList, err := f.ClientSet.CoreV1().Secrets("").List(context.TODO(), metav1.ListOptions{ + LabelSelector: "testsecret-constant=true", + }) + framework.ExpectNoError(err, "failed to list secrets") + framework.ExpectNotEqual(len(secretsList.Items), 0, "no secrets found") + + foundCreatedSecret := false + var secretCreatedName string + for _, val := range secretsList.Items { + if val.ObjectMeta.Name == secretTestName && val.ObjectMeta.Namespace == f.Namespace.Name { + foundCreatedSecret = true + secretCreatedName = val.ObjectMeta.Name + break + } + } + framework.ExpectEqual(foundCreatedSecret, true, "unable to find secret by its value") + + ginkgo.By("patching the secret") + // patch the secret in the test namespace + secretPatchNewData := base64.StdEncoding.EncodeToString([]byte("value1")) + secretPatch, err := json.Marshal(map[string]interface{}{ + "metadata": map[string]interface{}{ + "labels": map[string]string{"testsecret": "true"}, + }, + "data": map[string][]byte{"key": []byte(secretPatchNewData)}, + }) + framework.ExpectNoError(err, "failed to marshal JSON") + _, err = f.ClientSet.CoreV1().Secrets(f.Namespace.Name).Patch(context.TODO(), secretCreatedName, types.StrategicMergePatchType, []byte(secretPatch), metav1.PatchOptions{}) + framework.ExpectNoError(err, "failed to patch secret") + + secret, err := f.ClientSet.CoreV1().Secrets(f.Namespace.Name).Get(context.TODO(), secretCreatedName, metav1.GetOptions{}) + framework.ExpectNoError(err, "failed to get secret") + + secretDecodedstring, err := base64.StdEncoding.DecodeString(string(secret.Data["key"])) + framework.ExpectNoError(err, "failed to decode secret from Base64") + + framework.ExpectEqual(string(secretDecodedstring), "value1", "found secret, but the data wasn't updated from the patch") + + ginkgo.By("deleting the secret using a LabelSelector") + err = f.ClientSet.CoreV1().Secrets(f.Namespace.Name).DeleteCollection(context.TODO(), metav1.DeleteOptions{}, metav1.ListOptions{ + LabelSelector: "testsecret=true", + }) + framework.ExpectNoError(err, "failed to delete patched secret") + + ginkgo.By("listing secrets in all namespaces, searching for label name and value in patch") + // list all secrets in all namespaces + secretsList, err = f.ClientSet.CoreV1().Secrets("").List(context.TODO(), metav1.ListOptions{ + LabelSelector: "testsecret-constant=true", + }) + framework.ExpectNoError(err, "failed to list secrets") + + foundCreatedSecret = false + for _, val := range secretsList.Items { + if val.ObjectMeta.Name == secretTestName && val.ObjectMeta.Namespace == f.Namespace.Name { + foundCreatedSecret = true + break + } + } + framework.ExpectEqual(foundCreatedSecret, false, "secret was not deleted successfully") + }) +}) + +func secretForTest(namespace, name string) *v1.Secret { + return &v1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: namespace, + Name: name, + }, + Data: map[string][]byte{ + "data-1": []byte("value-1\n"), + "data-2": []byte("value-2\n"), + "data-3": []byte("value-3\n"), + }, + } +} + +// TODO: Unify with secretForTest. +func newEnvFromSecret(namespace, name string) *v1.Secret { + return &v1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: namespace, + Name: name, + }, + Data: map[string][]byte{ + "data_1": []byte("value-1\n"), + "data_2": []byte("value-2\n"), + "data_3": []byte("value-3\n"), + }, + } +} + +func createEmptyKeySecretForTest(f *framework.Framework) (*v1.Secret, error) { + secretName := "secret-emptykey-test-" + string(uuid.NewUUID()) + secret := &v1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: f.Namespace.Name, + Name: secretName, + }, + Data: map[string][]byte{ + "": []byte("value-1\n"), + }, + } + ginkgo.By(fmt.Sprintf("Creating projection with secret that has name %s", secret.Name)) + return f.ClientSet.CoreV1().Secrets(f.Namespace.Name).Create(context.TODO(), secret, metav1.CreateOptions{}) +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/security_context.go b/vendor/k8s.io/kubernetes/test/e2e/common/node/security_context.go similarity index 99% rename from vendor/k8s.io/kubernetes/test/e2e/common/security_context.go rename to vendor/k8s.io/kubernetes/test/e2e/common/node/security_context.go index 939464f78fa1..a87378fcfa9f 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/common/security_context.go +++ b/vendor/k8s.io/kubernetes/test/e2e/common/node/security_context.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package common +package node import ( "fmt" @@ -35,7 +35,12 @@ import ( "github.com/onsi/gomega" ) -var _ = framework.KubeDescribe("Security Context", func() { +var ( + // non-root UID used in tests. + nonRootTestUserID = int64(1000) +) + +var _ = SIGDescribe("Security Context", func() { f := framework.NewDefaultFramework("security-context-test") var podClient *framework.PodClient ginkgo.BeforeEach(func() { diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/node/sysctl.go b/vendor/k8s.io/kubernetes/test/e2e/common/node/sysctl.go new file mode 100644 index 000000000000..12f9b28df290 --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/common/node/sysctl.go @@ -0,0 +1,208 @@ +/* +Copyright 2014 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package node + +import ( + "context" + "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/uuid" + "k8s.io/kubernetes/test/e2e/framework" + e2epod "k8s.io/kubernetes/test/e2e/framework/pod" + e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" + imageutils "k8s.io/kubernetes/test/utils/image" + + "github.com/onsi/ginkgo" + "github.com/onsi/gomega" +) + +var _ = SIGDescribe("Sysctls [LinuxOnly] [NodeFeature:Sysctls]", func() { + + ginkgo.BeforeEach(func() { + // sysctl is not supported on Windows. + e2eskipper.SkipIfNodeOSDistroIs("windows") + }) + + f := framework.NewDefaultFramework("sysctl") + var podClient *framework.PodClient + + testPod := func() *v1.Pod { + podName := "sysctl-" + string(uuid.NewUUID()) + pod := v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: podName, + Annotations: map[string]string{}, + }, + Spec: v1.PodSpec{ + Containers: []v1.Container{ + { + Name: "test-container", + Image: imageutils.GetE2EImage(imageutils.BusyBox), + }, + }, + RestartPolicy: v1.RestartPolicyNever, + }, + } + + return &pod + } + + ginkgo.BeforeEach(func() { + podClient = f.PodClient() + }) + + ginkgo.It("should support sysctls", func() { + pod := testPod() + pod.Spec.SecurityContext = &v1.PodSecurityContext{ + Sysctls: []v1.Sysctl{ + { + Name: "kernel.shm_rmid_forced", + Value: "1", + }, + }, + } + pod.Spec.Containers[0].Command = []string{"/bin/sysctl", "kernel.shm_rmid_forced"} + + ginkgo.By("Creating a pod with the kernel.shm_rmid_forced sysctl") + pod = podClient.Create(pod) + + ginkgo.By("Watching for error events or started pod") + // watch for events instead of termination of pod because the kubelet deletes + // failed pods without running containers. This would create a race as the pod + // might have already been deleted here. + ev, err := f.PodClient().WaitForErrorEventOrSuccess(pod) + framework.ExpectNoError(err) + gomega.Expect(ev).To(gomega.BeNil()) + + ginkgo.By("Waiting for pod completion") + err = e2epod.WaitForPodNoLongerRunningInNamespace(f.ClientSet, pod.Name, f.Namespace.Name) + framework.ExpectNoError(err) + pod, err = podClient.Get(context.TODO(), pod.Name, metav1.GetOptions{}) + framework.ExpectNoError(err) + + ginkgo.By("Checking that the pod succeeded") + framework.ExpectEqual(pod.Status.Phase, v1.PodSucceeded) + + ginkgo.By("Getting logs from the pod") + log, err := e2epod.GetPodLogs(f.ClientSet, f.Namespace.Name, pod.Name, pod.Spec.Containers[0].Name) + framework.ExpectNoError(err) + + ginkgo.By("Checking that the sysctl is actually updated") + gomega.Expect(log).To(gomega.ContainSubstring("kernel.shm_rmid_forced = 1")) + }) + + ginkgo.It("should support unsafe sysctls which are actually whitelisted", func() { + pod := testPod() + pod.Spec.SecurityContext = &v1.PodSecurityContext{ + Sysctls: []v1.Sysctl{ + { + Name: "kernel.shm_rmid_forced", + Value: "1", + }, + }, + } + pod.Spec.Containers[0].Command = []string{"/bin/sysctl", "kernel.shm_rmid_forced"} + + ginkgo.By("Creating a pod with the kernel.shm_rmid_forced sysctl") + pod = podClient.Create(pod) + + ginkgo.By("Watching for error events or started pod") + // watch for events instead of termination of pod because the kubelet deletes + // failed pods without running containers. This would create a race as the pod + // might have already been deleted here. + ev, err := f.PodClient().WaitForErrorEventOrSuccess(pod) + framework.ExpectNoError(err) + gomega.Expect(ev).To(gomega.BeNil()) + + ginkgo.By("Waiting for pod completion") + err = e2epod.WaitForPodNoLongerRunningInNamespace(f.ClientSet, pod.Name, f.Namespace.Name) + framework.ExpectNoError(err) + pod, err = podClient.Get(context.TODO(), pod.Name, metav1.GetOptions{}) + framework.ExpectNoError(err) + + ginkgo.By("Checking that the pod succeeded") + framework.ExpectEqual(pod.Status.Phase, v1.PodSucceeded) + + ginkgo.By("Getting logs from the pod") + log, err := e2epod.GetPodLogs(f.ClientSet, f.Namespace.Name, pod.Name, pod.Spec.Containers[0].Name) + framework.ExpectNoError(err) + + ginkgo.By("Checking that the sysctl is actually updated") + gomega.Expect(log).To(gomega.ContainSubstring("kernel.shm_rmid_forced = 1")) + }) + + ginkgo.It("should reject invalid sysctls", func() { + pod := testPod() + pod.Spec.SecurityContext = &v1.PodSecurityContext{ + Sysctls: []v1.Sysctl{ + // Safe parameters + { + Name: "foo-", + Value: "bar", + }, + { + Name: "kernel.shmmax", + Value: "100000000", + }, + { + Name: "safe-and-unsafe", + Value: "100000000", + }, + { + Name: "bar..", + Value: "42", + }, + }, + } + + ginkgo.By("Creating a pod with one valid and two invalid sysctls") + client := f.ClientSet.CoreV1().Pods(f.Namespace.Name) + _, err := client.Create(context.TODO(), pod, metav1.CreateOptions{}) + + gomega.Expect(err).NotTo(gomega.BeNil()) + gomega.Expect(err.Error()).To(gomega.ContainSubstring(`Invalid value: "foo-"`)) + gomega.Expect(err.Error()).To(gomega.ContainSubstring(`Invalid value: "bar.."`)) + gomega.Expect(err.Error()).NotTo(gomega.ContainSubstring(`safe-and-unsafe`)) + gomega.Expect(err.Error()).NotTo(gomega.ContainSubstring("kernel.shmmax")) + }) + + ginkgo.It("should not launch unsafe, but not explicitly enabled sysctls on the node", func() { + pod := testPod() + pod.Spec.SecurityContext = &v1.PodSecurityContext{ + Sysctls: []v1.Sysctl{ + { + Name: "kernel.msgmax", + Value: "10000000000", + }, + }, + } + + ginkgo.By("Creating a pod with a greylisted, but not whitelisted sysctl on the node") + pod = podClient.Create(pod) + + ginkgo.By("Watching for error events or started pod") + // watch for events instead of termination of pod because the kubelet deletes + // failed pods without running containers. This would create a race as the pod + // might have already been deleted here. + ev, err := f.PodClient().WaitForErrorEventOrSuccess(pod) + framework.ExpectNoError(err) + + ginkgo.By("Checking that the pod was rejected") + gomega.Expect(ev).ToNot(gomega.BeNil()) + framework.ExpectEqual(ev.Reason, "SysctlForbidden") + }) +}) diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/runtime.go b/vendor/k8s.io/kubernetes/test/e2e/common/runtime.go deleted file mode 100644 index a96b9e2ff183..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/common/runtime.go +++ /dev/null @@ -1,404 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package common - -import ( - "context" - "fmt" - "io/ioutil" - "path" - "time" - - v1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/uuid" - "k8s.io/kubernetes/pkg/kubelet/images" - "k8s.io/kubernetes/test/e2e/framework" - imageutils "k8s.io/kubernetes/test/utils/image" - - "github.com/onsi/ginkgo" - "github.com/onsi/gomega" - gomegatypes "github.com/onsi/gomega/types" -) - -var _ = framework.KubeDescribe("Container Runtime", func() { - f := framework.NewDefaultFramework("container-runtime") - - ginkgo.Describe("blackbox test", func() { - ginkgo.Context("when starting a container that exits", func() { - - /* - Release: v1.13 - Testname: Container Runtime, Restart Policy, Pod Phases - Description: If the restart policy is set to 'Always', Pod MUST be restarted when terminated, If restart policy is 'OnFailure', Pod MUST be started only if it is terminated with non-zero exit code. If the restart policy is 'Never', Pod MUST never be restarted. All these three test cases MUST verify the restart counts accordingly. - */ - framework.ConformanceIt("should run with the expected status [NodeConformance]", func() { - restartCountVolumeName := "restart-count" - restartCountVolumePath := "/restart-count" - testContainer := v1.Container{ - Image: framework.BusyBoxImage, - VolumeMounts: []v1.VolumeMount{ - { - MountPath: restartCountVolumePath, - Name: restartCountVolumeName, - }, - }, - } - testVolumes := []v1.Volume{ - { - Name: restartCountVolumeName, - VolumeSource: v1.VolumeSource{ - EmptyDir: &v1.EmptyDirVolumeSource{Medium: v1.StorageMediumMemory}, - }, - }, - } - testCases := []struct { - Name string - RestartPolicy v1.RestartPolicy - Phase v1.PodPhase - State ContainerState - RestartCount int32 - Ready bool - }{ - {"terminate-cmd-rpa", v1.RestartPolicyAlways, v1.PodRunning, ContainerStateRunning, 2, true}, - {"terminate-cmd-rpof", v1.RestartPolicyOnFailure, v1.PodSucceeded, ContainerStateTerminated, 1, false}, - {"terminate-cmd-rpn", v1.RestartPolicyNever, v1.PodFailed, ContainerStateTerminated, 0, false}, - } - for _, testCase := range testCases { - - // It failed at the 1st run, then succeeded at 2nd run, then run forever - cmdScripts := ` -f=%s -count=$(echo 'hello' >> $f ; wc -l $f | awk {'print $1'}) -if [ $count -eq 1 ]; then - exit 1 -fi -if [ $count -eq 2 ]; then - exit 0 -fi -while true; do sleep 1; done -` - tmpCmd := fmt.Sprintf(cmdScripts, path.Join(restartCountVolumePath, "restartCount")) - testContainer.Name = testCase.Name - testContainer.Command = []string{"sh", "-c", tmpCmd} - terminateContainer := ConformanceContainer{ - PodClient: f.PodClient(), - Container: testContainer, - RestartPolicy: testCase.RestartPolicy, - Volumes: testVolumes, - } - terminateContainer.Create() - defer terminateContainer.Delete() - - ginkgo.By(fmt.Sprintf("Container '%s': should get the expected 'RestartCount'", testContainer.Name)) - gomega.Eventually(func() (int32, error) { - status, err := terminateContainer.GetStatus() - return status.RestartCount, err - }, ContainerStatusRetryTimeout, ContainerStatusPollInterval).Should(gomega.Equal(testCase.RestartCount)) - - ginkgo.By(fmt.Sprintf("Container '%s': should get the expected 'Phase'", testContainer.Name)) - gomega.Eventually(terminateContainer.GetPhase, ContainerStatusRetryTimeout, ContainerStatusPollInterval).Should(gomega.Equal(testCase.Phase)) - - ginkgo.By(fmt.Sprintf("Container '%s': should get the expected 'Ready' condition", testContainer.Name)) - isReady, err := terminateContainer.IsReady() - framework.ExpectEqual(isReady, testCase.Ready) - framework.ExpectNoError(err) - - status, err := terminateContainer.GetStatus() - framework.ExpectNoError(err) - - ginkgo.By(fmt.Sprintf("Container '%s': should get the expected 'State'", testContainer.Name)) - framework.ExpectEqual(GetContainerState(status.State), testCase.State) - - ginkgo.By(fmt.Sprintf("Container '%s': should be possible to delete [NodeConformance]", testContainer.Name)) - gomega.Expect(terminateContainer.Delete()).To(gomega.Succeed()) - gomega.Eventually(terminateContainer.Present, ContainerStatusRetryTimeout, ContainerStatusPollInterval).Should(gomega.BeFalse()) - } - }) - }) - - ginkgo.Context("on terminated container", func() { - rootUser := int64(0) - nonRootUser := int64(10000) - adminUserName := "ContainerAdministrator" - nonAdminUserName := "ContainerUser" - - // Create and then terminate the container under defined PodPhase to verify if termination message matches the expected output. Lastly delete the created container. - matchTerminationMessage := func(container v1.Container, expectedPhase v1.PodPhase, expectedMsg gomegatypes.GomegaMatcher) { - container.Name = "termination-message-container" - c := ConformanceContainer{ - PodClient: f.PodClient(), - Container: container, - RestartPolicy: v1.RestartPolicyNever, - } - - ginkgo.By("create the container") - c.Create() - defer c.Delete() - - ginkgo.By(fmt.Sprintf("wait for the container to reach %s", expectedPhase)) - gomega.Eventually(c.GetPhase, ContainerStatusRetryTimeout, ContainerStatusPollInterval).Should(gomega.Equal(expectedPhase)) - - ginkgo.By("get the container status") - status, err := c.GetStatus() - framework.ExpectNoError(err) - - ginkgo.By("the container should be terminated") - framework.ExpectEqual(GetContainerState(status.State), ContainerStateTerminated) - - ginkgo.By("the termination message should be set") - framework.Logf("Expected: %v to match Container's Termination Message: %v --", expectedMsg, status.State.Terminated.Message) - gomega.Expect(status.State.Terminated.Message).Should(expectedMsg) - - ginkgo.By("delete the container") - gomega.Expect(c.Delete()).To(gomega.Succeed()) - } - - ginkgo.It("should report termination message [LinuxOnly] if TerminationMessagePath is set [NodeConformance]", func() { - // Cannot mount files in Windows Containers. - // TODO(claudiub): Remove [LinuxOnly] tag once Containerd becomes the default - // container runtime on Windows. - container := v1.Container{ - Image: framework.BusyBoxImage, - Command: []string{"/bin/sh", "-c"}, - Args: []string{"/bin/echo -n DONE > /dev/termination-log"}, - TerminationMessagePath: "/dev/termination-log", - SecurityContext: &v1.SecurityContext{}, - } - if framework.NodeOSDistroIs("windows") { - container.SecurityContext.WindowsOptions = &v1.WindowsSecurityContextOptions{RunAsUserName: &adminUserName} - } else { - container.SecurityContext.RunAsUser = &rootUser - } - matchTerminationMessage(container, v1.PodSucceeded, gomega.Equal("DONE")) - }) - - /* - Release: v1.15 - Testname: Container Runtime, TerminationMessagePath, non-root user and non-default path - Description: Create a pod with a container to run it as a non-root user with a custom TerminationMessagePath set. Pod redirects the output to the provided path successfully. When the container is terminated, the termination message MUST match the expected output logged in the provided custom path. - [LinuxOnly]: Tagged LinuxOnly due to use of 'uid' and unable to mount files in Windows Containers. - */ - framework.ConformanceIt("should report termination message [LinuxOnly] if TerminationMessagePath is set as non-root user and at a non-default path [NodeConformance]", func() { - // TODO(claudiub): Remove [LinuxOnly] tag once Containerd becomes the default - // container runtime on Windows - container := v1.Container{ - Image: framework.BusyBoxImage, - Command: []string{"/bin/sh", "-c"}, - Args: []string{"/bin/echo -n DONE > /dev/termination-custom-log"}, - TerminationMessagePath: "/dev/termination-custom-log", - SecurityContext: &v1.SecurityContext{}, - } - if framework.NodeOSDistroIs("windows") { - container.SecurityContext.WindowsOptions = &v1.WindowsSecurityContextOptions{RunAsUserName: &nonAdminUserName} - } else { - container.SecurityContext.RunAsUser = &nonRootUser - } - matchTerminationMessage(container, v1.PodSucceeded, gomega.Equal("DONE")) - }) - - /* - Release: v1.15 - Testname: Container Runtime, TerminationMessage, from container's log output of failing container - Description: Create a pod with an container. Container's output is recorded in log and container exits with an error. When container is terminated, termination message MUST match the expected output recorded from container's log. - [LinuxOnly]: Cannot mount files in Windows Containers. - */ - framework.ConformanceIt("should report termination message [LinuxOnly] from log output if TerminationMessagePolicy FallbackToLogsOnError is set [NodeConformance]", func() { - container := v1.Container{ - Image: framework.BusyBoxImage, - Command: []string{"/bin/sh", "-c"}, - Args: []string{"/bin/echo -n DONE; /bin/false"}, - TerminationMessagePath: "/dev/termination-log", - TerminationMessagePolicy: v1.TerminationMessageFallbackToLogsOnError, - } - matchTerminationMessage(container, v1.PodFailed, gomega.Equal("DONE")) - }) - - /* - Release: v1.15 - Testname: Container Runtime, TerminationMessage, from log output of succeeding container - Description: Create a pod with an container. Container's output is recorded in log and container exits successfully without an error. When container is terminated, terminationMessage MUST have no content as container succeed. - [LinuxOnly]: Cannot mount files in Windows Containers. - */ - framework.ConformanceIt("should report termination message [LinuxOnly] as empty when pod succeeds and TerminationMessagePolicy FallbackToLogsOnError is set [NodeConformance]", func() { - container := v1.Container{ - Image: framework.BusyBoxImage, - Command: []string{"/bin/sh", "-c"}, - Args: []string{"/bin/echo -n DONE; /bin/true"}, - TerminationMessagePath: "/dev/termination-log", - TerminationMessagePolicy: v1.TerminationMessageFallbackToLogsOnError, - } - matchTerminationMessage(container, v1.PodSucceeded, gomega.Equal("")) - }) - - /* - Release: v1.15 - Testname: Container Runtime, TerminationMessage, from file of succeeding container - Description: Create a pod with an container. Container's output is recorded in a file and the container exits successfully without an error. When container is terminated, terminationMessage MUST match with the content from file. - [LinuxOnly]: Cannot mount files in Windows Containers. - */ - framework.ConformanceIt("should report termination message [LinuxOnly] from file when pod succeeds and TerminationMessagePolicy FallbackToLogsOnError is set [NodeConformance]", func() { - container := v1.Container{ - Image: framework.BusyBoxImage, - Command: []string{"/bin/sh", "-c"}, - Args: []string{"/bin/echo -n OK > /dev/termination-log; /bin/echo DONE; /bin/true"}, - TerminationMessagePath: "/dev/termination-log", - TerminationMessagePolicy: v1.TerminationMessageFallbackToLogsOnError, - } - matchTerminationMessage(container, v1.PodSucceeded, gomega.Equal("OK")) - }) - }) - - ginkgo.Context("when running a container with a new image", func() { - - // Images used for ConformanceContainer are not added into NodePrePullImageList, because this test is - // testing image pulling, these images don't need to be prepulled. The ImagePullPolicy - // is v1.PullAlways, so it won't be blocked by framework image pre-pull list check. - imagePullTest := func(image string, hasSecret bool, expectedPhase v1.PodPhase, expectedPullStatus bool, windowsImage bool) { - command := []string{"/bin/sh", "-c", "while true; do sleep 1; done"} - if windowsImage { - // -t: Ping the specified host until stopped. - command = []string{"ping", "-t", "localhost"} - } - container := ConformanceContainer{ - PodClient: f.PodClient(), - Container: v1.Container{ - Name: "image-pull-test", - Image: image, - Command: command, - ImagePullPolicy: v1.PullAlways, - }, - RestartPolicy: v1.RestartPolicyNever, - } - if hasSecret { - // The service account only has pull permission - auth := ` -{ - "auths": { - "https://gcr.io": { - "auth": "X2pzb25fa2V5OnsKICAidHlwZSI6ICJzZXJ2aWNlX2FjY291bnQiLAogICJwcm9qZWN0X2lkIjogImF1dGhlbnRpY2F0ZWQtaW1hZ2UtcHVsbGluZyIsCiAgInByaXZhdGVfa2V5X2lkIjogImI5ZjJhNjY0YWE5YjIwNDg0Y2MxNTg2MDYzZmVmZGExOTIyNGFjM2IiLAogICJwcml2YXRlX2tleSI6ICItLS0tLUJFR0lOIFBSSVZBVEUgS0VZLS0tLS1cbk1JSUV2UUlCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktjd2dnU2pBZ0VBQW9JQkFRQzdTSG5LVEVFaVlMamZcbkpmQVBHbUozd3JCY2VJNTBKS0xxS21GWE5RL3REWGJRK2g5YVl4aldJTDhEeDBKZTc0bVovS01uV2dYRjVLWlNcbm9BNktuSU85Yi9SY1NlV2VpSXRSekkzL1lYVitPNkNjcmpKSXl4anFWam5mVzJpM3NhMzd0OUE5VEZkbGZycm5cbjR6UkpiOWl4eU1YNGJMdHFGR3ZCMDNOSWl0QTNzVlo1ODhrb1FBZmgzSmhhQmVnTWorWjRSYko0aGVpQlFUMDNcbnZVbzViRWFQZVQ5RE16bHdzZWFQV2dydDZOME9VRGNBRTl4bGNJek11MjUzUG4vSzgySFpydEx4akd2UkhNVXhcbng0ZjhwSnhmQ3h4QlN3Z1NORit3OWpkbXR2b0wwRmE3ZGducFJlODZWRDY2ejNZenJqNHlLRXRqc2hLZHl5VWRcbkl5cVhoN1JSQWdNQkFBRUNnZ0VBT3pzZHdaeENVVlFUeEFka2wvSTVTRFVidi9NazRwaWZxYjJEa2FnbmhFcG9cbjFJajJsNGlWMTByOS9uenJnY2p5VlBBd3pZWk1JeDFBZVF0RDdoUzRHWmFweXZKWUc3NkZpWFpQUm9DVlB6b3VcbmZyOGRDaWFwbDV0enJDOWx2QXNHd29DTTdJWVRjZmNWdDdjRTEyRDNRS3NGNlo3QjJ6ZmdLS251WVBmK0NFNlRcbmNNMHkwaCtYRS9kMERvSERoVy96YU1yWEhqOFRvd2V1eXRrYmJzNGYvOUZqOVBuU2dET1lQd2xhbFZUcitGUWFcbkpSd1ZqVmxYcEZBUW14M0Jyd25rWnQzQ2lXV2lGM2QrSGk5RXRVYnRWclcxYjZnK1JRT0licWFtcis4YlJuZFhcbjZWZ3FCQWtKWjhSVnlkeFVQMGQxMUdqdU9QRHhCbkhCbmM0UW9rSXJFUUtCZ1FEMUNlaWN1ZGhXdGc0K2dTeGJcbnplanh0VjFONDFtZHVjQnpvMmp5b1dHbzNQVDh3ckJPL3lRRTM0cU9WSi9pZCs4SThoWjRvSWh1K0pBMDBzNmdcblRuSXErdi9kL1RFalk4MW5rWmlDa21SUFdiWHhhWXR4UjIxS1BYckxOTlFKS2ttOHRkeVh5UHFsOE1veUdmQ1dcbjJ2aVBKS05iNkhabnY5Q3lqZEo5ZzJMRG5RS0JnUUREcVN2eURtaGViOTIzSW96NGxlZ01SK205Z2xYVWdTS2dcbkVzZlllbVJmbU5XQitDN3ZhSXlVUm1ZNU55TXhmQlZXc3dXRldLYXhjK0krYnFzZmx6elZZdFpwMThNR2pzTURcbmZlZWZBWDZCWk1zVXQ3Qmw3WjlWSjg1bnRFZHFBQ0xwWitaLzN0SVJWdWdDV1pRMWhrbmxHa0dUMDI0SkVFKytcbk55SDFnM2QzUlFLQmdRQ1J2MXdKWkkwbVBsRklva0tGTkh1YTBUcDNLb1JTU1hzTURTVk9NK2xIckcxWHJtRjZcbkMwNGNTKzQ0N0dMUkxHOFVUaEpKbTRxckh0Ti9aK2dZOTYvMm1xYjRIakpORDM3TVhKQnZFYTN5ZUxTOHEvK1JcbjJGOU1LamRRaU5LWnhQcG84VzhOSlREWTVOa1BaZGh4a2pzSHdVNGRTNjZwMVRESUU0MGd0TFpaRFFLQmdGaldcbktyblFpTnEzOS9iNm5QOFJNVGJDUUFKbmR3anhTUU5kQTVmcW1rQTlhRk9HbCtqamsxQ1BWa0tNSWxLSmdEYkpcbk9heDl2OUc2Ui9NSTFIR1hmV3QxWU56VnRocjRIdHNyQTB0U3BsbWhwZ05XRTZWejZuQURqdGZQSnMyZUdqdlhcbmpQUnArdjhjY21MK3dTZzhQTGprM3ZsN2VlNXJsWWxNQndNdUdjUHhBb0dBZWRueGJXMVJMbVZubEFpSEx1L0xcbmxtZkF3RFdtRWlJMFVnK1BMbm9Pdk81dFE1ZDRXMS94RU44bFA0cWtzcGtmZk1Rbk5oNFNZR0VlQlQzMlpxQ1RcbkpSZ2YwWGpveXZ2dXA5eFhqTWtYcnBZL3ljMXpmcVRaQzBNTzkvMVVjMWJSR2RaMmR5M2xSNU5XYXA3T1h5Zk9cblBQcE5Gb1BUWGd2M3FDcW5sTEhyR3pNPVxuLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLVxuIiwKICAiY2xpZW50X2VtYWlsIjogImltYWdlLXB1bGxpbmdAYXV0aGVudGljYXRlZC1pbWFnZS1wdWxsaW5nLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwKICAiY2xpZW50X2lkIjogIjExMzc5NzkxNDUzMDA3MzI3ODcxMiIsCiAgImF1dGhfdXJpIjogImh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9vL29hdXRoMi9hdXRoIiwKICAidG9rZW5fdXJpIjogImh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9vL29hdXRoMi90b2tlbiIsCiAgImF1dGhfcHJvdmlkZXJfeDUwOV9jZXJ0X3VybCI6ICJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9vYXV0aDIvdjEvY2VydHMiLAogICJjbGllbnRfeDUwOV9jZXJ0X3VybCI6ICJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9yb2JvdC92MS9tZXRhZGF0YS94NTA5L2ltYWdlLXB1bGxpbmclNDBhdXRoZW50aWNhdGVkLWltYWdlLXB1bGxpbmcuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iCn0=", - "email": "image-pulling@authenticated-image-pulling.iam.gserviceaccount.com" - } - } -}` - // we might be told to use a different docker config JSON. - if framework.TestContext.DockerConfigFile != "" { - contents, err := ioutil.ReadFile(framework.TestContext.DockerConfigFile) - framework.ExpectNoError(err) - auth = string(contents) - } - secret := &v1.Secret{ - Data: map[string][]byte{v1.DockerConfigJsonKey: []byte(auth)}, - Type: v1.SecretTypeDockerConfigJson, - } - secret.Name = "image-pull-secret-" + string(uuid.NewUUID()) - ginkgo.By("create image pull secret") - _, err := f.ClientSet.CoreV1().Secrets(f.Namespace.Name).Create(context.TODO(), secret, metav1.CreateOptions{}) - framework.ExpectNoError(err) - defer f.ClientSet.CoreV1().Secrets(f.Namespace.Name).Delete(context.TODO(), secret.Name, metav1.DeleteOptions{}) - container.ImagePullSecrets = []string{secret.Name} - } - // checkContainerStatus checks whether the container status matches expectation. - checkContainerStatus := func() error { - status, err := container.GetStatus() - if err != nil { - return fmt.Errorf("failed to get container status: %v", err) - } - // We need to check container state first. The default pod status is pending, If we check pod phase first, - // and the expected pod phase is Pending, the container status may not even show up when we check it. - // Check container state - if !expectedPullStatus { - if status.State.Running == nil { - return fmt.Errorf("expected container state: Running, got: %q", - GetContainerState(status.State)) - } - } - if expectedPullStatus { - if status.State.Waiting == nil { - return fmt.Errorf("expected container state: Waiting, got: %q", - GetContainerState(status.State)) - } - reason := status.State.Waiting.Reason - if reason != images.ErrImagePull.Error() && - reason != images.ErrImagePullBackOff.Error() { - return fmt.Errorf("unexpected waiting reason: %q", reason) - } - } - // Check pod phase - phase, err := container.GetPhase() - if err != nil { - return fmt.Errorf("failed to get pod phase: %v", err) - } - if phase != expectedPhase { - return fmt.Errorf("expected pod phase: %q, got: %q", expectedPhase, phase) - } - return nil - } - - // The image registry is not stable, which sometimes causes the test to fail. Add retry mechanism to make this less flaky. - const flakeRetry = 3 - for i := 1; i <= flakeRetry; i++ { - var err error - ginkgo.By("create the container") - container.Create() - ginkgo.By("check the container status") - for start := time.Now(); time.Since(start) < ContainerStatusRetryTimeout; time.Sleep(ContainerStatusPollInterval) { - if err = checkContainerStatus(); err == nil { - break - } - } - ginkgo.By("delete the container") - container.Delete() - if err == nil { - break - } - if i < flakeRetry { - framework.Logf("No.%d attempt failed: %v, retrying...", i, err) - } else { - framework.Failf("All %d attempts failed: %v", flakeRetry, err) - } - } - } - - ginkgo.It("should not be able to pull image from invalid registry [NodeConformance]", func() { - image := imageutils.GetE2EImage(imageutils.InvalidRegistryImage) - imagePullTest(image, false, v1.PodPending, true, false) - }) - - ginkgo.It("should be able to pull image [NodeConformance]", func() { - // NOTE(claudiub): The agnhost image is supposed to work on both Linux and Windows. - image := imageutils.GetE2EImage(imageutils.Agnhost) - imagePullTest(image, false, v1.PodRunning, false, false) - }) - - ginkgo.It("should not be able to pull from private registry without secret [NodeConformance]", func() { - image := imageutils.GetE2EImage(imageutils.AuthenticatedAlpine) - imagePullTest(image, false, v1.PodPending, true, false) - }) - - ginkgo.It("should be able to pull from private registry with secret [NodeConformance]", func() { - image := imageutils.GetE2EImage(imageutils.AuthenticatedAlpine) - isWindows := false - if framework.NodeOSDistroIs("windows") { - image = imageutils.GetE2EImage(imageutils.AuthenticatedWindowsNanoServer) - isWindows = true - } - imagePullTest(image, true, v1.PodRunning, false, isWindows) - }) - }) - }) -}) diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/runtimeclass.go b/vendor/k8s.io/kubernetes/test/e2e/common/runtimeclass.go deleted file mode 100644 index 761cc19d813a..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/common/runtimeclass.go +++ /dev/null @@ -1,288 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package common - -import ( - "context" - "fmt" - "time" - - v1 "k8s.io/api/core/v1" - nodev1 "k8s.io/api/node/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/fields" - types "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/util/wait" - "k8s.io/apimachinery/pkg/watch" - "k8s.io/kubernetes/pkg/kubelet/events" - runtimeclasstest "k8s.io/kubernetes/pkg/kubelet/runtimeclass/testing" - "k8s.io/kubernetes/test/e2e/framework" - e2eevents "k8s.io/kubernetes/test/e2e/framework/events" - e2enode "k8s.io/kubernetes/test/e2e/framework/node" - e2epod "k8s.io/kubernetes/test/e2e/framework/pod" - - "github.com/onsi/ginkgo" -) - -var _ = ginkgo.Describe("[sig-node] RuntimeClass", func() { - f := framework.NewDefaultFramework("runtimeclass") - - ginkgo.It("should reject a Pod requesting a non-existent RuntimeClass [NodeFeature:RuntimeHandler]", func() { - rcName := f.Namespace.Name + "-nonexistent" - expectPodRejection(f, e2enode.NewRuntimeClassPod(rcName)) - }) - - ginkgo.It("should reject a Pod requesting a RuntimeClass with an unconfigured handler [NodeFeature:RuntimeHandler]", func() { - handler := f.Namespace.Name + "-handler" - rcName := createRuntimeClass(f, "unconfigured-handler", handler) - pod := f.PodClient().Create(e2enode.NewRuntimeClassPod(rcName)) - expectSandboxFailureEvent(f, pod, handler) - }) - - // This test requires that the PreconfiguredRuntimeHandler has already been set up on nodes. - ginkgo.It("should run a Pod requesting a RuntimeClass with a configured handler [NodeFeature:RuntimeHandler]", func() { - // The built-in docker runtime does not support configuring runtime handlers. - handler := e2enode.PreconfiguredRuntimeClassHandler(framework.TestContext.ContainerRuntime) - - rcName := createRuntimeClass(f, "preconfigured-handler", handler) - pod := f.PodClient().Create(e2enode.NewRuntimeClassPod(rcName)) - expectPodSuccess(f, pod) - }) - - ginkgo.It("should reject a Pod requesting a deleted RuntimeClass [NodeFeature:RuntimeHandler]", func() { - rcName := createRuntimeClass(f, "delete-me", "runc") - rcClient := f.ClientSet.NodeV1().RuntimeClasses() - - ginkgo.By("Deleting RuntimeClass "+rcName, func() { - err := rcClient.Delete(context.TODO(), rcName, metav1.DeleteOptions{}) - framework.ExpectNoError(err, "failed to delete RuntimeClass %s", rcName) - - ginkgo.By("Waiting for the RuntimeClass to disappear") - framework.ExpectNoError(wait.PollImmediate(framework.Poll, time.Minute, func() (bool, error) { - _, err := rcClient.Get(context.TODO(), rcName, metav1.GetOptions{}) - if apierrors.IsNotFound(err) { - return true, nil // done - } - if err != nil { - return true, err // stop wait with error - } - return false, nil - })) - }) - - expectPodRejection(f, e2enode.NewRuntimeClassPod(rcName)) - }) - - /* - Release: v1.20 - Testname: RuntimeClass API - Description: - The node.k8s.io API group MUST exist in the /apis discovery document. - The node.k8s.io/v1 API group/version MUST exist in the /apis/mode.k8s.io discovery document. - The runtimeclasses resource MUST exist in the /apis/node.k8s.io/v1 discovery document. - The runtimeclasses resource must support create, get, list, watch, update, patch, delete, and deletecollection. - */ - framework.ConformanceIt(" should support RuntimeClasses API operations", func() { - // Setup - rcVersion := "v1" - rcClient := f.ClientSet.NodeV1().RuntimeClasses() - - // This is a conformance test that must configure opaque handlers to validate CRUD operations. - // Test should not use any existing handler like gVisor or runc - // - // All CRUD operations in this test are limited to the objects with the label test=f.UniqueName - rc := runtimeclasstest.NewRuntimeClass(f.UniqueName+"-handler", f.UniqueName+"-conformance-runtime-class") - rc.SetLabels(map[string]string{"test": f.UniqueName}) - rc2 := runtimeclasstest.NewRuntimeClass(f.UniqueName+"-handler2", f.UniqueName+"-conformance-runtime-class2") - rc2.SetLabels(map[string]string{"test": f.UniqueName}) - rc3 := runtimeclasstest.NewRuntimeClass(f.UniqueName+"-handler3", f.UniqueName+"-conformance-runtime-class3") - rc3.SetLabels(map[string]string{"test": f.UniqueName}) - - // Discovery - - ginkgo.By("getting /apis") - { - discoveryGroups, err := f.ClientSet.Discovery().ServerGroups() - framework.ExpectNoError(err) - found := false - for _, group := range discoveryGroups.Groups { - if group.Name == nodev1.GroupName { - for _, version := range group.Versions { - if version.Version == rcVersion { - found = true - break - } - } - } - } - framework.ExpectEqual(found, true, fmt.Sprintf("expected RuntimeClass API group/version, got %#v", discoveryGroups.Groups)) - } - - ginkgo.By("getting /apis/node.k8s.io") - { - group := &metav1.APIGroup{} - err := f.ClientSet.Discovery().RESTClient().Get().AbsPath("/apis/node.k8s.io").Do(context.TODO()).Into(group) - framework.ExpectNoError(err) - found := false - for _, version := range group.Versions { - if version.Version == rcVersion { - found = true - break - } - } - framework.ExpectEqual(found, true, fmt.Sprintf("expected RuntimeClass API version, got %#v", group.Versions)) - } - - ginkgo.By("getting /apis/node.k8s.io/" + rcVersion) - { - resources, err := f.ClientSet.Discovery().ServerResourcesForGroupVersion(nodev1.SchemeGroupVersion.String()) - framework.ExpectNoError(err) - found := false - for _, resource := range resources.APIResources { - switch resource.Name { - case "runtimeclasses": - found = true - } - } - framework.ExpectEqual(found, true, fmt.Sprintf("expected runtimeclasses, got %#v", resources.APIResources)) - } - - // Main resource create/read/update/watch operations - - ginkgo.By("creating") - createdRC, err := rcClient.Create(context.TODO(), rc, metav1.CreateOptions{}) - framework.ExpectNoError(err) - _, err = rcClient.Create(context.TODO(), rc, metav1.CreateOptions{}) - framework.ExpectEqual(apierrors.IsAlreadyExists(err), true, fmt.Sprintf("expected 409, got %#v", err)) - _, err = rcClient.Create(context.TODO(), rc2, metav1.CreateOptions{}) - framework.ExpectNoError(err) - - ginkgo.By("watching") - framework.Logf("starting watch") - rcWatch, err := rcClient.Watch(context.TODO(), metav1.ListOptions{LabelSelector: "test=" + f.UniqueName}) - framework.ExpectNoError(err) - - // added for a watch - _, err = rcClient.Create(context.TODO(), rc3, metav1.CreateOptions{}) - framework.ExpectNoError(err) - - ginkgo.By("getting") - gottenRC, err := rcClient.Get(context.TODO(), rc.Name, metav1.GetOptions{}) - framework.ExpectNoError(err) - framework.ExpectEqual(gottenRC.UID, createdRC.UID) - - ginkgo.By("listing") - rcs, err := rcClient.List(context.TODO(), metav1.ListOptions{LabelSelector: "test=" + f.UniqueName}) - framework.ExpectNoError(err) - framework.ExpectEqual(len(rcs.Items), 3, "filtered list should have 3 items") - - ginkgo.By("patching") - patchedRC, err := rcClient.Patch(context.TODO(), createdRC.Name, types.MergePatchType, []byte(`{"metadata":{"annotations":{"patched":"true"}}}`), metav1.PatchOptions{}) - framework.ExpectNoError(err) - framework.ExpectEqual(patchedRC.Annotations["patched"], "true", "patched object should have the applied annotation") - - ginkgo.By("updating") - csrToUpdate := patchedRC.DeepCopy() - csrToUpdate.Annotations["updated"] = "true" - updatedRC, err := rcClient.Update(context.TODO(), csrToUpdate, metav1.UpdateOptions{}) - framework.ExpectNoError(err) - framework.ExpectEqual(updatedRC.Annotations["updated"], "true", "updated object should have the applied annotation") - - framework.Logf("waiting for watch events with expected annotations") - for sawAdded, sawPatched, sawUpdated := false, false, false; !sawAdded && !sawPatched && !sawUpdated; { - select { - case evt, ok := <-rcWatch.ResultChan(): - framework.ExpectEqual(ok, true, "watch channel should not close") - if evt.Type == watch.Modified { - watchedRC, isRC := evt.Object.(*nodev1.RuntimeClass) - framework.ExpectEqual(isRC, true, fmt.Sprintf("expected RC, got %T", evt.Object)) - if watchedRC.Annotations["patched"] == "true" { - framework.Logf("saw patched annotations") - sawPatched = true - } else if watchedRC.Annotations["updated"] == "true" { - framework.Logf("saw updated annotations") - sawUpdated = true - } else { - framework.Logf("missing expected annotations, waiting: %#v", watchedRC.Annotations) - } - } else if evt.Type == watch.Added { - _, isRC := evt.Object.(*nodev1.RuntimeClass) - framework.ExpectEqual(isRC, true, fmt.Sprintf("expected RC, got %T", evt.Object)) - sawAdded = true - } - - case <-time.After(wait.ForeverTestTimeout): - framework.Fail("timed out waiting for watch event") - } - } - rcWatch.Stop() - - // main resource delete operations - - ginkgo.By("deleting") - err = rcClient.Delete(context.TODO(), createdRC.Name, metav1.DeleteOptions{}) - framework.ExpectNoError(err) - _, err = rcClient.Get(context.TODO(), createdRC.Name, metav1.GetOptions{}) - framework.ExpectEqual(apierrors.IsNotFound(err), true, fmt.Sprintf("expected 404, got %#v", err)) - rcs, err = rcClient.List(context.TODO(), metav1.ListOptions{LabelSelector: "test=" + f.UniqueName}) - framework.ExpectNoError(err) - framework.ExpectEqual(len(rcs.Items), 2, "filtered list should have 2 items") - - ginkgo.By("deleting a collection") - err = rcClient.DeleteCollection(context.TODO(), metav1.DeleteOptions{}, metav1.ListOptions{LabelSelector: "test=" + f.UniqueName}) - framework.ExpectNoError(err) - rcs, err = rcClient.List(context.TODO(), metav1.ListOptions{LabelSelector: "test=" + f.UniqueName}) - framework.ExpectNoError(err) - framework.ExpectEqual(len(rcs.Items), 0, "filtered list should have 0 items") - }) -}) - -// createRuntimeClass generates a RuntimeClass with the desired handler and a "namespaced" name, -// synchronously creates it, and returns the generated name. -func createRuntimeClass(f *framework.Framework, name, handler string) string { - uniqueName := fmt.Sprintf("%s-%s", f.Namespace.Name, name) - rc := runtimeclasstest.NewRuntimeClass(uniqueName, handler) - rc, err := f.ClientSet.NodeV1().RuntimeClasses().Create(context.TODO(), rc, metav1.CreateOptions{}) - framework.ExpectNoError(err, "failed to create RuntimeClass resource") - return rc.GetName() -} - -func expectPodRejection(f *framework.Framework, pod *v1.Pod) { - _, err := f.ClientSet.CoreV1().Pods(f.Namespace.Name).Create(context.TODO(), pod, metav1.CreateOptions{}) - framework.ExpectError(err, "should be forbidden") - framework.ExpectEqual(apierrors.IsForbidden(err), true, "should be forbidden error") -} - -// expectPodSuccess waits for the given pod to terminate successfully. -func expectPodSuccess(f *framework.Framework, pod *v1.Pod) { - framework.ExpectNoError(e2epod.WaitForPodSuccessInNamespace( - f.ClientSet, pod.Name, f.Namespace.Name)) -} - -// expectSandboxFailureEvent polls for an event with reason "FailedCreatePodSandBox" containing the -// expected message string. -func expectSandboxFailureEvent(f *framework.Framework, pod *v1.Pod, msg string) { - eventSelector := fields.Set{ - "involvedObject.kind": "Pod", - "involvedObject.name": pod.Name, - "involvedObject.namespace": f.Namespace.Name, - "reason": events.FailedCreatePodSandBox, - }.AsSelector().String() - framework.ExpectNoError(e2eevents.WaitTimeoutForEvent( - f.ClientSet, f.Namespace.Name, eventSelector, msg, framework.PodEventTimeout)) -} diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/secrets.go b/vendor/k8s.io/kubernetes/test/e2e/common/secrets.go deleted file mode 100644 index cfc887542a3b..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/common/secrets.go +++ /dev/null @@ -1,263 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package common - -import ( - "context" - "encoding/json" - "fmt" - - v1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/uuid" - "k8s.io/kubernetes/test/e2e/framework" - imageutils "k8s.io/kubernetes/test/utils/image" - - "encoding/base64" - - "github.com/onsi/ginkgo" - "k8s.io/apimachinery/pkg/types" -) - -var _ = ginkgo.Describe("[sig-api-machinery] Secrets", func() { - f := framework.NewDefaultFramework("secrets") - - /* - Release: v1.9 - Testname: Secrets, pod environment field - Description: Create a secret. Create a Pod with Container that declares a environment variable which references the secret created to extract a key value from the secret. Pod MUST have the environment variable that contains proper value for the key to the secret. - */ - framework.ConformanceIt("should be consumable from pods in env vars [NodeConformance]", func() { - name := "secret-test-" + string(uuid.NewUUID()) - secret := secretForTest(f.Namespace.Name, name) - - ginkgo.By(fmt.Sprintf("Creating secret with name %s", secret.Name)) - var err error - if secret, err = f.ClientSet.CoreV1().Secrets(f.Namespace.Name).Create(context.TODO(), secret, metav1.CreateOptions{}); err != nil { - framework.Failf("unable to create test secret %s: %v", secret.Name, err) - } - - pod := &v1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - Name: "pod-secrets-" + string(uuid.NewUUID()), - }, - Spec: v1.PodSpec{ - Containers: []v1.Container{ - { - Name: "secret-env-test", - Image: imageutils.GetE2EImage(imageutils.BusyBox), - Command: []string{"sh", "-c", "env"}, - Env: []v1.EnvVar{ - { - Name: "SECRET_DATA", - ValueFrom: &v1.EnvVarSource{ - SecretKeyRef: &v1.SecretKeySelector{ - LocalObjectReference: v1.LocalObjectReference{ - Name: name, - }, - Key: "data-1", - }, - }, - }, - }, - }, - }, - RestartPolicy: v1.RestartPolicyNever, - }, - } - - f.TestContainerOutput("consume secrets", pod, 0, []string{ - "SECRET_DATA=value-1", - }) - }) - - /* - Release: v1.9 - Testname: Secrets, pod environment from source - Description: Create a secret. Create a Pod with Container that declares a environment variable using 'EnvFrom' which references the secret created to extract a key value from the secret. Pod MUST have the environment variable that contains proper value for the key to the secret. - */ - framework.ConformanceIt("should be consumable via the environment [NodeConformance]", func() { - name := "secret-test-" + string(uuid.NewUUID()) - secret := newEnvFromSecret(f.Namespace.Name, name) - ginkgo.By(fmt.Sprintf("creating secret %v/%v", f.Namespace.Name, secret.Name)) - var err error - if secret, err = f.ClientSet.CoreV1().Secrets(f.Namespace.Name).Create(context.TODO(), secret, metav1.CreateOptions{}); err != nil { - framework.Failf("unable to create test secret %s: %v", secret.Name, err) - } - - pod := &v1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - Name: "pod-configmaps-" + string(uuid.NewUUID()), - }, - Spec: v1.PodSpec{ - Containers: []v1.Container{ - { - Name: "env-test", - Image: imageutils.GetE2EImage(imageutils.BusyBox), - Command: []string{"sh", "-c", "env"}, - EnvFrom: []v1.EnvFromSource{ - { - SecretRef: &v1.SecretEnvSource{LocalObjectReference: v1.LocalObjectReference{Name: name}}, - }, - { - Prefix: "p_", - SecretRef: &v1.SecretEnvSource{LocalObjectReference: v1.LocalObjectReference{Name: name}}, - }, - }, - }, - }, - RestartPolicy: v1.RestartPolicyNever, - }, - } - - f.TestContainerOutput("consume secrets", pod, 0, []string{ - "data_1=value-1", "data_2=value-2", "data_3=value-3", - "p_data_1=value-1", "p_data_2=value-2", "p_data_3=value-3", - }) - }) - - /* - Release: v1.15 - Testname: Secrets, with empty-key - Description: Attempt to create a Secret with an empty key. The creation MUST fail. - */ - framework.ConformanceIt("should fail to create secret due to empty secret key", func() { - secret, err := createEmptyKeySecretForTest(f) - framework.ExpectError(err, "created secret %q with empty key in namespace %q", secret.Name, f.Namespace.Name) - }) - - /* - Release: v1.18 - Testname: Secret patching - Description: A Secret is created. - Listing all Secrets MUST return an empty list. - Given the patching and fetching of the Secret, the fields MUST equal the new values. - The Secret is deleted by it's static Label. - Secrets are listed finally, the list MUST NOT include the originally created Secret. - */ - framework.ConformanceIt("should patch a secret", func() { - ginkgo.By("creating a secret") - - secretTestName := "test-secret-" + string(uuid.NewUUID()) - - // create a secret in the test namespace - _, err := f.ClientSet.CoreV1().Secrets(f.Namespace.Name).Create(context.TODO(), &v1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Name: secretTestName, - Labels: map[string]string{ - "testsecret-constant": "true", - }, - }, - Data: map[string][]byte{ - "key": []byte("value"), - }, - Type: "Opaque", - }, metav1.CreateOptions{}) - framework.ExpectNoError(err, "failed to create secret") - - ginkgo.By("listing secrets in all namespaces to ensure that there are more than zero") - // list all secrets in all namespaces to ensure endpoint coverage - secretsList, err := f.ClientSet.CoreV1().Secrets("").List(context.TODO(), metav1.ListOptions{ - LabelSelector: "testsecret-constant=true", - }) - framework.ExpectNoError(err, "failed to list secrets") - framework.ExpectNotEqual(len(secretsList.Items), 0, "no secrets found") - - foundCreatedSecret := false - var secretCreatedName string - for _, val := range secretsList.Items { - if val.ObjectMeta.Name == secretTestName && val.ObjectMeta.Namespace == f.Namespace.Name { - foundCreatedSecret = true - secretCreatedName = val.ObjectMeta.Name - break - } - } - framework.ExpectEqual(foundCreatedSecret, true, "unable to find secret by its value") - - ginkgo.By("patching the secret") - // patch the secret in the test namespace - secretPatchNewData := base64.StdEncoding.EncodeToString([]byte("value1")) - secretPatch, err := json.Marshal(map[string]interface{}{ - "metadata": map[string]interface{}{ - "labels": map[string]string{"testsecret": "true"}, - }, - "data": map[string][]byte{"key": []byte(secretPatchNewData)}, - }) - framework.ExpectNoError(err, "failed to marshal JSON") - _, err = f.ClientSet.CoreV1().Secrets(f.Namespace.Name).Patch(context.TODO(), secretCreatedName, types.StrategicMergePatchType, []byte(secretPatch), metav1.PatchOptions{}) - framework.ExpectNoError(err, "failed to patch secret") - - secret, err := f.ClientSet.CoreV1().Secrets(f.Namespace.Name).Get(context.TODO(), secretCreatedName, metav1.GetOptions{}) - framework.ExpectNoError(err, "failed to get secret") - - secretDecodedstring, err := base64.StdEncoding.DecodeString(string(secret.Data["key"])) - framework.ExpectNoError(err, "failed to decode secret from Base64") - - framework.ExpectEqual(string(secretDecodedstring), "value1", "found secret, but the data wasn't updated from the patch") - - ginkgo.By("deleting the secret using a LabelSelector") - err = f.ClientSet.CoreV1().Secrets(f.Namespace.Name).DeleteCollection(context.TODO(), metav1.DeleteOptions{}, metav1.ListOptions{ - LabelSelector: "testsecret=true", - }) - framework.ExpectNoError(err, "failed to delete patched secret") - - ginkgo.By("listing secrets in all namespaces, searching for label name and value in patch") - // list all secrets in all namespaces - secretsList, err = f.ClientSet.CoreV1().Secrets("").List(context.TODO(), metav1.ListOptions{ - LabelSelector: "testsecret-constant=true", - }) - framework.ExpectNoError(err, "failed to list secrets") - - foundCreatedSecret = false - for _, val := range secretsList.Items { - if val.ObjectMeta.Name == secretTestName && val.ObjectMeta.Namespace == f.Namespace.Name { - foundCreatedSecret = true - break - } - } - framework.ExpectEqual(foundCreatedSecret, false, "secret was not deleted successfully") - }) -}) - -func newEnvFromSecret(namespace, name string) *v1.Secret { - return &v1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: namespace, - Name: name, - }, - Data: map[string][]byte{ - "data_1": []byte("value-1\n"), - "data_2": []byte("value-2\n"), - "data_3": []byte("value-3\n"), - }, - } -} - -func createEmptyKeySecretForTest(f *framework.Framework) (*v1.Secret, error) { - secretName := "secret-emptykey-test-" + string(uuid.NewUUID()) - secret := &v1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: f.Namespace.Name, - Name: secretName, - }, - Data: map[string][]byte{ - "": []byte("value-1\n"), - }, - } - ginkgo.By(fmt.Sprintf("Creating projection with secret that has name %s", secret.Name)) - return f.ClientSet.CoreV1().Secrets(f.Namespace.Name).Create(context.TODO(), secret, metav1.CreateOptions{}) -} diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/storage/OWNERS b/vendor/k8s.io/kubernetes/test/e2e/common/storage/OWNERS new file mode 100644 index 000000000000..c625bd43801f --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/common/storage/OWNERS @@ -0,0 +1,4 @@ +# See the OWNERS docs at https://go.k8s.io/owners + +labels: +- sig/storage diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/configmap_volume.go b/vendor/k8s.io/kubernetes/test/e2e/common/storage/configmap_volume.go similarity index 97% rename from vendor/k8s.io/kubernetes/test/e2e/common/configmap_volume.go rename to vendor/k8s.io/kubernetes/test/e2e/common/storage/configmap_volume.go index 468960f8487d..999987551f2f 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/common/configmap_volume.go +++ b/vendor/k8s.io/kubernetes/test/e2e/common/storage/configmap_volume.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package common +package storage import ( "context" @@ -33,7 +33,7 @@ import ( imageutils "k8s.io/kubernetes/test/utils/image" ) -var _ = ginkgo.Describe("[sig-storage] ConfigMap", func() { +var _ = SIGDescribe("ConfigMap", func() { f := framework.NewDefaultFramework("configmap") /* @@ -213,7 +213,8 @@ var _ = ginkgo.Describe("[sig-storage] ConfigMap", func() { }) ginkgo.By("Creating the pod") - f.PodClient().CreateSync(pod) + f.PodClient().Create(pod) + e2epod.WaitForPodNameRunningInNamespace(f.ClientSet, pod.Name, f.Namespace.Name) pollLogs1 := func() (string, error) { return e2epod.GetPodLogs(f.ClientSet, f.Namespace.Name, pod.Name, pod.Spec.Containers[0].Name) @@ -488,9 +489,16 @@ var _ = ginkgo.Describe("[sig-storage] ConfigMap", func() { }) - // It should be forbidden to change data for configmaps marked as immutable, but - // allowed to modify its metadata independently of its state. - ginkgo.It("should be immutable if `immutable` field is set", func() { + /* + Release: v1.21 + Testname: ConfigMap Volume, immutability + Description: Create a ConfigMap. Update it's data field, the update MUST succeed. + Mark the ConfigMap as immutable, the update MUST succeed. Try to update its data, the update MUST fail. + Try to mark the ConfigMap back as not immutable, the update MUST fail. + Try to update the ConfigMap`s metadata (labels), the update must succeed. + Try to delete the ConfigMap, the deletion must succeed. + */ + framework.ConformanceIt("should be immutable if `immutable` field is set", func() { name := "immutable" configMap := newConfigMap(f, name) diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/storage/downwardapi.go b/vendor/k8s.io/kubernetes/test/e2e/common/storage/downwardapi.go new file mode 100644 index 000000000000..df97bb9a85bf --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/common/storage/downwardapi.go @@ -0,0 +1,140 @@ +/* +Copyright 2016 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package storage + +import ( + "fmt" + + v1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/uuid" + "k8s.io/kubernetes/test/e2e/framework" + e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" + imageutils "k8s.io/kubernetes/test/utils/image" + + "github.com/onsi/ginkgo" +) + +var _ = SIGDescribe("Downward API [Serial] [Disruptive] [NodeFeature:EphemeralStorage]", func() { + f := framework.NewDefaultFramework("downward-api") + + ginkgo.Context("Downward API tests for local ephemeral storage", func() { + ginkgo.BeforeEach(func() { + e2eskipper.SkipUnlessLocalEphemeralStorageEnabled() + }) + + ginkgo.It("should provide container's limits.ephemeral-storage and requests.ephemeral-storage as env vars", func() { + podName := "downward-api-" + string(uuid.NewUUID()) + env := []v1.EnvVar{ + { + Name: "EPHEMERAL_STORAGE_LIMIT", + ValueFrom: &v1.EnvVarSource{ + ResourceFieldRef: &v1.ResourceFieldSelector{ + Resource: "limits.ephemeral-storage", + }, + }, + }, + { + Name: "EPHEMERAL_STORAGE_REQUEST", + ValueFrom: &v1.EnvVarSource{ + ResourceFieldRef: &v1.ResourceFieldSelector{ + Resource: "requests.ephemeral-storage", + }, + }, + }, + } + expectations := []string{ + fmt.Sprintf("EPHEMERAL_STORAGE_LIMIT=%d", 64*1024*1024), + fmt.Sprintf("EPHEMERAL_STORAGE_REQUEST=%d", 32*1024*1024), + } + + testDownwardAPIForEphemeralStorage(f, podName, env, expectations) + }) + + ginkgo.It("should provide default limits.ephemeral-storage from node allocatable", func() { + podName := "downward-api-" + string(uuid.NewUUID()) + env := []v1.EnvVar{ + { + Name: "EPHEMERAL_STORAGE_LIMIT", + ValueFrom: &v1.EnvVarSource{ + ResourceFieldRef: &v1.ResourceFieldSelector{ + Resource: "limits.ephemeral-storage", + }, + }, + }, + } + expectations := []string{ + "EPHEMERAL_STORAGE_LIMIT=[1-9]", + } + pod := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: podName, + Labels: map[string]string{"name": podName}, + }, + Spec: v1.PodSpec{ + Containers: []v1.Container{ + { + Name: "dapi-container", + Image: imageutils.GetE2EImage(imageutils.BusyBox), + Command: []string{"sh", "-c", "env"}, + Env: env, + }, + }, + RestartPolicy: v1.RestartPolicyNever, + }, + } + + testDownwardAPIUsingPod(f, pod, env, expectations) + }) + }) + +}) + +func testDownwardAPIForEphemeralStorage(f *framework.Framework, podName string, env []v1.EnvVar, expectations []string) { + pod := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: podName, + Labels: map[string]string{"name": podName}, + }, + Spec: v1.PodSpec{ + Containers: []v1.Container{ + { + Name: "dapi-container", + Image: imageutils.GetE2EImage(imageutils.BusyBox), + Command: []string{"sh", "-c", "env"}, + Resources: v1.ResourceRequirements{ + Requests: v1.ResourceList{ + v1.ResourceEphemeralStorage: resource.MustParse("32Mi"), + }, + Limits: v1.ResourceList{ + v1.ResourceEphemeralStorage: resource.MustParse("64Mi"), + }, + }, + Env: env, + }, + }, + RestartPolicy: v1.RestartPolicyNever, + }, + } + + testDownwardAPIUsingPod(f, pod, env, expectations) +} + +func testDownwardAPIUsingPod(f *framework.Framework, pod *v1.Pod, env []v1.EnvVar, expectations []string) { + f.TestContainerOutputRegexp("downward api env vars", pod, 0, expectations) +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/downwardapi_volume.go b/vendor/k8s.io/kubernetes/test/e2e/common/storage/downwardapi_volume.go similarity index 99% rename from vendor/k8s.io/kubernetes/test/e2e/common/downwardapi_volume.go rename to vendor/k8s.io/kubernetes/test/e2e/common/storage/downwardapi_volume.go index c2f4c0713a16..bb442fcf613c 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/common/downwardapi_volume.go +++ b/vendor/k8s.io/kubernetes/test/e2e/common/storage/downwardapi_volume.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package common +package storage import ( "fmt" @@ -33,7 +33,7 @@ import ( "github.com/onsi/gomega" ) -var _ = ginkgo.Describe("[sig-storage] Downward API volume", func() { +var _ = SIGDescribe("Downward API volume", func() { // How long to wait for a log pod to be displayed const podLogTimeout = 3 * time.Minute f := framework.NewDefaultFramework("downward-api") diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/empty_dir.go b/vendor/k8s.io/kubernetes/test/e2e/common/storage/empty_dir.go similarity index 97% rename from vendor/k8s.io/kubernetes/test/e2e/common/empty_dir.go rename to vendor/k8s.io/kubernetes/test/e2e/common/storage/empty_dir.go index 29b5199370c0..ff72f155a072 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/common/empty_dir.go +++ b/vendor/k8s.io/kubernetes/test/e2e/common/storage/empty_dir.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package common +package storage import ( "context" @@ -39,10 +39,10 @@ const ( ) var ( - nonRootUid = int64(1001) + nonRootUID = int64(1001) ) -var _ = ginkgo.Describe("[sig-storage] EmptyDir volumes", func() { +var _ = SIGDescribe("EmptyDir volumes", func() { f := framework.NewDefaultFramework("emptydir") ginkgo.Context("when FSGroup is specified [LinuxOnly] [NodeFeature:FSGroup]", func() { @@ -57,11 +57,11 @@ var _ = ginkgo.Describe("[sig-storage] EmptyDir volumes", func() { }) ginkgo.It("new files should be created with FSGroup ownership when container is non-root", func() { - doTestSetgidFSGroup(f, nonRootUid, v1.StorageMediumMemory) + doTestSetgidFSGroup(f, nonRootUID, v1.StorageMediumMemory) }) ginkgo.It("nonexistent volume subPath should have the correct mode and owner using FSGroup", func() { - doTestSubPathFSGroup(f, nonRootUid, v1.StorageMediumMemory) + doTestSubPathFSGroup(f, nonRootUID, v1.StorageMediumMemory) }) ginkgo.It("files with FSGroup ownership should support (root,0644,tmpfs)", func() { @@ -124,7 +124,7 @@ var _ = ginkgo.Describe("[sig-storage] EmptyDir volumes", func() { This test is marked LinuxOnly since Windows does not support setting specific file permissions, or running as UID / GID, or the medium = 'Memory'. */ framework.ConformanceIt("should support (non-root,0644,tmpfs) [LinuxOnly] [NodeConformance]", func() { - doTest0644(f, nonRootUid, v1.StorageMediumMemory) + doTest0644(f, nonRootUID, v1.StorageMediumMemory) }) /* @@ -134,7 +134,7 @@ var _ = ginkgo.Describe("[sig-storage] EmptyDir volumes", func() { This test is marked LinuxOnly since Windows does not support setting specific file permissions, or running as UID / GID, or the medium = 'Memory'. */ framework.ConformanceIt("should support (non-root,0666,tmpfs) [LinuxOnly] [NodeConformance]", func() { - doTest0666(f, nonRootUid, v1.StorageMediumMemory) + doTest0666(f, nonRootUID, v1.StorageMediumMemory) }) /* @@ -144,7 +144,7 @@ var _ = ginkgo.Describe("[sig-storage] EmptyDir volumes", func() { This test is marked LinuxOnly since Windows does not support setting specific file permissions, or running as UID / GID, or the medium = 'Memory'. */ framework.ConformanceIt("should support (non-root,0777,tmpfs) [LinuxOnly] [NodeConformance]", func() { - doTest0777(f, nonRootUid, v1.StorageMediumMemory) + doTest0777(f, nonRootUID, v1.StorageMediumMemory) }) /* @@ -194,7 +194,7 @@ var _ = ginkgo.Describe("[sig-storage] EmptyDir volumes", func() { This test is marked LinuxOnly since Windows does not support setting specific file permissions, or running as UID / GID. */ framework.ConformanceIt("should support (non-root,0644,default) [LinuxOnly] [NodeConformance]", func() { - doTest0644(f, nonRootUid, v1.StorageMediumDefault) + doTest0644(f, nonRootUID, v1.StorageMediumDefault) }) /* @@ -204,7 +204,7 @@ var _ = ginkgo.Describe("[sig-storage] EmptyDir volumes", func() { This test is marked LinuxOnly since Windows does not support setting specific file permissions, or running as UID / GID. */ framework.ConformanceIt("should support (non-root,0666,default) [LinuxOnly] [NodeConformance]", func() { - doTest0666(f, nonRootUid, v1.StorageMediumDefault) + doTest0666(f, nonRootUID, v1.StorageMediumDefault) }) /* @@ -214,7 +214,7 @@ var _ = ginkgo.Describe("[sig-storage] EmptyDir volumes", func() { This test is marked LinuxOnly since Windows does not support setting specific file permissions, or running as UID / GID. */ framework.ConformanceIt("should support (non-root,0777,default) [LinuxOnly] [NodeConformance]", func() { - doTest0777(f, nonRootUid, v1.StorageMediumDefault) + doTest0777(f, nonRootUID, v1.StorageMediumDefault) }) /* @@ -282,7 +282,8 @@ var _ = ginkgo.Describe("[sig-storage] EmptyDir volumes", func() { } ginkgo.By("Creating Pod") - pod = f.PodClient().CreateSync(pod) + f.PodClient().Create(pod) + e2epod.WaitForPodNameRunningInNamespace(f.ClientSet, pod.Name, f.Namespace.Name) ginkgo.By("Reading file content from the nginx-container") result := f.ExecShellInContainer(pod.Name, busyBoxMainContainerName, fmt.Sprintf("cat %s", busyBoxMainVolumeFilePath)) diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/storage/framework.go b/vendor/k8s.io/kubernetes/test/e2e/common/storage/framework.go new file mode 100644 index 000000000000..1a9ee82ec91b --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/common/storage/framework.go @@ -0,0 +1,24 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package storage + +import "github.com/onsi/ginkgo" + +// SIGDescribe annotates the test with the SIG label. +func SIGDescribe(text string, body func()) bool { + return ginkgo.Describe("[sig-storage] "+text, body) +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/host_path.go b/vendor/k8s.io/kubernetes/test/e2e/common/storage/host_path.go similarity index 98% rename from vendor/k8s.io/kubernetes/test/e2e/common/host_path.go rename to vendor/k8s.io/kubernetes/test/e2e/common/storage/host_path.go index e90e699ae940..81abbf73bd93 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/common/host_path.go +++ b/vendor/k8s.io/kubernetes/test/e2e/common/storage/host_path.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package common +package storage import ( "fmt" @@ -31,7 +31,7 @@ import ( //TODO : Consolidate this code with the code for emptyDir. //This will require some smart. -var _ = ginkgo.Describe("[sig-storage] HostPath", func() { +var _ = SIGDescribe("HostPath", func() { f := framework.NewDefaultFramework("hostpath") ginkgo.BeforeEach(func() { diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/projected_combined.go b/vendor/k8s.io/kubernetes/test/e2e/common/storage/projected_combined.go similarity index 98% rename from vendor/k8s.io/kubernetes/test/e2e/common/projected_combined.go rename to vendor/k8s.io/kubernetes/test/e2e/common/storage/projected_combined.go index 52bebcc16f2f..6d4969382fe1 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/common/projected_combined.go +++ b/vendor/k8s.io/kubernetes/test/e2e/common/storage/projected_combined.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package common +package storage import ( "context" @@ -29,7 +29,7 @@ import ( "github.com/onsi/ginkgo" ) -var _ = ginkgo.Describe("[sig-storage] Projected combined", func() { +var _ = SIGDescribe("Projected combined", func() { f := framework.NewDefaultFramework("projected") // Test multiple projections diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/projected_configmap.go b/vendor/k8s.io/kubernetes/test/e2e/common/storage/projected_configmap.go similarity index 99% rename from vendor/k8s.io/kubernetes/test/e2e/common/projected_configmap.go rename to vendor/k8s.io/kubernetes/test/e2e/common/storage/projected_configmap.go index e6a2f353bfc0..37f51279da7a 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/common/projected_configmap.go +++ b/vendor/k8s.io/kubernetes/test/e2e/common/storage/projected_configmap.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package common +package storage import ( "context" @@ -33,7 +33,7 @@ import ( "github.com/onsi/gomega" ) -var _ = ginkgo.Describe("[sig-storage] Projected configMap", func() { +var _ = SIGDescribe("Projected configMap", func() { f := framework.NewDefaultFramework("projected") /* diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/projected_downwardapi.go b/vendor/k8s.io/kubernetes/test/e2e/common/storage/projected_downwardapi.go similarity index 99% rename from vendor/k8s.io/kubernetes/test/e2e/common/projected_downwardapi.go rename to vendor/k8s.io/kubernetes/test/e2e/common/storage/projected_downwardapi.go index dc15aa552ce6..3e89d9902770 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/common/projected_downwardapi.go +++ b/vendor/k8s.io/kubernetes/test/e2e/common/storage/projected_downwardapi.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package common +package storage import ( "fmt" @@ -32,7 +32,7 @@ import ( "github.com/onsi/gomega" ) -var _ = ginkgo.Describe("[sig-storage] Projected downwardAPI", func() { +var _ = SIGDescribe("Projected downwardAPI", func() { f := framework.NewDefaultFramework("projected") // How long to wait for a log pod to be displayed diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/projected_secret.go b/vendor/k8s.io/kubernetes/test/e2e/common/storage/projected_secret.go similarity index 99% rename from vendor/k8s.io/kubernetes/test/e2e/common/projected_secret.go rename to vendor/k8s.io/kubernetes/test/e2e/common/storage/projected_secret.go index 25f35b693704..af23f516b7e8 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/common/projected_secret.go +++ b/vendor/k8s.io/kubernetes/test/e2e/common/storage/projected_secret.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package common +package storage import ( "context" @@ -32,7 +32,7 @@ import ( "github.com/onsi/gomega" ) -var _ = ginkgo.Describe("[sig-storage] Projected secret", func() { +var _ = SIGDescribe("Projected secret", func() { f := framework.NewDefaultFramework("projected") /* diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/secrets_volume.go b/vendor/k8s.io/kubernetes/test/e2e/common/storage/secrets_volume.go similarity index 97% rename from vendor/k8s.io/kubernetes/test/e2e/common/secrets_volume.go rename to vendor/k8s.io/kubernetes/test/e2e/common/storage/secrets_volume.go index b6b9e32c16cc..d138f54b18e0 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/common/secrets_volume.go +++ b/vendor/k8s.io/kubernetes/test/e2e/common/storage/secrets_volume.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package common +package storage import ( "context" @@ -33,7 +33,7 @@ import ( "github.com/onsi/gomega" ) -var _ = ginkgo.Describe("[sig-storage] Secrets", func() { +var _ = SIGDescribe("Secrets", func() { f := framework.NewDefaultFramework("secrets") /* @@ -371,9 +371,16 @@ var _ = ginkgo.Describe("[sig-storage] Secrets", func() { gomega.Eventually(pollDeleteLogs, podLogTimeout, framework.Poll).Should(gomega.ContainSubstring("Error reading file /etc/secret-volumes/delete/data-1")) }) - // It should be forbidden to change data for secrets marked as immutable, but - // allowed to modify its metadata independently of its state. - ginkgo.It("should be immutable if `immutable` field is set", func() { + /* + Release: v1.21 + Testname: Secrets Volume, immutability + Description: Create a secret. Update it's data field, the update MUST succeed. + Mark the secret as immutable, the update MUST succeed. Try to update its data, the update MUST fail. + Try to mark the secret back as not immutable, the update MUST fail. + Try to update the secret`s metadata (labels), the update must succeed. + Try to delete the secret, the deletion must succeed. + */ + framework.ConformanceIt("should be immutable if `immutable` field is set", func() { name := "immutable" secret := secretForTest(f.Namespace.Name, name) diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/storage/util.go b/vendor/k8s.io/kubernetes/test/e2e/common/storage/util.go new file mode 100644 index 000000000000..7b6051e396da --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/common/storage/util.go @@ -0,0 +1,74 @@ +/* +Copyright 2016 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package storage + +import ( + "fmt" + "os" + + v1 "k8s.io/api/core/v1" + "k8s.io/kubernetes/test/e2e/framework" +) + +var ( + // non-Administrator Windows user used in tests. This is the Windows equivalent of the Linux non-root UID usage. + nonAdminTestUserName = "ContainerUser" + // non-root UID used in tests. + nonRootTestUserID = int64(1000) +) + +// setPodNonRootUser configures the Pod to run as a non-root user. +// For Windows, it sets the RunAsUserName field to ContainerUser, and for Linux, it sets the RunAsUser field to 1000. +func setPodNonRootUser(pod *v1.Pod) { + if framework.NodeOSDistroIs("windows") { + pod.Spec.SecurityContext.WindowsOptions = &v1.WindowsSecurityContextOptions{RunAsUserName: &nonAdminTestUserName} + } else { + pod.Spec.SecurityContext.RunAsUser = &nonRootTestUserID + } +} + +// getFileModeRegex returns a file mode related regex which should be matched by the mounttest pods' output. +// If the given mask is nil, then the regex will contain the default OS file modes, which are 0644 for Linux and 0775 for Windows. +func getFileModeRegex(filePath string, mask *int32) string { + var ( + linuxMask int32 + windowsMask int32 + ) + if mask == nil { + linuxMask = int32(0644) + windowsMask = int32(0775) + } else { + linuxMask = *mask + windowsMask = *mask + } + + linuxOutput := fmt.Sprintf("mode of file \"%s\": %v", filePath, os.FileMode(linuxMask)) + windowsOutput := fmt.Sprintf("mode of Windows file \"%v\": %s", filePath, os.FileMode(windowsMask)) + + return fmt.Sprintf("(%s|%s)", linuxOutput, windowsOutput) +} + +// createMounts creates a v1.VolumeMount list with a single element. +func createMounts(volumeName, volumeMountPath string, readOnly bool) []v1.VolumeMount { + return []v1.VolumeMount{ + { + Name: volumeName, + MountPath: volumeMountPath, + ReadOnly: readOnly, + }, + } +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/volumes.go b/vendor/k8s.io/kubernetes/test/e2e/common/storage/volumes.go similarity index 95% rename from vendor/k8s.io/kubernetes/test/e2e/common/volumes.go rename to vendor/k8s.io/kubernetes/test/e2e/common/storage/volumes.go index 8cf66a2f6067..8b06118d73f4 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/common/volumes.go +++ b/vendor/k8s.io/kubernetes/test/e2e/common/storage/volumes.go @@ -40,7 +40,7 @@ limitations under the License. // GlusterFS test is duplicated from test/e2e/volumes.go. Any changes made there // should be duplicated here -package common +package storage import ( "context" @@ -56,10 +56,9 @@ import ( "github.com/onsi/ginkgo" ) -// These tests need privileged containers, which are disabled by default. Run -// tests with "--ginkgo.focus=[Feature:Volumes]" -var _ = ginkgo.Describe("[sig-storage] GCP Volumes", func() { - f := framework.NewDefaultFramework("gcp-volume") +// TODO(#99468): Check if these tests are still needed. +var _ = SIGDescribe("Volumes", func() { + f := framework.NewDefaultFramework("volume") // note that namespace deletion is handled by delete-namespace flag // filled in BeforeEach diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/sysctl.go b/vendor/k8s.io/kubernetes/test/e2e/common/sysctl.go deleted file mode 100644 index 457ab3317b1f..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/common/sysctl.go +++ /dev/null @@ -1,208 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package common - -import ( - "context" - "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/uuid" - "k8s.io/kubernetes/test/e2e/framework" - e2epod "k8s.io/kubernetes/test/e2e/framework/pod" - e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" - imageutils "k8s.io/kubernetes/test/utils/image" - - "github.com/onsi/ginkgo" - "github.com/onsi/gomega" -) - -var _ = framework.KubeDescribe("Sysctls [LinuxOnly] [NodeFeature:Sysctls]", func() { - - ginkgo.BeforeEach(func() { - // sysctl is not supported on Windows. - e2eskipper.SkipIfNodeOSDistroIs("windows") - }) - - f := framework.NewDefaultFramework("sysctl") - var podClient *framework.PodClient - - testPod := func() *v1.Pod { - podName := "sysctl-" + string(uuid.NewUUID()) - pod := v1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - Name: podName, - Annotations: map[string]string{}, - }, - Spec: v1.PodSpec{ - Containers: []v1.Container{ - { - Name: "test-container", - Image: imageutils.GetE2EImage(imageutils.BusyBox), - }, - }, - RestartPolicy: v1.RestartPolicyNever, - }, - } - - return &pod - } - - ginkgo.BeforeEach(func() { - podClient = f.PodClient() - }) - - ginkgo.It("should support sysctls", func() { - pod := testPod() - pod.Spec.SecurityContext = &v1.PodSecurityContext{ - Sysctls: []v1.Sysctl{ - { - Name: "kernel.shm_rmid_forced", - Value: "1", - }, - }, - } - pod.Spec.Containers[0].Command = []string{"/bin/sysctl", "kernel.shm_rmid_forced"} - - ginkgo.By("Creating a pod with the kernel.shm_rmid_forced sysctl") - pod = podClient.Create(pod) - - ginkgo.By("Watching for error events or started pod") - // watch for events instead of termination of pod because the kubelet deletes - // failed pods without running containers. This would create a race as the pod - // might have already been deleted here. - ev, err := f.PodClient().WaitForErrorEventOrSuccess(pod) - framework.ExpectNoError(err) - gomega.Expect(ev).To(gomega.BeNil()) - - ginkgo.By("Waiting for pod completion") - err = e2epod.WaitForPodNoLongerRunningInNamespace(f.ClientSet, pod.Name, f.Namespace.Name) - framework.ExpectNoError(err) - pod, err = podClient.Get(context.TODO(), pod.Name, metav1.GetOptions{}) - framework.ExpectNoError(err) - - ginkgo.By("Checking that the pod succeeded") - framework.ExpectEqual(pod.Status.Phase, v1.PodSucceeded) - - ginkgo.By("Getting logs from the pod") - log, err := e2epod.GetPodLogs(f.ClientSet, f.Namespace.Name, pod.Name, pod.Spec.Containers[0].Name) - framework.ExpectNoError(err) - - ginkgo.By("Checking that the sysctl is actually updated") - gomega.Expect(log).To(gomega.ContainSubstring("kernel.shm_rmid_forced = 1")) - }) - - ginkgo.It("should support unsafe sysctls which are actually whitelisted", func() { - pod := testPod() - pod.Spec.SecurityContext = &v1.PodSecurityContext{ - Sysctls: []v1.Sysctl{ - { - Name: "kernel.shm_rmid_forced", - Value: "1", - }, - }, - } - pod.Spec.Containers[0].Command = []string{"/bin/sysctl", "kernel.shm_rmid_forced"} - - ginkgo.By("Creating a pod with the kernel.shm_rmid_forced sysctl") - pod = podClient.Create(pod) - - ginkgo.By("Watching for error events or started pod") - // watch for events instead of termination of pod because the kubelet deletes - // failed pods without running containers. This would create a race as the pod - // might have already been deleted here. - ev, err := f.PodClient().WaitForErrorEventOrSuccess(pod) - framework.ExpectNoError(err) - gomega.Expect(ev).To(gomega.BeNil()) - - ginkgo.By("Waiting for pod completion") - err = e2epod.WaitForPodNoLongerRunningInNamespace(f.ClientSet, pod.Name, f.Namespace.Name) - framework.ExpectNoError(err) - pod, err = podClient.Get(context.TODO(), pod.Name, metav1.GetOptions{}) - framework.ExpectNoError(err) - - ginkgo.By("Checking that the pod succeeded") - framework.ExpectEqual(pod.Status.Phase, v1.PodSucceeded) - - ginkgo.By("Getting logs from the pod") - log, err := e2epod.GetPodLogs(f.ClientSet, f.Namespace.Name, pod.Name, pod.Spec.Containers[0].Name) - framework.ExpectNoError(err) - - ginkgo.By("Checking that the sysctl is actually updated") - gomega.Expect(log).To(gomega.ContainSubstring("kernel.shm_rmid_forced = 1")) - }) - - ginkgo.It("should reject invalid sysctls", func() { - pod := testPod() - pod.Spec.SecurityContext = &v1.PodSecurityContext{ - Sysctls: []v1.Sysctl{ - // Safe parameters - { - Name: "foo-", - Value: "bar", - }, - { - Name: "kernel.shmmax", - Value: "100000000", - }, - { - Name: "safe-and-unsafe", - Value: "100000000", - }, - { - Name: "bar..", - Value: "42", - }, - }, - } - - ginkgo.By("Creating a pod with one valid and two invalid sysctls") - client := f.ClientSet.CoreV1().Pods(f.Namespace.Name) - _, err := client.Create(context.TODO(), pod, metav1.CreateOptions{}) - - gomega.Expect(err).NotTo(gomega.BeNil()) - gomega.Expect(err.Error()).To(gomega.ContainSubstring(`Invalid value: "foo-"`)) - gomega.Expect(err.Error()).To(gomega.ContainSubstring(`Invalid value: "bar.."`)) - gomega.Expect(err.Error()).NotTo(gomega.ContainSubstring(`safe-and-unsafe`)) - gomega.Expect(err.Error()).NotTo(gomega.ContainSubstring("kernel.shmmax")) - }) - - ginkgo.It("should not launch unsafe, but not explicitly enabled sysctls on the node", func() { - pod := testPod() - pod.Spec.SecurityContext = &v1.PodSecurityContext{ - Sysctls: []v1.Sysctl{ - { - Name: "kernel.msgmax", - Value: "10000000000", - }, - }, - } - - ginkgo.By("Creating a pod with a greylisted, but not whitelisted sysctl on the node") - pod = podClient.Create(pod) - - ginkgo.By("Watching for error events or started pod") - // watch for events instead of termination of pod because the kubelet deletes - // failed pods without running containers. This would create a race as the pod - // might have already been deleted here. - ev, err := f.PodClient().WaitForErrorEventOrSuccess(pod) - framework.ExpectNoError(err) - - ginkgo.By("Checking that the pod was rejected") - gomega.Expect(ev).ToNot(gomega.BeNil()) - framework.ExpectEqual(ev.Reason, "SysctlForbidden") - }) -}) diff --git a/vendor/k8s.io/kubernetes/test/e2e/common/util.go b/vendor/k8s.io/kubernetes/test/e2e/common/util.go index 02e4c2a78bc1..7f83ad5e745b 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/common/util.go +++ b/vendor/k8s.io/kubernetes/test/e2e/common/util.go @@ -20,7 +20,6 @@ import ( "bytes" "context" "fmt" - "os" "text/template" "time" @@ -37,6 +36,8 @@ import ( "github.com/onsi/ginkgo" ) +// TODO: Cleanup this file. + // Suite represents test suite. type Suite string @@ -47,13 +48,6 @@ const ( NodeE2E Suite = "node e2e" ) -var ( - // non-Administrator Windows user used in tests. This is the Windows equivalent of the Linux non-root UID usage. - nonAdminTestUserName = "ContainerUser" - // non-root UID used in tests. - nonRootTestUserID = int64(1000) -) - // CurrentSuite represents current test suite. var CurrentSuite Suite @@ -163,6 +157,8 @@ func RestartNodes(c clientset.Interface, nodes []v1.Node) error { zone := framework.TestContext.CloudConfig.Zone if z, ok := node.Labels[v1.LabelFailureDomainBetaZone]; ok { zone = z + } else if z, ok := node.Labels[v1.LabelTopologyZone]; ok { + zone = z } nodeNamesByZone[zone] = append(nodeNamesByZone[zone], node.Name) } @@ -210,45 +206,3 @@ func rcByNamePort(name string, replicas int32, image string, containerArgs []str Ports: []v1.ContainerPort{{ContainerPort: int32(port), Protocol: protocol}}, }, gracePeriod) } - -// setPodNonRootUser configures the Pod to run as a non-root user. -// For Windows, it sets the RunAsUserName field to ContainerUser, and for Linux, it sets the RunAsUser field to 1000. -func setPodNonRootUser(pod *v1.Pod) { - if framework.NodeOSDistroIs("windows") { - pod.Spec.SecurityContext.WindowsOptions = &v1.WindowsSecurityContextOptions{RunAsUserName: &nonAdminTestUserName} - } else { - pod.Spec.SecurityContext.RunAsUser = &nonRootTestUserID - } -} - -// getFileModeRegex returns a file mode related regex which should be matched by the mounttest pods' output. -// If the given mask is nil, then the regex will contain the default OS file modes, which are 0644 for Linux and 0775 for Windows. -func getFileModeRegex(filePath string, mask *int32) string { - var ( - linuxMask int32 - windowsMask int32 - ) - if mask == nil { - linuxMask = int32(0644) - windowsMask = int32(0775) - } else { - linuxMask = *mask - windowsMask = *mask - } - - linuxOutput := fmt.Sprintf("mode of file \"%s\": %v", filePath, os.FileMode(linuxMask)) - windowsOutput := fmt.Sprintf("mode of Windows file \"%v\": %s", filePath, os.FileMode(windowsMask)) - - return fmt.Sprintf("(%s|%s)", linuxOutput, windowsOutput) -} - -// createMounts creates a v1.VolumeMount list with a single element. -func createMounts(volumeName, volumeMountPath string, readOnly bool) []v1.VolumeMount { - return []v1.VolumeMount{ - { - Name: volumeName, - MountPath: volumeMountPath, - ReadOnly: readOnly, - }, - } -} diff --git a/vendor/k8s.io/kubernetes/test/e2e/e2e.go b/vendor/k8s.io/kubernetes/test/e2e/e2e.go index e5e7a834c1f7..9b826b061122 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/e2e.go +++ b/vendor/k8s.io/kubernetes/test/e2e/e2e.go @@ -253,7 +253,6 @@ func setupSuite() { if err != nil { framework.Failf("Error deleting orphaned namespaces: %v", err) } - klog.Infof("Waiting for deletion of the following namespaces: %v", deleted) if err := framework.WaitForNamespacesDeleted(c, deleted, namespaceCleanupTimeout); err != nil { framework.Failf("Failed to delete orphaned namespaces %v: %v", deleted, err) } diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/.import-restrictions b/vendor/k8s.io/kubernetes/test/e2e/framework/.import-restrictions index 1db4ed4230e3..2ae0bc4f9801 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/.import-restrictions +++ b/vendor/k8s.io/kubernetes/test/e2e/framework/.import-restrictions @@ -1,274 +1,276 @@ -rules: - - selectorRegexp: k8s[.]io/kubernetes/pkg/ - allowedPrefixes: - - k8s.io/kubernetes/pkg/api/legacyscheme - - k8s.io/kubernetes/pkg/api/service - - k8s.io/kubernetes/pkg/api/v1/pod - - k8s.io/kubernetes/pkg/api/v1/resource - - k8s.io/kubernetes/pkg/api/v1/service - - k8s.io/kubernetes/pkg/api/pod - - k8s.io/kubernetes/pkg/apis/apps - - k8s.io/kubernetes/pkg/apis/apps/validation - - k8s.io/kubernetes/pkg/apis/autoscaling - - k8s.io/kubernetes/pkg/apis/batch - - k8s.io/kubernetes/pkg/apis/certificates - - k8s.io/kubernetes/pkg/apis/certificates/v1 - - k8s.io/kubernetes/pkg/apis/core - - k8s.io/kubernetes/pkg/apis/core/helper - - k8s.io/kubernetes/pkg/apis/core/install - - k8s.io/kubernetes/pkg/apis/core/pods - - k8s.io/kubernetes/pkg/apis/core/v1 - - k8s.io/kubernetes/pkg/apis/core/v1/helper - - k8s.io/kubernetes/pkg/apis/core/v1/helper/qos - - k8s.io/kubernetes/pkg/apis/core/validation - - k8s.io/kubernetes/pkg/apis/extensions - - k8s.io/kubernetes/pkg/apis/networking - - k8s.io/kubernetes/pkg/apis/policy - - k8s.io/kubernetes/pkg/apis/policy/validation - - k8s.io/kubernetes/pkg/apis/scheduling - - k8s.io/kubernetes/pkg/apis/storage/v1/util - - k8s.io/kubernetes/pkg/capabilities - - k8s.io/kubernetes/pkg/client/conditions - - k8s.io/kubernetes/pkg/cloudprovider/providers - - k8s.io/kubernetes/pkg/controller - - k8s.io/kubernetes/pkg/controller/deployment/util - - k8s.io/kubernetes/pkg/controller/nodelifecycle - - k8s.io/kubernetes/pkg/controller/nodelifecycle/scheduler - - k8s.io/kubernetes/pkg/controller/service - - k8s.io/kubernetes/pkg/controller/util/node - - k8s.io/kubernetes/pkg/controller/volume/persistentvolume/util - - k8s.io/kubernetes/pkg/controller/volume/scheduling - - k8s.io/kubernetes/pkg/credentialprovider - - k8s.io/kubernetes/pkg/credentialprovider/aws - - k8s.io/kubernetes/pkg/credentialprovider/azure - - k8s.io/kubernetes/pkg/credentialprovider/gcp - - k8s.io/kubernetes/pkg/credentialprovider/secrets - - k8s.io/kubernetes/pkg/features - - k8s.io/kubernetes/pkg/fieldpath - - k8s.io/kubernetes/pkg/kubectl - - k8s.io/kubernetes/pkg/kubectl/apps - - k8s.io/kubernetes/pkg/kubectl/describe - - k8s.io/kubernetes/pkg/kubectl/describe/versioned - - k8s.io/kubernetes/pkg/kubectl/scheme - - k8s.io/kubernetes/pkg/kubectl/util - - k8s.io/kubernetes/pkg/kubectl/util/certificate - - k8s.io/kubernetes/pkg/kubectl/util/deployment - - k8s.io/kubernetes/pkg/kubectl/util/event - - k8s.io/kubernetes/pkg/kubectl/util/fieldpath - - k8s.io/kubernetes/pkg/kubectl/util/podutils - - k8s.io/kubernetes/pkg/kubectl/util/qos - - k8s.io/kubernetes/pkg/kubectl/util/rbac - - k8s.io/kubernetes/pkg/kubectl/util/resource - - k8s.io/kubernetes/pkg/kubectl/util/slice - - k8s.io/kubernetes/pkg/kubectl/util/storage - - k8s.io/kubernetes/pkg/kubelet - - k8s.io/kubernetes/pkg/kubelet/apis - - k8s.io/kubernetes/pkg/kubelet/apis/config - - k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1 - - k8s.io/kubernetes/pkg/kubelet/cadvisor - - k8s.io/kubernetes/pkg/kubelet/certificate - - k8s.io/kubernetes/pkg/kubelet/certificate/bootstrap - - k8s.io/kubernetes/pkg/kubelet/checkpoint - - k8s.io/kubernetes/pkg/kubelet/checkpointmanager - - k8s.io/kubernetes/pkg/kubelet/checkpointmanager/checksum - - k8s.io/kubernetes/pkg/kubelet/checkpointmanager/errors - - k8s.io/kubernetes/pkg/kubelet/cloudresource - - k8s.io/kubernetes/pkg/kubelet/cm - - k8s.io/kubernetes/pkg/kubelet/cm/cpumanager - - k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/containermap - - k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/state - - k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/topology - - k8s.io/kubernetes/pkg/kubelet/cm/cpuset - - k8s.io/kubernetes/pkg/kubelet/cm/devicemanager - - k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/checkpoint - - k8s.io/kubernetes/pkg/kubelet/cm/topologymanager - - k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/bitmask - - k8s.io/kubernetes/pkg/kubelet/cm/util - - k8s.io/kubernetes/pkg/kubelet/config - - k8s.io/kubernetes/pkg/kubelet/configmap - - k8s.io/kubernetes/pkg/kubelet/container - - k8s.io/kubernetes/pkg/kubelet/dockershim - - k8s.io/kubernetes/pkg/kubelet/dockershim/cm - - k8s.io/kubernetes/pkg/kubelet/dockershim/libdocker - - k8s.io/kubernetes/pkg/kubelet/dockershim/metrics - - k8s.io/kubernetes/pkg/kubelet/dockershim/network - - k8s.io/kubernetes/pkg/kubelet/dockershim/network/cni - - k8s.io/kubernetes/pkg/kubelet/dockershim/network/hostport - - k8s.io/kubernetes/pkg/kubelet/dockershim/network/kubenet - - k8s.io/kubernetes/pkg/kubelet/dockershim/network/metrics - - k8s.io/kubernetes/pkg/kubelet/dockershim/remote - - k8s.io/kubernetes/pkg/kubelet/envvars - - k8s.io/kubernetes/pkg/kubelet/eviction - - k8s.io/kubernetes/pkg/kubelet/eviction/api - - k8s.io/kubernetes/pkg/kubelet/events - - k8s.io/kubernetes/pkg/kubelet/images - - k8s.io/kubernetes/pkg/kubelet/kubeletconfig - - k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint - - k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/store - - k8s.io/kubernetes/pkg/kubelet/kubeletconfig/configfiles - - k8s.io/kubernetes/pkg/kubelet/kubeletconfig/status - - k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/codec - - k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/files - - k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/log - - k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/panic - - k8s.io/kubernetes/pkg/kubelet/kuberuntime - - k8s.io/kubernetes/pkg/kubelet/kuberuntime/logs - - k8s.io/kubernetes/pkg/kubelet/leaky - - k8s.io/kubernetes/pkg/kubelet/lifecycle - - k8s.io/kubernetes/pkg/kubelet/logs - - k8s.io/kubernetes/pkg/kubelet/metrics - - k8s.io/kubernetes/pkg/kubelet/network/dns - - k8s.io/kubernetes/pkg/kubelet/nodelease - - k8s.io/kubernetes/pkg/kubelet/nodestatus - - k8s.io/kubernetes/pkg/kubelet/oom - - k8s.io/kubernetes/pkg/kubelet/pleg - - k8s.io/kubernetes/pkg/kubelet/pluginmanager - - k8s.io/kubernetes/pkg/kubelet/pluginmanager/cache - - k8s.io/kubernetes/pkg/kubelet/pluginmanager/metrics - - k8s.io/kubernetes/pkg/kubelet/pluginmanager/operationexecutor - - k8s.io/kubernetes/pkg/kubelet/pluginmanager/pluginwatcher - - k8s.io/kubernetes/pkg/kubelet/pluginmanager/pluginwatcher/example_plugin_apis/v1beta1 - - k8s.io/kubernetes/pkg/kubelet/pluginmanager/pluginwatcher/example_plugin_apis/v1beta2 - - k8s.io/kubernetes/pkg/kubelet/pluginmanager/reconciler - - k8s.io/kubernetes/pkg/kubelet/pod - - k8s.io/kubernetes/pkg/kubelet/preemption - - k8s.io/kubernetes/pkg/kubelet/prober - - k8s.io/kubernetes/pkg/kubelet/prober/results - - k8s.io/kubernetes/pkg/kubelet/qos - - k8s.io/kubernetes/pkg/kubelet/remote - - k8s.io/kubernetes/pkg/kubelet/runtimeclass - - k8s.io/kubernetes/pkg/kubelet/server - - k8s.io/kubernetes/pkg/kubelet/server/metrics - - k8s.io/kubernetes/pkg/kubelet/server/portforward - - k8s.io/kubernetes/pkg/kubelet/server/remotecommand - - k8s.io/kubernetes/pkg/kubelet/server/stats - - k8s.io/kubernetes/pkg/kubelet/server/streaming - - k8s.io/kubernetes/pkg/kubelet/stats - - k8s.io/kubernetes/pkg/kubelet/stats/pidlimit - - k8s.io/kubernetes/pkg/kubelet/status - - k8s.io/kubernetes/pkg/kubelet/secret - - k8s.io/kubernetes/pkg/kubelet/sysctl - - k8s.io/kubernetes/pkg/kubelet/types - - k8s.io/kubernetes/pkg/kubelet/token - - k8s.io/kubernetes/pkg/kubelet/util - - k8s.io/kubernetes/pkg/kubelet/util/format - - k8s.io/kubernetes/pkg/kubelet/util/manager - - k8s.io/kubernetes/pkg/kubelet/util/store - - k8s.io/kubernetes/pkg/kubelet/volumemanager - - k8s.io/kubernetes/pkg/kubelet/volumemanager/cache - - k8s.io/kubernetes/pkg/kubelet/volumemanager/metrics - - k8s.io/kubernetes/pkg/kubelet/volumemanager/populator - - k8s.io/kubernetes/pkg/kubelet/volumemanager/reconciler - - k8s.io/kubernetes/pkg/kubemark - - k8s.io/kubernetes/pkg/cluster/ports - - k8s.io/kubernetes/pkg/probe - - k8s.io/kubernetes/pkg/probe/exec - - k8s.io/kubernetes/pkg/probe/http - - k8s.io/kubernetes/pkg/probe/tcp - - k8s.io/kubernetes/pkg/proxy - - k8s.io/kubernetes/pkg/proxy/apis - - k8s.io/kubernetes/pkg/proxy/apis/config - - k8s.io/kubernetes/pkg/proxy/apis/config/scheme - - k8s.io/kubernetes/pkg/proxy/apis/config/v1alpha1 - - k8s.io/kubernetes/pkg/proxy/apis/config/validation - - k8s.io/kubernetes/pkg/proxy/config - - k8s.io/kubernetes/pkg/proxy/healthcheck - - k8s.io/kubernetes/pkg/proxy/iptables - - k8s.io/kubernetes/pkg/proxy/ipvs - - k8s.io/kubernetes/pkg/proxy/metaproxier - - k8s.io/kubernetes/pkg/proxy/metrics - - k8s.io/kubernetes/pkg/proxy/userspace - - k8s.io/kubernetes/pkg/proxy/util - - k8s.io/kubernetes/pkg/registry/core/service/allocator - - k8s.io/kubernetes/pkg/registry/core/service/portallocator - - k8s.io/kubernetes/pkg/scheduler/api - - k8s.io/kubernetes/pkg/scheduler/framework - - k8s.io/kubernetes/pkg/scheduler/framework/plugins/helper - - k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodeaffinity - - k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodename - - k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodeports - - k8s.io/kubernetes/pkg/scheduler/framework/plugins/noderesources - - k8s.io/kubernetes/pkg/scheduler/framework/runtime - - k8s.io/kubernetes/pkg/scheduler/internal/parallelize - - k8s.io/kubernetes/pkg/scheduler/listers - - k8s.io/kubernetes/pkg/scheduler/metrics - - k8s.io/kubernetes/pkg/scheduler/nodeinfo - - k8s.io/kubernetes/pkg/scheduler/util - - k8s.io/kubernetes/pkg/scheduler/volumebinder - - k8s.io/kubernetes/pkg/security/apparmor - - k8s.io/kubernetes/pkg/security/podsecuritypolicy/seccomp - - k8s.io/kubernetes/pkg/security/podsecuritypolicy/sysctl - - k8s.io/kubernetes/pkg/security/podsecuritypolicy/util - - k8s.io/kubernetes/pkg/securitycontext - - k8s.io/kubernetes/pkg/serviceaccount - - k8s.io/kubernetes/pkg/util/async - - k8s.io/kubernetes/pkg/util/bandwidth - - k8s.io/kubernetes/pkg/util/config - - k8s.io/kubernetes/pkg/util/configz - - k8s.io/kubernetes/pkg/util/conntrack - - k8s.io/kubernetes/pkg/util/env - - k8s.io/kubernetes/pkg/util/filesystem - - k8s.io/kubernetes/pkg/util/flag - - k8s.io/kubernetes/pkg/util/flock - - k8s.io/kubernetes/pkg/util/goroutinemap - - k8s.io/kubernetes/pkg/util/goroutinemap/exponentialbackoff - - k8s.io/kubernetes/pkg/util/hash - - k8s.io/kubernetes/pkg/util/ipset - - k8s.io/kubernetes/pkg/util/iptables - - k8s.io/kubernetes/pkg/util/ipvs - - k8s.io/kubernetes/pkg/util/labels - - k8s.io/kubernetes/pkg/util/node - - k8s.io/kubernetes/pkg/util/oom - - k8s.io/kubernetes/pkg/util/parsers - - k8s.io/kubernetes/pkg/util/pod - - k8s.io/kubernetes/pkg/util/procfs - - k8s.io/kubernetes/pkg/util/removeall - - k8s.io/kubernetes/pkg/util/resizefs - - k8s.io/kubernetes/pkg/util/rlimit - - k8s.io/kubernetes/pkg/util/selinux - - k8s.io/kubernetes/pkg/util/slice - - k8s.io/kubernetes/pkg/util/sysctl - - k8s.io/kubernetes/pkg/util/system - - k8s.io/kubernetes/pkg/util/tail - - k8s.io/kubernetes/pkg/util/taints - - k8s.io/kubernetes/pkg/volume - - k8s.io/kubernetes/pkg/volume/util - - k8s.io/kubernetes/pkg/volume/util/fs - - k8s.io/kubernetes/pkg/volume/util/fsquota - - k8s.io/kubernetes/pkg/volume/util/recyclerclient - - k8s.io/kubernetes/pkg/volume/util/subpath - - k8s.io/kubernetes/pkg/volume/util/types - - k8s.io/kubernetes/pkg/volume/util/volumepathhandler - # TODO: I have no idea why import-boss --include-test-files is yelling about these for k8s.io/kubernetes/test/e2e/framework/providers/kubemark - - k8s.io/kubernetes/pkg/apis/authentication - - k8s.io/kubernetes/pkg/apis/authentication/v1 - - k8s.io/kubernetes/pkg/apis/certificates/v1beta1 - - k8s.io/kubernetes/pkg/apis/storage/v1 - - k8s.io/kubernetes/pkg/scheduler/internal/cache - - selectorRegexp: k8s[.]io/kubernetes/test/ - allowedPrefixes: - - k8s.io/kubernetes/test/e2e/framework - - k8s.io/kubernetes/test/e2e/framework/auth - - k8s.io/kubernetes/test/e2e/framework/ginkgowrapper - - k8s.io/kubernetes/test/e2e/framework/kubectl - - k8s.io/kubernetes/test/e2e/framework/log - - k8s.io/kubernetes/test/e2e/framework/metrics - - k8s.io/kubernetes/test/e2e/framework/network - - k8s.io/kubernetes/test/e2e/framework/node - - k8s.io/kubernetes/test/e2e/framework/pod - - k8s.io/kubernetes/test/e2e/framework/rc - - k8s.io/kubernetes/test/e2e/framework/resource - - k8s.io/kubernetes/test/e2e/framework/service - - k8s.io/kubernetes/test/e2e/framework/ssh - - k8s.io/kubernetes/test/e2e/framework/testfiles - - k8s.io/kubernetes/test/e2e/framework/websocket - - k8s.io/kubernetes/test/e2e/manifest - - k8s.io/kubernetes/test/e2e/perftype - - k8s.io/kubernetes/test/e2e/storage/utils - - k8s.io/kubernetes/test/e2e/system - - k8s.io/kubernetes/test/utils - - k8s.io/kubernetes/test/utils/image - # TODO: why is this here? - - selectorRegexp: k8s[.]io/kubernetes/third_party/ - allowedPrefixes: - - k8s.io/kubernetes/third_party/forked/golang/expansion +rules: + - selectorRegexp: k8s[.]io/kubernetes/pkg/ + allowedPrefixes: + - k8s.io/kubernetes/pkg/api/legacyscheme + - k8s.io/kubernetes/pkg/api/service + - k8s.io/kubernetes/pkg/api/v1/pod + - k8s.io/kubernetes/pkg/api/v1/resource + - k8s.io/kubernetes/pkg/api/v1/service + - k8s.io/kubernetes/pkg/api/pod + - k8s.io/kubernetes/pkg/apis/apps + - k8s.io/kubernetes/pkg/apis/apps/validation + - k8s.io/kubernetes/pkg/apis/autoscaling + - k8s.io/kubernetes/pkg/apis/batch + - k8s.io/kubernetes/pkg/apis/certificates + - k8s.io/kubernetes/pkg/apis/certificates/v1 + - k8s.io/kubernetes/pkg/apis/core + - k8s.io/kubernetes/pkg/apis/core/helper + - k8s.io/kubernetes/pkg/apis/core/install + - k8s.io/kubernetes/pkg/apis/core/pods + - k8s.io/kubernetes/pkg/apis/core/v1 + - k8s.io/kubernetes/pkg/apis/core/v1/helper + - k8s.io/kubernetes/pkg/apis/core/v1/helper/qos + - k8s.io/kubernetes/pkg/apis/core/validation + - k8s.io/kubernetes/pkg/apis/extensions + - k8s.io/kubernetes/pkg/apis/networking + - k8s.io/kubernetes/pkg/apis/policy + - k8s.io/kubernetes/pkg/apis/policy/validation + - k8s.io/kubernetes/pkg/apis/scheduling + - k8s.io/kubernetes/pkg/apis/storage/v1/util + - k8s.io/kubernetes/pkg/capabilities + - k8s.io/kubernetes/pkg/client/conditions + - k8s.io/kubernetes/pkg/cloudprovider/providers + - k8s.io/kubernetes/pkg/controller + - k8s.io/kubernetes/pkg/controller/deployment/util + - k8s.io/kubernetes/pkg/controller/nodelifecycle + - k8s.io/kubernetes/pkg/controller/nodelifecycle/scheduler + - k8s.io/kubernetes/pkg/controller/service + - k8s.io/kubernetes/pkg/controller/util/node + - k8s.io/kubernetes/pkg/controller/volume/persistentvolume/util + - k8s.io/kubernetes/pkg/controller/volume/scheduling + - k8s.io/kubernetes/pkg/credentialprovider + - k8s.io/kubernetes/pkg/credentialprovider/aws + - k8s.io/kubernetes/pkg/credentialprovider/azure + - k8s.io/kubernetes/pkg/credentialprovider/gcp + - k8s.io/kubernetes/pkg/credentialprovider/secrets + - k8s.io/kubernetes/pkg/features + - k8s.io/kubernetes/pkg/fieldpath + - k8s.io/kubernetes/pkg/kubectl + - k8s.io/kubernetes/pkg/kubectl/apps + - k8s.io/kubernetes/pkg/kubectl/describe + - k8s.io/kubernetes/pkg/kubectl/describe/versioned + - k8s.io/kubernetes/pkg/kubectl/scheme + - k8s.io/kubernetes/pkg/kubectl/util + - k8s.io/kubernetes/pkg/kubectl/util/certificate + - k8s.io/kubernetes/pkg/kubectl/util/deployment + - k8s.io/kubernetes/pkg/kubectl/util/event + - k8s.io/kubernetes/pkg/kubectl/util/fieldpath + - k8s.io/kubernetes/pkg/kubectl/util/podutils + - k8s.io/kubernetes/pkg/kubectl/util/qos + - k8s.io/kubernetes/pkg/kubectl/util/rbac + - k8s.io/kubernetes/pkg/kubectl/util/resource + - k8s.io/kubernetes/pkg/kubectl/util/slice + - k8s.io/kubernetes/pkg/kubectl/util/storage + - k8s.io/kubernetes/pkg/kubelet + - k8s.io/kubernetes/pkg/kubelet/apis + - k8s.io/kubernetes/pkg/kubelet/apis/config + - k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1 + - k8s.io/kubernetes/pkg/kubelet/cadvisor + - k8s.io/kubernetes/pkg/kubelet/certificate + - k8s.io/kubernetes/pkg/kubelet/certificate/bootstrap + - k8s.io/kubernetes/pkg/kubelet/checkpoint + - k8s.io/kubernetes/pkg/kubelet/checkpointmanager + - k8s.io/kubernetes/pkg/kubelet/checkpointmanager/checksum + - k8s.io/kubernetes/pkg/kubelet/checkpointmanager/errors + - k8s.io/kubernetes/pkg/kubelet/cloudresource + - k8s.io/kubernetes/pkg/kubelet/cm + - k8s.io/kubernetes/pkg/kubelet/cm/cpumanager + - k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/containermap + - k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/state + - k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/topology + - k8s.io/kubernetes/pkg/kubelet/cm/cpuset + - k8s.io/kubernetes/pkg/kubelet/cm/devicemanager + - k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/checkpoint + - k8s.io/kubernetes/pkg/kubelet/cm/topologymanager + - k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/bitmask + - k8s.io/kubernetes/pkg/kubelet/cm/util + - k8s.io/kubernetes/pkg/kubelet/config + - k8s.io/kubernetes/pkg/kubelet/configmap + - k8s.io/kubernetes/pkg/kubelet/container + - k8s.io/kubernetes/pkg/kubelet/dockershim + - k8s.io/kubernetes/pkg/kubelet/dockershim/cm + - k8s.io/kubernetes/pkg/kubelet/dockershim/libdocker + - k8s.io/kubernetes/pkg/kubelet/dockershim/metrics + - k8s.io/kubernetes/pkg/kubelet/dockershim/network + - k8s.io/kubernetes/pkg/kubelet/dockershim/network/cni + - k8s.io/kubernetes/pkg/kubelet/dockershim/network/hostport + - k8s.io/kubernetes/pkg/kubelet/dockershim/network/kubenet + - k8s.io/kubernetes/pkg/kubelet/dockershim/network/metrics + - k8s.io/kubernetes/pkg/kubelet/dockershim/remote + - k8s.io/kubernetes/pkg/kubelet/envvars + - k8s.io/kubernetes/pkg/kubelet/eviction + - k8s.io/kubernetes/pkg/kubelet/eviction/api + - k8s.io/kubernetes/pkg/kubelet/events + - k8s.io/kubernetes/pkg/kubelet/images + - k8s.io/kubernetes/pkg/kubelet/kubeletconfig + - k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint + - k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/store + - k8s.io/kubernetes/pkg/kubelet/kubeletconfig/configfiles + - k8s.io/kubernetes/pkg/kubelet/kubeletconfig/status + - k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/codec + - k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/files + - k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/log + - k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/panic + - k8s.io/kubernetes/pkg/kubelet/kuberuntime + - k8s.io/kubernetes/pkg/kubelet/kuberuntime/logs + - k8s.io/kubernetes/pkg/kubelet/leaky + - k8s.io/kubernetes/pkg/kubelet/lifecycle + - k8s.io/kubernetes/pkg/kubelet/logs + - k8s.io/kubernetes/pkg/kubelet/metrics + - k8s.io/kubernetes/pkg/kubelet/network/dns + - k8s.io/kubernetes/pkg/kubelet/nodelease + - k8s.io/kubernetes/pkg/kubelet/nodestatus + - k8s.io/kubernetes/pkg/kubelet/oom + - k8s.io/kubernetes/pkg/kubelet/pleg + - k8s.io/kubernetes/pkg/kubelet/pluginmanager + - k8s.io/kubernetes/pkg/kubelet/pluginmanager/cache + - k8s.io/kubernetes/pkg/kubelet/pluginmanager/metrics + - k8s.io/kubernetes/pkg/kubelet/pluginmanager/operationexecutor + - k8s.io/kubernetes/pkg/kubelet/pluginmanager/pluginwatcher + - k8s.io/kubernetes/pkg/kubelet/pluginmanager/pluginwatcher/example_plugin_apis/v1beta1 + - k8s.io/kubernetes/pkg/kubelet/pluginmanager/pluginwatcher/example_plugin_apis/v1beta2 + - k8s.io/kubernetes/pkg/kubelet/pluginmanager/reconciler + - k8s.io/kubernetes/pkg/kubelet/pod + - k8s.io/kubernetes/pkg/kubelet/preemption + - k8s.io/kubernetes/pkg/kubelet/prober + - k8s.io/kubernetes/pkg/kubelet/prober/results + - k8s.io/kubernetes/pkg/kubelet/qos + - k8s.io/kubernetes/pkg/kubelet/remote + - k8s.io/kubernetes/pkg/kubelet/runtimeclass + - k8s.io/kubernetes/pkg/kubelet/server + - k8s.io/kubernetes/pkg/kubelet/server/metrics + - k8s.io/kubernetes/pkg/kubelet/server/portforward + - k8s.io/kubernetes/pkg/kubelet/server/remotecommand + - k8s.io/kubernetes/pkg/kubelet/server/stats + - k8s.io/kubernetes/pkg/kubelet/server/streaming + - k8s.io/kubernetes/pkg/kubelet/stats + - k8s.io/kubernetes/pkg/kubelet/stats/pidlimit + - k8s.io/kubernetes/pkg/kubelet/status + - k8s.io/kubernetes/pkg/kubelet/secret + - k8s.io/kubernetes/pkg/kubelet/sysctl + - k8s.io/kubernetes/pkg/kubelet/types + - k8s.io/kubernetes/pkg/kubelet/token + - k8s.io/kubernetes/pkg/kubelet/util + - k8s.io/kubernetes/pkg/kubelet/util/format + - k8s.io/kubernetes/pkg/kubelet/util/manager + - k8s.io/kubernetes/pkg/kubelet/util/store + - k8s.io/kubernetes/pkg/kubelet/volumemanager + - k8s.io/kubernetes/pkg/kubelet/volumemanager/cache + - k8s.io/kubernetes/pkg/kubelet/volumemanager/metrics + - k8s.io/kubernetes/pkg/kubelet/volumemanager/populator + - k8s.io/kubernetes/pkg/kubelet/volumemanager/reconciler + - k8s.io/kubernetes/pkg/kubemark + - k8s.io/kubernetes/pkg/cluster/ports + - k8s.io/kubernetes/pkg/probe + - k8s.io/kubernetes/pkg/probe/exec + - k8s.io/kubernetes/pkg/probe/http + - k8s.io/kubernetes/pkg/probe/tcp + - k8s.io/kubernetes/pkg/proxy + - k8s.io/kubernetes/pkg/proxy/apis + - k8s.io/kubernetes/pkg/proxy/apis/config + - k8s.io/kubernetes/pkg/proxy/apis/config/scheme + - k8s.io/kubernetes/pkg/proxy/apis/config/v1alpha1 + - k8s.io/kubernetes/pkg/proxy/apis/config/validation + - k8s.io/kubernetes/pkg/proxy/config + - k8s.io/kubernetes/pkg/proxy/healthcheck + - k8s.io/kubernetes/pkg/proxy/iptables + - k8s.io/kubernetes/pkg/proxy/ipvs + - k8s.io/kubernetes/pkg/proxy/metaproxier + - k8s.io/kubernetes/pkg/proxy/metrics + - k8s.io/kubernetes/pkg/proxy/userspace + - k8s.io/kubernetes/pkg/proxy/util + - k8s.io/kubernetes/pkg/registry/core/service/allocator + - k8s.io/kubernetes/pkg/registry/core/service/portallocator + - k8s.io/kubernetes/pkg/scheduler/api + - k8s.io/kubernetes/pkg/scheduler/framework + - k8s.io/kubernetes/pkg/scheduler/framework/plugins/helper + - k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodeaffinity + - k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodename + - k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodeports + - k8s.io/kubernetes/pkg/scheduler/framework/plugins/noderesources + - k8s.io/kubernetes/pkg/scheduler/framework/runtime + - k8s.io/kubernetes/pkg/scheduler/internal/heap + - k8s.io/kubernetes/pkg/scheduler/internal/parallelize + - k8s.io/kubernetes/pkg/scheduler/internal/queue + - k8s.io/kubernetes/pkg/scheduler/listers + - k8s.io/kubernetes/pkg/scheduler/metrics + - k8s.io/kubernetes/pkg/scheduler/nodeinfo + - k8s.io/kubernetes/pkg/scheduler/util + - k8s.io/kubernetes/pkg/scheduler/volumebinder + - k8s.io/kubernetes/pkg/security/apparmor + - k8s.io/kubernetes/pkg/security/podsecuritypolicy/seccomp + - k8s.io/kubernetes/pkg/security/podsecuritypolicy/sysctl + - k8s.io/kubernetes/pkg/security/podsecuritypolicy/util + - k8s.io/kubernetes/pkg/securitycontext + - k8s.io/kubernetes/pkg/serviceaccount + - k8s.io/kubernetes/pkg/util/async + - k8s.io/kubernetes/pkg/util/bandwidth + - k8s.io/kubernetes/pkg/util/config + - k8s.io/kubernetes/pkg/util/configz + - k8s.io/kubernetes/pkg/util/conntrack + - k8s.io/kubernetes/pkg/util/env + - k8s.io/kubernetes/pkg/util/filesystem + - k8s.io/kubernetes/pkg/util/flag + - k8s.io/kubernetes/pkg/util/flock + - k8s.io/kubernetes/pkg/util/goroutinemap + - k8s.io/kubernetes/pkg/util/goroutinemap/exponentialbackoff + - k8s.io/kubernetes/pkg/util/hash + - k8s.io/kubernetes/pkg/util/ipset + - k8s.io/kubernetes/pkg/util/iptables + - k8s.io/kubernetes/pkg/util/ipvs + - k8s.io/kubernetes/pkg/util/labels + - k8s.io/kubernetes/pkg/util/node + - k8s.io/kubernetes/pkg/util/oom + - k8s.io/kubernetes/pkg/util/parsers + - k8s.io/kubernetes/pkg/util/pod + - k8s.io/kubernetes/pkg/util/procfs + - k8s.io/kubernetes/pkg/util/removeall + - k8s.io/kubernetes/pkg/util/resizefs + - k8s.io/kubernetes/pkg/util/rlimit + - k8s.io/kubernetes/pkg/util/selinux + - k8s.io/kubernetes/pkg/util/slice + - k8s.io/kubernetes/pkg/util/sysctl + - k8s.io/kubernetes/pkg/util/system + - k8s.io/kubernetes/pkg/util/tail + - k8s.io/kubernetes/pkg/util/taints + - k8s.io/kubernetes/pkg/volume + - k8s.io/kubernetes/pkg/volume/util + - k8s.io/kubernetes/pkg/volume/util/fs + - k8s.io/kubernetes/pkg/volume/util/fsquota + - k8s.io/kubernetes/pkg/volume/util/recyclerclient + - k8s.io/kubernetes/pkg/volume/util/subpath + - k8s.io/kubernetes/pkg/volume/util/types + - k8s.io/kubernetes/pkg/volume/util/volumepathhandler + # TODO: I have no idea why import-boss --include-test-files is yelling about these for k8s.io/kubernetes/test/e2e/framework/providers/kubemark + - k8s.io/kubernetes/pkg/apis/authentication + - k8s.io/kubernetes/pkg/apis/authentication/v1 + - k8s.io/kubernetes/pkg/apis/certificates/v1beta1 + - k8s.io/kubernetes/pkg/apis/storage/v1 + - k8s.io/kubernetes/pkg/scheduler/internal/cache + - selectorRegexp: k8s[.]io/kubernetes/test/ + allowedPrefixes: + - k8s.io/kubernetes/test/e2e/framework + - k8s.io/kubernetes/test/e2e/framework/auth + - k8s.io/kubernetes/test/e2e/framework/ginkgowrapper + - k8s.io/kubernetes/test/e2e/framework/kubectl + - k8s.io/kubernetes/test/e2e/framework/log + - k8s.io/kubernetes/test/e2e/framework/metrics + - k8s.io/kubernetes/test/e2e/framework/network + - k8s.io/kubernetes/test/e2e/framework/node + - k8s.io/kubernetes/test/e2e/framework/pod + - k8s.io/kubernetes/test/e2e/framework/rc + - k8s.io/kubernetes/test/e2e/framework/resource + - k8s.io/kubernetes/test/e2e/framework/service + - k8s.io/kubernetes/test/e2e/framework/ssh + - k8s.io/kubernetes/test/e2e/framework/testfiles + - k8s.io/kubernetes/test/e2e/framework/websocket + - k8s.io/kubernetes/test/e2e/manifest + - k8s.io/kubernetes/test/e2e/perftype + - k8s.io/kubernetes/test/e2e/storage/utils + - k8s.io/kubernetes/test/e2e/system + - k8s.io/kubernetes/test/utils + - k8s.io/kubernetes/test/utils/image + # TODO: why is this here? + - selectorRegexp: k8s[.]io/kubernetes/third_party/ + allowedPrefixes: + - k8s.io/kubernetes/third_party/forked/golang/expansion diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/BUILD b/vendor/k8s.io/kubernetes/test/e2e/framework/BUILD deleted file mode 100644 index eba25b2c3aa9..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/BUILD +++ /dev/null @@ -1,146 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "cleanup.go", - "exec_util.go", - "expect.go", - "flake_reporting_util.go", - "framework.go", - "log.go", - "log_size_monitoring.go", - "nodes_util.go", - "pods.go", - "ports.go", - "provider.go", - "psp.go", - "resource_usage_gatherer.go", - "size.go", - "test_context.go", - "util.go", - ], - importpath = "k8s.io/kubernetes/test/e2e/framework", - visibility = ["//visibility:public"], - deps = [ - "//pkg/kubelet/apis/config:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/api/rbac/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/serviceaccount:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/discovery:go_default_library", - "//staging/src/k8s.io/client-go/discovery/cached/memory:go_default_library", - "//staging/src/k8s.io/client-go/dynamic:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/restmapper:go_default_library", - "//staging/src/k8s.io/client-go/scale:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/tools/clientcmd:go_default_library", - "//staging/src/k8s.io/client-go/tools/clientcmd/api:go_default_library", - "//staging/src/k8s.io/client-go/tools/remotecommand:go_default_library", - "//staging/src/k8s.io/client-go/tools/watch:go_default_library", - "//staging/src/k8s.io/component-base/cli/flag:go_default_library", - "//staging/src/k8s.io/component-base/featuregate:go_default_library", - "//staging/src/k8s.io/kubectl/pkg/util/podutils:go_default_library", - "//staging/src/k8s.io/kubelet/pkg/apis/stats/v1alpha1:go_default_library", - "//test/e2e/framework/auth:go_default_library", - "//test/e2e/framework/ginkgowrapper:go_default_library", - "//test/e2e/framework/kubectl:go_default_library", - "//test/e2e/framework/metrics:go_default_library", - "//test/e2e/framework/node:go_default_library", - "//test/e2e/framework/pod:go_default_library", - "//test/e2e/framework/ssh:go_default_library", - "//test/utils:go_default_library", - "//test/utils/image:go_default_library", - "//vendor/github.com/onsi/ginkgo:go_default_library", - "//vendor/github.com/onsi/ginkgo/config:go_default_library", - "//vendor/github.com/onsi/gomega:go_default_library", - "//vendor/github.com/onsi/gomega/types:go_default_library", - "//vendor/github.com/pkg/errors:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["log_test.go"], - embed = [":go_default_library"], - deps = [ - "//vendor/github.com/onsi/ginkgo:go_default_library", - "//vendor/github.com/onsi/ginkgo/config:go_default_library", - "//vendor/github.com/onsi/ginkgo/reporters:go_default_library", - "//vendor/github.com/onsi/gomega:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//test/e2e/framework/auth:all-srcs", - "//test/e2e/framework/autoscaling:all-srcs", - "//test/e2e/framework/config:all-srcs", - "//test/e2e/framework/deployment:all-srcs", - "//test/e2e/framework/endpoints:all-srcs", - "//test/e2e/framework/endpointslice:all-srcs", - "//test/e2e/framework/events:all-srcs", - "//test/e2e/framework/ginkgowrapper:all-srcs", - "//test/e2e/framework/gpu:all-srcs", - "//test/e2e/framework/ingress:all-srcs", - "//test/e2e/framework/job:all-srcs", - "//test/e2e/framework/kubectl:all-srcs", - "//test/e2e/framework/kubelet:all-srcs", - "//test/e2e/framework/kubesystem:all-srcs", - "//test/e2e/framework/log:all-srcs", - "//test/e2e/framework/manifest:all-srcs", - "//test/e2e/framework/metrics:all-srcs", - "//test/e2e/framework/network:all-srcs", - "//test/e2e/framework/node:all-srcs", - "//test/e2e/framework/perf:all-srcs", - "//test/e2e/framework/pod:all-srcs", - "//test/e2e/framework/providers/aws:all-srcs", - "//test/e2e/framework/providers/azure:all-srcs", - "//test/e2e/framework/providers/gce:all-srcs", - "//test/e2e/framework/providers/kubemark:all-srcs", - "//test/e2e/framework/providers/openstack:all-srcs", - "//test/e2e/framework/providers/vsphere:all-srcs", - "//test/e2e/framework/pv:all-srcs", - "//test/e2e/framework/rc:all-srcs", - "//test/e2e/framework/replicaset:all-srcs", - "//test/e2e/framework/resource:all-srcs", - "//test/e2e/framework/security:all-srcs", - "//test/e2e/framework/service:all-srcs", - "//test/e2e/framework/skipper:all-srcs", - "//test/e2e/framework/ssh:all-srcs", - "//test/e2e/framework/statefulset:all-srcs", - "//test/e2e/framework/testfiles:all-srcs", - "//test/e2e/framework/timer:all-srcs", - "//test/e2e/framework/volume:all-srcs", - "//test/e2e/framework/websocket:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/auth/BUILD b/vendor/k8s.io/kubernetes/test/e2e/framework/auth/BUILD deleted file mode 100644 index d233776d2376..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/auth/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["helpers.go"], - importpath = "k8s.io/kubernetes/test/e2e/framework/auth", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/authorization/v1:go_default_library", - "//staging/src/k8s.io/api/rbac/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/authorization/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1:go_default_library", - "//test/e2e/framework/log:go_default_library", - "//vendor/github.com/pkg/errors:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/autoscaling/BUILD b/vendor/k8s.io/kubernetes/test/e2e/framework/autoscaling/BUILD deleted file mode 100644 index 2a8413776010..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/autoscaling/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["autoscaling_utils.go"], - importpath = "k8s.io/kubernetes/test/e2e/framework/autoscaling", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/scale:go_default_library", - "//test/e2e/framework:go_default_library", - "//test/e2e/framework/kubectl:go_default_library", - "//test/e2e/framework/rc:go_default_library", - "//test/e2e/framework/resource:go_default_library", - "//test/e2e/framework/service:go_default_library", - "//test/utils:go_default_library", - "//test/utils/image:go_default_library", - "//vendor/github.com/onsi/ginkgo:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/config/BUILD b/vendor/k8s.io/kubernetes/test/e2e/framework/config/BUILD deleted file mode 100644 index f1feb5b7fe19..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/config/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["config.go"], - importpath = "k8s.io/kubernetes/test/e2e/framework/config", - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["config_test.go"], - embed = [":go_default_library"], - deps = [ - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/deployment/BUILD b/vendor/k8s.io/kubernetes/test/e2e/framework/deployment/BUILD deleted file mode 100644 index c0b346e03bc5..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/deployment/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "fixtures.go", - "wait.go", - ], - importpath = "k8s.io/kubernetes/test/e2e/framework/deployment", - deps = [ - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//test/e2e/framework:go_default_library", - "//test/utils:go_default_library", - "//test/utils/image:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/deployment/fixtures.go b/vendor/k8s.io/kubernetes/test/e2e/framework/deployment/fixtures.go index 54e998659040..41acc99b125c 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/deployment/fixtures.go +++ b/vendor/k8s.io/kubernetes/test/e2e/framework/deployment/fixtures.go @@ -28,8 +28,8 @@ import ( "k8s.io/apimachinery/pkg/util/uuid" clientset "k8s.io/client-go/kubernetes" "k8s.io/kubernetes/test/e2e/framework" + e2epod "k8s.io/kubernetes/test/e2e/framework/pod" testutils "k8s.io/kubernetes/test/utils" - imageutils "k8s.io/kubernetes/test/utils/image" ) // UpdateDeploymentWithRetries updates the specified deployment with retries. @@ -199,13 +199,10 @@ func testDeployment(replicas int32, podLabels map[string]string, nodeSelector ma TerminationGracePeriodSeconds: &zero, Containers: []v1.Container{ { - Name: "write-pod", - Image: imageutils.GetE2EImage(imageutils.BusyBox), - Command: []string{"/bin/sh"}, - Args: []string{"-c", command}, - SecurityContext: &v1.SecurityContext{ - Privileged: &isPrivileged, - }, + Name: "write-pod", + Image: e2epod.GetDefaultTestImage(), + Command: e2epod.GenerateScriptCmd(command), + SecurityContext: e2epod.GenerateContainerSecurityContext(isPrivileged), }, }, RestartPolicy: v1.RestartPolicyAlways, diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/endpoints/BUILD b/vendor/k8s.io/kubernetes/test/e2e/framework/endpoints/BUILD deleted file mode 100644 index 2758d0402809..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/endpoints/BUILD +++ /dev/null @@ -1,26 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["ports.go"], - importpath = "k8s.io/kubernetes/test/e2e/framework/endpoints", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/endpointslice/BUILD b/vendor/k8s.io/kubernetes/test/e2e/framework/endpointslice/BUILD deleted file mode 100644 index 95592783c770..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/endpointslice/BUILD +++ /dev/null @@ -1,26 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["ports.go"], - importpath = "k8s.io/kubernetes/test/e2e/framework/endpointslice", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/discovery/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/endpointslice/ports.go b/vendor/k8s.io/kubernetes/test/e2e/framework/endpointslice/ports.go index f8aa01d154f7..c61230c7d2a2 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/endpointslice/ports.go +++ b/vendor/k8s.io/kubernetes/test/e2e/framework/endpointslice/ports.go @@ -17,7 +17,7 @@ limitations under the License. package endpointslice import ( - discoveryv1beta1 "k8s.io/api/discovery/v1beta1" + discoveryv1 "k8s.io/api/discovery/v1" "k8s.io/apimachinery/pkg/types" ) @@ -25,7 +25,7 @@ import ( type PortsByPodUID map[types.UID][]int // GetContainerPortsByPodUID returns a PortsByPodUID map on the given endpoints. -func GetContainerPortsByPodUID(eps []discoveryv1beta1.EndpointSlice) PortsByPodUID { +func GetContainerPortsByPodUID(eps []discoveryv1.EndpointSlice) PortsByPodUID { m := PortsByPodUID{} for _, es := range eps { diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/events/BUILD b/vendor/k8s.io/kubernetes/test/e2e/framework/events/BUILD deleted file mode 100644 index ebac16a84d2a..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/events/BUILD +++ /dev/null @@ -1,27 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["events.go"], - importpath = "k8s.io/kubernetes/test/e2e/framework/events", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/framework.go b/vendor/k8s.io/kubernetes/test/e2e/framework/framework.go index 890357910339..0194152e6002 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/framework.go +++ b/vendor/k8s.io/kubernetes/test/e2e/framework/framework.go @@ -119,6 +119,9 @@ type Framework struct { // Place to keep ClusterAutoscaler metrics from before test in order to compute delta. clusterAutoscalerMetricsBeforeTest e2emetrics.Collection + + // Timeouts contains the custom timeouts used during the test execution. + Timeouts *TimeoutContext } // AfterEachActionFunc is a function that can be called after each test @@ -138,6 +141,13 @@ type Options struct { GroupVersion *schema.GroupVersion } +// NewFrameworkWithCustomTimeouts makes a framework with with custom timeouts. +func NewFrameworkWithCustomTimeouts(baseName string, timeouts *TimeoutContext) *Framework { + f := NewDefaultFramework(baseName) + f.Timeouts = timeouts + return f +} + // NewDefaultFramework makes a new framework and sets up a BeforeEach/AfterEach for // you (you can write additional before/after each functions). func NewDefaultFramework(baseName string) *Framework { @@ -155,6 +165,7 @@ func NewFramework(baseName string, options Options, client clientset.Interface) AddonResourceConstraints: make(map[string]ResourceConstraint), Options: options, ClientSet: client, + Timeouts: NewTimeoutContextWithDefaults(), } f.AddAfterEach("dumpNamespaceInfo", func(f *Framework, failed bool) { @@ -202,10 +213,6 @@ func (f *Framework) BeforeEach() { ExpectNoError(err) f.DynamicClient, err = dynamic.NewForConfig(config) ExpectNoError(err) - // node.k8s.io is based on CRD, which is served only as JSON - jsonConfig := config - jsonConfig.ContentType = "application/json" - ExpectNoError(err) // create scales getter, set GroupVersion and NegotiatedSerializer to default values // as they are required when creating a REST client. @@ -618,12 +625,6 @@ func (kc *KubeConfig) FindCluster(name string) *KubeCluster { return nil } -// KubeDescribe is wrapper function for ginkgo describe. Adds namespacing. -// TODO: Support type safe tagging as well https://github.com/kubernetes/kubernetes/pull/22401. -func KubeDescribe(text string, body func()) bool { - return ginkgo.Describe("[k8s.io] "+text, body) -} - // ConformanceIt is wrapper function for ginkgo It. Adds "[Conformance]" tag and makes static analysis easier. func ConformanceIt(text string, body interface{}, timeout ...float64) bool { return ginkgo.It(text+" [Conformance]", body, timeout...) diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/ginkgowrapper/BUILD b/vendor/k8s.io/kubernetes/test/e2e/framework/ginkgowrapper/BUILD deleted file mode 100644 index b5eea398006d..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/ginkgowrapper/BUILD +++ /dev/null @@ -1,26 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["wrapper.go"], - importpath = "k8s.io/kubernetes/test/e2e/framework/ginkgowrapper", - deps = ["//vendor/github.com/onsi/ginkgo:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/gpu/BUILD b/vendor/k8s.io/kubernetes/test/e2e/framework/gpu/BUILD deleted file mode 100644 index 0afa0cd498f5..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/gpu/BUILD +++ /dev/null @@ -1,22 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["gpu_util.go"], - importpath = "k8s.io/kubernetes/test/e2e/framework/gpu", - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/ingress/BUILD b/vendor/k8s.io/kubernetes/test/e2e/framework/ingress/BUILD deleted file mode 100644 index a74672409c95..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/ingress/BUILD +++ /dev/null @@ -1,55 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["ingress_utils.go"], - importpath = "k8s.io/kubernetes/test/e2e/framework/ingress", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/networking/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/yaml:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//test/e2e/framework:go_default_library", - "//test/e2e/framework/service:go_default_library", - "//test/e2e/framework/testfiles:go_default_library", - "//test/utils:go_default_library", - "//test/utils/image:go_default_library", - "//vendor/github.com/onsi/ginkgo:go_default_library", - "//vendor/google.golang.org/api/compute/v1:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["ingress_utils_test.go"], - embed = [":go_default_library"], - deps = ["//staging/src/k8s.io/api/networking/v1beta1:go_default_library"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/job/BUILD b/vendor/k8s.io/kubernetes/test/e2e/framework/job/BUILD deleted file mode 100644 index f4468ebbae12..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/job/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "const.go", - "fixtures.go", - "rest.go", - "wait.go", - ], - importpath = "k8s.io/kubernetes/test/e2e/framework/job", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/batch/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/rand:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//test/e2e/framework:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/job/rest.go b/vendor/k8s.io/kubernetes/test/e2e/framework/job/rest.go index e642fd50da0f..913c61e9f4bb 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/job/rest.go +++ b/vendor/k8s.io/kubernetes/test/e2e/framework/job/rest.go @@ -42,3 +42,9 @@ func GetJobPods(c clientset.Interface, ns, jobName string) (*v1.PodList, error) func CreateJob(c clientset.Interface, ns string, job *batchv1.Job) (*batchv1.Job, error) { return c.BatchV1().Jobs(ns).Create(context.TODO(), job, metav1.CreateOptions{}) } + +// CreateJob uses c to update a job in namespace ns. If the returned error is +// nil, the returned Job is valid and has been updated. +func UpdateJob(c clientset.Interface, ns string, job *batchv1.Job) (*batchv1.Job, error) { + return c.BatchV1().Jobs(ns).Update(context.TODO(), job, metav1.UpdateOptions{}) +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/kubectl/BUILD b/vendor/k8s.io/kubernetes/test/e2e/framework/kubectl/BUILD deleted file mode 100644 index fa510a84b536..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/kubectl/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["kubectl_utils.go"], - importpath = "k8s.io/kubernetes/test/e2e/framework/kubectl", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/tools/clientcmd:go_default_library", - "//test/e2e/framework/log:go_default_library", - "//test/e2e/framework/pod:go_default_library", - "//test/utils:go_default_library", - "//vendor/github.com/onsi/ginkgo:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/kubelet/BUILD b/vendor/k8s.io/kubernetes/test/e2e/framework/kubelet/BUILD deleted file mode 100644 index 8e50b7def6cf..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/kubelet/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "config.go", - "kubelet_pods.go", - "stats.go", - ], - importpath = "k8s.io/kubernetes/test/e2e/framework/kubelet", - visibility = ["//visibility:public"], - deps = [ - "//pkg/kubelet/apis/config:go_default_library", - "//pkg/kubelet/apis/config/scheme:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/kubelet/config/v1beta1:go_default_library", - "//staging/src/k8s.io/kubelet/pkg/apis/stats/v1alpha1:go_default_library", - "//test/e2e/framework:go_default_library", - "//test/e2e/framework/kubectl:go_default_library", - "//test/e2e/framework/metrics:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/kubesystem/BUILD b/vendor/k8s.io/kubernetes/test/e2e/framework/kubesystem/BUILD deleted file mode 100644 index 2e7c1659b9f6..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/kubesystem/BUILD +++ /dev/null @@ -1,26 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["kubesystem.go"], - importpath = "k8s.io/kubernetes/test/e2e/framework/kubesystem", - visibility = ["//visibility:public"], - deps = [ - "//test/e2e/framework:go_default_library", - "//test/e2e/framework/ssh:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/log/BUILD b/vendor/k8s.io/kubernetes/test/e2e/framework/log/BUILD deleted file mode 100644 index 74015368eca3..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/log/BUILD +++ /dev/null @@ -1,26 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["logger.go"], - importpath = "k8s.io/kubernetes/test/e2e/framework/log", - visibility = ["//visibility:public"], - deps = [ - "//test/e2e/framework/ginkgowrapper:go_default_library", - "//vendor/github.com/onsi/ginkgo:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/manifest/BUILD b/vendor/k8s.io/kubernetes/test/e2e/framework/manifest/BUILD deleted file mode 100644 index d8a3c9cacb20..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/manifest/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["manifest.go"], - importpath = "k8s.io/kubernetes/test/e2e/framework/manifest", - deps = [ - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/yaml:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//test/e2e/framework:go_default_library", - "//test/e2e/framework/testfiles:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/metrics/BUILD b/vendor/k8s.io/kubernetes/test/e2e/framework/metrics/BUILD deleted file mode 100644 index d9d53d28af5e..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/metrics/BUILD +++ /dev/null @@ -1,49 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "api.go", - "api_server_metrics.go", - "cluster_autoscaler_metrics.go", - "controller_manager_metrics.go", - "e2e_metrics.go", - "interesting_metrics.go", - "kubelet_metrics.go", - "latencies.go", - "metrics_grabber.go", - "pod.go", - "scheduler_metrics.go", - ], - importpath = "k8s.io/kubernetes/test/e2e/framework/metrics", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/component-base/metrics/testutil:go_default_library", - "//test/e2e/framework/log:go_default_library", - "//test/e2e/framework/pod:go_default_library", - "//test/e2e/perftype:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/network/BUILD b/vendor/k8s.io/kubernetes/test/e2e/framework/network/BUILD deleted file mode 100644 index a391b9ccaf14..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/network/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["utils.go"], - importpath = "k8s.io/kubernetes/test/e2e/framework/network", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//test/e2e/framework:go_default_library", - "//test/e2e/framework/node:go_default_library", - "//test/e2e/framework/pod:go_default_library", - "//test/e2e/framework/skipper:go_default_library", - "//test/e2e/framework/ssh:go_default_library", - "//test/utils/image:go_default_library", - "//vendor/github.com/onsi/ginkgo:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/network/utils.go b/vendor/k8s.io/kubernetes/test/e2e/framework/network/utils.go index 36391ff8d63c..39f8acb146b5 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/network/utils.go +++ b/vendor/k8s.io/kubernetes/test/e2e/framework/network/utils.go @@ -540,6 +540,18 @@ func (config *NetworkingTestConfig) executeCurlCmd(cmd string, expected string) } func (config *NetworkingTestConfig) createNetShellPodSpec(podName, hostname string) *v1.Pod { + netexecArgs := []string{ + "netexec", + fmt.Sprintf("--http-port=%d", EndpointHTTPPort), + fmt.Sprintf("--udp-port=%d", EndpointUDPPort), + } + // In case of hostnetwork endpoints, we want to bind the udp listener to specific ip addresses. + // In order to cover legacy AND dualstack, we pass both the host ip and the two pod ips. Agnhost + // removes duplicates and so this will listen on both addresses (or on the single existing one). + if config.EndpointsHostNetwork { + netexecArgs = append(netexecArgs, "--udp-listen-addresses=$(HOST_IP),$(POD_IPS)") + } + probe := &v1.Probe{ InitialDelaySeconds: 10, TimeoutSeconds: 30, @@ -568,11 +580,7 @@ func (config *NetworkingTestConfig) createNetShellPodSpec(podName, hostname stri Name: "webserver", Image: NetexecImageName, ImagePullPolicy: v1.PullIfNotPresent, - Args: []string{ - "netexec", - fmt.Sprintf("--http-port=%d", EndpointHTTPPort), - fmt.Sprintf("--udp-port=%d", EndpointUDPPort), - }, + Args: netexecArgs, Ports: []v1.ContainerPort{ { Name: "http", @@ -602,6 +610,27 @@ func (config *NetworkingTestConfig) createNetShellPodSpec(podName, hostname stri Protocol: v1.ProtocolSCTP, }) } + + if config.EndpointsHostNetwork { + pod.Spec.Containers[0].Env = []v1.EnvVar{ + { + Name: "HOST_IP", + ValueFrom: &v1.EnvVarSource{ + FieldRef: &v1.ObjectFieldSelector{ + FieldPath: "status.hostIP", + }, + }, + }, + { + Name: "POD_IPS", + ValueFrom: &v1.EnvVarSource{ + FieldRef: &v1.ObjectFieldSelector{ + FieldPath: "status.podIPs", + }, + }, + }, + } + } return pod } @@ -715,13 +744,6 @@ func (config *NetworkingTestConfig) CreateService(serviceSpec *v1.Service) *v1.S framework.ExpectNoError(err, fmt.Sprintf("Failed to create %s service: %v", serviceSpec.Name, err)) err = WaitForService(config.f.ClientSet, config.Namespace, serviceSpec.Name, true, 5*time.Second, 45*time.Second) - // If the endpoints of the service use HostNetwork: true, they are going to try to bind on the host namespace - // if those ports are in use by any process in the host, the endpoints pods will fail to be deployed - // and the service will never be ready. We can be smarter and check directly that the ports are free - // but by now we Skip the test if the service is not ready and we are using endpoints with host network - if config.EndpointsHostNetwork && err != nil { - e2eskipper.Skipf("Service not ready. Pods are using hostNetwork: true, please check there is no other process on the host using the same ports: %v", err) - } framework.ExpectNoError(err, fmt.Sprintf("error while waiting for service:%s err: %v", serviceSpec.Name, err)) createdService, err := config.getServiceClient().Get(context.TODO(), serviceSpec.Name, metav1.GetOptions{}) diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/node/BUILD b/vendor/k8s.io/kubernetes/test/e2e/framework/node/BUILD deleted file mode 100644 index 0641680f0912..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/node/BUILD +++ /dev/null @@ -1,60 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "resource.go", - "runtimeclass.go", - "wait.go", - ], - importpath = "k8s.io/kubernetes/test/e2e/framework/node", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/rand:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/util/retry:go_default_library", - "//test/e2e/framework/log:go_default_library", - "//test/utils/image:go_default_library", - "//vendor/github.com/onsi/ginkgo:go_default_library", - "//vendor/github.com/onsi/gomega:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["wait_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/node/resource.go b/vendor/k8s.io/kubernetes/test/e2e/framework/node/resource.go index ce33c29cb5d4..db6ec61adce9 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/node/resource.go +++ b/vendor/k8s.io/kubernetes/test/e2e/framework/node/resource.go @@ -584,6 +584,14 @@ func CreatePodsPerNodeForSimpleApp(c clientset.Interface, namespace, appName str return podLabels } +// RemoveTaintsOffNode removes a list of taints from the given node +// It is simply a helper wrapper for RemoveTaintOffNode +func RemoveTaintsOffNode(c clientset.Interface, nodeName string, taints []v1.Taint) { + for _, taint := range taints { + RemoveTaintOffNode(c, nodeName, taint) + } +} + // RemoveTaintOffNode removes the given taint from the given node. func RemoveTaintOffNode(c clientset.Interface, nodeName string, taint v1.Taint) { err := removeNodeTaint(c, nodeName, nil, &taint) diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/perf/BUILD b/vendor/k8s.io/kubernetes/test/e2e/framework/perf/BUILD deleted file mode 100644 index 8e1e28e3b8f4..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/perf/BUILD +++ /dev/null @@ -1,26 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["perf.go"], - importpath = "k8s.io/kubernetes/test/e2e/framework/perf", - visibility = ["//visibility:public"], - deps = [ - "//test/e2e/framework/kubelet:go_default_library", - "//test/e2e/perftype:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/pod/BUILD b/vendor/k8s.io/kubernetes/test/e2e/framework/pod/BUILD deleted file mode 100644 index 8d34c75f7be1..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/pod/BUILD +++ /dev/null @@ -1,57 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "create.go", - "delete.go", - "node_selection.go", - "resource.go", - "wait.go", - ], - importpath = "k8s.io/kubernetes/test/e2e/framework/pod", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/kubectl/pkg/util/podutils:go_default_library", - "//test/e2e/framework/log:go_default_library", - "//test/utils:go_default_library", - "//test/utils/image:go_default_library", - "//vendor/github.com/onsi/ginkgo:go_default_library", - "//vendor/github.com/onsi/gomega:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["resource_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/pod/create.go b/vendor/k8s.io/kubernetes/test/e2e/framework/pod/create.go index 623d307cf5de..70a674de1603 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/pod/create.go +++ b/vendor/k8s.io/kubernetes/test/e2e/framework/pod/create.go @@ -145,13 +145,10 @@ func MakePod(ns string, nodeSelector map[string]string, pvclaims []*v1.Persisten Spec: v1.PodSpec{ Containers: []v1.Container{ { - Name: "write-pod", - Image: BusyBoxImage, - Command: []string{"/bin/sh"}, - Args: []string{"-c", command}, - SecurityContext: &v1.SecurityContext{ - Privileged: &isPrivileged, - }, + Name: "write-pod", + Image: GetDefaultTestImage(), + Command: GenerateScriptCmd(command), + SecurityContext: GenerateContainerSecurityContext(isPrivileged), }, }, RestartPolicy: v1.RestartPolicyOnFailure, @@ -187,10 +184,6 @@ func MakeSecPod(podConfig *Config) (*v1.Pod, error) { return &i }(1000) } - image := imageutils.BusyBox - if podConfig.ImageID != imageutils.None { - image = podConfig.ImageID - } podSpec := &v1.Pod{ TypeMeta: metav1.TypeMeta{ Kind: "Pod", @@ -200,28 +193,34 @@ func MakeSecPod(podConfig *Config) (*v1.Pod, error) { Name: podName, Namespace: podConfig.NS, }, - Spec: v1.PodSpec{ - HostIPC: podConfig.HostIPC, - HostPID: podConfig.HostPID, - SecurityContext: &v1.PodSecurityContext{ - FSGroup: podConfig.FsGroup, - }, - Containers: []v1.Container{ - { - Name: "write-pod", - Image: imageutils.GetE2EImage(image), - Command: []string{"/bin/sh"}, - Args: []string{"-c", podConfig.Command}, - SecurityContext: &v1.SecurityContext{ - Privileged: &podConfig.IsPrivileged, - }, - }, + Spec: *MakePodSpec(podConfig), + } + return podSpec, nil +} + +// MakePodSpec returns a PodSpec definition +func MakePodSpec(podConfig *Config) *v1.PodSpec { + image := imageutils.BusyBox + if podConfig.ImageID != imageutils.None { + image = podConfig.ImageID + } + podSpec := &v1.PodSpec{ + HostIPC: podConfig.HostIPC, + HostPID: podConfig.HostPID, + SecurityContext: GeneratePodSecurityContext(podConfig.FsGroup, podConfig.SeLinuxLabel), + Containers: []v1.Container{ + { + Name: "write-pod", + Image: GetTestImage(image), + Command: GenerateScriptCmd(podConfig.Command), + SecurityContext: GenerateContainerSecurityContext(podConfig.IsPrivileged), }, - RestartPolicy: v1.RestartPolicyOnFailure, }, + RestartPolicy: v1.RestartPolicyOnFailure, } + if podConfig.PodFSGroupChangePolicy != nil { - podSpec.Spec.SecurityContext.FSGroupChangePolicy = podConfig.PodFSGroupChangePolicy + podSpec.SecurityContext.FSGroupChangePolicy = podConfig.PodFSGroupChangePolicy } var volumeMounts = make([]v1.VolumeMount, 0) @@ -247,13 +246,10 @@ func MakeSecPod(podConfig *Config) (*v1.Pod, error) { volumeIndex++ } - podSpec.Spec.Containers[0].VolumeMounts = volumeMounts - podSpec.Spec.Containers[0].VolumeDevices = volumeDevices - podSpec.Spec.Volumes = volumes - if runtime.GOOS != "windows" { - podSpec.Spec.SecurityContext.SELinuxOptions = podConfig.SeLinuxLabel - } + podSpec.Containers[0].VolumeMounts = volumeMounts + podSpec.Containers[0].VolumeDevices = volumeDevices + podSpec.Volumes = volumes - SetNodeSelection(&podSpec.Spec, podConfig.NodeSelection) - return podSpec, nil + SetNodeSelection(podSpec, podConfig.NodeSelection) + return podSpec } diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/pod/resource.go b/vendor/k8s.io/kubernetes/test/e2e/framework/pod/resource.go index 668cf263ad77..23f4c565b9f0 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/pod/resource.go +++ b/vendor/k8s.io/kubernetes/test/e2e/framework/pod/resource.go @@ -321,6 +321,20 @@ func podContainerFailed(c clientset.Interface, namespace, podName string, contai } } +func podContainerStarted(c clientset.Interface, namespace, podName string, containerIndex int) wait.ConditionFunc { + return func() (bool, error) { + pod, err := c.CoreV1().Pods(namespace).Get(context.TODO(), podName, metav1.GetOptions{}) + if err != nil { + return false, err + } + if containerIndex > len(pod.Status.ContainerStatuses)-1 { + return false, nil + } + containerStatus := pod.Status.ContainerStatuses[containerIndex] + return *containerStatus.Started, nil + } +} + // LogPodStates logs basic info of provided pods for debugging. func LogPodStates(pods []v1.Pod) { // Find maximum widths for pod, node, and phase strings for column printing. diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/pod/utils.go b/vendor/k8s.io/kubernetes/test/e2e/framework/pod/utils.go new file mode 100644 index 000000000000..865c93b9053e --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/framework/pod/utils.go @@ -0,0 +1,120 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package pod + +import ( + "flag" + + v1 "k8s.io/api/core/v1" + imageutils "k8s.io/kubernetes/test/utils/image" +) + +// NodeOSDistroIs returns true if the distro is the same as `--node-os-distro` +// the package framework/pod can't import the framework package (see #81245) +// we need to check if the --node-os-distro=windows is set and the framework package +// is the one that's parsing the flags, as a workaround this method is looking for the same flag again +// TODO: replace with `framework.NodeOSDistroIs` when #81245 is complete +func NodeOSDistroIs(distro string) bool { + var nodeOsDistro *flag.Flag = flag.Lookup("node-os-distro") + if nodeOsDistro != nil && nodeOsDistro.Value.String() == distro { + return true + } + return false +} + +// GenerateScriptCmd generates the corresponding command lines to execute a command. +// Depending on the Node OS is Windows or linux, the command will use powershell or /bin/sh +func GenerateScriptCmd(command string) []string { + var commands []string + if !NodeOSDistroIs("windows") { + commands = []string{"/bin/sh", "-c", command} + } else { + commands = []string{"powershell", "/c", command} + } + return commands +} + +// GetDefaultTestImage returns the default test image based on OS. +// If the node OS is windows, currently we return Agnhost image for Windows node +// due to the issue of #https://github.com/kubernetes-sigs/windows-testing/pull/35. +// If the node OS is linux, return busybox image +func GetDefaultTestImage() string { + return imageutils.GetE2EImage(GetDefaultTestImageID()) +} + +// GetDefaultTestImageID returns the default test image id based on OS. +// If the node OS is windows, currently we return Agnhost image for Windows node +// due to the issue of #https://github.com/kubernetes-sigs/windows-testing/pull/35. +// If the node OS is linux, return busybox image +func GetDefaultTestImageID() int { + return GetTestImageID(imageutils.BusyBox) +} + +// GetTestImage returns the image name with the given input +// If the Node OS is windows, currently we return Agnhost image for Windows node +// due to the issue of #https://github.com/kubernetes-sigs/windows-testing/pull/35. +func GetTestImage(id int) string { + if NodeOSDistroIs("windows") { + return imageutils.GetE2EImage(imageutils.Agnhost) + } + return imageutils.GetE2EImage(id) +} + +// GetTestImageID returns the image id with the given input +// If the Node OS is windows, currently we return Agnhost image for Windows node +// due to the issue of #https://github.com/kubernetes-sigs/windows-testing/pull/35. +func GetTestImageID(id int) int { + if NodeOSDistroIs("windows") { + return imageutils.Agnhost + } + return id +} + +// GeneratePodSecurityContext generates the corresponding pod security context with the given inputs +// If the Node OS is windows, currently we will ignore the inputs and return nil. +// TODO: Will modify it after windows has its own security context +func GeneratePodSecurityContext(fsGroup *int64, seLinuxOptions *v1.SELinuxOptions) *v1.PodSecurityContext { + if NodeOSDistroIs("windows") { + return nil + } + return &v1.PodSecurityContext{ + FSGroup: fsGroup, + SELinuxOptions: seLinuxOptions, + } +} + +// GenerateContainerSecurityContext generates the corresponding container security context with the given inputs +// If the Node OS is windows, currently we will ignore the inputs and return nil. +// TODO: Will modify it after windows has its own security context +func GenerateContainerSecurityContext(privileged bool) *v1.SecurityContext { + if NodeOSDistroIs("windows") { + return nil + } + return &v1.SecurityContext{ + Privileged: &privileged, + } +} + +// GetLinuxLabel returns the default SELinuxLabel based on OS. +// If the node OS is windows, it will return nil +func GetLinuxLabel() *v1.SELinuxOptions { + if NodeOSDistroIs("windows") { + return nil + } + return &v1.SELinuxOptions{ + Level: "s0:c0,c1"} +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/pod/wait.go b/vendor/k8s.io/kubernetes/test/e2e/framework/pod/wait.go index 4407efe1597c..756d6fdb9b4e 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/pod/wait.go +++ b/vendor/k8s.io/kubernetes/test/e2e/framework/pod/wait.go @@ -210,14 +210,16 @@ func WaitForPodsRunningReady(c clientset.Interface, ns string, minPods, allowedN // WaitForPodCondition waits a pods to be matched to the given condition. func WaitForPodCondition(c clientset.Interface, ns, podName, desc string, timeout time.Duration, condition podCondition) error { e2elog.Logf("Waiting up to %v for pod %q in namespace %q to be %q", timeout, podName, ns, desc) + var lastPodError error for start := time.Now(); time.Since(start) < timeout; time.Sleep(poll) { pod, err := c.CoreV1().Pods(ns).Get(context.TODO(), podName, metav1.GetOptions{}) + lastPodError = err if err != nil { if apierrors.IsNotFound(err) { e2elog.Logf("Pod %q in namespace %q not found. Error: %v", podName, ns, err) - return err + } else { + e2elog.Logf("Get pod %q in namespace %q failed, ignoring for %v. Error: %v", podName, ns, poll, err) } - e2elog.Logf("Get pod %q in namespace %q failed, ignoring for %v. Error: %v", podName, ns, poll, err) continue } // log now so that current pod info is reported before calling `condition()` @@ -230,6 +232,10 @@ func WaitForPodCondition(c clientset.Interface, ns, podName, desc string, timeou return err } } + if apierrors.IsNotFound(lastPodError) { + // return for compatbility with other functions testing for IsNotFound + return lastPodError + } return fmt.Errorf("Gave up after waiting %v for pod %q to be %q", timeout, podName, desc) } @@ -252,8 +258,8 @@ func WaitForPodTerminatedInNamespace(c clientset.Interface, podName, reason, nam }) } -// waitForPodSuccessInNamespaceTimeout returns nil if the pod reached state success, or an error if it reached failure or ran too long. -func waitForPodSuccessInNamespaceTimeout(c clientset.Interface, podName, namespace string, timeout time.Duration) error { +// WaitForPodSuccessInNamespaceTimeout returns nil if the pod reached state success, or an error if it reached failure or ran too long. +func WaitForPodSuccessInNamespaceTimeout(c clientset.Interface, podName, namespace string, timeout time.Duration) error { return WaitForPodCondition(c, namespace, podName, fmt.Sprintf("%s or %s", v1.PodSucceeded, v1.PodFailed), timeout, func(pod *v1.Pod) (bool, error) { if pod.Spec.RestartPolicy == v1.RestartPolicyAlways { return true, fmt.Errorf("pod %q will never terminate with a succeeded state since its restart policy is Always", podName) @@ -357,7 +363,7 @@ func WaitForPodNoLongerRunningInNamespace(c clientset.Interface, podName, namesp return WaitTimeoutForPodNoLongerRunningInNamespace(c, podName, namespace, defaultPodDeletionTimeout) } -// WaitTimeoutForPodReadyInNamespace waits the given timeout diration for the +// WaitTimeoutForPodReadyInNamespace waits the given timeout duration for the // specified pod to be ready and running. func WaitTimeoutForPodReadyInNamespace(c clientset.Interface, podName, namespace string, timeout time.Duration) error { return wait.PollImmediate(poll, timeout, podRunningAndReady(c, podName, namespace)) @@ -372,12 +378,12 @@ func WaitForPodNotPending(c clientset.Interface, ns, podName string) error { // WaitForPodSuccessInNamespace returns nil if the pod reached state success, or an error if it reached failure or until podStartupTimeout. func WaitForPodSuccessInNamespace(c clientset.Interface, podName string, namespace string) error { - return waitForPodSuccessInNamespaceTimeout(c, podName, namespace, podStartTimeout) + return WaitForPodSuccessInNamespaceTimeout(c, podName, namespace, podStartTimeout) } // WaitForPodSuccessInNamespaceSlow returns nil if the pod reached state success, or an error if it reached failure or until slowPodStartupTimeout. func WaitForPodSuccessInNamespaceSlow(c clientset.Interface, podName string, namespace string) error { - return waitForPodSuccessInNamespaceTimeout(c, podName, namespace, slowPodStartTimeout) + return WaitForPodSuccessInNamespaceTimeout(c, podName, namespace, slowPodStartTimeout) } // WaitForPodNotFoundInNamespace returns an error if it takes too long for the pod to fully terminate. @@ -542,3 +548,8 @@ func WaitForNRestartablePods(ps *testutils.PodStore, expect int, timeout time.Du func WaitForPodContainerToFail(c clientset.Interface, namespace, podName string, containerIndex int, reason string, timeout time.Duration) error { return wait.PollImmediate(poll, timeout, podContainerFailed(c, namespace, podName, containerIndex, reason)) } + +// WaitForPodContainerStarted waits for the given Pod container to start, after a successful run of the startupProbe. +func WaitForPodContainerStarted(c clientset.Interface, namespace, podName string, containerIndex int, timeout time.Duration) error { + return wait.PollImmediate(poll, timeout, podContainerStarted(c, namespace, podName, containerIndex)) +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/pods.go b/vendor/k8s.io/kubernetes/test/e2e/framework/pods.go index ad20a63fce26..679ac54abf25 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/pods.go +++ b/vendor/k8s.io/kubernetes/test/e2e/framework/pods.go @@ -96,12 +96,12 @@ func (c *PodClient) Create(pod *v1.Pod) *v1.Pod { return p } -// CreateSync creates a new pod according to the framework specifications, and wait for it to start. +// CreateSync creates a new pod according to the framework specifications, and wait for it to start and be running and ready. func (c *PodClient) CreateSync(pod *v1.Pod) *v1.Pod { namespace := c.f.Namespace.Name p := c.Create(pod) - ExpectNoError(e2epod.WaitForPodNameRunningInNamespace(c.f.ClientSet, p.Name, namespace)) - // Get the newest pod after it becomes running, some status may change after pod created, such as pod ip. + ExpectNoError(e2epod.WaitTimeoutForPodReadyInNamespace(c.f.ClientSet, p.Name, namespace, PodStartTimeout)) + // Get the newest pod after it becomes running and ready, some status may change after pod created, such as pod ip. p, err := c.Get(context.TODO(), p.Name, metav1.GetOptions{}) ExpectNoError(err) return p diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/providers/aws/BUILD b/vendor/k8s.io/kubernetes/test/e2e/framework/providers/aws/BUILD deleted file mode 100644 index 1bd15aa1ca4e..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/providers/aws/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["aws.go"], - importpath = "k8s.io/kubernetes/test/e2e/framework/providers/aws", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/aws:go_default_library", - "//test/e2e/framework:go_default_library", - "//test/e2e/framework/pv:go_default_library", - "//vendor/github.com/aws/aws-sdk-go/aws:go_default_library", - "//vendor/github.com/aws/aws-sdk-go/aws/awserr:go_default_library", - "//vendor/github.com/aws/aws-sdk-go/aws/session:go_default_library", - "//vendor/github.com/aws/aws-sdk-go/service/autoscaling:go_default_library", - "//vendor/github.com/aws/aws-sdk-go/service/ec2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/providers/aws/aws.go b/vendor/k8s.io/kubernetes/test/e2e/framework/providers/aws/aws.go index dd34f84fbfa0..e5291115c3d0 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/providers/aws/aws.go +++ b/vendor/k8s.io/kubernetes/test/e2e/framework/providers/aws/aws.go @@ -38,7 +38,7 @@ func init() { func newProvider() (framework.ProviderInterface, error) { if framework.TestContext.CloudConfig.Zone == "" { - return nil, fmt.Errorf("gce-zone must be specified for AWS") + framework.Logf("Warning: gce-zone not specified! Some tests that use the AWS SDK may select the wrong region and fail.") } return &Provider{}, nil } diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/providers/azure/BUILD b/vendor/k8s.io/kubernetes/test/e2e/framework/providers/azure/BUILD deleted file mode 100644 index 24ba81ca4480..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/providers/azure/BUILD +++ /dev/null @@ -1,29 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["azure.go"], - importpath = "k8s.io/kubernetes/test/e2e/framework/providers/azure", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure:go_default_library", - "//test/e2e/framework:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/providers/gce/BUILD b/vendor/k8s.io/kubernetes/test/e2e/framework/providers/gce/BUILD deleted file mode 100644 index 6e78ce1ec433..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/providers/gce/BUILD +++ /dev/null @@ -1,50 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "firewall.go", - "gce.go", - "ingress.go", - "util.go", - ], - importpath = "k8s.io/kubernetes/test/e2e/framework/providers/gce", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/cloud-provider:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/gce:go_default_library", - "//test/e2e/framework:go_default_library", - "//test/e2e/framework/pv:go_default_library", - "//test/e2e/framework/service:go_default_library", - "//vendor/github.com/onsi/ginkgo:go_default_library", - "//vendor/google.golang.org/api/compute/v1:go_default_library", - "//vendor/google.golang.org/api/googleapi:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["firewall_test.go"], - embed = [":go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/providers/kubemark/BUILD b/vendor/k8s.io/kubernetes/test/e2e/framework/providers/kubemark/BUILD deleted file mode 100644 index a905b20c5201..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/providers/kubemark/BUILD +++ /dev/null @@ -1,29 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["kubemark.go"], - importpath = "k8s.io/kubernetes/test/e2e/framework/providers/kubemark", - visibility = ["//visibility:public"], - deps = [ - "//pkg/kubemark:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/tools/clientcmd:go_default_library", - "//test/e2e/framework:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/providers/openstack/BUILD b/vendor/k8s.io/kubernetes/test/e2e/framework/providers/openstack/BUILD deleted file mode 100644 index eeed2edfded1..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/providers/openstack/BUILD +++ /dev/null @@ -1,23 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["openstack.go"], - importpath = "k8s.io/kubernetes/test/e2e/framework/providers/openstack", - visibility = ["//visibility:public"], - deps = ["//test/e2e/framework:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/providers/vsphere/BUILD b/vendor/k8s.io/kubernetes/test/e2e/framework/providers/vsphere/BUILD deleted file mode 100644 index c7115f81a4bd..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/providers/vsphere/BUILD +++ /dev/null @@ -1,23 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["vsphere.go"], - importpath = "k8s.io/kubernetes/test/e2e/framework/providers/vsphere", - visibility = ["//visibility:public"], - deps = ["//test/e2e/framework:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/pv/BUILD b/vendor/k8s.io/kubernetes/test/e2e/framework/pv/BUILD deleted file mode 100644 index fd70b70fc3c3..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/pv/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["pv.go"], - importpath = "k8s.io/kubernetes/test/e2e/framework/pv", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//test/e2e/framework:go_default_library", - "//test/e2e/framework/skipper:go_default_library", - "//test/e2e/storage/utils:go_default_library", - "//vendor/github.com/onsi/ginkgo:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/pv/pv.go b/vendor/k8s.io/kubernetes/test/e2e/framework/pv/pv.go index 64e6dbbe3600..6366dcaa3b86 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/pv/pv.go +++ b/vendor/k8s.io/kubernetes/test/e2e/framework/pv/pv.go @@ -19,9 +19,10 @@ package framework import ( "context" "fmt" - "k8s.io/kubernetes/test/e2e/storage/utils" "time" + "k8s.io/kubernetes/test/e2e/storage/utils" + "github.com/onsi/ginkgo" v1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" @@ -38,18 +39,6 @@ const ( pdRetryTimeout = 5 * time.Minute pdRetryPollTime = 5 * time.Second - // PVBindingTimeout is how long PVs have to become bound. - PVBindingTimeout = 3 * time.Minute - - // ClaimBindingTimeout is how long claims have to become bound. - ClaimBindingTimeout = 3 * time.Minute - - // PVReclaimingTimeout is how long PVs have to beome reclaimed. - PVReclaimingTimeout = 3 * time.Minute - - // PVDeletingTimeout is how long PVs have to become deleted. - PVDeletingTimeout = 3 * time.Minute - // VolumeSelectorKey is the key for volume selector. VolumeSelectorKey = "e2e-pv-pool" @@ -223,7 +212,7 @@ func DeletePersistentVolumeClaim(c clientset.Interface, pvcName string, ns strin // DeletePVCandValidatePV deletes the PVC and waits for the PV to enter its expected phase. Validate that the PV // has been reclaimed (assumption here about reclaimPolicy). Caller tells this func which // phase value to expect for the pv bound to the to-be-deleted claim. -func DeletePVCandValidatePV(c clientset.Interface, ns string, pvc *v1.PersistentVolumeClaim, pv *v1.PersistentVolume, expectPVPhase v1.PersistentVolumePhase) error { +func DeletePVCandValidatePV(c clientset.Interface, timeouts *framework.TimeoutContext, ns string, pvc *v1.PersistentVolumeClaim, pv *v1.PersistentVolume, expectPVPhase v1.PersistentVolumePhase) error { pvname := pvc.Spec.VolumeName framework.Logf("Deleting PVC %v to trigger reclamation of PV %v", pvc.Name, pvname) err := DeletePersistentVolumeClaim(c, pvc.Name, ns) @@ -233,7 +222,7 @@ func DeletePVCandValidatePV(c clientset.Interface, ns string, pvc *v1.Persistent // Wait for the PV's phase to return to be `expectPVPhase` framework.Logf("Waiting for reclaim process to complete.") - err = WaitForPersistentVolumePhase(expectPVPhase, c, pv.Name, framework.Poll, PVReclaimingTimeout) + err = WaitForPersistentVolumePhase(expectPVPhase, c, pv.Name, framework.Poll, timeouts.PVReclaim) if err != nil { return fmt.Errorf("pv %q phase did not become %v: %v", pv.Name, expectPVPhase, err) } @@ -266,7 +255,7 @@ func DeletePVCandValidatePV(c clientset.Interface, ns string, pvc *v1.Persistent // Available, Bound). // Note: if there are more claims than pvs then some of the remaining claims may bind to just made // available pvs. -func DeletePVCandValidatePVGroup(c clientset.Interface, ns string, pvols PVMap, claims PVCMap, expectPVPhase v1.PersistentVolumePhase) error { +func DeletePVCandValidatePVGroup(c clientset.Interface, timeouts *framework.TimeoutContext, ns string, pvols PVMap, claims PVCMap, expectPVPhase v1.PersistentVolumePhase) error { var boundPVs, deletedPVCs int for pvName := range pvols { @@ -287,7 +276,7 @@ func DeletePVCandValidatePVGroup(c clientset.Interface, ns string, pvols PVMap, // get the pvc for the delete call below pvc, err := c.CoreV1().PersistentVolumeClaims(ns).Get(context.TODO(), cr.Name, metav1.GetOptions{}) if err == nil { - if err = DeletePVCandValidatePV(c, ns, pvc, pv, expectPVPhase); err != nil { + if err = DeletePVCandValidatePV(c, timeouts, ns, pvc, pv, expectPVPhase); err != nil { return err } } else if !apierrors.IsNotFound(err) { @@ -445,17 +434,17 @@ func CreatePVsPVCs(numpvs, numpvcs int, c clientset.Interface, ns string, pvConf } // WaitOnPVandPVC waits for the pv and pvc to bind to each other. -func WaitOnPVandPVC(c clientset.Interface, ns string, pv *v1.PersistentVolume, pvc *v1.PersistentVolumeClaim) error { +func WaitOnPVandPVC(c clientset.Interface, timeouts *framework.TimeoutContext, ns string, pv *v1.PersistentVolume, pvc *v1.PersistentVolumeClaim) error { // Wait for newly created PVC to bind to the PV framework.Logf("Waiting for PV %v to bind to PVC %v", pv.Name, pvc.Name) - err := WaitForPersistentVolumeClaimPhase(v1.ClaimBound, c, ns, pvc.Name, framework.Poll, ClaimBindingTimeout) + err := WaitForPersistentVolumeClaimPhase(v1.ClaimBound, c, ns, pvc.Name, framework.Poll, timeouts.ClaimBound) if err != nil { return fmt.Errorf("PVC %q did not become Bound: %v", pvc.Name, err) } // Wait for PersistentVolume.Status.Phase to be Bound, which it should be // since the PVC is already bound. - err = WaitForPersistentVolumePhase(v1.VolumeBound, c, pv.Name, framework.Poll, PVBindingTimeout) + err = WaitForPersistentVolumePhase(v1.VolumeBound, c, pv.Name, framework.Poll, timeouts.PVBound) if err != nil { return fmt.Errorf("PV %q did not become Bound: %v", pv.Name, err) } @@ -493,7 +482,7 @@ func WaitOnPVandPVC(c clientset.Interface, ns string, pv *v1.PersistentVolume, p // to situations where the maximum wait times are reached several times in succession, // extending test time. Thus, it is recommended to keep the delta between PVs and PVCs // small. -func WaitAndVerifyBinds(c clientset.Interface, ns string, pvols PVMap, claims PVCMap, testExpected bool) error { +func WaitAndVerifyBinds(c clientset.Interface, timeouts *framework.TimeoutContext, ns string, pvols PVMap, claims PVCMap, testExpected bool) error { var actualBinds int expectedBinds := len(pvols) if expectedBinds > len(claims) { // want the min of # pvs or #pvcs @@ -501,7 +490,7 @@ func WaitAndVerifyBinds(c clientset.Interface, ns string, pvols PVMap, claims PV } for pvName := range pvols { - err := WaitForPersistentVolumePhase(v1.VolumeBound, c, pvName, framework.Poll, PVBindingTimeout) + err := WaitForPersistentVolumePhase(v1.VolumeBound, c, pvName, framework.Poll, timeouts.PVBound) if err != nil && len(pvols) > len(claims) { framework.Logf("WARN: pv %v is not bound after max wait", pvName) framework.Logf(" This may be ok since there are more pvs than pvcs") @@ -524,7 +513,7 @@ func WaitAndVerifyBinds(c clientset.Interface, ns string, pvols PVMap, claims PV return fmt.Errorf("internal: claims map is missing pvc %q", pvcKey) } - err := WaitForPersistentVolumeClaimPhase(v1.ClaimBound, c, ns, cr.Name, framework.Poll, ClaimBindingTimeout) + err := WaitForPersistentVolumeClaimPhase(v1.ClaimBound, c, ns, cr.Name, framework.Poll, timeouts.ClaimBound) if err != nil { return fmt.Errorf("PVC %q did not become Bound: %v", cr.Name, err) } @@ -746,7 +735,7 @@ func WaitForPersistentVolumeClaimsPhase(phase v1.PersistentVolumeClaimPhase, c c if len(pvcNames) == 0 { return fmt.Errorf("Incorrect parameter: Need at least one PVC to track. Found 0") } - framework.Logf("Waiting up to %v for PersistentVolumeClaims %v to have phase %s", timeout, pvcNames, phase) + framework.Logf("Waiting up to timeout=%v for PersistentVolumeClaims %v to have phase %s", timeout, pvcNames, phase) for start := time.Now(); time.Since(start) < timeout; time.Sleep(poll) { phaseFoundInAllClaims := true for _, pvcName := range pvcNames { @@ -876,3 +865,11 @@ func WaitForPVCFinalizer(ctx context.Context, cs clientset.Interface, name, name } return err } + +// GetDefaultFSType returns the default fsType +func GetDefaultFSType() string { + if framework.NodeOSDistroIs("windows") { + return "ntfs" + } + return "ext4" +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/rc/BUILD b/vendor/k8s.io/kubernetes/test/e2e/framework/rc/BUILD deleted file mode 100644 index b27c4f8106d4..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/rc/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["rc_utils.go"], - importpath = "k8s.io/kubernetes/test/e2e/framework/rc", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/scale:go_default_library", - "//test/e2e/framework:go_default_library", - "//test/e2e/framework/kubectl:go_default_library", - "//test/e2e/framework/resource:go_default_library", - "//test/utils:go_default_library", - "//vendor/github.com/onsi/ginkgo:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/replicaset/BUILD b/vendor/k8s.io/kubernetes/test/e2e/framework/replicaset/BUILD deleted file mode 100644 index 47a90d36ee64..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/replicaset/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "rest.go", - "wait.go", - ], - importpath = "k8s.io/kubernetes/test/e2e/framework/replicaset", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//test/e2e/framework:go_default_library", - "//test/utils:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/resource/BUILD b/vendor/k8s.io/kubernetes/test/e2e/framework/resource/BUILD deleted file mode 100644 index 986506e7b1b7..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/resource/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "resources.go", - "runtimeobj.go", - ], - importpath = "k8s.io/kubernetes/test/e2e/framework/resource", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/batch/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/scale:go_default_library", - "//test/e2e/framework:go_default_library", - "//test/e2e/framework/pod:go_default_library", - "//test/utils:go_default_library", - "//vendor/github.com/onsi/ginkgo:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/security/BUILD b/vendor/k8s.io/kubernetes/test/e2e/framework/security/BUILD deleted file mode 100644 index 6f97e3e51ca3..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/security/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["apparmor.go"], - importpath = "k8s.io/kubernetes/test/e2e/framework/security", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//test/e2e/framework:go_default_library", - "//test/e2e/framework/pod:go_default_library", - "//test/utils/image:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/service/BUILD b/vendor/k8s.io/kubernetes/test/e2e/framework/service/BUILD deleted file mode 100644 index 3af1bb6cf31a..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/service/BUILD +++ /dev/null @@ -1,56 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "const.go", - "jig.go", - "resource.go", - "util.go", - "wait.go", - ], - importpath = "k8s.io/kubernetes/test/e2e/framework/service", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/discovery/v1beta1:go_default_library", - "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/cloud-provider/service/helpers:go_default_library", - "//test/e2e/framework:go_default_library", - "//test/e2e/framework/network:go_default_library", - "//test/e2e/framework/node:go_default_library", - "//test/e2e/framework/pod:go_default_library", - "//test/e2e/framework/rc:go_default_library", - "//test/utils:go_default_library", - "//test/utils/image:go_default_library", - "//vendor/github.com/onsi/ginkgo:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/service/const.go b/vendor/k8s.io/kubernetes/test/e2e/framework/service/const.go index edecc7bfbe4f..9104587c00b1 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/service/const.go +++ b/vendor/k8s.io/kubernetes/test/e2e/framework/service/const.go @@ -51,10 +51,10 @@ const ( // LoadBalancerCreateTimeoutDefault is the default time to wait for a load balancer to be created/modified. // TODO: once support ticket 21807001 is resolved, reduce this timeout back to something reasonable // Hideen - use GetServiceLoadBalancerCreateTimeout function instead. - loadBalancerCreateTimeoutDefault = 20 * time.Minute + loadBalancerCreateTimeoutDefault = 10 * time.Minute // LoadBalancerCreateTimeoutLarge is the maximum time to wait for a load balancer to be created/modified. // Hideen - use GetServiceLoadBalancerCreateTimeout function instead. - loadBalancerCreateTimeoutLarge = 2 * time.Hour + loadBalancerCreateTimeoutLarge = 45 * time.Minute // LoadBalancerPropagationTimeoutDefault is the default time to wait for pods to // be targeted by load balancers. diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/service/jig.go b/vendor/k8s.io/kubernetes/test/e2e/framework/service/jig.go index 5eaf83b7523c..7b5e9ebb4927 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/service/jig.go +++ b/vendor/k8s.io/kubernetes/test/e2e/framework/service/jig.go @@ -21,15 +21,14 @@ import ( "errors" "fmt" "net" - "regexp" "strconv" "strings" "time" "github.com/onsi/ginkgo" v1 "k8s.io/api/core/v1" - discoveryv1beta1 "k8s.io/api/discovery/v1beta1" - policyv1beta1 "k8s.io/api/policy/v1beta1" + discoveryv1 "k8s.io/api/discovery/v1" + policyv1 "k8s.io/api/policy/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/fields" @@ -44,12 +43,12 @@ import ( clientset "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/cache" "k8s.io/kubernetes/test/e2e/framework" - e2enetwork "k8s.io/kubernetes/test/e2e/framework/network" e2enode "k8s.io/kubernetes/test/e2e/framework/node" e2epod "k8s.io/kubernetes/test/e2e/framework/pod" e2erc "k8s.io/kubernetes/test/e2e/framework/rc" testutils "k8s.io/kubernetes/test/utils" imageutils "k8s.io/kubernetes/test/utils/image" + utilsnet "k8s.io/utils/net" ) // NodePortRange should match whatever the default/configured range is @@ -65,6 +64,9 @@ type TestJig struct { Name string ID string Labels map[string]string + // ExternalIPs should be false for Conformance test + // Don't check nodeport on external addrs in conformance test, but in e2e test. + ExternalIPs bool } // NewTestJig allocates and inits a new TestJig. @@ -393,52 +395,47 @@ func (j *TestJig) waitForAvailableEndpoint(timeout time.Duration) error { go controller.Run(stopCh) - // If EndpointSlice API is enabled, then validate if appropriate EndpointSlice objects were also create/updated/deleted. - if _, err := j.Client.Discovery().ServerResourcesForGroupVersion(discoveryv1beta1.SchemeGroupVersion.String()); err == nil { - var esController cache.Controller - _, esController = cache.NewInformer( - &cache.ListWatch{ - ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { - options.LabelSelector = "kubernetes.io/service-name=" + j.Name - obj, err := j.Client.DiscoveryV1beta1().EndpointSlices(j.Namespace).List(context.TODO(), options) - return runtime.Object(obj), err - }, - WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { - options.LabelSelector = "kubernetes.io/service-name=" + j.Name - return j.Client.DiscoveryV1beta1().EndpointSlices(j.Namespace).Watch(context.TODO(), options) - }, + var esController cache.Controller + _, esController = cache.NewInformer( + &cache.ListWatch{ + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { + options.LabelSelector = "kubernetes.io/service-name=" + j.Name + obj, err := j.Client.DiscoveryV1().EndpointSlices(j.Namespace).List(context.TODO(), options) + return runtime.Object(obj), err + }, + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { + options.LabelSelector = "kubernetes.io/service-name=" + j.Name + return j.Client.DiscoveryV1().EndpointSlices(j.Namespace).Watch(context.TODO(), options) }, - &discoveryv1beta1.EndpointSlice{}, - 0, - cache.ResourceEventHandlerFuncs{ - AddFunc: func(obj interface{}) { - if es, ok := obj.(*discoveryv1beta1.EndpointSlice); ok { - // TODO: currently we only consider addreses in 1 slice, but services with - // a large number of endpoints (>1000) may have multiple slices. Some slices - // with only a few addresses. We should check the addresses in all slices. - if len(es.Endpoints) > 0 && len(es.Endpoints[0].Addresses) > 0 { - endpointSliceAvailable = true - } + }, + &discoveryv1.EndpointSlice{}, + 0, + cache.ResourceEventHandlerFuncs{ + AddFunc: func(obj interface{}) { + if es, ok := obj.(*discoveryv1.EndpointSlice); ok { + // TODO: currently we only consider addreses in 1 slice, but services with + // a large number of endpoints (>1000) may have multiple slices. Some slices + // with only a few addresses. We should check the addresses in all slices. + if len(es.Endpoints) > 0 && len(es.Endpoints[0].Addresses) > 0 { + endpointSliceAvailable = true } - }, - UpdateFunc: func(old, cur interface{}) { - if es, ok := cur.(*discoveryv1beta1.EndpointSlice); ok { - // TODO: currently we only consider addreses in 1 slice, but services with - // a large number of endpoints (>1000) may have multiple slices. Some slices - // with only a few addresses. We should check the addresses in all slices. - if len(es.Endpoints) > 0 && len(es.Endpoints[0].Addresses) > 0 { - endpointSliceAvailable = true - } + } + }, + UpdateFunc: func(old, cur interface{}) { + if es, ok := cur.(*discoveryv1.EndpointSlice); ok { + // TODO: currently we only consider addreses in 1 slice, but services with + // a large number of endpoints (>1000) may have multiple slices. Some slices + // with only a few addresses. We should check the addresses in all slices. + if len(es.Endpoints) > 0 && len(es.Endpoints[0].Addresses) > 0 { + endpointSliceAvailable = true } - }, + } }, - ) + }, + ) - go esController.Run(stopCh) + go esController.Run(stopCh) - } else { - endpointSliceAvailable = true - } err := wait.Poll(1*time.Second, timeout, func() (bool, error) { return endpointAvailable && endpointSliceAvailable, nil }) @@ -682,9 +679,9 @@ func (j *TestJig) AddRCAntiAffinity(rc *v1.ReplicationController) { } // CreatePDB returns a PodDisruptionBudget for the given ReplicationController, or returns an error if a PodDisruptionBudget isn't ready -func (j *TestJig) CreatePDB(rc *v1.ReplicationController) (*policyv1beta1.PodDisruptionBudget, error) { +func (j *TestJig) CreatePDB(rc *v1.ReplicationController) (*policyv1.PodDisruptionBudget, error) { pdb := j.newPDBTemplate(rc) - newPdb, err := j.Client.PolicyV1beta1().PodDisruptionBudgets(j.Namespace).Create(context.TODO(), pdb, metav1.CreateOptions{}) + newPdb, err := j.Client.PolicyV1().PodDisruptionBudgets(j.Namespace).Create(context.TODO(), pdb, metav1.CreateOptions{}) if err != nil { return nil, fmt.Errorf("failed to create PDB %q %v", pdb.Name, err) } @@ -695,19 +692,19 @@ func (j *TestJig) CreatePDB(rc *v1.ReplicationController) (*policyv1beta1.PodDis return newPdb, nil } -// newPDBTemplate returns the default policyv1beta1.PodDisruptionBudget object for +// newPDBTemplate returns the default policyv1.PodDisruptionBudget object for // this j, but does not actually create the PDB. The default PDB specifies a // MinAvailable of N-1 and matches the pods created by the RC. -func (j *TestJig) newPDBTemplate(rc *v1.ReplicationController) *policyv1beta1.PodDisruptionBudget { +func (j *TestJig) newPDBTemplate(rc *v1.ReplicationController) *policyv1.PodDisruptionBudget { minAvailable := intstr.FromInt(int(*rc.Spec.Replicas) - 1) - pdb := &policyv1beta1.PodDisruptionBudget{ + pdb := &policyv1.PodDisruptionBudget{ ObjectMeta: metav1.ObjectMeta{ Namespace: j.Namespace, Name: j.Name, Labels: j.Labels, }, - Spec: policyv1beta1.PodDisruptionBudgetSpec{ + Spec: policyv1.PodDisruptionBudgetSpec{ MinAvailable: &minAvailable, Selector: &metav1.LabelSelector{MatchLabels: j.Labels}, }, @@ -765,7 +762,7 @@ func (j *TestJig) Scale(replicas int) error { func (j *TestJig) waitForPdbReady() error { timeout := 2 * time.Minute for start := time.Now(); time.Since(start) < timeout; time.Sleep(2 * time.Second) { - pdb, err := j.Client.PolicyV1beta1().PodDisruptionBudgets(j.Namespace).Get(context.TODO(), j.Name, metav1.GetOptions{}) + pdb, err := j.Client.PolicyV1().PodDisruptionBudgets(j.Namespace).Get(context.TODO(), j.Name, metav1.GetOptions{}) if err != nil { return err } @@ -819,20 +816,19 @@ func testReachabilityOverServiceName(serviceName string, sp v1.ServicePort, exec func testReachabilityOverClusterIP(clusterIP string, sp v1.ServicePort, execPod *v1.Pod) error { // If .spec.clusterIP is set to "" or "None" for service, ClusterIP is not created, so reachability can not be tested over clusterIP:servicePort - isClusterIPV46, err := regexp.MatchString(e2enetwork.RegexIPv4+"||"+e2enetwork.RegexIPv6, clusterIP) - if err != nil { + if net.ParseIP(clusterIP) == nil { return fmt.Errorf("unable to parse ClusterIP: %s", clusterIP) } - if isClusterIPV46 { - return testEndpointReachability(clusterIP, sp.Port, sp.Protocol, execPod) - } - return nil + return testEndpointReachability(clusterIP, sp.Port, sp.Protocol, execPod) +} + +func testReachabilityOverExternalIP(externalIP string, sp v1.ServicePort, execPod *v1.Pod) error { + return testEndpointReachability(externalIP, sp.Port, sp.Protocol, execPod) } -func testReachabilityOverNodePorts(nodes *v1.NodeList, sp v1.ServicePort, pod *v1.Pod, clusterIP string) error { +func testReachabilityOverNodePorts(nodes *v1.NodeList, sp v1.ServicePort, pod *v1.Pod, clusterIP string, externalIPs bool) error { internalAddrs := e2enode.CollectAddresses(nodes, v1.NodeInternalIP) - externalAddrs := e2enode.CollectAddresses(nodes, v1.NodeExternalIP) - isClusterIPV4 := net.ParseIP(clusterIP).To4() != nil + isClusterIPV4 := utilsnet.IsIPv4String(clusterIP) for _, internalAddr := range internalAddrs { // If the node's internal address points to localhost, then we are not @@ -841,10 +837,8 @@ func testReachabilityOverNodePorts(nodes *v1.NodeList, sp v1.ServicePort, pod *v framework.Logf("skipping testEndpointReachability() for internal adddress %s", internalAddr) continue } - isNodeInternalIPV4 := net.ParseIP(internalAddr).To4() != nil - // Check service reachability on the node internalIP which is same family - // as clusterIP - if isClusterIPV4 != isNodeInternalIPV4 { + // Check service reachability on the node internalIP which is same family as clusterIP + if isClusterIPV4 != utilsnet.IsIPv4String(internalAddr) { framework.Logf("skipping testEndpointReachability() for internal adddress %s as it does not match clusterIP (%s) family", internalAddr, clusterIP) continue } @@ -854,15 +848,17 @@ func testReachabilityOverNodePorts(nodes *v1.NodeList, sp v1.ServicePort, pod *v return err } } - for _, externalAddr := range externalAddrs { - isNodeExternalIPV4 := net.ParseIP(externalAddr).To4() != nil - if isClusterIPV4 != isNodeExternalIPV4 { - framework.Logf("skipping testEndpointReachability() for external adddress %s as it does not match clusterIP (%s) family", externalAddr, clusterIP) - continue - } - err := testEndpointReachability(externalAddr, sp.NodePort, sp.Protocol, pod) - if err != nil { - return err + if externalIPs { + externalAddrs := e2enode.CollectAddresses(nodes, v1.NodeExternalIP) + for _, externalAddr := range externalAddrs { + if isClusterIPV4 != utilsnet.IsIPv4String(externalAddr) { + framework.Logf("skipping testEndpointReachability() for external adddress %s as it does not match clusterIP (%s) family", externalAddr, clusterIP) + continue + } + err := testEndpointReachability(externalAddr, sp.NodePort, sp.Protocol, pod) + if err != nil { + return err + } } } return nil @@ -886,19 +882,24 @@ func testEndpointReachability(endpoint string, port int32, protocol v1.Protocol, cmd := "" switch protocol { case v1.ProtocolTCP: - cmd = fmt.Sprintf("nc -zv -t -w 2 %s %v", endpoint, port) + cmd = fmt.Sprintf("echo hostName | nc -v -t -w 2 %s %v", endpoint, port) case v1.ProtocolUDP: - cmd = fmt.Sprintf("nc -zv -u -w 2 %s %v", endpoint, port) + cmd = fmt.Sprintf("echo hostName | nc -v -u -w 2 %s %v", endpoint, port) default: - return fmt.Errorf("service reachablity check is not supported for %v", protocol) + return fmt.Errorf("service reachability check is not supported for %v", protocol) } err := wait.PollImmediate(1*time.Second, ServiceReachabilityShortPollTimeout, func() (bool, error) { - if _, err := framework.RunHostCmd(execPod.Namespace, execPod.Name, cmd); err != nil { + stdout, err := framework.RunHostCmd(execPod.Namespace, execPod.Name, cmd) + if err != nil { framework.Logf("Service reachability failing with error: %v\nRetrying...", err) return false, nil } - return true, nil + trimmed := strings.TrimSpace(stdout) + if trimmed != "" { + return true, nil + } + return false, nil }) if err != nil { return fmt.Errorf("service is not reachable within %v timeout on endpoint %s over %s protocol", ServiceReachabilityShortPollTimeout, ep, protocol) @@ -911,6 +912,7 @@ func testEndpointReachability(endpoint string, port int32, protocol v1.Protocol, func (j *TestJig) checkClusterIPServiceReachability(svc *v1.Service, pod *v1.Pod) error { clusterIP := svc.Spec.ClusterIP servicePorts := svc.Spec.Ports + externalIPs := svc.Spec.ExternalIPs err := j.waitForAvailableEndpoint(ServiceEndpointsTimeout) if err != nil { @@ -926,6 +928,14 @@ func (j *TestJig) checkClusterIPServiceReachability(svc *v1.Service, pod *v1.Pod if err != nil { return err } + if len(externalIPs) > 0 { + for _, externalIP := range externalIPs { + err = testReachabilityOverExternalIP(externalIP, servicePort, pod) + if err != nil { + return err + } + } + } } return nil } @@ -959,7 +969,7 @@ func (j *TestJig) checkNodePortServiceReachability(svc *v1.Service, pod *v1.Pod) if err != nil { return err } - err = testReachabilityOverNodePorts(nodes, servicePort, pod, clusterIP) + err = testReachabilityOverNodePorts(nodes, servicePort, pod, clusterIP, j.ExternalIPs) if err != nil { return err } @@ -975,13 +985,16 @@ func (j *TestJig) checkExternalServiceReachability(svc *v1.Service, pod *v1.Pod) svcName := fmt.Sprintf("%s.%s.svc.%s", svc.Name, svc.Namespace, framework.TestContext.ClusterDNSDomain) // Service must resolve to IP cmd := fmt.Sprintf("nslookup %s", svcName) - _, stderr, err := framework.RunHostCmdWithFullOutput(pod.Namespace, pod.Name, cmd) - // NOTE(claudiub): nslookup may return 0 on Windows, even though the DNS name was not found. In this case, - // we can check stderr for the error. - if err != nil || (framework.NodeOSDistroIs("windows") && strings.Contains(stderr, fmt.Sprintf("can't find %s", svcName))) { - return fmt.Errorf("ExternalName service %q must resolve to IP", pod.Namespace+"/"+pod.Name) - } - return nil + return wait.PollImmediate(framework.Poll, ServiceReachabilityShortPollTimeout, func() (done bool, err error) { + _, stderr, err := framework.RunHostCmdWithFullOutput(pod.Namespace, pod.Name, cmd) + // NOTE(claudiub): nslookup may return 0 on Windows, even though the DNS name was not found. In this case, + // we can check stderr for the error. + if err != nil || (framework.NodeOSDistroIs("windows") && strings.Contains(stderr, fmt.Sprintf("can't find %s", svcName))) { + framework.Logf("ExternalName service %q failed to resolve to IP", pod.Namespace+"/"+pod.Name) + return false, nil + } + return true, nil + }) } // CheckServiceReachability ensures that request are served by the services. Only supports Services with type ClusterIP, NodePort and ExternalName. @@ -1005,24 +1018,8 @@ func (j *TestJig) CheckServiceReachability(svc *v1.Service, pod *v1.Pod) error { } } -// CreateServicePods creates a replication controller with the label same as service. Service listens to HTTP. +// CreateServicePods creates a replication controller with the label same as service. Service listens to TCP and UDP. func (j *TestJig) CreateServicePods(replica int) error { - config := testutils.RCConfig{ - Client: j.Client, - Name: j.Name, - Image: framework.ServeHostnameImage, - Command: []string{"/agnhost", "serve-hostname"}, - Namespace: j.Namespace, - Labels: j.Labels, - PollInterval: 3 * time.Second, - Timeout: framework.PodReadyBeforeTimeout, - Replicas: replica, - } - return e2erc.RunRC(config) -} - -// CreateTCPUDPServicePods creates a replication controller with the label same as service. Service listens to TCP and UDP. -func (j *TestJig) CreateTCPUDPServicePods(replica int) error { config := testutils.RCConfig{ Client: j.Client, Name: j.Name, diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/skipper/BUILD b/vendor/k8s.io/kubernetes/test/e2e/framework/skipper/BUILD deleted file mode 100644 index f6899207c0b6..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/skipper/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["skipper.go"], - importpath = "k8s.io/kubernetes/test/e2e/framework/skipper", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/version:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/discovery:go_default_library", - "//staging/src/k8s.io/client-go/dynamic:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/component-base/featuregate:go_default_library", - "//test/e2e/framework:go_default_library", - "//test/e2e/framework/node:go_default_library", - "//test/e2e/framework/ssh:go_default_library", - "//vendor/github.com/onsi/ginkgo:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/skipper/skipper.go b/vendor/k8s.io/kubernetes/test/e2e/framework/skipper/skipper.go index 76d679649f7a..dbe0214a9faf 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/skipper/skipper.go +++ b/vendor/k8s.io/kubernetes/test/e2e/framework/skipper/skipper.go @@ -46,6 +46,11 @@ import ( // New local storage types to support local storage capacity isolation var localStorageCapacityIsolation featuregate.Feature = "LocalStorageCapacityIsolation" +var ( + downwardAPIHugePages featuregate.Feature = "DownwardAPIHugePages" + execProbeTimeout featuregate.Feature = "ExecProbeTimeout" +) + func skipInternalf(caller int, format string, args ...interface{}) { msg := fmt.Sprintf(format, args...) framework.Logf(msg) @@ -137,6 +142,18 @@ func SkipUnlessLocalEphemeralStorageEnabled() { } } +func SkipUnlessDownwardAPIHugePagesEnabled() { + if !utilfeature.DefaultFeatureGate.Enabled(downwardAPIHugePages) { + skipInternalf(1, "Only supported when %v feature is enabled", downwardAPIHugePages) + } +} + +func SkipUnlessExecProbeTimeoutEnabled() { + if !utilfeature.DefaultFeatureGate.Enabled(execProbeTimeout) { + skipInternalf(1, "Only supported when %v feature is enabled", execProbeTimeout) + } +} + // SkipIfMissingResource skips if the gvr resource is missing. func SkipIfMissingResource(dynamicClient dynamic.Interface, gvr schema.GroupVersionResource, namespace string) { resourceClient := dynamicClient.Resource(gvr).Namespace(namespace) diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/ssh/BUILD b/vendor/k8s.io/kubernetes/test/e2e/framework/ssh/BUILD deleted file mode 100644 index 90a99d8edc79..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/ssh/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["ssh.go"], - importpath = "k8s.io/kubernetes/test/e2e/framework/ssh", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//test/e2e/framework/log:go_default_library", - "//vendor/github.com/onsi/gomega:go_default_library", - "//vendor/golang.org/x/crypto/ssh:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/statefulset/BUILD b/vendor/k8s.io/kubernetes/test/e2e/framework/statefulset/BUILD deleted file mode 100644 index 2be6126dddf5..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/statefulset/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "const.go", - "fixtures.go", - "rest.go", - "wait.go", - ], - importpath = "k8s.io/kubernetes/test/e2e/framework/statefulset", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/kubectl/pkg/util/podutils:go_default_library", - "//test/e2e/framework:go_default_library", - "//test/e2e/framework/manifest:go_default_library", - "//test/utils/image:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/test_context.go b/vendor/k8s.io/kubernetes/test/e2e/framework/test_context.go index ca18e6334acb..cce5ad97fec8 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/test_context.go +++ b/vendor/k8s.io/kubernetes/test/e2e/framework/test_context.go @@ -217,6 +217,8 @@ type NodeTestContextType struct { KubeletConfig kubeletconfig.KubeletConfiguration // ImageDescription is the description of the image on which the test is running. ImageDescription string + // RuntimeConfig is a map of API server runtime configuration values. + RuntimeConfig map[string]string // SystemSpecName is the name of the system spec (e.g., gke) that's used in // the node e2e test. If empty, the default one (system.DefaultSpec) is // used. The system specs are in test/e2e_node/system/specs/. @@ -330,7 +332,7 @@ func RegisterClusterFlags(flags *flag.FlagSet) { flags.StringVar(&TestContext.OutputDir, "e2e-output-dir", "/tmp", "Output directory for interesting/useful test data, like performance data, benchmarks, and other metrics.") flags.StringVar(&TestContext.Prefix, "prefix", "e2e", "A prefix to be added to cloud resources created during testing.") flags.StringVar(&TestContext.MasterOSDistro, "master-os-distro", "debian", "The OS distribution of cluster master (debian, ubuntu, gci, coreos, or custom).") - flags.StringVar(&TestContext.NodeOSDistro, "node-os-distro", "debian", "The OS distribution of cluster VM instances (debian, ubuntu, gci, coreos, or custom).") + flags.StringVar(&TestContext.NodeOSDistro, "node-os-distro", "debian", "The OS distribution of cluster VM instances (debian, ubuntu, gci, coreos, windows, or custom), which determines how specific tests are implemented.") flags.StringVar(&TestContext.NodeOSArch, "node-os-arch", "amd64", "The OS architecture of cluster VM instances (amd64, arm64, or custom).") flags.StringVar(&TestContext.ClusterDNSDomain, "dns-domain", "cluster.local", "The DNS Domain of the cluster.") @@ -435,7 +437,7 @@ func AfterReadingAllFlags(t *TestContextType) { kubeConfig := createKubeConfig(clusterConfig) clientcmd.WriteToFile(*kubeConfig, tempFile.Name()) t.KubeConfig = tempFile.Name() - klog.Infof("Using a temporary kubeconfig file from in-cluster config : %s", tempFile.Name()) + klog.V(4).Infof("Using a temporary kubeconfig file from in-cluster config : %s", tempFile.Name()) } } if len(t.KubeConfig) == 0 { @@ -456,7 +458,7 @@ func AfterReadingAllFlags(t *TestContextType) { t.AllowedNotReadyNodes = t.CloudConfig.NumNodes / 100 } - klog.Infof("Tolerating taints %q when considering if nodes are ready", TestContext.NonblockingTaints) + klog.V(4).Infof("Tolerating taints %q when considering if nodes are ready", TestContext.NonblockingTaints) // Make sure that all test runs have a valid TestContext.CloudConfig.Provider. // TODO: whether and how long this code is needed is getting discussed diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/testfiles/BUILD b/vendor/k8s.io/kubernetes/test/e2e/framework/testfiles/BUILD deleted file mode 100644 index fbc7055edd3c..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/testfiles/BUILD +++ /dev/null @@ -1,22 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["testfiles.go"], - importpath = "k8s.io/kubernetes/test/e2e/framework/testfiles", - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/timeouts.go b/vendor/k8s.io/kubernetes/test/e2e/framework/timeouts.go new file mode 100644 index 000000000000..5819c54738e1 --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/framework/timeouts.go @@ -0,0 +1,99 @@ +/* +Copyright 2020 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package framework + +import "time" + +const ( + // Default timeouts to be used in TimeoutContext + podStartTimeout = 5 * time.Minute + podStartShortTimeout = 2 * time.Minute + podStartSlowTimeout = 15 * time.Minute + podDeleteTimeout = 5 * time.Minute + claimProvisionTimeout = 5 * time.Minute + claimProvisionShortTimeout = 1 * time.Minute + claimBoundTimeout = 3 * time.Minute + pvReclaimTimeout = 3 * time.Minute + pvBoundTimeout = 3 * time.Minute + pvDeleteTimeout = 3 * time.Minute + pvDeleteSlowTimeout = 20 * time.Minute + snapshotCreateTimeout = 5 * time.Minute + snapshotDeleteTimeout = 5 * time.Minute +) + +// TimeoutContext contains timeout settings for several actions. +type TimeoutContext struct { + // PodStart is how long to wait for the pod to be started. + PodStart time.Duration + + // PodStartShort is same as `PodStart`, but shorter. + // Use it in a case-by-case basis, mostly when you are sure pod start will not be delayed. + PodStartShort time.Duration + + // PodStartSlow is same as `PodStart`, but longer. + // Use it in a case-by-case basis, mostly when you are sure pod start will take longer than usual. + PodStartSlow time.Duration + + // PodDelete is how long to wait for the pod to be deleted. + PodDelete time.Duration + + // ClaimProvision is how long claims have to become dynamically provisioned. + ClaimProvision time.Duration + + // ClaimProvisionShort is the same as `ClaimProvision`, but shorter. + ClaimProvisionShort time.Duration + + // ClaimBound is how long claims have to become bound. + ClaimBound time.Duration + + // PVReclaim is how long PVs have to become reclaimed. + PVReclaim time.Duration + + // PVBound is how long PVs have to become bound. + PVBound time.Duration + + // PVDelete is how long PVs have to become deleted. + PVDelete time.Duration + + // PVDeleteSlow is the same as PVDelete, but slower. + PVDeleteSlow time.Duration + + // SnapshotCreate is how long for snapshot to create snapshotContent. + SnapshotCreate time.Duration + + // SnapshotDelete is how long for snapshot to delete snapshotContent. + SnapshotDelete time.Duration +} + +// NewTimeoutContextWithDefaults returns a TimeoutContext with default values. +func NewTimeoutContextWithDefaults() *TimeoutContext { + return &TimeoutContext{ + PodStart: podStartTimeout, + PodStartShort: podStartShortTimeout, + PodStartSlow: podStartSlowTimeout, + PodDelete: podDeleteTimeout, + ClaimProvision: claimProvisionTimeout, + ClaimProvisionShort: claimProvisionShortTimeout, + ClaimBound: claimBoundTimeout, + PVReclaim: pvReclaimTimeout, + PVBound: pvBoundTimeout, + PVDelete: pvDeleteTimeout, + PVDeleteSlow: pvDeleteSlowTimeout, + SnapshotCreate: snapshotCreateTimeout, + SnapshotDelete: snapshotDeleteTimeout, + } +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/util.go b/vendor/k8s.io/kubernetes/test/e2e/framework/util.go index 1d97e92e10bc..8ddab99241a2 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/util.go +++ b/vendor/k8s.io/kubernetes/test/e2e/framework/util.go @@ -71,9 +71,23 @@ import ( e2epod "k8s.io/kubernetes/test/e2e/framework/pod" ) +const ( + // Minimal number of nodes for the cluster to be considered large. + largeClusterThreshold = 100 + + // TODO(justinsb): Avoid hardcoding this. + awsMasterIP = "172.20.0.9" + + // AllContainers specifies that all containers be visited + // Copied from pkg/api/v1/pod to avoid pulling extra dependencies + AllContainers = InitContainers | Containers | EphemeralContainers +) + +// DEPRECATED constants. Use the timeouts in framework.Framework instead. const ( // PodListTimeout is how long to wait for the pod to be listable. PodListTimeout = time.Minute + // PodStartTimeout is how long to wait for the pod to be started. PodStartTimeout = 5 * time.Minute @@ -136,16 +150,6 @@ const ( // SnapshotDeleteTimeout is how long for snapshot to delete snapshotContent. SnapshotDeleteTimeout = 5 * time.Minute - - // Minimal number of nodes for the cluster to be considered large. - largeClusterThreshold = 100 - - // TODO(justinsb): Avoid hardcoding this. - awsMasterIP = "172.20.0.9" - - // AllContainers specifies that all containers be visited - // Copied from pkg/api/v1/pod to avoid pulling extra dependencies - AllContainers = InitContainers | Containers | EphemeralContainers ) var ( @@ -818,7 +822,7 @@ func (f *Framework) MatchContainerOutput( }() // Wait for client pod to complete. - podErr := e2epod.WaitForPodSuccessInNamespace(f.ClientSet, createdPod.Name, ns) + podErr := e2epod.WaitForPodSuccessInNamespaceTimeout(f.ClientSet, createdPod.Name, ns, f.Timeouts.PodStart) // Grab its logs. Get host first. podStatus, err := podClient.Get(context.TODO(), createdPod.Name, metav1.GetOptions{}) @@ -1018,7 +1022,7 @@ func getNodeEvents(c clientset.Interface, nodeName string) []v1.Event { } // WaitForAllNodesSchedulable waits up to timeout for all -// (but TestContext.AllowedNotReadyNodes) to become scheduable. +// (but TestContext.AllowedNotReadyNodes) to become schedulable. func WaitForAllNodesSchedulable(c clientset.Interface, timeout time.Duration) error { if TestContext.AllowedNotReadyNodes == -1 { return nil @@ -1238,20 +1242,23 @@ func RunCmdEnv(env []string, command string, args ...string) (string, string, er return stdout, stderr, nil } -// getMasterAddresses returns the externalIP, internalIP and hostname fields of the master. -// If any of these is unavailable, it is set to "". -func getMasterAddresses(c clientset.Interface) (string, string, string) { - var externalIP, internalIP, hostname string +// getControlPlaneAddresses returns the externalIP, internalIP and hostname fields of control plane nodes. +// If any of these is unavailable, empty slices are returned. +func getControlPlaneAddresses(c clientset.Interface) ([]string, []string, []string) { + var externalIPs, internalIPs, hostnames []string - // Populate the internal IP. + // Populate the internal IPs. eps, err := c.CoreV1().Endpoints(metav1.NamespaceDefault).Get(context.TODO(), "kubernetes", metav1.GetOptions{}) if err != nil { Failf("Failed to get kubernetes endpoints: %v", err) } - if len(eps.Subsets) != 1 || len(eps.Subsets[0].Addresses) != 1 { - Failf("There are more than 1 endpoints for kubernetes service: %+v", eps) + for _, subset := range eps.Subsets { + for _, address := range subset.Addresses { + if address.IP != "" { + internalIPs = append(internalIPs, address.IP) + } + } } - internalIP = eps.Subsets[0].Addresses[0].IP // Populate the external IP/hostname. hostURL, err := url.Parse(TestContext.Host) @@ -1259,12 +1266,12 @@ func getMasterAddresses(c clientset.Interface) (string, string, string) { Failf("Failed to parse hostname: %v", err) } if net.ParseIP(hostURL.Host) != nil { - externalIP = hostURL.Host + externalIPs = append(externalIPs, hostURL.Host) } else { - hostname = hostURL.Host + hostnames = append(hostnames, hostURL.Host) } - return externalIP, internalIP, hostname + return externalIPs, internalIPs, hostnames } // GetControlPlaneAddresses returns all IP addresses on which the kubelet can reach the control plane. @@ -1272,16 +1279,16 @@ func getMasterAddresses(c clientset.Interface) (string, string, string) { // e.g. internal IPs to be used (issue #56787), so that we can be // sure to block the control plane fully during tests. func GetControlPlaneAddresses(c clientset.Interface) []string { - externalIP, internalIP, _ := getMasterAddresses(c) + externalIPs, internalIPs, _ := getControlPlaneAddresses(c) ips := sets.NewString() switch TestContext.Provider { case "gce", "gke": - if externalIP != "" { - ips.Insert(externalIP) + for _, ip := range externalIPs { + ips.Insert(ip) } - if internalIP != "" { - ips.Insert(internalIP) + for _, ip := range internalIPs { + ips.Insert(ip) } case "aws": ips.Insert(awsMasterIP) diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/volume/BUILD b/vendor/k8s.io/kubernetes/test/e2e/framework/volume/BUILD deleted file mode 100644 index 171c9d61ed61..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/volume/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["fixtures.go"], - importpath = "k8s.io/kubernetes/test/e2e/framework/volume", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//test/e2e/framework:go_default_library", - "//test/e2e/framework/pod:go_default_library", - "//test/e2e/storage/utils:go_default_library", - "//test/utils/image:go_default_library", - "//vendor/github.com/onsi/ginkgo:go_default_library", - "//vendor/github.com/onsi/gomega:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/volume/fixtures.go b/vendor/k8s.io/kubernetes/test/e2e/framework/volume/fixtures.go index cb27ac9874b6..36898dda79c9 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/volume/fixtures.go +++ b/vendor/k8s.io/kubernetes/test/e2e/framework/volume/fixtures.go @@ -52,10 +52,11 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" clientset "k8s.io/client-go/kubernetes" + clientexec "k8s.io/client-go/util/exec" "k8s.io/kubernetes/test/e2e/framework" e2epod "k8s.io/kubernetes/test/e2e/framework/pod" - "k8s.io/kubernetes/test/e2e/storage/utils" imageutils "k8s.io/kubernetes/test/utils/image" + uexec "k8s.io/utils/exec" "github.com/onsi/ginkgo" "github.com/onsi/gomega" @@ -362,7 +363,7 @@ func TestServerCleanup(f *framework.Framework, config TestConfig) { gomega.Expect(err).To(gomega.BeNil(), "Failed to delete pod %v in namespace %v", config.Prefix+"-server", config.Namespace) } -func runVolumeTesterPod(client clientset.Interface, config TestConfig, podSuffix string, privileged bool, fsGroup *int64, tests []Test, slow bool) (*v1.Pod, error) { +func runVolumeTesterPod(client clientset.Interface, timeouts *framework.TimeoutContext, config TestConfig, podSuffix string, privileged bool, fsGroup *int64, tests []Test, slow bool) (*v1.Pod, error) { ginkgo.By(fmt.Sprint("starting ", config.Prefix, "-", podSuffix)) var gracePeriod int64 = 1 var command string @@ -388,17 +389,17 @@ func runVolumeTesterPod(client clientset.Interface, config TestConfig, podSuffix Containers: []v1.Container{ { Name: config.Prefix + "-" + podSuffix, - Image: GetDefaultTestImage(), + Image: e2epod.GetDefaultTestImage(), WorkingDir: "/opt", // An imperative and easily debuggable container which reads/writes vol contents for // us to scan in the tests or by eye. // We expect that /opt is empty in the minimal containers which we use in this test. - Command: GenerateScriptCmd(command), + Command: e2epod.GenerateScriptCmd(command), VolumeMounts: []v1.VolumeMount{}, }, }, TerminationGracePeriodSeconds: &gracePeriod, - SecurityContext: GeneratePodSecurityContext(fsGroup, seLinuxOptions), + SecurityContext: e2epod.GeneratePodSecurityContext(fsGroup, seLinuxOptions), Volumes: []v1.Volume{}, }, } @@ -415,7 +416,7 @@ func runVolumeTesterPod(client clientset.Interface, config TestConfig, podSuffix if privileged && test.Mode == v1.PersistentVolumeBlock { privileged = false } - clientPod.Spec.Containers[0].SecurityContext = GenerateSecurityContext(privileged) + clientPod.Spec.Containers[0].SecurityContext = e2epod.GenerateContainerSecurityContext(privileged) if test.Mode == v1.PersistentVolumeBlock { clientPod.Spec.Containers[0].VolumeDevices = append(clientPod.Spec.Containers[0].VolumeDevices, v1.VolumeDevice{ @@ -439,13 +440,13 @@ func runVolumeTesterPod(client clientset.Interface, config TestConfig, podSuffix return nil, err } if slow { - err = e2epod.WaitForPodRunningInNamespaceSlow(client, clientPod.Name, clientPod.Namespace) + err = e2epod.WaitTimeoutForPodRunningInNamespace(client, clientPod.Name, clientPod.Namespace, timeouts.PodStartSlow) } else { - err = e2epod.WaitForPodRunningInNamespace(client, clientPod) + err = e2epod.WaitTimeoutForPodRunningInNamespace(client, clientPod.Name, clientPod.Namespace, timeouts.PodStart) } if err != nil { e2epod.DeletePodOrFail(client, clientPod.Namespace, clientPod.Name) - e2epod.WaitForPodToDisappear(client, clientPod.Namespace, clientPod.Name, labels.Everything(), framework.Poll, framework.PodDeleteTimeout) + e2epod.WaitForPodToDisappear(client, clientPod.Namespace, clientPod.Name, labels.Everything(), framework.Poll, timeouts.PodDelete) return nil, err } return clientPod, nil @@ -462,7 +463,7 @@ func testVolumeContent(f *framework.Framework, pod *v1.Pod, fsGroup *int64, fsTy framework.ExpectNoError(err, "failed: finding the contents of the block device %s.", deviceName) // Check that it's a real block device - utils.CheckVolumeModeOfPath(f, pod, test.Mode, deviceName) + CheckVolumeModeOfPath(f, pod, test.Mode, deviceName) } else { // Filesystem: check content fileName := fmt.Sprintf("/opt/%d/%s", i, test.File) @@ -472,7 +473,7 @@ func testVolumeContent(f *framework.Framework, pod *v1.Pod, fsGroup *int64, fsTy // Check that a directory has been mounted dirName := filepath.Dir(fileName) - utils.CheckVolumeModeOfPath(f, pod, test.Mode, dirName) + CheckVolumeModeOfPath(f, pod, test.Mode, dirName) if !framework.NodeOSDistroIs("windows") { // Filesystem: check fsgroup @@ -514,13 +515,14 @@ func TestVolumeClientSlow(f *framework.Framework, config TestConfig, fsGroup *in } func testVolumeClient(f *framework.Framework, config TestConfig, fsGroup *int64, fsType string, tests []Test, slow bool) { - clientPod, err := runVolumeTesterPod(f.ClientSet, config, "client", false, fsGroup, tests, slow) + timeouts := f.Timeouts + clientPod, err := runVolumeTesterPod(f.ClientSet, timeouts, config, "client", false, fsGroup, tests, slow) if err != nil { framework.Failf("Failed to create client pod: %v", err) } defer func() { e2epod.DeletePodOrFail(f.ClientSet, clientPod.Namespace, clientPod.Name) - e2epod.WaitForPodToDisappear(f.ClientSet, clientPod.Namespace, clientPod.Name, labels.Everything(), framework.Poll, framework.PodDeleteTimeout) + e2epod.WaitForPodToDisappear(f.ClientSet, clientPod.Namespace, clientPod.Name, labels.Everything(), framework.Poll, timeouts.PodDelete) }() testVolumeContent(f, clientPod, fsGroup, fsType, tests) @@ -531,17 +533,18 @@ func testVolumeClient(f *framework.Framework, config TestConfig, fsGroup *int64, // The volume must be writable. func InjectContent(f *framework.Framework, config TestConfig, fsGroup *int64, fsType string, tests []Test) { privileged := true + timeouts := f.Timeouts if framework.NodeOSDistroIs("windows") { privileged = false } - injectorPod, err := runVolumeTesterPod(f.ClientSet, config, "injector", privileged, fsGroup, tests, false /*slow*/) + injectorPod, err := runVolumeTesterPod(f.ClientSet, timeouts, config, "injector", privileged, fsGroup, tests, false /*slow*/) if err != nil { framework.Failf("Failed to create injector pod: %v", err) return } defer func() { e2epod.DeletePodOrFail(f.ClientSet, injectorPod.Namespace, injectorPod.Name) - e2epod.WaitForPodToDisappear(f.ClientSet, injectorPod.Namespace, injectorPod.Name, labels.Everything(), framework.Poll, framework.PodDeleteTimeout) + e2epod.WaitForPodToDisappear(f.ClientSet, injectorPod.Namespace, injectorPod.Name, labels.Everything(), framework.Poll, timeouts.PodDelete) }() ginkgo.By("Writing text file contents in the container.") @@ -566,18 +569,6 @@ func InjectContent(f *framework.Framework, config TestConfig, fsGroup *int64, fs testVolumeContent(f, injectorPod, fsGroup, fsType, tests) } -// GenerateScriptCmd generates the corresponding command lines to execute a command. -// Depending on the Node OS is Windows or linux, the command will use powershell or /bin/sh -func GenerateScriptCmd(command string) []string { - var commands []string - if !framework.NodeOSDistroIs("windows") { - commands = []string{"/bin/sh", "-c", command} - } else { - commands = []string{"powershell", "/c", command} - } - return commands -} - // generateWriteCmd is used by generateWriteBlockCmd and generateWriteFileCmd func generateWriteCmd(content, path string) []string { var commands []string @@ -626,73 +617,69 @@ func generateWriteFileCmd(content, fullPath string) []string { return generateWriteCmd(content, fullPath) } -// GenerateSecurityContext generates the corresponding container security context with the given inputs -// If the Node OS is windows, currently we will ignore the inputs and return nil. -// TODO: Will modify it after windows has its own security context -func GenerateSecurityContext(privileged bool) *v1.SecurityContext { - if framework.NodeOSDistroIs("windows") { - return nil - } - return &v1.SecurityContext{ - Privileged: &privileged, - } -} +// CheckVolumeModeOfPath check mode of volume +func CheckVolumeModeOfPath(f *framework.Framework, pod *v1.Pod, volMode v1.PersistentVolumeMode, path string) { + if volMode == v1.PersistentVolumeBlock { + // Check if block exists + VerifyExecInPodSucceed(f, pod, fmt.Sprintf("test -b %s", path)) -// GeneratePodSecurityContext generates the corresponding pod security context with the given inputs -// If the Node OS is windows, currently we will ignore the inputs and return nil. -// TODO: Will modify it after windows has its own security context -func GeneratePodSecurityContext(fsGroup *int64, seLinuxOptions *v1.SELinuxOptions) *v1.PodSecurityContext { - if framework.NodeOSDistroIs("windows") { - return nil - } - return &v1.PodSecurityContext{ - SELinuxOptions: seLinuxOptions, - FSGroup: fsGroup, - } -} + // Double check that it's not directory + VerifyExecInPodFail(f, pod, fmt.Sprintf("test -d %s", path), 1) + } else { + // Check if directory exists + VerifyExecInPodSucceed(f, pod, fmt.Sprintf("test -d %s", path)) -// GetTestImage returns the image name with the given input -// If the Node OS is windows, currently we return Agnhost image for Windows node -// due to the issue of #https://github.com/kubernetes-sigs/windows-testing/pull/35. -func GetTestImage(id int) string { - if framework.NodeOSDistroIs("windows") { - return imageutils.GetE2EImage(imageutils.Agnhost) + // Double check that it's not block + VerifyExecInPodFail(f, pod, fmt.Sprintf("test -b %s", path), 1) } - return imageutils.GetE2EImage(id) } -// GetTestImageID returns the image id with the given input -// If the Node OS is windows, currently we return Agnhost image for Windows node -// due to the issue of #https://github.com/kubernetes-sigs/windows-testing/pull/35. -func GetTestImageID(id int) int { +// PodExec runs f.ExecCommandInContainerWithFullOutput to execute a shell cmd in target pod +// TODO: put this under e2epod once https://github.com/kubernetes/kubernetes/issues/81245 +// is resolved. Otherwise there will be dependency issue. +func PodExec(f *framework.Framework, pod *v1.Pod, shExec string) (string, string, error) { if framework.NodeOSDistroIs("windows") { - return imageutils.Agnhost + return f.ExecCommandInContainerWithFullOutput(pod.Name, pod.Spec.Containers[0].Name, "powershell", "/c", shExec) } - return id + return f.ExecCommandInContainerWithFullOutput(pod.Name, pod.Spec.Containers[0].Name, "/bin/sh", "-c", shExec) } -// GetDefaultTestImage returns the default test image based on OS. -// If the node OS is windows, currently we return Agnhost image for Windows node -// due to the issue of #https://github.com/kubernetes-sigs/windows-testing/pull/35. -// If the node OS is linux, return busybox image -func GetDefaultTestImage() string { - return imageutils.GetE2EImage(GetDefaultTestImageID()) -} +// VerifyExecInPodSucceed verifies shell cmd in target pod succeed +// TODO: put this under e2epod once https://github.com/kubernetes/kubernetes/issues/81245 +// is resolved. Otherwise there will be dependency issue. +func VerifyExecInPodSucceed(f *framework.Framework, pod *v1.Pod, shExec string) { + stdout, stderr, err := PodExec(f, pod, shExec) + if err != nil { -// GetDefaultTestImageID returns the default test image id based on OS. -// If the node OS is windows, currently we return Agnhost image for Windows node -// due to the issue of #https://github.com/kubernetes-sigs/windows-testing/pull/35. -// If the node OS is linux, return busybox image -func GetDefaultTestImageID() int { - return GetTestImageID(imageutils.BusyBox) + if exiterr, ok := err.(uexec.CodeExitError); ok { + exitCode := exiterr.ExitStatus() + framework.ExpectNoError(err, + "%q should succeed, but failed with exit code %d and error message %q\nstdout: %s\nstderr: %s", + shExec, exitCode, exiterr, stdout, stderr) + } else { + framework.ExpectNoError(err, + "%q should succeed, but failed with error message %q\nstdout: %s\nstderr: %s", + shExec, err, stdout, stderr) + } + } } -// GetLinuxLabel returns the default SELinuxLabel based on OS. -// If the node OS is windows, it will return nil -func GetLinuxLabel() *v1.SELinuxOptions { - if framework.NodeOSDistroIs("windows") { - return nil +// VerifyExecInPodFail verifies shell cmd in target pod fail with certain exit code +// TODO: put this under e2epod once https://github.com/kubernetes/kubernetes/issues/81245 +// is resolved. Otherwise there will be dependency issue. +func VerifyExecInPodFail(f *framework.Framework, pod *v1.Pod, shExec string, exitCode int) { + stdout, stderr, err := PodExec(f, pod, shExec) + if err != nil { + if exiterr, ok := err.(clientexec.ExitError); ok { + actualExitCode := exiterr.ExitStatus() + framework.ExpectEqual(actualExitCode, exitCode, + "%q should fail with exit code %d, but failed with exit code %d and error message %q\nstdout: %s\nstderr: %s", + shExec, exitCode, actualExitCode, exiterr, stdout, stderr) + } else { + framework.ExpectNoError(err, + "%q should fail with exit code %d, but failed with error message %q\nstdout: %s\nstderr: %s", + shExec, exitCode, err, stdout, stderr) + } } - return &v1.SELinuxOptions{ - Level: "s0:c0,c1"} + framework.ExpectError(err, "%q should fail with exit code %d, but exit without error", shExec, exitCode) } diff --git a/vendor/k8s.io/kubernetes/test/e2e/framework/websocket/BUILD b/vendor/k8s.io/kubernetes/test/e2e/framework/websocket/BUILD deleted file mode 100644 index b407300dc6c8..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/framework/websocket/BUILD +++ /dev/null @@ -1,26 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["websocket_util.go"], - importpath = "k8s.io/kubernetes/test/e2e/framework/websocket", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//vendor/golang.org/x/net/websocket:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/generated/BUILD b/vendor/k8s.io/kubernetes/test/e2e/generated/BUILD deleted file mode 100644 index d95bb106760b..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/generated/BUILD +++ /dev/null @@ -1,48 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) -load("//build:bindata.bzl", "go_bindata") - -go_library( - name = "go_default_library", - srcs = [ - "bindata.go", - "gobindata_util.go", - "main.go", - ], - importpath = "k8s.io/kubernetes/test/e2e/generated", - deps = [ - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -# IMPORTANT: if you make any changes here, you must also update hack/generate-bindata.sh. -go_bindata( - name = "bindata", - srcs = [ - "//test/conformance/testdata:all-srcs", - "//test/e2e/testing-manifests:all-srcs", - "//test/e2e_node/testing-manifests:all-srcs", - "//test/fixtures:all-srcs", - "//test/images:all-srcs", - ], - outs = ["bindata.go"], - compress = True, - include_metadata = False, -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/generated/bindata.go b/vendor/k8s.io/kubernetes/test/e2e/generated/bindata.go index 1fedf34aef63..e4ac441b536f 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/generated/bindata.go +++ b/vendor/k8s.io/kubernetes/test/e2e/generated/bindata.go @@ -2,6 +2,7 @@ // sources: // test/conformance/testdata/OWNERS // test/conformance/testdata/conformance.yaml +// test/conformance/testdata/ineligible_endpoints.yaml // test/e2e/testing-manifests/flexvolume/attachable-with-long-mount // test/e2e/testing-manifests/flexvolume/dummy // test/e2e/testing-manifests/flexvolume/dummy-attachable @@ -112,6 +113,7 @@ // test/e2e/testing-manifests/storage-csi/mock/csi-mock-driver-snapshotter.yaml // test/e2e/testing-manifests/storage-csi/mock/csi-mock-driver.yaml // test/e2e/testing-manifests/storage-csi/mock/csi-mock-driverinfo.yaml +// test/e2e/testing-manifests/storage-csi/mock/csi-mock-proxy.yaml // test/e2e/testing-manifests/storage-csi/mock/csi-mock-rbac.yaml // test/e2e/testing-manifests/storage-csi/mock/csi-storageclass.yaml // test/e2e_node/testing-manifests/sriovdp-cm.yaml @@ -188,6 +190,7 @@ // test/images/apparmor-loader/example-pod.yaml // test/images/apparmor-loader/loader.go // test/images/busybox/BASEIMAGE +// test/images/busybox/Dockerfile // test/images/busybox/Dockerfile_windows // test/images/busybox/Makefile // test/images/busybox/OWNERS @@ -207,6 +210,22 @@ // test/images/echoserver/nginx.conf // test/images/echoserver/run.sh // test/images/echoserver/template.lua +// test/images/glusterdynamic-provisioner/BASEIMAGE +// test/images/glusterdynamic-provisioner/Dockerfile +// test/images/glusterdynamic-provisioner/VERSION +// test/images/httpd/BASEIMAGE +// test/images/httpd/Dockerfile +// test/images/httpd/Dockerfile_windows +// test/images/httpd/VERSION +// test/images/httpd/httpd.conf +// test/images/httpd/index.html +// test/images/httpd-new/ALIAS +// test/images/httpd-new/BASEIMAGE +// test/images/httpd-new/Dockerfile +// test/images/httpd-new/Dockerfile_windows +// test/images/httpd-new/VERSION +// test/images/httpd-new/httpd.conf +// test/images/httpd-new/index.html // test/images/image-util.sh // test/images/ipc-utils/BASEIMAGE // test/images/ipc-utils/Dockerfile @@ -232,6 +251,15 @@ // test/images/nautilus/OWNERS // test/images/nautilus/VERSION // test/images/nautilus/html/data.json +// test/images/nginx/BASEIMAGE +// test/images/nginx/Dockerfile +// test/images/nginx/Dockerfile_windows +// test/images/nginx/VERSION +// test/images/nginx-new/ALIAS +// test/images/nginx-new/BASEIMAGE +// test/images/nginx-new/Dockerfile +// test/images/nginx-new/Dockerfile_windows +// test/images/nginx-new/VERSION // test/images/node-perf/npb-ep/BASEIMAGE // test/images/node-perf/npb-ep/Dockerfile // test/images/node-perf/npb-ep/VERSION @@ -253,6 +281,9 @@ // test/images/nonroot/Dockerfile_windows // test/images/nonroot/OWNERS // test/images/nonroot/VERSION +// test/images/perl/BASEIMAGE +// test/images/perl/Dockerfile +// test/images/perl/VERSION // test/images/pets/peer-finder/BASEIMAGE // test/images/pets/peer-finder/Dockerfile // test/images/pets/peer-finder/Makefile @@ -277,6 +308,7 @@ // test/images/redis/VERSION // test/images/redis/redis.conf // test/images/regression-issue-74839/.gitignore +// test/images/regression-issue-74839/BASEIMAGE // test/images/regression-issue-74839/Dockerfile // test/images/regression-issue-74839/Makefile // test/images/regression-issue-74839/OWNERS @@ -287,13 +319,18 @@ // test/images/resource-consumer/.gitignore // test/images/resource-consumer/BASEIMAGE // test/images/resource-consumer/Dockerfile +// test/images/resource-consumer/Dockerfile_windows // test/images/resource-consumer/Makefile // test/images/resource-consumer/VERSION // test/images/resource-consumer/common/common.go +// test/images/resource-consumer/consume-cpu/common.go // test/images/resource-consumer/consume-cpu/consume_cpu.go +// test/images/resource-consumer/consume-cpu/consume_cpu_windows.go // test/images/resource-consumer/resource_consumer.go // test/images/resource-consumer/resource_consumer_handler.go // test/images/resource-consumer/utils.go +// test/images/resource-consumer/utils_common.go +// test/images/resource-consumer/utils_windows.go // test/images/sample-apiserver/BASEIMAGE // test/images/sample-apiserver/Dockerfile // test/images/sample-apiserver/Dockerfile_windows @@ -334,9 +371,8 @@ // test/images/volume/rbd/mon.sh // test/images/volume/rbd/osd.sh // test/images/windows/Makefile -// test/images/windows/busybox-helper/Dockerfile -// test/images/windows/busybox-helper/VERSION // test/images/windows/powershell-helper/Dockerfile +// test/images/windows/powershell-helper/Dockerfile_windows // test/images/windows/powershell-helper/VERSION // test/images/windows-servercore-cache/BASEIMAGE // test/images/windows-servercore-cache/Dockerfile @@ -481,7 +517,7 @@ func testConformanceTestdataOwners() (*asset, error) { return a, nil } -var _testConformanceTestdataConformanceYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\x5b\x73\x1c\x37\x92\x28\xfc\xbe\xbf\x02\xe1\x17\x8e\x4f\x34\x5b\x94\x7c\x1d\xcf\xe7\x2f\x42\xa6\x64\x8f\x76\x6d\x89\x23\xca\xf6\x83\xd7\xa1\x83\xae\x42\xb3\x31\xac\x2e\xd4\x14\x50\xa4\x7a\x4f\x9c\xff\x7e\x02\x99\x89\x5b\x5d\xba\xab\xaf\xa4\x3c\xde\x9d\x98\x11\xbb\xaa\x12\x89\xcc\x44\x22\x91\xc8\xcb\x39\x33\x42\x9b\x92\x2f\xc5\x37\xec\x4a\xe5\xec\x47\x39\x17\xd9\x2a\x2b\xc4\x84\x55\x4a\x1b\xa6\x0d\xaf\x0d\x13\x1f\x44\xc6\x16\x4a\xdd\xfe\x07\x63\x99\xca\x05\xbe\x7f\xf6\xdb\xed\xd7\x7a\x2a\xd5\xef\xec\x52\x95\x86\xcb\x52\xd4\xe1\x7b\xf6\x77\xa5\x6e\xd9\xfd\x42\x94\x2c\xab\x05\x37\x82\x71\x56\xa9\x9c\xdd\x4b\xb3\x60\x85\x7f\x8b\x80\x32\xa6\x17\xaa\x29\x72\x18\xa9\x31\x02\x06\x6f\x8d\xcd\xaa\x5a\x55\xa2\x2e\x56\xec\xb7\xd7\x2a\x17\x97\xaa\x9c\xab\x7a\xc9\xcb\x4c\xfc\xce\x7e\x8b\xff\x3a\xfb\x0f\xc6\x72\xa1\xb3\x5a\x56\x46\xaa\xf2\x1b\xf6\xab\xc5\x82\xc7\x13\x5a\xf0\x32\x2f\x44\xcd\xa4\x66\xba\x12\x99\x9c\x4b\x91\x33\x59\x32\xb3\x10\x2c\xf3\x93\x09\x68\x36\x5a\x96\x37\x80\x27\x67\x67\x2f\x3f\x88\xec\x8c\xf1\xcc\x02\x9f\xd8\x4f\xf0\x3b\x07\xf3\xa7\x9f\xaf\xdf\xb1\x99\x60\xb2\xbc\x53\xb7\x22\x67\x7c\x6e\x44\x0d\x6f\xe0\xd8\x6a\x9e\x0e\x33\x05\xb8\xcf\x99\x16\xf5\x9d\xa8\x81\x48\x52\x13\xd1\x72\x66\x16\xdc\xb0\x7b\x59\x14\xf8\x9c\x2d\x8c\xa9\x58\x2d\xfe\xd5\x08\x6d\xf4\x24\xd0\x56\x8b\x4c\x95\xb9\x27\x31\xe1\xda\x37\x17\x9c\xf0\x4a\x96\x37\x29\x4d\x60\x24\x44\x5a\x23\xba\x01\xa1\x30\x7f\x3b\xf9\xe7\x30\x75\x66\x14\xbb\xe3\x85\xcc\x2d\x02\xf0\xb1\xfd\x28\x02\x28\xb5\x63\x67\x6e\xe7\x58\x8b\x42\x70\x2d\xbe\x61\x77\x4f\xa7\x7f\xfd\x0f\xc6\xe6\xb2\x10\xdf\x80\xf8\x3d\x11\xcf\xc4\x93\x4c\x2d\x97\xaa\x7c\xe2\xf1\x7c\x6f\x79\x3e\xbd\x51\xff\x31\x4e\x44\x81\x2e\x0f\x24\xa2\x7e\xec\xc7\x22\xa2\x7f\x37\xa6\xfa\x41\x98\x7f\x2f\x19\x8d\xc4\x11\x20\x3f\x90\x48\xd6\x42\x1b\x55\x3d\x84\xca\x6c\x8f\xbc\xbf\x34\xd6\xe2\x1c\x40\x9e\x52\x5d\xce\xc4\x5c\xd5\xa2\x05\x5a\x6a\x66\x44\xbd\x94\x25\x27\xce\x3d\x9c\x30\x3a\x9a\x1c\x48\x5d\x3a\x70\xa7\x93\xcc\x07\xd0\x94\xed\x91\x1f\x89\x64\x92\x9a\xfc\x37\x13\xce\x61\x3d\x79\x44\x59\x0c\x42\xf5\xb6\x29\x8d\x5c\x8a\x09\x7b\x47\x34\x93\xaa\xfc\x49\x68\xcd\x6f\xc4\x84\xcd\x6b\xb5\x64\x85\xba\x61\xaa\x31\x55\x03\xfb\x90\x6e\xb2\x4c\x88\xdc\x4e\xd0\xcf\x7f\xa3\xe4\xd2\x20\x6c\x56\xf0\xec\x76\xa6\x3e\x00\x26\xcc\x2e\x42\xcf\xa8\x88\x9a\x28\xae\x40\x8c\x5a\x54\xca\xee\x33\x01\x37\xb6\x44\xe4\xd8\x6f\x3f\xca\xb2\xf9\xf0\xa6\x2c\x56\xbf\x33\xae\x99\x58\x56\x66\x85\x6b\xc2\x52\x95\xd0\xd4\x8c\x97\x79\xcf\xd4\xae\x54\x21\xb3\x15\x0c\xf1\x3d\x2f\x8a\x19\xcf\x6e\xdf\xa9\x1f\xd5\x8d\x7e\x53\xbe\xac\x6b\x85\x02\x2c\xcc\xd6\xeb\xe1\xec\xb2\xb3\x1e\x79\x19\xed\xdb\x81\x26\x67\x67\xda\x51\x55\x6a\x56\x8b\x4c\xd5\x39\xac\x15\x40\xca\xd2\xdc\x62\x1e\x88\x22\x3e\x48\xa3\x71\x5a\x5a\xcf\x9b\xa2\x58\x01\x78\xd5\x18\x3b\x82\xb0\x48\x4f\x71\x39\x0e\xac\x84\x09\x4a\x57\x87\x14\xb8\xa8\x16\xfc\x4e\xb0\x52\xc1\xc7\xa2\x34\x96\xa2\x11\x43\x90\x98\xd3\x98\xe6\xdf\xb0\x4b\x5e\x96\xca\x00\xd4\xa5\x6a\x4a\x03\x82\xa8\xed\x6a\xff\x55\x96\xb9\xba\xd7\x61\xb2\x7a\x7a\xd6\x12\xdc\xa7\x5f\x0c\x4a\x6e\x8d\xc2\xb2\x8f\xc8\x5a\xc0\x8f\x56\x58\x03\x86\x7f\x14\x69\xe5\x38\x1d\x8b\x7c\xaa\x8a\x77\x13\xda\x44\x50\x45\x3e\x19\x14\xda\x25\x37\xd9\x02\xf1\x76\xe3\x5a\xd9\xf5\x04\x4e\x05\x16\xc0\xa2\xd0\x3e\x3a\x81\xf5\xd3\x3f\xd3\xa9\xbe\x05\xa4\xe7\x5c\x16\x8f\x50\x86\x23\x44\xe5\xfc\x23\x14\xdb\x21\x25\xeb\x20\x8e\x51\xaa\x31\xa5\x50\x15\x76\x05\xd4\xca\xa6\xf8\x50\x89\xcc\x52\x9d\xd0\xf1\xb8\xb4\xd8\x8f\xfc\xff\x08\x04\xf7\x8a\x9b\xc5\x84\x95\xaa\x3c\xaf\x95\x32\xac\xd1\xa2\x06\x62\xda\x5f\x72\x31\xe7\x4d\x81\x5b\x43\xc5\xc1\x5e\x7a\x58\x71\xed\x17\x4f\x6e\x16\x4e\x04\xb9\xf6\x53\x01\xb8\x7e\x3a\xdc\x30\x1e\xcf\x09\xe6\x73\x10\x89\x8d\x26\x64\x14\xab\x9b\x92\x49\xc0\x83\xb7\x88\x8a\x6f\x03\x56\x59\xa3\x8d\x5a\x0e\x4d\x45\x0b\x33\x85\x43\x46\x2d\x72\x59\x8b\xcc\xa0\xa9\x49\x02\x67\x14\x19\x95\xea\x4e\x5a\xb9\x23\xbe\xb0\x44\x3b\x93\xb0\xaf\xb1\xa7\xc1\x28\xef\xa5\x77\x10\x78\x32\x63\xbb\x42\x5f\xa8\x9b\x9b\x70\x1e\xf0\xa8\xd0\xb4\x2c\x46\x2d\x13\xe3\x1d\x87\x0f\xfc\x4f\x00\x39\x6f\x84\x9d\x4d\xa3\x61\x8b\x3f\x3b\x6b\x64\x7e\x76\x06\xcc\x6a\x4a\x3e\x2b\xe0\xe1\x03\x2d\x93\xb7\x02\xfd\x1a\xa8\xf9\x26\xc0\x8d\xab\x05\xd7\x42\xef\xb8\x04\xc0\x42\x00\x98\x78\xa2\x88\x64\x66\xc1\x51\x54\x69\x8f\xc5\x23\x9e\x15\x23\xbf\x1f\x7a\xf2\x6b\xc3\x4d\xa3\xb7\x96\xda\x57\xe8\x75\xaa\x69\x52\x15\x4c\xca\xad\x18\xa3\xd8\xd9\xf3\xe2\x9e\xaf\xf4\x19\xce\xd3\x9d\xcd\xe8\x75\x91\x03\xf2\x9d\xbd\xfc\xd5\xbc\x07\xe0\xd9\x9b\xf2\x7b\x2e\x8b\xa6\x16\x2d\x60\x0e\x94\x2a\x8b\x95\x5d\xc5\xd2\x74\xed\x03\x9c\xb0\x5d\x34\xff\x23\x6a\x05\xf4\x00\x5a\x4f\x87\x27\x70\xf6\x5a\xdc\x89\x3a\x1a\x0b\x40\x96\xf6\xc7\x64\x0a\x53\xf6\xbc\x28\x2c\x0c\x6d\x0f\x99\xb5\x10\xc8\x95\xcc\x72\x14\x71\xbc\x13\xb5\x9c\xaf\x92\x61\x32\x2b\x7b\x88\x24\xcf\xac\x96\x97\xe5\x4d\xb1\x6a\x9f\xdc\x9e\x7e\xb6\xad\xbc\xbd\x50\xd9\xad\xa8\x83\x08\xe8\x09\xe9\x86\xfa\xa6\x59\x0a\x1c\xb2\x4f\xc6\xe8\xbb\x20\xfb\x4e\x58\x66\x82\xb9\xf5\xa2\xee\x44\x5d\xcb\x1c\x8f\xd2\x72\xc9\x6f\x84\xdd\x89\x62\x3d\xee\x47\x61\x7f\xc9\x09\x91\x65\xfe\xe9\xd6\x32\xf5\x82\xd4\xa8\x9d\x2a\xe8\xd7\x32\x67\xb8\x07\xda\x91\x09\x32\x20\xc0\x44\x69\xea\x55\xa5\x64\x69\xbc\x38\x34\x5a\xa0\xde\x87\x75\x61\x99\x97\x2b\x61\x55\xb7\x71\x07\xef\x96\xee\x72\xc3\xcc\x1a\x3c\x53\x87\x59\xc0\x98\x16\x82\xfd\x10\x60\xc2\x20\x9e\x10\xb8\xf2\x9c\x0f\x63\xfc\xb9\x1b\xa7\xf0\x3e\x70\x69\x2c\x1b\x09\xd5\xa3\x32\xd1\x91\xc3\xb1\x30\x90\x78\x7f\x4e\x8e\x63\xe2\xeb\x37\x9e\x91\x41\x3f\x38\x36\x58\x52\xeb\x7e\x0e\x4e\x19\xbb\x8c\x07\x72\x9f\xb4\xb8\x66\x16\x22\x99\x28\x6d\x35\x80\xcb\xe9\x78\x88\x96\xc3\x49\x96\x65\xef\x88\x07\x59\x95\xad\xa5\xb2\x89\xb3\x80\x4d\x9b\xbb\x63\x38\x9b\x0e\x16\xf1\x19\x17\x03\x1b\x5a\xb3\x5d\xce\x0f\xa0\x7f\x5a\x19\xb0\x67\xdb\x83\x88\x41\xa3\x23\xb6\x3b\x9e\x6b\xbb\x09\x66\x5d\x02\x69\xc6\x6b\xb0\x1d\xca\xdb\x07\x63\x7e\x87\xf1\xe3\x74\xf3\xe1\x38\x22\x4b\x69\xce\xfd\xe3\x73\xd8\x8d\xf5\x39\xaf\xaa\x73\xda\x9a\x39\xd8\x2b\xe7\x95\x1a\xd2\xb2\xaf\x4a\x69\x82\x49\xd6\x25\x24\xb1\x06\x3d\xb9\x30\x5e\xc4\x7f\x20\x82\x2a\x19\x77\x66\x20\x9a\x47\x60\xf2\xaf\xe7\xc0\xcb\x52\x37\x35\xdd\x42\xf0\xa2\x48\xd1\x40\xd6\x3a\x43\x08\x98\x53\x14\xd1\xb0\x56\xbe\x71\x46\x2c\x7d\xcb\x30\x4b\x55\x7b\x8c\x6a\x59\xf3\xda\xc8\xa2\xb0\xa6\x62\x69\x8d\x4a\x3c\x87\x07\x9b\xdc\x1e\x06\xac\x61\x3d\x13\xce\x35\x9f\x5a\x74\xc0\xda\x05\xd7\x6d\xb3\x8a\xeb\x74\xde\x1d\x83\xe7\xd9\x20\x67\x2d\x21\x03\x5f\xb7\x66\x2b\xd8\x6d\x27\xe3\x2a\x98\x8e\xa7\x64\xaa\x7d\xf3\x4e\x15\x4d\x69\x78\x2d\x8b\x55\xc7\xf2\x05\x83\x97\x4c\xfc\x8b\x89\xf7\xc2\xe9\x95\x36\x62\x69\x79\x6b\x97\xe0\x8d\xb2\xbc\x36\x2a\x66\x28\xe3\xe5\x8a\xae\x96\xb5\x88\x07\x1f\xc7\x66\x20\xc4\xb1\xb8\x3c\xe7\xb2\xd0\x70\xfd\x71\x0c\x56\x83\x52\x42\x12\x54\x55\x9b\xd9\x60\x63\x70\x59\xd0\x65\x75\x0e\xe7\x8e\x54\x28\xf0\xf9\xde\x52\x11\x8f\xed\x18\x95\x2c\xb5\x64\x0d\x27\x73\xf3\x7e\x41\x6d\xed\x04\xc7\xce\xfc\x71\x72\xed\x50\x7a\x77\x2d\xdb\xc6\x70\x69\x37\x8d\xbc\x99\x4d\xdd\xe5\x6d\x87\xa6\xb3\xca\x3a\xfe\x88\x9c\xcd\x55\xcd\xe6\xe2\x9e\xa9\x2c\x6b\xea\x5a\x94\x99\xc0\x6b\x80\xaa\x97\x93\x28\xa1\xc7\x52\xb5\xff\xd5\xcc\x44\x21\xcc\x84\x2d\x94\x36\xcf\x0b\xb9\xc6\x73\x41\xaf\xd2\x39\x29\x5b\x88\xbc\x29\xd0\x47\x31\x6b\xf4\x6a\xa6\x3e\xc0\x54\x41\x41\x45\xc0\x62\xdf\xdd\x7d\x2d\x0d\x5a\x12\x60\x1b\x2a\xf6\x44\x98\xec\x89\x7d\x59\x27\xce\xbb\x6d\xed\x19\xef\x6b\xeb\x45\x00\x74\x6d\xc4\xcf\xc4\x6e\xb7\x26\x37\xb8\xaa\x00\xc1\x08\x1f\xc2\x12\xfc\x6b\xe8\xa2\xd5\xd1\xbd\x19\x78\xbd\xec\xe4\xdd\x64\xd4\x3c\xba\xfe\x4e\x69\xc9\x9c\x27\x2e\x5c\xa9\xf6\x8d\x63\xc9\x5b\x97\xc2\x08\x8d\xbe\x2c\x34\x9e\xa3\x37\xe1\xc6\x45\x96\xa4\xd1\xa5\xd1\x89\x25\xba\x50\xf7\x76\x9d\x4f\xf0\x63\x8b\x9a\x2c\x73\x79\x27\xf3\x86\x17\xce\x2d\x46\x82\xdc\x54\x95\x22\x1f\x8b\xf3\x93\xa1\xc3\x39\xd8\x59\xec\x7b\x55\x33\xb3\x00\x17\x3a\xd7\x78\x33\x0f\x5e\x41\x0d\x7e\xf5\x25\xaf\x6f\x63\x2f\xdd\x16\xae\x8e\x5b\x94\xa2\x41\x39\x0c\x57\x0c\x93\xe8\xd8\xb3\x9b\x3c\x46\x67\x42\xf4\xc3\x92\x56\xa9\x6a\x59\x1a\xef\xb3\x0c\xee\x52\x60\xf2\xb6\xc2\xf7\xdd\xca\xe1\x49\xe1\x5b\x39\x5e\x76\xe5\xf6\x9f\xa2\xae\x83\x3d\xed\x4c\x2d\xb0\xb3\xfc\x05\x7f\xb8\x52\xab\x62\x37\x98\x28\x83\x07\xd7\x4b\xe0\x01\xe9\x8c\xea\xca\xc2\xb6\x74\x2e\x04\xc4\x22\xec\x47\x66\x32\x7c\x40\xe1\xc2\xbe\x80\x82\xda\x22\xfe\x0c\xe2\xc1\xb4\xa4\x03\x2f\x8e\x7d\x80\x25\x1f\x19\x49\xd6\x34\x12\x53\xf6\x6e\x91\x38\xb2\x13\xfa\xda\xf3\xb6\x5b\x9b\x33\x41\x58\x74\x9c\x3e\x07\xa2\x6f\x84\x03\x2e\xa7\x13\x91\x1a\x54\x15\x2f\xbb\xe3\x1f\x85\xdc\xde\x8b\x0b\xc3\x82\xff\x36\x39\x88\x4c\x53\x25\x13\x85\xf6\x74\x80\xc1\xf2\x09\xb0\xfa\xa6\x70\x40\x56\xf9\x1b\x9a\x5a\x70\x72\x3c\xc3\x65\x0c\x28\x5c\x34\xaa\xb7\x66\x58\x00\x15\x58\xd7\x73\x9b\x65\xf5\x31\xee\x8a\x46\x85\x41\xc9\x90\x3f\xec\x96\xa8\x45\xd6\xd4\xd2\xac\xf0\xd2\xfc\x83\x01\x9f\x3e\x3c\x79\x2b\x78\x6e\x47\x79\xab\x94\xf9\x5e\x16\xe2\xda\x4d\x99\x39\xbf\xbf\xa9\x1b\x58\x4f\x02\xc0\x61\x90\x96\xdb\xc3\x3d\xfa\xb0\x5d\x61\x1c\x06\x1e\x2d\xed\x7c\x26\xf4\x5c\x55\xa2\x0e\x57\xa6\xf4\x76\x7b\xc2\xc0\x71\x30\xe1\xb8\xf6\x77\x19\x7e\x1d\xf7\x6f\x3d\x4c\xcb\x32\xc3\xa5\xec\xee\x7c\x82\x17\x02\x77\x3a\x8c\xea\x4a\xae\xd3\x75\x60\xf8\x39\x70\x89\xc3\x95\xd8\x01\x85\x6a\xc9\x4b\x7e\x23\x72\x26\x4c\x06\xf6\xc0\x06\xab\xea\x27\x7c\xfd\xa5\xc9\xfe\x0e\x9b\x3d\xad\x60\x98\x35\x0d\xe5\x41\x06\x9b\x00\xcf\x04\x96\xe4\x87\x95\x95\x36\x9d\xec\x60\xaf\x85\xb9\x57\xf5\xad\x13\x89\x39\x2f\xb4\x98\xc0\x0a\xa7\x98\x85\xc4\xd7\xb3\xd6\x88\xb1\xa8\x60\x94\x9f\xd2\x66\x1a\xc6\xa7\xa0\xbb\xab\x38\xe8\xae\x67\x68\x94\xc6\xa7\x41\x20\xdb\x38\x7e\x0b\xc8\x45\x0a\xa4\x45\x31\x35\x4f\x10\x25\xb2\xce\xd0\x5d\x45\x0c\x99\xb2\x67\x1b\x07\xa0\x3b\x06\x72\xcb\xba\xe5\x4d\x13\xef\x4c\xda\x99\x01\x38\xe9\x77\x3d\x74\x01\x84\xad\xe0\xce\x10\xe6\x10\x66\x9f\xad\xc1\xcc\x12\x87\x4d\x7a\x41\x7b\x8d\x33\x13\x83\xa0\x47\xac\x35\xbf\xce\xb2\x76\x38\x58\xd7\xe2\x2c\x63\xa3\x72\xb4\xdf\x8f\x04\xfe\xbd\x30\xd9\x7b\x98\x43\x7b\x95\x01\x10\xf6\xfc\xea\x55\xec\x41\xbf\xe3\xb2\xa0\x6d\xbd\x6f\xa1\xfd\x08\xdf\xac\xfd\x72\xc3\x3a\xf9\x84\x04\x15\x21\xa9\xd9\x3f\x45\x66\xd0\xfb\x72\x23\x0c\x93\xe6\x6f\x3e\x7c\x94\x7e\xf2\xc6\x9c\xbf\x70\xf7\xee\x86\xeb\x4a\x64\x2e\xc8\x1f\xf6\x0a\x04\x1a\xc5\x90\xb8\x37\x54\x2d\x6f\x64\xc9\x0b\x7c\x63\xca\x7e\xae\x28\x80\x99\x10\xf1\x20\x1d\x12\x0d\xbe\x30\x8c\xc4\x7f\x9b\x0d\x18\x90\xf0\xc5\x58\x20\xd0\xdc\x21\x71\xe5\xc3\x5c\xf0\xab\x78\xfc\x0a\x9e\xb5\x86\x6f\x05\x1e\x6c\x49\x03\x00\x19\x46\x47\x3e\x90\xd5\x4c\x4a\x03\xbf\xc5\x78\x68\x3e\x13\x05\x9e\xfb\x0a\xa9\x0d\x3e\xd2\x09\x77\xe0\xf7\x35\xec\x09\xcf\x6b\x61\x9a\xba\x64\x33\x65\x01\x03\xa0\x29\x7b\x81\x36\xab\xc5\x9b\xc6\x42\xb1\xba\x93\xdc\xd9\xb3\x99\x2a\x0a\x01\x41\xcd\x7f\xf3\xca\x91\x1e\x75\x87\x0d\xe6\x0e\xbd\x02\x5b\x52\x1b\xfc\x94\xfd\x68\xb1\x42\x24\x10\xea\xc0\x34\x02\x3c\xc2\xfe\x9f\x8d\x36\x44\xe6\x25\x97\xe0\x04\x26\x90\xf1\x54\xec\x2f\x08\x77\x10\xd3\x29\xfb\x41\x98\xe8\xed\xc0\x62\x1a\xc9\xaa\x97\xb9\x6a\xca\x9c\x62\xa9\x3e\x69\xef\xa8\x5f\x0d\xc7\x2f\x03\x46\xdd\x10\x7a\x3d\x61\xcf\x33\x23\xef\xc4\x0b\xc1\xf3\x42\x96\xe2\x1a\x38\x3e\xb4\xa1\xda\x2f\xdc\xe2\xe6\x45\xa1\xee\x21\xb8\xbc\xf3\x35\x19\xfe\x4e\xae\x3b\x7b\x26\xd0\x61\xdb\x7d\x93\xb3\xa6\x94\xff\x6a\x88\x6f\x53\xf6\x8f\x46\xd4\x2b\xf0\xf7\x98\x58\x5f\x7b\xce\x3a\xdf\x8e\x16\x56\x58\x54\xdd\x4b\x71\xa7\xea\xa5\xf6\xd8\x02\x94\x21\xa2\xa0\xd5\x46\x36\x98\xbb\x3b\x8b\xcc\x73\x6f\x4a\xbb\xb5\x17\x1c\x17\x10\x8f\x22\x0a\x5e\x59\x31\x1f\xad\xae\x2b\x95\x77\x34\x34\xf2\xcd\x87\xa4\x8f\xe0\x15\xcc\x7a\xb6\x94\xc6\xf9\xc7\x6b\xb1\x54\x77\x7d\xac\xd9\xc0\x96\xe7\x8e\x5a\x2e\xe6\xbf\x97\x35\x71\xcc\x09\x1a\x7f\x70\x22\x05\x4b\xfe\x5f\x8d\xa8\x25\xf9\xf2\x20\x5f\x21\x70\x2c\xb0\xaa\xa9\x14\x25\x63\x48\x55\x4e\xd9\xf3\x3c\x67\x9c\xdd\x5b\x45\x35\x61\xd9\x42\x64\xb7\x4c\xce\x3d\x0b\xa4\x76\xb7\x2f\x53\x7f\xff\x0d\x66\x34\x1d\x3c\x27\xc0\x65\x7b\x10\x81\x1f\x20\x5b\x45\x2e\x85\x36\x7c\x09\xd9\x00\x6a\x06\xf9\x03\x39\x4a\x03\x8c\x12\x2f\x3b\xaf\x62\x3c\x04\x6b\x79\xde\x89\xd2\x38\x19\xf4\x72\xe7\xb7\x13\x3f\x91\x58\x3c\xdb\x30\x31\xc6\xde\xaa\x99\x43\x88\x03\x8a\xef\x38\x59\x18\x5c\x98\x8f\x63\x51\x46\xbb\x30\xa5\x74\x64\x0b\x5e\xde\xe0\x2f\x77\xbc\x68\xfc\xea\xfa\x11\x46\x05\xa0\x6b\x46\x2e\xc5\x3d\x7d\xe6\x1e\xa3\xb8\xf5\x8c\x7d\x00\x46\x58\x61\x92\x99\x60\xa2\xbc\x93\xb5\x2a\x97\xa2\x34\xec\x8e\xd7\xd2\x1a\x41\x63\xf4\x2a\x19\xbb\xfd\xdf\xc3\x0c\x68\x84\x1e\x77\xda\x36\x8a\x95\x92\x66\x2c\xa5\xac\x0c\x0a\xbc\xbe\x2c\x19\x9c\xea\xfe\xfa\xd9\x57\x5f\x4e\xd9\x73\x76\x4d\x93\xc9\x78\x51\x80\x77\x5d\xd1\xe0\xe8\x13\x09\x7a\xc0\x51\x76\x2d\xd4\xaf\xbf\xfa\xf2\x0b\x66\x78\x7d\x23\xe0\xc4\x88\xbf\x5d\x7c\x7d\x01\xb1\x65\x9c\xa2\xc6\xee\xdb\x2a\xc6\x25\x3c\x15\x8d\xa6\x3c\xce\x32\x5d\x53\x70\x0c\xb1\xbf\x04\xf4\x62\xea\x01\xdc\x40\xc1\x60\x91\xd2\xa9\x41\x6a\x37\x2a\x6a\x00\xfb\x07\x99\x33\xe9\x10\xc3\x30\x75\x63\xad\x32\xcd\xbe\x7f\xf3\xe6\xfa\xe5\xdb\x5f\x5e\x5d\xbe\x7c\xef\xfe\xf7\xef\x6f\xae\xdf\x4d\xfa\x1e\x5c\xbd\x79\x9b\x3e\x80\x1f\x30\xbe\x3b\xfd\xf1\xbd\xa5\xdb\xfb\x77\x97\x57\xfd\xdf\x44\x8f\xdf\xbe\x79\xf7\x66\xf8\xb9\xb7\xc0\x06\x01\x3c\x7f\xf1\xe2\x2d\xf9\xbf\x6a\xbb\xf8\xaa\xa6\x08\x5a\x1e\xd3\xda\x70\x25\x1d\x64\x07\x23\x4b\x88\x47\x06\xdd\x88\xf5\xd1\xf3\x15\x98\xb1\xf6\x95\x4d\x9b\x17\x6c\xde\xf4\x6e\x77\x13\x6b\x6d\x42\xf7\x0b\xe9\x76\x82\x99\x40\xc3\x2b\x44\xcb\x81\x70\x93\xc0\xb4\xa0\xba\x3d\xc2\x1b\x8a\xaf\xdf\xbc\xb3\xc8\xdf\xb3\xa6\x8a\x3f\xb6\xe7\x43\x49\xa7\xe6\x74\xe8\x8e\xab\x64\x17\xea\x72\xad\xe5\x4d\x49\x37\x26\xb2\x1a\x41\x59\x6b\x6f\x72\x78\x9d\xbd\xba\xda\x6b\x73\x40\x13\x80\x6e\xd1\x63\x13\x36\x49\x5e\x89\xb2\x05\x34\xe3\x98\xb7\x07\xd4\x78\x75\xc5\x78\x9e\xd7\x3d\x4e\xa3\x5d\x08\x91\xa9\x65\x55\xc0\xdd\x0f\xa8\x7e\x9f\x5c\xa8\xe6\xb4\x93\xb9\x3b\xfe\x2b\x95\x5f\x03\xca\x23\x68\x55\x37\x56\x09\xd5\xaa\xb9\x59\x74\xc1\xc2\x8b\x74\x3f\xe9\x21\x6e\x52\xcc\x43\xa6\x95\xa5\xa2\xcc\x48\x42\x22\x99\xf4\x69\x64\xaf\x4c\xf2\x43\x90\xd1\xca\x5d\xa4\x85\x2d\xcf\x4d\x15\x6c\x19\x6e\xb8\xcb\xc7\xb0\x36\x15\x38\x57\xc1\x36\xac\x0a\x9e\xb9\xef\xd2\x29\x48\xb3\x7e\x70\x1c\x18\xed\xac\x00\xa0\xcd\xc5\x67\x17\x3b\xb0\xd1\x9a\xac\x26\x44\xa5\xe1\x15\x0f\x2c\x7e\xbb\xe1\xdc\x8b\x99\x56\xd9\xad\x18\xba\xd0\x8a\x79\xe7\x5c\x97\x23\x21\x12\xf3\xf6\xb4\x94\xa7\xec\x57\x07\x30\xc9\x99\x55\x76\x69\xd4\x52\xd8\xfd\xe5\x83\xc8\x3c\x36\xd1\xcd\x69\xd8\xa7\x2a\xbb\xb4\x5c\xd2\x96\xfb\x2e\x47\x9f\x5f\x00\xdf\xce\xe6\xf2\x91\xeb\x76\x80\x24\xce\x11\x07\xd9\xc2\x33\xbb\xe6\x38\xa2\x6e\x28\xbc\x2d\x21\xdc\x78\x5e\xc0\x64\xe0\xf4\xec\x21\xa5\x11\x6e\x96\x2b\x28\xdc\x7e\x80\x53\x70\x05\x2e\x4d\xe7\xf1\x2d\xf7\x41\x98\x12\xe7\xa8\x1d\x8a\x0d\xac\x90\x77\xa2\x14\x5a\xdb\xbd\x7a\x26\x26\x74\xc0\x82\x3c\x6c\x51\xe6\x10\x61\x88\xb7\x67\x4d\x3d\x78\x54\xa8\xd5\x2c\x71\xe7\x3b\x4e\xfd\xaf\x52\x99\xff\xd5\x4a\x49\x40\x0d\xf5\x64\x21\x78\x61\x16\xff\x83\x3e\x65\x3b\x58\x8a\xc7\x81\x4e\x99\x2d\xa0\xaa\x4c\x27\xc6\xce\x9e\x9c\x4d\xd9\x8f\xf4\x12\x66\x4b\xb9\x17\x81\x4f\xfe\x45\x48\x51\x07\x67\x0a\x97\x05\x69\xc0\x16\x70\x7f\xcd\xe1\x42\x97\x4a\xef\x8c\x4e\x12\x13\xdc\xe6\xb6\xb4\x16\xfb\xff\x88\x5a\x8d\xdf\xb0\x3c\x81\xdf\xc3\x90\xe3\xd9\x59\xa8\x8c\x9c\xc0\x13\x56\x2a\x87\xcf\xe1\xd8\x09\x6a\xe8\x93\x8c\x12\x62\x9e\x98\x65\x45\x0c\xfe\x64\x5f\xbe\x8e\xe0\x2a\x18\x9f\x8d\x16\x9a\x9d\x09\x28\xad\x11\x05\x93\x04\x94\x84\xc7\x89\x32\x53\x7f\x4c\xa1\x78\x67\x3f\xb2\x4f\x91\xd3\x80\x3e\x71\x9b\x60\xa0\x1c\x23\x6e\xba\xcd\x1d\xf9\x79\x71\x02\x66\x9a\xac\x62\xa8\x21\x8e\xc3\x4c\x93\x55\xdf\xd8\x23\x16\xb9\x34\x4f\xb2\x2c\xc3\x9c\xe8\x74\x67\x8d\x64\x2c\x8f\x81\x95\x27\x5c\x14\xa8\x3f\x00\xe2\x92\x24\x1b\x11\x57\x75\x5d\xab\x5a\x53\xe9\x9e\xa7\x17\xe4\x89\xd6\x13\x9f\x7b\x42\x03\xd0\x87\x96\x5f\x08\xb5\x12\xe5\x7e\xe2\x90\x88\x02\xad\xf8\x7e\x71\x78\xfa\xf5\xe1\xe5\xa1\xa5\xab\x77\x94\x87\x75\x5a\x3a\xd5\xd0\x91\x9e\x3c\x8d\x96\x76\x68\x80\x54\x84\x1d\xc3\xd5\x24\x21\xd7\xaa\x47\x36\x16\x0c\x1e\x89\x46\x47\x32\xe8\xfe\xcc\x69\x69\x42\xcd\x67\x9e\xc1\xdd\x1b\x29\x6b\xdd\x14\x86\xc9\x48\xe7\xa3\x38\xd0\xbe\x18\x9c\xc2\x24\x36\xf7\xee\x8a\xe5\x56\x82\x13\x04\x6d\x64\x47\x5d\x59\x66\xb5\x58\x0a\x0c\x0b\x4b\x45\xc8\x28\xf6\xf4\xc4\xfb\xc1\x01\xe5\xc5\x6f\x03\xc9\x16\x70\x08\x3d\xd2\x75\x23\x0e\x6e\x02\x51\x85\x21\x27\x21\xeb\x37\x02\xcb\xbb\x10\x06\x83\x47\x71\x3c\xf8\xc1\x55\x6d\xf2\x45\x4b\x84\xa8\xa4\x47\x2d\x6f\x6e\x44\x0d\x84\x6d\x61\xa5\xc8\x60\xe8\x91\x8f\xcd\xb2\xd1\x63\x3b\x9c\x48\x3e\x5a\x2a\x65\xd9\x14\x46\x56\x85\xe7\xb8\x66\x7f\xd1\x85\xba\xff\x74\x5b\x99\xc1\x58\x4d\x55\x2a\xa3\x4a\x99\x71\x7b\xa0\x87\xf9\x72\x1d\xad\x84\x68\x6f\xfd\x53\xbd\x1c\x43\xbd\x00\xb4\x16\x51\x96\x8d\x36\x3e\xa2\x9d\xf1\x1b\xbb\x79\xe1\x7c\x1c\x00\x45\x73\x49\x89\x33\x57\x75\xa0\x8c\x28\x2d\x41\xf3\xe8\xae\x8b\x24\xd8\xd2\x4a\x33\x5e\xae\xa5\x96\x3f\xbe\xc1\x78\x53\x9f\xca\x8d\xd9\xbc\x38\x75\x3f\x35\xbc\x0d\xb9\x13\xf5\x0a\xee\xc8\x68\x75\x06\xaa\xe9\x09\x5b\x0a\x0e\x21\xe4\x4d\x65\x14\xfb\xc2\xcd\xe3\xa0\x8b\xa7\x16\x3c\x97\xf1\xea\x01\x79\x93\xa5\x34\x92\x17\x56\x93\xf0\xd5\xe8\x25\xe2\x03\xa0\x22\x80\x71\xd8\xfd\x0c\x2f\xe5\x57\x54\x72\x8b\x02\x0c\xa3\x91\xb0\xf8\x03\x64\x41\x38\x9e\xed\xa5\x65\xb1\x64\x16\x44\x35\xcf\xe5\x4d\x53\x07\x35\x9f\x0e\x1b\xdd\x6e\x7a\xf4\x83\x89\x30\x65\x97\xc0\x14\xe7\x7d\xbf\xc6\xb2\x85\x96\x69\x56\x2b\xab\x65\xc5\x6b\x1f\xae\x96\x00\x4e\xa5\xde\x25\xb8\x21\x0d\x30\x46\x2c\xd4\x68\x8c\x2a\x9d\xc5\x10\x8e\xca\xeb\x6d\xcf\xc4\xbd\x0c\x06\x22\x63\x16\x89\xe3\xb5\x70\x3e\x0b\x3f\xdb\x03\x33\x96\xb8\xb8\x06\x95\x4c\x95\x1a\x6e\x62\x4c\x54\x91\x82\xd2\xfe\x53\x0d\x3b\xe9\xb9\x5b\x89\xb2\xf8\x79\xbe\x9a\x44\x7f\x53\xc2\x5b\xa4\xae\x22\x65\xef\xbc\xe6\x07\x3d\x12\x5f\xbb\x28\xcb\x4b\x8c\xb2\x9c\x58\x24\x9e\xeb\x9f\xb5\xa8\xbf\xfd\xf2\x8b\x2f\x3e\xfb\x7c\x80\x7d\xed\xef\xc8\xe7\xe9\x02\x17\x3b\xf9\x0b\x1e\x6a\x72\x08\x68\xda\x95\x3c\xe0\xdd\x46\xe6\x0c\xc6\xde\x2b\x4a\xf0\xec\x32\xce\x88\x49\x36\xbc\x80\x8c\x82\x97\xd9\x6c\xc5\x2a\xae\x61\x93\x0d\x83\xbb\x54\xb4\xa6\x64\x5c\xb3\xa6\xac\x6a\x79\x27\x0b\x91\xdf\x08\x48\x7d\xad\xd3\x3b\x79\x59\xb2\x6b\xf4\xd7\x8a\x9c\x55\x0b\x08\x56\x49\x2b\x85\xb8\x48\x35\x77\xcd\x47\xd1\x6a\x5c\x0f\x06\xac\x75\x02\x43\xbd\x80\x68\xf6\xf3\xab\x17\xec\x09\xfb\xe1\xd5\x8b\x6d\xea\x84\xb8\x98\xda\xf7\x14\x53\xbb\x59\x1a\x68\xd2\x37\x22\xc7\x18\xc2\xe9\xae\xf2\xe0\x83\x96\x03\xc4\xf5\xa2\x10\xd3\xfc\xc6\x79\xc1\x31\x8e\x71\x3f\xb1\x70\x4b\xbd\x5b\xdd\xa6\x4c\x47\x5c\xaa\x5c\x58\xd1\xd0\xc2\xd0\xdd\x6a\x7e\x76\xa6\xfd\x54\x69\xa6\xb8\xe8\xc3\x57\x24\x52\x5c\x23\xb2\x3b\x48\x09\x55\x0f\x49\x62\x1a\x7b\xa4\x44\x82\x3c\x68\xc6\xf1\xc9\x39\x29\x79\xef\xee\x3e\xae\x60\xd4\xad\x20\x6c\x0c\x89\x3e\x94\x90\xf4\x43\xc7\x60\xa1\xf8\xb2\xa8\xa3\x3b\xee\x6b\x69\xe0\x22\xba\x56\xca\xcc\x29\x51\x74\x1d\xae\x3b\x5d\x44\xa4\xaa\x25\xec\xff\x24\x48\x6b\xa6\xe0\x43\x91\x31\xc2\xe2\xd7\x34\xd8\x3c\x44\xf8\x14\x85\xba\x27\xc3\x75\x50\x7e\x30\x8f\xe1\x98\x4c\x06\x34\xbc\x6c\xbf\xd4\x19\x2f\x00\xcf\x2d\xd9\x7c\x9f\xb0\xb9\x1d\xac\xfd\x7c\x60\x90\x98\xdb\x56\x09\x62\x70\x9c\x5f\x9f\x4c\xf8\x37\x47\xeb\x86\x11\x57\x86\x76\xdb\x00\x76\xba\xbb\xb6\x21\x1a\x44\x41\xe5\x5e\x4f\xc3\xbb\x21\xb8\xa9\x0f\x55\xcf\xeb\x29\x7b\x9e\x26\x6d\x76\xec\xc8\xb5\xc4\xf7\x81\x07\x9c\xdd\xd8\xa3\x0a\x6c\x5c\x7f\x79\x7a\x71\x71\xf1\x29\xdd\x68\x52\xfa\xdc\xc5\x50\xc9\xac\xba\x29\x27\x49\x5d\x37\x74\xf6\x61\x76\xd9\xe0\x7d\x17\x3d\xc7\xaa\x42\xa9\x01\x57\x73\x12\x7d\x8f\x10\x6e\x75\x53\x31\xb5\x7f\x7c\x6b\x91\x1b\xda\x14\x47\x84\x6f\x3b\x2a\x53\x68\xee\xf0\x8e\x38\x61\xaa\xee\x25\xfe\x21\x35\xe2\xcb\xbe\x50\xa2\x89\xa5\x13\x2f\xf5\x70\xd4\xc5\x2f\xf4\x2a\x7b\xe9\x5e\x4c\x63\x3f\xad\xc1\xaf\x34\x66\x6a\xde\x59\xc0\x1a\x52\x28\x59\x29\x50\xae\xfc\xaf\xfb\x5b\xb8\xbd\xc1\x50\xd3\xfe\x89\xb1\x5c\xcc\x65\x99\x84\x18\x56\xb5\xb8\x93\xaa\xd1\xc5\xca\x3d\x1c\x08\xaf\x02\x51\x02\xba\x80\x82\xdc\x31\xe4\xc5\x13\x76\x24\x23\x7c\xad\x10\xaa\x13\xb2\x37\x67\x74\x33\xd3\x46\x9a\x06\x74\x18\x62\x8f\x09\x6c\x9d\x25\x04\xd5\x4e\x8e\xc4\x9f\x56\x39\xc8\xf6\x2c\x75\x1a\x03\xba\x8c\x2a\x4d\x76\xdf\x8d\x62\x45\xd7\xb3\x10\x80\x3e\x2c\x1b\x4f\xc7\x3d\x37\xe2\x69\x19\x18\xca\x8c\x0f\xb1\x6d\x2c\xb3\x5a\x8c\x72\x9e\x86\x83\x32\xeb\x17\x55\x34\x4b\x71\xdd\xcc\x2a\x6e\x16\x2f\xcb\x3b\x4f\xf4\x89\x25\x34\x14\xa0\x3c\x1a\xc3\xee\x60\x6c\xda\x04\x70\xac\xdf\xb4\xbc\x39\xd7\x46\xd5\xfc\x66\x23\x9b\x7e\xe2\xb7\x82\x81\xdf\x8b\x27\xf1\x02\x0e\x56\xc6\x4b\xcc\x67\x36\x44\x71\x5e\x86\xb9\x30\x35\x1f\x8e\x58\xdc\x22\xc2\x6c\x1f\xc2\xa2\x6d\x30\xd3\xaa\x80\x4a\xf9\xc3\xc5\x4b\x87\x29\x0c\x3e\xcc\x6d\x08\xdc\x1d\x33\xa5\xf9\x6f\xd7\x85\xba\x3f\x04\xe5\xc9\x91\x37\x48\x7d\xb7\x07\xf6\x88\x3d\xd6\xb9\x48\x70\x94\x1a\xec\x84\xa2\xa7\x3c\xde\x31\x99\x33\xe3\xd9\xad\x91\xd9\xed\x50\xac\xce\xa1\x19\xe3\xc7\x7b\xa4\x4c\x09\xf8\x41\x49\xa1\xd3\x72\x04\x8b\x94\xda\x63\xd6\xf6\xec\x70\x01\x78\xb2\x04\x08\x76\xea\x04\x16\x38\x92\x06\x2f\x6d\x4f\xfb\x4f\x7e\x71\xa5\x39\xa1\x86\x6f\x47\x73\x3a\x5d\x04\x35\xcb\x7c\xe6\xb2\xcb\x54\x34\xca\x23\x83\x67\xc9\xa7\xd3\xff\x36\x10\xef\xe9\x7e\x17\x1f\xaa\x9a\xd1\x7d\x54\xec\xee\x70\x36\xf3\xb3\xe9\x7f\x1b\x20\xcf\x5c\xd5\x2c\xf9\x32\x10\x8c\xb1\xcf\xa6\xff\x6d\xa2\x54\xad\x44\x17\x82\x6f\x39\x1a\x4c\xea\xf2\xcc\x40\x7b\x0a\x59\x53\x00\x3b\x0a\x2d\xcb\x0a\xc1\xcb\xa6\xea\xa4\x57\x1d\x87\xe9\xe8\x16\xc6\x2a\xeb\x58\xd7\x00\xce\xca\x5b\x0b\xc0\x5d\xc2\x20\x57\xe4\xbc\x6f\x8b\x63\x8e\x59\x4b\x95\xa3\xa7\x3d\x0f\x47\xc8\x56\x7c\x6c\xe0\xc4\xf6\x32\xf3\xcb\x38\x8c\xd6\x60\x43\xb7\xcd\xfd\x18\x1d\x62\x51\x5a\xfb\x07\x72\x79\xf4\xc4\x11\x10\xfe\x44\x7e\x5c\x63\xd5\x01\x2a\x5e\x4d\x79\xbc\x03\x8c\x01\xf2\x94\x2a\x17\xbf\xb3\x97\x00\x30\xce\xbd\xb2\x10\x67\x2b\x97\x6c\xae\x43\x55\x31\x37\x00\xda\xe2\x33\xd5\x18\x0c\x23\x8f\xeb\x1d\x94\xb9\x5f\x05\x5b\x98\x75\x13\xb6\xf4\xea\xd2\x37\x41\xb1\xd3\x25\x6a\x53\x1e\x56\x94\x21\x0e\x13\xa7\x1c\xb7\x56\xfa\xd2\xad\x2c\xf3\x6f\xe3\x50\x69\xad\x9a\x3a\x13\x50\xcc\x7a\x21\x02\x9d\x28\x8d\x92\x56\x1b\x12\x36\x18\xe4\x33\x91\x94\xe0\x6a\x0f\x9d\x0e\xbb\x7e\x48\x00\xea\x13\xab\xbb\x83\x0e\x0c\xf8\x9d\x32\x8b\x7e\xae\x86\x7b\x29\x2d\x4a\x27\x13\xdd\xda\x13\x11\x2f\x78\x5f\x64\x73\x8f\x08\x5a\x99\x78\x82\xf0\xfa\xa4\xef\xe5\x9d\xa4\xfe\x3c\xef\x54\xe1\x5c\x6b\x85\x5c\xca\xc1\xf0\xd9\x48\xd2\x5e\xab\x97\x58\xe9\xe6\x1d\x97\x25\xd5\x39\xa8\xd9\x4f\xee\x86\x1f\x02\x6d\x7f\xbb\x16\xb5\xe4\xc5\xef\x4c\xd8\x91\xe8\x36\xcf\x3e\x80\xfd\x78\x29\xcb\x30\xae\x4b\xdf\xfc\xed\x85\xd4\x75\x53\x19\x79\xb7\xb9\xaa\xb5\xdd\xec\x21\xa4\xe0\x9c\x04\x57\x94\xbc\x96\x8a\xb2\xaf\xda\xa0\x27\x2e\xfa\x3c\x70\x08\xd0\xa2\xd3\x3a\xd7\xac\xa2\x6b\xc0\xf0\x29\x5e\x30\x02\x49\x3a\x4b\xfe\xcb\x01\x7a\x5b\x0d\xd1\xa5\x37\x50\x69\x92\x90\x1d\x6e\x3b\xed\xcf\x98\x12\xc9\x8b\x5d\x89\x7e\x2d\xcb\x1b\x24\x79\xa0\x38\x80\xf4\x67\x25\x18\x25\xb3\x64\x2c\x34\xce\xda\x8e\xbf\x05\xad\x93\xba\x04\x2d\xfa\x58\xcd\xe1\xb4\x49\x8e\x55\xda\x60\x40\x91\x33\x7b\x36\xf4\x21\x70\xee\x32\x92\xa8\xee\xf2\x28\x11\x39\x28\x49\x85\x89\xa1\xae\x17\x54\x8b\x0b\xa2\xcc\xbb\x67\x87\xed\x98\x80\xe1\xe2\xff\x78\x73\xbd\x99\xd2\x20\xbf\x2f\x3f\x18\x51\xe6\x22\x67\x69\xfc\xf8\xb5\x30\x16\x08\xbb\x2c\xb8\x4e\x0a\xa1\x91\xf5\xa7\x4a\x7c\x0f\xa5\xdc\x65\x42\xd4\x82\xd4\x88\x6b\x4b\x45\x19\xe9\x76\xb9\x81\xda\x59\x8a\xa5\xaa\x29\x35\xa5\x6a\xb6\x3e\x46\x5f\x5e\xfd\x8c\x79\x3f\x08\x86\x46\x89\x06\xe9\x64\xc6\x60\x8c\x0a\xbf\x13\x76\x36\x34\x19\x2c\xc5\x71\xa5\xf2\x7f\xbc\xb9\xfe\xa1\xe1\x35\x2f\x8d\x18\x55\x35\x1b\xc8\x3e\x1c\xa3\xef\x5b\x95\x0d\xf7\x47\x8b\xa9\x5f\x8b\x6b\xfb\xb6\xcb\x4b\xe4\x45\xe1\x21\x80\x62\xbc\x95\x45\x11\xee\x42\xb6\xcc\x3b\xac\xe2\xcb\x6b\x6d\xe2\x30\x6e\x30\xe8\xce\x70\xd7\xc2\xcc\x4f\x4d\xf7\x07\x6f\x45\x26\xe4\x1d\x29\x8b\xb9\x14\x45\xbc\x7f\x45\xd7\xe1\xad\x0e\x6a\x08\x0a\x5a\x5a\xfa\x62\x3a\xae\x5e\x1e\x8d\xaa\x42\x9e\x6f\x48\x61\x9c\x26\x26\x4c\x92\x57\x1a\x46\x50\xea\x36\x4e\x41\x8e\xb2\xfe\xfd\x15\xbb\xcf\x44\x4d\xbe\x9a\xb2\xef\x42\xc3\x35\xba\x89\xf7\x29\xcb\x9d\x1e\x70\x71\xad\x07\xca\xc6\xbc\xa7\x56\x2a\xe4\x89\xef\xc7\xb6\x95\x90\xc6\x91\x8f\xe0\x14\x4b\x84\x01\xae\x79\xc1\x04\x92\x98\x9a\xe6\x73\x82\x28\x8c\xc7\x0a\x6c\x4d\xf4\x77\x31\x22\x11\xa9\xc6\x0a\x67\x2d\xde\xdb\x61\xdb\x02\xfa\x3c\x5f\x4a\x0d\xd6\xe0\xbd\x98\x59\x94\x26\x58\x80\x61\xd9\x18\xbc\x89\xa1\x9f\xdb\x9b\xa2\x15\x57\x5e\xc9\xf3\x25\xb7\x0b\x5c\xd4\xab\xdf\x03\xa8\x5f\xf1\x13\xf6\x5b\xb8\xf1\xfc\xe6\x12\xb3\x48\xed\x3b\xe5\xef\x30\x84\xd3\xcf\x9d\x91\x9c\xe0\x43\x79\x9c\x51\xc2\xfd\xf4\xa2\x03\xc5\xf3\x07\x94\xa8\x86\x6b\xaa\x24\xdf\x70\xca\x9e\x1b\x23\x96\x15\xd5\xcc\x53\x38\x6d\x4b\xdc\x7e\x08\x41\x97\xf9\xac\xae\xbf\x01\x50\xb8\x33\x71\x91\x03\xf8\xa9\x2b\x9e\x13\x7f\xee\xb6\x5d\xcb\x7e\xc8\x61\xa7\xe1\x21\x82\xc7\x15\xf1\xa0\x02\x2c\x7f\xc3\xac\x76\xf8\x77\x22\x80\x30\x4b\x68\xe8\x10\x3e\xc6\x9d\x63\x3b\xcc\x43\x29\x22\x94\xd1\xa8\xb2\x07\x12\xaa\x1f\x90\x9b\x83\xab\x2c\xd7\x9d\x03\xdd\x38\x0d\xce\x83\x4a\xab\xbb\x79\x8c\xd8\xd1\x78\x25\xbd\x8c\x3d\x21\xbc\xc6\x0a\x31\x75\x24\x3c\x89\x18\xf7\x8c\xb5\x93\x20\x77\xe1\xfc\x01\x44\x99\x7e\x8d\x45\x39\x17\xa5\x3c\x94\x24\x77\xa5\x18\xe5\x70\x1f\x49\xee\x9f\x42\x38\x54\x91\x24\xd3\x34\x8e\x27\xc8\x54\xf9\xa8\xad\xdf\x0e\x2a\xc7\x2e\x61\xf5\x09\x0c\x16\x7a\x99\x76\x94\xea\x78\x81\x7e\x2b\x6e\x24\x94\x0d\x88\xa0\xf0\xf6\xec\x52\xae\x24\x05\x28\x62\xf1\x33\x0a\x2f\xce\xab\xaa\x58\x39\x3b\x82\x98\x14\xa2\x22\xb0\x58\xfc\x06\x26\xc6\x50\x3d\x17\x51\x19\x45\xaa\x2a\x2e\x05\xe5\x30\x35\x6a\xfd\xf8\x48\x31\x0c\xf9\xdd\x02\x13\xba\x43\xef\x60\x70\x74\x79\xea\xaa\x99\x93\x48\x54\x8f\x76\xdb\x49\xa6\x22\x38\x8f\x54\xaa\x72\x51\xae\x22\x98\xbb\xc8\x14\xca\x53\x08\xe2\xd8\x4a\xa6\xda\xe3\x1f\x4f\xa2\x60\x24\x6e\x0c\xcf\xda\xb7\x4c\xfb\xc9\x50\x7a\xb6\xe4\xbe\xb6\xae\x1f\x8d\xe2\xed\x46\x4b\x4d\xb9\x49\x56\xd0\x82\x07\x95\x0e\xa1\x36\xa5\xdd\x4d\x9c\x1b\x41\xe1\x79\xeb\x4c\xd3\xe8\x4c\x37\xb3\x73\x77\xae\xf5\x1b\x08\x1c\x74\xe8\x85\xb0\xc9\x1c\x79\x8f\x00\x9a\x50\xff\x39\x7f\xd2\x8e\x2a\xc3\xf5\xd6\x42\x3e\x1a\x73\x7a\x11\x01\x4f\x5b\x54\xc5\xcf\x97\x84\x3a\x12\xf3\x5a\x63\xfa\x45\xe4\xc7\x55\xf3\x36\xa2\x3a\x65\x22\xd2\xaf\x8b\xb4\xa0\xef\x5c\x62\x11\x7e\x7b\x6a\x66\x3b\x6b\xe4\x24\x1c\xad\xc8\x1d\x8c\xf4\x5e\xf2\xca\xd3\xf7\xd0\xec\xb3\x2f\x19\xdd\x1d\x90\x1a\xa0\x77\xd8\x03\x0d\xf3\xa0\xd0\x88\xe4\x25\xf9\xf0\x93\x0f\x35\x04\x7a\x21\x0f\x9f\x60\x15\x47\xff\x7a\x70\xc9\xa6\x9f\x50\x19\xbd\x14\x74\x8b\xbf\xec\x79\xd9\xa7\x90\x1d\x48\x72\xa2\x70\x48\xa6\xe3\xb1\xc6\x5f\xf0\xf2\xa6\x9d\xb1\x14\xbd\x40\x2e\x45\x48\xef\x99\xf8\xde\x48\xae\x74\x88\x27\xfb\x38\x6c\x5a\x53\xf0\x33\xa4\xbc\x17\x3b\xee\x42\x1a\x41\x65\x71\xac\x18\xe9\x8a\x67\x82\xcd\xb8\x0e\xbe\x06\x87\x5a\x78\xdc\x29\x22\x46\x91\xa8\xa7\xd6\x70\x10\xe2\x22\x7b\xca\x17\x1d\x6c\x21\xd0\x5a\xcb\xb7\x97\xf7\xc0\xd1\x58\x2b\x0d\x4e\xc0\x5b\x09\xad\x93\x9c\xe7\xe4\xf0\xa7\xc9\x09\xcb\x39\x3e\x4f\xa6\x8d\x16\xaa\x54\xb5\x13\xdb\x63\xb1\x21\x19\x64\x03\x0b\x7e\xc6\xe8\x83\x94\xfe\xf7\xdc\x6a\x95\x2f\x7c\x9a\x1c\x79\xd9\x41\xdb\x80\x11\x89\x66\x14\xc4\x92\x91\x5b\xcf\xaf\x3b\x07\xc8\xb5\xd8\x98\x51\xcb\x58\xe8\x8f\x41\x38\x69\xdf\x6e\xa7\x81\xfa\x5d\xd0\xad\x86\x22\xa9\xa2\xa3\x25\x1e\xa6\xa3\xdc\x82\xb9\xbc\x61\x56\x9d\x62\x28\x18\xcf\x92\x01\xa6\xec\xad\x73\x96\x63\x8d\x4b\x9a\x3f\x5d\x1d\x04\x07\xa4\x2b\xce\x92\x68\x10\xa9\x59\x21\xb4\xb6\xf3\x2f\xa3\x99\xf7\xe0\x29\x35\xe5\xd7\xfa\xe1\x7c\x22\xa3\x35\x90\x5b\xc3\x76\x3f\x96\x37\xa5\xaa\x45\x1b\x5b\x6b\x03\x47\x9f\x6e\xc6\x36\xca\x62\xfc\xcb\xb2\xc9\x16\xac\x50\xe5\x0d\xb6\x88\x4d\x15\x91\x65\x26\xcb\x69\xdb\xf8\xf4\x98\x4a\x47\xea\x4c\xdd\x89\x7a\xc5\x72\x95\x35\x14\xcc\x75\x14\x01\x97\x65\x56\x34\x79\x98\x62\x30\x2b\x64\xd9\x83\xc6\xa6\x82\x6b\xef\x16\x22\x6c\xb7\x35\xe8\x24\x3a\x0c\xe1\x75\x03\xd4\x8a\xbe\xa9\x55\x53\xb9\x40\x40\xa9\x43\x8b\x41\x4b\x2e\xbc\xae\xec\x8e\x3c\xdd\x08\xfb\xc9\xdd\xd3\x00\xfe\xc9\x9d\xa8\xb5\xdb\xaf\x30\x04\xa8\x3b\xd4\xe0\x30\xce\x71\x40\x54\x69\xb9\x70\xdc\xde\x18\x8e\x82\xfd\xef\xb5\x4c\x34\x40\x20\x19\xff\xc9\x86\xe9\x0c\x91\xe2\x78\x82\xa7\xea\x5c\xd4\x22\x27\x02\x1c\x6f\x7b\x23\xbf\x43\x30\xeb\xb6\xf7\xe9\xf4\xdb\x72\x78\xf1\x72\xaf\x82\x2b\x34\x58\x77\x91\x47\x91\xec\xb3\xd2\xb5\xa8\xca\xad\x82\x82\xfa\x68\xec\x56\xac\x52\x45\x67\xd1\xe3\x05\x06\xed\x2c\xa0\xc1\xb8\xcf\x65\xba\x15\xab\x49\x38\x25\x97\xca\x2c\xa8\xb3\xb4\x83\x18\x01\xb3\xff\xe4\x79\x1e\xaa\xc4\xcf\x65\xad\x8d\x9f\x86\xd4\xde\xab\x19\x5b\x9c\xe9\x56\xec\xf5\xf6\xdf\xb0\x84\xf6\xad\x58\x45\x81\x0f\x00\xdc\x9d\xe8\xfd\xab\x47\x94\x16\xc7\xc5\xd4\x42\x38\xb6\xcc\xb4\xec\x91\xdd\xec\x22\x04\xa6\xbb\xf6\xcd\xd0\xd5\x42\x7b\xd8\xc4\x43\xdb\x7a\xe6\x38\x72\xfc\xcb\x86\x01\x9a\xa0\x6b\x5a\xce\xe7\xa2\x86\x30\x1b\xa3\xec\xa2\x26\x95\x78\x62\xfe\xac\xc5\x65\x4f\xee\xb5\xcf\xd1\xcc\xdb\xb3\xd8\xcf\x1e\x0e\x5f\xb8\x9e\x22\x50\x6b\x8c\x61\x8c\x20\xbd\x7b\x0a\x15\x8b\x13\x4c\xa3\x6b\xe7\x9e\x53\x78\xec\x64\x5b\x03\x9e\xda\xee\xdf\x3d\xb3\xf0\xf1\x96\x35\x19\xa3\xbd\xf2\xab\x41\xa0\x74\x0b\x53\x8a\x7b\xbc\x15\x87\xf9\x82\xdd\x87\x22\x59\xf9\xa2\xd6\xfe\x5c\x8d\x81\xad\x49\x41\xce\x07\x92\xcc\xaa\x6e\x4a\xf4\x6e\x9d\x5c\x10\x69\xe8\xb1\x72\xd7\xbd\x22\x0e\xda\x1d\xe8\x8e\x1e\x01\x1c\x89\x4c\xf9\xa9\xff\x9c\x5c\xcf\x6b\x04\xc2\x55\xfc\xcc\x16\x62\xc9\xa9\x66\x03\x5a\x64\x3a\xf4\x7c\xa2\x38\x37\xbb\x3b\x61\xd9\x10\xab\xf5\x93\xad\xc4\x61\x97\x28\xaf\xce\xc0\x7f\xa3\x6d\x07\xd0\xa6\x61\x9c\x15\xe8\x83\x13\x97\xbc\x7d\xcb\x86\x96\x3b\x08\x99\xb5\xca\xdd\x87\x7d\x1f\xe1\xd5\x14\x25\x75\xf8\xcd\xec\x98\x12\xe6\x89\x48\x5d\xe3\x8e\x2f\x56\xce\x43\x84\x0e\x74\xdf\x57\x1a\xcb\x59\x78\x9c\x76\xb7\x67\x22\xf3\xa1\x6c\x35\xf6\xb4\x1a\x41\xe5\x7a\xf8\xac\x5e\xa9\x1c\x99\x9c\x7e\xd7\xb2\x10\x16\x82\xbd\xa3\xae\x05\x52\x95\x54\xc7\xf2\x2a\xb4\xc7\x0c\x47\x78\x98\xdb\x51\x37\xb0\xe0\x9b\xcb\x54\x69\x6a\x55\x84\x4c\x55\x74\x04\xf5\x9a\x79\x98\x0b\x8a\xcb\xed\x58\xec\xa6\xbc\x02\xe7\x8e\x24\xee\x43\xee\x26\x06\xaf\xc6\x0e\xdd\x7e\x63\x94\x30\x1c\x2b\x0c\xa9\x8e\xa1\x01\xd1\xfb\x5b\xae\x36\x0f\x17\x13\xa5\xff\x5a\x39\x2a\xa5\xbd\x0e\x61\x32\x2e\xfd\x6d\x50\x2b\xa0\x37\x4a\xfe\x1e\xbc\x30\x5f\x13\x7a\x91\x2a\xac\xe3\x49\x16\x64\xab\x64\x85\xd2\xa2\xdd\x35\xf7\x60\x22\xd2\x94\x99\x2a\x73\xd0\xe4\x50\x0d\xab\x16\x30\xe9\x40\x38\x2b\xc0\x11\x1e\x9e\x56\x5b\x5b\x3d\xb4\x4f\xc4\xb0\x5c\x67\xe2\x32\xf7\x7d\xf3\x2f\x9f\xb3\x59\x53\xe6\xd4\x8b\x51\x2b\xda\x50\x0c\xf5\x96\xb2\x4c\xc0\x40\xb2\x20\x1e\x11\xae\xf0\x32\x65\x47\x60\x6e\x79\x9b\xa8\x21\xb8\xe1\x38\x5e\x3e\x7e\x73\x53\x8b\x1b\x6e\x54\x7d\x4e\x19\xd4\xfa\xdc\x2c\xc4\xb9\xe6\xcb\xaa\x10\x96\x67\x18\x7e\x36\x82\x9f\x1e\x12\xbb\x0e\x9d\xa9\x68\x29\xbb\xec\x6c\x3b\xc7\xa7\xd3\xa7\x5f\xb1\x6b\x80\x8f\xc6\xd7\xd5\x2b\x68\x81\x20\xea\x28\xa5\x11\x1b\x0b\x9b\x18\xea\xf8\xf6\xc7\xb0\x47\xb6\x26\x00\xe8\x63\xc6\x01\x20\x80\xb7\x00\xcb\x0a\x92\x41\xe0\xee\x95\xdc\x60\xf0\x14\x4a\x96\xc1\x2d\x35\x39\xc6\xbb\xf8\x3c\x79\x7e\xf5\xea\x1c\xf1\xee\x30\xa3\xa7\x47\x50\xc2\x8c\x40\xf5\x36\x3f\x2e\xd1\x7e\x78\xeb\x0c\x97\x17\xc1\x70\xb9\x54\xa5\x33\xe1\x7f\x75\x2b\x2e\x83\xdf\x0c\x5b\xca\x0f\x91\x85\x5f\x48\x3d\xc2\x7b\x85\x43\xb9\x91\x02\xf4\x8d\xeb\x31\xae\xc3\x10\xf1\xd8\xe1\x02\x37\x11\x6c\xa1\x96\xea\x46\x94\x42\x35\x1a\x43\x94\xd4\x9c\x5d\xbe\x1d\xad\x98\x39\x81\x4b\xee\x90\x28\xb6\x72\xd0\xb6\x6b\x35\xd6\x6a\xbf\x48\x96\x3f\x37\x96\x47\xec\x32\xb4\x3b\x59\x63\x2d\x52\x2e\x8e\xdb\xf6\xef\x9e\x75\x0e\x25\xbd\xf0\x9f\x25\xbb\x81\x0f\xd1\x6a\x1f\x9e\x10\x51\xfb\xfe\xdf\x28\x2f\x48\x1b\x77\x55\x04\xeb\xdd\xf5\x29\x81\xdd\xa1\x73\xf4\xc2\x91\xb6\xd5\x04\x59\x9d\xbf\x0f\xc4\x7d\x3f\xa0\x18\x76\x12\x44\xb4\x2a\xb6\xf5\x4d\x1c\x4b\x10\x61\xb1\x5f\xbe\xb5\x67\x4b\xa3\xe0\x1f\xcf\x4e\x29\x7e\x77\x4f\x07\x1d\x1d\x1a\x23\xe0\x78\x6e\x77\x0a\xe0\x62\x5a\xf1\xff\xd4\x2c\x9d\x60\x47\xa6\x6d\x59\x15\xc9\xc4\xaf\x70\xf8\x5d\xcf\xa9\x0d\x1f\x63\x53\xa8\xae\x00\xc5\xcb\x71\x9c\x79\xe7\x57\xe8\xf0\x8c\x93\xf5\x89\x23\x4b\x17\x59\x43\xa4\x20\xfb\x8b\x3a\x57\xf9\x10\x01\xc8\xa0\x5b\xc5\xa6\x1d\xe5\x1d\xed\xc2\x34\x18\x6b\x1b\x3e\x8d\x8d\x05\x18\xa4\x75\xd0\x1e\xeb\x99\x75\x2d\xed\xfe\x39\x0c\xc7\x55\xef\x79\xe2\xfb\x50\x6c\x66\x1b\xde\x06\xa9\xfa\x56\x8f\x4e\x64\xb0\xc6\x81\xf8\x60\x04\x25\x31\x16\xd2\x9d\x8e\xb1\xe4\x01\xe3\xac\xe6\x65\xae\x96\xeb\x96\x25\x0a\x1f\x42\xdc\xa0\xee\xc9\xc2\x76\x6d\xcd\x98\xa4\xdb\x09\x7f\x25\x1c\x87\x95\x24\x36\xfa\x56\xfd\xad\x52\x39\x00\x74\xde\x3b\x74\xde\x47\x98\x6f\x21\x18\x94\x3c\x10\xc7\x29\x3d\x02\x29\xb9\xc1\x4a\x69\x3e\x32\xf0\x89\x6f\x97\xb2\xf6\x7e\x9f\xf5\x4d\x67\x4b\xc9\x59\xa7\xa7\x93\x38\x64\x9e\x27\x71\x3f\x95\x5f\xfe\xd2\xe8\x3e\x3c\x30\x7c\xda\x3b\x11\x12\x14\x23\xdb\xde\x09\xc6\x9d\x84\xc6\x7c\xce\x82\xd0\xcd\x4c\x8b\x7f\x35\x02\x92\xe1\xf8\xb8\x44\xaf\x23\x88\xcb\x2e\x26\xe2\x11\xe4\x83\x82\xea\xc7\xa8\xfc\xfd\xf5\xc6\xc4\x29\x8d\xa7\x17\x18\x4f\x2e\xf2\x35\x03\x6b\x7f\xcb\xe4\xcc\xb7\xa5\xab\x76\xd0\xea\x24\xb5\xc1\x76\x4b\x7b\xa1\x92\xfb\x6f\xcd\xb8\xdd\xf6\xac\xeb\xf1\x64\x77\x92\x47\xe9\x1d\x71\xe7\x56\x74\x62\xee\xd8\xb5\x75\x04\xa6\x0f\x23\xbb\xdb\xf8\x1d\xf7\x96\xe0\x9e\xe9\xd3\xe0\x90\xca\x98\xa4\x38\x82\xc1\x49\x27\x86\x83\x69\x2b\xef\x6a\xa0\x91\xfd\x01\xe4\xf2\x2d\x34\xed\x24\xd6\xc3\x33\x2a\x14\xcb\x73\x6b\xed\x36\xa5\xc1\xb6\x2a\xfe\xa9\xd4\xee\x4a\x22\x9c\x62\xe8\x06\xd5\x02\x7b\x8b\x29\x19\xf4\x36\xdd\xb2\xe6\xb9\xff\xdc\xce\xd7\xbd\x1f\x6e\x40\xd2\xe1\xc2\xed\x08\xe4\xc4\x91\x37\x13\x3b\x4a\xa8\x22\x45\x56\x1b\xbe\xea\xca\xd0\xa6\xb3\xf3\x81\x64\xc8\x5d\xf1\x9f\x40\x84\xe8\x84\xe2\xe2\x3e\xd6\xb0\x7a\xcf\x50\x90\xef\x85\xb5\x63\x21\xce\x61\xe2\xc2\x1d\x2a\xe9\xd5\xa0\xa6\x30\x07\x6c\xf9\x3d\xfc\x7c\x38\x0c\x42\xe3\xa7\xc2\xf9\x5a\xc4\x0a\x5a\xa6\x67\x20\x8e\x43\x64\x5a\x37\x44\x74\x96\xad\xa3\x3e\xe6\x27\x54\x2c\x6f\x2a\x51\xda\xcd\xe2\xaa\x99\x15\x52\x2f\xac\x21\xa5\x2a\xec\xfe\x59\xde\x8c\xbf\xbf\x4d\x67\x4f\xc0\x1c\xec\xf5\xe2\x81\x99\x50\x3a\x96\x03\x54\x24\x95\xc8\x30\xfd\x54\x95\xc2\xfb\x76\x6e\x84\xd1\x94\xb0\x9b\xbb\xb4\x86\x19\x25\x89\x8e\x8f\x8e\xdf\x78\x41\xe6\x1b\x18\xd0\xb8\x7a\xea\x28\xe5\x96\xb0\xdf\x7e\xfc\xdd\x15\x4e\x9a\xca\xbc\xac\xdd\xe0\xa2\x2c\x8d\x9e\x9b\xdd\xd6\xf5\x2d\xd4\x3b\x86\x23\x58\x74\x33\xd7\x41\xab\x83\x92\xbb\x84\x75\x7d\x78\x09\x92\xdb\x95\x23\x20\xbe\x70\x7b\xa9\x5c\x1c\x1a\x35\x2b\xde\xe5\x48\x47\x64\x78\xaf\x2a\x51\xf2\x4a\x6e\x2d\x7f\x0e\xa9\x1a\xc4\xed\xa8\x92\x87\xa4\xc1\x6b\xf1\xc0\xbd\x35\x72\x87\x38\x1d\x53\xcc\xfe\x76\x48\x31\x7b\x0b\xe8\x46\x62\x83\x31\x64\x34\x94\x13\xa5\x35\x38\xde\x49\xce\x38\x9e\x08\xfe\xb6\x5e\xd0\xe8\x00\x01\x07\x8a\xb9\x35\xbf\xa8\xbc\xbf\x45\xe0\x41\xc4\x08\xc8\xfb\xe1\x1c\xee\x84\xeb\x3b\x71\xde\x94\xb7\xa5\xba\x2f\xcf\xe9\x2e\x9a\x1b\x28\x88\x7c\x54\xf1\x42\x0b\xc8\x72\xe9\xf2\xed\x0b\x46\x98\x40\x49\x75\xc4\x85\x05\x5c\xa2\x5b\x6d\x8b\xd6\xe1\x04\x6c\x90\x02\x3d\x97\xf0\x76\xe4\xa1\x5b\x3c\xbc\x7a\xe6\xae\x49\x76\x67\xe0\x89\xb7\xc2\x6f\x9b\x99\xc8\x4c\xf1\x37\x3a\x74\x9c\x6b\x99\x87\x0c\x3c\x17\xcd\xcf\xb3\x4c\x54\xc6\x13\x02\xcb\x31\x1a\x19\x47\x10\x13\x1c\x0a\xa4\xac\x0a\x2e\xc9\x9e\x8f\x0b\xf2\x42\xc7\xdb\x3e\x21\xfe\xaf\x57\xaf\x5f\x3c\x46\xb9\x93\x25\x13\xcb\x99\xc8\x5d\x18\x04\x9e\xee\x1e\x85\x18\x42\x36\xa7\xc7\xce\x5d\xa7\x9e\x4e\x12\xbb\x83\xef\x2c\x8c\xa8\xe7\x24\x7f\x10\x61\xe4\xa6\x6f\xae\x01\xaa\xdd\x69\x9b\x90\x73\x82\x37\xff\x02\xb2\x52\xb0\xda\xc8\x83\x89\x6d\x44\x18\x54\x09\x27\x94\xcb\x7e\x04\x0e\x27\x7e\x49\x1a\x2d\x01\xa7\xae\x25\x2e\xeb\x51\xcd\x43\x6a\x04\xaf\x6b\xbe\xc2\x53\x6d\x55\xcb\xa5\x34\xf2\x4e\x0c\x86\x38\x0c\xc8\x63\x6a\xd4\x51\x9c\x1f\x54\x15\x0c\xc2\x30\x19\x2f\xa6\x15\xd7\x3a\x0d\xd7\x6b\xc5\x4c\x50\xb3\x90\x8e\x18\x27\x17\xf6\xbe\x16\x61\x78\x8e\x77\xec\xeb\x86\xa6\x28\x03\x10\x78\x3f\x5c\x67\x75\x24\x2b\x03\x29\x1a\xad\x0e\x7a\xd8\xab\xad\xd7\x2c\x39\xff\x9d\xab\x2a\x38\xf8\x69\x77\x41\xc6\x43\xd2\x0a\xeb\x5e\xce\xb1\x78\xf4\xc7\xb9\x63\x9c\x7c\x93\x70\xc2\x72\xc4\xf5\x38\xca\x30\xb1\x47\xd1\x42\xdc\x89\xe2\xe3\xdc\x10\xdc\x59\x8b\x74\x0f\x7b\xf1\xf2\xfa\xf2\xed\xab\xab\x77\xaf\xde\xbc\x66\xda\xf0\xf2\x7f\xf8\xc3\x9c\xb0\x78\x0d\x8d\x0a\x20\x6b\x65\x44\x30\xdb\x41\xc4\xca\x9f\x74\x2e\xdf\xbe\x80\xa3\x47\x88\xcf\x46\x3c\xc6\xc7\xc7\x12\xa0\x75\x2e\x61\x5d\x71\x2c\xa0\xd8\x1e\xc5\x3b\xb5\x3b\x07\xae\x3d\x0f\x5b\x0f\xc9\xc8\x5b\x59\xe6\x0f\xc6\x47\x6d\x8f\x98\x98\x5f\x15\xd1\x15\x1c\x9e\x81\xf8\x80\xe1\x41\x39\xec\x8e\x2e\xc9\xe8\xf1\xf9\x16\x30\xe8\x91\x03\x40\x65\x0b\xae\x1f\xfe\x12\xe0\x80\x9c\x77\x52\xfc\x08\x98\x9f\x32\xdc\x3b\x19\x3e\x0e\x57\xc9\x11\x78\xf8\xc2\x79\x8f\x29\xcf\xb6\xc6\x5e\x95\x57\xb5\x98\x8b\xba\x16\xf9\x2f\x24\xa6\x16\x35\xc8\x86\xe5\x95\x44\x52\x6e\x66\xa6\x87\xed\xeb\x32\xe3\x0e\xb6\x06\xbc\x0b\x35\xfc\x01\x98\x35\x3e\x96\x90\xfb\xe8\x35\x48\x5f\x84\xea\x9d\xa6\x96\xe2\x4e\xe4\x53\xf6\x32\xc1\x9b\xcd\x55\x53\x46\xcd\x17\x7d\xcb\x53\xdc\xfd\x3a\xa8\x35\x25\x25\xed\x3a\x11\xd2\xcd\x7c\x2e\x3f\xd8\x31\xc4\x07\x08\x5f\x9c\x66\x6a\x39\xa6\x02\x73\xc2\x1b\xef\xb6\xef\x74\xd4\xb8\xa3\x4b\x50\x0a\x48\x0e\x17\x85\x9b\x29\x9e\x96\x5b\xee\x01\x01\x9d\x10\xee\x46\x5c\x52\x3c\xc7\xca\xa1\xfe\xed\x76\x2f\xbe\xf6\xed\x2a\x35\x2f\x72\x32\x0d\x34\xc6\x65\xb9\x10\x78\x81\x8c\xbd\x61\x45\x17\x6e\x5c\x93\xd1\x87\x45\xc3\x29\xb5\xa9\xe2\xcf\xd9\x6c\xe5\x2f\xfc\xd3\xc1\xdb\xc4\x7f\x76\xb1\x81\xf8\xfd\x35\x88\x81\x7a\x61\xe5\xf9\x62\xdb\xdb\xd2\x5d\xc4\x82\x59\x52\x45\x67\xaa\x35\x3d\x17\x26\x5b\x08\x6a\xb0\x0c\x2e\x4b\x91\x4f\x42\xad\x4b\x77\x91\xbd\xd1\x7b\xeb\x2f\x06\x11\xfc\x24\x14\x7c\x8e\x72\x6a\x91\xe0\xf8\xab\xd4\x6e\x38\x62\x20\x9d\xe8\xef\xd9\x12\xf3\x1c\x10\x04\xb6\x9a\x05\x10\x50\x89\xd5\xfe\xe6\xea\x9d\xe1\x7b\x2d\xa0\x11\xf7\xd2\x6a\x4b\x1d\x0e\xc2\xa5\x7c\x51\x0c\x04\x62\xed\xc8\xb3\x1f\x78\x3d\xe3\x37\x82\x5d\xa2\x88\xab\xda\xaf\x9c\x5c\x54\x85\x5a\x2d\x81\x38\x60\x1c\xf3\x1b\x34\x9e\x29\x3e\x7c\xc6\xb3\x5b\xbb\xa0\xcb\x11\x51\xf0\x6e\x94\xcc\x8d\xd2\x5a\x62\x6f\xaf\xfd\xea\x98\xad\xa2\x91\xc3\x0a\x28\x95\x61\xaa\xae\x16\x7c\x44\x92\x95\xbf\x6e\x0e\x80\x42\x7d\xd8\xaa\x90\x19\xd7\xc2\x4c\xd9\x9b\x12\x8a\xf7\xba\x1f\xe2\x25\x3a\x89\x23\x0d\xf0\x6e\xd9\x43\x8a\xcb\xf3\xbd\xa9\x70\x63\xb9\x0a\xe4\xc1\x74\x17\x57\x78\xf7\x3b\x4f\x24\x3c\xd3\xbf\x70\x61\x64\x2d\xa0\x71\x7c\x02\xba\xd4\x3d\x5a\x11\x61\x5a\x1f\x39\x91\xe1\x85\x56\xae\x48\x2b\x45\xdb\xcf\x44\xa1\xec\x28\xaa\xf5\x4d\xb7\x4c\xe0\x96\x61\x5c\x37\xc8\xc9\xf7\x9e\x93\xe3\x05\x8a\xe6\x64\xa2\x9c\x9c\x42\xd4\x93\x63\xcb\x16\x54\xc3\x89\x88\x58\x67\x7b\x4a\x55\xff\x3c\x50\x2c\x9e\x01\x0f\x48\xb6\xde\x5e\xc6\x32\x15\x17\xbe\xc1\x0c\xed\x76\xcb\x5c\xb7\x18\x2e\xb7\x11\x31\x80\x19\x89\x59\x2a\x62\x6f\x23\x5c\x2f\x03\xae\x78\x6e\xe5\x8d\xee\x92\xc7\x8a\x0f\xe6\xb5\x5e\x52\xd1\xa0\xc7\x23\x29\x98\x0a\xa7\xee\x4b\xc8\x52\x19\x73\x18\x1a\x14\x8e\x5b\x21\x2a\x5c\x69\x19\xe3\x40\x39\x0c\xed\xf0\x89\x28\x54\xb3\x09\xaf\xec\x9d\x92\xa6\x8c\xfb\x84\x33\x4c\xf3\x95\x66\x5a\x1d\x42\x7c\x96\xfc\x83\x5c\x36\x4b\x48\x85\xca\x38\x76\xf4\x84\x45\x3d\x13\xe6\x5e\x08\xf4\x8d\x3d\xbd\x80\x6d\xee\xe9\xc5\x85\x57\x13\x43\x02\x87\xd9\x36\x45\x81\x40\xec\x4c\xba\xc2\x86\xab\x61\x0b\x9d\xf6\xbd\xaa\xc5\x26\x61\xc3\x60\xd4\xd1\x02\xd7\x11\x36\x5f\x34\x7e\xe1\x66\x75\x52\x29\xac\x44\x99\x8b\x32\x5b\xb1\x91\xf6\xcb\xa0\x98\x51\xdc\xc2\xac\x50\xd9\xad\xdf\xdc\x08\x38\x1e\x39\x65\x9d\x15\x9b\x6a\x0d\xf8\xa8\xde\x5a\x20\xfd\x26\x21\x81\x7b\x89\xbc\x7b\x73\x0f\x2d\x6e\x04\x1c\xcc\x32\xa1\x99\x6e\xe0\x39\x14\x2b\xcf\x31\x0c\x65\xc1\x41\xa4\x3f\x9b\xd8\xff\x7e\xe6\xfe\x7c\x8a\xee\x6f\x95\x7f\xe6\x7e\x81\x24\x72\xd5\x06\x58\x0b\x5d\x59\x23\xf8\x4e\x14\x2b\x17\xbc\x87\x56\x98\x85\x11\x6f\x60\x50\xdd\x1d\xd4\xe0\x3b\xdc\x7c\x12\x6a\xfa\xfe\x01\x48\x15\x3c\x18\xa4\xf4\xa3\x70\xe6\x63\xf3\xd9\x9f\x35\x61\xae\xfb\x68\x13\x3b\x9b\x60\x36\xc1\x74\x8d\x0e\xaa\x14\x2c\x41\x70\xe3\xe3\x19\x09\x69\x6b\xc9\x8e\xff\xb2\x2f\x9e\x9d\x69\x28\x03\xe4\x42\xee\x62\x38\xc9\xca\xd8\x4f\xcd\xbc\xbd\x7c\x3a\x59\xaf\x6b\x28\xa2\x04\xf4\x4d\xbf\xae\xa1\x31\xb0\xb4\xd1\xf0\x40\xcf\xe0\x53\x2d\xdc\x76\x12\x89\x95\x9d\xe0\x82\x17\x73\x0c\x4e\x50\x5a\x74\x35\xd9\xd3\x75\xaa\x0c\xb5\x74\xaf\x3a\x7b\xba\xab\x2e\x03\x98\x7f\xf7\x48\xc5\xd6\x94\x5d\x17\x09\xfe\x41\x84\x23\x8d\xd5\x18\x64\x34\x4f\x43\xe7\x8d\x5c\x0a\x6d\xf8\xb2\xda\x62\x6b\x8e\xe4\x29\x60\x61\xe7\x0b\x7b\x1f\x72\x68\x15\xe4\xb7\x9f\x05\x63\x3a\x1e\x1e\x6a\xc7\x8e\x0f\x0b\x3d\xf6\x1c\xda\x58\x7b\x2c\x30\x04\x30\xe2\x9c\xb0\x89\xef\x52\xb3\x37\x08\xeb\xa3\x39\x43\x20\xbe\x41\x7a\xbc\x15\xd9\x3e\x3f\xe0\xfe\x3a\xfa\xf8\x80\x6a\x05\x29\xeb\x4e\xd4\xe9\x51\x62\xf0\xdb\x70\x8c\x70\x9f\x3f\x02\xeb\xf0\x88\x72\x37\x70\x86\x90\x73\x1f\x53\x1e\x6c\xc1\x7f\x27\x53\xb0\x2d\x9a\x6b\x14\x5b\x70\x6e\x8c\x31\x03\x8f\x26\x56\xbe\xe4\xe7\xb9\x53\xd2\xe7\x14\x99\x7a\x3e\xee\x44\xf1\xda\x01\x88\xda\x61\xf5\xf9\xad\xc8\x06\xb2\x94\x8e\xe2\x5f\xa9\xd3\x0a\x8f\x4a\x8f\x46\x3e\xa0\xf1\xfe\x5a\x39\x1f\x82\x01\x79\x5d\xf1\xe8\x7e\xe4\x79\x4d\xc1\x0a\x00\xc1\x7f\xdc\xf1\xbc\x3e\xdd\x40\xe3\xf0\xe5\x78\xda\x42\x30\x52\xd6\xe9\x45\xb9\x1f\x7d\x23\xa0\x2c\x99\xe9\xc9\x68\xec\x30\x88\x47\x07\x6c\x20\xb4\xf9\x58\x74\xf6\x24\xf2\x35\xe9\xf7\x22\x2b\x1e\x25\x78\x04\x76\x93\x6b\xfb\x75\x4c\x14\x5a\xc3\x68\xec\x27\x4f\xc8\x5f\xda\x7e\x92\x78\x3a\x4b\x75\xef\x53\x06\x30\x80\xe3\x9e\xfd\x08\x1d\x40\xda\xe4\xfa\x7a\x57\x72\xb9\xdb\xb0\x7f\x34\xca\xf0\x9e\xe2\xd7\x9b\x89\x97\x40\xe8\x49\xc5\xee\x03\xc9\xd2\xaf\xa6\x63\xf7\x84\x74\x2c\x08\xd5\x48\x1b\x81\xfd\x0b\x1e\xb8\x16\x60\x97\x71\xf9\x64\x17\x0c\x1e\x65\x69\xb2\x5f\xad\xac\xa6\x40\xa5\x8e\xc3\xc5\x29\xd3\x77\xcd\x28\x93\x38\xf6\x37\xce\xe0\xa6\x50\x24\x82\x45\x3d\x7b\x7b\x50\x76\xc8\x76\x71\xc1\x6d\x34\x6a\x56\x25\x4d\x62\x5c\xfb\x5c\x09\x77\x13\x3c\xbc\x9c\x36\x5d\xe6\xf9\xac\x09\x98\xda\x06\x21\xa1\xb0\xc8\x4c\x35\xa5\x41\x5a\x4c\x92\x5a\xd3\xbb\x08\x4c\xd6\xcf\x62\x28\xd1\xc1\x2b\x13\x17\xe8\x2d\xe4\x3c\xb4\x28\x9d\xcb\x9b\x9f\x78\xb5\x9b\x00\xb5\x04\xa4\x27\x33\x4e\x1a\x9d\x7e\x72\x0d\xb9\xa0\x61\x85\x2e\xd1\xd3\xa0\x98\xf8\x60\xcf\xff\x22\xc7\xb0\x46\x6c\xb3\x6e\x78\xe1\xeb\xf6\xf8\x8b\x1f\x94\x1d\xa4\x9d\x95\x10\x59\xa6\x6c\x63\x51\xea\x7a\x98\xde\x2b\xa3\xbb\xc5\xc0\x5b\xc8\x46\x61\x76\x68\xae\xd9\x21\xe2\xb2\x26\x96\x78\x1e\x66\xab\xdd\x94\xa3\x32\x14\x18\xeb\x99\xb2\x3b\xf7\xa5\x04\x0c\x6e\x7b\x91\x42\x77\x56\x8f\xc3\xd6\xad\x89\x4d\x78\xfa\xb0\xb9\x41\x3c\x49\xac\x29\xd3\x6e\x1b\x4c\x4f\xbb\x20\x2a\x35\xc2\x3d\x7f\xb8\xa5\x50\xa9\xfc\x8f\xb9\x08\x7c\x5f\xbf\x76\x4b\x49\xfa\x9c\x34\xea\x84\xd4\xe9\x84\xbd\xac\x16\x62\x29\x6a\x5e\x5c\x53\x16\xa6\xdb\x52\x5d\x83\x4b\x37\x17\xbb\xe9\x62\x9b\xc8\x11\x2b\x8b\xbc\x7b\x69\xd4\x64\x2c\xc0\x7b\xad\xa3\xa4\x6a\x08\xa5\x57\x0e\x4f\x5c\x7c\xb0\x6b\x09\xdb\x6c\x2e\xb9\x84\xeb\x19\x14\xd3\xee\x6c\xd0\xe0\xe2\xb2\x70\xb5\x2f\x53\x20\x2d\xce\xfa\xcd\x28\xca\xce\x8a\x2b\x57\x3a\x7b\xc6\xb9\x36\xcf\x74\xb7\xd3\x27\x7d\xec\xc9\xe9\x06\xe7\xbe\x2b\x32\x38\x70\x56\x25\x5f\xca\x0c\x0a\x78\x45\x2d\x3b\xa4\x69\x41\x94\xb5\x80\x33\x75\x92\x11\xdd\x87\x12\xf6\x91\xb4\x43\x24\x9a\xc7\xef\xfa\x59\x5b\xa8\x5d\x58\x2f\x28\x05\x77\x00\xb4\xa7\xc9\x58\x50\x81\xb7\x7a\x50\xd7\xb8\x98\xe9\x47\xa0\x6f\xe8\x88\x7b\xdd\x69\x9c\x7d\x54\xb5\x43\xa3\x32\xf0\xf7\xfc\x11\xd5\xcf\x5b\x4f\xd6\xdd\x37\x61\x5c\xd6\x61\x83\x8b\x80\x1e\x65\x17\x8e\x71\xde\x6d\x1b\xf6\x9c\x1e\xc6\xf4\x63\xd9\x87\x23\x37\x52\xe2\x6f\x39\xf5\x12\x69\xf9\xb1\xfe\xd0\xab\x25\x25\xf6\x2e\x0b\x07\xaf\xff\xda\x96\x61\x3f\xfc\x2d\xd7\xd0\xb0\xce\xee\x59\x43\xed\x99\xf4\x2e\x27\x1f\x50\xbd\xc9\xb2\x1d\x87\xbf\x5b\x59\xc1\x57\xf2\x78\x57\x97\x16\x59\x7d\xda\x1d\x07\x47\xfc\x63\x2e\x9f\x6b\x9a\xdb\xc1\x4e\x7b\x08\xd0\x71\x2e\xfe\x0c\x49\x7d\x8c\x95\xe3\x26\x31\x76\xe7\x19\x58\xea\x29\xea\xdb\xee\x3a\x3d\x3e\xa6\x07\x58\x1b\xe0\xff\x3c\xed\xe2\x80\x21\xff\xa8\xab\x83\x26\x77\xc0\xe5\x01\x10\x4f\xbd\x3e\x68\x1a\x7b\x2f\x90\x04\xf9\x6d\x56\x48\x64\xde\x3d\xb0\x6d\x86\xaf\xc0\x9f\x23\xae\x3f\xb6\x5d\x28\x78\x27\xe2\x0f\x96\x54\xc8\x0d\x7a\xbe\xa8\x65\x65\xec\xe1\x91\x17\x59\x53\xa0\x8b\xfe\x0f\xb3\x66\x8e\xc7\x44\x1c\x59\x67\xaa\x12\x13\xf6\x9d\xd0\xe6\xe5\x7c\xae\x6a\x5c\x39\xaf\x95\x89\x7e\x81\x77\x76\xe4\xe8\x9d\xa8\xe5\x7c\xd5\x7a\x06\xae\x90\x99\xa0\xd5\x2b\xa2\x51\x46\x72\xce\xdc\xab\x14\x24\xb5\x22\x02\xc0\x67\x01\xf5\x33\x84\x1a\x37\x17\x0a\x57\xbf\x67\xc9\x2c\xcf\x1c\x02\x9b\x84\xc0\x2c\x84\xac\x1f\x50\x75\x26\xd3\xbb\x52\x70\xa7\x5c\x2a\x03\x69\x9b\x32\x93\x76\x25\x60\x77\xa5\x15\x7a\x95\x7c\x92\x02\x74\xe7\x44\x95\x44\xde\x1d\x00\x3c\xc6\x69\xb6\x83\x73\xcc\x29\xd0\x2e\x37\xf2\x96\x34\xcc\x9a\xa8\xca\xbd\x2c\xfb\xf9\x92\x6f\x38\x27\x7b\x8f\x51\x3e\xa8\x89\xed\xd3\xde\xad\x24\x6e\x6d\x3f\xca\x28\xd9\x38\xa7\x56\xe9\xe0\xf6\x8c\x88\x6b\x3b\x70\xcc\x7e\x8a\x7b\xc8\x11\x39\x36\x82\xfe\x5d\xa6\x3d\x72\x8e\x8d\x94\xa9\x13\xa9\x5b\xdf\x3c\xa4\xbc\x71\xfa\x36\xfe\xe9\x38\x0a\xd7\x84\x11\x80\x70\x30\x8a\x3e\x88\xc6\x8d\x90\x1f\x52\xb9\x67\xe9\x1c\xbd\xba\xa5\xce\x93\x3e\x72\x07\xa4\xde\xfb\x6a\xbb\x57\xac\xad\x62\xeb\x35\xe6\x89\xd9\x17\x87\x5c\xf1\x8f\x58\x97\xfb\x7b\x01\xea\x87\x27\xf2\xf6\x74\x1d\x6e\x6f\x23\xff\x39\x9b\xf3\xa2\x70\xa0\xff\xe5\x6f\x97\x9d\xbf\xff\xd8\x0a\xbd\x97\x91\x1b\xf5\x43\xcf\x27\x7d\xc1\x03\xfb\x2a\x88\xc8\xc0\xde\xea\x9c\x39\x6a\x56\x2d\xee\x55\x5d\xee\x71\xb8\x59\x7a\x21\x78\x5e\xc8\x52\x5c\x47\x8d\x5b\xeb\x5e\x46\x52\x3e\x76\x8b\xe9\x1d\xfe\x6e\xcf\xdb\x1e\x3a\x8c\xf0\x47\xf7\x71\xa9\x27\x8e\xa1\x6f\xc7\xde\x4c\xbc\xb5\xbc\x0d\x0b\x6e\x9b\x0d\x60\x33\x6f\xbd\xd4\x8e\x62\xee\x01\xd5\x3f\xfa\x3c\x34\x5c\x1e\x33\x51\xde\xc9\x5a\x95\x10\x8d\x0a\x65\x41\x36\x2b\x77\xfa\x3e\x0a\xc2\xc9\x54\xa9\x9b\x25\xc4\x88\xc0\x6c\x21\xee\x4d\x96\x16\x38\xbb\xe3\x35\x4e\xf5\xb7\xd7\x2a\x17\xb1\x42\x1f\x7b\x14\x72\xbe\xb8\xae\x6e\x8a\xba\x67\x61\x3f\xec\xac\xe0\x35\x34\x7e\x8c\xa6\x85\xa5\x0a\x78\x2d\x01\x3f\xcc\xf1\x8d\x72\x2a\xe0\xa6\x0f\xbd\x40\xee\x8e\x0f\x54\xaa\xa9\xb9\x3d\xac\x43\x6b\x4f\x08\xab\x71\x01\x65\xee\xf5\x60\xa3\xa6\xa9\xa6\x31\x45\xfd\xb0\xd8\xb8\x1d\xd1\xd5\x54\xe7\xc4\x81\xa5\x0d\xe2\x56\x60\x3a\x0a\x25\x0c\x86\x41\x36\x04\x5f\x66\x6a\xb9\x54\xe5\x13\x7c\xbf\x93\x5c\x3a\xcc\x6c\xa8\xfc\xe9\x6e\x99\xf7\x61\xf9\x9d\xe4\xed\x89\x3f\x22\x86\x63\x35\xa8\xb3\x97\xe5\xdd\xf7\xb5\x5a\x9e\xed\x24\x00\x04\xb1\x4f\x08\xf6\x11\x80\x18\x6c\x10\x82\x63\x09\x00\x76\x03\x5f\x56\x66\x75\x8e\x53\xda\x8e\xe7\x70\xc1\x1e\x8a\x01\x11\xc5\xf2\x06\xa2\xef\x00\x2c\x9a\x6e\xf8\xbb\x9d\xc7\x86\x10\xc6\x9e\x1e\xb8\xe4\x8d\xc5\x20\xff\x12\xa1\x5a\x50\xad\xd6\x08\xfe\xc2\xbf\xa3\x18\xbf\xd8\x8d\x3a\x5b\x04\x71\xb6\xa8\xe2\x02\x37\x69\xda\x9b\xa2\x36\x69\xb8\x38\x64\xf3\xc7\x28\xad\xdc\x01\xa7\x98\x01\x2c\xea\xe0\xe8\x50\x48\x4d\x3a\xe7\x07\x79\x27\x30\x14\xcf\x37\x39\x80\xa2\xe0\x82\xfe\x20\xe7\x20\x42\x9b\xb0\xa8\x31\x24\xe6\xd5\xff\xab\xe1\x85\x8f\xf4\xa4\x7e\xf2\x00\xf8\x5d\xf0\x88\x47\xa1\xb6\xb3\x15\x93\xe6\x0c\x1d\x5b\x32\xa3\xd0\x50\x8f\xab\xb5\x73\x29\xdd\x7f\x2e\xa1\x55\xda\xc4\x57\xa9\x4f\xb3\xe9\xe3\x18\x53\x55\xcb\x1b\x7c\xdb\x2f\xba\xeb\x5e\x79\xef\x8b\x39\x5d\xcf\xd2\xe7\x57\xaf\xd8\x52\x18\x0e\x0d\x9f\xff\xfe\xee\xdd\x15\x51\x72\x0c\x6f\xeb\x3b\x51\x53\x75\x37\xd7\x48\xcc\xae\xcc\x77\xb8\x84\x6b\x5e\x6a\xe0\x2e\xd6\xe9\x0a\xbd\xe2\x7c\xfd\x8d\xcf\x2f\xbe\xc4\xe2\xe5\x90\x3e\x2d\xca\x9c\xd4\x4d\xae\x84\xc6\x06\x9b\xcb\xaa\x00\x0b\x2b\xa0\xb8\x5e\x66\x5e\x69\xdd\xd8\xa5\x41\x13\xc1\x13\x09\x69\x88\xe7\x57\xaf\xa6\xe9\x83\x44\x70\xf0\x91\x0e\xc6\x06\x34\x26\x53\x73\x8b\xe5\xd6\x26\x05\x64\x3f\x44\xad\x7f\xda\x54\x87\xfe\x32\xe7\xa1\x01\xf7\x39\x76\xb2\x3b\xe7\x65\x7e\x5e\x0b\x6d\x78\x6d\xc6\xf4\xea\x83\x06\x3d\x96\x07\xdd\x08\x5f\x82\x82\x23\x41\x8a\x5e\x08\xa6\x17\xac\xe0\x3a\xaa\x7b\xe1\x2a\x13\x51\x4b\x1d\x9f\x3e\x53\xd5\xe2\x4e\xaa\x46\x53\x23\x9e\x6d\x8a\xb3\xe0\x17\x54\x02\xa3\x16\xaa\x12\xa5\x33\xee\x06\xc7\x47\x13\x6f\x2d\x0e\x13\x17\x27\x04\x8d\xe0\xec\x06\x21\xcb\x06\x32\xda\xa4\x3d\x2f\x97\x37\x56\x6c\xe4\x9c\xae\x73\x75\x2b\xb2\xbd\x52\xb2\xc4\xb6\xf3\xb2\xa7\xfa\xef\xa6\xe8\xf6\xde\x9e\x40\x1d\x46\xda\xd1\x7c\xdf\x91\xf3\xd1\x75\xca\xd7\x70\xb2\x87\x8f\x54\xcb\xc3\x37\x5f\xef\x70\x72\x67\x56\xc5\x8c\xe2\xac\xe2\xb5\x91\x59\x53\xf0\xba\x9f\x59\xd2\xe9\x55\x3a\xf7\x43\xa3\x8a\x84\x03\x6c\xc1\xab\x4a\x40\x34\x1c\xe6\xc2\x53\x6b\xc5\x16\xbe\x90\x29\x38\x1b\xa8\xee\x7d\x18\xc6\x58\x35\x75\xee\x12\x10\xcf\xef\x89\xde\xdb\x73\xc6\xf5\x9d\xe2\xb9\xef\x4f\x33\x89\xbb\x4e\x85\x36\x55\x29\x21\x30\xd2\x84\xb0\xd9\x82\x41\x3e\x67\xd2\xa1\x8c\x25\xf9\xfd\x32\xcf\x84\xbc\xc3\x3c\xa9\x18\x23\x1f\xfe\x40\x58\xad\xc3\x05\x87\xa1\xad\xb9\x55\xe4\x07\x40\x40\x85\x76\x52\xdd\x38\x5c\x0a\x0e\xaa\x58\x05\x78\x4e\x89\x83\x0a\x27\xb7\x8b\x1d\x62\x7d\x09\x9f\x03\xb1\x19\x06\x39\xa7\x42\xfc\x7b\x70\xd7\xf7\x6d\xf5\x4e\x0b\x39\x67\x12\xa9\xa0\x8d\xaa\x34\x5b\x8a\x90\x41\x16\x47\x45\x3a\x83\xc2\xd3\x70\xeb\xc5\x18\xaa\x1c\x6f\x1e\x89\x3e\x39\xd3\x64\x4f\xba\xd4\x43\xdf\x31\x0d\x55\xa5\x9f\x17\x09\xc4\x84\x8a\xaf\x16\xd8\x65\xd8\x3d\xee\xd1\x9e\x8a\xd6\x2c\x61\x84\xed\x44\xa4\x01\xa4\x74\x32\x51\x08\x3c\x8d\xb0\x83\x8b\xd1\x03\xb3\x59\x5b\xdb\x09\x4b\x11\x6c\xc9\x59\x27\xba\x54\x86\x0a\x97\x80\x6b\x1f\x8a\x64\xf7\x35\x3e\xa1\x7c\x9c\xaa\x73\xb1\x0d\xf3\xba\xe0\x30\x69\xd1\x21\x4d\x96\x3a\xd4\x54\xc3\x68\x62\x6b\x2a\x96\xd2\xc8\xe0\xca\xe5\xa5\x5d\xc5\xd4\x46\x97\xf8\x07\x95\xd2\x10\x69\x9a\x43\xb4\x91\x62\x5d\x16\xda\x1b\x09\x18\xf6\xba\x74\x01\x17\xdd\x5d\x7e\x1e\x4a\x47\xa1\x18\x40\x09\x28\x14\x30\x4a\x54\x6b\x7f\x84\xa2\x56\x50\x5d\x51\x44\x06\x56\xf6\xd4\x55\xc2\xb2\x53\xad\x6a\x95\x37\x99\x43\xef\xbe\x96\x06\x7a\xb7\x93\x7d\x87\x59\xeb\xec\x46\xd5\xaa\x31\xb2\xec\x6e\xc0\x3d\xc7\x91\xcd\x92\x71\x49\x35\xec\x30\xce\x42\xd4\xe3\x5b\x83\xa4\xef\xfb\x83\x9b\x24\xff\x75\xeb\xf1\x16\x8b\xb8\x04\xa3\xba\xf5\xbd\x37\x85\x7c\x91\xba\xef\x94\x81\x7a\x18\x6c\xc9\xff\x49\xee\x43\xcb\x8c\xa5\x2c\x55\x1d\xe8\x8e\xbd\x0e\xed\xbe\x3a\x03\xad\x24\x4b\x23\x6e\x7a\x5a\xdb\x6e\xca\x33\x45\x74\xde\x0f\xd8\xa3\x2f\xb8\x58\xaa\xf2\x5a\x98\xf3\xef\xb9\x2c\x44\x7e\xa5\x72\xe7\x72\xef\x25\x64\xa5\x7f\xa7\x6f\xc0\x6b\xdf\x4e\xd0\xb3\xb3\x5c\xf9\x56\x84\x70\xf8\x14\x39\xcb\xf1\x83\xca\x95\x43\xd8\x74\xfc\xcb\xdc\x63\xc3\xfe\xab\x99\x89\xba\x14\x56\x9e\x72\xa9\x4d\x2d\x67\x4d\x38\xdb\xd2\x81\xd8\x1e\xcf\xfc\x3c\x42\xd1\x05\x48\xad\x84\x96\x38\xbd\x67\xe0\xde\x22\x64\x95\x7e\x82\xc8\xbe\xd7\xc2\x0c\xd3\xea\xad\x2a\x0a\x2b\xd9\x3b\x91\x88\xbe\xf5\x35\x8d\x9b\xb2\x14\x99\xd0\x9a\xe3\xdd\x88\x35\xfa\x0e\x4b\x26\x77\x44\xe3\x8d\x51\x4b\xcc\xa3\x5e\xca\x52\x2e\xed\xb1\x12\x33\xff\xa5\xae\x9b\x0a\x33\x2a\x1c\x76\x6a\x1e\xba\x91\x28\xc6\xc3\xe4\x0f\x4a\xc8\xd7\x2a\x17\xd7\x62\x5d\xd1\xc3\x4d\xd4\x6c\xb0\x05\x24\x34\x09\xca\x94\x3d\x36\x7e\x70\xf2\x76\x68\xfa\x25\x32\xc6\x4a\x95\x8b\x68\xeb\x75\xdd\x49\x52\x5b\xa7\x5b\xc8\x73\x1f\x6a\xed\xb5\x32\x63\x42\x69\xec\x02\x78\x24\x3a\x99\xd8\x09\xa5\xe6\x61\x02\xe4\x3e\xf9\x15\x73\x9e\x53\x72\xc6\x99\x95\x16\x40\x78\x9a\xb5\x6b\x33\xc5\x35\x09\x78\x26\xbc\x2f\xf3\x4a\x75\x8f\x10\xfb\xae\x72\x59\xde\xfc\xec\x12\x62\xb6\xa6\x39\xe5\xa1\xc2\x2d\x93\x9d\x33\x36\xf2\xe1\x3e\xa7\xd5\xab\x7e\x7a\x51\x9b\x9a\x1b\x71\x03\xa5\x3f\x92\xc1\x8f\x28\xca\xc9\x38\x07\x11\xd7\x50\xb6\xe3\xad\x58\xd3\x1d\x17\x68\xd7\x7d\x37\xfa\x29\x2d\x8e\xa7\x8a\x9c\x0a\x05\x94\x79\xe8\xba\x8b\x75\x2d\x55\x29\x36\x57\x39\xdd\x45\x8c\x5f\xa4\x25\x55\xe8\xbe\xd3\xf9\x76\x89\x5d\x1d\xa2\x3d\x1b\x22\x9a\x87\xb6\x8e\x68\xe3\xa4\x6e\xe0\x83\x8d\xe4\xf3\x32\x17\x6d\x9e\xa7\x25\x5f\x22\xd8\x47\xa2\xa1\xb8\x93\xd6\xda\xf9\xbb\xd4\x46\xd5\xab\x1f\xe5\x52\xf6\x87\xc5\xb7\x48\x99\xaf\xa3\x5e\x94\x5d\x75\x38\x6a\x65\x85\xe0\x25\x6b\xaa\x08\x8b\x33\x1d\x25\xfa\x50\x8d\x2b\x1e\xda\xb3\xa4\x6f\xfe\xef\xa9\x55\x2a\xd3\xba\x67\xc2\xff\xfb\xb0\x34\xbd\xaa\x95\xe5\x2b\x1e\x50\xae\x33\x5e\x0c\xdd\x03\x6c\xa4\xa9\x93\x90\x2a\x86\xa8\x3d\xc4\xc3\x1b\x3e\x11\x36\xf1\x98\x14\x43\x03\xe3\x4e\x98\x9c\x8a\x69\xf2\xb8\x58\xc1\x43\xbb\xd3\x0c\x31\xc7\x95\xef\x78\x91\x96\x77\x92\x1a\xbf\xec\x6e\x47\x7b\x6b\x06\x75\x37\x90\x2f\x35\x9a\xea\x35\x41\x39\x26\x95\xdd\x18\xe8\x8d\x02\xca\x42\x90\x0d\xe3\xf5\x4c\x9a\xda\x5a\xba\x65\xb3\x9c\x89\xda\x9a\x07\xe8\xb2\x01\x33\x33\x17\x1a\x5a\xc1\x68\x63\x75\x43\xde\x80\x63\xb7\x46\x85\x11\x27\xa6\x46\x25\x17\x61\xa8\xc6\xd8\xe3\x9b\xd4\x8b\x9e\x1d\x6c\x1f\x92\x4f\xc8\xa4\x74\x3d\xf9\x7c\x9d\x68\x74\xc0\x24\x6c\xdf\xc8\x92\xc8\x10\x5b\x0b\x6b\x03\x63\x7e\x6d\x8b\x5c\x5c\x3d\xc9\x25\xd2\x26\x55\x2f\x22\xef\x51\x4e\x74\x77\x41\x15\xa1\x14\xd3\xab\xf6\x97\x74\x7a\x6a\x0d\xe4\x0b\xa5\x00\x1a\xb4\x78\xbc\xcb\x21\x4f\xde\x8d\xe1\xd1\x07\xfe\xee\xcd\x37\xf6\x76\xee\xad\x30\x0c\x05\xb3\x48\xd3\x89\x28\x19\xc0\x32\x8f\x4b\x3a\x05\x38\xe3\xca\x4e\xaf\x95\x84\xff\x54\x33\x3d\x89\x2b\x6b\x4d\x58\x2d\xce\x79\x8e\x35\xb4\x06\x99\xfe\x9f\x6a\xe6\xb8\x0d\xef\xa2\xc7\x04\xae\x1c\x01\x94\x8b\x27\xc2\x64\xe7\x52\x95\xe7\xcb\x70\xb1\xca\xd0\xca\x19\x19\x03\x50\xf1\x9a\x17\x85\x28\xd8\x3f\xd5\x0c\xaf\x7f\xc3\xc2\x82\xf2\x59\xad\xab\x4c\x6a\x5e\x33\xf7\x1f\x4a\xbd\x44\xab\x9c\x6a\xcd\x71\x17\xdb\x8a\xc5\x56\x2c\xd2\xd2\x74\x6a\x6c\xe2\x50\x76\x9e\x74\x95\x86\x44\xa1\x3b\x4b\xaa\x64\xc6\xb0\x0e\xc2\x4f\x58\xb5\xc5\xb8\x36\xd6\xe0\x52\x8a\x3a\x87\xfe\xa7\x9a\x9d\x69\x2a\x46\xdc\x82\x1a\xb2\xc1\xfb\x6c\xfb\xde\xbb\xb8\x4a\x3f\xb1\xa4\xe8\x65\x24\xc6\x76\x11\x23\x6f\x6a\x9e\x89\x79\x53\x84\xa8\xca\x71\x1c\xf5\xa5\xf6\xff\xa9\x66\x63\xb9\x04\xcc\xf1\xae\x22\x11\x23\xe2\xdb\x53\x02\x43\x44\x61\x19\xd2\xa9\x20\xd3\x76\xea\xdb\x87\x00\xd3\xd3\x2a\xaa\xee\x18\xe7\xe3\x8f\x73\xb5\xad\xa3\x19\x29\x40\xb8\xab\xc1\x7b\x1c\xae\x6f\xc1\xa3\x82\xc9\x1c\x1b\xe9\x05\x07\x4f\x20\x96\x51\x31\x34\x54\x30\x5c\xdf\x6a\xa6\xd5\x52\x40\xed\x49\x80\xeb\x27\x0b\x57\xe6\x0a\xab\x12\xf8\xbb\xd1\x4d\xfe\xb8\x10\x91\x1d\x6a\x0c\xe2\x28\x46\x61\x70\x86\x2a\x33\x41\x1e\x53\x4b\x21\xf6\x1c\xa6\x45\x03\x58\x53\xc0\x5f\x96\x7a\xea\x8a\x0f\x22\x6b\xb0\x9b\x68\x98\xc1\x3e\xf2\x48\x36\x04\xbb\x16\x66\xd2\xd6\x11\xfe\x90\x13\x29\x88\xf4\xe9\x20\xd9\xa3\x04\xf1\x7e\xfd\x03\xb0\x55\x19\x8e\xe7\xd1\x38\x74\x75\xe5\x3a\xee\xa6\xdf\x6c\x32\x16\xda\x05\xc2\xb1\xee\x58\x3c\x4f\xf6\x97\xb7\xd7\x9f\xb2\x7b\x28\xa1\xda\x6e\x28\x21\xc9\xc1\xec\xee\x8c\x28\xbc\xd0\x6a\x83\xb7\xd7\xc4\x02\x09\x9e\xf3\xa0\x66\xec\x88\x50\x7c\x16\x97\x23\x95\x77\x85\x7a\x5e\xd1\x69\x83\xc3\x01\x07\xa0\xfd\xea\x76\x34\xa7\x85\xca\x58\x0b\x81\xb2\xc4\x7a\xdd\x74\x01\xfd\xf6\xda\xb5\xef\x82\x4e\xc5\x44\x97\x16\x9e\x6f\xaf\xcf\xda\x2d\x2a\x26\xee\xeb\x3e\x25\x16\x1f\xf7\xe9\x27\xba\xc1\x69\x57\x31\x6e\x4b\xd7\x67\x03\xd2\x45\x5b\x78\xdf\x51\x3c\x91\x32\xbb\x0e\x67\x5c\xcb\x8c\xc9\x25\x86\x97\x8e\x95\x21\x77\x81\x14\x7d\x6d\x89\x07\xf7\x19\xee\x50\x14\x11\x1c\xda\xd0\xb8\xf7\xc6\xe7\x71\xf9\x51\xa9\x76\xa9\x23\x16\x67\x5a\x96\x37\x85\x08\x41\x6d\x53\xf6\x13\xbf\x15\xcc\x3b\xde\xfd\x7a\x25\x21\xac\x1b\x68\xb1\x84\x31\x67\xd7\x7f\x7f\xf3\xf3\x8f\x2f\x98\x16\x00\x0a\x8b\x1a\xd7\x42\x57\xaa\xd4\x02\x75\xd0\xbf\x1a\x51\xcb\x91\xf5\x1b\x47\xd1\xbb\x55\x4e\xb2\x77\x81\x6f\x22\x7f\x2b\x29\x7d\xdc\x6a\x1e\x73\x78\x2a\x51\xd0\xa0\xd1\xcd\xfa\x45\xdb\x9a\x06\xfb\xcb\xdb\xcb\x4f\x99\xd4\x21\x79\x05\xec\xaf\x81\xe5\xdc\xbb\x94\x2f\xfb\x97\xb2\x0f\x10\x5d\xbb\x9c\xc3\x52\x1e\xbd\x32\xb2\xb1\x0c\x72\x8b\x74\x77\xce\x04\x5d\xdd\xab\x3f\x47\x1d\x6b\xd7\xd3\x3d\xb0\xc9\x25\x32\xb6\xcb\xa3\x46\xde\xd5\xf5\x6a\xae\x47\xad\xc5\x2a\xed\xb2\xab\xd2\x42\x8e\xea\xe5\x78\xb5\xd6\x51\x69\x9d\x1d\xf3\x00\x9c\xdb\x4e\xab\xf5\x33\x6f\x84\x82\x0b\x49\x87\xdb\x29\xb8\xb5\x5d\x2d\x3a\x71\xbb\xdf\x01\x02\xaf\x96\x54\x28\x2b\xea\x5c\x45\x87\x46\x4a\x29\x0f\xe7\xba\xaa\x56\x77\x32\xb7\x27\xbf\x25\x34\xec\xc1\x6f\x9d\x49\x68\x84\x76\x05\xa8\x25\x9e\xd4\x64\x49\x7d\x38\x62\x68\x10\x97\x58\xe2\x09\xaa\x56\xcd\xcd\x82\xbd\xbb\xbc\x9a\xb0\x9f\x5f\x5c\x01\x16\x7f\x7f\xf7\xee\x6a\xb4\x76\x1c\xcd\x39\x6c\x3f\x34\x57\x35\x93\x5a\x37\x42\xb3\x42\xde\x8a\xa8\x9a\x56\xa8\xff\xe4\x12\x64\x76\xe1\x6c\x53\xcf\xa1\x90\xa7\xb3\x58\x59\xa6\x4a\xbc\x66\x77\xfd\x5b\x39\xc3\x38\x49\x44\x23\xc6\xc2\x0d\xbd\x43\x84\xee\x00\xdb\x81\x6d\xa0\xb5\xc3\x3c\x7d\xc7\x65\x5f\x75\x94\xaa\x87\xf5\xc7\xf2\x8e\x35\xe8\xc7\x33\x62\x7d\xf3\xab\x8d\x24\x36\x82\x52\xe0\x5b\x0e\x8d\xde\x8f\x0e\xaa\x07\x6b\xc1\xf3\x49\xe8\xac\x15\xce\x47\x79\x58\xad\x90\x4c\x47\xc0\x46\x3b\x04\xba\xb4\xbb\x36\xdc\xd8\xc3\x22\x58\x52\xdf\x35\xb5\x36\x1b\x5d\xa0\xd1\x27\xec\xb7\xdb\xaf\xf5\x54\xaa\xdf\x69\x81\xc7\x8f\xe6\x4d\x99\xa1\xbf\x51\x9a\x15\xfb\x2d\x7a\x04\xef\x62\xc3\x43\x1c\xd1\x79\x5b\x62\x47\x52\x72\xa4\x12\x77\xa2\x74\x3d\x97\x17\x82\x17\x66\xb1\x22\xeb\xfd\xba\x50\xf7\x9b\xf2\x0a\x62\xac\x3a\x9e\xfc\x2b\xe7\x67\xb8\x52\xf9\x4f\xbc\xe4\x37\x70\xed\x46\x25\xb6\xed\x22\x9e\x59\x14\x63\x8f\xaa\x15\x60\xa9\x51\x3c\x7c\x5c\x2f\xb6\x8a\xc0\xd0\x90\xaa\x16\xd0\xba\x0c\xba\x61\x8a\x39\x6f\x0a\xc3\xa8\x4a\xe0\x65\xc1\xb5\xb6\xe6\x00\xea\x5d\x2a\x4f\x87\xca\x4e\x4b\x55\x76\xc3\x20\x86\xf4\x91\xa6\x49\xf5\x58\x6b\x09\x4f\x4f\xc9\xcd\xeb\x94\x8f\x18\x28\x69\xcf\xfc\x55\x2d\x72\x99\x61\x01\x75\x0c\x42\xb2\x32\xbd\xe0\x05\x56\x78\x2e\x57\xcc\x4d\x07\xee\x14\xa5\x0e\x7c\xc6\x85\xb5\x13\x9b\x49\x69\x5d\x51\x32\x12\xd7\x99\x28\x73\x74\x56\xe5\x18\xab\xa4\xea\x5c\x96\xbc\x60\xb2\xcc\xc5\x07\x30\x9a\x63\x46\xb3\xa6\x4a\xe2\x20\x1d\x20\x3b\x6a\x02\xe9\x3e\x76\x19\xe6\xea\xbe\x9c\x7a\x52\x40\x8f\x49\x06\x06\xa0\xba\xf7\xed\xc5\xed\xf9\x9d\x26\x4e\xf5\xe4\xad\xb1\x22\x43\xb7\xb0\x78\x2e\xd6\x10\xf2\xe4\x40\xe1\xc3\x8d\x6e\x3f\x01\x3c\x85\xf0\xf9\x1b\x45\x8c\xc1\x21\x1b\xf7\x04\x82\xe8\x03\xe4\x70\x78\x71\x27\x21\x3f\x36\xc2\x7b\x5b\x61\x4a\xec\xf7\x44\xb2\x8c\x35\x07\x29\xe6\xf4\x46\x81\x21\xc2\x38\xcd\x98\x82\x2b\x21\xa2\x16\xba\x01\x71\x1d\x85\xef\x60\xc5\xf2\x7f\x62\xee\x2e\xc4\xc4\x21\x9a\xb3\x15\xe3\xec\xb5\xca\x45\x9f\xaa\x71\xfe\xe8\xc7\xc6\xed\x10\x61\xe7\x4e\xe7\xfa\x84\xaa\xc7\xab\x1c\xb0\x77\xef\x55\x7d\x8b\xd9\xea\xbc\xb0\xe7\xe9\x99\xc7\x6d\xe4\xa9\xbd\x6f\x5e\x53\xf6\x5a\xdc\xc7\xf9\x2a\x7d\x73\xf7\x86\x2d\x61\x82\x18\xa0\x5f\x78\xca\xbe\xab\x9d\x37\xdf\xff\xde\x5e\xed\x21\xa7\xb4\x02\x65\x70\xaf\xa6\xf1\x73\xaf\x9f\x82\x2d\xcc\x0d\xa4\xc0\xfb\x1b\x8f\xb1\xde\xbb\xd1\x8b\x98\xae\xa9\xe8\x62\x1b\xb6\xe1\x2b\x5e\x1b\xb9\xd6\xb1\x7c\x04\xe6\x56\xa2\xb6\xac\x63\x19\x2f\x79\xbd\xf2\x51\x5c\x70\xe3\xb2\x80\x8b\xe4\xf4\x46\x0d\xe3\x96\xc5\xb2\x2a\xa0\xf5\xa7\xca\x5b\x81\xc0\xa3\x35\xc0\x59\x3b\x6a\xc5\xc7\xb3\xf4\x99\x13\x48\x18\x70\x7b\x2f\x85\x21\xd3\x10\x02\xca\x2d\xde\xb2\x8b\xb1\x6a\x8c\x9e\xb2\x57\x73\x3a\x30\x45\x99\x57\xf7\x0b\x09\xd7\xb4\xe9\xbc\x9c\xaf\x02\x36\x56\x75\x53\x0b\xad\x27\x5d\x85\x55\x0b\x6d\xdc\x5d\xa2\x3b\x87\xa9\xc6\xb0\x3b\xa9\x0a\xee\x6f\x95\x3c\xbe\x2e\x01\x6c\x7f\xcb\xe6\x24\x1b\x4b\x22\x93\x0f\x21\x84\x6d\x51\x83\x8d\x41\x15\x05\x04\x06\xaf\x91\xbc\x7d\x6c\xd5\x01\x21\xb4\xfb\x0d\x46\x40\x62\xa5\x63\x0a\x92\x46\x27\x13\xba\x7f\x4b\x50\x13\x1c\xd2\x84\xc2\x0d\xa8\x15\x0b\x8f\x25\xdd\x56\xe3\xf1\x2c\x15\x7e\xdd\x2a\x3c\x21\xcb\xdc\x4e\x87\x8a\xb1\x63\x84\xb8\x8b\x4c\x01\x42\x20\x86\xee\x27\x90\x6d\xb8\xae\x70\x63\x49\xe7\xaa\xc9\x5d\xc6\xb3\x4b\xd6\xa8\x6a\xa9\x6a\xe6\xa2\x3e\x7a\xc4\x3a\x17\x46\x64\x96\x1c\x52\x63\xb9\x67\x1f\xd8\x29\x4b\x6d\x04\xcf\xdd\x0d\xb0\x8f\xd5\x45\xf7\x5a\xed\x91\xd9\x5e\xc6\xd1\xa6\x38\x91\x9c\x5f\x8a\x9a\x32\x16\xc4\xb5\xbc\x29\x65\x79\xe3\xea\x90\x60\x03\xf6\x8e\xa4\x37\x66\xf1\x7b\xfc\x95\x66\x6b\x1b\xcd\xb7\xc2\x26\xb0\xc8\xc3\xf5\x5b\xf8\x48\x55\xa2\x1e\x25\xa6\x67\x78\x88\x8f\x06\x9d\xe2\xf2\x02\x30\xd8\x63\xfc\x27\xdf\xc3\x59\xbb\x7b\xbf\x27\xd0\xd9\xdc\xb7\x0d\x47\x53\x46\x65\x0d\x5c\x51\x0f\x81\x7c\x72\xf7\x34\x40\x7d\xe2\xa2\xcf\x03\xf4\x04\xf8\x93\x1e\x00\x2e\x14\x98\x1a\xb9\x0f\x0f\x88\xe4\x76\x15\x8d\x26\x6b\x9e\x59\x2e\xd6\xea\x8e\x17\x21\x2d\x69\xcd\xcb\x54\x11\xce\xd7\x87\xd9\x06\xf9\x27\x77\x4f\x77\xc4\x3f\x98\x12\xcb\xc6\x1e\xb2\x49\x91\xa0\xf9\x82\x78\xdf\x58\x5d\x5a\x48\x6d\x26\x2e\xe1\xc2\xa5\x7f\x55\xf8\x67\x9c\x5a\x83\xff\x8e\xda\x43\x6e\x18\xdf\xd3\x28\x4d\xda\x48\x90\x01\x04\x92\x31\x37\x42\x8d\x94\xd1\x68\x98\x67\x63\x72\x0b\x1a\xb3\x48\x19\xd0\x49\x15\x47\xa7\x22\xcf\xb0\xd0\x87\x51\xb7\xa2\xd4\xa0\x7a\xd9\x12\x7e\xc1\xe8\x09\x52\xc1\xfd\xeb\x94\x80\x3c\xcf\xa8\x8c\x90\xbb\xff\x80\x20\x22\xfb\xbd\x3d\x54\x36\xd0\x5d\xde\xca\x3c\x8c\x81\xda\x1d\x46\xd8\x22\x69\xc3\xa1\x4b\x43\xb1\x5b\xb1\x42\xa7\x3a\x40\x82\x5a\x2b\x46\x85\x0b\xc7\xb2\x58\x85\x03\xf0\xf3\xc6\xa8\x9f\xec\x6b\x04\xe4\x1d\xa0\x21\x51\x59\x52\xdf\xb1\x39\x2f\xb4\x98\xb2\x5f\x45\x70\x94\xcd\xad\x31\x73\x8f\x86\xb7\xb0\xb6\x8e\xd2\x6c\x21\x6a\x2a\x2d\xf4\xd4\x17\x74\xb8\x52\xf9\x04\xef\xb0\x2a\x91\x41\x67\xc7\xe7\x6e\x86\x29\x7d\x70\x5c\x1a\xb0\x94\x05\xe3\x9f\xba\x79\x21\x9e\x59\xa8\x65\xe4\x0d\x12\x48\x68\x9f\xb0\xd9\xa7\x1d\x12\xd8\x2d\xc3\xe5\x09\x42\xb9\x99\x75\xc3\x52\x08\x3c\x26\x5b\xd7\x16\x62\x76\x40\x88\x40\x3d\xf6\x6c\x4f\x92\x58\xbc\x50\x01\x75\x51\x1b\x4f\x93\x08\x7d\xf8\xe8\x10\x54\xd9\x15\x26\xd2\xe5\xb3\x3d\xe9\x02\x50\xfe\x88\x84\x79\xb7\x88\xae\x8b\xfd\x85\x30\x6d\x22\xae\xa3\x1f\xec\x2e\x54\x6c\x0d\x54\x41\x54\xc7\x15\xe0\xfe\xa2\x8a\x66\x49\x8d\x83\xb9\x59\x80\x14\x7b\x2d\x26\x22\x65\xb0\x05\xe5\x49\x33\x38\x7b\x0e\xd1\xb5\xdb\x46\xfa\xb2\x4b\xba\x1c\x0b\xcf\x75\x57\x07\x78\x13\x34\xfb\x7c\x1d\x09\x68\xcf\xc2\xb5\xd0\xec\x29\x9f\x3c\x9d\x4d\x9e\xf1\xc9\xb3\x19\x0c\xfa\x2c\x9b\xb2\x57\x25\x19\x9d\xe1\xad\x6c\xf2\x19\x9f\x7c\x36\xf3\x7b\xf6\x67\xd9\x00\x6d\xd2\x06\x58\x11\x6d\xc6\x18\x78\x76\x23\xa1\x1b\xa8\xf7\xb4\x59\x0c\x6e\x26\x8e\x2c\xef\x70\x33\xf9\xc9\x6e\x64\x5e\xfb\x6e\xbb\x8b\xe0\x1e\x41\xd9\x7a\xb8\x75\x80\x92\x07\xa9\x38\xca\xd6\x11\x85\x2e\xf8\xf2\x8f\xae\xc6\x0d\xb6\xca\xce\x82\xb4\xc2\xb5\x23\xdc\xa1\xd7\x82\xe7\x9d\x51\x00\xe1\x09\xab\x95\x32\xec\xf2\x39\x99\x1c\xc1\xfe\x0e\xd7\x48\x71\x17\xec\x90\x37\xea\x56\xb4\x9d\x3b\x8a\x10\xd0\x10\x24\x7c\xca\x9e\x17\x05\x2d\x11\x40\x0b\x65\x4a\x16\xa9\x2d\xe6\x0a\xfd\xb5\x31\x5b\x7a\x40\xc1\xe9\x12\xaf\x17\x24\x06\x5a\xd2\x9e\x20\x07\x12\x14\x98\x0a\x9d\x00\xae\x6a\xf5\x4f\xca\xc8\x4a\x39\x6e\x8f\x20\xe4\x46\xbc\x43\xf9\xc5\x7b\x54\x20\x03\x14\x40\xc2\xd3\x7d\x04\x0b\x8a\x87\xec\x26\x60\x61\x30\xdd\x67\x12\x8d\xf0\xad\xc4\xc2\xb6\x01\x9a\x55\x4e\x03\x6b\xaf\xf7\x9a\x6b\x8b\xc5\xe7\xd8\x1b\xee\xf7\x0c\x16\xfe\xdd\x8a\x26\x78\x83\x8d\xb7\xcb\x3d\xb7\x85\xe9\x57\x23\x68\x83\x1b\x9f\xee\x7c\xea\x2e\xe9\xe3\x2a\x3c\x41\x1c\xf3\x5c\xe4\xf6\x3c\xac\x17\xea\xde\x57\xb2\xc0\x6c\x6b\x48\x6e\x9e\xb2\xab\x38\x28\xb9\x05\x3a\x2e\x1b\x03\xa5\x7e\xec\x89\x19\x6b\x54\x99\x95\x2f\x51\xe4\xaf\xd7\xdb\x94\x88\x3f\xf7\x2a\xb7\x0f\x7b\x80\x4d\xf7\x9a\x49\xe1\xa1\xce\xcb\x45\x11\x47\x7e\xba\x90\x01\xcc\x65\xe6\xc1\x3f\x16\x4d\x70\xac\x89\xbf\x49\x38\xfe\xab\x99\x89\xcc\x14\x13\x76\x63\x97\xc9\x4c\xa9\x5b\xc6\x2b\x7f\x6f\xdb\x23\x1d\x59\x21\x7f\x77\x5f\xb1\xac\x90\xa2\x34\xec\x87\xbe\x6f\xdb\xa5\xc4\x29\x69\x91\x2e\xeb\x9d\xcf\x3a\xfe\x60\x9c\xbb\xba\x7f\xb0\xb4\xe0\x18\x2f\x19\xbf\x29\x17\x4a\xdb\x05\x27\x97\xbc\x5e\x51\x3a\x37\x1e\x04\x9f\xf9\xa7\xce\x8d\x3c\xb1\x9a\xb5\x34\x10\x5d\x16\xa0\x46\xbf\xfa\xd5\x6a\xdf\x48\x41\x93\xdd\xd2\x7d\x1e\x32\x8d\xa8\x38\xfd\xcf\x9a\x0a\xc0\x24\x30\x27\x41\x8a\x40\x12\x20\xef\xde\x55\x13\x10\xa5\xa9\x57\x61\x07\xea\xe5\x12\x15\xec\x80\x8f\x83\x17\xb4\xf5\x25\x55\x68\x42\xb8\x84\x20\xbc\x3c\x65\xcf\x23\x50\x73\x7b\x32\x03\xe1\xb3\x1c\xb2\x6b\xcc\x97\x5b\x75\xfb\x05\x94\x71\xb2\x48\x1a\x91\xb6\x03\x0b\xad\x33\xa1\xb0\x09\x1f\x63\x3e\xdc\xa2\x24\xb9\xff\x1d\x14\x4f\x0c\x33\x71\xee\x10\xf0\x12\x8c\x91\x4c\xf7\x27\xaf\xe4\xb9\x4f\xc9\x77\x82\x09\x20\xe5\x9c\xdd\x41\xe7\x7f\x49\x71\x24\x7e\x12\xbc\x92\x21\x8d\x7f\x53\x7c\x50\x53\x32\x9a\x82\x9d\xfc\x8d\x30\xc9\xe7\x13\x7b\xca\xad\x5c\xb1\x4e\x12\x53\xd2\x21\x22\xf7\xaf\x85\x78\x87\xb3\xbb\xa7\x67\x54\x67\xec\x90\x44\x44\xcf\x18\x93\xe5\x5c\x6d\x49\x40\xfa\xf4\xdc\x7e\xda\x21\x60\xc8\x2b\xf2\x36\x51\xad\x0a\x56\x15\xbc\x14\xa1\x63\x71\xb0\x65\xa1\xf2\x69\x02\x71\xd3\xd2\xe7\x45\xd1\xa6\x6f\xfc\x7d\x3f\x7d\xe3\x37\xc8\x83\x42\x04\xb7\xa2\x1c\x25\x43\xa5\x08\x53\xa8\xe9\x4c\xf8\x08\xd4\xc3\x71\x00\x67\x35\xc3\x64\x62\x55\x63\x5b\xf7\x6d\xf8\xe0\x01\xb4\x79\x70\xdb\x7a\x01\xcf\x3b\xb5\xc4\xb2\x23\x85\xb8\xe3\x50\x3a\x2b\x14\x74\x9b\xc3\xf0\x78\x3b\x33\xc2\x62\xc6\x84\x9c\x58\xb3\x46\x09\xdd\x58\x63\x3a\xe8\x15\xa7\xf0\xda\x58\x87\xbc\x18\x22\x72\xb4\x8d\x5a\x0a\x4c\x82\xdd\x3b\xa1\xc0\xc7\x09\x65\x91\x41\x79\x2a\x08\x38\x8d\x27\xc1\x51\xe2\x9c\x8e\xea\x8e\xc8\x54\xc9\xea\x6c\x12\x74\x6d\xa9\x72\x04\x16\x2c\x6c\xc2\x85\x17\x5a\x85\xe2\x79\xcc\x95\x2d\x8d\x86\x3b\xa4\x20\xc8\xf9\x7c\x7d\xe2\xd9\x5a\x29\xb0\x5f\x0f\x4a\x80\x7d\x68\x4d\x07\x4a\x12\x86\x1f\x30\x74\x13\x98\x1e\x46\x1d\x9d\x9e\xd4\x4a\x00\x66\x0b\x63\x2a\x1f\xab\xf8\x02\xcb\x92\xe2\x45\x2f\x5f\xf6\xa7\x0b\x07\x2c\x0c\x7e\x37\x61\xb3\x46\xaf\x66\xea\xc3\x94\xbd\xb0\x08\xab\x39\x2b\xe4\x5d\xe7\x63\x57\xf4\x34\x8f\x1f\xf8\x4d\x27\xae\xb1\x18\xcd\x72\x26\xcc\xbd\x10\x25\x02\xc4\x93\x15\x01\x41\x94\x47\x18\x4f\xa3\x55\xaa\xab\x0f\x4a\xe2\xd5\xdf\x98\x6e\x4b\xf6\x8a\x0f\x95\xd2\xa2\x65\x40\x79\x3d\x4a\x0b\x77\x2c\xef\xa0\x74\x33\x79\x4e\xdc\x02\x8d\x22\x45\xed\x79\xb9\x36\xec\xcb\xcf\xbe\xfa\xab\x33\x50\x68\xce\x6e\x65\x29\xd7\xc9\xb3\x65\x51\xf5\x4f\x55\x33\x28\xd4\x57\x1b\xf6\xf4\xd9\x67\x9f\x4f\xd9\x2f\xbc\x90\x14\x4f\x1c\x85\xf8\xf7\x7f\x6b\xb7\x88\x80\x1a\x94\x9a\x21\x38\xde\xf8\x30\xbc\xb6\xca\x1f\x1e\x48\x1d\xfb\x60\xec\x0c\x26\x8c\x6e\x0f\xb9\xe9\xa0\x1b\xc3\x6e\xcd\xb4\x67\x96\x4e\x7d\xc2\xa7\x70\xf3\xe6\x2d\x3c\x1a\xfd\xd9\x67\x9f\x7f\x81\xee\x7b\xf7\xc4\x1d\x4f\xba\x53\xb0\xef\x7a\x37\x4c\xff\x34\xb6\x9e\xc2\xe1\x74\x11\x06\x89\x37\x43\x97\xcb\xeb\x24\x95\xe2\xcb\x93\x3a\x19\x3e\x68\x1d\x6f\x18\xfd\xb5\xc5\xb8\x84\xd8\x34\xf9\x23\x34\xcf\xa7\x23\x20\xd5\x37\xbe\x8d\xc7\x3f\x83\xd0\x5f\x5e\xe6\xa1\xac\x6b\x91\x9c\x17\x7d\x5a\x6d\x19\x32\x19\x9e\x07\x20\xc8\x89\xfc\x0c\x15\xce\x79\x41\x37\x1b\x94\xa8\x1f\xbb\x79\x5c\xc8\x77\xdb\xdd\x88\xc3\xf9\x12\x51\x3c\x07\x73\xdb\x4a\x99\x68\xe1\x8a\xff\x7d\x7e\xe6\xa4\xb6\x16\x4b\x75\x17\xd1\x6c\xba\x19\x2d\xda\xae\x4a\x85\xeb\x98\xdc\x41\x21\x60\x16\xc7\xa1\xce\xc4\xf8\x87\x25\x28\x0c\x74\x48\x6b\xb2\x50\x37\x7d\x59\x16\x6b\xc5\x45\xdd\xf4\xd7\x3a\xc5\xa2\x5a\xbe\xab\xf4\x5c\x16\xd6\x4e\x85\xd7\x77\x11\x1b\x4c\x81\x71\x59\xd4\x37\xa2\x14\xb5\x15\x22\x0b\x0f\xe2\x8b\x6a\xba\x2a\xb7\x5f\x45\x85\x6d\x29\x8a\xc9\x9f\x78\x0a\x75\xc3\x0a\x59\xda\x23\x92\xb5\x0d\xec\x9f\x24\x69\xc4\x0b\xbd\xe6\xa8\xe4\x2c\x90\x9c\x8e\x47\x85\xba\x8f\x98\x0b\x53\x3b\x37\x5c\x16\xdf\x3e\x3d\x73\x24\xf1\x88\x72\x67\xcf\x52\x8a\xad\x45\x62\x12\x0a\xaf\xda\x3f\x9d\xd7\x03\x7e\x54\x37\x11\xe8\xf3\x73\x68\x52\x70\x3e\x5b\x19\xa1\xfb\xa1\x53\x2a\x96\x7d\x83\x46\x0a\xdf\x03\xe0\x73\x42\xcd\xfe\x43\x2e\x85\x36\x7c\x59\x75\xe0\x38\xcc\xc8\xfd\xe6\xdf\x93\x25\x7b\xfb\xfd\xe5\x67\x9f\x7d\xf6\x57\x86\xa6\x13\x80\x8c\xf0\xd3\xb2\xcc\xc4\xb7\x4f\xb5\x47\x8d\x66\x0b\x44\x41\xcd\x57\x0b\xf4\xcb\x3f\x65\x1a\x7a\x37\x30\x55\xe4\xa2\x46\xff\x67\xa9\xee\xfb\x21\x3e\xfb\x7c\x31\x0a\x64\xce\x57\x5d\x78\x07\x5a\x15\x95\x6b\x53\xc2\xcb\x52\x99\xed\x35\x2a\x7e\xef\x13\xc5\x72\x07\xc7\x17\xea\xf4\x79\x48\xf6\x04\xb9\xd1\x0c\x00\x61\xef\xec\xff\x98\x90\x37\xd4\x44\xd7\xa7\x1e\x61\x74\xb2\xcb\x5c\x21\x7d\x9c\x2a\x60\x40\xd7\x2b\xe0\x36\xc2\xb8\x3f\x86\x1f\x92\x7e\x41\xe8\xc5\xb3\xcb\x9f\xb0\xf3\x19\xb3\xe1\x04\x16\x7b\x13\x9c\xdb\x2f\xa6\x87\x65\x1f\x16\x64\x9c\xc7\xe9\x83\x41\x11\x34\x65\x2e\xea\x35\x26\xc7\x01\xf5\x21\xc5\x20\x6d\xc9\x6f\x17\xb9\x94\xee\xa1\x6e\x89\x9e\xfb\x8d\xc7\x1d\x9d\xce\xce\xf4\xc8\x9c\x4c\x62\x89\x67\x15\x8d\x74\x86\xdb\xb2\x8f\xfa\xf1\x59\x4b\x18\x39\x04\xc5\xad\x80\x4d\x51\xa1\x0e\x4b\x3f\xca\xa7\xc2\xd8\xa6\xb0\x1f\xa6\x97\x72\x6e\x6f\x3d\x9f\xbb\xdd\xca\xa8\x2e\x06\xe8\x04\x45\x26\xcf\x95\xb5\x0d\x80\xc5\xe7\x64\xe9\x22\xb7\x5c\x18\xea\x3b\xaa\xdc\x1e\x65\x81\xfa\xde\x03\x29\x75\x60\x16\xf6\xd5\x90\x18\xe7\x11\x3f\x24\x9f\x1b\x28\x22\xb1\x2d\x9f\xf1\xab\x4e\x83\x45\xfb\x1b\x56\x6b\x26\x47\x36\x90\x19\xae\x23\x5d\x09\x70\xa9\xd9\x6b\x71\x27\xea\xed\x39\xde\x94\x67\xad\x1c\xb5\x4a\xe5\x13\x57\xee\x06\x87\xb2\x13\x00\x1b\xd4\xf5\xce\x89\x77\x16\x8b\xb5\x33\xae\x28\xc3\xbe\xf5\xb3\xfd\xbb\x8e\x9d\x26\x38\x25\x50\xb9\x34\x57\x10\xb5\xc0\x21\xbb\x6d\x74\xe5\x07\x4e\x8f\xbe\x7d\xcf\xa1\x79\x86\xde\xdf\x73\x2d\x73\xc1\xf2\x7a\x75\x6e\x27\xd0\x1f\x9e\xbf\x8e\x87\x7d\x50\x5a\xa7\x70\x98\xa6\xa3\xbf\x35\x08\xdd\x7b\xb4\xb0\xaf\x36\x67\xe1\x43\x44\x50\x2f\x2b\x21\xf0\x27\xeb\x74\x3d\xea\x21\x9d\xbf\x43\x24\xae\x4d\x68\xb9\xb4\xa0\xe2\x66\x63\x01\x9d\x57\xec\xff\x4c\xa7\xd3\xff\xcb\xce\xcf\x09\xe3\x6f\x71\xb6\x67\xb1\x81\x94\xa6\x86\x86\xd1\xed\xa2\x8b\xa4\x89\x93\x73\xbb\x4d\x2b\x51\x5a\x7d\x4e\x69\xc4\x29\x9e\x38\x37\x6b\xd3\xe2\xe2\x3d\xe4\x19\x7d\xb8\xa2\xec\x3a\x66\xb7\xea\xca\x12\x83\x35\x94\xd7\x05\x17\x38\xed\x8c\xe0\x63\x13\xf9\xa6\xc5\xd9\xcb\x55\x1a\xe3\xac\x73\xa7\x04\x25\x65\x27\xad\x5a\xb2\x13\xc6\x7e\x90\xc6\xae\x72\x69\xf0\x22\x43\x98\xcc\x69\xe4\x4b\xc4\x3e\xbe\xd4\x75\xd5\xda\xed\xdf\x6e\xc4\x34\x26\x03\xf2\xce\xca\x12\x42\x4c\xd5\x01\x97\x5b\x55\xab\x0f\x2b\xa6\x55\x76\xdb\xdb\xc7\xbc\x8f\xec\x57\xf8\x09\xa2\xdd\xaa\x75\x75\x7e\xde\x94\xf2\xc3\x39\xc2\xfb\xf6\x09\x5c\x4d\x8f\xb2\x7b\xb8\xc3\x04\xc1\xaa\x92\xcd\x56\x5e\xe3\x84\x55\x60\xdf\x71\xc7\xac\x64\xa8\xff\x4f\xab\x28\x72\xe4\xff\x9f\xa2\x23\x9a\x12\x76\x03\x5c\x0b\x14\xef\x99\xf1\x4a\x2b\xba\x37\x00\xd5\x0e\xfe\xb2\x6f\x9e\x3c\x29\x54\xc6\xad\xfd\xf5\xcd\xc5\x13\x5e\xc9\x70\x5a\x4d\x80\x61\xd2\x14\xe6\x03\x33\x6e\x98\x65\x88\x01\xa5\xe9\x25\xd2\xd4\x78\x3f\x79\x50\x6e\x01\xa5\xff\x47\xd4\x63\x6f\x06\xd6\x31\x0c\x21\x12\x41\x7d\xdc\xed\xc5\xae\x4c\xf3\xa8\x8d\x60\x9f\x7d\xf7\xdb\x0b\x6a\x10\xb7\x13\xb7\xac\x00\x90\xec\x4e\x3b\xec\x09\x61\xe1\x23\x58\x74\x60\xe3\x72\x67\xbf\x22\x85\xd0\xbf\x10\x4b\x35\x70\x2b\x9b\x9e\x06\xe2\x5b\x9c\x62\x84\xdd\x11\xbb\x1a\xf1\x68\x11\xf6\x77\x32\x2d\x6f\xa0\x89\x0f\x79\x8c\x2f\x9d\x06\x5a\x37\x28\x1e\x0c\xd8\xb3\xa8\xb8\x59\x5a\x17\x2b\x58\x9e\xda\x70\xe8\x6d\x15\x8a\x23\x04\x17\x71\xd4\xfe\x27\x7c\x49\x10\xc1\xef\x46\xe5\x18\x07\x3c\x92\x78\xb5\x2a\x35\x7b\x76\x48\x6b\x04\x32\x9a\x0e\xcd\x52\x57\xe5\x70\x60\x26\x7f\x32\xd1\x32\x31\xe4\xd0\x24\x8e\x68\x72\xc0\x3e\x9d\xb2\xd7\xe3\x51\xb3\xd6\xee\xd3\x0d\x10\x9f\x6d\x0d\xf1\x00\x82\xf6\x5a\xdc\x63\x59\xff\xb8\x87\x31\xc5\xe9\x4c\xe0\x3d\x74\x7f\x81\xfb\x50\xcd\xa9\x21\x40\x8f\xe4\x59\x44\x6b\x08\xbf\x07\x9a\xfe\xee\x9a\x05\x40\x7d\xfc\x56\x1d\xb5\x10\x2a\x9f\x80\x1c\x2d\x77\x29\x32\x68\xb0\x52\xa7\x82\x10\xb4\x86\xe2\x23\x42\xcb\x82\xd8\xf1\xe9\xe3\x66\x5e\xbf\x79\x07\xa1\x41\xac\xa9\xf0\xac\x53\x44\x5d\xc7\xf0\xe3\x31\xf6\x65\x6b\xf6\x4f\xe8\xcb\x1d\x89\x4d\x3e\x37\x00\xb2\x1b\xa9\x45\xda\xa4\x00\x20\x39\xa7\x33\x54\x64\x14\xf9\xc4\x19\x2b\x58\x4b\xc1\x97\xe2\xb6\xa4\xa1\xb6\x65\xe3\xd8\x51\xba\xfe\x12\x9e\x0d\xfd\x5c\x88\x8a\x49\x92\x96\x40\x93\x5e\xdc\x5b\x63\x9e\x9c\x96\x68\x3b\xa7\x6d\x03\xe9\x28\x61\x5f\x6a\x81\xa3\xaa\xda\x91\x53\xc2\x45\xd8\x48\xa1\x37\x02\xc4\xd7\x5a\x20\x3b\x91\x55\xaf\xdf\xbc\x73\x69\x6e\xa7\x91\x92\x17\xaf\xaf\x7d\xfc\x45\x0f\xf7\x4b\x61\xee\x55\x7d\xfb\xbb\x7d\xcf\xe7\xde\x91\x81\xf1\x44\x98\xec\x89\x35\x1b\x35\xc4\xf4\x48\xba\x02\x04\x3a\x50\x40\xc7\x6f\x3f\xca\xb2\xf9\xf0\xa6\x2c\x56\xbf\x8f\x58\x72\xa9\xcb\x3c\x2e\x1b\x05\x47\x41\x1f\x65\x17\x3a\x91\xa9\xe2\x2e\x0c\x96\x53\xa0\x8a\x43\xc6\x65\x7a\xdf\xfa\x80\x8a\xa9\x8f\x37\x97\x3c\x42\xbf\x43\xcd\xcf\xbb\xd4\x24\x42\x3c\xc9\xcb\x7e\x12\xda\x99\xbf\xfc\x60\x44\x5d\xf2\xe2\xb5\x3d\x37\x52\x2c\x5d\x9f\xf6\x5a\x47\x54\xfb\x53\x07\x96\xbf\x62\x1d\xdd\xb9\x33\x2a\xe3\x23\x22\x48\xd3\x44\xa3\xb7\x09\xe9\x2e\x95\x78\x9e\xd7\x42\x3b\x6e\xc2\x35\x20\xc2\xb3\x64\xbb\x7c\xfd\xfc\xa7\x97\xe4\x8b\x8d\x41\xe3\x96\x11\xbd\x1c\xb2\x0b\x71\xf1\xfb\x91\xfd\x70\x0a\x5b\x6b\xbc\xbe\xa6\x98\x30\x27\x3d\x3e\x4c\xe3\x92\xfc\x65\xd1\x5d\xa6\x59\x55\x22\xb4\x9c\x4b\x10\x30\x8a\x51\x8a\xdd\xab\xab\x49\x77\x38\x3b\x8e\xef\xe9\x89\xc0\x66\x68\x3d\xdb\xb5\xf5\x9c\xd5\x22\x53\x75\xde\x15\x86\x9e\x0a\x38\x9b\x84\x21\x22\x28\xb3\x12\x66\x1f\xed\x28\x07\xe0\x7b\xb6\xff\xf8\x3b\xc1\xd9\x72\x4d\x79\x99\x58\x08\x9e\x43\x55\xb6\x44\x38\xe8\x6e\xaf\xdb\xe2\x15\xef\xe7\x5c\x4a\x68\x1c\x4a\xe8\xaa\x77\x51\x2b\x53\x37\x3f\x57\x4c\xaf\x99\xe5\x6a\xc9\x5d\xaf\x23\x1e\xc6\x2b\x13\xf9\xf3\xb1\x79\x2d\x19\x94\x46\x33\x28\x2d\xca\xac\x69\x85\x9e\x23\x02\x58\x12\xc0\x7b\x51\xc0\x35\xa2\x1f\x39\xb0\xd1\x45\x27\x3a\x6e\x62\xbf\x22\x6e\x70\xf0\x03\x73\xd6\x4f\x75\x5f\xd6\x5e\x7b\x9a\xfd\xdb\xf2\x32\x0c\x75\x42\x66\xea\xfd\x54\xb4\xd7\xca\xe3\xb6\xb5\x0e\xd3\xda\x7b\x5c\x3b\x5c\xa3\x45\x4e\x24\x07\x39\x0e\x7c\xbd\x6d\xf7\x91\x28\x73\xe8\x42\xa9\xa3\x6b\xb2\xbe\x81\x78\xb9\xc2\xeb\xb3\x10\x43\x00\xcc\x0d\x51\x67\xe0\xf0\xec\xdf\x1d\x62\xc5\x69\x31\x71\x1d\xbf\xdc\xf5\xf2\x8b\xd7\xd7\x21\x49\x64\xc4\x71\x61\x13\x83\x76\xb3\x4b\x1c\x7f\x62\x43\xe4\x51\x59\x1e\x2f\x5e\x5f\x1f\x80\x38\x57\xff\x78\xf1\x3a\x91\xc3\x91\x64\x8a\xf7\x43\x2c\xd4\x6d\x24\x2f\xa2\x25\x0a\xdc\x6b\x43\x66\xf1\xbe\xb3\x29\x2d\x7d\x58\x51\x41\x80\xa3\xfd\xb0\x08\xbb\xbc\xef\x57\xe6\x17\xd4\x3a\xa5\xd2\xc5\xd7\x19\x10\xd2\x9f\x5b\x65\xdd\x5d\x17\x6c\x16\x05\xc4\xc7\x1b\x3e\xde\xec\xbe\xfd\xc5\x1b\x00\xf1\x4c\xbf\x61\xcf\x35\xfb\x55\x96\xb9\xba\xd7\x8c\xba\xf0\x15\xab\xb4\x0a\x90\xef\x7c\x00\x18\xc2\xd5\xe5\x3f\x5e\xbc\xd6\xdd\x74\xe7\xaf\x76\x58\x01\x8d\x36\x6a\x69\x05\x0c\xdd\x1a\x23\x79\xec\xb3\xcc\xc9\x17\x02\x44\xb4\x92\x6c\xdf\x01\xfe\x52\x8f\xe5\x2d\x7c\x2f\xb0\x43\xbc\x78\x7d\x4d\x45\xd9\xb8\x66\xaf\xa1\xa0\x45\x99\x3b\x2c\x2d\x70\x3f\x22\xe6\x29\xe0\xf5\xcf\xca\x69\xf3\x78\x68\xbc\x8c\xe1\x75\xb6\xc0\x9c\x2e\x62\x21\x6e\x2b\x69\x61\xc2\x99\x88\xaa\x8e\x63\x64\x30\xd5\xa5\x04\xa8\x9d\x71\x43\x80\x55\xb8\x52\x88\xee\x81\xf7\xe3\xcb\xab\x12\x6a\xbd\x0c\xd4\x81\xf0\xdc\x88\x5e\xeb\x70\xc5\xd5\xc4\x88\xdf\x09\x45\x1f\x46\x58\x75\x67\x74\xfb\x6c\x28\x5d\x65\x5d\xd9\x87\xf1\x55\x1f\x3a\xf0\xb6\xab\xf9\xd0\xf9\x7c\x6d\xc5\x04\x89\x73\x17\x63\x0a\x32\xf4\x21\xb6\x25\xf0\xde\xea\x0b\xdd\xca\x0b\xd1\x6d\xe2\x16\xd5\x17\xfc\x70\xed\x1a\x13\x30\x6a\xa2\x24\x5c\x1c\x85\xeb\x4f\x31\xa6\x26\x82\x13\x46\x1a\x66\x40\x20\xb1\x24\xca\x38\xa9\xf4\xef\xb2\x4d\xb2\x09\x6f\x62\x96\xff\x76\x95\x49\xce\x0f\x2e\xa2\x03\x10\x8f\x25\xa4\xe7\x31\x6b\x33\x4b\x86\x58\x9c\x0e\x22\xaa\xdd\x21\x46\xcb\x2b\x86\x2d\x6c\x5f\x2d\x64\x07\x79\x03\xc4\xba\xde\x45\x37\xcf\x09\x93\xa5\xa9\xf1\xda\x7f\x61\x4c\xb5\x4e\xfc\xc2\x57\xec\x87\x9a\x97\xd0\x00\xfc\x72\x21\xb2\x5b\xfd\x0d\x46\x20\xb8\x66\xa9\x54\x0a\x0a\xeb\xf7\x5a\xf0\xe7\x95\x4f\x6c\x5e\x2e\x9b\x92\x9c\xe9\xdf\xc0\x88\xec\xb7\xd7\x2a\x17\xb1\x3c\x8e\x3e\x48\x29\x6d\xc4\x07\x91\x85\xd0\x10\x6b\xfe\xf1\x0a\x4b\x64\xce\xed\x8e\x5f\xa0\x9f\xc2\x64\x90\xc7\x07\xf7\xe4\xda\x1d\xb2\x28\x83\x00\x52\xe4\xae\x1c\x04\x48\x77\xe3\x99\xc1\xe8\xec\x7b\x31\xa3\xeb\x3d\x48\xaf\xb3\xf6\x08\x46\x75\x63\x60\x59\x6d\x34\xfb\xfa\xe2\xeb\x0b\x34\x58\xb3\xca\xfb\x8b\xbf\xbe\xf8\xfa\x29\xfc\xd8\xe4\x95\xd7\xce\xee\x52\x93\x6c\x9b\xaa\x56\x1f\xa4\x48\x6a\x74\x33\x55\x46\x21\x17\x69\x33\x9e\x52\xe5\xce\x01\x19\xe2\xcb\x45\xe6\xee\x28\x02\xa6\xad\xa0\xe2\x1a\x02\xd9\x38\x92\x1a\xc4\x91\xee\x53\xc0\xf6\xc7\x20\xb7\x04\xa7\x55\x64\x75\xd1\xe2\x70\x96\xb2\x0b\x03\xa0\x8b\xce\x9e\xed\x7d\x9a\x26\x70\x23\x39\x5d\x83\x0c\xe0\x87\x0f\xf0\x51\x84\x5a\x7c\x32\x01\xfc\xac\xa9\x22\xcb\x56\xe4\xd0\x92\x7f\xa0\xfe\xb1\x10\x86\x1a\x7c\xae\xb5\xd0\xd6\x32\x87\xc4\x37\xe8\xce\x05\xe1\x79\xf2\x5f\x4d\x70\xde\x74\x0f\x33\x13\x58\x3c\x5f\x77\x17\x0f\x56\x7b\x8e\xf5\xc0\xa8\x95\xd3\xe4\x27\x5e\x38\x4d\xfe\xe7\xba\x39\xcd\xba\xb1\x94\xfe\x73\xd9\x1c\x67\xd9\x58\x9d\x34\x71\xd1\xd2\xf9\x5a\x27\xeb\x4e\x4b\xc8\x02\x5d\xbf\xf5\xc4\xa7\xe2\x3f\x97\xd3\x47\xb2\x0d\x61\xb0\xb8\x87\xa5\xcd\x5f\xaa\x5a\x19\x95\xa9\xe2\x5b\x93\x55\x9f\x32\x9f\xf0\xb1\x61\xd1\x6d\xbd\xe0\x92\x9c\xfc\xde\x45\xb7\xcb\x82\xc3\x24\x11\xbf\xe8\xa2\xda\x8a\x52\xb3\x25\xaf\x6f\x45\xce\xbc\x9c\x32\xc8\x49\x80\xfb\x04\x5a\x12\xbe\xa4\x18\x5a\x9b\xc0\x3e\xe4\x16\xe4\xb5\x56\x05\x37\x56\x88\xa9\x85\x02\x79\x43\x46\x78\xb0\x3e\xc2\x35\x0d\xbb\xe2\x9f\x4b\xfa\x8f\xb5\xa4\x9b\xfc\xcf\x25\x7d\xaa\x25\x0d\xd1\x97\x13\x4a\xa8\x6b\xf9\x60\xd7\xad\x64\x8c\xda\x0c\x75\x34\x22\xa7\xfe\x87\x95\xaf\xec\xc3\xd3\x7a\x26\xb0\xb8\x36\xc5\x6e\x42\x8f\x21\xb8\xf7\x80\x14\xfb\x96\xd8\x18\xc5\x64\x79\xa7\x6e\x05\x63\x4f\x00\x69\x87\x2c\x23\x89\x72\x1c\x7e\x02\x42\xfe\x84\x62\x2e\xa3\x5a\xe6\xbe\xf4\x95\x15\xfd\x82\x92\x67\x89\x61\x1e\x98\x13\x34\x90\x1a\xab\x03\xb6\xb8\x00\x80\x21\x87\x2a\x97\xf9\x11\x0a\x6e\x44\x99\xad\x26\x50\x59\x4b\x2f\x54\xd1\xdb\x6a\xca\xd3\xbb\xfd\xbd\x76\x00\x1c\xe1\xa9\xea\x1a\x78\x2c\x16\xf2\x66\x63\x60\xf3\xdb\xa6\x64\x4f\x2f\x2e\x98\x34\xde\x45\xe4\xca\xff\xf6\xf4\x15\x8a\x93\xbf\xe1\x96\x85\x37\x54\x2a\x90\x92\xf0\x97\x82\xfb\x76\x96\x50\x2e\x59\x1a\x66\xf8\x2d\x5d\x4c\x78\x2f\x55\x6c\xc3\x3a\x23\xd9\x93\xc4\x27\xf9\xc7\x6f\xb9\xb4\x12\x5f\x4f\x05\xf4\x96\x86\x76\xc0\x84\x37\x68\x3d\x5e\x19\xf0\x1b\xdb\xe1\xd2\x79\xf9\x6e\x55\x28\x49\xe9\x77\x1a\x57\x1b\x35\x4e\xb1\x8a\xe3\x8b\x0b\xb3\x98\xb0\xbf\x5e\x98\x05\x60\xf8\xd7\xbf\x9a\x05\xab\x44\x9d\x89\xd2\x48\x1a\x9d\x62\xb0\xbc\x26\x11\xb5\xe7\x86\xaf\x80\x87\x1d\x7d\x58\x21\x67\xa2\xc6\xe6\xd1\xc2\x44\xbc\xb6\xc4\x7e\x76\x81\xd4\xb1\x23\x46\x43\x78\xcd\xff\xc5\x45\x88\xd0\xf9\x6b\xfa\xce\x16\xe2\xe8\x2a\x37\x11\x86\x03\x82\x39\xf1\xc9\x4e\xab\x4a\x4c\x42\x60\x86\xa5\x4c\x1c\xdb\x32\x42\x46\xfb\x32\x73\xb3\x10\x19\xe2\x23\x42\xc2\x20\x2e\x89\x39\x09\xa2\xd9\x32\x76\x46\xcd\x11\xb2\x07\x3a\xf5\x6b\x66\xcd\xe5\x04\xde\x5a\xad\x18\xd7\x54\x30\x37\x9d\x79\x12\xdd\xf2\xb3\x0f\x0c\x4b\x23\x5b\xd6\x12\x8b\xe1\x05\xb9\x01\xe9\x87\x58\x1c\x0a\x9e\x81\x34\xdf\x38\xd2\xc7\x61\x4b\x1e\xe7\xfe\x8b\x94\x64\xf3\xf2\xb2\xb6\xb0\x06\x86\xd6\x2a\x93\xb0\xf3\xf7\x90\x60\x30\x84\x08\xfd\xa9\xaf\xae\x7c\x10\x11\x44\xb5\x9b\xa6\x2e\xd3\x4b\x37\x88\x19\x84\x1a\xb5\xe1\x92\x1a\x56\xad\x2b\xfe\xe0\x1a\x8f\x25\x93\x1a\xd1\x54\xa1\x25\xa6\xe3\xc4\xf3\xe5\x50\x1c\xd1\x21\xc5\xb3\xc3\xc9\x78\xa0\x5d\xc5\x33\x06\x3a\x49\x28\xe8\x08\x07\xd7\xcd\xad\xb5\x91\xd4\xd5\x04\x51\xf5\xf5\x13\x3b\xf2\x19\x2b\xcf\xce\x3c\xda\xc4\x62\xc8\xef\xa5\x82\x7b\xd0\xe4\x4d\x10\xd3\x49\xb4\x32\xc0\x56\xfa\xfa\x22\x8e\x2b\x81\x9f\xac\xaa\x7a\x77\x79\x65\x7f\x77\x26\x5c\x52\x9e\x6e\x8d\x44\x8f\x5a\x79\xd4\xe0\x30\x10\x22\xde\x97\x99\x8a\xec\xe0\xd7\x2e\x16\x26\x80\x52\x65\x10\xcd\x18\xeb\x93\x89\xa6\x3d\x90\x5c\x61\xe6\xca\x51\x25\xd3\x8d\xf3\x11\x0b\xa6\x9b\x02\x55\x87\x1f\x23\x78\x93\x8e\xe4\xf9\x57\x52\xa9\xa3\x4b\xbd\x58\xf2\xfc\xe1\xcb\x93\x02\x82\x95\x6b\x34\x3c\xcf\x34\x43\xf1\xa1\x7e\x05\xb0\x87\xfb\x29\x46\x5c\x65\x88\x47\x10\x39\xaf\x6b\x23\x7a\xd4\xaa\x89\xb6\x0e\x57\x95\xbd\xab\x9f\xbd\x5c\xa3\xf1\xdf\x27\xdb\x98\xa4\x17\xc9\x37\xbd\x70\x05\x66\x6c\x02\x10\x2a\x51\xf5\x43\x4d\xa6\xe8\x66\x73\xb4\x45\xe1\x85\xf3\x88\xd6\x44\xc2\x92\x03\x19\x13\x9e\x30\xdb\xd8\x12\x87\x90\xab\x96\x4c\x25\xba\x6f\x8c\x5c\xf5\x2c\xb9\x91\x94\xda\xcf\x5c\x69\x2f\x33\x98\x46\x62\xa7\x04\xd1\x8d\x2c\x96\x90\x7e\x1c\x54\xfe\x24\xb4\xfc\x04\xa8\x9e\x34\x61\xad\x80\xa4\xe6\x63\xac\x9c\x21\x0b\x07\x6f\xca\x1f\x8f\x95\xe3\x27\x19\xea\xf5\xef\xb4\x40\x9c\x40\x3b\x47\x9a\xc5\x3f\x61\xbb\x9b\xe0\xc8\x85\x61\xb5\xac\xc7\xcd\x17\x29\x03\x75\x24\xa0\x42\x29\x28\x18\x09\x9d\x80\xb0\x0a\x01\x25\x98\xb9\x50\x72\x6a\x50\x41\x29\x9f\x3d\x31\x7a\x1c\x64\x06\x84\xa0\x3d\x90\x8f\x31\xa5\xe3\xa0\x3f\x20\x39\xa7\x00\x2e\xa8\xf6\xfd\x08\xe2\xa7\x4a\x74\x77\x9d\x31\x59\xd2\x3e\xc6\xcb\xc0\x40\xf6\xea\x4a\xc7\x5e\xac\x63\xa8\xc2\xa0\xfd\x40\x19\x6a\xa1\xb1\xe5\xcf\x7c\x2e\x4b\x4b\x30\xd8\xfa\xca\x5d\x79\xad\xef\x25\x54\x7a\x69\x43\x9d\xab\x3a\x5d\x37\x9e\xe5\x3b\x04\x06\xb6\x15\xe3\x27\x0e\xea\x27\x71\x78\x57\xd7\x2e\xec\x35\x08\xcf\xce\xb4\x43\xf7\xb9\xc3\x36\x14\x2f\xfb\x04\x33\xd0\x5f\x5d\x7d\xb2\xe3\x09\x8e\x5b\x10\xa4\x64\x3e\xe9\xb3\x25\x49\xaf\xc4\x6b\x02\x6a\x99\x50\xac\x2e\x7a\x47\xf1\x7e\x6e\x43\x03\x5f\x6b\x1d\x45\xc9\x54\x9f\x51\xe9\x99\x5a\x84\x4a\x39\x76\xbc\xda\x15\x6a\x73\x45\x9c\x56\xa9\x66\x56\xd4\x72\xda\xc7\x73\x53\xa0\x2e\x54\x66\xc0\x0a\x1e\xd4\x9c\x06\x5c\x16\xa2\x34\x6d\x1b\x2b\xc1\xb6\x24\xa7\xa1\xca\x31\x88\xfc\x36\xec\x0c\x23\x6c\xb3\x1e\xee\xb8\x8d\xe2\x13\x2b\xa6\x9f\x8c\x38\xaa\x4e\x5d\x84\x6e\x82\xf8\x92\xe7\x22\xae\xfa\x1e\xed\x8f\xb0\x33\xe2\xd6\x68\x29\xe6\x2d\xc1\xfe\x20\x6b\xa4\x56\x9c\xad\x11\x52\x4c\x5c\xc0\x34\x91\x90\xb2\x28\x09\xa1\xa1\x29\x16\xab\x38\x61\x0c\xfa\x62\x25\x92\x38\xe9\x9e\xbb\x07\x70\x40\x4a\xda\xbf\xba\x48\x80\x33\xc7\x4a\x59\xa6\x4a\x2d\xb2\xc6\x48\x8a\x12\x1f\x61\x0f\xee\x60\x0b\x26\x67\xb0\x7e\x7b\x30\xb2\x05\xbb\xc6\x60\x1a\x57\x4b\x3e\x67\x8a\xf1\x12\x89\xbb\xba\xa3\x7c\xb6\x0a\x5b\xda\xa4\x3e\xa3\x73\xe1\x43\xe8\xcf\xd4\x17\x6a\x95\x5f\x16\x9c\x00\x87\x50\xa5\x41\x59\x4d\xd7\x6b\x48\x42\x67\x17\x2d\x99\x6a\xc8\x68\x48\xb7\xb4\xd3\x3c\xae\x7d\xd5\x9e\xdf\xa1\x63\xd5\xb7\x9f\xda\xa3\xc9\x77\x55\xdf\x1e\x6a\xaf\xed\x6c\xee\x23\xfb\xf6\x6a\x8f\xee\x02\x87\x54\x5f\x30\x9f\xa4\x19\xa5\xd6\xac\x4a\xc3\x74\xdc\x3f\xd5\x9a\x53\x6b\x7d\xaa\xe9\x34\x6a\xe9\x7b\x99\xd6\xfc\x76\x53\x83\x0e\xd7\x98\x33\xf2\xda\xe5\xe6\x6c\xa3\x91\xa8\x47\x43\xe2\x20\x89\x13\x89\x7d\xc2\xcf\x98\x78\xf3\x1f\xa1\x2f\x4b\x51\x84\x51\x24\xda\x37\x1e\x35\x0d\xb9\x71\x95\xe5\x98\xeb\x4e\x89\x25\x90\x79\xd2\x2a\xcc\x8e\x9a\x4c\xd7\x9f\xd4\x3c\x24\x2b\x0d\x34\xf3\x8e\xd1\xdc\x13\x38\x74\x40\xa3\xd9\xc9\x71\xa8\x1b\xa9\x9a\xad\xfc\x6c\x90\xf3\xdd\x85\x8c\x80\xb0\x1a\xe7\xc7\x6f\x45\x53\xe2\xc6\xc0\x24\xc3\xae\xb2\xc3\x3e\xd2\xb1\xb4\x75\x24\x3a\x1b\x2c\x6d\x8a\x41\x18\xbd\xd5\x90\xae\x1e\x67\x65\x8f\xdd\x6a\xbc\x5a\x1d\x67\x65\x8f\xd9\x6a\x7a\x36\xd4\x35\x06\x6e\x4b\x35\xae\x33\x6c\xb7\xd4\xc0\x61\x36\x4d\x69\x64\xe1\x18\x4e\x75\xdc\x10\x22\xfe\x34\x09\xaf\x7a\x86\x5b\x3c\xa8\x9e\x60\xa8\xb7\x0e\x64\x6f\x6f\x40\x31\xfe\x2e\x07\x6c\x1f\xf5\xde\xb5\x58\x07\xa0\x6e\x63\xb5\x76\xb6\x06\x12\xfa\x07\xb6\x5a\x4f\xa9\xc0\x1e\xbb\x19\xbb\x49\x4d\xad\x57\x51\x3d\xee\xfd\x5e\x73\x77\x5b\x53\xd7\xad\xe6\x2d\x4f\xf9\x1b\xf5\x8f\x8b\xc4\xda\xee\x94\xbf\xa3\xfe\x19\xa7\x64\xd6\x29\x18\x00\x3a\x5e\xc9\x30\xf1\xa1\x92\xb5\x55\xef\x54\xea\xb3\x57\xd1\xb8\x75\xbd\xa3\xb2\x59\xaf\x68\xfc\x16\xb4\x5e\xd9\x6c\x65\x47\x22\xcc\x63\x28\x8b\x2d\x8c\x9d\xfd\xd5\x83\x53\x0b\x03\x0e\xe1\x8f\xc5\xae\x39\x94\x77\x70\xa4\x67\x30\xb1\x57\xe8\x88\x77\x30\xaf\xa0\x4b\x76\xde\xee\x78\xcc\x8f\xe6\x17\x5c\x67\xb1\x74\xdd\x4a\x1f\xc9\x99\xf1\xdf\xc4\x15\x76\x04\x45\x11\x9b\xf5\x8f\xd5\x7e\xf8\xd3\x0d\xb6\x83\x1b\x2c\x3e\xea\x1f\x72\x29\x87\x65\xdc\x5d\x79\xfb\x9e\x0f\xe2\xa5\x08\xd0\x4f\xea\xfe\xe9\x7a\x7e\xb6\x59\x67\x61\x27\xcc\x1a\xf0\x0a\xc2\xf5\xa5\x93\x84\x0d\x6b\xe7\xbb\x95\xf7\x30\x91\xfa\xbf\x8d\x5a\xcf\xb9\x96\x7c\x49\xef\x92\x3a\xba\x38\xc1\x42\xb7\xf8\xfa\x59\xb2\xe5\xb7\x4a\xef\x13\xa8\xed\x43\x4c\x07\xd5\x96\x0f\x5a\xde\x86\x56\x28\x8a\x9c\xcd\xb8\x96\x59\x08\x12\x06\x71\x1c\xd3\x68\xae\xbf\xba\x1a\x4f\xc3\x8d\xad\xb1\xca\xcb\x15\x24\x9f\x74\xab\xfa\xe0\x8e\xd4\x94\x78\x36\x59\xa8\x7b\x26\x96\x95\x59\xc5\xc5\x7b\x9e\xe7\x2e\xae\xbd\xe7\xa2\xb1\x53\x25\xe8\x8e\x9a\x58\x39\x75\x03\x30\xdd\xbd\x63\x08\xed\x76\x41\xbf\x98\x15\x82\x4d\xa5\xbc\xde\xc0\xce\x08\xd0\x1f\x03\x57\x3a\xe6\x9b\x88\x70\x87\xed\x2a\x60\x5a\xc0\x57\x6d\x10\x33\x15\x42\xba\xc3\x81\x1f\x10\x03\x9c\x61\x2b\xc8\x54\x8d\xde\xc1\xdc\x69\x31\x37\x0d\x87\xe4\x94\xbd\x29\x33\x77\x6f\x08\x8d\x55\xa8\x18\x8f\x2b\x91\x68\x16\xd4\x58\x5e\xcd\x3b\x61\xf5\x00\xd1\xd1\x22\xf7\x84\x80\xae\x2a\x38\x67\xaf\x74\xe6\xb2\xd6\x26\xca\x43\xf1\x2d\x58\x68\x4a\x84\x87\x9d\x95\x73\xe6\x24\x05\x3d\xdb\x94\xf5\xca\xac\xa5\x92\x80\xb1\xc7\x10\x79\x14\xbb\x65\x53\x18\x59\x15\xc4\xd2\xed\x97\x01\x7e\x6f\x95\x5a\x6b\x2e\xbb\xaf\x04\x73\xaf\x88\xd8\xb3\xc6\xb0\x52\xa1\x40\x58\xd2\xf9\x86\x2a\x11\xa1\x80\xb8\x2b\x7b\x04\xef\xb6\x2a\xeb\x59\x21\x2d\xc6\xfb\x85\x72\x15\x16\x0a\x70\x96\x78\xd6\xb9\xe9\x45\x11\x2e\xa3\xe4\x00\xb7\x26\x2c\x04\xd7\xa7\x17\x33\x37\x5a\x6b\x21\xdd\xca\x41\x34\x87\x06\xf0\x6b\x21\xc2\xf3\x05\xd6\xa1\x0d\xb2\xe7\x40\xf6\x2e\x68\xc2\xb3\x58\xa5\x99\x0c\xe9\xf0\xb0\x62\x23\xb8\xf8\xb3\x8b\x8c\xe9\x00\xa6\x0e\x06\xf7\xb8\x14\x07\xe8\xb9\xb7\xa4\xbe\x74\xb8\x76\xab\xcd\x6e\x23\x9e\x10\xfe\x63\x3a\x0d\xbc\xcb\x00\x7f\x74\x9d\x58\xfa\x60\x92\x92\xb2\x53\x2d\xd6\x3d\x08\x37\x5b\xc1\x2e\xc5\xd6\x33\x54\x22\x8f\x53\x79\x57\xee\xdb\x8d\xc4\x17\x77\x70\xdf\x02\xdb\x1d\x04\x13\xea\x14\x3a\xa6\xb6\x68\xd4\x62\x69\x5d\x5a\x18\xe2\xd5\xd5\xdd\xe7\x3e\xa0\x8c\x7b\x11\xeb\x0e\x89\x9d\x31\xfc\x66\x32\x38\x60\xac\x3a\x67\x2b\x6c\xf9\xed\xe7\x81\x0d\xbb\xb1\x65\x5f\xd8\x1d\xe2\x92\xc5\x5b\xb6\xf4\xde\x20\x1b\x58\xbb\xea\x27\xee\xd2\x3a\x45\x79\x27\x6b\x55\x42\xcf\xcc\xb9\x14\x45\x5f\xbf\x13\x7b\x72\xfa\x3d\x7c\x19\x5d\xb4\x5b\xbb\xb0\x59\x82\xb9\x77\x27\x79\x02\xec\x8e\xd7\x12\x1e\x74\xf2\x36\x47\x5c\x72\x75\xab\x5d\x81\x14\xf5\x40\x87\x9e\xe9\xb0\x86\x5c\xd6\x21\xfe\xe2\x7d\xeb\x1e\xed\x29\x7b\x1e\xcd\x01\xdf\xf2\x16\x14\x9c\x22\xa4\x05\xe8\x2c\x25\xbf\x2d\x45\xc3\x8e\xcf\xca\xc3\x6a\x57\x4b\x5e\x6d\x43\x7f\x37\xa9\xde\x4d\x64\x2c\x0f\x70\x85\x05\xa0\x07\x22\x7f\x02\x33\x4e\xb7\x8b\xe9\x5b\x14\xe1\x4f\x67\x08\x34\x22\x98\x22\x51\xe3\x6c\xdd\x3f\xf3\x0e\xf9\x0f\x4b\x72\xac\xc2\x6b\xd5\xee\xf9\xad\x58\x8d\x27\xf3\x9c\xcb\x22\x0a\xbe\x0c\xcf\x03\x40\x76\x2b\x56\x1b\xc8\xfa\xdc\x18\xfb\x6a\x12\xc5\xd9\x02\x65\xc5\xdc\x41\xa3\xb8\xca\xf8\xc8\x8b\xce\x5a\x2e\x8b\x31\x75\x92\x47\xd3\x65\xfd\xf6\xd0\x4f\x11\x6b\x18\x84\x54\xd0\x1e\x50\xfb\xd0\x62\xca\xae\xb0\x45\xde\x22\xe4\x3c\x47\x0f\xbf\x17\x26\x5b\x38\xeb\x15\x4e\x94\x7e\x78\x4a\xe5\x9d\x43\xa2\xa9\xd7\xc6\xdf\xad\xb0\xf8\xb9\xbb\x70\x4f\xbe\xd1\xb0\x6c\xa8\x79\x28\x19\xc4\xf6\x73\x55\xfb\x28\x0e\xbf\xa1\x84\x81\x9c\x22\xd7\x86\x1b\x99\xb9\x86\x9a\x65\xee\x43\x32\x40\xf4\x81\x85\xa9\x1a\xf2\x45\x3d\xa3\x2d\xe1\x32\x14\x85\x1a\xa1\xe1\x37\xf1\xf5\x85\xba\x2f\xef\x79\x9d\x3f\xbf\x7a\x35\x49\xf5\xbb\xaa\xd9\xe5\xd5\xcf\x80\xe6\x52\x2c\x95\x4b\x82\xc6\x6d\x2e\xba\x65\xe8\x97\x01\x07\x37\xae\xa3\xe7\x4e\xbd\x7e\xbd\x9e\xd9\xcd\x0d\x80\x4e\xb3\xaa\x79\x82\xc3\x78\x23\xcb\xfb\x0e\xc2\x33\x52\x05\x56\x05\xe8\xad\x73\xfc\x13\x94\xc8\x9c\x80\x36\xbd\x76\x9a\x2e\xb3\x1c\x52\xbc\x71\x2c\xf7\x13\x25\x6c\x5a\xe9\x05\xdc\xfa\x75\x11\x87\xae\x88\x98\xf2\xba\xb3\x5a\xca\x09\xc5\xf7\xbc\x92\x5b\x71\xca\x39\x04\x8e\xc4\x31\x07\xbe\xc3\xac\xb0\x75\x62\x1f\x74\xf4\x9b\xf7\x6f\xe5\x07\x66\x0f\xcd\xed\x63\xe0\x0e\xf4\xc8\x94\xbd\x85\xa2\x36\x92\x1e\xbe\x85\x2c\x09\x32\x6b\xec\xac\x76\xda\xa8\x07\x09\xec\x0e\x1f\xa1\x82\x02\x18\x77\x7a\x70\xe3\x25\x6f\x1e\xd6\x08\x8d\x31\xec\xb5\xba\x42\x05\x4f\xf8\x04\x8e\x96\x77\x12\x0d\xa8\xc0\x17\xb4\xb4\x4f\xcf\x1b\x8b\xd6\xcf\xaf\x5e\xec\xc4\x9b\x0a\xbf\x5d\xaf\x95\xf6\xe5\x8c\x1d\x20\x12\xf2\x41\x23\x90\x3d\xb0\x90\x97\x90\x30\x18\xea\x51\x43\xb6\xe6\x6e\x32\x6f\xe9\xda\x07\x2e\x24\xef\x50\x66\xe0\x11\x36\x83\x3d\x17\x83\xfd\xfc\xf5\x00\xea\xe3\xd7\x07\xda\xc3\x9d\x35\x72\x24\xb6\x5e\xa9\xfc\x9d\x58\x56\x05\x14\xa3\xec\xe9\xbf\x33\xc8\xc3\xe8\x43\xbd\xa1\x7f\x0f\x78\x46\xfd\xbb\x1b\xcc\x3d\xe7\xe6\xb0\x24\x09\x03\x84\x0a\xdf\xee\x98\x41\xdd\xe2\x9d\x05\x86\x6d\x99\xe2\x90\x82\xb9\x6a\xca\x3c\x34\x63\x71\xad\x22\x87\xc0\xf7\xb5\x75\x71\x2d\x5d\xf0\x78\x1d\x20\xa1\x51\xa7\x5b\x38\x6c\x61\x92\x55\x2a\xf7\x04\x59\xc3\x91\x11\xf6\x76\x1f\x1b\xd0\xe4\x6e\xb9\x63\x92\x17\xb7\x37\xb9\xa3\xcf\xfb\x8c\xee\xe4\x71\xc7\xec\x8e\xa7\x34\xde\xf0\x4e\x30\x1e\x6f\x7a\xc7\x83\x8d\x34\xbe\x01\xe2\xbb\xd6\xb7\x2d\xf3\xfb\x40\xdc\x7d\x8b\xab\x79\x6d\xe1\x5f\x60\x6c\xf2\x62\xbb\xe2\x6f\xfc\x50\xec\x5e\x8b\x5a\xe5\x62\x87\x12\xbf\xa1\x18\xae\xa7\x5b\x04\x69\xbb\xd2\xbe\xcb\x08\x85\x75\x65\xae\x49\x09\x8e\x2f\xe9\x9b\x22\xb4\x0b\xe8\x71\xc5\xa7\x5d\x21\x5f\x74\x62\xef\x50\xcc\xf7\xd9\xc5\xa0\x1c\xc5\x98\xb5\xe5\xe8\x47\x6b\x01\xbf\xb5\xab\x67\x12\x8a\x71\xf7\x08\x93\xce\x16\x22\x6f\x0a\x59\xde\xfc\x1e\x7d\xd3\xe9\x1c\x1d\x3d\x02\xfd\x4a\x46\xbf\xf6\x07\x32\xba\xe4\x86\x5a\x6f\x5c\x33\xb3\xb0\xfb\xa5\x7b\x8b\xf1\xaa\x2a\xa4\xd5\xb0\x23\xdc\x45\xe8\x7c\x83\x01\x6b\x18\xd0\x82\xbf\x13\x35\x96\x9c\x0f\x5a\x85\x36\x8f\xf0\x22\xd1\x3a\x56\x2c\x6d\x28\x78\x9d\xe4\xc0\x84\xa7\xd3\x30\x34\xdc\x70\xc0\x1c\x43\x0d\x73\x57\x54\xc5\x5d\x47\xf9\xab\xf7\xe8\x95\x5a\xb8\x59\x3a\xcf\x7e\x00\x3f\x22\xe4\x3d\xf0\xe1\x09\x1c\x5e\xde\x23\x5e\xed\xab\x23\x7c\x4b\xd4\x93\xd8\x25\x6f\xcf\x3a\x1b\x58\xeb\x3f\xbc\xaa\x45\x2e\x33\x54\xf2\xd7\xa2\x96\xbc\xf8\xdd\x4f\x4b\xf7\x00\x65\xb4\x41\xeb\x70\xab\x66\x0f\x72\xf7\xbe\x9b\xfe\xc6\x5a\x5d\x1e\x8b\xe8\x36\x11\xdc\x60\xd2\x85\x08\xd0\x98\x3e\x02\x81\xca\x22\xfd\xc4\xad\xbe\x87\xb2\x4d\x3c\x93\xa3\x6e\xde\x22\x2a\x56\x7e\xa2\x6b\x88\x08\x07\x53\xbf\x55\x40\x2b\x1d\x14\x9f\x03\xd0\x12\xe8\x65\x2d\xcf\x6b\x82\xef\xee\x0b\x6a\xa1\xa9\xb7\x8a\x9c\xfb\x31\x37\x6a\xe4\xd0\xbb\x10\x36\x29\xca\x65\x86\x09\xfc\x9f\xdb\x6f\xd8\xdd\xff\x05\x6d\x55\x26\x3b\xb2\xb3\x85\x3a\x58\x50\x64\x8c\xfb\x10\xca\x2b\x62\x90\x89\x70\x6c\xa1\xab\x5a\x9a\xb8\x5d\xbb\xbe\x07\x4d\x0c\x0e\x27\x40\x87\x0c\xb8\x09\x89\x13\xb7\xfd\xd7\xfe\x3a\x0e\x14\x6f\x5b\xc7\x1d\x9c\x93\xa5\x32\x0f\xc2\xcd\x78\xdc\x5d\x7c\xe3\x09\x65\x89\x49\xee\x22\x02\x30\xf0\xf1\x2b\xa1\xed\x13\xef\xab\x81\x37\x65\xd7\x92\xee\xde\xed\x8a\xad\xad\xa4\x60\x78\x62\xc0\x0f\x35\xa9\x34\x76\xae\x8e\xe5\x21\xca\x87\x0a\xb6\x04\xfe\x1f\x96\x67\x50\x1f\xf4\xef\x4a\x1b\x57\xc9\x82\x5d\x51\xa0\x27\x22\x88\x0f\x5f\x5d\xe9\x28\xdc\x77\xd6\xe0\x7d\x2f\x85\x77\x39\xc7\x13\xbe\xc8\xfe\x72\x31\x85\xff\xff\xf4\x80\x0c\x47\xf2\x81\xfd\x80\x63\x66\xaa\x9c\x17\x32\xb3\xa4\x31\xf7\x42\x94\xa8\x1a\x81\x7b\x10\xfa\xb4\x88\x67\xe4\x42\x57\x3d\xe2\x78\xb3\x44\x78\xc2\xbb\x54\xb6\x63\xbd\xa4\x84\x2d\xc9\x87\x58\xf5\x52\x6e\x02\x03\x05\x7a\x11\x05\x27\xe1\xd8\x03\x67\x16\x9a\xbf\xbf\x80\x86\x56\x51\x20\x42\x73\xc0\x12\x42\xb7\xec\xf6\x6d\xa9\x8f\xf7\x9b\x6d\x5a\xab\xb9\x9b\x05\x35\x2d\x80\xd3\x55\x2d\xaa\x5a\x68\x6c\x97\x5a\xb8\xaa\x09\x3e\x50\x6c\x4c\xb5\x84\xdd\x25\xc8\x4b\xb5\x25\x08\x61\x99\x48\x55\xa9\xcc\xf9\x11\x54\x02\x4a\x08\x49\x64\xa9\xc6\x0b\x48\xca\xaa\x45\xc0\xd8\x49\xcd\x9e\x82\xd1\xba\x97\xa4\x44\xe6\x44\x27\xc7\x69\xf6\xb1\x10\x58\x60\x8e\xd1\x75\xa0\xa0\x8c\xd6\xe2\xc1\x98\x69\x95\x5f\x55\x0b\x7b\x9e\x84\x22\xa1\xd6\xce\x0b\xfd\x9d\xc7\x72\xc9\x7d\xee\xb9\x14\x7e\x7b\x09\xb5\x5e\xa5\x2a\xaf\x38\x85\xff\xd4\x4d\xa9\x5d\xb8\xe6\xb5\xc0\x88\x47\xb4\x2f\x63\x4c\x5c\xc0\x1b\xf4\x31\x5a\xcf\x86\xef\x55\x53\xb3\x42\xdc\x89\x42\xd3\x49\x1a\xae\x1f\xe3\x21\xd0\x68\xf6\xec\x8e\x5e\xae\xa5\xaa\xa5\x59\x4d\x28\xb2\x59\x9b\x5a\x66\xe4\x42\xc0\x16\xd8\x97\x57\x3f\x3b\x7f\x36\x86\x93\xf0\xa6\xcc\x16\x53\xff\x25\x7b\xca\xce\xd9\x67\x91\x71\xa5\x2b\x7e\x5f\x46\xa1\x33\x73\x45\x06\xdb\x6c\x15\x3e\xfa\x3c\x14\x5c\xe9\xe0\xf9\xd6\x75\xbb\x06\x70\xe4\x50\xc2\xfb\x60\xea\x0a\x87\xd2\xee\x7b\x4d\xbb\x0f\xc6\x9c\x81\x53\xa9\x20\x6a\xaf\xd9\xd8\x7f\x41\xce\x38\xc4\xf1\xbc\xbb\x2e\x58\x70\x0b\x19\x19\x02\xc9\x9c\x3c\x0c\xbc\xe2\x1a\x21\xe3\x99\xda\xf9\x9c\x22\xc5\xfb\xee\xdd\x15\x5b\x0a\xb3\xb0\x3c\x59\x2f\x3b\x34\x3d\xd0\x25\x1b\x46\x73\x5e\x2a\x2c\x9b\x51\xae\xd8\xb2\x31\xbe\x60\x17\x38\x22\xed\x12\x15\x12\x43\x7b\x29\x1e\x45\xd5\xde\x97\xe1\x3c\x21\x10\xea\x9c\x00\x92\x4b\x02\xe5\xc1\xe0\x75\xc9\x46\x50\x7d\x37\xc8\x7d\x07\xd6\x6d\x99\xfe\x1d\xc4\x73\x06\xa6\xed\xc3\xe6\xa0\xb0\x31\x4a\xb4\x8a\xa1\x32\x08\x60\xdf\xc4\x24\xd7\xed\x51\xde\x00\x3d\xdc\x1a\xaa\x92\xd6\x82\xd4\x07\x0f\xb5\x28\x5e\xe7\x97\xe0\x94\x8f\x8f\xdf\x60\x32\x82\xe7\x91\x22\x49\x1d\xe6\x48\x4f\xc2\xcd\x5a\xf9\xea\xbe\x3d\x14\x84\xcf\xf9\xcd\xdb\xee\xaa\x92\xee\xb5\xe2\xd7\x8e\xb1\x06\x23\xb2\x62\xa5\x5e\x69\x64\xc6\x0b\x86\x05\xd7\x0f\xc0\x99\x74\xb6\x3e\xe3\x36\x52\xc7\xb3\x55\x32\xec\x38\x86\x25\x5f\x6c\xc3\x29\xb7\x02\x76\xe4\x94\x3d\x49\xc5\x8c\x72\x78\xb8\x89\x1d\x8c\x47\x21\x18\xe0\x17\x55\x34\x4b\xe8\x01\xff\xc1\xb0\x9c\x1b\x3e\x61\x33\x59\xf2\x7a\x05\x7f\xf4\x71\xc9\xa8\x9a\xdf\x24\x11\x19\xd1\x07\x51\x58\x10\xf9\x62\xb1\xdd\xde\x1d\x0c\xb3\xd3\x45\xd6\xbb\x24\xec\xc1\x97\xcf\x8f\xbd\xf6\x1e\x79\xe0\x50\x8c\x4e\x1c\x14\x1c\xc5\x58\x61\xcd\xf6\x3c\x84\xec\x96\xe2\xbe\x58\xc5\x5e\xe7\x50\xf1\xdb\xe1\xbe\x54\x4d\x69\xfc\xf8\x4b\x5e\x55\xc2\xc7\x83\x52\xd3\x43\xd8\xf3\xa3\xe6\x82\x01\xef\x33\xbd\x19\x49\x32\x62\x42\x1d\x27\x8b\xa2\x3f\x70\xa9\xd2\x08\x17\xa2\x6e\x7f\x00\x74\x44\x0e\xec\xd7\xeb\x3a\x1a\x3e\xdb\x1c\xc0\xf1\x1e\xa7\xb8\x59\x4a\x9c\xbb\x32\xea\x5c\x87\x8e\xc8\x71\x82\xa2\x80\xa5\xbc\xa0\xef\xf5\x7a\x69\x41\xd9\xd8\xf2\x0e\x6e\xbd\xb4\xf4\x84\xdb\xf5\x8b\x02\x1e\xda\xb6\x15\x87\x75\xa2\xf0\x6b\x1c\x45\x8f\x94\xb7\x5f\xc5\x45\x54\x42\x00\xa7\x3b\x63\x45\xef\xb5\x85\x24\x12\x90\x18\xec\xb0\x90\x24\xd8\x3c\x2f\xb4\xc2\x9b\x27\xfb\x93\x34\x62\xf9\x17\xfb\xce\xa7\xd1\x8d\x15\x2a\x32\x0f\xc9\x51\xb3\xd5\xab\x80\x33\x51\xd7\xaa\x8e\x64\xd5\x12\xc4\xc3\xdb\x21\x7a\x6e\xb4\x30\xba\x1c\x0b\x4b\xfb\x81\xc3\x59\x57\x04\x7b\xc3\x16\x43\xb4\xfb\x7e\xaa\xea\xb2\x13\x48\x36\x49\xfd\x6a\x40\x1d\x60\x8a\x66\xdc\x8d\x84\x21\xbe\x55\x03\xf7\x3a\x9e\x97\xf4\x10\x2d\x44\xd0\xac\x46\x45\xbd\x4b\xa3\x68\xb4\xcd\x22\xef\xae\x2e\x0f\xa1\x01\x71\x3c\xda\x1c\x98\x17\x39\xca\xdb\x02\x41\x8b\x52\xb1\x72\x0c\xb6\x74\x9e\x78\x49\x9b\x28\xbc\xb6\x04\xb7\x12\xbc\x4c\x6e\x02\xa7\x4e\x2f\x3e\x7c\xf9\xf9\xe7\x27\x14\x9d\x09\x2b\x55\x79\x5e\x2b\x65\x58\xa3\x7b\x7b\x4c\xef\x23\x49\x5c\x7b\xf0\x3b\xa9\xb4\x87\x91\x2a\xf2\xe3\x42\xfe\x85\x06\x67\x61\x44\xa1\xd0\x4e\xa1\x91\xf9\xb7\x4f\x2f\x2e\x2e\xc6\x88\xe1\x21\x35\x2f\x8e\x07\x72\x44\xbe\x22\x7a\x0a\x03\x41\x76\x83\x17\xb2\xd8\x75\xed\x7b\x6f\x83\x9b\x43\xcd\x1f\x40\xd6\xfc\x34\xc0\xf3\xdc\x57\x93\x63\x1f\x69\xf3\x9c\xa1\x99\xfe\x44\xc3\x1c\xa6\x95\xd1\x49\x45\xf0\x7b\xc7\x40\x10\x24\xd8\x18\x73\xf4\x6c\xe3\x26\x1b\x22\xbc\x2d\x23\xcf\x2e\x3e\x7c\x7e\x71\x71\xb6\xa7\x20\x7a\x34\xb7\xd7\x87\x83\xba\xd0\xa9\xdf\xf1\xfa\x70\x26\x9c\xbc\xc2\xb6\x8e\x26\x45\x7b\xa6\x74\x4b\xbe\xb9\x17\xd0\x9a\x24\x56\x2c\xc6\x4c\xdd\x89\x32\xf2\x08\x14\x82\x55\xa2\x5e\x4a\xc8\x70\xdd\xa2\x13\xd0\x6e\x6b\xe3\x48\xfb\xb7\x5f\x07\x04\x7e\xfb\x70\xae\x87\x13\x7a\x57\xd7\xcf\xd9\x94\x3c\x36\x27\x51\xea\x91\xc0\x0f\xa2\x74\xd7\xca\x7a\x2c\xe7\xfe\x92\x7f\xcc\xde\x7f\xb2\x7d\xff\xe4\x8a\xd8\x0b\x20\xc4\xec\x19\xb1\xf4\x23\x7e\xa4\x3a\x79\xbc\x78\x6e\xd2\xe0\xa3\xb4\xb7\x73\x7f\x6d\x2d\xd5\x6b\x25\x1a\x59\xb3\x83\x54\xaf\x93\xe8\x70\x0d\x3a\x4a\x83\x8f\xd1\xde\x9b\xca\x10\xa4\x1a\xfc\xc1\xb4\xf7\x71\x4d\xe8\x9e\xb5\x14\x8c\xea\x3f\xe4\xca\xd9\x6c\x7e\x8f\x35\xbd\x13\x99\x3c\xc8\x09\xd0\x87\xe7\x8d\x33\xbf\x1f\xce\xf4\xf6\x99\xf1\x0e\x7d\x5e\xf5\xde\xfc\x8c\x94\x4c\x59\xb6\x21\xea\x98\x75\xbe\x86\xc9\x47\xe7\xb3\x0a\x15\x04\xb8\x59\xb4\x9d\x89\xc8\x6a\xa7\x19\x7b\xb0\xc1\x3a\xc2\x14\x5c\x4b\x40\xe3\x01\x8f\xaa\x83\x1a\x57\x6c\x79\x04\x53\x47\x79\x1d\x8f\xe0\xa3\x7e\x2c\x5e\xc7\x80\xe1\x83\x38\x1d\x0f\x26\x05\x51\xca\x08\xd1\x65\x12\xdd\x76\xaf\x93\x85\x24\x43\x83\x48\xba\x2e\x91\x30\xab\x1a\x84\xba\x93\xe3\xe6\xb9\xd3\xe2\x38\x21\x68\x21\x09\x9a\x3b\x9a\x00\xca\xf1\x35\x46\x32\xda\x2d\xa6\xf3\x0c\xf6\x0d\xef\x6b\xe3\xb2\xb4\xdb\x81\xb4\x66\xa4\x4b\xd6\x0f\x73\x9f\xfa\xb5\x8a\x69\x26\x2e\xc7\xa3\xbf\x21\x0a\xe6\x85\x86\x30\x81\x50\xc0\xc4\x77\xab\x05\x81\x22\x0d\xef\xf8\x4a\x4c\xd9\x3a\x4d\x84\x57\x72\x4b\x86\x52\x64\xe7\xa1\x39\x1a\xc0\x3e\x6e\x9e\x12\x9e\x3b\x32\xd5\xa5\x37\x3e\x2a\xae\x26\x39\xa4\x87\xe4\x6b\x94\xe7\x8b\x7d\x95\x1f\x2b\x63\x13\x0a\xec\xc0\xda\x34\x0b\xf7\x31\x32\xf7\x08\xab\x36\xe2\xae\x13\xeb\x47\xce\xdf\xed\xd6\x6e\x74\x3f\xdd\x02\xf0\xb8\x38\xec\x37\x8b\x89\xb7\xe6\xdb\x39\xda\x7b\xb2\xbd\x93\xf2\xfd\x97\xac\x6a\x3e\x75\xa9\x99\x6e\x50\xbf\x2f\xbb\xb0\x43\xfa\x83\x0e\xc7\xe2\xf1\x8a\x47\xbc\x57\x47\x5b\xaf\xc3\xdc\xf3\xd8\xbd\x9f\xa4\x65\xb2\xad\xd4\xc5\x88\xad\x1d\x13\x35\xfa\x24\xc9\x57\x8e\x4a\xe3\x41\x87\xb8\x7e\xca\x7d\xe3\x84\xb2\x87\xc3\x76\xc4\x2f\xc6\xe6\xa3\x93\xc0\xd6\x06\x94\xee\x27\x43\x72\x18\x43\x14\xf5\x76\xdb\xd6\xc0\x96\x85\x67\xe6\x11\x4a\xed\x91\x89\xa2\x4b\x24\xdf\x53\xd8\x2a\x95\x63\x41\xd6\xb2\x58\xed\x74\xe6\x3c\x95\xbc\x5c\xd1\x7c\x77\xb0\x55\xdc\xa7\x8f\x6b\x13\x8b\xdd\xfe\x17\x9f\x5f\x5c\xec\xc8\x48\xbb\xc6\x5f\x44\x77\xac\xaa\xa4\x58\xac\xc8\xa9\x7f\x9a\x23\x86\x8f\xe4\x27\xa7\x14\xfc\x4a\xfe\xed\xe0\x7e\x3b\xaf\xcf\xe9\xff\xd6\x48\xc2\x3a\x29\xc0\xe0\xed\xad\x25\x61\x9d\x14\xb8\xec\xd6\x21\x49\xd8\xe9\x7a\x13\x15\xcb\xe1\x1d\xe4\xbb\x49\x5b\x70\x83\xee\x29\x6b\x4b\x12\x32\x64\x8b\x85\x7a\x72\x41\xdb\x53\x83\x04\x41\xed\xf8\x86\x83\x70\xb6\x84\xcb\x65\x5e\xec\x28\x60\x7d\xc2\xd5\xba\x40\x7d\x3c\xf7\xe7\xbb\x09\x98\x8f\xc5\x2c\x95\xf1\x89\xfa\xbb\x08\x59\x17\x90\x25\xdc\x52\xe5\x71\x66\xcd\x23\x92\x32\x57\x8a\xd8\xca\x1a\x56\xae\x14\x3c\x5b\xb8\xbb\x3b\xac\xb9\xe2\xa7\x32\xa0\xb3\xd2\xcb\x91\xae\x58\xc5\xc4\xd8\x41\xba\xa2\x0e\xa8\x31\xa4\xd9\x8a\xf1\x3c\xc7\x84\xf5\x52\xdc\x47\xcf\x9c\x0f\xd6\x65\x11\x25\x3e\xf8\xd6\xab\xdd\xa2\x86\x1d\x17\xec\x69\x36\x54\x12\x9c\x82\x8a\x68\xec\x21\x7b\x00\xe2\xa3\x17\x3b\x9c\xc5\xba\x5d\xd2\x07\x64\x76\x25\x8e\x48\xb0\x9d\xc5\xd4\xee\x39\x49\x40\xda\x72\x86\x29\xe0\x3d\x22\xe6\xc5\x0b\xdf\xe8\x48\x56\x2b\x16\xf8\x68\xd2\xf5\x72\x59\x99\xd5\x0b\x59\x4f\xd8\xf5\x82\xd7\x7e\x08\xed\xb3\x22\x3d\x39\xd7\x2a\x39\x07\xc6\x7f\x6e\x6d\xf6\x56\xa9\x13\xdd\x3b\x40\x7a\xce\xd9\x5c\x54\xc8\x72\x2c\x2d\x20\x54\xb2\x33\x41\xc3\x9f\xf9\x5b\x2a\x37\xf6\x02\xea\x94\xf5\x0c\x99\x1c\xf5\x43\x3c\x7f\xe5\x78\x63\xee\x15\x9b\x35\x7a\x35\x53\x1f\x98\x5c\xf2\x1b\x11\x23\x69\xa1\x3b\xe0\x91\x19\x18\x22\x1c\x42\x6d\x09\x0f\x70\xc9\x65\x44\x4d\x02\x71\xcf\xa5\x71\xdd\x96\xac\xe8\x35\xb3\xe8\x95\xbc\x56\x15\xd5\xed\x00\xfe\x62\x1d\x92\x16\x1c\xee\x1b\xad\x13\x7d\x73\x6e\x78\x27\x25\xe1\x8b\x41\x11\x01\xd2\xbd\xcf\x65\x3d\x2c\x19\x4b\x91\xcb\x66\xe9\x8e\x7f\x2d\x73\xfe\xcb\xcf\x3f\xdf\x4a\x30\x5a\x42\xf1\x17\x77\xcd\x3e\xb1\x90\x26\x34\x06\x9e\xff\xf7\x89\xd5\x19\x2d\x28\xc9\x55\x5f\x30\x8f\x2e\xe8\xa2\x9c\xd1\x8b\x60\xac\x10\x67\x65\x19\xee\xed\x88\x0b\xf7\x90\x5c\x1c\xfe\x1e\x0c\x24\x08\x7b\x4b\xe7\xfa\x1e\x86\x3f\xaf\xef\xad\x65\x56\xd3\x99\x81\x6e\x1f\x57\x55\x08\x6e\x59\x56\x73\xed\x0f\xe8\x74\x15\x98\x86\xc1\xb8\xb8\x99\xfd\x6c\x2d\x17\xc3\xbb\xde\x98\x9f\x30\x55\x87\x46\x48\x1a\xea\xdc\x3d\x61\x3f\xbc\x7a\x31\x5e\x49\x8d\x97\x40\x74\x6b\x74\x05\x70\x8b\x50\x98\x2d\xe5\x11\xa8\xfd\xe9\x81\xec\xfe\x8d\xd2\x08\x6c\x3d\xc3\xc9\x9e\x59\x6a\x9e\x61\x95\xcc\xb3\x49\x2b\x5a\xa5\x2b\xaa\x3b\x89\xa9\xaf\x8c\xd1\x2f\xaa\xbb\x88\x69\x1c\xf9\xdd\x2f\xaa\xdb\x8a\x29\x42\xdc\xee\x58\xb0\x49\x4c\x01\xa6\x17\x55\x78\x88\x8e\x3a\x10\xb3\x6f\x3d\xdd\x8f\x21\xc4\x03\x6a\xf4\xcb\x2f\x0f\x25\xb6\x5f\x7e\xf9\x98\xd4\xe8\x97\x5f\x3e\x98\x1a\x85\xff\xfc\xa9\x46\x47\xaa\xd1\x2f\xbf\x9c\x1c\x49\x8f\x7e\xf9\xe5\x47\xa2\x47\xbf\xfc\xf2\x41\xf4\x68\x9f\x9c\xfe\xa9\x47\x77\xd3\xa3\x5f\x7d\xf5\xd5\x81\xc4\xf6\xab\xaf\xbe\x7a\x44\x7a\xf4\xab\xaf\xbe\x7a\x20\x3d\xfa\x01\xff\xf3\xa7\x1e\x1d\xa7\x47\xad\xd8\x1c\x45\x8d\x5a\xc0\x1f\x85\x1a\xb5\xa2\x7a\x7a\x35\xda\x2f\xa6\x7f\xaa\xd1\x87\x39\xd5\x77\x4f\xf4\xa7\x12\xda\x11\x27\xfa\x3f\x4f\xdf\x07\x3d\x7d\x1f\x48\x50\x3e\x0a\xdd\x06\x47\xed\x1d\xe5\xc7\xe5\xda\x1f\x46\x0f\x1d\x24\x57\xa9\x47\x7e\x00\xe2\xe3\xd1\x43\x7b\x1e\x8b\xbb\x47\xe2\x47\xa0\x87\xdc\x91\xf8\xcf\xe3\xeb\x41\x8f\xaf\x07\x12\x94\x8f\x43\x0f\xd9\xa3\xea\x8e\xf2\xf3\xa7\x1e\x3a\xfd\xb1\xb2\x7b\xa4\x7c\x78\x3d\x04\x76\xba\xef\x56\xd6\x2f\x48\xf6\x5d\xae\xff\x3c\x06\xee\x72\x0c\x3c\x90\xc0\x7c\x14\xfa\xc8\xcb\xd2\xf6\x72\x84\xea\x68\xa3\x2c\xfd\x79\x4e\xeb\xd1\x4b\xa1\x8a\xd3\x78\x49\xa3\xef\x55\x19\x05\x57\xc3\x08\x24\x82\xc0\xb4\x10\x80\x5c\xd7\x22\xa3\x50\xb8\x53\x3b\xc0\x52\x19\xf2\x47\xf9\xd1\xfa\xe8\x14\x3b\xd7\xa9\x14\xca\x7e\x9c\xc6\x25\xd5\x62\xb0\x63\x6e\x88\x5b\x3d\x01\x83\xc7\xeb\x97\x7d\x76\xa2\x88\xf3\xce\xa9\xb4\x6f\xa4\x61\x57\x37\x60\x2a\xc7\xf1\x55\x00\xfb\xb5\xe6\x55\x25\x6a\xbf\x44\x42\x56\x31\x71\x7a\xc2\x4a\xc5\x6a\x9e\xad\x8d\x90\xf7\xe0\xee\x09\x5c\x6b\xeb\xb1\x93\xcf\x78\xa3\x05\x40\xb2\x7a\x37\x97\xa1\xf6\xee\x42\x94\xac\xd1\x94\x9e\xe0\xd3\x85\xa3\x6a\xeb\xa3\x0a\x40\x7c\x71\x11\x37\x61\xfd\x85\x10\xb0\x8c\xfc\x82\xd5\xae\x96\x35\xf5\x19\x73\xa1\xab\x3a\x4a\xa3\xee\x89\xb3\x99\x86\x36\x16\xaf\xdf\x50\xbf\x92\x7b\x2e\x81\x77\x16\x57\x1a\xa4\x13\x11\xf3\x59\x4f\x21\x57\x24\x55\xe0\xc8\x7b\x22\xd5\x68\xce\x5c\x8b\xac\x16\xc6\x75\x9e\xeb\x61\x92\x2b\x3a\xbf\x37\xa3\x5c\xf1\xfa\x0d\x2d\x5d\x10\x9f\x28\xab\xa3\x8d\x56\xa7\xb2\x2b\x84\x0f\xc5\xad\x41\x30\x00\x89\xc2\xe6\xb4\xe1\xb5\xc1\x17\xd7\xcd\x75\x8d\xd3\xf7\xa0\x8c\xb8\xaa\xd5\x3f\xb1\x9a\x40\xa7\x00\x45\x85\x8f\x36\x45\xe7\x06\x08\x99\x5a\xce\x64\x29\xf2\x28\x6d\xc4\x3e\x81\x3a\x0b\x99\x5a\x56\xaa\x04\x33\x04\x2b\x95\xf0\x5b\xa4\x4b\x53\x61\x90\x97\x1f\x0c\x22\x2d\x7f\xbb\xf2\x7f\xff\xbe\x7b\x14\x65\xda\x25\xaf\xf2\x88\xba\x38\x4e\xea\xc8\x0d\xfd\x47\x2c\x2b\xf4\x84\x16\xa6\x6b\xc5\x0d\xc5\x62\xa3\xe8\x51\x80\x14\xba\x32\x66\x55\x33\xd0\x65\xb6\xf5\xc4\xb7\xf0\xf5\x29\x26\xed\xf8\x5d\xa8\xac\x00\x31\x68\x1d\x4c\x5c\x43\x70\x6f\xcf\x25\xb0\x43\xfa\x30\x14\x98\xb9\x17\x45\x61\xff\x77\x00\x81\x6e\x40\x64\x7f\xf8\xe8\x78\xe5\xeb\xa9\xfa\xde\xb1\x7f\xb3\x88\x75\x6a\xd8\x6c\x59\x9d\x37\x16\xb9\x6d\xea\xf4\xe2\x4e\x36\x5c\x35\x63\xeb\x2e\x36\x66\x51\x8b\x24\xac\x11\x7e\x8d\x14\xb4\x45\xbf\x58\x41\x79\x6e\xe1\x5b\xa3\x75\xe6\x1a\x67\xa9\x5d\xfa\x6e\xe9\xe1\x8a\xa7\x44\xad\xe1\xca\x72\x58\xf5\x05\xdb\xba\x9f\xfd\x46\xb8\xc1\xf8\x6f\x2d\x8a\xcb\x56\x73\x7f\x6b\x4f\xc0\xbf\xce\x9f\x9e\xa1\xb4\xfa\x59\x07\x5a\xbb\xfe\x3b\xf8\xc4\x0f\x32\xf1\xd1\xc4\x83\xd2\x9d\x2e\x2f\x2f\x8c\x6d\x48\x49\x14\x7a\x67\x5c\x9a\x67\x34\xae\x1b\xb3\x1d\xa3\xec\xc7\x75\x95\x43\x5a\x8b\x6a\xca\x5e\x20\xa1\x7a\xc7\xf1\x82\x98\xa4\x11\xfa\xf9\xb9\xfe\xf6\xdd\xc9\x85\x89\x75\xf8\xbb\xd3\xba\x1a\xe8\x59\xbe\x76\x61\x6d\x69\xfa\xf6\x2d\xa9\xb1\xa5\xae\xf6\x8c\x75\x8f\x05\x72\x48\x47\x9f\x85\xaa\xe4\xb8\x89\x2a\x6a\x0e\x1b\x8b\x65\xdc\xad\x2f\xb2\x33\x81\x06\xd3\x8d\x72\x69\xcf\xc8\x68\x90\xce\x5b\x95\x67\xa0\x89\x84\xd6\xf3\xa6\xb0\x4b\x99\xb4\xb0\x4b\x6d\x6a\x9f\xb6\x66\xf1\x1d\xc6\xe9\xd8\x3d\xfa\xbe\x7c\x6f\x46\xef\x53\xc5\xec\x08\x4c\x8f\xd1\x49\xea\x8c\x31\xac\x33\xf6\xc7\x66\xfb\x36\x79\xa1\x7b\x73\x3e\x5e\x5f\x07\x29\xd1\x7b\x2c\x1d\xd0\x5a\xfb\xde\xc7\xf6\xf9\xa9\x05\x22\x4e\x10\xa4\x36\x1b\x87\xca\xdb\x03\x81\xc2\x5c\xd4\x5d\x7c\x29\xfb\x0a\x9e\xef\x25\x71\x64\x71\xdb\xb9\x12\xee\xc9\xf7\x97\x77\xed\x6a\x65\xbc\xd0\x2a\xa9\x9b\x18\x55\x80\xae\xb8\x59\x8c\x13\xc5\xae\x18\x06\xab\x09\x0b\xa8\x41\x15\x01\xe7\x66\xf8\x18\x94\x16\xd2\xe4\x21\x94\xd7\x91\xca\xda\x3e\x88\x1e\xdb\x20\x6f\x0e\x62\x28\xb2\xb7\xaf\xbc\xa1\x21\x9c\xca\xdc\x4e\x3a\x91\xe4\xed\x0f\xaa\x13\x4f\x69\x8b\xb5\x84\xfa\xe3\xb2\xcc\x36\x2a\xcc\x58\xe0\x0e\xa8\x30\xd1\x63\x72\x00\x01\x3e\x9d\x60\xb5\x6a\xc2\x42\xc9\xd3\x83\x08\x56\x4f\x79\x58\xe7\x24\x31\xae\xcd\xe6\x2e\xe5\x61\xb7\xf5\xc1\x8d\x11\x28\x9f\x9c\x1c\x24\x26\x08\x8b\xb9\x57\x51\x53\x42\xbf\xb3\x40\x29\xd7\xcd\xee\x81\x96\xe8\x64\xfd\x26\x9f\x97\x23\x3b\x58\xb4\x0a\xb7\xad\x18\xbb\xaf\x38\x6c\xae\x1f\xdb\xc7\xff\xe3\xf5\xaf\x3a\x86\xee\x28\x73\xab\xc3\xed\x98\xda\x7b\xcf\xe0\x57\x72\xfe\x18\x05\xb9\xdf\xe4\xc5\xe9\xd1\x0b\xa8\x3c\xf0\xbb\x94\xa7\x80\x1d\xf9\xb8\xfa\x55\x4a\x13\x9c\x4f\xe8\x15\x8b\x2a\x26\x5b\x38\x37\x12\x4a\xe6\x2a\x82\xf2\xec\xc8\xac\x8f\x5c\xb4\x63\x8b\xc6\x06\x20\xb1\xfb\xfa\x14\x65\x63\xc7\xfb\xdc\xdb\x8e\x75\xdc\xb8\xf7\x70\xae\x77\x78\xe9\xe2\xb4\xc2\x3a\x77\x93\x3c\xaa\x23\x3c\xaa\x19\xb0\x03\x73\x47\x94\xa2\xdc\x8d\xbb\x87\x29\x21\xfb\xe8\xf9\xdb\x29\x42\xf9\x98\x18\x3c\xba\x96\xec\xf6\x2c\x3e\x60\x35\xd9\x47\xcd\xe3\x81\x62\xb2\x8f\x90\xcb\x47\x59\xc9\x07\x2d\x2b\xfb\x31\x30\xfa\x51\xaf\xe7\xa8\xb8\xec\x36\x85\x3d\x47\xb1\xfd\xe1\xcb\xca\x3e\xa4\x78\xe0\xf1\xf0\xea\xe7\xf6\x55\x77\xe8\x5b\x3c\x87\x16\x9e\x74\xaf\x6d\xdf\x72\x60\x6b\x01\x81\x2c\xeb\x0a\xd3\x6e\x3e\x12\x74\xe8\xfb\xb8\x75\xcd\xe9\x84\xf0\x61\xea\xcb\xfe\x29\x8a\xe6\x63\xd8\xf9\xc6\x14\x9a\x1d\x25\x77\x07\x2c\x35\xfb\xa8\x37\xb9\xaa\x53\x07\xf2\x31\xb1\x73\x37\x0f\x7d\x0f\x5b\x4f\x50\x78\xf6\x21\xd9\xfc\x2e\x5e\xa5\x2e\xd2\xda\x2d\xf5\xd8\x19\x65\x31\x1d\x7f\x1b\x99\x08\x07\x8a\xce\x46\x01\x09\x95\xa7\x23\xde\x2d\x1b\x6d\x3e\x9e\x1b\xc9\x47\x22\xaf\xc7\x2c\x5e\xfb\xa7\xb0\xfe\x29\xac\x9d\xda\xb5\x3b\x4b\xeb\xd1\xab\xe0\x3e\x9c\xb8\xc2\x6f\x51\x01\x59\xa8\x60\x3a\x22\x8c\xb6\xb7\x08\xee\xe6\xad\x95\xb1\xe7\xd1\x87\x54\x9c\xb2\x74\xe1\x83\x1b\x56\x80\x0b\x32\xa4\x78\xdd\xb9\xaa\xfd\x32\x88\xa0\x3e\x88\x90\x61\x71\xd5\x7d\x05\xec\x28\xa5\x6e\x1f\x58\xb6\xb0\x7a\x2c\x8a\x95\xaf\x18\x3f\xc8\xe2\x76\xa5\xdb\x0d\x12\xc5\x7e\x74\x74\x67\xfb\x0b\x13\xfc\x8c\x00\x8f\x2e\x43\xd7\x3e\x0a\x3d\x8d\xcf\xde\x26\x36\x1b\x23\xd9\x47\x05\x66\x33\x59\xc6\x89\x4b\xc7\x0a\xcc\xa6\xd8\xfa\x4e\x54\x76\xb8\x51\x63\xfb\x44\x65\x63\x50\x36\xa7\x61\x36\x42\x1d\x8c\xc9\x26\xc2\xd1\xdd\x96\x9f\x1c\xfd\x2c\xa3\xea\xbb\xdb\x07\x60\x13\x90\x56\xe4\x75\x3b\xc6\x39\x8a\xbe\xf6\xa3\x6e\x08\xbd\x6e\x8f\xe6\x91\x74\x82\x9c\xce\x2a\x8a\xbb\x4e\x47\xe8\xd2\x3e\x39\x1f\x77\x82\xae\xdb\x13\x3a\x44\xc4\x35\xc2\xdc\x62\x95\xec\x1c\x6c\x4d\xd8\x3f\x40\xa4\xf5\x9a\xbb\x78\x44\x2a\xdc\xce\x52\x24\x06\xe1\xea\x84\xd4\xbb\x34\x6e\xc5\x6a\xfb\xd0\x6b\x72\xa0\xf4\xdf\xbf\x5b\x88\xc3\x71\x19\xdd\xd0\x35\x36\x5b\xb9\xc1\x0f\xce\xee\x2e\xb3\x7d\x41\x31\x17\x9b\x32\xd7\x3f\xd4\xaa\xa9\x8e\xc7\xf1\x38\x92\xa6\x13\x84\x0b\xdd\xbc\x11\x83\x23\x05\xb2\x1d\x54\x54\x92\xa2\x1b\x0b\xae\x87\x83\xdc\x3e\xbf\x98\xb0\xb9\xbe\x21\xd2\xfa\x22\x64\x4f\x2f\x2e\x9e\x62\x24\x80\x16\xb5\xfb\x31\x04\x1a\xc9\xdc\x4a\xd1\xe6\xd8\x6f\xaf\xf2\x76\x90\xbb\x73\x3a\x9a\xa4\xe9\xd1\x18\x0b\x72\xb4\x24\xd9\xfd\x8a\x31\x1c\x48\xb9\x8d\x3f\x54\xef\x22\xe7\x27\x0a\x30\x3f\x82\xea\x1b\x12\xe2\x0f\x9f\x5f\x5c\xb8\x40\x32\x68\x5a\xb0\xd1\xc2\xdc\x45\x24\x01\x62\xfb\xb8\xbc\xef\x51\x19\x27\xbe\x7f\xd6\xfe\x1e\x92\xb7\x4d\x90\xf9\xce\xf2\x76\xe0\x08\xf3\x53\xee\xab\xef\x22\xeb\x29\x09\x9f\x74\x6e\xe6\x3d\xe2\x7f\xdb\x82\xe7\xcd\xd8\x5e\x7d\x88\xff\xe7\x1a\x7d\xc4\xfd\xd4\x4f\x28\x28\x27\x57\x55\xdd\x70\xf2\x3f\x86\xd6\xf2\xf1\xe5\xa9\x70\xd1\x06\x17\x12\x1a\xbc\x76\xc0\x0e\x6b\xc7\x16\x2f\xd6\x2b\x5f\x27\x28\x62\x73\x52\x19\x0e\xf9\xf7\xe3\xa3\x7c\xd7\x49\xf0\x9a\x10\x5f\x7e\x9a\xd8\xde\x5d\x8d\xc4\x20\x7d\xe3\xe2\x7c\x37\x7b\x05\x37\x6d\xae\xeb\x23\x7c\x77\x92\xcf\x03\x0a\x0f\x89\x8a\x17\x9d\x9d\x72\xe7\x1d\x90\x91\x6e\x99\x7d\x0e\x9e\xdb\xba\x65\x12\xb1\x71\x5e\x1a\x17\x1a\x3c\x34\xd7\xed\x73\xe7\x01\x22\xb8\x6a\x52\x47\xcd\x1e\x4e\x9a\x34\x51\x3e\x75\x68\xec\xec\xa4\xd9\x22\x45\x7e\xac\x93\x66\x63\x7e\xfc\xae\x4e\x9a\x74\xe9\x1d\xd1\x49\x43\xb2\x32\xd0\x8b\xab\xbd\x42\x7a\xfc\x32\x93\x44\xef\x40\x82\x03\xdc\x5a\xc9\x32\xe8\x15\x98\x8d\xfd\x55\x57\x1b\x4a\x02\xb9\x01\xc3\xe2\x71\xa4\xa5\x1b\x34\xab\x64\x09\x8b\x5a\xdc\xf0\x3a\x2f\x5c\xa3\x59\x35\x67\x3c\x52\x65\x84\x95\xf8\x20\x35\x6c\x46\x6b\xd0\x0b\xa8\xed\x14\x19\xd1\x96\xd3\xee\x48\x56\xfb\xf9\x31\xf4\xb4\xbb\x90\x63\xfd\x9d\x2a\xfb\xa8\x73\x5d\x4f\xe5\x9a\xcd\x27\x72\xa7\x0b\x06\x1a\xb7\x45\xeb\xa1\xd3\xa4\xce\x2e\x5f\x08\x17\x71\x30\xee\x17\x32\x5b\x78\xdf\x3b\xd7\x5a\x65\x32\x2c\xe1\x40\x44\x2c\xa2\x5e\x25\x9b\x1a\xee\x40\xa1\xe7\x27\xed\x18\xd1\xca\xdc\xca\x0d\xf5\xf4\xd9\x81\x24\x7a\x84\x77\xb1\x2b\x93\xeb\xed\xd9\x43\x08\x51\x8f\x8c\x6c\x92\x0f\x32\x42\xb6\x93\x91\x8e\x26\x49\xc5\xa3\xa5\x32\x7b\x45\xc4\x0c\xf3\xb5\x87\xa7\xa8\x31\x77\x70\x2f\xee\xae\xa8\x9c\xe7\x0b\x5d\x7a\xc1\xdd\x45\x89\x73\x07\x65\x7d\xe4\x59\xec\xf7\xc0\x1c\xd2\xbb\x78\x34\x99\xc1\x6f\x3b\x0d\x7a\x2f\x3e\x7c\xfe\xf9\x45\x4f\x1f\x84\x34\x11\xd1\x9f\x3c\xdc\x34\xf1\xf7\x81\xd4\xa0\x93\x0b\xa2\xf3\x35\xce\xd0\x12\x72\x72\x78\x02\x17\xcf\x01\x4a\xc0\xee\xb3\x08\x0e\x2c\xe9\x6d\xc9\xf6\x2e\xe5\x8f\x4c\xa2\x37\xc6\xe1\xf4\x19\x8f\xdb\x6d\xa2\x6b\x04\xb3\xb5\xf3\xf9\x93\x4f\xa4\x21\xb7\x96\x4c\xb4\xb6\x8e\x73\x1e\xdf\x4e\x00\xc9\x9f\x73\x78\xb9\x73\x8e\xa2\xfd\x8e\x51\xc7\x11\xb2\x6d\x7c\x84\x91\xd2\xeb\x44\x78\xb5\x65\x2b\x1c\xe8\x13\xf8\x07\x35\xab\x0e\xcc\xf8\x53\xa8\xa0\x44\x14\x0e\xeb\x37\x3c\xa5\xa0\xe0\x8e\xb9\x59\x3f\xe1\x34\xb7\xdb\x3c\x37\xc9\x10\xc0\x5c\x23\x47\x83\xc5\x26\x1e\x8b\x97\x70\x27\xe1\xdc\xbe\x0a\xc0\x5a\x01\xed\x71\x0b\x7a\x97\xe0\xb1\xd4\x94\x3d\x57\xf6\x49\xa0\x1e\x21\x82\xb2\xec\xba\xff\x22\xa1\xe8\x89\xb5\xef\x44\xa2\xb4\xa5\x6e\xa6\xb0\x3e\x6e\x4b\xfc\x74\xea\x06\xec\x95\xc1\x83\x31\xfb\xec\xba\x99\x5d\x71\xb3\xf8\x86\xbd\x15\x1c\xda\x9e\x3b\x1f\x25\x20\xc1\x43\xa5\x60\xe7\xef\x3e\x5b\xcb\xf2\x66\x06\xab\xf3\xb9\x51\x4b\x99\xb1\xfb\x5a\x9a\x6e\xf9\x5b\x2f\xd1\xf8\xb2\x0e\x47\xfa\x30\x18\x38\x86\x63\x5d\xb4\x9e\xf7\xc1\x5d\xe6\xdd\xca\x19\x2f\x71\xc1\x0f\x4e\xa8\xc7\x64\x86\x23\x3b\xbb\xe7\xdd\x16\xf8\xdc\xa1\xbb\x95\x81\x81\xb3\x82\x60\x50\xef\x91\xc9\xe5\x9d\xcc\x1b\x5e\x50\x06\x82\x2c\x23\xf4\xc7\x9c\xdb\x5d\x6d\x5d\x87\xcf\x47\xc4\x51\xdc\x81\x2c\x1d\xae\xa0\x31\xff\x3c\xf8\x9b\xda\x01\xee\x8f\x88\xe3\x18\x03\x5c\x68\xc5\x1a\x0d\x67\x11\x84\x03\x8f\xa0\x98\xb0\xd4\xd1\x65\x14\x5a\xbe\x72\xdb\x36\x19\x6b\x85\xc4\x5d\x98\x9c\x56\x50\xe2\x78\xd7\x13\x88\x8a\x1b\xee\x88\x6b\x3f\x9e\xd1\xbf\xe9\xea\x6f\xdf\x92\x1d\x95\xa5\x61\xb0\xe3\xf1\x34\x8c\xf1\x6f\xca\xd1\xc4\xa2\x39\x2a\x3b\x69\xa4\xe3\xf1\x92\x06\x68\x99\xe3\xc1\x8f\x7e\x38\x46\x12\x13\xc3\xed\xea\x71\x18\xf9\x1f\xff\x2f\x00\x00\xff\xff\xd3\xc8\x0d\x6b\xee\xa9\x02\x00") +var _testConformanceTestdataConformanceYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x6b\x73\x1c\x37\xb2\x20\x0c\x7f\x3f\xbf\x02\xe1\x2f\xb4\x37\x9a\x2d\x52\xf6\xd8\x1e\xcf\x3b\x6f\x84\x4c\xc9\x63\x9d\x63\x4b\x1c\x52\x1e\x7f\xf0\x71\xe8\xa0\xab\xd0\x6c\x0c\xab\x0b\x35\x05\x14\xa9\x3e\x1b\xfb\xdf\x9f\x40\x66\xe2\x56\x97\xee\xea\x1b\x49\x79\xb4\xcf\x3e\x3b\x16\xbb\x90\x48\x64\x26\x12\x89\x44\x5e\x4e\x99\x11\xda\x94\x7c\x29\xbe\x63\x2f\xf2\xa5\xd4\x5a\xaa\x92\xdd\x8b\xd9\x42\xa9\xdb\x09\x2b\xa4\x36\x6c\xd9\x18\x6e\x64\x79\xe3\xfe\xac\xff\x83\xb1\x4c\xe5\x02\x47\x9d\xfc\xa6\xe5\xcd\x29\xaf\xe4\xe9\x92\x67\x0b\x59\x8a\x7a\xf5\x7b\x00\xf5\x2b\x0e\x61\xbf\x5d\xd6\xf2\x4e\x16\xe2\x46\xe4\xdf\x5d\x14\x8d\x36\xa2\xb6\xdf\x94\xbf\xc3\x14\xb2\xbc\xf9\x0f\xc6\x58\x77\x26\xa6\x17\xaa\x29\x72\x76\xaf\xea\x5b\xf6\xdb\x85\x2a\xe7\xaa\x5e\xf2\x32\x13\xbf\x9f\xfc\x07\x63\xb9\xd0\x59\x2d\x2b\x23\x55\xf9\x1d\xbb\xa8\x05\x37\x82\x9d\x9f\x75\xa0\xb0\x4c\x95\x73\x79\xd3\xd4\xdc\x7e\xa9\x27\x8c\x17\x05\xbb\x97\x66\xc1\x38\x2b\xf8\x4c\x14\x53\xf6\xc2\x18\xb1\xac\x0c\x20\x61\x14\x2e\xdb\x2c\xc4\x00\x04\xb6\xe4\xc6\x2e\xf5\x06\xbe\x01\x10\x7f\x01\xa0\xf6\x9f\x19\xe0\x91\xbb\xa1\x00\xb2\x35\xfc\xe7\x5f\xae\xdf\xb1\x99\x60\x55\x2d\xb4\x28\x8d\x9f\xde\x4e\x8d\xc3\x19\x2f\x99\x9a\xfd\x53\x64\xe6\x2f\x00\x14\xff\xdb\x0d\x0c\xb4\x12\x79\x32\xb8\x16\x4b\x75\x27\xb6\xc3\x1c\x28\x01\x10\x73\x51\x08\x23\x32\x55\x14\x22\xb3\x5f\xe3\x9a\x06\x00\xb9\x35\xe0\xa0\xbc\x67\x0d\x00\x73\xcd\x3a\xde\xbc\x05\x00\x6e\x1d\xff\xc1\x58\x2d\x0a\xc1\xb5\xf8\x8e\xdd\x9d\x4f\xcf\xbf\xfe\x0f\xc6\xe6\xb2\x10\xdf\x81\x84\x3e\x13\xcf\xc5\x33\x5e\x49\x2f\x63\xcf\x08\xaf\xe9\x8d\xfa\x8f\x31\x42\x7c\xc7\x0b\x99\x3f\x90\x18\xf7\xcc\xb5\x93\x20\x77\xe1\xfc\x01\x44\x99\xfe\x1a\x8b\x72\x2e\x4a\x79\x28\x49\xee\x4a\x31\xca\xe1\x3e\x92\xdc\xbf\x04\x80\x1b\x4b\x32\x2d\xe3\x78\x82\xdc\x54\xb9\xc5\xa6\xad\xdf\x0e\x2a\xc7\x15\x91\xf5\x19\x4c\xe6\x24\x9a\x77\x95\xea\x78\x81\xbe\x12\x37\xd2\xce\x10\x43\xe1\xed\xd5\xa5\x5c\x99\xb2\x5f\x70\xad\x91\x00\x38\x89\x2e\x95\x61\xbc\xaa\x8a\x95\xfd\x47\x24\x51\xaa\x12\x38\x98\xf1\x32\x67\x7c\x13\x13\x63\xa8\x9e\x8b\xa8\x8c\x22\x55\x35\x65\x97\x96\x20\x89\x20\x1a\xb5\x7e\x7e\xa4\xd8\x0d\x97\xdb\x61\x82\x58\x74\x31\x38\xba\x3c\x75\xd5\xcc\x83\x48\x54\x8f\x76\xdb\x49\xa6\x22\x38\x4f\x54\xaa\x72\x51\xae\x22\x98\xbb\xc8\x14\xca\x13\x1d\xa9\xdb\xca\x54\x7b\xfe\xe3\x49\x14\xcc\xc4\x8d\xe1\xd9\xe2\xa0\x32\x84\x82\x01\xcb\x9f\x09\xc6\x67\x85\xb0\x4b\x8f\x66\xb3\xdc\xaf\x54\x3e\x5a\x6a\xca\x4d\xb2\xc2\xcc\x82\x1b\x54\xe9\xda\xfe\x52\xda\xd3\x84\x64\xd7\x32\xcb\xce\x76\xa2\x69\x76\xa6\x9b\xd9\x69\x2d\xb4\x6a\xea\x4c\xf8\x03\x44\xc3\x87\xf8\x41\x38\x64\x8e\x7c\x46\x00\x4d\xb2\x46\x1b\xb5\x64\x0e\xa3\x20\x23\x39\x9d\x72\x0f\xc5\x9c\x5e\x44\xa4\x2a\xbd\xee\xf1\x28\xd9\x45\x1c\x89\x79\xad\x39\xfd\x26\xf2\xf3\xaa\x79\x1b\x51\x9d\x32\x11\xe9\xd7\x45\x5a\xd0\x38\x00\xe9\xc7\x3e\x34\xb3\x9d\x35\xf2\x20\x1c\xb5\x9b\xcc\xae\x1f\xe9\xbd\xe4\x95\xa7\xef\xa1\xd9\x67\x3f\x32\xba\x3b\xe1\x14\xf0\xea\xb2\x87\x95\xaa\x3c\xcd\xd4\xb2\x2a\x24\x2f\x8d\x1d\xa7\xd3\x81\x7a\xc2\x54\x4d\x3c\x7c\x06\xa7\x12\xf3\x9f\x03\xcc\x9e\x21\x16\xfc\xac\x0d\xba\xc5\x5f\xf6\xa2\xec\x53\xc8\x0e\x24\xae\x26\xe3\x8d\x16\x9a\xf1\x58\xe3\x2f\x78\x79\x83\xc0\x6a\xa1\x9b\xc2\x30\x6b\x31\x84\x0f\xe4\x52\xa8\xc6\x30\x51\xd7\xaa\x9e\x58\xbc\x50\xf9\x2c\x04\x40\xf5\x64\x1f\x87\x4d\x6b\x09\x7e\x85\x00\x13\xe7\x5d\x48\x23\xec\x75\x41\xe4\xcc\x8a\x91\xae\x78\x26\xd8\x8c\x6b\x91\x33\xe0\x49\x38\x55\xc2\xcf\x5a\x58\x33\x5b\xd5\x1e\x0b\x5e\x14\xea\xfe\xe1\x35\x5c\x2e\xe6\xb2\x94\x64\x7d\x1d\x65\x23\xd0\x5e\xcb\xb7\x97\xf7\xc0\xd1\x58\x2b\x0d\x2e\xc0\x5b\x09\xad\x9b\x9c\xe7\xe4\xf0\xd0\xe4\x86\x55\x8b\x7f\x35\x42\x77\xa4\xf5\x78\x8c\x59\xa8\x52\xd5\x4e\x6c\x8f\xc5\x86\x64\x92\x0d\x2c\xf8\x45\x83\x51\x98\xd2\xff\x9e\x5b\xad\xf2\x27\xa6\x45\xa6\xca\x5c\xb3\x99\x98\xab\x5a\xa0\xb6\x01\x23\x12\xcd\x28\x3d\xf1\x3a\x49\xf8\x7d\xe7\x00\xc1\x45\x33\x53\xcb\x99\x2c\xe9\x12\xa9\xe6\x0e\x27\xd4\x20\x73\x2e\x8b\xa6\xb6\x3b\xb5\x90\xd9\xca\xda\xa8\x4d\x74\xa8\x30\xa3\xf0\x32\xed\x59\x0a\x53\x31\xab\x4e\x01\xb6\xe0\x59\x32\xc1\x94\x5d\x21\x37\xe9\x70\x71\xeb\x97\x73\xe4\xb8\xc3\x14\x69\xd4\xd6\x20\x52\xb3\x42\x68\x6d\xd7\x5f\x46\x2b\xef\xc1\x53\x6a\xf8\x4b\x34\xdd\xb2\xd1\x28\x81\xd6\x40\x6e\x4d\xdb\x1d\x2c\x6f\x4a\x55\x8b\x36\xb6\xd6\x06\x8e\x86\x6e\xc6\xf6\xfc\xcc\x23\xf9\xf9\xb2\xc9\x16\xac\x50\xe5\x8d\xa8\x71\x01\x09\x23\xb8\x34\x2c\xa7\x63\xe3\x8b\x63\x2a\x1d\xa9\x33\x75\x27\xea\x15\xcb\x55\xd6\x2c\x45\x79\x34\x01\x97\x65\x56\x34\x79\x58\x62\x30\x2b\x64\xd9\x83\x86\xde\xb0\x07\xde\x2d\x44\x38\x6e\x6b\xd0\x49\x74\x19\xba\xfd\x56\x4f\xa5\x62\x2f\x2e\x5f\xb3\x9b\x5a\x35\x15\xf2\x4a\x7c\x90\x96\x6f\x12\xe9\x6c\xc9\xa5\x51\xfd\x75\x66\x9e\x6e\x84\xfd\xec\xee\x3c\x80\x7f\x76\x27\x6a\xed\xce\x2b\x00\xd9\x33\xd5\xe0\x34\xce\x71\x40\x54\x69\xb9\x70\xdc\xd9\x18\xae\x82\xfd\xdf\xb5\x4c\x34\x40\x20\x99\xff\xd9\x86\xe5\x0c\x91\xe2\x78\x82\xa7\xea\x5c\xd4\x22\x27\x02\x1c\xef\x78\x23\xbf\x43\x30\xeb\xb6\xf7\xe9\xf4\xdb\x72\xa0\xcf\xcc\xbd\x0a\xae\xd0\x60\xdd\x45\x1e\x45\xb2\xcf\x4a\xe1\x7e\xb6\x0a\x8a\xe5\xdc\x70\x76\x2b\x56\xa9\xa2\xb3\xe8\xf1\xa2\x16\x3c\x5f\xb1\x05\xb7\xdf\xe9\x4a\x64\x72\x2e\x33\xfb\xed\x24\xdc\x92\x4b\x65\x16\xa8\x36\x3c\xc4\x08\x98\xfd\x4f\x9e\xe7\x22\x67\x33\xbc\x1e\xcf\x65\xad\x8d\x5f\x86\xd4\xde\xab\x19\x5b\x9c\xe9\x51\xec\xf5\xf6\x5f\xd8\x4c\x99\x85\x85\x19\xec\x7f\x04\xee\x6e\xf4\xfe\xd3\x23\x4a\x8b\xe3\x62\x6a\x21\x1c\x5b\x66\x5a\xf6\xc8\x6e\x76\x11\x02\xd3\x5d\xfb\x66\xe8\x69\xa1\x3d\x6d\xe2\xa1\x6d\xfd\xe6\x38\x72\xfc\xc7\x86\x01\x9a\xa0\x6b\x5a\xce\xe7\xa2\x16\xa5\x61\xda\x28\xbb\xa9\x49\x25\x3e\x30\x7f\xd6\xe2\xb2\x27\xf7\xda\xf7\x68\xe6\xed\x59\xd8\x91\x78\xf9\xc2\xfd\x14\x81\x5a\x63\x0c\x37\x60\xc3\xdd\x9d\x33\xae\x5b\x98\x4e\xdd\x4b\x09\xef\xbb\x85\xc7\x4e\xb6\x35\xe0\x8d\x62\x8d\x16\xec\xee\xb9\x85\x6f\xbf\x6d\xcd\xd1\xde\xf9\xd5\x20\x50\x7a\x85\x29\xc5\x3d\x9b\x4b\x51\xe0\xa5\x15\xec\x3e\x14\x49\x1c\xe9\x0f\x3f\xab\x1e\xaa\xaa\x90\x22\x67\xba\xc9\x32\xa1\xf5\xbc\x29\x8a\xd5\x23\x49\x66\x55\x37\x25\x7a\xb7\x1e\x5c\x10\x69\xea\xb1\x72\xd7\x7d\x22\x0e\xda\x1d\xe8\x8e\x1e\x01\x9c\x89\x4c\xf9\xa9\x1f\x4e\xae\xe7\x35\x02\x41\x6c\xd4\xd9\x42\x2c\x39\xc2\x26\x8b\xcc\xca\x72\xb1\x82\x23\x4a\xe1\x01\x62\x4f\x27\x80\x08\x5a\x3f\x39\x4a\x1c\x76\x89\xf2\xea\x4c\xfc\x17\x3a\x76\x00\x6d\x9a\xc6\x59\x81\x28\x8d\x88\x46\xeb\x95\x0d\x2d\x77\x10\x32\x6b\x95\xbb\x81\x7d\x83\xf0\x69\x0a\x5d\x11\xe1\x30\x3b\xa6\x84\x79\x22\xe6\x62\xce\x9b\xc2\x1c\x5f\xac\x9c\x87\x08\x1d\xe8\x34\xad\x66\x7c\x1e\xe4\x65\x1b\xbd\xd6\xb1\x67\x22\xf3\xa1\x64\xaf\x4b\x69\x2e\x54\x69\xb8\xc5\x1c\x34\x82\xca\xf5\xf0\x5d\xbd\x52\x39\x32\x39\x1d\xd7\xb2\x10\x16\x82\xbd\x13\xf5\x92\x2e\x7b\x3f\x0b\xad\xf9\x8d\xb8\x84\x5b\x55\x78\x49\x80\x2b\x3c\xac\xed\xa8\x07\x58\xf0\xcd\x65\xaa\x34\xb5\x2a\xf0\x69\x04\xdd\x3a\x6c\xc8\x65\x07\x68\xd2\x76\x3b\x16\xbb\x2d\x1e\x91\x3b\x92\xb8\xaf\x6a\x2b\xd9\x77\x76\x5b\xc4\x0e\xdd\x7e\x63\x94\x30\x1c\x2b\x0c\xa9\x8e\xa1\x09\xd1\xfb\x5b\xae\x36\x4f\x17\x13\xa5\xff\x59\xd9\xfb\x91\xf9\x5a\x84\xc9\xb8\xf4\xaf\x41\x3a\x91\x0a\xc7\x1b\x0b\x6e\xf0\xc1\x7c\x4d\xe8\x45\xaa\xb0\x8e\x27\x59\x73\x2e\x0b\x96\x15\x4a\x83\x8e\x3b\x8a\x88\x34\x65\xa6\xca\x1c\x34\x39\x2f\x8a\x15\xab\x05\x2c\x3a\x10\xce\x0a\x70\x84\x87\xa7\xd5\xd6\x56\x0f\x9d\x13\x31\x2c\x72\x83\x58\x36\xd8\x5f\x55\x63\xd8\xc5\x0b\x36\x6b\xca\xbc\x40\x0d\xac\x15\x1d\x28\x86\x65\xbc\x24\x71\xce\x78\x51\xc4\x51\x07\x11\xae\xf0\x71\x2d\xfe\xd5\xc8\x1a\xdf\x2c\x3b\x7e\xf3\x10\xdc\x70\x1c\x2f\x1f\xbf\xb9\xa9\xc5\x0d\x37\xaa\x3e\xd5\x4d\x55\xa9\xda\xe8\x53\xb3\x10\xa7\x9a\x2f\xab\x42\x58\x9e\x69\x51\xdf\xc1\xb9\xba\x89\x9f\x1e\x12\xbb\xc6\x57\xde\x68\x2b\x13\x6c\x58\xe3\xf9\xf4\xfc\x1b\x76\x0d\xf0\xd1\xf8\xba\x7c\xcd\xae\x61\x12\xb2\x05\xd1\xf8\xaa\xc1\x76\x8d\xa0\xae\xe7\xe0\xab\x52\x37\x35\xdd\x2d\xe1\x8c\x6c\x2d\x00\xd0\x67\xf3\x5a\x2d\x11\x01\x7c\x05\x58\x56\xb2\xb0\x1b\xeb\x86\xcb\x92\xdc\x60\xf0\xeb\xbd\x2c\x0a\x7c\xa5\x26\xc7\x78\x17\x9f\x67\x2f\x2e\x5f\x9f\x22\xde\x1d\x66\x7c\x33\xb1\xff\xf3\xfc\x7c\x03\x4f\x02\xf1\xdb\x6c\xb9\x40\x33\xe2\xca\xd9\x2f\x2f\x83\xfd\x72\xa1\x4a\x67\xc9\xff\xea\x36\x5e\x06\x7f\x33\x6c\x29\x3f\x44\x86\x7e\x21\xf5\x08\x27\x16\x4e\xe5\x66\x0a\xd0\x37\x6e\x4b\x94\xf8\x0e\xab\x1d\x2e\xf0\x20\xc1\x16\x6a\xa9\x6e\x44\x29\x54\xa3\x31\x52\x49\xcd\xd9\xc5\xd5\x68\xfd\xcc\x09\x5c\xf2\x94\x04\xa6\xc0\x1a\x13\xcf\xdd\x1b\x06\x6c\x41\xba\x00\x70\x63\x79\xc4\x2e\x16\xbc\xbc\x11\x9b\x6e\x11\x76\x0c\xbf\x11\xee\xf4\xbf\x7b\xde\xb9\x9b\xf4\xc2\x7f\x9e\x1c\x0a\x3e\x52\xab\x7d\x87\x42\x44\xed\xf7\x68\x4a\xc0\x87\xf4\x62\x04\xdb\x3e\x43\xbb\x02\x0f\x89\xce\x0d\x0c\x67\xda\x56\x21\x64\x75\xfe\x3e\x10\xf7\xfd\x80\x7e\xd8\x49\x10\xd1\xb8\xd8\xd6\x45\x71\x2c\x41\x84\x3d\x7f\x71\x65\xaf\x98\x46\xc1\x7f\x3c\x7f\x48\xf1\xbb\x3b\x1f\xf4\x77\x68\x0c\x84\xe3\xb9\x3d\x30\x80\x8b\xc8\x6e\xb8\x2f\xee\xa0\xe3\xf7\x65\xe9\x84\xdd\xdb\x3b\xec\xb6\xac\x8a\x64\xe2\x57\xb8\x03\xaf\xe7\xd4\x86\xc1\x80\x02\xeb\x0a\x50\xbc\x1d\xc7\x59\x79\x7e\x87\x0e\xaf\x38\xd9\x9f\x38\xb3\x74\x01\x36\x44\x0a\x32\xc3\xd4\x0c\xce\x11\x1f\x29\xb0\x54\xb9\x9c\xaf\x62\x0b\x0f\x4c\xd4\xed\xcd\x2b\xcb\x34\x98\x6b\x1b\x3e\x8d\x0d\x09\x18\xa4\x75\xd0\x1e\xeb\x99\x75\x2d\xed\x31\x3a\x0c\x07\xdf\x4a\xcb\x9b\x67\x68\x2b\x97\x37\x23\xd8\x86\x8f\x42\xaa\xbe\xd5\x6c\x2c\x07\xad\x8d\x20\x3e\x18\x51\xa2\x6a\x29\xa4\xbb\x24\x03\x74\xfb\x45\xcd\xcb\x5c\x2d\xd7\x6d\x4b\x14\x3e\x84\xb8\x41\xdd\x93\xa1\x5d\x3a\xd6\x4a\x7a\xa4\xf0\x2f\xc3\x71\x74\x49\x62\xaa\x07\x57\x4f\x5b\x10\xfe\xbc\x49\x0e\x00\x9d\xf7\x0e\x9d\xf7\x11\xe6\x5b\x08\x86\x36\xdc\x34\x3a\x09\x57\x7a\x02\x52\x72\x23\xe0\xe5\xd5\x07\x08\x3e\x73\x21\x83\xeb\x9f\xf9\x59\xdf\x72\xb6\x94\x9c\x75\x7a\x3a\x09\x47\xe6\x79\x12\xfe\x53\xf9\xed\x2f\x8d\xee\xc3\x03\xa3\xa8\xbd\x2f\x21\x41\x31\x32\xf1\x9d\x60\xdc\x49\x2d\x67\x85\xb7\x20\x74\x33\xd3\xe2\x5f\x8d\x15\x63\x3b\xf5\x0e\x6a\xe3\x20\xe2\xb2\x8b\x89\x78\x04\xf9\xa0\xd8\xfa\x31\x2a\x7f\x7f\xbd\x31\x71\x4a\xe3\xfc\x0c\xc3\xca\x45\xbe\x66\x62\xed\x1f\x9b\x9c\xf9\xb6\xa4\x6b\x0a\x05\xe4\xfb\x08\x99\x0d\xb6\x1b\xf8\x16\x7d\x28\x3b\x79\x01\xd7\xcc\x3b\x65\x2f\x51\xf9\x44\x63\xd6\x7d\xcf\xee\x24\x8f\xb2\x3c\x58\x9c\xe6\x01\xbe\x4c\xfc\x73\x57\x51\xc1\xe2\x28\x8c\x14\x3e\xd9\x1a\xd3\xc7\x91\xdd\x6d\xdc\x8f\x7b\x4b\x70\xcf\xf2\x69\x72\x36\x57\xb5\x0b\xc5\xa1\x90\x0b\x6b\x70\xd2\x8d\xe1\x60\xda\xca\x7b\x1c\x68\x66\x7f\x01\xb9\xb8\x9a\xb2\x17\xb9\x0b\x61\x82\xdf\x00\x0b\xb0\x2b\x2f\xae\x58\x53\x1a\x59\x90\x04\xe0\xaf\x52\xbb\x97\x89\x70\x8b\xa1\x87\x54\x0b\xec\x0a\x33\x33\xe8\x6b\x7a\x6c\xcd\x73\x3f\xdc\xae\xd7\x7d\x1f\x1e\x42\xd2\xe9\xc2\x23\x89\xd4\xc1\xa9\x39\x61\xb3\xc6\x30\x55\xa4\xc8\x6a\xc3\x57\x5d\x19\xfa\xe6\x61\x64\xc8\xbd\xf4\x3f\x80\x08\xd1\x0d\xc5\x85\x7f\xac\x61\xf5\x9e\x11\x21\x3f\x08\x6b\xc7\x42\xb8\xc3\xc4\x45\x3d\x54\xd2\xab\x41\x4d\xd1\x0e\x10\x71\xb8\xe6\xf7\xe1\x68\x08\x8d\x43\x85\x73\xb9\x88\x15\x93\x65\x2e\x33\x10\xc7\x21\x32\xad\x9b\x22\xba\xcb\xd6\x82\xf1\x3b\x2e\x0b\x7b\x8b\x7b\x40\xc5\xf2\xb6\x12\xa5\x3d\x2c\x2e\x9b\x59\x21\xf5\xc2\x1a\x52\xaa\x62\xd6\xe4\x87\xd7\xc9\xb1\xcf\xb8\xe9\xea\x09\x98\x83\xbd\x5e\x3c\x30\x21\x4a\xc7\x72\x80\x8a\xa4\x12\x19\xbb\xb7\xc6\xa8\x2a\x85\xf7\xed\xdc\x08\xa3\x59\x06\xbe\x8b\xdc\x65\x37\x58\xad\x6e\xef\x28\xe3\x83\xe4\x37\xbe\x93\x2d\xad\x8e\xb3\x47\x37\xcd\xab\xa7\x8e\x52\x6e\x0b\xfb\xe3\xc7\x3f\x61\xe1\xa2\x45\x0e\x8a\x62\xed\x01\x17\x25\x6b\xf4\x3c\xf0\xb6\x5e\x71\xed\x0a\xf1\x0a\x16\x3d\xd0\x75\xd0\xea\xa0\xe4\xde\x62\xd1\xb4\xf3\xb4\x72\xa7\x72\x04\x84\x5c\xb7\x9a\x95\xca\x85\xa3\x21\x39\x77\xba\xd2\x11\x19\xde\xab\x4a\x94\xbc\x92\x5b\xcb\x9f\x43\xaa\x06\x71\x3b\xaa\xe4\x21\x69\xf0\x75\x3c\x70\x6f\x8d\xdc\x21\x4e\xc7\x14\xb3\xbf\x1c\x52\xcc\xae\x00\xdd\x48\x6c\x30\x94\x8c\xa6\x72\xa2\xb4\x06\xc7\x3b\xc9\x19\xc7\x1b\xc1\x5f\xd6\x0b\x1a\x5d\x20\xe0\x42\x31\xb7\xe6\x17\x80\x46\x7a\x3d\x8a\x18\x01\x79\x3f\x9c\xc2\xd3\x70\x7d\x27\x4e\x9b\xf2\xb6\x54\xf7\xe5\x29\x3d\x49\x73\xc3\x6a\xa5\xb6\xbe\x02\x6c\x25\x5e\x68\x01\x59\x2e\x5d\x5c\xbd\x64\x84\x89\xd5\xaa\x84\x0b\x0b\xb8\x44\x8f\xdb\x16\xad\xc3\x09\xd8\x20\x05\x7a\xde\xe2\xed\xcc\x43\x8f\x79\xf8\x02\xcd\x49\xf3\x76\x27\x9e\x78\x2b\xfc\xb6\x99\x89\xcc\x14\x7f\xa1\x4b\xc7\xa9\x96\x79\x48\xc4\x73\x41\xfd\x3c\xcb\x44\x65\x3c\x21\xaa\xda\x5e\x1c\x8d\x8c\x03\x89\x09\x0e\xc5\x53\x56\x05\x97\x64\xcf\xab\xc6\x54\x0d\xdd\x31\xf4\x42\xdd\xf7\x0a\xf1\x7f\xbd\x7e\xf3\xf2\x29\xca\x9d\x2c\x99\x58\xce\x44\xee\xa2\x21\xf0\x76\xf7\x24\xc4\x10\x92\x3a\x3d\x76\xee\x55\xf5\xe1\x24\xb1\x3b\xf9\xce\xc2\x88\x7a\x4e\xf2\x47\x11\x46\x6e\xfa\xd6\x1a\xa0\xda\x93\xb6\x09\xa9\x27\x18\x00\x20\x20\x39\x05\x08\xf2\x78\x62\x1b\x11\x06\x55\xc2\x03\xca\x65\x3f\x02\x87\x13\xbf\x24\x9b\x96\x80\x67\xaa\xd4\x51\x71\x03\x35\x0f\x19\x12\xbc\xae\xf9\x0a\x6f\xb5\x55\x2d\x97\xd2\xc8\x3b\x31\x18\xe9\x30\x20\x8f\xa9\x51\x47\xe1\x7e\x16\x89\x48\xc4\x26\xe3\xc5\xb4\xe2\x5a\xa7\x51\x7b\xad\xd0\x09\x5c\x68\x57\x8c\x93\x77\x7b\x7a\x74\x8f\x71\xc0\xa7\xf6\x75\x53\x53\xb0\x01\x08\xbc\x9f\xae\xb3\x3b\x92\x9d\x81\x14\x8d\x76\x07\xfd\xd8\xab\xad\xd7\x6c\x39\x3f\x8e\x1c\xa3\xc3\x43\xbb\x1b\x32\x9e\x92\x76\x58\xf7\x71\x8e\xc5\xb3\x3f\xcd\x13\xe3\xc1\x0f\x09\x27\x2c\x47\xdc\x8f\xa3\x0c\x13\x7b\x15\x2d\xc4\x9d\x28\x3e\xce\x03\xc1\xdd\xb5\x48\xf7\xb0\x97\xaf\xae\x2f\xae\x5e\x5f\xbe\x7b\xfd\xf6\x0d\xd3\x86\x97\xff\xcb\x1f\xe7\x86\xc5\xeb\x95\xd5\x45\x90\xbc\x32\x22\xa6\xed\x20\x62\xe5\x6f\x3a\x17\x57\x2f\xe1\xea\x11\xc2\xb4\x11\x8f\xf1\x61\xb2\x04\x68\x9d\x4b\x58\x57\xbc\x84\xd8\xdb\xf6\x2c\xde\xa9\xdd\xb9\x70\xed\x79\xd9\x7a\x4c\x46\xde\xca\x32\x7f\x34\x3e\x6a\x7b\xc5\xc4\x34\xab\x88\xae\xe0\xf0\x0c\xc4\x07\x0c\x0f\xca\x61\x77\x75\x49\x66\x8f\xef\xb7\x80\x41\x8f\x1c\x00\x2a\x5b\x70\xfd\xf0\x8f\x00\x07\xe4\xbc\x93\xe2\x27\xc0\xfc\x94\xe1\xde\xc9\xf0\x71\xb8\x4a\x8e\xc0\xc3\x97\xce\x7b\x4c\xe9\xb6\xf5\x12\x04\xf6\xb2\x16\x73\x51\xd7\x22\xff\x07\x89\xa9\x45\x0d\x92\x62\x79\x25\x91\x94\x9b\x99\xe9\x61\x3b\xdf\x3a\x9d\x60\x6b\xc0\xbb\x88\xc3\xbf\x01\xb3\xc6\x87\x14\x72\x1f\xbd\x06\x59\x8c\x52\xb3\x5a\x98\x5a\x8a\x3b\x91\x4f\xd9\xab\x04\x6f\x36\x57\x0d\xbd\xa8\x91\xe9\x6b\x9a\x3a\x9c\x7e\x1d\xd4\x9a\x92\x72\x77\x9d\x08\xe9\x66\x3e\x97\x1f\xec\x1c\xe2\x03\x44\x31\x4e\x33\xb5\xec\xf0\x66\x53\x3c\x81\x77\xdb\xb7\x39\xf2\x37\x5e\xcf\xf8\x8d\x60\x17\xf8\x40\xa8\xea\x89\x7b\xf8\xcb\x45\x55\xa8\xd5\x12\xde\x48\xe1\xb8\xe7\x37\x68\x0e\x50\xe0\xeb\x8c\x67\xb7\x16\xc5\x72\x44\x78\xaf\x9b\x25\x73\xb3\x38\x1e\xd1\x5c\x57\xd7\xbe\xfa\xd8\x6c\x15\xcd\x8c\x5b\x6d\x21\x4a\x70\xd3\xaa\xba\x5a\xf0\x11\xd9\x23\xfe\x01\x2d\x00\x72\xf7\x9d\x5a\x54\x85\xcc\xb8\x16\x66\xca\xde\x96\x99\x88\xfe\x60\x49\xec\x90\x98\xc4\x6f\xa7\xf8\x5a\xe6\x21\xc5\x75\xc7\xde\x56\xb8\x55\x2e\x03\x79\x30\x8e\x9f\x59\x80\x46\xb1\xef\x3d\x91\xf0\x96\xf2\xd2\x05\xc6\xb4\x80\xc6\x2f\xae\xe8\x24\xf4\x68\x45\x84\x69\x0d\x72\xca\x9d\x17\x1a\x93\x0e\x2f\x55\x4e\x61\xc4\x33\x51\x28\x3b\x8b\x6a\x8d\xe9\xd6\x3f\xdb\x32\x30\xe5\x06\x39\xf9\xde\x73\x72\xbc\x40\xd1\x9a\x4c\x94\x6c\x50\x88\x7a\x72\x6c\xd9\x82\x32\x1f\x11\x11\xeb\x6c\x4f\xa9\xea\x5f\x07\x8a\xc5\x73\xe0\x01\xc9\xd6\xd5\x45\x2c\x53\x71\x45\x0f\x4c\x3d\xbd\x54\x79\xf4\x81\xa7\xd3\xd5\xc5\x36\x22\x06\x30\x23\x31\x4b\x45\xec\x2a\xc2\xf5\x22\xe0\x8a\x96\x38\x6f\x74\x97\x3c\x56\x7c\x30\x61\xef\x82\xaa\xa1\x3c\x1d\x49\xc1\x1c\x1f\x75\x5f\x42\xf8\xfd\x18\xf3\x6e\x50\x38\x6e\x85\xa8\x70\xa7\x65\x8c\x03\xe5\xf0\xb1\xda\x47\xd8\x53\x31\x1a\x7c\x84\x24\x12\xb8\x54\xe2\x84\x33\x4c\xf3\x95\x66\x5a\x1d\x42\x7c\x96\xfc\x83\x5c\x36\x4b\xc8\xf1\xc8\xb8\x81\xe0\x55\xd8\xd4\x33\x61\xee\x85\xc0\xdb\xfe\xf9\x19\x18\x95\xe7\x67\x67\x5e\x4d\x0c\x09\x1c\xa6\x11\x14\x05\x02\xb1\x2b\xe9\x0a\x1b\xee\x86\x2d\x74\xda\x0f\xaa\x16\x9b\x84\x0d\xc3\xeb\x46\x0b\x5c\x47\xd8\x5c\x9d\x0e\x00\x7b\x81\x71\x03\x0f\x28\x85\x95\x28\x73\x51\x66\x2b\x96\xad\xb2\x62\xc4\x7b\xdb\xa0\x98\xd1\x4b\xec\xac\x50\xd9\xad\x3f\xdc\x08\x38\x1a\xd1\xb2\xce\x8a\x4d\x49\xd4\x3e\x4e\xb1\x16\x48\xbf\x49\xc8\x4c\x5d\x22\xef\xde\xde\x97\xa2\x66\x60\x4d\x88\x32\x13\x9a\xe9\x06\x7e\xe7\x50\x1a\x09\x1f\xd6\x17\x1c\x44\xfa\xcb\x89\xfd\x7f\x9f\xbb\x7f\x9e\xa3\x43\x4f\xe5\x5f\xba\xbf\x40\x76\xac\x6a\x03\xac\x85\xae\x44\x66\xe4\x9d\x28\x56\x2e\x1c\xc9\x15\x3d\x3a\x4f\x0e\x30\x2b\x70\x98\x27\xf7\x0e\x0f\x9f\x84\x9a\xf8\x29\x10\xc6\x52\x05\x4d\x9d\x94\x7e\x14\xa0\x79\x6c\x3e\x7b\xeb\x19\xd6\xba\x8f\x36\xb1\xab\x09\x66\x13\x2c\xd7\xe8\xa0\x4a\x17\xfc\x4e\xa0\x63\x12\xad\x3e\xa4\xad\x25\x3b\xfe\x97\xfd\xf0\xe4\x44\x43\x7d\x13\x17\x44\x14\xc3\x49\x76\xc6\x7e\x6a\xe6\xea\xe2\x7c\xb2\x5e\xd7\xd0\x1b\x39\xe8\x9b\x7e\x5d\x43\x73\x60\xcd\x96\xe1\x89\x9e\xc3\x50\x2d\xdc\x71\x12\x89\x95\x5d\xe0\x82\x17\x73\x7c\x6e\x55\x5a\x74\x35\xd9\xf9\x3a\x55\x86\x5a\xba\x57\x9d\x9d\xef\xaa\xcb\x00\xe6\x8f\x1e\xa9\xd8\x9a\xb2\xfb\x22\xc1\x3f\x88\x70\xa4\xb1\x1a\x83\x8c\xe6\x69\x30\xb0\x91\x4b\xa1\x0d\x5f\x56\x5b\x1c\xcd\x91\x3c\x05\x2c\xec\x7a\xe1\xec\x43\x0e\xad\x82\xfc\xf6\xb3\xa0\x73\x83\x3b\xe2\x89\x1d\x5f\x16\x7a\xec\x39\xb4\xb1\xf6\xd8\x60\x08\x60\xc4\x3d\x61\x13\xdf\xa5\x66\x6f\x11\xd6\x47\x73\x87\x40\x7c\x83\xf4\x78\x2b\xb2\x7d\x7f\xc0\xf3\x75\xf4\xf5\x01\xd5\x0a\x52\x56\xe4\x93\x9e\xab\xc4\xe0\xd8\x70\x8d\x70\xc3\x9f\x80\x75\x78\x44\xb9\x1b\xb8\x43\xc8\xb9\x8f\x92\x0d\xb6\xe0\xbf\x93\x29\xd8\x16\xcd\x35\x8a\x2d\x24\x46\x8c\x31\x03\x8f\x26\x56\xbe\x96\xe1\xa9\x53\xd2\xa7\x14\x6b\x77\x3a\xee\x46\xf1\xc6\x01\xd0\xec\xb7\x6b\x51\x4b\x5e\xb8\x94\xe4\x10\x02\xc9\x8d\xb7\x81\x2c\xa5\xa3\x88\xbe\x1c\xb5\x14\x8f\x6a\x2a\x06\xdb\x76\x0b\x0f\x94\x9c\x0f\xc1\x80\x4c\x95\x78\x76\x3f\xf3\xbc\xa6\xe7\x57\x80\xe0\x07\x77\x7c\x49\x9b\x12\x55\xc3\xc8\xf1\xb4\x85\xf0\x0a\x4c\x6e\x3c\x1c\x7d\x23\xa0\x2c\x59\xe9\x83\xd1\xd8\x61\x10\xcf\x0e\xd8\x40\xb0\xe6\xb1\xe8\xec\x49\xe4\x8b\x6d\xef\x45\x56\xbc\x4a\xf0\x08\xec\x7a\x1a\xbd\x88\xbe\x0c\x3a\x06\x8d\xfd\xe4\x17\x00\xdc\xfd\xc5\x39\x42\xc8\xd2\xb9\xf7\x41\xd0\xf8\x24\x7d\xcf\x7e\x82\xd6\x06\x6d\x72\x7d\xbb\x2b\xb9\x9c\x7f\xff\xef\x8d\x32\xbc\xa7\xaa\xef\x66\xe2\x25\x10\x7a\x92\x4b\xfb\x40\xb2\x74\xd4\x74\xec\x99\x90\xce\x05\x8f\xcf\x97\xbf\x60\x56\x86\x58\xaa\x7a\xc5\xfe\x05\x3f\x14\x72\x29\x8d\xb3\xc5\x93\x3a\x7b\x69\xde\x19\xfb\xd5\xca\x6a\x0a\x54\xea\x38\x00\x96\x72\x17\xd7\xcc\x32\x89\xa3\x19\xe3\x9c\x54\x0a\xae\x20\x58\x58\xf5\xb2\x0f\x65\x87\x6c\x17\x17\x3c\x46\xfd\xce\x9a\x30\x69\x12\xe3\xda\x47\x7f\xbb\xb7\xad\xe1\xed\xb4\xe9\x79\xc2\xc7\x81\xc3\xd2\x36\x08\x09\x05\x7a\x65\xaa\x29\x0d\xd2\x62\x92\x14\xd1\xdd\x45\x60\xb2\x7e\x16\x43\xed\x01\x5e\x99\xb8\xf2\x68\x21\xe7\x10\x9e\xea\x4a\xce\xfd\xcc\xab\xdd\x04\xa8\x25\x20\x3d\xb9\x3e\xd2\xe8\x74\xc8\x35\x64\xb7\x85\x1d\xba\x44\x4f\x83\x62\xe2\x83\xbd\xff\x8b\x1c\x03\xb5\xc0\xa4\x50\x86\x17\xbe\x20\x89\x7f\x44\x42\xd9\x41\xda\x59\x09\x91\x65\xca\x36\x16\x25\xe3\x86\xe5\xbd\x36\xba\x5b\xe5\xb8\x85\x6c\x14\x38\x84\xe6\x9a\x9d\x22\xae\xd7\x60\x89\xe7\x61\xb6\xfa\xe8\x38\x2a\x43\xe5\xa4\x9e\x25\xbb\x7b\x5f\x4a\xc0\xe0\xb6\x17\x29\x74\x67\xf5\x38\x6c\xdd\x9e\xd8\x84\xa7\x0f\x04\x1a\xc4\x93\xc4\x9a\x72\x87\xb6\xc1\xf4\x61\x37\x44\xa5\x46\xb8\xe7\x0f\xb7\x15\x2a\x95\xff\x31\x37\xc1\xa5\x22\x4d\xea\x07\xbb\x62\xce\x38\x9c\x34\xea\x84\xd4\xe9\x84\xbd\xaa\x16\x62\x29\x6a\x5e\x5c\x53\x5e\x99\x3b\x52\x5f\x7d\x30\xa2\xcc\x45\xee\xd6\x62\x0f\xdd\x29\xc0\x1f\xb1\xb3\xc8\xbb\x97\xc6\x81\xc5\x02\xbc\xd7\x3e\x4a\xea\x20\x50\xc2\xd8\xf0\xc2\xc5\x07\xbb\x97\xec\x8d\xa2\x16\x4b\x2e\xe1\x79\x06\xc5\xb4\xbb\x1a\x34\xb8\xb8\x2c\x5c\x51\xbf\x14\x48\x8b\xb3\xfe\x30\x8a\xf2\x4d\xe2\x92\x7c\xce\x9e\x71\xae\xcd\x13\xdd\xc1\xce\x0d\xf6\xe4\x74\x93\x23\x2b\x33\x8e\x0f\x4b\xf9\xaa\xe4\x4b\x99\x41\x65\xa2\xa8\x17\x81\x34\x2d\x88\xb2\x16\x70\xa7\x4e\x72\x3c\xfb\x50\xb2\xd0\x71\xfd\x89\xe6\xf1\xa7\x7e\xd6\x16\x6a\x17\xa8\x08\x4a\xc1\x5d\x00\xed\x6d\x32\x16\x54\xe0\xad\x1e\xd4\x35\x2e\x0a\xf4\x09\xe8\x1b\xba\xe2\x5e\x8b\x11\x61\x7f\x87\x53\x3b\x34\x2b\x03\x7f\xcf\x1f\x51\xfd\x5c\x79\xb2\xee\x7e\x08\xe3\xb6\x0e\x07\x5c\x04\xf4\x28\xa7\x70\x8c\xf3\x6e\xc7\xb0\xe7\xf4\x30\xa6\x1f\xcb\x39\x1c\xb9\x91\x12\x7f\xcb\x43\x6f\x91\x96\x1f\xeb\x0f\xbd\x5b\x52\x62\xef\xb2\x71\xf0\xf9\xaf\x6d\x19\xf6\xc3\xdf\x72\x0f\x0d\xeb\xec\x9e\x3d\xd4\x5e\x49\xef\x76\xf2\x21\xa2\x9b\x2c\xdb\x71\xf8\xbb\x9d\x15\x7c\x25\x4f\x77\x77\x69\x91\xd5\x0f\x7b\xe2\xe0\x8c\x7f\xcc\xed\x73\x4d\x6b\x3b\xd8\x6d\x0f\x01\x3a\xce\xc5\xc3\x90\xd4\xc7\xd8\x39\x6e\x11\x63\x4f\x9e\x81\xad\x9e\xa2\xbe\xed\xa9\xd3\xe3\x63\x7a\x84\xbd\x01\xfe\xcf\x87\xdd\x1c\x30\xe5\x1f\x75\x77\xd0\xe2\x0e\xb8\x3d\x00\xe2\x43\xef\x0f\x5a\xc6\xde\x1b\x24\x41\x7e\x9b\x1d\x12\x99\x77\x8f\x6c\x9b\xe1\x27\xf0\xcf\x11\xcf\x1f\xdb\x6e\x14\x7c\x13\xf1\x17\x4b\x2a\x4d\x05\xcd\x2c\xd4\xb2\x32\xf6\xf2\xc8\x8b\xac\x29\xd0\x45\xff\x87\xd9\x33\xc7\x63\x22\xce\xac\x33\x55\x89\x09\xfb\x5e\x68\xf3\x6a\x3e\x57\x35\xee\x9c\x37\xca\x44\x7f\x81\x6f\x76\xe4\xe8\x9d\xa8\xe5\x7c\xd5\xfa\x0d\x5c\x21\x33\x41\xbb\x57\x44\xb3\x8c\xe4\x9c\xb9\x57\x29\x48\xea\xb1\x02\x80\x4f\x02\xea\x27\x08\x35\xee\x9a\x12\x9e\x7e\x4f\x92\x55\x9e\x38\x04\x36\x09\x81\x59\x08\x59\x3f\xa2\xea\x4c\x96\x77\xa9\xe0\x4d\xb9\x54\x06\x12\xd1\x64\x26\xed\x4e\xc0\xb6\x31\x2b\xf4\x2a\xd1\x0c\xe8\x0d\x22\x95\x44\xde\x1d\x00\x3c\xc6\x69\xb6\x83\x73\xcc\x29\xd0\x2e\x37\xf2\x96\x34\xcc\x9a\xa8\x7c\xb7\x2c\xfb\xf9\x92\x6f\xb8\x27\x7b\x8f\x51\x3e\xa8\x89\xed\xaf\xbd\x47\x49\xdc\xb3\x7b\x94\x51\xb2\x71\x4d\xad\x62\xa8\xed\x15\x11\xd7\x76\xe0\x98\x1d\x8a\x67\xc8\x11\x39\x36\x82\xfe\x5d\xa6\x3d\x71\x8e\x8d\x94\xa9\x07\x52\xb7\xbe\x2b\x42\x79\xe3\xf4\x6d\xfc\xa7\xe3\x28\x5c\x13\x66\x00\xc2\xc1\x2c\xfa\x20\x1a\x37\x42\x7e\x48\xe5\x9e\xa4\x6b\xf4\xea\x96\x5a\xea\xf9\xc8\x1d\x90\x7a\xef\xab\xed\x3e\xb1\xb6\xca\x47\xd7\x02\x42\x74\xec\x87\x43\xae\xf8\x27\xac\xcb\xfd\xbb\x00\x35\xfa\x12\x79\x7b\xb9\x0e\xb7\xab\xc8\x7f\xce\xe6\xd0\xf6\x1f\x41\xff\xcb\xbf\x2e\x3b\x7f\xff\xb1\x15\x7a\x2f\x23\x37\xea\x87\x9e\x21\x7d\xc1\x03\xfb\x2a\x88\xc8\xc0\xde\xea\x9e\x39\x6a\x55\x2d\xee\x55\x5d\xee\x71\x78\x59\x7a\x29\x78\x5e\xc8\x52\x5c\x47\x1d\x29\xeb\x5e\x46\x52\x86\x69\x8b\xe9\x1d\xfe\x6e\xcf\xdb\x1e\x3a\x8c\xf0\x47\xf7\x71\xa9\x27\x8e\xa1\xef\xc4\xde\x4c\xbc\xb5\xbc\x0d\x1b\x6e\x9b\x03\x60\x33\x6f\xbd\xd4\x8e\x62\xee\x01\xd5\xff\x8b\xcb\xd7\x6c\x29\x0c\x87\x56\x7f\x3f\xbe\x7b\x77\x49\x19\x91\x9b\xd5\x3a\x76\x57\xa0\x82\x1e\xae\x85\x84\x55\x70\xef\x30\x0c\xa7\xe6\xa5\x06\x7d\x8d\xa5\x19\x42\x97\x10\x9f\x72\xf9\xd5\xd9\xd7\x58\xaf\x12\xf2\xcb\x44\x99\xb3\xfb\x85\xcc\x16\x2c\x57\x42\x63\x6b\xa5\x65\x55\x80\x08\x06\x14\xd7\x9f\x02\xaf\xb5\x6e\xac\xc8\xd3\x42\x50\x65\x53\xd2\xdd\x8b\xcb\xd7\xd3\xf4\x07\x7a\x8d\x23\x6c\xe0\x27\x1d\xb8\x01\x2d\x29\xd4\xdc\x62\xb9\x35\xcd\x21\x3c\x34\xaa\xf6\xde\xa6\x3a\x94\x14\x3f\x0d\xad\x17\x4f\xb1\x87\xc9\x29\x2f\xf3\xd3\x5a\x68\xc3\x6b\x33\xa6\x4b\x0b\xd4\x64\xb7\x3c\xe8\x86\x40\x11\x14\x9c\x09\x72\x18\x42\xb4\xa1\x60\x05\xc7\x3a\xb8\x28\xb1\x2e\x19\x9d\xaa\xa8\xfb\xf8\xe2\xaa\x16\x77\x52\x35\x9a\x6a\xaf\x6f\x93\x8f\x8b\x23\x32\x5e\xa2\xf4\xab\x4a\x94\x4e\xfa\x07\xe7\xc7\x3d\xb0\x16\x87\x89\x7b\x48\x85\x16\x20\x99\x2a\x8d\x2c\x1b\x08\xf9\x97\xd6\xa0\x28\x6f\xac\xd8\xc8\x39\xf9\xbb\x75\x2b\xf4\xaf\x52\xb2\xc4\x86\xa3\xb2\xa7\xe0\xdb\xa6\xf0\xbf\xde\x32\xf0\x1d\x46\xda\xd9\x7c\xa9\xe9\xd3\xd1\xa5\x29\xd7\x70\xb2\x87\x8f\xd4\xdd\xdc\xb7\xdd\xec\x70\x72\x67\x56\xc5\x8c\xe2\xac\xe2\xb5\x91\x59\x53\xf0\xba\x9f\x59\x14\x03\x56\x71\x32\x8c\xa0\x36\x71\xc2\x01\xb6\xe0\x55\x25\x20\x5c\x00\x93\x05\xa9\xa9\x4e\x0b\x5f\x48\xa5\x98\x0d\x14\x74\x3c\x0c\x63\xac\x9a\x3a\x75\x19\x1a\xa7\xf7\x44\xef\xed\x39\xe3\x5a\x0d\xf0\xdc\x97\x24\x9f\xc4\x8d\x06\x42\x67\x82\x94\x10\xf8\x14\xe7\xfa\xda\x8f\x67\x90\x4f\x2a\x71\x28\x63\x15\x56\xbf\xcd\x33\x21\xef\x30\x90\x3c\xc6\xc8\xbf\x0f\x11\x56\xeb\x70\xc1\x69\x28\xe8\x34\xad\x9a\x8d\x20\xa0\x28\x27\xa9\x6e\x9c\x2e\x05\x07\x85\x0b\x02\x3c\xa7\xc4\x41\x85\x93\x5d\x6a\xa7\x48\x41\x1f\x89\xcd\x30\xc9\x29\xd5\x5e\xdd\x83\xbb\xbe\x63\x97\xb7\xea\xe4\x9c\x51\xcb\x5c\x6d\x54\xa5\xd9\x52\x84\x10\xfb\x38\x6c\xc4\xb9\x63\x3d\x0d\xb7\xde\x8c\xa1\xb0\xdd\xe6\x99\x68\xc8\x09\xea\x3a\x37\xe7\x24\x34\xc9\x40\x55\xe9\xd7\x45\x02\x31\xa1\x7a\x5b\x05\xf6\x97\x73\x3f\xf7\x68\x4f\x45\x7b\x96\x30\xc2\x0a\xd2\xd2\x00\x52\x3a\x59\x28\x44\xe6\x44\xd8\x81\xe7\xf8\xc0\x6c\xd6\x52\x1b\xca\xd5\xdc\x92\xb3\x4e\x74\xb1\x11\x08\x6d\x01\xd7\x38\x0a\xc9\xee\xcb\x3a\x41\xc5\x10\x68\xfd\xbc\x05\xf3\xba\xe0\x30\xab\xc3\x21\x6d\xa2\xde\xf2\x18\x6e\x35\x5b\x31\x28\xee\x11\xee\xba\xbc\xb4\xbb\x98\x1a\xa8\x11\xff\xa0\x38\x06\x22\x4d\x6b\x88\x0e\x52\xea\x99\x8c\x67\x23\x01\xc3\xf6\x46\xee\x45\xaa\x7b\xca\xa3\x78\x02\x48\x14\x83\x6c\x21\xb2\x5b\x14\x30\x8a\xe4\x6f\x0f\x42\x51\x2b\xa8\x94\x14\x22\x03\x3b\x7b\xca\x5e\xe1\xbf\xec\x52\xab\x5a\xe5\x4d\xe6\xd0\xbb\xaf\xa5\xc1\x0e\xb4\x3c\xaa\x1f\xc0\x6e\x54\xad\x1a\x23\xcb\xee\x01\xfc\xa7\x5d\x24\xe3\x82\xca\x96\xe0\x43\x94\xa8\xc7\x57\x83\x4e\xbf\x77\x62\x32\x97\x74\xc1\x6f\xfd\xbc\xc5\x26\x2e\xc1\xa8\x6e\x8d\xf7\xa6\x90\xaf\x4b\xf2\xbd\x32\xd8\xca\x76\xc9\xff\x49\xf7\x2b\xcb\x8c\xa5\x2c\x55\x1d\xe8\x8e\xed\x6d\xec\xb9\x3a\x03\xad\x24\x4b\x23\x6e\x7a\x9a\x9a\x6d\x4a\xc4\x41\x74\xde\x0f\xd8\xa3\x17\xb5\x2a\xff\x53\xcd\xd8\x75\xa3\x2b\x31\x50\xe4\xa1\xd2\xbf\xfb\xef\xa2\x34\x5b\x6d\xf5\x55\x53\x08\xf6\x4f\x35\xd3\x98\xe9\xa1\x11\x8a\xc8\xd9\x6f\xd7\x85\xba\xff\x7d\xa3\xeb\x06\x81\xd2\xb5\x0a\x2f\x12\x08\x43\x63\xdf\x23\x38\x50\xec\x2f\xb5\xd0\x5a\x44\x2f\x71\x6a\x0e\x09\x0a\x76\xea\x36\x45\xfa\xfb\xbb\x55\xfa\x59\x56\xab\xf2\x9f\x6a\x36\x44\x82\x1f\x6a\x35\x93\xf9\x85\xdf\xcc\x3b\xd1\xc2\x21\x85\xf4\xf8\x41\xd5\x6d\x90\x6c\x0f\xd2\xb4\xc1\x51\x72\xdd\x04\x5d\x3c\x12\xcb\x8c\xd4\x4d\xc9\xb4\x2c\x6f\x0a\xb2\x05\xbc\x1d\xfd\x4f\x35\x73\xc5\x7c\xfb\xcc\xe0\x5d\xc9\x76\x25\xaa\x82\x43\x63\xb0\x2d\xe9\x56\xe3\xc0\x88\x5c\x1d\x50\xbb\x10\xa9\x0b\x64\x0c\x95\x4a\x71\x2f\xea\x63\x91\xe8\x85\x9d\x78\x7b\x02\x79\xa1\xf2\x96\x20\x90\x2a\x1c\x37\xc5\x6a\x17\x02\xb5\xb0\x19\x24\x8f\x9b\x15\xe8\x03\x33\x87\x1e\x8e\x07\xa6\xcf\xe5\x6b\xf6\x36\xee\xb1\x3a\x8e\x3c\xb4\x9e\x18\x4a\x54\x6e\x74\x3d\x65\x4e\xfa\x69\xe3\xda\x88\xdd\x08\x83\x5d\x78\x26\xee\x88\x75\x06\x7f\x85\xff\x24\x63\xaa\x65\x6d\x47\x55\x13\x1c\xfc\x67\xf4\x10\x9c\x4c\x03\xe0\xdb\x5d\x8d\xa6\x27\x7b\x92\xf3\x25\x17\x4b\x55\x5e\x0b\x73\xfa\x03\x97\x85\xc8\x2f\x55\xee\xfc\xcb\x83\x34\xc5\x31\xe0\xa2\x6e\x67\xa3\xd9\x13\x6b\xe5\x3b\x89\x41\x68\xb5\xc8\x59\x8e\x03\x2a\x97\xfb\xbf\x29\x43\x2d\x73\x3f\x1b\xf6\x5f\xcd\x4c\xd4\xa5\xb0\xb6\x41\x2e\xb5\xa9\xe5\xac\x09\x6e\x42\x7a\x59\xb7\xfa\xd3\xaf\x23\x54\x18\x00\xf5\x00\x1d\x2d\x2c\x1a\x9d\x33\xf0\x6c\x80\x50\x88\xec\x7b\x2d\xcc\x30\xad\xae\x54\x51\x58\x2b\x65\x27\x12\xd1\x58\x5f\x92\xb4\x29\x4b\x91\x09\xad\x39\x3e\x04\xd8\x0b\xfc\x61\xc9\xe4\x24\x88\x37\x46\x2d\x31\x69\x78\x29\x4b\xb9\xe4\x45\x81\x65\x4c\x72\xa9\xeb\xa6\xc2\xf4\x01\x87\x9d\x9a\x87\x66\x02\x8a\xf1\xb0\xf8\x83\x12\xf2\x8d\xca\xc5\xb5\x20\xf9\xdf\x89\x9a\x0d\x76\x70\x83\x1e\x1f\x99\x5a\x56\x85\xf8\xe0\xe4\xed\xd0\xf4\x4b\x64\x8c\x95\x2a\x17\xd1\x35\xca\x35\x17\x48\xef\xad\xdd\x3a\x7c\xfb\x50\x6b\xaf\x9d\x19\x13\x4a\x63\x13\xaf\x23\xd1\xc9\xc4\xed\xf5\xd4\x3c\x2c\x80\x1e\xe7\x7f\xc5\x04\xdf\x94\x9c\x71\x1a\xa1\x05\x10\x7e\xcd\xda\x85\x88\xe2\x04\x7c\x9e\x09\x5f\x42\xe2\x52\x75\xdd\x41\xfb\xee\x72\x59\xde\xfc\xe2\xb2\x3f\xb6\xa6\x39\x69\x6b\x78\x52\x01\x53\x17\xfa\x70\x70\x9f\xc0\xe9\x4f\x02\xfa\x50\x9b\x9a\x1b\x71\x03\x75\x2e\x92\xc9\x8f\x28\xca\xc9\x3c\x07\x11\xd7\xa8\x98\x08\x6e\x48\xd7\x90\x44\x67\xdc\x4e\x85\x8e\x88\xf0\x19\xd3\xcd\x6c\x6d\x83\x43\xa0\x72\xf8\x3c\x1e\x89\x74\xa6\xc2\x2d\xf7\xaa\xbe\xc5\x97\x66\x5e\x88\x16\xd4\xd1\x6d\xbb\x5e\x76\x2a\x86\xa0\xc9\x87\xaf\x3b\xef\xf0\x99\x27\xb4\x02\x14\x35\xbe\x91\xf9\x6a\x41\x12\xca\x88\xd4\x0d\x14\x69\xc5\x01\x2f\x5b\x95\x3e\x6e\x84\x71\x85\x65\xe5\x7c\xe5\x49\x93\xa0\x8c\x4f\x42\xb8\x5f\xfa\x60\x44\x86\xc0\x3a\x30\xbd\x08\xa0\x89\x8f\x2e\xbc\x30\x9e\xf7\x8c\x1e\x6b\x5c\x84\xda\x22\xc3\xd2\xc0\xae\xc4\x9a\x56\xa7\x2d\x1e\xbb\x6f\xbb\xbc\x76\x25\x3b\x8a\x9c\x6a\x24\x94\x79\x68\xa1\x0a\x36\x39\x53\xa5\xd8\x64\xca\xed\xa6\xd4\x5a\xb2\x41\x4f\xbd\xa4\x8f\xdc\xe6\xed\x6c\xa1\xe7\x7b\x11\x6d\x9c\x0e\x1a\x18\xb0\x91\x7c\x5e\x03\x45\xa6\xd4\xc3\x92\x2f\x51\x73\x47\xa2\xa1\xb8\x93\x5a\xaa\xf2\x47\xa9\x8d\xaa\x57\x3f\xc9\xa5\x1c\xbe\x4f\x45\xe3\xf2\x75\xd4\x8b\x12\xcb\x0e\x47\xad\xac\x10\xbc\x64\x4d\x15\x61\x71\xa2\xa3\x1c\x27\x2a\xef\xc5\x43\xaf\x8d\xf4\xcb\xff\x99\xda\x23\x66\x5a\xf7\x2c\xf8\x7f\x0e\x4b\xd3\xcb\x5a\x59\xbe\xa2\xeb\xf1\x1a\x15\xfb\x6e\x34\x75\x12\x52\xc5\x10\xb5\x87\x78\x78\x33\x38\xc2\x26\x9e\x93\xc2\x87\x60\xde\x09\x93\x53\x31\x4d\x7e\x2e\x56\xa4\x1f\xf9\x20\x73\x5c\xe5\x92\x97\x69\x65\x2b\xa9\x71\x64\xd7\x38\xd9\x5b\x33\xa8\xbb\x81\x54\xb1\xd1\x54\xaf\x09\xca\x31\xa9\xec\xe6\xc0\x9b\x2f\x50\x16\xfc\x06\x8c\xd7\x33\x69\x6a\x7b\xef\x29\x9b\xe5\x4c\xd4\xd6\x32\xc0\xc7\x18\xb8\x74\xe4\x42\x43\x5f\x0f\x7b\x1b\x16\x2c\x6f\xe0\xc9\xb6\x46\x85\x11\xe7\xe4\x46\xd5\x26\x61\xaa\xc6\xb0\xb9\x2c\xa5\x5e\xf4\xd8\x33\xfb\x90\xbc\x6d\xcf\x14\x72\x2e\xb0\x28\x62\xcb\xa2\x19\xc3\x92\xc8\x2c\x5f\x0b\x6b\x03\x63\x7e\x6d\x8b\x5c\x5c\x38\xca\xe5\x10\x27\x05\x3f\xa2\x77\xa1\x9c\xe8\xee\xe2\x49\x42\x15\xaa\xd7\xed\x91\x74\x97\x6e\x4d\xe4\x6b\xc4\x00\x1a\xce\xbe\x73\x8f\x09\x79\xf2\x6d\x0c\x8f\x06\xcc\x05\x3d\x53\x7b\x7f\x86\x7b\xb8\x0a\xd3\x50\x1c\x0f\x3d\xa6\xa5\x40\x7a\xb1\xcc\xe3\x6a\x56\x01\x4e\xc7\x96\x19\xb4\x6c\x07\x25\xe1\xe4\x52\xe5\x2f\xe9\xaa\xac\xca\xef\x9b\xfc\x46\x98\xef\xb0\x98\x78\xf4\x78\x1a\xfc\x39\x27\xc3\x72\xe0\xa1\x44\x59\x76\x3f\x51\xe7\xe4\x9e\x59\xf0\xd5\xd4\x3d\xa9\x94\xa1\x1a\x10\x49\x51\x1b\x07\x1e\x61\x61\x19\xdb\x0b\x72\xbd\x60\xf5\x0c\xc1\xf0\x9f\x46\x1b\xbf\xc9\x5b\xf3\xc6\x93\x86\xa6\x3a\xa3\x8d\x48\x3f\xdd\x38\xc2\x3b\xbf\x5b\xcb\xcb\x16\x91\x01\x5f\x21\xb7\x64\x43\x3b\x6b\xa3\x8f\x10\x07\x20\xdd\x46\xec\x71\x53\x1e\x9f\x8c\xb4\xc1\xc8\xd9\xb3\x1b\xb1\xdc\x8b\x70\xdf\xca\xa3\x20\x29\x57\x6b\x68\x3d\xf9\x02\x84\xce\xd5\xbf\x09\x55\x1f\x2e\x5f\x7e\xef\xf2\x65\x40\xad\x2d\xd4\x3d\x5b\xf2\x72\xc5\xc2\xfa\x43\x34\x2d\x85\xb3\x1e\x8d\x86\x6d\xb7\x2c\x61\xb6\x1b\x31\x11\x18\xf6\xd5\xef\xa3\x28\x45\x15\xc0\xd2\x0f\x20\x88\x1d\xdc\x23\x7f\x78\xa7\x75\xff\xf6\x37\xc3\x41\x4a\xfe\xa7\x9a\xe9\x49\x5c\xa2\x71\xc2\x6a\x71\xca\x73\x2c\xc6\x38\x48\xb9\xc8\x99\x0f\xdf\xe2\xcb\x32\xb8\x15\x00\x94\x0b\x4c\xc5\xaa\x19\xa5\x2a\x4f\x97\xa1\xcc\x1a\xc3\x3b\xe3\x48\x57\x40\xc5\x6b\x5e\x14\xa2\x60\xff\x54\x33\xbc\x48\x07\x33\x05\xea\x30\x62\x4b\xae\x7f\x35\x1c\x9b\x72\x53\x5f\xa7\xb9\x1f\x28\xf5\x12\x6f\xf0\x54\xb4\x94\xbb\x24\x09\xac\xda\x65\x91\x96\xa6\x53\xac\x19\xa7\xf2\xcf\x0c\x8e\x28\xd8\x8b\xc9\x95\xc4\x64\x58\x50\xe7\x67\x2c\xff\xe5\x3b\xbc\xc3\xd3\x7b\xd4\x54\xf7\x3f\xd5\xec\x44\x53\x55\xfb\x16\xd4\x50\x56\xa4\xcf\x6f\xd6\x1b\xb3\x58\xe9\x67\x3d\x4f\x08\xc8\x48\x0c\x12\x26\x46\xde\xd4\x3c\x13\xf3\xa6\x08\xe1\xf9\xe3\x38\xea\x8f\xaf\x7f\xaa\xd9\x58\x2e\x01\x73\xfc\x93\xba\x88\x11\xf1\x9d\x5b\x81\x21\xa2\xb0\x0c\xe9\x94\x22\x6b\x07\x3f\xd9\x1f\x01\xa6\xa7\x55\x54\x26\x38\x2e\xec\x32\x2e\x24\x61\x1d\xcd\xc8\x9c\x84\x98\x36\x8c\x77\xe3\xfa\x16\x5e\x2b\x30\x2b\x70\x23\xbd\xc0\xa9\x0b\xc4\x32\x2a\x86\x86\xe6\x1a\xd7\xb7\x9a\x69\xb5\x14\x50\xc4\x18\xe0\xfa\xc5\x5a\xad\x58\x28\x2c\x6f\xe3\x63\x48\x37\xc5\x2d\x84\xd4\x9e\x50\xac\x16\x67\x31\x0a\xcb\xe8\xa8\x32\x13\x14\x59\x62\x29\xc4\x5e\xc0\xb2\x68\x02\x7b\xb1\xf2\x41\xa5\x9e\xba\xe2\x83\xc8\x1a\x6c\xb4\x1b\x56\xb0\x8f\x3c\x86\x1b\xd9\x24\x69\xd0\x40\x8f\xbc\x14\x84\x8d\x96\xeb\x20\x91\xa3\xba\x22\x34\x2e\x0c\x83\xb9\x46\x6b\x91\x08\xd2\xe7\x57\xd7\x5f\x6c\xe3\x55\x24\x62\x71\xd3\xe7\x55\xbc\xba\x26\xe3\x17\x6e\xa5\x46\x41\x36\x8b\xb3\xe0\xfb\x1d\x83\xa1\xd8\x4b\x0c\x60\x26\x9c\x1d\x9f\x8e\xe2\xc6\x1d\x66\x68\x5e\x6f\x71\x7e\x12\x1a\x7d\xee\xe1\x98\x3b\x6b\xdc\xc3\x11\xd5\xc6\xb8\x87\x5b\xec\xa2\xea\xc9\x47\x70\x0f\x1f\x9b\x9b\x5b\xf8\x86\xed\x38\xf4\xa1\x5d\xef\xe0\x13\x76\x83\xda\x7e\x60\xca\xee\xdb\xdd\x17\xbc\x99\xf7\x0c\x98\xdf\x3a\xbd\xbd\x33\x37\x3a\xba\xd3\x5f\xc7\x30\xbf\xdf\x32\x00\xd8\xd6\x9c\x74\x8f\x52\xd1\x3c\x14\x7c\xeb\xda\xc4\xa7\x63\x36\x39\x45\xda\x3d\x60\xb0\xb4\x6c\xbc\x4e\x92\x12\xa8\x92\xdf\x8a\x96\xbd\x97\x74\x9f\x73\x51\xaf\x91\xfc\x38\xee\x08\x09\xb1\x7f\xc1\x00\xb0\x33\x42\x7f\x01\x3c\x28\xcb\x10\x12\x23\x23\xaf\x2a\x07\x47\x2e\x40\xfb\xd5\xdd\xdc\x9d\x7d\x50\xc6\xf6\x01\x98\x31\xd8\x92\x85\x42\xe8\xaf\xae\x5d\xcf\x49\x68\xaf\x4f\x74\x69\xe1\x79\x75\x7d\xa2\x5b\xcb\x99\xb8\xd1\x7d\xe6\x45\xfc\xc8\x45\x7f\xa2\x18\xd4\x76\xa3\x8a\xb6\xde\xff\x72\x4f\x29\xb3\x27\xe4\x8c\x6b\x99\x31\xb9\xc4\x0c\xa2\xb1\x32\xe4\x42\x60\xa3\xd1\x96\x78\x10\x91\xe9\x9c\xbf\x11\xc1\xa1\x77\x9a\xfb\x6e\x07\x6d\x42\x8a\xc4\x11\xcb\xab\x94\x0b\xec\xb8\x29\xea\x29\xfb\x99\xdf\xda\x2d\x49\xa1\x83\xfe\x24\x25\x21\xf4\xea\xc4\xfe\xfb\xfa\xc7\xb7\xbf\xfc\xf4\x92\x69\x01\xa0\xb0\x6f\x45\x2d\x74\xa5\x4a\x2d\xd0\x3a\xf8\x57\x23\x6a\x39\xb2\x44\xf7\x28\x7a\x9b\xb4\x62\x78\xef\x06\xdf\x44\xfe\xfe\x0b\xd1\x86\xdd\x3c\xc6\x49\x5c\xa2\xa0\x41\x77\xb6\xf5\x9b\xb6\xb5\x0c\xf6\xf9\xd5\xc5\x17\x4c\xea\x90\x9f\x0c\x7e\xa6\x81\xed\xdc\xbb\x95\x2f\xfa\xb7\xb2\xcf\x53\x5f\xbb\x9d\xc3\x56\x1e\xbd\x33\xb2\xb1\x0c\x72\x9b\x74\x77\xce\x04\x5d\xdd\xab\x3f\x47\xb9\xef\xd7\xd3\x3d\xb0\xc9\xd5\xaa\x68\x57\xc0\x8f\x62\x0a\xd6\xab\xb9\x1e\xb5\x16\xab\xb4\x8b\xae\x4a\x0b\x65\x48\x2e\xc6\xab\xb5\x8e\x4a\xeb\xd8\xb2\x07\xe0\xdc\x76\x5a\xad\x9f\x79\x23\x14\x5c\xa8\x2b\xb1\x9d\x82\x5b\xdb\xb8\xac\x93\x27\xfc\x3d\x20\xf0\x7a\x49\xb5\x50\xa3\x76\x8b\xe4\x1c\xa7\xaa\x41\xc1\x7f\x5d\xd5\xea\x4e\xe6\x22\x47\x6c\xa6\x34\xd6\x19\x5c\x06\x1b\x63\xcf\x56\x2c\x97\x68\x52\xca\x92\x5a\xad\xc5\xd0\x0a\x08\xb4\x47\x4f\x71\xad\x9a\x9b\x05\x7b\x77\x71\x39\x61\xbf\xbc\xbc\x04\x2c\x7e\x7c\xf7\xee\x72\xb4\x76\x1c\xcd\x39\x88\x9e\x07\x6f\xae\xd4\xba\x11\x9a\x15\xf2\x56\x44\x05\x53\x43\x89\x4f\x97\x03\xbd\x0b\x67\x9b\x7a\x0e\x37\x16\x77\x97\x64\x99\x2a\x31\x51\xc0\xb9\x74\xb8\x35\xbe\x97\xaa\x44\x34\x62\x2c\xdc\xd4\x9b\x36\x6e\xb7\x6d\xf5\x10\xdb\x81\x6d\xa0\xb5\xc3\x3a\x9d\x02\x0c\x15\xfa\xa9\x40\xec\xbb\x38\x78\xc8\xd7\x67\x1d\x7b\xd5\x1e\xcf\x08\xff\xe0\xb2\x1b\x89\x8d\xa0\x2a\x47\xad\x87\x9b\xde\x41\x07\xd5\x83\xb5\xe0\xf9\xc4\xdd\xd8\x62\x87\x71\x1e\x76\x2b\x5e\x39\x10\xd8\xe8\x87\x8f\x2e\xed\xae\x0d\x37\x62\xde\x14\x60\x49\x7d\xdf\xd4\xda\x6c\x7c\xea\x8d\x86\xd0\xbe\x8e\xff\x32\x6f\xca\x0c\x9f\x53\xa5\x59\xb1\xdf\xa2\x9f\xe0\x5b\x6c\xce\x8b\x13\xb9\xdb\x60\xfc\x4e\x96\xf8\x38\xc4\x9d\xa0\x3e\xba\x4d\xb9\x10\xbc\x30\x8b\x15\x19\xed\x63\x62\xe5\x63\xac\x3a\x81\x0a\x97\xce\xf1\x77\xa9\xf2\x9f\x79\xc9\x6f\x20\xc6\x8c\x9a\xa7\xd8\xbd\x3b\xb3\x28\xc6\x0f\xc6\x56\x6e\xa5\x46\xa9\xf0\x09\xc9\xd8\x04\x0c\x73\x5a\xaa\x5a\x88\x0f\xf4\xc0\x93\x8b\x39\x6f\x0a\xc3\xa8\xfe\xf3\x45\xc1\xb5\xb6\x56\x00\xaa\x5b\x2a\x3c\x8c\x3a\x4e\x4b\x55\x76\xf3\x37\x86\xd4\x90\xa6\x45\xf5\x18\x69\x09\x2b\x1f\x80\x89\xd7\x29\xfb\x30\xb1\x93\xc9\xd2\x12\x22\x97\x19\x76\xc4\xc1\xa4\x29\x2b\xc1\x0b\x5e\x60\xcb\x8e\x72\xc5\xdc\x2a\x20\x6e\x4e\xea\xc0\xde\xf1\x99\x10\x1d\xee\x92\x8a\x02\x3b\x40\x96\x8c\xeb\x4c\x94\x39\x3a\x8d\x73\xcc\xad\x52\x75\x2e\x4b\x5e\x30\x59\xe6\xe2\x03\x98\xc8\x31\x7f\x59\x53\x25\x2f\x4b\x0e\x90\x9d\x35\x81\x74\x1f\x3f\x84\xe6\xea\xbe\x9c\x7a\x52\x40\x1b\x64\x06\xe6\x9e\xba\x2f\xdd\xed\xbb\xd1\xc2\x2d\x9c\x1a\x04\x59\xd3\x44\x86\xf6\xaf\xf1\x5a\xac\xd9\xe3\xc9\x81\x32\x87\xc7\xda\x7e\x72\xf7\x10\x32\xe7\xe3\xa4\x30\xce\x9c\x2c\xda\xe3\xc9\x9f\xcf\xe3\xc3\x59\xc5\x9d\x84\x3a\x27\x11\xba\xdb\xca\x50\x62\xa4\x27\x02\x65\xac\xcd\x47\xa9\xb1\x37\x0a\xac\x0d\xc6\x69\xa1\xfe\x01\x45\x4c\xb0\xab\x23\xd7\x51\x64\x3a\x76\x9e\xf9\x27\xd6\x60\x81\xd4\x3d\x44\x73\xb6\x62\x9c\xbd\x51\xb9\xe8\x53\x2c\xee\x71\xfd\xa9\x31\x39\x24\x02\xba\x2b\xb8\x3e\xbe\xa2\x19\xe9\xe3\x1b\x7b\x23\xef\x5b\xce\x94\xbd\x11\xf7\x51\x21\xf7\xde\x25\x7b\xa3\x95\x30\x41\x0c\xf0\x35\x66\xca\xbe\xaf\x5d\x44\x82\xff\x7b\x7b\x6f\x87\x92\x20\x15\x79\x73\xa7\xf1\xef\x5e\x1b\x05\x3b\x97\x9b\xc4\xe7\xdb\xf5\x99\x4f\xd6\x3a\xea\x46\xef\x5c\x8a\xb8\xa1\x18\x3d\x38\x72\x2f\x79\x6d\xe4\xda\x57\x9d\xc3\xb1\xb6\x12\xb5\x65\x1c\xcb\x78\xc9\xeb\x95\xcf\x4a\x80\x07\xcb\x05\x84\xc2\xa5\x31\x41\x98\x53\x2d\x96\x55\x61\xd1\x85\xa7\xb6\x24\x49\x79\xf4\xb6\x3f\x69\x47\x61\xfb\xf8\xec\x3e\x8b\x01\xe9\x01\x4f\x4d\x4b\x61\xc8\xe8\x83\x64\x77\x8b\xb7\xec\x62\xac\x1a\xa3\xa7\xec\xf5\x9c\xae\x42\x51\x87\xaa\xfb\x85\x84\x40\xb3\x74\x5d\xce\x0b\x01\x87\xa8\xba\xa9\x85\xd6\x93\xae\x96\xaa\x85\x36\x2e\x1a\xca\xdd\xb0\x54\x63\xd8\x9d\x54\x05\xf7\x71\x31\x1e\x5f\x17\x61\xbc\xbf\xf1\xf2\x20\x87\x48\x22\x8a\x0f\x28\x7b\x6d\x09\x83\x43\x40\x15\x05\xe4\x2a\xaf\x11\xb8\x7d\xac\xd0\x01\xd9\xb3\x67\x0b\x26\xf2\x60\x77\x0a\xca\xdb\x46\xaf\x11\xfa\x73\x4b\xd0\x0d\x1c\xf2\xed\x42\xe8\x96\x95\x06\x8f\x25\x85\xd9\xe1\x7d\x2b\x95\x79\xdd\x2a\x16\x26\xcb\xdc\x2e\x87\x1a\xe8\x60\x02\xa0\x0b\xa9\x05\x42\x20\x86\xee\x4f\x20\xd2\xf0\x32\xe8\xe6\x92\xce\xf7\x42\x4f\x20\xca\xd7\x8f\xa8\x6a\xa9\x6a\xe6\xc2\x55\x7b\xa4\x39\x17\x46\x64\x96\x1c\x52\x63\x8b\x0e\x9f\x9f\x24\x4b\x6d\x04\xcf\x5d\xe8\x9a\x4f\x39\x43\x7f\x59\xed\x91\xd9\x5e\xb4\xd1\x7e\x78\x20\xf1\xbe\x10\x35\x15\x51\x10\xd7\xf2\xa6\x94\xe5\x8d\xab\x1d\xf7\xe2\xf2\x75\x9f\x80\x37\x66\xf1\x7b\x3c\x4a\x43\x44\xc7\x6f\x97\xb5\xbc\x93\x85\xb8\x11\xf9\x77\x17\x45\xa3\x8d\xa8\x5f\xe4\x4b\x59\xfe\xde\x8a\xf7\xc4\xc2\x5c\xd7\x57\xdb\x26\x3e\xc2\xad\x3c\x9a\x74\x7a\xfb\xad\x9e\x4a\x05\x60\x6e\x6a\xd5\x54\xee\x2d\x57\x6a\xa3\xdd\x13\xfb\x33\x5e\x49\x08\x11\xcd\xd4\x9d\xa8\x29\xd5\x4c\x65\x0d\xc4\xd6\x0d\x81\x7c\x76\x77\x1e\xa0\x3e\x73\x09\xf1\x01\x7a\x02\xfc\x59\x0f\x00\x97\xd1\x86\x93\xae\x99\x10\xc9\xed\xaa\x50\x4e\xd6\xfc\x66\xb9\x58\xab\x3b\x5e\x84\xdc\xcd\x35\x1f\x53\xb4\x8c\xaf\xe9\xb7\x0d\xf2\xcf\xee\xce\x77\xc4\x3f\xd8\x0f\x7d\x61\x66\x00\x74\x6c\x82\xea\x40\x72\xea\xfa\xf9\x3d\x8d\xd2\x3a\x12\x09\x32\x51\x0a\x2b\xcd\xb9\x11\x6a\xa4\x8c\x46\xc3\x6c\xe7\xc4\xf6\x96\x3b\x68\xcc\x22\x65\x40\x6b\x63\xbe\x7d\xfd\xf2\x82\xbd\xf4\x6c\xf8\x9c\xaa\x59\xbf\xc8\xe0\xf1\x15\x4a\x87\xd5\xfe\xe7\x2f\x06\x77\x6a\x3a\x4c\xb3\xb5\x60\xfa\x36\x2b\xe0\x11\xc4\x41\xcd\xbd\xff\x92\x23\x0c\xf4\xe0\x8d\xac\x3d\x72\xdb\xcc\xc4\xa9\x15\x3e\xac\x37\x01\xff\xa3\x59\xa6\xea\xda\xaa\xd9\xd6\x5c\xa2\xcc\xa1\x08\x96\x0e\xed\x9a\x7d\xe9\x11\x3c\x4d\xec\x85\x87\x9e\xb7\xb5\x0b\x65\x62\x46\xdd\x8a\x32\xae\x04\xae\x45\x00\x35\xea\x19\xd9\xf2\x86\x56\xf9\x9e\x56\xd9\xe1\xcf\x75\x8b\x0a\x30\xab\x86\xa3\x91\x2d\xe1\x2f\x18\x48\x46\x47\xe4\x38\xee\xb8\x07\x27\x88\x4e\xb7\xe3\xed\xbd\xbe\x31\x96\xea\x56\x27\xd1\xca\xec\xe9\x0b\x33\x6c\x51\xe7\xc3\xa1\x4b\x53\xb1\x5b\xb1\xc2\x57\x0c\x80\x04\xf5\x0b\x8d\x0a\x2f\xbc\x65\xb1\x0a\x3e\x88\x17\x8d\x51\x3f\xdb\xcf\x08\xc8\x3b\x40\x43\xe2\x61\x46\xbd\x7c\xe7\xbc\xd0\x62\xca\x7e\x15\xc1\x33\x39\x57\x2e\x39\x5f\x67\xc2\x9a\xa0\x4a\xb3\x85\xa8\xa9\x5c\xe7\xb9\xef\x04\x7f\xa9\xf2\x09\x3e\x1a\x56\x22\x83\x6e\xe9\x2f\xdc\x0a\x53\xfa\xe0\xbc\x34\x61\x29\x0b\xc6\xbf\x70\xeb\x42\x3c\xb3\x50\x1f\xd4\xdb\x89\xd0\x57\x72\xc2\x66\x5f\x74\x48\x60\x8f\x74\x57\x5a\x0a\x4a\x38\xae\x9b\x96\x32\x6d\xb1\x3e\x5f\x6d\x21\x66\x07\x84\x08\xd4\x63\xcf\xf7\x24\x89\xc5\x0b\x77\x47\x17\xb5\xf1\x34\x89\xd0\x87\x41\x87\xa0\xca\xae\x30\x91\x2e\x5f\xee\x49\x17\x80\xf2\x47\x24\xcc\xbb\x45\xf4\x3e\xef\x5f\xe0\xe9\x90\x77\x5d\xb2\xe1\xf4\x8f\x83\xaa\xa2\xde\x08\x00\xf7\x1f\xaa\x68\x96\xc2\x25\x65\x2e\x40\x8a\xbd\x16\x13\x91\x32\xd8\x82\xf2\xa4\x19\x9c\xbd\x8d\xe8\xda\x63\x3d\xfd\xd8\xd5\xe9\x1a\x0b\x8f\xd1\x33\x1a\xc0\x9b\xa0\x59\xee\xfb\xff\x42\xcb\x43\xae\x85\x66\xe7\x7c\x72\x3e\x9b\x3c\xe7\x93\xe7\x33\x98\xf4\x79\x36\x65\xaf\x4b\xba\x14\x84\xaf\xb2\xc9\x97\x7c\xf2\xe5\xcc\xdb\x54\x5f\x66\x03\xb4\x41\x1a\xba\xa6\xb2\x11\x6d\xc6\x18\xe0\x63\x0e\x93\x2b\xa5\xcc\xc5\x8b\xa8\xa7\xa7\xc1\x3a\xfe\x5b\x9d\x1a\x37\x0d\xaf\x79\x69\x04\x9d\xb2\xb5\x52\xe6\x34\xe3\xd3\xac\x36\xde\xf8\xa3\xa5\xae\xa2\x67\xaf\x51\x47\x88\x80\xf3\x38\x0c\x42\x78\x51\x03\x56\x70\x34\xd8\x19\x59\xc6\xc1\x9c\x9a\x06\x05\x4f\x69\xe6\xf1\x9d\xd1\xaa\x3a\xe7\x90\xcd\x43\x23\xfc\xdc\x6e\xf5\x2b\x91\xa9\x32\x03\x1f\xad\x9c\xd3\x6d\x56\xb4\xa3\x0f\xf6\x3e\xb6\x9d\x00\xbe\xc3\x63\xfb\x67\x6b\xd2\xf9\x73\x6e\x5b\xca\xe3\x69\x4c\xa5\xb4\xf0\x90\x86\xe3\x14\xf6\xdf\x51\x0e\xe9\x28\x2a\xc7\x17\xaf\xc7\x3f\x69\x66\x16\xb5\x10\xee\x9f\x56\x2f\xc0\x8b\x3a\x84\x87\xd4\x82\xe7\x9d\x59\x00\xe1\x09\x72\xef\xe2\x05\x19\xdf\xe1\x26\x1a\xb8\x1e\xba\x7c\x16\xab\x50\xd4\xcd\xe9\x4e\xbb\x76\xdc\xac\x40\x43\xd0\x25\x53\xf6\xa2\x28\x48\x19\x01\x5a\xb8\x7b\x65\x91\xde\x4a\x5c\x99\xf2\x36\x66\x4b\x0f\x28\xf8\x1c\x63\xcd\x84\xc4\xc0\x3b\xa5\x27\xc8\x81\xb6\x24\x2c\x85\xee\xc2\x97\xb5\xfa\x27\xe5\x15\xa5\x1c\xb7\x97\x71\x72\x9e\xdf\xa1\xa6\xc0\x10\x01\x20\x43\xa3\x9d\xb5\x1a\xc3\x82\xca\xbe\xbb\x09\x58\x98\xac\x6d\x82\x1b\x7f\x3e\x8c\x17\xb6\x0d\xd0\xec\x31\x30\xa0\xe5\x7a\x5f\x70\xb7\xd8\x7c\x8e\xbd\xe1\xe9\x7a\x17\x75\x87\xc1\x19\x18\x38\xd1\xf3\x10\x9e\x8e\x1a\x1d\x62\xab\x3b\x43\x7d\x88\xad\xb1\xda\x0b\xdb\xcb\x07\x71\xcc\x73\x91\x33\x0e\x48\xdd\xfb\x32\xb3\x58\x0a\x11\x2a\x0f\x4e\x31\x64\xdb\xf9\x3d\x5b\xa0\xe3\x9a\xce\xd2\x9c\x68\xf0\x1d\x55\xb5\xaa\x44\x6d\x56\x53\x97\x91\xe7\x23\x47\xda\x94\x88\x87\xfb\xc3\xad\x0f\x7b\x80\xed\x82\xac\xb1\xd3\x3a\x5a\xe1\x9d\x8f\x8b\x22\x4e\x37\x70\xd1\x30\x58\x68\x90\x07\x07\x71\xb4\xc0\xb1\x97\xdd\x4d\xc2\xf1\x5f\xcd\x4c\x64\xa6\x98\xb0\x1b\xbb\x4d\x66\x4a\xdd\x32\x5e\xf9\x90\x84\x1e\xe9\xc8\x0a\xf9\xbb\x1b\xc5\xb2\x42\x8a\xd2\xb0\xbf\xf5\x8d\x6d\xa7\xd4\x51\x15\x1a\xba\x48\xba\x27\x9b\x78\xc0\xb8\xd7\x9a\xfe\xc9\x5c\x79\x4d\x54\xc6\xdc\xde\x44\xcb\x85\xd2\x76\xc3\xc9\x25\xb7\x97\x6c\xb8\xfb\xa2\x4b\xe4\xb9\xff\xd5\xbd\xa2\x4c\xac\x66\x2d\x0d\x04\x4e\x06\xa8\xd1\x5f\xfd\x6e\xb5\x5f\xa4\xa0\xc9\x42\xec\xfe\x1e\x8a\x05\x50\x6b\xad\x5f\x34\x55\x67\x4e\x60\x4e\x82\x14\x81\x24\x40\x51\x4c\xb2\x19\x98\x28\x4d\xbd\x0a\x27\x50\x2f\x97\xa8\xf8\x21\x0c\x0e\xcf\x00\xad\x91\x54\x3e\x1d\xe1\x12\x82\xf0\xf1\x94\xbd\x88\x40\xcd\xed\x1d\x18\x84\xcf\x72\xc8\xee\x31\xdf\x2c\xc2\x9d\x17\x50\x63\xdd\x22\x69\x44\xda\xcc\x38\x34\xfe\x87\xaa\xc3\x7c\x8c\xa1\x76\x8b\x92\xe4\xfe\x77\x50\x3c\x31\x82\xca\x39\x06\xc1\x5f\x36\x46\x32\xdd\x3f\x79\x25\x4f\x7d\xbd\x4c\x27\x98\x00\x52\xce\xd9\xdd\x39\x03\x8b\x16\x69\xe3\x17\xc1\x2b\x19\x6a\x6c\x6e\x0a\x7d\x6b\x4a\x46\x4b\xb0\x8b\x87\x78\xfe\x68\xf8\x84\xa9\xc6\x54\xae\xd5\x00\x89\x29\xe9\x10\x91\xfb\xcf\x42\x28\xcf\xc9\xdd\xf9\x09\x86\xaa\x1d\x94\x88\xe8\x23\x66\xb2\x9c\xab\x2d\x09\x48\x43\x4f\xed\xd0\x0e\x01\x43\x69\x00\x6f\x13\xd5\xaa\x60\x55\xc1\x4b\x1f\x78\xa7\x59\xb8\x35\x40\xdf\x86\x04\xe2\xa6\xad\xcf\x8b\xa2\x4d\xdf\x78\x7c\x3f\x7d\xe3\x2f\xc8\x97\x48\x04\xb7\xa2\x1c\xd5\x33\x48\x11\xa6\x28\xea\x99\xf0\xc1\xd5\x87\xe3\x00\xae\x6a\x86\xd5\xa1\xac\xf1\x9e\x6d\xc9\x07\x0f\xa0\xcd\x83\xdb\xd6\x07\x78\xb3\xac\x25\xd6\x04\x2e\xc4\x1d\x87\xba\xf6\xa1\xdb\x02\xdc\x1d\x32\x7c\x9e\x1c\x61\x31\x63\x4e\x7d\xac\x59\xa3\x34\x5d\xec\x90\x13\xf4\x8a\x53\x78\x6d\xac\x43\x32\x26\x11\x39\x3a\x46\x2d\x05\x26\xc1\xee\x9d\x50\x4c\xef\x84\x0a\x41\x40\xed\x78\x88\xa5\x8e\x17\xc1\x51\xe2\x9c\x8e\xea\xce\xc8\x54\xc9\xea\x6c\x12\x74\x6d\xa9\x72\x04\x16\x2c\x6c\xc2\x85\x17\x5a\x85\xce\x16\x8c\x2c\x82\x78\xba\x43\x0a\x82\x9c\xcf\xd7\xd7\x8e\x58\x2b\x05\x76\xf4\xa0\x04\xd8\x1f\xad\xe9\x40\x99\xd0\xf0\x07\x8c\x4a\x06\xa6\x87\x59\x47\x67\xb3\xb5\xcb\x63\x2d\x8c\xa9\x7c\x18\xee\x4b\x91\x15\x9c\x0e\x1d\x28\xf8\xd9\x57\xf1\x27\x60\x61\x70\xdc\x84\xcd\x1a\xbd\x9a\xa9\x0f\x53\xf6\xd2\x22\xac\xe6\xac\x90\x77\x9d\xc1\x2c\x47\xe8\x79\x6f\x39\x2b\xef\x85\xb0\xc7\x52\x58\xe5\x4c\x98\x7b\x21\x4a\x04\x88\x37\x2b\x02\x82\x28\x8f\x30\x9e\x46\xab\x54\x2a\x03\xe5\xc4\xab\xbf\xad\xf6\x96\xec\x15\x1f\x2a\xa5\x45\xcb\x80\xf2\x7a\x94\x36\xee\x58\xde\x41\xe3\x19\xf2\x51\xb9\x0d\x1a\x05\x41\xdb\xfb\x72\x6d\xd8\xd7\x5f\x7e\xf3\x67\x67\xa0\xd0\x9a\xdd\xce\x52\x14\xfa\xde\xb6\xa8\xfa\x97\x0a\xb5\x5f\x01\xe4\xf9\xf3\x2f\xbf\x9a\xb2\x7f\xf0\x42\x52\xa8\x7c\x94\xbd\xd2\x3f\xd6\x1e\x11\x01\x35\xa8\x1d\x4a\x70\xbc\xf1\x61\x78\x6d\x95\x3f\xfc\x20\x75\xec\xed\xb2\x2b\x98\x30\x7a\x47\xe7\xa6\x83\x6e\x0c\xbb\xb5\xd2\x9e\x55\x3a\xf5\x09\x43\xe1\x0d\xda\x5b\x78\x34\xfb\xf3\x2f\xbf\xfa\x13\x3e\x64\xb9\x5f\xdc\xf5\xa4\xbb\x04\xfb\xad\x77\x78\xf5\x2f\x63\xeb\x25\x1c\x4e\x17\x61\xfe\x43\x33\x14\x5d\xb1\x4e\x52\x29\x75\x22\x29\x7c\xe8\xf3\x31\xf0\xad\xdd\x3f\xe0\x8d\xab\x69\x93\xe6\x35\x85\xda\xb7\x74\x05\x84\xeb\x3d\x3b\xb9\x8d\xe7\x3f\x81\xa8\x76\x5e\xe6\xa1\x70\x5e\x91\xdc\x17\xbd\xcb\xab\x0c\x49\x3a\x2f\x02\x10\xe4\x44\x7e\x82\x0a\xe7\xb4\xa0\x37\x24\xaa\xb5\x15\xbb\x79\x5c\x36\x43\xdb\xb1\x8b\xd3\xf9\xfa\xed\x3c\x07\x73\xdb\x4a\x99\x68\xe1\x8a\xff\xef\xe9\x89\x93\xda\x5a\x2c\xd5\x5d\x44\xb3\xe9\x66\xb4\xe8\xb8\x2a\x15\x55\x62\x41\x77\x50\x88\x05\xc7\x79\xb8\x8e\x30\xb3\x04\x85\x89\x0e\x69\x4d\x16\xea\xa6\x2f\x81\x68\xad\xb8\xa8\x9b\xfe\x46\x44\x58\xf1\xde\x6e\x0f\xe7\xab\xb2\x76\x2a\x7c\xbe\x8b\xd8\x60\x76\x97\xf4\x95\x17\x4b\x51\x5b\x21\xb2\xf0\x20\xbc\xae\xa6\xa0\x11\x3b\x2a\xea\x3a\x45\x41\x7c\xfe\xc6\x53\xa8\x1b\x56\xc8\xd2\x5e\x91\xac\x6d\x60\xff\x49\x92\x46\xbc\xd0\x6b\xae\x4a\xce\x02\xc9\xe9\x7a\x54\xa8\xfb\x88\xb9\xb0\xb4\x53\xc3\x65\xf1\xd7\xf3\x13\xef\x4b\x76\x88\x72\x67\xcf\x52\x5d\x07\x8b\xc4\x24\x74\x45\xb2\xff\x74\x5e\x0f\xf8\xa3\xba\x89\x40\x9f\x9e\x42\x8b\xb5\xd3\xd9\xca\x08\xdd\x0f\x9d\xb2\x0c\xed\x17\x34\x53\x18\x0f\x80\x4f\x09\x35\xfb\x1f\x72\x29\xb4\xe1\xcb\xaa\x03\xc7\x61\x46\xee\x37\xff\x9d\x2c\xd9\xd5\x0f\x17\x5f\x7e\xf9\xe5\x9f\x19\x9a\x4e\x00\x32\xc2\x4f\xcb\x32\x13\x7f\x3d\xd7\x1e\x35\x5a\x2d\x10\x05\x35\x5f\x2d\xf0\x05\xe4\x9c\x69\xe8\x3c\xc7\x54\x91\x8b\x1a\xfd\x9f\xa5\xba\xef\x87\xf8\xfc\xab\xc5\x28\x90\x39\x5f\x75\xe1\x1d\x68\x57\x54\xae\xc9\x22\x2f\x4b\x65\xb6\xd7\xa8\x94\x7c\xef\x72\x20\x73\x07\xc7\x77\xd1\xf1\x29\x76\xf6\x06\xb9\xd1\x0c\x00\x61\xef\x9c\xff\x98\x6b\xda\x7f\x08\x47\xc9\xc3\x18\x8a\xef\x92\xb2\x48\x1f\xa7\x0a\x18\xd0\xf5\x0a\xb8\x8d\x30\x9e\x8f\xe1\x0f\x49\xb7\x53\xf4\xe2\x61\x09\xf9\x32\x49\x06\x0f\x37\xb0\xd8\x9b\xe0\xdc\x7e\x31\x3d\x2c\xfb\xb0\x5b\xca\x3c\xce\x8c\x0d\x8a\xa0\x29\x73\x51\xaf\x31\x39\x0e\xa8\x0f\x29\x1a\x6f\x4b\x7e\xbb\x18\xbe\xf4\x0c\x75\x5b\xf4\xd4\x1f\x3c\xee\xea\x74\x72\xa2\x47\xa6\x1b\x13\x4b\x3c\xab\x68\xa6\x13\x3c\x96\x7d\xfc\x9b\x4f\xc8\xc3\x18\x3a\xa8\x56\x1c\x15\x16\xf0\x64\xa5\x54\x41\x8c\xf2\x0b\xe7\x61\xfa\xfc\xe9\xce\xd6\xd3\xb9\x3b\xad\x8c\xea\x62\x80\x4e\x50\x64\xf2\x5c\x59\xdb\x00\x58\x7c\x4a\x96\x2e\x72\x2b\x2e\x5b\x40\xc9\xb0\x6e\x0c\xe8\xe9\x04\x8d\xe0\x39\xb1\x9f\x86\x9c\x4f\x8f\xf8\x21\xf9\xdc\x40\xe5\xa2\x6d\xf9\x8c\xa3\x3a\x85\xc6\xec\xdf\xb0\x95\x1a\x39\xb2\x81\xcc\xf0\xf0\xeb\xfa\xf3\x49\xcd\xde\x88\x3b\x51\x6f\xcf\xf1\xa6\x3c\x69\xa5\x5f\x56\x2a\x9f\xb8\x8a\x95\x38\x95\x5d\x00\xd8\xa0\xae\xf3\x67\x7c\xb2\x58\xac\x9d\x71\x45\x65\x5d\x5a\x7f\xb6\xff\xae\x63\xa7\x09\x2e\x09\x54\x2e\xad\x15\x44\x2d\x70\xc8\x1e\x1b\x5d\xf9\x81\xdb\xa3\x6f\x3e\x7a\x68\x9e\xa1\xf7\xf7\x54\xcb\x5c\xb0\xbc\x5e\x9d\xda\x05\xf4\xe7\xa2\xac\xe3\x61\x1f\x94\xd6\x2d\x1c\x96\xe9\xe8\x6f\x0d\x42\xf7\x1d\x6d\xec\xcb\xcd\x05\x26\x20\x36\xae\x97\x95\x10\x02\x97\x75\x7a\xb6\xf6\x90\xce\xbf\x21\x12\xd7\x26\xb4\x5d\x5a\x50\xf1\xb0\xb1\x80\x4e\x2b\xf6\x7f\xa7\xd3\xe9\xff\x63\xa7\xa7\x84\xf1\x5f\x71\xb5\x27\xb1\x81\x94\x66\x3d\x87\xd9\xed\xa6\x8b\xa4\x89\x93\x73\xbb\x4d\x2b\x51\x5a\x7d\x4e\x19\xf2\x29\x9e\xb8\x36\x6b\xd3\xe2\xe6\x3d\xe4\x1d\x7d\xb8\xdd\xd3\x3a\x66\xb7\x9a\x3e\x11\x83\x35\xf4\xbe\x02\x17\x38\x9d\x8c\xe0\x63\x13\xf9\xa6\xcd\xd9\xcb\x55\x9a\xe3\xa4\xf3\xa6\x04\xfd\x9e\x26\xad\x46\x4f\x13\xc6\xfe\x26\x8d\xdd\xe5\xd2\xe0\x43\x86\x30\x99\xd3\xc8\x17\x88\x7d\xfc\xa8\xeb\x5a\x29\xda\x7f\xbb\x19\xd3\xe8\x17\xc8\xad\x2c\x4b\x08\xb6\x56\x07\xdc\x6e\x55\xad\x3e\xac\x98\x56\xd9\xad\x18\xeb\xda\xba\xc4\x21\x14\xa1\x98\x96\xab\x3d\x3d\x6d\x4a\xf9\xe1\x14\xe1\xfd\xf5\x19\x3c\x4d\x8f\xb2\x7b\xb8\xc3\x04\xc1\xaa\x92\xcd\x56\x5e\xe3\x84\x5d\x60\xbf\x71\xd7\xac\x64\xaa\xff\x9f\x56\x51\x8c\xce\xff\x7f\x8a\x8e\x68\xca\x45\x0f\x70\x2d\x50\x7c\x67\xc6\x27\xad\xe8\xdd\x00\x54\x3b\xf8\xcb\xbe\x7b\xf6\xac\x50\x19\xb7\xf6\xd7\x77\x67\xcf\x78\x25\xc3\x6d\x35\x01\x86\x19\x82\x98\xea\xce\xb8\x61\x96\x21\x06\x94\xa6\x97\x48\x53\xe3\xfb\xe4\x41\xb9\x05\x94\xfe\x5f\x51\x8f\x7d\x19\x58\xc7\x30\x84\x48\x04\xf5\x41\xad\x67\xbb\x32\xcd\xa3\x36\x82\x7d\xf6\xdb\xbf\x9e\x51\x7b\xeb\x9d\xb8\x65\x05\x80\x64\x77\xda\x61\x4f\x48\x90\x18\xc1\xa2\x03\x1b\x97\x3b\xfb\x15\x29\x99\xe4\xa5\x58\xaa\x81\x57\xd9\xf4\x36\x10\xbf\xe2\x14\x23\xec\x8e\xd8\xd5\x88\x57\x8b\x70\xbe\x93\x69\x79\x23\xef\xec\x8d\x1c\x3d\xc6\x17\x4e\x03\xad\x9b\x94\x7a\x4b\x3d\x8f\xea\x13\xa7\xc5\x18\x83\xe5\xa9\x8d\x45\x4c\x47\x75\x3f\x82\x8b\x38\x14\x6a\x8c\x46\xba\x7a\x69\x5a\x18\x57\x51\x7d\xc0\x23\x89\x4f\xab\x52\xb3\xe7\x87\xb4\x46\x20\xa1\xef\xd0\x2c\x75\x85\xca\x07\x56\xf2\x89\x89\x96\x89\x21\x89\x2c\x71\x44\x93\x03\xf6\x7c\xca\xde\x8c\x47\xcd\x5a\xbb\xe7\x1b\x20\x3e\xdf\x1a\xe2\x01\x04\xed\x8d\xb8\xc7\x9e\x9b\xc1\xf9\xea\xe3\x74\x26\xf0\x1d\xba\xbf\xc0\x7d\xa8\xe6\xd4\xad\xb3\x47\xf2\x2c\xa2\x35\x24\xa2\x00\x4d\x7f\x77\x9d\x3c\xa1\x79\x65\xab\x78\x67\x5a\x7b\xda\x83\x1c\x2d\x77\x29\x32\x68\xb0\x52\x1b\xd1\x10\xb4\x86\xe2\x23\x42\x3f\xd1\xd8\xf1\xe9\xe3\x66\xde\xbc\x7d\x07\xa1\x41\xac\xa9\xf0\xae\x53\xd0\x5d\xd7\x9e\x07\x38\x78\x8c\x7d\xd9\x5a\xfd\x33\x1a\xb9\x23\xb1\xc9\xe7\x06\x40\x76\x23\xb5\x48\x3b\x88\x02\x24\xe7\x74\x86\xa2\xea\x22\x9f\x38\x63\x05\xcb\x84\xf8\xde\x4a\x96\x34\x18\x4e\x30\x92\x1d\xa5\x6b\xfe\xea\xd9\xd0\xcf\x85\xa8\x1e\x3c\x69\x09\x34\xe9\xc5\xbd\x35\xe6\xc9\x69\x89\xb6\x33\x8c\xf7\x57\x77\xba\x4a\xd8\x8f\x5a\xe0\x5c\xbd\xe8\xe0\x94\x70\x11\x36\x52\xe8\x8d\x00\xf1\xb3\x16\xc8\x4e\x64\xd5\x9b\xb7\xef\x5c\xc2\xe7\xc3\x48\xc9\x2b\xa4\x66\xcf\x6e\xd9\x42\x16\xc6\x6c\xb9\x8d\x15\x67\x40\x5d\xfa\xaf\xa3\xbe\x01\x44\xef\x76\x81\x33\xd0\x9d\x4e\x39\xcd\x55\x43\x2e\x7a\x4f\x31\x77\x9f\xeb\xc0\xed\x23\x7a\x97\xe0\x50\xf6\x00\x5d\x0e\xa6\x5d\x8a\x6b\x4c\x08\x64\x9b\xfc\x99\xaa\xc5\xfb\x35\x3c\xe8\xd9\xa5\xdb\x73\xe0\x23\xdb\x89\x4b\xa1\x35\x3c\xb9\x6f\xd8\x3b\xf4\xdd\xf0\xe6\x09\xd6\xef\x0e\x2a\x76\x4f\xee\xbd\x7c\x73\xed\x23\x98\x7a\x38\x56\x0a\x73\xaf\xea\xdb\xdf\xed\x77\x3e\x8f\x9b\x4c\xf4\x67\xc2\x64\xcf\xec\xc5\x4b\x43\x54\x9c\xa4\x47\x74\xa0\x06\x85\x44\xfd\xf6\x93\x2c\x9b\x0f\x6f\xcb\x62\xf5\xfb\x88\x43\x2b\x7d\x74\x8a\x6b\x0a\x82\x33\xc5\xc7\xa9\x7a\xef\xb5\x56\xc5\x5d\x98\x2c\xa7\x50\x2f\x87\x8c\xab\x10\x72\xeb\x43\x92\xa6\x3e\x37\x46\xf2\x08\xfd\x8e\x3e\xfa\xaa\x4b\x52\x22\xc4\xb3\xbc\xec\x27\xa1\x5d\xf9\xab\x0f\x46\xd4\x25\x2f\xde\xf0\xa5\x8f\x6f\xed\x3b\xff\xd7\x11\xd5\xfe\xa9\x03\xcb\x07\x29\x8c\x3c\xf4\x93\x1a\x6f\x22\x82\x34\x4d\x6c\xa2\x36\x21\xdd\xb3\x2c\xcf\xf3\x5a\x68\xc7\x4d\x78\x48\x47\x78\x96\x6c\x17\x6f\x5e\xfc\xfc\x8a\x5e\x33\x62\xd0\x68\x74\x45\x1f\x87\x4c\x75\xdc\xb4\x7e\x66\x3f\x9d\xc2\x6e\xa3\x6f\xae\x29\xaa\xd2\x49\x8f\x0f\x74\xba\x20\x8f\x73\x14\x0d\x60\x56\x95\x80\x0b\x25\xc5\x51\x44\x08\x18\xc5\x28\x5d\xfb\xf5\xe5\xa4\x3b\x9d\x9d\x87\x7c\xd7\x0e\xd8\x0c\xef\x9f\x76\x83\xbd\x60\xb5\xc8\x54\x9d\x77\x85\xa1\xa7\x3c\xda\x26\x61\x88\x08\xca\xac\x84\xd9\x9f\x76\x94\x03\x78\xbd\xb1\xff\xf1\x23\xc1\xd9\x72\x4f\x79\x99\x58\x08\x9e\x43\xc9\xce\x44\x38\xe8\x75\xfc\xa2\x53\x47\x10\x8f\x0c\x57\x5e\x20\x0e\xc6\x75\xa5\x1d\x27\xae\x57\x04\xe1\x45\x95\x56\x9b\x59\xae\x96\xdc\xb5\xf2\xe7\x61\xbe\x32\x91\x3f\x1f\xdd\xda\x92\x41\x7b\x5c\x41\x45\x78\x66\x2f\x27\xe8\x7b\x25\x80\x25\x01\xbc\x17\x05\x3c\xc4\xfb\x99\x03\x1b\x5d\x7c\xaf\xe3\x26\x76\x4c\xe6\x06\x27\x3f\x30\x67\xfd\x52\xf7\x65\xed\xb5\xa7\xd9\xbf\x2d\x2f\xc3\x54\x0f\xc8\x4c\xbd\x9f\x8a\xf6\x5a\x79\xdc\xb1\xd6\x61\x5a\xfb\x8c\x6b\x07\x3c\xb5\xc8\x89\xe4\x20\xd7\x9b\x6f\x3a\xe5\x06\x85\xa4\xf0\xf0\xd0\xdc\x37\x11\x2f\x57\xf8\x00\x1d\xa2\x70\x80\xb9\x21\x6e\x13\x9e\x0c\xfa\x4f\x87\x58\x71\x5a\x4c\xe8\x9e\xed\x03\x34\x5e\xbe\xb9\x0e\x69\x56\x23\x2e\xdc\x9b\x18\xb4\x9b\x5d\xe2\xf8\x13\x1b\x22\x4f\xca\xf2\x78\xf9\xe6\xfa\x00\xc4\xb9\xfc\xfb\xcb\x37\x89\x1c\x8e\x24\x53\x7c\x1e\x62\x7f\x15\x23\x79\x11\x6d\x51\xe0\x5e\x1b\x32\x8b\xcf\x9d\x4d\x25\x4e\x86\x15\x15\x84\x08\xdb\x81\x45\x38\xe5\xbf\x57\xee\xb5\xcd\x6d\xa8\x75\x4a\xa5\x8b\xaf\x33\x20\xa4\xf7\xfc\xc8\xba\xbb\x2f\xdc\x7d\xa8\x73\xe0\x63\x6c\xc4\xd5\x3f\xbc\x01\x10\xaf\xf4\x3b\xf6\x42\xb3\x5f\x65\x99\xab\x7b\xcd\x42\xd7\xff\xa4\x7a\x9c\x6f\xff\x07\x18\xc2\xe3\xff\xdf\x5f\xbe\xd1\xdd\xd2\x19\xdf\xec\xb0\x03\x1a\x6d\xd4\xd2\x0a\x18\x3a\x06\x47\xf2\xd8\x57\x2c\x21\x6f\x22\x10\xd1\x4a\xb2\xfd\x06\xf8\x0b\x6e\xf7\xd1\x06\xa5\x3f\x4a\x5e\xbe\xb9\xa6\xd2\x9d\x5c\xb3\x37\x50\x1c\xa9\xcc\x1d\x96\x16\xb8\x9f\x11\x33\x7d\xf0\x01\xd5\x97\xba\x88\xa7\xc6\xe7\x4c\x5e\x67\x0b\xcc\x8a\x24\x16\xe2\xb1\x92\x56\xad\x9d\x89\xa8\x59\x0c\xc6\xd6\x53\xd1\x62\x80\xda\x99\x37\x84\x28\x86\x47\xb9\x28\x92\x62\x3f\xbe\xbc\x22\x89\xba\x2e\x20\xbd\xb3\xb7\xb2\x90\xe7\x49\xfa\x71\xfa\x4a\xf0\xca\x8b\xa6\x5d\x51\xf2\x25\xee\x38\xbb\x05\xe1\x65\xdb\x17\x02\xf7\xf9\x7c\x23\x9e\x45\x7d\xed\x91\x75\xf5\x85\x06\xca\x0b\x85\x4a\x39\xfe\x35\xad\x0d\x6e\xbb\xda\x42\xed\xd1\x00\x76\xa8\x30\x8f\xdf\xb3\x40\x8a\xb4\x2c\xe0\x18\xe0\x9b\x0a\xff\x24\xf0\x63\x8f\x76\x1c\x09\x90\xf2\xc3\xf2\xc2\xdd\x62\x80\x1f\xbc\xc5\x90\x31\xb5\x58\x9c\x50\x25\xf3\x1f\x4d\xbc\xa2\x0a\xab\xa3\x24\x2d\xc8\x96\x4b\x12\x75\xce\xaa\x10\x05\xf1\x49\xea\x8e\x20\x75\x1b\xd9\x36\x4e\x25\x3c\x21\x09\x04\x0f\xd8\x46\xa1\x83\x7f\x53\xb6\x84\xe5\x29\x05\x57\x7c\x92\xb1\xdd\x64\x2c\x22\x61\x3b\xc5\xa5\x98\xbb\x16\x0a\x60\x3a\x6d\xe4\x8c\xe5\x74\xce\x3e\x0b\xe6\xeb\x67\x0e\x2d\x67\xc6\xfa\xeb\xc2\x13\x92\xba\xa4\x4c\x9b\x95\xab\x3e\x90\x6c\x7c\xa5\xbe\x4f\xa2\xb6\x0b\xfc\xde\xc6\xac\xa1\x5a\x1e\xbe\x72\x6c\x5f\x31\xef\x38\x62\xf6\xb3\xac\x6b\x55\xf7\x57\x55\xee\x17\x36\x3f\xc2\x97\xb3\x80\x3f\x30\xee\x8c\x60\xbf\xb9\x28\x37\x96\xc8\xe2\xaa\x3b\xd0\x9e\x8c\xda\x8b\x91\xb2\xff\x24\x8b\x07\x93\x45\x64\x09\x96\x6b\x03\x71\x24\x1e\xb9\xcf\x92\x42\x8e\x4e\x08\xe3\x8e\xcf\x99\x19\xdb\x25\xb8\x57\xe6\x96\x4e\x46\x3a\x35\x43\xb2\x85\xc8\x1b\x6c\x8a\xff\xa3\xd2\xe6\xd2\xee\x91\x70\x92\x97\x39\xfc\xf5\x35\xf6\x4c\xb9\xac\x95\x51\x99\x2a\xec\x3d\x33\xee\xbb\x3a\x28\xa7\x1e\xe2\x1d\x25\x07\x6a\x1f\xa8\x58\x0b\x2c\x71\x07\x17\xa2\x42\x66\xc6\x27\x73\xfa\xbc\x07\x30\xfa\xc0\x15\xb4\x70\x70\x66\x8d\x89\xf2\x4b\x17\x01\xb5\xca\xa1\x36\xde\x27\x00\x46\x4b\x88\xab\xb5\xf3\xc4\xf8\x36\x5d\xb7\x97\xbd\xf4\x21\xbd\xd2\xea\x38\xe8\xae\x52\x39\x94\xfa\xb7\xc0\x88\x66\xd6\x32\x72\x78\x81\xe8\x13\xe2\x71\xd9\x5a\x69\x0d\xa7\xfa\x56\xe4\xcc\x23\x8e\x30\x65\x99\xe1\xc2\xdf\x20\x35\x7d\x45\x40\x54\x64\x50\x39\xcc\xf9\x01\xb6\xa8\x0d\xee\xc4\xc3\x42\xb6\x70\xda\x02\xf1\xba\x84\xd2\xd3\x9b\x8e\xbb\xe8\xb3\xc1\xc3\x2e\xfe\x26\x1c\x71\x23\x5e\x08\x4e\x28\x17\xc0\x50\xf1\x90\x1d\xb4\x0b\x6e\xce\x64\x4b\x76\xe0\x6d\xa7\x5e\x3a\xc3\xd7\xee\x7f\x89\x6b\x17\x63\x0a\xc5\xf6\x21\xb6\x25\xf0\x4d\x67\x1c\x9d\x6f\x89\x7a\x19\x5d\x15\xd6\x4f\xd7\xae\x7d\x0b\xb3\x26\x0e\xa7\x76\xb7\xe9\x31\xb5\x5a\x9d\x44\xd2\x34\x03\x02\x89\xa5\x9a\xc7\x49\xa5\xff\x96\x6d\x92\x4d\xf8\x12\x56\xb0\x65\xc5\xe4\xd3\x83\x8b\xe8\x00\xc4\x63\x09\xe9\x69\xcc\xda\xcc\x92\x61\xcc\x31\xb8\x95\xa8\x76\xa7\x38\xba\x4d\xb6\x83\xbc\x01\x62\xdd\x58\x2f\xb7\xce\x09\x93\xa5\xa9\x31\x09\x63\x61\x4c\xb5\x4e\xfc\xc2\x28\xf6\xb7\x9a\x97\x4d\xc1\x6b\x76\xb1\x10\xd9\xad\xa6\xd3\x86\xa4\xd1\x95\xa8\xc7\x46\x61\x16\xfc\x69\xe5\xcb\xcc\x2d\x97\x4d\x49\xa1\x8d\xdf\xc1\x8c\xec\xb7\x37\x2a\x17\xb1\x3c\x8e\x7e\x94\x53\xda\x88\x0f\x22\x0b\x89\x3a\x52\xb3\x8c\x57\xd8\x9d\x67\xce\xb2\xa6\x2e\xf0\xcd\xdb\x64\x50\x55\x09\xb2\x16\xb4\x7b\xb0\xa3\x7a\x0e\x70\x4c\xf9\x7a\xc0\x50\x7c\x88\x67\x06\x73\xe5\xef\xc5\x8c\x82\xad\xa1\xd8\x91\xb5\x67\x30\xc7\x1e\xd3\xfc\x6a\xa3\xd9\xb7\x67\xdf\x9e\xe1\xe3\x47\x56\xf9\xe8\xbd\x6f\xcf\xbe\x3d\x87\x3f\x36\x79\xe5\xb5\x73\x54\xb5\xd8\x5a\xc2\x55\xad\x3e\x40\x5f\x85\xd0\x0c\xd0\x1e\x79\xc1\xf5\x83\x21\xa2\x78\x83\x9a\xc3\xf9\x4b\xe1\x60\x21\xdb\x5f\x64\x2e\x62\x34\x60\xda\x4a\xf1\xae\x21\xad\x90\x23\xa9\x41\x1c\x29\xba\x15\xde\x91\x30\xe5\x30\xc1\x29\xae\x9c\x4c\x9b\xc3\xbd\xba\xb8\xa4\x0c\x0a\x3b\xef\x71\x15\x53\xbc\x7a\x14\x70\x5b\x14\xbe\x47\x36\xf0\xc3\xa7\x5b\x29\x42\x2d\x7e\xe5\x02\xfc\xac\xcd\x22\xcb\x56\x1e\xd7\x92\x7f\x80\xf4\xea\x15\x83\xa4\xe0\x10\x8c\x55\x0b\x6d\xaf\xc7\x50\x86\xc8\x0e\xc7\x64\x49\xf9\xaf\x26\x04\x02\x74\x1f\xc6\xc0\x7c\x38\xff\xb6\xbb\x79\xb0\xad\x9c\xdf\x43\x91\x3e\x18\xb5\x83\x9a\xfc\x81\x37\x50\x93\x7f\xda\x3f\x0f\xb3\x7f\x2c\xa5\x3f\x6d\x9f\xe3\x6e\x1f\xab\xa3\x26\x2e\x97\x3d\x5f\x1b\xc0\xb3\xd3\x56\xb2\x40\xd7\x1f\x45\xf1\xed\xea\xd3\xb6\xfa\x48\x8e\x25\x4c\xe5\xf7\xb0\xb4\xf9\xdc\x5d\x97\xff\x6a\xb2\xea\x0b\xe6\x23\x3e\x37\x6c\xbe\xad\x37\x5e\x1c\xd8\xd3\xbf\xf9\x76\xd9\x78\x58\xc2\xc3\x6f\xbe\xf5\x97\x69\xba\x48\xff\xb8\xfe\x22\x8d\xdc\x82\xaa\x63\x55\xc1\x8d\x15\x62\xea\xdd\x3a\x70\xc3\xee\xb1\x2b\x3f\xe2\xbd\x0d\xa7\xe4\xa7\xad\xfd\xc7\xda\xda\x4d\xfe\x69\x6b\x3f\xf4\xd6\x86\x5c\xd9\x89\x77\x77\xe2\xbf\x7f\x95\x66\x71\xc9\xcd\xc2\xb7\xe8\x5f\x1b\x17\x85\xe9\xb6\xa1\x00\x6a\xc8\xe4\x48\xfb\xfc\x6b\xea\x2e\x89\x95\x2e\xfd\x53\xec\x4c\x61\x37\x66\x9f\x9b\x6f\xf9\x93\xa2\xb1\x7d\xe7\xe7\xca\xa7\x0a\xfa\x10\x29\x8f\x55\x7b\x2e\x91\xbc\x36\x78\x17\x2a\x48\x9a\xc8\x21\xda\x2c\x45\xc7\x89\xb0\xcb\x0b\x03\x51\x5e\x0a\xb3\x50\x56\x31\xbc\x68\x2d\x3b\x81\xea\xeb\x7c\xda\x95\x83\x64\xba\xd9\xb7\xf1\x94\xc3\x16\x1b\xe0\x24\x16\xb2\x6a\x2d\x6d\x2b\xf6\x85\x50\xc0\x0f\x2b\xff\xe6\xc2\xd3\x3a\xc2\x40\xc4\x4d\x39\xd3\x10\xfb\x80\xed\x05\xc0\xd5\x9c\x2a\x02\xa3\x98\x2c\xef\xd4\xad\x60\xec\x19\x20\xed\x9f\x16\x88\xc0\x6e\xcf\x3e\x03\xb5\xf5\x8c\x72\x9d\xa3\x16\x9a\xbe\xe4\xbc\x55\x66\x05\x15\xad\xa3\x2d\xe8\x81\x05\xca\xf3\x6c\x61\xb5\xfa\x16\x61\x83\xbd\x74\xbe\x6e\xd1\x96\x15\xdc\x88\x32\x5b\x4d\xa0\xa2\xbd\x5e\xa8\x22\x5f\xbb\x5d\xda\xe3\xb5\x03\xe0\x08\x4f\x7d\x25\xc0\x37\xb5\x90\x37\x1b\x0b\x0a\x5c\x35\x25\x3b\x3f\x3b\x63\xd2\x78\x67\xa0\x6b\x40\xd7\xd3\xaa\x3e\x2e\xba\x08\xb1\x99\xbc\x21\x19\xa5\xe2\x97\x4b\xc1\x29\x85\x48\x60\xc3\x3e\x69\x98\xe1\xb7\x14\xce\xe8\xfd\x91\xf1\x2d\xc5\x5d\x83\x3c\x49\x7c\x71\xcd\xf8\x2b\x57\xce\xc5\xd7\x31\x86\x93\x48\x0b\x96\x37\x0e\x6f\x38\xc7\x78\x65\x20\xda\xcc\x4e\x97\xae\x6b\xe2\x60\xd2\x43\x7a\x32\x4e\xa3\xfe\xa4\xa6\xdc\xf6\x28\xf8\xd3\x99\x59\x4c\xd8\x9f\xcf\xcc\x02\x30\xfc\xf3\x9f\xad\xa2\x11\x75\x26\x4a\x23\x69\x76\xca\x7d\xf4\x67\x83\xa8\x3d\x37\x7c\x8f\x0f\x6c\x12\xcf\x0a\x39\x13\x35\x34\xab\x80\x04\x5a\xcf\x6b\x4b\xec\xe7\x67\x48\x1d\x3b\x63\x34\x85\x3f\xcb\xff\x74\x16\xf2\x7a\xfe\x9c\x7e\xb3\x85\x38\xba\x8a\xe9\x84\xe1\x80\x60\x4e\x7c\x91\xa1\x55\x25\x26\x21\x9d\xc3\x52\x26\xce\x88\x19\x21\xa3\x7d\x15\xf1\xb2\x90\x4f\xe2\xf3\x48\xc2\x24\xc8\xa0\x74\xa2\x6d\x33\x6e\xd4\x1c\x21\x7b\xa0\x53\xbf\x67\xd6\x84\x34\x62\xac\xeb\x8a\x71\x4d\x2d\xdb\xd2\x95\x27\x39\x31\xbf\xf8\x84\xcc\x34\x1f\x66\x2d\xb1\x18\x86\xd5\x1b\x90\x7e\xc8\xe0\xa1\x94\x1b\x28\xaf\x17\xe7\x07\x39\x6c\xe9\x6d\xa1\x3f\xfc\x32\x31\x47\xbc\xac\x2d\xac\xc9\xa8\xb5\xca\x24\xd8\x72\x3d\x24\x18\x4c\x3c\x42\xcf\xf9\xeb\x4b\x9f\x7a\x04\xd5\x24\xec\x71\x93\x86\xea\x42\x86\x20\x3c\xbe\x87\xd0\xf6\x38\x8c\xc8\x85\x85\xa6\x8b\xea\xbc\xd7\x6d\x14\xd3\x71\xe2\xf9\x6a\x28\xfb\xe8\x90\xe2\xd9\xe1\x64\x3c\xd1\xae\xe2\x19\x03\x9d\x24\x14\x74\x84\x83\x20\xf5\xd6\xde\x48\x3a\x07\x81\xa8\xfa\x97\xd9\x8e\x7c\xc6\xca\xb3\xb3\x8e\x36\xb1\x18\xf2\x7b\xa9\x20\x7a\x3a\xf9\x12\xc4\x74\x12\xed\x0c\xb0\x7e\xbf\x3d\x8b\xb3\x51\xe0\x4f\x56\x55\xbd\xbb\xb8\xb4\x7f\x77\x46\x79\xd2\x16\x62\x8d\x44\x8f\xda\x79\x30\x81\x34\x2d\x8b\x88\xce\x65\xa6\xa2\x9b\xcd\x1b\x97\x41\x13\x40\xa9\x32\x88\x66\x8c\xf5\x83\x89\xa6\xbd\x62\x5e\x62\xc5\x98\xa3\x4a\xa6\x9b\xe7\x23\x16\x4c\xb7\x04\xea\x4f\x3a\x46\xf0\x26\x1d\xc9\xf3\x9f\xa4\x52\x47\xcf\xb7\xb1\xe4\xf9\xeb\xb4\x27\x45\xe9\x5a\x54\xa9\x5c\x9c\x68\x86\xe2\x43\x1d\x73\xe1\x0c\xf7\x4b\x8c\xb8\xca\x10\x8f\x20\x72\x5e\xd7\x46\xf4\xa8\x55\x13\x1d\x1d\xae\x2f\x68\x57\x3f\x7b\xb9\xc6\xeb\x5c\x9f\x6c\x63\x71\xac\x48\xbe\xe9\x83\x4b\x30\x63\x13\x80\x50\x01\xbe\x1f\x6a\xb2\x44\xb7\x9a\xa3\x6d\x0a\x2f\x9c\x47\xb4\x26\x12\x96\x1c\xc8\x98\xf0\x84\xd9\xc6\x96\x38\x84\x5c\xb5\x64\x2a\xbd\x63\x8e\x90\xab\x9e\x2d\x37\x92\x52\xfb\x99\x2b\xed\x6d\x06\xcb\x48\xec\x94\x20\xba\x91\xc5\x12\xc2\x93\x82\xca\x9f\x40\x03\xd3\xcc\xb7\x7e\xf3\xa4\x09\x7b\x05\x24\x35\x1f\x63\xe5\x0c\x59\x38\x18\x13\xf1\x74\xac\x1c\xbf\xc8\xd0\x91\x74\xa7\x0d\xe2\x04\xda\xb9\x46\x2d\xfe\x09\xdb\xf5\xa8\x6c\x16\xbf\x31\xac\x96\xf5\xb8\xf9\xe6\x00\xa0\x8e\x04\x74\x06\x02\x05\x23\xa1\x17\x3d\x56\xff\xa4\xc2\x4e\x2e\x75\x83\x5a\x24\x53\xa9\xb5\x9e\xcc\x3e\xf4\x9c\x80\x10\xb4\x27\xf2\x99\xa9\x74\x1d\xf4\x17\x24\xe7\x14\xc0\x0d\xd5\x7e\x01\x43\xfc\x54\x89\x0e\xcc\x13\x26\x4b\x3a\xc7\x78\x19\x18\xc8\x5e\x5f\xea\xd8\x2f\x79\x0c\x55\x18\xb4\x1f\x28\x43\x2d\x34\x36\x9d\x9f\xcf\x65\x69\x09\x06\x47\x5f\xb9\x2b\xaf\xf5\xbd\x84\x0a\xcb\x6d\xa8\x2e\x6f\xa6\x43\xcd\x5d\xd2\x09\xdb\x8a\xf1\x33\x07\xf5\xb3\x38\x29\xac\x6b\x17\xf6\x1a\x84\x27\x27\xda\xa1\xfb\xc2\x61\x1b\x9a\x06\x7c\x86\x95\x1f\x5f\x5f\x7e\xb6\xe3\x0d\x8e\x5b\x10\xa4\x64\x3e\xeb\xb3\x25\x49\xaf\xc4\x7b\x02\x6a\x08\x53\x86\x2f\xfa\xbb\xf1\x05\xd6\xad\xff\x2a\x2a\xc4\x75\x91\x94\x03\x8b\x4b\xa7\x7c\x49\x25\x9f\x6b\x11\x2a\x54\xdb\xf9\x6a\xd7\x20\xc1\x15\x4f\x5f\xa5\x9a\x59\xa1\x17\x21\x64\x81\x53\x7a\x2f\x54\x44\xc5\xca\xb9\xd4\x1e\x1d\x5c\x16\xa2\x34\x6d\x1b\x2b\xc1\xb6\x24\x37\xb0\xca\x31\xf5\xfc\x36\x9c\x0c\x23\x6c\xb3\x1e\xee\xb8\x83\xe2\x33\x2b\xa6\x9f\x8d\xb8\xaa\x4e\x5d\x5e\x6f\x82\xf8\x92\xe7\x22\x89\x27\x0d\xe7\x23\x9c\x8c\x78\x34\x5a\x8a\x79\x4b\xb0\x3f\x35\x1b\xa9\x15\xd7\x78\x08\x85\x29\x5c\x9a\x35\x91\x90\xaa\x97\x11\x42\x43\x4b\x2c\x56\x71\xa1\xa6\x19\xcf\x6e\x53\x49\x9c\x74\xef\xdd\x03\x38\x84\x20\xdb\x2e\x12\x98\xec\x55\x14\x2c\x53\xa5\x16\x59\x63\x24\xe5\x96\x8f\xb0\x07\x77\xb0\x05\x93\x3b\x58\xbf\x3d\x18\xd9\x82\x5d\x63\x30\xcd\xc6\xa5\x57\x04\x8a\xe6\x13\xc9\x03\x44\x47\xf9\x6c\x15\xa0\xb6\x49\x7d\x46\xf7\xc2\xc7\xd0\x9f\xa9\x2f\xd4\x2a\xbf\x2c\x38\x01\x0e\xa1\x4a\x83\xb2\x9a\xae\xd7\x90\x84\xce\x2e\x5a\x32\xd5\x90\xd1\x94\x6e\x6b\xa7\xd5\x5f\xf6\x55\x7b\xfe\x84\x8e\x55\xdf\x7e\x6a\x8f\x16\xdf\x55\x7d\x7b\xa8\xbd\xb6\xb3\xb9\x8f\xec\xdb\xab\x3d\x7a\xdd\x1d\x52\x7d\xc1\x7c\x92\x66\x94\x5a\xb3\x2a\x8d\xd2\xf6\x3e\xa9\x35\x52\x6b\x7d\xaa\xe9\x81\xd5\x52\xa6\x96\x15\x24\xad\xd0\x5f\xae\x31\x68\x7c\x5d\x15\xb6\x41\x75\xe4\x61\x05\xf5\xa0\x5b\xe0\xb6\xbc\xc2\xf6\x14\x36\xa1\x02\x6b\xbf\xe2\xce\x82\x0e\x35\x56\x19\xb8\x68\x77\x5f\x83\x2a\x4b\x74\x88\x7b\xe3\xcd\x69\x64\xe5\x92\x66\xa2\x71\xc3\x63\x00\x22\x8c\x03\x29\x1c\x3d\xae\x35\x57\x20\xcb\x46\x2c\xb7\x78\x10\x1d\xe0\xf0\x0f\x32\xed\xa6\xe8\x84\x57\x96\x3e\x09\xf3\x8d\x4b\xc2\xdc\x86\xc9\xd4\xfd\x36\x71\x81\xc5\x55\xe6\x7c\x66\xe7\x98\xdc\x91\x9f\xa0\xe3\x75\x51\x84\x59\x24\x5a\xb0\x1e\x35\x3d\xf1\x8f\xc9\x48\x26\xd7\x5c\x8e\x47\x97\x4b\x97\x71\x1a\x2d\xd7\xdf\xc5\x3d\x24\xbb\xdf\x69\xe5\x9d\x6b\x51\x4f\xf0\xdf\x01\xaf\x45\x4e\x53\x85\x8e\x3c\xaa\xd9\xca\x93\x0a\xf9\xd0\x5d\xc8\x08\x08\xfb\x1c\x7d\xfc\xf7\x24\x8a\x4b\x18\x58\x64\xb0\x1b\x76\xb0\x14\x3a\x77\x29\x1d\x89\xce\x86\xbb\x14\xc5\x0d\x8d\x36\x26\xe8\x34\x1e\x77\x8f\x1a\x6b\x4c\xf8\x83\x73\xdc\x3d\x6a\x8c\x31\xd1\x63\x32\xad\xb9\xc2\xb4\x0e\xbf\x75\x57\x97\x2d\xcf\xd8\xb0\x9a\xa6\x34\xb2\x70\x0c\xa7\x0e\x19\x08\x11\xff\x34\x09\x9f\x7a\x86\x5b\x3c\xa8\x53\x4b\xc8\x34\x04\xb2\xb7\x4d\x8c\x18\x7f\xbc\xbe\xee\x77\x80\x77\xef\x24\x03\x50\xb7\xb9\x97\x74\x0e\x7f\x12\xfa\x47\xbe\x97\x3c\xa4\x02\x7b\xea\x17\x95\x4d\x6a\x6a\xbd\x8a\xea\x79\xc0\xe9\xbd\xd0\x6c\x7b\x99\x71\xbb\x79\x4b\x3f\xce\x46\xfd\xe3\xa2\x27\xb7\xf3\xe3\xec\xa8\x7f\xc6\x29\x99\x75\x0a\xc6\x07\xd6\x8d\x53\x32\x4c\x7c\xa8\x64\x6d\xd5\x3b\x35\x51\xea\x55\x34\x6e\x5f\xef\xa8\x6c\xd6\x2b\x1a\x7f\x04\xad\x57\x36\x5b\xdd\x14\x10\xe6\x31\x94\xc5\x16\xc6\xce\xfe\xea\xc1\xa9\x85\x01\x97\xff\xc7\x62\xd7\x1c\xca\xff\x3b\xd2\xf7\x9b\xd8\x2b\x74\x89\x3f\x98\xdf\xd7\x15\xc1\xdb\xce\x01\xc2\x8f\xe6\xf9\x5d\x67\xb1\x74\x1d\x87\x1f\x89\x57\xe0\xdf\xc4\xd9\x79\x04\x45\x11\x9b\xf5\x4f\xd5\x7e\xf8\xe4\xe8\xdc\xc1\xd1\x19\x5f\xf5\x0f\xb9\x95\xc3\x36\xee\xee\xbc\x7d\xef\x07\xf1\x56\x44\x07\xd2\x43\x3a\xf8\xba\x9e\x9f\x6d\xf6\x59\x38\x09\xb3\x06\xfc\xbe\xf0\x40\xed\x24\x61\xc3\xde\xf9\x7e\xe5\x3d\x4c\xa4\xfe\x43\x21\x30\xff\xd8\x9d\x76\x85\xae\xa3\xa7\x31\x6c\x21\x86\x9f\x9f\x24\x47\x7e\xab\xa9\x29\x81\xda\x3e\x88\x78\x50\x6d\xc5\xd9\x10\xa3\x69\x85\xa2\xc8\xd9\x8c\x6b\x99\x85\x30\x70\x10\x47\xd8\x68\x3b\x55\xdd\xe7\x69\x40\xb9\x35\x56\x79\xb9\x82\x84\xb1\xae\x53\x14\x4f\xa4\xa6\xc4\xbb\xc9\x42\xdd\x33\xb1\xac\xcc\x2a\x2e\xea\xfc\x22\x77\x99\x0b\x3d\x4f\xc9\x1d\x27\xab\x73\x44\x3a\x75\x03\x30\xdd\xcb\x72\x08\xde\x77\x61\xdd\x98\xc9\x85\xed\xfa\xbd\xde\xc0\x9e\xb3\xd0\x79\x18\x77\x3a\xe6\x88\x89\x10\xa5\xe0\x72\x48\x2c\xe0\xcb\x36\x88\x99\x0a\x41\xfb\x3a\xf5\x90\x02\xce\x70\x14\x64\xaa\x46\xef\x60\xee\xb4\x98\x5b\x86\x4f\x2d\x61\x6f\xcb\xcc\xbd\x0c\x43\xcb\x6a\x2a\xd2\xec\xfa\x67\x18\x7c\x7a\xc0\x2e\x29\xad\xc4\x09\x80\xe8\x9d\xb2\x9e\x10\xd0\xaf\x1a\xd7\xec\x95\xce\x5c\xd6\xda\x44\xb9\x63\xbe\xb9\x35\x2d\x89\xf0\xb0\xab\x72\xce\x9c\xa4\x55\x52\x9b\xb2\x5e\x99\xb5\x54\x12\x30\xf6\x18\x22\x8f\x62\xb7\x6c\x0a\x23\xab\x82\x58\xba\xfd\x36\xc0\xf1\x56\xa9\xb5\xd6\xb2\xfb\x4e\x30\xf7\x8a\x88\x3d\x6b\x0c\x2b\x15\x0a\x84\x25\x9d\x6f\x55\x1d\x11\x0a\x88\xbb\xb2\x57\x70\x6a\x7f\x13\x91\xaf\x67\x87\xb4\x18\xef\x37\xca\x65\xd8\x28\xc0\x59\xe2\x59\xe7\x2d\x1f\x45\xb8\x8c\xd2\x3f\xdc\x9e\xb0\x10\x20\x9c\x87\xbb\xdc\x9c\xd6\x5e\x48\x8f\x72\x10\xcd\xa1\x09\xfc\x5e\x88\xf0\x7c\x89\xb5\xc6\x82\xec\x39\x90\xbd\x1b\x9a\xf0\x2c\x56\x69\xae\x4a\x3a\x3d\xec\xd8\x08\x2e\xfe\xd9\xc5\x3e\x75\x00\x53\x6f\xd8\x7b\xdc\x8a\x03\xf4\xdc\x5b\x52\x5d\x3d\xbc\x71\x1d\x82\x06\xc5\x13\x02\xbc\x50\xe9\xb8\xa7\x28\xab\x79\xca\x00\x7f\x74\xdf\x1f\x1a\x30\x49\x49\xd9\xe9\xfe\xe3\x7e\x08\x6f\x97\xc1\x2e\xc5\xa6\xde\xd4\x3a\x81\x53\xf3\x1f\xee\x1b\x39\xc7\x4f\xb3\xf0\xde\x02\xc7\x1d\x84\x8b\xea\x14\x3a\x26\x2f\x69\xd4\x62\x69\x9f\x21\x98\xe2\xf5\xe5\xdd\x57\x3e\x64\x90\x7b\x11\xeb\x4e\x89\x3d\x87\xfd\x61\x32\x38\x61\xac\x3a\x67\x2b\x26\x4d\x68\x01\xc1\xb1\x06\x10\xf6\x51\x2a\xc3\xe9\x10\x37\x83\xc3\x2f\xa0\x95\xd0\x98\x2e\x5e\x1b\x64\x03\x6b\x9a\xff\xcc\x5d\x2a\xb6\x28\xef\x64\xad\xca\xa5\x35\x3b\xe7\x52\x14\x7d\x9d\xa4\xed\xcd\xe9\xf7\x30\x32\x0a\xa5\xb0\x76\x61\xb3\x04\x73\xef\x4e\xf2\x04\xd8\x1d\xaf\x25\xfc\xd0\xc9\xb5\x1e\xf1\xc8\xd5\xad\x82\x0e\x52\xd4\x03\x1d\x0b\xd9\xd9\x3d\xe4\xd2\x2c\xf1\x2f\xde\xb7\xee\xd1\x9e\xb2\x17\xd1\x1a\x5a\x05\xf0\xe0\x16\x21\x2d\x40\x67\x29\xf9\x63\x29\x9a\x76\x8b\x4c\x5a\x95\xdb\xff\xb6\xb3\x2d\x79\xb5\x0d\x13\xdc\xca\x7a\x4f\x92\xb1\x8c\xc0\x6d\x16\x80\x1e\x88\x07\x09\xcc\x38\xab\x32\x26\x72\x51\x84\x7f\x3a\x6b\xa0\x11\xc1\x1e\xf1\xf9\x7c\x10\x5a\xdc\xb7\xf2\x0e\x0f\x8e\x40\x77\xec\xd3\x64\x15\xf0\xe9\xad\x58\x8d\xa7\xf5\x9c\xcb\x22\x0a\xb4\x0d\xbf\x07\x80\xec\x56\xac\x76\xc8\x41\x6e\x81\xb2\x02\xef\xa0\x51\x0c\x6d\x7c\xf9\x45\xb7\x2d\x97\xc5\x98\x4e\x5a\xdb\x11\x67\xfd\x69\xd1\x4f\x16\x6b\x27\x84\xdc\xdf\x1e\x50\xfb\x10\x64\xca\x2e\x41\x07\x9a\x45\x28\x5b\x10\xfd\xf8\x83\xf0\x85\x3a\x51\x0b\x87\xe9\x29\x1b\x7f\x0e\x99\xc5\x5e\x39\x7f\xbf\xc2\xde\x76\xee\xfd\x3d\x19\xa3\x61\x03\x71\xf6\x93\xd5\xd0\x64\x1f\x53\x51\x76\x17\xb6\xe3\xcf\x97\x30\x91\xd3\xeb\xda\x70\x23\x33\x6a\xff\x63\x0f\x0f\x17\x83\x03\x9b\x00\xf8\x98\x6a\x25\xdf\xfb\x25\x3a\x21\x2e\x06\x6b\xf0\xf6\x29\xfc\x51\xcc\xb5\x7b\xf8\xa7\xd0\xcc\xb3\x52\xda\x58\x5c\xad\xd1\xf9\x41\x64\x6c\xa1\xd4\xed\x3a\x66\x93\x2a\xf4\x10\xd8\x8f\x4a\xdd\xe2\x55\xb5\xdb\xc5\x3f\x16\x1f\x06\xa0\x7d\xb7\x41\x2a\xba\x60\xa7\x6f\xcd\x6e\xef\xcf\x95\xa8\x8b\xd5\xd6\xb5\x39\x28\xe0\x34\x5a\xd2\x82\x97\x79\x81\x17\xe6\x50\xac\xa1\xa3\xd7\x83\x68\xc2\xc9\x41\x7e\xdf\x93\x57\x1f\x44\x76\x42\x51\x26\x13\xe6\x93\x87\x1d\x4c\xa7\xc5\x30\x17\x3d\x8f\xcc\x01\x9c\x9b\x1c\x28\x89\xea\x62\x50\x4c\x00\xb2\x85\xab\xa4\xdd\x4d\x54\xff\x83\xfc\x44\xc6\x54\xde\xc1\x32\x09\xb4\xf5\xc6\x6e\x1e\x72\xa5\x79\xef\x5a\x42\xf7\x8f\x94\x26\x58\xab\x04\x90\xd6\xde\x24\x25\x84\xc2\xfa\xed\xe2\x5f\x60\x80\x8d\x51\xa1\xca\x83\x6f\xbe\x1f\x01\x94\xda\xb1\xb3\x13\x7a\xb3\x41\x48\x3d\xb2\xef\x2d\xe3\xc7\x4b\x2a\x10\xe7\xd1\x24\xd5\xcf\xfe\x54\x24\xf5\x47\x63\xaa\xbf\x09\xf3\xef\x25\xaa\x91\x54\x86\xa8\x91\x47\x92\xcc\x5a\x40\xc3\xf9\x47\x51\xa0\xed\xb9\xf7\x17\xca\x5a\x9c\x02\xc8\x87\x54\x9e\x33\x31\x57\x54\x3a\x22\x80\x86\x82\x38\xf5\x52\x96\x21\x8e\xf0\xb1\x64\xd2\xd1\xe4\x40\xca\xd3\x81\x7b\x60\x01\x7d\x14\xbd\xd9\x9e\xfb\x89\x08\x28\x29\xcd\x7f\x33\x19\x1d\xd6\x9a\xc7\x16\xc9\x20\x59\x57\x4d\x69\xe4\x52\x4c\xd8\x3b\x22\x9c\x54\xe5\xcf\xae\x9d\x33\x86\xc4\xaa\x1b\xa6\x1a\x53\x35\x70\x34\xc1\xcb\x9e\xc8\xed\x2a\x3d\x11\x46\x08\x30\x4d\xc3\x66\x05\xcf\x6e\x67\xea\x03\x7a\xb1\xec\x96\xf4\xfc\x8a\x88\x8a\x52\x4b\xaf\xd3\xe0\x83\x35\x01\x3b\xd7\x45\x3a\x79\x03\xb5\x77\x56\xb8\x96\xc1\xd6\xb0\xc4\x25\x44\xd1\x57\xd4\x5d\x1c\xf6\x6e\x83\x29\x7e\xe0\x45\x31\xe3\xd9\xed\x3b\xf5\x93\xba\xd1\x6f\xcb\x57\xd0\x22\x81\x02\x20\xb6\xdd\x16\xe1\xb9\xb5\x8a\x7c\x24\xe1\x30\x0f\x34\x39\x39\xd1\x8e\xae\x52\x53\xc6\x2b\x6c\x19\x40\xca\x52\x1d\x52\x2a\x83\xc3\xe3\x83\x34\x3a\x7a\x59\x2d\x56\xd1\x7b\x0a\x13\x16\x69\x0a\xd3\x1e\xd8\x10\x54\x77\xa7\x43\x8a\xa8\x57\x37\xf6\x45\x30\xf6\xda\xcf\x75\xcc\x10\x24\x66\xeb\x55\xfe\x82\x97\xae\xf3\xdf\x52\x35\xe0\xa9\x22\x37\x81\x7b\x20\xf4\x8b\xed\xe9\x01\xd8\xd3\xa6\x34\x16\xe0\x1a\x25\x66\x1f\xc9\xb5\xd0\x9f\xb0\xcc\x06\x1c\xff\x28\x42\xcb\x71\x39\xce\xbd\xbe\xaf\xec\x26\xf2\x0a\x5d\x48\x07\x64\x17\x7a\x82\x84\x40\x79\x27\xc2\x9e\xc0\x3d\x4f\xd8\x28\xbb\x4f\x53\x6e\x3d\x0d\x4e\x74\xaa\x7d\xbd\x77\xe9\x49\x8a\x72\x84\xaa\x9c\x7f\x84\xd2\x3b\xa4\x72\xbd\xdf\x6f\x84\x8a\x8d\x29\x85\x8a\xb1\x2b\xa7\x26\x6e\x14\x4c\xe8\x78\x5c\x5a\x02\x80\x12\xf0\xb1\xc8\xef\x25\x37\x8b\x09\x2b\x55\x79\x5a\x2b\x65\x58\xa3\xa9\xb8\xb6\xfd\x0b\x05\x52\xe0\xf3\x23\x07\x4b\xea\xb1\xa5\xb6\x5f\x4a\xb9\x59\x38\x49\xe4\xda\x2f\x06\xe0\xfa\x05\x71\xc3\x78\xbc\x2a\xec\xdb\x7a\x08\xc1\x8d\x1f\xde\x15\xf8\x6f\x25\x55\xa0\x4d\xc9\x8a\x5f\x03\x56\xd4\x6e\x6b\x60\x29\x10\xc4\x0d\xe5\x02\x45\x2e\x6b\x91\x19\x34\x43\x49\xee\xe8\xd9\xd4\xd7\xd1\x20\xce\xb0\x44\x57\x47\x8d\xb4\x87\xe5\x7e\x21\x7a\xe9\x1d\xe4\xde\xfb\x81\xdb\xb2\x5f\xa8\x9b\x9b\x70\x57\xf0\xa8\xd0\xb2\x2c\x46\x2d\xbb\xe3\x1d\x87\x01\x69\xe3\xa2\xbc\x81\xc0\xae\x46\xc3\x91\x7f\x72\xd2\xc8\xfc\xe4\x04\x7d\xbd\xa5\x4b\x2d\x7e\xcc\xdd\x72\x25\xd0\x0d\x82\x5a\x70\x02\x2c\xb9\x5c\xf0\x81\xaa\xac\xa3\x76\x02\x98\x0d\x00\x15\x2f\x1d\xf1\x89\x40\xb7\x09\x3a\x78\xc3\x6b\x80\x3f\x24\x3d\x17\x28\xfd\x6f\x5b\xe1\x7d\xed\x42\xd2\x70\x59\x15\xf6\x42\x0e\x61\xc3\x27\x2f\x8a\x7b\xbe\xd2\x27\x93\xa4\xba\x08\x7d\x2e\x30\xce\xae\x73\xc0\xbf\x9e\xf7\x00\x3c\x79\x5b\xfe\xc0\x65\xd1\xd4\xa2\x05\xcc\x81\x82\x68\x00\x39\xb7\x3b\xa5\x63\x34\xe0\x82\xed\xde\xf9\x5f\x51\x2b\xa0\x07\x50\x7b\x3a\xbc\x80\x93\x37\xe2\x4e\xd4\xd1\x5c\x98\x97\x67\xff\x98\x2c\x01\x1f\xd5\x0c\x14\xbf\x34\x8b\x5a\x08\xe4\x4a\x66\x79\x4a\xc1\x47\xa2\x96\xf3\x55\x32\x4d\x66\x45\x50\x53\xca\xa4\xd5\xf9\xb2\xbc\x29\x3a\x61\x30\xe7\x5f\xee\x24\x76\x2f\x55\x76\x1b\xd7\x7d\xd6\xf4\xa0\xc6\xeb\x1b\xe8\x8d\x33\x2c\x6a\x34\x32\xec\x84\x9e\xc4\x7c\x75\x27\xea\x5a\xe6\x78\xe9\x86\x32\xa3\x27\x27\x14\x92\x4b\x5a\xd0\xcf\xc3\x3e\xcf\x09\x95\x65\xfe\xc5\xd6\xa2\xf5\x92\xc0\xb9\xfa\xcf\xf6\xff\x0f\x71\x44\x04\x19\x10\xc0\x62\x48\x69\x89\xd8\x46\xbb\x17\x7a\xbb\x3d\x2c\x0f\x43\x98\x22\x5e\xd1\x5b\x9a\xcc\x4d\x33\x6b\xf0\xf6\x1d\x56\x01\x73\x5a\x08\x76\x60\x08\xd9\xf4\x84\xc0\x0d\xe8\xbc\x1d\x5b\xde\xd0\x71\x1d\xef\x03\xb3\xc6\x72\x93\xf0\x3d\x32\x2f\x1d\x55\x1c\x27\x03\xa5\xf7\x67\xe8\x38\x5e\xbe\x79\xeb\xf9\x19\xb4\x85\xe3\x86\xa5\xb8\xee\x67\xe4\x94\xb1\x8b\x78\x22\x37\xa4\xc5\x3c\x97\x8c\xe8\x90\xa2\xf3\x07\x70\x79\x60\x56\x52\xc4\xf2\xc3\x6c\xd2\xde\x39\x0f\xb2\x47\x5b\x1b\x67\x13\x83\x31\xcb\xb7\xc5\xe4\x31\x0c\x4e\x27\x8b\xd8\xed\x0a\xb2\x0e\xec\xe0\xae\x00\x0c\xa0\xff\x08\xa2\x60\xaf\xc2\x07\x92\x86\x46\x47\xdc\x77\x6c\xd7\xf6\x80\x0c\x9a\xc3\x05\xc9\xdf\x60\xfc\xe1\xac\xe0\xe5\xed\xa3\xc9\x40\x87\xff\xe3\x14\xf6\xc1\x19\x73\x5f\xde\xf3\x3a\x7f\x71\xf9\x7a\x92\xc6\x5f\xa9\x9a\x5d\x5c\xfe\x02\xcb\x5b\x8a\xa5\x72\x8d\x05\xd0\x4b\x13\x65\x01\x0e\xf1\x09\xe1\xc6\x3d\x2b\x5d\x54\x7a\x7a\xd1\x03\xa0\xd3\xac\x6a\x9e\xe1\x34\x9e\x4f\x3e\xb6\x3f\xfc\x46\x51\x3a\xec\x8e\xd7\x3b\x6c\xde\x18\x25\x0a\xf7\xab\x94\x16\xb0\x4c\xd7\xad\x01\xda\x26\xe0\x5c\xee\x4f\x54\x32\x5b\x35\x37\x68\xcd\xf7\x87\x09\x71\xc3\xc8\x3e\xd9\x37\x62\x28\x27\x3c\x79\x25\xb7\xe2\x96\x53\x75\x47\xe2\x9a\x03\xdf\x61\x58\x08\x6f\x83\x52\xf9\x94\xdb\xd6\x1f\x6e\x77\x60\x16\xd1\xda\x3e\x16\x0e\x2d\x94\x36\x4c\xf6\x36\x65\xdb\x48\x7e\x18\x0b\xf5\x2a\x29\xfc\xd0\xae\x6c\xa7\x58\xba\x41\x22\xbb\x20\xe1\x70\x03\x83\x20\x4c\x3d\x18\x1b\x47\x59\x37\xa4\xae\x22\x0c\x7b\xa3\x23\x89\xe8\x76\x16\x3b\x04\x54\xf0\x9d\xc4\x40\xc7\xc0\x1b\x8c\x88\x7d\x1c\xfe\x58\xd4\x7e\x79\xfd\x72\x27\xfe\x54\x38\x76\xbd\x86\xda\x97\x3b\x76\x82\x48\xd8\x07\x63\x35\xd9\x13\x10\xf6\x12\x4a\x38\xfb\x72\x32\x58\x3f\x7b\x37\xd9\xb7\xb4\xed\x03\x17\xca\xa9\xe2\x9a\x8f\x71\x38\xec\xb9\x29\xec\xf0\x37\x03\xa8\x8f\xdf\x27\x18\xba\xda\xd9\x2b\x47\x64\xad\x9d\x1d\xc2\xbc\xf5\xc4\x5d\xe8\xe1\x9f\x68\xe0\x50\x23\x73\xf2\x0b\xfe\x17\xb6\x30\x19\x64\xed\x2b\x80\x13\x99\xed\x90\x57\x38\x5b\xb9\xde\x27\x3a\xa4\x26\x04\xb8\x33\x2c\x51\x41\x99\x36\xda\x77\x4e\xc7\x83\x8c\x32\xc9\xb6\x88\x1a\x9e\x60\x8a\x62\x48\xa3\x74\x34\xce\x78\x69\x71\xfa\x57\x23\x6a\x7b\x9d\x0d\x83\x60\xbd\x69\xd0\xa5\x0b\x89\xbf\x95\x65\xfe\xd7\x24\xa7\x02\xe3\x8f\x31\x92\x3f\x90\x67\x8a\x15\x92\x28\xb8\x09\xe9\x19\x6e\xd4\x33\xe0\xa5\xe5\x16\xe4\xa0\xb4\xa7\x4e\xa7\x5d\x3f\x25\x00\x25\x3e\xf4\x4d\x3a\x30\xe1\xf7\xca\x2c\xfa\x99\x19\xec\x54\x0d\x4d\xbf\x10\x0a\x5e\xfd\xfb\x79\x01\x54\x1e\x93\x2f\x62\x25\x0f\xe1\xb5\x85\x4e\x96\xd2\x9c\x7a\x61\x3e\x05\xdf\x91\x3e\xe5\x55\x75\x4a\x8e\x24\x0e\xde\x35\x6a\xac\xd6\x2f\x6c\xaf\x4b\x69\xc2\x5e\xed\xaa\x01\x92\x42\x6a\xdf\x63\x67\x8c\x6e\x25\x58\x2e\xa3\x84\x54\x5c\x98\x10\xdd\x79\xa0\x80\xd6\x8b\xda\xab\x28\x41\x97\x17\x45\x8a\x06\xe5\xcd\x93\xe3\x8e\x0a\x00\x44\xd3\xda\x7d\xec\x9a\xc5\x25\x5f\x45\xcc\x4a\x9d\xd0\xda\xc8\xa2\xf0\xa4\xc7\x57\xa4\xe0\x4a\x86\x1a\xc6\x6a\xce\x66\xc2\x45\x9b\xa4\x1e\x48\x90\xfb\x05\xd7\x6d\x37\x20\xd7\xe9\xba\x3b\x0e\xba\xe7\xeb\xf5\x89\xa5\x66\xb8\x6b\x6c\xcd\x5d\x70\x36\x3e\x20\x73\xc1\xe3\xf9\x90\xbc\x05\x8b\x47\x15\x4d\x69\x78\x2d\x8b\x55\xc7\x61\x0b\x7e\x5a\xf2\x4c\x9f\x4d\xc2\x4e\x5f\x69\x23\x96\xae\xdd\xda\x8d\xc2\x32\xe0\x31\x5f\x21\xb7\x14\x37\xbc\x16\xf1\xe4\xe3\xb8\x0d\x84\x38\x2a\xb3\xe7\x5c\x16\x1a\xa2\x7b\x8e\xc3\x71\xb8\x36\x23\x25\xaa\xaa\xcd\x73\xf0\x89\x41\xaa\x04\x65\xbb\xcb\x79\x5b\x36\xf0\xf7\xbd\x85\x23\x9e\xdb\xb7\xc7\x8b\x37\x5e\xb2\xa3\x93\xb5\xf9\x57\x6e\xc8\x9e\x77\x5c\xcd\x9f\x30\xf3\x0e\xa7\x8c\xd7\x72\x6f\x0c\xb3\x76\x53\xd3\x9b\xb9\xd5\xdd\xec\x76\x6a\xe1\x73\x3f\x07\xd9\x44\x2d\xc0\xe6\xe2\x9e\xa9\x2c\x6b\xea\x5a\x94\x99\x70\x19\x7c\x7d\x0c\x75\x06\xec\x11\xf5\x2f\x9d\xec\x13\xb8\xa8\xbd\x28\xe4\xda\x57\x38\x67\x06\x74\x4e\x7c\x36\x6b\xf4\x6a\xa6\x3e\x84\x4c\xac\x08\x5c\xfc\x1c\x7d\x5f\x4b\x83\x9e\x2f\x70\x69\x2a\xf6\x4c\x98\xec\x99\xfd\x58\x1f\xa6\xfd\x69\x2f\x02\xd8\xe1\x2f\x8b\xfa\x6b\x46\x0e\x67\xa3\xe8\xf5\x15\x10\x8c\xf0\x21\x2c\xe1\xc9\x18\x83\x0f\x74\x14\x1f\xb6\x74\x05\x40\xdd\x62\xd4\x3c\x8a\xf6\x4c\xa9\xe9\x53\x82\x43\xf0\x60\xdf\x3c\x51\x79\x07\x78\x9e\x45\xbb\x31\xfa\x12\x42\x8a\x64\x49\x6a\x5e\x1a\x9d\xf8\x4e\x17\xea\xde\xee\xfa\x09\x0e\xc6\x9a\x0a\xb9\xbc\x93\x79\xc3\x0b\xf7\xd2\xdb\x6d\xce\x99\x14\x94\x89\x9e\x7f\xd9\x0f\x60\xd6\x42\x70\x08\xd7\x18\x88\xba\xa6\x13\xe8\xb6\xcf\x76\x64\xe5\x0f\x8a\x63\x88\xa0\x99\xb0\x10\x2f\xb1\xab\x58\x46\x0f\x1b\x18\x61\x10\x89\x64\x55\x43\xd2\x74\x12\x08\x00\xbc\xde\x56\x06\xa3\x12\x19\x98\xc2\x90\x63\x50\x57\x6e\xff\x53\xd4\x75\x70\x03\x3b\x6b\x0c\x4c\x31\x1f\xd6\x1a\x42\xc7\xaa\xf8\x65\x37\x2a\xb7\x52\x79\x41\x3c\x34\xb9\x51\x83\xd9\x09\x26\x94\xe7\x75\x00\x6a\x93\x6d\x04\x5a\x18\x8e\x0b\xe7\xc6\x89\x79\x60\xd7\x58\x29\x4a\x6d\x35\x8a\x66\x3f\x80\x02\x88\xec\x28\x6b\x3d\x09\xdf\xca\xd6\xff\xb9\x6a\xf5\xfa\x70\x3b\x35\xe4\xba\x1d\x93\xcc\x11\x22\xb8\xc3\x1e\x8c\xe2\xa0\xbf\x78\xd9\xc5\xe0\x28\x54\xf7\x61\x0a\x30\x2d\x04\x28\x24\x37\x97\x69\xaa\x79\xa2\xf0\xf6\x0e\xb0\xd0\xbf\x78\x70\x09\x87\xe6\x98\x0f\x47\xaa\x05\xa7\xf0\x0a\x88\x3c\x02\x55\x8c\x36\xf8\x0e\x7c\x0b\xc0\x02\x07\x7b\x82\xb7\xac\xae\xc6\x13\x13\xfa\x29\xd1\xb4\x64\xf9\x1f\xf6\xb8\x84\xa2\x40\xd2\xac\x30\x62\xf4\x03\x3e\x70\xc0\x2f\x57\x82\xe7\x76\x96\x2b\xa5\xcc\x0f\xb2\x10\xd7\x6e\xd1\xbe\x0e\x96\xa9\x29\x71\xd4\x57\x83\x61\xfe\x7c\xf7\xe8\xc3\x51\x86\x61\xc8\x78\x25\xb5\xeb\x99\xd0\xef\xaa\xa2\x8e\xa8\xf1\x61\xd9\x5e\x30\x66\xb6\x5a\x2b\x0f\x3a\x3e\x61\xcc\xce\xa8\x06\xd5\xeb\x2b\x35\xf9\x0e\xb0\xf1\x15\xc9\xb1\xfc\x14\xb8\x84\xd9\xf7\x87\x96\xad\x25\x2f\xf9\x8d\xc8\x99\x30\x19\x18\x0c\x1b\x0d\xaf\x9f\x71\xc0\x2b\x93\xfd\x08\xf6\x40\x5c\x06\xc3\xb5\x0c\x76\x40\x83\xd9\x80\x97\x08\x4b\xf9\xc3\x8a\x4c\x9b\x5c\x8b\xa8\x0b\x38\x49\xc6\x9c\x17\x5a\x4c\x60\xbf\x53\xc8\x6e\xe2\x99\x5c\x6b\xe7\x58\x54\x98\x2b\x06\x36\x8d\xeb\xc8\xf8\x8a\x3f\x3e\x0d\xa5\x67\x6a\x14\xca\xf3\x20\x97\x6d\x1c\xff\x0a\xc8\x45\xea\xa4\x45\x31\x35\x4f\x10\x25\xb2\x52\x1d\x24\xef\x55\x7b\xbe\x71\x02\x8a\xa5\xa1\x00\x0b\xb7\xcb\x69\xe1\x9d\x45\x3b\x13\x01\x17\xfd\xae\x87\x2e\x51\x5f\x43\x0c\xab\x1d\xc0\xec\xcb\x35\x98\x59\xe2\xb0\x49\x2f\x68\xaf\x78\x66\x62\x10\xf4\x98\x9e\xf0\x6e\xbb\x65\xed\xcc\x88\xae\x51\x5a\xc6\x76\xe7\x76\xce\x6a\x92\xfa\xf7\xc2\x64\xef\x61\x21\xed\xcd\x06\x90\xe2\xe7\x83\xb8\xbe\xc3\xe0\x7e\xfb\x09\x46\xad\x1d\xbb\x61\xbb\x7c\x46\xf2\x8a\x90\xd4\xec\x9f\x22\xa3\xae\x5f\x37\xc2\x30\x69\xfe\xe2\xf3\xaa\xe8\x4f\x03\xe5\x43\xed\xcf\xe0\xf0\xf7\x75\xef\x78\x4e\x40\xa3\x38\x6a\xf7\x85\xaa\xe5\x8d\x2c\x79\x81\x5f\x24\x2d\x94\xe0\x2f\x1e\xa4\x43\x82\x8a\xd2\x0c\x23\xf1\xdf\x66\x03\x06\x24\x83\x31\x16\xae\xa2\x00\x21\x11\x4a\x23\xe0\xa8\x78\x7e\xac\x50\xd3\x9a\xbe\x15\x75\xbb\x25\x0d\x5c\xc1\x1c\x9a\x3d\xa9\x99\x4a\xba\x03\xc7\x62\xa2\x20\x9f\x89\x02\x6f\x88\x50\x4e\x09\x7e\xd2\x09\x77\xe0\xef\x6b\xd8\x13\x7e\xc7\xde\x7d\x58\xd9\x09\x84\x27\x2d\xe9\x44\x73\xa1\x58\xdd\x49\xee\x6c\xdd\xcc\x57\x53\xf8\x8b\xd7\x91\xf4\x53\x7f\xab\x65\xfc\x33\x7d\xe2\x0b\x40\xc5\xe0\xc9\xdd\x8f\x48\x20\xd4\x81\x65\x04\x78\x84\xfd\x3f\x1b\x2a\xaa\x54\x8b\x25\x97\xe0\x4a\x26\x90\xf1\x52\xec\x5f\xfe\x42\xc1\x54\x03\x98\x4e\xd9\xdf\x84\x89\xbe\x0e\x2c\xa6\x99\xac\x96\x99\xab\xa6\xcc\x29\x9f\xe0\xb3\xf6\xf9\xfa\xcd\x86\xc4\x3e\x40\xab\xe7\x8d\xea\xd5\x9d\xa4\xe4\xc9\x77\xaa\x20\xcb\x82\xc2\x02\x06\xb7\xfc\x1b\xf5\x0a\xef\x61\xef\xb8\x2c\xe9\xa4\xad\xd9\xcf\xae\x74\x1a\xd4\x27\xfb\xed\x5a\xd4\x92\x17\xbf\x33\x61\x27\xd0\xf8\x0a\xe5\x0f\xa1\xa5\x2c\xc3\x74\xd7\x20\x69\x9a\xfd\xf6\x52\xea\xba\xa9\x8c\xbc\xdb\x1c\x46\x6c\xcd\x74\xa8\xb5\x76\x4a\xcf\x5b\xa2\xe4\xb5\x54\x64\x58\xb7\x41\x4f\xdc\x95\x30\xbc\xe3\x00\x5a\xe4\x88\xe2\x9a\x55\x94\x4c\x1f\x86\x62\xff\x7b\xa0\xc4\xa8\x2e\x82\x96\xca\x56\x31\x77\xf5\x2a\x50\x69\x92\x50\x1b\x0c\x3b\x8e\x55\xbd\x96\xea\x8e\x17\x5b\xd2\xfa\x1a\x3a\xd7\x03\x48\x4f\x68\xdf\xff\x19\x01\x67\x96\x72\x74\xab\x11\x6e\xda\x2d\x48\x9c\x1c\x88\x2d\xb2\xd8\xcb\xba\x7b\x6a\xcc\xd1\x91\x08\x93\x52\xeb\x53\x7f\xee\xba\x38\x2d\x22\x36\x93\xa8\x94\x10\x41\x70\x97\x2c\xd5\x5d\x94\x96\xdb\x22\xbe\x28\xf3\xae\x21\xb9\x1d\xed\x2f\x55\xfe\x4e\x2c\xab\x82\x1b\xe1\x6e\xeb\xe0\xde\x72\x5a\x64\x90\xee\xd1\x40\x6f\x3c\xf6\x8c\x07\x2d\x6a\x2d\x79\xff\xed\x86\xd2\x38\xae\x42\x9c\x25\x6d\x98\x20\x4a\x31\xa6\x84\x0e\x2c\x3a\xe3\x5f\x30\xef\x17\x32\x2e\x4f\x36\x13\xa4\x0d\xe0\xbe\x04\x05\xc7\xa8\x37\xe7\x10\x78\x57\x91\xc6\xab\xb0\x37\x6f\xdf\x61\x21\xc0\xa6\x0a\x71\xcf\x08\x09\x0b\xe0\xe8\x16\x0e\xdb\x96\xaf\xa9\x54\xee\xa9\xb2\x86\x2d\x23\x0a\x14\xf5\xf1\x02\x6b\x14\xb5\xca\xd9\x25\x1f\x6e\x5f\xa3\x28\x1a\xde\x57\xa5\x28\xf9\xb9\x53\xa7\x28\x5e\xd2\xf8\x4a\x45\x09\xc6\xe3\x6b\x15\xc5\x93\x8d\xac\x56\x04\x10\xdf\xb5\xc6\xb6\xea\x15\x1d\x98\xc5\x7a\xc2\xfe\xfe\xf6\x7a\x1d\x5b\x35\x74\x2d\x2e\x73\xa4\xae\x66\xd7\xc2\xd8\x21\xec\xa2\xe0\x3a\x0d\x78\x80\x0c\xae\xcb\xf4\x10\x71\x6e\x65\x5f\x19\x31\x14\x60\x06\x5b\x03\x62\xdb\xe6\xaa\x76\x91\x7c\x90\xa6\x57\x35\x5b\xdf\xde\x5c\x40\x60\x2b\xae\x31\x4c\x82\x9e\x1b\x7a\x78\xf4\x9b\x14\x6e\x4a\x7f\x7f\x7b\x4d\x8b\xc1\xbb\xd6\xa5\xca\xff\xfe\xf6\xfa\x6f\x0d\xaf\x79\x69\xc4\xa8\xf0\x7f\x47\xea\x01\x12\xbf\xc8\xac\x3a\x7f\x29\x78\x5e\xc8\x52\xd0\x89\xb7\x9e\xe8\x44\x58\x5e\x14\xea\x1e\x8a\x27\x74\xc6\x93\x6f\xcf\x89\xd0\xa1\x4a\xce\x35\xa5\xfc\x57\x43\xe6\xd7\x94\xfd\xbd\x11\xf5\x2a\x29\x18\xea\xf3\x8c\x0a\xbf\x09\xa0\x5d\x3c\xed\x83\x3e\xc3\xc9\x9d\x53\x51\x8b\x3c\x80\x32\x44\x16\xe6\x84\xc9\xcd\xa9\x2b\x91\x45\xae\x37\xef\x26\x73\x26\x74\x78\xa9\xc0\x43\xa9\xe0\x95\x16\xdb\x5e\xbe\x86\xd9\x37\x4a\xfd\x25\x7b\xa1\x99\x2d\xa5\x71\xba\xdc\x1d\xa1\xdb\xfa\x28\x5e\x38\xa2\xb5\xce\x9d\x94\x43\x49\x8b\xe7\x50\x56\x11\xce\x0a\x0a\xf8\xa1\x14\x47\x2a\x64\xdd\x3e\xb7\x9a\x4a\x95\xbe\xd6\x9d\x2b\x2e\x0b\x45\x30\x27\x54\x82\x93\x6c\x02\xc2\x86\x22\x32\xa6\x3e\x6b\x03\x5c\x64\xa4\x9e\x26\xc0\x6c\x7b\xdc\xc2\x1f\x9c\x9d\xa0\x0d\x5f\x42\xd1\x0b\x35\xc3\x16\x25\x28\x14\xf7\xbe\xa2\x27\x19\xd1\x5e\x55\x7b\x08\x82\x02\x73\x9c\x28\x7a\xf1\xf3\x97\xc3\x4e\xe4\x92\xa7\x48\x04\x13\x6b\x48\xd8\xb3\xf3\x60\x52\xd1\xb8\xce\x96\xa3\x44\x62\x70\x9b\x3e\x8d\x2d\x1a\x5d\xad\xa9\x80\x49\xd4\xfa\x1f\x6b\x77\xd2\x5e\x83\xb3\x0f\x99\xbf\x66\xe6\x52\xdc\xbb\xc2\xa0\xf4\x33\x4a\x5d\xcf\xdc\x87\xe2\x47\x28\xab\xbd\x4d\x71\xcf\x98\x4d\xe4\xcf\x1a\x88\xad\x8e\xba\x37\xec\x16\xf6\x9a\xd4\x8e\xa6\x62\xe3\x58\x88\x16\x02\x9c\x4a\x6c\xe6\xf2\xe7\x2f\xbf\xf9\x7a\xca\x5e\x84\x16\x0c\xbc\x28\xe0\xa9\x5d\xc5\xe5\xa3\x23\xad\xe0\x08\xbc\x16\xea\xb7\xdf\x7c\xfd\x27\x6a\x9b\x60\xff\x8c\x7f\x3b\xfb\xf6\x0c\xb2\x25\x39\xe5\x41\xde\xb7\x15\x4e\x5a\xc5\x3e\xd4\xee\x49\x1f\x41\xec\x5f\x02\x7a\x31\xf5\x30\xa6\x33\x44\xa7\x7b\x6f\x13\x39\x06\xa5\x76\xb3\xa2\x3e\xb0\xff\x20\x53\x2f\x9d\x62\x18\xa6\x6e\xb2\x85\x95\xee\x1f\xde\xbe\xbd\x7e\x75\xf5\x8f\xd7\x17\xaf\xde\xbb\xff\xfd\xf1\xed\xf5\xbb\x49\xdf\x0f\x97\x6f\xaf\xd2\x1f\xe0\x0f\x58\xbf\x20\xfd\xe3\x7b\x4b\xb7\xf7\xef\x2e\x2e\xfb\xc7\x44\x3f\x5f\xbd\x7d\xf7\x76\xf8\x77\xef\x5d\x19\x04\xf0\xe2\xe5\xcb\xab\x50\x91\xbd\x52\x55\x53\x04\x9d\x8f\xb5\x9c\xa8\xb0\xeb\xc1\x36\xcc\x96\x77\xad\x11\x77\xac\xd1\x57\x2b\xf8\x76\x8b\x1b\x95\xbf\x4d\xb5\xef\x41\xc9\x8d\xca\x41\x5d\x77\x91\xea\xb9\x44\xa1\x3f\x69\xdf\x8b\xd4\x00\x91\xb1\x45\x0a\xc5\x50\xac\x89\x0d\x8f\x09\x7c\x23\x0c\xe3\x3e\xd7\x60\x9f\x13\xa3\x63\xf5\x3a\x67\x55\x52\xb1\x25\xaa\x8d\xa1\xb1\xa0\xb3\x44\x42\x87\xe0\xf3\x83\x09\x9d\x6b\xc0\xab\xbb\x57\x43\x9e\x94\x70\xbf\x54\x39\x36\xfa\x1d\x45\xb2\xb8\x1e\x6e\xdf\x9d\x53\xbb\x08\x26\x0f\x73\x93\xb6\x1e\xb2\xbe\x92\x3b\x5c\x24\xa1\xbe\x92\xd2\x6b\x93\xfc\x21\x48\xac\x6f\xb2\x1b\x8e\x43\xb7\x58\x30\x77\xb8\x71\x6d\xa6\xc1\xec\xf2\xc1\xc7\xa2\x2a\x78\xe6\xc6\xa5\x4b\x90\x66\xfd\xe4\x38\x31\x9a\x62\x01\x40\xa7\x75\xef\xd9\xae\xdc\xb4\xa6\xad\x09\xc9\x96\x18\xfb\x01\xfa\xc0\x1e\x45\xf7\x62\xa6\x55\x76\xbb\x26\x6c\x3e\x66\xa1\x7b\xc0\x1c\x09\x93\x78\xb8\xa7\x4d\x3d\x65\xbf\x3a\x80\x49\x11\x39\xe5\x1a\x37\x0b\xac\xf9\xe8\xb0\x89\x62\xab\xc2\x19\x56\xd9\x8d\xe6\xea\x16\xb9\x71\x39\x3e\xf9\x05\xf0\xed\x82\x46\xbe\x4e\x83\x9d\x20\x49\x58\xc6\x49\xb6\x7d\x9f\x5d\x73\x7f\x51\x37\x94\xb5\x99\x50\x6f\x1b\x96\xf8\x26\xd6\x01\x56\x9a\xba\x69\x99\x83\xa2\xee\xa7\x78\x08\xe6\x40\x60\xd5\xbc\x53\x22\x63\x5f\xde\xc4\x85\x9a\x0e\xcd\x0d\x5f\xaa\x71\x5d\x85\xc8\xcb\x5a\x5c\xdb\x8f\x9c\x65\xca\x8b\xc2\x0f\x84\x3d\x7d\x2b\x8b\xc2\x55\x72\xcd\xb7\xb5\x3c\xa3\xaa\x34\x16\x66\xe8\x9c\x70\xf2\x0c\x22\x18\x4e\xd0\x12\x21\xb7\x18\x85\xbe\x5c\x89\x4c\xc8\x3b\x52\x68\x90\x20\x34\xed\xbd\x9d\xb4\x0a\x47\xba\xf6\x22\x51\xcf\xac\x67\x2e\x6e\x92\x66\x55\xe1\xde\x17\x8c\xd8\x29\xfb\x87\x2b\xb2\x11\x65\xb2\x90\x39\xe4\x66\x50\xea\x36\xbe\x92\x46\x6f\x3a\xfe\x76\xea\xaf\x24\xc9\xa8\x29\xfb\x3e\xd4\x99\x4c\xdb\xed\x4c\xba\xa5\x2f\xe3\x97\x3c\xb2\xc7\xef\xa9\x58\xd4\x5c\xde\x34\xb5\x18\xc0\xb6\x65\x8b\x70\xe4\xa3\x51\x6d\x19\x00\x7b\x1e\x52\x90\x24\x5a\x25\xfe\x00\xc0\xd0\x3b\x38\xbe\x6b\xa2\xbf\x73\x8c\x44\xa4\x1a\xeb\xa0\xaa\xc5\x7b\x3b\x6d\xdf\x23\x53\x21\xef\x44\x29\xb4\xb6\xb6\xe6\x4c\x4c\xc8\x5d\x00\xc5\x33\x43\x37\x91\x39\x56\x6b\x59\x23\xb5\x6a\x96\x84\x9e\x38\xf9\xfd\x3f\xa5\x32\xff\xa7\x55\x26\x06\xa5\xe5\xd9\x42\xf0\xc2\x2c\xfe\x17\xdd\x71\x76\xba\x14\x93\x03\x79\x4d\x5a\x40\x55\x99\x2e\x8d\x9d\x3c\x3b\x99\xb2\x9f\xe8\x23\x0a\xa4\xa4\x0f\x41\x8d\x44\x9d\xae\xa0\x81\xa5\xc1\x5e\x00\x78\x5c\xb7\x80\xfb\x90\x1c\x17\x90\x5f\x7a\x81\x4c\x8a\xc5\x38\x83\x6c\x69\xef\x9c\xff\x2b\x6a\xb5\x7d\xdb\x05\xa4\xf2\x7b\x98\x77\x3c\x57\x0b\x95\x51\xb8\xc2\x84\x95\xca\x21\x75\x48\xae\xc2\x99\xf9\x59\xc6\x29\x0a\xd9\x2c\x2b\xe2\xf3\x67\xfb\xb2\x77\x04\x73\x61\x0b\x36\x5a\x68\x76\x22\xa0\x3e\x72\x14\x1b\x1d\x50\x12\x1e\x27\xaa\x24\xf8\x53\x0a\xc5\x07\xa6\xf8\x0e\x14\xe0\x0b\xa3\x21\xce\x70\x0b\xb4\x63\xc4\x54\x67\x90\x22\x5b\xcf\x1e\x8a\xa7\x26\xab\x18\x1e\x66\xc7\xe2\xa9\xc9\xaa\xef\xbe\x3d\xfb\xf6\x8c\x9e\xdf\x1f\x64\x93\x86\x55\x91\xb7\xc2\xde\xf6\xb0\xc6\x31\xaa\x66\x97\xf0\xe4\x1d\x1a\xb8\x41\xe9\x96\x83\x7b\xbc\xae\x55\xad\xa9\x1a\xfb\xf9\x19\x45\x4d\xe8\x89\x2f\x0b\x44\x13\xd0\x40\xcb\x36\x84\x5a\x89\x72\x3f\xa9\x48\x24\x82\xf6\x7f\xbf\x54\x9c\x7f\x7b\x24\xb1\x68\x29\xf0\x9d\xc5\x62\x9d\xea\x86\x49\x1e\x52\x2a\x52\xd5\xed\xd0\x08\xcd\x3e\x62\x01\x71\xa7\xa5\x47\x36\x96\x0f\x1e\x49\x48\x47\x40\x28\xf2\x2b\xb6\x25\x20\x2b\x91\x4a\x84\x41\xd4\x18\x69\x70\xdd\x14\x86\xc9\xe8\x20\x40\xa9\xa0\xe3\x32\x3c\x80\x90\xf4\xdc\x3b\x5b\xc2\x1a\x71\xfe\x91\xc0\x51\x57\x96\x59\x2d\x96\x02\x73\x1e\x52\x49\x32\x8a\x9d\x3f\xc6\x21\x71\x50\xb1\xf1\x67\x43\x72\x2e\x1c\x42\x7e\xba\xd6\xe8\xe0\xc9\x10\xd5\x8e\x77\x82\xb2\xfe\x74\x78\x87\xed\x67\x68\x79\x68\xd5\xa1\x0f\x03\x62\x0d\x93\x11\x2d\x49\xa2\xf2\xcc\xb5\xbc\xb9\x11\x35\x90\xb6\x85\x95\x22\x63\xa2\x47\x4c\x36\x8b\x48\x8f\x5d\xf1\x90\x62\xd2\x52\x30\xbe\x39\x23\x61\xa4\xd9\xe7\xba\x50\xf7\x5f\x6c\x2f\x3a\x98\x96\xa4\x4a\x65\x54\x29\xad\xdd\xbc\xc2\x65\x73\x1d\xed\x8b\xe8\xdc\xfd\xa4\x6c\x8e\xa1\x6c\x00\x5a\x8b\x28\xcb\x86\x9a\x4d\x62\xf4\xfa\x8d\x3d\xd1\x70\x3d\x0e\x80\x72\xfd\x4c\x13\xe2\xcc\x55\x1d\x28\x23\x4a\x4b\xd0\x3c\x7a\xe5\x25\x41\xb6\xb4\x82\xfa\x2f\xeb\xa8\x15\x7a\x8f\xda\xf9\xa6\xbe\x06\x27\x16\x61\xc4\xa5\xfb\xa5\x51\x7c\x95\xa8\x57\xf0\x3a\x4c\x9b\x34\x50\x4d\x4f\xd8\x52\x70\x48\x9a\x6c\x2a\xa3\xd8\x9f\xdc\x3a\x0e\xbf\x87\x6a\xc1\x73\x19\x6f\x22\x10\x3a\x59\x4a\x23\x79\x61\xb5\x0a\x1f\x6e\x8d\xd6\xdd\x29\x3e\xac\x3f\x02\x19\xe7\x9b\x62\x7b\xe8\x7c\x45\xf1\x48\x70\xdf\x4d\xe6\xc2\x1a\xbe\x90\x05\xec\x58\xb7\x97\xce\xc5\x9e\x08\x3a\xba\x17\x3b\xa5\x9f\x4e\x1b\x3d\xef\x7b\xf4\xc3\xa5\x6b\xca\x2e\x80\x37\xbe\x42\x08\x76\xa9\xb1\xbc\xb3\x3a\x5a\x2d\x2b\xe8\x01\x8e\xbe\x84\x04\x70\x2a\xfc\x2e\x0c\x0b\x68\x80\x81\xa5\x51\x4b\x9e\xa8\x95\x45\x0c\xe1\xf8\x2c\xdf\xfe\x12\xdd\xcb\x67\xa0\x35\x26\x53\x3b\x96\x0b\xe7\x83\xf3\x8b\x3e\x30\x7f\xbd\xcf\x68\x10\x95\x4c\x95\x1a\x1e\x1f\x4d\x54\x5d\x98\x6a\xb7\xa6\xfa\x76\xd2\xf3\x9c\x18\x95\x62\xe5\xf9\x6a\x12\xfd\xdb\x15\xe0\x08\xca\x2b\x52\xfd\xee\x85\xe8\xf0\x77\x68\x2a\xcf\x8b\xe1\x41\x2f\x2e\x5f\x0f\x32\x2d\xf9\xb0\xed\x3e\x8d\x7f\x14\x00\x27\xa4\x08\x8d\x79\x8a\x38\xc1\xc7\x51\x95\x8b\xe9\xed\xb7\x7a\x2a\x15\x80\xb8\xa9\x55\x53\x45\x3d\x5d\xdd\x6b\xed\x33\x5e\x49\xcd\x72\xa9\x33\x65\x75\x1e\xcb\x55\xd6\xb8\x66\x9a\xac\x0d\xe9\xd9\xdd\x79\x00\xf6\xec\x4e\xd4\xda\x77\xfb\xef\x02\x7d\xb6\x8c\x50\xf0\x13\x60\xd8\xb4\x9b\x04\x26\xa0\xda\x3d\x19\x2d\xd8\x07\x7f\x0d\xc1\x6d\x21\xb4\x0b\x68\x08\x93\x4b\x72\xa0\xc4\x84\xdd\x40\xee\xad\xd4\x66\xe2\x02\x5a\x30\x0c\x03\x2d\xb2\x0a\xff\x84\xb6\x1c\x66\x33\xe0\x7f\x87\x77\xcd\x4e\xd9\xe8\x4d\x4f\x25\x31\x7a\xdd\x86\xd6\x59\x2d\x8c\xc6\x2c\xbc\xf1\x7d\x60\x69\x58\x7f\xf3\xd1\xd0\xb8\x5a\x96\xfb\x15\xe5\x8a\x33\x92\x6a\x61\xfa\x7c\xbb\xc1\xfe\x85\x1d\x9f\xdb\x65\xd6\x42\xa7\x7d\x4a\x93\xf7\x79\x7a\x20\xab\xc5\x5c\x50\x79\x00\xf4\x5c\xda\x19\x62\x7f\xbe\xf8\x60\x6a\x9e\x19\xc6\xa1\x97\x67\xe8\x28\x1b\x7d\x1e\xe2\x8d\xd2\xc8\x83\xde\xfa\x52\xe8\xbe\x76\x4f\x9a\xf1\xf3\x79\xa8\x6f\x24\x56\x71\x7a\x5e\x98\x64\x0b\xed\x81\x83\xb6\x60\xb4\x5d\x12\x0a\xec\x6e\xec\x3e\x78\xaf\xd9\x83\x32\x1b\x6f\x04\x27\xaf\xca\xbb\x1f\x6a\xb5\x3c\xd9\x89\xf9\x04\xb1\x4f\x00\xf6\x61\x7e\x0c\x36\x08\xc0\x51\x99\x3f\xb2\xe3\x6d\x8b\xdf\xad\x7e\xb7\x44\x2d\xaa\x81\xef\x1a\x98\xc3\xdf\x1c\xb1\xb6\x0f\xa2\xc6\x29\x47\xb5\xbd\xed\x6f\x79\xbb\xa1\x76\xfe\x5a\xca\xf8\x67\xf0\xb1\x14\xa1\xa4\x2a\xb7\xec\x4d\xb7\x3a\x9a\x25\x7e\x45\xfc\x49\x6a\xe3\x22\xba\x1d\xf0\x38\x18\xc2\xd3\xc0\xc5\x07\x32\xf6\x37\x7b\xe5\xc1\x67\x23\xf7\x6a\x0f\x25\x76\x5c\x70\x38\x05\xc3\x21\xb4\x09\xf9\x01\xa0\x66\x1e\x9e\x71\xff\x6a\x78\x91\x06\xc2\xe9\x70\xfe\x06\x14\xdb\x6d\xca\x29\xb8\x00\x63\xec\x3c\xae\xd6\xdc\xa5\x88\x95\xb9\x2c\xed\x55\x78\x42\x41\x0e\x74\x11\xf3\x41\x2e\xb2\xcc\x8a\x86\x2a\x20\xbb\x00\xc9\x62\xe5\x37\xdb\x75\xaf\x9c\x6f\x72\x3e\x0e\xb3\x13\x73\xac\x2f\x30\xc7\x7a\x62\xcf\xe6\x17\xfa\x17\x2d\xea\xbf\x7e\xfd\xa7\x3f\x7d\xf9\xd5\x3a\x06\x27\x23\x29\xe8\xc1\x25\x2e\x77\x6a\x9b\x78\xb8\x18\x1b\x9c\x66\x17\xb4\xbe\x6d\x64\xce\x60\xf6\xbd\xd2\x83\x4f\x2e\xe2\xa2\x39\x89\x87\xc0\x23\xc3\x14\x7c\x6c\x79\x57\x71\x0d\xaa\x2f\x4c\xee\x6a\x57\x35\x25\xe3\x9a\x35\x65\x55\xcb\x3b\x59\x88\xfc\x46\x40\x19\xe7\x3a\x8d\xdb\x95\x25\xbb\xc6\x80\x0d\x91\xb3\x6a\x01\xe9\x69\x69\x63\x0c\x97\xa2\xea\x1e\x0b\x29\x4d\x95\xeb\xc1\x4c\xd5\x4e\x62\xb8\xb7\xa1\x35\xd4\xd8\x7c\xc6\xfe\xf6\xfa\xe5\xd6\x6d\x31\x5c\x62\xfd\x7b\x4a\xac\xdf\x2c\x14\xb4\xf2\x1b\x91\x63\x06\xf1\x74\x77\xb1\xa8\xc2\x03\xb0\x83\x99\x38\xd7\x3b\x12\x11\x93\xfe\xc6\x3d\xda\x62\x1e\xf3\x7e\xd2\xe1\x34\x69\xb7\xa7\x4b\x99\xce\x68\x2d\x66\x2b\x21\x5a\x18\x0a\xbc\xcc\x4f\x4e\xb4\x5f\x2a\xad\x14\x4d\x9b\x30\x8a\x24\x8b\x6b\x44\x76\x07\x61\x41\xd3\x26\xcd\x69\xee\x11\x16\x09\x62\x61\x0f\x75\xf8\xe5\x94\x6e\xc5\x3e\xde\xe5\x01\xe4\xa3\x6e\x15\x64\xc0\xf2\x08\x87\x93\x95\x7e\xf8\x23\x34\xc9\x7d\x2d\xb1\xc2\x73\xad\x94\x99\x53\x9d\xb9\x75\xd8\xee\x14\x90\x94\x2a\x9a\xe0\x37\x21\x79\x5a\xb3\x04\x5f\x91\x00\x0f\x96\x5f\xd3\xd2\x13\x21\x27\xa0\x28\xd4\x3d\xf9\xfd\x06\xc5\x08\x23\x3c\x8e\xce\x6b\x10\xc8\x2b\xab\x40\xff\x06\x97\x57\x6e\xe2\x86\x9b\xe2\x4e\x0c\x27\x59\x76\x18\xde\xba\x63\x87\x02\x2c\xad\xbd\x35\xbd\x4a\x4e\x8f\x17\x71\x1f\xb0\xfe\x6f\x11\xb7\x44\x41\xec\x7f\x58\x50\x19\x51\x07\xbd\x73\x76\x60\x8e\x86\xcc\xd9\xf9\xd9\xd9\x39\xa6\x90\xcb\x9c\x3d\x3f\x3b\x7b\x1e\x51\x89\x88\xb4\x9d\x3e\x20\xb3\xa3\x5b\xe3\x60\xf7\xc3\x03\x1f\x49\x7a\x0f\x90\xe7\xe7\x03\xc1\x27\x07\x91\x16\xbb\xab\xf7\x93\x93\x4a\xe5\xd3\xeb\x4a\x64\x23\xc4\x64\xfd\xa7\x4f\x50\x4a\x3c\x75\xfe\x4d\x04\x04\x54\x9b\x3f\x36\x5f\xe9\x8c\x17\xa0\xfb\xb6\x3e\x3c\xee\x93\xc3\xa3\x5d\x09\xe6\xc5\xc0\x34\xf1\x19\x62\x49\x81\xb9\x7a\xfe\xf0\x67\xc2\x7f\x39\xda\xf0\x18\xe3\x0c\xbc\xa0\x43\xc2\x85\x87\x0d\x51\x21\xaa\x58\xe3\xb9\x05\xdf\x86\x24\xab\x3e\x54\xfd\x09\x32\x65\x2f\xd2\xda\x91\x1d\xaf\xfe\x5a\xf2\xfb\x94\x07\xce\x6e\xe0\x32\x65\xc5\xf6\xf3\xf3\xb3\xb3\xb3\x2f\xc8\x31\x40\xe5\xfb\xce\x86\xba\xd0\xd5\x4d\x39\x49\x1a\x69\x60\x58\x06\x96\xb5\x1b\x8c\xa6\xa5\xdf\xb1\xa0\x77\xea\x47\xaf\x39\x1d\xa8\x1e\x21\x34\xa7\xa7\x62\x6a\xff\xf1\x57\x8b\xdc\x90\xe1\x3d\xa2\x36\x8c\xa3\x32\x15\xfc\x18\xb6\xba\x27\x4c\xd5\xbd\xc4\x3f\xb8\xb9\xf5\xaa\x2f\x93\x69\x62\x89\xc5\x4b\xbd\x2e\xdf\xe3\x1f\xce\x99\xf2\xca\x7d\x9a\x66\xa4\x66\x6a\x59\x29\x8d\x05\x23\xc9\xe9\x28\x4b\xa3\xec\x75\x17\x9f\xdb\x76\x2d\x52\xdf\x75\x44\xf5\x57\xa0\xef\x5f\x1a\xcb\xc5\x5c\x96\x49\xc6\x63\x55\x8b\x3b\xa9\x1a\x5d\xac\xdc\x8f\x03\xf9\x5d\xae\x22\x3e\x45\x8a\xed\x93\x73\xe3\xe9\x3b\x92\x1f\xbe\xcf\x0e\xf5\xd8\x39\x00\x83\x74\x33\xd3\x46\x9a\x06\x34\x1a\x2e\x02\x2b\xe7\x75\x36\x14\xf4\x0a\x3a\x12\x9b\x5a\x6d\x57\xdb\xeb\xd4\x69\x66\xea\x32\xea\xe8\xda\xfd\x36\xca\x60\x5d\xcf\xc9\xe0\x12\x79\x5c\x6e\x3e\x24\x13\xdd\x9c\x0f\xcb\xc7\xd0\xea\x7f\x88\x7b\x63\x79\xd6\xe2\x97\x7b\x0c\x3e\x3c\xcf\xfe\xa1\x8a\x66\x29\xae\x9b\x59\xc5\xcd\xe2\x55\x79\xe7\x29\x3f\xb1\xd4\x86\x6e\xaf\x47\xe4\xdb\x1d\xcc\x4e\x07\x04\xce\xb6\x9e\x3f\x3f\xfb\x86\x0e\x3c\x49\x4a\x70\xa3\xa9\xb3\x83\x16\x86\x48\xcd\xcb\x80\x3f\x53\xf3\xe1\xcc\xc9\x6d\x53\xdc\xf6\xa1\x28\x9a\x0b\x33\xad\x8a\xc6\x88\xf5\x4d\x82\x87\x49\x0b\x9e\xf1\x6d\x28\xdb\x9d\x95\xfd\x76\x5d\xa8\xfb\x4d\x7b\x62\x0c\xcd\x29\xbc\x62\x90\xee\xee\x10\xec\x91\x74\x2c\xbb\x9d\xa0\x25\x35\xd8\x0b\x45\x4f\xaf\xc9\xa3\xb3\x65\xc6\xb3\x5b\x23\xb3\xdb\xe1\x8c\xa0\x43\xb3\xc4\xcf\xf8\x74\xd8\x11\x50\x82\x4e\x07\x8f\xc0\x0b\xb0\x31\x21\x2f\x66\x17\x46\xb8\x74\x3f\x59\x02\x0c\x4b\x01\x02\x0c\xbc\x48\x93\xa3\x46\x51\xfd\xb3\x38\x9f\x85\x77\x75\xa3\xd3\x3c\xd0\xdf\xcf\x57\x46\x75\x25\x10\x8d\xf2\xf3\xa3\x77\xea\x7c\xfa\xdf\x06\xf2\x4a\xdd\xdf\xc5\x87\xaa\x66\x14\x22\x18\xfb\x51\x9d\xbd\xfc\x7c\xfa\xdf\x06\x68\x32\x57\x35\x4b\x46\x06\x2a\x31\xf6\xe5\xf4\xbf\x4d\x54\xfc\x2d\xd1\x7c\xf0\xb0\x17\x4d\x26\x75\x79\x62\xa0\x32\x8c\xac\x29\x6d\x1e\x25\x94\x65\x85\xe0\x65\x53\x75\x0a\xb6\x1d\x91\xdd\x18\x9e\x03\x2f\x9c\x54\x45\x19\x5c\x70\x3b\xb0\xfe\x2e\xe1\x93\x05\x16\x71\x3f\x39\xcb\x98\xe3\xd9\x52\xe5\x18\xfa\x94\x87\x5b\x64\x2b\x13\x37\x30\x64\x94\xb4\xfc\x63\x1c\x12\x6b\x10\xa0\xf8\xdf\x7e\x24\x0e\xb6\x11\x7f\x92\x4b\x69\xae\x78\x79\x83\x41\xcd\xf0\x12\xdf\xb7\xdf\x42\x79\xe3\xdf\xa3\x31\x3e\x1b\xcf\x19\x4d\xd1\x4f\xa0\xd9\x5c\x4b\x4e\x7f\xf7\x15\xd8\x8b\xc1\xf5\x43\x30\x0b\xa5\xa3\xc6\x9d\x9c\xd4\xcc\x18\x1b\x0d\xbd\xda\x30\x61\x0d\x13\x5a\xf0\xe1\x92\x6b\xe2\x87\x5b\x35\x8f\x3e\xa4\x98\x97\xb8\x0e\x56\x1b\x8a\xdd\x5d\xdc\x27\x08\x87\x5f\xa7\x61\x6a\x5f\xd6\x29\x90\xcd\x37\x65\xa5\xf1\xa1\x7a\x48\xf4\x89\xd5\xda\xb8\x4a\xf7\xd6\x1e\xc0\x8f\x78\x86\x0c\x7c\x78\x06\x65\x9c\xde\x23\x5e\x6d\xcf\x90\xeb\xee\x14\x98\x3a\x5c\x1f\x31\x66\xad\x1f\x78\x59\x8b\x5c\x66\x58\x93\xcc\x15\xeb\x73\xcb\xd2\x3d\x40\x99\x2f\x37\xe0\x4b\x36\x38\x3f\x3b\x39\xee\x37\xf0\xf4\x3a\xd4\xcf\xbe\xf4\x35\x0f\xe1\x38\x95\xbe\x7b\x79\xab\x60\x96\xf8\x00\x2a\xfe\x67\x9e\x2d\x64\x29\x58\xc6\x2b\x9e\x49\x33\x26\x62\x31\xa2\x62\xe5\x17\xba\x86\x88\xd0\xe3\xd2\x57\x61\x58\x0e\xbf\xd7\xef\x40\x4b\xa0\x97\xbd\xa4\x5c\x13\x7c\xf7\xa2\x59\x0b\x4d\x1e\x1c\x39\x0f\x75\xc3\x46\xbf\xc4\x61\x3e\x3d\x05\x95\xc2\x02\xfe\xef\xed\x77\xec\xee\xff\x41\x4c\x43\x99\x14\x90\x73\x61\x8c\x1d\x2c\xa8\xfe\x97\x1b\x48\x51\xa8\x8a\x69\x21\x5a\x35\x90\x7c\x65\xc5\xc8\x77\x15\x83\xc3\x05\xb8\x6e\x19\xae\x41\x91\x2f\x7e\x13\xd7\x65\x04\x82\x40\x00\x5c\xdb\xf9\x73\x70\x4e\x5a\x2b\xe9\x31\xb8\x19\xcf\xbb\x4b\x49\xb2\x84\xb2\xc4\x24\x4e\xd1\x3c\x18\x9c\xe4\xfc\x9b\x30\x0b\x6a\x5f\x5c\x7b\x5a\xc1\x66\xca\xae\x5d\x98\xbd\xdd\xb1\xb5\x95\x14\xf8\x4e\x07\xfc\x50\x93\x4a\x63\xd7\x9a\x84\xa6\x47\x95\xaa\x23\xfe\x1f\x96\x67\xb2\xbc\x99\xb0\x1f\x95\x36\x97\xca\x35\xdd\xa9\x95\x51\x99\x2a\x10\x41\xfc\xf1\xf5\xa5\x66\xb9\x9c\x43\x58\x95\x81\x34\x36\x55\x0a\x26\xd3\x6e\xe0\xf8\x21\xfb\xfc\x6c\x0a\xff\x5f\x5f\x06\xc6\xae\x0c\x47\xf2\x41\x1c\xa7\xf3\x3e\x94\xf3\x42\x66\x96\x34\xe6\x5e\x88\x32\x94\x92\x65\x9a\x2f\xb1\xfc\xb7\x5f\x51\xe5\x56\xe4\x10\x47\x8b\x9d\xf0\x84\x6f\x5f\x5f\x8e\x70\x84\x87\x23\x09\x2c\x3d\x3b\x4f\x2f\xe5\x30\xd1\x2f\xd0\x8b\x28\x38\x49\x5b\x95\x3b\x8e\xfa\x90\x30\x0b\x0f\x45\x68\x4e\x15\xdf\xe9\xf8\xb6\xd4\xa7\x26\x88\x2d\x5a\xab\xb9\x5b\xc5\x84\xaa\x7e\x60\xfc\x5b\x55\x0b\x0d\x1e\x2c\x68\xb6\x74\xa9\x9d\x9a\x82\xaa\xe8\x23\x8a\xa7\x8e\x92\x20\xbb\x5f\xaa\x5a\x88\x25\xbe\x19\x61\x36\x79\xc6\x07\xaa\xfa\x0c\xb1\xde\x0d\xf7\xac\x0f\x7f\x7b\xe5\x0a\x71\x5c\x72\xaa\xee\x08\xa1\x03\x57\xa2\x2a\x64\xc6\xaf\x05\xe6\xf7\x93\x39\x1a\x61\xe2\x2c\xfa\x11\xde\x8e\x1f\x54\x43\x4f\x9c\xda\xd7\x6d\x91\x65\x32\x05\xda\x59\x9e\x99\xd1\xc7\xb5\x54\xb5\x34\xab\x89\x4f\x88\xaa\xb1\xa2\xed\x6c\x45\xfe\xfe\x8b\xcb\x5f\x5c\xc5\x49\xd8\xcb\x05\x6f\xca\x6c\x31\xf5\x23\xd9\x39\x3b\x65\x5f\x46\xe7\xb1\xae\xf8\x7d\xc9\xe6\xb2\x76\xf9\x2e\x8a\xce\xf8\xd9\x2a\x0c\xfa\x2a\x94\xaf\xea\xe0\x49\x7f\x20\x70\xae\xbc\x18\x04\x2e\xd2\x73\x05\xc0\x2d\x9b\xe5\x4c\xd4\x76\x11\x6e\xc0\x18\x83\x37\x95\x0a\xa2\xf6\x9a\xb3\x80\x6c\x74\x87\x38\x86\xaa\xbb\xc4\xa6\x6d\x2c\xa5\x1e\x19\x19\x02\xc9\x9c\x3c\x0c\x7c\xe2\x2e\x04\xf8\xe8\xe4\x1e\x96\xa2\xbd\xfa\xee\xdd\x25\x5b\x0a\xb3\xd8\x5c\x5b\x2a\xbe\x82\x6c\x98\xcd\x95\x8e\x82\xa3\x9b\x97\x2b\xb6\x6c\x8c\xef\x98\x03\x61\x7c\x76\x83\x0b\x69\xf5\x9c\x2f\xc0\x0e\x95\x12\xb1\x86\x5f\xa7\xea\x8e\x07\x24\x97\x04\xca\x83\x41\xcf\xc3\x46\x50\x7d\x61\x96\x7d\xb1\xe6\xdb\x32\xfd\x7b\xae\x65\x16\x6d\xe2\x7d\xd8\x1c\x4e\x81\x19\x40\xad\x62\xa8\x8c\xdd\xab\xfa\x76\x13\x93\x90\x50\x6c\x21\x6f\x80\x1e\x6e\x0f\x55\x69\x26\x1e\x64\xad\xe0\xc1\xec\x7c\xd2\x50\xd8\x29\xbe\xb1\x81\x95\x01\x25\xc1\x30\x16\x32\xb4\xd5\x05\x7a\x12\x6e\xd6\x30\x54\xf7\xed\xa9\xa0\x89\x95\xd7\xf7\x56\x11\x4b\xea\xaa\x1e\x7f\x76\x8c\x3d\x18\x91\x75\xae\x6a\xb0\x33\x64\xc6\x0b\xd6\xdf\x60\x70\x07\xce\xa4\xab\xc5\x35\xa5\x07\xc3\x6c\x95\x4c\x3b\x8e\x61\xc9\x88\x6d\x38\xe5\x76\xc0\x8e\x9c\xb2\xc6\x77\xcc\x28\x87\x87\x5b\xd8\xc1\x78\x84\x8f\xea\x3f\xf3\x8a\x9c\x37\x13\x06\x81\x01\x39\x37\x7c\xc2\x66\xb2\xe4\xf5\x0a\xfe\xd1\xc7\x25\xa3\x6a\x7e\x23\x7e\x8f\x60\x44\x03\x92\x4c\x68\xa8\x36\x8d\x6e\x3a\x72\x3d\xed\x12\x01\x40\xa9\xc8\x34\x97\xcf\xb9\x8b\x23\x4a\x3c\xf2\xc0\xa1\x18\x9d\xb8\x94\x4d\x54\x2e\x16\x6a\x2a\xf1\x3c\xc4\xdc\x97\xe2\x3e\x0a\x1c\xb6\xc6\x45\x78\xca\x21\xdc\xb1\x01\x8a\x9b\x7f\xc9\xab\x2a\x74\x8d\xcc\x1a\x6d\xd4\x92\xbc\xdb\x3e\xcb\x6b\x1a\xf0\x3e\xd1\x9b\x91\xf4\x25\x71\x30\xa9\x6d\x45\x89\x67\x37\x3e\x54\xc0\xe7\x54\xd8\x3f\x00\x3a\x10\x22\x4d\x6d\x58\x06\xaa\x9d\xad\xe9\x30\x49\xac\x7c\x86\x91\x0e\x4b\x5e\xbd\xc7\xa5\x6e\x96\x16\x97\x71\x14\x75\x20\x19\x6c\x3c\xd7\x23\x30\x18\xe8\xc3\x0b\x1a\xaf\xd7\x4b\xcd\x4e\x81\x86\xeb\xa5\xa6\xa7\x82\x70\xbf\x48\xa0\xbd\xbf\xad\x58\xac\x13\x09\xab\x62\xbc\x6b\x0a\x29\x6f\x47\xc5\xd5\xa2\xe1\x17\xaa\x47\xab\xda\xdf\xb5\x85\x25\x12\x94\x18\xec\xb0\xb0\x24\xd8\xbc\x28\xb4\xc2\x37\x01\xc8\x2e\x35\x62\xf9\xb9\xfd\xe6\x8b\x28\x5a\x1f\x15\x9a\x87\xe4\xa8\xd9\x4a\xcf\xe6\x94\xbb\x1c\x64\xd6\x12\xc4\xc3\x1b\xff\x9e\xb9\xbb\x50\x5a\x55\xa0\x1a\x03\x3c\x18\xb8\xf2\x77\x45\x71\x73\x9a\xd9\x1e\xaa\xcb\xdf\xee\xfd\x7c\x93\xd4\x35\x03\x54\xa2\x6e\x52\xee\x05\x89\x5a\xca\x62\x45\x54\xef\x52\x71\x3f\xa2\xc5\x08\x9a\xd6\xa8\x3a\x14\xad\xf5\x33\x4c\x47\x88\xbe\xcb\x9a\x3d\x84\x46\xc4\xf9\xe8\xb0\x60\x5e\xf4\xe8\x45\x22\x34\xbd\xa2\x34\x57\xa0\xaf\x77\xe6\x4a\x3a\x54\xe1\xb3\x25\x78\x26\xa8\x3b\x8e\x6b\x1a\x0a\xea\xf5\xec\xc3\xd7\x5f\x7d\xf5\x08\x22\x34\x61\xa5\x2a\x4f\xa1\x95\x5d\x83\xa1\x92\x87\x94\x28\xae\x3d\xf8\xdd\x62\xa9\x1f\x45\xba\x42\x59\x74\xbb\x00\x9e\x52\x28\xb4\x42\x08\x01\x66\x0f\xab\x89\x71\xbe\xb8\x55\x21\xfd\x1a\x32\xe9\xbc\xb0\xc5\x5e\x50\xe7\xdb\xf0\xc5\xbf\x1f\x4f\xe6\xfc\x72\xc0\x99\xd9\x57\x86\x66\x1f\xa9\xf3\x1c\xa2\x15\xff\x4c\xd3\x1c\xa6\xbf\xe0\x83\x8a\xe2\x0f\x8e\x91\x20\x50\x70\x60\xe6\xe8\x2c\xc5\xc3\x37\xca\x82\x54\x73\x76\x72\xf6\xe1\xab\xb3\xb3\x93\x3d\x05\xd2\xa3\xb9\xbd\x7e\x1c\xd4\x8d\x71\x11\x83\x71\xfa\x91\x1e\xff\x9d\x75\x80\xa6\x46\x7b\xa5\x83\x81\xce\xa3\xa3\x9c\x5d\x1a\x8f\xcb\x93\x21\x8f\x41\x21\x58\x25\xea\xa5\xd4\x5a\xaa\x72\x8b\x50\xa5\xfd\xf6\xc8\x91\xce\xf5\xa8\x79\x0b\x80\xdf\x23\x38\xf0\xc1\x85\x1f\x5f\x1c\x83\xcd\xc9\x63\x73\x13\xa5\x1f\x09\xfc\x28\x4a\x78\xad\xcc\xc7\xf2\xee\xdf\x8f\xc7\xd8\x04\x0f\x6e\x0f\x3c\xb8\x62\xf6\x82\x68\xa9\xf0\xda\x88\xa5\x9f\xf1\x23\xd5\xd1\xe3\xc5\x74\x93\x46\x1f\xa5\xcd\x9d\xbb\x6c\x6b\xe9\x5e\x2b\xd9\xc8\x9a\x1d\xa4\x7b\x9d\x64\x87\x97\xb6\x51\x1a\x7d\xff\x76\xc9\x6d\x8d\xfe\xe8\xda\xfc\xb8\x26\x76\xcf\x9e\x0a\x46\xf7\x1f\x72\x07\x6d\x36\xcf\xc7\x9a\xe6\x89\x6c\x1e\xe4\xa6\xe8\x2b\x02\x8c\x33\xcf\x1f\xdf\x34\xf7\xe5\xfd\xdc\x32\x78\xd5\xfb\x72\x34\x52\x42\x65\xd9\x86\xa8\x63\x16\xc2\x1b\x2c\xf8\xa8\x3f\x36\x5f\x97\x5f\x95\x0f\xc1\x8c\x9c\x91\xc8\x72\xa7\x29\x7b\xb0\x01\x2c\x5c\xfb\x41\x02\x1a\x4f\xf8\x20\x3a\x89\x9e\xb2\x64\x81\xef\x08\x5b\xb1\x38\x3c\x83\xc9\x39\xfb\x1f\xff\xaf\xff\x09\x8f\x6b\x68\x2d\x6c\xef\x2e\xf2\x9d\xaa\xa0\x5c\x06\xe8\x09\x80\x89\x4f\x0b\xe4\x7d\x4d\x1e\xe7\x70\xd7\xf2\xfa\x36\x55\x23\x56\x19\x78\xc4\x86\x47\xb3\x77\x35\x54\x89\x69\xdc\xac\x38\xe9\xc4\xab\xad\x78\x10\x55\xf1\xc4\x11\xcb\xee\x94\x33\x9e\xdd\xa2\xbe\x35\xfd\x73\x07\x0d\x93\x80\x6a\x42\x73\x2e\x0f\xec\x7f\x34\x5b\x0a\xc3\x81\x02\x9f\x63\xaf\xe4\x2f\x92\x65\x50\x41\xac\x88\x08\x04\x2d\x0f\x7d\x8f\x23\xb5\x6d\x5c\x97\x66\xa9\xca\xce\xd8\x4d\xf9\x9b\x7b\x0b\xdb\x60\x2f\xb5\x1e\x31\x1b\xe5\x22\x3f\xc2\xc3\xca\x53\x71\x91\x07\x0c\x1f\xc5\x43\x7e\x70\xd5\xf3\x52\xdd\x97\xf7\xbc\xce\x5f\x5c\xbe\x26\xfa\x4c\xa2\x50\x8d\x75\x32\xe1\x46\xb2\x30\xd4\x17\x0d\xaa\xd5\x9d\xcc\x45\x92\x28\x05\x8d\x45\x01\xea\x4e\xde\xc5\x50\x30\xb6\x95\x07\x1b\x2d\x80\x22\xbf\x31\x72\xd3\xda\x39\x9d\xdf\xc0\x78\xf1\x8e\x61\xea\xb8\x24\xed\x9d\xc6\xd5\xa5\x0a\x6b\x9f\xfa\x83\xc2\xc7\xc6\x43\x15\x4c\x2f\x89\x24\x83\x28\x91\x00\x34\x8a\x71\x09\xe5\xb3\x7c\xa9\x4b\x10\x2c\x32\x33\x1c\x7f\x89\x29\x5b\xb3\x35\xa7\x95\xf1\x4a\x6e\xc9\x58\x8a\x68\x3d\x34\x67\x03\xd8\xa7\xcd\x5b\xc2\x73\x47\xe6\xba\xce\xb6\x4f\x92\xbb\xd4\xc4\xf7\xf0\x3b\x17\x01\x53\x8e\xc0\x52\xee\x53\xed\xf9\xb8\x0c\x4e\x28\xb0\x03\x8b\x93\xf1\x4f\x9a\xc9\x47\xd8\xc5\x11\x97\x9d\x98\x3f\x71\x3e\x6f\xb7\x97\xa3\xa0\x8b\x16\x80\xa7\xc9\x69\x7f\x98\x4c\xfc\x95\x13\x22\x7d\x78\x51\xa8\x8c\xbb\x90\xb9\x7d\xd8\xdf\x06\xc7\x3e\xcf\xaa\xe6\x0b\xa4\x93\xf6\x93\xfa\x73\xdb\x45\xe1\xd3\x3f\xc8\x93\x23\x9e\xae\x98\xc4\x67\x79\x74\x34\x3b\xcc\x3d\xaf\xdd\xf7\x49\xc6\x13\xdb\x4a\x7d\x8c\x38\xfa\x31\x71\xa5\x4f\xa2\x7c\xe7\x12\x74\x29\xb8\x19\x86\xb8\xfe\x18\xe7\xc9\x03\xca\x20\x4e\xdb\x11\xc3\x18\x9b\x8f\x4e\x12\x5b\x07\x53\x7a\xce\x0c\xc9\x63\x0c\x51\xd4\xdb\x1d\x67\x03\x47\x19\x3a\x76\x46\x28\xb9\x27\x2a\x92\x95\xca\x99\xfd\x75\x4f\xa1\xab\x54\x6e\x87\x62\x55\xfa\x5d\xee\xaa\x0f\x25\x37\x97\xb4\xde\x1d\x6c\x19\x37\xf4\x69\x1e\x6e\xf1\xdb\xd5\xd9\x57\x67\x67\x3b\x32\xd4\xee\xf9\x97\x51\xe0\x80\x2a\x29\x00\x31\x7a\x99\x7a\x98\x2b\x89\x4f\x85\x21\x4f\xaa\x2b\x33\xcd\x12\xdf\xf1\x69\x7d\x4a\xff\x67\x8d\x44\xac\x93\x06\xcc\x58\xd8\x5a\x22\xd6\x49\x03\x46\xf3\x0e\x4b\xc4\xfe\x55\x98\x8e\xf0\xca\xb3\x9b\xd4\x05\x5f\xfe\x9e\x32\xb7\x24\x61\x43\xf6\x58\xa8\x0f\x2e\x70\x7b\x6a\x94\x20\xb0\x9d\x07\x8e\x20\xa4\x2d\x21\x73\x69\x47\x3b\x0a\x5a\x9f\x90\xb5\xa2\x02\x9e\x5e\x70\xc8\x6e\x82\xe6\x03\x91\x4b\x65\x7c\xa3\x89\x5d\x84\xad\x0b\xc8\x12\x10\x33\xf8\xb3\x50\x07\xef\xc9\x48\x5b\x21\x35\x3c\x3f\x5b\x99\xd3\x20\x74\x82\x67\x0b\xf7\x20\x8d\x1d\xc6\xfd\x52\x06\x74\x58\xfa\xd2\xd7\x15\xaf\x98\x18\x3b\x48\xd9\x2f\xc1\x9f\x1f\x43\x9a\xad\x18\xcf\x73\x4c\xf4\x2f\xc5\x7d\xf4\x9b\xf3\xe9\xba\x54\xba\xe4\x21\xa9\xf5\xa9\x47\xfb\x8e\xcb\x22\xbc\x03\x3f\xde\x41\x4b\x02\x04\x6f\x14\xfb\xc9\x20\x3e\x73\x7c\xec\xe2\x87\xab\x58\x77\x7a\xfa\x68\xe4\xae\xe4\x11\x09\xb6\xb3\xa8\x48\xe0\xbc\xaf\x9f\x80\xb4\xe5\x0d\x53\xe8\x7b\x44\xcd\x8b\x19\x7e\xd1\x91\xb0\x56\x40\xfc\xd1\xa5\xec\xd5\xb2\x32\xab\x97\xb2\x9e\xb0\xeb\x05\xaf\xfd\x54\xda\xa7\x1f\x87\x0a\x9e\xeb\x04\xce\x81\xf1\xc3\xad\x6d\xdf\x2a\x17\xab\x7b\x27\x48\xef\x45\x9b\x92\xde\x50\xd6\x92\xfc\x1c\x5e\xb2\x13\x41\xd3\x9f\xf8\x57\x30\x37\xb7\x9d\xb3\x77\xca\xc4\x45\x10\x92\x5c\x2a\xc7\x23\x73\xaf\xd8\xac\xd1\xab\x99\xfa\xc0\xe4\x92\xdf\x88\x18\x49\x0b\xdd\x01\x8f\xcc\xc4\x10\xc6\x13\x6a\x74\x78\x80\xd0\xad\x34\x6d\xcd\x97\xb3\x7b\x2e\x0d\xb3\xe2\x8a\x0f\xd4\xba\x99\x45\x9f\xe4\xb5\xaa\xa8\xfe\x09\x35\x8f\xb4\x3b\xa7\x05\x87\x83\x3c\xc3\x60\xa4\x6f\xce\x0d\xdf\xa2\xfc\xb4\x13\x15\x20\xe1\xfb\x5c\xd6\xc3\x12\xb2\x14\xb9\x6c\x96\xee\xda\xd8\x32\xfb\xbf\xfe\xaa\xaf\x49\xc1\xb0\x80\xb4\x84\xe3\x73\x17\x4b\x32\xb1\x90\x26\x34\x07\xfa\x0d\xf6\x09\x4c\x1b\x2d\x30\xc9\x93\x62\x30\x9f\xce\x28\x1a\x84\xd1\x87\x60\xcc\x10\x87\xa1\x36\x93\x49\xab\x9d\x43\x3a\x7f\xbb\xf4\x6a\x4f\xb4\x4c\x38\x73\x3a\x31\x2a\x30\xfd\x69\x7d\x6f\x2d\xb7\x9a\xee\x16\xf4\xca\xb9\xaa\x42\x24\xd7\xb2\x9a\x6b\x7f\xb1\xa7\x27\xc7\x34\xe6\xcb\x05\x89\xed\x67\x8b\xb9\x40\xf6\xf5\x46\x3f\xd4\x61\xed\x6d\x8b\xb0\xb5\xd2\x1a\x2f\x89\xe8\x16\xe9\x0a\xe2\x16\x71\x5f\x5b\xca\x25\x50\xfd\x8b\x03\xdd\x0f\x36\x4a\x25\xb0\xf7\x04\x17\x7b\x62\xa9\x7a\xf2\x33\xac\xf8\x64\xd2\x0a\xcd\xea\x8a\xec\x4e\xe2\xea\x82\x1b\x07\x44\x76\x17\x71\x8d\xd3\x20\xfa\x45\x76\x5b\x71\x45\x88\xdb\x5d\x1f\x36\x89\x2b\xc0\x4c\x6b\x0a\xa3\xa3\x0f\xc4\xec\xaf\x9e\xee\xc7\x14\xe6\x01\xb5\xfa\xf5\xd7\x87\x12\xdf\xaf\xbf\x7e\x4a\x6a\xf5\xeb\xaf\x1f\x4d\xad\xc2\xff\xfd\xa4\x56\xb7\x54\xab\x5f\x7f\x3d\x39\x92\x5e\xfd\xfa\xeb\x8f\x44\xaf\x7e\xfd\xf5\xa3\xe8\xd5\x3e\x79\xfd\xa4\x57\xf7\xd3\xab\xdf\x7c\xf3\xcd\x81\xc4\xf7\x9b\x6f\xbe\x79\x42\x7a\xf5\x9b\x6f\xbe\x79\x24\xbd\xfa\x01\xff\xef\x27\xbd\xba\x9d\x5e\xb5\xe2\x73\x14\xb5\x6a\x01\x7f\x14\x6a\xd5\x8a\xec\xc3\xab\xd5\x7e\x71\xfd\xa4\x56\x1f\xd7\x0b\xd0\xf5\x00\x3c\x94\xf0\x8e\xf0\x00\x7c\xba\xad\x1f\xe5\xb6\x7e\x20\x81\xf9\x28\x74\x1d\x5c\xcd\x77\x94\x23\x57\xb0\xe2\x30\x7a\xe9\x20\x09\x7d\x3d\x72\x04\x10\x9f\x9e\x5e\xda\xf3\x1a\xdd\xbd\x42\x3f\x01\xbd\xe4\xae\xd0\x9f\xae\xbb\x47\xb9\xee\x1e\x48\x60\x3e\x0e\xbd\x64\xaf\xb6\x3b\xca\xd1\x27\xbd\xf4\x78\xd7\xd0\xee\x15\xf4\xf1\xf5\x12\xd8\xf3\x56\x98\x62\x69\x6b\x09\x94\xfd\x96\xeb\x4f\xd7\xc6\x7d\xae\x8d\x07\x12\x9c\x8f\x42\x3f\x79\x99\xda\x5e\x9e\x50\x3d\x6d\x94\xa9\x4f\xf7\xba\x35\x7a\x2a\x94\x4c\x1b\x2f\x71\x34\x5e\x95\x51\xd0\x37\xcc\x40\xa2\x08\xcc\x0b\x81\xd1\x75\x2d\x32\x0a\xc5\x7b\x68\x07\x5a\x2a\x4b\xde\x05\x30\x5a\x3f\x3d\xc4\x89\xf6\xd0\x0a\x66\x3f\x8e\xe3\x16\x6b\x31\xda\x31\x39\xc4\xd1\x3e\x00\xa3\xc7\xeb\x9b\x7d\x4e\xa8\x48\x02\x9c\x53\x6a\xdf\x88\xc7\xae\xae\xc0\x94\x93\x87\x53\x09\xec\xd7\x9a\x57\x95\xa8\xfd\x96\x09\xd9\xd2\xc4\xf1\x09\x2b\x15\xab\x79\xb6\x36\x82\xdf\x83\xbb\x27\x70\xad\x23\xc9\x12\x21\xe3\x8d\x16\x00\xc9\xea\xe3\x5c\x86\x42\xd8\x0b\x51\x62\x5f\x2c\xa8\xf1\xec\xd2\x9f\xa3\x7e\x0a\xa3\xaa\x1e\xfc\xe9\x2c\x20\xaf\x69\x3d\x78\x04\xfc\x89\xd5\xae\xb0\x3c\xb6\xa1\xf1\xa1\xb4\x3a\x4a\x0f\xef\x89\xef\x89\xfa\x42\xbf\x79\x4b\xfd\x66\xee\x39\xf6\x0b\xb3\xb8\xd2\x24\x9d\x48\x9c\x2f\x7b\xaa\x2a\xb7\x39\xf2\x9e\x48\x35\x9a\x33\xd7\x22\xab\x05\xb6\x6a\xe8\x67\x92\xeb\x2a\xb1\x37\xa3\x5c\x77\x8a\x0d\x2d\x79\x10\x9f\x28\xfb\xa4\x8d\x56\xa7\xcc\x32\x84\x2d\xc5\xad\x5d\x30\xf0\x89\xc2\xf6\xa0\xbb\x19\x7e\xb8\x6e\xad\x6b\x9c\xc7\x07\x65\xc4\x65\xad\xfe\x89\x55\x12\x3a\xd5\x5c\x2a\xfc\x69\x53\x94\x70\x80\x90\xa9\xe5\x0c\x9a\x79\x86\xb4\x16\xfb\x0b\x14\x2d\x81\xd6\xc0\x25\x98\x27\x58\xfe\x87\xdf\x22\x5d\x9a\x0a\x83\xcb\xfc\x64\x10\xe9\xf9\xdb\xa5\xff\xf7\xef\xbb\x47\x71\x26\x2a\xd5\x4d\x11\x72\x89\xa8\x97\xd2\x1c\xfa\xc7\x58\x56\x40\x9b\x56\x62\x04\x32\xad\xcc\x59\x1e\x45\xaf\x02\x24\x97\xec\x33\x81\x14\x44\xd0\xa5\x49\x52\x13\x74\x45\x4d\x7f\x71\xed\x9a\xa6\x3e\x05\xa6\x1d\x47\x0c\x15\x23\x20\xf6\xad\x83\x89\x6b\x9f\xe8\xed\xbc\x04\x76\x48\x7f\x86\xaa\x4d\xf7\xa2\x28\xec\xff\x0e\x20\xd0\x0d\xc8\xec\x0f\x5f\xdd\x5e\x09\x7b\xea\xbe\x77\x62\xb0\x59\xd4\x3a\x05\xa2\xb6\x2c\x95\x1d\x8b\xde\x36\x45\xb3\xf1\x64\x1b\xae\x0a\xb2\x75\x37\x22\xb3\xa8\x85\xe8\xb4\x88\x8f\x14\xb5\x45\xbf\x58\x41\xcd\x7c\x58\x27\x89\x7e\x6b\xad\x71\x56\x1d\x4d\x72\x11\x3f\x19\x95\xa8\x3d\x5c\xd9\x11\xab\xc6\xe0\x98\xf7\xab\xdf\x08\x37\x5c\x0e\x5a\x9b\xe3\x22\x95\x36\xb0\x2f\xe0\xbf\x4e\xcf\x4f\x50\x6a\xfd\xaa\x03\xad\x5d\x1f\x25\xfc\xc5\x4f\x32\xf1\x51\xcd\x83\x52\x9e\x6e\x33\x2f\x94\x6d\x48\x49\x54\x7c\x67\x5e\x5a\x67\x34\xaf\x9b\xb3\x1d\x2b\xed\xe7\x75\x95\x51\x5a\x9b\x6b\xca\x5e\x86\xfa\x37\x9d\x79\xbc\x20\x26\x69\x8f\x7e\x7d\x70\x60\xf6\x2e\x2e\x2c\xac\xc3\xdf\xbd\xf6\x17\xd9\x0e\x5b\x6d\xb0\x2d\x4d\xe2\xbe\xad\x35\xb6\x9e\xdc\x9e\xb1\xf7\xb1\x60\x0e\xe9\xec\x13\xbf\xb2\x13\x3c\x54\x55\x4d\xc7\x6c\x84\x6f\xdc\x7d\x31\xb2\x3f\x81\x06\xd3\x8d\xf2\x69\x5c\x73\x64\x8a\xd2\x8f\x4a\x5a\xf9\xde\xa2\x76\x4b\x93\x56\x76\xa9\x57\xed\xdb\xd8\x2c\x7e\x0b\x79\x78\xb6\x8f\x7e\x8f\xdf\x9b\xe1\xfb\x94\x0c\x3c\x02\xf3\x63\x74\x92\xa2\x7e\x0c\x8b\xfa\xfd\x7b\xb0\x7f\x9b\x7c\xd6\xbd\x25\x20\xde\x6f\x07\xa9\x97\x7d\x2c\x9d\xd0\xd2\x05\xde\x37\xf7\xd5\x43\x0b\x46\x9c\xd0\x48\x3d\x71\x0e\x95\x67\x08\x82\x85\x39\xb4\xfb\xf8\x5e\xf6\x15\x40\xdf\x00\xe6\xc8\x62\xb7\x73\x59\xea\x07\x3f\x77\xde\xb5\xab\xb5\xf1\x42\xab\xa4\x68\x69\x54\x96\xbd\xe2\x66\x31\x4e\x24\xbb\xe2\x18\xac\x2a\x2c\x20\x07\x55\x11\x9c\x3b\xe2\x63\x52\x62\x48\x9b\xc7\x50\x66\x47\xaa\x31\xfd\x28\x7a\x6d\x83\xdc\x39\x88\xa1\xd8\xe0\xbe\x72\x87\x06\x73\x2a\x7b\x3b\xe9\x48\x92\xbb\x3f\xb8\x8e\x7c\x48\x5b\xad\x25\xdc\x1f\x97\xe5\xb6\x51\x81\xc6\x82\x77\x40\x05\x8a\x9e\x96\x03\x08\xf2\xc3\x0b\x58\xab\x40\x33\xd4\x1f\x3e\x88\x80\xf5\xd4\x6a\x76\xce\x15\xe3\xfa\xe5\xee\x52\xab\x79\x5b\x1f\xde\x18\xc1\xf2\xc9\xd5\x41\x72\x82\xd0\x98\x7b\x15\x75\x18\xf5\x27\x0d\xd4\x55\xde\xec\x56\x68\x89\x50\xd6\x6f\x12\x7a\x79\xb2\x93\x45\xbb\x71\xd7\xf2\xcd\xfb\x8a\xc5\xe6\xfa\xba\x7d\x72\x70\xbc\x66\x74\xc7\xd0\x25\x65\x6e\x75\xbb\x9d\x53\x7b\xef\x1b\xfc\xd5\x95\x4f\x56\x90\xc3\x4e\x5e\xa0\x1e\x3d\x81\xca\x04\xc7\xa5\xbc\x05\xec\xc8\x47\xd6\xaf\x62\xa2\x12\xcd\xe8\x55\x8b\xca\x98\x5b\x38\x37\x12\x4a\x0a\x2b\x82\xf2\xfc\x81\x44\x20\x72\xf9\x8e\x2d\xaa\x1b\x80\xc4\xee\xf0\x87\x28\xab\x3b\xde\x87\xdf\x76\xd4\xe3\xc1\xbe\x87\xb3\xbe\xc3\x53\x17\x1f\x16\xf6\xbd\x5b\xe4\x83\x38\xd6\xa3\x1a\x08\x3b\x30\x79\x44\x69\xce\xdd\xb8\x7c\x98\x12\xbb\x4f\x9e\xcf\x9d\xa2\x9c\x4f\x91\xd1\xa3\x6b\xed\x6e\xcf\xea\x03\x56\xdb\x7d\xd2\xbc\x1e\x28\xb6\xfb\x84\xb9\x7d\x94\x9d\x7d\xd0\xb2\xbb\x1f\x03\xc3\x3f\x8a\xfd\x1d\x15\xdf\xdd\xa6\xe0\xe9\x28\xf6\x3f\x7e\xd9\xdd\xc7\x14\x13\xbc\x56\x5e\xfe\xd2\x7e\x5a\x0f\x4d\xcb\xe7\xd0\xb7\x97\xde\xd1\xed\x57\x0e\x6c\x2d\x20\x70\x66\x5d\xe1\xde\xcd\x57\x88\x0e\x7d\x3f\x0e\xdd\xf3\x70\xc2\xf8\x38\xf5\x77\x3f\x89\xa4\xf9\x98\x4e\xc4\x31\x85\x78\x47\xc9\xdf\x01\x4b\xf1\x3e\xe9\xc3\xaf\xea\xd4\xc5\x7c\x8a\x6c\xdd\xcd\xf3\xdf\xc3\xde\x07\x28\xcc\xfb\x98\xec\x7e\x17\xef\x5a\x17\x01\xee\xb6\x7e\xec\xd4\xa2\x6e\x5b\x23\x5f\x3d\x13\x21\x41\x11\xda\x28\x28\xa1\x52\x77\xc4\x3b\x68\x21\xf5\xd1\xbd\x7c\x3e\x11\xb9\x3d\x66\x71\xdf\x4f\x42\xfb\x49\x68\x9d\xd0\x76\x6a\xfb\xee\x2c\xb5\x47\xaf\x12\xfc\x78\x62\x0b\x7f\x8b\x0a\xec\x42\x65\xd7\x11\xe1\xbd\xbd\x45\x82\x37\x1f\xb9\x8c\xbd\x88\x06\x52\xb1\xce\xd2\x85\x33\x6e\xd8\x09\x2e\xe8\x91\xe2\x88\xe7\xaa\xf6\xdb\x21\x82\xfa\xa8\xc2\x86\xc5\x67\xf7\x15\xb4\xa3\x94\x02\x7e\x64\x19\xc3\xea\xba\x28\x5e\xbe\xd2\xfe\x20\xab\xdb\x95\x80\x37\x48\x16\xfb\xc9\xd1\x9d\xed\x2f\x54\xf0\x67\x04\xf8\x60\xb2\x74\xed\xa3\xe5\xd3\xf8\xf1\x6d\x62\xc7\x31\xe2\x7e\x54\xe0\x38\x93\x65\x9c\x68\x75\xac\xc0\x71\xca\x01\xe8\x44\x8d\xc7\x0d\x41\xf7\x88\x1a\xc7\xa0\x71\x4e\xd3\x6c\x84\x3a\x18\x33\x4e\x84\xa3\xb7\x33\xbf\x38\xfa\xb3\x8c\xaa\x13\x6f\x1f\x20\x4e\x40\x5a\x91\xe1\xed\x18\xec\x28\x3a\xdc\xcf\xba\x21\x34\xbc\x3d\x9b\x47\xd2\x09\x74\xba\xaa\x28\x2e\x3c\x9d\xa1\x4b\xfb\xe4\x3e\xdd\x09\x0a\x6f\x2f\xe8\x90\x11\xe1\x08\x7b\x8b\xdd\xb2\x73\x30\x38\xad\xe2\x11\x22\xc1\xd7\xbc\xfd\x23\x52\xe1\x15\x98\x22\x40\x08\x57\x27\xac\xde\x15\x72\x2b\x56\xdb\x87\x86\x93\xe3\xa5\xff\xbd\xdf\x42\x1c\x8e\x07\xe9\x86\xd0\xb1\xd9\xca\x4d\x7e\x34\xb6\x77\x99\xee\x0b\xaa\xb9\xd8\x98\xb9\xfe\x5b\xad\x9a\xea\x78\x9c\x8f\x23\x79\x3a\xc1\xc1\xd0\xe2\x1f\x31\x38\x52\x40\xdd\x41\x45\x26\x29\x2a\xb2\xe0\x7a\x38\xd8\xee\xab\xb3\x09\x9b\xeb\x1b\x22\xad\x2f\xc2\x76\x7e\x76\x76\x8e\x91\x07\x5a\xd4\xee\x8f\x21\xd0\x49\xe6\x56\x9a\x36\xc7\xa6\x7b\x15\xb8\x83\xfc\x9d\xd2\x15\x26\x4d\xf3\xc6\x18\x94\xa3\x25\xf9\x1e\xa6\xc8\xc4\x81\x94\xdd\xf8\x4b\xf8\x2e\xf2\xfe\x40\x01\xf0\x47\x50\x85\x43\xc2\xfc\xe1\xab\xb3\x33\x17\xd0\x06\x4d\x1f\x36\x5a\xa0\xbb\x88\x26\x40\x6c\x5f\xaf\xf7\xbd\x5a\xe3\xc2\x0f\x57\x85\x60\x0f\x09\xdc\x26\x08\x7e\x67\xb9\x3b\x70\x04\xfc\x43\x9e\xb7\xef\x22\xeb\x2a\x09\xe7\x74\xee\xea\x3d\xe2\x92\xdb\x02\xe8\xcd\xdc\x5e\xfd\x88\xff\xc7\x35\x4c\xc1\xe8\x40\x5c\xfd\x23\x08\xcc\x83\xab\xae\x6e\xb8\xfb\x1f\x43\x8b\xf9\xf8\xf7\x54\xc8\xe8\xe0\x0b\x89\x17\x5e\x5b\x60\x27\xbb\x63\x8b\x19\xeb\x95\xb3\x07\x28\xd6\xf3\x28\xb2\x1c\xea\x0a\x8c\x8f\x3e\x5e\x27\xc9\x6b\x42\x8f\xf9\xc3\xc4\x1c\xef\x6a\x44\x06\x29\x1c\x17\x7f\xbc\xd9\xab\xb8\xe9\xd0\x5d\x1f\x79\xbc\x93\x9c\x1e\x41\x88\x48\x64\xbc\x08\xed\x54\x13\xc0\x01\x19\xe9\xce\xd9\xe7\xa2\xba\xad\x3b\x27\x11\x1f\xe7\xdd\x71\x21\xcb\x43\x6b\xdd\xbe\x26\x00\x40\x04\x17\x4f\xea\xe0\xd9\xc3\xb9\x93\x16\x00\x48\x1d\x21\x3b\x3b\x77\xb6\x48\xfd\x1f\xeb\xdc\xd9\x98\xf7\xff\xff\x91\x77\x05\xbb\x6d\xc3\x30\xf4\xbe\xaf\xf0\x2d\x1b\x10\x0c\x6d\xd1\xd3\x6e\xfb\x80\x01\xc3\xb6\x0f\x88\x1c\x27\x8b\x50\x27\x29\x22\x67\x69\xff\x7e\x10\x29\x89\x94\x2c\xdb\x91\x63\x19\x2d\x7a\x5c\x56\x89\x92\xf9\x44\x89\x8f\x14\x35\x96\xdc\xf1\x97\xe0\x0c\xe4\x8e\xc1\x4c\xc7\x5b\x67\xe1\x4a\x89\xf0\x39\x4b\xcf\x0e\xc1\x45\x0c\x88\x86\xc9\x03\xd9\x19\x98\x95\xfe\x55\x3d\x0f\x94\x3e\xb2\x02\x69\x11\xd9\x4f\x6c\x22\x73\xda\xe8\x9a\x51\x9c\x36\x7f\xc5\xa9\xaa\xed\x83\xbf\xc7\x6d\x21\x98\x69\x33\xa3\xda\xbc\x48\x05\x9b\x54\xcf\xf0\x68\x68\xa3\x32\x30\x42\xbc\xb6\x25\x69\x6b\xe8\x64\xa8\xaf\xed\x05\xcd\xed\xb9\x6f\xfc\xd9\x0b\x81\x91\x0a\x3d\xc3\x1e\xbc\xb5\x09\x1d\x0f\xe4\xb1\x75\xd1\x7a\x0c\x50\x2f\x63\x48\x4b\xb1\x7d\x5c\x76\x72\xbd\x73\x1c\xbe\x50\xea\xb8\x96\xb4\x94\xe9\x23\x62\xd1\xf9\x67\x6f\x93\xc3\x1d\x89\xde\x5a\x35\x3b\x08\x5b\xa1\x49\xf4\xd5\xfd\xc3\xc4\xc8\xbe\x82\x9d\x6c\x63\xb3\xff\xbc\x3b\x05\x98\x22\x58\x19\xc2\x89\x39\x9c\xa4\x61\xa5\x65\x59\x7c\x98\x04\x26\x34\x0a\x95\xa6\x5b\xbf\x11\xdd\xa2\x05\xbd\x81\x9e\x1c\x6f\xb8\x2c\x73\x86\x94\x20\xd1\x65\xe6\xe2\xdf\xa4\x10\x60\xcc\x64\x9c\xb9\x99\x92\x9d\xcc\x86\x1d\x6c\xdb\x7a\x28\xf9\xee\xe5\xf1\xf1\x2e\xf2\x8e\x84\x7f\x91\xd2\x79\x28\x76\x9a\xf8\x7b\xc7\x55\xa6\xd9\x01\x69\xb9\xca\x12\x4f\x48\x16\x8f\x33\x50\x43\x13\x96\xc6\xbd\x65\x31\x4c\x8c\xf8\x10\xe1\x8e\x9a\x7e\x67\xc8\x1e\xcc\xfb\x89\x1d\x2e\xd3\x36\xd7\x1e\x80\x06\x3b\xa2\xf3\x90\x98\xc5\x4c\x46\x28\x9e\xc2\xf2\xfa\xef\x69\x40\x34\x3c\xd0\xf4\xf8\xb3\x04\xd3\x6d\xee\x56\x1e\xb0\xa5\x70\x8c\xcc\x08\xb6\x32\xcb\x42\x8c\x11\x01\xe0\xf5\x3f\xe9\xb1\x2b\x13\x00\xe6\x30\x49\x1e\x24\xa6\xe5\x1d\xe7\x04\x0c\xee\xa4\xc3\xf6\x0a\xa7\x99\xb6\xa9\x0e\x61\x09\xfa\xec\xc1\x53\x67\x31\x8d\xb7\xc6\x32\x8e\x02\x69\x7a\x75\x83\x5e\xa0\x46\x68\x45\x47\x29\xe6\x32\x5b\xda\x0f\x8d\x21\x51\x5d\x01\x45\xed\xc6\x86\xf4\x21\x03\x47\xe4\x0e\x40\x2b\xf3\x25\x44\x5f\x79\xc4\xba\xc1\x01\x0c\x95\x4f\x23\x46\xb1\x98\x5d\xe9\x72\xbf\x3f\x37\xa2\x94\xb5\x6c\x5e\xd3\x74\x6c\x5a\x6a\x15\x6f\x8b\x95\xfb\xd7\xaa\xd8\xca\x4d\x5d\x99\xdc\xe2\x31\x9e\xa0\xe1\xa9\x64\xb3\x50\x50\xfb\x17\x3b\x5c\x72\xaa\x0a\x3e\x3f\x30\xb2\xda\xe3\xfe\x21\x4e\x4f\xe1\xc7\x17\x8a\x06\xd8\xd3\xf4\xcf\xe9\x95\x15\x16\x90\x0d\x4a\xa4\x0a\xe0\xbc\xd1\x56\xc8\xda\xb5\xd0\x2b\x9c\xcb\x2b\xc5\xfa\x09\xbd\xa0\xa6\x47\xb0\x4b\x65\x0a\x25\x53\x4f\x2b\x55\xec\x37\x8d\x80\x89\x7f\xc6\xf4\xc3\x2f\x5e\x3f\x90\x3e\xcd\x27\x60\x83\x7a\x55\xc8\xbe\x2d\x89\x3b\x83\x10\x0e\x6f\x18\xc0\xea\xe1\xfe\x46\x5c\x2d\x7e\x9f\xcb\x9f\xa2\xd9\x7d\x2b\x7e\x6d\x44\xa5\xcd\x88\xe5\xd0\x01\xe4\x82\x2a\x74\xdb\xb8\xcc\xa2\x17\x6e\xe7\x12\x76\x81\xef\xcd\x71\x2f\xd7\xc5\xe5\x24\x9b\x76\xd9\x69\x67\x39\xf1\x8f\x15\x51\x4c\x24\x0c\x02\x17\x7c\xcf\xeb\xc7\x22\xd1\xb8\x2e\xec\xb1\x16\x07\xdc\x58\x3a\x27\x14\x71\xd9\x80\x42\x2a\x2e\x82\x5b\x1c\xc7\x04\xe3\x70\x93\x0e\xb6\x38\x2b\x48\x76\x76\x0c\x61\x25\xff\xc9\xea\x2c\x6a\x73\xe3\x46\x1e\xd8\xf0\xaf\xe1\x91\x9c\x62\xcd\x78\xde\x91\x46\xf1\xa4\xa3\xbf\x83\x1e\xa1\xde\x9d\x1d\xff\x19\x5e\xe4\x78\x43\x1a\xc7\x1c\xf7\x5a\x1d\x8b\xb3\x02\x5f\x18\xfb\x81\xff\x82\x22\xde\x52\xb1\xa0\x29\xda\x0a\x99\xfa\x7c\x4d\x2f\x48\x6c\x40\x6f\x5e\xa0\xf0\x3c\xee\x19\xa0\x62\xc5\x65\x5c\xfb\x7c\x46\x1f\x74\xf5\x87\x51\xdc\xac\x2a\x25\x61\xf9\x74\x4a\x32\x3e\xa8\x46\xbd\x13\x73\x56\x75\x1a\x49\xf9\x74\x69\x04\x04\x6e\x1f\xc5\x75\xa6\x53\xa4\x51\x22\x45\xff\xf3\x28\xf2\xd3\xff\x00\x00\x00\xff\xff\xbe\x3a\x91\x95\x67\xda\x02\x00") func testConformanceTestdataConformanceYamlBytes() ([]byte, error) { return bindataRead( @@ -501,6 +537,26 @@ func testConformanceTestdataConformanceYaml() (*asset, error) { return a, nil } +var _testConformanceTestdataIneligible_endpointsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xdc\x9a\x4f\x6f\xe3\x36\x10\xc5\xef\xf9\x14\x04\x7a\xad\x56\x8e\x93\xf5\x9f\xdc\x0c\x6f\x77\x1b\xa0\x48\x8d\xa6\x4d\xcf\x23\x72\x6c\x11\xa6\x38\x04\x39\x72\xeb\x6f\x5f\x28\x4e\x13\xc9\x8e\x0d\xa7\x28\xb0\x1a\xdf\x74\x58\x58\xef\xf7\x38\xc3\xf7\xb4\x48\xa6\xd0\x9b\x40\xd6\xf3\x9d\xd2\xe4\x3d\x6a\x9e\x53\xc4\xa7\xeb\x2f\xe8\x90\xf1\x81\x0c\x2e\x22\xfd\xbd\xbd\x52\x2a\x22\x24\xf2\x77\xea\x0f\x0f\x85\x43\xc5\xa4\x0a\x54\x8c\x89\xd1\xfc\xa8\xc0\x1b\xe5\xec\x1a\xdd\x56\x25\x22\xaf\x0c\x86\x88\x1a\x18\xcd\x95\x52\xce\xfa\xf5\x9d\x2a\x99\x43\xba\xcb\xf3\x95\xe5\xb2\x2e\x3e\x69\xaa\xf2\x75\x5d\x60\xf4\xc8\x98\xda\x8f\x36\xa5\x1a\x53\x3e\xfd\x3c\xbd\x19\x5c\x9d\x2b\xf0\x4f\xcb\xe5\x02\xb8\xec\x9f\xd0\x6f\xc8\x3d\xb6\xb1\xad\xae\xbf\x1e\xfe\x8c\x60\x7a\x6c\x62\x47\x5e\x7f\x5d\xfc\x35\xb0\x25\x9f\x7a\x6c\xe4\xbe\xc2\xfe\x7a\xb9\x00\xd6\x65\x8f\x9d\xec\xea\xeb\xb1\x8f\x94\xfa\x7c\x3d\x76\xe4\xf5\xd8\xc5\xba\xd7\x26\xd6\x7d\xf5\x30\x22\x30\xee\x44\x3e\x40\x85\x29\x80\x46\xb3\xc0\x98\x6c\x62\xf4\xfc\x44\xae\xae\x70\xee\xc0\x56\x2d\xbd\x1b\xf4\x86\xa2\x4a\x01\xb5\x5d\x5a\xad\x96\x08\x5c\x47\x3c\x53\x97\xa6\xaa\xaa\xbd\xe5\x6d\x5e\x38\xa8\x30\xaf\x20\x31\xc6\x5c\x93\xe7\x68\x8b\x9a\x29\xa6\xdc\xe0\x06\x5d\x9e\xec\x2a\x83\xa8\x4b\xcb\xa8\x9b\x17\x34\xff\x66\x49\xb1\x02\xaf\x31\x6b\x7c\x4a\x9f\x2a\xf3\xc3\x2f\xa3\xdb\x33\x98\x1e\x31\x6e\xac\xc6\x99\xd6\x54\x7b\xfe\x9d\xd6\xe8\x5b\x44\xf4\x7c\xed\x82\xfb\x20\xca\xa1\xc5\x93\xc1\x78\x7c\xc2\x62\x32\xd8\x7a\x6b\x9d\x30\xa9\xe6\x37\x1c\xb2\x82\x60\xbf\x97\x81\x37\xa3\xa3\x8a\xf7\x47\x41\xd8\x14\x3c\x32\x45\x58\xe1\xd3\xf5\xfc\xf1\xfe\x4b\xb4\x1b\x8c\x82\x01\xf6\xa6\x47\x94\xfc\x97\x87\xb9\x83\x94\xa4\x32\xec\x36\x60\xc6\x0c\xba\xac\xd0\xb3\x18\x0e\xf3\xfc\xa5\xb8\x5b\xe8\x39\x39\x87\xba\xb9\xed\x2e\xe5\xbe\x7f\x9f\x4e\xec\xc5\xd5\xc6\xb9\xc4\x23\x92\x91\x81\x6d\xc5\xc2\x47\xe9\x2d\x42\x5e\x97\x43\x5e\x1a\x9e\x42\x11\x95\x8b\x47\x41\x44\x26\xe4\x51\x1a\xe1\x59\x29\xb8\x37\x1e\x02\x48\xde\x8f\x4b\xd8\x0a\xb1\xbb\xb0\x42\xfe\xea\xe8\xaf\xe7\xdf\x23\x37\x0b\x36\x61\xdc\x60\x9c\x2d\xee\xbf\x45\xaa\x43\x8b\xc3\x60\x40\x6f\x92\x22\xaf\xc0\x85\x12\x3e\x08\x82\xbe\x6c\x94\x34\xe6\xa4\xbc\x70\x54\xe4\xcb\xeb\x91\xbe\xd5\xe3\xe5\xb5\x9e\xe2\x70\x02\x37\x5a\xdf\x16\xc5\xad\x19\xe0\xe8\xf3\xe0\x06\x97\x08\x43\xc0\xf1\x74\x32\xce\xd7\x18\xd2\x0e\x2f\xd8\xac\x02\x5d\x5a\x8f\x71\x9b\x0f\x07\xd7\xd3\xc1\x70\x38\xc9\x42\xb4\x14\x2d\x6f\x33\xf0\x26\x5b\x82\x8d\x1e\x53\x03\xbb\x0f\x7a\xef\x19\xa3\x87\x93\x94\x0f\xc4\x0a\x9d\x5d\xd9\xc2\xa1\x5a\x52\x54\x2d\x17\xd5\x16\xf9\x3f\xd3\xbe\x1c\xdc\x29\x96\xc9\x60\x98\x99\xad\x87\xca\xea\x4c\x13\x45\x63\x3d\x30\x9a\x2c\xed\xa6\x2c\xdb\x34\x25\x85\xfc\x3b\x64\x2f\x73\xf8\x0e\x4f\xef\xa7\xef\x75\x85\x66\x8b\xfb\xdf\x30\x51\x1d\x35\xca\xb9\x06\x9c\x4d\xfc\xef\x67\x49\x15\xc8\xa3\xe7\x47\x06\xae\xdb\x04\xcd\xda\x58\xbf\x7a\xfd\xdf\x3d\x4b\xfe\xbb\xa9\x9f\x1e\x51\x7f\x29\x5f\x21\x6f\x44\x62\x1b\xfd\x71\x84\xe7\xa3\xf8\x4a\x71\xe6\xdc\xeb\x79\xc9\x5a\x15\xc1\x9d\x6b\x5f\xbe\xa8\xc6\xd5\x11\x2f\xb2\x6f\x75\x08\xc4\xb6\xad\x00\xac\xcb\xcb\xba\x71\xcf\x47\x3a\x08\x46\x89\x60\x64\x7e\x0a\x25\x56\x18\xc1\x35\x6f\x82\xa6\xbe\xa5\xff\xbf\x3f\xb6\x1e\x43\xed\x5c\x3e\x1d\x0f\xc7\xa3\x63\xf2\xc4\x46\xdd\x09\x06\x89\xc3\x22\x38\xdd\x0e\xf4\x8b\x8a\xb7\xae\x7a\x91\xf9\xd6\x45\x90\x1d\x70\x47\x31\x84\x2d\x75\x44\x30\x72\x3f\xee\xde\xd4\x5f\x4a\xd5\x38\x9b\x48\xec\x9c\xf5\xb1\x68\xbc\xa9\x13\xdb\x33\x8e\x23\x08\x9c\x14\xc1\x2d\x63\x5f\xbe\xa8\x92\xd1\x11\x2f\xb2\x63\x74\x08\xc4\x56\x8c\x93\x14\xe2\xf6\x39\x38\xd0\x17\xf6\x97\x20\x1f\x81\xba\x90\xf3\xea\x51\x58\xb7\x04\x0a\xce\xeb\x13\x14\x32\x47\x46\x74\x6a\x1f\x10\x08\x0b\xee\xae\x7e\xa1\xd9\xdd\x85\x10\x1c\xdf\xa7\x41\x04\xac\xf7\x3f\x01\x00\x00\xff\xff\x7a\xdb\x8b\x78\x50\x3a\x00\x00") + +func testConformanceTestdataIneligible_endpointsYamlBytes() ([]byte, error) { + return bindataRead( + _testConformanceTestdataIneligible_endpointsYaml, + "test/conformance/testdata/ineligible_endpoints.yaml", + ) +} + +func testConformanceTestdataIneligible_endpointsYaml() (*asset, error) { + bytes, err := testConformanceTestdataIneligible_endpointsYamlBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "test/conformance/testdata/ineligible_endpoints.yaml", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + var _testE2eTestingManifestsFlexvolumeAttachableWithLongMount = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xa4\x56\x6f\x6f\xda\xc8\x13\x7e\xef\x4f\x31\x5d\xd0\x4f\x4d\x45\x20\xe1\x57\xa9\x52\xa2\x54\xc7\x85\xe4\x8a\x4a\xa0\x0a\x34\xbd\xea\x38\x45\x8b\x3d\xb6\x47\xb7\xde\x75\x77\xd7\x21\x5c\xc4\x77\x3f\xad\x6d\x08\xe6\x5f\x93\x3b\xbf\x63\x77\xe6\x99\x67\x9e\xf9\xb3\xd4\xde\xb4\xa6\x24\x5b\x26\xf6\xbc\x1a\x5c\xaa\x74\xae\x29\x8a\x2d\xb4\x4f\x4e\x3f\xc0\x38\x46\xf8\x9c\x4d\x51\x4b\xb4\x68\xa0\x93\xd9\x58\x69\xd3\xf4\x6a\x5e\x0d\xfa\xe4\xa3\x34\x18\x40\x26\x03\xd4\x60\x63\x84\x4e\xca\xfd\x18\x97\x37\x0d\xb8\x43\x6d\x48\x49\x68\x37\x4f\xe0\xad\x33\x60\xe5\x15\x3b\x3a\xf7\x6a\x30\x57\x19\x24\x7c\x0e\x52\x59\xc8\x0c\x82\x8d\xc9\x40\x48\x02\x01\x1f\x7d\x4c\x2d\x90\x04\x5f\x25\xa9\x20\x2e\x7d\x84\x19\xd9\x38\x0f\x53\x82\x34\xbd\x1a\x7c\x2f\x21\xd4\xd4\x72\x92\xc0\xc1\x57\xe9\x1c\x54\xb8\x6e\x07\xdc\xe6\x84\xdd\x17\x5b\x9b\x9e\xb5\x5a\xb3\xd9\xac\xc9\x73\xb2\x4d\xa5\xa3\x96\x28\x0c\x4d\xab\xdf\xbb\xbc\x1a\x8c\xae\x8e\xdb\xcd\x93\xdc\xe5\xab\x14\x68\x0c\x68\xfc\x91\x91\xc6\x00\xa6\x73\xe0\x69\x2a\xc8\xe7\x53\x81\x20\xf8\x0c\x94\x06\x1e\x69\xc4\x00\xac\x72\x7c\x67\x9a\x2c\xc9\xa8\x01\x46\x85\x76\xc6\x35\x7a\x35\x08\xc8\x58\x4d\xd3\xcc\x56\xc4\x5a\xb2\x23\x53\x31\x50\x12\xb8\x04\xd6\x19\x41\x6f\xc4\xe0\xd7\xce\xa8\x37\x6a\x78\x35\xf8\xd6\x1b\x7f\x1a\x7e\x1d\xc3\xb7\xce\xed\x6d\x67\x30\xee\x5d\x8d\x60\x78\x0b\x97\xc3\x41\xb7\x37\xee\x0d\x07\x23\x18\x5e\x43\x67\xf0\x1d\x3e\xf7\x06\xdd\x06\x20\xd9\x18\x35\xe0\x63\xaa\x1d\x7f\xa5\x81\x9c\x8c\x18\x38\xcd\x46\x88\x15\x02\xa1\x2a\x08\x99\x14\x7d\x0a\xc9\x07\xc1\x65\x94\xf1\x08\x21\x52\x0f\xa8\x25\xc9\x08\x52\xd4\x09\x19\x57\x4c\x03\x5c\x06\x5e\x0d\x04\x25\x64\xb9\xcd\x4f\xb6\x92\x6a\xba\x5e\x1a\xbb\x72\x06\x9a\x1e\x50\xbb\x24\x31\xc7\xe7\x42\xcc\x21\x40\x43\x91\x2c\x34\xb3\x68\x2c\x70\x10\x4a\x46\x90\xa8\x4c\x3a\xf5\xc0\xf8\x28\xb9\x26\xe5\xd5\x60\x16\x93\x1f\x83\xcf\x25\xf8\xdc\x35\x09\x87\x07\x25\xb2\x04\x9d\xef\x14\x21\x40\xeb\xca\x18\x38\x3b\x81\x05\x82\x8b\x46\x12\x52\xad\x22\x97\x7e\xd3\xf3\xbc\xeb\xfe\xd5\xef\xf7\xdd\xaf\x37\x37\xdf\xef\xfb\xc3\xdf\x2e\xea\x4f\xd5\x83\xb3\x63\xd6\xb2\x49\xda\x0a\x05\x3e\x1e\x07\x59\x92\xcc\x9b\x42\x45\x6c\xe1\x79\x77\x9d\x7e\xaf\x7b\x7f\x33\x18\x77\xaf\xee\x7a\x97\x57\x17\xa1\x52\x2e\x37\x6e\x5d\x58\xe0\x62\xc6\xe7\xae\x3f\x6c\xa6\xa5\x01\x25\x11\x1e\xb8\xa0\xa0\xe4\x11\xe0\x03\xf9\x08\x46\x01\x87\x80\xc2\x10\x35\xae\x4e\xbd\x1a\x98\x58\xcd\x5c\xb6\x59\x0a\x79\xef\x9a\x6c\x6a\xf0\x47\x96\xdb\x14\xb2\xf9\x5c\x88\xb2\x74\x06\x38\x4c\xb3\xc8\xcb\xf1\xb9\xc5\x1b\x17\xa1\x9b\x43\x0d\x75\x97\xf0\xed\x11\x3c\x79\x50\x7e\xcf\x7c\xeb\xa7\xab\xc3\xcb\x4e\xbf\x7f\x51\x6f\xaf\x7e\x53\x08\x7f\x00\xab\xaf\x6c\x19\xbc\xb9\x00\x56\xdf\xc8\x98\xc1\x9f\xe7\xae\xb4\x72\xe5\xb7\xfc\x84\x8a\x80\x3d\x4d\x98\xb1\xdc\x66\x66\xc2\xce\x26\xec\x9a\x93\xc8\x34\x4e\x58\x63\xc2\x12\x34\x86\x47\x98\x9f\xe7\x79\xb0\xfa\x93\xa3\xb0\x60\xae\x2f\xd1\x77\xcd\x5e\x0a\xc4\xea\x4f\x1b\x51\x17\xac\x01\x91\xb2\x6b\x06\x6b\x57\x13\xb6\x60\x5b\x6c\xf0\x91\x2c\x9c\xac\x8e\x43\xf2\x16\x9e\x27\x54\x54\xd1\x25\xd5\x24\x6d\x08\xac\xfe\x8e\xc1\xc7\xff\x9d\x3a\x93\x00\xa7\x59\xd5\x08\xfd\x58\x01\xab\xbf\x75\x2a\x1f\x41\x6e\xfa\xd1\x31\xa8\xb6\xcc\x82\x39\xef\xa2\x0f\x2a\xee\x39\x20\xb0\xb2\x43\xea\xbf\x3c\x53\xdd\x21\xd8\x28\xf3\x7d\x34\x26\x17\xac\xc8\x35\x3f\xde\x25\x48\x25\xeb\x32\xdb\x9c\xff\x3e\x06\xc5\x4d\x85\x41\x0d\xc6\xc3\xee\x10\xc8\x98\x0c\xe1\xfd\xfb\x0f\xff\xff\x50\x0e\x90\x1b\x99\x94\x1b\xb7\xce\xbf\xdc\x81\xe4\x09\x36\xf2\xb5\xbc\xde\xc7\x2f\xca\x63\x27\xc7\x19\x27\x1b\x2a\xbd\x5f\xac\x8a\x41\x85\xf1\xce\x4e\xde\x37\x03\xd5\x6e\xae\xa2\xfe\xcb\x32\xfc\xbc\x00\x64\x8a\x00\x18\xec\xca\xec\xf9\xf6\x35\xad\xb0\xf4\x99\xb0\x33\xab\x33\xdc\x5d\x78\x95\x17\xa7\xa0\xbb\xb3\xfe\xeb\x06\xfb\x44\x6d\xbf\x56\xd4\x0a\x6a\x05\xf2\x4b\x67\xfc\x69\xbd\x4a\xc9\x5f\x01\x69\x38\x4e\x21\x57\xd1\xdd\x2e\xe0\x63\x2b\xc0\x87\x96\xcc\x84\x80\xb6\x1b\xc0\x95\x6d\xde\x67\xc7\x16\x6c\x92\x86\x06\xa4\xdb\xa4\x2f\x70\x33\x02\x31\x85\xd3\xf6\xc9\xc6\xf0\x7e\x42\x21\x14\x84\x5a\x25\xe0\x56\x7a\xf1\x62\xbc\x59\x0e\xf2\x12\xb6\x45\x32\xc0\xc7\x66\x6c\x13\xf1\xb2\xca\xec\xac\x43\x26\x7f\x52\x87\x8a\xc1\x66\x1d\x36\x45\xd3\xc9\x3e\x86\x7b\x45\xc8\x0a\xf1\x5e\x20\xd7\xab\x73\xc3\xc7\x94\xcb\xa0\x90\x6f\x57\x6a\xeb\xf7\x2f\xee\xef\x03\x91\x42\xb3\x3f\x4a\x68\xfe\x5b\x04\x95\x3a\x9d\xbd\xf2\xd5\x53\x29\x83\x0b\x60\x24\xc9\x6e\xbf\x70\xcb\xd9\x95\x64\x5f\x33\xb5\x3e\x4f\xf9\x94\x04\x59\x42\x77\xf9\xb4\x9c\xe3\x72\x8a\x1b\x30\x61\xe5\x3f\x49\x73\x3d\xba\x45\x43\x7f\xe3\x72\xc0\xb7\x19\x87\xe4\x79\x26\xa6\xd0\x7a\x9e\xcf\x0d\x96\x94\xe9\x99\x64\x81\x7d\xb4\xf5\x10\x2e\x97\xe8\xbb\xad\x9b\xf3\xf3\xb5\x0c\x77\x3b\x2f\xdf\x8c\x83\xce\x95\xbd\xba\x8d\xb1\xb1\xcc\x0f\x42\x3d\xaf\xc7\x6d\x9c\xf5\xd5\x79\x10\x64\x6d\xbc\x76\x64\x54\xdd\x82\x07\x81\x2a\x93\xba\x0d\xb5\x31\xc8\x07\xa1\xd6\x27\x63\x1b\xa9\x3a\x37\x2f\x00\x0a\xcd\x3e\x10\x37\x16\x07\x01\xde\x6d\x7b\xee\xe8\xe3\x81\xb2\x60\xb2\x34\x55\xda\xba\x67\x67\xff\x1f\x2c\x34\xdc\x77\xe3\x4a\x16\x4e\xbd\x7f\x02\x00\x00\xff\xff\x9b\x84\xf0\xd3\x3c\x0e\x00\x00") func testE2eTestingManifestsFlexvolumeAttachableWithLongMountBytes() ([]byte, error) { @@ -1661,7 +1717,7 @@ func testE2eTestingManifestsRbdStorageClassYaml() (*asset, error) { return a, nil } -var _testE2eTestingManifestsSampleDevicePluginYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x9c\x93\x41\x6f\xdb\x30\x0c\x85\xef\xfe\x15\x44\xee\xaa\xd7\x9d\x06\x5d\xdb\x62\x28\xd6\x75\x45\x83\xee\x5a\x30\xf2\xab\x23\x54\x96\x04\x89\x36\x92\x7f\x3f\x38\x76\x62\xb7\x4d\x97\x65\xba\x45\x79\xfa\xc8\x47\x3e\x73\xb4\xbf\x91\xb2\x0d\x5e\x13\xc7\x98\xcb\xee\xb2\x78\xb5\xbe\xd2\x74\xcd\x68\x82\x5f\x42\x8a\x06\xc2\x15\x0b\xeb\x82\xc8\x73\x03\x4d\x99\x9b\xe8\xa0\x2a\x74\xd6\x40\x45\xd7\xd6\xd6\xab\x15\x84\x47\x45\x8e\x6c\xa0\xe9\xb5\x5d\x41\xe5\x6d\x16\x34\x05\x91\xe3\x15\x5c\xee\x21\x44\xaf\xdf\xb2\xe2\x18\x8f\x93\x8a\x1c\x61\x7a\x5d\x86\x83\x91\x90\x86\x37\x0d\x8b\x59\xdf\xcd\x20\xa7\x30\x44\x82\x26\x3a\x16\x8c\x80\x99\x8f\xfe\xb8\x37\xac\xd3\xb4\xfe\xb0\xf7\x41\x58\x6c\xf0\xe3\xc3\x7d\xaf\xfd\x89\xc9\x86\x64\x65\x7b\xe5\x38\xe7\xfb\x61\x52\x3b\xf7\xca\x87\x0a\xca\x24\x2b\xd6\xb0\x1b\xd5\x12\x1c\xd2\x1c\x45\xa4\x28\xc4\xfe\x2e\x24\x4d\x8b\x9b\x8d\xcd\x92\x17\x87\xf6\xf0\xf2\x02\x23\x9a\x16\xf7\xe1\x66\x03\xd3\x0a\x16\x67\x3e\x5b\x9a\x35\xaa\xd6\x1d\xde\x75\xc1\xb5\x0d\x66\xd5\x87\xed\x1e\xf3\x4d\xb4\x0e\x59\x1e\x58\xd6\xd3\xbc\x88\x62\xff\x9b\xca\x8e\x53\xe9\xec\xaa\xec\xf7\xed\x20\xe5\x1b\x40\x7e\x47\x1f\x6f\x55\x42\x6d\xb3\xa4\xad\x8a\x29\xac\xa0\x9a\x50\xe1\x7f\x6a\x8d\xb8\xe7\x3d\x8e\x3e\x9a\xf9\x17\xec\x24\x33\xc1\x0b\x5b\x8f\x34\x9b\x8b\x6d\xb8\x86\xa6\xda\xa4\x0b\x1b\x76\xa5\x93\x87\x20\x2b\x7c\x85\x12\x64\x51\x3b\x45\x2e\x8f\x25\x47\x5f\x5e\x7c\xa1\x43\xc5\xcf\x3f\xa0\x69\x63\xbe\x9b\x3a\xdc\xfb\x78\xb8\x7b\xfa\x7e\x7b\xff\xbc\xfc\x75\xf5\xe3\xf9\xfa\xf6\x71\xe6\xa0\x63\xd7\x42\xd3\xe2\xc4\x1a\xa6\x44\x64\x98\x76\x17\xd3\xe0\x05\x1b\x99\x4f\xa3\x8f\x70\x67\x1d\x6a\x54\x9a\x24\xb5\xd3\x4a\x86\xac\xfc\x0c\xad\x97\xfc\xb1\xbb\xe3\x46\x88\x9a\x5e\xff\x70\x46\x4a\xce\xcb\xc9\xdf\x0b\xbc\x8f\xc6\xb1\xae\x3f\x41\x0d\xff\xb4\xb1\x62\xc1\x52\x12\x0b\xea\xed\xe0\x5a\xb6\x11\x9a\x1e\x83\x73\xd6\xd7\x4f\x3b\x41\xf1\x27\x00\x00\xff\xff\x4f\x53\x11\xfc\x45\x05\x00\x00") +var _testE2eTestingManifestsSampleDevicePluginYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x9c\x93\xcf\x6e\xdb\x30\x0c\xc6\xef\x7e\x0a\x22\x77\xd5\xe8\x76\x29\x74\x6d\x8b\xa1\x58\xd7\x05\x0d\xba\x6b\xc0\xc8\xac\x23\x44\xff\x20\xd2\x46\xf2\xf6\x83\x63\x27\x76\xd6\x74\x59\xa6\x9b\x25\xf2\x47\x7e\xe4\x67\x4c\xf6\x17\x65\xb6\x31\x68\xc0\x94\xb8\x6c\x6f\x8b\x8d\x0d\x95\x86\x07\x24\x1f\xc3\x82\xa4\xf0\x24\x58\xa1\xa0\x2e\x00\x02\x7a\xd2\xc0\xe8\x93\x23\x55\x51\x6b\x0d\xa9\xe4\x9a\xda\x06\xb5\x22\xc1\x21\x82\x13\x1a\xd2\xb0\x69\x56\xa4\x78\xc7\x42\xbe\x00\x70\xb8\x22\xc7\x1d\x04\x60\x73\xc7\x0a\x53\x3a\x4f\x2a\x38\x91\xe9\xe2\x98\x1c\x19\x89\xb9\xcf\xf1\x28\x66\xfd\x3c\x81\x5c\xc2\x00\x08\xf9\xe4\x50\x68\x00\x4c\x74\x74\xc7\x9d\xb0\x2e\xd3\xba\x83\x21\x44\x41\xb1\x31\x0c\x89\x87\x5e\xbb\x93\xb2\x8d\xd9\xca\xee\xde\x21\xf3\x4b\x3f\xa9\xbd\x7a\x15\x62\x45\xca\x64\x2b\xd6\xa0\x1b\xa2\x25\x3a\xca\x53\x14\x80\x82\x98\xba\xbb\x98\x35\xcc\x1e\xb7\x96\x85\x67\xc7\xf6\xe8\xfd\x9d\x8c\x68\x98\xbd\xc4\xc7\x2d\x99\x46\x68\x76\x65\xda\xc2\xac\xa9\x6a\xdc\x31\xaf\x8d\xae\xf1\x34\xa9\xde\x6f\xf7\x9c\x6e\x80\x75\x64\x99\xa3\xac\xc7\x79\x01\xa4\xee\x1b\xca\x16\x73\xe9\xec\xaa\xec\xf6\xed\x48\xca\x13\x00\xff\x41\x1f\x6e\x55\xa6\xda\xb2\xe4\x9d\x4a\x39\xae\x48\xf9\x58\xd1\xff\xd4\x1a\x70\xcb\x03\xee\xa3\x96\x7f\xa1\x8e\x61\x26\x06\x41\x1b\x28\x4f\xc6\x62\x3d\xd6\x9d\x9d\xef\xf8\xa6\x36\xf9\xc6\xc6\x92\xbe\x90\x12\x62\x51\xfb\x27\x2e\xcf\x39\x46\xdf\xde\x7c\x3d\x56\xfa\xfc\xbf\x19\x17\x15\xda\xb1\xb3\x43\xff\xf3\xe7\xb7\x6f\x4f\x2f\xcb\xc5\xcf\xfb\xef\xcb\x87\xa7\xd7\x49\xe7\x2d\xba\x86\x34\xcc\x2e\x4c\x7f\x34\x02\x93\x69\xf6\xee\x8c\x41\x68\x2b\x27\x53\xc8\xb6\xb5\x8e\x6a\xaa\x34\x48\x6e\xc6\x45\xf4\x0e\xf9\x11\x9b\x20\xfc\xb1\xb9\xf3\x3a\x00\x7c\x17\x3f\xbf\xc2\x1b\xd7\xb9\xe3\xef\x05\x3e\x31\xc4\x79\x4b\x9c\xa2\xfa\x97\x26\x55\x28\xb4\x90\x8c\x42\xf5\xae\x57\x2d\xbb\x44\x1a\x5e\xa3\x73\x36\xd4\x6f\xfb\x80\xe2\x77\x00\x00\x00\xff\xff\xe5\x04\xb6\x1c\x3b\x05\x00\x00") func testE2eTestingManifestsSampleDevicePluginYamlBytes() ([]byte, error) { return bindataRead( @@ -1681,7 +1737,7 @@ func testE2eTestingManifestsSampleDevicePluginYaml() (*asset, error) { return a, nil } -var _testE2eTestingManifestsSchedulingNvidiaDriverInstallerYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xa4\x54\x4d\x6f\xe3\x36\x10\xbd\xeb\x57\x0c\xb2\x67\x59\x49\x8a\xa2\x0b\xdd\x8c\x38\x68\x8d\x66\xed\x20\x76\x72\x35\x68\x72\x2c\x11\xa2\x48\x75\x38\xd4\xc6\xff\xbe\xa0\xe4\x78\x25\x6f\x9c\x78\x5b\xdd\x34\x1f\x6f\x3e\xf8\xde\x7c\x81\x75\xa9\x3d\xcc\x04\xd6\xce\xae\x90\xe1\xbb\xf0\xe0\x48\x17\xda\x0a\x63\xf6\x40\xb8\x43\x42\x2b\x51\xc1\x8e\x5c\x9d\x7c\x81\x92\xb9\xf1\x79\x96\x15\x9a\xcb\xb0\x9d\x48\x57\x67\x7f\x3a\x57\x18\xbc\x33\x2e\xa8\x47\x23\x78\xe7\xa8\xce\xa4\xb3\x2c\xb4\x45\x4a\xd1\x16\xda\x62\x2a\xa4\x44\x83\x24\xd8\x91\xcf\xb6\xc6\x6d\xb3\x5a\x78\x46\xca\x54\x57\xdb\x23\x4f\xf6\xa2\x36\x49\x12\x5b\x42\x98\x39\x59\x21\xed\xb4\x41\x10\x56\x81\xe3\x12\x09\xbc\x0b\x24\x11\x76\x8e\x80\x63\xdb\xc7\x54\x10\x84\xa0\xed\xaf\xb4\xe7\xd3\xa2\x09\xa9\xb6\x9e\x85\x31\x48\x49\x22\x1a\xfd\x82\xe4\xb5\xb3\x39\x88\xa6\xf1\x59\x7b\x93\x54\xda\xaa\xfc\xc7\x76\x92\x1a\x59\x28\xc1\x22\x4f\x00\xac\xa8\x31\x07\xdb\x6a\xa5\x45\xaa\x48\xb7\x48\x03\xb8\xde\xef\x1b\x21\x31\x87\x2a\x6c\x31\xf5\x7b\xcf\x58\x27\x00\x46\x6c\xd1\xf8\x08\x01\x50\x7d\xf5\xa9\x68\x9a\xf3\x38\xbe\x41\x19\x43\x3d\x1a\x94\xec\xa8\x4f\xab\x05\xcb\xf2\x61\x80\x73\x01\x12\x40\x68\x94\x60\x5c\x31\x09\xc6\x62\xdf\x27\xf2\xbe\xc1\x1c\x9e\x9c\x31\xda\x16\xcf\x5d\x40\x02\xc0\x58\x37\x46\x30\x1e\xaa\x0d\xa6\x8e\x9f\x19\x15\xfe\x7c\x13\x17\x37\x08\xf0\x36\x6e\xfc\xc4\x6e\xa7\xad\xe6\xfd\xa0\x90\x53\x38\xfd\xc9\x0a\x40\xf8\x4f\xd0\x84\x6a\x16\x48\xdb\x62\x25\x4b\x54\x21\xce\x33\x2f\xac\x3b\x9a\xef\x5f\x51\x06\x8e\xcf\x3b\xc8\xec\x31\x57\x87\xe5\xae\x91\x6a\x3f\x76\xa7\xfd\xae\xef\x5f\x1b\x42\x1f\xc9\x71\xe2\x8f\x11\x15\xee\x73\x90\x91\x5f\x93\xa2\xe3\x5a\x47\xbb\xa2\x1a\x91\xfe\x24\x0b\xc0\x35\xbd\x23\x87\xfb\x57\xed\xd9\x1f\x02\xd8\x75\x09\xc3\x4a\xe9\x20\xf6\xaa\x0f\xbe\x3a\xb8\x4a\xe7\x79\x81\xfc\xdd\x51\x95\x03\x53\xc0\x81\xfd\x71\x3e\x1b\xd9\x5a\x67\x42\x8d\x03\xd4\xfe\xdd\x14\xb6\xc7\xde\xba\x34\xc1\xe5\x70\xc6\x26\xfe\x43\xf6\x23\xec\x2d\xb1\x0d\xa6\x12\x36\xd5\x52\xa5\xb5\x0b\x96\x2f\x41\x29\x5d\x8d\x59\x94\x03\x59\x64\xf4\xd9\x56\xdb\xac\xe7\x43\xd6\xc3\x65\x5a\xaa\x89\x3a\xa9\x74\x60\xcc\x81\x2a\xa9\xd2\x94\xc6\x1a\xff\xaf\xe0\x49\x0d\x72\x8e\x2f\x9f\xe3\x60\x89\x4c\xbc\x7b\xbb\x74\x83\xcd\xea\x5a\x14\x98\x43\x21\x69\xa2\x5d\x77\x6c\x3a\x7a\xfc\x7c\x76\xf2\xf6\xf6\xfa\xf6\xfa\xfa\x8f\xeb\x9b\x5f\x54\x13\x61\x7f\x0c\xfd\xa9\x0e\xd0\xf3\x09\x45\x65\x13\x72\xb8\x9e\xdc\xfc\x7e\xb4\x7a\x94\x81\x34\xef\x63\xeb\xf8\xca\xa3\xf9\x48\xb7\xda\x60\x81\x6a\xc4\x1d\x00\xb4\xed\x30\xee\x6d\x6d\x8b\x97\xf9\x6c\x3e\xdd\xcc\x17\xab\xf5\xf4\xe1\x61\x33\x9b\x3f\x6d\xfe\x5a\xae\xd6\xa3\x06\x5a\x61\x02\x5e\xf2\x16\x9f\x00\xdf\x2d\x17\xeb\xe9\x7c\x71\xff\xf4\x2e\x7a\xf0\x94\x19\x27\x85\x39\x8f\xf9\xf2\xfc\xf0\xf7\x74\xb1\x99\xdf\xcd\xfe\x6b\xa3\xef\xb1\xf4\x83\x0a\x1f\x77\x8c\x2c\x3f\xc3\x7b\x5a\x2e\xd7\x9b\x6f\xcb\xe7\xc5\x3a\xe2\xbd\x8b\x12\x89\x7b\x74\xf4\x1a\xff\x16\x69\x3c\x60\xc1\xa5\x3a\x02\xe8\x04\xf0\xd8\x73\xfc\xec\x42\x3f\x3d\x00\x63\x9c\xb3\x63\xbe\x77\x81\xc6\xa9\x43\xcf\x07\x42\x1d\x27\x0d\x16\x22\xcf\x6b\xf3\xaa\xfa\xea\x27\x07\x81\x36\x22\x78\xcc\x7f\x9b\xdc\x5e\x9d\xa8\xb0\x73\xfc\x1b\x00\x00\xff\xff\x7e\x84\x27\x2d\x24\x09\x00\x00") +var _testE2eTestingManifestsSchedulingNvidiaDriverInstallerYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xa4\x54\x4d\x6f\xe3\x36\x10\xbd\xeb\x57\x0c\xb2\x67\x59\xc9\xb6\x45\x17\xba\x19\x71\xd0\x1a\xcd\xda\x41\xec\xe4\x6a\xd0\xe4\x58\x22\x44\x91\xea\x70\xa8\x8d\xff\x7d\x41\xc9\xf1\x4a\xde\x38\xf1\x76\x75\xd3\x7c\xbc\xf9\xe0\x7b\xf3\x09\xd6\xa5\xf6\x30\x13\x58\x3b\xbb\x42\x86\x6f\xc2\x83\x23\x5d\x68\x2b\x8c\xd9\x03\xe1\x0e\x09\xad\x44\x05\x3b\x72\x75\xf2\x09\x4a\xe6\xc6\xe7\x59\x56\x68\x2e\xc3\x76\x22\x5d\x9d\xfd\xe5\x5c\x61\xf0\xd6\xb8\xa0\x1e\x8c\xe0\x9d\xa3\x3a\x93\xce\xb2\xd0\x16\x29\x45\x5b\x68\x8b\xa9\x90\x12\x0d\x92\x60\x47\x3e\xdb\x1a\xb7\xcd\x6a\xe1\x19\x29\x53\x5d\x6d\x8f\x3c\xd9\x8b\xda\x24\x49\x6c\x09\x61\xe6\x64\x85\xb4\xd3\x06\x41\x58\x05\x8e\x4b\x24\xf0\x2e\x90\x44\xd8\x39\x02\x8e\x6d\x1f\x53\x41\x10\x82\xb6\x3f\xd3\x9e\x4f\x8b\x26\xa4\xda\x7a\x16\xc6\x20\x25\x89\x68\xf4\x33\x92\xd7\xce\xe6\x20\x9a\xc6\x67\xed\x4d\x52\x69\xab\xf2\xef\xdb\x49\x6a\x64\xa1\x04\x8b\x3c\x01\xb0\xa2\xc6\x1c\x6c\xab\x95\x16\xa9\x22\xdd\x22\x0d\xe0\x7a\xbf\x6f\x84\xc4\x1c\xaa\xb0\xc5\xd4\xef\x3d\x63\x9d\x00\x18\xb1\x45\xe3\x23\x04\x40\xf5\xc5\xa7\xa2\x69\xce\xe3\xf8\x06\x65\x0c\xf5\x68\x50\xb2\xa3\x3e\xad\x16\x2c\xcb\xfb\x01\xce\x05\x48\x00\xa1\x51\x82\x71\xc5\x24\x18\x8b\x7d\x9f\xc8\xfb\x06\x73\x78\x74\xc6\x68\x5b\x3c\x75\x01\x09\x00\x63\xdd\x18\xc1\x78\xa8\x36\x98\x3a\x7e\x66\x54\xf8\xe3\x4d\x5c\xdc\x20\xc0\xeb\xb8\xf1\x13\xbb\x9d\xb6\x9a\xf7\x83\x42\x4e\xe1\xf4\x07\x2b\x00\xe1\xbf\x41\x13\xaa\x59\x20\x6d\x8b\x95\x2c\x51\x85\x38\xcf\xbc\xb0\xee\x68\xbe\x7b\x41\x19\x38\x3e\xef\x20\xb3\xc7\x5c\x1d\x96\xbb\x46\xaa\xfd\xd8\x9d\xf6\xbb\xbe\x7b\x69\x08\x7d\x24\xc7\x89\x3f\x46\x54\xb8\xcf\x41\x46\x7e\x4d\x8a\x8e\x6b\x1d\xed\x8a\x6a\x44\xfa\x93\x2c\x00\xd7\xf4\x8e\x1c\xee\x5e\xb4\x67\x7f\x08\x60\xd7\x25\x0c\x2b\xa5\x83\xd8\xab\x3e\xf8\xea\xe0\x2a\x9d\xe7\x05\xf2\x37\x47\x55\x0e\x4c\x01\x07\xf6\x87\xf9\x6c\x64\x6b\x9d\x09\x35\x0e\x50\xfb\x77\x53\xd8\x1e\x7b\xeb\xd2\x04\x97\xc3\x19\x9b\xf8\x0f\xd9\xf7\xb0\xd7\xc4\x36\x98\x4a\xd8\x54\x4b\x95\xd6\x2e\x58\xbe\x04\xa5\x74\x35\x66\x51\x0e\x64\x91\xd1\x67\x5b\x6d\xb3\x9e\x0f\x59\x0f\x97\x69\xa9\x26\xea\xa4\xd2\x81\x31\x07\xaa\xa4\x4a\x53\x1a\x6b\xfc\x5a\xc1\x93\x1a\xe4\x1c\x5f\x3e\xc7\xc1\x12\x99\x78\xfb\x7a\xe9\x06\x9b\xd5\xb5\x28\x30\x87\x42\xd2\x44\xbb\xee\xd8\x74\xf4\xf8\xf1\xec\xe4\xed\xe7\xeb\xcf\xd7\xd7\x7f\x5e\xdf\xfc\xa4\x9a\x08\xfb\x63\xe8\x4f\x75\x80\x9e\x4f\x28\x2a\x9b\x90\xc3\xf5\xe4\xe6\x8f\xa3\xd5\xa3\x0c\xa4\x79\x1f\x5b\xc7\x17\x1e\xcd\x47\xba\xd5\x06\x0b\x54\x23\xee\x00\xa0\x6d\x87\x71\xaf\x6b\x5b\x3c\xcf\x67\xf3\xe9\x66\xbe\x58\xad\xa7\xf7\xf7\x9b\xd9\xfc\x71\xf3\xf7\x72\xb5\x1e\x35\xd0\x0a\x13\xf0\x92\xb7\xf8\x00\xf8\x76\xb9\x58\x4f\xe7\x8b\xbb\xc7\x37\xd1\x83\xa7\xcc\x38\x29\xcc\x79\xcc\xe7\xa7\xfb\x7f\xa6\x8b\xcd\xfc\x76\xf6\x7f\x1b\x7d\x8b\xa5\xef\x54\x78\xbf\x63\x64\xf9\x11\xde\xe3\x72\xb9\xde\x7c\x5d\x3e\x2d\xd6\x11\xef\x4d\x94\x48\xdc\xa3\xa3\xd7\xf8\xd7\x48\xe3\x01\x0b\x2e\xd5\x11\x40\x27\x80\x87\x9e\xe3\x67\x17\xfa\xe1\x01\x18\xe3\x9c\x1d\xf3\xad\x0b\x34\x4e\x1d\x7a\xde\x11\xea\x38\x69\xb0\x10\x79\x5e\x9b\x57\xd5\x17\x3f\x39\x08\xb4\x11\xc1\x63\xfe\xdb\xe4\xf7\xc9\xcd\xd5\x89\x0e\x3b\x57\x92\xfc\x17\x00\x00\xff\xff\x76\x9a\x5b\x51\x28\x09\x00\x00") func testE2eTestingManifestsSchedulingNvidiaDriverInstallerYamlBytes() ([]byte, error) { return bindataRead( @@ -2201,7 +2257,7 @@ func testE2eTestingManifestsStatefulsetRedisServiceYaml() (*asset, error) { return a, nil } -var _testE2eTestingManifestsStatefulsetRedisStatefulsetYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x55\x4d\x6f\xdb\x38\x10\xbd\xeb\x57\x0c\x84\x3d\xec\x1e\x64\xc1\x09\xb2\x8b\x25\xe0\x43\x90\x64\xf7\xd2\x24\x46\x5c\xb4\x87\xa2\x28\x68\x6a\x6c\xb3\xa1\x48\x96\x33\x72\x6a\x14\xfd\xef\x05\x25\x5b\xa6\x64\xb8\xcd\xb1\x3c\x09\x33\xf3\xde\x7c\xf0\x8d\x28\xbd\x7e\x87\x81\xb4\xb3\x02\xa4\xf7\x54\x6e\xa7\xd9\xb3\xb6\x95\x80\x05\x4b\xc6\x55\x63\x16\xc8\x59\x8d\x2c\x2b\xc9\x52\x64\x00\x56\xd6\x28\x20\x54\x19\x79\x54\xd1\x40\x18\xb6\x5a\xe1\x43\x6b\xcf\x03\x56\x9a\xf2\x0c\x20\xa0\x37\x5a\x49\x12\x70\xd9\x06\x19\x54\xec\x42\x04\x00\xd4\x92\xd5\xe6\x8d\x5c\xa2\xa1\xce\x00\x31\xb9\x80\x16\x9c\x01\x30\xd6\xde\x48\xc6\x7d\x74\x92\x3d\x1e\x33\x00\x8e\xa0\x00\x87\xba\xe2\xd1\x56\xf3\x8d\xb3\x2c\xb5\xc5\xd0\x43\x8a\x7d\x13\xda\x12\x4b\x63\x7a\x22\x5d\xcb\x35\x0a\x58\xab\x30\xd1\xae\x7c\x6e\x96\x18\x2c\x32\x52\x81\x17\x58\x30\x12\x17\x6d\x04\x95\x1e\x99\xca\x36\x63\xb1\xe7\xc0\x20\xa6\x93\x8b\x21\xd3\xbc\x31\x66\xee\x8c\x56\x3b\x01\xd7\xe6\x45\xee\xe8\x58\x72\x58\x27\x0d\x14\x90\x17\x07\xa2\x42\x5b\x76\xb3\xd2\x79\xce\x87\xfe\x17\x17\x9e\x8b\x4a\x87\x59\x79\xf8\x3a\x06\x6c\x9d\x69\x6a\xbc\x77\x8d\xe5\x01\x6d\xd7\xa6\xf3\xdc\xdb\x00\xea\x18\x35\x97\xbc\x11\x90\x8f\xd3\x74\xf1\x91\xbf\xd2\xe1\x1c\x66\x9c\xfe\x00\x5b\x3a\xc7\xc4\x41\xfa\xf1\x3c\x2b\x5c\x6a\x69\xc5\x67\x24\xd2\xd8\x3b\x95\xab\x6b\x69\xab\xc1\x14\x7a\xee\xd2\x23\x86\x62\xa5\x6d\x85\x49\x9b\xe3\xa9\x15\xce\x16\xc4\x32\xf0\x2c\x41\x1e\x6c\x13\xda\x0c\x27\xb8\xd7\xe9\xac\x57\x68\x77\xd0\x6e\x4f\x47\x36\x7f\xbc\xfd\xf4\x70\x7d\x7f\xb7\x98\x5f\xdf\xdc\x25\x83\xd8\x4a\xd3\xe0\x7f\xc1\xd5\x22\x31\x02\xac\x34\x9a\xea\x09\x57\x43\x6b\x54\xe6\x71\xbb\xb6\xd3\x91\xb3\x05\x75\x43\x3d\x28\x7c\x12\xb3\x93\x97\x0a\x7f\x8f\xab\x55\x67\x57\xe7\xb8\x6e\xbf\xbc\x68\xef\xc2\xb0\xf4\x9e\x75\xee\x02\x0b\xf8\xfb\xf2\x9f\x7f\x93\x82\x3a\xfe\x78\xff\x3f\x93\x4a\x6c\xaf\xdb\xc0\xfd\x1e\xc6\xdb\x4d\x20\x63\xa9\x8c\xe3\x27\xca\xd9\x55\xef\x0f\x28\x2b\x6d\x91\x68\x1e\xdc\x12\xd3\x5b\xc4\xaf\xc7\x9f\xc9\x99\x62\xba\x04\xb4\x19\x19\x0a\x35\x32\xe4\x27\x35\x2b\xa3\xa1\xd8\xc0\x1f\x7f\x6e\x1c\x71\xec\xfb\x2f\xf0\xda\xae\xf3\x04\x18\x7f\x60\x5a\x9a\x5b\x34\x72\xb7\x40\xe5\x6c\x45\x02\xa6\x57\x49\x04\xeb\x1a\x5d\xc3\xbd\xf3\xea\x95\xd2\x89\x7a\x3b\x2b\x85\x32\x7a\x5f\xaf\xb6\xf2\xe8\xe9\x92\x9e\xe8\x25\x85\x62\xed\x79\x77\xab\x83\x80\x6f\xdf\x47\x61\x63\x7d\x8e\x42\x3b\xf2\x1b\x23\x75\xfd\x76\xff\x44\xb4\x99\x8a\x93\x37\xe2\xb4\xc7\xf4\x59\x90\x4a\x21\xd1\xbd\xab\x90\x04\x7c\x80\xfc\x09\x65\xf5\x3e\x68\xc6\x47\xab\x30\x87\x8f\xd9\x41\x16\xe4\x9a\xa0\x30\x99\x5e\xc0\x2f\x0d\x52\x3a\x4f\x00\x62\x17\x5a\xfd\x4f\xff\xd7\xd9\x8f\x00\x00\x00\xff\xff\x4e\x22\x9b\xab\x51\x07\x00\x00") +var _testE2eTestingManifestsStatefulsetRedisStatefulsetYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x55\x4d\x6f\xdb\x38\x10\xbd\xeb\x57\x0c\x84\x3d\xec\x1e\x64\xc1\x1b\x64\x3f\x08\xf8\x10\x24\x69\x2f\x4d\x62\xc4\x45\x7b\x28\x8a\x82\xa6\xc6\x36\x1b\x8a\x64\x39\x23\xa7\x46\xd1\xff\x5e\x50\xb2\x65\x4a\x86\xdb\x1c\xcb\x93\x30\x33\x6f\x3e\x1e\xdf\x88\xd2\xeb\x77\x18\x48\x3b\x2b\x40\x7a\x4f\xe5\x76\x9a\x3d\x69\x5b\x09\x58\xb0\x64\x5c\x35\x66\x81\x9c\xd5\xc8\xb2\x92\x2c\x45\x06\x60\x65\x8d\x02\x42\x95\x91\x47\x15\x0d\x84\x61\xab\x15\xde\xb7\xf6\x3c\x60\xa5\x29\xcf\x00\x02\x7a\xa3\x95\x24\x01\x17\x6d\x90\x41\xc5\x2e\x44\x00\x40\x2d\x59\x6d\xde\xc8\x25\x1a\xea\x0c\x10\x8b\x0b\x68\xc1\x19\x00\x63\xed\x8d\x64\xdc\x47\x27\xd5\xe3\x31\x03\xe0\x08\x0a\x70\xe8\x2b\x1e\x6d\x35\x5f\x3b\xcb\x52\x5b\x0c\x3d\xa4\xd8\x0f\xa1\x2d\xb1\x34\xa6\x4f\xa4\x6b\xb9\x46\x01\x4f\xff\xd1\x64\xad\xc2\x44\xbb\x12\xff\xc6\x82\x91\xb8\x68\x5d\x54\x7a\x64\x2a\xdb\x52\xc5\x1e\x8c\x41\x4c\x27\x97\xc3\x14\xf3\xc6\x98\xb9\x33\x5a\xed\x04\x5c\x99\x67\xb9\xa3\x63\xaf\x61\x9d\x74\x5e\x40\x5e\x1c\x12\x15\xda\xb2\x9b\x95\xce\x73\x3e\xf4\x3f\xbb\xf0\x54\x54\x3a\xcc\xca\xc3\xd7\x31\x60\xeb\x4c\x53\xe3\x9d\x6b\x2c\x0f\xd2\x76\xf3\x39\xcf\xbd\x0d\xa0\x8e\x51\x73\xc9\x1b\x01\xf9\xb8\x4c\x17\x1f\xf3\x57\x3a\x9c\xc3\x8c\xcb\x1f\x60\x4b\xe7\x98\x38\x48\x3f\x26\xb2\xc2\xa5\x96\x56\x7c\x46\x22\x8d\xbd\x53\xb9\xba\x96\xb6\x1a\xb0\xd0\xe7\x2e\x3d\x62\x28\x56\xda\x56\x98\x8c\x39\x66\xad\x70\xb6\x20\x96\x81\x67\x09\xf2\x60\x9b\xd0\x66\xc8\xe0\x5e\xa0\xb3\x5e\x9a\xdd\x41\xbb\x3d\xa5\x6c\xfe\x70\xf3\xe9\xfe\xea\xee\x76\x31\xbf\xba\xbe\x4d\x88\xd8\x4a\xd3\xe0\xab\xe0\x6a\x91\x18\x01\x56\x1a\x4d\xf5\x88\xab\xa1\x35\x4a\xf2\xb8\x56\xdb\xe9\xc8\xd9\x82\x3a\x52\x0f\xd2\x9e\xc4\xea\xe4\xa5\xc2\xdf\xe3\x6a\xd5\xd9\x9d\x39\xee\xd9\x2f\x2f\xda\xbb\x30\x6c\xbd\xcf\x3a\x77\x81\x05\xfc\x73\xf1\xef\xff\x49\x43\x5d\xfe\x78\xff\x3f\x93\x4a\x1c\xaf\xdb\xc0\xfd\x1e\xc6\xdb\x4d\x20\x63\xa9\x8c\xe3\x27\xca\xd9\x55\xef\x0f\x28\x2b\x6d\x91\x68\x1e\xdc\x12\xd3\x5b\xc4\xaf\xc7\xbf\xc8\x99\x66\xba\x02\xb4\x19\x19\x0a\x35\x32\xe4\x27\x3d\x2b\xa3\xa1\xd8\xc0\x1f\x7f\x6e\x1c\x71\x9c\xfb\x2f\xf0\xda\xae\xf3\x04\x18\xff\x5c\x5a\x9a\x1b\x34\x72\xb7\x40\xe5\x6c\x45\x02\xa6\x97\x49\x04\xeb\x1a\x5d\xc3\xbd\xf3\xf2\x85\xd2\x89\x7a\x3b\x2b\x85\x32\x7a\x5f\xae\xb6\xf2\xe8\xe9\x8a\x9e\xe8\x25\x85\x62\xed\x79\x77\xa3\x83\x80\x6f\xdf\x47\x61\x63\x7d\x8e\x42\xbb\xe4\xd7\x46\xea\xfa\xed\xfe\x6d\x68\x2b\x15\x27\x8f\xc3\xe9\x8c\xe9\x7b\x20\x95\x42\xa2\x3b\x57\x21\x09\xf8\x00\xf9\x23\xca\xea\x7d\xd0\x8c\x0f\x56\x61\x0e\x1f\xb3\x83\x2c\xc8\x35\x41\x61\xc2\x5e\xc0\x2f\x0d\x52\xca\x27\x00\xb1\x0b\xad\xfe\xa7\xaf\x75\xf6\x23\x00\x00\xff\xff\xc3\x6f\x84\x07\x4a\x07\x00\x00") func testE2eTestingManifestsStatefulsetRedisStatefulsetYamlBytes() ([]byte, error) { return bindataRead( @@ -2241,7 +2297,7 @@ func testE2eTestingManifestsStatefulsetZookeeperServiceYaml() (*asset, error) { return a, nil } -var _testE2eTestingManifestsStatefulsetZookeeperStatefulsetYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x55\x4d\x8f\xdb\x36\x10\xbd\xeb\x57\x0c\xd4\x33\x2d\x38\x8b\x00\x0b\x02\x7b\x58\xec\xa6\xbd\x74\x13\x23\x2e\xda\x43\x51\x14\xb4\x34\xb6\xb9\xa6\x38\xec\x70\xe4\x74\x5d\xf4\xbf\x17\x92\x25\x99\xb2\x63\x23\x45\xab\x93\x30\xf3\xde\x7c\xf1\x0d\x69\x82\xfd\x19\x39\x5a\xf2\x1a\x4c\x08\xb1\xd8\xcf\xb3\x9d\xf5\x95\x86\xa5\x18\xc1\x75\xe3\x96\x28\x59\x8d\x62\x2a\x23\x46\x67\x00\xde\xd4\xa8\xe1\x40\x94\xc5\x80\x65\x6b\x89\xc8\x7b\x5b\xe2\xc7\xce\x91\x1f\x76\x79\x06\xc0\x18\x9c\x2d\x4d\xd4\x70\xd7\x21\x1c\x96\x42\xdc\xa2\x01\x6a\x23\xe5\xf6\x47\xb3\x42\x17\x8f\x06\x68\x53\x6b\x38\xec\x32\x00\xc1\x3a\x38\x23\xd8\x43\x93\xc4\xed\xe7\x26\xac\x94\x07\x30\x94\xd3\x7e\xd6\x5b\x79\x22\x2f\xc6\x7a\xe4\x11\xaf\xfa\xe2\xad\x8f\x62\x9c\x1b\xa3\xd8\xda\x6c\x50\xc3\xa6\xe4\x99\xa5\x62\xd7\xac\x90\x3d\x0a\x46\x85\xef\x50\x09\x46\x51\x1d\x22\x16\x01\x25\x16\x07\xa2\x1d\x62\x40\x56\x7d\x1c\x64\x3d\x9f\xdd\x4d\xa3\x2d\x1a\xe7\x16\xe4\x6c\xf9\xa6\xe1\xd1\x7d\x31\x6f\xf1\x54\x33\x6f\x92\x0e\x14\xe4\x6a\x08\xa4\xac\x17\x7a\x28\x28\x48\x3e\xf5\x7f\x21\xde\xa9\xca\xf2\x43\x31\xfc\x9d\x00\x7b\x72\x4d\x8d\x2f\xd4\x78\x99\x84\x3d\xb6\x4a\x41\x46\x1b\x40\xdd\xa2\x16\x46\xb6\x1a\xf2\x36\x4d\x91\x5f\x10\xda\x04\x95\xe5\x6b\xa4\xf3\xfc\x03\x6d\x45\x24\x51\xd8\x84\xf3\xa1\xbe\x9a\xbd\xd1\x14\xd0\xbf\x56\x3b\x75\xaf\x5e\x19\x47\x44\x49\x75\x6d\x7c\x35\x99\xc5\x98\xa0\x08\x88\xac\xd6\xd6\x57\x98\x34\x7b\x3e\x3b\x45\x5e\x45\x31\x2c\x0f\x09\x73\xb0\xcd\xe2\x76\x3a\xc7\x5e\xa8\x0f\x47\x89\x1e\x3f\xf4\xfb\xcb\xa9\x2d\x3e\x3d\xff\xfe\xf1\xf1\xe5\xc3\x72\xf1\xf8\xf4\x21\x19\xc5\xde\xb8\x06\xbf\x67\xaa\x75\x62\x04\x58\x5b\x74\xd5\x67\x5c\x4f\xad\xad\x3a\x4f\xcb\xb5\x9f\x9f\x39\x3b\xd2\x71\xac\x83\xca\x67\x6d\xf6\x18\x4c\x89\xff\xcb\xe9\xfe\xe7\xc3\x3d\x11\xdb\xea\x6e\x10\xa5\x0e\xa7\xb5\x18\xd8\xe5\xd5\xfd\xeb\x17\x36\x51\x49\x2f\x10\x3d\x15\x48\x20\x9e\x76\x3d\x86\x5c\x10\x8b\x86\x77\xf7\xf7\xf7\x49\x49\xc7\xe0\xad\x6e\xae\x53\xee\xbe\x46\x71\x68\x2a\x64\xd5\x5d\x52\x96\xfc\x2d\x81\x76\x5b\x33\xb6\x5a\xac\xac\x2f\x0e\xbb\x25\xf2\x1e\x79\x16\xb7\x57\x75\xda\xe9\x51\xad\x89\x71\xc3\xd4\xf8\x6a\x74\x31\x9a\xca\x7a\x8c\x71\xc1\xb4\xc2\x54\x40\xf8\xe7\xe9\x3a\xbb\x52\x4e\x1f\x7b\x7b\x66\x50\xe5\x99\x21\xff\x6a\xd5\x4f\xce\xce\xe2\x16\x5c\x84\xe4\x1a\x38\x5e\x9d\xd6\xb8\x67\x74\xe6\x6d\x89\x25\xf9\x2a\x6a\x98\xbf\x4f\x10\x62\x6b\xa4\x46\x46\xe7\xfb\x6f\x54\xeb\x4d\x11\x4d\x35\xf4\xed\x4a\x2f\x52\xcf\x77\xd0\xe5\x06\xd9\x22\x0c\x62\x86\xd7\x26\x0a\xac\x89\xa1\xc2\x55\xb3\xd9\x58\xbf\xf9\x77\x7b\x31\xae\x45\x96\x36\x79\x21\xea\xb4\x0e\xac\x83\xbc\x3d\x5b\xd6\xf0\xd7\xdf\xd9\xed\x54\x67\xd0\x63\xf0\x27\x67\x6c\xfd\x53\xff\x12\x76\x99\xd4\xc5\x53\x78\x39\xd3\xf4\x01\x34\x65\x89\x31\xbe\x50\x85\x51\xc3\xaf\x90\x7f\x46\x53\xfd\xc2\x56\xf0\x93\x2f\x31\x87\xdf\x7a\x18\x63\xa4\x86\x4b\x4c\x4e\x8b\xf1\x8f\x06\x63\x7a\x7e\x00\x51\x88\xbb\x3d\x9d\xff\x60\xb3\x7f\x02\x00\x00\xff\xff\x73\x38\x7a\x58\x33\x08\x00\x00") +var _testE2eTestingManifestsStatefulsetZookeeperStatefulsetYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x55\xc1\x8e\xe3\x36\x0c\xbd\xfb\x2b\x08\xf7\xac\x18\xd9\xc5\x00\x81\x80\x39\x0c\x66\xb6\xbd\x74\x76\x83\x4d\xd1\x1e\x8a\xa2\x50\x6c\x26\xd1\x44\x16\x55\x8a\xce\x76\x52\xf4\xdf\x0b\x3b\xb6\x23\x27\x9b\xc1\x16\xad\x4f\x06\xc9\xc7\x47\x52\x8f\x92\x09\xf6\x67\xe4\x68\xc9\x6b\x30\x21\xc4\xe2\x30\xcf\xf6\xd6\x57\x1a\x56\x62\x04\x37\x8d\x5b\xa1\x64\x35\x8a\xa9\x8c\x18\x9d\x01\x78\x53\xa3\x86\x23\x51\x16\x03\x96\xad\x25\x22\x1f\x6c\x89\x1f\x3b\x47\x7e\xdc\xe7\x19\x00\x63\x70\xb6\x34\x51\xc3\xfb\x2e\xc2\x61\x29\xc4\x6d\x34\x40\x6d\xa4\xdc\xfd\x68\xd6\xe8\xe2\xc9\x00\x2d\xb5\x86\xe3\x3e\x03\x10\xac\x83\x33\x82\x7d\x68\x42\xdc\x7e\x6e\x82\x4a\x71\x00\x43\x39\xed\x67\xbd\x95\x47\xf2\x62\xac\x47\x1e\xe3\x55\x5f\xbc\xf5\x51\x8c\x73\x63\x16\x5b\x9b\x2d\x6a\xd8\x2f\xe2\x6c\x5b\xf2\xcc\x52\x81\xef\x50\x09\x46\x51\x9d\x2b\x16\x01\x25\x16\x47\xa2\x3d\x62\x40\x56\x7d\x02\x64\x3d\x9f\xdd\x4d\xd3\x2c\x1b\xe7\x96\xe4\x6c\xf9\xaa\xe1\xc1\x7d\x31\xaf\xf1\x5c\x2c\x6f\x93\xd2\x15\xe4\x6a\x48\xa4\xac\x17\xba\x2f\x28\x48\x3e\xf5\x7f\x21\xde\xab\xca\xf2\x7d\x31\xfc\x9d\x03\x0e\xe4\x9a\x1a\x9f\xa9\xf1\x32\x49\x7b\xea\x91\x82\x8c\x36\x80\xba\x8d\x5a\x1a\xd9\x69\xc8\x5b\x9a\x22\xbf\x02\xb4\x04\x95\xe5\x5b\xa0\x4b\xfe\x01\xb6\x26\x92\x28\x6c\xc2\xe5\x34\x5f\xcc\xc1\x68\x0a\xe8\x5f\xaa\xbd\x5a\xa8\x17\xc6\x31\xa2\xa4\xba\x36\xbe\x9a\xcc\x62\x24\x28\x02\x22\xab\x8d\xf5\x15\x26\xcd\x5e\xce\x4e\x91\x57\x51\x0c\xcb\x7d\x82\x1c\x6c\xb3\xb8\x9b\xce\xb1\x57\xe8\xfd\x49\x9b\xa7\x0f\xfd\xe1\x7a\x6a\xcb\x4f\x4f\xbf\x7f\x7c\x78\xfe\xb0\x5a\x3e\x3c\x7e\x48\x46\x71\x30\xae\xc1\xef\x99\x6a\x9d\x18\x01\x36\x16\x5d\xf5\x19\x37\x53\x6b\x2b\xcb\xf3\x56\x1d\xe6\x17\xce\x0e\x74\x1a\xeb\x20\xef\x59\xcb\x1e\x83\x29\xf1\x7f\x39\xdd\xff\x7c\xb8\x67\x60\x5b\xdd\x1b\x40\xa9\xc3\x79\x2d\x06\x74\x79\x73\xf1\xfa\x4d\x4d\x54\xd2\x0b\x44\x4f\x05\x12\x88\xa7\x5d\x8f\x29\x97\xc4\xa2\xe1\xdd\x62\xb1\x48\x4a\x3a\x25\x6f\x75\x73\x1b\xf2\xfe\x6b\x10\x87\xa6\x42\x56\xdd\xed\x64\xc9\xbf\x25\xd0\x6e\x6b\xc6\x56\x8b\xb5\xf5\xc5\x71\xbf\x42\x3e\x20\xcf\xe2\xee\xa6\x4e\x3b\x3d\xaa\x0d\x31\x6e\x99\x1a\x5f\x8d\x2e\x46\x53\x59\x8f\x31\x2e\x99\xd6\x98\x0a\x08\xff\x3c\xdf\x63\x37\xca\xe9\x73\xef\x2e\x0c\xaa\xbc\x30\xe4\x5f\xad\xfa\xd1\xd9\x59\xdc\x81\x8b\x90\x5c\x03\xa7\x3b\xd3\x1a\xf7\x84\xce\xbc\xae\xb0\x24\x5f\x45\x0d\xf3\xbb\x24\x42\x6c\x8d\xd4\xc8\xe8\xbc\xfb\x46\xb5\xbe\x29\xa2\xa9\x86\xbe\x5d\xe9\x45\xea\xf9\x0e\x3a\x6e\x90\x1d\xc2\x20\x66\x78\x69\xa2\xc0\x86\x18\x2a\x5c\x37\xdb\xad\xf5\xdb\x7f\xb7\x17\xe3\x5a\x64\x69\x93\x57\xa2\x4e\xeb\xc0\x3a\xc8\xeb\x93\x65\x0d\x7f\xfd\x9d\xbd\x4d\x75\x11\x7a\x4a\xfe\xe8\x8c\xad\x7f\xea\x9f\xc0\x8e\x49\x5d\xbd\x81\xd7\x33\x4d\x5f\x3e\x53\x96\x18\xe3\x33\x55\x18\x35\xfc\x0a\xf9\x67\x34\xd5\x2f\x6c\x05\x3f\xf9\x12\x73\xf8\xad\x0f\x63\x8c\xd4\x70\x89\xc9\x69\x31\xfe\xd1\x60\x4c\xcf\x0f\x20\x0a\x71\xb7\xa7\xf3\x1f\x6c\xf6\x4f\x00\x00\x00\xff\xff\xb6\x36\x53\x2e\x2c\x08\x00\x00") func testE2eTestingManifestsStatefulsetZookeeperStatefulsetYamlBytes() ([]byte, error) { return bindataRead( @@ -2381,7 +2437,7 @@ func testE2eTestingManifestsStorageCsiExternalSnapshotterRbacYaml() (*asset, err return a, nil } -var _testE2eTestingManifestsStorageCsiGcePdController_ssYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xd4\x95\x51\x6b\x23\x37\x10\xc7\xdf\xfd\x29\x06\xf7\x79\xd7\x4e\xca\x95\xb2\xe0\x07\x93\x33\x6e\xb8\x9c\x63\x2e\xa1\x7d\x3c\x26\xda\xf1\x5a\xb5\x56\x52\x67\x66\x37\xe7\x96\x7e\xf7\xa2\xec\x3a\x5d\x27\x0e\x6d\x28\x09\x54\x60\x30\xd2\xfc\xff\x33\xf3\x93\xb4\xda\x59\x5f\x16\x70\xa3\xa8\xb4\x69\xdc\x0d\xe9\x08\xa3\xfd\x99\x58\x6c\xf0\x05\x60\x8c\x32\x69\xcf\x46\x35\x29\x96\xa8\x58\x8c\x00\x3c\xd6\x54\x80\x11\x9b\x55\x86\xb2\x58\x66\x26\x78\xe5\xe0\x1c\xf1\x48\x22\x99\x14\x23\xc4\xad\x35\xb4\x7a\x08\x1d\xff\x1d\x3b\x1e\x01\x30\x45\x67\x0d\x4a\x01\x67\x0f\x91\x8e\x8c\x06\x4e\x2a\x80\x1a\xd5\x6c\xaf\xf0\x8e\x9c\x74\x13\x90\x4a\x28\xa0\x32\x31\x33\xa1\x8e\x8d\x52\x16\x53\x71\xa2\xe4\x35\x2b\xad\xec\xb2\xe4\x5e\xb2\x6d\x89\x47\x00\x4a\x75\x74\xa8\xd4\xdb\x0d\xca\x4e\xc3\x1d\x39\xbf\xd6\x1b\xe0\xd0\x5e\x1a\xdf\xc1\x4f\x41\x14\x3c\xe9\x7d\xe0\x1d\xd4\x8d\x28\xdc\x11\x34\x42\x25\x6c\x02\x83\xf5\x4a\x8c\x46\x6d\xf0\x70\x6f\x75\x0b\xbf\x04\xde\xb9\x80\x25\x5c\x96\xe4\xd5\xea\x1e\xac\x87\xe5\xa7\xc5\xa3\x9f\x58\x6f\x08\xac\x3e\x10\x42\x43\x02\xcb\x8b\x05\x7c\xee\x7b\x80\x1b\xe2\x96\xb8\xf3\x5a\x7e\x7a\xb6\x90\xc3\x17\xaa\x43\x4b\x8f\x76\xba\xb5\x02\x4c\xbf\x35\x96\xa9\x26\xaf\x70\xbf\x25\x0f\x56\xa4\x21\x78\x58\x91\xe0\x5a\x2a\x01\x7d\x09\x77\xb4\x09\x4c\x80\x7e\x0f\xf4\x2d\x06\x69\x98\x20\x6c\x1e\xad\x6a\x52\xb6\x46\x20\x06\x56\xe9\x67\xb7\x41\x74\xd5\x35\x5f\x80\x72\x73\x48\xdc\x6f\xfd\xdc\x98\xd0\x78\x5d\xbd\x7c\x58\x32\xc1\x5e\x92\xe6\xd0\x7a\xe2\xc1\xd6\x64\x83\x73\x26\x1e\xa3\x6c\x83\x6a\xbf\x0d\xdd\xb0\x35\x56\x54\xc0\xee\x47\xc9\x2b\xc3\xb9\x0d\x13\xb1\x55\x26\x1a\x18\x2b\x9a\x3c\xd1\x15\xed\xf7\xf9\x34\x3f\x1f\xc8\x91\xab\x41\xba\x2e\xe5\x38\xcb\xda\xd9\x87\xf1\xf3\xd9\xe4\x86\x65\xc9\x24\x32\x4b\xd6\xe9\x97\x4b\x30\xbb\xf1\xd3\x82\xd6\x8d\x73\xeb\xe0\xac\xd9\x17\x30\x77\xf7\xb8\x97\x41\x44\x1b\x5c\x53\xd3\xe7\x04\xe6\x59\xee\xae\xdd\xe4\x49\xe9\xf0\xf1\xd1\x32\x40\x9d\x44\x6b\xd4\x6d\x01\x29\xf9\x49\x4e\x91\x43\x6b\xd3\xc5\x3d\xc5\xa9\x67\x54\xed\x28\x63\x72\x84\xd2\x31\x1a\x68\x8a\xf6\x2c\xff\x21\x9f\x66\xd5\x8e\xf2\xe9\x9b\x92\xea\x63\x37\x84\xda\x30\x65\x15\x2a\xc9\xec\x36\xc4\xe0\x42\xb5\x9f\xa5\xc3\x34\x7e\x3f\x6a\xa8\x8a\x66\xfb\x0a\x64\x07\x41\xd1\x9e\xe7\xe7\xef\xc2\xeb\x8d\x09\x30\x89\xfd\xfd\x15\x00\xfa\xf8\xa2\x9d\xe6\x1f\xfe\xef\xfd\xf7\x9f\xa5\xc1\x47\xfe\x9f\x08\xfc\xbb\xf7\x22\x5d\xa6\x69\x7e\xf6\xdf\xe0\x90\x2f\x63\xb0\x5e\x67\x8d\xb7\xdf\x8a\x17\xf1\x90\x6f\x4f\x53\x59\x5e\x5f\x2f\xaf\x16\x5f\xe7\xeb\xf5\xd5\xe5\xc5\xfc\xf6\xf2\x7a\xf5\xf5\xe2\xcb\xe2\xe3\x62\x75\x7b\x39\xbf\xba\x79\x42\xaa\x45\xd7\xa4\xd7\x7a\x42\x6a\x26\xc6\x85\xa6\xcc\x04\x1f\xff\xe4\xbf\x4a\xf0\x6f\xbc\x27\x43\xf1\x21\x6f\xd6\xe5\x79\xe2\xc0\x84\xe5\xb5\x77\xfb\xa3\x97\xe7\x84\xfd\x71\x33\x87\xf2\x3b\xcb\x13\x8f\xcd\xc9\x8a\xa9\x8e\xba\xff\x68\xb9\x80\x3f\xfe\x7c\x7e\x7d\x5e\x2c\x53\xc8\x30\xe9\x31\x99\x6e\x6e\x75\xa4\x1c\xfd\x15\x00\x00\xff\xff\x21\xae\x34\xd9\x82\x09\x00\x00") +var _testE2eTestingManifestsStorageCsiGcePdController_ssYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xbc\x55\x51\x6b\x23\x47\x0c\x7e\xf7\xaf\x10\xee\xf3\xac\xe3\x94\x96\xb2\xe0\x07\x93\x33\x6e\xb8\x9c\x63\x2e\xa1\x7d\x3c\x94\x59\x79\x3d\xf5\xec\xcc\x56\xd2\x6e\xe2\x96\xfe\xf7\x32\xd9\x75\xba\x4e\x1c\x68\x0e\x92\x01\x83\xd1\xe8\xfb\x24\x7d\xd2\xac\x76\x2e\x14\x39\xdc\x28\x2a\x6d\x1a\x7f\x43\x3a\xc2\xda\xfd\x46\x2c\x2e\x86\x1c\xb0\xae\x65\xd2\x4e\x47\x15\x29\x16\xa8\x98\x8f\x00\x02\x56\x94\x83\x15\x67\x4a\x4b\xa6\x2e\x8c\x8d\x41\x39\x7a\x4f\x3c\x92\x9a\x6c\xf2\x11\xe2\xd6\x59\x5a\x3d\xba\x8e\xff\xf3\x1d\x8f\x00\x98\x6a\xef\x2c\x4a\x0e\xd3\x47\x4f\x4f\x56\x23\x27\x14\x40\x85\x6a\xb7\x57\x78\x47\x5e\x3a\x03\xa4\x14\x72\x28\x6d\x6d\x6c\xac\xea\x46\xc9\xd4\x29\x39\x51\x0a\x6a\x0a\x27\x3b\x93\xd8\x0b\x76\x2d\xf1\x08\x40\xa9\xaa\x3d\x2a\xf5\x74\x83\xb4\xd3\xf1\x47\xcc\x6f\xe5\x06\x38\x94\x97\xce\x0f\xf0\x6b\x14\x85\x40\x7a\x1f\x79\x07\x55\x23\x0a\x77\x04\x8d\x50\x01\x9b\xc8\xe0\x82\x12\xa3\x55\x17\x03\xdc\x3b\xdd\xc2\xef\x91\x77\x3e\x62\x01\x97\x05\x05\x75\xba\x07\x17\x60\xf9\x79\xf1\xc4\x27\x2e\x58\x02\xa7\x8f\x0a\xa1\x25\x81\xe5\xc5\x02\xbe\xf4\x35\xc0\x0d\x71\x4b\xdc\x71\x2d\x3f\xbf\xb8\xc8\xe0\x2b\x55\xb1\xa5\x27\x3a\xdd\x3a\x01\xa6\x3f\x1b\xc7\x54\x51\x50\xb8\xdf\x52\x00\x27\xd2\x10\x3c\xde\x48\xf4\x2d\x15\x80\xa1\x80\x3b\xda\x44\x26\xc0\xb0\x07\x7a\xa8\xa3\x34\x4c\x10\x37\x4f\x54\x15\x29\x3b\x2b\x50\x47\x56\xe9\xad\xdb\x28\xba\xea\x8a\xcf\x41\xb9\x39\x04\xee\x5b\x3f\xb7\x36\x36\x41\x57\xaf\x0f\x8b\x11\xec\x21\xc9\x86\x2e\x10\x0f\x5a\x63\x06\x73\x26\x01\x6b\xd9\x46\xd5\xbe\x0d\xdd\x71\x15\x96\x94\xc3\xee\x17\xc9\x4a\xcb\x99\x8b\x13\x71\xa5\x11\x8d\x8c\x25\x4d\x9e\xe1\xf2\xf6\xc7\xec\x2c\x3b\x1f\xc0\x91\xcb\x41\xb8\x2e\xe4\xd8\x98\x76\xf6\xd3\xf8\xa5\x35\xb1\x61\x51\x30\x89\xcc\x12\x75\xfa\x65\x12\xed\x6e\xfc\x3c\xa1\x75\xe3\xfd\x3a\x7a\x67\xf7\x39\xcc\xfd\x3d\xee\x65\xe0\xd1\x46\xdf\x54\xf4\x25\x09\xf3\x22\x76\x57\x6e\xe2\xa4\x34\x7c\x7c\x74\x0d\x50\x25\xd0\x1a\x75\x9b\x43\x0a\x7e\x52\xa7\x9a\x63\xeb\xd2\xc3\x7d\xa3\x4e\x03\x5c\xde\x4e\xb3\x9f\xb3\xb3\x77\xd5\xa9\xf7\xdd\x10\x6a\xc3\x64\x4a\x54\x92\xd9\x6d\xac\xa3\x8f\xe5\x7e\x96\x46\x69\xfc\x71\x9a\xa1\x2a\xda\xed\x1b\x05\x3b\x80\xf2\xf6\x3c\x3b\x7f\x67\xb5\xde\xb9\x7e\x26\x71\x7f\xbd\xb1\xfc\x1e\x93\x66\x65\xfa\x31\xb3\xb2\xc5\x50\x78\x32\x9d\x16\xc6\x85\x46\xc8\x10\x73\xe4\xd9\x06\xbd\x7c\xd4\xbc\xf4\x9f\xb0\xc1\x42\x38\x52\xac\x57\xab\xdc\x91\x61\xf2\x84\x42\x93\xff\xb7\x5b\x92\x90\x67\xd9\xd4\x94\x3b\xfa\x7e\x39\x29\x14\x75\x74\x41\x67\x4d\x70\x0f\xf9\xab\x82\x52\x68\x4f\xab\xb2\xbc\xbe\x5e\x5e\x2d\xbe\xcd\xd7\xeb\xab\xcb\x8b\xf9\xed\xe5\xf5\xea\xdb\xc5\xd7\xc5\xa7\xc5\xea\xf6\x72\x7e\x75\xf3\x4c\xa9\x16\x7d\x93\x36\xfb\x84\xd4\x4e\xac\x8f\x4d\x61\x04\x9f\xfe\x64\x7f\x48\x0c\xef\xdc\x93\x21\xf8\x10\xb7\x9f\x8f\x67\x0c\x4c\x58\x5c\x07\xbf\x3f\xda\x52\x27\xe8\x8f\x8b\x39\xa4\xdf\x51\x9e\x58\x4c\x27\x33\xa6\xaa\xd6\xfd\x27\xc7\x39\xfc\xfd\xcf\xcb\xe7\xf6\x6a\x9a\x42\x96\x49\x8f\x95\xe9\x6c\xab\x23\xe4\xe8\xdf\x00\x00\x00\xff\xff\x29\xdb\x32\x41\xae\x09\x00\x00") func testE2eTestingManifestsStorageCsiGcePdController_ssYamlBytes() ([]byte, error) { return bindataRead( @@ -2421,7 +2477,7 @@ func testE2eTestingManifestsStorageCsiGcePdCsiControllerRbacYaml() (*asset, erro return a, nil } -var _testE2eTestingManifestsStorageCsiGcePdNode_dsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x57\x5f\x6f\xe3\xb6\x13\x7c\xf7\xa7\x58\xf8\x5e\x7f\x92\xee\xf0\x43\x51\x40\x40\x1e\x7a\x17\x37\x2d\xd2\xe4\x8a\xcb\xb5\x7d\x28\x8a\x80\x26\xc7\x12\x61\x8a\x64\xc9\x95\x62\x7f\xfb\x82\x96\xed\xf8\x8f\xac\x24\xed\x11\x48\x60\x90\xdc\xd9\x21\x77\x66\x4d\x2f\xb5\x55\x25\x5d\x0b\x34\xce\x3e\x80\x27\xc2\xeb\xdf\x11\xa2\x76\xb6\x24\xe1\x7d\x2c\xba\x0f\x93\x06\x2c\x94\x60\x51\x4e\x88\xac\x68\x50\x92\x8c\x3a\xab\x24\x32\xaf\x32\xeb\x14\x26\xd1\x43\xa6\xd5\x08\x03\xc9\x2e\xa4\xcf\x44\x8d\x60\x59\xff\x22\xe6\x30\xb1\x9f\xa0\x04\x59\x52\x25\x7d\x26\x5d\xe3\x5b\x46\xe6\x53\xb2\xc8\xb0\x9c\x29\x1d\x97\x59\x42\x56\x41\x77\x08\x13\x22\x46\xe3\x8d\x60\x6c\xe1\x0e\x68\xa4\x61\x8e\x90\xdf\x8a\x4d\xb4\x23\x9d\xc6\x3b\xfa\xc9\x45\x26\x0b\x7e\x72\x61\x49\x4d\x1b\x99\xe6\xa0\x36\x42\xd1\xc2\x05\xd2\x96\x11\x84\x64\xed\x2c\x3d\x69\xae\xe9\x0f\x17\x96\xc6\x09\x45\x3f\x2b\x58\xd6\xbc\x26\x6d\xe9\xe6\x76\xb6\xc7\x8b\xda\x4a\x90\x66\x0a\xf0\x46\x48\x44\xba\xf9\x34\xa3\xbb\xed\x19\xe8\x01\xa1\x43\xe8\xb1\x6e\x6e\xcf\x16\x72\xfa\x82\xc6\x75\xd8\xc3\x71\xad\x23\x05\xfc\xdd\xea\x80\x06\x96\xe9\xa9\x86\x25\x1d\x63\x0b\xda\xac\x44\x67\x3a\x28\x12\x56\xd1\x1c\x0b\x17\x40\xc2\xae\x09\x2b\xef\x62\x1b\x40\x6e\xb1\x87\x6a\xc0\x41\xcb\x48\xde\x05\x8e\xf9\x76\xba\x76\x91\xef\xfb\xd3\x97\xc4\xa1\xdd\x65\x96\xce\xb2\xd0\x16\xe1\xe0\xa2\xb3\x03\x15\xf4\xf7\x99\x05\x54\x3a\x72\x10\x61\xbf\x89\x48\x37\xa2\x42\xaa\x48\xc8\xb5\x2b\xaa\x25\xb2\x00\x03\x11\x51\xa4\xc0\xa4\x9b\xb3\xe8\xb2\xfb\x90\xff\x3f\x7f\x9f\x55\x4b\xe4\xef\x0f\xa0\x44\xa8\x0e\xf2\xf7\x1c\xa6\x59\xd6\x5d\x7d\x37\x3d\x9f\x4d\xe8\x42\xa9\x80\x18\xaf\x52\xaa\xf4\x97\x47\x27\x97\x03\x7b\x97\xed\x1c\x06\xbc\x67\x90\x0a\x9c\x79\xc1\xf5\x55\xd1\x89\x50\x18\x3d\x2f\xb6\x5b\x0a\x6f\xda\x4a\xdb\x58\x78\x95\x6f\x00\xd9\x05\x51\x21\x4f\x54\xb5\x1b\xcc\x61\xf4\x02\x72\x2d\x0d\x8e\xa9\xfb\x80\x07\x76\xfe\x78\x92\x08\xab\x67\x39\x3e\x0f\xe9\x9a\x46\x24\x8b\xfe\x39\x2d\xe6\xda\x16\xb1\x9e\xfe\x8f\xa6\x99\x4c\xff\x43\x43\x59\x58\x50\x71\x48\x7e\x98\xde\x6b\xf6\xa4\x3b\xe8\x8f\xf0\xd7\x01\x0b\xd8\xee\xf4\xe2\xfb\xe2\xdf\xfe\xf6\x71\xf6\x78\xff\xf9\x7a\xf6\x78\xff\xc3\xdd\xec\x84\x77\x27\x4c\x8b\x1f\x83\x6b\xce\x0f\xb4\xd0\x30\xea\x0b\x16\xe7\x2b\xdb\xb5\x5f\x05\xd7\xe5\xc6\x9c\x79\xd2\xc8\xbd\x68\x70\xb0\xb5\x73\xa6\x6d\x70\xe7\x5a\xcb\x67\x8a\xe8\x89\xf5\x75\xca\x94\x0e\x27\x19\x9a\x14\xd4\xa3\xa7\x72\x0d\x06\x1f\xe9\x60\x1c\xe2\x70\xeb\x99\x35\xb6\xcd\xf1\xa0\xdb\xf4\x23\x42\xb6\x41\xf3\xfa\x93\xb3\x8c\x15\x9f\x0a\x43\x77\xda\xa0\x82\x3a\xb2\x20\x8d\x7a\xe9\x75\x0d\xaf\xec\xde\xe7\xdf\xff\x57\x63\xc1\x2a\xef\xb4\xe5\xab\xd6\xea\x55\x79\xd1\x5a\x2f\x97\x68\xe7\xba\xf1\x0b\x3e\x31\xe0\xe0\xce\xe0\xbc\xa8\x36\x25\x28\x69\xfa\x51\x2b\x1d\xb0\x69\xd2\xc2\x9c\xf2\xff\x06\xe2\x50\xe8\xb4\xc4\x0b\xc1\x0a\xdd\xd1\xea\x3b\xfa\x5a\x83\x16\xce\x18\xf7\xa4\x6d\xd5\xef\x8d\x24\x02\x76\xed\x5c\x11\x3b\xe2\xa0\xab\x0a\x61\xd3\x87\xa9\x55\xe8\x84\x6a\x68\x11\x5c\x73\x02\xb6\xef\xc7\x83\x0c\x53\x60\x16\x5a\x83\x98\x81\xe5\x08\x4b\xb0\x2c\xda\x53\xaa\x03\x28\x46\xcf\x47\x50\x52\x75\xc6\x51\x92\x36\x2e\x94\x6e\xeb\xa2\xd6\x5e\x86\x88\xeb\x38\x12\xfa\xbc\xda\x2b\x6e\xe0\x1b\x6a\xc4\xce\xe9\xa2\x37\x40\xc7\x16\x1c\x94\xde\xae\xf7\x3f\x6e\xf1\xd6\xc5\x51\x10\xaf\x3d\x4a\xba\xde\x68\xcf\x85\xf5\x19\x8b\x61\xb9\xbf\x85\xc0\x9b\xd2\x0d\x6a\xfc\xdf\x1c\xf7\xc2\x57\xdd\x18\x99\xcf\xe1\x53\x80\x60\x9c\x91\x1a\xf4\xce\x28\xa9\x53\x51\x5c\x3a\xf6\x37\x33\xd8\x90\xb9\x5e\x34\xd6\xe8\x11\x06\x5d\xf6\x52\xf9\x2e\xba\x6f\x34\xd5\xa0\x15\x5f\x95\xea\xcc\xa2\xa3\x79\x06\xfd\xfa\x52\x9e\x63\x1f\x8f\xe2\x9f\x5a\x7e\x18\xfa\x1d\xd5\xcc\x3e\x96\xc5\x46\xb2\xc1\x82\x11\x93\x34\x95\x93\xb1\x90\xce\x4a\x78\xde\x7c\x58\xe8\xaa\xdd\x3e\x7a\x52\x65\x39\x13\x56\x65\xec\x0c\xb6\x93\x7b\xbc\x07\x80\xa6\xe9\xd1\xa1\x85\x21\x29\x22\xa6\x39\x7d\x4d\x6f\xee\x27\x6d\x0c\x6d\x23\x40\xe8\x10\xd6\x5c\x6b\x5b\xe5\x74\xef\x14\xd2\xfb\xcc\x3b\x9b\x1e\xe4\xb1\x76\xad\x51\x7b\xc0\x39\x28\xca\x1a\xaa\x35\x50\xe4\x2c\x09\x63\x28\xbd\x67\xf6\x2f\xee\x67\x16\xfb\xc6\x95\x91\xf3\x69\xce\x85\x92\x66\x2b\x1d\x79\x77\x17\x29\xf0\xe1\xe8\xb7\x55\x1a\xc7\x67\x77\xb1\x24\xa3\x6d\xbb\x9a\xfc\x13\x00\x00\xff\xff\xd3\x16\xd5\xf9\xd4\x0d\x00\x00") +var _testE2eTestingManifestsStorageCsiGcePdNode_dsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x57\x5d\x8f\xdb\x36\x10\x7c\xf7\xaf\x58\x38\xaf\x95\x94\xa0\x28\x5a\x08\xb8\x87\x26\x71\xd3\x22\xcd\xa5\xc8\xa5\xed\x43\x51\x04\x34\x39\x96\x08\x53\x24\x4b\xae\x74\xf6\xbf\x2f\x68\xc9\x3e\x7f\xc8\xba\xbb\x20\x04\xee\x60\xf0\x63\x76\x96\x3b\xb3\xa6\xd7\xda\xaa\x92\xde\x0a\x34\xce\xde\x81\x67\xc2\xeb\xbf\x10\xa2\x76\xb6\x24\xe1\x7d\x2c\xba\x57\xb3\x06\x2c\x94\x60\x51\xce\x88\xac\x68\x50\x92\x8c\x3a\xab\x24\x32\xaf\x32\xeb\x14\x66\xd1\x43\xa6\xd5\x08\x03\xc9\x2e\xa4\xcf\x44\x8d\x60\x59\xff\x2e\x96\x30\xb1\x9f\xa0\x04\x59\x52\x25\x7d\x26\x5d\xe3\x5b\x46\xe6\x53\xb0\xc8\xb0\x9c\x29\x1d\xd7\x59\x42\x56\x41\x77\x08\x33\x22\x46\xe3\x8d\x60\x0c\x70\x47\x34\xd2\x30\x27\xc8\xcf\xc5\x26\xda\x93\x4e\xe3\x05\xfd\xea\x22\x93\x05\xdf\xbb\xb0\xa6\xa6\x8d\x4c\x4b\x50\x1b\xa1\x68\xe5\x02\x69\xcb\x08\x42\xb2\x76\x96\xee\x35\xd7\xf4\xb7\x0b\x6b\xe3\x84\xa2\xdf\x14\x2c\x6b\xde\x92\xb6\xf4\xee\xfd\xe2\x80\x17\xb5\x95\x20\xcd\x14\xe0\x8d\x90\x88\xf4\xee\xcd\x82\x3e\x0c\x39\xd0\x1d\x42\x87\xd0\x63\xbd\x7b\x7f\xb1\x90\xd3\x27\x34\xae\xc3\x01\x8e\x6b\x1d\x29\xe0\xbf\x56\x07\x34\xb0\x4c\xf7\x35\x2c\xe9\x18\x5b\xd0\x6e\x25\x3a\xd3\x41\x91\xb0\x8a\x96\x58\xb9\x00\x12\x76\x4b\xd8\x78\x17\xdb\x00\x72\xab\x03\x54\x03\x0e\x5a\x46\xf2\x2e\x70\xcc\x87\xe9\xda\x45\xbe\xed\xb3\x2f\x89\x43\xbb\x8f\x2c\x9d\x65\xa1\x2d\xc2\xd1\x45\x67\x47\x2a\xe8\xef\x33\x0b\xa8\x74\xe4\x20\xc2\x61\x13\x91\x6e\x44\x85\x92\xd6\x3f\xc5\xbc\x92\x21\xd7\xae\x88\xba\xca\x22\xbb\x20\x2a\x14\xe9\x70\xd2\xce\x05\x42\xd9\xbd\xca\xbf\xcf\x5f\x1e\x01\x89\x50\x1d\x45\xef\x19\xcc\xb3\xac\xbb\xf9\x61\x7e\x39\x9b\x70\x85\x52\x01\x31\xde\xa4\x20\xe9\x2f\x8f\x4e\xae\x47\xf6\xae\xdb\x25\x0c\xf8\x10\x3b\x95\x37\xf3\x82\xeb\x9b\xa2\x13\xa1\x30\x7a\x59\x0c\x5b\x0a\x6f\xda\x4a\xdb\x58\x78\x95\xef\x00\xfb\x2c\xf2\x6a\x8d\x94\xd8\x58\x0c\xa3\x57\x90\x5b\x69\x70\x4a\xdd\x07\xdc\xb1\xf3\xa7\x93\x44\xd8\x3c\x88\xf1\x61\x48\xd7\x34\x22\x19\xf4\x9f\x79\xb1\xd4\xb6\x88\xf5\xfc\x3b\x9a\x67\x32\xfd\x0f\x0d\x65\x61\x45\xc5\x31\xf9\x71\x7a\x4f\xd9\x93\xee\xa0\x4f\xe1\xdf\x23\x16\xb0\xdd\xf9\xc5\xf7\xa5\x7f\xff\xe7\xeb\xc5\x97\xdb\x8f\x6f\x17\x5f\x6e\x7f\xfe\xb0\x38\xe3\xdd\x09\xd3\xe2\x97\xe0\x9a\xcb\x84\x56\x1a\x46\x7d\xc2\xea\x72\x65\x58\xfb\x43\x70\x5d\xee\xac\x99\x27\x75\xdc\x8a\x06\x47\x5b\x3b\x67\xda\x06\x1f\x5c\x6b\xf9\x42\x11\x3d\xb1\xbe\x4e\x99\xd2\xe1\x2c\x42\x93\x0e\xf5\xe8\xa9\x5c\xa3\x87\x4f\x74\x30\x0d\x71\xbc\xf5\xc2\x18\x43\x6b\x3c\xea\x35\xfd\x88\x90\x6d\xd0\xbc\x7d\xe3\x2c\x63\xc3\xe7\xc2\xd0\x9d\x36\xa8\xa0\x4e\x0c\x48\x0f\x4e\x1a\x5c\x54\xad\x91\x05\x18\x88\x88\xe2\x69\xed\xae\xec\x5e\xe6\x3f\xe6\x2f\xb3\x54\xea\xaf\x36\x16\xac\xf2\x4e\x5b\xbe\x69\xad\xde\x94\x57\xad\xf5\x78\x89\xf6\xae\x9b\xbe\xe0\x33\x03\x8e\xee\x0c\xce\x8b\x6a\x57\x82\x92\xe6\xaf\xb5\xd2\x01\xbb\x16\x2d\xcc\x39\xff\x6f\x20\x0e\x85\x4e\x4b\x3c\x72\x58\xa1\x3b\x59\x7d\x41\x9f\x6b\xd0\xca\x19\xe3\xee\xb5\xad\xfa\xbd\x91\x44\xc0\xbe\x99\x2b\x62\x47\x1c\x74\x55\x21\xec\xba\x30\xb5\x0a\x9d\x50\x0d\xad\x82\x6b\xce\xc0\x0e\xdd\x78\x94\x61\x3a\x98\x85\xd6\x20\x66\x60\x39\xc1\x12\x2c\x8b\xf6\x9c\xea\x08\x8a\xd1\xcb\x09\x94\x54\x9d\x69\x94\xa4\x8d\x2b\xa5\x1b\x5c\xd4\xda\xeb\x10\x71\x1b\x27\x8e\x3e\xac\xf6\x8a\x1b\xf9\x7e\x9a\xb0\x73\xba\xe8\x1d\xd0\xa9\x05\x47\xa5\xb7\xef\xfd\x5f\x06\xbc\x6d\x71\x72\x88\xb7\x1e\x25\xbd\xdd\x69\xcf\x85\xed\x05\x8b\x71\xb9\x3f\x87\xc0\xb3\xc2\x8d\x6a\xfc\x6b\xd2\xbd\xf2\x55\x37\x45\xe6\x63\x78\x13\x20\x18\x17\xa4\x46\xbd\x33\x49\xea\x5c\x14\xd7\xd2\xfe\x66\x06\x1b\x33\xd7\xa3\xc6\x9a\x4c\x61\xd4\x65\x8f\x95\xef\xaa\xfb\x26\x43\x8d\x5a\xf1\x49\xa1\x2e\x2c\x3a\x19\x67\xd4\xaf\x8f\xc5\x39\xf5\xf1\x24\xfe\xb9\xe5\xc7\xa1\x5f\x50\xcd\xec\x63\x59\xec\x24\x1b\x2c\x18\x31\x49\x53\x39\x19\x0b\xe9\xac\x84\xe7\xdd\x87\x95\xae\xda\xe1\xd1\x93\x2a\xcb\x99\xb0\x2a\x63\x67\x30\x4c\x1e\xf0\xee\x00\x9a\xa7\x47\x87\x16\x86\xa4\x88\x98\xe7\xf4\x39\xbd\xb8\xef\xb5\x31\x34\x9c\x00\xa1\x43\xd8\x72\xad\x6d\x95\xd3\xad\x53\x48\xef\x33\xef\x6c\x7a\x8e\xc7\xda\xb5\x46\x1d\x00\x97\xa0\x28\x6b\xa8\xd6\x40\x91\xb3\x24\x8c\xa1\xf4\x9e\x39\xbc\xb7\x1f\x58\x1c\x1a\x57\x46\xce\xa7\x39\x17\x4a\x5a\x6c\x74\xe4\xfd\x5d\xa4\x83\x77\x27\xbf\xac\xd2\x38\xcd\xdd\xc5\x92\x8c\xb6\xed\x66\xf6\x7f\x00\x00\x00\xff\xff\xd4\xd5\xd3\xa2\xd2\x0d\x00\x00") func testE2eTestingManifestsStorageCsiGcePdNode_dsYamlBytes() ([]byte, error) { return bindataRead( @@ -2661,7 +2717,7 @@ func testE2eTestingManifestsStorageCsiMockCsiMockDriverSnapshotterYaml() (*asset return a, nil } -var _testE2eTestingManifestsStorageCsiMockCsiMockDriverYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xe4\x55\x4d\x8f\xe3\x36\x0c\xbd\xe7\x57\x10\xd9\x1e\x76\x0f\xb6\x37\xdd\xb6\x28\x0c\xe4\x30\x9b\xa4\xc0\xa2\x9d\xcc\x60\xb2\xed\x35\x50\x24\x46\x11\x22\x4b\x82\x44\x1b\xcd\xbf\x2f\x64\x7b\x76\xfd\x95\xcc\x4c\x7b\x6c\x80\x00\xb6\x44\x3e\x92\x8f\x8f\xf4\x59\x19\x91\xc3\x8e\x18\xe1\xb1\xd4\x3b\xa4\x19\x73\xea\x2f\xf4\x41\x59\x93\x03\x73\x2e\x64\xd5\x62\x56\x20\x31\xc1\x88\xe5\x33\x00\xc3\x0a\xcc\x81\x07\x95\x14\x96\x9f\x9d\x2e\xa5\x32\xb3\xe0\x90\xc7\xcb\x80\x1a\x39\x59\x1f\x9f\x01\x0a\x46\xfc\xf4\x07\x3b\xa0\x0e\xcd\x01\x44\xc4\x91\x33\x80\x47\xa7\x15\x67\x21\x87\xc5\x0c\x80\xb0\x70\x9a\x11\xb6\x20\x9d\xd8\xf1\xa7\x7b\x78\xd7\x10\x01\x9e\x53\xaa\x9f\xd1\x57\x8a\xe3\x1d\xe7\xb6\x34\xb4\xed\x55\xd0\x9a\x70\x6b\x88\x29\x83\xbe\x03\x9d\x74\x8a\x75\xde\x56\x2a\xb2\x82\xfe\xdb\x3d\x80\x2a\x98\xc4\x1c\xce\xbf\x86\x54\x72\x9f\x2a\x9b\x05\x25\x93\x40\xd6\x33\x89\xd9\xc0\x2f\xaf\x16\xe9\x2f\xe9\xc7\x8e\x3b\xf3\xb2\x13\xae\x09\x39\x4f\x92\xe8\xc7\x84\xf0\x18\xc2\xf2\x87\xf7\x77\xeb\xf5\xd3\x66\xb7\xfb\x30\xef\x19\xbe\x83\xaf\xd6\x59\x6d\xe5\x05\x42\xe9\x9c\xf5\x04\x2a\x80\x41\x14\x28\xe0\x68\x3d\xd0\x09\xc1\x59\x01\x1e\x03\x3f\xa1\x28\xb5\x32\x12\x08\x03\x0d\x60\xde\xcf\xdb\x74\x81\x33\xc7\xb8\xa2\xcb\x1c\x94\x89\x35\xef\x23\x3d\xfb\xca\xea\xb2\xc0\x54\xda\x0f\xe9\x38\xd3\x23\x32\x2a\x3d\x26\x92\x11\x86\xe5\x73\x46\x4b\xf2\x25\xce\x47\xd6\xd5\xf2\xe7\xee\x21\x9a\x6a\x58\x7b\x43\x77\x5b\x70\xef\x0e\xa0\x62\xba\xc4\x1c\x22\xa9\xf1\x9f\x86\xef\xbd\xab\xaf\xeb\x34\xef\x63\x7f\x47\x94\x16\xf1\xf4\x91\xd1\xa9\x71\x1f\x00\x37\x41\x23\x1c\x52\x22\x94\x1f\xb5\x5f\x78\x55\xa1\x4f\x3c\x4a\x15\xc8\xb3\xb7\xf5\xdf\x58\x81\xc9\x10\x21\x2a\xe1\xd3\x8b\x4a\x48\x22\x63\xa3\xb3\xae\x38\xae\x91\xd1\x58\x9e\xcb\x03\x6a\xa4\x6f\x61\x49\x59\x93\x38\x46\xa7\x65\x56\x31\x9f\x69\x75\xc8\x5a\x93\xac\x99\x9b\x90\x3d\x0f\xc5\x14\xe8\xd5\x7e\xfd\xfe\xe7\xe7\xcd\x7e\xfb\xb0\xde\xec\xb7\x77\xf7\x9b\xa9\xb6\xfd\xe6\x6d\x91\x0f\x2e\x00\x8e\x0a\xb5\x78\xc2\xe3\xf8\x26\x4e\xf5\xf7\x2d\x54\x2d\x26\x0c\x6a\xe7\xa6\xa7\x71\xd2\xd3\xc8\x73\x1c\xec\x8e\x69\x40\x5e\x7a\x45\x97\x95\x35\x84\x7f\x53\x3f\x8c\xf3\xaa\x52\x1a\x25\x8a\x1c\xa2\x5c\x5f\x21\xa5\xdb\x42\xba\x2a\xa3\xa1\x63\xb7\x1d\x13\x08\xbd\x6e\x4d\xc9\xb1\xe8\xb7\xe5\xb6\x04\xa3\x71\x2b\xbf\xbc\xfa\x29\xfd\x98\xfe\xf8\xf2\xfa\x89\x61\x96\xd1\x31\x6d\x51\xd2\x08\xae\xec\xd4\x44\x7f\x9a\xc3\x3b\x40\xc3\x0e\x1a\x45\xbd\x72\xe4\xd3\xe3\x0a\x38\xd3\x1a\xb4\x95\x52\x19\xf9\x1a\x05\xad\x76\x5f\xf6\x9b\xed\xfa\xf1\xe1\xcb\xf6\xeb\xdb\xc6\xfe\xff\xa7\xc2\xff\xb0\xd0\xc6\xce\xa3\x3d\x60\x45\x18\xa0\x35\xe6\xde\x3a\x26\x6b\x4d\xe6\xf0\x59\x09\xe5\x91\xc7\x17\xa6\x27\x63\xd7\x3e\xce\x2a\x33\x15\xbf\x31\x39\x59\x7b\x9e\x0e\xd5\x64\x86\xc4\xb3\xae\x4d\x43\x47\xef\xe3\x7c\xb2\xa1\xb1\xee\x53\x7a\xa5\xb2\xc1\x86\xeb\xf9\xd0\xc5\x61\x0e\xeb\xba\x2a\xeb\x2f\x0f\x7e\xe5\x91\x51\xb7\x1b\x37\x3e\x12\x6f\x4b\x63\x48\xf0\x6b\x43\x5f\xa1\xf4\xdf\xb1\xb0\x6f\x97\xcc\xe5\x56\x2a\xa3\x14\x5e\xdc\x4c\xc3\x9e\x72\x6b\x8e\x4a\xde\x33\x97\x4f\xec\xb9\xce\x66\x4a\x1a\xc7\x7f\x02\x00\x00\xff\xff\x9d\xb0\x16\xbb\x8c\x0a\x00\x00") +var _testE2eTestingManifestsStorageCsiMockCsiMockDriverYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xe4\x56\xdf\x6f\xdb\x36\x10\x7e\xcf\x5f\x71\x70\x07\xac\x7d\x90\xbc\x6c\x1d\x30\x08\xf0\x43\x9a\xa4\x43\xb1\xd5\x09\xe2\x6e\x7b\x34\x18\xf2\x4c\x11\xa6\x48\xe1\x78\x52\xeb\xff\x7e\xa0\x24\xc7\xd6\x0f\x1b\x4e\xf7\x38\x01\x06\x64\xf1\xee\xbb\xe3\x7d\x9f\x3e\x6a\x6b\x9c\xca\x60\xc5\x82\x71\x53\xd9\x15\xf2\x95\x28\xcd\xdf\x48\xc1\x78\x97\x81\x28\xcb\x30\xaf\xaf\xaf\x0a\x64\xa1\x04\x8b\xec\x0a\xc0\x89\x02\x33\x90\xc1\x24\x85\x97\xdb\xd2\x56\xda\xb8\xab\x50\xa2\x8c\x8b\x01\x2d\x4a\xf6\x14\xef\x01\x0a\xc1\x32\xff\x53\x3c\xa3\x0d\xed\x03\x88\x88\xa3\x64\x00\xc2\xd2\x1a\x29\x42\x06\xd7\x57\x00\x8c\x45\x69\x05\x63\x07\x72\x54\x3b\x5e\xb6\x87\x77\x0a\x11\x60\xdf\x52\x73\x8f\x54\x1b\x89\x37\x52\xfa\xca\xf1\xb2\xb7\x83\x2e\x44\x7a\xc7\xc2\x38\xa4\x23\xe8\xe4\x68\xb3\x25\xf9\xda\xc4\xa9\x20\xbd\xac\x03\x98\x42\x68\xcc\x60\xfb\x5b\x48\xb5\xa4\xd4\xf8\x79\x30\x3a\x09\xec\x49\x68\x9c\x0f\xf2\xb2\xfa\xe7\xf4\x3a\xfd\xe9\x28\x5d\x90\x3e\x2a\xd7\x96\x9c\x25\x49\xcc\x13\x4a\x11\x86\xb0\xf8\xe1\xed\xcd\xdd\xdd\xd3\xfd\x6a\xf5\x6e\xd6\x0b\x7c\x03\x5f\x7c\xe9\xad\xd7\x3b\x08\x55\x59\x7a\x62\x30\x01\x1c\xa2\x42\x05\x1b\x4f\xc0\x39\x42\xe9\x15\x10\x06\x99\xa3\xaa\xac\x71\x1a\x18\x03\x0f\x60\xde\xce\xba\x76\x41\x8a\x52\x48\xc3\xbb\x19\x18\x17\xf7\xbc\x8e\xe3\x59\xd7\xde\x56\x05\xa6\xda\xbf\x4b\xc7\x9d\x6e\x50\x70\x45\x98\x68\xc1\x18\x16\xfb\x8e\x16\x4c\x15\xce\x46\xd1\xf5\xe2\xd7\xe1\x1e\x96\x87\x7e\x37\xe1\x77\xf2\x55\xb9\xdf\xcd\x44\x31\x85\x1b\x51\x59\x4e\x36\x81\x77\x25\x2e\xf0\x1b\xbf\x1f\xe2\xfd\x83\xa0\xbc\xfb\x91\x9b\x41\x40\x51\xc9\x3c\x12\x2b\x2b\x22\x74\x72\x07\xc2\x29\xc8\x45\x1d\x27\x51\x08\xb7\x03\xed\x2b\xf2\x15\x1b\x87\x61\x00\x54\x88\x2d\x06\xd8\x5a\xaf\xd3\x8f\x82\x85\x05\x55\x51\x4c\x0b\x79\xc5\xca\x7f\x75\x50\x23\xed\xc0\x7a\xa7\x27\x1a\xfd\xea\x69\x8b\x94\x70\x4e\x28\x54\xe8\xef\x1a\x5d\x3d\x64\xbc\x15\x59\x47\x73\x6f\x0d\xa0\x16\xb6\xc2\x0c\xa2\x94\xe2\x2f\x0d\x07\xc5\x36\xcb\x0d\x39\x9f\xa3\xaa\x47\x42\x2a\xe2\xd3\x47\xc1\x79\x9b\x3e\x00\x6e\x8b\x46\x38\xe4\x44\x19\x1a\x89\x5e\x91\xa9\x91\x12\x42\x6d\x02\x93\x78\x9d\xea\x9d\x57\x98\x0c\x11\x2e\xd3\x7f\x12\x75\x32\x7a\x76\xfc\x4a\x9c\x1a\x46\x1b\xb9\xad\x9e\xd1\x22\xbf\x94\x65\xe3\x5d\x52\x0a\xce\x17\xf3\x5a\xd0\xdc\x9a\xe7\x79\x17\x32\x6f\xdd\x22\xcc\xf7\x56\x30\x05\x7a\x92\xaf\x3f\xfe\xfa\x70\xbf\x5e\x3e\xdc\xdd\xaf\x97\x37\x9f\xef\xa7\x68\xfb\x48\xbe\xc8\x06\x0b\x00\x1b\x83\x56\x3d\xe1\x66\xbc\x12\xbd\xec\xe0\xbd\xf5\xf5\x44\x40\x93\xdc\x72\x1a\xfd\x2d\x8d\x73\x8e\x76\x76\x14\x1a\x50\x56\x64\x78\x77\xeb\x1d\xe3\x37\xee\x97\x29\xc9\xd4\xc6\xa2\x46\x95\x41\x7c\x49\x2f\x90\xd2\x79\x21\x9d\x94\xd1\x30\xf1\x98\x8e\x09\x84\x1e\x5b\x53\x72\x2c\xfa\xb4\x9c\x97\x60\x0c\xee\xe4\x97\xd5\xef\x2f\x33\xdd\x58\x66\x11\x13\xd3\x0e\x25\x8d\xe0\xc6\x4f\xf9\xd8\x2f\x33\x78\x03\xe8\xc4\xb3\x45\xd5\x18\xad\x7e\x7a\xbc\x05\x29\xac\x05\xeb\xb5\x36\x4e\x5f\xa2\xa0\xdb\xd5\xa7\xf5\xfd\xf2\xee\xf1\xe1\xd3\xf2\xcb\xeb\x5e\xfb\xff\x9f\x0a\xff\x83\xa1\x8d\x93\x47\x3e\xe0\x55\x98\x44\xdb\x7b\x49\x0c\x78\x2d\x66\xe7\x2d\xf1\x3f\x39\x64\x8c\x5a\x3a\xd9\xf6\xbe\x50\x74\xa2\x43\x9d\x76\x18\xbd\x0f\x92\xdc\x87\xb6\x62\x7f\xa0\xe7\x7b\x18\x7c\xea\xb4\x57\x3c\x43\x33\xb8\x33\xd4\x7c\xb0\xed\x1e\xe8\x96\x50\xf0\x31\x17\x67\x8e\x88\xd7\xb5\x31\x1c\xef\xa0\xf4\xf0\xe8\xf5\x72\xdb\x9d\x3e\xa0\x3c\x86\x78\x9c\xc7\xe3\xb8\x1d\x77\x68\x0e\x71\xce\x91\x70\xe3\x09\x5f\x22\xda\x03\x3f\x46\x40\x49\xbe\x14\xba\xb1\x92\x74\x84\x1d\x19\x3b\xac\x67\xf0\xc1\xa8\xa6\x0f\xe3\x9d\xb0\xa3\xcd\x9f\x14\xc0\x77\x32\x71\x5e\x0d\x97\x52\x32\xad\x96\xef\x6d\x6a\xdd\x79\xef\xee\x42\x8e\x4e\x18\xf6\xbf\x01\x00\x00\xff\xff\x8b\x31\x3d\x58\x4a\x0c\x00\x00") func testE2eTestingManifestsStorageCsiMockCsiMockDriverYamlBytes() ([]byte, error) { return bindataRead( @@ -2701,6 +2757,26 @@ func testE2eTestingManifestsStorageCsiMockCsiMockDriverinfoYaml() (*asset, error return a, nil } +var _testE2eTestingManifestsStorageCsiMockCsiMockProxyYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xb4\x56\x61\x6f\xdb\x38\x0f\xfe\xde\x5f\x41\xb4\x2f\xf0\x6e\xc0\x9c\x34\xdb\x0e\xb8\x19\xc8\x87\xad\xed\xee\x86\xbb\x75\xc5\xba\xbb\xfb\x58\x28\x16\x63\x0b\x91\x25\x83\xa4\xdc\xfa\xdf\x1f\x64\x3b\x8d\x63\x27\x5d\x37\xe0\x0c\x14\x48\x25\xea\x21\x45\x3e\x7a\xc8\x8d\x71\x3a\x85\x5b\x51\x82\xeb\x60\x6f\x51\x4e\x54\x65\xfe\x46\x62\xe3\x5d\x0a\xaa\xaa\x78\x5e\x2f\x4e\x4a\x14\xa5\x95\xa8\xf4\x04\xc0\xa9\x12\x53\xc8\xd8\x24\xa5\xcf\x36\x95\x0d\xb9\x71\x27\x5c\x61\x16\x37\x19\x2d\x66\xe2\x29\xfe\x06\x28\x95\x64\xc5\x9f\x6a\x85\x96\xbb\x05\x88\x88\x93\xc3\x00\x84\x95\x35\x99\xe2\x14\x16\x27\x00\x82\x65\x65\x95\x60\x0f\x32\xf0\x1d\x3f\xbb\x87\x77\x0c\x11\x60\x1b\x52\xfb\x1b\xa9\x36\x19\xbe\xcf\x32\x1f\x9c\x5c\xef\xdd\xa0\x37\xc9\xbc\x13\x65\x1c\xd2\x00\x3a\x19\x5c\xb6\x22\x5f\x9b\x98\x15\xa4\xc7\x7d\x00\x53\xaa\x1c\x53\xd8\xfc\xca\xb3\x3c\xa3\x99\xf1\x73\x36\x79\xc2\xe2\x49\xe5\x38\x1f\x9d\x4b\xeb\xd7\xb3\xc5\xec\x7c\x70\x5c\x51\x3e\x70\xd7\xb9\x3c\x4d\x92\x78\x4e\x69\x4d\xc8\xbc\xfc\xdf\x8b\xf7\x97\x97\x5f\xaf\x6e\x6f\x5f\x9e\xee\x19\x9e\xc1\x37\x5f\x79\xeb\xf3\x06\x38\x54\x95\x27\x01\xc3\xe0\x10\x35\x6a\x58\x7b\x02\x29\x10\x2a\xaf\x81\x90\xb3\x02\x75\xb0\xc6\xe5\x20\xc8\x32\x82\x79\x71\xda\x87\x0b\x99\xaa\x54\x66\xa4\x39\x05\xe3\xe2\x9d\xef\x62\x7a\xee\x6a\x6f\x43\x89\xb3\xdc\xbf\x9c\x4d\x23\x5d\xa3\x92\x40\x98\xe4\x4a\x90\x97\xdb\x88\x96\x42\x01\x4f\x27\xd6\xf5\xf2\x97\xe9\x62\x22\xa6\x44\x1f\x64\xb9\x28\xc7\x17\xbc\xde\x5d\x66\xcd\xbf\x91\x0f\xd5\xf6\xaa\x07\x22\xd1\xb8\x56\xc1\x4a\xb2\x66\x69\x2a\x5c\xe2\x83\xbc\x1d\xe3\xfd\x83\xa0\xbd\xfb\xbf\xb4\x59\x82\x32\x64\x45\xac\x7a\x16\x88\xd0\x65\x0d\x28\xa7\xa1\x50\x75\x4c\x53\xa9\x5c\x03\xb9\x0f\xe4\x83\x18\x87\x3c\x02\x2a\xd5\x06\x19\x36\xd6\xe7\xb3\x8f\x4a\x94\x05\x1d\x28\x1e\xe3\x22\x88\xf6\xf7\x0e\x6a\xa4\x06\xac\x77\xf9\x81\x40\xef\x3d\x6d\x90\x12\x29\x08\x95\xe6\xfd\x94\xa0\xab\xc7\x74\xe8\x18\xd8\x73\x60\x6f\x0f\xa0\x56\x36\x60\x0a\x91\x67\xf1\x6f\xc6\x3b\x3a\xb7\xdb\x6d\xe5\x3e\x47\xca\x4f\x58\x56\xc6\xd5\x1b\x25\x45\x77\x7c\x04\xdc\x39\x8d\x70\x28\x89\x36\x34\x79\x11\x9a\x4c\x8d\x94\x10\xe6\x86\x85\xd4\x8f\x3d\x09\xe7\x35\x26\x63\x84\xe7\x3d\x8e\x24\x92\x68\xb2\x36\x7c\x2f\xc7\x92\xd1\x59\x6e\xc2\x0a\x2d\xca\xa3\x5b\x31\xde\x25\x95\x92\x62\x39\xaf\x15\xcd\xad\x59\xcd\x7b\x93\x79\x27\x25\x3c\xdf\xea\xc4\x71\xd0\x1d\x83\x9f\x53\xca\x3f\xfe\xfa\x70\x75\x77\xfd\xe5\xf2\xea\xee\xfa\xfd\xe7\xab\x43\x15\xfd\x48\xbe\x4c\x47\x1b\x00\x6b\x83\x56\x7f\xc5\xf5\x74\x27\x6a\xe0\x4e\xb3\xeb\xc5\x01\x83\xf6\x70\x57\xee\xa8\x8b\xb3\x58\x82\x28\x83\xcf\x60\xcb\xd3\x5c\x39\xca\x94\xf1\xc1\x61\xc6\x0f\x20\xec\x15\xe4\x10\xe3\xca\xfd\xcc\x3f\xcd\xb2\x68\xdc\x33\x2c\xad\xdf\x7e\x97\x57\x67\x90\xd4\x6f\x80\x0b\x7f\xcf\x70\x5f\xa0\x8b\xb2\xe0\x30\x8b\xb1\x30\xe4\x28\x80\x2c\x6a\x65\x0d\x17\xa8\x67\xf0\xbb\xc9\x0b\x24\xb0\x3e\x07\x8b\x35\x5a\x86\x8a\x8c\x13\x30\x6e\xed\xa9\x6c\x6f\x00\x6a\xe5\xc3\x58\x68\x85\x94\xe3\x35\x12\xa1\x86\x55\x23\xc8\xaf\x60\x15\x04\x32\xe5\x9c\x97\x1e\xa3\x44\xe6\x56\x8a\xbd\x13\x74\x02\x2f\x9c\x87\xfc\xeb\xcd\x05\x54\x8a\xd8\xb8\xfc\xe5\x2b\x60\x0f\x52\x18\x8e\x6a\x1f\x38\x28\x6b\x9b\x91\x9f\x88\x66\x9c\x20\x21\x8b\x99\x4a\x50\x52\x2f\xdf\x8c\x97\x2a\xf2\x0f\x4d\x82\x4e\x57\xde\x38\x59\x4a\x56\xa5\xf3\x79\xfa\xee\xfc\xfc\xfc\x39\x8c\xbe\xb8\xfd\x74\x77\x75\x7d\x79\xf3\xe5\xd3\xf5\xb7\x1f\x53\xa8\xa8\xe5\x93\x37\xfe\xd8\x89\x6f\x3c\x49\x0a\xa3\x28\x60\x48\x3a\x25\xff\xad\xdc\x9d\xc1\xb7\x02\x61\x15\xb8\x59\xf9\x87\x5d\x60\xa3\x4e\x4b\xc1\xb9\x4e\xfe\xd1\x5a\xc8\x7c\x59\x2a\xa7\x23\x93\x4c\x56\x0c\xa0\x62\xef\x6d\xed\xb5\xa1\x76\x48\x32\xc8\xe0\x09\x32\x42\x25\x18\xfb\x75\x39\x83\x4f\x5d\x77\x62\x50\x5a\x9b\x48\x25\x65\x23\x35\x6a\x63\x31\x1f\xf4\xa1\xb3\xbe\xc5\xab\x41\x2b\xdc\x96\xa3\x0f\xf7\xc9\xc7\x82\xaf\x31\x89\xf1\x24\xed\x16\xcf\xfb\x33\xe9\x62\xf6\xfa\x5d\x32\x14\x10\xc6\x2c\x90\x91\xe6\x22\x12\xf2\x41\xf6\xf3\xfa\x18\x98\x4e\x21\xb6\xfc\xc1\x66\x9f\x85\x71\x1d\xd8\x22\x56\xe3\x9e\xb8\x38\x8f\xdf\xe9\x4f\x94\x72\xa2\xd9\x5e\xf3\xc1\xda\x6e\x75\x3f\x1a\x8c\x64\xea\xbb\x98\x7d\x1f\x88\xff\x93\x43\x41\x8e\x09\x3c\x46\xa2\xad\xa3\xd8\x35\x76\x7e\xba\xfb\xec\x4d\x96\x85\xe7\xce\xe3\x7e\x46\x9f\x8e\x61\x34\xb3\x76\x5f\x9c\x77\x52\xb8\xec\x49\xd5\x7c\xa1\x8b\x96\x50\x27\xe3\xd0\x0e\xb6\xf3\x1f\x0b\x63\x9c\xde\x91\xeb\xf1\x98\xe4\xb3\x4d\x3f\x29\x80\xf6\xc8\x71\xf4\x8a\xa3\x53\x97\x6e\x6e\x07\x2e\x29\x90\x70\xed\x09\x1f\x2d\xba\xe1\x2c\x5a\x40\x45\xbe\x52\x79\xab\xa8\xb3\x09\x76\xac\xd8\x6e\x3f\x85\x0f\xa6\x7b\x57\xed\x9b\x99\x5c\xfe\x28\x01\x7e\xb2\x12\x4f\xb3\xe1\xb9\x25\x39\xcc\x96\x9f\x0d\xea\xae\x6f\xa2\xcd\x33\x6b\x74\xa4\xf3\xfe\x1b\x00\x00\xff\xff\xa8\xf9\x21\x6b\x13\x0e\x00\x00") + +func testE2eTestingManifestsStorageCsiMockCsiMockProxyYamlBytes() ([]byte, error) { + return bindataRead( + _testE2eTestingManifestsStorageCsiMockCsiMockProxyYaml, + "test/e2e/testing-manifests/storage-csi/mock/csi-mock-proxy.yaml", + ) +} + +func testE2eTestingManifestsStorageCsiMockCsiMockProxyYaml() (*asset, error) { + bytes, err := testE2eTestingManifestsStorageCsiMockCsiMockProxyYamlBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "test/e2e/testing-manifests/storage-csi/mock/csi-mock-proxy.yaml", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + var _testE2eTestingManifestsStorageCsiMockCsiMockRbacYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x93\xb1\x8e\x13\x41\x0c\x86\xfb\x79\x0a\x4b\x34\x20\x31\x41\x47\x85\xb6\x03\x0a\xda\xd5\x05\xd1\xfb\x66\x7c\x89\xc9\x64\x3c\xb2\x3d\x2b\x72\x4f\x8f\x56\x07\xd1\x1d\x21\x88\x14\x84\x6d\x57\xeb\x7f\x3f\x7f\xbf\x17\x1b\x7f\x21\x35\x96\x3a\xc0\x74\x13\x76\x5c\xf3\x00\x6b\xd2\x89\x13\xbd\x4f\x49\x7a\xf5\xb0\x27\xc7\x8c\x8e\x43\x00\xa8\xb8\xa7\x01\x92\x71\xdc\x4b\xda\x85\x10\x63\xfc\x31\xf4\xb1\x74\x73\xd2\x5b\x29\xf4\x81\x6b\xe6\xba\x09\x4f\xc3\xf5\x0e\xd3\x0a\xbb\x6f\x45\xf9\x01\x9d\xa5\xae\x76\xef\x6c\xc5\xf2\x66\xba\x39\xf3\x85\x24\xd5\x55\x4a\x21\x8d\xe8\x8e\x69\x4b\x1a\x55\x0a\x05\xeb\x77\x5f\x29\xb9\xcd\xaf\x47\xf8\x2d\x33\xc0\x09\xeb\xcf\x47\xd6\x30\xd1\x00\x99\xee\xb1\x17\x0f\x73\xe2\x2d\xdd\xcf\x59\x27\x8b\x1c\x71\xe8\x9b\x93\x56\x2c\x4f\x40\x7a\xad\xa4\x01\x00\x1b\x7f\x52\xe9\xed\x0f\x2b\x5e\x4d\x53\x53\x99\x78\x0e\x5a\x80\xa9\x67\x2c\x4b\x94\x95\x1e\xc3\x63\x56\x9e\x66\x46\xda\xb0\xb9\xe2\x7f\x33\x77\x9e\xe7\x62\x7b\x2f\xa0\x29\x4f\x5c\x28\x6f\x28\xc3\x28\x19\xd6\x94\xba\xb2\x1f\x60\x94\xc2\xe9\xf0\x1a\x9a\xd2\xc4\xd2\xad\x1c\x66\x4a\xae\x94\x61\x62\x84\xf1\x71\x6e\x43\xf9\x33\x99\x8f\xeb\xf1\xb4\x82\x97\xaf\xfe\x49\x3b\xcd\x5a\xfc\xa5\xa1\xa5\x34\x43\x6f\x29\x3a\x99\xc7\x76\xb4\x13\x9b\xb5\xbf\x6c\xe4\x4a\xe7\xac\x64\xfc\xb0\x80\xff\xfe\xc8\x71\xc9\xd5\x5e\xc9\x91\x55\x6c\xb6\x15\xf7\x05\x78\x7a\xc6\x72\x81\xab\xef\x01\x00\x00\xff\xff\xde\x73\x1e\x42\xb2\x07\x00\x00") func testE2eTestingManifestsStorageCsiMockCsiMockRbacYamlBytes() ([]byte, error) { @@ -2801,7 +2877,7 @@ func testE2e_nodeTestingManifestsSriovdpSaYaml() (*asset, error) { return a, nil } -var _testImagesMakefile = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x84\x53\x6f\x6f\xa3\x36\x1c\x7e\x7d\xfe\x14\x8f\xc2\xbd\x68\xa5\x40\xda\x48\xd5\x49\x99\xaa\x13\x4d\x59\x8b\xda\x83\x1b\xd0\xab\xfa\x2a\x72\xe0\x17\xb0\x4a\x6c\x66\x9b\x26\xd1\xb4\xef\x3e\x19\x9a\x6d\x59\x37\x8d\x77\xb6\x9f\x7f\x7e\xfc\xc3\xc3\x52\x75\x07\x2d\xea\xc6\x62\x7e\x71\xf9\x05\x45\x43\x78\xe8\xd7\xa4\x25\x59\x32\x08\x7b\xdb\x28\x6d\x02\xe6\x31\x0f\x8f\xa2\x24\x69\xa8\x42\x2f\x2b\xd2\xb0\x0d\x21\xec\x78\xd9\xd0\xf1\x64\x8a\x1f\xa4\x8d\x50\x12\xf3\xe0\x02\x67\x0e\x30\x79\x3f\x9a\x9c\xff\xc4\x3c\x1c\x54\x8f\x2d\x3f\x40\x2a\x8b\xde\x10\x6c\x23\x0c\x36\xa2\x25\xd0\xbe\xa4\xce\x42\x48\x94\x6a\xdb\xb5\x82\xcb\x92\xb0\x13\xb6\x19\x6c\xde\x45\x02\xe6\xe1\xe5\x5d\x42\xad\x2d\x17\x12\x1c\xa5\xea\x0e\x50\x9b\xbf\xe3\xc0\xed\x10\xd8\x7d\x8d\xb5\xdd\x62\x36\xdb\xed\x76\x01\x1f\xc2\x06\x4a\xd7\xb3\x76\x04\x9a\xd9\x63\xbc\x8c\x92\x3c\xf2\xe7\xc1\xc5\x40\x79\x92\x2d\x19\x03\x4d\xbf\xf6\x42\x53\x85\xf5\x01\xbc\xeb\x5a\x51\xf2\x75\x4b\x68\xf9\x0e\x4a\x83\xd7\x9a\xa8\x82\x55\x2e\xef\x4e\x0b\x2b\x64\x3d\x85\x51\x1b\xbb\xe3\x9a\x98\x87\x4a\x18\xab\xc5\xba\xb7\x27\x65\x1d\xd3\x09\x73\x02\x50\x12\x5c\x62\x12\xe6\x88\xf3\x09\x6e\xc2\x3c\xce\xa7\xcc\xc3\x73\x5c\xdc\xa7\x4f\x05\x9e\xc3\x2c\x0b\x93\x22\x8e\x72\xa4\x19\x96\x69\x72\x1b\x17\x71\x9a\xe4\x48\x7f\x46\x98\xbc\xe0\x21\x4e\x6e\xa7\x20\x61\x1b\xd2\xa0\x7d\xa7\x5d\x7e\xa5\x21\x5c\x8d\x54\xb9\xce\x72\xa2\x93\x00\x1b\x35\x06\x32\x1d\x95\x62\x23\x4a\xb4\x5c\xd6\x3d\xaf\x09\xb5\x7a\x23\x2d\x85\xac\xd1\x91\xde\x0a\xe3\x1e\xd3\x80\xcb\x8a\x79\x68\xc5\x56\x58\x6e\x87\x9d\x0f\x97\x0a\x18\xcb\xa2\xbb\x38\x2f\xb2\x17\x7c\xbd\x46\x5d\xea\x40\xa8\xd9\xeb\x9f\x93\xe4\xd3\x9c\x7c\x4b\xc6\xfa\x62\xcb\x6b\x32\xec\x2e\x0d\xb3\x6f\x0e\xfa\x85\xdd\xa6\xcb\x87\x28\x5b\x2d\xa3\xac\x58\xdd\x84\x79\xb4\xfa\x1e\x16\xf7\xf8\x7a\xcd\x7e\x89\xbe\x3d\xfd\x88\xb2\x3c\x4e\x93\xeb\xb7\xab\xe0\x32\xb8\xf0\xe7\xec\x2e\x7d\x0c\x93\xbb\xd5\x71\xff\x32\xb8\xbc\x0a\xae\x18\xed\x3b\xa5\x2d\x63\x62\x23\x2b\xda\xe0\xf9\x3e\x2c\xd8\xe7\x33\xd2\x5a\xe9\x61\xe1\x4a\xe7\x7f\x3d\xeb\x1b\xd7\xc2\xbd\xe8\x14\xb4\x5f\x60\xcb\x5f\x09\xbc\x6d\x07\xe4\xb5\x24\x7b\xce\x48\x56\x62\xc3\x98\x87\x9b\x5e\xb4\x15\x4a\x55\xd1\xf8\x13\x84\xba\x36\x8b\x61\xb6\x1c\x78\x81\x5b\xa1\xa9\xb4\x4a\x1f\x20\xf9\x96\x8c\x1b\x8a\xb5\xa3\x8c\xe8\x68\xcf\xb7\x5d\x4b\x23\xe1\xd4\xa6\x6c\x7b\x63\x49\xf3\x4e\x0c\xbd\x90\x66\xbc\x6d\x17\xee\xdc\x2f\x95\x74\xc3\x4d\x9a\xb1\x93\xe5\x82\x7d\x0a\x66\x43\x7f\x7e\x6f\x45\x1b\x98\x66\xf4\xc2\xe7\x33\x27\x79\x8e\x49\xa5\xca\x57\xd2\x93\x91\xd7\xf5\xa6\x59\xb0\x4f\x6b\x6e\x1a\xf8\x7b\xfc\x0f\x55\x53\xed\x86\xf2\x30\xf9\x6f\x86\x13\x3c\x12\x46\x8b\x41\xc3\xe7\xb2\x3a\x9a\xfd\xab\xc9\x8a\xcb\x6a\x35\x92\x7f\x73\xe4\xdf\x19\x0b\xbe\xdf\xa7\xc9\xcb\x70\x5d\x7c\x14\xc2\x31\xfe\x3f\xea\xf8\x23\x00\x00\xff\xff\x65\x78\x94\x27\xaf\x04\x00\x00") +var _testImagesMakefile = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x84\x53\x6f\x6f\xa3\x36\x1c\x7e\x7d\xfe\x14\x8f\xc2\xbd\x68\xa5\x40\x9a\x48\xdb\x49\x99\xaa\x13\x4d\x59\x8b\xda\x83\x1b\xd0\xab\xfa\x2a\x72\xe0\x17\xb0\x4a\x6c\x66\x9b\x26\xd1\xb4\xef\x3e\x19\x9a\x6d\xd9\x6d\x1a\xef\x6c\x3f\xff\xfc\xf8\x87\x87\x95\xea\x8e\x5a\xd4\x8d\xc5\xe2\x6a\xfe\x09\x45\x43\x78\xe8\x37\xa4\x25\x59\x32\x08\x7b\xdb\x28\x6d\x02\xe6\x31\x0f\x8f\xa2\x24\x69\xa8\x42\x2f\x2b\xd2\xb0\x0d\x21\xec\x78\xd9\xd0\xe9\x64\x8a\x6f\xa4\x8d\x50\x12\x8b\xe0\x0a\x17\x0e\x30\x79\x3f\x9a\x5c\xfe\xc4\x3c\x1c\x55\x8f\x1d\x3f\x42\x2a\x8b\xde\x10\x6c\x23\x0c\xb6\xa2\x25\xd0\xa1\xa4\xce\x42\x48\x94\x6a\xd7\xb5\x82\xcb\x92\xb0\x17\xb6\x19\x6c\xde\x45\x02\xe6\xe1\xe5\x5d\x42\x6d\x2c\x17\x12\x1c\xa5\xea\x8e\x50\xdb\xbf\xe3\xc0\xed\x10\xd8\x7d\x8d\xb5\xdd\x72\x36\xdb\xef\xf7\x01\x1f\xc2\x06\x4a\xd7\xb3\x76\x04\x9a\xd9\x63\xbc\x8a\x92\x3c\xf2\x17\xc1\xd5\x40\x79\x92\x2d\x19\x03\x4d\xbf\xf6\x42\x53\x85\xcd\x11\xbc\xeb\x5a\x51\xf2\x4d\x4b\x68\xf9\x1e\x4a\x83\xd7\x9a\xa8\x82\x55\x2e\xef\x5e\x0b\x2b\x64\x3d\x85\x51\x5b\xbb\xe7\x9a\x98\x87\x4a\x18\xab\xc5\xa6\xb7\x67\x65\x9d\xd2\x09\x73\x06\x50\x12\x5c\x62\x12\xe6\x88\xf3\x09\x6e\xc2\x3c\xce\xa7\xcc\xc3\x73\x5c\xdc\xa7\x4f\x05\x9e\xc3\x2c\x0b\x93\x22\x8e\x72\xa4\x19\x56\x69\x72\x1b\x17\x71\x9a\xe4\x48\x7f\x46\x98\xbc\xe0\x21\x4e\x6e\xa7\x20\x61\x1b\xd2\xa0\x43\xa7\x5d\x7e\xa5\x21\x5c\x8d\x54\xb9\xce\x72\xa2\xb3\x00\x5b\x35\x06\x32\x1d\x95\x62\x2b\x4a\xb4\x5c\xd6\x3d\xaf\x09\xb5\x7a\x23\x2d\x85\xac\xd1\x91\xde\x09\xe3\x1e\xd3\x80\xcb\x8a\x79\x68\xc5\x4e\x58\x6e\x87\x9d\xef\x2e\x15\x30\x96\x45\x77\x71\x5e\x64\x2f\xf8\x7c\x8d\xba\xd4\x81\x50\xb3\xd7\x3f\x27\xc9\xa7\x05\xf9\x96\x8c\xf5\xc5\x8e\xd7\x64\xd8\x5d\x1a\x66\x5f\x1c\xf4\x13\xbb\x4d\x57\x0f\x51\xb6\x5e\x45\x59\xb1\xbe\x09\xf3\x68\xfd\x35\x2c\xee\xf1\xf9\x9a\xfd\x12\x7d\x79\xfa\x16\x65\x79\x9c\x26\xd7\x6f\x3f\x04\xf3\xe0\xca\x5f\xb0\xbb\xf4\x31\x4c\xee\xd6\xa7\xfd\x79\x30\xff\x31\x98\x33\x3a\x74\x4a\x5b\xc6\xc4\x56\x56\xb4\xc5\xf3\x7d\x58\xb0\x8f\x17\xa4\xb5\xd2\xc3\xc2\x95\xce\xff\x7a\xd6\x37\xae\x85\x7b\xd1\x29\xe8\xb0\xc4\x8e\xbf\x12\x78\xdb\x0e\xc8\x6b\x49\xf6\x92\x91\xac\xc4\x96\x31\x0f\x37\xbd\x68\x2b\x94\xaa\xa2\xf1\x27\x08\x75\x6d\x96\xc3\x6c\x39\xf0\x12\xb7\x42\x53\x69\x95\x3e\x42\xf2\x1d\x19\x37\x14\x1b\x47\x19\xd1\xd1\x81\xef\xba\x96\x46\xc2\xb9\x4d\xd9\xf6\xc6\x92\xe6\x9d\x18\x7a\x21\xcd\x78\xdb\x2e\xdd\xb9\x5f\x2a\xe9\x86\x9b\x34\x63\x67\xcb\x25\xfb\x10\xcc\x86\xfe\xfc\xde\x8a\x36\x30\xcd\xe8\x85\x8f\x17\x4e\xf2\x12\x93\x4a\x95\xaf\xa4\x27\x23\xaf\xeb\x4d\xb3\x64\x1f\x36\xdc\x34\xf0\x0f\xf8\x1f\xaa\xa6\xda\x0d\xe5\x71\xf2\xdf\x0c\x27\x78\x22\x8c\x16\x83\x86\xcf\x65\x75\x32\xfb\x57\x93\x35\x97\xd5\x7a\x24\xff\xe6\xc8\xbf\x33\x16\x7c\xbd\x4f\x93\x97\xe1\xba\xf8\x5e\x08\xa7\xf8\xff\xa8\xe3\x8f\x00\x00\x00\xff\xff\xb4\x48\xd1\xc9\xaf\x04\x00\x00") func testImagesMakefileBytes() ([]byte, error) { return bindataRead( @@ -2821,7 +2897,7 @@ func testImagesMakefile() (*asset, error) { return a, nil } -var _testImagesOwners = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x6c\xcb\xb1\xae\xc2\x30\x0c\x85\xe1\x3d\x4f\x61\xe9\xce\xb7\x59\x51\x77\x56\x90\xe8\xc0\x88\x2c\x6a\xa5\xa1\x84\x44\x39\x76\x1b\xde\x1e\xa9\xdd\x10\xe3\x39\xfa\xfe\x3f\x1a\x44\x48\x27\xa1\xf3\xf5\x74\xbc\x0c\x34\xe6\x3b\x88\x95\x26\xd5\x82\xde\xfb\x90\xbb\xf9\x80\x2e\x66\x9f\xd7\x97\x54\x38\x57\x65\x89\xb2\x4a\x45\xef\x88\xfe\x29\xcd\x96\x58\x39\x6c\xe3\x61\x50\xb6\x60\x50\xc3\x76\x3c\x23\xb4\x39\x2e\xa5\xe6\xe5\x77\xb2\x0b\x49\x52\xa3\x1a\x6e\x5f\x34\xb6\xf1\xbd\x33\x6b\x0c\xf7\x09\x00\x00\xff\xff\x43\x1a\x75\x2a\xaf\x00\x00\x00") +var _testImagesOwners = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x6c\xcb\xb1\xca\x02\x31\x10\x04\xe0\x3e\x4f\xb1\xf0\xd7\xff\xa5\x95\xeb\x6d\x15\xbc\xc2\x52\x16\xb3\xe4\xe2\x19\x13\x32\xbb\x77\xe7\xdb\x0b\x29\xc5\x6e\x66\xf8\xe6\x8f\x26\x11\xd2\x59\xe8\x7c\x3d\x1d\x2f\x13\x85\x72\x07\xb1\xd2\xac\x5a\x31\x7a\x1f\xcb\xb0\x1c\x30\xa4\xe2\xcb\xf6\x92\x06\xe7\x9a\xac\x49\x36\x69\x18\x1d\xd1\x3f\xe5\xc5\x32\x2b\xc7\x5e\x1e\x06\x65\x8b\x06\x35\xf4\x21\xa4\x0c\xc7\xb5\xb6\xb2\xfe\x7e\x74\x20\x59\x5a\x52\xc3\xed\x4b\xa6\x3d\xbc\x7b\x78\xda\xce\x70\x9f\x00\x00\x00\xff\xff\x46\x82\x1e\x4f\xad\x00\x00\x00") func testImagesOwnersBytes() ([]byte, error) { return bindataRead( @@ -2861,7 +2937,7 @@ func testImagesAgnhostGitignore() (*asset, error) { return a, nil } -var _testImagesAgnhostBaseimage = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xca\xc9\xcc\x2b\xad\xd0\x4f\xcc\x4d\x31\x33\xb1\x4d\xcc\x29\xc8\xcc\x4b\xb5\x32\xd6\x33\xe3\x82\x0a\x17\xe5\xda\x26\x16\xe5\x1a\x1b\x95\x99\xe9\x63\x93\x04\xe9\x01\x91\x65\x16\x98\xd2\x05\x05\xc9\x66\x26\x39\xa9\xb6\x50\x1a\x53\x41\xb1\xb1\xa5\x41\x85\x2d\x98\x44\x96\x2c\xcf\xcc\x4b\xc9\x2f\x2f\x86\x38\x49\xdf\xd0\xc2\xc0\xd2\x36\xc8\xd5\xdd\x33\x38\x24\x28\x52\x3f\xa9\xb4\xb8\x32\x29\xbf\xc2\xca\x50\xcf\xc8\x52\x17\xaa\x50\x17\xac\x50\x17\xa4\x10\x5d\xaf\xa5\x81\x31\x71\x7a\x2d\x0d\x8c\x31\xf5\x12\x69\xaf\xa5\x81\x25\x17\x20\x00\x00\xff\xff\xa0\x4d\x41\x80\x45\x01\x00\x00") +var _testImagesAgnhostBaseimage = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x8e\xbd\x0e\x83\x20\x14\x85\x77\xdf\x45\xb9\x5e\x8c\xf1\x9a\x30\x36\xb5\xab\xed\xd2\x51\xab\x83\x89\x3f\x44\xa2\xd2\xb7\x6f\xb0\x2c\x2d\x0c\x2c\x87\x84\xf3\x7d\x39\x77\x1c\xe6\x4d\xb3\x66\xea\xf2\x4c\x34\xa3\x1c\xe6\xbe\xe4\x49\x8a\x91\xfd\x5f\x27\xd1\xac\x13\xc7\x3d\x67\xde\xd6\x58\x26\xf7\xc2\xd3\x4b\xf9\xca\xb3\xb1\x17\xf6\xf5\x10\x8a\x13\x68\x71\xe6\x4f\x7b\x0c\x73\xb7\x1c\xea\x7b\x17\x4b\x0b\x20\x51\x5f\xae\xb7\xfb\xa3\x7e\xb2\x76\x53\xef\x76\xd1\x65\x9a\x20\xc5\x16\x8c\x4f\x30\x36\xe0\xbf\x4b\xc0\xc3\x5c\x02\xee\xba\x81\xbb\xe4\xec\x22\x40\x16\xe4\x1a\xd0\x71\x2b\x0c\x74\x2b\x8c\x3e\x01\x00\x00\xff\xff\xd2\x9e\x88\x50\xc2\x01\x00\x00") func testImagesAgnhostBaseimageBytes() ([]byte, error) { return bindataRead( @@ -2901,7 +2977,7 @@ func testImagesAgnhostDockerfile() (*asset, error) { return a, nil } -var _testImagesAgnhostDockerfile_windows = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x56\x5b\x8f\xda\xba\x16\x7e\xcf\xaf\x58\x82\xaa\x17\x89\x24\x0c\xd3\x33\xe7\x94\xaa\x0f\x1c\x86\xb6\xa8\x2d\x20\x42\xdb\x3d\xea\x54\x23\xe3\x2c\x12\x6b\x1c\x3b\xdb\x76\x08\xcc\xaf\xdf\x5a\x0e\xd7\xce\xec\xdd\xcd\x03\xf1\xe5\x5b\xf7\xe5\xcf\x6e\xc3\x50\x97\x5b\x23\xb2\xdc\x41\xaf\xdb\xeb\xc2\x22\x47\xf8\x54\x2d\xd1\x28\x74\x68\x61\x50\xb9\x5c\x1b\x1b\x05\xed\xa0\x0d\x9f\x05\x47\x65\x31\x85\x4a\xa5\x68\xc0\xe5\x08\x83\x92\xf1\x1c\xf7\x3b\x1d\xf8\x86\xc6\x0a\xad\xa0\x17\x75\xe1\x25\x01\x5a\xbb\xad\xd6\xab\xb7\x41\x1b\xb6\xba\x82\x82\x6d\x41\x69\x07\x95\x45\x70\xb9\xb0\xb0\x12\x12\x01\x37\x1c\x4b\x07\x42\x01\xd7\x45\x29\x05\x53\x1c\xa1\x16\x2e\xf7\x66\x76\x4a\xa2\xa0\x0d\x37\x3b\x15\x7a\xe9\x98\x50\xc0\x80\xeb\x72\x0b\x7a\x75\x8a\x03\xe6\xbc\xc3\xf4\xcb\x9d\x2b\xfb\x71\x5c\xd7\x75\xc4\xbc\xb3\x91\x36\x59\x2c\x1b\xa0\x8d\x3f\x8f\x87\xa3\x49\x32\x0a\x7b\x51\xd7\x8b\x7c\x55\x12\xad\x05\x83\x7f\x56\xc2\x60\x0a\xcb\x2d\xb0\xb2\x94\x82\xb3\xa5\x44\x90\xac\x06\x6d\x80\x65\x06\x31\x05\xa7\xc9\xdf\xda\x08\x27\x54\xd6\x01\xab\x57\xae\x66\x06\x83\x36\xa4\xc2\x3a\x23\x96\x95\x3b\x4b\xd6\xde\x3b\x61\xcf\x00\x5a\x01\x53\xd0\x1a\x24\x30\x4e\x5a\xf0\xff\x41\x32\x4e\x3a\x41\x1b\xbe\x8f\x17\x1f\xa7\x5f\x17\xf0\x7d\x30\x9f\x0f\x26\x8b\xf1\x28\x81\xe9\x1c\x86\xd3\xc9\xf5\x78\x31\x9e\x4e\x12\x98\xbe\x87\xc1\xe4\x06\x3e\x8d\x27\xd7\x1d\x40\xe1\x72\x34\x80\x9b\xd2\x90\xff\xda\x80\xa0\x34\x62\x4a\x39\x4b\x10\xcf\x1c\x58\xe9\xc6\x21\x5b\x22\x17\x2b\xc1\x41\x32\x95\x55\x2c\x43\xc8\xf4\x1a\x8d\x12\x2a\x83\x12\x4d\x21\x2c\x15\xd3\x02\x53\x69\xd0\x06\x29\x0a\xe1\x98\xf3\x2b\x8f\x82\x8a\x82\x60\x30\xff\x40\xde\x8f\xc6\x5f\x06\x1f\x46\x7e\x36\x1f\x7d\x18\x27\x8b\xf9\x8d\x9f\x4c\x93\xbb\x6f\xa3\x79\x32\x9e\x4e\x02\x8a\x0e\x5f\x18\x84\xca\x92\x29\x06\x9f\x85\xaa\x36\x20\x0a\x72\xc1\x69\xa8\x54\xc9\xf8\xbd\x57\xcf\x0c\xcf\xc5\x1a\x6d\x87\x66\x0a\x6a\x2f\x46\x25\x27\x41\x97\x63\x01\xe4\x31\x09\x7d\x17\x2a\xd5\xb5\x8d\x82\xf7\xf3\xe9\x17\x08\xc3\x52\x32\xb7\xd2\xa6\x78\x27\x49\x79\xcc\x8a\xf4\xea\x35\x30\x59\x0a\x85\xfd\xcb\xe8\x0a\x98\x85\xd2\x60\x19\x04\x83\xeb\x6b\xdf\x25\xb6\x1f\xc7\x99\x70\x79\xb5\x8c\xb8\x2e\x62\xae\x0d\xa6\xca\x1e\xbe\x06\x25\x32\x6a\x99\x54\xd7\x4a\x6a\x96\xc6\xeb\x8b\xe8\x3f\x51\x77\x0f\xb8\xf3\xb3\xbb\xba\x71\xe3\xce\xdb\x8b\x5c\xf6\x00\x7b\x00\x4d\xce\x8c\x89\x12\xcd\x2a\x5a\x99\xa3\xc6\x9d\x70\xb3\x43\x3d\x19\xbd\x09\x6b\xa1\xae\x5e\x47\x0f\xa2\x84\x9d\xc0\x83\x28\x29\x83\x4d\x2a\x98\xb4\x1a\xb8\x41\xe6\x7c\x26\x15\x60\x51\xba\x2d\xc4\x55\x49\x0a\x2d\xac\xb4\x4c\xd1\x74\xa0\xce\x05\xcf\x7f\x49\xdf\x2f\x99\x03\x58\x22\x67\x95\x45\xaf\x1c\x38\x53\x2f\x1c\xcc\xbf\x4e\xe8\x44\x16\x4c\xa5\xd6\x77\xea\x01\xed\xab\x15\x05\x04\x70\xcc\x40\xb8\x79\x58\xaf\xce\x62\x85\xe7\xcf\x6f\x03\x3a\x82\x95\x22\xef\x0f\xce\x1f\xd6\x8b\x35\x3c\x0a\xb4\x59\x39\x42\xee\x53\x61\x0e\xd1\x04\x4d\x6d\xb1\x87\x0e\x59\x11\x2f\x2b\xbb\x5d\xea\x4d\x98\xa3\x2c\xd1\xf4\x2f\xa2\xde\x9b\xa8\x4b\x75\x3d\xdf\xf8\xc7\x86\x78\xb6\xef\xd1\x7d\xee\x43\x8b\x66\x8d\x86\xe2\x08\x39\xf1\x45\xff\x22\xea\x86\x5e\x24\xf4\x22\xe1\xb3\x63\x27\x93\xb1\x13\xfc\xa9\xbd\x67\xc7\xa3\x10\xb4\x61\x65\x74\x01\xa9\xb2\x95\x13\x72\x97\xba\xa0\x0d\x42\x59\xc7\xa4\x04\x85\x1c\xad\x65\x66\x0b\xd4\xf7\x2c\x43\xdb\x0f\xda\x10\xc2\x52\xa8\x34\x74\x5a\x4b\xdb\x07\xae\x15\x11\x1e\x51\x47\xb6\x2f\x27\x67\x8a\x68\x34\x25\x1a\xba\x9e\x24\xe0\xd0\x3a\xe2\x6a\x08\x61\xa8\x0d\x5e\x4f\x92\xfe\x61\xdf\xea\x02\xcf\x41\xde\xa7\x5c\x5b\x87\x1b\xe4\xbf\xfa\x84\xe9\xdf\x7a\xc5\x2b\x23\x3b\xa0\xf8\x4e\x37\x31\x24\x48\xed\x88\x83\xb1\x87\x8d\x7e\x78\x29\x54\x8e\x46\x10\xbf\x79\x3b\x87\x6c\xbc\xda\x5b\x6e\x0a\xfd\x2f\x52\xd1\x20\x83\xe1\x74\x76\x03\x61\x48\xb2\xef\xce\x0b\x0c\x71\x2a\x32\xff\x77\x06\x7a\x54\x18\x88\x77\xbd\x1b\x27\x5b\xeb\xb0\xb8\xec\xc5\x0a\x1d\x2b\xc5\x65\x2f\x4a\xa5\xfc\xcd\xf6\x99\x6e\x62\x8e\x63\xb3\xe3\x06\xcf\x26\x4f\x40\x9b\x68\x9b\x0f\x35\xc4\x64\xba\x18\xbd\xe4\x92\x55\xa9\xa8\x96\xaf\xfa\x90\x6a\x7e\x8f\x06\x96\x95\x90\xe9\x06\x2c\x3a\xeb\xe9\x6f\x36\x58\x7c\x04\x54\x6b\x58\x33\x23\xfc\x15\xe4\xf4\x9e\x2f\x43\x29\xee\x1b\xc4\xbe\x1f\x84\xf5\x37\x6b\x8a\x56\x18\x02\x47\xc1\x68\xf2\xcd\x23\xde\xb5\x86\xfd\xdb\x54\x64\xb7\x6f\x87\xfd\xdb\xa5\x50\xfe\x4b\x85\xf4\x83\x5d\xdc\xb7\x76\x17\xf7\xc9\x1a\x0d\x67\x46\x67\x86\x15\xf0\x5e\x48\xb4\xb7\x33\x5d\xa3\x49\x72\x94\xf2\x6d\x8b\x22\x99\x4d\xe7\x0b\xf8\x5f\x17\x14\x62\xea\xdb\xa1\xef\x5b\x20\xac\x71\xd9\x54\xe0\x88\x39\x47\xd1\x0b\x63\x83\xbc\x43\x03\x92\x38\xc1\x5d\x3c\x81\xdb\x6f\xbf\xb9\xfc\xef\xd5\xe9\xb6\x37\x12\x52\x1f\x2b\x56\x60\x30\xfa\x63\x36\x4d\x46\xe4\x90\xb7\xe7\x95\x91\xc8\xe1\x14\xee\xd5\x3d\xae\xd1\x9e\x33\x8f\x74\xb3\x13\x29\xb5\x71\x68\x3c\x77\x37\xc3\x58\x6a\xce\x24\xd9\x8c\xb8\x71\x70\x36\x7b\x1a\x76\x8f\x5b\x38\x9b\x1d\x94\x17\xba\x52\x4d\xfc\x24\x78\x98\xc5\xf4\x2c\x9a\x1d\x2f\xe1\xa8\xb4\x17\xf0\xc4\x5a\x73\x7f\xb1\x4c\x91\x62\x88\x77\x03\xd2\xbe\xcb\xd1\xfe\xb2\x47\xe5\xcc\xb6\xd4\x42\xb9\x90\xf4\xa3\x01\x83\x92\xd1\x01\x6d\x18\x01\x12\x62\x88\xdd\x43\xea\x37\xe0\xa0\xed\x2f\x0f\x23\x52\xb4\xcd\x23\xce\x9f\xe3\x17\xf6\x44\xb0\x79\xbd\xed\xfc\x09\x7b\x44\x66\xcc\x6c\x3b\xf4\x98\x80\x5a\x48\x09\x6b\x34\x62\xb5\x05\x97\x33\xe7\x6d\x72\x6d\x0c\x72\x6a\x83\x13\x25\xc2\x1e\x58\xa6\xc1\x78\x16\x44\x7a\x92\x3e\x15\x77\xd8\x0b\x82\xd1\x64\x31\xbf\x99\x4d\xc7\x93\x05\xfc\x68\xed\x37\x5a\x3f\x83\xe1\x97\x6b\xf8\xd1\x2a\xe9\x86\x6b\xfd\x0c\xfe\x0a\x00\x00\xff\xff\x19\x27\x58\xec\xfa\x0a\x00\x00") +var _testImagesAgnhostDockerfile_windows = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x56\x6d\x73\xda\xba\x12\xfe\xee\x5f\xb1\x03\x9d\xbe\xcc\x60\x3b\x21\xbd\xb9\xb7\x74\xfa\x81\x4b\x68\xcb\xb4\x05\x06\xd3\xf6\x64\x9a\x4e\x46\xc8\x0b\xd6\x44\x96\x7c\x24\x19\x43\x7e\xfd\x99\x95\x6d\x08\x4d\xce\xe9\xe1\x0b\x96\xf4\xec\xee\xb3\xaf\x52\x17\x46\xba\xd8\x1b\xb1\xc9\x1c\xf4\xcf\xfa\x67\xb0\xcc\x10\x3e\x95\x2b\x34\x0a\x1d\x5a\x18\x96\x2e\xd3\xc6\x46\x41\x37\xe8\xc2\x67\xc1\x51\x59\x4c\xa1\x54\x29\x1a\x70\x19\xc2\xb0\x60\x3c\xc3\xf6\xa4\x07\xdf\xd0\x58\xa1\x15\xf4\xa3\x33\x78\x49\x80\x4e\x73\xd4\x79\xf5\x36\xe8\xc2\x5e\x97\x90\xb3\x3d\x28\xed\xa0\xb4\x08\x2e\x13\x16\xd6\x42\x22\xe0\x8e\x63\xe1\x40\x28\xe0\x3a\x2f\xa4\x60\x8a\x23\x54\xc2\x65\xde\x4c\xa3\x24\x0a\xba\x70\xdd\xa8\xd0\x2b\xc7\x84\x02\x06\x5c\x17\x7b\xd0\xeb\x87\x38\x60\xce\x13\xa6\x5f\xe6\x5c\x31\x88\xe3\xaa\xaa\x22\xe6\xc9\x46\xda\x6c\x62\x59\x03\x6d\xfc\x79\x32\x1a\x4f\x93\x71\xd8\x8f\xce\xbc\xc8\x57\x25\xd1\x5a\x30\xf8\x67\x29\x0c\xa6\xb0\xda\x03\x2b\x0a\x29\x38\x5b\x49\x04\xc9\x2a\xd0\x06\xd8\xc6\x20\xa6\xe0\x34\xf1\xad\x8c\x70\x42\x6d\x7a\x60\xf5\xda\x55\xcc\x60\xd0\x85\x54\x58\x67\xc4\xaa\x74\x27\xc1\x6a\xd9\x09\x7b\x02\xd0\x0a\x98\x82\xce\x30\x81\x49\xd2\x81\xff\x0f\x93\x49\xd2\x0b\xba\xf0\x7d\xb2\xfc\x38\xfb\xba\x84\xef\xc3\xc5\x62\x38\x5d\x4e\xc6\x09\xcc\x16\x30\x9a\x4d\xaf\x26\xcb\xc9\x6c\x9a\xc0\xec\x3d\x0c\xa7\xd7\xf0\x69\x32\xbd\xea\x01\x0a\x97\xa1\x01\xdc\x15\x86\xf8\x6b\x03\x82\xc2\x88\x29\xc5\x2c\x41\x3c\x21\xb0\xd6\x35\x21\x5b\x20\x17\x6b\xc1\x41\x32\xb5\x29\xd9\x06\x61\xa3\xb7\x68\x94\x50\x1b\x28\xd0\xe4\xc2\x52\x32\x2d\x30\x95\x06\x5d\x90\x22\x17\x8e\x39\xbf\xf3\xc8\xa9\x28\x08\x86\x8b\x0f\xc4\x7e\x3c\xf9\x32\xfc\x30\xf6\xab\xc5\xf8\xc3\x24\x59\x2e\xae\xfd\x62\x96\xdc\x7e\x1b\x2f\x92\xc9\x6c\x1a\x90\x77\xf8\xc2\x20\x94\x96\x4c\x31\xf8\x2c\x54\xb9\x03\x91\x13\x05\xa7\xa1\x54\x05\xe3\x77\x5e\x3d\x33\x3c\x13\x5b\xb4\x3d\x5a\x29\xa8\xbc\x18\xa5\x9c\x04\x5d\x86\x39\x10\x63\x12\xfa\x2e\x54\xaa\x2b\x1b\x05\xef\x17\xb3\x2f\x10\x86\x85\x64\x6e\xad\x4d\xfe\x4e\x92\xf2\x98\xe5\xe9\xe5\x6b\x60\xb2\x10\x0a\x07\x17\xd1\x25\x30\x0b\x85\xc1\x22\x08\x86\x57\x57\xbe\x4a\xec\x20\x8e\x37\xc2\x65\xe5\x2a\xe2\x3a\x8f\xb9\x36\x98\x2a\x7b\xf8\x37\x28\x91\x51\xc9\xa4\xba\x52\x52\xb3\x34\xde\x9e\x47\xff\x89\xce\x5a\xc0\xad\x5f\xdd\x56\x35\x8d\x5b\x6f\x2f\x72\x9b\x7b\x68\x01\xb4\x38\x31\x26\x0a\x34\xeb\x68\x6d\x8e\x1a\x1b\xe1\xfa\x84\x6a\x32\x7a\x13\x56\x42\x5d\xbe\x8e\xee\x45\x01\x8d\xc0\xbd\x28\x28\x82\x75\x28\x98\xb4\x1a\xb8\x41\xe6\x7c\x24\x15\x60\x5e\xb8\x3d\xc4\x65\x41\x0a\x2d\xac\xb5\x4c\xd1\xf4\xa0\xca\x04\xcf\x7e\x09\xdf\x2f\x91\x03\x58\x21\x67\xa5\x45\xaf\x1c\x38\x53\x2f\x1c\x2c\xbe\x4e\xa9\x23\x73\xa6\x52\xeb\x2b\xf5\x80\xf6\xd9\x8a\x02\x02\x38\x66\x20\xdc\xdd\x6f\xd7\x27\xbe\xc2\xf3\xe7\x37\x01\xb5\x60\xa9\x88\xfd\x81\xfc\x61\x3f\xdf\xc2\x23\x47\xeb\x9d\x23\xe4\x2e\x15\xe6\xe0\x4d\xf0\x8f\xb9\x7d\xd6\x96\x5b\x1b\xc6\xd0\xa2\xd9\xa2\x21\x4a\x21\xa7\xd6\x1f\x9c\x47\x67\xa1\x17\x09\xbd\x48\xf8\xec\x58\x94\x54\x0f\x0f\xf0\x19\xca\x02\x4d\x6d\xef\xd9\xb1\xaa\x83\x2e\xac\x8d\xce\x21\x55\xb6\x74\x42\x36\x51\x08\xba\x20\x94\x75\x4c\x4a\x50\xc8\xd1\x5a\x66\xf6\x40\x25\xcc\x36\x68\x07\x41\x17\x42\x58\x09\x95\x86\x4e\x6b\x69\x07\xc0\xb5\xa2\xd9\x45\x53\x60\xd3\x66\x86\x33\x45\x13\x31\xa5\x89\x72\x35\x4d\xc0\xa1\x75\x34\x76\x21\x84\x91\x36\x78\x35\x4d\x06\x87\x73\xab\x73\x3c\x05\x79\x4e\x99\xb6\x0e\x77\xc8\x7f\xe5\x84\xe9\xdf\xb2\xe2\xa5\x91\x3d\x50\xbc\xd1\x4d\xc3\x0e\xa4\x76\x34\x4e\xb1\x8f\xb5\x7e\x78\x29\x54\x86\x46\xd0\xa8\xf2\x76\x0e\xd1\x78\xd5\x5a\xae\x73\xf6\x2f\x42\x51\x23\x83\xd1\x6c\x7e\x0d\x61\x48\xb2\xef\x1e\xc5\x1c\xe2\xa6\xc2\xe2\x64\x6f\x1d\xe6\x17\xfd\x58\xa1\x63\x85\xb8\xe8\x47\xa9\x94\xbf\x39\x3e\xd1\x4d\xfd\x7d\x2c\x49\xdc\xe1\xc9\xe2\x09\x68\xed\x48\xfd\x47\xb9\x9e\xce\x96\xe3\x97\x5c\xb2\x32\x15\xe5\xea\xd5\x00\x52\xcd\xef\xd0\xc0\xaa\x14\x32\xdd\x81\x45\x67\xfd\x90\x9a\x0f\x97\x1f\x01\xd5\x16\xb6\xcc\x08\x7f\x51\x38\xdd\x4e\xb5\x50\x8a\xbb\x1a\xd1\xa6\x5a\x58\x7f\xff\xa5\x68\x85\x21\x70\x14\x8c\xa7\xdf\x3c\xe2\x5d\x67\x34\xb8\x49\xc5\xe6\xe6\xed\x68\x70\xb3\x12\xca\xff\x53\x8e\xfc\x47\xe3\xf7\x8d\x6d\xfc\x7e\xb0\x47\x9f\x73\xa3\x37\x86\xe5\xf0\x5e\x48\xb4\x37\x73\x5d\xa1\x49\x32\x94\xf2\x6d\x87\x3c\x99\xcf\x16\x4b\xf8\xdf\x19\x28\xc4\xd4\x67\x7a\xe0\xb3\x1b\x56\xb8\xaa\x33\x70\xc4\x9c\xa2\xe8\x1d\xb0\x43\xde\xa3\x0f\x92\x78\x80\x3b\x7f\x02\xd7\x1e\xbf\xb9\xf8\xef\xe5\xc3\x63\x6f\x24\xa4\x12\x55\x2c\xc7\x60\xfc\xc7\x7c\x96\x8c\x89\x90\xb7\xe7\x95\x91\xc8\xa1\xc1\x5a\x75\x8f\x73\xd4\x4e\xb6\xe3\x50\x68\x44\x0a\x6d\x1c\x1a\x3f\x61\xeb\xcf\x58\x6a\xce\x24\xd9\x8c\xb8\x71\x70\xb2\x7a\x1a\x76\x87\x7b\x38\x59\x1d\x94\xe7\xba\x54\xb5\xff\x24\x78\x58\xc5\xf4\x78\x99\x1f\xaf\xca\xa8\xb0\xe7\xf0\xc4\x5e\x7d\xcb\xb0\x8d\x22\xc5\x10\x37\x1f\xa4\xbd\x89\x51\x7b\x25\xa3\x72\x66\x5f\x68\xa1\x5c\x48\xfa\xd1\x80\x41\xc9\xa8\xf7\xea\x66\x87\x84\x9a\xbf\x79\xee\xfc\x06\x1c\x74\xfd\x88\x37\x22\x45\x5b\x3f\xb5\x7c\x8b\xbe\xb0\x0f\x04\xeb\x37\x56\xc3\x27\xec\xd3\x9c\x62\x66\xdf\xa3\x2b\x1f\x2a\x21\x25\x6c\xd1\x88\xf5\x1e\x5c\xc6\x9c\xb7\xc9\xb5\x31\xc8\xa9\x0c\x1e\x28\x11\xf6\x30\x40\x6a\x8c\x1f\x70\x48\x0f\xc7\xa7\xfc\x0e\xfb\x41\x30\x9e\x2e\x17\xd7\xf3\xd9\x64\xba\x84\x1f\x9d\xf6\xa0\xf3\x33\x18\x7d\xb9\x82\x1f\x9d\x82\xee\xa1\xce\xcf\xe0\xaf\x00\x00\x00\xff\xff\x4a\x5f\x3c\x08\xa0\x0a\x00\x00") func testImagesAgnhostDockerfile_windowsBytes() ([]byte, error) { return bindataRead( @@ -2961,7 +3037,7 @@ func testImagesAgnhostOwners() (*asset, error) { return a, nil } -var _testImagesAgnhostVersion = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x32\xd2\x33\x32\xe5\x02\x04\x00\x00\xff\xff\xa0\xde\x25\x38\x05\x00\x00\x00") +var _testImagesAgnhostVersion = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x32\xd2\x33\x36\xe0\x02\x04\x00\x00\xff\xff\xd2\x40\x90\x44\x05\x00\x00\x00") func testImagesAgnhostVersionBytes() ([]byte, error) { return bindataRead( @@ -2981,7 +3057,7 @@ func testImagesAgnhostVersion() (*asset, error) { return a, nil } -var _testImagesAgnhostAgnhostGo = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x94\x97\xdf\x6f\xdb\x36\x10\xc7\x9f\xc5\xbf\xe2\xa0\x87\xc1\x2e\x62\xa9\xcd\x30\x60\xcb\xb0\x07\xcf\xf9\x51\xa3\x99\x53\x44\xee\x82\x3e\xd2\xd4\x59\x22\x42\x91\x1a\x49\xc5\x31\x8a\xfe\xef\xc3\xd1\xb2\x63\x77\xb2\x27\x3f\x59\x24\x3f\xdf\xbb\x33\x45\x7e\x45\xa6\xef\xd8\xc4\xd4\x6b\x2b\x8b\xd2\xc3\xe5\xfb\x0f\xbf\xc1\xbc\x44\xf8\xd4\x2c\xd0\x6a\xf4\xe8\x60\xdc\xf8\xd2\x58\x97\x30\x76\x2f\x05\x6a\x87\x39\x34\x3a\x47\x0b\xbe\x44\x18\xd7\x5c\x94\x08\xed\xc8\x05\xfc\x8d\xd6\x49\xa3\xe1\x32\x79\x0f\x03\x02\xe2\x76\x28\x1e\xfe\xce\xd6\xa6\x81\x8a\xaf\x41\x1b\x0f\x8d\x43\xf0\xa5\x74\xb0\x94\x0a\x01\x5f\x05\xd6\x1e\xa4\x06\x61\xaa\x5a\x49\xae\x05\xc2\x4a\xfa\x32\x24\x69\x43\x24\xec\x6b\x1b\xc0\x2c\x3c\x97\x1a\x38\x08\x53\xaf\xc1\x2c\xf7\x29\xe0\x9e\x31\x00\x80\xd2\xfb\xfa\x2a\x4d\x57\xab\x55\xc2\x43\x95\x89\xb1\x45\xaa\x36\x94\x4b\xef\xa7\x93\x9b\x59\x76\x33\xba\x4c\xde\x33\xf6\x45\x2b\x74\x0e\x2c\xfe\xd3\x48\x8b\x39\x2c\xd6\xc0\xeb\x5a\x49\xc1\x17\x0a\x41\xf1\x15\x18\x0b\xbc\xb0\x88\x39\x78\x43\x75\xae\xac\xf4\x52\x17\x17\xe0\xcc\xd2\xaf\xb8\x45\x96\x4b\xe7\xad\x5c\x34\xfe\x60\x82\xb6\x55\x49\x07\xfb\x80\xd1\xc0\x35\xc4\xe3\x0c\xa6\x59\x0c\x7f\x8e\xb3\x69\x76\xc1\x9e\xa6\xf3\x8f\x0f\x5f\xe6\xf0\x34\x7e\x7c\x1c\xcf\xe6\xd3\x9b\x0c\x1e\x1e\x61\xf2\x30\xbb\x9e\xce\xa7\x0f\xb3\x0c\x1e\x6e\x61\x3c\xfb\x0a\x9f\xa6\xb3\xeb\x0b\x40\xe9\x4b\xb4\x80\xaf\xb5\xa5\xda\x8d\x05\x49\x53\x87\x79\xc2\x32\xc4\x83\xe4\x4b\xb3\x29\xc6\xd5\x28\xe4\x52\x0a\x50\x5c\x17\x0d\x2f\x10\x0a\xf3\x82\x56\x4b\x5d\x40\x8d\xb6\x92\x8e\x5e\x9e\x03\xae\x73\xa6\x64\x25\x3d\xf7\xa1\xfd\x9f\xbf\x93\xb0\x77\x29\x63\x35\x17\xcf\x14\xa4\xe2\x52\x33\x26\xab\xda\x58\x0f\x03\x16\xc5\x4b\xc5\x8b\x98\xb1\x28\x2e\xa4\x2f\x9b\x45\x22\x4c\x95\xba\x7a\xf9\xe1\xe7\x54\x98\x85\xe5\x61\xe8\xf9\x57\x97\x48\x93\x3e\x2b\x53\xa4\x2f\x97\x31\x8b\x78\x93\x4b\x5f\x5b\xf3\xba\x86\xdd\xe0\x6e\x15\xa6\x1e\x9d\x4f\x65\xc5\x0b\x74\x29\x2f\x74\x69\x9c\x4f\x83\x62\x14\x24\xf1\x5e\xc4\xd3\x22\x61\xb4\x46\xe1\x63\x16\x09\x9b\x0b\xa3\x5f\x56\xb8\x28\x8d\x79\xee\x9b\x54\xd8\x7c\x44\xb2\xcd\x42\x1f\xb5\xea\xfe\xf9\x73\xed\xfa\xc3\xa8\xbd\x5d\xd7\x46\x6a\x3f\xa2\x61\xb4\xfd\xa5\x4b\xfe\x8c\x85\xf4\x0e\xed\xcb\x39\xb2\xa2\x41\xe7\x17\x67\xfd\x23\xa9\x85\x6a\xa8\x38\xa1\x24\x6a\xdf\x5f\xa8\xe4\x0b\x6a\x74\x34\x1f\xca\x14\xae\x40\xdd\xf7\x25\x10\x3e\x2a\x50\xa3\xe5\xde\x9c\xf1\xef\x2a\xd3\x68\x4f\x03\xfd\x25\x1a\xcf\x83\xf1\x15\xc5\x59\x82\xb6\x1c\x6d\x9c\xe6\xbe\xef\x04\x68\x33\x22\x7c\x74\x20\x3e\x6b\xf3\xec\x47\x38\x77\x0f\x99\x1a\xb5\xcc\x2b\xf4\x3c\xe7\x9e\xf7\xd7\xd5\xbc\x71\x18\xb3\x88\x8c\x62\x69\xec\x8a\xdb\x7c\xb3\xac\xfb\x16\x4d\xc2\x51\xab\x3c\x7b\x47\x90\x38\xf0\x16\x9d\x30\xda\x35\x15\x5a\xe1\xad\xea\x9b\xdc\xa2\x33\x8d\x15\x38\xda\x8a\xe9\xc1\x5b\xa3\x54\x88\x1a\x76\x1a\x81\x9a\x57\xd8\x37\x66\x10\x8d\xb6\xaa\x98\x45\x04\xad\x70\xb1\xd9\xb6\x7d\xa3\x84\x77\xb8\x53\xf5\x9f\x91\x9d\x79\x0d\x19\x5b\x36\x5a\x04\x27\x1f\x0c\xe1\x1b\x8b\xac\x31\x7e\x52\xe5\x70\xf5\x07\xfc\x14\x4c\x3b\x99\x98\xaa\xe2\x3a\xff\xc6\xa2\xe8\x8b\xc3\x2b\xfa\xc4\x42\xcc\xeb\x3a\xbe\x60\x51\xd4\x7e\xf7\xaf\x20\xbe\x4c\x2e\x7f\xa1\xae\xef\x6c\x17\x24\x19\xe7\x79\xab\x1e\xbc\xb9\x7c\x32\xa9\xf2\x31\xb5\x3e\x53\x6b\xd8\x49\xb7\x66\x4d\xe8\x64\xf3\x78\x84\x3b\xb0\xf2\x80\x5b\x52\xb4\x2e\xfd\xb4\xe9\xef\xd6\xe6\xda\x91\xe0\x7a\x96\x65\xcd\x72\x29\x5f\xff\x97\x0a\x93\x7c\x2f\xdd\x91\x5a\x5a\xf2\xc6\x8b\x8f\xc6\x79\xd7\x0d\xbd\x19\x7b\x60\x77\xad\x79\x58\xd3\xdd\x9a\x03\x47\x27\xd9\x2d\x7f\xc6\x3b\xe9\x37\x05\x75\x6b\x76\x76\x4e\xfc\xdd\xb6\xd1\xcd\xfe\xe0\xe3\xa4\x98\xea\xc9\xa6\x6b\x12\xba\xba\x75\x5b\x1b\x27\xc1\x7d\xfb\x7c\x84\xdc\xb8\x7c\x00\x4d\xe1\xee\xb6\x06\xde\x4d\xef\xcc\x9a\xf8\xbf\xb6\x8d\x6e\x56\x63\xa0\x66\x78\x7c\x9c\x8c\xb9\x65\xe8\xf1\x28\xb7\xcd\x38\xc3\x53\xf9\x82\xe1\x06\xcc\x64\x9a\x87\xf7\x76\x8a\xdc\xad\xf8\x37\xfc\xc4\xb2\x0f\x3e\x49\xf4\x67\x7a\x38\xc2\x04\x37\x0b\x50\x78\x3a\x4e\x1d\x38\xed\x56\x70\xbb\xe9\x3c\xb5\xde\x7e\xb0\x49\x52\x3e\xb6\x16\x38\x69\xfb\x27\x3b\x03\xec\x0e\x71\xe0\x89\x14\x20\xac\xd5\x8f\x6d\x47\xb7\xe6\xc0\x01\x49\x43\x35\x3e\x6d\x3b\xba\x35\x7b\x1b\xff\xe4\x5e\x3f\xfc\x70\x6d\x83\x53\x51\x52\xe0\x58\x08\x5a\x64\x53\xe7\x1a\xb4\xd7\xd2\x09\x3a\x1b\xaf\x87\x8c\x45\x69\x0a\xb3\x87\xf9\xcd\x40\x28\xb2\xaf\x66\x31\xbc\x82\xcc\x54\x08\x54\xaa\x03\x6e\x11\x6a\xee\x1c\x9d\xa2\x95\x29\x0a\xfa\xb5\xa8\x38\x9d\xf3\xe9\x24\xec\xe8\x92\x00\x2b\x04\xdd\x5e\x1f\x16\x08\xe1\x5e\xe1\x4d\x08\xcd\x45\xb8\xfc\xf8\x12\xab\x04\xe6\x74\x27\x5a\x49\xa5\x80\x2b\x47\x37\x0d\xa1\x9a\x3c\x9c\xe6\x2b\xba\x76\xd0\x19\xbc\xb6\x52\x53\xec\x12\x55\x9d\x84\xa3\x13\xa5\xbc\xa5\x4c\xc1\xae\x29\x67\x42\xcd\x0c\xfd\xb7\xef\x2c\xa2\x23\x76\x32\xd5\xd2\x07\x64\xb0\xcf\xef\xcd\xd2\x67\xb2\x4a\xe7\x51\xb7\xd8\x90\xe6\xed\xce\xb4\x71\x8e\xa9\x6e\x5e\x51\x34\x1e\x07\x43\xf6\x9d\xfd\x1b\x00\x00\xff\xff\x4a\xd8\x8c\x1b\x4a\x0e\x00\x00") +var _testImagesAgnhostAgnhostGo = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x94\x97\xcf\x72\xdb\x36\x10\xc6\xcf\xc4\x53\xec\xf0\xd0\x91\x32\x16\xe9\x38\x97\xd6\x9d\x1e\x54\xf9\x4f\x34\x71\xe5\x8c\xa9\xd4\x93\x23\x04\xae\x48\x8c\x41\x80\x05\x40\xcb\x9a\x4c\xde\xbd\xb3\x10\xa5\x48\x29\xa5\x52\x27\x11\xc0\xef\xdb\x5d\x81\xc0\x47\x20\x7d\xc7\x26\xa6\x5e\x5b\x59\x94\x1e\xae\x2e\xdf\xff\x06\xf3\x12\xe1\x53\xb3\x40\xab\xd1\xa3\x83\x71\xe3\x4b\x63\x5d\xc2\xd8\x83\x14\xa8\x1d\xe6\xd0\xe8\x1c\x2d\xf8\x12\x61\x5c\x73\x51\x22\xb4\x23\x17\xf0\x37\x5a\x27\x8d\x86\xab\xe4\x12\x06\x04\xc4\xed\x50\x3c\xfc\x9d\xad\x4d\x03\x15\x5f\x83\x36\x1e\x1a\x87\xe0\x4b\xe9\x60\x29\x15\x02\xbe\x09\xac\x3d\x48\x0d\xc2\x54\xb5\x92\x5c\x0b\x84\x95\xf4\x65\x48\xd2\x86\x48\xd8\xd7\x36\x80\x59\x78\x2e\x35\x70\x10\xa6\x5e\x83\x59\xee\x53\xc0\x3d\x63\x00\x00\xa5\xf7\xf5\x75\x9a\xae\x56\xab\x84\x87\x2a\x13\x63\x8b\x54\x6d\x28\x97\x3e\x4c\x27\xb7\xb3\xec\x76\x74\x95\x5c\x32\xf6\x45\x2b\x74\x0e\x2c\xfe\xd3\x48\x8b\x39\x2c\xd6\xc0\xeb\x5a\x49\xc1\x17\x0a\x41\xf1\x15\x18\x0b\xbc\xb0\x88\x39\x78\x43\x75\xae\xac\xf4\x52\x17\x17\xe0\xcc\xd2\xaf\xb8\x45\x96\x4b\xe7\xad\x5c\x34\xfe\x60\x82\xb6\x55\x49\x07\xfb\x80\xd1\xc0\x35\xc4\xe3\x0c\xa6\x59\x0c\x7f\x8e\xb3\x69\x76\xc1\x9e\xa7\xf3\x8f\x8f\x5f\xe6\xf0\x3c\x7e\x7a\x1a\xcf\xe6\xd3\xdb\x0c\x1e\x9f\x60\xf2\x38\xbb\x99\xce\xa7\x8f\xb3\x0c\x1e\xef\x60\x3c\xfb\x0a\x9f\xa6\xb3\x9b\x0b\x40\xe9\x4b\xb4\x80\x6f\xb5\xa5\xda\x8d\x05\x49\x53\x87\x79\xc2\x32\xc4\x83\xe4\x4b\xb3\x29\xc6\xd5\x28\xe4\x52\x0a\x50\x5c\x17\x0d\x2f\x10\x0a\xf3\x8a\x56\x4b\x5d\x40\x8d\xb6\x92\x8e\x5e\x9e\x03\xae\x73\xa6\x64\x25\x3d\xf7\xa1\xfd\x9f\xbf\x93\xb0\x77\x29\x63\x35\x17\x2f\x14\xa4\xe2\x52\x33\x26\xab\xda\x58\x0f\x03\x16\xc5\x4b\xc5\x8b\x98\xb1\x28\x2e\xa4\x2f\x9b\x45\x22\x4c\x95\xba\x7a\xf9\xfe\x43\x2a\xcc\xc2\xf2\x30\xf4\xf2\xab\x4b\xa4\x49\x5f\x94\x29\xd2\xd7\xab\x98\x45\xbc\xc9\xa5\xaf\xad\x79\x5b\xc3\x6e\x70\xb7\x0a\x53\x8f\xce\xa7\xb2\xe2\x05\xba\x94\x17\xba\x34\xce\xa7\x41\x31\x0a\x92\x78\x2f\xe2\x69\x91\x30\x5a\xa3\xf0\x31\x8b\x84\xcd\x85\xd1\xaf\x2b\x5c\x94\xc6\xbc\xf4\x4d\x2a\x6c\x3e\x22\xd9\x66\xa1\x8f\x5a\x75\xff\xfc\xb9\x76\xfd\x61\xd4\xde\xae\x6b\x23\xb5\x1f\xd1\x30\xda\xfe\xd2\x25\x7f\xc1\x42\x7a\x87\xf6\xf5\x1c\x59\xd1\xa0\xf3\x8b\xb3\xfe\x91\xd4\x42\x35\x54\x9c\x50\x12\xb5\xef\x2f\x54\xf2\x15\x35\x3a\x9a\x0f\x65\x0a\x57\xa0\xee\xfb\x12\x08\x1f\x15\xa8\xd1\x72\x6f\xce\xf8\x77\x95\x69\xb4\xa7\x81\xfe\x12\x8d\xe7\xc1\xf8\x86\xe2\x2c\x41\x5b\x8e\x36\x4e\x73\xdf\x77\x02\xb4\x19\x11\x3e\x3a\x10\x9f\xb5\x79\xf6\x23\x9c\xbb\x87\x4c\x8d\x5a\xe6\x15\x7a\x9e\x73\xcf\xfb\xeb\x6a\xde\x38\x8c\x59\x44\x46\xb1\x34\x76\xc5\x6d\xbe\x59\xd6\x7d\x8b\x26\xe1\xa8\x55\x9e\xbd\x23\x48\x1c\x78\x8b\x4e\x18\xed\x9a\x0a\xad\xf0\x56\xf5\x4d\x6e\xd1\x99\xc6\x0a\x1c\x6d\xc5\xf4\xe0\xad\x51\x2a\x44\x0d\x3b\x8d\x40\xcd\x2b\xec\x1b\x33\x88\x46\x5b\x55\xcc\x22\x82\x56\xb8\xd8\x6c\xdb\xbe\x51\xc2\x3b\xdc\xa9\xfa\xcf\xc8\xce\xbc\x86\x8c\x2d\x1b\x2d\x82\x93\x0f\x86\xf0\x8d\x45\xd6\x18\x3f\xa9\x72\xb8\xfe\x03\x7e\x09\xa6\x9d\x4c\x4c\x55\x71\x9d\x7f\x63\x51\xf4\xc5\xe1\x35\x7d\x62\x21\xe6\x75\x1d\x5f\xb0\x28\x6a\xbf\xfb\xd7\x10\x5f\x25\x1f\x2e\xa9\xeb\x3b\xdb\x05\x49\xc6\x79\xde\xaa\x07\x3f\x5c\x3e\x99\x54\xf9\x98\x5a\x9f\xa9\x35\xec\xa4\x5b\xb3\x26\x74\xb2\x79\x3c\xc2\x1d\x58\x79\xc0\x2d\x29\x5a\x97\x7e\xde\xf4\x77\x6b\x73\xed\x48\x70\x33\xcb\xb2\x66\xb9\x94\x6f\xff\x4b\x85\x49\x7e\x90\xee\x48\x2d\x2d\x79\xeb\xc5\x47\xe3\xbc\xeb\x86\x7e\x18\x7b\x60\x77\xad\x79\x58\xd3\xdd\x9a\x03\x47\x27\xd9\x1d\x7f\xc1\x7b\xe9\x37\x05\x75\x6b\x76\x76\x4e\xfc\xfd\xb6\xd1\xcd\xfe\xe4\xe3\xa4\x98\xea\xc9\xa6\x6b\x12\xba\xba\x75\x5b\x1b\x27\xc1\x43\xfb\x7c\x84\xdc\xb8\x7c\x00\x4d\xe1\xee\xb7\x06\xde\x4d\xef\xcc\x9a\xf8\xbf\xb6\x8d\x6e\x56\x63\xa0\x66\x78\x7c\x9c\x8c\xb9\x65\xe8\xf1\x28\xb7\xcd\x38\xc3\x53\xf9\x82\xe1\x06\xcc\x64\x9a\x87\xf7\x76\x8a\xdc\xad\xf8\x1f\xf8\x89\x65\x1f\x7c\x92\xe8\xcf\xf4\x70\x84\x09\x6e\x16\xa0\xf0\x74\x9c\x3a\x70\xda\xad\xe0\x6e\xd3\x79\x6a\xbd\xfd\x64\x93\xa4\x7c\x6a\x2d\x70\xd2\xf6\x4f\x76\x06\xd8\x1d\xe2\xc0\x13\x29\x40\x58\xab\x1f\xdb\x8e\x6e\xcd\x81\x03\x92\x86\x6a\x7c\xde\x76\x74\x6b\xf6\x36\xfe\xc9\xbd\x7e\xf8\xe1\xda\x06\xa7\xa2\xa4\xc0\xb1\x10\xb4\xc8\xa6\xce\x35\x68\x6f\xa4\x13\x74\x36\x5e\x0f\x19\x8b\xd2\x14\x66\x8f\xf3\xdb\x81\x50\x64\x5f\xcd\x62\x78\x0d\x99\xa9\x10\xa8\x54\x07\xdc\x22\xd4\xdc\x39\x3a\x45\x2b\x53\x14\xf4\x6b\x51\x71\x3a\xe7\xd3\x49\xd8\xd1\x25\x01\x56\x08\xba\xbd\x3e\x2c\x10\xc2\xbd\xc2\x9b\x10\x9a\x8b\x70\xf9\xf1\x25\x56\x09\xcc\xe9\x4e\xb4\x92\x4a\x01\x57\x8e\x6e\x1a\x42\x35\x79\x38\xcd\x57\x74\xed\xa0\x33\x78\x6d\xa5\xa6\xd8\x25\xaa\x3a\x09\x47\x27\x4a\x79\x47\x99\x82\x5d\x53\xce\x84\x9a\x19\xfa\x6f\xdf\x59\x44\x47\xec\x64\xaa\xa5\x0f\xc8\x60\x9f\xdf\x9b\xa5\xcf\x64\x95\xce\xa3\x6e\xb1\x21\xcd\xdb\xbd\x69\xe3\x1c\x53\xdd\xbe\xa1\x68\x3c\x0e\x86\xec\x3b\xfb\x37\x00\x00\xff\xff\xaa\xa6\x7f\xce\x4a\x0e\x00\x00") func testImagesAgnhostAgnhostGoBytes() ([]byte, error) { return bindataRead( @@ -3021,7 +3097,7 @@ func testImagesAgnhostAuditProxyMainGo() (*asset, error) { return a, nil } -var _testImagesAgnhostConnectConnectGo = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x56\xef\x6f\xdb\xc8\x11\xfd\xcc\xfd\x2b\xa6\x04\x7a\x25\x05\x8a\xb2\xd3\x4f\x55\xe2\x0f\xaa\x2c\x37\x42\x72\x92\x21\xca\x17\x1c\x72\x41\x6f\x45\x0e\xc9\x85\xc9\x5d\x76\x77\x69\xd9\x08\xfc\xbf\x17\xb3\x24\xf5\xc3\x89\x83\x06\x28\x90\x58\x12\x77\x76\xde\x9b\x37\x6f\x46\x9a\x8c\xd8\x5c\x35\x4f\x5a\x14\xa5\x85\x37\x17\x97\xff\x80\x6d\x89\xf0\xa1\xdd\xa1\x96\x68\xd1\xc0\xac\xb5\xa5\xd2\x26\x66\xec\xa3\x48\x51\x1a\xcc\xa0\x95\x19\x6a\xb0\x25\xc2\xac\xe1\x69\x89\xd0\x9f\x44\xf0\x1b\x6a\x23\x94\x84\x37\xf1\x05\x04\x14\xe0\xf7\x47\x7e\xf8\x96\x3d\xa9\x16\x6a\xfe\x04\x52\x59\x68\x0d\x82\x2d\x85\x81\x5c\x54\x08\xf8\x98\x62\x63\x41\x48\x48\x55\xdd\x54\x82\xcb\x14\x61\x2f\x6c\xe9\x40\xfa\x14\x31\xfb\xbd\x4f\xa0\x76\x96\x0b\x09\x1c\x52\xd5\x3c\x81\xca\x4f\xa3\x80\x5b\xc6\x00\x00\x4a\x6b\x9b\xe9\x64\xb2\xdf\xef\x63\xee\x58\xc6\x4a\x17\x93\xaa\x8b\x32\x93\x8f\xcb\xf9\x62\x95\x2c\xc6\x6f\xe2\x0b\xc6\xee\x64\x85\xc6\x80\xc6\xff\xb4\x42\x63\x06\xbb\x27\xe0\x4d\x53\x89\x94\xef\x2a\x84\x8a\xef\x41\x69\xe0\x85\x46\xcc\xc0\x2a\xe2\xb9\xd7\xc2\x0a\x59\x44\x60\x54\x6e\xf7\x5c\x23\xcb\x84\xb1\x5a\xec\x5a\x7b\x26\xd0\xc0\x4a\x18\x38\x0d\x50\x12\xb8\x04\x7f\x96\xc0\x32\xf1\xe1\x9f\xb3\x64\x99\x44\xec\xd3\x72\xfb\x7e\x7d\xb7\x85\x4f\xb3\xcd\x66\xb6\xda\x2e\x17\x09\xac\x37\x30\x5f\xaf\xae\x97\xdb\xe5\x7a\x95\xc0\xfa\x06\x66\xab\xdf\xe1\xc3\x72\x75\x1d\x01\x0a\x5b\xa2\x06\x7c\x6c\x34\x71\x57\x1a\x04\x49\x87\x59\xcc\x12\xc4\x33\xf0\x5c\x75\x64\x4c\x83\xa9\xc8\x45\x0a\x15\x97\x45\xcb\x0b\x84\x42\x3d\xa0\x96\x42\x16\xd0\xa0\xae\x85\xa1\xe6\x19\xe0\x32\x63\x95\xa8\x85\xe5\xd6\x7d\xfe\xa6\x9c\x98\x8d\x26\x8c\x35\x3c\xbd\xa7\x24\xa9\x92\x12\x53\xcb\x98\xa8\x1b\xa5\x2d\x04\xcc\xf3\xf3\xda\xfa\xcc\xf3\x25\xba\x17\x65\xe8\xaf\x79\x32\x29\xaf\x2a\x7a\x6b\x45\x8d\x3e\x63\x9e\x5f\x08\x5b\xb6\xbb\x38\x55\xf5\x44\x98\x52\x64\x7c\xcf\x2d\xd7\xed\xc4\xa4\xb6\xf1\xcf\xcf\x4d\x93\x5f\xfe\x7d\x92\xaa\x9d\xe6\x3e\x0b\x19\x9b\x4c\x60\x5e\x67\xf3\x0e\x9c\x04\x6e\x4d\xdf\xba\x42\x96\xca\x58\x98\x53\x68\xcc\x1e\xb8\x3e\x0d\xbc\x82\x5f\x5c\x8e\x78\xae\xea\x9a\xcb\xec\x2b\xf3\xee\x0c\x4e\x01\xc0\xef\x0b\x81\xcf\x74\x7d\x4a\xb5\x7c\xf1\x23\xe6\x25\xa5\xd2\x76\x0a\xfe\xcc\x5a\xac\x1b\x6b\x80\xc3\x76\x7e\x4b\x8a\x27\xf3\xed\xed\x50\xbe\x70\x3d\xcd\x40\xa3\x6d\xb5\x74\x6c\xf2\xb6\x02\xd4\x5a\x69\x43\x69\x3e\x2a\x59\x4c\xe1\xcf\xad\x16\x68\xc8\x45\xaa\x41\xf9\x7a\x2a\xab\x9c\xe0\x85\x78\x40\x09\xae\x1c\x4a\x4e\x9c\x62\x58\xcb\x2e\x2d\x08\x0b\x8d\x16\x92\x28\x0d\x8f\x6a\x34\x86\x9a\xd2\x68\xcc\xc5\x23\x66\xdd\x18\xf1\x63\xef\xbb\xa7\x64\x45\x59\x80\x2d\xb9\x05\x8b\xc6\x42\xca\x0d\x1a\x48\xb9\x84\xb4\xc4\xf4\x9e\x3c\x33\x65\x6c\x04\x77\xab\x0f\xab\xf5\xa7\x15\x8c\xe1\x5f\x28\x51\x8b\x74\xd2\xca\x7b\xa9\xf6\x12\x02\xa9\xe4\x58\xa2\xdd\x2b\x7d\x1f\xf6\xe8\x01\x16\x11\xec\x78\x06\x5c\x17\x6d\x8d\xd2\x9a\x90\x8d\x60\xbb\xfc\x75\x41\xc6\x1e\xbb\xdd\x72\xaa\x57\xa7\x28\x90\x1d\x32\x50\xad\x65\x23\xb8\x5e\x25\x30\x86\xd9\xa1\x44\xe9\x9e\x68\x34\xaa\x6a\xe9\x12\x1b\xc1\x66\x71\x73\x97\x2c\xae\x61\x0c\xf3\x63\x2e\x8d\x39\x19\x80\x8d\x60\xbd\x7d\xbf\xd8\xc0\x18\xd6\x6e\x40\x7a\x86\x54\xed\x09\x47\x5f\x2a\xd0\xaa\xb5\x48\x42\x93\xbc\x7e\xf8\x67\xc4\xbc\x99\x2e\xcc\x14\x3a\x7f\x2c\x1e\x79\x6a\xe9\x41\x70\x19\x46\xcc\xdb\xb4\x72\x0a\x50\x73\x21\x23\xf6\xcc\x9c\xab\x88\xb6\x6a\x3b\xfa\xf1\x75\xab\xdd\xb8\xb8\x93\x46\x2b\xab\x52\x55\xf5\x3a\x33\x96\xb7\x32\x05\x21\x85\x0d\x42\xf8\xca\xbc\xa3\x1f\xe3\x9b\x8a\x17\x26\x08\x0f\xf7\x7f\xe3\x3a\xf8\xa5\xcf\x1c\x81\xdf\xbf\xf3\xa3\x73\x94\xe0\x22\x8c\xc0\xff\x95\x3f\x8a\xba\xad\xdd\x11\xec\x30\x57\x1a\x7b\xff\x51\xb9\x83\x27\xfc\xf0\xbb\x80\x89\xa3\xe6\xe0\x06\xba\x11\xf8\xc3\x5b\x9f\xb0\xd3\x86\x5e\xa8\x69\x87\x82\xac\xea\x76\xb7\xa2\x8d\x91\x2b\x5d\x3b\x9b\x1e\x7b\x1a\x39\x0f\xed\x10\x6c\xda\x90\xaf\xdd\x20\x87\xa4\x98\x93\x80\xf4\x0b\xd2\x3a\x83\xd1\xd9\x10\x46\x64\x18\x03\x9f\xbf\x74\x7a\x39\x8d\x32\xb2\xe5\xf4\xca\x9d\x7c\xbe\xf8\xc2\x3c\xb3\x17\x36\x2d\x8f\x54\xbe\x32\x8f\x5c\x0b\xfe\xc0\x75\xca\x3c\xaf\x67\xb2\x9d\xdf\x06\x94\x20\x1a\x9a\x14\x0e\xc1\x8e\xd0\x49\x24\x0d\xde\x37\xa1\x19\xe6\xbc\xad\x2c\x85\xe5\xb5\x8d\x6f\xdc\x94\x05\xca\xc4\x89\xcd\x50\xeb\x08\xfc\x3b\x69\xda\x86\xc6\x11\xb3\x03\xa3\x3f\xa4\x1f\x1d\x3e\x84\xcc\xf3\x94\x89\x17\x8f\xc2\x06\x97\x21\xf3\x9e\x0f\x1a\xbc\xa0\xd8\x7b\x24\xfa\xbe\x9d\x9c\x14\x93\x09\x6c\x30\x6b\x65\xc6\xa5\xad\x9e\xa0\xe1\x9a\xbe\xe8\xdc\xb2\x31\xaa\x7a\xe8\xb6\x3d\xe5\x12\xd2\x5d\x02\xa3\x60\x8f\xae\x13\x9d\x1d\xfa\x26\x69\x4d\x7b\x9a\xd2\x75\x6b\x09\x84\xfb\xee\xd4\xf8\x37\x5a\x6a\x8d\x56\xbb\x0a\xeb\x98\x79\x22\x87\x7f\x47\xf4\x0f\xb5\xa6\x16\x48\xb4\x71\xd2\x54\xc2\xbe\x57\xc6\xde\x2a\x6d\x1d\xf1\xf0\xad\x3b\xff\xcb\x15\x48\xe1\xba\x71\xa2\x55\x7e\x2e\x56\xb7\x44\xa6\xf0\xd7\x07\xa7\x11\x6a\xfd\xad\x3c\x3d\xea\x09\xe4\xa6\xab\x6e\x3b\xbf\x9d\x65\x99\x0e\x7a\x3f\xfe\x1c\xf4\xf5\x2a\xf9\x31\x2c\x73\x46\x38\xc3\xbd\x16\xbc\xda\x76\xcd\x38\x05\x3d\x35\x88\xc8\xdd\x85\xab\x23\x01\xca\x12\xcf\x2b\x65\x30\x38\x05\xb9\x38\xd4\xa6\x9a\x05\x31\x52\xf7\x04\x83\x5a\xc7\xc1\x88\xc0\xd6\xf4\x58\xe9\xf0\x2d\x9d\x50\xa2\x21\x34\x1e\x28\x38\x0b\xbc\x5e\x61\xbf\x5d\xff\x90\x34\xe7\xe7\xd5\x79\xcf\x80\x15\xfd\xfa\xc8\xa1\xff\xf2\x3d\xa1\xd0\x81\x2c\x1c\x11\xca\x77\x08\x38\x25\xe3\x9d\x5d\xa5\x68\xaa\xb9\x7f\x12\x2f\xe6\xeb\xd5\x6a\xd8\xc6\x2e\xfc\x55\x96\x7d\xd4\xc0\xf2\x9c\x26\x29\x44\xff\xa9\x1b\xaf\x25\x70\x5b\xfd\x45\x2b\x4f\x92\xbc\x18\xae\xc3\x54\xff\x0f\xd3\xc5\xb3\x4c\x1f\xfa\x4f\xeb\x61\x30\x1e\x25\xe9\x9c\xe7\x96\x46\x6f\xbd\x43\xf3\xff\x3f\xee\xeb\x79\xcd\x4b\x42\x77\xe4\x66\xb9\x45\x1d\x1c\xbd\x86\x5a\x77\xa7\x35\xbf\xc7\x20\x2d\xb9\x84\xc0\xcd\x6f\x18\x32\xe6\x15\x0a\xa8\xf0\xde\x25\x67\x5e\x76\xb5\x90\x99\x9d\x1a\x43\x11\x52\x54\x11\x50\xcd\x61\x67\xb6\x17\x3e\x7e\x69\x64\x6a\x4d\xc7\xe0\xdd\x98\x62\x99\xf7\x1c\x10\xae\xc1\x8a\x7e\x2b\x0d\x4b\xb8\x87\x7c\x37\x76\xb1\xd3\x63\xea\x13\x95\x7e\xaa\xb7\x2f\x9d\xdc\xe3\xbc\x1b\x1f\x04\xfb\xc1\x76\x3e\x9f\x89\x97\x6b\xf8\xbf\x01\x00\x00\xff\xff\x54\x07\xa6\x63\xf4\x0c\x00\x00") +var _testImagesAgnhostConnectConnectGo = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xbc\x57\x7f\x6f\xdb\xc8\x11\xfd\x9b\xfb\x29\xa6\x04\x2e\x25\x0d\x8a\x72\xd2\xfe\x53\x5d\x52\x40\x27\x29\x8d\x91\x9c\x64\x58\xd2\x05\x87\x5c\xd0\x5b\x71\x87\xd2\xc2\xe4\x2e\x6f\x77\x69\x59\x08\xfc\xdd\x8b\x59\x92\xfa\x95\xd8\x39\xa3\x45\x83\x24\xa6\xc9\xe1\xbc\x37\x33\x6f\x66\x96\xfd\x0b\x36\xd2\xd5\xce\xc8\xf5\xc6\xc1\xab\xcb\x97\xff\x80\xc5\x06\xe1\x7d\xbd\x42\xa3\xd0\xa1\x85\x61\xed\x36\xda\xd8\x94\xb1\x0f\x32\x43\x65\x51\x40\xad\x04\x1a\x70\x1b\x84\x61\xc5\xb3\x0d\x42\xfb\x24\x81\x5f\xd0\x58\xa9\x15\xbc\x4a\x2f\x21\x22\x83\xb0\x7d\x14\xc6\x3f\xb2\x9d\xae\xa1\xe4\x3b\x50\xda\x41\x6d\x11\xdc\x46\x5a\xc8\x65\x81\x80\xf7\x19\x56\x0e\xa4\x82\x4c\x97\x55\x21\xb9\xca\x10\xb6\xd2\x6d\x3c\x48\xeb\x22\x65\xbf\xb6\x0e\xf4\xca\x71\xa9\x80\x43\xa6\xab\x1d\xe8\xfc\xd8\x0a\xb8\x63\x0c\x00\x60\xe3\x5c\x35\xe8\xf7\xb7\xdb\x6d\xca\x3d\xcb\x54\x9b\x75\xbf\x68\xac\x6c\xff\xc3\xd5\x68\x32\x9d\x4f\x7a\xaf\xd2\x4b\xc6\x96\xaa\x40\x6b\xc1\xe0\x1f\xb5\x34\x28\x60\xb5\x03\x5e\x55\x85\xcc\xf8\xaa\x40\x28\xf8\x16\xb4\x01\xbe\x36\x88\x02\x9c\x26\x9e\x5b\x23\x9d\x54\xeb\x04\xac\xce\xdd\x96\x1b\x64\x42\x5a\x67\xe4\xaa\x76\x27\x09\xea\x58\x49\x0b\xc7\x06\x5a\x01\x57\x10\x0e\xe7\x70\x35\x0f\xe1\xa7\xe1\xfc\x6a\x9e\xb0\x8f\x57\x8b\x77\xb3\xe5\x02\x3e\x0e\x6f\x6e\x86\xd3\xc5\xd5\x64\x0e\xb3\x1b\x18\xcd\xa6\xe3\xab\xc5\xd5\x6c\x3a\x87\xd9\x5b\x18\x4e\x7f\x85\xf7\x57\xd3\x71\x02\x28\xdd\x06\x0d\xe0\x7d\x65\x88\xbb\x36\x20\x29\x75\x28\x52\x36\x47\x3c\x01\xcf\x75\x43\xc6\x56\x98\xc9\x5c\x66\x50\x70\xb5\xae\xf9\x1a\x61\xad\xef\xd0\x28\xa9\xd6\x50\xa1\x29\xa5\xa5\xe2\x59\xe0\x4a\xb0\x42\x96\xd2\x71\xe7\x7f\xff\x2a\x9c\x94\x5d\xf4\x19\xab\x78\x76\x4b\x4e\x32\xad\x14\x66\x8e\x31\x59\x56\xda\x38\x88\x58\x10\xe6\xa5\x0b\x59\x10\x2a\xf4\x3f\xb4\xa5\xff\x29\x7c\xb5\x6e\x2e\x77\x36\xe3\x45\x41\x97\x4e\x96\x18\x32\x16\x84\x6b\xe9\x36\xf5\x2a\xcd\x74\xd9\x97\x76\x23\x05\xdf\x72\xc7\x4d\xdd\xb7\x99\xab\xc2\xd3\xe7\xb6\xca\x5f\xfe\xad\x9f\xe9\x95\xe1\x21\x8b\x19\xeb\xf7\x61\x54\x8a\x51\xc3\x83\x72\x5d\xdb\xb6\x8a\x6b\xb5\xd1\xd6\xc1\x88\x4c\x53\x76\xc7\xcd\xb1\xe1\x1b\x78\xe1\x7d\xa4\x23\x5d\x96\x5c\x89\x2f\x2c\x58\x5a\x1c\x00\x40\xd8\xc6\x04\x9f\xe8\xf5\x01\x85\xf5\x39\x4c\x58\x30\xdf\x68\xe3\x06\x10\x0e\x9d\xc3\xb2\x72\x16\x38\x2c\x46\xd7\x09\x2c\xc7\xd7\x54\x81\xf9\x68\x71\xdd\xa5\x43\xfa\x1a\x0b\x30\xe8\x6a\xa3\x3c\xa5\xbc\x2e\x00\x8d\xd1\xc6\x92\xaf\x0f\x5a\xad\x07\xf0\xfb\xc2\x48\xb4\xa4\x2a\x5d\xa1\xfa\x8e\x3f\xa7\x7d\x15\xd6\xf2\x0e\x15\xf8\xc0\x08\x81\xd8\xa5\x30\x53\x8d\x6f\x90\x0e\x2a\x23\x15\x91\xeb\x6e\x95\x68\x2d\x55\xaa\x32\x98\xcb\x7b\x14\x4d\x6f\xf1\x83\x20\x9a\xbb\x4d\x81\xc0\x6d\xb8\x03\x87\xd6\x41\xc6\x2d\x5a\xc8\xb8\x82\x6c\x83\xd9\x2d\x09\x69\xc0\xd8\x05\x2c\xa7\xef\xa7\xb3\x8f\x53\xe8\xc1\xbf\x50\xa1\x91\x59\xbf\x56\xb7\x4a\x6f\x15\x44\x4a\xab\x9e\x42\xb7\xd5\xe6\x36\x6e\xd1\x23\x5c\x27\xb0\xe2\x02\xb8\x59\xd7\x25\x2a\x67\x63\x76\x01\x8b\xab\x9f\x27\xa4\xf6\x9e\x1f\x38\xc7\x49\x6b\x72\x0b\x24\x0c\x01\xba\x76\xec\x02\xc6\xd3\x39\xf4\x60\xb8\x0f\x51\xf9\x3b\x06\xad\x2e\x6a\x7a\x89\x5d\xc0\xcd\xe4\xed\x72\x3e\x19\x43\x0f\x46\x07\x5f\x06\x73\x92\x02\xbb\x80\xd9\xe2\xdd\xe4\x06\x7a\x30\xf3\x5d\xd3\x32\xa4\x68\x8f\x38\x86\x4a\x83\xd1\xb5\x43\x4a\x34\xa5\x37\x8c\x7f\x4f\x58\x30\x34\x6b\x3b\x80\x46\x29\x93\x7b\x9e\x39\xba\x11\xbd\x8c\x13\x16\xdc\xd4\x6a\x00\x50\x72\xa9\x12\xf6\xc0\xbc\xbe\x22\x16\x10\x73\x5d\x3b\xf0\x21\xa4\xe3\xda\xf8\x3e\x62\x41\x65\xb4\xd3\x99\x2e\xda\x44\xb3\xa0\x16\xd5\x98\x3b\x0e\xdd\x8d\x98\xb1\xbc\x56\x19\x48\x25\x5d\x14\xc3\x17\x16\x1c\xd4\x9a\xbe\x2d\xf8\xda\x46\xf1\xde\xdf\x2f\xdc\x44\x2f\x5a\xa8\x04\xc2\xf6\x2a\x4c\x4e\x51\xa3\xcb\x38\x81\xf0\x67\x7e\x2f\xcb\xba\xf4\x8f\x60\x85\xb9\x36\xd8\x0a\x93\x52\xd0\xe9\x24\x8c\xbf\x09\x38\xf7\xe4\x3c\x5c\x17\x41\x02\x61\x77\x19\x12\x76\x56\xd1\x0f\x2a\xe4\x3e\x46\xa7\x9b\x21\xaf\x69\xb4\xe4\xda\x94\x5e\xba\x87\x3a\x27\x5e\x57\x2b\x04\x97\x55\x09\xd4\xa2\x22\xc1\xfb\x5e\xff\x2e\x8b\x36\x6d\x09\x84\xb5\xa8\x7a\x82\x3b\x4e\xe8\x54\x30\xc5\x4b\xec\x98\x50\x0f\x55\x7c\x57\x68\x2e\xc0\xa2\x12\x5d\xf7\x58\x34\x77\x48\xb1\x3e\xb4\xd9\xa6\xf2\x45\x59\x29\xe0\xe2\x64\x1a\x24\xa4\x57\x0b\x9f\x3e\x37\xc5\xf1\xe5\x10\xd4\x15\x83\x37\xfe\xc9\xa7\xcb\xcf\x2c\xb0\x5b\xe9\xb2\xcd\x21\xea\x2f\x2c\xa0\xa6\x81\xb0\x4b\xcb\x80\x05\x41\x1b\xf4\x62\x74\x1d\x91\x83\xa6\x42\xba\x76\x71\x67\x5c\x8b\x13\xc3\xe5\xf8\xcc\xd0\xe7\x87\x42\xde\xbf\xe1\x13\x75\xf4\x0a\x4d\x8a\xaf\x9c\x0b\xcc\x79\x5d\x38\x32\xcb\x4b\x97\xbe\xf5\x63\x21\xd2\x36\x9d\x3b\x81\xc6\x24\x10\x2e\x95\xad\x2b\x9a\x1f\x28\xf6\x31\xfc\xa6\xc2\x64\xff\x4b\xcc\x82\x40\xdb\x74\x72\x2f\x5d\xf4\x32\x66\xc1\xc3\x3e\x6b\x67\x41\xb5\x12\xde\xc3\x9f\xaa\xd0\x27\xaf\xdf\x87\x1b\x14\xb5\x12\x5c\xb9\x62\x07\x15\x37\xb4\xae\xfd\x88\xb4\xba\xb8\x6b\x76\x16\xf9\x92\xca\xbf\x04\x56\xc3\x16\xbd\x4c\x1a\xad\xb6\x0a\x32\x86\xb6\x0d\xb9\x6b\x86\x29\x48\x7f\x02\x30\xf8\x57\x9a\xc7\x95\xd1\xab\x02\xcb\x94\x05\x32\x87\x7f\x27\xf4\x17\x8d\xa1\xa2\x29\x74\xe9\xbc\x2a\xa4\x7b\xa7\xad\xbb\xd6\xc6\x79\xe2\xf1\x8f\xfe\xf9\x5f\xde\x80\x92\xbe\x7e\x47\xb9\xca\x4f\x93\xd5\x4c\xbd\x01\xfc\x70\xe7\x73\x84\xc6\x7c\x9d\x9e\x16\xf5\x08\xf2\xa6\x89\x6e\x31\xba\x1e\x0a\x61\xa2\xb6\x59\x9e\x07\x3d\x9e\xce\x9f\x86\x65\x5e\x08\x27\xb8\x63\xc9\x8b\x45\x53\x8c\x63\xd0\x63\x81\xc8\xdc\xbf\xf0\xe6\x40\x80\xbc\xa4\xa3\x42\x5b\x8c\x8e\x41\x2e\xf7\xb1\xe9\x6a\x42\x8c\xf4\x2d\xc1\xa0\x31\x69\x74\x41\x60\x33\xba\xad\x4d\xfc\x23\x3d\x21\x47\x9d\x69\xda\x51\xf0\x12\x78\x3c\xc2\x76\x1d\xfc\xa6\xa8\xfd\x4f\xa3\x0b\x1e\x00\x0b\x3a\x43\xe5\xd0\x9e\x1b\x8e\x28\x34\x20\x13\x4f\x84\xfc\xed\x0d\x8e\xc9\x04\x27\xaf\x92\x35\xc5\xdc\xde\x49\x27\xa3\xd9\x74\xda\xad\x0f\x6f\xfe\x28\xcb\xd6\xaa\x63\x79\x4a\x93\x32\x44\xff\xa8\x1a\x8f\x39\xf0\x6b\xe8\xac\x94\x47\x4e\xce\x9a\x6b\xdf\xd5\x7f\xa2\xbb\xb8\x10\x66\x5f\x7f\x1a\x0f\x9d\xf0\xc8\x49\xa3\x3c\x3f\x34\x5a\xe9\xed\x8b\xff\xbf\x51\x5f\xcb\x6b\xb4\x21\x74\x4f\x6e\x98\x3b\x34\xd1\x41\x6b\x68\x4c\xf3\xb4\xe4\xb7\x18\x65\x1b\xae\x20\xf2\xfd\x1b\xc7\x8c\x05\x6b\x0d\x14\x78\xab\x92\x13\x2d\xfb\x58\x48\xcc\x3e\x1b\x5d\x10\x4a\x16\x09\x50\xcc\x71\x23\xb6\x33\x1d\x9f\x0b\x99\x4a\xd3\x30\x78\xdd\x23\x5b\x16\x3c\x44\x84\x6b\xb1\xa0\x63\x5e\x37\xb6\x5b\xc8\xd7\x3d\x6f\x3b\x38\xb8\x3e\xca\xd2\xb3\x6a\x7b\xae\xe4\x16\xe7\x75\x6f\x9f\xb0\x27\xa6\xf3\x69\x4f\x3c\x39\x86\xbb\x95\xf1\xb4\x50\x12\xa0\x65\x09\x47\x0b\xad\x3d\xb1\x04\x06\xb9\xf8\x69\x47\xdf\x7b\x52\x39\x16\x04\xab\x3a\x87\xe6\x4f\x5b\xb0\x4f\x9f\x57\x3b\x87\x09\xbc\xbc\x7c\xf5\xf7\x98\x05\x94\xbb\xc7\x26\xdd\x72\xdc\xea\x8d\xd6\xda\xff\x6b\xd2\x9d\xa0\x3d\x47\xdc\xdf\xac\xda\x39\x24\x6d\x98\x36\xa1\xff\x84\xcb\x6e\xc0\x79\xcd\xf9\x0a\xa4\x73\x74\x63\xe4\xa2\x90\x0a\xbd\xe6\xd3\xa9\xde\x46\x71\x3a\x14\x62\xdf\x02\x5f\xe7\xe0\xbf\x54\xd2\xc3\x49\x0d\x5a\x22\x1f\x8d\x74\x5d\xb5\x22\xf2\x3f\x6f\xfd\x87\x3f\x58\xef\x8d\x14\x10\x7f\x83\x8c\x5f\xc7\xcb\xf1\xb5\x1f\x9d\x43\x25\x3c\x54\x03\xdd\x02\xed\x35\x72\x02\x78\x83\x5c\x44\xab\x3a\x7f\xb6\x47\xda\xdf\xca\xd6\xa6\xd9\xfb\x06\x6d\xa5\xfd\xc7\xaa\xd1\xa5\x3f\xbb\x35\xe7\xb4\x53\x64\x6a\xf1\xcb\x3f\x53\xce\xa9\x6e\xa4\x6e\x30\x43\x79\x87\xa2\x71\x7b\x38\xfe\xa5\x30\xe2\x4a\x69\x07\xeb\x9a\x1b\xae\x5c\xfb\xc5\xdc\x3c\x3c\xbc\xd5\x30\xfb\xa3\x46\xeb\xd2\x27\xdb\xf0\xb1\x58\x9b\x23\x8a\x6f\x35\x85\x0e\xcf\x56\x27\x89\xb7\x59\x55\xcd\x6e\xbd\x85\x17\x2f\xa0\xb1\x3b\xdb\x9b\xdf\x59\x9b\x67\x5a\x39\x5a\x98\xcd\x37\x77\x3a\xd2\xca\x71\xa9\x2c\x71\x6a\x20\x23\xfa\x2e\xc8\xbe\xfa\x54\x0a\x9f\xc6\x6b\x17\xe0\xb7\xf1\x9e\x7f\x78\x7a\x38\xdb\x7e\xff\x09\x00\x00\xff\xff\x11\xc6\xf3\x31\x8e\x12\x00\x00") func testImagesAgnhostConnectConnectGoBytes() ([]byte, error) { return bindataRead( @@ -3461,7 +3537,7 @@ func testImagesAgnhostNetNatClosewaitGo() (*asset, error) { return a, nil } -var _testImagesAgnhostNetexecNetexecGo = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7c\xfd\x73\xdb\xc6\xd1\xf0\xcf\xc4\x5f\xb1\xc5\x8c\x6d\xd0\x85\x40\xda\x49\x27\x79\x99\xa8\x19\x45\xb6\x62\x35\x8e\xac\x57\x94\x9a\xe9\xf8\xf5\xb4\x27\xe0\x48\x5e\x0d\xe0\x98\xbb\x83\x3e\xea\xea\x7f\x7f\x67\xf7\x3e\x00\x90\x14\x2d\xda\xee\x3c\x4f\x9f\xa7\x9d\x69\x24\x01\x7b\x7b\xfb\xbd\x7b\x7b\x0b\x8f\x9e\x46\x87\x72\x79\xab\xc4\x7c\x61\xe0\xf9\xf8\xd9\xd7\x70\xbe\xe0\xf0\x73\x73\xc9\x55\xcd\x0d\xd7\x70\xd0\x98\x85\x54\x3a\x8b\xa2\xd7\x22\xe7\xb5\xe6\x05\x34\x75\xc1\x15\x98\x05\x87\x83\x25\xcb\x17\x1c\xdc\x9b\x14\xfe\xcc\x95\x16\xb2\x86\xe7\xd9\x18\x12\x04\x88\xdd\xab\x78\xf8\x5d\x74\x2b\x1b\xa8\xd8\x2d\xd4\xd2\x40\xa3\x39\x98\x85\xd0\x30\x13\x25\x07\x7e\x93\xf3\xa5\x01\x51\x43\x2e\xab\x65\x29\x58\x9d\x73\xb8\x16\x66\x41\x9b\x38\x14\x59\xf4\x17\x87\x40\x5e\x1a\x26\x6a\x60\x90\xcb\xe5\x2d\xc8\x59\x17\x0a\x98\x89\x22\x00\x80\x85\x31\xcb\xc9\x68\x74\x7d\x7d\x9d\x31\xa2\x32\x93\x6a\x3e\x2a\x2d\x94\x1e\xbd\x3e\x3e\x7c\x79\x32\x7d\xb9\xf7\x3c\x1b\x47\xd1\x45\x5d\x72\xad\x41\xf1\xdf\x1a\xa1\x78\x01\x97\xb7\xc0\x96\xcb\x52\xe4\xec\xb2\xe4\x50\xb2\x6b\x90\x0a\xd8\x5c\x71\x5e\x80\x91\x48\xe7\xb5\x12\x46\xd4\xf3\x14\xb4\x9c\x99\x6b\xa6\x78\x54\x08\x6d\x94\xb8\x6c\x4c\x4f\x40\x9e\x2a\xa1\xa1\x0b\x20\x6b\x60\x35\xc4\x07\x53\x38\x9e\xc6\xf0\xe3\xc1\xf4\x78\x9a\x46\xbf\x1e\x9f\xbf\x7a\x73\x71\x0e\xbf\x1e\x9c\x9d\x1d\x9c\x9c\x1f\xbf\x9c\xc2\x9b\x33\x38\x7c\x73\xf2\xe2\xf8\xfc\xf8\xcd\xc9\x14\xde\x1c\xc1\xc1\xc9\x5f\xe0\xe7\xe3\x93\x17\x29\x70\x61\x16\x5c\x01\xbf\x59\x2a\xa4\x5d\x2a\x10\x28\x3a\x5e\x64\xd1\x94\xf3\xde\xe6\x33\x69\x89\xd1\x4b\x9e\x8b\x99\xc8\xa1\x64\xf5\xbc\x61\x73\x0e\x73\x79\xc5\x55\x2d\xea\x39\x2c\xb9\xaa\x84\x46\xe5\x69\x60\x75\x11\x95\xa2\x12\x86\x19\xfa\x7b\x8d\x9d\x2c\x7a\x3a\x8a\xa2\x25\xcb\xdf\x23\x12\xb4\x93\x1b\x9e\x47\x91\xa8\x96\x52\x19\x48\xa2\x41\x9c\xcb\xda\xf0\x1b\x13\x47\x83\x98\xd7\xb9\x2c\x44\x3d\x1f\xfd\x5d\xcb\x1a\x1f\xcc\x2a\x7a\x2e\xa4\xfd\xef\x48\xc8\xc6\x88\x12\xff\x28\xe5\x1c\x7f\xd4\xdc\xb8\x1f\x23\xd4\xa2\xff\xbd\x51\x04\x24\xb5\xfd\xef\x08\x37\xc5\x5f\xb5\x51\xb9\xac\xaf\xdc\xaf\xa2\x9e\x13\x80\xbe\xad\xf3\x11\x33\xb2\x12\x04\x64\x44\xc5\xe3\x28\x1a\xc4\x73\x61\x16\xcd\x65\x96\xcb\x6a\x24\xf4\x42\x14\xec\x9a\x19\xa6\x9a\x91\xce\xed\x4e\x9d\xf7\x7a\x39\x7b\xf6\xd5\x28\x97\x97\x8a\xe1\x52\xa4\xb2\xe6\x06\xe2\xf7\xdf\xea\x4c\xc8\x11\x5b\x8a\x8a\xe5\x0b\x51\x73\x75\x3b\x5a\xbe\x9f\x8f\x10\x60\x44\xc4\x0f\xa3\xe8\x8a\x29\x94\x04\x32\x70\x8a\x52\xc1\xff\xed\xc3\xb7\xe3\x6f\xc7\xd1\xa0\x29\xda\x67\xf6\xe1\xb3\x68\x80\x04\x74\x20\xf7\xf0\xd1\x82\x97\xe5\x29\x33\x0b\xfb\x28\x1e\x5d\x8a\x7a\xa4\x17\x71\x34\xd0\x5c\x5d\x71\x75\xc6\x59\x71\x8b\x6f\x1e\x5b\x46\x7f\x94\xb2\xfc\x30\xbe\x8b\x06\x39\x57\xe6\x08\x3d\xcb\x2d\x8c\xa3\xc1\x52\x89\xab\x9f\xf9\xad\x7d\x6a\x1f\x21\x6d\x6f\xae\xb8\x52\xa2\xe0\xf6\xd1\x30\x8a\x46\x23\x38\xac\x8a\x13\xab\x53\xb4\xdb\x46\x3b\x8f\x98\xd7\x0b\xa9\x0d\x1c\xa2\x3c\x32\xe2\xaf\x03\xb8\x0f\x8f\x49\x50\xd9\xa1\xac\x2a\x56\x17\x1f\xa2\xc1\x85\xe6\x13\x00\x88\x9d\x7d\xc4\x69\x34\x98\x2e\xa4\x32\x13\x88\x0f\x15\x67\x18\x5c\x5e\x9d\x9f\x9f\x26\xd3\x61\x0a\x17\x2f\x4e\x53\xb4\x3b\x48\xe4\x12\x8d\x8e\x95\xe5\xed\x10\xa6\x87\xe7\xa7\x60\x59\xd5\x36\x1e\x5c\x31\x25\x64\xa3\x81\xd7\xc5\x52\x8a\xda\x68\xc4\xfa\x5a\xd6\xf3\x09\xfc\x6d\x6a\x98\x32\x1a\x98\xc7\xea\x56\xa2\xb3\xcd\xc5\x15\xaf\x81\xac\x33\x84\x95\x99\x2c\x4b\x79\x8d\xb6\x1f\x90\x4d\xa2\x68\x0f\x46\x13\x38\xe3\xa6\x51\xb5\x26\x30\x0c\x0a\x5c\x9b\x27\x1a\xd0\x84\xb4\x61\xd5\x32\x43\xa8\xbc\x14\xbc\x36\x62\x79\x1f\xf4\xf1\x29\xb0\xa2\x40\xdf\x24\xf0\x42\xb0\x72\x02\x9e\x6f\xe6\x28\xaa\x9b\xea\x12\x29\x9c\xf9\x85\x1a\xe3\x0b\x22\xb2\xef\x49\xe0\x28\x16\x22\xbd\xd1\x48\x6d\xfb\x76\xa9\xa4\x91\xb9\x2c\xd3\x08\x08\x48\x39\x42\x18\xfc\x69\xfa\xe6\xa4\xc3\xa9\xe0\x65\xa1\x21\x56\x5c\x2f\x25\x46\xbf\x18\x12\xdd\xe4\x39\xd7\x7a\xd6\x94\x7e\x6b\x08\xaf\x87\x84\x2d\xe6\x4a\x49\x85\xb0\x11\xc0\x8c\x89\x92\x17\x1b\x40\xb3\xc0\x7e\xfc\x7c\x3c\x86\x37\x3f\xc7\xa0\x0d\x33\x8d\x86\x5c\x16\x1c\x84\x0d\xce\x25\xa3\x45\x76\x31\x6d\xcd\x0b\x5e\x20\xdd\xf1\xd7\xcf\xbe\x81\x97\x37\x4b\x9e\xdb\x68\x03\x47\xb4\x53\x8c\x2b\x85\x81\x42\x14\x98\x2f\x52\x8c\x6f\xf1\xd7\xe3\x31\xfc\xc8\x0a\x38\xb3\x88\x08\x86\xd5\x21\x03\x78\x35\x3e\xd1\xb0\x64\x8a\x55\xdc\x70\xa5\x23\x40\x1b\x16\xf5\x15\x2b\x45\x91\x51\x72\xdb\x08\x07\x4c\xf1\x49\x04\xb0\x07\x31\x0a\x3d\x9e\x10\x28\xc9\xdf\x2c\x18\x9a\x4d\x59\xc2\x25\x07\xd4\x23\xc6\x58\x82\x44\xad\x38\x48\x52\xd0\xfd\x90\x8e\x77\x07\x8c\x06\x1a\xc8\x40\xd6\x0a\x66\x18\x6a\xfe\x92\x83\xe6\x35\x22\x52\xb2\x99\x2f\xd0\x2d\x32\x38\x9e\x51\xca\x74\xd1\x9b\x17\x29\x0a\x86\x76\x51\x5c\x37\xa5\xa1\x74\x47\xf9\x70\x5d\x42\x5d\x5d\x5c\x72\x34\x1f\x6b\x24\x2d\x0b\xce\x86\x3c\x1b\xee\x4f\xb8\x5e\x88\x7c\x11\x78\xa1\x18\x70\xbd\xe0\x35\x54\xec\xbd\x37\x42\xc7\x53\x06\x2f\xf8\x8c\x35\xa5\x81\x2b\x56\x36\x7c\x02\x31\x05\xed\x8c\xc8\x3a\xc8\x31\xb3\x53\x1a\xa5\xb7\xda\xbf\x4e\x21\x6e\x0a\xfa\x41\x81\xd7\x51\x63\x94\xe0\xda\x91\xd2\xfa\x06\x39\x5e\x77\xcb\x40\xd7\x92\xab\x99\x54\x15\x2f\xd6\x89\x78\x16\xa3\xdf\xc5\x23\x9e\x2f\x64\xdc\x77\x52\xeb\x3d\x71\xa5\xe7\x31\x24\x16\xe2\x87\x4a\xcf\xf7\xf1\x17\x5e\xfc\x15\x9f\x0f\xd3\xd6\x7d\x7c\x44\xf2\xc2\x8c\x51\x9a\x1e\xfb\x8d\x40\xa5\x1e\x96\x52\x3b\x12\x5d\xd0\x09\xab\xed\x66\xa4\x00\xf4\xaa\xb9\x62\x39\x47\xaf\xd3\x8b\xc6\x14\xf2\xba\xde\x62\x93\xd1\x80\x8c\x72\xb0\xe7\xb6\xb4\x72\xc1\x2d\x2d\x3e\x9f\xd7\x97\x4a\xa2\x2f\xaf\xc9\x60\x9c\xc1\x01\xc6\x38\xcc\xe8\x20\x6a\xc3\xe7\x5c\xc1\xdb\xf1\xde\xb3\xe7\xdf\xbc\xcb\x08\x2d\x4a\x56\x36\xde\x2c\x59\x25\x1b\xb4\x47\x2b\x71\xb4\xc7\x6b\x26\x0c\x6d\x93\xcb\xba\xe6\xb9\x2d\x07\x8c\x84\x1c\xf9\x85\x4b\x3e\x93\x8a\x13\x27\x58\x0c\x01\xb1\x13\x0d\x06\x6b\x4a\x47\xe7\x82\xb9\xc4\xb2\x03\x8a\x46\xd9\xb2\x82\x0c\x7b\xdc\x65\xc0\xaa\x95\xf8\x13\x55\xc5\x0b\xc1\x0c\x2f\x6f\x49\x94\xb2\x31\xd1\x60\x10\x64\x46\xc4\x23\x71\xdb\x29\xf7\x04\x62\x62\x40\x02\x5b\x99\x6f\x24\x31\x1a\xc0\x83\xa9\x24\x9c\x01\x61\x97\x5e\x6b\x18\x0b\xce\x4a\xb3\xf8\x47\xc7\xf2\x42\x7c\x74\x31\xd1\x19\x8a\xc0\xba\x93\x15\xb7\x29\x86\xc2\xe7\x30\xb5\x36\x76\xaa\x78\x2e\xeb\x42\x74\x43\x62\x04\x20\xb1\xe6\xbb\x16\x9a\x5b\xab\x69\x51\xe4\xb2\xd6\xa2\xe0\x58\xbc\x62\xac\x20\x8c\x7e\xa3\x8b\x17\x3e\x89\xfa\x70\xea\xa8\xbf\xe5\x18\x7c\x30\x42\x1a\x92\x3a\x06\x05\xa2\x5d\x6a\x53\xb3\x8a\xaf\xb8\x8d\xc5\xf1\x44\x83\x7f\xdf\x42\x9f\x3c\x18\x5a\xf1\x42\x28\x9e\x9b\x0e\x34\x03\xff\x30\xe4\x95\x7e\x16\x8c\x4b\x99\x93\x36\xe2\x8f\x7a\x65\x04\xe8\xd1\x1e\xdf\x0f\x7e\xe1\x3e\x39\xf9\xa3\xaf\x8e\xd0\xcd\x67\x52\x5e\x32\xf5\x18\xe1\xf7\xbf\x1a\x7f\x13\x0f\x2d\x65\x54\x6c\xc5\x13\x78\x79\xc3\xf3\xc6\xf0\x5e\xa8\xa0\x77\xae\xb2\x89\x29\x17\xe5\x55\x41\xc1\x83\xde\xfc\x90\x57\xc5\xbe\x96\x15\xdf\xcb\x1d\x0c\xa5\xd0\x08\x56\x53\x32\x96\xc5\x4c\xd4\x3e\x82\xfa\xc4\x2c\x1b\xb3\x6c\x4c\x0c\x89\x5b\xfe\x44\x83\x7d\xd4\xcd\xc4\xdd\xd7\x11\x00\x3d\x83\x8a\x6b\xcd\xe6\x7c\x53\x1a\x76\xda\x77\x6b\x3a\x59\x77\x6b\xce\xad\xa5\xf1\xe2\xb0\xa6\xbd\x3d\xba\xb5\xc1\x68\x6c\x97\x35\xcb\x52\xb2\x22\x9e\x38\x0f\x43\xce\xe9\x88\x67\x93\x9b\x7d\x8b\x34\xb8\x03\x14\x9a\x9e\xa8\x09\x95\x5f\xab\x63\x2c\xcd\x0a\x5b\xb8\x19\x97\x84\x31\x3f\x9c\x7d\xa4\xbc\xe9\x48\x71\x45\xca\x25\x7f\xa2\x01\x6d\xd0\xa3\xb4\x6c\x78\x25\x79\xf9\x76\xd6\x61\x59\xb1\x94\x06\x2b\x3c\x34\x31\xcb\x35\x7a\x98\x95\x3b\x1e\x87\x8f\x67\x10\xef\xed\x99\x52\xef\x61\xb5\xbd\x87\xbb\xc4\xe8\x8a\xac\x28\x78\x01\x89\x28\x38\x16\xb1\xf6\x50\x5b\xff\xbd\xa9\x29\x7a\x5a\xaa\xdd\x3a\x2c\xc9\x99\xe1\x7b\xef\xf9\xad\x5d\x9e\x12\x71\x54\x1d\xd8\x2d\xa3\x90\x80\x97\x73\x85\x82\x43\x39\xe2\xfb\xa9\x0d\x00\xa2\xc2\x03\xd8\x82\x69\x28\x6c\xe8\x4f\xad\xb3\x94\x54\xc3\xec\x5d\x32\xcc\xdb\x48\xde\x08\xf7\x7a\xcf\x6f\x49\x18\x1a\x0f\xc9\xf1\x28\x00\x66\xb9\x32\xb1\xb5\xb4\xce\xc3\xf7\xfc\x16\xeb\x44\x8e\xc9\x14\xab\x1b\xae\x62\xd0\xcd\xa5\xb3\xa7\xa1\x17\x00\x66\xf3\x3d\xe9\x4e\x11\x24\x00\xcd\x4d\xcb\x48\xa7\x0e\x27\x5e\x58\x79\xcd\x6e\xb5\x7d\x64\xfd\xd8\x1f\x40\x96\x78\xce\x79\xec\xfc\x5a\xa7\x91\x98\xd7\x52\xad\xd4\x1a\x70\x71\xf6\x1a\x45\x6f\x3c\x32\x2d\x5d\x2c\x63\xdd\x30\xe7\xb4\x2c\xea\x42\xe4\x0c\xcf\xdb\xf8\xae\xad\xd0\x6c\x94\x29\x42\xad\xdd\x9e\x04\x1c\x73\xf6\x20\x10\x3f\x34\x0e\x22\x2c\xc6\x17\xf8\xbe\xd2\xf3\x3f\x6e\x2c\x36\xe8\x0d\xc2\xf9\x63\x43\xfc\xf1\x73\x43\x14\x1d\x14\x36\x03\xa0\x21\xa5\xe8\x9d\x09\x2a\x49\xd6\x68\x56\xb3\x21\xec\xed\x61\xed\xb4\x47\x8c\x09\x2c\x1c\xb4\xee\x56\x87\x4e\x30\x75\xf7\x18\x65\x45\xc3\x0c\x49\x23\x8d\x9c\x24\x48\xca\x56\x16\x1a\xbd\xc4\x8b\x01\x98\x5e\xc9\x20\x59\xf4\xb7\x34\x1a\x1c\xa8\xb9\x9e\x80\x3d\xef\xfd\xc2\x6e\x44\xd5\x54\x27\xf8\x2c\x19\x0f\xd3\x68\x70\xd6\xd4\x13\x80\x8a\x89\x3a\x8d\xee\xa2\x68\xd6\xd4\x39\x88\x5a\x98\x64\x08\x1f\xa2\x41\x7b\x66\xcc\x8e\x4a\x36\xd7\xc9\x30\x3b\xae\xcd\x9f\x99\x4a\x1e\xfb\xb3\x72\x6a\x6b\x44\x62\x2c\x4e\xe9\xcc\x9c\x42\x4c\x6e\xf1\x5a\x68\xc3\x6b\x40\xa8\x78\xb8\x11\xd9\x94\x5a\x00\x84\xcf\x9f\x82\x53\x88\xfb\x6e\x9a\x42\x8c\xe7\xc6\x41\x4c\xa7\xe1\x9e\xdb\xc3\xcd\x1f\xc6\xff\x87\x5c\x46\xcc\xc8\x78\xa8\xfc\x71\x2e\x97\x1c\x1e\xd0\xab\xd4\x9d\x3c\x52\x5c\x8b\x40\x35\x59\x19\x9b\x19\x8c\x12\x56\xd0\x08\x37\xfc\x38\x8d\x9d\x63\xb9\x23\x73\x43\x54\xf8\x08\xb5\x6e\x05\xa0\x7f\x57\xcc\xe4\x0b\x7c\xb9\x1a\x9a\x36\x53\xe2\x45\xef\x3a\x12\xb6\x2a\xef\x08\xfe\x59\x0a\x31\x6a\xff\xe3\x72\xf7\x98\x7c\x1b\xc3\x55\xf6\x1e\xd7\x1e\x62\x22\x43\xdc\x49\x85\xdd\x16\x85\x37\x8b\x10\x6c\x48\x30\x10\x87\x16\x46\x08\x9e\x0b\x56\x17\x25\x57\x68\xd3\x2e\xde\x38\x43\x47\x83\xb6\x07\xcb\x6b\xae\x38\x30\xf8\xe9\xe5\xb9\x4f\x24\xe4\x41\x14\x82\xa8\x02\xd7\xf1\x10\xad\x77\x34\x82\xb6\xb7\x82\xe7\x20\x0d\x98\xa4\x46\xda\x60\x65\x29\x97\xdc\xd5\x89\xae\xa5\x27\x6a\xf3\xd5\x73\xdc\x57\x8b\xaa\x29\x51\x29\xac\x76\x08\xe0\x52\xca\x92\xb3\x3a\x8b\xcc\xed\x92\x77\xb1\x6a\xa3\x9a\xdc\xa0\x73\x5c\x59\x04\x6e\x63\xcd\x0d\xfe\x5f\xbb\x60\xe6\x30\xb7\x41\x25\x20\x24\x17\x4b\x18\x3c\x6d\x91\x62\xd4\x35\x09\xd5\xb6\x04\x47\xbe\x27\x66\xb6\xda\xc5\xdf\x07\x16\x36\x9b\x22\x23\xc7\x88\x3c\x79\xcc\xb2\xab\x14\x9e\x0d\xa3\xc1\xc0\xd6\x2d\xd1\xe0\x2e\xba\x17\x6e\xec\xe5\x33\xe7\x26\xd4\x39\x46\x35\xe1\xd0\x6f\x29\xde\xdf\x87\x67\x9b\x09\x9c\x73\x0c\x09\x48\x1c\xd2\x63\x31\x38\xb1\x64\xaf\x25\x2b\xda\xcd\x86\x16\x8b\x0f\x26\x18\x5a\x92\xbc\x2a\xe0\x69\xaf\xe5\x94\x02\x53\x73\x0d\x6f\xdf\xd9\x2e\x20\x71\x8c\xf5\xc9\xe1\x02\x26\xfb\x78\x70\xe5\x49\xbe\x60\x75\x28\xda\xdd\x21\x79\x48\x72\xe9\xf5\xc2\x7e\xb7\x0f\x71\x4c\x42\xaa\x9a\x1b\x5c\x8c\x6f\xb3\x13\x7e\x3d\x45\xdf\xfe\xa5\xb9\x49\x50\x46\xac\x28\xce\x24\x56\x8a\x49\xd5\xdc\xa4\x60\xb7\x1a\x46\xd1\x80\x1a\x6b\xd9\x2b\x32\xc2\xa3\xa6\xce\x93\x78\x14\xa7\x80\xa4\x27\xd7\x16\xd5\x99\xab\x73\x7f\x55\xc2\x70\x95\x82\x82\xa7\xee\xb9\x25\x89\xf6\x1e\x78\x43\x3f\xe3\xbf\xa5\x58\x77\x74\x29\x71\x90\xbf\x0a\xb3\x38\xb4\xbd\xd6\x44\x65\xfe\xb7\x61\x0a\xf1\x4f\x2f\xcf\xe3\x14\xfa\xfe\x53\x8b\x12\x09\x47\x7e\x11\xdd\xef\xf6\xf1\x89\xdd\xcb\xd2\xfc\x12\x8b\x9b\xe4\x3a\x85\x59\x65\xb2\xe9\x52\x89\xda\xcc\x92\x38\xa4\x68\x9f\x85\x6d\x37\x68\x02\x8f\xae\x62\x22\x6c\x68\x37\xca\xec\xe1\xe5\xb8\x36\x5c\xd5\xac\x24\x61\x29\x42\x49\xbb\x06\xa3\x1a\xa0\x59\x91\x6c\x33\x82\xa1\x3a\xe1\x3a\x85\x0e\xbf\xb8\xe0\x6e\x18\x0d\xee\x80\x97\xda\xd9\x6b\x10\x37\xed\xe5\xce\xba\x5e\x23\xad\xfc\x07\x77\x51\x34\x98\xbb\xba\xe0\xe2\xc5\xa9\x25\x23\x71\x11\xce\x6a\x3b\xf4\x5a\x7f\xb7\x0f\x7b\xcf\x08\xbd\x5f\x81\x31\xca\x2d\xf1\x50\x0e\xa7\x0b\xec\x93\x7d\x78\x6c\xb9\xa5\xbf\x3f\x1c\x14\x85\x9a\xf4\x05\x36\x79\x54\x38\xd9\xd3\xf2\x3b\xda\xb3\xe4\x75\xe2\x33\xd2\x10\xfe\x08\x63\xda\xd6\xee\xe9\xf6\xa3\x1f\x9e\x13\x67\x31\x43\x57\xe9\x7f\x70\x3e\xe6\x13\xb1\x0d\xa3\x07\x75\x41\x8b\xcf\x5f\x4f\x93\x36\xdd\x75\x92\xca\x10\x56\xc4\xb8\x6d\xc3\x8d\xa8\x89\x7b\xef\x7a\x3d\x9b\x77\x46\xbb\xaa\x02\xd8\xe8\x65\xb8\x39\x6a\x7c\xd5\x2d\x94\x94\xc6\x3e\x43\x2b\x59\x83\x08\xf5\x52\x0a\xf6\xd7\xe3\xd3\x2d\xd0\x85\x60\x65\x9c\x52\xeb\x6d\x0b\x14\xb5\x84\x52\xc0\x1f\xdb\xa0\x6e\x84\xf9\x98\xdb\xf2\xdf\xd6\x1c\x97\x84\xe0\xd0\xa2\x51\x2b\x72\x5e\x6b\x9b\xa4\x8b\xb5\x8d\x7c\xab\x20\x05\xf7\xdb\x16\xa2\x42\x49\x9a\x86\xea\x73\x0b\x74\x38\x6c\xa7\xe1\x88\xbd\x05\xda\x1e\x80\x53\xa0\x9f\x5b\xe0\xdc\x11\x2f\x75\xa7\xb9\x16\x72\x34\x02\x7b\x70\x73\xf9\x57\xdf\xc3\xc0\x49\xcb\xc0\xc9\x76\x06\xc2\x21\x34\x0d\xf6\x14\xa0\xbd\x49\xae\x1b\x74\xd7\x2e\xd5\x56\xab\x4c\x61\x56\xf7\xdc\x8c\xcc\xb4\x94\xf3\xec\xd4\xb9\x32\x5d\x2a\xf0\xa2\x7b\x28\xc3\x54\x4f\x35\x77\xdf\xcb\x29\xe8\x38\x5c\x1f\x28\x85\x62\xa8\xf8\x7e\xcf\x6e\x1f\x0d\x06\xb9\xb9\x49\x21\x67\x75\xce\xcb\xa3\x1a\xdf\xb9\x4b\xb2\x0c\x83\xf8\xb9\xed\xc4\x25\xfe\xd9\x8f\x2c\x7f\x3f\x57\xb2\xa9\x0b\x8c\xe6\x8a\x67\xae\x55\x87\x81\xb1\xe0\x33\x2c\x30\x1d\x26\xca\x45\x2e\x3b\x38\x07\x9e\x3a\x2e\x93\xdc\xdc\xe0\xdb\x2e\x43\x3f\xad\x36\x20\xed\x9d\x2b\x47\x26\xb1\x12\xea\x44\xf5\x68\x30\x90\x3a\x7b\x79\x23\x4c\xa2\x78\x86\xa7\x7c\x8c\x05\x09\xa6\x38\x97\x41\x26\xfb\x30\xab\x93\xe1\x77\xab\xe9\xc4\xbd\xde\x77\xf9\xea\xa5\x52\x56\x19\xd4\x49\x28\x6c\xc6\x19\x8d\x6c\x93\xae\xa9\x8d\x28\x6d\x55\x23\x95\x6c\x8c\xa8\x39\xe4\xac\x2c\x35\xf8\xcd\x29\x7b\x68\x5e\x72\x2c\x92\x30\x75\xdc\x39\x9e\x8e\x98\x61\x65\x62\x49\x6d\x63\x54\x27\xa2\xec\x92\x6f\x7b\x42\x7a\x79\x0e\x23\xac\x4e\x31\xac\x1f\xb9\xb0\x7e\x9d\x42\x7c\xf2\xe6\x57\x27\x20\xd4\x47\x76\x22\xaf\x93\x61\x6b\x8a\x9d\x88\xb2\xcb\xce\x95\x9e\xa3\x24\x55\x76\x24\x55\xf5\x67\x2c\xd0\x12\x6a\x4e\x0f\xa3\x01\x0a\xdd\x96\xc3\x6b\x10\xd4\xef\x1a\x6e\xa0\x3b\xf4\xb3\x1f\x69\xdb\xe4\x7a\xa4\xe3\x14\x2a\x3d\x4f\xa1\x45\x67\xf3\x60\x07\x7d\x5b\xf3\xe0\xc3\x50\x6f\xb8\xcb\xd5\xec\xc0\x48\x91\xf4\x96\xaf\x54\x11\x8f\x1f\x6f\xc6\xb6\x26\x42\xa6\xe6\x4d\xc5\x6b\x03\x4f\x10\xfe\x09\x54\x8d\x36\x70\xc9\xbb\x3d\x6a\xa9\x80\x57\x4b\x73\x9b\xc2\x5c\x1a\x78\xf4\xdb\xff\xc3\x00\xd0\xdf\xbc\x2d\x26\xd0\x18\xae\x33\x92\xef\x2b\xce\x0a\xae\x12\x6f\xa9\xeb\xea\xf3\x92\x68\x55\xb6\x92\x54\x3e\xcb\x60\x42\xae\x5a\x37\x1c\x95\x9d\xf1\x4a\x1a\x8e\xc5\x02\x6d\x4e\x67\x80\x95\x68\xd4\x39\x08\x50\x4b\x8d\xae\x75\x4c\x34\x70\xae\x6f\x4d\xee\x85\xeb\x4c\xb7\x46\xd7\xcd\x37\x0f\xa2\xbe\x17\x12\xbf\xdf\xdb\x98\xaa\xd1\x35\xef\x31\x3c\xea\xbb\x0f\x03\x59\xf7\x40\xf9\xab\x85\x4f\x35\xe2\x1b\x61\x7e\x70\xd6\xfb\xd8\xe1\xc2\x5f\x71\x73\x6b\xd0\x2d\x56\xeb\x8c\x81\x94\x14\x5a\xe2\x5b\x32\x83\x45\x93\x14\x4f\x99\xd2\xdc\x8b\x32\xe9\x2d\x1f\x46\xeb\x96\xdd\x67\xb5\x35\xee\xfb\x6d\xdb\xad\xe8\x98\x37\xd0\x15\xe4\xea\x05\xc3\x66\x5b\x5f\x25\xa8\x7b\x1e\x43\xe6\xb6\x31\xd3\x63\x7e\x8d\x93\x8e\x5e\x1f\xc2\x06\x82\x7f\x22\x0f\x3d\x3a\xba\x0c\x3c\x30\xbe\x3c\x2c\xbc\x7c\x42\x74\x71\x37\x60\x0f\x89\x32\x1d\xaa\xbb\x16\xfa\xab\xed\xca\xce\x45\xdd\xb9\x01\xaa\xe1\x91\x4e\x81\xf9\x56\xe2\x23\x7d\xef\xc5\x19\x75\x47\xeb\xce\x6d\x17\x75\x20\xa8\x9a\xb0\xca\x0d\x26\xeb\x22\x19\x69\x79\x5a\x72\xbe\x24\xed\x5a\xe1\xf8\xa8\xb0\xbf\xef\x8e\x12\x3e\x5d\xb6\xe1\xcf\xb9\xf9\xba\x8b\x7f\x40\x98\x09\x58\x4d\x38\x44\x13\xff\x4b\x9b\x49\x57\x4a\xcc\xcf\x0a\x8e\xa1\x72\xed\x05\x47\xd4\xd9\x9c\x9b\x57\xae\x14\x74\xc9\x74\x34\x72\xa5\xb0\xdb\xb8\xbd\x17\x22\x49\x31\x78\x3e\x1e\x6f\xb8\xdd\xf2\x57\x69\x19\x1c\x1b\xd7\x1b\xc6\x17\x9a\x9a\x38\x1a\x98\x43\x0a\xf9\x82\xe7\xef\xfd\xd4\x40\xb7\xb0\xbb\xbc\x85\x2b\xa1\x4c\xc3\xf1\xa5\xbd\x2e\x67\xbd\x8e\x92\x6b\xb5\xf4\xeb\xf4\xcf\x13\x8b\x2b\xfe\xdd\xb9\xb4\x1d\xeb\xc9\x6c\x7b\xe4\xc3\x5a\x76\x7b\x3e\x1e\xaf\x46\x84\xde\xfb\xce\x49\xbc\x7b\x8b\x68\xef\x78\x3a\x65\x73\xbf\x9e\xfe\x2c\x26\x42\x99\x3e\x8c\x82\x15\x8e\xdb\xad\x3a\xc7\xb1\x5d\xb6\xb1\x17\xb3\x21\x52\x34\xaa\xb4\x91\x2e\x51\xd9\xc5\xd9\x6b\x0f\x7a\x71\x76\x8c\x56\xb3\xa1\xa7\xb1\xa5\xa3\xb1\xb9\x71\xf1\x23\x2b\xda\x9e\x50\x47\xc0\xd1\x80\xe6\x40\x26\xfb\xee\xae\x38\xfb\xbf\x0d\x57\xb7\xc9\x30\xfb\x89\x9b\xc4\x8e\x8b\x0c\xa3\x01\x1d\x09\xee\x81\x59\xba\x66\xa7\x6f\xa0\xdc\x03\xe6\xa7\x44\x86\x80\x1e\xe0\x7c\x22\x1a\x84\xa1\x8c\xfb\xb0\xfb\x19\x0e\x0c\x15\xea\xf6\x94\x29\x56\xdd\x07\x6b\x27\x2c\x36\x65\x5c\xd4\xd2\x0f\xb8\x29\xa6\x59\x8f\x92\x7e\x97\x8a\x9e\x39\xea\x28\x21\x23\x16\x9b\x86\x71\x45\xda\x8e\x22\xd9\x8b\x05\xdf\x29\x4a\xc1\xd3\x43\xa4\x09\xae\x91\xae\x67\xa1\x1f\x12\xde\x86\x7e\x08\x01\x59\x9d\xaf\x24\x87\x0e\xa6\xbb\x1d\xd5\x6d\x77\x0e\x83\x15\xbd\x89\xa0\xdd\x4c\xc1\x13\xae\xbc\x9d\x86\xe8\xbb\x65\x7b\xaf\xf5\x96\x80\xde\x3c\xcf\xae\x34\x58\x73\x3c\x75\xe6\x56\x73\x93\xfd\x49\x8a\xfa\x95\x7b\x96\x38\x85\xd8\x23\xe9\x15\x53\x74\x9d\x44\x60\x58\x7c\xda\x47\x34\x9b\xa4\xec\x69\x55\xbb\xa2\xc9\x43\x0c\x21\x3c\xe2\xae\x77\xa7\xaf\x85\xc9\x17\xe0\xa6\x2b\xb3\x73\xf9\x5a\x5e\x73\x95\x78\xa5\x93\xb7\xe6\x4c\x73\xdb\x8f\xa7\xf9\x9e\x49\x34\x68\xed\x76\xdf\x3d\xc4\xb3\xab\xdd\x79\xdf\x06\x85\xf3\xf3\x53\xdb\xd9\x53\x5e\xe5\x48\xc5\x19\xd7\xb2\xbc\xe2\xe7\x87\xa7\x48\x4f\x12\x9b\x7c\xe9\x0c\xcd\x1d\xb4\xed\x5e\x4d\xb1\xbe\x0d\x3e\x5b\xdd\xe5\xe2\xc5\x96\x4d\x2e\x5e\xb8\x4d\xec\x34\xd2\xda\x26\x34\x9d\xb4\xba\x8b\x9b\x15\xed\x6f\x33\x3d\x5c\x63\x06\xe1\xfc\x46\xf8\xda\xee\x44\xab\x7b\x5b\xb9\xcb\xdb\xc9\x76\x33\x6a\x6a\xdd\x2c\xe9\x26\xb6\x08\xfe\x96\x01\x39\x61\xd0\xc4\x83\x8d\xf8\xe1\xce\xe3\x67\x10\x47\x52\xd9\xb6\x07\x99\x31\x8d\xf4\x7c\xa2\x13\x45\x03\x7b\x89\x1e\xda\xf2\xbe\x65\x4f\x97\x0a\x83\x30\x5c\x78\xcf\x7b\x34\xe0\x50\x10\xd8\x17\xd1\x00\x6b\x2d\x81\x0b\xc6\xdf\x81\x80\xef\x81\x5c\xfe\x3b\x10\xbf\xff\xbd\x6b\xc6\x58\x78\xaf\x19\xab\xb9\x24\x84\x29\x46\xe7\xb2\x8d\x9d\x71\x47\xeb\x3e\xb0\xe5\x92\xd7\x45\x62\xff\xbe\x2f\xa1\x50\xe3\xba\xed\xb6\x76\x98\x09\x08\xc2\xa3\x34\xb0\x31\xb4\xe7\xd8\xbb\x68\x60\x87\x18\x2c\xe7\xcb\xb7\x96\xbb\x77\x9e\xff\x0f\xdd\x00\xe4\x56\x86\xc8\x69\x57\xbe\xed\x4c\x79\xbe\x83\xfd\x76\x52\xb3\x1b\xbd\x2c\x0b\xeb\x4b\xdd\xc4\x27\xae\xb3\xbf\xd2\xa2\xcb\x5b\xd3\x49\xc3\x7f\xd7\xb2\xce\x7e\x61\x4a\x2f\x58\x99\xb8\x29\x95\xa8\xd3\xf0\xf1\x72\xeb\xd7\x78\x96\xfe\x84\x50\x0d\xfb\x0d\xe9\xad\x81\xd3\x69\x39\x97\x4d\x69\x27\x97\x68\x42\x52\x09\x56\x8a\x7f\xdc\x1f\x39\x3b\xb3\x2d\xbe\xec\xe9\xf4\x87\x7c\xe4\x49\x54\x7b\xec\x26\xe3\xea\x05\xca\xb5\x30\x88\xc4\x1a\xc5\x6a\xed\x13\xbd\x9b\x07\xcf\xa6\xdc\x9c\xfb\xe7\xee\x56\x42\xdb\x9b\xcb\x2c\x3c\xff\x70\x37\xb4\xf3\xd6\x87\xd4\x23\xa0\xee\x1f\xcd\x02\x23\x21\xf6\x59\x12\x90\x3b\x1f\xe8\xdd\xf9\x58\x18\xca\xe1\x7d\xef\xb4\x9f\x39\x3c\xd2\x23\x0a\x04\xc8\x82\xbb\x3f\xb5\x7d\x43\xeb\x7e\x36\xc6\x70\x05\x61\x8f\x8c\x5a\x71\xc7\x45\xc9\x0f\xdb\x13\x4a\xb2\x51\x93\x76\x25\x52\x94\xfd\x28\x8b\x5b\xbb\x92\x9a\x72\x97\xb2\xb8\x0d\x54\xda\x31\xfe\x0c\x8b\xd7\x83\xb2\x4c\x02\xfc\xb0\xd7\x0f\x0c\x6e\xe5\x6f\x33\x9c\x61\x20\x20\x5d\x50\x05\x4f\x70\x00\xb1\x55\x70\xdb\xb0\xb9\x57\x6c\xae\x84\x0c\x32\x1f\xba\x07\x4e\xe4\x98\xa3\x82\xf0\x1f\x77\xde\x20\x39\x61\xd1\xa4\x15\x51\x8a\xcf\xfd\xd9\x08\xe0\x0f\xf0\xd4\x1e\xb7\xa7\x54\x54\xa7\x5d\x22\x2d\xe2\x9e\x85\x5d\xbc\xf8\x14\x03\x43\x65\x04\x89\x22\xe4\x0b\x87\xca\xe5\xa7\x5a\x94\x4e\xc9\xc9\x53\x7c\xed\xd2\xd7\xe6\x02\xb8\x23\x41\xb4\x19\xf2\xb1\x19\x61\x22\x0a\xdd\x35\x5e\x86\xcb\x26\x9d\xa6\x2f\x06\x68\xab\x73\xa4\xa6\x55\xf7\x65\x33\x43\xaa\xde\xbe\x43\x2f\x0e\x15\x50\x34\xf8\xab\x0f\xaa\x04\x4e\x15\x7d\x72\xd9\xcc\x76\x25\xa9\x3d\x29\xd3\x70\x18\xbf\x9f\xbc\x41\x53\x2c\xfd\x01\xa2\x93\x23\x90\xac\x14\x9e\x8f\xbf\xfe\x76\x68\x05\x89\x9e\x89\xe6\xf8\x82\xb3\xa2\x14\x35\x4f\xda\x9e\x2d\x6a\x20\x59\xd1\xe8\x90\x5a\x55\x4d\xdd\x76\x57\x08\x09\x62\x48\x3a\x3b\xae\xf1\xf5\xcf\x7f\x02\x2d\x6b\x6b\xc1\x7b\xb8\xc4\xc3\x29\x9e\x29\x67\x4a\x56\xb0\xc2\x72\x97\xd9\x27\x8f\xae\x9e\x74\xd9\xed\xbb\x4a\x87\x94\xb7\xe3\x09\xed\xfc\xce\xb9\x4e\xd7\xfe\xb0\xde\xf8\x5c\x03\xa4\xfa\xe5\x85\x47\xe6\x0b\x97\xae\x0d\x12\x84\x2f\x6d\x76\xb2\x42\x5c\xf9\xdf\xcd\x0c\x89\xa6\x1d\xec\x10\xe1\xef\x35\xc4\x67\xe3\xe7\x5f\x7f\x79\x43\xec\x6e\xf9\x85\x2c\x71\x95\xeb\x87\x9b\x62\x97\x98\xfb\x6c\xb1\x7b\x9b\xb8\xcb\xe9\x3f\xaf\x8a\xb5\x6e\x71\x6f\x0c\xd7\xdd\x60\x54\x05\x72\xeb\xaf\x2e\xf0\xaf\x95\x0e\x73\x45\xa0\x77\x1b\xdb\x16\x7e\x76\xd7\x36\x94\x2b\xac\x13\xf2\xaa\x78\xd3\xe9\x16\xd3\x60\x92\xdb\x32\x09\xdf\x63\xa5\x10\xef\xe5\x6e\x09\xbe\xbd\x14\x35\xc7\x65\xcb\x86\x6e\xab\x36\x16\x71\x6b\x25\x9c\xdd\x69\xbd\x0a\x73\x73\xac\xef\xec\x01\x18\xe5\xec\x20\xef\xa9\xdd\x7b\xd5\x1b\x2d\xdb\x5c\x9a\xae\x09\xc1\x12\x3c\xb1\x47\x88\x50\xca\xfd\x4f\x2b\xf7\x7a\xb7\xd4\x9f\xd5\xe6\x72\x17\xdf\xb6\x3c\x6b\xca\xfb\x15\x3c\xa3\x29\x8c\xbf\x06\x21\x5a\x83\x3c\x12\x25\x4f\x62\x3f\x8c\xb7\x29\x28\x21\xd2\xae\x1e\xe3\x8b\x9a\x3e\x51\x30\xd2\x71\x41\xe3\xbb\x19\x1e\x3d\xb7\x68\xc9\xe2\xb9\xa7\xec\xda\xae\xa7\xde\xd1\x65\x5b\xff\x4c\x67\x70\x50\x6a\x09\x4d\x20\x30\xa8\xc9\x59\x92\x53\xd6\x0a\x53\x0f\x1f\x17\xba\x5b\xb9\xb7\xde\x28\x0a\x67\xbb\xee\xb2\xba\x73\xc2\xb5\x89\x83\xa4\xe5\x13\x47\x34\x98\xad\xd6\xaa\xe7\xbc\x5a\x5a\xad\x84\xd9\xf3\x14\xe2\x56\xcd\x3b\xea\x48\x2e\x79\x6d\xa7\xdd\xf1\x34\x4a\xc9\xe3\x7f\xb9\xaa\x36\x48\xe4\x63\x2a\x6b\x13\xbd\x98\x41\xc8\xe9\x42\x66\x87\x72\x79\x9b\xcc\x52\x42\xb7\x3e\x71\xb0\x55\x31\x2e\x8f\xff\xc7\x77\x3a\x92\xb8\x4f\x0f\xd1\xe0\x82\xec\x9f\x86\x8d\x27\xfb\x30\xcb\xec\xc5\x4c\x77\xe6\x43\xea\xec\x70\x51\xc9\x22\x69\x41\x53\x18\x7f\x33\x1e\xef\xa8\x97\x1c\x91\xfc\x47\x2f\x3d\x49\xdc\xeb\x1f\xbd\x0b\x48\x25\x8d\xff\x9a\x06\x97\xd3\x92\x56\x19\x21\x43\xf5\x8a\x89\xf6\xfd\x96\x2b\x23\xfb\x85\x72\xb1\xbd\x0e\x08\xda\xd8\xed\xd2\xe5\x5f\x2f\xe0\x8e\xb8\xb6\x1a\x45\xf7\x82\xf3\xe4\x0b\x5e\x70\x9e\x3c\xf0\x82\xd3\xce\x29\xf5\x47\xf2\x76\xdb\xdc\x7e\xd7\xb6\x56\x21\x87\x2f\xe5\x76\x1f\xbb\x78\xa4\xa1\xfd\x70\x6e\x6d\x7c\x48\x65\xbf\x70\xb3\x90\x45\x0a\x7e\x8b\x95\xbb\x72\x9a\x58\xf1\x03\xca\x56\x49\x47\xb2\xa9\x8b\xfb\xe7\x8c\xae\x98\x22\xeb\x21\x2d\xf7\xe6\x8e\xfe\x4d\xc6\x8e\xee\x6c\x4b\x2f\x3b\x73\x52\xa3\x41\x9f\x55\x01\xf9\x0b\x6d\x3c\xef\xfb\xef\xc8\x6c\x1b\x5f\x87\xaf\xdb\xd0\x32\xec\x3c\x2a\x7d\x85\xe5\x67\x92\xc2\x77\x38\x59\x67\xd2\x71\x6d\xa2\x19\xc9\x27\xa3\xb0\xd8\x0f\xec\xc7\x43\xbd\x26\xd2\xe6\xbb\x8e\x0d\x23\xcb\x7e\x48\x7a\x18\x0d\x98\xd6\x5c\x99\x13\x69\x7d\x99\x2b\xb5\xb2\xc0\xfd\x8b\x00\x46\xa2\xb7\x22\x76\xba\x89\x77\x9f\x2e\x51\xba\x6f\x67\x24\xc3\x20\xf5\xd0\x53\xb9\xd6\xe7\xb2\x33\xc7\x9d\x4e\x57\x8f\x9b\x9d\xe8\xb1\x1d\x42\x28\x09\x23\x96\x14\x52\xf5\x68\xa3\x10\xd3\x47\x1f\xfa\xa3\x2d\x75\x6b\x0d\x87\x0d\x5d\xa6\xcd\xa3\xa2\xfd\x0f\xd1\x5a\x29\xb4\x13\xe8\xa3\x11\x10\x30\xf4\xbf\xbf\xb2\xa7\x72\x24\x71\xa9\xe4\x25\xd7\x59\xef\xdf\xf9\xc8\x34\x37\x89\x51\x0d\x0f\xc4\x76\x86\x4d\x7b\x59\xa5\xdd\xdf\x7e\xd5\x8b\x9e\xbe\x86\x69\xc6\x4a\xed\xe7\x39\xe9\xf6\x04\xd1\xd4\x7e\xca\x7a\xd5\x8a\x3a\x72\x41\x14\x47\x4a\x56\xa8\x2b\xdb\x5f\x79\xa8\x6e\x18\x7d\x12\x8a\xcc\x22\x89\x9d\xc9\x98\x78\x68\x83\x77\xce\xc5\x15\x2f\xce\xf9\x8d\x71\xa3\x41\xbd\xeb\xc6\xf0\xb7\x12\xd5\x74\xc9\x72\x9e\xf8\xa8\xde\xcc\xde\x8e\x27\xf5\xbb\xe1\xd0\xc5\x87\x1e\xa6\xfd\xfd\xce\x97\x7c\x36\x36\x04\x69\x95\x75\x12\x4f\xb9\x55\x00\x3a\xa8\x77\xc6\x70\x6d\x42\xa2\x6b\x5b\x4b\x1d\x31\x50\x78\x3e\x97\x28\x05\xd7\x8a\xea\x87\xf9\x15\x49\x12\x9e\x87\xdb\xb0\xad\xd3\x3c\xd9\xf8\x84\x44\x66\xfb\xd7\xb6\x5b\xd1\xc3\xde\xa9\x73\xc4\x2c\x48\xee\x15\xd3\xa7\x8a\xcf\xc4\x4d\xd2\x95\x48\xea\xbe\x56\x8c\xdd\x67\x26\x4b\xfa\x67\x53\x3a\x02\x9f\x2e\x4b\x61\x4e\x56\xd7\x40\x9c\xc2\xf3\xa1\xbf\xd3\x42\xf8\x38\x76\x1f\x93\x94\xbc\x4e\x08\x0b\xdd\x87\x3f\x77\x5f\x94\x10\xd8\x3e\xd0\x8b\xb7\xcf\xde\x85\xef\x3e\xba\xb6\xfa\x32\x5f\x48\x9a\x96\xba\x5a\xe3\x91\xa2\xaf\xbd\x07\x59\x97\xe4\xc3\x34\x82\xab\x3f\x53\x11\x24\xa9\x1d\xc5\xbf\x66\x7e\x61\x30\x74\xc5\xfc\x66\xad\xf5\x79\x10\xb8\x64\xf9\xfb\xcd\xb2\xf8\x54\x29\xf4\xd6\x85\xcb\xa1\x2f\x62\xa0\x81\xea\x1d\x25\x64\x6f\x30\x5b\x29\xb5\x4d\xb0\x95\xfa\xf8\x7d\x2d\xaf\x6b\x17\x2e\xec\x77\xec\x7e\x99\xed\x5d\x3e\xd2\x13\x78\x74\xb5\x2e\x9e\xb4\xa7\x84\x70\xbd\xea\xbe\xab\xcb\xcd\x97\xc9\xc5\x1b\xbe\x15\xfa\x48\x36\xde\x3a\x11\xb0\x21\x21\x77\x33\xe7\xee\x19\x99\xbe\xb7\xfc\x78\x4a\xf6\x99\xb2\x4f\xa5\xcd\xc8\xbd\xce\xff\x97\xcd\xc9\x3d\xea\xb6\x25\x65\xbf\x6a\x7b\x4a\xb6\xfd\xf6\xcd\x29\xb9\xf3\x05\x74\xfc\x2f\xcf\xbf\xdd\xcf\xad\x77\x4d\xc0\x79\xb7\x2e\x0a\x7c\xdb\x7f\x4b\x81\x54\xf1\x49\xe9\x96\x28\x5a\xcb\xb7\x3d\x87\x71\xdf\xa3\xd4\x9d\x39\xf5\xf0\x25\x2e\x6d\xda\x92\x95\x87\xcb\x88\xdd\xd2\xbf\x93\xb0\x75\x5c\x4b\xd2\xd6\x70\xf1\x5f\x5c\x0f\x10\x85\x1f\x2b\x08\xf2\xf6\xae\x69\x63\x15\xf0\xd9\x69\xff\x01\x72\xfa\xf7\xcf\xfb\x7d\x26\x1f\x96\xf8\xd7\x25\x4f\xd9\xfe\x13\xd3\xfb\x4e\x62\xfe\x22\xf9\x7d\x03\xcf\x3b\x71\xbb\x4e\xe0\x67\x65\xef\x9d\x04\xb0\x63\xfa\x76\xe1\xe7\xb3\xf3\x37\x45\xc7\x36\x09\xb4\x57\x3c\x3d\x9f\x73\xe6\x8c\xe4\x74\xf2\x79\x68\x5c\xbe\x72\xce\x95\x6c\xce\x5f\x1d\x21\xcd\xb9\x81\xee\xd4\xba\xbb\xfb\x0c\x73\xb9\xe1\x9b\xd8\x55\x2c\xb6\xa3\x91\x42\xc1\x0d\x13\x25\x74\x3e\x47\x5f\xef\x97\x85\xcf\xd8\xd0\x29\xe8\x43\x5f\x99\xe7\x8d\x52\xf4\x79\xb5\xb6\xf7\xcd\x16\x4f\x7b\x89\x77\x17\xfd\xff\x00\x00\x00\xff\xff\x13\x75\x61\x30\xb6\x55\x00\x00") +var _testImagesAgnhostNetexecNetexecGo = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x3c\x6b\x73\xdc\xb8\x91\x9f\x87\xbf\xa2\xc3\x2a\xdb\x1c\x87\xe2\x8c\xbd\x9b\xda\xbd\xd9\x55\xb6\x64\xd9\x5e\x2b\xeb\x95\x75\x1a\x29\x5b\x29\x9f\x6b\x03\x91\x98\x19\xc4\x24\x31\x0b\x80\x7a\xc4\xd1\x7f\xbf\xea\xc6\x83\xe4\xbc\x2c\xd9\x4e\xdd\xe5\x2e\xa9\xca\x5a\x22\x1a\x8d\x46\xbf\xd1\x68\x68\xf4\x38\x3a\x94\xcb\x1b\x25\xe6\x0b\x03\x4f\xc7\x4f\xbe\x86\xb3\x05\x87\x9f\x9a\x0b\xae\x6a\x6e\xb8\x86\x83\xc6\x2c\xa4\xd2\x59\x14\xbd\x16\x39\xaf\x35\x2f\xa0\xa9\x0b\xae\xc0\x2c\x38\x1c\x2c\x59\xbe\xe0\xe0\x46\x52\xf8\x33\x57\x5a\xc8\x1a\x9e\x66\x63\x48\x10\x20\x76\x43\xf1\xf0\xbb\xe8\x46\x36\x50\xb1\x1b\xa8\xa5\x81\x46\x73\x30\x0b\xa1\x61\x26\x4a\x0e\xfc\x3a\xe7\x4b\x03\xa2\x86\x5c\x56\xcb\x52\xb0\x3a\xe7\x70\x25\xcc\x82\x16\x71\x28\xb2\xe8\x2f\x0e\x81\xbc\x30\x4c\xd4\xc0\x20\x97\xcb\x1b\x90\xb3\x2e\x14\x30\x13\x45\x00\x00\x0b\x63\x96\x93\xd1\xe8\xea\xea\x2a\x63\x44\x65\x26\xd5\x7c\x54\x5a\x28\x3d\x7a\x7d\x74\xf8\xe2\x78\xfa\x62\xef\x69\x36\x8e\xa2\xf3\xba\xe4\x5a\x83\xe2\xbf\x35\x42\xf1\x02\x2e\x6e\x80\x2d\x97\xa5\xc8\xd9\x45\xc9\xa1\x64\x57\x20\x15\xb0\xb9\xe2\xbc\x00\x23\x91\xce\x2b\x25\x8c\xa8\xe7\x29\x68\x39\x33\x57\x4c\xf1\xa8\x10\xda\x28\x71\xd1\x98\x1e\x83\x3c\x55\x42\x43\x17\x40\xd6\xc0\x6a\x88\x0f\xa6\x70\x34\x8d\xe1\xd9\xc1\xf4\x68\x9a\x46\xbf\x1c\x9d\xbd\x7a\x73\x7e\x06\xbf\x1c\x9c\x9e\x1e\x1c\x9f\x1d\xbd\x98\xc2\x9b\x53\x38\x7c\x73\xfc\xfc\xe8\xec\xe8\xcd\xf1\x14\xde\xbc\x84\x83\xe3\xbf\xc0\x4f\x47\xc7\xcf\x53\xe0\xc2\x2c\xb8\x02\x7e\xbd\x54\x48\xbb\x54\x20\x90\x75\xbc\xc8\xa2\x29\xe7\xbd\xc5\x67\xd2\x12\xa3\x97\x3c\x17\x33\x91\x43\xc9\xea\x79\xc3\xe6\x1c\xe6\xf2\x92\xab\x5a\xd4\x73\x58\x72\x55\x09\x8d\xc2\xd3\xc0\xea\x22\x2a\x45\x25\x0c\x33\xf4\xfb\xda\x76\xb2\xe8\xf1\x28\x8a\x96\x2c\x7f\x8f\x48\x50\x4f\xae\x79\x1e\x45\xa2\x5a\x4a\x65\x20\x89\x06\x71\x2e\x6b\xc3\xaf\x4d\x1c\x0d\x62\x5e\xe7\xb2\x10\xf5\x7c\xf4\x37\x2d\x6b\xfc\x30\xab\xe8\xbb\x90\xf6\xbf\x23\x21\x1b\x23\x4a\xfc\xa5\x94\x73\xfc\xa7\xe6\xc6\xfd\x33\x42\x29\xfa\x9f\x1b\x45\x40\x52\xdb\xff\x8e\x70\x51\xfc\x51\x1b\x95\xcb\xfa\xd2\xfd\x28\xea\x39\x01\xe8\x9b\x3a\x1f\x31\x23\x2b\x41\x40\x46\x54\x3c\x8e\xa2\x41\x3c\x17\x66\xd1\x5c\x64\xb9\xac\x46\x42\x2f\x44\xc1\xae\x98\x61\xaa\x19\xe9\xdc\xae\xd4\x19\xd7\xcb\xd9\x93\xaf\x46\xb9\xbc\x50\x0c\xa7\x22\x95\x35\x37\x10\xbf\xff\x56\x67\x42\x8e\xd8\x52\x54\x2c\x5f\x88\x9a\xab\x9b\xd1\xf2\xfd\x7c\x84\x00\x23\x47\xfc\x4e\x18\xcd\x8d\x8e\xa3\x61\x14\x5d\x32\x85\xec\xc2\x5d\x9e\x20\xeb\xda\xff\xed\xc3\xb7\xe3\x6f\xc7\xd1\xa0\x29\x56\x47\xec\xd0\x93\x68\x80\x14\xaf\xcd\xda\xc3\x81\x05\x2f\xcb\x13\x66\x16\xdd\x81\x78\x74\x21\xea\x91\x5e\xc4\xd1\x40\x73\x75\xc9\xd5\x29\x67\xc5\x4d\x3b\xfe\xd0\xf2\xea\x99\x94\xe5\x87\xf1\x6d\x34\xc8\xb9\x32\x2f\xd1\x38\x7b\x48\xe2\x68\xb0\x54\xe2\xf2\x27\x7e\xd3\x1d\xb3\x03\xb8\x8b\x37\x97\x5c\x29\x51\xf0\xde\x40\x53\x2c\x5f\x0b\x6d\x78\x7d\x50\x14\xa8\xac\x5c\xdb\x81\x61\x14\xe5\xb2\xd6\x06\x2e\x44\x5d\x9c\xc9\x83\xfa\xc6\x7e\x8f\x46\x23\x38\xac\x8a\x63\xab\x57\x68\x3b\x8d\x76\x56\x39\xaf\x17\x52\x1b\x38\x44\x99\x64\xc4\xbe\x0e\xe0\x3e\x3c\x24\x61\x65\x87\xb2\xaa\x58\x5d\x7c\x88\x06\xe7\x9a\x4f\x00\x20\x76\x3a\x1a\xa7\xd1\x60\xba\x90\xca\x4c\x20\x3e\x54\x9c\xa1\x83\x7b\x75\x76\x76\x92\x4c\x87\x29\x9c\x3f\x3f\x49\x51\xf7\x21\x91\x4b\x54\x7c\x56\x96\x37\x43\x98\x1e\x9e\x9d\x80\xe5\x98\xb6\x3e\xe9\x92\x29\x21\x1b\x0d\xbc\x2e\x96\x52\xd4\x46\x23\xd6\xd7\xb2\x9e\x4f\xe0\xaf\x53\xc3\x94\xd1\xc0\x3c\x56\x37\x13\x0d\x7e\x2e\x2e\x79\x0d\x64\x21\xc1\xb5\xcd\x64\x59\xca\x2b\xb4\xbf\x80\x6c\x12\x45\x7b\x30\x9a\xc0\x29\x37\x8d\xaa\x35\x81\xa1\x63\xe2\xda\x3c\xd2\x80\x6a\xac\x0d\xab\x96\x19\x42\xe5\xa5\xe0\xb5\x11\xcb\x6d\xd0\x47\x27\xc0\x2c\xcb\x09\xbc\x10\xac\x9c\x80\xdf\x37\x73\x14\xd5\x4d\x75\x81\x14\xce\xfc\x44\x8d\x3e\x0e\x11\xd9\x71\x62\x38\xb2\x85\x48\x6f\x34\x52\xdb\x8e\x2e\x95\x34\x32\x97\x65\x1a\x01\x01\x29\x47\x08\x83\x3f\x4d\xdf\x1c\x77\x76\x2a\x78\x59\x68\x88\x15\xd7\x4b\x89\x1e\x38\x86\x44\x37\x79\xce\xb5\x9e\x35\xa5\x5f\x1a\xc2\xf0\x90\xb0\xc5\x5c\x29\xa9\x10\x36\x02\x98\x31\x51\xf2\x62\x03\x68\x16\xb6\x1f\x3f\x1d\x8f\xe1\xcd\x4f\x31\x68\xc3\x4c\xa3\x21\x97\x05\x07\x61\x03\x44\xc9\x68\x92\x9d\x4c\x4b\xf3\x82\x17\x48\x77\xfc\xf5\x93\x6f\xe0\xc5\xf5\x92\xe7\xd6\xe3\xc1\x4b\x5a\x29\xc6\x99\xc2\x40\x21\x0a\x8c\x59\x29\xfa\xd8\xf8\xeb\xf1\x18\x9e\xb1\x02\x4e\x2d\x22\x82\x61\x75\x88\x42\x5e\x8c\x8f\x34\x2c\x99\x62\x15\x37\x5c\xe9\x08\x50\x87\x45\x7d\xc9\x4a\x51\x64\x14\x60\x37\xc2\x01\x53\x7c\x12\x01\xec\x41\x8c\x4c\x8f\x27\x04\x4a\xfc\x37\x0b\x86\x6a\x53\x96\x70\xc1\x01\xe5\x88\x7e\x9e\x20\x51\x2a\x0e\x92\x04\xb4\x1d\xd2\xed\xdd\x01\xa3\x82\x06\x32\x70\x6b\x05\x33\x0c\x25\x7f\xc1\x41\xf3\x1a\x11\x29\xd9\xcc\x17\x68\x16\x19\x1c\xcd\x28\x6c\xbb\x08\xc2\x8b\x14\x19\x43\xab\x28\xae\x9b\xd2\x50\xc8\xa5\x98\xbc\xce\xa1\xae\x2c\x2e\x38\xaa\x8f\x55\x92\x76\x0b\x4e\x87\xfc\x36\xdc\xaf\x70\xb5\x10\xf9\x22\xec\x85\x7c\xc0\xd5\x82\xd7\x50\xb1\xf7\x5e\x09\xdd\x9e\x32\x78\xce\x67\xac\x29\x0d\x5c\xb2\xb2\xe1\x13\x88\x29\x70\x64\x44\xd6\x41\x8e\xd9\x05\x85\x72\x1a\xd5\x7e\x38\x85\xb8\x29\xe8\x1f\x72\xfe\x8e\x1a\xa3\x04\xd7\x8e\x94\xd6\x36\xc8\xf0\xba\x4b\x06\xba\x96\x5c\xcd\xa4\xaa\x78\xb1\x4e\xc4\x93\x18\xed\x2e\x1e\xf1\x7c\x21\xe3\xbe\x91\x5a\xeb\x89\x2b\x3d\x8f\x21\xb1\x10\x3f\x54\x7a\xbe\x8f\x3f\xf0\xe2\x57\xfc\x3e\x4c\x5b\xf3\xf1\x1e\xc9\x33\x33\x46\x6e\x7a\xec\xd7\x02\x85\x7a\x58\x4a\xed\x48\x74\x4e\x27\xcc\xb6\x8b\x91\x00\xd0\xaa\xe6\x8a\xe5\x1c\xad\x4e\x2f\x1a\x53\xc8\xab\x7a\x87\x4e\x46\x03\x52\xca\xc1\x9e\x5b\xd2\xf2\x05\x97\xb4\xf8\x7c\x6e\xb1\x54\x12\x6d\x79\x8d\x07\xe3\x0c\x0e\xd0\xc7\x61\x56\x01\xa2\x36\x7c\xce\x15\xbc\x1d\xef\x3d\x79\xfa\xcd\xbb\x8c\xd0\x22\x67\x65\xe3\xd5\x92\x55\xb2\x41\x7d\xb4\x1c\x47\x7d\xbc\x62\xc2\xd0\x32\xb9\xac\x6b\x9e\xdb\x94\xc4\x48\xc8\x71\xbf\x70\xc1\x67\x52\x71\xda\x09\x26\x64\x40\xdb\x89\x06\x83\x35\xa1\xa3\x71\xc1\x5c\x62\xea\x03\x45\xa3\x6c\x6a\x43\x8a\x3d\xee\x6e\xc0\x8a\x95\xf6\x27\xaa\x8a\x17\x82\x19\x5e\xde\x10\x2b\x65\x63\xa2\xc1\x20\xf0\x8c\x88\x47\xe2\x76\x53\xee\x09\xc4\xc0\x80\x04\xb6\x3c\xdf\x48\x62\x34\x80\x3b\x53\x49\x38\x03\xc2\x2e\xbd\x56\x31\x16\x9c\x95\x66\xf1\xf7\x8e\xe6\x05\xff\xe8\x7c\xa2\x53\x14\x81\xb9\x2f\x2b\x6e\x52\x74\x85\x4f\x61\x6a\x75\xec\x44\xf1\x5c\xd6\x85\xe8\xba\xc4\x08\x40\x62\xde\x79\x25\x34\xb7\x5a\xd3\xa2\xc0\x58\x2e\x0a\x8e\x09\x34\xfa\x0a\xc2\xe8\x17\x3a\x7f\xee\x83\xa8\x77\xa7\x8e\xfa\x1b\x8e\xce\x07\x3d\xa4\x21\xae\xa3\x53\x20\xda\xa5\x36\x35\xab\xf8\x8a\xd9\x58\x1c\x8f\x34\xf8\xf1\x16\xfa\xf8\xce\xd0\x8a\x17\x42\xf1\xdc\x74\xa0\x19\xf8\x8f\x21\xae\xf4\xa3\x60\x5c\xca\x9c\xa4\x11\x7f\xd4\x2a\x23\x40\x8b\xf6\xf8\x7e\xf0\x13\xf7\xc9\xc8\x1f\x7c\xf5\x12\xcd\x7c\x26\xe5\x05\x53\x0f\x11\x7e\xff\xab\xf1\x37\xf1\xd0\x52\x46\x99\x5b\x3c\x81\x17\xd7\x3c\x6f\x0c\xef\xb9\x0a\x1a\x73\x99\x4d\x4c\xb1\x28\xaf\x0a\x72\x1e\x34\xf2\x43\x5e\x15\xfb\x5a\x56\x7c\x2f\x77\x30\x14\x42\x23\x58\x0d\xc9\x98\x9a\x33\x51\x7b\x0f\xea\x03\xb3\x6c\xcc\xb2\x31\x31\x24\x6e\xfa\x23\x0d\xf6\x53\x37\x12\x77\x87\x23\x00\xfa\x06\x15\xd7\x9a\xcd\xf9\xa6\x30\xec\xa4\xef\xe6\x74\xa2\xee\xce\x98\x5b\x4b\xe3\xd9\x61\x55\x7b\xb7\x77\x6b\x9d\xd1\xd8\x4e\x6b\x96\xa5\x64\x45\x3c\x71\x16\x86\x3b\xa7\x63\xa6\x0d\x6e\x76\x14\x69\x70\x87\x38\x54\x3d\x51\x13\x2a\x3f\x57\xc7\x98\x9a\x15\x36\x71\x33\x2e\x08\x63\x7c\x38\xfd\x48\x7a\xd3\xe1\xe2\x0a\x97\x4b\xfe\x48\x03\xea\xa0\x47\x69\xb7\xe1\x85\xe4\xf9\xdb\x99\x87\x69\xc5\x52\x1a\xcc\xf0\x50\xc5\xec\xae\xd1\xc2\x2c\xdf\xf1\x48\x7e\x34\x83\x78\x6f\xcf\x94\x7a\x0f\xd3\xf5\x3d\x5c\x25\x46\x53\x64\x45\xc1\x0b\x48\x44\xc1\x31\x89\xb5\x07\xeb\xfa\x6f\x4d\x4d\xde\xd3\x52\xed\xe6\x61\x36\xcf\x0c\xdf\x7b\xcf\x6f\xec\xf4\x94\x88\xa3\xec\xc0\x2e\x19\x85\x00\xbc\x9c\x2b\x64\x1c\xf2\x11\xc7\xa7\xd6\x01\x88\x0a\x0f\x81\x0b\xa6\xa1\xb0\xae\x3f\xb5\xc6\x52\x52\x0e\xb3\x77\xc1\x30\x6e\x23\x79\x23\x5c\xeb\x3d\xbf\x21\x66\x68\x3c\xa8\xc7\xa3\x00\x98\xe5\xca\xc4\x56\xd3\x3a\x1f\xdf\xf3\x1b\xcc\x13\x39\x06\x53\xcc\x6e\xb8\x8a\x41\x37\x17\x4e\x9f\x86\x9e\x01\x18\xcd\xf7\xa4\x3b\x7a\x10\x03\x34\x37\xed\x46\x3a\x79\x38\xed\x85\x95\x57\xec\x46\xdb\x4f\xd6\x8e\xfd\xa9\x65\x89\x87\xa6\x87\xce\xae\x75\x1a\x89\x79\x2d\xd5\x4a\xae\x01\xe7\xa7\xaf\x91\xf5\xc6\x23\xd3\xd2\xf9\x32\xd6\x75\x73\x4e\xca\xa2\x2e\x44\xce\xf0\xcc\x8f\x63\x6d\x86\x66\xbd\x4c\x11\x72\xed\xf6\x24\xe0\x36\x67\x0f\x02\xf1\x5d\xfd\x20\xc2\xa2\x7f\x81\xef\x2b\x3d\xff\xe3\xc6\x64\x83\x46\x10\xce\x1f\x1b\xe2\x8f\x9f\x1b\xa2\xe8\xa0\xb0\x11\x00\x15\x29\x45\xeb\x4c\x50\x48\xb2\x46\xb5\x9a\x0d\x61\x6f\x0f\x73\xa7\x3d\xda\x98\xc0\xc4\x41\xeb\x6e\x76\xe8\x18\x53\x77\x8f\x51\x96\x35\xcc\x10\x37\xd2\xc8\x71\x82\xb8\x6c\x79\xa1\xd1\x4a\x3c\x1b\x80\xe9\x95\x08\x92\x45\x7f\x4d\xa3\xc1\x81\x9a\xeb\x09\xd8\xf3\xde\xcf\xec\x5a\x54\x4d\x75\x8c\xdf\x92\xf1\x30\x8d\x06\xa7\x4d\x3d\x01\xa8\x98\xa8\xd3\xe8\x36\x8a\x66\x4d\x9d\x83\xa8\x85\x49\x86\xf0\x21\x1a\xb4\x67\xc6\xec\x65\xc9\xe6\x3a\x19\x66\x47\xb5\xf9\x33\x53\xc9\x43\x7f\x14\x4f\x6d\x8e\x48\x1b\x8b\x53\x3a\x8c\xa7\x10\x93\x59\xd8\xb3\x2c\x20\x54\x3c\xdc\x88\x6c\x4a\x65\x08\xc2\xe7\x8f\xd1\x29\xc4\x7d\x33\x4d\x21\xc6\x73\xe3\x20\xa6\x83\x74\xcf\xec\xe1\xfa\x0f\xe3\xff\x20\x93\x11\x33\x52\x1e\x4a\x7f\x9c\xc9\x25\x87\x07\x34\x94\xba\x93\x47\x8a\x73\x11\xa8\x26\x2d\x63\x33\x83\x5e\xc2\x32\x1a\xe1\x86\x1f\xa7\xb1\x73\xa2\x77\x64\x6e\xf0\x0a\x1f\xa1\xd6\xcd\x00\xb4\xef\x8a\x99\x7c\x81\x83\xab\xae\x69\x33\x25\x9e\xf5\xae\xd4\x61\xb3\xf2\x0e\xe3\x9f\xa4\x10\xa3\xf4\x3f\xce\x77\x8f\xc9\x57\x46\x5c\x66\xef\x71\xed\x21\x26\x52\xc4\x7b\x89\xb0\x5b\xd7\xf0\x6a\x11\x9c\x0d\x31\x06\xe2\x50\xf7\x08\xce\x73\xc1\xea\xa2\xe4\x0a\x75\xda\xf9\x1b\xa7\xe8\xa8\xd0\xf6\x60\x79\xc5\x15\x07\x06\x3f\xbe\x38\xf3\x81\x84\x2c\x88\x5c\x10\x65\xe0\xfa\xe3\xc4\xad\xd7\x56\x1c\xff\x4a\xfa\xba\xc7\xfc\x67\x4f\xe9\x81\xb5\x2c\xd0\x1c\x97\x40\x95\x41\x48\x4c\x5b\xc5\x12\x02\x34\xed\xa3\x29\x96\xa1\xf2\x61\xd1\xc1\x4c\xc9\x2a\x1e\xa2\x49\x8d\x46\xd0\x56\x8c\xf0\x70\xa6\x01\x23\xe7\x48\x1b\x4c\x77\xe5\x92\xbb\xe4\xd5\xd5\x3a\x45\x6d\xbe\x7a\x8a\xcc\xd0\xa2\x6a\x4a\xd4\x14\x56\x3b\x04\x70\x21\x65\xc9\x59\x9d\x45\xe6\x66\xc9\xbb\x58\xb5\x51\x4d\x6e\xd0\x62\x2f\x2d\x02\xb7\xb0\xe6\x06\xff\xaf\x9d\x87\x75\x98\x5b\x4f\x17\x10\x92\xdd\x27\x0c\x1e\xb7\x48\x31\x14\x98\x84\x12\x6e\x82\x23\x87\x20\x66\x36\x05\xc7\x9f\x07\x16\x36\x9b\xe2\x46\x8e\x10\x79\xf2\x90\x65\x97\x29\x3c\x19\x46\x83\x81\x4d\xa6\xa2\xc1\x6d\xb4\x15\x6e\xec\xf9\x33\xe7\x26\x24\x5f\x46\x35\xa1\x12\x61\x29\xde\xdf\x87\x27\x9b\x09\x9c\x73\xf4\x53\x48\x1c\xd2\x63\x31\x38\xb6\x64\xaf\x25\x2b\xda\xc5\x86\x16\x8b\xf7\x70\xe8\xef\x92\xbc\x2a\xe0\x71\xaf\x0e\x96\x02\x53\x73\x0d\x6f\xdf\xd9\xf2\x28\xed\x18\x93\xa6\xc3\x05\x4c\xf6\xf1\x34\xcd\x93\x7c\xc1\xea\x70\x92\x70\x27\xf7\x21\xf1\xa5\x57\xd5\xfb\xdd\x3e\xc4\x31\x31\xa9\x6a\xae\x71\x32\x8e\x66\xc7\xfc\x6a\x8a\x6a\xf2\x73\x73\x9d\x20\x8f\x58\x51\x9c\x4a\x4c\x5f\x93\xaa\xb9\x4e\xc1\x2e\x35\x8c\xa2\x01\x95\x08\xb3\x57\x64\x19\x2f\x9b\x3a\x4f\xe2\x51\x9c\x02\x92\x9e\x5c\x59\x54\xa7\x2e\xf9\xfe\x45\x09\xc3\x55\x0a\x0a\x1e\xbb\xef\x96\x24\x5a\x7b\xe0\xad\xef\x94\xff\x96\x62\x32\xd4\xa5\xc4\x41\xfe\x22\xcc\xe2\xd0\x16\xa1\x13\x95\xf9\x9f\x86\x29\xc4\x3f\xbe\x38\x8b\x53\xe8\x1b\x75\x2d\x4a\x24\x1c\xf7\x8b\xe8\x7e\xb7\x8f\x5f\xec\x5a\x96\xe6\x17\x98\x71\x25\x57\x29\xcc\x2a\x93\x4d\x97\x4a\xd4\x66\x96\xc4\x21\x6f\xf0\xa9\x81\x2d\x51\x4d\xe0\xc1\x65\x4c\x84\x0d\xed\x42\x99\x3d\x51\x1d\xd5\x86\xab\x9a\x95\xc4\x2c\x45\x28\x69\xd5\xa0\x54\x03\x54\x2b\xe2\x6d\x46\x30\x94\xbc\x5c\xa5\xd0\xd9\x2f\x4e\xb8\x1d\x46\x83\x5b\xe0\xa5\x76\xfa\x1a\xd8\x4d\x6b\xb9\x03\xb8\x97\x48\xcb\xff\xc1\x6d\x44\xb5\xd8\x67\x54\x6d\x0d\x8c\x5b\x32\xa5\x79\xf0\x1e\xc9\xba\x43\xb1\x7a\xb0\xc2\x97\x52\xce\xb3\x97\xcc\xb0\x32\xc1\x6d\x5a\xdc\x18\xa5\x7e\x4d\xbd\x13\x41\xdc\x8a\xd5\x73\xf2\x23\x76\x4d\x9a\x39\x77\xe9\xd2\xf9\xf3\x13\xcb\x88\xc4\x4d\x48\xc1\x45\x00\x42\x87\x6b\x86\x0a\xf7\xef\xf6\x61\xef\x49\x6f\x36\xba\x71\x37\xdd\x43\x39\x2a\x5c\xec\x9b\xec\xc3\x43\xcb\x7b\xfa\xfd\x03\x6e\x67\xd2\x17\xdf\xe4\x41\xe1\x34\x81\xa6\xdb\x35\x4b\x5e\x27\x3e\x68\x0f\xe1\x8f\x30\xa6\x65\xed\x9a\x6e\x3d\xfa\xc7\xf3\xd5\xe9\xef\xd0\x1d\x86\x3e\x38\x8b\xf7\xb9\x8a\xe3\x65\x5d\xd0\xe4\xb3\xd7\xd3\xa4\xcd\x08\x3a\x71\x77\x08\x2b\x42\xdd\xb5\xe0\x46\xd4\xb4\x7b\xef\x08\x7a\x16\xe8\x4c\x68\x55\x21\x60\xa3\xcd\xe3\xe2\xa8\x7f\xab\x46\xaa\xa4\x34\xf6\x1b\x4a\x7b\x0d\x22\xa4\x94\x29\xd8\x1f\x8f\x4e\x76\x40\x17\x82\x95\x71\x4a\xd5\xc9\x1d\x50\x54\x35\x4b\x01\xff\xd9\x05\x75\x2d\xcc\xc7\x9c\x08\xff\x6d\xcd\x8d\x10\x13\x1c\x5a\x34\x31\x45\xae\xc4\x5a\x0a\xc9\x62\x6d\x21\x5f\x4d\x49\xc1\xfd\xb4\x83\xa8\x90\xb5\xa7\x21\x41\xdf\x01\x1d\xea\x11\x69\xa8\x42\xec\x80\xb6\x35\x82\x14\xe8\xdf\x1d\x70\xee\x14\x9c\xba\x03\x6f\x0b\x39\x1a\x81\x3d\xdb\xba\x14\x45\x6f\xd9\xc0\x71\xbb\x81\xe3\xdd\x1b\x08\xe7\xf4\x34\xe8\x53\x80\xf6\x2a\xb9\xae\xd0\x5d\xbd\x54\x3b\xb5\x32\x85\x59\xdd\x33\x33\x52\x53\x74\x41\x27\xce\x94\xe9\xde\x85\x17\xdd\x73\x2b\x26\x1e\x74\x2c\xe9\x5b\x79\x84\x2e\xc4\xe1\xfa\x40\x01\x1d\x5d\xc5\xf7\x7b\x76\xf9\x68\x30\xc8\xcd\x75\x0a\x39\xab\x73\x5e\xbe\xac\x71\xcc\xdd\x65\x66\x18\x52\xce\x6c\xb1\x32\xf1\xdf\x9e\xb1\xfc\xfd\x5c\xc9\xa6\x2e\x30\xb6\x28\x9e\xb9\x6a\x26\xba\xe9\x82\xcf\x30\x07\x77\x98\x28\x32\x3a\x97\xeb\x0c\x78\xea\x76\x99\xe4\xe6\x7a\xe8\x7c\xaa\xdf\xd0\x8f\xab\x35\x5a\x7b\x35\xce\x71\x93\x98\x2c\x76\x62\x4c\x34\x18\x48\x9d\xbd\xb8\x16\x26\x51\x3c\xcb\x65\x41\xbe\x20\xc1\x80\xeb\xfc\xf6\x64\x1f\x66\x75\x32\xfc\x6e\xd5\x89\xbb\xe1\x7d\x17\x3d\x5f\x28\x65\x85\x41\xc5\x96\xc2\xc6\xbf\xd1\xc8\xd6\x31\x9b\xda\x88\xd2\xe6\x58\x52\xc9\xc6\x88\x9a\x43\xce\xca\x52\x83\x5f\x9c\x62\x99\xe6\x25\xc7\x94\x0d\x03\xd9\xed\xc6\x38\xe1\x15\xa2\xe3\x51\xee\x13\xfd\x7b\x4c\x7a\x71\x06\x23\xcc\x91\xd1\xad\xbf\x74\x6e\xfd\x2a\x85\xf8\xf8\xcd\x2f\x8e\x41\x28\x8f\xec\x58\x5e\x25\xc3\x56\x15\x3b\x1e\xe5\x3e\x2b\x57\x7a\x4e\x31\x2d\x7b\x29\x55\xf5\x67\x4c\x17\x13\xaa\xdf\x0f\xa3\x01\x32\xdd\x26\xe5\x6b\x10\x54\x12\x1c\x6e\xa0\x3b\x94\xfc\x1f\x68\x5b\x07\x7c\x80\x39\x7a\xa5\xe7\x29\xb4\xe8\x6c\xec\xed\xa0\x6f\x33\x30\xfc\x18\x82\xb8\xbb\x03\xcf\x0e\x8c\x14\x49\x6f\xfa\x4a\xec\x7e\xf8\x70\x33\xb6\x35\x16\x32\x35\x6f\x2a\x5e\x1b\x78\x84\xf0\x8f\xa0\x6a\xb4\x81\x0b\xde\x2d\xe3\x4b\x05\xbc\x5a\x9a\x9b\x14\xe6\xd2\xc0\x83\xdf\xfe\x0b\x1d\x40\x7f\xf1\x36\xb5\x41\x65\xb8\xca\x88\xbf\xaf\x38\x2b\xb8\x4a\xbc\xa6\xae\x8b\xcf\x73\xa2\x15\xd9\x4a\x50\xf9\x2c\x85\x09\xb1\x6a\x5d\x71\x54\x76\xca\x2b\x69\x28\x1d\xa2\xc5\xe9\x44\xb2\xe2\x8d\x3a\xc7\x12\xaa\x3a\xd2\xcd\x97\x89\x06\xce\xf4\xad\xca\x3d\x77\xc5\xfb\x56\xe9\xba\xf1\xe6\x4e\xd4\xf7\x5c\xe2\xf7\x7b\x1b\x43\x35\x9a\xe6\x16\xc5\xa3\xab\x89\x61\x20\x6b\x0b\x94\xbf\x7d\xf9\x54\x25\xbe\x16\xe6\x07\xa7\xbd\x0f\x1d\x2e\xfc\x11\x17\xb7\x0a\xdd\x62\xb5\xc6\x18\x48\x49\xa1\x25\xbe\x25\x33\x68\x34\x71\xf1\x04\x73\x53\xcf\xca\xa4\x37\x7d\x2d\x2b\x7d\xf8\xb0\x8f\xbf\xa3\xdc\xdb\x75\xdb\xcd\xe8\xa8\x37\xd0\x2d\xed\xea\x1d\xcc\x66\x5d\x5f\x25\xa8\x7b\x3a\xc4\xcd\xed\xda\x4c\x6f\xf3\x6b\x3b\xe9\xc8\xf5\x2e\xdb\x40\xf0\x4f\xdc\x43\x8f\x8e\xee\x06\xee\xe8\x5f\xee\xe6\x5e\x3e\xc1\xbb\xb8\x4b\xc2\xbb\x78\x99\x0e\xd5\x5d\x0d\xfd\xc5\x16\xae\xe7\xa2\xee\x5c\x92\xd5\xf0\x40\xa7\xc0\x7c\xb5\xf5\x81\xde\x7a\xb7\x48\x05\xe4\xba\x73\x21\x48\x45\x1a\xca\x26\xac\x70\x83\xca\x3a\x4f\x46\x52\x9e\x96\x9c\x2f\x49\xba\x96\x39\xde\x2b\xec\xef\xbb\xa3\x84\x0f\x97\xad\xfb\x73\x66\xbe\x6e\xe2\x1f\x10\x66\x02\x56\x12\x0e\xd1\xc4\xff\xd0\x46\xd2\x95\x14\xf3\xb3\x9c\x63\xc8\x5c\x7b\xce\x11\x65\x36\xe7\xe6\x95\x4b\x05\x5d\x30\x1d\x8d\x5c\x2a\xec\x16\x6e\xaf\xce\x88\x53\x0c\x9e\x8e\xc7\x1b\x2e\x00\xfd\x6d\x63\x06\x47\xc6\x95\xcf\x71\x40\x53\x49\x49\x03\x73\x48\x21\x5f\xf0\xfc\xbd\x6f\xac\xe8\x26\x76\x17\x37\x70\x29\x94\x69\x38\x0e\xda\x8e\x02\xd6\x2b\xba\xb9\xc2\x4f\x3f\x4f\xff\x3c\xb6\xb8\xe4\xdf\xca\xb4\xd3\x40\x95\xd9\x62\xcd\x87\xb5\xe8\xf6\x74\x3c\x5e\xf5\x08\xbd\xf1\x4e\x5d\xa0\x7b\xd1\x6a\xaf\xc1\x3a\x69\x73\x3f\x9f\xfe\xac\x4d\x84\x34\x7d\x18\x05\x2d\x1c\xb7\x4b\x75\x8e\x63\xf7\x59\xc6\xde\x5d\x07\x4f\xd1\xa8\xd2\x7a\xba\x44\x65\xe7\xa7\xaf\x3d\xe8\xf9\xe9\x11\x6a\xcd\x86\x4a\xc2\x8e\xfa\xca\xe6\x32\xca\x33\x56\xb4\x15\xaa\x0e\x83\xa3\x01\xb5\xca\x4c\xf6\xdd\x75\x7a\xf6\x9f\x0d\x57\x37\xc9\x30\xfb\x91\x9b\xc4\x76\xd4\x0c\xa3\x01\x1d\x09\xb6\xc0\x2c\x5d\x3d\xd8\x97\x73\xb6\x80\xf9\x46\x9a\x21\xa0\x05\x38\x9b\x88\x06\xa1\x6f\x65\x1b\x76\xdf\xe6\x82\xae\x42\xdd\x9c\x30\xc5\xaa\x6d\xb0\xb6\x09\x65\x53\xc4\x45\x29\xfd\x80\x8b\x62\x98\xf5\x28\xe9\x67\xa9\xe8\x9b\xa3\x8e\x02\x32\x62\xb1\x61\x18\x67\xa4\x6d\xb7\x96\xbd\x7b\xf1\x75\xab\x14\x3c\x3d\x44\x9a\xe0\x54\xbc\x79\x12\xea\x21\x61\x34\xd4\x43\x08\xc8\xca\x7c\x25\x38\x74\x30\xdd\xde\x53\xdc\x76\xe5\xd0\x7b\xd2\x6b\x9a\xba\x9f\x2a\x78\xc2\x95\xd7\xd3\xe0\x7d\x77\x2c\xef\xa5\xde\x12\xd0\x6b\x79\xba\x2f\x0d\x56\x1d\x4f\x9c\xba\xd5\xdc\x64\x7f\x92\xa2\x7e\xe5\xbe\x25\x4e\x20\xf6\x48\x7a\xc9\x14\x95\xcd\x08\x0c\x93\x4f\xfb\x89\xda\xb7\x94\x3d\xad\x6a\x97\x34\x79\x88\x21\x84\x4f\xdc\x55\x12\xf5\x95\x30\xf9\x02\x5c\x13\x6c\x76\x26\x5f\xcb\x2b\xae\x12\x2f\x74\xb2\xd6\x9c\x69\x6e\x2f\x02\xa8\x05\x6a\x82\xe7\x54\xbb\xca\xbe\x75\x00\x67\x67\x27\xb6\xa6\xa8\xbc\x78\x71\xc5\x53\xae\x65\x79\xc9\xcf\x0e\x4f\x70\xed\x24\x36\xf9\xd2\x29\x95\x3b\x54\x5b\xbc\x4d\xb1\x01\xe5\xf9\xf3\x1d\x18\xcf\x9f\x3b\x8c\xb6\x13\x6b\x0d\x23\x75\x66\xad\xa1\x9c\x1e\xae\x51\x89\x80\x1e\x29\x0e\x5b\xac\x34\xbd\x87\xd6\x5d\x52\x4f\x76\xeb\x42\x53\xeb\x66\x49\x37\xce\x45\x30\x9a\x0c\xc8\x92\x02\x3b\xef\xac\x89\x77\xb7\x00\xdf\x6b\x39\x92\xca\xd6\x2e\x48\x17\xa9\x75\xe9\x13\x2d\x21\x1a\xd8\x66\x81\x50\xe9\xf7\xb7\x00\x74\x4f\x31\x08\x4d\x94\x5b\xc6\x51\x0b\x43\x54\xb7\x03\xb6\xce\x2b\x70\xc2\xf8\x3b\x10\xf0\x3d\x90\xdd\x7e\x07\xe2\xf7\xbf\x77\x15\x15\x0b\xef\x25\x63\x25\x97\x04\x5f\xc3\xe8\x70\xb5\xb1\xd8\xee\x68\xdd\x07\xb6\x5c\xf2\xba\x48\xec\xef\xdb\xa2\x02\xd5\xc2\xdb\x92\x69\x67\x33\x01\x41\xf8\x94\x86\x6d\x0c\xed\x61\xf4\x36\x1a\xd8\x66\x0d\xbb\xf3\xe5\x5b\xbb\xbb\x77\x7e\xff\x1f\xba\x5e\xc4\xcd\x0c\xee\xcf\xce\x7c\xdb\xe9\x66\x7d\x07\xfb\x6d\x47\x6a\xd7\x05\xd9\x2d\xac\x4f\x75\x9d\xad\x38\xcf\xfe\x48\x93\x2e\x6e\x4c\x27\x96\xfe\x4d\xcb\x3a\xfb\x99\x29\xbd\x60\x65\xe2\xba\x71\xa2\x4e\xd5\xc6\xf3\xad\x9f\xa8\x59\xfa\x13\x42\x35\xec\x57\x95\x77\x7a\x3f\x27\xe5\x5c\x36\xa5\xed\xd0\xa2\x4e\x50\x25\x58\x29\xfe\xbe\xdd\xfd\x75\x7a\x78\x7c\xee\xd2\x29\xf2\x78\x97\x92\xa8\xf6\xec\x4c\xca\xd5\xf3\x76\x6b\xbe\x0c\x89\x35\x8a\xd5\xda\x47\x6b\xd7\x7b\x9f\x4d\xb9\x39\xf3\xdf\xdd\x45\x87\xb6\x37\xb4\x59\xf8\xfe\xe1\x76\x68\x9b\xd1\x0f\xe9\xa0\x4f\x25\x3c\xea\x79\x46\x42\xec\xb7\x24\x20\x77\x36\xd0\xbb\x46\xb2\x30\x14\x88\xfb\xd6\x69\x9f\x94\x3c\xd0\x23\x72\x04\xb8\x05\x77\x15\x6b\x8b\x7f\xd6\xfc\xac\x8f\xe1\x0a\xc2\x1a\x19\xd5\xd3\x8e\x8a\x92\x1f\xb6\xc7\x8c\x64\xa3\x24\xed\x4c\xa4\x28\x7b\x26\x8b\x1b\x3b\x93\x2a\x6b\x17\xb2\xb8\x09\x54\xda\x27\x13\x19\x66\xa0\x07\x65\x99\x04\xf8\x61\xaf\xa8\x17\xcc\xca\x5f\x49\x38\xc5\x40\x40\xba\xf3\x0a\x96\xe0\x00\x62\x2b\xe0\xb6\xea\xb2\x95\x6d\x2e\x0f\x0c\x3c\x1f\xba\x0f\x8e\xe5\x18\x68\x02\xf3\x1f\x76\x46\x90\x9c\x30\x69\xd2\xb2\x28\xc5\xef\xfe\x80\x03\xf0\x07\x78\x6c\xcf\xcc\x53\xca\x8c\xd3\x2e\x91\x16\x71\x4f\xc3\xce\x9f\x7f\x8a\x82\xa1\x30\x02\x47\x11\xf2\xb9\x43\xe5\x62\x51\x2d\x4a\x27\xe4\xe4\x31\x0e\xbb\x50\xb5\x39\x8b\xed\x70\x10\x75\x86\x6c\x6c\x46\x98\x88\x42\x77\x33\x98\xe1\xb4\x49\xa7\x72\x8b\x0e\xda\xca\x1c\xa9\x69\xc5\x7d\xd1\xcc\x90\xaa\xb7\xef\xd0\x8a\x43\x1a\x13\x0d\x7e\xf5\x4e\x95\xc0\x29\x2d\x4f\x2e\x9a\xd9\x7d\x49\x6a\x8f\xbb\xd4\x04\xc7\xb7\x93\x37\x68\x8a\xa5\x3f\x05\x74\x62\x04\x92\x95\xc2\xd3\xf1\xd7\xdf\x0e\x2d\x23\xd1\x32\x51\x1d\x9f\x73\x56\x94\xa2\xe6\x49\x5b\x78\x45\x09\x24\x2b\x12\x1d\x52\xbd\xa9\xa9\xdb\x12\x09\x21\x41\x0c\x49\x67\xc5\xb5\x7d\xfd\xe3\x1f\x40\xd3\xda\x84\x6e\xcb\x2e\xf1\x84\x89\x07\xc3\x99\x92\x15\xac\x6c\xb9\xbb\xd9\x47\x0f\x2e\x1f\x75\xb7\xdb\x37\x95\x0e\x29\x6f\xc7\x13\x5a\xf9\x9d\x33\x9d\xae\xfe\x61\xbe\xf1\xb9\x0a\x48\xf9\xcb\x73\x8f\xcc\x27\x2e\x5d\x1d\x24\x08\x9f\xda\xdc\x4b\x0b\x71\xe6\xff\x36\x35\x24\x9a\xee\xa1\x87\x08\xbf\x55\x11\x9f\x8c\x9f\x7e\xfd\xe5\x15\xb1\xbb\xe4\x17\xd2\xc4\xd5\x5d\xdf\x5d\x15\xbb\xc4\x6c\xd3\xc5\xee\x95\xe0\x7d\x8e\xf0\x79\x55\xac\x95\x7c\x7b\xed\xc6\xee\x1a\xa2\x2a\x70\xb7\xfe\xfe\x01\x7f\x5b\x29\x13\x57\x04\x7a\xbb\xb1\xf6\xe0\x7b\x94\x6d\x55\xb8\xc2\x3c\x21\xaf\x8a\x37\x9d\x92\x2f\xf5\x38\xb9\x25\x93\xf0\x88\x2d\x85\x78\x2f\x77\x53\x70\xf4\x42\xd4\x1c\xa7\x2d\x1b\xba\x72\xda\x98\xc4\xad\xa5\x70\x76\xa5\xf5\x2c\xcc\xf5\xeb\xbe\xb3\xa7\x58\xe4\xb3\x83\xdc\x92\xbb\xf7\xb2\x37\x9a\xb6\x39\x35\x5d\x63\x82\x25\x78\x62\x8f\x10\x21\x95\xfb\xbf\x96\xee\xf5\xae\x9a\x3f\xab\x56\xe5\x6e\xaf\x6d\x7a\xd6\x94\xdb\x05\x3c\xa3\x56\x8a\x5f\x03\x13\xad\x42\xbe\x14\x25\x4f\x62\xdf\x74\xb8\xc9\x29\x21\xd2\xae\x1c\xe3\xf3\x9a\x9e\x62\x18\xe9\x76\x41\x6d\xca\x59\x8c\xa9\xd7\x76\x29\x59\x3c\x5b\xd2\xae\xdd\x72\xea\x1d\x5d\x76\x15\xc1\x74\x06\x07\xa5\x96\xd0\x04\x02\x83\x98\x9c\x26\x39\x61\xad\x6c\xea\xee\x1d\x48\xb7\x2b\x97\xcf\x1b\x59\xe1\x74\xd7\xdd\x38\x77\x4e\xb8\x36\x70\x10\xb7\x7c\xe0\x88\x06\xb3\xd5\x5c\xf5\x8c\x57\x4b\x2b\x95\xd0\x63\x9f\x42\xdc\x8a\xf9\x9e\x32\x92\x4b\x5e\xdb\xae\x7e\x3c\x8d\x52\xf0\xf8\x7f\x2e\xaa\x0d\x1c\xf9\x98\xc8\xda\x40\x2f\x66\x10\x62\xba\x90\xd9\xa1\x5c\xde\x24\xb3\x94\xd0\xad\xb7\x0d\xec\x14\x8c\x8b\xe3\xff\xb6\x9d\x0e\x27\xb6\xc9\x21\x1a\x9c\x93\xfe\x53\x53\xf5\x64\x1f\x66\x99\xbd\x5d\xe9\x36\x6e\x48\x9d\x1d\x2e\x2a\x59\x24\x2d\x68\x0a\xe3\x6f\xc6\xe3\x7b\xca\x25\x47\x24\xff\x96\x4b\x8f\x13\x5b\xed\xa3\x77\x8b\xa8\xa4\xf1\xaf\x86\x70\x3a\x4d\x69\x85\x11\x22\x54\x2f\x99\x68\xc7\x77\xdc\xfb\xd8\x97\xd8\xc5\xee\x3c\x20\x48\xe3\x7e\x37\x27\xff\x7c\x06\x77\xd8\xb5\x53\x29\xba\xb7\x94\xc7\x5f\xf0\x96\xf2\xf8\x8e\xb7\x94\xb6\xd9\xa8\xdf\x57\x77\xbf\xc5\xed\xfb\xbd\xb5\x0c\x39\xbc\x08\xbc\x7f\xef\xc4\x03\x0d\xed\x03\xc1\xb5\x1e\x20\x95\xfd\xcc\xcd\x42\x16\x29\xf8\x25\x56\x2e\xbc\xa9\xed\xc4\xf7\x3c\x5b\x21\xbd\x94\x4d\x5d\x6c\x6f\x16\xba\x64\x8a\xb4\x87\xa4\xdc\x6b\x1e\xfa\x17\xe9\x1d\xba\xb5\x25\xbd\xec\xd4\x71\x8d\xba\x75\x56\x19\xe4\x6f\xa5\xdb\x87\x0b\xe0\xca\xf8\x3a\xbc\xe2\x43\xcd\xb0\x4d\xa5\xf4\xda\xcc\x37\x16\x85\xf7\x46\x59\xa7\x5d\x71\xad\x45\x39\x1c\xee\xfd\x9f\xe5\x10\xb5\x55\x12\xbb\xda\x81\x6f\x64\xee\x14\x95\x36\xdf\x73\xac\x5d\x07\x85\x1e\x68\x2f\x8d\x23\x23\x59\xe2\x1b\xa2\xd1\xb7\x32\xad\xb9\x32\xc7\xd2\x1a\x3c\x57\x6a\xc5\xe4\xdd\x9f\x47\x30\x12\x4d\x1a\x97\xa4\x3b\x77\x4f\xf8\xcc\xdf\x28\x50\xff\x42\x68\x99\x1e\x7a\xd2\xd7\x8a\x61\xb6\xbb\xb8\x53\x0e\xeb\x6d\xf1\x5e\xf4\xd8\x32\xa2\x7b\x42\x82\x79\x87\x54\x3d\xda\xc8\x0f\xf5\xd1\x87\x22\x6a\x4b\xdd\x5a\x55\x62\x43\x29\x6a\x73\x53\x68\xff\x55\x9e\xe5\x82\xb6\x8c\xd8\xd0\x7a\x3e\x1a\x01\x4d\x84\xfe\xc3\x34\x7b\x8c\x47\x72\x97\x4a\x5e\x70\x9d\xf5\xfe\x8e\x4a\xa6\xb9\x49\x8c\x6a\x78\x20\xbc\xd3\x62\xda\x0b\x43\x2d\x2d\xf6\xb9\x33\xba\x86\x35\x4c\x33\x56\x6a\xdf\xc5\x49\xd7\x2d\x88\xa6\xf6\xbd\xd5\xab\x6a\xd6\xe1\x11\xa2\x78\xa9\x64\x85\x72\xb3\x05\x99\xbb\xca\x89\xd1\x5b\x59\xdc\x2c\x92\xd8\xe9\x87\x89\x87\xd6\xdb\xe7\x5c\x5c\xf2\xe2\x8c\x5f\x1b\xd7\x10\xd4\xbb\x64\x0c\xbf\x2b\x51\x4d\x97\x2c\xe7\x89\x0f\x03\xcd\xec\xed\x78\x52\xbf\x23\x1d\x46\x87\xd2\xc3\xb4\xbf\xdf\x79\xe2\x68\x9d\x49\xe0\x56\x59\x27\xf1\x94\x5b\x01\xa0\x45\x7b\xeb\x0d\xf7\x2c\xc4\xba\xb6\x16\xd5\x61\x03\xf9\xf3\x33\x89\x5c\x70\xb5\xab\x7e\x5c\x58\xe1\x24\xe1\xb9\xbb\x3e\xdb\xc4\xce\x93\x8d\x5f\x88\x65\xb6\xe0\x6d\xcb\x1b\x3d\xec\x9d\xc4\x48\xcc\x02\xe7\x5e\x31\x7d\xa2\xf8\x4c\x5c\x27\x5d\x8e\xa4\xee\x19\x67\xec\x9e\xba\x2c\xe9\xef\xc9\x74\x18\x3e\x5d\x96\xc2\x1c\xaf\xce\x81\x38\x85\xa7\x43\x7f\x09\x86\xf0\x71\xec\x1e\xb4\x94\xbc\x4e\x08\x0b\xdd\x82\x3f\x75\xaf\x5a\x08\x8c\x1e\x7f\x18\xfd\xf6\xc9\xbb\xf0\xf6\xa4\xab\xab\x2f\xf2\x85\xa4\x1e\xa9\xcb\xb5\x3d\x92\xbb\xb6\x17\x27\xeb\x9c\xbc\x9b\x44\x70\xf6\x67\x0a\x82\x38\x75\x4f\xf6\xaf\xa9\x5f\x68\x07\x5d\x51\xbf\x59\xab\x7d\x1e\x04\x2e\x58\xfe\x7e\x33\x2f\x3e\x95\x0b\xbd\x79\xe1\x36\xe9\x8b\x28\x68\xa0\xfa\x9e\x1c\xb2\x57\x9e\x2d\x97\xda\xaa\xd9\x4a\x42\xfd\xbe\x96\x57\xb5\x73\x17\xf6\x81\xbf\x9f\x66\x8b\x9d\x0f\xf4\x04\x1e\x5c\xae\xb3\x27\xed\x09\x21\xdc\xc7\xba\xb7\x7d\xb9\xf9\x32\xc1\x7b\xc3\x0b\xa1\x8f\x84\xeb\x9d\x2d\x04\x1b\x5e\x0e\x75\xa3\xe8\xfd\xa3\x33\x3d\x44\xfd\x78\x78\xf6\x51\xb3\x4f\xa5\x8d\xce\xbd\xab\x82\x2f\x1b\x9f\x7b\xd4\xed\x0a\xd0\x7e\xd6\xee\xf0\x6c\x0b\xf4\x9b\xc3\x73\xe7\x69\x78\xfc\x4f\x8f\xbf\xdd\x77\xe8\xf7\x0d\xc0\x79\x37\x47\x0a\xfb\xb6\x7f\x64\x82\x44\xf1\x49\xe1\x96\x28\x5a\x8b\xb7\x3d\x83\x71\xaf\x50\xea\x4e\x77\x7a\x78\x05\x4c\x8b\xb6\x64\xe5\xe1\xf6\xe2\x7e\xe1\xdf\x71\xd8\x1a\xae\x25\x69\xa7\xbb\xf8\x1f\xce\x07\x88\xc2\x8f\x25\x04\x79\x7b\x39\xb5\x31\x0b\xf8\xec\xb0\x7f\x07\x3e\xfd\xeb\xc7\xfd\xfe\x26\xef\x16\xf8\xd7\x39\x4f\xd1\xfe\x13\xc3\xfb\xbd\xd8\xfc\x45\xe2\xfb\x86\x3d\xdf\x6b\xb7\xeb\x04\x7e\x56\xf4\xbe\x17\x03\xee\x19\xbe\x9d\xfb\xf9\xec\xf8\x4d\xde\xb1\x0d\x02\xed\x9d\x50\xcf\xe6\x9c\x3a\x23\x39\x9d\x78\x1e\x2a\x9d\xaf\x9c\x71\x25\x9b\xe3\x57\x87\x49\x73\x6e\xa0\xdb\xab\xee\x2e\x4b\x43\x37\x6e\x78\x09\xbb\x8a\xc5\x96\x40\x52\x28\xb8\x61\xa2\x84\xce\x93\xf8\x1d\x8f\x9c\xd1\x28\xe8\x79\xaf\xcc\xf3\x46\x29\x7a\xe2\xad\xed\x05\xb5\xc5\xd3\xde\xfa\xf9\x85\x57\x9e\x55\xb7\x7f\x59\xc1\xaf\xd8\xe9\xb4\x6b\x5b\x02\xc4\xac\xf3\x37\x18\xda\xbb\x56\xb7\xbb\xd0\x9b\x16\xfe\x60\xe6\xad\xeb\xe3\xb9\xa5\xb8\x79\xae\x6d\x2f\xbc\xe6\xc6\x3a\xf4\x4a\x5e\x72\x28\x1a\xfa\x53\xb6\x86\x6b\x2a\x55\x6e\xe9\xf4\xd3\xe8\x5f\xd6\x1c\x4e\x4b\x77\x0a\x71\x1a\x0f\xb7\x3f\xf2\xb6\xf3\xe9\x9c\xca\x49\x51\x7c\x21\x81\x9a\xc1\x8f\x4e\x3c\x26\xe7\xf5\x3d\xd0\x86\x36\x25\xea\x79\xe8\xde\xa0\x77\x59\x39\xf1\x8d\x90\x6d\x72\xa2\xdb\x73\xbc\xd7\x45\xb5\xd2\x03\xd8\x05\xb8\xc5\xc4\xc1\xee\x94\x1b\x4d\x7f\xbc\xc0\x46\x26\xc5\x75\x96\x65\xad\x2e\x69\x57\x05\x49\xc2\x2d\xfb\x7f\x07\x00\x00\xff\xff\xea\xf8\x41\x47\x2d\x59\x00\x00") func testImagesAgnhostNetexecNetexecGoBytes() ([]byte, error) { return bindataRead( @@ -3541,7 +3617,7 @@ func testImagesAgnhostNoSnatTestProxyMainGo() (*asset, error) { return a, nil } -var _testImagesAgnhostOpenidmetadataOpenidmetadataGo = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x9c\x58\x6f\x6f\xdb\x38\xf2\x7e\x2d\x7e\x8a\x59\xfd\xd0\x54\xee\x4f\x96\x7a\xb9\x37\x07\x17\x7d\x91\x3a\xcd\xad\xaf\xbd\x24\xa8\x9d\x16\x8b\xbb\x03\x4a\x4b\x23\x89\xb5\x44\x6a\x49\x2a\x8e\x51\xf4\xbb\x1f\x86\x94\x64\x3b\xf1\x2e\xd2\x2b\x50\x38\x96\x38\x0f\xe7\xcf\xc3\x67\x86\x4e\x5f\xb1\xb9\x6a\x77\x5a\x94\x95\x85\xf3\xd7\xe7\xaf\x61\x55\x21\x7c\xe8\xd6\xa8\x25\x5a\x34\x70\xd1\xd9\x4a\x69\x93\x30\xf6\x51\x64\x28\x0d\xe6\xd0\xc9\x1c\x35\xd8\x0a\xe1\xa2\xe5\x59\x85\xd0\xbf\x89\xe1\x33\x6a\x23\x94\x84\xf3\xe4\x35\x44\xb4\x20\xec\x5f\x85\x93\x37\x6c\xa7\x3a\x68\xf8\x0e\xa4\xb2\xd0\x19\x04\x5b\x09\x03\x85\xa8\x11\xf0\x21\xc3\xd6\x82\x90\x90\xa9\xa6\xad\x05\x97\x19\xc2\x56\xd8\xca\x6d\xd2\x43\x24\xec\xb7\x1e\x40\xad\x2d\x17\x12\x38\x64\xaa\xdd\x81\x2a\x0e\x57\x01\xb7\x8c\x01\x00\x54\xd6\xb6\xb3\x34\xdd\x6e\xb7\x09\x77\x5e\x26\x4a\x97\x69\xed\x57\x99\xf4\xe3\x62\xfe\xfe\x7a\xf9\x7e\x7a\x9e\xbc\x66\xec\x4e\xd6\x68\x0c\x68\xfc\xbd\x13\x1a\x73\x58\xef\x80\xb7\x6d\x2d\x32\xbe\xae\x11\x6a\xbe\x05\xa5\x81\x97\x1a\x31\x07\xab\xc8\xcf\xad\x16\x56\xc8\x32\x06\xa3\x0a\xbb\xe5\x1a\x59\x2e\x8c\xd5\x62\xdd\xd9\xa3\x04\x0d\x5e\x09\x03\x87\x0b\x94\x04\x2e\x21\xbc\x58\xc2\x62\x19\xc2\xbb\x8b\xe5\x62\x19\xb3\x2f\x8b\xd5\xaf\x37\x77\x2b\xf8\x72\xf1\xe9\xd3\xc5\xf5\x6a\xf1\x7e\x09\x37\x9f\x60\x7e\x73\x7d\xb9\x58\x2d\x6e\xae\x97\x70\x73\x05\x17\xd7\xbf\xc1\x87\xc5\xf5\x65\x0c\x28\x6c\x85\x1a\xf0\xa1\xd5\xe4\xbb\xd2\x20\x28\x75\x98\x27\x6c\x89\x78\xb4\x79\xa1\xbc\x33\xa6\xc5\x4c\x14\x22\x83\x9a\xcb\xb2\xe3\x25\x42\xa9\xee\x51\x4b\x21\x4b\x68\x51\x37\xc2\x50\xf1\x0c\x70\x99\xb3\x5a\x34\xc2\x72\xeb\xbe\x3f\x09\x27\x61\xaf\x52\xc6\xd2\x14\x6e\x79\xb6\x21\x1c\xd5\xa2\x14\x79\x83\x96\xe7\xdc\x72\xb0\x68\xac\x71\x06\x37\x8b\xcb\x39\x45\x9e\xd1\x46\x3b\x40\x99\xb7\x4a\x48\x6b\x60\x5b\x89\xac\x02\xae\x11\x5a\xae\x2d\xa8\x82\xe0\xc8\x62\x89\xfa\x5e\x64\x78\x91\x65\xaa\x93\x76\x61\x4c\x87\xfa\x72\x04\x28\x90\xdb\x4e\x63\xc2\xda\x93\x3b\x33\x26\x9a\x56\x69\x0b\x11\x0b\xc2\x4c\x49\x8b\x0f\x36\x64\x41\x58\x34\xee\x43\xa8\x54\xa8\xce\x8a\x9a\xbe\xd4\xaa\xa4\x0f\x89\x36\x25\xae\x84\x8c\x05\x4a\xe4\x19\x84\xa5\xb0\x55\xb7\x4e\x32\xd5\xa4\x99\xd2\xa8\x4c\x5a\xaa\x29\xbd\xa2\xe5\x07\x2f\x4d\x5b\xfc\xe5\xaf\x69\xa6\xd6\x9a\xbb\x37\x8a\xd2\xea\x58\xf6\x90\x2a\xde\xd9\xea\xdc\x3f\x6e\x37\x65\x22\x64\x6a\x7e\xef\xb8\x46\xc2\xfa\xa6\x0c\x26\xf7\xe7\xe9\xb7\xad\xf3\x6a\xf3\x37\x93\x08\x95\x66\xb5\x40\x69\xa7\xa5\x4a\x35\x1a\x1b\xb2\x89\xcb\xf0\xbc\xc9\x57\x68\xec\x9f\x67\x45\x18\x3a\x50\x9e\xb7\xa5\xac\x94\xb1\x30\x27\xb7\x12\x76\xcf\xf5\xf3\x20\xde\xc2\x99\x8b\x24\x99\xab\xa6\xe1\x32\xff\xce\x82\x3b\x83\x33\x00\x08\xa9\x9a\x53\xe3\xad\xa7\xdc\x9b\x4f\x85\xb3\x9f\x8e\xa5\x0d\x63\x16\x2c\x2b\xa5\xed\x0c\xc2\xd5\x58\xfe\x67\x15\x93\x4c\x3f\x2a\x59\xce\x20\xfc\x84\x3c\x37\xe0\xce\x76\x43\x16\xee\xbc\x6d\x90\x4e\x4b\x0e\xdc\x5a\x6c\x5a\x42\x56\x70\x8f\x5a\x14\x3b\x10\x16\x78\xc9\x85\x34\xd6\xcb\xd1\xed\x02\xc8\x51\xd4\x2f\x0d\x84\xf0\xff\x2c\x08\x42\xc7\xc0\x91\x77\x31\x74\x86\xe8\xce\x49\x7d\x74\x3e\x25\xf2\xed\x3c\x4b\xe9\xf8\x60\x83\xd2\xb3\x3e\x21\xaf\x2e\x74\x69\x66\xe0\xf3\xf2\x4f\xfe\x20\x9a\xae\xb9\xa6\x67\xd1\xeb\x49\xcc\x82\x4f\x9d\x9c\x01\x34\x5c\xc8\x98\xfd\x60\x2e\xd5\x11\x0b\x9c\xbf\xb7\xdc\x56\x30\xfe\xa3\x73\x2f\x4b\x16\xf0\x2e\x17\x48\xd2\xf6\xf4\x95\x90\xf3\xba\x33\xf6\x30\x3b\x6b\xa5\x6a\x22\x41\xd1\xc9\x0c\x84\x14\x36\x9a\xc0\x77\x16\x14\x06\x66\x6f\x9f\x55\xd3\xe4\xaa\xe6\xa5\x89\x26\x64\x93\x2c\xdd\x46\x9f\xb9\x8e\xce\x46\x0f\x63\x08\xdd\xdf\xd3\x96\xdb\x2a\x8c\x21\xa4\xff\xce\x75\xab\x40\x23\xcf\xa1\xaf\x3a\xf4\x55\xef\x8b\x51\x68\xd5\x24\xe1\x13\xdc\x21\xbc\x18\xc2\xe1\xcf\x01\xf4\x62\x88\xdc\x2a\xc8\x2a\xcc\x36\xa4\x80\x1a\x33\x14\xf7\x43\x89\x07\xc0\x77\x4a\xd5\x0e\xee\x69\x4a\x62\x08\x85\x9c\x66\xfe\xe9\x21\xf5\xa0\xe0\xb5\xc1\x98\xca\xbd\x90\x59\xdd\xe5\xe8\xe9\xb7\x5f\x0d\x6b\xe4\x9a\x44\xcc\x05\x20\xa4\xd3\x7a\x34\x16\x2a\xe4\x39\x6a\x93\x40\x48\x6c\x09\xc2\x3b\x83\xb0\xad\x50\xc2\x3d\xaf\x45\xce\xad\x23\x4b\x4f\xb1\x23\x7a\x9d\x10\xb5\x78\x00\xf1\xe2\xd6\xb7\x13\x20\x29\x40\x69\x45\xd6\x13\x6b\x42\x6c\x71\x55\x25\xee\x44\x59\x93\xc3\xab\xa3\xb3\x17\x03\xd7\xa5\x81\x7f\xfd\xc7\xb3\xc3\x95\x3d\xb3\x0f\x31\xa0\xd6\x54\x7c\xea\x8c\x37\xd4\x97\xcf\xe7\x4e\x33\xa2\x5e\xe9\x92\x77\x3c\xdb\x94\x5a\x75\x32\x8f\x26\x13\x16\x88\xc2\x59\xfc\xf2\x16\xa4\xa8\x09\x24\xa8\x55\x99\x5c\x71\xcb\xeb\x08\xb5\x9e\xb0\xe0\x07\x63\x81\xe6\xdb\x11\xb9\x44\xeb\x32\x14\x3d\xd3\xda\x3d\xba\xd5\x42\xda\x28\xbc\xf9\x30\x83\xbf\xab\x9e\x23\x54\x4c\xab\x36\x23\xf0\xb7\xad\x4d\x6e\xb9\x36\xb8\x14\xa5\xc4\x3c\xd2\x7c\xfb\xdc\x2d\xe8\x5c\x75\xd2\xf0\x02\xe7\x35\x17\x8d\x81\xcc\x7d\x8c\xd6\xb3\xb7\xb4\x65\x72\x77\xb0\xe4\x8b\xb0\x95\xea\xec\x67\x12\x89\x3e\xed\xd1\xd9\x21\xc6\xe4\xcd\xcf\xc4\x56\xf8\xe0\x4a\x65\xc1\xcb\x1e\xbc\x30\x61\x7c\xe4\x54\xe2\xcf\xde\xe4\xd8\xea\xaa\xab\xeb\x98\xe6\x9d\x69\xcf\x26\xcc\x7b\xef\x67\xf0\x6f\xf9\xe2\xff\xee\x1f\xa1\x4c\x18\x0b\x84\x31\x63\xd6\xa8\xe9\x24\xd7\xb8\xbd\xd5\xea\x5e\xe4\xa8\x23\xc7\x82\xd3\xfb\xfe\x5c\xb9\xfa\x90\xe6\x4a\x1a\xab\xbb\x8c\x1c\x73\x22\xd8\xf6\x3b\xb9\x99\x61\x08\xf6\xb1\x9b\xe3\xa6\x54\x9c\x5a\xe4\xab\x83\x42\x0b\x63\x12\x9f\x77\xd4\xd1\x99\x0b\x60\xae\x64\x21\xca\xef\x9e\xab\x8b\xcb\x19\x0c\xea\xf0\x63\xe2\x97\xee\x7c\x5c\x3f\xc1\x89\x47\xb4\xfb\x3c\x66\xd7\x88\x52\xba\xa6\x42\x02\xf3\x8f\x2f\xab\xd0\x3b\xa9\xe1\x4f\xf9\x33\x44\x91\xf8\x15\xd1\xd9\xff\xca\x94\xfd\x29\x70\x90\xfd\x56\x4e\x30\xfd\xb9\xf8\x25\x3c\x49\x91\x3f\xa6\xc7\xa1\x2b\xa4\x1b\x76\xd7\x22\x6c\xba\x35\x5e\xf3\x06\xc1\x17\x8f\xdc\x1a\xbe\x92\x5e\x7d\xfd\x66\x94\x9c\x85\x92\x37\x18\x7e\x65\xc1\xdd\xe2\x12\x1e\xbd\xea\x44\x1e\x7e\x3d\x82\xeb\x73\x73\x0c\x68\x5a\x3e\x74\xab\xde\x1e\x0e\xc1\xdd\x6b\xda\xe1\xb8\x0d\xed\xdd\xeb\xd7\xf6\x5d\xa4\x6f\x22\x07\x1b\x67\x8f\x37\x25\x99\xf0\x9e\x30\x16\x1c\x5c\x42\x0e\x3c\xec\x31\x37\xe3\xcb\x44\x28\x0f\xe9\x24\x35\xda\xc0\x2b\x0f\x3b\x01\xdf\x9b\xa2\xc9\xe0\xfc\x77\x16\x68\xb4\x9d\x96\x50\x34\x36\x59\xb6\x7d\x09\x5e\x98\xf4\x85\x71\x84\x77\xc7\x7a\x93\xec\x37\x4e\xc6\x2c\x3c\x7a\x7e\x1c\xb1\x5b\x46\x2b\x86\x3e\xb7\x97\xf8\xbd\xa2\x42\xe4\xdd\x70\x47\x45\x69\xa7\xea\xeb\xfd\xb9\x71\x73\x69\x42\x03\xd0\x95\xa8\x31\x1a\x9b\xf4\x64\x74\xda\x9b\x47\xeb\x89\x33\xa2\x1d\xd2\xf4\x49\x2f\x00\xbf\xd8\xb8\xdb\x91\xeb\x0a\x60\x2b\x4e\x77\xab\xbe\x2f\x72\x09\xbf\xae\x56\xb7\xe0\x97\xc7\xfb\xe1\x9e\xd0\xfc\xd8\x9a\xd0\x82\x1e\x6e\x83\xbb\x04\x16\x05\xc0\x74\x7a\xaa\xf7\xd2\xe8\x69\x75\x87\xb1\xeb\xb7\x7e\x84\x85\xad\xa8\x6b\x42\xf3\x97\xbc\xa3\xdb\xe4\x62\x68\xea\x5e\x14\x12\xb8\xa1\x5b\xcc\x56\xd0\x15\xc9\x1b\x92\x15\x19\xd3\x4c\x9e\x5c\x62\xc1\xbb\xda\xae\x34\x97\x86\xe6\xfa\x84\xde\xd0\x05\xf5\x2b\x29\xcb\x57\xa8\xc5\x5a\x73\xbd\x03\x8d\x74\xb7\xe9\x87\xce\xa7\x41\x0c\x99\xd8\xe0\xee\x0d\x88\x82\xb6\x12\x06\x0c\xda\x78\xb8\x75\x0c\x40\x83\x07\xee\x61\x2f\x86\xb9\xf7\x65\xc8\x2f\x77\xf7\x2e\x5b\x71\xe9\x16\xe5\xde\x45\x02\x72\x79\xf5\x39\xe8\x1d\x15\x06\x78\x5d\xab\x2d\xcd\xe7\x34\xfb\xa0\x34\xa4\x4d\xfd\xf0\x61\x88\x1d\xa0\x55\xe7\xe7\xdc\x47\x23\x2c\x31\x92\x50\x4e\x27\x3e\xf6\x53\x72\x36\x06\x58\x88\xb2\xa3\xbb\xeb\x78\x6d\xe6\x6d\xab\x55\xab\x05\xb7\x08\xf3\x8b\xc4\xd3\xf1\x0f\x47\x87\xb9\xff\x9c\xc0\xe3\x27\x87\x74\xa5\x98\x6e\x2e\x6f\xa2\xc6\xf2\xae\x40\x39\x99\xc1\x52\x35\x98\xf3\x5d\x0c\x8d\xfb\x01\x61\xcb\xdd\x90\x08\x59\xc5\x65\xd9\xdf\xf0\x8d\xf2\x0c\xdc\x22\x64\x94\x33\x34\xd6\x23\x39\x86\x6b\xf5\x0d\x33\x6a\xd0\xde\x71\x2e\x5d\x06\xc6\x49\xd9\xa0\x1d\x32\x83\x0f\x16\xb5\xe4\xf5\xbe\x47\x91\x85\x83\x1a\xf3\x39\x4c\x6a\xe3\xda\xfd\x85\x33\xa2\x5b\xbb\x9b\xcb\x32\x4e\x33\x1e\xbe\xa4\xf1\x56\xe6\x0e\x80\x43\x2e\x8a\x02\x35\x8e\x33\xae\xf7\x06\xa4\x92\xd3\x03\xfa\x0e\x7e\x4d\x12\xe6\xec\xde\xed\x86\xfa\xc7\x23\x6b\xfa\x07\x8e\x34\x60\x07\xe6\xee\xeb\x62\x76\xc6\x62\x03\x5a\x29\x0b\xeb\x4e\xe6\x35\x0d\xae\x69\x0a\x46\x50\xc0\xc2\xbe\x34\xa7\x66\xcf\xa3\x0c\x08\x69\x9d\x47\x09\x0b\xb4\x25\xf5\x38\x79\x58\x5c\x87\x3b\x71\xb1\xa0\x26\x96\xa6\x74\xa8\x0f\xe6\xe3\x03\x62\xd1\xb4\x3a\x46\x73\xb0\xc4\x93\x8c\xea\xe9\x4b\xe9\x61\x0e\xa6\xdb\x83\xdf\x6c\xf6\x34\x4e\x58\x10\x64\x45\x39\x0a\x1d\x5d\x6e\x93\x47\x32\x40\xe3\xe6\x89\xc6\x3f\x08\x9f\x14\xb5\x97\xbc\x80\x9a\x6d\xa0\x3d\x27\xa1\xc7\x1a\xe3\xbd\x52\x3a\xca\x8a\xf2\x19\x58\x24\xff\xef\x89\xd5\x45\x14\x66\xaa\xab\x73\xf7\x9b\x54\x7f\x18\x65\x6e\xb5\x68\x5b\xd4\x33\x3f\xf9\xf8\x2e\x4f\x3b\xd3\xb4\x9c\xd9\x07\x8a\x62\x38\x24\x34\x69\x7e\xe6\x75\x87\x27\x67\x70\xba\x91\x3c\x51\xa3\x18\xce\x0e\xf4\xc4\xf9\x36\x86\x30\x03\x6d\xc9\xe8\xc7\x5e\xf5\xdd\x68\x24\x45\xcd\x7e\xb0\xff\x06\x00\x00\xff\xff\xb4\x88\x6d\x9a\xac\x13\x00\x00") +var _testImagesAgnhostOpenidmetadataOpenidmetadataGo = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x9c\x58\xff\x6f\xdb\x38\xb2\xff\xd9\xfa\x2b\x66\xf5\xd0\xae\xdc\x27\x4b\x79\x79\xef\xe1\x6e\xbd\xe8\x0f\xa9\xd3\xee\xfa\xb6\x17\x07\x75\xda\x62\x71\x77\x40\x69\x69\x24\xb1\xa6\x48\x2d\x49\x45\x31\x8a\xfe\xef\x87\x21\x25\x59\x4e\xbc\x8b\xee\x05\x08\x64\x49\xe4\x70\xbe\x7c\x66\xe6\x33\x4a\x5f\x04\x2b\xd5\x1c\x34\x2f\x2b\x0b\x97\x17\x97\x17\x70\x57\x21\xfc\xd2\xee\x50\x4b\xb4\x68\xe0\xaa\xb5\x95\xd2\x26\x09\x82\xb7\x3c\x43\x69\x30\x87\x56\xe6\xa8\xc1\x56\x08\x57\x0d\xcb\x2a\x84\xfe\x4d\x0c\x1f\x50\x1b\xae\x24\x5c\x26\x17\x10\xd1\x82\xb0\x7f\x15\xce\x7f\x0c\x0e\xaa\x85\x9a\x1d\x40\x2a\x0b\xad\x41\xb0\x15\x37\x50\x70\x81\x80\x0f\x19\x36\x16\xb8\x84\x4c\xd5\x8d\xe0\x4c\x66\x08\x1d\xb7\x95\x3b\xa4\x17\x91\x04\xbf\xf6\x02\xd4\xce\x32\x2e\x81\x41\xa6\x9a\x03\xa8\x62\xba\x0a\x98\x0d\x02\x00\x80\xca\xda\x66\x99\xa6\x5d\xd7\x25\xcc\x69\x99\x28\x5d\xa6\xc2\xaf\x32\xe9\xdb\xf5\xea\xf5\xcd\xf6\xf5\xe2\x32\xb9\x08\x82\xf7\x52\xa0\x31\xa0\xf1\xb7\x96\x6b\xcc\x61\x77\x00\xd6\x34\x82\x67\x6c\x27\x10\x04\xeb\x40\x69\x60\xa5\x46\xcc\xc1\x2a\xd2\xb3\xd3\xdc\x72\x59\xc6\x60\x54\x61\x3b\xa6\x31\xc8\xb9\xb1\x9a\xef\x5a\x7b\xe2\xa0\x41\x2b\x6e\x60\xba\x40\x49\x60\x12\xc2\xab\x2d\xac\xb7\x21\xbc\xba\xda\xae\xb7\x71\xf0\x71\x7d\xf7\xf3\xe6\xfd\x1d\x7c\xbc\x7a\xf7\xee\xea\xe6\x6e\xfd\x7a\x0b\x9b\x77\xb0\xda\xdc\x5c\xaf\xef\xd6\x9b\x9b\x2d\x6c\xde\xc0\xd5\xcd\xaf\xf0\xcb\xfa\xe6\x3a\x06\xe4\xb6\x42\x0d\xf8\xd0\x68\xd2\x5d\x69\xe0\xe4\x3a\xcc\x93\x60\x8b\x78\x72\x78\xa1\xbc\x32\xa6\xc1\x8c\x17\x3c\x03\xc1\x64\xd9\xb2\x12\xa1\x54\xf7\xa8\x25\x97\x25\x34\xa8\x6b\x6e\x28\x78\x06\x98\xcc\x03\xc1\x6b\x6e\x99\x75\xf7\x4f\xcc\x49\x82\x17\x69\x10\xa4\x29\xdc\xb2\x6c\x4f\x72\x54\x83\x92\xe7\x35\x5a\x96\x33\xcb\xc0\xa2\xb1\xc6\x6d\xd8\xac\xaf\x57\x64\x79\x46\x07\x1d\x00\x65\xde\x28\x2e\xad\x81\xae\xe2\x59\x05\x4c\x23\x34\x4c\x5b\x50\x05\x89\xa3\x1d\x5b\xd4\xf7\x3c\xc3\xab\x2c\x53\xad\xb4\x6b\x63\x5a\xd4\xd7\xa3\x80\x02\x99\x6d\x35\x26\x41\x73\xf6\xe4\x20\xe0\x75\xa3\xb4\x85\x28\x98\x85\x99\x92\x16\x1f\x6c\x18\xcc\xc2\xa2\x76\x17\xae\x52\xae\x5a\xcb\x05\xdd\x08\x55\xd2\x45\xa2\xed\x2f\x29\x41\x66\xf8\xdd\x6a\xb7\x48\xb7\xd2\xf2\x1a\xe9\xa7\xbf\x06\x33\xc5\xf3\x0c\xc2\x92\xdb\xaa\xdd\x25\x99\xaa\xd3\x4c\x69\x54\x26\x2d\xd5\x82\x5e\xd1\xd2\xc9\x4b\xd3\x14\xff\xf3\xbf\x69\xa6\x76\x9a\xb9\x37\x8a\x7c\xef\xa0\xf8\x90\x2a\xd6\xda\xea\xd2\x3f\x6e\xf6\x65\xc2\x65\x6a\x7e\x6b\x99\x46\x92\xf5\x59\x19\x4c\xee\x2f\xd3\xcf\x9d\xd3\x6f\xff\x57\x93\x70\x95\xb2\x86\xd7\x2c\xab\xb8\x44\x7d\x48\x9b\x7d\x99\x92\x35\x69\xc7\xf8\x74\x51\x26\x38\x4a\xbb\x28\x55\xaa\xd1\xd8\x30\x98\xbb\x58\xad\xea\xfc\x0e\x8d\xfd\x63\xff\x72\x43\xa9\xe9\x33\xa0\x94\x95\x32\x16\x56\xa4\x7b\x12\xdc\x33\xfd\x6d\x22\x5e\xc2\x73\x67\x6e\xb2\x52\x75\xcd\x64\xfe\x25\x98\xbd\x37\xb8\x04\x80\x90\x70\xb1\x30\x7e\xf7\x82\xf9\xed\x0b\xee\xf6\x2f\x46\x90\x84\x71\x30\xdb\x56\x4a\xdb\x25\x84\x77\x23\x90\xbe\x09\x16\xb4\xf5\xad\x92\xe5\x12\xc2\x77\xc8\x72\x03\xae\x4a\xd4\xb4\xc3\x65\xee\x1e\x29\xef\x72\x60\xd6\x62\xdd\x90\x64\x05\xf7\xa8\x79\x71\x00\x6e\x81\x95\x8c\x4b\x63\x7d\x61\xbb\x5d\x03\x29\x8a\xfa\x7b\x03\x21\xfc\x77\x30\x9b\x85\x0e\xcb\x23\x82\x63\x68\x0d\x25\x0e\xa3\x3a\xa6\xf3\x05\xc1\xf8\xe0\xf1\x4e\x89\x88\x35\x4a\x9f\x3f\x09\x69\x75\xa5\x4b\xb3\x04\xef\x97\xbf\xb3\x07\x5e\xb7\xf5\x0d\x3d\x8b\x2e\xe6\x71\x30\x7b\xd7\xca\x25\x40\xcd\xb8\x8c\x83\xaf\x81\x73\x75\x14\xcc\x9c\xbe\xb7\xcc\x56\x30\xfe\x51\x05\x91\x65\x30\x63\x6d\xce\x91\x8a\xe4\xd3\x57\x5c\xae\x44\x6b\xec\xd4\x3b\x3b\xa5\x04\x81\xa0\x68\x65\x06\x5c\x72\x1b\xcd\xe1\x4b\x30\x2b\x0c\x2c\x5f\x7e\x53\x4c\x93\x37\x82\x95\x26\x9a\xd3\x9e\x64\xeb\x0e\xfa\xc0\x74\xf4\x7c\xd4\x30\x86\xd0\xfd\x5e\x34\xcc\x56\x61\x0c\x21\xfd\x3b\xd5\xad\x02\x8d\x2c\x87\x3e\xea\xd0\x47\xbd\x0f\x46\xa1\x55\x9d\x84\x4f\xe4\x0e\xe6\xc5\x10\x0e\x3f\x07\xa1\x57\x83\xe5\x56\x41\x56\x61\xb6\xa7\x5a\xaa\x31\x43\x7e\x3f\x84\x78\x10\xf8\x4a\x29\xe1\xc4\x3d\x75\x49\x0c\x21\x97\x8b\xcc\x3f\x9d\x42\x0f\x0a\x26\x0c\xc6\x14\xee\xb5\xcc\x44\x9b\xa3\x87\xdf\x71\x35\xec\x90\x69\x2a\x87\xce\x00\x2e\x5d\xd7\x40\x63\xa1\x42\x96\xa3\x36\x09\x84\x84\x96\x59\xf8\xde\x20\x74\x15\x4a\xb8\x67\x82\xe7\xcc\x3a\xb0\xf4\x10\x3b\x81\xd7\x99\xf2\x18\x0f\x42\x7c\x99\xec\x1b\x13\x50\xbd\x40\x69\x79\xd6\x03\x6b\x4e\x68\x71\x51\x25\xec\x44\x59\x9d\xc3\x8b\x93\xdc\x8b\x81\xe9\xd2\xc0\x3f\xfe\xe5\xd1\xe1\xc2\x9e\xd9\x87\x18\x50\x6b\x0a\x3e\xf5\xd8\x0d\x75\xf8\xcb\x95\xab\x19\x51\x5f\x33\x93\x57\x2c\xdb\x97\x5a\xb5\x32\x8f\xe6\xf3\x60\xc6\x0b\xb7\xe3\xbb\x97\x20\xb9\x20\x21\x33\xa1\xca\xe4\x0d\xb3\x4c\x44\xa8\xf5\x3c\x98\x7d\x0d\x82\x99\x66\xdd\x28\xb9\x44\xeb\x3c\x14\x7d\xe3\x6e\xf7\xe8\x56\x73\x69\xa3\x70\xf3\xcb\x12\x7e\x52\x3d\x46\x28\x98\x56\xed\x47\xc1\x9f\x3b\x9b\xdc\x32\x6d\x70\xcb\x4b\x89\x79\xa4\x59\xf7\xad\x47\x50\x5e\xb5\xd2\xb0\x02\x57\x82\xf1\xda\x40\xe6\x2e\xe3\xee\xe5\x4b\x3a\x32\x79\x3f\x59\xf2\x91\xdb\x4a\xb5\xf6\x03\x15\x89\xde\xed\xd1\xf3\xa9\x8c\xf9\x8f\x7f\xc6\xb6\xc2\x1b\x57\x2a\x0b\xbe\xec\xc1\x33\x13\xc6\x27\x4a\x25\x3e\xf7\xe6\xa7\xbb\xde\xb4\x42\xc4\xc4\x9c\x16\x3d\x9a\x30\xef\xb5\x5f\xc2\x3f\xe5\xb3\xff\xba\x7f\x24\x65\x1e\x38\xab\xfa\xf6\x95\xfc\xb4\xd9\x6c\xe1\xe5\x4b\x08\x3b\x2e\x73\xd5\x99\xd0\x69\x7a\x34\x1b\xa5\x69\x35\x7e\xf4\x2f\xaf\x6f\xb6\x57\xf7\x8c\x0b\xb6\xe3\x82\xdb\x43\x74\x4e\xbb\x27\x56\x3f\x31\x9b\xec\x26\x50\x70\x63\xc6\xd8\x51\x7f\x4c\x6e\xb0\xbb\xd5\xea\x9e\xe7\xa8\x23\x87\xc5\xf3\xd6\xff\x39\xd0\xf4\x8e\x5d\x29\x69\xac\x6e\x33\x72\x8f\x2b\xc5\x4d\x7f\x92\xe3\x40\x83\xcb\x1f\x3b\x6b\x3c\x94\x20\x22\x78\x7e\x37\x81\x1b\x37\x26\xf1\xd1\x47\x1d\x3d\x77\x06\xac\x94\x2c\x78\xf9\xc5\x67\xcc\xfa\x7a\x09\x43\x8d\xfa\x3a\xf7\x4b\x0f\xde\xae\x3f\x81\xcc\x47\xe0\xff\x30\xc6\xd8\xf0\x52\xba\xd6\x46\x65\xee\x6f\x1f\xef\x42\xaf\xa4\x86\x3f\x44\xf1\x60\x45\xe2\x57\x44\xcf\xff\x53\xbc\x1e\x73\xd1\x89\xec\x8f\x72\x65\xdb\x67\xe7\x77\xe1\x59\xa0\xfe\x3e\x48\xa7\xaa\x50\xf5\xb2\x87\x06\x61\xdf\xee\xf0\x86\xd5\x08\x3e\x78\xa4\xd6\x70\x4b\x55\xf3\xd3\x67\xa3\xe4\x32\x94\xac\xc6\xf0\x53\x30\x7b\xbf\xbe\x86\x47\xaf\x5a\x9e\x87\x9f\x4e\xc4\xf5\xbe\x39\x15\x68\x1a\x36\xf4\xcc\x7e\x3f\x4c\x85\xbb\xd7\x74\xc2\x69\x33\x3c\xaa\xd7\xaf\xed\x7b\x59\xdf\xca\x26\x07\x67\x8f\x0f\xa5\x62\xe5\x35\x09\x82\xd9\x64\xa8\x9a\x68\xd8\xcb\xdc\x8f\x2f\x13\xae\xbc\x48\x57\xd8\xa3\x3d\xbc\xf0\x62\xe7\xe0\x3b\x64\x34\x1f\x94\xff\x12\xcc\x34\xda\x56\x4b\x28\x6a\x9b\x6c\x9b\x3e\x04\xcf\x4c\xfa\xcc\x38\xc0\xbb\xe2\xb2\x4f\x8e\x07\x27\xa3\x17\x1e\x3d\x3f\xb5\xd8\x2d\xa3\x15\x43\xb7\x3d\x36\x9a\x63\x5d\x87\xc8\xab\xe1\x52\x45\x69\xd7\x5b\x76\xc7\xbc\x71\x3c\x3b\x21\x1a\xf6\x86\x0b\x8c\x46\xaa\x30\x1f\x95\xf6\xdb\xa3\xdd\xdc\x6d\xa2\x13\xd2\xf4\x49\x47\x02\xbf\xd8\xb8\x69\xcf\xf5\x26\xb0\x15\xa3\x59\xb1\xef\xce\x4c\xc2\xcf\x77\x77\xb7\xe0\x97\xc7\xc7\x61\x85\xa4\x79\x86\x9d\xd0\x82\x5e\xdc\x1e\x0f\x09\xac\x0b\x80\xc5\xe2\x1c\x03\x20\x02\x6c\x75\x8b\xb1\xeb\xfa\x9e\x48\x43\xc7\x85\x20\x69\x7e\x68\x3d\x99\x8e\xd7\x03\xb5\xf0\x45\x21\x81\x0d\x4d\x65\x1d\xa7\x91\xcf\x6f\xa4\x5d\xb4\x99\x86\x8b\xe4\x1a\x0b\xd6\x0a\x7b\xa7\x99\x34\x34\xa7\x24\xf4\x86\x06\xee\x4f\x54\x59\x3e\x81\xe0\x3b\xcd\xf4\x01\x34\xd2\xac\xd6\x53\xdf\xa7\x46\x0c\x9e\xd8\xe3\xe1\x47\xe0\x05\x1d\xc5\x0d\x18\xb4\xf1\x30\x45\x0d\x82\x06\x0d\xdc\xc3\xbe\x18\xe6\x5e\x97\xc1\xbf\xcc\xcd\x91\xb6\x62\xd2\x2d\xca\xbd\x8a\x24\xc8\xf9\xd5\xfb\xa0\x57\x94\x1b\x60\x42\xa8\x8e\xa6\x04\x62\x60\xbe\x6f\x0c\x14\xc8\x10\x3a\x40\xab\xd6\xb3\xed\x47\x44\x9a\x10\x49\x52\xce\x3b\x3e\xf6\x5c\x3d\x1b\x0d\x2c\x78\xd9\xd2\x2c\x3e\x7e\x06\x60\x4d\xa3\x55\xa3\x39\xb3\x08\xab\xab\xc4\xc3\xf1\x77\x09\xcc\xca\x5f\xe7\xf0\xf8\xc9\x14\xae\x64\xd3\xe6\x7a\x13\xd5\x96\xb5\x05\xca\xf9\x12\xb6\xaa\xc6\x9c\x1d\x62\xa8\xdd\x07\x91\x8e\x39\xaa\x0a\x59\xc5\x64\xd9\x7f\xb1\x30\xca\x23\xb0\x43\xc8\xc8\x67\x68\xac\x97\xe4\x10\xae\xd5\x67\xcc\x88\x26\x78\xc5\x99\x74\x1e\x18\xf9\xba\x41\x3b\x78\x06\x1f\x2c\x6a\xc9\xc4\xb1\x47\xd1\x0e\x27\x6a\xf4\xe7\xc0\x17\xc7\xb5\xc7\x01\x3a\xe2\xb2\x1f\xa2\x33\x46\x4c\x13\xbf\x27\x92\x2d\x73\x27\x80\x41\xce\x8b\x02\x35\x8e\x4c\xdb\x6b\x03\x52\xc9\xc5\x04\xbe\x83\x5e\xf3\x24\x70\xfb\x5e\x1d\x86\xf8\xc7\x23\x6a\xfa\x07\x0e\x34\x60\x07\xe4\x1e\xe3\x62\x0e\xc6\x62\x0d\x5a\x29\x0b\xbb\x56\xe6\x82\xe8\x73\x9a\x82\xe1\x64\x30\xb7\xdf\x9b\x73\x0c\xf8\xc4\x03\x5c\x5a\xa7\x51\x12\xcc\xb4\xa5\xea\x71\x36\x59\x5c\x87\x3b\x33\xde\x50\x13\x4b\x53\x4a\xea\x09\x4b\x9f\x00\x8b\x38\xf3\x68\xcd\x64\x89\x07\x19\xc5\xd3\x87\xd2\x8b\x99\x70\xec\xc9\x37\xa8\x23\x8c\x93\x60\x36\xcb\x8a\x72\x2c\x74\x34\x62\x27\x8f\xca\x00\x91\xde\x33\x8d\x7f\x28\x7c\x92\x0b\x5f\xf2\x1c\x49\x9a\x69\x8f\x49\xe8\x65\x8d\xf6\xbe\x51\x3a\xca\x8a\xf2\x1b\x64\x51\xf9\x7f\x4d\xa8\x2e\xa2\x30\x53\xad\xc8\xdd\x37\xb6\x3e\x19\x65\x6e\x35\x6f\x1a\xd4\x4b\xcf\x7c\x4e\xe9\x59\x66\x1f\xc8\x8a\x21\x49\x88\xef\x7e\x60\xa2\xc5\xb3\x93\x00\xcd\x45\x4f\xaa\x51\x0c\xcf\x27\xf5\xc4\xe9\x36\x9a\xb0\x04\x6d\x69\xd3\xd7\x63\xd5\x77\xd4\x48\x72\xd1\xd7\xfb\xeb\x9b\xad\x4b\xa3\x1d\x02\xf3\xa4\x53\x20\x18\x55\x23\xf1\x56\x60\x85\xed\xbf\x3c\x91\x3a\x8c\x4b\xd4\x60\x2c\xd3\xd6\x40\xde\xe2\x90\x49\x1d\x3b\x90\x28\x89\xb6\x53\x7a\x4f\x28\xf3\xd5\x10\xda\xc6\xb5\xc1\x9e\xd7\x82\x54\xd4\x30\x5c\x4c\x73\x95\xed\x51\x9b\x8a\xd7\xc0\xcc\xa3\x03\x06\xd2\x4c\x32\xd7\xd2\x27\x3d\xe5\x58\x4c\x38\x31\x95\xf3\x6f\xcd\xf6\x08\xae\xf6\x75\xe8\xbe\x62\x39\xbd\xdd\xb0\x6b\x94\xb8\xef\xb1\xe6\xf9\xe6\x0e\x0b\xa5\x5d\x0f\xe0\xf2\x5e\x39\xfd\x1e\x13\x61\x77\xd6\x16\xd1\x01\xdf\x2c\xd3\x74\xf2\x05\xe9\xc8\x0c\xa6\x3f\x9d\x6c\x93\xfe\xf0\xc3\xff\xfd\xe5\xc2\x19\x59\x2b\x4d\xb9\x6a\x19\x17\xa6\x2f\x8e\x7f\xc8\xea\x7b\xe5\x86\xc1\xd0\x15\x45\x42\xd6\x48\xe6\x84\x8c\xc2\xd7\x24\x81\x14\x1e\x5c\x48\xe1\x62\x13\x31\x8e\x8f\xb6\x63\x32\xb4\x5a\xf8\xe1\xac\x17\x7f\x96\xff\xf6\x40\x70\x09\xe0\xc6\x46\x7f\xdf\x31\x6e\x93\x5b\x25\xc4\xba\xae\x31\xa7\x32\x1f\xfd\xff\x0b\x17\x88\x2d\x66\x8a\x66\xd9\xcb\x8b\xd3\x7b\x32\x92\x78\xc8\x4e\x29\x31\x2d\xeb\x33\xde\x1c\x67\x0e\x2a\x2b\x6f\x95\xda\xb7\xcd\xcf\xca\xd8\xa8\x4d\xe8\xf2\x3b\x39\x35\xb5\xbd\x4f\x93\x91\x61\xb9\xef\x02\x0e\xb8\x3e\x6b\x1f\x8f\x1e\xef\x7c\xe0\x73\x70\x1f\xcd\x9e\x99\x3e\xdb\xfc\x79\x31\xf0\xc6\xcc\x8f\xb6\x7b\x8a\xe1\x84\x7d\x25\x6e\xf5\xef\x00\x00\x00\xff\xff\x0a\x7c\xbf\x0d\x86\x17\x00\x00") func testImagesAgnhostOpenidmetadataOpenidmetadataGoBytes() ([]byte, error) { return bindataRead( @@ -4021,7 +4097,7 @@ func testImagesApparmorLoaderBaseimage() (*asset, error) { return a, nil } -var _testImagesApparmorLoaderDockerfile = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x64\x93\x41\x73\xab\x36\x14\x85\xf7\xfa\x15\x67\xa0\x8b\x76\xc6\x40\xea\x45\x17\xed\x74\xc1\xb3\xfd\xde\x63\x5e\x0c\x29\xd8\xcd\x78\x3a\x99\x8c\x8c\xae\x41\x53\x59\x52\x24\x11\xe2\x7f\xdf\x01\x27\x69\xd3\xc7\x8a\xcb\x3d\x1c\xbe\x7b\x0f\x8a\xb1\x32\xf6\xe2\x64\xd7\x07\x2c\x6f\x7e\xfe\x05\xbb\x9e\xf0\x6d\x38\x92\xd3\x14\xc8\x23\x1f\x42\x6f\x9c\x4f\x59\xcc\x62\xdc\xca\x96\xb4\x27\x81\x41\x0b\x72\x08\x3d\x21\xb7\xbc\xed\xe9\xad\xb3\xc0\x9f\xe4\xbc\x34\x1a\xcb\xf4\x06\x3f\x4e\x82\xe8\xb5\x15\xfd\xf4\x1b\x8b\x71\x31\x03\xce\xfc\x02\x6d\x02\x06\x4f\x08\xbd\xf4\x38\x49\x45\xa0\x97\x96\x6c\x80\xd4\x68\xcd\xd9\x2a\xc9\x75\x4b\x18\x65\xe8\xe7\xcf\xbc\x9a\xa4\x2c\xc6\xe1\xd5\xc2\x1c\x03\x97\x1a\x1c\xad\xb1\x17\x98\xd3\x7f\x75\xe0\x61\x06\x9e\xae\x3e\x04\xfb\x6b\x96\x8d\xe3\x98\xf2\x19\x36\x35\xae\xcb\xd4\x55\xe8\xb3\xdb\x62\xb5\x29\x9b\x4d\xb2\x4c\x6f\xe6\x57\xf6\x5a\x91\xf7\x70\xf4\x34\x48\x47\x02\xc7\x0b\xb8\xb5\x4a\xb6\xfc\xa8\x08\x8a\x8f\x30\x0e\xbc\x73\x44\x02\xc1\x4c\xbc\xa3\x93\x41\xea\x6e\x01\x6f\x4e\x61\xe4\x8e\x58\x0c\x21\x7d\x70\xf2\x38\x84\x0f\xcb\x7a\xa3\x93\xfe\x83\xc0\x68\x70\x8d\x28\x6f\x50\x34\x11\x3e\xe5\x4d\xd1\x2c\x58\x8c\xfb\x62\xf7\xb5\xda\xef\x70\x9f\xd7\x75\x5e\xee\x8a\x4d\x83\xaa\xc6\xaa\x2a\xd7\xc5\xae\xa8\xca\x06\xd5\x67\xe4\xe5\x01\xdf\x8a\x72\xbd\x00\xc9\xd0\x93\x03\xbd\x58\x37\xf1\x1b\x07\x39\xad\x91\xc4\xb4\xb3\x86\xe8\x03\xc0\xc9\x5c\x81\xbc\xa5\x56\x9e\x64\x0b\xc5\x75\x37\xf0\x8e\xd0\x99\x67\x72\x5a\xea\x0e\x96\xdc\x59\xfa\x29\x4c\x0f\xae\x05\x8b\xa1\xe4\x59\x06\x1e\xe6\x27\xdf\x0d\x95\x32\x96\xd7\x5f\x26\xfa\x4d\xb1\xcd\xbf\x6c\xd8\xe7\xba\xda\xe2\x87\x7f\x6b\xb6\xaa\xab\xa6\x79\xfc\xb4\x2f\x6e\xd7\x8f\xab\xea\xee\x80\x27\x3a\x0f\xc9\x1f\x9b\xed\x3e\xaf\x57\x5f\x13\x3f\x59\xb7\xc8\x06\xef\xb2\xa3\xd4\x19\x63\xf5\xbe\x04\xb7\x7f\x83\x0b\x31\x65\xc0\xdd\xd9\x38\x28\x79\x7c\xbf\x4f\x92\xc1\x0a\x1e\x28\x69\xe7\x9f\x30\x49\x1c\x59\xe3\x65\x30\xee\xf2\x16\xbb\x50\x49\x2b\x74\xca\x95\x95\x9a\x94\xd4\xc3\xcb\x1c\xff\xb5\xce\x48\x74\x94\x05\xf2\x53\x7e\x19\x92\x84\x2b\x65\xc6\x64\xd0\xc1\x0d\x3e\x90\x60\x2c\x5f\xaf\xa1\x0c\x9f\x66\x7d\x07\xbb\xd6\x8c\x6d\xca\x5d\x7d\xb8\xab\x8a\x72\x87\xbf\xa2\xff\x75\xa3\x05\xa2\x44\x99\x2e\x18\x1f\x04\xb9\x6b\xfd\xfc\xfb\x32\x7a\x60\x2c\xc6\x9a\x4e\x7c\x50\x01\x42\x3a\x6a\x67\xda\x60\x30\xf2\xd0\xf6\x29\x5b\x6d\xd7\x93\x9d\x75\x66\x3a\x16\x3e\x7a\x60\xff\x04\x00\x00\xff\xff\x50\x23\xa2\xf6\xa3\x03\x00\x00") +var _testImagesApparmorLoaderDockerfile = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x9c\x93\x5f\x8f\x9b\x46\x14\xc5\xdf\xe7\x53\x1c\x41\x15\xb5\x92\x81\x5d\x3f\xf4\xa1\x55\x2b\x11\xdb\x49\x50\x76\x21\x05\xbb\xd1\xaa\x89\xa2\x31\x5c\xc3\xa8\xc3\x0c\x99\x3f\x61\xfd\xed\xab\xc1\xeb\x6d\xb7\x7d\x2b\x4f\x5c\xee\xe5\xde\xdf\x3d\x67\x26\xc6\x46\x4f\x67\x23\xfa\xc1\x61\x7d\x73\xfb\x23\xf6\x03\xe1\xbd\x3f\x92\x51\xe4\xc8\x22\xf7\x6e\xd0\xc6\xa6\x2c\x66\x31\xee\x44\x4b\xca\x52\x07\xaf\x3a\x32\x70\x03\x21\x9f\x78\x3b\xd0\x35\xb3\xc2\xef\x64\xac\xd0\x0a\xeb\xf4\x06\xdf\x87\x82\xe8\x29\x15\xfd\xf0\x33\x8b\x71\xd6\x1e\x23\x3f\x43\x69\x07\x6f\x09\x6e\x10\x16\x27\x21\x09\xf4\xd8\xd2\xe4\x20\x14\x5a\x3d\x4e\x52\x70\xd5\x12\x66\xe1\x86\x65\xcc\x53\x93\x94\xc5\x78\x78\x6a\xa1\x8f\x8e\x0b\x05\x8e\x56\x4f\x67\xe8\xd3\x3f\xeb\xc0\xdd\x02\x1c\x9e\xc1\xb9\xe9\xa7\x2c\x9b\xe7\x39\xe5\x0b\x6c\xaa\x4d\x9f\xc9\x4b\xa1\xcd\xee\x8a\xcd\xae\x6c\x76\xc9\x3a\xbd\x59\x7e\x39\x28\x49\xd6\xc2\xd0\x57\x2f\x0c\x75\x38\x9e\xc1\xa7\x49\x8a\x96\x1f\x25\x41\xf2\x19\xda\x80\xf7\x86\xa8\x83\xd3\x81\x77\x36\xc2\x09\xd5\xaf\x60\xf5\xc9\xcd\xdc\x10\x8b\xd1\x09\xeb\x8c\x38\x7a\xf7\x42\xac\x2b\x9d\xb0\x2f\x0a\xb4\x02\x57\x88\xf2\x06\x45\x13\xe1\x75\xde\x14\xcd\x8a\xc5\xf8\x58\xec\xdf\x55\x87\x3d\x3e\xe6\x75\x9d\x97\xfb\x62\xd7\xa0\xaa\xb1\xa9\xca\x6d\xb1\x2f\xaa\xb2\x41\xf5\x06\x79\xf9\x80\xf7\x45\xb9\x5d\x81\x84\x1b\xc8\x80\x1e\x27\x13\xf8\xb5\x81\x08\x32\x52\x17\x34\x6b\x88\x5e\x00\x9c\xf4\x05\xc8\x4e\xd4\x8a\x93\x68\x21\xb9\xea\x3d\xef\x09\xbd\xfe\x46\x46\x09\xd5\x63\x22\x33\x0a\x1b\xcc\xb4\xe0\xaa\x63\x31\xa4\x18\x85\xe3\x6e\xf9\xf2\x9f\xa5\x52\xc6\xf2\xfa\x6d\xa0\xdf\x15\xf7\xf9\xdb\x1d\x7b\x53\x57\xf7\xf8\xee\xef\x98\x6d\xea\xaa\x69\xbe\xbc\x3e\x14\x77\xdb\x2f\x9b\xea\xc3\x03\xbe\xd2\xe8\x93\xdf\x76\xf7\x87\xbc\xde\xbc\x4b\x6c\x68\xdd\x22\xf3\xd6\x64\x47\xa1\x32\xc6\xea\x43\x09\x3e\xfd\x09\xde\x75\xc1\x03\x6e\x46\x6d\x20\xc5\xf1\xf9\x3d\x49\xfc\xd4\x71\x47\x49\xbb\x1c\xc2\x24\x31\x34\x69\x2b\x9c\x36\xe7\xab\xed\x9d\x4c\xda\x4e\xa5\x5c\x4e\x42\x91\x14\xca\x3f\x2e\xf6\x5f\xe2\x8c\xba\x9e\x32\x47\x36\xf8\x97\x21\x49\xb8\x94\x7a\x4e\xbc\x72\xc6\xdb\xe0\xcc\xab\x57\xf8\xc4\xc2\x21\xba\x62\x24\x89\xd2\x4f\xd3\x46\x6f\xe5\xa7\x5f\x6f\xd3\xdb\x74\x7d\xf3\x7f\x47\x8f\x7c\x59\x34\xdf\x6e\x21\x35\x0f\x8a\x3e\xaf\x7f\x89\x19\xdb\x95\xfb\xfa\xe1\x43\x55\x94\x7b\xfc\x11\xfd\x2b\x1b\xad\x10\x25\x52\xf7\x4e\x5b\xd7\x91\xb9\xc4\xdf\x7e\x59\x47\x9f\x19\x8b\xb1\xa5\x13\xf7\xd2\xa1\x13\x86\xda\x05\xcc\x69\xcc\xdc\xb5\x43\xca\x36\xf7\xdb\xd0\x6e\x32\x3a\x5c\x3e\x1b\x7d\x66\x7f\x05\x00\x00\xff\xff\x14\x93\x7f\x08\x09\x04\x00\x00") func testImagesApparmorLoaderDockerfileBytes() ([]byte, error) { return bindataRead( @@ -4081,7 +4157,7 @@ func testImagesApparmorLoaderOwners() (*asset, error) { return a, nil } -var _testImagesApparmorLoaderVersion = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x32\xd4\x33\xe4\x02\x04\x00\x00\xff\xff\x9e\xc5\x88\x7d\x04\x00\x00\x00") +var _testImagesApparmorLoaderVersion = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x32\xd4\x33\xe6\x02\x04\x00\x00\xff\xff\x1c\xa7\xbe\x4f\x04\x00\x00\x00") func testImagesApparmorLoaderVersionBytes() ([]byte, error) { return bindataRead( @@ -4201,7 +4277,7 @@ func testImagesApparmorLoaderLoaderGo() (*asset, error) { return a, nil } -var _testImagesBusyboxBaseimage = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x2a\xcf\xcc\x4b\xc9\x2f\x2f\xd6\x4f\xcc\x4d\x31\x33\xd1\x37\xb4\x30\xb0\xb4\xcd\x4d\x2e\xd2\xcb\xcd\x4c\x2e\xca\x2f\xce\x4f\x2b\xd1\x4b\xce\xcf\xd5\x87\x29\xca\x4b\xcc\xcb\x2f\x4e\x2d\x2a\x4b\x2d\xb2\x02\xa9\xe4\x42\xd3\x6c\x69\x60\x4c\xa4\x66\x4b\x03\x63\x4c\xcd\xc4\xda\x6c\x69\x60\xc9\x05\x08\x00\x00\xff\xff\x9a\x3b\xd1\x02\xb7\x00\x00\x00") +var _testImagesBusyboxBaseimage = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x8e\x3d\x0e\x83\x30\x0c\x85\x77\x0e\x43\x42\x12\x45\x04\xc9\x3b\xd7\x80\x40\x25\x24\x1c\x23\xa7\xfc\xf4\xf6\x15\x94\x0e\x2d\x0c\x59\x9e\x87\xf7\x7d\x7a\x1e\x87\x30\x6f\xa2\xc1\xce\x1a\x68\xe7\xf8\x6a\x69\xab\x8a\x5c\xb9\xec\x2c\x18\xa1\x61\xd4\x6a\xb1\xe2\xbe\xb6\x06\x8e\x5c\xca\x3b\x60\x9a\xbc\x35\x63\x0f\xe7\xbd\x43\xa2\x76\x72\x83\x23\x7f\xeb\x75\x08\x1d\xad\xf1\xf3\x9c\x28\x4a\xe9\x00\x3d\xe7\x38\x78\xa6\x48\x8f\x67\xee\x09\xc5\x17\x0a\x4d\xa0\xd8\xf3\xd2\x73\xb5\x93\xff\xb2\x93\x3a\x51\x76\x52\x5f\xe5\xd4\x65\x77\x59\x56\x52\x9a\x34\x79\x27\x2f\x72\xad\x52\xe5\x5a\x65\xef\x00\x00\x00\xff\xff\x87\x91\x5f\xb8\xcc\x01\x00\x00") func testImagesBusyboxBaseimageBytes() ([]byte, error) { return bindataRead( @@ -4221,7 +4297,27 @@ func testImagesBusyboxBaseimage() (*asset, error) { return a, nil } -var _testImagesBusyboxDockerfile_windows = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xbc\x56\x5f\x73\xda\xb8\x17\x7d\xf7\xa7\x38\x03\xbf\xce\xaf\x9d\x01\x3b\x4b\x3b\xd9\xd9\x74\xfa\xe0\x25\xa4\x65\x9a\x00\x83\x49\x3b\x99\xd2\x07\x21\x5f\xb0\x26\xb2\xe4\x95\x64\x1c\xbe\xfd\x8e\x64\x20\x61\xca\x76\x77\x5f\x36\x0f\x8e\x2d\xdd\x7f\x3a\xe7\x9e\x2b\xba\x18\xea\x6a\x67\xc4\xa6\x70\x18\x5c\x0c\x2e\xb0\x28\x08\x9f\xeb\x15\x19\x45\x8e\x2c\xd2\xda\x15\xda\xd8\x38\xea\x46\x5d\xdc\x0a\x4e\xca\x52\x8e\x5a\xe5\x64\xe0\x0a\x42\x5a\x31\x5e\xd0\x61\xa7\x87\x2f\x64\xac\xd0\x0a\x83\xf8\x02\xaf\xbd\x41\x67\xbf\xd5\x79\xf3\x3e\xea\x62\xa7\x6b\x94\x6c\x07\xa5\x1d\x6a\x4b\x70\x85\xb0\x58\x0b\x49\xa0\x27\x4e\x95\x83\x50\xe0\xba\xac\xa4\x60\x8a\x13\x1a\xe1\x8a\x90\x66\x1f\x24\x8e\xba\x78\xd8\x87\xd0\x2b\xc7\x84\x02\x03\xd7\xd5\x0e\x7a\xfd\xd2\x0e\xcc\x85\x82\xfd\x5f\xe1\x5c\x75\x95\x24\x4d\xd3\xc4\x2c\x14\x1b\x6b\xb3\x49\x64\x6b\x68\x93\xdb\xf1\x70\x34\xc9\x46\xfd\x41\x7c\x11\x5c\xee\x95\x24\x6b\x61\xe8\x8f\x5a\x18\xca\xb1\xda\x81\x55\x95\x14\x9c\xad\x24\x41\xb2\x06\xda\x80\x6d\x0c\x51\x0e\xa7\x7d\xbd\x8d\x11\x4e\xa8\x4d\x0f\x56\xaf\x5d\xc3\x0c\x45\x5d\xe4\xc2\x3a\x23\x56\xb5\x3b\x01\xeb\x50\x9d\xb0\x27\x06\x5a\x81\x29\x74\xd2\x0c\xe3\xac\x83\xdf\xd3\x6c\x9c\xf5\xa2\x2e\xbe\x8e\x17\x9f\xa6\xf7\x0b\x7c\x4d\xe7\xf3\x74\xb2\x18\x8f\x32\x4c\xe7\x18\x4e\x27\xd7\xe3\xc5\x78\x3a\xc9\x30\xbd\x41\x3a\x79\xc0\xe7\xf1\xe4\xba\x07\x12\xae\x20\x03\x7a\xaa\x8c\xaf\x5f\x1b\x08\x0f\x23\xe5\x1e\xb3\x8c\xe8\xa4\x80\xb5\x6e\x0b\xb2\x15\x71\xb1\x16\x1c\x92\xa9\x4d\xcd\x36\x84\x8d\xde\x92\x51\x42\x6d\x50\x91\x29\x85\xf5\x64\x5a\x30\x95\x47\x5d\x48\x51\x0a\xc7\x5c\x58\xf9\xe1\x50\x71\x14\xa5\xf3\x8f\xbe\xfa\xd1\xf8\x2e\xfd\x38\x0a\x5f\xf3\xd1\xc7\x71\xb6\x98\x3f\x44\xfe\x38\xf4\x7f\x43\xa8\xad\x8f\xcd\x70\x2b\x54\xfd\x04\x51\xfa\x9c\x4e\xa3\x56\x15\xe3\x8f\x21\x1e\x33\xbc\x10\x5b\xea\xf9\x0f\x85\x26\x78\x79\x8a\xbd\x9f\x70\xf0\xf5\x79\x8f\xaf\x42\xe5\xba\xb1\x71\x74\x33\x9f\xde\xa1\xdf\xaf\x24\x73\x6b\x6d\xca\x0f\xd2\x47\x4e\x58\x99\x5f\xbe\x03\x93\x95\x50\x74\xf5\x36\xbe\x04\xb3\xa8\x0c\x55\x51\x34\xbf\x9f\xa0\x7c\xcc\x85\x41\xe2\xca\xaa\x9f\x0b\x13\xb5\x31\x68\x40\x8e\x58\x99\xac\x6a\xbb\x5b\xe9\xa7\x7e\x41\xb2\x22\x73\xf5\x4b\x3c\xf8\x2d\xbe\xf0\xfe\xa7\x1b\xa7\x4e\x95\x6e\xc8\xd8\x82\xa4\x3c\xf8\x5d\xc6\x83\xf8\xd7\x90\xd6\x9e\x78\xfc\xef\x19\xa2\x68\x38\x9d\x3d\xa0\xdf\x5f\x1b\x5d\x7e\xf0\xd5\x1d\x4b\x0a\x2f\x27\xdb\xa7\xc9\x91\xac\x84\x0a\x0f\x0f\xed\x64\xba\x18\xbd\xe6\x92\xd5\xb9\xa8\x57\x6f\xae\x70\xaf\xd6\xda\xb8\x5a\x31\x47\x72\xd7\x43\xae\xf9\x23\x19\xac\x6a\x21\xf3\x27\x14\xcc\xc2\xea\xd2\x77\xa1\xad\xc9\x1e\xb1\x0d\xc0\xee\x51\x85\xdd\x95\x52\xa8\x47\xaf\x7b\x74\x6e\x84\x24\x9b\x74\x7c\xdb\x32\xd9\xb0\x5d\x8b\x24\xa9\xbc\x95\x40\x68\xa4\xd6\x1e\x8e\x99\x0d\xb9\x38\x4c\x91\x43\x0c\x6f\x50\x5a\x92\x5b\xb2\x60\x86\x60\x48\x32\x27\xb6\x84\x8a\xb9\xc2\xfa\x4e\xb7\xba\xe7\x85\xa4\x4d\xde\x72\x5b\xb2\x47\x0a\xe3\xa1\x55\x75\xd9\x43\x43\xe0\x4c\xc1\xfa\x9e\xde\x81\xe5\x39\xd8\x81\x0e\xac\x84\x62\x66\xe7\xfd\x86\x57\xcb\x95\x50\xcb\x50\xef\x72\xbf\x1d\xd3\x13\xc5\x7f\x87\x64\xf2\xc2\xb8\x5d\x68\xcf\xfc\x53\x3f\x5e\x1b\xd9\x3e\x7f\x6a\xa6\xc8\x71\xe6\x12\xc5\x2f\xdf\x3d\x87\x57\xdc\xbf\x7b\xee\x84\xe2\xb2\xce\x09\xcf\x0d\xe4\xd5\x06\xe1\x2c\xee\x74\x5e\x4b\x02\x53\x4c\xee\xac\xb0\xe0\x61\x7a\x9d\x36\xcd\xa1\xb7\xf0\xad\x93\xcc\x7c\x88\xcc\x87\xe8\xf4\xd0\x49\x66\x46\x6f\x0c\x2b\xd1\x1e\xe5\xc5\xe6\xf7\x73\x3d\x73\x73\x18\x09\xac\xf4\x14\x31\xab\x15\x4a\x52\x5e\xed\x94\x83\xad\xb4\x97\x64\x43\x28\xd8\x36\x28\x36\x4c\xdd\xaa\xb1\x45\x38\x94\xd3\xfb\x34\x87\x95\x7f\x52\xe5\xd1\xf8\xa7\xe5\xee\xa9\xe8\x7c\xff\x8b\x90\xc9\xbd\x25\x63\x93\xa1\x56\xfe\x3e\x20\x93\xe6\xa5\x50\x7e\xba\x32\xa7\x4d\x92\x56\xd5\x35\x73\x2c\xb9\xd5\x9c\xc9\xe4\x4e\x70\xa3\xfd\x98\x4e\xf6\x8d\xfe\x32\x4f\x2b\x93\xa4\x45\x3d\xdd\x83\x3e\x0c\xd7\xdb\x7f\x90\x23\x8a\xd2\xeb\x6b\x14\xda\x3a\xe5\x19\x08\x5d\x72\xf8\x6a\x7b\xe5\x3e\x1b\xcd\x71\xbe\x84\x73\x84\x9e\xaa\xde\x92\x0b\x42\xc4\x2c\x5d\x7c\x02\xa9\x2d\xb6\xcc\x88\x70\xa7\x39\x7d\x98\xc7\x7d\x29\x1e\x5b\x8b\x1e\x9a\x42\xf0\xc2\x4b\xde\x5f\xd5\x39\x59\x61\xbc\x71\x1c\x8d\x26\x5f\x82\xc5\x87\x4e\xab\xb6\xf7\xc3\xab\xa5\xd7\x80\xff\xbf\x3f\xf0\x32\xdb\x59\x47\xe5\xdb\xc1\x8b\x35\xff\x7a\xc2\xf0\xf2\x19\x95\xf7\x1d\x2c\x23\x7f\x55\xef\x0d\xc2\x7e\x88\x7f\xe2\x71\xb0\xea\xfa\xc3\x80\x61\x2d\x9e\x28\x87\xd4\x3c\x5c\x49\xc7\x3b\xed\xac\x6a\x82\xe3\xed\x74\x98\xde\xa6\xb3\xd9\x75\xba\x48\x43\xf8\xc0\xea\xf2\x3c\xa4\xcb\x3d\xab\xcb\xc0\xea\xb1\xc2\xec\x0c\x75\x33\xe6\x8a\x7f\x19\x6f\x79\xec\x92\x23\x68\xcf\x78\x2c\x5b\xea\x96\x67\x52\x3d\x63\x30\xf3\x3f\xb4\xac\xc3\xab\x59\x36\x9c\xce\x47\xaf\xe0\x89\x39\x72\xea\xc1\xa8\x2d\x19\x70\xad\xb6\xa4\x04\x29\x4e\xfb\x03\x78\xeb\x1f\xc1\x7d\x99\xfe\x28\xcb\x28\x1a\x4d\x16\xf3\x87\xd9\x74\x3c\x59\xe0\x5b\x87\x97\xf9\x51\xad\x36\x3c\x79\xe7\x7b\xf4\x67\x00\x00\x00\xff\xff\x96\x6e\xa1\x34\x42\x0a\x00\x00") +var _testImagesBusyboxDockerfile = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x64\x92\x51\x6f\x9b\x30\x14\x85\xdf\xfd\x2b\x8e\x60\xd2\x5a\x29\x25\x69\xde\xd6\x69\x0f\xb4\xa5\x1d\x6a\x0a\x52\xa0\xab\xfa\x34\x19\xb8\x81\x3b\x81\xed\xd9\xa6\x34\xff\x7e\x22\x69\xb5\x45\xf3\x9b\x7d\xcf\x3d\xf7\xf3\xb1\x43\xdc\x68\xb3\xb7\xdc\x76\x1e\xeb\xd5\x7a\x85\xb2\x23\x3c\x8c\x15\x59\x45\x9e\x1c\xe2\xd1\x77\xda\xba\x48\x84\x22\xc4\x86\x6b\x52\x8e\x1a\x8c\xaa\x21\x0b\xdf\x11\x62\x23\xeb\x8e\x3e\x2a\x0b\xfc\x20\xeb\x58\x2b\xac\xa3\x15\xce\x66\x41\xf0\x5e\x0a\xce\xbf\x8a\x10\x7b\x3d\x62\x90\x7b\x28\xed\x31\x3a\x82\xef\xd8\x61\xc7\x3d\x81\xde\x6a\x32\x1e\xac\x50\xeb\xc1\xf4\x2c\x55\x4d\x98\xd8\x77\x87\x31\xef\x26\x91\x08\xf1\xf2\x6e\xa1\x2b\x2f\x59\x41\xa2\xd6\x66\x0f\xbd\xfb\x57\x07\xe9\x0f\xc0\xf3\xea\xbc\x37\x57\xcb\xe5\x34\x4d\x91\x3c\xc0\x46\xda\xb6\xcb\xfe\x28\x74\xcb\x4d\x7a\x93\x64\x45\x72\xb1\x8e\x56\x87\x96\x27\xd5\x93\x73\xb0\xf4\x7b\x64\x4b\x0d\xaa\x3d\xa4\x31\x3d\xd7\xb2\xea\x09\xbd\x9c\xa0\x2d\x64\x6b\x89\x1a\x78\x3d\xf3\x4e\x96\x3d\xab\x76\x01\xa7\x77\x7e\x92\x96\x44\x88\x86\x9d\xb7\x5c\x8d\xfe\x24\xac\x0f\x3a\x76\x27\x02\xad\x20\x15\x82\xb8\x40\x5a\x04\xb8\x8e\x8b\xb4\x58\x88\x10\xcf\x69\xf9\x3d\x7f\x2a\xf1\x1c\x6f\xb7\x71\x56\xa6\x49\x81\x7c\x8b\x9b\x3c\xbb\x4d\xcb\x34\xcf\x0a\xe4\x77\x88\xb3\x17\x3c\xa4\xd9\xed\x02\xc4\xbe\x23\x0b\x7a\x33\x76\xe6\xd7\x16\x3c\xc7\x48\xcd\x9c\x59\x41\x74\x02\xb0\xd3\x47\x20\x67\xa8\xe6\x1d\xd7\xe8\xa5\x6a\x47\xd9\x12\x5a\xfd\x4a\x56\xb1\x6a\x61\xc8\x0e\xec\xe6\xc7\x74\x90\xaa\x11\x21\x7a\x1e\xd8\x4b\x7f\x38\xf9\xef\x52\x91\x10\x21\xb2\xbc\x4c\xce\xea\x5e\x8e\x0d\x8f\xd5\xf9\x15\x32\xad\x4d\x84\x67\xfa\x6c\x09\xbf\x46\xe7\x31\xb0\xb5\xda\xce\xf6\x73\x2b\x0f\xf3\x48\xaf\xe1\xbc\x6c\x59\xb5\x91\x88\xb7\xf7\x73\x00\x49\xfa\x18\xdf\x27\xe2\x6e\x9b\x3f\xe2\xd3\xdf\xbd\xd8\xc4\xd7\xc9\xe6\xd8\xf6\xf3\xf5\xf8\xd3\xbe\x05\x97\xd1\xfa\xcb\xc5\x65\x20\xfe\x04\x00\x00\xff\xff\xb0\x68\x88\xf3\xcb\x02\x00\x00") + +func testImagesBusyboxDockerfileBytes() ([]byte, error) { + return bindataRead( + _testImagesBusyboxDockerfile, + "test/images/busybox/Dockerfile", + ) +} + +func testImagesBusyboxDockerfile() (*asset, error) { + bytes, err := testImagesBusyboxDockerfileBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "test/images/busybox/Dockerfile", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _testImagesBusyboxDockerfile_windows = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xbc\x58\x5b\x6f\x1b\x37\xb0\x7e\xd7\xaf\x18\xc8\x69\x4f\x7b\xe0\xdd\xb5\x15\xc7\x45\x1c\xe4\x41\xb1\x95\x56\xa8\x63\x19\x92\xdd\x36\x88\x8a\x80\x22\x47\xbb\x84\xb8\x24\xcb\x8b\x2e\xfe\xf5\x07\xc3\x5d\xdd\x6a\x37\x68\x5f\x8e\x01\xef\x72\xc9\xe1\xc7\xe1\x37\x9c\x0b\x75\x02\xd7\xc6\x6e\x9c\x2c\xab\x00\xbd\xb3\xde\x39\x3c\x54\x08\xbf\xc6\x19\x3a\x8d\x01\x3d\xf4\x63\xa8\x8c\xf3\x79\xe7\xa4\x73\x02\xb7\x92\xa3\xf6\x28\x20\x6a\x81\x0e\x42\x85\xd0\xb7\x8c\x57\xb8\x1d\x39\x85\xdf\xd0\x79\x69\x34\xf4\xf2\x33\xf8\x81\x04\xba\xed\x50\xf7\xc7\x77\x9d\x13\xd8\x98\x08\x35\xdb\x80\x36\x01\xa2\x47\x08\x95\xf4\x30\x97\x0a\x01\xd7\x1c\x6d\x00\xa9\x81\x9b\xda\x2a\xc9\x34\x47\x58\xc9\x50\xa5\x65\x5a\x90\xbc\x73\x02\x9f\x5b\x08\x33\x0b\x4c\x6a\x60\xc0\x8d\xdd\x80\x99\x1f\xca\x01\x0b\x49\x61\xfa\xab\x42\xb0\x57\x45\xb1\x5a\xad\x72\x96\x94\xcd\x8d\x2b\x0b\xd5\x08\xfa\xe2\x76\x78\x3d\xb8\x9b\x0c\xb2\x5e\x7e\x96\xa6\x3c\x6a\x85\xde\x83\xc3\xbf\xa2\x74\x28\x60\xb6\x01\x66\xad\x92\x9c\xcd\x14\x82\x62\x2b\x30\x0e\x58\xe9\x10\x05\x04\x43\xfa\xae\x9c\x0c\x52\x97\xa7\xe0\xcd\x3c\xac\x98\xc3\xce\x09\x08\xe9\x83\x93\xb3\x18\x8e\xc8\xda\x6a\x27\xfd\x91\x80\xd1\xc0\x34\x74\xfb\x13\x18\x4e\xba\xf0\xa1\x3f\x19\x4e\x4e\x3b\x27\xf0\xfb\xf0\xe1\x97\xd1\xe3\x03\xfc\xde\x1f\x8f\xfb\x77\x0f\xc3\xc1\x04\x46\x63\xb8\x1e\xdd\xdd\x0c\x1f\x86\xa3\xbb\x09\x8c\x3e\x42\xff\xee\x33\xfc\x3a\xbc\xbb\x39\x05\x94\xa1\x42\x07\xb8\xb6\x8e\xf4\x37\x0e\x24\xd1\x88\x82\x38\x9b\x20\x1e\x29\x30\x37\x8d\x42\xde\x22\x97\x73\xc9\x41\x31\x5d\x46\x56\x22\x94\x66\x89\x4e\x4b\x5d\x82\x45\x57\x4b\x4f\xc6\xf4\xc0\xb4\xe8\x9c\x80\x92\xb5\x0c\x2c\xa4\x9e\x67\x9b\xca\x3b\x9d\xfe\xf8\x67\xd2\x7e\x30\xfc\xd4\xff\x79\x90\xbe\xc6\x83\x9f\x87\x93\x87\xf1\xe7\xf4\x31\x9a\x7c\xfd\x6d\x30\x9e\x0c\x47\x77\x1d\xda\x1d\xfe\x8f\x43\x88\x9e\x96\x62\x70\x2b\x75\x5c\x83\xac\x49\x85\x60\x20\x6a\xcb\xf8\x22\xc1\x33\xc7\x2b\xb9\xc4\x53\xfa\xd0\xb0\x4a\xb3\xc8\xe2\x34\x4f\x06\x20\x75\x69\xc6\xef\x52\x0b\xb3\xf2\x79\xe7\xe3\x78\xf4\x09\xb2\xcc\x2a\x16\xe6\xc6\xd5\xef\x15\x21\x17\xac\x16\x97\x17\xc0\x94\x95\x1a\xaf\x5e\xe7\x97\xc0\x3c\x58\x87\xb6\xd3\x19\xdc\xfd\x06\xd7\x8f\xe3\xdb\xad\x6e\xef\x7f\xca\xdf\xfc\x94\x9f\x91\x8a\xfd\x25\x93\x2a\x99\x7d\x16\xfd\x66\x66\xd6\x30\x8f\x9a\x37\xfb\x77\x18\x9c\xc4\x65\x73\x40\x5c\xd4\x89\xb2\x56\x2c\xc7\x35\x42\x96\x29\xe9\x43\x82\xff\xf0\x38\xf9\xfc\x61\xf4\xc7\xd7\xc1\x1f\x83\xc9\xfb\xee\x17\xf8\xf2\x05\x98\x4b\x1b\x03\xe6\x2b\x60\xab\x05\xcc\x98\xc7\xcb\x8b\xf4\xd2\xac\x46\x6a\x54\x30\x8b\xfa\x49\xda\x1e\xcc\x9e\x38\x0b\x30\x4b\x6d\xce\x14\xd0\x17\xaf\x6a\x23\x80\x2f\x7c\xac\x81\x2b\x64\x0e\x78\x6d\xc9\x75\x6a\xe0\x16\xb8\x95\x06\x78\x0c\x20\x58\x40\x10\x1c\x84\x00\x31\x07\x21\xe7\xf4\x70\x69\x09\x61\x7c\x2f\x6a\xb9\x06\x61\x17\x65\x26\x70\x06\x22\x02\xf2\xca\x00\x0a\xc0\xd2\xa1\x05\xd4\x4b\x3a\x50\x4c\x8b\x74\xae\x60\xce\x78\x30\xf4\x52\x74\x86\x92\xc8\x5c\x6a\x01\x73\xa3\x04\xcc\xfd\x46\x73\x98\x07\x5b\x62\xa0\x97\x8d\x01\x4a\x0c\xc6\x06\x48\x92\xa5\x33\xd1\x7a\x28\xd3\xa6\xa0\xa4\x47\x25\xa0\x42\x46\x8f\xb5\x88\xb5\x05\x29\x40\x5a\xce\x14\x87\x85\x54\x2a\x3d\x98\x52\x90\x1c\x52\x49\xbd\x00\xa5\x41\x99\x32\xa9\xaf\x3c\xa8\xc4\x8b\x7a\xaa\x19\xa8\x27\x63\xd3\x83\x7a\x6a\xa6\xa1\x16\x6f\x88\x9a\x7a\x21\xa4\x83\x7a\x11\xb0\xb6\x50\x2f\x41\x2b\x30\x02\x2c\xf3\x01\xc1\xb2\xc0\x2b\xb0\x49\x39\x2b\x85\x99\x83\x95\x16\xbf\x5a\x67\xca\xe4\x42\x36\x29\x61\x9d\xd4\x81\x88\x48\x8d\x39\x58\x0f\x76\x25\xc0\xe1\x12\x5c\x0d\xae\x26\x7c\x67\x6b\xfa\xef\x25\xda\x29\x3e\x7a\xfc\x0b\x7c\x05\xbe\x62\xe7\xa4\x85\xaf\x58\xef\xcd\x65\xdb\x7a\xdd\xbe\xdf\x9c\xf7\x9a\x16\x45\x19\x5f\xc5\x39\x78\x85\x68\xc1\x1b\x17\xc0\x5b\x25\x03\x78\xaf\xbe\x72\x25\x51\x07\xf0\x81\xd1\xc3\x49\x5d\x7a\xa0\x79\x81\x71\x08\x4c\x2a\x08\xcc\x41\x20\xff\x46\x1f\x20\xc8\x1a\x4d\x0c\x10\x4c\xe4\x15\x04\x07\xc1\x45\xa4\x87\xe6\x74\x12\x42\xd8\x78\xf9\x84\x10\x13\x85\x51\x53\xa8\x4d\x7b\x8d\xba\xb5\x73\xd4\xf2\x2f\x7a\xac\x7b\xc2\x50\x77\xa2\x3d\xea\x44\x32\xbd\x8c\x85\xa8\xd7\x4f\xd0\x58\x31\x36\x2a\xc7\x28\x90\x1b\x81\x10\x23\xea\xd4\x58\x4a\x58\x25\x7a\x57\x1c\x56\x74\x20\x56\x95\xa4\xaf\xca\xb0\x5a\xd2\x4b\x7a\x58\x33\x57\x7a\x58\xaf\x05\xac\x9f\x60\x9d\x6c\xb9\x41\x0f\xd4\xe8\x76\x3a\xfd\x9b\x9b\x14\xba\xfd\x55\x51\x94\x32\x54\x71\x96\x73\x53\x17\x8b\x5d\x6a\xca\xbc\x2c\x7d\xb1\x6a\xfc\x3e\xa3\xdd\x4b\x5d\x16\x8e\xad\x8a\x9a\xcc\xeb\x8a\x14\x4d\x7c\xd1\x3a\x65\x71\xe8\x9c\xdb\x8f\x4c\x48\x77\x38\x70\xb4\xaa\x5f\x30\x1d\x2a\xb6\xc8\x2b\x53\xa3\x65\x25\xe6\x21\x33\x44\x08\xe6\x02\x0b\x61\x56\x5a\x19\x26\x0a\x1e\x9d\xca\x5e\x1d\x86\x90\x9c\xb3\x19\xa4\x7e\x6a\x1d\x61\x62\x40\xa7\x99\x52\x9b\x99\x71\x28\x52\x26\xaa\xa5\xe7\x85\xc6\xc0\x59\x68\x5f\xd9\x4a\xea\xd7\xbd\xec\x3c\x3f\xef\xe5\xc4\x72\xdb\x4d\xed\x23\xb0\xad\x0a\x3e\x97\x9e\x27\x2c\x82\x9a\x49\x2d\xde\x16\x6f\xf3\xf3\x8b\xfc\xfc\xac\xf8\x30\xbc\xbb\x69\xdb\xf9\xfa\xf2\xa2\xc1\x23\x91\x84\x96\xe2\x30\x68\xca\x65\x4b\xee\xa2\xa6\xe3\x73\x7e\x71\x96\x0b\xa5\x28\xb3\x19\x27\x9a\xe8\xea\xa2\x06\x21\x4b\xa2\xe8\x94\x52\x0b\x69\x20\x9e\x11\xb6\x92\x0b\x29\x94\x4a\x76\xda\xd1\xd3\xbb\x38\x7f\x7b\x51\x1c\xa1\x27\x1d\xfe\xde\xd3\xe9\x8c\x1f\xef\x80\xd9\x05\x64\x59\xb4\x29\x6e\x31\x21\x80\xb3\x19\xae\x83\x63\x3c\x90\xb2\x77\xa3\x87\xc1\x0f\x5c\xb1\x28\x64\x9c\xfd\x78\xd5\x26\x11\xee\x90\x91\xf1\xc1\x6f\x6a\x3a\xaf\x3e\xe5\x37\x64\xbc\xda\x96\x05\xdb\xf8\x3d\x93\x9a\x39\x89\x29\xa1\x01\x9b\x87\x94\xc2\x58\x38\x4e\x2b\x9d\x13\x9a\x53\x3f\x4b\x2d\xf0\xa8\xe7\xc6\x85\xa8\x59\x40\xb5\x39\x05\x61\xf8\x02\x1d\xcc\xa2\x54\x62\x0d\x15\xf3\xe0\x4d\x4d\xc9\xdd\x47\xf4\xbb\x1c\x95\x50\x5a\x88\x9d\x82\x94\x93\xbb\x1f\xa5\x42\x5f\x74\xa9\x1a\x60\x6a\xc5\x36\x4d\x46\x42\x2d\x9a\xca\x22\xe5\xe7\x46\x9e\x7c\xbc\xc4\x90\xa7\xe2\x6c\xb7\x49\x52\xd2\xa3\x5a\xd2\x76\x1c\x82\x43\xc5\x82\x5c\xa6\xb8\x56\x79\x2a\x20\xbc\x39\x3d\xb2\x62\xcd\x16\x98\xaa\xae\x86\x95\xfa\x14\x56\x08\x9c\x69\xf0\x54\x2a\x6c\x12\xdf\xec\x98\xab\x0d\xcd\x4b\x8a\x4e\x0f\xdc\x24\x4f\xb6\xe2\xe2\xd8\x8f\xe0\xfb\xef\x61\xda\xa1\x92\x8b\xe8\x6f\x47\xbe\xb6\x30\x52\xc3\xab\xc3\x3c\xf8\x0e\x84\xa1\x70\x9e\xf9\xa3\xac\xf9\xea\x78\x1a\xf5\x91\xa4\xc6\x3d\x78\x13\xd2\x93\x4e\xfb\x4e\x6e\x8f\x60\x1a\x6a\x0f\x1d\x3b\x69\xdc\x4c\x6d\x3c\x76\x1e\x95\x6a\x9b\xd4\xb9\x47\xda\x1d\x38\xc8\xc4\x81\x6c\xb1\xf7\xe8\xa3\x65\xb3\x43\xc0\xa2\xff\xe9\xe6\xf2\xe2\xb0\x83\xe2\x42\x7e\x3b\xbc\xde\x2f\x55\xfc\x7d\x2b\x5b\xaf\x3f\x52\xa3\x89\xaf\x07\x9e\x9f\xb4\xd9\x4b\x3e\x47\x21\xa7\x4e\x18\x85\x90\x65\x0b\x76\x84\xb5\xf5\xfa\x84\xb4\x95\x2e\x8e\x36\xb3\xef\x6e\xbd\xfd\xa0\x47\x7b\x65\xcc\x22\xda\xbf\x75\xff\x6f\x0a\x16\xdb\x35\x8b\x67\x3b\x78\xe6\xf9\xb4\xfa\x33\xe5\x43\x6d\x69\x7a\x27\x45\xa4\xd6\x59\x26\x81\x95\xf8\xcd\x7a\xee\xd5\xb6\xbe\xdc\xa5\x01\x8f\x6e\x89\x8e\x1b\x87\x19\xa7\x5a\xff\xea\x3c\x3f\xcb\xd2\x94\x2c\x4d\xc9\x5e\xed\xab\x50\xaa\x01\x0f\xe4\x2b\x54\x16\xdd\x37\xd7\xc3\x1e\x06\x64\x75\x61\xcd\x0a\x9d\xaf\x50\xa9\x76\xd6\xd5\x65\xde\xcb\x7f\x6a\x17\x4a\x0b\xa7\x02\xd3\x1f\x81\xbe\xda\xd7\xc6\x9d\xeb\xd1\xfd\x67\xc8\xb2\xb9\x33\xf5\x7b\xf2\xfa\x1d\x03\xa9\xf1\xc2\xf0\x81\xa3\x25\xf2\x5f\x10\xd9\x9d\xe5\xd4\x7a\x41\xe0\xe0\xf4\x68\x7e\x79\xb1\x33\x64\xa1\x79\xf2\x91\xe7\x33\xb6\x27\x89\x1a\x2f\x0c\x3f\xcb\x19\x45\x6b\xbb\x62\xb2\xf1\x01\xeb\xd7\xbd\x82\x0c\x2a\x35\x57\x51\x20\x68\x45\x59\xfa\x08\xe7\x19\xff\x2f\x40\x34\xd3\x1a\x6d\xbf\x31\xf8\x9f\x71\x51\x67\x8f\x93\x03\x80\xbc\x8e\xf2\x5f\x8a\xfd\xf7\x3d\x04\xe1\x99\x95\xff\x40\xd2\xc1\xe8\x21\x5f\xfb\x63\x96\xf2\x95\x0c\x1e\x3e\x19\x11\x15\x02\xd3\x4c\x6d\xbc\xf4\x90\xce\x5a\x7e\x6c\x9a\xed\xa9\x83\x2f\xdd\xe2\x9e\x20\x26\x04\xd1\x3d\x85\x6e\x71\x4f\xb5\x2d\xab\xdb\xf8\x78\x30\xf8\xe7\x4b\xd9\xf5\xe3\xf6\x96\x48\xc5\xa2\x43\xe6\x8d\x86\x1a\x35\x5d\x80\x50\x00\x9b\x19\xba\x96\xad\x10\x2a\xb6\x4c\xb7\xb6\x74\x11\xb7\x2b\x5f\x25\x5b\x6d\x13\x47\xb1\xed\xf9\x37\x5a\xee\x84\xbf\xa9\x6e\xd1\xa6\xce\x3f\xff\x01\xb2\x78\xf4\xe8\x7c\x71\x6d\x74\x60\x52\xa3\xeb\x8b\x5a\x6a\xba\x70\xb3\x60\x5c\xd1\xb7\xf6\x86\x05\x56\xdc\x1a\xce\x54\xf1\x49\x72\x67\xe8\xe6\xbe\x33\xcb\xc1\x3a\x4d\x8a\x2f\x1a\xd6\xfb\x2d\xe9\xd7\xc9\xbf\xff\x1f\xd6\x68\x8b\x60\xe3\x43\x2a\xd7\x93\xab\x6e\xbf\x9a\xa4\xf6\x38\x19\x8c\xe1\x65\x15\x5e\x32\xe8\x71\xc5\xe2\x31\xa4\x22\x02\xee\xfb\x0f\xbf\xa4\xbb\xde\x92\x39\x99\xee\xbb\xc1\x6c\xef\xe4\x99\x92\x8b\x46\xe2\xb4\xad\xe1\xa5\x4f\xbf\xde\x08\xf4\xd2\x91\x70\x9e\xee\xb8\x24\xf1\xbe\x7b\x7d\x35\x15\xb2\x9c\xbe\xbb\xbe\x9a\xce\xa4\xa6\x17\x85\x22\x7a\xb7\x1b\x9f\x6e\xcf\xfc\x41\x1f\x35\x8f\x2c\x3d\xdd\xb3\xf3\xae\xdb\xe6\x89\x56\x20\x8d\xa7\x75\x8e\x66\x6c\xa5\x4e\x68\x53\xc0\x60\x2e\xd7\x28\x40\x19\x9e\x7e\xad\xd8\xfd\xdc\xf1\xa2\xf7\xa4\x89\xb7\xa3\xeb\xfe\x6d\xff\xfe\xfe\xa6\xff\xd0\x4f\xf0\xc9\xba\xd3\x97\xa9\x9d\xb6\xd6\x9d\x26\xeb\xee\x34\x9c\xbc\x60\xc2\x7b\x16\xaa\xff\x88\x37\xdd\x9d\x96\x1d\x69\x7b\x3e\xa6\x8d\x09\xa7\x2f\x2c\xb5\xe7\xe0\x1e\x9d\x97\x3e\xc0\x77\xf7\x93\xeb\xd1\x78\xf0\x1d\x90\x81\x76\xb6\x25\x32\xa2\x47\x07\xdc\xe8\x25\x6a\x89\x9a\x63\xbb\x01\x92\x7e\x4e\xee\xe1\xf2\x3b\xf7\xec\x74\x6e\xfb\x1f\x06\xb7\xcd\x4f\x36\x5f\x97\xcd\xaf\x7e\xef\xbb\xe7\x79\xef\x6d\x76\xde\xed\x0c\xee\x1e\xc6\x9f\xef\x47\xc3\xbb\x07\xf8\xd2\xe5\xb5\xd8\xb9\xb4\x4f\x4f\xde\xfd\xb3\xf3\x7f\x01\x00\x00\xff\xff\xa6\x79\x7b\x26\x7a\x14\x00\x00") func testImagesBusyboxDockerfile_windowsBytes() ([]byte, error) { return bindataRead( @@ -4281,7 +4377,7 @@ func testImagesBusyboxOwners() (*asset, error) { return a, nil } -var _testImagesBusyboxVersion = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x32\xd4\x33\xb2\xe4\x02\x04\x00\x00\xff\xff\x7c\xeb\x30\xd3\x05\x00\x00\x00") +var _testImagesBusyboxVersion = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x32\xd4\x33\xb2\xd4\x35\xe4\x02\x04\x00\x00\xff\xff\x0c\x72\x01\xee\x07\x00\x00\x00") func testImagesBusyboxVersionBytes() ([]byte, error) { return bindataRead( @@ -4321,7 +4417,7 @@ func testImagesBusyboxHostnameGo() (*asset, error) { return a, nil } -var _testImagesCloudbuildYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x84\x54\x71\x6b\xe3\xb8\x13\xfd\xdf\x9f\xe2\x41\x97\xf5\x2e\x44\x71\x36\xbf\xee\xb2\x3f\x43\xfe\xc8\x6d\x73\x6d\xb8\x74\x5b\xda\x2c\xbd\xc2\x81\x91\xed\x89\x2d\x2a\x4b\x3e\x49\x4e\x1b\xb8\x0f\x7f\x48\x72\x7a\x0d\x77\xc7\x41\xc0\xce\x68\xfc\xe6\xcd\xe8\xcd\x3b\xc3\x3d\x11\x5a\xe7\x7a\x9b\x67\x59\x25\xf5\x50\x4f\x1b\xad\x1b\x49\xd3\x4a\x77\x31\xc0\xca\x41\xc8\x3a\xab\x75\x65\xb3\xf0\xca\x2a\xad\x76\xa2\x49\x92\x33\xb8\x56\x58\x74\x83\x75\x28\x09\xb6\xa7\x4a\xec\x04\xd5\x10\x0a\x96\x2a\xad\x6a\x3b\xc5\x7a\x07\xdd\x09\xe7\xa8\x9e\xa0\xa6\x1d\x1f\xa4\xb3\x70\x1a\x5f\x66\x33\x8b\x0f\x9f\x66\xe8\x84\xb2\x1f\x03\x16\xc1\x89\x8e\xf4\xe0\xf0\xcc\x2d\x84\xaa\x0c\x71\x4b\x35\x4a\xaa\xf8\x60\x09\x56\x77\x04\xd1\xf1\x86\x2c\x3a\xd1\xb4\x0e\x8e\x3f\x11\xa4\x56\x0d\x19\x8f\x19\xe8\xe1\x03\x4d\x9b\x69\x0e\xcb\xbb\x5e\x12\xe3\xbd\xb0\x64\xf6\x64\x26\xe8\xc9\xd9\xcc\x50\x2d\x2c\x13\xca\x3a\x2e\x25\x99\x8f\xc9\x58\x33\xc7\xe7\xf3\xd9\xcc\x1e\x9b\xea\x0d\xed\x49\x39\x0b\x32\x46\x1b\x0b\xb1\xc3\x41\x0f\xa8\xb5\x4a\x1d\x3c\x99\x52\xbb\x16\xc5\xe5\x7a\x5b\x6c\x97\x97\xe0\xaa\x46\x71\xfb\x63\xb3\x29\x7e\x5a\xde\xaf\x8a\xbb\xd5\xcf\x93\xe4\x0c\xda\x80\xab\x03\x14\x3d\xc3\x0e\xa5\x75\xc2\x0d\x4e\x68\x65\xc1\xeb\x3a\x8e\xc9\x37\xbd\x1b\xdc\x60\x68\x9a\xe8\x3e\x1c\xe6\x09\x4e\xb2\x8b\x18\xcf\xb1\xdc\x6c\x6e\x1e\x8a\xcd\xcd\xcd\xfd\x2a\x01\x3a\x5e\xb5\x42\xd1\xf6\xd0\x53\x8e\xf4\xfb\xa7\xe2\x6a\x7d\x79\xf5\xed\xf6\x47\xf1\x35\x4d\xac\xa3\x3e\xe0\x30\x28\xde\xf9\xf3\xa6\x32\x53\xa1\xb3\xa7\xaf\x96\x39\xb2\x2e\x0e\x31\x6b\xaa\x92\xd5\xba\x7a\x22\xc3\x9a\x70\xd7\xf9\x7e\x3e\x9b\xcf\x66\xe7\xf3\x39\x2b\xe7\x9f\xeb\xff\x7f\x39\x4f\x13\x00\x20\xe5\xcc\xa1\xd7\x42\xb9\x1c\x69\xc9\x6d\x1b\xc3\xb5\x30\x39\xa6\x99\x47\xcc\x46\xc8\x31\x7d\x9f\x87\x17\x86\x8b\x9b\x6f\xbf\xac\xee\x8a\x6f\x9b\x75\xb1\xfa\xf5\x76\x75\xb7\xbe\x5e\x7d\xdf\x2e\x37\x0b\x52\xbc\x94\x54\x8f\x59\xdb\xe5\xe5\xe2\xdd\x71\x98\x63\xec\x38\xc8\xc5\xbb\xd3\xc1\x8e\xc7\x0f\x57\xcb\xed\xe2\x5d\xe1\x1f\x63\xe4\x6e\x75\xb9\xbe\xdf\xde\x3d\x2e\xde\x34\x6b\x1d\x6f\x84\x6a\x18\xcd\x29\x34\xce\x22\xcd\xf0\xc5\x19\xb6\x2d\x1d\x35\x89\xd0\x7f\x14\x50\xcb\x2d\xae\x6e\xae\x57\x8b\xa8\x77\x32\x59\xeb\x95\xe7\xef\x38\x4e\x2b\x0a\xed\x05\xc2\xab\x14\x99\xd1\xda\x65\xd3\x78\x94\x55\x52\xb0\x5e\x0e\x8d\x50\x36\x1b\x67\x1b\xb3\xc7\x9a\x0f\x04\x45\x54\x7b\xb9\x5a\x72\x41\x00\xbe\x96\xff\x1f\x80\x40\x2f\xbd\x14\x95\x70\xf2\x00\x2b\x54\x45\x78\xa6\xd4\x10\x06\x2b\x54\x73\x5a\x7f\xec\x3b\x52\xf5\xdf\x86\x00\x37\x8d\x3d\x4e\x3f\x65\x55\x3a\xbe\xfe\x11\x9e\x40\xbc\x68\xf0\xc1\xb5\x88\x8b\x3c\x18\x1a\x55\x80\xdf\xc6\xa4\xf7\xef\x8f\x95\xcc\xa0\xc0\x98\xe9\xc0\x58\x6f\xc4\x5e\x48\x6a\xa8\x46\x37\x48\x27\xb8\xa9\xda\xec\x77\xea\x06\x36\x58\x32\x7e\xd4\x4e\x54\x3e\x99\x7c\x63\xac\xc7\x81\xec\x5b\x44\x7a\xe9\xb5\x71\xff\xa5\x88\x7f\xe0\x30\x4e\xdb\xdb\x81\x23\x30\xe6\x35\x0d\xd1\x35\x6c\xbc\x1e\x30\xcf\xe0\xdf\x3f\x14\xca\x5b\x93\x03\x63\xa5\xd6\xce\x3a\xc3\xfb\xb7\xc9\x9d\x37\x11\x2e\x65\x84\x63\x5c\xd5\xac\x1f\x6c\x9b\x9c\xac\xac\x9f\xe8\xd9\x5f\xfb\xfe\x2c\xa4\xf4\x9e\xb7\x13\xd2\x73\x7e\x16\xae\x05\x47\x23\x1c\x2b\x83\x65\x39\xde\x60\xa7\x4d\xb8\xde\x20\xb9\x09\xf4\x2e\x6e\xbb\x36\x1d\xf6\x8f\x8f\x8f\x8f\xd7\xd7\x17\x17\xac\xe5\xb6\x9d\x78\x69\x05\xfc\x8a\x2b\x8f\x3a\x78\x08\x6e\xc1\x4f\x8c\x20\xc1\x6b\xfd\x1c\xe9\xa7\xf9\xff\xce\x3f\xa7\x91\xd5\xc9\x7e\x44\x6e\x95\x56\x8e\x8f\x06\x63\xc8\x97\xe6\xd1\x56\x7d\x6b\x51\x7e\xfe\x67\x44\x13\xbc\xd3\x5b\x5e\x14\x3f\x0b\x90\x1c\xa5\xe1\xaa\x6a\x21\xc5\x13\x21\xed\xb8\x75\x64\x52\x6f\x68\xa9\x21\xe9\x6d\x99\xcd\xa6\xf3\x74\x12\x2c\x2e\x74\x1b\x13\xf7\x3e\x3a\xf5\x4c\x4f\x38\xe5\xaf\x10\x91\xb0\xdf\xda\xbf\xf3\x0c\x83\x0a\x8e\x15\xcc\x9c\x02\x23\x17\xf6\xae\x1f\x4a\x29\x5e\x89\xb7\x84\x71\xb1\x61\xa8\x11\xd6\x99\x43\xa8\xe9\x61\x73\xa4\xfe\x2e\xbd\xb4\xb5\xe9\xb8\xaa\x28\x4d\xfe\x0c\x00\x00\xff\xff\x4f\xeb\x28\x13\xe7\x06\x00\x00") +var _testImagesCloudbuildYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x84\x55\x7f\x8b\xdb\x38\x10\xfd\xdf\x9f\x62\x60\x97\xba\x85\x95\x9d\xa4\xed\x5d\x31\xe4\x8f\x5c\x9b\xdb\x0d\x97\x6d\xca\x6e\x4a\x6f\xe1\xc0\xc8\xf2\xc4\x16\x2b\x4b\x3e\x69\x9c\x34\x70\x1f\xfe\x90\xe4\x6c\x37\xd7\x2b\x85\x80\x95\xd1\xf8\xcd\xaf\x37\xcf\x17\x70\x8f\x08\x2d\x51\xef\x8a\x3c\x17\xca\x0c\x75\xd6\x18\xd3\x28\xcc\x84\xe9\xa2\x81\x55\x83\x54\x75\x5e\x1b\xe1\xf2\x70\x64\xc2\xe8\x9d\x6c\x92\xe4\x02\xa8\x95\x0e\xba\xc1\x11\x54\x08\xae\x47\x21\x77\x12\x6b\x90\x1a\x1c\x0a\xa3\x6b\x97\xc1\x6a\x07\xa6\x93\x44\x58\x5f\x41\x8d\x3b\x3e\x28\x72\x40\x06\x7e\x99\x4c\x1c\xbc\x9c\x4e\xa0\x93\xda\xbd\x0a\x58\x08\x24\x3b\x34\x03\xc1\x81\x3b\x90\x5a\x58\xe4\x0e\x6b\xa8\x50\xf0\xc1\x21\x38\xd3\x21\xc8\x8e\x37\xe8\xa0\x93\x4d\x4b\x40\xfc\x11\x41\x19\xdd\xa0\xf5\x98\x21\x3d\x78\x89\x59\x93\x15\xe0\x78\xd7\x2b\x64\xbc\x97\x0e\xed\x1e\xed\x15\xf4\x48\x2e\xb7\x58\x4b\xc7\xa4\x76\xc4\x95\x42\xfb\x2a\x19\x63\x16\xf0\xf6\xcd\x64\xe2\x4e\x45\xf5\x16\xf7\xa8\xc9\x01\x5a\x6b\xac\x03\xb9\x83\xa3\x19\xa0\x36\x3a\x25\xf0\xc9\x54\x86\x5a\x28\xaf\x57\xdb\x72\xbb\xb8\x06\xae\x6b\x28\x3f\x7d\x5e\xaf\xcb\xdf\x16\xf7\xcb\xf2\x6e\xf9\xfb\x55\x72\x01\xc6\x02\xd7\x47\xd0\x78\x00\x37\x54\x8e\x24\x0d\x24\x8d\x76\xc0\xeb\x3a\xb6\xc9\x17\xbd\x1b\x68\xb0\x98\x25\xa6\x0f\x97\x45\x02\x67\xde\x65\xb4\x17\xb0\x58\xaf\x37\x5f\xca\xf5\x66\x73\xbf\x4c\x00\x3a\x2e\x5a\xa9\x71\x7b\xec\xb1\x80\xf4\xe3\xb4\xbc\x59\x5d\xdf\xbc\xff\xf4\xb9\x7c\x97\x26\x8e\xb0\x0f\x38\x0c\x34\xef\xfc\x7d\x23\x6c\x26\x4d\xfe\xf8\xce\x31\x42\x47\xb1\x89\x79\x23\x2a\x56\x1b\xf1\x88\x96\x35\x61\xd6\xc5\x7e\x36\x99\x4d\xa6\xd3\xd7\x13\xf6\xeb\xdb\x49\x3d\x9d\xed\xd2\x04\x00\x00\x35\xd9\x63\x6f\xa4\xa6\x02\xd2\x8a\xbb\x36\x9a\x6b\x69\x0b\xc8\x72\x8f\x98\x8f\x90\xa3\xfb\xbe\x08\x07\x06\x1f\x36\xef\xff\x58\xde\x95\xef\xd7\xab\x72\xf9\xe7\xa7\xe5\xdd\xea\x76\xf9\x71\xbb\x58\xcf\x51\xf3\x4a\x61\x3d\x7a\x6d\x17\xd7\xf3\xcb\x53\x33\x47\xdb\xa9\x91\xf3\xcb\xf3\xc6\x8e\xd7\x5f\x6e\x16\xdb\xf9\x65\xe9\x1f\xa3\xe5\x6e\x79\xbd\xba\xdf\xde\x3d\xcc\x2f\xcb\xd3\x31\xdc\x5c\xc0\xb6\xc5\x13\xf7\x20\xd4\x19\x89\xd2\x72\x07\x37\x9b\xdb\xe5\x3c\xf2\x1a\x6d\xde\x7a\x86\xf9\x59\xc6\xae\x44\x42\x7d\x05\xe9\xd9\x08\xb9\x35\x86\xf2\x2c\x5e\xe5\x42\x49\xd6\xab\xa1\x91\xda\xe5\x63\x0f\xa3\xf7\x18\xf3\x0b\x82\x46\xac\x3d\x2d\x1d\x52\x18\xb4\x8f\xe5\xff\x07\x20\xc0\xaf\xbd\x92\x42\x92\x3a\x82\x93\x5a\x20\x1c\x30\xb5\x08\x83\x93\xba\x39\x8f\x3f\xd6\x17\x53\xf5\xef\x8e\x21\x3e\x6e\xb6\xcb\x97\x42\xf1\xa1\x96\x43\xf5\xaa\x80\xc3\xb7\x90\x82\x2b\x05\x16\x1b\xe9\x08\x6d\xe6\x5a\xa8\x70\x67\x2c\x82\x5f\x29\xf2\x01\x7c\x91\x95\x31\xe4\xc8\xf2\x3e\x18\xfe\x5b\xb3\xdf\x10\x2d\x30\x0b\xc1\xb8\x6d\xdc\x69\xa4\x29\x13\xe9\x78\xfc\x27\x3c\x01\x22\x7b\x80\x0f\xd4\x42\x54\x87\xc1\xe2\x48\x2d\xf8\x6b\x74\x7a\xf1\x02\xb2\x2c\xcf\xb2\x9c\x5a\x69\xeb\xb2\xe7\x96\x8e\x79\x37\x28\x92\xdc\x8a\x36\xff\x1b\xbb\x81\x0d\x0e\x2d\x73\xc4\x49\x8a\xfc\x94\x7e\xfe\xbc\x0e\xc6\x2c\xfa\x7e\xb2\x1e\x8e\xe8\x9e\x63\xe3\xd7\xde\x58\xfa\x19\xe1\x9e\xbf\x31\xe6\xb7\x47\xeb\xa4\xd1\xff\x73\x33\xb6\xe2\xa7\x0e\xa1\xab\x08\x8c\xf9\x6d\x03\xd9\x35\x6c\x24\x14\x30\x5f\xd1\x8f\x5f\x94\xda\x8b\x26\x01\x63\x4f\xb3\x78\xee\xdc\x79\x79\xe3\x4a\x45\x38\xc6\x75\xcd\xfa\xc1\xb5\xc9\x99\x98\xf8\xb1\x5c\x7c\x53\xa2\x83\x54\xca\xab\xf1\x4e\x2a\x5f\xee\x41\x52\x0b\x1c\x1a\x49\xac\x0a\x62\x4a\xbc\x81\x9d\xb1\x81\x90\x61\x67\xaf\xc0\xec\xa2\x0e\x19\xdb\xc1\xfe\xe1\xe1\xe1\xe1\xf6\xf6\xc3\x07\xd6\x72\xd7\x5e\x79\x9e\x04\x7c\xc1\xb5\x47\x1d\x3c\x04\x77\xc0\xcf\x24\x2a\x81\xa7\xf8\x05\xa4\xd3\xd9\xeb\x37\x6f\xd3\x98\xd5\xd9\xe6\xc6\xdc\x84\xd1\xc4\x47\xe9\xb3\xe8\x43\xf3\x28\xf8\xbe\xb4\xc8\x5e\xff\xb3\xb2\x09\xaa\xee\xc5\x38\xae\x2b\x0b\x90\x1c\x2a\xcb\xb5\x68\x41\xc9\x47\x84\xb4\xe3\x9e\x19\xa9\x97\xda\xd4\xa2\xf2\x1f\x0c\x36\xc9\x66\xe9\x55\x10\xdf\x50\x6d\x74\xdc\x7b\xab\x27\xf3\x79\x4e\xc5\x13\x44\x4c\xf8\xa4\x1c\xdf\xe7\xea\x88\x37\x7e\x51\x22\x1b\xed\x31\x60\x9d\xdc\xcf\x25\x76\x74\x65\x38\xc3\x20\xb7\x2c\x8a\xe3\x18\xc2\x4b\xd6\xf7\xf0\xc1\x25\xc8\x75\xf8\x92\x61\x28\x9a\xc2\x9e\xf6\x43\xa5\xe4\x53\x6f\x7e\x94\x8a\x87\x2d\x20\xf5\x74\xf1\x2b\x68\x6c\xe7\xd7\x37\x4d\xfe\x0d\x00\x00\xff\xff\xb7\x91\xa6\x9f\xe4\x07\x00\x00") func testImagesCloudbuildYamlBytes() ([]byte, error) { return bindataRead( @@ -4401,7 +4497,7 @@ func testImagesCudaVectorAddOwners() (*asset, error) { return a, nil } -var _testImagesCudaVectorAddVersion = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x32\xd2\x33\xe4\x02\x04\x00\x00\xff\xff\x70\x6a\x3d\x6f\x04\x00\x00\x00") +var _testImagesCudaVectorAddVersion = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x32\xd2\x33\xe2\x02\x04\x00\x00\xff\xff\xb3\x39\x10\x44\x04\x00\x00\x00") func testImagesCudaVectorAddVersionBytes() ([]byte, error) { return bindataRead( @@ -4421,7 +4517,7 @@ func testImagesCudaVectorAddVersion() (*asset, error) { return a, nil } -var _testImagesEchoserverBaseimage = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xca\xc9\xcc\x2b\xad\xd0\x4f\xcc\x4d\x31\x33\xb1\xcd\x4b\xcf\xcc\xab\xb0\x32\xd4\x33\x34\xd5\x4d\xcc\x29\xc8\xcc\x4b\xe5\x82\xca\x16\xe5\xda\x26\x16\xe5\x1a\x1b\x95\x99\xe9\xe3\x51\x63\x66\x62\x0b\x26\xcb\x2c\x70\xaa\x2a\x28\x48\x36\x33\xc9\x49\xb5\x85\xd2\x38\xd5\x15\x1b\x5b\x1a\x54\xd8\x82\x49\x2c\x6a\xca\x33\xf3\x52\xf2\xcb\x8b\x21\xae\xd6\x37\xb4\x30\xb0\xb4\x0d\x72\x75\xf7\x0c\x0e\x09\x8a\xd4\x4f\x2a\x2d\xae\x4c\xca\x07\xa9\x37\xb2\xd4\x85\x2a\xd4\x05\x2b\xd4\x05\x29\x44\xd7\x6b\x69\x60\x4c\x9c\x5e\x4b\x03\x63\x4c\xbd\x44\xda\x6b\x69\x60\xc9\x05\x08\x00\x00\xff\xff\x2e\xa9\x3f\x08\x68\x01\x00\x00") +var _testImagesEchoserverBaseimage = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\xce\x3d\xcf\x82\x30\x10\xc0\xf1\x9d\xef\xd2\xa7\x47\xdb\xa7\xe1\x4c\x6e\x34\xe2\x8a\x2e\x8e\x20\xc4\x34\x81\x42\x20\xbc\xf8\xed\x0d\xd8\xc9\x8a\xe9\x72\x1d\xfa\xfb\xe7\xae\x36\x76\x5c\x78\xde\x94\x5a\x91\x7d\x18\xbb\x1c\xe2\xbf\xf8\x9f\xe5\x75\x67\x6c\x15\xb9\xdf\xbe\xa1\xbc\x6f\xa4\x98\x34\xff\x61\xb4\xa2\x6d\x4e\xc9\xae\xea\xba\xbb\x56\x75\x45\xee\xdd\x75\x83\x44\x58\x68\x9b\x5f\xcc\x6c\x6c\xd9\xce\xc3\xfb\x6a\x1e\x27\x80\x94\x1d\x4f\xe7\xcb\x35\xbb\xf1\x62\x1c\x9e\x45\xbb\x7a\x81\xcc\x41\xb6\x41\xb6\xc2\xcf\x16\x41\x86\xb5\x08\xd2\x6f\x03\xf7\xa2\xb7\x57\x00\xa8\xa0\x76\x85\x5e\x9b\x8a\xc0\x36\x15\xd1\x2b\x00\x00\xff\xff\x83\xde\xd7\x22\xe0\x01\x00\x00") func testImagesEchoserverBaseimageBytes() ([]byte, error) { return bindataRead( @@ -4461,7 +4557,7 @@ func testImagesEchoserverDockerfile() (*asset, error) { return a, nil } -var _testImagesEchoserverDockerfile_windows = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x74\x52\x51\x73\xe2\x36\x10\x7e\xd7\xaf\xd8\x81\xce\xb5\x9d\xc1\x36\x10\x26\x43\xc9\xe4\xc1\x25\x4e\xce\x73\x39\x9b\xc1\xe4\x52\xa6\xdc\x83\xb0\x17\x5b\x73\xb2\xa4\x4a\x72\x1c\xfa\xeb\x3b\x32\xe4\xe2\xf4\x2e\xbc\x60\xed\xf7\xed\xee\xb7\xdf\xee\x10\x96\x52\x1d\x35\x2b\x2b\x0b\xd3\xf1\x74\x0c\x9b\x0a\xe1\x53\xb3\x47\x2d\xd0\xa2\x81\xb0\xb1\x95\xd4\xc6\x27\x43\x32\x84\x7b\x96\xa3\x30\x58\x40\x23\x0a\xd4\x60\x2b\x84\x50\xd1\xbc\xc2\x17\x64\x04\x5f\x50\x1b\x26\x05\x4c\xfd\x31\xfc\xe6\x08\x83\x33\x34\xf8\xfd\x8a\x0c\xe1\x28\x1b\xa8\xe9\x11\x84\xb4\xd0\x18\x04\x5b\x31\x03\x07\xc6\x11\xf0\x39\x47\x65\x81\x09\xc8\x65\xad\x38\xa3\x22\x47\x68\x99\xad\xba\x36\xe7\x22\x3e\x19\xc2\xf6\x5c\x42\xee\x2d\x65\x02\x28\xe4\x52\x1d\x41\x1e\xfa\x3c\xa0\xb6\x13\xec\x7e\x95\xb5\x6a\x11\x04\x6d\xdb\xfa\xb4\x13\xeb\x4b\x5d\x06\xfc\x44\x34\xc1\x7d\xbc\x8c\x92\x2c\xf2\xa6\xfe\xb8\x4b\x79\x10\x1c\x8d\x01\x8d\xff\x34\x4c\x63\x01\xfb\x23\x50\xa5\x38\xcb\xe9\x9e\x23\x70\xda\x82\xd4\x40\x4b\x8d\x58\x80\x95\x4e\x6f\xab\x99\x65\xa2\x1c\x81\x91\x07\xdb\x52\x8d\x64\x08\x05\x33\x56\xb3\x7d\x63\xdf\x98\xf5\xa2\x8e\x99\x37\x04\x29\x80\x0a\x18\x84\x19\xc4\xd9\x00\xfe\x0c\xb3\x38\x1b\x91\x21\x3c\xc6\x9b\x8f\xe9\xc3\x06\x1e\xc3\xf5\x3a\x4c\x36\x71\x94\x41\xba\x86\x65\x9a\xdc\xc4\x9b\x38\x4d\x32\x48\x6f\x21\x4c\xb6\xf0\x29\x4e\x6e\x46\x80\xcc\x56\xa8\x01\x9f\x95\x76\xfa\xa5\x06\xe6\x6c\xc4\xc2\x79\x96\x21\xbe\x11\x70\x90\x27\x41\x46\x61\xce\x0e\x2c\x07\x4e\x45\xd9\xd0\x12\xa1\x94\x4f\xa8\x05\x13\x25\x28\xd4\x35\x33\x6e\x99\x06\xa8\x28\xc8\x10\x38\xab\x99\xa5\xb6\x8b\xfc\x30\x94\x4f\x48\xb8\xbe\x73\xea\xa3\xf8\x73\x78\x17\x75\xaf\x75\x74\x17\x67\x9b\xf5\x96\xb8\x71\xf0\x57\x8d\xd0\x18\x57\x9b\xc2\x3d\x13\xcd\x33\xb0\xda\xf5\xb4\x12\x1a\xa1\x68\xfe\xad\xab\x47\x75\x5e\xb1\x27\x1c\xb9\x87\x80\xb6\xcb\x72\x2b\x76\x79\xcc\x82\xd3\xe7\x32\x1e\x99\x28\x64\x6b\x7c\x72\xbb\x4e\x3f\x83\xe7\x29\x4e\xed\x41\xea\xfa\x9a\xbb\xca\x01\xad\x8b\xcb\x19\x50\xae\x98\xc0\xc5\x85\x7f\x09\xd4\x80\xd2\xa8\x08\x09\x6f\x6e\xba\x9b\x30\x8b\x20\x90\x0a\x85\x46\x63\x8f\xdd\x4d\x14\xb2\x15\x5c\xd2\xe2\x35\xec\x4d\xfc\xc9\x85\x7f\xe9\x4f\xbd\x96\x89\xcb\x99\xff\x2f\x53\xd0\x43\xbf\x07\xc9\xfa\x21\x81\xfa\x5b\xc1\x74\x0f\x86\x0f\x1f\x76\xc4\x5d\x60\x23\xde\xcb\x03\xaf\xe8\xc5\xc9\x69\x96\x5f\x5e\x5c\x0b\xda\xd3\x8c\x5e\x67\x93\xb7\x6f\x18\x2f\x50\x7b\x15\x72\x85\x7a\x31\xf1\x27\xde\x0b\xa1\x9b\xd6\x9b\xcc\xc7\x7f\xb8\x39\x4f\x84\x73\xb1\xd7\x85\x90\x65\xba\xda\x82\xe7\x1d\xb4\xac\xaf\x9d\x17\xbd\xd6\xef\x8e\xdc\x97\xd7\xcf\x3f\xf5\x80\xe0\xbc\x86\x20\x3b\x1a\x8b\xf5\xc5\x34\x78\xca\x75\x23\x2c\xab\x71\x32\x1b\xfb\x05\xe7\x3f\xa1\xfc\xac\xd0\xdf\x83\x60\xa5\x65\xa9\x69\x0d\xb7\x8c\xa3\x09\x52\x85\x22\xcb\xee\x07\x23\x78\x0f\xf9\x4a\x48\x94\x7c\x81\x55\xb8\xf9\x78\x3d\x58\x2e\x76\xdf\x85\xee\xae\x96\x8b\xdd\x9e\x89\xee\x3f\x6f\x34\xef\x3e\xce\x32\x76\xe6\x2c\xa3\x17\x73\x9f\x6f\x7a\xec\x56\xb2\x45\x9d\x55\xc8\xf9\xd5\xe0\x74\x32\xba\x11\xbe\xa9\xfa\x96\x9d\x22\x1d\x28\x4a\x26\x9e\xfd\x5c\x8a\x43\x9f\xe0\xde\xc1\x2b\xd4\x31\x2d\xd6\xee\x52\xd1\xe7\x0d\xed\x73\x79\x43\x83\x3e\x46\x48\xf4\xd7\x2a\xcd\x22\x98\x8f\x61\x36\xbb\x80\xf9\x78\x3e\x86\xf9\x6c\x76\x41\xa2\x64\xb3\xde\xae\xd2\x38\xd9\x38\xd3\xf6\x4c\x04\xa6\xea\x5c\xfa\xbf\xb2\xc1\x57\xf2\x5f\x00\x00\x00\xff\xff\xfc\xe4\xaf\xc7\xde\x05\x00\x00") +var _testImagesEchoserverDockerfile_windows = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x74\x53\x61\x6f\xe2\x38\x10\xfd\xee\x5f\x31\x82\xd3\xde\x9d\x04\x0e\xa5\xa8\xaa\x5a\xf5\x43\x8e\xd2\x6e\xb4\x5d\x40\x84\x6e\xaf\xda\xae\x4e\x26\x19\x92\x51\x1d\xdb\x67\x3b\x9b\x72\xbf\xfe\xe4\x40\xdb\x74\x77\x0b\x12\x89\x67\xe6\xbd\x79\xf3\x3c\xf4\x61\xaa\xcd\xce\x52\x51\x7a\x18\x8f\xc6\x23\x58\x97\x08\x9f\xea\x0d\x5a\x85\x1e\x1d\xc4\xb5\x2f\xb5\x75\x9c\xf5\x59\x1f\x6e\x28\x43\xe5\x30\x87\x5a\xe5\x68\xc1\x97\x08\xb1\x11\x59\x89\xcf\x99\x01\x7c\x41\xeb\x48\x2b\x18\xf3\x11\xfc\x11\x0a\x7a\x87\x54\xef\xcf\x73\xd6\x87\x9d\xae\xa1\x12\x3b\x50\xda\x43\xed\x10\x7c\x49\x0e\xb6\x24\x11\xf0\x29\x43\xe3\x81\x14\x64\xba\x32\x92\x84\xca\x10\x1a\xf2\x65\xdb\xe6\x40\xc2\x59\x1f\xee\x0f\x14\x7a\xe3\x05\x29\x10\x90\x69\xb3\x03\xbd\xed\xd6\x81\xf0\xad\xe0\xf0\x29\xbd\x37\x67\x51\xd4\x34\x0d\x17\xad\x58\xae\x6d\x11\xc9\x7d\xa1\x8b\x6e\x92\xe9\x6c\x9e\xce\x86\x63\x3e\x6a\x21\xb7\x4a\xa2\x73\x60\xf1\xdf\x9a\x2c\xe6\xb0\xd9\x81\x30\x46\x52\x26\x36\x12\x41\x8a\x06\xb4\x05\x51\x58\xc4\x1c\xbc\x0e\x7a\x1b\x4b\x9e\x54\x31\x00\xa7\xb7\xbe\x11\x16\x59\x1f\x72\x72\xde\xd2\xa6\xf6\x6f\xcc\x7a\x56\x47\xee\x4d\x81\x56\x20\x14\xf4\xe2\x14\x92\xb4\x07\x7f\xc5\x69\x92\x0e\x58\x1f\xee\x92\xf5\xc7\xc5\xed\x1a\xee\xe2\xd5\x2a\x9e\xaf\x93\x59\x0a\x8b\x15\x4c\x17\xf3\xcb\x64\x9d\x2c\xe6\x29\x2c\xae\x20\x9e\xdf\xc3\xa7\x64\x7e\x39\x00\x24\x5f\xa2\x05\x7c\x32\x36\xe8\xd7\x16\x28\xd8\x88\x79\xf0\x2c\x45\x7c\x23\x60\xab\xf7\x82\x9c\xc1\x8c\xb6\x94\x81\x14\xaa\xa8\x45\x81\x50\xe8\xef\x68\x15\xa9\x02\x0c\xda\x8a\x5c\xb8\x4c\x07\x42\xe5\xac\x0f\x92\x2a\xf2\xc2\xb7\x91\x9f\x86\xe2\x8c\xc5\xab\xeb\xa0\x7e\x96\x7c\x8e\xaf\x67\xed\x69\x35\xbb\x4e\xd2\xf5\xea\x9e\x85\x71\xf0\x77\x8b\x50\xbb\xc0\x2d\xe0\x86\x54\xfd\x04\x54\x85\x9e\x5e\x43\xad\x8c\xc8\x1e\x5b\x3e\x61\xb3\x92\xbe\xe3\x20\x1c\x14\x34\x2d\x2a\x5c\x71\xc0\x91\x87\xa0\x2f\x20\xee\x48\xe5\xba\x71\x9c\x5d\xad\x16\x9f\x61\x38\x34\x52\xf8\xad\xb6\xd5\x85\x0c\xcc\x91\xa8\xf2\x93\x09\x08\x69\x48\xe1\xd9\x31\x3f\x01\xe1\xc0\x58\x34\x8c\xc5\x97\x97\xed\x4e\xb8\xb3\x28\xd2\x06\x95\x45\xe7\x77\xed\x4e\xe4\xba\x51\x52\x8b\xfc\x35\x3c\x3c\xe2\x47\xc7\xfc\x84\x8f\x87\x0d\xa9\x93\x09\xff\x8f\x0c\x74\xb2\x2f\xc1\x17\xd2\xb0\x68\xf4\x48\x3c\xa8\xdc\xec\x3c\x72\xac\xa3\x30\x50\x0b\x72\x4e\x06\x42\x7e\x44\x3f\xd2\x39\x27\x5b\x9a\xd5\xed\x1c\xaa\xc7\x9c\x6c\xa7\x0b\x7c\xf8\xf0\xc0\xc2\x22\xd7\xea\xbd\xf6\x30\xcc\x7f\x05\xe8\x30\x39\x27\x7f\xc5\x73\xe8\xfb\x82\x77\x4e\xb2\xbd\xa1\xbf\xbd\x5e\x24\x9b\x2e\x96\xf7\x30\x1c\x6e\xad\xae\x2e\x82\x87\x9d\x5e\xef\x5a\xd5\xa9\x79\x07\x1f\x24\xbd\x36\x0d\x06\x7e\xed\x3d\xdf\x8b\x15\x0d\x2f\xc8\x97\xf5\xa6\x76\x68\x33\xad\x3c\x2a\xcf\x33\x5d\x3d\x03\x5e\x9e\x0b\x83\x2a\x4d\x6f\xfe\x39\x0a\x5f\x8a\x84\x31\xee\x65\xb2\x4c\x6d\x7b\x03\xe8\x45\x4b\xab\x0b\x2b\x2a\xb8\x22\x89\x2e\x9a\xea\xaa\xd2\xea\x70\x48\xd3\x9b\x37\xe5\xdf\x18\x9b\xcd\xbf\xc0\x32\x5e\x7f\xbc\xe8\x4d\xcf\x1e\x0e\xb9\x87\xf3\xc3\x7b\x3b\x50\x7b\xda\x90\x6a\x9f\x59\x6d\xf7\xe9\xc3\x42\x3e\xb8\x9d\xf3\x58\x1d\x8f\x3b\xb1\xf0\xfa\x46\xc4\xc3\x52\x37\x68\xd3\x12\xa5\x3c\xef\xed\x87\xb7\xb5\xe2\xae\xec\x5a\xbb\x8f\xb4\x49\x55\x90\x7a\xe2\x99\x56\xdb\x6e\x41\x38\x47\xaf\xa9\xb6\xd2\x63\x15\xfe\x09\xc8\x65\x2d\xba\xb5\xb2\x16\x51\x37\xc7\xd8\xec\xef\xe5\x22\x9d\xc1\xe9\x08\x26\x93\x63\x38\x1d\x9d\x8e\xe0\x74\x32\x39\x66\xb3\xf9\x7a\x75\xbf\x5c\x24\xf3\x35\x7c\xed\x45\x1b\x52\x91\x2b\x83\x8d\xc3\x2c\xfc\x42\xf6\xc3\xaa\x01\x3f\x08\xed\x7d\x63\xff\x07\x00\x00\xff\xff\x84\x82\xb5\xaf\x4d\x06\x00\x00") func testImagesEchoserverDockerfile_windowsBytes() ([]byte, error) { return bindataRead( @@ -4561,7 +4657,7 @@ func testImagesEchoserverNginxConf() (*asset, error) { return a, nil } -var _testImagesEchoserverRunSh = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x64\x91\xd1\x6f\xab\x36\x14\xc6\xdf\xfd\x57\x7c\x83\x97\x4d\x0a\x90\x65\xeb\xd5\xdd\xbd\xca\x43\x96\x76\x1b\x4a\x04\x52\x49\x56\x55\xea\x8b\x03\x07\x38\x0b\xd8\x9e\x6d\x4a\xf8\xef\x27\xd2\x54\x6a\x35\x3f\xd8\xb2\xbf\xcf\xc7\xdf\xf9\x39\xfc\x21\x39\xb1\x4a\x5c\x2b\x44\x88\xad\x36\x93\xe5\xa6\xf5\x58\x2d\x7f\xfe\x8a\x43\x4b\xd8\x0d\x27\xb2\x8a\x3c\x39\x6c\x06\xdf\x6a\xeb\x62\x11\x8a\x10\x7b\x2e\x49\x39\xaa\x30\xa8\x8a\x2c\x7c\x4b\xd8\x18\x59\xb6\xf4\xae\x2c\xf0\x37\x59\xc7\x5a\x61\x15\x2f\xf1\xe3\x6c\x08\x6e\x52\xf0\xd3\x77\x11\x62\xd2\x03\x7a\x39\x41\x69\x8f\xc1\x11\x7c\xcb\x0e\x35\x77\x04\xba\x94\x64\x3c\x58\xa1\xd4\xbd\xe9\x58\xaa\x92\x30\xb2\x6f\xaf\xcf\xdc\x8a\xc4\x22\xc4\xf3\xad\x84\x3e\x79\xc9\x0a\x12\xa5\x36\x13\x74\xfd\xd1\x07\xe9\xaf\x81\xe7\xd1\x7a\x6f\xbe\x25\xc9\x38\x8e\xb1\xbc\x86\x8d\xb5\x6d\x92\xee\xcd\xe8\x92\x7d\xba\x7d\xc8\x8a\x87\x68\x15\x2f\xaf\x57\x8e\xaa\x23\xe7\x60\xe9\xdf\x81\x2d\x55\x38\x4d\x90\xc6\x74\x5c\xca\x53\x47\xe8\xe4\x08\x6d\x21\x1b\x4b\x54\xc1\xeb\x39\xef\x68\xd9\xb3\x6a\x16\x70\xba\xf6\xa3\xb4\x24\x42\x54\xec\xbc\xe5\xd3\xe0\x3f\xc1\x7a\x4f\xc7\xee\x93\x41\x2b\x48\x85\x60\x53\x20\x2d\x02\xfc\xbe\x29\xd2\x62\x21\x42\x3c\xa5\x87\xbf\xf2\xe3\x01\x4f\x9b\xc7\xc7\x4d\x76\x48\x1f\x0a\xe4\x8f\xd8\xe6\xd9\x7d\x7a\x48\xf3\xac\x40\xfe\x07\x36\xd9\x33\x76\x69\x76\xbf\x00\xb1\x6f\xc9\x82\x2e\xc6\xce\xf9\xb5\x05\xcf\x18\xa9\x9a\x99\x15\x44\x9f\x02\xd4\xfa\x2d\x90\x33\x54\x72\xcd\x25\x3a\xa9\x9a\x41\x36\x84\x46\xbf\x92\x55\xac\x1a\x18\xb2\x3d\xbb\xf9\x33\x1d\xa4\xaa\x44\x88\x8e\x7b\xf6\xd2\x5f\x4f\xfe\xd7\x54\x2c\x04\x95\xad\x46\xf0\x27\x29\xb2\x72\x26\x02\x47\x5d\x1d\x39\x6e\x14\x55\x28\xc9\xfa\x40\xf4\xe7\x8a\x2d\x22\x83\x64\xde\x3b\xa1\x0d\x29\xe7\xba\x19\x37\xa2\xcb\xdd\xf2\x37\x44\xae\x95\xab\xbb\x2f\x88\x94\xae\xc8\x21\xaa\xe4\xe4\xf0\xcb\x97\x3b\x44\x8a\xc6\x33\x4d\xb0\x4e\x7e\x5b\x2d\x7f\xfd\x8a\x17\x11\x9d\x69\xd2\x83\xbf\x15\x4b\x8c\xe5\x57\xe9\x69\x47\x53\x3c\x1b\x5f\x44\xf4\x41\x9c\xe7\xb9\x55\xe9\x29\x2e\xad\x9f\x55\x37\x9c\xfe\x41\x90\x6c\xd7\xc7\x5d\x52\x1c\xd6\x4f\xd2\x8e\x5c\x9e\x5d\xcb\x96\x92\xfd\x7a\x4f\xb2\x67\xd5\x78\xad\x92\x7c\x9d\xdb\x26\x93\x3d\x25\xf9\x71\x9d\x1e\x70\x4f\x46\x5a\xdf\x93\xf2\xc9\x36\x5b\xd3\x45\xf6\xa6\xa3\xb8\xd4\x7d\xf0\x0e\xa1\xf0\xd2\x5e\x11\xa8\x86\xd5\x25\x10\xd7\x05\x51\x83\xa0\x92\xd4\x6b\x05\x5d\xd7\xdf\x03\xf1\x5f\x00\x00\x00\xff\xff\x0b\x85\xf1\xac\x89\x03\x00\x00") +var _testImagesEchoserverRunSh = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xb4\x54\x41\x6f\xe3\x36\x17\x3c\x87\xbf\x62\x3e\x69\x81\x2f\x01\x22\x31\x9b\x36\x8b\x6d\x02\x1f\x5c\x27\x6d\x8d\x04\x36\x10\x39\x0d\x16\x75\x1b\xd0\xd2\x93\xf4\x6a\x89\x54\x49\x2a\xb2\xff\x7d\x41\xd9\x41\x37\xe8\x65\x2f\xd5\x41\x20\xf9\xe6\x0d\x87\x23\x8e\xe2\xff\xc9\x0d\x6b\xe9\x6a\x21\x62\xcc\x4c\xb7\xb7\x5c\xd5\x1e\x97\x17\x1f\x3f\x63\x55\x13\xee\xfb\x0d\x59\x4d\x9e\x1c\xa6\xbd\xaf\x8d\x75\xa9\x88\x45\x8c\x07\xce\x49\x3b\x2a\xd0\xeb\x82\x2c\x7c\x4d\x98\x76\x2a\xaf\xe9\xad\x72\x8e\x5f\xc9\x3a\x36\x1a\x97\xe9\x05\x4e\x03\x20\x3a\x96\xa2\xb3\x1b\x11\x63\x6f\x7a\xb4\x6a\x0f\x6d\x3c\x7a\x47\xf0\x35\x3b\x94\xdc\x10\x68\x97\x53\xe7\xc1\x1a\xb9\x69\xbb\x86\x95\xce\x09\x03\xfb\x7a\xdc\xe6\x48\x92\x8a\x18\x5f\x8e\x14\x66\xe3\x15\x6b\x28\xe4\xa6\xdb\xc3\x94\x5f\xe3\xa0\xfc\x28\x38\x3c\xb5\xf7\xdd\xb5\x94\xc3\x30\xa4\x6a\x14\x9b\x1a\x5b\xc9\xe6\x00\x74\xf2\x61\x3e\xbb\x5b\x64\x77\xc9\x65\x7a\x31\xb6\x3c\xe9\x86\x9c\x83\xa5\xbf\x7a\xb6\x54\x60\xb3\x87\xea\xba\x86\x73\xb5\x69\x08\x8d\x1a\x60\x2c\x54\x65\x89\x0a\x78\x13\xf4\x0e\x96\x3d\xeb\xea\x1c\xce\x94\x7e\x50\x96\x44\x8c\x82\x9d\xb7\xbc\xe9\xfd\x3b\xb3\xde\xd4\xb1\x7b\x07\x30\x1a\x4a\x23\x9a\x66\x98\x67\x11\x7e\x9c\x66\xf3\xec\x5c\xc4\x78\x9e\xaf\x7e\x59\x3e\xad\xf0\x3c\x7d\x7c\x9c\x2e\x56\xf3\xbb\x0c\xcb\x47\xcc\x96\x8b\xdb\xf9\x6a\xbe\x5c\x64\x58\xfe\x84\xe9\xe2\x0b\xee\xe7\x8b\xdb\x73\x10\xfb\x9a\x2c\x68\xd7\xd9\xa0\xdf\x58\x70\xb0\x91\x8a\xe0\x59\x46\xf4\x4e\x40\x69\x0e\x82\x5c\x47\x39\x97\x9c\xa3\x51\xba\xea\x55\x45\xa8\xcc\x2b\x59\xcd\xba\x42\x47\xb6\x65\x17\x3e\xa6\x83\xd2\x85\x88\xd1\x70\xcb\x5e\xf9\x71\xe5\x5f\x87\x4a\x85\xa0\xbc\x36\x88\x7e\x26\x4d\x56\x05\x47\xe0\xa8\x29\x13\xc7\x95\xa6\x02\x39\x59\x1f\x89\x76\x5b\xb0\x45\xd2\x41\x86\xb9\x13\xa6\x23\xed\x5c\x13\xec\x46\xb2\xbb\xba\xf8\x01\x89\xab\xd5\xe5\xd5\x27\x24\xda\x14\xe4\x90\x14\x6a\xef\xf0\xdd\xa7\x2b\x24\x9a\x86\x2d\xed\x61\x9d\xba\xbe\xbc\xf8\xfe\x33\xd6\x22\xd9\xd2\xde\xf4\xfe\x48\x26\x3b\xcb\xaf\xca\xd3\x3d\xed\xd3\x00\x5c\x8b\xe4\xab\x62\x78\x87\xa3\x2a\x4f\x69\x6e\x7d\xa8\xba\x7e\xf3\x27\x22\x39\x9b\x3c\xdd\xcb\x6c\x35\x79\x56\x76\xe0\x7c\xeb\x6a\xb6\x24\x1f\x26\x0f\xa4\x5a\xd6\x95\x37\x5a\x2e\x27\x4b\x5b\x2d\x54\x4b\x72\xf9\x34\x99\xaf\x70\x4b\x9d\xb2\xbe\x25\xed\xe5\x6c\x31\xa1\x9d\x6a\xbb\x86\xd2\xdc\xb4\x51\x08\xd4\xbc\xc4\x40\xff\xb7\x04\xdb\xeb\xd1\x49\xa3\xf1\xcc\xba\x30\x83\x3b\x87\xdb\x72\x87\xc6\xa8\x22\x14\x0e\xf6\xe9\x7e\x87\xd4\x19\xb4\xa6\xe8\x1b\x72\xa9\xe0\x12\xbf\x21\xfa\x70\xda\x6b\xd5\xd2\x59\x84\x09\xa2\x63\xff\xcb\x62\x15\xe1\xf7\x9b\xd0\xa8\xc5\x49\x48\x62\xc2\x48\xee\x10\x39\xf9\xc7\x69\x60\x7d\x39\x90\xbc\x71\xad\xa5\x2e\xb6\x2f\x21\x01\xc7\x42\xea\xcc\xcd\xd9\x07\x19\xaf\x3f\xca\x08\xb9\xd1\xa5\xd4\x15\xeb\x5d\x1a\x86\xdf\x48\x58\xed\x0e\x84\x4d\xaf\xfe\x1b\xd2\xbe\x73\xde\x92\x6a\xbf\x85\x5d\x9c\xc4\x58\x2c\x57\x77\xa7\x79\xa3\xfa\x82\xfb\xcd\xd9\xf5\x3b\xbb\x47\x28\x06\x6e\x1a\x78\xb5\x3d\x84\xa0\x53\xbe\x76\x21\xb8\x61\xf2\x0f\xd7\xe1\x37\xa4\x42\xf4\x1b\xe5\xf9\xf5\x08\x4c\xc5\x49\xde\x16\x90\x19\xe4\x0c\x51\xbb\x6d\x58\x6f\x21\x6f\x31\xbb\x5e\xaf\xc3\xed\xb5\xe4\xfc\x7e\xbd\x1e\x2f\xd9\xb8\x38\x8e\x22\x51\xf2\x5b\x20\x32\xaf\xec\x18\x87\x71\xaf\x48\x1c\x34\x25\x15\xa2\x42\x51\x6b\x34\x4c\x59\xde\x44\xe2\xef\x00\x00\x00\xff\xff\x69\x7f\x73\x9a\x95\x05\x00\x00") func testImagesEchoserverRunShBytes() ([]byte, error) { return bindataRead( @@ -4601,7 +4697,327 @@ func testImagesEchoserverTemplateLua() (*asset, error) { return a, nil } -var _testImagesImageUtilSh = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xdc\x5a\x5f\x77\xdb\xb6\x92\x7f\xe7\xa7\x98\xc2\xda\xca\xce\x9a\xa4\x9d\xf4\x36\x89\x52\x9d\x53\xc5\x56\x13\x6f\x1c\xab\x57\x72\x9a\xf4\xc6\x59\x1d\x88\x84\x24\x5c\x93\x00\x0b\x80\x96\x7d\x6d\xe5\xb3\xef\x19\x00\xa4\x48\xd9\x4e\xee\xc3\x9e\x7d\xd8\x9e\x9e\x58\x04\x81\xc1\x60\xfe\xfe\x66\xc0\x9d\x1f\xe2\x52\xab\x78\xc6\x45\xcc\xc4\x15\xcc\xa8\x5e\x06\xc1\x0e\x1c\xc9\xe2\x46\xf1\xc5\xd2\xc0\xd3\x83\xc3\xe7\x70\xbe\x64\xf0\xae\x9c\x31\x25\x98\x61\x1a\x06\xa5\x59\x4a\xa5\xa3\x60\x27\xd8\x81\x53\x9e\x30\xa1\x59\x0a\xa5\x48\x99\x02\xb3\x64\x30\x28\x68\xb2\x64\xd5\x9b\x7d\xf8\x83\x29\xcd\xa5\x80\xa7\xd1\x01\xec\xe2\x04\xe2\x5f\x91\xbd\x57\xc1\x0e\xdc\xc8\x12\x72\x7a\x03\x42\x1a\x28\x35\x03\xb3\xe4\x1a\xe6\x3c\x63\xc0\xae\x13\x56\x18\xe0\x02\x12\x99\x17\x19\xa7\x22\x61\xb0\xe2\x66\x69\xb7\xf1\x44\xa2\x60\x07\xfe\xf4\x24\xe4\xcc\x50\x2e\x80\x42\x22\x8b\x1b\x90\xf3\xe6\x3c\xa0\xc6\x32\x8c\xff\x2d\x8d\x29\x7a\x71\xbc\x5a\xad\x22\x6a\x99\x8d\xa4\x5a\xc4\x99\x9b\xa8\xe3\xd3\x93\xa3\xe1\xd9\x64\x18\x3e\x8d\x0e\xec\x92\x0f\x22\x63\x5a\x83\x62\x7f\x95\x5c\xb1\x14\x66\x37\x40\x8b\x22\xe3\x09\x9d\x65\x0c\x32\xba\x02\xa9\x80\x2e\x14\x63\x29\x18\x89\xfc\xae\x14\x37\x5c\x2c\xf6\x41\xcb\xb9\x59\x51\xc5\x82\x1d\x48\xb9\x36\x8a\xcf\x4a\xd3\x12\x56\xc5\x1d\xd7\xad\x09\x52\x00\x15\x40\x06\x13\x38\x99\x10\x78\x3d\x98\x9c\x4c\xf6\x83\x1d\xf8\x78\x72\xfe\x76\xf4\xe1\x1c\x3e\x0e\xc6\xe3\xc1\xd9\xf9\xc9\x70\x02\xa3\x31\x1c\x8d\xce\x8e\x4f\xce\x4f\x46\x67\x13\x18\xfd\x06\x83\xb3\x3f\xe1\xdd\xc9\xd9\xf1\x3e\x30\x6e\x96\x4c\x01\xbb\x2e\x14\xf2\x2f\x15\x70\x14\x23\x4b\x51\x66\x13\xc6\x5a\x0c\xcc\xa5\x63\x48\x17\x2c\xe1\x73\x9e\x40\x46\xc5\xa2\xa4\x0b\x06\x0b\x79\xc5\x94\xe0\x62\x01\x05\x53\x39\xd7\xa8\x4c\x0d\x54\xa4\xc1\x0e\x64\x3c\xe7\x86\x1a\x3b\x72\xef\x50\x51\x10\x68\x66\x20\x94\xc0\x94\x62\xd7\xdc\x54\x8f\x42\x96\x42\xb3\xfa\xb1\xe0\x05\x9b\x53\x9e\x05\xc1\xf9\x60\xf2\xae\xdf\x39\x0c\x3e\xbe\x1d\x9c\xf7\x3b\x4f\x9d\x2d\x0a\xc1\x12\x94\x26\xca\x96\xc2\x98\xe5\xd2\x30\x38\x96\xc9\x25\x53\x95\x4e\x34\x24\x4c\x19\x64\x9b\xa2\x85\xe2\x59\x68\x69\x96\x4c\x18\x1c\xe1\x52\xec\xc3\x6a\xc9\x93\x25\x24\x54\xc0\x0c\x0f\x5b\x5a\xf6\xa9\x71\xe6\x56\x50\xb3\x8c\xe0\xf5\x0d\xa4\x6c\x4e\xcb\xcc\xec\xe3\x31\x6e\x5a\xb3\x51\xad\x78\xb6\xce\xed\xdb\xd1\xfb\xe1\x1a\xe6\x32\x4b\x99\x8a\xe0\x23\xeb\x2a\x34\xd5\x62\xc3\xe4\x9c\x5b\xe2\x4b\xa6\x18\x90\x28\xb5\x9c\x86\x9d\x5b\xa9\xa7\x57\xce\x15\xd6\xc4\x2f\xd7\x15\x5b\x52\xa0\xe5\x6a\xbb\x83\x60\x09\xd3\x9a\xaa\x9b\xd6\xa1\xa2\xe0\x78\x74\xf4\x6e\x38\x9e\x1e\x0d\xc7\xe7\xd3\xd7\x83\xc9\x70\xfa\xfb\xe0\xfc\x6d\x9f\x74\x6e\x1f\x7c\xd1\x0b\x3d\xa7\x6b\x12\x04\xef\x3e\xbc\x1e\x4e\xc7\xa3\xd1\x79\x9f\x74\x76\x93\x14\x48\x67\x37\xe5\x4a\xd0\x9c\x01\xe9\xdc\xbe\x1e\x4c\xde\x4e\x27\xa3\x0f\xe3\xa3\xe1\xe7\x83\x2f\x6b\xb2\x17\x47\x51\x1c\x45\x04\x7e\xfc\x11\x8a\x55\x0a\xe1\xef\x7b\x24\xd0\xb2\x54\x89\x9d\x5e\x13\x5b\xc7\x4b\x9a\x5c\xc6\x19\x9f\xc5\x99\x5c\x2c\xb8\x58\x44\x7a\xf9\xbd\x99\xa5\xe1\x99\x9d\x16\xec\xc0\x7b\x5a\x14\x28\x33\x39\x87\x85\x84\xc1\xf8\xe8\xad\xd5\x71\x62\x4a\x9a\x01\x55\xc9\x92\x1b\x96\x98\x12\xf5\xab\x97\xbc\x28\x58\x0a\x05\x55\x06\xe7\xe7\x65\x66\x38\x4e\x89\xff\x62\x79\x19\x96\x9a\xa9\x50\xa3\x25\x26\x50\x28\xf9\x4f\x96\x98\x20\x65\x49\x46\x15\x83\x70\x00\x7f\x1f\xbe\xff\x80\xe4\x27\xfd\x5d\xf8\x4c\x68\x9e\xfe\xfc\x13\xf9\xd2\x27\xd7\x2f\x7e\x9e\xfe\xfc\x13\xc1\x21\x95\xe3\x00\xfe\x71\x4f\x6e\x02\xc5\x1d\xdc\x8c\xa2\x48\x7e\xfe\x29\x63\x38\x5a\xfd\x84\xcf\x44\x3f\x7b\x79\x70\x8d\x63\xee\x07\xec\x05\xc1\x8a\x8b\x54\xae\xf4\x74\xa3\x6e\xdd\xdf\x3d\x7c\x71\xf0\x12\x0e\x5f\x1e\x3c\xc3\x7f\x5e\xc2\xd3\x83\x83\x9f\xf6\x9a\x0c\x7e\x3c\x39\x3b\x1e\x7d\x9c\x4c\x47\x93\xe9\x1f\xc3\xf1\x04\x7d\x79\xfa\x7e\xf0\x7b\x10\x70\xc1\xcd\x47\x47\x71\xa4\x7d\x24\xd5\xbb\x7b\x70\x1b\x80\x35\xf3\xcd\x2e\x68\xa0\xa4\x73\xfb\xc0\xf6\x9f\x7f\xfd\xb2\x26\xaf\x20\x95\x01\x06\x3f\x9e\x2f\xa6\x33\xaa\x59\x9f\xe4\x89\x8a\x72\x9e\x28\x89\x51\x2a\x4a\x64\x1e\xfb\xc5\xb1\xa0\x42\x6a\xa6\xae\x98\xea\xb5\xed\xd6\x52\x98\x97\x59\x56\x0d\xf5\x3b\xbb\xce\xc0\x21\xa7\x82\xcf\x99\xc6\x78\x8d\x31\xc4\x20\x33\xd5\x5e\x6b\x02\x77\xb0\x50\xac\x00\x22\x75\xe4\x97\xe2\xd8\x92\xd1\x14\x42\x01\x87\x70\x07\x74\x75\x09\xdd\xdb\x42\x71\x61\xa0\xf3\x74\xdd\xdd\x83\xbb\x3b\x30\xaa\x64\x76\xd3\x47\x24\xf4\x99\xb4\x19\xfc\x82\x0e\xd1\x64\xd0\xf2\x9c\x4a\xc1\x82\xf5\x23\xd2\x44\x4b\x1c\x33\x53\x2a\xa1\x21\xe3\xda\x9a\x17\xcd\x32\xd0\x65\x51\x48\x85\xd1\xb8\x6d\x8a\x73\x25\x73\x0c\xc9\xc3\x93\xf7\x83\x37\x43\x9b\xaa\x02\x5c\x37\xd2\x03\x95\x2c\x2b\xe5\xf0\x9c\x2e\x18\xc6\x32\x80\xa4\x34\x10\xa6\x40\xfa\x04\xc2\x39\x1c\x3a\xc1\xd0\x05\x5b\x93\xb8\x26\x83\xdc\xe9\x22\xe3\x9e\x8a\x27\xd2\x22\x03\xa8\x6c\x64\xc5\x46\x46\xfb\x72\x0e\x9f\x3f\x43\xc7\x0f\x43\xff\x2b\x44\x4f\x62\xfb\x3f\x7c\xf9\xf2\x0a\x83\x89\xb0\xf3\x00\x76\xac\xb1\xf8\xa3\xef\xc3\x8a\xc1\x92\x5e\x31\xf4\x36\x7f\x4a\x98\x49\xb3\x84\xd3\xf3\x09\x06\x76\x98\x0c\x8e\x20\x59\x52\x21\x58\xa6\x31\x89\xc1\xca\x46\xb9\x59\xc9\xb3\x14\x1d\xd6\x7a\x5f\x91\xb1\x8a\xa2\x63\x53\x47\xf5\x6e\x18\xc7\xe6\x52\xe5\xd4\xf8\xc4\xc2\x35\x24\xd4\xe6\xb9\x1e\x8c\x26\x31\x3a\x63\xbc\x51\x65\xb5\x50\xea\x29\x06\xa5\x7e\x67\x97\x25\x4b\x09\xa4\x3a\x1a\x9a\x4a\x25\xc5\xd8\x49\x71\xcf\x2f\x71\x02\xf9\xee\xfc\xa7\x7b\x9b\x2d\x36\xa6\xfb\xbd\x55\xcf\xaa\x55\xba\x9c\xcf\xf9\x75\xdf\x4e\x45\x0e\xc3\x0e\x2e\x08\x3b\x1b\x6a\xce\x35\x58\xf6\x88\x4e\xb6\x15\xf2\x7f\x7b\x52\x42\xbe\x79\x8e\x8a\x77\xcd\xfc\x34\xb7\x07\xe2\xbe\xb6\x9d\xd7\x28\xa1\xb2\x60\xa7\x78\x44\x2f\x08\xdf\x0a\x25\x0b\xa6\xb2\x1b\xaf\x7a\xc3\xd2\x08\x86\x36\x33\xb2\x14\x98\x30\x8a\x33\x6d\x6d\xce\x60\x14\xb7\x48\xae\x2b\x75\x8c\x2c\x74\xf7\x7d\x9a\xed\x5a\x7f\xc6\xa1\x75\x17\x43\x89\x61\x34\x8d\x2a\xf6\x11\x44\x80\xf3\x85\x39\x47\x97\xd9\x78\x2e\x86\x19\xc7\x8c\xf0\x38\xac\x44\x58\xca\x85\x87\x0a\x35\xfb\x54\xdc\xc0\x82\x5f\x31\xd1\x72\xeb\x60\xc1\xcc\x6b\xaa\xd9\x09\x92\xf0\xde\x57\xbb\x1b\xee\xe8\xa2\xd7\x86\xb9\x3e\x69\xc8\xa6\xd2\x41\x1f\xc2\xf9\x53\xc7\xd7\xb9\x85\xb1\xa5\x48\x10\x7e\xc0\x8a\x67\x99\x73\x1f\x30\x36\x46\x5a\x4e\x2d\x3b\x59\x66\x25\xda\x8a\x31\xc1\x0e\xe4\x08\x5e\xa4\x70\x47\x68\x6b\x21\x82\x13\x87\x45\xe8\x4c\x33\xc4\xc4\x72\xbe\x35\x03\xb1\x22\x37\xcd\x5d\x9b\x5b\xb5\x03\x9b\x8b\x79\x21\xd8\xac\xb8\x0f\x54\xe5\xb8\xda\xa6\xc0\x7d\xf0\xa9\x6e\x1f\x6c\x7e\x0b\x2c\xad\xfb\x01\x4e\x96\xa6\x28\xcd\xd4\xdc\x14\x0c\x63\x13\xc6\x5b\x14\x79\x65\x7e\xd3\x64\xc9\x92\x4b\x0c\x59\xce\x39\xc2\x79\x6d\x3f\x9b\x00\xd8\x76\x10\x2f\x65\xdd\xef\xec\x36\x42\x2b\x90\x8e\x5d\x46\xd0\xc4\x6b\x73\xdd\x81\x42\xb1\x82\x89\x14\x32\x2e\xca\xeb\x18\x75\x8f\xc7\xac\x93\x3e\x70\xc3\x72\x1f\x9c\x1a\x84\x6d\xa6\x99\x43\xd7\xad\xfa\x0f\x7d\x21\xba\xa8\xe0\x1f\xea\x75\x9f\x9f\x20\x18\x0a\xac\xad\x05\x00\x97\xe5\x8c\xf5\x7a\x88\x5f\x7a\x3d\x26\x74\xa9\x58\xb8\x10\x65\xa8\x59\x1a\x6c\x92\xb1\x95\x28\x17\x50\x1b\x8a\x5e\xd7\x99\xb7\x11\xdf\x1b\x39\xa0\x69\x54\xa4\x11\xd6\xdd\x30\x3a\xe9\x9a\x40\xbf\x0f\xc4\x27\x67\x0b\xcb\xf0\xe5\x46\xe8\x7e\x82\x93\x3a\xd9\x0e\x35\xce\x99\x8f\xa8\x40\x17\xf5\x36\xb8\x64\xde\x04\xbb\x15\x1f\x5d\x7b\x82\x0d\x2b\x11\xbc\x2e\x79\x66\xea\x08\xef\x21\x2a\x53\x3e\xd6\xd7\x6e\x36\x63\x50\x94\x7a\xe9\x1e\x28\x28\xb6\xc0\x3a\xe6\xa6\xf6\x59\x5c\xc8\x85\xcf\xe2\x4e\x92\x15\x4f\xaf\xab\x7c\xb2\x71\x87\x3a\xb0\xf8\x24\xd1\x6b\xb2\x14\x45\x24\xf0\x2a\x3f\x52\x8c\x1a\x06\x14\x0c\xcb\x0b\xa9\x10\x2d\xa7\x5c\xb1\xc4\x48\x65\xc3\x0f\xb0\x2b\xa6\x6e\x5a\x5e\x65\x33\x9b\xad\x0c\x37\xc7\x47\xe6\x98\x30\x9e\x28\x4e\xd8\x16\x90\xcd\xf6\x0f\x6c\x62\x97\xe4\x97\x29\x57\x10\x16\x6d\xb0\x4b\xe2\xa9\xc9\x0b\x3b\x01\x17\x4e\x53\xae\xfa\x9d\xdd\xfc\x12\x1f\x6c\xa0\xbe\x3f\x39\xc6\xa8\x10\x3a\xc9\x86\x96\x85\xe8\x93\xfd\xcf\x05\xf3\xa6\xe9\x19\x45\x8b\x29\x4d\x53\x20\x2a\x87\x50\xa1\x2f\x55\xbb\xac\x09\x0c\x3f\x9d\x9c\x3b\x19\x25\x05\x84\xaa\x89\x35\x9e\xe0\xc3\x66\x6a\xc3\xd4\x9a\x0e\xf9\x9e\x5e\x32\x1b\x2b\xef\x21\x88\x9c\x5e\x32\x98\x71\x1f\xcc\x0c\x3e\x25\x08\x5f\x3d\x5c\x42\x91\x15\x8a\xd9\x8a\x4c\x73\xe3\x2d\x84\xa5\x2d\x04\x52\x23\x08\x9c\xed\x81\xa3\xdd\xd8\xcf\xb2\x7b\x84\x47\x4d\xf7\xc0\x1d\x47\x93\x7e\xcb\x1d\xd0\x32\x70\xc4\x39\x0d\x9c\x0f\xc6\x6f\x86\x58\xdb\x6c\x1f\x6f\xce\xed\x1f\xb4\xcf\xf4\x81\xd3\xef\x78\x1d\x1b\xba\xb0\xcf\xe7\x83\x37\xfd\xce\xee\x2f\x1e\x94\xec\x05\x6d\x11\x3d\x12\xaa\x60\xf3\xa2\xdf\xd9\x6d\xa6\x91\x96\x67\xc3\x1d\x74\x6e\x27\xc3\xe3\x35\x10\x7d\x37\x1e\xbe\x39\x99\x9c\x8f\xff\xbc\xeb\xdc\x56\x3f\xd7\x77\x0b\xe2\x77\x44\xc6\xce\x46\xe7\xc3\xdd\x24\xa3\x65\xca\xcb\xd9\x5e\x0f\x26\x32\xdf\x46\x5b\x90\xdb\x16\x8d\x2f\x81\x91\x21\xae\x40\xae\x9a\x09\xaf\x26\xb7\x5a\xa2\x4a\x35\xd6\xff\x4c\x81\x14\x4c\x3b\x2d\x0a\x69\x22\x38\x99\x6f\xe3\xbb\x16\x58\xb4\xd1\x1b\xf8\xbc\x26\x46\x36\x1b\x4c\xeb\xa0\xc4\xae\xb9\x36\xb6\xc9\x80\x34\xfd\xdc\x74\x33\xd1\xa2\x9d\xc6\xca\x2a\x3c\x54\xc1\xce\x2b\x97\xc0\x56\xa4\x0b\xe7\x0f\xef\xb7\xa5\x83\x6f\xee\x55\xaf\xf2\x93\xab\x28\x04\x95\x4a\x42\x8e\x5a\x41\x3d\xa2\x65\xdd\x79\xc3\xba\x5b\x10\xe8\x6c\x91\x6d\x45\xb1\x9d\x4d\x38\xb1\x55\xe8\x93\xaa\x04\x9d\x71\x81\xc1\xc2\xc8\x96\x8d\xdb\x68\x59\x87\x17\x8b\xa1\xdb\x01\xca\xcd\x92\x02\xae\x5f\xfc\x0c\x45\x46\x0d\xe2\xa8\xca\x08\x2d\x00\x09\xff\x02\x72\x34\x1e\x4d\x26\xd3\xd7\x1f\x4e\x4e\x8f\xa7\xa4\xa1\xec\x96\x3c\xea\x1c\xe2\xad\x0f\xf3\x83\xab\x7b\xef\x4b\xae\x21\x84\xb8\x49\x3c\x4e\xc9\x7d\x5b\x6a\xa0\xc4\x2d\xf1\x55\x79\xf3\xae\x73\xbb\x49\xa1\x16\x5f\x7e\xb1\xa2\xbc\x47\x0a\x05\x38\xb6\xe9\x82\xa9\x2d\x01\x56\x70\x65\x03\x55\x0a\x25\x13\xa6\xb5\x54\xba\xea\x0b\xa2\x10\x93\x52\x29\x26\x0c\x5a\x74\x4d\xd4\xe5\x96\x8a\x30\x9a\xf3\x03\xca\x41\x24\xea\x3b\x3a\x97\x4c\x09\x96\x91\x7a\x7d\x26\x13\x8a\x3b\xa7\x72\x83\x9b\xeb\x5a\x6b\x97\xa7\x10\x96\x7b\xf0\x43\x1f\x0e\xee\x4b\x12\xdc\x32\xfc\xa7\x1e\xf3\x31\xc8\x89\x0b\xdf\xac\xb7\x5a\x23\x66\xc9\x55\x3a\x2d\xa8\x32\x37\xf1\xe3\x6d\x8d\x58\xf9\x03\xd5\x3f\x22\xbd\x24\x10\x86\x8a\x69\x66\xea\x2d\x92\x52\x65\x10\xea\xc9\xa9\x6d\x72\xea\x5e\x1c\x2f\xb8\x59\x96\x33\x5b\xde\x7f\x93\x7a\xc6\xa8\x66\x3a\x4e\xe5\x4a\x64\x92\xa6\x31\x71\x6a\xf4\xc1\x70\x4d\x62\xd7\x2d\x99\xda\xa5\xe4\x01\x1d\x13\x4f\x2b\x32\x54\x45\x8b\x7f\xc1\x1d\x18\xaa\x20\xbc\xfe\x97\x0f\xe8\x5b\xc1\xd7\xe9\x7f\x68\x81\x14\x16\xa4\xa9\x14\x5d\x03\x0b\x66\x40\x97\xaa\x50\x5c\xbb\x4e\x6b\x99\x53\x7d\x09\x9a\x19\xc3\xc5\x42\x6f\xce\xb9\xcc\x65\x0a\x07\xcf\xff\xf6\xb7\x16\x69\x77\xb0\x07\x98\xf3\xbc\x91\x07\x4d\xb7\x6d\xf5\xf1\x43\xb6\xea\xb5\x58\x79\xbe\x77\x6b\xeb\xcd\xd7\xde\xa9\xc3\x50\xc8\x30\xb1\xbd\xef\x30\x2c\xca\x2c\x83\x30\x74\x20\xad\x6f\x91\xf1\x3d\xcc\x16\x86\x95\x8f\x37\xc1\x5e\x5c\xfb\xec\x45\xcd\x6c\xe8\x30\x41\x48\xd5\xa2\x91\x6d\x5c\xeb\xce\x3d\x58\x72\x9b\x49\x55\x56\xc1\x39\x75\x86\x69\x4f\xd9\x54\xdf\xfd\xad\x1e\x4a\x73\x63\xdb\xc6\xa9\x29\xc4\x55\x5a\xee\x75\x6e\xcf\x07\x6f\xd6\x21\x5a\x34\x56\x94\x6b\x5b\x7a\x92\xce\xed\x56\xb8\x5c\x13\x88\x9c\xc4\x0a\x59\xa4\x8d\x4e\xcc\x43\x15\x82\x2f\x2c\x76\xb6\xa4\xbb\xa4\x1a\x66\x8c\x09\xe0\xc2\x28\x99\x96\x89\xab\x89\x0e\x5f\x46\x07\xcf\x7c\x73\xa2\x06\xa3\x16\x3f\x54\x16\x65\x5b\x1c\xdc\x26\xa3\xf6\x76\x9b\xa6\x55\xd5\x3b\x0b\x43\xdf\xad\xe8\xde\xde\x46\x47\x19\x67\xc2\x44\xbe\x3f\xb4\x5e\x77\xeb\xfa\x8e\x84\x78\x4e\x5b\x91\xfb\x78\x70\xdb\xa6\xbc\xc6\xc0\x60\x39\x8b\x0e\x30\x7b\xdd\x7f\xff\x4b\xfd\xba\x15\x3d\x5c\xd0\x7a\xcf\x05\xcf\xcb\x1c\xb6\xb8\xab\x56\xf0\xc6\x25\x04\x46\xc8\x52\x63\x74\x6b\x49\xab\x77\x7f\xcb\x2f\xbe\xbc\xaf\x6a\xe7\xaa\x72\x7e\xa0\x42\x45\xa0\x74\x0f\x9a\xe9\x00\x87\xef\x57\x7d\x8f\x15\x79\x1e\x45\x35\x90\x67\x0d\xa8\xfe\x5f\x57\x80\x3b\xf6\xa2\xac\x6e\x83\x26\x32\xcf\xb1\xa0\xe0\x1a\xb4\x41\xe1\xb2\xeb\x82\x29\x8e\x75\x3d\xcd\x80\x6a\xc4\xcd\xfe\x16\xe3\xf0\x45\x74\xf0\x32\xc2\xc2\x99\x5d\xdb\x66\x5c\xd5\xd1\x3f\x3d\x99\x0e\x3f\xfd\x3e\x1c\x9f\xbc\x1f\x9e\x9d\x0f\x4e\xfb\x84\x09\x3a\xcb\x58\x4a\xec\x76\x36\xf2\x6f\x36\x44\x31\xbd\xf2\xa0\xdb\x5e\x9a\x51\xcd\x36\x9d\x3a\x8f\x19\x11\xb0\xcf\x18\x9a\xcd\xcc\x96\x77\xb1\x2f\xde\x50\x36\x15\xa5\xfe\xee\x9e\xa5\x8f\xa5\x40\x2d\x2e\xd7\x26\xe0\xc2\x48\x0f\x53\xaa\xd9\x11\x0c\x17\xbd\x4a\x86\x16\x62\x78\x2d\xf8\xde\x41\x17\xb5\xd1\xfd\x56\x10\xb1\xd3\x43\xb7\xf4\xfb\xf3\x2a\xb2\x01\x78\x54\x7b\xf2\xdb\xa4\xdf\xed\x82\xb2\xad\x64\x85\x9b\x33\x2c\xb9\x6b\x06\xff\xb3\xbf\x4b\x3a\x38\x4a\xf6\x5e\xd9\xf8\x03\xbf\xc0\x2f\x5b\x6d\x34\xdd\xc2\xe7\x5f\x2f\xe2\xaf\xe1\xd7\x45\x63\x2c\x64\x38\xfc\xf9\xbf\xe1\xcb\x93\xaf\x9d\x8a\xc3\x8b\xd8\x19\x63\xaf\x73\x3e\x78\x73\x11\xfe\xf8\x75\x61\x6d\x65\xbb\x1f\x9e\xb8\x52\x35\x0c\x69\x8e\x26\xfa\xad\x78\x6a\x9b\x01\xd5\x42\xdb\xb6\x77\x86\xf5\x91\x79\xb8\x6e\xc3\xdc\x92\xd9\x16\x7c\x5d\x6a\x83\xbd\xc8\xe1\x02\xa4\xb2\x37\x70\x12\xd3\xa5\x9d\xd6\xea\xb6\x37\x40\x7d\xa3\x5f\xbb\x83\xf0\xdf\xb5\xf4\x6a\xb6\x20\x4d\x98\xc6\x6c\x6c\x23\x28\x15\x37\xa0\x33\xaa\x97\x4c\xef\x03\x37\x90\x33\x6a\x6f\xaa\xa8\x01\x6e\xba\x1a\xf1\xaa\x3b\x32\xc2\x8c\x00\x6a\xb6\xa6\x85\x62\xb6\xd9\x48\x6a\xbf\xff\x01\x6a\xe1\x3d\xd2\x19\xbd\xb7\xd8\x91\x8e\xb8\x8c\x49\xe0\xd3\xb0\x73\x34\x6f\xd0\x1e\xc4\xb5\xbc\xc0\x5a\xb9\x36\x12\xe3\xa4\x45\x73\xd9\x4d\x64\xd7\xb8\x5b\x37\x88\x5d\x33\xd3\x89\x4d\x03\xcd\x72\xa9\x9d\xc0\x34\xcd\xd9\xbe\xdd\xc2\x76\x27\x29\xcc\xd9\xca\x76\xc2\xbd\xb4\xaa\x6d\xa6\x76\xf7\xa9\xa3\xb7\x69\xca\xde\x6e\xb1\xbf\xfe\xa6\xae\xef\x00\x31\x0e\xd1\x77\xf1\xdd\xf4\x6e\xb1\x79\x8e\x7b\x71\x18\xbb\x62\xf0\x7f\xb1\xab\xb4\x6d\x96\xb6\x1f\xe4\x0c\x53\xea\x76\xb7\x29\x0c\xa9\xa7\xe6\x91\xc8\x77\x6d\xf6\xdf\x41\x08\x55\xcd\xf4\xdb\x3d\x3b\xb4\x17\x12\x34\xd3\xb2\xce\xe3\x5c\x24\x59\x99\xb2\xfb\x46\xfc\x90\xba\x2d\x08\xc0\xd1\x8a\xaa\x90\x69\x95\x18\x12\x2a\xc0\x62\x31\xd7\x9e\x90\x45\x5d\x8c\x71\x63\x77\xf3\x59\xe1\x9b\x65\xe8\x16\xce\x6f\xdd\x7f\x91\xce\xed\x63\x57\x53\x8d\xdb\x81\x2f\xd5\xf1\x91\xa7\x81\xb3\xb5\x5c\x62\x2e\xd8\x7f\x5c\x31\xa9\x74\x5e\x48\xb3\x4c\xae\xa0\xd4\x4d\xcf\xde\xc8\xa4\xba\x9f\xc9\xb2\xea\x4e\xa7\xde\x88\x1b\x90\xa5\xd2\x2c\xbb\x62\x3a\x6a\x67\x27\xeb\x26\xad\xfb\x6d\xef\x28\x98\x99\xfe\x6b\x32\x3a\xab\x2f\x73\xd0\x26\x43\x6e\x7b\x49\x3a\xde\xbd\x20\x52\x5f\x90\x8b\xde\x45\x25\x9d\x0b\xb2\x17\x5f\x1c\xec\x5f\x34\xb4\x74\x41\x7a\x9d\xa6\x8c\xe2\x26\xa2\x24\xfe\x5a\x3a\xf6\x17\xe3\x71\xc5\x92\x8e\x37\xa1\xaf\xe5\x5e\xeb\x47\x5f\x34\x8d\xab\x06\xe9\xa9\xab\x05\xb7\xa5\x6a\xa1\x0d\xe2\x72\xe5\x1a\x33\x8f\xdb\xf3\x43\xe8\x88\xeb\x76\xfb\x6a\x70\x76\x6c\x29\xd6\xcd\x4b\x1d\xc1\x07\xcd\xe6\x65\x86\x96\xd4\xb9\xfd\xf8\x76\x70\xbe\xc6\x55\x84\x66\x59\x98\x48\x61\xe1\xa5\x48\x18\x89\x2a\xda\x36\xa0\x3b\xd5\xfa\x50\xd6\x6a\xa6\xf2\x3c\x67\x29\xa7\x86\xa1\x4a\xe6\xc6\x7d\x59\x71\xd3\xbd\x62\x0e\x0b\xdb\xec\x1d\xb9\x86\xfc\x94\x8a\x74\xfa\x30\x46\x73\x95\x49\x33\x2c\x54\x11\x0a\x25\x66\x65\xb2\x79\xf9\xef\x1c\x1c\x6d\x6f\x21\x21\x41\x0f\x9b\x71\xe1\x77\x74\x25\x33\x06\x8b\x07\x82\x3e\xe9\xdc\xda\x4e\x6e\x58\xb5\x21\x54\xbe\xe5\x52\xad\x85\x6f\x46\x83\xf1\xfb\x7e\xe7\xd6\xfe\xed\x85\xcf\xd7\x75\xdc\x47\x46\x26\xe3\x23\x77\xd1\xfd\x2b\x79\x65\xb5\xbc\x51\xb5\x2a\x11\xc7\xab\x1c\xc2\x2b\xdc\xd3\x35\x05\x9d\x56\xdd\xaf\x7f\x10\xff\xaa\xd1\x7d\xed\xc5\x0b\x19\x6b\x95\xc4\x97\x2f\x34\x26\x99\xcb\xfa\x3b\xa7\xde\x3f\x1a\x56\xbb\x90\x19\x15\x8b\x1e\x41\xb6\x4e\x07\x67\x6f\xa6\x75\x59\xdc\x98\x64\xbf\xa3\x9a\x51\xb4\xb3\x04\xc8\x45\xa3\x2b\xe0\x6b\xd6\x14\x1e\xdd\xcd\x36\x80\x63\x67\x08\x71\xe7\x76\x32\x3e\x9a\x1e\x9f\x8c\xd7\x58\x43\xdc\x27\x74\xf4\x66\x34\x1d\x9e\x0d\x5e\x9f\x0e\x8f\xfb\x07\xe0\xa2\x74\x95\x71\xe0\xcd\x68\x34\xe9\x77\x6e\x47\x13\xfc\x69\x1b\xa5\x4e\xfe\x6b\xd4\x9b\xaf\x54\x29\x84\x5c\x68\x43\xb3\xcc\xf9\x0f\x24\x0b\x09\x61\x98\xa5\xf3\x8c\x2e\x34\x74\xc3\x55\x17\x42\x09\xb5\xe8\x1c\x47\x6b\x88\xe2\xd6\x87\x23\x38\x46\xf6\x9a\x17\xec\x7a\xc9\xe7\x26\x08\x6a\xc5\x5b\x3f\xf0\x6a\xdf\x72\x84\xa6\x09\xdc\xef\x77\xd6\x57\x03\x4f\x06\xa7\xa7\x4f\x36\xfd\xf8\xe6\x67\x46\x0f\x4b\xaf\x4a\xf2\x86\x5e\x22\xde\x15\xc0\xae\x8d\x62\x39\xcb\x6e\xec\x46\x99\x44\x2b\xe6\x39\x83\x5d\x66\xbf\x75\xb2\x41\x4f\xcb\xbc\xda\x60\x6f\xdf\xde\x03\x34\x46\x2c\x9c\x50\x54\xa1\x2b\xda\x4b\x45\x7c\x5f\x3d\x17\x29\x35\x2c\xad\x52\x90\x62\x5d\x6d\xb7\x11\x12\x0a\xc9\x85\xfd\x7a\x4d\xb1\xda\x7d\x68\x96\xf9\xef\xd2\x72\x7f\x43\x81\xac\x44\x8d\x88\x20\x45\x76\xd3\xe8\x12\x1e\x6d\x24\x16\x2a\x96\xe1\x5e\x2d\xf0\x76\xcc\x75\x52\x6a\x64\x2a\x2d\x6d\xaf\xab\xb1\x00\x46\xf3\x39\x4f\x18\xbc\xc5\x24\x00\xef\x19\xb3\x1f\x28\xed\x3e\x3d\x38\x7c\x19\x1d\x3e\x8d\x0e\x9f\xef\xf5\x2c\x8d\xaa\x53\x94\xca\x44\x47\x0b\x29\x17\x19\xb3\xed\xa2\x54\x26\x25\xa6\xa8\x38\x8d\x0f\x3f\x3e\x3b\x14\x9f\x96\x2f\xc7\x7f\x0e\x66\xd3\x3f\xe8\x9f\x97\xab\xf2\xf7\xd3\xf4\x70\xf9\xdb\x75\x39\xfe\xf4\x8c\x7f\x38\x38\xce\xe9\xdf\x7f\xca\x2e\x8f\xf4\xa7\x17\x31\x4b\xb9\xd9\x59\x32\x8a\x27\xee\x2f\xa3\xec\xc5\xf3\xac\x3c\x7c\x7e\x9d\xbf\x9c\x2d\x03\x00\x67\x22\xf6\x5e\xa8\x62\xd4\x45\x75\xdd\xdf\x25\xb3\x52\xdf\xcc\xe4\x35\x01\x42\x17\x62\x29\xb5\x21\x40\x10\x5b\xb9\x8f\x51\x08\x90\x7f\x32\xad\x39\x0b\x53\xa1\xb1\x0c\xd3\x04\xc8\x25\x37\x86\x09\x02\x44\x50\x1c\x2a\x71\x4c\x48\xc1\x56\x85\xe2\x57\xda\x46\x3c\xf7\x45\x12\x5a\x9f\x2e\x73\x4b\x46\xd3\xbc\xc8\x58\x48\x0b\xee\x29\xef\xf9\xf8\xe2\xb1\x81\xfd\x94\xe6\x3e\x87\xed\x2f\x69\xd8\x15\xcd\x5c\xa4\x99\xbc\x73\x30\x68\x03\xbe\x7e\xad\xbd\xc2\x57\xa9\xf7\x26\xff\x4a\x82\x39\x0f\xfe\x27\x00\x00\xff\xff\xb7\x19\x6c\xb9\x82\x29\x00\x00") +var _testImagesGlusterdynamicProvisionerBaseimage = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xca\xc9\xcc\x2b\xad\xd0\x4f\xcc\x4d\x31\x33\xb1\x4d\xc9\x4f\xce\x4e\x2d\xd2\xcb\xcc\xd7\x4f\xcf\x29\x2d\x2e\x49\x2d\x82\xd1\x29\x95\x79\x89\xb9\x99\xc9\xba\x05\x45\xf9\x65\x99\xc5\x99\xf9\x79\xa9\x45\x56\x65\x86\x7a\x06\x5c\x80\x00\x00\x00\xff\xff\xc6\x61\x56\x2c\x3e\x00\x00\x00") + +func testImagesGlusterdynamicProvisionerBaseimageBytes() ([]byte, error) { + return bindataRead( + _testImagesGlusterdynamicProvisionerBaseimage, + "test/images/glusterdynamic-provisioner/BASEIMAGE", + ) +} + +func testImagesGlusterdynamicProvisionerBaseimage() (*asset, error) { + bytes, err := testImagesGlusterdynamicProvisionerBaseimageBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "test/images/glusterdynamic-provisioner/BASEIMAGE", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _testImagesGlusterdynamicProvisionerDockerfile = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x64\x92\x51\x6f\x9b\x30\x14\x85\xdf\xfd\x2b\x8e\x60\xd2\x5a\x29\x23\x69\x1e\x3b\xed\x81\xb6\xb4\x43\x4d\x41\x0a\x74\x55\x9f\x26\x03\x37\x70\x27\xb0\x3d\xdb\x94\xe6\xdf\x4f\x24\xa9\xb6\x68\x7e\xb3\xef\xb9\xe7\x7e\x3e\x76\x88\x5b\x6d\xf6\x96\xdb\xce\x63\xbd\x5a\x5f\xa1\xec\x08\x8f\x63\x45\x56\x91\x27\x87\x78\xf4\x9d\xb6\x2e\x12\xa1\x08\xb1\xe1\x9a\x94\xa3\x06\xa3\x6a\xc8\xc2\x77\x84\xd8\xc8\xba\xa3\x8f\xca\x02\x3f\xc8\x3a\xd6\x0a\xeb\x68\x85\x8b\x59\x10\x9c\x4a\xc1\xe5\x57\x11\x62\xaf\x47\x0c\x72\x0f\xa5\x3d\x46\x47\xf0\x1d\x3b\xec\xb8\x27\xd0\x7b\x4d\xc6\x83\x15\x6a\x3d\x98\x9e\xa5\xaa\x09\x13\xfb\xee\x30\xe6\x64\x12\x89\x10\xaf\x27\x0b\x5d\x79\xc9\x0a\x12\xb5\x36\x7b\xe8\xdd\xbf\x3a\x48\x7f\x00\x9e\x57\xe7\xbd\xb9\x5e\x2e\xa7\x69\x8a\xe4\x01\x36\xd2\xb6\x5d\xf6\x47\xa1\x5b\x6e\xd2\xdb\x24\x2b\x92\x2f\xeb\x68\x75\x68\x79\x56\x3d\x39\x07\x4b\xbf\x47\xb6\xd4\xa0\xda\x43\x1a\xd3\x73\x2d\xab\x9e\xd0\xcb\x09\xda\x42\xb6\x96\xa8\x81\xd7\x33\xef\x64\xd9\xb3\x6a\x17\x70\x7a\xe7\x27\x69\x49\x84\x68\xd8\x79\xcb\xd5\xe8\xcf\xc2\xfa\xa0\x63\x77\x26\xd0\x0a\x52\x21\x88\x0b\xa4\x45\x80\x9b\xb8\x48\x8b\x85\x08\xf1\x92\x96\xdf\xf3\xe7\x12\x2f\xf1\x76\x1b\x67\x65\x9a\x14\xc8\xb7\xb8\xcd\xb3\xbb\xb4\x4c\xf3\xac\x40\x7e\x8f\x38\x7b\xc5\x63\x9a\xdd\x2d\x40\xec\x3b\xb2\xa0\x77\x63\x67\x7e\x6d\xc1\x73\x8c\xd4\xcc\x99\x15\x44\x67\x00\x3b\x7d\x04\x72\x86\x6a\xde\x71\x8d\x5e\xaa\x76\x94\x2d\xa1\xd5\x6f\x64\x15\xab\x16\x86\xec\xc0\x6e\x7e\x4c\x07\xa9\x1a\x11\xa2\xe7\x81\xbd\xf4\x87\x93\xff\x2e\x15\x09\x11\x22\xcb\xcb\xe4\xa2\xee\xe5\xd8\xf0\x58\x5d\x5e\x23\xd3\xda\x44\x78\xa1\xcf\x96\xf0\x6b\x74\x1e\x03\x5b\xab\xed\x6c\x3f\xb7\xf2\x30\x8f\xf4\x1a\xce\xcb\x96\x55\x1b\x89\x78\xfb\x30\x07\x90\xa4\x4f\xf1\x43\x22\xee\xb7\xf9\x13\x3e\xfd\xdd\x8b\x4d\x7c\x93\x6c\x8e\x6d\x3f\xdf\x8e\x3f\xed\x5b\xf0\x76\x15\xad\x02\xf1\x27\x00\x00\xff\xff\xbc\xc5\x66\x63\xc9\x02\x00\x00") + +func testImagesGlusterdynamicProvisionerDockerfileBytes() ([]byte, error) { + return bindataRead( + _testImagesGlusterdynamicProvisionerDockerfile, + "test/images/glusterdynamic-provisioner/Dockerfile", + ) +} + +func testImagesGlusterdynamicProvisionerDockerfile() (*asset, error) { + bytes, err := testImagesGlusterdynamicProvisionerDockerfileBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "test/images/glusterdynamic-provisioner/Dockerfile", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _testImagesGlusterdynamicProvisionerVersion = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x2a\x33\xd4\x33\xe0\x02\x04\x00\x00\xff\xff\xb1\xc9\x67\xf5\x05\x00\x00\x00") + +func testImagesGlusterdynamicProvisionerVersionBytes() ([]byte, error) { + return bindataRead( + _testImagesGlusterdynamicProvisionerVersion, + "test/images/glusterdynamic-provisioner/VERSION", + ) +} + +func testImagesGlusterdynamicProvisionerVersion() (*asset, error) { + bytes, err := testImagesGlusterdynamicProvisionerVersionBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "test/images/glusterdynamic-provisioner/VERSION", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _testImagesHttpdBaseimage = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\xce\xbb\xae\x83\x30\x0c\x80\xe1\x9d\x77\x09\x31\x4e\x14\x61\x24\x8f\x47\x87\xae\xb4\x4b\x47\x28\x48\x45\xe2\x12\x71\xef\xdb\x57\x50\xa6\x52\xa1\x2c\xce\x90\xef\x97\x5d\x95\xcd\xb8\xc8\xb4\xce\x8d\xe6\xe7\x30\xd8\x3c\x42\x5f\xfb\x2a\x14\x69\x65\xcb\xa6\xf0\xf6\xff\xae\xe6\xb4\xab\x15\x4e\x46\x9e\x2a\xa3\x79\x9b\x53\x78\xe2\xac\x7d\x18\x5d\x15\xbc\xbf\x27\xb2\x57\x04\x0b\x6f\xf3\xa7\x9a\xcb\x26\x6f\xe7\xfe\x73\xbf\x0c\x42\x20\x4e\xfe\xfe\x2f\xd7\x5b\x72\x97\xd9\xd8\xbf\xb2\x76\x89\x02\x1f\x49\xec\x50\x6c\x50\xac\xf0\xbb\x25\x50\x6e\x2d\x81\x3a\xb6\x8e\x7b\xe9\xb0\x17\x01\xb4\x53\xbb\xc2\x43\x1b\xa3\x63\x1b\xa3\xf7\x0e\x00\x00\xff\xff\xf9\xa6\x8a\x5e\xea\x01\x00\x00") + +func testImagesHttpdBaseimageBytes() ([]byte, error) { + return bindataRead( + _testImagesHttpdBaseimage, + "test/images/httpd/BASEIMAGE", + ) +} + +func testImagesHttpdBaseimage() (*asset, error) { + bytes, err := testImagesHttpdBaseimageBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "test/images/httpd/BASEIMAGE", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _testImagesHttpdDockerfile = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x64\x92\x51\x6f\x9b\x3e\x14\xc5\xdf\xfd\x29\x8e\xe0\x2f\xfd\x5b\x29\x25\x59\xb6\x87\xa9\xd3\x1e\x68\x4b\x3b\xd4\x14\xa4\x40\x57\xf5\x69\x32\x70\x03\x77\x02\xdb\xb3\x4d\x69\xbe\xfd\x44\xd2\x6a\x8b\xe6\x37\xfb\x9e\x7b\xee\xcf\xc7\x0e\x71\xad\xcd\xde\x72\xdb\x79\xac\x57\xeb\x15\xca\x8e\x70\x3f\x56\x64\x15\x79\x72\x88\x47\xdf\x69\xeb\x22\x11\x8a\x10\x1b\xae\x49\x39\x6a\x30\xaa\x86\x2c\x7c\x47\x88\x8d\xac\x3b\x7a\xaf\x2c\xf0\x9d\xac\x63\xad\xb0\x8e\x56\x38\x9b\x05\xc1\x5b\x29\x38\xff\x22\x42\xec\xf5\x88\x41\xee\xa1\xb4\xc7\xe8\x08\xbe\x63\x87\x1d\xf7\x04\x7a\xad\xc9\x78\xb0\x42\xad\x07\xd3\xb3\x54\x35\x61\x62\xdf\x1d\xc6\xbc\x99\x44\x22\xc4\xf3\x9b\x85\xae\xbc\x64\x05\x89\x5a\x9b\x3d\xf4\xee\x6f\x1d\xa4\x3f\x00\xcf\xab\xf3\xde\x5c\x2e\x97\xd3\x34\x45\xf2\x00\x1b\x69\xdb\x2e\xfb\xa3\xd0\x2d\x37\xe9\x75\x92\x15\xc9\xc5\x3a\x5a\x1d\x5a\x1e\x55\x4f\xce\xc1\xd2\xaf\x91\x2d\x35\xa8\xf6\x90\xc6\xf4\x5c\xcb\xaa\x27\xf4\x72\x82\xb6\x90\xad\x25\x6a\xe0\xf5\xcc\x3b\x59\xf6\xac\xda\x05\x9c\xde\xf9\x49\x5a\x12\x21\x1a\x76\xde\x72\x35\xfa\x93\xb0\xde\xe9\xd8\x9d\x08\xb4\x82\x54\x08\xe2\x02\x69\x11\xe0\x2a\x2e\xd2\x62\x21\x42\x3c\xa5\xe5\xb7\xfc\xb1\xc4\x53\xbc\xdd\xc6\x59\x99\x26\x05\xf2\x2d\xae\xf3\xec\x26\x2d\xd3\x3c\x2b\x90\xdf\x22\xce\x9e\x71\x9f\x66\x37\x0b\x10\xfb\x8e\x2c\xe8\xd5\xd8\x99\x5f\x5b\xf0\x1c\x23\x35\x73\x66\x05\xd1\x09\xc0\x4e\x1f\x81\x9c\xa1\x9a\x77\x5c\xa3\x97\xaa\x1d\x65\x4b\x68\xf5\x0b\x59\xc5\xaa\x85\x21\x3b\xb0\x9b\x1f\xd3\x41\xaa\x46\x84\xe8\x79\x60\x2f\xfd\xe1\xe4\x9f\x4b\x45\x42\x84\xc8\xf2\x32\x39\xab\x7b\x39\x36\x3c\x56\xe7\x97\xc8\xb4\x36\x11\x9e\xe8\x7f\x4b\xf8\x39\x3a\x8f\x81\xad\xd5\x76\xb6\x9f\x5b\x79\x98\x47\x7a\x0d\xe7\x65\xcb\xaa\x8d\x44\xbc\xbd\x9b\x03\x48\xd2\x87\xf8\x2e\x11\xb7\xdb\xfc\x01\xff\xfd\xd9\x8b\x4d\x7c\x95\x6c\x8e\x6d\x3f\x5e\x8e\x3f\xed\x6b\xb0\x8e\x3e\x45\x1f\x3f\x5f\x7c\x08\xc4\xef\x00\x00\x00\xff\xff\xe2\x02\xa2\x6a\xcd\x02\x00\x00") + +func testImagesHttpdDockerfileBytes() ([]byte, error) { + return bindataRead( + _testImagesHttpdDockerfile, + "test/images/httpd/Dockerfile", + ) +} + +func testImagesHttpdDockerfile() (*asset, error) { + bytes, err := testImagesHttpdDockerfileBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "test/images/httpd/Dockerfile", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _testImagesHttpdDockerfile_windows = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x55\x6f\x6f\xdb\xb6\x13\x7e\xcf\x4f\x71\xb0\x7f\xe8\xaf\x05\x22\x31\x76\xbc\x74\x73\x91\x17\xaa\xa3\xb6\x46\x53\x3b\xb0\x9c\x66\xc1\x3c\x0c\xb4\x78\xb6\x0e\xa1\x48\x8d\xa4\x2c\x67\x2f\xf6\xd9\x07\xca\x4a\x93\xb4\xc6\x30\x03\x86\x44\xf2\x79\xee\x9e\xfb\x47\xf5\x61\x62\xaa\x07\x4b\xdb\xc2\xc3\xf0\x74\x38\x80\x65\x81\xf0\xb9\x5e\xa3\xd5\xe8\xd1\x41\x52\xfb\xc2\x58\x17\xb3\x3e\xeb\xc3\x15\xe5\xa8\x1d\x4a\xa8\xb5\x44\x0b\xbe\x40\x48\x2a\x91\x17\xf8\x78\x72\x02\x5f\xd1\x3a\x32\x1a\x86\xf1\x29\xbc\x0e\x80\x5e\x77\xd4\x7b\xf3\x8e\xf5\xe1\xc1\xd4\x50\x8a\x07\xd0\xc6\x43\xed\x10\x7c\x41\x0e\x36\xa4\x10\x70\x9f\x63\xe5\x81\x34\xe4\xa6\xac\x14\x09\x9d\x23\x34\xe4\x8b\xd6\x4d\x67\x24\x66\x7d\xb8\xeb\x4c\x98\xb5\x17\xa4\x41\x40\x6e\xaa\x07\x30\x9b\xe7\x38\x10\xbe\x15\x1c\x7e\x85\xf7\xd5\x98\xf3\xa6\x69\x62\xd1\x8a\x8d\x8d\xdd\x72\x75\x00\x3a\x7e\x35\x9d\xa4\xb3\x2c\x8d\x86\xf1\x69\x4b\xb9\xd1\x0a\x9d\x03\x8b\x7f\xd6\x64\x51\xc2\xfa\x01\x44\x55\x29\xca\xc5\x5a\x21\x28\xd1\x80\xb1\x20\xb6\x16\x51\x82\x37\x41\x6f\x63\xc9\x93\xde\x9e\x80\x33\x1b\xdf\x08\x8b\xac\x0f\x92\x9c\xb7\xb4\xae\xfd\x8b\x64\x3d\xaa\x23\xf7\x02\x60\x34\x08\x0d\xbd\x24\x83\x69\xd6\x83\xf7\x49\x36\xcd\x4e\x58\x1f\x6e\xa7\xcb\x4f\xf3\x9b\x25\xdc\x26\x8b\x45\x32\x5b\x4e\xd3\x0c\xe6\x0b\x98\xcc\x67\x97\xd3\xe5\x74\x3e\xcb\x60\xfe\x01\x92\xd9\x1d\x7c\x9e\xce\x2e\x4f\x00\xc9\x17\x68\x01\xf7\x95\x0d\xfa\x8d\x05\x0a\x69\x44\x19\x72\x96\x21\xbe\x10\xb0\x31\x07\x41\xae\xc2\x9c\x36\x94\x83\x12\x7a\x5b\x8b\x2d\xc2\xd6\xec\xd0\x6a\xd2\x5b\xa8\xd0\x96\xe4\x42\x31\x1d\x08\x2d\x59\x1f\x14\x95\xe4\x85\x6f\x77\x7e\x08\x2a\x66\x2c\x59\x7c\x0c\xea\xd3\xe9\x97\xe4\x63\xda\xae\x16\xe9\xc7\x69\xb6\x5c\xdc\xb1\x10\x0e\xfe\xdf\x22\xd4\x2e\xd8\x16\x70\x45\xba\xde\x03\x95\xc1\xa7\x37\x50\xeb\x4a\xe4\xf7\xad\x3d\x61\xf3\x82\x76\x78\x12\x16\x1a\x9a\x96\x15\x4a\x1c\x78\xe4\x21\xe8\x0b\x8c\x5b\xd2\xd2\x34\x2e\x66\x1f\x16\xf3\x2f\x10\x45\x95\x12\x7e\x63\x6c\x79\xa1\x82\x65\x2e\x4a\x79\x3e\x02\xa1\x2a\xd2\x38\x3e\x8b\xcf\x41\x38\xa8\x2c\x56\x8c\x25\x97\x97\x6d\x4f\xb8\x31\xe7\x85\x29\xf1\x79\x57\xfc\xed\x3c\x6e\x36\xa8\x85\xe2\x5f\x27\x83\x11\x5f\x93\x16\x96\xd0\xf1\x40\x90\xd1\x30\x1e\xc5\xa3\x41\xd4\x90\x3e\x1f\x45\x01\x10\xff\x45\x15\x1c\x0e\xc3\xeb\x0b\xdb\x4d\x27\xb0\x2a\xaa\x58\xa3\xe7\xd2\x34\x5a\x19\x21\x1d\xb7\xa8\x50\x84\xde\xeb\x42\x75\xbc\x2a\xaa\xe8\x6d\x3c\x8a\x07\xa3\xe8\x96\xf4\xd9\x30\xda\xe5\x83\x9f\xa2\xfd\x79\xe7\x20\x98\xf8\xef\xe6\xb5\xd0\x86\xe7\xd6\x87\xff\x77\x86\xbe\xdf\x61\x6c\x71\x33\x83\x5a\xbf\x0c\x03\x5e\xbd\x5a\xb1\x30\x3a\xe5\x0e\x16\x28\xe4\x17\x8c\xfd\xde\x03\x3f\xcc\xfa\x70\xc4\x2f\x1f\x9b\x97\x8c\x7e\x06\xf8\x46\xbb\x97\x64\x5b\xd5\xdf\xb6\x3a\x17\x5d\x20\x10\xc9\xf6\x9d\x7f\x7f\xfe\x83\xe2\x00\x64\x87\x12\xff\xef\xa9\xb5\xd8\x64\x7e\x7d\x07\x51\xb4\xb1\xa6\xbc\x08\x55\x7d\xd2\x06\xbc\x76\x96\x2b\x93\x0b\xc5\x0f\x85\x1d\x1e\x41\x07\x69\xdc\x1b\xa3\xda\xd4\xbf\x1d\x1d\x81\xec\x72\x5b\x6b\x4f\x25\x0e\x46\xa7\xb1\x54\x0a\x78\xd7\x71\x3c\x7b\x70\x1e\xcb\xb3\x21\x3f\xc2\x2a\xdd\x2e\xaf\xfe\x85\x71\xa0\x1c\x32\x9d\x1b\xbd\x39\x22\x97\x87\x7d\xfe\x04\x39\x50\x48\x4b\xdc\xc7\x85\x2f\xd5\x31\x4a\xe1\xa5\xc9\x1d\x7f\x02\x85\x81\x9b\xcd\x97\xe9\xeb\x5c\x89\x5a\x52\xbd\x7e\x33\x06\x69\xf2\x7b\xb4\xb0\xae\x49\xc9\x3d\x38\xf4\xae\x9d\xb7\xeb\x64\xf9\x09\x50\xef\x60\x27\x2c\xb5\x97\x9c\x37\x8f\x03\x1a\x29\xba\x3f\x20\x4e\xa0\x29\x28\x2f\xc2\xd5\x15\xee\x6e\x89\x8e\x6c\x00\xc7\x2c\x9d\x7d\x6d\x11\x17\xbd\xc9\x78\x25\x69\xfb\x6e\x32\x5e\xad\x49\x87\x47\x5e\x5b\x15\x9e\x5d\x1e\x56\x8f\x79\x78\xb6\x17\x5e\xaf\xad\xd9\x5a\x51\xc2\x07\x52\xe8\x56\xd7\xa6\x41\x9b\x15\xa8\x5a\x6a\x5b\xa4\x55\x5b\xa4\x55\x58\xd7\xce\xae\xda\xd8\x57\x5d\xec\xc1\xd7\xea\x5d\x8f\xb1\x9b\x2c\x5d\xc0\xc4\xe8\xf0\x55\x40\x9b\xc8\x92\x74\x68\x53\xe1\x8d\x65\xe9\xaf\xd7\xf3\x2c\x85\x9f\x4f\xd9\x55\xf2\x3e\xbd\x3a\xdc\x3b\x7f\xec\x0e\xdf\xaa\x8b\x5e\x98\xeb\xb3\x5f\xa2\x41\x8f\xa5\xb3\xe5\xe2\xee\x7a\x3e\x9d\x2d\xe1\xb7\xde\x64\x7c\x24\xd5\x6b\xd2\x5d\x71\x70\x8f\xbd\xdf\xd9\x3f\x01\x00\x00\xff\xff\xc6\x57\xe5\xc1\x41\x07\x00\x00") + +func testImagesHttpdDockerfile_windowsBytes() ([]byte, error) { + return bindataRead( + _testImagesHttpdDockerfile_windows, + "test/images/httpd/Dockerfile_windows", + ) +} + +func testImagesHttpdDockerfile_windows() (*asset, error) { + bytes, err := testImagesHttpdDockerfile_windowsBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "test/images/httpd/Dockerfile_windows", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _testImagesHttpdVersion = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x32\xd2\x33\xd1\x33\xb6\xd0\x35\xe4\x02\x04\x00\x00\xff\xff\x9e\x40\xbb\xae\x09\x00\x00\x00") + +func testImagesHttpdVersionBytes() ([]byte, error) { + return bindataRead( + _testImagesHttpdVersion, + "test/images/httpd/VERSION", + ) +} + +func testImagesHttpdVersion() (*asset, error) { + bytes, err := testImagesHttpdVersionBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "test/images/httpd/VERSION", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _testImagesHttpdHttpdConf = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x7c\x7f\x6f\x1b\x37\xd2\xf0\xff\xfa\x14\x03\xe9\x0d\x1c\x17\xb2\x94\xe6\x7a\xef\x15\x46\x11\xbc\x79\x93\xe6\x6a\xc0\x8e\x83\x38\x6d\xef\x1e\x14\xf0\x51\xbb\x23\x89\x67\x2e\xb9\x25\xb9\x96\x95\xc3\x7d\xf7\x07\x33\x24\xf7\x97\xb8\xbe\x3e\xc0\xf3\xc7\xa5\xe7\x1d\x0e\x39\x9c\x5f\x9c\xe1\x0c\xb5\x98\x2d\xe0\xcb\x5e\x3a\x90\x0e\xfc\x1e\xa1\x12\x52\xc3\xdb\x5a\x14\x7b\x84\x9f\xbe\x7c\xf9\x04\x0e\xed\x23\x5a\x28\x8c\xde\xca\x5d\x63\x85\x97\x46\xc3\x56\x2a\x5c\x01\x5c\x79\xfa\xee\x85\xd4\x8c\x3c\x5b\x8c\x86\x95\xd2\x62\xe1\xe5\x23\x12\x58\x78\xd8\xc9\x47\xe4\x55\xe2\xa4\xd2\x3b\x90\xda\x79\xdb\x14\x34\xde\xad\x66\x0b\xb8\x43\x84\x1f\x7e\xfe\x7c\x7d\xb9\xf7\xbe\xbe\x5c\xaf\xe9\x3f\xe5\x4a\x30\x45\x2b\x63\x77\xeb\xd2\x14\x6e\xfd\x7a\xf5\xdd\xfa\x0d\x6c\x8d\x85\x12\xbd\x90\x0a\x4b\x90\x7a\x6b\x6c\xc5\x0b\xd3\x3c\x57\x1a\x6a\x61\xbd\x2c\x1a\x25\xec\x12\x1c\x12\x79\x7f\x6c\xe2\xca\x94\xeb\x8e\xf4\xd5\xde\x57\xea\xcd\x6c\xc1\xab\x09\x28\xa5\x2b\x1a\xe7\x68\x7b\x66\x0b\x28\x8a\xfd\xd4\xa6\x57\x33\x62\xee\x7b\x03\x1f\x6f\xbf\x80\x93\x55\xad\x8e\x60\x51\x94\xcc\x81\xfe\xb6\x41\x6a\xd8\xa3\x45\x38\x48\xbf\x37\x8d\x87\x46\x97\x68\x9d\x17\xba\x94\x7a\x37\x5b\xc0\x81\x98\xe7\xf7\x78\x84\xd2\xac\x00\xbe\xec\xf1\x78\x66\x31\xe0\x18\xad\x8e\x20\x1c\xec\xa5\xf6\x0e\x8c\x05\x8b\x95\x64\x7c\x12\xd0\x16\x8e\xa6\x01\x61\x11\x1a\xed\x1a\x1b\x45\xe4\x1a\xc5\xf3\x11\xb2\xd4\x08\xb4\xf3\x15\xfc\xdd\x34\xb0\x17\x8f\x08\x1b\x44\x0d\x07\x61\x35\x96\x61\x0f\xef\x06\x1b\x14\xba\x04\x65\x76\xa4\x03\xa0\x45\x85\xee\x92\xd6\xa1\xe9\xe8\x13\x7f\xe1\x55\x5d\x8d\x85\xdc\x1e\x99\x6f\x95\xd0\xc7\xd9\x82\x38\xd6\x89\xff\xcc\xb1\xf6\x58\xa3\x18\xd1\xc1\x06\x77\x52\x33\x13\x60\xbe\x9e\xc3\x4b\x63\x61\x5e\x5a\xf9\x88\x97\xeb\x39\xcf\xf2\xab\xd4\x7f\x7a\x7d\xbe\x8c\xba\x16\x95\xe8\x20\x95\x82\xc6\x61\x50\x31\x7c\xaa\x95\x2c\xa4\x87\x5a\xf8\x7d\xe0\xc0\x90\xb2\xd2\xc0\x37\xda\xf8\x6f\xc2\x6a\xc4\xdc\xb8\x1e\x4f\x0b\x8f\x42\x35\x48\x74\xde\xf1\xec\x9f\x8d\xf1\x64\x1a\xb5\xc5\x1a\x75\x89\x25\x5c\x5c\x80\x33\x30\x57\x66\xe7\xd6\xa2\x28\xd0\xb9\x7b\x65\x76\xf3\x34\x51\x0f\xcd\xa1\x07\x6f\x60\xbe\x6e\x9c\x5d\x2b\x53\x08\xb5\x0e\xda\xf6\x7a\x1e\x88\xde\x90\x1a\x78\xb4\xb5\x45\x8f\x25\x6c\x8e\xc3\x8d\x09\x97\xc3\x5d\x8f\x57\x5e\xc2\x81\x14\x81\x47\x67\xa9\x3a\x5d\x49\x38\x38\x1b\x8f\x3d\x0b\xa2\xfe\x78\xfb\xe5\xc7\x4b\xf8\x95\x55\xab\x63\x1a\x29\x50\x10\xa7\xc4\x72\xc9\xd2\xad\x1a\xe7\x99\xed\x5b\x63\x0f\xc2\x96\xe0\x94\x70\x7b\x74\xb3\x05\xeb\x36\xe9\xb9\xd9\xc2\x46\x14\x0f\x11\x00\x2f\x71\xb5\x5b\x2d\x61\x5e\x5c\xc6\xbd\xcc\xfb\x23\xe7\xc5\xe5\x6f\xf1\xf3\x39\xdb\xef\x96\x8c\x8d\xa4\x0f\x0a\xbd\x27\x6f\xe1\xc0\x54\xd2\x7b\xa2\x80\x44\x15\x80\x46\xc3\x61\x2f\x8b\x3d\x04\x7b\xc6\x27\xa4\x81\xc4\x32\x8f\x65\x6f\xff\x8d\x0b\x2c\x2e\x71\x2b\x1a\xe5\x83\xf7\x92\x0e\x2c\x16\xa6\xaa\x82\x6c\x59\x83\xd8\x60\xd4\x41\x1c\x1d\xb8\xa6\xae\x15\xe9\xad\xd0\x9d\x62\x0d\x69\xd2\x20\x36\xce\xa8\xc6\x23\x6b\x9c\x23\x89\x8b\x47\x23\x4b\xf6\x0a\x8d\x63\x6f\xc4\x9c\xed\x34\xe3\x92\x2c\x18\xbc\xa9\x93\x3d\x04\x97\x61\xec\x11\xbc\x45\x0c\xe6\x1f\x77\xd5\x37\x97\xb1\x7f\x5d\x02\x5a\x6b\xec\x32\x59\x64\x34\x23\x12\xd6\x03\xd6\xbe\xf5\x3f\xda\x78\x10\x65\x09\x22\xc8\x08\x82\x33\x01\xd4\xe5\x29\x01\x9d\xd9\x10\x1f\x6a\x23\xb5\x1f\xd0\x4e\xc8\x02\xb4\xd1\x17\xac\x95\xe4\x0e\x1f\x96\xc4\x5f\xf2\x2e\xb4\xf9\x64\xf5\x02\xba\x01\x24\xa4\xa0\xda\x37\x8d\xc7\xa7\xce\x45\x2e\x41\x6e\x99\xea\x8b\x8d\x20\xf9\x54\x04\x8e\x5b\x20\x81\x75\x94\x1c\xa4\xdb\xf3\xf4\x7b\x82\x45\x3b\x11\x15\xf6\x49\x63\x47\xd3\x28\x2f\x6b\x85\x41\x1d\xa0\x14\x58\x19\xed\x96\x71\x0e\xa5\x40\x23\x09\xda\x40\xb1\x17\x7a\x87\x20\x68\x7b\x0a\x85\xf3\xf0\x49\x96\x1f\xe8\x5c\x9b\x2d\x66\xef\x71\x4b\x7e\xf1\xee\xf3\x2f\x9f\x6f\x6f\xbf\xc0\xfc\xdd\x65\xc6\x10\xe7\xb3\xde\xda\xf3\xff\xf3\xaf\x38\xfa\xdf\xf3\x20\x6f\xde\xea\x25\xbc\x55\xca\x1c\x82\x43\x24\xf2\x31\xf0\x9e\x37\x0a\x15\x12\x15\xd2\x55\x2c\xc1\xf0\x8d\xdd\x6a\x2b\x8f\x78\xec\x48\x5d\xca\x47\x59\x36\x42\x25\x16\x2d\xc9\xd5\xc7\x3d\xd0\x84\x3b\x65\x36\xc4\xed\xa0\xdd\x8e\x29\xf8\x59\x07\xd5\xf6\x3c\x7d\x6f\x70\x27\x6e\xb9\x1d\xf0\xbc\x27\x0a\x42\xe1\xb1\x61\xc6\xd9\x22\x4b\x1f\x59\x10\xa9\x17\x1d\x0b\x03\x81\xdb\x04\x11\x75\x6d\x4d\x6d\xa5\xf0\xec\x2a\xc0\x99\x8a\x64\x67\xfc\x1e\xe9\xac\x12\x8e\x8f\xeb\x4e\x35\xc2\x72\x97\xe4\x9d\x02\x1f\xaf\xa5\xf3\xa8\xc7\x8c\xdc\x48\x5d\xa6\x38\xa5\xd5\x3a\x59\xc0\xd5\x27\x52\x75\x8b\xce\xd1\x96\x74\xb9\x36\x76\xb6\x80\xda\x58\xef\x96\x7d\x77\xd3\xdb\xda\x8a\x63\x0e\xa1\x9c\xe1\xaf\x3f\xfc\x22\xad\x6f\x84\xfa\xc9\x38\x4f\xc7\xfe\xe8\x3c\x7f\x97\xd8\x28\xd9\xd6\x03\x75\xb4\xff\x09\x12\x1c\xb8\xbd\x39\x68\xd8\xa0\x32\x07\xf0\x86\xa8\xb1\xf8\x48\x52\x89\xe4\x6f\xad\xa9\x48\x7e\x55\x25\xf5\x0e\x8c\x26\x0f\x42\x3e\xcb\x34\xba\x1c\x4c\xc6\x04\xc4\x05\xbf\x7d\xbd\xfa\xd3\x77\xab\x3f\xff\xdf\xd5\x5f\xbe\xbf\xfc\xfe\xd5\x2c\x7e\xfd\xfe\xd5\xec\x6d\x59\xfe\x24\x74\xa9\xe8\x00\xa9\xc9\x65\xb1\xab\x58\x3f\x5d\xb0\x41\x5c\xd4\xfb\x1a\x56\xf5\xbe\xa6\x71\x5f\x8e\x35\x3e\x3b\x08\x38\xf6\x99\x7d\xfa\xe9\xd3\x95\x96\xef\xa5\x65\xdf\xed\x8d\x51\x6e\x5d\xef\xeb\xbf\x7c\x37\x0f\x1e\xe6\xa8\x45\x25\x0b\xb8\x23\xd3\x2c\xe1\x76\xf3\x4f\x2c\x3c\xbc\x7c\x7f\x77\x7b\x0e\x77\x4d\x4d\xbc\xe7\x71\x5f\x0c\xf9\x09\xb1\x51\x2c\xb1\x70\x62\x23\x6c\x1b\xcd\x51\x90\x50\xd2\x1f\x49\x32\x02\x2a\x53\x36\x0a\xa3\x03\x3c\x08\x07\x9b\x46\x2a\x4f\xac\x14\xf0\xfe\xee\x96\x54\x60\xb6\x08\xa1\x8a\x37\x50\x2b\x51\x20\x14\xc6\x5a\x74\xb5\xe1\x90\x09\xfe\x71\x6d\x44\x79\xc3\xd3\x9c\x01\x85\x38\x2e\x38\xbd\x74\x32\x50\x18\x13\xc4\xdd\x17\xb0\x4b\xd1\x2c\x47\x93\x20\x3d\xdb\x84\x28\x48\x1b\x28\xc8\x7a\x14\x52\x31\xf9\xf7\x1b\xdc\x1a\x8b\xf7\x21\x26\x6b\x9d\x15\x39\x4a\x2f\xbc\x2c\x78\x78\x61\xaa\x9a\x03\xd3\xb0\x1d\x07\x2f\xfd\xde\x38\x04\x45\xa2\xe2\xa3\xe8\x1f\xc1\x47\x5d\xa8\xb3\x73\x0a\x4b\xc8\x5a\xc8\x3b\xcd\x16\xac\xe0\x08\xca\x08\x3a\x95\xe8\x2c\x0e\xba\xf7\xe3\x93\xa8\x6a\x85\x97\xb3\x6e\x7b\x40\x82\xb8\x8f\x1c\x1b\x89\x87\xff\x8d\xde\xea\xfe\xbb\x55\xa9\x14\x05\x04\x3d\xdc\xad\x31\x09\x35\x12\x49\xb1\xef\xfd\xd6\x98\x95\x33\xac\x6c\xdd\xd8\x18\x29\xd0\xae\x84\xcf\x61\x0d\x06\x10\xfe\x00\x99\x03\xdd\x3c\x5a\x08\xfd\x47\x08\x4a\x8a\xfc\x70\x02\x9c\x0c\x56\xe6\x50\xa1\xdf\x9b\x72\x02\xa7\x83\x8f\x51\x9d\xcc\xa3\x38\x79\x32\xb4\xf1\xfb\xfb\x8d\x70\xb2\xc8\x22\xb4\x50\x66\xdd\x18\xaf\x94\x3b\x74\x79\xb6\x75\xe0\x2c\x26\x25\x35\x93\x78\x04\xcc\x61\xe9\x7b\xa1\x8d\x9e\x42\x0b\xd0\xcc\xf6\xf4\x7d\x41\x6a\x3d\x89\x46\xd0\xfc\x72\xe5\xa6\x9c\x46\x2b\x37\xe5\x14\xd6\xe4\xd6\x18\x98\x25\x91\x0e\xa0\x69\x2c\xce\x4c\xb3\x8b\x39\x53\x90\x25\x4c\xa3\xc6\x01\x59\xec\xaf\xf7\xdb\x62\x27\x27\x71\x03\x78\x02\x53\x95\xa2\x7e\x06\x93\xc0\x99\x8d\x7e\x7d\x56\x16\x5f\x27\x65\xf1\xf5\x39\x59\x7c\x9d\x92\xc5\xd7\xe7\x64\xf1\x75\x42\x16\x5f\xef\x77\xd6\x34\xf5\x73\x02\xe9\x0d\xc9\x4e\xb0\x37\xd3\x56\x11\xa0\x79\x6a\xcd\x41\xa3\x9d\x46\x64\x70\x76\xc1\xc6\x3d\x87\x47\xd0\x53\x34\x43\xf9\xf4\xd3\x04\x56\x00\x8e\xa9\xdc\x34\xdb\x6d\x7e\xa1\x00\x19\x8f\x9f\x54\xcd\xac\x4a\x86\xd1\x14\x68\x4d\xa2\x30\x34\x8f\xf7\x8c\x21\x0c\x06\x9c\x60\xa3\xd5\xf7\x15\x7a\x91\xc5\x4c\xc0\x11\xfb\x26\xac\x26\x63\x2d\xc5\x5e\x58\x87\xfe\x5e\x49\x9f\xa7\xad\x07\x1f\xe3\x96\x22\x4f\x15\x7d\x3f\x1d\xfb\x98\x1f\xfa\x98\x1b\xb9\xcd\x1e\x0f\x01\x92\x1b\xaf\x4c\x91\x15\x4a\x82\x9d\xe0\xe4\x8d\x35\x63\xa6\x25\x6e\x95\xc8\xb3\x26\x82\x46\xac\x2f\x65\x56\x01\x4b\x79\xa2\x7d\x65\x53\xd5\x32\x1b\x0a\x04\xc8\x68\x62\xd4\x59\x0e\xa2\x3e\xe1\x20\x3e\xd5\xd2\x62\x96\x85\x11\x74\x8a\xe1\xc9\x87\xfb\xbc\xf1\x74\xd0\x31\x1e\x3b\xa1\x49\xbd\xee\xa0\x19\xbc\x89\xb5\xf2\xeb\xec\x51\x94\x68\xb3\x3b\x8a\xa0\x0c\x86\xf5\x1b\xcc\x07\x4d\x2d\x30\x8b\x55\x19\x2d\xbd\xc9\x52\xd7\x87\x9f\xe0\x7a\x5f\xbf\xce\x22\x11\x60\x3c\x5a\x96\xa8\xb3\xb4\x31\xe0\x64\x74\x25\x76\x58\xe5\x0f\xb4\x04\x1b\xa9\x8b\xd4\x85\x6a\xca\xac\x5c\x22\xe8\x04\x61\x9b\x55\x46\xfa\x3e\x1e\xea\x44\x9d\x75\x30\x0c\x18\x13\xaf\x36\x21\x0a\xbc\xdf\x1c\x37\x8d\x3b\x6a\x8a\x57\x33\xb8\x99\x61\xcf\xcc\x64\xf1\xf7\x06\x9d\xff\x4f\x33\xa5\x61\xcf\xcc\xe4\xad\xd8\x6e\xf3\xe1\xe5\xe9\xa8\xc9\x79\x9e\xd5\xb7\xd3\x51\x27\xf3\x4c\x44\x2b\x29\x4c\x19\x8c\x35\xbb\xbc\xdb\x60\xc0\x48\x54\xca\xec\xee\xc3\xf5\xd5\x04\x46\x84\x66\x16\xb9\x2f\x71\xd3\x4c\xa2\x31\x30\x87\x45\x39\x9a\x9e\x88\xd7\xfb\xf0\x13\xdc\x26\x7b\x98\xa8\xe6\xe4\x2c\xa9\x44\x61\xb3\x0c\x60\xc0\xc9\xe8\xac\xab\xaf\xca\x11\xa3\x2a\x59\x65\x8d\x85\xbe\x9f\x4c\xc9\x63\xc5\x2e\xbf\xc9\x0e\x3a\x5a\x42\xe3\xce\x78\xc9\x79\x70\x0e\xaf\x07\x1e\x2f\x58\x5b\xf3\x74\xcc\xe1\x30\x20\x3f\x5a\xfc\x33\xab\x51\x2d\x30\x8f\xb5\x11\x4a\xe8\x22\xef\x9b\x87\x23\xf2\xf8\x85\xd1\x1a\x8b\xac\x15\x0c\x06\xe4\xb1\xf1\xa9\xb6\x13\xee\x61\x30\x20\x8f\x3d\x95\x2c\x74\xd0\x09\x3c\xff\x0c\xa7\xb6\x7e\x82\x53\x7b\x5f\xa9\x69\x34\x82\x4e\xe1\x3d\xb7\x1c\x41\xa7\xf1\xb2\xe7\x4b\x0f\x9c\xc7\x74\xcf\xf2\xc5\x4d\xf2\xa5\x39\xb8\xe7\x10\x19\x9c\xc7\x3c\x38\xdf\x68\x8d\xcf\xf0\x27\x8d\x18\xe3\x5b\xe1\x51\xc9\x4a\x66\x35\xa8\x05\x9e\x60\xe1\x56\xf1\xd5\x68\x16\x2b\x01\x4f\xb1\x2a\xe3\x51\x66\xa5\x91\x60\xa7\x38\x7c\xa0\xe4\x51\x18\x94\xc1\xf0\xb2\x42\xd3\x4c\x21\x45\xe8\x29\xde\xc1\x4e\x04\xe5\x11\x34\xc6\x70\x98\x75\x75\x0e\x4f\xa2\x5a\x87\x5c\x4b\xcd\x8f\x66\xd0\x14\x46\x61\xcc\x83\xcc\x12\x35\x1c\x31\x89\x6f\x8f\xb5\xcf\x3a\xef\xe1\x88\x29\xfc\x89\xc8\xbd\x07\x1e\x39\x5d\x87\x1e\xf5\xa3\xdc\xe6\xb1\x02\xec\x64\x31\x65\x7c\x85\xd5\x7d\xad\x84\xcc\x33\xa9\x3f\x60\x0a\xdb\xed\xb3\xb9\x7d\x0f\x7c\x82\x19\x73\xc4\x89\x5b\x81\x1e\x78\x0a\xb3\xc2\x6a\x32\x1c\x1f\x8f\x19\x33\x2a\x82\xdd\xbe\x2a\x36\xcf\xe1\xf3\x80\x13\x02\x6a\x54\x52\x67\xa3\x85\x08\x1a\x2f\xe7\xb2\xde\xc1\x39\x35\x1e\xe8\x85\x6f\xb2\x47\x42\x80\x9c\x50\xd2\x6c\x9c\x97\xbe\xc9\x9b\x4e\x07\x1d\xe3\x35\x5a\xfe\xde\xe0\xbd\xcc\xea\x57\x0b\x3c\xc1\x72\x68\x27\x52\xbe\x08\xca\x61\x78\x2b\xf2\x09\x6b\x0b\x1c\x63\x3d\xa2\x9d\xb2\xd8\x08\x3a\xc1\xe0\x5b\x9e\xc9\x2b\xdd\x1e\x78\x8c\x79\x10\xbe\xd8\x97\x26\x2b\xcc\x04\x1b\xe3\x3c\x55\xea\x35\xea\x6c\x3c\x14\x41\x84\x31\xfb\xe1\x6a\xdb\xb1\xfb\x29\xb1\xfa\x0d\xdf\xb3\xf7\x6b\x8e\xe1\x8e\xde\x1b\xb0\x8d\x0e\x25\x88\x52\x6e\xb7\x68\x51\x73\xf9\xdb\x82\xb1\xc0\x77\x5c\xbd\xb2\xb8\x6d\xf4\x6c\x11\x31\x85\x03\xcb\x4d\x04\x5a\x7a\x19\xea\x08\xba\x04\xe9\x43\x35\xd2\x1d\xa4\x2f\xf6\xe1\x76\xff\x67\x87\x76\xfd\x57\x9a\x2a\x14\x88\xb5\xa8\x90\x9b\x20\x16\xba\xa9\x36\x68\xcf\x53\xdd\x8a\x96\x5d\xf3\x9a\x89\xae\xb4\x14\x17\xce\xb9\xac\xdd\xb8\x50\xb4\xd8\x19\x53\x42\x6d\x45\xe1\x65\xc1\xe5\x92\xc2\xa2\xf0\x48\xdb\xc0\x52\x72\x91\x3c\x6c\x83\xa8\x0a\x73\x6e\xb9\x64\x66\x1b\xad\xa5\xde\x85\xa9\x97\xb4\x0d\xee\x6f\xa8\x8c\xf3\xe0\x8e\xce\x63\xc5\x75\x69\x59\x84\xba\x14\x11\x1f\xab\xad\x33\xde\x43\xfa\x63\xf6\xc3\x3a\x71\xfa\xcd\x6c\xb6\x80\xb3\x1b\x21\xf5\x59\xb6\xad\x28\x54\x89\xda\xfa\x24\x57\x64\xa4\x0e\x65\x1b\x87\x45\xa8\xda\xa0\x07\xda\x77\x6a\xd5\x70\x6d\x61\x9f\x3e\x9d\x55\x34\x79\xdb\x42\xb1\x8c\x35\xa4\x58\x19\x0a\xc5\x79\x7d\x4c\x47\x67\xec\x4a\x12\x16\xf5\x99\x87\x3d\x57\xcd\x78\x2a\x31\x5b\x0c\xcb\x80\x50\xe2\x96\x05\x68\x74\xe8\xbf\x71\xed\xf2\x5c\x37\xac\xad\x79\x94\x65\x5b\x51\x74\x91\x87\xb4\xd6\x70\x9e\x54\x60\xb2\xa1\x90\x59\x89\x63\x98\x1a\x41\x89\xd8\x4f\x90\xda\x55\x82\x52\xbc\x55\x2a\x8a\xdd\x0d\xf8\x42\x98\xa2\xae\x51\x10\x8e\xa3\xb5\xa7\x16\x5a\x72\x47\x46\xe4\x44\x21\x42\xd9\xcd\xb5\xb4\x12\x47\xbd\xd4\x3b\xd7\x76\x4a\x98\x47\xb4\x56\x96\x25\x6a\x2e\xd8\x86\x22\xd9\x63\x98\x1c\xc8\x56\x61\x83\xa4\x19\x81\x70\x6e\x11\xea\x35\x38\xbc\x2d\x2b\xa9\x2f\xe1\xef\xa6\xb1\xa9\x72\x19\x3b\x54\x88\x4b\x1b\x85\x55\xd4\xa4\x5e\x1f\x98\xdb\x9b\x46\x95\xb0\xa1\x85\xf0\xa2\xe2\x7e\x2e\xe6\xb3\x74\x69\x8e\xb8\x59\xc7\x95\x56\x53\x25\xd4\x8b\x1d\x6a\xb4\xac\xc5\xb5\xd8\xa1\x5b\x82\x6b\x8a\x3d\xb1\xde\x85\xe6\x08\x28\x4d\xd1\x54\xa8\xbd\x5b\x01\xe0\x6a\xb7\x02\x41\x04\xfe\xbf\xa3\x69\xec\x45\x69\x48\x5f\x56\x85\xa9\x66\x8b\x59\x8f\xfc\x38\x06\x43\xb9\x8d\xe1\xbd\x1d\x7e\x24\xbb\xdc\xc5\xae\xb6\x68\xa6\x64\x3d\xb5\xb1\x3e\x68\x54\x6f\x6b\x8d\x43\x56\x3b\xbe\x4c\x91\xdb\x23\x48\xef\x50\x6d\x57\xa9\xed\xae\x10\x1a\xcc\xd6\xa3\x26\xce\x97\xe8\xd1\x56\x5c\x7f\x14\x8d\x37\x55\xaa\x25\x2e\x61\xd3\x78\x38\x60\xd7\xac\xd2\x6f\xb0\x22\xf9\x76\x8d\x4f\xea\xc8\x45\xd1\x58\x62\x6e\x59\x5e\x36\x96\x64\xe6\xbc\xb0\xbe\xa9\x57\x3d\x37\x67\x83\x4c\x4b\x83\x2e\x98\xc1\x23\x79\x07\x8b\x3b\xe9\x3c\x5a\x2c\xe1\xfd\xc7\x3b\xde\xe4\x12\x50\xfb\xd8\xb5\xd7\x95\xa5\xdb\xf2\x64\x8f\x39\xdc\x08\x40\xb3\x5e\x7e\xff\x2a\x70\xee\x3d\xea\x63\x2c\x21\x12\x79\xa1\xfd\xc4\x4b\x8b\xa1\xe6\xcb\x64\xb4\x5d\x61\xdc\xc6\xc2\x2e\x26\x34\xa5\x91\x4f\x25\xcd\xe8\x76\x58\x13\x9b\x7c\x6f\xc2\x03\x6e\x58\xe5\x69\xcf\xa9\x39\x41\x06\xf7\xc1\x9d\x06\x64\xd0\xef\x53\xd3\xc2\x1b\xd8\x28\x53\x3c\xb8\x50\x93\x27\xda\x3b\x18\xac\xdf\xcc\x00\x20\x74\x1b\xdc\x06\x4b\x40\xd0\x46\x23\x7f\xfe\x8c\xbf\x37\xd2\x72\xc9\x11\x4a\xd4\x12\xcb\xd9\x0f\xeb\x6e\xe2\xb0\xd9\x8f\xc6\xc7\x6e\x34\x2e\xed\xb3\xff\xe2\x4e\x9a\xb6\x57\xaa\x3d\x29\x52\xd3\x40\x38\x18\x68\xcd\xd9\xa2\xd7\xb7\x08\x5b\x14\xbe\xb1\x41\x85\x36\xc4\x33\xb1\x21\x1f\xc5\x3d\x68\x72\xcb\x96\xe0\xf7\x52\xef\xce\x42\xb3\xc5\xc1\xd8\x07\x12\xb3\x70\xb3\x45\x58\x44\xee\xf6\xac\x1b\x58\xf8\x25\x54\xe2\x21\x35\xea\xa4\x4e\x27\x16\xf7\x80\x8a\xb4\x86\x24\x9e\xb7\x1c\x8a\xbd\x44\xc1\x96\xba\x26\xa6\xae\x11\xc4\x34\x9e\x24\x19\xdc\x4c\xdb\x6d\xc3\x32\x65\xf1\xce\x16\x7d\x53\xfc\xff\x6d\x23\xd6\x92\x79\xd9\x7a\x64\xee\xee\x11\x0f\xe4\x7b\x5a\xde\xb5\x8b\xb0\x1d\x90\x77\x3f\x56\x1b\xa3\x64\x01\x4a\xea\x07\x6e\xf3\x08\x05\xe3\xe8\x17\x53\xb7\x17\xd9\x01\xb3\xdd\x9b\xd8\x6f\x92\x8a\xff\x7c\x64\xf5\x77\xd3\xef\xdf\x59\xef\x7d\x69\x0a\x37\xef\x6b\x45\x06\x1c\xf4\x64\x11\xfe\x85\x4f\xc6\x39\xb9\x51\xed\xb1\x10\x3d\x27\xdc\xd6\xa1\xc5\xb3\x75\xdd\xbc\xc3\xf9\x47\xa3\x71\xbe\x84\xf9\x5b\xa5\xe6\xcb\x38\x85\xb1\x7c\x60\x14\xa6\xda\x48\x1d\x7a\x14\xcc\xf6\x32\x02\x01\xae\x74\xc9\x7d\x3a\x57\xe1\xce\xd4\xc1\x07\x43\xfa\x72\x77\xac\xae\x99\x0b\xe9\xff\xc8\xed\xed\x41\xa3\xbd\xa1\xf0\x08\x7e\x7c\xc2\xe2\xdd\x5f\xaf\xe0\xa6\x51\x5e\xfe\x22\xf1\xe0\x06\x54\x77\x9a\x3a\xef\x46\xcc\x83\x6a\x6e\x82\x6b\x2b\xe1\x9b\xce\xf0\xbe\x81\x8b\x8b\x0b\x98\xa7\x4d\x11\xf5\x71\xa6\xe4\x3e\xb8\xc5\x57\x32\xcb\x8f\xa6\x59\x0d\x56\xfb\x92\xe5\x87\x74\xb0\x31\x7e\xcf\xfd\x12\x2a\x46\x24\x1c\x22\x55\xe4\x50\x85\xf6\x2b\x80\x4f\x0a\xe9\xe0\x72\x88\x71\xaa\x3f\xd4\xc3\xcb\x25\xd2\xbd\xaf\xd4\xc2\x84\x55\x23\x32\xf7\x89\x19\x8b\xc3\x96\xe1\x8e\xd2\x44\x63\xe2\xf8\x90\xd1\xb3\xc1\x9e\x86\x7e\x22\xf6\xb3\xba\xd0\xb1\x3b\x3a\xae\x37\x18\x7a\x55\xb8\xb9\x64\xb5\xf7\xd1\x7b\xb1\xb7\x8b\xcb\x73\x47\xb5\xe0\xb3\x20\xa8\x46\xab\x29\x59\xe5\x60\x0d\x7b\xc0\xe3\xc1\xd8\xd2\x75\x9a\x92\xe8\xff\x20\x15\x5e\xe9\xad\x81\xb7\x8d\xdf\x87\x1e\x5e\xb8\x96\x95\xf4\xbd\x1d\x0c\xe9\xa7\xc5\x86\xfb\x7b\xd7\xed\xc8\x30\x69\x3b\xf4\xe0\x7c\xb3\xdd\xf6\x0c\x34\x78\xee\x3e\x0b\xfb\x7e\x72\x67\x85\xf6\x59\x47\xd9\xfe\xcd\x9c\xbe\xa4\x50\xc4\xb5\xf1\x4f\xd0\xcb\xd8\x23\xd5\x73\x26\x92\x1b\x43\x7b\x0d\x72\xdc\xc4\xc9\xee\x23\x04\x23\x5d\x64\xdf\xa5\x43\xc1\x58\x87\xeb\x41\xa8\xdc\x72\x8b\xd3\x30\x48\x8d\x61\xe8\x96\xe5\x4e\xfe\x34\xb4\x10\xa5\x43\xb5\x93\x1d\xe9\xe9\x6a\xef\x6b\xe1\xdc\xa1\x8c\xed\x97\xcc\x16\x8e\x90\x38\x6c\xc2\x43\x88\x29\x7f\xa5\x13\x4a\x49\x76\x7f\x44\xe4\x07\x1e\x3c\x5f\xed\xfd\x37\xd1\x95\x64\xcf\x16\x1e\x16\x69\xfa\x91\x02\x9a\x6b\xb3\x0b\xae\xb7\x6d\x64\x8a\x7a\x10\xc2\x9d\xd4\x06\xba\xea\xd2\x98\xd8\x5a\xd4\x36\x66\xea\x76\xa2\x9e\x15\x52\x48\x46\x81\xcf\x49\xfb\x5b\x1b\x48\xc6\x6e\x53\xa8\xd0\x39\x0a\xb5\xc0\xa2\x12\x14\x39\x86\x03\x5d\xf8\x61\x8c\x18\xa3\xc9\xd9\x82\x48\xda\xa5\x36\xa6\xb6\x9f\xf3\x9b\xd2\x7c\x93\x42\x5f\xa1\x3b\xe2\x59\xf2\xa1\xd3\xfe\x19\x4a\x78\x39\x5a\xe6\x2c\x86\x79\x5d\xf4\x1a\x57\xf3\x1c\x71\x92\x7c\x68\xef\x29\x46\x69\x37\x1e\xfa\xb7\x19\x75\xc5\x8d\xd2\xa1\xd5\xd0\xec\xae\xf1\x11\xd5\x65\x52\xfb\x10\xe0\x71\xf6\x45\x6c\x6e\xb7\x9e\x16\x31\x1d\xe7\xef\x95\xd9\x11\xd3\xc7\x07\x41\x2c\x71\x5d\x02\x97\x29\x96\xec\x73\x96\x44\x94\x2c\x70\xc9\x5d\xf6\x6d\x1b\x6f\x61\xa5\xa7\x68\x5d\x28\xb4\x7e\x09\x58\xa1\xa5\x29\x67\x89\x2c\x1e\xdd\xcf\x5c\x4f\x4a\x2a\x6f\x4e\xfc\x6d\xa7\xc3\x3d\x6f\x14\xf9\xce\x71\x74\xf0\x80\xa0\x65\xf1\x10\x7a\xbd\x89\xf9\x8d\x0b\x1a\x11\x27\x12\xf0\xae\x71\xde\x54\x43\x95\x79\xe9\x10\x43\x80\x70\xde\x37\xfd\x6b\xb3\xfb\x10\xe6\x9c\xbf\xd8\xc3\x0b\x05\x2f\x1a\x78\xe1\xe1\xb7\xf9\x0b\xfb\xdb\x1c\x5e\xbc\x71\xf0\x62\x43\x7f\xfd\xeb\x33\x52\x1a\x6d\xff\x2d\x7f\x9b\xf3\xdf\x94\x42\x5e\xbc\xdd\xa1\xf6\xf4\x69\x1e\x7d\x1d\x96\x7f\x78\x56\x46\xe1\x9c\x93\x30\x06\x6c\x6a\xcb\x54\x81\x43\xb4\x29\x8a\x2c\x53\x33\x70\x88\x79\xa0\x2b\x5d\x15\xa9\x45\xf1\xc5\x15\x2b\xd1\x8b\xdb\x88\xf7\xbf\xb4\x3b\x9a\xf7\xc5\x6d\xb7\x47\x69\x02\xcd\x7d\x37\x34\x16\x65\x6b\xf0\x44\x50\x14\x5b\xb4\xfd\xe8\x8e\x92\xfd\xbc\x7c\xc7\x7c\x20\x62\xf9\xef\x40\xf1\x79\x7b\xc8\x0c\xfc\x42\x6b\x84\xc7\xd1\x34\x6e\xca\x29\x84\x59\x06\xe6\x88\xc7\xb1\x01\x46\x73\x67\x43\x12\x56\x1e\xa4\x0b\xdd\xde\xc9\xf8\x53\xdc\x10\x56\xaf\xd1\x5e\x0c\x13\xd8\x11\x2d\x4b\xf0\x56\x68\x17\xbb\x05\x5b\xef\x12\x26\xe9\xdb\xbc\x0c\xfc\x09\x6f\x3c\xd2\xed\x41\xf0\x88\x1d\x43\x3b\x75\xee\x3f\xe4\x60\x4f\x30\xd0\xa1\xc5\x90\x63\xb5\x25\xa1\x72\xa7\x73\x60\x2c\x27\xb2\x01\x79\x09\x82\x84\x1b\x9a\xf1\x6d\x10\x7e\x3f\xc0\x88\x33\x91\x68\x58\xe2\x63\xe1\xf0\x02\x74\xc0\xb6\x8d\xb1\xa7\x96\x3b\x08\xa7\xfe\xc3\x1e\x82\xe9\x0c\x14\xaa\xb3\x88\xfe\x5d\xdc\xd0\x67\x7c\xc6\xb0\xda\xb8\xdf\xda\xa3\x52\xe9\xfc\x02\xb1\xa1\x68\xbf\x0d\xe7\x83\x3b\x8e\x21\x77\x9c\x07\x9f\xa4\xf3\xc4\xff\x61\x6a\xc7\x2e\xa6\x16\xe4\xfa\x36\x3c\x45\xe8\x11\xd7\x47\x8a\xc7\x56\xac\xe6\x61\x91\x38\x0d\xcb\x99\xd3\x16\x01\x1a\x0f\xe9\xa0\x6f\xc3\xeb\x44\x03\x08\xcf\x79\x29\x8d\x49\x76\x92\xd4\xbd\xed\x9a\x1d\xee\x90\x93\x48\xa1\x09\x79\xbd\x35\x26\x85\x94\x87\xc3\x61\xd5\x4b\xfc\xd7\x1b\x61\xc7\x11\x9f\x14\xee\x12\x6e\x44\xed\x38\xed\x0c\xcf\x3e\xa4\xf6\xa6\x97\xb8\xc6\xaf\x1c\xc7\xba\x11\x6b\xa2\x66\xa7\x74\x95\x99\x47\xe1\x33\xb3\x42\x91\x67\x0d\x0f\x40\x68\x7f\xfd\x1c\x65\x62\x3f\x4c\x0f\xac\x0f\xb8\xa1\x35\x61\xbd\x6d\x94\x5a\x77\x94\xac\xe9\x6b\x4e\x99\xe3\xc1\x04\x82\x2c\x4b\x2a\x52\xb4\x35\x18\xdd\xcd\xe4\xf7\xa8\xfb\x57\x19\x24\x8b\x38\x85\x8d\xa1\x4a\x08\xf4\x29\xb0\xb5\xe8\x68\x33\xf1\xfe\xea\xe7\xcf\xd7\x2b\x60\x0f\xcb\x02\xe4\x3b\x32\x25\x1f\x50\x1d\xe3\x04\xc9\xf1\xa6\x8b\x33\x31\x48\xcf\xd3\x65\x5f\xe8\x84\x37\x87\x2e\xd1\x8f\xe8\x29\x46\xec\x31\x7b\x35\x94\xd2\x5d\x61\x65\xed\xa3\xac\xc2\x4d\x4b\x17\xc9\x52\x8a\xda\xbf\x25\x88\xae\xac\xbd\x8e\x62\xdc\x36\x26\xef\x4d\x15\x9f\x49\xa0\xa3\xcd\x86\xdb\x5c\x66\x10\x5f\x01\x39\x88\x63\x96\x80\x4f\x05\xd6\x41\xb4\x6d\x7e\x94\x8c\x25\xb2\xc8\x0b\x4b\xa1\x74\x97\x40\x73\xe6\xcb\x97\xb3\x7c\x69\xdc\xeb\xcb\x67\x3d\x4a\x9c\x6f\x74\xba\xec\x4c\x62\x21\x31\xb5\x01\x30\x58\xc1\x99\xae\xdf\x0b\xbe\xae\xee\xd6\x65\xf9\x84\x88\x25\x79\x70\xb6\xb4\x70\xa1\x19\xf6\x60\xb9\x51\x3d\x98\x77\xab\x15\xf3\xf5\x9c\xa9\xe1\x8b\xa5\x1e\x33\xd2\xce\xba\xb8\x42\xf0\x3d\x05\x03\xfb\xae\xaa\x87\x03\xeb\x62\x27\x2f\x36\x52\xaf\x07\x29\x75\xfa\x38\x9f\x4d\x79\xac\x62\x27\xcb\xac\xc3\x0a\x93\xdf\x99\xe2\xe1\x12\x6e\x89\xb5\x16\xb9\x6b\x3e\x70\xc7\x2d\xa1\x44\x27\x77\x5a\xf8\xe0\x55\x83\x66\x87\xb8\xed\xe7\x8f\x57\x7f\x8b\xb3\x38\x53\x3c\x60\xeb\xc3\xf8\x0c\x68\x34\x27\xa3\xdd\x65\x25\xe5\xd1\xe1\x52\x9b\x63\xc1\xd0\xc5\x58\x0e\x7c\x72\x20\x86\x26\x03\xf6\xc9\xc5\x4e\xd2\x1f\xa7\xe9\x45\x66\xf3\xf3\xee\x1a\x34\xbe\xd5\x61\x52\x28\x93\x44\x92\x33\x3b\xd2\xbe\x2e\x96\xb3\x45\xa0\xa9\x55\x21\x76\xba\xae\x3d\x66\xc3\x0b\x09\x72\x2f\xe9\x9a\x3d\x26\x48\xf9\x7b\x8d\x44\x47\xee\x02\xec\x63\xba\x00\x4b\xb9\xe5\xc7\xdc\x8d\x58\x3e\xd3\xeb\x84\xd8\xeb\x6c\x19\x45\xaa\xc7\x1a\x5d\xcc\x50\xf9\xca\xa6\xbd\x25\xe4\x23\x32\xda\x27\xe7\x1a\xfb\xf0\x82\x82\x45\x20\xea\x9a\x6f\xae\x29\xe5\x4a\xb9\x7d\x7c\xb3\x08\xf8\xe4\x51\xbb\xe8\x45\x6e\xae\x6e\x7e\xbc\xf0\xc7\x7a\x70\x82\xf6\x17\x25\x06\xad\xb9\xc1\x86\x46\x8d\x73\xfc\xf4\x54\x66\x70\x22\x8a\x92\xe5\x63\x6c\xba\x30\x0f\x0a\x46\x4b\x8d\xca\x1a\x1d\x65\xdd\x23\x4a\x72\x03\x7d\x02\xf8\x69\x54\x7a\x41\x14\xd2\x5f\x82\x0e\xb4\x2b\xff\x64\x67\xf7\x55\xd6\xb0\xf2\xbb\xaf\x63\x9a\x7f\xd4\x85\xe1\xd7\x30\x43\xba\x59\x2b\x0a\xb4\xec\xf1\x36\xd6\x1c\x1c\x5a\x07\x8d\x2e\x4c\xc5\x1d\x2d\x71\x82\x5e\xe8\x12\x9f\xef\xc1\x56\x1d\x57\x7c\x65\x74\x49\xff\x86\x47\x4a\x09\xdf\x85\x87\x3e\x1c\x6e\x8d\x89\x6e\x09\x79\xba\x48\x8b\xc0\xea\xbf\x72\xe0\xb0\x97\xdd\xd7\xd3\xfd\xc4\x77\xbc\xfd\xe1\x7d\xc7\xb3\x31\xf1\x66\x2d\xbe\x78\xc3\xf2\xc2\x34\x7e\x19\xce\xb0\xa3\x69\xe2\x2c\xb5\x35\x1b\xb1\x51\xc7\x64\x6a\x31\xfa\x0c\x0f\x73\x5a\x8d\x09\x17\xf6\x3a\x94\xc7\xa0\xc2\x52\x8a\x20\x8d\xcb\xfe\xc5\x49\x56\x18\xe3\xfd\x3d\x27\xb2\xb4\xcd\xb1\xdc\xda\xe7\x5b\x03\xb1\x55\xa2\x6e\xa5\xc6\xfa\x31\x24\x77\x1e\xca\x57\xd6\xcd\x2f\xdb\x30\x23\x58\x6a\xa3\x39\x51\x0f\xde\x84\x30\xd9\x0e\x62\x11\x2b\x5e\x36\xa1\xe4\x43\x23\xbc\xb3\xe2\x50\xa6\x3b\x60\x7a\xb7\x93\x25\x39\xd6\xd6\x1f\xbe\x2d\x86\xef\xdd\xfb\x09\xe1\xd0\xba\x43\x2a\x45\xbe\x2a\x1e\xad\x60\x1a\xcf\x45\x2b\xb3\x1d\xba\xb4\xfe\xb1\x9c\x36\xf2\x72\x18\x47\xa4\xd0\x81\xec\x6f\x1e\xef\x37\xe7\xc9\x5d\xa4\xab\xc9\x79\x2f\x68\x3e\x1f\xa9\x63\xe2\x2f\xf9\xbb\x40\x0f\xac\x8a\x9d\x84\x55\xad\xa2\x2c\x28\x26\x67\x89\x13\xd7\x1d\xbc\x4c\xfd\x70\x74\xbc\xa2\x33\x8d\x2d\xd0\x9d\x5f\x9e\x4c\x48\x18\x17\x24\xa7\xc7\x71\xcc\xf8\x81\x7b\x89\x5d\x8c\x66\xa2\x44\x6b\x6b\x06\x81\x60\x78\x54\x46\x31\x95\x1c\x9c\xd6\xe9\x9c\x1e\xf3\xb4\x16\xd6\x21\xac\xdc\xde\x57\xe9\x05\x3d\x7b\x91\x50\x18\x63\xf6\xca\x74\x57\xfc\xf2\xee\xee\xea\xfc\x8f\x30\x34\xdd\x2e\xff\x8f\x38\xca\x2a\xee\xf1\xc9\xaf\x99\x96\x40\x52\x0b\xbd\x6d\x7c\xdd\xf8\xc0\x02\xb8\xfa\xf8\xee\xfa\xe7\xf7\x3f\xde\xa5\x41\xd9\x8b\xb7\x61\xef\x62\x7a\x0f\x18\xed\xa1\x17\xfa\xc4\x1c\xfd\x51\x58\x69\x9a\xf4\x13\x08\xf1\x5a\x32\xfe\xd4\x81\xe7\xd8\xc7\x74\xbf\x02\x10\x0b\x70\x84\xdb\x96\xdb\x38\x75\x08\x66\xc1\xeb\x93\x0f\xbf\xa1\xa5\x3f\x48\x35\x78\x21\xc8\x69\x50\xfc\xa1\x8c\xd8\xa1\xc0\xf7\x4c\xf4\x81\x56\xef\xd5\x89\x43\xa4\x18\xdf\xa1\x73\xbd\x6d\x30\x6b\x3c\x71\xe8\xcf\xb0\xef\x90\xce\xc9\xaf\x7c\x11\x11\xae\xc3\x42\xd9\xda\x71\x80\x5a\x61\x08\x1c\x2d\x92\x1f\x16\x8f\xc6\xba\xcb\xd9\x02\xbe\x3d\x07\xee\xfc\x61\xee\xc3\xeb\xf3\xf8\x06\xd7\xc6\x1c\xc7\xc1\x9f\xce\xd9\x51\x58\xdd\xff\x1a\x8a\x99\x86\x4f\x49\xce\x25\x68\x2e\xbe\x1b\x4b\xf9\x06\xfc\xf9\xd5\x2b\x98\x7f\xe9\x58\x5d\x09\x8e\xd2\x37\xc6\xd0\xff\x56\xf3\xf1\xf8\xef\x5e\x7d\x07\xeb\x4a\x3a\x27\xf5\x2e\x5c\xa9\x66\x06\xcc\xdb\x40\x2f\x8e\xbc\x8f\x5e\x6b\x55\xab\xcc\x8c\xaf\xa7\x72\x32\xd7\x6c\x82\xe1\x4a\xa3\x43\x57\x78\x58\x31\x3e\xbc\x16\x4f\x9f\x29\x7c\xe2\x24\xed\x49\x56\x4d\xd5\xbb\xc2\x0b\x10\x7e\xb7\xdf\x26\x93\xc1\xf0\x66\x94\xd6\xf8\xc6\xb6\x61\x46\x28\x50\xb6\x16\xcf\x77\xf0\x46\x63\xfb\x23\x16\x74\x5a\x0b\x35\x5b\xa4\x9b\xbe\xb3\x58\xd1\x3a\x5b\xc2\x99\x36\x1a\xcf\x08\xe1\xac\xd1\xdc\x27\x88\xe5\xd9\x8a\xeb\xa0\x83\xa2\x3b\x84\x47\xc4\x94\xde\xd4\x1e\x5e\xbf\x7a\x15\xe9\x5b\xcd\x16\xed\x2e\xa0\x9d\x21\xde\x02\xf3\x5d\xd5\xcd\xcd\xdb\x4f\x9c\x5e\x86\x3f\xef\x50\x97\xa4\xdd\x1c\x03\x87\xac\x28\xa6\xe5\xe9\x60\x0e\x57\x8b\x15\x56\xc6\x1e\x2f\x62\xe4\x04\x31\x8b\x76\x11\x9b\x30\x0b\xc1\x19\xf7\xa0\x8a\x56\x22\xa5\xa5\x76\xb6\x88\xc5\x8a\x58\x9a\x4f\x3d\x26\xb2\xa2\x34\x0e\x53\x1d\x80\x12\x6b\x8e\x1d\x74\x4a\xf3\x63\x01\x77\x83\x40\xfc\xc5\x12\xcc\x76\x1b\xf2\x16\x6e\x21\xd1\xbb\x60\xb4\x1a\xfd\xc1\xd8\x07\x2c\x2f\x2a\xd3\xe8\xf0\xf3\x0d\x5d\x96\xc7\x3f\x6e\x22\xb7\xed\x86\xe2\x15\x80\xeb\x9e\x10\xf3\x8f\xd8\x70\xa1\xef\x20\x1d\xc9\x73\x63\xcd\x43\x78\x9c\x1d\x6e\x21\x42\x4d\xb9\x13\x83\xbb\xec\x73\xf3\x56\x2f\x47\xdc\x84\xdb\xed\x96\x78\xde\x1b\x64\xe8\xcb\x68\x94\xd1\xb3\xd9\xe2\x2d\xcb\x30\x7a\x39\xd2\xdb\x50\x34\x3e\xfd\xee\x02\x80\x2c\xb0\xa9\x6b\x85\xa4\xec\x42\x4d\x74\xc2\x9c\xfe\xec\x4e\x9b\x40\xb2\x03\xc1\x27\x6f\xc5\xba\x97\x02\x84\x03\x9d\x5b\x3e\xd8\x91\xb7\x9e\x9d\x47\x76\xf5\x64\xc3\xde\xb3\x32\xa5\xdc\x1e\xfb\x8f\xe1\x47\x2b\x9a\xed\x6c\xd1\xf3\xb8\x6c\x03\xa9\x71\x25\xfe\xa4\x4d\x61\x6a\x9e\x41\xda\xce\xdf\xb6\x97\xef\xe9\x57\x16\xdc\x8c\x72\x7e\x3a\xee\x84\x3d\xae\x66\x6d\x2f\xc5\x45\x6d\x0c\xa9\x9b\x16\x3b\x66\x04\xbc\xbc\xf9\x74\xd3\x06\xc2\xe7\xb3\x45\x3c\x8f\xfa\xbb\x0d\x6f\xd4\xab\xba\x5a\xd1\xc7\x19\xff\x74\x80\xf2\xf2\x42\x09\xbd\x6b\xc4\x0e\x47\x75\x8a\xe7\xe6\x20\x3c\x42\xbb\x60\x94\xd2\x14\xed\x94\x1f\x84\x2e\x8e\x3d\xbe\x52\xce\x41\xb9\xc6\x6c\x72\xb2\xee\x2d\x60\x9a\xe3\x3a\x11\x94\x5a\x6c\x9e\x21\x25\x11\xef\x5a\x6c\xee\xa8\xda\x93\x93\xee\xc5\x44\xcf\xcc\x90\x9a\xfc\x12\xfe\x67\x14\xea\xc2\xcb\x2a\x94\x39\xc9\x08\xba\x22\xbb\x2e\x47\xfa\x36\x39\x2b\x7b\xd7\x34\xe5\x2f\xbd\x02\x8f\xe3\xdf\x58\x9a\xc0\xe2\x96\xbe\x6e\x2b\xd7\x7c\x28\x0d\xdb\x3f\xfa\xbf\x31\x15\x74\x01\x6e\x84\x6e\xc8\xa1\x4e\xcb\x8b\x07\xb4\xd3\xbe\x97\xce\x5b\xb9\x69\x7c\xe8\x97\xd9\x1b\x6e\x71\xa1\xcd\xc5\x46\x44\xfa\xf3\xe5\xaf\xb8\x79\xff\xf6\x97\xe7\x54\xa9\x14\x8f\xdd\x16\x63\x2c\x31\xee\x8e\x7a\x0e\x3d\xfe\x8c\x44\x9a\x22\xfd\x5a\x52\x88\x63\xba\x26\x7c\x0e\x57\xda\x5f\x76\x82\x9f\xbe\xdc\x5c\x7f\xb7\xfe\x1b\xfd\xe7\xdb\x5e\x8e\x7c\xd2\xd2\xff\x66\x5a\x38\x3c\xf6\x82\x1b\xfc\x79\xf1\x51\xab\xdd\x1d\x16\x44\xc5\xcb\xbb\xbb\xeb\xf5\x97\xeb\xbb\x73\x88\x2f\x1e\xb8\x14\xbe\x88\x99\xdc\xb0\x48\xc4\x95\xff\x54\xfe\x4f\x97\x7a\xde\x24\xa7\x3b\x5b\x84\x2a\x48\xe8\x23\x22\x84\xf4\x93\x55\x77\x77\xd7\xa4\x62\xb5\x12\x9e\x7c\x7f\xec\xf1\xd2\x06\xd6\x25\x3e\xae\xad\xd0\xa5\xa9\x00\x7f\x6f\xe4\xa3\x50\xa8\xbb\x89\xe8\x78\x10\xdc\x59\x3b\xfa\xd9\x84\x0b\xa9\x21\xb5\xe1\x0e\x8a\xba\x5d\xbb\xee\x9b\x67\x84\x42\x68\xcc\x93\xe9\x21\x62\xdf\x0e\xba\xbb\xbb\xfe\xcc\x24\xde\x51\x2c\x1c\x9b\xa4\x42\x3a\x24\xf5\x08\x1a\x99\xd8\x42\xfb\x4c\xef\xa8\xec\xbf\x91\x08\x77\x1d\x9f\xac\xf1\xa6\x30\xca\xfd\x64\xb4\xb1\xb7\xb6\x44\x0b\xb7\x7a\x08\x82\xfd\x6b\xd8\xbf\x2e\x18\x7b\xfd\xed\xea\xdb\xc1\xe4\xff\x1d\x00\x00\xff\xff\x3c\xd0\xbd\x3d\xab\x4d\x00\x00") + +func testImagesHttpdHttpdConfBytes() ([]byte, error) { + return bindataRead( + _testImagesHttpdHttpdConf, + "test/images/httpd/httpd.conf", + ) +} + +func testImagesHttpdHttpdConf() (*asset, error) { + bytes, err := testImagesHttpdHttpdConfBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "test/images/httpd/httpd.conf", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _testImagesHttpdIndexHtml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xb2\xc9\x28\xc9\xcd\xb1\xb3\x49\xca\x4f\xa9\xb4\xb3\xc9\x30\xb4\xf3\x2c\x51\x28\xcf\x2f\xca\x2e\x56\xb4\xd1\xcf\x30\xb4\xb3\xd1\x87\x48\xe8\x83\x55\x71\x01\x02\x00\x00\xff\xff\x51\x55\xc5\x66\x2d\x00\x00\x00") + +func testImagesHttpdIndexHtmlBytes() ([]byte, error) { + return bindataRead( + _testImagesHttpdIndexHtml, + "test/images/httpd/index.html", + ) +} + +func testImagesHttpdIndexHtml() (*asset, error) { + bytes, err := testImagesHttpdIndexHtmlBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "test/images/httpd/index.html", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _testImagesHttpdNewAlias = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xca\x28\x29\x29\x48\xe1\x02\x04\x00\x00\xff\xff\xbd\x72\xdf\x08\x06\x00\x00\x00") + +func testImagesHttpdNewAliasBytes() ([]byte, error) { + return bindataRead( + _testImagesHttpdNewAlias, + "test/images/httpd-new/ALIAS", + ) +} + +func testImagesHttpdNewAlias() (*asset, error) { + bytes, err := testImagesHttpdNewAliasBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "test/images/httpd-new/ALIAS", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _testImagesHttpdNewBaseimage = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\xce\xbb\xae\x83\x30\x0c\x80\xe1\x9d\x77\x09\x31\x4e\x14\x61\x24\x8f\x47\x87\xae\xb4\x4b\x47\x28\x48\x45\xe2\x12\x71\xef\xdb\x57\x50\xa6\x52\xa1\x2c\xce\x90\xef\x97\x5d\x95\xcd\xb8\xc8\xb4\xce\x8d\xe6\xe7\x30\xd8\x3c\x42\x5f\xfb\x8a\x44\x5a\xd9\xb2\x29\xbc\xfd\xbf\xab\x39\xed\x6a\x85\x93\x91\xa7\xca\x68\xde\xe6\x14\x9e\x38\x6b\x1f\x46\x57\x05\xef\xef\x89\xec\x15\xc1\xc2\xdb\xfc\xa9\xe6\xb2\xc9\xdb\xb9\xff\xdc\x2f\x83\x10\x88\x93\xbf\xff\xcb\xf5\x96\xdc\x65\x36\xf6\xaf\xac\x5d\xa2\xc0\x47\x12\x3b\x14\x1b\x14\x2b\xfc\x6e\x09\x94\x5b\x4b\xa0\x8e\xad\xe3\x5e\x3a\xec\x45\x00\xed\xd4\xae\xf0\xd0\xc6\xe8\xd8\xc6\xe8\xbd\x03\x00\x00\xff\xff\x98\x37\x13\xcb\xea\x01\x00\x00") + +func testImagesHttpdNewBaseimageBytes() ([]byte, error) { + return bindataRead( + _testImagesHttpdNewBaseimage, + "test/images/httpd-new/BASEIMAGE", + ) +} + +func testImagesHttpdNewBaseimage() (*asset, error) { + bytes, err := testImagesHttpdNewBaseimageBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "test/images/httpd-new/BASEIMAGE", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _testImagesHttpdNewDockerfile = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x64\x92\x51\x6f\x9b\x3e\x14\xc5\xdf\xfd\x29\x8e\xe0\x2f\xfd\x5b\x29\x25\x59\xb6\x97\x75\xda\x03\x6d\x69\x87\x9a\x82\x14\xe8\xaa\x3e\x4d\x06\x6e\xe0\x4e\x60\x7b\xb6\x29\xcd\xb7\x9f\x48\x5a\x6d\xd1\xfc\x66\xdf\x73\xcf\xfd\xf9\xd8\x21\xae\xb5\xd9\x5b\x6e\x3b\x8f\xf5\x6a\xbd\x42\xd9\x11\xee\xc7\x8a\xac\x22\x4f\x0e\xf1\xe8\x3b\x6d\x5d\x24\x42\x11\x62\xc3\x35\x29\x47\x0d\x46\xd5\x90\x85\xef\x08\xb1\x91\x75\x47\xef\x95\x05\xbe\x93\x75\xac\x15\xd6\xd1\x0a\x67\xb3\x20\x78\x2b\x05\xe7\x5f\x44\x88\xbd\x1e\x31\xc8\x3d\x94\xf6\x18\x1d\xc1\x77\xec\xb0\xe3\x9e\x40\xaf\x35\x19\x0f\x56\xa8\xf5\x60\x7a\x96\xaa\x26\x4c\xec\xbb\xc3\x98\x37\x93\x48\x84\x78\x7e\xb3\xd0\x95\x97\xac\x20\x51\x6b\xb3\x87\xde\xfd\xad\x83\xf4\x07\xe0\x79\x75\xde\x9b\xcb\xe5\x72\x9a\xa6\x48\x1e\x60\x23\x6d\xdb\x65\x7f\x14\xba\xe5\x26\xbd\x4e\xb2\x22\xb9\x58\x47\xab\x43\xcb\xa3\xea\xc9\x39\x58\xfa\x35\xb2\xa5\x06\xd5\x1e\xd2\x98\x9e\x6b\x59\xf5\x84\x5e\x4e\xd0\x16\xb2\xb5\x44\x0d\xbc\x9e\x79\x27\xcb\x9e\x55\xbb\x80\xd3\x3b\x3f\x49\x4b\x22\x44\xc3\xce\x5b\xae\x46\x7f\x12\xd6\x3b\x1d\xbb\x13\x81\x56\x90\x0a\x41\x5c\x20\x2d\x02\x5c\xc5\x45\x5a\x2c\x44\x88\xa7\xb4\xfc\x96\x3f\x96\x78\x8a\xb7\xdb\x38\x2b\xd3\xa4\x40\xbe\xc5\x75\x9e\xdd\xa4\x65\x9a\x67\x05\xf2\x5b\xc4\xd9\x33\xee\xd3\xec\x66\x01\x62\xdf\x91\x05\xbd\x1a\x3b\xf3\x6b\x0b\x9e\x63\xa4\x66\xce\xac\x20\x3a\x01\xd8\xe9\x23\x90\x33\x54\xf3\x8e\x6b\xf4\x52\xb5\xa3\x6c\x09\xad\x7e\x21\xab\x58\xb5\x30\x64\x07\x76\xf3\x63\x3a\x48\xd5\x88\x10\x3d\x0f\xec\xa5\x3f\x9c\xfc\x73\xa9\x48\x88\x10\x59\x5e\x26\x67\x75\x2f\xc7\x86\xc7\xea\xfc\x12\x99\xd6\x26\xc2\x13\xfd\x6f\x09\x3f\x47\xe7\x31\xb0\xb5\xda\xce\xf6\x73\x2b\x0f\xf3\x48\xaf\xe1\xbc\x6c\x59\xb5\x91\x88\xb7\x77\x73\x00\x49\xfa\x10\xdf\x25\xe2\x76\x9b\x3f\xe0\xbf\x3f\x7b\xb1\x89\xaf\x92\xcd\xb1\xed\xc7\xcb\xf1\xa7\x7d\x0d\xd6\xd1\xa7\xe8\xe3\xe7\x8b\x0f\x81\xf8\x1d\x00\x00\xff\xff\x52\x2b\xc2\x57\xcd\x02\x00\x00") + +func testImagesHttpdNewDockerfileBytes() ([]byte, error) { + return bindataRead( + _testImagesHttpdNewDockerfile, + "test/images/httpd-new/Dockerfile", + ) +} + +func testImagesHttpdNewDockerfile() (*asset, error) { + bytes, err := testImagesHttpdNewDockerfileBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "test/images/httpd-new/Dockerfile", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _testImagesHttpdNewDockerfile_windows = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x55\x6d\x6f\xdb\x36\x10\xfe\xce\x5f\x71\xb0\x87\xae\x05\x22\x31\x71\xdc\x74\x73\x91\x0f\xaa\xa3\xb6\x46\x53\x3b\xb0\x9c\x66\xc1\x3c\x0c\xb4\x78\xb6\x0e\xa1\x48\x8d\xa4\x2c\x67\x1f\xf6\xdb\x07\x4a\x4e\xf3\x52\x63\x98\x01\x43\x22\xf9\x3c\x77\xcf\xbd\x51\x7d\x18\x9b\xea\xde\xd2\xa6\xf0\x30\x38\x1e\x9c\xc0\xa2\x40\xf8\x52\xaf\xd0\x6a\xf4\xe8\x20\xa9\x7d\x61\xac\x8b\x59\x9f\xf5\xe1\x92\x72\xd4\x0e\x25\xd4\x5a\xa2\x05\x5f\x20\x24\x95\xc8\x0b\x7c\x38\x39\x82\x6f\x68\x1d\x19\x0d\x83\xf8\x18\x5e\x07\x40\x6f\x7f\xd4\x7b\xf3\x9e\xf5\xe1\xde\xd4\x50\x8a\x7b\xd0\xc6\x43\xed\x10\x7c\x41\x0e\xd6\xa4\x10\x70\x97\x63\xe5\x81\x34\xe4\xa6\xac\x14\x09\x9d\x23\x34\xe4\x8b\xd6\xcd\xde\x48\xcc\xfa\x70\xbb\x37\x61\x56\x5e\x90\x06\x01\xb9\xa9\xee\xc1\xac\x9f\xe2\x40\xf8\x56\x70\xf8\x15\xde\x57\x23\xce\x9b\xa6\x89\x45\x2b\x36\x36\x76\xc3\x55\x07\x74\xfc\x72\x32\x4e\xa7\x59\x1a\x0d\xe2\xe3\x96\x72\xad\x15\x3a\x07\x16\xff\xaa\xc9\xa2\x84\xd5\x3d\x88\xaa\x52\x94\x8b\x95\x42\x50\xa2\x01\x63\x41\x6c\x2c\xa2\x04\x6f\x82\xde\xc6\x92\x27\xbd\x39\x02\x67\xd6\xbe\x11\x16\x59\x1f\x24\x39\x6f\x69\x55\xfb\x67\xc9\x7a\x50\x47\xee\x19\xc0\x68\x10\x1a\x7a\x49\x06\x93\xac\x07\x1f\x92\x6c\x92\x1d\xb1\x3e\xdc\x4c\x16\x9f\x67\xd7\x0b\xb8\x49\xe6\xf3\x64\xba\x98\xa4\x19\xcc\xe6\x30\x9e\x4d\x2f\x26\x8b\xc9\x6c\x9a\xc1\xec\x23\x24\xd3\x5b\xf8\x32\x99\x5e\x1c\x01\x92\x2f\xd0\x02\xee\x2a\x1b\xf4\x1b\x0b\x14\xd2\x88\x32\xe4\x2c\x43\x7c\x26\x60\x6d\x3a\x41\xae\xc2\x9c\xd6\x94\x83\x12\x7a\x53\x8b\x0d\xc2\xc6\x6c\xd1\x6a\xd2\x1b\xa8\xd0\x96\xe4\x42\x31\x1d\x08\x2d\x59\x1f\x14\x95\xe4\x85\x6f\x77\x7e\x08\x2a\x66\x2c\x99\x7f\x0a\xea\xd3\xc9\xd7\xe4\x53\xda\xae\xe6\xe9\xa7\x49\xb6\x98\xdf\xb2\x10\x0e\xfe\x6c\x11\x6a\x17\x6c\x0b\xb8\x24\x5d\xef\x80\xca\xe0\xd3\x1b\xa8\x75\x25\xf2\xbb\xd6\x9e\xb0\x79\x41\x5b\x3c\x0a\x0b\x0d\x4d\xcb\x0a\x25\x0e\x3c\xf2\x10\xf4\x05\xc6\x0d\x69\x69\x1a\x17\xb3\x8f\xf3\xd9\x57\x88\xa2\x4a\x09\xbf\x36\xb6\x3c\x57\xc1\x32\x17\xa5\x3c\x1b\x82\x50\x15\x69\x1c\x9d\xc6\x67\x20\x1c\x54\x16\x2b\xc6\x92\x8b\x8b\xb6\x27\xdc\x88\xf3\xc2\x94\xf8\xb4\x2b\xfe\x71\x1e\xd7\x6b\xd4\x42\xf1\x6f\xe3\x93\xb7\x7c\x45\x5a\x58\x42\xc7\x03\x41\x46\x83\x78\x18\x0f\xcf\xa2\x86\xf4\xd9\x30\x0a\x80\xf8\x6f\xaa\xa0\x3b\x0c\xaf\xcf\x6c\x37\x7b\x81\x55\x51\xc5\x1a\x3d\x97\xa6\xd1\xca\x08\xe9\xb8\x45\x85\x22\xf4\xde\x3e\x54\xc7\xab\xa2\x8a\xde\xc5\xc3\xf8\x64\x18\xdd\x90\x3e\x1d\x44\xdb\xfc\xe4\x6d\xb4\x3b\x1b\x76\x0e\x82\x89\xff\x6f\x5e\x0b\x6d\x78\x6e\x7d\xf8\xbf\x30\xf4\x72\x87\xb1\xf9\xf5\x14\x6a\xfd\x3c\x0c\x78\xf5\x6a\xc9\xc2\xe8\x94\x5b\x98\xa3\x90\x5f\x31\xf6\x3b\x0f\xbc\x9b\xf5\xc1\x90\x5f\x3c\x34\x2f\x19\xfd\x04\xf0\x9d\x76\x27\xc9\xb6\xaa\xbf\x6f\xed\x5d\xec\x03\x81\x48\xb6\xef\xfc\xe5\xf9\x0f\x8a\x03\x90\x75\x25\xfe\xe9\xb1\xb5\xd8\x78\x76\x75\x0b\x51\xb4\xb6\xa6\x3c\x0f\x55\x7d\xd4\x06\xbc\x76\x96\x2b\x93\x0b\xc5\xbb\xc2\x0e\x0e\xa0\x83\x34\xee\x8d\x51\x6d\xea\xdf\x0d\x0f\x40\xb6\xb9\xad\xb5\xa7\x12\x4f\x86\xc7\xb1\x54\x0a\xf8\xbe\xe3\x78\x76\xef\x3c\x96\xa7\x03\x7e\x80\x55\xba\x6d\x5e\xfd\x07\xa3\xa3\x74\x99\xce\x8d\x5e\x1f\x90\xcb\xc3\x3e\x7f\x84\x74\x14\xd2\x12\x77\x71\xe1\x4b\x75\x88\x52\x78\x69\x72\xc7\x1f\x41\x61\xe0\xa6\xb3\x45\xfa\x3a\x57\xa2\x96\x54\xaf\xde\x8c\x40\x9a\xfc\x0e\x2d\xac\x6a\x52\x72\x07\x0e\xbd\x6b\xe7\xed\x2a\x59\x7c\x06\xd4\x5b\xd8\x0a\x4b\xed\x25\xe7\xcd\xc3\x80\x46\x8a\xee\x3a\xc4\x11\x34\x05\xe5\x45\xb8\xba\xc2\xdd\x2d\xd1\x91\x0d\xe0\x98\xa5\xd3\x6f\x2d\xe2\xbc\x37\x1e\x2d\x25\x6d\xde\x8f\x47\xcb\x15\xe9\xf0\xc8\x6b\xab\xc2\x73\x9f\x87\xe5\x43\x1e\x9e\xec\x85\xd7\x2b\x6b\x36\x56\x94\xf0\x91\x14\xba\xe5\x95\x69\xd0\x66\x05\xaa\x96\xda\x16\x69\xd9\x16\x69\x19\xd6\xb5\xb3\xcb\x36\xf6\xe5\x3e\xf6\xe0\x6b\xf9\xbe\xc7\xd8\x75\x96\xce\x61\x6c\x74\xf8\x2a\xa0\x4d\x64\x49\x3a\xb4\xa9\xf0\xc6\xb2\xf4\xb7\xab\x59\x96\xc2\x2f\xc7\xec\x32\xf9\x90\x5e\x76\xf7\xce\x9f\xdb\xee\x5b\x75\xde\x0b\x73\x7d\xfa\x6b\x74\xd2\x63\xe9\x74\x31\xbf\xbd\x9a\x4d\xa6\x0b\xf8\xbd\x37\x1e\x1d\x48\xf5\x8a\xf4\xbe\x38\xb8\xc3\xde\x1f\xec\xdf\x00\x00\x00\xff\xff\xf2\x01\xf7\x2e\x41\x07\x00\x00") + +func testImagesHttpdNewDockerfile_windowsBytes() ([]byte, error) { + return bindataRead( + _testImagesHttpdNewDockerfile_windows, + "test/images/httpd-new/Dockerfile_windows", + ) +} + +func testImagesHttpdNewDockerfile_windows() (*asset, error) { + bytes, err := testImagesHttpdNewDockerfile_windowsBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "test/images/httpd-new/Dockerfile_windows", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _testImagesHttpdNewVersion = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x32\xd2\x33\xd1\x33\xb6\xd4\x35\xe4\x02\x04\x00\x00\xff\xff\xfb\x27\x07\x16\x09\x00\x00\x00") + +func testImagesHttpdNewVersionBytes() ([]byte, error) { + return bindataRead( + _testImagesHttpdNewVersion, + "test/images/httpd-new/VERSION", + ) +} + +func testImagesHttpdNewVersion() (*asset, error) { + bytes, err := testImagesHttpdNewVersionBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "test/images/httpd-new/VERSION", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _testImagesHttpdNewHttpdConf = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x7c\x7f\x6f\x1b\x37\xd2\xf0\xff\xfa\x14\x03\xe9\x0d\x1c\x17\xb2\x94\xe6\x7a\xef\x15\x46\x11\xbc\x79\x93\xe6\x6a\xc0\x8e\x83\x38\x6d\xef\x1e\x14\xf0\x51\xbb\x23\x89\x67\x2e\xb9\x25\xb9\x96\x95\xc3\x7d\xf7\x07\x33\x24\xf7\x97\xb8\xbe\x3e\xc0\xf3\xc7\xa5\xe7\x1d\x0e\x39\x9c\x5f\x9c\xe1\x0c\xb5\x98\x2d\xe0\xcb\x5e\x3a\x90\x0e\xfc\x1e\xa1\x12\x52\xc3\xdb\x5a\x14\x7b\x84\x9f\xbe\x7c\xf9\x04\x0e\xed\x23\x5a\x28\x8c\xde\xca\x5d\x63\x85\x97\x46\xc3\x56\x2a\x5c\x01\x5c\x79\xfa\xee\x85\xd4\x8c\x3c\x5b\x8c\x86\x95\xd2\x62\xe1\xe5\x23\x12\x58\x78\xd8\xc9\x47\xe4\x55\xe2\xa4\xd2\x3b\x90\xda\x79\xdb\x14\x34\xde\xad\x66\x0b\xb8\x43\x84\x1f\x7e\xfe\x7c\x7d\xb9\xf7\xbe\xbe\x5c\xaf\xe9\x3f\xe5\x4a\x30\x45\x2b\x63\x77\xeb\xd2\x14\x6e\xfd\x7a\xf5\xdd\xfa\x0d\x6c\x8d\x85\x12\xbd\x90\x0a\x4b\x90\x7a\x6b\x6c\xc5\x0b\xd3\x3c\x57\x1a\x6a\x61\xbd\x2c\x1a\x25\xec\x12\x1c\x12\x79\x7f\x6c\xe2\xca\x94\xeb\x8e\xf4\xd5\xde\x57\xea\xcd\x6c\xc1\xab\x09\x28\xa5\x2b\x1a\xe7\x68\x7b\x66\x0b\x28\x8a\xfd\xd4\xa6\x57\x33\x62\xee\x7b\x03\x1f\x6f\xbf\x80\x93\x55\xad\x8e\x60\x51\x94\xcc\x81\xfe\xb6\x41\x6a\xd8\xa3\x45\x38\x48\xbf\x37\x8d\x87\x46\x97\x68\x9d\x17\xba\x94\x7a\x37\x5b\xc0\x81\x98\xe7\xf7\x78\x84\xd2\xac\x00\xbe\xec\xf1\x78\x66\x31\xe0\x18\xad\x8e\x20\x1c\xec\xa5\xf6\x0e\x8c\x05\x8b\x95\x64\x7c\x12\xd0\x16\x8e\xa6\x01\x61\x11\x1a\xed\x1a\x1b\x45\xe4\x1a\xc5\xf3\x11\xb2\xd4\x08\xb4\xf3\x15\xfc\xdd\x34\xb0\x17\x8f\x08\x1b\x44\x0d\x07\x61\x35\x96\x61\x0f\xef\x06\x1b\x14\xba\x04\x65\x76\xa4\x03\xa0\x45\x85\xee\x92\xd6\xa1\xe9\xe8\x13\x7f\xe1\x55\x5d\x8d\x85\xdc\x1e\x99\x6f\x95\xd0\xc7\xd9\x82\x38\xd6\x89\xff\xcc\xb1\xf6\x58\xa3\x18\xd1\xc1\x06\x77\x52\x33\x13\x60\xbe\x9e\xc3\x4b\x63\x61\x5e\x5a\xf9\x88\x97\xeb\x39\xcf\xf2\xab\xd4\x7f\x7a\x7d\xbe\x8c\xba\x16\x95\xe8\x20\x95\x82\xc6\x61\x50\x31\x7c\xaa\x95\x2c\xa4\x87\x5a\xf8\x7d\xe0\xc0\x90\xb2\xd2\xc0\x37\xda\xf8\x6f\xc2\x6a\xc4\xdc\xb8\x1e\x4f\x0b\x8f\x42\x35\x48\x74\xde\xf1\xec\x9f\x8d\xf1\x64\x1a\xb5\xc5\x1a\x75\x89\x25\x5c\x5c\x80\x33\x30\x57\x66\xe7\xd6\xa2\x28\xd0\xb9\x7b\x65\x76\xf3\x34\x51\x0f\xcd\xa1\x07\x6f\x60\xbe\x6e\x9c\x5d\x2b\x53\x08\xb5\x0e\xda\xf6\x7a\x1e\x88\xde\x90\x1a\x78\xb4\xb5\x45\x8f\x25\x6c\x8e\xc3\x8d\x09\x97\xc3\x5d\x8f\x57\x5e\xc2\x81\x14\x81\x47\x67\xa9\x3a\x5d\x49\x38\x38\x1b\x8f\x3d\x0b\xa2\xfe\x78\xfb\xe5\xc7\x4b\xf8\x95\x55\xab\x63\x1a\x29\x50\x10\xa7\xc4\x72\xc9\xd2\xad\x1a\xe7\x99\xed\x5b\x63\x0f\xc2\x96\xe0\x94\x70\x7b\x74\xb3\x05\xeb\x36\xe9\xb9\xd9\xc2\x46\x14\x0f\x11\x00\x2f\x71\xb5\x5b\x2d\x61\x5e\x5c\xc6\xbd\xcc\xfb\x23\xe7\xc5\xe5\x6f\xf1\xf3\x39\xdb\xef\x96\x8c\x8d\xa4\x0f\x0a\xbd\x27\x6f\xe1\xc0\x54\xd2\x7b\xa2\x80\x44\x15\x80\x46\xc3\x61\x2f\x8b\x3d\x04\x7b\xc6\x27\xa4\x81\xc4\x32\x8f\x65\x6f\xff\x8d\x0b\x2c\x2e\x71\x2b\x1a\xe5\x83\xf7\x92\x0e\x2c\x16\xa6\xaa\x82\x6c\x59\x83\xd8\x60\xd4\x41\x1c\x1d\xb8\xa6\xae\x15\xe9\xad\xd0\x9d\x62\x0d\x69\xd2\x20\x36\xce\xa8\xc6\x23\x6b\x9c\x23\x89\x8b\x47\x23\x4b\xf6\x0a\x8d\x63\x6f\xc4\x9c\xed\x34\xe3\x92\x2c\x18\xbc\xa9\x93\x3d\x04\x97\x61\xec\x11\xbc\x45\x0c\xe6\x1f\x77\xd5\x37\x97\xb1\x7f\x5d\x02\x5a\x6b\xec\x32\x59\x64\x34\x23\x12\xd6\x03\xd6\xbe\xf5\x3f\xda\x78\x10\x65\x09\x22\xc8\x08\x82\x33\x01\xd4\xe5\x29\x01\x9d\xd9\x10\x1f\x6a\x23\xb5\x1f\xd0\x4e\xc8\x02\xb4\xd1\x17\xac\x95\xe4\x0e\x1f\x96\xc4\x5f\xf2\x2e\xb4\xf9\x64\xf5\x02\xba\x01\x24\xa4\xa0\xda\x37\x8d\xc7\xa7\xce\x45\x2e\x41\x6e\x99\xea\x8b\x8d\x20\xf9\x54\x04\x8e\x5b\x20\x81\x75\x94\x1c\xa4\xdb\xf3\xf4\x7b\x82\x45\x3b\x11\x15\xf6\x49\x63\x47\xd3\x28\x2f\x6b\x85\x41\x1d\xa0\x14\x58\x19\xed\x96\x71\x0e\xa5\x40\x23\x09\xda\x40\xb1\x17\x7a\x87\x20\x68\x7b\x0a\x85\xf3\xf0\x49\x96\x1f\xe8\x5c\x9b\x2d\x66\xef\x71\x4b\x7e\xf1\xee\xf3\x2f\x9f\x6f\x6f\xbf\xc0\xfc\xdd\x65\xc6\x10\xe7\xb3\xde\xda\xf3\xff\xf3\xaf\x38\xfa\xdf\xf3\x20\x6f\xde\xea\x25\xbc\x55\xca\x1c\x82\x43\x24\xf2\x31\xf0\x9e\x37\x0a\x15\x12\x15\xd2\x55\x2c\xc1\xf0\x8d\xdd\x6a\x2b\x8f\x78\xec\x48\x5d\xca\x47\x59\x36\x42\x25\x16\x2d\xc9\xd5\xc7\x3d\xd0\x84\x3b\x65\x36\xc4\xed\xa0\xdd\x8e\x29\xf8\x59\x07\xd5\xf6\x3c\x7d\x6f\x70\x27\x6e\xb9\x1d\xf0\xbc\x27\x0a\x42\xe1\xb1\x61\xc6\xd9\x22\x4b\x1f\x59\x10\xa9\x17\x1d\x0b\x03\x81\xdb\x04\x11\x75\x6d\x4d\x6d\xa5\xf0\xec\x2a\xc0\x99\x8a\x64\x67\xfc\x1e\xe9\xac\x12\x8e\x8f\xeb\x4e\x35\xc2\x72\x97\xe4\x9d\x02\x1f\xaf\xa5\xf3\xa8\xc7\x8c\xdc\x48\x5d\xa6\x38\xa5\xd5\x3a\x59\xc0\xd5\x27\x52\x75\x8b\xce\xd1\x96\x74\xb9\x36\x76\xb6\x80\xda\x58\xef\x96\x7d\x77\xd3\xdb\xda\x8a\x63\x0e\xa1\x9c\xe1\xaf\x3f\xfc\x22\xad\x6f\x84\xfa\xc9\x38\x4f\xc7\xfe\xe8\x3c\x7f\x97\xd8\x28\xd9\xd6\x03\x75\xb4\xff\x09\x12\x1c\xb8\xbd\x39\x68\xd8\xa0\x32\x07\xf0\x86\xa8\xb1\xf8\x48\x52\x89\xe4\x6f\xad\xa9\x48\x7e\x55\x25\xf5\x0e\x8c\x26\x0f\x42\x3e\xcb\x34\xba\x1c\x4c\xc6\x04\xc4\x05\xbf\x7d\xbd\xfa\xd3\x77\xab\x3f\xff\xdf\xd5\x5f\xbe\xbf\xfc\xfe\xd5\x2c\x7e\xfd\xfe\xd5\xec\x6d\x59\xfe\x24\x74\xa9\xe8\x00\xa9\xc9\x65\xb1\xab\x58\x3f\x5d\xb0\x41\x5c\xd4\xfb\x1a\x56\xf5\xbe\xa6\x71\x5f\x8e\x35\x3e\x3b\x08\x38\xf6\x99\x7d\xfa\xe9\xd3\x95\x96\xef\xa5\x65\xdf\xed\x8d\x51\x6e\x5d\xef\xeb\xbf\x7c\x37\x0f\x1e\xe6\xa8\x45\x25\x0b\xb8\x23\xd3\x2c\xe1\x76\xf3\x4f\x2c\x3c\xbc\x7c\x7f\x77\x7b\x0e\x77\x4d\x4d\xbc\xe7\x71\x5f\x0c\xf9\x09\xb1\x51\x2c\xb1\x70\x62\x23\x6c\x1b\xcd\x51\x90\x50\xd2\x1f\x49\x32\x02\x2a\x53\x36\x0a\xa3\x03\x3c\x08\x07\x9b\x46\x2a\x4f\xac\x14\xf0\xfe\xee\x96\x54\x60\xb6\x08\xa1\x8a\x37\x50\x2b\x51\x20\x14\xc6\x5a\x74\xb5\xe1\x90\x09\xfe\x71\x6d\x44\x79\xc3\xd3\x9c\x01\x85\x38\x2e\x38\xbd\x74\x32\x50\x18\x13\xc4\xdd\x17\xb0\x4b\xd1\x2c\x47\x93\x20\x3d\xdb\x84\x28\x48\x1b\x28\xc8\x7a\x14\x52\x31\xf9\xf7\x1b\xdc\x1a\x8b\xf7\x21\x26\x6b\x9d\x15\x39\x4a\x2f\xbc\x2c\x78\x78\x61\xaa\x9a\x03\xd3\xb0\x1d\x07\x2f\xfd\xde\x38\x04\x45\xa2\xe2\xa3\xe8\x1f\xc1\x47\x5d\xa8\xb3\x73\x0a\x4b\xc8\x5a\xc8\x3b\xcd\x16\xac\xe0\x08\xca\x08\x3a\x95\xe8\x2c\x0e\xba\xf7\xe3\x93\xa8\x6a\x85\x97\xb3\x6e\x7b\x40\x82\xb8\x8f\x1c\x1b\x89\x87\xff\x8d\xde\xea\xfe\xbb\x55\xa9\x14\x05\x04\x3d\xdc\xad\x31\x09\x35\x12\x49\xb1\xef\xfd\xd6\x98\x95\x33\xac\x6c\xdd\xd8\x18\x29\xd0\xae\x84\xcf\x61\x0d\x06\x10\xfe\x00\x99\x03\xdd\x3c\x5a\x08\xfd\x47\x08\x4a\x8a\xfc\x70\x02\x9c\x0c\x56\xe6\x50\xa1\xdf\x9b\x72\x02\xa7\x83\x8f\x51\x9d\xcc\xa3\x38\x79\x32\xb4\xf1\xfb\xfb\x8d\x70\xb2\xc8\x22\xb4\x50\x66\xdd\x18\xaf\x94\x3b\x74\x79\xb6\x75\xe0\x2c\x26\x25\x35\x93\x78\x04\xcc\x61\xe9\x7b\xa1\x8d\x9e\x42\x0b\xd0\xcc\xf6\xf4\x7d\x41\x6a\x3d\x89\x46\xd0\xfc\x72\xe5\xa6\x9c\x46\x2b\x37\xe5\x14\xd6\xe4\xd6\x18\x98\x25\x91\x0e\xa0\x69\x2c\xce\x4c\xb3\x8b\x39\x53\x90\x25\x4c\xa3\xc6\x01\x59\xec\xaf\xf7\xdb\x62\x27\x27\x71\x03\x78\x02\x53\x95\xa2\x7e\x06\x93\xc0\x99\x8d\x7e\x7d\x56\x16\x5f\x27\x65\xf1\xf5\x39\x59\x7c\x9d\x92\xc5\xd7\xe7\x64\xf1\x75\x42\x16\x5f\xef\x77\xd6\x34\xf5\x73\x02\xe9\x0d\xc9\x4e\xb0\x37\xd3\x56\x11\xa0\x79\x6a\xcd\x41\xa3\x9d\x46\x64\x70\x76\xc1\xc6\x3d\x87\x47\xd0\x53\x34\x43\xf9\xf4\xd3\x04\x56\x00\x8e\xa9\xdc\x34\xdb\x6d\x7e\xa1\x00\x19\x8f\x9f\x54\xcd\xac\x4a\x86\xd1\x14\x68\x4d\xa2\x30\x34\x8f\xf7\x8c\x21\x0c\x06\x9c\x60\xa3\xd5\xf7\x15\x7a\x91\xc5\x4c\xc0\x11\xfb\x26\xac\x26\x63\x2d\xc5\x5e\x58\x87\xfe\x5e\x49\x9f\xa7\xad\x07\x1f\xe3\x96\x22\x4f\x15\x7d\x3f\x1d\xfb\x98\x1f\xfa\x98\x1b\xb9\xcd\x1e\x0f\x01\x92\x1b\xaf\x4c\x91\x15\x4a\x82\x9d\xe0\xe4\x8d\x35\x63\xa6\x25\x6e\x95\xc8\xb3\x26\x82\x46\xac\x2f\x65\x56\x01\x4b\x79\xa2\x7d\x65\x53\xd5\x32\x1b\x0a\x04\xc8\x68\x62\xd4\x59\x0e\xa2\x3e\xe1\x20\x3e\xd5\xd2\x62\x96\x85\x11\x74\x8a\xe1\xc9\x87\xfb\xbc\xf1\x74\xd0\x31\x1e\x3b\xa1\x49\xbd\xee\xa0\x19\xbc\x89\xb5\xf2\xeb\xec\x51\x94\x68\xb3\x3b\x8a\xa0\x0c\x86\xf5\x1b\xcc\x07\x4d\x2d\x30\x8b\x55\x19\x2d\xbd\xc9\x52\xd7\x87\x9f\xe0\x7a\x5f\xbf\xce\x22\x11\x60\x3c\x5a\x96\xa8\xb3\xb4\x31\xe0\x64\x74\x25\x76\x58\xe5\x0f\xb4\x04\x1b\xa9\x8b\xd4\x85\x6a\xca\xac\x5c\x22\xe8\x04\x61\x9b\x55\x46\xfa\x3e\x1e\xea\x44\x9d\x75\x30\x0c\x18\x13\xaf\x36\x21\x0a\xbc\xdf\x1c\x37\x8d\x3b\x6a\x8a\x57\x33\xb8\x99\x61\xcf\xcc\x64\xf1\xf7\x06\x9d\xff\x4f\x33\xa5\x61\xcf\xcc\xe4\xad\xd8\x6e\xf3\xe1\xe5\xe9\xa8\xc9\x79\x9e\xd5\xb7\xd3\x51\x27\xf3\x4c\x44\x2b\x29\x4c\x19\x8c\x35\xbb\xbc\xdb\x60\xc0\x48\x54\xca\xec\xee\xc3\xf5\xd5\x04\x46\x84\x66\x16\xb9\x2f\x71\xd3\x4c\xa2\x31\x30\x87\x45\x39\x9a\x9e\x88\xd7\xfb\xf0\x13\xdc\x26\x7b\x98\xa8\xe6\xe4\x2c\xa9\x44\x61\xb3\x0c\x60\xc0\xc9\xe8\xac\xab\xaf\xca\x11\xa3\x2a\x59\x65\x8d\x85\xbe\x9f\x4c\xc9\x63\xc5\x2e\xbf\xc9\x0e\x3a\x5a\x42\xe3\xce\x78\xc9\x79\x70\x0e\xaf\x07\x1e\x2f\x58\x5b\xf3\x74\xcc\xe1\x30\x20\x3f\x5a\xfc\x33\xab\x51\x2d\x30\x8f\xb5\x11\x4a\xe8\x22\xef\x9b\x87\x23\xf2\xf8\x85\xd1\x1a\x8b\xac\x15\x0c\x06\xe4\xb1\xf1\xa9\xb6\x13\xee\x61\x30\x20\x8f\x3d\x95\x2c\x74\xd0\x09\x3c\xff\x0c\xa7\xb6\x7e\x82\x53\x7b\x5f\xa9\x69\x34\x82\x4e\xe1\x3d\xb7\x1c\x41\xa7\xf1\xb2\xe7\x4b\x0f\x9c\xc7\x74\xcf\xf2\xc5\x4d\xf2\xa5\x39\xb8\xe7\x10\x19\x9c\xc7\x3c\x38\xdf\x68\x8d\xcf\xf0\x27\x8d\x18\xe3\x5b\xe1\x51\xc9\x4a\x66\x35\xa8\x05\x9e\x60\xe1\x56\xf1\xd5\x68\x16\x2b\x01\x4f\xb1\x2a\xe3\x51\x66\xa5\x91\x60\xa7\x38\x7c\xa0\xe4\x51\x18\x94\xc1\xf0\xb2\x42\xd3\x4c\x21\x45\xe8\x29\xde\xc1\x4e\x04\xe5\x11\x34\xc6\x70\x98\x75\x75\x0e\x4f\xa2\x5a\x87\x5c\x4b\xcd\x8f\x66\xd0\x14\x46\x61\xcc\x83\xcc\x12\x35\x1c\x31\x89\x6f\x8f\xb5\xcf\x3a\xef\xe1\x88\x29\xfc\x89\xc8\xbd\x07\x1e\x39\x5d\x87\x1e\xf5\xa3\xdc\xe6\xb1\x02\xec\x64\x31\x65\x7c\x85\xd5\x7d\xad\x84\xcc\x33\xa9\x3f\x60\x0a\xdb\xed\xb3\xb9\x7d\x0f\x7c\x82\x19\x73\xc4\x89\x5b\x81\x1e\x78\x0a\xb3\xc2\x6a\x32\x1c\x1f\x8f\x19\x33\x2a\x82\xdd\xbe\x2a\x36\xcf\xe1\xf3\x80\x13\x02\x6a\x54\x52\x67\xa3\x85\x08\x1a\x2f\xe7\xb2\xde\xc1\x39\x35\x1e\xe8\x85\x6f\xb2\x47\x42\x80\x9c\x50\xd2\x6c\x9c\x97\xbe\xc9\x9b\x4e\x07\x1d\xe3\x35\x5a\xfe\xde\xe0\xbd\xcc\xea\x57\x0b\x3c\xc1\x72\x68\x27\x52\xbe\x08\xca\x61\x78\x2b\xf2\x09\x6b\x0b\x1c\x63\x3d\xa2\x9d\xb2\xd8\x08\x3a\xc1\xe0\x5b\x9e\xc9\x2b\xdd\x1e\x78\x8c\x79\x10\xbe\xd8\x97\x26\x2b\xcc\x04\x1b\xe3\x3c\x55\xea\x35\xea\x6c\x3c\x14\x41\x84\x31\xfb\xe1\x6a\xdb\xb1\xfb\x29\xb1\xfa\x0d\xdf\xb3\xf7\x6b\x8e\xe1\x8e\xde\x1b\xb0\x8d\x0e\x25\x88\x52\x6e\xb7\x68\x51\x73\xf9\xdb\x82\xb1\xc0\x77\x5c\xbd\xb2\xb8\x6d\xf4\x6c\x11\x31\x85\x03\xcb\x4d\x04\x5a\x7a\x19\xea\x08\xba\x04\xe9\x43\x35\xd2\x1d\xa4\x2f\xf6\xe1\x76\xff\x67\x87\x76\xfd\x57\x9a\x2a\x14\x88\xb5\xa8\x90\x9b\x20\x16\xba\xa9\x36\x68\xcf\x53\xdd\x8a\x96\x5d\xf3\x9a\x89\xae\xb4\x14\x17\xce\xb9\xac\xdd\xb8\x50\xb4\xd8\x19\x53\x42\x6d\x45\xe1\x65\xc1\xe5\x92\xc2\xa2\xf0\x48\xdb\xc0\x52\x72\x91\x3c\x6c\x83\xa8\x0a\x73\x6e\xb9\x64\x66\x1b\xad\xa5\xde\x85\xa9\x97\xb4\x0d\xee\x6f\xa8\x8c\xf3\xe0\x8e\xce\x63\xc5\x75\x69\x59\x84\xba\x14\x11\x1f\xab\xad\x33\xde\x43\xfa\x63\xf6\xc3\x3a\x71\xfa\xcd\x6c\xb6\x80\xb3\x1b\x21\xf5\x59\xb6\xad\x28\x54\x89\xda\xfa\x24\x57\x64\xa4\x0e\x65\x1b\x87\x45\xa8\xda\xa0\x07\xda\x77\x6a\xd5\x70\x6d\x61\x9f\x3e\x9d\x55\x34\x79\xdb\x42\xb1\x8c\x35\xa4\x58\x19\x0a\xc5\x79\x7d\x4c\x47\x67\xec\x4a\x12\x16\xf5\x99\x87\x3d\x57\xcd\x78\x2a\x31\x5b\x0c\xcb\x80\x50\xe2\x96\x05\x68\x74\xe8\xbf\x71\xed\xf2\x5c\x37\xac\xad\x79\x94\x65\x5b\x51\x74\x91\x87\xb4\xd6\x70\x9e\x54\x60\xb2\xa1\x90\x59\x89\x63\x98\x1a\x41\x89\xd8\x4f\x90\xda\x55\x82\x52\xbc\x55\x2a\x8a\xdd\x0d\xf8\x42\x98\xa2\xae\x51\x10\x8e\xa3\xb5\xa7\x16\x5a\x72\x47\x46\xe4\x44\x21\x42\xd9\xcd\xb5\xb4\x12\x47\xbd\xd4\x3b\xd7\x76\x4a\x98\x47\xb4\x56\x96\x25\x6a\x2e\xd8\x86\x22\xd9\x63\x98\x1c\xc8\x56\x61\x83\xa4\x19\x81\x70\x6e\x11\xea\x35\x38\xbc\x2d\x2b\xa9\x2f\xe1\xef\xa6\xb1\xa9\x72\x19\x3b\x54\x88\x4b\x1b\x85\x55\xd4\xa4\x5e\x1f\x98\xdb\x9b\x46\x95\xb0\xa1\x85\xf0\xa2\xe2\x7e\x2e\xe6\xb3\x74\x69\x8e\xb8\x59\xc7\x95\x56\x53\x25\xd4\x8b\x1d\x6a\xb4\xac\xc5\xb5\xd8\xa1\x5b\x82\x6b\x8a\x3d\xb1\xde\x85\xe6\x08\x28\x4d\xd1\x54\xa8\xbd\x5b\x01\xe0\x6a\xb7\x02\x41\x04\xfe\xbf\xa3\x69\xec\x45\x69\x48\x5f\x56\x85\xa9\x66\x8b\x59\x8f\xfc\x38\x06\x43\xb9\x8d\xe1\xbd\x1d\x7e\x24\xbb\xdc\xc5\xae\xb6\x68\xa6\x64\x3d\xb5\xb1\x3e\x68\x54\x6f\x6b\x8d\x43\x56\x3b\xbe\x4c\x91\xdb\x23\x48\xef\x50\x6d\x57\xa9\xed\xae\x10\x1a\xcc\xd6\xa3\x26\xce\x97\xe8\xd1\x56\x5c\x7f\x14\x8d\x37\x55\xaa\x25\x2e\x61\xd3\x78\x38\x60\xd7\xac\xd2\x6f\xb0\x22\xf9\x76\x8d\x4f\xea\xc8\x45\xd1\x58\x62\x6e\x59\x5e\x36\x96\x64\xe6\xbc\xb0\xbe\xa9\x57\x3d\x37\x67\x83\x4c\x4b\x83\x2e\x98\xc1\x23\x79\x07\x8b\x3b\xe9\x3c\x5a\x2c\xe1\xfd\xc7\x3b\xde\xe4\x12\x50\xfb\xd8\xb5\xd7\x95\xa5\xdb\xf2\x64\x8f\x39\xdc\x08\x40\xb3\x5e\x7e\xff\x2a\x70\xee\x3d\xea\x63\x2c\x21\x12\x79\xa1\xfd\xc4\x4b\x8b\xa1\xe6\xcb\x64\xb4\x5d\x61\xdc\xc6\xc2\x2e\x26\x34\xa5\x91\x4f\x25\xcd\xe8\x76\x58\x13\x9b\x7c\x6f\xc2\x03\x6e\x58\xe5\x69\xcf\xa9\x39\x41\x06\xf7\xc1\x9d\x06\x64\xd0\xef\x53\xd3\xc2\x1b\xd8\x28\x53\x3c\xb8\x50\x93\x27\xda\x3b\x18\xac\xdf\xcc\x00\x20\x74\x1b\xdc\x06\x4b\x40\xd0\x46\x23\x7f\xfe\x8c\xbf\x37\xd2\x72\xc9\x11\x4a\xd4\x12\xcb\xd9\x0f\xeb\x6e\xe2\xb0\xd9\x8f\xc6\xc7\x6e\x34\x2e\xed\xb3\xff\xe2\x4e\x9a\xb6\x57\xaa\x3d\x29\x52\xd3\x40\x38\x18\x68\xcd\xd9\xa2\xd7\xb7\x08\x5b\x14\xbe\xb1\x41\x85\x36\xc4\x33\xb1\x21\x1f\xc5\x3d\x68\x72\xcb\x96\xe0\xf7\x52\xef\xce\x42\xb3\xc5\xc1\xd8\x07\x12\xb3\x70\xb3\x45\x58\x44\xee\xf6\xac\x1b\x58\xf8\x25\x54\xe2\x21\x35\xea\xa4\x4e\x27\x16\xf7\x80\x8a\xb4\x86\x24\x9e\xb7\x1c\x8a\xbd\x44\xc1\x96\xba\x26\xa6\xae\x11\xc4\x34\x9e\x24\x19\xdc\x4c\xdb\x6d\xc3\x32\x65\xf1\xce\x16\x7d\x53\xfc\xff\x6d\x23\xd6\x92\x79\xd9\x7a\x64\xee\xee\x11\x0f\xe4\x7b\x5a\xde\xb5\x8b\xb0\x1d\x90\x77\x3f\x56\x1b\xa3\x64\x01\x4a\xea\x07\x6e\xf3\x08\x05\xe3\xe8\x17\x53\xb7\x17\xd9\x01\xb3\xdd\x9b\xd8\x6f\x92\x8a\xff\x7c\x64\xf5\x77\xd3\xef\xdf\x59\xef\x7d\x69\x0a\x37\xef\x6b\x45\x06\x1c\xf4\x64\x11\xfe\x85\x4f\xc6\x39\xb9\x51\xed\xb1\x10\x3d\x27\xdc\xd6\xa1\xc5\xb3\x75\xdd\xbc\xc3\xf9\x47\xa3\x71\xbe\x84\xf9\x5b\xa5\xe6\xcb\x38\x85\xb1\x7c\x60\x14\xa6\xda\x48\x1d\x7a\x14\xcc\xf6\x32\x02\x01\xae\x74\xc9\x7d\x3a\x57\xe1\xce\xd4\xc1\x07\x43\xfa\x72\x77\xac\xae\x99\x0b\xe9\xff\xc8\xed\xed\x41\xa3\xbd\xa1\xf0\x08\x7e\x7c\xc2\xe2\xdd\x5f\xaf\xe0\xa6\x51\x5e\xfe\x22\xf1\xe0\x06\x54\x77\x9a\x3a\xef\x46\xcc\x83\x6a\x6e\x82\x6b\x2b\xe1\x9b\xce\xf0\xbe\x81\x8b\x8b\x0b\x98\xa7\x4d\x11\xf5\x71\xa6\xe4\x3e\xb8\xc5\x57\x32\xcb\x8f\xa6\x59\x0d\x56\xfb\x92\xe5\x87\x74\xb0\x31\x7e\xcf\xfd\x12\x2a\x46\x24\x1c\x22\x55\xe4\x50\x85\xf6\x2b\x80\x4f\x0a\xe9\xe0\x72\x88\x71\xaa\x3f\xd4\xc3\xcb\x25\xd2\xbd\xaf\xd4\xc2\x84\x55\x23\x32\xf7\x89\x19\x8b\xc3\x96\xe1\x8e\xd2\x44\x63\xe2\xf8\x90\xd1\xb3\xc1\x9e\x86\x7e\x22\xf6\xb3\xba\xd0\xb1\x3b\x3a\xae\x37\x18\x7a\x55\xb8\xb9\x64\xb5\xf7\xd1\x7b\xb1\xb7\x8b\xcb\x73\x47\xb5\xe0\xb3\x20\xa8\x46\xab\x29\x59\xe5\x60\x0d\x7b\xc0\xe3\xc1\xd8\xd2\x75\x9a\x92\xe8\xff\x20\x15\x5e\xe9\xad\x81\xb7\x8d\xdf\x87\x1e\x5e\xb8\x96\x95\xf4\xbd\x1d\x0c\xe9\xa7\xc5\x86\xfb\x7b\xd7\xed\xc8\x30\x69\x3b\xf4\xe0\x7c\xb3\xdd\xf6\x0c\x34\x78\xee\x3e\x0b\xfb\x7e\x72\x67\x85\xf6\x59\x47\xd9\xfe\xcd\x9c\xbe\xa4\x50\xc4\xb5\xf1\x4f\xd0\xcb\xd8\x23\xd5\x73\x26\x92\x1b\x43\x7b\x0d\x72\xdc\xc4\xc9\xee\x23\x04\x23\x5d\x64\xdf\xa5\x43\xc1\x58\x87\xeb\x41\xa8\xdc\x72\x8b\xd3\x30\x48\x8d\x61\xe8\x96\xe5\x4e\xfe\x34\xb4\x10\xa5\x43\xb5\x93\x1d\xe9\xe9\x6a\xef\x6b\xe1\xdc\xa1\x8c\xed\x97\xcc\x16\x8e\x90\x38\x6c\xc2\x43\x88\x29\x7f\xa5\x13\x4a\x49\x76\x7f\x44\xe4\x07\x1e\x3c\x5f\xed\xfd\x37\xd1\x95\x64\xcf\x16\x1e\x16\x69\xfa\x91\x02\x9a\x6b\xb3\x0b\xae\xb7\x6d\x64\x8a\x7a\x10\xc2\x9d\xd4\x06\xba\xea\xd2\x98\xd8\x5a\xd4\x36\x66\xea\x76\xa2\x9e\x15\x52\x48\x46\x81\xcf\x49\xfb\x5b\x1b\x48\xc6\x6e\x53\xa8\xd0\x39\x0a\xb5\xc0\xa2\x12\x14\x39\x86\x03\x5d\xf8\x61\x8c\x18\xa3\xc9\xd9\x82\x48\xda\xa5\x36\xa6\xb6\x9f\xf3\x9b\xd2\x7c\x93\x42\x5f\xa1\x3b\xe2\x59\xf2\xa1\xd3\xfe\x19\x4a\x78\x39\x5a\xe6\x2c\x86\x79\x5d\xf4\x1a\x57\xf3\x1c\x71\x92\x7c\x68\xef\x29\x46\x69\x37\x1e\xfa\xb7\x19\x75\xc5\x8d\xd2\xa1\xd5\xd0\xec\xae\xf1\x11\xd5\x65\x52\xfb\x10\xe0\x71\xf6\x45\x6c\x6e\xb7\x9e\x16\x31\x1d\xe7\xef\x95\xd9\x11\xd3\xc7\x07\x41\x2c\x71\x5d\x02\x97\x29\x96\xec\x73\x96\x44\x94\x2c\x70\xc9\x5d\xf6\x6d\x1b\x6f\x61\xa5\xa7\x68\x5d\x28\xb4\x7e\x09\x58\xa1\xa5\x29\x67\x89\x2c\x1e\xdd\xcf\x5c\x4f\x4a\x2a\x6f\x4e\xfc\x6d\xa7\xc3\x3d\x6f\x14\xf9\xce\x71\x74\xf0\x80\xa0\x65\xf1\x10\x7a\xbd\x89\xf9\x8d\x0b\x1a\x11\x27\x12\xf0\xae\x71\xde\x54\x43\x95\x79\xe9\x10\x43\x80\x70\xde\x37\xfd\x6b\xb3\xfb\x10\xe6\x9c\xbf\xd8\xc3\x0b\x05\x2f\x1a\x78\xe1\xe1\xb7\xf9\x0b\xfb\xdb\x1c\x5e\xbc\x71\xf0\x62\x43\x7f\xfd\xeb\x33\x52\x1a\x6d\xff\x2d\x7f\x9b\xf3\xdf\x94\x42\x5e\xbc\xdd\xa1\xf6\xf4\x69\x1e\x7d\x1d\x96\x7f\x78\x56\x46\xe1\x9c\x93\x30\x06\x6c\x6a\xcb\x54\x81\x43\xb4\x29\x8a\x2c\x53\x33\x70\x88\x79\xa0\x2b\x5d\x15\xa9\x45\xf1\xc5\x15\x2b\xd1\x8b\xdb\x88\xf7\xbf\xb4\x3b\x9a\xf7\xc5\x6d\xb7\x47\x69\x02\xcd\x7d\x37\x34\x16\x65\x6b\xf0\x44\x50\x14\x5b\xb4\xfd\xe8\x8e\x92\xfd\xbc\x7c\xc7\x7c\x20\x62\xf9\xef\x40\xf1\x79\x7b\xc8\x0c\xfc\x42\x6b\x84\xc7\xd1\x34\x6e\xca\x29\x84\x59\x06\xe6\x88\xc7\xb1\x01\x46\x73\x67\x43\x12\x56\x1e\xa4\x0b\xdd\xde\xc9\xf8\x53\xdc\x10\x56\xaf\xd1\x5e\x0c\x13\xd8\x11\x2d\x4b\xf0\x56\x68\x17\xbb\x05\x5b\xef\x12\x26\xe9\xdb\xbc\x0c\xfc\x09\x6f\x3c\xd2\xed\x41\xf0\x88\x1d\x43\x3b\x75\xee\x3f\xe4\x60\x4f\x30\xd0\xa1\xc5\x90\x63\xb5\x25\xa1\x72\xa7\x73\x60\x2c\x27\xb2\x01\x79\x09\x82\x84\x1b\x9a\xf1\x6d\x10\x7e\x3f\xc0\x88\x33\x91\x68\x58\xe2\x63\xe1\xf0\x02\x74\xc0\xb6\x8d\xb1\xa7\x96\x3b\x08\xa7\xfe\xc3\x1e\x82\xe9\x0c\x14\xaa\xb3\x88\xfe\x5d\xdc\xd0\x67\x7c\xc6\xb0\xda\xb8\xdf\xda\xa3\x52\xe9\xfc\x02\xb1\xa1\x68\xbf\x0d\xe7\x83\x3b\x8e\x21\x77\x9c\x07\x9f\xa4\xf3\xc4\xff\x61\x6a\xc7\x2e\xa6\x16\xe4\xfa\x36\x3c\x45\xe8\x11\xd7\x47\x8a\xc7\x56\xac\xe6\x61\x91\x38\x0d\xcb\x99\xd3\x16\x01\x1a\x0f\xe9\xa0\x6f\xc3\xeb\x44\x03\x08\xcf\x79\x29\x8d\x49\x76\x92\xd4\xbd\xed\x9a\x1d\xee\x90\x93\x48\xa1\x09\x79\xbd\x35\x26\x85\x94\x87\xc3\x61\xd5\x4b\xfc\xd7\x1b\x61\xc7\x11\x9f\x14\xee\x12\x6e\x44\xed\x38\xed\x0c\xcf\x3e\xa4\xf6\xa6\x97\xb8\xc6\xaf\x1c\xc7\xba\x11\x6b\xa2\x66\xa7\x74\x95\x99\x47\xe1\x33\xb3\x42\x91\x67\x0d\x0f\x40\x68\x7f\xfd\x1c\x65\x62\x3f\x4c\x0f\xac\x0f\xb8\xa1\x35\x61\xbd\x6d\x94\x5a\x77\x94\xac\xe9\x6b\x4e\x99\xe3\xc1\x04\x82\x2c\x4b\x2a\x52\xb4\x35\x18\xdd\xcd\xe4\xf7\xa8\xfb\x57\x19\x24\x8b\x38\x85\x8d\xa1\x4a\x08\xf4\x29\xb0\xb5\xe8\x68\x33\xf1\xfe\xea\xe7\xcf\xd7\x2b\x60\x0f\xcb\x02\xe4\x3b\x32\x25\x1f\x50\x1d\xe3\x04\xc9\xf1\xa6\x8b\x33\x31\x48\xcf\xd3\x65\x5f\xe8\x84\x37\x87\x2e\xd1\x8f\xe8\x29\x46\xec\x31\x7b\x35\x94\xd2\x5d\x61\x65\xed\xa3\xac\xc2\x4d\x4b\x17\xc9\x52\x8a\xda\xbf\x25\x88\xae\xac\xbd\x8e\x62\xdc\x36\x26\xef\x4d\x15\x9f\x49\xa0\xa3\xcd\x86\xdb\x5c\x66\x10\x5f\x01\x39\x88\x63\x96\x80\x4f\x05\xd6\x41\xb4\x6d\x7e\x94\x8c\x25\xb2\xc8\x0b\x4b\xa1\x74\x97\x40\x73\xe6\xcb\x97\xb3\x7c\x69\xdc\xeb\xcb\x67\x3d\x4a\x9c\x6f\x74\xba\xec\x4c\x62\x21\x31\xb5\x01\x30\x58\xc1\x99\xae\xdf\x0b\xbe\xae\xee\xd6\x65\xf9\x84\x88\x25\x79\x70\xb6\xb4\x70\xa1\x19\xf6\x60\xb9\x51\x3d\x98\x77\xab\x15\xf3\xf5\x9c\xa9\xe1\x8b\xa5\x1e\x33\xd2\xce\xba\xb8\x42\xf0\x3d\x05\x03\xfb\xae\xaa\x87\x03\xeb\x62\x27\x2f\x36\x52\xaf\x07\x29\x75\xfa\x38\x9f\x4d\x79\xac\x62\x27\xcb\xac\xc3\x0a\x93\xdf\x99\xe2\xe1\x12\x6e\x89\xb5\x16\xb9\x6b\x3e\x70\xc7\x2d\xa1\x44\x27\x77\x5a\xf8\xe0\x55\x83\x66\x87\xb8\xed\xe7\x8f\x57\x7f\x8b\xb3\x38\x53\x3c\x60\xeb\xc3\xf8\x0c\x68\x34\x27\xa3\xdd\x65\x25\xe5\xd1\xe1\x52\x9b\x63\xc1\xd0\xc5\x58\x0e\x7c\x72\x20\x86\x26\x03\xf6\xc9\xc5\x4e\xd2\x1f\xa7\xe9\x45\x66\xf3\xf3\xee\x1a\x34\xbe\xd5\x61\x52\x28\x93\x44\x92\x33\x3b\xd2\xbe\x2e\x96\xb3\x45\xa0\xa9\x55\x21\x76\xba\xae\x3d\x66\xc3\x0b\x09\x72\x2f\xe9\x9a\x3d\x26\x48\xf9\x7b\x8d\x44\x47\xee\x02\xec\x63\xba\x00\x4b\xb9\xe5\xc7\xdc\x8d\x58\x3e\xd3\xeb\x84\xd8\xeb\x6c\x19\x45\xaa\xc7\x1a\x5d\xcc\x50\xf9\xca\xa6\xbd\x25\xe4\x23\x32\xda\x27\xe7\x1a\xfb\xf0\x82\x82\x45\x20\xea\x9a\x6f\xae\x29\xe5\x4a\xb9\x7d\x7c\xb3\x08\xf8\xe4\x51\xbb\xe8\x45\x6e\xae\x6e\x7e\xbc\xf0\xc7\x7a\x70\x82\xf6\x17\x25\x06\xad\xb9\xc1\x86\x46\x8d\x73\xfc\xf4\x54\x66\x70\x22\x8a\x92\xe5\x63\x6c\xba\x30\x0f\x0a\x46\x4b\x8d\xca\x1a\x1d\x65\xdd\x23\x4a\x72\x03\x7d\x02\xf8\x69\x54\x7a\x41\x14\xd2\x5f\x82\x0e\xb4\x2b\xff\x64\x67\xf7\x55\xd6\xb0\xf2\xbb\xaf\x63\x9a\x7f\xd4\x85\xe1\xd7\x30\x43\xba\x59\x2b\x0a\xb4\xec\xf1\x36\xd6\x1c\x1c\x5a\x07\x8d\x2e\x4c\xc5\x1d\x2d\x71\x82\x5e\xe8\x12\x9f\xef\xc1\x56\x1d\x57\x7c\x65\x74\x49\xff\x86\x47\x4a\x09\xdf\x85\x87\x3e\x1c\x6e\x8d\x89\x6e\x09\x79\xba\x48\x8b\xc0\xea\xbf\x72\xe0\xb0\x97\xdd\xd7\xd3\xfd\xc4\x77\xbc\xfd\xe1\x7d\xc7\xb3\x31\xf1\x66\x2d\xbe\x78\xc3\xf2\xc2\x34\x7e\x19\xce\xb0\xa3\x69\xe2\x2c\xb5\x35\x1b\xb1\x51\xc7\x64\x6a\x31\xfa\x0c\x0f\x73\x5a\x8d\x09\x17\xf6\x3a\x94\xc7\xa0\xc2\x52\x8a\x20\x8d\xcb\xfe\xc5\x49\x56\x18\xe3\xfd\x3d\x27\xb2\xb4\xcd\xb1\xdc\xda\xe7\x5b\x03\xb1\x55\xa2\x6e\xa5\xc6\xfa\x31\x24\x77\x1e\xca\x57\xd6\xcd\x2f\xdb\x30\x23\x58\x6a\xa3\x39\x51\x0f\xde\x84\x30\xd9\x0e\x62\x11\x2b\x5e\x36\xa1\xe4\x43\x23\xbc\xb3\xe2\x50\xa6\x3b\x60\x7a\xb7\x93\x25\x39\xd6\xd6\x1f\xbe\x2d\x86\xef\xdd\xfb\x09\xe1\xd0\xba\x43\x2a\x45\xbe\x2a\x1e\xad\x60\x1a\xcf\x45\x2b\xb3\x1d\xba\xb4\xfe\xb1\x9c\x36\xf2\x72\x18\x47\xa4\xd0\x81\xec\x6f\x1e\xef\x37\xe7\xc9\x5d\xa4\xab\xc9\x79\x2f\x68\x3e\x1f\xa9\x63\xe2\x2f\xf9\xbb\x40\x0f\xac\x8a\x9d\x84\x55\xad\xa2\x2c\x28\x26\x67\x89\x13\xd7\x1d\xbc\x4c\xfd\x70\x74\xbc\xa2\x33\x8d\x2d\xd0\x9d\x5f\x9e\x4c\x48\x18\x17\x24\xa7\xc7\x71\xcc\xf8\x81\x7b\x89\x5d\x8c\x66\xa2\x44\x6b\x6b\x06\x81\x60\x78\x54\x46\x31\x95\x1c\x9c\xd6\xe9\x9c\x1e\xf3\xb4\x16\xd6\x21\xac\xdc\xde\x57\xe9\x05\x3d\x7b\x91\x50\x18\x63\xf6\xca\x74\x57\xfc\xf2\xee\xee\xea\xfc\x8f\x30\x34\xdd\x2e\xff\x8f\x38\xca\x2a\xee\xf1\xc9\xaf\x99\x96\x40\x52\x0b\xbd\x6d\x7c\xdd\xf8\xc0\x02\xb8\xfa\xf8\xee\xfa\xe7\xf7\x3f\xde\xa5\x41\xd9\x8b\xb7\x61\xef\x62\x7a\x0f\x18\xed\xa1\x17\xfa\xc4\x1c\xfd\x51\x58\x69\x9a\xf4\x13\x08\xf1\x5a\x32\xfe\xd4\x81\xe7\xd8\xc7\x74\xbf\x02\x10\x0b\x70\x84\xdb\x96\xdb\x38\x75\x08\x66\xc1\xeb\x93\x0f\xbf\xa1\xa5\x3f\x48\x35\x78\x21\xc8\x69\x50\xfc\xa1\x8c\xd8\xa1\xc0\xf7\x4c\xf4\x81\x56\xef\xd5\x89\x43\xa4\x18\xdf\xa1\x73\xbd\x6d\x30\x6b\x3c\x71\xe8\xcf\xb0\xef\x90\xce\xc9\xaf\x7c\x11\x11\xae\xc3\x42\xd9\xda\x71\x80\x5a\x61\x08\x1c\x2d\x92\x1f\x16\x8f\xc6\xba\xcb\xd9\x02\xbe\x3d\x07\xee\xfc\x61\xee\xc3\xeb\xf3\xf8\x06\xd7\xc6\x1c\xc7\xc1\x9f\xce\xd9\x51\x58\xdd\xff\x1a\x8a\x99\x86\x4f\x49\xce\x25\x68\x2e\xbe\x1b\x4b\xf9\x06\xfc\xf9\xd5\x2b\x98\x7f\xe9\x58\x5d\x09\x8e\xd2\x37\xc6\xd0\xff\x56\xf3\xf1\xf8\xef\x5e\x7d\x07\xeb\x4a\x3a\x27\xf5\x2e\x5c\xa9\x66\x06\xcc\xdb\x40\x2f\x8e\xbc\x8f\x5e\x6b\x55\xab\xcc\x8c\xaf\xa7\x72\x32\xd7\x6c\x82\xe1\x4a\xa3\x43\x57\x78\x58\x31\x3e\xbc\x16\x4f\x9f\x29\x7c\xe2\x24\xed\x49\x56\x4d\xd5\xbb\xc2\x0b\x10\x7e\xb7\xdf\x26\x93\xc1\xf0\x66\x94\xd6\xf8\xc6\xb6\x61\x46\x28\x50\xb6\x16\xcf\x77\xf0\x46\x63\xfb\x23\x16\x74\x5a\x0b\x35\x5b\xa4\x9b\xbe\xb3\x58\xd1\x3a\x5b\xc2\x99\x36\x1a\xcf\x08\xe1\xac\xd1\xdc\x27\x88\xe5\xd9\x8a\xeb\xa0\x83\xa2\x3b\x84\x47\xc4\x94\xde\xd4\x1e\x5e\xbf\x7a\x15\xe9\x5b\xcd\x16\xed\x2e\xa0\x9d\x21\xde\x02\xf3\x5d\xd5\xcd\xcd\xdb\x4f\x9c\x5e\x86\x3f\xef\x50\x97\xa4\xdd\x1c\x03\x87\xac\x28\xa6\xe5\xe9\x60\x0e\x57\x8b\x15\x56\xc6\x1e\x2f\x62\xe4\x04\x31\x8b\x76\x11\x9b\x30\x0b\xc1\x19\xf7\xa0\x8a\x56\x22\xa5\xa5\x76\xb6\x88\xc5\x8a\x58\x9a\x4f\x3d\x26\xb2\xa2\x34\x0e\x53\x1d\x80\x12\x6b\x8e\x1d\x74\x4a\xf3\x63\x01\x77\x83\x40\xfc\xc5\x12\xcc\x76\x1b\xf2\x16\x6e\x21\xd1\xbb\x60\xb4\x1a\xfd\xc1\xd8\x07\x2c\x2f\x2a\xd3\xe8\xf0\xf3\x0d\x5d\x96\xc7\x3f\x6e\x22\xb7\xed\x86\xe2\x15\x80\xeb\x9e\x10\xf3\x8f\xd8\x70\xa1\xef\x20\x1d\xc9\x73\x63\xcd\x43\x78\x9c\x1d\x6e\x21\x42\x4d\xb9\x13\x83\xbb\xec\x73\xf3\x56\x2f\x47\xdc\x84\xdb\xed\x96\x78\xde\x1b\x64\xe8\xcb\x68\x94\xd1\xb3\xd9\xe2\x2d\xcb\x30\x7a\x39\xd2\xdb\x50\x34\x3e\xfd\xee\x02\x80\x2c\xb0\xa9\x6b\x85\xa4\xec\x42\x4d\x74\xc2\x9c\xfe\xec\x4e\x9b\x40\xb2\x03\xc1\x27\x6f\xc5\xba\x97\x02\x84\x03\x9d\x5b\x3e\xd8\x91\xb7\x9e\x9d\x47\x76\xf5\x64\xc3\xde\xb3\x32\xa5\xdc\x1e\xfb\x8f\xe1\x47\x2b\x9a\xed\x6c\xd1\xf3\xb8\x6c\x03\xa9\x71\x25\xfe\xa4\x4d\x61\x6a\x9e\x41\xda\xce\xdf\xb6\x97\xef\xe9\x57\x16\xdc\x8c\x72\x7e\x3a\xee\x84\x3d\xae\x66\x6d\x2f\xc5\x45\x6d\x0c\xa9\x9b\x16\x3b\x66\x04\xbc\xbc\xf9\x74\xd3\x06\xc2\xe7\xb3\x45\x3c\x8f\xfa\xbb\x0d\x6f\xd4\xab\xba\x5a\xd1\xc7\x19\xff\x74\x80\xf2\xf2\x42\x09\xbd\x6b\xc4\x0e\x47\x75\x8a\xe7\xe6\x20\x3c\x42\xbb\x60\x94\xd2\x14\xed\x94\x1f\x84\x2e\x8e\x3d\xbe\x52\xce\x41\xb9\xc6\x6c\x72\xb2\xee\x2d\x60\x9a\xe3\x3a\x11\x94\x5a\x6c\x9e\x21\x25\x11\xef\x5a\x6c\xee\xa8\xda\x93\x93\xee\xc5\x44\xcf\xcc\x90\x9a\xfc\x12\xfe\x67\x14\xea\xc2\xcb\x2a\x94\x39\xc9\x08\xba\x22\xbb\x2e\x47\xfa\x36\x39\x2b\x7b\xd7\x34\xe5\x2f\xbd\x02\x8f\xe3\xdf\x58\x9a\xc0\xe2\x96\xbe\x6e\x2b\xd7\x7c\x28\x0d\xdb\x3f\xfa\xbf\x31\x15\x74\x01\x6e\x84\x6e\xc8\xa1\x4e\xcb\x8b\x07\xb4\xd3\xbe\x97\xce\x5b\xb9\x69\x7c\xe8\x97\xd9\x1b\x6e\x71\xa1\xcd\xc5\x46\x44\xfa\xf3\xe5\xaf\xb8\x79\xff\xf6\x97\xe7\x54\xa9\x14\x8f\xdd\x16\x63\x2c\x31\xee\x8e\x7a\x0e\x3d\xfe\x8c\x44\x9a\x22\xfd\x5a\x52\x88\x63\xba\x26\x7c\x0e\x57\xda\x5f\x76\x82\x9f\xbe\xdc\x5c\x7f\xb7\xfe\x1b\xfd\xe7\xdb\x5e\x8e\x7c\xd2\xd2\xff\x66\x5a\x38\x3c\xf6\x82\x1b\xfc\x79\xf1\x51\xab\xdd\x1d\x16\x44\xc5\xcb\xbb\xbb\xeb\xf5\x97\xeb\xbb\x73\x88\x2f\x1e\xb8\x14\xbe\x88\x99\xdc\xb0\x48\xc4\x95\xff\x54\xfe\x4f\x97\x7a\xde\x24\xa7\x3b\x5b\x84\x2a\x48\xe8\x23\x22\x84\xf4\x93\x55\x77\x77\xd7\xa4\x62\xb5\x12\x9e\x7c\x7f\xec\xf1\xd2\x06\xd6\x25\x3e\xae\xad\xd0\xa5\xa9\x00\x7f\x6f\xe4\xa3\x50\xa8\xbb\x89\xe8\x78\x10\xdc\x59\x3b\xfa\xd9\x84\x0b\xa9\x21\xb5\xe1\x0e\x8a\xba\x5d\xbb\xee\x9b\x67\x84\x42\x68\xcc\x93\xe9\x21\x62\xdf\x0e\xba\xbb\xbb\xfe\xcc\x24\xde\x51\x2c\x1c\x9b\xa4\x42\x3a\x24\xf5\x08\x1a\x99\xd8\x42\xfb\x4c\xef\xa8\xec\xbf\x91\x08\x77\x1d\x9f\xac\xf1\xa6\x30\xca\xfd\x64\xb4\xb1\xb7\xb6\x44\x0b\xb7\x7a\x08\x82\xfd\x6b\xd8\xbf\x2e\x18\x7b\xfd\xed\xea\xdb\xc1\xe4\xff\x1d\x00\x00\xff\xff\x3c\xd0\xbd\x3d\xab\x4d\x00\x00") + +func testImagesHttpdNewHttpdConfBytes() ([]byte, error) { + return bindataRead( + _testImagesHttpdNewHttpdConf, + "test/images/httpd-new/httpd.conf", + ) +} + +func testImagesHttpdNewHttpdConf() (*asset, error) { + bytes, err := testImagesHttpdNewHttpdConfBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "test/images/httpd-new/httpd.conf", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _testImagesHttpdNewIndexHtml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xb2\xc9\x28\xc9\xcd\xb1\xb3\x49\xca\x4f\xa9\xb4\xb3\xc9\x30\xb4\xf3\x2c\x51\x28\xcf\x2f\xca\x2e\x56\xb4\xd1\xcf\x30\xb4\xb3\xd1\x87\x48\xe8\x83\x55\x71\x01\x02\x00\x00\xff\xff\x51\x55\xc5\x66\x2d\x00\x00\x00") + +func testImagesHttpdNewIndexHtmlBytes() ([]byte, error) { + return bindataRead( + _testImagesHttpdNewIndexHtml, + "test/images/httpd-new/index.html", + ) +} + +func testImagesHttpdNewIndexHtml() (*asset, error) { + bytes, err := testImagesHttpdNewIndexHtmlBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "test/images/httpd-new/index.html", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _testImagesImageUtilSh = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x5a\xe1\x72\xdb\x38\x92\xfe\x3d\x7c\x8a\x1e\x5a\xb7\xb2\x72\x26\x69\x3b\xb3\x93\xc4\x19\x5d\x8d\x62\x6b\x12\x5f\x1c\x2b\x2b\x39\x9b\xcc\xc6\x39\x15\x44\x42\x22\xd6\x24\xc0\x01\x40\xcb\x5e\x59\x79\xf6\xab\x06\x40\x8a\x94\xed\x64\xaf\xea\x6e\xeb\x52\x53\x63\x89\x02\x1a\x8d\x46\xf7\xd7\x5f\x37\xb8\xf3\x63\x54\x2a\x19\xcd\x18\x8f\x28\xbf\x86\x19\x51\xa9\xe7\xed\xc0\xb1\x28\x6e\x25\x5b\xa4\x1a\x0e\xf7\x0f\x9e\xc1\x45\x4a\xe1\x6d\x39\xa3\x92\x53\x4d\x15\x0c\x4a\x9d\x0a\xa9\x42\x6f\xc7\xdb\x81\x33\x16\x53\xae\x68\x02\x25\x4f\xa8\x04\x9d\x52\x18\x14\x24\x4e\x69\xf5\xcb\x1e\xfc\x95\x4a\xc5\x04\x87\xc3\x70\x1f\x76\x71\x80\xef\x7e\xf2\x7b\x2f\xbd\x1d\xb8\x15\x25\xe4\xe4\x16\xb8\xd0\x50\x2a\x0a\x3a\x65\x0a\xe6\x2c\xa3\x40\x6f\x62\x5a\x68\x60\x1c\x62\x91\x17\x19\x23\x3c\xa6\xb0\x64\x3a\x35\xcb\x38\x21\xa1\xb7\x03\xbf\x3b\x11\x62\xa6\x09\xe3\x40\x20\x16\xc5\x2d\x88\x79\x73\x1c\x10\x6d\x14\xc6\x7f\xa9\xd6\xc5\x51\x14\x2d\x97\xcb\x90\x18\x65\x43\x21\x17\x51\x66\x07\xaa\xe8\xec\xf4\x78\x78\x3e\x19\x06\x87\xe1\xbe\x99\xf2\x81\x67\x54\x29\x90\xf4\x8f\x92\x49\x9a\xc0\xec\x16\x48\x51\x64\x2c\x26\xb3\x8c\x42\x46\x96\x20\x24\x90\x85\xa4\x34\x01\x2d\x50\xdf\xa5\x64\x9a\xf1\xc5\x1e\x28\x31\xd7\x4b\x22\xa9\xb7\x03\x09\x53\x5a\xb2\x59\xa9\x5b\xc6\xaa\xb4\x63\xaa\x35\x40\x70\x20\x1c\xfc\xc1\x04\x4e\x27\x3e\xbc\x1a\x4c\x4e\x27\x7b\xde\x0e\x7c\x3c\xbd\x78\x33\xfa\x70\x01\x1f\x07\xe3\xf1\xe0\xfc\xe2\x74\x38\x81\xd1\x18\x8e\x47\xe7\x27\xa7\x17\xa7\xa3\xf3\x09\x8c\x7e\x83\xc1\xf9\xef\xf0\xf6\xf4\xfc\x64\x0f\x28\xd3\x29\x95\x40\x6f\x0a\x89\xfa\x0b\x09\x0c\xcd\x48\x13\xb4\xd9\x84\xd2\x96\x02\x73\x61\x15\x52\x05\x8d\xd9\x9c\xc5\x90\x11\xbe\x28\xc9\x82\xc2\x42\x5c\x53\xc9\x19\x5f\x40\x41\x65\xce\x14\x1e\xa6\x02\xc2\x13\x6f\x07\x32\x96\x33\x4d\xb4\x79\x72\x6f\x53\xa1\xe7\x29\xaa\x21\x10\x40\xa5\xa4\x37\x4c\x57\x5f\xb9\x28\xb9\xa2\xf5\xd7\x82\x15\x74\x4e\x58\xe6\x79\x17\x83\xc9\xdb\x7e\x67\x75\xb0\xf6\x3e\xbe\x19\x5c\xf4\x3b\xab\xc3\x35\xfa\x63\x22\xe2\x2b\x2a\x61\x56\xb2\x2c\xb9\x41\x67\xc8\x09\x4f\xd0\x64\x4a\xb3\x2c\xc3\x0d\x52\xc9\x72\xca\x35\xc9\x80\x28\x3c\xf8\x13\x3b\xe3\xe0\x45\xb8\xff\x34\xdc\xf7\xe8\x4d\x21\xa4\x86\x93\xd1\xf1\xdb\xe1\x78\x7a\x7c\x76\x3a\x1d\x7e\x7a\x3f\x1c\x9f\xbe\x1b\x9e\x5f\x0c\xce\xfa\x3e\xe5\x78\x94\x89\x6f\x9d\x9f\x73\x1a\xe3\xf1\xe1\x61\x12\x18\xd3\x5c\x68\x5a\x49\x74\x4e\xa0\x20\xa6\x52\xa3\x9d\x08\x86\x04\x1a\x8f\x94\x3a\xa5\x5c\xe3\x13\x26\xf8\x1e\x2c\x53\x16\xa7\x10\x13\x0e\x33\xb4\x6e\x69\xec\x45\xb4\xf5\xef\x82\xe8\x34\x84\x57\xb7\x90\xd0\x39\x29\x33\xbd\x87\x76\xbb\x6d\x8d\x46\x3f\x42\x63\x76\x56\x6f\x46\xef\x86\x6b\x98\x8b\x2c\xa1\x32\x84\x8f\xb4\x2b\xa9\xd9\x73\xad\xe4\x9c\x19\xe1\x29\x95\x14\xfc\xd0\x5a\x2b\xe8\xac\x84\x9a\x5e\xdb\xd8\x5b\xfb\x6e\xba\xaa\xd4\x12\x1c\x43\x45\x99\x15\x38\x8d\xa9\x52\x44\xde\xb6\x36\x15\x7a\x95\xb9\x86\xe3\x8b\xe9\xab\xc1\x64\x38\x7d\x3f\xb8\x78\xd3\xf7\x3b\xab\x07\x7f\x38\x0a\x9c\xa6\x6b\xdf\xf3\xde\x7e\x78\x35\x9c\x8e\x47\xa3\x8b\xbe\xdf\xd9\x8d\x13\xf0\x3b\xbb\x09\x93\x9c\xe4\x14\xfc\xce\xea\xd5\x60\xf2\x66\x3a\x19\x7d\x18\x1f\x0f\x3f\xef\x7f\x59\xfb\xbd\x28\x0c\xa3\x30\xf4\xe1\x4f\x7f\x82\x62\x99\x40\xf0\xbe\xe7\x7b\x4a\x94\x32\x36\xc3\x6b\x61\xeb\x28\x25\xf1\x55\x94\xb1\x59\x94\x89\xc5\x82\xf1\x45\xa8\xd2\xef\x8d\x2c\x35\xcb\xcc\x30\x6f\x07\xde\x91\xa2\x40\x9b\x89\x39\x2c\x04\x0c\xc6\xc7\x6f\xcc\x19\xc7\xba\x44\xcf\x91\x71\xca\x34\x8d\x75\x89\xe7\xab\x52\x56\x14\x34\x81\x82\x48\x8d\xe3\xf3\x32\xd3\x0c\x87\x44\x7f\xd0\xbc\x0c\x4a\x45\x65\xa0\xd0\xf5\x63\x28\xa4\xf8\x3b\x8d\xb5\x97\xd0\x38\x23\x92\x42\x30\x80\xbf\x0c\xdf\x7d\x40\xf1\x93\xfe\x2e\x7c\xf6\x49\x9e\xfc\xfc\x93\xff\xa5\xef\xdf\x3c\xff\x79\xfa\xf3\x4f\x3e\x3e\x92\x39\x3e\xc0\x3f\xf6\x9b\x1d\x40\x70\x05\x3b\xa2\x28\xe2\x9f\x7f\xca\x28\x3e\xad\x3e\xc2\x67\x5f\x3d\x7d\xb1\x7f\x83\xcf\xec\x07\xe8\x79\xde\x92\xf1\x44\x2c\xd5\x74\x73\xdc\xaa\xbf\x7b\xf0\x7c\xff\x05\x1c\xbc\xd8\x7f\x8a\xff\x7b\x01\x87\xfb\xfb\x3f\xc1\xe1\xfe\x9b\xc3\x5e\x53\xcb\x8f\xa7\xe7\x27\xa3\x8f\x93\xe9\x68\x32\xfd\xeb\x70\x3c\x41\x04\x99\xbe\x1b\xbc\xf7\x3c\xc6\x99\xfe\x68\xc5\x8e\x94\xc3\x6f\xb5\xdb\x83\x95\x07\xc6\xd7\x37\x4b\xa1\x97\xfa\x9d\xd5\x03\x3a\x7c\xfe\xf5\xcb\xda\x7f\x09\x89\xf0\x10\x72\x59\xbe\x98\xce\x88\xa2\x7d\x3f\x8f\x65\x98\xb3\x58\x0a\xc4\xc6\x30\x16\x79\xe4\x26\x47\x9c\x70\xa1\xa8\xbc\xa6\xf2\xa8\xed\xbc\x46\xc2\xbc\xcc\xb2\xea\x51\xbf\xb3\xeb\x30\x21\x27\x9c\xcd\xa9\xc2\x2c\x81\xc8\xa5\x51\x99\x6a\xad\xb5\x0f\x77\xb0\x90\xb4\x00\x5f\xa8\xd0\x4d\xc5\x67\x29\x25\x09\x04\x1c\x0e\xe0\x0e\xc8\xf2\x0a\xba\xab\x42\x32\xae\xa1\x73\xb8\xee\xf6\xe0\xee\x0e\xb4\x2c\xa9\x59\xf4\x11\x0b\x7d\xf6\xdb\x0a\x7e\xc1\xa8\x68\x2a\x68\x74\x4e\x04\xa7\xde\xfa\x11\x6b\xa2\x3b\x8e\xa9\x2e\x25\x57\x90\x31\x65\x7c\x8c\x64\x19\xa8\xb2\x40\xac\xa2\xc9\x96\x3f\xce\xa5\xc8\x31\x11\x0c\x4f\xdf\x0d\x5e\x0f\x4d\x82\xf4\x70\xde\x48\x0d\x64\x9c\x56\x87\x93\x89\x98\x64\xc0\x72\xb2\xa0\x16\x47\x01\xe2\x52\x43\x90\x80\xdf\xf7\x21\x98\xc3\x81\x35\x10\x59\xd0\xb5\x1f\xd5\xe2\x50\x4b\x55\x64\xcc\x49\x7b\x5c\x98\x7d\x24\xd4\x14\x95\x73\xf8\x0c\xc0\xe6\xf0\xf9\x33\x74\xdc\x63\xe8\x7f\x85\xf0\x49\x64\xfe\x83\x2f\x5f\x5e\x22\xc6\x70\x63\xcd\x1d\xe3\x3c\xce\x14\x7b\xb0\xa4\x90\x92\x6b\x8a\x21\xe8\x76\x0d\x33\xa1\x53\x38\xbb\x98\x60\x7a\x81\xc9\xe0\x18\xe2\x94\x70\x4e\x33\x85\xa9\x14\x96\x06\xfa\x4c\x1a\xc0\x28\x36\x21\x59\x64\xb4\x92\x68\x55\x55\xa1\x5b\x0b\xa1\x6d\x2e\x64\x4e\xb4\x4b\x6e\x4c\x41\x4c\x4c\xae\x3d\x82\xd1\x24\xc2\xf8\x8c\x36\x07\x6b\xa7\x09\x35\x45\x94\xea\x77\x76\x69\x9c\x0a\xf0\xab\x4d\xa1\xdb\x54\x96\x8c\xac\x25\x7b\x66\x82\x35\xc4\x77\x47\x1f\xf6\x2a\xf1\x1b\x17\xfe\xde\x9c\xa7\x76\x8e\x2a\xe7\x73\x76\xd3\x37\x03\x51\xb7\xa0\x83\xc3\x83\xce\x46\x16\x3a\x1b\xcd\x1e\x39\x85\xf6\x11\xfc\xeb\xf6\xe7\xfb\xdf\xd0\xde\x6a\xac\x6c\x90\x59\xd9\xc8\x32\xdb\xfe\x5d\x73\x92\xca\x63\xed\x01\x63\xe2\x47\xb2\x58\x48\x51\x50\x99\xdd\xba\x43\xd6\x34\x09\x61\x68\xd2\x22\x4d\x80\x72\x2d\x19\x55\xc6\xb7\x34\x42\xb8\xe1\x8d\x5d\xa1\x22\x5c\xbe\xbb\xe7\x72\x6c\xd7\xc4\x31\x3e\x5a\x77\x11\x42\x34\x25\x49\x68\x15\x47\xc2\x02\x07\x08\x78\xcc\x5b\x37\xa3\x15\xa1\xc5\x2a\xc2\x1d\xe3\x2b\x91\x00\x33\xee\x38\x42\xad\x3a\xe1\xb7\xb0\x60\xd7\x94\xb7\x42\xd9\x5b\x50\xfd\x8a\x28\x7a\x8a\x22\x5c\xa4\xd5\x01\x85\xeb\x59\xc4\xda\x28\xd6\xf7\x1b\x76\xa9\xec\xde\x87\x60\x7e\x68\xf5\xba\x30\x84\xb9\xe4\x31\xf2\x0e\x58\x22\x23\x32\x21\x02\xda\xe0\xa2\xd1\xd4\xa8\x93\x65\xc6\x9a\x2d\x5c\xf1\x76\x00\x89\x13\x13\xdc\x6e\xa1\x7d\x02\x21\x9c\x5a\x12\x42\x66\x8a\x22\xfb\x16\xf3\xad\x11\xc8\x4a\x99\x6e\xae\xda\x5c\xaa\x0d\x66\x16\xe7\x02\x30\xe9\x70\x0f\x88\xcc\x71\xb6\xc9\x7d\x7b\xe0\x72\xdc\x1e\x98\xc4\xe6\x19\x59\xdf\xc3\x21\x04\x7a\xcb\x6b\xb6\xf0\xa9\xd4\x45\xa9\xa7\xfa\xb6\xa0\x16\xa3\xc0\x51\xc8\xca\x39\xa7\x71\x4a\xe3\xab\x0d\x74\x05\xf3\x2a\x6f\x58\x71\xeb\x0d\x34\xfa\xf7\xe2\x07\xb7\xa2\xfa\x9d\xdd\x06\xfa\x82\xdf\x31\xea\xf9\xbd\xa6\x5f\xef\x40\x21\x69\x41\x79\x02\x19\xe3\xe5\x4d\x84\xae\x82\x56\xa9\xc9\x01\x30\x4d\x73\x15\x6e\x0b\x36\xc9\x68\x0e\x5d\x3b\xeb\xdf\xd4\x25\xef\xa2\x7a\x3f\xd6\xf3\x4c\x6a\xed\x59\xd7\xf4\x70\x1d\x7b\xc8\x9a\x2c\x3c\x80\x8b\xc1\xeb\x7e\x67\xf7\x97\xad\xfd\x38\x90\xf3\x7b\x38\x81\x64\x8c\x38\x1c\x40\x7a\x46\xf4\xf6\xee\x07\x67\xa7\x83\x89\x0f\x87\xff\x11\x25\xf4\x3a\xe2\x65\x96\x55\x59\xb1\xe7\x6f\x8c\x66\x32\xff\x46\xd6\x7a\xcb\x54\x36\xac\x7f\x33\x71\x46\xb8\x5d\xd4\x78\x47\xb7\x8a\xe7\x6e\x08\xaf\x2a\x30\x8f\x50\x7d\xa4\x74\x6e\x33\x44\xe1\xb8\x86\xf4\xb0\xeb\x3b\x26\x81\x7e\xb0\xb5\x72\x6d\x8b\xab\x72\x46\x8f\x8e\x90\xf3\x1d\x1d\x51\xae\x4a\x49\x83\x05\x2f\x03\x45\x13\x6f\xc3\x5d\x8c\x33\x32\x0e\x75\x8c\xa9\x75\x4d\x54\x1a\x69\xb0\x91\x2a\x9b\xf1\xe8\xd4\x30\x36\xb0\x8f\xdd\xee\xfb\x7d\xf0\x1d\x97\x31\x54\x16\x7f\xdc\x78\xa2\x1b\x60\x1d\x71\xcb\x54\x95\xb1\x8e\x09\x47\x64\x73\xe1\x9b\x52\x67\x8b\x8d\xc1\xcc\x0e\x36\xaa\x58\xfb\xe9\x3a\x01\x3a\x5a\x4f\xa5\x4b\x85\x35\x42\xcd\x28\x14\xa5\x4a\xed\x17\x02\x92\x2e\xb0\xd8\xbc\x75\x50\x07\x66\x22\xe3\x8e\xf4\x58\x4b\x56\x3a\xd5\x27\xb4\x41\x92\x1a\x8f\x5d\x16\x3d\x6a\xaa\x14\x86\xbe\xe7\xdc\xff\x58\x52\xa2\x29\x10\xd0\x34\x2f\x84\xc4\x0a\x23\x61\x92\xc6\x5a\x48\x83\xda\x40\xaf\xa9\xbc\x6d\x01\x92\x49\xfc\xa6\x7c\xdf\x6c\x1f\x95\xa3\x5c\x3b\xa1\x38\x60\xdb\x40\x86\x1c\x3d\xb0\x88\x99\x92\x5f\x25\x4c\x42\x50\xb4\x0b\x04\x3f\x9a\xea\xbc\x30\x03\x70\xe2\x34\x61\xb2\xdf\xd9\xcd\xaf\xf0\x8b\xc9\x6b\xf7\x07\x47\x08\xa8\x81\xb5\x6c\x60\x54\x08\x3f\x99\x7f\x36\xf7\x35\x5d\x4f\x4b\x52\x4c\x49\x92\x80\x2f\x73\x08\xe4\x1c\x3a\xab\x6a\x95\xb5\x0f\xc3\x4f\xa7\x17\xd6\x46\x71\x01\x81\xdc\x8a\x3e\x3f\x7a\x82\x4f\x36\xe3\x1b\xfe\x16\xcc\xa1\x1d\xa9\xef\xc8\x15\x35\x09\x67\xcb\x9f\x76\x20\x27\x57\x14\x66\xcc\x65\x04\x8d\xdf\x62\xe4\xfd\x8e\x67\xa2\xf1\x0a\x49\x4d\x3d\xab\x98\x76\xbe\x42\x93\x7a\x3e\x9e\x4f\x4d\xb5\x70\xb4\x63\xdc\x66\xff\x6e\x94\x59\x23\x38\xde\xde\x80\x59\x76\x34\xe9\xb7\xa2\x03\x1d\xc5\x84\xad\x89\x21\xb8\x18\x8c\x5f\x0f\xb1\x3c\xdc\xde\xe8\x9c\x99\x3f\xe8\xae\xc9\x96\x1d\x9c\x07\x9c\x8f\x2e\x86\xbb\x71\x46\xca\x84\x95\xb3\xde\x11\x4c\x44\xbe\xcd\x01\x21\x37\xed\x2b\x57\xad\xa3\xfa\x4c\x82\x58\x36\x53\xb4\x13\xb6\x4c\xd1\x7a\x8a\xe5\x45\x46\x25\x08\x4e\x95\x35\x18\x17\x3a\x84\xd3\xf9\x36\xe7\x6c\x11\x58\x93\x45\x80\xcd\x9d\x28\x7f\x23\x7c\x5a\xe3\x00\xbd\x61\x4a\x9b\xe6\x0b\x4a\x34\x23\x93\xcd\x30\x8b\xc1\x9b\x79\x6d\x6c\x71\xc6\xf3\x61\x0b\x58\x30\x5d\x3d\xb4\xd6\x96\x0f\x7c\x63\x9d\x7a\x4e\x2b\xe0\x91\xd9\x4c\x1d\xbe\x6e\x79\xdd\x26\xeb\x6f\x2d\xd2\x98\xd3\xd9\x6d\x52\x9b\x16\x64\xc2\x1d\x7e\x9d\x0c\x4f\x10\x4a\xd5\xdd\x78\xf8\xfa\x74\x72\x31\xfe\xfd\xae\xb3\xaa\x3e\xae\xef\x16\x7e\xcf\xc9\xac\x87\x06\x0c\x47\xe3\xda\xe8\x3d\x77\xce\x79\xee\x16\x3e\x74\xb6\x36\xd7\xda\xc7\x0e\x8c\x78\x66\x11\x04\xeb\x4c\x17\xac\x20\x38\xdc\x3c\xff\x19\xe9\xe3\xa2\x24\x92\x70\x4d\x6d\x33\x6f\x4e\xe4\x1e\x08\xd3\x2b\x43\xf9\x14\x0b\xb2\x2b\x0a\xae\x16\x87\x44\x50\xc5\xbb\xba\xae\x51\x1a\x22\xeb\x4a\xa3\x54\xa6\x83\x23\x1d\x39\xad\x71\x57\x93\xf8\x2a\x43\x04\x4c\x98\x22\x33\x96\x31\x7d\x0b\x73\x4a\x0c\xd2\x09\xa4\x56\x42\x51\x28\x32\xa2\x91\xc3\xaa\x3d\x03\x6e\x24\x53\x02\x52\x9a\x15\x28\xa0\x90\xf4\x9a\x72\x6d\x10\xce\xad\x46\xb9\xf1\xc4\xb2\x00\x02\x4b\x29\x6a\x64\xd6\x64\x81\x32\xb9\xe0\x81\x61\x58\x1b\xb9\xd6\xed\x8c\xc6\x8e\x67\xee\x96\xa6\x17\x13\xe4\xbd\xc6\x31\x77\x56\x9b\x21\x6b\xe8\x43\xd7\xb6\x2b\xba\xdb\x47\x8e\x4a\xd4\x10\x6d\xba\x21\x4f\xaa\x56\xc8\x8c\x71\x04\x60\x2d\x5a\x68\x61\x32\x50\x0d\xd9\xa6\x6c\x6b\x83\xbe\x1d\xe5\xce\xa7\x52\xbb\x5e\x8d\xcd\x2d\x27\x0e\xfe\x80\xee\xf1\x78\x34\x99\x4c\x5f\x7d\x38\x3d\x3b\x99\x76\x1b\xd1\xbc\xa5\x60\x23\x3f\x3b\x07\xec\x43\xd7\x58\xe5\x81\xdd\x6c\xbb\x5c\x37\x6a\xae\x12\x25\xdd\x6d\xd4\x70\x29\xbb\xe2\x79\x0f\xc9\xf0\xd5\x5d\x45\xd7\xee\x3a\xab\x0d\x73\x33\xd5\xcf\x17\xe3\xc2\x0f\x0a\x45\xdb\x8e\x4d\x76\xa6\x72\xcb\xb6\x15\xb1\xde\x90\xea\x42\x8a\x98\x2a\x25\xa4\xaa\x7a\xe5\xc6\xe5\x4b\x29\xd1\x65\x04\x6f\x0b\x36\xe9\xbc\x5b\x09\x47\x17\x7a\xe0\xec\xb0\x66\x72\x8d\xc7\x2b\x2a\x39\xcd\xba\x2d\x19\x96\x5f\xab\x32\x11\x15\x42\xb4\xed\xdd\xd9\x65\x09\x04\x65\x0f\x02\x4e\x61\x7f\x63\xea\x1f\x9a\x43\xed\x74\xfc\x7f\x5b\x84\x43\xfe\xea\x5f\x67\x85\x43\xd6\x5b\x7d\x3d\x9d\x32\x99\x4c\x0b\x22\xf5\x6d\xf4\x78\x4f\x2e\x92\x6e\x9b\xf5\x87\x50\xa5\x3e\x04\x81\xa4\xa6\xe9\x5c\xc0\x2d\x55\xad\xd5\xe2\x52\x66\x10\xa8\xc9\x99\xb9\x1d\x50\x47\x51\xb4\x60\x3a\x2d\x67\xa6\x43\xf5\xcd\x85\x32\x4a\x14\x55\x51\x22\x96\x3c\x13\x24\x89\x7c\x7b\xde\x8e\x71\xaf\xfd\xc8\x86\xd1\xd4\x4c\xf5\x1f\x70\x06\xdf\xc9\x0a\x35\x91\xe1\xe2\x1f\x70\x07\x9a\x48\x08\x6e\xfe\xe1\x52\xeb\x56\x82\xdc\x38\xca\xd0\x10\x5c\x58\x62\x6e\x46\x84\x5a\x50\x44\x29\x59\x48\xa6\x2c\xb2\x95\x39\x51\x57\xa0\xa8\xd6\x8c\x2f\xb6\xf6\x9b\xe6\x22\x81\xfd\x67\x7f\xfe\x73\x6b\x09\xbb\xc1\x07\x94\x74\x3a\xfa\x8f\x47\x8d\x6a\x87\x4d\xb4\x78\x24\x6e\x1a\xc7\xec\x3e\x56\xbd\x8b\x07\x8d\x03\x3f\xf6\xf1\x87\x06\x34\x35\x12\xdd\x0f\x3f\x58\x92\xaa\xae\x58\xd1\xc2\x7a\x33\xbb\x82\xc3\x46\xc4\x38\x6c\x69\x63\x5d\xe8\x7b\x3f\xfc\x50\x88\x22\xa9\x15\x6b\xf1\xe1\x56\xa0\xff\x8f\x80\xa2\x4a\x48\xed\x0b\x0c\xab\x61\x10\x14\x52\x2c\x24\x55\xaa\x5f\x64\x84\x71\x08\x02\x2e\x82\xd8\xdc\x9d\x05\x41\x81\x35\x57\x10\xd8\xfa\xa1\x6f\x2a\xd9\x7b\xe5\x44\x10\xd4\xdb\x69\x30\xad\xa8\x86\xbc\xcb\x5a\xe9\xc0\x5a\x25\x20\x72\xb1\xc9\xe4\x28\x70\x93\xbd\x8d\xbc\xcd\xa8\x2a\x2d\xe3\xa0\x3a\x45\xb7\x87\x6c\x5a\x67\xfd\xad\x76\x68\x73\x65\x53\x5b\xd6\x12\xa2\xaa\x74\x38\xea\xac\x2e\x06\xaf\xd7\x01\x06\xf9\x7c\xce\x6e\xd6\xbe\x2b\xc2\xb7\xf2\xfa\xda\x87\xd0\xda\xd0\x9d\x4f\xd5\x54\x7d\xa8\xa0\x77\xfd\x82\xed\x0b\xa3\x94\x28\x98\x51\xca\x81\x71\x2d\x45\x52\xc6\xb6\xd5\x61\x2e\x87\x5c\x5f\xb1\x4e\xd8\x86\xd1\x56\x51\x65\xba\x93\xcc\xb0\xb6\xf6\x72\x9b\xfe\x73\xd5\x06\x0f\x02\xd7\x6a\xec\xae\x56\xe1\x71\xc6\x28\xd7\xa1\x6b\xf5\xae\xd7\xdd\xba\x6d\xe3\x07\xb8\x4f\xd3\x5a\xab\x72\x6e\x5b\xf2\x1a\xdd\xdd\x5d\x5b\x21\xd5\xbb\xff\xfb\x2f\xf5\xcf\x0f\x54\xdb\xef\x18\x67\x79\x99\xc3\x96\x76\xd5\x0c\xd6\xb8\xc5\xc4\x74\x52\x2a\x4c\x03\x2d\x6b\x1d\xdd\x5f\xf2\xcb\x23\x0d\xb1\x07\x1a\x4f\xc8\xda\xef\x15\x0b\xca\xc3\xc7\x8f\x37\x73\x1e\xeb\xcd\x34\x3b\x19\xb6\x61\xed\xfc\xad\xe7\x6d\xd5\x43\xf8\x6b\xf4\x08\x45\xfd\xff\xd8\xb1\xa9\x8b\x1b\xb7\xb1\x07\x7b\x32\xa6\x09\xf3\xaf\xe8\xc1\xbc\x2f\x55\xfa\x7f\xdc\x78\xd9\x01\x9b\x78\xeb\xeb\x1a\x3c\x8a\x97\xae\xe4\x34\x37\xfc\x44\xd1\x4d\x43\xdf\x15\x71\x58\xae\xce\x28\xaa\x36\x33\x6d\x8e\xc8\x35\x31\xd0\xfe\x95\xa4\xfe\x6e\xcf\xc8\xc7\x42\xb8\x3e\x12\xdb\x69\x64\x5c\x0b\xb7\xa9\x6a\x74\x08\xc3\xc5\x51\x75\x4e\x96\x25\xdb\xcf\xae\xfd\xd8\xc5\x13\xef\x7e\x0b\xb0\xcc\x70\x47\xb0\xbf\x3f\xae\x12\xeb\x81\x2b\x34\x4f\x7f\x9b\xf4\xbb\x5d\x90\xe6\x06\x4a\xe2\xe2\xf4\x25\x24\xa2\x56\xf0\xdf\xfb\xbb\x7e\x07\x9f\xfa\xbd\x97\x06\xeb\xe0\x17\xf8\x65\xab\xfb\xae\xb6\xca\xa9\xaf\x97\xd1\xd7\xe0\xeb\xa2\xf5\x34\xa0\xf8\xc3\xe7\xff\x82\x2f\x4f\xbe\x76\x2a\x2d\x2f\x23\xeb\xf4\x47\x9d\x8b\xc1\xeb\xcb\xe0\x4f\x5f\x6d\xc9\xb5\x7d\x95\x16\xdb\xb6\x4d\x10\x90\x1c\x43\xe1\x5b\xf8\x6d\x1a\x63\xd5\x44\xe3\xe4\xf6\xb4\x3f\x52\x57\x45\x1b\x58\x4d\xa9\xb9\xbd\xab\xdb\x4e\x60\x8a\x0f\xc6\x41\x48\xf3\xca\x80\x40\x8a\x62\x86\xb5\x2e\xea\x1a\xb5\x76\xe3\x6a\x67\x07\xab\x72\x7b\x2b\x50\xab\x05\x49\x6c\x6b\x34\x83\xd8\x84\xdf\x82\xca\x88\x4a\xa9\xda\x03\xa6\x21\xa7\xc4\xdc\x74\x13\x0d\x4c\x77\x15\xb2\x02\xbb\x65\xa4\x77\x1e\xd4\x6a\x4d\x0b\x49\xcd\x5d\xc5\x26\xbe\x7e\x84\xda\x78\x8f\x5c\xa8\xdc\x9b\x6c\x45\x87\x4c\x44\x2e\x38\x50\xe5\x8b\xb4\x76\x6a\xc7\xae\x5b\x91\x60\x3c\x5d\x69\x81\xb8\x6c\x00\x32\xbb\x0d\xcd\x1c\xdb\x51\x81\xc8\xde\x87\x58\xb3\x29\x20\x59\x2e\x94\x35\x98\x22\x39\xdd\x33\x4b\x98\x0b\x0e\x02\x73\xba\x34\x97\x66\xce\x5a\xd5\x32\x36\xc9\xd7\xdd\xf2\xca\xa3\x56\x5b\xea\xaf\xbf\x79\xd6\x77\x80\xbc\xd2\x57\x77\xd1\xdd\xf4\x6e\xb1\xf9\x1e\x1d\x45\x41\x64\x5b\xcb\xff\x8b\x1d\xd6\x6d\xb7\x34\xbd\x51\xeb\x98\x42\xb5\x3b\xaf\x41\x40\x9c\x34\x47\x7d\xbe\xeb\xb3\xff\x0c\x23\xa9\x9a\x09\xbf\xdd\xf3\x43\x73\x77\x69\xea\x74\x5e\xbf\xf4\x13\x67\x65\x42\xef\x3b\xf1\x43\xc7\x6d\x48\x07\x3e\xad\xa4\x72\x91\x54\x09\x28\x26\x1c\x0c\xf9\xb3\x0d\x3a\x51\xd4\x45\x34\xd3\x66\x35\x97\x7d\xbe\xd9\x23\xda\x2a\x71\x5b\x57\xe7\x7e\x67\xf5\xd8\xad\x76\xe3\x4a\xf1\x4b\xb5\x7d\xd4\x69\x60\x7d\x2d\x17\x39\xe5\x7a\xef\xf1\x83\xa9\x3a\x25\x24\xcb\xc4\x12\x4a\xd5\x8c\xec\x8d\x4d\xaa\xab\xdc\x2c\xab\xae\x7f\xeb\x85\x98\x06\x51\x4a\x45\xb3\x6b\xaa\x6c\x00\xb4\xc3\xa4\xf5\x7e\x8c\x0b\x14\x4c\x58\xff\x39\x19\x9d\x3b\xbb\x80\xf1\xc9\x80\x99\xbe\xaa\x8a\x76\x2f\x7d\xa1\x2e\xfd\xcb\xa3\xcb\xca\x3a\x97\x7e\x2f\xba\xdc\xdf\xbb\x6c\x9c\xd2\xa5\x7f\xd4\x69\xda\x28\x6a\x32\x58\xdf\xbd\xd6\x12\xb9\x17\x6b\xa2\x4a\x25\x15\x6d\xa0\xaf\x15\x5e\xeb\x47\x7f\x68\x3a\x57\x5d\xff\x24\xb6\x50\xaf\xf9\x6d\xdb\xb8\x86\x51\x61\x3d\x20\x6d\x4b\xed\x71\xb7\x7e\x88\x94\x31\xd5\xee\xe3\x0e\xce\x4f\x8c\xc4\x3a\xdd\xab\x10\x3e\x28\x3a\x2f\x33\x74\xa8\xce\xea\xe3\x9b\xc1\xc5\x1a\x67\xf9\x24\xcb\x82\x58\x70\xc3\x6a\x79\x4c\xfd\xb0\x92\x6d\x70\xdd\x9e\xb0\x43\xb4\xd6\xfd\x02\xcb\x73\x9a\x30\xa2\x29\x9e\xcc\x5c\xdb\x37\xc2\x6e\xbb\xd7\xd4\x52\x70\x93\xc8\x43\xcf\x15\x5f\x3c\x99\x7e\x9b\x1a\xda\x52\xa9\x89\x12\x15\x60\xf9\x8e\x46\x35\x59\xd4\x3f\x61\x00\x74\xc5\x85\x80\x18\x03\x6e\xc6\x78\x6b\x65\xc4\x8e\x07\x72\x80\xdf\x59\x99\x4b\x8e\xc0\xdd\xe0\x98\x77\x76\x5a\x11\xd6\x9a\xf8\x7a\x34\x18\xbf\xeb\x77\x56\xe6\xef\x51\xf0\x6c\x5d\xa7\x01\x54\x64\x32\x3e\xb6\xaf\xcc\xfc\xea\xbf\x34\xa7\xbd\x39\x72\x59\x62\x19\x21\x73\x08\xae\x71\x4d\xdb\x20\xb7\xa7\x6b\x3f\xfd\xcd\x77\x3f\x35\x2e\x26\x8e\xa2\x85\x88\x94\x8c\xa3\xab\xe7\x0a\x73\xce\x55\xfd\x9e\xe6\xd1\xdf\x1a\x4e\xbc\x10\x19\xe1\x8b\x23\x1f\xd5\x3a\x1b\x9c\xbf\x9e\xd6\xdd\x89\xc6\x20\xf3\x1e\xe8\x8c\xa0\xbf\xc5\xe0\x5f\xb6\x2a\x7d\x53\x14\x27\xf0\xe8\x6a\xe6\x6e\x24\xb2\x0e\x11\x75\x56\x93\xf1\xf1\xf4\xe4\x74\xbc\xc6\x12\xe6\xbe\xa0\xe3\xd7\xa3\xe9\xf0\x7c\xf0\xea\x6c\x78\xd2\xdf\x07\x0b\xda\x55\x02\x82\xd7\xa3\xd1\xa4\xdf\x59\x8d\x26\xf8\xd1\x5c\x1a\x58\xfb\xaf\xf1\xdc\x5c\xe9\x4c\x20\x60\x5c\x69\x92\x65\x36\x9c\x20\x5e\x08\x08\x82\x2c\x99\x67\x64\xa1\xa0\x1b\x2c\xbb\x10\x08\xa8\x4d\x67\x35\x5a\x43\x18\xb5\xde\x43\xc3\x67\x7e\xaf\xf9\xaa\x8e\x4a\xd9\x5c\x7b\x5e\x7d\xf0\x26\x1e\xdc\xb1\x6f\x05\x44\xd3\x05\xee\xdf\x49\xd4\xb7\x66\x4f\x06\x67\x67\x4f\x36\x57\x55\xcd\xd7\x24\x1f\xb6\x5e\x95\xf3\x35\xb9\x42\x0a\xcc\x81\xde\x68\x49\x73\x9a\xdd\x9a\x85\x32\x81\x5e\xcc\x72\x0a\xbb\xd4\xbc\xab\x69\x30\x50\x89\xbc\x5a\xa0\x67\xbb\xc8\x8d\x27\x86\x5d\x48\x22\x31\x24\xcd\xab\x0a\xf8\x7b\xf5\xbd\x48\x88\xa6\x49\x95\x91\x24\xed\x2a\xb3\x0c\x17\x50\x08\xc6\xcd\xdb\xb7\x92\xd6\xe1\x43\xb2\xcc\xbd\x57\x9b\xbb\xcb\x3b\x54\x25\x6c\x20\x83\xe0\xd9\x6d\xa3\xd9\x7b\xbc\xb1\x58\x20\x69\x86\x6b\xb5\xb8\xdc\x09\x53\x71\xa9\x50\xa9\xa4\x34\x3d\xc9\xc6\x04\x18\xcd\xe7\x2c\xa6\xf0\x06\x73\x02\xbc\xa3\xd4\xbc\xef\xb8\x7b\xb8\x7f\xf0\x22\x3c\x38\x0c\x0f\x9e\xf5\x8e\x8c\x8c\xaa\x61\x97\x88\x58\x85\x0b\x21\x16\x19\x35\x5d\xbb\x44\xc4\x25\x66\xac\x28\x89\x0e\x3e\x3e\x3d\xe0\x9f\xd2\x17\xe3\xdf\x07\xb3\xe9\x5f\xc9\xef\x57\xcb\xf2\xfd\x59\x72\x90\xfe\x76\x53\x8e\x3f\x3d\x65\x1f\xf6\x4f\x72\xf2\x97\x9f\xb2\xab\x63\xf5\xe9\x79\x44\x13\xa6\x77\x52\x4a\x70\xc7\xfd\x34\xcc\x9e\x3f\xcb\xca\x83\x67\x37\xf9\x8b\x59\xea\x01\x58\x17\x31\x2d\xa2\x4a\x51\x0b\xf2\xaa\xbf\xeb\xcf\x4a\x75\x3b\x13\x37\x3e\xf8\x64\xc1\x53\xa1\xb4\x0f\x3e\x52\x2d\xfb\x5a\x9b\x0f\xfe\xdf\xa9\x52\x8c\x06\x09\x57\x58\x2a\x29\x1f\xfc\x2b\xa6\x35\xe5\x3e\xf8\x9c\xe0\xa3\x12\x9f\x71\xc1\xe9\xb2\x90\xec\x5a\x19\xc4\xb3\x2f\x38\xa2\xf7\xa9\x32\x37\x62\x14\xc9\x8b\x8c\x06\xa4\x60\x4e\x72\xcf\xe1\x8b\xa3\x0a\xa6\x2c\xbc\xaf\x61\xfb\x9d\x3c\x7a\x4d\x32\x8b\x34\x93\xb7\x96\x15\x6d\xb8\xd8\xaf\x75\x54\xb8\xe2\xf8\xde\xe0\x5f\x7d\x6f\xce\xbc\xff\x0e\x00\x00\xff\xff\xfc\x2d\x7f\x05\x42\x2e\x00\x00") func testImagesImageUtilShBytes() ([]byte, error) { return bindataRead( @@ -4661,7 +5077,7 @@ func testImagesIpcUtilsDockerfile() (*asset, error) { return a, nil } -var _testImagesIpcUtilsVersion = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x32\xd4\x33\xe4\x02\x04\x00\x00\xff\xff\x9e\xc5\x88\x7d\x04\x00\x00\x00") +var _testImagesIpcUtilsVersion = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x32\xd4\x33\xe2\x02\x04\x00\x00\xff\xff\x5d\x96\xa5\x56\x04\x00\x00\x00") func testImagesIpcUtilsVersionBytes() ([]byte, error) { return bindataRead( @@ -4681,7 +5097,7 @@ func testImagesIpcUtilsVersion() (*asset, error) { return a, nil } -var _testImagesJessieDnsutilsBaseimage = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xca\xc9\xcc\x2b\xad\xd0\x4f\xcc\x4d\x31\x33\xb1\x4d\x49\x4d\xca\x4c\xcc\xb3\xca\x4a\x2d\x2e\xce\x4c\xe5\x82\xca\x14\xe5\xda\x26\x16\xe5\x1a\x1b\x95\x99\xeb\xe3\x90\x37\x33\xb1\x05\x93\x65\x16\x58\x55\x14\x14\x24\x9b\x99\xe4\xa4\xda\x42\x69\xac\x6a\x8a\x8d\x2d\x0d\x2a\x6c\xc1\x24\x9a\x7c\x79\x66\x5e\x4a\x7e\x79\x31\xc4\x85\xfa\x86\x16\x06\x96\xb6\x41\xae\xee\x9e\xc1\x21\x41\x91\xfa\x49\xa5\xc5\x95\x49\xf9\x15\x56\x86\x7a\x46\x96\xba\x50\x85\xba\x60\x85\xba\x20\x85\xe8\x7a\x2d\x0d\x8c\x89\xd3\x6b\x69\x60\x8c\xa9\x97\x48\x7b\x2d\x0d\x2c\xb9\x00\x01\x00\x00\xff\xff\x3b\xf6\x24\x3c\x54\x01\x00\x00") +var _testImagesJessieDnsutilsBaseimage = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x8e\x3d\x0f\x82\x30\x10\x86\x77\xfe\x0b\xf6\x68\x1b\xe4\x48\x6e\x34\xe2\x8a\x2e\x8e\x20\x1d\x6a\xf8\x0a\x0d\x1f\xfe\x7b\x03\x76\xa2\x98\x74\x79\x6f\x78\x9f\x27\xef\xd5\xba\x1d\x17\x56\x34\x55\x2c\xa9\x52\xa5\x2e\xda\xf4\xad\x8c\xd1\x2a\xb0\xcd\xd0\x50\x31\x34\x82\x4f\x67\xf6\xa7\x8f\x25\x6d\x39\x25\x87\x44\xdf\xbf\x62\x59\x2b\xb2\xf7\x90\x31\x02\x61\xa1\x2d\x77\xfd\xac\xdb\xaa\x9b\xcd\xef\x43\x16\x25\x80\x94\x5f\xae\xb7\xfb\x23\x7f\xb2\x72\x34\x9f\xb2\x5b\xd2\xe8\xc4\x31\xb4\x60\xb8\x81\xe1\x0a\xee\x5d\x04\xe1\xe7\x22\x08\xd7\xf5\xdc\x45\x67\x97\x03\x48\x2f\x77\x05\x1d\x37\xe3\x9e\x6e\xc6\x83\x6f\x00\x00\x00\xff\xff\x79\xec\x98\xc0\xcc\x01\x00\x00") func testImagesJessieDnsutilsBaseimageBytes() ([]byte, error) { return bindataRead( @@ -4721,7 +5137,7 @@ func testImagesJessieDnsutilsDockerfile() (*asset, error) { return a, nil } -var _testImagesJessieDnsutilsDockerfile_windows = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x64\x93\x51\x6f\xe2\x38\x10\xc7\xdf\xf3\x29\xfe\x82\x93\x6e\x57\x82\x84\x65\xef\x56\x3a\xaa\x3e\xe4\x28\xdd\x45\xdb\x0d\x15\xa1\x5b\x55\x42\xaa\x9c\x64\x48\x46\x75\xec\x9c\xed\x10\xe8\xa7\x3f\x39\x94\xbb\xa2\xe5\x01\x67\x3c\xff\x99\xf9\x79\xc6\x1e\x62\xae\x9b\xa3\xe1\xb2\x72\x98\x4e\xa6\x13\x6c\x2a\xc2\xf7\x36\x23\xa3\xc8\x91\x45\xdc\xba\x4a\x1b\x1b\x06\xc3\x60\x88\x3b\xce\x49\x59\x2a\xd0\xaa\x82\x0c\x5c\x45\x88\x1b\x91\x57\x74\xf6\x8c\xf0\x93\x8c\x65\xad\x30\x0d\x27\xf8\xe0\x05\x83\x37\xd7\xe0\xe3\x55\x30\xc4\x51\xb7\xa8\xc5\x11\x4a\x3b\xb4\x96\xe0\x2a\xb6\xd8\xb1\x24\xd0\x21\xa7\xc6\x81\x15\x72\x5d\x37\x92\x85\xca\x09\x1d\xbb\xaa\x2f\xf3\x96\x24\x0c\x86\x78\x7a\x4b\xa1\x33\x27\x58\x41\x20\xd7\xcd\x11\x7a\xf7\x5e\x07\xe1\x7a\x60\xff\xab\x9c\x6b\x66\x51\xd4\x75\x5d\x28\x7a\xd8\x50\x9b\x32\x92\x27\xa1\x8d\xee\x96\xf3\x45\x92\x2e\xc6\xd3\x70\xd2\x87\x3c\x28\x49\xd6\xc2\xd0\x3f\x2d\x1b\x2a\x90\x1d\x21\x9a\x46\x72\x2e\x32\x49\x90\xa2\x83\x36\x10\xa5\x21\x2a\xe0\xb4\xe7\xed\x0c\x3b\x56\xe5\x08\x56\xef\x5c\x27\x0c\x05\x43\x14\x6c\x9d\xe1\xac\x75\x17\xcd\x3a\xd3\xb1\xbd\x10\x68\x05\xa1\x30\x88\x53\x2c\xd3\x01\xfe\x8e\xd3\x65\x3a\x0a\x86\x78\x5c\x6e\xbe\xad\x1e\x36\x78\x8c\xd7\xeb\x38\xd9\x2c\x17\x29\x56\x6b\xcc\x57\xc9\xcd\x72\xb3\x5c\x25\x29\x56\xb7\x88\x93\x27\x7c\x5f\x26\x37\x23\x10\xbb\x8a\x0c\xe8\xd0\x18\xcf\xaf\x0d\xd8\xb7\x91\x0a\xdf\xb3\x94\xe8\x02\x60\xa7\x4f\x40\xb6\xa1\x9c\x77\x9c\x43\x0a\x55\xb6\xa2\x24\x94\x7a\x4f\x46\xb1\x2a\xd1\x90\xa9\xd9\xfa\x61\x5a\x08\x55\x04\x43\x48\xae\xd9\x09\xd7\xef\xfc\x72\xa8\x30\x08\xe2\xf5\x57\x4f\xbf\x58\xfe\x88\xbf\x2e\x02\x7f\x02\xfa\xdd\x10\x5a\xeb\xd3\x09\xdc\xb1\x6a\x0f\xe0\xda\x97\x71\x1a\xad\x6a\x44\xfe\xd2\xa7\x10\x26\xaf\x78\x4f\x23\x6f\x28\x74\x7d\x94\x9f\xaa\x8f\x63\x07\x8f\xe4\x23\x1e\x59\x15\xba\xb3\x61\x70\xbb\x5e\xfd\xc0\x78\xdc\x48\xe1\x76\xda\xd4\xd7\xd2\x67\x8e\x44\x5d\x7c\xf9\x03\x42\x36\xac\x68\xf6\x39\xfc\x02\x61\xd1\x18\x6a\x82\x20\xbe\xb9\xe9\xaf\x81\x9d\x45\x51\xc9\xae\x6a\xb3\x30\xd7\x75\x94\x6b\x43\x85\xb2\xff\xad\x86\x24\x09\x7f\x27\x0a\xdd\x29\xa9\x45\x11\xed\x3f\x85\x7f\x86\x93\xb3\xe0\xb9\xb7\x9e\xbb\x13\xc6\x73\x5f\x2f\x74\xe5\x2b\xce\x02\x6f\x04\xeb\x87\x04\x4e\x18\x8c\x0f\xaf\xfb\xdd\xa5\xeb\x04\x4e\x53\x72\x24\xea\x28\x6b\xed\x31\xd3\x87\x71\x45\xb2\x21\x33\xfb\x14\x4e\xff\x0a\x27\x1e\xfa\xd2\x71\x0a\xfa\xed\x5d\x63\xe7\xab\xfb\x27\x8c\xc7\x3b\xa3\xeb\x6b\x7f\xc0\xff\x8b\xd0\x81\x2e\x8c\x0b\xe9\x65\x5a\x44\x05\x97\xfd\x9f\x9f\x54\xb2\xda\x2c\x3e\xe4\x52\xb4\x05\xb7\xd9\xc7\x19\x0a\x9d\xbf\x90\x41\xd6\xb2\x2c\x0e\xb0\xe4\x6c\x3f\xa8\xfb\x78\xf3\x0d\xa4\xf6\xd8\x0b\xc3\xfd\x83\x70\xfa\x3c\xd9\xb1\xe4\x97\x93\x62\x84\xae\xe2\xbc\xf2\xd7\xdc\xbf\xf3\x82\x2c\x1b\x2f\x0e\x83\x45\xf2\xb3\x57\x5c\x0f\xe6\xb3\x6d\xc1\xe5\xf6\x6a\x3e\xdb\x66\xac\xfc\x92\xb7\x46\xfa\xf5\x6d\xca\xdb\xf4\x68\x1d\xd5\x9f\xa7\xef\xf6\xfc\xe7\xbd\xd1\xa5\x11\x35\x6e\x59\x92\xdd\xde\xeb\x8e\x4c\x5a\x91\x94\x57\x83\xe0\xdf\x00\x00\x00\xff\xff\x4f\x67\xb6\x01\xcc\x04\x00\x00") +var _testImagesJessieDnsutilsDockerfile_windows = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x64\x93\xd1\x6f\xe2\x38\x10\xc6\xdf\xf3\x57\x7c\x82\x93\x6e\x57\x82\xa4\xc7\xde\xed\x03\x55\x1f\x72\x94\xee\x46\xdb\x0d\x15\xa1\x5b\x55\x42\xaa\x9c\x64\x48\x46\x75\xec\x9c\xed\x10\xd8\xbf\xfe\xe4\x50\xee\x8a\x96\x17\x33\xf6\x37\xe3\x9f\xbf\x99\x8c\xb1\xd0\xed\xd1\x70\x55\x3b\xcc\xae\x66\x57\xd8\xd4\x84\x6f\x5d\x4e\x46\x91\x23\x8b\xb8\x73\xb5\x36\x36\x0c\xc6\xc1\x18\xf7\x5c\x90\xb2\x54\xa2\x53\x25\x19\xb8\x9a\x10\xb7\xa2\xa8\xe9\x7c\x32\xc1\x0f\x32\x96\xb5\xc2\x2c\xbc\xc2\x07\x2f\x18\xbd\x1d\x8d\x3e\x5e\x07\x63\x1c\x75\x87\x46\x1c\xa1\xb4\x43\x67\x09\xae\x66\x8b\x1d\x4b\x02\x1d\x0a\x6a\x1d\x58\xa1\xd0\x4d\x2b\x59\xa8\x82\xd0\xb3\xab\x87\x6b\xde\x8a\x84\xc1\x18\xcf\x6f\x25\x74\xee\x04\x2b\x08\x14\xba\x3d\x42\xef\xde\xeb\x20\xdc\x00\xec\x7f\xb5\x73\xed\x3c\x8a\xfa\xbe\x0f\xc5\x00\x1b\x6a\x53\x45\xf2\x24\xb4\xd1\x7d\xb2\x58\xa6\xd9\x72\x3a\x0b\xaf\x86\x94\x47\x25\xc9\x5a\x18\xfa\xa7\x63\x43\x25\xf2\x23\x44\xdb\x4a\x2e\x44\x2e\x09\x52\xf4\xd0\x06\xa2\x32\x44\x25\x9c\xf6\xbc\xbd\x61\xc7\xaa\x9a\xc0\xea\x9d\xeb\x85\xa1\x60\x8c\x92\xad\x33\x9c\x77\xee\xc2\xac\x33\x1d\xdb\x0b\x81\x56\x10\x0a\xa3\x38\x43\x92\x8d\xf0\x77\x9c\x25\xd9\x24\x18\xe3\x29\xd9\x7c\x5d\x3d\x6e\xf0\x14\xaf\xd7\x71\xba\x49\x96\x19\x56\x6b\x2c\x56\xe9\x6d\xb2\x49\x56\x69\x86\xd5\x1d\xe2\xf4\x19\xdf\x92\xf4\x76\x02\x62\x57\x93\x01\x1d\x5a\xe3\xf9\xb5\x01\x7b\x1b\xa9\xf4\x9e\x65\x44\x17\x00\x3b\x7d\x02\xb2\x2d\x15\xbc\xe3\x02\x52\xa8\xaa\x13\x15\xa1\xd2\x7b\x32\x8a\x55\x85\x96\x4c\xc3\xd6\x37\xd3\x42\xa8\x32\x18\x43\x72\xc3\x4e\xb8\x61\xe7\x97\x47\x85\x41\x10\xaf\xbf\x78\xfa\x65\xf2\x3d\xfe\xb2\x0c\xfc\x0b\xe8\x77\x43\xe8\xac\x2f\x27\x70\xcf\xaa\x3b\x80\x1b\x7f\x8d\xd3\xe8\x54\x2b\x8a\xd7\xa1\x84\x30\x45\xcd\x7b\x9a\xf8\x40\xa1\x1f\xb2\x7c\x57\x7d\x1e\x3b\x78\x24\x9f\xf1\xc4\xaa\xd4\xbd\x0d\x83\xbb\xf5\xea\x3b\xa6\xd3\x56\x0a\xb7\xd3\xa6\xb9\x91\xbe\x72\x24\x9a\xf2\xf3\x9f\x10\xb2\x65\x45\xf3\x4f\xe1\x67\x08\x8b\xd6\x50\x1b\x04\xf1\xed\xed\x30\x06\x76\x1e\x45\x15\xbb\xba\xcb\xc3\x42\x37\x51\xa1\x0d\x95\xca\xfe\xb7\x1a\x92\x24\xfc\x4c\x94\xba\x57\x52\x8b\x32\xda\xff\x11\xfe\x15\x5e\x9d\x05\x2f\x43\xf4\xd2\x9f\x30\x5e\x86\xfb\x42\x57\xfd\xc4\x59\xe0\x83\x60\xfd\x98\xc2\x09\x83\xe9\xe1\xe7\x7e\x77\x79\x74\x02\xff\xed\x9d\x47\x8b\xd5\xc3\x33\xa6\xd3\x9d\xd1\xcd\x8d\x67\xfd\x5f\x4f\x07\xba\x08\xbc\x9f\xe9\x6a\xb3\xfc\x50\x48\xd1\x95\xdc\xe5\x1f\xe7\x28\x75\xf1\x4a\x06\x79\xc7\xb2\x3c\xc0\x92\xb3\x83\x9d\x0f\xf1\xe6\x2b\x48\xed\xb1\x17\x86\x87\xb1\x75\xfa\xec\xff\x54\xf2\xeb\x49\x31\x41\x5f\x73\x51\xfb\x61\xf4\x5f\x63\x49\x96\x8d\x17\x87\xc1\x32\xfd\x31\x28\x6e\x46\x8b\xf9\xb6\xe4\x6a\x7b\xbd\x98\x6f\x73\x56\x7e\x29\x3a\x23\xfd\xfa\xd6\x8b\x6d\x76\xb4\x8e\x9a\x4f\xb3\x77\x7b\xfe\xef\x83\xd1\x95\x11\x0d\xee\x58\x92\xdd\x3e\xe8\x9e\x4c\x56\x93\x94\xd7\xa3\xe0\xdf\x00\x00\x00\xff\xff\x47\x5d\x15\xe2\x72\x04\x00\x00") func testImagesJessieDnsutilsDockerfile_windowsBytes() ([]byte, error) { return bindataRead( @@ -4761,7 +5177,7 @@ func testImagesJessieDnsutilsOwners() (*asset, error) { return a, nil } -var _testImagesJessieDnsutilsVersion = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x32\xd4\x33\xe6\x02\x04\x00\x00\xff\xff\x1c\xa7\xbe\x4f\x04\x00\x00\x00") +var _testImagesJessieDnsutilsVersion = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x32\xd4\x33\xe1\x02\x04\x00\x00\xff\xff\xdb\x31\xff\x00\x04\x00\x00\x00") func testImagesJessieDnsutilsVersionBytes() ([]byte, error) { return bindataRead( @@ -4801,7 +5217,7 @@ func testImagesJessieDnsutilsFixupAptListSh() (*asset, error) { return a, nil } -var _testImagesKittenBaseimage = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xca\xc9\xcc\x2b\xad\xd0\x4f\xcc\x4d\x31\x33\xb1\x0d\x72\x75\xf7\x0c\x0e\x09\x8a\xd4\x4f\x4c\xcf\xcb\xc8\x2f\x2e\xb1\x32\xd2\x33\x32\xd4\x05\xab\xd0\x05\xab\xe0\x82\xaa\x2e\xca\xc5\xaf\xb6\x28\x17\xa1\x92\x90\xb9\x20\x15\x50\xd5\x05\x05\xc9\x66\x26\x39\xa9\x78\xd5\x43\xd5\x40\x75\x14\x1b\x5b\x1a\x54\xe0\x55\x0f\x56\xc1\x55\x9e\x99\x97\x92\x5f\x5e\x0c\xf1\xa7\xbe\xa1\x85\x81\x25\x0e\x4d\x50\x85\x10\xef\xea\x82\x14\xa2\xeb\xb5\x34\x30\x26\x4e\xaf\xa5\x81\x31\xa6\x5e\x22\xed\xb5\x34\xb0\xe4\x02\x04\x00\x00\xff\xff\x3f\x6b\x27\xe4\x9a\x01\x00\x00") +var _testImagesKittenBaseimage = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xca\xc9\xcc\x2b\xad\xd0\x4f\xcc\x4d\x31\x33\xb1\x0d\x72\x75\xf7\x0c\x0e\x09\x8a\xd4\x4f\x4c\xcf\xcb\xc8\x2f\x2e\xb1\x32\xd2\x33\x32\xd3\x05\xab\xd0\x05\xab\xe0\x82\xaa\x2e\xca\xc5\xaf\xb6\x28\x17\xa1\x92\x90\xb9\x20\x15\x50\xd5\x05\x05\xc9\x66\x26\x39\xa9\x78\xd5\x43\xd5\x40\x75\x14\x1b\x5b\x1a\x54\xe0\x55\x0f\x56\xc1\x55\x9e\x99\x97\x92\x5f\x5e\x0c\xf1\xa7\xbe\xa1\x85\x81\x25\x0e\x4d\x50\x85\x10\xef\xea\x82\x14\xa2\xeb\xb5\x34\x30\x26\x4e\xaf\xa5\x81\x31\xa6\x5e\x22\xed\xb5\xc4\xb0\xd7\xc8\xc0\x00\x57\x40\xa2\xea\x05\x29\xc4\xd0\xeb\x61\x44\xa4\x5e\x0f\x23\x2e\x40\x00\x00\x00\xff\xff\x48\x44\x85\xf4\x12\x02\x00\x00") func testImagesKittenBaseimageBytes() ([]byte, error) { return bindataRead( @@ -4901,7 +5317,7 @@ func testImagesKittenHtmlDataJson() (*asset, error) { return a, nil } -var _testImagesMetadataConcealmentDockerfile = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x74\x91\x51\x6f\xd3\x30\x14\x85\xdf\xfd\x2b\x8e\x92\x17\x90\x4a\x32\xf6\xc0\x03\x3c\x85\xae\x13\xd1\x46\x32\x35\x19\x53\x85\xd0\xe4\x3a\xb7\xc9\x15\x89\x1d\xec\x1b\xb2\xfe\x7b\x94\x6e\x93\xa8\x10\x7e\xf4\xfd\x7c\xfc\xf9\x38\xc6\xda\x8d\x47\xcf\x6d\x27\xb8\xbc\x78\xff\x01\x75\x47\xb8\x99\xf6\xe4\x2d\x09\x05\x64\x93\x74\xce\x87\x44\xc5\x2a\xc6\x2d\x1b\xb2\x81\x1a\x4c\xb6\x21\x0f\xe9\x08\xd9\xa8\x4d\x47\xaf\x93\x15\xbe\x91\x0f\xec\x2c\x2e\x93\x0b\xbc\x59\x80\xe8\x65\x14\xbd\xfd\xa4\x62\x1c\xdd\x84\x41\x1f\x61\x9d\x60\x0a\x04\xe9\x38\xe0\xc0\x3d\x81\x9e\x0c\x8d\x02\xb6\x30\x6e\x18\x7b\xd6\xd6\x10\x66\x96\xee\x74\xcd\x4b\x48\xa2\x62\xec\x5e\x22\xdc\x5e\x34\x5b\x68\x18\x37\x1e\xe1\x0e\x7f\x73\xd0\x72\x12\x5e\x56\x27\x32\x7e\x4c\xd3\x79\x9e\x13\x7d\x92\x4d\x9c\x6f\xd3\xfe\x19\x0c\xe9\x6d\xbe\xde\x14\xd5\xe6\xdd\x65\x72\x71\x3a\x72\x6f\x7b\x0a\x01\x9e\x7e\x4d\xec\xa9\xc1\xfe\x08\x3d\x8e\x3d\x1b\xbd\xef\x09\xbd\x9e\xe1\x3c\x74\xeb\x89\x1a\x88\x5b\x7c\x67\xcf\xc2\xb6\x5d\x21\xb8\x83\xcc\xda\x93\x8a\xd1\x70\x10\xcf\xfb\x49\xce\xca\x7a\xb5\xe3\x70\x06\x38\x0b\x6d\x11\x65\x15\xf2\x2a\xc2\xe7\xac\xca\xab\x95\x8a\xf1\x90\xd7\x5f\xca\xfb\x1a\x0f\xd9\x76\x9b\x15\x75\xbe\xa9\x50\x6e\xb1\x2e\x8b\xab\xbc\xce\xcb\xa2\x42\x79\x8d\xac\xd8\xe1\x26\x2f\xae\x56\x20\x96\x8e\x3c\xe8\x69\xf4\x8b\xbf\xf3\xe0\xa5\x46\x6a\x96\xce\x2a\xa2\x33\x81\x83\x7b\x16\x0a\x23\x19\x3e\xb0\x41\xaf\x6d\x3b\xe9\x96\xd0\xba\xdf\xe4\x2d\xdb\x16\x23\xf9\x81\xc3\xf2\x99\x01\xda\x36\x2a\x46\xcf\x03\x8b\x96\xd3\xce\x3f\x8f\x4a\x94\xba\xde\x96\x5f\x11\x8c\xd7\x62\x3a\xa5\xd6\xe5\xdd\x0e\xa6\x23\xf3\xf3\x71\x20\xd1\x8d\x16\xfd\x68\x9c\x35\xa4\xfb\x81\xac\x20\x55\x6a\x53\xd4\xdb\xdd\x5d\x99\x17\x35\xbe\x47\xe9\xff\xd9\xe8\x87\xfa\x13\x00\x00\xff\xff\x3e\xaf\x22\x2c\xa8\x02\x00\x00") +var _testImagesMetadataConcealmentDockerfile = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x74\x91\x51\x6f\x9b\x3c\x14\x86\xef\xfd\x2b\x5e\xc1\xcd\xf7\x49\x19\x74\xb9\xdc\xae\x58\x9a\x6a\xa8\x1d\x54\x81\xae\x8a\xa6\xa9\x72\xcc\x09\x1c\x0d\x6c\x66\x1f\x46\xf3\xef\x27\xd2\x56\x5a\x34\xcd\x97\x3e\x8f\x5f\x3f\x7e\x1d\x63\xe3\xc6\x93\xe7\xb6\x13\xac\xaf\xd6\xef\x51\x77\x84\xdb\xe9\x40\xde\x92\x50\x40\x36\x49\xe7\x7c\x48\x54\xac\x62\xdc\xb1\x21\x1b\xa8\xc1\x64\x1b\xf2\x90\x8e\x90\x8d\xda\x74\xf4\x36\x59\xe1\x2b\xf9\xc0\xce\x62\x9d\x5c\xe1\xbf\x05\x88\x5e\x47\xd1\xff\x1f\x55\x8c\x93\x9b\x30\xe8\x13\xac\x13\x4c\x81\x20\x1d\x07\x1c\xb9\x27\xd0\xb3\xa1\x51\xc0\x16\xc6\x0d\x63\xcf\xda\x1a\xc2\xcc\xd2\x9d\xaf\x79\x0d\x49\x54\x8c\xfd\x6b\x84\x3b\x88\x66\x0b\x0d\xe3\xc6\x13\xdc\xf1\x4f\x0e\x5a\xce\xc2\xcb\xea\x44\xc6\x0f\x69\x3a\xcf\x73\xa2\xcf\xb2\x89\xf3\x6d\xda\xbf\x80\x21\xbd\xcb\x37\xdb\xa2\xda\xbe\x5b\x27\x57\xe7\x23\x0f\xb6\xa7\x10\xe0\xe9\xe7\xc4\x9e\x1a\x1c\x4e\xd0\xe3\xd8\xb3\xd1\x87\x9e\xd0\xeb\x19\xce\x43\xb7\x9e\xa8\x81\xb8\xc5\x77\xf6\x2c\x6c\xdb\x15\x82\x3b\xca\xac\x3d\xa9\x18\x0d\x07\xf1\x7c\x98\xe4\xa2\xac\x37\x3b\x0e\x17\x80\xb3\xd0\x16\x51\x56\x21\xaf\x22\x7c\xca\xaa\xbc\x5a\xa9\x18\x8f\x79\xfd\xb9\x7c\xa8\xf1\x98\xed\x76\x59\x51\xe7\xdb\x0a\xe5\x0e\x9b\xb2\xb8\xce\xeb\xbc\x2c\x2a\x94\x37\xc8\x8a\x3d\x6e\xf3\xe2\x7a\x05\x62\xe9\xc8\x83\x9e\x47\xbf\xf8\x3b\x0f\x5e\x6a\xa4\x66\xe9\xac\x22\xba\x10\x38\xba\x17\xa1\x30\x92\xe1\x23\x1b\xf4\xda\xb6\x93\x6e\x09\xad\xfb\x45\xde\xb2\x6d\x31\x92\x1f\x38\x2c\x9f\x19\xa0\x6d\xa3\x62\xf4\x3c\xb0\x68\x39\xef\xfc\xf5\xa8\x44\xa9\x9b\x5d\xf9\x05\xc1\x78\x2d\xa6\x53\x6a\x53\xde\xef\x61\x3a\x32\x3f\x9e\x06\x12\xdd\x68\xd1\x4f\xc6\x59\x43\xba\x1f\xc8\x0a\x52\xa5\xb6\x45\xbd\xdb\xdf\x97\x79\x51\xe3\x5b\x94\xfe\x9b\x8d\xbe\xab\xdf\x01\x00\x00\xff\xff\xa3\xa6\xc4\x4a\xa8\x02\x00\x00") func testImagesMetadataConcealmentDockerfileBytes() ([]byte, error) { return bindataRead( @@ -4961,7 +5377,7 @@ func testImagesMetadataConcealmentOwners() (*asset, error) { return a, nil } -var _testImagesMetadataConcealmentVersion = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x32\xd4\x33\xe6\x02\x04\x00\x00\xff\xff\x1c\xa7\xbe\x4f\x04\x00\x00\x00") +var _testImagesMetadataConcealmentVersion = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x32\xd4\x33\xe3\x02\x04\x00\x00\xff\xff\x59\x53\xc9\x32\x04\x00\x00\x00") func testImagesMetadataConcealmentVersionBytes() ([]byte, error) { return bindataRead( @@ -4981,7 +5397,7 @@ func testImagesMetadataConcealmentVersion() (*asset, error) { return a, nil } -var _testImagesMetadataConcealmentCheck_metadata_concealmentGo = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xbc\x58\x6d\x4f\xe3\xb8\x16\xfe\x5c\xff\x8a\x33\x91\xba\xb7\x5d\xa5\x49\x07\x66\xe0\x2e\xab\x6a\xd4\xe5\x65\xb7\x9a\x19\x18\x51\xd8\xb9\xab\xd5\x8a\x71\x93\x93\xc4\xc2\xb5\x83\xed\xb4\x54\x23\xfe\xfb\x95\xf3\x46\x29\xa5\x5b\x5a\x98\x0f\xd0\x36\x39\x7e\xce\x73\x5e\x7d\x6c\xff\x67\x72\x28\xd3\x99\x62\x71\x62\x60\xa7\xfb\x76\x1f\x2e\x12\x84\x8f\xd9\x08\x95\x40\x83\x1a\xfa\x99\x49\xa4\xd2\x1e\x21\x9f\x58\x80\x42\x63\x08\x99\x08\x51\x81\x49\x10\xfa\x29\x0d\x12\x84\xf2\x8d\x0b\x7f\xa2\xd2\x4c\x0a\xd8\xf1\xba\xd0\xb2\x02\x4e\xf9\xca\x69\xff\x4a\x66\x32\x83\x31\x9d\x81\x90\x06\x32\x8d\x60\x12\xa6\x21\x62\x1c\x01\x6f\x03\x4c\x0d\x30\x01\x81\x1c\xa7\x9c\x51\x11\x20\x4c\x99\x49\x72\x25\x25\x84\x47\xfe\x2a\x01\xe4\xc8\x50\x26\x80\x42\x20\xd3\x19\xc8\x68\x5e\x0a\xa8\x21\x04\x00\x20\x31\x26\x3d\xf0\xfd\xe9\x74\xea\xd1\x9c\xa5\x27\x55\xec\xf3\x42\x4a\xfb\x9f\x06\x87\xc7\xa7\xc3\xe3\xce\x8e\xd7\x25\xe4\x52\x70\xd4\x1a\x14\xde\x64\x4c\x61\x08\xa3\x19\xd0\x34\xe5\x2c\xa0\x23\x8e\xc0\xe9\x14\xa4\x02\x1a\x2b\xc4\x10\x8c\xb4\x3c\xa7\x8a\x19\x26\x62\x17\xb4\x8c\xcc\x94\x2a\x24\x21\xd3\x46\xb1\x51\x66\x1e\x38\xa8\x62\xc5\x34\xcc\x0b\x48\x01\x54\x80\xd3\x1f\xc2\x60\xe8\xc0\x6f\xfd\xe1\x60\xe8\x92\xaf\x83\x8b\x3f\xce\x2e\x2f\xe0\x6b\xff\xfc\xbc\x7f\x7a\x31\x38\x1e\xc2\xd9\x39\x1c\x9e\x9d\x1e\x0d\x2e\x06\x67\xa7\x43\x38\x3b\x81\xfe\xe9\x5f\xf0\x71\x70\x7a\xe4\x02\x32\x93\xa0\x02\xbc\x4d\x95\xe5\x2e\x15\x30\xeb\x3a\x0c\x3d\x32\x44\x7c\xa0\x3c\x92\x05\x19\x9d\x62\xc0\x22\x16\x00\xa7\x22\xce\x68\x8c\x10\xcb\x09\x2a\xc1\x44\x0c\x29\xaa\x31\xd3\x36\x78\x1a\xa8\x08\x09\x67\x63\x66\xa8\xc9\x7f\x3f\x32\xc7\x23\x3f\xfb\x84\xa4\x34\xb8\xb6\x20\x63\xca\x04\x21\x6c\x9c\x4a\x65\xa0\x45\x1a\x4e\x34\x36\x0e\x69\x38\x4c\xfa\x4c\x66\x86\x71\xfb\x83\xcb\xd8\x7e\x08\x34\xbe\x8d\x8c\xfd\x2e\xb5\xfd\xaf\x30\xc6\xdb\xd4\x21\x6d\x42\x26\x54\xd9\xf5\x3a\x0b\x02\xd4\xfa\x58\x84\xa9\x64\xc2\x68\xe8\xc1\xdf\xff\x58\xdf\x89\xf8\x3b\x69\x34\x7c\x1f\x8e\x98\x0e\x2c\xf3\x19\x69\x34\x9c\x32\xd0\x6f\xf7\x7e\xf1\x76\xde\xbf\xf3\xca\x4f\xc7\x9d\x7b\x37\x46\x43\x43\x6a\xa8\x17\x4b\x19\x73\xf4\x98\x30\xa8\x04\xe5\x0f\x84\x16\x00\xfc\xb5\x10\xd6\x94\xea\x7a\x6f\xd7\x16\x5c\x13\xd2\x56\x4a\x66\xf0\x73\xf9\x7e\xa3\x45\xfe\xa4\xa0\xe5\xfb\xd0\xe7\x5c\x4e\x31\x84\xfe\x97\x01\x4c\x8a\x2a\xd6\xde\x66\x90\x7e\x85\x39\x44\x35\x61\x01\x02\x0d\x02\x99\x09\x03\x46\x5e\xa3\x00\xac\xe2\xba\x29\x3c\x13\xda\xd8\x0e\xe1\xeb\x02\xbf\x53\xe2\x6b\x3f\xc4\x88\x66\xdc\xf8\xb9\xa2\x8a\xc5\x17\x9b\xd9\xc6\x56\x9d\xc2\x20\x53\x9a\x4d\x10\x6e\x32\x54\x33\x5b\xca\xc3\x7e\xcd\xe7\xf5\xe8\x7c\xa8\x15\xf7\x8c\xca\xb0\x22\xf6\x51\xc8\xa9\x28\xa9\xa4\x54\xd1\xf1\xf6\x1e\x31\x34\xd6\x1f\x28\x37\x3d\x83\xb7\x66\xd3\x94\x58\x80\x9b\x52\x66\xae\x22\xa9\xae\x82\x84\x8a\x18\x7b\x11\xe5\x1a\x5f\x09\xdb\xba\xe7\x27\xc3\xc6\x28\x33\x73\xa5\x31\xe8\x75\x5f\x53\x11\xa7\xda\x5c\xa1\xa1\x71\x2f\xdc\x7d\x17\x8e\x76\x77\x23\xab\xed\x8e\x34\x38\xc6\x34\x98\x0d\x37\xea\x43\x2b\x4b\xdb\xbe\xec\x6c\x53\xae\x23\x34\x74\xfb\x9a\x7d\x40\x65\xb3\x7e\x53\x71\x79\xd1\x62\x7f\xc8\xeb\xc9\x7a\xa2\x41\xbe\x4f\x6f\xc7\xfb\x99\x5d\x64\xc3\x62\x7d\x9e\x45\x1f\x74\x20\x53\xd4\x65\x16\x0a\x69\xc7\xb0\x63\x31\x59\x91\x81\x87\x09\x06\xd7\x60\x12\x6a\xec\xfe\xac\x11\x42\x29\xfe\x63\x20\x46\x03\x74\xae\xdf\x29\xd4\x19\xdf\xbe\xc3\xdd\x37\xb2\xe6\xee\x51\xd1\xca\x00\xc0\xf7\x21\x53\x1c\x45\x20\x43\x0c\x5f\x40\x45\xb3\xfb\xdf\x85\x7e\x69\x55\x8c\x68\x70\xad\x53\x1a\x58\x15\x77\xa4\x11\x51\xc6\x33\x85\x2b\x5c\x73\x96\xcf\x47\x1b\xd4\xc6\xce\xa6\x15\xb1\x53\x17\xc3\x75\x36\xc2\x0e\x8a\xc9\x06\x39\x42\x4d\x39\x25\x6a\xbf\x42\x79\xa1\x44\x7f\x41\xe4\x7f\x07\xf5\x7d\xf8\xf3\x33\xb0\x10\x85\x61\x66\xf6\x92\xb5\x52\x61\xbe\x76\xf9\x6f\xab\xe7\xb9\x2a\x7c\x1f\x4e\xa4\x1a\xb1\x30\x44\xb1\x30\xaa\x30\xdc\x7e\x34\x58\x36\x84\x6c\x07\xd8\xdc\xdf\x69\xee\xbd\x6f\xee\xed\x36\xf7\xdf\xdb\xef\xfb\xbb\xcd\xbd\x5f\x9a\xfb\x7b\xcd\xbd\xf7\x73\x75\x9b\x29\xde\xb9\xef\x0d\xbe\x0f\x97\xe2\x7a\xb1\x97\xc2\x35\xae\x97\x22\x2b\xf9\x68\x39\x46\x93\x30\x11\xf7\xf0\x45\x26\x94\x0f\x59\xc1\xb4\x8a\x4e\xde\x50\xb6\xa6\x39\x57\x30\xaf\x53\x86\x9e\xf7\x3a\x95\xfe\x28\x8b\x7f\x44\xa5\x78\xde\x7a\xd5\x73\x67\xcf\x8f\x51\x26\x82\xfc\x34\xda\x6a\xc3\xf7\xfa\x1c\x09\x07\x3d\xe8\x92\x46\x62\x3f\xc7\x34\xfd\xbb\xd8\x24\xfe\x99\xdf\x2d\x9c\x8a\x4c\xe7\x84\xd3\x89\x54\xce\x01\x7c\x77\x7e\xcf\x79\x3b\x77\xc5\x66\x6c\xcf\xd0\x57\x2e\xa0\x45\x51\x76\x84\x84\x47\xc7\x54\x8b\xc4\x22\x40\xa5\xac\x50\x60\x77\xe6\xcb\xf3\x4f\x2d\x74\x21\x71\x61\xa7\xdb\x75\xc1\x71\xec\x5f\xfb\xd7\x5c\xe6\x4d\x0f\x04\xe3\xf9\xaa\x06\x97\xb1\xf7\x45\x31\x61\xa2\x96\xf3\x55\x49\x11\xdb\x1d\x3b\x95\xd5\xe1\xbd\x39\x39\x80\xe6\xc4\x71\x01\x5d\xbb\xb4\x6d\x97\x54\xd6\xf5\xe0\x2d\x69\x58\x86\x4b\x49\x2e\x99\x21\x56\xd2\x7c\xd7\xdd\x2d\x69\xd6\x89\xf3\x23\xe9\x3e\xda\xd5\xd7\x24\xfb\x7a\x24\xab\xc3\x40\x45\xe9\xf8\x36\xc5\xc0\x60\x38\x34\xd4\x64\x79\x6e\xed\x74\xbb\x64\x19\xc7\x97\xaa\xe7\x90\x69\x3a\xe2\xd8\x29\x78\x74\xea\x89\xda\x99\xcb\xab\xb2\xdd\xd6\x7e\xe8\xdd\xfb\xc1\xf7\x61\x10\xc1\xb7\xa7\x50\xbe\x01\xd3\xa0\xd1\xce\xeb\x60\x51\xdc\x6a\xc3\xb1\x0f\x32\x11\x48\x11\x20\xe5\x18\x42\xb1\xf0\x7e\xa0\x87\x29\xe3\x1c\x14\x9a\x4c\x09\xa0\x36\x16\xb6\x35\xae\x74\x56\xcf\x4a\x3d\x11\xf9\x27\x8e\x5c\x2b\xe3\xbf\x4a\xd9\x0f\x48\x8c\xdb\x13\xa9\xa6\x54\x85\x18\x9e\x48\xf5\x07\xd2\x10\xd5\xaa\x1e\xf3\xbf\x4e\x2d\x6f\xbf\xe5\x3d\x66\x28\xc7\x38\x92\xe1\xac\x63\xf7\xae\x69\x82\xaa\xee\x37\x0f\x67\xfb\x4a\xff\xbd\xf7\x6d\xa5\x00\x8b\x60\x01\xd5\x46\x33\x55\xa8\x31\xbf\xcf\xd8\xaa\x69\x2d\x31\x6f\xeb\x92\x2b\x2e\x75\x17\x38\xaf\xd7\x2c\xa4\xf6\x8e\x6f\x99\x69\x95\xef\xda\xe4\x8e\x90\xca\x49\xba\xf0\x12\x85\xcb\xf3\x4f\xf7\xf7\xc6\x31\x9b\xa0\x80\x24\x67\xae\xcb\x4c\xd5\xf9\x9b\xe2\xb6\xdb\xce\x24\x1e\x29\xea\x03\xcb\xe4\xb9\x90\x87\x52\xe4\xb7\xcb\x4c\x83\x90\xa2\x83\xe3\xd4\xcc\xdc\xc2\x31\xba\x3e\x68\x81\x0d\x1a\x04\x85\xa8\x7e\xbc\x3a\x87\x1d\xb2\x31\xe3\x54\xf1\x99\x6b\x03\x75\x2f\x73\x2a\xcd\x33\x94\x84\x12\xb5\x3d\xd2\x95\xca\x96\xe2\x78\xc5\xd6\x57\x47\x2f\x53\x1c\x8a\xcc\x73\x4b\xfb\xf3\xeb\x70\xaf\x8a\x22\x3e\xac\x4b\x26\x8c\xfb\xd8\x06\x77\x39\xe5\x02\xb7\x6d\x63\x25\x95\x0d\x7b\xc0\x19\x0a\x63\xb3\xe7\xa7\x5c\xc9\x61\xfe\xfb\xfb\x1d\x69\x28\xbc\x71\xab\xcc\xca\x5f\x9d\xe2\xf4\x1c\x6f\x32\xd4\xa6\xe5\xfc\x7e\x7c\xe1\xb8\x76\x3a\x74\x6d\xfe\xb4\xeb\x16\x3a\x97\x4f\x65\x73\x41\xa5\xf2\x0c\x50\x78\x53\x5a\x00\xbd\xd2\x2c\xfb\x50\xa7\xb5\x92\x82\x8a\x77\x24\x5b\x0a\x6f\xd6\x81\x0c\x31\x42\x95\x27\xa9\xf7\x9b\x0c\x67\xde\x21\x97\x1a\x5b\xc5\xca\xfc\x69\xe1\xa1\x43\x19\xa2\x45\x59\xf0\xdb\x1c\x60\x34\x36\xde\xb1\xf5\x48\xd4\x72\x32\x51\xc9\xd5\xe9\x7f\x00\xb1\x34\xd0\x0c\x5d\x98\x52\x61\xbf\x38\xee\x22\xfe\x62\x54\xda\x39\x41\x9b\x02\xb5\x79\xc5\x6d\xba\x77\x8e\x34\xec\x73\xde\xaa\x69\xaf\x63\x29\x5b\x96\xe3\x6f\x7a\xe0\x38\xb9\xf4\x98\x9a\x20\xc1\xb0\x56\x55\xdc\xca\x7b\x9f\xed\xe3\xd6\x92\xd4\x18\x15\x6a\x97\xe8\x7d\xa0\xd8\x6a\xb6\x32\x6f\x4a\xfc\x07\x12\xf3\x3e\x2b\x52\x9d\x85\xf3\x99\xde\xbc\x29\xdd\x96\x77\x87\xc7\x1c\x8a\x4c\x6c\xe5\x54\xda\x75\x9f\x78\xaa\xd4\x9e\x6d\xeb\xfd\xda\x67\x9b\xbb\x96\xb5\x4c\x04\x52\x29\x0c\x0c\xaf\x3b\x09\x86\x4f\x19\x3d\x4f\x66\xb9\xdd\xa5\x1a\xc1\x38\xb9\x23\xff\x0f\x00\x00\xff\xff\x6b\xf2\x86\x74\xd6\x1b\x00\x00") +var _testImagesMetadataConcealmentCheck_metadata_concealmentGo = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xbc\x58\x6b\x6f\xdb\xb8\x12\xfd\x6c\xfe\x8a\xa9\x00\xef\xb5\x17\x8a\xe4\x26\x6d\x7a\x37\x0b\xa3\xf0\xe6\xb1\x6b\xb4\x4d\x8a\x38\xd9\xde\xc5\x62\x11\xd0\xd2\x48\x22\x42\x93\x0a\x39\xb2\x63\x14\xf9\xef\x17\xd4\x2b\x8e\xe3\x16\x69\x1e\xfb\x21\xb1\x24\x0e\xcf\x9c\x99\x39\x1a\x92\x0a\x7f\x66\xfb\x3a\x5f\x1a\x91\x66\x04\xdb\x83\xd7\xef\xe0\x2c\x43\xf8\x50\x4c\xd1\x28\x24\xb4\x30\x2a\x28\xd3\xc6\x06\x8c\x7d\x14\x11\x2a\x8b\x31\x14\x2a\x46\x03\x94\x21\x8c\x72\x1e\x65\x08\xf5\x88\x0f\x7f\xa2\xb1\x42\x2b\xd8\x0e\x06\xd0\x73\x06\x5e\x3d\xe4\xf5\x7f\x65\x4b\x5d\xc0\x8c\x2f\x41\x69\x82\xc2\x22\x50\x26\x2c\x24\x42\x22\xe0\x75\x84\x39\x81\x50\x10\xe9\x59\x2e\x05\x57\x11\xc2\x42\x50\x56\x3a\xa9\x21\x02\xf6\x57\x0d\xa0\xa7\xc4\x85\x02\x0e\x91\xce\x97\xa0\x93\x55\x2b\xe0\xc4\x18\x00\x40\x46\x94\xef\x85\xe1\x62\xb1\x08\x78\xc9\x32\xd0\x26\x0d\x65\x65\x65\xc3\x8f\xe3\xfd\xc3\xe3\xc9\xe1\xd6\x76\x30\x60\xec\x5c\x49\xb4\x16\x0c\x5e\x15\xc2\x60\x0c\xd3\x25\xf0\x3c\x97\x22\xe2\x53\x89\x20\xf9\x02\xb4\x01\x9e\x1a\xc4\x18\x48\x3b\x9e\x0b\x23\x48\xa8\xd4\x07\xab\x13\x5a\x70\x83\x2c\x16\x96\x8c\x98\x16\x74\x27\x41\x0d\x2b\x61\x61\xd5\x40\x2b\xe0\x0a\xbc\xd1\x04\xc6\x13\x0f\x7e\x1b\x4d\xc6\x13\x9f\x7d\x19\x9f\xfd\x71\x72\x7e\x06\x5f\x46\xa7\xa7\xa3\xe3\xb3\xf1\xe1\x04\x4e\x4e\x61\xff\xe4\xf8\x60\x7c\x36\x3e\x39\x9e\xc0\xc9\x11\x8c\x8e\xff\x82\x0f\xe3\xe3\x03\x1f\x50\x50\x86\x06\xf0\x3a\x37\x8e\xbb\x36\x20\x5c\xea\x30\x0e\xd8\x04\xf1\x8e\xf3\x44\x57\x64\x6c\x8e\x91\x48\x44\x04\x92\xab\xb4\xe0\x29\x42\xaa\xe7\x68\x94\x50\x29\xe4\x68\x66\xc2\xba\xe2\x59\xe0\x2a\x66\x52\xcc\x04\x71\x2a\xef\xef\x85\x13\xb0\x9f\x43\xc6\x72\x1e\x5d\x3a\x90\x19\x17\x8a\x31\x31\xcb\xb5\x21\xe8\xb1\x8e\x97\xcc\xc8\x63\x1d\x4f\xe8\x50\xe8\x82\x84\x74\x37\x52\xa7\xee\x47\x21\x85\xae\x32\xee\x5a\x5b\xf7\xdf\x60\x8a\xd7\xb9\xc7\xfa\x8c\xcd\xb9\x71\xf3\x6d\x11\x45\x68\xed\xa1\x8a\x73\x2d\x14\x59\x18\xc2\xdf\xff\xb8\xdc\xa9\xf4\x2b\xeb\x74\xc2\x10\x0e\x84\x8d\x1c\xf3\x25\xeb\x74\xbc\xba\xd0\xaf\x77\x7f\x09\xb6\xdf\xbe\x09\xea\x5f\xcf\x5f\x19\x9b\x21\xf1\x98\x13\x0f\x52\xad\x53\x89\x81\x50\x84\x46\x71\x79\xc7\x68\x0d\x20\x7c\x10\xc2\x03\xad\x9c\xac\x0b\xc2\x4f\xf5\xf8\xa3\x26\x85\xf3\xd7\xe5\xbc\x30\x84\x91\x94\x7a\x81\x31\x8c\x3e\x8f\x61\x5e\xbd\x72\x36\x78\x1c\x64\xd8\x60\x4e\xd0\xcc\x45\x84\xc0\xa3\x48\x17\x8a\x80\xf4\x25\x2a\xc0\xa6\x08\x8f\x85\x17\xca\x92\x7b\x9d\x43\x5b\xe1\x6f\xd5\xf8\x36\x8c\x31\xe1\x85\xa4\xb0\x74\xd4\xb0\xf8\xec\x64\x48\xee\x15\x31\x18\x15\xc6\x8a\x39\xc2\x55\x81\x66\xe9\xde\xbb\xc9\xa8\xe5\xf3\x72\x74\xde\xb7\x8e\x87\x64\x0a\x6c\x88\x7d\x50\x7a\xa1\x6a\x2a\x39\x37\x7c\xf6\xf4\x8c\x10\x4f\xed\x7b\x2e\x69\x48\x78\x4d\x8f\x95\xc4\x1a\xdc\x82\x0b\xba\x48\xb4\xb9\x88\x32\xae\x52\x1c\x26\x5c\x5a\x7c\x21\x6c\x97\x9e\x9f\x48\xcc\x50\x17\x74\x61\x31\x1a\x0e\x5e\xd2\x91\xe4\x96\x2e\x90\x78\x3a\x8c\x77\xde\xc4\xd3\x9d\x9d\xc4\x79\xbb\x61\x1d\xa5\xdd\x6a\x75\xa8\xe6\xdf\x69\x18\xfb\x19\x46\x97\x40\x19\x27\xd7\xc6\x2c\x42\xac\xd5\x7f\x08\x52\x24\xe0\x2b\x4a\x33\x68\x0b\xf9\x74\x6d\xdd\x4a\xa8\xbb\x73\x50\x89\x08\x00\xc2\x10\x0a\x23\x51\x45\x3a\xc6\xf8\x19\x5c\x74\x07\xff\x5d\x53\xaa\x73\x31\xe5\xd1\xa5\xcd\x79\xe4\x5c\xdc\xb0\x4e\xc2\x85\x2c\x0c\x7e\x27\x35\x27\xe5\x32\xf2\xc3\x9d\x64\x10\x6c\x3f\xae\xf7\x85\xf3\xed\xb6\xe7\x5c\x16\x53\xdc\x42\x35\x7f\x72\xc6\x39\xd5\x4b\xab\x0d\x1b\xcc\xc6\xc7\x9f\x9f\x40\xc4\xa8\x48\xd0\xf2\xe5\x9a\x46\xe3\xa1\x71\x7a\xa4\xcd\x54\xc4\x31\xaa\xb5\x36\x26\xf0\xe9\x6d\x63\x53\x83\x7a\x1a\x60\xf7\xdd\x76\x77\xf7\x6d\x77\x77\xa7\xfb\xee\xad\xbb\x7e\xb7\xd3\xdd\xfd\xa5\xfb\x6e\xb7\xbb\xfb\x76\x45\x59\x85\x91\x5b\xb7\xea\x0d\x43\x38\x57\x97\xeb\x4d\x11\x2e\xf1\xe9\x59\x7e\x6f\xf5\x0c\x29\x13\x2a\x1d\xe2\xb3\x74\xaf\xf7\x45\xc5\xb4\xa9\x4e\x29\xf9\xe7\xd4\xdc\x5d\xd1\x3d\x17\x6a\x10\x7c\x53\xd7\xcf\xab\xe2\xcd\x32\x7e\x5e\x1f\x41\xf0\xb0\xb7\xe7\xc6\x6d\x04\x93\x42\x45\xe5\xb6\xb2\xd7\x87\xaf\xed\x86\x10\xf6\x86\x30\x60\x9d\xcc\xfd\xce\x78\xfe\x77\xd5\xc6\xfe\x59\xed\x67\x5e\x43\x66\xeb\x48\xf2\xb9\x36\xde\x1e\x7c\xf5\x7e\x2f\x79\x7b\x37\xd5\x72\xe1\x36\xc3\x17\x3e\xa0\x43\x31\x6e\x79\x81\x7b\xfb\x4d\x87\x24\x12\x40\x63\x9c\x51\xe4\xd6\x8e\xf3\xd3\x8f\x3d\xf4\x21\xf3\x61\x7b\x30\xf0\xc1\xf3\xdc\x5f\xff\xd7\xd2\xe6\xd5\x10\x94\x90\xe5\xac\x8e\xd4\x69\xf0\xd9\x08\x45\x49\xcf\xfb\x62\xb4\x4a\xdd\x9a\x92\xeb\x66\x17\xde\x9d\xef\x41\x77\xee\xf9\x80\xbe\x9b\xda\x77\x53\x9a\xe8\x86\xf0\x9a\x75\x1c\xc3\x8d\x24\x37\xac\x72\xdf\xa5\xf9\x66\xb0\x53\xd3\x6c\x85\xf3\x6f\xd2\xbd\xb7\xee\x3c\x90\xec\xcb\x91\x64\x9d\xeb\x23\x6d\x16\xdc\xc4\x18\x1f\x69\xf3\x07\x72\x77\xa8\xf9\x8e\x94\xfe\xb7\xd5\xda\xbb\xab\x52\x4a\x13\x3d\xc3\xa9\x8e\x97\x5b\xae\x45\x2d\x32\x34\xad\xac\xee\x6e\x32\x1a\xff\xed\xf6\xb9\x4c\x08\x88\x04\xd6\x50\xdd\xc1\xd0\x1d\xe0\xb0\xdc\xd2\x3e\x49\x9b\x1b\xc2\x7b\x72\x66\xab\x43\xf8\x1a\xe7\x87\x69\x42\xdb\xe0\xf0\x5a\x50\xaf\x1e\xeb\xb3\x1b\xc6\x9a\x24\xd9\x2a\x4b\x1c\xce\x4f\x3f\xde\x9e\xf3\x53\x31\x47\x05\x59\xc9\xdc\x1d\xc6\xa9\x30\xca\x96\x23\xd5\xd7\x09\xb7\xf4\x04\x0e\x63\x9c\xb8\x63\x2f\x46\x84\xf1\x99\xde\xd7\xaa\xfc\x1a\x20\x2c\x28\xad\xb6\x70\x96\xd3\xd2\xaf\x12\x63\xdb\x1d\x1f\xb8\xa2\x41\x54\x99\xda\xfb\xb3\x4b\xd8\x89\x98\x09\xc9\x8d\x5c\xfa\xae\x50\xb7\x36\xc7\x9a\x7e\xc0\x49\xac\xd1\xba\xbd\x65\xed\x6c\x23\x4e\x50\x75\xb8\xb6\x7a\x85\x91\x50\x29\xcf\xaf\xe3\x2f\x3f\x5f\x04\x4d\x15\x1b\x8c\x09\x71\x2a\x2c\x08\x45\xfe\xfd\x18\xfc\xcd\x94\x2b\xdc\xbe\xab\x95\x36\xae\xec\x91\x14\xa8\xc8\xa9\xe7\xa7\xd2\xc9\x7e\x79\xff\xf5\x86\x75\x0c\x5e\xf9\x8d\xb2\xca\xa1\x63\x5c\x9c\xe2\x55\x81\x96\x7a\xde\xef\x87\x67\x9e\xef\x36\x01\xbe\xd3\x4f\x9f\x35\x2a\x5c\xd1\x53\x55\x32\xf7\xb4\x54\x80\xc1\xab\x3a\x02\x18\xd6\x61\xb9\x87\x36\x6f\x9d\x54\x54\x82\x03\xdd\x33\x78\xf5\x10\xc8\x18\x13\x34\xa5\x48\x83\xdf\x74\xbc\x0c\xf6\xa5\xb6\xd8\xab\x66\x96\x4f\xab\x0c\xed\xeb\x18\x1d\xca\x5a\xde\x56\x00\x93\x19\x05\x87\x2e\x23\x49\xcf\x2b\x54\x63\xd7\xca\x7f\x0f\x52\x4d\xd0\x8d\x7d\x58\x70\xe5\x2e\x3c\x7f\x1d\x7f\xbd\x2a\xfd\x92\xa0\x93\x40\x1b\x5e\xf5\xf5\x23\x38\x45\x1e\x8f\xa4\xec\xb5\xb4\x1f\x12\xa9\xd8\xa4\xf1\x57\x43\xf0\xbc\xd2\x7a\xc6\x29\xca\x30\x6e\x5d\x55\x5f\x51\x82\x4f\xee\x71\x6f\x83\x34\xa6\x95\xdb\x0d\x7e\xef\x38\x76\x9e\x9d\xcd\xab\x1a\xff\x8e\xc5\x6a\xce\x2a\xa9\x8b\x78\x55\xe9\xdd\xab\x3a\x6d\x65\x77\xb8\xcf\xa1\x52\x62\xaf\xa4\xd2\x6f\xfb\xc4\xb7\x5e\xb5\x1f\x8e\xf5\x76\xee\x0f\x87\xfb\xa0\x68\x85\x8a\xb4\x31\x18\x91\x6c\x3b\x09\xc6\xdf\x0a\x7a\x95\xcc\xe6\xb8\x6b\x37\x4a\x48\x76\xc3\xfe\x1f\x00\x00\xff\xff\x1e\xa3\xa8\xfc\x86\x15\x00\x00") func testImagesMetadataConcealmentCheck_metadata_concealmentGoBytes() ([]byte, error) { return bindataRead( @@ -5001,7 +5417,7 @@ func testImagesMetadataConcealmentCheck_metadata_concealmentGo() (*asset, error) return a, nil } -var _testImagesNautilusBaseimage = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xca\xc9\xcc\x2b\xad\xd0\x4f\xcc\x4d\x31\x33\xb1\x0d\x72\x75\xf7\x0c\x0e\x09\x8a\xd4\x4f\x4c\xcf\xcb\xc8\x2f\x2e\xb1\x32\xd2\x33\x32\xd4\x05\xab\xd0\x05\xab\xe0\x82\xaa\x2e\xca\xc5\xaf\xb6\x28\x17\xa1\x92\x90\xb9\x20\x15\x50\xd5\x05\x05\xc9\x66\x26\x39\xa9\x78\xd5\x43\xd5\x40\x75\x14\x1b\x5b\x1a\x54\xe0\x55\x0f\x56\xc1\x55\x9e\x99\x97\x92\x5f\x5e\x0c\xf1\xa7\xbe\xa1\x85\x81\x25\x0e\x4d\x50\x85\x10\xef\xea\x82\x14\xa2\xeb\xb5\x34\x30\x26\x4e\xaf\xa5\x81\x31\xa6\x5e\x22\xed\xb5\x34\xb0\xe4\x02\x04\x00\x00\xff\xff\x3f\x6b\x27\xe4\x9a\x01\x00\x00") +var _testImagesNautilusBaseimage = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xca\xc9\xcc\x2b\xad\xd0\x4f\xcc\x4d\x31\x33\xb1\x0d\x72\x75\xf7\x0c\x0e\x09\x8a\xd4\x4f\x4c\xcf\xcb\xc8\x2f\x2e\xb1\x32\xd2\x33\x32\xd3\x05\xab\xd0\x05\xab\xe0\x82\xaa\x2e\xca\xc5\xaf\xb6\x28\x17\xa1\x92\x90\xb9\x20\x15\x50\xd5\x05\x05\xc9\x66\x26\x39\xa9\x78\xd5\x43\xd5\x40\x75\x14\x1b\x5b\x1a\x54\xe0\x55\x0f\x56\xc1\x55\x9e\x99\x97\x92\x5f\x5e\x0c\xf1\xa7\xbe\xa1\x85\x81\x25\x0e\x4d\x50\x85\x10\xef\xea\x82\x14\xa2\xeb\xb5\x34\x30\x26\x4e\xaf\xa5\x81\x31\xa6\x5e\x22\xed\xb5\xc4\xb0\xd7\xc8\xc0\x00\x57\x40\xa2\xea\x05\x29\xc4\xd0\xeb\x61\x44\xa4\x5e\x0f\x23\x2e\x40\x00\x00\x00\xff\xff\x48\x44\x85\xf4\x12\x02\x00\x00") func testImagesNautilusBaseimageBytes() ([]byte, error) { return bindataRead( @@ -5101,29 +5517,209 @@ func testImagesNautilusHtmlDataJson() (*asset, error) { return a, nil } -var _testImagesNodePerfNpbEpBaseimage = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xca\xc9\xcc\x2b\xad\xd0\x4f\xcc\x4d\x31\x33\xb1\x4d\x49\x4d\xca\x4c\xcc\xb3\x2a\x2e\x29\x4a\x2d\x49\xce\xd0\x2d\xce\xc9\xcc\xe5\x82\xca\x17\xe5\x9a\x99\xd8\x82\xc9\x32\x0b\x7d\xdc\xea\x0a\x0a\x92\xcd\x4c\x72\x52\x6d\xa1\x34\x56\x95\x80\x00\x00\x00\xff\xff\x23\xf1\xf9\x99\x72\x00\x00\x00") +var _testImagesNginxBaseimage = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\xce\xbd\x0e\x82\x30\x10\xc0\xf1\x9d\x77\xa9\x3d\xda\xa6\xe1\x4c\x6e\x34\xe2\x8a\x2e\x8e\x20\xc4\x34\x81\x42\x20\x7c\xf8\xf6\x06\xec\x64\xc5\x74\xb9\x0e\xfd\xfd\x73\x57\x1b\x3b\x2e\x3c\x6f\x4a\xad\xc8\x3e\x8d\x5d\x8e\xf1\x21\x56\x2c\xaf\x3b\x63\xab\xc8\xfd\xf6\x0d\xe5\x7d\x23\xc5\xa4\xf9\x1f\xa3\x15\x6d\x73\x4a\x76\x55\xd7\x3d\xb4\xaa\x2b\x72\xef\xae\x1b\x24\xc2\x42\xdb\xfc\x61\x66\x63\xcb\x76\x1e\x3e\x57\xf3\x38\x01\xa4\xec\x74\xbe\x5c\x6f\xd9\x9d\x17\xe3\xf0\x2a\xda\xd5\x0b\x64\x0e\xb2\x0d\xb2\x15\x7e\xb7\x08\x32\xac\x45\x90\x7e\x1b\xb8\x17\xbd\xbd\x02\x40\x05\xb5\x2b\xf4\xda\x54\x04\xb6\xa9\x88\xde\x01\x00\x00\xff\xff\x66\xe9\xe5\x47\xe0\x01\x00\x00") -func testImagesNodePerfNpbEpBaseimageBytes() ([]byte, error) { +func testImagesNginxBaseimageBytes() ([]byte, error) { return bindataRead( - _testImagesNodePerfNpbEpBaseimage, - "test/images/node-perf/npb-ep/BASEIMAGE", + _testImagesNginxBaseimage, + "test/images/nginx/BASEIMAGE", ) } -func testImagesNodePerfNpbEpBaseimage() (*asset, error) { - bytes, err := testImagesNodePerfNpbEpBaseimageBytes() +func testImagesNginxBaseimage() (*asset, error) { + bytes, err := testImagesNginxBaseimageBytes() if err != nil { return nil, err } - info := bindataFileInfo{name: "test/images/node-perf/npb-ep/BASEIMAGE", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + info := bindataFileInfo{name: "test/images/nginx/BASEIMAGE", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} a := &asset{bytes: bytes, info: info} return a, nil } -var _testImagesNodePerfNpbEpDockerfile = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x54\x6d\x6f\xd3\x48\x17\xfd\x3e\xbf\xe2\x3c\x09\xaa\x00\xd5\x36\x2f\x8f\x10\xa2\xea\x4a\x6e\x12\xc0\x22\x75\xb2\x76\x0a\xaa\x96\x55\x34\xb6\xaf\xed\x59\xec\x19\x33\x33\x6e\x12\x10\xff\x7d\x35\x4e\x1a\xb5\xdd\x7e\x20\x52\xa4\xf1\x7d\x3d\x73\xe7\x9c\x3b\xc6\x44\x75\x3b\x2d\xaa\xda\xe2\xd5\x8b\x97\x6f\xb1\xaa\x09\x9f\xfa\x8c\xb4\x24\x4b\x06\x61\x6f\x6b\xa5\x8d\xcf\xc6\x6c\x8c\xb9\xc8\x49\x1a\x2a\xd0\xcb\x82\x34\x6c\x4d\x08\x3b\x9e\xd7\x74\xeb\x39\xc5\x67\xd2\x46\x28\x89\x57\xfe\x0b\x3c\x75\x01\xa3\x83\x6b\xf4\xec\x8c\x8d\xb1\x53\x3d\x5a\xbe\x83\x54\x16\xbd\x21\xd8\x5a\x18\x94\xa2\x21\xd0\x36\xa7\xce\x42\x48\xe4\xaa\xed\x1a\xc1\x65\x4e\xd8\x08\x5b\x0f\x6d\x0e\x45\x7c\x36\xc6\xf5\xa1\x84\xca\x2c\x17\x12\x1c\xb9\xea\x76\x50\xe5\xdd\x38\x70\x3b\x00\x76\xbf\xda\xda\xee\x5d\x10\x6c\x36\x1b\x9f\x0f\x60\x7d\xa5\xab\xa0\xd9\x07\x9a\x60\x1e\x4d\x66\x71\x3a\xf3\x5e\xf9\x2f\x86\x94\x2b\xd9\x90\x31\xd0\xf4\xbd\x17\x9a\x0a\x64\x3b\xf0\xae\x6b\x44\xce\xb3\x86\xd0\xf0\x0d\x94\x06\xaf\x34\x51\x01\xab\x1c\xde\x8d\x16\x56\xc8\xea\x14\x46\x95\x76\xc3\x35\xb1\x31\x0a\x61\xac\x16\x59\x6f\xef\x0d\xeb\x16\x9d\x30\xf7\x02\x94\x04\x97\x18\x85\x29\xa2\x74\x84\x8b\x30\x8d\xd2\x53\x36\xc6\x97\x68\xf5\x71\x71\xb5\xc2\x97\x30\x49\xc2\x78\x15\xcd\x52\x2c\x12\x4c\x16\xf1\x34\x5a\x45\x8b\x38\xc5\xe2\x3d\xc2\xf8\x1a\x9f\xa2\x78\x7a\x0a\x12\xb6\x26\x0d\xda\x76\xda\xe1\x57\x1a\xc2\x8d\x91\x0a\x37\xb3\x94\xe8\x1e\x80\x52\xed\x01\x99\x8e\x72\x51\x8a\x1c\x0d\x97\x55\xcf\x2b\x42\xa5\x6e\x48\x4b\x21\x2b\x74\xa4\x5b\x61\xdc\x63\x1a\x70\x59\xb0\x31\x1a\xd1\x0a\xcb\xed\x60\xf9\xcf\xa5\x7c\xc6\xc2\xe4\x83\x43\x3f\x8b\x2e\xc3\x0f\x33\xf6\x3e\x59\x5c\xe2\xc9\xf1\x1b\xdc\x20\xeb\x45\x53\xac\xa5\x2a\x68\xdd\x91\x2e\xd7\xb2\xcb\xd6\xd4\x31\x36\x49\x16\x69\xba\xbe\xb8\x8a\xe6\xd3\xf5\x64\xb1\xbc\xc6\x77\x6a\x7b\xef\xcf\xd9\xe5\x55\x98\x4c\x3e\x7a\xc6\x35\xcd\x11\xf4\x46\x07\x99\x90\x01\x63\xc9\x55\x0c\xde\x59\xaf\x22\x8b\xbe\x2b\xb8\x25\x9c\x9c\x1c\x2d\x42\x1a\xcb\x9b\x06\xde\x6e\xdf\xd1\x23\x63\x48\x5a\xc1\x1b\x54\xa5\xd2\x56\x73\xc9\x58\x38\x9d\xde\xa5\x86\xe4\xc6\xfd\xb9\x5f\xa9\x9b\x80\x1b\x43\xd6\x04\xb2\xcb\x82\x78\x79\xf1\xda\x7f\xed\xbf\xf4\x2d\xd7\x7e\xf5\x03\xfe\xd0\xdb\x72\x8d\xed\x8f\x12\x0f\xbc\x8c\x7d\x59\x24\x9f\xa6\x51\x02\xff\x98\x78\x38\x78\x8b\xcb\xe5\x90\x2a\x4a\xfc\x85\x27\x4f\xb9\xce\xeb\x67\xf8\xdf\x39\x46\xdb\xb7\x6f\xd6\x6f\xfe\x3f\xc2\xdf\x67\x6e\x9c\x12\x5f\x99\x63\xad\x53\x99\x09\xbc\x36\x6f\x55\x41\xcd\x79\x4b\x85\xe8\xdb\x20\xa8\x90\x2b\x59\x8a\x2a\x88\xc3\xd4\x37\xbc\xed\x1a\x32\x41\xcb\xbf\x91\x5f\x50\xe9\x57\x79\xbe\xde\xbe\x7d\x83\x3f\x6e\xa3\x6e\x3d\x67\xf8\xca\xa8\x31\x74\x28\x9e\x77\xbf\x55\xe6\x91\x22\xa5\x18\x2e\xe1\x4c\x98\x2d\x31\x99\x87\x69\x7a\x3e\x65\x6c\xbf\x46\x1c\x6d\x1c\x25\x8e\xe2\x69\x44\xa6\xb9\x16\x64\xf0\xd4\xd4\xdc\x59\x54\xf6\x0f\xe5\x76\x90\xbc\x79\xe6\x04\xe4\xf4\x2b\x6f\x48\x0a\x92\x16\x8d\xca\x07\x7e\xc1\x28\xd8\x9a\x5b\x08\x8b\x9c\x4b\x64\xe4\x54\x2e\xa8\x80\x90\xd6\xb9\x9c\xc6\x5a\x3e\x2c\x0b\xe9\xd6\x00\x69\xa7\xc4\x81\xd2\x94\x2b\x59\xec\x1f\x1e\xc6\xf2\x8a\xf6\x4f\xd6\x7e\x2b\x84\x86\xd7\x21\x68\x44\xe6\x0d\x3b\xe3\xe4\x04\xa5\x90\xc5\x9e\x58\x8d\xc8\xe0\x49\xde\x12\x46\xcf\x7d\xa3\xfc\xe7\x23\x78\xb4\xa5\xdc\x0d\xeb\xe7\xaf\x3b\x59\x5f\xcf\xd8\x43\x6e\x33\x36\xb0\xd6\xf3\x4a\xad\xda\xf3\xc7\x59\x8e\xc7\x18\x31\xd0\x99\x3a\x7f\xea\x6f\x11\xfc\x56\x91\x23\x8c\xe3\x89\xcd\xe2\xcf\x98\x4f\xd7\xf3\xe8\x22\x09\x93\xeb\xf5\x32\x5c\x7d\x3c\x1f\x3d\xf9\xf9\xc0\xf4\xeb\xdd\x31\x63\xc4\xd8\x2c\x5e\x25\xd7\xcb\x45\x14\xaf\x70\xe8\xcf\xfe\x0d\x00\x00\xff\xff\xc8\xdd\xe0\xa9\x0a\x06\x00\x00") +var _testImagesNginxDockerfile = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x64\x92\x51\x6f\x9b\x30\x14\x85\xdf\xfd\x2b\x8e\x60\xd2\x5a\x29\x25\x4d\xb4\xa7\x4e\x7b\xa0\x2d\xed\x50\x53\x90\x02\x5d\xd5\xa7\xc9\xc0\x0d\xdc\x09\x6c\xcf\x36\xa5\xf9\xf7\x13\x49\xab\x2d\x9a\xdf\xec\x7b\xee\xb9\x9f\x8f\x1d\xe2\x46\x9b\xbd\xe5\xb6\xf3\x58\x5f\xae\x57\x28\x3b\xc2\xc3\x58\x91\x55\xe4\xc9\x21\x1e\x7d\xa7\xad\x8b\x44\x28\x42\x6c\xb8\x26\xe5\xa8\xc1\xa8\x1a\xb2\xf0\x1d\x21\x36\xb2\xee\xe8\xa3\xb2\xc0\x0f\xb2\x8e\xb5\xc2\x3a\xba\xc4\xd9\x2c\x08\xde\x4b\xc1\xf9\x57\x11\x62\xaf\x47\x0c\x72\x0f\xa5\x3d\x46\x47\xf0\x1d\x3b\xec\xb8\x27\xd0\x5b\x4d\xc6\x83\x15\x6a\x3d\x98\x9e\xa5\xaa\x09\x13\xfb\xee\x30\xe6\xdd\x24\x12\x21\x5e\xde\x2d\x74\xe5\x25\x2b\x48\xd4\xda\xec\xa1\x77\xff\xea\x20\xfd\x01\x78\x5e\x9d\xf7\xe6\x6a\xb9\x9c\xa6\x29\x92\x07\xd8\x48\xdb\x76\xd9\x1f\x85\x6e\xb9\x49\x6f\x92\xac\x48\x2e\xd6\xd1\xe5\xa1\xe5\x49\xf5\xe4\x1c\x2c\xfd\x1e\xd9\x52\x83\x6a\x0f\x69\x4c\xcf\xb5\xac\x7a\x42\x2f\x27\x68\x0b\xd9\x5a\xa2\x06\x5e\xcf\xbc\x93\x65\xcf\xaa\x5d\xc0\xe9\x9d\x9f\xa4\x25\x11\xa2\x61\xe7\x2d\x57\xa3\x3f\x09\xeb\x83\x8e\xdd\x89\x40\x2b\x48\x85\x20\x2e\x90\x16\x01\xae\xe3\x22\x2d\x16\x22\xc4\x73\x5a\x7e\xcf\x9f\x4a\x3c\xc7\xdb\x6d\x9c\x95\x69\x52\x20\xdf\xe2\x26\xcf\x6e\xd3\x32\xcd\xb3\x02\xf9\x1d\xe2\xec\x05\x0f\x69\x76\xbb\x00\xb1\xef\xc8\x82\xde\x8c\x9d\xf9\xb5\x05\xcf\x31\x52\x33\x67\x56\x10\x9d\x00\xec\xf4\x11\xc8\x19\xaa\x79\xc7\x35\x7a\xa9\xda\x51\xb6\x84\x56\xbf\x92\x55\xac\x5a\x18\xb2\x03\xbb\xf9\x31\x1d\xa4\x6a\x44\x88\x9e\x07\xf6\xd2\x1f\x4e\xfe\xbb\x54\x24\x44\x88\x2c\x2f\x93\xb3\xba\x97\x63\xc3\x63\x75\x7e\x85\x4c\x6b\x13\xe1\x99\x3e\x5b\xc2\xaf\xd1\x79\x0c\x6c\xad\xb6\xb3\xfd\xdc\xca\xc3\x3c\xd2\x6b\x38\x2f\x5b\x56\x6d\x24\xe2\xed\xfd\x1c\x40\x92\x3e\xc6\xf7\x89\xb8\xdb\xe6\x8f\xf8\xf4\x77\x2f\x36\xf1\x75\xb2\x39\xb6\xfd\x7c\x3d\xfe\xb4\x6f\xc1\x2a\x5a\x7d\xb9\x58\x05\xe2\x4f\x00\x00\x00\xff\xff\x56\x22\x53\x60\xcb\x02\x00\x00") -func testImagesNodePerfNpbEpDockerfileBytes() ([]byte, error) { +func testImagesNginxDockerfileBytes() ([]byte, error) { + return bindataRead( + _testImagesNginxDockerfile, + "test/images/nginx/Dockerfile", + ) +} + +func testImagesNginxDockerfile() (*asset, error) { + bytes, err := testImagesNginxDockerfileBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "test/images/nginx/Dockerfile", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _testImagesNginxDockerfile_windows = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x64\x93\xd1\x6f\xa3\x38\x10\xc6\xdf\xfd\x57\x7c\x82\x6a\x75\x27\x05\x48\xa2\xd5\x69\xd5\x53\x1f\xd8\x2c\xdb\x43\x9b\x85\x0a\xe8\xf6\xa2\xd3\xa9\x72\x60\x02\x96\xc0\xe6\x6c\x53\x92\xff\xfe\x04\xb4\x6a\xab\xf2\x80\x18\xfb\x1b\x7f\xbf\x99\xc1\x2e\x76\xaa\xbf\x68\x51\x37\x16\xdb\xf5\x76\x83\xa2\x21\xfc\x18\x8e\xa4\x25\x59\x32\x08\x07\xdb\x28\x6d\x7c\xe6\x32\x17\x7b\x51\x92\x34\x54\x61\x90\x15\x69\xd8\x86\x10\xf6\xbc\x6c\xe8\x65\x67\x85\x5f\xa4\x8d\x50\x12\x5b\x7f\x8d\xdf\x26\x81\xf3\xbc\xe5\xfc\xfe\x27\x73\x71\x51\x03\x3a\x7e\x81\x54\x16\x83\x21\xd8\x46\x18\x9c\x44\x4b\xa0\x73\x49\xbd\x85\x90\x28\x55\xd7\xb7\x82\xcb\x92\x30\x0a\xdb\xcc\x36\xcf\x87\xf8\xcc\xc5\xe1\xf9\x08\x75\xb4\x5c\x48\x70\x94\xaa\xbf\x40\x9d\xde\xea\xc0\xed\x0c\x3c\x3d\x8d\xb5\xfd\x75\x10\x8c\xe3\xe8\xf3\x19\xd6\x57\xba\x0e\xda\x45\x68\x82\x7d\xbc\x8b\x92\x3c\xf2\xb6\xfe\x7a\x4e\xb9\x97\x2d\x19\x03\x4d\xff\x0d\x42\x53\x85\xe3\x05\xbc\xef\x5b\x51\xf2\x63\x4b\x68\xf9\x08\xa5\xc1\x6b\x4d\x54\xc1\xaa\x89\x77\xd4\xc2\x0a\x59\xaf\x60\xd4\xc9\x8e\x5c\x13\x73\x51\x09\x63\xb5\x38\x0e\xf6\x5d\xb3\x5e\xe8\x84\x79\x27\x50\x12\x5c\xc2\x09\x73\xc4\xb9\x83\xaf\x61\x1e\xe7\x2b\xe6\xe2\x21\x2e\xfe\x4a\xef\x0b\x3c\x84\x59\x16\x26\x45\x1c\xe5\x48\x33\xec\xd2\xe4\x5b\x5c\xc4\x69\x92\x23\xfd\x8e\x30\x39\xe0\x47\x9c\x7c\x5b\x81\x84\x6d\x48\x83\xce\xbd\x9e\xf8\x95\x86\x98\xda\x48\xd5\xd4\xb3\x9c\xe8\x1d\xc0\x49\x2d\x40\xa6\xa7\x52\x9c\x44\x89\x96\xcb\x7a\xe0\x35\xa1\x56\x4f\xa4\xa5\x90\x35\x7a\xd2\x9d\x30\xd3\x30\x0d\xb8\xac\x98\x8b\x56\x74\xc2\x72\x3b\xaf\x7c\x28\xca\x67\x2c\xcc\x6e\x27\xfa\x28\xfe\x19\xde\x46\x73\x94\x45\xb7\x71\x5e\x64\x87\x39\x48\xf3\xc7\x5f\x51\x96\xc7\x69\xc2\xd8\xf7\x2c\xfd\x89\xb2\xe5\x43\x25\x86\x23\xb5\x43\x20\x6b\x21\xcf\xd7\x1b\x7f\xf3\xc5\x5f\x83\x1b\xcc\xb1\x67\xd4\xa0\x4b\x5a\xd4\x9e\xd7\xb7\xdc\x9e\x94\xee\x6e\x5a\x21\x87\x73\xc0\xbb\xea\x8f\xcf\xb8\x7a\xf1\x08\x46\x21\x2b\x35\x1a\xcf\x90\x7e\x22\x5d\x2a\x4d\x5e\x39\xcd\xfb\x7a\xe3\xaf\xbd\x39\xc5\x9b\x53\xbc\xab\x57\x92\xc9\xea\x8d\xbe\xa1\xb6\x27\xbd\xf8\x5d\xbd\x96\xc2\x76\xe9\xdd\x01\x9e\x77\xd2\xaa\xbb\x79\x4b\x86\x85\x1b\xc1\x60\x74\x60\x1a\xae\x69\x59\x60\xec\x3e\x8f\x32\xec\x94\x9c\xfe\x51\xd2\x61\xd5\x09\x39\x4d\x9c\x5b\xa5\x59\xf4\xf7\x5d\x9a\x47\xf8\xb2\x66\xfb\xf0\x6b\xb4\x87\xe8\x78\x4d\x8f\x4f\xcb\xcd\xb9\x71\x36\xfe\xe6\xb3\xb7\x71\x58\x94\x14\xd9\xe1\x2e\x8d\x93\x02\xff\x38\xc1\x51\xc8\xc0\x34\xce\x0a\x8e\x57\x4e\x6f\x94\xd5\x07\x5b\x7c\xfa\x04\x7f\xf9\xf4\xe9\x4c\xce\xbf\xec\xff\x00\x00\x00\xff\xff\x9e\x0d\xf6\x1d\xdf\x03\x00\x00") + +func testImagesNginxDockerfile_windowsBytes() ([]byte, error) { + return bindataRead( + _testImagesNginxDockerfile_windows, + "test/images/nginx/Dockerfile_windows", + ) +} + +func testImagesNginxDockerfile_windows() (*asset, error) { + bytes, err := testImagesNginxDockerfile_windowsBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "test/images/nginx/Dockerfile_windows", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _testImagesNginxVersion = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x32\xd4\x33\x34\xd1\x35\xe4\x02\x04\x00\x00\xff\xff\x01\xd0\xcb\x5b\x07\x00\x00\x00") + +func testImagesNginxVersionBytes() ([]byte, error) { + return bindataRead( + _testImagesNginxVersion, + "test/images/nginx/VERSION", + ) +} + +func testImagesNginxVersion() (*asset, error) { + bytes, err := testImagesNginxVersionBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "test/images/nginx/VERSION", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _testImagesNginxNewAlias = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xca\x4b\xcf\xcc\xab\xe0\x02\x04\x00\x00\xff\xff\x97\x20\x7a\xab\x06\x00\x00\x00") + +func testImagesNginxNewAliasBytes() ([]byte, error) { + return bindataRead( + _testImagesNginxNewAlias, + "test/images/nginx-new/ALIAS", + ) +} + +func testImagesNginxNewAlias() (*asset, error) { + bytes, err := testImagesNginxNewAliasBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "test/images/nginx-new/ALIAS", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _testImagesNginxNewBaseimage = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\xce\x3d\xcf\x82\x30\x10\xc0\xf1\x9d\xef\xd2\xa7\x47\xdb\xa7\xe1\x4c\x6e\x34\xe2\x8a\x2e\x8e\x20\xc4\x34\x81\x42\x20\xbc\xf8\xed\x0d\xd8\xc9\x8a\xe9\x72\x1d\xfa\xfb\xe7\xae\x36\x76\x5c\x78\xde\x94\x5a\x91\x7d\x18\xbb\x1c\xe2\xbf\xf8\x9f\xe5\x75\x67\x6c\x15\xb9\xdf\xbe\xa1\xbc\x6f\xa4\x98\x34\xff\x61\xb4\xa2\x6d\x4e\xc9\xae\xea\xba\xbb\x56\x75\x45\xee\xdd\x75\x83\x44\x58\x68\x9b\x5f\xcc\x6c\x6c\xd9\xce\xc3\xfb\x6a\x1e\x27\x80\x94\x1d\x4f\xe7\xcb\x35\xbb\xf1\x62\x1c\x9e\x45\xbb\x7a\x81\xcc\x41\xb6\x41\xb6\xc2\xcf\x16\x41\x86\xb5\x08\xd2\x6f\x03\xf7\xa2\xb7\x57\x00\xa8\xa0\x76\x85\x5e\x9b\x8a\xc0\x36\x15\xd1\x2b\x00\x00\xff\xff\x83\xde\xd7\x22\xe0\x01\x00\x00") + +func testImagesNginxNewBaseimageBytes() ([]byte, error) { + return bindataRead( + _testImagesNginxNewBaseimage, + "test/images/nginx-new/BASEIMAGE", + ) +} + +func testImagesNginxNewBaseimage() (*asset, error) { + bytes, err := testImagesNginxNewBaseimageBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "test/images/nginx-new/BASEIMAGE", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _testImagesNginxNewDockerfile = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x64\x92\x51\x6f\x9b\x30\x14\x85\xdf\xfd\x2b\x8e\x60\xd2\x5a\x29\x25\x4d\xa4\xbd\x74\xda\x03\x6d\x69\x87\x9a\x82\x14\xe8\xaa\x3e\x4d\x06\x6e\xe0\x4e\x60\x7b\xb6\x29\xcd\xbf\x9f\x48\x5a\x6d\xd1\xfc\x66\xdf\x73\xcf\xfd\x7c\xec\x10\x37\xda\xec\x2d\xb7\x9d\xc7\xfa\x72\xbd\x42\xd9\x11\x1e\xc6\x8a\xac\x22\x4f\x0e\xf1\xe8\x3b\x6d\x5d\x24\x42\x11\x62\xc3\x35\x29\x47\x0d\x46\xd5\x90\x85\xef\x08\xb1\x91\x75\x47\x1f\x95\x05\x7e\x90\x75\xac\x15\xd6\xd1\x25\xce\x66\x41\xf0\x5e\x0a\xce\xbf\x8a\x10\x7b\x3d\x62\x90\x7b\x28\xed\x31\x3a\x82\xef\xd8\x61\xc7\x3d\x81\xde\x6a\x32\x1e\xac\x50\xeb\xc1\xf4\x2c\x55\x4d\x98\xd8\x77\x87\x31\xef\x26\x91\x08\xf1\xf2\x6e\xa1\x2b\x2f\x59\x41\xa2\xd6\x66\x0f\xbd\xfb\x57\x07\xe9\x0f\xc0\xf3\xea\xbc\x37\x57\xcb\xe5\x34\x4d\x91\x3c\xc0\x46\xda\xb6\xcb\xfe\x28\x74\xcb\x4d\x7a\x93\x64\x45\x72\xb1\x8e\x2e\x0f\x2d\x4f\xaa\x27\xe7\x60\xe9\xf7\xc8\x96\x1a\x54\x7b\x48\x63\x7a\xae\x65\xd5\x13\x7a\x39\x41\x5b\xc8\xd6\x12\x35\xf0\x7a\xe6\x9d\x2c\x7b\x56\xed\x02\x4e\xef\xfc\x24\x2d\x89\x10\x0d\x3b\x6f\xb9\x1a\xfd\x49\x58\x1f\x74\xec\x4e\x04\x5a\x41\x2a\x04\x71\x81\xb4\x08\x70\x1d\x17\x69\xb1\x10\x21\x9e\xd3\xf2\x7b\xfe\x54\xe2\x39\xde\x6e\xe3\xac\x4c\x93\x02\xf9\x16\x37\x79\x76\x9b\x96\x69\x9e\x15\xc8\xef\x10\x67\x2f\x78\x48\xb3\xdb\x05\x88\x7d\x47\x16\xf4\x66\xec\xcc\xaf\x2d\x78\x8e\x91\x9a\x39\xb3\x82\xe8\x04\x60\xa7\x8f\x40\xce\x50\xcd\x3b\xae\xd1\x4b\xd5\x8e\xb2\x25\xb4\xfa\x95\xac\x62\xd5\xc2\x90\x1d\xd8\xcd\x8f\xe9\x20\x55\x23\x42\xf4\x3c\xb0\x97\xfe\x70\xf2\xdf\xa5\x22\x21\x42\x64\x79\x99\x9c\xd5\xbd\x1c\x1b\x1e\xab\xf3\x2b\x64\x5a\x9b\x08\xcf\xf4\xd9\x12\x7e\x8d\xce\x63\x60\x6b\xb5\x9d\xed\xe7\x56\x1e\xe6\x91\x5e\xc3\x79\xd9\xb2\x6a\x23\x11\x6f\xef\xe7\x00\x92\xf4\x31\xbe\x4f\xc4\xdd\x36\x7f\xc4\xa7\xbf\x7b\xb1\x89\xaf\x93\xcd\xb1\xed\xe7\xeb\xf1\xa7\x7d\x0b\x56\xd1\xea\xcb\xc5\x2a\x10\x7f\x02\x00\x00\xff\xff\xe6\x0b\x33\x5d\xcb\x02\x00\x00") + +func testImagesNginxNewDockerfileBytes() ([]byte, error) { + return bindataRead( + _testImagesNginxNewDockerfile, + "test/images/nginx-new/Dockerfile", + ) +} + +func testImagesNginxNewDockerfile() (*asset, error) { + bytes, err := testImagesNginxNewDockerfileBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "test/images/nginx-new/Dockerfile", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _testImagesNginxNewDockerfile_windows = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x64\x93\xd1\x6f\xa4\x36\x10\xc6\xdf\xfd\x57\x7c\x82\xe8\xd4\x4a\x0b\xec\xae\xda\xaa\x4d\x95\x07\x6e\x8f\x4b\xd1\xed\x41\x04\xe4\xd2\x55\x55\x45\x5e\x98\x05\x4b\x60\x53\xdb\x84\xdd\xff\xbe\x02\x12\x25\x51\x78\x40\x8c\xfd\x8d\xbf\xdf\xcc\x60\x17\x3b\xd5\x5f\xb4\xa8\x1b\x8b\xed\x7a\xbb\x41\xd1\x10\xbe\x0d\x47\xd2\x92\x2c\x19\x84\x83\x6d\x94\x36\x3e\x73\x99\x8b\xbd\x28\x49\x1a\xaa\x30\xc8\x8a\x34\x6c\x43\x08\x7b\x5e\x36\xf4\xb2\xb3\xc2\x0f\xd2\x46\x28\x89\xad\xbf\xc6\x4f\x93\xc0\x79\xde\x72\x7e\xfe\x93\xb9\xb8\xa8\x01\x1d\xbf\x40\x2a\x8b\xc1\x10\x6c\x23\x0c\x4e\xa2\x25\xd0\xb9\xa4\xde\x42\x48\x94\xaa\xeb\x5b\xc1\x65\x49\x18\x85\x6d\x66\x9b\xe7\x43\x7c\xe6\xe2\xf0\x7c\x84\x3a\x5a\x2e\x24\x38\x4a\xd5\x5f\xa0\x4e\x6f\x75\xe0\x76\x06\x9e\x9e\xc6\xda\xfe\x3a\x08\xc6\x71\xf4\xf9\x0c\xeb\x2b\x5d\x07\xed\x22\x34\xc1\x3e\xde\x45\x49\x1e\x79\x5b\x7f\x3d\xa7\xdc\xcb\x96\x8c\x81\xa6\xff\x06\xa1\xa9\xc2\xf1\x02\xde\xf7\xad\x28\xf9\xb1\x25\xb4\x7c\x84\xd2\xe0\xb5\x26\xaa\x60\xd5\xc4\x3b\x6a\x61\x85\xac\x57\x30\xea\x64\x47\xae\x89\xb9\xa8\x84\xb1\x5a\x1c\x07\xfb\xae\x59\x2f\x74\xc2\xbc\x13\x28\x09\x2e\xe1\x84\x39\xe2\xdc\xc1\xe7\x30\x8f\xf3\x15\x73\xf1\x10\x17\x7f\xa5\xf7\x05\x1e\xc2\x2c\x0b\x93\x22\x8e\x72\xa4\x19\x76\x69\xf2\x25\x2e\xe2\x34\xc9\x91\x7e\x45\x98\x1c\xf0\x2d\x4e\xbe\xac\x40\xc2\x36\xa4\x41\xe7\x5e\x4f\xfc\x4a\x43\x4c\x6d\xa4\x6a\xea\x59\x4e\xf4\x0e\xe0\xa4\x16\x20\xd3\x53\x29\x4e\xa2\x44\xcb\x65\x3d\xf0\x9a\x50\xab\x27\xd2\x52\xc8\x1a\x3d\xe9\x4e\x98\x69\x98\x06\x5c\x56\xcc\x45\x2b\x3a\x61\xb9\x9d\x57\x3e\x14\xe5\x33\x16\x66\xb7\x13\x7d\x14\x7f\x0f\x6f\xa3\x39\xca\xa2\xdb\x38\x2f\xb2\xc3\x1c\xa4\xf9\xe3\x8f\x28\xcb\xe3\x34\x61\xec\x6b\x96\x7e\x47\xd9\xf2\xa1\x12\xc3\x91\xda\x21\x90\xb5\x90\xe7\xeb\x8d\xbf\xf9\xc3\xdf\x82\x1b\xcc\xb1\x67\xd4\xa0\x4b\x5a\xd4\x9e\xd7\xb7\xdc\x9e\x94\xee\x6e\x5a\x21\x87\x73\xc0\xbb\xea\xb7\x5f\x70\xf5\xe2\x11\x8c\x42\x56\x6a\x34\x9e\x21\xfd\x44\xba\x54\x9a\xbc\x72\x9a\xf7\xf5\xc6\x5f\x7b\x73\x8a\x37\xa7\x78\x57\xaf\x24\x93\xd5\x1b\x7d\x43\x6d\x4f\x7a\xf1\xbb\x7a\x2d\x85\xed\xd2\xbb\x03\x3c\xef\xa4\x55\x77\xf3\x96\x0c\x0b\x37\x82\xc1\xe8\xc0\x34\x5c\xd3\xb2\xc0\xd8\x7d\x1e\x65\xd8\x29\x39\xfd\xa3\xa4\xc3\xaa\x13\x72\x9a\x38\xb7\x4a\xb3\xe8\xef\xbb\x34\x8f\xf0\xfb\x9a\xed\xc3\xcf\xd1\x1e\xa2\xe3\x35\x3d\x3e\x2d\x37\xe7\xc6\xd9\xf8\x9b\x5f\xbd\x8d\xc3\xa2\xa4\xc8\x0e\x77\x69\x9c\x14\xf8\xc7\x09\x8e\x42\x06\xa6\x71\x56\x70\xbc\x72\x7a\xa3\xac\x3e\xd8\xe2\xd3\x27\xf8\xcb\xa7\x4f\x67\x72\xfe\x65\xff\x07\x00\x00\xff\xff\x46\x81\xde\x96\xdf\x03\x00\x00") + +func testImagesNginxNewDockerfile_windowsBytes() ([]byte, error) { + return bindataRead( + _testImagesNginxNewDockerfile_windows, + "test/images/nginx-new/Dockerfile_windows", + ) +} + +func testImagesNginxNewDockerfile_windows() (*asset, error) { + bytes, err := testImagesNginxNewDockerfile_windowsBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "test/images/nginx-new/Dockerfile_windows", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _testImagesNginxNewVersion = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x32\xd4\x33\x34\xd5\x35\xe4\x02\x04\x00\x00\xff\xff\x64\xb7\x77\xe3\x07\x00\x00\x00") + +func testImagesNginxNewVersionBytes() ([]byte, error) { + return bindataRead( + _testImagesNginxNewVersion, + "test/images/nginx-new/VERSION", + ) +} + +func testImagesNginxNewVersion() (*asset, error) { + bytes, err := testImagesNginxNewVersionBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "test/images/nginx-new/VERSION", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _testImagesNodePerfNpbEpBaseimage = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xca\xc9\xcc\x2b\xad\xd0\x4f\xcc\x4d\x31\x33\xb1\x4d\x49\x4d\xca\x4c\xcc\xb3\x2a\x2e\x29\x4a\x2d\x49\xce\xd0\x2d\xce\xc9\xcc\xe5\x82\xca\x17\xe5\x9a\x99\xd8\x82\xc9\x32\x0b\x7d\xdc\xea\x0a\x0a\x92\xcd\x4c\x72\x52\x6d\xa1\x34\x56\x95\x80\x00\x00\x00\xff\xff\x23\xf1\xf9\x99\x72\x00\x00\x00") + +func testImagesNodePerfNpbEpBaseimageBytes() ([]byte, error) { + return bindataRead( + _testImagesNodePerfNpbEpBaseimage, + "test/images/node-perf/npb-ep/BASEIMAGE", + ) +} + +func testImagesNodePerfNpbEpBaseimage() (*asset, error) { + bytes, err := testImagesNodePerfNpbEpBaseimageBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "test/images/node-perf/npb-ep/BASEIMAGE", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _testImagesNodePerfNpbEpDockerfile = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x54\x6d\x6f\xd3\x48\x17\xfd\x3e\xbf\xe2\x3c\x09\xaa\x00\xd5\x36\x2f\x8f\x10\xa2\xea\x4a\x6e\x12\xc0\x22\x75\xb2\x76\x0a\xaa\x96\x55\x34\xb6\xaf\xed\x59\xec\x19\x33\x33\x6e\x12\x10\xff\x7d\x35\x4e\x1a\xb5\xdd\x7e\x20\x52\xa4\xf1\x7d\x3d\x73\xe7\x9c\x3b\xc6\x44\x75\x3b\x2d\xaa\xda\xe2\xd5\x8b\x97\x6f\xb1\xaa\x09\x9f\xfa\x8c\xb4\x24\x4b\x06\x61\x6f\x6b\xa5\x8d\xcf\xc6\x6c\x8c\xb9\xc8\x49\x1a\x2a\xd0\xcb\x82\x34\x6c\x4d\x08\x3b\x9e\xd7\x74\xeb\x39\xc5\x67\xd2\x46\x28\x89\x57\xfe\x0b\x3c\x75\x01\xa3\x83\x6b\xf4\xec\x8c\x8d\xb1\x53\x3d\x5a\xbe\x83\x54\x16\xbd\x21\xd8\x5a\x18\x94\xa2\x21\xd0\x36\xa7\xce\x42\x48\xe4\xaa\xed\x1a\xc1\x65\x4e\xd8\x08\x5b\x0f\x6d\x0e\x45\x7c\x36\xc6\xf5\xa1\x84\xca\x2c\x17\x12\x1c\xb9\xea\x76\x50\xe5\xdd\x38\x70\x3b\x00\x76\xbf\xda\xda\xee\x5d\x10\x6c\x36\x1b\x9f\x0f\x60\x7d\xa5\xab\xa0\xd9\x07\x9a\x60\x1e\x4d\x66\x71\x3a\xf3\x5e\xf9\x2f\x86\x94\x2b\xd9\x90\x31\xd0\xf4\xbd\x17\x9a\x0a\x64\x3b\xf0\xae\x6b\x44\xce\xb3\x86\xd0\xf0\x0d\x94\x06\xaf\x34\x51\x01\xab\x1c\xde\x8d\x16\x56\xc8\xea\x14\x46\x95\x76\xc3\x35\xb1\x31\x0a\x61\xac\x16\x59\x6f\xef\x0d\xeb\x16\x9d\x30\xf7\x02\x94\x04\x97\x18\x85\x29\xa2\x74\x84\x8b\x30\x8d\xd2\x53\x36\xc6\x97\x68\xf5\x71\x71\xb5\xc2\x97\x30\x49\xc2\x78\x15\xcd\x52\x2c\x12\x4c\x16\xf1\x34\x5a\x45\x8b\x38\xc5\xe2\x3d\xc2\xf8\x1a\x9f\xa2\x78\x7a\x0a\x12\xb6\x26\x0d\xda\x76\xda\xe1\x57\x1a\xc2\x8d\x91\x0a\x37\xb3\x94\xe8\x1e\x80\x52\xed\x01\x99\x8e\x72\x51\x8a\x1c\x0d\x97\x55\xcf\x2b\x42\xa5\x6e\x48\x4b\x21\x2b\x74\xa4\x5b\x61\xdc\x63\x1a\x70\x59\xb0\x31\x1a\xd1\x0a\xcb\xed\x60\xf9\xcf\xa5\x7c\xc6\xc2\xe4\x83\x43\x3f\x8b\x2e\xc3\x0f\x33\xf6\x3e\x59\x5c\xe2\xc9\xf1\x1b\xdc\x20\xeb\x45\x53\xac\xa5\x2a\x68\xdd\x91\x2e\xd7\xb2\xcb\xd6\xd4\x31\x36\x49\x16\x69\xba\xbe\xb8\x8a\xe6\xd3\xf5\x64\xb1\xbc\xc6\x77\x6a\x7b\xef\xcf\xd9\xe5\x55\x98\x4c\x3e\x7a\xc6\x35\xcd\x11\xf4\x46\x07\x99\x90\x01\x63\xc9\x55\x0c\xde\x59\xaf\x22\x8b\xbe\x2b\xb8\x25\x9c\x9c\x1c\x2d\x42\x1a\xcb\x9b\x06\xde\x6e\xdf\xd1\x23\x63\x48\x5a\xc1\x1b\x54\xa5\xd2\x56\x73\xc9\x58\x38\x9d\xde\xa5\x86\xe4\xc6\xfd\xb9\x5f\xa9\x9b\x80\x1b\x43\xd6\x04\xb2\xcb\x82\x78\x79\xf1\xda\x7f\xed\xbf\xf4\x2d\xd7\x7e\xf5\x03\xfe\xd0\xdb\x72\x8d\xed\x8f\x12\x0f\xbc\x8c\x7d\x59\x24\x9f\xa6\x51\x02\xff\x98\x78\x38\x78\x8b\xcb\xe5\x90\x2a\x4a\xfc\x85\x27\x4f\xb9\xce\xeb\x67\xf8\xdf\x39\x46\xdb\xb7\x6f\xd6\x6f\xfe\x3f\xc2\xdf\x67\x6e\x9c\x12\x5f\x99\x63\xad\x53\x99\x09\xbc\x36\x6f\x55\x41\xcd\x79\x4b\x85\xe8\xdb\x20\xa8\x90\x2b\x59\x8a\x2a\x88\xc3\xd4\x37\xbc\xed\x1a\x32\x41\xcb\xbf\x91\x5f\x50\xe9\x57\x79\xbe\xde\xbe\x7d\x83\x3f\x6e\xa3\x6e\x3d\x67\xf8\xca\xa8\x31\x74\x28\x9e\x77\xbf\x55\xe6\x91\x22\xa5\x18\x2e\xe1\x4c\x98\x2d\x31\x99\x87\x69\x7a\x3e\x65\x6c\xbf\x46\x1c\x6d\x1c\x25\x8e\xe2\x69\x44\xa6\xb9\x16\x64\xf0\xd4\xd4\xdc\x59\x54\xf6\x0f\xe5\x76\x90\xbc\x79\xe6\x04\xe4\xf4\x2b\x6f\x48\x0a\x92\x16\x8d\xca\x07\x7e\xc1\x28\xd8\x9a\x5b\x08\x8b\x9c\x4b\x64\xe4\x54\x2e\xa8\x80\x90\xd6\xb9\x9c\xc6\x5a\x3e\x2c\x0b\xe9\xd6\x00\x69\xa7\xc4\x81\xd2\x94\x2b\x59\xec\x1f\x1e\xc6\xf2\x8a\xf6\x4f\xd6\x7e\x2b\x84\x86\xd7\x21\x68\x44\xe6\x0d\x3b\xe3\xe4\x04\xa5\x90\xc5\x9e\x58\x8d\xc8\xe0\x49\xde\x12\x46\xcf\x7d\xa3\xfc\xe7\x23\x78\xb4\xa5\xdc\x0d\xeb\xe7\xaf\x3b\x59\x5f\xcf\xd8\x43\x6e\x33\x36\xb0\xd6\xf3\x4a\xad\xda\xf3\xc7\x59\x8e\xc7\x18\x31\xd0\x99\x3a\x7f\xea\x6f\x11\xfc\x56\x91\x23\x8c\xe3\x89\xcd\xe2\xcf\x98\x4f\xd7\xf3\xe8\x22\x09\x93\xeb\xf5\x32\x5c\x7d\x3c\x1f\x3d\xf9\xf9\xc0\xf4\xeb\xdd\x31\x63\xc4\xd8\x2c\x5e\x25\xd7\xcb\x45\x14\xaf\x70\xe8\xcf\xfe\x0d\x00\x00\xff\xff\xc8\xdd\xe0\xa9\x0a\x06\x00\x00") + +func testImagesNodePerfNpbEpDockerfileBytes() ([]byte, error) { return bindataRead( _testImagesNodePerfNpbEpDockerfile, "test/images/node-perf/npb-ep/Dockerfile", @@ -5241,7 +5837,7 @@ func testImagesNodePerfTfWideDeepBaseimage() (*asset, error) { return a, nil } -var _testImagesNodePerfTfWideDeepDockerfile = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x84\x92\x51\x6f\x9c\x38\x14\x85\xdf\xfd\x2b\x8e\x32\x51\xd4\xac\x02\xa4\xd1\x6a\xb5\x9b\x3c\xd1\x09\xed\xa0\x24\x90\x05\xa6\xd1\x48\x95\x22\x0f\x5c\xc0\x12\xd8\xae\x6d\x42\xe8\xaf\x5f\x31\x99\x64\x36\xdb\x4a\xcb\x93\xaf\xef\x39\x87\xcf\xd7\x5e\x60\xa9\xf4\x64\x44\xd3\x3a\x5c\x9c\x7f\xfc\x13\x45\x4b\xb8\x19\xb6\x64\x24\x39\xb2\x08\x07\xd7\x2a\x63\x7d\xb6\x60\x0b\xdc\x8a\x92\xa4\xa5\x0a\x83\xac\xc8\xc0\xb5\x84\x50\xf3\xb2\xa5\xd7\xce\x19\xbe\x92\xb1\x42\x49\x5c\xf8\xe7\xf8\x30\x0b\x8e\xf6\xad\xa3\xd3\x2b\xb6\xc0\xa4\x06\xf4\x7c\x82\x54\x0e\x83\x25\xb8\x56\x58\xd4\xa2\x23\xd0\x73\x49\xda\x41\x48\x94\xaa\xd7\x9d\xe0\xb2\x24\x8c\xc2\xb5\xbb\xdf\xec\x43\x7c\xb6\xc0\x66\x1f\xa1\xb6\x8e\x0b\x09\x8e\x52\xe9\x09\xaa\xfe\xb7\x0e\xdc\xed\x80\xe7\xaf\x75\x4e\x5f\x06\xc1\x38\x8e\x3e\xdf\xc1\xfa\xca\x34\x41\xf7\x22\xb4\xc1\x6d\xbc\x8c\x92\x3c\xf2\x2e\xfc\xf3\x9d\x65\x2d\x3b\xb2\x16\x86\xbe\x0f\xc2\x50\x85\xed\x04\xae\x75\x27\x4a\xbe\xed\x08\x1d\x1f\xa1\x0c\x78\x63\x88\x2a\x38\x35\xf3\x8e\x46\x38\x21\x9b\x33\x58\x55\xbb\x91\x1b\x62\x0b\x54\xc2\x3a\x23\xb6\x83\x7b\x37\xac\x57\x3a\x61\xdf\x09\x94\x04\x97\x38\x0a\x73\xc4\xf9\x11\x3e\x85\x79\x9c\x9f\xb1\x05\x1e\xe2\x62\x95\xae\x0b\x3c\x84\x59\x16\x26\x45\x1c\xe5\x48\x33\x2c\xd3\xe4\x3a\x2e\xe2\x34\xc9\x91\x7e\x46\x98\x6c\x70\x13\x27\xd7\x67\x20\xe1\x5a\x32\xa0\x67\x6d\x66\x7e\x65\x20\xe6\x31\x52\x35\xcf\x2c\x27\x7a\x07\x50\xab\x17\x20\xab\xa9\x14\xb5\x28\xd1\x71\xd9\x0c\xbc\x21\x34\xea\x89\x8c\x14\xb2\x81\x26\xd3\x0b\x3b\x5f\xa6\x05\x97\x15\x5b\xa0\x13\xbd\x70\xdc\xed\x76\x7e\x3a\x94\xcf\x58\x98\x7d\x99\xe9\xa3\xf8\x2e\xfc\x12\xb1\xcf\x59\x7a\x87\xe3\x43\xcd\x96\x59\x9a\xe7\x8f\x9f\xd6\xf1\xed\xf5\xe3\x32\xbd\xdf\xe0\x3b\xf5\x83\xf7\x77\x74\xb7\x0e\xb3\xe5\xca\xb3\x73\x74\x89\x60\xb0\x26\xd8\x0a\x19\x30\x96\xad\x13\x70\xed\xbc\x86\x1c\x06\x5d\x71\x47\x38\x39\x79\xdb\x11\xd2\x3a\xde\x75\xf0\x26\x8c\x73\xed\x44\x4f\x2f\x9e\x92\x5b\xc2\xf1\x87\x41\xf2\x9e\xe0\xf5\xa7\xf3\x25\x7d\x63\xf3\x5b\xe0\xdc\x94\xed\x1f\xbf\x9f\xee\x4b\x40\x0b\xfd\x16\xe4\x48\x5a\x65\xea\x4e\x8d\xde\x5e\x77\xf5\xa6\xbb\x7a\x5d\xfe\xf6\x7f\xde\x5f\x78\xc8\xf2\xf2\x85\x6c\x07\x3a\x3f\x48\x7b\x19\x04\x8d\x70\xed\xb0\xf5\x4b\xd5\x07\x07\x7b\xd0\xab\x8a\x3a\x1b\xcc\x00\xe2\x89\x82\xa7\x8f\xfe\x5f\xfe\xb9\xef\xb8\xf1\x9b\x1f\xf8\xc6\x4e\x4e\xe0\xb8\xc1\xf3\x8f\x1a\xbf\x68\x99\x1e\xde\x7f\x1a\x8c\x3d\xa4\xd9\xcd\x75\x9c\xe1\x78\x95\xde\x45\xfb\x7c\x6f\x27\x09\x54\x5d\x8b\x52\xf0\x2e\x18\x45\x45\x8f\x15\x91\x66\x51\xf2\x15\xf7\x9b\x62\x95\x26\xf7\x61\xb1\xc2\xf1\x61\x7d\xf9\x73\x00\x63\x51\x52\x64\x9b\xfb\x34\x4e\x0a\xe8\xc9\xb5\x4a\xc2\x3f\x84\xf9\x7a\x62\xff\x04\x00\x00\xff\xff\xcb\x15\x24\x20\x61\x04\x00\x00") +var _testImagesNodePerfTfWideDeepDockerfile = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x84\x92\x51\x4f\xdc\x38\x14\x85\xdf\xfd\x2b\x8e\x18\x84\xca\x8a\x24\x14\xad\x56\xbb\xa0\x7d\x48\x87\xb4\x13\x01\x09\x9b\x64\x8a\x46\xaa\x84\x3c\xc9\x4d\x62\x29\xb1\x5d\xdb\x21\xa4\xbf\x7e\x95\x61\x80\x65\x8b\xd4\x3c\xf9\xfa\x9e\x73\xf2\xf9\xda\x0b\x2c\x95\x9e\x8c\x68\x5a\x87\xb3\xd3\x8f\x7f\xa2\x68\x09\x57\xc3\x96\x8c\x24\x47\x16\xe1\xe0\x5a\x65\xac\xcf\x16\x6c\x81\x6b\x51\x92\xb4\x54\x61\x90\x15\x19\xb8\x96\x10\x6a\x5e\xb6\xf4\xdc\x39\xc1\x57\x32\x56\x28\x89\x33\xff\x14\x1f\x66\xc1\xc1\xbe\x75\x70\x7c\xc1\x16\x98\xd4\x80\x9e\x4f\x90\xca\x61\xb0\x04\xd7\x0a\x8b\x5a\x74\x04\x7a\x2c\x49\x3b\x08\x89\x52\xf5\xba\x13\x5c\x96\x84\x51\xb8\x76\xf7\x9b\x7d\x88\xcf\x16\xd8\xec\x23\xd4\xd6\x71\x21\xc1\x51\x2a\x3d\x41\xd5\xff\xd5\x81\xbb\x1d\xf0\xfc\xb5\xce\xe9\xf3\x20\x18\xc7\xd1\xe7\x3b\x58\x5f\x99\x26\xe8\x9e\x84\x36\xb8\x8e\x97\x51\x92\x47\xde\x99\x7f\xba\xb3\xac\x65\x47\xd6\xc2\xd0\xf7\x41\x18\xaa\xb0\x9d\xc0\xb5\xee\x44\xc9\xb7\x1d\xa1\xe3\x23\x94\x01\x6f\x0c\x51\x05\xa7\x66\xde\xd1\x08\x27\x64\x73\x02\xab\x6a\x37\x72\x43\x6c\x81\x4a\x58\x67\xc4\x76\x70\x6f\x86\xf5\x4c\x27\xec\x1b\x81\x92\xe0\x12\x07\x61\x8e\x38\x3f\xc0\xa7\x30\x8f\xf3\x13\xb6\xc0\x5d\x5c\xac\xd2\x75\x81\xbb\x30\xcb\xc2\xa4\x88\xa3\x1c\x69\x86\x65\x9a\x5c\xc6\x45\x9c\x26\x39\xd2\xcf\x08\x93\x0d\xae\xe2\xe4\xf2\x04\x24\x5c\x4b\x06\xf4\xa8\xcd\xcc\xaf\x0c\xc4\x3c\x46\xaa\xe6\x99\xe5\x44\x6f\x00\x6a\xf5\x04\x64\x35\x95\xa2\x16\x25\x3a\x2e\x9b\x81\x37\x84\x46\x3d\x90\x91\x42\x36\xd0\x64\x7a\x61\xe7\xcb\xb4\xe0\xb2\x62\x0b\x74\xa2\x17\x8e\xbb\xdd\xce\x4f\x87\xf2\x19\x0b\xb3\x2f\x33\x7d\x14\xdf\x84\x5f\x22\xf6\x39\x4b\x6f\x70\xf8\x5a\xb3\x65\x96\xe6\xf9\xfd\xa7\x75\x7c\x7d\x79\xbf\x4c\x6f\x37\xf8\x4e\xfd\xe0\xfd\x13\xdd\xac\xc3\x6c\xb9\xf2\xec\x1c\x5d\x22\x18\xac\x09\xb6\x42\x06\x8c\x65\xeb\x04\x5c\x3b\xaf\x21\x87\x41\x57\xdc\x11\x8e\x8e\x5e\x76\x84\xb4\x8e\x77\x1d\xbc\x09\xe3\x5c\x3b\xd1\xd3\x93\xa7\xe4\x96\x70\xf8\x61\x90\xbc\x27\x78\xfd\xf1\x7c\x49\xdf\xd8\xfc\x16\x38\x37\x65\xfb\xc7\xef\xc7\xfb\x12\xd0\x42\xbf\x04\x39\x92\x56\x99\xba\x53\xa3\xb7\xd7\x5d\xbc\xe8\x2e\x9e\x97\xbf\xfd\xca\xfb\x8e\x87\x2c\x2f\x9f\xc8\x76\xa0\xf3\x83\xb4\xe7\x41\xd0\x08\xd7\x0e\x5b\xbf\x54\x7d\xf0\x6a\x0f\x7a\x55\x51\x67\x83\x19\x40\x3c\x50\xf0\xf0\xd1\xff\xcb\x3f\xf5\x1d\x37\x7e\xf3\x03\xdf\xd8\xd1\x11\x1c\x37\x78\xfc\x51\xe3\x9d\x96\xe9\xe1\xfd\xaf\xc1\xd8\x5d\x9a\x5d\x5d\xc6\x19\x0e\x57\xe9\x4d\xb4\xcf\xf7\x76\x92\x40\xd5\xb5\x28\x05\xef\x82\x51\x54\x74\x5f\x11\x69\x16\x25\x5f\x71\xbb\x29\x56\x69\x72\x1b\x16\xab\xbf\x0f\x5f\xd7\xe7\x3f\x07\x30\x16\x25\x45\xb6\xb9\x4d\xe3\xa4\x80\x9e\x5c\xab\x24\xfc\xd7\x30\x5f\x4f\xec\xdf\x00\x00\x00\xff\xff\xa4\xac\x78\xf2\x61\x04\x00\x00") func testImagesNodePerfTfWideDeepDockerfileBytes() ([]byte, error) { return bindataRead( @@ -5381,7 +5977,7 @@ func testImagesNonewprivsOwners() (*asset, error) { return a, nil } -var _testImagesNonewprivsVersion = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x32\xd4\x33\xe2\x02\x04\x00\x00\xff\xff\x5d\x96\xa5\x56\x04\x00\x00\x00") +var _testImagesNonewprivsVersion = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x32\xd4\x33\xe6\x02\x04\x00\x00\xff\xff\x1c\xa7\xbe\x4f\x04\x00\x00\x00") func testImagesNonewprivsVersionBytes() ([]byte, error) { return bindataRead( @@ -5421,7 +6017,7 @@ func testImagesNonewprivsNnpGo() (*asset, error) { return a, nil } -var _testImagesNonrootBaseimage = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\xcf\xd1\xaa\x83\x30\x0c\xc6\xf1\x7b\xdf\xc5\x36\xa2\x88\x15\x7c\x98\x5a\x7b\x0e\x65\xa6\x91\x64\x53\x1f\x7f\xe8\xf4\xc2\x89\xc3\xeb\xef\xf7\x6f\x49\x1f\xe2\x6b\xd6\x16\xbb\xb2\x68\x1e\x95\xa8\x7f\xc7\x2a\x90\xee\x7c\x1b\x6c\x4c\x5b\x2b\x3e\x5d\xc7\x7a\xcc\x14\x28\x48\x36\xcf\x78\xa9\x19\x4f\xf6\xc7\xdb\xcb\x78\xf4\xc3\xe0\xca\xa2\xf7\x57\xc5\x36\x1f\x1b\xc9\x0d\xcc\x57\xc5\x3a\xee\x7e\x0a\xb1\xa3\x49\x3e\x17\xeb\xac\x02\xd3\xa0\x63\x85\xc1\x31\x09\xfd\x3d\x95\x23\xd4\x3b\x8a\x36\x92\x78\x1e\x3d\xd7\x8b\xfc\x8e\x0d\xe4\x37\x63\x03\xf9\x39\xbe\xfb\xb3\x01\x93\xbc\x03\x00\x00\xff\xff\xa4\xbc\x2b\x7d\xa7\x01\x00\x00") +var _testImagesNonrootBaseimage = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\xcf\xcd\xae\x83\x20\x10\x86\xe1\xbd\xf7\x22\x8c\x3f\x31\x62\xe2\xde\xdb\x40\xe4\x9c\x90\x0a\x98\x99\x56\xbd\xfc\x46\xab\x0b\x4b\x6c\x58\x7f\xef\xc3\x84\xd1\xb8\xd7\xca\xa5\x1d\xaa\xb2\x7d\xd4\xc4\xfe\x15\x32\xe3\xf9\xa0\x7b\x23\x5d\xda\x4b\xd2\xe9\x3e\x36\x73\xc6\x80\x41\x72\xf4\x68\x6f\x6b\xb4\x41\xfb\xe3\xed\x6d\xbc\xf6\xd3\xa4\xaa\x72\xd4\x77\xe2\x98\xaf\x86\x0a\x01\xeb\x9d\xd8\xc7\xb3\x5f\x8c\x1b\xfc\x42\x9f\x1f\xf3\xac\x06\xd1\x5a\x85\xcc\x1a\x85\x9e\xfc\xdf\x93\x29\x6f\xf9\x19\x39\xe9\x3c\x69\x9c\x35\x36\x5b\xf9\x8d\x05\x14\x91\x58\x40\x11\xe2\xd8\xcb\x22\xb8\x9c\x03\x94\x71\x78\x2b\x03\xdc\xe5\xb1\xb8\xcb\x93\x77\x00\x00\x00\xff\xff\x59\x4c\xe5\x82\x21\x02\x00\x00") func testImagesNonrootBaseimageBytes() ([]byte, error) { return bindataRead( @@ -5521,7 +6117,67 @@ func testImagesNonrootVersion() (*asset, error) { return a, nil } -var _testImagesPetsPeerFinderBaseimage = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x4a\xcc\x4d\x31\x33\xb1\xcd\xb6\x28\xd6\x4b\x4f\x2e\xd2\xcb\xcc\xd7\x4f\x49\x4d\xca\x4c\xcc\xd3\x4d\x4a\x2c\x4e\xd5\x05\x4b\x5a\x19\xe8\x99\xe8\x19\x72\x25\x16\xe5\xe2\x54\x56\x94\x8b\x50\x84\xc7\x34\x90\x24\x54\x61\x41\x41\xb2\x99\x49\x4e\x2a\x2e\xa5\x50\x69\xa8\xe2\x62\x63\x4b\x83\x0a\x5c\x4a\xc1\x92\x50\x85\x80\x00\x00\x00\xff\xff\x82\x15\xeb\x61\xcd\x00\x00\x00") +var _testImagesPerlBaseimage = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xca\xc9\xcc\x2b\xad\xd0\x4f\xcc\x4d\x31\x33\xb1\x2d\x48\x2d\xca\xb1\x32\xd5\x33\x32\xe3\x82\x8a\x16\xe5\xda\x26\x16\xe5\x1a\x1b\x95\x99\xeb\x63\x91\x33\x33\xb1\x05\x93\x65\x16\x18\xb2\x05\x05\xc9\x66\x26\x39\xa9\xb6\x50\x1a\x43\xbe\xd8\xd8\xd2\xa0\xc2\x16\x4c\x22\xc9\x01\x02\x00\x00\xff\xff\xf4\x11\xb6\x20\x8c\x00\x00\x00") + +func testImagesPerlBaseimageBytes() ([]byte, error) { + return bindataRead( + _testImagesPerlBaseimage, + "test/images/perl/BASEIMAGE", + ) +} + +func testImagesPerlBaseimage() (*asset, error) { + bytes, err := testImagesPerlBaseimageBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "test/images/perl/BASEIMAGE", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _testImagesPerlDockerfile = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x64\x92\x51\x6f\x9b\x3e\x14\xc5\xdf\xfd\x29\x8e\xe0\x2f\xfd\x5b\x29\x23\x5d\xa4\xed\xa1\xd3\x1e\x68\x4b\x3b\xd4\x14\xa4\x40\x17\xf5\x69\x32\x70\x03\x77\x02\xdb\xb3\x4d\x69\xbe\xfd\x44\x92\x6a\x8b\xe6\x37\xfb\x9e\x7b\xee\xcf\xc7\x0e\x71\xab\xcd\xde\x72\xdb\x79\xac\xae\x56\x1f\x51\x76\x84\xc7\xb1\x22\xab\xc8\x93\x43\x3c\xfa\x4e\x5b\x17\x89\x50\x84\x58\x73\x4d\xca\x51\x83\x51\x35\x64\xe1\x3b\x42\x6c\x64\xdd\xd1\x7b\x65\x81\xef\x64\x1d\x6b\x85\x55\x74\x85\x8b\x59\x10\x9c\x4a\xc1\xe5\x17\x11\x62\xaf\x47\x0c\x72\x0f\xa5\x3d\x46\x47\xf0\x1d\x3b\xec\xb8\x27\xd0\x5b\x4d\xc6\x83\x15\x6a\x3d\x98\x9e\xa5\xaa\x09\x13\xfb\xee\x30\xe6\x64\x12\x89\x10\x2f\x27\x0b\x5d\x79\xc9\x0a\x12\xb5\x36\x7b\xe8\xdd\xdf\x3a\x48\x7f\x00\x9e\x57\xe7\xbd\xb9\x5e\x2e\xa7\x69\x8a\xe4\x01\x36\xd2\xb6\x5d\xf6\x47\xa1\x5b\xae\xd3\xdb\x24\x2b\x92\x0f\xab\xe8\xea\xd0\xf2\xac\x7a\x72\x0e\x96\x7e\x8d\x6c\xa9\x41\xb5\x87\x34\xa6\xe7\x5a\x56\x3d\xa1\x97\x13\xb4\x85\x6c\x2d\x51\x03\xaf\x67\xde\xc9\xb2\x67\xd5\x2e\xe0\xf4\xce\x4f\xd2\x92\x08\xd1\xb0\xf3\x96\xab\xd1\x9f\x85\xf5\x4e\xc7\xee\x4c\xa0\x15\xa4\x42\x10\x17\x48\x8b\x00\x37\x71\x91\x16\x0b\x11\x62\x9b\x96\xdf\xf2\xe7\x12\xdb\x78\xb3\x89\xb3\x32\x4d\x0a\xe4\x1b\xdc\xe6\xd9\x5d\x5a\xa6\x79\x56\x20\xbf\x47\x9c\xbd\xe0\x31\xcd\xee\x16\x20\xf6\x1d\x59\xd0\x9b\xb1\x33\xbf\xb6\xe0\x39\x46\x6a\xe6\xcc\x0a\xa2\x33\x80\x9d\x3e\x02\x39\x43\x35\xef\xb8\x46\x2f\x55\x3b\xca\x96\xd0\xea\x57\xb2\x8a\x55\x0b\x43\x76\x60\x37\x3f\xa6\x83\x54\x8d\x08\xd1\xf3\xc0\x5e\xfa\xc3\xc9\x3f\x97\x8a\x84\x08\x91\xe5\x65\x72\x51\xf7\x72\x6c\x78\xac\x2e\xaf\x91\x69\x6d\x22\x6c\xe9\x7f\x4b\xf8\x39\x3a\x8f\x81\xad\xd5\x76\xb6\x9f\x5b\x79\x98\x47\x7a\x0d\xe7\x65\xcb\xaa\x8d\x44\xbc\x79\x98\x03\x48\xd2\xa7\xf8\x21\x11\xf7\x9b\xfc\x09\xff\xfd\xd9\x8b\x75\x7c\x93\xac\x8f\x6d\x3f\x5e\x8f\x3f\xed\x6b\xf0\x29\x5a\x7d\x0e\xc4\xef\x00\x00\x00\xff\xff\xb8\x29\x58\x16\xc9\x02\x00\x00") + +func testImagesPerlDockerfileBytes() ([]byte, error) { + return bindataRead( + _testImagesPerlDockerfile, + "test/images/perl/Dockerfile", + ) +} + +func testImagesPerlDockerfile() (*asset, error) { + bytes, err := testImagesPerlDockerfileBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "test/images/perl/Dockerfile", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _testImagesPerlVersion = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x32\xd5\x33\x32\xe3\x02\x04\x00\x00\xff\xff\x73\x51\x28\xa1\x05\x00\x00\x00") + +func testImagesPerlVersionBytes() ([]byte, error) { + return bindataRead( + _testImagesPerlVersion, + "test/images/perl/VERSION", + ) +} + +func testImagesPerlVersion() (*asset, error) { + bytes, err := testImagesPerlVersionBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "test/images/perl/VERSION", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _testImagesPetsPeerFinderBaseimage = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xca\xc9\xcc\x2b\xad\xd0\x4f\xcc\x4d\x31\x33\xb1\xcd\xb6\x28\xd6\x4b\x4f\x2e\xd2\xcb\xcc\xd7\x4f\x49\x4d\xca\x4c\xcc\xd3\x4d\x4a\x2c\x4e\xd5\x05\x4b\x5a\x19\xe8\x99\xe8\x19\x72\x41\x95\x17\xe5\xe2\x54\x5c\x94\x8b\xae\x14\x8f\xc9\x20\x49\x14\xe5\x05\x05\xc9\x66\x26\x39\xa9\xb8\x34\x40\xa5\x51\xb4\x14\x1b\x5b\x1a\x54\xe0\xd2\x00\x96\x84\x2a\x07\x04\x00\x00\xff\xff\x71\x77\xcf\xba\xeb\x00\x00\x00") func testImagesPetsPeerFinderBaseimageBytes() ([]byte, error) { return bindataRead( @@ -5581,7 +6237,7 @@ func testImagesPetsPeerFinderMakefile() (*asset, error) { return a, nil } -var _testImagesPetsPeerFinderVersion = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x32\xd4\x33\xe1\x02\x04\x00\x00\xff\xff\xdb\x31\xff\x00\x04\x00\x00\x00") +var _testImagesPetsPeerFinderVersion = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x32\xd4\x33\xe5\x02\x04\x00\x00\xff\xff\x9a\x00\xe4\x19\x04\x00\x00\x00") func testImagesPetsPeerFinderVersionBytes() ([]byte, error) { return bindataRead( @@ -5681,7 +6337,7 @@ func testImagesPetsRedisInstallerMakefile() (*asset, error) { return a, nil } -var _testImagesPetsRedisInstallerVersion = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x32\xd4\x33\xe1\x02\x04\x00\x00\xff\xff\xdb\x31\xff\x00\x04\x00\x00\x00") +var _testImagesPetsRedisInstallerVersion = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x32\xd4\x33\xe5\x02\x04\x00\x00\xff\xff\x9a\x00\xe4\x19\x04\x00\x00\x00") func testImagesPetsRedisInstallerVersionBytes() ([]byte, error) { return bindataRead( @@ -5801,7 +6457,7 @@ func testImagesPetsZookeeperInstallerMakefile() (*asset, error) { return a, nil } -var _testImagesPetsZookeeperInstallerVersion = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x32\xd4\x33\xe1\x02\x04\x00\x00\xff\xff\xdb\x31\xff\x00\x04\x00\x00\x00") +var _testImagesPetsZookeeperInstallerVersion = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x32\xd4\x33\xe5\x02\x04\x00\x00\xff\xff\x9a\x00\xe4\x19\x04\x00\x00\x00") func testImagesPetsZookeeperInstallerVersionBytes() ([]byte, error) { return bindataRead( @@ -5841,7 +6497,7 @@ func testImagesPetsZookeeperInstallerInstallSh() (*asset, error) { return a, nil } -var _testImagesPetsZookeeperInstallerOnStartSh = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x57\x61\x6f\xdb\x38\x12\xfd\xae\x5f\xf1\x56\x36\xd0\xa4\x17\xcb\x49\x7a\x77\x08\xdc\x3a\x38\x37\x71\x77\x8d\xb6\xc9\x22\x4e\xb7\x28\x82\xa0\xa0\xa5\xb1\xc5\x2d\x45\xaa\x24\x15\xc7\xcd\xfa\xbf\x1f\x86\x92\x6c\x27\xb7\xdd\xc3\x02\x4d\xbe\x58\x12\x39\x9c\x79\xf3\xe6\xcd\xb0\xf3\x13\xfa\x33\xa9\xfb\x33\xe1\xf2\x28\xea\xe0\xcc\x94\x2b\x2b\x17\xb9\xc7\xf1\xe1\xd1\xbf\x71\x9d\x13\xde\x56\x33\xb2\x9a\x3c\x39\x8c\x2a\x9f\x1b\xeb\x92\xa8\x13\x75\xf0\x4e\xa6\xa4\x1d\x65\xa8\x74\x46\x16\x3e\x27\x8c\x4a\x91\xe6\xd4\x7e\x39\xc0\x6f\x64\x9d\x34\x1a\xc7\xc9\x21\xf6\x78\x41\xdc\x7c\x8a\xf7\x5f\x46\x1d\xac\x4c\x85\x42\xac\xa0\x8d\x47\xe5\x08\x3e\x97\x0e\x73\xa9\x08\x74\x9f\x52\xe9\x21\x35\x52\x53\x94\x4a\x0a\x9d\x12\x96\xd2\xe7\xe1\x98\xc6\x48\x12\x75\xf0\xa9\x31\x61\x66\x5e\x48\x0d\x81\xd4\x94\x2b\x98\xf9\xee\x3a\x08\x1f\x1c\xe6\xbf\xdc\xfb\x72\xd0\xef\x2f\x97\xcb\x44\x04\x67\x13\x63\x17\x7d\x55\x2f\x74\xfd\x77\x93\xb3\xf1\xc5\x74\xdc\x3b\x4e\x0e\xc3\x96\x0f\x5a\x91\x73\xb0\xf4\xb5\x92\x96\x32\xcc\x56\x10\x65\xa9\x64\x2a\x66\x8a\xa0\xc4\x12\xc6\x42\x2c\x2c\x51\x06\x6f\xd8\xdf\xa5\x95\x5e\xea\xc5\x01\x9c\x99\xfb\xa5\xb0\x14\x75\x90\x49\xe7\xad\x9c\x55\xfe\x11\x58\xad\x77\xd2\x3d\x5a\x60\x34\x84\x46\x3c\x9a\x62\x32\x8d\xf1\x7a\x34\x9d\x4c\x0f\xa2\x0e\x3e\x4e\xae\x7f\xb9\xfc\x70\x8d\x8f\xa3\xab\xab\xd1\xc5\xf5\x64\x3c\xc5\xe5\x15\xce\x2e\x2f\xce\x27\xd7\x93\xcb\x8b\x29\x2e\xdf\x60\x74\xf1\x09\x6f\x27\x17\xe7\x07\x20\xe9\x73\xb2\xa0\xfb\xd2\xb2\xff\xc6\x42\x32\x8c\x94\x31\x66\x53\xa2\x47\x0e\xcc\x4d\xed\x90\x2b\x29\x95\x73\x99\x42\x09\xbd\xa8\xc4\x82\xb0\x30\x77\x64\xb5\xd4\x0b\x94\x64\x0b\xe9\x38\x99\x0e\x42\x67\x51\x07\x4a\x16\xd2\x0b\x1f\xde\xfc\x4f\x50\x49\x14\x39\xf2\xe8\x91\x41\x29\x4b\x9a\x0b\xa9\x98\x5d\xd7\x9c\x60\x97\x5a\x59\x7a\xa4\x46\xcf\xe5\xa2\xb2\xe4\xf0\xcd\x98\x2f\x44\x25\x59\xa4\xaa\x72\x9e\x2c\x0a\x2a\x66\x64\xe1\x72\x59\x06\xf7\xee\x1a\x22\x99\xf9\x76\x71\xd4\xc1\xe9\x10\x2f\x92\x7f\x25\x87\x09\x26\x1e\x2e\x37\x95\xca\x02\x99\x66\xc4\x7c\xca\xb6\x8c\x31\xba\x97\xe6\x42\x2f\x28\x71\x79\xeb\x80\xd4\x35\xe1\xe8\x5e\x14\xa5\x0a\x6c\x1a\x39\x3e\x61\x54\x5a\xa9\x7a\x81\xff\xd2\xe1\x45\xf2\xcf\xe4\x84\x7f\xb0\x1d\x25\x3c\x39\x0f\xe7\x39\xff\x09\x87\xf4\xda\xf8\x1c\x7d\x53\x7a\x86\x05\x7d\x5f\x94\xfd\x6d\x38\xc2\x12\x84\x73\x55\x51\xd3\x63\x46\xb8\x33\xaa\x2a\xc8\xc1\xe5\xc2\xee\x3a\x58\x0a\x4b\xda\x27\x01\xa3\x90\x91\x42\x78\xf6\x85\x44\x9a\x43\x49\x4d\xb5\xbb\x84\x6c\xa5\x45\x21\xd3\x06\xbe\xba\x5a\xa4\x1b\x44\x1d\x38\xb2\x77\x64\x93\x57\x47\x98\x09\x0e\x5e\xea\x8c\xee\x4f\x87\xaf\xea\xf7\xbd\x4c\xbb\x9e\x16\x05\x9d\x0e\x5e\x95\x44\x16\xa5\xb1\xfe\x74\xf0\x8a\x14\xa5\x9c\xc4\xfa\xf9\x66\x60\x8d\xa2\xdb\x97\x37\xaf\x52\x25\x49\xfb\xf0\x16\x22\xcb\x98\x46\xa7\x83\xdb\xdd\xd7\xa7\x51\x07\x4f\x0e\x6b\x61\xaa\x8f\xac\x5f\xc2\xe7\xc2\xa3\x10\x3e\xcd\xa9\xfe\x2a\x79\x39\x32\xe1\x45\x26\x6d\xbf\x58\x49\xa6\xd3\x8e\x53\xad\x95\x70\xb6\xd1\x58\xe6\x32\xcd\xc1\xdf\x1d\xcb\x41\x51\x69\x99\x0a\x4f\x8c\x68\x28\x3d\x5e\x53\x95\x19\xa7\x86\x0d\x3d\x8e\xe8\x91\xb1\x40\x0a\xe6\x93\x22\xc1\x8c\x6d\x97\x46\x1d\x34\x91\x23\x15\x9a\xf3\xc4\xec\xf5\x06\x66\x56\x87\x72\xc0\x09\xf2\x32\x95\xa5\xd0\x9e\x55\x20\xa3\xb9\xa8\x94\xe7\xf3\xfe\x0c\x29\x3e\xd5\x94\x6c\x5a\xa8\x40\x8c\x66\xbd\x63\xa3\x87\x49\xf8\x7f\xb2\xf7\x3b\x61\xef\xc0\x29\x52\x16\x45\x87\x66\x53\x6a\xb4\xae\xdd\x77\x51\x74\xf6\xe6\xe7\x21\xb3\x70\x4b\xbe\x3e\x33\x84\x1f\x93\x74\xbe\x48\x1a\xda\xf0\xba\xcf\xaf\x47\x6f\xff\x72\xed\x4c\x7c\x89\xde\x7f\xfa\x3c\x39\xff\xfc\x66\xf2\x6e\x3c\x7c\xcc\xe9\x3a\x5f\xbf\x5c\x4e\xaf\x2f\x46\xef\xc7\xc3\xee\x5e\x6e\x9c\x67\x5e\xed\x47\xd1\x32\x67\x36\x5a\x12\x19\x7a\x56\xe0\xdd\xe4\x62\xfc\x12\x99\x89\x58\x78\x7f\x1d\x8f\xaf\xa6\xc3\xbd\xb8\xfb\x10\x7e\xdd\xfc\xe7\x76\x1d\x23\xee\x3e\xf0\xa2\x9b\xc3\xdb\x75\xbc\x1f\x65\x46\x13\x97\xd4\xb9\xd1\xcf\x02\x94\x21\xf8\xb9\xb4\xce\xb7\x82\x20\x58\x7d\x36\x59\x89\xe4\x1c\x37\xe8\x3e\x74\x36\x26\xd1\xa3\xaf\x38\xc2\xed\x4b\xde\xaa\xc3\xc1\x1d\x7c\x24\xe8\x46\xa0\x59\x9d\x09\xa6\x6a\xb9\xd9\x6a\x80\x92\x2e\x94\x5b\x6d\xd7\x41\x6a\x6f\xb0\xc5\x20\x69\x2c\x5d\x18\xa6\x1d\xf3\x39\xec\x6a\x7b\x97\x50\x4b\xb1\x62\x6e\x4a\x9d\xca\x6c\xa7\x51\xb5\xd8\x40\x66\xb5\x09\x4a\x73\x83\x23\x9c\x72\xe4\x5b\xf3\xeb\x78\xfb\x31\x6e\xca\xf8\x68\xd8\x22\x75\x78\xbb\x1e\x1c\x9f\x9c\x9c\x0c\x5e\x9c\x9c\x9c\xbc\x3c\x3e\x3a\x39\x8a\x6b\x03\x67\x6f\x7e\x6e\x76\x76\x70\x7d\x79\x7e\x39\xc0\xb7\x2f\xd3\xba\xd8\xa5\x96\x5e\x0a\x25\xbf\xd1\xa6\x24\xc5\x9c\xb0\x14\x2b\x46\x21\x17\x3a\x53\x84\x5a\x11\x03\x25\x9b\x62\x6c\x8c\xcd\x28\x15\xdc\x8f\x1d\x37\x8d\x15\xab\x9d\xe5\x9e\x86\xa5\x54\x0a\xa9\x25\x2e\x3e\x01\x4d\xcb\x76\xdf\x01\x5e\x7f\xb8\x86\xac\xbb\x6e\xe5\x58\xc8\x83\xed\xac\x31\x58\x9a\x0c\x9e\x8a\x52\x85\xb2\xcd\x69\x85\x22\xcc\x18\xa4\x33\x54\x65\x8d\xd7\x71\x6b\x2c\x34\x18\xcc\xac\xa4\x39\x5c\xa9\xa4\xc7\xcc\x0a\xa9\x1b\x00\xef\xa5\x8f\xe6\x92\x69\x32\xbe\x23\xbb\x82\xab\x66\x8e\xbe\x56\x5c\x10\x0d\x47\xa4\x63\xee\x50\xf6\x84\x2c\xc1\x6a\x69\x4d\x61\x7c\xcd\x05\xb1\x5b\xd3\x51\x0d\xfe\x16\x59\xae\x92\x75\x1c\xc9\xe1\x61\xf4\x6e\x3c\x3a\x1f\x5f\x0d\xbb\x2d\xe9\x23\x56\x90\x20\x57\x52\xe3\x11\xa1\x37\x6c\xdf\xdb\x83\x1c\xca\x7f\x1c\x61\x7f\x3f\x3c\x33\x51\x6f\x78\x2d\x6f\x5b\xc7\x18\x0e\xf1\x3c\xee\x3e\xb4\x16\xd7\xf1\x73\xdc\xee\x92\x16\x35\xf9\x86\x5d\xb9\x7d\xac\xeb\xad\xb6\xd0\xbc\x0d\x4e\x77\xe5\x77\xf8\xf4\x84\x51\xdd\x07\xb9\x6e\xf7\x6f\x09\x35\x68\xf1\x69\x99\xf5\x04\x80\x60\x46\x39\x6a\x2c\xd6\x81\x74\xf7\x82\x65\x67\xef\x2c\xfe\x08\xdd\xaf\xaf\xd3\x9d\xf0\xd8\x14\xfe\xc0\xc2\x52\x89\xf7\x26\xa3\x7d\x0c\x11\xf3\x8f\x41\xa3\xbc\xf1\xd3\x70\x81\x06\xe5\x8d\x91\xe6\xc3\x5c\xfe\x8d\x58\x76\x12\xfa\x17\xe1\xcc\xe5\x46\x6a\xb6\xad\x7a\x19\x44\x27\x50\x3d\xf0\xd1\x54\x1e\x2c\x75\x10\x7a\xb5\x14\xab\xa4\x9d\x5e\x0a\x12\xda\x05\x05\xd9\x14\xf7\x52\x38\xde\xdb\x34\xe8\x40\x0c\xd6\x93\xa4\x96\xa7\x9f\xd0\x9b\x3f\x4d\xcf\x8e\x40\x31\xa1\x71\xd4\x50\xfa\x92\xc7\xdc\xef\x77\xf9\x20\x5f\x9e\x34\x64\x3b\xed\xf0\xb9\x33\x42\x61\x32\x39\x97\x94\xf1\xd4\xd9\x88\xa6\x16\x2a\xea\xc0\xd2\x66\xcc\x0a\x1a\xe8\xea\xf2\x2f\x4b\x62\x67\xad\xa9\x16\xb5\x50\xc5\xed\xc2\x38\x74\x58\xa1\xb3\x24\x4a\x4b\x6c\x91\xab\x7f\xae\xc3\x10\xf7\x63\xa4\xe6\x87\xca\xcc\x8f\x92\x98\x27\x6d\x91\x6f\x46\x6d\xa0\x61\x72\x64\x17\xb7\x18\x7c\xa4\x9d\x34\xb4\x2d\xa6\x9e\xa2\x57\xc1\xc7\x66\x1c\x68\xef\x23\x85\x08\xc3\xad\x70\x50\x46\x2f\x20\x78\x5c\xe1\x39\x9d\x9e\x39\x7c\xad\x8c\xad\x8a\x04\xa3\x34\x35\x36\x63\x18\x7c\x9d\xca\xcc\xa4\x35\xac\x0c\x44\x3b\x58\x39\xfc\x5e\x39\xdf\x34\x1f\x65\x96\xe1\xe8\xa8\x83\x3b\xe3\xe9\x00\xd2\x3f\x73\x70\x9e\x61\xdc\x7e\x65\xed\x2b\x8d\xa3\x96\x53\x4d\x4a\x0e\x02\x14\xd2\xe3\x8b\x36\xcb\x70\x50\xd4\x61\x52\xba\x90\x8a\x5a\x52\x37\x01\xf0\x68\x5f\xf0\xcd\x67\x6e\x4d\x81\xe7\xd2\xbb\xe7\x8d\xb9\x24\x1a\x9d\x9f\x7f\x9e\x8e\xaf\x7e\xe3\x1a\x6e\xab\xb4\x11\xb1\x46\xbc\xbe\x53\xa8\xcd\x38\x34\x08\x05\xfb\xe7\x19\x38\x53\x92\xe1\x6f\x49\x8a\x9e\x0b\xa3\x43\x50\x8c\x75\x1c\x76\xa2\xc7\x03\x43\xdc\x7d\xd8\xfa\xb1\x8e\x39\x55\xbf\x5a\x73\xd7\x34\xed\x25\x3d\xbb\x23\x88\xd4\x57\x42\xa9\x15\x7e\x37\x52\x53\x3d\x64\xd8\x4a\x87\x6b\x4e\x73\xff\x88\x26\xd7\xe3\xab\x11\xdf\xab\x86\x87\x51\xa5\xbd\x54\xb5\xfc\x34\xc7\x6f\x25\x4f\x99\x54\x28\x16\x82\x47\x92\xf7\xc4\x0b\x9c\xa2\x9f\xd1\x5d\x5f\x57\x4a\x35\x1d\xa2\x16\xee\xcd\x29\xb7\x58\x8a\x70\x6d\x0c\xc3\x69\x3d\xcb\x66\xed\x69\xcc\xa9\x95\x4e\x31\x13\xe9\x17\x7e\xd8\x9c\x19\x01\x4e\x11\x95\x38\x8a\x42\xc7\xd9\x3a\xbd\xf9\xd5\x76\xa0\x7a\x50\xda\xbc\x0e\x63\xd2\xf1\xe1\xa3\x39\xa9\x11\xa2\x1d\x79\xfc\xbf\xc5\x60\xca\xe8\xbf\x01\x00\x00\xff\xff\xa6\x97\x4d\xe4\x40\x10\x00\x00") +var _testImagesPetsZookeeperInstallerOnStartSh = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x57\x61\x6f\xdb\x38\x12\xfd\xae\x5f\xf1\x56\x36\xd0\xa4\x17\xcb\x49\x7a\x77\x08\xdc\x3a\x38\x37\x71\x77\x8d\xb6\xc9\x22\x4e\xb7\x28\x82\xa0\xa0\xa5\xb1\xc5\x2d\x45\xaa\x24\x15\xc7\xcd\xfa\xbf\x1f\x86\x92\x6c\x27\xb7\xdd\xc3\x02\x4d\xbe\x58\x12\x39\x9c\x79\xf3\xe6\xcd\xb0\xf3\x13\xfa\x33\xa9\xfb\x33\xe1\xf2\x28\xea\xe0\xcc\x94\x2b\x2b\x17\xb9\xc7\xf1\xe1\xd1\xbf\x71\x9d\x13\xde\x56\x33\xb2\x9a\x3c\x39\x8c\x2a\x9f\x1b\xeb\x92\xa8\x13\x75\xf0\x4e\xa6\xa4\x1d\x65\xa8\x74\x46\x16\x3e\x27\x8c\x4a\x91\xe6\xd4\x7e\x39\xc0\x6f\x64\x9d\x34\x1a\xc7\xc9\x21\xf6\x78\x41\xdc\x7c\x8a\xf7\x5f\x46\x1d\xac\x4c\x85\x42\xac\xa0\x8d\x47\xe5\x08\x3e\x97\x0e\x73\xa9\x08\x74\x9f\x52\xe9\x21\x35\x52\x53\x94\x4a\x0a\x9d\x12\x96\xd2\xe7\xe1\x98\xc6\x48\x12\x75\xf0\xa9\x31\x61\x66\x5e\x48\x0d\x81\xd4\x94\x2b\x98\xf9\xee\x3a\x08\x1f\x1c\xe6\xbf\xdc\xfb\x72\xd0\xef\x2f\x97\xcb\x44\x04\x67\x13\x63\x17\x7d\x55\x2f\x74\xfd\x77\x93\xb3\xf1\xc5\x74\xdc\x3b\x4e\x0e\xc3\x96\x0f\x5a\x91\x73\xb0\xf4\xb5\x92\x96\x32\xcc\x56\x10\x65\xa9\x64\x2a\x66\x8a\xa0\xc4\x12\xc6\x42\x2c\x2c\x51\x06\x6f\xd8\xdf\xa5\x95\x5e\xea\xc5\x01\x9c\x99\xfb\xa5\xb0\x14\x75\x90\x49\xe7\xad\x9c\x55\xfe\x11\x58\xad\x77\xd2\x3d\x5a\x60\x34\x84\x46\x3c\x9a\x62\x32\x8d\xf1\x7a\x34\x9d\x4c\x0f\xa2\x0e\x3e\x4e\xae\x7f\xb9\xfc\x70\x8d\x8f\xa3\xab\xab\xd1\xc5\xf5\x64\x3c\xc5\xe5\x15\xce\x2e\x2f\xce\x27\xd7\x93\xcb\x8b\x29\x2e\xdf\x60\x74\xf1\x09\x6f\x27\x17\xe7\x07\x20\xe9\x73\xb2\xa0\xfb\xd2\xb2\xff\xc6\x42\x32\x8c\x94\x31\x66\x53\xa2\x47\x0e\xcc\x4d\xed\x90\x2b\x29\x95\x73\x99\x42\x09\xbd\xa8\xc4\x82\xb0\x30\x77\x64\xb5\xd4\x0b\x94\x64\x0b\xe9\x38\x99\x0e\x42\x67\x51\x07\x4a\x16\xd2\x0b\x1f\xde\xfc\x4f\x50\x49\x14\x39\xf2\xe8\x91\x41\x29\x4b\x9a\x0b\xa9\x98\x5d\xd7\x9c\x60\x97\x5a\x59\x7a\xa4\x46\xcf\xe5\xa2\xb2\xe4\xf0\xcd\x98\x2f\x44\x25\x59\xa4\xaa\x72\x9e\x2c\x0a\x2a\x66\x64\xe1\x72\x59\x06\xf7\xee\x1a\x22\x99\xf9\x76\x71\xd4\xc1\xe9\x10\x2f\x92\x7f\x25\x87\x09\x26\x1e\x2e\x37\x95\xca\x02\x99\x66\xc4\x7c\xca\xb6\x8c\x31\xba\x97\xe6\x42\x2f\x28\x71\x79\xeb\x80\xd4\x35\xe1\xe8\x5e\x14\xa5\x0a\x6c\x1a\x39\x3e\x61\x54\x5a\xa9\x7a\x81\xff\xd2\xe1\x45\xf2\xcf\xe4\x84\x7f\xb0\x1d\x25\x3c\x39\x0f\xe7\x39\xff\x09\x87\xf4\xda\xf8\x1c\x7d\x53\x7a\x86\x05\x7d\x5f\x94\xfd\x6d\x38\xc2\x12\x84\x73\x55\x51\xd3\x63\x46\xb8\x33\xaa\x2a\xc8\xc1\xe5\xc2\xee\x3a\x58\x0a\x4b\xda\x27\x01\xa3\x90\x91\x42\x78\xf6\x85\x44\x9a\x43\x49\x4d\xb5\xbb\x84\x6c\xa5\x45\x21\xd3\x06\xbe\xba\x5a\xa4\x1b\x44\x1d\x38\xb2\x77\x64\x93\x57\x47\x98\x09\x0e\x5e\xea\x8c\xee\x4f\x87\xaf\xea\xf7\xbd\x4c\xbb\x9e\x16\x05\x9d\x0e\x5e\x95\x44\x16\xa5\xb1\xfe\x74\xf0\x8a\x14\xa5\x9c\xc4\xfa\xf9\x66\x60\x8d\xa2\xdb\x97\x37\xaf\x52\x25\x49\xfb\xf0\x16\x22\xcb\x98\x46\xa7\x83\xdb\xdd\xd7\xa7\x51\x07\x4f\x0e\x6b\x61\xaa\x8f\xac\x5f\xc2\xe7\xc2\xa3\x10\x3e\xcd\xa9\xfe\x2a\x79\x39\x32\xe1\x45\x26\x6d\xbf\x58\x49\xa6\xd3\x8e\x53\xad\x95\x70\xb6\xd1\x58\xe6\x32\xcd\xc1\xdf\x1d\xcb\x41\x51\x69\x99\x0a\x4f\x8c\x68\x28\x3d\x5e\x53\x95\x19\xa7\x86\x0d\x3d\x8e\xe8\x91\xb1\x40\x0a\xe6\x93\x22\xc1\x8c\x6d\x97\x46\x1d\x34\x91\x23\x15\x9a\xf3\xc4\xec\xf5\x06\x66\x56\x87\x72\xc0\x09\xf2\x32\x95\xa5\xd0\x9e\x55\x20\xa3\xb9\xa8\x94\xe7\xf3\xfe\x0c\x29\x3e\xd5\x94\x6c\x5a\xa8\x40\x8c\x66\xbd\x63\xa3\x87\x49\xf8\x7f\xb2\xf7\x3b\x61\xef\xc0\x29\x52\x16\x45\x87\x66\x53\x6a\xb4\xae\xdd\x77\x51\x74\xf6\xe6\xe7\x21\xb3\x70\x4b\xbe\x3e\x33\x84\x1f\x93\x74\xbe\x48\x1a\xda\xf0\xba\xcf\xaf\x47\x6f\xff\x72\xed\x4c\x7c\x89\xde\x7f\xfa\x3c\x39\xff\xfc\x66\xf2\x6e\x3c\x7c\xcc\xe9\x3a\x5f\xbf\x5c\x4e\xaf\x2f\x46\xef\xc7\xc3\xee\x5e\x6e\x9c\x67\x5e\xed\x47\xd1\x32\x67\x36\x5a\x12\x19\x7a\x56\xe0\xdd\xe4\x62\xfc\x12\x99\x89\x58\x78\x7f\x1d\x8f\xaf\xa6\xc3\xbd\xb8\xfb\x10\x7e\xdd\xfc\xe7\x76\x1d\x23\xee\x3e\xf0\xa2\x9b\xc3\xdb\x75\xbc\x1f\x65\x46\x13\x97\xd4\xb9\xd1\xcf\x02\x94\x21\xf8\xb9\xb4\xce\xb7\x82\x20\x58\x7d\x36\x59\x89\xe4\x1c\x37\xe8\x3e\x74\x36\x26\xd1\xa3\xaf\x38\xc2\xed\x4b\xde\xaa\xc3\xc1\x1d\x7c\x24\xe8\x46\xa0\x59\x9d\x09\xa6\x6a\xb9\xd9\x6a\x80\x92\x2e\x94\x5b\x6d\xd7\x41\x6a\x6f\xb0\xc5\x20\x69\x2c\x5d\x18\xa6\x1d\xf3\x39\xec\x6a\x7b\x97\x50\x4b\xb1\x62\x6e\x4a\x9d\xca\x6c\xa7\x51\xb5\xd8\x40\x66\xb5\x09\x4a\x73\x83\x23\x9c\x72\xe4\x5b\xf3\xeb\x78\xfb\x31\x6e\xca\xf8\x68\xd8\x22\x75\x78\xbb\x1e\x1c\x9f\x9c\x9c\x0c\x5e\x9c\x9c\x9c\xbc\x3c\x3e\x3a\x39\x8a\x6b\x03\x67\x6f\x7e\x6e\x76\x76\x70\x7d\x79\x7e\x39\xc0\xb7\x2f\xd3\xba\xd8\xa5\x96\x5e\x0a\x25\xbf\xd1\xa6\x24\xc5\x9c\xb0\x14\x2b\x46\x21\x17\x3a\x53\x84\x5a\x11\x03\x25\x9b\x62\x6c\x8c\xcd\x28\x15\xdc\x8f\x1d\x37\x8d\x15\xab\x9d\xe5\x9e\x86\xa5\x54\x0a\xa9\x25\x2e\x3e\x01\x4d\xcb\x76\xdf\x01\x5e\x7f\xb8\x86\xac\xbb\x6e\xe5\x58\xc8\x83\xed\xac\x31\x58\x9a\x0c\x9e\x8a\x52\x85\xb2\xcd\x69\x85\x22\xcc\x18\xa4\x33\x54\x65\x8d\xd7\x71\x6b\x2c\x34\x18\xcc\xac\xa4\x39\x5c\xa9\xa4\xc7\xcc\x0a\xa9\x1b\x00\xef\xa5\x8f\xe6\x92\x69\x32\xbe\x23\xbb\x82\xab\x66\x8e\xbe\x56\x5c\x10\x0d\x47\xa4\x63\xee\x50\xf6\x84\x2c\xc1\x6a\x69\x4d\x61\x7c\xcd\x05\xb1\x5b\xd3\x51\x0d\xfe\x16\x59\xae\x92\x75\x1c\xc9\xe1\x61\xf4\x6e\x3c\x3a\x1f\x5f\x0d\xbb\x2d\xe9\x23\x56\x90\x20\x57\x52\xe3\x11\xa1\x37\x6c\xdf\xdb\x83\x1c\xca\x7f\x1c\x61\x7f\x3f\x3c\x33\x51\x6f\x78\x2d\x6f\x5b\xc7\x18\x0e\xf1\x3c\xee\x3e\xb4\x16\xd7\xf1\x73\xdc\xee\x92\x16\x35\xf9\x86\x5d\xb9\x7d\xac\xeb\xad\xb6\xd0\xbc\xad\x9d\xee\xca\xf8\x3b\x8c\x7a\xc2\xa9\xee\x83\x5c\xb7\x16\xb6\x94\x1a\xb4\x08\xb5\xdc\x7a\x02\x41\x30\xa3\x1c\x35\x16\xeb\x50\xba\x7b\xc1\xb2\xb3\x77\x16\x7f\x84\xfe\xd7\xd7\xe9\x4e\x80\x6c\x0a\x7f\x60\x61\xa9\xc4\x7b\x93\xd1\x3e\x86\x88\xf9\xc7\xa0\xd1\xde\xf8\x69\xc0\x40\x83\xf3\xc6\x48\xf3\x61\x2e\xff\x46\x2c\x3b\x29\xfd\x8b\x70\xe6\x72\x23\x36\xdb\x66\xbd\x0c\xb2\x13\xc8\x1e\x18\x69\x2a\x0f\x16\x3b\x08\xbd\x5a\x8a\x55\xd2\xce\x2f\x05\x09\xed\x82\x86\x6c\xca\x7b\x29\x1c\xef\x6d\x5a\x74\xa0\x06\x2b\x4a\x52\x0b\xd4\x4f\xe8\xcd\x9f\xa6\x67\x47\xa2\x98\xd2\x38\x6a\x48\x7d\xc9\x83\xee\xf7\xfb\x7c\x10\x30\x4f\x1a\xb2\x9d\x77\xf8\xdc\x19\xa1\x30\x99\x9c\x4b\xca\x78\xee\x6c\x64\x53\x0b\x15\x75\x60\x69\x33\x68\x05\x15\x74\xb5\x00\x94\x25\xb1\xb3\xd6\x54\x8b\x5a\xaa\xe2\x76\x61\x1c\x7a\xac\xd0\x59\x12\xa5\x25\xb6\xc8\xd5\x3f\xd7\x61\x8c\xfb\x31\x62\xf3\x43\x85\xe6\x47\x89\xcc\x93\xc6\xc8\x77\xa3\x36\xd0\x30\x3b\xb2\x8b\x5b\x0c\x3e\xd2\x4e\x1a\xda\x26\x53\xcf\xd1\xab\xe0\x63\x33\x10\xb4\x37\x92\x42\x84\xf1\x56\x38\x28\xa3\x17\x10\x3c\xb0\xf0\xa4\x4e\xcf\x1c\xbe\x56\xc6\x56\x45\x82\x51\x9a\x1a\x9b\x31\x0c\xbe\x4e\x65\x66\xd2\x1a\x56\x06\xa2\x1d\xad\x1c\x7e\xaf\x9c\x6f\xda\x8f\x32\xcb\x70\x74\xd4\xc1\x9d\xf1\x74\x00\xe9\x9f\x39\x38\xcf\x30\x6e\xbf\xb2\xfa\x95\xc6\x51\xcb\xa9\x26\x25\x07\x01\x0a\xe9\xf1\x45\x9b\x65\x38\x28\xea\x30\x29\x5d\x48\x45\x2d\xaa\x9b\x00\x78\xb8\x2f\xf8\xee\x33\xb7\xa6\xc0\x73\xe9\xdd\xf3\xc6\x5c\x12\x8d\xce\xcf\x3f\x4f\xc7\x57\xbf\x71\x0d\xb7\x55\xda\xc8\x58\x23\x5f\xdf\x29\xd4\x66\x20\x1a\x84\x82\xfd\xf3\x0c\x9c\x29\xc9\xf0\xb7\x24\x45\xcf\x85\xe1\x21\x28\xc6\x3a\x0e\x3b\xd1\xe3\x91\x21\xee\x3e\x6c\xfd\x58\xc7\x9c\xaa\x5f\xad\xb9\x6b\xda\xf6\x92\x9e\xdd\x11\x44\xea\x2b\xa1\xd4\x0a\xbf\x1b\xa9\xa9\x1e\x33\x6c\xa5\xc3\x45\xa7\xb9\x81\x44\x93\xeb\xf1\xd5\x88\x6f\x56\xc3\xc3\xa8\xd2\x5e\xaa\x5a\x7e\x9a\xe3\xb7\x92\xa7\x4c\x2a\x14\x0b\xc1\x23\xc9\x7b\xe2\x05\x4e\xd1\xcf\xe8\xae\xaf\x2b\xa5\x9a\x1e\xd1\x48\xf7\xe6\x98\xf8\x16\x4b\x11\xae\x8e\x61\x40\xad\xe7\xd9\xac\x3d\x8f\x59\xb5\xd2\x29\x66\x22\xfd\xc2\x0f\x9b\x53\x23\xc0\x29\xa2\x12\x47\x51\xe8\x3a\x5b\xb7\x37\xbf\xda\x2e\x14\xb4\x68\xf7\xc4\x30\x2c\x1d\x1f\x3e\x9a\x96\x1a\x31\xda\x91\xc8\xff\x5b\x10\xa6\x8c\xfe\x1b\x00\x00\xff\xff\x55\xfa\xd2\xb3\x46\x10\x00\x00") func testImagesPetsZookeeperInstallerOnStartShBytes() ([]byte, error) { return bindataRead( @@ -5861,7 +6517,7 @@ func testImagesPetsZookeeperInstallerOnStartSh() (*asset, error) { return a, nil } -var _testImagesRedisBaseimage = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xca\xc9\xcc\x2b\xad\xd0\x4f\xcc\x4d\x31\x33\xb1\x4d\xcc\x29\xc8\xcc\x4b\xb5\x32\xd6\x33\xe3\x82\x0a\x17\xe5\xda\x26\x16\xe5\x1a\x1b\x95\x99\xe9\x63\x93\x04\xe9\x01\x91\x65\x16\x98\xd2\x05\x05\xc9\x66\x26\x39\xa9\xb6\x50\x1a\x53\x41\xb1\xb1\xa5\x41\x85\x2d\x98\x44\x96\x2c\xcf\xcc\x4b\xc9\x2f\x2f\x86\x38\x49\xdf\xd0\xc2\xc0\xd2\x36\xc8\xd5\xdd\x33\x38\x24\x28\x52\x3f\xa9\xb4\xb8\x32\x29\xbf\xc2\xca\x50\xcf\xc8\x52\x17\xaa\x50\x17\xac\x50\x17\xa4\x10\x5d\xaf\xa5\x81\x31\x71\x7a\x2d\x0d\x8c\x31\xf5\x12\x69\xaf\xa5\x81\x25\x17\x20\x00\x00\xff\xff\xa0\x4d\x41\x80\x45\x01\x00\x00") +var _testImagesRedisBaseimage = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x8e\xb1\xce\x83\x20\x14\x85\x77\xdf\x45\xb9\x82\x21\x5e\x13\xc6\x3f\xbf\x5d\x6d\x97\x8e\x5a\x1d\x4c\x00\x89\x44\xa5\x6f\xdf\x60\x19\x9a\xd2\x81\xe5\x90\x70\xbe\x2f\xe7\xca\x59\x6f\x8e\xf4\x6a\xe4\x95\xe8\xa5\x99\xf5\xd4\xb0\x82\x67\xe1\x7b\x55\xa2\x5f\x15\xa3\x3b\x27\xbf\x4a\xef\xf8\xdc\xeb\xb8\x36\xe6\xc1\x2b\x39\x89\xf0\xc6\x80\x65\x08\x4e\x9c\xf9\x59\x1e\xb3\x1e\x97\xc3\xbe\x4f\x22\x65\x0d\x28\xba\xbf\xff\xcb\xf5\xd6\xdd\xc9\xb0\xd9\xe7\xb0\xb8\xa6\x2c\x28\xe6\x01\xcc\x4f\x30\xf7\xe0\xb7\x8b\xc0\xd2\x5c\x04\x16\xbb\x89\xbb\x18\xed\x52\x80\x2a\xc9\xf5\x60\xe4\xb6\x34\xd1\x6d\x69\xf6\x0a\x00\x00\xff\xff\xa1\xd4\x29\x87\xbd\x01\x00\x00") func testImagesRedisBaseimageBytes() ([]byte, error) { return bindataRead( @@ -6001,7 +6657,27 @@ func testImagesRegressionIssue74839Gitignore() (*asset, error) { return a, nil } -var _testImagesRegressionIssue74839Dockerfile = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x74\x91\x41\x8f\xd3\x3c\x10\x86\xef\xfe\x15\xaf\x92\xcb\xf7\x49\x6d\x52\x0a\x12\x2c\x9c\x42\xdb\x15\xd1\x2e\x09\x6a\xb2\xac\x2a\xc4\xc1\x49\xa6\xc9\x48\xa9\x6d\x6c\x87\x6c\xff\x3d\x4a\xb6\x2b\x51\x01\x3e\xce\x3c\x1e\x3f\xf3\x3a\xc4\x46\x9b\xb3\xe5\xb6\xf3\x58\xaf\x5e\xdd\xa0\xec\x08\x77\x43\x45\x56\x91\x27\x87\x64\xf0\x9d\xb6\x2e\x12\xa1\x08\x71\xcf\x35\x29\x47\x0d\x06\xd5\x90\x85\xef\x08\x89\x91\x75\x47\x2f\x9d\x05\xbe\x92\x75\xac\x15\xd6\xd1\x0a\xff\x4d\x40\x70\x69\x05\xff\x7f\x10\x21\xce\x7a\xc0\x49\x9e\xa1\xb4\xc7\xe0\x08\xbe\x63\x87\x23\xf7\x04\x7a\xaa\xc9\x78\xb0\x42\xad\x4f\xa6\x67\xa9\x6a\xc2\xc8\xbe\x9b\x9f\xb9\x0c\x89\x44\x88\xc3\x65\x84\xae\xbc\x64\x05\x89\x5a\x9b\x33\xf4\xf1\x77\x0e\xd2\xcf\xc2\xd3\xe9\xbc\x37\xef\xe3\x78\x1c\xc7\x48\xce\xb2\x91\xb6\x6d\xdc\x3f\x83\x2e\xbe\x4f\x37\xbb\xac\xd8\x2d\xd7\xd1\x6a\xbe\xf2\xa0\x7a\x72\x0e\x96\x7e\x0c\x6c\xa9\x41\x75\x86\x34\xa6\xe7\x5a\x56\x3d\xa1\x97\x23\xb4\x85\x6c\x2d\x51\x03\xaf\x27\xdf\xd1\xb2\x67\xd5\x2e\xe0\xf4\xd1\x8f\xd2\x92\x08\xd1\xb0\xf3\x96\xab\xc1\x5f\x85\xf5\x62\xc7\xee\x0a\xd0\x0a\x52\x21\x48\x0a\xa4\x45\x80\x8f\x49\x91\x16\x0b\x11\xe2\x31\x2d\x3f\xe5\x0f\x25\x1e\x93\xfd\x3e\xc9\xca\x74\x57\x20\xdf\x63\x93\x67\xdb\xb4\x4c\xf3\xac\x40\x7e\x8b\x24\x3b\xe0\x2e\xcd\xb6\x0b\x10\xfb\x8e\x2c\xe8\xc9\xd8\xc9\x5f\x5b\xf0\x14\x23\x35\x53\x66\x05\xd1\x95\xc0\x51\x3f\x0b\x39\x43\x35\x1f\xb9\x46\x2f\x55\x3b\xc8\x96\xd0\xea\x9f\x64\x15\xab\x16\x86\xec\x89\xdd\xf4\x99\x0e\x52\x35\x22\x44\xcf\x27\xf6\xd2\xcf\x95\x3f\x96\x8a\x84\xb8\xdd\xe7\x9f\xd1\xd6\x36\x62\x1d\xcf\xfb\xe9\x29\xca\xb8\x92\x8e\x84\x48\xb6\x5b\x58\x6a\x27\x39\xd6\x6a\xc9\xce\x0d\xb4\x7c\xfb\xe6\xdd\xeb\x1b\xc4\x7f\xaf\x0b\xb1\xcb\xca\xfd\xe1\x4b\x9e\x66\x25\xbe\x05\xff\xa0\x82\xef\x42\xfc\x0a\x00\x00\xff\xff\x39\x3c\x7b\xcf\xc5\x02\x00\x00") +var _testImagesRegressionIssue74839Baseimage = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xca\xc9\xcc\x2b\xad\xd0\x4f\xcc\x4d\x31\x33\xb1\xcd\xb6\x28\xd6\x4b\x4f\x2e\xd2\xcb\xcc\xd7\x4f\x49\x4d\xca\x4c\xcc\xd3\x4d\x4a\x2c\x4e\xd5\x05\x4b\x5a\x95\x19\xea\x19\xe8\x19\x70\x41\xd5\x17\xe5\xe2\x54\x5d\x94\x8b\xa1\x16\x8f\xd9\x20\x49\x54\xf5\x05\x05\xc9\x66\x26\x39\xa9\xb8\x74\x40\xa5\x51\xf5\x14\x1b\x5b\x1a\x54\xe0\xd2\x01\x96\x84\xa9\x07\x04\x00\x00\xff\xff\xd5\x7f\xdd\x2c\xf0\x00\x00\x00") + +func testImagesRegressionIssue74839BaseimageBytes() ([]byte, error) { + return bindataRead( + _testImagesRegressionIssue74839Baseimage, + "test/images/regression-issue-74839/BASEIMAGE", + ) +} + +func testImagesRegressionIssue74839Baseimage() (*asset, error) { + bytes, err := testImagesRegressionIssue74839BaseimageBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "test/images/regression-issue-74839/BASEIMAGE", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _testImagesRegressionIssue74839Dockerfile = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x74\x91\x51\x6f\x9b\x3e\x14\xc5\xdf\xfd\x29\x8e\xc2\xff\xe1\x3f\x29\x81\xae\x9b\xb4\x75\x7b\xa2\x09\x6d\x51\x5b\xe8\x80\xac\x8a\xa6\xa9\x32\x70\x03\x57\x22\x36\xb5\xcd\x68\xbe\xfd\x44\xda\x6a\x8b\xb6\xf9\xcd\xf7\x1e\x1f\xff\xee\xb9\x1e\x96\xba\xdf\x1b\x6e\x5a\x87\xd3\x93\xb7\x67\x28\x5a\xc2\xf5\x50\x92\x51\xe4\xc8\x22\x1c\x5c\xab\x8d\xf5\x85\x27\x3c\xdc\x70\x45\xca\x52\x8d\x41\xd5\x64\xe0\x5a\x42\xd8\xcb\xaa\xa5\xd7\xce\x1c\x5f\xc9\x58\xd6\x0a\xa7\xfe\x09\xfe\x9f\x04\xb3\x97\xd6\xec\xcd\x67\xe1\x61\xaf\x07\xec\xe4\x1e\x4a\x3b\x0c\x96\xe0\x5a\xb6\xd8\x72\x47\xa0\xa7\x8a\x7a\x07\x56\xa8\xf4\xae\xef\x58\xaa\x8a\x30\xb2\x6b\x0f\xdf\xbc\x98\xf8\xc2\xc3\xe6\xc5\x42\x97\x4e\xb2\x82\x44\xa5\xfb\x3d\xf4\xf6\x77\x1d\xa4\x3b\x00\x4f\xa7\x75\xae\xff\x14\x04\xe3\x38\xfa\xf2\x00\xeb\x6b\xd3\x04\xdd\xb3\xd0\x06\x37\xf1\x32\x4a\xf2\x68\x71\xea\x9f\x1c\x9e\xac\x55\x47\xd6\xc2\xd0\xe3\xc0\x86\x6a\x94\x7b\xc8\xbe\xef\xb8\x92\x65\x47\xe8\xe4\x08\x6d\x20\x1b\x43\x54\xc3\xe9\x89\x77\x34\xec\x58\x35\x73\x58\xbd\x75\xa3\x34\x24\x3c\xd4\x6c\x9d\xe1\x72\x70\x47\x61\xbd\xd2\xb1\x3d\x12\x68\x05\xa9\x30\x0b\x73\xc4\xf9\x0c\xe7\x61\x1e\xe7\x73\xe1\xe1\x3e\x2e\xae\xd2\x75\x81\xfb\x30\xcb\xc2\xa4\x88\xa3\x1c\x69\x86\x65\x9a\xac\xe2\x22\x4e\x93\x1c\xe9\x05\xc2\x64\x83\xeb\x38\x59\xcd\x41\xec\x5a\x32\xa0\xa7\xde\x4c\xfc\xda\x80\xa7\x18\xa9\x9e\x32\xcb\x89\x8e\x00\xb6\xfa\x19\xc8\xf6\x54\xf1\x96\x2b\x74\x52\x35\x83\x6c\x08\x8d\xfe\x41\x46\xb1\x6a\xd0\x93\xd9\xb1\x9d\x96\x69\x21\x55\x2d\x3c\x74\xbc\x63\x27\xdd\xa1\xf2\xc7\x50\xbe\x10\x61\x76\x39\xd1\x47\xf1\x6d\x78\x19\x89\x8b\x2c\xbd\xc5\x7f\xbf\xee\x62\x99\xa5\x79\xfe\x70\xbe\x8e\x6f\x56\x0f\xcb\xf4\x6e\x83\x47\xda\x0d\x8b\x2f\xd1\xed\x3a\xcc\x96\x57\x0b\x3b\x59\x57\x08\x06\x6b\x82\x92\x55\x20\x44\xb8\x5a\xc1\x50\x33\xcd\xc3\x5a\x2d\xd8\xda\x81\x16\x1f\xde\x7f\x7c\x77\x86\xe0\xef\x75\x21\xa2\xa4\xc8\x36\x77\x69\x9c\x14\xf8\x36\xfb\x87\x6a\xf6\x5d\x88\x9f\x01\x00\x00\xff\xff\xac\xf3\x08\x24\xf8\x02\x00\x00") func testImagesRegressionIssue74839DockerfileBytes() ([]byte, error) { return bindataRead( @@ -6161,7 +6837,7 @@ func testImagesResourceConsumerGitignore() (*asset, error) { return a, nil } -var _testImagesResourceConsumerBaseimage = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xca\xc9\xcc\x2b\xad\xd0\x4f\xcc\x4d\x31\x33\xb1\xcd\xb6\x28\xd6\x4b\x4f\x2e\xd2\xcb\xcc\xd7\x4f\x49\x4d\xca\x4c\xcc\xd3\x4d\x4a\x2c\x4e\xd5\x05\x4b\x5a\x19\xe8\x99\xe8\x19\x72\x41\x95\x17\xe5\xe2\x54\x5c\x94\x8b\xae\x14\x8f\xc9\x20\x49\x14\xe5\x05\x05\xc9\x66\x26\x39\xa9\xb8\x34\x40\xa5\x51\xb4\x14\x1b\x5b\x1a\x54\xe0\xd2\x00\x96\x84\x2a\x07\x04\x00\x00\xff\xff\x71\x77\xcf\xba\xeb\x00\x00\x00") +var _testImagesResourceConsumerBaseimage = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\xcf\x41\x0e\x83\x20\x10\x85\xe1\xbd\x77\x11\x46\x25\x46\x4c\xdc\x7b\x0d\x44\xda\x90\x0a\x98\x99\xb6\x7a\xfc\x46\x6b\x17\x6a\x6c\x58\xbf\xff\x63\xc2\x60\xfd\x6b\xe6\xca\xf5\xa5\x68\x1e\x15\xb1\xbb\x46\x66\x03\xef\x4d\x67\x95\x4f\x3b\x45\x26\x5d\xc7\x1a\x98\x60\x59\xb2\xe5\xe8\x2e\x63\x74\xc7\xf4\xcf\xcb\xcb\xb8\xcb\xc7\x51\x97\x62\x30\x57\x60\x9b\x77\x84\x0a\x09\xf3\x15\x58\xc7\x2d\x9f\xac\xef\xc3\x44\xdf\xcf\xf2\xac\x02\xd9\x38\x8d\xcc\x59\x8d\x81\xc2\xed\xc9\x74\x70\xfc\x17\x79\xe5\x03\x19\x7c\x1b\xac\x97\xf2\x88\x25\x14\x91\x58\x42\x71\xc6\xb1\x97\xe5\xe9\x72\x0e\x20\xe2\xf0\x52\x9e\x70\x9b\xc7\xe2\x36\x4f\x3e\x01\x00\x00\xff\xff\x36\x38\x1b\x49\x1c\x02\x00\x00") func testImagesResourceConsumerBaseimageBytes() ([]byte, error) { return bindataRead( @@ -6201,6 +6877,26 @@ func testImagesResourceConsumerDockerfile() (*asset, error) { return a, nil } +var _testImagesResourceConsumerDockerfile_windows = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x74\x92\xd1\x6f\xdb\x36\x10\xc6\xdf\xf9\x57\x7c\xb0\x07\x6c\x03\x6c\xc9\x73\x8b\xa0\x70\x90\x07\xcd\x51\x5a\xa1\xa9\x6c\x58\x4e\xb3\x60\xde\x03\x2d\x9d\x25\x62\x14\xc9\x91\x54\x65\xef\xaf\x1f\x28\x27\x83\x8d\x6e\x7c\x3a\xf2\xee\x3b\xfe\xee\x23\xc7\x58\x6a\x73\xb2\xa2\x6e\x3c\xe6\xb3\xf9\x2f\xd8\x36\x84\xcf\xdd\x9e\xac\x22\x4f\x0e\x49\xe7\x1b\x6d\x5d\xc4\xc6\x6c\x8c\x47\x51\x92\x72\x54\xa1\x53\x15\x59\xf8\x86\x90\x18\x5e\x36\xf4\x96\x99\xe0\x2b\x59\x27\xb4\xc2\x3c\x9a\xe1\xa7\x50\x30\x7a\x4d\x8d\x7e\xbe\x65\x63\x9c\x74\x87\x96\x9f\xa0\xb4\x47\xe7\x08\xbe\x11\x0e\x07\x21\x09\x74\x2c\xc9\x78\x08\x85\x52\xb7\x46\x0a\xae\x4a\x42\x2f\x7c\x33\x5c\xf3\xda\x24\x62\x63\xbc\xbc\xb6\xd0\x7b\xcf\x85\x02\x47\xa9\xcd\x09\xfa\x70\x59\x07\xee\x07\xe0\xb0\x1a\xef\xcd\x22\x8e\xfb\xbe\x8f\xf8\x00\x1b\x69\x5b\xc7\xf2\x5c\xe8\xe2\xc7\x6c\x99\xe6\x45\x3a\x9d\x47\xb3\x41\xf2\xa4\x24\x39\x07\x4b\x7f\x75\xc2\x52\x85\xfd\x09\xdc\x18\x29\x4a\xbe\x97\x04\xc9\x7b\x68\x0b\x5e\x5b\xa2\x0a\x5e\x07\xde\xde\x0a\x2f\x54\x3d\x81\xd3\x07\xdf\x73\x4b\x6c\x8c\x4a\x38\x6f\xc5\xbe\xf3\x57\x66\xbd\xd1\x09\x77\x55\xa0\x15\xb8\xc2\x28\x29\x90\x15\x23\xfc\x9a\x14\x59\x31\x61\x63\x3c\x67\xdb\x4f\xab\xa7\x2d\x9e\x93\xcd\x26\xc9\xb7\x59\x5a\x60\xb5\xc1\x72\x95\xdf\x67\xdb\x6c\x95\x17\x58\x3d\x20\xc9\x5f\xf0\x39\xcb\xef\x27\x20\xe1\x1b\xb2\xa0\xa3\xb1\x81\x5f\x5b\x88\x60\x23\x55\xc1\xb3\x82\xe8\x0a\xe0\xa0\xcf\x40\xce\x50\x29\x0e\xa2\x84\xe4\xaa\xee\x78\x4d\xa8\xf5\x37\xb2\x4a\xa8\x1a\x86\x6c\x2b\x5c\x78\x4c\x07\xae\x2a\x36\x86\x14\xad\xf0\xdc\x0f\x27\xdf\x0d\x15\x31\x96\x6c\x3e\x06\xfa\x34\xfb\x92\x7c\x4c\x59\x98\x80\x7e\xb4\x84\xce\x85\x76\x1c\x8f\x42\x75\x47\x88\x36\x5c\xe3\x35\x3a\x65\x78\xf9\xe7\xd0\x82\xdb\xb2\x11\xdf\xc8\x4d\xc2\x4e\xa1\x1f\x64\xe1\x59\x83\xd0\x37\xd4\x22\x50\x05\xd1\xb3\x50\x95\xee\x5d\xc4\x1e\x36\xab\x2f\x98\x4e\x8d\xe4\xfe\xa0\x6d\x7b\x27\x43\xf3\x98\xb7\xd5\xcd\x7b\x70\x69\x84\xa2\xc5\xbb\xe8\x06\xdc\xc1\x58\x32\x8c\x25\xf7\xf7\xc3\x4f\x70\x8b\x38\xae\x74\xaf\xa4\xe6\x55\xe4\x4e\x4e\x28\x4f\x56\x71\xe9\xa2\x52\xb7\x71\xf8\x89\x2e\xde\x92\xf3\xc3\xac\xd1\xdf\xc2\xe0\x7a\xcb\x36\x4f\x39\x3a\xf5\x7d\x02\xd3\x0a\x31\x3b\x73\xfd\x70\xe1\xc2\x72\xb5\x7e\xc1\x74\x7a\xb0\xba\xbd\x0b\x28\x17\xb2\x9b\xf7\x11\x1d\x09\xf1\x5e\xa8\xd8\xff\xdb\x8b\x8e\xf4\x1f\xa2\xb4\x93\x3c\xf2\x47\x7f\xae\x3e\xcf\x53\x6a\xe5\xba\x96\x2c\xe2\xb7\x68\x10\x5f\xa4\xa6\xa5\xe9\xe2\x8b\x18\xf1\xff\x24\x06\x21\x4b\xf3\xaf\x58\x27\xdb\x4f\x77\xa3\xe5\x62\xb7\x17\x6a\x77\xbb\x5c\xec\xca\xce\xca\x21\x78\xf5\x7e\xe7\x4e\xce\x53\xfb\x6e\x7e\x71\x16\xc2\xb5\xd5\xb5\xe5\x2d\x1e\x82\x87\xbb\xb5\xee\xc9\x16\x0d\x49\x79\x3b\x62\xe9\x6f\xeb\x55\x91\xe2\xc3\xec\xc3\x8c\xa5\xf9\x76\xf3\xb2\x5e\x65\xf9\x16\xbf\x8f\xae\xc0\x47\x7f\xb0\x7f\x02\x00\x00\xff\xff\x28\xdb\x17\xea\x8e\x04\x00\x00") + +func testImagesResourceConsumerDockerfile_windowsBytes() ([]byte, error) { + return bindataRead( + _testImagesResourceConsumerDockerfile_windows, + "test/images/resource-consumer/Dockerfile_windows", + ) +} + +func testImagesResourceConsumerDockerfile_windows() (*asset, error) { + bytes, err := testImagesResourceConsumerDockerfile_windowsBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "test/images/resource-consumer/Dockerfile_windows", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + var _testImagesResourceConsumerMakefile = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x64\x91\x5f\x4f\xdb\x4a\x10\xc5\x9f\xef\x7e\x8a\xa3\x98\x87\x44\x0a\x0e\x17\x5d\x71\x25\x2a\x54\xb9\x49\x1a\x2c\xa8\x5d\xd9\x01\xc4\x13\xda\xd8\x13\x7b\x24\x7b\x77\xbb\xbb\xae\x93\x6f\x5f\x6d\x00\x09\x54\x3f\xcd\x9f\x33\x33\x3f\x9f\x8d\xb0\xd4\xe6\x68\xb9\x69\x3d\x2e\x2f\xfe\xbd\xc2\xb6\x25\xdc\x0d\x3b\xb2\x8a\x3c\x39\x24\x83\x6f\xb5\x75\xb1\x88\x44\x84\x7b\xae\x48\x39\xaa\x31\xa8\x9a\x2c\x7c\x4b\x48\x8c\xac\x5a\x7a\xef\xcc\xf1\x48\xd6\xb1\x56\xb8\x8c\x2f\x30\x0d\x82\xc9\x5b\x6b\x32\xfb\x22\x22\x1c\xf5\x80\x5e\x1e\xa1\xb4\xc7\xe0\x08\xbe\x65\x87\x3d\x77\x04\x3a\x54\x64\x3c\x58\xa1\xd2\xbd\xe9\x58\xaa\x8a\x30\xb2\x6f\x4f\x67\xde\x96\xc4\x22\xc2\xf3\xdb\x0a\xbd\xf3\x92\x15\x24\x2a\x6d\x8e\xd0\xfb\x8f\x3a\x48\x7f\x02\x0e\x5f\xeb\xbd\xb9\x5e\x2c\xc6\x71\x8c\xe5\x09\x36\xd6\xb6\x59\x74\xaf\x42\xb7\xb8\x4f\x97\xeb\xac\x5c\x9f\x5f\xc6\x17\xa7\x91\x07\xd5\x91\x73\xb0\xf4\x6b\x60\x4b\x35\x76\x47\x48\x63\x3a\xae\xe4\xae\x23\x74\x72\x84\xb6\x90\x8d\x25\xaa\xe1\x75\xe0\x1d\x2d\x7b\x56\xcd\x1c\x4e\xef\xfd\x28\x2d\x89\x08\x35\x3b\x6f\x79\x37\xf8\x4f\x66\xbd\xd3\xb1\xfb\x24\xd0\x0a\x52\x61\x92\x94\x48\xcb\x09\xbe\x25\x65\x5a\xce\x45\x84\xa7\x74\x7b\x9b\x3f\x6c\xf1\x94\x14\x45\x92\x6d\xd3\x75\x89\xbc\xc0\x32\xcf\x56\xe9\x36\xcd\xb3\x12\xf9\x77\x24\xd9\x33\xee\xd2\x6c\x35\x07\xb1\x6f\xc9\x82\x0e\xc6\x06\x7e\x6d\xc1\xc1\x46\xaa\x83\x67\x25\xd1\x27\x80\xbd\x7e\x05\x72\x86\x2a\xde\x73\x85\x4e\xaa\x66\x90\x0d\xa1\xd1\xbf\xc9\x2a\x56\x0d\x0c\xd9\x9e\x5d\x78\x4c\x07\xa9\x6a\x11\xa1\xe3\x9e\xbd\xf4\xa7\xca\x5f\x3f\x15\x0b\x51\x16\xcb\x12\x37\xa8\xb4\x72\x43\x4f\xf6\x3d\x38\xaf\xcc\xb0\xf8\x10\x8b\xbc\xc4\xd7\x1b\x74\xac\x86\x83\x48\x8a\xe5\x6d\xc8\x64\x5f\x5f\xfd\x27\xb6\x49\xb1\x59\x6f\x43\x7e\x36\x5d\x3e\x14\xab\xb4\x98\x89\x4d\x9e\x14\x3f\x42\xe9\x7f\xb1\xc9\xef\x93\x6c\xf3\xf2\xb8\x2e\xca\x34\xcf\x4e\x4b\xa4\x27\xe7\xc3\xe5\x97\x55\x5a\x20\xcc\x29\xed\x6b\xb6\x38\x9b\xba\x96\xba\x0e\x66\xac\x67\x33\x41\x07\xa3\xad\x17\x62\xc7\xea\x5a\xfc\x13\xc7\x0b\xee\x65\x43\xe7\x83\xe7\x2e\x76\x2d\x76\xac\x70\x36\x0d\xfc\x33\x21\xe2\x9f\xb7\x79\xf6\x7c\x1d\x8a\xe2\x4f\x00\x00\x00\xff\xff\xe6\x5b\xa6\xf0\x1f\x03\x00\x00") func testImagesResourceConsumerMakefileBytes() ([]byte, error) { @@ -6221,7 +6917,7 @@ func testImagesResourceConsumerMakefile() (*asset, error) { return a, nil } -var _testImagesResourceConsumerVersion = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x32\xd4\x33\xe7\x02\x04\x00\x00\xff\xff\x18\x62\xd2\x2b\x04\x00\x00\x00") +var _testImagesResourceConsumerVersion = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x32\xd4\xb3\xe4\x02\x04\x00\x00\xff\xff\x96\x4f\x51\xb5\x04\x00\x00\x00") func testImagesResourceConsumerVersionBytes() ([]byte, error) { return bindataRead( @@ -6261,7 +6957,27 @@ func testImagesResourceConsumerCommonCommonGo() (*asset, error) { return a, nil } -var _testImagesResourceConsumerConsumeCpuConsume_cpuGo = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x7c\x52\x5d\x6f\xa3\x46\x14\x7d\x66\x7e\xc5\x11\x4f\x90\x78\xc1\x89\xda\x4a\xdd\x24\x0f\x6e\x92\xb6\xd6\x6e\x9d\x28\x38\x5d\xed\xe3\x78\xb8\xc0\x68\x61\x86\x9d\xb9\xc4\xb1\xaa\xfc\xf7\x6a\xc0\x49\xec\x56\x2d\x2f\xc0\xb9\x5f\xe7\xdc\x73\xf3\x13\x71\x6d\xfb\x9d\xd3\x75\xc3\x38\x9f\x9f\xfd\x88\x75\x43\xf8\x34\x6c\xc8\x19\x62\xf2\x58\x0c\xdc\x58\xe7\x33\x21\x3e\x6b\x45\xc6\x53\x89\xc1\x94\xe4\xc0\x0d\x61\xd1\x4b\xd5\x10\xf6\x91\x19\xfe\x24\xe7\xb5\x35\x38\xcf\xe6\x48\x42\x42\xbc\x0f\xc5\xe9\x85\xd8\xd9\x01\x9d\xdc\xc1\x58\xc6\xe0\x09\xdc\x68\x8f\x4a\xb7\x04\x7a\x56\xd4\x33\xb4\x81\xb2\x5d\xdf\x6a\x69\x14\x61\xab\xb9\x19\x87\xec\x5b\x64\xe2\xeb\xbe\x81\xdd\xb0\xd4\x06\x12\xca\xf6\x3b\xd8\xea\x30\x0b\x92\x85\x00\x80\x86\xb9\xff\x98\xe7\xdb\xed\x36\x93\x23\xcb\xcc\xba\x3a\x6f\xa7\x2c\x9f\x7f\x5e\x5e\xdf\xae\x8a\xdb\x0f\xe7\xd9\x5c\x88\x47\xd3\x92\xf7\x70\xf4\x7d\xd0\x8e\x4a\x6c\x76\x90\x7d\xdf\x6a\x25\x37\x2d\xa1\x95\x5b\x58\x07\x59\x3b\xa2\x12\x6c\x03\xcf\xad\xd3\xac\x4d\x3d\x83\xb7\x15\x6f\xa5\x23\x51\x6a\xcf\x4e\x6f\x06\x3e\x5a\xd0\x2b\x2b\xed\x71\x98\x60\x0d\xa4\x41\xbc\x28\xb0\x2c\x62\xfc\xb2\x28\x96\xc5\x4c\x7c\x59\xae\x7f\xbf\x7b\x5c\xe3\xcb\xe2\xe1\x61\xb1\x5a\x2f\x6f\x0b\xdc\x3d\xe0\xfa\x6e\x75\xb3\x5c\x2f\xef\x56\x05\xee\x7e\xc5\x62\xf5\x15\x9f\x96\xab\x9b\x19\x48\x73\x43\x0e\xf4\xdc\xbb\xc0\xdd\x3a\xe8\xb0\x3a\x2a\x33\x51\x10\x1d\x0d\xaf\xec\x44\xc6\xf7\xa4\x74\xa5\x15\x5a\x69\xea\x41\xd6\x84\xda\x3e\x91\x33\xda\xd4\xe8\xc9\x75\xda\x07\xf3\x3c\xa4\x29\x45\xab\x3b\xcd\x92\xc7\xff\x7f\xc9\xc9\xc4\x49\x2e\x44\x2f\xd5\xb7\xd0\xa4\x93\xda\x08\xa1\xbb\xde\x3a\x46\x22\xa2\xb8\x6a\x65\x1d\x8b\x28\xee\x24\x37\xe1\xcd\xba\xa3\x58\x88\x28\xde\x68\xde\x0c\xea\x1b\xf1\xe8\xc5\x86\x1c\xeb\x6e\xf0\x3f\xe7\x7e\xe7\x99\x3a\xcf\x92\x63\x91\x0a\xa1\xac\xf1\x0c\xdf\x12\xf5\xb8\x42\xa8\xce\x6e\x06\x37\x92\x49\xce\xe6\x29\x4e\x26\xec\x0f\xdd\xb6\xda\x93\xb2\xa6\x14\xa2\x1a\x8c\x42\x69\x0b\xdb\x11\x37\xda\xd4\x49\x8a\xbf\x44\x14\x94\x6b\x7c\xbc\xc2\xd9\x05\x34\x2e\x71\x36\x9f\x9e\x0b\xe8\xd3\xd3\x90\x10\x3d\x87\x68\xd5\x5a\xc9\x3f\xfd\x90\xcc\xd3\x11\x39\xbd\x42\xa0\x9e\x15\xdf\x1d\x8f\xd8\x8b\x78\x11\xe2\x49\xba\xa0\xae\x0b\x53\x95\x75\xe4\x81\x50\x29\xeb\x6c\x69\x38\x89\xdf\xf1\x78\x86\xf9\x0c\x07\x00\xcc\xd0\x6d\xc8\xc5\xa9\x88\xca\xbd\x8e\x82\xd4\x51\xf5\x2b\xfe\xc1\x93\xda\xd7\xbf\x42\xa3\xd8\x70\x73\x93\x54\x1f\xa7\x61\x47\xa3\xde\xb0\xf9\xbd\xd0\xd0\xe9\x5e\x3a\x4f\x49\x2a\xa2\x3c\x87\xb2\xe6\x89\x1c\xe3\x80\x05\xdb\xe0\xb2\x22\xc3\xb2\xa6\x43\x21\xf7\x8a\x0f\xb7\x70\xf2\x1e\x49\x91\xbf\xc1\x67\xf3\x03\xfe\x21\xff\xd8\x98\x93\x03\x69\x6f\x16\x15\x93\x3b\x91\x67\xe9\xf8\xad\x66\x65\xb7\x81\x65\xa5\x9d\x1f\xc1\x77\xfb\xb3\xdf\x88\xef\x9d\x55\xd7\xf7\x8f\x85\xec\xfa\x76\x54\x33\x9e\xef\xd8\x4d\x1b\x45\xc9\xd8\x2b\xc5\x25\xde\xb8\x04\x1f\x55\x3f\xfc\x67\xab\xc5\x13\x39\x59\x53\x32\x0e\x9c\xfd\xff\xb8\x7f\x86\x1f\xfb\x30\x3a\x49\xb3\xe9\x23\x1c\x88\xae\xa0\xfa\x21\x5b\x5b\x96\x6d\x58\xdd\x25\x8e\x57\x19\xe8\x44\x47\xa7\x28\xa2\xe8\x05\xd4\x7a\x9a\x62\x93\x98\x70\xde\xc9\x78\xe4\x63\x7c\xba\xb2\xbf\x03\x00\x00\xff\xff\xa6\x15\x1f\xf2\x8f\x05\x00\x00") +var _testImagesResourceConsumerConsumeCpuCommonGo = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x64\x92\x5f\x4f\xeb\x46\x10\xc5\x9f\x33\x9f\xe2\xc8\x4f\x31\x04\xe7\x8f\xaa\x3e\x40\x79\x48\x81\xaa\x16\x34\x91\x70\x28\xe2\x71\xb3\x1e\xdb\xa3\xda\xbb\x66\x77\x4d\x88\x2a\xbe\xfb\xd5\x26\x41\x17\x74\xfd\x62\xf9\x37\x67\x66\xce\x59\xef\xf4\x8c\x6e\x6c\xbf\x77\x52\x37\x01\x8b\xd9\x62\x8e\x4d\xc3\xb8\x1f\xb6\xec\x0c\x07\xf6\x58\x0e\xa1\xb1\xce\x67\x44\x0f\xa2\xd9\x78\x2e\x31\x98\x92\x1d\x42\xc3\x58\xf6\x4a\x37\x8c\x53\x65\x82\x7f\xd9\x79\xb1\x06\x8b\x6c\x86\x71\x14\x24\xa7\x52\x92\x5e\xd1\xde\x0e\xe8\xd4\x1e\xc6\x06\x0c\x9e\x11\x1a\xf1\xa8\xa4\x65\xf0\xbb\xe6\x3e\x40\x0c\xb4\xed\xfa\x56\x94\xd1\x8c\x9d\x84\xe6\xb0\xe4\x34\x22\xa3\x97\xd3\x00\xbb\x0d\x4a\x0c\x14\xb4\xed\xf7\xb0\xd5\x57\x15\x54\x20\x02\x80\x26\x84\xfe\x72\x3a\xdd\xed\x76\x99\x3a\xb8\xcc\xac\xab\xa7\xed\x51\xe5\xa7\x0f\xf9\xcd\xdd\xaa\xb8\xbb\x58\x64\x33\xa2\x27\xd3\xb2\xf7\x70\xfc\x3a\x88\xe3\x12\xdb\x3d\x54\xdf\xb7\xa2\xd5\xb6\x65\xb4\x6a\x07\xeb\xa0\x6a\xc7\x5c\x22\xd8\xe8\x73\xe7\x24\x88\xa9\x27\xf0\xb6\x0a\x3b\xe5\x98\x4a\xf1\xc1\xc9\x76\x08\xdf\x0e\xe8\xd3\x95\x78\x7c\x15\x58\x03\x65\x90\x2c\x0b\xe4\x45\x82\x3f\x97\x45\x5e\x4c\xe8\x39\xdf\xfc\xbd\x7e\xda\xe0\x79\xf9\xf8\xb8\x5c\x6d\xf2\xbb\x02\xeb\x47\xdc\xac\x57\xb7\xf9\x26\x5f\xaf\x0a\xac\xff\xc2\x72\xf5\x82\xfb\x7c\x75\x3b\x01\x4b\x68\xd8\x81\xdf\x7b\x17\xbd\x5b\x07\x89\x47\xc7\x65\x46\x05\xf3\xb7\xe5\x95\x3d\x9a\xf1\x3d\x6b\xa9\x44\xa3\x55\xa6\x1e\x54\xcd\xa8\xed\x1b\x3b\x23\xa6\x46\xcf\xae\x13\x1f\x7f\x9e\x87\x32\x25\xb5\xd2\x49\x50\xe1\xf0\xfd\x4b\x9c\x8c\xce\xa6\x44\xbd\xd2\xff\xc5\x21\x9d\x12\x43\x24\x5d\x6f\x5d\xc0\x98\x46\x49\xd5\xaa\x3a\xa1\x51\xd2\xa9\xd0\xc4\x77\x90\x8e\x13\x4a\x89\xb4\x35\x3e\xc0\xb7\xcc\x3d\xae\x11\x71\x76\x3b\xb8\xc3\x96\xf1\x7c\x96\xe2\xec\xc8\xfe\x91\xb6\x15\xcf\xda\x9a\x92\xa8\x1a\x8c\x46\x69\x0b\xdb\x71\x68\xc4\xd4\xe3\x14\xff\xd3\x28\x46\x12\x5c\x5e\x63\x7e\x05\xc1\x1f\x98\xcf\x8e\xcf\x15\xe4\xfc\x3c\x0a\x46\xef\xb1\x5a\xb5\x56\x85\xdf\x7f\x1b\xcf\xd2\x03\x39\xbf\x46\xf4\x94\x15\xaf\x2e\x1c\xd8\x07\x7d\x10\xbd\x29\x17\x6d\x77\x71\xab\xb6\x8e\x3d\x10\x3b\x55\x9d\xe5\x26\x8c\x93\x9f\x3c\x99\x60\x36\xc1\x17\x00\x33\x74\x5b\x76\x49\x4a\xa3\xf2\x94\xa3\x60\xfd\xad\xfb\x93\x5f\x78\xd6\xa7\xfe\x4f\x74\x08\x1b\x2f\xd3\x31\xaa\x4f\x52\x4a\xe9\x47\x00\x00\x00\xff\xff\x22\xbc\x47\x7f\x90\x03\x00\x00") + +func testImagesResourceConsumerConsumeCpuCommonGoBytes() ([]byte, error) { + return bindataRead( + _testImagesResourceConsumerConsumeCpuCommonGo, + "test/images/resource-consumer/consume-cpu/common.go", + ) +} + +func testImagesResourceConsumerConsumeCpuCommonGo() (*asset, error) { + bytes, err := testImagesResourceConsumerConsumeCpuCommonGoBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "test/images/resource-consumer/consume-cpu/common.go", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _testImagesResourceConsumerConsumeCpuConsume_cpuGo = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x7c\x51\xdf\x6f\x9c\x46\x10\x7e\x66\xfe\x8a\x29\x4f\x70\xbd\x82\x63\xb5\x95\x9a\xa6\x0f\x57\xdb\x6d\x4f\x89\xee\x2c\x73\x6e\x94\xc7\x65\x19\x60\x94\x65\x77\xbb\x3b\x98\x9c\x22\xff\xef\x15\xdc\xc5\x8e\x5b\xb5\x2f\x08\xe6\xfb\xf8\x7e\xcc\x94\x25\x7e\x5b\x8f\x6c\x1a\xfc\x66\x62\xdb\xb8\x29\x02\x94\x2b\xb8\x72\xfe\x18\xb8\xeb\x05\x2f\x2f\x5e\xfd\x80\x87\x9e\xf0\xed\x58\x53\xb0\x24\x14\x71\x33\x4a\xef\x42\x2c\x00\xde\xb1\x26\x1b\xa9\xc1\xd1\x36\x14\x50\x7a\xc2\x8d\x57\xba\x27\x3c\x23\x6b\xfc\x93\x42\x64\x67\xf1\xb2\xb8\xc0\x6c\x26\xa4\x67\x28\xcd\x7f\x86\xa3\x1b\x71\x50\x47\xb4\x4e\x70\x8c\x84\xd2\x73\xc4\x96\x0d\x21\x7d\xd2\xe4\x05\xd9\xa2\x76\x83\x37\xac\xac\x26\x9c\x58\xfa\xc5\xe4\x2c\x51\xc0\x87\xb3\x80\xab\x45\xb1\x45\x85\xda\xf9\x23\xba\xf6\x6b\x16\x2a\x01\x40\x44\xec\x45\xfc\xeb\xb2\x9c\xa6\xa9\x50\x4b\xca\xc2\x85\xae\x34\x27\x56\x2c\xdf\x6d\xaf\x6e\x76\xd5\xcd\x77\x97\xc5\x05\xc0\xbd\x35\x14\x23\x06\xfa\x6b\xe4\x40\x0d\xd6\x47\x54\xde\x1b\xd6\xaa\x36\x84\x46\x4d\xe8\x02\xaa\x2e\x10\x35\x28\x6e\xce\x39\x05\x16\xb6\xdd\x1a\xa3\x6b\x65\x52\x81\xa0\xe1\x28\x81\xeb\x51\x5e\x2c\xe8\x4b\x2a\x8e\xf8\x35\xc1\x59\x54\x16\xd3\x4d\x85\xdb\x2a\xc5\x5f\x37\xd5\xb6\x5a\xc3\xfb\xed\xe1\x8f\xfd\xfd\x01\xdf\x6f\xee\xee\x36\xbb\xc3\xf6\xa6\xc2\xfd\x1d\x5e\xed\x77\xd7\xdb\xc3\x76\xbf\xab\x70\xff\x1b\x6e\x76\x1f\xf0\xed\x76\x77\xbd\x46\x62\xe9\x29\x20\x7d\xf2\x61\xce\xee\x02\xf2\xbc\x3a\x6a\x0a\xa8\x88\x5e\x98\xb7\xee\x14\x26\x7a\xd2\xdc\xb2\x46\xa3\x6c\x37\xaa\x8e\xb0\x73\x0f\x14\x2c\xdb\x0e\x3d\x85\x81\xe3\x7c\xbc\x88\xca\x36\x60\x78\x60\x51\xb2\x7c\xff\xab\x4e\x01\xab\x12\xc0\x2b\xfd\x71\x16\x19\x14\x5b\x00\x1e\xbc\x0b\x82\x19\x24\x69\x6b\x54\x97\x42\x92\x0a\x0f\x94\x02\x24\x69\xcd\x52\x8f\xfa\x23\xc9\x72\x83\x9a\x82\xf0\x30\xc6\x9f\xca\x78\x8c\x42\x43\x14\x25\x29\xe4\x00\xed\x68\xf5\xa2\x96\xe5\xf8\x19\x92\x59\xa6\xb8\x55\x21\x52\x96\x43\x52\x96\xa8\x9d\x7d\xa0\x20\x38\xb0\x31\xac\x5d\xa0\x38\x5f\xc3\x53\xd0\x64\x45\x75\x04\xc9\x33\x72\xab\x05\x5f\xff\x82\xad\x71\x4a\x7e\xfc\x3e\x5b\x3d\x23\x39\x96\x4f\xe3\x57\x17\x39\x24\xcd\x18\x96\xa2\x33\x7f\x8e\x5c\x5c\x9f\x07\xd9\xea\x0b\x54\x91\xce\x71\x75\x42\x2b\xd2\xce\x36\x90\x44\x51\x41\x9e\xfe\xd9\xb9\x69\x4e\xd9\x72\x88\xcb\xf0\xb9\x5a\xf1\x3b\xc9\x6d\x70\xfa\xea\xf6\xbe\x52\x83\x37\x4b\x9b\xe5\x24\x8b\x1a\x5b\x4d\xd9\xa2\x95\xe3\x1b\x7c\xca\xf2\x19\x92\x44\xfb\xf1\x3f\xa5\x36\x0f\x14\x54\x47\xd9\x62\xb8\xfe\x7f\xbb\x7f\xc2\xf7\x7e\xb6\xce\xf2\xe2\xf4\x92\x43\x92\x70\x8b\xda\x8f\xc5\xc1\x89\x32\xf3\xea\xde\xe0\xcb\x55\xce\x71\x92\xc6\x55\x6e\x20\xe9\xd9\x76\x73\x87\xe4\x11\xc9\x44\x3a\x61\xa7\x32\x86\xc8\x67\x71\x7e\x2e\x38\x24\x8f\xf0\x08\x7f\x07\x00\x00\xff\xff\xd1\xeb\x56\xbd\x77\x04\x00\x00") func testImagesResourceConsumerConsumeCpuConsume_cpuGoBytes() ([]byte, error) { return bindataRead( @@ -6281,6 +6997,26 @@ func testImagesResourceConsumerConsumeCpuConsume_cpuGo() (*asset, error) { return a, nil } +var _testImagesResourceConsumerConsumeCpuConsume_cpu_windowsGo = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x54\xcd\x6e\xdb\xb8\x1a\x5d\x8b\x4f\x71\xae\x17\x17\x52\xea\x4a\x6e\x70\x71\x17\x9d\x7a\xe1\x71\x33\xad\xd1\x8e\x13\x44\xce\x14\x5d\xd2\xd2\x27\x8b\x28\x45\x6a\x48\x2a\x8a\x51\xe4\xdd\x07\x24\xe5\xfc\x76\x31\x1b\x41\xe4\xf7\x77\x78\xce\x21\x8b\x02\x6f\xf6\x83\x90\x35\x46\xa1\x6a\x3d\x5a\xc6\x8a\x33\xb6\xd6\xfd\xd1\x88\x43\xeb\x70\xbe\x38\x7f\x87\x5d\x4b\xf8\x32\xec\xc9\x28\x72\x64\xb1\x1a\x5c\xab\x8d\xcd\x19\xfb\x2a\x2a\x52\x96\x6a\x0c\xaa\x26\x03\xd7\x12\x56\x3d\xaf\x5a\xc2\x14\x99\xe3\x2f\x32\x56\x68\x85\xf3\x7c\x81\xd4\x27\xcc\xa6\xd0\x2c\xfb\x8d\x1d\xf5\x80\x8e\x1f\xa1\xb4\xc3\x60\x09\xae\x15\x16\x8d\x90\x04\xba\xab\xa8\x77\x10\x0a\x95\xee\x7a\x29\xb8\xaa\x08\xa3\x70\x6d\x18\x32\xb5\xc8\xd9\xf7\xa9\x81\xde\x3b\x2e\x14\x38\x2a\xdd\x1f\xa1\x9b\xa7\x59\xe0\x8e\x31\x00\x68\x9d\xeb\xdf\x17\xc5\x38\x8e\x39\x0f\x28\x73\x6d\x0e\x85\x8c\x59\xb6\xf8\xba\x59\x5f\x6c\xcb\x8b\xb7\xe7\xf9\x82\xb1\x1b\x25\xc9\x5a\x18\xfa\x7b\x10\x86\x6a\xec\x8f\xe0\x7d\x2f\x45\xc5\xf7\x92\x20\xf9\x08\x6d\xc0\x0f\x86\xa8\x86\xd3\x1e\xe7\x68\x84\x13\xea\x30\x87\xd5\x8d\x1b\xb9\x21\x56\x0b\xeb\x8c\xd8\x0f\xee\x19\x41\x27\x54\xc2\xe2\x69\x82\x56\xe0\x0a\xb3\x55\x89\x4d\x39\xc3\xef\xab\x72\x53\xce\xd9\xb7\xcd\xee\xf3\xe5\xcd\x0e\xdf\x56\xd7\xd7\xab\xed\x6e\x73\x51\xe2\xf2\x1a\xeb\xcb\xed\xc7\xcd\x6e\x73\xb9\x2d\x71\xf9\x07\x56\xdb\xef\xf8\xb2\xd9\x7e\x9c\x83\x84\x6b\xc9\x80\xee\x7a\xe3\xb1\x6b\x03\xe1\xa9\xa3\x3a\x67\x25\xd1\xb3\xe1\x8d\x8e\x60\x6c\x4f\x95\x68\x44\x05\xc9\xd5\x61\xe0\x07\xc2\x41\xdf\x92\x51\x42\x1d\xd0\x93\xe9\x84\xf5\xe2\x59\x70\x55\x33\x29\x3a\xe1\xb8\x0b\xeb\x57\xc7\xc9\xd9\x59\xc1\x58\xcf\xab\x1f\xbe\x49\xc7\x85\x62\x4c\x74\xbd\x36\x0e\x29\x4b\x66\x8d\xe4\x87\x19\x4b\x66\xf6\x68\x2b\x2e\xa5\xff\x75\xa2\xa3\x19\x63\x89\x3d\xda\x51\x28\xcc\x0e\xda\x63\x08\x92\xdc\x15\xf6\x68\x8b\xc9\x90\x33\x96\x31\xe6\x8e\x3d\xa1\x37\xba\x5a\x5f\xdd\x94\x8e\x3b\x0b\xeb\xcc\x50\x39\xfc\x64\xc9\x8d\x25\x03\x40\x28\xf7\xff\xff\x79\x99\x51\x14\x50\x5c\x69\x4b\x95\x56\xb5\xf5\x67\x54\xc1\x49\x83\x4f\xec\x74\x4d\x2c\x29\x8f\xd6\x51\xf7\x2f\x6a\x6c\x4c\x8c\x55\x3b\xd1\x11\x00\x8f\x3c\x0f\xff\x45\x81\xb1\x25\x15\xa9\xe4\x5d\x2f\x09\x23\xb7\x70\xfc\x07\x29\x96\xec\xb4\xe3\xf2\x05\x30\x17\xf6\x74\x03\x2e\x65\x68\x84\x46\x90\xac\x2d\xd2\x27\xe3\x33\x76\xcf\x58\x51\xe0\x9a\x9c\x11\x74\x4b\x36\x0c\xe0\x9d\x1e\x94\xf3\xb5\xeb\xab\x9b\x58\x1b\xee\x8b\xa7\xc5\xeb\xdd\x72\xeb\x8f\x58\xc3\x0a\x7f\x59\x84\x83\x75\xdc\x38\x2f\x7f\x33\xa8\xca\xaf\x9c\xdd\xea\x31\x6d\xb9\xaa\x25\x61\xd2\x22\xff\x1c\x96\x19\x52\xfb\x8c\xe1\xcc\x73\x7b\xcb\xcd\xa9\xff\x46\x35\xfa\xa1\xe6\x7a\xb0\xfc\x40\x41\xbc\xb0\xfe\x44\xee\x2a\xa6\x79\x5e\xec\x34\x62\x8e\xff\x3e\x29\xce\xd7\x86\x82\x7d\x7c\xca\x8b\xd0\xc5\x9d\x70\xbf\xd8\xfe\xe2\x9f\x1c\xf9\x8b\x80\xd7\xdc\x6f\x67\x2c\xb1\x51\x8a\x65\x94\xc5\x9f\x2f\x6c\x06\x57\x2c\xf1\xab\xa2\x7c\xfb\x48\x75\x4c\x9e\xec\xf0\x3c\xfd\x71\xf8\xeb\x82\x28\xed\x12\xd3\x9c\x37\x38\xf5\x60\x89\x21\x37\x18\x05\x3b\x69\xf8\x49\xdc\x92\x8a\xdc\xa3\x31\xba\x83\x1b\x75\x14\xaf\xd7\x42\x39\x3b\x47\xc5\x65\x35\x48\xee\x26\x99\x3b\x21\xa5\xa8\xb4\xa1\x49\xcd\xfd\x31\xc8\xec\x7b\x9d\x94\xde\x93\x1b\x69\xb2\x9d\x6f\x17\xad\x67\x27\x9d\x83\x34\x9e\x87\x46\x18\xeb\x9e\x69\x3a\x47\x3c\xc5\x0b\xa1\xa3\x43\x7f\xb2\xa4\xde\xe1\xfd\x72\xca\x09\xb4\xe6\xe5\xb0\x8f\x7d\xc2\x32\x7b\xc9\x44\x7d\xe3\x87\xf9\xa2\xf4\x54\x15\x98\x79\x8b\xa9\xc8\xaf\x32\x96\x88\x06\xf5\x0e\xcb\x25\x16\x7e\xcc\x89\xa3\x05\x4b\xee\x1f\x08\x7b\xb7\x58\x2c\x70\x86\xa9\x63\x81\x7a\xe7\x19\x0c\x27\xf2\xcf\x49\x1a\xfc\xe8\xdf\x91\xfc\x8a\x1b\x4b\x7e\x7a\x7f\xb2\x19\x19\x13\x80\x87\xa7\xc4\x9b\x71\x3d\x18\x43\xea\xe4\xc9\x34\x22\xf0\x59\xff\x59\x42\x09\x19\x40\xf4\x5c\x89\x2a\x25\x63\xb2\x00\x63\xba\x15\xb1\xcd\x93\x8b\x91\x4e\x53\x32\xc6\x92\x7a\x30\xc1\xc1\x3e\x2b\xd8\xed\xe3\xb4\x91\x9e\x9d\x42\x25\x55\x19\xce\x62\xb4\x0c\x94\xb0\x24\xdc\xc3\x87\x9a\xc9\xa2\x51\x1d\x3f\xee\xf9\xbd\xf4\x21\xff\x3a\x87\x06\xfe\x26\xa7\xa1\x3c\xc3\x07\x3c\x8c\xf7\xf0\xab\x78\xc4\x3f\x1f\xed\xf2\x7e\xf9\x42\xfb\xf9\xab\xde\x19\x4b\x3c\x13\xaf\x6b\x3f\x44\x13\xa4\x67\x8f\xf6\x0b\x84\x27\x49\xad\x4b\xdd\x91\x6b\x85\x3a\x78\xd8\xc9\x3d\x48\x5a\x8a\xb1\x08\x52\x12\xf5\xa9\xf5\xdf\x10\xf7\x6c\xde\xb3\x7f\x02\x00\x00\xff\xff\x72\x24\x92\x69\x59\x08\x00\x00") + +func testImagesResourceConsumerConsumeCpuConsume_cpu_windowsGoBytes() ([]byte, error) { + return bindataRead( + _testImagesResourceConsumerConsumeCpuConsume_cpu_windowsGo, + "test/images/resource-consumer/consume-cpu/consume_cpu_windows.go", + ) +} + +func testImagesResourceConsumerConsumeCpuConsume_cpu_windowsGo() (*asset, error) { + bytes, err := testImagesResourceConsumerConsumeCpuConsume_cpu_windowsGoBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "test/images/resource-consumer/consume-cpu/consume_cpu_windows.go", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + var _testImagesResourceConsumerResource_consumerGo = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x74\x91\x51\x6b\xdb\x4a\x10\x85\x9f\xb3\xbf\xe2\x20\xb8\x20\x05\x5d\xd9\x37\x70\x21\xa4\xe4\x41\x75\x12\x22\x12\xec\x60\x39\x0d\x79\x5c\x4b\x23\x69\xa9\xb4\xbb\xdd\x1d\x45\x31\xa5\xff\xbd\xac\xe2\x42\x42\xdb\xa7\x65\x74\xce\xcc\xf9\x34\xb3\x38\x15\x2b\x63\x0f\x4e\xb5\x1d\xe3\x6c\xf9\xdf\xff\xd8\x75\x84\xbb\x71\x4f\x4e\x13\x93\x47\x3e\x72\x67\x9c\xcf\x84\xb8\x57\x15\x69\x4f\x35\x46\x5d\x93\x03\x77\x84\xdc\xca\xaa\x23\x1c\x95\x14\x5f\xc8\x79\x65\x34\xce\xb2\x25\xe2\x60\x88\x8e\x52\x94\x7c\x12\x07\x33\x62\x90\x07\x68\xc3\x18\x3d\x81\x3b\xe5\xd1\xa8\x9e\x40\xaf\x15\x59\x86\xd2\xa8\xcc\x60\x7b\x25\x75\x45\x98\x14\x77\x73\xc8\x71\x44\x26\x9e\x8f\x03\xcc\x9e\xa5\xd2\x90\xa8\x8c\x3d\xc0\x34\xef\x5d\x90\x2c\x04\x00\x74\xcc\xf6\x62\xb1\x98\xa6\x29\x93\x33\x65\x66\x5c\xbb\xe8\xdf\x5c\x7e\x71\x5f\xac\xae\xd7\xe5\xf5\xbf\x67\xd9\x52\x88\x47\xdd\x93\xf7\x70\xf4\x6d\x54\x8e\x6a\xec\x0f\x90\xd6\xf6\xaa\x92\xfb\x9e\xd0\xcb\x09\xc6\x41\xb6\x8e\xa8\x06\x9b\xc0\x39\x39\xc5\x4a\xb7\x29\xbc\x69\x78\x92\x8e\x44\xad\x3c\x3b\xb5\x1f\xf9\xc3\x82\x7e\x51\x29\x8f\xf7\x06\xa3\x21\x35\xa2\xbc\x44\x51\x46\xf8\x9c\x97\x45\x99\x8a\xa7\x62\x77\xbb\x79\xdc\xe1\x29\xdf\x6e\xf3\xf5\xae\xb8\x2e\xb1\xd9\x62\xb5\x59\x5f\x15\xbb\x62\xb3\x2e\xb1\xb9\x41\xbe\x7e\xc6\x5d\xb1\xbe\x4a\x41\x8a\x3b\x72\xa0\x57\xeb\x02\xbb\x71\x50\x61\x75\x54\x67\xa2\x24\xfa\x10\xde\x98\x37\x18\x6f\xa9\x52\x8d\xaa\xd0\x4b\xdd\x8e\xb2\x25\xb4\xe6\x85\x9c\x56\xba\x85\x25\x37\x28\x1f\x8e\xe7\x21\x75\x2d\x7a\x35\x28\x96\x3c\xd7\xbf\xfd\x4e\x26\x4e\x17\x42\x58\x59\x7d\x0d\x43\x06\xa9\xb4\x10\x6a\xb0\xc6\x31\x62\x71\x12\x35\xbd\x6c\xa3\xf0\x0e\x1c\x9e\xde\xcc\x95\x26\x5e\x84\xa3\x44\x22\x11\xe2\x45\x3a\xcc\xfe\x4b\x04\x77\x56\x68\x8e\xa3\xf0\x21\x4a\x71\xbe\x3c\x5f\xa6\x88\x1e\x82\xac\xc7\x61\x4f\x2e\x8b\x12\x21\x9a\x51\x57\x73\x56\x9c\xe0\xbb\x38\x99\xdb\x1e\xa4\xf3\x14\x27\xe2\xc4\x91\x37\xa3\xab\x68\x65\xb4\x1f\x07\x72\xb7\x52\xd7\x3d\x39\x5c\x5c\x62\x4d\xd3\xf6\xcf\x6a\x68\xec\x4d\x9b\xdd\x48\x96\x7d\x1c\xd8\xb2\x7b\xe5\x99\x74\xae\xeb\x92\xdc\x0b\xc5\xcd\xc0\x59\x69\x9d\xd2\xdc\xc4\xd1\xc5\x3f\x75\x94\xe2\x34\x50\x26\x29\xfe\x92\x98\x24\xe2\x87\xf8\x19\x00\x00\xff\xff\x8b\x9d\x03\xcd\x55\x03\x00\x00") func testImagesResourceConsumerResource_consumerGoBytes() ([]byte, error) { @@ -6321,7 +7057,7 @@ func testImagesResourceConsumerResource_consumer_handlerGo() (*asset, error) { return a, nil } -var _testImagesResourceConsumerUtilsGo = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x94\x55\x5d\x8f\xda\x46\x14\x7d\x66\x7e\xc5\x91\xa5\x48\x90\x82\xbd\x8b\xd4\x97\xad\xf6\x81\x90\x6d\x8b\x92\x85\x68\xcd\x36\xca\xe3\x30\xbe\xd8\xa3\x7a\x66\xdc\xf9\x80\x45\x55\xfe\x7b\x35\xe6\xcb\xb0\xda\x2a\x79\x31\xc3\xdc\x73\xee\x3d\xf7\x9e\x6b\xc8\xde\xb3\xa9\x69\x76\x56\x96\x95\xc7\xf8\xe6\xf6\x57\x2c\x2b\xc2\xa7\xb0\x22\xab\xc9\x93\xc3\x24\xf8\xca\x58\x97\x32\xf6\x59\x0a\xd2\x8e\x0a\x04\x5d\x90\x85\xaf\x08\x93\x86\x8b\x8a\x70\x88\x0c\xf1\x17\x59\x27\x8d\xc6\x38\xbd\x41\x3f\x02\x92\x43\x28\x19\xfc\xc6\x76\x26\x40\xf1\x1d\xb4\xf1\x08\x8e\xe0\x2b\xe9\xb0\x96\x35\x81\x5e\x04\x35\x1e\x52\x43\x18\xd5\xd4\x92\x6b\x41\xd8\x4a\x5f\xb5\x45\x0e\x29\x52\xf6\xed\x90\xc0\xac\x3c\x97\x1a\x1c\xc2\x34\x3b\x98\x75\x17\x05\xee\x19\x03\x80\xca\xfb\xe6\x2e\xcb\xb6\xdb\x6d\xca\x5b\x95\xa9\xb1\x65\x56\xef\x51\x2e\xfb\x3c\x9b\x3e\xcc\xf3\x87\xd1\x38\xbd\x61\xec\x59\xd7\xe4\x1c\x2c\xfd\x13\xa4\xa5\x02\xab\x1d\x78\xd3\xd4\x52\xf0\x55\x4d\xa8\xf9\x16\xc6\x82\x97\x96\xa8\x80\x37\x51\xe7\xd6\x4a\x2f\x75\x39\x84\x33\x6b\xbf\xe5\x96\x58\x21\x9d\xb7\x72\x15\xfc\xc5\x80\x8e\xaa\xa4\x43\x17\x60\x34\xb8\x46\x32\xc9\x31\xcb\x13\x7c\x98\xe4\xb3\x7c\xc8\xbe\xce\x96\x7f\x2e\x9e\x97\xf8\x3a\x79\x7a\x9a\xcc\x97\xb3\x87\x1c\x8b\x27\x4c\x17\xf3\x8f\xb3\xe5\x6c\x31\xcf\xb1\xf8\x1d\x93\xf9\x37\x7c\x9a\xcd\x3f\x0e\x41\xd2\x57\x64\x41\x2f\x8d\x8d\xda\x8d\x85\x8c\xa3\xa3\x22\x65\x39\xd1\x45\xf1\xb5\xd9\x8b\x71\x0d\x09\xb9\x96\x02\x35\xd7\x65\xe0\x25\xa1\x34\x1b\xb2\x5a\xea\x12\x0d\x59\x25\x5d\x34\xcf\x81\xeb\x82\xd5\x52\x49\xcf\x7d\xfb\xfd\x55\x3b\x29\x7b\x9f\x31\xd6\x70\xf1\x77\x4c\xa2\xb8\xd4\x8c\x49\xd5\x18\xeb\xd1\x67\xbd\x64\xad\x7c\xc2\x7a\x49\x6d\xca\xf8\x61\x5c\x46\x2f\x24\xe2\xd1\x79\x2b\x8c\xde\x24\x6c\xc0\x98\x30\xda\xb5\xf0\x78\x08\x8a\xa6\x5f\x9e\x3f\x48\xcd\xed\x0e\xf7\x48\xd2\xec\x70\x3b\x12\x4d\xe8\x9e\x93\x13\xfe\x91\xd4\x19\xef\x7c\x1c\x42\x9b\x37\xcb\x30\x3d\x65\xc4\x01\xec\xc0\x51\xca\x0d\x69\xe8\xa0\x56\x64\xe3\xd2\x28\x59\xd7\x52\x18\x4b\xee\x7a\x40\x54\xa0\x08\xb6\x6d\x3e\x65\xeb\xa0\x45\x27\x63\xbf\x43\x93\xda\x0f\x4f\xc8\x9c\x44\xbc\x18\xe0\x5f\xd6\xab\x4d\x99\x7e\xb1\x52\xfb\x75\x3f\xe9\x88\x39\x53\xef\xf0\x6e\x73\x41\x8d\x17\xc9\xb0\x83\xb8\x88\x0e\x58\x2f\xcb\x20\x2c\xf1\xb8\x74\xd0\xb4\x3d\x36\x06\xd1\x04\x34\xd6\x08\x72\x8e\xf5\xb8\x2d\x6f\x71\x77\x8f\xb5\xf2\x69\xde\x1c\x04\x8c\xce\x49\xef\xdf\x15\x17\x45\x06\x2d\x65\xfc\x9a\x72\xac\x3d\x72\x24\xf6\xa4\x4b\x35\x67\xcf\x22\x37\xda\x9b\x4e\x8d\x52\x5c\x17\xfd\x6b\x3b\x87\x88\xaa\xda\xe7\xf8\x82\x99\x3e\x05\xdd\x1f\xb0\xef\x5d\xcb\x1e\x49\xfd\xaf\x65\x54\xf2\xd5\xce\xff\x84\x63\x8f\xa4\xfa\x67\xd6\xcf\x18\x16\xa5\x9c\x98\x6f\xfa\x75\x04\x5c\x0f\xe8\x14\xc8\xbd\x8d\x96\xdd\xdd\xe3\xb0\xfc\xe9\xcc\x1b\x7e\xd6\x34\xc0\x2f\x48\x1e\x13\xd6\xeb\xf0\xdf\xe0\xfc\xd8\x42\x28\x52\xc6\xee\xce\x3b\x71\x7e\x5d\xde\xb2\xea\xf4\x26\x0d\x91\x8c\x54\x32\x44\x72\x1b\x1f\xa3\xd1\x46\x8d\x5a\x8d\xdd\x46\xf7\xda\x8e\xe1\x8a\xeb\x32\x62\x6f\x5a\x82\xbf\xdc\x93\x3d\x74\xd0\x95\x70\xe1\xf9\x1f\xe4\xa7\xc1\x5a\xd2\x3e\xf7\xdc\x07\x87\x76\xfd\x1c\x4c\xf0\xe0\xd0\x66\x64\x9a\x83\x99\xd7\xc8\xfe\x2b\xd3\xae\x11\xc9\x7e\x42\xf1\xaf\x26\xfe\x2c\x92\x22\xed\xa9\x60\xdf\xd9\x7f\x01\x00\x00\xff\xff\x36\xd7\xfc\x69\xf0\x06\x00\x00") +var _testImagesResourceConsumerUtilsGo = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x74\x94\xd1\x8f\xda\x38\x10\xc6\x9f\xf1\x5f\xf1\xd5\xd2\x49\xd0\x42\xb2\xdd\xc7\x3d\xed\x03\xa5\x7b\xba\xa8\x2d\x54\x84\xbd\xaa\x8f\xc6\x19\x12\xeb\x12\x3b\x37\x76\xc8\xa2\x53\xff\xf7\x93\x81\x85\xd0\x53\x5f\x90\xf1\xfc\x66\xe6\x9b\x6f\xac\xa4\x29\xde\x6d\x3b\x53\x17\x78\xd3\x1b\x5b\xb8\xde\x0b\x91\xbe\x15\x0b\xd7\x1e\xd8\x94\x55\xc0\xfd\xdd\xfd\x7b\x6c\x2a\xc2\xa7\x6e\x4b\x6c\x29\x90\xc7\xbc\x0b\x95\x63\x9f\x08\xf1\xd9\x68\xb2\x9e\x0a\x74\xb6\x20\x46\xa8\x08\xf3\x56\xe9\x8a\x70\x8e\x4c\xf1\x17\xb1\x37\xce\xe2\x3e\xb9\xc3\x38\x02\xf2\x1c\x92\x93\xdf\xc5\xc1\x75\x68\xd4\x01\xd6\x05\x74\x9e\x10\x2a\xe3\xb1\x33\x35\x81\x5e\x34\xb5\x01\xc6\x42\xbb\xa6\xad\x8d\xb2\x9a\xd0\x9b\x50\x1d\x9b\x9c\x4b\x24\xe2\xfb\xb9\x80\xdb\x06\x65\x2c\x14\xb4\x6b\x0f\x70\xbb\x21\x05\x15\x84\x00\x80\x2a\x84\xf6\x21\x4d\xfb\xbe\x4f\xd4\x51\x65\xe2\xb8\x4c\xeb\x13\xe5\xd3\xcf\xd9\xe2\x69\x99\x3f\xcd\xee\x93\x3b\x21\x9e\x6d\x4d\xde\x83\xe9\x9f\xce\x30\x15\xd8\x1e\xa0\xda\xb6\x36\x5a\x6d\x6b\x42\xad\x7a\x38\x86\x2a\x99\xa8\x40\x70\x51\x67\xcf\x26\x18\x5b\x4e\xe1\xdd\x2e\xf4\x8a\x49\x14\xc6\x07\x36\xdb\x2e\xdc\x18\xf4\xaa\xca\x78\x0c\x01\x67\xa1\x2c\xe4\x3c\x47\x96\x4b\x7c\x98\xe7\x59\x3e\x15\xdf\xb2\xcd\x9f\xab\xe7\x0d\xbe\xcd\xd7\xeb\xf9\x72\x93\x3d\xe5\x58\xad\xb1\x58\x2d\x3f\x66\x9b\x6c\xb5\xcc\xb1\xfa\x03\xf3\xe5\x77\x7c\xca\x96\x1f\xa7\x20\x13\x2a\x62\xd0\x4b\xcb\x51\xbb\x63\x98\x68\x1d\x15\x89\xc8\x89\x6e\x9a\xef\xdc\x49\x8c\x6f\x49\x9b\x9d\xd1\xa8\x95\x2d\x3b\x55\x12\x4a\xb7\x27\xb6\xc6\x96\x68\x89\x1b\xe3\xe3\xf2\x3c\x94\x2d\x44\x6d\x1a\x13\x54\x38\xfe\xff\xdf\x38\x89\x78\x9b\x0a\xd1\x2a\xfd\x77\x2c\xd2\x28\x63\x85\x30\x4d\xeb\x38\x60\x2c\x46\xb2\x76\xa5\x14\x23\xe9\x7c\x4a\x2f\xa4\xe3\xd1\x07\xd6\xce\xee\xa5\x98\x08\xb1\x57\x1c\x29\xed\xac\xef\x1a\x5a\x7c\x7d\xfe\x60\xac\xe2\x03\x1e\x21\x93\xf4\x7c\x3b\xd3\x6d\x37\x3c\xcb\x0b\xff\x85\x9a\x2b\xef\x43\x9c\xfd\x58\x35\x4d\xb1\xb8\x10\x38\xc3\x1e\x0a\xa5\xd9\x93\x85\xed\x9a\x2d\x71\x7c\x2b\x0d\x95\x6a\x7b\x88\x2f\xfb\x27\x5b\xa8\x40\xd1\xf1\x71\xe4\x44\xec\x3a\xab\x07\x05\xc7\xd7\x2c\x63\xc3\xf4\x02\xe6\xa4\xe3\xc5\x04\xff\x8a\x51\xed\xca\xe4\x2b\x1b\x1b\x76\x63\x39\x90\x72\xc9\x7c\xc0\x6f\xfb\x9b\xcc\x78\x21\xa7\x57\xe0\x26\x38\x11\xa3\x4b\x20\x0f\x1c\x57\xf4\xf0\x88\xb3\x8f\x49\x16\x9c\xba\x6a\x9a\xe0\x1d\xe4\x17\x29\x46\x83\xfc\x5f\xe4\xdc\x76\x48\x53\x68\x26\x15\x5f\x32\x2c\xf5\xaf\xb6\xa1\xa1\xc6\xf1\x01\x2d\x3b\x4d\xde\x0f\xbd\x8f\x05\xe3\x52\x93\x85\x6b\x1a\x65\x8b\xf1\xcf\x6b\x99\x42\xce\x1a\x39\x85\x7c\x1f\x7f\x66\xb3\x7d\x33\x3b\x6a\x1c\x0e\x7a\xd2\xf6\x1a\xae\x94\x2d\x23\x7b\x77\x4c\x08\xf2\xc6\x86\x13\x3a\x11\x23\x62\x8e\xbd\xaf\xed\x92\x75\x67\xc7\x13\x31\x32\x3b\xc4\xd8\x9b\x47\x58\x53\xc7\x3d\xdc\x2c\xe2\x89\xd9\x31\xfa\x2a\x7e\x65\x4e\xb9\x71\xd6\xd3\x7c\x67\xff\x89\x79\x22\x46\x3f\xc4\x0f\xf1\x5f\x00\x00\x00\xff\xff\x37\x39\x1d\xae\x20\x05\x00\x00") func testImagesResourceConsumerUtilsGoBytes() ([]byte, error) { return bindataRead( @@ -6341,7 +7077,47 @@ func testImagesResourceConsumerUtilsGo() (*asset, error) { return a, nil } -var _testImagesSampleApiserverBaseimage = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x8e\xd1\x0a\xc3\x20\x0c\x45\xdf\xfb\x31\xea\x66\x11\x53\xf0\x63\xc4\x3a\x10\x8c\x4a\xdc\x6c\x3f\x7f\xb8\x75\x30\xe6\x1e\xfa\x72\x03\xb9\xe7\x90\xc4\x90\x1e\x3b\xb7\xb8\xaa\xd9\xd8\x58\x42\xf2\x8b\x64\x7a\x3a\xd6\x84\xc6\x12\xca\x6b\x53\xfc\x5f\xd9\x9d\x9e\x4d\x8f\x75\x29\x4e\xcd\xd1\x9b\x63\x8e\x40\x95\x20\x76\xf3\xca\xef\x72\x0b\x69\xcd\x5b\x7d\xbf\xc4\x2f\x5a\x80\x41\x47\x0c\x83\xa3\x5c\xf3\xed\xce\x5c\x46\xfe\x81\x92\x4d\xb9\x7a\x6a\x9e\x96\x4e\xfe\xca\x20\xe4\x49\x19\x84\x1c\xe5\xb3\x97\x41\xc0\xf4\x0c\x00\x00\xff\xff\xb9\xda\xfe\xbd\x48\x01\x00\x00") +var _testImagesResourceConsumerUtils_commonGo = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x64\x54\x4d\x6f\xe3\x36\x10\x3d\x9b\xbf\xe2\x55\xc0\x02\xf6\xc2\x91\xb2\x06\x7a\x49\x91\x83\xd7\x9b\xb6\xc6\x2e\xec\x20\x72\xba\xc8\x91\xa6\x46\xd2\xa0\x12\xa9\x0e\xa9\x28\x46\x91\xff\x5e\xd0\x76\x6a\x3b\xb9\xe8\x83\xf3\xde\xcc\x9b\x37\x24\xb3\xcf\x6a\xe1\xba\x9d\x70\x55\x07\xcc\xae\xbf\xfc\x8a\x4d\x4d\xf8\xde\x6f\x49\x2c\x05\xf2\x98\xf7\xa1\x76\xe2\x53\xa5\x7e\xb0\x21\xeb\xa9\x40\x6f\x0b\x12\x84\x9a\x30\xef\xb4\xa9\x09\xc7\xc8\x14\x7f\x91\x78\x76\x16\xb3\xf4\x1a\xe3\x08\x48\x8e\xa1\x64\xf2\x9b\xda\xb9\x1e\xad\xde\xc1\xba\x80\xde\x13\x42\xcd\x1e\x25\x37\x04\x7a\x31\xd4\x05\xb0\x85\x71\x6d\xd7\xb0\xb6\x86\x30\x70\xa8\xf7\x45\x8e\x29\x52\xf5\x74\x4c\xe0\xb6\x41\xb3\x85\x86\x71\xdd\x0e\xae\x3c\x47\x41\x07\xa5\x00\xa0\x0e\xa1\xbb\xc9\xb2\x61\x18\x52\xbd\x57\x99\x3a\xa9\xb2\xe6\x80\xf2\xd9\x8f\xe5\xe2\x6e\x95\xdf\x5d\xcd\xd2\x6b\xa5\x1e\x6d\x43\xde\x43\xe8\x9f\x9e\x85\x0a\x6c\x77\xd0\x5d\xd7\xb0\xd1\xdb\x86\xd0\xe8\x01\x4e\xa0\x2b\x21\x2a\x10\x5c\xd4\x39\x08\x07\xb6\xd5\x14\xde\x95\x61\xd0\x42\xaa\x60\x1f\x84\xb7\x7d\xb8\x30\xe8\x4d\x15\x7b\x9c\x03\x9c\x85\xb6\x48\xe6\x39\x96\x79\x82\xaf\xf3\x7c\x99\x4f\xd5\xcf\xe5\xe6\xcf\xf5\xe3\x06\x3f\xe7\x0f\x0f\xf3\xd5\x66\x79\x97\x63\xfd\x80\xc5\x7a\xf5\x6d\xb9\x59\xae\x57\x39\xd6\xbf\x63\xbe\x7a\xc2\xf7\xe5\xea\xdb\x14\xc4\xa1\x26\x01\xbd\x74\x12\xb5\x3b\x01\x47\xeb\xa8\x48\x55\x4e\x74\x51\xbc\x74\x07\x31\xbe\x23\xc3\x25\x1b\x34\xda\x56\xbd\xae\x08\x95\x7b\x26\xb1\x6c\x2b\x74\x24\x2d\xfb\x38\x3c\x0f\x6d\x0b\xd5\x70\xcb\x41\x87\xfd\xff\x87\x76\x52\xf5\x39\x53\xaa\xd3\xe6\xef\x98\xa4\xd5\x6c\x95\xe2\xb6\x73\x12\x30\x56\xa3\xa4\x6c\x43\xa2\x46\x49\xe3\xaa\xf8\x72\x3e\xa3\x17\x32\x89\x9a\x28\x95\x65\x58\x38\xeb\xfb\x96\x16\xf7\x8f\x30\x87\x4f\x0f\x8d\x8a\x9f\xc9\xc2\xf6\xed\x96\x24\x4e\xb4\xe5\xa6\x61\xe3\x84\xfc\x7b\xf5\x54\xa0\xe8\x65\xaf\x2c\x55\x65\x6f\xcd\x59\xc6\xf1\x19\x8d\x6d\x98\xfe\x8f\xcc\xc9\xc4\x85\x09\xfe\x55\xa3\xc6\x55\xe9\xbd\xb0\x0d\xe5\x38\x39\x13\x73\xa2\xde\xe0\xd3\xf3\x05\x35\x2e\x24\xd3\x33\xc4\x45\x74\xa2\x46\x59\x06\x23\xa4\xe3\x8e\x80\xa5\xe1\xad\x31\x98\xae\x47\x27\xce\x90\xf7\x6a\xa4\xa5\xfa\x82\x9b\x5b\x94\x6d\x48\xf3\xee\x28\xe0\xea\x94\xf4\xf6\x53\x71\x51\x64\xb2\xa7\xcc\x3e\x52\xde\x6a\x5f\x79\x32\x07\xd2\xa5\x1a\x73\x6a\xea\xe6\x16\xd1\xfb\x74\xe1\xda\x56\xdb\x62\x7c\x0a\x7d\x65\xab\x65\x37\x45\x54\xb5\x7f\xce\x26\x6a\x44\x22\x91\x72\x42\xa5\x0f\xbd\x1d\x4f\xd4\x88\x4b\xc4\xd8\x2f\xb7\xb0\xdc\x44\x13\x2f\x5c\xbc\x13\x71\x82\xa1\x8e\x47\xf9\xc0\x8d\x46\x2c\xee\x1f\x8f\xc6\x91\xc8\x44\x8d\x5e\xd5\xeb\x7e\x03\xfc\x41\x61\xd1\x8b\x90\x0d\x79\xd0\xa1\xf7\xd8\x37\xe6\xe1\xfa\x00\x0d\xeb\xae\x5c\x77\x1c\xec\x7b\xe4\xf8\xc3\xfc\xde\x23\x92\xc3\x30\xe2\x0d\x13\x4f\x03\xb5\x64\x03\x15\xea\x55\xfd\x17\x00\x00\xff\xff\xa9\x42\xbb\xc2\xe7\x04\x00\x00") + +func testImagesResourceConsumerUtils_commonGoBytes() ([]byte, error) { + return bindataRead( + _testImagesResourceConsumerUtils_commonGo, + "test/images/resource-consumer/utils_common.go", + ) +} + +func testImagesResourceConsumerUtils_commonGo() (*asset, error) { + bytes, err := testImagesResourceConsumerUtils_commonGoBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "test/images/resource-consumer/utils_common.go", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _testImagesResourceConsumerUtils_windowsGo = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x74\x54\x41\x6f\xdb\x38\x13\x3d\x8b\xbf\xe2\x55\xc0\x87\xcf\xea\xba\x52\x9a\x63\x8a\x1c\x5c\x27\xc5\x1a\xe9\x3a\x41\x94\x6c\xd1\x23\x4d\x8d\x65\xa2\x14\xa9\x1d\x52\x56\x8c\x45\xfe\xfb\x82\xb2\x63\x5b\x59\xec\x4d\xe4\xbc\x37\xf3\xe6\xcd\x88\x45\x81\xdf\x56\x9d\x36\x15\x7a\x6d\x2b\xd7\x7b\x21\x8a\x8f\x62\xee\xda\x1d\xeb\x7a\x13\x70\x79\x71\xf9\x19\x4f\x1b\xc2\x5d\xb7\x22\xb6\x14\xc8\x63\xd6\x85\x8d\x63\x9f\x0b\xf1\x5d\x2b\xb2\x9e\x2a\x74\xb6\x22\x46\xd8\x10\x66\xad\x54\x1b\xc2\x21\x32\xc5\x9f\xc4\x5e\x3b\x8b\xcb\xfc\x02\x93\x08\x48\x0f\xa1\x34\xfb\x22\x76\xae\x43\x23\x77\xb0\x2e\xa0\xf3\x84\xb0\xd1\x1e\x6b\x6d\x08\xf4\xa2\xa8\x0d\xd0\x16\xca\x35\xad\xd1\xd2\x2a\x42\xaf\xc3\x66\x28\x72\x48\x91\x8b\x9f\x87\x04\x6e\x15\xa4\xb6\x90\x50\xae\xdd\xc1\xad\xcf\x51\x90\x41\x08\x00\xd8\x84\xd0\x5e\x15\x45\xdf\xf7\xb9\x1c\x54\xe6\x8e\xeb\xc2\xec\x51\xbe\xf8\xbe\x98\xdf\x2e\xcb\xdb\x4f\x97\xf9\x85\x10\xcf\xd6\x90\xf7\x60\xfa\xab\xd3\x4c\x15\x56\x3b\xc8\xb6\x35\x5a\xc9\x95\x21\x18\xd9\xc3\x31\x64\xcd\x44\x15\x82\x8b\x3a\x7b\xd6\x41\xdb\x7a\x0a\xef\xd6\xa1\x97\x4c\xa2\xd2\x3e\xb0\x5e\x75\x61\x64\xd0\x9b\x2a\xed\x71\x0e\x70\x16\xd2\x22\x9d\x95\x58\x94\x29\xbe\xce\xca\x45\x39\x15\x3f\x16\x4f\xbf\xdf\x3f\x3f\xe1\xc7\xec\xf1\x71\xb6\x7c\x5a\xdc\x96\xb8\x7f\xc4\xfc\x7e\x79\xb3\x78\x5a\xdc\x2f\x4b\xdc\x7f\xc3\x6c\xf9\x13\x77\x8b\xe5\xcd\x14\xa4\xc3\x86\x18\xf4\xd2\x72\xd4\xee\x18\x3a\x5a\x47\x55\x2e\x4a\xa2\x51\xf1\xb5\xdb\x8b\xf1\x2d\x29\xbd\xd6\x0a\x46\xda\xba\x93\x35\xa1\x76\x5b\x62\xab\x6d\x8d\x96\xb8\xd1\x3e\x0e\xcf\x43\xda\x4a\x18\xdd\xe8\x20\xc3\x70\xfe\x57\x3b\xb9\xf8\x58\x08\xd1\x4a\xf5\x2b\x26\x69\xa4\xb6\x42\xe8\xa6\x75\x1c\x30\x11\x49\x6a\x5c\x9d\x8a\x24\x75\xbe\xa0\x17\x52\xf1\xd3\x07\x56\xce\x6e\xe3\x67\xd0\x0d\xa5\x22\x13\x62\x2b\x39\xa2\x95\xb3\xbe\x6b\x68\xfe\xf0\xfc\x55\x5b\xc9\x3b\x5c\x23\xcd\x8b\xc3\xed\x27\xd5\x76\xe7\xdf\x39\xbd\x50\x7a\xe4\xfc\x41\xcd\x89\x13\xc8\x87\x41\xf4\x1e\x93\x09\x51\x14\x98\x1f\x81\x38\x70\x3c\x24\x6a\xbd\x25\x0b\xdb\x35\x2b\xe2\xb8\x3e\x0d\xd5\x72\xb5\x8b\xcb\xfe\xce\x29\xaa\x50\x75\x3c\xb8\x90\x8b\x75\x67\xd5\x59\xc2\xc9\x89\xa5\x6d\x98\x1e\x81\x25\xa9\x78\x91\xe1\x6f\x91\x18\x57\xe7\x0f\xac\x6d\x58\x4f\xd2\x33\x29\x47\xe6\x15\xfe\xb7\x1d\x31\xe3\x45\x3a\x3d\x01\x46\xc1\x4c\x24\xc7\x40\x19\x38\x4e\xed\xea\x1a\x07\x6b\xf3\x45\x70\xf2\xa4\x29\x13\xc9\x19\xf3\x3f\xd0\xe3\xdc\x45\x01\xc5\x24\xe3\x5a\xc3\x52\xff\x66\x18\x1a\x6a\x1c\xef\xd0\xb2\x53\xe4\xfd\xb9\xf9\x31\x61\x9c\x70\x3e\x77\x4d\x23\x6d\x35\x79\x3f\x97\x29\xd2\x4f\x52\xc5\x7f\x9b\x3a\x23\xd3\x78\xe4\xf3\xf6\xf6\xba\xe2\x35\xc5\xe0\x45\x3a\xea\xf7\x14\x55\x31\xfa\x39\xcd\x44\x42\xcc\xb1\xea\xa9\x50\x5e\x06\xc9\x61\x92\x89\x44\xaf\x11\xa3\x1f\xae\x61\xb5\x89\xee\x8f\xec\xbf\x65\x76\x8c\x7e\x13\x9f\x9b\x3d\x3b\xf6\xb9\xef\xed\xe0\x3a\x31\x67\x22\x49\x98\x42\xc7\x56\x24\xaf\x62\xf0\xe4\xb8\x57\xa8\x1c\xf9\xe1\xf1\x22\x5b\x41\xae\x03\xf1\x68\xe8\x64\x64\xeb\xa9\x8a\x4f\x02\x7a\xfa\xbf\x31\xf0\xc1\xb5\xd0\x01\xae\x63\x4f\x66\x4b\x3e\x17\x49\x5c\xff\x7c\x16\xc9\xdf\x3a\xab\x26\xc3\xf1\xe6\x90\x65\x34\x90\x8f\x43\xa8\x24\xe5\x6c\x35\x45\x5c\xbe\xc9\xb0\x53\x6f\x7d\x8e\x5d\x78\xd8\x4f\x27\xbf\xd3\xc6\x4c\xb2\x2f\xef\x9d\x78\xb7\x89\x9d\xa9\x86\x46\x7e\x69\x63\xce\x1a\x3c\x8c\xf8\x03\x06\xb3\xc6\xae\xbc\x8a\xe4\x35\x13\xaf\xe2\x9f\x00\x00\x00\xff\xff\x35\x93\xb4\x49\x43\x06\x00\x00") + +func testImagesResourceConsumerUtils_windowsGoBytes() ([]byte, error) { + return bindataRead( + _testImagesResourceConsumerUtils_windowsGo, + "test/images/resource-consumer/utils_windows.go", + ) +} + +func testImagesResourceConsumerUtils_windowsGo() (*asset, error) { + bytes, err := testImagesResourceConsumerUtils_windowsGoBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "test/images/resource-consumer/utils_windows.go", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _testImagesSampleApiserverBaseimage = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x8e\xc1\xaa\xc3\x20\x10\x45\xf7\xf9\x98\x38\x4f\x43\x88\x01\xf7\xf9\x0d\x31\x3e\x10\x1c\x95\xb1\x35\xf9\xfc\x62\x9b\x42\xa9\x5d\xb8\xb9\x82\xf7\x1c\xee\x78\x17\xee\x27\xd3\xb8\xcf\x93\xd2\x3e\xb9\x60\x57\x31\x2e\xc3\xf5\x4d\xa8\x34\xa1\xe0\x65\x66\xbf\xca\xea\xd4\x2c\x4b\x5b\xa7\x64\xe6\xc9\x5b\x75\xbd\x2d\x90\x85\x84\x53\x3d\xf3\xb3\x3c\x5c\xd8\xe3\x91\x5f\x27\xb1\xbf\x05\xa4\x42\x43\x23\x3a\x43\x31\xc7\xff\xdb\x68\x22\xb2\x37\x14\x74\x88\xd9\x52\xb1\xb4\x56\xf2\x5b\x96\x20\x3a\x65\x09\xa2\x95\x7b\x97\x65\xb3\xcc\x01\xa6\x3e\xb9\x92\x8d\xbc\xf1\x5e\x79\xe3\xc3\x23\x00\x00\xff\xff\xf7\xf4\x55\x93\xc2\x01\x00\x00") func testImagesSampleApiserverBaseimageBytes() ([]byte, error) { return bindataRead( @@ -6401,7 +7177,7 @@ func testImagesSampleApiserverDockerfile_windows() (*asset, error) { return a, nil } -var _testImagesSampleApiserverMakefile = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x54\x61\x6f\xdb\x36\x10\xfd\x1c\xfe\x8a\x07\x2b\xe8\x9a\xc1\x92\xec\x60\x5d\x87\x14\xc6\xa6\xda\x9e\x63\x34\xb5\x06\xcb\x69\xd1\xa1\x40\x40\x49\x67\x89\x8b\x44\x6a\x24\x65\xd9\x08\xf2\xdf\x07\xca\x4e\xba\x22\x18\x30\x7f\x91\x25\xde\xbd\x7b\xf7\xf8\xee\x3c\x4c\x55\x73\xd0\xa2\x28\x2d\x2e\x47\x97\x23\x6c\x4a\xc2\x87\x36\x25\x2d\xc9\x92\x41\xd4\xda\x52\x69\x13\x30\x8f\x79\xb8\x11\x19\x49\x43\x39\x5a\x99\x93\x86\x2d\x09\x51\xc3\xb3\x92\x9e\x4e\x86\xf8\x44\xda\x08\x25\x71\x19\x8c\xf0\xda\x05\x0c\x4e\x47\x83\x8b\x77\xcc\xc3\x41\xb5\xa8\xf9\x01\x52\x59\xb4\x86\x60\x4b\x61\xb0\x15\x15\x81\xf6\x19\x35\x16\x42\x22\x53\x75\x53\x09\x2e\x33\x42\x27\x6c\xd9\x97\x39\x81\x04\xcc\xc3\x97\x13\x84\x4a\x2d\x17\x12\x1c\x99\x6a\x0e\x50\xdb\x7f\xc7\x81\xdb\x9e\xb0\xfb\x95\xd6\x36\x57\x61\xd8\x75\x5d\xc0\x7b\xb2\x81\xd2\x45\x58\x1d\x03\x4d\x78\xb3\x9c\xce\x57\xc9\xdc\xbf\x0c\x46\x7d\xca\xad\xac\xc8\x18\x68\xfa\xbb\x15\x9a\x72\xa4\x07\xf0\xa6\xa9\x44\xc6\xd3\x8a\x50\xf1\x0e\x4a\x83\x17\x9a\x28\x87\x55\x8e\x6f\xa7\x85\x15\xb2\x18\xc2\xa8\xad\xed\xb8\x26\xe6\x21\x17\xc6\x6a\x91\xb6\xf6\x3b\xb1\x9e\xd8\x09\xf3\x5d\x80\x92\xe0\x12\x83\x28\xc1\x32\x19\xe0\x7d\x94\x2c\x93\x21\xf3\xf0\x79\xb9\xb9\x8e\x6f\x37\xf8\x1c\xad\xd7\xd1\x6a\xb3\x9c\x27\x88\xd7\x98\xc6\xab\xd9\x72\xb3\x8c\x57\x09\xe2\xdf\x11\xad\xbe\xe0\xc3\x72\x35\x1b\x82\x84\x2d\x49\x83\xf6\x8d\x76\xfc\x95\x86\x70\x32\x52\xee\x34\x4b\x88\xbe\x23\xb0\x55\x47\x42\xa6\xa1\x4c\x6c\x45\x86\x8a\xcb\xa2\xe5\x05\xa1\x50\x3b\xd2\x52\xc8\x02\x0d\xe9\x5a\x18\x77\x99\x06\x5c\xe6\xcc\x43\x25\x6a\x61\xb9\xed\xbf\xbc\x68\x2a\x60\x2c\x4e\xf0\xeb\x04\x95\x90\xed\x9e\x45\xeb\xe9\xb5\x7b\xe3\x75\xfe\xf3\x4f\x6c\x13\xad\x17\xf3\x8d\x7b\x3f\x7f\x3d\xbd\x5d\xcf\x96\xeb\x0b\xb6\x88\xa3\xf5\x47\x4c\xf0\x96\x2d\xe2\x9b\x68\xb5\xb8\xfb\x34\x5f\x27\xcb\x78\xd5\x63\x70\x4b\xc6\xb2\x64\x3d\xbd\x9b\x2d\xd7\x70\x69\x52\xd9\x5c\x68\x9c\xbf\x36\x25\x55\x15\x9a\x2e\xbf\xb8\x60\xb4\x6f\x94\xb6\x8c\x79\x78\xdf\x8a\x2a\xc7\x6e\x1c\x8c\xdf\x06\x23\x77\x31\x24\x4d\xab\x8f\x5d\x67\xad\xd6\x24\x2d\x34\x55\xc4\x0d\xc1\xb4\x8d\x4b\x33\xe0\x68\xb4\x50\x1a\xbb\x93\x69\x4f\x26\x32\xbc\x6e\x2a\x02\x6f\x84\x21\xbd\x23\xcd\x3c\x2c\xc8\xf6\x66\x54\xad\x45\xea\x4a\x39\x85\xac\x42\xa3\x9a\xd6\x91\x45\xad\xf2\xb6\x22\x64\xce\x60\xcc\x73\x53\x24\x87\x28\x4e\x59\x88\x93\xd0\x09\xe2\x3f\xeb\x4d\x72\xe7\xd2\x7b\x28\x96\x0a\x79\xc5\xce\x72\x95\xdd\x93\x86\x6e\x25\x7c\x5f\xd7\xf0\x85\x85\xbf\xc3\xe0\xfc\xe1\xa8\xde\xe3\xd5\xb7\x7f\x7f\x0e\x70\xff\x8b\x09\x8a\x4c\x07\x42\x85\x3d\x8a\x2f\x6a\x5e\x50\x78\xdf\xa6\xe4\x67\x5a\x19\x73\xe5\xc4\x78\x13\xbc\xf1\xc7\xf8\xca\xce\xce\xc2\x54\xc8\x30\xe5\xa6\x84\x9f\x61\xe0\xbe\x9c\xd5\xf7\x4e\x51\xbf\x41\x58\xa8\xd0\xe8\xac\x7f\xa6\x42\xe2\xd5\xab\x3e\xe5\x6c\x11\x8f\xc7\xe3\x8f\xf1\xec\xf6\x66\x3e\x51\x12\x85\xea\x3b\xf2\xf3\xbe\xb8\x50\xe1\x51\x28\xff\x59\xa8\xdf\x76\xa3\xa3\xfe\xff\x01\x30\x5d\xc4\x77\xf3\x55\xf4\xfe\x66\x3e\x9b\x8c\xd0\x1b\x60\x72\xfe\xd0\x3f\x1f\xb1\x88\xe3\x64\x72\xfe\x10\x27\x8f\xfd\xc9\xf4\x7a\x72\xfe\xe0\x1e\x8f\x4f\x75\xff\x6f\xd1\xad\x90\xf9\x73\x2b\xbe\xe4\xf5\xd3\x8d\x7e\xcb\xf9\x11\x3e\xed\x29\x43\xd6\xe0\xe1\x11\xcf\xba\xbe\xc0\xc6\xd7\x77\x03\x07\xe9\xf5\x13\xc3\x75\x3d\x74\x64\x84\x34\x96\x57\x95\x5b\x60\xe6\xa9\x50\xd8\xdb\xfe\xae\x0f\x31\x0a\x7f\xb5\xc6\xa2\x27\xe2\x0c\xd5\x2f\x38\x2e\xf3\xe3\xaa\x12\xd6\x5d\xbd\x2d\xe9\x88\xac\x95\xb2\x2e\xa5\x73\xee\x91\xcf\x21\xce\x69\x5b\xad\xea\xe3\x8a\xb4\xa5\x56\x1d\x78\xc7\x0f\xc8\x94\x74\x8b\x8f\xdc\x80\xbb\x89\xed\x83\x38\x8c\xe5\x32\xe7\x3a\x47\xa5\xb2\x7e\x46\x83\x23\xfc\x67\x21\x73\xd5\x19\xb8\x7e\x5b\xeb\x96\x98\x41\xc9\x77\x84\x80\xf6\x6e\xeb\x5a\x92\xce\xfb\x43\x74\xa5\xc8\x4a\xb7\x9a\xba\xf2\x80\x8e\x7e\xd0\x04\x43\x5c\x67\xa5\xb3\xfa\x0b\x01\x19\x0b\xfe\xb8\x8e\x57\x5f\xae\x90\x0a\xc9\xfe\x09\x00\x00\xff\xff\xe1\x79\x11\x05\x46\x06\x00\x00") +var _testImagesSampleApiserverMakefile = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x54\x71\x6f\xdb\xb6\x13\xfd\x3b\xfc\x14\x0f\x96\xd1\x5f\xf3\x83\x25\xd9\xc1\xd0\x0e\x29\x8c\x4d\xb5\x3d\xc7\x68\x6a\x0d\x96\xd3\xa2\x43\x81\x80\x92\xce\x12\x17\x89\xd4\x48\xca\xb2\x11\xe4\xbb\x0f\x94\x9d\x74\x45\x31\x60\xfe\x47\x96\x78\xf7\xee\xf1\xdd\xbb\xf3\x30\x53\xcd\x51\x8b\xa2\xb4\xb8\x1a\x5f\x8d\xb1\x2d\x09\x1f\xda\x94\xb4\x24\x4b\x06\x51\x6b\x4b\xa5\x4d\xc0\x3c\xe6\xe1\x56\x64\x24\x0d\xe5\x68\x65\x4e\x1a\xb6\x24\x44\x0d\xcf\x4a\x7a\x3e\x19\xe1\x13\x69\x23\x94\xc4\x55\x30\xc6\x6b\x17\x30\x38\x1f\x0d\x2e\xdf\x31\x0f\x47\xd5\xa2\xe6\x47\x48\x65\xd1\x1a\x82\x2d\x85\xc1\x4e\x54\x04\x3a\x64\xd4\x58\x08\x89\x4c\xd5\x4d\x25\xb8\xcc\x08\x9d\xb0\x65\x5f\xe6\x0c\x12\x30\x0f\x5f\xce\x10\x2a\xb5\x5c\x48\x70\x64\xaa\x39\x42\xed\xfe\x19\x07\x6e\x7b\xc2\xee\x57\x5a\xdb\x5c\x87\x61\xd7\x75\x01\xef\xc9\x06\x4a\x17\x61\x75\x0a\x34\xe1\xed\x6a\xb6\x58\x27\x0b\xff\x2a\x18\xf7\x29\x77\xb2\x22\x63\xa0\xe9\xaf\x56\x68\xca\x91\x1e\xc1\x9b\xa6\x12\x19\x4f\x2b\x42\xc5\x3b\x28\x0d\x5e\x68\xa2\x1c\x56\x39\xbe\x9d\x16\x56\xc8\x62\x04\xa3\x76\xb6\xe3\x9a\x98\x87\x5c\x18\xab\x45\xda\xda\xef\xc4\x7a\x66\x27\xcc\x77\x01\x4a\x82\x4b\x0c\xa2\x04\xab\x64\x80\xf7\x51\xb2\x4a\x46\xcc\xc3\xe7\xd5\xf6\x26\xbe\xdb\xe2\x73\xb4\xd9\x44\xeb\xed\x6a\x91\x20\xde\x60\x16\xaf\xe7\xab\xed\x2a\x5e\x27\x88\x7f\x43\xb4\xfe\x82\x0f\xab\xf5\x7c\x04\x12\xb6\x24\x0d\x3a\x34\xda\xf1\x57\x1a\xc2\xc9\x48\xb9\xd3\x2c\x21\xfa\x8e\xc0\x4e\x9d\x08\x99\x86\x32\xb1\x13\x19\x2a\x2e\x8b\x96\x17\x84\x42\xed\x49\x4b\x21\x0b\x34\xa4\x6b\x61\x5c\x33\x0d\xb8\xcc\x99\x87\x4a\xd4\xc2\x72\xdb\x7f\xf9\xe1\x52\x01\x63\x71\x82\x5f\xa6\xa8\x84\x6c\x0f\x2c\xda\xcc\x6e\xdc\x1b\xaf\xf3\x37\x3f\xb1\x6d\xb4\x59\x2e\xb6\xee\x7d\xf8\x7a\x76\xb7\x99\xaf\x36\x97\x6c\x19\x47\x9b\x8f\x98\xe2\x2d\x5b\xc6\xb7\xd1\x7a\x79\xff\x69\xb1\x49\x56\xf1\xba\xc7\xe0\x96\x8c\x65\xc9\x66\x76\x3f\x5f\x6d\xe0\xd2\xa4\xb2\xb9\xd0\x18\xbe\x36\x25\x55\x15\x9a\x2e\xbf\xbc\x64\x74\x68\x94\xb6\x8c\x79\x78\xdf\x8a\x2a\xc7\x7e\x12\x4c\xde\x06\x63\xd7\x18\x92\xa6\xd5\xa7\x5b\x67\xad\xd6\x24\x2d\x34\x55\xc4\x0d\xc1\xb4\x8d\x4b\x33\xe0\x68\xb4\x50\x1a\xfb\xb3\x69\xcf\x26\x32\xbc\x6e\x2a\x02\x6f\x84\x21\xbd\x27\xcd\x3c\x2c\xc9\xf6\x66\x54\xad\x45\xea\x4a\x39\x85\xac\x42\xa3\x9a\xd6\x91\x45\xad\xf2\xb6\x22\x64\xce\x60\xcc\x73\x53\x24\x47\x28\xce\x59\x88\x93\xd0\x09\xe2\xbf\xe8\x4d\x72\xef\xd2\x7b\x28\x96\x0a\x79\xcd\x2e\x72\x95\x3d\x90\x86\x6e\x25\x7c\x5f\xd7\xf0\x05\xfc\x3d\x06\xc3\xc7\x93\x78\x4f\xd7\xdf\xfe\xfd\x31\xc0\xc3\xcf\x26\x28\x32\x1d\x08\x15\xf6\x20\xbe\xa8\x79\x41\xe1\x43\x9b\x92\x9f\x69\x65\xcc\xb5\xd3\xe2\x4d\x30\xf1\x27\xf8\xca\x2e\x2e\xc2\x54\xc8\x30\xe5\xa6\x84\x9f\x61\xe0\xbe\x5c\xd4\x0f\x4e\x50\xbf\x41\x58\xa8\xd0\xe8\xac\x7f\xa6\x42\xe2\xd5\xab\x3e\xe5\x62\x19\x4f\x26\x93\x8f\xf1\xfc\xee\x76\x31\x55\x12\x85\xea\x2f\xe4\xe7\x7d\x71\xa1\xc2\x93\x4e\xfe\x8b\x4e\xbf\xee\xc7\x27\xf9\xff\x05\x60\xb6\x8c\xef\x17\xeb\xe8\xfd\xed\x62\x3e\x1d\xa3\xef\xff\x74\xf8\xd8\x3f\x9f\xb0\x8c\xe3\x64\x3a\x7c\x8c\x93\xa7\xfe\x64\x76\x33\x1d\x3e\xba\xc7\xd3\x73\xdd\xff\x5a\x74\x27\x64\xfe\x72\x15\x5f\xf2\xfa\xb9\xa1\xdf\x72\xfe\x0f\x9f\x0e\x94\x21\x6b\xf0\xf8\x84\x17\x5d\x7f\xc0\xc6\xd7\x77\x03\x07\xe9\xf5\x03\xc3\x75\x3d\x72\x64\x84\x34\x96\x57\x95\xdb\x5f\xe6\xb9\x50\xd8\xbb\xfe\xbe\x0f\x31\x0a\x7f\xb6\xc6\xa2\x27\xe2\xfc\xd4\xef\x37\x2e\xf3\xd3\xa6\x12\xd6\x75\xde\x96\x74\x42\xd6\x4a\x59\x97\xd2\x39\xf3\xc8\x97\x10\x67\xb4\x9d\x56\xf5\x69\x43\xda\x52\xab\x0e\xbc\xe3\x47\x64\x4a\xba\xbd\x47\x6e\xbe\xdd\xc0\xf6\x41\x1c\xc6\x72\x99\x73\x9d\xa3\x52\x59\x3f\xa2\xc1\x09\xfe\xb3\x90\xb9\xea\x0c\xdc\x7d\x5b\xeb\x76\x98\x41\xc9\xf7\x84\x80\x0e\x6e\xe9\x5a\x92\xce\xfa\x23\x74\xa5\xc8\x4a\xb7\x99\xba\xf2\x88\x8e\xfe\xa7\x09\x86\xb8\xce\x4a\xe7\xf4\x1f\x04\x64\x2c\xf8\xfd\x26\x5e\x7f\xb9\x46\x2a\x24\xfb\x3b\x00\x00\xff\xff\x8a\xdf\xaf\x98\x45\x06\x00\x00") func testImagesSampleApiserverMakefileBytes() ([]byte, error) { return bindataRead( @@ -6441,7 +7217,7 @@ func testImagesSampleApiserverOwners() (*asset, error) { return a, nil } -var _testImagesSampleApiserverVersion = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x32\xd4\x33\x34\xd7\x33\xe6\x02\x04\x00\x00\xff\xff\x34\xa3\x0e\x79\x07\x00\x00\x00") +var _testImagesSampleApiserverVersion = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x32\xd4\x33\x34\xd7\x33\xe1\x02\x04\x00\x00\xff\xff\xf3\x35\x4f\x36\x07\x00\x00\x00") func testImagesSampleApiserverVersionBytes() ([]byte, error) { return bindataRead( @@ -6521,7 +7297,7 @@ func testImagesSampleDevicePluginMakefile() (*asset, error) { return a, nil } -var _testImagesSampleDevicePluginVersion = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x32\xd4\x33\xe2\x02\x04\x00\x00\xff\xff\x5d\x96\xa5\x56\x04\x00\x00\x00") +var _testImagesSampleDevicePluginVersion = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x32\xd4\x33\xe6\x02\x04\x00\x00\xff\xff\x1c\xa7\xbe\x4f\x04\x00\x00\x00") func testImagesSampleDevicePluginVersionBytes() ([]byte, error) { return bindataRead( @@ -6621,7 +7397,7 @@ func testImagesVolumeGlusterDockerfile() (*asset, error) { return a, nil } -var _testImagesVolumeGlusterVersion = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x32\xd4\x33\xe4\x02\x04\x00\x00\xff\xff\x9e\xc5\x88\x7d\x04\x00\x00\x00") +var _testImagesVolumeGlusterVersion = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x32\xd4\x33\xe2\x02\x04\x00\x00\xff\xff\x5d\x96\xa5\x56\x04\x00\x00\x00") func testImagesVolumeGlusterVersionBytes() ([]byte, error) { return bindataRead( @@ -6741,7 +7517,7 @@ func testImagesVolumeIscsiDockerfile() (*asset, error) { return a, nil } -var _testImagesVolumeIscsiVersion = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x32\xd2\x33\xe4\x02\x04\x00\x00\xff\xff\x70\x6a\x3d\x6f\x04\x00\x00\x00") +var _testImagesVolumeIscsiVersion = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x32\xd2\x33\xe2\x02\x04\x00\x00\xff\xff\xb3\x39\x10\x44\x04\x00\x00\x00") func testImagesVolumeIscsiVersionBytes() ([]byte, error) { return bindataRead( @@ -6861,7 +7637,7 @@ func testImagesVolumeNfsDockerfile() (*asset, error) { return a, nil } -var _testImagesVolumeNfsVersion = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x32\xd4\x33\xe4\x02\x04\x00\x00\xff\xff\x9e\xc5\x88\x7d\x04\x00\x00\x00") +var _testImagesVolumeNfsVersion = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x32\xd4\x33\xe2\x02\x04\x00\x00\xff\xff\x5d\x96\xa5\x56\x04\x00\x00\x00") func testImagesVolumeNfsVersionBytes() ([]byte, error) { return bindataRead( @@ -6961,7 +7737,7 @@ func testImagesVolumeRbdDockerfile() (*asset, error) { return a, nil } -var _testImagesVolumeRbdVersion = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x32\xd4\x33\xd0\x33\xe2\x02\x04\x00\x00\xff\xff\xea\xca\x48\xcf\x06\x00\x00\x00") +var _testImagesVolumeRbdVersion = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x32\xd4\x33\xd0\x33\xe6\x02\x04\x00\x00\xff\xff\xab\xfb\x53\xd6\x06\x00\x00\x00") func testImagesVolumeRbdVersionBytes() ([]byte, error) { return bindataRead( @@ -7121,7 +7897,7 @@ func testImagesVolumeRbdOsdSh() (*asset, error) { return a, nil } -var _testImagesWindowsMakefile = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xd4\x93\x51\x6f\xa3\x46\x14\x85\x9f\x77\x7e\xc5\x91\xed\x4a\xf1\xca\xe0\xc8\x8f\x5e\x45\x2b\xea\xd0\x35\x8a\x63\x56\x40\x76\x15\xa9\x92\x77\x80\x6b\x18\x65\xcc\xd0\x99\x21\x0e\x5a\xe5\xbf\x57\x80\xb3\xeb\x34\xad\xda\xd7\xf2\x04\x33\xe7\x9e\x39\xf7\x9b\xcb\x18\x2b\x55\xb7\x5a\x14\xa5\xc5\xe2\x72\x71\x89\xa4\x24\xdc\x34\x29\xe9\x8a\x2c\x19\x78\x8d\x2d\x95\x36\x2e\x1b\xb3\x31\x36\x22\xa3\xca\x50\x8e\xa6\xca\x49\xc3\x96\x04\xaf\xe6\x59\x49\x2f\x3b\x33\x7c\x21\x6d\x84\xaa\xb0\x70\x2f\x71\xd1\x09\x46\xa7\xad\xd1\xf4\x03\x1b\xa3\x55\x0d\x0e\xbc\x45\xa5\x2c\x1a\x43\xb0\xa5\x30\xd8\x0b\x49\xa0\xa7\x8c\x6a\x0b\x51\x21\x53\x87\x5a\x0a\x5e\x65\x84\xa3\xb0\x65\x7f\xcc\xc9\xc4\x65\x63\xdc\x9f\x2c\x54\x6a\xb9\xa8\xc0\x91\xa9\xba\x85\xda\x9f\xeb\xc0\x6d\x1f\xb8\x7b\x4a\x6b\xeb\xe5\x7c\x7e\x3c\x1e\x5d\xde\x87\x75\x95\x2e\xe6\x72\x10\x9a\xf9\x26\x58\xf9\xdb\xd8\x77\x16\xee\x65\x5f\x72\x57\x49\x32\x06\x9a\xfe\x68\x84\xa6\x1c\x69\x0b\x5e\xd7\x52\x64\x3c\x95\x04\xc9\x8f\x50\x1a\xbc\xd0\x44\x39\xac\xea\xf2\x1e\xb5\xb0\xa2\x2a\x66\x30\x6a\x6f\x8f\x5c\x13\x1b\x23\x17\xc6\x6a\x91\x36\xf6\x15\xac\x97\x74\xc2\xbc\x12\xa8\x0a\xbc\xc2\xc8\x8b\x11\xc4\x23\xfc\xea\xc5\x41\x3c\x63\x63\x7c\x0d\x92\x75\x78\x97\xe0\xab\x17\x45\xde\x36\x09\xfc\x18\x61\x84\x55\xb8\xbd\x0e\x92\x20\xdc\xc6\x08\x7f\x83\xb7\xbd\xc7\x4d\xb0\xbd\x9e\x81\x84\x2d\x49\x83\x9e\x6a\xdd\xe5\x57\x1a\xa2\xc3\x48\x79\xc7\x2c\x26\x7a\x15\x60\xaf\x86\x40\xa6\xa6\x4c\xec\x45\x06\xc9\xab\xa2\xe1\x05\xa1\x50\x8f\xa4\x2b\x51\x15\xa8\x49\x1f\x84\xe9\x2e\xd3\x80\x57\x39\x1b\x43\x8a\x83\xb0\xdc\xf6\x2b\x6f\x9a\x72\x19\x8b\xfc\x4f\x41\x9c\x44\xf7\xf8\x78\x85\x22\xd3\xae\x50\xf3\x87\x1f\x93\xe4\xd0\x82\x1c\x4b\xc6\x3a\xe2\xc0\x0b\x32\x2c\xf2\x6f\xc3\xc4\xdf\x5d\x87\xab\x1b\x3f\xda\xdd\x45\x1b\x7c\xbc\x62\xa7\xaf\x95\x1f\x25\xbb\xcf\x5e\xb2\xee\xac\x46\x93\x8b\x75\x78\xeb\x4f\xe7\x6e\xae\xb2\x07\xd2\x23\x46\x4f\xb5\xd2\x96\x31\x6f\xb3\xd9\x05\xb7\xde\x27\x3f\xc6\x15\xd2\xc6\xb4\xa9\x7a\x72\x4a\x92\x35\x69\xd4\xea\x48\xda\x94\x24\xe5\x69\x85\x31\xd3\xa4\x4e\xda\x08\x99\x3b\xbf\x2c\xd9\x3b\x71\x28\x76\x8f\xc3\xb4\x5e\x4d\x2e\x7a\x25\x32\x6e\x31\x79\x3f\xff\xe2\x47\x71\x10\x6e\xa7\x1f\xf0\x3b\x7b\x37\x1c\x0a\xc7\xb1\xd2\x3c\x92\x16\xfb\x76\x78\xcf\x78\x46\xda\x76\xe9\xfe\x1a\x7a\x3a\xcf\xb8\x5b\xd3\x61\xd4\x95\xbf\x1b\xc4\xff\x2c\x25\x6d\x07\x71\x2f\x7c\xa0\xf6\xef\x75\x0f\xd4\x9e\x79\xae\x3b\xd1\x1b\x82\xd3\x11\xfa\xfe\xe0\x38\x95\x72\xb2\xfe\xcf\x74\x9c\xba\x91\x12\x8e\x1d\x2a\x86\x1b\x9a\xce\x27\xef\x97\x93\xc9\xf7\x33\x06\xcf\xa3\xae\xf3\x01\x52\xdd\x98\xf2\x0d\xa3\x6f\xaf\xe1\x7c\xfb\x1f\xc2\xe9\xfa\xfa\x57\x0c\x8c\x71\x29\x87\x39\x59\x62\x72\xb1\x57\x9a\x78\x56\xa2\x9f\xda\x19\x26\xdf\x7f\x0e\xdd\xf3\x0c\x3f\x47\xaa\x73\xe1\x05\x3d\x4f\x87\xfa\xee\xa8\x25\x7e\x38\xfd\x27\xa3\x1e\xfb\x99\x8f\xfb\x79\x1d\x6e\xef\xcf\x5d\x5e\x9c\xd9\x9f\x01\x00\x00\xff\xff\xc3\xb7\xba\x1c\xb7\x05\x00\x00") +var _testImagesWindowsMakefile = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xd4\x54\xd1\x6e\xdb\x38\x10\x7c\x0e\xbf\x62\x61\xfb\x80\xb8\xb0\xa4\x20\x38\xdc\x83\x0b\xa3\xd0\x39\xba\x5a\x88\x63\x15\x92\xd3\x22\xc0\x01\x2e\x2d\xad\x25\x22\x34\xc9\x23\xa9\xc8\x46\x91\x7f\x3f\x50\x72\x5c\xa7\xc9\xa1\xc1\xbd\xd5\x4f\x96\x34\x9c\x9d\x9d\xd9\x65\x1f\xa6\x52\xed\x35\x2b\x2b\x0b\x97\x17\x97\x17\xb0\xac\x10\xae\xeb\x35\x6a\x81\x16\x0d\x84\xb5\xad\xa4\x36\x3e\xe9\x93\x3e\xcc\x59\x8e\xc2\x60\x01\xb5\x28\x50\x83\xad\x10\x42\x45\xf3\x0a\x9f\xbe\x8c\xe0\x33\x6a\xc3\xa4\x80\x4b\xff\x02\xce\x1d\xa0\x77\xf8\xd4\x1b\xbe\x27\x7d\xd8\xcb\x1a\xb6\x74\x0f\x42\x5a\xa8\x0d\x82\xad\x98\x81\x0d\xe3\x08\xb8\xcb\x51\x59\x60\x02\x72\xb9\x55\x9c\x51\x91\x23\x34\xcc\x56\x6d\x99\x03\x89\x4f\xfa\x70\x77\xa0\x90\x6b\x4b\x99\x00\x0a\xb9\x54\x7b\x90\x9b\x53\x1c\x50\xdb\x0a\x76\xbf\xca\x5a\x35\x0e\x82\xa6\x69\x7c\xda\x8a\xf5\xa5\x2e\x03\xde\x01\x4d\x30\x8f\xa7\xd1\x22\x8b\xbc\x4b\xff\xa2\x3d\x72\x2b\x38\x1a\x03\x1a\xff\xa9\x99\xc6\x02\xd6\x7b\xa0\x4a\x71\x96\xd3\x35\x47\xe0\xb4\x01\xa9\x81\x96\x1a\xb1\x00\x2b\x9d\xde\x46\x33\xcb\x44\x39\x02\x23\x37\xb6\xa1\x1a\x49\x1f\x0a\x66\xac\x66\xeb\xda\x3e\x33\xeb\x49\x1d\x33\xcf\x00\x52\x00\x15\xd0\x0b\x33\x88\xb3\x1e\xfc\x19\x66\x71\x36\x22\x7d\xf8\x12\x2f\x67\xc9\xed\x12\xbe\x84\x69\x1a\x2e\x96\x71\x94\x41\x92\xc2\x34\x59\x5c\xc5\xcb\x38\x59\x64\x90\xfc\x05\xe1\xe2\x0e\xae\xe3\xc5\xd5\x08\x90\xd9\x0a\x35\xe0\x4e\x69\xa7\x5f\x6a\x60\xce\x46\x2c\x9c\x67\x19\xe2\x33\x01\x1b\xd9\x09\x32\x0a\x73\xb6\x61\x39\x70\x2a\xca\x9a\x96\x08\xa5\x7c\x40\x2d\x98\x28\x41\xa1\xde\x32\xe3\xc2\x34\x40\x45\x41\xfa\xc0\xd9\x96\x59\x6a\xdb\x37\x2f\x9a\xf2\x09\x49\xa3\x8f\x71\xb6\x4c\xef\xe0\xc3\x04\xca\x5c\xfb\x4c\x06\xf7\xc7\x49\xf2\xf0\x12\x3d\x8b\xc6\x7a\x6c\x4b\x4b\x34\x24\x8d\x6e\x92\x65\xb4\xba\x4a\xa6\xd7\x51\xba\xba\x4d\xe7\xf0\x61\x42\x0e\x4f\xd3\x28\x5d\xae\x3e\x85\xcb\x99\xa3\xea\x0d\xce\x67\xc9\x4d\x34\x0c\xfc\x42\xe6\xf7\xa8\x7b\x04\x77\x4a\x6a\x4b\x48\x38\x9f\xaf\xe2\x9b\xf0\x63\x94\xc1\x04\x94\x6c\x50\x9b\x0a\x39\xf7\x2a\xe4\x0a\x35\x21\xa6\x5e\x7b\xeb\x9a\xf1\xc2\xfb\x6d\x4c\xce\xd8\xb6\x5c\x3d\x74\xe3\x39\x19\x9c\xb7\x48\xc8\xa9\x85\xc1\xbb\xe0\x73\x94\x66\x71\xb2\x18\xbe\x87\xbf\xc9\x59\x57\x05\x3c\xcf\x72\xf3\x80\x9a\x6d\xf6\xdd\xff\x9c\xe6\xa8\xad\x93\xf3\xa3\xca\x61\x90\x53\x5f\xe1\xb6\xe7\x8e\x9f\x75\xe0\xff\x86\xa2\xb6\x1d\xb8\x05\xde\xe3\xfe\x75\xdc\x3d\xee\x4f\x38\x67\x0e\xf4\xc2\xb2\x61\x0f\xda\xfe\xc0\xf3\x84\xf4\xf2\x76\x15\x3d\x4f\xd5\x9c\x83\x67\xbb\x13\x5d\x24\xc3\x60\xf0\x6e\x3c\x18\x7c\x3b\xf1\xe0\xf1\xc0\xbc\x71\x06\x5c\xb5\x3d\xbb\x45\x5c\x35\x4c\x14\xb2\x31\xee\x6d\xe7\xa0\xaa\x4d\xf5\xc2\xc0\xaf\xcf\x9d\xfb\xfa\x0b\x3a\xe7\xfa\xfa\xa9\x47\x9d\x05\x1a\x5b\x13\xa8\xf1\x38\x13\xf5\xee\xff\x8c\x53\x9b\xd3\xee\x18\x97\xd2\xb2\x74\x8b\x3a\x51\xdc\xdd\x62\xaf\xe4\xe7\xc9\xda\xaa\xda\x4e\xec\x5e\xe1\x44\x63\xe9\x2e\x0c\xe7\xa7\xe2\xd4\x6e\xa4\xde\x42\xaf\xd5\x12\xd0\x6d\xf1\xc7\xef\x4f\xfe\x75\xd3\x4e\x75\x09\x59\x72\x9b\x4e\xa3\xc9\x4f\x67\xe0\x0d\x73\x72\x68\xba\x93\xd7\x8e\x05\xe5\xbc\x2b\x35\x86\xc1\xf9\x46\x6a\xa4\x79\x05\xed\x5e\x8f\x60\xf0\xed\xfb\x5a\x3e\x8e\xe0\xfb\x0e\x3a\x56\x5a\xe2\xe3\xb0\x3b\xef\x1c\x1d\xc3\x91\xe9\x4d\x44\x6d\x0a\xaf\xf0\x1c\x93\xe9\x08\xdb\x64\xdf\xc2\xf7\x63\xae\x27\xd4\xfe\xa7\x59\xb2\xb8\x3b\x15\x78\x64\x7e\x51\x95\xfc\x1b\x00\x00\xff\xff\x6d\xd3\x3e\xc8\x46\x07\x00\x00") func testImagesWindowsMakefileBytes() ([]byte, error) { return bindataRead( @@ -7141,62 +7917,42 @@ func testImagesWindowsMakefile() (*asset, error) { return a, nil } -var _testImagesWindowsBusyboxHelperDockerfile = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x84\x54\xdf\x73\xda\x38\x10\x7e\xf7\x5f\xb1\x03\x4d\x93\x74\x62\x99\xd0\x5c\x7b\x21\x93\x07\x0a\x64\xca\x34\x85\x0c\x24\xcd\x74\x8e\x9b\x8e\x2c\x2f\xf6\x1e\xb2\xe4\x4a\x72\x80\xfb\xeb\x6f\x24\x43\x4b\xa6\xb9\x29\x0f\x36\xde\x1f\xdf\x7e\xd2\x7e\xbb\x6d\x18\xe8\x6a\x6b\x28\x2f\x1c\x74\x3b\xdd\x0e\xdc\x17\x08\x9f\xea\x14\x8d\x42\x87\x16\xfa\xb5\x2b\xb4\xb1\x2c\x6a\x47\x6d\xb8\x25\x81\xca\x62\x06\xb5\xca\xd0\x80\x2b\x10\xfa\x15\x17\x05\xee\x3d\x67\xf0\x05\x8d\x25\xad\xa0\xcb\x3a\x70\xe2\x03\x5a\x3b\x57\xeb\xf4\x2a\x6a\xc3\x56\xd7\x50\xf2\x2d\x28\xed\xa0\xb6\x08\xae\x20\x0b\x4b\x92\x08\xb8\x11\x58\x39\x20\x05\x42\x97\x95\x24\xae\x04\xc2\x9a\x5c\x11\xca\xec\x40\x58\xd4\x86\xaf\x3b\x08\x9d\x3a\x4e\x0a\x38\x08\x5d\x6d\x41\x2f\x0f\xe3\x80\xbb\x40\xd8\xff\x0a\xe7\xaa\x5e\x92\xac\xd7\x6b\xc6\x03\x59\xa6\x4d\x9e\xc8\x26\xd0\x26\xb7\xe3\xc1\x68\x32\x1f\xc5\x5d\xd6\x09\x29\x0f\x4a\xa2\xb5\x60\xf0\x7b\x4d\x06\x33\x48\xb7\xc0\xab\x4a\x92\xe0\xa9\x44\x90\x7c\x0d\xda\x00\xcf\x0d\x62\x06\x4e\x7b\xbe\x6b\x43\x8e\x54\x7e\x06\x56\x2f\xdd\x9a\x1b\x8c\xda\x90\x91\x75\x86\xd2\xda\x3d\xbb\xac\x3d\x3b\xb2\xcf\x02\xb4\x02\xae\xa0\xd5\x9f\xc3\x78\xde\x82\x0f\xfd\xf9\x78\x7e\x16\xb5\xe1\x71\x7c\xff\x71\xfa\x70\x0f\x8f\xfd\xd9\xac\x3f\xb9\x1f\x8f\xe6\x30\x9d\xc1\x60\x3a\x19\x8e\xef\xc7\xd3\xc9\x1c\xa6\x37\xd0\x9f\x7c\x85\x4f\xe3\xc9\xf0\x0c\x90\x5c\x81\x06\x70\x53\x19\xcf\x5f\x1b\x20\x7f\x8d\x98\xf9\x3b\x9b\x23\x3e\x23\xb0\xd4\x0d\x21\x5b\xa1\xa0\x25\x09\x90\x5c\xe5\x35\xcf\x11\x72\xfd\x84\x46\x91\xca\xa1\x42\x53\x92\xf5\xcd\xb4\xc0\x55\x16\xb5\x41\x52\x49\x8e\xbb\x60\xf9\xe5\x50\x2c\x8a\x6e\x66\xd3\xcf\x50\x0a\xc3\x4a\x12\x46\xfb\xdb\x60\x42\x97\xc9\x9a\x54\xa6\xd7\x36\xb1\x68\x9e\xd0\x08\x6d\xb0\x27\x9d\x15\xdd\xce\xf9\x25\x70\x0b\x95\xc1\x2a\x8a\x46\x93\x2f\x30\x78\x98\xdd\x7e\xfb\x32\x9a\xcd\xc7\xd3\xc9\xf5\x7b\xf6\xc7\x7b\xd6\x89\xa2\xfe\x70\x18\x5a\x68\x7b\x49\x92\x93\x2b\xea\x34\x80\xae\x7e\x48\x34\xb6\x94\xdb\x7d\x91\xd8\xa1\xf5\xcd\x48\x0c\x5f\x27\x25\xb7\x0e\x4d\x42\x25\xcf\xd1\x26\x69\x6d\xb7\xa9\xde\xec\xdf\x0c\x37\x08\x49\x4a\xea\xd0\xf0\xac\x9a\x5d\x71\xe5\x0a\xbe\x62\x85\x2e\xb1\xe2\x39\x32\x17\x6b\x25\x49\x21\xcb\x30\xc9\xf4\x5a\x49\xcd\xb3\x44\xd4\x46\xc6\xaf\x0e\xb9\x33\xc1\x53\x08\xf6\xf0\xf0\x9f\xcf\x80\xd1\xa1\x51\x5c\xca\x6d\xaa\x0d\x66\x41\x8e\x25\x59\x91\x28\x74\x82\xbb\xdd\x2b\x5e\x93\x7a\xdb\x8d\xcf\xd9\x79\x97\xfd\x4b\x15\x3c\xf7\x7a\xd3\x33\xcc\x3d\x1d\xcb\xc8\x8a\x00\xe9\x11\x53\x52\xd9\x65\x72\xc9\xce\x2f\xd8\x79\x27\xf9\x30\x9e\x0c\x77\xff\xd9\xe6\xdd\x45\x03\xeb\x43\x02\x5a\xf4\x30\x1f\xcd\x60\xa0\x95\x1f\x2b\x34\xfd\xac\x24\xe5\x45\xca\x9d\x36\x51\xd4\x86\xc9\xf4\x7e\x74\x22\x24\xaf\x33\xaa\xd3\xd3\x1e\x3c\x22\x14\xfc\x09\xfd\x10\x08\x83\xdc\x21\x18\x94\xdc\xd1\x13\x42\xc5\x5d\x01\x76\x5b\x4a\x52\x2b\x0b\x29\x0a\xee\x67\x3d\xd3\x62\x85\x06\xd2\x9a\x64\xb6\x81\x82\x7b\x59\x01\x59\x5b\x23\xac\x0b\x54\x61\x8e\x49\xe5\x51\x1b\xbc\x06\x7f\xe4\x9f\x01\xb9\x20\x12\x54\x99\x85\xd6\x0d\x49\xb4\x8b\x96\x2f\x1b\x14\xdc\x44\x81\xe3\x26\x47\xc7\xf6\xfe\x41\x6f\x91\x92\x5a\x1c\xb4\xb6\x05\x6b\x5d\xcb\x0c\x52\x04\xae\xa2\x36\x90\x7a\xe2\x92\xb2\xc0\x95\x45\xb3\x87\x09\x88\x0c\x9a\x34\x78\xfd\x1a\x6e\xa6\x33\x48\x96\xd0\x72\x7a\x85\xca\x5e\xbf\x69\xc1\x11\xc1\x78\x02\x27\xc7\x6c\x8f\x0a\x71\x2c\xc9\xba\xe3\x53\x18\x4e\xa1\x5c\x05\x1a\x6c\x71\x44\x41\x59\x87\xa2\x3a\x40\xf7\x7a\x80\xd7\x8b\xc8\x2f\x26\xdc\x54\x5c\x65\x90\xcc\x60\xaf\x12\x48\x6e\x7a\x6f\x80\xed\x03\x32\x94\xfb\x9c\xc5\x8f\x90\x9d\xaf\x81\x6b\xc4\xb0\xb7\x39\x6e\x42\xed\x78\xb3\x84\x9f\x32\x39\x44\xfb\xd5\x6a\xd1\x6d\x20\xf9\x0c\x77\xfd\xfb\x8f\xd0\x6a\xce\x7f\xb5\x2f\x7a\x75\xe4\xcd\x47\x2d\xdf\xfe\xe1\x4e\x60\xe0\x05\xe3\x17\x42\xe8\x09\x37\x08\x1c\x96\x5a\xfa\x6d\xf0\x4f\x6d\x5d\x58\x2d\x19\xe5\xcd\x95\x56\x7a\x8d\xc6\x16\x28\x25\xc4\x03\x5d\x96\x3e\xad\xd5\x14\x06\x18\x85\xf3\xc7\x7d\x23\x0a\x2f\x9a\xf8\xce\xab\xa6\x61\x10\x14\x09\xf1\x30\x0c\x73\xd8\x38\x87\xce\x2b\xd8\x43\xbc\xb2\x70\x0d\x7f\xcd\xb7\xd6\x61\xc9\x86\xc4\x73\xa5\xad\x23\x61\xd9\x9d\xd1\x02\xad\xfd\xbb\xd7\x9b\x3b\x6e\xdc\xc9\xf1\x2e\x75\xf1\x24\x0c\xfa\xdd\xfb\xcd\x0f\x00\x6e\xf0\xf8\x0c\x8e\x93\xef\x35\xa1\x3b\x3e\x3d\xc4\x65\x8f\x9c\xdc\x8d\x36\xa3\x0d\xb9\x93\x03\x4f\xb9\xca\xc8\x78\x22\x19\xe5\x3f\xad\xa2\xda\x73\xf3\xf6\xd0\x84\x26\x64\xf1\x62\x8c\xb2\x52\xeb\x55\x5d\xfd\x36\xf0\x0d\xcb\xa4\xfc\xbf\x88\xc7\x66\xe5\x2d\x9a\xe3\xbf\xed\xfa\xb3\xd5\xca\x51\x89\xe7\x17\x9d\x97\x13\x4d\x79\x78\xc1\x57\xad\xdf\xee\x6c\xc5\x95\x6e\xf6\x76\xef\xfc\xcf\xce\x65\x14\x0d\xa6\x77\x5f\x21\x8e\x97\x46\x97\xd7\x5e\x00\x61\x81\x84\xc7\x0b\xae\xb0\x02\xfb\x9f\x87\xef\x2e\x76\xff\xfd\x96\x64\xb7\xe3\xc1\xee\xf3\x85\x94\x8c\xf2\xf0\x78\xc1\xb5\x13\xfb\xee\x1d\xfd\x17\x00\x00\xff\xff\xff\x17\x37\x5a\xba\x08\x00\x00") +var _testImagesWindowsPowershellHelperDockerfile = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xbc\x54\xc1\x6e\xe3\x36\x10\xbd\xeb\x2b\x1e\xac\x02\xdd\x05\x6c\x29\x0d\x8a\xa2\x4d\xb1\x07\xd5\xc9\xb6\xc6\x26\xf6\xc2\x76\x1a\xe4\x48\x51\x23\x6b\x50\x8a\x54\x39\x54\x14\xfd\x7d\x41\x2b\x4e\x62\x6c\x81\xde\xaa\x93\x24\xbe\x79\xf3\xe6\xcd\x0c\x53\x2c\x5d\x37\x7a\x3e\x34\x01\x97\x17\x97\x17\xd8\x37\x84\x2f\x7d\x49\xde\x52\x20\x41\xd1\x87\xc6\x79\xc9\x92\x34\x49\x71\xcb\x9a\xac\x50\x85\xde\x56\xe4\x11\x1a\x42\xd1\x29\xdd\xd0\xe9\x64\x8e\x3f\xc9\x0b\x3b\x8b\xcb\xec\x02\x1f\x22\x60\xf6\x72\x34\xfb\xf8\x6b\x92\x62\x74\x3d\x5a\x35\xc2\xba\x80\x5e\x08\xa1\x61\x41\xcd\x86\x40\xcf\x9a\xba\x00\xb6\xd0\xae\xed\x0c\x2b\xab\x09\x03\x87\xe6\x98\xe6\x85\x24\x4b\x52\x3c\xbe\x50\xb8\x32\x28\xb6\x50\xd0\xae\x1b\xe1\xea\xf7\x38\xa8\x70\x14\x1c\x9f\x26\x84\xee\x2a\xcf\x87\x61\xc8\xd4\x51\x6c\xe6\xfc\x21\x37\x13\x50\xf2\xdb\xd5\xf2\x66\xbd\xbb\x59\x5c\x66\x17\xc7\x90\x7b\x6b\x48\x04\x9e\xfe\xee\xd9\x53\x85\x72\x84\xea\x3a\xc3\x5a\x95\x86\x60\xd4\x00\xe7\xa1\x0e\x9e\xa8\x42\x70\x51\xef\xe0\x39\xb0\x3d\xcc\x21\xae\x0e\x83\xf2\x94\xa4\xa8\x58\x82\xe7\xb2\x0f\x67\x66\x9d\xd4\xb1\x9c\x01\x9c\x85\xb2\x98\x15\x3b\xac\x76\x33\xfc\x56\xec\x56\xbb\x79\x92\xe2\x61\xb5\xff\x63\x73\xbf\xc7\x43\xb1\xdd\x16\xeb\xfd\xea\x66\x87\xcd\x16\xcb\xcd\xfa\x7a\xb5\x5f\x6d\xd6\x3b\x6c\x3e\xa3\x58\x3f\xe2\xcb\x6a\x7d\x3d\x07\x71\x68\xc8\x83\x9e\x3b\x1f\xf5\x3b\x0f\x8e\x36\x52\x15\x3d\xdb\x11\x9d\x09\xa8\xdd\x24\x48\x3a\xd2\x5c\xb3\x86\x51\xf6\xd0\xab\x03\xe1\xe0\x9e\xc8\x5b\xb6\x07\x74\xe4\x5b\x96\xd8\x4c\x81\xb2\x55\x92\xc2\x70\xcb\x41\x85\xe3\x9f\x6f\x8a\xca\x92\xa4\xd8\xfe\x8e\xdd\xe6\x7e\xbb\xbc\x49\x92\x14\xeb\xcd\xfe\xe6\x83\x36\xaa\xaf\xb8\x2f\x3f\x5e\x1d\x07\x4b\xbc\x06\xb7\x31\x0f\x0b\x94\xf1\xa4\xaa\x11\xa5\x92\xc9\x04\xab\xac\x13\xf2\x4f\xe4\xe7\x28\xfb\x00\x0e\x10\xa2\x56\x10\x1a\x15\x50\x39\xfd\x17\x79\x94\x3d\x9b\xea\x39\x49\xd1\xa8\xa8\x0b\x2c\xd2\x13\xba\xde\x98\x28\x5a\x7b\x27\xb2\xf0\x74\x88\xf6\x8e\x53\x2e\x99\x47\xfd\x18\x08\xea\xc9\x71\x35\xb1\x95\xe3\x6b\x0c\x07\xb8\xde\x0b\x99\x27\x92\x2c\xf9\xbc\xdd\xdc\x61\xb1\xe8\x8c\x0a\xb5\xf3\xed\xa7\xd9\xc0\xb6\x72\x83\xe4\xaa\xad\x7e\xfa\x71\x86\x56\xfb\xac\xe5\x98\xc7\xd5\x21\xd3\xae\xcd\x4f\x80\x37\xf9\x57\x3f\xfc\x7c\xf1\x0b\x94\xbc\xab\xe8\x3f\x79\xbf\x9b\x9c\x8b\x51\xe2\xf5\x04\x17\xed\x55\xd0\xcd\xbf\xb9\xf9\x40\xdf\x7b\x8a\xd6\xb1\x56\xc6\x8c\xb1\xa3\x3a\x16\x73\xe6\x52\x1c\xd0\x9a\x2d\x4b\xf3\x5a\x6c\xec\xd8\x9b\xaa\xc9\xa0\x24\x45\x49\xb5\xf3\x04\xed\x6c\x60\xdb\x47\xe0\xeb\xea\x79\x92\x30\xad\x17\x0b\xae\x8f\xf4\x71\x61\xb3\x64\xb9\xf9\xfa\x88\xc5\xa2\xf6\xae\xfd\xf4\x8e\x32\x3f\x0d\x44\x78\x0e\x67\x1f\xc9\x59\x44\x1c\x85\xfc\xab\x1b\xc8\xef\x1a\x32\xe6\xfd\xfb\xb7\xb8\x7b\x21\x2f\xf9\xd2\xd9\xb8\xf2\xe4\x8b\xaa\x8d\x55\x05\xaf\x82\xf3\x79\xd1\x75\xd7\x2a\xa8\xfc\xd6\x69\x65\xf2\xbb\x53\x6f\xf2\x87\x17\x83\xdf\x88\xf3\xc9\x9d\xfc\xce\x55\xbd\xa1\xc2\x2a\x33\x0a\xcb\xf2\x78\x83\xfd\x0f\x39\x92\x7f\x02\x00\x00\xff\xff\x8e\xcc\x45\x1d\x6d\x05\x00\x00") -func testImagesWindowsBusyboxHelperDockerfileBytes() ([]byte, error) { - return bindataRead( - _testImagesWindowsBusyboxHelperDockerfile, - "test/images/windows/busybox-helper/Dockerfile", - ) -} - -func testImagesWindowsBusyboxHelperDockerfile() (*asset, error) { - bytes, err := testImagesWindowsBusyboxHelperDockerfileBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "test/images/windows/busybox-helper/Dockerfile", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _testImagesWindowsBusyboxHelperVersion = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x32\xd4\x33\xb2\xd4\x33\xe0\x02\x04\x00\x00\xff\xff\x14\xfd\x5c\xf5\x07\x00\x00\x00") - -func testImagesWindowsBusyboxHelperVersionBytes() ([]byte, error) { +func testImagesWindowsPowershellHelperDockerfileBytes() ([]byte, error) { return bindataRead( - _testImagesWindowsBusyboxHelperVersion, - "test/images/windows/busybox-helper/VERSION", + _testImagesWindowsPowershellHelperDockerfile, + "test/images/windows/powershell-helper/Dockerfile", ) } -func testImagesWindowsBusyboxHelperVersion() (*asset, error) { - bytes, err := testImagesWindowsBusyboxHelperVersionBytes() +func testImagesWindowsPowershellHelperDockerfile() (*asset, error) { + bytes, err := testImagesWindowsPowershellHelperDockerfileBytes() if err != nil { return nil, err } - info := bindataFileInfo{name: "test/images/windows/busybox-helper/VERSION", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + info := bindataFileInfo{name: "test/images/windows/powershell-helper/Dockerfile", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} a := &asset{bytes: bytes, info: info} return a, nil } -var _testImagesWindowsPowershellHelperDockerfile = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x94\x55\xe1\x8f\xda\xc6\x13\xfd\xee\xbf\xe2\xfd\x20\xf7\xbb\x3b\xe9\x6c\x2e\xa8\x4d\x1b\xa2\xfb\xe0\x02\x51\x50\x38\xb0\x30\x97\x53\x24\xa4\x6a\xb1\x07\x7b\x75\xeb\x5d\x77\x77\x8d\x21\x55\xfe\xf7\x6a\xcd\x91\x33\x34\x69\x55\x7f\x40\xab\x99\xd9\x37\x33\xef\xcd\x0e\x5d\x0c\x55\xb9\xd7\x3c\xcb\x2d\xfa\xb7\xfd\x5b\x2c\x73\xc2\xc7\x6a\x4d\x5a\x92\x25\x83\xb0\xb2\xb9\xd2\x26\xf0\xba\x5e\x17\x53\x9e\x90\x34\x94\xa2\x92\x29\x69\xd8\x9c\x10\x96\x2c\xc9\xe9\xe8\xb9\xc1\x27\xd2\x86\x2b\x89\x7e\x70\x8b\x2b\x17\xd0\x79\x76\x75\xae\xdf\x79\x5d\xec\x55\x85\x82\xed\x21\x95\x45\x65\x08\x36\xe7\x06\x1b\x2e\x08\xb4\x4b\xa8\xb4\xe0\x12\x89\x2a\x4a\xc1\x99\x4c\x08\x35\xb7\x79\x93\xe6\x19\x24\xf0\xba\xf8\xfc\x0c\xa1\xd6\x96\x71\x09\x86\x44\x95\x7b\xa8\x4d\x3b\x0e\xcc\x36\x05\xbb\x2f\xb7\xb6\x1c\xf4\x7a\x75\x5d\x07\xac\x29\x36\x50\x3a\xeb\x89\x43\xa0\xe9\x4d\x27\xc3\xf1\x2c\x1e\xfb\xfd\xe0\xb6\xb9\xf2\x20\x05\x19\x03\x4d\x7f\x54\x5c\x53\x8a\xf5\x1e\xac\x2c\x05\x4f\xd8\x5a\x10\x04\xab\xa1\x34\x58\xa6\x89\x52\x58\xe5\xea\xad\x35\xb7\x5c\x66\x37\x30\x6a\x63\x6b\xa6\xc9\xeb\x22\xe5\xc6\x6a\xbe\xae\xec\x09\x59\xc7\xea\xb8\x39\x09\x50\x12\x4c\xa2\x13\xc6\x98\xc4\x1d\xfc\x16\xc6\x93\xf8\xc6\xeb\xe2\x71\xb2\xfc\x30\x7f\x58\xe2\x31\x5c\x2c\xc2\xd9\x72\x32\x8e\x31\x5f\x60\x38\x9f\x8d\x26\xcb\xc9\x7c\x16\x63\xfe\x1e\xe1\xec\x33\x3e\x4e\x66\xa3\x1b\x10\xb7\x39\x69\xd0\xae\xd4\xae\x7e\xa5\xc1\x1d\x8d\x94\x3a\xce\x62\xa2\x93\x02\x36\xea\x50\x90\x29\x29\xe1\x1b\x9e\x40\x30\x99\x55\x2c\x23\x64\x6a\x4b\x5a\x72\x99\xa1\x24\x5d\x70\xe3\xc4\x34\x60\x32\xf5\xba\x10\xbc\xe0\x96\xd9\xc6\xf2\xb7\xa6\x02\xcf\x7b\xbf\x98\xdf\xa3\x48\x74\x50\xf0\x44\x2b\xc7\x46\x90\xa8\xa2\x57\x73\x99\xaa\xda\xf4\x0c\xe9\x2d\xe9\x44\x69\x1a\x08\x6b\x92\xfe\xed\xeb\xb7\x60\x06\xa5\xa6\xd2\xf3\xc6\xb3\x4f\x88\xe2\xdf\x3f\x8d\x17\xf1\x64\x3e\xbb\x7b\x13\xf4\x83\x5f\xbc\x70\x34\x6a\xe4\x33\x83\x5e\x2f\xe3\x36\xaf\xd6\x0d\x60\xa4\x6a\xd2\x71\x4e\x42\xb4\x8f\x9a\x04\x31\xa7\x68\xaa\x6a\x29\x14\x4b\x7b\xdb\x57\x2f\x88\xad\x48\xbf\x65\xf6\x6b\x2e\xfd\xdd\x9b\x9f\x82\x2f\xbc\x44\x1b\xad\x74\x47\xe3\x8e\xce\xe5\x79\x8b\x87\x19\x92\x14\xc3\xc1\xea\x25\x08\xff\x5f\x79\x6e\xc2\x2c\xd3\x01\xed\x08\xfe\x6e\x83\xd3\x7b\xc7\x88\x94\xc4\x0f\x3c\xc5\x93\xe0\xf2\xa9\xed\x74\x48\x65\x6d\x72\x77\xf8\x57\x4e\x25\x93\xea\xc0\xeb\xe0\xf5\xaf\xb7\x6f\x3d\x6f\x38\x8f\x3e\xc3\xf7\x37\x5a\x15\x77\x8e\xd9\x76\x53\xed\xb3\xe7\x75\x61\xc8\x82\x61\xc3\x77\x94\x42\xa8\xa4\x51\xf6\xdb\x68\xdc\xab\xb4\x12\x04\x26\x99\xd8\x1b\x6e\x90\xb8\xa7\xd3\xc8\x34\x9d\x0f\xc3\x69\x18\x45\xa3\x70\x19\xde\x75\x86\x83\xd5\x83\x21\x6d\x56\x43\x25\xdd\x83\x24\x1d\xa6\x05\x97\x6e\xbc\x99\x55\x7a\x15\x96\xe5\x88\x59\xb6\x9a\xaa\x84\x89\x0e\x0e\x5d\x47\xf1\x01\x3e\x7c\x46\x1f\x3a\xf0\x88\xd9\xfc\x3f\xe2\xad\xee\x8f\xac\xac\x1e\x0f\x8c\xb4\xe4\x59\xa5\x2a\x79\x22\xbd\xfa\x4e\xaa\x63\x1d\x5d\x44\x6e\x5f\x19\x8b\x8b\x28\x1e\xce\x17\xe3\x0b\xb8\x0e\xb7\x4c\xf3\xe6\xb9\x3b\x32\x2a\x43\x1a\x89\x92\x5b\x92\x9c\x64\x42\xcf\x0d\xb8\xe8\xa6\xda\x56\xc2\xa3\x6c\x1d\xc7\xae\x5b\x6f\xc7\x51\xa4\xb4\xa5\xb0\xf7\x10\x8f\x17\xf8\x7e\x7b\xcd\x9c\x19\xb2\x3b\xf4\xee\x11\x85\xcb\x0f\xf8\x96\xa2\xb9\xbb\x7a\x77\xe1\xac\x17\x4d\x06\x2e\x2d\x67\x82\x7f\xa1\x16\x38\x8a\x83\x6e\x07\xb9\x1c\x5a\xcb\x77\x68\xda\x7d\xfe\x4c\x4d\x55\xa6\x4e\x2d\x91\x56\xcd\x2a\x6e\x19\x87\xaa\x28\x98\x4c\xd1\x69\x19\x81\x57\xc6\xaa\x72\xc9\x0b\xc2\x1d\xae\x32\xb2\x7e\xca\x2c\x5d\x07\x61\x9a\xde\x73\x59\x59\x32\x57\xaf\x7f\xbe\x7e\x77\x7a\x65\xac\xb5\xd2\x61\xe2\x66\x2c\xd2\xb4\x21\xed\xb8\xc4\x1d\x2e\x63\xab\xca\x4b\x9c\x45\x47\x5a\x65\x6e\x8f\x9d\x85\x72\x41\xd2\x8a\xbd\xe3\x8e\xcb\x8a\xce\xaf\xd5\x39\x17\x74\xf5\xbf\xab\x25\x19\xeb\xbb\x71\xc2\xe1\xf7\x15\xc9\xed\xe0\x87\x33\x77\x7d\x8d\x3f\x71\x82\x03\x3c\x6a\x6e\xc9\xff\xa0\x8c\x45\xe7\xf2\x91\x35\x0b\xbe\x99\x86\x7f\x86\xba\xec\x9c\x55\x04\xf0\xcd\xd5\x0b\x45\xf0\x33\xfb\xc2\x9e\xcb\x6b\x73\xad\x6a\x5c\x5a\x5e\xa8\xca\xba\xed\xed\xfe\x74\x2e\xbf\x9e\x81\xc4\x96\x69\xeb\xc7\x82\xa8\x84\x1f\x53\xa2\x64\x6a\xf0\xe6\x2c\xd7\xd7\x8e\xf7\x57\x00\x00\x00\xff\xff\xce\xe0\x6c\xf9\xce\x07\x00\x00") +var _testImagesWindowsPowershellHelperDockerfile_windows = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x94\x55\xe1\x8f\xda\xc6\x13\xfd\xee\xbf\xe2\xfd\x20\xf7\xbb\x3b\xe9\x6c\x2e\xa8\x4d\x1b\xa2\xfb\xe0\x02\x51\x50\x38\xb0\x30\x97\x53\x24\xa4\x6a\xb1\x07\x7b\x75\xeb\x5d\x77\x77\x8d\x21\x55\xfe\xf7\x6a\xcd\x91\x33\x34\x69\x55\x7f\x40\xab\x99\xd9\x37\x33\xef\xcd\x0e\x5d\x0c\x55\xb9\xd7\x3c\xcb\x2d\xfa\xb7\xfd\x5b\x2c\x73\xc2\xc7\x6a\x4d\x5a\x92\x25\x83\xb0\xb2\xb9\xd2\x26\xf0\xba\x5e\x17\x53\x9e\x90\x34\x94\xa2\x92\x29\x69\xd8\x9c\x10\x96\x2c\xc9\xe9\xe8\xb9\xc1\x27\xd2\x86\x2b\x89\x7e\x70\x8b\x2b\x17\xd0\x79\x76\x75\xae\xdf\x79\x5d\xec\x55\x85\x82\xed\x21\x95\x45\x65\x08\x36\xe7\x06\x1b\x2e\x08\xb4\x4b\xa8\xb4\xe0\x12\x89\x2a\x4a\xc1\x99\x4c\x08\x35\xb7\x79\x93\xe6\x19\x24\xf0\xba\xf8\xfc\x0c\xa1\xd6\x96\x71\x09\x86\x44\x95\x7b\xa8\x4d\x3b\x0e\xcc\x36\x05\xbb\x2f\xb7\xb6\x1c\xf4\x7a\x75\x5d\x07\xac\x29\x36\x50\x3a\xeb\x89\x43\xa0\xe9\x4d\x27\xc3\xf1\x2c\x1e\xfb\xfd\xe0\xb6\xb9\xf2\x20\x05\x19\x03\x4d\x7f\x54\x5c\x53\x8a\xf5\x1e\xac\x2c\x05\x4f\xd8\x5a\x10\x04\xab\xa1\x34\x58\xa6\x89\x52\x58\xe5\xea\xad\x35\xb7\x5c\x66\x37\x30\x6a\x63\x6b\xa6\xc9\xeb\x22\xe5\xc6\x6a\xbe\xae\xec\x09\x59\xc7\xea\xb8\x39\x09\x50\x12\x4c\xa2\x13\xc6\x98\xc4\x1d\xfc\x16\xc6\x93\xf8\xc6\xeb\xe2\x71\xb2\xfc\x30\x7f\x58\xe2\x31\x5c\x2c\xc2\xd9\x72\x32\x8e\x31\x5f\x60\x38\x9f\x8d\x26\xcb\xc9\x7c\x16\x63\xfe\x1e\xe1\xec\x33\x3e\x4e\x66\xa3\x1b\x10\xb7\x39\x69\xd0\xae\xd4\xae\x7e\xa5\xc1\x1d\x8d\x94\x3a\xce\x62\xa2\x93\x02\x36\xea\x50\x90\x29\x29\xe1\x1b\x9e\x40\x30\x99\x55\x2c\x23\x64\x6a\x4b\x5a\x72\x99\xa1\x24\x5d\x70\xe3\xc4\x34\x60\x32\xf5\xba\x10\xbc\xe0\x96\xd9\xc6\xf2\xb7\xa6\x02\xcf\x7b\xbf\x98\xdf\xa3\x48\x74\x50\xf0\x44\x2b\xc7\x46\x90\xa8\xa2\x57\x73\x99\xaa\xda\xf4\x0c\xe9\x2d\xe9\x44\x69\x1a\x08\x6b\x92\xfe\xed\xeb\xb7\x60\x06\xa5\xa6\xd2\xf3\xc6\xb3\x4f\x88\xe2\xdf\x3f\x8d\x17\xf1\x64\x3e\xbb\x7b\x13\xf4\x83\x5f\xbc\x70\x34\x6a\xe4\x33\x83\x5e\x2f\xe3\x36\xaf\xd6\x0d\x60\xa4\x6a\xd2\x71\x4e\x42\xb4\x8f\x9a\x04\x31\xa7\x68\xaa\x6a\x29\x14\x4b\x7b\xdb\x57\x2f\x88\xad\x48\xbf\x65\xf6\x6b\x2e\xfd\xdd\x9b\x9f\x82\x2f\xbc\x44\x1b\xad\x74\x47\xe3\x8e\xce\xe5\x79\x8b\x87\x19\x92\x14\xc3\xc1\xea\x25\x08\xff\x5f\x79\x6e\xc2\x2c\xd3\x01\xed\x08\xfe\x6e\x83\xd3\x7b\xc7\x88\x94\xc4\x0f\x3c\xc5\x93\xe0\xf2\xa9\xed\x74\x48\x65\x6d\x72\x77\xf8\x57\x4e\x25\x93\xea\xc0\xeb\xe0\xf5\xaf\xb7\x6f\x3d\x6f\x38\x8f\x3e\xc3\xf7\x37\x5a\x15\x77\x8e\xd9\x76\x53\xed\xb3\xe7\x75\x61\xc8\x82\x61\xc3\x77\x94\x42\xa8\xa4\x51\xf6\xdb\x68\xdc\xab\xb4\x12\x04\x26\x99\xd8\x1b\x6e\x90\xb8\xa7\xd3\xc8\x34\x9d\x0f\xc3\x69\x18\x45\xa3\x70\x19\xde\x75\x86\x83\xd5\x83\x21\x6d\x56\x43\x25\xdd\x83\x24\x1d\xa6\x05\x97\x6e\xbc\x99\x55\x7a\x15\x96\xe5\x88\x59\xb6\x9a\xaa\x84\x89\x0e\x0e\x5d\x47\xf1\x01\x3e\x7c\x46\x1f\x3a\xf0\x88\xd9\xfc\x3f\xe2\xad\xee\x8f\xac\xac\x1e\x0f\x8c\xb4\xe4\x59\xa5\x2a\x79\x22\xbd\xfa\x4e\xaa\x63\x1d\x5d\x44\x6e\x5f\x19\x8b\x8b\x28\x1e\xce\x17\xe3\x0b\xb8\x0e\xb7\x4c\xf3\xe6\xb9\x3b\x32\x2a\x43\x1a\x89\x92\x5b\x92\x9c\x64\x42\xcf\x0d\xb8\xe8\xa6\xda\x56\xc2\xa3\x6c\x1d\xc7\xae\x5b\x6f\xc7\x51\xa4\xb4\xa5\xb0\xf7\x10\x8f\x17\xf8\x7e\x7b\xcd\x9c\x19\xb2\x3b\xf4\xee\x11\x85\xcb\x0f\xf8\x96\xa2\xb9\xbb\x7a\x77\xe1\xac\x17\x4d\x06\x2e\x2d\x67\x82\x7f\xa1\x16\x38\x8a\x83\x6e\x07\xb9\x1c\x5a\xcb\x77\x68\xda\x7d\xfe\x4c\x4d\x55\xa6\x4e\x2d\x91\x56\xcd\x2a\x6e\x19\x87\xaa\x28\x98\x4c\xd1\x69\x19\x81\x57\xc6\xaa\x72\xc9\x0b\xc2\x1d\xae\x32\xb2\x7e\xca\x2c\x5d\x07\x61\x9a\xde\x73\x59\x59\x32\x57\xaf\x7f\xbe\x7e\x77\x7a\x65\xac\xb5\xd2\x61\xe2\x66\x2c\xd2\xb4\x21\xed\xb8\xc4\x1d\x2e\x63\xab\xca\x4b\x9c\x45\x47\x5a\x65\x6e\x8f\x9d\x85\x72\x41\xd2\x8a\xbd\xe3\x8e\xcb\x8a\xce\xaf\xd5\x39\x17\x74\xf5\xbf\xab\x25\x19\xeb\xbb\x71\xc2\xe1\xf7\x15\xc9\xed\xe0\x87\x33\x77\x7d\x8d\x3f\x71\x82\x03\x3c\x6a\x6e\xc9\xff\xa0\x8c\x45\xe7\xf2\x91\x35\x0b\xbe\x99\x86\x7f\x86\xba\xec\x9c\x55\x04\xf0\xcd\xd5\x0b\x45\xf0\x33\xfb\xc2\x9e\xcb\x6b\x73\xad\x6a\x5c\x5a\x5e\xa8\xca\xba\xed\xed\xfe\x74\x2e\xbf\x9e\x81\xc4\x96\x69\xeb\xc7\x82\xa8\x84\x1f\x53\xa2\x64\x6a\xf0\xe6\x2c\xd7\xd7\x8e\xf7\x57\x00\x00\x00\xff\xff\xce\xe0\x6c\xf9\xce\x07\x00\x00") -func testImagesWindowsPowershellHelperDockerfileBytes() ([]byte, error) { +func testImagesWindowsPowershellHelperDockerfile_windowsBytes() ([]byte, error) { return bindataRead( - _testImagesWindowsPowershellHelperDockerfile, - "test/images/windows/powershell-helper/Dockerfile", + _testImagesWindowsPowershellHelperDockerfile_windows, + "test/images/windows/powershell-helper/Dockerfile_windows", ) } -func testImagesWindowsPowershellHelperDockerfile() (*asset, error) { - bytes, err := testImagesWindowsPowershellHelperDockerfileBytes() +func testImagesWindowsPowershellHelperDockerfile_windows() (*asset, error) { + bytes, err := testImagesWindowsPowershellHelperDockerfile_windowsBytes() if err != nil { return nil, err } - info := bindataFileInfo{name: "test/images/windows/powershell-helper/Dockerfile", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + info := bindataFileInfo{name: "test/images/windows/powershell-helper/Dockerfile_windows", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7221,7 +7977,7 @@ func testImagesWindowsPowershellHelperVersion() (*asset, error) { return a, nil } -var _testImagesWindowsServercoreCacheBaseimage = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\xcd\xd1\x0a\x42\x21\x0c\x80\xe1\xfb\xf3\x30\x67\xd3\x24\x32\xe8\x61\x62\x1a\x08\xce\xc1\x66\xd9\xe3\x87\x97\x76\xe5\xfd\xff\xf1\xd7\xd2\xde\x5f\x78\x72\xba\x06\x70\x37\x8c\x0f\x26\x3d\xb9\x90\x8a\xc9\xab\x9f\x24\x0c\xa3\xb4\x24\xc3\xc0\xb2\x7e\xb2\x92\x68\xbe\xd7\x6e\xe4\xd1\xc5\x63\xe1\x11\x2f\x7b\x7c\x96\xff\x74\xf3\x3c\xcb\x85\x7a\xc4\xb0\x47\x67\x79\xfc\x02\x00\x00\xff\xff\x33\x66\x70\xb2\xf0\x00\x00\x00") +var _testImagesWindowsServercoreCacheBaseimage = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\xcd\xc1\x0a\x83\x30\x0c\x80\xe1\xbb\x0f\x63\x62\x26\x63\x1d\xec\xee\x6b\x8c\xd8\x41\xc1\x18\x48\xdc\xdc\xe3\x4b\x8f\xed\x29\xf7\xff\xe3\xdf\xca\xfe\xfd\xc3\x5b\xd6\xfb\x0c\xd3\x03\xd3\x4b\xd8\x46\x29\x6c\xea\xfa\x39\x46\x56\x81\xb3\xec\xab\x9e\x0e\x9e\xed\x97\x8d\xd5\xf2\x73\x3b\x9c\x09\xa7\x34\x34\x3c\xe1\x2d\xc6\x6b\xd9\xd3\xe0\xb9\x96\x0d\x25\xc4\x39\x46\x6b\xd9\xd1\x85\xa2\x74\xa1\xe1\x0a\x00\x00\xff\xff\x5d\x6a\xf0\xd1\x2b\x01\x00\x00") func testImagesWindowsServercoreCacheBaseimageBytes() ([]byte, error) { return bindataRead( @@ -8215,6 +8971,7 @@ func AssetNames() []string { var _bindata = map[string]func() (*asset, error){ "test/conformance/testdata/OWNERS": testConformanceTestdataOwners, "test/conformance/testdata/conformance.yaml": testConformanceTestdataConformanceYaml, + "test/conformance/testdata/ineligible_endpoints.yaml": testConformanceTestdataIneligible_endpointsYaml, "test/e2e/testing-manifests/flexvolume/attachable-with-long-mount": testE2eTestingManifestsFlexvolumeAttachableWithLongMount, "test/e2e/testing-manifests/flexvolume/dummy": testE2eTestingManifestsFlexvolumeDummy, "test/e2e/testing-manifests/flexvolume/dummy-attachable": testE2eTestingManifestsFlexvolumeDummyAttachable, @@ -8325,6 +9082,7 @@ var _bindata = map[string]func() (*asset, error){ "test/e2e/testing-manifests/storage-csi/mock/csi-mock-driver-snapshotter.yaml": testE2eTestingManifestsStorageCsiMockCsiMockDriverSnapshotterYaml, "test/e2e/testing-manifests/storage-csi/mock/csi-mock-driver.yaml": testE2eTestingManifestsStorageCsiMockCsiMockDriverYaml, "test/e2e/testing-manifests/storage-csi/mock/csi-mock-driverinfo.yaml": testE2eTestingManifestsStorageCsiMockCsiMockDriverinfoYaml, + "test/e2e/testing-manifests/storage-csi/mock/csi-mock-proxy.yaml": testE2eTestingManifestsStorageCsiMockCsiMockProxyYaml, "test/e2e/testing-manifests/storage-csi/mock/csi-mock-rbac.yaml": testE2eTestingManifestsStorageCsiMockCsiMockRbacYaml, "test/e2e/testing-manifests/storage-csi/mock/csi-storageclass.yaml": testE2eTestingManifestsStorageCsiMockCsiStorageclassYaml, "test/e2e_node/testing-manifests/sriovdp-cm.yaml": testE2e_nodeTestingManifestsSriovdpCmYaml, @@ -8401,6 +9159,7 @@ var _bindata = map[string]func() (*asset, error){ "test/images/apparmor-loader/example-pod.yaml": testImagesApparmorLoaderExamplePodYaml, "test/images/apparmor-loader/loader.go": testImagesApparmorLoaderLoaderGo, "test/images/busybox/BASEIMAGE": testImagesBusyboxBaseimage, + "test/images/busybox/Dockerfile": testImagesBusyboxDockerfile, "test/images/busybox/Dockerfile_windows": testImagesBusyboxDockerfile_windows, "test/images/busybox/Makefile": testImagesBusyboxMakefile, "test/images/busybox/OWNERS": testImagesBusyboxOwners, @@ -8420,6 +9179,22 @@ var _bindata = map[string]func() (*asset, error){ "test/images/echoserver/nginx.conf": testImagesEchoserverNginxConf, "test/images/echoserver/run.sh": testImagesEchoserverRunSh, "test/images/echoserver/template.lua": testImagesEchoserverTemplateLua, + "test/images/glusterdynamic-provisioner/BASEIMAGE": testImagesGlusterdynamicProvisionerBaseimage, + "test/images/glusterdynamic-provisioner/Dockerfile": testImagesGlusterdynamicProvisionerDockerfile, + "test/images/glusterdynamic-provisioner/VERSION": testImagesGlusterdynamicProvisionerVersion, + "test/images/httpd/BASEIMAGE": testImagesHttpdBaseimage, + "test/images/httpd/Dockerfile": testImagesHttpdDockerfile, + "test/images/httpd/Dockerfile_windows": testImagesHttpdDockerfile_windows, + "test/images/httpd/VERSION": testImagesHttpdVersion, + "test/images/httpd/httpd.conf": testImagesHttpdHttpdConf, + "test/images/httpd/index.html": testImagesHttpdIndexHtml, + "test/images/httpd-new/ALIAS": testImagesHttpdNewAlias, + "test/images/httpd-new/BASEIMAGE": testImagesHttpdNewBaseimage, + "test/images/httpd-new/Dockerfile": testImagesHttpdNewDockerfile, + "test/images/httpd-new/Dockerfile_windows": testImagesHttpdNewDockerfile_windows, + "test/images/httpd-new/VERSION": testImagesHttpdNewVersion, + "test/images/httpd-new/httpd.conf": testImagesHttpdNewHttpdConf, + "test/images/httpd-new/index.html": testImagesHttpdNewIndexHtml, "test/images/image-util.sh": testImagesImageUtilSh, "test/images/ipc-utils/BASEIMAGE": testImagesIpcUtilsBaseimage, "test/images/ipc-utils/Dockerfile": testImagesIpcUtilsDockerfile, @@ -8445,6 +9220,15 @@ var _bindata = map[string]func() (*asset, error){ "test/images/nautilus/OWNERS": testImagesNautilusOwners, "test/images/nautilus/VERSION": testImagesNautilusVersion, "test/images/nautilus/html/data.json": testImagesNautilusHtmlDataJson, + "test/images/nginx/BASEIMAGE": testImagesNginxBaseimage, + "test/images/nginx/Dockerfile": testImagesNginxDockerfile, + "test/images/nginx/Dockerfile_windows": testImagesNginxDockerfile_windows, + "test/images/nginx/VERSION": testImagesNginxVersion, + "test/images/nginx-new/ALIAS": testImagesNginxNewAlias, + "test/images/nginx-new/BASEIMAGE": testImagesNginxNewBaseimage, + "test/images/nginx-new/Dockerfile": testImagesNginxNewDockerfile, + "test/images/nginx-new/Dockerfile_windows": testImagesNginxNewDockerfile_windows, + "test/images/nginx-new/VERSION": testImagesNginxNewVersion, "test/images/node-perf/npb-ep/BASEIMAGE": testImagesNodePerfNpbEpBaseimage, "test/images/node-perf/npb-ep/Dockerfile": testImagesNodePerfNpbEpDockerfile, "test/images/node-perf/npb-ep/VERSION": testImagesNodePerfNpbEpVersion, @@ -8466,6 +9250,9 @@ var _bindata = map[string]func() (*asset, error){ "test/images/nonroot/Dockerfile_windows": testImagesNonrootDockerfile_windows, "test/images/nonroot/OWNERS": testImagesNonrootOwners, "test/images/nonroot/VERSION": testImagesNonrootVersion, + "test/images/perl/BASEIMAGE": testImagesPerlBaseimage, + "test/images/perl/Dockerfile": testImagesPerlDockerfile, + "test/images/perl/VERSION": testImagesPerlVersion, "test/images/pets/peer-finder/BASEIMAGE": testImagesPetsPeerFinderBaseimage, "test/images/pets/peer-finder/Dockerfile": testImagesPetsPeerFinderDockerfile, "test/images/pets/peer-finder/Makefile": testImagesPetsPeerFinderMakefile, @@ -8490,6 +9277,7 @@ var _bindata = map[string]func() (*asset, error){ "test/images/redis/VERSION": testImagesRedisVersion, "test/images/redis/redis.conf": testImagesRedisRedisConf, "test/images/regression-issue-74839/.gitignore": testImagesRegressionIssue74839Gitignore, + "test/images/regression-issue-74839/BASEIMAGE": testImagesRegressionIssue74839Baseimage, "test/images/regression-issue-74839/Dockerfile": testImagesRegressionIssue74839Dockerfile, "test/images/regression-issue-74839/Makefile": testImagesRegressionIssue74839Makefile, "test/images/regression-issue-74839/OWNERS": testImagesRegressionIssue74839Owners, @@ -8500,13 +9288,18 @@ var _bindata = map[string]func() (*asset, error){ "test/images/resource-consumer/.gitignore": testImagesResourceConsumerGitignore, "test/images/resource-consumer/BASEIMAGE": testImagesResourceConsumerBaseimage, "test/images/resource-consumer/Dockerfile": testImagesResourceConsumerDockerfile, + "test/images/resource-consumer/Dockerfile_windows": testImagesResourceConsumerDockerfile_windows, "test/images/resource-consumer/Makefile": testImagesResourceConsumerMakefile, "test/images/resource-consumer/VERSION": testImagesResourceConsumerVersion, "test/images/resource-consumer/common/common.go": testImagesResourceConsumerCommonCommonGo, + "test/images/resource-consumer/consume-cpu/common.go": testImagesResourceConsumerConsumeCpuCommonGo, "test/images/resource-consumer/consume-cpu/consume_cpu.go": testImagesResourceConsumerConsumeCpuConsume_cpuGo, + "test/images/resource-consumer/consume-cpu/consume_cpu_windows.go": testImagesResourceConsumerConsumeCpuConsume_cpu_windowsGo, "test/images/resource-consumer/resource_consumer.go": testImagesResourceConsumerResource_consumerGo, "test/images/resource-consumer/resource_consumer_handler.go": testImagesResourceConsumerResource_consumer_handlerGo, "test/images/resource-consumer/utils.go": testImagesResourceConsumerUtilsGo, + "test/images/resource-consumer/utils_common.go": testImagesResourceConsumerUtils_commonGo, + "test/images/resource-consumer/utils_windows.go": testImagesResourceConsumerUtils_windowsGo, "test/images/sample-apiserver/BASEIMAGE": testImagesSampleApiserverBaseimage, "test/images/sample-apiserver/Dockerfile": testImagesSampleApiserverDockerfile, "test/images/sample-apiserver/Dockerfile_windows": testImagesSampleApiserverDockerfile_windows, @@ -8547,9 +9340,8 @@ var _bindata = map[string]func() (*asset, error){ "test/images/volume/rbd/mon.sh": testImagesVolumeRbdMonSh, "test/images/volume/rbd/osd.sh": testImagesVolumeRbdOsdSh, "test/images/windows/Makefile": testImagesWindowsMakefile, - "test/images/windows/busybox-helper/Dockerfile": testImagesWindowsBusyboxHelperDockerfile, - "test/images/windows/busybox-helper/VERSION": testImagesWindowsBusyboxHelperVersion, "test/images/windows/powershell-helper/Dockerfile": testImagesWindowsPowershellHelperDockerfile, + "test/images/windows/powershell-helper/Dockerfile_windows": testImagesWindowsPowershellHelperDockerfile_windows, "test/images/windows/powershell-helper/VERSION": testImagesWindowsPowershellHelperVersion, "test/images/windows-servercore-cache/BASEIMAGE": testImagesWindowsServercoreCacheBaseimage, "test/images/windows-servercore-cache/Dockerfile": testImagesWindowsServercoreCacheDockerfile, @@ -8644,8 +9436,9 @@ var _bintree = &bintree{nil, map[string]*bintree{ "test": {nil, map[string]*bintree{ "conformance": {nil, map[string]*bintree{ "testdata": {nil, map[string]*bintree{ - "OWNERS": {testConformanceTestdataOwners, map[string]*bintree{}}, - "conformance.yaml": {testConformanceTestdataConformanceYaml, map[string]*bintree{}}, + "OWNERS": {testConformanceTestdataOwners, map[string]*bintree{}}, + "conformance.yaml": {testConformanceTestdataConformanceYaml, map[string]*bintree{}}, + "ineligible_endpoints.yaml": {testConformanceTestdataIneligible_endpointsYaml, map[string]*bintree{}}, }}, }}, "e2e": {nil, map[string]*bintree{ @@ -8832,6 +9625,7 @@ var _bintree = &bintree{nil, map[string]*bintree{ "csi-mock-driver-snapshotter.yaml": {testE2eTestingManifestsStorageCsiMockCsiMockDriverSnapshotterYaml, map[string]*bintree{}}, "csi-mock-driver.yaml": {testE2eTestingManifestsStorageCsiMockCsiMockDriverYaml, map[string]*bintree{}}, "csi-mock-driverinfo.yaml": {testE2eTestingManifestsStorageCsiMockCsiMockDriverinfoYaml, map[string]*bintree{}}, + "csi-mock-proxy.yaml": {testE2eTestingManifestsStorageCsiMockCsiMockProxyYaml, map[string]*bintree{}}, "csi-mock-rbac.yaml": {testE2eTestingManifestsStorageCsiMockCsiMockRbacYaml, map[string]*bintree{}}, "csi-storageclass.yaml": {testE2eTestingManifestsStorageCsiMockCsiStorageclassYaml, map[string]*bintree{}}, }}, @@ -9078,6 +9872,7 @@ var _bintree = &bintree{nil, map[string]*bintree{ }}, "busybox": {nil, map[string]*bintree{ "BASEIMAGE": {testImagesBusyboxBaseimage, map[string]*bintree{}}, + "Dockerfile": {testImagesBusyboxDockerfile, map[string]*bintree{}}, "Dockerfile_windows": {testImagesBusyboxDockerfile_windows, map[string]*bintree{}}, "Makefile": {testImagesBusyboxMakefile, map[string]*bintree{}}, "OWNERS": {testImagesBusyboxOwners, map[string]*bintree{}}, @@ -9102,6 +9897,28 @@ var _bintree = &bintree{nil, map[string]*bintree{ "run.sh": {testImagesEchoserverRunSh, map[string]*bintree{}}, "template.lua": {testImagesEchoserverTemplateLua, map[string]*bintree{}}, }}, + "glusterdynamic-provisioner": {nil, map[string]*bintree{ + "BASEIMAGE": {testImagesGlusterdynamicProvisionerBaseimage, map[string]*bintree{}}, + "Dockerfile": {testImagesGlusterdynamicProvisionerDockerfile, map[string]*bintree{}}, + "VERSION": {testImagesGlusterdynamicProvisionerVersion, map[string]*bintree{}}, + }}, + "httpd": {nil, map[string]*bintree{ + "BASEIMAGE": {testImagesHttpdBaseimage, map[string]*bintree{}}, + "Dockerfile": {testImagesHttpdDockerfile, map[string]*bintree{}}, + "Dockerfile_windows": {testImagesHttpdDockerfile_windows, map[string]*bintree{}}, + "VERSION": {testImagesHttpdVersion, map[string]*bintree{}}, + "httpd.conf": {testImagesHttpdHttpdConf, map[string]*bintree{}}, + "index.html": {testImagesHttpdIndexHtml, map[string]*bintree{}}, + }}, + "httpd-new": {nil, map[string]*bintree{ + "ALIAS": {testImagesHttpdNewAlias, map[string]*bintree{}}, + "BASEIMAGE": {testImagesHttpdNewBaseimage, map[string]*bintree{}}, + "Dockerfile": {testImagesHttpdNewDockerfile, map[string]*bintree{}}, + "Dockerfile_windows": {testImagesHttpdNewDockerfile_windows, map[string]*bintree{}}, + "VERSION": {testImagesHttpdNewVersion, map[string]*bintree{}}, + "httpd.conf": {testImagesHttpdNewHttpdConf, map[string]*bintree{}}, + "index.html": {testImagesHttpdNewIndexHtml, map[string]*bintree{}}, + }}, "image-util.sh": {testImagesImageUtilSh, map[string]*bintree{}}, "ipc-utils": {nil, map[string]*bintree{ "BASEIMAGE": {testImagesIpcUtilsBaseimage, map[string]*bintree{}}, @@ -9141,6 +9958,19 @@ var _bintree = &bintree{nil, map[string]*bintree{ "data.json": {testImagesNautilusHtmlDataJson, map[string]*bintree{}}, }}, }}, + "nginx": {nil, map[string]*bintree{ + "BASEIMAGE": {testImagesNginxBaseimage, map[string]*bintree{}}, + "Dockerfile": {testImagesNginxDockerfile, map[string]*bintree{}}, + "Dockerfile_windows": {testImagesNginxDockerfile_windows, map[string]*bintree{}}, + "VERSION": {testImagesNginxVersion, map[string]*bintree{}}, + }}, + "nginx-new": {nil, map[string]*bintree{ + "ALIAS": {testImagesNginxNewAlias, map[string]*bintree{}}, + "BASEIMAGE": {testImagesNginxNewBaseimage, map[string]*bintree{}}, + "Dockerfile": {testImagesNginxNewDockerfile, map[string]*bintree{}}, + "Dockerfile_windows": {testImagesNginxNewDockerfile_windows, map[string]*bintree{}}, + "VERSION": {testImagesNginxNewVersion, map[string]*bintree{}}, + }}, "node-perf": {nil, map[string]*bintree{ "npb-ep": {nil, map[string]*bintree{ "BASEIMAGE": {testImagesNodePerfNpbEpBaseimage, map[string]*bintree{}}, @@ -9174,6 +10004,11 @@ var _bintree = &bintree{nil, map[string]*bintree{ "OWNERS": {testImagesNonrootOwners, map[string]*bintree{}}, "VERSION": {testImagesNonrootVersion, map[string]*bintree{}}, }}, + "perl": {nil, map[string]*bintree{ + "BASEIMAGE": {testImagesPerlBaseimage, map[string]*bintree{}}, + "Dockerfile": {testImagesPerlDockerfile, map[string]*bintree{}}, + "VERSION": {testImagesPerlVersion, map[string]*bintree{}}, + }}, "pets": {nil, map[string]*bintree{ "peer-finder": {nil, map[string]*bintree{ "BASEIMAGE": {testImagesPetsPeerFinderBaseimage, map[string]*bintree{}}, @@ -9209,6 +10044,7 @@ var _bintree = &bintree{nil, map[string]*bintree{ }}, "regression-issue-74839": {nil, map[string]*bintree{ ".gitignore": {testImagesRegressionIssue74839Gitignore, map[string]*bintree{}}, + "BASEIMAGE": {testImagesRegressionIssue74839Baseimage, map[string]*bintree{}}, "Dockerfile": {testImagesRegressionIssue74839Dockerfile, map[string]*bintree{}}, "Makefile": {testImagesRegressionIssue74839Makefile, map[string]*bintree{}}, "OWNERS": {testImagesRegressionIssue74839Owners, map[string]*bintree{}}, @@ -9218,20 +10054,25 @@ var _bintree = &bintree{nil, map[string]*bintree{ "tcp_test.go": {testImagesRegressionIssue74839Tcp_testGo, map[string]*bintree{}}, }}, "resource-consumer": {nil, map[string]*bintree{ - ".gitignore": {testImagesResourceConsumerGitignore, map[string]*bintree{}}, - "BASEIMAGE": {testImagesResourceConsumerBaseimage, map[string]*bintree{}}, - "Dockerfile": {testImagesResourceConsumerDockerfile, map[string]*bintree{}}, - "Makefile": {testImagesResourceConsumerMakefile, map[string]*bintree{}}, - "VERSION": {testImagesResourceConsumerVersion, map[string]*bintree{}}, + ".gitignore": {testImagesResourceConsumerGitignore, map[string]*bintree{}}, + "BASEIMAGE": {testImagesResourceConsumerBaseimage, map[string]*bintree{}}, + "Dockerfile": {testImagesResourceConsumerDockerfile, map[string]*bintree{}}, + "Dockerfile_windows": {testImagesResourceConsumerDockerfile_windows, map[string]*bintree{}}, + "Makefile": {testImagesResourceConsumerMakefile, map[string]*bintree{}}, + "VERSION": {testImagesResourceConsumerVersion, map[string]*bintree{}}, "common": {nil, map[string]*bintree{ "common.go": {testImagesResourceConsumerCommonCommonGo, map[string]*bintree{}}, }}, "consume-cpu": {nil, map[string]*bintree{ - "consume_cpu.go": {testImagesResourceConsumerConsumeCpuConsume_cpuGo, map[string]*bintree{}}, + "common.go": {testImagesResourceConsumerConsumeCpuCommonGo, map[string]*bintree{}}, + "consume_cpu.go": {testImagesResourceConsumerConsumeCpuConsume_cpuGo, map[string]*bintree{}}, + "consume_cpu_windows.go": {testImagesResourceConsumerConsumeCpuConsume_cpu_windowsGo, map[string]*bintree{}}, }}, "resource_consumer.go": {testImagesResourceConsumerResource_consumerGo, map[string]*bintree{}}, "resource_consumer_handler.go": {testImagesResourceConsumerResource_consumer_handlerGo, map[string]*bintree{}}, "utils.go": {testImagesResourceConsumerUtilsGo, map[string]*bintree{}}, + "utils_common.go": {testImagesResourceConsumerUtils_commonGo, map[string]*bintree{}}, + "utils_windows.go": {testImagesResourceConsumerUtils_windowsGo, map[string]*bintree{}}, }}, "sample-apiserver": {nil, map[string]*bintree{ "BASEIMAGE": {testImagesSampleApiserverBaseimage, map[string]*bintree{}}, @@ -9288,13 +10129,10 @@ var _bintree = &bintree{nil, map[string]*bintree{ }}, "windows": {nil, map[string]*bintree{ "Makefile": {testImagesWindowsMakefile, map[string]*bintree{}}, - "busybox-helper": {nil, map[string]*bintree{ - "Dockerfile": {testImagesWindowsBusyboxHelperDockerfile, map[string]*bintree{}}, - "VERSION": {testImagesWindowsBusyboxHelperVersion, map[string]*bintree{}}, - }}, "powershell-helper": {nil, map[string]*bintree{ - "Dockerfile": {testImagesWindowsPowershellHelperDockerfile, map[string]*bintree{}}, - "VERSION": {testImagesWindowsPowershellHelperVersion, map[string]*bintree{}}, + "Dockerfile": {testImagesWindowsPowershellHelperDockerfile, map[string]*bintree{}}, + "Dockerfile_windows": {testImagesWindowsPowershellHelperDockerfile_windows, map[string]*bintree{}}, + "VERSION": {testImagesWindowsPowershellHelperVersion, map[string]*bintree{}}, }}, }}, "windows-servercore-cache": {nil, map[string]*bintree{ diff --git a/vendor/k8s.io/kubernetes/test/e2e/gke_node_pools.go b/vendor/k8s.io/kubernetes/test/e2e/gke_node_pools.go deleted file mode 100644 index ab16e31f5424..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/gke_node_pools.go +++ /dev/null @@ -1,111 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package e2e - -import ( - "fmt" - "os/exec" - - "k8s.io/kubernetes/test/e2e/framework" - e2enode "k8s.io/kubernetes/test/e2e/framework/node" - e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" - - "github.com/onsi/ginkgo" -) - -var _ = framework.KubeDescribe("GKE node pools [Feature:GKENodePool]", func() { - - f := framework.NewDefaultFramework("node-pools") - - ginkgo.BeforeEach(func() { - e2eskipper.SkipUnlessProviderIs("gke") - }) - - ginkgo.It("should create a cluster with multiple node pools [Feature:GKENodePool]", func() { - framework.Logf("Start create node pool test") - testCreateDeleteNodePool(f, "test-pool") - }) -}) - -func testCreateDeleteNodePool(f *framework.Framework, poolName string) { - framework.Logf("Create node pool: %q in cluster: %q", poolName, framework.TestContext.CloudConfig.Cluster) - - clusterStr := fmt.Sprintf("--cluster=%s", framework.TestContext.CloudConfig.Cluster) - - out, err := exec.Command("gcloud", "container", "node-pools", "create", - poolName, - clusterStr, - "--num-nodes=2").CombinedOutput() - framework.Logf("\n%s", string(out)) - if err != nil { - framework.Failf("Failed to create node pool %q. Err: %v\n%v", poolName, err, string(out)) - } - framework.Logf("Successfully created node pool %q.", poolName) - - out, err = exec.Command("gcloud", "container", "node-pools", "list", - clusterStr).CombinedOutput() - if err != nil { - framework.Failf("Failed to list node pools from cluster %q. Err: %v\n%v", framework.TestContext.CloudConfig.Cluster, err, string(out)) - } - framework.Logf("Node pools:\n%s", string(out)) - - framework.Logf("Checking that 2 nodes have the correct node pool label.") - nodeCount := nodesWithPoolLabel(f, poolName) - if nodeCount != 2 { - framework.Failf("Wanted 2 nodes with node pool label, got: %v", nodeCount) - } - framework.Logf("Success, found 2 nodes with correct node pool labels.") - - framework.Logf("Deleting node pool: %q in cluster: %q", poolName, framework.TestContext.CloudConfig.Cluster) - out, err = exec.Command("gcloud", "container", "node-pools", "delete", - poolName, - clusterStr, - "-q").CombinedOutput() - framework.Logf("\n%s", string(out)) - if err != nil { - framework.Failf("Failed to delete node pool %q. Err: %v\n%v", poolName, err, string(out)) - } - framework.Logf("Successfully deleted node pool %q.", poolName) - - out, err = exec.Command("gcloud", "container", "node-pools", "list", - clusterStr).CombinedOutput() - if err != nil { - framework.Failf("\nFailed to list node pools from cluster %q. Err: %v\n%v", framework.TestContext.CloudConfig.Cluster, err, string(out)) - } - framework.Logf("\nNode pools:\n%s", string(out)) - - framework.Logf("Checking that no nodes have the deleted node pool's label.") - nodeCount = nodesWithPoolLabel(f, poolName) - if nodeCount != 0 { - framework.Failf("Wanted 0 nodes with node pool label, got: %v", nodeCount) - } - framework.Logf("Success, found no nodes with the deleted node pool's label.") -} - -// nodesWithPoolLabel returns the number of nodes that have the "gke-nodepool" -// label with the given node pool name. -func nodesWithPoolLabel(f *framework.Framework, poolName string) int { - nodeCount := 0 - nodeList, err := e2enode.GetReadySchedulableNodes(f.ClientSet) - framework.ExpectNoError(err) - for _, node := range nodeList.Items { - if poolLabel := node.Labels["cloud.google.com/gke-nodepool"]; poolLabel == poolName { - nodeCount++ - } - } - return nodeCount -} diff --git a/vendor/k8s.io/kubernetes/test/e2e/instrumentation/BUILD b/vendor/k8s.io/kubernetes/test/e2e/instrumentation/BUILD deleted file mode 100644 index 3af2587ca404..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/instrumentation/BUILD +++ /dev/null @@ -1,48 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "events.go", - "imports.go", - ], - importpath = "k8s.io/kubernetes/test/e2e/instrumentation", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/events/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/events/v1:go_default_library", - "//test/e2e/framework:go_default_library", - "//test/e2e/instrumentation/common:go_default_library", - "//test/e2e/instrumentation/logging:go_default_library", - "//test/e2e/instrumentation/monitoring:go_default_library", - "//vendor/github.com/onsi/ginkgo:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//test/e2e/instrumentation/common:all-srcs", - "//test/e2e/instrumentation/logging:all-srcs", - "//test/e2e/instrumentation/monitoring:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/instrumentation/OWNERS b/vendor/k8s.io/kubernetes/test/e2e/instrumentation/OWNERS index 58bbcca63f8b..8231c37a13ba 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/instrumentation/OWNERS +++ b/vendor/k8s.io/kubernetes/test/e2e/instrumentation/OWNERS @@ -1,11 +1,11 @@ # See the OWNERS docs at https://go.k8s.io/owners approvers: -- fabxc - sig-instrumentation-approvers - x13n - kawych emeritus_approvers: +- fabxc - piosz - fgrzadkowski reviewers: diff --git a/vendor/k8s.io/kubernetes/test/e2e/instrumentation/common/BUILD b/vendor/k8s.io/kubernetes/test/e2e/instrumentation/common/BUILD deleted file mode 100644 index 4ef9497c2626..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/instrumentation/common/BUILD +++ /dev/null @@ -1,26 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["framework.go"], - importpath = "k8s.io/kubernetes/test/e2e/instrumentation/common", - deps = ["//vendor/github.com/onsi/ginkgo:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/instrumentation/core_events.go b/vendor/k8s.io/kubernetes/test/e2e/instrumentation/core_events.go new file mode 100644 index 000000000000..2d2b2d565b09 --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/instrumentation/core_events.go @@ -0,0 +1,201 @@ +/* +Copyright 2016 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package instrumentation + +import ( + "context" + "encoding/json" + "time" + + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/kubernetes/test/e2e/framework" + "k8s.io/kubernetes/test/e2e/instrumentation/common" + + "github.com/onsi/ginkgo" + "k8s.io/apimachinery/pkg/types" +) + +const ( + eventRetryPeriod = 1 * time.Second + eventRetryTimeout = 1 * time.Minute +) + +var _ = common.SIGDescribe("Events", func() { + f := framework.NewDefaultFramework("events") + + /* + Release: v1.20 + Testname: Event resource lifecycle + Description: Create an event, the event MUST exist. + The event is patched with a new message, the check MUST have the update message. + The event is deleted and MUST NOT show up when listing all events. + */ + framework.ConformanceIt("should ensure that an event can be fetched, patched, deleted, and listed", func() { + eventTestName := "event-test" + + ginkgo.By("creating a test event") + // create a test event in test namespace + _, err := f.ClientSet.CoreV1().Events(f.Namespace.Name).Create(context.TODO(), &v1.Event{ + ObjectMeta: metav1.ObjectMeta{ + Name: eventTestName, + Labels: map[string]string{ + "testevent-constant": "true", + }, + }, + Message: "This is a test event", + Reason: "Test", + Type: "Normal", + Count: 1, + InvolvedObject: v1.ObjectReference{ + Namespace: f.Namespace.Name, + }, + }, metav1.CreateOptions{}) + framework.ExpectNoError(err, "failed to create test event") + + ginkgo.By("listing all events in all namespaces") + // get a list of Events in all namespaces to ensure endpoint coverage + eventsList, err := f.ClientSet.CoreV1().Events("").List(context.TODO(), metav1.ListOptions{ + LabelSelector: "testevent-constant=true", + }) + framework.ExpectNoError(err, "failed list all events") + + foundCreatedEvent := false + var eventCreatedName string + for _, val := range eventsList.Items { + if val.ObjectMeta.Name == eventTestName && val.ObjectMeta.Namespace == f.Namespace.Name { + foundCreatedEvent = true + eventCreatedName = val.ObjectMeta.Name + break + } + } + framework.ExpectEqual(foundCreatedEvent, true, "unable to find the test event") + + ginkgo.By("patching the test event") + // patch the event's message + eventPatchMessage := "This is a test event - patched" + eventPatch, err := json.Marshal(map[string]interface{}{ + "message": eventPatchMessage, + }) + framework.ExpectNoError(err, "failed to marshal the patch JSON payload") + + _, err = f.ClientSet.CoreV1().Events(f.Namespace.Name).Patch(context.TODO(), eventTestName, types.StrategicMergePatchType, []byte(eventPatch), metav1.PatchOptions{}) + framework.ExpectNoError(err, "failed to patch the test event") + + ginkgo.By("fetching the test event") + // get event by name + event, err := f.ClientSet.CoreV1().Events(f.Namespace.Name).Get(context.TODO(), eventCreatedName, metav1.GetOptions{}) + framework.ExpectNoError(err, "failed to fetch the test event") + framework.ExpectEqual(event.Message, eventPatchMessage, "test event message does not match patch message") + + ginkgo.By("deleting the test event") + // delete original event + err = f.ClientSet.CoreV1().Events(f.Namespace.Name).Delete(context.TODO(), eventCreatedName, metav1.DeleteOptions{}) + framework.ExpectNoError(err, "failed to delete the test event") + + ginkgo.By("listing all events in all namespaces") + // get a list of Events list namespace + eventsList, err = f.ClientSet.CoreV1().Events("").List(context.TODO(), metav1.ListOptions{ + LabelSelector: "testevent-constant=true", + }) + framework.ExpectNoError(err, "fail to list all events") + foundCreatedEvent = false + for _, val := range eventsList.Items { + if val.ObjectMeta.Name == eventTestName && val.ObjectMeta.Namespace == f.Namespace.Name { + foundCreatedEvent = true + break + } + } + framework.ExpectEqual(foundCreatedEvent, false, "should not have found test event after deletion") + }) + + /* + Release: v1.20 + Testname: Event, delete a collection + Description: A set of events is created with a label selector which MUST be found when listed. + The set of events is deleted and MUST NOT show up when listed by its label selector. + */ + framework.ConformanceIt("should delete a collection of events", func() { + eventTestNames := []string{"test-event-1", "test-event-2", "test-event-3"} + + ginkgo.By("Create set of events") + // create a test event in test namespace + for _, eventTestName := range eventTestNames { + eventMessage := "This is " + eventTestName + _, err := f.ClientSet.CoreV1().Events(f.Namespace.Name).Create(context.TODO(), &v1.Event{ + + ObjectMeta: metav1.ObjectMeta{ + Name: eventTestName, + Labels: map[string]string{"testevent-set": "true"}, + }, + Message: eventMessage, + Reason: "Test", + Type: "Normal", + Count: 1, + InvolvedObject: v1.ObjectReference{ + Namespace: f.Namespace.Name, + }, + }, metav1.CreateOptions{}) + framework.ExpectNoError(err, "failed to create event") + framework.Logf("created %v", eventTestName) + } + + ginkgo.By("get a list of Events with a label in the current namespace") + // get a list of events + eventList, err := f.ClientSet.CoreV1().Events(f.Namespace.Name).List(context.TODO(), metav1.ListOptions{ + LabelSelector: "testevent-set=true", + }) + framework.ExpectNoError(err, "failed to get a list of events") + + framework.ExpectEqual(len(eventList.Items), len(eventTestNames), "looking for expected number of pod templates events") + + ginkgo.By("delete collection of events") + // delete collection + + framework.Logf("requesting DeleteCollection of events") + err = f.ClientSet.CoreV1().Events(f.Namespace.Name).DeleteCollection(context.TODO(), metav1.DeleteOptions{}, metav1.ListOptions{ + LabelSelector: "testevent-set=true"}) + framework.ExpectNoError(err, "failed to delete the test event") + + ginkgo.By("check that the list of events matches the requested quantity") + + err = wait.PollImmediate(eventRetryPeriod, eventRetryTimeout, checkEventListQuantity(f, "testevent-set=true", 0)) + framework.ExpectNoError(err, "failed to count required events") + }) + +}) + +func checkEventListQuantity(f *framework.Framework, label string, quantity int) func() (bool, error) { + return func() (bool, error) { + var err error + + framework.Logf("requesting list of events to confirm quantity") + + eventList, err := f.ClientSet.CoreV1().Events(f.Namespace.Name).List(context.TODO(), metav1.ListOptions{ + LabelSelector: label}) + + if err != nil { + return false, err + } + + if len(eventList.Items) != quantity { + return false, err + } + return true, nil + } +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/instrumentation/logging/BUILD b/vendor/k8s.io/kubernetes/test/e2e/instrumentation/logging/BUILD deleted file mode 100644 index 97cf77d94113..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/instrumentation/logging/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "generic_soak.go", - "imports.go", - ], - importpath = "k8s.io/kubernetes/test/e2e/instrumentation/logging", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//test/e2e/framework:go_default_library", - "//test/e2e/framework/config:go_default_library", - "//test/e2e/framework/node:go_default_library", - "//test/e2e/instrumentation/common:go_default_library", - "//test/e2e/instrumentation/logging/elasticsearch:go_default_library", - "//test/utils/image:go_default_library", - "//vendor/github.com/onsi/ginkgo:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//test/e2e/instrumentation/logging/elasticsearch:all-srcs", - "//test/e2e/instrumentation/logging/utils:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/instrumentation/logging/elasticsearch/BUILD b/vendor/k8s.io/kubernetes/test/e2e/instrumentation/logging/elasticsearch/BUILD deleted file mode 100644 index da7bc13b854d..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/instrumentation/logging/elasticsearch/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "basic.go", - "kibana.go", - "utils.go", - ], - importpath = "k8s.io/kubernetes/test/e2e/instrumentation/logging/elasticsearch", - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//test/e2e/framework:go_default_library", - "//test/e2e/framework/pod:go_default_library", - "//test/e2e/framework/service:go_default_library", - "//test/e2e/framework/skipper:go_default_library", - "//test/e2e/instrumentation/common:go_default_library", - "//test/e2e/instrumentation/logging/utils:go_default_library", - "//vendor/github.com/onsi/ginkgo:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/instrumentation/logging/utils/BUILD b/vendor/k8s.io/kubernetes/test/e2e/instrumentation/logging/utils/BUILD deleted file mode 100644 index e424e646223d..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/instrumentation/logging/utils/BUILD +++ /dev/null @@ -1,46 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "log_provider.go", - "logging_agent.go", - "logging_pod.go", - "misc.go", - "types.go", - "wait.go", - ], - importpath = "k8s.io/kubernetes/test/e2e/instrumentation/logging/utils", - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//test/e2e/framework:go_default_library", - "//test/e2e/framework/node:go_default_library", - "//test/e2e/framework/pod:go_default_library", - "//test/utils/image:go_default_library", - "//vendor/k8s.io/utils/integer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/instrumentation/monitoring/BUILD b/vendor/k8s.io/kubernetes/test/e2e/instrumentation/monitoring/BUILD deleted file mode 100644 index 8cf744f52e6d..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/instrumentation/monitoring/BUILD +++ /dev/null @@ -1,64 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "accelerator.go", - "custom_metrics_deployments.go", - "custom_metrics_stackdriver.go", - "metrics_grabber.go", - "stackdriver.go", - "stackdriver_metadata_agent.go", - ], - importpath = "k8s.io/kubernetes/test/e2e/instrumentation/monitoring", - deps = [ - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/rbac/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/selection:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/discovery:go_default_library", - "//staging/src/k8s.io/client-go/discovery/cached/memory:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/restmapper:go_default_library", - "//staging/src/k8s.io/metrics/pkg/client/custom_metrics:go_default_library", - "//staging/src/k8s.io/metrics/pkg/client/external_metrics:go_default_library", - "//test/e2e/framework:go_default_library", - "//test/e2e/framework/autoscaling:go_default_library", - "//test/e2e/framework/gpu:go_default_library", - "//test/e2e/framework/metrics:go_default_library", - "//test/e2e/framework/node:go_default_library", - "//test/e2e/framework/pod:go_default_library", - "//test/e2e/framework/skipper:go_default_library", - "//test/e2e/instrumentation/common:go_default_library", - "//test/e2e/scheduling:go_default_library", - "//test/utils/image:go_default_library", - "//vendor/github.com/onsi/ginkgo:go_default_library", - "//vendor/github.com/onsi/gomega:go_default_library", - "//vendor/golang.org/x/oauth2/google:go_default_library", - "//vendor/google.golang.org/api/monitoring/v3:go_default_library", - "//vendor/google.golang.org/api/option:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/instrumentation/monitoring/metrics_grabber.go b/vendor/k8s.io/kubernetes/test/e2e/instrumentation/monitoring/metrics_grabber.go index eccb085796d6..4ddede2d5d1b 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/instrumentation/monitoring/metrics_grabber.go +++ b/vendor/k8s.io/kubernetes/test/e2e/instrumentation/monitoring/metrics_grabber.go @@ -37,17 +37,25 @@ var _ = instrumentation.SIGDescribe("MetricsGrabber", func() { f := framework.NewDefaultFramework("metrics-grabber") var c, ec clientset.Interface var grabber *e2emetrics.Grabber + var masterRegistered bool ginkgo.BeforeEach(func() { var err error c = f.ClientSet ec = f.KubemarkExternalClusterClientSet + // Check if master Node is registered + nodes, err := c.CoreV1().Nodes().List(context.TODO(), metav1.ListOptions{}) framework.ExpectNoError(err) + for _, node := range nodes.Items { + if strings.HasSuffix(node.Name, "master") { + masterRegistered = true + } + } gomega.Eventually(func() error { grabber, err = e2emetrics.NewMetricsGrabber(c, ec, true, true, true, true, true) if err != nil { return fmt.Errorf("failed to create metrics grabber: %v", err) } - if !grabber.HasControlPlanePods() { + if masterRegistered && !grabber.HasControlPlanePods() { return fmt.Errorf("unable to get find control plane pods") } return nil @@ -72,16 +80,6 @@ var _ = instrumentation.SIGDescribe("MetricsGrabber", func() { ginkgo.It("should grab all metrics from a Scheduler.", func() { ginkgo.By("Proxying to Pod through the API server") - // Check if master Node is registered - nodes, err := c.CoreV1().Nodes().List(context.TODO(), metav1.ListOptions{}) - framework.ExpectNoError(err) - - var masterRegistered = false - for _, node := range nodes.Items { - if strings.HasSuffix(node.Name, "master") { - masterRegistered = true - } - } if !masterRegistered { framework.Logf("Master is node api.Registry. Skipping testing Scheduler metrics.") return @@ -93,16 +91,6 @@ var _ = instrumentation.SIGDescribe("MetricsGrabber", func() { ginkgo.It("should grab all metrics from a ControllerManager.", func() { ginkgo.By("Proxying to Pod through the API server") - // Check if master Node is registered - nodes, err := c.CoreV1().Nodes().List(context.TODO(), metav1.ListOptions{}) - framework.ExpectNoError(err) - - var masterRegistered = false - for _, node := range nodes.Items { - if strings.HasSuffix(node.Name, "master") { - masterRegistered = true - } - } if !masterRegistered { framework.Logf("Master is node api.Registry. Skipping testing ControllerManager metrics.") return diff --git a/vendor/k8s.io/kubernetes/test/e2e/kubectl/BUILD b/vendor/k8s.io/kubernetes/test/e2e/kubectl/BUILD deleted file mode 100644 index 362d887da74f..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/kubectl/BUILD +++ /dev/null @@ -1,71 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "framework.go", - "kubectl.go", - "portforward.go", - ], - importpath = "k8s.io/kubernetes/test/e2e/kubectl", - deps = [ - "//pkg/controller:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/rbac/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/serviceaccount:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/kubectl/pkg/polymorphichelpers:go_default_library", - "//test/e2e/common:go_default_library", - "//test/e2e/framework:go_default_library", - "//test/e2e/framework/auth:go_default_library", - "//test/e2e/framework/endpoints:go_default_library", - "//test/e2e/framework/kubectl:go_default_library", - "//test/e2e/framework/network:go_default_library", - "//test/e2e/framework/node:go_default_library", - "//test/e2e/framework/pod:go_default_library", - "//test/e2e/framework/service:go_default_library", - "//test/e2e/framework/skipper:go_default_library", - "//test/e2e/framework/testfiles:go_default_library", - "//test/e2e/framework/websocket:go_default_library", - "//test/e2e/scheduling:go_default_library", - "//test/utils:go_default_library", - "//test/utils/crd:go_default_library", - "//test/utils/image:go_default_library", - "//vendor/github.com/elazarl/goproxy:go_default_library", - "//vendor/github.com/googleapis/gnostic/openapiv2:go_default_library", - "//vendor/github.com/onsi/ginkgo:go_default_library", - "//vendor/github.com/onsi/gomega:go_default_library", - "//vendor/golang.org/x/net/websocket:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - "//vendor/sigs.k8s.io/yaml:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/kubectl/kubectl.go b/vendor/k8s.io/kubernetes/test/e2e/kubectl/kubectl.go index acaf5651da40..3d51d0ce5153 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/kubectl/kubectl.go +++ b/vendor/k8s.io/kubernetes/test/e2e/kubectl/kubectl.go @@ -101,7 +101,6 @@ const ( httpdDeployment1Filename = "httpd-deployment1.yaml.in" httpdDeployment2Filename = "httpd-deployment2.yaml.in" httpdDeployment3Filename = "httpd-deployment3.yaml.in" - httpdRCFilename = "httpd-rc.yaml.in" metaPattern = `"kind":"%s","apiVersion":"%s/%s","metadata":{"name":"%s"}` ) @@ -112,12 +111,7 @@ var ( agnhostImage = imageutils.GetE2EImage(imageutils.Agnhost) ) -var ( - proxyRegexp = regexp.MustCompile("Starting to serve on 127.0.0.1:([0-9]+)") - - cronJobGroupVersionResourceAlpha = schema.GroupVersionResource{Group: "batch", Version: "v2alpha1", Resource: "cronjobs"} - cronJobGroupVersionResourceBeta = schema.GroupVersionResource{Group: "batch", Version: "v1beta1", Resource: "cronjobs"} -) +var proxyRegexp = regexp.MustCompile("Starting to serve on 127.0.0.1:([0-9]+)") var schemaFoo = []byte(`description: Foo CRD for Testing type: object diff --git a/vendor/k8s.io/kubernetes/test/e2e/lifecycle/BUILD b/vendor/k8s.io/kubernetes/test/e2e/lifecycle/BUILD deleted file mode 100644 index 83bc78452884..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/lifecycle/BUILD +++ /dev/null @@ -1,29 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["framework.go"], - importpath = "k8s.io/kubernetes/test/e2e/lifecycle", - deps = ["//vendor/github.com/onsi/ginkgo:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//test/e2e/lifecycle/bootstrap:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/network/BUILD b/vendor/k8s.io/kubernetes/test/e2e/network/BUILD deleted file mode 100644 index bdd1fd8bea5a..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/network/BUILD +++ /dev/null @@ -1,116 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "conntrack.go", - "dns.go", - "dns_common.go", - "dns_configmap.go", - "dns_scale_records.go", - "doc.go", - "dual_stack.go", - "endpointslice.go", - "endpointslicemirroring.go", - "example_cluster_dns.go", - "firewall.go", - "fixture.go", - "framework.go", - "ingress.go", - "ingress_scale.go", - "ingressclass.go", - "kube_proxy.go", - "network_policy.go", - "network_tiers.go", - "networking.go", - "networking_perf.go", - "no_snat.go", - "proxy.go", - "service.go", - "service_latency.go", - "util.go", - "util_iperf.go", - ], - importpath = "k8s.io/kubernetes/test/e2e/network", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/cluster/ports:go_default_library", - "//pkg/scheduler/apis/config:go_default_library", - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/discovery/v1beta1:go_default_library", - "//staging/src/k8s.io/api/networking/v1:go_default_library", - "//staging/src/k8s.io/api/networking/v1beta1:go_default_library", - "//staging/src/k8s.io/api/rbac/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/serviceaccount:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/tools/watch:go_default_library", - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/client-go/util/retry:go_default_library", - "//staging/src/k8s.io/client-go/util/workqueue:go_default_library", - "//staging/src/k8s.io/cloud-provider:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/gce:go_default_library", - "//test/e2e/framework:go_default_library", - "//test/e2e/framework/auth:go_default_library", - "//test/e2e/framework/deployment:go_default_library", - "//test/e2e/framework/endpoints:go_default_library", - "//test/e2e/framework/endpointslice:go_default_library", - "//test/e2e/framework/ingress:go_default_library", - "//test/e2e/framework/kubesystem:go_default_library", - "//test/e2e/framework/network:go_default_library", - "//test/e2e/framework/node:go_default_library", - "//test/e2e/framework/pod:go_default_library", - "//test/e2e/framework/providers/gce:go_default_library", - "//test/e2e/framework/rc:go_default_library", - "//test/e2e/framework/resource:go_default_library", - "//test/e2e/framework/service:go_default_library", - "//test/e2e/framework/skipper:go_default_library", - "//test/e2e/framework/ssh:go_default_library", - "//test/e2e/network/scale:go_default_library", - "//test/e2e/storage/utils:go_default_library", - "//test/utils:go_default_library", - "//test/utils/image:go_default_library", - "//vendor/github.com/GoogleCloudPlatform/k8s-cloud-provider/pkg/cloud:go_default_library", - "//vendor/github.com/miekg/dns:go_default_library", - "//vendor/github.com/onsi/ginkgo:go_default_library", - "//vendor/github.com/onsi/gomega:go_default_library", - "//vendor/google.golang.org/api/compute/v1:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//test/e2e/network/scale:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/network/common/framework.go b/vendor/k8s.io/kubernetes/test/e2e/network/common/framework.go new file mode 100644 index 000000000000..f44f1347ccf8 --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/network/common/framework.go @@ -0,0 +1,24 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package common + +import "github.com/onsi/ginkgo" + +// SIGDescribe annotates the test with the SIG label. +func SIGDescribe(text string, body func()) bool { + return ginkgo.Describe("[sig-network] "+text, body) +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/network/conntrack.go b/vendor/k8s.io/kubernetes/test/e2e/network/conntrack.go index 55bd1a97c23b..8897406f0b68 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/network/conntrack.go +++ b/vendor/k8s.io/kubernetes/test/e2e/network/conntrack.go @@ -33,6 +33,8 @@ import ( e2epod "k8s.io/kubernetes/test/e2e/framework/pod" e2eservice "k8s.io/kubernetes/test/e2e/framework/service" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" + "k8s.io/kubernetes/test/e2e/network/common" + imageutils "k8s.io/kubernetes/test/utils/image" ) const ( @@ -62,7 +64,7 @@ const ( // Ref: https://api.semanticscholar.org/CorpusID:198903401 // Boye, Magnus. "Netfilter Connection Tracking and NAT Implementation." (2012). -var _ = SIGDescribe("Conntrack", func() { +var _ = common.SIGDescribe("Conntrack", func() { fr := framework.NewDefaultFramework("conntrack") @@ -77,9 +79,9 @@ var _ = SIGDescribe("Conntrack", func() { clientNodeInfo, serverNodeInfo nodeInfo ) - logContainsFn := func(text string) wait.ConditionFunc { + logContainsFn := func(text, podName string) wait.ConditionFunc { return func() (bool, error) { - logs, err := e2epod.GetPodLogs(cs, ns, podClient, podClient) + logs, err := e2epod.GetPodLogs(cs, ns, podName, podName) if err != nil { // Retry the error next time. return false, nil @@ -126,9 +128,6 @@ var _ = SIGDescribe("Conntrack", func() { }) ginkgo.It("should be able to preserve UDP traffic when server pod cycles for a NodePort service", func() { - // TODO(#91236): Remove once the test is debugged and fixed. - // dump conntrack table for debugging - defer dumpConntrack(cs) // Create a NodePort service udpJig := e2eservice.NewTestJig(cs, ns, serviceName) @@ -162,9 +161,7 @@ var _ = SIGDescribe("Conntrack", func() { serverPod1.Spec.NodeName = serverNodeInfo.name fr.PodClient().CreateSync(serverPod1) - // Waiting for service to expose endpoint. - err = validateEndpointsPorts(cs, ns, serviceName, portsByPodName{podBackend1: {80}}) - framework.ExpectNoError(err, "failed to validate endpoints for service %s in namespace: %s", serviceName, ns) + validateEndpointsPortsOrFail(cs, ns, serviceName, portsByPodName{podBackend1: {80}}) // Note that the fact that Endpoints object already exists, does NOT mean // that iptables (or whatever else is used) was already programmed. @@ -172,7 +169,7 @@ var _ = SIGDescribe("Conntrack", func() { // 30 seconds by default. // Based on the above check if the pod receives the traffic. ginkgo.By("checking client pod connected to the backend 1 on Node IP " + serverNodeInfo.nodeIP) - if err := wait.PollImmediate(5*time.Second, time.Minute, logContainsFn(podBackend1)); err != nil { + if err := wait.PollImmediate(5*time.Second, time.Minute, logContainsFn(podBackend1, podClient)); err != nil { logs, err = e2epod.GetPodLogs(cs, ns, podClient, podClient) framework.ExpectNoError(err) framework.Logf("Pod client logs: %s", logs) @@ -190,14 +187,12 @@ var _ = SIGDescribe("Conntrack", func() { framework.Logf("Cleaning up %s pod", podBackend1) fr.PodClient().DeleteSync(podBackend1, metav1.DeleteOptions{}, framework.DefaultPodDeletionTimeout) - // Waiting for service to expose endpoint. - err = validateEndpointsPorts(cs, ns, serviceName, portsByPodName{podBackend2: {80}}) - framework.ExpectNoError(err, "failed to validate endpoints for service %s in namespace: %s", serviceName, ns) + validateEndpointsPortsOrFail(cs, ns, serviceName, portsByPodName{podBackend2: {80}}) // Check that the second pod keeps receiving traffic // UDP conntrack entries timeout is 30 sec by default ginkgo.By("checking client pod connected to the backend 2 on Node IP " + serverNodeInfo.nodeIP) - if err := wait.PollImmediate(5*time.Second, time.Minute, logContainsFn(podBackend2)); err != nil { + if err := wait.PollImmediate(5*time.Second, time.Minute, logContainsFn(podBackend2, podClient)); err != nil { logs, err = e2epod.GetPodLogs(cs, ns, podClient, podClient) framework.ExpectNoError(err) framework.Logf("Pod client logs: %s", logs) @@ -206,9 +201,6 @@ var _ = SIGDescribe("Conntrack", func() { }) ginkgo.It("should be able to preserve UDP traffic when server pod cycles for a ClusterIP service", func() { - // TODO(#91236): Remove once the test is debugged and fixed. - // dump conntrack table for debugging - defer dumpConntrack(cs) // Create a ClusterIP service udpJig := e2eservice.NewTestJig(cs, ns, serviceName) @@ -242,9 +234,7 @@ var _ = SIGDescribe("Conntrack", func() { serverPod1.Spec.NodeName = serverNodeInfo.name fr.PodClient().CreateSync(serverPod1) - // Waiting for service to expose endpoint. - err = validateEndpointsPorts(cs, ns, serviceName, portsByPodName{podBackend1: {80}}) - framework.ExpectNoError(err, "failed to validate endpoints for service %s in namespace: %s", serviceName, ns) + validateEndpointsPortsOrFail(cs, ns, serviceName, portsByPodName{podBackend1: {80}}) // Note that the fact that Endpoints object already exists, does NOT mean // that iptables (or whatever else is used) was already programmed. @@ -252,7 +242,7 @@ var _ = SIGDescribe("Conntrack", func() { // 30 seconds by default. // Based on the above check if the pod receives the traffic. ginkgo.By("checking client pod connected to the backend 1 on Node IP " + serverNodeInfo.nodeIP) - if err := wait.PollImmediate(5*time.Second, time.Minute, logContainsFn(podBackend1)); err != nil { + if err := wait.PollImmediate(5*time.Second, time.Minute, logContainsFn(podBackend1, podClient)); err != nil { logs, err = e2epod.GetPodLogs(cs, ns, podClient, podClient) framework.ExpectNoError(err) framework.Logf("Pod client logs: %s", logs) @@ -270,39 +260,134 @@ var _ = SIGDescribe("Conntrack", func() { framework.Logf("Cleaning up %s pod", podBackend1) fr.PodClient().DeleteSync(podBackend1, metav1.DeleteOptions{}, framework.DefaultPodDeletionTimeout) - // Waiting for service to expose endpoint. - err = validateEndpointsPorts(cs, ns, serviceName, portsByPodName{podBackend2: {80}}) - framework.ExpectNoError(err, "failed to validate endpoints for service %s in namespace: %s", serviceName, ns) + validateEndpointsPortsOrFail(cs, ns, serviceName, portsByPodName{podBackend2: {80}}) // Check that the second pod keeps receiving traffic // UDP conntrack entries timeout is 30 sec by default ginkgo.By("checking client pod connected to the backend 2 on Node IP " + serverNodeInfo.nodeIP) - if err := wait.PollImmediate(5*time.Second, time.Minute, logContainsFn(podBackend2)); err != nil { + if err := wait.PollImmediate(5*time.Second, time.Minute, logContainsFn(podBackend2, podClient)); err != nil { logs, err = e2epod.GetPodLogs(cs, ns, podClient, podClient) framework.ExpectNoError(err) framework.Logf("Pod client logs: %s", logs) framework.Failf("Failed to connect to backend 2") } }) -}) -func dumpConntrack(cs clientset.Interface) { - // Dump conntrack table of each node for troubleshooting using the kube-proxy pods - namespace := "kube-system" - pods, err := cs.CoreV1().Pods(namespace).List(context.TODO(), metav1.ListOptions{}) - if err != nil || len(pods.Items) == 0 { - framework.Logf("failed to list kube-proxy pods in namespace: %s", namespace) - return - } - cmd := "conntrack -L" - for _, pod := range pods.Items { - if strings.Contains(pod.Name, "kube-proxy") { - stdout, err := framework.RunHostCmd(namespace, pod.Name, cmd) - if err != nil { - framework.Logf("Failed to dump conntrack table of node %s: %v", pod.Spec.NodeName, err) - continue - } - framework.Logf("conntrack table of node %s: %s", pod.Spec.NodeName, stdout) + // Regression test for #74839, where: + // Packets considered INVALID by conntrack are now dropped. In particular, this fixes + // a problem where spurious retransmits in a long-running TCP connection to a service + // IP could result in the connection being closed with the error "Connection reset by + // peer" + // xref: https://kubernetes.io/blog/2019/03/29/kube-proxy-subtleties-debugging-an-intermittent-connection-reset/ + ginkgo.It("should drop INVALID conntrack entries", func() { + serverLabel := map[string]string{ + "app": "boom-server", } - } -} + + serverPod := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "boom-server", + Labels: serverLabel, + }, + Spec: v1.PodSpec{ + NodeName: serverNodeInfo.name, + Containers: []v1.Container{ + { + Name: "boom-server", + Image: imageutils.GetE2EImage(imageutils.RegressionIssue74839), + Ports: []v1.ContainerPort{ + { + ContainerPort: 9000, // Default port exposed by boom-server + }, + }, + Env: []v1.EnvVar{ + { + Name: "POD_IP", + ValueFrom: &v1.EnvVarSource{ + FieldRef: &v1.ObjectFieldSelector{ + APIVersion: "v1", + FieldPath: "status.podIP", + }, + }, + }, + { + Name: "POD_IPS", + ValueFrom: &v1.EnvVarSource{ + FieldRef: &v1.ObjectFieldSelector{ + APIVersion: "v1", + FieldPath: "status.podIPs", + }, + }, + }, + }, + }, + }, + }, + } + fr.PodClient().CreateSync(serverPod) + ginkgo.By("Server pod created on node " + serverNodeInfo.name) + + svc := &v1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: "boom-server", + }, + Spec: v1.ServiceSpec{ + Selector: serverLabel, + Ports: []v1.ServicePort{ + { + Protocol: v1.ProtocolTCP, + Port: 9000, + }, + }, + }, + } + _, err := fr.ClientSet.CoreV1().Services(fr.Namespace.Name).Create(context.TODO(), svc, metav1.CreateOptions{}) + framework.ExpectNoError(err) + + ginkgo.By("Server service created") + + pod := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "startup-script", + }, + Spec: v1.PodSpec{ + NodeName: clientNodeInfo.name, + Containers: []v1.Container{ + { + Name: "startup-script", + Image: imageutils.GetE2EImage(imageutils.BusyBox), + Command: []string{ + "sh", "-c", "while true; do sleep 2; nc boom-server 9000& done", + }, + }, + }, + RestartPolicy: v1.RestartPolicyNever, + }, + } + + fr.PodClient().CreateSync(pod) + ginkgo.By("Client pod created") + + // The client will open connections against the server + // The server will inject invalid packets + // if conntrack does not drop the invalid packets it will go through without NAT + // so the client will receive an unexpected TCP connection and RST the connection + // the server will log ERROR if that happens + ginkgo.By("checking client pod does not RST the TCP connection because it receives and INVALID packet") + if err := wait.PollImmediate(5*time.Second, time.Minute, logContainsFn("ERROR", "boom-server")); err == nil { + logs, err := e2epod.GetPodLogs(cs, ns, "boom-server", "boom-server") + framework.ExpectNoError(err) + framework.Logf("boom-server pod logs: %s", logs) + framework.Failf("Boom server pod received a RST from the client") + } + + logs, err := e2epod.GetPodLogs(cs, ns, "boom-server", "boom-server") + framework.ExpectNoError(err) + if !strings.Contains(string(logs), "connection established") { + framework.Logf("boom-server pod logs: %s", logs) + framework.Failf("Boom server pod did not sent any bad packet to the client") + } + framework.Logf("boom-server pod logs: %s", logs) + framework.Logf("boom-server OK: did not receive any RST packet") + }) +}) diff --git a/vendor/k8s.io/kubernetes/test/e2e/network/dns.go b/vendor/k8s.io/kubernetes/test/e2e/network/dns.go index d6667cffeda4..1dc3bb75950b 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/network/dns.go +++ b/vendor/k8s.io/kubernetes/test/e2e/network/dns.go @@ -29,6 +29,7 @@ import ( e2epod "k8s.io/kubernetes/test/e2e/framework/pod" e2eservice "k8s.io/kubernetes/test/e2e/framework/service" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" + "k8s.io/kubernetes/test/e2e/network/common" "github.com/onsi/ginkgo" ) @@ -36,7 +37,7 @@ import ( const dnsTestPodHostName = "dns-querier-1" const dnsTestServiceName = "dns-test-service" -var _ = SIGDescribe("DNS", func() { +var _ = common.SIGDescribe("DNS", func() { f := framework.NewDefaultFramework("dns") /* diff --git a/vendor/k8s.io/kubernetes/test/e2e/network/dns_common.go b/vendor/k8s.io/kubernetes/test/e2e/network/dns_common.go index 04ba1d6dd085..6b2d8bc9842f 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/network/dns_common.go +++ b/vendor/k8s.io/kubernetes/test/e2e/network/dns_common.go @@ -26,8 +26,6 @@ import ( v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - dnsutil "github.com/miekg/dns" - "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/util/intstr" @@ -37,6 +35,7 @@ import ( "k8s.io/kubernetes/test/e2e/framework" e2epod "k8s.io/kubernetes/test/e2e/framework/pod" imageutils "k8s.io/kubernetes/test/utils/image" + dnsclient "k8s.io/kubernetes/third_party/forked/golang/net" "github.com/onsi/ginkgo" "github.com/onsi/gomega" @@ -430,7 +429,7 @@ func createProbeCommand(namesToResolve []string, hostEntries []string, ptrLookup fileNames = append(fileNames, podARecByTCPFileName) if len(ptrLookupIP) > 0 { - ptrLookup, err := dnsutil.ReverseAddr(ptrLookupIP) + ptrLookup, err := dnsclient.Reverseaddr(ptrLookupIP) if err != nil { framework.Failf("Unable to obtain reverse IP address record from IP %s: %v", ptrLookupIP, err) } diff --git a/vendor/k8s.io/kubernetes/test/e2e/network/dns_configmap.go b/vendor/k8s.io/kubernetes/test/e2e/network/dns_configmap.go index f41db9c4b318..6f6d3ab37d13 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/network/dns_configmap.go +++ b/vendor/k8s.io/kubernetes/test/e2e/network/dns_configmap.go @@ -25,6 +25,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/kubernetes/test/e2e/framework" e2eservice "k8s.io/kubernetes/test/e2e/framework/service" + "k8s.io/kubernetes/test/e2e/network/common" "github.com/onsi/ginkgo" ) @@ -314,7 +315,7 @@ func (t *dnsExternalNameTest) run(isIPv6 bool) { t.restoreDNSConfigMap(originalConfigMapData) } -var _ = SIGDescribe("DNS configMap nameserver", func() { +var _ = common.SIGDescribe("DNS configMap nameserver", func() { ginkgo.Context("Change stubDomain", func() { nsTest := &dnsNameserverTest{dnsTestCommon: newDNSTestCommon()} diff --git a/vendor/k8s.io/kubernetes/test/e2e/network/dns_scale_records.go b/vendor/k8s.io/kubernetes/test/e2e/network/dns_scale_records.go index b533bea1d172..d79c3dc98bb1 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/network/dns_scale_records.go +++ b/vendor/k8s.io/kubernetes/test/e2e/network/dns_scale_records.go @@ -28,6 +28,7 @@ import ( "k8s.io/client-go/util/workqueue" "k8s.io/kubernetes/test/e2e/framework" e2enode "k8s.io/kubernetes/test/e2e/framework/node" + "k8s.io/kubernetes/test/e2e/network/common" testutils "k8s.io/kubernetes/test/utils" "github.com/onsi/ginkgo" @@ -40,7 +41,7 @@ const ( checkServicePercent = 0.05 ) -var _ = SIGDescribe("[Feature:PerformanceDNS][Serial]", func() { +var _ = common.SIGDescribe("[Feature:PerformanceDNS][Serial]", func() { f := framework.NewDefaultFramework("performancedns") ginkgo.BeforeEach(func() { diff --git a/vendor/k8s.io/kubernetes/test/e2e/network/dual_stack.go b/vendor/k8s.io/kubernetes/test/e2e/network/dual_stack.go index 19f7727554eb..701f6f55a9c7 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/network/dual_stack.go +++ b/vendor/k8s.io/kubernetes/test/e2e/network/dual_stack.go @@ -36,12 +36,13 @@ import ( e2enetwork "k8s.io/kubernetes/test/e2e/framework/network" e2enode "k8s.io/kubernetes/test/e2e/framework/node" e2eservice "k8s.io/kubernetes/test/e2e/framework/service" + "k8s.io/kubernetes/test/e2e/network/common" imageutils "k8s.io/kubernetes/test/utils/image" netutils "k8s.io/utils/net" ) -// Tests for ipv6 dual stack feature -var _ = SIGDescribe("[Feature:IPv6DualStackAlphaFeature] [LinuxOnly]", func() { +// Tests for ipv4-ipv6 dual-stack feature +var _ = common.SIGDescribe("[Feature:IPv6DualStack] [LinuxOnly]", func() { f := framework.NewDefaultFramework("dualstack") var cs clientset.Interface @@ -118,9 +119,8 @@ var _ = SIGDescribe("[Feature:IPv6DualStackAlphaFeature] [LinuxOnly]", func() { }) // takes close to 140s to complete, so doesn't need to be marked [SLOW] - // this test is tagged with phase2 so we can skip this until phase 2 is completed and merged // TODO (aramase) remove phase 2 tag once phase 2 of dual stack is merged - ginkgo.It("should be able to reach pod on ipv4 and ipv6 ip [Feature:IPv6DualStackAlphaFeature:Phase2]", func() { + ginkgo.It("should be able to reach pod on ipv4 and ipv6 ip [Feature:IPv6DualStack]", func() { serverDeploymentName := "dualstack-server" clientDeploymentName := "dualstack-client" @@ -209,7 +209,7 @@ var _ = SIGDescribe("[Feature:IPv6DualStackAlphaFeature] [LinuxOnly]", func() { assertNetworkConnectivity(f, *serverPods, *clientPods, "dualstack-test-client", "80") }) - ginkgo.It("should create a single stack service with cluster ip from primary service range [Feature:IPv6DualStackAlphaFeature:Phase2]", func() { + ginkgo.It("should create a single stack service with cluster ip from primary service range [Feature:IPv6DualStack]", func() { serviceName := "defaultclusterip" ns := f.Namespace.Name jig := e2eservice.NewTestJig(cs, ns, serviceName) @@ -256,7 +256,7 @@ var _ = SIGDescribe("[Feature:IPv6DualStackAlphaFeature] [LinuxOnly]", func() { } }) - ginkgo.It("should create service with ipv4 cluster ip [Feature:IPv6DualStackAlphaFeature:Phase2]", func() { + ginkgo.It("should create service with ipv4 cluster ip [Feature:IPv6DualStack]", func() { serviceName := "ipv4clusterip" ns := f.Namespace.Name @@ -301,7 +301,7 @@ var _ = SIGDescribe("[Feature:IPv6DualStackAlphaFeature] [LinuxOnly]", func() { } }) - ginkgo.It("should create service with ipv6 cluster ip [Feature:IPv6DualStackAlphaFeature:Phase2]", func() { + ginkgo.It("should create service with ipv6 cluster ip [Feature:IPv6DualStack]", func() { serviceName := "ipv6clusterip" ns := f.Namespace.Name ipv6 := v1.IPv6Protocol @@ -346,7 +346,7 @@ var _ = SIGDescribe("[Feature:IPv6DualStackAlphaFeature] [LinuxOnly]", func() { } }) - ginkgo.It("should create service with ipv4,v6 cluster ip [Feature:IPv6DualStackAlphaFeature:Phase2]", func() { + ginkgo.It("should create service with ipv4,v6 cluster ip [Feature:IPv6DualStack]", func() { serviceName := "ipv4ipv6clusterip" ns := f.Namespace.Name @@ -391,7 +391,7 @@ var _ = SIGDescribe("[Feature:IPv6DualStackAlphaFeature] [LinuxOnly]", func() { } }) - ginkgo.It("should create service with ipv6,v4 cluster ip [Feature:IPv6DualStackAlphaFeature:Phase2]", func() { + ginkgo.It("should create service with ipv6,v4 cluster ip [Feature:IPv6DualStack]", func() { serviceName := "ipv6ipv4clusterip" ns := f.Namespace.Name @@ -445,87 +445,136 @@ var _ = SIGDescribe("[Feature:IPv6DualStackAlphaFeature] [LinuxOnly]", func() { ginkgo.It("should function for pod-Service: http", func() { config := e2enetwork.NewNetworkingTestConfig(f, e2enetwork.EnableDualStack) ginkgo.By(fmt.Sprintf("dialing(http) %v --> %v:%v (config.clusterIP)", config.TestContainerPod.Name, config.SecondaryClusterIP, e2enetwork.ClusterHTTPPort)) - config.DialFromTestContainer("http", config.SecondaryClusterIP, e2enetwork.ClusterHTTPPort, config.MaxTries, 0, config.EndpointHostnames()) - + err := config.DialFromTestContainer("http", config.SecondaryClusterIP, e2enetwork.ClusterHTTPPort, config.MaxTries, 0, config.EndpointHostnames()) + if err != nil { + framework.Failf("failed dialing endpoint, %v", err) + } ginkgo.By(fmt.Sprintf("dialing(http) %v --> %v:%v (nodeIP)", config.TestContainerPod.Name, config.SecondaryNodeIP, config.NodeHTTPPort)) - config.DialFromTestContainer("http", config.SecondaryNodeIP, config.NodeHTTPPort, config.MaxTries, 0, config.EndpointHostnames()) + err = config.DialFromTestContainer("http", config.SecondaryNodeIP, config.NodeHTTPPort, config.MaxTries, 0, config.EndpointHostnames()) + if err != nil { + framework.Failf("failed dialing endpoint, %v", err) + } }) ginkgo.It("should function for pod-Service: udp", func() { config := e2enetwork.NewNetworkingTestConfig(f, e2enetwork.EnableDualStack) ginkgo.By(fmt.Sprintf("dialing(udp) %v --> %v:%v (config.clusterIP)", config.TestContainerPod.Name, config.SecondaryClusterIP, e2enetwork.ClusterUDPPort)) - config.DialFromTestContainer("udp", config.SecondaryClusterIP, e2enetwork.ClusterUDPPort, config.MaxTries, 0, config.EndpointHostnames()) - + err := config.DialFromTestContainer("udp", config.SecondaryClusterIP, e2enetwork.ClusterUDPPort, config.MaxTries, 0, config.EndpointHostnames()) + if err != nil { + framework.Failf("failed dialing endpoint, %v", err) + } ginkgo.By(fmt.Sprintf("dialing(udp) %v --> %v:%v (nodeIP)", config.TestContainerPod.Name, config.SecondaryNodeIP, config.NodeUDPPort)) - config.DialFromTestContainer("udp", config.SecondaryNodeIP, config.NodeUDPPort, config.MaxTries, 0, config.EndpointHostnames()) + err = config.DialFromTestContainer("udp", config.SecondaryNodeIP, config.NodeUDPPort, config.MaxTries, 0, config.EndpointHostnames()) + if err != nil { + framework.Failf("failed dialing endpoint, %v", err) + } }) // [Disruptive] because it conflicts with tests that call CheckSCTPModuleLoadedOnNodes ginkgo.It("should function for pod-Service: sctp [Feature:SCTPConnectivity][Disruptive]", func() { config := e2enetwork.NewNetworkingTestConfig(f, e2enetwork.EnableDualStack, e2enetwork.EnableSCTP) ginkgo.By(fmt.Sprintf("dialing(sctp) %v --> %v:%v (config.clusterIP)", config.TestContainerPod.Name, config.SecondaryClusterIP, e2enetwork.ClusterSCTPPort)) - config.DialFromTestContainer("sctp", config.SecondaryClusterIP, e2enetwork.ClusterSCTPPort, config.MaxTries, 0, config.EndpointHostnames()) + err := config.DialFromTestContainer("sctp", config.SecondaryClusterIP, e2enetwork.ClusterSCTPPort, config.MaxTries, 0, config.EndpointHostnames()) + if err != nil { + framework.Failf("failed dialing endpoint, %v", err) + } ginkgo.By(fmt.Sprintf("dialing(sctp) %v --> %v:%v (nodeIP)", config.TestContainerPod.Name, config.SecondaryNodeIP, config.NodeSCTPPort)) - config.DialFromTestContainer("sctp", config.SecondaryNodeIP, config.NodeSCTPPort, config.MaxTries, 0, config.EndpointHostnames()) + err = config.DialFromTestContainer("sctp", config.SecondaryNodeIP, config.NodeSCTPPort, config.MaxTries, 0, config.EndpointHostnames()) + if err != nil { + framework.Failf("failed dialing endpoint, %v", err) + } }) ginkgo.It("should function for node-Service: http", func() { config := e2enetwork.NewNetworkingTestConfig(f, e2enetwork.EnableDualStack, e2enetwork.UseHostNetwork) ginkgo.By(fmt.Sprintf("dialing(http) %v (node) --> %v:%v (config.clusterIP)", config.SecondaryNodeIP, config.SecondaryClusterIP, e2enetwork.ClusterHTTPPort)) - config.DialFromNode("http", config.SecondaryClusterIP, e2enetwork.ClusterHTTPPort, config.MaxTries, 0, config.EndpointHostnames()) + err := config.DialFromNode("http", config.SecondaryClusterIP, e2enetwork.ClusterHTTPPort, config.MaxTries, 0, config.EndpointHostnames()) + if err != nil { + framework.Failf("failed dialing endpoint, %v", err) + } ginkgo.By(fmt.Sprintf("dialing(http) %v (node) --> %v:%v (nodeIP)", config.SecondaryNodeIP, config.SecondaryNodeIP, config.NodeHTTPPort)) - config.DialFromNode("http", config.SecondaryNodeIP, config.NodeHTTPPort, config.MaxTries, 0, config.EndpointHostnames()) + err = config.DialFromNode("http", config.SecondaryNodeIP, config.NodeHTTPPort, config.MaxTries, 0, config.EndpointHostnames()) + if err != nil { + framework.Failf("failed dialing endpoint, %v", err) + } }) ginkgo.It("should function for node-Service: udp", func() { config := e2enetwork.NewNetworkingTestConfig(f, e2enetwork.EnableDualStack, e2enetwork.UseHostNetwork) ginkgo.By(fmt.Sprintf("dialing(udp) %v (node) --> %v:%v (config.clusterIP)", config.SecondaryNodeIP, config.SecondaryClusterIP, e2enetwork.ClusterUDPPort)) - config.DialFromNode("udp", config.SecondaryClusterIP, e2enetwork.ClusterUDPPort, config.MaxTries, 0, config.EndpointHostnames()) + err := config.DialFromNode("udp", config.SecondaryClusterIP, e2enetwork.ClusterUDPPort, config.MaxTries, 0, config.EndpointHostnames()) + if err != nil { + framework.Failf("failed dialing endpoint, %v", err) + } ginkgo.By(fmt.Sprintf("dialing(udp) %v (node) --> %v:%v (nodeIP)", config.SecondaryNodeIP, config.SecondaryNodeIP, config.NodeUDPPort)) - config.DialFromNode("udp", config.SecondaryNodeIP, config.NodeUDPPort, config.MaxTries, 0, config.EndpointHostnames()) + err = config.DialFromNode("udp", config.SecondaryNodeIP, config.NodeUDPPort, config.MaxTries, 0, config.EndpointHostnames()) + if err != nil { + framework.Failf("failed dialing endpoint, %v", err) + } }) ginkgo.It("should function for endpoint-Service: http", func() { config := e2enetwork.NewNetworkingTestConfig(f, e2enetwork.EnableDualStack) ginkgo.By(fmt.Sprintf("dialing(http) %v (endpoint) --> %v:%v (config.clusterIP)", config.EndpointPods[0].Name, config.SecondaryClusterIP, e2enetwork.ClusterHTTPPort)) - config.DialFromEndpointContainer("http", config.SecondaryClusterIP, e2enetwork.ClusterHTTPPort, config.MaxTries, 0, config.EndpointHostnames()) - + err := config.DialFromEndpointContainer("http", config.SecondaryClusterIP, e2enetwork.ClusterHTTPPort, config.MaxTries, 0, config.EndpointHostnames()) + if err != nil { + framework.Failf("failed dialing endpoint, %v", err) + } ginkgo.By(fmt.Sprintf("dialing(http) %v (endpoint) --> %v:%v (nodeIP)", config.EndpointPods[0].Name, config.SecondaryNodeIP, config.NodeHTTPPort)) - config.DialFromEndpointContainer("http", config.SecondaryNodeIP, config.NodeHTTPPort, config.MaxTries, 0, config.EndpointHostnames()) + err = config.DialFromEndpointContainer("http", config.SecondaryNodeIP, config.NodeHTTPPort, config.MaxTries, 0, config.EndpointHostnames()) + if err != nil { + framework.Failf("failed dialing endpoint, %v", err) + } }) ginkgo.It("should function for endpoint-Service: udp", func() { config := e2enetwork.NewNetworkingTestConfig(f, e2enetwork.EnableDualStack) ginkgo.By(fmt.Sprintf("dialing(udp) %v (endpoint) --> %v:%v (config.clusterIP)", config.EndpointPods[0].Name, config.SecondaryClusterIP, e2enetwork.ClusterUDPPort)) - config.DialFromEndpointContainer("udp", config.SecondaryClusterIP, e2enetwork.ClusterUDPPort, config.MaxTries, 0, config.EndpointHostnames()) - + err := config.DialFromEndpointContainer("udp", config.SecondaryClusterIP, e2enetwork.ClusterUDPPort, config.MaxTries, 0, config.EndpointHostnames()) + if err != nil { + framework.Failf("failed dialing endpoint, %v", err) + } ginkgo.By(fmt.Sprintf("dialing(udp) %v (endpoint) --> %v:%v (nodeIP)", config.EndpointPods[0].Name, config.SecondaryNodeIP, config.NodeUDPPort)) - config.DialFromEndpointContainer("udp", config.SecondaryNodeIP, config.NodeUDPPort, config.MaxTries, 0, config.EndpointHostnames()) + err = config.DialFromEndpointContainer("udp", config.SecondaryNodeIP, config.NodeUDPPort, config.MaxTries, 0, config.EndpointHostnames()) + if err != nil { + framework.Failf("failed dialing endpoint, %v", err) + } }) ginkgo.It("should update endpoints: http", func() { config := e2enetwork.NewNetworkingTestConfig(f, e2enetwork.EnableDualStack) ginkgo.By(fmt.Sprintf("dialing(http) %v --> %v:%v (config.clusterIP)", config.TestContainerPod.Name, config.SecondaryClusterIP, e2enetwork.ClusterHTTPPort)) - config.DialFromTestContainer("http", config.SecondaryClusterIP, e2enetwork.ClusterHTTPPort, config.MaxTries, 0, config.EndpointHostnames()) - + err := config.DialFromTestContainer("http", config.SecondaryClusterIP, e2enetwork.ClusterHTTPPort, config.MaxTries, 0, config.EndpointHostnames()) + if err != nil { + framework.Failf("failed dialing endpoint, %v", err) + } config.DeleteNetProxyPod() ginkgo.By(fmt.Sprintf("dialing(http) %v --> %v:%v (config.clusterIP)", config.TestContainerPod.Name, config.SecondaryClusterIP, e2enetwork.ClusterHTTPPort)) - config.DialFromTestContainer("http", config.SecondaryClusterIP, e2enetwork.ClusterHTTPPort, config.MaxTries, config.MaxTries, config.EndpointHostnames()) + err = config.DialFromTestContainer("http", config.SecondaryClusterIP, e2enetwork.ClusterHTTPPort, config.MaxTries, config.MaxTries, config.EndpointHostnames()) + if err != nil { + framework.Failf("failed dialing endpoint, %v", err) + } }) ginkgo.It("should update endpoints: udp", func() { config := e2enetwork.NewNetworkingTestConfig(f, e2enetwork.EnableDualStack) ginkgo.By(fmt.Sprintf("dialing(udp) %v --> %v:%v (config.clusterIP)", config.TestContainerPod.Name, config.SecondaryClusterIP, e2enetwork.ClusterUDPPort)) - config.DialFromTestContainer("udp", config.SecondaryClusterIP, e2enetwork.ClusterUDPPort, config.MaxTries, 0, config.EndpointHostnames()) + err := config.DialFromTestContainer("udp", config.SecondaryClusterIP, e2enetwork.ClusterUDPPort, config.MaxTries, 0, config.EndpointHostnames()) + if err != nil { + framework.Failf("failed dialing endpoint, %v", err) + } config.DeleteNetProxyPod() ginkgo.By(fmt.Sprintf("dialing(udp) %v --> %v:%v (config.clusterIP)", config.TestContainerPod.Name, config.SecondaryClusterIP, e2enetwork.ClusterUDPPort)) - config.DialFromTestContainer("udp", config.SecondaryClusterIP, e2enetwork.ClusterUDPPort, config.MaxTries, config.MaxTries, config.EndpointHostnames()) + err = config.DialFromTestContainer("udp", config.SecondaryClusterIP, e2enetwork.ClusterUDPPort, config.MaxTries, config.MaxTries, config.EndpointHostnames()) + if err != nil { + framework.Failf("failed dialing endpoint, %v", err) + } }) // [LinuxOnly]: Windows does not support session affinity. @@ -577,6 +626,74 @@ var _ = SIGDescribe("[Feature:IPv6DualStackAlphaFeature] [LinuxOnly]", func() { message := "n" + strings.Repeat("o", 1999) config.DialEchoFromTestContainer("udp", config.SecondaryClusterIP, e2enetwork.ClusterUDPPort, config.MaxTries, 0, message) }) + + // if the endpoints pods use hostNetwork, several tests can't run in parallel + // because the pods will try to acquire the same port in the host. + // We run the test in serial, to avoid port conflicts. + ginkgo.It("should function for service endpoints using hostNetwork", func() { + config := e2enetwork.NewNetworkingTestConfig(f, e2enetwork.EnableDualStack, e2enetwork.UseHostNetwork, e2enetwork.EndpointsUseHostNetwork) + + ginkgo.By("pod-Service(hostNetwork): http") + + ginkgo.By(fmt.Sprintf("dialing(http) %v --> %v:%v (config.clusterIP)", config.TestContainerPod.Name, config.SecondaryClusterIP, e2enetwork.ClusterHTTPPort)) + err := config.DialFromTestContainer("http", config.SecondaryClusterIP, e2enetwork.ClusterHTTPPort, config.MaxTries, 0, config.EndpointHostnames()) + if err != nil { + framework.Failf("failed dialing endpoint, %v", err) + } + ginkgo.By(fmt.Sprintf("dialing(http) %v --> %v:%v (nodeIP)", config.TestContainerPod.Name, config.SecondaryNodeIP, config.NodeHTTPPort)) + err = config.DialFromTestContainer("http", config.SecondaryNodeIP, config.NodeHTTPPort, config.MaxTries, 0, config.EndpointHostnames()) + if err != nil { + framework.Failf("failed dialing endpoint, %v", err) + } + + ginkgo.By("node-Service(hostNetwork): http") + + ginkgo.By(fmt.Sprintf("dialing(http) %v (node) --> %v:%v (config.clusterIP)", config.SecondaryNodeIP, config.SecondaryClusterIP, e2enetwork.ClusterHTTPPort)) + err = config.DialFromNode("http", config.SecondaryClusterIP, e2enetwork.ClusterHTTPPort, config.MaxTries, 0, config.EndpointHostnames()) + if err != nil { + framework.Failf("failed dialing endpoint, %v", err) + } + + ginkgo.By(fmt.Sprintf("dialing(http) %v (node) --> %v:%v (nodeIP)", config.SecondaryNodeIP, config.SecondaryNodeIP, config.NodeHTTPPort)) + err = config.DialFromNode("http", config.SecondaryNodeIP, config.NodeHTTPPort, config.MaxTries, 0, config.EndpointHostnames()) + if err != nil { + framework.Failf("failed dialing endpoint, %v", err) + } + + ginkgo.By("node-Service(hostNetwork): udp") + + ginkgo.By(fmt.Sprintf("dialing(udp) %v (node) --> %v:%v (config.clusterIP)", config.SecondaryNodeIP, config.SecondaryClusterIP, e2enetwork.ClusterUDPPort)) + + err = config.DialFromNode("udp", config.SecondaryClusterIP, e2enetwork.ClusterUDPPort, config.MaxTries, 0, config.EndpointHostnames()) + if err != nil { + time.Sleep(10 * time.Hour) + framework.Failf("failed dialing endpoint, %v", err) + } + + ginkgo.By(fmt.Sprintf("dialing(udp) %v (node) --> %v:%v (nodeIP)", config.SecondaryNodeIP, config.SecondaryNodeIP, config.NodeUDPPort)) + err = config.DialFromNode("udp", config.SecondaryNodeIP, config.NodeUDPPort, config.MaxTries, 0, config.EndpointHostnames()) + if err != nil { + framework.Failf("failed dialing endpoint, %v", err) + } + + ginkgo.By("handle large requests: http(hostNetwork)") + + ginkgo.By(fmt.Sprintf("dialing(http) %v --> %v:%v (config.SecondaryClusterIP)", config.TestContainerPod.Name, config.SecondaryClusterIP, e2enetwork.ClusterHTTPPort)) + message := strings.Repeat("42", 1000) + err = config.DialEchoFromTestContainer("http", config.SecondaryClusterIP, e2enetwork.ClusterHTTPPort, config.MaxTries, 0, message) + if err != nil { + framework.Failf("failed dialing endpoint, %v", err) + } + + ginkgo.By("handle large requests: udp(hostNetwork)") + + ginkgo.By(fmt.Sprintf("dialing(udp) %v --> %v:%v (config.SecondaryClusterIP)", config.TestContainerPod.Name, config.SecondaryClusterIP, e2enetwork.ClusterUDPPort)) + message = "n" + strings.Repeat("o", 1999) + err = config.DialEchoFromTestContainer("udp", config.SecondaryClusterIP, e2enetwork.ClusterUDPPort, config.MaxTries, 0, message) + if err != nil { + framework.Failf("failed dialing endpoint, %v", err) + } + }) }) }) diff --git a/vendor/k8s.io/kubernetes/test/e2e/network/endpointslice.go b/vendor/k8s.io/kubernetes/test/e2e/network/endpointslice.go index 181e5cc72bdc..8a7373c8b1f3 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/network/endpointslice.go +++ b/vendor/k8s.io/kubernetes/test/e2e/network/endpointslice.go @@ -23,20 +23,24 @@ import ( "time" v1 "k8s.io/api/core/v1" - discoveryv1beta1 "k8s.io/api/discovery/v1beta1" + discoveryv1 "k8s.io/api/discovery/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/apimachinery/pkg/watch" clientset "k8s.io/client-go/kubernetes" + "k8s.io/client-go/util/retry" "k8s.io/kubernetes/test/e2e/framework" + "k8s.io/kubernetes/test/e2e/network/common" imageutils "k8s.io/kubernetes/test/utils/image" "github.com/onsi/ginkgo" ) -var _ = SIGDescribe("EndpointSlice", func() { +var _ = common.SIGDescribe("EndpointSlice", func() { f := framework.NewDefaultFramework("endpointslice") var cs clientset.Interface @@ -47,7 +51,15 @@ var _ = SIGDescribe("EndpointSlice", func() { podClient = f.PodClient() }) - ginkgo.It("should have Endpoints and EndpointSlices pointing to API Server", func() { + /* + Release: v1.21 + Testname: EndpointSlice API + Description: The discovery.k8s.io API group MUST exist in the /apis discovery document. + The discovery.k8s.io/v1 API group/version MUST exist in the /apis/discovery.k8s.io discovery document. + The endpointslices resource MUST exist in the /apis/discovery.k8s.io/v1 discovery document. + API Server should create self referential Endpoints and EndpointSlices named "kubernetes" in the default namespace. + */ + framework.ConformanceIt("should have Endpoints and EndpointSlices pointing to API Server", func() { namespace := "default" name := "kubernetes" endpoints, err := cs.CoreV1().Endpoints(namespace).Get(context.TODO(), name, metav1.GetOptions{}) @@ -57,7 +69,7 @@ var _ = SIGDescribe("EndpointSlice", func() { } endpointSubset := endpoints.Subsets[0] - endpointSlice, err := cs.DiscoveryV1beta1().EndpointSlices(namespace).Get(context.TODO(), name, metav1.GetOptions{}) + endpointSlice, err := cs.DiscoveryV1().EndpointSlices(namespace).Get(context.TODO(), name, metav1.GetOptions{}) framework.ExpectNoError(err, "error creating EndpointSlice resource") if len(endpointSlice.Ports) != len(endpointSubset.Ports) { framework.Failf("Expected EndpointSlice to have %d ports, got %d: %#v", len(endpointSubset.Ports), len(endpointSlice.Ports), endpointSlice.Ports) @@ -69,7 +81,15 @@ var _ = SIGDescribe("EndpointSlice", func() { }) - ginkgo.It("should create and delete Endpoints and EndpointSlices for a Service with a selector specified", func() { + /* + Release: v1.21 + Testname: EndpointSlice API + Description: The discovery.k8s.io API group MUST exist in the /apis discovery document. + The discovery.k8s.io/v1 API group/version MUST exist in the /apis/discovery.k8s.io discovery document. + The endpointslices resource MUST exist in the /apis/discovery.k8s.io/v1 discovery document. + The endpointslice controller should create and delete EndpointSlices for Pods matching a Service. + */ + framework.ConformanceIt("should create and delete Endpoints and EndpointSlices for a Service with a selector specified", func() { svc := createServiceReportErr(cs, f.Namespace.Name, &v1.Service{ ObjectMeta: metav1.ObjectMeta{ Name: "example-empty-selector", @@ -98,9 +118,9 @@ var _ = SIGDescribe("EndpointSlice", func() { } // Expect EndpointSlice resource to be created. - var endpointSlice discoveryv1beta1.EndpointSlice + var endpointSlice discoveryv1.EndpointSlice if err := wait.PollImmediate(2*time.Second, wait.ForeverTestTimeout, func() (bool, error) { - endpointSliceList, err := cs.DiscoveryV1beta1().EndpointSlices(svc.Namespace).List(context.TODO(), metav1.ListOptions{ + endpointSliceList, err := cs.DiscoveryV1().EndpointSlices(svc.Namespace).List(context.TODO(), metav1.ListOptions{ LabelSelector: "kubernetes.io/service-name=" + svc.Name, }) if err != nil { @@ -116,12 +136,12 @@ var _ = SIGDescribe("EndpointSlice", func() { } // Ensure EndpointSlice has expected values. - managedBy, ok := endpointSlice.Labels[discoveryv1beta1.LabelManagedBy] + managedBy, ok := endpointSlice.Labels[discoveryv1.LabelManagedBy] expectedManagedBy := "endpointslice-controller.k8s.io" if !ok { - framework.Failf("Expected EndpointSlice to have %s label, got %#v", discoveryv1beta1.LabelManagedBy, endpointSlice.Labels) + framework.Failf("Expected EndpointSlice to have %s label, got %#v", discoveryv1.LabelManagedBy, endpointSlice.Labels) } else if managedBy != expectedManagedBy { - framework.Failf("Expected EndpointSlice to have %s label with %s value, got %s", discoveryv1beta1.LabelManagedBy, expectedManagedBy, managedBy) + framework.Failf("Expected EndpointSlice to have %s label with %s value, got %s", discoveryv1.LabelManagedBy, expectedManagedBy, managedBy) } if len(endpointSlice.Endpoints) != 0 { framework.Failf("Expected EndpointSlice to have 0 endpoints, got %d: %#v", len(endpointSlice.Endpoints), endpointSlice.Endpoints) @@ -149,7 +169,7 @@ var _ = SIGDescribe("EndpointSlice", func() { // and may need to retry informer resync at some point during an e2e // run. if err := wait.PollImmediate(2*time.Second, 90*time.Second, func() (bool, error) { - endpointSliceList, err := cs.DiscoveryV1beta1().EndpointSlices(svc.Namespace).List(context.TODO(), metav1.ListOptions{ + endpointSliceList, err := cs.DiscoveryV1().EndpointSlices(svc.Namespace).List(context.TODO(), metav1.ListOptions{ LabelSelector: "kubernetes.io/service-name=" + svc.Name, }) if err != nil { @@ -164,7 +184,15 @@ var _ = SIGDescribe("EndpointSlice", func() { } }) - ginkgo.It("should create Endpoints and EndpointSlices for Pods matching a Service", func() { + /* + Release: v1.21 + Testname: EndpointSlice API + Description: The discovery.k8s.io API group MUST exist in the /apis discovery document. + The discovery.k8s.io/v1 API group/version MUST exist in the /apis/discovery.k8s.io discovery document. + The endpointslices resource MUST exist in the /apis/discovery.k8s.io/v1 discovery document. + The endpointslice controller must create EndpointSlices for Pods mataching a Service. + */ + framework.ConformanceIt("should create Endpoints and EndpointSlices for Pods matching a Service", func() { labelPod1 := "pod1" labelPod2 := "pod2" labelPod3 := "pod3" @@ -303,6 +331,177 @@ var _ = SIGDescribe("EndpointSlice", func() { deleteEndpointSlices(cs, f.Namespace.Name, svc2) expectEndpointsAndSlices(cs, f.Namespace.Name, svc2, []*v1.Pod{pod1, pod2}, 2, 2, true) }) + + /* + Release: v1.21 + Testname: EndpointSlice API + Description: The discovery.k8s.io API group MUST exist in the /apis discovery document. + The discovery.k8s.io/v1 API group/version MUST exist in the /apis/discovery.k8s.io discovery document. + The endpointslices resource MUST exist in the /apis/discovery.k8s.io/v1 discovery document. + The endpointslices resource must support create, get, list, watch, update, patch, delete, and deletecollection. + */ + framework.ConformanceIt("should support creating EndpointSlice API operations", func() { + // Setup + ns := f.Namespace.Name + epsVersion := "v1" + epsClient := f.ClientSet.DiscoveryV1().EndpointSlices(ns) + + epsTemplate := &discoveryv1.EndpointSlice{ + ObjectMeta: metav1.ObjectMeta{GenerateName: "e2e-example-ing", + Labels: map[string]string{ + "special-label": f.UniqueName, + }}, + AddressType: discoveryv1.AddressTypeIPv4, + Endpoints: []discoveryv1.Endpoint{ + {Addresses: []string{"1.2.3.4", "5.6.7.8"}}, + {Addresses: []string{"2.2.3.4", "6.6.7.8"}}, + }, + } + // Discovery + ginkgo.By("getting /apis") + { + discoveryGroups, err := f.ClientSet.Discovery().ServerGroups() + framework.ExpectNoError(err) + found := false + for _, group := range discoveryGroups.Groups { + if group.Name == discoveryv1.GroupName { + for _, version := range group.Versions { + if version.Version == epsVersion { + found = true + break + } + } + } + } + framework.ExpectEqual(found, true, fmt.Sprintf("expected discovery API group/version, got %#v", discoveryGroups.Groups)) + } + + ginkgo.By("getting /apis/discovery.k8s.io") + { + group := &metav1.APIGroup{} + err := f.ClientSet.Discovery().RESTClient().Get().AbsPath("/apis/discovery.k8s.io").Do(context.TODO()).Into(group) + framework.ExpectNoError(err) + found := false + for _, version := range group.Versions { + if version.Version == epsVersion { + found = true + break + } + } + framework.ExpectEqual(found, true, fmt.Sprintf("expected discovery API version, got %#v", group.Versions)) + } + + ginkgo.By("getting /apis/discovery.k8s.io" + epsVersion) + { + resources, err := f.ClientSet.Discovery().ServerResourcesForGroupVersion(discoveryv1.SchemeGroupVersion.String()) + framework.ExpectNoError(err) + foundEPS := false + for _, resource := range resources.APIResources { + switch resource.Name { + case "endpointslices": + foundEPS = true + } + } + framework.ExpectEqual(foundEPS, true, fmt.Sprintf("expected endpointslices, got %#v", resources.APIResources)) + } + + // EndpointSlice resource create/read/update/watch verbs + ginkgo.By("creating") + _, err := epsClient.Create(context.TODO(), epsTemplate, metav1.CreateOptions{}) + framework.ExpectNoError(err) + _, err = epsClient.Create(context.TODO(), epsTemplate, metav1.CreateOptions{}) + framework.ExpectNoError(err) + createdEPS, err := epsClient.Create(context.TODO(), epsTemplate, metav1.CreateOptions{}) + framework.ExpectNoError(err) + + ginkgo.By("getting") + queriedEPS, err := epsClient.Get(context.TODO(), createdEPS.Name, metav1.GetOptions{}) + framework.ExpectNoError(err) + framework.ExpectEqual(queriedEPS.UID, createdEPS.UID) + + ginkgo.By("listing") + epsList, err := epsClient.List(context.TODO(), metav1.ListOptions{LabelSelector: "special-label=" + f.UniqueName}) + framework.ExpectNoError(err) + framework.ExpectEqual(len(epsList.Items), 3, "filtered list should have 3 items") + + ginkgo.By("watching") + framework.Logf("starting watch") + epsWatch, err := epsClient.Watch(context.TODO(), metav1.ListOptions{ResourceVersion: epsList.ResourceVersion, LabelSelector: "special-label=" + f.UniqueName}) + framework.ExpectNoError(err) + + // Test cluster-wide list and watch + clusterEPSClient := f.ClientSet.DiscoveryV1().EndpointSlices("") + ginkgo.By("cluster-wide listing") + clusterEPSList, err := clusterEPSClient.List(context.TODO(), metav1.ListOptions{LabelSelector: "special-label=" + f.UniqueName}) + framework.ExpectNoError(err) + framework.ExpectEqual(len(clusterEPSList.Items), 3, "filtered list should have 3 items") + + ginkgo.By("cluster-wide watching") + framework.Logf("starting watch") + _, err = clusterEPSClient.Watch(context.TODO(), metav1.ListOptions{ResourceVersion: epsList.ResourceVersion, LabelSelector: "special-label=" + f.UniqueName}) + framework.ExpectNoError(err) + + ginkgo.By("patching") + patchedEPS, err := epsClient.Patch(context.TODO(), createdEPS.Name, types.MergePatchType, []byte(`{"metadata":{"annotations":{"patched":"true"}}}`), metav1.PatchOptions{}) + framework.ExpectNoError(err) + framework.ExpectEqual(patchedEPS.Annotations["patched"], "true", "patched object should have the applied annotation") + + ginkgo.By("updating") + var epsToUpdate, updatedEPS *discoveryv1.EndpointSlice + err = retry.RetryOnConflict(retry.DefaultRetry, func() error { + epsToUpdate, err = epsClient.Get(context.TODO(), createdEPS.Name, metav1.GetOptions{}) + if err != nil { + return err + } + epsToUpdate.Annotations["updated"] = "true" + updatedEPS, err = epsClient.Update(context.TODO(), epsToUpdate, metav1.UpdateOptions{}) + return err + }) + framework.ExpectNoError(err) + framework.ExpectEqual(updatedEPS.Annotations["updated"], "true", "updated object should have the applied annotation") + + framework.Logf("waiting for watch events with expected annotations") + for sawAnnotations := false; !sawAnnotations; { + select { + case evt, ok := <-epsWatch.ResultChan(): + framework.ExpectEqual(ok, true, "watch channel should not close") + framework.ExpectEqual(evt.Type, watch.Modified) + watchedEPS, isEPS := evt.Object.(*discoveryv1.EndpointSlice) + framework.ExpectEqual(isEPS, true, fmt.Sprintf("expected EndpointSlice, got %T", evt.Object)) + if watchedEPS.Annotations["patched"] == "true" { + framework.Logf("saw patched and updated annotations") + sawAnnotations = true + epsWatch.Stop() + } else { + framework.Logf("missing expected annotations, waiting: %#v", watchedEPS.Annotations) + } + case <-time.After(wait.ForeverTestTimeout): + framework.Fail("timed out waiting for watch event") + } + } + + ginkgo.By("deleting") + + err = epsClient.Delete(context.TODO(), createdEPS.Name, metav1.DeleteOptions{}) + framework.ExpectNoError(err) + _, err = epsClient.Get(context.TODO(), createdEPS.Name, metav1.GetOptions{}) + framework.ExpectEqual(apierrors.IsNotFound(err), true, fmt.Sprintf("expected 404, got %v", err)) + epsList, err = epsClient.List(context.TODO(), metav1.ListOptions{LabelSelector: "special-label=" + f.UniqueName}) + framework.ExpectNoError(err) + framework.ExpectEqual(len(epsList.Items), 2, "filtered list should have 2 items") + for _, eps := range epsList.Items { + if eps.Namespace == createdEPS.Namespace && eps.Name == createdEPS.Name { + framework.Fail("listing after deleting createdEPS") + } + } + + ginkgo.By("deleting a collection") + err = epsClient.DeleteCollection(context.TODO(), metav1.DeleteOptions{}, metav1.ListOptions{LabelSelector: "special-label=" + f.UniqueName}) + framework.ExpectNoError(err) + epsList, err = epsClient.List(context.TODO(), metav1.ListOptions{LabelSelector: "special-label=" + f.UniqueName}) + framework.ExpectNoError(err) + framework.ExpectEqual(len(epsList.Items), 0, "filtered list should have 0 items") + }) }) // expectEndpointsAndSlices verifies that Endpoints and EndpointSlices exist for @@ -312,7 +511,7 @@ var _ = SIGDescribe("EndpointSlice", func() { // and takes some shortcuts with the assumption that those test cases will be // the only caller of this function. func expectEndpointsAndSlices(cs clientset.Interface, ns string, svc *v1.Service, pods []*v1.Pod, numSubsets, numSlices int, namedPort bool) { - endpointSlices := []discoveryv1beta1.EndpointSlice{} + endpointSlices := []discoveryv1.EndpointSlice{} if err := wait.PollImmediate(5*time.Second, 2*time.Minute, func() (bool, error) { endpointSlicesFound, hasMatchingSlices := hasMatchingEndpointSlices(cs, ns, svc.Name, len(pods), numSlices) if !hasMatchingSlices { @@ -478,12 +677,12 @@ func expectEndpointsAndSlices(cs clientset.Interface, ns string, svc *v1.Service // deleteEndpointSlices deletes EndpointSlices for the specified Service. func deleteEndpointSlices(cs clientset.Interface, ns string, svc *v1.Service) { - listOptions := metav1.ListOptions{LabelSelector: fmt.Sprintf("%s=%s", discoveryv1beta1.LabelServiceName, svc.Name)} - esList, err := cs.DiscoveryV1beta1().EndpointSlices(ns).List(context.TODO(), listOptions) + listOptions := metav1.ListOptions{LabelSelector: fmt.Sprintf("%s=%s", discoveryv1.LabelServiceName, svc.Name)} + esList, err := cs.DiscoveryV1().EndpointSlices(ns).List(context.TODO(), listOptions) framework.ExpectNoError(err, "Error fetching EndpointSlices for %s/%s Service", ns, svc.Name) for _, endpointSlice := range esList.Items { - err := cs.DiscoveryV1beta1().EndpointSlices(ns).Delete(context.TODO(), endpointSlice.Name, metav1.DeleteOptions{}) + err := cs.DiscoveryV1().EndpointSlices(ns).Delete(context.TODO(), endpointSlice.Name, metav1.DeleteOptions{}) framework.ExpectNoError(err, "Error deleting %s/%s EndpointSlice", ns, endpointSlice.Name) } } @@ -491,14 +690,14 @@ func deleteEndpointSlices(cs clientset.Interface, ns string, svc *v1.Service) { // hasMatchingEndpointSlices returns any EndpointSlices that match the // conditions along with a boolean indicating if all the conditions have been // met. -func hasMatchingEndpointSlices(cs clientset.Interface, ns, svcName string, numEndpoints, numSlices int) ([]discoveryv1beta1.EndpointSlice, bool) { - listOptions := metav1.ListOptions{LabelSelector: fmt.Sprintf("%s=%s", discoveryv1beta1.LabelServiceName, svcName)} - esList, err := cs.DiscoveryV1beta1().EndpointSlices(ns).List(context.TODO(), listOptions) +func hasMatchingEndpointSlices(cs clientset.Interface, ns, svcName string, numEndpoints, numSlices int) ([]discoveryv1.EndpointSlice, bool) { + listOptions := metav1.ListOptions{LabelSelector: fmt.Sprintf("%s=%s", discoveryv1.LabelServiceName, svcName)} + esList, err := cs.DiscoveryV1().EndpointSlices(ns).List(context.TODO(), listOptions) framework.ExpectNoError(err, "Error fetching EndpointSlice for Service %s/%s", ns, svcName) if len(esList.Items) == 0 { framework.Logf("EndpointSlice for Service %s/%s not found", ns, svcName) - return []discoveryv1beta1.EndpointSlice{}, false + return []discoveryv1.EndpointSlice{}, false } // In some cases the EndpointSlice controller will create more // EndpointSlices than necessary resulting in some duplication. This is @@ -521,7 +720,11 @@ func hasMatchingEndpointSlices(cs clientset.Interface, ns, svcName string, numEn for _, endpointSlice := range esList.Items { actualNumEndpoints += len(endpointSlice.Endpoints) } - if actualNumEndpoints != numEndpoints { + // In some cases the EndpointSlice controller will create more + // EndpointSlices than necessary resulting in some duplication. This is + // valid and tests should only fail here if less EndpointSlices than + // expected are added. + if actualNumEndpoints < numEndpoints { framework.Logf("EndpointSlices for %s/%s Service have %d/%d endpoints", ns, svcName, actualNumEndpoints, numEndpoints) return esList.Items, false } diff --git a/vendor/k8s.io/kubernetes/test/e2e/network/endpointslicemirroring.go b/vendor/k8s.io/kubernetes/test/e2e/network/endpointslicemirroring.go index 804c20b73026..0c56f538ad2b 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/network/endpointslicemirroring.go +++ b/vendor/k8s.io/kubernetes/test/e2e/network/endpointslicemirroring.go @@ -23,14 +23,15 @@ import ( "github.com/onsi/ginkgo" v1 "k8s.io/api/core/v1" - discoveryv1beta1 "k8s.io/api/discovery/v1beta1" + discoveryv1 "k8s.io/api/discovery/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/wait" clientset "k8s.io/client-go/kubernetes" "k8s.io/kubernetes/test/e2e/framework" + "k8s.io/kubernetes/test/e2e/network/common" ) -var _ = SIGDescribe("EndpointSliceMirroring", func() { +var _ = common.SIGDescribe("EndpointSliceMirroring", func() { f := framework.NewDefaultFramework("endpointslicemirroring") var cs clientset.Interface @@ -39,7 +40,15 @@ var _ = SIGDescribe("EndpointSliceMirroring", func() { cs = f.ClientSet }) - ginkgo.It("should mirror a custom Endpoints resource through create update and delete", func() { + /* + Release: v1.21 + Testname: EndpointSlice Mirroring + Description: The discovery.k8s.io API group MUST exist in the /apis discovery document. + The discovery.k8s.io/v1 API group/version MUST exist in the /apis/discovery.k8s.io discovery document. + The endpointslices resource MUST exist in the /apis/discovery.k8s.io/v1 discovery document. + The endpointslices mirrorowing must mirror endpoint create, update, and delete actions. + */ + framework.ConformanceIt("should mirror a custom Endpoints resource through create update and delete", func() { svc := createServiceReportErr(cs, f.Namespace.Name, &v1.Service{ ObjectMeta: metav1.ObjectMeta{ Name: "example-custom-endpoints", @@ -72,8 +81,8 @@ var _ = SIGDescribe("EndpointSliceMirroring", func() { framework.ExpectNoError(err, "Unexpected error creating Endpoints") if err := wait.PollImmediate(2*time.Second, 12*time.Second, func() (bool, error) { - esList, err := cs.DiscoveryV1beta1().EndpointSlices(f.Namespace.Name).List(context.TODO(), metav1.ListOptions{ - LabelSelector: discoveryv1beta1.LabelServiceName + "=" + svc.Name, + esList, err := cs.DiscoveryV1().EndpointSlices(f.Namespace.Name).List(context.TODO(), metav1.ListOptions{ + LabelSelector: discoveryv1.LabelServiceName + "=" + svc.Name, }) if err != nil { framework.Logf("Error listing EndpointSlices: %v", err) @@ -124,8 +133,8 @@ var _ = SIGDescribe("EndpointSliceMirroring", func() { // Expect mirrored EndpointSlice resource to be updated. if err := wait.PollImmediate(2*time.Second, 12*time.Second, func() (bool, error) { - esList, err := cs.DiscoveryV1beta1().EndpointSlices(f.Namespace.Name).List(context.TODO(), metav1.ListOptions{ - LabelSelector: discoveryv1beta1.LabelServiceName + "=" + svc.Name, + esList, err := cs.DiscoveryV1().EndpointSlices(f.Namespace.Name).List(context.TODO(), metav1.ListOptions{ + LabelSelector: discoveryv1.LabelServiceName + "=" + svc.Name, }) if err != nil { return false, err @@ -171,8 +180,8 @@ var _ = SIGDescribe("EndpointSliceMirroring", func() { // Expect mirrored EndpointSlice resource to be updated. if err := wait.PollImmediate(2*time.Second, 12*time.Second, func() (bool, error) { - esList, err := cs.DiscoveryV1beta1().EndpointSlices(f.Namespace.Name).List(context.TODO(), metav1.ListOptions{ - LabelSelector: discoveryv1beta1.LabelServiceName + "=" + svc.Name, + esList, err := cs.DiscoveryV1().EndpointSlices(f.Namespace.Name).List(context.TODO(), metav1.ListOptions{ + LabelSelector: discoveryv1.LabelServiceName + "=" + svc.Name, }) if err != nil { return false, err diff --git a/vendor/k8s.io/kubernetes/test/e2e/network/example_cluster_dns.go b/vendor/k8s.io/kubernetes/test/e2e/network/example_cluster_dns.go index 38859856e99b..97eeb8eb10cb 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/network/example_cluster_dns.go +++ b/vendor/k8s.io/kubernetes/test/e2e/network/example_cluster_dns.go @@ -38,6 +38,7 @@ import ( e2epod "k8s.io/kubernetes/test/e2e/framework/pod" e2eresource "k8s.io/kubernetes/test/e2e/framework/resource" e2eservice "k8s.io/kubernetes/test/e2e/framework/service" + "k8s.io/kubernetes/test/e2e/network/common" ) const ( @@ -55,7 +56,7 @@ try: except: print('err')` -var _ = SIGDescribe("ClusterDns [Feature:Example]", func() { +var _ = common.SIGDescribe("ClusterDns [Feature:Example]", func() { f := framework.NewDefaultFramework("cluster-dns") var c clientset.Interface diff --git a/vendor/k8s.io/kubernetes/test/e2e/network/firewall.go b/vendor/k8s.io/kubernetes/test/e2e/network/firewall.go index 3267a6901ea8..eb81390aee71 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/network/firewall.go +++ b/vendor/k8s.io/kubernetes/test/e2e/network/firewall.go @@ -37,6 +37,7 @@ import ( "k8s.io/kubernetes/test/e2e/framework/providers/gce" e2eservice "k8s.io/kubernetes/test/e2e/framework/service" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" + "k8s.io/kubernetes/test/e2e/network/common" gcecloud "k8s.io/legacy-cloud-providers/gce" "github.com/onsi/ginkgo" @@ -49,7 +50,7 @@ const ( firewallTestUDPPort = int32(29998) ) -var _ = SIGDescribe("Firewall rule", func() { +var _ = common.SIGDescribe("Firewall rule", func() { var firewallTestName = "firewall-test" f := framework.NewDefaultFramework(firewallTestName) @@ -182,6 +183,8 @@ var _ = SIGDescribe("Firewall rule", func() { zone := cloudConfig.Zone if zoneInLabel, ok := nodeList.Items[0].Labels[v1.LabelFailureDomainBetaZone]; ok { zone = zoneInLabel + } else if zoneInLabel, ok := nodeList.Items[0].Labels[v1.LabelTopologyZone]; ok { + zone = zoneInLabel } removedTags := gce.SetInstanceTags(cloudConfig, nodesNames[0], zone, []string{}) defer func() { @@ -199,9 +202,6 @@ var _ = SIGDescribe("Firewall rule", func() { }) ginkgo.It("should have correct firewall rules for e2e cluster", func() { - nodes, err := e2enode.GetReadySchedulableNodes(cs) - framework.ExpectNoError(err) - ginkgo.By("Checking if e2e firewall rules are correct") for _, expFw := range gce.GetE2eFirewalls(cloudConfig.MasterName, cloudConfig.MasterTag, cloudConfig.NodeTag, cloudConfig.Network, cloudConfig.ClusterIPRange) { fw, err := gceCloud.GetFirewall(expFw.Name) @@ -209,6 +209,11 @@ var _ = SIGDescribe("Firewall rule", func() { err = gce.VerifyFirewallRule(fw, expFw, cloudConfig.Network, false) framework.ExpectNoError(err) } + }) + + ginkgo.It("control plane should not expose well-known ports", func() { + nodes, err := e2enode.GetReadySchedulableNodes(cs) + framework.ExpectNoError(err) ginkgo.By("Checking well known ports on master and nodes are not exposed externally") nodeAddr := e2enode.FirstAddress(nodes, v1.NodeExternalIP) diff --git a/vendor/k8s.io/kubernetes/test/e2e/network/framework.go b/vendor/k8s.io/kubernetes/test/e2e/network/framework.go deleted file mode 100644 index 4080c32308bc..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/network/framework.go +++ /dev/null @@ -1,24 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package network - -import "github.com/onsi/ginkgo" - -// SIGDescribe annotates the test with the SIG label. -func SIGDescribe(text string, body func()) bool { - return ginkgo.Describe("[sig-network] "+text, body) -} diff --git a/vendor/k8s.io/kubernetes/test/e2e/network/hostport.go b/vendor/k8s.io/kubernetes/test/e2e/network/hostport.go new file mode 100644 index 000000000000..c1f0c31a39e6 --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/network/hostport.go @@ -0,0 +1,199 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package network + +import ( + "context" + "fmt" + "math/rand" + "net" + "strconv" + + "github.com/onsi/ginkgo" + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/intstr" + clientset "k8s.io/client-go/kubernetes" + "k8s.io/kubernetes/test/e2e/framework" + e2enode "k8s.io/kubernetes/test/e2e/framework/node" + e2epod "k8s.io/kubernetes/test/e2e/framework/pod" + "k8s.io/kubernetes/test/e2e/network/common" + imageutils "k8s.io/kubernetes/test/utils/image" +) + +var _ = common.SIGDescribe("HostPort", func() { + + f := framework.NewDefaultFramework("hostport") + + var ( + cs clientset.Interface + ns string + ) + + ginkgo.BeforeEach(func() { + cs = f.ClientSet + ns = f.Namespace.Name + + }) + + /* + Release: v1.16, v1.21 + Testname: Scheduling, HostPort matching and HostIP and Protocol not-matching + Description: Pods with the same HostPort value MUST be able to be scheduled to the same node + if the HostIP or Protocol is different. This test is marked LinuxOnly since hostNetwork is not supported on + Windows. + */ + + framework.ConformanceIt("validates that there is no conflict between pods with same hostPort but different hostIP and protocol [LinuxOnly]", func() { + + localhost := "127.0.0.1" + family := v1.IPv4Protocol + if framework.TestContext.ClusterIsIPv6() { + localhost = "::1" + family = v1.IPv6Protocol + } + // Get a node where to schedule the pods + nodes, err := e2enode.GetBoundedReadySchedulableNodes(cs, 1) + framework.ExpectNoError(err) + if len(nodes.Items) == 0 { + framework.Failf("No nodes available") + + } + randomNode := &nodes.Items[rand.Intn(len(nodes.Items))] + + ips := e2enode.GetAddressesByTypeAndFamily(randomNode, v1.NodeInternalIP, family) + if len(ips) == 0 { + framework.Failf("Failed to get NodeIP") + } + hostIP := ips[0] + port := int32(54323) + + // Create pods with the same HostPort + ginkgo.By(fmt.Sprintf("Trying to create a pod(pod1) with hostport %v and hostIP %s and expect scheduled", port, localhost)) + createHostPortPodOnNode(f, "pod1", ns, localhost, port, v1.ProtocolTCP, randomNode.Name) + + ginkgo.By(fmt.Sprintf("Trying to create another pod(pod2) with hostport %v but hostIP %s on the node which pod1 resides and expect scheduled", port, hostIP)) + createHostPortPodOnNode(f, "pod2", ns, hostIP, port, v1.ProtocolTCP, randomNode.Name) + + ginkgo.By(fmt.Sprintf("Trying to create a third pod(pod3) with hostport %v, hostIP %s but use UDP protocol on the node which pod2 resides", port, hostIP)) + createHostPortPodOnNode(f, "pod3", ns, hostIP, port, v1.ProtocolUDP, randomNode.Name) + + // check that the port is being actually exposed to each container + // create a pod on the host network in the same node + hostExecPod := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "e2e-host-exec", + Namespace: f.Namespace.Name, + }, + Spec: v1.PodSpec{ + HostNetwork: true, + NodeName: randomNode.Name, + Containers: []v1.Container{ + { + Name: "e2e-host-exec", + Image: imageutils.GetE2EImage(imageutils.Agnhost), + }, + }, + }, + } + f.PodClient().CreateSync(hostExecPod) + + // use a 5 seconds timeout per connection + timeout := 5 + // IPv6 doesn't NAT from localhost -> localhost, it doesn't have the route_localnet kernel hack, so we need to specify the source IP + cmdPod1 := []string{"/bin/sh", "-c", fmt.Sprintf("curl -g --connect-timeout %v --interface %s http://%s/hostname", timeout, hostIP, net.JoinHostPort(localhost, strconv.Itoa(int(port))))} + cmdPod2 := []string{"/bin/sh", "-c", fmt.Sprintf("curl -g --connect-timeout %v http://%s/hostname", timeout, net.JoinHostPort(hostIP, strconv.Itoa(int(port))))} + cmdPod3 := []string{"/bin/sh", "-c", fmt.Sprintf("nc -vuz -w %v %s %d", timeout, hostIP, port)} + // try 5 times to connect to the exposed ports + for i := 0; i < 5; i++ { + // check pod1 + ginkgo.By(fmt.Sprintf("checking connectivity from pod %s to serverIP: %s, port: %d", hostExecPod.Name, localhost, port)) + hostname1, _, err := f.ExecCommandInContainerWithFullOutput(hostExecPod.Name, "e2e-host-exec", cmdPod1...) + if err != nil { + framework.Logf("Can not connect from %s to pod(pod1) to serverIP: %s, port: %d", hostExecPod.Name, localhost, port) + continue + } + // check pod2 + ginkgo.By(fmt.Sprintf("checking connectivity from pod %s to serverIP: %s, port: %d", hostExecPod.Name, hostIP, port)) + hostname2, _, err := f.ExecCommandInContainerWithFullOutput(hostExecPod.Name, "e2e-host-exec", cmdPod2...) + if err != nil { + framework.Logf("Can not connect from %s to pod(pod2) to serverIP: %s, port: %d", hostExecPod.Name, hostIP, port) + continue + } + // the hostname returned has to be different because we are exposing the same port to two different pods + if hostname1 == hostname2 { + framework.Logf("pods must have different hostname: pod1 has hostname %s, pod2 has hostname %s", hostname1, hostname2) + continue + } + // check pod3 + ginkgo.By(fmt.Sprintf("checking connectivity from pod %s to serverIP: %s, port: %d UDP", hostExecPod.Name, hostIP, port)) + _, _, err = f.ExecCommandInContainerWithFullOutput(hostExecPod.Name, "e2e-host-exec", cmdPod3...) + if err != nil { + framework.Logf("Can not connect from %s to pod(pod2) to serverIP: %s, port: %d", hostExecPod.Name, hostIP, port) + continue + } + return + } + framework.Failf("Failed to connect to exposed host ports") + }) +}) + +// create pod which using hostport on the specified node according to the nodeSelector +// it starts an http server on the exposed port +func createHostPortPodOnNode(f *framework.Framework, podName, ns, hostIP string, port int32, protocol v1.Protocol, nodeName string) { + hostPortPod := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: podName, + }, + Spec: v1.PodSpec{ + Containers: []v1.Container{ + { + Name: "agnhost", + Image: imageutils.GetE2EImage(imageutils.Agnhost), + Args: []string{"netexec", "--http-port=8080", "--udp-port=8080"}, + Ports: []v1.ContainerPort{ + { + HostPort: port, + ContainerPort: 8080, + Protocol: protocol, + HostIP: hostIP, + }, + }, + ReadinessProbe: &v1.Probe{ + Handler: v1.Handler{ + HTTPGet: &v1.HTTPGetAction{ + Path: "/hostname", + Port: intstr.IntOrString{ + IntVal: int32(8080), + }, + Scheme: v1.URISchemeHTTP, + }, + }, + }, + }, + }, + NodeName: nodeName, + }, + } + if _, err := f.ClientSet.CoreV1().Pods(ns).Create(context.TODO(), hostPortPod, metav1.CreateOptions{}); err != nil { + framework.Failf("error creating pod %s, err:%v", podName, err) + } + + if err := e2epod.WaitTimeoutForPodReadyInNamespace(f.ClientSet, podName, ns, framework.PodStartTimeout); err != nil { + framework.Failf("wait for pod %s timeout, err:%v", podName, err) + } +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/network/ingress.go b/vendor/k8s.io/kubernetes/test/e2e/network/ingress.go index aa36c1baae81..fedb63be3af2 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/network/ingress.go +++ b/vendor/k8s.io/kubernetes/test/e2e/network/ingress.go @@ -40,12 +40,14 @@ import ( "k8s.io/apimachinery/pkg/util/wait" "k8s.io/apimachinery/pkg/watch" "k8s.io/apiserver/pkg/authentication/serviceaccount" + "k8s.io/client-go/util/retry" "k8s.io/kubernetes/test/e2e/framework" e2eauth "k8s.io/kubernetes/test/e2e/framework/auth" e2eingress "k8s.io/kubernetes/test/e2e/framework/ingress" "k8s.io/kubernetes/test/e2e/framework/providers/gce" e2eservice "k8s.io/kubernetes/test/e2e/framework/service" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" + "k8s.io/kubernetes/test/e2e/network/common" "github.com/onsi/ginkgo" ) @@ -55,7 +57,7 @@ const ( instanceGroupAnnotation = "ingress.gcp.kubernetes.io/instance-groups" ) -var _ = SIGDescribe("Loadbalancing: L7", func() { +var _ = common.SIGDescribe("Loadbalancing: L7", func() { defer ginkgo.GinkgoRecover() var ( ns string @@ -203,7 +205,7 @@ var _ = SIGDescribe("Loadbalancing: L7", func() { // zone based on pod labels. }) - ginkgo.Describe("GCE [Slow] [Feature:NEG]", func() { + ginkgo.Describe("GCE [Slow] [Feature:NEG] [Flaky]", func() { var gceController *gce.IngressController // Platform specific setup @@ -901,7 +903,7 @@ func detectNegAnnotation(f *framework.Framework, jig *e2eingress.TestJig, gceCon } } -var _ = SIGDescribe("Ingress API", func() { +var _ = common.SIGDescribe("Ingress API", func() { f := framework.NewDefaultFramework("ingress") /* Release: v1.19 @@ -1053,9 +1055,16 @@ var _ = SIGDescribe("Ingress API", func() { framework.ExpectEqual(patchedIngress.Annotations["patched"], "true", "patched object should have the applied annotation") ginkgo.By("updating") - ingToUpdate := patchedIngress.DeepCopy() - ingToUpdate.Annotations["updated"] = "true" - updatedIngress, err := ingClient.Update(context.TODO(), ingToUpdate, metav1.UpdateOptions{}) + var ingToUpdate, updatedIngress *networkingv1.Ingress + err = retry.RetryOnConflict(retry.DefaultRetry, func() error { + ingToUpdate, err = ingClient.Get(context.TODO(), createdIngress.Name, metav1.GetOptions{}) + if err != nil { + return err + } + ingToUpdate.Annotations["updated"] = "true" + updatedIngress, err = ingClient.Update(context.TODO(), ingToUpdate, metav1.UpdateOptions{}) + return err + }) framework.ExpectNoError(err) framework.ExpectEqual(updatedIngress.Annotations["updated"], "true", "updated object should have the applied annotation") @@ -1094,11 +1103,18 @@ var _ = SIGDescribe("Ingress API", func() { framework.ExpectEqual(patchedStatus.Annotations["patchedstatus"], "true", "patched object should have the applied annotation") ginkgo.By("updating /status") - statusToUpdate := patchedStatus.DeepCopy() - statusToUpdate.Status.LoadBalancer = v1.LoadBalancerStatus{ - Ingress: []v1.LoadBalancerIngress{{IP: "169.1.1.2"}}, - } - updatedStatus, err := ingClient.UpdateStatus(context.TODO(), statusToUpdate, metav1.UpdateOptions{}) + var statusToUpdate, updatedStatus *networkingv1.Ingress + err = retry.RetryOnConflict(retry.DefaultRetry, func() error { + statusToUpdate, err = ingClient.Get(context.TODO(), createdIngress.Name, metav1.GetOptions{}) + if err != nil { + return err + } + statusToUpdate.Status.LoadBalancer = v1.LoadBalancerStatus{ + Ingress: []v1.LoadBalancerIngress{{IP: "169.1.1.2"}}, + } + updatedStatus, err = ingClient.UpdateStatus(context.TODO(), statusToUpdate, metav1.UpdateOptions{}) + return err + }) framework.ExpectNoError(err) framework.ExpectEqual(updatedStatus.Status.LoadBalancer, statusToUpdate.Status.LoadBalancer, fmt.Sprintf("updated object expected to have updated loadbalancer status %#v, got %#v", statusToUpdate.Status.LoadBalancer, updatedStatus.Status.LoadBalancer)) diff --git a/vendor/k8s.io/kubernetes/test/e2e/network/ingress_scale.go b/vendor/k8s.io/kubernetes/test/e2e/network/ingress_scale.go index 6cc8585b7b2f..a21e5508b335 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/network/ingress_scale.go +++ b/vendor/k8s.io/kubernetes/test/e2e/network/ingress_scale.go @@ -19,12 +19,13 @@ package network import ( "k8s.io/kubernetes/test/e2e/framework" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" + "k8s.io/kubernetes/test/e2e/network/common" "k8s.io/kubernetes/test/e2e/network/scale" "github.com/onsi/ginkgo" ) -var _ = SIGDescribe("Loadbalancing: L7 Scalability", func() { +var _ = common.SIGDescribe("Loadbalancing: L7 Scalability", func() { defer ginkgo.GinkgoRecover() var ( ns string diff --git a/vendor/k8s.io/kubernetes/test/e2e/network/ingressclass.go b/vendor/k8s.io/kubernetes/test/e2e/network/ingressclass.go index 29316662e10a..c5ee9a529cdf 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/network/ingressclass.go +++ b/vendor/k8s.io/kubernetes/test/e2e/network/ingressclass.go @@ -32,11 +32,12 @@ import ( "k8s.io/apimachinery/pkg/watch" clientset "k8s.io/client-go/kubernetes" "k8s.io/kubernetes/test/e2e/framework" + "k8s.io/kubernetes/test/e2e/network/common" "github.com/onsi/ginkgo" ) -var _ = SIGDescribe("IngressClass [Feature:Ingress]", func() { +var _ = common.SIGDescribe("IngressClass [Feature:Ingress]", func() { f := framework.NewDefaultFramework("ingressclass") var cs clientset.Interface ginkgo.BeforeEach(func() { @@ -142,7 +143,7 @@ func deleteIngressClass(cs clientset.Interface, name string) { framework.ExpectNoError(err) } -var _ = SIGDescribe("IngressClass API", func() { +var _ = common.SIGDescribe("IngressClass API", func() { f := framework.NewDefaultFramework("ingressclass") var cs clientset.Interface ginkgo.BeforeEach(func() { diff --git a/vendor/k8s.io/kubernetes/test/e2e/network/kube_proxy.go b/vendor/k8s.io/kubernetes/test/e2e/network/kube_proxy.go index f25184db3ac7..0d2d32007c15 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/network/kube_proxy.go +++ b/vendor/k8s.io/kubernetes/test/e2e/network/kube_proxy.go @@ -17,7 +17,6 @@ limitations under the License. package network import ( - "context" "fmt" "math" "net" @@ -33,16 +32,16 @@ import ( e2enode "k8s.io/kubernetes/test/e2e/framework/node" e2epod "k8s.io/kubernetes/test/e2e/framework/pod" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" + "k8s.io/kubernetes/test/e2e/network/common" imageutils "k8s.io/kubernetes/test/utils/image" netutils "k8s.io/utils/net" "github.com/onsi/ginkgo" - "github.com/onsi/gomega" ) var kubeProxyE2eImage = imageutils.GetE2EImage(imageutils.Agnhost) -var _ = SIGDescribe("KubeProxy", func() { +var _ = common.SIGDescribe("KubeProxy", func() { const ( testDaemonHTTPPort = 11301 testDaemonTCPPort = 11302 @@ -211,10 +210,10 @@ var _ = SIGDescribe("KubeProxy", func() { // Obtain the corresponding conntrack entry on the host checking // the nf_conntrack file from the pod e2e-net-exec. // It retries in a loop if the entry is not found. - cmd := fmt.Sprintf("conntrack -L -f %s -d %v"+ + cmd := fmt.Sprintf("conntrack -L -f %s -d %v "+ "| grep -m 1 'CLOSE_WAIT.*dport=%v' ", ipFamily, ip, testDaemonTCPPort) - if err := wait.PollImmediate(1*time.Second, postFinTimeoutSeconds, func() (bool, error) { + if err := wait.PollImmediate(2*time.Second, epsilonSeconds*time.Second, func() (bool, error) { result, err := framework.RunHostCmd(fr.Namespace.Name, "e2e-net-exec", cmd) // retry if we can't obtain the conntrack entry if err != nil { @@ -236,121 +235,14 @@ var _ = SIGDescribe("KubeProxy", func() { } return false, fmt.Errorf("wrong TCP CLOSE_WAIT timeout: %v expected: %v", timeoutSeconds, expectedTimeoutSeconds) }); err != nil { - framework.Failf("no conntrack entry for port %d on node %s", testDaemonTCPPort, serverNodeInfo.nodeIP) + // Dump all conntrack entries for debugging + result, err2 := framework.RunHostCmd(fr.Namespace.Name, "e2e-net-exec", "conntrack -L") + if err2 != nil { + framework.Logf("failed to obtain conntrack entry: %v %v", result, err2) + } + framework.Logf("conntrack entries for node %v: %v", serverNodeInfo.nodeIP, result) + framework.Failf("no valid conntrack entry for port %d on node %s: %v", testDaemonTCPPort, serverNodeInfo.nodeIP, err) } }) - // Regression test for #74839, where: - // Packets considered INVALID by conntrack are now dropped. In particular, this fixes - // a problem where spurious retransmits in a long-running TCP connection to a service - // IP could result in the connection being closed with the error "Connection reset by - // peer" - ginkgo.It("should resolve connection reset issue #74839 [Slow]", func() { - serverLabel := map[string]string{ - "app": "boom-server", - } - clientLabel := map[string]string{ - "app": "client", - } - - serverPod := &v1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - Name: "boom-server", - Labels: serverLabel, - }, - Spec: v1.PodSpec{ - Containers: []v1.Container{ - { - Name: "boom-server", - Image: imageutils.GetE2EImage(imageutils.RegressionIssue74839), - Ports: []v1.ContainerPort{ - { - ContainerPort: 9000, // Default port exposed by boom-server - }, - }, - }, - }, - Affinity: &v1.Affinity{ - PodAntiAffinity: &v1.PodAntiAffinity{ - RequiredDuringSchedulingIgnoredDuringExecution: []v1.PodAffinityTerm{ - { - LabelSelector: &metav1.LabelSelector{ - MatchLabels: clientLabel, - }, - TopologyKey: "kubernetes.io/hostname", - }, - }, - }, - }, - }, - } - _, err := fr.ClientSet.CoreV1().Pods(fr.Namespace.Name).Create(context.TODO(), serverPod, metav1.CreateOptions{}) - framework.ExpectNoError(err) - - err = e2epod.WaitForPodsRunningReady(fr.ClientSet, fr.Namespace.Name, 1, 0, framework.PodReadyBeforeTimeout, map[string]string{}) - framework.ExpectNoError(err) - - ginkgo.By("Server pod created") - - svc := &v1.Service{ - ObjectMeta: metav1.ObjectMeta{ - Name: "boom-server", - }, - Spec: v1.ServiceSpec{ - Selector: serverLabel, - Ports: []v1.ServicePort{ - { - Protocol: v1.ProtocolTCP, - Port: 9000, - }, - }, - }, - } - _, err = fr.ClientSet.CoreV1().Services(fr.Namespace.Name).Create(context.TODO(), svc, metav1.CreateOptions{}) - framework.ExpectNoError(err) - - ginkgo.By("Server service created") - - pod := &v1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - Name: "startup-script", - Labels: clientLabel, - }, - Spec: v1.PodSpec{ - Containers: []v1.Container{ - { - Name: "startup-script", - Image: imageutils.GetE2EImage(imageutils.BusyBox), - Command: []string{ - "sh", "-c", "while true; do sleep 2; nc boom-server 9000& done", - }, - }, - }, - Affinity: &v1.Affinity{ - PodAntiAffinity: &v1.PodAntiAffinity{ - RequiredDuringSchedulingIgnoredDuringExecution: []v1.PodAffinityTerm{ - { - LabelSelector: &metav1.LabelSelector{ - MatchLabels: serverLabel, - }, - TopologyKey: "kubernetes.io/hostname", - }, - }, - }, - }, - RestartPolicy: v1.RestartPolicyNever, - }, - } - _, err = fr.ClientSet.CoreV1().Pods(fr.Namespace.Name).Create(context.TODO(), pod, metav1.CreateOptions{}) - framework.ExpectNoError(err) - - ginkgo.By("Client pod created") - - for i := 0; i < 20; i++ { - time.Sleep(3 * time.Second) - resultPod, err := fr.ClientSet.CoreV1().Pods(fr.Namespace.Name).Get(context.TODO(), serverPod.Name, metav1.GetOptions{}) - framework.ExpectNoError(err) - gomega.Expect(resultPod.Status.ContainerStatuses[0].LastTerminationState.Terminated).Should(gomega.BeNil()) - } - }) }) diff --git a/vendor/k8s.io/kubernetes/test/e2e/network/loadbalancer.go b/vendor/k8s.io/kubernetes/test/e2e/network/loadbalancer.go new file mode 100644 index 000000000000..49fdec5e1488 --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/network/loadbalancer.go @@ -0,0 +1,1241 @@ +/* +Copyright 2016 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package network + +import ( + "context" + "fmt" + "net" + "strconv" + "strings" + "time" + + compute "google.golang.org/api/compute/v1" + + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/intstr" + "k8s.io/apimachinery/pkg/util/wait" + clientset "k8s.io/client-go/kubernetes" + cloudprovider "k8s.io/cloud-provider" + "k8s.io/kubernetes/test/e2e/framework" + e2edeployment "k8s.io/kubernetes/test/e2e/framework/deployment" + e2ekubesystem "k8s.io/kubernetes/test/e2e/framework/kubesystem" + e2enetwork "k8s.io/kubernetes/test/e2e/framework/network" + e2enode "k8s.io/kubernetes/test/e2e/framework/node" + e2epod "k8s.io/kubernetes/test/e2e/framework/pod" + "k8s.io/kubernetes/test/e2e/framework/providers/gce" + e2erc "k8s.io/kubernetes/test/e2e/framework/rc" + e2eservice "k8s.io/kubernetes/test/e2e/framework/service" + e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" + "k8s.io/kubernetes/test/e2e/network/common" + gcecloud "k8s.io/legacy-cloud-providers/gce" + + "github.com/onsi/ginkgo" + "github.com/onsi/gomega" +) + +var _ = common.SIGDescribe("LoadBalancers", func() { + f := framework.NewDefaultFramework("loadbalancers") + + var cs clientset.Interface + serviceLBNames := []string{} + + ginkgo.BeforeEach(func() { + cs = f.ClientSet + }) + + ginkgo.AfterEach(func() { + if ginkgo.CurrentGinkgoTestDescription().Failed { + DescribeSvc(f.Namespace.Name) + } + for _, lb := range serviceLBNames { + framework.Logf("cleaning load balancer resource for %s", lb) + e2eservice.CleanupServiceResources(cs, lb, framework.TestContext.CloudConfig.Region, framework.TestContext.CloudConfig.Zone) + } + //reset serviceLBNames + serviceLBNames = []string{} + }) + + ginkgo.It("should be able to change the type and ports of a TCP service [Slow]", func() { + // requires cloud load-balancer support + e2eskipper.SkipUnlessProviderIs("gce", "gke", "aws") + + loadBalancerLagTimeout := e2eservice.LoadBalancerLagTimeoutDefault + if framework.ProviderIs("aws") { + loadBalancerLagTimeout = e2eservice.LoadBalancerLagTimeoutAWS + } + loadBalancerCreateTimeout := e2eservice.GetServiceLoadBalancerCreationTimeout(cs) + + // This test is more monolithic than we'd like because LB turnup can be + // very slow, so we lumped all the tests into one LB lifecycle. + + serviceName := "mutability-test" + ns1 := f.Namespace.Name // LB1 in ns1 on TCP + framework.Logf("namespace for TCP test: %s", ns1) + + nodeIP, err := e2enode.PickIP(cs) // for later + framework.ExpectNoError(err) + + ginkgo.By("creating a TCP service " + serviceName + " with type=ClusterIP in namespace " + ns1) + tcpJig := e2eservice.NewTestJig(cs, ns1, serviceName) + tcpService, err := tcpJig.CreateTCPService(nil) + framework.ExpectNoError(err) + + svcPort := int(tcpService.Spec.Ports[0].Port) + framework.Logf("service port TCP: %d", svcPort) + + ginkgo.By("creating a pod to be part of the TCP service " + serviceName) + _, err = tcpJig.Run(nil) + framework.ExpectNoError(err) + + // Change the services to NodePort. + + ginkgo.By("changing the TCP service to type=NodePort") + tcpService, err = tcpJig.UpdateService(func(s *v1.Service) { + s.Spec.Type = v1.ServiceTypeNodePort + }) + framework.ExpectNoError(err) + tcpNodePort := int(tcpService.Spec.Ports[0].NodePort) + framework.Logf("TCP node port: %d", tcpNodePort) + + ginkgo.By("hitting the TCP service's NodePort") + e2eservice.TestReachableHTTP(nodeIP, tcpNodePort, e2eservice.KubeProxyLagTimeout) + + // Change the services to LoadBalancer. + + // Here we test that LoadBalancers can receive static IP addresses. This isn't + // necessary, but is an additional feature this monolithic test checks. + requestedIP := "" + staticIPName := "" + if framework.ProviderIs("gce", "gke") { + ginkgo.By("creating a static load balancer IP") + staticIPName = fmt.Sprintf("e2e-external-lb-test-%s", framework.RunID) + gceCloud, err := gce.GetGCECloud() + framework.ExpectNoError(err, "failed to get GCE cloud provider") + + err = gceCloud.ReserveRegionAddress(&compute.Address{Name: staticIPName}, gceCloud.Region()) + defer func() { + if staticIPName != "" { + // Release GCE static IP - this is not kube-managed and will not be automatically released. + if err := gceCloud.DeleteRegionAddress(staticIPName, gceCloud.Region()); err != nil { + framework.Logf("failed to release static IP %s: %v", staticIPName, err) + } + } + }() + framework.ExpectNoError(err, "failed to create region address: %s", staticIPName) + reservedAddr, err := gceCloud.GetRegionAddress(staticIPName, gceCloud.Region()) + framework.ExpectNoError(err, "failed to get region address: %s", staticIPName) + + requestedIP = reservedAddr.Address + framework.Logf("Allocated static load balancer IP: %s", requestedIP) + } + + ginkgo.By("changing the TCP service to type=LoadBalancer") + tcpService, err = tcpJig.UpdateService(func(s *v1.Service) { + s.Spec.LoadBalancerIP = requestedIP // will be "" if not applicable + s.Spec.Type = v1.ServiceTypeLoadBalancer + }) + framework.ExpectNoError(err) + + serviceLBNames = append(serviceLBNames, cloudprovider.DefaultLoadBalancerName(tcpService)) + ginkgo.By("waiting for the TCP service to have a load balancer") + // Wait for the load balancer to be created asynchronously + tcpService, err = tcpJig.WaitForLoadBalancer(loadBalancerCreateTimeout) + framework.ExpectNoError(err) + if int(tcpService.Spec.Ports[0].NodePort) != tcpNodePort { + framework.Failf("TCP Spec.Ports[0].NodePort changed (%d -> %d) when not expected", tcpNodePort, tcpService.Spec.Ports[0].NodePort) + } + if requestedIP != "" && e2eservice.GetIngressPoint(&tcpService.Status.LoadBalancer.Ingress[0]) != requestedIP { + framework.Failf("unexpected TCP Status.LoadBalancer.Ingress (expected %s, got %s)", requestedIP, e2eservice.GetIngressPoint(&tcpService.Status.LoadBalancer.Ingress[0])) + } + tcpIngressIP := e2eservice.GetIngressPoint(&tcpService.Status.LoadBalancer.Ingress[0]) + framework.Logf("TCP load balancer: %s", tcpIngressIP) + + if framework.ProviderIs("gce", "gke") { + // Do this as early as possible, which overrides the `defer` above. + // This is mostly out of fear of leaking the IP in a timeout case + // (as of this writing we're not 100% sure where the leaks are + // coming from, so this is first-aid rather than surgery). + ginkgo.By("demoting the static IP to ephemeral") + if staticIPName != "" { + gceCloud, err := gce.GetGCECloud() + framework.ExpectNoError(err, "failed to get GCE cloud provider") + // Deleting it after it is attached "demotes" it to an + // ephemeral IP, which can be auto-released. + if err := gceCloud.DeleteRegionAddress(staticIPName, gceCloud.Region()); err != nil { + framework.Failf("failed to release static IP %s: %v", staticIPName, err) + } + staticIPName = "" + } + } + + ginkgo.By("hitting the TCP service's NodePort") + e2eservice.TestReachableHTTP(nodeIP, tcpNodePort, e2eservice.KubeProxyLagTimeout) + + ginkgo.By("hitting the TCP service's LoadBalancer") + e2eservice.TestReachableHTTP(tcpIngressIP, svcPort, loadBalancerLagTimeout) + + // Change the services' node ports. + + ginkgo.By("changing the TCP service's NodePort") + tcpService, err = tcpJig.ChangeServiceNodePort(tcpNodePort) + framework.ExpectNoError(err) + tcpNodePortOld := tcpNodePort + tcpNodePort = int(tcpService.Spec.Ports[0].NodePort) + if tcpNodePort == tcpNodePortOld { + framework.Failf("TCP Spec.Ports[0].NodePort (%d) did not change", tcpNodePort) + } + if e2eservice.GetIngressPoint(&tcpService.Status.LoadBalancer.Ingress[0]) != tcpIngressIP { + framework.Failf("TCP Status.LoadBalancer.Ingress changed (%s -> %s) when not expected", tcpIngressIP, e2eservice.GetIngressPoint(&tcpService.Status.LoadBalancer.Ingress[0])) + } + framework.Logf("TCP node port: %d", tcpNodePort) + + ginkgo.By("hitting the TCP service's new NodePort") + e2eservice.TestReachableHTTP(nodeIP, tcpNodePort, e2eservice.KubeProxyLagTimeout) + + ginkgo.By("checking the old TCP NodePort is closed") + testNotReachableHTTP(nodeIP, tcpNodePortOld, e2eservice.KubeProxyLagTimeout) + + ginkgo.By("hitting the TCP service's LoadBalancer") + e2eservice.TestReachableHTTP(tcpIngressIP, svcPort, loadBalancerLagTimeout) + + // Change the services' main ports. + + ginkgo.By("changing the TCP service's port") + tcpService, err = tcpJig.UpdateService(func(s *v1.Service) { + s.Spec.Ports[0].Port++ + }) + framework.ExpectNoError(err) + svcPortOld := svcPort + svcPort = int(tcpService.Spec.Ports[0].Port) + if svcPort == svcPortOld { + framework.Failf("TCP Spec.Ports[0].Port (%d) did not change", svcPort) + } + if int(tcpService.Spec.Ports[0].NodePort) != tcpNodePort { + framework.Failf("TCP Spec.Ports[0].NodePort (%d) changed", tcpService.Spec.Ports[0].NodePort) + } + if e2eservice.GetIngressPoint(&tcpService.Status.LoadBalancer.Ingress[0]) != tcpIngressIP { + framework.Failf("TCP Status.LoadBalancer.Ingress changed (%s -> %s) when not expected", tcpIngressIP, e2eservice.GetIngressPoint(&tcpService.Status.LoadBalancer.Ingress[0])) + } + + framework.Logf("service port TCP: %d", svcPort) + + ginkgo.By("hitting the TCP service's NodePort") + e2eservice.TestReachableHTTP(nodeIP, tcpNodePort, e2eservice.KubeProxyLagTimeout) + + ginkgo.By("hitting the TCP service's LoadBalancer") + e2eservice.TestReachableHTTP(tcpIngressIP, svcPort, loadBalancerCreateTimeout) + + ginkgo.By("Scaling the pods to 0") + err = tcpJig.Scale(0) + framework.ExpectNoError(err) + + ginkgo.By("looking for ICMP REJECT on the TCP service's NodePort") + testRejectedHTTP(nodeIP, tcpNodePort, e2eservice.KubeProxyLagTimeout) + + ginkgo.By("looking for ICMP REJECT on the TCP service's LoadBalancer") + testRejectedHTTP(tcpIngressIP, svcPort, loadBalancerCreateTimeout) + + ginkgo.By("Scaling the pods to 1") + err = tcpJig.Scale(1) + framework.ExpectNoError(err) + + ginkgo.By("hitting the TCP service's NodePort") + e2eservice.TestReachableHTTP(nodeIP, tcpNodePort, e2eservice.KubeProxyLagTimeout) + + ginkgo.By("hitting the TCP service's LoadBalancer") + e2eservice.TestReachableHTTP(tcpIngressIP, svcPort, loadBalancerCreateTimeout) + + // Change the services back to ClusterIP. + + ginkgo.By("changing TCP service back to type=ClusterIP") + tcpReadback, err := tcpJig.UpdateService(func(s *v1.Service) { + s.Spec.Type = v1.ServiceTypeClusterIP + }) + framework.ExpectNoError(err) + if tcpReadback.Spec.Ports[0].NodePort != 0 { + framework.Fail("TCP Spec.Ports[0].NodePort was not cleared") + } + // Wait for the load balancer to be destroyed asynchronously + _, err = tcpJig.WaitForLoadBalancerDestroy(tcpIngressIP, svcPort, loadBalancerCreateTimeout) + framework.ExpectNoError(err) + + ginkgo.By("checking the TCP NodePort is closed") + testNotReachableHTTP(nodeIP, tcpNodePort, e2eservice.KubeProxyLagTimeout) + + ginkgo.By("checking the TCP LoadBalancer is closed") + testNotReachableHTTP(tcpIngressIP, svcPort, loadBalancerLagTimeout) + }) + + ginkgo.It("should be able to change the type and ports of a UDP service [Slow]", func() { + // requires cloud load-balancer support + e2eskipper.SkipUnlessProviderIs("gce", "gke") + + loadBalancerLagTimeout := e2eservice.LoadBalancerLagTimeoutDefault + loadBalancerCreateTimeout := e2eservice.GetServiceLoadBalancerCreationTimeout(cs) + + // This test is more monolithic than we'd like because LB turnup can be + // very slow, so we lumped all the tests into one LB lifecycle. + + serviceName := "mutability-test" + ns2 := f.Namespace.Name // LB1 in ns2 on TCP + framework.Logf("namespace for TCP test: %s", ns2) + + nodeIP, err := e2enode.PickIP(cs) // for later + framework.ExpectNoError(err) + + ginkgo.By("creating a UDP service " + serviceName + " with type=ClusterIP in namespace " + ns2) + udpJig := e2eservice.NewTestJig(cs, ns2, serviceName) + udpService, err := udpJig.CreateUDPService(nil) + framework.ExpectNoError(err) + + svcPort := int(udpService.Spec.Ports[0].Port) + framework.Logf("service port UDP: %d", svcPort) + + ginkgo.By("creating a pod to be part of the UDP service " + serviceName) + _, err = udpJig.Run(nil) + framework.ExpectNoError(err) + + // Change the services to NodePort. + + ginkgo.By("changing the UDP service to type=NodePort") + udpService, err = udpJig.UpdateService(func(s *v1.Service) { + s.Spec.Type = v1.ServiceTypeNodePort + }) + framework.ExpectNoError(err) + udpNodePort := int(udpService.Spec.Ports[0].NodePort) + framework.Logf("UDP node port: %d", udpNodePort) + + ginkgo.By("hitting the UDP service's NodePort") + testReachableUDP(nodeIP, udpNodePort, e2eservice.KubeProxyLagTimeout) + + // Change the services to LoadBalancer. + + // Here we test that LoadBalancers can receive static IP addresses. This isn't + // necessary, but is an additional feature this monolithic test checks. + requestedIP := "" + staticIPName := "" + ginkgo.By("creating a static load balancer IP") + staticIPName = fmt.Sprintf("e2e-external-lb-test-%s", framework.RunID) + gceCloud, err := gce.GetGCECloud() + framework.ExpectNoError(err, "failed to get GCE cloud provider") + + err = gceCloud.ReserveRegionAddress(&compute.Address{Name: staticIPName}, gceCloud.Region()) + defer func() { + if staticIPName != "" { + // Release GCE static IP - this is not kube-managed and will not be automatically released. + if err := gceCloud.DeleteRegionAddress(staticIPName, gceCloud.Region()); err != nil { + framework.Logf("failed to release static IP %s: %v", staticIPName, err) + } + } + }() + framework.ExpectNoError(err, "failed to create region address: %s", staticIPName) + reservedAddr, err := gceCloud.GetRegionAddress(staticIPName, gceCloud.Region()) + framework.ExpectNoError(err, "failed to get region address: %s", staticIPName) + + requestedIP = reservedAddr.Address + framework.Logf("Allocated static load balancer IP: %s", requestedIP) + + ginkgo.By("changing the UDP service to type=LoadBalancer") + udpService, err = udpJig.UpdateService(func(s *v1.Service) { + s.Spec.Type = v1.ServiceTypeLoadBalancer + }) + framework.ExpectNoError(err) + + serviceLBNames = append(serviceLBNames, cloudprovider.DefaultLoadBalancerName(udpService)) + + // Do this as early as possible, which overrides the `defer` above. + // This is mostly out of fear of leaking the IP in a timeout case + // (as of this writing we're not 100% sure where the leaks are + // coming from, so this is first-aid rather than surgery). + ginkgo.By("demoting the static IP to ephemeral") + if staticIPName != "" { + gceCloud, err := gce.GetGCECloud() + framework.ExpectNoError(err, "failed to get GCE cloud provider") + // Deleting it after it is attached "demotes" it to an + // ephemeral IP, which can be auto-released. + if err := gceCloud.DeleteRegionAddress(staticIPName, gceCloud.Region()); err != nil { + framework.Failf("failed to release static IP %s: %v", staticIPName, err) + } + staticIPName = "" + } + + var udpIngressIP string + ginkgo.By("waiting for the UDP service to have a load balancer") + // 2nd one should be faster since they ran in parallel. + udpService, err = udpJig.WaitForLoadBalancer(loadBalancerCreateTimeout) + framework.ExpectNoError(err) + if int(udpService.Spec.Ports[0].NodePort) != udpNodePort { + framework.Failf("UDP Spec.Ports[0].NodePort changed (%d -> %d) when not expected", udpNodePort, udpService.Spec.Ports[0].NodePort) + } + udpIngressIP = e2eservice.GetIngressPoint(&udpService.Status.LoadBalancer.Ingress[0]) + framework.Logf("UDP load balancer: %s", udpIngressIP) + + ginkgo.By("hitting the UDP service's NodePort") + testReachableUDP(nodeIP, udpNodePort, e2eservice.KubeProxyLagTimeout) + + ginkgo.By("hitting the UDP service's LoadBalancer") + testReachableUDP(udpIngressIP, svcPort, loadBalancerLagTimeout) + + // Change the services' node ports. + + ginkgo.By("changing the UDP service's NodePort") + udpService, err = udpJig.ChangeServiceNodePort(udpNodePort) + framework.ExpectNoError(err) + udpNodePortOld := udpNodePort + udpNodePort = int(udpService.Spec.Ports[0].NodePort) + if udpNodePort == udpNodePortOld { + framework.Failf("UDP Spec.Ports[0].NodePort (%d) did not change", udpNodePort) + } + if e2eservice.GetIngressPoint(&udpService.Status.LoadBalancer.Ingress[0]) != udpIngressIP { + framework.Failf("UDP Status.LoadBalancer.Ingress changed (%s -> %s) when not expected", udpIngressIP, e2eservice.GetIngressPoint(&udpService.Status.LoadBalancer.Ingress[0])) + } + framework.Logf("UDP node port: %d", udpNodePort) + + ginkgo.By("hitting the UDP service's new NodePort") + testReachableUDP(nodeIP, udpNodePort, e2eservice.KubeProxyLagTimeout) + + ginkgo.By("checking the old UDP NodePort is closed") + testNotReachableUDP(nodeIP, udpNodePortOld, e2eservice.KubeProxyLagTimeout) + + ginkgo.By("hitting the UDP service's LoadBalancer") + testReachableUDP(udpIngressIP, svcPort, loadBalancerLagTimeout) + + // Change the services' main ports. + + ginkgo.By("changing the UDP service's port") + udpService, err = udpJig.UpdateService(func(s *v1.Service) { + s.Spec.Ports[0].Port++ + }) + framework.ExpectNoError(err) + svcPortOld := svcPort + svcPort = int(udpService.Spec.Ports[0].Port) + if svcPort == svcPortOld { + framework.Failf("UDP Spec.Ports[0].Port (%d) did not change", svcPort) + } + if int(udpService.Spec.Ports[0].NodePort) != udpNodePort { + framework.Failf("UDP Spec.Ports[0].NodePort (%d) changed", udpService.Spec.Ports[0].NodePort) + } + if e2eservice.GetIngressPoint(&udpService.Status.LoadBalancer.Ingress[0]) != udpIngressIP { + framework.Failf("UDP Status.LoadBalancer.Ingress changed (%s -> %s) when not expected", udpIngressIP, e2eservice.GetIngressPoint(&udpService.Status.LoadBalancer.Ingress[0])) + } + + framework.Logf("service port UDP: %d", svcPort) + + ginkgo.By("hitting the UDP service's NodePort") + testReachableUDP(nodeIP, udpNodePort, e2eservice.KubeProxyLagTimeout) + + ginkgo.By("hitting the UDP service's LoadBalancer") + testReachableUDP(udpIngressIP, svcPort, loadBalancerCreateTimeout) + + ginkgo.By("Scaling the pods to 0") + err = udpJig.Scale(0) + framework.ExpectNoError(err) + + ginkgo.By("looking for ICMP REJECT on the UDP service's NodePort") + testRejectedUDP(nodeIP, udpNodePort, e2eservice.KubeProxyLagTimeout) + + ginkgo.By("looking for ICMP REJECT on the UDP service's LoadBalancer") + testRejectedUDP(udpIngressIP, svcPort, loadBalancerCreateTimeout) + + ginkgo.By("Scaling the pods to 1") + err = udpJig.Scale(1) + framework.ExpectNoError(err) + + ginkgo.By("hitting the UDP service's NodePort") + testReachableUDP(nodeIP, udpNodePort, e2eservice.KubeProxyLagTimeout) + + ginkgo.By("hitting the UDP service's LoadBalancer") + testReachableUDP(udpIngressIP, svcPort, loadBalancerCreateTimeout) + + // Change the services back to ClusterIP. + + ginkgo.By("changing UDP service back to type=ClusterIP") + udpReadback, err := udpJig.UpdateService(func(s *v1.Service) { + s.Spec.Type = v1.ServiceTypeClusterIP + }) + framework.ExpectNoError(err) + if udpReadback.Spec.Ports[0].NodePort != 0 { + framework.Fail("UDP Spec.Ports[0].NodePort was not cleared") + } + // Wait for the load balancer to be destroyed asynchronously + _, err = udpJig.WaitForLoadBalancerDestroy(udpIngressIP, svcPort, loadBalancerCreateTimeout) + framework.ExpectNoError(err) + + ginkgo.By("checking the UDP NodePort is closed") + testNotReachableUDP(nodeIP, udpNodePort, e2eservice.KubeProxyLagTimeout) + + ginkgo.By("checking the UDP LoadBalancer is closed") + testNotReachableUDP(udpIngressIP, svcPort, loadBalancerLagTimeout) + }) + + ginkgo.It("should only allow access from service loadbalancer source ranges [Slow]", func() { + // this feature currently supported only on GCE/GKE/AWS + e2eskipper.SkipUnlessProviderIs("gce", "gke", "aws") + + loadBalancerCreateTimeout := e2eservice.GetServiceLoadBalancerCreationTimeout(cs) + + namespace := f.Namespace.Name + serviceName := "lb-sourcerange" + jig := e2eservice.NewTestJig(cs, namespace, serviceName) + + ginkgo.By("Prepare allow source ips") + // prepare the exec pods + // acceptPod are allowed to access the loadbalancer + acceptPod := e2epod.CreateExecPodOrFail(cs, namespace, "execpod-accept", nil) + dropPod := e2epod.CreateExecPodOrFail(cs, namespace, "execpod-drop", nil) + + ginkgo.By("creating a pod to be part of the service " + serviceName) + // This container is an nginx container listening on port 80 + // See kubernetes/contrib/ingress/echoheaders/nginx.conf for content of response + _, err := jig.Run(nil) + framework.ExpectNoError(err) + // Make sure acceptPod is running. There are certain chances that pod might be teminated due to unexpected reasons. + acceptPod, err = cs.CoreV1().Pods(namespace).Get(context.TODO(), acceptPod.Name, metav1.GetOptions{}) + framework.ExpectNoError(err, "Unable to get pod %s", acceptPod.Name) + framework.ExpectEqual(acceptPod.Status.Phase, v1.PodRunning) + framework.ExpectNotEqual(acceptPod.Status.PodIP, "") + + // Create loadbalancer service with source range from node[0] and podAccept + svc, err := jig.CreateTCPService(func(svc *v1.Service) { + svc.Spec.Type = v1.ServiceTypeLoadBalancer + svc.Spec.LoadBalancerSourceRanges = []string{acceptPod.Status.PodIP + "/32"} + }) + framework.ExpectNoError(err) + + defer func() { + ginkgo.By("Clean up loadbalancer service") + e2eservice.WaitForServiceDeletedWithFinalizer(cs, svc.Namespace, svc.Name) + }() + + svc, err = jig.WaitForLoadBalancer(loadBalancerCreateTimeout) + framework.ExpectNoError(err) + + ginkgo.By("check reachability from different sources") + svcIP := e2eservice.GetIngressPoint(&svc.Status.LoadBalancer.Ingress[0]) + // We should wait until service changes are actually propagated in the cloud-provider, + // as this may take significant amount of time, especially in large clusters. + // However, the information whether it was already programmed isn't achievable. + // So we're resolving it by using loadBalancerCreateTimeout that takes cluster size into account. + checkReachabilityFromPod(true, loadBalancerCreateTimeout, namespace, acceptPod.Name, svcIP) + checkReachabilityFromPod(false, loadBalancerCreateTimeout, namespace, dropPod.Name, svcIP) + + // Make sure dropPod is running. There are certain chances that the pod might be teminated due to unexpected reasons. + dropPod, err = cs.CoreV1().Pods(namespace).Get(context.TODO(), dropPod.Name, metav1.GetOptions{}) + framework.ExpectNoError(err, "Unable to get pod %s", dropPod.Name) + framework.ExpectEqual(acceptPod.Status.Phase, v1.PodRunning) + framework.ExpectNotEqual(acceptPod.Status.PodIP, "") + + ginkgo.By("Update service LoadBalancerSourceRange and check reachability") + _, err = jig.UpdateService(func(svc *v1.Service) { + // only allow access from dropPod + svc.Spec.LoadBalancerSourceRanges = []string{dropPod.Status.PodIP + "/32"} + }) + framework.ExpectNoError(err) + + // We should wait until service changes are actually propagates, as this may take + // significant amount of time, especially in large clusters. + // However, the information whether it was already programmed isn't achievable. + // So we're resolving it by using loadBalancerCreateTimeout that takes cluster size into account. + checkReachabilityFromPod(false, loadBalancerCreateTimeout, namespace, acceptPod.Name, svcIP) + checkReachabilityFromPod(true, loadBalancerCreateTimeout, namespace, dropPod.Name, svcIP) + + ginkgo.By("Delete LoadBalancerSourceRange field and check reachability") + _, err = jig.UpdateService(func(svc *v1.Service) { + svc.Spec.LoadBalancerSourceRanges = nil + }) + framework.ExpectNoError(err) + // We should wait until service changes are actually propagates, as this may take + // significant amount of time, especially in large clusters. + // However, the information whether it was already programmed isn't achievable. + // So we're resolving it by using loadBalancerCreateTimeout that takes cluster size into account. + checkReachabilityFromPod(true, loadBalancerCreateTimeout, namespace, acceptPod.Name, svcIP) + checkReachabilityFromPod(true, loadBalancerCreateTimeout, namespace, dropPod.Name, svcIP) + }) + + ginkgo.It("should be able to create an internal type load balancer [Slow]", func() { + e2eskipper.SkipUnlessProviderIs("azure", "gke", "gce") + + createTimeout := e2eservice.GetServiceLoadBalancerCreationTimeout(cs) + pollInterval := framework.Poll * 10 + + namespace := f.Namespace.Name + serviceName := "lb-internal" + jig := e2eservice.NewTestJig(cs, namespace, serviceName) + + ginkgo.By("creating pod to be part of service " + serviceName) + _, err := jig.Run(nil) + framework.ExpectNoError(err) + + enableILB, disableILB := enableAndDisableInternalLB() + + isInternalEndpoint := func(lbIngress *v1.LoadBalancerIngress) bool { + ingressEndpoint := e2eservice.GetIngressPoint(lbIngress) + // Needs update for providers using hostname as endpoint. + return strings.HasPrefix(ingressEndpoint, "10.") + } + + ginkgo.By("creating a service with type LoadBalancer and cloud specific Internal-LB annotation enabled") + svc, err := jig.CreateTCPService(func(svc *v1.Service) { + svc.Spec.Type = v1.ServiceTypeLoadBalancer + enableILB(svc) + }) + framework.ExpectNoError(err) + + defer func() { + ginkgo.By("Clean up loadbalancer service") + e2eservice.WaitForServiceDeletedWithFinalizer(cs, svc.Namespace, svc.Name) + }() + + svc, err = jig.WaitForLoadBalancer(createTimeout) + framework.ExpectNoError(err) + lbIngress := &svc.Status.LoadBalancer.Ingress[0] + svcPort := int(svc.Spec.Ports[0].Port) + // should have an internal IP. + framework.ExpectEqual(isInternalEndpoint(lbIngress), true) + + // ILBs are not accessible from the test orchestrator, so it's necessary to use + // a pod to test the service. + ginkgo.By("hitting the internal load balancer from pod") + framework.Logf("creating pod with host network") + hostExec := launchHostExecPod(f.ClientSet, f.Namespace.Name, "ilb-host-exec") + + framework.Logf("Waiting up to %v for service %q's internal LB to respond to requests", createTimeout, serviceName) + tcpIngressIP := e2eservice.GetIngressPoint(lbIngress) + if pollErr := wait.PollImmediate(pollInterval, createTimeout, func() (bool, error) { + cmd := fmt.Sprintf(`curl -m 5 'http://%v:%v/echo?msg=hello'`, tcpIngressIP, svcPort) + stdout, err := framework.RunHostCmd(hostExec.Namespace, hostExec.Name, cmd) + if err != nil { + framework.Logf("error curling; stdout: %v. err: %v", stdout, err) + return false, nil + } + + if !strings.Contains(stdout, "hello") { + framework.Logf("Expected output to contain 'hello', got %q; retrying...", stdout) + return false, nil + } + + framework.Logf("Successful curl; stdout: %v", stdout) + return true, nil + }); pollErr != nil { + framework.Failf("ginkgo.Failed to hit ILB IP, err: %v", pollErr) + } + + ginkgo.By("switching to external type LoadBalancer") + svc, err = jig.UpdateService(func(svc *v1.Service) { + disableILB(svc) + }) + framework.ExpectNoError(err) + framework.Logf("Waiting up to %v for service %q to have an external LoadBalancer", createTimeout, serviceName) + if pollErr := wait.PollImmediate(pollInterval, createTimeout, func() (bool, error) { + svc, err := cs.CoreV1().Services(namespace).Get(context.TODO(), serviceName, metav1.GetOptions{}) + if err != nil { + return false, err + } + lbIngress = &svc.Status.LoadBalancer.Ingress[0] + return !isInternalEndpoint(lbIngress), nil + }); pollErr != nil { + framework.Failf("Loadbalancer IP not changed to external.") + } + // should have an external IP. + gomega.Expect(isInternalEndpoint(lbIngress)).To(gomega.BeFalse()) + + ginkgo.By("hitting the external load balancer") + framework.Logf("Waiting up to %v for service %q's external LB to respond to requests", createTimeout, serviceName) + tcpIngressIP = e2eservice.GetIngressPoint(lbIngress) + e2eservice.TestReachableHTTP(tcpIngressIP, svcPort, e2eservice.LoadBalancerLagTimeoutDefault) + + // GCE cannot test a specific IP because the test may not own it. This cloud specific condition + // will be removed when GCP supports similar functionality. + if framework.ProviderIs("azure") { + ginkgo.By("switching back to interal type LoadBalancer, with static IP specified.") + internalStaticIP := "10.240.11.11" + svc, err = jig.UpdateService(func(svc *v1.Service) { + svc.Spec.LoadBalancerIP = internalStaticIP + enableILB(svc) + }) + framework.ExpectNoError(err) + framework.Logf("Waiting up to %v for service %q to have an internal LoadBalancer", createTimeout, serviceName) + if pollErr := wait.PollImmediate(pollInterval, createTimeout, func() (bool, error) { + svc, err := cs.CoreV1().Services(namespace).Get(context.TODO(), serviceName, metav1.GetOptions{}) + if err != nil { + return false, err + } + lbIngress = &svc.Status.LoadBalancer.Ingress[0] + return isInternalEndpoint(lbIngress), nil + }); pollErr != nil { + framework.Failf("Loadbalancer IP not changed to internal.") + } + // should have the given static internal IP. + framework.ExpectEqual(e2eservice.GetIngressPoint(lbIngress), internalStaticIP) + } + }) + + // This test creates a load balancer, make sure its health check interval + // equals to gceHcCheckIntervalSeconds. Then the interval is manipulated + // to be something else, see if the interval will be reconciled. + ginkgo.It("should reconcile LB health check interval [Slow][Serial]", func() { + const gceHcCheckIntervalSeconds = int64(8) + // This test is for clusters on GCE. + // (It restarts kube-controller-manager, which we don't support on GKE) + e2eskipper.SkipUnlessProviderIs("gce") + e2eskipper.SkipUnlessSSHKeyPresent() + + clusterID, err := gce.GetClusterID(cs) + if err != nil { + framework.Failf("framework.GetClusterID(cs) = _, %v; want nil", err) + } + gceCloud, err := gce.GetGCECloud() + if err != nil { + framework.Failf("framework.GetGCECloud() = _, %v; want nil", err) + } + + namespace := f.Namespace.Name + serviceName := "lb-hc-int" + jig := e2eservice.NewTestJig(cs, namespace, serviceName) + + ginkgo.By("create load balancer service") + // Create loadbalancer service with source range from node[0] and podAccept + svc, err := jig.CreateTCPService(func(svc *v1.Service) { + svc.Spec.Type = v1.ServiceTypeLoadBalancer + }) + framework.ExpectNoError(err) + + defer func() { + ginkgo.By("Clean up loadbalancer service") + e2eservice.WaitForServiceDeletedWithFinalizer(cs, svc.Namespace, svc.Name) + }() + + svc, err = jig.WaitForLoadBalancer(e2eservice.GetServiceLoadBalancerCreationTimeout(cs)) + framework.ExpectNoError(err) + + hcName := gcecloud.MakeNodesHealthCheckName(clusterID) + hc, err := gceCloud.GetHTTPHealthCheck(hcName) + if err != nil { + framework.Failf("gceCloud.GetHttpHealthCheck(%q) = _, %v; want nil", hcName, err) + } + framework.ExpectEqual(hc.CheckIntervalSec, gceHcCheckIntervalSeconds) + + ginkgo.By("modify the health check interval") + hc.CheckIntervalSec = gceHcCheckIntervalSeconds - 1 + if err = gceCloud.UpdateHTTPHealthCheck(hc); err != nil { + framework.Failf("gcecloud.UpdateHttpHealthCheck(%#v) = %v; want nil", hc, err) + } + + ginkgo.By("restart kube-controller-manager") + if err := e2ekubesystem.RestartControllerManager(); err != nil { + framework.Failf("e2ekubesystem.RestartControllerManager() = %v; want nil", err) + } + if err := e2ekubesystem.WaitForControllerManagerUp(); err != nil { + framework.Failf("e2ekubesystem.WaitForControllerManagerUp() = %v; want nil", err) + } + + ginkgo.By("health check should be reconciled") + pollInterval := framework.Poll * 10 + loadBalancerPropagationTimeout := e2eservice.GetServiceLoadBalancerPropagationTimeout(cs) + if pollErr := wait.PollImmediate(pollInterval, loadBalancerPropagationTimeout, func() (bool, error) { + hc, err := gceCloud.GetHTTPHealthCheck(hcName) + if err != nil { + framework.Logf("ginkgo.Failed to get HttpHealthCheck(%q): %v", hcName, err) + return false, err + } + framework.Logf("hc.CheckIntervalSec = %v", hc.CheckIntervalSec) + return hc.CheckIntervalSec == gceHcCheckIntervalSeconds, nil + }); pollErr != nil { + framework.Failf("Health check %q does not reconcile its check interval to %d.", hcName, gceHcCheckIntervalSeconds) + } + }) + + // TODO: Get rid of [DisabledForLargeClusters] tag when issue #56138 is fixed. + // [LinuxOnly]: Windows does not support session affinity. + ginkgo.It("should have session affinity work for LoadBalancer service with ESIPP on [Slow] [DisabledForLargeClusters] [LinuxOnly]", func() { + // L4 load balancer affinity `ClientIP` is not supported on AWS ELB. + e2eskipper.SkipIfProviderIs("aws") + + svc := getServeHostnameService("affinity-lb-esipp") + svc.Spec.Type = v1.ServiceTypeLoadBalancer + svc.Spec.ExternalTrafficPolicy = v1.ServiceExternalTrafficPolicyTypeLocal + execAffinityTestForLBService(f, cs, svc) + }) + + // TODO: Get rid of [DisabledForLargeClusters] tag when issue #56138 is fixed. + // [LinuxOnly]: Windows does not support session affinity. + ginkgo.It("should be able to switch session affinity for LoadBalancer service with ESIPP on [Slow] [DisabledForLargeClusters] [LinuxOnly]", func() { + // L4 load balancer affinity `ClientIP` is not supported on AWS ELB. + e2eskipper.SkipIfProviderIs("aws") + + svc := getServeHostnameService("affinity-lb-esipp-transition") + svc.Spec.Type = v1.ServiceTypeLoadBalancer + svc.Spec.ExternalTrafficPolicy = v1.ServiceExternalTrafficPolicyTypeLocal + execAffinityTestForLBServiceWithTransition(f, cs, svc) + }) + + // TODO: Get rid of [DisabledForLargeClusters] tag when issue #56138 is fixed. + // [LinuxOnly]: Windows does not support session affinity. + ginkgo.It("should have session affinity work for LoadBalancer service with ESIPP off [Slow] [DisabledForLargeClusters] [LinuxOnly]", func() { + // L4 load balancer affinity `ClientIP` is not supported on AWS ELB. + e2eskipper.SkipIfProviderIs("aws") + + svc := getServeHostnameService("affinity-lb") + svc.Spec.Type = v1.ServiceTypeLoadBalancer + svc.Spec.ExternalTrafficPolicy = v1.ServiceExternalTrafficPolicyTypeCluster + execAffinityTestForLBService(f, cs, svc) + }) + + // TODO: Get rid of [DisabledForLargeClusters] tag when issue #56138 is fixed. + // [LinuxOnly]: Windows does not support session affinity. + ginkgo.It("should be able to switch session affinity for LoadBalancer service with ESIPP off [Slow] [DisabledForLargeClusters] [LinuxOnly]", func() { + // L4 load balancer affinity `ClientIP` is not supported on AWS ELB. + e2eskipper.SkipIfProviderIs("aws") + + svc := getServeHostnameService("affinity-lb-transition") + svc.Spec.Type = v1.ServiceTypeLoadBalancer + svc.Spec.ExternalTrafficPolicy = v1.ServiceExternalTrafficPolicyTypeCluster + execAffinityTestForLBServiceWithTransition(f, cs, svc) + }) + + // This test verifies if service load balancer cleanup finalizer is properly + // handled during service lifecycle. + // 1. Create service with type=LoadBalancer. Finalizer should be added. + // 2. Update service to type=ClusterIP. Finalizer should be removed. + // 3. Update service to type=LoadBalancer. Finalizer should be added. + // 4. Delete service with type=LoadBalancer. Finalizer should be removed. + ginkgo.It("should handle load balancer cleanup finalizer for service [Slow]", func() { + jig := e2eservice.NewTestJig(cs, f.Namespace.Name, "lb-finalizer") + + ginkgo.By("Create load balancer service") + svc, err := jig.CreateTCPService(func(svc *v1.Service) { + svc.Spec.Type = v1.ServiceTypeLoadBalancer + }) + framework.ExpectNoError(err) + + defer func() { + ginkgo.By("Check that service can be deleted with finalizer") + e2eservice.WaitForServiceDeletedWithFinalizer(cs, svc.Namespace, svc.Name) + }() + + ginkgo.By("Wait for load balancer to serve traffic") + svc, err = jig.WaitForLoadBalancer(e2eservice.GetServiceLoadBalancerCreationTimeout(cs)) + framework.ExpectNoError(err) + + ginkgo.By("Check if finalizer presents on service with type=LoadBalancer") + e2eservice.WaitForServiceUpdatedWithFinalizer(cs, svc.Namespace, svc.Name, true) + + ginkgo.By("Check if finalizer is removed on service after changed to type=ClusterIP") + err = jig.ChangeServiceType(v1.ServiceTypeClusterIP, e2eservice.GetServiceLoadBalancerCreationTimeout(cs)) + framework.ExpectNoError(err) + e2eservice.WaitForServiceUpdatedWithFinalizer(cs, svc.Namespace, svc.Name, false) + + ginkgo.By("Check if finalizer is added back to service after changed to type=LoadBalancer") + err = jig.ChangeServiceType(v1.ServiceTypeLoadBalancer, e2eservice.GetServiceLoadBalancerCreationTimeout(cs)) + framework.ExpectNoError(err) + e2eservice.WaitForServiceUpdatedWithFinalizer(cs, svc.Namespace, svc.Name, true) + }) +}) + +var _ = common.SIGDescribe("ESIPP [Slow]", func() { + f := framework.NewDefaultFramework("esipp") + var loadBalancerCreateTimeout time.Duration + + var cs clientset.Interface + serviceLBNames := []string{} + + ginkgo.BeforeEach(func() { + // requires cloud load-balancer support - this feature currently supported only on GCE/GKE + e2eskipper.SkipUnlessProviderIs("gce", "gke") + + cs = f.ClientSet + loadBalancerCreateTimeout = e2eservice.GetServiceLoadBalancerCreationTimeout(cs) + }) + + ginkgo.AfterEach(func() { + if ginkgo.CurrentGinkgoTestDescription().Failed { + DescribeSvc(f.Namespace.Name) + } + for _, lb := range serviceLBNames { + framework.Logf("cleaning load balancer resource for %s", lb) + e2eservice.CleanupServiceResources(cs, lb, framework.TestContext.CloudConfig.Region, framework.TestContext.CloudConfig.Zone) + } + //reset serviceLBNames + serviceLBNames = []string{} + }) + + ginkgo.It("should work for type=LoadBalancer", func() { + namespace := f.Namespace.Name + serviceName := "external-local-lb" + jig := e2eservice.NewTestJig(cs, namespace, serviceName) + + svc, err := jig.CreateOnlyLocalLoadBalancerService(loadBalancerCreateTimeout, true, nil) + framework.ExpectNoError(err) + serviceLBNames = append(serviceLBNames, cloudprovider.DefaultLoadBalancerName(svc)) + healthCheckNodePort := int(svc.Spec.HealthCheckNodePort) + if healthCheckNodePort == 0 { + framework.Failf("Service HealthCheck NodePort was not allocated") + } + defer func() { + err = jig.ChangeServiceType(v1.ServiceTypeClusterIP, loadBalancerCreateTimeout) + framework.ExpectNoError(err) + + // Make sure we didn't leak the health check node port. + const threshold = 2 + nodes, err := getEndpointNodesWithInternalIP(jig) + framework.ExpectNoError(err) + config := e2enetwork.NewNetworkingTestConfig(f) + for _, internalIP := range nodes { + err := testHTTPHealthCheckNodePortFromTestContainer( + config, + internalIP, + healthCheckNodePort, + e2eservice.KubeProxyLagTimeout, + false, + threshold) + framework.ExpectNoError(err) + } + err = cs.CoreV1().Services(svc.Namespace).Delete(context.TODO(), svc.Name, metav1.DeleteOptions{}) + framework.ExpectNoError(err) + }() + + svcTCPPort := int(svc.Spec.Ports[0].Port) + ingressIP := e2eservice.GetIngressPoint(&svc.Status.LoadBalancer.Ingress[0]) + + ginkgo.By("reading clientIP using the TCP service's service port via its external VIP") + clientIP, err := GetHTTPContent(ingressIP, svcTCPPort, e2eservice.KubeProxyLagTimeout, "/clientip") + framework.ExpectNoError(err) + framework.Logf("ClientIP detected by target pod using VIP:SvcPort is %s", clientIP) + + ginkgo.By("checking if Source IP is preserved") + if strings.HasPrefix(clientIP, "10.") { + framework.Failf("Source IP was NOT preserved") + } + }) + + ginkgo.It("should work for type=NodePort", func() { + namespace := f.Namespace.Name + serviceName := "external-local-nodeport" + jig := e2eservice.NewTestJig(cs, namespace, serviceName) + + svc, err := jig.CreateOnlyLocalNodePortService(true) + framework.ExpectNoError(err) + defer func() { + err := cs.CoreV1().Services(svc.Namespace).Delete(context.TODO(), svc.Name, metav1.DeleteOptions{}) + framework.ExpectNoError(err) + }() + + tcpNodePort := int(svc.Spec.Ports[0].NodePort) + + endpointsNodeMap, err := getEndpointNodesWithInternalIP(jig) + framework.ExpectNoError(err) + + dialCmd := "clientip" + config := e2enetwork.NewNetworkingTestConfig(f) + + for nodeName, nodeIP := range endpointsNodeMap { + ginkgo.By(fmt.Sprintf("reading clientIP using the TCP service's NodePort, on node %v: %v:%v/%v", nodeName, nodeIP, tcpNodePort, dialCmd)) + clientIP, err := GetHTTPContentFromTestContainer(config, nodeIP, tcpNodePort, e2eservice.KubeProxyLagTimeout, dialCmd) + framework.ExpectNoError(err) + framework.Logf("ClientIP detected by target pod using NodePort is %s, the ip of test container is %s", clientIP, config.TestContainerPod.Status.PodIP) + // the clientIP returned by agnhost contains port + if !strings.HasPrefix(clientIP, config.TestContainerPod.Status.PodIP) { + framework.Failf("Source IP was NOT preserved") + } + } + }) + + ginkgo.It("should only target nodes with endpoints", func() { + namespace := f.Namespace.Name + serviceName := "external-local-nodes" + jig := e2eservice.NewTestJig(cs, namespace, serviceName) + nodes, err := e2enode.GetBoundedReadySchedulableNodes(cs, e2eservice.MaxNodesForEndpointsTests) + framework.ExpectNoError(err) + + svc, err := jig.CreateOnlyLocalLoadBalancerService(loadBalancerCreateTimeout, false, + func(svc *v1.Service) { + // Change service port to avoid collision with opened hostPorts + // in other tests that run in parallel. + if len(svc.Spec.Ports) != 0 { + svc.Spec.Ports[0].TargetPort = intstr.FromInt(int(svc.Spec.Ports[0].Port)) + svc.Spec.Ports[0].Port = 8081 + } + + }) + framework.ExpectNoError(err) + serviceLBNames = append(serviceLBNames, cloudprovider.DefaultLoadBalancerName(svc)) + defer func() { + err = jig.ChangeServiceType(v1.ServiceTypeClusterIP, loadBalancerCreateTimeout) + framework.ExpectNoError(err) + err := cs.CoreV1().Services(svc.Namespace).Delete(context.TODO(), svc.Name, metav1.DeleteOptions{}) + framework.ExpectNoError(err) + }() + + healthCheckNodePort := int(svc.Spec.HealthCheckNodePort) + if healthCheckNodePort == 0 { + framework.Failf("Service HealthCheck NodePort was not allocated") + } + + ips := e2enode.CollectAddresses(nodes, v1.NodeInternalIP) + + ingressIP := e2eservice.GetIngressPoint(&svc.Status.LoadBalancer.Ingress[0]) + svcTCPPort := int(svc.Spec.Ports[0].Port) + + const threshold = 2 + config := e2enetwork.NewNetworkingTestConfig(f) + for i := 0; i < len(nodes.Items); i++ { + endpointNodeName := nodes.Items[i].Name + + ginkgo.By("creating a pod to be part of the service " + serviceName + " on node " + endpointNodeName) + _, err = jig.Run(func(rc *v1.ReplicationController) { + rc.Name = serviceName + if endpointNodeName != "" { + rc.Spec.Template.Spec.NodeName = endpointNodeName + } + }) + framework.ExpectNoError(err) + + ginkgo.By(fmt.Sprintf("waiting for service endpoint on node %v", endpointNodeName)) + err = jig.WaitForEndpointOnNode(endpointNodeName) + framework.ExpectNoError(err) + + // HealthCheck should pass only on the node where num(endpoints) > 0 + // All other nodes should fail the healthcheck on the service healthCheckNodePort + for n, internalIP := range ips { + // Make sure the loadbalancer picked up the health check change. + // Confirm traffic can reach backend through LB before checking healthcheck nodeport. + e2eservice.TestReachableHTTP(ingressIP, svcTCPPort, e2eservice.KubeProxyLagTimeout) + expectedSuccess := nodes.Items[n].Name == endpointNodeName + port := strconv.Itoa(healthCheckNodePort) + ipPort := net.JoinHostPort(internalIP, port) + framework.Logf("Health checking %s, http://%s/healthz, expectedSuccess %v", nodes.Items[n].Name, ipPort, expectedSuccess) + err := testHTTPHealthCheckNodePortFromTestContainer( + config, + internalIP, + healthCheckNodePort, + e2eservice.KubeProxyEndpointLagTimeout, + expectedSuccess, + threshold) + framework.ExpectNoError(err) + } + framework.ExpectNoError(e2erc.DeleteRCAndWaitForGC(f.ClientSet, namespace, serviceName)) + } + }) + + ginkgo.It("should work from pods", func() { + var err error + namespace := f.Namespace.Name + serviceName := "external-local-pods" + jig := e2eservice.NewTestJig(cs, namespace, serviceName) + + svc, err := jig.CreateOnlyLocalLoadBalancerService(loadBalancerCreateTimeout, true, nil) + framework.ExpectNoError(err) + serviceLBNames = append(serviceLBNames, cloudprovider.DefaultLoadBalancerName(svc)) + defer func() { + err = jig.ChangeServiceType(v1.ServiceTypeClusterIP, loadBalancerCreateTimeout) + framework.ExpectNoError(err) + err := cs.CoreV1().Services(svc.Namespace).Delete(context.TODO(), svc.Name, metav1.DeleteOptions{}) + framework.ExpectNoError(err) + }() + + ingressIP := e2eservice.GetIngressPoint(&svc.Status.LoadBalancer.Ingress[0]) + port := strconv.Itoa(int(svc.Spec.Ports[0].Port)) + ipPort := net.JoinHostPort(ingressIP, port) + path := fmt.Sprintf("%s/clientip", ipPort) + + ginkgo.By("Creating pause pod deployment to make sure, pausePods are in desired state") + deployment := createPausePodDeployment(cs, "pause-pod-deployment", namespace, 1) + framework.ExpectNoError(e2edeployment.WaitForDeploymentComplete(cs, deployment), "Failed to complete pause pod deployment") + + defer func() { + framework.Logf("Deleting deployment") + err = cs.AppsV1().Deployments(namespace).Delete(context.TODO(), deployment.Name, metav1.DeleteOptions{}) + framework.ExpectNoError(err, "Failed to delete deployment %s", deployment.Name) + }() + + deployment, err = cs.AppsV1().Deployments(namespace).Get(context.TODO(), deployment.Name, metav1.GetOptions{}) + framework.ExpectNoError(err, "Error in retrieving pause pod deployment") + labelSelector, err := metav1.LabelSelectorAsSelector(deployment.Spec.Selector) + framework.ExpectNoError(err, "Error in setting LabelSelector as selector from deployment") + + pausePods, err := cs.CoreV1().Pods(namespace).List(context.TODO(), metav1.ListOptions{LabelSelector: labelSelector.String()}) + framework.ExpectNoError(err, "Error in listing pods associated with pause pod deployments") + + pausePod := pausePods.Items[0] + framework.Logf("Waiting up to %v curl %v", e2eservice.KubeProxyLagTimeout, path) + cmd := fmt.Sprintf(`curl -q -s --connect-timeout 30 %v`, path) + + var srcIP string + loadBalancerPropagationTimeout := e2eservice.GetServiceLoadBalancerPropagationTimeout(cs) + ginkgo.By(fmt.Sprintf("Hitting external lb %v from pod %v on node %v", ingressIP, pausePod.Name, pausePod.Spec.NodeName)) + if pollErr := wait.PollImmediate(framework.Poll, loadBalancerPropagationTimeout, func() (bool, error) { + stdout, err := framework.RunHostCmd(pausePod.Namespace, pausePod.Name, cmd) + if err != nil { + framework.Logf("got err: %v, retry until timeout", err) + return false, nil + } + srcIP = strings.TrimSpace(strings.Split(stdout, ":")[0]) + return srcIP == pausePod.Status.PodIP, nil + }); pollErr != nil { + framework.Failf("Source IP not preserved from %v, expected '%v' got '%v'", pausePod.Name, pausePod.Status.PodIP, srcIP) + } + }) + + ginkgo.It("should handle updates to ExternalTrafficPolicy field", func() { + namespace := f.Namespace.Name + serviceName := "external-local-update" + jig := e2eservice.NewTestJig(cs, namespace, serviceName) + + nodes, err := e2enode.GetBoundedReadySchedulableNodes(cs, e2eservice.MaxNodesForEndpointsTests) + framework.ExpectNoError(err) + if len(nodes.Items) < 2 { + framework.Failf("Need at least 2 nodes to verify source ip from a node without endpoint") + } + + svc, err := jig.CreateOnlyLocalLoadBalancerService(loadBalancerCreateTimeout, true, nil) + framework.ExpectNoError(err) + serviceLBNames = append(serviceLBNames, cloudprovider.DefaultLoadBalancerName(svc)) + defer func() { + err = jig.ChangeServiceType(v1.ServiceTypeClusterIP, loadBalancerCreateTimeout) + framework.ExpectNoError(err) + err := cs.CoreV1().Services(svc.Namespace).Delete(context.TODO(), svc.Name, metav1.DeleteOptions{}) + framework.ExpectNoError(err) + }() + + // save the health check node port because it disappears when ESIPP is turned off. + healthCheckNodePort := int(svc.Spec.HealthCheckNodePort) + + ginkgo.By("turning ESIPP off") + svc, err = jig.UpdateService(func(svc *v1.Service) { + svc.Spec.ExternalTrafficPolicy = v1.ServiceExternalTrafficPolicyTypeCluster + }) + framework.ExpectNoError(err) + if svc.Spec.HealthCheckNodePort > 0 { + framework.Failf("Service HealthCheck NodePort still present") + } + + epNodes, err := jig.ListNodesWithEndpoint() + framework.ExpectNoError(err) + // map from name of nodes with endpoint to internal ip + // it is assumed that there is only a single node with the endpoint + endpointNodeMap := make(map[string]string) + // map from name of nodes without endpoint to internal ip + noEndpointNodeMap := make(map[string]string) + for _, node := range epNodes { + ips := e2enode.GetAddresses(&node, v1.NodeInternalIP) + if len(ips) < 1 { + framework.Failf("No internal ip found for node %s", node.Name) + } + endpointNodeMap[node.Name] = ips[0] + } + for _, n := range nodes.Items { + ips := e2enode.GetAddresses(&n, v1.NodeInternalIP) + if len(ips) < 1 { + framework.Failf("No internal ip found for node %s", n.Name) + } + if _, ok := endpointNodeMap[n.Name]; !ok { + noEndpointNodeMap[n.Name] = ips[0] + } + } + framework.ExpectNotEqual(len(endpointNodeMap), 0) + framework.ExpectNotEqual(len(noEndpointNodeMap), 0) + + svcTCPPort := int(svc.Spec.Ports[0].Port) + svcNodePort := int(svc.Spec.Ports[0].NodePort) + ingressIP := e2eservice.GetIngressPoint(&svc.Status.LoadBalancer.Ingress[0]) + path := "/clientip" + dialCmd := "clientip" + + config := e2enetwork.NewNetworkingTestConfig(f) + + ginkgo.By(fmt.Sprintf("endpoints present on nodes %v, absent on nodes %v", endpointNodeMap, noEndpointNodeMap)) + for nodeName, nodeIP := range noEndpointNodeMap { + ginkgo.By(fmt.Sprintf("Checking %v (%v:%v/%v) proxies to endpoints on another node", nodeName, nodeIP[0], svcNodePort, dialCmd)) + _, err := GetHTTPContentFromTestContainer(config, nodeIP, svcNodePort, e2eservice.KubeProxyLagTimeout, dialCmd) + framework.ExpectNoError(err, "Could not reach HTTP service through %v:%v/%v after %v", nodeIP, svcNodePort, dialCmd, e2eservice.KubeProxyLagTimeout) + } + + for nodeName, nodeIP := range endpointNodeMap { + ginkgo.By(fmt.Sprintf("checking kube-proxy health check fails on node with endpoint (%s), public IP %s", nodeName, nodeIP)) + var body string + pollFn := func() (bool, error) { + // we expect connection failure here, but not other errors + resp, err := config.GetResponseFromTestContainer( + "http", + "healthz", + nodeIP, + healthCheckNodePort) + if err != nil { + return false, nil + } + if len(resp.Errors) > 0 { + return true, nil + } + if len(resp.Responses) > 0 { + body = resp.Responses[0] + } + return false, nil + } + if pollErr := wait.PollImmediate(framework.Poll, e2eservice.TestTimeout, pollFn); pollErr != nil { + framework.Failf("Kube-proxy still exposing health check on node %v:%v, after ESIPP was turned off. body %s", + nodeName, healthCheckNodePort, body) + } + } + + // Poll till kube-proxy re-adds the MASQUERADE rule on the node. + ginkgo.By(fmt.Sprintf("checking source ip is NOT preserved through loadbalancer %v", ingressIP)) + var clientIP string + pollErr := wait.PollImmediate(framework.Poll, e2eservice.KubeProxyLagTimeout, func() (bool, error) { + clientIP, err := GetHTTPContent(ingressIP, svcTCPPort, e2eservice.KubeProxyLagTimeout, "/clientip") + if err != nil { + return false, nil + } + if strings.HasPrefix(clientIP, "10.") { + return true, nil + } + return false, nil + }) + if pollErr != nil { + framework.Failf("Source IP WAS preserved even after ESIPP turned off. Got %v, expected a ten-dot cluster ip.", clientIP) + } + + // TODO: We need to attempt to create another service with the previously + // allocated healthcheck nodePort. If the health check nodePort has been + // freed, the new service creation will succeed, upon which we cleanup. + // If the health check nodePort has NOT been freed, the new service + // creation will fail. + + ginkgo.By("setting ExternalTraffic field back to OnlyLocal") + svc, err = jig.UpdateService(func(svc *v1.Service) { + svc.Spec.ExternalTrafficPolicy = v1.ServiceExternalTrafficPolicyTypeLocal + // Request the same healthCheckNodePort as before, to test the user-requested allocation path + svc.Spec.HealthCheckNodePort = int32(healthCheckNodePort) + }) + framework.ExpectNoError(err) + pollErr = wait.PollImmediate(framework.Poll, e2eservice.KubeProxyLagTimeout, func() (bool, error) { + clientIP, err := GetHTTPContent(ingressIP, svcTCPPort, e2eservice.KubeProxyLagTimeout, path) + if err != nil { + return false, nil + } + ginkgo.By(fmt.Sprintf("Endpoint %v:%v%v returned client ip %v", ingressIP, svcTCPPort, path, clientIP)) + if !strings.HasPrefix(clientIP, "10.") { + return true, nil + } + return false, nil + }) + if pollErr != nil { + framework.Failf("Source IP (%v) is not the client IP even after ESIPP turned on, expected a public IP.", clientIP) + } + }) +}) diff --git a/vendor/k8s.io/kubernetes/test/e2e/network/netpol/OWNERS b/vendor/k8s.io/kubernetes/test/e2e/network/netpol/OWNERS new file mode 100644 index 000000000000..137fd3b859cd --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/network/netpol/OWNERS @@ -0,0 +1,10 @@ +approvers: + - jayunit100 + - mattfenwick + - abhiraut + - knabben +reviewers: + - jayunit100 + - mattfenwick + - abhiraut + - knabben diff --git a/vendor/k8s.io/kubernetes/test/e2e/network/netpol/kubemanager.go b/vendor/k8s.io/kubernetes/test/e2e/network/netpol/kubemanager.go new file mode 100644 index 000000000000..08dad13e2b1a --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/network/netpol/kubemanager.go @@ -0,0 +1,291 @@ +/* +Copyright 2020 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package netpol + +import ( + "context" + "fmt" + "strings" + "time" + + e2epod "k8s.io/kubernetes/test/e2e/framework/pod" + + "github.com/pkg/errors" + v1 "k8s.io/api/core/v1" + networkingv1 "k8s.io/api/networking/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + clientset "k8s.io/client-go/kubernetes" + "k8s.io/kubernetes/test/e2e/framework" +) + +// kubeManager provides a convenience interface to kube functionality that we leverage for polling NetworkPolicy connections. +// Its responsibilities are: +// - creating resources (pods, deployments, namespaces, services, network policies) +// - modifying and cleaning up resources +type kubeManager struct { + framework *framework.Framework + clientSet clientset.Interface +} + +// newKubeManager is a utility function that wraps creation of the kubeManager instance. +func newKubeManager(framework *framework.Framework) *kubeManager { + return &kubeManager{ + framework: framework, + clientSet: framework.ClientSet, + } +} + +// initializeCluster checks the state of the cluster, creating or updating namespaces and deployments as needed. +func (k *kubeManager) initializeCluster(model *Model) error { + var createdPods []*v1.Pod + for _, ns := range model.Namespaces { + _, err := k.createNamespace(ns.Spec()) + if err != nil { + return err + } + + for _, pod := range ns.Pods { + framework.Logf("creating/updating pod %s/%s", ns.Name, pod.Name) + + kubePod, err := k.createPod(pod.KubePod()) + if err != nil { + return err + } + createdPods = append(createdPods, kubePod) + + _, err = k.createService(pod.Service()) + if err != nil { + return err + } + } + } + + for _, podString := range model.AllPodStrings() { + k8sPod, err := k.getPod(podString.Namespace(), podString.PodName()) + if err != nil { + return err + } + if k8sPod == nil { + return errors.Errorf("unable to find pod in ns %s with key/val pod=%s", podString.Namespace(), podString.PodName()) + } + err = e2epod.WaitForPodNameRunningInNamespace(k.clientSet, k8sPod.Name, k8sPod.Namespace) + if err != nil { + return errors.Wrapf(err, "unable to wait for pod %s/%s", podString.Namespace(), podString.PodName()) + } + } + + for _, createdPod := range createdPods { + err := e2epod.WaitForPodRunningInNamespace(k.clientSet, createdPod) + if err != nil { + return errors.Wrapf(err, "unable to wait for pod %s/%s", createdPod.Namespace, createdPod.Name) + } + } + + return nil +} + +// getPod gets a pod by namespace and name. +func (k *kubeManager) getPod(ns string, name string) (*v1.Pod, error) { + kubePod, err := k.clientSet.CoreV1().Pods(ns).Get(context.TODO(), name, metav1.GetOptions{}) + if err != nil { + return nil, errors.Wrapf(err, "unable to get pod %s/%s", ns, name) + } + return kubePod, nil +} + +// probeConnectivity execs into a pod and checks its connectivity to another pod.. +func (k *kubeManager) probeConnectivity(nsFrom string, podFrom string, containerFrom string, addrTo string, protocol v1.Protocol, toPort int) (bool, string, error) { + var cmd []string + switch protocol { + case v1.ProtocolSCTP: + cmd = []string{"/agnhost", "connect", fmt.Sprintf("%s:%d", addrTo, toPort), "--timeout=1s", "--protocol=sctp"} + case v1.ProtocolTCP: + cmd = []string{"/agnhost", "connect", fmt.Sprintf("%s:%d", addrTo, toPort), "--timeout=1s", "--protocol=tcp"} + case v1.ProtocolUDP: + cmd = []string{"/agnhost", "connect", fmt.Sprintf("%s:%d", addrTo, toPort), "--timeout=1s", "--protocol=udp"} + default: + framework.Failf("protocol %s not supported", protocol) + } + + commandDebugString := fmt.Sprintf("kubectl exec %s -c %s -n %s -- %s", podFrom, containerFrom, nsFrom, strings.Join(cmd, " ")) + stdout, stderr, err := k.executeRemoteCommand(nsFrom, podFrom, containerFrom, cmd) + if err != nil { + framework.Logf("%s/%s -> %s: error when running command: err - %v /// stdout - %s /// stderr - %s", nsFrom, podFrom, addrTo, err, stdout, stderr) + return false, commandDebugString, nil + } + return true, commandDebugString, nil +} + +// executeRemoteCommand executes a remote shell command on the given pod. +func (k *kubeManager) executeRemoteCommand(namespace string, pod string, containerName string, command []string) (string, string, error) { + return k.framework.ExecWithOptions(framework.ExecOptions{ + Command: command, + Namespace: namespace, + PodName: pod, + ContainerName: containerName, + Stdin: nil, + CaptureStdout: true, + CaptureStderr: true, + PreserveWhitespace: false, + }) +} + +// createNamespace is a convenience function for namespace setup. +func (k *kubeManager) createNamespace(ns *v1.Namespace) (*v1.Namespace, error) { + createdNamespace, err := k.clientSet.CoreV1().Namespaces().Create(context.TODO(), ns, metav1.CreateOptions{}) + if err != nil { + return nil, errors.Wrapf(err, "unable to update namespace %s", ns.Name) + } + return createdNamespace, nil +} + +// createService is a convenience function for service setup. +func (k *kubeManager) createService(service *v1.Service) (*v1.Service, error) { + ns := service.Namespace + name := service.Name + + createdService, err := k.clientSet.CoreV1().Services(ns).Create(context.TODO(), service, metav1.CreateOptions{}) + if err != nil { + return nil, errors.Wrapf(err, "unable to create service %s/%s", ns, name) + } + return createdService, nil +} + +// createPod is a convenience function for pod setup. +func (k *kubeManager) createPod(pod *v1.Pod) (*v1.Pod, error) { + ns := pod.Namespace + framework.Logf("creating pod %s/%s", ns, pod.Name) + + createdPod, err := k.clientSet.CoreV1().Pods(ns).Create(context.TODO(), pod, metav1.CreateOptions{}) + if err != nil { + return nil, errors.Wrapf(err, "unable to update pod %s/%s", ns, pod.Name) + } + return createdPod, nil +} + +// cleanNetworkPolicies is a convenience function for deleting network policies before startup of any new test. +func (k *kubeManager) cleanNetworkPolicies(namespaces []string) error { + for _, ns := range namespaces { + framework.Logf("deleting policies in %s ..........", ns) + l, err := k.clientSet.NetworkingV1().NetworkPolicies(ns).List(context.TODO(), metav1.ListOptions{}) + if err != nil { + return errors.Wrapf(err, "unable to list network policies in ns %s", ns) + } + for _, np := range l.Items { + framework.Logf("deleting network policy %s/%s", ns, np.Name) + err = k.clientSet.NetworkingV1().NetworkPolicies(ns).Delete(context.TODO(), np.Name, metav1.DeleteOptions{}) + if err != nil { + return errors.Wrapf(err, "unable to delete network policy %s/%s", ns, np.Name) + } + } + } + return nil +} + +// createNetworkPolicy is a convenience function for creating network policies. +func (k *kubeManager) createNetworkPolicy(ns string, netpol *networkingv1.NetworkPolicy) (*networkingv1.NetworkPolicy, error) { + framework.Logf("creating network policy %s/%s", ns, netpol.Name) + netpol.ObjectMeta.Namespace = ns + np, err := k.clientSet.NetworkingV1().NetworkPolicies(ns).Create(context.TODO(), netpol, metav1.CreateOptions{}) + if err != nil { + return nil, errors.Wrapf(err, "unable to create network policy %s/%s", ns, netpol.Name) + } + return np, nil +} + +// updateNetworkPolicy is a convenience function for updating network policies. +func (k *kubeManager) updateNetworkPolicy(ns string, netpol *networkingv1.NetworkPolicy) (*networkingv1.NetworkPolicy, error) { + framework.Logf("updating network policy %s/%s", ns, netpol.Name) + netpol.ObjectMeta.Namespace = ns + np, err := k.clientSet.NetworkingV1().NetworkPolicies(ns).Update(context.TODO(), netpol, metav1.UpdateOptions{}) + if err != nil { + return np, errors.Wrapf(err, "unable to update network policy %s/%s", ns, netpol.Name) + } + return np, nil +} + +// getNamespace gets a namespace object from kubernetes. +func (k *kubeManager) getNamespace(ns string) (*v1.Namespace, error) { + selectedNameSpace, err := k.clientSet.CoreV1().Namespaces().Get(context.TODO(), ns, metav1.GetOptions{}) + if err != nil { + return nil, errors.Wrapf(err, "unable to get namespace %s", ns) + } + return selectedNameSpace, nil +} + +// setNamespaceLabels sets the labels for a namespace object in kubernetes. +func (k *kubeManager) setNamespaceLabels(ns string, labels map[string]string) error { + selectedNameSpace, err := k.getNamespace(ns) + if err != nil { + return err + } + selectedNameSpace.ObjectMeta.Labels = labels + _, err = k.clientSet.CoreV1().Namespaces().Update(context.TODO(), selectedNameSpace, metav1.UpdateOptions{}) + return errors.Wrapf(err, "unable to update namespace %s", ns) +} + +// deleteNamespaces removes a namespace from kubernetes. +func (k *kubeManager) deleteNamespaces(namespaces []string) error { + for _, ns := range namespaces { + err := k.clientSet.CoreV1().Namespaces().Delete(context.TODO(), ns, metav1.DeleteOptions{}) + if err != nil { + return errors.Wrapf(err, "unable to delete namespace %s", ns) + } + } + return nil +} + +// waitForHTTPServers waits for all webservers to be up, on all protocols, and then validates them using the same probe logic as the rest of the suite. +func (k *kubeManager) waitForHTTPServers(model *Model) error { + const maxTries = 10 + framework.Logf("waiting for HTTP servers (ports 80 and 81) to become ready") + + testCases := map[string]*TestCase{} + for _, port := range model.Ports { + for _, protocol := range model.Protocols { + fromPort := 81 + desc := fmt.Sprintf("%d->%d,%s", fromPort, port, protocol) + testCases[desc] = &TestCase{ToPort: int(port), Protocol: protocol} + } + } + notReady := map[string]bool{} + for caseName := range testCases { + notReady[caseName] = true + } + + for i := 0; i < maxTries; i++ { + for caseName, testCase := range testCases { + if notReady[caseName] { + reachability := NewReachability(model.AllPods(), true) + testCase.Reachability = reachability + ProbePodToPodConnectivity(k, model, testCase) + _, wrong, _, _ := reachability.Summary(ignoreLoopback) + if wrong == 0 { + framework.Logf("server %s is ready", caseName) + delete(notReady, caseName) + } else { + framework.Logf("server %s is not ready", caseName) + } + } + } + if len(notReady) == 0 { + return nil + } + time.Sleep(waitInterval) + } + return errors.Errorf("after %d tries, %d HTTP servers are not ready", maxTries, len(notReady)) +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/network/netpol/model.go b/vendor/k8s.io/kubernetes/test/e2e/network/netpol/model.go new file mode 100644 index 000000000000..84a39a9e61dd --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/network/netpol/model.go @@ -0,0 +1,297 @@ +/* +Copyright 2020 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package netpol + +import ( + "fmt" + "strings" + + "github.com/pkg/errors" + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/kubernetes/test/e2e/framework" + imageutils "k8s.io/kubernetes/test/utils/image" +) + +// Model defines the namespaces, deployments, services, pods, containers and associated +// data for network policy test cases and provides the source of truth +type Model struct { + Namespaces []*Namespace + allPodStrings *[]PodString + allPods *[]*Pod + // the raw data + NamespaceNames []string + PodNames []string + Ports []int32 + Protocols []v1.Protocol + DNSDomain string +} + +// NewModel instantiates a model based on: +// - namespaces +// - pods +// - ports to listen on +// - protocols to listen on +// The total number of pods is the number of namespaces x the number of pods per namespace. +// The number of containers per pod is the number of ports x the number of protocols. +// The *total* number of containers is namespaces x pods x ports x protocols. +func NewModel(namespaces []string, podNames []string, ports []int32, protocols []v1.Protocol, dnsDomain string) *Model { + model := &Model{ + NamespaceNames: namespaces, + PodNames: podNames, + Ports: ports, + Protocols: protocols, + DNSDomain: dnsDomain, + } + framework.Logf("DnsDomain %v", model.DNSDomain) + + // build the entire "model" for the overall test, which means, building + // namespaces, pods, containers for each protocol. + for _, ns := range namespaces { + var pods []*Pod + for _, podName := range podNames { + var containers []*Container + for _, port := range ports { + for _, protocol := range protocols { + containers = append(containers, &Container{ + Port: port, + Protocol: protocol, + }) + } + } + pods = append(pods, &Pod{ + Namespace: ns, + Name: podName, + Containers: containers, + }) + } + model.Namespaces = append(model.Namespaces, &Namespace{Name: ns, Pods: pods}) + } + return model +} + +// NewReachability instantiates a default-true reachability from the model's pods +func (m *Model) NewReachability() *Reachability { + return NewReachability(m.AllPods(), true) +} + +// AllPodStrings returns a slice of all pod strings +func (m *Model) AllPodStrings() []PodString { + if m.allPodStrings == nil { + var pods []PodString + for _, ns := range m.Namespaces { + for _, pod := range ns.Pods { + pods = append(pods, pod.PodString()) + } + } + m.allPodStrings = &pods + } + return *m.allPodStrings +} + +// AllPods returns a slice of all pods +func (m *Model) AllPods() []*Pod { + if m.allPods == nil { + var pods []*Pod + for _, ns := range m.Namespaces { + for _, pod := range ns.Pods { + pods = append(pods, pod) + } + } + m.allPods = &pods + } + return *m.allPods +} + +// FindPod returns the pod of matching namespace and name, or an error +func (m *Model) FindPod(ns string, name string) (*Pod, error) { + for _, namespace := range m.Namespaces { + for _, pod := range namespace.Pods { + if namespace.Name == ns && pod.Name == name { + return pod, nil + } + } + } + return nil, errors.Errorf("unable to find pod %s/%s", ns, name) +} + +// Namespace is the abstract representation of what matters to network policy +// tests for a namespace; i.e. it ignores kube implementation details +type Namespace struct { + Name string + Pods []*Pod +} + +// Spec builds a kubernetes namespace spec +func (ns *Namespace) Spec() *v1.Namespace { + return &v1.Namespace{ + ObjectMeta: metav1.ObjectMeta{ + Name: ns.Name, + Labels: ns.LabelSelector(), + }, + } +} + +// LabelSelector returns the default labels that should be placed on a namespace +// in order for it to be uniquely selectable by label selectors +func (ns *Namespace) LabelSelector() map[string]string { + return map[string]string{"ns": ns.Name} +} + +// Pod is the abstract representation of what matters to network policy tests for +// a pod; i.e. it ignores kube implementation details +type Pod struct { + Namespace string + Name string + Containers []*Container +} + +// PodString returns a corresponding pod string +func (p *Pod) PodString() PodString { + return NewPodString(p.Namespace, p.Name) +} + +// ContainerSpecs builds kubernetes container specs for the pod +func (p *Pod) ContainerSpecs() []v1.Container { + var containers []v1.Container + for _, cont := range p.Containers { + containers = append(containers, cont.Spec()) + } + return containers +} + +func (p *Pod) labelSelectorKey() string { + return "pod" +} + +func (p *Pod) labelSelectorValue() string { + return p.Name +} + +// LabelSelector returns the default labels that should be placed on a pod/deployment +// in order for it to be uniquely selectable by label selectors +func (p *Pod) LabelSelector() map[string]string { + return map[string]string{ + p.labelSelectorKey(): p.labelSelectorValue(), + } +} + +// KubePod returns the kube pod +func (p *Pod) KubePod() *v1.Pod { + zero := int64(0) + return &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: p.Name, + Labels: p.LabelSelector(), + Namespace: p.Namespace, + }, + Spec: v1.PodSpec{ + TerminationGracePeriodSeconds: &zero, + Containers: p.ContainerSpecs(), + }, + } +} + +// QualifiedServiceAddress returns the address that can be used to hit a service from +// any namespace in the cluster +func (p *Pod) QualifiedServiceAddress(dnsDomain string) string { + return fmt.Sprintf("%s.%s.svc.%s", p.ServiceName(), p.Namespace, dnsDomain) +} + +// ServiceName returns the unqualified service name +func (p *Pod) ServiceName() string { + return fmt.Sprintf("s-%s-%s", p.Namespace, p.Name) +} + +// Service returns a kube service spec +func (p *Pod) Service() *v1.Service { + service := &v1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: p.ServiceName(), + Namespace: p.Namespace, + }, + Spec: v1.ServiceSpec{ + Selector: p.LabelSelector(), + }, + } + for _, container := range p.Containers { + service.Spec.Ports = append(service.Spec.Ports, v1.ServicePort{ + Name: fmt.Sprintf("service-port-%s-%d", strings.ToLower(string(container.Protocol)), container.Port), + Protocol: container.Protocol, + Port: container.Port, + }) + } + return service +} + +// Container is the abstract representation of what matters to network policy tests for +// a container; i.e. it ignores kube implementation details +type Container struct { + Port int32 + Protocol v1.Protocol +} + +// Name returns the container name +func (c *Container) Name() string { + return fmt.Sprintf("cont-%d-%s", c.Port, strings.ToLower(string(c.Protocol))) +} + +// PortName returns the container port name +func (c *Container) PortName() string { + return fmt.Sprintf("serve-%d-%s", c.Port, strings.ToLower(string(c.Protocol))) +} + +// Spec returns the kube container spec +func (c *Container) Spec() v1.Container { + var ( + // agnHostImage is the image URI of AgnHost + agnHostImage = imageutils.GetE2EImage(imageutils.Agnhost) + env = []v1.EnvVar{} + cmd []string + ) + + switch c.Protocol { + case v1.ProtocolTCP: + cmd = []string{"/agnhost", "serve-hostname", "--tcp", "--http=false", "--port", fmt.Sprintf("%d", c.Port)} + case v1.ProtocolUDP: + cmd = []string{"/agnhost", "serve-hostname", "--udp", "--http=false", "--port", fmt.Sprintf("%d", c.Port)} + case v1.ProtocolSCTP: + env = append(env, v1.EnvVar{ + Name: fmt.Sprintf("SERVE_SCTP_PORT_%d", c.Port), + Value: "foo", + }) + cmd = []string{"/agnhost", "porter"} + default: + framework.Failf("invalid protocol %v", c.Protocol) + } + + return v1.Container{ + Name: c.Name(), + ImagePullPolicy: v1.PullIfNotPresent, + Image: agnHostImage, + Command: cmd, + Env: env, + SecurityContext: &v1.SecurityContext{}, + Ports: []v1.ContainerPort{ + { + ContainerPort: c.Port, + Name: c.PortName(), + Protocol: c.Protocol, + }, + }, + } +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/network/netpol/network_legacy.go b/vendor/k8s.io/kubernetes/test/e2e/network/netpol/network_legacy.go new file mode 100644 index 000000000000..0015b6ab5f14 --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/network/netpol/network_legacy.go @@ -0,0 +1,2387 @@ +/* +Copyright 2016 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package netpol + +import ( + "context" + "encoding/json" + "fmt" + "k8s.io/kubernetes/test/e2e/storage/utils" + "net" + "regexp" + "strconv" + "strings" + "time" + + "github.com/onsi/ginkgo" + v1 "k8s.io/api/core/v1" + networkingv1 "k8s.io/api/networking/v1" + apierrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/intstr" + "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/apimachinery/pkg/watch" + "k8s.io/kubernetes/test/e2e/framework" + e2enode "k8s.io/kubernetes/test/e2e/framework/node" + e2epod "k8s.io/kubernetes/test/e2e/framework/pod" + e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" + "k8s.io/kubernetes/test/e2e/network/common" + imageutils "k8s.io/kubernetes/test/utils/image" + utilnet "k8s.io/utils/net" +) + +/* +The following Network Policy tests verify that policy object definitions +are correctly enforced by a networking plugin. It accomplishes this by launching +a simple netcat server, and two clients with different +attributes. Each test case creates a network policy which should only allow +connections from one of the clients. The test then asserts that the clients +failed or successfully connected as expected. +*/ + +type protocolPort struct { + port int + protocol v1.Protocol +} + +var _ = common.SIGDescribe("NetworkPolicy [LinuxOnly]", func() { + var service *v1.Service + var podServer *v1.Pod + var podServerLabelSelector string + f := framework.NewDefaultFramework("network-policy") + + ginkgo.BeforeEach(func() { + // Windows does not support network policies. + e2eskipper.SkipIfNodeOSDistroIs("windows") + }) + + ginkgo.Context("NetworkPolicy between server and client", func() { + ginkgo.BeforeEach(func() { + ginkgo.By("Creating a simple server that serves on port 80 and 81.") + podServer, service = createServerPodAndService(f, f.Namespace, "server", []protocolPort{{80, v1.ProtocolTCP}, {81, v1.ProtocolTCP}}) + + ginkgo.By("Waiting for pod ready", func() { + err := e2epod.WaitTimeoutForPodReadyInNamespace(f.ClientSet, podServer.Name, f.Namespace.Name, framework.PodStartTimeout) + framework.ExpectNoError(err) + }) + + // podServerLabelSelector holds the value for the podServer's label "pod-name". + podServerLabelSelector = podServer.ObjectMeta.Labels["pod-name"] + + // Create pods, which should be able to communicate with the server on port 80 and 81. + ginkgo.By("Testing pods can connect to both ports when no policy is present.") + testCanConnect(f, f.Namespace, "client-can-connect-80", service, 80) + testCanConnect(f, f.Namespace, "client-can-connect-81", service, 81) + }) + + ginkgo.AfterEach(func() { + cleanupServerPodAndService(f, podServer, service) + }) + + ginkgo.It("should support a 'default-deny-ingress' policy [Feature:NetworkPolicy]", func() { + policy := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: "deny-ingress", + }, + Spec: networkingv1.NetworkPolicySpec{ + PodSelector: metav1.LabelSelector{}, + Ingress: []networkingv1.NetworkPolicyIngressRule{}, + }, + } + + policy, err := f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) + framework.ExpectNoError(err) + defer cleanupNetworkPolicy(f, policy) + + // Create a pod with name 'client-cannot-connect', which will attempt to communicate with the server, + // but should not be able to now that isolation is on. + testCannotConnect(f, f.Namespace, "client-cannot-connect", service, 80) + }) + + ginkgo.It("should support a 'default-deny-all' policy [Feature:NetworkPolicy]", func() { + nsA := f.Namespace + nsBName := f.BaseName + "-b" + nsB, err := f.CreateNamespace(nsBName, map[string]string{ + "ns-name": nsBName, + }) + framework.ExpectNoError(err, "Error occurred while creating namespace-b.") + + ginkgo.By("Creating a simple server in another namespace that serves on port 80 and 81.") + podB, serviceB := createServerPodAndService(f, nsB, "pod-b", []protocolPort{{80, v1.ProtocolTCP}, {81, v1.ProtocolTCP}}) + + ginkgo.By("Waiting for pod ready", func() { + err := e2epod.WaitTimeoutForPodReadyInNamespace(f.ClientSet, podB.Name, nsB.Name, framework.PodStartTimeout) + framework.ExpectNoError(err) + }) + + ginkgo.By("Creating client-a, which should be able to contact the server in another namespace.", func() { + testCanConnect(f, nsA, "client-a", serviceB, 80) + }) + + policy := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: "default-deny-all", + }, + Spec: networkingv1.NetworkPolicySpec{ + PodSelector: metav1.LabelSelector{}, + PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeEgress, networkingv1.PolicyTypeIngress}, + Ingress: []networkingv1.NetworkPolicyIngressRule{}, + Egress: []networkingv1.NetworkPolicyEgressRule{}, + }, + } + + policy, err = f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) + framework.ExpectNoError(err) + defer cleanupNetworkPolicy(f, policy) + + ginkgo.By("Creating client-to-a, which should not be able to contact the server in the same namespace, Ingress check.", func() { + testCannotConnect(f, nsA, "client-to-a", service, 80) + }) + + ginkgo.By("Creating client-to-b, which should not be able to contact the server in another namespace, Egress check.", func() { + testCannotConnect(f, nsA, "client-to-b", serviceB, 80) + }) + }) + + ginkgo.It("should enforce policy to allow traffic from pods within server namespace based on PodSelector [Feature:NetworkPolicy]", func() { + nsA := f.Namespace + nsBName := f.BaseName + "-b" + nsB, err := f.CreateNamespace(nsBName, map[string]string{ + "ns-name": nsBName, + }) + framework.ExpectNoError(err, "Error occurred while creating namespace-b.") + + // All communication should be possible before applying the policy. + ginkgo.By("Creating client-a, in server's namespace, which should be able to contact the server.", func() { + testCanConnect(f, nsA, "client-a", service, 80) + }) + ginkgo.By("Creating client-b, in server's namespace, which should be able to contact the server.", func() { + testCanConnect(f, nsA, "client-b", service, 80) + }) + ginkgo.By("Creating client-a, not in server's namespace, which should be able to contact the server.", func() { + testCanConnect(f, nsB, "client-a", service, 80) + }) + + ginkgo.By("Creating a network policy for the server which allows traffic from the pod 'client-a' in same namespace.") + policy := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: "allow-client-a-via-pod-selector", + }, + Spec: networkingv1.NetworkPolicySpec{ + // Apply this policy to the Server + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod-name": podServerLabelSelector, + }, + }, + // Allow traffic only from client-a + Ingress: []networkingv1.NetworkPolicyIngressRule{{ + From: []networkingv1.NetworkPolicyPeer{{ + PodSelector: &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod-name": "client-a", + }, + }, + }}, + }}, + }, + } + + policy, err = f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) + framework.ExpectNoError(err) + defer cleanupNetworkPolicy(f, policy) + + ginkgo.By("Creating client-a, in server's namespace, which should be able to contact the server.", func() { + testCanConnect(f, nsA, "client-a", service, 80) + }) + ginkgo.By("Creating client-b, in server's namespace, which should not be able to contact the server.", func() { + testCannotConnect(f, nsA, "client-b", service, 80) + }) + ginkgo.By("Creating client-a, not in server's namespace, which should not be able to contact the server.", func() { + testCannotConnect(f, nsB, "client-a", service, 80) + }) + }) + + ginkgo.It("should enforce policy to allow traffic only from a different namespace, based on NamespaceSelector [Feature:NetworkPolicy]", func() { + nsA := f.Namespace + nsBName := f.BaseName + "-b" + nsB, err := f.CreateNamespace(nsBName, map[string]string{ + "ns-name": nsBName, + }) + framework.ExpectNoError(err) + + // Create Server with Service in NS-B + framework.Logf("Waiting for server to come up.") + err = e2epod.WaitForPodRunningInNamespace(f.ClientSet, podServer) + framework.ExpectNoError(err) + + // Create Policy for that service that allows traffic only via namespace B + ginkgo.By("Creating a network policy for the server which allows traffic from namespace-b.") + policy := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: "allow-ns-b-via-namespace-selector", + }, + Spec: networkingv1.NetworkPolicySpec{ + // Apply to server + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod-name": podServerLabelSelector, + }, + }, + // Allow traffic only from NS-B + Ingress: []networkingv1.NetworkPolicyIngressRule{{ + From: []networkingv1.NetworkPolicyPeer{{ + NamespaceSelector: &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "ns-name": nsBName, + }, + }, + }}, + }}, + }, + } + policy, err = f.ClientSet.NetworkingV1().NetworkPolicies(nsA.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) + framework.ExpectNoError(err) + defer cleanupNetworkPolicy(f, policy) + + testCannotConnect(f, nsA, "client-a", service, 80) + testCanConnect(f, nsB, "client-b", service, 80) + }) + + ginkgo.It("should enforce policy based on PodSelector with MatchExpressions[Feature:NetworkPolicy]", func() { + ginkgo.By("Creating a network policy for the server which allows traffic from the pod 'client-a'.") + policy := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: "allow-client-a-via-pod-selector-with-match-expressions", + }, + Spec: networkingv1.NetworkPolicySpec{ + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod-name": podServerLabelSelector, + }, + }, + Ingress: []networkingv1.NetworkPolicyIngressRule{{ + From: []networkingv1.NetworkPolicyPeer{{ + PodSelector: &metav1.LabelSelector{ + MatchExpressions: []metav1.LabelSelectorRequirement{{ + Key: "pod-name", + Operator: metav1.LabelSelectorOpIn, + Values: []string{"client-a"}, + }}, + }, + }}, + }}, + }, + } + + policy, err := f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) + framework.ExpectNoError(err, "Error creating Network Policy %v: %v", policy.ObjectMeta.Name, err) + defer cleanupNetworkPolicy(f, policy) + + ginkgo.By("Creating client-a which should be able to contact the server.", func() { + testCanConnect(f, f.Namespace, "client-a", service, 80) + }) + ginkgo.By("Creating client-b which should not be able to contact the server.", func() { + testCannotConnect(f, f.Namespace, "client-b", service, 80) + }) + }) + + ginkgo.It("should enforce policy based on NamespaceSelector with MatchExpressions[Feature:NetworkPolicy]", func() { + nsA := f.Namespace + nsBName := f.BaseName + "-b" + nsB, err := f.CreateNamespace(nsBName, map[string]string{ + "ns-name": nsBName, + }) + framework.ExpectNoError(err, "Error creating namespace %v: %v", nsBName, err) + + nsCName := f.BaseName + "-c" + nsC, err := f.CreateNamespace(nsCName, map[string]string{ + "ns-name": nsCName, + }) + framework.ExpectNoError(err, "Error creating namespace %v: %v", nsCName, err) + + // Create Policy for the server that allows traffic from namespace different than namespace-a + ginkgo.By("Creating a network policy for the server which allows traffic from ns different than namespace-a.") + policy := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: "allow-any-ns-different-than-ns-a-via-ns-selector-with-match-expressions", + }, + Spec: networkingv1.NetworkPolicySpec{ + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod-name": podServerLabelSelector, + }, + }, + Ingress: []networkingv1.NetworkPolicyIngressRule{{ + From: []networkingv1.NetworkPolicyPeer{{ + NamespaceSelector: &metav1.LabelSelector{ + MatchExpressions: []metav1.LabelSelectorRequirement{{ + Key: "ns-name", + Operator: metav1.LabelSelectorOpNotIn, + Values: []string{nsCName}, + }}, + }, + }}, + }}, + }, + } + + policy, err = f.ClientSet.NetworkingV1().NetworkPolicies(nsA.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) + framework.ExpectNoError(err, "Error creating Network Policy %v: %v", policy.ObjectMeta.Name, err) + defer cleanupNetworkPolicy(f, policy) + + testCannotConnect(f, nsC, "client-a", service, 80) + testCanConnect(f, nsB, "client-a", service, 80) + }) + + ginkgo.It("should enforce policy based on PodSelector or NamespaceSelector [Feature:NetworkPolicy]", func() { + nsA := f.Namespace + nsBName := f.BaseName + "-b" + nsB, err := f.CreateNamespace(nsBName, map[string]string{ + "ns-name": nsBName, + }) + framework.ExpectNoError(err, "Error creating namespace %v: %v", nsBName, err) + + // Create Policy for the server that allows traffic only via client B or namespace B + ginkgo.By("Creating a network policy for the server which allows traffic from client-b or namespace-b.") + policy := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: "allow-ns-b-via-namespace-selector-or-client-b-via-pod-selector", + }, + Spec: networkingv1.NetworkPolicySpec{ + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod-name": podServerLabelSelector, + }, + }, + Ingress: []networkingv1.NetworkPolicyIngressRule{{ + From: []networkingv1.NetworkPolicyPeer{{ + PodSelector: &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod-name": "client-b", + }, + }, + }, { + NamespaceSelector: &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "ns-name": nsBName, + }, + }, + }}, + }}, + }, + } + + policy, err = f.ClientSet.NetworkingV1().NetworkPolicies(nsA.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) + framework.ExpectNoError(err, "Error creating Network Policy %v: %v", policy.ObjectMeta.Name, err) + defer cleanupNetworkPolicy(f, policy) + + testCanConnect(f, nsB, "client-a", service, 80) + testCanConnect(f, nsA, "client-b", service, 80) + testCannotConnect(f, nsA, "client-c", service, 80) + }) + + ginkgo.It("should enforce policy based on PodSelector and NamespaceSelector [Feature:NetworkPolicy]", func() { + nsA := f.Namespace + nsBName := f.BaseName + "-b" + nsB, err := f.CreateNamespace(nsBName, map[string]string{ + "ns-name": nsBName, + }) + framework.ExpectNoError(err, "Error creating namespace %v: %v", nsBName, err) + + // Create Policy for the server that allows traffic only via client-b in namespace B + ginkgo.By("Creating a network policy for the server which allows traffic from client-b in namespace-b.") + policy := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: "allow-client-b-in-ns-b-via-ns-selector-and-pod-selector", + }, + Spec: networkingv1.NetworkPolicySpec{ + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod-name": podServerLabelSelector, + }, + }, + Ingress: []networkingv1.NetworkPolicyIngressRule{{ + From: []networkingv1.NetworkPolicyPeer{{ + PodSelector: &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod-name": "client-b", + }, + }, + NamespaceSelector: &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "ns-name": nsBName, + }, + }, + }}, + }}, + }, + } + + policy, err = f.ClientSet.NetworkingV1().NetworkPolicies(nsA.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) + framework.ExpectNoError(err, "Error creating Network Policy %v: %v", policy.ObjectMeta.Name, err) + defer cleanupNetworkPolicy(f, policy) + + testCannotConnect(f, nsB, "client-a", service, 80) + testCannotConnect(f, nsA, "client-b", service, 80) + testCanConnect(f, nsB, "client-b", service, 80) + }) + + ginkgo.It("should enforce policy to allow traffic only from a pod in a different namespace based on PodSelector and NamespaceSelector [Feature:NetworkPolicy]", func() { + nsA := f.Namespace + nsBName := f.BaseName + "-b" + nsB, err := f.CreateNamespace(nsBName, map[string]string{ + "ns-name": nsBName, + }) + framework.ExpectNoError(err, "Error occurred while creating namespace-b.") + + // Wait for Server in namespaces-a to be ready + framework.Logf("Waiting for server to come up.") + err = e2epod.WaitForPodRunningInNamespace(f.ClientSet, podServer) + framework.ExpectNoError(err, "Error occurred while waiting for pod status in namespace: Running.") + + // Before application of the policy, all communication should be successful. + ginkgo.By("Creating client-a, in server's namespace, which should be able to contact the server.", func() { + testCanConnect(f, nsA, "client-a", service, 80) + }) + ginkgo.By("Creating client-b, in server's namespace, which should be able to contact the server.", func() { + testCanConnect(f, nsA, "client-b", service, 80) + }) + ginkgo.By("Creating client-a, not in server's namespace, which should be able to contact the server.", func() { + testCanConnect(f, nsB, "client-a", service, 80) + }) + ginkgo.By("Creating client-b, not in server's namespace, which should be able to contact the server.", func() { + testCanConnect(f, nsB, "client-b", service, 80) + }) + + ginkgo.By("Creating a network policy for the server which allows traffic only from client-a in namespace-b.") + policy := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: nsA.Name, + Name: "allow-ns-b-client-a-via-namespace-pod-selector", + }, + Spec: networkingv1.NetworkPolicySpec{ + // Apply this policy to the Server + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod-name": podServerLabelSelector, + }, + }, + // Allow traffic only from client-a in namespace-b + Ingress: []networkingv1.NetworkPolicyIngressRule{{ + From: []networkingv1.NetworkPolicyPeer{{ + NamespaceSelector: &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "ns-name": nsBName, + }, + }, + PodSelector: &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod-name": "client-a", + }, + }, + }}, + }}, + }, + } + + policy, err = f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) + framework.ExpectNoError(err, "Error occurred while creating policy: policy.") + defer cleanupNetworkPolicy(f, policy) + + ginkgo.By("Creating client-a, in server's namespace, which should not be able to contact the server.", func() { + testCannotConnect(f, nsA, "client-a", service, 80) + }) + ginkgo.By("Creating client-b, in server's namespace, which should not be able to contact the server.", func() { + testCannotConnect(f, nsA, "client-b", service, 80) + }) + ginkgo.By("Creating client-a, not in server's namespace, which should be able to contact the server.", func() { + testCanConnect(f, nsB, "client-a", service, 80) + }) + ginkgo.By("Creating client-b, not in server's namespace, which should not be able to contact the server.", func() { + testCannotConnect(f, nsB, "client-b", service, 80) + }) + }) + + ginkgo.It("should enforce policy based on Ports [Feature:NetworkPolicy]", func() { + ginkgo.By("Creating a network policy for the Service which allows traffic only to one port.") + policy := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: "allow-ingress-on-port-81", + }, + Spec: networkingv1.NetworkPolicySpec{ + // Apply to server + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod-name": podServerLabelSelector, + }, + }, + // Allow traffic only to one port. + Ingress: []networkingv1.NetworkPolicyIngressRule{{ + Ports: []networkingv1.NetworkPolicyPort{{ + Port: &intstr.IntOrString{IntVal: 81}, + }}, + }}, + }, + } + policy, err := f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) + framework.ExpectNoError(err) + defer cleanupNetworkPolicy(f, policy) + + ginkgo.By("Testing pods can connect only to the port allowed by the policy.") + testCannotConnect(f, f.Namespace, "client-a", service, 80) + testCanConnect(f, f.Namespace, "client-b", service, 81) + }) + + ginkgo.It("should enforce multiple, stacked policies with overlapping podSelectors [Feature:NetworkPolicy]", func() { + ginkgo.By("Creating a network policy for the Service which allows traffic only to one port.") + policy := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: "allow-ingress-on-port-80", + }, + Spec: networkingv1.NetworkPolicySpec{ + // Apply to server + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod-name": podServerLabelSelector, + }, + }, + // Allow traffic only to one port. + Ingress: []networkingv1.NetworkPolicyIngressRule{{ + Ports: []networkingv1.NetworkPolicyPort{{ + Port: &intstr.IntOrString{IntVal: 80}, + }}, + }}, + }, + } + policy, err := f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) + framework.ExpectNoError(err) + defer cleanupNetworkPolicy(f, policy) + + ginkgo.By("Creating a network policy for the Service which allows traffic only to another port.") + policy2 := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: "allow-ingress-on-port-81", + }, + Spec: networkingv1.NetworkPolicySpec{ + // Apply to server + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod-name": podServerLabelSelector, + }, + }, + // Allow traffic only to one port. + Ingress: []networkingv1.NetworkPolicyIngressRule{{ + Ports: []networkingv1.NetworkPolicyPort{{ + Port: &intstr.IntOrString{IntVal: 81}, + }}, + }}, + }, + } + policy2, err = f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policy2, metav1.CreateOptions{}) + framework.ExpectNoError(err) + defer cleanupNetworkPolicy(f, policy2) + + ginkgo.By("Testing pods can connect to both ports when both policies are present.") + testCanConnect(f, f.Namespace, "client-a", service, 80) + testCanConnect(f, f.Namespace, "client-b", service, 81) + }) + + ginkgo.It("should support allow-all policy [Feature:NetworkPolicy]", func() { + ginkgo.By("Creating a network policy which allows all traffic.") + policy := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: "allow-all", + }, + Spec: networkingv1.NetworkPolicySpec{ + // Allow all traffic + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{}, + }, + Ingress: []networkingv1.NetworkPolicyIngressRule{{}}, + }, + } + policy, err := f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) + framework.ExpectNoError(err) + defer cleanupNetworkPolicy(f, policy) + + ginkgo.By("Testing pods can connect to both ports when an 'allow-all' policy is present.") + testCanConnect(f, f.Namespace, "client-a", service, 80) + testCanConnect(f, f.Namespace, "client-b", service, 81) + }) + + ginkgo.It("should allow ingress access on one named port [Feature:NetworkPolicy]", func() { + policy := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: "allow-client-a-via-named-port-ingress-rule", + }, + Spec: networkingv1.NetworkPolicySpec{ + // Apply this policy to the Server + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod-name": podServerLabelSelector, + }, + }, + // Allow traffic to only one named port: "serve-80". + Ingress: []networkingv1.NetworkPolicyIngressRule{{ + Ports: []networkingv1.NetworkPolicyPort{{ + Port: &intstr.IntOrString{Type: intstr.String, StrVal: "serve-80"}, + }}, + }}, + }, + } + + policy, err := f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) + framework.ExpectNoError(err) + defer cleanupNetworkPolicy(f, policy) + + ginkgo.By("Creating client-a which should be able to contact the server.", func() { + testCanConnect(f, f.Namespace, "client-a", service, 80) + }) + ginkgo.By("Creating client-b which should not be able to contact the server on port 81.", func() { + testCannotConnect(f, f.Namespace, "client-b", service, 81) + }) + }) + + ginkgo.It("should allow ingress access from namespace on one named port [Feature:NetworkPolicy]", func() { + nsBName := f.BaseName + "-b" + nsB, err := f.CreateNamespace(nsBName, map[string]string{ + "ns-name": nsBName, + }) + framework.ExpectNoError(err, "Error creating namespace %v: %v", nsBName, err) + + const allowedPort = 80 + policy := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: "allow-client-in-ns-b-via-named-port-ingress-rule", + }, + Spec: networkingv1.NetworkPolicySpec{ + // Apply this policy to the Server + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod-name": podServerLabelSelector, + }, + }, + // Allow traffic to only one named port: "serve-80" from namespace-b. + Ingress: []networkingv1.NetworkPolicyIngressRule{{ + From: []networkingv1.NetworkPolicyPeer{{ + NamespaceSelector: &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "ns-name": nsBName, + }, + }, + }}, + Ports: []networkingv1.NetworkPolicyPort{{ + Port: &intstr.IntOrString{Type: intstr.String, StrVal: "serve-80"}, + }}, + }}, + }, + } + + policy, err = f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) + framework.ExpectNoError(err, "Error creating Network Policy %v: %v", policy.ObjectMeta.Name, err) + defer cleanupNetworkPolicy(f, policy) + + testCannotConnect(f, f.Namespace, "client-a", service, allowedPort) + testCanConnect(f, nsB, "client-b", service, allowedPort) + }) + + ginkgo.It("should allow egress access on one named port [Feature:NetworkPolicy]", func() { + clientPodName := "client-a" + policy := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: "allow-client-a-via-named-port-egress-rule", + }, + Spec: networkingv1.NetworkPolicySpec{ + // Apply this policy to client-a + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod-name": clientPodName, + }, + }, + // Allow traffic to only one named port: "serve-80". + Egress: []networkingv1.NetworkPolicyEgressRule{{ + Ports: []networkingv1.NetworkPolicyPort{ + { + Port: &intstr.IntOrString{Type: intstr.String, StrVal: "serve-80"}, + }, + }, + }}, + }, + } + + policy, err := f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) + framework.ExpectNoError(err) + defer cleanupNetworkPolicy(f, policy) + + ginkgo.By("Creating client-a which should be able to contact the server.", func() { + testCanConnect(f, f.Namespace, clientPodName, service, 80) + }) + ginkgo.By("Creating client-a which should not be able to contact the server on port 81.", func() { + testCannotConnect(f, f.Namespace, clientPodName, service, 81) + }) + }) + + ginkgo.It("should enforce updated policy [Feature:NetworkPolicy]", func() { + const ( + clientAAllowedPort = 80 + clientANotAllowedPort = 81 + ) + ginkgo.By("Creating a network policy for the Service which allows traffic from pod at a port") + policy := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: "allow-ingress", + }, + Spec: networkingv1.NetworkPolicySpec{ + // Apply to server + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod-name": podServerLabelSelector, + }, + }, + // Allow traffic only to one port. + Ingress: []networkingv1.NetworkPolicyIngressRule{{ + From: []networkingv1.NetworkPolicyPeer{{ + PodSelector: &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod-name": "client-a", + }, + }, + }}, + Ports: []networkingv1.NetworkPolicyPort{{ + Port: &intstr.IntOrString{IntVal: clientAAllowedPort}, + }}, + }}, + }, + } + policy, err := f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) + framework.ExpectNoError(err, "Error creating Network Policy %v: %v", policy.ObjectMeta.Name, err) + + testCanConnect(f, f.Namespace, "client-a", service, clientAAllowedPort) + e2epod.WaitForPodNotFoundInNamespace(f.ClientSet, "client-a", f.Namespace.Name, framework.PodDeleteTimeout) + framework.ExpectNoError(err, "Expected pod to be not found.") + + testCannotConnect(f, f.Namespace, "client-b", service, clientAAllowedPort) + e2epod.WaitForPodNotFoundInNamespace(f.ClientSet, "client-b", f.Namespace.Name, framework.PodDeleteTimeout) + framework.ExpectNoError(err, "Expected pod to be not found.") + + testCannotConnect(f, f.Namespace, "client-a", service, clientANotAllowedPort) + e2epod.WaitForPodNotFoundInNamespace(f.ClientSet, "client-a", f.Namespace.Name, framework.PodDeleteTimeout) + framework.ExpectNoError(err, "Expected pod to be not found.") + + const ( + clientBAllowedPort = 81 + clientBNotAllowedPort = 80 + ) + ginkgo.By("Updating a network policy for the Service which allows traffic from another pod at another port.") + policy = &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: "allow-ingress", + }, + Spec: networkingv1.NetworkPolicySpec{ + // Apply to server + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod-name": podServerLabelSelector, + }, + }, + // Allow traffic only to one port. + Ingress: []networkingv1.NetworkPolicyIngressRule{{ + From: []networkingv1.NetworkPolicyPeer{{ + PodSelector: &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod-name": "client-b", + }, + }, + }}, + Ports: []networkingv1.NetworkPolicyPort{{ + Port: &intstr.IntOrString{IntVal: clientBAllowedPort}, + }}, + }}, + }, + } + policy, err = f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Update(context.TODO(), policy, metav1.UpdateOptions{}) + framework.ExpectNoError(err, "Error updating Network Policy %v: %v", policy.ObjectMeta.Name, err) + defer cleanupNetworkPolicy(f, policy) + + testCannotConnect(f, f.Namespace, "client-b", service, clientBNotAllowedPort) + e2epod.WaitForPodNotFoundInNamespace(f.ClientSet, "client-b", f.Namespace.Name, framework.PodDeleteTimeout) + framework.ExpectNoError(err, "Expected pod to be not found.") + + testCannotConnect(f, f.Namespace, "client-a", service, clientBNotAllowedPort) + testCanConnect(f, f.Namespace, "client-b", service, clientBAllowedPort) + }) + + ginkgo.It("should allow ingress access from updated namespace [Feature:NetworkPolicy]", func() { + nsA := f.Namespace + nsBName := f.BaseName + "-b" + newNsBName := nsBName + "-updated" + nsB, err := f.CreateNamespace(nsBName, map[string]string{ + "ns-name": nsBName, + }) + framework.ExpectNoError(err, "Error creating namespace %v: %v", nsBName, err) + + const allowedPort = 80 + // Create Policy for that service that allows traffic only via namespace B + ginkgo.By("Creating a network policy for the server which allows traffic from namespace-b.") + policy := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: "allow-ns-b-via-namespace-selector", + }, + Spec: networkingv1.NetworkPolicySpec{ + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod-name": podServerLabelSelector, + }, + }, + Ingress: []networkingv1.NetworkPolicyIngressRule{{ + From: []networkingv1.NetworkPolicyPeer{{ + NamespaceSelector: &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "ns-name": newNsBName, + }, + }, + }}, + }}, + }, + } + + policy, err = f.ClientSet.NetworkingV1().NetworkPolicies(nsA.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) + framework.ExpectNoError(err, "Error creating Network Policy %v: %v", policy.ObjectMeta.Name, err) + defer cleanupNetworkPolicy(f, policy) + + testCannotConnect(f, nsB, "client-a", service, allowedPort) + + nsB, err = f.ClientSet.CoreV1().Namespaces().Get(context.TODO(), nsB.Name, metav1.GetOptions{}) + framework.ExpectNoError(err, "Error getting Namespace %v: %v", nsB.ObjectMeta.Name, err) + + nsB.ObjectMeta.Labels["ns-name"] = newNsBName + nsB, err = f.ClientSet.CoreV1().Namespaces().Update(context.TODO(), nsB, metav1.UpdateOptions{}) + framework.ExpectNoError(err, "Error updating Namespace %v: %v", nsB.ObjectMeta.Name, err) + + testCanConnect(f, nsB, "client-b", service, allowedPort) + }) + + ginkgo.It("should allow ingress access from updated pod [Feature:NetworkPolicy]", func() { + const allowedPort = 80 + ginkgo.By("Creating a network policy for the server which allows traffic from client-a-updated.") + policy := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: "allow-pod-b-via-pod-selector", + }, + Spec: networkingv1.NetworkPolicySpec{ + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod-name": podServerLabelSelector, + }, + }, + Ingress: []networkingv1.NetworkPolicyIngressRule{{ + From: []networkingv1.NetworkPolicyPeer{{ + PodSelector: &metav1.LabelSelector{ + MatchExpressions: []metav1.LabelSelectorRequirement{{ + Key: "pod-name", + Operator: metav1.LabelSelectorOpDoesNotExist, + }}, + }, + }}, + }}, + }, + } + + policy, err := f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) + framework.ExpectNoError(err, "Error creating Network Policy %v: %v", policy.ObjectMeta.Name, err) + defer cleanupNetworkPolicy(f, policy) + + ginkgo.By(fmt.Sprintf("Creating client pod %s that should not be able to connect to %s.", "client-a", service.Name)) + // Specify RestartPolicy to OnFailure so we can check the client pod fails in the beginning and succeeds + // after updating its label, otherwise it would not restart after the first failure. + podClient := createNetworkClientPodWithRestartPolicy(f, f.Namespace, "client-a", service, allowedPort, v1.ProtocolTCP, v1.RestartPolicyOnFailure) + defer func() { + ginkgo.By(fmt.Sprintf("Cleaning up the pod %s", podClient.Name)) + if err := f.ClientSet.CoreV1().Pods(f.Namespace.Name).Delete(context.TODO(), podClient.Name, metav1.DeleteOptions{}); err != nil { + framework.Failf("unable to cleanup pod %v: %v", podClient.Name, err) + } + }() + // Check Container exit code as restartable Pod's Phase will be Running even when container fails. + checkNoConnectivityByExitCode(f, f.Namespace, podClient, service) + + ginkgo.By(fmt.Sprintf("Updating client pod %s that should successfully connect to %s.", podClient.Name, service.Name)) + podClient = updatePodLabel(f, f.Namespace, podClient.Name, "replace", "/metadata/labels", map[string]string{}) + checkConnectivity(f, f.Namespace, podClient, service) + }) + + ginkgo.It("should deny ingress access to updated pod [Feature:NetworkPolicy]", func() { + const allowedPort = 80 + ginkgo.By("Creating a network policy for the server which denies all traffic.") + policy := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: "deny-ingress-via-isolated-label-selector", + }, + Spec: networkingv1.NetworkPolicySpec{ + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod-name": podServerLabelSelector, + }, + MatchExpressions: []metav1.LabelSelectorRequirement{{ + Key: "isolated", + Operator: metav1.LabelSelectorOpExists, + }}, + }, + PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeIngress}, + Ingress: []networkingv1.NetworkPolicyIngressRule{}, + }, + } + + policy, err := f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) + framework.ExpectNoError(err, "Error creating Network Policy %v: %v", policy.ObjectMeta.Name, err) + defer cleanupNetworkPolicy(f, policy) + + // Client can connect to service when the network policy doesn't apply to the server pod. + testCanConnect(f, f.Namespace, "client-a", service, allowedPort) + + // Client cannot connect to service after updating the server pod's labels to match the network policy's selector. + ginkgo.By(fmt.Sprintf("Updating server pod %s to be selected by network policy %s.", podServer.Name, policy.Name)) + updatePodLabel(f, f.Namespace, podServer.Name, "add", "/metadata/labels/isolated", nil) + testCannotConnect(f, f.Namespace, "client-a", service, allowedPort) + }) + + ginkgo.It("should work with Ingress,Egress specified together [Feature:NetworkPolicy]", func() { + const allowedPort = 80 + const notAllowedPort = 81 + + nsBName := f.BaseName + "-b" + nsB, err := f.CreateNamespace(nsBName, map[string]string{ + "ns-name": nsBName, + }) + framework.ExpectNoError(err, "Error occurred while creating namespace-b.") + + podB, serviceB := createServerPodAndService(f, nsB, "pod-b", []protocolPort{{allowedPort, v1.ProtocolTCP}, {notAllowedPort, v1.ProtocolTCP}}) + defer cleanupServerPodAndService(f, podB, serviceB) + + // Wait for Server with Service in NS-B to be ready + framework.Logf("Waiting for servers to be ready.") + err = e2epod.WaitTimeoutForPodReadyInNamespace(f.ClientSet, podB.Name, nsB.Name, framework.PodStartTimeout) + framework.ExpectNoError(err, "Error occurred while waiting for pod status in namespace: Ready.") + + ginkgo.By("Create a network policy for the server which denies both Ingress and Egress traffic.") + policy := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: "ingress-egress-rule", + }, + Spec: networkingv1.NetworkPolicySpec{ + PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeIngress, networkingv1.PolicyTypeEgress}, + Ingress: []networkingv1.NetworkPolicyIngressRule{{ + From: []networkingv1.NetworkPolicyPeer{{ + NamespaceSelector: &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "ns-name": nsBName, + }, + }, + }}, + Ports: []networkingv1.NetworkPolicyPort{{ + Port: &intstr.IntOrString{IntVal: allowedPort}, + }}, + }}, + Egress: []networkingv1.NetworkPolicyEgressRule{ + { + To: []networkingv1.NetworkPolicyPeer{ + { + NamespaceSelector: &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "ns-name": nsBName, + }, + }, + }, + }, + Ports: []networkingv1.NetworkPolicyPort{{ + Port: &intstr.IntOrString{IntVal: allowedPort}, + }}, + }, + }, + }, + } + + policy, err = f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) + framework.ExpectNoError(err, "Error creating Network Policy %v: %v", policy.ObjectMeta.Name, err) + defer cleanupNetworkPolicy(f, policy) + + ginkgo.By("client-a should be able to communicate with server port 80 in namespace-b", func() { + testCanConnect(f, f.Namespace, "client-a", serviceB, allowedPort) + }) + + ginkgo.By("client-b should be able to communicate with server port 80 in namespace-a", func() { + testCanConnect(f, nsB, "client-b", service, allowedPort) + }) + + ginkgo.By("client-a should not be able to communicate with server port 81 in namespace-b", func() { + testCannotConnect(f, f.Namespace, "client-a", serviceB, notAllowedPort) + }) + + ginkgo.By("client-b should not be able to communicate with server port 81 in namespace-a", func() { + testCannotConnect(f, nsB, "client-b", service, notAllowedPort) + }) + }) + + ginkgo.It("should enforce egress policy allowing traffic to a server in a different namespace based on PodSelector and NamespaceSelector [Feature:NetworkPolicy]", func() { + var nsBserviceA, nsBserviceB *v1.Service + var nsBpodServerA, nsBpodServerB *v1.Pod + + nsA := f.Namespace + nsBName := f.BaseName + "-b" + nsB, err := f.CreateNamespace(nsBName, map[string]string{ + "ns-name": nsBName, + }) + framework.ExpectNoError(err, "Error occurred while creating namespace-b.") + + // Creating pods and services in namespace-b + nsBpodServerA, nsBserviceA = createServerPodAndService(f, nsB, "ns-b-server-a", []protocolPort{{80, v1.ProtocolTCP}}) + defer cleanupServerPodAndService(f, nsBpodServerA, nsBserviceA) + nsBpodServerB, nsBserviceB = createServerPodAndService(f, nsB, "ns-b-server-b", []protocolPort{{80, v1.ProtocolTCP}}) + defer cleanupServerPodAndService(f, nsBpodServerB, nsBserviceB) + + // Wait for Server with Service in NS-A to be ready + framework.Logf("Waiting for servers to be ready.") + err = e2epod.WaitTimeoutForPodReadyInNamespace(f.ClientSet, podServer.Name, podServer.Namespace, framework.PodStartTimeout) + framework.ExpectNoError(err, "Error occurred while waiting for pod status in namespace: Ready.") + + // Wait for Servers with Services in NS-B to be ready + err = e2epod.WaitTimeoutForPodReadyInNamespace(f.ClientSet, nsBpodServerA.Name, nsBpodServerA.Namespace, framework.PodStartTimeout) + framework.ExpectNoError(err, "Error occurred while waiting for pod status in namespace: Ready.") + + err = e2epod.WaitTimeoutForPodReadyInNamespace(f.ClientSet, nsBpodServerB.Name, nsBpodServerB.Namespace, framework.PodStartTimeout) + framework.ExpectNoError(err, "Error occurred while waiting for pod status in namespace: Ready.") + + ginkgo.By("Creating a network policy for the server which allows traffic only to a server in different namespace.") + policyAllowToServerInNSB := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: nsA.Name, + Name: "allow-to-ns-b-server-a-via-namespace-selector", + }, + Spec: networkingv1.NetworkPolicySpec{ + // Apply this policy to the client + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod-name": "client-a", + }, + }, + PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeEgress}, + // Allow traffic only to server-a in namespace-b + Egress: []networkingv1.NetworkPolicyEgressRule{ + { + To: []networkingv1.NetworkPolicyPeer{ + { + NamespaceSelector: &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "ns-name": nsBName, + }, + }, + PodSelector: &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod-name": nsBpodServerA.ObjectMeta.Labels["pod-name"], + }, + }, + }, + }, + }, + }, + }, + } + + policyAllowToServerInNSB, err = f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policyAllowToServerInNSB, metav1.CreateOptions{}) + framework.ExpectNoError(err, "Error occurred while creating policy: policyAllowToServerInNSB.") + defer cleanupNetworkPolicy(f, policyAllowToServerInNSB) + + ginkgo.By("Creating client-a, in 'namespace-a', which should be able to contact the server-a in namespace-b.", func() { + testCanConnect(f, nsA, "client-a", nsBserviceA, 80) + }) + ginkgo.By("Creating client-a, in 'namespace-a', which should not be able to contact the server-b in namespace-b.", func() { + testCannotConnect(f, nsA, "client-a", nsBserviceB, 80) + }) + ginkgo.By("Creating client-a, in 'namespace-a', which should not be able to contact the server in namespace-a.", func() { + testCannotConnect(f, nsA, "client-a", service, 80) + }) + }) + + ginkgo.It("should enforce multiple ingress policies with ingress allow-all policy taking precedence [Feature:NetworkPolicy]", func() { + ginkgo.By("Creating a network policy for the server which allows traffic only from client-b.") + policyAllowOnlyFromClientB := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: f.Namespace.Name, + Name: "allow-from-client-b-pod-selector", + }, + Spec: networkingv1.NetworkPolicySpec{ + // Apply this policy to the Server + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod-name": podServerLabelSelector, + }, + }, + PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeIngress}, + // Allow traffic only from "client-b" + Ingress: []networkingv1.NetworkPolicyIngressRule{{ + From: []networkingv1.NetworkPolicyPeer{{ + PodSelector: &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod-name": "client-b", + }, + }, + }}, + }}, + }, + } + + policyAllowOnlyFromClientB, err := f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policyAllowOnlyFromClientB, metav1.CreateOptions{}) + framework.ExpectNoError(err, "Error occurred while creating policy: policyAllowOnlyFromClientB.") + defer cleanupNetworkPolicy(f, policyAllowOnlyFromClientB) + + ginkgo.By("Creating client-a which should not be able to contact the server.", func() { + testCannotConnect(f, f.Namespace, "client-a", service, 80) + }) + ginkgo.By("Creating client-b which should be able to contact the server.", func() { + testCanConnect(f, f.Namespace, "client-b", service, 80) + }) + + ginkgo.By("Creating a network policy for the server which allows traffic from all clients.") + policyIngressAllowAll := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + // Namespace: f.Namespace.Name, + Name: "allow-all", + }, + Spec: networkingv1.NetworkPolicySpec{ + // Apply this policy to all pods + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{}, + }, + PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeIngress}, + Ingress: []networkingv1.NetworkPolicyIngressRule{{}}, + }, + } + + policyIngressAllowAll, err = f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policyIngressAllowAll, metav1.CreateOptions{}) + framework.ExpectNoError(err, "Error occurred while creating policy: policyIngressAllowAll.") + defer cleanupNetworkPolicy(f, policyIngressAllowAll) + + ginkgo.By("Creating client-a which should be able to contact the server.", func() { + testCanConnect(f, f.Namespace, "client-a", service, 80) + }) + ginkgo.By("Creating client-b which should be able to contact the server.", func() { + testCanConnect(f, f.Namespace, "client-b", service, 80) + }) + }) + + ginkgo.It("should enforce multiple egress policies with egress allow-all policy taking precedence [Feature:NetworkPolicy]", func() { + podServerB, serviceB := createServerPodAndService(f, f.Namespace, "server-b", []protocolPort{{80, v1.ProtocolTCP}}) + defer cleanupServerPodAndService(f, podServerB, serviceB) + + ginkgo.By("Waiting for pod ready", func() { + err := e2epod.WaitTimeoutForPodReadyInNamespace(f.ClientSet, podServerB.Name, f.Namespace.Name, framework.PodStartTimeout) + framework.ExpectNoError(err, "Error occurred while waiting for pod type: Ready.") + }) + + ginkgo.By("Creating client-a which should be able to contact the server before applying policy.", func() { + testCanConnect(f, f.Namespace, "client-a", serviceB, 80) + }) + + ginkgo.By("Creating a network policy for the server which allows traffic only to server-a.") + policyAllowOnlyToServerA := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: f.Namespace.Name, + Name: "allow-to-server-a-pod-selector", + }, + Spec: networkingv1.NetworkPolicySpec{ + // Apply this policy to the "client-a" + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod-name": "client-a", + }, + }, + PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeEgress}, + // Allow traffic only to "server-a" + Egress: []networkingv1.NetworkPolicyEgressRule{ + { + To: []networkingv1.NetworkPolicyPeer{ + { + PodSelector: &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod-name": podServerLabelSelector, + }, + }, + }, + }, + }, + }, + }, + } + policyAllowOnlyToServerA, err := f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policyAllowOnlyToServerA, metav1.CreateOptions{}) + framework.ExpectNoError(err, "Error occurred while creating policy: policyAllowOnlyToServerA.") + defer cleanupNetworkPolicy(f, policyAllowOnlyToServerA) + + ginkgo.By("Creating client-a which should not be able to contact the server-b.", func() { + testCannotConnect(f, f.Namespace, "client-a", serviceB, 80) + }) + ginkgo.By("Creating client-a which should be able to contact the server.", func() { + testCanConnect(f, f.Namespace, "client-a", service, 80) + }) + + ginkgo.By("Creating a network policy which allows traffic to all pods.") + policyEgressAllowAll := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: "allow-all", + }, + Spec: networkingv1.NetworkPolicySpec{ + // Apply this policy to all pods + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{}, + }, + PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeEgress}, + Egress: []networkingv1.NetworkPolicyEgressRule{{}}, + }, + } + + policyEgressAllowAll, err = f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policyEgressAllowAll, metav1.CreateOptions{}) + framework.ExpectNoError(err, "Error occurred while creating policy: policyEgressAllowAll.") + defer cleanupNetworkPolicy(f, policyEgressAllowAll) + + ginkgo.By("Creating client-a which should be able to contact the server-b.", func() { + testCanConnect(f, f.Namespace, "client-a", serviceB, 80) + }) + ginkgo.By("Creating client-a which should be able to contact the server-a.", func() { + testCanConnect(f, f.Namespace, "client-a", service, 80) + }) + }) + + ginkgo.It("should stop enforcing policies after they are deleted [Feature:NetworkPolicy]", func() { + ginkgo.By("Creating a network policy for the server which denies all traffic.") + policyDenyAll := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: f.Namespace.Name, + Name: "deny-all", + }, + Spec: networkingv1.NetworkPolicySpec{ + // Deny all traffic + PodSelector: metav1.LabelSelector{}, + PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeIngress}, + Ingress: []networkingv1.NetworkPolicyIngressRule{}, + }, + } + + policyDenyAll, err := f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policyDenyAll, metav1.CreateOptions{}) + framework.ExpectNoError(err, "Error occurred while creating policy: policyDenyAll.") + + ginkgo.By("Creating client-a which should not be able to contact the server.", func() { + testCannotConnect(f, f.Namespace, "client-a", service, 80) + }) + + ginkgo.By("Creating a network policy for the server which allows traffic only from client-a.") + policyAllowFromClientA := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: f.Namespace.Name, + Name: "allow-from-client-a-pod-selector", + }, + Spec: networkingv1.NetworkPolicySpec{ + // Apply this policy to the Server + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod-name": podServerLabelSelector, + }, + }, + PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeIngress}, + // Allow traffic from "client-a" + Ingress: []networkingv1.NetworkPolicyIngressRule{{ + From: []networkingv1.NetworkPolicyPeer{{ + PodSelector: &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod-name": "client-a", + }, + }, + }}, + }}, + }, + } + + policyAllowFromClientA, err = f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policyAllowFromClientA, metav1.CreateOptions{}) + framework.ExpectNoError(err, "Error occurred while creating policy: policyAllowFromClientA.") + + ginkgo.By("Creating client-a which should be able to contact the server.", func() { + testCanConnect(f, f.Namespace, "client-a", service, 80) + }) + + ginkgo.By("Deleting the network policy allowing traffic from client-a") + cleanupNetworkPolicy(f, policyAllowFromClientA) + + ginkgo.By("Creating client-a which should not be able to contact the server.", func() { + testCannotConnect(f, f.Namespace, "client-a", service, 80) + }) + + ginkgo.By("Deleting the network policy denying all traffic.") + cleanupNetworkPolicy(f, policyDenyAll) + + ginkgo.By("Creating client-a which should be able to contact the server.", func() { + testCanConnect(f, f.Namespace, "client-a", service, 80) + }) + }) + + ginkgo.It("should allow egress access to server in CIDR block [Feature:NetworkPolicy]", func() { + var serviceB *v1.Service + var podServerB *v1.Pod + + // Getting podServer's status to get podServer's IP, to create the CIDR + podServerStatus, err := f.ClientSet.CoreV1().Pods(f.Namespace.Name).Get(context.TODO(), podServer.Name, metav1.GetOptions{}) + if err != nil { + framework.ExpectNoError(err, "Error occurred while getting pod status.") + } + hostMask := 32 + if utilnet.IsIPv6String(podServerStatus.Status.PodIP) { + hostMask = 128 + } + podServerCIDR := fmt.Sprintf("%s/%d", podServerStatus.Status.PodIP, hostMask) + + // Creating pod-b and service-b + podServerB, serviceB = createServerPodAndService(f, f.Namespace, "pod-b", []protocolPort{{80, v1.ProtocolTCP}}) + ginkgo.By("Waiting for pod-b to be ready", func() { + err := e2epod.WaitTimeoutForPodReadyInNamespace(f.ClientSet, podServerB.Name, f.Namespace.Name, framework.PodStartTimeout) + framework.ExpectNoError(err, "Error occurred while waiting for pod type: Ready.") + }) + defer cleanupServerPodAndService(f, podServerB, serviceB) + + // Wait for podServerB with serviceB to be ready + err = e2epod.WaitForPodRunningInNamespace(f.ClientSet, podServerB) + framework.ExpectNoError(err, "Error occurred while waiting for pod status in namespace: Running.") + + ginkgo.By("Creating client-a which should be able to contact the server-b.", func() { + testCanConnect(f, f.Namespace, "client-a", serviceB, 80) + }) + + policyAllowCIDR := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: f.Namespace.Name, + Name: "allow-client-a-via-cidr-egress-rule", + }, + Spec: networkingv1.NetworkPolicySpec{ + // Apply this policy to the Server + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod-name": "client-a", + }, + }, + PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeEgress}, + // Allow traffic to only one CIDR block. + Egress: []networkingv1.NetworkPolicyEgressRule{ + { + To: []networkingv1.NetworkPolicyPeer{ + { + IPBlock: &networkingv1.IPBlock{ + CIDR: podServerCIDR, + }, + }, + }, + }, + }, + }, + } + + policyAllowCIDR, err = f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policyAllowCIDR, metav1.CreateOptions{}) + framework.ExpectNoError(err, "Error occurred while creating policy: policyAllowCIDR.") + defer cleanupNetworkPolicy(f, policyAllowCIDR) + + ginkgo.By("Creating client-a which should not be able to contact the server-b.", func() { + testCannotConnect(f, f.Namespace, "client-a", serviceB, 80) + }) + ginkgo.By("Creating client-a which should be able to contact the server.", func() { + testCanConnect(f, f.Namespace, "client-a", service, 80) + }) + }) + + ginkgo.It("should enforce except clause while egress access to server in CIDR block [Feature:NetworkPolicy]", func() { + // Getting podServer's status to get podServer's IP, to create the CIDR with except clause + podServerStatus, err := f.ClientSet.CoreV1().Pods(f.Namespace.Name).Get(context.TODO(), podServer.Name, metav1.GetOptions{}) + if err != nil { + framework.ExpectNoError(err, "Error occurred while getting pod status.") + } + + allowMask := 24 + hostMask := 32 + if utilnet.IsIPv6String(podServerStatus.Status.PodIP) { + allowMask = 64 + hostMask = 128 + } + _, podServerAllowSubnet, err := net.ParseCIDR(fmt.Sprintf("%s/%d", podServerStatus.Status.PodIP, allowMask)) + framework.ExpectNoError(err, "could not parse allow subnet") + podServerAllowCIDR := podServerAllowSubnet.String() + + // Exclude podServer's IP with an Except clause + podServerExceptList := []string{fmt.Sprintf("%s/%d", podServerStatus.Status.PodIP, hostMask)} + + // client-a can connect to server prior to applying the NetworkPolicy + ginkgo.By("Creating client-a which should be able to contact the server.", func() { + testCanConnect(f, f.Namespace, "client-a", service, 80) + }) + + policyAllowCIDRWithExcept := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: f.Namespace.Name, + Name: "deny-client-a-via-except-cidr-egress-rule", + }, + Spec: networkingv1.NetworkPolicySpec{ + // Apply this policy to the client. + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod-name": "client-a", + }, + }, + PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeEgress}, + // Allow traffic to only one CIDR block except subnet which includes Server. + Egress: []networkingv1.NetworkPolicyEgressRule{ + { + To: []networkingv1.NetworkPolicyPeer{ + { + IPBlock: &networkingv1.IPBlock{ + CIDR: podServerAllowCIDR, + Except: podServerExceptList, + }, + }, + }, + }, + }, + }, + } + + policyAllowCIDRWithExcept, err = f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policyAllowCIDRWithExcept, metav1.CreateOptions{}) + framework.ExpectNoError(err, "Error occurred while creating policy: policyAllowCIDRWithExcept.") + defer cleanupNetworkPolicy(f, policyAllowCIDRWithExcept) + + ginkgo.By("Creating client-a which should no longer be able to contact the server.", func() { + testCannotConnect(f, f.Namespace, "client-a", service, 80) + }) + }) + + ginkgo.It("should ensure an IP overlapping both IPBlock.CIDR and IPBlock.Except is allowed [Feature:NetworkPolicy]", func() { + // Getting podServer's status to get podServer's IP, to create the CIDR with except clause + podServerStatus, err := f.ClientSet.CoreV1().Pods(f.Namespace.Name).Get(context.TODO(), podServer.Name, metav1.GetOptions{}) + if err != nil { + framework.ExpectNoError(err, "Error occurred while getting pod status.") + } + + allowMask := 24 + hostMask := 32 + if utilnet.IsIPv6String(podServerStatus.Status.PodIP) { + allowMask = 64 + hostMask = 128 + } + _, podServerAllowSubnet, err := net.ParseCIDR(fmt.Sprintf("%s/%d", podServerStatus.Status.PodIP, allowMask)) + framework.ExpectNoError(err, "could not parse allow subnet") + podServerAllowCIDR := podServerAllowSubnet.String() + + // Exclude podServer's IP with an Except clause + podServerCIDR := fmt.Sprintf("%s/%d", podServerStatus.Status.PodIP, hostMask) + podServerExceptList := []string{podServerCIDR} + + // Create NetworkPolicy which blocks access to podServer with except clause. + policyAllowCIDRWithExceptServerPod := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: f.Namespace.Name, + Name: "deny-client-a-via-except-cidr-egress-rule", + }, + Spec: networkingv1.NetworkPolicySpec{ + // Apply this policy to the client. + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod-name": "client-a", + }, + }, + PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeEgress}, + // Allow traffic to only one CIDR block except subnet which includes Server. + Egress: []networkingv1.NetworkPolicyEgressRule{ + { + To: []networkingv1.NetworkPolicyPeer{ + { + IPBlock: &networkingv1.IPBlock{ + CIDR: podServerAllowCIDR, + Except: podServerExceptList, + }, + }, + }, + }, + }, + }, + } + + policyAllowCIDRWithExceptServerPodObj, err := f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policyAllowCIDRWithExceptServerPod, metav1.CreateOptions{}) + framework.ExpectNoError(err, "Error occurred while creating policy: policyAllowCIDRWithExceptServerPod.") + + ginkgo.By("Creating client-a which should not be able to contact the server.", func() { + testCannotConnect(f, f.Namespace, "client-a", service, 80) + }) + + // Create NetworkPolicy which allows access to the podServer using podServer's IP in allow CIDR. + policyAllowCIDRServerPod := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: f.Namespace.Name, + Name: "allow-client-a-via-cidr-egress-rule", + }, + Spec: networkingv1.NetworkPolicySpec{ + // Apply this policy to the client. + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod-name": "client-a", + }, + }, + PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeEgress}, + // Allow traffic to only one CIDR block which includes Server. + Egress: []networkingv1.NetworkPolicyEgressRule{ + { + To: []networkingv1.NetworkPolicyPeer{ + { + IPBlock: &networkingv1.IPBlock{ + CIDR: podServerCIDR, + }, + }, + }, + }, + }, + }, + } + + policyAllowCIDRServerPod, err = f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policyAllowCIDRServerPod, metav1.CreateOptions{}) + framework.ExpectNoError(err, "Error occurred while creating policy: policyAllowCIDRServerPod.") + defer cleanupNetworkPolicy(f, policyAllowCIDRServerPod) + + ginkgo.By("Creating client-a which should now be able to contact the server.", func() { + testCanConnect(f, f.Namespace, "client-a", service, 80) + }) + + ginkgo.By("Deleting the network policy with except podServer IP which disallows access to podServer.") + cleanupNetworkPolicy(f, policyAllowCIDRWithExceptServerPodObj) + + ginkgo.By("Creating client-a which should still be able to contact the server after deleting the network policy with except clause.", func() { + testCanConnect(f, f.Namespace, "client-a", service, 80) + }) + + // Recreate the NetworkPolicy which contains the podServer's IP in the except list. + policyAllowCIDRWithExceptServerPod, err = f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policyAllowCIDRWithExceptServerPod, metav1.CreateOptions{}) + framework.ExpectNoError(err, "Error occurred while creating policy: policyAllowCIDRWithExceptServerPod.") + defer cleanupNetworkPolicy(f, policyAllowCIDRWithExceptServerPod) + + ginkgo.By("Creating client-a which should still be able to contact the server after recreating the network policy with except clause.", func() { + testCanConnect(f, f.Namespace, "client-a", service, 80) + }) + }) + + ginkgo.It("should enforce policies to check ingress and egress policies can be controlled independently based on PodSelector [Feature:NetworkPolicy]", func() { + var serviceA, serviceB *v1.Service + var podA, podB *v1.Pod + var err error + + // Before applying policy, communication should be successful between pod-a and pod-b + podA, serviceA = createServerPodAndService(f, f.Namespace, "pod-a", []protocolPort{{80, v1.ProtocolTCP}}) + ginkgo.By("Waiting for pod-a to be ready", func() { + err := e2epod.WaitTimeoutForPodReadyInNamespace(f.ClientSet, podA.Name, f.Namespace.Name, framework.PodStartTimeout) + framework.ExpectNoError(err, "Error occurred while waiting for pod type: Ready.") + }) + ginkgo.By("Creating client pod-b which should be able to contact the server pod-a.", func() { + testCanConnect(f, f.Namespace, "pod-b", serviceA, 80) + }) + cleanupServerPodAndService(f, podA, serviceA) + + podB, serviceB = createServerPodAndService(f, f.Namespace, "pod-b", []protocolPort{{80, v1.ProtocolTCP}}) + ginkgo.By("Waiting for pod-b to be ready", func() { + err := e2epod.WaitTimeoutForPodReadyInNamespace(f.ClientSet, podB.Name, f.Namespace.Name, framework.PodStartTimeout) + framework.ExpectNoError(err, "Error occurred while waiting for pod type: Ready.") + }) + ginkgo.By("Creating client pod-a which should be able to contact the server pod-b.", func() { + testCanConnect(f, f.Namespace, "pod-a", serviceB, 80) + }) + + ginkgo.By("Creating a network policy for pod-a which allows Egress traffic to pod-b.") + policyAllowToPodB := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: f.Namespace.Name, + Name: "allow-pod-a-to-pod-b-using-pod-selector", + }, + Spec: networkingv1.NetworkPolicySpec{ + // Apply this policy on pod-a + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod-name": "pod-a", + }, + }, + PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeEgress}, + // Allow traffic to server on pod-b + Egress: []networkingv1.NetworkPolicyEgressRule{ + { + To: []networkingv1.NetworkPolicyPeer{ + { + PodSelector: &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod-name": "pod-b", + }, + }, + }, + }, + }, + }, + }, + } + + policyAllowToPodB, err = f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policyAllowToPodB, metav1.CreateOptions{}) + framework.ExpectNoError(err, "Error occurred while creating policy: policyAllowToPodB.") + defer cleanupNetworkPolicy(f, policyAllowToPodB) + + ginkgo.By("Creating a network policy for pod-a that denies traffic from pod-b.") + policyDenyFromPodB := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: f.Namespace.Name, + Name: "deny-pod-b-to-pod-a-pod-selector", + }, + Spec: networkingv1.NetworkPolicySpec{ + // Apply this policy on the server on pod-a + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod-name": "pod-a", + }, + }, + PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeIngress}, + // Deny traffic from all pods, including pod-b + Ingress: []networkingv1.NetworkPolicyIngressRule{}, + }, + } + + policyDenyFromPodB, err = f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policyDenyFromPodB, metav1.CreateOptions{}) + framework.ExpectNoError(err, "Error occurred while creating policy: policyDenyFromPodB.") + defer cleanupNetworkPolicy(f, policyDenyFromPodB) + + ginkgo.By("Creating client pod-a which should be able to contact the server pod-b.", func() { + testCanConnect(f, f.Namespace, "pod-a", serviceB, 80) + }) + cleanupServerPodAndService(f, podB, serviceB) + + // Creating server pod with label "pod-name": "pod-a" to deny traffic from client pod with label "pod-name": "pod-b" + podA, serviceA = createServerPodAndService(f, f.Namespace, "pod-a", []protocolPort{{80, v1.ProtocolTCP}}) + ginkgo.By("Waiting for pod-a to be ready", func() { + err := e2epod.WaitTimeoutForPodReadyInNamespace(f.ClientSet, podA.Name, f.Namespace.Name, framework.PodStartTimeout) + framework.ExpectNoError(err, "Error occurred while waiting for pod type: Ready.") + }) + + ginkgo.By("Creating client pod-b which should be able to contact the server pod-a.", func() { + testCannotConnect(f, f.Namespace, "pod-b", serviceA, 80) + }) + cleanupServerPodAndService(f, podA, serviceA) + }) + ginkgo.It("should not allow access by TCP when a policy specifies only SCTP [Feature:NetworkPolicy] [Feature:SCTP]", func() { + ginkgo.By("getting the state of the sctp module on nodes") + nodes, err := e2enode.GetReadySchedulableNodes(f.ClientSet) + framework.ExpectNoError(err) + sctpLoadedAtStart := CheckSCTPModuleLoadedOnNodes(f, nodes) + + ginkgo.By("Creating a network policy for the server which allows traffic only via SCTP on port 80.") + policy := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: "allow-only-sctp-ingress-on-port-80", + }, + Spec: networkingv1.NetworkPolicySpec{ + // Apply to server + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod-name": podServerLabelSelector, + }, + }, + // Allow traffic only via SCTP on port 80 . + Ingress: []networkingv1.NetworkPolicyIngressRule{{ + Ports: []networkingv1.NetworkPolicyPort{{ + Port: &intstr.IntOrString{IntVal: 80}, + Protocol: &protocolSCTP, + }}, + }}, + }, + } + appliedPolicy, err := f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) + framework.ExpectNoError(err) + defer cleanupNetworkPolicy(f, appliedPolicy) + + ginkgo.By("Testing pods cannot connect on port 80 anymore when not using SCTP as protocol.") + testCannotConnect(f, f.Namespace, "client-a", service, 80) + + ginkgo.By("validating sctp module is still not loaded") + sctpLoadedAtEnd := CheckSCTPModuleLoadedOnNodes(f, nodes) + if !sctpLoadedAtStart && sctpLoadedAtEnd { + framework.Failf("The state of the sctp module has changed due to the test case") + } + }) + }) +}) + +var _ = common.SIGDescribe("NetworkPolicy [Feature:SCTPConnectivity][LinuxOnly][Disruptive]", func() { + var service *v1.Service + var podServer *v1.Pod + var podServerLabelSelector string + f := framework.NewDefaultFramework("sctp-network-policy") + + ginkgo.BeforeEach(func() { + // Windows does not support network policies. + e2eskipper.SkipIfNodeOSDistroIs("windows") + }) + + ginkgo.Context("NetworkPolicy between server and client using SCTP", func() { + ginkgo.BeforeEach(func() { + ginkgo.By("Creating a simple server that serves on port 80 and 81.") + podServer, service = createServerPodAndService(f, f.Namespace, "server", []protocolPort{{80, v1.ProtocolSCTP}, {81, v1.ProtocolSCTP}}) + + ginkgo.By("Waiting for pod ready", func() { + err := e2epod.WaitTimeoutForPodReadyInNamespace(f.ClientSet, podServer.Name, f.Namespace.Name, framework.PodStartTimeout) + framework.ExpectNoError(err) + }) + + // podServerLabelSelector holds the value for the podServer's label "pod-name". + podServerLabelSelector = podServer.ObjectMeta.Labels["pod-name"] + + // Create pods, which should be able to communicate with the server on port 80 and 81. + ginkgo.By("Testing pods can connect to both ports when no policy is present.") + testCanConnectProtocol(f, f.Namespace, "client-can-connect-80", service, 80, v1.ProtocolSCTP) + testCanConnectProtocol(f, f.Namespace, "client-can-connect-81", service, 81, v1.ProtocolSCTP) + }) + + ginkgo.AfterEach(func() { + cleanupServerPodAndService(f, podServer, service) + }) + + ginkgo.It("should support a 'default-deny' policy [Feature:NetworkPolicy]", func() { + policy := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: "deny-all", + }, + Spec: networkingv1.NetworkPolicySpec{ + PodSelector: metav1.LabelSelector{}, + Ingress: []networkingv1.NetworkPolicyIngressRule{}, + }, + } + + policy, err := f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) + framework.ExpectNoError(err) + defer cleanupNetworkPolicy(f, policy) + + // Create a pod with name 'client-cannot-connect', which will attempt to communicate with the server, + // but should not be able to now that isolation is on. + testCannotConnect(f, f.Namespace, "client-cannot-connect", service, 80) + }) + + ginkgo.It("should enforce policy based on Ports [Feature:NetworkPolicy]", func() { + ginkgo.By("Creating a network policy for the Service which allows traffic only to one port.") + policy := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: "allow-ingress-on-port-81", + }, + Spec: networkingv1.NetworkPolicySpec{ + // Apply to server + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod-name": podServerLabelSelector, + }, + }, + // Allow traffic only to one port. + Ingress: []networkingv1.NetworkPolicyIngressRule{{ + Ports: []networkingv1.NetworkPolicyPort{{ + Port: &intstr.IntOrString{IntVal: 81}, + Protocol: &protocolSCTP, + }}, + }}, + }, + } + policy, err := f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) + framework.ExpectNoError(err) + defer cleanupNetworkPolicy(f, policy) + + ginkgo.By("Testing pods can connect only to the port allowed by the policy.") + testCannotConnectProtocol(f, f.Namespace, "client-a", service, 80, v1.ProtocolSCTP) + testCanConnectProtocol(f, f.Namespace, "client-b", service, 81, v1.ProtocolSCTP) + }) + + ginkgo.It("should enforce policy to allow traffic only from a pod in a different namespace based on PodSelector and NamespaceSelector [Feature:NetworkPolicy]", func() { + nsA := f.Namespace + nsBName := f.BaseName + "-b" + nsB, err := f.CreateNamespace(nsBName, map[string]string{ + "ns-name": nsBName, + }) + framework.ExpectNoError(err, "Error occurred while creating namespace-b.") + + // Wait for Server in namespaces-a to be ready + framework.Logf("Waiting for server to come up.") + err = e2epod.WaitForPodRunningInNamespace(f.ClientSet, podServer) + framework.ExpectNoError(err, "Error occurred while waiting for pod status in namespace: Running.") + + // Before application of the policy, all communication should be successful. + ginkgo.By("Creating client-a, in server's namespace, which should be able to contact the server.", func() { + testCanConnectProtocol(f, nsA, "client-a", service, 80, v1.ProtocolSCTP) + }) + ginkgo.By("Creating client-b, in server's namespace, which should be able to contact the server.", func() { + testCanConnectProtocol(f, nsA, "client-b", service, 80, v1.ProtocolSCTP) + }) + ginkgo.By("Creating client-a, not in server's namespace, which should be able to contact the server.", func() { + testCanConnectProtocol(f, nsB, "client-a", service, 80, v1.ProtocolSCTP) + }) + ginkgo.By("Creating client-b, not in server's namespace, which should be able to contact the server.", func() { + testCanConnectProtocol(f, nsB, "client-b", service, 80, v1.ProtocolSCTP) + }) + + ginkgo.By("Creating a network policy for the server which allows traffic only from client-a in namespace-b.") + policy := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: nsA.Name, + Name: "allow-ns-b-client-a-via-namespace-pod-selector", + }, + Spec: networkingv1.NetworkPolicySpec{ + // Apply this policy to the Server + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod-name": podServerLabelSelector, + }, + }, + // Allow traffic only from client-a in namespace-b + Ingress: []networkingv1.NetworkPolicyIngressRule{{ + From: []networkingv1.NetworkPolicyPeer{{ + NamespaceSelector: &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "ns-name": nsBName, + }, + }, + PodSelector: &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod-name": "client-a", + }, + }, + }}, + }}, + }, + } + + policy, err = f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) + framework.ExpectNoError(err, "Error occurred while creating policy: policy.") + defer cleanupNetworkPolicy(f, policy) + + ginkgo.By("Creating client-a, in server's namespace, which should not be able to contact the server.", func() { + testCannotConnectProtocol(f, nsA, "client-a", service, 80, v1.ProtocolSCTP) + }) + ginkgo.By("Creating client-b, in server's namespace, which should not be able to contact the server.", func() { + testCannotConnectProtocol(f, nsA, "client-b", service, 80, v1.ProtocolSCTP) + }) + ginkgo.By("Creating client-a, not in server's namespace, which should be able to contact the server.", func() { + testCanConnectProtocol(f, nsB, "client-a", service, 80, v1.ProtocolSCTP) + }) + ginkgo.By("Creating client-b, not in server's namespace, which should not be able to contact the server.", func() { + testCannotConnectProtocol(f, nsB, "client-b", service, 80, v1.ProtocolSCTP) + }) + }) + }) +}) + +func testCanConnect(f *framework.Framework, ns *v1.Namespace, podName string, service *v1.Service, targetPort int) { + testCanConnectProtocol(f, ns, podName, service, targetPort, v1.ProtocolTCP) +} + +func testCannotConnect(f *framework.Framework, ns *v1.Namespace, podName string, service *v1.Service, targetPort int) { + testCannotConnectProtocol(f, ns, podName, service, targetPort, v1.ProtocolTCP) +} + +func testCanConnectProtocol(f *framework.Framework, ns *v1.Namespace, podName string, service *v1.Service, targetPort int, protocol v1.Protocol) { + ginkgo.By(fmt.Sprintf("Creating client pod %s that should successfully connect to %s.", podName, service.Name)) + podClient := createNetworkClientPod(f, ns, podName, service, targetPort, protocol) + defer func() { + ginkgo.By(fmt.Sprintf("Cleaning up the pod %s", podClient.Name)) + if err := f.ClientSet.CoreV1().Pods(ns.Name).Delete(context.TODO(), podClient.Name, metav1.DeleteOptions{}); err != nil { + framework.Failf("unable to cleanup pod %v: %v", podClient.Name, err) + } + }() + checkConnectivity(f, ns, podClient, service) +} + +func testCannotConnectProtocol(f *framework.Framework, ns *v1.Namespace, podName string, service *v1.Service, targetPort int, protocol v1.Protocol) { + ginkgo.By(fmt.Sprintf("Creating client pod %s that should not be able to connect to %s.", podName, service.Name)) + podClient := createNetworkClientPod(f, ns, podName, service, targetPort, protocol) + defer func() { + ginkgo.By(fmt.Sprintf("Cleaning up the pod %s", podClient.Name)) + if err := f.ClientSet.CoreV1().Pods(ns.Name).Delete(context.TODO(), podClient.Name, metav1.DeleteOptions{}); err != nil { + framework.Failf("unable to cleanup pod %v: %v", podClient.Name, err) + } + }() + + checkNoConnectivity(f, ns, podClient, service) +} + +func checkConnectivity(f *framework.Framework, ns *v1.Namespace, podClient *v1.Pod, service *v1.Service) { + framework.Logf("Waiting for %s to complete.", podClient.Name) + err := e2epod.WaitForPodNoLongerRunningInNamespace(f.ClientSet, podClient.Name, ns.Name) + framework.ExpectNoError(err, "Pod did not finish as expected.") + + framework.Logf("Waiting for %s to complete.", podClient.Name) + err = e2epod.WaitForPodSuccessInNamespace(f.ClientSet, podClient.Name, ns.Name) + if err != nil { + // Dump debug information for the test namespace. + framework.DumpDebugInfo(f.ClientSet, f.Namespace.Name) + + pods, policies, logs := collectPodsAndNetworkPolicies(f, podClient) + framework.Failf("Pod %s should be able to connect to service %s, but was not able to connect.\nPod logs:\n%s\n\n Current NetworkPolicies:\n\t%v\n\n Pods:\n\t%v\n\n", podClient.Name, service.Name, logs, policies.Items, pods) + + } +} + +func checkNoConnectivity(f *framework.Framework, ns *v1.Namespace, podClient *v1.Pod, service *v1.Service) { + framework.Logf("Waiting for %s to complete.", podClient.Name) + err := e2epod.WaitForPodSuccessInNamespace(f.ClientSet, podClient.Name, ns.Name) + + // We expect an error here since it's a cannot connect test. + // Dump debug information if the error was nil. + if err == nil { + // Dump debug information for the test namespace. + framework.DumpDebugInfo(f.ClientSet, f.Namespace.Name) + + pods, policies, logs := collectPodsAndNetworkPolicies(f, podClient) + framework.Failf("Pod %s should not be able to connect to service %s, but was able to connect.\nPod logs:\n%s\n\n Current NetworkPolicies:\n\t%v\n\n Pods:\n\t %v\n\n", podClient.Name, service.Name, logs, policies.Items, pods) + + } +} + +func checkNoConnectivityByExitCode(f *framework.Framework, ns *v1.Namespace, podClient *v1.Pod, service *v1.Service) { + err := e2epod.WaitForPodCondition(f.ClientSet, ns.Name, podClient.Name, "terminated", framework.PodStartTimeout, func(pod *v1.Pod) (bool, error) { + statuses := pod.Status.ContainerStatuses + if len(statuses) == 0 || statuses[0].State.Terminated == nil { + return false, nil + } + if statuses[0].State.Terminated.ExitCode != 0 { + return true, fmt.Errorf("pod %q container exited with code: %d", podClient.Name, statuses[0].State.Terminated.ExitCode) + } + return true, nil + }) + // We expect an error here since it's a cannot connect test. + // Dump debug information if the error was nil. + if err == nil { + pods, policies, logs := collectPodsAndNetworkPolicies(f, podClient) + framework.Failf("Pod %s should not be able to connect to service %s, but was able to connect.\nPod logs:\n%s\n\n Current NetworkPolicies:\n\t%v\n\n Pods:\n\t%v\n\n", podClient.Name, service.Name, logs, policies.Items, pods) + + // Dump debug information for the test namespace. + framework.DumpDebugInfo(f.ClientSet, f.Namespace.Name) + } +} + +func collectPodsAndNetworkPolicies(f *framework.Framework, podClient *v1.Pod) ([]string, *networkingv1.NetworkPolicyList, string) { + // Collect pod logs when we see a failure. + logs, logErr := e2epod.GetPodLogs(f.ClientSet, f.Namespace.Name, podClient.Name, "client") + if logErr != nil && apierrors.IsNotFound(logErr) { + // Pod may have already been removed; try to get previous pod logs + logs, logErr = e2epod.GetPreviousPodLogs(f.ClientSet, f.Namespace.Name, podClient.Name, fmt.Sprintf("%s-container", podClient.Name)) + } + if logErr != nil { + framework.Logf("Error getting container logs: %s", logErr) + } + + // Collect current NetworkPolicies applied in the test namespace. + policies, err := f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).List(context.TODO(), metav1.ListOptions{}) + if err != nil { + framework.Logf("error getting current NetworkPolicies for %s namespace: %s", f.Namespace.Name, err) + } + // Collect the list of pods running in the test namespace. + podsInNS, err := e2epod.GetPodsInNamespace(f.ClientSet, f.Namespace.Name, map[string]string{}) + if err != nil { + framework.Logf("error getting pods for %s namespace: %s", f.Namespace.Name, err) + } + pods := []string{} + for _, p := range podsInNS { + pods = append(pods, fmt.Sprintf("Pod: %s, Status: %s\n", p.Name, p.Status.String())) + } + return pods, policies, logs +} + +// Create a server pod with a listening container for each port in ports[]. +// Will also assign a pod label with key: "pod-name" and label set to the given podName for later use by the network +// policy. +func createServerPodAndService(f *framework.Framework, namespace *v1.Namespace, podName string, ports []protocolPort) (*v1.Pod, *v1.Service) { + // Because we have a variable amount of ports, we'll first loop through and generate our Containers for our pod, + // and ServicePorts.for our Service. + containers := []v1.Container{} + servicePorts := []v1.ServicePort{} + for _, portProtocol := range ports { + var porterPort string + var connectProtocol string + switch portProtocol.protocol { + case v1.ProtocolTCP: + porterPort = fmt.Sprintf("SERVE_PORT_%d", portProtocol.port) + connectProtocol = "tcp" + case v1.ProtocolSCTP: + porterPort = fmt.Sprintf("SERVE_SCTP_PORT_%d", portProtocol.port) + connectProtocol = "sctp" + default: + framework.Failf("createServerPodAndService, unexpected protocol %v", portProtocol.protocol) + } + + containers = append(containers, v1.Container{ + Name: fmt.Sprintf("%s-container-%d", podName, portProtocol.port), + Image: imageutils.GetE2EImage(imageutils.Agnhost), + Args: []string{"porter"}, + Env: []v1.EnvVar{ + { + Name: porterPort, + Value: "foo", + }, + }, + Ports: []v1.ContainerPort{ + { + ContainerPort: int32(portProtocol.port), + Name: fmt.Sprintf("serve-%d", portProtocol.port), + Protocol: portProtocol.protocol, + }, + }, + ReadinessProbe: &v1.Probe{ + Handler: v1.Handler{ + Exec: &v1.ExecAction{ + Command: []string{"/agnhost", "connect", fmt.Sprintf("--protocol=%s", connectProtocol), "--timeout=1s", fmt.Sprintf("127.0.0.1:%d", portProtocol.port)}, + }, + }, + }, + }) + + // Build the Service Ports for the service. + servicePorts = append(servicePorts, v1.ServicePort{ + Name: fmt.Sprintf("%s-%d", podName, portProtocol.port), + Port: int32(portProtocol.port), + TargetPort: intstr.FromInt(portProtocol.port), + Protocol: portProtocol.protocol, + }) + } + + ginkgo.By(fmt.Sprintf("Creating a server pod %s in namespace %s", podName, namespace.Name)) + pod, err := f.ClientSet.CoreV1().Pods(namespace.Name).Create(context.TODO(), &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + GenerateName: podName + "-", + Labels: map[string]string{ + "pod-name": podName, + }, + }, + Spec: v1.PodSpec{ + Containers: containers, + RestartPolicy: v1.RestartPolicyNever, + }, + }, metav1.CreateOptions{}) + framework.ExpectNoError(err) + framework.Logf("Created pod %v", pod.ObjectMeta.Name) + + svcName := fmt.Sprintf("svc-%s", podName) + ginkgo.By(fmt.Sprintf("Creating a service %s for pod %s in namespace %s", svcName, podName, namespace.Name)) + svc, err := f.ClientSet.CoreV1().Services(namespace.Name).Create(context.TODO(), &v1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: svcName, + }, + Spec: v1.ServiceSpec{ + Ports: servicePorts, + Selector: map[string]string{ + "pod-name": podName, + }, + }, + }, metav1.CreateOptions{}) + framework.ExpectNoError(err) + framework.Logf("Created service %s", svc.Name) + + return pod, svc +} + +func cleanupServerPodAndService(f *framework.Framework, pod *v1.Pod, service *v1.Service) { + ginkgo.By("Cleaning up the server.") + if err := f.ClientSet.CoreV1().Pods(pod.Namespace).Delete(context.TODO(), pod.Name, metav1.DeleteOptions{}); err != nil { + framework.Failf("unable to cleanup pod %v: %v", pod.Name, err) + } + ginkgo.By("Cleaning up the server's service.") + if err := f.ClientSet.CoreV1().Services(service.Namespace).Delete(context.TODO(), service.Name, metav1.DeleteOptions{}); err != nil { + framework.Failf("unable to cleanup svc %v: %v", service.Name, err) + } +} + +// Create a client pod which will attempt a netcat to the provided service, on the specified port. +// This client will attempt a one-shot connection, then die, without restarting the pod. +// Test can then be asserted based on whether the pod quit with an error or not. +func createNetworkClientPod(f *framework.Framework, namespace *v1.Namespace, podName string, targetService *v1.Service, targetPort int, protocol v1.Protocol) *v1.Pod { + return createNetworkClientPodWithRestartPolicy(f, namespace, podName, targetService, targetPort, protocol, v1.RestartPolicyNever) +} + +// Create a client pod which will attempt a netcat to the provided service, on the specified port. +// It is similar to createNetworkClientPod but supports specifying RestartPolicy. +func createNetworkClientPodWithRestartPolicy(f *framework.Framework, namespace *v1.Namespace, podName string, targetService *v1.Service, targetPort int, protocol v1.Protocol, restartPolicy v1.RestartPolicy) *v1.Pod { + var connectProtocol string + switch protocol { + case v1.ProtocolTCP: + connectProtocol = "tcp" + case v1.ProtocolSCTP: + connectProtocol = "sctp" + default: + framework.Failf("createNetworkClientPodWithRestartPolicy, unexpected protocol %v", protocol) + } + + pod, err := f.ClientSet.CoreV1().Pods(namespace.Name).Create(context.TODO(), &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + GenerateName: podName + "-", + Labels: map[string]string{ + "pod-name": podName, + }, + }, + Spec: v1.PodSpec{ + RestartPolicy: restartPolicy, + Containers: []v1.Container{ + { + Name: "client", + Image: imageutils.GetE2EImage(imageutils.Agnhost), + Command: []string{"/bin/sh"}, + Args: []string{ + "-c", + fmt.Sprintf("for i in $(seq 1 5); do /agnhost connect %s --protocol %s --timeout 8s && exit 0 || sleep 1; done; exit 1", net.JoinHostPort(targetService.Spec.ClusterIP, strconv.Itoa(targetPort)), connectProtocol), + }, + }, + }, + }, + }, metav1.CreateOptions{}) + framework.ExpectNoError(err) + return pod +} + +// Patch pod with a map value +func updatePodLabel(f *framework.Framework, namespace *v1.Namespace, podName string, patchOperation string, patchPath string, patchValue map[string]string) *v1.Pod { + type patchMapValue struct { + Op string `json:"op"` + Path string `json:"path"` + Value map[string]string `json:"value,omitempty"` + } + payload := []patchMapValue{{ + Op: patchOperation, + Path: patchPath, + Value: patchValue, + }} + payloadBytes, err := json.Marshal(payload) + framework.ExpectNoError(err) + + pod, err := f.ClientSet.CoreV1().Pods(namespace.Name).Patch(context.TODO(), podName, types.JSONPatchType, payloadBytes, metav1.PatchOptions{}) + framework.ExpectNoError(err) + + return pod +} + +func cleanupNetworkPolicy(f *framework.Framework, policy *networkingv1.NetworkPolicy) { + ginkgo.By("Cleaning up the policy.") + if err := f.ClientSet.NetworkingV1().NetworkPolicies(policy.Namespace).Delete(context.TODO(), policy.Name, metav1.DeleteOptions{}); err != nil { + framework.Failf("unable to cleanup policy %v: %v", policy.Name, err) + } +} + +var _ = common.SIGDescribe("NetworkPolicy API", func() { + f := framework.NewDefaultFramework("networkpolicies") + /* + Release: v1.20 + Testname: NetworkPolicies API + Description: + - The networking.k8s.io API group MUST exist in the /apis discovery document. + - The networking.k8s.io/v1 API group/version MUST exist in the /apis/networking.k8s.io discovery document. + - The NetworkPolicies resources MUST exist in the /apis/networking.k8s.io/v1 discovery document. + - The NetworkPolicies resource must support create, get, list, watch, update, patch, delete, and deletecollection. + */ + + ginkgo.It("should support creating NetworkPolicy API operations", func() { + // Setup + ns := f.Namespace.Name + npVersion := "v1" + npClient := f.ClientSet.NetworkingV1().NetworkPolicies(ns) + npTemplate := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + GenerateName: "e2e-example-netpol", + Labels: map[string]string{ + "special-label": f.UniqueName, + }, + }, + Spec: networkingv1.NetworkPolicySpec{ + // Apply this policy to the Server + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod-name": "test-pod", + }, + }, + // Allow traffic only from client-a in namespace-b + Ingress: []networkingv1.NetworkPolicyIngressRule{{ + From: []networkingv1.NetworkPolicyPeer{{ + NamespaceSelector: &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "ns-name": "pod-b", + }, + }, + PodSelector: &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod-name": "client-a", + }, + }, + }}, + }}, + }, + } + // Discovery + ginkgo.By("getting /apis") + { + discoveryGroups, err := f.ClientSet.Discovery().ServerGroups() + framework.ExpectNoError(err) + found := false + for _, group := range discoveryGroups.Groups { + if group.Name == networkingv1.GroupName { + for _, version := range group.Versions { + if version.Version == npVersion { + found = true + break + } + } + } + } + framework.ExpectEqual(found, true, fmt.Sprintf("expected networking API group/version, got %#v", discoveryGroups.Groups)) + } + ginkgo.By("getting /apis/networking.k8s.io") + { + group := &metav1.APIGroup{} + err := f.ClientSet.Discovery().RESTClient().Get().AbsPath("/apis/networking.k8s.io").Do(context.TODO()).Into(group) + framework.ExpectNoError(err) + found := false + for _, version := range group.Versions { + if version.Version == npVersion { + found = true + break + } + } + framework.ExpectEqual(found, true, fmt.Sprintf("expected networking API version, got %#v", group.Versions)) + } + ginkgo.By("getting /apis/networking.k8s.io" + npVersion) + { + resources, err := f.ClientSet.Discovery().ServerResourcesForGroupVersion(networkingv1.SchemeGroupVersion.String()) + framework.ExpectNoError(err) + foundNetPol := false + for _, resource := range resources.APIResources { + switch resource.Name { + case "networkpolicies": + foundNetPol = true + } + } + framework.ExpectEqual(foundNetPol, true, fmt.Sprintf("expected networkpolicies, got %#v", resources.APIResources)) + } + // NetPol resource create/read/update/watch verbs + ginkgo.By("creating") + _, err := npClient.Create(context.TODO(), npTemplate, metav1.CreateOptions{}) + framework.ExpectNoError(err) + _, err = npClient.Create(context.TODO(), npTemplate, metav1.CreateOptions{}) + framework.ExpectNoError(err) + createdNetPol, err := npClient.Create(context.TODO(), npTemplate, metav1.CreateOptions{}) + framework.ExpectNoError(err) + + ginkgo.By("getting") + gottenNetPol, err := npClient.Get(context.TODO(), createdNetPol.Name, metav1.GetOptions{}) + framework.ExpectNoError(err) + framework.ExpectEqual(gottenNetPol.UID, createdNetPol.UID) + + ginkgo.By("listing") + nps, err := npClient.List(context.TODO(), metav1.ListOptions{LabelSelector: "special-label=" + f.UniqueName}) + framework.ExpectNoError(err) + framework.ExpectEqual(len(nps.Items), 3, "filtered list should have 3 items") + + ginkgo.By("watching") + framework.Logf("starting watch") + npWatch, err := npClient.Watch(context.TODO(), metav1.ListOptions{ResourceVersion: nps.ResourceVersion, LabelSelector: "special-label=" + f.UniqueName}) + framework.ExpectNoError(err) + // Test cluster-wide list and watch + clusterNPClient := f.ClientSet.NetworkingV1().NetworkPolicies("") + ginkgo.By("cluster-wide listing") + clusterNPs, err := clusterNPClient.List(context.TODO(), metav1.ListOptions{LabelSelector: "special-label=" + f.UniqueName}) + framework.ExpectNoError(err) + framework.ExpectEqual(len(clusterNPs.Items), 3, "filtered list should have 3 items") + + ginkgo.By("cluster-wide watching") + framework.Logf("starting watch") + _, err = clusterNPClient.Watch(context.TODO(), metav1.ListOptions{ResourceVersion: nps.ResourceVersion, LabelSelector: "special-label=" + f.UniqueName}) + framework.ExpectNoError(err) + + ginkgo.By("patching") + patchedNetPols, err := npClient.Patch(context.TODO(), createdNetPol.Name, types.MergePatchType, []byte(`{"metadata":{"annotations":{"patched":"true"}}}`), metav1.PatchOptions{}) + framework.ExpectNoError(err) + framework.ExpectEqual(patchedNetPols.Annotations["patched"], "true", "patched object should have the applied annotation") + + ginkgo.By("updating") + npToUpdate := patchedNetPols.DeepCopy() + npToUpdate.Annotations["updated"] = "true" + updatedNetPols, err := npClient.Update(context.TODO(), npToUpdate, metav1.UpdateOptions{}) + framework.ExpectNoError(err) + framework.ExpectEqual(updatedNetPols.Annotations["updated"], "true", "updated object should have the applied annotation") + + framework.Logf("waiting for watch events with expected annotations") + for sawAnnotations := false; !sawAnnotations; { + select { + case evt, ok := <-npWatch.ResultChan(): + framework.ExpectEqual(ok, true, "watch channel should not close") + framework.ExpectEqual(evt.Type, watch.Modified) + watchedNetPol, isNetPol := evt.Object.(*networkingv1.NetworkPolicy) + framework.ExpectEqual(isNetPol, true, fmt.Sprintf("expected NetworkPolicy, got %T", evt.Object)) + if watchedNetPol.Annotations["patched"] == "true" && watchedNetPol.Annotations["updated"] == "true" { + framework.Logf("saw patched and updated annotations") + sawAnnotations = true + npWatch.Stop() + } else { + framework.Logf("missing expected annotations, waiting: %#v", watchedNetPol.Annotations) + } + case <-time.After(wait.ForeverTestTimeout): + framework.Fail("timed out waiting for watch event") + } + } + // NetPol resource delete operations + ginkgo.By("deleting") + err = npClient.Delete(context.TODO(), createdNetPol.Name, metav1.DeleteOptions{}) + framework.ExpectNoError(err) + _, err = npClient.Get(context.TODO(), createdNetPol.Name, metav1.GetOptions{}) + framework.ExpectEqual(apierrors.IsNotFound(err), true, fmt.Sprintf("expected 404, got %#v", err)) + nps, err = npClient.List(context.TODO(), metav1.ListOptions{LabelSelector: "special-label=" + f.UniqueName}) + framework.ExpectNoError(err) + framework.ExpectEqual(len(nps.Items), 2, "filtered list should have 2 items") + + ginkgo.By("deleting a collection") + err = npClient.DeleteCollection(context.TODO(), metav1.DeleteOptions{}, metav1.ListOptions{LabelSelector: "special-label=" + f.UniqueName}) + framework.ExpectNoError(err) + nps, err = npClient.List(context.TODO(), metav1.ListOptions{LabelSelector: "special-label=" + f.UniqueName}) + framework.ExpectNoError(err) + framework.ExpectEqual(len(nps.Items), 0, "filtered list should have 0 items") + }) +}) + +// CheckSCTPModuleLoadedOnNodes checks whether any node on the list has the +// sctp.ko module loaded +// For security reasons, and also to allow clusters to use userspace SCTP implementations, +// we require that just creating an SCTP Pod/Service/NetworkPolicy must not do anything +// that would cause the sctp kernel module to be loaded. +func CheckSCTPModuleLoadedOnNodes(f *framework.Framework, nodes *v1.NodeList) bool { + hostExec := utils.NewHostExec(f) + defer hostExec.Cleanup() + re := regexp.MustCompile(`^\s*sctp\s+`) + cmd := "lsmod | grep sctp" + for _, node := range nodes.Items { + framework.Logf("Executing cmd %q on node %v", cmd, node.Name) + result, err := hostExec.IssueCommandWithResult(cmd, &node) + if err != nil { + framework.Logf("sctp module is not loaded or error occurred while executing command %s on node: %v", cmd, err) + } + for _, line := range strings.Split(result, "\n") { + if found := re.Find([]byte(line)); found != nil { + framework.Logf("the sctp module is loaded on node: %v", node.Name) + return true + } + } + framework.Logf("the sctp module is not loaded on node: %v", node.Name) + } + return false +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/network/netpol/network_policy.go b/vendor/k8s.io/kubernetes/test/e2e/network/netpol/network_policy.go new file mode 100644 index 000000000000..f254e39bb5f4 --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/network/netpol/network_policy.go @@ -0,0 +1,1228 @@ +/* +Copyright 2016 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package netpol + +import ( + "context" + "fmt" + "time" + + "k8s.io/apimachinery/pkg/util/intstr" + "k8s.io/apimachinery/pkg/util/wait" + + v1 "k8s.io/api/core/v1" + networkingv1 "k8s.io/api/networking/v1" + + "github.com/onsi/ginkgo" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/kubernetes/test/e2e/framework" + e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" + "k8s.io/kubernetes/test/e2e/network/common" + utilnet "k8s.io/utils/net" +) + +const ( + isVerbose = true + + // useFixedNamespaces is useful when working on these tests: instead of creating new pods and + // new namespaces for each test run, it creates a fixed set of namespaces and pods, and then + // reuses them for each test case. + // The result: tests run much faster. However, this should only be used as a convenience for + // working on the tests during development. It should not be enabled in production. + useFixedNamespaces = false + + // See https://github.com/kubernetes/kubernetes/issues/95879 + // The semantics of the effect of network policies on loopback calls may be undefined: should + // they always be ALLOWED; how do Services affect this? + // Calico, Cillium, Antrea seem to do different things. + // Since different CNIs have different results, that causes tests including loopback to fail + // on some CNIs. So let's just ignore loopback calls for the purposes of deciding test pass/fail. + ignoreLoopback = true +) + +var ( + protocolTCP = v1.ProtocolTCP + protocolUDP = v1.ProtocolUDP + protocolSCTP = v1.ProtocolSCTP + + // addSCTPContainers is a flag to enable SCTP containers on bootstrap. + addSCTPContainers = false +) + +/* +You might be wondering, why are there multiple namespaces used for each test case? + +These tests are based on "truth tables" that compare the expected and actual connectivity of each pair of pods. +Since network policies live in namespaces, and peers can be selected by namespace, +howing the connectivity of pods in other namespaces is key information to show whether a network policy is working as intended or not. + +We use 3 namespaces each with 3 pods, and probe all combinations ( 9 pods x 9 pods = 81 data points ) -- including cross-namespace calls. + +Here's an example of a test run, showing the expected and actual connectivity, along with the differences. Note how the +visual representation as a truth table greatly aids in understanding what a network policy is intended to do in theory +and what is happening in practice: + + Oct 19 10:34:16.907: INFO: expected: + + - x/a x/b x/c y/a y/b y/c z/a z/b z/c + x/a X . . . . . . . . + x/b X . . . . . . . . + x/c X . . . . . . . . + y/a . . . . . . . . . + y/b . . . . . . . . . + y/c . . . . . . . . . + z/a X . . . . . . . . + z/b X . . . . . . . . + z/c X . . . . . . . . + + Oct 19 10:34:16.907: INFO: observed: + + - x/a x/b x/c y/a y/b y/c z/a z/b z/c + x/a X . . . . . . . . + x/b X . . . . . . . . + x/c X . . . . . . . . + y/a . . . . . . . . . + y/b . . . . . . . . . + y/c . . . . . . . . . + z/a X . . . . . . . . + z/b X . . . . . . . . + z/c X . . . . . . . . + + Oct 19 10:34:16.907: INFO: comparison: + + - x/a x/b x/c y/a y/b y/c z/a z/b z/c + x/a . . . . . . . . . + x/b . . . . . . . . . + x/c . . . . . . . . . + y/a . . . . . . . . . + y/b . . . . . . . . . + y/c . . . . . . . . . + z/a . . . . . . . . . + z/b . . . . . . . . . + z/c . . . . . . . . . +*/ + +var _ = common.SIGDescribe("Netpol [LinuxOnly]", func() { + f := framework.NewDefaultFramework("netpol") + + ginkgo.Context("NetworkPolicy between server and client", func() { + ginkgo.BeforeEach(func() { + initializeResourcesByFixedNS(f) + }) + + ginkgo.AfterEach(func() { + if !useFixedNamespaces { + _, _, _, model, k8s := getK8SModel(f) + framework.ExpectNoError(k8s.deleteNamespaces(model.NamespaceNames), "unable to clean up netpol namespaces") + } + }) + + ginkgo.It("should support a 'default-deny-ingress' policy [Feature:NetworkPolicy]", func() { + nsX, _, _, model, k8s := getK8SModel(f) + policy := GetDenyIngress("deny-ingress") + CreatePolicy(k8s, policy, nsX) + + reachability := NewReachability(model.AllPods(), true) + reachability.ExpectPeer(&Peer{}, &Peer{Namespace: nsX}, false) + + ValidateOrFail(k8s, model, &TestCase{ToPort: 80, Protocol: v1.ProtocolTCP, Reachability: reachability}) + }) + + ginkgo.It("should support a 'default-deny-all' policy [Feature:NetworkPolicy]", func() { + policy := GetDenyAllWithEgressDNS() + nsX, _, _, model, k8s := getK8SModel(f) + CreatePolicy(k8s, policy, nsX) + + reachability := NewReachability(model.AllPods(), true) + reachability.ExpectPeer(&Peer{}, &Peer{Namespace: nsX}, false) + reachability.ExpectPeer(&Peer{Namespace: nsX}, &Peer{}, false) + + ValidateOrFail(k8s, model, &TestCase{ToPort: 80, Protocol: v1.ProtocolTCP, Reachability: reachability}) + }) + + ginkgo.It("should enforce policy to allow traffic from pods within server namespace based on PodSelector [Feature:NetworkPolicy]", func() { + allowedPods := metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod": "b", + }, + } + policy := GetAllowIngressByPod("x-a-allows-x-b", map[string]string{"pod": "a"}, &allowedPods) + nsX, _, _, model, k8s := getK8SModel(f) + CreatePolicy(k8s, policy, nsX) + + reachability := NewReachability(model.AllPods(), true) + reachability.ExpectAllIngress(NewPodString(nsX, "a"), false) + reachability.Expect(NewPodString(nsX, "b"), NewPodString(nsX, "a"), true) + + ValidateOrFail(k8s, model, &TestCase{ToPort: 80, Protocol: v1.ProtocolTCP, Reachability: reachability}) + }) + + ginkgo.It("should enforce policy to allow ingress traffic for a target [Feature:NetworkPolicy] ", func() { + nsX, _, _, model, k8s := getK8SModel(f) + + ginkgo.By("having a deny all ingress policy", func() { + // Deny all Ingress traffic policy to pods on namespace nsX + policy := GetDenyIngress("deny-all") + CreatePolicy(k8s, policy, nsX) + }) + + // Allow Ingress traffic only to pod x/a from any pod + allowPolicy := GetAllowIngressForTarget("allow-all-to-a", map[string]string{"pod": "a"}) + CreatePolicy(k8s, allowPolicy, nsX) + + reachability := NewReachability(model.AllPods(), true) + reachability.ExpectAllIngress(NewPodString(nsX, "a"), true) + reachability.ExpectAllIngress(NewPodString(nsX, "b"), false) + reachability.ExpectAllIngress(NewPodString(nsX, "c"), false) + + ValidateOrFail(k8s, model, &TestCase{ToPort: 80, Protocol: v1.ProtocolTCP, Reachability: reachability}) + }) + + ginkgo.It("should enforce policy to allow ingress traffic from pods in all namespaces [Feature:NetworkPolicy]", func() { + nsX, _, _, model, k8s := getK8SModel(f) + + emptyLabel := &metav1.LabelSelector{ + MatchLabels: map[string]string{}, + } + policy := GetAllowIngressByNamespace("allow-from-another-ns", map[string]string{"pod": "a"}, emptyLabel) + CreatePolicy(k8s, policy, nsX) + + reachability := NewReachability(model.AllPods(), true) + ValidateOrFail(k8s, model, &TestCase{ToPort: 80, Protocol: v1.ProtocolTCP, Reachability: reachability}) + }) + + ginkgo.It("should enforce policy to allow traffic only from a different namespace, based on NamespaceSelector [Feature:NetworkPolicy]", func() { + nsX, nsY, nsZ, model, k8s := getK8SModel(f) + allowedLabels := &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "ns": nsY, + }, + } + policy := GetAllowIngressByNamespace("allow-client-a-via-ns-selector", map[string]string{"pod": "a"}, allowedLabels) + CreatePolicy(k8s, policy, nsX) + + reachability := NewReachability(model.AllPods(), true) + // disallow all traffic from the x or z namespaces + reachability.ExpectPeer(&Peer{Namespace: nsX}, &Peer{Namespace: nsX, Pod: "a"}, false) + reachability.ExpectPeer(&Peer{Namespace: nsZ}, &Peer{Namespace: nsX, Pod: "a"}, false) + + ValidateOrFail(k8s, model, &TestCase{ToPort: 80, Protocol: v1.ProtocolTCP, Reachability: reachability}) + }) + + ginkgo.It("should enforce policy based on PodSelector with MatchExpressions[Feature:NetworkPolicy]", func() { + allowedPods := metav1.LabelSelector{ + MatchExpressions: []metav1.LabelSelectorRequirement{{ + Key: "pod", + Operator: metav1.LabelSelectorOpIn, + Values: []string{"b"}, + }}, + } + policy := GetAllowIngressByPod("x-a-allows-x-b", map[string]string{"pod": "a"}, &allowedPods) + nsX, _, _, model, k8s := getK8SModel(f) + CreatePolicy(k8s, policy, nsX) + + reachability := NewReachability(model.AllPods(), true) + reachability.ExpectAllIngress(NewPodString(nsX, "a"), false) + reachability.Expect(NewPodString(nsX, "b"), NewPodString(nsX, "a"), true) + + ValidateOrFail(k8s, model, &TestCase{ToPort: 80, Protocol: v1.ProtocolTCP, Reachability: reachability}) + }) + + ginkgo.It("should enforce policy based on NamespaceSelector with MatchExpressions[Feature:NetworkPolicy]", func() { + nsX, nsY, nsZ, model, k8s := getK8SModel(f) + allowedNamespaces := &metav1.LabelSelector{ + MatchExpressions: []metav1.LabelSelectorRequirement{{ + Key: "ns", + Operator: metav1.LabelSelectorOpIn, + Values: []string{nsY}, + }}, + } + policy := GetAllowIngressByNamespace("allow-ns-y-match-selector", map[string]string{"pod": "a"}, allowedNamespaces) + CreatePolicy(k8s, policy, nsX) + + reachability := NewReachability(model.AllPods(), true) + // disallow all traffic from the x or z namespaces + reachability.ExpectPeer(&Peer{Namespace: nsX}, &Peer{Namespace: nsX, Pod: "a"}, false) + reachability.ExpectPeer(&Peer{Namespace: nsZ}, &Peer{Namespace: nsX, Pod: "a"}, false) + + ValidateOrFail(k8s, model, &TestCase{ToPort: 80, Protocol: v1.ProtocolTCP, Reachability: reachability}) + }) + + ginkgo.It("should enforce policy based on PodSelector or NamespaceSelector [Feature:NetworkPolicy]", func() { + nsX, _, _, model, k8s := getK8SModel(f) + allowedNamespaces := &metav1.LabelSelector{ + MatchExpressions: []metav1.LabelSelectorRequirement{{ + Key: "ns", + Operator: metav1.LabelSelectorOpNotIn, + Values: []string{nsX}, + }}, + } + podBAllowlisting := &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod": "b", + }, + } + policy := GetAllowIngressByNamespaceOrPod("allow-ns-y-match-selector", map[string]string{"pod": "a"}, allowedNamespaces, podBAllowlisting) + CreatePolicy(k8s, policy, nsX) + + reachability := NewReachability(model.AllPods(), true) + reachability.Expect(NewPodString(nsX, "a"), NewPodString(nsX, "a"), false) + reachability.Expect(NewPodString(nsX, "c"), NewPodString(nsX, "a"), false) + + ValidateOrFail(k8s, model, &TestCase{ToPort: 80, Protocol: v1.ProtocolTCP, Reachability: reachability}) + }) + + ginkgo.It("should enforce policy based on PodSelector and NamespaceSelector [Feature:NetworkPolicy]", func() { + nsX, nsY, nsZ, model, k8s := getK8SModel(f) + allowedNamespaces := &metav1.LabelSelector{ + MatchExpressions: []metav1.LabelSelectorRequirement{{ + Key: "ns", + Operator: metav1.LabelSelectorOpNotIn, + Values: []string{nsX}, + }}, + } + allowedPod := &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod": "b", + }, + } + policy := GetAllowIngressByNamespaceAndPod("allow-ns-y-podselector-and-nsselector", map[string]string{"pod": "a"}, allowedNamespaces, allowedPod) + CreatePolicy(k8s, policy, nsX) + + reachability := NewReachability(model.AllPods(), true) + reachability.ExpectAllIngress(NewPodString(nsX, "a"), false) + reachability.Expect(NewPodString(nsY, "b"), NewPodString(nsX, "a"), true) + reachability.Expect(NewPodString(nsZ, "b"), NewPodString(nsX, "a"), true) + + ValidateOrFail(k8s, model, &TestCase{ToPort: 80, Protocol: v1.ProtocolTCP, Reachability: reachability}) + }) + + ginkgo.It("should enforce policy based on Multiple PodSelectors and NamespaceSelectors [Feature:NetworkPolicy]", func() { + nsX, nsY, nsZ, model, k8s := getK8SModel(f) + allowedNamespaces := &metav1.LabelSelector{ + MatchExpressions: []metav1.LabelSelectorRequirement{{ + Key: "ns", + Operator: metav1.LabelSelectorOpNotIn, + Values: []string{nsX}, + }}, + } + allowedPod := &metav1.LabelSelector{ + MatchExpressions: []metav1.LabelSelectorRequirement{{ + Key: "pod", + Operator: metav1.LabelSelectorOpIn, + Values: []string{"b", "c"}, + }}, + } + policy := GetAllowIngressByNamespaceAndPod("allow-ns-y-z-pod-b-c", map[string]string{"pod": "a"}, allowedNamespaces, allowedPod) + CreatePolicy(k8s, policy, nsX) + + reachability := NewReachability(model.AllPods(), true) + reachability.ExpectPeer(&Peer{Namespace: nsX}, &Peer{Namespace: nsX, Pod: "a"}, false) + reachability.Expect(NewPodString(nsY, "a"), NewPodString(nsX, "a"), false) + reachability.Expect(NewPodString(nsZ, "a"), NewPodString(nsX, "a"), false) + + ValidateOrFail(k8s, model, &TestCase{ToPort: 80, Protocol: v1.ProtocolTCP, Reachability: reachability}) + }) + + ginkgo.It("should enforce policy based on any PodSelectors [Feature:NetworkPolicy]", func() { + nsX, _, _, model, k8s := getK8SModel(f) + + peers := []map[string]string{{"pod": "b"}, {"pod": "c"}} + policy := GetAllowIngressByAnyPod("allow-ns-x-pod-b-c", map[string]string{"pod": "a"}, peers) + CreatePolicy(k8s, policy, nsX) + + reachability := NewReachability(model.AllPods(), true) + reachability.ExpectAllIngress(NewPodString(nsX, "a"), false) + + // Connect Pods b and c to pod a from namespace nsX + reachability.Expect(NewPodString(nsX, "b"), NewPodString(nsX, "a"), true) + reachability.Expect(NewPodString(nsX, "c"), NewPodString(nsX, "a"), true) + + ValidateOrFail(k8s, model, &TestCase{ToPort: 80, Protocol: v1.ProtocolTCP, Reachability: reachability}) + }) + + ginkgo.It("should enforce policy to allow traffic only from a pod in a different namespace based on PodSelector and NamespaceSelector [Feature:NetworkPolicy]", func() { + nsX, nsY, _, model, k8s := getK8SModel(f) + allowedNamespaces := &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "ns": nsY, + }, + } + allowedPods := &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod": "a", + }, + } + policy := GetAllowIngressByNamespaceAndPod("allow-ns-y-pod-a-via-namespace-pod-selector", map[string]string{"pod": "a"}, allowedNamespaces, allowedPods) + CreatePolicy(k8s, policy, nsX) + + reachability := NewReachability(model.AllPods(), true) + reachability.ExpectAllIngress(NewPodString(nsX, "a"), false) + reachability.Expect(NewPodString(nsY, "a"), NewPodString(nsX, "a"), true) + + ValidateOrFail(k8s, model, &TestCase{ToPort: 80, Protocol: v1.ProtocolTCP, Reachability: reachability}) + }) + + ginkgo.It("should enforce policy based on Ports [Feature:NetworkPolicy]", func() { + ginkgo.By("Creating a network allowPort81Policy which only allows allow listed namespaces (y) to connect on exactly one port (81)") + nsX, nsY, nsZ, model, k8s := getK8SModel(f) + allowedLabels := &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "ns": nsY, + }, + } + allowPort81Policy := GetAllowIngressByNamespaceAndPort("allow-client-a-via-ns-selector", map[string]string{"pod": "a"}, allowedLabels, &intstr.IntOrString{IntVal: 81}, &protocolTCP) + CreatePolicy(k8s, allowPort81Policy, nsX) + + reachability := NewReachability(model.AllPods(), true) + reachability.ExpectPeer(&Peer{Namespace: nsX}, &Peer{Namespace: nsX, Pod: "a"}, false) + reachability.ExpectPeer(&Peer{Namespace: nsY}, &Peer{Namespace: nsX, Pod: "a"}, true) + reachability.ExpectPeer(&Peer{Namespace: nsZ}, &Peer{Namespace: nsX, Pod: "a"}, false) + + ValidateOrFail(k8s, model, &TestCase{ToPort: 81, Protocol: v1.ProtocolTCP, Reachability: reachability}) + }) + + ginkgo.It("should enforce multiple, stacked policies with overlapping podSelectors [Feature:NetworkPolicy]", func() { + ginkgo.By("Creating a network allowPort81Policy which only allows allow listed namespaces (y) to connect on exactly one port (81)") + nsX, nsY, nsZ, model, k8s := getK8SModel(f) + allowedLabels := &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "ns": nsY, + }, + } + allowPort81Policy := GetAllowIngressByNamespaceAndPort("allow-client-a-via-ns-selector", map[string]string{"pod": "a"}, allowedLabels, &intstr.IntOrString{IntVal: 81}, &protocolTCP) + CreatePolicy(k8s, allowPort81Policy, nsX) + + reachabilityALLOW := NewReachability(model.AllPods(), true) + reachabilityALLOW.ExpectPeer(&Peer{Namespace: nsX}, &Peer{Namespace: nsX, Pod: "a"}, false) + reachabilityALLOW.ExpectPeer(&Peer{Namespace: nsY}, &Peer{Namespace: nsX, Pod: "a"}, true) + reachabilityALLOW.ExpectPeer(&Peer{Namespace: nsZ}, &Peer{Namespace: nsX, Pod: "a"}, false) + + ginkgo.By("Verifying traffic on port 81.") + ValidateOrFail(k8s, model, &TestCase{ToPort: 81, Protocol: v1.ProtocolTCP, Reachability: reachabilityALLOW}) + + reachabilityDENY := NewReachability(model.AllPods(), true) + reachabilityDENY.ExpectAllIngress(NewPodString(nsX, "a"), false) + + ginkgo.By("Verifying traffic on port 80.") + ValidateOrFail(k8s, model, &TestCase{ToPort: 80, Protocol: v1.ProtocolTCP, Reachability: reachabilityDENY}) + + allowPort80Policy := GetAllowIngressByNamespaceAndPort("allow-client-a-via-ns-selector-80", map[string]string{"pod": "a"}, allowedLabels, &intstr.IntOrString{IntVal: 80}, &protocolTCP) + CreatePolicy(k8s, allowPort80Policy, nsX) + + ginkgo.By("Verifying that we can add a policy to unblock port 80") + ValidateOrFail(k8s, model, &TestCase{ToPort: 80, Protocol: v1.ProtocolTCP, Reachability: reachabilityALLOW}) + }) + + ginkgo.It("should support allow-all policy [Feature:NetworkPolicy]", func() { + ginkgo.By("Creating a network policy which allows all traffic.") + policy := GetAllowIngress("allow-all") + nsX, _, _, model, k8s := getK8SModel(f) + CreatePolicy(k8s, policy, nsX) + + ginkgo.By("Testing pods can connect to both ports when an 'allow-all' policy is present.") + reachability := NewReachability(model.AllPods(), true) + ValidateOrFail(k8s, model, &TestCase{ToPort: 80, Protocol: v1.ProtocolTCP, Reachability: reachability}) + ValidateOrFail(k8s, model, &TestCase{ToPort: 81, Protocol: v1.ProtocolTCP, Reachability: reachability}) + }) + + ginkgo.It("should allow ingress access on one named port [Feature:NetworkPolicy]", func() { + policy := GetAllowIngressByPort("allow-all", &intstr.IntOrString{Type: intstr.String, StrVal: "serve-81-tcp"}) + nsX, _, _, model, k8s := getK8SModel(f) + CreatePolicy(k8s, policy, nsX) + + ginkgo.By("Blocking all ports other then 81 in the entire namespace") + + reachabilityPort81 := NewReachability(model.AllPods(), true) + ValidateOrFail(k8s, model, &TestCase{ToPort: 81, Protocol: v1.ProtocolTCP, Reachability: reachabilityPort81}) + + // disallow all traffic to the x namespace + reachabilityPort80 := NewReachability(model.AllPods(), true) + reachabilityPort80.ExpectPeer(&Peer{}, &Peer{Namespace: nsX}, false) + ValidateOrFail(k8s, model, &TestCase{ToPort: 80, Protocol: v1.ProtocolTCP, Reachability: reachabilityPort80}) + }) + + ginkgo.It("should allow ingress access from namespace on one named port [Feature:NetworkPolicy]", func() { + nsX, nsY, nsZ, model, k8s := getK8SModel(f) + allowedLabels := &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "ns": nsY, + }, + } + policy := GetAllowIngressByNamespaceAndPort("allow-client-a-via-ns-selector-80", map[string]string{"pod": "a"}, allowedLabels, &intstr.IntOrString{Type: intstr.String, StrVal: "serve-80-tcp"}, &protocolTCP) + CreatePolicy(k8s, policy, nsX) + + reachability := NewReachability(model.AllPods(), true) + // disallow all traffic from the x or z namespaces + reachability.ExpectPeer(&Peer{Namespace: nsX}, &Peer{Namespace: nsX, Pod: "a"}, false) + reachability.ExpectPeer(&Peer{Namespace: nsZ}, &Peer{Namespace: nsX, Pod: "a"}, false) + + ginkgo.By("Verify that port 80 is allowed for namespace y") + ValidateOrFail(k8s, model, &TestCase{ToPort: 80, Protocol: v1.ProtocolTCP, Reachability: reachability}) + + ginkgo.By("Verify that port 81 is blocked for all namespaces including y") + reachabilityFAIL := NewReachability(model.AllPods(), true) + reachabilityFAIL.ExpectAllIngress(NewPodString(nsX, "a"), false) + ValidateOrFail(k8s, model, &TestCase{ToPort: 81, Protocol: v1.ProtocolTCP, Reachability: reachabilityFAIL}) + }) + + ginkgo.It("should allow egress access on one named port [Feature:NetworkPolicy]", func() { + ginkgo.By("validating egress from port 81 to port 80") + policy := GetAllowEgressByPort("allow-egress", &intstr.IntOrString{Type: intstr.String, StrVal: "serve-80-tcp"}) + nsX, _, _, model, k8s := getK8SModel(f) + CreatePolicy(k8s, policy, nsX) + + reachabilityPort80 := NewReachability(model.AllPods(), true) + ValidateOrFail(k8s, model, &TestCase{ToPort: 80, Protocol: v1.ProtocolTCP, Reachability: reachabilityPort80}) + + // meanwhile no traffic over 81 should work, since our egress policy is on 80 + reachabilityPort81 := NewReachability(model.AllPods(), true) + reachabilityPort81.ExpectPeer(&Peer{Namespace: nsX}, &Peer{}, false) + ValidateOrFail(k8s, model, &TestCase{ToPort: 81, Protocol: v1.ProtocolTCP, Reachability: reachabilityPort81}) + }) + + ginkgo.It("should enforce updated policy [Feature:NetworkPolicy]", func() { + ginkgo.By("Using the simplest possible mutation: start with allow all, then switch to deny all") + // part 1) allow all + policy := GetAllowIngress("allow-all-mutate-to-deny-all") + nsX, _, _, model, k8s := getK8SModel(f) + CreatePolicy(k8s, policy, nsX) + + reachability := NewReachability(model.AllPods(), true) + ValidateOrFail(k8s, model, &TestCase{ToPort: 81, Protocol: v1.ProtocolTCP, Reachability: reachability}) + + // part 2) update the policy to deny all + policy.Spec.Ingress = []networkingv1.NetworkPolicyIngressRule{} + UpdatePolicy(k8s, policy, nsX) + + reachabilityDeny := NewReachability(model.AllPods(), true) + reachabilityDeny.ExpectPeer(&Peer{}, &Peer{Namespace: nsX}, false) + ValidateOrFail(k8s, model, &TestCase{ToPort: 81, Protocol: v1.ProtocolTCP, Reachability: reachabilityDeny}) + }) + + ginkgo.It("should allow ingress access from updated namespace [Feature:NetworkPolicy]", func() { + nsX, nsY, _, model, k8s := getK8SModel(f) + defer ResetNamespaceLabels(k8s, nsY) + + allowedLabels := &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "ns2": "updated", + }, + } + policy := GetAllowIngressByNamespace("allow-client-a-via-ns-selector", map[string]string{"pod": "a"}, allowedLabels) + CreatePolicy(k8s, policy, nsX) + + reachability := NewReachability(model.AllPods(), true) + reachability.ExpectAllIngress(NewPodString(nsX, "a"), false) + ValidateOrFail(k8s, model, &TestCase{ToPort: 80, Protocol: v1.ProtocolTCP, Reachability: reachability}) + + // add a new label, we'll remove it after this test is completed + updatedLabels := map[string]string{ + "ns": nsY, + "ns2": "updated", + } + UpdateNamespaceLabels(k8s, nsY, updatedLabels) + + // anything from namespace 'y' should be able to get to x/a + reachabilityWithLabel := NewReachability(model.AllPods(), true) + reachabilityWithLabel.ExpectAllIngress(NewPodString(nsX, "a"), false) + reachabilityWithLabel.ExpectPeer(&Peer{Namespace: nsY}, &Peer{}, true) + ValidateOrFail(k8s, model, &TestCase{ToPort: 80, Protocol: v1.ProtocolTCP, Reachability: reachabilityWithLabel}) + }) + + ginkgo.It("should allow ingress access from updated pod [Feature:NetworkPolicy]", func() { + nsX, _, _, model, k8s := getK8SModel(f) + podXB, err := model.FindPod(nsX, "b") + framework.ExpectNoError(err, "find pod x/b") + defer ResetPodLabels(k8s, podXB) + + // add a new label, we'll remove it after this test is done + matchLabels := map[string]string{"pod": "b", "pod2": "updated"} + allowedLabels := &metav1.LabelSelector{MatchLabels: matchLabels} + policy := GetAllowIngressByPod("allow-client-a-via-pod-selector", map[string]string{"pod": "a"}, allowedLabels) + CreatePolicy(k8s, policy, nsX) + + reachability := NewReachability(model.AllPods(), true) + reachability.ExpectAllIngress(NewPodString(nsX, "a"), false) + ValidateOrFail(k8s, model, &TestCase{ToPort: 80, Protocol: v1.ProtocolTCP, Reachability: reachability}) + + // now update label in x namespace and pod b + AddPodLabels(k8s, podXB, matchLabels) + + ginkgo.By("x/b is able to reach x/a when label is updated") + + reachabilityWithLabel := NewReachability(model.AllPods(), true) + reachabilityWithLabel.ExpectAllIngress(NewPodString(nsX, "a"), false) + reachabilityWithLabel.Expect(NewPodString(nsX, "b"), NewPodString(nsX, "a"), true) + ValidateOrFail(k8s, model, &TestCase{ToPort: 80, Protocol: v1.ProtocolTCP, Reachability: reachabilityWithLabel}) + }) + + ginkgo.It("should deny ingress from pods on other namespaces [Feature:NetworkPolicy]", func() { + nsX, nsY, nsZ, model, k8s := getK8SModel(f) + + policy := GetDenyIngressEmptyPeerSelector("deny-empty-policy") + CreatePolicy(k8s, policy, nsX) + + reachability := NewReachability(model.AllPods(), true) + reachability.ExpectPeer(&Peer{Namespace: nsY}, &Peer{Namespace: nsX}, false) + reachability.ExpectPeer(&Peer{Namespace: nsZ}, &Peer{Namespace: nsX}, false) + + ValidateOrFail(k8s, model, &TestCase{ToPort: 80, Protocol: v1.ProtocolTCP, Reachability: reachability}) + }) + + ginkgo.It("should deny ingress access to updated pod [Feature:NetworkPolicy]", func() { + nsX, _, _, model, k8s := getK8SModel(f) + podXA, err := model.FindPod(nsX, "a") + framework.ExpectNoError(err, "find pod x/a") + defer ResetPodLabels(k8s, podXA) + + policy := GetDenyIngressForTarget(metav1.LabelSelector{MatchLabels: map[string]string{"target": "isolated"}}) + CreatePolicy(k8s, policy, nsX) + + ginkgo.By("Verify that everything can reach x/a") + reachability := NewReachability(model.AllPods(), true) + ValidateOrFail(k8s, model, &TestCase{ToPort: 80, Protocol: v1.ProtocolTCP, Reachability: reachability}) + + AddPodLabels(k8s, podXA, map[string]string{"target": "isolated"}) + + reachabilityIsolated := NewReachability(model.AllPods(), true) + reachabilityIsolated.ExpectAllIngress(NewPodString(nsX, "a"), false) + ValidateOrFail(k8s, model, &TestCase{ToPort: 80, Protocol: v1.ProtocolTCP, Reachability: reachabilityIsolated}) + }) + + ginkgo.It("should deny egress from pods based on PodSelector [Feature:NetworkPolicy] ", func() { + nsX, _, _, model, k8s := getK8SModel(f) + policy := GetDenyEgressForTarget("deny-egress-pod-a", metav1.LabelSelector{MatchLabels: map[string]string{"pod": "a"}}) + CreatePolicy(k8s, policy, nsX) + + reachability := NewReachability(model.AllPods(), true) + reachability.ExpectAllEgress(NewPodString(nsX, "a"), false) + + ValidateOrFail(k8s, model, &TestCase{ToPort: 80, Protocol: v1.ProtocolTCP, Reachability: reachability}) + }) + + ginkgo.It("should deny egress from all pods in a namespace [Feature:NetworkPolicy] ", func() { + nsX, _, _, model, k8s := getK8SModel(f) + policy := GetDenyEgress("deny-egress-ns-x") + CreatePolicy(k8s, policy, nsX) + + reachability := NewReachability(model.AllPods(), true) + reachability.ExpectPeer(&Peer{Namespace: nsX}, &Peer{}, false) + + ValidateOrFail(k8s, model, &TestCase{ToPort: 80, Protocol: v1.ProtocolTCP, Reachability: reachability}) + }) + + ginkgo.It("should work with Ingress, Egress specified together [Feature:NetworkPolicy]", func() { + allowedPodLabels := &metav1.LabelSelector{MatchLabels: map[string]string{"pod": "b"}} + policy := GetAllowIngressByPod("allow-client-a-via-pod-selector", map[string]string{"pod": "a"}, allowedPodLabels) + // add an egress rule on to it... + + policy.Spec.Egress = []networkingv1.NetworkPolicyEgressRule{ + { + Ports: []networkingv1.NetworkPolicyPort{ + { + // dont use named ports + Port: &intstr.IntOrString{Type: intstr.Int, IntVal: 80}, + }, + { + Protocol: &protocolUDP, + Port: &intstr.IntOrString{Type: intstr.Int, IntVal: 53}, + }, + }, + }, + } + policy.Spec.PolicyTypes = []networkingv1.PolicyType{networkingv1.PolicyTypeEgress, networkingv1.PolicyTypeIngress} + nsX, _, _, model, k8s := getK8SModel(f) + CreatePolicy(k8s, policy, nsX) + + reachabilityPort80 := NewReachability(model.AllPods(), true) + reachabilityPort80.ExpectAllIngress(NewPodString(nsX, "a"), false) + reachabilityPort80.Expect(NewPodString(nsX, "b"), NewPodString(nsX, "a"), true) + ValidateOrFail(k8s, model, &TestCase{ToPort: 80, Protocol: v1.ProtocolTCP, Reachability: reachabilityPort80}) + + ginkgo.By("validating that port 81 doesn't work") + // meanwhile no egress traffic on 81 should work, since our egress policy is on 80 + reachabilityPort81 := NewReachability(model.AllPods(), true) + reachabilityPort81.ExpectAllIngress(NewPodString(nsX, "a"), false) + reachabilityPort81.ExpectAllEgress(NewPodString(nsX, "a"), false) + reachabilityPort81.Expect(NewPodString(nsX, "b"), NewPodString(nsX, "a"), true) + ValidateOrFail(k8s, model, &TestCase{ToPort: 81, Protocol: v1.ProtocolTCP, Reachability: reachabilityPort81}) + }) + + ginkgo.It("should support denying of egress traffic on the client side (even if the server explicitly allows this traffic) [Feature:NetworkPolicy]", func() { + // x/a --> y/a and y/b + // Egress allowed to y/a only. Egress to y/b should be blocked + // Ingress on y/a and y/b allow traffic from x/a + // Expectation: traffic from x/a to y/a allowed only, traffic from x/a to y/b denied by egress policy + + nsX, nsY, _, model, k8s := getK8SModel(f) + + // Building egress policy for x/a to y/a only + allowedEgressNamespaces := &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "ns": nsY, + }, + } + allowedEgressPods := &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod": "a", + }, + } + egressPolicy := GetAllowEgressByNamespaceAndPod("allow-to-ns-y-pod-a", map[string]string{"pod": "a"}, allowedEgressNamespaces, allowedEgressPods) + CreatePolicy(k8s, egressPolicy, nsX) + + // Creating ingress policy to allow from x/a to y/a and y/b + allowedIngressNamespaces := &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "ns": nsX, + }, + } + allowedIngressPods := &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod": "a", + }, + } + allowIngressPolicyPodA := GetAllowIngressByNamespaceAndPod("allow-from-xa-on-ya-match-selector", map[string]string{"pod": "a"}, allowedIngressNamespaces, allowedIngressPods) + allowIngressPolicyPodB := GetAllowIngressByNamespaceAndPod("allow-from-xa-on-yb-match-selector", map[string]string{"pod": "b"}, allowedIngressNamespaces, allowedIngressPods) + + CreatePolicy(k8s, allowIngressPolicyPodA, nsY) + CreatePolicy(k8s, allowIngressPolicyPodB, nsY) + + // While applying the policies, traffic needs to be allowed by both egress and ingress rules. + // Egress rules only + // xa xb xc ya yb yc za zb zc + // xa X X X . *X* X X X X + // xb . . . . . . . . . + // xc . . . . . . . . . + // ya . . . . . . . . . + // yb . . . . . . . . . + // yc . . . . . . . . . + // za . . . . . . . . . + // zb . . . . . . . . . + // zc . . . . . . . . . + // Ingress rules only + // xa xb xc ya yb yc za zb zc + // xa . . . *.* . . . . . + // xb . . X X . . . . . + // xc . . X X . . . . . + // ya . . X X . . . . . + // yb . . X X . . . . . + // yc . . X X . . . . . + // za . . X X . . . . . + // zb . . X X . . . . . + // zc . . X X . . . . . + // In the resulting truth table, connections from x/a should only be allowed to y/a. x/a to y/b should be blocked by the egress on x/a. + // Expected results + // xa xb xc ya yb yc za zb zc + // xa X X X . *X* X X X X + // xb . . . X X . . . . + // xc . . . X X . . . . + // ya . . . X X . . . . + // yb . . . X X . . . . + // yc . . . X X . . . . + // za . . . X X . . . . + // zb . . . X X . . . . + // zc . . . X X . . . . + + reachability := NewReachability(model.AllPods(), true) + // Default all traffic flows. + // Exception: x/a can only egress to y/a, others are false + // Exception: y/a can only allow ingress from x/a, others are false + // Exception: y/b has no allowed traffic (due to limit on x/a egress) + + reachability.ExpectPeer(&Peer{Namespace: nsX, Pod: "a"}, &Peer{}, false) + reachability.ExpectPeer(&Peer{}, &Peer{Namespace: nsY, Pod: "a"}, false) + reachability.ExpectPeer(&Peer{Namespace: nsX, Pod: "a"}, &Peer{Namespace: nsY, Pod: "a"}, true) + reachability.ExpectPeer(&Peer{}, &Peer{Namespace: nsY, Pod: "b"}, false) + + ValidateOrFail(k8s, model, &TestCase{ToPort: 80, Protocol: v1.ProtocolTCP, Reachability: reachability}) + }) + + ginkgo.It("should enforce egress policy allowing traffic to a server in a different namespace based on PodSelector and NamespaceSelector [Feature:NetworkPolicy]", func() { + nsX, nsY, _, model, k8s := getK8SModel(f) + allowedNamespaces := &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "ns": nsY, + }, + } + allowedPods := &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod": "a", + }, + } + policy := GetAllowEgressByNamespaceAndPod("allow-to-ns-y-pod-a", map[string]string{"pod": "a"}, allowedNamespaces, allowedPods) + CreatePolicy(k8s, policy, nsX) + + reachability := NewReachability(model.AllPods(), true) + reachability.ExpectAllEgress(NewPodString(nsX, "a"), false) + reachability.Expect(NewPodString(nsX, "a"), NewPodString(nsY, "a"), true) + ValidateOrFail(k8s, model, &TestCase{ToPort: 80, Protocol: v1.ProtocolTCP, Reachability: reachability}) + }) + + ginkgo.It("should enforce ingress policy allowing any port traffic to a server on a specific protocol [Feature:NetworkPolicy] [Feature:UDP]", func() { + nsX, _, _, model, k8s := getK8SModel(f) + + policy := GetAllowIngressByProtocol("allow-ingress-by-proto", map[string]string{"pod": "a"}, &protocolTCP) + CreatePolicy(k8s, policy, nsX) + + reachabilityTCP := NewReachability(model.AllPods(), true) + ValidateOrFail(k8s, model, &TestCase{ToPort: 80, Protocol: v1.ProtocolTCP, Reachability: reachabilityTCP}) + + reachabilityUDP := NewReachability(model.AllPods(), true) + reachabilityUDP.ExpectPeer(&Peer{}, &Peer{Namespace: nsX, Pod: "a"}, false) + ValidateOrFail(k8s, model, &TestCase{ToPort: 80, Protocol: v1.ProtocolUDP, Reachability: reachabilityUDP}) + }) + + ginkgo.It("should enforce multiple ingress policies with ingress allow-all policy taking precedence [Feature:NetworkPolicy]", func() { + nsX, _, _, model, k8s := getK8SModel(f) + policyAllowOnlyPort80 := GetAllowIngressByPort("allow-ingress-port-80", &intstr.IntOrString{Type: intstr.Int, IntVal: 80}) + CreatePolicy(k8s, policyAllowOnlyPort80, nsX) + + ginkgo.By("The policy targets port 80 -- so let's make sure traffic on port 81 is blocked") + + reachability := NewReachability(model.AllPods(), true) + reachability.ExpectPeer(&Peer{}, &Peer{Namespace: nsX}, false) + ValidateOrFail(k8s, model, &TestCase{ToPort: 81, Protocol: v1.ProtocolTCP, Reachability: reachability}) + + ginkgo.By("Allowing all ports") + + policyAllowAll := GetAllowIngress("allow-ingress") + CreatePolicy(k8s, policyAllowAll, nsX) + + reachabilityAll := NewReachability(model.AllPods(), true) + ValidateOrFail(k8s, model, &TestCase{ToPort: 81, Protocol: v1.ProtocolTCP, Reachability: reachabilityAll}) + }) + + ginkgo.It("should enforce multiple egress policies with egress allow-all policy taking precedence [Feature:NetworkPolicy]", func() { + policyAllowPort80 := GetAllowEgressByPort("allow-egress-port-80", &intstr.IntOrString{Type: intstr.Int, IntVal: 80}) + nsX, _, _, model, k8s := getK8SModel(f) + CreatePolicy(k8s, policyAllowPort80, nsX) + + ginkgo.By("Making sure ingress doesn't work other than port 80") + + reachability := NewReachability(model.AllPods(), true) + reachability.ExpectPeer(&Peer{Namespace: nsX}, &Peer{}, false) + ValidateOrFail(k8s, model, &TestCase{ToPort: 81, Protocol: v1.ProtocolTCP, Reachability: reachability}) + + ginkgo.By("Allowing all ports") + + policyAllowAll := GetAllowEgress() + CreatePolicy(k8s, policyAllowAll, nsX) + + reachabilityAll := NewReachability(model.AllPods(), true) + ValidateOrFail(k8s, model, &TestCase{ToPort: 81, Protocol: v1.ProtocolTCP, Reachability: reachabilityAll}) + }) + + ginkgo.It("should stop enforcing policies after they are deleted [Feature:NetworkPolicy]", func() { + ginkgo.By("Creating a network policy for the server which denies all traffic.") + + // Deny all traffic into and out of "x". + policy := GetDenyAll("deny-all") + nsX, _, _, model, k8s := getK8SModel(f) + CreatePolicy(k8s, policy, nsX) + reachability := NewReachability(model.AllPods(), true) + + // Expect all traffic into, and out of "x" to be False. + reachability.ExpectPeer(&Peer{Namespace: nsX}, &Peer{}, false) + reachability.ExpectPeer(&Peer{}, &Peer{Namespace: nsX}, false) + ValidateOrFail(k8s, model, &TestCase{ToPort: 80, Protocol: v1.ProtocolTCP, Reachability: reachability}) + + err := k8s.cleanNetworkPolicies(model.NamespaceNames) + time.Sleep(3 * time.Second) // TODO we can remove this eventually, its just a hack to keep CI stable. + framework.ExpectNoError(err, "unable to clean network policies") + + // Now the policy is deleted, we expect all connectivity to work again. + reachabilityAll := NewReachability(model.AllPods(), true) + ValidateOrFail(k8s, model, &TestCase{ToPort: 80, Protocol: v1.ProtocolTCP, Reachability: reachabilityAll}) + }) + + // TODO, figure out how the next 3 tests should work with dual stack : do we need a different abstraction then just "podIP"? + + ginkgo.It("should allow egress access to server in CIDR block [Feature:NetworkPolicy]", func() { + // Getting podServer's status to get podServer's IP, to create the CIDR + nsX, nsY, _, model, k8s := getK8SModel(f) + podList, err := f.ClientSet.CoreV1().Pods(nsY).List(context.TODO(), metav1.ListOptions{LabelSelector: "pod=b"}) + framework.ExpectNoError(err, "Failing to list pods in namespace y") + pod := podList.Items[0] + + hostMask := 32 + if utilnet.IsIPv6String(pod.Status.PodIP) { + hostMask = 128 + } + podServerCIDR := fmt.Sprintf("%s/%d", pod.Status.PodIP, hostMask) + policyAllowCIDR := GetAllowEgressByCIDR("a", podServerCIDR) + CreatePolicy(k8s, policyAllowCIDR, nsX) + + reachability := NewReachability(model.AllPods(), true) + reachability.ExpectAllEgress(NewPodString(nsX, "a"), false) + reachability.Expect(NewPodString(nsX, "a"), NewPodString(nsY, "b"), true) + ValidateOrFail(k8s, model, &TestCase{ToPort: 80, Protocol: v1.ProtocolTCP, Reachability: reachability}) + }) + + ginkgo.It("should enforce except clause while egress access to server in CIDR block [Feature:NetworkPolicy]", func() { + // Getting podServer's status to get podServer's IP, to create the CIDR with except clause + nsX, _, _, model, k8s := getK8SModel(f) + podList, err := f.ClientSet.CoreV1().Pods(nsX).List(context.TODO(), metav1.ListOptions{LabelSelector: "pod=a"}) + framework.ExpectNoError(err, "Failing to find pod x/a") + podA := podList.Items[0] + + podServerAllowCIDR := fmt.Sprintf("%s/4", podA.Status.PodIP) + + podList, err = f.ClientSet.CoreV1().Pods(nsX).List(context.TODO(), metav1.ListOptions{LabelSelector: "pod=b"}) + framework.ExpectNoError(err, "Failing to find pod x/b") + podB := podList.Items[0] + + hostMask := 32 + if utilnet.IsIPv6String(podB.Status.PodIP) { + hostMask = 128 + } + podServerExceptList := []string{fmt.Sprintf("%s/%d", podB.Status.PodIP, hostMask)} + + policyAllowCIDR := GetAllowEgressByCIDRExcept("a", podServerAllowCIDR, podServerExceptList) + + CreatePolicy(k8s, policyAllowCIDR, nsX) + + reachability := NewReachability(model.AllPods(), true) + reachability.Expect(NewPodString(nsX, "a"), NewPodString(nsX, "b"), false) + + ValidateOrFail(k8s, model, &TestCase{ToPort: 80, Protocol: v1.ProtocolTCP, Reachability: reachability}) + }) + + ginkgo.It("should ensure an IP overlapping both IPBlock.CIDR and IPBlock.Except is allowed [Feature:NetworkPolicy]", func() { + // Getting podServer's status to get podServer's IP, to create the CIDR with except clause + nsX, _, _, model, k8s := getK8SModel(f) + podList, err := f.ClientSet.CoreV1().Pods(nsX).List(context.TODO(), metav1.ListOptions{LabelSelector: "pod=a"}) + framework.ExpectNoError(err, "Failing to find pod x/a") + podA := podList.Items[0] + + podList, err = f.ClientSet.CoreV1().Pods(nsX).List(context.TODO(), metav1.ListOptions{LabelSelector: "pod=b"}) + framework.ExpectNoError(err, "Failing to find pod x/b") + podB := podList.Items[0] + + // Exclude podServer's IP with an Except clause + hostMask := 32 + if utilnet.IsIPv6String(podB.Status.PodIP) { + hostMask = 128 + } + + podServerAllowCIDR := fmt.Sprintf("%s/4", podA.Status.PodIP) + podServerExceptList := []string{fmt.Sprintf("%s/%d", podB.Status.PodIP, hostMask)} + policyAllowCIDR := GetAllowEgressByCIDRExcept("a", podServerAllowCIDR, podServerExceptList) + CreatePolicy(k8s, policyAllowCIDR, nsX) + + reachability := NewReachability(model.AllPods(), true) + reachability.Expect(NewPodString(nsX, "a"), NewPodString(nsX, "b"), false) + + ValidateOrFail(k8s, model, &TestCase{ToPort: 80, Protocol: v1.ProtocolTCP, Reachability: reachability}) + + podBIP := fmt.Sprintf("%s/%d", podB.Status.PodIP, hostMask) + //// Create NetworkPolicy which allows access to the podServer using podServer's IP in allow CIDR. + allowPolicy := GetAllowEgressByCIDR("a", podBIP) + // SHOULD THIS BE UPDATE OR CREATE JAY TESTING 10/31 + UpdatePolicy(k8s, allowPolicy, nsX) + + reachabilityAllow := NewReachability(model.AllPods(), true) + reachabilityAllow.ExpectAllEgress(NewPodString(nsX, "a"), false) + reachabilityAllow.Expect(NewPodString(nsX, "a"), NewPodString(nsX, "b"), true) + + ValidateOrFail(k8s, model, &TestCase{ToPort: 80, Protocol: v1.ProtocolTCP, Reachability: reachabilityAllow}) + }) + + ginkgo.It("should enforce policies to check ingress and egress policies can be controlled independently based on PodSelector [Feature:NetworkPolicy]", func() { + /* + Test steps: + 1. Verify every pod in every namespace can talk to each other + - including a -> b and b -> a + 2. Create a policy to allow egress a -> b (target = a) + 3. Create a policy to *deny* ingress b -> a (target = a) + 4. Verify a -> b allowed; b -> a blocked + */ + targetLabels := map[string]string{"pod": "a"} + + ginkgo.By("Creating a network policy for pod-a which allows Egress traffic to pod-b.") + + allowEgressPolicy := GetAllowEgressForTarget(metav1.LabelSelector{MatchLabels: targetLabels}) + nsX, _, _, model, k8s := getK8SModel(f) + CreatePolicy(k8s, allowEgressPolicy, nsX) + + allowEgressReachability := NewReachability(model.AllPods(), true) + ValidateOrFail(k8s, model, &TestCase{ToPort: 80, Protocol: v1.ProtocolTCP, Reachability: allowEgressReachability}) + + ginkgo.By("Creating a network policy for pod-a that denies traffic from pod-b.") + + denyAllIngressPolicy := GetDenyIngressForTarget(metav1.LabelSelector{MatchLabels: targetLabels}) + CreatePolicy(k8s, denyAllIngressPolicy, nsX) + + denyIngressToXReachability := NewReachability(model.AllPods(), true) + denyIngressToXReachability.ExpectAllIngress(NewPodString(nsX, "a"), false) + ValidateOrFail(k8s, model, &TestCase{ToPort: 80, Protocol: v1.ProtocolTCP, Reachability: denyIngressToXReachability}) + }) + + ginkgo.It("should not allow access by TCP when a policy specifies only SCTP [Feature:NetworkPolicy] [Feature:SCTP]", func() { + policy := GetAllowIngressOnProtocolByPort("allow-only-sctp-ingress-on-port-81", v1.ProtocolSCTP, map[string]string{"pod": "a"}, &intstr.IntOrString{IntVal: 81}) + nsX, _, _, model, k8s := getK8SModel(f) + CreatePolicy(k8s, policy, nsX) + + ginkgo.By("Creating a network policy for the server which allows traffic only via SCTP on port 81.") + + // Probing with TCP, so all traffic should be dropped. + reachability := NewReachability(model.AllPods(), true) + reachability.ExpectAllIngress(NewPodString(nsX, "a"), false) + ValidateOrFail(k8s, model, &TestCase{ToPort: 81, Protocol: v1.ProtocolTCP, Reachability: reachability}) + }) + + ginkgo.It("should not allow access by TCP when a policy specifies only UDP [Feature:NetworkPolicy] [Feature:UDP]", func() { + policy := GetAllowIngressOnProtocolByPort("allow-only-udp-ingress-on-port-81", v1.ProtocolUDP, map[string]string{"pod": "a"}, &intstr.IntOrString{IntVal: 81}) + nsX, _, _, model, k8s := getK8SModel(f) + CreatePolicy(k8s, policy, nsX) + + ginkgo.By("Creating a network policy for the server which allows traffic only via UDP on port 81.") + + // Probing with TCP, so all traffic should be dropped. + reachability := NewReachability(model.AllPods(), true) + reachability.ExpectAllIngress(NewPodString(nsX, "a"), false) + ValidateOrFail(k8s, model, &TestCase{ToPort: 81, Protocol: v1.ProtocolTCP, Reachability: reachability}) + }) + }) +}) + +var _ = common.SIGDescribe("Netpol [Feature:UDPConnectivity][LinuxOnly]", func() { + f := framework.NewDefaultFramework("udp-network-policy") + + ginkgo.BeforeEach(func() { + // Windows does not support UDP testing via agnhost. + e2eskipper.SkipIfNodeOSDistroIs("windows") + }) + + ginkgo.Context("NetworkPolicy between server and client using UDP", func() { + ginkgo.BeforeEach(func() { + initializeResourcesByFixedNS(f) + }) + + ginkgo.AfterEach(func() { + if !useFixedNamespaces { + _, _, _, model, k8s := getK8SModel(f) + framework.ExpectNoError(k8s.deleteNamespaces(model.NamespaceNames), "unable to clean up UDP netpol namespaces") + } + }) + + ginkgo.It("should support a 'default-deny-ingress' policy [Feature:NetworkPolicy]", func() { + nsX, _, _, model, k8s := getK8SModel(f) + policy := GetDenyIngress("deny-all") + CreatePolicy(k8s, policy, nsX) + + reachability := NewReachability(model.AllPods(), true) + reachability.ExpectPeer(&Peer{}, &Peer{Namespace: nsX}, false) + + ValidateOrFail(k8s, model, &TestCase{ToPort: 80, Protocol: v1.ProtocolUDP, Reachability: reachability}) + }) + + ginkgo.It("should enforce policy based on Ports [Feature:NetworkPolicy]", func() { + ginkgo.By("Creating a network policy allowPort81Policy which only allows allow listed namespaces (y) to connect on exactly one port (81)") + nsX, nsY, nsZ, model, k8s := getK8SModel(f) + allowedLabels := &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "ns": nsY, + }, + } + + allowPort81Policy := GetAllowIngressByNamespaceAndPort("allow-ingress-on-port-81-ns-x", map[string]string{"pod": "a"}, allowedLabels, &intstr.IntOrString{IntVal: 81}, &protocolUDP) + CreatePolicy(k8s, allowPort81Policy, nsX) + + reachability := NewReachability(model.AllPods(), true) + reachability.ExpectPeer(&Peer{Namespace: nsX}, &Peer{Namespace: nsX, Pod: "a"}, false) + reachability.ExpectPeer(&Peer{Namespace: nsZ}, &Peer{Namespace: nsX, Pod: "a"}, false) + + ValidateOrFail(k8s, model, &TestCase{ToPort: 81, Protocol: v1.ProtocolUDP, Reachability: reachability}) + }) + + ginkgo.It("should enforce policy to allow traffic only from a pod in a different namespace based on PodSelector and NamespaceSelector [Feature:NetworkPolicy]", func() { + nsX, nsY, _, model, k8s := getK8SModel(f) + allowedNamespaces := &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "ns": nsY, + }, + } + allowedPods := &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod": "a", + }, + } + policy := GetAllowIngressByNamespaceAndPod("allow-ns-y-pod-a-via-namespace-pod-selector", map[string]string{"pod": "a"}, allowedNamespaces, allowedPods) + CreatePolicy(k8s, policy, nsX) + + reachability := NewReachability(model.AllPods(), true) + reachability.ExpectAllIngress(NewPodString(nsX, "a"), false) + reachability.Expect(NewPodString(nsY, "a"), NewPodString(nsX, "a"), true) + + ValidateOrFail(k8s, model, &TestCase{ToPort: 80, Protocol: v1.ProtocolUDP, Reachability: reachability}) + }) + }) +}) + +var _ = common.SIGDescribe("Netpol [Feature:SCTPConnectivity][LinuxOnly][Disruptive]", func() { + f := framework.NewDefaultFramework("sctp-network-policy") + + ginkgo.BeforeEach(func() { + // Windows does not support network policies. + e2eskipper.SkipIfNodeOSDistroIs("windows") + }) + + ginkgo.Context("NetworkPolicy between server and client using SCTP", func() { + ginkgo.BeforeEach(func() { + addSCTPContainers = true + initializeResourcesByFixedNS(f) + }) + + ginkgo.AfterEach(func() { + if !useFixedNamespaces { + _, _, _, model, k8s := getK8SModel(f) + framework.ExpectNoError(k8s.deleteNamespaces(model.NamespaceNames), "unable to clean up SCTP netpol namespaces") + } + }) + + ginkgo.It("should support a 'default-deny-ingress' policy [Feature:NetworkPolicy]", func() { + nsX, _, _, model, k8s := getK8SModel(f) + policy := GetDenyIngress("deny-all") + CreatePolicy(k8s, policy, nsX) + + reachability := NewReachability(model.AllPods(), true) + reachability.ExpectPeer(&Peer{}, &Peer{Namespace: nsX}, false) + + ValidateOrFail(k8s, model, &TestCase{ToPort: 80, Protocol: v1.ProtocolSCTP, Reachability: reachability}) + }) + + ginkgo.It("should enforce policy based on Ports [Feature:NetworkPolicy]", func() { + ginkgo.By("Creating a network allowPort81Policy which only allows allow listed namespaces (y) to connect on exactly one port (81)") + nsX, nsY, nsZ, model, k8s := getK8SModel(f) + allowedLabels := &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "ns": nsY, + }, + } + + allowPort81Policy := GetAllowIngressByNamespaceAndPort("allow-ingress-on-port-81-ns-x", map[string]string{"pod": "a"}, allowedLabels, &intstr.IntOrString{IntVal: 81}, &protocolSCTP) + CreatePolicy(k8s, allowPort81Policy, nsX) + + reachability := NewReachability(model.AllPods(), true) + reachability.ExpectPeer(&Peer{Namespace: nsX}, &Peer{Namespace: nsX, Pod: "a"}, false) + reachability.ExpectPeer(&Peer{Namespace: nsZ}, &Peer{Namespace: nsX, Pod: "a"}, false) + + ValidateOrFail(k8s, model, &TestCase{ToPort: 81, Protocol: v1.ProtocolSCTP, Reachability: reachability}) + }) + + ginkgo.It("should enforce policy to allow traffic only from a pod in a different namespace based on PodSelector and NamespaceSelector [Feature:NetworkPolicy]", func() { + nsX, nsY, _, model, k8s := getK8SModel(f) + allowedNamespaces := &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "ns": nsY, + }, + } + allowedPods := &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod": "a", + }, + } + policy := GetAllowIngressByNamespaceAndPod("allow-ns-y-pod-a-via-namespace-pod-selector", map[string]string{"pod": "a"}, allowedNamespaces, allowedPods) + CreatePolicy(k8s, policy, nsX) + + reachability := NewReachability(model.AllPods(), true) + reachability.ExpectAllIngress(NewPodString(nsX, "a"), false) + reachability.Expect(NewPodString(nsY, "a"), NewPodString(nsX, "a"), true) + + ValidateOrFail(k8s, model, &TestCase{ToPort: 80, Protocol: v1.ProtocolSCTP, Reachability: reachability}) + }) + }) +}) + +// getNamespaces returns the canonical set of namespaces used by this test, taking a root ns as input. This allows this test to run in parallel. +func getNamespaces(rootNs string) (string, string, string, []string) { + if useFixedNamespaces { + rootNs = "" + } else { + rootNs = rootNs + "-" + } + nsX := fmt.Sprintf("%sx", rootNs) + nsY := fmt.Sprintf("%sy", rootNs) + nsZ := fmt.Sprintf("%sz", rootNs) + return nsX, nsY, nsZ, []string{nsX, nsY, nsZ} +} + +// defaultModel creates a new "model" pod system under namespaces (x,y,z) which has pods a, b, and c. Thus resulting in the +// truth table matrix that is identical for all tests, comprising 81 total connections between 9 pods (x/a, x/b, x/c, ..., z/c). +func defaultModel(namespaces []string, dnsDomain string) *Model { + protocols := []v1.Protocol{v1.ProtocolTCP, v1.ProtocolUDP} + if addSCTPContainers { + protocols = append(protocols, v1.ProtocolSCTP) + } + return NewModel(namespaces, []string{"a", "b", "c"}, []int32{80, 81}, protocols, dnsDomain) +} + +// getK8sModel generates a network policy model using the framework's root namespace and cluster DNS domain. +// This function is deterministic and has no side effects, so may be safely called multiple times. +func getK8SModel(f *framework.Framework) (string, string, string, *Model, *kubeManager) { + k8s := newKubeManager(f) + rootNs := f.Namespace.GetName() + nsX, nsY, nsZ, namespaces := getNamespaces(rootNs) + + model := defaultModel(namespaces, framework.TestContext.ClusterDNSDomain) + + return nsX, nsY, nsZ, model, k8s +} + +// initializeResourcesByFixedNS uses the e2e framework to create all necessary namespace resources, cleaning up +// network policies from the namespace if useFixedNamespace is set true, avoiding policies overlap of new tests. +func initializeResourcesByFixedNS(f *framework.Framework) { + if useFixedNamespaces { + _ = initializeResources(f) + _, _, _, model, k8s := getK8SModel(f) + framework.ExpectNoError(k8s.cleanNetworkPolicies(model.NamespaceNames), "unable to clean network policies") + err := wait.Poll(waitInterval, waitTimeout, func() (done bool, err error) { + for _, ns := range model.NamespaceNames { + netpols, err := k8s.clientSet.NetworkingV1().NetworkPolicies(ns).List(context.TODO(), metav1.ListOptions{}) + framework.ExpectNoError(err, "get network policies from ns %s", ns) + if len(netpols.Items) > 0 { + return false, nil + } + } + return true, nil + }) + framework.ExpectNoError(err, "unable to wait for network policy deletion") + } else { + framework.Logf("Using %v as the default dns domain for this cluster... ", framework.TestContext.ClusterDNSDomain) + framework.ExpectNoError(initializeResources(f), "unable to initialize resources") + } +} + +// initializeResources uses the e2e framework to create all necessary namespace resources, based on the network policy +// model derived from the framework. It then waits for the resources described by the model to be up and running +// (i.e. all pods are ready and running in their namespaces). +func initializeResources(f *framework.Framework) error { + _, _, _, model, k8s := getK8SModel(f) + + framework.Logf("initializing cluster: ensuring namespaces, deployments, and pods exist and are ready") + + err := k8s.initializeCluster(model) + if err != nil { + return err + } + + framework.Logf("finished initializing cluster state") + + return k8s.waitForHTTPServers(model) +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/network/netpol/network_policy_api.go b/vendor/k8s.io/kubernetes/test/e2e/network/netpol/network_policy_api.go new file mode 100644 index 000000000000..3d64a2ac25b2 --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/network/netpol/network_policy_api.go @@ -0,0 +1,212 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package netpol + +import ( + "context" + "fmt" + "time" + + apierrors "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/apimachinery/pkg/watch" + + "github.com/onsi/ginkgo" + networkingv1 "k8s.io/api/networking/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/kubernetes/test/e2e/framework" + "k8s.io/kubernetes/test/e2e/network/common" +) + +var _ = common.SIGDescribe("Netpol API", func() { + f := framework.NewDefaultFramework("netpol") + /* + Release: v1.20 + Testname: NetworkPolicies API + Description: + - The networking.k8s.io API group MUST exist in the /apis discovery document. + - The networking.k8s.io/v1 API group/version MUST exist in the /apis/networking.k8s.io discovery document. + - The NetworkPolicies resources MUST exist in the /apis/networking.k8s.io/v1 discovery document. + - The NetworkPolicies resource must support create, get, list, watch, update, patch, delete, and deletecollection. + */ + + ginkgo.It("should support creating NetworkPolicy API operations", func() { + // Setup + ns := f.Namespace.Name + npVersion := "v1" + npClient := f.ClientSet.NetworkingV1().NetworkPolicies(ns) + npTemplate := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + GenerateName: "e2e-example-netpol", + Labels: map[string]string{ + "special-label": f.UniqueName, + }, + }, + Spec: networkingv1.NetworkPolicySpec{ + // Apply this policy to the Server + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod-name": "test-pod", + }, + }, + // Allow traffic only from client-a in namespace-b + Ingress: []networkingv1.NetworkPolicyIngressRule{{ + From: []networkingv1.NetworkPolicyPeer{{ + NamespaceSelector: &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "ns-name": "pod-b", + }, + }, + PodSelector: &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod-name": "client-a", + }, + }, + }}, + }}, + }, + } + // Discovery + ginkgo.By("getting /apis") + { + discoveryGroups, err := f.ClientSet.Discovery().ServerGroups() + framework.ExpectNoError(err) + found := false + for _, group := range discoveryGroups.Groups { + if group.Name == networkingv1.GroupName { + for _, version := range group.Versions { + if version.Version == npVersion { + found = true + break + } + } + } + } + framework.ExpectEqual(found, true, fmt.Sprintf("expected networking API group/version, got %#v", discoveryGroups.Groups)) + } + ginkgo.By("getting /apis/networking.k8s.io") + { + group := &metav1.APIGroup{} + err := f.ClientSet.Discovery().RESTClient().Get().AbsPath("/apis/networking.k8s.io").Do(context.TODO()).Into(group) + framework.ExpectNoError(err) + found := false + for _, version := range group.Versions { + if version.Version == npVersion { + found = true + break + } + } + framework.ExpectEqual(found, true, fmt.Sprintf("expected networking API version, got %#v", group.Versions)) + } + ginkgo.By("getting /apis/networking.k8s.io" + npVersion) + { + resources, err := f.ClientSet.Discovery().ServerResourcesForGroupVersion(networkingv1.SchemeGroupVersion.String()) + framework.ExpectNoError(err) + foundNetPol := false + for _, resource := range resources.APIResources { + switch resource.Name { + case "networkpolicies": + foundNetPol = true + } + } + framework.ExpectEqual(foundNetPol, true, fmt.Sprintf("expected networkpolicies, got %#v", resources.APIResources)) + } + // NetPol resource create/read/update/watch verbs + ginkgo.By("creating") + _, err := npClient.Create(context.TODO(), npTemplate, metav1.CreateOptions{}) + framework.ExpectNoError(err) + _, err = npClient.Create(context.TODO(), npTemplate, metav1.CreateOptions{}) + framework.ExpectNoError(err) + createdNetPol, err := npClient.Create(context.TODO(), npTemplate, metav1.CreateOptions{}) + framework.ExpectNoError(err) + + ginkgo.By("getting") + gottenNetPol, err := npClient.Get(context.TODO(), createdNetPol.Name, metav1.GetOptions{}) + framework.ExpectNoError(err) + framework.ExpectEqual(gottenNetPol.UID, createdNetPol.UID) + + ginkgo.By("listing") + nps, err := npClient.List(context.TODO(), metav1.ListOptions{LabelSelector: "special-label=" + f.UniqueName}) + framework.ExpectNoError(err) + framework.ExpectEqual(len(nps.Items), 3, "filtered list should have 3 items") + + ginkgo.By("watching") + framework.Logf("starting watch") + npWatch, err := npClient.Watch(context.TODO(), metav1.ListOptions{ResourceVersion: nps.ResourceVersion, LabelSelector: "special-label=" + f.UniqueName}) + framework.ExpectNoError(err) + // Test cluster-wide list and watch + clusterNPClient := f.ClientSet.NetworkingV1().NetworkPolicies("") + ginkgo.By("cluster-wide listing") + clusterNPs, err := clusterNPClient.List(context.TODO(), metav1.ListOptions{LabelSelector: "special-label=" + f.UniqueName}) + framework.ExpectNoError(err) + framework.ExpectEqual(len(clusterNPs.Items), 3, "filtered list should have 3 items") + + ginkgo.By("cluster-wide watching") + framework.Logf("starting watch") + _, err = clusterNPClient.Watch(context.TODO(), metav1.ListOptions{ResourceVersion: nps.ResourceVersion, LabelSelector: "special-label=" + f.UniqueName}) + framework.ExpectNoError(err) + + ginkgo.By("patching") + patchedNetPols, err := npClient.Patch(context.TODO(), createdNetPol.Name, types.MergePatchType, []byte(`{"metadata":{"annotations":{"patched":"true"}}}`), metav1.PatchOptions{}) + framework.ExpectNoError(err) + framework.ExpectEqual(patchedNetPols.Annotations["patched"], "true", "patched object should have the applied annotation") + + ginkgo.By("updating") + npToUpdate := patchedNetPols.DeepCopy() + npToUpdate.Annotations["updated"] = "true" + updatedNetPols, err := npClient.Update(context.TODO(), npToUpdate, metav1.UpdateOptions{}) + framework.ExpectNoError(err) + framework.ExpectEqual(updatedNetPols.Annotations["updated"], "true", "updated object should have the applied annotation") + + framework.Logf("waiting for watch events with expected annotations") + for sawAnnotations := false; !sawAnnotations; { + select { + case evt, ok := <-npWatch.ResultChan(): + framework.ExpectEqual(ok, true, "watch channel should not close") + framework.ExpectEqual(evt.Type, watch.Modified) + watchedNetPol, isNetPol := evt.Object.(*networkingv1.NetworkPolicy) + framework.ExpectEqual(isNetPol, true, fmt.Sprintf("expected NetworkPolicy, got %T", evt.Object)) + if watchedNetPol.Annotations["patched"] == "true" && watchedNetPol.Annotations["updated"] == "true" { + framework.Logf("saw patched and updated annotations") + sawAnnotations = true + npWatch.Stop() + } else { + framework.Logf("missing expected annotations, waiting: %#v", watchedNetPol.Annotations) + } + case <-time.After(wait.ForeverTestTimeout): + framework.Fail("timed out waiting for watch event") + } + } + // NetPol resource delete operations + ginkgo.By("deleting") + err = npClient.Delete(context.TODO(), createdNetPol.Name, metav1.DeleteOptions{}) + framework.ExpectNoError(err) + _, err = npClient.Get(context.TODO(), createdNetPol.Name, metav1.GetOptions{}) + framework.ExpectEqual(apierrors.IsNotFound(err), true, fmt.Sprintf("expected 404, got %#v", err)) + nps, err = npClient.List(context.TODO(), metav1.ListOptions{LabelSelector: "special-label=" + f.UniqueName}) + framework.ExpectNoError(err) + framework.ExpectEqual(len(nps.Items), 2, "filtered list should have 2 items") + + ginkgo.By("deleting a collection") + err = npClient.DeleteCollection(context.TODO(), metav1.DeleteOptions{}, metav1.ListOptions{LabelSelector: "special-label=" + f.UniqueName}) + framework.ExpectNoError(err) + nps, err = npClient.List(context.TODO(), metav1.ListOptions{LabelSelector: "special-label=" + f.UniqueName}) + framework.ExpectNoError(err) + framework.ExpectEqual(len(nps.Items), 0, "filtered list should have 0 items") + }) +}) diff --git a/vendor/k8s.io/kubernetes/test/e2e/network/netpol/policies.go b/vendor/k8s.io/kubernetes/test/e2e/network/netpol/policies.go new file mode 100644 index 000000000000..f08fb84fdf1e --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/network/netpol/policies.go @@ -0,0 +1,581 @@ +/* +Copyright 2020 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package netpol + +import ( + "fmt" + + "k8s.io/apimachinery/pkg/util/intstr" + + v1 "k8s.io/api/core/v1" + networkingv1 "k8s.io/api/networking/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// GetDenyIngress returns a default deny ingress policy. +func GetDenyIngress(name string) *networkingv1.NetworkPolicy { + return &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + }, + Spec: networkingv1.NetworkPolicySpec{ + PodSelector: metav1.LabelSelector{}, + PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeIngress}, + Ingress: []networkingv1.NetworkPolicyIngressRule{}, + }, + } +} + +// GetDenyIngressEmptyPeerSelector returns a default ingress deny policy using empty Peer selector. +func GetDenyIngressEmptyPeerSelector(name string) *networkingv1.NetworkPolicy { + return &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + }, + Spec: networkingv1.NetworkPolicySpec{ + PodSelector: metav1.LabelSelector{}, + Ingress: []networkingv1.NetworkPolicyIngressRule{ + { + From: []networkingv1.NetworkPolicyPeer{ + { + PodSelector: &metav1.LabelSelector{MatchLabels: map[string]string{}}, + }, + }, + }, + }, + }, + } +} + +// GetDenyEgress returns a default deny egress policy. +func GetDenyEgress(name string) *networkingv1.NetworkPolicy { + return &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + }, + Spec: networkingv1.NetworkPolicySpec{ + PodSelector: metav1.LabelSelector{}, + PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeEgress}, + Egress: []networkingv1.NetworkPolicyEgressRule{}, + }, + } +} + +// GetDenyEgressForTarget returns a default deny egress policy. +func GetDenyEgressForTarget(name string, targetSelector metav1.LabelSelector) *networkingv1.NetworkPolicy { + return &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + }, + Spec: networkingv1.NetworkPolicySpec{ + PodSelector: targetSelector, + PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeEgress}, + Egress: []networkingv1.NetworkPolicyEgressRule{}, + }, + } +} + +// GetRandomIngressPolicies returns "num" random policies that allow a unique:n label, i.e. +// unique:1, unique:2, and so on. Used for creating a 'background' set of policies. +func GetRandomIngressPolicies(num int) []*networkingv1.NetworkPolicy { + policies := []*networkingv1.NetworkPolicy{} + + for i := 0; i < num; i++ { + policy := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: fmt.Sprintf("allow-all-%v", i), + }, + Spec: networkingv1.NetworkPolicySpec{ + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{ + "unique": fmt.Sprintf("%v", i), + }, + }, + Ingress: []networkingv1.NetworkPolicyIngressRule{{}}, + }, + } + policies = append(policies, policy) + } + return policies +} + +// GetAllowIngress allows all ingress +func GetAllowIngress(name string) *networkingv1.NetworkPolicy { + policy := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + }, + Spec: networkingv1.NetworkPolicySpec{ + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{}, + }, + Ingress: []networkingv1.NetworkPolicyIngressRule{ + {}, + }, + }, + } + return policy +} + +// GetAllowIngressByPort allows ingress by port +func GetAllowIngressByPort(name string, port *intstr.IntOrString) *networkingv1.NetworkPolicy { + policy := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + }, + Spec: networkingv1.NetworkPolicySpec{ + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{}, + }, + Ingress: []networkingv1.NetworkPolicyIngressRule{ + { + Ports: []networkingv1.NetworkPolicyPort{ + {Port: port}, + }, + }, + }, + }, + } + return policy +} + +// GetAllowEgressByPort allows egress by port +func GetAllowEgressByPort(name string, port *intstr.IntOrString) *networkingv1.NetworkPolicy { + protocolUDP := v1.ProtocolUDP + policy := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + }, + Spec: networkingv1.NetworkPolicySpec{ + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{}, + }, + Egress: []networkingv1.NetworkPolicyEgressRule{ + { + Ports: []networkingv1.NetworkPolicyPort{ + {Port: port}, + { + Protocol: &protocolUDP, + Port: &intstr.IntOrString{Type: intstr.Int, IntVal: 53}, + }, + }, + }, + }, + PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeEgress}, + }, + } + return policy +} + +// GetDenyAll denies ingress traffic, AS WELL as egress traffic. +// - BOTH policy types must be specified +// - The Egress rule must (like the ingress default rule) be a array with 0 values. +func GetDenyAll(name string) *networkingv1.NetworkPolicy { + policy := GetDenyIngress(name) + policy.Spec.PolicyTypes = []networkingv1.PolicyType{networkingv1.PolicyTypeEgress, networkingv1.PolicyTypeIngress} + policy.Spec.Egress = []networkingv1.NetworkPolicyEgressRule{} + policy.Spec.Ingress = []networkingv1.NetworkPolicyIngressRule{} + return policy +} + +// GetDenyAllWithEgressDNS deny all egress traffic, besides DNS/UDP port +func GetDenyAllWithEgressDNS() *networkingv1.NetworkPolicy { + protocolUDP := v1.ProtocolUDP + return &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: "deny-all-tcp-allow-dns", + }, + Spec: networkingv1.NetworkPolicySpec{ + PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeEgress, networkingv1.PolicyTypeIngress}, + PodSelector: metav1.LabelSelector{}, + Ingress: []networkingv1.NetworkPolicyIngressRule{}, + Egress: []networkingv1.NetworkPolicyEgressRule{ + { + Ports: []networkingv1.NetworkPolicyPort{ + { + Protocol: &protocolUDP, + Port: &intstr.IntOrString{Type: intstr.Int, IntVal: 53}, + }, + }, + }, + }, + }, + } +} + +// GetAllowIngressByPod allows ingress by pod labels +func GetAllowIngressByPod(name string, targetLabels map[string]string, peerPodSelector *metav1.LabelSelector) *networkingv1.NetworkPolicy { + policy := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + }, + Spec: networkingv1.NetworkPolicySpec{ + PodSelector: metav1.LabelSelector{ + MatchLabels: targetLabels, + }, + Ingress: []networkingv1.NetworkPolicyIngressRule{{ + From: []networkingv1.NetworkPolicyPeer{{ + PodSelector: peerPodSelector, + }}, + }}, + }, + } + return policy +} + +// GetAllowIngressForTarget allows ingress for target +func GetAllowIngressForTarget(name string, targetLabels map[string]string) *networkingv1.NetworkPolicy { + return &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + }, + Spec: networkingv1.NetworkPolicySpec{ + PodSelector: metav1.LabelSelector{ + MatchLabels: targetLabels, + }, + PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeIngress}, + Ingress: []networkingv1.NetworkPolicyIngressRule{ + { + From: []networkingv1.NetworkPolicyPeer{ + { + PodSelector: &metav1.LabelSelector{}, + NamespaceSelector: &metav1.LabelSelector{}, + }, + }, + }, + }, + }, + } +} + +// GetDenyIngressForTarget denies all ingress for target +func GetDenyIngressForTarget(targetSelector metav1.LabelSelector) *networkingv1.NetworkPolicy { + return &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: "deny-ingress-via-label-selector", + }, + Spec: networkingv1.NetworkPolicySpec{ + PodSelector: targetSelector, + PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeIngress}, + Ingress: []networkingv1.NetworkPolicyIngressRule{}, + }, + } +} + +// GetAllowIngressByNamespace allows ingress for namespace +func GetAllowIngressByNamespace(name string, targetLabels map[string]string, peerNamespaceSelector *metav1.LabelSelector) *networkingv1.NetworkPolicy { + policy := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + }, + Spec: networkingv1.NetworkPolicySpec{ + PodSelector: metav1.LabelSelector{ + MatchLabels: targetLabels, + }, + Ingress: []networkingv1.NetworkPolicyIngressRule{{ + From: []networkingv1.NetworkPolicyPeer{{ + NamespaceSelector: peerNamespaceSelector, + }}, + }}, + }, + } + return policy +} + +// GetAllowIngressByNamespaceAndPort allows ingress for namespace AND port AND protocol +func GetAllowIngressByNamespaceAndPort(name string, targetLabels map[string]string, peerNamespaceSelector *metav1.LabelSelector, port *intstr.IntOrString, protocol *v1.Protocol) *networkingv1.NetworkPolicy { + policy := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + }, + Spec: networkingv1.NetworkPolicySpec{ + PodSelector: metav1.LabelSelector{ + MatchLabels: targetLabels, + }, + Ingress: []networkingv1.NetworkPolicyIngressRule{{ + From: []networkingv1.NetworkPolicyPeer{{ + NamespaceSelector: peerNamespaceSelector, + }}, + Ports: []networkingv1.NetworkPolicyPort{ + { + Port: port, + Protocol: protocol, + }, + }, + }}, + }, + } + return policy +} + +// GetAllowIngressByProtocol allows ingress for any ports on a specific protocol. +func GetAllowIngressByProtocol(name string, targetLabels map[string]string, protocol *v1.Protocol) *networkingv1.NetworkPolicy { + policy := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + }, + Spec: networkingv1.NetworkPolicySpec{ + PodSelector: metav1.LabelSelector{ + MatchLabels: targetLabels, + }, + Ingress: []networkingv1.NetworkPolicyIngressRule{{ + Ports: []networkingv1.NetworkPolicyPort{ + { + Protocol: protocol, + }, + }, + }}, + }, + } + return policy +} + +// GetAllowIngressByNamespaceOrPod allows ingress for pods with matching namespace OR pod labels +func GetAllowIngressByNamespaceOrPod(name string, targetLabels map[string]string, peerNamespaceSelector *metav1.LabelSelector, peerPodSelector *metav1.LabelSelector) *networkingv1.NetworkPolicy { + policy := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + }, + Spec: networkingv1.NetworkPolicySpec{ + PodSelector: metav1.LabelSelector{ + MatchLabels: targetLabels, + }, + Ingress: []networkingv1.NetworkPolicyIngressRule{{ + From: []networkingv1.NetworkPolicyPeer{ + { + NamespaceSelector: peerNamespaceSelector, + }, + { + PodSelector: peerPodSelector, + }, + }, + }}, + }, + } + return policy +} + +// GetAllowIngressByAnyPod allows ingress for pods with matching multiple pod labels +func GetAllowIngressByAnyPod(name string, targetLabels map[string]string, peersLabel []map[string]string) *networkingv1.NetworkPolicy { + policyPeers := []networkingv1.NetworkPolicyPeer{} + for _, label := range peersLabel { + policyPeers = append(policyPeers, networkingv1.NetworkPolicyPeer{ + PodSelector: &metav1.LabelSelector{MatchLabels: label}, + }) + } + + policy := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + }, + Spec: networkingv1.NetworkPolicySpec{ + PodSelector: metav1.LabelSelector{ + MatchLabels: targetLabels, + }, + Ingress: []networkingv1.NetworkPolicyIngressRule{ + { + From: policyPeers, + }, + }, + }, + } + return policy +} + +// GetAllowIngressByNamespaceAndPod allows ingress for pods with matching namespace AND pod labels +func GetAllowIngressByNamespaceAndPod(name string, targetLabels map[string]string, peerNamespaceSelector *metav1.LabelSelector, peerPodSelector *metav1.LabelSelector) *networkingv1.NetworkPolicy { + policy := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + }, + Spec: networkingv1.NetworkPolicySpec{ + PodSelector: metav1.LabelSelector{ + MatchLabels: targetLabels, + }, + Ingress: []networkingv1.NetworkPolicyIngressRule{{ + From: []networkingv1.NetworkPolicyPeer{{ + NamespaceSelector: peerNamespaceSelector, + PodSelector: peerPodSelector, + }}, + }}, + }, + } + return policy +} + +// GetAllowEgressByNamespaceAndPod allows egress for pods with matching namespace AND pod labels +func GetAllowEgressByNamespaceAndPod(name string, targetLabels map[string]string, peerNamespaceSelector *metav1.LabelSelector, peerPodSelector *metav1.LabelSelector) *networkingv1.NetworkPolicy { + protocolUDP := v1.ProtocolUDP + policy := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + }, + Spec: networkingv1.NetworkPolicySpec{ + PodSelector: metav1.LabelSelector{ + MatchLabels: targetLabels, + }, + PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeEgress}, + Egress: []networkingv1.NetworkPolicyEgressRule{ + { + To: []networkingv1.NetworkPolicyPeer{ + { + NamespaceSelector: peerNamespaceSelector, + PodSelector: peerPodSelector, + }, + }, + }, + { + Ports: []networkingv1.NetworkPolicyPort{ + { + Protocol: &protocolUDP, + Port: &intstr.IntOrString{Type: intstr.Int, IntVal: 53}, + }, + }, + }, + }, + }, + } + return policy +} + +// GetAllowEgress allows all egress +func GetAllowEgress() *networkingv1.NetworkPolicy { + return &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: "allow-egress", + }, + Spec: networkingv1.NetworkPolicySpec{ + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{}, + }, + PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeEgress}, + Egress: []networkingv1.NetworkPolicyEgressRule{{}}, + }, + } +} + +// GetAllowEgressForTarget allows all egress for a target +func GetAllowEgressForTarget(targetSelector metav1.LabelSelector) *networkingv1.NetworkPolicy { + return &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: "allow-egress-for-target", + }, + Spec: networkingv1.NetworkPolicySpec{ + PodSelector: targetSelector, + PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeEgress}, + Egress: []networkingv1.NetworkPolicyEgressRule{{}}, + }, + } +} + +// GetAllowEgressByCIDR creates an egress netpol with an ipblock +func GetAllowEgressByCIDR(podname string, podserverCIDR string) *networkingv1.NetworkPolicy { + protocolUDP := v1.ProtocolUDP + return &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: "allow-client-a-via-cidr-egress-rule", + }, + Spec: networkingv1.NetworkPolicySpec{ + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod": podname, + }, + }, + PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeEgress}, + // Allow traffic to only one CIDR block. + Egress: []networkingv1.NetworkPolicyEgressRule{ + { + To: []networkingv1.NetworkPolicyPeer{ + { + IPBlock: &networkingv1.IPBlock{ + CIDR: podserverCIDR, + }, + }, + }, + }, + { + Ports: []networkingv1.NetworkPolicyPort{ + { + Protocol: &protocolUDP, + Port: &intstr.IntOrString{Type: intstr.Int, IntVal: 53}, + }, + }, + }, + }, + }, + } +} + +// GetAllowEgressByCIDRExcept creates an egress netpol with an ipblock and except +func GetAllowEgressByCIDRExcept(podname string, podserverCIDR string, except []string) *networkingv1.NetworkPolicy { + protocolUDP := v1.ProtocolUDP + return &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: "allow-client-a-via-cidr-egress-rule", + }, + Spec: networkingv1.NetworkPolicySpec{ + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{ + "pod": podname, + }, + }, + PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeEgress}, + // Allow traffic to only one CIDR block. + Egress: []networkingv1.NetworkPolicyEgressRule{ + { + To: []networkingv1.NetworkPolicyPeer{ + { + IPBlock: &networkingv1.IPBlock{ + CIDR: podserverCIDR, + Except: except, + }, + }, + }, + }, + { + Ports: []networkingv1.NetworkPolicyPort{ + { + Protocol: &protocolUDP, + Port: &intstr.IntOrString{Type: intstr.Int, IntVal: 53}, + }, + }, + }, + }, + }, + } +} + +// GetAllowIngressOnProtocolByPort is a base network policy template which distinguishes between the types of v1.Protocol available in v1 core +func GetAllowIngressOnProtocolByPort(name string, protocol v1.Protocol, targetLabels map[string]string, portNum *intstr.IntOrString) *networkingv1.NetworkPolicy { + policy := &networkingv1.NetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + }, + Spec: networkingv1.NetworkPolicySpec{ + PodSelector: metav1.LabelSelector{ + MatchLabels: targetLabels, + }, + Ingress: []networkingv1.NetworkPolicyIngressRule{{ + Ports: []networkingv1.NetworkPolicyPort{{ + Port: portNum, + Protocol: &protocol, + }}, + }}, + }, + } + return policy +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/network/netpol/probe.go b/vendor/k8s.io/kubernetes/test/e2e/network/netpol/probe.go new file mode 100644 index 000000000000..479980c83fb7 --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/network/netpol/probe.go @@ -0,0 +1,100 @@ +/* +Copyright 2020 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package netpol + +import ( + "github.com/onsi/ginkgo" + v1 "k8s.io/api/core/v1" + "k8s.io/kubernetes/test/e2e/framework" +) + +// ProbeJob packages the data for the input of a pod->pod connectivity probe +type ProbeJob struct { + PodFrom *Pod + PodTo *Pod + ToPort int + ToPodDNSDomain string + Protocol v1.Protocol +} + +// ProbeJobResults packages the data for the results of a pod->pod connectivity probe +type ProbeJobResults struct { + Job *ProbeJob + IsConnected bool + Err error + Command string +} + +// ProbePodToPodConnectivity runs a series of probes in kube, and records the results in `testCase.Reachability` +func ProbePodToPodConnectivity(k8s *kubeManager, model *Model, testCase *TestCase) { + numberOfWorkers := 3 // See https://github.com/kubernetes/kubernetes/pull/97690 + allPods := model.AllPods() + size := len(allPods) * len(allPods) + jobs := make(chan *ProbeJob, size) + results := make(chan *ProbeJobResults, size) + for i := 0; i < numberOfWorkers; i++ { + go probeWorker(k8s, jobs, results) + } + for _, podFrom := range allPods { + for _, podTo := range allPods { + jobs <- &ProbeJob{ + PodFrom: podFrom, + PodTo: podTo, + ToPort: testCase.ToPort, + ToPodDNSDomain: model.DNSDomain, + Protocol: testCase.Protocol, + } + } + } + close(jobs) + + for i := 0; i < size; i++ { + result := <-results + job := result.Job + if result.Err != nil { + framework.Logf("unable to perform probe %s -> %s: %v", job.PodFrom.PodString(), job.PodTo.PodString(), result.Err) + } + testCase.Reachability.Observe(job.PodFrom.PodString(), job.PodTo.PodString(), result.IsConnected) + expected := testCase.Reachability.Expected.Get(job.PodFrom.PodString().String(), job.PodTo.PodString().String()) + if result.IsConnected != expected { + framework.Logf("Validation of %s -> %s FAILED !!!", job.PodFrom.PodString(), job.PodTo.PodString()) + framework.Logf("error %v ", result.Err) + if expected { + framework.Logf("Expected allowed pod connection was instead BLOCKED --- run '%v'", result.Command) + } else { + framework.Logf("Expected blocked pod connection was instead ALLOWED --- run '%v'", result.Command) + } + } + } +} + +// probeWorker continues polling a pod connectivity status, until the incoming "jobs" channel is closed, and writes results back out to the "results" channel. +// it only writes pass/fail status to a channel and has no failure side effects, this is by design since we do not want to fail inside a goroutine. +func probeWorker(k8s *kubeManager, jobs <-chan *ProbeJob, results chan<- *ProbeJobResults) { + defer ginkgo.GinkgoRecover() + for job := range jobs { + podFrom := job.PodFrom + connected, command, err := k8s.probeConnectivity(podFrom.Namespace, podFrom.Name, podFrom.Containers[0].Name(), job.PodTo.QualifiedServiceAddress(job.ToPodDNSDomain), job.Protocol, job.ToPort) + result := &ProbeJobResults{ + Job: job, + IsConnected: connected, + Err: err, + Command: command, + } + results <- result + } +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/network/netpol/reachability.go b/vendor/k8s.io/kubernetes/test/e2e/network/netpol/reachability.go new file mode 100644 index 000000000000..dde2effd1e41 --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/network/netpol/reachability.go @@ -0,0 +1,187 @@ +/* +Copyright 2020 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package netpol + +import ( + "fmt" + v1 "k8s.io/api/core/v1" + "k8s.io/kubernetes/test/e2e/framework" + "strings" +) + +// TestCase describes the data for a netpol test +type TestCase struct { + ToPort int + Protocol v1.Protocol + Reachability *Reachability +} + +// PodString represents a namespace 'x' + pod 'a' as "x/a". +type PodString string + +// NewPodString instantiates a PodString from the given namespace and name. +func NewPodString(namespace string, podName string) PodString { + return PodString(fmt.Sprintf("%s/%s", namespace, podName)) +} + +// String converts back to a string +func (pod PodString) String() string { + return string(pod) +} + +func (pod PodString) split() (string, string) { + pieces := strings.Split(string(pod), "/") + if len(pieces) != 2 { + framework.Failf("expected ns/pod, found %+v", pieces) + } + return pieces[0], pieces[1] +} + +// Namespace extracts the namespace +func (pod PodString) Namespace() string { + ns, _ := pod.split() + return ns +} + +// PodName extracts the pod name +func (pod PodString) PodName() string { + _, podName := pod.split() + return podName +} + +// Peer is used for matching pods by either or both of the pod's namespace and name. +type Peer struct { + Namespace string + Pod string +} + +// Matches checks whether the Peer matches the PodString: +// - an empty namespace means the namespace will always match +// - otherwise, the namespace must match the PodString's namespace +// - same goes for Pod: empty matches everything, otherwise must match exactly +func (p *Peer) Matches(pod PodString) bool { + return (p.Namespace == "" || p.Namespace == pod.Namespace()) && (p.Pod == "" || p.Pod == pod.PodName()) +} + +// Reachability packages the data for a cluster-wide connectivity probe +type Reachability struct { + Expected *TruthTable + Observed *TruthTable + Pods []*Pod +} + +// NewReachability instantiates a reachability +func NewReachability(pods []*Pod, defaultExpectation bool) *Reachability { + var podNames []string + for _, pod := range pods { + podNames = append(podNames, pod.PodString().String()) + } + r := &Reachability{ + Expected: NewTruthTableFromItems(podNames, &defaultExpectation), + Observed: NewTruthTableFromItems(podNames, nil), + Pods: pods, + } + return r +} + +// AllowLoopback expects all communication from a pod to itself to be allowed. +// In general, call it after setting up any other rules since loopback logic follows no policy. +func (r *Reachability) AllowLoopback() { + for _, pod := range r.Pods { + podName := pod.PodString().String() + r.Expected.Set(podName, podName, true) + } +} + +// Expect sets the expected value for a single observation +func (r *Reachability) Expect(from PodString, to PodString, isConnected bool) { + r.Expected.Set(string(from), string(to), isConnected) +} + +// ExpectAllIngress defines that any traffic going into the pod will be allowed/denied (true/false) +func (r *Reachability) ExpectAllIngress(pod PodString, connected bool) { + r.Expected.SetAllTo(string(pod), connected) + if !connected { + framework.Logf("Denying all traffic *to* %s", pod) + } +} + +// ExpectAllEgress defines that any traffic going out of the pod will be allowed/denied (true/false) +func (r *Reachability) ExpectAllEgress(pod PodString, connected bool) { + r.Expected.SetAllFrom(string(pod), connected) + if !connected { + framework.Logf("Denying all traffic *from* %s", pod) + } +} + +// ExpectPeer sets expected values using Peer matchers +func (r *Reachability) ExpectPeer(from *Peer, to *Peer, connected bool) { + for _, fromPod := range r.Pods { + if from.Matches(fromPod.PodString()) { + for _, toPod := range r.Pods { + if to.Matches(toPod.PodString()) { + r.Expected.Set(string(fromPod.PodString()), string(toPod.PodString()), connected) + } + } + } + } +} + +// Observe records a single connectivity observation +func (r *Reachability) Observe(fromPod PodString, toPod PodString, isConnected bool) { + r.Observed.Set(string(fromPod), string(toPod), isConnected) +} + +// Summary produces a useful summary of expected and observed data +func (r *Reachability) Summary(ignoreLoopback bool) (trueObs int, falseObs int, ignoredObs int, comparison *TruthTable) { + comparison = r.Expected.Compare(r.Observed) + if !comparison.IsComplete() { + framework.Failf("observations not complete!") + } + falseObs, trueObs, ignoredObs = 0, 0, 0 + for from, dict := range comparison.Values { + for to, val := range dict { + if ignoreLoopback && from == to { + // Never fail on loopback, because its not yet defined. + ignoredObs++ + } else if val { + trueObs++ + } else { + falseObs++ + } + } + } + return +} + +// PrintSummary prints the summary +func (r *Reachability) PrintSummary(printExpected bool, printObserved bool, printComparison bool) { + right, wrong, ignored, comparison := r.Summary(ignoreLoopback) + if ignored > 0 { + framework.Logf("warning: this test doesn't take into consideration hairpin traffic, i.e. traffic whose source and destination is the same pod: %d cases ignored", ignored) + } + framework.Logf("reachability: correct:%v, incorrect:%v, result=%t\n\n", right, wrong, wrong == 0) + if printExpected { + framework.Logf("expected:\n\n%s\n\n\n", r.Expected.PrettyPrint("")) + } + if printObserved { + framework.Logf("observed:\n\n%s\n\n\n", r.Observed.PrettyPrint("")) + } + if printComparison { + framework.Logf("comparison:\n\n%s\n\n\n", comparison.PrettyPrint("")) + } +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/network/netpol/test_helper.go b/vendor/k8s.io/kubernetes/test/e2e/network/netpol/test_helper.go new file mode 100644 index 000000000000..41fb55c0fa67 --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/network/netpol/test_helper.go @@ -0,0 +1,164 @@ +/* +Copyright 2020 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package netpol + +import ( + "context" + "time" + + "github.com/onsi/ginkgo" + networkingv1 "k8s.io/api/networking/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/kubernetes/test/e2e/framework" + "sigs.k8s.io/yaml" +) + +const ( + waitInterval = 1 * time.Second + waitTimeout = 30 * time.Second +) + +// prettyPrint a networkPolicy +func prettyPrint(policy *networkingv1.NetworkPolicy) string { + raw, err := yaml.Marshal(policy) + framework.ExpectNoError(err, "marshal network policy to yaml") + return string(raw) +} + +// CreatePolicy creates a policy in the given namespace +func CreatePolicy(k8s *kubeManager, policy *networkingv1.NetworkPolicy, namespace string) { + if isVerbose { + framework.Logf("****************************************************************") + framework.Logf("Network Policy creating %s/%s \n%s", namespace, policy.Name, prettyPrint(policy)) + framework.Logf("****************************************************************") + } + + _, err := k8s.createNetworkPolicy(namespace, policy) + framework.ExpectNoError(err, "Unable to create netpol %s/%s", namespace, policy.Name) +} + +// UpdatePolicy updates a networkpolicy +func UpdatePolicy(k8s *kubeManager, policy *networkingv1.NetworkPolicy, namespace string) { + if isVerbose { + framework.Logf("****************************************************************") + framework.Logf("Network Policy updating %s/%s \n%s", namespace, policy.Name, prettyPrint(policy)) + framework.Logf("****************************************************************") + } + + _, err := k8s.updateNetworkPolicy(namespace, policy) + framework.ExpectNoError(err, "Unable to update netpol %s/%s", namespace, policy.Name) +} + +// ValidateOrFail validates connectivity +func ValidateOrFail(k8s *kubeManager, model *Model, testCase *TestCase) { + ginkgo.By("Validating reachability matrix...") + + // 1st try + ginkgo.By("Validating reachability matrix... (FIRST TRY)") + ProbePodToPodConnectivity(k8s, model, testCase) + // 2nd try, in case first one failed + if _, wrong, _, _ := testCase.Reachability.Summary(ignoreLoopback); wrong != 0 { + framework.Logf("failed first probe %d wrong results ... retrying (SECOND TRY)", wrong) + ProbePodToPodConnectivity(k8s, model, testCase) + } + + // at this point we know if we passed or failed, print final matrix and pass/fail the test. + if _, wrong, _, _ := testCase.Reachability.Summary(ignoreLoopback); wrong != 0 { + testCase.Reachability.PrintSummary(true, true, true) + framework.Failf("Had %d wrong results in reachability matrix", wrong) + } + if isVerbose { + testCase.Reachability.PrintSummary(true, true, true) + } + framework.Logf("VALIDATION SUCCESSFUL") +} + +// UpdateNamespaceLabels sets the labels for a namespace +func UpdateNamespaceLabels(k8s *kubeManager, ns string, newNsLabel map[string]string) { + err := k8s.setNamespaceLabels(ns, newNsLabel) + framework.ExpectNoError(err, "Update namespace %s labels", ns) + err = wait.PollImmediate(waitInterval, waitTimeout, func() (done bool, err error) { + namespace, err := k8s.getNamespace(ns) + if err != nil { + return false, err + } + for key, expected := range newNsLabel { + if actual, ok := namespace.Labels[key]; !ok || (expected != actual) { + return false, nil + } + } + return true, nil + }) + framework.ExpectNoError(err, "Unable to wait for ns %s to update labels", ns) +} + +// AddPodLabels adds new labels to a deployment's template +func AddPodLabels(k8s *kubeManager, pod *Pod, newPodLabels map[string]string) { + kubePod, err := k8s.clientSet.CoreV1().Pods(pod.Namespace).Get(context.TODO(), pod.Name, metav1.GetOptions{}) + framework.ExpectNoError(err, "Unable to get pod %s/%s", pod.Namespace, pod.Name) + if kubePod.Labels == nil { + kubePod.Labels = map[string]string{} + } + for key, val := range newPodLabels { + kubePod.Labels[key] = val + } + _, err = k8s.clientSet.CoreV1().Pods(pod.Namespace).Update(context.TODO(), kubePod, metav1.UpdateOptions{}) + framework.ExpectNoError(err, "Unable to add pod %s/%s labels", pod.Namespace, pod.Name) + + err = wait.PollImmediate(waitInterval, waitTimeout, func() (done bool, err error) { + waitForPod, err := k8s.getPod(pod.Namespace, pod.Name) + if err != nil { + return false, err + } + for key, expected := range newPodLabels { + if actual, ok := waitForPod.Labels[key]; !ok || (expected != actual) { + return false, nil + } + } + return true, nil + }) + framework.ExpectNoError(err, "Unable to wait for pod %s/%s to update labels", pod.Namespace, pod.Name) +} + +// ResetNamespaceLabels resets the labels for a namespace +func ResetNamespaceLabels(k8s *kubeManager, ns string) { + UpdateNamespaceLabels(k8s, ns, (&Namespace{Name: ns}).LabelSelector()) +} + +// ResetPodLabels resets the labels for a deployment's template +func ResetPodLabels(k8s *kubeManager, pod *Pod) { + kubePod, err := k8s.clientSet.CoreV1().Pods(pod.Namespace).Get(context.TODO(), pod.Name, metav1.GetOptions{}) + framework.ExpectNoError(err, "Unable to get pod %s/%s", pod.Namespace, pod.Name) + kubePod.Labels = pod.LabelSelector() + _, err = k8s.clientSet.CoreV1().Pods(pod.Namespace).Update(context.TODO(), kubePod, metav1.UpdateOptions{}) + framework.ExpectNoError(err, "Unable to add pod %s/%s labels", pod.Namespace, pod.Name) + + err = wait.PollImmediate(waitInterval, waitTimeout, func() (done bool, err error) { + waitForPod, err := k8s.getPod(pod.Namespace, pod.Name) + if err != nil { + return false, nil + } + for key, expected := range pod.LabelSelector() { + if actual, ok := waitForPod.Labels[key]; !ok || (expected != actual) { + return false, nil + } + } + return true, nil + }) + framework.ExpectNoError(err, "Unable to wait for pod %s/%s to update labels", pod.Namespace, pod.Name) +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/network/netpol/truthtable.go b/vendor/k8s.io/kubernetes/test/e2e/network/netpol/truthtable.go new file mode 100644 index 000000000000..b34b6a6bdb5f --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/network/netpol/truthtable.go @@ -0,0 +1,171 @@ +/* +Copyright 2020 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package netpol + +import ( + "strings" + + "k8s.io/kubernetes/test/e2e/framework" +) + +// TruthTable takes in n items and maintains an n x n table of booleans for each ordered pair +type TruthTable struct { + Froms []string + Tos []string + toSet map[string]bool + Values map[string]map[string]bool +} + +// NewTruthTableFromItems creates a new truth table with items +func NewTruthTableFromItems(items []string, defaultValue *bool) *TruthTable { + return NewTruthTable(items, items, defaultValue) +} + +// NewTruthTable creates a new truth table with froms and tos +func NewTruthTable(froms []string, tos []string, defaultValue *bool) *TruthTable { + values := map[string]map[string]bool{} + for _, from := range froms { + values[from] = map[string]bool{} + for _, to := range tos { + if defaultValue != nil { + values[from][to] = *defaultValue + } + } + } + toSet := map[string]bool{} + for _, to := range tos { + toSet[to] = true + } + return &TruthTable{ + Froms: froms, + Tos: tos, + toSet: toSet, + Values: values, + } +} + +// IsComplete returns true if there's a value set for every single pair of items, otherwise it returns false. +func (tt *TruthTable) IsComplete() bool { + for _, from := range tt.Froms { + for _, to := range tt.Tos { + if _, ok := tt.Values[from][to]; !ok { + return false + } + } + } + return true +} + +// Set sets the value for from->to +func (tt *TruthTable) Set(from string, to string, value bool) { + dict, ok := tt.Values[from] + if !ok { + framework.Failf("from-key %s not found", from) + } + if _, ok := tt.toSet[to]; !ok { + framework.Failf("to-key %s not allowed", to) + } + dict[to] = value +} + +// SetAllFrom sets all values where from = 'from' +func (tt *TruthTable) SetAllFrom(from string, value bool) { + dict, ok := tt.Values[from] + if !ok { + framework.Failf("from-key %s not found", from) + } + for _, to := range tt.Tos { + dict[to] = value + } +} + +// SetAllTo sets all values where to = 'to' +func (tt *TruthTable) SetAllTo(to string, value bool) { + if _, ok := tt.toSet[to]; !ok { + framework.Failf("to-key %s not found", to) + } + for _, from := range tt.Froms { + tt.Values[from][to] = value + } +} + +// Get gets the specified value +func (tt *TruthTable) Get(from string, to string) bool { + dict, ok := tt.Values[from] + if !ok { + framework.Failf("from-key %s not found", from) + } + val, ok := dict[to] + if !ok { + framework.Failf("to-key %s not found in map (%+v)", to, dict) + } + return val +} + +// Compare is used to check two truth tables for equality, returning its +// result in the form of a third truth table. Both tables are expected to +// have identical items. +func (tt *TruthTable) Compare(other *TruthTable) *TruthTable { + if len(tt.Froms) != len(other.Froms) || len(tt.Tos) != len(other.Tos) { + framework.Failf("cannot compare tables of different dimensions") + } + for i, fr := range tt.Froms { + if other.Froms[i] != fr { + framework.Failf("cannot compare: from keys at index %d do not match (%s vs %s)", i, other.Froms[i], fr) + } + } + for i, to := range tt.Tos { + if other.Tos[i] != to { + framework.Failf("cannot compare: to keys at index %d do not match (%s vs %s)", i, other.Tos[i], to) + } + } + + values := map[string]map[string]bool{} + for from, dict := range tt.Values { + values[from] = map[string]bool{} + for to, val := range dict { + values[from][to] = val == other.Values[from][to] + } + } + return &TruthTable{ + Froms: tt.Froms, + Tos: tt.Tos, + toSet: tt.toSet, + Values: values, + } +} + +// PrettyPrint produces a nice visual representation. +func (tt *TruthTable) PrettyPrint(indent string) string { + header := indent + strings.Join(append([]string{"-\t"}, tt.Tos...), "\t") + lines := []string{header} + for _, from := range tt.Froms { + line := []string{from} + for _, to := range tt.Tos { + mark := "X" + val, ok := tt.Values[from][to] + if !ok { + mark = "?" + } else if val { + mark = "." + } + line = append(line, mark+"\t") + } + lines = append(lines, indent+strings.Join(line, "\t")) + } + return strings.Join(lines, "\n") +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/network/network_policy.go b/vendor/k8s.io/kubernetes/test/e2e/network/network_policy.go index 7a1df2e9314a..c1ca8c0cb7e8 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/network/network_policy.go +++ b/vendor/k8s.io/kubernetes/test/e2e/network/network_policy.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors. +Copyright 2021 The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -17,2343 +17,6 @@ limitations under the License. package network import ( - "context" - "encoding/json" - "fmt" - "net" - "time" - - v1 "k8s.io/api/core/v1" - networkingv1 "k8s.io/api/networking/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/util/intstr" - "k8s.io/apimachinery/pkg/util/wait" - "k8s.io/apimachinery/pkg/watch" - "k8s.io/kubernetes/test/e2e/framework" - e2enode "k8s.io/kubernetes/test/e2e/framework/node" - e2epod "k8s.io/kubernetes/test/e2e/framework/pod" - e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" - imageutils "k8s.io/kubernetes/test/utils/image" - utilnet "k8s.io/utils/net" - - "github.com/onsi/ginkgo" + // synthetic import of netpol suite, until these tests are replaced entirely, so that its included properly + _ "k8s.io/kubernetes/test/e2e/network/netpol" ) - -/* -The following Network Policy tests verify that policy object definitions -are correctly enforced by a networking plugin. It accomplishes this by launching -a simple netcat server, and two clients with different -attributes. Each test case creates a network policy which should only allow -connections from one of the clients. The test then asserts that the clients -failed or successfully connected as expected. -*/ - -type protocolPort struct { - port int - protocol v1.Protocol -} - -var protocolSCTP = v1.ProtocolSCTP - -var _ = SIGDescribe("NetworkPolicy [LinuxOnly]", func() { - var service *v1.Service - var podServer *v1.Pod - var podServerLabelSelector string - f := framework.NewDefaultFramework("network-policy") - - ginkgo.BeforeEach(func() { - // Windows does not support network policies. - e2eskipper.SkipIfNodeOSDistroIs("windows") - }) - - ginkgo.Context("NetworkPolicy between server and client", func() { - ginkgo.BeforeEach(func() { - ginkgo.By("Creating a simple server that serves on port 80 and 81.") - podServer, service = createServerPodAndService(f, f.Namespace, "server", []protocolPort{{80, v1.ProtocolTCP}, {81, v1.ProtocolTCP}}) - - ginkgo.By("Waiting for pod ready", func() { - err := e2epod.WaitTimeoutForPodReadyInNamespace(f.ClientSet, podServer.Name, f.Namespace.Name, framework.PodStartTimeout) - framework.ExpectNoError(err) - }) - - // podServerLabelSelector holds the value for the podServer's label "pod-name". - podServerLabelSelector = podServer.ObjectMeta.Labels["pod-name"] - - // Create pods, which should be able to communicate with the server on port 80 and 81. - ginkgo.By("Testing pods can connect to both ports when no policy is present.") - testCanConnect(f, f.Namespace, "client-can-connect-80", service, 80) - testCanConnect(f, f.Namespace, "client-can-connect-81", service, 81) - }) - - ginkgo.AfterEach(func() { - cleanupServerPodAndService(f, podServer, service) - }) - - ginkgo.It("should support a 'default-deny-ingress' policy [Feature:NetworkPolicy]", func() { - policy := &networkingv1.NetworkPolicy{ - ObjectMeta: metav1.ObjectMeta{ - Name: "deny-ingress", - }, - Spec: networkingv1.NetworkPolicySpec{ - PodSelector: metav1.LabelSelector{}, - Ingress: []networkingv1.NetworkPolicyIngressRule{}, - }, - } - - policy, err := f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) - framework.ExpectNoError(err) - defer cleanupNetworkPolicy(f, policy) - - // Create a pod with name 'client-cannot-connect', which will attempt to communicate with the server, - // but should not be able to now that isolation is on. - testCannotConnect(f, f.Namespace, "client-cannot-connect", service, 80) - }) - - ginkgo.It("should support a 'default-deny-all' policy [Feature:NetworkPolicy]", func() { - nsA := f.Namespace - nsBName := f.BaseName + "-b" - nsB, err := f.CreateNamespace(nsBName, map[string]string{ - "ns-name": nsBName, - }) - framework.ExpectNoError(err, "Error occurred while creating namespace-b.") - - ginkgo.By("Creating a simple server in another namespace that serves on port 80 and 81.") - podB, serviceB := createServerPodAndService(f, nsB, "pod-b", []protocolPort{{80, v1.ProtocolTCP}, {81, v1.ProtocolTCP}}) - - ginkgo.By("Waiting for pod ready", func() { - err := e2epod.WaitTimeoutForPodReadyInNamespace(f.ClientSet, podB.Name, nsB.Name, framework.PodStartTimeout) - framework.ExpectNoError(err) - }) - - ginkgo.By("Creating client-a, which should be able to contact the server in another namespace.", func() { - testCanConnect(f, nsA, "client-a", serviceB, 80) - }) - - policy := &networkingv1.NetworkPolicy{ - ObjectMeta: metav1.ObjectMeta{ - Name: "default-deny-all", - }, - Spec: networkingv1.NetworkPolicySpec{ - PodSelector: metav1.LabelSelector{}, - PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeEgress, networkingv1.PolicyTypeIngress}, - Ingress: []networkingv1.NetworkPolicyIngressRule{}, - Egress: []networkingv1.NetworkPolicyEgressRule{}, - }, - } - - policy, err = f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) - framework.ExpectNoError(err) - defer cleanupNetworkPolicy(f, policy) - - ginkgo.By("Creating client-to-a, which should not be able to contact the server in the same namespace, Ingress check.", func() { - testCannotConnect(f, nsA, "client-to-a", service, 80) - }) - - ginkgo.By("Creating client-to-b, which should not be able to contact the server in another namespace, Egress check.", func() { - testCannotConnect(f, nsA, "client-to-b", serviceB, 80) - }) - }) - - ginkgo.It("should enforce policy to allow traffic from pods within server namespace based on PodSelector [Feature:NetworkPolicy]", func() { - nsA := f.Namespace - nsBName := f.BaseName + "-b" - nsB, err := f.CreateNamespace(nsBName, map[string]string{ - "ns-name": nsBName, - }) - framework.ExpectNoError(err, "Error occurred while creating namespace-b.") - - // All communication should be possible before applying the policy. - ginkgo.By("Creating client-a, in server's namespace, which should be able to contact the server.", func() { - testCanConnect(f, nsA, "client-a", service, 80) - }) - ginkgo.By("Creating client-b, in server's namespace, which should be able to contact the server.", func() { - testCanConnect(f, nsA, "client-b", service, 80) - }) - ginkgo.By("Creating client-a, not in server's namespace, which should be able to contact the server.", func() { - testCanConnect(f, nsB, "client-a", service, 80) - }) - - ginkgo.By("Creating a network policy for the server which allows traffic from the pod 'client-a' in same namespace.") - policy := &networkingv1.NetworkPolicy{ - ObjectMeta: metav1.ObjectMeta{ - Name: "allow-client-a-via-pod-selector", - }, - Spec: networkingv1.NetworkPolicySpec{ - // Apply this policy to the Server - PodSelector: metav1.LabelSelector{ - MatchLabels: map[string]string{ - "pod-name": podServerLabelSelector, - }, - }, - // Allow traffic only from client-a - Ingress: []networkingv1.NetworkPolicyIngressRule{{ - From: []networkingv1.NetworkPolicyPeer{{ - PodSelector: &metav1.LabelSelector{ - MatchLabels: map[string]string{ - "pod-name": "client-a", - }, - }, - }}, - }}, - }, - } - - policy, err = f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) - framework.ExpectNoError(err) - defer cleanupNetworkPolicy(f, policy) - - ginkgo.By("Creating client-a, in server's namespace, which should be able to contact the server.", func() { - testCanConnect(f, nsA, "client-a", service, 80) - }) - ginkgo.By("Creating client-b, in server's namespace, which should not be able to contact the server.", func() { - testCannotConnect(f, nsA, "client-b", service, 80) - }) - ginkgo.By("Creating client-a, not in server's namespace, which should not be able to contact the server.", func() { - testCannotConnect(f, nsB, "client-a", service, 80) - }) - }) - - ginkgo.It("should enforce policy to allow traffic only from a different namespace, based on NamespaceSelector [Feature:NetworkPolicy]", func() { - nsA := f.Namespace - nsBName := f.BaseName + "-b" - nsB, err := f.CreateNamespace(nsBName, map[string]string{ - "ns-name": nsBName, - }) - framework.ExpectNoError(err) - - // Create Server with Service in NS-B - framework.Logf("Waiting for server to come up.") - err = e2epod.WaitForPodRunningInNamespace(f.ClientSet, podServer) - framework.ExpectNoError(err) - - // Create Policy for that service that allows traffic only via namespace B - ginkgo.By("Creating a network policy for the server which allows traffic from namespace-b.") - policy := &networkingv1.NetworkPolicy{ - ObjectMeta: metav1.ObjectMeta{ - Name: "allow-ns-b-via-namespace-selector", - }, - Spec: networkingv1.NetworkPolicySpec{ - // Apply to server - PodSelector: metav1.LabelSelector{ - MatchLabels: map[string]string{ - "pod-name": podServerLabelSelector, - }, - }, - // Allow traffic only from NS-B - Ingress: []networkingv1.NetworkPolicyIngressRule{{ - From: []networkingv1.NetworkPolicyPeer{{ - NamespaceSelector: &metav1.LabelSelector{ - MatchLabels: map[string]string{ - "ns-name": nsBName, - }, - }, - }}, - }}, - }, - } - policy, err = f.ClientSet.NetworkingV1().NetworkPolicies(nsA.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) - framework.ExpectNoError(err) - defer cleanupNetworkPolicy(f, policy) - - testCannotConnect(f, nsA, "client-a", service, 80) - testCanConnect(f, nsB, "client-b", service, 80) - }) - - ginkgo.It("should enforce policy based on PodSelector with MatchExpressions[Feature:NetworkPolicy]", func() { - ginkgo.By("Creating a network policy for the server which allows traffic from the pod 'client-a'.") - policy := &networkingv1.NetworkPolicy{ - ObjectMeta: metav1.ObjectMeta{ - Name: "allow-client-a-via-pod-selector-with-match-expressions", - }, - Spec: networkingv1.NetworkPolicySpec{ - PodSelector: metav1.LabelSelector{ - MatchLabels: map[string]string{ - "pod-name": podServerLabelSelector, - }, - }, - Ingress: []networkingv1.NetworkPolicyIngressRule{{ - From: []networkingv1.NetworkPolicyPeer{{ - PodSelector: &metav1.LabelSelector{ - MatchExpressions: []metav1.LabelSelectorRequirement{{ - Key: "pod-name", - Operator: metav1.LabelSelectorOpIn, - Values: []string{"client-a"}, - }}, - }, - }}, - }}, - }, - } - - policy, err := f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) - framework.ExpectNoError(err, "Error creating Network Policy %v: %v", policy.ObjectMeta.Name, err) - defer cleanupNetworkPolicy(f, policy) - - ginkgo.By("Creating client-a which should be able to contact the server.", func() { - testCanConnect(f, f.Namespace, "client-a", service, 80) - }) - ginkgo.By("Creating client-b which should not be able to contact the server.", func() { - testCannotConnect(f, f.Namespace, "client-b", service, 80) - }) - }) - - ginkgo.It("should enforce policy based on NamespaceSelector with MatchExpressions[Feature:NetworkPolicy]", func() { - nsA := f.Namespace - nsBName := f.BaseName + "-b" - nsB, err := f.CreateNamespace(nsBName, map[string]string{ - "ns-name": nsBName, - }) - framework.ExpectNoError(err, "Error creating namespace %v: %v", nsBName, err) - - nsCName := f.BaseName + "-c" - nsC, err := f.CreateNamespace(nsCName, map[string]string{ - "ns-name": nsCName, - }) - framework.ExpectNoError(err, "Error creating namespace %v: %v", nsCName, err) - - // Create Policy for the server that allows traffic from namespace different than namespace-a - ginkgo.By("Creating a network policy for the server which allows traffic from ns different than namespace-a.") - policy := &networkingv1.NetworkPolicy{ - ObjectMeta: metav1.ObjectMeta{ - Name: "allow-any-ns-different-than-ns-a-via-ns-selector-with-match-expressions", - }, - Spec: networkingv1.NetworkPolicySpec{ - PodSelector: metav1.LabelSelector{ - MatchLabels: map[string]string{ - "pod-name": podServerLabelSelector, - }, - }, - Ingress: []networkingv1.NetworkPolicyIngressRule{{ - From: []networkingv1.NetworkPolicyPeer{{ - NamespaceSelector: &metav1.LabelSelector{ - MatchExpressions: []metav1.LabelSelectorRequirement{{ - Key: "ns-name", - Operator: metav1.LabelSelectorOpNotIn, - Values: []string{nsCName}, - }}, - }, - }}, - }}, - }, - } - - policy, err = f.ClientSet.NetworkingV1().NetworkPolicies(nsA.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) - framework.ExpectNoError(err, "Error creating Network Policy %v: %v", policy.ObjectMeta.Name, err) - defer cleanupNetworkPolicy(f, policy) - - testCannotConnect(f, nsC, "client-a", service, 80) - testCanConnect(f, nsB, "client-a", service, 80) - }) - - ginkgo.It("should enforce policy based on PodSelector or NamespaceSelector [Feature:NetworkPolicy]", func() { - nsA := f.Namespace - nsBName := f.BaseName + "-b" - nsB, err := f.CreateNamespace(nsBName, map[string]string{ - "ns-name": nsBName, - }) - framework.ExpectNoError(err, "Error creating namespace %v: %v", nsBName, err) - - // Create Policy for the server that allows traffic only via client B or namespace B - ginkgo.By("Creating a network policy for the server which allows traffic from client-b or namespace-b.") - policy := &networkingv1.NetworkPolicy{ - ObjectMeta: metav1.ObjectMeta{ - Name: "allow-ns-b-via-namespace-selector-or-client-b-via-pod-selector", - }, - Spec: networkingv1.NetworkPolicySpec{ - PodSelector: metav1.LabelSelector{ - MatchLabels: map[string]string{ - "pod-name": podServerLabelSelector, - }, - }, - Ingress: []networkingv1.NetworkPolicyIngressRule{{ - From: []networkingv1.NetworkPolicyPeer{{ - PodSelector: &metav1.LabelSelector{ - MatchLabels: map[string]string{ - "pod-name": "client-b", - }, - }, - }, { - NamespaceSelector: &metav1.LabelSelector{ - MatchLabels: map[string]string{ - "ns-name": nsBName, - }, - }, - }}, - }}, - }, - } - - policy, err = f.ClientSet.NetworkingV1().NetworkPolicies(nsA.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) - framework.ExpectNoError(err, "Error creating Network Policy %v: %v", policy.ObjectMeta.Name, err) - defer cleanupNetworkPolicy(f, policy) - - testCanConnect(f, nsB, "client-a", service, 80) - testCanConnect(f, nsA, "client-b", service, 80) - testCannotConnect(f, nsA, "client-c", service, 80) - }) - - ginkgo.It("should enforce policy based on PodSelector and NamespaceSelector [Feature:NetworkPolicy]", func() { - nsA := f.Namespace - nsBName := f.BaseName + "-b" - nsB, err := f.CreateNamespace(nsBName, map[string]string{ - "ns-name": nsBName, - }) - framework.ExpectNoError(err, "Error creating namespace %v: %v", nsBName, err) - - // Create Policy for the server that allows traffic only via client-b in namespace B - ginkgo.By("Creating a network policy for the server which allows traffic from client-b in namespace-b.") - policy := &networkingv1.NetworkPolicy{ - ObjectMeta: metav1.ObjectMeta{ - Name: "allow-client-b-in-ns-b-via-ns-selector-and-pod-selector", - }, - Spec: networkingv1.NetworkPolicySpec{ - PodSelector: metav1.LabelSelector{ - MatchLabels: map[string]string{ - "pod-name": podServerLabelSelector, - }, - }, - Ingress: []networkingv1.NetworkPolicyIngressRule{{ - From: []networkingv1.NetworkPolicyPeer{{ - PodSelector: &metav1.LabelSelector{ - MatchLabels: map[string]string{ - "pod-name": "client-b", - }, - }, - NamespaceSelector: &metav1.LabelSelector{ - MatchLabels: map[string]string{ - "ns-name": nsBName, - }, - }, - }}, - }}, - }, - } - - policy, err = f.ClientSet.NetworkingV1().NetworkPolicies(nsA.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) - framework.ExpectNoError(err, "Error creating Network Policy %v: %v", policy.ObjectMeta.Name, err) - defer cleanupNetworkPolicy(f, policy) - - testCannotConnect(f, nsB, "client-a", service, 80) - testCannotConnect(f, nsA, "client-b", service, 80) - testCanConnect(f, nsB, "client-b", service, 80) - }) - - ginkgo.It("should enforce policy to allow traffic only from a pod in a different namespace based on PodSelector and NamespaceSelector [Feature:NetworkPolicy]", func() { - nsA := f.Namespace - nsBName := f.BaseName + "-b" - nsB, err := f.CreateNamespace(nsBName, map[string]string{ - "ns-name": nsBName, - }) - framework.ExpectNoError(err, "Error occurred while creating namespace-b.") - - // Wait for Server in namespaces-a to be ready - framework.Logf("Waiting for server to come up.") - err = e2epod.WaitForPodRunningInNamespace(f.ClientSet, podServer) - framework.ExpectNoError(err, "Error occurred while waiting for pod status in namespace: Running.") - - // Before application of the policy, all communication should be successful. - ginkgo.By("Creating client-a, in server's namespace, which should be able to contact the server.", func() { - testCanConnect(f, nsA, "client-a", service, 80) - }) - ginkgo.By("Creating client-b, in server's namespace, which should be able to contact the server.", func() { - testCanConnect(f, nsA, "client-b", service, 80) - }) - ginkgo.By("Creating client-a, not in server's namespace, which should be able to contact the server.", func() { - testCanConnect(f, nsB, "client-a", service, 80) - }) - ginkgo.By("Creating client-b, not in server's namespace, which should be able to contact the server.", func() { - testCanConnect(f, nsB, "client-b", service, 80) - }) - - ginkgo.By("Creating a network policy for the server which allows traffic only from client-a in namespace-b.") - policy := &networkingv1.NetworkPolicy{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: nsA.Name, - Name: "allow-ns-b-client-a-via-namespace-pod-selector", - }, - Spec: networkingv1.NetworkPolicySpec{ - // Apply this policy to the Server - PodSelector: metav1.LabelSelector{ - MatchLabels: map[string]string{ - "pod-name": podServerLabelSelector, - }, - }, - // Allow traffic only from client-a in namespace-b - Ingress: []networkingv1.NetworkPolicyIngressRule{{ - From: []networkingv1.NetworkPolicyPeer{{ - NamespaceSelector: &metav1.LabelSelector{ - MatchLabels: map[string]string{ - "ns-name": nsBName, - }, - }, - PodSelector: &metav1.LabelSelector{ - MatchLabels: map[string]string{ - "pod-name": "client-a", - }, - }, - }}, - }}, - }, - } - - policy, err = f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) - framework.ExpectNoError(err, "Error occurred while creating policy: policy.") - defer cleanupNetworkPolicy(f, policy) - - ginkgo.By("Creating client-a, in server's namespace, which should not be able to contact the server.", func() { - testCannotConnect(f, nsA, "client-a", service, 80) - }) - ginkgo.By("Creating client-b, in server's namespace, which should not be able to contact the server.", func() { - testCannotConnect(f, nsA, "client-b", service, 80) - }) - ginkgo.By("Creating client-a, not in server's namespace, which should be able to contact the server.", func() { - testCanConnect(f, nsB, "client-a", service, 80) - }) - ginkgo.By("Creating client-b, not in server's namespace, which should not be able to contact the server.", func() { - testCannotConnect(f, nsB, "client-b", service, 80) - }) - }) - - ginkgo.It("should enforce policy based on Ports [Feature:NetworkPolicy]", func() { - ginkgo.By("Creating a network policy for the Service which allows traffic only to one port.") - policy := &networkingv1.NetworkPolicy{ - ObjectMeta: metav1.ObjectMeta{ - Name: "allow-ingress-on-port-81", - }, - Spec: networkingv1.NetworkPolicySpec{ - // Apply to server - PodSelector: metav1.LabelSelector{ - MatchLabels: map[string]string{ - "pod-name": podServerLabelSelector, - }, - }, - // Allow traffic only to one port. - Ingress: []networkingv1.NetworkPolicyIngressRule{{ - Ports: []networkingv1.NetworkPolicyPort{{ - Port: &intstr.IntOrString{IntVal: 81}, - }}, - }}, - }, - } - policy, err := f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) - framework.ExpectNoError(err) - defer cleanupNetworkPolicy(f, policy) - - ginkgo.By("Testing pods can connect only to the port allowed by the policy.") - testCannotConnect(f, f.Namespace, "client-a", service, 80) - testCanConnect(f, f.Namespace, "client-b", service, 81) - }) - - ginkgo.It("should enforce multiple, stacked policies with overlapping podSelectors [Feature:NetworkPolicy]", func() { - ginkgo.By("Creating a network policy for the Service which allows traffic only to one port.") - policy := &networkingv1.NetworkPolicy{ - ObjectMeta: metav1.ObjectMeta{ - Name: "allow-ingress-on-port-80", - }, - Spec: networkingv1.NetworkPolicySpec{ - // Apply to server - PodSelector: metav1.LabelSelector{ - MatchLabels: map[string]string{ - "pod-name": podServerLabelSelector, - }, - }, - // Allow traffic only to one port. - Ingress: []networkingv1.NetworkPolicyIngressRule{{ - Ports: []networkingv1.NetworkPolicyPort{{ - Port: &intstr.IntOrString{IntVal: 80}, - }}, - }}, - }, - } - policy, err := f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) - framework.ExpectNoError(err) - defer cleanupNetworkPolicy(f, policy) - - ginkgo.By("Creating a network policy for the Service which allows traffic only to another port.") - policy2 := &networkingv1.NetworkPolicy{ - ObjectMeta: metav1.ObjectMeta{ - Name: "allow-ingress-on-port-81", - }, - Spec: networkingv1.NetworkPolicySpec{ - // Apply to server - PodSelector: metav1.LabelSelector{ - MatchLabels: map[string]string{ - "pod-name": podServerLabelSelector, - }, - }, - // Allow traffic only to one port. - Ingress: []networkingv1.NetworkPolicyIngressRule{{ - Ports: []networkingv1.NetworkPolicyPort{{ - Port: &intstr.IntOrString{IntVal: 81}, - }}, - }}, - }, - } - policy2, err = f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policy2, metav1.CreateOptions{}) - framework.ExpectNoError(err) - defer cleanupNetworkPolicy(f, policy2) - - ginkgo.By("Testing pods can connect to both ports when both policies are present.") - testCanConnect(f, f.Namespace, "client-a", service, 80) - testCanConnect(f, f.Namespace, "client-b", service, 81) - }) - - ginkgo.It("should support allow-all policy [Feature:NetworkPolicy]", func() { - ginkgo.By("Creating a network policy which allows all traffic.") - policy := &networkingv1.NetworkPolicy{ - ObjectMeta: metav1.ObjectMeta{ - Name: "allow-all", - }, - Spec: networkingv1.NetworkPolicySpec{ - // Allow all traffic - PodSelector: metav1.LabelSelector{ - MatchLabels: map[string]string{}, - }, - Ingress: []networkingv1.NetworkPolicyIngressRule{{}}, - }, - } - policy, err := f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) - framework.ExpectNoError(err) - defer cleanupNetworkPolicy(f, policy) - - ginkgo.By("Testing pods can connect to both ports when an 'allow-all' policy is present.") - testCanConnect(f, f.Namespace, "client-a", service, 80) - testCanConnect(f, f.Namespace, "client-b", service, 81) - }) - - ginkgo.It("should allow ingress access on one named port [Feature:NetworkPolicy]", func() { - policy := &networkingv1.NetworkPolicy{ - ObjectMeta: metav1.ObjectMeta{ - Name: "allow-client-a-via-named-port-ingress-rule", - }, - Spec: networkingv1.NetworkPolicySpec{ - // Apply this policy to the Server - PodSelector: metav1.LabelSelector{ - MatchLabels: map[string]string{ - "pod-name": podServerLabelSelector, - }, - }, - // Allow traffic to only one named port: "serve-80". - Ingress: []networkingv1.NetworkPolicyIngressRule{{ - Ports: []networkingv1.NetworkPolicyPort{{ - Port: &intstr.IntOrString{Type: intstr.String, StrVal: "serve-80"}, - }}, - }}, - }, - } - - policy, err := f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) - framework.ExpectNoError(err) - defer cleanupNetworkPolicy(f, policy) - - ginkgo.By("Creating client-a which should be able to contact the server.", func() { - testCanConnect(f, f.Namespace, "client-a", service, 80) - }) - ginkgo.By("Creating client-b which should not be able to contact the server on port 81.", func() { - testCannotConnect(f, f.Namespace, "client-b", service, 81) - }) - }) - - ginkgo.It("should allow ingress access from namespace on one named port [Feature:NetworkPolicy]", func() { - nsBName := f.BaseName + "-b" - nsB, err := f.CreateNamespace(nsBName, map[string]string{ - "ns-name": nsBName, - }) - framework.ExpectNoError(err, "Error creating namespace %v: %v", nsBName, err) - - const allowedPort = 80 - policy := &networkingv1.NetworkPolicy{ - ObjectMeta: metav1.ObjectMeta{ - Name: "allow-client-in-ns-b-via-named-port-ingress-rule", - }, - Spec: networkingv1.NetworkPolicySpec{ - // Apply this policy to the Server - PodSelector: metav1.LabelSelector{ - MatchLabels: map[string]string{ - "pod-name": podServerLabelSelector, - }, - }, - // Allow traffic to only one named port: "serve-80" from namespace-b. - Ingress: []networkingv1.NetworkPolicyIngressRule{{ - From: []networkingv1.NetworkPolicyPeer{{ - NamespaceSelector: &metav1.LabelSelector{ - MatchLabels: map[string]string{ - "ns-name": nsBName, - }, - }, - }}, - Ports: []networkingv1.NetworkPolicyPort{{ - Port: &intstr.IntOrString{Type: intstr.String, StrVal: "serve-80"}, - }}, - }}, - }, - } - - policy, err = f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) - framework.ExpectNoError(err, "Error creating Network Policy %v: %v", policy.ObjectMeta.Name, err) - defer cleanupNetworkPolicy(f, policy) - - testCannotConnect(f, f.Namespace, "client-a", service, allowedPort) - testCanConnect(f, nsB, "client-b", service, allowedPort) - }) - - ginkgo.It("should allow egress access on one named port [Feature:NetworkPolicy]", func() { - clientPodName := "client-a" - policy := &networkingv1.NetworkPolicy{ - ObjectMeta: metav1.ObjectMeta{ - Name: "allow-client-a-via-named-port-egress-rule", - }, - Spec: networkingv1.NetworkPolicySpec{ - // Apply this policy to client-a - PodSelector: metav1.LabelSelector{ - MatchLabels: map[string]string{ - "pod-name": clientPodName, - }, - }, - // Allow traffic to only one named port: "serve-80". - Egress: []networkingv1.NetworkPolicyEgressRule{{ - Ports: []networkingv1.NetworkPolicyPort{ - { - Port: &intstr.IntOrString{Type: intstr.String, StrVal: "serve-80"}, - }, - }, - }}, - }, - } - - policy, err := f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) - framework.ExpectNoError(err) - defer cleanupNetworkPolicy(f, policy) - - ginkgo.By("Creating client-a which should be able to contact the server.", func() { - testCanConnect(f, f.Namespace, clientPodName, service, 80) - }) - ginkgo.By("Creating client-a which should not be able to contact the server on port 81.", func() { - testCannotConnect(f, f.Namespace, clientPodName, service, 81) - }) - }) - - ginkgo.It("should enforce updated policy [Feature:NetworkPolicy]", func() { - const ( - clientAAllowedPort = 80 - clientANotAllowedPort = 81 - ) - ginkgo.By("Creating a network policy for the Service which allows traffic from pod at a port") - policy := &networkingv1.NetworkPolicy{ - ObjectMeta: metav1.ObjectMeta{ - Name: "allow-ingress", - }, - Spec: networkingv1.NetworkPolicySpec{ - // Apply to server - PodSelector: metav1.LabelSelector{ - MatchLabels: map[string]string{ - "pod-name": podServerLabelSelector, - }, - }, - // Allow traffic only to one port. - Ingress: []networkingv1.NetworkPolicyIngressRule{{ - From: []networkingv1.NetworkPolicyPeer{{ - PodSelector: &metav1.LabelSelector{ - MatchLabels: map[string]string{ - "pod-name": "client-a", - }, - }, - }}, - Ports: []networkingv1.NetworkPolicyPort{{ - Port: &intstr.IntOrString{IntVal: clientAAllowedPort}, - }}, - }}, - }, - } - policy, err := f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) - framework.ExpectNoError(err, "Error creating Network Policy %v: %v", policy.ObjectMeta.Name, err) - - testCanConnect(f, f.Namespace, "client-a", service, clientAAllowedPort) - e2epod.WaitForPodNotFoundInNamespace(f.ClientSet, "client-a", f.Namespace.Name, framework.PodDeleteTimeout) - framework.ExpectNoError(err, "Expected pod to be not found.") - - testCannotConnect(f, f.Namespace, "client-b", service, clientAAllowedPort) - e2epod.WaitForPodNotFoundInNamespace(f.ClientSet, "client-b", f.Namespace.Name, framework.PodDeleteTimeout) - framework.ExpectNoError(err, "Expected pod to be not found.") - - testCannotConnect(f, f.Namespace, "client-a", service, clientANotAllowedPort) - e2epod.WaitForPodNotFoundInNamespace(f.ClientSet, "client-a", f.Namespace.Name, framework.PodDeleteTimeout) - framework.ExpectNoError(err, "Expected pod to be not found.") - - const ( - clientBAllowedPort = 81 - clientBNotAllowedPort = 80 - ) - ginkgo.By("Updating a network policy for the Service which allows traffic from another pod at another port.") - policy = &networkingv1.NetworkPolicy{ - ObjectMeta: metav1.ObjectMeta{ - Name: "allow-ingress", - }, - Spec: networkingv1.NetworkPolicySpec{ - // Apply to server - PodSelector: metav1.LabelSelector{ - MatchLabels: map[string]string{ - "pod-name": podServerLabelSelector, - }, - }, - // Allow traffic only to one port. - Ingress: []networkingv1.NetworkPolicyIngressRule{{ - From: []networkingv1.NetworkPolicyPeer{{ - PodSelector: &metav1.LabelSelector{ - MatchLabels: map[string]string{ - "pod-name": "client-b", - }, - }, - }}, - Ports: []networkingv1.NetworkPolicyPort{{ - Port: &intstr.IntOrString{IntVal: clientBAllowedPort}, - }}, - }}, - }, - } - policy, err = f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Update(context.TODO(), policy, metav1.UpdateOptions{}) - framework.ExpectNoError(err, "Error updating Network Policy %v: %v", policy.ObjectMeta.Name, err) - defer cleanupNetworkPolicy(f, policy) - - testCannotConnect(f, f.Namespace, "client-b", service, clientBNotAllowedPort) - e2epod.WaitForPodNotFoundInNamespace(f.ClientSet, "client-b", f.Namespace.Name, framework.PodDeleteTimeout) - framework.ExpectNoError(err, "Expected pod to be not found.") - - testCannotConnect(f, f.Namespace, "client-a", service, clientBNotAllowedPort) - testCanConnect(f, f.Namespace, "client-b", service, clientBAllowedPort) - }) - - ginkgo.It("should allow ingress access from updated namespace [Feature:NetworkPolicy]", func() { - nsA := f.Namespace - nsBName := f.BaseName + "-b" - newNsBName := nsBName + "-updated" - nsB, err := f.CreateNamespace(nsBName, map[string]string{ - "ns-name": nsBName, - }) - framework.ExpectNoError(err, "Error creating namespace %v: %v", nsBName, err) - - const allowedPort = 80 - // Create Policy for that service that allows traffic only via namespace B - ginkgo.By("Creating a network policy for the server which allows traffic from namespace-b.") - policy := &networkingv1.NetworkPolicy{ - ObjectMeta: metav1.ObjectMeta{ - Name: "allow-ns-b-via-namespace-selector", - }, - Spec: networkingv1.NetworkPolicySpec{ - PodSelector: metav1.LabelSelector{ - MatchLabels: map[string]string{ - "pod-name": podServerLabelSelector, - }, - }, - Ingress: []networkingv1.NetworkPolicyIngressRule{{ - From: []networkingv1.NetworkPolicyPeer{{ - NamespaceSelector: &metav1.LabelSelector{ - MatchLabels: map[string]string{ - "ns-name": newNsBName, - }, - }, - }}, - }}, - }, - } - - policy, err = f.ClientSet.NetworkingV1().NetworkPolicies(nsA.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) - framework.ExpectNoError(err, "Error creating Network Policy %v: %v", policy.ObjectMeta.Name, err) - defer cleanupNetworkPolicy(f, policy) - - testCannotConnect(f, nsB, "client-a", service, allowedPort) - - nsB, err = f.ClientSet.CoreV1().Namespaces().Get(context.TODO(), nsB.Name, metav1.GetOptions{}) - framework.ExpectNoError(err, "Error getting Namespace %v: %v", nsB.ObjectMeta.Name, err) - - nsB.ObjectMeta.Labels["ns-name"] = newNsBName - nsB, err = f.ClientSet.CoreV1().Namespaces().Update(context.TODO(), nsB, metav1.UpdateOptions{}) - framework.ExpectNoError(err, "Error updating Namespace %v: %v", nsB.ObjectMeta.Name, err) - - testCanConnect(f, nsB, "client-b", service, allowedPort) - }) - - ginkgo.It("should allow ingress access from updated pod [Feature:NetworkPolicy]", func() { - const allowedPort = 80 - ginkgo.By("Creating a network policy for the server which allows traffic from client-a-updated.") - policy := &networkingv1.NetworkPolicy{ - ObjectMeta: metav1.ObjectMeta{ - Name: "allow-pod-b-via-pod-selector", - }, - Spec: networkingv1.NetworkPolicySpec{ - PodSelector: metav1.LabelSelector{ - MatchLabels: map[string]string{ - "pod-name": podServerLabelSelector, - }, - }, - Ingress: []networkingv1.NetworkPolicyIngressRule{{ - From: []networkingv1.NetworkPolicyPeer{{ - PodSelector: &metav1.LabelSelector{ - MatchExpressions: []metav1.LabelSelectorRequirement{{ - Key: "pod-name", - Operator: metav1.LabelSelectorOpDoesNotExist, - }}, - }, - }}, - }}, - }, - } - - policy, err := f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) - framework.ExpectNoError(err, "Error creating Network Policy %v: %v", policy.ObjectMeta.Name, err) - defer cleanupNetworkPolicy(f, policy) - - ginkgo.By(fmt.Sprintf("Creating client pod %s that should not be able to connect to %s.", "client-a", service.Name)) - // Specify RestartPolicy to OnFailure so we can check the client pod fails in the beginning and succeeds - // after updating its label, otherwise it would not restart after the first failure. - podClient := createNetworkClientPodWithRestartPolicy(f, f.Namespace, "client-a", service, allowedPort, v1.ProtocolTCP, v1.RestartPolicyOnFailure) - defer func() { - ginkgo.By(fmt.Sprintf("Cleaning up the pod %s", podClient.Name)) - if err := f.ClientSet.CoreV1().Pods(f.Namespace.Name).Delete(context.TODO(), podClient.Name, metav1.DeleteOptions{}); err != nil { - framework.Failf("unable to cleanup pod %v: %v", podClient.Name, err) - } - }() - // Check Container exit code as restartable Pod's Phase will be Running even when container fails. - checkNoConnectivityByExitCode(f, f.Namespace, podClient, service) - - ginkgo.By(fmt.Sprintf("Updating client pod %s that should successfully connect to %s.", podClient.Name, service.Name)) - podClient = updatePodLabel(f, f.Namespace, podClient.Name, "replace", "/metadata/labels", map[string]string{}) - checkConnectivity(f, f.Namespace, podClient, service) - }) - - ginkgo.It("should deny ingress access to updated pod [Feature:NetworkPolicy]", func() { - const allowedPort = 80 - ginkgo.By("Creating a network policy for the server which denies all traffic.") - policy := &networkingv1.NetworkPolicy{ - ObjectMeta: metav1.ObjectMeta{ - Name: "deny-ingress-via-isolated-label-selector", - }, - Spec: networkingv1.NetworkPolicySpec{ - PodSelector: metav1.LabelSelector{ - MatchLabels: map[string]string{ - "pod-name": podServerLabelSelector, - }, - MatchExpressions: []metav1.LabelSelectorRequirement{{ - Key: "isolated", - Operator: metav1.LabelSelectorOpExists, - }}, - }, - PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeIngress}, - Ingress: []networkingv1.NetworkPolicyIngressRule{}, - }, - } - - policy, err := f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) - framework.ExpectNoError(err, "Error creating Network Policy %v: %v", policy.ObjectMeta.Name, err) - defer cleanupNetworkPolicy(f, policy) - - // Client can connect to service when the network policy doesn't apply to the server pod. - testCanConnect(f, f.Namespace, "client-a", service, allowedPort) - - // Client cannot connect to service after updating the server pod's labels to match the network policy's selector. - ginkgo.By(fmt.Sprintf("Updating server pod %s to be selected by network policy %s.", podServer.Name, policy.Name)) - updatePodLabel(f, f.Namespace, podServer.Name, "add", "/metadata/labels/isolated", nil) - testCannotConnect(f, f.Namespace, "client-a", service, allowedPort) - }) - - ginkgo.It("should work with Ingress,Egress specified together [Feature:NetworkPolicy]", func() { - const allowedPort = 80 - const notAllowedPort = 81 - - nsBName := f.BaseName + "-b" - nsB, err := f.CreateNamespace(nsBName, map[string]string{ - "ns-name": nsBName, - }) - framework.ExpectNoError(err, "Error occurred while creating namespace-b.") - - podB, serviceB := createServerPodAndService(f, nsB, "pod-b", []protocolPort{{allowedPort, v1.ProtocolTCP}, {notAllowedPort, v1.ProtocolTCP}}) - defer cleanupServerPodAndService(f, podB, serviceB) - - // Wait for Server with Service in NS-B to be ready - framework.Logf("Waiting for servers to be ready.") - err = e2epod.WaitTimeoutForPodReadyInNamespace(f.ClientSet, podB.Name, nsB.Name, framework.PodStartTimeout) - framework.ExpectNoError(err, "Error occurred while waiting for pod status in namespace: Ready.") - - ginkgo.By("Create a network policy for the server which denies both Ingress and Egress traffic.") - policy := &networkingv1.NetworkPolicy{ - ObjectMeta: metav1.ObjectMeta{ - Name: "ingress-egress-rule", - }, - Spec: networkingv1.NetworkPolicySpec{ - PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeIngress, networkingv1.PolicyTypeEgress}, - Ingress: []networkingv1.NetworkPolicyIngressRule{{ - From: []networkingv1.NetworkPolicyPeer{{ - NamespaceSelector: &metav1.LabelSelector{ - MatchLabels: map[string]string{ - "ns-name": nsBName, - }, - }, - }}, - Ports: []networkingv1.NetworkPolicyPort{{ - Port: &intstr.IntOrString{IntVal: allowedPort}, - }}, - }}, - Egress: []networkingv1.NetworkPolicyEgressRule{ - { - To: []networkingv1.NetworkPolicyPeer{ - { - NamespaceSelector: &metav1.LabelSelector{ - MatchLabels: map[string]string{ - "ns-name": nsBName, - }, - }, - }, - }, - Ports: []networkingv1.NetworkPolicyPort{{ - Port: &intstr.IntOrString{IntVal: allowedPort}, - }}, - }, - }, - }, - } - - policy, err = f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) - framework.ExpectNoError(err, "Error creating Network Policy %v: %v", policy.ObjectMeta.Name, err) - defer cleanupNetworkPolicy(f, policy) - - ginkgo.By("client-a should be able to communicate with server port 80 in namespace-b", func() { - testCanConnect(f, f.Namespace, "client-a", serviceB, allowedPort) - }) - - ginkgo.By("client-b should be able to communicate with server port 80 in namespace-a", func() { - testCanConnect(f, nsB, "client-b", service, allowedPort) - }) - - ginkgo.By("client-a should not be able to communicate with server port 81 in namespace-b", func() { - testCannotConnect(f, f.Namespace, "client-a", serviceB, notAllowedPort) - }) - - ginkgo.By("client-b should not be able to communicate with server port 81 in namespace-a", func() { - testCannotConnect(f, nsB, "client-b", service, notAllowedPort) - }) - - }) - - ginkgo.It("should enforce egress policy allowing traffic to a server in a different namespace based on PodSelector and NamespaceSelector [Feature:NetworkPolicy]", func() { - var nsBserviceA, nsBserviceB *v1.Service - var nsBpodServerA, nsBpodServerB *v1.Pod - - nsA := f.Namespace - nsBName := f.BaseName + "-b" - nsB, err := f.CreateNamespace(nsBName, map[string]string{ - "ns-name": nsBName, - }) - framework.ExpectNoError(err, "Error occurred while creating namespace-b.") - - // Creating pods and services in namespace-b - nsBpodServerA, nsBserviceA = createServerPodAndService(f, nsB, "ns-b-server-a", []protocolPort{{80, v1.ProtocolTCP}}) - defer cleanupServerPodAndService(f, nsBpodServerA, nsBserviceA) - nsBpodServerB, nsBserviceB = createServerPodAndService(f, nsB, "ns-b-server-b", []protocolPort{{80, v1.ProtocolTCP}}) - defer cleanupServerPodAndService(f, nsBpodServerB, nsBserviceB) - - // Wait for Server with Service in NS-A to be ready - framework.Logf("Waiting for servers to be ready.") - err = e2epod.WaitTimeoutForPodReadyInNamespace(f.ClientSet, podServer.Name, podServer.Namespace, framework.PodStartTimeout) - framework.ExpectNoError(err, "Error occurred while waiting for pod status in namespace: Ready.") - - // Wait for Servers with Services in NS-B to be ready - err = e2epod.WaitTimeoutForPodReadyInNamespace(f.ClientSet, nsBpodServerA.Name, nsBpodServerA.Namespace, framework.PodStartTimeout) - framework.ExpectNoError(err, "Error occurred while waiting for pod status in namespace: Ready.") - - err = e2epod.WaitTimeoutForPodReadyInNamespace(f.ClientSet, nsBpodServerB.Name, nsBpodServerB.Namespace, framework.PodStartTimeout) - framework.ExpectNoError(err, "Error occurred while waiting for pod status in namespace: Ready.") - - ginkgo.By("Creating a network policy for the server which allows traffic only to a server in different namespace.") - policyAllowToServerInNSB := &networkingv1.NetworkPolicy{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: nsA.Name, - Name: "allow-to-ns-b-server-a-via-namespace-selector", - }, - Spec: networkingv1.NetworkPolicySpec{ - // Apply this policy to the client - PodSelector: metav1.LabelSelector{ - MatchLabels: map[string]string{ - "pod-name": "client-a", - }, - }, - PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeEgress}, - // Allow traffic only to server-a in namespace-b - Egress: []networkingv1.NetworkPolicyEgressRule{ - { - To: []networkingv1.NetworkPolicyPeer{ - { - NamespaceSelector: &metav1.LabelSelector{ - MatchLabels: map[string]string{ - "ns-name": nsBName, - }, - }, - PodSelector: &metav1.LabelSelector{ - MatchLabels: map[string]string{ - "pod-name": nsBpodServerA.ObjectMeta.Labels["pod-name"], - }, - }, - }, - }, - }, - }, - }, - } - - policyAllowToServerInNSB, err = f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policyAllowToServerInNSB, metav1.CreateOptions{}) - framework.ExpectNoError(err, "Error occurred while creating policy: policyAllowToServerInNSB.") - defer cleanupNetworkPolicy(f, policyAllowToServerInNSB) - - ginkgo.By("Creating client-a, in 'namespace-a', which should be able to contact the server-a in namespace-b.", func() { - testCanConnect(f, nsA, "client-a", nsBserviceA, 80) - }) - ginkgo.By("Creating client-a, in 'namespace-a', which should not be able to contact the server-b in namespace-b.", func() { - testCannotConnect(f, nsA, "client-a", nsBserviceB, 80) - }) - ginkgo.By("Creating client-a, in 'namespace-a', which should not be able to contact the server in namespace-a.", func() { - testCannotConnect(f, nsA, "client-a", service, 80) - }) - }) - - ginkgo.It("should enforce multiple ingress policies with ingress allow-all policy taking precedence [Feature:NetworkPolicy]", func() { - ginkgo.By("Creating a network policy for the server which allows traffic only from client-b.") - policyAllowOnlyFromClientB := &networkingv1.NetworkPolicy{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: f.Namespace.Name, - Name: "allow-from-client-b-pod-selector", - }, - Spec: networkingv1.NetworkPolicySpec{ - // Apply this policy to the Server - PodSelector: metav1.LabelSelector{ - MatchLabels: map[string]string{ - "pod-name": podServerLabelSelector, - }, - }, - PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeIngress}, - // Allow traffic only from "client-b" - Ingress: []networkingv1.NetworkPolicyIngressRule{{ - From: []networkingv1.NetworkPolicyPeer{{ - PodSelector: &metav1.LabelSelector{ - MatchLabels: map[string]string{ - "pod-name": "client-b", - }, - }, - }}, - }}, - }, - } - - policyAllowOnlyFromClientB, err := f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policyAllowOnlyFromClientB, metav1.CreateOptions{}) - framework.ExpectNoError(err, "Error occurred while creating policy: policyAllowOnlyFromClientB.") - defer cleanupNetworkPolicy(f, policyAllowOnlyFromClientB) - - ginkgo.By("Creating client-a which should not be able to contact the server.", func() { - testCannotConnect(f, f.Namespace, "client-a", service, 80) - }) - ginkgo.By("Creating client-b which should be able to contact the server.", func() { - testCanConnect(f, f.Namespace, "client-b", service, 80) - }) - - ginkgo.By("Creating a network policy for the server which allows traffic from all clients.") - policyIngressAllowAll := &networkingv1.NetworkPolicy{ - ObjectMeta: metav1.ObjectMeta{ - //Namespace: f.Namespace.Name, - Name: "allow-all", - }, - Spec: networkingv1.NetworkPolicySpec{ - // Apply this policy to all pods - PodSelector: metav1.LabelSelector{ - MatchLabels: map[string]string{}, - }, - PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeIngress}, - Ingress: []networkingv1.NetworkPolicyIngressRule{{}}, - }, - } - - policyIngressAllowAll, err = f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policyIngressAllowAll, metav1.CreateOptions{}) - framework.ExpectNoError(err, "Error occurred while creating policy: policyIngressAllowAll.") - defer cleanupNetworkPolicy(f, policyIngressAllowAll) - - ginkgo.By("Creating client-a which should be able to contact the server.", func() { - testCanConnect(f, f.Namespace, "client-a", service, 80) - }) - ginkgo.By("Creating client-b which should be able to contact the server.", func() { - testCanConnect(f, f.Namespace, "client-b", service, 80) - }) - }) - - ginkgo.It("should enforce multiple egress policies with egress allow-all policy taking precedence [Feature:NetworkPolicy]", func() { - podServerB, serviceB := createServerPodAndService(f, f.Namespace, "server-b", []protocolPort{{80, v1.ProtocolTCP}}) - defer cleanupServerPodAndService(f, podServerB, serviceB) - - ginkgo.By("Waiting for pod ready", func() { - err := e2epod.WaitTimeoutForPodReadyInNamespace(f.ClientSet, podServerB.Name, f.Namespace.Name, framework.PodStartTimeout) - framework.ExpectNoError(err, "Error occurred while waiting for pod type: Ready.") - }) - - ginkgo.By("Creating client-a which should be able to contact the server before applying policy.", func() { - testCanConnect(f, f.Namespace, "client-a", serviceB, 80) - }) - - ginkgo.By("Creating a network policy for the server which allows traffic only to server-a.") - policyAllowOnlyToServerA := &networkingv1.NetworkPolicy{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: f.Namespace.Name, - Name: "allow-to-server-a-pod-selector", - }, - Spec: networkingv1.NetworkPolicySpec{ - // Apply this policy to the "client-a" - PodSelector: metav1.LabelSelector{ - MatchLabels: map[string]string{ - "pod-name": "client-a", - }, - }, - PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeEgress}, - // Allow traffic only to "server-a" - Egress: []networkingv1.NetworkPolicyEgressRule{ - { - To: []networkingv1.NetworkPolicyPeer{ - { - PodSelector: &metav1.LabelSelector{ - MatchLabels: map[string]string{ - "pod-name": podServerLabelSelector, - }, - }, - }, - }, - }, - }, - }, - } - policyAllowOnlyToServerA, err := f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policyAllowOnlyToServerA, metav1.CreateOptions{}) - framework.ExpectNoError(err, "Error occurred while creating policy: policyAllowOnlyToServerA.") - defer cleanupNetworkPolicy(f, policyAllowOnlyToServerA) - - ginkgo.By("Creating client-a which should not be able to contact the server-b.", func() { - testCannotConnect(f, f.Namespace, "client-a", serviceB, 80) - }) - ginkgo.By("Creating client-a which should be able to contact the server.", func() { - testCanConnect(f, f.Namespace, "client-a", service, 80) - }) - - ginkgo.By("Creating a network policy which allows traffic to all pods.") - policyEgressAllowAll := &networkingv1.NetworkPolicy{ - ObjectMeta: metav1.ObjectMeta{ - Name: "allow-all", - }, - Spec: networkingv1.NetworkPolicySpec{ - // Apply this policy to all pods - PodSelector: metav1.LabelSelector{ - MatchLabels: map[string]string{}, - }, - PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeEgress}, - Egress: []networkingv1.NetworkPolicyEgressRule{{}}, - }, - } - - policyEgressAllowAll, err = f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policyEgressAllowAll, metav1.CreateOptions{}) - framework.ExpectNoError(err, "Error occurred while creating policy: policyEgressAllowAll.") - defer cleanupNetworkPolicy(f, policyEgressAllowAll) - - ginkgo.By("Creating client-a which should be able to contact the server-b.", func() { - testCanConnect(f, f.Namespace, "client-a", serviceB, 80) - }) - ginkgo.By("Creating client-a which should be able to contact the server-a.", func() { - testCanConnect(f, f.Namespace, "client-a", service, 80) - }) - }) - - ginkgo.It("should stop enforcing policies after they are deleted [Feature:NetworkPolicy]", func() { - ginkgo.By("Creating a network policy for the server which denies all traffic.") - policyDenyAll := &networkingv1.NetworkPolicy{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: f.Namespace.Name, - Name: "deny-all", - }, - Spec: networkingv1.NetworkPolicySpec{ - // Deny all traffic - PodSelector: metav1.LabelSelector{}, - PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeIngress}, - Ingress: []networkingv1.NetworkPolicyIngressRule{}, - }, - } - - policyDenyAll, err := f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policyDenyAll, metav1.CreateOptions{}) - framework.ExpectNoError(err, "Error occurred while creating policy: policyDenyAll.") - - ginkgo.By("Creating client-a which should not be able to contact the server.", func() { - testCannotConnect(f, f.Namespace, "client-a", service, 80) - }) - - ginkgo.By("Creating a network policy for the server which allows traffic only from client-a.") - policyAllowFromClientA := &networkingv1.NetworkPolicy{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: f.Namespace.Name, - Name: "allow-from-client-a-pod-selector", - }, - Spec: networkingv1.NetworkPolicySpec{ - // Apply this policy to the Server - PodSelector: metav1.LabelSelector{ - MatchLabels: map[string]string{ - "pod-name": podServerLabelSelector, - }, - }, - PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeIngress}, - // Allow traffic from "client-a" - Ingress: []networkingv1.NetworkPolicyIngressRule{{ - From: []networkingv1.NetworkPolicyPeer{{ - PodSelector: &metav1.LabelSelector{ - MatchLabels: map[string]string{ - "pod-name": "client-a", - }, - }, - }}, - }}, - }, - } - - policyAllowFromClientA, err = f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policyAllowFromClientA, metav1.CreateOptions{}) - framework.ExpectNoError(err, "Error occurred while creating policy: policyAllowFromClientA.") - - ginkgo.By("Creating client-a which should be able to contact the server.", func() { - testCanConnect(f, f.Namespace, "client-a", service, 80) - }) - - ginkgo.By("Deleting the network policy allowing traffic from client-a") - cleanupNetworkPolicy(f, policyAllowFromClientA) - - ginkgo.By("Creating client-a which should not be able to contact the server.", func() { - testCannotConnect(f, f.Namespace, "client-a", service, 80) - }) - - ginkgo.By("Deleting the network policy denying all traffic.") - cleanupNetworkPolicy(f, policyDenyAll) - - ginkgo.By("Creating client-a which should be able to contact the server.", func() { - testCanConnect(f, f.Namespace, "client-a", service, 80) - }) - - }) - - ginkgo.It("should allow egress access to server in CIDR block [Feature:NetworkPolicy]", func() { - var serviceB *v1.Service - var podServerB *v1.Pod - - // Getting podServer's status to get podServer's IP, to create the CIDR - podServerStatus, err := f.ClientSet.CoreV1().Pods(f.Namespace.Name).Get(context.TODO(), podServer.Name, metav1.GetOptions{}) - if err != nil { - framework.ExpectNoError(err, "Error occurred while getting pod status.") - } - hostMask := 32 - if utilnet.IsIPv6String(podServerStatus.Status.PodIP) { - hostMask = 128 - } - podServerCIDR := fmt.Sprintf("%s/%d", podServerStatus.Status.PodIP, hostMask) - - // Creating pod-b and service-b - podServerB, serviceB = createServerPodAndService(f, f.Namespace, "pod-b", []protocolPort{{80, v1.ProtocolTCP}}) - ginkgo.By("Waiting for pod-b to be ready", func() { - err := e2epod.WaitTimeoutForPodReadyInNamespace(f.ClientSet, podServerB.Name, f.Namespace.Name, framework.PodStartTimeout) - framework.ExpectNoError(err, "Error occurred while waiting for pod type: Ready.") - }) - defer cleanupServerPodAndService(f, podServerB, serviceB) - - // Wait for podServerB with serviceB to be ready - err = e2epod.WaitForPodRunningInNamespace(f.ClientSet, podServerB) - framework.ExpectNoError(err, "Error occurred while waiting for pod status in namespace: Running.") - - ginkgo.By("Creating client-a which should be able to contact the server-b.", func() { - testCanConnect(f, f.Namespace, "client-a", serviceB, 80) - }) - - policyAllowCIDR := &networkingv1.NetworkPolicy{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: f.Namespace.Name, - Name: "allow-client-a-via-cidr-egress-rule", - }, - Spec: networkingv1.NetworkPolicySpec{ - // Apply this policy to the Server - PodSelector: metav1.LabelSelector{ - MatchLabels: map[string]string{ - "pod-name": "client-a", - }, - }, - PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeEgress}, - // Allow traffic to only one CIDR block. - Egress: []networkingv1.NetworkPolicyEgressRule{ - { - To: []networkingv1.NetworkPolicyPeer{ - { - IPBlock: &networkingv1.IPBlock{ - CIDR: podServerCIDR, - }, - }, - }, - }, - }, - }, - } - - policyAllowCIDR, err = f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policyAllowCIDR, metav1.CreateOptions{}) - framework.ExpectNoError(err, "Error occurred while creating policy: policyAllowCIDR.") - defer cleanupNetworkPolicy(f, policyAllowCIDR) - - ginkgo.By("Creating client-a which should not be able to contact the server-b.", func() { - testCannotConnect(f, f.Namespace, "client-a", serviceB, 80) - }) - ginkgo.By("Creating client-a which should be able to contact the server.", func() { - testCanConnect(f, f.Namespace, "client-a", service, 80) - }) - }) - - ginkgo.It("should enforce except clause while egress access to server in CIDR block [Feature:NetworkPolicy]", func() { - // Getting podServer's status to get podServer's IP, to create the CIDR with except clause - podServerStatus, err := f.ClientSet.CoreV1().Pods(f.Namespace.Name).Get(context.TODO(), podServer.Name, metav1.GetOptions{}) - if err != nil { - framework.ExpectNoError(err, "Error occurred while getting pod status.") - } - - allowMask := 24 - hostMask := 32 - if utilnet.IsIPv6String(podServerStatus.Status.PodIP) { - allowMask = 64 - hostMask = 128 - } - _, podServerAllowSubnet, err := net.ParseCIDR(fmt.Sprintf("%s/%d", podServerStatus.Status.PodIP, allowMask)) - framework.ExpectNoError(err, "could not parse allow subnet") - podServerAllowCIDR := podServerAllowSubnet.String() - - // Exclude podServer's IP with an Except clause - podServerExceptList := []string{fmt.Sprintf("%s/%d", podServerStatus.Status.PodIP, hostMask)} - - // client-a can connect to server prior to applying the NetworkPolicy - ginkgo.By("Creating client-a which should be able to contact the server.", func() { - testCanConnect(f, f.Namespace, "client-a", service, 80) - }) - - policyAllowCIDRWithExcept := &networkingv1.NetworkPolicy{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: f.Namespace.Name, - Name: "deny-client-a-via-except-cidr-egress-rule", - }, - Spec: networkingv1.NetworkPolicySpec{ - // Apply this policy to the client. - PodSelector: metav1.LabelSelector{ - MatchLabels: map[string]string{ - "pod-name": "client-a", - }, - }, - PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeEgress}, - // Allow traffic to only one CIDR block except subnet which includes Server. - Egress: []networkingv1.NetworkPolicyEgressRule{ - { - To: []networkingv1.NetworkPolicyPeer{ - { - IPBlock: &networkingv1.IPBlock{ - CIDR: podServerAllowCIDR, - Except: podServerExceptList, - }, - }, - }, - }, - }, - }, - } - - policyAllowCIDRWithExcept, err = f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policyAllowCIDRWithExcept, metav1.CreateOptions{}) - framework.ExpectNoError(err, "Error occurred while creating policy: policyAllowCIDRWithExcept.") - defer cleanupNetworkPolicy(f, policyAllowCIDRWithExcept) - - ginkgo.By("Creating client-a which should no longer be able to contact the server.", func() { - testCannotConnect(f, f.Namespace, "client-a", service, 80) - }) - }) - - ginkgo.It("should ensure an IP overlapping both IPBlock.CIDR and IPBlock.Except is allowed [Feature:NetworkPolicy]", func() { - // Getting podServer's status to get podServer's IP, to create the CIDR with except clause - podServerStatus, err := f.ClientSet.CoreV1().Pods(f.Namespace.Name).Get(context.TODO(), podServer.Name, metav1.GetOptions{}) - if err != nil { - framework.ExpectNoError(err, "Error occurred while getting pod status.") - } - - allowMask := 24 - hostMask := 32 - if utilnet.IsIPv6String(podServerStatus.Status.PodIP) { - allowMask = 64 - hostMask = 128 - } - _, podServerAllowSubnet, err := net.ParseCIDR(fmt.Sprintf("%s/%d", podServerStatus.Status.PodIP, allowMask)) - framework.ExpectNoError(err, "could not parse allow subnet") - podServerAllowCIDR := podServerAllowSubnet.String() - - // Exclude podServer's IP with an Except clause - podServerCIDR := fmt.Sprintf("%s/%d", podServerStatus.Status.PodIP, hostMask) - podServerExceptList := []string{podServerCIDR} - - // Create NetworkPolicy which blocks access to podServer with except clause. - policyAllowCIDRWithExceptServerPod := &networkingv1.NetworkPolicy{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: f.Namespace.Name, - Name: "deny-client-a-via-except-cidr-egress-rule", - }, - Spec: networkingv1.NetworkPolicySpec{ - // Apply this policy to the client. - PodSelector: metav1.LabelSelector{ - MatchLabels: map[string]string{ - "pod-name": "client-a", - }, - }, - PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeEgress}, - // Allow traffic to only one CIDR block except subnet which includes Server. - Egress: []networkingv1.NetworkPolicyEgressRule{ - { - To: []networkingv1.NetworkPolicyPeer{ - { - IPBlock: &networkingv1.IPBlock{ - CIDR: podServerAllowCIDR, - Except: podServerExceptList, - }, - }, - }, - }, - }, - }, - } - - policyAllowCIDRWithExceptServerPodObj, err := f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policyAllowCIDRWithExceptServerPod, metav1.CreateOptions{}) - framework.ExpectNoError(err, "Error occurred while creating policy: policyAllowCIDRWithExceptServerPod.") - - ginkgo.By("Creating client-a which should not be able to contact the server.", func() { - testCannotConnect(f, f.Namespace, "client-a", service, 80) - }) - - // Create NetworkPolicy which allows access to the podServer using podServer's IP in allow CIDR. - policyAllowCIDRServerPod := &networkingv1.NetworkPolicy{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: f.Namespace.Name, - Name: "allow-client-a-via-cidr-egress-rule", - }, - Spec: networkingv1.NetworkPolicySpec{ - // Apply this policy to the client. - PodSelector: metav1.LabelSelector{ - MatchLabels: map[string]string{ - "pod-name": "client-a", - }, - }, - PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeEgress}, - // Allow traffic to only one CIDR block which includes Server. - Egress: []networkingv1.NetworkPolicyEgressRule{ - { - To: []networkingv1.NetworkPolicyPeer{ - { - IPBlock: &networkingv1.IPBlock{ - CIDR: podServerCIDR, - }, - }, - }, - }, - }, - }, - } - - policyAllowCIDRServerPod, err = f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policyAllowCIDRServerPod, metav1.CreateOptions{}) - framework.ExpectNoError(err, "Error occurred while creating policy: policyAllowCIDRServerPod.") - defer cleanupNetworkPolicy(f, policyAllowCIDRServerPod) - - ginkgo.By("Creating client-a which should now be able to contact the server.", func() { - testCanConnect(f, f.Namespace, "client-a", service, 80) - }) - - ginkgo.By("Deleting the network policy with except podServer IP which disallows access to podServer.") - cleanupNetworkPolicy(f, policyAllowCIDRWithExceptServerPodObj) - - ginkgo.By("Creating client-a which should still be able to contact the server after deleting the network policy with except clause.", func() { - testCanConnect(f, f.Namespace, "client-a", service, 80) - }) - - // Recreate the NetworkPolicy which contains the podServer's IP in the except list. - policyAllowCIDRWithExceptServerPod, err = f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policyAllowCIDRWithExceptServerPod, metav1.CreateOptions{}) - framework.ExpectNoError(err, "Error occurred while creating policy: policyAllowCIDRWithExceptServerPod.") - defer cleanupNetworkPolicy(f, policyAllowCIDRWithExceptServerPod) - - ginkgo.By("Creating client-a which should still be able to contact the server after recreating the network policy with except clause.", func() { - testCanConnect(f, f.Namespace, "client-a", service, 80) - }) - - }) - - ginkgo.It("should enforce policies to check ingress and egress policies can be controlled independently based on PodSelector [Feature:NetworkPolicy]", func() { - var serviceA, serviceB *v1.Service - var podA, podB *v1.Pod - var err error - - // Before applying policy, communication should be successful between pod-a and pod-b - podA, serviceA = createServerPodAndService(f, f.Namespace, "pod-a", []protocolPort{{80, v1.ProtocolTCP}}) - ginkgo.By("Waiting for pod-a to be ready", func() { - err := e2epod.WaitTimeoutForPodReadyInNamespace(f.ClientSet, podA.Name, f.Namespace.Name, framework.PodStartTimeout) - framework.ExpectNoError(err, "Error occurred while waiting for pod type: Ready.") - }) - ginkgo.By("Creating client pod-b which should be able to contact the server pod-a.", func() { - testCanConnect(f, f.Namespace, "pod-b", serviceA, 80) - }) - cleanupServerPodAndService(f, podA, serviceA) - - podB, serviceB = createServerPodAndService(f, f.Namespace, "pod-b", []protocolPort{{80, v1.ProtocolTCP}}) - ginkgo.By("Waiting for pod-b to be ready", func() { - err := e2epod.WaitTimeoutForPodReadyInNamespace(f.ClientSet, podB.Name, f.Namespace.Name, framework.PodStartTimeout) - framework.ExpectNoError(err, "Error occurred while waiting for pod type: Ready.") - }) - ginkgo.By("Creating client pod-a which should be able to contact the server pod-b.", func() { - testCanConnect(f, f.Namespace, "pod-a", serviceB, 80) - }) - - ginkgo.By("Creating a network policy for pod-a which allows Egress traffic to pod-b.") - policyAllowToPodB := &networkingv1.NetworkPolicy{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: f.Namespace.Name, - Name: "allow-pod-a-to-pod-b-using-pod-selector", - }, - Spec: networkingv1.NetworkPolicySpec{ - // Apply this policy on pod-a - PodSelector: metav1.LabelSelector{ - MatchLabels: map[string]string{ - "pod-name": "pod-a", - }, - }, - PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeEgress}, - // Allow traffic to server on pod-b - Egress: []networkingv1.NetworkPolicyEgressRule{ - { - To: []networkingv1.NetworkPolicyPeer{ - { - PodSelector: &metav1.LabelSelector{ - MatchLabels: map[string]string{ - "pod-name": "pod-b", - }, - }, - }, - }, - }, - }, - }, - } - - policyAllowToPodB, err = f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policyAllowToPodB, metav1.CreateOptions{}) - framework.ExpectNoError(err, "Error occurred while creating policy: policyAllowToPodB.") - defer cleanupNetworkPolicy(f, policyAllowToPodB) - - ginkgo.By("Creating a network policy for pod-a that denies traffic from pod-b.") - policyDenyFromPodB := &networkingv1.NetworkPolicy{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: f.Namespace.Name, - Name: "deny-pod-b-to-pod-a-pod-selector", - }, - Spec: networkingv1.NetworkPolicySpec{ - // Apply this policy on the server on pod-a - PodSelector: metav1.LabelSelector{ - MatchLabels: map[string]string{ - "pod-name": "pod-a", - }, - }, - PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeIngress}, - // Deny traffic from all pods, including pod-b - Ingress: []networkingv1.NetworkPolicyIngressRule{}, - }, - } - - policyDenyFromPodB, err = f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policyDenyFromPodB, metav1.CreateOptions{}) - framework.ExpectNoError(err, "Error occurred while creating policy: policyDenyFromPodB.") - defer cleanupNetworkPolicy(f, policyDenyFromPodB) - - ginkgo.By("Creating client pod-a which should be able to contact the server pod-b.", func() { - testCanConnect(f, f.Namespace, "pod-a", serviceB, 80) - }) - cleanupServerPodAndService(f, podB, serviceB) - - // Creating server pod with label "pod-name": "pod-a" to deny traffic from client pod with label "pod-name": "pod-b" - podA, serviceA = createServerPodAndService(f, f.Namespace, "pod-a", []protocolPort{{80, v1.ProtocolTCP}}) - ginkgo.By("Waiting for pod-a to be ready", func() { - err := e2epod.WaitTimeoutForPodReadyInNamespace(f.ClientSet, podA.Name, f.Namespace.Name, framework.PodStartTimeout) - framework.ExpectNoError(err, "Error occurred while waiting for pod type: Ready.") - }) - - ginkgo.By("Creating client pod-b which should be able to contact the server pod-a.", func() { - testCannotConnect(f, f.Namespace, "pod-b", serviceA, 80) - }) - cleanupServerPodAndService(f, podA, serviceA) - }) - ginkgo.It("should not allow access by TCP when a policy specifies only SCTP [Feature:NetworkPolicy] [Feature:SCTP]", func() { - ginkgo.By("getting the state of the sctp module on nodes") - nodes, err := e2enode.GetReadySchedulableNodes(f.ClientSet) - framework.ExpectNoError(err) - sctpLoadedAtStart := CheckSCTPModuleLoadedOnNodes(f, nodes) - - ginkgo.By("Creating a network policy for the server which allows traffic only via SCTP on port 80.") - policy := &networkingv1.NetworkPolicy{ - ObjectMeta: metav1.ObjectMeta{ - Name: "allow-only-sctp-ingress-on-port-80", - }, - Spec: networkingv1.NetworkPolicySpec{ - // Apply to server - PodSelector: metav1.LabelSelector{ - MatchLabels: map[string]string{ - "pod-name": podServerLabelSelector, - }, - }, - // Allow traffic only via SCTP on port 80 . - Ingress: []networkingv1.NetworkPolicyIngressRule{{ - Ports: []networkingv1.NetworkPolicyPort{{ - Port: &intstr.IntOrString{IntVal: 80}, - Protocol: &protocolSCTP, - }}, - }}, - }, - } - appliedPolicy, err := f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) - framework.ExpectNoError(err) - defer cleanupNetworkPolicy(f, appliedPolicy) - - ginkgo.By("Testing pods cannot connect on port 80 anymore when not using SCTP as protocol.") - testCannotConnect(f, f.Namespace, "client-a", service, 80) - - ginkgo.By("validating sctp module is still not loaded") - sctpLoadedAtEnd := CheckSCTPModuleLoadedOnNodes(f, nodes) - if !sctpLoadedAtStart && sctpLoadedAtEnd { - framework.Failf("The state of the sctp module has changed due to the test case") - } - }) - }) -}) - -var _ = SIGDescribe("NetworkPolicy [Feature:SCTPConnectivity][LinuxOnly][Disruptive]", func() { - var service *v1.Service - var podServer *v1.Pod - var podServerLabelSelector string - f := framework.NewDefaultFramework("sctp-network-policy") - - ginkgo.BeforeEach(func() { - // Windows does not support network policies. - e2eskipper.SkipIfNodeOSDistroIs("windows") - }) - - ginkgo.Context("NetworkPolicy between server and client using SCTP", func() { - ginkgo.BeforeEach(func() { - ginkgo.By("Creating a simple server that serves on port 80 and 81.") - podServer, service = createServerPodAndService(f, f.Namespace, "server", []protocolPort{{80, v1.ProtocolSCTP}, {81, v1.ProtocolSCTP}}) - - ginkgo.By("Waiting for pod ready", func() { - err := e2epod.WaitTimeoutForPodReadyInNamespace(f.ClientSet, podServer.Name, f.Namespace.Name, framework.PodStartTimeout) - framework.ExpectNoError(err) - }) - - // podServerLabelSelector holds the value for the podServer's label "pod-name". - podServerLabelSelector = podServer.ObjectMeta.Labels["pod-name"] - - // Create pods, which should be able to communicate with the server on port 80 and 81. - ginkgo.By("Testing pods can connect to both ports when no policy is present.") - testCanConnectProtocol(f, f.Namespace, "client-can-connect-80", service, 80, v1.ProtocolSCTP) - testCanConnectProtocol(f, f.Namespace, "client-can-connect-81", service, 81, v1.ProtocolSCTP) - }) - - ginkgo.AfterEach(func() { - cleanupServerPodAndService(f, podServer, service) - }) - - ginkgo.It("should support a 'default-deny' policy [Feature:NetworkPolicy]", func() { - policy := &networkingv1.NetworkPolicy{ - ObjectMeta: metav1.ObjectMeta{ - Name: "deny-all", - }, - Spec: networkingv1.NetworkPolicySpec{ - PodSelector: metav1.LabelSelector{}, - Ingress: []networkingv1.NetworkPolicyIngressRule{}, - }, - } - - policy, err := f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) - framework.ExpectNoError(err) - defer cleanupNetworkPolicy(f, policy) - - // Create a pod with name 'client-cannot-connect', which will attempt to communicate with the server, - // but should not be able to now that isolation is on. - testCannotConnect(f, f.Namespace, "client-cannot-connect", service, 80) - }) - - ginkgo.It("should enforce policy based on Ports [Feature:NetworkPolicy]", func() { - ginkgo.By("Creating a network policy for the Service which allows traffic only to one port.") - policy := &networkingv1.NetworkPolicy{ - ObjectMeta: metav1.ObjectMeta{ - Name: "allow-ingress-on-port-81", - }, - Spec: networkingv1.NetworkPolicySpec{ - // Apply to server - PodSelector: metav1.LabelSelector{ - MatchLabels: map[string]string{ - "pod-name": podServerLabelSelector, - }, - }, - // Allow traffic only to one port. - Ingress: []networkingv1.NetworkPolicyIngressRule{{ - Ports: []networkingv1.NetworkPolicyPort{{ - Port: &intstr.IntOrString{IntVal: 81}, - Protocol: &protocolSCTP, - }}, - }}, - }, - } - policy, err := f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) - framework.ExpectNoError(err) - defer cleanupNetworkPolicy(f, policy) - - ginkgo.By("Testing pods can connect only to the port allowed by the policy.") - testCannotConnectProtocol(f, f.Namespace, "client-a", service, 80, v1.ProtocolSCTP) - testCanConnectProtocol(f, f.Namespace, "client-b", service, 81, v1.ProtocolSCTP) - }) - - ginkgo.It("should enforce policy to allow traffic only from a pod in a different namespace based on PodSelector and NamespaceSelector [Feature:NetworkPolicy]", func() { - nsA := f.Namespace - nsBName := f.BaseName + "-b" - nsB, err := f.CreateNamespace(nsBName, map[string]string{ - "ns-name": nsBName, - }) - framework.ExpectNoError(err, "Error occurred while creating namespace-b.") - - // Wait for Server in namespaces-a to be ready - framework.Logf("Waiting for server to come up.") - err = e2epod.WaitForPodRunningInNamespace(f.ClientSet, podServer) - framework.ExpectNoError(err, "Error occurred while waiting for pod status in namespace: Running.") - - // Before application of the policy, all communication should be successful. - ginkgo.By("Creating client-a, in server's namespace, which should be able to contact the server.", func() { - testCanConnectProtocol(f, nsA, "client-a", service, 80, v1.ProtocolSCTP) - }) - ginkgo.By("Creating client-b, in server's namespace, which should be able to contact the server.", func() { - testCanConnectProtocol(f, nsA, "client-b", service, 80, v1.ProtocolSCTP) - }) - ginkgo.By("Creating client-a, not in server's namespace, which should be able to contact the server.", func() { - testCanConnectProtocol(f, nsB, "client-a", service, 80, v1.ProtocolSCTP) - }) - ginkgo.By("Creating client-b, not in server's namespace, which should be able to contact the server.", func() { - testCanConnectProtocol(f, nsB, "client-b", service, 80, v1.ProtocolSCTP) - }) - - ginkgo.By("Creating a network policy for the server which allows traffic only from client-a in namespace-b.") - policy := &networkingv1.NetworkPolicy{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: nsA.Name, - Name: "allow-ns-b-client-a-via-namespace-pod-selector", - }, - Spec: networkingv1.NetworkPolicySpec{ - // Apply this policy to the Server - PodSelector: metav1.LabelSelector{ - MatchLabels: map[string]string{ - "pod-name": podServerLabelSelector, - }, - }, - // Allow traffic only from client-a in namespace-b - Ingress: []networkingv1.NetworkPolicyIngressRule{{ - From: []networkingv1.NetworkPolicyPeer{{ - NamespaceSelector: &metav1.LabelSelector{ - MatchLabels: map[string]string{ - "ns-name": nsBName, - }, - }, - PodSelector: &metav1.LabelSelector{ - MatchLabels: map[string]string{ - "pod-name": "client-a", - }, - }, - }}, - }}, - }, - } - - policy, err = f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).Create(context.TODO(), policy, metav1.CreateOptions{}) - framework.ExpectNoError(err, "Error occurred while creating policy: policy.") - defer cleanupNetworkPolicy(f, policy) - - ginkgo.By("Creating client-a, in server's namespace, which should not be able to contact the server.", func() { - testCannotConnectProtocol(f, nsA, "client-a", service, 80, v1.ProtocolSCTP) - }) - ginkgo.By("Creating client-b, in server's namespace, which should not be able to contact the server.", func() { - testCannotConnectProtocol(f, nsA, "client-b", service, 80, v1.ProtocolSCTP) - }) - ginkgo.By("Creating client-a, not in server's namespace, which should be able to contact the server.", func() { - testCanConnectProtocol(f, nsB, "client-a", service, 80, v1.ProtocolSCTP) - }) - ginkgo.By("Creating client-b, not in server's namespace, which should not be able to contact the server.", func() { - testCannotConnectProtocol(f, nsB, "client-b", service, 80, v1.ProtocolSCTP) - }) - }) - }) -}) - -func testCanConnect(f *framework.Framework, ns *v1.Namespace, podName string, service *v1.Service, targetPort int) { - testCanConnectProtocol(f, ns, podName, service, targetPort, v1.ProtocolTCP) -} - -func testCannotConnect(f *framework.Framework, ns *v1.Namespace, podName string, service *v1.Service, targetPort int) { - testCannotConnectProtocol(f, ns, podName, service, targetPort, v1.ProtocolTCP) -} - -func testCanConnectProtocol(f *framework.Framework, ns *v1.Namespace, podName string, service *v1.Service, targetPort int, protocol v1.Protocol) { - ginkgo.By(fmt.Sprintf("Creating client pod %s that should successfully connect to %s.", podName, service.Name)) - podClient := createNetworkClientPod(f, ns, podName, service, targetPort, protocol) - defer func() { - ginkgo.By(fmt.Sprintf("Cleaning up the pod %s", podClient.Name)) - if err := f.ClientSet.CoreV1().Pods(ns.Name).Delete(context.TODO(), podClient.Name, metav1.DeleteOptions{}); err != nil { - framework.Failf("unable to cleanup pod %v: %v", podClient.Name, err) - } - }() - checkConnectivity(f, ns, podClient, service) -} - -func testCannotConnectProtocol(f *framework.Framework, ns *v1.Namespace, podName string, service *v1.Service, targetPort int, protocol v1.Protocol) { - ginkgo.By(fmt.Sprintf("Creating client pod %s that should not be able to connect to %s.", podName, service.Name)) - podClient := createNetworkClientPod(f, ns, podName, service, targetPort, protocol) - defer func() { - ginkgo.By(fmt.Sprintf("Cleaning up the pod %s", podClient.Name)) - if err := f.ClientSet.CoreV1().Pods(ns.Name).Delete(context.TODO(), podClient.Name, metav1.DeleteOptions{}); err != nil { - framework.Failf("unable to cleanup pod %v: %v", podClient.Name, err) - } - }() - - checkNoConnectivity(f, ns, podClient, service) -} - -func checkConnectivity(f *framework.Framework, ns *v1.Namespace, podClient *v1.Pod, service *v1.Service) { - framework.Logf("Waiting for %s to complete.", podClient.Name) - err := e2epod.WaitForPodNoLongerRunningInNamespace(f.ClientSet, podClient.Name, ns.Name) - framework.ExpectNoError(err, "Pod did not finish as expected.") - - framework.Logf("Waiting for %s to complete.", podClient.Name) - err = e2epod.WaitForPodSuccessInNamespace(f.ClientSet, podClient.Name, ns.Name) - if err != nil { - // Dump debug information for the test namespace. - framework.DumpDebugInfo(f.ClientSet, f.Namespace.Name) - - pods, policies, logs := collectPodsAndNetworkPolicies(f, podClient) - framework.Failf("Pod %s should be able to connect to service %s, but was not able to connect.\nPod logs:\n%s\n\n Current NetworkPolicies:\n\t%v\n\n Pods:\n\t%v\n\n", podClient.Name, service.Name, logs, policies.Items, pods) - - } -} - -func checkNoConnectivity(f *framework.Framework, ns *v1.Namespace, podClient *v1.Pod, service *v1.Service) { - framework.Logf("Waiting for %s to complete.", podClient.Name) - err := e2epod.WaitForPodSuccessInNamespace(f.ClientSet, podClient.Name, ns.Name) - - // We expect an error here since it's a cannot connect test. - // Dump debug information if the error was nil. - if err == nil { - // Dump debug information for the test namespace. - framework.DumpDebugInfo(f.ClientSet, f.Namespace.Name) - - pods, policies, logs := collectPodsAndNetworkPolicies(f, podClient) - framework.Failf("Pod %s should not be able to connect to service %s, but was able to connect.\nPod logs:\n%s\n\n Current NetworkPolicies:\n\t%v\n\n Pods:\n\t %v\n\n", podClient.Name, service.Name, logs, policies.Items, pods) - - } -} - -func checkNoConnectivityByExitCode(f *framework.Framework, ns *v1.Namespace, podClient *v1.Pod, service *v1.Service) { - err := e2epod.WaitForPodCondition(f.ClientSet, ns.Name, podClient.Name, "terminated", framework.PodStartTimeout, func(pod *v1.Pod) (bool, error) { - statuses := pod.Status.ContainerStatuses - if len(statuses) == 0 || statuses[0].State.Terminated == nil { - return false, nil - } - if statuses[0].State.Terminated.ExitCode != 0 { - return true, fmt.Errorf("pod %q container exited with code: %d", podClient.Name, statuses[0].State.Terminated.ExitCode) - } - return true, nil - }) - // We expect an error here since it's a cannot connect test. - // Dump debug information if the error was nil. - if err == nil { - pods, policies, logs := collectPodsAndNetworkPolicies(f, podClient) - framework.Failf("Pod %s should not be able to connect to service %s, but was able to connect.\nPod logs:\n%s\n\n Current NetworkPolicies:\n\t%v\n\n Pods:\n\t%v\n\n", podClient.Name, service.Name, logs, policies.Items, pods) - - // Dump debug information for the test namespace. - framework.DumpDebugInfo(f.ClientSet, f.Namespace.Name) - } -} - -func collectPodsAndNetworkPolicies(f *framework.Framework, podClient *v1.Pod) ([]string, *networkingv1.NetworkPolicyList, string) { - // Collect pod logs when we see a failure. - logs, logErr := e2epod.GetPodLogs(f.ClientSet, f.Namespace.Name, podClient.Name, "client") - if logErr != nil && apierrors.IsNotFound(logErr) { - // Pod may have already been removed; try to get previous pod logs - logs, logErr = e2epod.GetPreviousPodLogs(f.ClientSet, f.Namespace.Name, podClient.Name, fmt.Sprintf("%s-container", podClient.Name)) - } - if logErr != nil { - framework.Logf("Error getting container logs: %s", logErr) - } - - // Collect current NetworkPolicies applied in the test namespace. - policies, err := f.ClientSet.NetworkingV1().NetworkPolicies(f.Namespace.Name).List(context.TODO(), metav1.ListOptions{}) - if err != nil { - framework.Logf("error getting current NetworkPolicies for %s namespace: %s", f.Namespace.Name, err) - } - // Collect the list of pods running in the test namespace. - podsInNS, err := e2epod.GetPodsInNamespace(f.ClientSet, f.Namespace.Name, map[string]string{}) - if err != nil { - framework.Logf("error getting pods for %s namespace: %s", f.Namespace.Name, err) - } - pods := []string{} - for _, p := range podsInNS { - pods = append(pods, fmt.Sprintf("Pod: %s, Status: %s\n", p.Name, p.Status.String())) - } - return pods, policies, logs -} - -// Create a server pod with a listening container for each port in ports[]. -// Will also assign a pod label with key: "pod-name" and label set to the given podName for later use by the network -// policy. -func createServerPodAndService(f *framework.Framework, namespace *v1.Namespace, podName string, ports []protocolPort) (*v1.Pod, *v1.Service) { - // Because we have a variable amount of ports, we'll first loop through and generate our Containers for our pod, - // and ServicePorts.for our Service. - containers := []v1.Container{} - servicePorts := []v1.ServicePort{} - for _, portProtocol := range ports { - var porterPort string - var connectProtocol string - switch portProtocol.protocol { - case v1.ProtocolTCP: - porterPort = fmt.Sprintf("SERVE_PORT_%d", portProtocol.port) - connectProtocol = "tcp" - case v1.ProtocolSCTP: - porterPort = fmt.Sprintf("SERVE_SCTP_PORT_%d", portProtocol.port) - connectProtocol = "sctp" - default: - framework.Failf("createServerPodAndService, unexpected protocol %v", portProtocol.protocol) - } - - containers = append(containers, v1.Container{ - Name: fmt.Sprintf("%s-container-%d", podName, portProtocol.port), - Image: imageutils.GetE2EImage(imageutils.Agnhost), - Args: []string{"porter"}, - Env: []v1.EnvVar{ - { - Name: porterPort, - Value: "foo", - }, - }, - Ports: []v1.ContainerPort{ - { - ContainerPort: int32(portProtocol.port), - Name: fmt.Sprintf("serve-%d", portProtocol.port), - Protocol: portProtocol.protocol, - }, - }, - ReadinessProbe: &v1.Probe{ - Handler: v1.Handler{ - Exec: &v1.ExecAction{ - Command: []string{"/agnhost", "connect", fmt.Sprintf("--protocol=%s", connectProtocol), "--timeout=1s", fmt.Sprintf("127.0.0.1:%d", portProtocol.port)}, - }, - }, - }, - }) - - // Build the Service Ports for the service. - servicePorts = append(servicePorts, v1.ServicePort{ - Name: fmt.Sprintf("%s-%d", podName, portProtocol.port), - Port: int32(portProtocol.port), - TargetPort: intstr.FromInt(portProtocol.port), - Protocol: portProtocol.protocol, - }) - } - - ginkgo.By(fmt.Sprintf("Creating a server pod %s in namespace %s", podName, namespace.Name)) - pod, err := f.ClientSet.CoreV1().Pods(namespace.Name).Create(context.TODO(), &v1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - GenerateName: podName + "-", - Labels: map[string]string{ - "pod-name": podName, - }, - }, - Spec: v1.PodSpec{ - Containers: containers, - RestartPolicy: v1.RestartPolicyNever, - }, - }, metav1.CreateOptions{}) - framework.ExpectNoError(err) - framework.Logf("Created pod %v", pod.ObjectMeta.Name) - - svcName := fmt.Sprintf("svc-%s", podName) - ginkgo.By(fmt.Sprintf("Creating a service %s for pod %s in namespace %s", svcName, podName, namespace.Name)) - svc, err := f.ClientSet.CoreV1().Services(namespace.Name).Create(context.TODO(), &v1.Service{ - ObjectMeta: metav1.ObjectMeta{ - Name: svcName, - }, - Spec: v1.ServiceSpec{ - Ports: servicePorts, - Selector: map[string]string{ - "pod-name": podName, - }, - }, - }, metav1.CreateOptions{}) - framework.ExpectNoError(err) - framework.Logf("Created service %s", svc.Name) - - return pod, svc -} - -func cleanupServerPodAndService(f *framework.Framework, pod *v1.Pod, service *v1.Service) { - ginkgo.By("Cleaning up the server.") - if err := f.ClientSet.CoreV1().Pods(pod.Namespace).Delete(context.TODO(), pod.Name, metav1.DeleteOptions{}); err != nil { - framework.Failf("unable to cleanup pod %v: %v", pod.Name, err) - } - ginkgo.By("Cleaning up the server's service.") - if err := f.ClientSet.CoreV1().Services(service.Namespace).Delete(context.TODO(), service.Name, metav1.DeleteOptions{}); err != nil { - framework.Failf("unable to cleanup svc %v: %v", service.Name, err) - } -} - -// Create a client pod which will attempt a netcat to the provided service, on the specified port. -// This client will attempt a one-shot connection, then die, without restarting the pod. -// Test can then be asserted based on whether the pod quit with an error or not. -func createNetworkClientPod(f *framework.Framework, namespace *v1.Namespace, podName string, targetService *v1.Service, targetPort int, protocol v1.Protocol) *v1.Pod { - return createNetworkClientPodWithRestartPolicy(f, namespace, podName, targetService, targetPort, protocol, v1.RestartPolicyNever) -} - -// Create a client pod which will attempt a netcat to the provided service, on the specified port. -// It is similar to createNetworkClientPod but supports specifying RestartPolicy. -func createNetworkClientPodWithRestartPolicy(f *framework.Framework, namespace *v1.Namespace, podName string, targetService *v1.Service, targetPort int, protocol v1.Protocol, restartPolicy v1.RestartPolicy) *v1.Pod { - var connectProtocol string - switch protocol { - case v1.ProtocolTCP: - connectProtocol = "tcp" - case v1.ProtocolSCTP: - connectProtocol = "sctp" - default: - framework.Failf("createNetworkClientPodWithRestartPolicy, unexpected protocol %v", protocol) - } - - pod, err := f.ClientSet.CoreV1().Pods(namespace.Name).Create(context.TODO(), &v1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - GenerateName: podName + "-", - Labels: map[string]string{ - "pod-name": podName, - }, - }, - Spec: v1.PodSpec{ - RestartPolicy: restartPolicy, - Containers: []v1.Container{ - { - Name: "client", - Image: imageutils.GetE2EImage(imageutils.Agnhost), - Command: []string{"/bin/sh"}, - Args: []string{ - "-c", - fmt.Sprintf("for i in $(seq 1 5); do /agnhost connect %s:%d --protocol %s --timeout 8s && exit 0 || sleep 1; done; exit 1", targetService.Spec.ClusterIP, targetPort, connectProtocol), - }, - }, - }, - }, - }, metav1.CreateOptions{}) - framework.ExpectNoError(err) - return pod -} - -// Patch pod with a map value -func updatePodLabel(f *framework.Framework, namespace *v1.Namespace, podName string, patchOperation string, patchPath string, patchValue map[string]string) *v1.Pod { - type patchMapValue struct { - Op string `json:"op"` - Path string `json:"path"` - Value map[string]string `json:"value,omitempty"` - } - payload := []patchMapValue{{ - Op: patchOperation, - Path: patchPath, - Value: patchValue, - }} - payloadBytes, err := json.Marshal(payload) - framework.ExpectNoError(err) - - pod, err := f.ClientSet.CoreV1().Pods(namespace.Name).Patch(context.TODO(), podName, types.JSONPatchType, payloadBytes, metav1.PatchOptions{}) - framework.ExpectNoError(err) - - return pod -} - -func cleanupNetworkPolicy(f *framework.Framework, policy *networkingv1.NetworkPolicy) { - ginkgo.By("Cleaning up the policy.") - if err := f.ClientSet.NetworkingV1().NetworkPolicies(policy.Namespace).Delete(context.TODO(), policy.Name, metav1.DeleteOptions{}); err != nil { - framework.Failf("unable to cleanup policy %v: %v", policy.Name, err) - } -} - -var _ = SIGDescribe("NetworkPolicy API", func() { - f := framework.NewDefaultFramework("networkpolicies") - /* - Release: v1.20 - Testname: NetworkPolicies API - Description: - - The networking.k8s.io API group MUST exist in the /apis discovery document. - - The networking.k8s.io/v1 API group/version MUST exist in the /apis/networking.k8s.io discovery document. - - The NetworkPolicies resources MUST exist in the /apis/networking.k8s.io/v1 discovery document. - - The NetworkPolicies resource must support create, get, list, watch, update, patch, delete, and deletecollection. - */ - - ginkgo.It("should support creating NetworkPolicy API operations", func() { - // Setup - ns := f.Namespace.Name - npVersion := "v1" - npClient := f.ClientSet.NetworkingV1().NetworkPolicies(ns) - npTemplate := &networkingv1.NetworkPolicy{ - ObjectMeta: metav1.ObjectMeta{GenerateName: "e2e-example-netpol", - Labels: map[string]string{ - "special-label": f.UniqueName, - }}, - Spec: networkingv1.NetworkPolicySpec{ - // Apply this policy to the Server - PodSelector: metav1.LabelSelector{ - MatchLabels: map[string]string{ - "pod-name": "test-pod", - }, - }, - // Allow traffic only from client-a in namespace-b - Ingress: []networkingv1.NetworkPolicyIngressRule{{ - From: []networkingv1.NetworkPolicyPeer{{ - NamespaceSelector: &metav1.LabelSelector{ - MatchLabels: map[string]string{ - "ns-name": "pod-b", - }, - }, - PodSelector: &metav1.LabelSelector{ - MatchLabels: map[string]string{ - "pod-name": "client-a", - }, - }, - }}, - }}, - }, - } - // Discovery - ginkgo.By("getting /apis") - { - discoveryGroups, err := f.ClientSet.Discovery().ServerGroups() - framework.ExpectNoError(err) - found := false - for _, group := range discoveryGroups.Groups { - if group.Name == networkingv1.GroupName { - for _, version := range group.Versions { - if version.Version == npVersion { - found = true - break - } - } - } - } - framework.ExpectEqual(found, true, fmt.Sprintf("expected networking API group/version, got %#v", discoveryGroups.Groups)) - } - ginkgo.By("getting /apis/networking.k8s.io") - { - group := &metav1.APIGroup{} - err := f.ClientSet.Discovery().RESTClient().Get().AbsPath("/apis/networking.k8s.io").Do(context.TODO()).Into(group) - framework.ExpectNoError(err) - found := false - for _, version := range group.Versions { - if version.Version == npVersion { - found = true - break - } - } - framework.ExpectEqual(found, true, fmt.Sprintf("expected networking API version, got %#v", group.Versions)) - } - ginkgo.By("getting /apis/networking.k8s.io" + npVersion) - { - resources, err := f.ClientSet.Discovery().ServerResourcesForGroupVersion(networkingv1.SchemeGroupVersion.String()) - framework.ExpectNoError(err) - foundNetPol := false - for _, resource := range resources.APIResources { - switch resource.Name { - case "networkpolicies": - foundNetPol = true - } - } - framework.ExpectEqual(foundNetPol, true, fmt.Sprintf("expected networkpolicies, got %#v", resources.APIResources)) - } - // NetPol resource create/read/update/watch verbs - ginkgo.By("creating") - _, err := npClient.Create(context.TODO(), npTemplate, metav1.CreateOptions{}) - framework.ExpectNoError(err) - _, err = npClient.Create(context.TODO(), npTemplate, metav1.CreateOptions{}) - framework.ExpectNoError(err) - createdNetPol, err := npClient.Create(context.TODO(), npTemplate, metav1.CreateOptions{}) - framework.ExpectNoError(err) - - ginkgo.By("getting") - gottenNetPol, err := npClient.Get(context.TODO(), createdNetPol.Name, metav1.GetOptions{}) - framework.ExpectNoError(err) - framework.ExpectEqual(gottenNetPol.UID, createdNetPol.UID) - - ginkgo.By("listing") - nps, err := npClient.List(context.TODO(), metav1.ListOptions{LabelSelector: "special-label=" + f.UniqueName}) - framework.ExpectNoError(err) - framework.ExpectEqual(len(nps.Items), 3, "filtered list should have 3 items") - - ginkgo.By("watching") - framework.Logf("starting watch") - npWatch, err := npClient.Watch(context.TODO(), metav1.ListOptions{ResourceVersion: nps.ResourceVersion, LabelSelector: "special-label=" + f.UniqueName}) - framework.ExpectNoError(err) - // Test cluster-wide list and watch - clusterNPClient := f.ClientSet.NetworkingV1().NetworkPolicies("") - ginkgo.By("cluster-wide listing") - clusterNPs, err := clusterNPClient.List(context.TODO(), metav1.ListOptions{LabelSelector: "special-label=" + f.UniqueName}) - framework.ExpectNoError(err) - framework.ExpectEqual(len(clusterNPs.Items), 3, "filtered list should have 3 items") - - ginkgo.By("cluster-wide watching") - framework.Logf("starting watch") - _, err = clusterNPClient.Watch(context.TODO(), metav1.ListOptions{ResourceVersion: nps.ResourceVersion, LabelSelector: "special-label=" + f.UniqueName}) - framework.ExpectNoError(err) - - ginkgo.By("patching") - patchedNetPols, err := npClient.Patch(context.TODO(), createdNetPol.Name, types.MergePatchType, []byte(`{"metadata":{"annotations":{"patched":"true"}}}`), metav1.PatchOptions{}) - framework.ExpectNoError(err) - framework.ExpectEqual(patchedNetPols.Annotations["patched"], "true", "patched object should have the applied annotation") - - ginkgo.By("updating") - npToUpdate := patchedNetPols.DeepCopy() - npToUpdate.Annotations["updated"] = "true" - updatedNetPols, err := npClient.Update(context.TODO(), npToUpdate, metav1.UpdateOptions{}) - framework.ExpectNoError(err) - framework.ExpectEqual(updatedNetPols.Annotations["updated"], "true", "updated object should have the applied annotation") - - framework.Logf("waiting for watch events with expected annotations") - for sawAnnotations := false; !sawAnnotations; { - select { - case evt, ok := <-npWatch.ResultChan(): - framework.ExpectEqual(ok, true, "watch channel should not close") - framework.ExpectEqual(evt.Type, watch.Modified) - watchedNetPol, isNetPol := evt.Object.(*networkingv1.NetworkPolicy) - framework.ExpectEqual(isNetPol, true, fmt.Sprintf("expected NetworkPolicy, got %T", evt.Object)) - if watchedNetPol.Annotations["patched"] == "true" && watchedNetPol.Annotations["updated"] == "true" { - framework.Logf("saw patched and updated annotations") - sawAnnotations = true - npWatch.Stop() - } else { - framework.Logf("missing expected annotations, waiting: %#v", watchedNetPol.Annotations) - } - case <-time.After(wait.ForeverTestTimeout): - framework.Fail("timed out waiting for watch event") - } - } - // NetPol resource delete operations - ginkgo.By("deleting") - err = npClient.Delete(context.TODO(), createdNetPol.Name, metav1.DeleteOptions{}) - framework.ExpectNoError(err) - _, err = npClient.Get(context.TODO(), createdNetPol.Name, metav1.GetOptions{}) - framework.ExpectEqual(apierrors.IsNotFound(err), true, fmt.Sprintf("expected 404, got %#v", err)) - nps, err = npClient.List(context.TODO(), metav1.ListOptions{LabelSelector: "special-label=" + f.UniqueName}) - framework.ExpectNoError(err) - framework.ExpectEqual(len(nps.Items), 2, "filtered list should have 2 items") - - ginkgo.By("deleting a collection") - err = npClient.DeleteCollection(context.TODO(), metav1.DeleteOptions{}, metav1.ListOptions{LabelSelector: "special-label=" + f.UniqueName}) - framework.ExpectNoError(err) - nps, err = npClient.List(context.TODO(), metav1.ListOptions{LabelSelector: "special-label=" + f.UniqueName}) - framework.ExpectNoError(err) - framework.ExpectEqual(len(nps.Items), 0, "filtered list should have 0 items") - }) -}) diff --git a/vendor/k8s.io/kubernetes/test/e2e/network/network_tiers.go b/vendor/k8s.io/kubernetes/test/e2e/network/network_tiers.go index 5ae68a5a1ee0..94e5e04123a7 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/network/network_tiers.go +++ b/vendor/k8s.io/kubernetes/test/e2e/network/network_tiers.go @@ -32,12 +32,13 @@ import ( "k8s.io/kubernetes/test/e2e/framework/providers/gce" e2eservice "k8s.io/kubernetes/test/e2e/framework/service" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" + "k8s.io/kubernetes/test/e2e/network/common" gcecloud "k8s.io/legacy-cloud-providers/gce" "github.com/onsi/ginkgo" ) -var _ = SIGDescribe("Services [Slow]", func() { +var _ = common.SIGDescribe("Services [Slow]", func() { f := framework.NewDefaultFramework("services") var cs clientset.Interface diff --git a/vendor/k8s.io/kubernetes/test/e2e/network/networking.go b/vendor/k8s.io/kubernetes/test/e2e/network/networking.go index eb6b67f36886..db109100e572 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/network/networking.go +++ b/vendor/k8s.io/kubernetes/test/e2e/network/networking.go @@ -33,6 +33,7 @@ import ( e2epod "k8s.io/kubernetes/test/e2e/framework/pod" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" e2essh "k8s.io/kubernetes/test/e2e/framework/ssh" + "k8s.io/kubernetes/test/e2e/network/common" "github.com/onsi/ginkgo" ) @@ -52,6 +53,7 @@ func checkConnectivityToHost(f *framework.Framework, nodeName, podName, host str pod := e2epod.NewAgnhostPod(f.Namespace.Name, podName, nil, nil, nil) pod.Spec.Containers[0].Command = command + pod.Spec.Containers[0].Args = nil // otherwise 'pause` is magically an argument to nc, which causes all hell to break loose pod.Spec.NodeName = nodeName pod.Spec.RestartPolicy = v1.RestartPolicyNever @@ -74,7 +76,7 @@ func checkConnectivityToHost(f *framework.Framework, nodeName, podName, host str return err } -var _ = SIGDescribe("Networking", func() { +var _ = common.SIGDescribe("Networking", func() { var svcname = "nettest" f := framework.NewDefaultFramework(svcname) @@ -466,10 +468,7 @@ var _ = SIGDescribe("Networking", func() { } }) - // skip because pods can not reach the endpoint in the same host if using UDP and hostNetwork - // xref: #95565 ginkgo.It("should function for pod-Service(hostNetwork): udp", func() { - e2eskipper.Skipf("skip because pods can not reach the endpoint in the same host if using UDP and hostNetwork #95565") config := e2enetwork.NewNetworkingTestConfig(f, e2enetwork.EndpointsUseHostNetwork) ginkgo.By(fmt.Sprintf("dialing(udp) %v --> %v:%v (config.clusterIP)", config.TestContainerPod.Name, config.ClusterIP, e2enetwork.ClusterUDPPort)) err := config.DialFromTestContainer("udp", config.ClusterIP, e2enetwork.ClusterUDPPort, config.MaxTries, 0, config.EndpointHostnames()) @@ -506,16 +505,27 @@ var _ = SIGDescribe("Networking", func() { ginkgo.By("node-Service(hostNetwork): http") ginkgo.By(fmt.Sprintf("dialing(http) %v (node) --> %v:%v (config.clusterIP)", config.NodeIP, config.ClusterIP, e2enetwork.ClusterHTTPPort)) - config.DialFromNode("http", config.ClusterIP, e2enetwork.ClusterHTTPPort, config.MaxTries, 0, config.EndpointHostnames()) + err = config.DialFromNode("http", config.ClusterIP, e2enetwork.ClusterHTTPPort, config.MaxTries, 0, config.EndpointHostnames()) + if err != nil { + framework.Failf("failed dialing endpoint, %v", err) + } ginkgo.By(fmt.Sprintf("dialing(http) %v (node) --> %v:%v (nodeIP)", config.NodeIP, config.NodeIP, config.NodeHTTPPort)) - config.DialFromNode("http", config.NodeIP, config.NodeHTTPPort, config.MaxTries, 0, config.EndpointHostnames()) - + err = config.DialFromNode("http", config.NodeIP, config.NodeHTTPPort, config.MaxTries, 0, config.EndpointHostnames()) + if err != nil { + framework.Failf("failed dialing endpoint, %v", err) + } ginkgo.By("node-Service(hostNetwork): udp") ginkgo.By(fmt.Sprintf("dialing(udp) %v (node) --> %v:%v (config.clusterIP)", config.NodeIP, config.ClusterIP, e2enetwork.ClusterUDPPort)) - config.DialFromNode("udp", config.ClusterIP, e2enetwork.ClusterUDPPort, config.MaxTries, 0, config.EndpointHostnames()) + err = config.DialFromNode("udp", config.ClusterIP, e2enetwork.ClusterUDPPort, config.MaxTries, 0, config.EndpointHostnames()) + if err != nil { + framework.Failf("failed dialing endpoint, %v", err) + } ginkgo.By(fmt.Sprintf("dialing(udp) %v (node) --> %v:%v (nodeIP)", config.NodeIP, config.NodeIP, config.NodeUDPPort)) - config.DialFromNode("udp", config.NodeIP, config.NodeUDPPort, config.MaxTries, 0, config.EndpointHostnames()) + err = config.DialFromNode("udp", config.NodeIP, config.NodeUDPPort, config.MaxTries, 0, config.EndpointHostnames()) + if err != nil { + framework.Failf("failed dialing endpoint, %v", err) + } ginkgo.By("handle large requests: http(hostNetwork)") diff --git a/vendor/k8s.io/kubernetes/test/e2e/network/networking_perf.go b/vendor/k8s.io/kubernetes/test/e2e/network/networking_perf.go index 73e49192b75c..ef81ba83d108 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/network/networking_perf.go +++ b/vendor/k8s.io/kubernetes/test/e2e/network/networking_perf.go @@ -18,145 +18,312 @@ package network // Tests network performance using iperf or other containers. import ( + "context" "fmt" "time" "github.com/onsi/ginkgo" + appsv1 "k8s.io/api/apps/v1" v1 "k8s.io/api/core/v1" + discoveryv1 "k8s.io/api/discovery/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/wait" + clientset "k8s.io/client-go/kubernetes" "k8s.io/kubernetes/test/e2e/framework" + e2edeployment "k8s.io/kubernetes/test/e2e/framework/deployment" e2enode "k8s.io/kubernetes/test/e2e/framework/node" - e2eservice "k8s.io/kubernetes/test/e2e/framework/service" + "k8s.io/kubernetes/test/e2e/network/common" imageutils "k8s.io/kubernetes/test/utils/image" ) const ( - // empirically derived as a baseline for expectations from running this test using kube-up.sh. - gceBandwidthBitsEstimate = int64(30000000000) - // on 4 node clusters, we found this test passes very quickly, generally in less then 100 seconds. - smallClusterTimeout = 200 * time.Second + // use this timeout for larger clusters + largeClusterTimeout = 400 * time.Second + // iperf2BaselineBandwidthMegabytesPerSecond sets a baseline for iperf2 bandwidth of 90 MB/s + iperf2BaselineBandwidthMegabytesPerSecond = 90 + // iperf2Port selects an arbitrary, unique port to run iperf2's client and server on + iperf2Port = 6789 + // labelKey is used as a key for selectors + labelKey = "app" + // clientLabelValue is used as a value for iperf2 client selectors + clientLabelValue = "iperf2-client" + // serverLabelValue is used as a value for iperf2 server selectors + serverLabelValue = "iperf2-server" + // serverServiceName defines the service name used for the iperf2 server + serverServiceName = "iperf2-server" ) -// Declared as Flakey since it has not been proven to run in parallel on small nodes or slow networks in CI -var _ = SIGDescribe("Networking IPerf [Experimental] [Slow] [Feature:Networking-Performance]", func() { +func iperf2ServerDeployment(client clientset.Interface, namespace string, isIPV6 bool) (*appsv1.Deployment, error) { + framework.Logf("deploying iperf2 server") + one := int64(1) + replicas := int32(1) + labels := map[string]string{labelKey: serverLabelValue} + args := []string{ + "-s", + "-p", + fmt.Sprintf("%d", iperf2Port), + } + if isIPV6 { + args = append(args, "-V") + } + deploymentSpec := &appsv1.Deployment{ + ObjectMeta: metav1.ObjectMeta{ + Name: "iperf2-server-deployment", + Labels: labels, + }, + Spec: appsv1.DeploymentSpec{ + Replicas: &replicas, + Selector: &metav1.LabelSelector{ + MatchLabels: labels, + }, + Template: v1.PodTemplateSpec{ + ObjectMeta: metav1.ObjectMeta{ + Labels: labels, + }, + Spec: v1.PodSpec{ + TerminationGracePeriodSeconds: &one, + Containers: []v1.Container{ + { + Name: "iperf2-server", + Image: imageutils.GetE2EImage(imageutils.Agnhost), + Command: []string{"iperf"}, + Args: args, + Ports: []v1.ContainerPort{ + { + ContainerPort: iperf2Port, + Protocol: v1.ProtocolTCP, + }, + }, + }, + }, + }, + }, + }, + } - f := framework.NewDefaultFramework("network-perf") + deployment, err := client.AppsV1().Deployments(namespace).Create(context.TODO(), deploymentSpec, metav1.CreateOptions{}) + if err != nil { + return nil, fmt.Errorf("deployment %q Create API error: %v", deploymentSpec.Name, err) + } + framework.Logf("Waiting for deployment %q to complete", deploymentSpec.Name) + err = e2edeployment.WaitForDeploymentComplete(client, deployment) + if err != nil { + return nil, fmt.Errorf("deployment %q failed to complete: %v", deploymentSpec.Name, err) + } - // A few simple bandwidth tests which are capped by nodes. - // TODO replace the 1 with the scale option implementation - // TODO: Make this a function parameter, once we distribute iperf endpoints, possibly via session affinity. - numClient := 1 - numServer := 1 - maxBandwidthBits := gceBandwidthBitsEstimate + return deployment, nil +} - familyStr := "" - if framework.TestContext.ClusterIsIPv6() { - familyStr = "-V " +func iperf2ServerService(client clientset.Interface, namespace string) (*v1.Service, error) { + service := &v1.Service{ + ObjectMeta: metav1.ObjectMeta{Name: serverServiceName}, + Spec: v1.ServiceSpec{ + Selector: map[string]string{ + labelKey: serverLabelValue, + }, + Ports: []v1.ServicePort{ + {Protocol: v1.ProtocolTCP, Port: iperf2Port}, + }, + }, } + return client.CoreV1().Services(namespace).Create(context.TODO(), service, metav1.CreateOptions{}) +} - ginkgo.It(fmt.Sprintf("should transfer ~ 1GB onto the service endpoint %v servers (maximum of %v clients)", numServer, numClient), func() { - nodes, err := e2enode.GetReadySchedulableNodes(f.ClientSet) - framework.ExpectNoError(err) - totalPods := len(nodes.Items) - // for a single service, we expect to divide bandwidth between the network. Very crude estimate. - expectedBandwidth := int(float64(maxBandwidthBits) / float64(totalPods)) - appName := "iperf-e2e" - _, err = e2eservice.CreateServiceForSimpleAppWithPods( - f.ClientSet, - 8001, - 8002, - f.Namespace.Name, - appName, - func(n v1.Node) v1.PodSpec { - return v1.PodSpec{ - Containers: []v1.Container{{ - Name: "iperf-server", - Image: imageutils.GetE2EImage(imageutils.Agnhost), - Command: []string{"/bin/sh"}, - Args: []string{ - "-c", - "/usr/local/bin/iperf " + familyStr + "-s -p 8001 ", - }, - Ports: []v1.ContainerPort{{ContainerPort: 8001}}, - }}, - NodeName: n.Name, - RestartPolicy: v1.RestartPolicyOnFailure, - } +func iperf2ClientDaemonSet(client clientset.Interface, namespace string) (*appsv1.DaemonSet, error) { + one := int64(1) + labels := map[string]string{labelKey: clientLabelValue} + spec := &appsv1.DaemonSet{ + ObjectMeta: metav1.ObjectMeta{ + Name: "iperf2-clients", + Labels: labels, + }, + Spec: appsv1.DaemonSetSpec{ + Selector: &metav1.LabelSelector{ + MatchLabels: labels, }, - // this will be used to generate the -service name which all iperf clients point at. - numServer, // Generally should be 1 server unless we do affinity or use a version of iperf that supports LB - true, // Make sure we wait, otherwise all the clients will die and need to restart. - ) - - if err != nil { - framework.Failf("Fatal error waiting for iperf server endpoint : %v", err) - } - - iperfClientPodLabels := e2enode.CreatePodsPerNodeForSimpleApp( - f.ClientSet, - f.Namespace.Name, - "iperf-e2e-cli", - func(n v1.Node) v1.PodSpec { - return v1.PodSpec{ + Template: v1.PodTemplateSpec{ + ObjectMeta: metav1.ObjectMeta{ + Labels: labels, + }, + Spec: v1.PodSpec{ Containers: []v1.Container{ { - Name: "iperf-client", + Name: "iperf2-client", Image: imageutils.GetE2EImage(imageutils.Agnhost), - Command: []string{"/bin/sh"}, - Args: []string{ - "-c", - "/usr/local/bin/iperf " + familyStr + "-c service-for-" + appName + " -p 8002 --reportstyle C && sleep 5", - }, + Command: []string{"/agnhost"}, + Args: []string{"pause"}, }, }, - RestartPolicy: v1.RestartPolicyOnFailure, // let them successfully die. - } + TerminationGracePeriodSeconds: &one, + }, }, - numClient, - ) - expectedCli := numClient - if len(nodes.Items) < expectedCli { - expectedCli = len(nodes.Items) + }, + Status: appsv1.DaemonSetStatus{}, + } + + ds, err := client.AppsV1().DaemonSets(namespace).Create(context.TODO(), spec, metav1.CreateOptions{}) + if err != nil { + return nil, fmt.Errorf("daemonset %s Create API error: %v", spec.Name, err) + } + return ds, nil +} + +// Test summary: +// This test uses iperf2 to obtain bandwidth data between nodes in the cluster, providing a coarse measure +// of the health of the cluster network. The test runs two sets of pods: +// 1. an iperf2 server on a single node +// 2. a daemonset of iperf2 clients +// The test then iterates through the clients, one by one, running iperf2 from each of them to transfer +// data to the server and back for ten seconds, after which the results are collected and parsed. +// Thus, if your cluster has 10 nodes, then 10 test runs are performed. +// Note: a more complete test could run this scenario with a daemonset of servers as well; however, this +// would require n^2 tests, n^2 time, and n^2 network resources which quickly become prohibitively large +// as the cluster size increases. +// Finally, after collecting all data, the results are analyzed and tabulated. +var _ = common.SIGDescribe("Networking IPerf2 [Feature:Networking-Performance]", func() { + // this test runs iperf2: one pod as a server, and a daemonset of clients + f := framework.NewDefaultFramework("network-perf") + + ginkgo.It(fmt.Sprintf("should run iperf2"), func() { + readySchedulableNodes, err := e2enode.GetReadySchedulableNodes(f.ClientSet) + framework.ExpectNoError(err) + + familyStr := "" + if framework.TestContext.ClusterIsIPv6() { + familyStr = "-V " } - framework.Logf("Reading all perf results to stdout.") - framework.Logf("date,cli,cliPort,server,serverPort,id,interval,transferBits,bandwidthBits") + serverPodsListOptions := metav1.ListOptions{ + LabelSelector: fmt.Sprintf("%s=%s", labelKey, serverLabelValue), + } - // Extra 1/10 second per client. - iperfTimeout := smallClusterTimeout + (time.Duration(expectedCli/10) * time.Second) - iperfResults := &IPerfResults{} + // Step 1: set up iperf2 server -- a single pod on any node + _, err = iperf2ServerDeployment(f.ClientSet, f.Namespace.Name, framework.TestContext.ClusterIsIPv6()) + framework.ExpectNoError(err, "deploy iperf2 server deployment") - iperfClusterVerification := f.NewClusterVerification( - f.Namespace, - framework.PodStateVerification{ - Selectors: iperfClientPodLabels, - ValidPhases: []v1.PodPhase{v1.PodSucceeded}, - }, - ) - - pods, err2 := iperfClusterVerification.WaitFor(expectedCli, iperfTimeout) - if err2 != nil { - framework.Failf("Error in wait...") - } else if len(pods) < expectedCli { - framework.Failf("IPerf restuls : Only got %v out of %v, after waiting %v", len(pods), expectedCli, iperfTimeout) - } else { - // For each builds up a collection of IPerfRecords - iperfClusterVerification.ForEach( - func(p v1.Pod) { - resultS, err := framework.LookForStringInLog(f.Namespace.Name, p.Name, "iperf-client", "0-", 1*time.Second) - if err == nil { - framework.Logf(resultS) - iperfResults.Add(NewIPerf(resultS)) - } else { - framework.Failf("Unexpected error, %v when running forEach on the pods.", err) - } - }) + _, err = iperf2ServerService(f.ClientSet, f.Namespace.Name) + framework.ExpectNoError(err, "deploy iperf2 server service") + + // Step 2: set up iperf2 client daemonset + // initially, the clients don't do anything -- they simply pause until they're called + _, err = iperf2ClientDaemonSet(f.ClientSet, f.Namespace.Name) + framework.ExpectNoError(err, "deploy iperf2 client daemonset") + + // Make sure the server is ready to go + framework.Logf("waiting for iperf2 server endpoints") + err = wait.Poll(2*time.Second, largeClusterTimeout, func() (done bool, err error) { + listOptions := metav1.ListOptions{LabelSelector: fmt.Sprintf("%s=%s", discoveryv1.LabelServiceName, serverServiceName)} + esList, err := f.ClientSet.DiscoveryV1().EndpointSlices(f.Namespace.Name).List(context.TODO(), listOptions) + framework.ExpectNoError(err, "Error fetching EndpointSlice for Service %s/%s", f.Namespace.Name, serverServiceName) + + if len(esList.Items) == 0 { + framework.Logf("EndpointSlice for Service %s/%s not found", f.Namespace.Name, serverServiceName) + return false, nil + } + return true, nil + }) + framework.ExpectNoError(err, "unable to wait for endpoints for the iperf service") + framework.Logf("found iperf2 server endpoints") + + clientPodsListOptions := metav1.ListOptions{ + LabelSelector: fmt.Sprintf("%s=%s", labelKey, clientLabelValue), + } + + framework.Logf("waiting for client pods to be running") + var clientPodList *v1.PodList + err = wait.Poll(2*time.Second, largeClusterTimeout, func() (done bool, err error) { + clientPodList, err = f.ClientSet.CoreV1().Pods(f.Namespace.Name).List(context.TODO(), clientPodsListOptions) + if err != nil { + return false, err + } + if len(clientPodList.Items) < len(readySchedulableNodes.Items) { + return false, nil + } + for _, pod := range clientPodList.Items { + if pod.Status.Phase != v1.PodRunning { + return false, nil + } + } + return true, nil + }) + framework.ExpectNoError(err, "unable to wait for client pods to come up") + framework.Logf("all client pods are ready: %d pods", len(clientPodList.Items)) + + // Get a reference to the server pod for later + serverPodList, err := f.ClientSet.CoreV1().Pods(f.Namespace.Name).List(context.TODO(), serverPodsListOptions) + framework.ExpectNoError(err) + if len(serverPodList.Items) != 1 { + framework.Failf("expected 1 server pod, found %d", len(serverPodList.Items)) } - fmt.Println("[begin] Node,Bandwidth CSV") - fmt.Println(iperfResults.ToTSV()) - fmt.Println("[end] Node,Bandwidth CSV") + serverPod := serverPodList.Items[0] + framework.Logf("server pod phase %s", serverPod.Status.Phase) + for i, condition := range serverPod.Status.Conditions { + framework.Logf("server pod condition %d: %+v", i, condition) + } + for i, cont := range serverPod.Status.ContainerStatuses { + framework.Logf("server pod container status %d: %+v", i, cont) + } + + framework.Logf("found %d matching client pods", len(clientPodList.Items)) + + nodeResults := &IPerf2NodeToNodeCSVResults{ + ServerNode: serverPod.Spec.NodeName, + Results: map[string]*IPerf2EnhancedCSVResults{}, + } + + // Step 3: iterate through the client pods one by one, running iperf2 in client mode to transfer + // data to the server and back and measure bandwidth + for _, pod := range clientPodList.Items { + podName := pod.Name + nodeName := pod.Spec.NodeName + + iperfVersion := f.ExecShellInPod(podName, "iperf -v || true") + framework.Logf("iperf version: %s", iperfVersion) - for ipClient, bandwidth := range iperfResults.BandwidthMap { - framework.Logf("%v had bandwidth %v. Ratio to expected (%v) was %f", ipClient, bandwidth, expectedBandwidth, float64(bandwidth)/float64(expectedBandwidth)) + for try := 0; ; try++ { + /* iperf2 command parameters: + * -e: use enhanced reporting giving more tcp/udp and traffic information + * -p %d: server port to connect to + * --reportstyle C: report as Comma-Separated Values + * -i 1: seconds between periodic bandwidth reports + * -c %s: run in client mode, connecting to + */ + command := fmt.Sprintf(`iperf %s -e -p %d --reportstyle C -i 1 -c %s && sleep 5`, familyStr, iperf2Port, serverServiceName) + framework.Logf("attempting to run command '%s' in client pod %s (node %s)", command, podName, nodeName) + output := f.ExecShellInPod(podName, command) + framework.Logf("output from exec on client pod %s (node %s): \n%s\n", podName, nodeName, output) + + results, err := ParseIPerf2EnhancedResultsFromCSV(output) + if err == nil { + nodeResults.Results[nodeName] = results + break + } else if try == 2 { + framework.ExpectNoError(err, "unable to parse iperf2 output from client pod %s (node %s)", pod.Name, nodeName) + } else { + framework.Logf("Retrying: IPerf run failed: %+v", err) + } + } + } + + // Step 4: after collecting all the client<->server data, compile and present the results + /* + Example output: + + Dec 22 07:52:41.102: INFO: From To Bandwidth (MB/s) + Dec 22 07:52:41.102: INFO: three-node-ipv6-worker three-node-ipv6-worker2 2381 + Dec 22 07:52:41.102: INFO: three-node-ipv6-worker2 three-node-ipv6-worker2 2214 + Dec 22 07:52:41.102: INFO: three-node-ipv6-worker3 three-node-ipv6-worker2 3123 + + */ + framework.Logf("%35s%35s%20s", "From", "To", "Bandwidth (MB/s)") + for nodeFrom, results := range nodeResults.Results { + framework.Logf("%35s%35s%20d", nodeFrom, nodeResults.ServerNode, results.Total.bandwidthMB()) + } + for clientNode, results := range nodeResults.Results { + megabytesPerSecond := results.Total.bandwidthMB() + if megabytesPerSecond < iperf2BaselineBandwidthMegabytesPerSecond { + framework.Failf("iperf2 MB/s received below baseline of %d for client %s to server %s: %d", iperf2BaselineBandwidthMegabytesPerSecond, clientNode, nodeResults.ServerNode, megabytesPerSecond) + } } }) }) diff --git a/vendor/k8s.io/kubernetes/test/e2e/network/no_snat.go b/vendor/k8s.io/kubernetes/test/e2e/network/no_snat.go index 7d415f27a3c5..254588010c79 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/network/no_snat.go +++ b/vendor/k8s.io/kubernetes/test/e2e/network/no_snat.go @@ -28,6 +28,7 @@ import ( "k8s.io/apimachinery/pkg/util/wait" "k8s.io/kubernetes/test/e2e/framework" + "k8s.io/kubernetes/test/e2e/network/common" imageutils "k8s.io/kubernetes/test/utils/image" ) @@ -58,7 +59,7 @@ var ( // This test verifies that a Pod on each node in a cluster can talk to Pods on every other node without SNAT. // We use the [Feature:NoSNAT] tag so that most jobs will skip this test by default. -var _ = SIGDescribe("NoSNAT [Feature:NoSNAT] [Slow]", func() { +var _ = common.SIGDescribe("NoSNAT [Feature:NoSNAT] [Slow]", func() { f := framework.NewDefaultFramework("no-snat-test") ginkgo.It("Should be able to send traffic between Pods without SNAT", func() { cs := f.ClientSet diff --git a/vendor/k8s.io/kubernetes/test/e2e/network/proxy.go b/vendor/k8s.io/kubernetes/test/e2e/network/proxy.go index 24dadf0c473b..921d83b7cd97 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/network/proxy.go +++ b/vendor/k8s.io/kubernetes/test/e2e/network/proxy.go @@ -19,7 +19,9 @@ limitations under the License. package network import ( + "bytes" "context" + "encoding/json" "fmt" "math" "net/http" @@ -32,10 +34,13 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/apimachinery/pkg/util/net" + "k8s.io/apimachinery/pkg/util/wait" clientset "k8s.io/client-go/kubernetes" + "k8s.io/client-go/transport" "k8s.io/kubernetes/test/e2e/framework" e2enode "k8s.io/kubernetes/test/e2e/framework/node" e2erc "k8s.io/kubernetes/test/e2e/framework/rc" + "k8s.io/kubernetes/test/e2e/network/common" testutils "k8s.io/kubernetes/test/utils" imageutils "k8s.io/kubernetes/test/utils/image" @@ -52,9 +57,19 @@ const ( // We have seen one of these calls take just over 15 seconds, so putting this at 30. proxyHTTPCallTimeout = 30 * time.Second + podRetryPeriod = 1 * time.Second + podRetryTimeout = 1 * time.Minute + + requestRetryPeriod = 10 * time.Millisecond + requestRetryTimeout = 1 * time.Minute ) -var _ = SIGDescribe("Proxy", func() { +type jsonResponse struct { + Method string + Body string +} + +var _ = common.SIGDescribe("Proxy", func() { version := "v1" ginkgo.Context("version "+version, func() { options := framework.Options{ @@ -258,9 +273,179 @@ var _ = SIGDescribe("Proxy", func() { framework.Failf(strings.Join(errs, "\n")) } }) + + /* + Release: v1.21 + Testname: Proxy, validate ProxyWithPath responses + Description: Attempt to create a pod and a service. A + set of pod and service endpoints MUST be accessed via + ProxyWithPath using a list of http methods. A valid + response MUST be returned for each endpoint. + */ + framework.ConformanceIt("A set of valid responses are returned for both pod and service ProxyWithPath", func() { + + ns := f.Namespace.Name + msg := "foo" + testSvcName := "test-service" + testSvcLabels := map[string]string{"test": "response"} + + framework.Logf("Creating pod...") + _, err := f.ClientSet.CoreV1().Pods(ns).Create(context.TODO(), &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "agnhost", + Labels: map[string]string{ + "test": "response"}, + }, + Spec: v1.PodSpec{ + Containers: []v1.Container{{ + Image: imageutils.GetE2EImage(imageutils.Agnhost), + Name: "agnhost", + Command: []string{"/agnhost", "porter", "--json-response"}, + Env: []v1.EnvVar{{ + Name: "SERVE_PORT_80", + Value: msg, + }}, + }}, + RestartPolicy: v1.RestartPolicyNever, + }}, metav1.CreateOptions{}) + framework.ExpectNoError(err, "failed to create pod") + + err = wait.PollImmediate(podRetryPeriod, podRetryTimeout, checkPodStatus(f, "test=response")) + framework.ExpectNoError(err, "Pod didn't start within time out period") + + framework.Logf("Creating service...") + _, err = f.ClientSet.CoreV1().Services(ns).Create(context.TODO(), &v1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: testSvcName, + Namespace: ns, + Labels: testSvcLabels, + }, + Spec: v1.ServiceSpec{ + Ports: []v1.ServicePort{{ + Port: 80, + TargetPort: intstr.FromInt(80), + Protocol: v1.ProtocolTCP, + }}, + Selector: map[string]string{ + "test": "response", + }, + }}, metav1.CreateOptions{}) + framework.ExpectNoError(err, "Failed to create the service") + + transportCfg, err := f.ClientConfig().TransportConfig() + framework.ExpectNoError(err, "Error creating transportCfg") + restTransport, err := transport.New(transportCfg) + framework.ExpectNoError(err, "Error creating restTransport") + + client := &http.Client{ + CheckRedirect: func(req *http.Request, via []*http.Request) error { + return http.ErrUseLastResponse + }, + Transport: restTransport, + } + + // All methods for Pod ProxyWithPath return 200 + // For all methods other than HEAD the response body returns 'foo' with the received http method + httpVerbs := []string{"DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT"} + for _, httpVerb := range httpVerbs { + + urlString := f.ClientConfig().Host + "/api/v1/namespaces/" + ns + "/pods/agnhost/proxy/some/path/with/" + httpVerb + framework.Logf("Starting http.Client for %s", urlString) + + pollErr := wait.PollImmediate(requestRetryPeriod, requestRetryTimeout, validateProxyVerbRequest(client, urlString, httpVerb, msg)) + framework.ExpectNoError(err, "Service didn't start within time out period. %v", pollErr) + } + + // All methods for Service ProxyWithPath return 200 + // For all methods other than HEAD the response body returns 'foo' with the received http method + for _, httpVerb := range httpVerbs { + + urlString := f.ClientConfig().Host + "/api/v1/namespaces/" + ns + "/services/test-service/proxy/some/path/with/" + httpVerb + framework.Logf("Starting http.Client for %s", urlString) + + pollErr := wait.PollImmediate(requestRetryPeriod, requestRetryTimeout, validateProxyVerbRequest(client, urlString, httpVerb, msg)) + framework.ExpectNoError(err, "Service didn't start within time out period. %v", pollErr) + } + }) }) }) +func checkPodStatus(f *framework.Framework, label string) func() (bool, error) { + return func() (bool, error) { + var err error + + list, err := f.ClientSet.CoreV1().Pods(f.Namespace.Name).List(context.TODO(), metav1.ListOptions{ + LabelSelector: label}) + + if err != nil { + return false, err + } + + if list.Items[0].Status.Phase != "Running" { + framework.Logf("Pod Quantity: %d Status: %s", len(list.Items), list.Items[0].Status.Phase) + return false, err + } + framework.Logf("Pod Status: %v", list.Items[0].Status.Phase) + return true, nil + } +} + +// validateProxyVerbRequest checks that a http request to a pod +// or service was valid for any http verb. Requires agnhost image +// with porter --json-response +func validateProxyVerbRequest(client *http.Client, urlString string, httpVerb string, msg string) func() (bool, error) { + return func() (bool, error) { + var err error + + request, err := http.NewRequest(httpVerb, urlString, nil) + if err != nil { + framework.Logf("Failed to get a new request. %v", err) + return false, nil + } + + resp, err := client.Do(request) + if err != nil { + framework.Logf("Failed to get a response. %v", err) + return false, nil + } + defer resp.Body.Close() + + buf := new(bytes.Buffer) + buf.ReadFrom(resp.Body) + response := buf.String() + + switch httpVerb { + case "HEAD": + framework.Logf("http.Client request:%s | StatusCode:%d", httpVerb, resp.StatusCode) + if resp.StatusCode != 200 { + return false, nil + } + return true, nil + default: + var jr *jsonResponse + err = json.Unmarshal([]byte(response), &jr) + if err != nil { + framework.Logf("Failed to process jsonResponse. %v", err) + return false, nil + } + + framework.Logf("http.Client request:%s | StatusCode:%d | Response:%s | Method:%s", httpVerb, resp.StatusCode, jr.Body, jr.Method) + if resp.StatusCode != 200 { + return false, nil + } + + if msg != jr.Body { + return false, nil + } + + if httpVerb != jr.Method { + return false, nil + } + return true, nil + } + } +} + func doProxy(f *framework.Framework, path string, i int) (body []byte, statusCode int, d time.Duration, err error) { // About all of the proxy accesses in this file: // * AbsPath is used because it preserves the trailing '/'. diff --git a/vendor/k8s.io/kubernetes/test/e2e/network/scale/BUILD b/vendor/k8s.io/kubernetes/test/e2e/network/scale/BUILD deleted file mode 100644 index 7bc5842e1c50..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/network/scale/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["ingress.go"], - importpath = "k8s.io/kubernetes/test/e2e/network/scale", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/networking/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//test/e2e/framework:go_default_library", - "//test/e2e/framework/ingress:go_default_library", - "//test/e2e/framework/providers/gce:go_default_library", - "//test/utils/image:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//test/e2e/network/scale/localrun:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/network/service.go b/vendor/k8s.io/kubernetes/test/e2e/network/service.go index a73a2d4a309c..cd1fbdb5684d 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/network/service.go +++ b/vendor/k8s.io/kubernetes/test/e2e/network/service.go @@ -30,16 +30,16 @@ import ( "time" utilnet "k8s.io/apimachinery/pkg/util/net" - - compute "google.golang.org/api/compute/v1" + utilrand "k8s.io/apimachinery/pkg/util/rand" "k8s.io/client-go/tools/cache" appsv1 "k8s.io/api/apps/v1" v1 "k8s.io/api/core/v1" - discoveryv1beta1 "k8s.io/api/discovery/v1beta1" + discoveryv1 "k8s.io/api/discovery/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" + "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/apimachinery/pkg/util/sets" @@ -47,23 +47,22 @@ import ( watch "k8s.io/apimachinery/pkg/watch" clientset "k8s.io/client-go/kubernetes" watchtools "k8s.io/client-go/tools/watch" + "k8s.io/client-go/util/retry" cloudprovider "k8s.io/cloud-provider" "k8s.io/kubernetes/test/e2e/framework" e2edeployment "k8s.io/kubernetes/test/e2e/framework/deployment" e2eendpoints "k8s.io/kubernetes/test/e2e/framework/endpoints" e2eendpointslice "k8s.io/kubernetes/test/e2e/framework/endpointslice" - e2ekubesystem "k8s.io/kubernetes/test/e2e/framework/kubesystem" e2enetwork "k8s.io/kubernetes/test/e2e/framework/network" e2enode "k8s.io/kubernetes/test/e2e/framework/node" e2epod "k8s.io/kubernetes/test/e2e/framework/pod" - "k8s.io/kubernetes/test/e2e/framework/providers/gce" e2erc "k8s.io/kubernetes/test/e2e/framework/rc" e2eservice "k8s.io/kubernetes/test/e2e/framework/service" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" + "k8s.io/kubernetes/test/e2e/network/common" "k8s.io/kubernetes/test/e2e/storage/utils" testutils "k8s.io/kubernetes/test/utils" imageutils "k8s.io/kubernetes/test/utils/image" - gcecloud "k8s.io/legacy-cloud-providers/gce" "github.com/onsi/ginkgo" "github.com/onsi/gomega" @@ -88,6 +87,8 @@ const ( clusterAddonLabelKey = "k8s-app" kubeAPIServerLabelName = "kube-apiserver" clusterComponentKey = "component" + + svcReadyTimeout = 1 * time.Minute ) var ( @@ -736,7 +737,7 @@ func getEndpointNodesWithInternalIP(jig *e2eservice.TestJig) (map[string]string, return endpointsNodeMap, nil } -var _ = SIGDescribe("Services", func() { +var _ = common.SIGDescribe("Services", func() { f := framework.NewDefaultFramework("services") var cs clientset.Interface @@ -788,8 +789,7 @@ var _ = SIGDescribe("Services", func() { _, err := jig.CreateTCPServiceWithPort(nil, 80) framework.ExpectNoError(err) - err = validateEndpointsPorts(cs, ns, serviceName, portsByPodName{}) - framework.ExpectNoError(err, "failed to validate endpoints for service %s in namespace: %s", serviceName, ns) + validateEndpointsPortsOrFail(cs, ns, serviceName, portsByPodName{}) names := map[string]bool{} defer func() { @@ -802,25 +802,21 @@ var _ = SIGDescribe("Services", func() { name1 := "pod1" name2 := "pod2" - createPodOrFail(cs, ns, name1, jig.Labels, []v1.ContainerPort{{ContainerPort: 80}}) + createPodOrFail(f, ns, name1, jig.Labels, []v1.ContainerPort{{ContainerPort: 80}}) names[name1] = true - err = validateEndpointsPorts(cs, ns, serviceName, portsByPodName{name1: {80}}) - framework.ExpectNoError(err, "failed to validate endpoints for service %s in namespace: %s", serviceName, ns) + validateEndpointsPortsOrFail(cs, ns, serviceName, portsByPodName{name1: {80}}) - createPodOrFail(cs, ns, name2, jig.Labels, []v1.ContainerPort{{ContainerPort: 80}}) + createPodOrFail(f, ns, name2, jig.Labels, []v1.ContainerPort{{ContainerPort: 80}}) names[name2] = true - err = validateEndpointsPorts(cs, ns, serviceName, portsByPodName{name1: {80}, name2: {80}}) - framework.ExpectNoError(err, "failed to validate endpoints for service %s in namespace: %s", serviceName, ns) + validateEndpointsPortsOrFail(cs, ns, serviceName, portsByPodName{name1: {80}, name2: {80}}) e2epod.DeletePodOrFail(cs, ns, name1) delete(names, name1) - err = validateEndpointsPorts(cs, ns, serviceName, portsByPodName{name2: {80}}) - framework.ExpectNoError(err, "failed to validate endpoints for service %s in namespace: %s", serviceName, ns) + validateEndpointsPortsOrFail(cs, ns, serviceName, portsByPodName{name2: {80}}) e2epod.DeletePodOrFail(cs, ns, name2) delete(names, name2) - err = validateEndpointsPorts(cs, ns, serviceName, portsByPodName{}) - framework.ExpectNoError(err, "failed to validate endpoints for service %s in namespace: %s", serviceName, ns) + validateEndpointsPortsOrFail(cs, ns, serviceName, portsByPodName{}) }) /* @@ -861,8 +857,7 @@ var _ = SIGDescribe("Services", func() { port1 := 100 port2 := 101 - err = validateEndpointsPorts(cs, ns, serviceName, portsByPodName{}) - framework.ExpectNoError(err, "failed to validate endpoints for service %s in namespace: %s", serviceName, ns) + validateEndpointsPortsOrFail(cs, ns, serviceName, portsByPodName{}) names := map[string]bool{} defer func() { @@ -888,25 +883,21 @@ var _ = SIGDescribe("Services", func() { podname1 := "pod1" podname2 := "pod2" - createPodOrFail(cs, ns, podname1, jig.Labels, containerPorts1) + createPodOrFail(f, ns, podname1, jig.Labels, containerPorts1) names[podname1] = true - err = validateEndpointsPorts(cs, ns, serviceName, portsByPodName{podname1: {port1}}) - framework.ExpectNoError(err, "failed to validate endpoints for service %s in namespace: %s", serviceName, ns) + validateEndpointsPortsOrFail(cs, ns, serviceName, portsByPodName{podname1: {port1}}) - createPodOrFail(cs, ns, podname2, jig.Labels, containerPorts2) + createPodOrFail(f, ns, podname2, jig.Labels, containerPorts2) names[podname2] = true - err = validateEndpointsPorts(cs, ns, serviceName, portsByPodName{podname1: {port1}, podname2: {port2}}) - framework.ExpectNoError(err, "failed to validate endpoints for service %s in namespace: %s", serviceName, ns) + validateEndpointsPortsOrFail(cs, ns, serviceName, portsByPodName{podname1: {port1}, podname2: {port2}}) e2epod.DeletePodOrFail(cs, ns, podname1) delete(names, podname1) - err = validateEndpointsPorts(cs, ns, serviceName, portsByPodName{podname2: {port2}}) - framework.ExpectNoError(err, "failed to validate endpoints for service %s in namespace: %s", serviceName, ns) + validateEndpointsPortsOrFail(cs, ns, serviceName, portsByPodName{podname2: {port2}}) e2epod.DeletePodOrFail(cs, ns, podname2) delete(names, podname2) - err = validateEndpointsPorts(cs, ns, serviceName, portsByPodName{}) - framework.ExpectNoError(err, "failed to validate endpoints for service %s in namespace: %s", serviceName, ns) + validateEndpointsPortsOrFail(cs, ns, serviceName, portsByPodName{}) }) ginkgo.It("should preserve source pod IP for traffic thru service cluster IP [LinuxOnly]", func() { @@ -928,6 +919,7 @@ var _ = SIGDescribe("Services", func() { ginkgo.By("creating a TCP service " + serviceName + " with type=ClusterIP in namespace " + ns) jig := e2eservice.NewTestJig(cs, ns, serviceName) + jig.ExternalIPs = true servicePort := 8080 tcpService, err := jig.CreateTCPServiceWithPort(nil, int32(servicePort)) framework.ExpectNoError(err) @@ -960,9 +952,7 @@ var _ = SIGDescribe("Services", func() { framework.ExpectNoError(err, "failed to delete pod: %s on node", serverPodName) }() - // Waiting for service to expose endpoint. - err = validateEndpointsPorts(cs, ns, serviceName, portsByPodName{serverPodName: {servicePort}}) - framework.ExpectNoError(err, "failed to validate endpoints for service %s in namespace: %s", serviceName, ns) + validateEndpointsPortsOrFail(cs, ns, serviceName, portsByPodName{serverPodName: {servicePort}}) ginkgo.By("Creating pause pod deployment") deployment := createPausePodDeployment(cs, "pause-pod", ns, nodeCounts) @@ -999,6 +989,7 @@ var _ = SIGDescribe("Services", func() { ginkgo.By("creating a TCP service " + serviceName + " with type=ClusterIP in namespace " + ns) jig := e2eservice.NewTestJig(cs, ns, serviceName) + jig.ExternalIPs = true servicePort := 8080 svc, err := jig.CreateTCPServiceWithPort(nil, int32(servicePort)) framework.ExpectNoError(err) @@ -1014,8 +1005,7 @@ var _ = SIGDescribe("Services", func() { framework.ExpectNoError(e2epod.WaitTimeoutForPodReadyInNamespace(f.ClientSet, pod.Name, f.Namespace.Name, framework.PodStartTimeout)) ginkgo.By("waiting for the service to expose an endpoint") - err = validateEndpointsPorts(cs, ns, serviceName, portsByPodName{serverPodName: {servicePort}}) - framework.ExpectNoError(err, "failed to validate endpoints for service %s in namespace: %s", serviceName, ns) + validateEndpointsPortsOrFail(cs, ns, serviceName, portsByPodName{serverPodName: {servicePort}}) ginkgo.By("Checking if the pod can reach itself") err = jig.CheckServiceReachability(svc, pod) @@ -1179,377 +1169,36 @@ var _ = SIGDescribe("Services", func() { framework.ExpectNoError(err) }) - // TODO: Get rid of [DisabledForLargeClusters] tag when issue #56138 is fixed. - ginkgo.It("should be able to change the type and ports of a service [Slow] [DisabledForLargeClusters]", func() { - // requires cloud load-balancer support - e2eskipper.SkipUnlessProviderIs("gce", "gke", "aws") - - loadBalancerSupportsUDP := !framework.ProviderIs("aws") - - loadBalancerLagTimeout := e2eservice.LoadBalancerLagTimeoutDefault - if framework.ProviderIs("aws") { - loadBalancerLagTimeout = e2eservice.LoadBalancerLagTimeoutAWS - } - loadBalancerCreateTimeout := e2eservice.GetServiceLoadBalancerCreationTimeout(cs) - - // This test is more monolithic than we'd like because LB turnup can be - // very slow, so we lumped all the tests into one LB lifecycle. - - serviceName := "mutability-test" - ns1 := f.Namespace.Name // LB1 in ns1 on TCP - framework.Logf("namespace for TCP test: %s", ns1) - - ginkgo.By("creating a second namespace") - namespacePtr, err := f.CreateNamespace("services", nil) - framework.ExpectNoError(err, "failed to create namespace") - ns2 := namespacePtr.Name // LB2 in ns2 on UDP - framework.Logf("namespace for UDP test: %s", ns2) - - nodeIP, err := e2enode.PickIP(cs) // for later - framework.ExpectNoError(err) - - // Test TCP and UDP Services. Services with the same name in different - // namespaces should get different node ports and load balancers. - - ginkgo.By("creating a TCP service " + serviceName + " with type=ClusterIP in namespace " + ns1) - tcpJig := e2eservice.NewTestJig(cs, ns1, serviceName) - tcpService, err := tcpJig.CreateTCPService(nil) - framework.ExpectNoError(err) - - ginkgo.By("creating a UDP service " + serviceName + " with type=ClusterIP in namespace " + ns2) - udpJig := e2eservice.NewTestJig(cs, ns2, serviceName) - udpService, err := udpJig.CreateUDPService(nil) - framework.ExpectNoError(err) - - ginkgo.By("verifying that TCP and UDP use the same port") - if tcpService.Spec.Ports[0].Port != udpService.Spec.Ports[0].Port { - framework.Failf("expected to use the same port for TCP and UDP") - } - svcPort := int(tcpService.Spec.Ports[0].Port) - framework.Logf("service port (TCP and UDP): %d", svcPort) - - ginkgo.By("creating a pod to be part of the TCP service " + serviceName) - _, err = tcpJig.Run(nil) - framework.ExpectNoError(err) - - ginkgo.By("creating a pod to be part of the UDP service " + serviceName) - _, err = udpJig.Run(nil) - framework.ExpectNoError(err) - - // Change the services to NodePort. - - ginkgo.By("changing the TCP service to type=NodePort") - tcpService, err = tcpJig.UpdateService(func(s *v1.Service) { - s.Spec.Type = v1.ServiceTypeNodePort - }) - framework.ExpectNoError(err) - tcpNodePort := int(tcpService.Spec.Ports[0].NodePort) - framework.Logf("TCP node port: %d", tcpNodePort) - - ginkgo.By("changing the UDP service to type=NodePort") - udpService, err = udpJig.UpdateService(func(s *v1.Service) { - s.Spec.Type = v1.ServiceTypeNodePort - }) - framework.ExpectNoError(err) - udpNodePort := int(udpService.Spec.Ports[0].NodePort) - framework.Logf("UDP node port: %d", udpNodePort) - - ginkgo.By("hitting the TCP service's NodePort") - e2eservice.TestReachableHTTP(nodeIP, tcpNodePort, e2eservice.KubeProxyLagTimeout) - - ginkgo.By("hitting the UDP service's NodePort") - testReachableUDP(nodeIP, udpNodePort, e2eservice.KubeProxyLagTimeout) - - // Change the services to LoadBalancer. - - // Here we test that LoadBalancers can receive static IP addresses. This isn't - // necessary, but is an additional feature this monolithic test checks. - requestedIP := "" - staticIPName := "" - if framework.ProviderIs("gce", "gke") { - ginkgo.By("creating a static load balancer IP") - staticIPName = fmt.Sprintf("e2e-external-lb-test-%s", framework.RunID) - gceCloud, err := gce.GetGCECloud() - framework.ExpectNoError(err, "failed to get GCE cloud provider") - - err = gceCloud.ReserveRegionAddress(&compute.Address{Name: staticIPName}, gceCloud.Region()) - defer func() { - if staticIPName != "" { - // Release GCE static IP - this is not kube-managed and will not be automatically released. - if err := gceCloud.DeleteRegionAddress(staticIPName, gceCloud.Region()); err != nil { - framework.Logf("failed to release static IP %s: %v", staticIPName, err) - } - } - }() - framework.ExpectNoError(err, "failed to create region address: %s", staticIPName) - reservedAddr, err := gceCloud.GetRegionAddress(staticIPName, gceCloud.Region()) - framework.ExpectNoError(err, "failed to get region address: %s", staticIPName) - - requestedIP = reservedAddr.Address - framework.Logf("Allocated static load balancer IP: %s", requestedIP) - } - - ginkgo.By("changing the TCP service to type=LoadBalancer") - tcpService, err = tcpJig.UpdateService(func(s *v1.Service) { - s.Spec.LoadBalancerIP = requestedIP // will be "" if not applicable - s.Spec.Type = v1.ServiceTypeLoadBalancer - }) - framework.ExpectNoError(err) - - if loadBalancerSupportsUDP { - ginkgo.By("changing the UDP service to type=LoadBalancer") - udpService, err = udpJig.UpdateService(func(s *v1.Service) { - s.Spec.Type = v1.ServiceTypeLoadBalancer - }) - framework.ExpectNoError(err) - } - serviceLBNames = append(serviceLBNames, cloudprovider.DefaultLoadBalancerName(tcpService)) - if loadBalancerSupportsUDP { - serviceLBNames = append(serviceLBNames, cloudprovider.DefaultLoadBalancerName(udpService)) - } - - ginkgo.By("waiting for the TCP service to have a load balancer") - // Wait for the load balancer to be created asynchronously - tcpService, err = tcpJig.WaitForLoadBalancer(loadBalancerCreateTimeout) - framework.ExpectNoError(err) - if int(tcpService.Spec.Ports[0].NodePort) != tcpNodePort { - framework.Failf("TCP Spec.Ports[0].NodePort changed (%d -> %d) when not expected", tcpNodePort, tcpService.Spec.Ports[0].NodePort) - } - if requestedIP != "" && e2eservice.GetIngressPoint(&tcpService.Status.LoadBalancer.Ingress[0]) != requestedIP { - framework.Failf("unexpected TCP Status.LoadBalancer.Ingress (expected %s, got %s)", requestedIP, e2eservice.GetIngressPoint(&tcpService.Status.LoadBalancer.Ingress[0])) - } - tcpIngressIP := e2eservice.GetIngressPoint(&tcpService.Status.LoadBalancer.Ingress[0]) - framework.Logf("TCP load balancer: %s", tcpIngressIP) - - if framework.ProviderIs("gce", "gke") { - // Do this as early as possible, which overrides the `defer` above. - // This is mostly out of fear of leaking the IP in a timeout case - // (as of this writing we're not 100% sure where the leaks are - // coming from, so this is first-aid rather than surgery). - ginkgo.By("demoting the static IP to ephemeral") - if staticIPName != "" { - gceCloud, err := gce.GetGCECloud() - framework.ExpectNoError(err, "failed to get GCE cloud provider") - // Deleting it after it is attached "demotes" it to an - // ephemeral IP, which can be auto-released. - if err := gceCloud.DeleteRegionAddress(staticIPName, gceCloud.Region()); err != nil { - framework.Failf("failed to release static IP %s: %v", staticIPName, err) - } - staticIPName = "" - } + /* + Create a ClusterIP service with an External IP that is not assigned to an interface. + The IP ranges here are reserved for documentation according to + [RFC 5737](https://tools.ietf.org/html/rfc5737) Section 3 and should not be used by any host. + */ + ginkgo.It("should be possible to connect to a service via ExternalIP when the external IP is not assigned to a node", func() { + serviceName := "externalip-test" + ns := f.Namespace.Name + externalIP := "203.0.113.250" + if framework.TestContext.ClusterIsIPv6() { + externalIP = "2001:DB8::cb00:71fa" } - var udpIngressIP string - if loadBalancerSupportsUDP { - ginkgo.By("waiting for the UDP service to have a load balancer") - // 2nd one should be faster since they ran in parallel. - udpService, err = udpJig.WaitForLoadBalancer(loadBalancerCreateTimeout) - framework.ExpectNoError(err) - if int(udpService.Spec.Ports[0].NodePort) != udpNodePort { - framework.Failf("UDP Spec.Ports[0].NodePort changed (%d -> %d) when not expected", udpNodePort, udpService.Spec.Ports[0].NodePort) - } - udpIngressIP = e2eservice.GetIngressPoint(&udpService.Status.LoadBalancer.Ingress[0]) - framework.Logf("UDP load balancer: %s", udpIngressIP) + jig := e2eservice.NewTestJig(cs, ns, serviceName) + jig.ExternalIPs = true - ginkgo.By("verifying that TCP and UDP use different load balancers") - if tcpIngressIP == udpIngressIP { - framework.Failf("Load balancers are not different: %s", e2eservice.GetIngressPoint(&tcpService.Status.LoadBalancer.Ingress[0])) + ginkgo.By("creating service " + serviceName + " with type=clusterIP in namespace " + ns) + clusterIPService, err := jig.CreateTCPService(func(svc *v1.Service) { + svc.Spec.Type = v1.ServiceTypeClusterIP + svc.Spec.ExternalIPs = []string{externalIP} + svc.Spec.Ports = []v1.ServicePort{ + {Port: 80, Name: "http", Protocol: v1.ProtocolTCP, TargetPort: intstr.FromInt(9376)}, } - } - - ginkgo.By("hitting the TCP service's NodePort") - e2eservice.TestReachableHTTP(nodeIP, tcpNodePort, e2eservice.KubeProxyLagTimeout) - - ginkgo.By("hitting the UDP service's NodePort") - testReachableUDP(nodeIP, udpNodePort, e2eservice.KubeProxyLagTimeout) - - ginkgo.By("hitting the TCP service's LoadBalancer") - e2eservice.TestReachableHTTP(tcpIngressIP, svcPort, loadBalancerLagTimeout) - - if loadBalancerSupportsUDP { - ginkgo.By("hitting the UDP service's LoadBalancer") - testReachableUDP(udpIngressIP, svcPort, loadBalancerLagTimeout) - } - - // Change the services' node ports. - - ginkgo.By("changing the TCP service's NodePort") - tcpService, err = tcpJig.ChangeServiceNodePort(tcpNodePort) - framework.ExpectNoError(err) - tcpNodePortOld := tcpNodePort - tcpNodePort = int(tcpService.Spec.Ports[0].NodePort) - if tcpNodePort == tcpNodePortOld { - framework.Failf("TCP Spec.Ports[0].NodePort (%d) did not change", tcpNodePort) - } - if e2eservice.GetIngressPoint(&tcpService.Status.LoadBalancer.Ingress[0]) != tcpIngressIP { - framework.Failf("TCP Status.LoadBalancer.Ingress changed (%s -> %s) when not expected", tcpIngressIP, e2eservice.GetIngressPoint(&tcpService.Status.LoadBalancer.Ingress[0])) - } - framework.Logf("TCP node port: %d", tcpNodePort) - - ginkgo.By("changing the UDP service's NodePort") - udpService, err = udpJig.ChangeServiceNodePort(udpNodePort) - framework.ExpectNoError(err) - udpNodePortOld := udpNodePort - udpNodePort = int(udpService.Spec.Ports[0].NodePort) - if udpNodePort == udpNodePortOld { - framework.Failf("UDP Spec.Ports[0].NodePort (%d) did not change", udpNodePort) - } - if loadBalancerSupportsUDP && e2eservice.GetIngressPoint(&udpService.Status.LoadBalancer.Ingress[0]) != udpIngressIP { - framework.Failf("UDP Status.LoadBalancer.Ingress changed (%s -> %s) when not expected", udpIngressIP, e2eservice.GetIngressPoint(&udpService.Status.LoadBalancer.Ingress[0])) - } - framework.Logf("UDP node port: %d", udpNodePort) - - ginkgo.By("hitting the TCP service's new NodePort") - e2eservice.TestReachableHTTP(nodeIP, tcpNodePort, e2eservice.KubeProxyLagTimeout) - - ginkgo.By("hitting the UDP service's new NodePort") - testReachableUDP(nodeIP, udpNodePort, e2eservice.KubeProxyLagTimeout) - - ginkgo.By("checking the old TCP NodePort is closed") - testNotReachableHTTP(nodeIP, tcpNodePortOld, e2eservice.KubeProxyLagTimeout) - - ginkgo.By("checking the old UDP NodePort is closed") - testNotReachableUDP(nodeIP, udpNodePortOld, e2eservice.KubeProxyLagTimeout) - - ginkgo.By("hitting the TCP service's LoadBalancer") - e2eservice.TestReachableHTTP(tcpIngressIP, svcPort, loadBalancerLagTimeout) - - if loadBalancerSupportsUDP { - ginkgo.By("hitting the UDP service's LoadBalancer") - testReachableUDP(udpIngressIP, svcPort, loadBalancerLagTimeout) - } - - // Change the services' main ports. - - ginkgo.By("changing the TCP service's port") - tcpService, err = tcpJig.UpdateService(func(s *v1.Service) { - s.Spec.Ports[0].Port++ }) framework.ExpectNoError(err) - svcPortOld := svcPort - svcPort = int(tcpService.Spec.Ports[0].Port) - if svcPort == svcPortOld { - framework.Failf("TCP Spec.Ports[0].Port (%d) did not change", svcPort) - } - if int(tcpService.Spec.Ports[0].NodePort) != tcpNodePort { - framework.Failf("TCP Spec.Ports[0].NodePort (%d) changed", tcpService.Spec.Ports[0].NodePort) - } - if e2eservice.GetIngressPoint(&tcpService.Status.LoadBalancer.Ingress[0]) != tcpIngressIP { - framework.Failf("TCP Status.LoadBalancer.Ingress changed (%s -> %s) when not expected", tcpIngressIP, e2eservice.GetIngressPoint(&tcpService.Status.LoadBalancer.Ingress[0])) - } - - ginkgo.By("changing the UDP service's port") - udpService, err = udpJig.UpdateService(func(s *v1.Service) { - s.Spec.Ports[0].Port++ - }) - framework.ExpectNoError(err) - if int(udpService.Spec.Ports[0].Port) != svcPort { - framework.Failf("UDP Spec.Ports[0].Port (%d) did not change", udpService.Spec.Ports[0].Port) - } - if int(udpService.Spec.Ports[0].NodePort) != udpNodePort { - framework.Failf("UDP Spec.Ports[0].NodePort (%d) changed", udpService.Spec.Ports[0].NodePort) - } - if loadBalancerSupportsUDP && e2eservice.GetIngressPoint(&udpService.Status.LoadBalancer.Ingress[0]) != udpIngressIP { - framework.Failf("UDP Status.LoadBalancer.Ingress changed (%s -> %s) when not expected", udpIngressIP, e2eservice.GetIngressPoint(&udpService.Status.LoadBalancer.Ingress[0])) - } - - framework.Logf("service port (TCP and UDP): %d", svcPort) - - ginkgo.By("hitting the TCP service's NodePort") - e2eservice.TestReachableHTTP(nodeIP, tcpNodePort, e2eservice.KubeProxyLagTimeout) - - ginkgo.By("hitting the UDP service's NodePort") - testReachableUDP(nodeIP, udpNodePort, e2eservice.KubeProxyLagTimeout) - - ginkgo.By("hitting the TCP service's LoadBalancer") - e2eservice.TestReachableHTTP(tcpIngressIP, svcPort, loadBalancerCreateTimeout) - - if loadBalancerSupportsUDP { - ginkgo.By("hitting the UDP service's LoadBalancer") - testReachableUDP(udpIngressIP, svcPort, loadBalancerCreateTimeout) - } - - ginkgo.By("Scaling the pods to 0") - err = tcpJig.Scale(0) - framework.ExpectNoError(err) - err = udpJig.Scale(0) - framework.ExpectNoError(err) - - ginkgo.By("looking for ICMP REJECT on the TCP service's NodePort") - testRejectedHTTP(nodeIP, tcpNodePort, e2eservice.KubeProxyLagTimeout) - - ginkgo.By("looking for ICMP REJECT on the UDP service's NodePort") - testRejectedUDP(nodeIP, udpNodePort, e2eservice.KubeProxyLagTimeout) - - ginkgo.By("looking for ICMP REJECT on the TCP service's LoadBalancer") - testRejectedHTTP(tcpIngressIP, svcPort, loadBalancerCreateTimeout) - - if loadBalancerSupportsUDP { - ginkgo.By("looking for ICMP REJECT on the UDP service's LoadBalancer") - testRejectedUDP(udpIngressIP, svcPort, loadBalancerCreateTimeout) - } - - ginkgo.By("Scaling the pods to 1") - err = tcpJig.Scale(1) - framework.ExpectNoError(err) - err = udpJig.Scale(1) - framework.ExpectNoError(err) - - ginkgo.By("hitting the TCP service's NodePort") - e2eservice.TestReachableHTTP(nodeIP, tcpNodePort, e2eservice.KubeProxyLagTimeout) - - ginkgo.By("hitting the UDP service's NodePort") - testReachableUDP(nodeIP, udpNodePort, e2eservice.KubeProxyLagTimeout) - - ginkgo.By("hitting the TCP service's LoadBalancer") - e2eservice.TestReachableHTTP(tcpIngressIP, svcPort, loadBalancerCreateTimeout) - - if loadBalancerSupportsUDP { - ginkgo.By("hitting the UDP service's LoadBalancer") - testReachableUDP(udpIngressIP, svcPort, loadBalancerCreateTimeout) - } - - // Change the services back to ClusterIP. - - ginkgo.By("changing TCP service back to type=ClusterIP") - tcpReadback, err := tcpJig.UpdateService(func(s *v1.Service) { - s.Spec.Type = v1.ServiceTypeClusterIP - }) - framework.ExpectNoError(err) - if tcpReadback.Spec.Ports[0].NodePort != 0 { - framework.Fail("TCP Spec.Ports[0].NodePort was not cleared") - } - // Wait for the load balancer to be destroyed asynchronously - _, err = tcpJig.WaitForLoadBalancerDestroy(tcpIngressIP, svcPort, loadBalancerCreateTimeout) + err = jig.CreateServicePods(2) framework.ExpectNoError(err) - - ginkgo.By("changing UDP service back to type=ClusterIP") - udpReadback, err := udpJig.UpdateService(func(s *v1.Service) { - s.Spec.Type = v1.ServiceTypeClusterIP - }) + execPod := e2epod.CreateExecPodOrFail(cs, ns, "execpod", nil) + err = jig.CheckServiceReachability(clusterIPService, execPod) framework.ExpectNoError(err) - if udpReadback.Spec.Ports[0].NodePort != 0 { - framework.Fail("UDP Spec.Ports[0].NodePort was not cleared") - } - if loadBalancerSupportsUDP { - // Wait for the load balancer to be destroyed asynchronously - _, err = udpJig.WaitForLoadBalancerDestroy(udpIngressIP, svcPort, loadBalancerCreateTimeout) - framework.ExpectNoError(err) - } - - ginkgo.By("checking the TCP NodePort is closed") - testNotReachableHTTP(nodeIP, tcpNodePort, e2eservice.KubeProxyLagTimeout) - - ginkgo.By("checking the UDP NodePort is closed") - testNotReachableUDP(nodeIP, udpNodePort, e2eservice.KubeProxyLagTimeout) - - ginkgo.By("checking the TCP LoadBalancer is closed") - testNotReachableHTTP(tcpIngressIP, svcPort, loadBalancerLagTimeout) - - if loadBalancerSupportsUDP { - ginkgo.By("checking the UDP LoadBalancer is closed") - testNotReachableUDP(udpIngressIP, svcPort, loadBalancerLagTimeout) - } }) /* @@ -1563,6 +1212,7 @@ var _ = SIGDescribe("Services", func() { serviceName := "nodeport-update-service" ns := f.Namespace.Name jig := e2eservice.NewTestJig(cs, ns, serviceName) + jig.ExternalIPs = true ginkgo.By("creating a TCP service " + serviceName + " with type=ClusterIP in namespace " + ns) tcpService, err := jig.CreateTCPService(nil) @@ -1588,7 +1238,7 @@ var _ = SIGDescribe("Services", func() { }) framework.ExpectNoError(err) - err = jig.CreateTCPUDPServicePods(2) + err = jig.CreateServicePods(2) framework.ExpectNoError(err) execPod := e2epod.CreateExecPodOrFail(cs, ns, "execpod", nil) err = jig.CheckServiceReachability(nodePortService, execPod) @@ -2117,279 +1767,6 @@ var _ = SIGDescribe("Services", func() { } }) - ginkgo.It("should only allow access from service loadbalancer source ranges [Slow]", func() { - // this feature currently supported only on GCE/GKE/AWS - e2eskipper.SkipUnlessProviderIs("gce", "gke", "aws") - - loadBalancerLagTimeout := e2eservice.LoadBalancerLagTimeoutDefault - if framework.ProviderIs("aws") { - loadBalancerLagTimeout = e2eservice.LoadBalancerLagTimeoutAWS - } - loadBalancerCreateTimeout := e2eservice.GetServiceLoadBalancerCreationTimeout(cs) - - namespace := f.Namespace.Name - serviceName := "lb-sourcerange" - jig := e2eservice.NewTestJig(cs, namespace, serviceName) - - ginkgo.By("Prepare allow source ips") - // prepare the exec pods - // acceptPod are allowed to access the loadbalancer - acceptPod := e2epod.CreateExecPodOrFail(cs, namespace, "execpod-accept", nil) - dropPod := e2epod.CreateExecPodOrFail(cs, namespace, "execpod-drop", nil) - - ginkgo.By("creating a pod to be part of the service " + serviceName) - // This container is an nginx container listening on port 80 - // See kubernetes/contrib/ingress/echoheaders/nginx.conf for content of response - _, err := jig.Run(nil) - framework.ExpectNoError(err) - // Make sure acceptPod is running. There are certain chances that pod might be teminated due to unexpected reasons. - acceptPod, err = cs.CoreV1().Pods(namespace).Get(context.TODO(), acceptPod.Name, metav1.GetOptions{}) - framework.ExpectNoError(err, "Unable to get pod %s", acceptPod.Name) - framework.ExpectEqual(acceptPod.Status.Phase, v1.PodRunning) - framework.ExpectNotEqual(acceptPod.Status.PodIP, "") - - // Create loadbalancer service with source range from node[0] and podAccept - svc, err := jig.CreateTCPService(func(svc *v1.Service) { - svc.Spec.Type = v1.ServiceTypeLoadBalancer - svc.Spec.LoadBalancerSourceRanges = []string{acceptPod.Status.PodIP + "/32"} - }) - framework.ExpectNoError(err) - - defer func() { - ginkgo.By("Clean up loadbalancer service") - e2eservice.WaitForServiceDeletedWithFinalizer(cs, svc.Namespace, svc.Name) - }() - - svc, err = jig.WaitForLoadBalancer(loadBalancerCreateTimeout) - framework.ExpectNoError(err) - - // timeout when we haven't just created the load balancer - normalReachabilityTimeout := 2 * time.Minute - - ginkgo.By("check reachability from different sources") - svcIP := e2eservice.GetIngressPoint(&svc.Status.LoadBalancer.Ingress[0]) - // Wait longer as this is our first request after creation. We can't check using a separate method, - // because the LB should only be reachable from the "accept" pod - checkReachabilityFromPod(true, loadBalancerLagTimeout, namespace, acceptPod.Name, svcIP) - checkReachabilityFromPod(false, normalReachabilityTimeout, namespace, dropPod.Name, svcIP) - - // Make sure dropPod is running. There are certain chances that the pod might be teminated due to unexpected reasons. dropPod, err = cs.CoreV1().Pods(namespace).Get(dropPod.Name, metav1.GetOptions{}) - dropPod, err = cs.CoreV1().Pods(namespace).Get(context.TODO(), dropPod.Name, metav1.GetOptions{}) - framework.ExpectNoError(err, "Unable to get pod %s", dropPod.Name) - framework.ExpectEqual(acceptPod.Status.Phase, v1.PodRunning) - framework.ExpectNotEqual(acceptPod.Status.PodIP, "") - - ginkgo.By("Update service LoadBalancerSourceRange and check reachability") - _, err = jig.UpdateService(func(svc *v1.Service) { - // only allow access from dropPod - svc.Spec.LoadBalancerSourceRanges = []string{dropPod.Status.PodIP + "/32"} - }) - framework.ExpectNoError(err) - checkReachabilityFromPod(false, normalReachabilityTimeout, namespace, acceptPod.Name, svcIP) - checkReachabilityFromPod(true, normalReachabilityTimeout, namespace, dropPod.Name, svcIP) - - ginkgo.By("Delete LoadBalancerSourceRange field and check reachability") - _, err = jig.UpdateService(func(svc *v1.Service) { - svc.Spec.LoadBalancerSourceRanges = nil - }) - framework.ExpectNoError(err) - checkReachabilityFromPod(true, normalReachabilityTimeout, namespace, acceptPod.Name, svcIP) - checkReachabilityFromPod(true, normalReachabilityTimeout, namespace, dropPod.Name, svcIP) - }) - - ginkgo.It("should be able to create an internal type load balancer [Slow]", func() { - e2eskipper.SkipUnlessProviderIs("azure", "gke", "gce") - - createTimeout := e2eservice.GetServiceLoadBalancerCreationTimeout(cs) - pollInterval := framework.Poll * 10 - - namespace := f.Namespace.Name - serviceName := "lb-internal" - jig := e2eservice.NewTestJig(cs, namespace, serviceName) - - ginkgo.By("creating pod to be part of service " + serviceName) - _, err := jig.Run(nil) - framework.ExpectNoError(err) - - enableILB, disableILB := enableAndDisableInternalLB() - - isInternalEndpoint := func(lbIngress *v1.LoadBalancerIngress) bool { - ingressEndpoint := e2eservice.GetIngressPoint(lbIngress) - // Needs update for providers using hostname as endpoint. - return strings.HasPrefix(ingressEndpoint, "10.") - } - - ginkgo.By("creating a service with type LoadBalancer and cloud specific Internal-LB annotation enabled") - svc, err := jig.CreateTCPService(func(svc *v1.Service) { - svc.Spec.Type = v1.ServiceTypeLoadBalancer - enableILB(svc) - }) - framework.ExpectNoError(err) - - defer func() { - ginkgo.By("Clean up loadbalancer service") - e2eservice.WaitForServiceDeletedWithFinalizer(cs, svc.Namespace, svc.Name) - }() - - svc, err = jig.WaitForLoadBalancer(createTimeout) - framework.ExpectNoError(err) - lbIngress := &svc.Status.LoadBalancer.Ingress[0] - svcPort := int(svc.Spec.Ports[0].Port) - // should have an internal IP. - framework.ExpectEqual(isInternalEndpoint(lbIngress), true) - - // ILBs are not accessible from the test orchestrator, so it's necessary to use - // a pod to test the service. - ginkgo.By("hitting the internal load balancer from pod") - framework.Logf("creating pod with host network") - hostExec := launchHostExecPod(f.ClientSet, f.Namespace.Name, "ilb-host-exec") - - framework.Logf("Waiting up to %v for service %q's internal LB to respond to requests", createTimeout, serviceName) - tcpIngressIP := e2eservice.GetIngressPoint(lbIngress) - if pollErr := wait.PollImmediate(pollInterval, createTimeout, func() (bool, error) { - cmd := fmt.Sprintf(`curl -m 5 'http://%v:%v/echo?msg=hello'`, tcpIngressIP, svcPort) - stdout, err := framework.RunHostCmd(hostExec.Namespace, hostExec.Name, cmd) - if err != nil { - framework.Logf("error curling; stdout: %v. err: %v", stdout, err) - return false, nil - } - - if !strings.Contains(stdout, "hello") { - framework.Logf("Expected output to contain 'hello', got %q; retrying...", stdout) - return false, nil - } - - framework.Logf("Successful curl; stdout: %v", stdout) - return true, nil - }); pollErr != nil { - framework.Failf("ginkgo.Failed to hit ILB IP, err: %v", pollErr) - } - - ginkgo.By("switching to external type LoadBalancer") - svc, err = jig.UpdateService(func(svc *v1.Service) { - disableILB(svc) - }) - framework.ExpectNoError(err) - framework.Logf("Waiting up to %v for service %q to have an external LoadBalancer", createTimeout, serviceName) - if pollErr := wait.PollImmediate(pollInterval, createTimeout, func() (bool, error) { - svc, err := cs.CoreV1().Services(namespace).Get(context.TODO(), serviceName, metav1.GetOptions{}) - if err != nil { - return false, err - } - lbIngress = &svc.Status.LoadBalancer.Ingress[0] - return !isInternalEndpoint(lbIngress), nil - }); pollErr != nil { - framework.Failf("Loadbalancer IP not changed to external.") - } - // should have an external IP. - gomega.Expect(isInternalEndpoint(lbIngress)).To(gomega.BeFalse()) - - ginkgo.By("hitting the external load balancer") - framework.Logf("Waiting up to %v for service %q's external LB to respond to requests", createTimeout, serviceName) - tcpIngressIP = e2eservice.GetIngressPoint(lbIngress) - e2eservice.TestReachableHTTP(tcpIngressIP, svcPort, e2eservice.LoadBalancerLagTimeoutDefault) - - // GCE cannot test a specific IP because the test may not own it. This cloud specific condition - // will be removed when GCP supports similar functionality. - if framework.ProviderIs("azure") { - ginkgo.By("switching back to interal type LoadBalancer, with static IP specified.") - internalStaticIP := "10.240.11.11" - svc, err = jig.UpdateService(func(svc *v1.Service) { - svc.Spec.LoadBalancerIP = internalStaticIP - enableILB(svc) - }) - framework.ExpectNoError(err) - framework.Logf("Waiting up to %v for service %q to have an internal LoadBalancer", createTimeout, serviceName) - if pollErr := wait.PollImmediate(pollInterval, createTimeout, func() (bool, error) { - svc, err := cs.CoreV1().Services(namespace).Get(context.TODO(), serviceName, metav1.GetOptions{}) - if err != nil { - return false, err - } - lbIngress = &svc.Status.LoadBalancer.Ingress[0] - return isInternalEndpoint(lbIngress), nil - }); pollErr != nil { - framework.Failf("Loadbalancer IP not changed to internal.") - } - // should have the given static internal IP. - framework.ExpectEqual(e2eservice.GetIngressPoint(lbIngress), internalStaticIP) - } - }) - - // This test creates a load balancer, make sure its health check interval - // equals to gceHcCheckIntervalSeconds. Then the interval is manipulated - // to be something else, see if the interval will be reconciled. - ginkgo.It("should reconcile LB health check interval [Slow][Serial]", func() { - const gceHcCheckIntervalSeconds = int64(8) - // This test is for clusters on GCE. - // (It restarts kube-controller-manager, which we don't support on GKE) - e2eskipper.SkipUnlessProviderIs("gce") - e2eskipper.SkipUnlessSSHKeyPresent() - - clusterID, err := gce.GetClusterID(cs) - if err != nil { - framework.Failf("framework.GetClusterID(cs) = _, %v; want nil", err) - } - gceCloud, err := gce.GetGCECloud() - if err != nil { - framework.Failf("framework.GetGCECloud() = _, %v; want nil", err) - } - - namespace := f.Namespace.Name - serviceName := "lb-hc-int" - jig := e2eservice.NewTestJig(cs, namespace, serviceName) - - ginkgo.By("create load balancer service") - // Create loadbalancer service with source range from node[0] and podAccept - svc, err := jig.CreateTCPService(func(svc *v1.Service) { - svc.Spec.Type = v1.ServiceTypeLoadBalancer - }) - framework.ExpectNoError(err) - - defer func() { - ginkgo.By("Clean up loadbalancer service") - e2eservice.WaitForServiceDeletedWithFinalizer(cs, svc.Namespace, svc.Name) - }() - - svc, err = jig.WaitForLoadBalancer(e2eservice.GetServiceLoadBalancerCreationTimeout(cs)) - framework.ExpectNoError(err) - - hcName := gcecloud.MakeNodesHealthCheckName(clusterID) - hc, err := gceCloud.GetHTTPHealthCheck(hcName) - if err != nil { - framework.Failf("gceCloud.GetHttpHealthCheck(%q) = _, %v; want nil", hcName, err) - } - framework.ExpectEqual(hc.CheckIntervalSec, gceHcCheckIntervalSeconds) - - ginkgo.By("modify the health check interval") - hc.CheckIntervalSec = gceHcCheckIntervalSeconds - 1 - if err = gceCloud.UpdateHTTPHealthCheck(hc); err != nil { - framework.Failf("gcecloud.UpdateHttpHealthCheck(%#v) = %v; want nil", hc, err) - } - - ginkgo.By("restart kube-controller-manager") - if err := e2ekubesystem.RestartControllerManager(); err != nil { - framework.Failf("e2ekubesystem.RestartControllerManager() = %v; want nil", err) - } - if err := e2ekubesystem.WaitForControllerManagerUp(); err != nil { - framework.Failf("e2ekubesystem.WaitForControllerManagerUp() = %v; want nil", err) - } - - ginkgo.By("health check should be reconciled") - pollInterval := framework.Poll * 10 - loadBalancerPropagationTimeout := e2eservice.GetServiceLoadBalancerPropagationTimeout(cs) - if pollErr := wait.PollImmediate(pollInterval, loadBalancerPropagationTimeout, func() (bool, error) { - hc, err := gceCloud.GetHTTPHealthCheck(hcName) - if err != nil { - framework.Logf("ginkgo.Failed to get HttpHealthCheck(%q): %v", hcName, err) - return false, err - } - framework.Logf("hc.CheckIntervalSec = %v", hc.CheckIntervalSec) - return hc.CheckIntervalSec == gceHcCheckIntervalSeconds, nil - }); pollErr != nil { - framework.Failf("Health check %q does not reconcile its check interval to %d.", hcName, gceHcCheckIntervalSeconds) - } - }) - /* Release: v1.19 Testname: Service, ClusterIP type, session affinity to ClientIP @@ -2485,54 +1862,6 @@ var _ = SIGDescribe("Services", func() { execAffinityTestForNonLBServiceWithTransition(f, cs, svc) }) - // TODO: Get rid of [DisabledForLargeClusters] tag when issue #56138 is fixed. - // [LinuxOnly]: Windows does not support session affinity. - ginkgo.It("should have session affinity work for LoadBalancer service with ESIPP on [Slow] [DisabledForLargeClusters] [LinuxOnly]", func() { - // L4 load balancer affinity `ClientIP` is not supported on AWS ELB. - e2eskipper.SkipIfProviderIs("aws") - - svc := getServeHostnameService("affinity-lb-esipp") - svc.Spec.Type = v1.ServiceTypeLoadBalancer - svc.Spec.ExternalTrafficPolicy = v1.ServiceExternalTrafficPolicyTypeLocal - execAffinityTestForLBService(f, cs, svc) - }) - - // TODO: Get rid of [DisabledForLargeClusters] tag when issue #56138 is fixed. - // [LinuxOnly]: Windows does not support session affinity. - ginkgo.It("should be able to switch session affinity for LoadBalancer service with ESIPP on [Slow] [DisabledForLargeClusters] [LinuxOnly]", func() { - // L4 load balancer affinity `ClientIP` is not supported on AWS ELB. - e2eskipper.SkipIfProviderIs("aws") - - svc := getServeHostnameService("affinity-lb-esipp-transition") - svc.Spec.Type = v1.ServiceTypeLoadBalancer - svc.Spec.ExternalTrafficPolicy = v1.ServiceExternalTrafficPolicyTypeLocal - execAffinityTestForLBServiceWithTransition(f, cs, svc) - }) - - // TODO: Get rid of [DisabledForLargeClusters] tag when issue #56138 is fixed. - // [LinuxOnly]: Windows does not support session affinity. - ginkgo.It("should have session affinity work for LoadBalancer service with ESIPP off [Slow] [DisabledForLargeClusters] [LinuxOnly]", func() { - // L4 load balancer affinity `ClientIP` is not supported on AWS ELB. - e2eskipper.SkipIfProviderIs("aws") - - svc := getServeHostnameService("affinity-lb") - svc.Spec.Type = v1.ServiceTypeLoadBalancer - svc.Spec.ExternalTrafficPolicy = v1.ServiceExternalTrafficPolicyTypeCluster - execAffinityTestForLBService(f, cs, svc) - }) - - // TODO: Get rid of [DisabledForLargeClusters] tag when issue #56138 is fixed. - // [LinuxOnly]: Windows does not support session affinity. - ginkgo.It("should be able to switch session affinity for LoadBalancer service with ESIPP off [Slow] [DisabledForLargeClusters] [LinuxOnly]", func() { - // L4 load balancer affinity `ClientIP` is not supported on AWS ELB. - e2eskipper.SkipIfProviderIs("aws") - - svc := getServeHostnameService("affinity-lb-transition") - svc.Spec.Type = v1.ServiceTypeLoadBalancer - svc.Spec.ExternalTrafficPolicy = v1.ServiceExternalTrafficPolicyTypeCluster - execAffinityTestForLBServiceWithTransition(f, cs, svc) - }) - ginkgo.It("should implement service.kubernetes.io/service-proxy-name", func() { ns := f.Namespace.Name numPods, servicePort := 3, defaultServeHostnameServicePort @@ -2679,44 +2008,6 @@ var _ = SIGDescribe("Services", func() { } }) - // This test verifies if service load balancer cleanup finalizer is properly - // handled during service lifecycle. - // 1. Create service with type=LoadBalancer. Finalizer should be added. - // 2. Update service to type=ClusterIP. Finalizer should be removed. - // 3. Update service to type=LoadBalancer. Finalizer should be added. - // 4. Delete service with type=LoadBalancer. Finalizer should be removed. - ginkgo.It("should handle load balancer cleanup finalizer for service [Slow]", func() { - jig := e2eservice.NewTestJig(cs, f.Namespace.Name, "lb-finalizer") - - ginkgo.By("Create load balancer service") - svc, err := jig.CreateTCPService(func(svc *v1.Service) { - svc.Spec.Type = v1.ServiceTypeLoadBalancer - }) - framework.ExpectNoError(err) - - defer func() { - ginkgo.By("Check that service can be deleted with finalizer") - e2eservice.WaitForServiceDeletedWithFinalizer(cs, svc.Namespace, svc.Name) - }() - - ginkgo.By("Wait for load balancer to serve traffic") - svc, err = jig.WaitForLoadBalancer(e2eservice.GetServiceLoadBalancerCreationTimeout(cs)) - framework.ExpectNoError(err) - - ginkgo.By("Check if finalizer presents on service with type=LoadBalancer") - e2eservice.WaitForServiceUpdatedWithFinalizer(cs, svc.Namespace, svc.Name, true) - - ginkgo.By("Check if finalizer is removed on service after changed to type=ClusterIP") - err = jig.ChangeServiceType(v1.ServiceTypeClusterIP, e2eservice.GetServiceLoadBalancerCreationTimeout(cs)) - framework.ExpectNoError(err) - e2eservice.WaitForServiceUpdatedWithFinalizer(cs, svc.Namespace, svc.Name, false) - - ginkgo.By("Check if finalizer is added back to service after changed to type=LoadBalancer") - err = jig.ChangeServiceType(v1.ServiceTypeLoadBalancer, e2eservice.GetServiceLoadBalancerCreationTimeout(cs)) - framework.ExpectNoError(err) - e2eservice.WaitForServiceUpdatedWithFinalizer(cs, svc.Namespace, svc.Name, true) - }) - /* Release: v1.18 Testname: Find Kubernetes Service in default Namespace @@ -2917,394 +2208,231 @@ var _ = SIGDescribe("Services", func() { _, err = f.ClientSet.CoreV1().Endpoints(testNamespaceName).Get(context.TODO(), testEndpointName, metav1.GetOptions{}) framework.ExpectError(err, "should not be able to fetch Endpoint") }) -}) - -var _ = SIGDescribe("ESIPP [Slow]", func() { - f := framework.NewDefaultFramework("esipp") - var loadBalancerCreateTimeout time.Duration - - var cs clientset.Interface - serviceLBNames := []string{} - - ginkgo.BeforeEach(func() { - // requires cloud load-balancer support - this feature currently supported only on GCE/GKE - e2eskipper.SkipUnlessProviderIs("gce", "gke") - - cs = f.ClientSet - loadBalancerCreateTimeout = e2eservice.GetServiceLoadBalancerCreationTimeout(cs) - }) - - ginkgo.AfterEach(func() { - if ginkgo.CurrentGinkgoTestDescription().Failed { - DescribeSvc(f.Namespace.Name) - } - for _, lb := range serviceLBNames { - framework.Logf("cleaning load balancer resource for %s", lb) - e2eservice.CleanupServiceResources(cs, lb, framework.TestContext.CloudConfig.Region, framework.TestContext.CloudConfig.Zone) - } - //reset serviceLBNames - serviceLBNames = []string{} - }) - - ginkgo.It("should work for type=LoadBalancer", func() { - namespace := f.Namespace.Name - serviceName := "external-local-lb" - jig := e2eservice.NewTestJig(cs, namespace, serviceName) - svc, err := jig.CreateOnlyLocalLoadBalancerService(loadBalancerCreateTimeout, true, nil) - framework.ExpectNoError(err) - serviceLBNames = append(serviceLBNames, cloudprovider.DefaultLoadBalancerName(svc)) - healthCheckNodePort := int(svc.Spec.HealthCheckNodePort) - if healthCheckNodePort == 0 { - framework.Failf("Service HealthCheck NodePort was not allocated") - } - defer func() { - err = jig.ChangeServiceType(v1.ServiceTypeClusterIP, loadBalancerCreateTimeout) - framework.ExpectNoError(err) - - // Make sure we didn't leak the health check node port. - const threshold = 2 - nodes, err := getEndpointNodesWithInternalIP(jig) - framework.ExpectNoError(err) - config := e2enetwork.NewNetworkingTestConfig(f) - for _, internalIP := range nodes { - err := testHTTPHealthCheckNodePortFromTestContainer( - config, - internalIP, - healthCheckNodePort, - e2eservice.KubeProxyLagTimeout, - false, - threshold) - framework.ExpectNoError(err) - } - err = cs.CoreV1().Services(svc.Namespace).Delete(context.TODO(), svc.Name, metav1.DeleteOptions{}) - framework.ExpectNoError(err) - }() - - svcTCPPort := int(svc.Spec.Ports[0].Port) - ingressIP := e2eservice.GetIngressPoint(&svc.Status.LoadBalancer.Ingress[0]) - - ginkgo.By("reading clientIP using the TCP service's service port via its external VIP") - content := GetHTTPContent(ingressIP, svcTCPPort, e2eservice.KubeProxyLagTimeout, "/clientip") - clientIP := content.String() - framework.Logf("ClientIP detected by target pod using VIP:SvcPort is %s", clientIP) - - ginkgo.By("checking if Source IP is preserved") - if strings.HasPrefix(clientIP, "10.") { - framework.Failf("Source IP was NOT preserved") - } - }) - - ginkgo.It("should work for type=NodePort", func() { - namespace := f.Namespace.Name - serviceName := "external-local-nodeport" - jig := e2eservice.NewTestJig(cs, namespace, serviceName) + /* + Release: v1.21 + Testname: Service, complete ServiceStatus lifecycle + Description: Create a service, the service MUST exist. + When retrieving /status the action MUST be validated. + When patching /status the action MUST be validated. + When updating /status the action MUST be validated. + When patching a service the action MUST be validated. + */ + framework.ConformanceIt("should complete a service status lifecycle", func() { - svc, err := jig.CreateOnlyLocalNodePortService(true) - framework.ExpectNoError(err) - defer func() { - err := cs.CoreV1().Services(svc.Namespace).Delete(context.TODO(), svc.Name, metav1.DeleteOptions{}) - framework.ExpectNoError(err) - }() + ns := f.Namespace.Name + svcResource := schema.GroupVersionResource{Group: "", Version: "v1", Resource: "services"} + svcClient := f.ClientSet.CoreV1().Services(ns) - tcpNodePort := int(svc.Spec.Ports[0].NodePort) + testSvcName := "test-service-" + utilrand.String(5) + testSvcLabels := map[string]string{"test-service-static": "true"} + testSvcLabelsFlat := "test-service-static=true" - endpointsNodeMap, err := getEndpointNodesWithInternalIP(jig) - framework.ExpectNoError(err) - - dialCmd := "clientip" - config := e2enetwork.NewNetworkingTestConfig(f) - - for nodeName, nodeIP := range endpointsNodeMap { - ginkgo.By(fmt.Sprintf("reading clientIP using the TCP service's NodePort, on node %v: %v:%v/%v", nodeName, nodeIP, tcpNodePort, dialCmd)) - clientIP, err := GetHTTPContentFromTestContainer(config, nodeIP, tcpNodePort, e2eservice.KubeProxyLagTimeout, dialCmd) - framework.ExpectNoError(err) - framework.Logf("ClientIP detected by target pod using NodePort is %s, the ip of test container is %s", clientIP, config.TestContainerPod.Status.PodIP) - // the clientIP returned by agnhost contains port - if !strings.HasPrefix(clientIP, config.TestContainerPod.Status.PodIP) { - framework.Failf("Source IP was NOT preserved") - } + w := &cache.ListWatch{ + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { + options.LabelSelector = testSvcLabelsFlat + return cs.CoreV1().Services(ns).Watch(context.TODO(), options) + }, } - }) - ginkgo.It("should only target nodes with endpoints", func() { - namespace := f.Namespace.Name - serviceName := "external-local-nodes" - jig := e2eservice.NewTestJig(cs, namespace, serviceName) - nodes, err := e2enode.GetBoundedReadySchedulableNodes(cs, e2eservice.MaxNodesForEndpointsTests) - framework.ExpectNoError(err) + svcList, err := cs.CoreV1().Services("").List(context.TODO(), metav1.ListOptions{LabelSelector: testSvcLabelsFlat}) + framework.ExpectNoError(err, "failed to list Services") - svc, err := jig.CreateOnlyLocalLoadBalancerService(loadBalancerCreateTimeout, false, - func(svc *v1.Service) { - // Change service port to avoid collision with opened hostPorts - // in other tests that run in parallel. - if len(svc.Spec.Ports) != 0 { - svc.Spec.Ports[0].TargetPort = intstr.FromInt(int(svc.Spec.Ports[0].Port)) - svc.Spec.Ports[0].Port = 8081 - } - - }) - framework.ExpectNoError(err) - serviceLBNames = append(serviceLBNames, cloudprovider.DefaultLoadBalancerName(svc)) - defer func() { - err = jig.ChangeServiceType(v1.ServiceTypeClusterIP, loadBalancerCreateTimeout) - framework.ExpectNoError(err) - err := cs.CoreV1().Services(svc.Namespace).Delete(context.TODO(), svc.Name, metav1.DeleteOptions{}) - framework.ExpectNoError(err) - }() - - healthCheckNodePort := int(svc.Spec.HealthCheckNodePort) - if healthCheckNodePort == 0 { - framework.Failf("Service HealthCheck NodePort was not allocated") + ginkgo.By("creating a Service") + testService := v1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: testSvcName, + Labels: testSvcLabels, + }, + Spec: v1.ServiceSpec{ + Type: "ClusterIP", + Ports: []v1.ServicePort{{ + Name: "http", + Protocol: v1.ProtocolTCP, + Port: int32(80), + TargetPort: intstr.FromInt(80), + }}, + }, } + _, err = cs.CoreV1().Services(ns).Create(context.TODO(), &testService, metav1.CreateOptions{}) + framework.ExpectNoError(err, "failed to create Service") - ips := e2enode.CollectAddresses(nodes, v1.NodeInternalIP) - - ingressIP := e2eservice.GetIngressPoint(&svc.Status.LoadBalancer.Ingress[0]) - svcTCPPort := int(svc.Spec.Ports[0].Port) - - const threshold = 2 - config := e2enetwork.NewNetworkingTestConfig(f) - for i := 0; i < len(nodes.Items); i++ { - endpointNodeName := nodes.Items[i].Name - - ginkgo.By("creating a pod to be part of the service " + serviceName + " on node " + endpointNodeName) - _, err = jig.Run(func(rc *v1.ReplicationController) { - rc.Name = serviceName - if endpointNodeName != "" { - rc.Spec.Template.Spec.NodeName = endpointNodeName + ginkgo.By("watching for the Service to be added") + ctx, cancel := context.WithTimeout(context.Background(), svcReadyTimeout) + defer cancel() + _, err = watchtools.Until(ctx, svcList.ResourceVersion, w, func(event watch.Event) (bool, error) { + if svc, ok := event.Object.(*v1.Service); ok { + found := svc.ObjectMeta.Name == testService.ObjectMeta.Name && + svc.ObjectMeta.Namespace == ns && + svc.Labels["test-service-static"] == "true" + if !found { + framework.Logf("observed Service %v in namespace %v with labels: %v & ports %v", svc.ObjectMeta.Name, svc.ObjectMeta.Namespace, svc.Labels, svc.Spec.Ports) + return false, nil } - }) - framework.ExpectNoError(err) - - ginkgo.By(fmt.Sprintf("waiting for service endpoint on node %v", endpointNodeName)) - err = jig.WaitForEndpointOnNode(endpointNodeName) - framework.ExpectNoError(err) - - // HealthCheck should pass only on the node where num(endpoints) > 0 - // All other nodes should fail the healthcheck on the service healthCheckNodePort - for n, internalIP := range ips { - // Make sure the loadbalancer picked up the health check change. - // Confirm traffic can reach backend through LB before checking healthcheck nodeport. - e2eservice.TestReachableHTTP(ingressIP, svcTCPPort, e2eservice.KubeProxyLagTimeout) - expectedSuccess := nodes.Items[n].Name == endpointNodeName - port := strconv.Itoa(healthCheckNodePort) - ipPort := net.JoinHostPort(internalIP, port) - framework.Logf("Health checking %s, http://%s/healthz, expectedSuccess %v", nodes.Items[n].Name, ipPort, expectedSuccess) - err := testHTTPHealthCheckNodePortFromTestContainer( - config, - internalIP, - healthCheckNodePort, - e2eservice.KubeProxyEndpointLagTimeout, - expectedSuccess, - threshold) - framework.ExpectNoError(err) + framework.Logf("Found Service %v in namespace %v with labels: %v & ports %v", svc.ObjectMeta.Name, svc.ObjectMeta.Namespace, svc.Labels, svc.Spec.Ports) + return found, nil } - framework.ExpectNoError(e2erc.DeleteRCAndWaitForGC(f.ClientSet, namespace, serviceName)) - } - }) - - ginkgo.It("should work from pods", func() { - var err error - namespace := f.Namespace.Name - serviceName := "external-local-pods" - jig := e2eservice.NewTestJig(cs, namespace, serviceName) - - svc, err := jig.CreateOnlyLocalLoadBalancerService(loadBalancerCreateTimeout, true, nil) - framework.ExpectNoError(err) - serviceLBNames = append(serviceLBNames, cloudprovider.DefaultLoadBalancerName(svc)) - defer func() { - err = jig.ChangeServiceType(v1.ServiceTypeClusterIP, loadBalancerCreateTimeout) - framework.ExpectNoError(err) - err := cs.CoreV1().Services(svc.Namespace).Delete(context.TODO(), svc.Name, metav1.DeleteOptions{}) - framework.ExpectNoError(err) - }() - - ingressIP := e2eservice.GetIngressPoint(&svc.Status.LoadBalancer.Ingress[0]) - port := strconv.Itoa(int(svc.Spec.Ports[0].Port)) - ipPort := net.JoinHostPort(ingressIP, port) - path := fmt.Sprintf("%s/clientip", ipPort) - - ginkgo.By("Creating pause pod deployment to make sure, pausePods are in desired state") - deployment := createPausePodDeployment(cs, "pause-pod-deployment", namespace, 1) - framework.ExpectNoError(e2edeployment.WaitForDeploymentComplete(cs, deployment), "Failed to complete pause pod deployment") - - defer func() { - framework.Logf("Deleting deployment") - err = cs.AppsV1().Deployments(namespace).Delete(context.TODO(), deployment.Name, metav1.DeleteOptions{}) - framework.ExpectNoError(err, "Failed to delete deployment %s", deployment.Name) - }() - - deployment, err = cs.AppsV1().Deployments(namespace).Get(context.TODO(), deployment.Name, metav1.GetOptions{}) - framework.ExpectNoError(err, "Error in retrieving pause pod deployment") - labelSelector, err := metav1.LabelSelectorAsSelector(deployment.Spec.Selector) - framework.ExpectNoError(err, "Error in setting LabelSelector as selector from deployment") - - pausePods, err := cs.CoreV1().Pods(namespace).List(context.TODO(), metav1.ListOptions{LabelSelector: labelSelector.String()}) - framework.ExpectNoError(err, "Error in listing pods associated with pause pod deployments") - - pausePod := pausePods.Items[0] - framework.Logf("Waiting up to %v curl %v", e2eservice.KubeProxyLagTimeout, path) - cmd := fmt.Sprintf(`curl -q -s --connect-timeout 30 %v`, path) + framework.Logf("Observed event: %+v", event.Object) + return false, nil + }) + framework.ExpectNoError(err, "Failed to locate Service %v in namespace %v", testService.ObjectMeta.Name, ns) + framework.Logf("Service %s created", testSvcName) + + ginkgo.By("Getting /status") + svcStatusUnstructured, err := f.DynamicClient.Resource(svcResource).Namespace(ns).Get(context.TODO(), testSvcName, metav1.GetOptions{}, "status") + framework.ExpectNoError(err, "Failed to fetch ServiceStatus of Service %s in namespace %s", testSvcName, ns) + svcStatusBytes, err := json.Marshal(svcStatusUnstructured) + framework.ExpectNoError(err, "Failed to marshal unstructured response. %v", err) + + var svcStatus v1.Service + err = json.Unmarshal(svcStatusBytes, &svcStatus) + framework.ExpectNoError(err, "Failed to unmarshal JSON bytes to a Service object type") + framework.Logf("Service %s has LoadBalancer: %v", testSvcName, svcStatus.Status.LoadBalancer) + + ginkgo.By("patching the ServiceStatus") + lbStatus := v1.LoadBalancerStatus{ + Ingress: []v1.LoadBalancerIngress{{IP: "203.0.113.1"}}, + } + lbStatusJSON, err := json.Marshal(lbStatus) + framework.ExpectNoError(err, "Failed to marshal JSON. %v", err) + _, err = svcClient.Patch(context.TODO(), testSvcName, types.MergePatchType, + []byte(`{"metadata":{"annotations":{"patchedstatus":"true"}},"status":{"loadBalancer":`+string(lbStatusJSON)+`}}`), + metav1.PatchOptions{}, "status") + framework.ExpectNoError(err, "Could not patch service status", err) + + ginkgo.By("watching for the Service to be patched") + ctx, cancel = context.WithTimeout(context.Background(), svcReadyTimeout) + defer cancel() - var srcIP string - loadBalancerPropagationTimeout := e2eservice.GetServiceLoadBalancerPropagationTimeout(cs) - ginkgo.By(fmt.Sprintf("Hitting external lb %v from pod %v on node %v", ingressIP, pausePod.Name, pausePod.Spec.NodeName)) - if pollErr := wait.PollImmediate(framework.Poll, loadBalancerPropagationTimeout, func() (bool, error) { - stdout, err := framework.RunHostCmd(pausePod.Namespace, pausePod.Name, cmd) - if err != nil { - framework.Logf("got err: %v, retry until timeout", err) - return false, nil + _, err = watchtools.Until(ctx, svcList.ResourceVersion, w, func(event watch.Event) (bool, error) { + if svc, ok := event.Object.(*v1.Service); ok { + found := svc.ObjectMeta.Name == testService.ObjectMeta.Name && + svc.ObjectMeta.Namespace == ns && + svc.Annotations["patchedstatus"] == "true" + if !found { + framework.Logf("observed Service %v in namespace %v with annotations: %v & LoadBalancer: %v", svc.ObjectMeta.Name, svc.ObjectMeta.Namespace, svc.Annotations, svc.Status.LoadBalancer) + return false, nil + } + framework.Logf("Found Service %v in namespace %v with annotations: %v & LoadBalancer: %v", svc.ObjectMeta.Name, svc.ObjectMeta.Namespace, svc.Annotations, svc.Status.LoadBalancer) + return found, nil } - srcIP = strings.TrimSpace(strings.Split(stdout, ":")[0]) - return srcIP == pausePod.Status.PodIP, nil - }); pollErr != nil { - framework.Failf("Source IP not preserved from %v, expected '%v' got '%v'", pausePod.Name, pausePod.Status.PodIP, srcIP) - } - }) - - // TODO(#56138): Get rid of [DisabledForLargeClusters] tag when issue #56138 is fixed. - ginkgo.It("should handle updates to ExternalTrafficPolicy field [DisabledForLargeClusters]", func() { - namespace := f.Namespace.Name - serviceName := "external-local-update" - jig := e2eservice.NewTestJig(cs, namespace, serviceName) + framework.Logf("Observed event: %+v", event.Object) + return false, nil + }) + framework.ExpectNoError(err, "failed to locate Service %v in namespace %v", testService.ObjectMeta.Name, ns) + framework.Logf("Service %s has service status patched", testSvcName) - nodes, err := e2enode.GetBoundedReadySchedulableNodes(cs, e2eservice.MaxNodesForEndpointsTests) - framework.ExpectNoError(err) - if len(nodes.Items) < 2 { - framework.Failf("Need at least 2 nodes to verify source ip from a node without endpoint") - } + ginkgo.By("updating the ServiceStatus") - svc, err := jig.CreateOnlyLocalLoadBalancerService(loadBalancerCreateTimeout, true, nil) - framework.ExpectNoError(err) - serviceLBNames = append(serviceLBNames, cloudprovider.DefaultLoadBalancerName(svc)) - defer func() { - err = jig.ChangeServiceType(v1.ServiceTypeClusterIP, loadBalancerCreateTimeout) - framework.ExpectNoError(err) - err := cs.CoreV1().Services(svc.Namespace).Delete(context.TODO(), svc.Name, metav1.DeleteOptions{}) - framework.ExpectNoError(err) - }() + var statusToUpdate, updatedStatus *v1.Service + err = retry.RetryOnConflict(retry.DefaultRetry, func() error { + statusToUpdate, err = svcClient.Get(context.TODO(), testSvcName, metav1.GetOptions{}) + framework.ExpectNoError(err, "Unable to retrieve service %s", testSvcName) - // save the health check node port because it disappears when ESIPP is turned off. - healthCheckNodePort := int(svc.Spec.HealthCheckNodePort) + statusToUpdate.Status.Conditions = append(statusToUpdate.Status.Conditions, metav1.Condition{ + Type: "StatusUpdate", + Status: metav1.ConditionTrue, + Reason: "E2E", + Message: "Set from e2e test", + }) - ginkgo.By("turning ESIPP off") - svc, err = jig.UpdateService(func(svc *v1.Service) { - svc.Spec.ExternalTrafficPolicy = v1.ServiceExternalTrafficPolicyTypeCluster + updatedStatus, err = svcClient.UpdateStatus(context.TODO(), statusToUpdate, metav1.UpdateOptions{}) + return err }) - framework.ExpectNoError(err) - if svc.Spec.HealthCheckNodePort > 0 { - framework.Failf("Service HealthCheck NodePort still present") - } + framework.ExpectNoError(err, "\n\n Failed to UpdateStatus. %v\n\n", err) + framework.Logf("updatedStatus.Conditions: %#v", updatedStatus.Status.Conditions) - epNodes, err := jig.ListNodesWithEndpoint() - framework.ExpectNoError(err) - // map from name of nodes with endpoint to internal ip - // it is assumed that there is only a single node with the endpoint - endpointNodeMap := make(map[string]string) - // map from name of nodes without endpoint to internal ip - noEndpointNodeMap := make(map[string]string) - for _, node := range epNodes { - ips := e2enode.GetAddresses(&node, v1.NodeInternalIP) - if len(ips) < 1 { - framework.Failf("No internal ip found for node %s", node.Name) - } - endpointNodeMap[node.Name] = ips[0] - } - for _, n := range nodes.Items { - ips := e2enode.GetAddresses(&n, v1.NodeInternalIP) - if len(ips) < 1 { - framework.Failf("No internal ip found for node %s", n.Name) - } - if _, ok := endpointNodeMap[n.Name]; !ok { - noEndpointNodeMap[n.Name] = ips[0] - } - } - framework.ExpectNotEqual(len(endpointNodeMap), 0) - framework.ExpectNotEqual(len(noEndpointNodeMap), 0) - - svcTCPPort := int(svc.Spec.Ports[0].Port) - svcNodePort := int(svc.Spec.Ports[0].NodePort) - ingressIP := e2eservice.GetIngressPoint(&svc.Status.LoadBalancer.Ingress[0]) - path := "/clientip" - dialCmd := "clientip" - - config := e2enetwork.NewNetworkingTestConfig(f) - - ginkgo.By(fmt.Sprintf("endpoints present on nodes %v, absent on nodes %v", endpointNodeMap, noEndpointNodeMap)) - for nodeName, nodeIP := range noEndpointNodeMap { - ginkgo.By(fmt.Sprintf("Checking %v (%v:%v/%v) proxies to endpoints on another node", nodeName, nodeIP[0], svcNodePort, dialCmd)) - _, err := GetHTTPContentFromTestContainer(config, nodeIP, svcNodePort, e2eservice.KubeProxyLagTimeout, dialCmd) - framework.ExpectNoError(err, "Could not reach HTTP service through %v:%v/%v after %v", nodeIP, svcNodePort, dialCmd, e2eservice.KubeProxyLagTimeout) - } - - for nodeName, nodeIP := range endpointNodeMap { - ginkgo.By(fmt.Sprintf("checking kube-proxy health check fails on node with endpoint (%s), public IP %s", nodeName, nodeIP)) - var body string - pollFn := func() (bool, error) { - // we expect connection failure here, but not other errors - resp, err := config.GetResponseFromTestContainer( - "http", - "healthz", - nodeIP, - healthCheckNodePort) - if err != nil { + ginkgo.By("watching for the Service to be updated") + ctx, cancel = context.WithTimeout(context.Background(), svcReadyTimeout) + defer cancel() + _, err = watchtools.Until(ctx, svcList.ResourceVersion, w, func(event watch.Event) (bool, error) { + if svc, ok := event.Object.(*v1.Service); ok { + found := svc.ObjectMeta.Name == testService.ObjectMeta.Name && + svc.ObjectMeta.Namespace == ns && + svc.Annotations["patchedstatus"] == "true" + if !found { + framework.Logf("Observed Service %v in namespace %v with annotations: %v & Conditions: %v", svc.ObjectMeta.Name, svc.ObjectMeta.Namespace, svc.Annotations, svc.Status.LoadBalancer) return false, nil } - if len(resp.Errors) > 0 { - return true, nil - } - if len(resp.Responses) > 0 { - body = resp.Responses[0] + for _, cond := range svc.Status.Conditions { + if cond.Type == "StatusUpdate" && + cond.Reason == "E2E" && + cond.Message == "Set from e2e test" { + framework.Logf("Found Service %v in namespace %v with annotations: %v & Conditions: %v", svc.ObjectMeta.Name, svc.ObjectMeta.Namespace, svc.Annotations, svc.Status.Conditions) + return found, nil + } else { + framework.Logf("Observed Service %v in namespace %v with annotations: %v & Conditions: %v", svc.ObjectMeta.Name, svc.ObjectMeta.Namespace, svc.Annotations, svc.Status.LoadBalancer) + return false, nil + } } - return false, nil - } - if pollErr := wait.PollImmediate(framework.Poll, e2eservice.TestTimeout, pollFn); pollErr != nil { - framework.Failf("Kube-proxy still exposing health check on node %v:%v, after ESIPP was turned off. body %s", - nodeName, healthCheckNodePort, body) } - } + framework.Logf("Observed event: %+v", event.Object) + return false, nil + }) + framework.ExpectNoError(err, "failed to locate Service %v in namespace %v", testService.ObjectMeta.Name, ns) + framework.Logf("Service %s has service status updated", testSvcName) - // Poll till kube-proxy re-adds the MASQUERADE rule on the node. - ginkgo.By(fmt.Sprintf("checking source ip is NOT preserved through loadbalancer %v", ingressIP)) - var clientIP string - pollErr := wait.PollImmediate(framework.Poll, e2eservice.KubeProxyLagTimeout, func() (bool, error) { - content := GetHTTPContent(ingressIP, svcTCPPort, e2eservice.KubeProxyLagTimeout, "/clientip") - clientIP = content.String() - if strings.HasPrefix(clientIP, "10.") { - return true, nil + ginkgo.By("patching the service") + servicePatchPayload, err := json.Marshal(v1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{ + "test-service": "patched", + }, + }, + }) + + _, err = svcClient.Patch(context.TODO(), testSvcName, types.StrategicMergePatchType, []byte(servicePatchPayload), metav1.PatchOptions{}) + framework.ExpectNoError(err, "failed to patch service. %v", err) + + ginkgo.By("watching for the Service to be patched") + ctx, cancel = context.WithTimeout(context.Background(), svcReadyTimeout) + defer cancel() + _, err = watchtools.Until(ctx, svcList.ResourceVersion, w, func(event watch.Event) (bool, error) { + if svc, ok := event.Object.(*v1.Service); ok { + found := svc.ObjectMeta.Name == testService.ObjectMeta.Name && + svc.ObjectMeta.Namespace == ns && + svc.Labels["test-service"] == "patched" + if !found { + framework.Logf("observed Service %v in namespace %v with labels: %v", svc.ObjectMeta.Name, svc.ObjectMeta.Namespace, svc.Labels) + return false, nil + } + framework.Logf("Found Service %v in namespace %v with labels: %v", svc.ObjectMeta.Name, svc.ObjectMeta.Namespace, svc.Labels) + return found, nil } + framework.Logf("Observed event: %+v", event.Object) return false, nil }) - if pollErr != nil { - framework.Failf("Source IP WAS preserved even after ESIPP turned off. Got %v, expected a ten-dot cluster ip.", clientIP) - } + framework.ExpectNoError(err, "failed to locate Service %v in namespace %v", testService.ObjectMeta.Name, ns) + framework.Logf("Service %s patched", testSvcName) - // TODO: We need to attempt to create another service with the previously - // allocated healthcheck nodePort. If the health check nodePort has been - // freed, the new service creation will succeed, upon which we cleanup. - // If the health check nodePort has NOT been freed, the new service - // creation will fail. + ginkgo.By("deleting the service") + err = cs.CoreV1().Services(ns).Delete(context.TODO(), testSvcName, metav1.DeleteOptions{}) + framework.ExpectNoError(err, "failed to delete the Service. %v", err) - ginkgo.By("setting ExternalTraffic field back to OnlyLocal") - svc, err = jig.UpdateService(func(svc *v1.Service) { - svc.Spec.ExternalTrafficPolicy = v1.ServiceExternalTrafficPolicyTypeLocal - // Request the same healthCheckNodePort as before, to test the user-requested allocation path - svc.Spec.HealthCheckNodePort = int32(healthCheckNodePort) - }) - framework.ExpectNoError(err) - pollErr = wait.PollImmediate(framework.Poll, e2eservice.KubeProxyLagTimeout, func() (bool, error) { - content := GetHTTPContent(ingressIP, svcTCPPort, e2eservice.KubeProxyLagTimeout, path) - clientIP = content.String() - ginkgo.By(fmt.Sprintf("Endpoint %v:%v%v returned client ip %v", ingressIP, svcTCPPort, path, clientIP)) - if !strings.HasPrefix(clientIP, "10.") { - return true, nil + ginkgo.By("watching for the Service to be deleted") + ctx, cancel = context.WithTimeout(context.Background(), svcReadyTimeout) + defer cancel() + _, err = watchtools.Until(ctx, svcList.ResourceVersion, w, func(event watch.Event) (bool, error) { + switch event.Type { + case watch.Deleted: + if svc, ok := event.Object.(*v1.Service); ok { + found := svc.ObjectMeta.Name == testService.ObjectMeta.Name && + svc.ObjectMeta.Namespace == ns && + svc.Labels["test-service-static"] == "true" + if !found { + framework.Logf("observed Service %v in namespace %v with labels: %v & annotations: %v", svc.ObjectMeta.Name, svc.ObjectMeta.Namespace, svc.Labels, svc.Annotations) + return false, nil + } + framework.Logf("Found Service %v in namespace %v with labels: %v & annotations: %v", svc.ObjectMeta.Name, svc.ObjectMeta.Namespace, svc.Labels, svc.Annotations) + return found, nil + } + default: + framework.Logf("Observed event: %+v", event.Type) } return false, nil }) - if pollErr != nil { - framework.Failf("Source IP (%v) is not the client IP even after ESIPP turned on, expected a public IP.", clientIP) - } + framework.ExpectNoError(err, "failed to delete Service %v in namespace %v", testService.ObjectMeta.Name, ns) + framework.Logf("Service %s deleted", testSvcName) }) }) @@ -3539,16 +2667,14 @@ func createPausePodDeployment(cs clientset.Interface, name, ns string, replicas } // createPodOrFail creates a pod with the specified containerPorts. -func createPodOrFail(c clientset.Interface, ns, name string, labels map[string]string, containerPorts []v1.ContainerPort) { +func createPodOrFail(f *framework.Framework, ns, name string, labels map[string]string, containerPorts []v1.ContainerPort) { ginkgo.By(fmt.Sprintf("Creating pod %s in namespace %s", name, ns)) pod := e2epod.NewAgnhostPod(ns, name, nil, nil, containerPorts) pod.ObjectMeta.Labels = labels // Add a dummy environment variable to work around a docker issue. // https://github.com/docker/docker/issues/14203 pod.Spec.Containers[0].Env = []v1.EnvVar{{Name: "FOO", Value: " "}} - - _, err := c.CoreV1().Pods(ns).Create(context.TODO(), pod, metav1.CreateOptions{}) - framework.ExpectNoError(err, "failed to create pod %s in namespace %s", name, ns) + f.PodClient().CreateSync(pod) } // launchHostExecPod launches a hostexec pod in the given namespace and waits @@ -3558,7 +2684,7 @@ func launchHostExecPod(client clientset.Interface, ns, name string) *v1.Pod { hostExecPod := e2epod.NewExecPodSpec(ns, name, true) pod, err := client.CoreV1().Pods(ns).Create(context.TODO(), hostExecPod, metav1.CreateOptions{}) framework.ExpectNoError(err) - err = e2epod.WaitForPodRunningInNamespace(client, pod) + err = e2epod.WaitTimeoutForPodReadyInNamespace(client, name, ns, framework.PodStartTimeout) framework.ExpectNoError(err) return pod } @@ -3639,16 +2765,17 @@ func translatePodNameToUID(c clientset.Interface, ns string, expectedEndpoints p return portsByUID, nil } -// validateEndpointsPorts validates that the given service exists and is served by the given expectedEndpoints. -func validateEndpointsPorts(c clientset.Interface, namespace, serviceName string, expectedEndpoints portsByPodName) error { +// validateEndpointsPortsOrFail validates that the given service exists and is served by the given expectedEndpoints. +func validateEndpointsPortsOrFail(c clientset.Interface, namespace, serviceName string, expectedEndpoints portsByPodName) { ginkgo.By(fmt.Sprintf("waiting up to %v for service %s in namespace %s to expose endpoints %v", framework.ServiceStartTimeout, serviceName, namespace, expectedEndpoints)) expectedPortsByPodUID, err := translatePodNameToUID(c, namespace, expectedEndpoints) - if err != nil { - return err - } + framework.ExpectNoError(err, "failed to translate pod name to UID, ns:%s, expectedEndpoints:%v", namespace, expectedEndpoints) - i := 0 - if pollErr := wait.PollImmediate(time.Second, framework.ServiceStartTimeout, func() (bool, error) { + var ( + pollErr error + i = 0 + ) + if pollErr = wait.PollImmediate(time.Second, framework.ServiceStartTimeout, func() (bool, error) { i++ ep, err := c.CoreV1().Endpoints(namespace).Get(context.TODO(), serviceName, metav1.GetOptions{}) @@ -3667,11 +2794,11 @@ func validateEndpointsPorts(c clientset.Interface, namespace, serviceName string // If EndpointSlice API is enabled, then validate if appropriate EndpointSlice objects // were also create/updated/deleted. - if _, err := c.Discovery().ServerResourcesForGroupVersion(discoveryv1beta1.SchemeGroupVersion.String()); err == nil { + if _, err := c.Discovery().ServerResourcesForGroupVersion(discoveryv1.SchemeGroupVersion.String()); err == nil { opts := metav1.ListOptions{ LabelSelector: "kubernetes.io/service-name=" + serviceName, } - es, err := c.DiscoveryV1beta1().EndpointSlices(namespace).List(context.TODO(), opts) + es, err := c.DiscoveryV1().EndpointSlices(namespace).List(context.TODO(), opts) if err != nil { framework.Logf("Failed go list EndpointSlice objects: %v", err) // Retry the error @@ -3696,9 +2823,8 @@ func validateEndpointsPorts(c clientset.Interface, namespace, serviceName string } else { framework.Logf("Can't list pod debug info: %v", err) } - return fmt.Errorf("error waithing for service %s in namespace %s to expose endpoints %v: %v", serviceName, namespace, expectedEndpoints, pollErr) } - return nil + framework.ExpectNoError(pollErr, "error waithing for service %s in namespace %s to expose endpoints %v: %v", serviceName, namespace, expectedEndpoints) } func restartApiserver(namespace string, cs clientset.Interface) error { @@ -3732,7 +2858,7 @@ func restartComponent(cs clientset.Interface, cName, ns string, matchLabels map[ return err } -var _ = SIGDescribe("SCTP [Feature:SCTP] [LinuxOnly]", func() { +var _ = common.SIGDescribe("SCTP [Feature:SCTP] [LinuxOnly]", func() { f := framework.NewDefaultFramework("sctp") var cs clientset.Interface @@ -3763,15 +2889,14 @@ var _ = SIGDescribe("SCTP [Feature:SCTP] [LinuxOnly]", func() { framework.ExpectNoError(err, fmt.Sprintf("error while waiting for service:%s err: %v", serviceName, err)) ginkgo.By("validating endpoints do not exist yet") - err = validateEndpointsPorts(cs, ns, serviceName, portsByPodName{}) - framework.ExpectNoError(err, "failed to validate endpoints for service %s in namespace: %s", serviceName, ns) + validateEndpointsPortsOrFail(cs, ns, serviceName, portsByPodName{}) ginkgo.By("creating a pod for the service") names := map[string]bool{} name1 := "pod1" - createPodOrFail(cs, ns, name1, jig.Labels, []v1.ContainerPort{{ContainerPort: 5060, Protocol: v1.ProtocolSCTP}}) + createPodOrFail(f, ns, name1, jig.Labels, []v1.ContainerPort{{ContainerPort: 5060, Protocol: v1.ProtocolSCTP}}) names[name1] = true defer func() { for name := range names { @@ -3781,15 +2906,13 @@ var _ = SIGDescribe("SCTP [Feature:SCTP] [LinuxOnly]", func() { }() ginkgo.By("validating endpoints exists") - err = validateEndpointsPorts(cs, ns, serviceName, portsByPodName{name1: {5060}}) - framework.ExpectNoError(err, "failed to validate endpoints for service %s in namespace: %s", serviceName, ns) + validateEndpointsPortsOrFail(cs, ns, serviceName, portsByPodName{name1: {5060}}) ginkgo.By("deleting the pod") e2epod.DeletePodOrFail(cs, ns, name1) delete(names, name1) ginkgo.By("validating endpoints do not exist anymore") - err = validateEndpointsPorts(cs, ns, serviceName, portsByPodName{}) - framework.ExpectNoError(err, "failed to validate endpoints for service %s in namespace: %s", serviceName, ns) + validateEndpointsPortsOrFail(cs, ns, serviceName, portsByPodName{}) ginkgo.By("validating sctp module is still not loaded") sctpLoadedAtEnd := CheckSCTPModuleLoadedOnNodes(f, nodes) @@ -3813,6 +2936,7 @@ var _ = SIGDescribe("SCTP [Feature:SCTP] [LinuxOnly]", func() { podName := "hostport" ports := []v1.ContainerPort{{Protocol: v1.ProtocolSCTP, ContainerPort: 5060, HostPort: 5060}} podSpec := e2epod.NewAgnhostPod(f.Namespace.Name, podName, nil, nil, ports) + podSpec.Spec.NodeName = node.Name ginkgo.By(fmt.Sprintf("Launching the pod on node %v", node.Name)) f.PodClient().CreateSync(podSpec) diff --git a/vendor/k8s.io/kubernetes/test/e2e/network/service_latency.go b/vendor/k8s.io/kubernetes/test/e2e/network/service_latency.go index eeb907e16235..f08394e10e41 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/network/service_latency.go +++ b/vendor/k8s.io/kubernetes/test/e2e/network/service_latency.go @@ -33,6 +33,7 @@ import ( "k8s.io/client-go/util/flowcontrol" "k8s.io/kubernetes/test/e2e/framework" e2erc "k8s.io/kubernetes/test/e2e/framework/rc" + "k8s.io/kubernetes/test/e2e/network/common" testutils "k8s.io/kubernetes/test/utils" imageutils "k8s.io/kubernetes/test/utils/image" @@ -45,7 +46,7 @@ func (d durations) Len() int { return len(d) } func (d durations) Less(i, j int) bool { return d[i] < d[j] } func (d durations) Swap(i, j int) { d[i], d[j] = d[j], d[i] } -var _ = SIGDescribe("Service endpoints latency", func() { +var _ = common.SIGDescribe("Service endpoints latency", func() { f := framework.NewDefaultFramework("svc-latency") /* diff --git a/vendor/k8s.io/kubernetes/test/e2e/network/util.go b/vendor/k8s.io/kubernetes/test/e2e/network/util.go index 34bd9cde7eb4..ac4139c809c1 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/network/util.go +++ b/vendor/k8s.io/kubernetes/test/e2e/network/util.go @@ -37,19 +37,20 @@ import ( const secondNodePortSvcName = "second-node-port-service" // GetHTTPContent returns the content of the given url by HTTP. -func GetHTTPContent(host string, port int, timeout time.Duration, url string) bytes.Buffer { +func GetHTTPContent(host string, port int, timeout time.Duration, url string) (string, error) { var body bytes.Buffer - if pollErr := wait.PollImmediate(framework.Poll, timeout, func() (bool, error) { + pollErr := wait.PollImmediate(framework.Poll, timeout, func() (bool, error) { result := e2enetwork.PokeHTTP(host, port, url, nil) if result.Status == e2enetwork.HTTPSuccess { body.Write(result.Body) return true, nil } return false, nil - }); pollErr != nil { - framework.Failf("Could not reach HTTP service through %v:%v%v after %v: %v", host, port, url, timeout, pollErr) + }) + if pollErr != nil { + framework.Logf("Could not reach HTTP service through %v:%v%v after %v: %v", host, port, url, timeout, pollErr) } - return body + return body.String(), pollErr } // GetHTTPContentFromTestContainer returns the content of the given url by HTTP via a test container. diff --git a/vendor/k8s.io/kubernetes/test/e2e/network/util_iperf.go b/vendor/k8s.io/kubernetes/test/e2e/network/util_iperf.go index 651366fadc91..f151a2cfef1f 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/network/util_iperf.go +++ b/vendor/k8s.io/kubernetes/test/e2e/network/util_iperf.go @@ -21,20 +21,26 @@ import ( "bytes" "encoding/json" "fmt" + "github.com/pkg/errors" + "math" "strconv" "strings" "k8s.io/kubernetes/test/e2e/framework" ) -// IPerfResults is a struct that stores some IPerfResult +const ( + megabyte = 1024 * 1024 +) + +// IPerfResults is a struct that stores some IPerfCSVResult type IPerfResults struct { BandwidthMap map[string]int64 } -// IPerfResult struct modelling an iperf record.... +// IPerfCSVResult struct modelling an iperf record.... // 20160314154239,172.17.0.3,34152,172.17.0.2,5001,3,0.0-10.0,33843707904,27074774092 -type IPerfResult struct { +type IPerfCSVResult struct { date string // field 1 in the csv cli string // field 2 in the csv cliPort int64 // ... @@ -46,8 +52,12 @@ type IPerfResult struct { bandwidthBits int64 } +func (i *IPerfCSVResult) bandwidthMB() int64 { + return int64(math.Round(float64(i.bandwidthBits) / float64(megabyte) / 8)) +} + // Add adds a new result to the Results struct. -func (i *IPerfResults) Add(ipr *IPerfResult) { +func (i *IPerfResults) Add(ipr *IPerfCSVResult) { if i.BandwidthMap == nil { i.BandwidthMap = map[string]int64{} } @@ -68,14 +78,17 @@ func (i *IPerfResults) ToTSV() string { return buffer.String() } -// NewIPerf parses an IPerf CSV output line into an IPerfResult. -func NewIPerf(csvLine string) *IPerfResult { +// NewIPerf parses an IPerf CSV output line into an IPerfCSVResult. +func NewIPerf(csvLine string) (*IPerfCSVResult, error) { + if len(csvLine) == 0 { + return nil, errors.New("No iperf output received in csv line") + } csvLine = strings.Trim(csvLine, "\n") slice := StrSlice(strings.Split(csvLine, ",")) if len(slice) != 9 { - framework.Failf("Incorrect fields in the output: %v (%v out of 9)", slice, len(slice)) + return nil, errors.Errorf("Incorrect fields in the output: %v (%v out of 9)", slice, len(slice)) } - i := IPerfResult{} + i := IPerfCSVResult{} i.date = slice.get(0) i.cli = slice.get(1) i.cliPort = intOrFail("client port", slice.get(2)) @@ -85,7 +98,7 @@ func NewIPerf(csvLine string) *IPerfResult { i.interval = slice.get(6) i.transferBits = intOrFail("transfer port", slice.get(7)) i.bandwidthBits = intOrFail("bandwidth port", slice.get(8)) - return &i + return &i, nil } // StrSlice represents a string slice @@ -106,3 +119,53 @@ func intOrFail(debugName string, rawValue string) int64 { } return value } + +// IPerf2EnhancedCSVResults models the results produced by iperf2 when run with the -e (--enhancedreports) flag. +type IPerf2EnhancedCSVResults struct { + Intervals []*IPerfCSVResult + Total *IPerfCSVResult +} + +// ParseIPerf2EnhancedResultsFromCSV parses results from iperf2 when given the -e (--enhancedreports) +// and `--reportstyle C` options. +// Example output: +// 20201210141800.884,10.244.2.24,47880,10.96.114.79,6789,3,0.0-1.0,1677852672,13422821376 +// 20201210141801.881,10.244.2.24,47880,10.96.114.79,6789,3,1.0-2.0,1980760064,15846080512 +// 20201210141802.883,10.244.2.24,47880,10.96.114.79,6789,3,2.0-3.0,1886650368,15093202944 +// 20201210141803.882,10.244.2.24,47880,10.96.114.79,6789,3,3.0-4.0,2035417088,16283336704 +// 20201210141804.879,10.244.2.24,47880,10.96.114.79,6789,3,4.0-5.0,1922957312,15383658496 +// 20201210141805.881,10.244.2.24,47880,10.96.114.79,6789,3,5.0-6.0,2095316992,16762535936 +// 20201210141806.882,10.244.2.24,47880,10.96.114.79,6789,3,6.0-7.0,1741291520,13930332160 +// 20201210141807.879,10.244.2.24,47880,10.96.114.79,6789,3,7.0-8.0,1862926336,14903410688 +// 20201210141808.878,10.244.2.24,47880,10.96.114.79,6789,3,8.0-9.0,1821245440,14569963520 +// 20201210141809.849,10.244.2.24,47880,10.96.114.79,6789,3,0.0-10.0,18752208896,15052492511 +func ParseIPerf2EnhancedResultsFromCSV(output string) (*IPerf2EnhancedCSVResults, error) { + var parsedResults []*IPerfCSVResult + for _, line := range strings.Split(output, "\n") { + parsed, err := NewIPerf(line) + if err != nil { + return nil, err + } + parsedResults = append(parsedResults, parsed) + } + if parsedResults == nil || len(parsedResults) == 0 { + return nil, errors.New("no results parsed from iperf2 output") + } + // format: + // all but last lines are intervals + intervals := parsedResults[:len(parsedResults)-1] + // last line is an aggregation + total := parsedResults[len(parsedResults)-1] + return &IPerf2EnhancedCSVResults{ + Intervals: intervals, + Total: total, + }, nil +} + +// IPerf2NodeToNodeCSVResults models the results of running iperf2 between a daemonset of clients and +// a single server. The node name of the server is captured, along with a map of client node name +// to iperf2 results. +type IPerf2NodeToNodeCSVResults struct { + ServerNode string + Results map[string]*IPerf2EnhancedCSVResults +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/node/BUILD b/vendor/k8s.io/kubernetes/test/e2e/node/BUILD deleted file mode 100644 index c454c68a5ca0..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/node/BUILD +++ /dev/null @@ -1,83 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "apparmor.go", - "crictl.go", - "events.go", - "framework.go", - "kubelet.go", - "kubelet_perf.go", - "mount_propagation.go", - "node_problem_detector.go", - "pod_gc.go", - "pods.go", - "pre_stop.go", - "recreate_node.go", - "runtimeclass.go", - "security_context.go", - "ssh.go", - "taints.go", - "ttlafterfinished.go", - ], - importpath = "k8s.io/kubernetes/test/e2e/node", - visibility = ["//visibility:public"], - deps = [ - "//pkg/cluster/ports:go_default_library", - "//pkg/kubelet/events:go_default_library", - "//pkg/kubelet/runtimeclass/testing:go_default_library", - "//pkg/util/slice:go_default_library", - "//staging/src/k8s.io/api/batch/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/node/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/kubelet/pkg/apis/stats/v1alpha1:go_default_library", - "//test/e2e/framework:go_default_library", - "//test/e2e/framework/job:go_default_library", - "//test/e2e/framework/kubectl:go_default_library", - "//test/e2e/framework/kubelet:go_default_library", - "//test/e2e/framework/node:go_default_library", - "//test/e2e/framework/perf:go_default_library", - "//test/e2e/framework/pod:go_default_library", - "//test/e2e/framework/providers/gce:go_default_library", - "//test/e2e/framework/rc:go_default_library", - "//test/e2e/framework/security:go_default_library", - "//test/e2e/framework/skipper:go_default_library", - "//test/e2e/framework/ssh:go_default_library", - "//test/e2e/framework/volume:go_default_library", - "//test/e2e/perftype:go_default_library", - "//test/e2e/scheduling:go_default_library", - "//test/e2e/storage/utils:go_default_library", - "//test/utils:go_default_library", - "//test/utils/image:go_default_library", - "//vendor/github.com/onsi/ginkgo:go_default_library", - "//vendor/github.com/onsi/gomega:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/examples.go b/vendor/k8s.io/kubernetes/test/e2e/node/examples.go similarity index 91% rename from vendor/k8s.io/kubernetes/test/e2e/examples.go rename to vendor/k8s.io/kubernetes/test/e2e/node/examples.go index 599725728d58..ae948a399a26 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/examples.go +++ b/vendor/k8s.io/kubernetes/test/e2e/node/examples.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package e2e +package node import ( "context" @@ -31,9 +31,9 @@ import ( podutil "k8s.io/kubernetes/pkg/api/v1/pod" commonutils "k8s.io/kubernetes/test/e2e/common" "k8s.io/kubernetes/test/e2e/framework" - "k8s.io/kubernetes/test/e2e/framework/auth" + e2eauth "k8s.io/kubernetes/test/e2e/framework/auth" e2epod "k8s.io/kubernetes/test/e2e/framework/pod" - "k8s.io/kubernetes/test/e2e/framework/testfiles" + e2etestfiles "k8s.io/kubernetes/test/e2e/framework/testfiles" "github.com/onsi/ginkgo" ) @@ -42,7 +42,7 @@ const ( serverStartTimeout = framework.PodStartTimeout + 3*time.Minute ) -var _ = framework.KubeDescribe("[Feature:Example]", func() { +var _ = SIGDescribe("[Feature:Example]", func() { f := framework.NewDefaultFramework("examples") var c clientset.Interface @@ -53,17 +53,17 @@ var _ = framework.KubeDescribe("[Feature:Example]", func() { // this test wants powerful permissions. Since the namespace names are unique, we can leave this // lying around so we don't have to race any caches - err := auth.BindClusterRoleInNamespace(c.RbacV1(), "edit", f.Namespace.Name, + err := e2eauth.BindClusterRoleInNamespace(c.RbacV1(), "edit", f.Namespace.Name, rbacv1.Subject{Kind: rbacv1.ServiceAccountKind, Namespace: f.Namespace.Name, Name: "default"}) framework.ExpectNoError(err) - err = auth.WaitForAuthorizationUpdate(c.AuthorizationV1(), + err = e2eauth.WaitForAuthorizationUpdate(c.AuthorizationV1(), serviceaccount.MakeUsername(f.Namespace.Name, "default"), f.Namespace.Name, "create", schema.GroupResource{Resource: "pods"}, true) framework.ExpectNoError(err) }) - framework.KubeDescribe("Liveness", func() { + ginkgo.Describe("Liveness", func() { ginkgo.It("liveness pods should be automatically restarted", func() { test := "test/fixtures/doc-yaml/user-guide/liveness" execYaml := readFile(test, "exec-liveness.yaml.in") @@ -110,7 +110,7 @@ var _ = framework.KubeDescribe("[Feature:Example]", func() { }) }) - framework.KubeDescribe("Secret", func() { + ginkgo.Describe("Secret", func() { ginkgo.It("should create a pod that reads a secret", func() { test := "test/fixtures/doc-yaml/user-guide/secrets" secretYaml := readFile(test, "secret.yaml") @@ -130,7 +130,7 @@ var _ = framework.KubeDescribe("[Feature:Example]", func() { }) }) - framework.KubeDescribe("Downward API", func() { + ginkgo.Describe("Downward API", func() { ginkgo.It("should create a pod that prints his name and namespace", func() { test := "test/fixtures/doc-yaml/user-guide/downward-api" podYaml := readFile(test, "dapi-pod.yaml.in") @@ -152,7 +152,7 @@ var _ = framework.KubeDescribe("[Feature:Example]", func() { func readFile(test, file string) string { from := filepath.Join(test, file) - data, err := testfiles.Read(from) + data, err := e2etestfiles.Read(from) if err != nil { framework.Fail(err.Error()) } diff --git a/vendor/k8s.io/kubernetes/test/e2e/node/framework.go b/vendor/k8s.io/kubernetes/test/e2e/node/framework.go index e6ca8cd1f2dd..56b0f1663537 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/node/framework.go +++ b/vendor/k8s.io/kubernetes/test/e2e/node/framework.go @@ -16,9 +16,9 @@ limitations under the License. package node -import "k8s.io/kubernetes/test/e2e/framework" +import "github.com/onsi/ginkgo" // SIGDescribe annotates the test with the SIG label. func SIGDescribe(text string, body func()) bool { - return framework.KubeDescribe("[sig-node] "+text, body) + return ginkgo.Describe("[sig-node] "+text, body) } diff --git a/vendor/k8s.io/kubernetes/test/e2e/node/kubelet.go b/vendor/k8s.io/kubernetes/test/e2e/node/kubelet.go index 350648654534..999bbfe64124 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/node/kubelet.go +++ b/vendor/k8s.io/kubernetes/test/e2e/node/kubelet.go @@ -276,7 +276,7 @@ var _ = SIGDescribe("kubelet", func() { ns = f.Namespace.Name }) - SIGDescribe("Clean up pods on node", func() { + ginkgo.Describe("Clean up pods on node", func() { var ( numNodes int nodeNames sets.String @@ -384,7 +384,7 @@ var _ = SIGDescribe("kubelet", func() { }) // Test host cleanup when disrupting the volume environment. - SIGDescribe("host cleanup with volume mounts [sig-storage][HostCleanup][Flaky]", func() { + ginkgo.Describe("host cleanup with volume mounts [HostCleanup][Flaky]", func() { type hostCleanupTest struct { itDescr string diff --git a/vendor/k8s.io/kubernetes/test/e2e/node/kubelet_perf.go b/vendor/k8s.io/kubernetes/test/e2e/node/kubelet_perf.go index a2668264c81f..5d8406bb0f50 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/node/kubelet_perf.go +++ b/vendor/k8s.io/kubernetes/test/e2e/node/kubelet_perf.go @@ -216,7 +216,7 @@ var _ = SIGDescribe("Kubelet [Serial] [Slow]", func() { result := om.GetLatestRuntimeOperationErrorRate() framework.Logf("runtime operation error metrics:\n%s", e2ekubelet.FormatRuntimeOperationErrorRate(result)) }) - SIGDescribe("regular resource usage tracking [Feature:RegularResourceUsageTracking]", func() { + ginkgo.Describe("regular resource usage tracking [Feature:RegularResourceUsageTracking]", func() { // We assume that the scheduler will make reasonable scheduling choices // and assign ~N pods on the node. // Although we want to track N pods per node, there are N + add-on pods @@ -268,7 +268,7 @@ var _ = SIGDescribe("Kubelet [Serial] [Slow]", func() { }) } }) - SIGDescribe("experimental resource usage tracking [Feature:ExperimentalResourceUsageTracking]", func() { + ginkgo.Describe("experimental resource usage tracking [Feature:ExperimentalResourceUsageTracking]", func() { density := []int{100} for i := range density { podsPerNode := density[i] diff --git a/vendor/k8s.io/kubernetes/test/e2e/node/node_problem_detector.go b/vendor/k8s.io/kubernetes/test/e2e/node/node_problem_detector.go index 51c67714518e..1f97c1e618c1 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/node/node_problem_detector.go +++ b/vendor/k8s.io/kubernetes/test/e2e/node/node_problem_detector.go @@ -40,11 +40,12 @@ import ( ) // This test checks if node-problem-detector (NPD) runs fine without error on -// the nodes in the cluster. NPD's functionality is tested in e2e_node tests. -var _ = SIGDescribe("NodeProblemDetector [DisabledForLargeClusters]", func() { +// the up to 10 nodes in the cluster. NPD's functionality is tested in e2e_node tests. +var _ = SIGDescribe("NodeProblemDetector", func() { const ( - pollInterval = 1 * time.Second - pollTimeout = 1 * time.Minute + pollInterval = 1 * time.Second + pollTimeout = 1 * time.Minute + maxNodesToProcess = 10 ) f := framework.NewDefaultFramework("node-problem-detector") @@ -60,18 +61,34 @@ var _ = SIGDescribe("NodeProblemDetector [DisabledForLargeClusters]", func() { e2eskipper.SkipUnlessSSHKeyPresent() ginkgo.By("Getting all nodes and their SSH-able IP addresses") - nodes, err := e2enode.GetReadySchedulableNodes(f.ClientSet) + readyNodes, err := e2enode.GetReadySchedulableNodes(f.ClientSet) framework.ExpectNoError(err) + + nodes := []v1.Node{} hosts := []string{} - for _, node := range nodes.Items { + for _, node := range readyNodes.Items { + host := "" for _, addr := range node.Status.Addresses { if addr.Type == v1.NodeExternalIP { - hosts = append(hosts, net.JoinHostPort(addr.Address, "22")) + host = net.JoinHostPort(addr.Address, "22") break } } + // Not every node has to have an external IP address. + if len(host) > 0 { + nodes = append(nodes, node) + hosts = append(hosts, host) + } + } + + if len(nodes) == 0 { + ginkgo.Skip("Skipping test due to lack of ready nodes with public IP") + } + + if len(nodes) > maxNodesToProcess { + nodes = nodes[:maxNodesToProcess] + hosts = hosts[:maxNodesToProcess] } - framework.ExpectEqual(len(hosts), len(nodes.Items)) isStandaloneMode := make(map[string]bool) cpuUsageStats := make(map[string][]float64) @@ -121,7 +138,7 @@ var _ = SIGDescribe("NodeProblemDetector [DisabledForLargeClusters]", func() { } ginkgo.By("Check node-problem-detector can post conditions and events to API server") - for _, node := range nodes.Items { + for _, node := range nodes { ginkgo.By(fmt.Sprintf("Check node-problem-detector posted KernelDeadlock condition on node %q", node.Name)) gomega.Eventually(func() error { return verifyNodeCondition(f, "KernelDeadlock", v1.ConditionTrue, "AUFSUmountHung", node.Name) @@ -156,7 +173,7 @@ var _ = SIGDescribe("NodeProblemDetector [DisabledForLargeClusters]", func() { uptimeStats[host] = append(uptimeStats[host], uptime) } } else { - cpuUsage, rss, workingSet := getNpdPodStat(f, nodes.Items[j].Name) + cpuUsage, rss, workingSet := getNpdPodStat(f, nodes[j].Name) cpuUsageStats[host] = append(cpuUsageStats[host], cpuUsage) rssStats[host] = append(rssStats[host], rss) workingSetStats[host] = append(workingSetStats[host], workingSet) @@ -174,19 +191,19 @@ var _ = SIGDescribe("NodeProblemDetector [DisabledForLargeClusters]", func() { // calculate its cpu usage from cgroup cpuacct value differences. cpuUsage := cpuUsageStats[host][1] - cpuUsageStats[host][0] totaltime := uptimeStats[host][1] - uptimeStats[host][0] - cpuStatsMsg += fmt.Sprintf(" %s[%.3f];", nodes.Items[i].Name, cpuUsage/totaltime) + cpuStatsMsg += fmt.Sprintf(" %s[%.3f];", nodes[i].Name, cpuUsage/totaltime) } else { sort.Float64s(cpuUsageStats[host]) - cpuStatsMsg += fmt.Sprintf(" %s[%.3f|%.3f|%.3f];", nodes.Items[i].Name, + cpuStatsMsg += fmt.Sprintf(" %s[%.3f|%.3f|%.3f];", nodes[i].Name, cpuUsageStats[host][0], cpuUsageStats[host][len(cpuUsageStats[host])/2], cpuUsageStats[host][len(cpuUsageStats[host])-1]) } sort.Float64s(rssStats[host]) - rssStatsMsg += fmt.Sprintf(" %s[%.1f|%.1f|%.1f];", nodes.Items[i].Name, + rssStatsMsg += fmt.Sprintf(" %s[%.1f|%.1f|%.1f];", nodes[i].Name, rssStats[host][0], rssStats[host][len(rssStats[host])/2], rssStats[host][len(rssStats[host])-1]) sort.Float64s(workingSetStats[host]) - workingSetStatsMsg += fmt.Sprintf(" %s[%.1f|%.1f|%.1f];", nodes.Items[i].Name, + workingSetStatsMsg += fmt.Sprintf(" %s[%.1f|%.1f|%.1f];", nodes[i].Name, workingSetStats[host][0], workingSetStats[host][len(workingSetStats[host])/2], workingSetStats[host][len(workingSetStats[host])-1]) } framework.Logf("Node-Problem-Detector CPU and Memory Stats:\n\t%s\n\t%s\n\t%s", cpuStatsMsg, rssStatsMsg, workingSetStatsMsg) diff --git a/vendor/k8s.io/kubernetes/test/e2e/node/pods.go b/vendor/k8s.io/kubernetes/test/e2e/node/pods.go index 6d65eafa5745..471f2a39e3ab 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/node/pods.go +++ b/vendor/k8s.io/kubernetes/test/e2e/node/pods.go @@ -48,7 +48,7 @@ import ( var _ = SIGDescribe("Pods Extended", func() { f := framework.NewDefaultFramework("pods") - framework.KubeDescribe("Delete Grace Period", func() { + ginkgo.Describe("Delete Grace Period", func() { var podClient *framework.PodClient ginkgo.BeforeEach(func() { podClient = f.PodClient() @@ -145,7 +145,7 @@ var _ = SIGDescribe("Pods Extended", func() { }) }) - framework.KubeDescribe("Pods Set QOS Class", func() { + ginkgo.Describe("Pods Set QOS Class", func() { var podClient *framework.PodClient ginkgo.BeforeEach(func() { podClient = f.PodClient() @@ -197,7 +197,7 @@ var _ = SIGDescribe("Pods Extended", func() { }) }) - framework.KubeDescribe("Pod Container Status", func() { + ginkgo.Describe("Pod Container Status", func() { var podClient *framework.PodClient ginkgo.BeforeEach(func() { podClient = f.PodClient() @@ -206,7 +206,7 @@ var _ = SIGDescribe("Pods Extended", func() { ginkgo.It("should never report success for a pending container", func() { ginkgo.By("creating pods that should always exit 1 and terminating the pod after a random delay") - var reBug88766 = regexp.MustCompile(`rootfs_linux.*kubernetes\.io~secret.*no such file or directory`) + var reBug88766 = regexp.MustCompile(`rootfs_linux.*kubernetes\.io~(secret|projected).*no such file or directory`) var ( lock sync.Mutex @@ -441,7 +441,7 @@ var _ = SIGDescribe("Pods Extended", func() { }) - framework.KubeDescribe("Pod Container lifecycle", func() { + ginkgo.Describe("Pod Container lifecycle", func() { var podClient *framework.PodClient ginkgo.BeforeEach(func() { podClient = f.PodClient() diff --git a/vendor/k8s.io/kubernetes/test/e2e/node/recreate_node.go b/vendor/k8s.io/kubernetes/test/e2e/node/recreate_node.go deleted file mode 100644 index da3fc9744855..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/node/recreate_node.go +++ /dev/null @@ -1,134 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package node - -import ( - "context" - "fmt" - "time" - - "github.com/onsi/ginkgo" - v1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/fields" - "k8s.io/apimachinery/pkg/labels" - clientset "k8s.io/client-go/kubernetes" - "k8s.io/kubernetes/test/e2e/framework" - e2enode "k8s.io/kubernetes/test/e2e/framework/node" - e2epod "k8s.io/kubernetes/test/e2e/framework/pod" - "k8s.io/kubernetes/test/e2e/framework/providers/gce" - e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" - testutils "k8s.io/kubernetes/test/utils" -) - -const ( - // recreateNodeReadyAgainTimeout is how long a node is allowed to become "Ready" after it is recreated before - // the test is considered failed. - recreateNodeReadyAgainTimeout = 10 * time.Minute -) - -func nodeNames(nodes []v1.Node) []string { - result := make([]string, 0, len(nodes)) - for i := range nodes { - result = append(result, nodes[i].Name) - } - return result -} - -var _ = ginkgo.Describe("Recreate [Feature:Recreate]", func() { - f := framework.NewDefaultFramework("recreate") - var originalNodes []v1.Node - var originalPodNames []string - var ps *testutils.PodStore - systemNamespace := metav1.NamespaceSystem - ginkgo.BeforeEach(func() { - e2eskipper.SkipUnlessProviderIs("gce", "gke") - var err error - numNodes, err := e2enode.TotalRegistered(f.ClientSet) - framework.ExpectNoError(err) - originalNodes, err = e2enode.CheckReady(f.ClientSet, numNodes, framework.NodeReadyInitialTimeout) - framework.ExpectNoError(err) - - framework.Logf("Got the following nodes before recreate %v", nodeNames(originalNodes)) - - ps, err = testutils.NewPodStore(f.ClientSet, systemNamespace, labels.Everything(), fields.Everything()) - framework.ExpectNoError(err) - allPods := ps.List() - originalPods := e2epod.FilterNonRestartablePods(allPods) - originalPodNames = make([]string, len(originalPods)) - for i, p := range originalPods { - originalPodNames[i] = p.ObjectMeta.Name - } - - if !e2epod.CheckPodsRunningReadyOrSucceeded(f.ClientSet, systemNamespace, originalPodNames, framework.PodReadyBeforeTimeout) { - framework.Failf("At least one pod wasn't running and ready or succeeded at test start.") - } - - }) - - ginkgo.AfterEach(func() { - if ginkgo.CurrentGinkgoTestDescription().Failed { - // Make sure that addon/system pods are running, so dump - // events for the kube-system namespace on failures - ginkgo.By(fmt.Sprintf("Collecting events from namespace %q.", systemNamespace)) - events, err := f.ClientSet.CoreV1().Events(systemNamespace).List(context.TODO(), metav1.ListOptions{}) - framework.ExpectNoError(err) - - for _, e := range events.Items { - framework.Logf("event for %v: %v %v: %v", e.InvolvedObject.Name, e.Source, e.Reason, e.Message) - } - } - if ps != nil { - ps.Stop() - } - }) - - ginkgo.It("recreate nodes and ensure they function upon restart", func() { - testRecreate(f.ClientSet, ps, systemNamespace, originalNodes, originalPodNames) - }) -}) - -// Recreate all the nodes in the test instance group -func testRecreate(c clientset.Interface, ps *testutils.PodStore, systemNamespace string, nodes []v1.Node, podNames []string) { - err := gce.RecreateNodes(c, nodes) - if err != nil { - framework.Failf("Test failed; failed to start the restart instance group command.") - } - - err = gce.WaitForNodeBootIdsToChange(c, nodes, recreateNodeReadyAgainTimeout) - if err != nil { - framework.Failf("Test failed; failed to recreate at least one node in %v.", recreateNodeReadyAgainTimeout) - } - - nodesAfter, err := e2enode.CheckReady(c, len(nodes), framework.RestartNodeReadyAgainTimeout) - framework.ExpectNoError(err) - framework.Logf("Got the following nodes after recreate: %v", nodeNames(nodesAfter)) - - if len(nodes) != len(nodesAfter) { - framework.Failf("Had %d nodes before nodes were recreated, but now only have %d", - len(nodes), len(nodesAfter)) - } - - // Make sure the pods from before node recreation are running/completed - podCheckStart := time.Now() - podNamesAfter, err := e2epod.WaitForNRestartablePods(ps, len(podNames), framework.RestartPodReadyAgainTimeout) - framework.ExpectNoError(err) - remaining := framework.RestartPodReadyAgainTimeout - time.Since(podCheckStart) - if !e2epod.CheckPodsRunningReadyOrSucceeded(c, systemNamespace, podNamesAfter, remaining) { - framework.Failf("At least one pod wasn't running and ready after the restart.") - } -} diff --git a/vendor/k8s.io/kubernetes/test/e2e/node/runtimeclass.go b/vendor/k8s.io/kubernetes/test/e2e/node/runtimeclass.go index aa75d35184e2..b9c9caf96da6 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/node/runtimeclass.go +++ b/vendor/k8s.io/kubernetes/test/e2e/node/runtimeclass.go @@ -35,7 +35,7 @@ import ( "github.com/onsi/gomega" ) -var _ = ginkgo.Describe("[sig-node] RuntimeClass", func() { +var _ = SIGDescribe("RuntimeClass", func() { f := framework.NewDefaultFramework("runtimeclass") ginkgo.It("should reject a Pod requesting a RuntimeClass with conflicting node selector", func() { diff --git a/vendor/k8s.io/kubernetes/test/e2e/node/security_context.go b/vendor/k8s.io/kubernetes/test/e2e/node/security_context.go index 978c02e14e36..35075495c655 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/node/security_context.go +++ b/vendor/k8s.io/kubernetes/test/e2e/node/security_context.go @@ -86,7 +86,13 @@ var _ = SIGDescribe("Security Context", func() { }) }) - ginkgo.It("should support pod.Spec.SecurityContext.RunAsUser And pod.Spec.SecurityContext.RunAsGroup [LinuxOnly]", func() { + /* + Release: v1.21 + Testname: Security Context, test RunAsGroup at pod level + Description: Container is created with runAsUser and runAsGroup option by passing uid 1001 and gid 2002 at pod level. Pod MUST be in Succeeded phase. + [LinuxOnly]: This test is marked as LinuxOnly since Windows does not support running as UID / GID. + */ + framework.ConformanceIt("should support pod.Spec.SecurityContext.RunAsUser And pod.Spec.SecurityContext.RunAsGroup [LinuxOnly]", func() { pod := scTestPod(false, false) userID := int64(1001) groupID := int64(2002) @@ -115,7 +121,13 @@ var _ = SIGDescribe("Security Context", func() { }) }) - ginkgo.It("should support container.SecurityContext.RunAsUser And container.SecurityContext.RunAsGroup [LinuxOnly]", func() { + /* + Release: v1.21 + Testname: Security Context, test RunAsGroup at container level + Description: Container is created with runAsUser and runAsGroup option by passing uid 1001 and gid 2002 at containr level. Pod MUST be in Succeeded phase. + [LinuxOnly]: This test is marked as LinuxOnly since Windows does not support running as UID / GID. + */ + framework.ConformanceIt("should support container.SecurityContext.RunAsUser And container.SecurityContext.RunAsGroup [LinuxOnly]", func() { pod := scTestPod(false, false) userID := int64(1001) groupID := int64(2001) diff --git a/vendor/k8s.io/kubernetes/test/e2e/node/taints.go b/vendor/k8s.io/kubernetes/test/e2e/node/taints.go index 2c513e53b098..dd06d36b07e5 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/node/taints.go +++ b/vendor/k8s.io/kubernetes/test/e2e/node/taints.go @@ -453,7 +453,9 @@ var _ = SIGDescribe("NoExecuteTaintManager Multiple Pods [Serial]", func() { // 3. Wait to see if both pods get evicted in between [5, 25] seconds ginkgo.By("Waiting for Pod1 and Pod2 to be deleted") - timeoutChannel := time.NewTimer(time.Duration(kubeletPodDeletionDelaySeconds+3*additionalWaitPerDeleteSeconds) * time.Second).C + // On Windows hosts, we're noticing that the pods are taking more time to get deleted, so having larger timeout + // is good + timeoutChannel := time.NewTimer(time.Duration(kubeletPodDeletionDelaySeconds+10*additionalWaitPerDeleteSeconds) * time.Second).C var evicted int for evicted != 2 { select { diff --git a/vendor/k8s.io/kubernetes/test/e2e/node/ttlafterfinished.go b/vendor/k8s.io/kubernetes/test/e2e/node/ttlafterfinished.go deleted file mode 100644 index 814c1e69d13b..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/node/ttlafterfinished.go +++ /dev/null @@ -1,151 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package node - -import ( - "context" - "fmt" - "time" - - batchv1 "k8s.io/api/batch/v1" - v1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/wait" - clientset "k8s.io/client-go/kubernetes" - "k8s.io/kubernetes/pkg/util/slice" - "k8s.io/kubernetes/test/e2e/framework" - e2ejob "k8s.io/kubernetes/test/e2e/framework/job" - - "github.com/onsi/ginkgo" -) - -const ( - dummyFinalizer = "k8s.io/dummy-finalizer" - - // JobTimeout is how long to wait for a job to finish. - JobTimeout = 15 * time.Minute -) - -var _ = framework.KubeDescribe("[Feature:TTLAfterFinished][NodeAlphaFeature:TTLAfterFinished]", func() { - f := framework.NewDefaultFramework("ttlafterfinished") - - ginkgo.It("job should be deleted once it finishes after TTL seconds", func() { - testFinishedJob(f) - }) -}) - -func cleanupJob(f *framework.Framework, job *batchv1.Job) { - ns := f.Namespace.Name - c := f.ClientSet - - framework.Logf("Remove the Job's dummy finalizer; the Job should be deleted cascadingly") - removeFinalizerFunc := func(j *batchv1.Job) { - j.ObjectMeta.Finalizers = slice.RemoveString(j.ObjectMeta.Finalizers, dummyFinalizer, nil) - } - _, err := updateJobWithRetries(c, ns, job.Name, removeFinalizerFunc) - framework.ExpectNoError(err) - e2ejob.WaitForJobGone(c, ns, job.Name, wait.ForeverTestTimeout) - - err = e2ejob.WaitForAllJobPodsGone(c, ns, job.Name) - framework.ExpectNoError(err) -} - -func testFinishedJob(f *framework.Framework) { - ns := f.Namespace.Name - c := f.ClientSet - - parallelism := int32(1) - completions := int32(1) - backoffLimit := int32(2) - ttl := int32(10) - - job := e2ejob.NewTestJob("randomlySucceedOrFail", "rand-non-local", v1.RestartPolicyNever, parallelism, completions, nil, backoffLimit) - job.Spec.TTLSecondsAfterFinished = &ttl - job.ObjectMeta.Finalizers = []string{dummyFinalizer} - defer cleanupJob(f, job) - - framework.Logf("Create a Job %s/%s with TTL", ns, job.Name) - job, err := e2ejob.CreateJob(c, ns, job) - framework.ExpectNoError(err) - - framework.Logf("Wait for the Job to finish") - err = e2ejob.WaitForJobFinish(c, ns, job.Name) - framework.ExpectNoError(err) - - framework.Logf("Wait for TTL after finished controller to delete the Job") - err = waitForJobDeleting(c, ns, job.Name) - framework.ExpectNoError(err) - - framework.Logf("Check Job's deletionTimestamp and compare with the time when the Job finished") - job, err = e2ejob.GetJob(c, ns, job.Name) - framework.ExpectNoError(err) - finishTime := FinishTime(job) - finishTimeUTC := finishTime.UTC() - framework.ExpectNotEqual(finishTime.IsZero(), true) - - deleteAtUTC := job.ObjectMeta.DeletionTimestamp.UTC() - framework.ExpectNotEqual(deleteAtUTC, nil) - - expireAtUTC := finishTimeUTC.Add(time.Duration(ttl) * time.Second) - framework.ExpectEqual(deleteAtUTC.Before(expireAtUTC), false) -} - -// FinishTime returns finish time of the specified job. -func FinishTime(finishedJob *batchv1.Job) metav1.Time { - var finishTime metav1.Time - for _, c := range finishedJob.Status.Conditions { - if (c.Type == batchv1.JobComplete || c.Type == batchv1.JobFailed) && c.Status == v1.ConditionTrue { - return c.LastTransitionTime - } - } - return finishTime -} - -// updateJobWithRetries updates job with retries. -func updateJobWithRetries(c clientset.Interface, namespace, name string, applyUpdate func(*batchv1.Job)) (job *batchv1.Job, err error) { - jobs := c.BatchV1().Jobs(namespace) - var updateErr error - pollErr := wait.PollImmediate(framework.Poll, JobTimeout, func() (bool, error) { - if job, err = jobs.Get(context.TODO(), name, metav1.GetOptions{}); err != nil { - return false, err - } - // Apply the update, then attempt to push it to the apiserver. - applyUpdate(job) - if job, err = jobs.Update(context.TODO(), job, metav1.UpdateOptions{}); err == nil { - framework.Logf("Updating job %s", name) - return true, nil - } - updateErr = err - return false, nil - }) - if pollErr == wait.ErrWaitTimeout { - pollErr = fmt.Errorf("couldn't apply the provided updated to job %q: %v", name, updateErr) - } - return job, pollErr -} - -// waitForJobDeleting uses c to wait for the Job jobName in namespace ns to have -// a non-nil deletionTimestamp (i.e. being deleted). -func waitForJobDeleting(c clientset.Interface, ns, jobName string) error { - return wait.PollImmediate(framework.Poll, JobTimeout, func() (bool, error) { - curr, err := c.BatchV1().Jobs(ns).Get(context.TODO(), jobName, metav1.GetOptions{}) - if err != nil { - return false, err - } - return curr.ObjectMeta.DeletionTimestamp != nil, nil - }) -} diff --git a/vendor/k8s.io/kubernetes/test/e2e/perftype/BUILD b/vendor/k8s.io/kubernetes/test/e2e/perftype/BUILD deleted file mode 100644 index 81ea0ff00f4c..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/perftype/BUILD +++ /dev/null @@ -1,25 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["perftype.go"], - importpath = "k8s.io/kubernetes/test/e2e/perftype", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/reporters/BUILD b/vendor/k8s.io/kubernetes/test/e2e/reporters/BUILD deleted file mode 100644 index 694d91585f9b..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/reporters/BUILD +++ /dev/null @@ -1,30 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "progress.go", - "testDetails.go", - ], - importpath = "k8s.io/kubernetes/test/e2e/reporters", - visibility = ["//visibility:public"], - deps = [ - "//vendor/github.com/onsi/ginkgo/config:go_default_library", - "//vendor/github.com/onsi/ginkgo/types:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/scheduling/BUILD b/vendor/k8s.io/kubernetes/test/e2e/scheduling/BUILD deleted file mode 100644 index 40fe5e3e0e2a..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/scheduling/BUILD +++ /dev/null @@ -1,81 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "events.go", - "framework.go", - "limit_range.go", - "nvidia-gpus.go", - "predicates.go", - "preemption.go", - "priorities.go", - "ubernetes_lite.go", - "ubernetes_lite_volumes.go", - ], - importpath = "k8s.io/kubernetes/test/e2e/scheduling", - visibility = ["//visibility:public"], - deps = [ - "//pkg/api/v1/pod:go_default_library", - "//pkg/apis/core/v1/helper/qos:go_default_library", - "//pkg/apis/extensions:go_default_library", - "//pkg/apis/scheduling:go_default_library", - "//pkg/scheduler/util:go_default_library", - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/node/v1:go_default_library", - "//staging/src/k8s.io/api/scheduling/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/version:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/tools/watch:go_default_library", - "//test/e2e/framework:go_default_library", - "//test/e2e/framework/gpu:go_default_library", - "//test/e2e/framework/job:go_default_library", - "//test/e2e/framework/manifest:go_default_library", - "//test/e2e/framework/node:go_default_library", - "//test/e2e/framework/pod:go_default_library", - "//test/e2e/framework/providers/gce:go_default_library", - "//test/e2e/framework/pv:go_default_library", - "//test/e2e/framework/rc:go_default_library", - "//test/e2e/framework/replicaset:go_default_library", - "//test/e2e/framework/resource:go_default_library", - "//test/e2e/framework/service:go_default_library", - "//test/e2e/framework/skipper:go_default_library", - "//test/e2e/framework/testfiles:go_default_library", - "//test/utils:go_default_library", - "//test/utils/image:go_default_library", - "//vendor/github.com/google/uuid:go_default_library", - "//vendor/github.com/onsi/ginkgo:go_default_library", - "//vendor/github.com/onsi/gomega:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/google.golang.org/api/compute/v1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/scheduling/framework.go b/vendor/k8s.io/kubernetes/test/e2e/scheduling/framework.go index 55e28f220c65..2ab2a57dabcb 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/scheduling/framework.go +++ b/vendor/k8s.io/kubernetes/test/e2e/scheduling/framework.go @@ -60,24 +60,6 @@ func WaitForStableCluster(c clientset.Interface, workerNodes sets.String) int { return len(allScheduledPods) } -// WaitForPodsToBeDeleted waits until pods that are terminating to get deleted. -func WaitForPodsToBeDeleted(c clientset.Interface) { - startTime := time.Now() - deleting := getDeletingPods(c, metav1.NamespaceAll) - for len(deleting) != 0 { - if startTime.Add(timeout).Before(time.Now()) { - framework.Logf("Pods still not deleted") - for _, p := range deleting { - framework.Logf("%v/%v", p.Namespace, p.Name) - } - framework.Failf("Timed out after %v waiting for pods to be deleted", timeout) - break - } - time.Sleep(waitTime) - deleting = getDeletingPods(c, metav1.NamespaceAll) - } -} - // getScheduledAndUnscheduledPods lists scheduled and not scheduled pods in all namespaces, with succeeded and failed pods filtered out. func getScheduledAndUnscheduledPods(c clientset.Interface, workerNodes sets.String) (scheduledPods, notScheduledPods []v1.Pod) { pods, err := c.CoreV1().Pods(metav1.NamespaceAll).List(context.TODO(), metav1.ListOptions{}) @@ -94,19 +76,6 @@ func getScheduledAndUnscheduledPods(c clientset.Interface, workerNodes sets.Stri return GetPodsScheduled(workerNodes, pods) } -// getDeletingPods returns whether there are any pods marked for deletion. -func getDeletingPods(c clientset.Interface, ns string) []v1.Pod { - pods, err := c.CoreV1().Pods(ns).List(context.TODO(), metav1.ListOptions{}) - framework.ExpectNoError(err, fmt.Sprintf("listing all pods in namespace %q while waiting for pods to terminate", ns)) - var deleting []v1.Pod - for _, p := range pods.Items { - if p.ObjectMeta.DeletionTimestamp != nil && !podTerminated(p) { - deleting = append(deleting, p) - } - } - return deleting -} - func podTerminated(p v1.Pod) bool { return p.Status.Phase == v1.PodSucceeded || p.Status.Phase == v1.PodFailed } diff --git a/vendor/k8s.io/kubernetes/test/e2e/scheduling/predicates.go b/vendor/k8s.io/kubernetes/test/e2e/scheduling/predicates.go index 4f66cafab2d8..2daff177e378 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/scheduling/predicates.go +++ b/vendor/k8s.io/kubernetes/test/e2e/scheduling/predicates.go @@ -19,8 +19,6 @@ package scheduling import ( "context" "fmt" - "net" - "strconv" "time" v1 "k8s.io/api/core/v1" @@ -653,13 +651,7 @@ var _ = SIGDescribe("SchedulerPredicates [Serial]", func() { verifyResult(cs, 1, 0, ns) }) - /* - Release: v1.16 - Testname: Scheduling, HostPort matching and HostIP and Protocol not-matching - Description: Pods with the same HostPort value MUST be able to be scheduled to the same node - if the HostIP or Protocol is different. - */ - framework.ConformanceIt("validates that there is no conflict between pods with same hostPort but different hostIP and protocol", func() { + ginkgo.It("validates that there is no conflict between pods with same hostPort but different hostIP and protocol", func() { nodeName := GetNodeThatCanRunPod(f) localhost := "127.0.0.1" @@ -690,66 +682,6 @@ var _ = SIGDescribe("SchedulerPredicates [Serial]", func() { ginkgo.By(fmt.Sprintf("Trying to create a third pod(pod3) with hostport %v, hostIP %s but use UDP protocol on the node which pod2 resides", port, hostIP)) createHostPortPodOnNode(f, "pod3", ns, hostIP, port, v1.ProtocolUDP, nodeSelector, true) - // check that the port is being actually exposed to each container - // create a pod on the host network in the same node - hostExecPod := &v1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - Name: "e2e-host-exec", - Namespace: f.Namespace.Name, - }, - Spec: v1.PodSpec{ - HostNetwork: true, - NodeSelector: nodeSelector, - Containers: []v1.Container{ - { - Name: "e2e-host-exec", - Image: imageutils.GetE2EImage(imageutils.Agnhost), - }, - }, - }, - } - f.PodClient().CreateSync(hostExecPod) - - // use a 5 seconds timeout per connection - timeout := 5 - // IPv6 doesn't NAT from localhost -> localhost, it doesn't have the route_localnet kernel hack, so we need to specify the source IP - cmdPod1 := []string{"/bin/sh", "-c", fmt.Sprintf("curl -g --connect-timeout %v --interface %s http://%s/hostname", timeout, hostIP, net.JoinHostPort(localhost, strconv.Itoa(int(port))))} - cmdPod2 := []string{"/bin/sh", "-c", fmt.Sprintf("curl -g --connect-timeout %v http://%s/hostname", timeout, net.JoinHostPort(hostIP, strconv.Itoa(int(port))))} - cmdPod3 := []string{"/bin/sh", "-c", fmt.Sprintf("nc -vuz -w %v %s %d", timeout, hostIP, port)} - // try 5 times to connect to the exposed ports - success := false - for i := 0; i < 5; i++ { - // check pod1 - ginkgo.By(fmt.Sprintf("checking connectivity from pod %s to serverIP: %s, port: %d", hostExecPod.Name, localhost, port)) - hostname1, _, err := f.ExecCommandInContainerWithFullOutput(hostExecPod.Name, "e2e-host-exec", cmdPod1...) - if err != nil { - framework.Logf("Can not connect from %s to pod(pod1) to serverIP: %s, port: %d", hostExecPod.Name, localhost, port) - continue - } - // check pod2 - ginkgo.By(fmt.Sprintf("checking connectivity from pod %s to serverIP: %s, port: %d", hostExecPod.Name, hostIP, port)) - hostname2, _, err := f.ExecCommandInContainerWithFullOutput(hostExecPod.Name, "e2e-host-exec", cmdPod2...) - if err != nil { - framework.Logf("Can not connect from %s to pod(pod2) to serverIP: %s, port: %d", hostExecPod.Name, hostIP, port) - continue - } - // the hostname returned has to be different because we are exposing the same port to two different pods - if hostname1 == hostname2 { - framework.Logf("pods must have different hostname: pod1 has hostname %s, pod2 has hostname %s", hostname1, hostname2) - continue - } - // check pod3 - ginkgo.By(fmt.Sprintf("checking connectivity from pod %s to serverIP: %s, port: %d UDP", hostExecPod.Name, hostIP, port)) - _, _, err = f.ExecCommandInContainerWithFullOutput(hostExecPod.Name, "e2e-host-exec", cmdPod3...) - if err != nil { - framework.Logf("Can not connect from %s to pod(pod2) to serverIP: %s, port: %d", hostExecPod.Name, hostIP, port) - continue - } - success = true - } - if !success { - framework.Failf("Failed to connect to exposed host ports") - } }) /* @@ -786,6 +718,9 @@ var _ = SIGDescribe("SchedulerPredicates [Serial]", func() { topologyKey := "kubernetes.io/e2e-pts-filter" ginkgo.BeforeEach(func() { + if len(nodeList.Items) < 2 { + ginkgo.Skip("At least 2 nodes are required to run the test") + } ginkgo.By("Trying to get 2 available nodes which can run pod") nodeNames = Get2NodesThatCanRunPod(f) ginkgo.By(fmt.Sprintf("Apply dedicated topologyKey %v for this test on the 2 nodes.", topologyKey)) diff --git a/vendor/k8s.io/kubernetes/test/e2e/scheduling/preemption.go b/vendor/k8s.io/kubernetes/test/e2e/scheduling/preemption.go index d23d0f406194..97cc12b009f0 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/scheduling/preemption.go +++ b/vendor/k8s.io/kubernetes/test/e2e/scheduling/preemption.go @@ -121,51 +121,55 @@ var _ = SIGDescribe("SchedulerPreemption [Serial]", func() { framework.ConformanceIt("validates basic preemption works", func() { var podRes v1.ResourceList - // Create one pod per node that uses a lot of the node's resources. - ginkgo.By("Create pods that use 2/3 of node resources.") - pods := make([]*v1.Pod, 0, len(nodeList.Items)) - // Now create victim pods on each of the node with lower priority + // Create two pods per node that uses a lot of the node's resources. + ginkgo.By("Create pods that use 4/5 of node resources.") + pods := make([]*v1.Pod, 0, 2*len(nodeList.Items)) + // Create pods in the cluster. + // One of them has low priority, making it the victim for preemption. for i, node := range nodeList.Items { // Update each node to advertise 3 available extended resources nodeCopy := node.DeepCopy() - nodeCopy.Status.Capacity[testExtendedResource] = resource.MustParse("3") + nodeCopy.Status.Capacity[testExtendedResource] = resource.MustParse("5") err := patchNode(cs, &node, nodeCopy) framework.ExpectNoError(err) - // Request 2 of the available resources for the victim pods - podRes = v1.ResourceList{} - podRes[testExtendedResource] = resource.MustParse("2") + for j := 0; j < 2; j++ { + // Request 2 of the available resources for the victim pods + podRes = v1.ResourceList{} + podRes[testExtendedResource] = resource.MustParse("2") - // make the first pod low priority and the rest medium priority. - priorityName := mediumPriorityClassName - if len(pods) == 0 { - priorityName = lowPriorityClassName - } - pods = append(pods, createPausePod(f, pausePodConfig{ - Name: fmt.Sprintf("pod%d-%v", i, priorityName), - PriorityClassName: priorityName, - Resources: &v1.ResourceRequirements{ - Requests: podRes, - Limits: podRes, - }, - Affinity: &v1.Affinity{ - NodeAffinity: &v1.NodeAffinity{ - RequiredDuringSchedulingIgnoredDuringExecution: &v1.NodeSelector{ - NodeSelectorTerms: []v1.NodeSelectorTerm{ - { - MatchFields: []v1.NodeSelectorRequirement{ - {Key: "metadata.name", Operator: v1.NodeSelectorOpIn, Values: []string{node.Name}}, + // make the first pod low priority and the rest medium priority. + priorityName := mediumPriorityClassName + if len(pods) == 0 { + priorityName = lowPriorityClassName + } + pausePod := createPausePod(f, pausePodConfig{ + Name: fmt.Sprintf("pod%d-%d-%v", i, j, priorityName), + PriorityClassName: priorityName, + Resources: &v1.ResourceRequirements{ + Requests: podRes, + Limits: podRes, + }, + Affinity: &v1.Affinity{ + NodeAffinity: &v1.NodeAffinity{ + RequiredDuringSchedulingIgnoredDuringExecution: &v1.NodeSelector{ + NodeSelectorTerms: []v1.NodeSelectorTerm{ + { + MatchFields: []v1.NodeSelectorRequirement{ + {Key: "metadata.name", Operator: v1.NodeSelectorOpIn, Values: []string{node.Name}}, + }, }, }, }, }, }, - }, - })) - framework.Logf("Created pod: %v", pods[i].Name) + }) + pods = append(pods, pausePod) + framework.Logf("Created pod: %v", pausePod.Name) + } } if len(pods) < 2 { - framework.Failf("We need at least two pods to be created but" + + framework.Failf("We need at least two pods to be created but " + "all nodes are already heavily utilized, so preemption tests cannot be run") } ginkgo.By("Wait for pods to be scheduled.") @@ -209,49 +213,52 @@ var _ = SIGDescribe("SchedulerPreemption [Serial]", func() { framework.ConformanceIt("validates lower priority pod preemption by critical pod", func() { var podRes v1.ResourceList - ginkgo.By("Create pods that use 2/3 of node resources.") + ginkgo.By("Create pods that use 4/5 of node resources.") pods := make([]*v1.Pod, 0, len(nodeList.Items)) for i, node := range nodeList.Items { // Update each node to advertise 3 available extended resources nodeCopy := node.DeepCopy() - nodeCopy.Status.Capacity[testExtendedResource] = resource.MustParse("3") + nodeCopy.Status.Capacity[testExtendedResource] = resource.MustParse("5") err := patchNode(cs, &node, nodeCopy) framework.ExpectNoError(err) - // Request 2 of the available resources for the victim pods - podRes = v1.ResourceList{} - podRes[testExtendedResource] = resource.MustParse("2") + for j := 0; j < 2; j++ { + // Request 2 of the available resources for the victim pods + podRes = v1.ResourceList{} + podRes[testExtendedResource] = resource.MustParse("2") - // make the first pod low priority and the rest medium priority. - priorityName := mediumPriorityClassName - if len(pods) == 0 { - priorityName = lowPriorityClassName - } - pods = append(pods, createPausePod(f, pausePodConfig{ - Name: fmt.Sprintf("pod%d-%v", i, priorityName), - PriorityClassName: priorityName, - Resources: &v1.ResourceRequirements{ - Requests: podRes, - Limits: podRes, - }, - Affinity: &v1.Affinity{ - NodeAffinity: &v1.NodeAffinity{ - RequiredDuringSchedulingIgnoredDuringExecution: &v1.NodeSelector{ - NodeSelectorTerms: []v1.NodeSelectorTerm{ - { - MatchFields: []v1.NodeSelectorRequirement{ - {Key: "metadata.name", Operator: v1.NodeSelectorOpIn, Values: []string{node.Name}}, + // make the first pod low priority and the rest medium priority. + priorityName := mediumPriorityClassName + if len(pods) == 0 { + priorityName = lowPriorityClassName + } + pausePod := createPausePod(f, pausePodConfig{ + Name: fmt.Sprintf("pod%d-%d-%v", i, j, priorityName), + PriorityClassName: priorityName, + Resources: &v1.ResourceRequirements{ + Requests: podRes, + Limits: podRes, + }, + Affinity: &v1.Affinity{ + NodeAffinity: &v1.NodeAffinity{ + RequiredDuringSchedulingIgnoredDuringExecution: &v1.NodeSelector{ + NodeSelectorTerms: []v1.NodeSelectorTerm{ + { + MatchFields: []v1.NodeSelectorRequirement{ + {Key: "metadata.name", Operator: v1.NodeSelectorOpIn, Values: []string{node.Name}}, + }, }, }, }, }, }, - }, - })) - framework.Logf("Created pod: %v", pods[i].Name) + }) + pods = append(pods, pausePod) + framework.Logf("Created pod: %v", pausePod.Name) + } } if len(pods) < 2 { - framework.Failf("We need at least two pods to be created but" + + framework.Failf("We need at least two pods to be created but " + "all nodes are already heavily utilized, so preemption tests cannot be run") } ginkgo.By("Wait for pods to be scheduled.") @@ -306,6 +313,9 @@ var _ = SIGDescribe("SchedulerPreemption [Serial]", func() { var fakeRes v1.ResourceName = "example.com/fakePTSRes" ginkgo.BeforeEach(func() { + if len(nodeList.Items) < 2 { + ginkgo.Skip("At least 2 nodes are required to run the test") + } ginkgo.By("Trying to get 2 available nodes which can run pod") nodeNames = Get2NodesThatCanRunPod(f) ginkgo.By(fmt.Sprintf("Apply dedicated topologyKey %v for this test on the 2 nodes.", topologyKey)) diff --git a/vendor/k8s.io/kubernetes/test/e2e/scheduling/priorities.go b/vendor/k8s.io/kubernetes/test/e2e/scheduling/priorities.go index e3d7cc6cda14..4f33c4eba1e5 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/scheduling/priorities.go +++ b/vendor/k8s.io/kubernetes/test/e2e/scheduling/priorities.go @@ -55,6 +55,11 @@ type Resource struct { var balancePodLabel = map[string]string{"podname": "priority-balanced-memory"} +// track min memory limit based on crio minimum. pods cannot set a limit lower than this +// see: https://github.com/cri-o/cri-o/blob/29805b13e9a43d9d22628553db337ce1c1bec0a8/internal/config/cgmgr/cgmgr.go#L23 +// see: https://bugzilla.redhat.com/show_bug.cgi?id=1595256 +var crioMinMemLimit = 12 * 1024 * 1024 + var podRequestedResource = &v1.ResourceRequirements{ Limits: v1.ResourceList{ v1.ResourceMemory: resource.MustParse("100Mi"), @@ -121,6 +126,19 @@ func removeAvoidPodsOffNode(c clientset.Interface, nodeName string) { framework.ExpectNoError(err) } +// nodesAreTooUtilized ensures that each node can support 2*crioMinMemLimit +// We check for double because it needs to support at least the cri-o minimum +// plus whatever delta between node usages (which could be up to or at least crioMinMemLimit) +func nodesAreTooUtilized(cs clientset.Interface, nodeList *v1.NodeList) bool { + for _, node := range nodeList.Items { + _, memFraction, _, memAllocatable := computeCPUMemFraction(cs, node, podRequestedResource) + if float64(memAllocatable)-(memFraction*float64(memAllocatable)) < float64(2*crioMinMemLimit) { + return true + } + } + return false +} + // This test suite is used to verifies scheduler priority functions based on the default provider var _ = SIGDescribe("SchedulerPriorities [Serial]", func() { var cs clientset.Interface @@ -149,6 +167,12 @@ var _ = SIGDescribe("SchedulerPriorities [Serial]", func() { framework.ExpectNoError(err) err = e2epod.WaitForPodsRunningReady(cs, metav1.NamespaceSystem, int32(systemPodsNo), 0, framework.PodReadyBeforeTimeout, map[string]string{}) framework.ExpectNoError(err) + + // skip if the most utilized node has less than the cri-o minMemLimit available + // otherwise we will not be able to run the test pod once all nodes are balanced + if nodesAreTooUtilized(cs, nodeList) { + ginkgo.Skip("nodes are too utilized to schedule test pods") + } }) ginkgo.It("Pod should be scheduled to node that don't match the PodAntiAffinity terms", func() { @@ -307,19 +331,40 @@ var _ = SIGDescribe("SchedulerPriorities [Serial]", func() { // Apply 10 taints to first node nodeName := nodeList.Items[0].Name - ginkgo.By("Trying to apply 10 (tolerable) taints on the first node.") + // First, create a set of tolerable taints (+tolerations) for the first node. + // Generate 10 tolerable taints for the first node (and matching tolerations) + tolerableTaints := make([]v1.Taint, 0) var tolerations []v1.Toleration for i := 0; i < 10; i++ { - testTaint := addRandomTaintToNode(cs, nodeName) + testTaint := getRandomTaint() + tolerableTaints = append(tolerableTaints, testTaint) tolerations = append(tolerations, v1.Toleration{Key: testTaint.Key, Value: testTaint.Value, Effect: testTaint.Effect}) - defer e2enode.RemoveTaintOffNode(cs, nodeName, *testTaint) } + // Generate 10 intolerable taints for each of the remaining nodes + intolerableTaints := make(map[string][]v1.Taint) + for i := 1; i < len(nodeList.Items); i++ { + nodeTaints := make([]v1.Taint, 0) + for i := 0; i < 10; i++ { + nodeTaints = append(nodeTaints, getRandomTaint()) + } + intolerableTaints[nodeList.Items[i].Name] = nodeTaints + } + + // Apply the tolerable taints generated above to the first node + ginkgo.By("Trying to apply 10 (tolerable) taints on the first node.") + // We immediately defer the removal of these taints because addTaintToNode can + // panic and RemoveTaintsOffNode does not return an error if the taint does not exist. + defer e2enode.RemoveTaintsOffNode(cs, nodeName, tolerableTaints) + for _, taint := range tolerableTaints { + addTaintToNode(cs, nodeName, taint) + } + // Apply the intolerable taints to each of the following nodes ginkgo.By("Adding 10 intolerable taints to all other nodes") for i := 1; i < len(nodeList.Items); i++ { node := nodeList.Items[i] - for i := 0; i < 10; i++ { - testTaint := addRandomTaintToNode(cs, node.Name) - defer e2enode.RemoveTaintOffNode(cs, node.Name, *testTaint) + defer e2enode.RemoveTaintsOffNode(cs, node.Name, intolerableTaints[node.Name]) + for _, taint := range intolerableTaints[node.Name] { + addTaintToNode(cs, node.Name, taint) } } @@ -342,6 +387,9 @@ var _ = SIGDescribe("SchedulerPriorities [Serial]", func() { topologyKey := "kubernetes.io/e2e-pts-score" ginkgo.BeforeEach(func() { + if len(nodeList.Items) < 2 { + ginkgo.Skip("At least 2 nodes are required to run the test") + } ginkgo.By("Trying to get 2 available nodes which can run pod") nodeNames = Get2NodesThatCanRunPod(f) ginkgo.By(fmt.Sprintf("Apply dedicated topologyKey %v for this test on the 2 nodes.", topologyKey)) @@ -462,8 +510,9 @@ func createBalancedPodForNodes(f *framework.Framework, cs clientset.Interface, n var maxCPUFraction, maxMemFraction float64 = ratio, ratio var cpuFractionMap = make(map[string]float64) var memFractionMap = make(map[string]float64) + for _, node := range nodes { - cpuFraction, memFraction := computeCPUMemFraction(cs, node, requestedResource) + cpuFraction, memFraction, _, _ := computeCPUMemFraction(cs, node, requestedResource) cpuFractionMap[node.Name] = cpuFraction memFractionMap[node.Name] = memFraction if cpuFraction > maxCPUFraction { @@ -473,6 +522,7 @@ func createBalancedPodForNodes(f *framework.Framework, cs clientset.Interface, n maxMemFraction = memFraction } } + // we need the max one to keep the same cpu/mem use rate ratio = math.Max(maxCPUFraction, maxMemFraction) for _, node := range nodes { @@ -489,13 +539,13 @@ func createBalancedPodForNodes(f *framework.Framework, cs clientset.Interface, n memFraction := memFractionMap[node.Name] needCreateResource[v1.ResourceCPU] = *resource.NewMilliQuantity(int64((ratio-cpuFraction)*float64(cpuAllocatableMil)), resource.DecimalSI) - needCreateResource[v1.ResourceMemory] = *resource.NewQuantity(int64((ratio-memFraction)*float64(memAllocatableVal)), resource.BinarySI) + // add crioMinMemLimit to ensure that all pods are setting at least that much for a limit, while keeping the same ratios + needCreateResource[v1.ResourceMemory] = *resource.NewQuantity(int64((ratio-memFraction)*float64(memAllocatableVal)+float64(crioMinMemLimit)), resource.BinarySI) podConfig := &pausePodConfig{ Name: "", Labels: balancePodLabel, Resources: &v1.ResourceRequirements{ - Limits: needCreateResource, Requests: needCreateResource, }, Affinity: &v1.Affinity{ @@ -529,7 +579,7 @@ func createBalancedPodForNodes(f *framework.Framework, cs clientset.Interface, n return cleanUp, nil } -func computeCPUMemFraction(cs clientset.Interface, node v1.Node, resource *v1.ResourceRequirements) (float64, float64) { +func computeCPUMemFraction(cs clientset.Interface, node v1.Node, resource *v1.ResourceRequirements) (float64, float64, int64, int64) { framework.Logf("ComputeCPUMemFraction for node: %v", node.Name) totalRequestedCPUResource := resource.Requests.Cpu().MilliValue() totalRequestedMemResource := resource.Requests.Memory().Value() @@ -568,7 +618,7 @@ func computeCPUMemFraction(cs clientset.Interface, node v1.Node, resource *v1.Re framework.Logf("Node: %v, totalRequestedCPUResource: %v, cpuAllocatableMil: %v, cpuFraction: %v", node.Name, totalRequestedCPUResource, cpuAllocatableMil, cpuFraction) framework.Logf("Node: %v, totalRequestedMemResource: %v, memAllocatableVal: %v, memFraction: %v", node.Name, totalRequestedMemResource, memAllocatableVal, memFraction) - return cpuFraction, memFraction + return cpuFraction, memFraction, cpuAllocatableMil, memAllocatableVal } func getNonZeroRequests(pod *v1.Pod) Resource { @@ -614,13 +664,15 @@ func createRC(ns, rsName string, replicas int32, rcPodLabels map[string]string, return rc } -func addRandomTaintToNode(cs clientset.Interface, nodeName string) *v1.Taint { - testTaint := v1.Taint{ - Key: fmt.Sprintf("kubernetes.io/e2e-taint-key-%s", string(uuid.NewUUID())), +func getRandomTaint() v1.Taint { + return v1.Taint{ + Key: fmt.Sprintf("kubernetes.io/e2e-scheduling-priorities-%s", string(uuid.NewUUID()[:23])), Value: fmt.Sprintf("testing-taint-value-%s", string(uuid.NewUUID())), Effect: v1.TaintEffectPreferNoSchedule, } +} + +func addTaintToNode(cs clientset.Interface, nodeName string, testTaint v1.Taint) { e2enode.AddOrUpdateTaintOnNode(cs, nodeName, testTaint) framework.ExpectNodeHasTaint(cs, nodeName, &testTaint) - return &testTaint } diff --git a/vendor/k8s.io/kubernetes/test/e2e/scheduling/ubernetes_lite.go b/vendor/k8s.io/kubernetes/test/e2e/scheduling/ubernetes_lite.go index 0f803b6f8cbc..4cd098a57fa3 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/scheduling/ubernetes_lite.go +++ b/vendor/k8s.io/kubernetes/test/e2e/scheduling/ubernetes_lite.go @@ -24,7 +24,7 @@ import ( "github.com/onsi/ginkgo" "github.com/onsi/gomega" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/util/intstr" @@ -69,11 +69,11 @@ var _ = SIGDescribe("Multi-AZ Clusters", func() { cleanUp() } }) - ginkgo.It("should spread the pods of a service across zones", func() { + ginkgo.It("should spread the pods of a service across zones [Serial]", func() { SpreadServiceOrFail(f, 5*zoneCount, imageutils.GetPauseImageName()) }) - ginkgo.It("should spread the pods of a replication controller across zones", func() { + ginkgo.It("should spread the pods of a replication controller across zones [Serial]", func() { SpreadRCOrFail(f, int32(5*zoneCount), framework.ServeHostnameImage, []string{"serve-hostname"}) }) }) @@ -136,13 +136,13 @@ func SpreadServiceOrFail(f *framework.Framework, replicaCount int, image string) // Find the name of the zone in which a Node is running func getZoneNameForNode(node v1.Node) (string, error) { - for key, value := range node.Labels { - if key == v1.LabelFailureDomainBetaZone { - return value, nil - } + if z, ok := node.Labels[v1.LabelFailureDomainBetaZone]; ok { + return z, nil + } else if z, ok := node.Labels[v1.LabelTopologyZone]; ok { + return z, nil } - return "", fmt.Errorf("node %s doesn't have zone label %s", - node.Name, v1.LabelFailureDomainBetaZone) + return "", fmt.Errorf("node %s doesn't have zone label %s or %s", + node.Name, v1.LabelFailureDomainBetaZone, v1.LabelTopologyZone) } // Return the number of zones in which we have nodes in this cluster. diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/BUILD b/vendor/k8s.io/kubernetes/test/e2e/storage/BUILD deleted file mode 100644 index 6123ed8d2d6b..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/BUILD +++ /dev/null @@ -1,128 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "csi_mock_volume.go", - "csi_volumes.go", - "detach_mounted.go", - "empty_dir_wrapper.go", - "ephemeral_volume.go", - "flexvolume.go", - "flexvolume_mounted_volume_resize.go", - "flexvolume_online_resize.go", - "generic_persistent_volume-disruptive.go", - "host_path_type.go", - "in_tree_volumes.go", - "mounted_volume_resize.go", - "nfs_persistent_volume-disruptive.go", - "pd.go", - "persistent_volumes.go", - "persistent_volumes-gce.go", - "persistent_volumes-local.go", - "pv_protection.go", - "pvc_protection.go", - "regional_pd.go", - "subpath.go", - "volume_limits.go", - "volume_metrics.go", - "volume_provisioning.go", - "volumes.go", - ], - importpath = "k8s.io/kubernetes/test/e2e/storage", - visibility = ["//visibility:public"], - deps = [ - "//pkg/api/v1/pod:go_default_library", - "//pkg/apis/core/v1/helper:go_default_library", - "//pkg/apis/storage/v1/util:go_default_library", - "//pkg/client/conditions:go_default_library", - "//pkg/controller/volume/scheduling:go_default_library", - "//pkg/kubelet/events:go_default_library", - "//pkg/kubelet/metrics:go_default_library", - "//pkg/util/slice:go_default_library", - "//pkg/volume/util:go_default_library", - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/api/rbac/v1:go_default_library", - "//staging/src/k8s.io/api/storage/v1:go_default_library", - "//staging/src/k8s.io/api/storage/v1alpha1:go_default_library", - "//staging/src/k8s.io/api/storage/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/rand:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/serviceaccount:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/tools/watch:go_default_library", - "//staging/src/k8s.io/cloud-provider/volume/helpers:go_default_library", - "//staging/src/k8s.io/component-base/metrics/testutil:go_default_library", - "//test/e2e/framework:go_default_library", - "//test/e2e/framework/auth:go_default_library", - "//test/e2e/framework/deployment:go_default_library", - "//test/e2e/framework/events:go_default_library", - "//test/e2e/framework/kubectl:go_default_library", - "//test/e2e/framework/kubesystem:go_default_library", - "//test/e2e/framework/metrics:go_default_library", - "//test/e2e/framework/node:go_default_library", - "//test/e2e/framework/pod:go_default_library", - "//test/e2e/framework/providers/gce:go_default_library", - "//test/e2e/framework/pv:go_default_library", - "//test/e2e/framework/rc:go_default_library", - "//test/e2e/framework/skipper:go_default_library", - "//test/e2e/framework/ssh:go_default_library", - "//test/e2e/framework/statefulset:go_default_library", - "//test/e2e/framework/testfiles:go_default_library", - "//test/e2e/framework/volume:go_default_library", - "//test/e2e/storage/drivers:go_default_library", - "//test/e2e/storage/testpatterns:go_default_library", - "//test/e2e/storage/testsuites:go_default_library", - "//test/e2e/storage/utils:go_default_library", - "//test/utils/image:go_default_library", - "//vendor/github.com/aws/aws-sdk-go/aws:go_default_library", - "//vendor/github.com/aws/aws-sdk-go/aws/session:go_default_library", - "//vendor/github.com/aws/aws-sdk-go/service/ec2:go_default_library", - "//vendor/github.com/onsi/ginkgo:go_default_library", - "//vendor/github.com/onsi/gomega:go_default_library", - "//vendor/google.golang.org/api/googleapi:go_default_library", - "//vendor/google.golang.org/grpc/codes:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//test/e2e/storage/drivers:all-srcs", - "//test/e2e/storage/external:all-srcs", - "//test/e2e/storage/podlogs:all-srcs", - "//test/e2e/storage/testpatterns:all-srcs", - "//test/e2e/storage/testsuites:all-srcs", - "//test/e2e/storage/utils:all-srcs", - "//test/e2e/storage/vsphere:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/csi_mock_volume.go b/vendor/k8s.io/kubernetes/test/e2e/storage/csi_mock_volume.go index c8d5e7698949..9de18dc5d8eb 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/csi_mock_volume.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/csi_mock_volume.go @@ -19,18 +19,19 @@ package storage import ( "context" "crypto/sha256" - "encoding/json" "errors" "fmt" "math/rand" "strconv" "strings" + "sync/atomic" "time" "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" v1 "k8s.io/api/core/v1" storagev1 "k8s.io/api/storage/v1" - storagev1alpha1 "k8s.io/api/storage/v1alpha1" + storagev1beta1 "k8s.io/api/storage/v1beta1" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -52,7 +53,7 @@ import ( e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" e2evolume "k8s.io/kubernetes/test/e2e/framework/volume" "k8s.io/kubernetes/test/e2e/storage/drivers" - "k8s.io/kubernetes/test/e2e/storage/testpatterns" + storageframework "k8s.io/kubernetes/test/e2e/storage/framework" "k8s.io/kubernetes/test/e2e/storage/testsuites" "k8s.io/kubernetes/test/e2e/storage/utils" imageutils "k8s.io/kubernetes/test/utils/image" @@ -75,13 +76,6 @@ const ( // How log to wait for kubelet to unstage a volume after a pod is deleted csiUnstageWaitTimeout = 1 * time.Minute - - // Name of CSI driver pod name (it's in a StatefulSet with a stable name) - driverPodName = "csi-mockplugin-0" - // Name of CSI driver container name - driverContainerName = "mock" - // Prefix of the mock driver grpc log - grpcCallPrefix = "gRPCCall:" ) // csiCall represents an expected call from Kubernetes to CSI mock driver and @@ -113,7 +107,7 @@ var _ = utils.SIGDescribe("CSI mock volume", func() { // just disable resizing on driver it overrides enableResizing flag for CSI mock driver disableResizingOnDriver bool enableSnapshot bool - javascriptHooks map[string]string + hooks *drivers.Hooks tokenRequests []storagev1.TokenRequest requiresRepublish *bool fsGroupPolicy *storagev1.FSGroupPolicy @@ -121,13 +115,13 @@ var _ = utils.SIGDescribe("CSI mock volume", func() { type mockDriverSetup struct { cs clientset.Interface - config *testsuites.PerTestConfig + config *storageframework.PerTestConfig testCleanups []func() pods []*v1.Pod pvcs []*v1.PersistentVolumeClaim sc map[string]*storagev1.StorageClass vsc map[string]*unstructured.Unstructured - driver testsuites.TestDriver + driver drivers.MockCSITestDriver provisioner string tp testParameters } @@ -155,12 +149,29 @@ var _ = utils.SIGDescribe("CSI mock volume", func() { EnableResizing: tp.enableResizing, EnableNodeExpansion: tp.enableNodeExpansion, EnableSnapshot: tp.enableSnapshot, - JavascriptHooks: tp.javascriptHooks, TokenRequests: tp.tokenRequests, RequiresRepublish: tp.requiresRepublish, FSGroupPolicy: tp.fsGroupPolicy, } + // At the moment, only tests which need hooks are + // using the embedded CSI mock driver. The rest run + // the driver inside the cluster although they could + // changed to use embedding merely by setting + // driverOpts.embedded to true. + // + // Not enabling it for all tests minimizes + // the risk that the introduction of embedded breaks + // some existings tests and avoids a dependency + // on port forwarding, which is important if some of + // these tests are supposed to become part of + // conformance testing (port forwarding isn't + // currently required). + if tp.hooks != nil { + driverOpts.Embedded = true + driverOpts.Hooks = *tp.hooks + } + // this just disable resizing on driver, keeping resizing on SC enabled. if tp.disableResizingOnDriver { driverOpts.EnableResizing = false @@ -188,12 +199,10 @@ var _ = utils.SIGDescribe("CSI mock volume", func() { createPod := func(ephemeral bool) (class *storagev1.StorageClass, claim *v1.PersistentVolumeClaim, pod *v1.Pod) { ginkgo.By("Creating pod") - var sc *storagev1.StorageClass - if dDriver, ok := m.driver.(testsuites.DynamicPVTestDriver); ok { - sc = dDriver.GetDynamicProvisionStorageClass(m.config, "") - } + sc := m.driver.GetDynamicProvisionStorageClass(m.config, "") scTest := testsuites.StorageClassTest{ Name: m.driver.GetDriverInfo().Name, + Timeouts: f.Timeouts, Provisioner: sc.Provisioner, Parameters: sc.Parameters, ClaimSize: "1Gi", @@ -236,10 +245,7 @@ var _ = utils.SIGDescribe("CSI mock volume", func() { createPodWithFSGroup := func(fsGroup *int64) (*storagev1.StorageClass, *v1.PersistentVolumeClaim, *v1.Pod) { ginkgo.By("Creating pod with fsGroup") nodeSelection := m.config.ClientNodeSelection - var sc *storagev1.StorageClass - if dDriver, ok := m.driver.(testsuites.DynamicPVTestDriver); ok { - sc = dDriver.GetDynamicProvisionStorageClass(m.config, "") - } + sc := m.driver.GetDynamicProvisionStorageClass(m.config, "") scTest := testsuites.StorageClassTest{ Name: m.driver.GetDriverInfo().Name, Provisioner: sc.Provisioner, @@ -295,7 +301,7 @@ var _ = utils.SIGDescribe("CSI mock volume", func() { for _, vsc := range m.vsc { ginkgo.By(fmt.Sprintf("Deleting volumesnapshotclass %s", vsc.GetName())) - m.config.Framework.DynamicClient.Resource(testsuites.SnapshotClassGVR).Delete(context.TODO(), vsc.GetName(), metav1.DeleteOptions{}) + m.config.Framework.DynamicClient.Resource(utils.SnapshotClassGVR).Delete(context.TODO(), vsc.GetName(), metav1.DeleteOptions{}) } ginkgo.By("Cleaning up resources") for _, cleanupFunc := range m.testCleanups { @@ -383,7 +389,7 @@ var _ = utils.SIGDescribe("CSI mock volume", func() { }.AsSelector().String() msg := "AttachVolume.Attach failed for volume" - err = e2eevents.WaitTimeoutForEvent(m.cs, pod.Namespace, eventSelector, msg, framework.PodStartTimeout) + err = e2eevents.WaitTimeoutForEvent(m.cs, pod.Namespace, eventSelector, msg, f.Timeouts.PodStart) if err != nil { podErr := e2epod.WaitTimeoutForPodRunningInNamespace(m.cs, pod.Name, pod.Namespace, 10*time.Second) framework.ExpectError(podErr, "Pod should not be in running status because attaching should failed") @@ -504,7 +510,7 @@ var _ = utils.SIGDescribe("CSI mock volume", func() { csiInlineVolumesEnabled := test.expectEphemeral if test.expectPodInfo { ginkgo.By("checking for CSIInlineVolumes feature") - csiInlineVolumesEnabled, err = testsuites.CSIInlineVolumesEnabled(m.cs, f.Namespace.Name) + csiInlineVolumesEnabled, err = testsuites.CSIInlineVolumesEnabled(m.cs, f.Timeouts, f.Namespace.Name) framework.ExpectNoError(err, "failed to test for CSIInlineVolumes") } @@ -513,7 +519,7 @@ var _ = utils.SIGDescribe("CSI mock volume", func() { framework.ExpectNoError(err, "while deleting") ginkgo.By("Checking CSI driver logs") - err = checkPodLogs(m.cs, m.config.DriverNamespace.Name, driverPodName, driverContainerName, pod, test.expectPodInfo, test.expectEphemeral, csiInlineVolumesEnabled, false, 1) + err = checkPodLogs(m.driver.GetCalls, pod, test.expectPodInfo, test.expectEphemeral, csiInlineVolumesEnabled, false, 1) framework.ExpectNoError(err) }) } @@ -726,19 +732,19 @@ var _ = utils.SIGDescribe("CSI mock volume", func() { }) ginkgo.Context("CSI NodeStage error cases [Slow]", func() { - // Global variable in all scripts (called before each test) - globalScript := `counter=0; console.log("globals loaded", OK, INVALIDARGUMENT)` trackedCalls := []string{ "NodeStageVolume", "NodeUnstageVolume", } tests := []struct { - name string - expectPodRunning bool - expectedCalls []csiCall - nodeStageScript string - nodeUnstageScript string + name string + expectPodRunning bool + expectedCalls []csiCall + + // Called for each NodeStateVolume calls, with counter incremented atomically before + // the invocation (i.e. first value will be 1). + nodeStageHook func(counter int64) error }{ { // This is already tested elsewhere, adding simple good case here to test the test framework. @@ -748,7 +754,6 @@ var _ = utils.SIGDescribe("CSI mock volume", func() { {expectedMethod: "NodeStageVolume", expectedError: codes.OK, deletePod: true}, {expectedMethod: "NodeUnstageVolume", expectedError: codes.OK}, }, - nodeStageScript: `OK;`, }, { // Kubelet should repeat NodeStage as long as the pod exists @@ -761,7 +766,12 @@ var _ = utils.SIGDescribe("CSI mock volume", func() { {expectedMethod: "NodeUnstageVolume", expectedError: codes.OK}, }, // Fail first 3 NodeStage requests, 4th succeeds - nodeStageScript: `console.log("Counter:", ++counter); if (counter < 4) { INVALIDARGUMENT; } else { OK; }`, + nodeStageHook: func(counter int64) error { + if counter < 4 { + return status.Error(codes.InvalidArgument, "fake error") + } + return nil + }, }, { // Kubelet should repeat NodeStage as long as the pod exists @@ -774,7 +784,12 @@ var _ = utils.SIGDescribe("CSI mock volume", func() { {expectedMethod: "NodeUnstageVolume", expectedError: codes.OK}, }, // Fail first 3 NodeStage requests, 4th succeeds - nodeStageScript: `console.log("Counter:", ++counter); if (counter < 4) { DEADLINEEXCEEDED; } else { OK; }`, + nodeStageHook: func(counter int64) error { + if counter < 4 { + return status.Error(codes.DeadlineExceeded, "fake error") + } + return nil + }, }, { // After NodeUnstage with ephemeral error, the driver may continue staging the volume. @@ -788,7 +803,9 @@ var _ = utils.SIGDescribe("CSI mock volume", func() { {expectedMethod: "NodeStageVolume", expectedError: codes.DeadlineExceeded, deletePod: true}, {expectedMethod: "NodeUnstageVolume", expectedError: codes.OK}, }, - nodeStageScript: `DEADLINEEXCEEDED;`, + nodeStageHook: func(counter int64) error { + return status.Error(codes.DeadlineExceeded, "fake error") + }, }, { // After NodeUnstage with final error, kubelet can be sure the volume is not staged. @@ -800,21 +817,23 @@ var _ = utils.SIGDescribe("CSI mock volume", func() { // This matches all repeated NodeStage calls with InvalidArgument error (due to exp. backoff). {expectedMethod: "NodeStageVolume", expectedError: codes.InvalidArgument, deletePod: true}, }, - nodeStageScript: `INVALIDARGUMENT;`, + // nodeStageScript: `INVALIDARGUMENT;`, + nodeStageHook: func(counter int64) error { + return status.Error(codes.InvalidArgument, "fake error") + }, }, } for _, t := range tests { test := t ginkgo.It(test.name, func() { - scripts := map[string]string{ - "globals": globalScript, - "nodeStageVolumeStart": test.nodeStageScript, - "nodeUnstageVolumeStart": test.nodeUnstageScript, + var hooks *drivers.Hooks + if test.nodeStageHook != nil { + hooks = createPreHook("NodeStageVolume", test.nodeStageHook) } init(testParameters{ - disableAttach: true, - registerDriver: true, - javascriptHooks: scripts, + disableAttach: true, + registerDriver: true, + hooks: hooks, }) defer cleanup() @@ -835,7 +854,7 @@ var _ = utils.SIGDescribe("CSI mock volume", func() { framework.Failf("timed out waiting for the CSI call that indicates that the pod can be deleted: %v", test.expectedCalls) } time.Sleep(1 * time.Second) - _, index, err := compareCSICalls(trackedCalls, test.expectedCalls, m.cs, m.config.DriverNamespace.Name, driverPodName, driverContainerName) + _, index, err := compareCSICalls(trackedCalls, test.expectedCalls, m.driver.GetCalls) framework.ExpectNoError(err, "while waiting for initial CSI calls") if index == 0 { // No CSI call received yet @@ -859,7 +878,7 @@ var _ = utils.SIGDescribe("CSI mock volume", func() { ginkgo.By("Waiting for all remaining expected CSI calls") err = wait.Poll(time.Second, csiUnstageWaitTimeout, func() (done bool, err error) { - _, index, err := compareCSICalls(trackedCalls, test.expectedCalls, m.cs, m.config.DriverNamespace.Name, driverPodName, driverContainerName) + _, index, err := compareCSICalls(trackedCalls, test.expectedCalls, m.driver.GetCalls) if err != nil { return true, err } @@ -908,9 +927,9 @@ var _ = utils.SIGDescribe("CSI mock volume", func() { createVolume := "CreateVolume" deleteVolume := "DeleteVolume" // publishVolume := "NodePublishVolume" - unpublishVolume := "NodeUnpublishVolume" + // unpublishVolume := "NodeUnpublishVolume" // stageVolume := "NodeStageVolume" - unstageVolume := "NodeUnstageVolume" + // unstageVolume := "NodeUnstageVolume" // These calls are assumed to occur in this order for // each test run. NodeStageVolume and @@ -920,12 +939,17 @@ var _ = utils.SIGDescribe("CSI mock volume", func() { // (https://github.com/kubernetes/kubernetes/issues/90250). // Therefore they are temporarily commented out until // that issue is resolved. + // + // NodeUnpublishVolume and NodeUnstageVolume are racing + // with DeleteVolume, so we cannot assume a deterministic + // order and have to ignore them + // (https://github.com/kubernetes/kubernetes/issues/94108). deterministicCalls := []string{ createVolume, // stageVolume, // publishVolume, - unpublishVolume, - unstageVolume, + // unpublishVolume, + // unstageVolume, deleteVolume, } @@ -945,11 +969,12 @@ var _ = utils.SIGDescribe("CSI mock volume", func() { } if test.resourceExhausted { - params.javascriptHooks = map[string]string{ - "globals": `counter=0; console.log("globals loaded", OK, INVALIDARGUMENT)`, - // Every second call returns RESOURCEEXHAUSTED, starting with the first one. - "createVolumeStart": `console.log("Counter:", ++counter); if (counter % 2) { RESOURCEEXHAUSTED; } else { OK; }`, - } + params.hooks = createPreHook("CreateVolume", func(counter int64) error { + if counter%2 != 0 { + return status.Error(codes.ResourceExhausted, "fake error") + } + return nil + }) } init(params) @@ -1005,9 +1030,9 @@ var _ = utils.SIGDescribe("CSI mock volume", func() { expected = append(expected, normal...) } - var calls []mockCSICall + var calls []drivers.MockCSICall err = wait.PollImmediateUntil(time.Second, func() (done bool, err error) { - c, index, err := compareCSICalls(deterministicCalls, expected, m.cs, m.config.DriverNamespace.Name, driverPodName, driverContainerName) + c, index, err := compareCSICalls(deterministicCalls, expected, m.driver.GetCalls) if err != nil { return true, fmt.Errorf("error waiting for expected CSI calls: %s", err) } @@ -1106,7 +1131,7 @@ var _ = utils.SIGDescribe("CSI mock volume", func() { }) // These tests *only* work on a cluster which has the CSIStorageCapacity feature enabled. - ginkgo.Context("CSIStorageCapacity [Feature:CSIStorageCapacity]", func() { + ginkgo.Context("CSIStorageCapacity", func() { var ( err error yes = true @@ -1163,7 +1188,7 @@ var _ = utils.SIGDescribe("CSI mock volume", func() { // before adding CSIStorageCapacity objects for it. for _, capacityStr := range test.capacities { capacityQuantity := resource.MustParse(capacityStr) - capacity := &storagev1alpha1.CSIStorageCapacity{ + capacity := &storagev1beta1.CSIStorageCapacity{ ObjectMeta: metav1.ObjectMeta{ GenerateName: "fake-capacity-", }, @@ -1172,10 +1197,10 @@ var _ = utils.SIGDescribe("CSI mock volume", func() { NodeTopology: &metav1.LabelSelector{}, Capacity: &capacityQuantity, } - createdCapacity, err := f.ClientSet.StorageV1alpha1().CSIStorageCapacities(f.Namespace.Name).Create(context.Background(), capacity, metav1.CreateOptions{}) + createdCapacity, err := f.ClientSet.StorageV1beta1().CSIStorageCapacities(f.Namespace.Name).Create(context.Background(), capacity, metav1.CreateOptions{}) framework.ExpectNoError(err, "create CSIStorageCapacity %+v", *capacity) m.testCleanups = append(m.testCleanups, func() { - f.ClientSet.StorageV1alpha1().CSIStorageCapacities(f.Namespace.Name).Delete(context.Background(), createdCapacity.Name, metav1.DeleteOptions{}) + f.ClientSet.StorageV1beta1().CSIStorageCapacities(f.Namespace.Name).Delete(context.Background(), createdCapacity.Name, metav1.DeleteOptions{}) }) } @@ -1187,7 +1212,7 @@ var _ = utils.SIGDescribe("CSI mock volume", func() { sc, _, pod := createPod(false /* persistent volume, late binding as specified above */) framework.ExpectEqual(sc.Name, scName, "pre-selected storage class name not used") - waitCtx, cancel := context.WithTimeout(context.Background(), podStartTimeout) + waitCtx, cancel := context.WithTimeout(context.Background(), f.Timeouts.PodStart) defer cancel() condition := anyOf( podRunning(waitCtx, f.ClientSet, pod.Name, pod.Namespace), @@ -1220,33 +1245,34 @@ var _ = utils.SIGDescribe("CSI mock volume", func() { }) ginkgo.Context("CSI Volume Snapshots [Feature:VolumeSnapshotDataSource]", func() { - // Global variable in all scripts (called before each test) - globalScript := `counter=0; console.log("globals loaded", OK, DEADLINEEXCEEDED)` tests := []struct { - name string - createVolumeScript string - createSnapshotScript string + name string + createSnapshotHook func(counter int64) error }{ { - name: "volumesnapshotcontent and pvc in Bound state with deletion timestamp set should not get deleted while snapshot finalizer exists", - createVolumeScript: `OK`, - createSnapshotScript: `console.log("Counter:", ++counter); if (counter < 8) { DEADLINEEXCEEDED; } else { OK; }`, + name: "volumesnapshotcontent and pvc in Bound state with deletion timestamp set should not get deleted while snapshot finalizer exists", + createSnapshotHook: func(counter int64) error { + if counter < 8 { + return status.Error(codes.DeadlineExceeded, "fake error") + } + return nil + }, }, } for _, test := range tests { + test := test ginkgo.It(test.name, func() { - scripts := map[string]string{ - "globals": globalScript, - "createVolumeStart": test.createVolumeScript, - "createSnapshotStart": test.createSnapshotScript, + var hooks *drivers.Hooks + if test.createSnapshotHook != nil { + hooks = createPreHook("CreateSnapshot", test.createSnapshotHook) } init(testParameters{ - disableAttach: true, - registerDriver: true, - enableSnapshot: true, - javascriptHooks: scripts, + disableAttach: true, + registerDriver: true, + enableSnapshot: true, + hooks: hooks, }) - sDriver, ok := m.driver.(testsuites.SnapshottableTestDriver) + sDriver, ok := m.driver.(storageframework.SnapshottableTestDriver) if !ok { e2eskipper.Skipf("mock driver %s does not support snapshots -- skipping", m.driver.GetDriverInfo().Name) @@ -1255,10 +1281,7 @@ var _ = utils.SIGDescribe("CSI mock volume", func() { defer cancel() defer cleanup() - var sc *storagev1.StorageClass - if dDriver, ok := m.driver.(testsuites.DynamicPVTestDriver); ok { - sc = dDriver.GetDynamicProvisionStorageClass(m.config, "") - } + sc := m.driver.GetDynamicProvisionStorageClass(m.config, "") ginkgo.By("Creating storage class") class, err := m.cs.StorageV1().StorageClasses().Create(context.TODO(), sc, metav1.CreateOptions{}) framework.ExpectNoError(err, "Failed to create class: %v", err) @@ -1271,7 +1294,8 @@ var _ = utils.SIGDescribe("CSI mock volume", func() { ginkgo.By("Creating snapshot") // TODO: Test VolumeSnapshots with Retain policy - snapshotClass, snapshot := testsuites.CreateSnapshot(sDriver, m.config, testpatterns.DynamicSnapshotDelete, claim.Name, claim.Namespace) + parameters := map[string]string{} + snapshotClass, snapshot := storageframework.CreateSnapshot(sDriver, m.config, storageframework.DynamicSnapshotDelete, claim.Name, claim.Namespace, f.Timeouts, parameters) framework.ExpectNoError(err, "failed to create snapshot") m.vsc[snapshotClass.GetName()] = snapshotClass volumeSnapshotName := snapshot.GetName() @@ -1299,53 +1323,55 @@ var _ = utils.SIGDescribe("CSI mock volume", func() { framework.ExpectNoError(err, "Failed to get claim: %v", err) } framework.Logf("PVC not found. Continuing to test VolumeSnapshotContent finalizer") - } - if claim != nil && claim.DeletionTimestamp == nil { - framework.Failf("Expected deletion timestamp to be set on PVC %s", claim.Name) + } else if claim.DeletionTimestamp == nil { + framework.Failf("Expected deletion timestamp to be set on PVC: %v", claim) } ginkgo.By(fmt.Sprintf("Get VolumeSnapshotContent bound to VolumeSnapshot %s", snapshot.GetName())) - snapshotContent := testsuites.GetSnapshotContentFromSnapshot(m.config.Framework.DynamicClient, snapshot) + snapshotContent := utils.GetSnapshotContentFromSnapshot(m.config.Framework.DynamicClient, snapshot) volumeSnapshotContentName := snapshotContent.GetName() ginkgo.By(fmt.Sprintf("Verify VolumeSnapshotContent %s contains finalizer %s", snapshot.GetName(), volumeSnapshotContentFinalizer)) - err = utils.WaitForGVRFinalizer(ctx, m.config.Framework.DynamicClient, testsuites.SnapshotContentGVR, volumeSnapshotContentName, "", volumeSnapshotContentFinalizer, 1*time.Millisecond, 1*time.Minute) + err = utils.WaitForGVRFinalizer(ctx, m.config.Framework.DynamicClient, utils.SnapshotContentGVR, volumeSnapshotContentName, "", volumeSnapshotContentFinalizer, 1*time.Millisecond, 1*time.Minute) framework.ExpectNoError(err) ginkgo.By(fmt.Sprintf("Delete VolumeSnapshotContent %s", snapshotContent.GetName())) - err = m.config.Framework.DynamicClient.Resource(testsuites.SnapshotContentGVR).Delete(ctx, snapshotContent.GetName(), metav1.DeleteOptions{}) + err = m.config.Framework.DynamicClient.Resource(utils.SnapshotContentGVR).Delete(ctx, snapshotContent.GetName(), metav1.DeleteOptions{}) framework.ExpectNoError(err, "Failed to delete snapshotcontent: %v", err) ginkgo.By("Get VolumeSnapshotContent from API server and verify deletion timestamp is set") - snapshotContent, err = m.config.Framework.DynamicClient.Resource(testsuites.SnapshotContentGVR).Get(context.TODO(), snapshotContent.GetName(), metav1.GetOptions{}) + snapshotContent, err = m.config.Framework.DynamicClient.Resource(utils.SnapshotContentGVR).Get(context.TODO(), snapshotContent.GetName(), metav1.GetOptions{}) framework.ExpectNoError(err) if snapshotContent.GetDeletionTimestamp() == nil { framework.Failf("Expected deletion timestamp to be set on snapshotcontent") } - if claim != nil { + // If the claim is non existent, the Get() call on the API server returns + // an non-nil claim object with all fields unset. + // Refer https://github.com/kubernetes/kubernetes/pull/99167#issuecomment-781670012 + if claim != nil && claim.Spec.VolumeName != "" { ginkgo.By(fmt.Sprintf("Wait for PV %s to be deleted", claim.Spec.VolumeName)) err = e2epv.WaitForPersistentVolumeDeleted(m.cs, claim.Spec.VolumeName, framework.Poll, 3*time.Minute) framework.ExpectNoError(err, fmt.Sprintf("failed to delete PV %s", claim.Spec.VolumeName)) } ginkgo.By(fmt.Sprintf("Verify VolumeSnapshot %s contains finalizer %s", snapshot.GetName(), volumeSnapshotBoundFinalizer)) - err = utils.WaitForGVRFinalizer(ctx, m.config.Framework.DynamicClient, testsuites.SnapshotGVR, volumeSnapshotName, f.Namespace.Name, volumeSnapshotBoundFinalizer, 1*time.Millisecond, 1*time.Minute) + err = utils.WaitForGVRFinalizer(ctx, m.config.Framework.DynamicClient, utils.SnapshotGVR, volumeSnapshotName, f.Namespace.Name, volumeSnapshotBoundFinalizer, 1*time.Millisecond, 1*time.Minute) framework.ExpectNoError(err) ginkgo.By("Delete VolumeSnapshot") - err = testsuites.DeleteAndWaitSnapshot(m.config.Framework.DynamicClient, f.Namespace.Name, volumeSnapshotName, framework.Poll, framework.SnapshotDeleteTimeout) + err = utils.DeleteAndWaitSnapshot(m.config.Framework.DynamicClient, f.Namespace.Name, volumeSnapshotName, framework.Poll, framework.SnapshotDeleteTimeout) framework.ExpectNoError(err, fmt.Sprintf("failed to delete VolumeSnapshot %s", volumeSnapshotName)) ginkgo.By(fmt.Sprintf("Wait for VolumeSnapshotContent %s to be deleted", volumeSnapshotContentName)) - err = utils.WaitForGVRDeletion(m.config.Framework.DynamicClient, testsuites.SnapshotContentGVR, volumeSnapshotContentName, framework.Poll, framework.SnapshotDeleteTimeout) + err = utils.WaitForGVRDeletion(m.config.Framework.DynamicClient, utils.SnapshotContentGVR, volumeSnapshotContentName, framework.Poll, framework.SnapshotDeleteTimeout) framework.ExpectNoError(err, fmt.Sprintf("failed to delete VolumeSnapshotContent %s", volumeSnapshotContentName)) }) } }) - ginkgo.Context("CSIServiceAccountToken [Feature:CSIServiceAccountToken]", func() { + ginkgo.Context("CSIServiceAccountToken", func() { var ( err error ) @@ -1401,7 +1427,7 @@ var _ = utils.SIGDescribe("CSI mock volume", func() { framework.ExpectNoError(err, "while deleting") ginkgo.By("Checking CSI driver logs") - err = checkPodLogs(m.cs, m.config.DriverNamespace.Name, driverPodName, driverContainerName, pod, false, false, false, test.deployCSIDriverObject && csiServiceAccountTokenEnabled, numNodePublishVolume) + err = checkPodLogs(m.driver.GetCalls, pod, false, false, false, test.deployCSIDriverObject && csiServiceAccountTokenEnabled, numNodePublishVolume) framework.ExpectNoError(err) }) } @@ -1461,19 +1487,19 @@ var _ = utils.SIGDescribe("CSI mock volume", func() { // Create the subdirectory to ensure that fsGroup propagates createDirectory := fmt.Sprintf("mkdir %s", dirName) - _, _, err = utils.PodExec(f, pod, createDirectory) + _, _, err = e2evolume.PodExec(f, pod, createDirectory) framework.ExpectNoError(err, "failed: creating the directory: %s", err) // Inject the contents onto the mount createFile := fmt.Sprintf("echo '%s' > '%s'; sync", "filecontents", fileName) - _, _, err = utils.PodExec(f, pod, createFile) + _, _, err = e2evolume.PodExec(f, pod, createFile) framework.ExpectNoError(err, "failed: writing the contents: %s", err) // Delete the created file. This step is mandatory, as the mock driver // won't clean up the contents automatically. defer func() { delete := fmt.Sprintf("rm -fr %s", dirName) - _, _, err = utils.PodExec(f, pod, delete) + _, _, err = e2evolume.PodExec(f, pod, delete) framework.ExpectNoError(err, "failed: deleting the directory: %s", err) }() @@ -1489,8 +1515,125 @@ var _ = utils.SIGDescribe("CSI mock volume", func() { }) } }) + + ginkgo.Context("CSI Volume Snapshots secrets [Feature:VolumeSnapshotDataSource]", func() { + + var ( + // CSISnapshotterSecretName is the name of the secret to be created + CSISnapshotterSecretName string = "snapshot-secret" + + // CSISnapshotterSecretNameAnnotation is the annotation key for the CSI snapshotter secret name in VolumeSnapshotClass.parameters + CSISnapshotterSecretNameAnnotation string = "csi.storage.k8s.io/snapshotter-secret-name" + + // CSISnapshotterSecretNamespaceAnnotation is the annotation key for the CSI snapshotter secret namespace in VolumeSnapshotClass.parameters + CSISnapshotterSecretNamespaceAnnotation string = "csi.storage.k8s.io/snapshotter-secret-namespace" + + // anotations holds the annotations object + annotations interface{} + ) + + tests := []struct { + name string + createSnapshotHook func(counter int64) error + }{ + { + // volume snapshot should be created using secrets successfully even if there is a failure in the first few attempts, + name: "volume snapshot create/delete with secrets", + // Fail the first 8 calls to create snapshot and succeed the 9th call. + createSnapshotHook: func(counter int64) error { + if counter < 8 { + return status.Error(codes.DeadlineExceeded, "fake error") + } + return nil + }, + }, + } + for _, test := range tests { + ginkgo.It(test.name, func() { + hooks := createPreHook("CreateSnapshot", test.createSnapshotHook) + init(testParameters{ + disableAttach: true, + registerDriver: true, + enableSnapshot: true, + hooks: hooks, + }) + + sDriver, ok := m.driver.(storageframework.SnapshottableTestDriver) + if !ok { + e2eskipper.Skipf("mock driver does not support snapshots -- skipping") + } + defer cleanup() + + var sc *storagev1.StorageClass + if dDriver, ok := m.driver.(storageframework.DynamicPVTestDriver); ok { + sc = dDriver.GetDynamicProvisionStorageClass(m.config, "") + } + ginkgo.By("Creating storage class") + class, err := m.cs.StorageV1().StorageClasses().Create(context.TODO(), sc, metav1.CreateOptions{}) + framework.ExpectNoError(err, "Failed to create storage class: %v", err) + m.sc[class.Name] = class + pvc := e2epv.MakePersistentVolumeClaim(e2epv.PersistentVolumeClaimConfig{ + Name: "snapshot-test-pvc", + StorageClassName: &(class.Name), + }, f.Namespace.Name) + + ginkgo.By(fmt.Sprintf("Creating PVC %s/%s", pvc.Namespace, pvc.Name)) + pvc, err = m.cs.CoreV1().PersistentVolumeClaims(f.Namespace.Name).Create(context.TODO(), pvc, metav1.CreateOptions{}) + framework.ExpectNoError(err, "Failed to create claim: %v", err) + + ginkgo.By("Wait for PVC to be Bound") + _, err = e2epv.WaitForPVClaimBoundPhase(m.cs, []*v1.PersistentVolumeClaim{pvc}, 1*time.Minute) + framework.ExpectNoError(err, "Failed to create claim: %v", err) + + ginkgo.By("Creating Secret") + secret := &v1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: f.Namespace.Name, + Name: CSISnapshotterSecretName, + }, + Data: map[string][]byte{ + "secret-data": []byte("secret-value-1"), + }, + } + + if secret, err := m.cs.CoreV1().Secrets(f.Namespace.Name).Create(context.TODO(), secret, metav1.CreateOptions{}); err != nil { + framework.Failf("unable to create test secret %s: %v", secret.Name, err) + } + + ginkgo.By("Creating snapshot with secrets") + parameters := map[string]string{ + CSISnapshotterSecretNameAnnotation: CSISnapshotterSecretName, + CSISnapshotterSecretNamespaceAnnotation: f.Namespace.Name, + } + + _, snapshot := storageframework.CreateSnapshot(sDriver, m.config, storageframework.DynamicSnapshotDelete, pvc.Name, pvc.Namespace, f.Timeouts, parameters) + framework.ExpectNoError(err, "failed to create snapshot") + snapshotcontent := utils.GetSnapshotContentFromSnapshot(m.config.Framework.DynamicClient, snapshot) + if annotations, ok = snapshotcontent.Object["metadata"].(map[string]interface{})["annotations"]; !ok { + framework.Failf("Unable to get volume snapshot content annotations") + } + + // checks if delete snapshot secrets annotation is applied to the VolumeSnapshotContent. + checkDeleteSnapshotSecrets(m.cs, annotations) + + // delete the snapshot and check if the snapshot is deleted. + deleteSnapshot(m.cs, m.config, snapshot) + }) + } + }) }) +func deleteSnapshot(cs clientset.Interface, config *storageframework.PerTestConfig, snapshot *unstructured.Unstructured) { + // delete the given snapshot + dc := config.Framework.DynamicClient + err := dc.Resource(utils.SnapshotGVR).Namespace(snapshot.GetNamespace()).Delete(context.TODO(), snapshot.GetName(), metav1.DeleteOptions{}) + framework.ExpectNoError(err) + + // check if the snapshot is deleted + _, err = dc.Resource(utils.SnapshotGVR).Get(context.TODO(), snapshot.GetName(), metav1.GetOptions{}) + framework.ExpectError(err) +} + // A lot of this code was copied from e2e/framework. It would be nicer // if it could be reused - see https://github.com/kubernetes/kubernetes/issues/92754 func podRunning(ctx context.Context, c clientset.Interface, podName, namespace string) wait.ConditionFunc { @@ -1755,7 +1898,7 @@ func startBusyBoxPodWithVolumeSource(cs clientset.Interface, volumeSource v1.Vol MountPath: "/mnt/test", }, }, - Command: e2evolume.GenerateScriptCmd("while true ; do sleep 2; done"), + Command: e2epod.GenerateScriptCmd("while true ; do sleep 2; done"), }, }, SecurityContext: &v1.PodSecurityContext{ @@ -1774,24 +1917,9 @@ func startBusyBoxPodWithVolumeSource(cs clientset.Interface, volumeSource v1.Vol return cs.CoreV1().Pods(ns).Create(context.TODO(), pod, metav1.CreateOptions{}) } -// Dummy structure that parses just volume_attributes and error code out of logged CSI call -type mockCSICall struct { - json string // full log entry - - Method string - Request struct { - VolumeContext map[string]string `json:"volume_context"` - } - FullError struct { - Code codes.Code `json:"code"` - Message string `json:"message"` - } - Error string -} - // checkPodLogs tests that NodePublish was called with expected volume_context and (for ephemeral inline volumes) // has the matching NodeUnpublish -func checkPodLogs(cs clientset.Interface, namespace, driverPodName, driverContainerName string, pod *v1.Pod, expectPodInfo, ephemeralVolume, csiInlineVolumesEnabled, csiServiceAccountTokenEnabled bool, expectedNumNodePublish int) error { +func checkPodLogs(getCalls func() ([]drivers.MockCSICall, error), pod *v1.Pod, expectPodInfo, ephemeralVolume, csiInlineVolumesEnabled, csiServiceAccountTokenEnabled bool, expectedNumNodePublish int) error { expectedAttributes := map[string]string{} if expectPodInfo { expectedAttributes["csi.storage.k8s.io/pod.name"] = pod.Name @@ -1813,10 +1941,11 @@ func checkPodLogs(cs clientset.Interface, namespace, driverPodName, driverContai foundAttributes := sets.NewString() numNodePublishVolume := 0 numNodeUnpublishVolume := 0 - calls, err := parseMockLogs(cs, namespace, driverPodName, driverContainerName) + calls, err := getCalls() if err != nil { return err } + for _, call := range calls { switch call.Method { case "NodePublishVolume": @@ -1849,39 +1978,6 @@ func checkPodLogs(cs clientset.Interface, namespace, driverPodName, driverContai return nil } -func parseMockLogs(cs clientset.Interface, namespace, driverPodName, driverContainerName string) ([]mockCSICall, error) { - // Load logs of driver pod - log, err := e2epod.GetPodLogs(cs, namespace, driverPodName, driverContainerName) - if err != nil { - return nil, fmt.Errorf("could not load CSI driver logs: %s", err) - } - - logLines := strings.Split(log, "\n") - var calls []mockCSICall - for _, line := range logLines { - index := strings.Index(line, grpcCallPrefix) - if index == -1 { - continue - } - line = line[index+len(grpcCallPrefix):] - call := mockCSICall{ - json: string(line), - } - err := json.Unmarshal([]byte(line), &call) - if err != nil { - framework.Logf("Could not parse CSI driver log line %q: %s", line, err) - continue - } - - // Trim gRPC service name, i.e. "/csi.v1.Identity/Probe" -> "Probe" - methodParts := strings.Split(call.Method, "/") - call.Method = methodParts[len(methodParts)-1] - - calls = append(calls, call) - } - return calls, nil -} - // compareCSICalls compares expectedCalls with logs of the mock driver. // It returns index of the first expectedCall that was *not* received // yet or error when calls do not match. @@ -1890,8 +1986,8 @@ func parseMockLogs(cs clientset.Interface, namespace, driverPodName, driverConta // // Only permanent errors are returned. Other errors are logged and no // calls are returned. The caller is expected to retry. -func compareCSICalls(trackedCalls []string, expectedCallSequence []csiCall, cs clientset.Interface, namespace, driverPodName, driverContainerName string) ([]mockCSICall, int, error) { - allCalls, err := parseMockLogs(cs, namespace, driverPodName, driverContainerName) +func compareCSICalls(trackedCalls []string, expectedCallSequence []csiCall, getCalls func() ([]drivers.MockCSICall, error)) ([]drivers.MockCSICall, int, error) { + allCalls, err := getCalls() if err != nil { framework.Logf("intermittent (?) log retrieval error, proceeding without output: %v", err) return nil, 0, nil @@ -1899,8 +1995,8 @@ func compareCSICalls(trackedCalls []string, expectedCallSequence []csiCall, cs c // Remove all repeated and ignored calls tracked := sets.NewString(trackedCalls...) - var calls []mockCSICall - var last mockCSICall + var calls []drivers.MockCSICall + var last drivers.MockCSICall for _, c := range allCalls { if !tracked.Has(c.Method) { continue @@ -1987,3 +2083,57 @@ func getVolumeLimitFromCSINode(csiNode *storagev1.CSINode, driverName string) in } return 0 } + +// checkDeleteSnapshotSecrets checks if delete snapshot secrets annotation is applied to the VolumeSnapshotContent. +func checkDeleteSnapshotSecrets(cs clientset.Interface, annotations interface{}) error { + ginkgo.By("checking if delete snapshot secrets annotation is applied to the VolumeSnapshotContent") + + var ( + annDeletionSecretName string + annDeletionSecretNamespace string + ok bool + err error + + // CSISnapshotterDeleteSecretNameAnnotation is the annotation key for the CSI snapshotter delete secret name in VolumeSnapshotClass.parameters + CSISnapshotterDeleteSecretNameAnnotation string = "snapshot.storage.kubernetes.io/deletion-secret-name" + + // CSISnapshotterDeleteSecretNamespaceAnnotation is the annotation key for the CSI snapshotter delete secret namespace in VolumeSnapshotClass.parameters + CSISnapshotterDeleteSecretNamespaceAnnotation string = "snapshot.storage.kubernetes.io/deletion-secret-namespace" + ) + + annotationsObj, ok := annotations.(map[string]interface{}) + if !ok { + framework.Failf("failed to get annotations from annotations object") + } + + if annDeletionSecretName, ok = annotationsObj[CSISnapshotterDeleteSecretNameAnnotation].(string); !ok { + framework.Failf("unable to get secret annotation name") + } + if annDeletionSecretNamespace, ok = annotationsObj[CSISnapshotterDeleteSecretNamespaceAnnotation].(string); !ok { + framework.Failf("unable to get secret annotation namespace") + } + + // verify if secrets exists + if _, err = cs.CoreV1().Secrets(annDeletionSecretNamespace).Get(context.TODO(), annDeletionSecretName, metav1.GetOptions{}); err != nil { + framework.Failf("unable to get test secret %s: %v", annDeletionSecretName, err) + } + + return err +} + +// createPreHook counts invocations of a certain method (identified by a substring in the full gRPC method name). +func createPreHook(method string, callback func(counter int64) error) *drivers.Hooks { + var counter int64 + + return &drivers.Hooks{ + Pre: func() func(ctx context.Context, fullMethod string, request interface{}) (reply interface{}, err error) { + return func(ctx context.Context, fullMethod string, request interface{}) (reply interface{}, err error) { + if strings.Contains(fullMethod, method) { + counter := atomic.AddInt64(&counter, 1) + return nil, callback(counter) + } + return nil, nil + } + }(), + } +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/csi_volumes.go b/vendor/k8s.io/kubernetes/test/e2e/storage/csi_volumes.go index b2030b4069f2..33cd4f897aad 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/csi_volumes.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/csi_volumes.go @@ -18,6 +18,7 @@ package storage import ( "k8s.io/kubernetes/test/e2e/storage/drivers" + storageframework "k8s.io/kubernetes/test/e2e/storage/framework" "k8s.io/kubernetes/test/e2e/storage/testsuites" "k8s.io/kubernetes/test/e2e/storage/utils" @@ -25,7 +26,7 @@ import ( ) // List of testDrivers to be executed in below loop -var csiTestDrivers = []func() testsuites.TestDriver{ +var csiTestDrivers = []func() storageframework.TestDriver{ drivers.InitHostPathCSIDriver, drivers.InitGcePDCSIDriver, // Don't run tests with mock driver (drivers.InitMockCSIDriver), it does not provide persistent storage. @@ -36,8 +37,8 @@ var _ = utils.SIGDescribe("CSI Volumes", func() { for _, initDriver := range csiTestDrivers { curDriver := initDriver() - ginkgo.Context(testsuites.GetDriverNameWithFeatureTags(curDriver), func() { - testsuites.DefineTestSuite(curDriver, testsuites.CSISuites) + ginkgo.Context(storageframework.GetDriverNameWithFeatureTags(curDriver), func() { + storageframework.DefineTestSuites(curDriver, testsuites.CSISuites) }) } }) diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/drivers/BUILD b/vendor/k8s.io/kubernetes/test/e2e/storage/drivers/BUILD deleted file mode 100644 index 56a87c5d4905..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/drivers/BUILD +++ /dev/null @@ -1,54 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "csi.go", - "csi_objects.go", - "in_tree.go", - ], - importpath = "k8s.io/kubernetes/test/e2e/storage/drivers", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/rbac/v1:go_default_library", - "//staging/src/k8s.io/api/storage/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/serviceaccount:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//test/e2e/framework:go_default_library", - "//test/e2e/framework/auth:go_default_library", - "//test/e2e/framework/node:go_default_library", - "//test/e2e/framework/pod:go_default_library", - "//test/e2e/framework/pv:go_default_library", - "//test/e2e/framework/skipper:go_default_library", - "//test/e2e/framework/volume:go_default_library", - "//test/e2e/storage/testpatterns:go_default_library", - "//test/e2e/storage/testsuites:go_default_library", - "//test/e2e/storage/utils:go_default_library", - "//test/e2e/storage/vsphere:go_default_library", - "//test/utils/image:go_default_library", - "//vendor/github.com/onsi/ginkgo:go_default_library", - "//vendor/gopkg.in/yaml.v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/drivers/csi-test/driver/driver.go b/vendor/k8s.io/kubernetes/test/e2e/storage/drivers/csi-test/driver/driver.go new file mode 100644 index 000000000000..ceddd7174ecf --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/drivers/csi-test/driver/driver.go @@ -0,0 +1,318 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +//go:generate mockgen -package=driver -destination=driver.mock.go github.com/container-storage-interface/spec/lib/go/csi IdentityServer,ControllerServer,NodeServer + +package driver + +import ( + "context" + "encoding/json" + "errors" + "net" + "sync" + + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + "k8s.io/klog/v2" + + "github.com/container-storage-interface/spec/lib/go/csi" + "google.golang.org/grpc" +) + +var ( + // ErrNoCredentials is the error when a secret is enabled but not passed in the request. + ErrNoCredentials = errors.New("secret must be provided") + // ErrAuthFailed is the error when the secret is incorrect. + ErrAuthFailed = errors.New("authentication failed") +) + +// CSIDriverServers is a unified driver component with both Controller and Node +// services. +type CSIDriverServers struct { + Controller csi.ControllerServer + Identity csi.IdentityServer + Node csi.NodeServer +} + +// This is the key name in all the CSI secret objects. +const secretField = "secretKey" + +// CSICreds is a driver specific secret type. Drivers can have a key-val pair of +// secrets. This mock driver has a single string secret with secretField as the +// key. +type CSICreds struct { + CreateVolumeSecret string + DeleteVolumeSecret string + ControllerPublishVolumeSecret string + ControllerUnpublishVolumeSecret string + NodeStageVolumeSecret string + NodePublishVolumeSecret string + CreateSnapshotSecret string + DeleteSnapshotSecret string + ControllerValidateVolumeCapabilitiesSecret string +} + +type CSIDriver struct { + listener net.Listener + server *grpc.Server + servers *CSIDriverServers + wg sync.WaitGroup + running bool + lock sync.Mutex + creds *CSICreds + logGRPC LogGRPC +} + +type LogGRPC func(method string, request, reply interface{}, err error) + +func NewCSIDriver(servers *CSIDriverServers) *CSIDriver { + return &CSIDriver{ + servers: servers, + } +} + +func (c *CSIDriver) goServe(started chan<- bool) { + goServe(c.server, &c.wg, c.listener, started) +} + +func (c *CSIDriver) Address() string { + return c.listener.Addr().String() +} + +// Start runs a gRPC server with all enabled services. If an interceptor +// is give, then it will be used. Otherwise, an interceptor which +// handles simple credential checks and logs gRPC calls in JSON format +// will be used. +func (c *CSIDriver) Start(l net.Listener, interceptor grpc.UnaryServerInterceptor) error { + c.lock.Lock() + defer c.lock.Unlock() + + // Set listener + c.listener = l + + // Create a new grpc server + if interceptor == nil { + interceptor = c.callInterceptor + } + c.server = grpc.NewServer(grpc.UnaryInterceptor(interceptor)) + + // Register Mock servers + if c.servers.Controller != nil { + csi.RegisterControllerServer(c.server, c.servers.Controller) + } + if c.servers.Identity != nil { + csi.RegisterIdentityServer(c.server, c.servers.Identity) + } + if c.servers.Node != nil { + csi.RegisterNodeServer(c.server, c.servers.Node) + } + + // Start listening for requests + waitForServer := make(chan bool) + c.goServe(waitForServer) + <-waitForServer + c.running = true + return nil +} + +func (c *CSIDriver) Stop() { + stop(&c.lock, &c.wg, c.server, c.running) +} + +func (c *CSIDriver) Close() { + c.server.Stop() +} + +func (c *CSIDriver) IsRunning() bool { + c.lock.Lock() + defer c.lock.Unlock() + + return c.running +} + +// SetDefaultCreds sets the default secrets for CSI creds. +func (c *CSIDriver) SetDefaultCreds() { + setDefaultCreds(c.creds) +} + +// goServe starts a grpc server. +func goServe(server *grpc.Server, wg *sync.WaitGroup, listener net.Listener, started chan<- bool) { + wg.Add(1) + go func() { + defer wg.Done() + started <- true + err := server.Serve(listener) + if err != nil { + panic(err.Error()) + } + }() +} + +// stop stops a grpc server. +func stop(lock *sync.Mutex, wg *sync.WaitGroup, server *grpc.Server, running bool) { + lock.Lock() + defer lock.Unlock() + + if !running { + return + } + + server.Stop() + wg.Wait() +} + +// setDefaultCreds sets the default credentials, given a CSICreds instance. +func setDefaultCreds(creds *CSICreds) { + *creds = CSICreds{ + CreateVolumeSecret: "secretval1", + DeleteVolumeSecret: "secretval2", + ControllerPublishVolumeSecret: "secretval3", + ControllerUnpublishVolumeSecret: "secretval4", + NodeStageVolumeSecret: "secretval5", + NodePublishVolumeSecret: "secretval6", + CreateSnapshotSecret: "secretval7", + DeleteSnapshotSecret: "secretval8", + ControllerValidateVolumeCapabilitiesSecret: "secretval9", + } +} + +func (c *CSIDriver) callInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) { + err := authInterceptor(c.creds, req) + if err != nil { + logGRPC(info.FullMethod, req, nil, err) + return nil, err + } + rsp, err := handler(ctx, req) + logGRPC(info.FullMethod, req, rsp, err) + if c.logGRPC != nil { + c.logGRPC(info.FullMethod, req, rsp, err) + } + return rsp, err +} + +func authInterceptor(creds *CSICreds, req interface{}) error { + if creds != nil { + authenticated, authErr := isAuthenticated(req, creds) + if !authenticated { + if authErr == ErrNoCredentials { + return status.Error(codes.InvalidArgument, authErr.Error()) + } + if authErr == ErrAuthFailed { + return status.Error(codes.Unauthenticated, authErr.Error()) + } + } + } + return nil +} + +func logGRPC(method string, request, reply interface{}, err error) { + // Log JSON with the request and response for easier parsing + logMessage := struct { + Method string + Request interface{} + Response interface{} + // Error as string, for backward compatibility. + // "" on no error. + Error string + // Full error dump, to be able to parse out full gRPC error code and message separately in a test. + FullError error + }{ + Method: method, + Request: request, + Response: reply, + FullError: err, + } + + if err != nil { + logMessage.Error = err.Error() + } + + msg, _ := json.Marshal(logMessage) + klog.V(3).Infof("gRPCCall: %s\n", msg) +} + +func isAuthenticated(req interface{}, creds *CSICreds) (bool, error) { + switch r := req.(type) { + case *csi.CreateVolumeRequest: + return authenticateCreateVolume(r, creds) + case *csi.DeleteVolumeRequest: + return authenticateDeleteVolume(r, creds) + case *csi.ControllerPublishVolumeRequest: + return authenticateControllerPublishVolume(r, creds) + case *csi.ControllerUnpublishVolumeRequest: + return authenticateControllerUnpublishVolume(r, creds) + case *csi.NodeStageVolumeRequest: + return authenticateNodeStageVolume(r, creds) + case *csi.NodePublishVolumeRequest: + return authenticateNodePublishVolume(r, creds) + case *csi.CreateSnapshotRequest: + return authenticateCreateSnapshot(r, creds) + case *csi.DeleteSnapshotRequest: + return authenticateDeleteSnapshot(r, creds) + case *csi.ValidateVolumeCapabilitiesRequest: + return authenticateControllerValidateVolumeCapabilities(r, creds) + default: + return true, nil + } +} + +func authenticateCreateVolume(req *csi.CreateVolumeRequest, creds *CSICreds) (bool, error) { + return credsCheck(req.GetSecrets(), creds.CreateVolumeSecret) +} + +func authenticateDeleteVolume(req *csi.DeleteVolumeRequest, creds *CSICreds) (bool, error) { + return credsCheck(req.GetSecrets(), creds.DeleteVolumeSecret) +} + +func authenticateControllerPublishVolume(req *csi.ControllerPublishVolumeRequest, creds *CSICreds) (bool, error) { + return credsCheck(req.GetSecrets(), creds.ControllerPublishVolumeSecret) +} + +func authenticateControllerUnpublishVolume(req *csi.ControllerUnpublishVolumeRequest, creds *CSICreds) (bool, error) { + return credsCheck(req.GetSecrets(), creds.ControllerUnpublishVolumeSecret) +} + +func authenticateNodeStageVolume(req *csi.NodeStageVolumeRequest, creds *CSICreds) (bool, error) { + return credsCheck(req.GetSecrets(), creds.NodeStageVolumeSecret) +} + +func authenticateNodePublishVolume(req *csi.NodePublishVolumeRequest, creds *CSICreds) (bool, error) { + return credsCheck(req.GetSecrets(), creds.NodePublishVolumeSecret) +} + +func authenticateCreateSnapshot(req *csi.CreateSnapshotRequest, creds *CSICreds) (bool, error) { + return credsCheck(req.GetSecrets(), creds.CreateSnapshotSecret) +} + +func authenticateDeleteSnapshot(req *csi.DeleteSnapshotRequest, creds *CSICreds) (bool, error) { + return credsCheck(req.GetSecrets(), creds.DeleteSnapshotSecret) +} + +func authenticateControllerValidateVolumeCapabilities(req *csi.ValidateVolumeCapabilitiesRequest, creds *CSICreds) (bool, error) { + return credsCheck(req.GetSecrets(), creds.ControllerValidateVolumeCapabilitiesSecret) +} + +func credsCheck(secrets map[string]string, secretVal string) (bool, error) { + if len(secrets) == 0 { + return false, ErrNoCredentials + } + + if secrets[secretField] != secretVal { + return false, ErrAuthFailed + } + return true, nil +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/drivers/csi-test/driver/driver.mock.go b/vendor/k8s.io/kubernetes/test/e2e/storage/drivers/csi-test/driver/driver.mock.go new file mode 100644 index 000000000000..a4800c32fe4c --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/drivers/csi-test/driver/driver.mock.go @@ -0,0 +1,407 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Package driver is a generated GoMock package, with required copyright +// header added manually. +package driver + +import ( + context "context" + reflect "reflect" + + csi "github.com/container-storage-interface/spec/lib/go/csi" + gomock "github.com/golang/mock/gomock" +) + +// MockIdentityServer is a mock of IdentityServer interface +type MockIdentityServer struct { + ctrl *gomock.Controller + recorder *MockIdentityServerMockRecorder +} + +// MockIdentityServerMockRecorder is the mock recorder for MockIdentityServer +type MockIdentityServerMockRecorder struct { + mock *MockIdentityServer +} + +// NewMockIdentityServer creates a new mock instance +func NewMockIdentityServer(ctrl *gomock.Controller) *MockIdentityServer { + mock := &MockIdentityServer{ctrl: ctrl} + mock.recorder = &MockIdentityServerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockIdentityServer) EXPECT() *MockIdentityServerMockRecorder { + return m.recorder +} + +// GetPluginCapabilities mocks base method +func (m *MockIdentityServer) GetPluginCapabilities(arg0 context.Context, arg1 *csi.GetPluginCapabilitiesRequest) (*csi.GetPluginCapabilitiesResponse, error) { + ret := m.ctrl.Call(m, "GetPluginCapabilities", arg0, arg1) + ret0, _ := ret[0].(*csi.GetPluginCapabilitiesResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetPluginCapabilities indicates an expected call of GetPluginCapabilities +func (mr *MockIdentityServerMockRecorder) GetPluginCapabilities(arg0, arg1 interface{}) *gomock.Call { + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetPluginCapabilities", reflect.TypeOf((*MockIdentityServer)(nil).GetPluginCapabilities), arg0, arg1) +} + +// GetPluginInfo mocks base method +func (m *MockIdentityServer) GetPluginInfo(arg0 context.Context, arg1 *csi.GetPluginInfoRequest) (*csi.GetPluginInfoResponse, error) { + ret := m.ctrl.Call(m, "GetPluginInfo", arg0, arg1) + ret0, _ := ret[0].(*csi.GetPluginInfoResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetPluginInfo indicates an expected call of GetPluginInfo +func (mr *MockIdentityServerMockRecorder) GetPluginInfo(arg0, arg1 interface{}) *gomock.Call { + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetPluginInfo", reflect.TypeOf((*MockIdentityServer)(nil).GetPluginInfo), arg0, arg1) +} + +// Probe mocks base method +func (m *MockIdentityServer) Probe(arg0 context.Context, arg1 *csi.ProbeRequest) (*csi.ProbeResponse, error) { + ret := m.ctrl.Call(m, "Probe", arg0, arg1) + ret0, _ := ret[0].(*csi.ProbeResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Probe indicates an expected call of Probe +func (mr *MockIdentityServerMockRecorder) Probe(arg0, arg1 interface{}) *gomock.Call { + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Probe", reflect.TypeOf((*MockIdentityServer)(nil).Probe), arg0, arg1) +} + +// MockControllerServer is a mock of ControllerServer interface +type MockControllerServer struct { + ctrl *gomock.Controller + recorder *MockControllerServerMockRecorder +} + +// MockControllerServerMockRecorder is the mock recorder for MockControllerServer +type MockControllerServerMockRecorder struct { + mock *MockControllerServer +} + +// NewMockControllerServer creates a new mock instance +func NewMockControllerServer(ctrl *gomock.Controller) *MockControllerServer { + mock := &MockControllerServer{ctrl: ctrl} + mock.recorder = &MockControllerServerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockControllerServer) EXPECT() *MockControllerServerMockRecorder { + return m.recorder +} + +// ControllerExpandVolume mocks base method +func (m *MockControllerServer) ControllerExpandVolume(arg0 context.Context, arg1 *csi.ControllerExpandVolumeRequest) (*csi.ControllerExpandVolumeResponse, error) { + ret := m.ctrl.Call(m, "ControllerExpandVolume", arg0, arg1) + ret0, _ := ret[0].(*csi.ControllerExpandVolumeResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ControllerExpandVolume indicates an expected call of ControllerExpandVolume +func (mr *MockControllerServerMockRecorder) ControllerExpandVolume(arg0, arg1 interface{}) *gomock.Call { + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ControllerExpandVolume", reflect.TypeOf((*MockControllerServer)(nil).ControllerExpandVolume), arg0, arg1) +} + +// ControllerGetCapabilities mocks base method +func (m *MockControllerServer) ControllerGetCapabilities(arg0 context.Context, arg1 *csi.ControllerGetCapabilitiesRequest) (*csi.ControllerGetCapabilitiesResponse, error) { + ret := m.ctrl.Call(m, "ControllerGetCapabilities", arg0, arg1) + ret0, _ := ret[0].(*csi.ControllerGetCapabilitiesResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ControllerGetCapabilities indicates an expected call of ControllerGetCapabilities +func (mr *MockControllerServerMockRecorder) ControllerGetCapabilities(arg0, arg1 interface{}) *gomock.Call { + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ControllerGetCapabilities", reflect.TypeOf((*MockControllerServer)(nil).ControllerGetCapabilities), arg0, arg1) +} + +// ControllerPublishVolume mocks base method +func (m *MockControllerServer) ControllerPublishVolume(arg0 context.Context, arg1 *csi.ControllerPublishVolumeRequest) (*csi.ControllerPublishVolumeResponse, error) { + ret := m.ctrl.Call(m, "ControllerPublishVolume", arg0, arg1) + ret0, _ := ret[0].(*csi.ControllerPublishVolumeResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ControllerPublishVolume indicates an expected call of ControllerPublishVolume +func (mr *MockControllerServerMockRecorder) ControllerPublishVolume(arg0, arg1 interface{}) *gomock.Call { + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ControllerPublishVolume", reflect.TypeOf((*MockControllerServer)(nil).ControllerPublishVolume), arg0, arg1) +} + +// ControllerUnpublishVolume mocks base method +func (m *MockControllerServer) ControllerUnpublishVolume(arg0 context.Context, arg1 *csi.ControllerUnpublishVolumeRequest) (*csi.ControllerUnpublishVolumeResponse, error) { + ret := m.ctrl.Call(m, "ControllerUnpublishVolume", arg0, arg1) + ret0, _ := ret[0].(*csi.ControllerUnpublishVolumeResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ControllerUnpublishVolume indicates an expected call of ControllerUnpublishVolume +func (mr *MockControllerServerMockRecorder) ControllerUnpublishVolume(arg0, arg1 interface{}) *gomock.Call { + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ControllerUnpublishVolume", reflect.TypeOf((*MockControllerServer)(nil).ControllerUnpublishVolume), arg0, arg1) +} + +// CreateSnapshot mocks base method +func (m *MockControllerServer) CreateSnapshot(arg0 context.Context, arg1 *csi.CreateSnapshotRequest) (*csi.CreateSnapshotResponse, error) { + ret := m.ctrl.Call(m, "CreateSnapshot", arg0, arg1) + ret0, _ := ret[0].(*csi.CreateSnapshotResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CreateSnapshot indicates an expected call of CreateSnapshot +func (mr *MockControllerServerMockRecorder) CreateSnapshot(arg0, arg1 interface{}) *gomock.Call { + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateSnapshot", reflect.TypeOf((*MockControllerServer)(nil).CreateSnapshot), arg0, arg1) +} + +// CreateVolume mocks base method +func (m *MockControllerServer) CreateVolume(arg0 context.Context, arg1 *csi.CreateVolumeRequest) (*csi.CreateVolumeResponse, error) { + ret := m.ctrl.Call(m, "CreateVolume", arg0, arg1) + ret0, _ := ret[0].(*csi.CreateVolumeResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CreateVolume indicates an expected call of CreateVolume +func (mr *MockControllerServerMockRecorder) CreateVolume(arg0, arg1 interface{}) *gomock.Call { + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateVolume", reflect.TypeOf((*MockControllerServer)(nil).CreateVolume), arg0, arg1) +} + +// DeleteSnapshot mocks base method +func (m *MockControllerServer) DeleteSnapshot(arg0 context.Context, arg1 *csi.DeleteSnapshotRequest) (*csi.DeleteSnapshotResponse, error) { + ret := m.ctrl.Call(m, "DeleteSnapshot", arg0, arg1) + ret0, _ := ret[0].(*csi.DeleteSnapshotResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DeleteSnapshot indicates an expected call of DeleteSnapshot +func (mr *MockControllerServerMockRecorder) DeleteSnapshot(arg0, arg1 interface{}) *gomock.Call { + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteSnapshot", reflect.TypeOf((*MockControllerServer)(nil).DeleteSnapshot), arg0, arg1) +} + +// DeleteVolume mocks base method +func (m *MockControllerServer) DeleteVolume(arg0 context.Context, arg1 *csi.DeleteVolumeRequest) (*csi.DeleteVolumeResponse, error) { + ret := m.ctrl.Call(m, "DeleteVolume", arg0, arg1) + ret0, _ := ret[0].(*csi.DeleteVolumeResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DeleteVolume indicates an expected call of DeleteVolume +func (mr *MockControllerServerMockRecorder) DeleteVolume(arg0, arg1 interface{}) *gomock.Call { + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteVolume", reflect.TypeOf((*MockControllerServer)(nil).DeleteVolume), arg0, arg1) +} + +// GetCapacity mocks base method +func (m *MockControllerServer) GetCapacity(arg0 context.Context, arg1 *csi.GetCapacityRequest) (*csi.GetCapacityResponse, error) { + ret := m.ctrl.Call(m, "GetCapacity", arg0, arg1) + ret0, _ := ret[0].(*csi.GetCapacityResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetCapacity indicates an expected call of GetCapacity +func (mr *MockControllerServerMockRecorder) GetCapacity(arg0, arg1 interface{}) *gomock.Call { + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetCapacity", reflect.TypeOf((*MockControllerServer)(nil).GetCapacity), arg0, arg1) +} + +// ListSnapshots mocks base method +func (m *MockControllerServer) ListSnapshots(arg0 context.Context, arg1 *csi.ListSnapshotsRequest) (*csi.ListSnapshotsResponse, error) { + ret := m.ctrl.Call(m, "ListSnapshots", arg0, arg1) + ret0, _ := ret[0].(*csi.ListSnapshotsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListSnapshots indicates an expected call of ListSnapshots +func (mr *MockControllerServerMockRecorder) ListSnapshots(arg0, arg1 interface{}) *gomock.Call { + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListSnapshots", reflect.TypeOf((*MockControllerServer)(nil).ListSnapshots), arg0, arg1) +} + +// ListVolumes mocks base method +func (m *MockControllerServer) ListVolumes(arg0 context.Context, arg1 *csi.ListVolumesRequest) (*csi.ListVolumesResponse, error) { + ret := m.ctrl.Call(m, "ListVolumes", arg0, arg1) + ret0, _ := ret[0].(*csi.ListVolumesResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +func (m *MockControllerServer) ControllerGetVolume(arg0 context.Context, arg1 *csi.ControllerGetVolumeRequest) (*csi.ControllerGetVolumeResponse, error) { + ret := m.ctrl.Call(m, "ControllerGetVolume", arg0, arg1) + ret0, _ := ret[0].(*csi.ControllerGetVolumeResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ControllerGetVolume indicates an expected call of ControllerGetVolume +func (mr *MockControllerServerMockRecorder) ControllerGetVolume(arg0, arg1 interface{}) *gomock.Call { + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ControllerGetVolume", reflect.TypeOf((*MockControllerServer)(nil).ControllerGetVolume), arg0, arg1) +} + +// ListVolumes indicates an expected call of ListVolumes +func (mr *MockControllerServerMockRecorder) ListVolumes(arg0, arg1 interface{}) *gomock.Call { + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListVolumes", reflect.TypeOf((*MockControllerServer)(nil).ListVolumes), arg0, arg1) +} + +// ValidateVolumeCapabilities mocks base method +func (m *MockControllerServer) ValidateVolumeCapabilities(arg0 context.Context, arg1 *csi.ValidateVolumeCapabilitiesRequest) (*csi.ValidateVolumeCapabilitiesResponse, error) { + ret := m.ctrl.Call(m, "ValidateVolumeCapabilities", arg0, arg1) + ret0, _ := ret[0].(*csi.ValidateVolumeCapabilitiesResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ValidateVolumeCapabilities indicates an expected call of ValidateVolumeCapabilities +func (mr *MockControllerServerMockRecorder) ValidateVolumeCapabilities(arg0, arg1 interface{}) *gomock.Call { + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ValidateVolumeCapabilities", reflect.TypeOf((*MockControllerServer)(nil).ValidateVolumeCapabilities), arg0, arg1) +} + +// MockNodeServer is a mock of NodeServer interface +type MockNodeServer struct { + ctrl *gomock.Controller + recorder *MockNodeServerMockRecorder +} + +// MockNodeServerMockRecorder is the mock recorder for MockNodeServer +type MockNodeServerMockRecorder struct { + mock *MockNodeServer +} + +// NewMockNodeServer creates a new mock instance +func NewMockNodeServer(ctrl *gomock.Controller) *MockNodeServer { + mock := &MockNodeServer{ctrl: ctrl} + mock.recorder = &MockNodeServerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockNodeServer) EXPECT() *MockNodeServerMockRecorder { + return m.recorder +} + +// NodeExpandVolume mocks base method +func (m *MockNodeServer) NodeExpandVolume(arg0 context.Context, arg1 *csi.NodeExpandVolumeRequest) (*csi.NodeExpandVolumeResponse, error) { + ret := m.ctrl.Call(m, "NodeExpandVolume", arg0, arg1) + ret0, _ := ret[0].(*csi.NodeExpandVolumeResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NodeExpandVolume indicates an expected call of NodeExpandVolume +func (mr *MockNodeServerMockRecorder) NodeExpandVolume(arg0, arg1 interface{}) *gomock.Call { + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NodeExpandVolume", reflect.TypeOf((*MockNodeServer)(nil).NodeExpandVolume), arg0, arg1) +} + +// NodeGetCapabilities mocks base method +func (m *MockNodeServer) NodeGetCapabilities(arg0 context.Context, arg1 *csi.NodeGetCapabilitiesRequest) (*csi.NodeGetCapabilitiesResponse, error) { + ret := m.ctrl.Call(m, "NodeGetCapabilities", arg0, arg1) + ret0, _ := ret[0].(*csi.NodeGetCapabilitiesResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NodeGetCapabilities indicates an expected call of NodeGetCapabilities +func (mr *MockNodeServerMockRecorder) NodeGetCapabilities(arg0, arg1 interface{}) *gomock.Call { + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NodeGetCapabilities", reflect.TypeOf((*MockNodeServer)(nil).NodeGetCapabilities), arg0, arg1) +} + +// NodeGetInfo mocks base method +func (m *MockNodeServer) NodeGetInfo(arg0 context.Context, arg1 *csi.NodeGetInfoRequest) (*csi.NodeGetInfoResponse, error) { + ret := m.ctrl.Call(m, "NodeGetInfo", arg0, arg1) + ret0, _ := ret[0].(*csi.NodeGetInfoResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NodeGetInfo indicates an expected call of NodeGetInfo +func (mr *MockNodeServerMockRecorder) NodeGetInfo(arg0, arg1 interface{}) *gomock.Call { + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NodeGetInfo", reflect.TypeOf((*MockNodeServer)(nil).NodeGetInfo), arg0, arg1) +} + +// NodeGetVolumeStats mocks base method +func (m *MockNodeServer) NodeGetVolumeStats(arg0 context.Context, arg1 *csi.NodeGetVolumeStatsRequest) (*csi.NodeGetVolumeStatsResponse, error) { + ret := m.ctrl.Call(m, "NodeGetVolumeStats", arg0, arg1) + ret0, _ := ret[0].(*csi.NodeGetVolumeStatsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NodeGetVolumeStats indicates an expected call of NodeGetVolumeStats +func (mr *MockNodeServerMockRecorder) NodeGetVolumeStats(arg0, arg1 interface{}) *gomock.Call { + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NodeGetVolumeStats", reflect.TypeOf((*MockNodeServer)(nil).NodeGetVolumeStats), arg0, arg1) +} + +// NodePublishVolume mocks base method +func (m *MockNodeServer) NodePublishVolume(arg0 context.Context, arg1 *csi.NodePublishVolumeRequest) (*csi.NodePublishVolumeResponse, error) { + ret := m.ctrl.Call(m, "NodePublishVolume", arg0, arg1) + ret0, _ := ret[0].(*csi.NodePublishVolumeResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NodePublishVolume indicates an expected call of NodePublishVolume +func (mr *MockNodeServerMockRecorder) NodePublishVolume(arg0, arg1 interface{}) *gomock.Call { + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NodePublishVolume", reflect.TypeOf((*MockNodeServer)(nil).NodePublishVolume), arg0, arg1) +} + +// NodeStageVolume mocks base method +func (m *MockNodeServer) NodeStageVolume(arg0 context.Context, arg1 *csi.NodeStageVolumeRequest) (*csi.NodeStageVolumeResponse, error) { + ret := m.ctrl.Call(m, "NodeStageVolume", arg0, arg1) + ret0, _ := ret[0].(*csi.NodeStageVolumeResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NodeStageVolume indicates an expected call of NodeStageVolume +func (mr *MockNodeServerMockRecorder) NodeStageVolume(arg0, arg1 interface{}) *gomock.Call { + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NodeStageVolume", reflect.TypeOf((*MockNodeServer)(nil).NodeStageVolume), arg0, arg1) +} + +// NodeUnpublishVolume mocks base method +func (m *MockNodeServer) NodeUnpublishVolume(arg0 context.Context, arg1 *csi.NodeUnpublishVolumeRequest) (*csi.NodeUnpublishVolumeResponse, error) { + ret := m.ctrl.Call(m, "NodeUnpublishVolume", arg0, arg1) + ret0, _ := ret[0].(*csi.NodeUnpublishVolumeResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NodeUnpublishVolume indicates an expected call of NodeUnpublishVolume +func (mr *MockNodeServerMockRecorder) NodeUnpublishVolume(arg0, arg1 interface{}) *gomock.Call { + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NodeUnpublishVolume", reflect.TypeOf((*MockNodeServer)(nil).NodeUnpublishVolume), arg0, arg1) +} + +// NodeUnstageVolume mocks base method +func (m *MockNodeServer) NodeUnstageVolume(arg0 context.Context, arg1 *csi.NodeUnstageVolumeRequest) (*csi.NodeUnstageVolumeResponse, error) { + ret := m.ctrl.Call(m, "NodeUnstageVolume", arg0, arg1) + ret0, _ := ret[0].(*csi.NodeUnstageVolumeResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NodeUnstageVolume indicates an expected call of NodeUnstageVolume +func (mr *MockNodeServerMockRecorder) NodeUnstageVolume(arg0, arg1 interface{}) *gomock.Call { + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NodeUnstageVolume", reflect.TypeOf((*MockNodeServer)(nil).NodeUnstageVolume), arg0, arg1) +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/drivers/csi-test/driver/mock.go b/vendor/k8s.io/kubernetes/test/e2e/storage/drivers/csi-test/driver/mock.go new file mode 100644 index 000000000000..c6560f99ed33 --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/drivers/csi-test/driver/mock.go @@ -0,0 +1,74 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package driver + +import ( + "net" + + "google.golang.org/grpc" +) + +type MockCSIDriverServers struct { + Controller *MockControllerServer + Identity *MockIdentityServer + Node *MockNodeServer +} + +type MockCSIDriver struct { + CSIDriver + conn *grpc.ClientConn + interceptor grpc.UnaryServerInterceptor +} + +func NewMockCSIDriver(servers *MockCSIDriverServers, interceptor grpc.UnaryServerInterceptor) *MockCSIDriver { + return &MockCSIDriver{ + CSIDriver: CSIDriver{ + servers: &CSIDriverServers{ + Controller: servers.Controller, + Node: servers.Node, + Identity: servers.Identity, + }, + }, + interceptor: interceptor, + } +} + +// StartOnAddress starts a new gRPC server listening on given address. +func (m *MockCSIDriver) StartOnAddress(network, address string) error { + l, err := net.Listen(network, address) + if err != nil { + return err + } + + if err := m.CSIDriver.Start(l, m.interceptor); err != nil { + l.Close() + return err + } + + return nil +} + +// Start starts a new gRPC server listening on a random TCP loopback port. +func (m *MockCSIDriver) Start() error { + // Listen on a port assigned by the net package + return m.StartOnAddress("tcp", "127.0.0.1:0") +} + +func (m *MockCSIDriver) Close() { + m.conn.Close() + m.server.Stop() +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/drivers/csi-test/mock/cache/SnapshotCache.go b/vendor/k8s.io/kubernetes/test/e2e/storage/drivers/csi-test/mock/cache/SnapshotCache.go new file mode 100644 index 000000000000..f3569ede84a4 --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/drivers/csi-test/mock/cache/SnapshotCache.go @@ -0,0 +1,105 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package cache + +import ( + "strings" + "sync" + + "github.com/container-storage-interface/spec/lib/go/csi" +) + +type SnapshotCache interface { + Add(snapshot Snapshot) + + Delete(i int) + + List(ready bool) []csi.Snapshot + + FindSnapshot(k, v string) (int, Snapshot) +} + +type Snapshot struct { + Name string + Parameters map[string]string + SnapshotCSI csi.Snapshot +} + +type snapshotCache struct { + snapshotsRWL sync.RWMutex + snapshots []Snapshot +} + +func NewSnapshotCache() SnapshotCache { + return &snapshotCache{ + snapshots: make([]Snapshot, 0), + } +} + +func (snap *snapshotCache) Add(snapshot Snapshot) { + snap.snapshotsRWL.Lock() + defer snap.snapshotsRWL.Unlock() + + snap.snapshots = append(snap.snapshots, snapshot) +} + +func (snap *snapshotCache) Delete(i int) { + snap.snapshotsRWL.Lock() + defer snap.snapshotsRWL.Unlock() + + copy(snap.snapshots[i:], snap.snapshots[i+1:]) + snap.snapshots = snap.snapshots[:len(snap.snapshots)-1] +} + +func (snap *snapshotCache) List(ready bool) []csi.Snapshot { + snap.snapshotsRWL.RLock() + defer snap.snapshotsRWL.RUnlock() + + snapshots := make([]csi.Snapshot, 0) + for _, v := range snap.snapshots { + if v.SnapshotCSI.GetReadyToUse() { + snapshots = append(snapshots, v.SnapshotCSI) + } + } + + return snapshots +} + +func (snap *snapshotCache) FindSnapshot(k, v string) (int, Snapshot) { + snap.snapshotsRWL.RLock() + defer snap.snapshotsRWL.RUnlock() + + snapshotIdx := -1 + for i, vi := range snap.snapshots { + switch k { + case "id": + if strings.EqualFold(v, vi.SnapshotCSI.GetSnapshotId()) { + return i, vi + } + case "sourceVolumeId": + if strings.EqualFold(v, vi.SnapshotCSI.SourceVolumeId) { + return i, vi + } + case "name": + if vi.Name == v { + return i, vi + } + } + } + + return snapshotIdx, Snapshot{} +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/drivers/csi-test/mock/service/controller.go b/vendor/k8s.io/kubernetes/test/e2e/storage/drivers/csi-test/mock/service/controller.go new file mode 100644 index 000000000000..7e8c1abad1fb --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/drivers/csi-test/mock/service/controller.go @@ -0,0 +1,844 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package service + +import ( + "fmt" + "path" + "reflect" + "strconv" + + "github.com/container-storage-interface/spec/lib/go/csi" + "golang.org/x/net/context" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + + "k8s.io/klog/v2" +) + +const ( + MaxStorageCapacity = tib + ReadOnlyKey = "readonly" +) + +func (s *service) CreateVolume( + ctx context.Context, + req *csi.CreateVolumeRequest) ( + *csi.CreateVolumeResponse, error) { + + if len(req.Name) == 0 { + return nil, status.Error(codes.InvalidArgument, "Volume Name cannot be empty") + } + if req.VolumeCapabilities == nil { + return nil, status.Error(codes.InvalidArgument, "Volume Capabilities cannot be empty") + } + + // Check to see if the volume already exists. + if i, v := s.findVolByName(ctx, req.Name); i >= 0 { + // Requested volume name already exists, need to check if the existing volume's + // capacity is more or equal to new request's capacity. + if v.GetCapacityBytes() < req.GetCapacityRange().GetRequiredBytes() { + return nil, status.Error(codes.AlreadyExists, + fmt.Sprintf("Volume with name %s already exists", req.GetName())) + } + return &csi.CreateVolumeResponse{Volume: &v}, nil + } + + // If no capacity is specified then use 100GiB + capacity := gib100 + if cr := req.CapacityRange; cr != nil { + if rb := cr.RequiredBytes; rb > 0 { + capacity = rb + } + if lb := cr.LimitBytes; lb > 0 { + capacity = lb + } + } + // Check for maximum available capacity + if capacity >= MaxStorageCapacity { + return nil, status.Errorf(codes.OutOfRange, "Requested capacity %d exceeds maximum allowed %d", capacity, MaxStorageCapacity) + } + + var v csi.Volume + // Create volume from content source if provided. + if req.GetVolumeContentSource() != nil { + switch req.GetVolumeContentSource().GetType().(type) { + case *csi.VolumeContentSource_Snapshot: + sid := req.GetVolumeContentSource().GetSnapshot().GetSnapshotId() + // Check if the source snapshot exists. + if snapID, _ := s.snapshots.FindSnapshot("id", sid); snapID >= 0 { + v = s.newVolumeFromSnapshot(req.Name, capacity, snapID) + } else { + return nil, status.Errorf(codes.NotFound, "Requested source snapshot %s not found", sid) + } + case *csi.VolumeContentSource_Volume: + vid := req.GetVolumeContentSource().GetVolume().GetVolumeId() + // Check if the source volume exists. + if volID, _ := s.findVolNoLock("id", vid); volID >= 0 { + v = s.newVolumeFromVolume(req.Name, capacity, volID) + } else { + return nil, status.Errorf(codes.NotFound, "Requested source volume %s not found", vid) + } + } + } else { + v = s.newVolume(req.Name, capacity) + } + + // Add the created volume to the service's in-mem volume slice. + s.volsRWL.Lock() + defer s.volsRWL.Unlock() + s.vols = append(s.vols, v) + MockVolumes[v.GetVolumeId()] = Volume{ + VolumeCSI: v, + NodeID: "", + ISStaged: false, + ISPublished: false, + StageTargetPath: "", + TargetPath: "", + } + + if hookVal, hookMsg := s.execHook("CreateVolumeEnd"); hookVal != codes.OK { + return nil, status.Errorf(hookVal, hookMsg) + } + + return &csi.CreateVolumeResponse{Volume: &v}, nil +} + +func (s *service) DeleteVolume( + ctx context.Context, + req *csi.DeleteVolumeRequest) ( + *csi.DeleteVolumeResponse, error) { + + s.volsRWL.Lock() + defer s.volsRWL.Unlock() + + // If the volume is not specified, return error + if len(req.VolumeId) == 0 { + return nil, status.Error(codes.InvalidArgument, "Volume ID cannot be empty") + } + + if hookVal, hookMsg := s.execHook("DeleteVolumeStart"); hookVal != codes.OK { + return nil, status.Errorf(hookVal, hookMsg) + } + + // If the volume does not exist then return an idempotent response. + i, _ := s.findVolNoLock("id", req.VolumeId) + if i < 0 { + return &csi.DeleteVolumeResponse{}, nil + } + + // This delete logic preserves order and prevents potential memory + // leaks. The slice's elements may not be pointers, but the structs + // themselves have fields that are. + copy(s.vols[i:], s.vols[i+1:]) + s.vols[len(s.vols)-1] = csi.Volume{} + s.vols = s.vols[:len(s.vols)-1] + klog.V(5).InfoS("mock delete volume", "volumeID", req.VolumeId) + + if hookVal, hookMsg := s.execHook("DeleteVolumeEnd"); hookVal != codes.OK { + return nil, status.Errorf(hookVal, hookMsg) + } + return &csi.DeleteVolumeResponse{}, nil +} + +func (s *service) ControllerPublishVolume( + ctx context.Context, + req *csi.ControllerPublishVolumeRequest) ( + *csi.ControllerPublishVolumeResponse, error) { + + if s.config.DisableAttach { + return nil, status.Error(codes.Unimplemented, "ControllerPublish is not supported") + } + + if len(req.VolumeId) == 0 { + return nil, status.Error(codes.InvalidArgument, "Volume ID cannot be empty") + } + if len(req.NodeId) == 0 { + return nil, status.Error(codes.InvalidArgument, "Node ID cannot be empty") + } + if req.VolumeCapability == nil { + return nil, status.Error(codes.InvalidArgument, "Volume Capabilities cannot be empty") + } + + if req.NodeId != s.nodeID { + return nil, status.Errorf(codes.NotFound, "Not matching Node ID %s to Mock Node ID %s", req.NodeId, s.nodeID) + } + + if hookVal, hookMsg := s.execHook("ControllerPublishVolumeStart"); hookVal != codes.OK { + return nil, status.Errorf(hookVal, hookMsg) + } + + s.volsRWL.Lock() + defer s.volsRWL.Unlock() + + i, v := s.findVolNoLock("id", req.VolumeId) + if i < 0 { + return nil, status.Error(codes.NotFound, req.VolumeId) + } + + // devPathKey is the key in the volume's attributes that is set to a + // mock device path if the volume has been published by the controller + // to the specified node. + devPathKey := path.Join(req.NodeId, "dev") + + // Check to see if the volume is already published. + if device := v.VolumeContext[devPathKey]; device != "" { + var volRo bool + var roVal string + if ro, ok := v.VolumeContext[ReadOnlyKey]; ok { + roVal = ro + } + + if roVal == "true" { + volRo = true + } else { + volRo = false + } + + // Check if readonly flag is compatible with the publish request. + if req.GetReadonly() != volRo { + return nil, status.Error(codes.AlreadyExists, "Volume published but has incompatible readonly flag") + } + + return &csi.ControllerPublishVolumeResponse{ + PublishContext: map[string]string{ + "device": device, + "readonly": roVal, + }, + }, nil + } + + // Check attach limit before publishing only if attach limit is set. + if s.config.AttachLimit > 0 && s.getAttachCount(devPathKey) >= s.config.AttachLimit { + return nil, status.Errorf(codes.ResourceExhausted, "Cannot attach any more volumes to this node") + } + + var roVal string + if req.GetReadonly() { + roVal = "true" + } else { + roVal = "false" + } + + // Publish the volume. + device := "/dev/mock" + v.VolumeContext[devPathKey] = device + v.VolumeContext[ReadOnlyKey] = roVal + s.vols[i] = v + + if volInfo, ok := MockVolumes[req.VolumeId]; ok { + volInfo.ISControllerPublished = true + MockVolumes[req.VolumeId] = volInfo + } + + if hookVal, hookMsg := s.execHook("ControllerPublishVolumeEnd"); hookVal != codes.OK { + return nil, status.Errorf(hookVal, hookMsg) + } + + return &csi.ControllerPublishVolumeResponse{ + PublishContext: map[string]string{ + "device": device, + "readonly": roVal, + }, + }, nil +} + +func (s *service) ControllerUnpublishVolume( + ctx context.Context, + req *csi.ControllerUnpublishVolumeRequest) ( + *csi.ControllerUnpublishVolumeResponse, error) { + + if s.config.DisableAttach { + return nil, status.Error(codes.Unimplemented, "ControllerPublish is not supported") + } + + if len(req.VolumeId) == 0 { + return nil, status.Error(codes.InvalidArgument, "Volume ID cannot be empty") + } + nodeID := req.NodeId + if len(nodeID) == 0 { + // If node id is empty, no failure as per Spec + nodeID = s.nodeID + } + + if req.NodeId != s.nodeID { + return nil, status.Errorf(codes.NotFound, "Node ID %s does not match to expected Node ID %s", req.NodeId, s.nodeID) + } + + if hookVal, hookMsg := s.execHook("ControllerUnpublishVolumeStart"); hookVal != codes.OK { + return nil, status.Errorf(hookVal, hookMsg) + } + + s.volsRWL.Lock() + defer s.volsRWL.Unlock() + + i, v := s.findVolNoLock("id", req.VolumeId) + if i < 0 { + // Not an error: a non-existent volume is not published. + // See also https://github.com/kubernetes-csi/external-attacher/pull/165 + return &csi.ControllerUnpublishVolumeResponse{}, nil + } + + // devPathKey is the key in the volume's attributes that is set to a + // mock device path if the volume has been published by the controller + // to the specified node. + devPathKey := path.Join(nodeID, "dev") + + // Check to see if the volume is already unpublished. + if v.VolumeContext[devPathKey] == "" { + return &csi.ControllerUnpublishVolumeResponse{}, nil + } + + // Unpublish the volume. + delete(v.VolumeContext, devPathKey) + delete(v.VolumeContext, ReadOnlyKey) + s.vols[i] = v + + if hookVal, hookMsg := s.execHook("ControllerUnpublishVolumeEnd"); hookVal != codes.OK { + return nil, status.Errorf(hookVal, hookMsg) + } + + return &csi.ControllerUnpublishVolumeResponse{}, nil +} + +func (s *service) ValidateVolumeCapabilities( + ctx context.Context, + req *csi.ValidateVolumeCapabilitiesRequest) ( + *csi.ValidateVolumeCapabilitiesResponse, error) { + + if len(req.GetVolumeId()) == 0 { + return nil, status.Error(codes.InvalidArgument, "Volume ID cannot be empty") + } + if len(req.VolumeCapabilities) == 0 { + return nil, status.Error(codes.InvalidArgument, req.VolumeId) + } + i, _ := s.findVolNoLock("id", req.VolumeId) + if i < 0 { + return nil, status.Error(codes.NotFound, req.VolumeId) + } + + if hookVal, hookMsg := s.execHook("ValidateVolumeCapabilities"); hookVal != codes.OK { + return nil, status.Errorf(hookVal, hookMsg) + } + + return &csi.ValidateVolumeCapabilitiesResponse{ + Confirmed: &csi.ValidateVolumeCapabilitiesResponse_Confirmed{ + VolumeContext: req.GetVolumeContext(), + VolumeCapabilities: req.GetVolumeCapabilities(), + Parameters: req.GetParameters(), + }, + }, nil +} + +func (s *service) ControllerGetVolume( + ctx context.Context, + req *csi.ControllerGetVolumeRequest) ( + *csi.ControllerGetVolumeResponse, error) { + + if hookVal, hookMsg := s.execHook("GetVolumeStart"); hookVal != codes.OK { + return nil, status.Errorf(hookVal, hookMsg) + } + + resp := &csi.ControllerGetVolumeResponse{ + Status: &csi.ControllerGetVolumeResponse_VolumeStatus{ + VolumeCondition: &csi.VolumeCondition{}, + }, + } + i, v := s.findVolByID(ctx, req.VolumeId) + if i < 0 { + resp.Status.VolumeCondition.Abnormal = true + resp.Status.VolumeCondition.Message = "volume not found" + return resp, status.Error(codes.NotFound, req.VolumeId) + } + + resp.Volume = &v + if !s.config.DisableAttach { + resp.Status.PublishedNodeIds = []string{ + s.nodeID, + } + } + + if hookVal, hookMsg := s.execHook("GetVolumeEnd"); hookVal != codes.OK { + return nil, status.Errorf(hookVal, hookMsg) + } + + return resp, nil +} + +func (s *service) ListVolumes( + ctx context.Context, + req *csi.ListVolumesRequest) ( + *csi.ListVolumesResponse, error) { + + if hookVal, hookMsg := s.execHook("ListVolumesStart"); hookVal != codes.OK { + return nil, status.Errorf(hookVal, hookMsg) + } + + // Copy the mock volumes into a new slice in order to avoid + // locking the service's volume slice for the duration of the + // ListVolumes RPC. + var vols []csi.Volume + func() { + s.volsRWL.RLock() + defer s.volsRWL.RUnlock() + vols = make([]csi.Volume, len(s.vols)) + copy(vols, s.vols) + }() + + var ( + ulenVols = int32(len(vols)) + maxEntries = req.MaxEntries + startingToken int32 + ) + + if v := req.StartingToken; v != "" { + i, err := strconv.ParseUint(v, 10, 32) + if err != nil { + return nil, status.Errorf( + codes.Aborted, + "startingToken=%s: %v", + v, err) + } + startingToken = int32(i) + } + + if startingToken > ulenVols { + return nil, status.Errorf( + codes.Aborted, + "startingToken=%d > len(vols)=%d", + startingToken, ulenVols) + } + + // Discern the number of remaining entries. + rem := ulenVols - startingToken + + // If maxEntries is 0 or greater than the number of remaining entries then + // set maxEntries to the number of remaining entries. + if maxEntries == 0 || maxEntries > rem { + maxEntries = rem + } + + var ( + i int + j = startingToken + entries = make( + []*csi.ListVolumesResponse_Entry, + maxEntries) + ) + + for i = 0; i < len(entries); i++ { + volumeStatus := &csi.ListVolumesResponse_VolumeStatus{ + VolumeCondition: &csi.VolumeCondition{}, + } + + if !s.config.DisableAttach { + volumeStatus.PublishedNodeIds = []string{ + s.nodeID, + } + } + + entries[i] = &csi.ListVolumesResponse_Entry{ + Volume: &vols[j], + Status: volumeStatus, + } + j++ + } + + var nextToken string + if n := startingToken + int32(i); n < ulenVols { + nextToken = fmt.Sprintf("%d", n) + } + + if hookVal, hookMsg := s.execHook("ListVolumesEnd"); hookVal != codes.OK { + return nil, status.Errorf(hookVal, hookMsg) + } + + return &csi.ListVolumesResponse{ + Entries: entries, + NextToken: nextToken, + }, nil +} + +func (s *service) GetCapacity( + ctx context.Context, + req *csi.GetCapacityRequest) ( + *csi.GetCapacityResponse, error) { + + if hookVal, hookMsg := s.execHook("GetCapacity"); hookVal != codes.OK { + return nil, status.Errorf(hookVal, hookMsg) + } + + return &csi.GetCapacityResponse{ + AvailableCapacity: MaxStorageCapacity, + }, nil +} + +func (s *service) ControllerGetCapabilities( + ctx context.Context, + req *csi.ControllerGetCapabilitiesRequest) ( + *csi.ControllerGetCapabilitiesResponse, error) { + + if hookVal, hookMsg := s.execHook("ControllerGetCapabilitiesStart"); hookVal != codes.OK { + return nil, status.Errorf(hookVal, hookMsg) + } + + caps := []*csi.ControllerServiceCapability{ + { + Type: &csi.ControllerServiceCapability_Rpc{ + Rpc: &csi.ControllerServiceCapability_RPC{ + Type: csi.ControllerServiceCapability_RPC_CREATE_DELETE_VOLUME, + }, + }, + }, + { + Type: &csi.ControllerServiceCapability_Rpc{ + Rpc: &csi.ControllerServiceCapability_RPC{ + Type: csi.ControllerServiceCapability_RPC_LIST_VOLUMES, + }, + }, + }, + { + Type: &csi.ControllerServiceCapability_Rpc{ + Rpc: &csi.ControllerServiceCapability_RPC{ + Type: csi.ControllerServiceCapability_RPC_LIST_VOLUMES_PUBLISHED_NODES, + }, + }, + }, + { + Type: &csi.ControllerServiceCapability_Rpc{ + Rpc: &csi.ControllerServiceCapability_RPC{ + Type: csi.ControllerServiceCapability_RPC_GET_CAPACITY, + }, + }, + }, + { + Type: &csi.ControllerServiceCapability_Rpc{ + Rpc: &csi.ControllerServiceCapability_RPC{ + Type: csi.ControllerServiceCapability_RPC_LIST_SNAPSHOTS, + }, + }, + }, + { + Type: &csi.ControllerServiceCapability_Rpc{ + Rpc: &csi.ControllerServiceCapability_RPC{ + Type: csi.ControllerServiceCapability_RPC_CREATE_DELETE_SNAPSHOT, + }, + }, + }, + { + Type: &csi.ControllerServiceCapability_Rpc{ + Rpc: &csi.ControllerServiceCapability_RPC{ + Type: csi.ControllerServiceCapability_RPC_PUBLISH_READONLY, + }, + }, + }, + { + Type: &csi.ControllerServiceCapability_Rpc{ + Rpc: &csi.ControllerServiceCapability_RPC{ + Type: csi.ControllerServiceCapability_RPC_CLONE_VOLUME, + }, + }, + }, + { + Type: &csi.ControllerServiceCapability_Rpc{ + Rpc: &csi.ControllerServiceCapability_RPC{ + Type: csi.ControllerServiceCapability_RPC_GET_VOLUME, + }, + }, + }, + { + Type: &csi.ControllerServiceCapability_Rpc{ + Rpc: &csi.ControllerServiceCapability_RPC{ + Type: csi.ControllerServiceCapability_RPC_VOLUME_CONDITION, + }, + }, + }, + } + + if !s.config.DisableAttach { + caps = append(caps, &csi.ControllerServiceCapability{ + Type: &csi.ControllerServiceCapability_Rpc{ + Rpc: &csi.ControllerServiceCapability_RPC{ + Type: csi.ControllerServiceCapability_RPC_PUBLISH_UNPUBLISH_VOLUME, + }, + }, + }) + } + + if !s.config.DisableControllerExpansion { + caps = append(caps, &csi.ControllerServiceCapability{ + Type: &csi.ControllerServiceCapability_Rpc{ + Rpc: &csi.ControllerServiceCapability_RPC{ + Type: csi.ControllerServiceCapability_RPC_EXPAND_VOLUME, + }, + }, + }) + } + + if hookVal, hookMsg := s.execHook("ControllerGetCapabilitiesEnd"); hookVal != codes.OK { + return nil, status.Errorf(hookVal, hookMsg) + } + + return &csi.ControllerGetCapabilitiesResponse{ + Capabilities: caps, + }, nil +} + +func (s *service) CreateSnapshot(ctx context.Context, + req *csi.CreateSnapshotRequest) (*csi.CreateSnapshotResponse, error) { + // Check arguments + if len(req.GetName()) == 0 { + return nil, status.Error(codes.InvalidArgument, "Snapshot Name cannot be empty") + } + if len(req.GetSourceVolumeId()) == 0 { + return nil, status.Error(codes.InvalidArgument, "Snapshot SourceVolumeId cannot be empty") + } + + // Check to see if the snapshot already exists. + if i, v := s.snapshots.FindSnapshot("name", req.GetName()); i >= 0 { + // Requested snapshot name already exists + if v.SnapshotCSI.GetSourceVolumeId() != req.GetSourceVolumeId() || !reflect.DeepEqual(v.Parameters, req.GetParameters()) { + return nil, status.Error(codes.AlreadyExists, + fmt.Sprintf("Snapshot with name %s already exists", req.GetName())) + } + return &csi.CreateSnapshotResponse{Snapshot: &v.SnapshotCSI}, nil + } + + // Create the snapshot and add it to the service's in-mem snapshot slice. + snapshot := s.newSnapshot(req.GetName(), req.GetSourceVolumeId(), req.GetParameters()) + s.snapshots.Add(snapshot) + + if hookVal, hookMsg := s.execHook("CreateSnapshotEnd"); hookVal != codes.OK { + return nil, status.Errorf(hookVal, hookMsg) + } + + return &csi.CreateSnapshotResponse{Snapshot: &snapshot.SnapshotCSI}, nil +} + +func (s *service) DeleteSnapshot(ctx context.Context, + req *csi.DeleteSnapshotRequest) (*csi.DeleteSnapshotResponse, error) { + + // If the snapshot is not specified, return error + if len(req.SnapshotId) == 0 { + return nil, status.Error(codes.InvalidArgument, "Snapshot ID cannot be empty") + } + + if hookVal, hookMsg := s.execHook("DeleteSnapshotStart"); hookVal != codes.OK { + return nil, status.Errorf(hookVal, hookMsg) + } + + // If the snapshot does not exist then return an idempotent response. + i, _ := s.snapshots.FindSnapshot("id", req.SnapshotId) + if i < 0 { + return &csi.DeleteSnapshotResponse{}, nil + } + + // This delete logic preserves order and prevents potential memory + // leaks. The slice's elements may not be pointers, but the structs + // themselves have fields that are. + s.snapshots.Delete(i) + klog.V(5).InfoS("mock delete snapshot", "SnapshotId", req.SnapshotId) + + if hookVal, hookMsg := s.execHook("DeleteSnapshotEnd"); hookVal != codes.OK { + return nil, status.Errorf(hookVal, hookMsg) + } + + return &csi.DeleteSnapshotResponse{}, nil +} + +func (s *service) ListSnapshots(ctx context.Context, + req *csi.ListSnapshotsRequest) (*csi.ListSnapshotsResponse, error) { + + if hookVal, hookMsg := s.execHook("ListSnapshots"); hookVal != codes.OK { + return nil, status.Errorf(hookVal, hookMsg) + } + + // case 1: SnapshotId is not empty, return snapshots that match the snapshot id. + if len(req.GetSnapshotId()) != 0 { + return getSnapshotById(s, req) + } + + // case 2: SourceVolumeId is not empty, return snapshots that match the source volume id. + if len(req.GetSourceVolumeId()) != 0 { + return getSnapshotByVolumeId(s, req) + } + + // case 3: no parameter is set, so we return all the snapshots. + return getAllSnapshots(s, req) +} + +func (s *service) ControllerExpandVolume( + ctx context.Context, + req *csi.ControllerExpandVolumeRequest) (*csi.ControllerExpandVolumeResponse, error) { + if len(req.VolumeId) == 0 { + return nil, status.Error(codes.InvalidArgument, "Volume ID cannot be empty") + } + + if req.CapacityRange == nil { + return nil, status.Error(codes.InvalidArgument, "Request capacity cannot be empty") + } + + if hookVal, hookMsg := s.execHook("ControllerExpandVolumeStart"); hookVal != codes.OK { + return nil, status.Errorf(hookVal, hookMsg) + } + + s.volsRWL.Lock() + defer s.volsRWL.Unlock() + + i, v := s.findVolNoLock("id", req.VolumeId) + if i < 0 { + return nil, status.Error(codes.NotFound, req.VolumeId) + } + + if s.config.DisableOnlineExpansion && MockVolumes[v.GetVolumeId()].ISControllerPublished { + return nil, status.Error(codes.FailedPrecondition, "volume is published and online volume expansion is not supported") + } + + requestBytes := req.CapacityRange.RequiredBytes + + if v.CapacityBytes > requestBytes { + return nil, status.Error(codes.InvalidArgument, "cannot change volume capacity to a smaller size") + } + + resp := &csi.ControllerExpandVolumeResponse{ + CapacityBytes: requestBytes, + NodeExpansionRequired: s.config.NodeExpansionRequired, + } + + // Check to see if the volume already satisfied request size. + if v.CapacityBytes == requestBytes { + klog.V(5).InfoS("volume capacity sufficient, no need to expand", "requested", requestBytes, "current", v.CapacityBytes, "volumeID", v.VolumeId) + return resp, nil + } + + // Update volume's capacity to the requested size. + v.CapacityBytes = requestBytes + s.vols[i] = v + + if hookVal, hookMsg := s.execHook("ControllerExpandVolumeEnd"); hookVal != codes.OK { + return nil, status.Errorf(hookVal, hookMsg) + } + + return resp, nil +} + +func getSnapshotById(s *service, req *csi.ListSnapshotsRequest) (*csi.ListSnapshotsResponse, error) { + if len(req.GetSnapshotId()) != 0 { + i, snapshot := s.snapshots.FindSnapshot("id", req.GetSnapshotId()) + if i < 0 { + return &csi.ListSnapshotsResponse{}, nil + } + + if len(req.GetSourceVolumeId()) != 0 { + if snapshot.SnapshotCSI.GetSourceVolumeId() != req.GetSourceVolumeId() { + return &csi.ListSnapshotsResponse{}, nil + } + } + + return &csi.ListSnapshotsResponse{ + Entries: []*csi.ListSnapshotsResponse_Entry{ + { + Snapshot: &snapshot.SnapshotCSI, + }, + }, + }, nil + } + return nil, nil +} + +func getSnapshotByVolumeId(s *service, req *csi.ListSnapshotsRequest) (*csi.ListSnapshotsResponse, error) { + if len(req.GetSourceVolumeId()) != 0 { + i, snapshot := s.snapshots.FindSnapshot("sourceVolumeId", req.SourceVolumeId) + if i < 0 { + return &csi.ListSnapshotsResponse{}, nil + } + return &csi.ListSnapshotsResponse{ + Entries: []*csi.ListSnapshotsResponse_Entry{ + { + Snapshot: &snapshot.SnapshotCSI, + }, + }, + }, nil + } + return nil, nil +} + +func getAllSnapshots(s *service, req *csi.ListSnapshotsRequest) (*csi.ListSnapshotsResponse, error) { + // Copy the mock snapshots into a new slice in order to avoid + // locking the service's snapshot slice for the duration of the + // ListSnapshots RPC. + readyToUse := true + snapshots := s.snapshots.List(readyToUse) + + var ( + ulenSnapshots = int32(len(snapshots)) + maxEntries = req.MaxEntries + startingToken int32 + ) + + if v := req.StartingToken; v != "" { + i, err := strconv.ParseUint(v, 10, 32) + if err != nil { + return nil, status.Errorf( + codes.Aborted, + "startingToken=%s: %v", + v, err) + } + startingToken = int32(i) + } + + if startingToken > ulenSnapshots { + return nil, status.Errorf( + codes.Aborted, + "startingToken=%d > len(snapshots)=%d", + startingToken, ulenSnapshots) + } + + // Discern the number of remaining entries. + rem := ulenSnapshots - startingToken + + // If maxEntries is 0 or greater than the number of remaining entries then + // set maxEntries to the number of remaining entries. + if maxEntries == 0 || maxEntries > rem { + maxEntries = rem + } + + var ( + i int + j = startingToken + entries = make( + []*csi.ListSnapshotsResponse_Entry, + maxEntries) + ) + + for i = 0; i < len(entries); i++ { + entries[i] = &csi.ListSnapshotsResponse_Entry{ + Snapshot: &snapshots[j], + } + j++ + } + + var nextToken string + if n := startingToken + int32(i); n < ulenSnapshots { + nextToken = fmt.Sprintf("%d", n) + } + + return &csi.ListSnapshotsResponse{ + Entries: entries, + NextToken: nextToken, + }, nil +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/drivers/csi-test/mock/service/identity.go b/vendor/k8s.io/kubernetes/test/e2e/storage/drivers/csi-test/mock/service/identity.go new file mode 100644 index 000000000000..2f375e796790 --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/drivers/csi-test/mock/service/identity.go @@ -0,0 +1,90 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package service + +import ( + "golang.org/x/net/context" + + "github.com/container-storage-interface/spec/lib/go/csi" + "github.com/golang/protobuf/ptypes/wrappers" +) + +func (s *service) GetPluginInfo( + ctx context.Context, + req *csi.GetPluginInfoRequest) ( + *csi.GetPluginInfoResponse, error) { + + return &csi.GetPluginInfoResponse{ + Name: s.config.DriverName, + VendorVersion: VendorVersion, + Manifest: Manifest, + }, nil +} + +func (s *service) Probe( + ctx context.Context, + req *csi.ProbeRequest) ( + *csi.ProbeResponse, error) { + + return &csi.ProbeResponse{ + Ready: &wrappers.BoolValue{Value: true}, + }, nil +} + +func (s *service) GetPluginCapabilities( + ctx context.Context, + req *csi.GetPluginCapabilitiesRequest) ( + *csi.GetPluginCapabilitiesResponse, error) { + + volExpType := csi.PluginCapability_VolumeExpansion_ONLINE + + if s.config.DisableOnlineExpansion { + volExpType = csi.PluginCapability_VolumeExpansion_OFFLINE + } + + capabilities := []*csi.PluginCapability{ + { + Type: &csi.PluginCapability_Service_{ + Service: &csi.PluginCapability_Service{ + Type: csi.PluginCapability_Service_CONTROLLER_SERVICE, + }, + }, + }, + { + Type: &csi.PluginCapability_VolumeExpansion_{ + VolumeExpansion: &csi.PluginCapability_VolumeExpansion{ + Type: volExpType, + }, + }, + }, + } + + if s.config.EnableTopology { + capabilities = append(capabilities, + &csi.PluginCapability{ + Type: &csi.PluginCapability_Service_{ + Service: &csi.PluginCapability_Service{ + Type: csi.PluginCapability_Service_VOLUME_ACCESSIBILITY_CONSTRAINTS, + }, + }, + }) + } + + return &csi.GetPluginCapabilitiesResponse{ + Capabilities: capabilities, + }, nil +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/drivers/csi-test/mock/service/node.go b/vendor/k8s.io/kubernetes/test/e2e/storage/drivers/csi-test/mock/service/node.go new file mode 100644 index 000000000000..ddffea048af1 --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/drivers/csi-test/mock/service/node.go @@ -0,0 +1,450 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package service + +import ( + "fmt" + "path" + "strconv" + + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + + "golang.org/x/net/context" + + "github.com/container-storage-interface/spec/lib/go/csi" +) + +func (s *service) NodeStageVolume( + ctx context.Context, + req *csi.NodeStageVolumeRequest) ( + *csi.NodeStageVolumeResponse, error) { + + device, ok := req.PublishContext["device"] + if !ok { + if s.config.DisableAttach { + device = "mock device" + } else { + return nil, status.Error( + codes.InvalidArgument, + "stage volume info 'device' key required") + } + } + + if len(req.GetVolumeId()) == 0 { + return nil, status.Error(codes.InvalidArgument, "Volume ID cannot be empty") + } + + if len(req.GetStagingTargetPath()) == 0 { + return nil, status.Error(codes.InvalidArgument, "Staging Target Path cannot be empty") + } + + if req.GetVolumeCapability() == nil { + return nil, status.Error(codes.InvalidArgument, "Volume Capability cannot be empty") + } + + exists, err := s.config.IO.DirExists(req.StagingTargetPath) + if err != nil { + return nil, status.Error(codes.Internal, err.Error()) + } + if !exists { + status.Errorf(codes.Internal, "staging target path %s does not exist", req.StagingTargetPath) + } + + s.volsRWL.Lock() + defer s.volsRWL.Unlock() + + i, v := s.findVolNoLock("id", req.VolumeId) + if i < 0 { + return nil, status.Error(codes.NotFound, req.VolumeId) + } + + // nodeStgPathKey is the key in the volume's attributes that is set to a + // mock stage path if the volume has been published by the node + nodeStgPathKey := path.Join(s.nodeID, req.StagingTargetPath) + + // Check to see if the volume has already been staged. + if v.VolumeContext[nodeStgPathKey] != "" { + // TODO: Check for the capabilities to be equal. Return "ALREADY_EXISTS" + // if the capabilities don't match. + return &csi.NodeStageVolumeResponse{}, nil + } + + // Stage the volume. + v.VolumeContext[nodeStgPathKey] = device + s.vols[i] = v + + if hookVal, hookMsg := s.execHook("NodeStageVolumeEnd"); hookVal != codes.OK { + return nil, status.Errorf(hookVal, hookMsg) + } + + return &csi.NodeStageVolumeResponse{}, nil +} + +func (s *service) NodeUnstageVolume( + ctx context.Context, + req *csi.NodeUnstageVolumeRequest) ( + *csi.NodeUnstageVolumeResponse, error) { + + if len(req.GetVolumeId()) == 0 { + return nil, status.Error(codes.InvalidArgument, "Volume ID cannot be empty") + } + + if len(req.GetStagingTargetPath()) == 0 { + return nil, status.Error(codes.InvalidArgument, "Staging Target Path cannot be empty") + } + + s.volsRWL.Lock() + defer s.volsRWL.Unlock() + + i, v := s.findVolNoLock("id", req.VolumeId) + if i < 0 { + return nil, status.Error(codes.NotFound, req.VolumeId) + } + + // nodeStgPathKey is the key in the volume's attributes that is set to a + // mock stage path if the volume has been published by the node + nodeStgPathKey := path.Join(s.nodeID, req.StagingTargetPath) + + // Check to see if the volume has already been unstaged. + if v.VolumeContext[nodeStgPathKey] == "" { + return &csi.NodeUnstageVolumeResponse{}, nil + } + + // Unpublish the volume. + delete(v.VolumeContext, nodeStgPathKey) + s.vols[i] = v + + if hookVal, hookMsg := s.execHook("NodeUnstageVolumeEnd"); hookVal != codes.OK { + return nil, status.Errorf(hookVal, hookMsg) + } + return &csi.NodeUnstageVolumeResponse{}, nil +} + +func (s *service) NodePublishVolume( + ctx context.Context, + req *csi.NodePublishVolumeRequest) ( + *csi.NodePublishVolumeResponse, error) { + + if hookVal, hookMsg := s.execHook("NodePublishVolumeStart"); hookVal != codes.OK { + return nil, status.Errorf(hookVal, hookMsg) + } + ephemeralVolume := req.GetVolumeContext()["csi.storage.k8s.io/ephemeral"] == "true" + device, ok := req.PublishContext["device"] + if !ok { + if ephemeralVolume || s.config.DisableAttach { + device = "mock device" + } else { + return nil, status.Error( + codes.InvalidArgument, + "stage volume info 'device' key required") + } + } + + if len(req.GetVolumeId()) == 0 { + return nil, status.Error(codes.InvalidArgument, "Volume ID cannot be empty") + } + + if len(req.GetTargetPath()) == 0 { + return nil, status.Error(codes.InvalidArgument, "Target Path cannot be empty") + } + + if req.GetVolumeCapability() == nil { + return nil, status.Error(codes.InvalidArgument, "Volume Capability cannot be empty") + } + + // May happen with old (or, at this time, even the current) Kubernetes + // although it shouldn't (https://github.com/kubernetes/kubernetes/issues/75535). + exists, err := s.config.IO.DirExists(req.TargetPath) + if err != nil { + return nil, status.Error(codes.Internal, err.Error()) + } + if !s.config.PermissiveTargetPath && exists { + status.Errorf(codes.Internal, "target path %s does exist", req.TargetPath) + } + + s.volsRWL.Lock() + defer s.volsRWL.Unlock() + + i, v := s.findVolNoLock("id", req.VolumeId) + if i < 0 && !ephemeralVolume { + return nil, status.Error(codes.NotFound, req.VolumeId) + } + if i >= 0 && ephemeralVolume { + return nil, status.Error(codes.AlreadyExists, req.VolumeId) + } + + // nodeMntPathKey is the key in the volume's attributes that is set to a + // mock mount path if the volume has been published by the node + nodeMntPathKey := path.Join(s.nodeID, req.TargetPath) + + // Check to see if the volume has already been published. + if v.VolumeContext[nodeMntPathKey] != "" { + + // Requests marked Readonly fail due to volumes published by + // the Mock driver supporting only RW mode. + if req.Readonly { + return nil, status.Error(codes.AlreadyExists, req.VolumeId) + } + + return &csi.NodePublishVolumeResponse{}, nil + } + + // Publish the volume. + if ephemeralVolume { + MockVolumes[req.VolumeId] = Volume{ + ISEphemeral: true, + } + } else { + if req.GetTargetPath() != "" { + exists, err := s.config.IO.DirExists(req.GetTargetPath()) + if err != nil { + return nil, status.Error(codes.Internal, err.Error()) + } + if !exists { + // If target path does not exist we need to create the directory where volume will be staged + if err = s.config.IO.Mkdir(req.TargetPath); err != nil { + msg := fmt.Sprintf("NodePublishVolume: could not create target dir %q: %v", req.TargetPath, err) + return nil, status.Error(codes.Internal, msg) + } + } + v.VolumeContext[nodeMntPathKey] = req.GetTargetPath() + } else { + v.VolumeContext[nodeMntPathKey] = device + } + s.vols[i] = v + } + if hookVal, hookMsg := s.execHook("NodePublishVolumeEnd"); hookVal != codes.OK { + return nil, status.Errorf(hookVal, hookMsg) + } + + return &csi.NodePublishVolumeResponse{}, nil +} + +func (s *service) NodeUnpublishVolume( + ctx context.Context, + req *csi.NodeUnpublishVolumeRequest) ( + *csi.NodeUnpublishVolumeResponse, error) { + + if len(req.GetVolumeId()) == 0 { + return nil, status.Error(codes.InvalidArgument, "Volume ID cannot be empty") + } + if len(req.GetTargetPath()) == 0 { + return nil, status.Error(codes.InvalidArgument, "Target Path cannot be empty") + } + if hookVal, hookMsg := s.execHook("NodeUnpublishVolumeStart"); hookVal != codes.OK { + return nil, status.Errorf(hookVal, hookMsg) + } + + s.volsRWL.Lock() + defer s.volsRWL.Unlock() + + ephemeralVolume := MockVolumes[req.VolumeId].ISEphemeral + i, v := s.findVolNoLock("id", req.VolumeId) + if i < 0 && !ephemeralVolume { + return nil, status.Error(codes.NotFound, req.VolumeId) + } + + if ephemeralVolume { + delete(MockVolumes, req.VolumeId) + } else { + // nodeMntPathKey is the key in the volume's attributes that is set to a + // mock mount path if the volume has been published by the node + nodeMntPathKey := path.Join(s.nodeID, req.TargetPath) + + // Check to see if the volume has already been unpublished. + if v.VolumeContext[nodeMntPathKey] == "" { + return &csi.NodeUnpublishVolumeResponse{}, nil + } + + // Delete any created paths + err := s.config.IO.RemoveAll(v.VolumeContext[nodeMntPathKey]) + if err != nil { + return nil, status.Errorf(codes.Internal, "Unable to delete previously created target directory") + } + + // Unpublish the volume. + delete(v.VolumeContext, nodeMntPathKey) + s.vols[i] = v + } + if hookVal, hookMsg := s.execHook("NodeUnpublishVolumeEnd"); hookVal != codes.OK { + return nil, status.Errorf(hookVal, hookMsg) + } + + return &csi.NodeUnpublishVolumeResponse{}, nil +} + +func (s *service) NodeExpandVolume(ctx context.Context, req *csi.NodeExpandVolumeRequest) (*csi.NodeExpandVolumeResponse, error) { + if len(req.GetVolumeId()) == 0 { + return nil, status.Error(codes.InvalidArgument, "Volume ID cannot be empty") + } + if len(req.GetVolumePath()) == 0 { + return nil, status.Error(codes.InvalidArgument, "Volume Path cannot be empty") + } + if hookVal, hookMsg := s.execHook("NodeExpandVolumeStart"); hookVal != codes.OK { + return nil, status.Errorf(hookVal, hookMsg) + } + + s.volsRWL.Lock() + defer s.volsRWL.Unlock() + + i, v := s.findVolNoLock("id", req.VolumeId) + if i < 0 { + return nil, status.Error(codes.NotFound, req.VolumeId) + } + + // TODO: NodeExpandVolume MUST be called after successful NodeStageVolume as we has STAGE_UNSTAGE_VOLUME node capacity. + resp := &csi.NodeExpandVolumeResponse{} + var requestCapacity int64 = 0 + if req.GetCapacityRange() != nil { + requestCapacity = req.CapacityRange.GetRequiredBytes() + resp.CapacityBytes = requestCapacity + } + + // fsCapacityKey is the key in the volume's attributes that is set to the file system's size. + fsCapacityKey := path.Join(s.nodeID, req.GetVolumePath(), "size") + // Update volume's fs capacity to requested size. + if requestCapacity > 0 { + v.VolumeContext[fsCapacityKey] = strconv.FormatInt(requestCapacity, 10) + s.vols[i] = v + } + if hookVal, hookMsg := s.execHook("NodeExpandVolumeEnd"); hookVal != codes.OK { + return nil, status.Errorf(hookVal, hookMsg) + } + + return resp, nil +} + +func (s *service) NodeGetCapabilities( + ctx context.Context, + req *csi.NodeGetCapabilitiesRequest) ( + *csi.NodeGetCapabilitiesResponse, error) { + + if hookVal, hookMsg := s.execHook("NodeGetCapabilities"); hookVal != codes.OK { + return nil, status.Errorf(hookVal, hookMsg) + } + capabilities := []*csi.NodeServiceCapability{ + { + Type: &csi.NodeServiceCapability_Rpc{ + Rpc: &csi.NodeServiceCapability_RPC{ + Type: csi.NodeServiceCapability_RPC_UNKNOWN, + }, + }, + }, + { + Type: &csi.NodeServiceCapability_Rpc{ + Rpc: &csi.NodeServiceCapability_RPC{ + Type: csi.NodeServiceCapability_RPC_STAGE_UNSTAGE_VOLUME, + }, + }, + }, + { + Type: &csi.NodeServiceCapability_Rpc{ + Rpc: &csi.NodeServiceCapability_RPC{ + Type: csi.NodeServiceCapability_RPC_GET_VOLUME_STATS, + }, + }, + }, + { + Type: &csi.NodeServiceCapability_Rpc{ + Rpc: &csi.NodeServiceCapability_RPC{ + Type: csi.NodeServiceCapability_RPC_VOLUME_CONDITION, + }, + }, + }, + } + if s.config.NodeExpansionRequired { + capabilities = append(capabilities, &csi.NodeServiceCapability{ + Type: &csi.NodeServiceCapability_Rpc{ + Rpc: &csi.NodeServiceCapability_RPC{ + Type: csi.NodeServiceCapability_RPC_EXPAND_VOLUME, + }, + }, + }) + } + + return &csi.NodeGetCapabilitiesResponse{ + Capabilities: capabilities, + }, nil +} + +func (s *service) NodeGetInfo(ctx context.Context, + req *csi.NodeGetInfoRequest) (*csi.NodeGetInfoResponse, error) { + if hookVal, hookMsg := s.execHook("NodeGetInfo"); hookVal != codes.OK { + return nil, status.Errorf(hookVal, hookMsg) + } + csiNodeResponse := &csi.NodeGetInfoResponse{ + NodeId: s.nodeID, + } + if s.config.AttachLimit > 0 { + csiNodeResponse.MaxVolumesPerNode = s.config.AttachLimit + } + if s.config.EnableTopology { + csiNodeResponse.AccessibleTopology = &csi.Topology{ + Segments: map[string]string{ + TopologyKey: TopologyValue, + }, + } + } + return csiNodeResponse, nil +} + +func (s *service) NodeGetVolumeStats(ctx context.Context, + req *csi.NodeGetVolumeStatsRequest) (*csi.NodeGetVolumeStatsResponse, error) { + + resp := &csi.NodeGetVolumeStatsResponse{ + VolumeCondition: &csi.VolumeCondition{}, + } + + if len(req.GetVolumeId()) == 0 { + return nil, status.Error(codes.InvalidArgument, "Volume ID cannot be empty") + } + + if len(req.GetVolumePath()) == 0 { + return nil, status.Error(codes.InvalidArgument, "Volume Path cannot be empty") + } + + i, v := s.findVolNoLock("id", req.VolumeId) + if i < 0 { + resp.VolumeCondition.Abnormal = true + resp.VolumeCondition.Message = "Volume not found" + return resp, status.Error(codes.NotFound, req.VolumeId) + } + + nodeMntPathKey := path.Join(s.nodeID, req.VolumePath) + + _, exists := v.VolumeContext[nodeMntPathKey] + if !exists { + msg := fmt.Sprintf("volume %q doest not exist on the specified path %q", req.VolumeId, req.VolumePath) + resp.VolumeCondition.Abnormal = true + resp.VolumeCondition.Message = msg + return resp, status.Errorf(codes.NotFound, msg) + } + + if hookVal, hookMsg := s.execHook("NodeGetVolumeStatsEnd"); hookVal != codes.OK { + return nil, status.Errorf(hookVal, hookMsg) + } + + resp.Usage = []*csi.VolumeUsage{ + { + Total: v.GetCapacityBytes(), + Unit: csi.VolumeUsage_BYTES, + }, + } + + return resp, nil +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/drivers/csi-test/mock/service/service.go b/vendor/k8s.io/kubernetes/test/e2e/storage/drivers/csi-test/mock/service/service.go new file mode 100644 index 000000000000..93edbf300ed4 --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/drivers/csi-test/mock/service/service.go @@ -0,0 +1,276 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package service + +import ( + "fmt" + "os" + "strings" + "sync" + "sync/atomic" + + "github.com/container-storage-interface/spec/lib/go/csi" + "golang.org/x/net/context" + "google.golang.org/grpc/codes" + "k8s.io/kubernetes/test/e2e/storage/drivers/csi-test/mock/cache" + + "github.com/golang/protobuf/ptypes" +) + +const ( + // Name is the name of the CSI plug-in. + Name = "io.kubernetes.storage.mock" + + // VendorVersion is the version returned by GetPluginInfo. + VendorVersion = "0.3.0" + + // TopologyKey simulates a per-node topology. + TopologyKey = Name + "/node" + + // TopologyValue is the one, fixed node on which the driver runs. + TopologyValue = "some-mock-node" +) + +// Manifest is the SP's manifest. +var Manifest = map[string]string{ + "url": "https://k8s.io/kubernetes/test/e2e/storage/drivers/csi-test/mock", +} + +type Config struct { + DisableAttach bool + DriverName string + AttachLimit int64 + NodeExpansionRequired bool + DisableControllerExpansion bool + DisableOnlineExpansion bool + PermissiveTargetPath bool + EnableTopology bool + IO DirIO +} + +// DirIO is an abstraction over direct os calls. +type DirIO interface { + // DirExists returns false if the path doesn't exist, true if it exists and is a directory, an error otherwise. + DirExists(path string) (bool, error) + // Mkdir creates the directory, but not its parents, with 0755 permissions. + Mkdir(path string) error + // RemoveAll removes the path and everything contained inside it. It's not an error if the path does not exist. + RemoveAll(path string) error +} + +type OSDirIO struct{} + +func (o OSDirIO) DirExists(path string) (bool, error) { + info, err := os.Stat(path) + switch { + case err == nil && !info.IsDir(): + return false, fmt.Errorf("%s: not a directory", path) + case err == nil: + return true, nil + case os.IsNotExist(err): + return false, nil + default: + return false, err + } +} + +func (o OSDirIO) Mkdir(path string) error { + return os.Mkdir(path, os.FileMode(0755)) +} + +func (o OSDirIO) RemoveAll(path string) error { + return os.RemoveAll(path) +} + +// Service is the CSI Mock service provider. +type Service interface { + csi.ControllerServer + csi.IdentityServer + csi.NodeServer +} + +type service struct { + sync.Mutex + nodeID string + vols []csi.Volume + volsRWL sync.RWMutex + volsNID uint64 + snapshots cache.SnapshotCache + snapshotsNID uint64 + config Config +} + +type Volume struct { + VolumeCSI csi.Volume + NodeID string + ISStaged bool + ISPublished bool + ISEphemeral bool + ISControllerPublished bool + StageTargetPath string + TargetPath string +} + +var MockVolumes map[string]Volume + +// New returns a new Service. +func New(config Config) Service { + s := &service{ + nodeID: config.DriverName, + config: config, + } + if s.config.IO == nil { + s.config.IO = OSDirIO{} + } + s.snapshots = cache.NewSnapshotCache() + s.vols = []csi.Volume{ + s.newVolume("Mock Volume 1", gib100), + s.newVolume("Mock Volume 2", gib100), + s.newVolume("Mock Volume 3", gib100), + } + MockVolumes = map[string]Volume{} + + s.snapshots.Add(s.newSnapshot("Mock Snapshot 1", "1", map[string]string{"Description": "snapshot 1"})) + s.snapshots.Add(s.newSnapshot("Mock Snapshot 2", "2", map[string]string{"Description": "snapshot 2"})) + s.snapshots.Add(s.newSnapshot("Mock Snapshot 3", "3", map[string]string{"Description": "snapshot 3"})) + + return s +} + +const ( + kib int64 = 1024 + mib int64 = kib * 1024 + gib int64 = mib * 1024 + gib100 int64 = gib * 100 + tib int64 = gib * 1024 + tib100 int64 = tib * 100 +) + +func (s *service) newVolume(name string, capcity int64) csi.Volume { + vol := csi.Volume{ + VolumeId: fmt.Sprintf("%d", atomic.AddUint64(&s.volsNID, 1)), + VolumeContext: map[string]string{"name": name}, + CapacityBytes: capcity, + } + s.setTopology(&vol) + return vol +} + +func (s *service) newVolumeFromSnapshot(name string, capacity int64, snapshotID int) csi.Volume { + vol := s.newVolume(name, capacity) + vol.ContentSource = &csi.VolumeContentSource{ + Type: &csi.VolumeContentSource_Snapshot{ + Snapshot: &csi.VolumeContentSource_SnapshotSource{ + SnapshotId: fmt.Sprintf("%d", snapshotID), + }, + }, + } + s.setTopology(&vol) + return vol +} + +func (s *service) newVolumeFromVolume(name string, capacity int64, volumeID int) csi.Volume { + vol := s.newVolume(name, capacity) + vol.ContentSource = &csi.VolumeContentSource{ + Type: &csi.VolumeContentSource_Volume{ + Volume: &csi.VolumeContentSource_VolumeSource{ + VolumeId: fmt.Sprintf("%d", volumeID), + }, + }, + } + s.setTopology(&vol) + return vol +} + +func (s *service) setTopology(vol *csi.Volume) { + if s.config.EnableTopology { + vol.AccessibleTopology = []*csi.Topology{ + { + Segments: map[string]string{ + TopologyKey: TopologyValue, + }, + }, + } + } +} + +func (s *service) findVol(k, v string) (volIdx int, volInfo csi.Volume) { + s.volsRWL.RLock() + defer s.volsRWL.RUnlock() + return s.findVolNoLock(k, v) +} + +func (s *service) findVolNoLock(k, v string) (volIdx int, volInfo csi.Volume) { + volIdx = -1 + + for i, vi := range s.vols { + switch k { + case "id": + if strings.EqualFold(v, vi.GetVolumeId()) { + return i, vi + } + case "name": + if n, ok := vi.VolumeContext["name"]; ok && strings.EqualFold(v, n) { + return i, vi + } + } + } + + return +} + +func (s *service) findVolByName( + ctx context.Context, name string) (int, csi.Volume) { + + return s.findVol("name", name) +} + +func (s *service) findVolByID( + ctx context.Context, id string) (int, csi.Volume) { + + return s.findVol("id", id) +} + +func (s *service) newSnapshot(name, sourceVolumeId string, parameters map[string]string) cache.Snapshot { + + ptime := ptypes.TimestampNow() + return cache.Snapshot{ + Name: name, + Parameters: parameters, + SnapshotCSI: csi.Snapshot{ + SnapshotId: fmt.Sprintf("%d", atomic.AddUint64(&s.snapshotsNID, 1)), + CreationTime: ptime, + SourceVolumeId: sourceVolumeId, + ReadyToUse: true, + }, + } +} + +// getAttachCount returns the number of attached volumes on the node. +func (s *service) getAttachCount(devPathKey string) int64 { + var count int64 + for _, v := range s.vols { + if device := v.VolumeContext[devPathKey]; device != "" { + count++ + } + } + return count +} + +func (s *service) execHook(hookName string) (codes.Code, string) { + return codes.OK, "" +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/drivers/csi.go b/vendor/k8s.io/kubernetes/test/e2e/storage/drivers/csi.go index 03ec35e557cb..2035c8d6a11c 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/drivers/csi.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/drivers/csi.go @@ -37,13 +37,16 @@ package drivers import ( "context" + "encoding/json" + "errors" "fmt" "strconv" + "strings" + "sync" "time" - "gopkg.in/yaml.v2" - "github.com/onsi/ginkgo" + "google.golang.org/grpc/codes" v1 "k8s.io/api/core/v1" storagev1 "k8s.io/api/storage/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" @@ -51,15 +54,21 @@ import ( "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/client-go/kubernetes" clientset "k8s.io/client-go/kubernetes" + "k8s.io/klog/v2" "k8s.io/kubernetes/test/e2e/framework" e2enode "k8s.io/kubernetes/test/e2e/framework/node" e2epod "k8s.io/kubernetes/test/e2e/framework/pod" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" e2evolume "k8s.io/kubernetes/test/e2e/framework/volume" - "k8s.io/kubernetes/test/e2e/storage/testpatterns" - "k8s.io/kubernetes/test/e2e/storage/testsuites" + mockdriver "k8s.io/kubernetes/test/e2e/storage/drivers/csi-test/driver" + mockservice "k8s.io/kubernetes/test/e2e/storage/drivers/csi-test/mock/service" + "k8s.io/kubernetes/test/e2e/storage/drivers/proxy" + storageframework "k8s.io/kubernetes/test/e2e/storage/framework" "k8s.io/kubernetes/test/e2e/storage/utils" + + "google.golang.org/grpc" ) const ( @@ -67,22 +76,24 @@ const ( GCEPDCSIDriverName = "pd.csi.storage.gke.io" // GCEPDCSIZoneTopologyKey is the key of GCE Persistent Disk CSI zone topology GCEPDCSIZoneTopologyKey = "topology.gke.io/zone" + + // Prefix of the mock driver grpc log + grpcCallPrefix = "gRPCCall:" ) // hostpathCSI type hostpathCSIDriver struct { - driverInfo testsuites.DriverInfo + driverInfo storageframework.DriverInfo manifests []string - cleanupHandle framework.CleanupActionHandle volumeAttributes []map[string]string } -func initHostPathCSIDriver(name string, capabilities map[testsuites.Capability]bool, volumeAttributes []map[string]string, manifests ...string) testsuites.TestDriver { +func initHostPathCSIDriver(name string, capabilities map[storageframework.Capability]bool, volumeAttributes []map[string]string, manifests ...string) storageframework.TestDriver { return &hostpathCSIDriver{ - driverInfo: testsuites.DriverInfo{ + driverInfo: storageframework.DriverInfo{ Name: name, FeatureTag: "", - MaxFileSize: testpatterns.FileSizeMedium, + MaxFileSize: storageframework.FileSizeMedium, SupportedFsType: sets.NewString( "", // Default fsType ), @@ -90,36 +101,48 @@ func initHostPathCSIDriver(name string, capabilities map[testsuites.Capability]b Min: "1Mi", }, Capabilities: capabilities, - StressTestOptions: &testsuites.StressTestOptions{ + StressTestOptions: &storageframework.StressTestOptions{ NumPods: 10, NumRestarts: 10, }, - VolumeSnapshotStressTestOptions: &testsuites.VolumeSnapshotStressTestOptions{ + VolumeSnapshotStressTestOptions: &storageframework.VolumeSnapshotStressTestOptions{ NumPods: 10, NumSnapshots: 10, }, + PerformanceTestOptions: &storageframework.PerformanceTestOptions{ + ProvisioningOptions: &storageframework.PerformanceTestProvisioningOptions{ + VolumeSize: "1Mi", + Count: 300, + // Volume provisioning metrics are compared to a high baseline. + // Failure to pass would suggest a performance regression. + ExpectedMetrics: &storageframework.Metrics{ + AvgLatency: 2 * time.Minute, + Throughput: 0.5, + }, + }, + }, }, manifests: manifests, volumeAttributes: volumeAttributes, } } -var _ testsuites.TestDriver = &hostpathCSIDriver{} -var _ testsuites.DynamicPVTestDriver = &hostpathCSIDriver{} -var _ testsuites.SnapshottableTestDriver = &hostpathCSIDriver{} -var _ testsuites.EphemeralTestDriver = &hostpathCSIDriver{} +var _ storageframework.TestDriver = &hostpathCSIDriver{} +var _ storageframework.DynamicPVTestDriver = &hostpathCSIDriver{} +var _ storageframework.SnapshottableTestDriver = &hostpathCSIDriver{} +var _ storageframework.EphemeralTestDriver = &hostpathCSIDriver{} // InitHostPathCSIDriver returns hostpathCSIDriver that implements TestDriver interface -func InitHostPathCSIDriver() testsuites.TestDriver { - capabilities := map[testsuites.Capability]bool{ - testsuites.CapPersistence: true, - testsuites.CapSnapshotDataSource: true, - testsuites.CapMultiPODs: true, - testsuites.CapBlock: true, - testsuites.CapPVCDataSource: true, - testsuites.CapControllerExpansion: true, - testsuites.CapSingleNodeVolume: true, - testsuites.CapVolumeLimits: true, +func InitHostPathCSIDriver() storageframework.TestDriver { + capabilities := map[storageframework.Capability]bool{ + storageframework.CapPersistence: true, + storageframework.CapSnapshotDataSource: true, + storageframework.CapMultiPODs: true, + storageframework.CapBlock: true, + storageframework.CapPVCDataSource: true, + storageframework.CapControllerExpansion: true, + storageframework.CapSingleNodeVolume: true, + storageframework.CapVolumeLimits: true, } return initHostPathCSIDriver("csi-hostpath", capabilities, @@ -141,56 +164,54 @@ func InitHostPathCSIDriver() testsuites.TestDriver { ) } -func (h *hostpathCSIDriver) GetDriverInfo() *testsuites.DriverInfo { +func (h *hostpathCSIDriver) GetDriverInfo() *storageframework.DriverInfo { return &h.driverInfo } -func (h *hostpathCSIDriver) SkipUnsupportedTest(pattern testpatterns.TestPattern) { - if pattern.VolType == testpatterns.CSIInlineVolume && len(h.volumeAttributes) == 0 { +func (h *hostpathCSIDriver) SkipUnsupportedTest(pattern storageframework.TestPattern) { + if pattern.VolType == storageframework.CSIInlineVolume && len(h.volumeAttributes) == 0 { e2eskipper.Skipf("%s has no volume attributes defined, doesn't support ephemeral inline volumes", h.driverInfo.Name) } } -func (h *hostpathCSIDriver) GetDynamicProvisionStorageClass(config *testsuites.PerTestConfig, fsType string) *storagev1.StorageClass { +func (h *hostpathCSIDriver) GetDynamicProvisionStorageClass(config *storageframework.PerTestConfig, fsType string) *storagev1.StorageClass { provisioner := config.GetUniqueDriverName() parameters := map[string]string{} ns := config.Framework.Namespace.Name - suffix := fmt.Sprintf("%s-sc", provisioner) - return testsuites.GetStorageClass(provisioner, parameters, nil, ns, suffix) + return storageframework.GetStorageClass(provisioner, parameters, nil, ns) } -func (h *hostpathCSIDriver) GetVolume(config *testsuites.PerTestConfig, volumeNumber int) (map[string]string, bool, bool) { +func (h *hostpathCSIDriver) GetVolume(config *storageframework.PerTestConfig, volumeNumber int) (map[string]string, bool, bool) { return h.volumeAttributes[volumeNumber%len(h.volumeAttributes)], false /* not shared */, false /* read-write */ } -func (h *hostpathCSIDriver) GetCSIDriverName(config *testsuites.PerTestConfig) string { +func (h *hostpathCSIDriver) GetCSIDriverName(config *storageframework.PerTestConfig) string { return config.GetUniqueDriverName() } -func (h *hostpathCSIDriver) GetSnapshotClass(config *testsuites.PerTestConfig) *unstructured.Unstructured { +func (h *hostpathCSIDriver) GetSnapshotClass(config *storageframework.PerTestConfig, parameters map[string]string) *unstructured.Unstructured { snapshotter := config.GetUniqueDriverName() - parameters := map[string]string{} ns := config.Framework.Namespace.Name suffix := fmt.Sprintf("%s-vsc", snapshotter) - return testsuites.GetSnapshotClass(snapshotter, parameters, ns, suffix) + return utils.GenerateSnapshotClassSpec(snapshotter, parameters, ns, suffix) } -func (h *hostpathCSIDriver) PrepareTest(f *framework.Framework) (*testsuites.PerTestConfig, func()) { +func (h *hostpathCSIDriver) PrepareTest(f *framework.Framework) (*storageframework.PerTestConfig, func()) { // Create secondary namespace which will be used for creating driver driverNamespace := utils.CreateDriverNamespace(f) - ns2 := driverNamespace.Name - ns1 := f.Namespace.Name + driverns := driverNamespace.Name + testns := f.Namespace.Name ginkgo.By(fmt.Sprintf("deploying %s driver", h.driverInfo.Name)) - cancelLogging := testsuites.StartPodLogs(f, driverNamespace) + cancelLogging := utils.StartPodLogs(f, driverNamespace) cs := f.ClientSet // The hostpath CSI driver only works when everything runs on the same node. node, err := e2enode.GetRandomReadySchedulableNode(cs) framework.ExpectNoError(err) - config := &testsuites.PerTestConfig{ + config := &storageframework.PerTestConfig{ Driver: h, Prefix: "hostpath", Framework: f, @@ -215,35 +236,20 @@ func (h *hostpathCSIDriver) PrepareTest(f *framework.Framework) (*testsuites.Per framework.Failf("deploying %s driver: %v", h.driverInfo.Name, err) } - // Cleanup CSI driver and namespaces. This function needs to be idempotent and can be - // concurrently called from defer (or AfterEach) and AfterSuite action hooks. - cleanupFunc := func() { - ginkgo.By(fmt.Sprintf("deleting the test namespace: %s", ns1)) - // Delete the primary namespace but its okay to fail here because this namespace will - // also be deleted by framework.Aftereach hook - tryFunc(func() { f.DeleteNamespace(ns1) }) - - ginkgo.By("uninstalling csi mock driver") - tryFunc(cleanup) - tryFunc(cancelLogging) - - ginkgo.By(fmt.Sprintf("deleting the driver namespace: %s", ns2)) - tryFunc(func() { f.DeleteNamespace(ns2) }) - // cleanup function has already ran and hence we don't need to run it again. - // We do this as very last action because in-case defer(or AfterEach) races - // with AfterSuite and test routine gets killed then this block still - // runs in AfterSuite - framework.RemoveCleanupAction(h.cleanupHandle) - - } - h.cleanupHandle = framework.AddCleanupAction(cleanupFunc) + cleanupFunc := generateDriverCleanupFunc( + f, + h.driverInfo.Name, + testns, + driverns, + cleanup, + cancelLogging) return config, cleanupFunc } // mockCSI type mockCSIDriver struct { - driverInfo testsuites.DriverInfo + driverInfo storageframework.DriverInfo manifests []string podInfo *bool storageCapacity *bool @@ -251,11 +257,42 @@ type mockCSIDriver struct { attachLimit int enableTopology bool enableNodeExpansion bool - cleanupHandle framework.CleanupActionHandle - javascriptHooks map[string]string + hooks Hooks tokenRequests []storagev1.TokenRequest requiresRepublish *bool fsGroupPolicy *storagev1.FSGroupPolicy + embedded bool + calls MockCSICalls + embeddedCSIDriver *mockdriver.CSIDriver + + // Additional values set during PrepareTest + clientSet kubernetes.Interface + driverNamespace *v1.Namespace +} + +// Hooks to be run to execute while handling gRPC calls. +// +// At the moment, only generic pre- and post-function call +// hooks are implemented. Those hooks can cast the request and +// response values if needed. More hooks inside specific +// functions could be added if needed. +type Hooks struct { + // Pre is called before invoking the mock driver's implementation of a method. + // If either a non-nil reply or error are returned, then those are returned to the caller. + Pre func(ctx context.Context, method string, request interface{}) (reply interface{}, err error) + + // Post is called after invoking the mock driver's implementation of a method. + // What it returns is used as actual result. + Post func(ctx context.Context, method string, request, reply interface{}, err error) (finalReply interface{}, finalErr error) +} + +// MockCSITestDriver provides additional functions specific to the CSI mock driver. +type MockCSITestDriver interface { + storageframework.DynamicPVTestDriver + + // GetCalls returns all currently observed gRPC calls. Only valid + // after PrepareTest. + GetCalls() ([]MockCSICall, error) } // CSIMockDriverOpts defines options used for csi driver @@ -269,18 +306,104 @@ type CSIMockDriverOpts struct { EnableResizing bool EnableNodeExpansion bool EnableSnapshot bool - JavascriptHooks map[string]string TokenRequests []storagev1.TokenRequest RequiresRepublish *bool FSGroupPolicy *storagev1.FSGroupPolicy + + // Embedded defines whether the CSI mock driver runs + // inside the cluster (false, the default) or just a proxy + // runs inside the cluster and all gRPC calls are handled + // inside the e2e.test binary. + Embedded bool + + // Hooks that will be called if (and only if!) the embedded + // mock driver is used. Beware that hooks are invoked + // asynchronously in different goroutines. + Hooks Hooks } -var _ testsuites.TestDriver = &mockCSIDriver{} -var _ testsuites.DynamicPVTestDriver = &mockCSIDriver{} -var _ testsuites.SnapshottableTestDriver = &mockCSIDriver{} +// Dummy structure that parses just volume_attributes and error code out of logged CSI call +type MockCSICall struct { + json string // full log entry + + Method string + Request struct { + VolumeContext map[string]string `json:"volume_context"` + } + FullError struct { + Code codes.Code `json:"code"` + Message string `json:"message"` + } + Error string +} + +// MockCSICalls is a Thread-safe storage for MockCSICall instances. +type MockCSICalls struct { + calls []MockCSICall + mutex sync.Mutex +} + +// Get returns all currently recorded calls. +func (c *MockCSICalls) Get() []MockCSICall { + c.mutex.Lock() + defer c.mutex.Unlock() + + return c.calls[:] +} + +// Add appens one new call at the end. +func (c *MockCSICalls) Add(call MockCSICall) { + c.mutex.Lock() + defer c.mutex.Unlock() + + c.calls = append(c.calls, call) +} + +// LogGRPC takes individual parameters from the mock CSI driver and adds them. +func (c *MockCSICalls) LogGRPC(method string, request, reply interface{}, err error) { + // Encoding to JSON and decoding mirrors the traditional way of capturing calls. + // Probably could be simplified now... + logMessage := struct { + Method string + Request interface{} + Response interface{} + // Error as string, for backward compatibility. + // "" on no error. + Error string + // Full error dump, to be able to parse out full gRPC error code and message separately in a test. + FullError error + }{ + Method: method, + Request: request, + Response: reply, + FullError: err, + } + + if err != nil { + logMessage.Error = err.Error() + } + + msg, _ := json.Marshal(logMessage) + call := MockCSICall{ + json: string(msg), + } + json.Unmarshal(msg, &call) + + klog.Infof("%s %s", grpcCallPrefix, string(msg)) + + // Trim gRPC service name, i.e. "/csi.v1.Identity/Probe" -> "Probe" + methodParts := strings.Split(call.Method, "/") + call.Method = methodParts[len(methodParts)-1] + + c.Add(call) +} + +var _ storageframework.TestDriver = &mockCSIDriver{} +var _ storageframework.DynamicPVTestDriver = &mockCSIDriver{} +var _ storageframework.SnapshottableTestDriver = &mockCSIDriver{} // InitMockCSIDriver returns a mockCSIDriver that implements TestDriver interface -func InitMockCSIDriver(driverOpts CSIMockDriverOpts) testsuites.TestDriver { +func InitMockCSIDriver(driverOpts CSIMockDriverOpts) MockCSITestDriver { driverManifests := []string{ "test/e2e/testing-manifests/storage-csi/external-attacher/rbac.yaml", "test/e2e/testing-manifests/storage-csi/external-provisioner/rbac.yaml", @@ -288,7 +411,11 @@ func InitMockCSIDriver(driverOpts CSIMockDriverOpts) testsuites.TestDriver { "test/e2e/testing-manifests/storage-csi/external-snapshotter/rbac.yaml", "test/e2e/testing-manifests/storage-csi/mock/csi-mock-rbac.yaml", "test/e2e/testing-manifests/storage-csi/mock/csi-storageclass.yaml", - "test/e2e/testing-manifests/storage-csi/mock/csi-mock-driver.yaml", + } + if driverOpts.Embedded { + driverManifests = append(driverManifests, "test/e2e/testing-manifests/storage-csi/mock/csi-mock-proxy.yaml") + } else { + driverManifests = append(driverManifests, "test/e2e/testing-manifests/storage-csi/mock/csi-mock-driver.yaml") } if driverOpts.RegisterDriver { @@ -308,18 +435,18 @@ func InitMockCSIDriver(driverOpts CSIMockDriverOpts) testsuites.TestDriver { } return &mockCSIDriver{ - driverInfo: testsuites.DriverInfo{ + driverInfo: storageframework.DriverInfo{ Name: "csi-mock", FeatureTag: "", - MaxFileSize: testpatterns.FileSizeMedium, + MaxFileSize: storageframework.FileSizeMedium, SupportedFsType: sets.NewString( "", // Default fsType ), - Capabilities: map[testsuites.Capability]bool{ - testsuites.CapPersistence: false, - testsuites.CapFsGroup: false, - testsuites.CapExec: false, - testsuites.CapVolumeLimits: true, + Capabilities: map[storageframework.Capability]bool{ + storageframework.CapPersistence: false, + storageframework.CapFsGroup: false, + storageframework.CapExec: false, + storageframework.CapVolumeLimits: true, }, }, manifests: driverManifests, @@ -329,95 +456,140 @@ func InitMockCSIDriver(driverOpts CSIMockDriverOpts) testsuites.TestDriver { attachable: !driverOpts.DisableAttach, attachLimit: driverOpts.AttachLimit, enableNodeExpansion: driverOpts.EnableNodeExpansion, - javascriptHooks: driverOpts.JavascriptHooks, tokenRequests: driverOpts.TokenRequests, requiresRepublish: driverOpts.RequiresRepublish, fsGroupPolicy: driverOpts.FSGroupPolicy, + embedded: driverOpts.Embedded, + hooks: driverOpts.Hooks, } } -func (m *mockCSIDriver) GetDriverInfo() *testsuites.DriverInfo { +func (m *mockCSIDriver) GetDriverInfo() *storageframework.DriverInfo { return &m.driverInfo } -func (m *mockCSIDriver) SkipUnsupportedTest(pattern testpatterns.TestPattern) { +func (m *mockCSIDriver) SkipUnsupportedTest(pattern storageframework.TestPattern) { } -func (m *mockCSIDriver) GetDynamicProvisionStorageClass(config *testsuites.PerTestConfig, fsType string) *storagev1.StorageClass { +func (m *mockCSIDriver) GetDynamicProvisionStorageClass(config *storageframework.PerTestConfig, fsType string) *storagev1.StorageClass { provisioner := config.GetUniqueDriverName() parameters := map[string]string{} ns := config.Framework.Namespace.Name - suffix := fmt.Sprintf("%s-sc", provisioner) - return testsuites.GetStorageClass(provisioner, parameters, nil, ns, suffix) + return storageframework.GetStorageClass(provisioner, parameters, nil, ns) } -func (m *mockCSIDriver) GetSnapshotClass(config *testsuites.PerTestConfig) *unstructured.Unstructured { - parameters := map[string]string{} +func (m *mockCSIDriver) GetSnapshotClass(config *storageframework.PerTestConfig, parameters map[string]string) *unstructured.Unstructured { snapshotter := m.driverInfo.Name + "-" + config.Framework.UniqueName ns := config.Framework.Namespace.Name suffix := fmt.Sprintf("%s-vsc", snapshotter) - return testsuites.GetSnapshotClass(snapshotter, parameters, ns, suffix) + return utils.GenerateSnapshotClassSpec(snapshotter, parameters, ns, suffix) } -func (m *mockCSIDriver) PrepareTest(f *framework.Framework) (*testsuites.PerTestConfig, func()) { +func (m *mockCSIDriver) PrepareTest(f *framework.Framework) (*storageframework.PerTestConfig, func()) { + m.clientSet = f.ClientSet + // Create secondary namespace which will be used for creating driver - driverNamespace := utils.CreateDriverNamespace(f) - ns2 := driverNamespace.Name - ns1 := f.Namespace.Name + m.driverNamespace = utils.CreateDriverNamespace(f) + driverns := m.driverNamespace.Name + testns := f.Namespace.Name - ginkgo.By("deploying csi mock driver") - cancelLogging := testsuites.StartPodLogs(f, driverNamespace) + if m.embedded { + ginkgo.By("deploying csi mock proxy") + } else { + ginkgo.By("deploying csi mock driver") + } + cancelLogging := utils.StartPodLogs(f, m.driverNamespace) cs := f.ClientSet // pods should be scheduled on the node node, err := e2enode.GetRandomReadySchedulableNode(cs) framework.ExpectNoError(err) - config := &testsuites.PerTestConfig{ - Driver: m, - Prefix: "mock", - Framework: f, - ClientNodeSelection: e2epod.NodeSelection{Name: node.Name}, - DriverNamespace: driverNamespace, - } - containerArgs := []string{"--name=csi-mock-" + f.UniqueName} - if !m.attachable { - containerArgs = append(containerArgs, "--disable-attach") - } + embeddedCleanup := func() {} + containerArgs := []string{} + if m.embedded { + // Run embedded CSI driver. + // + // For now we start exactly one instance which implements controller, + // node and identity services. It matches with the one pod that we run + // inside the cluster. The name and namespace of that one is deterministic, + // so we know what to connect to. + // + // Long-term we could also deploy one central controller and multiple + // node instances, with knowledge about provisioned volumes shared in + // this process. + podname := "csi-mockplugin-0" + containername := "mock" + ctx, cancel := context.WithCancel(context.Background()) + serviceConfig := mockservice.Config{ + DisableAttach: !m.attachable, + DriverName: "csi-mock-" + f.UniqueName, + AttachLimit: int64(m.attachLimit), + NodeExpansionRequired: m.enableNodeExpansion, + EnableTopology: m.enableTopology, + IO: proxy.PodDirIO{ + F: f, + Namespace: m.driverNamespace.Name, + PodName: podname, + ContainerName: "busybox", + }, + } + s := mockservice.New(serviceConfig) + servers := &mockdriver.CSIDriverServers{ + Controller: s, + Identity: s, + Node: s, + } + m.embeddedCSIDriver = mockdriver.NewCSIDriver(servers) + + l, err := proxy.Listen(ctx, f.ClientSet, f.ClientConfig(), + proxy.Addr{ + Namespace: m.driverNamespace.Name, + PodName: podname, + ContainerName: containername, + Port: 9000, + }, + ) + framework.ExpectNoError(err, "start connecting to proxy pod") + err = m.embeddedCSIDriver.Start(l, m.interceptGRPC) + framework.ExpectNoError(err, "start mock driver") + + embeddedCleanup = func() { + // Kill all goroutines and delete resources of the mock driver. + m.embeddedCSIDriver.Stop() + l.Close() + cancel() + } + } else { + // When using the mock driver inside the cluster it has to be reconfigured + // via command line parameters. + containerArgs = append(containerArgs, "--name=csi-mock-"+f.UniqueName) - if m.enableTopology { - containerArgs = append(containerArgs, "--enable-topology") - } + if !m.attachable { + containerArgs = append(containerArgs, "--disable-attach") + } - if m.attachLimit > 0 { - containerArgs = append(containerArgs, "--attach-limit", strconv.Itoa(m.attachLimit)) - } + if m.enableTopology { + containerArgs = append(containerArgs, "--enable-topology") + } - if m.enableNodeExpansion { - containerArgs = append(containerArgs, "--node-expand-required=true") - } + if m.attachLimit > 0 { + containerArgs = append(containerArgs, "--attach-limit", strconv.Itoa(m.attachLimit)) + } - // Create a config map with javascript hooks. Create it even when javascriptHooks - // are empty, so we can unconditionally add it to the mock pod. - const hooksConfigMapName = "mock-driver-hooks" - hooksYaml, err := yaml.Marshal(m.javascriptHooks) - framework.ExpectNoError(err) - hooks := &v1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Name: hooksConfigMapName, - }, - Data: map[string]string{ - "hooks.yaml": string(hooksYaml), - }, + if m.enableNodeExpansion { + containerArgs = append(containerArgs, "--node-expand-required=true") + } } - _, err = f.ClientSet.CoreV1().ConfigMaps(ns2).Create(context.TODO(), hooks, metav1.CreateOptions{}) - framework.ExpectNoError(err) - - if len(m.javascriptHooks) > 0 { - containerArgs = append(containerArgs, "--hooks-file=/etc/hooks/hooks.yaml") + config := &storageframework.PerTestConfig{ + Driver: m, + Prefix: "mock", + Framework: f, + ClientNodeSelection: e2epod.NodeSelection{Name: node.Name}, + DriverNamespace: m.driverNamespace, } o := utils.PatchCSIOptions{ @@ -438,7 +610,7 @@ func (m *mockCSIDriver) PrepareTest(f *framework.Framework) (*testsuites.PerTest RequiresRepublish: m.requiresRepublish, FSGroupPolicy: m.fsGroupPolicy, } - cleanup, err := utils.CreateFromManifests(f, driverNamespace, func(item interface{}) error { + cleanup, err := utils.CreateFromManifests(f, m.driverNamespace, func(item interface{}) error { return utils.PatchCSIDeployment(f, o, item) }, m.manifests...) @@ -446,56 +618,105 @@ func (m *mockCSIDriver) PrepareTest(f *framework.Framework) (*testsuites.PerTest framework.Failf("deploying csi mock driver: %v", err) } - // Cleanup CSI driver and namespaces. This function needs to be idempotent and can be - // concurrently called from defer (or AfterEach) and AfterSuite action hooks. + driverCleanupFunc := generateDriverCleanupFunc( + f, + "mock", + testns, + driverns, + cleanup, + cancelLogging) + cleanupFunc := func() { - ginkgo.By(fmt.Sprintf("deleting the test namespace: %s", ns1)) - // Delete the primary namespace but its okay to fail here because this namespace will - // also be deleted by framework.Aftereach hook - tryFunc(func() { f.DeleteNamespace(ns1) }) + embeddedCleanup() + driverCleanupFunc() + } - ginkgo.By("uninstalling csi mock driver") - tryFunc(func() { - err := f.ClientSet.CoreV1().ConfigMaps(ns2).Delete(context.TODO(), hooksConfigMapName, metav1.DeleteOptions{}) - if err != nil { - framework.Logf("deleting failed: %s", err) - } - }) + return config, cleanupFunc +} - tryFunc(cleanup) - tryFunc(cancelLogging) - ginkgo.By(fmt.Sprintf("deleting the driver namespace: %s", ns2)) - tryFunc(func() { f.DeleteNamespace(ns2) }) - // cleanup function has already ran and hence we don't need to run it again. - // We do this as very last action because in-case defer(or AfterEach) races - // with AfterSuite and test routine gets killed then this block still - // runs in AfterSuite - framework.RemoveCleanupAction(m.cleanupHandle) +func (m *mockCSIDriver) interceptGRPC(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) { + defer func() { + // Always log the call and its final result, + // regardless whether the result was from the real + // implementation or a hook. + m.calls.LogGRPC(info.FullMethod, req, resp, err) + }() + if m.hooks.Pre != nil { + resp, err = m.hooks.Pre(ctx, info.FullMethod, req) + if resp != nil || err != nil { + return + } } + resp, err = handler(ctx, req) + if m.hooks.Post != nil { + resp, err = m.hooks.Post(ctx, info.FullMethod, req, resp, err) + } + return +} - m.cleanupHandle = framework.AddCleanupAction(cleanupFunc) +func (m *mockCSIDriver) GetCalls() ([]MockCSICall, error) { + if m.embedded { + return m.calls.Get(), nil + } - return config, cleanupFunc + if m.driverNamespace == nil { + return nil, errors.New("PrepareTest not called yet") + } + + // Name of CSI driver pod name (it's in a StatefulSet with a stable name) + driverPodName := "csi-mockplugin-0" + // Name of CSI driver container name + driverContainerName := "mock" + + // Load logs of driver pod + log, err := e2epod.GetPodLogs(m.clientSet, m.driverNamespace.Name, driverPodName, driverContainerName) + if err != nil { + return nil, fmt.Errorf("could not load CSI driver logs: %s", err) + } + + logLines := strings.Split(log, "\n") + var calls []MockCSICall + for _, line := range logLines { + index := strings.Index(line, grpcCallPrefix) + if index == -1 { + continue + } + line = line[index+len(grpcCallPrefix):] + call := MockCSICall{ + json: string(line), + } + err := json.Unmarshal([]byte(line), &call) + if err != nil { + framework.Logf("Could not parse CSI driver log line %q: %s", line, err) + continue + } + + // Trim gRPC service name, i.e. "/csi.v1.Identity/Probe" -> "Probe" + methodParts := strings.Split(call.Method, "/") + call.Method = methodParts[len(methodParts)-1] + + calls = append(calls, call) + } + return calls, nil } // gce-pd type gcePDCSIDriver struct { - driverInfo testsuites.DriverInfo - cleanupHandle framework.CleanupActionHandle + driverInfo storageframework.DriverInfo } -var _ testsuites.TestDriver = &gcePDCSIDriver{} -var _ testsuites.DynamicPVTestDriver = &gcePDCSIDriver{} -var _ testsuites.SnapshottableTestDriver = &gcePDCSIDriver{} +var _ storageframework.TestDriver = &gcePDCSIDriver{} +var _ storageframework.DynamicPVTestDriver = &gcePDCSIDriver{} +var _ storageframework.SnapshottableTestDriver = &gcePDCSIDriver{} // InitGcePDCSIDriver returns gcePDCSIDriver that implements TestDriver interface -func InitGcePDCSIDriver() testsuites.TestDriver { +func InitGcePDCSIDriver() storageframework.TestDriver { return &gcePDCSIDriver{ - driverInfo: testsuites.DriverInfo{ + driverInfo: storageframework.DriverInfo{ Name: GCEPDCSIDriverName, FeatureTag: "[Serial]", - MaxFileSize: testpatterns.FileSizeMedium, + MaxFileSize: storageframework.FileSizeMedium, SupportedSizeRange: e2evolume.SizeRange{ Min: "5Gi", }, @@ -507,27 +728,27 @@ func InitGcePDCSIDriver() testsuites.TestDriver { "xfs", ), SupportedMountOption: sets.NewString("debug", "nouid32"), - Capabilities: map[testsuites.Capability]bool{ - testsuites.CapPersistence: true, - testsuites.CapBlock: true, - testsuites.CapFsGroup: true, - testsuites.CapExec: true, - testsuites.CapMultiPODs: true, + Capabilities: map[storageframework.Capability]bool{ + storageframework.CapPersistence: true, + storageframework.CapBlock: true, + storageframework.CapFsGroup: true, + storageframework.CapExec: true, + storageframework.CapMultiPODs: true, // GCE supports volume limits, but the test creates large // number of volumes and times out test suites. - testsuites.CapVolumeLimits: false, - testsuites.CapTopology: true, - testsuites.CapControllerExpansion: true, - testsuites.CapNodeExpansion: true, - testsuites.CapSnapshotDataSource: true, + storageframework.CapVolumeLimits: false, + storageframework.CapTopology: true, + storageframework.CapControllerExpansion: true, + storageframework.CapNodeExpansion: true, + storageframework.CapSnapshotDataSource: true, }, RequiredAccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce}, TopologyKeys: []string{GCEPDCSIZoneTopologyKey}, - StressTestOptions: &testsuites.StressTestOptions{ + StressTestOptions: &storageframework.StressTestOptions{ NumPods: 10, NumRestarts: 10, }, - VolumeSnapshotStressTestOptions: &testsuites.VolumeSnapshotStressTestOptions{ + VolumeSnapshotStressTestOptions: &storageframework.VolumeSnapshotStressTestOptions{ // GCE only allows for one snapshot per volume to be created at a time, // which can cause test timeouts. We reduce the likelihood of test timeouts // by increasing the number of pods (and volumes) and reducing the number @@ -539,24 +760,23 @@ func InitGcePDCSIDriver() testsuites.TestDriver { } } -func (g *gcePDCSIDriver) GetDriverInfo() *testsuites.DriverInfo { +func (g *gcePDCSIDriver) GetDriverInfo() *storageframework.DriverInfo { return &g.driverInfo } -func (g *gcePDCSIDriver) SkipUnsupportedTest(pattern testpatterns.TestPattern) { +func (g *gcePDCSIDriver) SkipUnsupportedTest(pattern storageframework.TestPattern) { e2eskipper.SkipUnlessProviderIs("gce", "gke") if pattern.FsType == "xfs" { e2eskipper.SkipUnlessNodeOSDistroIs("ubuntu", "custom") } - if pattern.FeatureTag == "[sig-windows]" { + if pattern.FeatureTag == "[Feature:Windows]" { e2eskipper.Skipf("Skipping tests for windows since CSI does not support it yet") } } -func (g *gcePDCSIDriver) GetDynamicProvisionStorageClass(config *testsuites.PerTestConfig, fsType string) *storagev1.StorageClass { +func (g *gcePDCSIDriver) GetDynamicProvisionStorageClass(config *storageframework.PerTestConfig, fsType string) *storagev1.StorageClass { ns := config.Framework.Namespace.Name provisioner := g.driverInfo.Name - suffix := fmt.Sprintf("%s-sc", g.driverInfo.Name) parameters := map[string]string{"type": "pd-standard"} if fsType != "" { @@ -564,26 +784,36 @@ func (g *gcePDCSIDriver) GetDynamicProvisionStorageClass(config *testsuites.PerT } delayedBinding := storagev1.VolumeBindingWaitForFirstConsumer - return testsuites.GetStorageClass(provisioner, parameters, &delayedBinding, ns, suffix) + return storageframework.GetStorageClass(provisioner, parameters, &delayedBinding, ns) } -func (g *gcePDCSIDriver) GetSnapshotClass(config *testsuites.PerTestConfig) *unstructured.Unstructured { - parameters := map[string]string{} +func (g *gcePDCSIDriver) GetSnapshotClass(config *storageframework.PerTestConfig, parameters map[string]string) *unstructured.Unstructured { snapshotter := g.driverInfo.Name ns := config.Framework.Namespace.Name suffix := fmt.Sprintf("%s-vsc", snapshotter) - return testsuites.GetSnapshotClass(snapshotter, parameters, ns, suffix) + return utils.GenerateSnapshotClassSpec(snapshotter, parameters, ns, suffix) } -func (g *gcePDCSIDriver) PrepareTest(f *framework.Framework) (*testsuites.PerTestConfig, func()) { +func (g *gcePDCSIDriver) PrepareTest(f *framework.Framework) (*storageframework.PerTestConfig, func()) { + testns := f.Namespace.Name + cfg := &storageframework.PerTestConfig{ + Driver: g, + Prefix: "gcepd", + Framework: f, + } + + if framework.ProviderIs("gke") { + framework.Logf("The csi gce-pd driver is automatically installed in GKE. Skipping driver installation.") + return cfg, func() {} + } + ginkgo.By("deploying csi gce-pd driver") // Create secondary namespace which will be used for creating driver driverNamespace := utils.CreateDriverNamespace(f) - ns2 := driverNamespace.Name - ns1 := f.Namespace.Name + driverns := driverNamespace.Name - cancelLogging := testsuites.StartPodLogs(f, driverNamespace) + cancelLogging := utils.StartPodLogs(f, driverNamespace) // It would be safer to rename the gcePD driver, but that // hasn't been done before either and attempts to do so now led to // errors during driver registration, therefore it is disabled @@ -592,11 +822,11 @@ func (g *gcePDCSIDriver) PrepareTest(f *framework.Framework) (*testsuites.PerTes // These are the options which would have to be used: // o := utils.PatchCSIOptions{ // OldDriverName: g.driverInfo.Name, - // NewDriverName: testsuites.GetUniqueDriverName(g), + // NewDriverName: storageframework.GetUniqueDriverName(g), // DriverContainerName: "gce-driver", // ProvisionerContainerName: "csi-external-provisioner", // } - createGCESecrets(f.ClientSet, ns2) + createGCESecrets(f.ClientSet, driverns) manifests := []string{ "test/e2e/testing-manifests/storage-csi/external-attacher/rbac.yaml", @@ -615,30 +845,15 @@ func (g *gcePDCSIDriver) PrepareTest(f *framework.Framework) (*testsuites.PerTes framework.Failf("waiting for csi driver node registration on: %v", err) } - // Cleanup CSI driver and namespaces. This function needs to be idempotent and can be - // concurrently called from defer (or AfterEach) and AfterSuite action hooks. - cleanupFunc := func() { - ginkgo.By(fmt.Sprintf("deleting the test namespace: %s", ns1)) - // Delete the primary namespace but its okay to fail here because this namespace will - // also be deleted by framework.Aftereach hook - tryFunc(func() { f.DeleteNamespace(ns1) }) - - ginkgo.By("uninstalling csi mock driver") - tryFunc(cleanup) - tryFunc(cancelLogging) + cleanupFunc := generateDriverCleanupFunc( + f, + "gce-pd", + testns, + driverns, + cleanup, + cancelLogging) - ginkgo.By(fmt.Sprintf("deleting the driver namespace: %s", ns2)) - tryFunc(func() { f.DeleteNamespace(ns2) }) - // cleanup function has already ran and hence we don't need to run it again. - // We do this as very last action because in-case defer(or AfterEach) races - // with AfterSuite and test routine gets killed then this block still - // runs in AfterSuite - framework.RemoveCleanupAction(g.cleanupHandle) - - } - g.cleanupHandle = framework.AddCleanupAction(cleanupFunc) - - return &testsuites.PerTestConfig{ + return &storageframework.PerTestConfig{ Driver: g, Prefix: "gcepd", Framework: f, @@ -703,3 +918,35 @@ func tryFunc(f func()) error { f() return err } + +func generateDriverCleanupFunc( + f *framework.Framework, + driverName, testns, driverns string, + driverCleanup, cancelLogging func()) func() { + + cleanupHandle := new(framework.CleanupActionHandle) + + // Cleanup CSI driver and namespaces. This function needs to be idempotent and can be + // concurrently called from defer (or AfterEach) and AfterSuite action hooks. + cleanupFunc := func() { + ginkgo.By(fmt.Sprintf("deleting the test namespace: %s", testns)) + // Delete the primary namespace but it's okay to fail here because this namespace will + // also be deleted by framework.Aftereach hook + tryFunc(func() { f.DeleteNamespace(testns) }) + + ginkgo.By(fmt.Sprintf("uninstalling csi %s driver", driverName)) + tryFunc(driverCleanup) + tryFunc(cancelLogging) + + ginkgo.By(fmt.Sprintf("deleting the driver namespace: %s", driverns)) + tryFunc(func() { f.DeleteNamespace(driverns) }) + // cleanup function has already ran and hence we don't need to run it again. + // We do this as very last action because in-case defer(or AfterEach) races + // with AfterSuite and test routine gets killed then this block still + // runs in AfterSuite + framework.RemoveCleanupAction(*cleanupHandle) + } + + *cleanupHandle = framework.AddCleanupAction(cleanupFunc) + return cleanupFunc +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/drivers/in_tree.go b/vendor/k8s.io/kubernetes/test/e2e/storage/drivers/in_tree.go index 47bca14d67bf..787f2a396147 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/drivers/in_tree.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/drivers/in_tree.go @@ -60,8 +60,7 @@ import ( e2epv "k8s.io/kubernetes/test/e2e/framework/pv" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" e2evolume "k8s.io/kubernetes/test/e2e/framework/volume" - "k8s.io/kubernetes/test/e2e/storage/testpatterns" - "k8s.io/kubernetes/test/e2e/storage/testsuites" + storageframework "k8s.io/kubernetes/test/e2e/storage/framework" "k8s.io/kubernetes/test/e2e/storage/utils" vspheretest "k8s.io/kubernetes/test/e2e/storage/vsphere" imageutils "k8s.io/kubernetes/test/utils/image" @@ -77,7 +76,7 @@ type nfsDriver struct { externalProvisionerPod *v1.Pod externalPluginName string - driverInfo testsuites.DriverInfo + driverInfo storageframework.DriverInfo } type nfsVolume struct { @@ -86,19 +85,19 @@ type nfsVolume struct { f *framework.Framework } -var _ testsuites.TestDriver = &nfsDriver{} -var _ testsuites.PreprovisionedVolumeTestDriver = &nfsDriver{} -var _ testsuites.InlineVolumeTestDriver = &nfsDriver{} -var _ testsuites.PreprovisionedPVTestDriver = &nfsDriver{} -var _ testsuites.DynamicPVTestDriver = &nfsDriver{} +var _ storageframework.TestDriver = &nfsDriver{} +var _ storageframework.PreprovisionedVolumeTestDriver = &nfsDriver{} +var _ storageframework.InlineVolumeTestDriver = &nfsDriver{} +var _ storageframework.PreprovisionedPVTestDriver = &nfsDriver{} +var _ storageframework.DynamicPVTestDriver = &nfsDriver{} // InitNFSDriver returns nfsDriver that implements TestDriver interface -func InitNFSDriver() testsuites.TestDriver { +func InitNFSDriver() storageframework.TestDriver { return &nfsDriver{ - driverInfo: testsuites.DriverInfo{ + driverInfo: storageframework.DriverInfo{ Name: "nfs", InTreePluginName: "kubernetes.io/nfs", - MaxFileSize: testpatterns.FileSizeLarge, + MaxFileSize: storageframework.FileSizeLarge, SupportedSizeRange: e2evolume.SizeRange{ Min: "1Gi", }, @@ -107,24 +106,24 @@ func InitNFSDriver() testsuites.TestDriver { ), SupportedMountOption: sets.NewString("proto=tcp", "relatime"), RequiredMountOption: sets.NewString("vers=4.1"), - Capabilities: map[testsuites.Capability]bool{ - testsuites.CapPersistence: true, - testsuites.CapExec: true, - testsuites.CapRWX: true, - testsuites.CapMultiPODs: true, + Capabilities: map[storageframework.Capability]bool{ + storageframework.CapPersistence: true, + storageframework.CapExec: true, + storageframework.CapRWX: true, + storageframework.CapMultiPODs: true, }, }, } } -func (n *nfsDriver) GetDriverInfo() *testsuites.DriverInfo { +func (n *nfsDriver) GetDriverInfo() *storageframework.DriverInfo { return &n.driverInfo } -func (n *nfsDriver) SkipUnsupportedTest(pattern testpatterns.TestPattern) { +func (n *nfsDriver) SkipUnsupportedTest(pattern storageframework.TestPattern) { } -func (n *nfsDriver) GetVolumeSource(readOnly bool, fsType string, e2evolume testsuites.TestVolume) *v1.VolumeSource { +func (n *nfsDriver) GetVolumeSource(readOnly bool, fsType string, e2evolume storageframework.TestVolume) *v1.VolumeSource { nv, ok := e2evolume.(*nfsVolume) framework.ExpectEqual(ok, true, "Failed to cast test volume to NFS test volume") return &v1.VolumeSource{ @@ -136,7 +135,7 @@ func (n *nfsDriver) GetVolumeSource(readOnly bool, fsType string, e2evolume test } } -func (n *nfsDriver) GetPersistentVolumeSource(readOnly bool, fsType string, e2evolume testsuites.TestVolume) (*v1.PersistentVolumeSource, *v1.VolumeNodeAffinity) { +func (n *nfsDriver) GetPersistentVolumeSource(readOnly bool, fsType string, e2evolume storageframework.TestVolume) (*v1.PersistentVolumeSource, *v1.VolumeNodeAffinity) { nv, ok := e2evolume.(*nfsVolume) framework.ExpectEqual(ok, true, "Failed to cast test volume to NFS test volume") return &v1.PersistentVolumeSource{ @@ -148,16 +147,15 @@ func (n *nfsDriver) GetPersistentVolumeSource(readOnly bool, fsType string, e2ev }, nil } -func (n *nfsDriver) GetDynamicProvisionStorageClass(config *testsuites.PerTestConfig, fsType string) *storagev1.StorageClass { +func (n *nfsDriver) GetDynamicProvisionStorageClass(config *storageframework.PerTestConfig, fsType string) *storagev1.StorageClass { provisioner := n.externalPluginName parameters := map[string]string{"mountOptions": "vers=4.1"} ns := config.Framework.Namespace.Name - suffix := fmt.Sprintf("%s-sc", n.driverInfo.Name) - return testsuites.GetStorageClass(provisioner, parameters, nil, ns, suffix) + return storageframework.GetStorageClass(provisioner, parameters, nil, ns) } -func (n *nfsDriver) PrepareTest(f *framework.Framework) (*testsuites.PerTestConfig, func()) { +func (n *nfsDriver) PrepareTest(f *framework.Framework) (*storageframework.PerTestConfig, func()) { cs := f.ClientSet ns := f.Namespace n.externalPluginName = fmt.Sprintf("example.com/nfs-%s", ns.Name) @@ -176,7 +174,7 @@ func (n *nfsDriver) PrepareTest(f *framework.Framework) (*testsuites.PerTestConf ginkgo.By("creating an external dynamic provisioner pod") n.externalProvisionerPod = utils.StartExternalProvisioner(cs, ns.Name, n.externalPluginName) - return &testsuites.PerTestConfig{ + return &storageframework.PerTestConfig{ Driver: n, Prefix: "nfs", Framework: f, @@ -187,7 +185,7 @@ func (n *nfsDriver) PrepareTest(f *framework.Framework) (*testsuites.PerTestConf } } -func (n *nfsDriver) CreateVolume(config *testsuites.PerTestConfig, volType testpatterns.TestVolType) testsuites.TestVolume { +func (n *nfsDriver) CreateVolume(config *storageframework.PerTestConfig, volType storageframework.TestVolType) storageframework.TestVolume { f := config.Framework cs := f.ClientSet ns := f.Namespace @@ -196,9 +194,9 @@ func (n *nfsDriver) CreateVolume(config *testsuites.PerTestConfig, volType testp // and startExternalProvisioner creates a pod for DynamicPV. // Therefore, we need a different PrepareTest logic for volType. switch volType { - case testpatterns.InlineVolume: + case storageframework.InlineVolume: fallthrough - case testpatterns.PreprovisionedPV: + case storageframework.PreprovisionedPV: c, serverPod, serverHost := e2evolume.NewNFSServer(cs, ns.Name, []string{}) config.ServerConfig = &c return &nfsVolume{ @@ -206,7 +204,7 @@ func (n *nfsDriver) CreateVolume(config *testsuites.PerTestConfig, volType testp serverPod: serverPod, f: f, } - case testpatterns.DynamicPV: + case storageframework.DynamicPV: // Do nothing default: framework.Failf("Unsupported volType:%v is specified", volType) @@ -220,7 +218,7 @@ func (v *nfsVolume) DeleteVolume() { // Gluster type glusterFSDriver struct { - driverInfo testsuites.DriverInfo + driverInfo storageframework.DriverInfo } type glusterVolume struct { @@ -229,43 +227,43 @@ type glusterVolume struct { f *framework.Framework } -var _ testsuites.TestDriver = &glusterFSDriver{} -var _ testsuites.PreprovisionedVolumeTestDriver = &glusterFSDriver{} -var _ testsuites.InlineVolumeTestDriver = &glusterFSDriver{} -var _ testsuites.PreprovisionedPVTestDriver = &glusterFSDriver{} +var _ storageframework.TestDriver = &glusterFSDriver{} +var _ storageframework.PreprovisionedVolumeTestDriver = &glusterFSDriver{} +var _ storageframework.InlineVolumeTestDriver = &glusterFSDriver{} +var _ storageframework.PreprovisionedPVTestDriver = &glusterFSDriver{} // InitGlusterFSDriver returns glusterFSDriver that implements TestDriver interface -func InitGlusterFSDriver() testsuites.TestDriver { +func InitGlusterFSDriver() storageframework.TestDriver { return &glusterFSDriver{ - driverInfo: testsuites.DriverInfo{ + driverInfo: storageframework.DriverInfo{ Name: "gluster", InTreePluginName: "kubernetes.io/glusterfs", - MaxFileSize: testpatterns.FileSizeMedium, + MaxFileSize: storageframework.FileSizeMedium, SupportedSizeRange: e2evolume.SizeRange{ Min: "1Gi", }, SupportedFsType: sets.NewString( "", // Default fsType ), - Capabilities: map[testsuites.Capability]bool{ - testsuites.CapPersistence: true, - testsuites.CapExec: true, - testsuites.CapRWX: true, - testsuites.CapMultiPODs: true, + Capabilities: map[storageframework.Capability]bool{ + storageframework.CapPersistence: true, + storageframework.CapExec: true, + storageframework.CapRWX: true, + storageframework.CapMultiPODs: true, }, }, } } -func (g *glusterFSDriver) GetDriverInfo() *testsuites.DriverInfo { +func (g *glusterFSDriver) GetDriverInfo() *storageframework.DriverInfo { return &g.driverInfo } -func (g *glusterFSDriver) SkipUnsupportedTest(pattern testpatterns.TestPattern) { +func (g *glusterFSDriver) SkipUnsupportedTest(pattern storageframework.TestPattern) { e2eskipper.SkipUnlessNodeOSDistroIs("gci", "ubuntu", "custom") } -func (g *glusterFSDriver) GetVolumeSource(readOnly bool, fsType string, e2evolume testsuites.TestVolume) *v1.VolumeSource { +func (g *glusterFSDriver) GetVolumeSource(readOnly bool, fsType string, e2evolume storageframework.TestVolume) *v1.VolumeSource { gv, ok := e2evolume.(*glusterVolume) framework.ExpectEqual(ok, true, "Failed to cast test volume to Gluster test volume") @@ -280,7 +278,7 @@ func (g *glusterFSDriver) GetVolumeSource(readOnly bool, fsType string, e2evolum } } -func (g *glusterFSDriver) GetPersistentVolumeSource(readOnly bool, fsType string, e2evolume testsuites.TestVolume) (*v1.PersistentVolumeSource, *v1.VolumeNodeAffinity) { +func (g *glusterFSDriver) GetPersistentVolumeSource(readOnly bool, fsType string, e2evolume storageframework.TestVolume) (*v1.PersistentVolumeSource, *v1.VolumeNodeAffinity) { gv, ok := e2evolume.(*glusterVolume) framework.ExpectEqual(ok, true, "Failed to cast test volume to Gluster test volume") @@ -295,15 +293,15 @@ func (g *glusterFSDriver) GetPersistentVolumeSource(readOnly bool, fsType string }, nil } -func (g *glusterFSDriver) PrepareTest(f *framework.Framework) (*testsuites.PerTestConfig, func()) { - return &testsuites.PerTestConfig{ +func (g *glusterFSDriver) PrepareTest(f *framework.Framework) (*storageframework.PerTestConfig, func()) { + return &storageframework.PerTestConfig{ Driver: g, Prefix: "gluster", Framework: f, }, func() {} } -func (g *glusterFSDriver) CreateVolume(config *testsuites.PerTestConfig, volType testpatterns.TestVolType) testsuites.TestVolume { +func (g *glusterFSDriver) CreateVolume(config *storageframework.PerTestConfig, volType storageframework.TestVolType) storageframework.TestVolume { f := config.Framework cs := f.ClientSet ns := f.Namespace @@ -354,7 +352,7 @@ func (v *glusterVolume) DeleteVolume() { // iSCSI // The iscsiadm utility and iscsi target kernel modules must be installed on all nodes. type iSCSIDriver struct { - driverInfo testsuites.DriverInfo + driverInfo storageframework.DriverInfo } type iSCSIVolume struct { serverPod *v1.Pod @@ -363,44 +361,44 @@ type iSCSIVolume struct { iqn string } -var _ testsuites.TestDriver = &iSCSIDriver{} -var _ testsuites.PreprovisionedVolumeTestDriver = &iSCSIDriver{} -var _ testsuites.InlineVolumeTestDriver = &iSCSIDriver{} -var _ testsuites.PreprovisionedPVTestDriver = &iSCSIDriver{} +var _ storageframework.TestDriver = &iSCSIDriver{} +var _ storageframework.PreprovisionedVolumeTestDriver = &iSCSIDriver{} +var _ storageframework.InlineVolumeTestDriver = &iSCSIDriver{} +var _ storageframework.PreprovisionedPVTestDriver = &iSCSIDriver{} // InitISCSIDriver returns iSCSIDriver that implements TestDriver interface -func InitISCSIDriver() testsuites.TestDriver { +func InitISCSIDriver() storageframework.TestDriver { return &iSCSIDriver{ - driverInfo: testsuites.DriverInfo{ + driverInfo: storageframework.DriverInfo{ Name: "iscsi", InTreePluginName: "kubernetes.io/iscsi", FeatureTag: "[Feature:Volumes]", - MaxFileSize: testpatterns.FileSizeMedium, + MaxFileSize: storageframework.FileSizeMedium, SupportedFsType: sets.NewString( "", // Default fsType "ext4", ), TopologyKeys: []string{v1.LabelHostname}, - Capabilities: map[testsuites.Capability]bool{ - testsuites.CapPersistence: true, - testsuites.CapFsGroup: true, - testsuites.CapBlock: true, - testsuites.CapExec: true, - testsuites.CapMultiPODs: true, - testsuites.CapTopology: true, + Capabilities: map[storageframework.Capability]bool{ + storageframework.CapPersistence: true, + storageframework.CapFsGroup: true, + storageframework.CapBlock: true, + storageframework.CapExec: true, + storageframework.CapMultiPODs: true, + storageframework.CapTopology: true, }, }, } } -func (i *iSCSIDriver) GetDriverInfo() *testsuites.DriverInfo { +func (i *iSCSIDriver) GetDriverInfo() *storageframework.DriverInfo { return &i.driverInfo } -func (i *iSCSIDriver) SkipUnsupportedTest(pattern testpatterns.TestPattern) { +func (i *iSCSIDriver) SkipUnsupportedTest(pattern storageframework.TestPattern) { } -func (i *iSCSIDriver) GetVolumeSource(readOnly bool, fsType string, e2evolume testsuites.TestVolume) *v1.VolumeSource { +func (i *iSCSIDriver) GetVolumeSource(readOnly bool, fsType string, e2evolume storageframework.TestVolume) *v1.VolumeSource { iv, ok := e2evolume.(*iSCSIVolume) framework.ExpectEqual(ok, true, "Failed to cast test volume to iSCSI test volume") @@ -418,7 +416,7 @@ func (i *iSCSIDriver) GetVolumeSource(readOnly bool, fsType string, e2evolume te return &volSource } -func (i *iSCSIDriver) GetPersistentVolumeSource(readOnly bool, fsType string, e2evolume testsuites.TestVolume) (*v1.PersistentVolumeSource, *v1.VolumeNodeAffinity) { +func (i *iSCSIDriver) GetPersistentVolumeSource(readOnly bool, fsType string, e2evolume storageframework.TestVolume) (*v1.PersistentVolumeSource, *v1.VolumeNodeAffinity) { iv, ok := e2evolume.(*iSCSIVolume) framework.ExpectEqual(ok, true, "Failed to cast test volume to iSCSI test volume") @@ -436,15 +434,15 @@ func (i *iSCSIDriver) GetPersistentVolumeSource(readOnly bool, fsType string, e2 return &pvSource, nil } -func (i *iSCSIDriver) PrepareTest(f *framework.Framework) (*testsuites.PerTestConfig, func()) { - return &testsuites.PerTestConfig{ +func (i *iSCSIDriver) PrepareTest(f *framework.Framework) (*storageframework.PerTestConfig, func()) { + return &storageframework.PerTestConfig{ Driver: i, Prefix: "iscsi", Framework: f, }, func() {} } -func (i *iSCSIDriver) CreateVolume(config *testsuites.PerTestConfig, volType testpatterns.TestVolType) testsuites.TestVolume { +func (i *iSCSIDriver) CreateVolume(config *storageframework.PerTestConfig, volType storageframework.TestVolType) storageframework.TestVolume { f := config.Framework cs := f.ClientSet ns := f.Namespace @@ -529,7 +527,7 @@ func (v *iSCSIVolume) DeleteVolume() { // Ceph RBD type rbdDriver struct { - driverInfo testsuites.DriverInfo + driverInfo storageframework.DriverInfo } type rbdVolume struct { @@ -539,19 +537,19 @@ type rbdVolume struct { f *framework.Framework } -var _ testsuites.TestDriver = &rbdDriver{} -var _ testsuites.PreprovisionedVolumeTestDriver = &rbdDriver{} -var _ testsuites.InlineVolumeTestDriver = &rbdDriver{} -var _ testsuites.PreprovisionedPVTestDriver = &rbdDriver{} +var _ storageframework.TestDriver = &rbdDriver{} +var _ storageframework.PreprovisionedVolumeTestDriver = &rbdDriver{} +var _ storageframework.InlineVolumeTestDriver = &rbdDriver{} +var _ storageframework.PreprovisionedPVTestDriver = &rbdDriver{} // InitRbdDriver returns rbdDriver that implements TestDriver interface -func InitRbdDriver() testsuites.TestDriver { +func InitRbdDriver() storageframework.TestDriver { return &rbdDriver{ - driverInfo: testsuites.DriverInfo{ + driverInfo: storageframework.DriverInfo{ Name: "rbd", InTreePluginName: "kubernetes.io/rbd", FeatureTag: "[Feature:Volumes][Serial]", - MaxFileSize: testpatterns.FileSizeMedium, + MaxFileSize: storageframework.FileSizeMedium, SupportedSizeRange: e2evolume.SizeRange{ Min: "1Gi", }, @@ -559,25 +557,25 @@ func InitRbdDriver() testsuites.TestDriver { "", // Default fsType "ext4", ), - Capabilities: map[testsuites.Capability]bool{ - testsuites.CapPersistence: true, - testsuites.CapFsGroup: true, - testsuites.CapBlock: true, - testsuites.CapExec: true, - testsuites.CapMultiPODs: true, + Capabilities: map[storageframework.Capability]bool{ + storageframework.CapPersistence: true, + storageframework.CapFsGroup: true, + storageframework.CapBlock: true, + storageframework.CapExec: true, + storageframework.CapMultiPODs: true, }, }, } } -func (r *rbdDriver) GetDriverInfo() *testsuites.DriverInfo { +func (r *rbdDriver) GetDriverInfo() *storageframework.DriverInfo { return &r.driverInfo } -func (r *rbdDriver) SkipUnsupportedTest(pattern testpatterns.TestPattern) { +func (r *rbdDriver) SkipUnsupportedTest(pattern storageframework.TestPattern) { } -func (r *rbdDriver) GetVolumeSource(readOnly bool, fsType string, e2evolume testsuites.TestVolume) *v1.VolumeSource { +func (r *rbdDriver) GetVolumeSource(readOnly bool, fsType string, e2evolume storageframework.TestVolume) *v1.VolumeSource { rv, ok := e2evolume.(*rbdVolume) framework.ExpectEqual(ok, true, "Failed to cast test volume to RBD test volume") @@ -599,7 +597,7 @@ func (r *rbdDriver) GetVolumeSource(readOnly bool, fsType string, e2evolume test return &volSource } -func (r *rbdDriver) GetPersistentVolumeSource(readOnly bool, fsType string, e2evolume testsuites.TestVolume) (*v1.PersistentVolumeSource, *v1.VolumeNodeAffinity) { +func (r *rbdDriver) GetPersistentVolumeSource(readOnly bool, fsType string, e2evolume storageframework.TestVolume) (*v1.PersistentVolumeSource, *v1.VolumeNodeAffinity) { rv, ok := e2evolume.(*rbdVolume) framework.ExpectEqual(ok, true, "Failed to cast test volume to RBD test volume") @@ -625,15 +623,15 @@ func (r *rbdDriver) GetPersistentVolumeSource(readOnly bool, fsType string, e2ev return &pvSource, nil } -func (r *rbdDriver) PrepareTest(f *framework.Framework) (*testsuites.PerTestConfig, func()) { - return &testsuites.PerTestConfig{ +func (r *rbdDriver) PrepareTest(f *framework.Framework) (*storageframework.PerTestConfig, func()) { + return &storageframework.PerTestConfig{ Driver: r, Prefix: "rbd", Framework: f, }, func() {} } -func (r *rbdDriver) CreateVolume(config *testsuites.PerTestConfig, volType testpatterns.TestVolType) testsuites.TestVolume { +func (r *rbdDriver) CreateVolume(config *storageframework.PerTestConfig, volType storageframework.TestVolType) storageframework.TestVolume { f := config.Framework cs := f.ClientSet ns := f.Namespace @@ -654,7 +652,7 @@ func (v *rbdVolume) DeleteVolume() { // Ceph type cephFSDriver struct { - driverInfo testsuites.DriverInfo + driverInfo storageframework.DriverInfo } type cephVolume struct { @@ -664,43 +662,43 @@ type cephVolume struct { f *framework.Framework } -var _ testsuites.TestDriver = &cephFSDriver{} -var _ testsuites.PreprovisionedVolumeTestDriver = &cephFSDriver{} -var _ testsuites.InlineVolumeTestDriver = &cephFSDriver{} -var _ testsuites.PreprovisionedPVTestDriver = &cephFSDriver{} +var _ storageframework.TestDriver = &cephFSDriver{} +var _ storageframework.PreprovisionedVolumeTestDriver = &cephFSDriver{} +var _ storageframework.InlineVolumeTestDriver = &cephFSDriver{} +var _ storageframework.PreprovisionedPVTestDriver = &cephFSDriver{} // InitCephFSDriver returns cephFSDriver that implements TestDriver interface -func InitCephFSDriver() testsuites.TestDriver { +func InitCephFSDriver() storageframework.TestDriver { return &cephFSDriver{ - driverInfo: testsuites.DriverInfo{ + driverInfo: storageframework.DriverInfo{ Name: "ceph", InTreePluginName: "kubernetes.io/cephfs", FeatureTag: "[Feature:Volumes][Serial]", - MaxFileSize: testpatterns.FileSizeMedium, + MaxFileSize: storageframework.FileSizeMedium, SupportedSizeRange: e2evolume.SizeRange{ Min: "1Gi", }, SupportedFsType: sets.NewString( "", // Default fsType ), - Capabilities: map[testsuites.Capability]bool{ - testsuites.CapPersistence: true, - testsuites.CapExec: true, - testsuites.CapRWX: true, - testsuites.CapMultiPODs: true, + Capabilities: map[storageframework.Capability]bool{ + storageframework.CapPersistence: true, + storageframework.CapExec: true, + storageframework.CapRWX: true, + storageframework.CapMultiPODs: true, }, }, } } -func (c *cephFSDriver) GetDriverInfo() *testsuites.DriverInfo { +func (c *cephFSDriver) GetDriverInfo() *storageframework.DriverInfo { return &c.driverInfo } -func (c *cephFSDriver) SkipUnsupportedTest(pattern testpatterns.TestPattern) { +func (c *cephFSDriver) SkipUnsupportedTest(pattern storageframework.TestPattern) { } -func (c *cephFSDriver) GetVolumeSource(readOnly bool, fsType string, e2evolume testsuites.TestVolume) *v1.VolumeSource { +func (c *cephFSDriver) GetVolumeSource(readOnly bool, fsType string, e2evolume storageframework.TestVolume) *v1.VolumeSource { cv, ok := e2evolume.(*cephVolume) framework.ExpectEqual(ok, true, "Failed to cast test volume to Ceph test volume") @@ -716,7 +714,7 @@ func (c *cephFSDriver) GetVolumeSource(readOnly bool, fsType string, e2evolume t } } -func (c *cephFSDriver) GetPersistentVolumeSource(readOnly bool, fsType string, e2evolume testsuites.TestVolume) (*v1.PersistentVolumeSource, *v1.VolumeNodeAffinity) { +func (c *cephFSDriver) GetPersistentVolumeSource(readOnly bool, fsType string, e2evolume storageframework.TestVolume) (*v1.PersistentVolumeSource, *v1.VolumeNodeAffinity) { cv, ok := e2evolume.(*cephVolume) framework.ExpectEqual(ok, true, "Failed to cast test volume to Ceph test volume") @@ -735,15 +733,15 @@ func (c *cephFSDriver) GetPersistentVolumeSource(readOnly bool, fsType string, e }, nil } -func (c *cephFSDriver) PrepareTest(f *framework.Framework) (*testsuites.PerTestConfig, func()) { - return &testsuites.PerTestConfig{ +func (c *cephFSDriver) PrepareTest(f *framework.Framework) (*storageframework.PerTestConfig, func()) { + return &storageframework.PerTestConfig{ Driver: c, Prefix: "cephfs", Framework: f, }, func() {} } -func (c *cephFSDriver) CreateVolume(config *testsuites.PerTestConfig, volType testpatterns.TestVolType) testsuites.TestVolume { +func (c *cephFSDriver) CreateVolume(config *storageframework.PerTestConfig, volType storageframework.TestVolType) storageframework.TestVolume { f := config.Framework cs := f.ClientSet ns := f.Namespace @@ -764,42 +762,42 @@ func (v *cephVolume) DeleteVolume() { // Hostpath type hostPathDriver struct { - driverInfo testsuites.DriverInfo + driverInfo storageframework.DriverInfo } -var _ testsuites.TestDriver = &hostPathDriver{} -var _ testsuites.PreprovisionedVolumeTestDriver = &hostPathDriver{} -var _ testsuites.InlineVolumeTestDriver = &hostPathDriver{} +var _ storageframework.TestDriver = &hostPathDriver{} +var _ storageframework.PreprovisionedVolumeTestDriver = &hostPathDriver{} +var _ storageframework.InlineVolumeTestDriver = &hostPathDriver{} // InitHostPathDriver returns hostPathDriver that implements TestDriver interface -func InitHostPathDriver() testsuites.TestDriver { +func InitHostPathDriver() storageframework.TestDriver { return &hostPathDriver{ - driverInfo: testsuites.DriverInfo{ + driverInfo: storageframework.DriverInfo{ Name: "hostPath", InTreePluginName: "kubernetes.io/host-path", - MaxFileSize: testpatterns.FileSizeMedium, + MaxFileSize: storageframework.FileSizeMedium, SupportedFsType: sets.NewString( "", // Default fsType ), TopologyKeys: []string{v1.LabelHostname}, - Capabilities: map[testsuites.Capability]bool{ - testsuites.CapPersistence: true, - testsuites.CapMultiPODs: true, - testsuites.CapSingleNodeVolume: true, - testsuites.CapTopology: true, + Capabilities: map[storageframework.Capability]bool{ + storageframework.CapPersistence: true, + storageframework.CapMultiPODs: true, + storageframework.CapSingleNodeVolume: true, + storageframework.CapTopology: true, }, }, } } -func (h *hostPathDriver) GetDriverInfo() *testsuites.DriverInfo { +func (h *hostPathDriver) GetDriverInfo() *storageframework.DriverInfo { return &h.driverInfo } -func (h *hostPathDriver) SkipUnsupportedTest(pattern testpatterns.TestPattern) { +func (h *hostPathDriver) SkipUnsupportedTest(pattern storageframework.TestPattern) { } -func (h *hostPathDriver) GetVolumeSource(readOnly bool, fsType string, e2evolume testsuites.TestVolume) *v1.VolumeSource { +func (h *hostPathDriver) GetVolumeSource(readOnly bool, fsType string, e2evolume storageframework.TestVolume) *v1.VolumeSource { // hostPath doesn't support readOnly volume if readOnly { return nil @@ -811,15 +809,15 @@ func (h *hostPathDriver) GetVolumeSource(readOnly bool, fsType string, e2evolume } } -func (h *hostPathDriver) PrepareTest(f *framework.Framework) (*testsuites.PerTestConfig, func()) { - return &testsuites.PerTestConfig{ +func (h *hostPathDriver) PrepareTest(f *framework.Framework) (*storageframework.PerTestConfig, func()) { + return &storageframework.PerTestConfig{ Driver: h, Prefix: "hostpath", Framework: f, }, func() {} } -func (h *hostPathDriver) CreateVolume(config *testsuites.PerTestConfig, volType testpatterns.TestVolType) testsuites.TestVolume { +func (h *hostPathDriver) CreateVolume(config *storageframework.PerTestConfig, volType storageframework.TestVolType) storageframework.TestVolume { f := config.Framework cs := f.ClientSet @@ -832,7 +830,7 @@ func (h *hostPathDriver) CreateVolume(config *testsuites.PerTestConfig, volType // HostPathSymlink type hostPathSymlinkDriver struct { - driverInfo testsuites.DriverInfo + driverInfo storageframework.DriverInfo } type hostPathSymlinkVolume struct { @@ -842,39 +840,39 @@ type hostPathSymlinkVolume struct { f *framework.Framework } -var _ testsuites.TestDriver = &hostPathSymlinkDriver{} -var _ testsuites.PreprovisionedVolumeTestDriver = &hostPathSymlinkDriver{} -var _ testsuites.InlineVolumeTestDriver = &hostPathSymlinkDriver{} +var _ storageframework.TestDriver = &hostPathSymlinkDriver{} +var _ storageframework.PreprovisionedVolumeTestDriver = &hostPathSymlinkDriver{} +var _ storageframework.InlineVolumeTestDriver = &hostPathSymlinkDriver{} // InitHostPathSymlinkDriver returns hostPathSymlinkDriver that implements TestDriver interface -func InitHostPathSymlinkDriver() testsuites.TestDriver { +func InitHostPathSymlinkDriver() storageframework.TestDriver { return &hostPathSymlinkDriver{ - driverInfo: testsuites.DriverInfo{ + driverInfo: storageframework.DriverInfo{ Name: "hostPathSymlink", InTreePluginName: "kubernetes.io/host-path", - MaxFileSize: testpatterns.FileSizeMedium, + MaxFileSize: storageframework.FileSizeMedium, SupportedFsType: sets.NewString( "", // Default fsType ), TopologyKeys: []string{v1.LabelHostname}, - Capabilities: map[testsuites.Capability]bool{ - testsuites.CapPersistence: true, - testsuites.CapMultiPODs: true, - testsuites.CapSingleNodeVolume: true, - testsuites.CapTopology: true, + Capabilities: map[storageframework.Capability]bool{ + storageframework.CapPersistence: true, + storageframework.CapMultiPODs: true, + storageframework.CapSingleNodeVolume: true, + storageframework.CapTopology: true, }, }, } } -func (h *hostPathSymlinkDriver) GetDriverInfo() *testsuites.DriverInfo { +func (h *hostPathSymlinkDriver) GetDriverInfo() *storageframework.DriverInfo { return &h.driverInfo } -func (h *hostPathSymlinkDriver) SkipUnsupportedTest(pattern testpatterns.TestPattern) { +func (h *hostPathSymlinkDriver) SkipUnsupportedTest(pattern storageframework.TestPattern) { } -func (h *hostPathSymlinkDriver) GetVolumeSource(readOnly bool, fsType string, e2evolume testsuites.TestVolume) *v1.VolumeSource { +func (h *hostPathSymlinkDriver) GetVolumeSource(readOnly bool, fsType string, e2evolume storageframework.TestVolume) *v1.VolumeSource { hv, ok := e2evolume.(*hostPathSymlinkVolume) framework.ExpectEqual(ok, true, "Failed to cast test volume to Hostpath Symlink test volume") @@ -889,15 +887,15 @@ func (h *hostPathSymlinkDriver) GetVolumeSource(readOnly bool, fsType string, e2 } } -func (h *hostPathSymlinkDriver) PrepareTest(f *framework.Framework) (*testsuites.PerTestConfig, func()) { - return &testsuites.PerTestConfig{ +func (h *hostPathSymlinkDriver) PrepareTest(f *framework.Framework) (*storageframework.PerTestConfig, func()) { + return &storageframework.PerTestConfig{ Driver: h, Prefix: "hostpathsymlink", Framework: f, }, func() {} } -func (h *hostPathSymlinkDriver) CreateVolume(config *testsuites.PerTestConfig, volType testpatterns.TestVolType) testsuites.TestVolume { +func (h *hostPathSymlinkDriver) CreateVolume(config *storageframework.PerTestConfig, volType storageframework.TestVolType) storageframework.TestVolume { f := config.Framework cs := f.ClientSet @@ -953,7 +951,7 @@ func (h *hostPathSymlinkDriver) CreateVolume(config *testsuites.PerTestConfig, v pod, err := f.ClientSet.CoreV1().Pods(f.Namespace.Name).Create(context.TODO(), prepPod, metav1.CreateOptions{}) framework.ExpectNoError(err, "while creating hostPath init pod") - err = e2epod.WaitForPodSuccessInNamespace(f.ClientSet, pod.Name, pod.Namespace) + err = e2epod.WaitForPodSuccessInNamespaceTimeout(f.ClientSet, pod.Name, pod.Namespace, f.Timeouts.PodStart) framework.ExpectNoError(err, "while waiting for hostPath init pod to succeed") err = e2epod.DeletePodWithWait(f.ClientSet, pod) @@ -975,7 +973,7 @@ func (v *hostPathSymlinkVolume) DeleteVolume() { pod, err := f.ClientSet.CoreV1().Pods(f.Namespace.Name).Create(context.TODO(), v.prepPod, metav1.CreateOptions{}) framework.ExpectNoError(err, "while creating hostPath teardown pod") - err = e2epod.WaitForPodSuccessInNamespace(f.ClientSet, pod.Name, pod.Namespace) + err = e2epod.WaitForPodSuccessInNamespaceTimeout(f.ClientSet, pod.Name, pod.Namespace, f.Timeouts.PodStart) framework.ExpectNoError(err, "while waiting for hostPath teardown pod to succeed") err = e2epod.DeletePodWithWait(f.ClientSet, pod) @@ -984,39 +982,39 @@ func (v *hostPathSymlinkVolume) DeleteVolume() { // emptydir type emptydirDriver struct { - driverInfo testsuites.DriverInfo + driverInfo storageframework.DriverInfo } -var _ testsuites.TestDriver = &emptydirDriver{} -var _ testsuites.PreprovisionedVolumeTestDriver = &emptydirDriver{} -var _ testsuites.InlineVolumeTestDriver = &emptydirDriver{} +var _ storageframework.TestDriver = &emptydirDriver{} +var _ storageframework.PreprovisionedVolumeTestDriver = &emptydirDriver{} +var _ storageframework.InlineVolumeTestDriver = &emptydirDriver{} // InitEmptydirDriver returns emptydirDriver that implements TestDriver interface -func InitEmptydirDriver() testsuites.TestDriver { +func InitEmptydirDriver() storageframework.TestDriver { return &emptydirDriver{ - driverInfo: testsuites.DriverInfo{ + driverInfo: storageframework.DriverInfo{ Name: "emptydir", InTreePluginName: "kubernetes.io/empty-dir", - MaxFileSize: testpatterns.FileSizeMedium, + MaxFileSize: storageframework.FileSizeMedium, SupportedFsType: sets.NewString( "", // Default fsType ), - Capabilities: map[testsuites.Capability]bool{ - testsuites.CapExec: true, - testsuites.CapSingleNodeVolume: true, + Capabilities: map[storageframework.Capability]bool{ + storageframework.CapExec: true, + storageframework.CapSingleNodeVolume: true, }, }, } } -func (e *emptydirDriver) GetDriverInfo() *testsuites.DriverInfo { +func (e *emptydirDriver) GetDriverInfo() *storageframework.DriverInfo { return &e.driverInfo } -func (e *emptydirDriver) SkipUnsupportedTest(pattern testpatterns.TestPattern) { +func (e *emptydirDriver) SkipUnsupportedTest(pattern storageframework.TestPattern) { } -func (e *emptydirDriver) GetVolumeSource(readOnly bool, fsType string, e2evolume testsuites.TestVolume) *v1.VolumeSource { +func (e *emptydirDriver) GetVolumeSource(readOnly bool, fsType string, e2evolume storageframework.TestVolume) *v1.VolumeSource { // emptydir doesn't support readOnly volume if readOnly { return nil @@ -1026,12 +1024,12 @@ func (e *emptydirDriver) GetVolumeSource(readOnly bool, fsType string, e2evolume } } -func (e *emptydirDriver) CreateVolume(config *testsuites.PerTestConfig, volType testpatterns.TestVolType) testsuites.TestVolume { +func (e *emptydirDriver) CreateVolume(config *storageframework.PerTestConfig, volType storageframework.TestVolType) storageframework.TestVolume { return nil } -func (e *emptydirDriver) PrepareTest(f *framework.Framework) (*testsuites.PerTestConfig, func()) { - return &testsuites.PerTestConfig{ +func (e *emptydirDriver) PrepareTest(f *framework.Framework) (*storageframework.PerTestConfig, func()) { + return &storageframework.PerTestConfig{ Driver: e, Prefix: "emptydir", Framework: f, @@ -1044,7 +1042,7 @@ func (e *emptydirDriver) PrepareTest(f *framework.Framework) (*testsuites.PerTes // and that the usual OpenStack authentication env. variables are set // (OS_USERNAME, OS_PASSWORD, OS_TENANT_NAME at least). type cinderDriver struct { - driverInfo testsuites.DriverInfo + driverInfo storageframework.DriverInfo } type cinderVolume struct { @@ -1052,19 +1050,19 @@ type cinderVolume struct { volumeID string } -var _ testsuites.TestDriver = &cinderDriver{} -var _ testsuites.PreprovisionedVolumeTestDriver = &cinderDriver{} -var _ testsuites.InlineVolumeTestDriver = &cinderDriver{} -var _ testsuites.PreprovisionedPVTestDriver = &cinderDriver{} -var _ testsuites.DynamicPVTestDriver = &cinderDriver{} +var _ storageframework.TestDriver = &cinderDriver{} +var _ storageframework.PreprovisionedVolumeTestDriver = &cinderDriver{} +var _ storageframework.InlineVolumeTestDriver = &cinderDriver{} +var _ storageframework.PreprovisionedPVTestDriver = &cinderDriver{} +var _ storageframework.DynamicPVTestDriver = &cinderDriver{} // InitCinderDriver returns cinderDriver that implements TestDriver interface -func InitCinderDriver() testsuites.TestDriver { +func InitCinderDriver() storageframework.TestDriver { return &cinderDriver{ - driverInfo: testsuites.DriverInfo{ + driverInfo: storageframework.DriverInfo{ Name: "cinder", InTreePluginName: "kubernetes.io/cinder", - MaxFileSize: testpatterns.FileSizeMedium, + MaxFileSize: storageframework.FileSizeMedium, SupportedSizeRange: e2evolume.SizeRange{ Min: "1Gi", }, @@ -1072,29 +1070,29 @@ func InitCinderDriver() testsuites.TestDriver { "", // Default fsType ), TopologyKeys: []string{v1.LabelFailureDomainBetaZone}, - Capabilities: map[testsuites.Capability]bool{ - testsuites.CapPersistence: true, - testsuites.CapFsGroup: true, - testsuites.CapExec: true, - testsuites.CapBlock: true, + Capabilities: map[storageframework.Capability]bool{ + storageframework.CapPersistence: true, + storageframework.CapFsGroup: true, + storageframework.CapExec: true, + storageframework.CapBlock: true, // Cinder supports volume limits, but the test creates large // number of volumes and times out test suites. - testsuites.CapVolumeLimits: false, - testsuites.CapTopology: true, + storageframework.CapVolumeLimits: false, + storageframework.CapTopology: true, }, }, } } -func (c *cinderDriver) GetDriverInfo() *testsuites.DriverInfo { +func (c *cinderDriver) GetDriverInfo() *storageframework.DriverInfo { return &c.driverInfo } -func (c *cinderDriver) SkipUnsupportedTest(pattern testpatterns.TestPattern) { +func (c *cinderDriver) SkipUnsupportedTest(pattern storageframework.TestPattern) { e2eskipper.SkipUnlessProviderIs("openstack") } -func (c *cinderDriver) GetVolumeSource(readOnly bool, fsType string, e2evolume testsuites.TestVolume) *v1.VolumeSource { +func (c *cinderDriver) GetVolumeSource(readOnly bool, fsType string, e2evolume storageframework.TestVolume) *v1.VolumeSource { cv, ok := e2evolume.(*cinderVolume) framework.ExpectEqual(ok, true, "Failed to cast test volume to Cinder test volume") @@ -1110,7 +1108,7 @@ func (c *cinderDriver) GetVolumeSource(readOnly bool, fsType string, e2evolume t return &volSource } -func (c *cinderDriver) GetPersistentVolumeSource(readOnly bool, fsType string, e2evolume testsuites.TestVolume) (*v1.PersistentVolumeSource, *v1.VolumeNodeAffinity) { +func (c *cinderDriver) GetPersistentVolumeSource(readOnly bool, fsType string, e2evolume storageframework.TestVolume) (*v1.PersistentVolumeSource, *v1.VolumeNodeAffinity) { cv, ok := e2evolume.(*cinderVolume) framework.ExpectEqual(ok, true, "Failed to cast test volume to Cinder test volume") @@ -1126,27 +1124,26 @@ func (c *cinderDriver) GetPersistentVolumeSource(readOnly bool, fsType string, e return &pvSource, nil } -func (c *cinderDriver) GetDynamicProvisionStorageClass(config *testsuites.PerTestConfig, fsType string) *storagev1.StorageClass { +func (c *cinderDriver) GetDynamicProvisionStorageClass(config *storageframework.PerTestConfig, fsType string) *storagev1.StorageClass { provisioner := "kubernetes.io/cinder" parameters := map[string]string{} if fsType != "" { parameters["fsType"] = fsType } ns := config.Framework.Namespace.Name - suffix := fmt.Sprintf("%s-sc", c.driverInfo.Name) - return testsuites.GetStorageClass(provisioner, parameters, nil, ns, suffix) + return storageframework.GetStorageClass(provisioner, parameters, nil, ns) } -func (c *cinderDriver) PrepareTest(f *framework.Framework) (*testsuites.PerTestConfig, func()) { - return &testsuites.PerTestConfig{ +func (c *cinderDriver) PrepareTest(f *framework.Framework) (*storageframework.PerTestConfig, func()) { + return &storageframework.PerTestConfig{ Driver: c, Prefix: "cinder", Framework: f, }, func() {} } -func (c *cinderDriver) CreateVolume(config *testsuites.PerTestConfig, volType testpatterns.TestVolType) testsuites.TestVolume { +func (c *cinderDriver) CreateVolume(config *storageframework.PerTestConfig, volType storageframework.TestVolType) storageframework.TestVolume { f := config.Framework ns := f.Namespace @@ -1214,21 +1211,21 @@ func (v *cinderVolume) DeleteVolume() { // GCE type gcePdDriver struct { - driverInfo testsuites.DriverInfo + driverInfo storageframework.DriverInfo } type gcePdVolume struct { volumeName string } -var _ testsuites.TestDriver = &gcePdDriver{} -var _ testsuites.PreprovisionedVolumeTestDriver = &gcePdDriver{} -var _ testsuites.InlineVolumeTestDriver = &gcePdDriver{} -var _ testsuites.PreprovisionedPVTestDriver = &gcePdDriver{} -var _ testsuites.DynamicPVTestDriver = &gcePdDriver{} +var _ storageframework.TestDriver = &gcePdDriver{} +var _ storageframework.PreprovisionedVolumeTestDriver = &gcePdDriver{} +var _ storageframework.InlineVolumeTestDriver = &gcePdDriver{} +var _ storageframework.PreprovisionedPVTestDriver = &gcePdDriver{} +var _ storageframework.DynamicPVTestDriver = &gcePdDriver{} // InitGcePdDriver returns gcePdDriver that implements TestDriver interface -func InitGcePdDriver() testsuites.TestDriver { +func InitGcePdDriver() storageframework.TestDriver { supportedTypes := sets.NewString( "", // Default fsType "ext2", @@ -1237,28 +1234,28 @@ func InitGcePdDriver() testsuites.TestDriver { "xfs", ) return &gcePdDriver{ - driverInfo: testsuites.DriverInfo{ + driverInfo: storageframework.DriverInfo{ Name: "gcepd", InTreePluginName: "kubernetes.io/gce-pd", - MaxFileSize: testpatterns.FileSizeMedium, + MaxFileSize: storageframework.FileSizeMedium, SupportedSizeRange: e2evolume.SizeRange{ Min: "1Gi", }, SupportedFsType: supportedTypes, SupportedMountOption: sets.NewString("debug", "nouid32"), - TopologyKeys: []string{v1.LabelFailureDomainBetaZone}, - Capabilities: map[testsuites.Capability]bool{ - testsuites.CapPersistence: true, - testsuites.CapFsGroup: true, - testsuites.CapBlock: true, - testsuites.CapExec: true, - testsuites.CapMultiPODs: true, - testsuites.CapControllerExpansion: true, - testsuites.CapNodeExpansion: true, + TopologyKeys: []string{v1.LabelTopologyZone}, + Capabilities: map[storageframework.Capability]bool{ + storageframework.CapPersistence: true, + storageframework.CapFsGroup: true, + storageframework.CapBlock: true, + storageframework.CapExec: true, + storageframework.CapMultiPODs: true, + storageframework.CapControllerExpansion: true, + storageframework.CapNodeExpansion: true, // GCE supports volume limits, but the test creates large // number of volumes and times out test suites. - testsuites.CapVolumeLimits: false, - testsuites.CapTopology: true, + storageframework.CapVolumeLimits: false, + storageframework.CapTopology: true, }, }, } @@ -1268,46 +1265,46 @@ func InitGcePdDriver() testsuites.TestDriver { // In current test structure, it first initialize the driver and then set up // the new framework, so we cannot get the correct OS here and select which file system is supported. // So here uses a separate Windows in-tree gce pd driver -func InitWindowsGcePdDriver() testsuites.TestDriver { +func InitWindowsGcePdDriver() storageframework.TestDriver { supportedTypes := sets.NewString( "ntfs", ) return &gcePdDriver{ - driverInfo: testsuites.DriverInfo{ + driverInfo: storageframework.DriverInfo{ Name: "windows-gcepd", InTreePluginName: "kubernetes.io/gce-pd", - MaxFileSize: testpatterns.FileSizeMedium, + MaxFileSize: storageframework.FileSizeMedium, SupportedSizeRange: e2evolume.SizeRange{ Min: "1Gi", }, SupportedFsType: supportedTypes, TopologyKeys: []string{v1.LabelZoneFailureDomain}, - Capabilities: map[testsuites.Capability]bool{ - testsuites.CapControllerExpansion: false, - testsuites.CapPersistence: true, - testsuites.CapExec: true, - testsuites.CapMultiPODs: true, + Capabilities: map[storageframework.Capability]bool{ + storageframework.CapControllerExpansion: false, + storageframework.CapPersistence: true, + storageframework.CapExec: true, + storageframework.CapMultiPODs: true, // GCE supports volume limits, but the test creates large // number of volumes and times out test suites. - testsuites.CapVolumeLimits: false, - testsuites.CapTopology: true, + storageframework.CapVolumeLimits: false, + storageframework.CapTopology: true, }, }, } } -func (g *gcePdDriver) GetDriverInfo() *testsuites.DriverInfo { +func (g *gcePdDriver) GetDriverInfo() *storageframework.DriverInfo { return &g.driverInfo } -func (g *gcePdDriver) SkipUnsupportedTest(pattern testpatterns.TestPattern) { +func (g *gcePdDriver) SkipUnsupportedTest(pattern storageframework.TestPattern) { e2eskipper.SkipUnlessProviderIs("gce", "gke") - if pattern.FeatureTag == "[sig-windows]" { + if pattern.FeatureTag == "[Feature:Windows]" { e2eskipper.SkipUnlessNodeOSDistroIs("windows") } } -func (g *gcePdDriver) GetVolumeSource(readOnly bool, fsType string, e2evolume testsuites.TestVolume) *v1.VolumeSource { +func (g *gcePdDriver) GetVolumeSource(readOnly bool, fsType string, e2evolume storageframework.TestVolume) *v1.VolumeSource { gv, ok := e2evolume.(*gcePdVolume) framework.ExpectEqual(ok, true, "Failed to cast test volume to GCE PD test volume") volSource := v1.VolumeSource{ @@ -1322,7 +1319,7 @@ func (g *gcePdDriver) GetVolumeSource(readOnly bool, fsType string, e2evolume te return &volSource } -func (g *gcePdDriver) GetPersistentVolumeSource(readOnly bool, fsType string, e2evolume testsuites.TestVolume) (*v1.PersistentVolumeSource, *v1.VolumeNodeAffinity) { +func (g *gcePdDriver) GetPersistentVolumeSource(readOnly bool, fsType string, e2evolume storageframework.TestVolume) (*v1.PersistentVolumeSource, *v1.VolumeNodeAffinity) { gv, ok := e2evolume.(*gcePdVolume) framework.ExpectEqual(ok, true, "Failed to cast test volume to GCE PD test volume") pvSource := v1.PersistentVolumeSource{ @@ -1337,21 +1334,20 @@ func (g *gcePdDriver) GetPersistentVolumeSource(readOnly bool, fsType string, e2 return &pvSource, nil } -func (g *gcePdDriver) GetDynamicProvisionStorageClass(config *testsuites.PerTestConfig, fsType string) *storagev1.StorageClass { +func (g *gcePdDriver) GetDynamicProvisionStorageClass(config *storageframework.PerTestConfig, fsType string) *storagev1.StorageClass { provisioner := "kubernetes.io/gce-pd" parameters := map[string]string{} if fsType != "" { parameters["fsType"] = fsType } ns := config.Framework.Namespace.Name - suffix := fmt.Sprintf("%s-sc", g.driverInfo.Name) delayedBinding := storagev1.VolumeBindingWaitForFirstConsumer - return testsuites.GetStorageClass(provisioner, parameters, &delayedBinding, ns, suffix) + return storageframework.GetStorageClass(provisioner, parameters, &delayedBinding, ns) } -func (g *gcePdDriver) PrepareTest(f *framework.Framework) (*testsuites.PerTestConfig, func()) { - config := &testsuites.PerTestConfig{ +func (g *gcePdDriver) PrepareTest(f *framework.Framework) (*storageframework.PerTestConfig, func()) { + config := &storageframework.PerTestConfig{ Driver: g, Prefix: "gcepd", Framework: f, @@ -1368,9 +1364,9 @@ func (g *gcePdDriver) PrepareTest(f *framework.Framework) (*testsuites.PerTestCo } -func (g *gcePdDriver) CreateVolume(config *testsuites.PerTestConfig, volType testpatterns.TestVolType) testsuites.TestVolume { +func (g *gcePdDriver) CreateVolume(config *storageframework.PerTestConfig, volType storageframework.TestVolType) storageframework.TestVolume { zone := getInlineVolumeZone(config.Framework) - if volType == testpatterns.InlineVolume { + if volType == storageframework.InlineVolume { // PD will be created in framework.TestContext.CloudConfig.Zone zone, // so pods should be also scheduled there. config.ClientNodeSelection = e2epod.NodeSelection{ @@ -1393,7 +1389,7 @@ func (v *gcePdVolume) DeleteVolume() { // vSphere type vSphereDriver struct { - driverInfo testsuites.DriverInfo + driverInfo storageframework.DriverInfo } type vSphereVolume struct { @@ -1401,46 +1397,47 @@ type vSphereVolume struct { nodeInfo *vspheretest.NodeInfo } -var _ testsuites.TestDriver = &vSphereDriver{} -var _ testsuites.PreprovisionedVolumeTestDriver = &vSphereDriver{} -var _ testsuites.InlineVolumeTestDriver = &vSphereDriver{} -var _ testsuites.PreprovisionedPVTestDriver = &vSphereDriver{} -var _ testsuites.DynamicPVTestDriver = &vSphereDriver{} +var _ storageframework.TestDriver = &vSphereDriver{} +var _ storageframework.PreprovisionedVolumeTestDriver = &vSphereDriver{} +var _ storageframework.InlineVolumeTestDriver = &vSphereDriver{} +var _ storageframework.PreprovisionedPVTestDriver = &vSphereDriver{} +var _ storageframework.DynamicPVTestDriver = &vSphereDriver{} // InitVSphereDriver returns vSphereDriver that implements TestDriver interface -func InitVSphereDriver() testsuites.TestDriver { +func InitVSphereDriver() storageframework.TestDriver { return &vSphereDriver{ - driverInfo: testsuites.DriverInfo{ + driverInfo: storageframework.DriverInfo{ Name: "vsphere", InTreePluginName: "kubernetes.io/vsphere-volume", - MaxFileSize: testpatterns.FileSizeMedium, + MaxFileSize: storageframework.FileSizeMedium, SupportedSizeRange: e2evolume.SizeRange{ Min: "1Gi", }, SupportedFsType: sets.NewString( "", // Default fsType "ext4", + "ntfs", ), TopologyKeys: []string{v1.LabelFailureDomainBetaZone}, - Capabilities: map[testsuites.Capability]bool{ - testsuites.CapPersistence: true, - testsuites.CapFsGroup: true, - testsuites.CapExec: true, - testsuites.CapMultiPODs: true, - testsuites.CapTopology: true, + Capabilities: map[storageframework.Capability]bool{ + storageframework.CapPersistence: true, + storageframework.CapFsGroup: true, + storageframework.CapExec: true, + storageframework.CapMultiPODs: true, + storageframework.CapTopology: true, }, }, } } -func (v *vSphereDriver) GetDriverInfo() *testsuites.DriverInfo { +func (v *vSphereDriver) GetDriverInfo() *storageframework.DriverInfo { return &v.driverInfo } -func (v *vSphereDriver) SkipUnsupportedTest(pattern testpatterns.TestPattern) { +func (v *vSphereDriver) SkipUnsupportedTest(pattern storageframework.TestPattern) { e2eskipper.SkipUnlessProviderIs("vsphere") } -func (v *vSphereDriver) GetVolumeSource(readOnly bool, fsType string, e2evolume testsuites.TestVolume) *v1.VolumeSource { +func (v *vSphereDriver) GetVolumeSource(readOnly bool, fsType string, e2evolume storageframework.TestVolume) *v1.VolumeSource { vsv, ok := e2evolume.(*vSphereVolume) framework.ExpectEqual(ok, true, "Failed to cast test volume to vSphere test volume") @@ -1460,7 +1457,7 @@ func (v *vSphereDriver) GetVolumeSource(readOnly bool, fsType string, e2evolume return &volSource } -func (v *vSphereDriver) GetPersistentVolumeSource(readOnly bool, fsType string, e2evolume testsuites.TestVolume) (*v1.PersistentVolumeSource, *v1.VolumeNodeAffinity) { +func (v *vSphereDriver) GetPersistentVolumeSource(readOnly bool, fsType string, e2evolume storageframework.TestVolume) (*v1.PersistentVolumeSource, *v1.VolumeNodeAffinity) { vsv, ok := e2evolume.(*vSphereVolume) framework.ExpectEqual(ok, true, "Failed to cast test volume to vSphere test volume") @@ -1480,27 +1477,26 @@ func (v *vSphereDriver) GetPersistentVolumeSource(readOnly bool, fsType string, return &pvSource, nil } -func (v *vSphereDriver) GetDynamicProvisionStorageClass(config *testsuites.PerTestConfig, fsType string) *storagev1.StorageClass { +func (v *vSphereDriver) GetDynamicProvisionStorageClass(config *storageframework.PerTestConfig, fsType string) *storagev1.StorageClass { provisioner := "kubernetes.io/vsphere-volume" parameters := map[string]string{} if fsType != "" { parameters["fsType"] = fsType } ns := config.Framework.Namespace.Name - suffix := fmt.Sprintf("%s-sc", v.driverInfo.Name) - return testsuites.GetStorageClass(provisioner, parameters, nil, ns, suffix) + return storageframework.GetStorageClass(provisioner, parameters, nil, ns) } -func (v *vSphereDriver) PrepareTest(f *framework.Framework) (*testsuites.PerTestConfig, func()) { - return &testsuites.PerTestConfig{ +func (v *vSphereDriver) PrepareTest(f *framework.Framework) (*storageframework.PerTestConfig, func()) { + return &storageframework.PerTestConfig{ Driver: v, Prefix: "vsphere", Framework: f, }, func() {} } -func (v *vSphereDriver) CreateVolume(config *testsuites.PerTestConfig, volType testpatterns.TestVolType) testsuites.TestVolume { +func (v *vSphereDriver) CreateVolume(config *storageframework.PerTestConfig, volType storageframework.TestVolType) storageframework.TestVolume { f := config.Framework vspheretest.Bootstrap(f) nodeInfo := vspheretest.GetReadySchedulableRandomNodeInfo() @@ -1518,26 +1514,26 @@ func (v *vSphereVolume) DeleteVolume() { // Azure Disk type azureDiskDriver struct { - driverInfo testsuites.DriverInfo + driverInfo storageframework.DriverInfo } type azureDiskVolume struct { volumeName string } -var _ testsuites.TestDriver = &azureDiskDriver{} -var _ testsuites.PreprovisionedVolumeTestDriver = &azureDiskDriver{} -var _ testsuites.InlineVolumeTestDriver = &azureDiskDriver{} -var _ testsuites.PreprovisionedPVTestDriver = &azureDiskDriver{} -var _ testsuites.DynamicPVTestDriver = &azureDiskDriver{} +var _ storageframework.TestDriver = &azureDiskDriver{} +var _ storageframework.PreprovisionedVolumeTestDriver = &azureDiskDriver{} +var _ storageframework.InlineVolumeTestDriver = &azureDiskDriver{} +var _ storageframework.PreprovisionedPVTestDriver = &azureDiskDriver{} +var _ storageframework.DynamicPVTestDriver = &azureDiskDriver{} // InitAzureDiskDriver returns azureDiskDriver that implements TestDriver interface -func InitAzureDiskDriver() testsuites.TestDriver { +func InitAzureDiskDriver() storageframework.TestDriver { return &azureDiskDriver{ - driverInfo: testsuites.DriverInfo{ + driverInfo: storageframework.DriverInfo{ Name: "azure-disk", InTreePluginName: "kubernetes.io/azure-disk", - MaxFileSize: testpatterns.FileSizeMedium, + MaxFileSize: storageframework.FileSizeMedium, SupportedSizeRange: e2evolume.SizeRange{ Min: "1Gi", }, @@ -1547,30 +1543,30 @@ func InitAzureDiskDriver() testsuites.TestDriver { "xfs", ), TopologyKeys: []string{v1.LabelFailureDomainBetaZone}, - Capabilities: map[testsuites.Capability]bool{ - testsuites.CapPersistence: true, - testsuites.CapFsGroup: true, - testsuites.CapBlock: true, - testsuites.CapExec: true, - testsuites.CapMultiPODs: true, + Capabilities: map[storageframework.Capability]bool{ + storageframework.CapPersistence: true, + storageframework.CapFsGroup: true, + storageframework.CapBlock: true, + storageframework.CapExec: true, + storageframework.CapMultiPODs: true, // Azure supports volume limits, but the test creates large // number of volumes and times out test suites. - testsuites.CapVolumeLimits: false, - testsuites.CapTopology: true, + storageframework.CapVolumeLimits: false, + storageframework.CapTopology: true, }, }, } } -func (a *azureDiskDriver) GetDriverInfo() *testsuites.DriverInfo { +func (a *azureDiskDriver) GetDriverInfo() *storageframework.DriverInfo { return &a.driverInfo } -func (a *azureDiskDriver) SkipUnsupportedTest(pattern testpatterns.TestPattern) { +func (a *azureDiskDriver) SkipUnsupportedTest(pattern storageframework.TestPattern) { e2eskipper.SkipUnlessProviderIs("azure") } -func (a *azureDiskDriver) GetVolumeSource(readOnly bool, fsType string, e2evolume testsuites.TestVolume) *v1.VolumeSource { +func (a *azureDiskDriver) GetVolumeSource(readOnly bool, fsType string, e2evolume storageframework.TestVolume) *v1.VolumeSource { av, ok := e2evolume.(*azureDiskVolume) framework.ExpectEqual(ok, true, "Failed to cast test volume to Azure test volume") diskName := av.volumeName[(strings.LastIndex(av.volumeName, "/") + 1):] @@ -1590,7 +1586,7 @@ func (a *azureDiskDriver) GetVolumeSource(readOnly bool, fsType string, e2evolum return &volSource } -func (a *azureDiskDriver) GetPersistentVolumeSource(readOnly bool, fsType string, e2evolume testsuites.TestVolume) (*v1.PersistentVolumeSource, *v1.VolumeNodeAffinity) { +func (a *azureDiskDriver) GetPersistentVolumeSource(readOnly bool, fsType string, e2evolume storageframework.TestVolume) (*v1.PersistentVolumeSource, *v1.VolumeNodeAffinity) { av, ok := e2evolume.(*azureDiskVolume) framework.ExpectEqual(ok, true, "Failed to cast test volume to Azure test volume") @@ -1611,31 +1607,30 @@ func (a *azureDiskDriver) GetPersistentVolumeSource(readOnly bool, fsType string return &pvSource, nil } -func (a *azureDiskDriver) GetDynamicProvisionStorageClass(config *testsuites.PerTestConfig, fsType string) *storagev1.StorageClass { +func (a *azureDiskDriver) GetDynamicProvisionStorageClass(config *storageframework.PerTestConfig, fsType string) *storagev1.StorageClass { provisioner := "kubernetes.io/azure-disk" parameters := map[string]string{} if fsType != "" { parameters["fsType"] = fsType } ns := config.Framework.Namespace.Name - suffix := fmt.Sprintf("%s-sc", a.driverInfo.Name) delayedBinding := storagev1.VolumeBindingWaitForFirstConsumer - return testsuites.GetStorageClass(provisioner, parameters, &delayedBinding, ns, suffix) + return storageframework.GetStorageClass(provisioner, parameters, &delayedBinding, ns) } -func (a *azureDiskDriver) PrepareTest(f *framework.Framework) (*testsuites.PerTestConfig, func()) { - return &testsuites.PerTestConfig{ +func (a *azureDiskDriver) PrepareTest(f *framework.Framework) (*storageframework.PerTestConfig, func()) { + return &storageframework.PerTestConfig{ Driver: a, Prefix: "azure", Framework: f, }, func() {} } -func (a *azureDiskDriver) CreateVolume(config *testsuites.PerTestConfig, volType testpatterns.TestVolType) testsuites.TestVolume { +func (a *azureDiskDriver) CreateVolume(config *storageframework.PerTestConfig, volType storageframework.TestVolType) storageframework.TestVolume { ginkgo.By("creating a test azure disk volume") zone := getInlineVolumeZone(config.Framework) - if volType == testpatterns.InlineVolume { + if volType == storageframework.InlineVolume { // PD will be created in framework.TestContext.CloudConfig.Zone zone, // so pods should be also scheduled there. config.ClientNodeSelection = e2epod.NodeSelection{ @@ -1657,27 +1652,27 @@ func (v *azureDiskVolume) DeleteVolume() { // AWS type awsDriver struct { - driverInfo testsuites.DriverInfo + driverInfo storageframework.DriverInfo } type awsVolume struct { volumeName string } -var _ testsuites.TestDriver = &awsDriver{} +var _ storageframework.TestDriver = &awsDriver{} -var _ testsuites.PreprovisionedVolumeTestDriver = &awsDriver{} -var _ testsuites.InlineVolumeTestDriver = &awsDriver{} -var _ testsuites.PreprovisionedPVTestDriver = &awsDriver{} -var _ testsuites.DynamicPVTestDriver = &awsDriver{} +var _ storageframework.PreprovisionedVolumeTestDriver = &awsDriver{} +var _ storageframework.InlineVolumeTestDriver = &awsDriver{} +var _ storageframework.PreprovisionedPVTestDriver = &awsDriver{} +var _ storageframework.DynamicPVTestDriver = &awsDriver{} // InitAwsDriver returns awsDriver that implements TestDriver interface -func InitAwsDriver() testsuites.TestDriver { +func InitAwsDriver() storageframework.TestDriver { return &awsDriver{ - driverInfo: testsuites.DriverInfo{ + driverInfo: storageframework.DriverInfo{ Name: "aws", InTreePluginName: "kubernetes.io/aws-ebs", - MaxFileSize: testpatterns.FileSizeMedium, + MaxFileSize: storageframework.FileSizeMedium, SupportedSizeRange: e2evolume.SizeRange{ Min: "1Gi", }, @@ -1688,33 +1683,33 @@ func InitAwsDriver() testsuites.TestDriver { "ntfs", ), SupportedMountOption: sets.NewString("debug", "nouid32"), - TopologyKeys: []string{v1.LabelFailureDomainBetaZone}, - Capabilities: map[testsuites.Capability]bool{ - testsuites.CapPersistence: true, - testsuites.CapFsGroup: true, - testsuites.CapBlock: true, - testsuites.CapExec: true, - testsuites.CapMultiPODs: true, - testsuites.CapControllerExpansion: true, - testsuites.CapNodeExpansion: true, + TopologyKeys: []string{v1.LabelTopologyZone}, + Capabilities: map[storageframework.Capability]bool{ + storageframework.CapPersistence: true, + storageframework.CapFsGroup: true, + storageframework.CapBlock: true, + storageframework.CapExec: true, + storageframework.CapMultiPODs: true, + storageframework.CapControllerExpansion: true, + storageframework.CapNodeExpansion: true, // AWS supports volume limits, but the test creates large // number of volumes and times out test suites. - testsuites.CapVolumeLimits: false, - testsuites.CapTopology: true, + storageframework.CapVolumeLimits: false, + storageframework.CapTopology: true, }, }, } } -func (a *awsDriver) GetDriverInfo() *testsuites.DriverInfo { +func (a *awsDriver) GetDriverInfo() *storageframework.DriverInfo { return &a.driverInfo } -func (a *awsDriver) SkipUnsupportedTest(pattern testpatterns.TestPattern) { +func (a *awsDriver) SkipUnsupportedTest(pattern storageframework.TestPattern) { e2eskipper.SkipUnlessProviderIs("aws") } -func (a *awsDriver) GetVolumeSource(readOnly bool, fsType string, e2evolume testsuites.TestVolume) *v1.VolumeSource { +func (a *awsDriver) GetVolumeSource(readOnly bool, fsType string, e2evolume storageframework.TestVolume) *v1.VolumeSource { av, ok := e2evolume.(*awsVolume) framework.ExpectEqual(ok, true, "Failed to cast test volume to AWS test volume") volSource := v1.VolumeSource{ @@ -1729,7 +1724,7 @@ func (a *awsDriver) GetVolumeSource(readOnly bool, fsType string, e2evolume test return &volSource } -func (a *awsDriver) GetPersistentVolumeSource(readOnly bool, fsType string, e2evolume testsuites.TestVolume) (*v1.PersistentVolumeSource, *v1.VolumeNodeAffinity) { +func (a *awsDriver) GetPersistentVolumeSource(readOnly bool, fsType string, e2evolume storageframework.TestVolume) (*v1.PersistentVolumeSource, *v1.VolumeNodeAffinity) { av, ok := e2evolume.(*awsVolume) framework.ExpectEqual(ok, true, "Failed to cast test volume to AWS test volume") pvSource := v1.PersistentVolumeSource{ @@ -1744,21 +1739,20 @@ func (a *awsDriver) GetPersistentVolumeSource(readOnly bool, fsType string, e2ev return &pvSource, nil } -func (a *awsDriver) GetDynamicProvisionStorageClass(config *testsuites.PerTestConfig, fsType string) *storagev1.StorageClass { +func (a *awsDriver) GetDynamicProvisionStorageClass(config *storageframework.PerTestConfig, fsType string) *storagev1.StorageClass { provisioner := "kubernetes.io/aws-ebs" parameters := map[string]string{} if fsType != "" { parameters["fsType"] = fsType } ns := config.Framework.Namespace.Name - suffix := fmt.Sprintf("%s-sc", a.driverInfo.Name) delayedBinding := storagev1.VolumeBindingWaitForFirstConsumer - return testsuites.GetStorageClass(provisioner, parameters, &delayedBinding, ns, suffix) + return storageframework.GetStorageClass(provisioner, parameters, &delayedBinding, ns) } -func (a *awsDriver) PrepareTest(f *framework.Framework) (*testsuites.PerTestConfig, func()) { - config := &testsuites.PerTestConfig{ +func (a *awsDriver) PrepareTest(f *framework.Framework) (*storageframework.PerTestConfig, func()) { + config := &storageframework.PerTestConfig{ Driver: a, Prefix: "aws", Framework: f, @@ -1774,14 +1768,14 @@ func (a *awsDriver) PrepareTest(f *framework.Framework) (*testsuites.PerTestConf return config, func() {} } -func (a *awsDriver) CreateVolume(config *testsuites.PerTestConfig, volType testpatterns.TestVolType) testsuites.TestVolume { +func (a *awsDriver) CreateVolume(config *storageframework.PerTestConfig, volType storageframework.TestVolType) storageframework.TestVolume { zone := getInlineVolumeZone(config.Framework) - if volType == testpatterns.InlineVolume { + if volType == storageframework.InlineVolume { // PD will be created in framework.TestContext.CloudConfig.Zone zone, // so pods should be also scheduled there. config.ClientNodeSelection = e2epod.NodeSelection{ Selector: map[string]string{ - v1.LabelFailureDomainBetaZone: zone, + v1.LabelTopologyZone: zone, }, } } @@ -1799,7 +1793,7 @@ func (v *awsVolume) DeleteVolume() { // local type localDriver struct { - driverInfo testsuites.DriverInfo + driverInfo storageframework.DriverInfo node *v1.Node hostExec utils.HostExec // volumeType represents local volume type we are testing, e.g. tmpfs, @@ -1815,22 +1809,22 @@ type localVolume struct { var ( // capabilities - defaultLocalVolumeCapabilities = map[testsuites.Capability]bool{ - testsuites.CapPersistence: true, - testsuites.CapFsGroup: true, - testsuites.CapBlock: false, - testsuites.CapExec: true, - testsuites.CapMultiPODs: true, - testsuites.CapSingleNodeVolume: true, - } - localVolumeCapabitilies = map[utils.LocalVolumeType]map[testsuites.Capability]bool{ + defaultLocalVolumeCapabilities = map[storageframework.Capability]bool{ + storageframework.CapPersistence: true, + storageframework.CapFsGroup: true, + storageframework.CapBlock: false, + storageframework.CapExec: true, + storageframework.CapMultiPODs: true, + storageframework.CapSingleNodeVolume: true, + } + localVolumeCapabitilies = map[utils.LocalVolumeType]map[storageframework.Capability]bool{ utils.LocalVolumeBlock: { - testsuites.CapPersistence: true, - testsuites.CapFsGroup: true, - testsuites.CapBlock: true, - testsuites.CapExec: true, - testsuites.CapMultiPODs: true, - testsuites.CapSingleNodeVolume: true, + storageframework.CapPersistence: true, + storageframework.CapFsGroup: true, + storageframework.CapBlock: true, + storageframework.CapExec: true, + storageframework.CapMultiPODs: true, + storageframework.CapSingleNodeVolume: true, }, } // fstype @@ -1843,16 +1837,16 @@ var ( ), } // max file size - defaultLocalVolumeMaxFileSize = testpatterns.FileSizeSmall + defaultLocalVolumeMaxFileSize = storageframework.FileSizeSmall localVolumeMaxFileSizes = map[utils.LocalVolumeType]int64{} ) -var _ testsuites.TestDriver = &localDriver{} -var _ testsuites.PreprovisionedVolumeTestDriver = &localDriver{} -var _ testsuites.PreprovisionedPVTestDriver = &localDriver{} +var _ storageframework.TestDriver = &localDriver{} +var _ storageframework.PreprovisionedVolumeTestDriver = &localDriver{} +var _ storageframework.PreprovisionedPVTestDriver = &localDriver{} // InitLocalDriverWithVolumeType initializes the local driver based on the volume type. -func InitLocalDriverWithVolumeType(volumeType utils.LocalVolumeType) func() testsuites.TestDriver { +func InitLocalDriverWithVolumeType(volumeType utils.LocalVolumeType) func() storageframework.TestDriver { maxFileSize := defaultLocalVolumeMaxFileSize if maxFileSizeByVolType, ok := localVolumeMaxFileSizes[volumeType]; ok { maxFileSize = maxFileSizeByVolType @@ -1865,7 +1859,7 @@ func InitLocalDriverWithVolumeType(volumeType utils.LocalVolumeType) func() test if capabilitiesByType, ok := localVolumeCapabitilies[volumeType]; ok { capabilities = capabilitiesByType } - return func() testsuites.TestDriver { + return func() storageframework.TestDriver { // custom tag to distinguish from tests of other volume types featureTag := fmt.Sprintf("[LocalVolumeType: %s]", volumeType) // For GCE Local SSD volumes, we must run serially @@ -1873,7 +1867,7 @@ func InitLocalDriverWithVolumeType(volumeType utils.LocalVolumeType) func() test featureTag += " [Serial]" } return &localDriver{ - driverInfo: testsuites.DriverInfo{ + driverInfo: storageframework.DriverInfo{ Name: "local", InTreePluginName: "kubernetes.io/local-volume", FeatureTag: featureTag, @@ -1886,14 +1880,14 @@ func InitLocalDriverWithVolumeType(volumeType utils.LocalVolumeType) func() test } } -func (l *localDriver) GetDriverInfo() *testsuites.DriverInfo { +func (l *localDriver) GetDriverInfo() *storageframework.DriverInfo { return &l.driverInfo } -func (l *localDriver) SkipUnsupportedTest(pattern testpatterns.TestPattern) { +func (l *localDriver) SkipUnsupportedTest(pattern storageframework.TestPattern) { } -func (l *localDriver) PrepareTest(f *framework.Framework) (*testsuites.PerTestConfig, func()) { +func (l *localDriver) PrepareTest(f *framework.Framework) (*storageframework.PerTestConfig, func()) { var err error l.node, err = e2enode.GetRandomReadySchedulableNode(f.ClientSet) framework.ExpectNoError(err) @@ -1915,7 +1909,7 @@ func (l *localDriver) PrepareTest(f *framework.Framework) (*testsuites.PerTestCo } } - return &testsuites.PerTestConfig{ + return &storageframework.PerTestConfig{ Driver: l, Prefix: "local", Framework: f, @@ -1925,9 +1919,9 @@ func (l *localDriver) PrepareTest(f *framework.Framework) (*testsuites.PerTestCo } } -func (l *localDriver) CreateVolume(config *testsuites.PerTestConfig, volType testpatterns.TestVolType) testsuites.TestVolume { +func (l *localDriver) CreateVolume(config *storageframework.PerTestConfig, volType storageframework.TestVolType) storageframework.TestVolume { switch volType { - case testpatterns.PreprovisionedPV: + case storageframework.PreprovisionedPV: node := l.node // assign this to schedule pod on this node config.ClientNodeSelection = e2epod.NodeSelection{Name: node.Name} @@ -1971,7 +1965,7 @@ func (l *localDriver) nodeAffinityForNode(node *v1.Node) *v1.VolumeNodeAffinity } } -func (l *localDriver) GetPersistentVolumeSource(readOnly bool, fsType string, e2evolume testsuites.TestVolume) (*v1.PersistentVolumeSource, *v1.VolumeNodeAffinity) { +func (l *localDriver) GetPersistentVolumeSource(readOnly bool, fsType string, e2evolume storageframework.TestVolume) (*v1.PersistentVolumeSource, *v1.VolumeNodeAffinity) { lv, ok := e2evolume.(*localVolume) framework.ExpectEqual(ok, true, "Failed to cast test volume to local test volume") return &v1.PersistentVolumeSource{ diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/drivers/proxy/io.go b/vendor/k8s.io/kubernetes/test/e2e/storage/drivers/proxy/io.go new file mode 100644 index 000000000000..74fb6e1fa48f --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/drivers/proxy/io.go @@ -0,0 +1,82 @@ +/* +Copyright 2020 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package proxy + +import ( + "fmt" + + "k8s.io/kubernetes/test/e2e/framework" + "k8s.io/kubernetes/test/e2e/storage/drivers/csi-test/mock/service" +) + +type PodDirIO struct { + F *framework.Framework + Namespace string + PodName string + ContainerName string +} + +var _ service.DirIO = PodDirIO{} + +func (p PodDirIO) DirExists(path string) (bool, error) { + stdout, stderr, err := p.execute([]string{ + "sh", + "-c", + fmt.Sprintf("if ! [ -e '%s' ]; then echo notexist; elif [ -d '%s' ]; then echo dir; else echo nodir; fi", path, path), + }) + if err != nil { + return false, fmt.Errorf("error executing dir test commands: stderr=%q, %v", stderr, err) + } + switch stdout { + case "notexist": + return false, nil + case "nodir": + return false, fmt.Errorf("%s: not a directory", path) + case "dir": + return true, nil + default: + return false, fmt.Errorf("unexpected output from dir test commands: %q", stdout) + } +} + +func (p PodDirIO) Mkdir(path string) error { + _, stderr, err := p.execute([]string{"mkdir", path}) + if err != nil { + return fmt.Errorf("mkdir %q: stderr=%q, %v", path, stderr, err) + } + return nil +} + +func (p PodDirIO) RemoveAll(path string) error { + _, stderr, err := p.execute([]string{"rm", "-rf", path}) + if err != nil { + return fmt.Errorf("rm -rf %q: stderr=%q, %v", path, stderr, err) + } + return nil +} + +func (p PodDirIO) execute(command []string) (string, string, error) { + return p.F.ExecWithOptions(framework.ExecOptions{ + Command: command, + Namespace: p.Namespace, + PodName: p.PodName, + ContainerName: p.ContainerName, + CaptureStdout: true, + CaptureStderr: true, + Quiet: true, + }) +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/drivers/proxy/portproxy.go b/vendor/k8s.io/kubernetes/test/e2e/storage/drivers/proxy/portproxy.go new file mode 100644 index 000000000000..aef56974ad88 --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/drivers/proxy/portproxy.go @@ -0,0 +1,336 @@ +/* +Copyright 2020 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package proxy + +import ( + "context" + "errors" + "fmt" + "io" + "io/ioutil" + "net" + "net/http" + "sync" + "sync/atomic" + "time" + + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/util/httpstream" + "k8s.io/client-go/kubernetes" + "k8s.io/client-go/kubernetes/scheme" + "k8s.io/client-go/rest" + "k8s.io/client-go/tools/portforward" + "k8s.io/client-go/transport/spdy" + "k8s.io/klog/v2" +) + +// Maximum number of forwarded connections. In practice we don't +// need more than one per sidecar and kubelet. Keeping this reasonably +// small ensures that we don't establish connections through the apiserver +// and the remote kernel which then arent' needed. +const maxConcurrentConnections = 10 + +// Listen creates a listener which returns new connections whenever someone connects +// to a socat or mock driver proxy instance running inside the given pod. +// +// socat must by started with ",fork TCP-LISTEN:,reuseport" +// for this to work. "" can be anything that accepts connections, +// for example "UNIX-LISTEN:/csi/csi.sock". In this mode, socat will +// accept exactly one connection on the given port for each connection +// that socat itself accepted. +// +// Listening stops when the context is done or Close() is called. +func Listen(ctx context.Context, clientset kubernetes.Interface, restConfig *rest.Config, addr Addr) (net.Listener, error) { + // We connect through port forwarding. Strictly + // speaking this is overkill because we don't need a local + // port. But this way we can reuse client-go/tools/portforward + // instead of having to replicate handleConnection + // in our own code. + restClient := clientset.CoreV1().RESTClient() + if restConfig.GroupVersion == nil { + restConfig.GroupVersion = &schema.GroupVersion{} + } + if restConfig.NegotiatedSerializer == nil { + restConfig.NegotiatedSerializer = scheme.Codecs + } + + // The setup code around the actual portforward is from + // https://github.com/kubernetes/kubernetes/blob/c652ffbe4a29143623a1aaec39f745575f7e43ad/staging/src/k8s.io/kubectl/pkg/cmd/portforward/portforward.go + req := restClient.Post(). + Resource("pods"). + Namespace(addr.Namespace). + Name(addr.PodName). + SubResource("portforward") + transport, upgrader, err := spdy.RoundTripperFor(restConfig) + if err != nil { + return nil, fmt.Errorf("create round tripper: %v", err) + } + dialer := spdy.NewDialer(upgrader, &http.Client{Transport: transport}, "POST", req.URL()) + + prefix := fmt.Sprintf("port forwarding for %s", addr) + ctx, cancel := context.WithCancel(ctx) + l := &listener{ + connections: make(chan *connection), + ctx: ctx, + cancel: cancel, + addr: addr, + } + + var connectionsCreated, connectionsClosed int32 + + runForwarding := func() { + klog.V(2).Infof("%s: starting connection polling", prefix) + defer klog.V(2).Infof("%s: connection polling ended", prefix) + + // This delay determines how quickly we notice when someone has + // connected inside the cluster. With socat, we cannot make this too small + // because otherwise we get many rejected connections. With the mock + // driver as proxy that doesn't happen as long as we don't + // ask for too many concurrent connections because the mock driver + // keeps the listening port open at all times and the Linux + // kernel automatically accepts our connection requests. + tryConnect := time.NewTicker(100 * time.Millisecond) + defer tryConnect.Stop() + for { + select { + case <-ctx.Done(): + return + case <-tryConnect.C: + currentClosed := atomic.LoadInt32(&connectionsClosed) + openConnections := connectionsCreated - currentClosed + if openConnections >= maxConcurrentConnections { + break + } + + klog.V(5).Infof("%s: trying to create a new connection #%d, %d open", prefix, connectionsCreated, openConnections) + stream, err := dial(ctx, fmt.Sprintf("%s #%d", prefix, connectionsCreated), dialer, addr.Port) + if err != nil { + klog.Errorf("%s: no connection: %v", prefix, err) + break + } + // Make the connection available to Accept below. + klog.V(5).Infof("%s: created a new connection #%d", prefix, connectionsCreated) + l.connections <- &connection{ + stream: stream, + addr: addr, + counter: connectionsCreated, + closed: &connectionsClosed, + } + connectionsCreated++ + } + } + } + + // Portforwarding and polling for connections run in the background. + go func() { + for { + running := false + pod, err := clientset.CoreV1().Pods(addr.Namespace).Get(ctx, addr.PodName, metav1.GetOptions{}) + if err != nil { + klog.V(5).Infof("checking for container %q in pod %s/%s: %v", addr.ContainerName, addr.Namespace, addr.PodName, err) + } + for i, status := range pod.Status.ContainerStatuses { + if pod.Spec.Containers[i].Name == addr.ContainerName && + status.State.Running != nil { + running = true + break + } + } + + if running { + klog.V(2).Infof("container %q in pod %s/%s is running", addr.ContainerName, addr.Namespace, addr.PodName) + runForwarding() + } + + select { + case <-ctx.Done(): + return + // Sleep a bit before restarting. This is + // where we potentially wait for the pod to + // start. + case <-time.After(1 * time.Second): + } + } + }() + + return l, nil +} + +// Addr contains all relevant parameters for a certain port in a pod. +// The container must be running before connections are attempted. +type Addr struct { + Namespace, PodName, ContainerName string + Port int +} + +var _ net.Addr = Addr{} + +func (a Addr) Network() string { + return "port-forwarding" +} + +func (a Addr) String() string { + return fmt.Sprintf("%s/%s:%d", a.Namespace, a.PodName, a.Port) +} + +type stream struct { + httpstream.Stream + streamConn httpstream.Connection +} + +func dial(ctx context.Context, prefix string, dialer httpstream.Dialer, port int) (s *stream, finalErr error) { + streamConn, _, err := dialer.Dial(portforward.PortForwardProtocolV1Name) + if err != nil { + return nil, fmt.Errorf("dialer failed: %v", err) + } + requestID := "1" + defer func() { + if finalErr != nil { + streamConn.Close() + } + }() + + // create error stream + headers := http.Header{} + headers.Set(v1.StreamType, v1.StreamTypeError) + headers.Set(v1.PortHeader, fmt.Sprintf("%d", port)) + headers.Set(v1.PortForwardRequestIDHeader, requestID) + + // We're not writing to this stream, just reading an error message from it. + // This happens asynchronously. + errorStream, err := streamConn.CreateStream(headers) + if err != nil { + return nil, fmt.Errorf("error creating error stream: %v", err) + } + errorStream.Close() + go func() { + message, err := ioutil.ReadAll(errorStream) + switch { + case err != nil: + klog.Errorf("%s: error reading from error stream: %v", prefix, err) + case len(message) > 0: + klog.Errorf("%s: an error occurred connecting to the remote port: %v", prefix, string(message)) + } + }() + + // create data stream + headers.Set(v1.StreamType, v1.StreamTypeData) + dataStream, err := streamConn.CreateStream(headers) + if err != nil { + return nil, fmt.Errorf("error creating data stream: %v", err) + } + + return &stream{ + Stream: dataStream, + streamConn: streamConn, + }, nil +} + +func (s *stream) Close() { + s.Stream.Close() + s.streamConn.Close() +} + +type listener struct { + addr Addr + connections chan *connection + ctx context.Context + cancel func() +} + +var _ net.Listener = &listener{} + +func (l *listener) Close() error { + klog.V(5).Infof("forward listener for %s: closing", l.addr) + l.cancel() + return nil +} + +func (l *listener) Accept() (net.Conn, error) { + select { + case <-l.ctx.Done(): + return nil, errors.New("listening was stopped") + case c := <-l.connections: + klog.V(5).Infof("forward listener for %s: got a new connection #%d", l.addr, c.counter) + return c, nil + } +} + +type connection struct { + stream *stream + addr Addr + counter int32 + closed *int32 + mutex sync.Mutex +} + +var _ net.Conn = &connection{} + +func (c *connection) LocalAddr() net.Addr { + return c.addr +} + +func (c *connection) RemoteAddr() net.Addr { + return c.addr +} + +func (c *connection) SetDeadline(t time.Time) error { + return nil +} + +func (c *connection) SetReadDeadline(t time.Time) error { + return nil +} + +func (c *connection) SetWriteDeadline(t time.Time) error { + return nil +} + +func (c *connection) Read(b []byte) (int, error) { + n, err := c.stream.Read(b) + if errors.Is(err, io.EOF) { + klog.V(5).Infof("forward connection #%d for %s: remote side closed the stream", c.counter, c.addr) + } + return n, err +} + +func (c *connection) Write(b []byte) (int, error) { + n, err := c.stream.Write(b) + if errors.Is(err, io.EOF) { + klog.V(5).Infof("forward connection #%d for %s: remote side closed the stream", c.counter, c.addr) + } + return n, err +} + +func (c *connection) Close() error { + c.mutex.Lock() + defer c.mutex.Unlock() + if c.closed != nil { + // Do the logging and book-keeping only once. The function itself may be called more than once. + klog.V(5).Infof("forward connection #%d for %s: closing our side", c.counter, c.addr) + atomic.AddInt32(c.closed, 1) + c.closed = nil + } + c.stream.Close() + return nil +} + +func (l *listener) Addr() net.Addr { + return l.addr +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/external/BUILD b/vendor/k8s.io/kubernetes/test/e2e/storage/external/BUILD deleted file mode 100644 index a469aff19e11..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/external/BUILD +++ /dev/null @@ -1,54 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["external.go"], - importpath = "k8s.io/kubernetes/test/e2e/storage/external", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/storage/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//test/e2e/framework:go_default_library", - "//test/e2e/framework/config:go_default_library", - "//test/e2e/framework/pod:go_default_library", - "//test/e2e/framework/skipper:go_default_library", - "//test/e2e/framework/volume:go_default_library", - "//test/e2e/storage/testpatterns:go_default_library", - "//test/e2e/storage/testsuites:go_default_library", - "//test/e2e/storage/utils:go_default_library", - "//vendor/github.com/onsi/ginkgo:go_default_library", - "//vendor/github.com/pkg/errors:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["external_test.go"], - data = glob(["testdata/**"]), - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//test/e2e/framework/volume:go_default_library", - "//test/e2e/storage/testsuites:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/external/external.go b/vendor/k8s.io/kubernetes/test/e2e/storage/external/external.go index fbd7678f5c10..80061031f8e4 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/external/external.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/external/external.go @@ -18,8 +18,10 @@ package external import ( "context" + "encoding/json" "flag" "io/ioutil" + "time" "github.com/pkg/errors" @@ -30,12 +32,14 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/client-go/kubernetes/scheme" + klog "k8s.io/klog/v2" "k8s.io/kubernetes/test/e2e/framework" e2econfig "k8s.io/kubernetes/test/e2e/framework/config" + e2elog "k8s.io/kubernetes/test/e2e/framework/log" e2epod "k8s.io/kubernetes/test/e2e/framework/pod" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" e2evolume "k8s.io/kubernetes/test/e2e/framework/volume" - "k8s.io/kubernetes/test/e2e/storage/testpatterns" + storageframework "k8s.io/kubernetes/test/e2e/storage/framework" "k8s.io/kubernetes/test/e2e/storage/testsuites" "k8s.io/kubernetes/test/e2e/storage/utils" @@ -51,7 +55,7 @@ type driverDefinition struct { // for details. The only field with a non-zero default is the list of // supported file systems (SupportedFsType): it is set so that tests using // the default file system are enabled. - DriverInfo testsuites.DriverInfo + DriverInfo storageframework.DriverInfo // StorageClass must be set to enable dynamic provisioning tests. // The default is to not run those tests. @@ -120,14 +124,15 @@ type driverDefinition struct { ReadOnly bool } - // SupportedSizeRange defines the desired size of dynamically - // provisioned volumes. - SupportedSizeRange e2evolume.SizeRange - // ClientNodeName selects a specific node for scheduling test pods. // Can be left empty. Most drivers should not need this and instead // use topology to ensure that pods land on the right node(s). ClientNodeName string + + // Timeouts contains the custom timeouts used during the test execution. + // The values specified here will override the default values specified in + // the framework.TimeoutContext struct. + Timeouts map[string]string } func init() { @@ -158,6 +163,7 @@ func (t testDriverParameter) Set(filename string) error { // to define the tests. func AddDriverDefinition(filename string) error { driver, err := loadDriverDefinition(filename) + e2elog.Logf("Driver loaded from path [%s]: %+v", filename, driver) if err != nil { return err } @@ -165,9 +171,9 @@ func AddDriverDefinition(filename string) error { return errors.Errorf("%q: DriverInfo.Name not set", filename) } - description := "External Storage " + testsuites.GetDriverNameWithFeatureTags(driver) + description := "External Storage " + storageframework.GetDriverNameWithFeatureTags(driver) ginkgo.Describe(description, func() { - testsuites.DefineTestSuite(driver, testsuites.CSISuites) + storageframework.DefineTestSuites(driver, testsuites.CSISuites) }) return nil @@ -183,13 +189,13 @@ func loadDriverDefinition(filename string) (*driverDefinition, error) { } // Some reasonable defaults follow. driver := &driverDefinition{ - DriverInfo: testsuites.DriverInfo{ + DriverInfo: storageframework.DriverInfo{ SupportedFsType: sets.NewString( "", // Default fsType ), - }, - SupportedSizeRange: e2evolume.SizeRange{ - Min: "5Gi", + SupportedSizeRange: e2evolume.SizeRange{ + Min: "5Gi", + }, }, } // TODO: strict checking of the file content once https://github.com/kubernetes/kubernetes/pull/71589 @@ -200,18 +206,20 @@ func loadDriverDefinition(filename string) (*driverDefinition, error) { return driver, nil } -var _ testsuites.TestDriver = &driverDefinition{} +var _ storageframework.TestDriver = &driverDefinition{} // We have to implement the interface because dynamic PV may or may // not be supported. driverDefinition.SkipUnsupportedTest checks that // based on the actual driver definition. -var _ testsuites.DynamicPVTestDriver = &driverDefinition{} +var _ storageframework.DynamicPVTestDriver = &driverDefinition{} // Same for snapshotting. -var _ testsuites.SnapshottableTestDriver = &driverDefinition{} +var _ storageframework.SnapshottableTestDriver = &driverDefinition{} // And for ephemeral volumes. -var _ testsuites.EphemeralTestDriver = &driverDefinition{} +var _ storageframework.EphemeralTestDriver = &driverDefinition{} + +var _ storageframework.CustomTimeoutsTestDriver = &driverDefinition{} // runtime.DecodeInto needs a runtime.Object but doesn't do any // deserialization of it and therefore none of the methods below need @@ -226,49 +234,36 @@ func (d *driverDefinition) GetObjectKind() schema.ObjectKind { return nil } -func (d *driverDefinition) GetDriverInfo() *testsuites.DriverInfo { +func (d *driverDefinition) GetDriverInfo() *storageframework.DriverInfo { return &d.DriverInfo } -func (d *driverDefinition) SkipUnsupportedTest(pattern testpatterns.TestPattern) { +func (d *driverDefinition) SkipUnsupportedTest(pattern storageframework.TestPattern) { supported := false // TODO (?): add support for more volume types switch pattern.VolType { case "": supported = true - case testpatterns.DynamicPV: + case storageframework.DynamicPV, storageframework.GenericEphemeralVolume: if d.StorageClass.FromName || d.StorageClass.FromFile != "" || d.StorageClass.FromExistingClassName != "" { supported = true } - case testpatterns.CSIInlineVolume: + case storageframework.CSIInlineVolume: supported = len(d.InlineVolumes) != 0 } if !supported { e2eskipper.Skipf("Driver %q does not support volume type %q - skipping", d.DriverInfo.Name, pattern.VolType) } - supported = false - switch pattern.SnapshotType { - case "": - supported = true - case testpatterns.DynamicCreatedSnapshot, testpatterns.PreprovisionedCreatedSnapshot: - if d.SnapshotClass.FromName || d.SnapshotClass.FromFile != "" || d.SnapshotClass.FromExistingClassName != "" { - supported = true - } - } - if !supported { - e2eskipper.Skipf("Driver %q does not support snapshot type %q - skipping", d.DriverInfo.Name, pattern.SnapshotType) - } } -func (d *driverDefinition) GetDynamicProvisionStorageClass(e2econfig *testsuites.PerTestConfig, fsType string) *storagev1.StorageClass { +func (d *driverDefinition) GetDynamicProvisionStorageClass(e2econfig *storageframework.PerTestConfig, fsType string) *storagev1.StorageClass { var ( sc *storagev1.StorageClass err error ) f := e2econfig.Framework - switch { case d.StorageClass.FromName: sc = &storagev1.StorageClass{Provisioner: d.DriverInfo.Name} @@ -277,11 +272,9 @@ func (d *driverDefinition) GetDynamicProvisionStorageClass(e2econfig *testsuites framework.ExpectNoError(err, "getting storage class %s", d.StorageClass.FromExistingClassName) case d.StorageClass.FromFile != "": var ok bool - items, err := utils.LoadFromManifests(d.StorageClass.FromFile) framework.ExpectNoError(err, "load storage class from %s", d.StorageClass.FromFile) framework.ExpectEqual(len(items), 1, "exactly one item from %s", d.StorageClass.FromFile) - err = utils.PatchItems(f, f.Namespace, items...) framework.ExpectNoError(err, "patch items") @@ -299,7 +292,43 @@ func (d *driverDefinition) GetDynamicProvisionStorageClass(e2econfig *testsuites // reconsidered if we eventually need to move in-tree storage tests out. sc.Parameters["csi.storage.k8s.io/fstype"] = fsType } - return testsuites.GetStorageClass(sc.Provisioner, sc.Parameters, sc.VolumeBindingMode, f.Namespace.Name, "e2e-sc") + return storageframework.CopyStorageClass(sc, f.Namespace.Name, "e2e-sc") +} + +func (d *driverDefinition) GetTimeouts() *framework.TimeoutContext { + timeouts := framework.NewTimeoutContextWithDefaults() + if d.Timeouts == nil { + return timeouts + } + + // Use a temporary map to hold the timeouts specified in the manifest file + c := make(map[string]time.Duration) + for k, v := range d.Timeouts { + duration, err := time.ParseDuration(v) + if err != nil { + // We can't use ExpectNoError() because his method can be called out of an It(), + // so we simply log the error and return the default timeouts. + klog.Errorf("Could not parse duration for key %s, will use default values: %v", k, err) + return timeouts + } + c[k] = duration + } + + // Convert the temporary map holding the custom timeouts to JSON + t, err := json.Marshal(c) + if err != nil { + klog.Errorf("Could not marshal custom timeouts, will use default values: %v", err) + return timeouts + } + + // Override the default timeouts with the custom ones + err = json.Unmarshal(t, &timeouts) + if err != nil { + klog.Errorf("Could not unmarshal custom timeouts, will use default values: %v", err) + return timeouts + } + + return timeouts } func loadSnapshotClass(filename string) (*unstructured.Unstructured, error) { @@ -316,14 +345,13 @@ func loadSnapshotClass(filename string) (*unstructured.Unstructured, error) { return snapshotClass, nil } -func (d *driverDefinition) GetSnapshotClass(e2econfig *testsuites.PerTestConfig) *unstructured.Unstructured { +func (d *driverDefinition) GetSnapshotClass(e2econfig *storageframework.PerTestConfig, parameters map[string]string) *unstructured.Unstructured { if !d.SnapshotClass.FromName && d.SnapshotClass.FromFile == "" && d.SnapshotClass.FromExistingClassName == "" { e2eskipper.Skipf("Driver %q does not support snapshotting - skipping", d.DriverInfo.Name) } f := e2econfig.Framework snapshotter := d.DriverInfo.Name - parameters := map[string]string{} ns := e2econfig.Framework.Namespace.Name suffix := "vsc" @@ -331,7 +359,7 @@ func (d *driverDefinition) GetSnapshotClass(e2econfig *testsuites.PerTestConfig) case d.SnapshotClass.FromName: // Do nothing (just use empty parameters) case d.SnapshotClass.FromExistingClassName != "": - snapshotClass, err := f.DynamicClient.Resource(testsuites.SnapshotClassGVR).Get(context.TODO(), d.SnapshotClass.FromExistingClassName, metav1.GetOptions{}) + snapshotClass, err := f.DynamicClient.Resource(utils.SnapshotClassGVR).Get(context.TODO(), d.SnapshotClass.FromExistingClassName, metav1.GetOptions{}) framework.ExpectNoError(err, "getting snapshot class %s", d.SnapshotClass.FromExistingClassName) if params, ok := snapshotClass.Object["parameters"].(map[string]interface{}); ok { @@ -358,10 +386,10 @@ func (d *driverDefinition) GetSnapshotClass(e2econfig *testsuites.PerTestConfig) } } - return testsuites.GetSnapshotClass(snapshotter, parameters, ns, suffix) + return utils.GenerateSnapshotClassSpec(snapshotter, parameters, ns, suffix) } -func (d *driverDefinition) GetVolume(e2econfig *testsuites.PerTestConfig, volumeNumber int) (map[string]string, bool, bool) { +func (d *driverDefinition) GetVolume(e2econfig *storageframework.PerTestConfig, volumeNumber int) (map[string]string, bool, bool) { if len(d.InlineVolumes) == 0 { e2eskipper.Skipf("%s does not have any InlineVolumeAttributes defined", d.DriverInfo.Name) } @@ -369,12 +397,12 @@ func (d *driverDefinition) GetVolume(e2econfig *testsuites.PerTestConfig, volume return e2evolume.Attributes, e2evolume.Shared, e2evolume.ReadOnly } -func (d *driverDefinition) GetCSIDriverName(e2econfig *testsuites.PerTestConfig) string { +func (d *driverDefinition) GetCSIDriverName(e2econfig *storageframework.PerTestConfig) string { return d.DriverInfo.Name } -func (d *driverDefinition) PrepareTest(f *framework.Framework) (*testsuites.PerTestConfig, func()) { - e2econfig := &testsuites.PerTestConfig{ +func (d *driverDefinition) PrepareTest(f *framework.Framework) (*storageframework.PerTestConfig, func()) { + e2econfig := &storageframework.PerTestConfig{ Driver: d, Prefix: "external", Framework: f, diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/flexvolume_mounted_volume_resize.go b/vendor/k8s.io/kubernetes/test/e2e/storage/flexvolume_mounted_volume_resize.go index b94ad7e854b3..2c093248d082 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/flexvolume_mounted_volume_resize.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/flexvolume_mounted_volume_resize.go @@ -86,6 +86,7 @@ var _ = utils.SIGDescribe("[Feature:Flexvolumes] Mounted flexvolume expand[Slow] test := testsuites.StorageClassTest{ Name: "flexvolume-resize", + Timeouts: f.Timeouts, ClaimSize: "2Gi", AllowVolumeExpansion: true, Provisioner: "flex-expand", diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/flexvolume_online_resize.go b/vendor/k8s.io/kubernetes/test/e2e/storage/flexvolume_online_resize.go index 04a6681213f1..242e1ade21d1 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/flexvolume_online_resize.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/flexvolume_online_resize.go @@ -79,6 +79,7 @@ var _ = utils.SIGDescribe("Mounted flexvolume volume expand [Slow] [Feature:Expa test := testsuites.StorageClassTest{ Name: "flexvolume-resize", + Timeouts: f.Timeouts, ClaimSize: "2Gi", AllowVolumeExpansion: true, Provisioner: "flex-expand", diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/framework/driver_operations.go b/vendor/k8s.io/kubernetes/test/e2e/storage/framework/driver_operations.go new file mode 100644 index 000000000000..c1ca2f200094 --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/framework/driver_operations.go @@ -0,0 +1,87 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package framework + +import ( + "fmt" + + storagev1 "k8s.io/api/storage/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apiserver/pkg/storage/names" + "k8s.io/kubernetes/test/e2e/framework" +) + +// GetDriverNameWithFeatureTags returns driver name with feature tags +// For example) +// - [Driver: nfs] +// - [Driver: rbd][Feature:Volumes] +func GetDriverNameWithFeatureTags(driver TestDriver) string { + dInfo := driver.GetDriverInfo() + + return fmt.Sprintf("[Driver: %s]%s", dInfo.Name, dInfo.FeatureTag) +} + +// CreateVolume creates volume for test unless dynamicPV or CSI ephemeral inline volume test +func CreateVolume(driver TestDriver, config *PerTestConfig, volType TestVolType) TestVolume { + switch volType { + case InlineVolume, PreprovisionedPV: + if pDriver, ok := driver.(PreprovisionedVolumeTestDriver); ok { + return pDriver.CreateVolume(config, volType) + } + case CSIInlineVolume, GenericEphemeralVolume, DynamicPV: + // No need to create volume + default: + framework.Failf("Invalid volType specified: %v", volType) + } + return nil +} + +// CopyStorageClass constructs a new StorageClass instance +// with a unique name that is based on namespace + suffix +// using the same storageclass setting from the parameter +func CopyStorageClass(sc *storagev1.StorageClass, ns string, suffix string) *storagev1.StorageClass { + copy := sc.DeepCopy() + copy.ObjectMeta.Name = names.SimpleNameGenerator.GenerateName(ns + "-" + suffix) + copy.ResourceVersion = "" + return copy +} + +// GetStorageClass constructs a new StorageClass instance +// with a unique name that is based on namespace + suffix. +func GetStorageClass( + provisioner string, + parameters map[string]string, + bindingMode *storagev1.VolumeBindingMode, + ns string, +) *storagev1.StorageClass { + if bindingMode == nil { + defaultBindingMode := storagev1.VolumeBindingImmediate + bindingMode = &defaultBindingMode + } + return &storagev1.StorageClass{ + TypeMeta: metav1.TypeMeta{ + Kind: "StorageClass", + }, + ObjectMeta: metav1.ObjectMeta{ + // Name must be unique, so let's base it on namespace name and use GenerateName + Name: names.SimpleNameGenerator.GenerateName(ns), + }, + Provisioner: provisioner, + Parameters: parameters, + VolumeBindingMode: bindingMode, + } +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/framework/snapshot_resource.go b/vendor/k8s.io/kubernetes/test/e2e/storage/framework/snapshot_resource.go new file mode 100644 index 000000000000..026dea2e0a4e --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/framework/snapshot_resource.go @@ -0,0 +1,333 @@ +/* +Copyright 2020 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package framework + +import ( + "context" + "fmt" + + "github.com/onsi/ginkgo" + + apierrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/types" + utilerrors "k8s.io/apimachinery/pkg/util/errors" + "k8s.io/apimachinery/pkg/util/uuid" + "k8s.io/kubernetes/test/e2e/framework" + "k8s.io/kubernetes/test/e2e/storage/utils" +) + +// SnapshotResource represents a snapshot class, a snapshot and its bound snapshot contents for a specific test case +type SnapshotResource struct { + Config *PerTestConfig + Pattern TestPattern + + Vs *unstructured.Unstructured + Vscontent *unstructured.Unstructured + Vsclass *unstructured.Unstructured +} + +// CreateSnapshot creates a VolumeSnapshotClass with given SnapshotDeletionPolicy and a VolumeSnapshot +// from the VolumeSnapshotClass using a dynamic client. +// Returns the unstructured VolumeSnapshotClass and VolumeSnapshot objects. +func CreateSnapshot(sDriver SnapshottableTestDriver, config *PerTestConfig, pattern TestPattern, pvcName string, pvcNamespace string, timeouts *framework.TimeoutContext, parameters map[string]string) (*unstructured.Unstructured, *unstructured.Unstructured) { + defer ginkgo.GinkgoRecover() + var err error + if pattern.SnapshotType != DynamicCreatedSnapshot && pattern.SnapshotType != PreprovisionedCreatedSnapshot { + err = fmt.Errorf("SnapshotType must be set to either DynamicCreatedSnapshot or PreprovisionedCreatedSnapshot") + framework.ExpectNoError(err) + } + dc := config.Framework.DynamicClient + + ginkgo.By("creating a SnapshotClass") + sclass := sDriver.GetSnapshotClass(config, parameters) + if sclass == nil { + framework.Failf("Failed to get snapshot class based on test config") + } + sclass.Object["deletionPolicy"] = pattern.SnapshotDeletionPolicy.String() + + sclass, err = dc.Resource(utils.SnapshotClassGVR).Create(context.TODO(), sclass, metav1.CreateOptions{}) + framework.ExpectNoError(err) + + sclass, err = dc.Resource(utils.SnapshotClassGVR).Get(context.TODO(), sclass.GetName(), metav1.GetOptions{}) + framework.ExpectNoError(err) + + ginkgo.By("creating a dynamic VolumeSnapshot") + // prepare a dynamically provisioned volume snapshot with certain data + snapshot := getSnapshot(pvcName, pvcNamespace, sclass.GetName()) + + snapshot, err = dc.Resource(utils.SnapshotGVR).Namespace(snapshot.GetNamespace()).Create(context.TODO(), snapshot, metav1.CreateOptions{}) + framework.ExpectNoError(err) + + return sclass, snapshot +} + +// CreateSnapshotResource creates a snapshot resource for the current test. It knows how to deal with +// different test pattern snapshot provisioning and deletion policy +func CreateSnapshotResource(sDriver SnapshottableTestDriver, config *PerTestConfig, pattern TestPattern, pvcName string, pvcNamespace string, timeouts *framework.TimeoutContext, parameters map[string]string) *SnapshotResource { + var err error + r := SnapshotResource{ + Config: config, + Pattern: pattern, + } + r.Vsclass, r.Vs = CreateSnapshot(sDriver, config, pattern, pvcName, pvcNamespace, timeouts, parameters) + + dc := r.Config.Framework.DynamicClient + + r.Vscontent = utils.GetSnapshotContentFromSnapshot(dc, r.Vs) + + if pattern.SnapshotType == PreprovisionedCreatedSnapshot { + // prepare a pre-provisioned VolumeSnapshotContent with certain data + // Because this could be run with an external CSI driver, we have no way + // to pre-provision the snapshot as we normally would using their API. + // We instead dynamically take a snapshot (above step), delete the old snapshot, + // and create another snapshot using the first snapshot's snapshot handle. + + ginkgo.By("updating the snapshot content deletion policy to retain") + r.Vscontent.Object["spec"].(map[string]interface{})["deletionPolicy"] = "Retain" + + r.Vscontent, err = dc.Resource(utils.SnapshotContentGVR).Update(context.TODO(), r.Vscontent, metav1.UpdateOptions{}) + framework.ExpectNoError(err) + + ginkgo.By("recording the volume handle and snapshotHandle") + snapshotHandle := r.Vscontent.Object["status"].(map[string]interface{})["snapshotHandle"].(string) + framework.Logf("Recording snapshot handle: %s", snapshotHandle) + csiDriverName := r.Vsclass.Object["driver"].(string) + + // If the deletion policy is retain on vscontent: + // when vs is deleted vscontent will not be deleted + // when the vscontent is manually deleted then the underlying snapshot resource will not be deleted. + // We exploit this to create a snapshot resource from which we can create a preprovisioned snapshot + ginkgo.By("deleting the snapshot and snapshot content") + err = dc.Resource(utils.SnapshotGVR).Namespace(r.Vs.GetNamespace()).Delete(context.TODO(), r.Vs.GetName(), metav1.DeleteOptions{}) + if apierrors.IsNotFound(err) { + err = nil + } + framework.ExpectNoError(err) + + ginkgo.By("checking the Snapshot has been deleted") + err = utils.WaitForNamespacedGVRDeletion(dc, utils.SnapshotGVR, r.Vs.GetName(), r.Vs.GetNamespace(), framework.Poll, timeouts.SnapshotDelete) + framework.ExpectNoError(err) + + err = dc.Resource(utils.SnapshotContentGVR).Delete(context.TODO(), r.Vscontent.GetName(), metav1.DeleteOptions{}) + if apierrors.IsNotFound(err) { + err = nil + } + framework.ExpectNoError(err) + + ginkgo.By("checking the Snapshot content has been deleted") + err = utils.WaitForGVRDeletion(dc, utils.SnapshotContentGVR, r.Vscontent.GetName(), framework.Poll, timeouts.SnapshotDelete) + framework.ExpectNoError(err) + + ginkgo.By("creating a snapshot content with the snapshot handle") + uuid := uuid.NewUUID() + + snapName := getPreProvisionedSnapshotName(uuid) + snapcontentName := getPreProvisionedSnapshotContentName(uuid) + + r.Vscontent = getPreProvisionedSnapshotContent(snapcontentName, snapName, pvcNamespace, snapshotHandle, pattern.SnapshotDeletionPolicy.String(), csiDriverName) + r.Vscontent, err = dc.Resource(utils.SnapshotContentGVR).Create(context.TODO(), r.Vscontent, metav1.CreateOptions{}) + framework.ExpectNoError(err) + + ginkgo.By("creating a snapshot with that snapshot content") + r.Vs = getPreProvisionedSnapshot(snapName, pvcNamespace, snapcontentName) + r.Vs, err = dc.Resource(utils.SnapshotGVR).Namespace(r.Vs.GetNamespace()).Create(context.TODO(), r.Vs, metav1.CreateOptions{}) + framework.ExpectNoError(err) + + err = utils.WaitForSnapshotReady(dc, r.Vs.GetNamespace(), r.Vs.GetName(), framework.Poll, timeouts.SnapshotCreate) + framework.ExpectNoError(err) + + ginkgo.By("getting the snapshot and snapshot content") + r.Vs, err = dc.Resource(utils.SnapshotGVR).Namespace(r.Vs.GetNamespace()).Get(context.TODO(), r.Vs.GetName(), metav1.GetOptions{}) + framework.ExpectNoError(err) + + r.Vscontent, err = dc.Resource(utils.SnapshotContentGVR).Get(context.TODO(), r.Vscontent.GetName(), metav1.GetOptions{}) + framework.ExpectNoError(err) + } + return &r +} + +// CleanupResource cleans up the snapshot resource and ignores not found errors +func (sr *SnapshotResource) CleanupResource(timeouts *framework.TimeoutContext) error { + var err error + var cleanupErrs []error + + dc := sr.Config.Framework.DynamicClient + + if sr.Vs != nil { + framework.Logf("deleting snapshot %q/%q", sr.Vs.GetNamespace(), sr.Vs.GetName()) + + sr.Vs, err = dc.Resource(utils.SnapshotGVR).Namespace(sr.Vs.GetNamespace()).Get(context.TODO(), sr.Vs.GetName(), metav1.GetOptions{}) + switch { + case err == nil: + snapshotStatus := sr.Vs.Object["status"].(map[string]interface{}) + snapshotContentName := snapshotStatus["boundVolumeSnapshotContentName"].(string) + framework.Logf("received snapshotStatus %v", snapshotStatus) + framework.Logf("snapshotContentName %s", snapshotContentName) + + boundVsContent, err := dc.Resource(utils.SnapshotContentGVR).Get(context.TODO(), snapshotContentName, metav1.GetOptions{}) + switch { + case err == nil: + if boundVsContent.Object["spec"].(map[string]interface{})["deletionPolicy"] != "Delete" { + // The purpose of this block is to prevent physical snapshotContent leaks. + // We must update the SnapshotContent to have Delete Deletion policy, + // or else the physical snapshot content will be leaked. + boundVsContent.Object["spec"].(map[string]interface{})["deletionPolicy"] = "Delete" + boundVsContent, err = dc.Resource(utils.SnapshotContentGVR).Update(context.TODO(), boundVsContent, metav1.UpdateOptions{}) + framework.ExpectNoError(err) + } + err = dc.Resource(utils.SnapshotGVR).Namespace(sr.Vs.GetNamespace()).Delete(context.TODO(), sr.Vs.GetName(), metav1.DeleteOptions{}) + if apierrors.IsNotFound(err) { + err = nil + } + framework.ExpectNoError(err) + + err = utils.WaitForGVRDeletion(dc, utils.SnapshotContentGVR, boundVsContent.GetName(), framework.Poll, timeouts.SnapshotDelete) + framework.ExpectNoError(err) + + case apierrors.IsNotFound(err): + // the volume snapshot is not bound to snapshot content yet + err = dc.Resource(utils.SnapshotGVR).Namespace(sr.Vs.GetNamespace()).Delete(context.TODO(), sr.Vs.GetName(), metav1.DeleteOptions{}) + if apierrors.IsNotFound(err) { + err = nil + } + framework.ExpectNoError(err) + + err = utils.WaitForNamespacedGVRDeletion(dc, utils.SnapshotGVR, sr.Vs.GetName(), sr.Vs.GetNamespace(), framework.Poll, timeouts.SnapshotDelete) + framework.ExpectNoError(err) + default: + cleanupErrs = append(cleanupErrs, err) + } + case apierrors.IsNotFound(err): + // Hope that the underlying snapshot content and resource is gone already + default: + cleanupErrs = append(cleanupErrs, err) + } + } + if sr.Vscontent != nil { + framework.Logf("deleting snapshot content %q", sr.Vscontent.GetName()) + + sr.Vscontent, err = dc.Resource(utils.SnapshotContentGVR).Get(context.TODO(), sr.Vscontent.GetName(), metav1.GetOptions{}) + switch { + case err == nil: + if sr.Vscontent.Object["spec"].(map[string]interface{})["deletionPolicy"] != "Delete" { + // The purpose of this block is to prevent physical snapshotContent leaks. + // We must update the SnapshotContent to have Delete Deletion policy, + // or else the physical snapshot content will be leaked. + sr.Vscontent.Object["spec"].(map[string]interface{})["deletionPolicy"] = "Delete" + sr.Vscontent, err = dc.Resource(utils.SnapshotContentGVR).Update(context.TODO(), sr.Vscontent, metav1.UpdateOptions{}) + framework.ExpectNoError(err) + } + err = dc.Resource(utils.SnapshotContentGVR).Delete(context.TODO(), sr.Vscontent.GetName(), metav1.DeleteOptions{}) + if apierrors.IsNotFound(err) { + err = nil + } + framework.ExpectNoError(err) + + err = utils.WaitForGVRDeletion(dc, utils.SnapshotContentGVR, sr.Vscontent.GetName(), framework.Poll, timeouts.SnapshotDelete) + framework.ExpectNoError(err) + case apierrors.IsNotFound(err): + // Hope the underlying physical snapshot resource has been deleted already + default: + cleanupErrs = append(cleanupErrs, err) + } + } + if sr.Vsclass != nil { + framework.Logf("deleting snapshot class %q", sr.Vsclass.GetName()) + // typically this snapshot class has already been deleted + err = dc.Resource(utils.SnapshotClassGVR).Delete(context.TODO(), sr.Vsclass.GetName(), metav1.DeleteOptions{}) + if err != nil && !apierrors.IsNotFound(err) { + framework.Failf("Error deleting snapshot class %q. Error: %v", sr.Vsclass.GetName(), err) + } + err = utils.WaitForGVRDeletion(dc, utils.SnapshotClassGVR, sr.Vsclass.GetName(), framework.Poll, timeouts.SnapshotDelete) + framework.ExpectNoError(err) + } + return utilerrors.NewAggregate(cleanupErrs) +} + +func getSnapshot(claimName string, ns, snapshotClassName string) *unstructured.Unstructured { + snapshot := &unstructured.Unstructured{ + Object: map[string]interface{}{ + "kind": "VolumeSnapshot", + "apiVersion": utils.SnapshotAPIVersion, + "metadata": map[string]interface{}{ + "generateName": "snapshot-", + "namespace": ns, + }, + "spec": map[string]interface{}{ + "volumeSnapshotClassName": snapshotClassName, + "source": map[string]interface{}{ + "persistentVolumeClaimName": claimName, + }, + }, + }, + } + + return snapshot +} +func getPreProvisionedSnapshot(snapName, ns, snapshotContentName string) *unstructured.Unstructured { + snapshot := &unstructured.Unstructured{ + Object: map[string]interface{}{ + "kind": "VolumeSnapshot", + "apiVersion": utils.SnapshotAPIVersion, + "metadata": map[string]interface{}{ + "name": snapName, + "namespace": ns, + }, + "spec": map[string]interface{}{ + "source": map[string]interface{}{ + "volumeSnapshotContentName": snapshotContentName, + }, + }, + }, + } + + return snapshot +} +func getPreProvisionedSnapshotContent(snapcontentName, snapshotName, snapshotNamespace, snapshotHandle, deletionPolicy, csiDriverName string) *unstructured.Unstructured { + snapshotContent := &unstructured.Unstructured{ + Object: map[string]interface{}{ + "kind": "VolumeSnapshotContent", + "apiVersion": utils.SnapshotAPIVersion, + "metadata": map[string]interface{}{ + "name": snapcontentName, + }, + "spec": map[string]interface{}{ + "source": map[string]interface{}{ + "snapshotHandle": snapshotHandle, + }, + "volumeSnapshotRef": map[string]interface{}{ + "name": snapshotName, + "namespace": snapshotNamespace, + }, + "driver": csiDriverName, + "deletionPolicy": deletionPolicy, + }, + }, + } + + return snapshotContent +} + +func getPreProvisionedSnapshotContentName(uuid types.UID) string { + return fmt.Sprintf("pre-provisioned-snapcontent-%s", string(uuid)) +} + +func getPreProvisionedSnapshotName(uuid types.UID) string { + return fmt.Sprintf("pre-provisioned-snapshot-%s", string(uuid)) +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/framework/testconfig.go b/vendor/k8s.io/kubernetes/test/e2e/storage/framework/testconfig.go new file mode 100644 index 000000000000..8a56b71501b0 --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/framework/testconfig.go @@ -0,0 +1,78 @@ +/* +Copyright 2020 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package framework + +import ( + v1 "k8s.io/api/core/v1" + "k8s.io/kubernetes/test/e2e/framework" + e2epod "k8s.io/kubernetes/test/e2e/framework/pod" + e2evolume "k8s.io/kubernetes/test/e2e/framework/volume" +) + +// PerTestConfig represents parameters that control test execution. +// One instance gets allocated for each test and is then passed +// via pointer to functions involved in the test. +type PerTestConfig struct { + // The test driver for the test. + Driver TestDriver + + // Some short word that gets inserted into dynamically + // generated entities (pods, paths) as first part of the name + // to make debugging easier. Can be the same for different + // tests inside the test suite. + Prefix string + + // The framework instance allocated for the current test. + Framework *framework.Framework + + // If non-empty, Pods using a volume will be scheduled + // according to the NodeSelection. Otherwise Kubernetes will + // pick a node. + ClientNodeSelection e2epod.NodeSelection + + // Some test drivers initialize a storage server. This is + // the configuration that then has to be used to run tests. + // The values above are ignored for such tests. + ServerConfig *e2evolume.TestConfig + + // Some drivers run in their own namespace + DriverNamespace *v1.Namespace +} + +// GetUniqueDriverName returns unique driver name that can be used parallelly in tests +func (config *PerTestConfig) GetUniqueDriverName() string { + return config.Driver.GetDriverInfo().Name + "-" + config.Framework.UniqueName +} + +// ConvertTestConfig returns a framework test config with the +// parameters specified for the testsuite or (if available) the +// dynamically created config for the volume server. +// +// This is done because TestConfig is the public API for +// the testsuites package whereas volume.TestConfig is merely +// an implementation detail. It contains fields that have no effect. +func ConvertTestConfig(in *PerTestConfig) e2evolume.TestConfig { + if in.ServerConfig != nil { + return *in.ServerConfig + } + + return e2evolume.TestConfig{ + Namespace: in.Framework.Namespace.Name, + Prefix: in.Prefix, + ClientNodeSelection: in.ClientNodeSelection, + } +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/testdriver.go b/vendor/k8s.io/kubernetes/test/e2e/storage/framework/testdriver.go similarity index 84% rename from vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/testdriver.go rename to vendor/k8s.io/kubernetes/test/e2e/storage/framework/testdriver.go index f1f70d6218a7..0ce0fd5456d9 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/testdriver.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/framework/testdriver.go @@ -14,17 +14,16 @@ See the License for the specific language governing permissions and limitations under the License. */ -package testsuites +package framework import ( - v1 "k8s.io/api/core/v1" + "k8s.io/api/core/v1" storagev1 "k8s.io/api/storage/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/kubernetes/test/e2e/framework" - e2epod "k8s.io/kubernetes/test/e2e/framework/pod" e2evolume "k8s.io/kubernetes/test/e2e/framework/volume" - "k8s.io/kubernetes/test/e2e/storage/testpatterns" + "time" ) // TestDriver represents an interface for a driver to be tested in TestSuite. @@ -44,7 +43,7 @@ type TestDriver interface { // expensive resources like framework.Framework. Tests that // depend on a connection to the cluster can be done in // PrepareTest once the framework is ready. - SkipUnsupportedTest(testpatterns.TestPattern) + SkipUnsupportedTest(TestPattern) // PrepareTest is called at test execution time each time a new test case is about to start. // It sets up all necessary resources and returns the per-test configuration @@ -63,7 +62,7 @@ type TestVolume interface { type PreprovisionedVolumeTestDriver interface { TestDriver // CreateVolume creates a pre-provisioned volume of the desired volume type. - CreateVolume(config *PerTestConfig, volumeType testpatterns.TestVolType) TestVolume + CreateVolume(config *PerTestConfig, volumeType TestVolType) TestVolume } // InlineVolumeTestDriver represents an interface for a TestDriver that supports InlineVolume @@ -126,13 +125,27 @@ type SnapshottableTestDriver interface { TestDriver // GetSnapshotClass returns a SnapshotClass to create snapshot. // It will return nil, if the TestDriver doesn't support it. - GetSnapshotClass(config *PerTestConfig) *unstructured.Unstructured + GetSnapshotClass(config *PerTestConfig, parameters map[string]string) *unstructured.Unstructured +} + +// CustomTimeoutsTestDriver represents an interface fo a TestDriver that supports custom timeouts. +type CustomTimeoutsTestDriver interface { + TestDriver + GetTimeouts() *framework.TimeoutContext +} + +// GetDriverTimeouts returns the timeout of the driver operation +func GetDriverTimeouts(driver TestDriver) *framework.TimeoutContext { + if d, ok := driver.(CustomTimeoutsTestDriver); ok { + return d.GetTimeouts() + } + return framework.NewTimeoutContextWithDefaults() } // Capability represents a feature that a volume plugin supports type Capability string -// Constants related to capability +// Constants related to capabilities and behavior of the driver. const ( CapPersistence Capability = "persistence" // data is persisted across pod restarts CapBlock Capability = "block" // raw block mode @@ -154,6 +167,11 @@ const ( CapVolumeLimits Capability = "volumeLimits" // support volume limits (can be *very* slow) CapSingleNodeVolume Capability = "singleNodeVolume" // support volume that can run on single node (like hostpath) CapTopology Capability = "topology" // support topology + + // The driver publishes storage capacity information: when the storage class + // for dynamic provisioning exists, the driver is expected to provide + // capacity information for it. + CapCapacity Capability = "capacity" ) // DriverInfo represents static information about a TestDriver. @@ -193,6 +211,8 @@ type DriverInfo struct { StressTestOptions *StressTestOptions // [Optional] Scale parameters for volume snapshot stress tests. VolumeSnapshotStressTestOptions *VolumeSnapshotStressTestOptions + // [Optional] Parameters for performance tests + PerformanceTestOptions *PerformanceTestOptions } // StressTestOptions contains parameters used for stress tests. @@ -213,37 +233,23 @@ type VolumeSnapshotStressTestOptions struct { NumSnapshots int } -// PerTestConfig represents parameters that control test execution. -// One instance gets allocated for each test and is then passed -// via pointer to functions involved in the test. -type PerTestConfig struct { - // The test driver for the test. - Driver TestDriver - - // Some short word that gets inserted into dynamically - // generated entities (pods, paths) as first part of the name - // to make debugging easier. Can be the same for different - // tests inside the test suite. - Prefix string - - // The framework instance allocated for the current test. - Framework *framework.Framework - - // If non-empty, Pods using a volume will be scheduled - // according to the NodeSelection. Otherwise Kubernetes will - // pick a node. - ClientNodeSelection e2epod.NodeSelection - - // Some test drivers initialize a storage server. This is - // the configuration that then has to be used to run tests. - // The values above are ignored for such tests. - ServerConfig *e2evolume.TestConfig +// Metrics to evaluate performance of an operation +// TODO: Add metrics like median, mode, standard deviation, percentile +type Metrics struct { + AvgLatency time.Duration + Throughput float64 +} - // Some drivers run in their own namespace - DriverNamespace *v1.Namespace +// PerformanceTestProvisioningOptions contains parameters for +// testing provisioning operation performance. +type PerformanceTestProvisioningOptions struct { + VolumeSize string + Count int + // Expected metrics from PVC creation till PVC being Bound. + ExpectedMetrics *Metrics } -// GetUniqueDriverName returns unique driver name that can be used parallelly in tests -func (config *PerTestConfig) GetUniqueDriverName() string { - return config.Driver.GetDriverInfo().Name + "-" + config.Framework.UniqueName +// PerformanceTestOptions contains parameters used for performance tests +type PerformanceTestOptions struct { + ProvisioningOptions *PerformanceTestProvisioningOptions } diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/testpatterns/testpattern.go b/vendor/k8s.io/kubernetes/test/e2e/storage/framework/testpattern.go similarity index 95% rename from vendor/k8s.io/kubernetes/test/e2e/storage/testpatterns/testpattern.go rename to vendor/k8s.io/kubernetes/test/e2e/storage/framework/testpattern.go index cf45318a0344..5b3843e551fe 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/testpatterns/testpattern.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/framework/testpattern.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package testpatterns +package framework import ( v1 "k8s.io/api/core/v1" @@ -102,7 +102,7 @@ var ( } // DefaultFsGenericEphemeralVolume is TestPattern for "Generic Ephemeral-volume (default fs)" DefaultFsGenericEphemeralVolume = TestPattern{ - Name: "Generic Ephemeral-volume (default fs) [Feature:GenericEphemeralVolume]", + Name: "Generic Ephemeral-volume (default fs)", VolType: GenericEphemeralVolume, } // DefaultFsPreprovisionedPV is TestPattern for "Pre-provisioned PV (default fs)" @@ -134,7 +134,7 @@ var ( } // Ext3GenericEphemeralVolume is TestPattern for "Generic Ephemeral-volume (ext3)" Ext3GenericEphemeralVolume = TestPattern{ - Name: "Generic Ephemeral-volume (ext3) [Feature:GenericEphemeralVolume]", + Name: "Generic Ephemeral-volume (ext3)", VolType: GenericEphemeralVolume, FsType: "ext3", } @@ -167,7 +167,7 @@ var ( } // Ext4GenericEphemeralVolume is TestPattern for "Generic Ephemeral-volume (ext4)" Ext4GenericEphemeralVolume = TestPattern{ - Name: "Generic Ephemeral-volume (ext4) [Feature:GenericEphemeralVolume]", + Name: "Generic Ephemeral-volume (ext4)", VolType: GenericEphemeralVolume, FsType: "ext4", } @@ -202,7 +202,7 @@ var ( } // XfsGenericEphemeralVolume is TestPattern for "Generic Ephemeral-volume (xfs)" XfsGenericEphemeralVolume = TestPattern{ - Name: "Generic Ephemeral-volume (xfs) [Feature:GenericEphemeralVolume]", + Name: "Generic Ephemeral-volume (xfs)", VolType: GenericEphemeralVolume, FsType: "xfs", FeatureTag: "[Slow]", @@ -229,35 +229,35 @@ var ( Name: "Inline-volume (ntfs)", VolType: InlineVolume, FsType: "ntfs", - FeatureTag: "[sig-windows]", + FeatureTag: "[Feature:Windows]", } // NtfsCSIEphemeralVolume is TestPattern for "CSI Ephemeral-volume (ntfs)" NtfsCSIEphemeralVolume = TestPattern{ Name: "CSI Ephemeral-volume (ntfs) [alpha]", VolType: CSIInlineVolume, FsType: "ntfs", - FeatureTag: "[sig-windows]", + FeatureTag: "[Feature:Windows]", } // NtfsGenericEphemeralVolume is TestPattern for "Generic Ephemeral-volume (ntfs)" NtfsGenericEphemeralVolume = TestPattern{ - Name: "Generic Ephemeral-volume (ntfs) [Feature:GenericEphemeralVolume]", + Name: "Generic Ephemeral-volume (ntfs)", VolType: GenericEphemeralVolume, FsType: "ntfs", - FeatureTag: "[sig-windows]", + FeatureTag: "[Feature:Windows]", } // NtfsPreprovisionedPV is TestPattern for "Pre-provisioned PV (ntfs)" NtfsPreprovisionedPV = TestPattern{ Name: "Pre-provisioned PV (ntfs)", VolType: PreprovisionedPV, FsType: "ntfs", - FeatureTag: "[sig-windows]", + FeatureTag: "[Feature:Windows]", } // NtfsDynamicPV is TestPattern for "Dynamic PV (ntfs)" NtfsDynamicPV = TestPattern{ Name: "Dynamic PV (ntfs)", VolType: DynamicPV, FsType: "ntfs", - FeatureTag: "[sig-windows]", + FeatureTag: "[Feature:Windows]", SnapshotDeletionPolicy: DeleteSnapshot, SnapshotType: DynamicCreatedSnapshot, } @@ -340,7 +340,7 @@ var ( VolType: DynamicPV, AllowExpansion: true, FsType: "ntfs", - FeatureTag: "[sig-windows]", + FeatureTag: "[Feature:Windows]", } // BlockVolModeDynamicPVAllowExpansion is TestPattern for "Dynamic PV (block volmode)(allowExpansion)" diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/framework/testsuite.go b/vendor/k8s.io/kubernetes/test/e2e/storage/framework/testsuite.go new file mode 100644 index 000000000000..9ea99485a74b --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/framework/testsuite.go @@ -0,0 +1,129 @@ +/* +Copyright 2020 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package framework + +import ( + "fmt" + + "github.com/onsi/ginkgo" + + "k8s.io/kubernetes/test/e2e/framework" + e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" + e2evolume "k8s.io/kubernetes/test/e2e/framework/volume" +) + +// TestSuite represents an interface for a set of tests which works with TestDriver. +// Each testsuite should implement this interface. +// All the functions except GetTestSuiteInfo() should not be called directly. Instead, +// use RegisterTests() to register the tests in a more standard way. +type TestSuite interface { + GetTestSuiteInfo() TestSuiteInfo + // DefineTests defines tests of the testpattern for the driver. + // Called inside a Ginkgo context that reflects the current driver and test pattern, + // so the test suite can define tests directly with ginkgo.It. + DefineTests(TestDriver, TestPattern) + // SkipUnsupportedTests will skip the test suite based on the given TestPattern, TestDriver + // Testsuite should check if the given pattern and driver works for the "whole testsuite" + // Testcase specific check should happen inside defineTests + SkipUnsupportedTests(TestDriver, TestPattern) +} + +// RegisterTests register the driver + pattern combination to the inside TestSuite +// This function actually register tests inside testsuite +func RegisterTests(suite TestSuite, driver TestDriver, pattern TestPattern) { + tsInfo := suite.GetTestSuiteInfo() + testName := fmt.Sprintf("[Testpattern: %s]%s %s%s", pattern.Name, pattern.FeatureTag, tsInfo.Name, tsInfo.FeatureTag) + ginkgo.Context(testName, func() { + ginkgo.BeforeEach(func() { + // skip all the invalid combination of driver and pattern + SkipInvalidDriverPatternCombination(driver, pattern) + // skip the unsupported test pattern and driver combination specific for this TestSuite + suite.SkipUnsupportedTests(driver, pattern) + }) + // actually define the tests + // at this step the testsuite should not worry about if the pattern and driver + // does not fit for the whole testsuite. But driver&pattern check + // might still needed for specific independent test cases. + suite.DefineTests(driver, pattern) + }) +} + +// DefineTestSuites defines tests for all testpatterns and all testSuites for a driver +func DefineTestSuites(driver TestDriver, tsInits []func() TestSuite) { + for _, testSuiteInit := range tsInits { + suite := testSuiteInit() + for _, pattern := range suite.GetTestSuiteInfo().TestPatterns { + RegisterTests(suite, driver, pattern) + } + } +} + +// TestSuiteInfo represents a set of parameters for TestSuite +type TestSuiteInfo struct { + Name string // name of the TestSuite + FeatureTag string // featureTag for the TestSuite + TestPatterns []TestPattern // Slice of TestPattern for the TestSuite + SupportedSizeRange e2evolume.SizeRange // Size range supported by the test suite +} + +// SkipInvalidDriverPatternCombination will skip tests if the combination of driver, and testpattern +// is not compatible to be tested. This function will be called in the RegisterTests() to make +// sure all the testsuites we defined are valid. +// +// Whether it needs to be skipped is checked by following steps: +// 0. Check with driver SkipUnsupportedTest +// 1. Check if volType is supported by driver from its interface +// 2. Check if fsType is supported +// +// Test suites can also skip tests inside their own skipUnsupportedTests function or in +// individual tests. +func SkipInvalidDriverPatternCombination(driver TestDriver, pattern TestPattern) { + dInfo := driver.GetDriverInfo() + var isSupported bool + + // 0. Check with driver specific logic + driver.SkipUnsupportedTest(pattern) + + // 1. Check if Whether volType is supported by driver from its interface + switch pattern.VolType { + case InlineVolume: + _, isSupported = driver.(InlineVolumeTestDriver) + case PreprovisionedPV: + _, isSupported = driver.(PreprovisionedPVTestDriver) + case DynamicPV, GenericEphemeralVolume: + _, isSupported = driver.(DynamicPVTestDriver) + case CSIInlineVolume: + _, isSupported = driver.(EphemeralTestDriver) + default: + isSupported = false + } + + if !isSupported { + e2eskipper.Skipf("Driver %s doesn't support %v -- skipping", dInfo.Name, pattern.VolType) + } + + // 2. Check if fsType is supported + if !dInfo.SupportedFsType.Has(pattern.FsType) { + e2eskipper.Skipf("Driver %s doesn't support %v -- skipping", dInfo.Name, pattern.FsType) + } + if pattern.FsType == "xfs" && framework.NodeOSDistroIs("windows") { + e2eskipper.Skipf("Distro doesn't support xfs -- skipping") + } + if pattern.FsType == "ntfs" && !framework.NodeOSDistroIs("windows") { + e2eskipper.Skipf("Distro %s doesn't support ntfs -- skipping", framework.TestContext.NodeOSDistro) + } +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/framework/volume_resource.go b/vendor/k8s.io/kubernetes/test/e2e/storage/framework/volume_resource.go new file mode 100644 index 000000000000..713dbf72cd7a --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/framework/volume_resource.go @@ -0,0 +1,316 @@ +/* +Copyright 2020 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package framework + +import ( + "context" + "fmt" + "time" + + "github.com/onsi/ginkgo" + "github.com/pkg/errors" + v1 "k8s.io/api/core/v1" + storagev1 "k8s.io/api/storage/v1" + apierrors "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/api/resource" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + utilerrors "k8s.io/apimachinery/pkg/util/errors" + "k8s.io/kubernetes/test/e2e/framework" + e2epv "k8s.io/kubernetes/test/e2e/framework/pv" + e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" + e2evolume "k8s.io/kubernetes/test/e2e/framework/volume" + storageutils "k8s.io/kubernetes/test/e2e/storage/utils" +) + +// VolumeResource is a generic implementation of TestResource that wil be able to +// be used in most of TestSuites. +// See volume_io.go or volumes.go in test/e2e/storage/testsuites/ for how to use this resource. +// Also, see subpath.go in the same directory for how to extend and use it. +type VolumeResource struct { + Config *PerTestConfig + Pattern TestPattern + VolSource *v1.VolumeSource + Pvc *v1.PersistentVolumeClaim + Pv *v1.PersistentVolume + Sc *storagev1.StorageClass + + Volume TestVolume +} + +// CreateVolumeResource constructs a VolumeResource for the current test. It knows how to deal with +// different test pattern volume types. +func CreateVolumeResource(driver TestDriver, config *PerTestConfig, pattern TestPattern, testVolumeSizeRange e2evolume.SizeRange) *VolumeResource { + r := VolumeResource{ + Config: config, + Pattern: pattern, + } + dInfo := driver.GetDriverInfo() + f := config.Framework + cs := f.ClientSet + + // Create volume for pre-provisioned volume tests + r.Volume = CreateVolume(driver, config, pattern.VolType) + + switch pattern.VolType { + case InlineVolume: + framework.Logf("Creating resource for inline volume") + if iDriver, ok := driver.(InlineVolumeTestDriver); ok { + r.VolSource = iDriver.GetVolumeSource(false, pattern.FsType, r.Volume) + } + case PreprovisionedPV: + framework.Logf("Creating resource for pre-provisioned PV") + if pDriver, ok := driver.(PreprovisionedPVTestDriver); ok { + pvSource, volumeNodeAffinity := pDriver.GetPersistentVolumeSource(false, pattern.FsType, r.Volume) + if pvSource != nil { + r.Pv, r.Pvc = createPVCPV(f, dInfo.Name, pvSource, volumeNodeAffinity, pattern.VolMode, dInfo.RequiredAccessModes) + r.VolSource = storageutils.CreateVolumeSource(r.Pvc.Name, false /* readOnly */) + } + } + case DynamicPV, GenericEphemeralVolume: + framework.Logf("Creating resource for dynamic PV") + if dDriver, ok := driver.(DynamicPVTestDriver); ok { + var err error + driverVolumeSizeRange := dDriver.GetDriverInfo().SupportedSizeRange + claimSize, err := storageutils.GetSizeRangesIntersection(testVolumeSizeRange, driverVolumeSizeRange) + framework.ExpectNoError(err, "determine intersection of test size range %+v and driver size range %+v", testVolumeSizeRange, driverVolumeSizeRange) + framework.Logf("Using claimSize:%s, test suite supported size:%v, driver(%s) supported size:%v ", claimSize, testVolumeSizeRange, dDriver.GetDriverInfo().Name, testVolumeSizeRange) + r.Sc = dDriver.GetDynamicProvisionStorageClass(r.Config, pattern.FsType) + + if pattern.BindingMode != "" { + r.Sc.VolumeBindingMode = &pattern.BindingMode + } + r.Sc.AllowVolumeExpansion = &pattern.AllowExpansion + + ginkgo.By("creating a StorageClass " + r.Sc.Name) + + r.Sc, err = cs.StorageV1().StorageClasses().Create(context.TODO(), r.Sc, metav1.CreateOptions{}) + framework.ExpectNoError(err) + + switch pattern.VolType { + case DynamicPV: + r.Pv, r.Pvc = createPVCPVFromDynamicProvisionSC( + f, dInfo.Name, claimSize, r.Sc, pattern.VolMode, dInfo.RequiredAccessModes) + r.VolSource = storageutils.CreateVolumeSource(r.Pvc.Name, false /* readOnly */) + case GenericEphemeralVolume: + driverVolumeSizeRange := dDriver.GetDriverInfo().SupportedSizeRange + claimSize, err := storageutils.GetSizeRangesIntersection(testVolumeSizeRange, driverVolumeSizeRange) + framework.ExpectNoError(err, "determine intersection of test size range %+v and driver size range %+v", testVolumeSizeRange, driverVolumeSizeRange) + r.VolSource = createEphemeralVolumeSource(r.Sc.Name, dInfo.RequiredAccessModes, claimSize) + } + } + case CSIInlineVolume: + framework.Logf("Creating resource for CSI ephemeral inline volume") + if eDriver, ok := driver.(EphemeralTestDriver); ok { + attributes, _, _ := eDriver.GetVolume(config, 0) + r.VolSource = &v1.VolumeSource{ + CSI: &v1.CSIVolumeSource{ + Driver: eDriver.GetCSIDriverName(config), + VolumeAttributes: attributes, + }, + } + } + default: + framework.Failf("VolumeResource doesn't support: %s", pattern.VolType) + } + + if r.VolSource == nil { + e2eskipper.Skipf("Driver %s doesn't support %v -- skipping", dInfo.Name, pattern.VolType) + } + + return &r +} + +func createEphemeralVolumeSource(scName string, accessModes []v1.PersistentVolumeAccessMode, claimSize string) *v1.VolumeSource { + if len(accessModes) == 0 { + accessModes = []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce} + } + return &v1.VolumeSource{ + Ephemeral: &v1.EphemeralVolumeSource{ + VolumeClaimTemplate: &v1.PersistentVolumeClaimTemplate{ + Spec: v1.PersistentVolumeClaimSpec{ + StorageClassName: &scName, + AccessModes: accessModes, + Resources: v1.ResourceRequirements{ + Requests: v1.ResourceList{ + v1.ResourceStorage: resource.MustParse(claimSize), + }, + }, + }, + }, + }, + } +} + +// CleanupResource cleans up VolumeResource +func (r *VolumeResource) CleanupResource() error { + f := r.Config.Framework + var cleanUpErrs []error + if r.Pvc != nil || r.Pv != nil { + switch r.Pattern.VolType { + case PreprovisionedPV: + ginkgo.By("Deleting pv and pvc") + if errs := e2epv.PVPVCCleanup(f.ClientSet, f.Namespace.Name, r.Pv, r.Pvc); len(errs) != 0 { + framework.Failf("Failed to delete PVC or PV: %v", utilerrors.NewAggregate(errs)) + } + case DynamicPV: + ginkgo.By("Deleting pvc") + // We only delete the PVC so that PV (and disk) can be cleaned up by dynamic provisioner + if r.Pv != nil && r.Pv.Spec.PersistentVolumeReclaimPolicy != v1.PersistentVolumeReclaimDelete { + framework.Failf("Test framework does not currently support Dynamically Provisioned Persistent Volume %v specified with reclaim policy that isnt %v", + r.Pv.Name, v1.PersistentVolumeReclaimDelete) + } + if r.Pvc != nil { + cs := f.ClientSet + pv := r.Pv + if pv == nil && r.Pvc.Name != "" { + // This happens for late binding. Check whether we have a volume now that we need to wait for. + pvc, err := cs.CoreV1().PersistentVolumeClaims(r.Pvc.Namespace).Get(context.TODO(), r.Pvc.Name, metav1.GetOptions{}) + switch { + case err == nil: + if pvc.Spec.VolumeName != "" { + pv, err = cs.CoreV1().PersistentVolumes().Get(context.TODO(), pvc.Spec.VolumeName, metav1.GetOptions{}) + if err != nil { + cleanUpErrs = append(cleanUpErrs, errors.Wrapf(err, "Failed to find PV %v", pvc.Spec.VolumeName)) + } + } + case apierrors.IsNotFound(err): + // Without the PVC, we cannot locate the corresponding PV. Let's + // hope that it is gone. + default: + cleanUpErrs = append(cleanUpErrs, errors.Wrapf(err, "Failed to find PVC %v", r.Pvc.Name)) + } + } + + err := e2epv.DeletePersistentVolumeClaim(f.ClientSet, r.Pvc.Name, f.Namespace.Name) + if err != nil { + cleanUpErrs = append(cleanUpErrs, errors.Wrapf(err, "Failed to delete PVC %v", r.Pvc.Name)) + } + + if pv != nil { + err = e2epv.WaitForPersistentVolumeDeleted(f.ClientSet, pv.Name, 5*time.Second, 5*time.Minute) + if err != nil { + cleanUpErrs = append(cleanUpErrs, errors.Wrapf(err, + "Persistent Volume %v not deleted by dynamic provisioner", pv.Name)) + } + } + } + default: + framework.Failf("Found PVC (%v) or PV (%v) but not running Preprovisioned or Dynamic test pattern", r.Pvc, r.Pv) + } + } + + if r.Sc != nil { + ginkgo.By("Deleting sc") + if err := storageutils.DeleteStorageClass(f.ClientSet, r.Sc.Name); err != nil { + cleanUpErrs = append(cleanUpErrs, errors.Wrapf(err, "Failed to delete StorageClass %v", r.Sc.Name)) + } + } + + // Cleanup volume for pre-provisioned volume tests + if r.Volume != nil { + if err := storageutils.TryFunc(r.Volume.DeleteVolume); err != nil { + cleanUpErrs = append(cleanUpErrs, errors.Wrap(err, "Failed to delete Volume")) + } + } + return utilerrors.NewAggregate(cleanUpErrs) +} + +func createPVCPV( + f *framework.Framework, + name string, + pvSource *v1.PersistentVolumeSource, + volumeNodeAffinity *v1.VolumeNodeAffinity, + volMode v1.PersistentVolumeMode, + accessModes []v1.PersistentVolumeAccessMode, +) (*v1.PersistentVolume, *v1.PersistentVolumeClaim) { + pvConfig := e2epv.PersistentVolumeConfig{ + NamePrefix: fmt.Sprintf("%s-", name), + StorageClassName: f.Namespace.Name, + PVSource: *pvSource, + NodeAffinity: volumeNodeAffinity, + AccessModes: accessModes, + } + + pvcConfig := e2epv.PersistentVolumeClaimConfig{ + StorageClassName: &f.Namespace.Name, + AccessModes: accessModes, + } + + if volMode != "" { + pvConfig.VolumeMode = &volMode + pvcConfig.VolumeMode = &volMode + } + + framework.Logf("Creating PVC and PV") + pv, pvc, err := e2epv.CreatePVCPV(f.ClientSet, pvConfig, pvcConfig, f.Namespace.Name, false) + framework.ExpectNoError(err, "PVC, PV creation failed") + + err = e2epv.WaitOnPVandPVC(f.ClientSet, f.Timeouts, f.Namespace.Name, pv, pvc) + framework.ExpectNoError(err, "PVC, PV failed to bind") + + return pv, pvc +} + +func createPVCPVFromDynamicProvisionSC( + f *framework.Framework, + name string, + claimSize string, + sc *storagev1.StorageClass, + volMode v1.PersistentVolumeMode, + accessModes []v1.PersistentVolumeAccessMode, +) (*v1.PersistentVolume, *v1.PersistentVolumeClaim) { + cs := f.ClientSet + ns := f.Namespace.Name + + ginkgo.By("creating a claim") + pvcCfg := e2epv.PersistentVolumeClaimConfig{ + NamePrefix: name, + ClaimSize: claimSize, + StorageClassName: &(sc.Name), + AccessModes: accessModes, + VolumeMode: &volMode, + } + + pvc := e2epv.MakePersistentVolumeClaim(pvcCfg, ns) + + var err error + pvc, err = e2epv.CreatePVC(cs, ns, pvc) + framework.ExpectNoError(err) + + if !isDelayedBinding(sc) { + err = e2epv.WaitForPersistentVolumeClaimPhase(v1.ClaimBound, cs, pvc.Namespace, pvc.Name, framework.Poll, f.Timeouts.ClaimProvision) + framework.ExpectNoError(err) + } + + pvc, err = cs.CoreV1().PersistentVolumeClaims(pvc.Namespace).Get(context.TODO(), pvc.Name, metav1.GetOptions{}) + framework.ExpectNoError(err) + + var pv *v1.PersistentVolume + if !isDelayedBinding(sc) { + pv, err = cs.CoreV1().PersistentVolumes().Get(context.TODO(), pvc.Spec.VolumeName, metav1.GetOptions{}) + framework.ExpectNoError(err) + } + + return pv, pvc +} + +func isDelayedBinding(sc *storagev1.StorageClass) bool { + if sc.VolumeBindingMode != nil { + return *sc.VolumeBindingMode == storagev1.VolumeBindingWaitForFirstConsumer + } + return false +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/generic_persistent_volume-disruptive.go b/vendor/k8s.io/kubernetes/test/e2e/storage/generic_persistent_volume-disruptive.go index 13b10c22d75e..9b5b4fad0f72 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/generic_persistent_volume-disruptive.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/generic_persistent_volume-disruptive.go @@ -93,6 +93,7 @@ func createPodPVCFromSC(f *framework.Framework, c clientset.Interface, ns string var err error test := testsuites.StorageClassTest{ Name: "default", + Timeouts: f.Timeouts, ClaimSize: "2Gi", } pvc := e2epv.MakePersistentVolumeClaim(e2epv.PersistentVolumeClaimConfig{ @@ -112,7 +113,7 @@ func createPodPVCFromSC(f *framework.Framework, c clientset.Interface, ns string PVCs: pvcClaims, SeLinuxLabel: e2epv.SELinuxLabel, } - pod, err := e2epod.CreateSecPod(c, &podConfig, framework.PodStartTimeout) + pod, err := e2epod.CreateSecPod(c, &podConfig, f.Timeouts.PodStart) framework.ExpectNoError(err, "While creating pods for kubelet restart test") return pod, pvc, pvs[0] } diff --git a/vendor/k8s.io/kubernetes/test/e2e/gke_local_ssd.go b/vendor/k8s.io/kubernetes/test/e2e/storage/gke_local_ssd.go similarity index 95% rename from vendor/k8s.io/kubernetes/test/e2e/gke_local_ssd.go rename to vendor/k8s.io/kubernetes/test/e2e/storage/gke_local_ssd.go index e8764b78bf03..e57bde08e3a1 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/gke_local_ssd.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/gke_local_ssd.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package e2e +package storage import ( "fmt" @@ -25,11 +25,12 @@ import ( "k8s.io/apimachinery/pkg/util/uuid" "k8s.io/kubernetes/test/e2e/framework" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" + "k8s.io/kubernetes/test/e2e/storage/utils" "github.com/onsi/ginkgo" ) -var _ = framework.KubeDescribe("GKE local SSD [Feature:GKELocalSSD]", func() { +var _ = utils.SIGDescribe("GKE local SSD [Feature:GKELocalSSD]", func() { f := framework.NewDefaultFramework("localssd") diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/host_path_type.go b/vendor/k8s.io/kubernetes/test/e2e/storage/host_path_type.go index 55190a31510d..140ee4324802 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/host_path_type.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/host_path_type.go @@ -28,6 +28,7 @@ import ( "k8s.io/kubernetes/test/e2e/framework" e2eevents "k8s.io/kubernetes/test/e2e/framework/events" e2epod "k8s.io/kubernetes/test/e2e/framework/pod" + e2evolume "k8s.io/kubernetes/test/e2e/framework/volume" "k8s.io/kubernetes/test/e2e/storage/utils" imageutils "k8s.io/kubernetes/test/utils/image" @@ -263,7 +264,7 @@ var _ = utils.SIGDescribe("HostPathType Character Device [Slow]", func() { targetCharDev = path.Join(hostBaseDir, "achardev") ginkgo.By("Create a character device for further testing") cmd := fmt.Sprintf("mknod %s c 89 1", path.Join(mountBaseDir, "achardev")) - stdout, stderr, err := utils.PodExec(f, basePod, cmd) + stdout, stderr, err := e2evolume.PodExec(f, basePod, cmd) framework.ExpectNoError(err, "command: %q, stdout: %s\nstderr: %s", cmd, stdout, stderr) }) @@ -332,7 +333,7 @@ var _ = utils.SIGDescribe("HostPathType Block Device [Slow]", func() { targetBlockDev = path.Join(hostBaseDir, "ablkdev") ginkgo.By("Create a block device for further testing") cmd := fmt.Sprintf("mknod %s b 89 1", path.Join(mountBaseDir, "ablkdev")) - stdout, stderr, err := utils.PodExec(f, basePod, cmd) + stdout, stderr, err := e2evolume.PodExec(f, basePod, cmd) framework.ExpectNoError(err, "command %q: stdout: %s\nstderr: %s", cmd, stdout, stderr) }) @@ -462,7 +463,7 @@ func verifyPodHostPathTypeFailure(f *framework.Framework, nodeSelector map[strin }.AsSelector().String() msg := "hostPath type check failed" - err = e2eevents.WaitTimeoutForEvent(f.ClientSet, f.Namespace.Name, eventSelector, msg, framework.PodStartTimeout) + err = e2eevents.WaitTimeoutForEvent(f.ClientSet, f.Namespace.Name, eventSelector, msg, f.Timeouts.PodStart) // Events are unreliable, don't depend on the event. It's used only to speed up the test. if err != nil { framework.Logf("Warning: did not get event about FailedMountVolume") @@ -480,7 +481,7 @@ func verifyPodHostPathType(f *framework.Framework, nodeSelector map[string]strin newPod, err := f.ClientSet.CoreV1().Pods(f.Namespace.Name).Create(context.TODO(), newHostPathTypeTestPod(nodeSelector, hostDir, "/mnt/test", hostPathType), metav1.CreateOptions{}) framework.ExpectNoError(err) - framework.ExpectNoError(e2epod.WaitTimeoutForPodRunningInNamespace(f.ClientSet, newPod.Name, newPod.Namespace, framework.PodStartShortTimeout)) + framework.ExpectNoError(e2epod.WaitTimeoutForPodRunningInNamespace(f.ClientSet, newPod.Name, newPod.Namespace, f.Timeouts.PodStart)) f.ClientSet.CoreV1().Pods(f.Namespace.Name).Delete(context.TODO(), newPod.Name, *metav1.NewDeleteOptions(0)) } diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/in_tree_volumes.go b/vendor/k8s.io/kubernetes/test/e2e/storage/in_tree_volumes.go index 3c557c66b4db..b5572837d0e7 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/in_tree_volumes.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/in_tree_volumes.go @@ -19,12 +19,13 @@ package storage import ( "github.com/onsi/ginkgo" "k8s.io/kubernetes/test/e2e/storage/drivers" + storageframework "k8s.io/kubernetes/test/e2e/storage/framework" "k8s.io/kubernetes/test/e2e/storage/testsuites" "k8s.io/kubernetes/test/e2e/storage/utils" ) // List of testDrivers to be executed in below loop -var testDrivers = []func() testsuites.TestDriver{ +var testDrivers = []func() storageframework.TestDriver{ drivers.InitNFSDriver, drivers.InitGlusterFSDriver, drivers.InitISCSIDriver, @@ -54,8 +55,8 @@ var _ = utils.SIGDescribe("In-tree Volumes", func() { for _, initDriver := range testDrivers { curDriver := initDriver() - ginkgo.Context(testsuites.GetDriverNameWithFeatureTags(curDriver), func() { - testsuites.DefineTestSuite(curDriver, testsuites.BaseSuites) + ginkgo.Context(storageframework.GetDriverNameWithFeatureTags(curDriver), func() { + storageframework.DefineTestSuites(curDriver, testsuites.BaseSuites) }) } }) diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/mounted_volume_resize.go b/vendor/k8s.io/kubernetes/test/e2e/storage/mounted_volume_resize.go index 3edc41a2b80e..6ed6fc599b32 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/mounted_volume_resize.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/mounted_volume_resize.go @@ -28,6 +28,7 @@ import ( storagev1 "k8s.io/api/storage/v1" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + utilerrors "k8s.io/apimachinery/pkg/util/errors" "k8s.io/apimachinery/pkg/util/wait" clientset "k8s.io/client-go/kubernetes" @@ -47,7 +48,8 @@ var _ = utils.SIGDescribe("Mounted volume expand", func() { c clientset.Interface ns string pvc *v1.PersistentVolumeClaim - resizableSc *storagev1.StorageClass + sc *storagev1.StorageClass + cleanStorageClass func() nodeName string isNodeLabeled bool nodeKeyValueLabel map[string]string @@ -78,17 +80,19 @@ var _ = utils.SIGDescribe("Mounted volume expand", func() { test := testsuites.StorageClassTest{ Name: "default", + Timeouts: f.Timeouts, ClaimSize: "2Gi", AllowVolumeExpansion: true, DelayBinding: true, + Parameters: make(map[string]string), } - resizableSc, err = c.StorageV1().StorageClasses().Create(context.TODO(), newStorageClass(test, ns, "resizing"), metav1.CreateOptions{}) - framework.ExpectNoError(err, "Error creating resizable storage class") - framework.ExpectEqual(*resizableSc.AllowVolumeExpansion, true) + + sc, cleanStorageClass = testsuites.SetupStorageClass(c, newStorageClass(test, ns, "resizing")) + framework.ExpectEqual(*sc.AllowVolumeExpansion, true) pvc = e2epv.MakePersistentVolumeClaim(e2epv.PersistentVolumeClaimConfig{ ClaimSize: test.ClaimSize, - StorageClassName: &(resizableSc.Name), + StorageClassName: &(sc.Name), VolumeMode: &test.VolumeMode, }, ns) pvc, err = c.CoreV1().PersistentVolumeClaims(pvc.Namespace).Create(context.TODO(), pvc, metav1.CreateOptions{}) @@ -111,6 +115,8 @@ var _ = utils.SIGDescribe("Mounted volume expand", func() { pvc, nodeName, isNodeLabeled, nodeLabelValue = nil, "", false, "" nodeKeyValueLabel = make(map[string]string) } + + cleanStorageClass() }) ginkgo.It("Should verify mounted devices can be resized", func() { diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/nfs_persistent_volume-disruptive.go b/vendor/k8s.io/kubernetes/test/e2e/storage/nfs_persistent_volume-disruptive.go index 670e1f3c4f13..ac567beb4264 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/nfs_persistent_volume-disruptive.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/nfs_persistent_volume-disruptive.go @@ -163,7 +163,7 @@ var _ = utils.SIGDescribe("NFSPersistentVolumes[Disruptive][Flaky]", func() { } pv1, pvc1, err = e2epv.CreatePVPVC(c, pvConfig1, pvcConfig, ns, false) framework.ExpectNoError(err) - framework.ExpectNoError(e2epv.WaitOnPVandPVC(c, ns, pv1, pvc1)) + framework.ExpectNoError(e2epv.WaitOnPVandPVC(c, f.Timeouts, ns, pv1, pvc1)) ginkgo.By("Initializing second PD with PVPVC binding") pvSource2, diskName2 = createGCEVolume() @@ -176,7 +176,7 @@ var _ = utils.SIGDescribe("NFSPersistentVolumes[Disruptive][Flaky]", func() { } pv2, pvc2, err = e2epv.CreatePVPVC(c, pvConfig2, pvcConfig, ns, false) framework.ExpectNoError(err) - framework.ExpectNoError(e2epv.WaitOnPVandPVC(c, ns, pv2, pvc2)) + framework.ExpectNoError(e2epv.WaitOnPVandPVC(c, f.Timeouts, ns, pv2, pvc2)) ginkgo.By("Attaching both PVC's to a single pod") clientPod, err = e2epod.CreatePod(c, ns, nil, []*v1.PersistentVolumeClaim{pvc1, pvc2}, true, "") @@ -312,7 +312,7 @@ func initTestCase(f *framework.Framework, c clientset.Interface, pvConfig e2epv. e2epod.DeletePodWithWait(c, pod) } }() - err = e2epod.WaitForPodRunningInNamespace(c, pod) + err = e2epod.WaitTimeoutForPodRunningInNamespace(c, pod.Name, pod.Namespace, f.Timeouts.PodStart) framework.ExpectNoError(err, fmt.Sprintf("Pod %q timed out waiting for phase: Running", pod.Name)) // Return created api objects pod, err = c.CoreV1().Pods(ns).Get(context.TODO(), pod.Name, metav1.GetOptions{}) diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/pd.go b/vendor/k8s.io/kubernetes/test/e2e/storage/pd.go index 5f684680195f..b3dc2ffd015e 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/pd.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/pd.go @@ -149,7 +149,7 @@ var _ = utils.SIGDescribe("Pod Disks", func() { fmtPod = testPDPod([]string{diskName}, host0Name, false, 1) _, err = podClient.Create(context.TODO(), fmtPod, metav1.CreateOptions{}) framework.ExpectNoError(err, "Failed to create fmtPod") - framework.ExpectNoError(e2epod.WaitForPodRunningInNamespaceSlow(f.ClientSet, fmtPod.Name, f.Namespace.Name)) + framework.ExpectNoError(e2epod.WaitTimeoutForPodRunningInNamespace(f.ClientSet, fmtPod.Name, f.Namespace.Name, f.Timeouts.PodStartSlow)) ginkgo.By("deleting the fmtPod") framework.ExpectNoError(podClient.Delete(context.TODO(), fmtPod.Name, *metav1.NewDeleteOptions(0)), "Failed to delete fmtPod") @@ -177,7 +177,7 @@ var _ = utils.SIGDescribe("Pod Disks", func() { ginkgo.By("creating host0Pod on node0") _, err = podClient.Create(context.TODO(), host0Pod, metav1.CreateOptions{}) framework.ExpectNoError(err, fmt.Sprintf("Failed to create host0Pod: %v", err)) - framework.ExpectNoError(e2epod.WaitForPodRunningInNamespaceSlow(f.ClientSet, host0Pod.Name, f.Namespace.Name)) + framework.ExpectNoError(e2epod.WaitTimeoutForPodRunningInNamespace(f.ClientSet, host0Pod.Name, f.Namespace.Name, f.Timeouts.PodStartSlow)) framework.Logf("host0Pod: %q, node0: %q", host0Pod.Name, host0Name) var containerName, testFile, testFileContents string @@ -201,7 +201,7 @@ var _ = utils.SIGDescribe("Pod Disks", func() { ginkgo.By("creating host1Pod on node1") _, err = podClient.Create(context.TODO(), host1Pod, metav1.CreateOptions{}) framework.ExpectNoError(err, "Failed to create host1Pod") - framework.ExpectNoError(e2epod.WaitForPodRunningInNamespaceSlow(f.ClientSet, host1Pod.Name, f.Namespace.Name)) + framework.ExpectNoError(e2epod.WaitTimeoutForPodRunningInNamespace(f.ClientSet, host1Pod.Name, f.Namespace.Name, f.Timeouts.PodStartSlow)) framework.Logf("host1Pod: %q, node1: %q", host1Pod.Name, host1Name) if readOnly { @@ -283,7 +283,7 @@ var _ = utils.SIGDescribe("Pod Disks", func() { host0Pod = testPDPod(diskNames, host0Name, false /* readOnly */, numContainers) _, err = podClient.Create(context.TODO(), host0Pod, metav1.CreateOptions{}) framework.ExpectNoError(err, fmt.Sprintf("Failed to create host0Pod: %v", err)) - framework.ExpectNoError(e2epod.WaitForPodRunningInNamespaceSlow(f.ClientSet, host0Pod.Name, f.Namespace.Name)) + framework.ExpectNoError(e2epod.WaitTimeoutForPodRunningInNamespace(f.ClientSet, host0Pod.Name, f.Namespace.Name, f.Timeouts.PodStartSlow)) ginkgo.By(fmt.Sprintf("writing %d file(s) via a container", numPDs)) containerName := "mycontainer" @@ -386,7 +386,7 @@ var _ = utils.SIGDescribe("Pod Disks", func() { _, err = podClient.Create(context.TODO(), host0Pod, metav1.CreateOptions{}) framework.ExpectNoError(err, fmt.Sprintf("Failed to create host0Pod: %v", err)) ginkgo.By("waiting for host0Pod to be running") - framework.ExpectNoError(e2epod.WaitForPodRunningInNamespaceSlow(f.ClientSet, host0Pod.Name, f.Namespace.Name)) + framework.ExpectNoError(e2epod.WaitTimeoutForPodRunningInNamespace(f.ClientSet, host0Pod.Name, f.Namespace.Name, f.Timeouts.PodStartSlow)) ginkgo.By("writing content to host0Pod") testFile := "/testpd1/tracker" @@ -475,7 +475,7 @@ var _ = utils.SIGDescribe("Pod Disks", func() { ginkgo.By("Creating test pod with same volume") _, err = podClient.Create(context.TODO(), pod, metav1.CreateOptions{}) framework.ExpectNoError(err, "Failed to create pod") - framework.ExpectNoError(e2epod.WaitForPodRunningInNamespaceSlow(f.ClientSet, pod.Name, f.Namespace.Name)) + framework.ExpectNoError(e2epod.WaitTimeoutForPodRunningInNamespace(f.ClientSet, pod.Name, f.Namespace.Name, f.Timeouts.PodStartSlow)) ginkgo.By("deleting the pod") framework.ExpectNoError(podClient.Delete(context.TODO(), pod.Name, *metav1.NewDeleteOptions(0)), "Failed to delete pod") diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/persistent_volumes-gce.go b/vendor/k8s.io/kubernetes/test/e2e/storage/persistent_volumes-gce.go index b8bc887384eb..0b6c5a7c342e 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/persistent_volumes-gce.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/persistent_volumes-gce.go @@ -44,11 +44,11 @@ func verifyGCEDiskAttached(diskName string, nodeName types.NodeName) bool { } // initializeGCETestSpec creates a PV, PVC, and ClientPod that will run until killed by test or clean up. -func initializeGCETestSpec(c clientset.Interface, ns string, pvConfig e2epv.PersistentVolumeConfig, pvcConfig e2epv.PersistentVolumeClaimConfig, isPrebound bool) (*v1.Pod, *v1.PersistentVolume, *v1.PersistentVolumeClaim) { +func initializeGCETestSpec(c clientset.Interface, t *framework.TimeoutContext, ns string, pvConfig e2epv.PersistentVolumeConfig, pvcConfig e2epv.PersistentVolumeClaimConfig, isPrebound bool) (*v1.Pod, *v1.PersistentVolume, *v1.PersistentVolumeClaim) { ginkgo.By("Creating the PV and PVC") pv, pvc, err := e2epv.CreatePVPVC(c, pvConfig, pvcConfig, ns, isPrebound) framework.ExpectNoError(err) - framework.ExpectNoError(e2epv.WaitOnPVandPVC(c, ns, pv, pvc)) + framework.ExpectNoError(e2epv.WaitOnPVandPVC(c, t, ns, pv, pvc)) ginkgo.By("Creating the Client Pod") clientPod, err := e2epod.CreateClientPod(c, ns, pvc) @@ -86,13 +86,14 @@ var _ = utils.SIGDescribe("PersistentVolumes GCEPD", func() { ginkgo.By("Initializing Test Spec") diskName, err = e2epv.CreatePDWithRetry() framework.ExpectNoError(err) + pvConfig = e2epv.PersistentVolumeConfig{ NamePrefix: "gce-", Labels: volLabel, PVSource: v1.PersistentVolumeSource{ GCEPersistentDisk: &v1.GCEPersistentDiskVolumeSource{ PDName: diskName, - FSType: "ext3", + FSType: e2epv.GetDefaultFSType(), ReadOnly: false, }, }, @@ -103,7 +104,7 @@ var _ = utils.SIGDescribe("PersistentVolumes GCEPD", func() { Selector: selector, StorageClassName: &emptyStorageClass, } - clientPod, pv, pvc = initializeGCETestSpec(c, ns, pvConfig, pvcConfig, false) + clientPod, pv, pvc = initializeGCETestSpec(c, f.Timeouts, ns, pvConfig, pvcConfig, false) node = types.NodeName(clientPod.Spec.NodeName) }) diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/persistent_volumes-local.go b/vendor/k8s.io/kubernetes/test/e2e/storage/persistent_volumes-local.go index 20688cdaa563..61a0202d5fcd 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/persistent_volumes-local.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/persistent_volumes-local.go @@ -19,6 +19,7 @@ package storage import ( "context" "fmt" + "math/rand" "path/filepath" "strconv" "strings" @@ -45,6 +46,7 @@ import ( e2epv "k8s.io/kubernetes/test/e2e/framework/pv" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" e2estatefulset "k8s.io/kubernetes/test/e2e/framework/statefulset" + e2evolume "k8s.io/kubernetes/test/e2e/framework/volume" "k8s.io/kubernetes/test/e2e/storage/utils" imageutils "k8s.io/kubernetes/test/utils/image" ) @@ -52,8 +54,9 @@ import ( type localTestConfig struct { ns string nodes []v1.Node - node0 *v1.Node + randomNode *v1.Node client clientset.Interface + timeouts *framework.TimeoutContext scName string discoveryDir string hostExec utils.HostExec @@ -157,16 +160,17 @@ var _ = utils.SIGDescribe("PersistentVolumes-local ", func() { framework.ExpectNoError(err) scName = fmt.Sprintf("%v-%v", testSCPrefix, f.Namespace.Name) - // Choose the first node - node0 := &nodes.Items[0] + // Choose a random node + randomNode := &nodes.Items[rand.Intn(len(nodes.Items))] hostExec := utils.NewHostExec(f) ltrMgr := utils.NewLocalResourceManager("local-volume-test", hostExec, hostBase) config = &localTestConfig{ ns: f.Namespace.Name, client: f.ClientSet, + timeouts: f.Timeouts, nodes: nodes.Items, - node0: node0, + randomNode: randomNode, scName: scName, discoveryDir: filepath.Join(hostBase, f.Namespace.Name), hostExec: hostExec, @@ -190,10 +194,10 @@ var _ = utils.SIGDescribe("PersistentVolumes-local ", func() { ginkgo.BeforeEach(func() { if testVolType == GCELocalSSDVolumeType { - SkipUnlessLocalSSDExists(config, "scsi", "fs", config.node0) + SkipUnlessLocalSSDExists(config, "scsi", "fs", config.randomNode) } setupStorageClass(config, &testMode) - testVols := setupLocalVolumesPVCsPVs(config, testVolType, config.node0, 1, testMode) + testVols := setupLocalVolumesPVCsPVs(config, testVolType, config.randomNode, 1, testMode) testVol = testVols[0] }) @@ -212,7 +216,7 @@ var _ = utils.SIGDescribe("PersistentVolumes-local ", func() { ginkgo.By("Creating pod1") pod1, pod1Err = createLocalPod(config, testVol, nil) framework.ExpectNoError(pod1Err) - verifyLocalPod(config, testVol, pod1, config.node0.Name) + verifyLocalPod(config, testVol, pod1, config.randomNode.Name) writeCmd := createWriteCmd(volumeDir, testFile, testFileContent, testVol.localVolumeType) @@ -303,7 +307,7 @@ var _ = utils.SIGDescribe("PersistentVolumes-local ", func() { ginkgo.It("should fail due to non-existent path", func() { testVol := &localTestVolume{ ltr: &utils.LocalTestResource{ - Node: config.node0, + Node: config.randomNode, Path: "/non-existent/location/nowhere", }, localVolumeType: DirectoryLocalVolumeType, @@ -312,7 +316,7 @@ var _ = utils.SIGDescribe("PersistentVolumes-local ", func() { createLocalPVCsPVs(config, []*localTestVolume{testVol}, immediateMode) pod, err := createLocalPod(config, testVol, nil) framework.ExpectError(err) - err = e2epod.WaitTimeoutForPodRunningInNamespace(config.client, pod.Name, pod.Namespace, framework.PodStartShortTimeout) + err = e2epod.WaitTimeoutForPodRunningInNamespace(config.client, pod.Name, pod.Namespace, f.Timeouts.PodStart) framework.ExpectError(err) cleanupLocalPVCsPVs(config, []*localTestVolume{testVol}) }) @@ -322,14 +326,18 @@ var _ = utils.SIGDescribe("PersistentVolumes-local ", func() { e2eskipper.Skipf("Runs only when number of nodes >= 2") } - testVols := setupLocalVolumesPVCsPVs(config, DirectoryLocalVolumeType, config.node0, 1, immediateMode) + testVols := setupLocalVolumesPVCsPVs(config, DirectoryLocalVolumeType, config.randomNode, 1, immediateMode) testVol := testVols[0] - pod := makeLocalPodWithNodeName(config, testVol, config.nodes[1].Name) + conflictNodeName := config.nodes[0].Name + if conflictNodeName == config.randomNode.Name { + conflictNodeName = config.nodes[1].Name + } + pod := makeLocalPodWithNodeName(config, testVol, conflictNodeName) pod, err := config.client.CoreV1().Pods(config.ns).Create(context.TODO(), pod, metav1.CreateOptions{}) framework.ExpectNoError(err) - err = e2epod.WaitTimeoutForPodRunningInNamespace(config.client, pod.Name, pod.Namespace, framework.PodStartShortTimeout) + err = e2epod.WaitTimeoutForPodRunningInNamespace(config.client, pod.Name, pod.Namespace, f.Timeouts.PodStart) framework.ExpectError(err) cleanupLocalVolumes(config, []*localTestVolume{testVol}) @@ -338,8 +346,9 @@ var _ = utils.SIGDescribe("PersistentVolumes-local ", func() { ginkgo.Context("Pod with node different from PV's NodeAffinity", func() { var ( - testVol *localTestVolume - volumeType localVolumeType + testVol *localTestVolume + volumeType localVolumeType + conflictNodeName string ) ginkgo.BeforeEach(func() { @@ -349,7 +358,12 @@ var _ = utils.SIGDescribe("PersistentVolumes-local ", func() { volumeType = DirectoryLocalVolumeType setupStorageClass(config, &immediateMode) - testVols := setupLocalVolumesPVCsPVs(config, volumeType, config.node0, 1, immediateMode) + testVols := setupLocalVolumesPVCsPVs(config, volumeType, config.randomNode, 1, immediateMode) + conflictNodeName = config.nodes[0].Name + if conflictNodeName == config.randomNode.Name { + conflictNodeName = config.nodes[1].Name + } + testVol = testVols[0] }) @@ -359,11 +373,11 @@ var _ = utils.SIGDescribe("PersistentVolumes-local ", func() { }) ginkgo.It("should fail scheduling due to different NodeAffinity", func() { - testPodWithNodeConflict(config, volumeType, config.nodes[1].Name, makeLocalPodWithNodeAffinity, immediateMode) + testPodWithNodeConflict(config, volumeType, conflictNodeName, makeLocalPodWithNodeAffinity, immediateMode) }) ginkgo.It("should fail scheduling due to different NodeSelector", func() { - testPodWithNodeConflict(config, volumeType, config.nodes[1].Name, makeLocalPodWithNodeSelector, immediateMode) + testPodWithNodeConflict(config, volumeType, conflictNodeName, makeLocalPodWithNodeSelector, immediateMode) }) }) @@ -620,7 +634,7 @@ var _ = utils.SIGDescribe("PersistentVolumes-local ", func() { ginkgo.BeforeEach(func() { localVolume := &localTestVolume{ ltr: &utils.LocalTestResource{ - Node: config.node0, + Node: config.randomNode, Path: "/tmp", }, localVolumeType: DirectoryLocalVolumeType, @@ -708,7 +722,7 @@ type makeLocalPodWith func(config *localTestConfig, volume *localTestVolume, nod func testPodWithNodeConflict(config *localTestConfig, testVolType localVolumeType, nodeName string, makeLocalPodFunc makeLocalPodWith, bindingMode storagev1.VolumeBindingMode) { ginkgo.By(fmt.Sprintf("local-volume-type: %s", testVolType)) - testVols := setupLocalVolumesPVCsPVs(config, testVolType, config.node0, 1, bindingMode) + testVols := setupLocalVolumesPVCsPVs(config, testVolType, config.randomNode, 1, bindingMode) testVol := testVols[0] pod := makeLocalPodFunc(config, testVol, nodeName) @@ -726,7 +740,7 @@ func twoPodsReadWriteTest(f *framework.Framework, config *localTestConfig, testV ginkgo.By("Creating pod1 to write to the PV") pod1, pod1Err := createLocalPod(config, testVol, nil) framework.ExpectNoError(pod1Err) - verifyLocalPod(config, testVol, pod1, config.node0.Name) + verifyLocalPod(config, testVol, pod1, config.randomNode.Name) writeCmd := createWriteCmd(volumeDir, testFile, testFileContent, testVol.localVolumeType) @@ -739,7 +753,7 @@ func twoPodsReadWriteTest(f *framework.Framework, config *localTestConfig, testV ginkgo.By("Creating pod2 to read from the PV") pod2, pod2Err := createLocalPod(config, testVol, nil) framework.ExpectNoError(pod2Err) - verifyLocalPod(config, testVol, pod2, config.node0.Name) + verifyLocalPod(config, testVol, pod2, config.randomNode.Name) // testFileContent was written after creating pod1 testReadFileContent(f, volumeDir, testFile, testFileContent, pod2, testVol.localVolumeType) @@ -763,7 +777,7 @@ func twoPodsReadWriteSerialTest(f *framework.Framework, config *localTestConfig, ginkgo.By("Creating pod1") pod1, pod1Err := createLocalPod(config, testVol, nil) framework.ExpectNoError(pod1Err) - verifyLocalPod(config, testVol, pod1, config.node0.Name) + verifyLocalPod(config, testVol, pod1, config.randomNode.Name) writeCmd := createWriteCmd(volumeDir, testFile, testFileContent, testVol.localVolumeType) @@ -779,7 +793,7 @@ func twoPodsReadWriteSerialTest(f *framework.Framework, config *localTestConfig, ginkgo.By("Creating pod2") pod2, pod2Err := createLocalPod(config, testVol, nil) framework.ExpectNoError(pod2Err) - verifyLocalPod(config, testVol, pod2, config.node0.Name) + verifyLocalPod(config, testVol, pod2, config.randomNode.Name) ginkgo.By("Reading in pod2") testReadFileContent(f, volumeDir, testFile, testFileContent, pod2, testVol.localVolumeType) @@ -855,7 +869,7 @@ func cleanupLocalVolumes(config *localTestConfig, volumes []*localTestVolume) { } func verifyLocalVolume(config *localTestConfig, volume *localTestVolume) { - framework.ExpectNoError(e2epv.WaitOnPVandPVC(config.client, config.ns, volume.pv, volume.pvc)) + framework.ExpectNoError(e2epv.WaitOnPVandPVC(config.client, config.timeouts, config.ns, volume.pv, volume.pvc)) } func verifyLocalPod(config *localTestConfig, volume *localTestVolume, pod *v1.Pod, expectedNodeName string) { @@ -1032,7 +1046,7 @@ func createLocalPod(config *localTestConfig, volume *localTestVolume, fsGroup *i SeLinuxLabel: selinuxLabel, FsGroup: fsGroup, } - return e2epod.CreateSecPod(config.client, &podConfig, framework.PodStartShortTimeout) + return e2epod.CreateSecPod(config.client, &podConfig, config.timeouts.PodStart) } func createWriteCmd(testDir string, testFile string, writeTestFileContent string, volumeType localVolumeType) string { @@ -1075,7 +1089,7 @@ func testReadFileContent(f *framework.Framework, testFileDir string, testFile st // Execute a read or write command in a pod. // Fail on error func podRWCmdExec(f *framework.Framework, pod *v1.Pod, cmd string) string { - stdout, stderr, err := utils.PodExec(f, pod, cmd) + stdout, stderr, err := e2evolume.PodExec(f, pod, cmd) framework.Logf("podRWCmdExec cmd: %q, out: %q, stderr: %q, err: %v", cmd, stdout, stderr, err) framework.ExpectNoError(err) return stdout diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/persistent_volumes.go b/vendor/k8s.io/kubernetes/test/e2e/storage/persistent_volumes.go index 94a189f61557..b1f6cf2c9489 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/persistent_volumes.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/persistent_volumes.go @@ -44,16 +44,16 @@ import ( func completeTest(f *framework.Framework, c clientset.Interface, ns string, pv *v1.PersistentVolume, pvc *v1.PersistentVolumeClaim) { // 1. verify that the PV and PVC have bound correctly ginkgo.By("Validating the PV-PVC binding") - framework.ExpectNoError(e2epv.WaitOnPVandPVC(c, ns, pv, pvc)) + framework.ExpectNoError(e2epv.WaitOnPVandPVC(c, f.Timeouts, ns, pv, pvc)) // 2. create the nfs writer pod, test if the write was successful, // then delete the pod and verify that it was deleted ginkgo.By("Checking pod has write access to PersistentVolume") - framework.ExpectNoError(createWaitAndDeletePod(c, ns, pvc, "touch /mnt/volume1/SUCCESS && (id -G | grep -E '\\b777\\b')")) + framework.ExpectNoError(createWaitAndDeletePod(c, f.Timeouts, ns, pvc, "touch /mnt/volume1/SUCCESS && (id -G | grep -E '\\b777\\b')")) // 3. delete the PVC, wait for PV to become "Released" ginkgo.By("Deleting the PVC to invoke the reclaim policy.") - framework.ExpectNoError(e2epv.DeletePVCandValidatePV(c, ns, pvc, pv, v1.VolumeReleased)) + framework.ExpectNoError(e2epv.DeletePVCandValidatePV(c, f.Timeouts, ns, pvc, pv, v1.VolumeReleased)) } // Validate pairs of PVs and PVCs, create and verify writer pod, delete PVC and validate @@ -80,14 +80,14 @@ func completeMultiTest(f *framework.Framework, c clientset.Interface, ns string, return fmt.Errorf("internal: pvols map is missing volume %q", pvc.Spec.VolumeName) } // TODO: currently a serialized test of each PV - if err = createWaitAndDeletePod(c, pvcKey.Namespace, pvc, "touch /mnt/volume1/SUCCESS && (id -G | grep -E '\\b777\\b')"); err != nil { + if err = createWaitAndDeletePod(c, f.Timeouts, pvcKey.Namespace, pvc, "touch /mnt/volume1/SUCCESS && (id -G | grep -E '\\b777\\b')"); err != nil { return err } } // 2. delete each PVC, wait for its bound PV to reach `expectedPhase` ginkgo.By("Deleting PVCs to invoke reclaim policy") - if err = e2epv.DeletePVCandValidatePVGroup(c, ns, pvols, claims, expectPhase); err != nil { + if err = e2epv.DeletePVCandValidatePVGroup(c, f.Timeouts, ns, pvols, claims, expectPhase); err != nil { return err } return nil @@ -234,7 +234,7 @@ var _ = utils.SIGDescribe("PersistentVolumes", func() { numPVs, numPVCs := 2, 4 pvols, claims, err = e2epv.CreatePVsPVCs(numPVs, numPVCs, c, ns, pvConfig, pvcConfig) framework.ExpectNoError(err) - framework.ExpectNoError(e2epv.WaitAndVerifyBinds(c, ns, pvols, claims, true)) + framework.ExpectNoError(e2epv.WaitAndVerifyBinds(c, f.Timeouts, ns, pvols, claims, true)) framework.ExpectNoError(completeMultiTest(f, c, ns, pvols, claims, v1.VolumeReleased)) }) @@ -244,7 +244,7 @@ var _ = utils.SIGDescribe("PersistentVolumes", func() { numPVs, numPVCs := 3, 3 pvols, claims, err = e2epv.CreatePVsPVCs(numPVs, numPVCs, c, ns, pvConfig, pvcConfig) framework.ExpectNoError(err) - framework.ExpectNoError(e2epv.WaitAndVerifyBinds(c, ns, pvols, claims, true)) + framework.ExpectNoError(e2epv.WaitAndVerifyBinds(c, f.Timeouts, ns, pvols, claims, true)) framework.ExpectNoError(completeMultiTest(f, c, ns, pvols, claims, v1.VolumeReleased)) }) @@ -254,7 +254,7 @@ var _ = utils.SIGDescribe("PersistentVolumes", func() { numPVs, numPVCs := 4, 2 pvols, claims, err = e2epv.CreatePVsPVCs(numPVs, numPVCs, c, ns, pvConfig, pvcConfig) framework.ExpectNoError(err) - framework.ExpectNoError(e2epv.WaitAndVerifyBinds(c, ns, pvols, claims, true)) + framework.ExpectNoError(e2epv.WaitAndVerifyBinds(c, f.Timeouts, ns, pvols, claims, true)) framework.ExpectNoError(completeMultiTest(f, c, ns, pvols, claims, v1.VolumeReleased)) }) }) @@ -267,7 +267,7 @@ var _ = utils.SIGDescribe("PersistentVolumes", func() { pvConfig.ReclaimPolicy = v1.PersistentVolumeReclaimRecycle pv, pvc, err = e2epv.CreatePVPVC(c, pvConfig, pvcConfig, ns, false) framework.ExpectNoError(err, "BeforeEach: Failed to create PV/PVC") - framework.ExpectNoError(e2epv.WaitOnPVandPVC(c, ns, pv, pvc), "BeforeEach: WaitOnPVandPVC failed") + framework.ExpectNoError(e2epv.WaitOnPVandPVC(c, f.Timeouts, ns, pv, pvc), "BeforeEach: WaitOnPVandPVC failed") }) ginkgo.AfterEach(func() { @@ -285,11 +285,11 @@ var _ = utils.SIGDescribe("PersistentVolumes", func() { pod := e2epod.MakePod(ns, nil, []*v1.PersistentVolumeClaim{pvc}, true, "touch /mnt/volume1/SUCCESS && (id -G | grep -E '\\b777\\b')") pod, err = c.CoreV1().Pods(ns).Create(context.TODO(), pod, metav1.CreateOptions{}) framework.ExpectNoError(err) - framework.ExpectNoError(e2epod.WaitForPodSuccessInNamespace(c, pod.Name, ns)) + framework.ExpectNoError(e2epod.WaitForPodSuccessInNamespaceTimeout(c, pod.Name, ns, f.Timeouts.PodStart)) ginkgo.By("Deleting the claim") framework.ExpectNoError(e2epod.DeletePodWithWait(c, pod)) - framework.ExpectNoError(e2epv.DeletePVCandValidatePV(c, ns, pvc, pv, v1.VolumeAvailable)) + framework.ExpectNoError(e2epv.DeletePVCandValidatePV(c, f.Timeouts, ns, pvc, pv, v1.VolumeAvailable)) ginkgo.By("Re-mounting the volume.") pvc = e2epv.MakePersistentVolumeClaim(pvcConfig, ns) @@ -303,14 +303,14 @@ var _ = utils.SIGDescribe("PersistentVolumes", func() { pod = e2epod.MakePod(ns, nil, []*v1.PersistentVolumeClaim{pvc}, true, fmt.Sprintf("[ $(ls -A %s | wc -l) -eq 0 ] && exit 0 || exit 1", mount)) pod, err = c.CoreV1().Pods(ns).Create(context.TODO(), pod, metav1.CreateOptions{}) framework.ExpectNoError(err) - framework.ExpectNoError(e2epod.WaitForPodSuccessInNamespace(c, pod.Name, ns)) + framework.ExpectNoError(e2epod.WaitForPodSuccessInNamespaceTimeout(c, pod.Name, ns, f.Timeouts.PodStart)) framework.ExpectNoError(e2epod.DeletePodWithWait(c, pod)) framework.Logf("Pod exited without failure; the volume has been recycled.") // Delete the PVC and wait for the recycler to finish before the NFS server gets shutdown during cleanup. framework.Logf("Removing second PVC, waiting for the recycler to finish before cleanup.") - framework.ExpectNoError(e2epv.DeletePVCandValidatePV(c, ns, pvc, pv, v1.VolumeAvailable)) + framework.ExpectNoError(e2epv.DeletePVCandValidatePV(c, f.Timeouts, ns, pvc, pv, v1.VolumeAvailable)) pvc = nil }) }) @@ -420,9 +420,8 @@ func makeStatefulSetWithPVCs(ns, cmd string, mounts []v1.VolumeMount, claims []v Containers: []v1.Container{ { Name: "nginx", - Image: imageutils.GetE2EImage(imageutils.Nginx), - Command: []string{"/bin/sh"}, - Args: []string{"-c", cmd}, + Image: e2epod.GetTestImage(imageutils.Nginx), + Command: e2epod.GenerateScriptCmd(cmd), VolumeMounts: mounts, ReadinessProbe: readyProbe, }, @@ -437,7 +436,7 @@ func makeStatefulSetWithPVCs(ns, cmd string, mounts []v1.VolumeMount, claims []v // createWaitAndDeletePod creates the test pod, wait for (hopefully) success, and then delete the pod. // Note: need named return value so that the err assignment in the defer sets the returned error. // Has been shown to be necessary using Go 1.7. -func createWaitAndDeletePod(c clientset.Interface, ns string, pvc *v1.PersistentVolumeClaim, command string) (err error) { +func createWaitAndDeletePod(c clientset.Interface, t *framework.TimeoutContext, ns string, pvc *v1.PersistentVolumeClaim, command string) (err error) { framework.Logf("Creating nfs test pod") pod := e2epod.MakePod(ns, nil, []*v1.PersistentVolumeClaim{pvc}, true, command) runPod, err := c.CoreV1().Pods(ns).Create(context.TODO(), pod, metav1.CreateOptions{}) @@ -451,7 +450,7 @@ func createWaitAndDeletePod(c clientset.Interface, ns string, pvc *v1.Persistent } }() - err = testPodSuccessOrFail(c, ns, runPod) + err = testPodSuccessOrFail(c, t, ns, runPod) if err != nil { return fmt.Errorf("pod %q did not exit with Success: %v", runPod.Name, err) } @@ -459,9 +458,9 @@ func createWaitAndDeletePod(c clientset.Interface, ns string, pvc *v1.Persistent } // testPodSuccessOrFail tests whether the pod's exit code is zero. -func testPodSuccessOrFail(c clientset.Interface, ns string, pod *v1.Pod) error { +func testPodSuccessOrFail(c clientset.Interface, t *framework.TimeoutContext, ns string, pod *v1.Pod) error { framework.Logf("Pod should terminate with exitcode 0 (success)") - if err := e2epod.WaitForPodSuccessInNamespace(c, pod.Name, ns); err != nil { + if err := e2epod.WaitForPodSuccessInNamespaceTimeout(c, pod.Name, ns, t.PodStart); err != nil { return fmt.Errorf("pod %q failed to reach Success: %v", pod.Name, err) } framework.Logf("Pod %v succeeded ", pod.Name) diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/podlogs/BUILD b/vendor/k8s.io/kubernetes/test/e2e/storage/podlogs/BUILD deleted file mode 100644 index c2bee4c141f7..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/podlogs/BUILD +++ /dev/null @@ -1,28 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["podlogs.go"], - importpath = "k8s.io/kubernetes/test/e2e/storage/podlogs", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/github.com/pkg/errors:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/podlogs/podlogs.go b/vendor/k8s.io/kubernetes/test/e2e/storage/podlogs/podlogs.go index 1c69231a5471..6e3439796984 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/podlogs/podlogs.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/podlogs/podlogs.go @@ -68,6 +68,17 @@ var expectedErrors = regexp.MustCompile(`container .* in pod .* is (terminated|w // would be a blocking function with collects logs from all currently // running pods, but that then would have the disadvantage that // already deleted pods aren't covered. +// +// Another race occurs is when a pod shuts down. Logging stops, but if +// then the pod is not removed from the apiserver quickly enough, logging +// resumes and dumps the old log again. Previously, this was allowed based +// on the assumption that it is better to log twice than miss log messages +// of pods that started and immediately terminated or when logging temporarily +// stopped. +// +// But it turned out to be rather confusing, so now a heuristic is used: if +// log output of a container was already captured, then capturing does not +// resume if the pod is marked for deletion. func CopyAllLogs(ctx context.Context, cs clientset.Interface, ns string, to LogOutput) error { watcher, err := cs.CoreV1().Pods(ns).Watch(context.TODO(), meta.ListOptions{}) if err != nil { @@ -106,6 +117,9 @@ func CopyAllLogs(ctx context.Context, cs clientset.Interface, ns string, to LogO // there cannot be any new output and we can ignore it. (pod.Status.ContainerStatuses[i].State.Terminated != nil && started[id]) || + // State.Terminated might not have been updated although the container already + // stopped running. Also check whether the pod is deleted. + (pod.DeletionTimestamp != nil && started[id]) || // Don't attempt to get logs for a container unless it is running or has terminated. // Trying to get a log would just end up with an error that we would have to suppress. (pod.Status.ContainerStatuses[i].State.Running == nil && diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/pv_protection.go b/vendor/k8s.io/kubernetes/test/e2e/storage/pv_protection.go index c87735ec73d0..fc63531070c3 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/pv_protection.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/pv_protection.go @@ -100,7 +100,7 @@ var _ = utils.SIGDescribe("PV Protection", func() { ginkgo.By("Deleting the PV") err = client.CoreV1().PersistentVolumes().Delete(context.TODO(), pv.Name, *metav1.NewDeleteOptions(0)) framework.ExpectNoError(err, "Error deleting PV") - err = e2epv.WaitForPersistentVolumeDeleted(client, pv.Name, framework.Poll, e2epv.PVDeletingTimeout) + err = e2epv.WaitForPersistentVolumeDeleted(client, pv.Name, framework.Poll, f.Timeouts.PVDelete) framework.ExpectNoError(err, "waiting for PV to be deleted") }) @@ -111,7 +111,7 @@ var _ = utils.SIGDescribe("PV Protection", func() { framework.ExpectNoError(err, "Error creating PVC") ginkgo.By("Waiting for PVC to become Bound") - err = e2epv.WaitForPersistentVolumeClaimPhase(v1.ClaimBound, client, nameSpace, pvc.Name, framework.Poll, e2epv.ClaimBindingTimeout) + err = e2epv.WaitForPersistentVolumeClaimPhase(v1.ClaimBound, client, nameSpace, pvc.Name, framework.Poll, f.Timeouts.ClaimBound) framework.ExpectNoError(err, "Failed waiting for PVC to be bound %v", err) ginkgo.By("Deleting the PV, however, the PV must not be removed from the system as it's bound to a PVC") @@ -128,7 +128,7 @@ var _ = utils.SIGDescribe("PV Protection", func() { framework.ExpectNoError(err, "Error deleting PVC") ginkgo.By("Checking that the PV is automatically removed from the system because it's no longer bound to a PVC") - err = e2epv.WaitForPersistentVolumeDeleted(client, pv.Name, framework.Poll, e2epv.PVDeletingTimeout) + err = e2epv.WaitForPersistentVolumeDeleted(client, pv.Name, framework.Poll, f.Timeouts.PVDelete) framework.ExpectNoError(err, "waiting for PV to be deleted") }) }) diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/pvc_protection.go b/vendor/k8s.io/kubernetes/test/e2e/storage/pvc_protection.go index b2ab547bd05d..d9294be6ee20 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/pvc_protection.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/pvc_protection.go @@ -18,12 +18,13 @@ package storage import ( "context" + "github.com/onsi/ginkgo" "fmt" "time" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" clientset "k8s.io/client-go/kubernetes" @@ -77,6 +78,7 @@ var _ = utils.SIGDescribe("PVC Protection", func() { prefix := "pvc-protection" e2epv.SkipIfNoDefaultStorageClass(client) t := testsuites.StorageClassTest{ + Timeouts: f.Timeouts, ClaimSize: "1Gi", } pvc = e2epv.MakePersistentVolumeClaim(e2epv.PersistentVolumeClaimConfig{ @@ -94,7 +96,7 @@ var _ = utils.SIGDescribe("PVC Protection", func() { framework.ExpectNoError(err, "While creating pod that uses the PVC or waiting for the Pod to become Running") ginkgo.By("Waiting for PVC to become Bound") - err = e2epv.WaitForPersistentVolumeClaimPhase(v1.ClaimBound, client, nameSpace, pvc.Name, framework.Poll, e2epv.ClaimBindingTimeout) + err = e2epv.WaitForPersistentVolumeClaimPhase(v1.ClaimBound, client, nameSpace, pvc.Name, framework.Poll, f.Timeouts.ClaimBound) framework.ExpectNoError(err, "Failed waiting for PVC to be bound %v", err) ginkgo.By("Checking that PVC Protection finalizer is set") diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/regional_pd.go b/vendor/k8s.io/kubernetes/test/e2e/storage/regional_pd.go index c7465e842878..c92560c21b65 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/regional_pd.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/regional_pd.go @@ -18,6 +18,7 @@ package storage import ( "context" + "github.com/onsi/ginkgo" "github.com/onsi/gomega" @@ -74,7 +75,7 @@ var _ = utils.SIGDescribe("Regional PD", func() { ginkgo.Describe("RegionalPD", func() { ginkgo.It("should provision storage [Slow]", func() { - testVolumeProvisioning(c, ns) + testVolumeProvisioning(c, f.Timeouts, ns) }) ginkgo.It("should provision storage with delayed binding [Slow]", func() { @@ -97,7 +98,7 @@ var _ = utils.SIGDescribe("Regional PD", func() { }) }) -func testVolumeProvisioning(c clientset.Interface, ns string) { +func testVolumeProvisioning(c clientset.Interface, t *framework.TimeoutContext, ns string) { cloudZones := getTwoRandomZones(c) // This test checks that dynamic provisioning can provision a volume @@ -107,6 +108,7 @@ func testVolumeProvisioning(c clientset.Interface, ns string) { Name: "HDD Regional PD on GCE/GKE", CloudProviders: []string{"gce", "gke"}, Provisioner: "kubernetes.io/gce-pd", + Timeouts: framework.NewTimeoutContextWithDefaults(), Parameters: map[string]string{ "type": "pd-standard", "zones": strings.Join(cloudZones, ","), @@ -115,7 +117,7 @@ func testVolumeProvisioning(c clientset.Interface, ns string) { ClaimSize: repdMinSize, ExpectedSize: repdMinSize, PvCheck: func(claim *v1.PersistentVolumeClaim) { - volume := testsuites.PVWriteReadSingleNodeCheck(c, claim, e2epod.NodeSelection{}) + volume := testsuites.PVWriteReadSingleNodeCheck(c, t, claim, e2epod.NodeSelection{}) gomega.Expect(volume).NotTo(gomega.BeNil()) err := checkGCEPD(volume, "pd-standard") @@ -129,6 +131,7 @@ func testVolumeProvisioning(c clientset.Interface, ns string) { Name: "HDD Regional PD with auto zone selection on GCE/GKE", CloudProviders: []string{"gce", "gke"}, Provisioner: "kubernetes.io/gce-pd", + Timeouts: framework.NewTimeoutContextWithDefaults(), Parameters: map[string]string{ "type": "pd-standard", "replication-type": "regional-pd", @@ -136,7 +139,7 @@ func testVolumeProvisioning(c clientset.Interface, ns string) { ClaimSize: repdMinSize, ExpectedSize: repdMinSize, PvCheck: func(claim *v1.PersistentVolumeClaim) { - volume := testsuites.PVWriteReadSingleNodeCheck(c, claim, e2epod.NodeSelection{}) + volume := testsuites.PVWriteReadSingleNodeCheck(c, t, claim, e2epod.NodeSelection{}) gomega.Expect(volume).NotTo(gomega.BeNil()) err := checkGCEPD(volume, "pd-standard") @@ -157,6 +160,9 @@ func testVolumeProvisioning(c clientset.Interface, ns string) { StorageClassName: &(test.Class.Name), VolumeMode: &test.VolumeMode, }, ns) + _, clearStorageClass := testsuites.SetupStorageClass(test.Client, test.Class) + defer clearStorageClass() + test.TestDynamicProvisioning() } } @@ -166,6 +172,7 @@ func testZonalFailover(c clientset.Interface, ns string) { testSpec := testsuites.StorageClassTest{ Name: "Regional PD Failover on GCE/GKE", CloudProviders: []string{"gce", "gke"}, + Timeouts: framework.NewTimeoutContextWithDefaults(), Provisioner: "kubernetes.io/gce-pd", Parameters: map[string]string{ "type": "pd-standard", @@ -231,10 +238,10 @@ func testZonalFailover(c clientset.Interface, ns string) { nodeName := pod.Spec.NodeName node, err := c.CoreV1().Nodes().Get(context.TODO(), nodeName, metav1.GetOptions{}) framework.ExpectNoError(err) - podZone := node.Labels[v1.LabelFailureDomainBetaZone] + podZone := node.Labels[v1.LabelTopologyZone] ginkgo.By("tainting nodes in the zone the pod is scheduled in") - selector := labels.SelectorFromSet(labels.Set(map[string]string{v1.LabelFailureDomainBetaZone: podZone})) + selector := labels.SelectorFromSet(labels.Set(map[string]string{v1.LabelTopologyZone: podZone})) nodesInZone, err := c.CoreV1().Nodes().List(context.TODO(), metav1.ListOptions{LabelSelector: selector.String()}) framework.ExpectNoError(err) removeTaintFunc := addTaint(c, ns, nodesInZone.Items, podZone) @@ -262,7 +269,7 @@ func testZonalFailover(c clientset.Interface, ns string) { if err != nil { return false, nil } - newPodZone := node.Labels[v1.LabelFailureDomainBetaZone] + newPodZone := node.Labels[v1.LabelTopologyZone] return newPodZone == otherZone, nil }) framework.ExpectNoError(waitErr, "Error waiting for pod to be scheduled in a different zone (%q): %v", otherZone, err) @@ -326,6 +333,7 @@ func testRegionalDelayedBinding(c clientset.Interface, ns string, pvcCount int) Client: c, Name: "Regional PD storage class with waitForFirstConsumer test on GCE", Provisioner: "kubernetes.io/gce-pd", + Timeouts: framework.NewTimeoutContextWithDefaults(), Parameters: map[string]string{ "type": "pd-standard", "replication-type": "regional-pd", @@ -349,9 +357,9 @@ func testRegionalDelayedBinding(c clientset.Interface, ns string, pvcCount int) if node == nil { framework.Failf("unexpected nil node found") } - zone, ok := node.Labels[v1.LabelFailureDomainBetaZone] + zone, ok := node.Labels[v1.LabelTopologyZone] if !ok { - framework.Failf("label %s not found on Node", v1.LabelFailureDomainBetaZone) + framework.Failf("label %s not found on Node", v1.LabelTopologyZone) } for _, pv := range pvs { checkZoneFromLabelAndAffinity(pv, zone, false) @@ -362,6 +370,7 @@ func testRegionalAllowedTopologies(c clientset.Interface, ns string) { test := testsuites.StorageClassTest{ Name: "Regional PD storage class with allowedTopologies test on GCE", Provisioner: "kubernetes.io/gce-pd", + Timeouts: framework.NewTimeoutContextWithDefaults(), Parameters: map[string]string{ "type": "pd-standard", "replication-type": "regional-pd", @@ -382,6 +391,9 @@ func testRegionalAllowedTopologies(c clientset.Interface, ns string) { VolumeMode: &test.VolumeMode, }, ns) + _, clearStorageClass := testsuites.SetupStorageClass(test.Client, test.Class) + defer clearStorageClass() + pv := test.TestDynamicProvisioning() checkZonesFromLabelAndAffinity(pv, sets.NewString(zones...), true) } @@ -389,6 +401,7 @@ func testRegionalAllowedTopologies(c clientset.Interface, ns string) { func testRegionalAllowedTopologiesWithDelayedBinding(c clientset.Interface, ns string, pvcCount int) { test := testsuites.StorageClassTest{ Client: c, + Timeouts: framework.NewTimeoutContextWithDefaults(), Name: "Regional PD storage class with allowedTopologies and waitForFirstConsumer test on GCE", Provisioner: "kubernetes.io/gce-pd", Parameters: map[string]string{ @@ -416,9 +429,9 @@ func testRegionalAllowedTopologiesWithDelayedBinding(c clientset.Interface, ns s if node == nil { framework.Failf("unexpected nil node found") } - nodeZone, ok := node.Labels[v1.LabelFailureDomainBetaZone] + nodeZone, ok := node.Labels[v1.LabelTopologyZone] if !ok { - framework.Failf("label %s not found on Node", v1.LabelFailureDomainBetaZone) + framework.Failf("label %s not found on Node", v1.LabelTopologyZone) } zoneFound := false for _, zone := range topoZones { @@ -459,7 +472,7 @@ func addAllowedTopologiesToStorageClass(c clientset.Interface, sc *storagev1.Sto term := v1.TopologySelectorTerm{ MatchLabelExpressions: []v1.TopologySelectorLabelRequirement{ { - Key: v1.LabelFailureDomainBetaZone, + Key: v1.LabelTopologyZone, Values: zones, }, }, @@ -561,7 +574,7 @@ func getTwoRandomZones(c clientset.Interface) []string { // If match is true, check if zones in PV exactly match zones given. // Otherwise, check whether zones in PV is superset of zones given. func verifyZonesInPV(volume *v1.PersistentVolume, zones sets.String, match bool) error { - pvZones, err := volumehelpers.LabelZonesToSet(volume.Labels[v1.LabelFailureDomainBetaZone]) + pvZones, err := volumehelpers.LabelZonesToSet(volume.Labels[v1.LabelTopologyZone]) if err != nil { return err } @@ -578,17 +591,17 @@ func checkZoneFromLabelAndAffinity(pv *v1.PersistentVolume, zone string, matchZo checkZonesFromLabelAndAffinity(pv, sets.NewString(zone), matchZone) } -// checkZoneLabelAndAffinity checks the LabelFailureDomainBetaZone label of PV and terms -// with key LabelFailureDomainBetaZone in PV's node affinity contains zone +// checkZoneLabelAndAffinity checks the LabelTopologyZone label of PV and terms +// with key LabelTopologyZone in PV's node affinity contains zone // matchZones is used to indicate if zones should match perfectly func checkZonesFromLabelAndAffinity(pv *v1.PersistentVolume, zones sets.String, matchZones bool) { ginkgo.By("checking PV's zone label and node affinity terms match expected zone") if pv == nil { framework.Failf("nil pv passed") } - pvLabel, ok := pv.Labels[v1.LabelFailureDomainBetaZone] + pvLabel, ok := pv.Labels[v1.LabelTopologyZone] if !ok { - framework.Failf("label %s not found on PV", v1.LabelFailureDomainBetaZone) + framework.Failf("label %s not found on PV", v1.LabelTopologyZone) } zonesFromLabel, err := volumehelpers.LabelZonesToSet(pvLabel) @@ -596,10 +609,10 @@ func checkZonesFromLabelAndAffinity(pv *v1.PersistentVolume, zones sets.String, framework.Failf("unable to parse zone labels %s: %v", pvLabel, err) } if matchZones && !zonesFromLabel.Equal(zones) { - framework.Failf("value[s] of %s label for PV: %v does not match expected zone[s]: %v", v1.LabelFailureDomainBetaZone, zonesFromLabel, zones) + framework.Failf("value[s] of %s label for PV: %v does not match expected zone[s]: %v", v1.LabelTopologyZone, zonesFromLabel, zones) } if !matchZones && !zonesFromLabel.IsSuperset(zones) { - framework.Failf("value[s] of %s label for PV: %v does not contain expected zone[s]: %v", v1.LabelFailureDomainBetaZone, zonesFromLabel, zones) + framework.Failf("value[s] of %s label for PV: %v does not contain expected zone[s]: %v", v1.LabelTopologyZone, zonesFromLabel, zones) } if pv.Spec.NodeAffinity == nil { framework.Failf("node affinity not found in PV spec %v", pv.Spec) @@ -611,7 +624,7 @@ func checkZonesFromLabelAndAffinity(pv *v1.PersistentVolume, zones sets.String, for _, term := range pv.Spec.NodeAffinity.Required.NodeSelectorTerms { keyFound := false for _, r := range term.MatchExpressions { - if r.Key != v1.LabelFailureDomainBetaZone { + if r.Key != v1.LabelTopologyZone { continue } keyFound = true @@ -625,7 +638,7 @@ func checkZonesFromLabelAndAffinity(pv *v1.PersistentVolume, zones sets.String, break } if !keyFound { - framework.Failf("label %s not found in term %v", v1.LabelFailureDomainBetaZone, term) + framework.Failf("label %s not found in term %v", v1.LabelTopologyZone, term) } } } diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/testpatterns/BUILD b/vendor/k8s.io/kubernetes/test/e2e/storage/testpatterns/BUILD deleted file mode 100644 index 1374bf7e04c0..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/testpatterns/BUILD +++ /dev/null @@ -1,27 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["testpattern.go"], - importpath = "k8s.io/kubernetes/test/e2e/storage/testpatterns", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/storage/v1:go_default_library", - "//test/e2e/framework/volume:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/BUILD b/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/BUILD deleted file mode 100644 index 508772790abe..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/BUILD +++ /dev/null @@ -1,96 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "base.go", - "disruptive.go", - "driveroperations.go", - "ephemeral.go", - "fsgroupchangepolicy.go", - "multivolume.go", - "provisioning.go", - "snapshottable.go", - "snapshottable_stress.go", - "subpath.go", - "testdriver.go", - "topology.go", - "volume_expand.go", - "volume_io.go", - "volume_stress.go", - "volumelimits.go", - "volumemode.go", - "volumes.go", - ], - importpath = "k8s.io/kubernetes/test/e2e/storage/testsuites", - visibility = ["//visibility:public"], - deps = [ - "//pkg/controller/volume/events:go_default_library", - "//pkg/kubelet/events:go_default_library", - "//pkg/volume/util:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/storage/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/rand:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - "//staging/src/k8s.io/client-go/dynamic:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/component-base/metrics/testutil:go_default_library", - "//staging/src/k8s.io/csi-translation-lib:go_default_library", - "//staging/src/k8s.io/csi-translation-lib/plugins:go_default_library", - "//test/e2e/framework:go_default_library", - "//test/e2e/framework/events:go_default_library", - "//test/e2e/framework/metrics:go_default_library", - "//test/e2e/framework/node:go_default_library", - "//test/e2e/framework/pod:go_default_library", - "//test/e2e/framework/pv:go_default_library", - "//test/e2e/framework/skipper:go_default_library", - "//test/e2e/framework/volume:go_default_library", - "//test/e2e/storage/podlogs:go_default_library", - "//test/e2e/storage/testpatterns:go_default_library", - "//test/e2e/storage/utils:go_default_library", - "//test/utils/image:go_default_library", - "//vendor/github.com/onsi/ginkgo:go_default_library", - "//vendor/github.com/onsi/gomega:go_default_library", - "//vendor/github.com/pkg/errors:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = [ - "api_test.go", - "base_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//test/e2e/framework/volume:go_default_library", - "//test/e2e/storage/testpatterns:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/base.go b/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/base.go index 96d8fc922a49..4eb34ca89153 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/base.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/base.go @@ -19,41 +19,20 @@ package testsuites import ( "context" "flag" - "fmt" - "math" - "regexp" "strings" - "time" - "github.com/onsi/ginkgo" - "github.com/pkg/errors" - - v1 "k8s.io/api/core/v1" - storagev1 "k8s.io/api/storage/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/types" - utilerrors "k8s.io/apimachinery/pkg/util/errors" "k8s.io/apimachinery/pkg/util/sets" clientset "k8s.io/client-go/kubernetes" "k8s.io/component-base/metrics/testutil" csitrans "k8s.io/csi-translation-lib" "k8s.io/kubernetes/test/e2e/framework" e2emetrics "k8s.io/kubernetes/test/e2e/framework/metrics" - e2epv "k8s.io/kubernetes/test/e2e/framework/pv" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" - e2evolume "k8s.io/kubernetes/test/e2e/framework/volume" - "k8s.io/kubernetes/test/e2e/storage/podlogs" - "k8s.io/kubernetes/test/e2e/storage/testpatterns" + storageframework "k8s.io/kubernetes/test/e2e/storage/framework" ) -var ( - migratedPlugins *string - minValidSize = "1Ki" - maxValidSize = "10Ei" -) +var migratedPlugins *string func init() { migratedPlugins = flag.String("storage.migratedPlugins", "", "comma separated list of in-tree plugin names of form 'kubernetes.io/{pluginName}' migrated to CSI") @@ -73,7 +52,8 @@ type migrationOpCheck struct { } // BaseSuites is a list of storage test suites that work for in-tree and CSI drivers -var BaseSuites = []func() TestSuite{ +var BaseSuites = []func() storageframework.TestSuite{ + InitCapacityTestSuite, InitVolumesTestSuite, InitVolumeIOTestSuite, InitVolumeModeTestSuite, @@ -93,589 +73,9 @@ var CSISuites = append(BaseSuites, InitEphemeralTestSuite, InitSnapshottableTestSuite, InitSnapshottableStressTestSuite, + InitVolumePerformanceTestSuite, ) -// TestSuite represents an interface for a set of tests which works with TestDriver -type TestSuite interface { - // GetTestSuiteInfo returns the TestSuiteInfo for this TestSuite - GetTestSuiteInfo() TestSuiteInfo - // DefineTests defines tests of the testpattern for the driver. - // Called inside a Ginkgo context that reflects the current driver and test pattern, - // so the test suite can define tests directly with ginkgo.It. - DefineTests(TestDriver, testpatterns.TestPattern) - // SkipRedundantSuite will skip the test suite based on the given TestPattern and TestDriver - SkipRedundantSuite(TestDriver, testpatterns.TestPattern) -} - -// TestSuiteInfo represents a set of parameters for TestSuite -type TestSuiteInfo struct { - Name string // name of the TestSuite - FeatureTag string // featureTag for the TestSuite - TestPatterns []testpatterns.TestPattern // Slice of TestPattern for the TestSuite - SupportedSizeRange e2evolume.SizeRange // Size range supported by the test suite -} - -func getTestNameStr(suite TestSuite, pattern testpatterns.TestPattern) string { - tsInfo := suite.GetTestSuiteInfo() - return fmt.Sprintf("[Testpattern: %s]%s %s%s", pattern.Name, pattern.FeatureTag, tsInfo.Name, tsInfo.FeatureTag) -} - -// DefineTestSuite defines tests for all testpatterns and all testSuites for a driver -func DefineTestSuite(driver TestDriver, tsInits []func() TestSuite) { - for _, testSuiteInit := range tsInits { - suite := testSuiteInit() - for _, pattern := range suite.GetTestSuiteInfo().TestPatterns { - p := pattern - ginkgo.Context(getTestNameStr(suite, p), func() { - ginkgo.BeforeEach(func() { - // Skip unsupported tests to avoid unnecessary resource initialization - suite.SkipRedundantSuite(driver, p) - skipUnsupportedTest(driver, p) - }) - suite.DefineTests(driver, p) - }) - } - } -} - -// skipUnsupportedTest will skip tests if the combination of driver, and testpattern -// is not suitable to be tested. -// Whether it needs to be skipped is checked by following steps: -// 1. Check if Whether SnapshotType is supported by driver from its interface -// 2. Check if Whether volType is supported by driver from its interface -// 3. Check if fsType is supported -// 4. Check with driver specific logic -// -// Test suites can also skip tests inside their own DefineTests function or in -// individual tests. -func skipUnsupportedTest(driver TestDriver, pattern testpatterns.TestPattern) { - dInfo := driver.GetDriverInfo() - var isSupported bool - - // 0. Check with driver specific logic - driver.SkipUnsupportedTest(pattern) - - // 1. Check if Whether volType is supported by driver from its interface - switch pattern.VolType { - case testpatterns.InlineVolume: - _, isSupported = driver.(InlineVolumeTestDriver) - case testpatterns.PreprovisionedPV: - _, isSupported = driver.(PreprovisionedPVTestDriver) - case testpatterns.DynamicPV, testpatterns.GenericEphemeralVolume: - _, isSupported = driver.(DynamicPVTestDriver) - case testpatterns.CSIInlineVolume: - _, isSupported = driver.(EphemeralTestDriver) - default: - isSupported = false - } - - if !isSupported { - e2eskipper.Skipf("Driver %s doesn't support %v -- skipping", dInfo.Name, pattern.VolType) - } - - // 2. Check if fsType is supported - if !dInfo.SupportedFsType.Has(pattern.FsType) { - e2eskipper.Skipf("Driver %s doesn't support %v -- skipping", dInfo.Name, pattern.FsType) - } - if pattern.FsType == "xfs" && framework.NodeOSDistroIs("windows") { - e2eskipper.Skipf("Distro doesn't support xfs -- skipping") - } - if pattern.FsType == "ntfs" && !framework.NodeOSDistroIs("windows") { - e2eskipper.Skipf("Distro %s doesn't support ntfs -- skipping", framework.TestContext.NodeOSDistro) - } -} - -// VolumeResource is a generic implementation of TestResource that wil be able to -// be used in most of TestSuites. -// See volume_io.go or volumes.go in test/e2e/storage/testsuites/ for how to use this resource. -// Also, see subpath.go in the same directory for how to extend and use it. -type VolumeResource struct { - Config *PerTestConfig - Pattern testpatterns.TestPattern - VolSource *v1.VolumeSource - Pvc *v1.PersistentVolumeClaim - Pv *v1.PersistentVolume - Sc *storagev1.StorageClass - - Volume TestVolume -} - -// CreateVolumeResource constructs a VolumeResource for the current test. It knows how to deal with -// different test pattern volume types. -func CreateVolumeResource(driver TestDriver, config *PerTestConfig, pattern testpatterns.TestPattern, testVolumeSizeRange e2evolume.SizeRange) *VolumeResource { - r := VolumeResource{ - Config: config, - Pattern: pattern, - } - dInfo := driver.GetDriverInfo() - f := config.Framework - cs := f.ClientSet - - // Create volume for pre-provisioned volume tests - r.Volume = CreateVolume(driver, config, pattern.VolType) - - switch pattern.VolType { - case testpatterns.InlineVolume: - framework.Logf("Creating resource for inline volume") - if iDriver, ok := driver.(InlineVolumeTestDriver); ok { - r.VolSource = iDriver.GetVolumeSource(false, pattern.FsType, r.Volume) - } - case testpatterns.PreprovisionedPV: - framework.Logf("Creating resource for pre-provisioned PV") - if pDriver, ok := driver.(PreprovisionedPVTestDriver); ok { - pvSource, volumeNodeAffinity := pDriver.GetPersistentVolumeSource(false, pattern.FsType, r.Volume) - if pvSource != nil { - r.Pv, r.Pvc = createPVCPV(f, dInfo.Name, pvSource, volumeNodeAffinity, pattern.VolMode, dInfo.RequiredAccessModes) - r.VolSource = createVolumeSource(r.Pvc.Name, false /* readOnly */) - } - } - case testpatterns.DynamicPV, testpatterns.GenericEphemeralVolume: - framework.Logf("Creating resource for dynamic PV") - if dDriver, ok := driver.(DynamicPVTestDriver); ok { - var err error - driverVolumeSizeRange := dDriver.GetDriverInfo().SupportedSizeRange - claimSize, err := getSizeRangesIntersection(testVolumeSizeRange, driverVolumeSizeRange) - framework.ExpectNoError(err, "determine intersection of test size range %+v and driver size range %+v", testVolumeSizeRange, driverVolumeSizeRange) - framework.Logf("Using claimSize:%s, test suite supported size:%v, driver(%s) supported size:%v ", claimSize, testVolumeSizeRange, dDriver.GetDriverInfo().Name, testVolumeSizeRange) - r.Sc = dDriver.GetDynamicProvisionStorageClass(r.Config, pattern.FsType) - - if pattern.BindingMode != "" { - r.Sc.VolumeBindingMode = &pattern.BindingMode - } - if pattern.AllowExpansion != false { - r.Sc.AllowVolumeExpansion = &pattern.AllowExpansion - } - - ginkgo.By("creating a StorageClass " + r.Sc.Name) - - r.Sc, err = cs.StorageV1().StorageClasses().Create(context.TODO(), r.Sc, metav1.CreateOptions{}) - framework.ExpectNoError(err) - - switch pattern.VolType { - case testpatterns.DynamicPV: - r.Pv, r.Pvc = createPVCPVFromDynamicProvisionSC( - f, dInfo.Name, claimSize, r.Sc, pattern.VolMode, dInfo.RequiredAccessModes) - r.VolSource = createVolumeSource(r.Pvc.Name, false /* readOnly */) - case testpatterns.GenericEphemeralVolume: - driverVolumeSizeRange := dDriver.GetDriverInfo().SupportedSizeRange - claimSize, err := getSizeRangesIntersection(testVolumeSizeRange, driverVolumeSizeRange) - framework.ExpectNoError(err, "determine intersection of test size range %+v and driver size range %+v", testVolumeSizeRange, driverVolumeSizeRange) - r.VolSource = createEphemeralVolumeSource(r.Sc.Name, dInfo.RequiredAccessModes, claimSize, false /* readOnly */) - } - } - case testpatterns.CSIInlineVolume: - framework.Logf("Creating resource for CSI ephemeral inline volume") - if eDriver, ok := driver.(EphemeralTestDriver); ok { - attributes, _, _ := eDriver.GetVolume(config, 0) - r.VolSource = &v1.VolumeSource{ - CSI: &v1.CSIVolumeSource{ - Driver: eDriver.GetCSIDriverName(config), - VolumeAttributes: attributes, - }, - } - } - default: - framework.Failf("VolumeResource doesn't support: %s", pattern.VolType) - } - - if r.VolSource == nil { - e2eskipper.Skipf("Driver %s doesn't support %v -- skipping", dInfo.Name, pattern.VolType) - } - - return &r -} - -func createVolumeSource(pvcName string, readOnly bool) *v1.VolumeSource { - return &v1.VolumeSource{ - PersistentVolumeClaim: &v1.PersistentVolumeClaimVolumeSource{ - ClaimName: pvcName, - ReadOnly: readOnly, - }, - } -} - -func createEphemeralVolumeSource(scName string, accessModes []v1.PersistentVolumeAccessMode, claimSize string, readOnly bool) *v1.VolumeSource { - if len(accessModes) == 0 { - accessModes = []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce} - } - return &v1.VolumeSource{ - Ephemeral: &v1.EphemeralVolumeSource{ - VolumeClaimTemplate: &v1.PersistentVolumeClaimTemplate{ - Spec: v1.PersistentVolumeClaimSpec{ - StorageClassName: &scName, - AccessModes: accessModes, - Resources: v1.ResourceRequirements{ - Requests: v1.ResourceList{ - v1.ResourceStorage: resource.MustParse(claimSize), - }, - }, - }, - }, - ReadOnly: readOnly, - }, - } -} - -// CleanupResource cleans up VolumeResource -func (r *VolumeResource) CleanupResource() error { - f := r.Config.Framework - var cleanUpErrs []error - if r.Pvc != nil || r.Pv != nil { - switch r.Pattern.VolType { - case testpatterns.PreprovisionedPV: - ginkgo.By("Deleting pv and pvc") - if errs := e2epv.PVPVCCleanup(f.ClientSet, f.Namespace.Name, r.Pv, r.Pvc); len(errs) != 0 { - framework.Failf("Failed to delete PVC or PV: %v", utilerrors.NewAggregate(errs)) - } - case testpatterns.DynamicPV: - ginkgo.By("Deleting pvc") - // We only delete the PVC so that PV (and disk) can be cleaned up by dynamic provisioner - if r.Pv != nil && r.Pv.Spec.PersistentVolumeReclaimPolicy != v1.PersistentVolumeReclaimDelete { - framework.Failf("Test framework does not currently support Dynamically Provisioned Persistent Volume %v specified with reclaim policy that isnt %v", - r.Pv.Name, v1.PersistentVolumeReclaimDelete) - } - if r.Pvc != nil { - cs := f.ClientSet - pv := r.Pv - if pv == nil && r.Pvc.Name != "" { - // This happens for late binding. Check whether we have a volume now that we need to wait for. - pvc, err := cs.CoreV1().PersistentVolumeClaims(r.Pvc.Namespace).Get(context.TODO(), r.Pvc.Name, metav1.GetOptions{}) - switch { - case err == nil: - if pvc.Spec.VolumeName != "" { - pv, err = cs.CoreV1().PersistentVolumes().Get(context.TODO(), pvc.Spec.VolumeName, metav1.GetOptions{}) - if err != nil { - cleanUpErrs = append(cleanUpErrs, errors.Wrapf(err, "Failed to find PV %v", pvc.Spec.VolumeName)) - } - } - case apierrors.IsNotFound(err): - // Without the PVC, we cannot locate the corresponding PV. Let's - // hope that it is gone. - default: - cleanUpErrs = append(cleanUpErrs, errors.Wrapf(err, "Failed to find PVC %v", r.Pvc.Name)) - } - } - - err := e2epv.DeletePersistentVolumeClaim(f.ClientSet, r.Pvc.Name, f.Namespace.Name) - if err != nil { - cleanUpErrs = append(cleanUpErrs, errors.Wrapf(err, "Failed to delete PVC %v", r.Pvc.Name)) - } - - if pv != nil { - err = e2epv.WaitForPersistentVolumeDeleted(f.ClientSet, pv.Name, 5*time.Second, 5*time.Minute) - if err != nil { - cleanUpErrs = append(cleanUpErrs, errors.Wrapf(err, - "Persistent Volume %v not deleted by dynamic provisioner", pv.Name)) - } - } - } - default: - framework.Failf("Found PVC (%v) or PV (%v) but not running Preprovisioned or Dynamic test pattern", r.Pvc, r.Pv) - } - } - - if r.Sc != nil { - ginkgo.By("Deleting sc") - if err := deleteStorageClass(f.ClientSet, r.Sc.Name); err != nil { - cleanUpErrs = append(cleanUpErrs, errors.Wrapf(err, "Failed to delete StorageClass %v", r.Sc.Name)) - } - } - - // Cleanup volume for pre-provisioned volume tests - if r.Volume != nil { - if err := tryFunc(r.Volume.DeleteVolume); err != nil { - cleanUpErrs = append(cleanUpErrs, errors.Wrap(err, "Failed to delete Volume")) - } - } - return utilerrors.NewAggregate(cleanUpErrs) -} - -func createPVCPV( - f *framework.Framework, - name string, - pvSource *v1.PersistentVolumeSource, - volumeNodeAffinity *v1.VolumeNodeAffinity, - volMode v1.PersistentVolumeMode, - accessModes []v1.PersistentVolumeAccessMode, -) (*v1.PersistentVolume, *v1.PersistentVolumeClaim) { - pvConfig := e2epv.PersistentVolumeConfig{ - NamePrefix: fmt.Sprintf("%s-", name), - StorageClassName: f.Namespace.Name, - PVSource: *pvSource, - NodeAffinity: volumeNodeAffinity, - AccessModes: accessModes, - } - - pvcConfig := e2epv.PersistentVolumeClaimConfig{ - StorageClassName: &f.Namespace.Name, - AccessModes: accessModes, - } - - if volMode != "" { - pvConfig.VolumeMode = &volMode - pvcConfig.VolumeMode = &volMode - } - - framework.Logf("Creating PVC and PV") - pv, pvc, err := e2epv.CreatePVCPV(f.ClientSet, pvConfig, pvcConfig, f.Namespace.Name, false) - framework.ExpectNoError(err, "PVC, PV creation failed") - - err = e2epv.WaitOnPVandPVC(f.ClientSet, f.Namespace.Name, pv, pvc) - framework.ExpectNoError(err, "PVC, PV failed to bind") - - return pv, pvc -} - -func createPVCPVFromDynamicProvisionSC( - f *framework.Framework, - name string, - claimSize string, - sc *storagev1.StorageClass, - volMode v1.PersistentVolumeMode, - accessModes []v1.PersistentVolumeAccessMode, -) (*v1.PersistentVolume, *v1.PersistentVolumeClaim) { - cs := f.ClientSet - ns := f.Namespace.Name - - ginkgo.By("creating a claim") - pvcCfg := e2epv.PersistentVolumeClaimConfig{ - NamePrefix: name, - ClaimSize: claimSize, - StorageClassName: &(sc.Name), - AccessModes: accessModes, - VolumeMode: &volMode, - } - - pvc := e2epv.MakePersistentVolumeClaim(pvcCfg, ns) - - var err error - pvc, err = e2epv.CreatePVC(cs, ns, pvc) - framework.ExpectNoError(err) - - if !isDelayedBinding(sc) { - err = e2epv.WaitForPersistentVolumeClaimPhase(v1.ClaimBound, cs, pvc.Namespace, pvc.Name, framework.Poll, framework.ClaimProvisionTimeout) - framework.ExpectNoError(err) - } - - pvc, err = cs.CoreV1().PersistentVolumeClaims(pvc.Namespace).Get(context.TODO(), pvc.Name, metav1.GetOptions{}) - framework.ExpectNoError(err) - - var pv *v1.PersistentVolume - if !isDelayedBinding(sc) { - pv, err = cs.CoreV1().PersistentVolumes().Get(context.TODO(), pvc.Spec.VolumeName, metav1.GetOptions{}) - framework.ExpectNoError(err) - } - - return pv, pvc -} - -func isDelayedBinding(sc *storagev1.StorageClass) bool { - if sc.VolumeBindingMode != nil { - return *sc.VolumeBindingMode == storagev1.VolumeBindingWaitForFirstConsumer - } - return false -} - -// deleteStorageClass deletes the passed in StorageClass and catches errors other than "Not Found" -func deleteStorageClass(cs clientset.Interface, className string) error { - err := cs.StorageV1().StorageClasses().Delete(context.TODO(), className, metav1.DeleteOptions{}) - if err != nil && !apierrors.IsNotFound(err) { - return err - } - return nil -} - -// convertTestConfig returns a framework test config with the -// parameters specified for the testsuite or (if available) the -// dynamically created config for the volume server. -// -// This is done because TestConfig is the public API for -// the testsuites package whereas volume.TestConfig is merely -// an implementation detail. It contains fields that have no effect, -// which makes it unsuitable for use in the testsuits public API. -func convertTestConfig(in *PerTestConfig) e2evolume.TestConfig { - if in.ServerConfig != nil { - return *in.ServerConfig - } - - return e2evolume.TestConfig{ - Namespace: in.Framework.Namespace.Name, - Prefix: in.Prefix, - ClientNodeSelection: in.ClientNodeSelection, - } -} - -// getSizeRangesIntersection takes two instances of storage size ranges and determines the -// intersection of the intervals (if it exists) and return the minimum of the intersection -// to be used as the claim size for the test. -// if value not set, that means there's no minimum or maximum size limitation and we set default size for it. -func getSizeRangesIntersection(first e2evolume.SizeRange, second e2evolume.SizeRange) (string, error) { - var firstMin, firstMax, secondMin, secondMax resource.Quantity - var err error - - //if SizeRange is not set, assign a minimum or maximum size - if len(first.Min) == 0 { - first.Min = minValidSize - } - if len(first.Max) == 0 { - first.Max = maxValidSize - } - if len(second.Min) == 0 { - second.Min = minValidSize - } - if len(second.Max) == 0 { - second.Max = maxValidSize - } - - if firstMin, err = resource.ParseQuantity(first.Min); err != nil { - return "", err - } - if firstMax, err = resource.ParseQuantity(first.Max); err != nil { - return "", err - } - if secondMin, err = resource.ParseQuantity(second.Min); err != nil { - return "", err - } - if secondMax, err = resource.ParseQuantity(second.Max); err != nil { - return "", err - } - - interSectionStart := math.Max(float64(firstMin.Value()), float64(secondMin.Value())) - intersectionEnd := math.Min(float64(firstMax.Value()), float64(secondMax.Value())) - - // the minimum of the intersection shall be returned as the claim size - var intersectionMin resource.Quantity - - if intersectionEnd-interSectionStart >= 0 { //have intersection - intersectionMin = *resource.NewQuantity(int64(interSectionStart), "BinarySI") //convert value to BinarySI format. E.g. 5Gi - // return the minimum of the intersection as the claim size - return intersectionMin.String(), nil - } - return "", fmt.Errorf("intersection of size ranges %+v, %+v is null", first, second) -} - -func getSnapshot(claimName string, ns, snapshotClassName string) *unstructured.Unstructured { - snapshot := &unstructured.Unstructured{ - Object: map[string]interface{}{ - "kind": "VolumeSnapshot", - "apiVersion": snapshotAPIVersion, - "metadata": map[string]interface{}{ - "generateName": "snapshot-", - "namespace": ns, - }, - "spec": map[string]interface{}{ - "volumeSnapshotClassName": snapshotClassName, - "source": map[string]interface{}{ - "persistentVolumeClaimName": claimName, - }, - }, - }, - } - - return snapshot -} -func getPreProvisionedSnapshot(snapName, ns, snapshotContentName string) *unstructured.Unstructured { - snapshot := &unstructured.Unstructured{ - Object: map[string]interface{}{ - "kind": "VolumeSnapshot", - "apiVersion": snapshotAPIVersion, - "metadata": map[string]interface{}{ - "name": snapName, - "namespace": ns, - }, - "spec": map[string]interface{}{ - "source": map[string]interface{}{ - "volumeSnapshotContentName": snapshotContentName, - }, - }, - }, - } - - return snapshot -} -func getPreProvisionedSnapshotContent(snapcontentName, snapshotName, snapshotNamespace, snapshotHandle, deletionPolicy, csiDriverName string) *unstructured.Unstructured { - snapshotContent := &unstructured.Unstructured{ - Object: map[string]interface{}{ - "kind": "VolumeSnapshotContent", - "apiVersion": snapshotAPIVersion, - "metadata": map[string]interface{}{ - "name": snapcontentName, - }, - "spec": map[string]interface{}{ - "source": map[string]interface{}{ - "snapshotHandle": snapshotHandle, - }, - "volumeSnapshotRef": map[string]interface{}{ - "name": snapshotName, - "namespace": snapshotNamespace, - }, - "driver": csiDriverName, - "deletionPolicy": deletionPolicy, - }, - }, - } - - return snapshotContent -} - -func getPreProvisionedSnapshotContentName(uuid types.UID) string { - return fmt.Sprintf("pre-provisioned-snapcontent-%s", string(uuid)) -} - -func getPreProvisionedSnapshotName(uuid types.UID) string { - return fmt.Sprintf("pre-provisioned-snapshot-%s", string(uuid)) -} - -// StartPodLogs begins capturing log output and events from current -// and future pods running in the namespace of the framework. That -// ends when the returned cleanup function is called. -// -// The output goes to log files (when using --report-dir, as in the -// CI) or the output stream (otherwise). -func StartPodLogs(f *framework.Framework, driverNamespace *v1.Namespace) func() { - ctx, cancel := context.WithCancel(context.Background()) - cs := f.ClientSet - - ns := driverNamespace.Name - - to := podlogs.LogOutput{ - StatusWriter: ginkgo.GinkgoWriter, - } - if framework.TestContext.ReportDir == "" { - to.LogWriter = ginkgo.GinkgoWriter - } else { - test := ginkgo.CurrentGinkgoTestDescription() - // Clean up each individual component text such that - // it contains only characters that are valid as file - // name. - reg := regexp.MustCompile("[^a-zA-Z0-9_-]+") - var components []string - for _, component := range test.ComponentTexts { - components = append(components, reg.ReplaceAllString(component, "_")) - } - // We end the prefix with a slash to ensure that all logs - // end up in a directory named after the current test. - // - // Each component name maps to a directory. This - // avoids cluttering the root artifact directory and - // keeps each directory name smaller (the full test - // name at one point exceeded 256 characters, which was - // too much for some filesystems). - to.LogPathPrefix = framework.TestContext.ReportDir + "/" + - strings.Join(components, "/") + "/" - } - podlogs.CopyAllLogs(ctx, cs, ns, to) - - // pod events are something that the framework already collects itself - // after a failed test. Logging them live is only useful for interactive - // debugging, not when we collect reports. - if framework.TestContext.ReportDir == "" { - podlogs.WatchPods(ctx, cs, ns, ginkgo.GinkgoWriter) - } - - return cancel -} - func getVolumeOpsFromMetricsForPlugin(ms testutil.Metrics, pluginName string) opCounts { totOps := opCounts{} @@ -827,23 +227,9 @@ func (moc *migrationOpCheck) validateMigrationVolumeOpCounts() { } // Skip skipVolTypes patterns if the driver supports dynamic provisioning -func skipVolTypePatterns(pattern testpatterns.TestPattern, driver TestDriver, skipVolTypes map[testpatterns.TestVolType]bool) { - _, supportsProvisioning := driver.(DynamicPVTestDriver) +func skipVolTypePatterns(pattern storageframework.TestPattern, driver storageframework.TestDriver, skipVolTypes map[storageframework.TestVolType]bool) { + _, supportsProvisioning := driver.(storageframework.DynamicPVTestDriver) if supportsProvisioning && skipVolTypes[pattern.VolType] { e2eskipper.Skipf("Driver supports dynamic provisioning, skipping %s pattern", pattern.VolType) } } - -func tryFunc(f func()) error { - var err error - if f == nil { - return nil - } - defer func() { - if recoverError := recover(); recoverError != nil { - err = fmt.Errorf("%v", recoverError) - } - }() - f() - return err -} diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/capacity.go b/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/capacity.go new file mode 100644 index 000000000000..ac223be8e597 --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/capacity.go @@ -0,0 +1,384 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package testsuites + +import ( + "context" + "fmt" + "strings" + "time" + + "github.com/onsi/ginkgo" + "github.com/onsi/gomega" + "github.com/onsi/gomega/types" + + storagev1 "k8s.io/api/storage/v1" + storagev1beta1 "k8s.io/api/storage/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/kubernetes" + "k8s.io/kubernetes/test/e2e/framework" + e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" + e2evolume "k8s.io/kubernetes/test/e2e/framework/volume" + storageframework "k8s.io/kubernetes/test/e2e/storage/framework" + storageutils "k8s.io/kubernetes/test/e2e/storage/utils" +) + +type capacityTestSuite struct { + tsInfo storageframework.TestSuiteInfo +} + +// InitCustomCapacityTestSuite returns capacityTestSuite that implements TestSuite interface +// using custom test patterns +func InitCustomCapacityTestSuite(patterns []storageframework.TestPattern) storageframework.TestSuite { + return &capacityTestSuite{ + tsInfo: storageframework.TestSuiteInfo{ + Name: "capacity", + TestPatterns: patterns, + SupportedSizeRange: e2evolume.SizeRange{ + Min: "1Mi", + }, + }, + } +} + +// InitCapacityTestSuite returns capacityTestSuite that implements TestSuite interface\ +// using test suite default patterns +func InitCapacityTestSuite() storageframework.TestSuite { + patterns := []storageframework.TestPattern{ + storageframework.DefaultFsDynamicPV, + } + return InitCustomCapacityTestSuite(patterns) +} + +func (p *capacityTestSuite) GetTestSuiteInfo() storageframework.TestSuiteInfo { + return p.tsInfo +} + +func (p *capacityTestSuite) SkipUnsupportedTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) { + // Check preconditions. + if pattern.VolType != storageframework.DynamicPV { + e2eskipper.Skipf("Suite %q does not support %v", p.tsInfo.Name, pattern.VolType) + } + dInfo := driver.GetDriverInfo() + if !dInfo.Capabilities[storageframework.CapCapacity] { + e2eskipper.Skipf("Driver %s doesn't publish storage capacity -- skipping", dInfo.Name) + } +} + +func (p *capacityTestSuite) DefineTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) { + var ( + dInfo = driver.GetDriverInfo() + dDriver storageframework.DynamicPVTestDriver + driverCleanup func() + sc *storagev1.StorageClass + ) + + // Beware that it also registers an AfterEach which renders f unusable. Any code using + // f must run inside an It or Context callback. + f := framework.NewFrameworkWithCustomTimeouts("capacity", storageframework.GetDriverTimeouts(driver)) + + init := func() { + dDriver, _ = driver.(storageframework.DynamicPVTestDriver) + // Now do the more expensive test initialization. + config, cleanup := driver.PrepareTest(f) + driverCleanup = cleanup + sc = dDriver.GetDynamicProvisionStorageClass(config, pattern.FsType) + if sc == nil { + e2eskipper.Skipf("Driver %q does not define Dynamic Provision StorageClass - skipping", dInfo.Name) + } + } + + cleanup := func() { + err := storageutils.TryFunc(driverCleanup) + driverCleanup = nil + framework.ExpectNoError(err, "while cleaning up driver") + } + + ginkgo.It("provides storage capacity information", func() { + init() + defer cleanup() + + timeout := time.Minute + pollInterval := time.Second + matchSC := HaveCapacitiesForClass(sc.Name) + listAll := gomega.Eventually(func() (*storagev1beta1.CSIStorageCapacityList, error) { + return f.ClientSet.StorageV1beta1().CSIStorageCapacities("").List(context.Background(), metav1.ListOptions{}) + }, timeout, pollInterval) + + // If we have further information about what storage + // capacity information to expect from the driver, + // then we can make the check more specific. The baseline + // is that it provides some arbitrary capacity for the + // storage class. + matcher := matchSC + if len(dInfo.TopologyKeys) == 1 { + // We can construct topology segments by + // collecting all values for this one key and + // then expect one CSIStorageCapacity object + // per value for the storage class. + // + // Local storage on a node will be covered by + // this checking. A more complex approach for + // drivers with multiple keys might be + // possible, too, but is not currently + // implemented. + matcher = HaveCapacitiesForClassAndNodes(f.ClientSet, sc.Provisioner, sc.Name, dInfo.TopologyKeys[0]) + } + + // Create storage class and wait for capacity information. + _, clearProvisionedStorageClass := SetupStorageClass(f.ClientSet, sc) + defer clearProvisionedStorageClass() + listAll.Should(MatchCapacities(matcher), "after creating storage class") + + // Delete storage class again and wait for removal of storage capacity information. + clearProvisionedStorageClass() + listAll.ShouldNot(MatchCapacities(matchSC), "after deleting storage class") + }) +} + +func formatCapacities(capacities []storagev1beta1.CSIStorageCapacity) []string { + lines := []string{} + for _, capacity := range capacities { + lines = append(lines, fmt.Sprintf(" %+v", capacity)) + } + return lines +} + +// MatchCapacities runs some kind of check against *storagev1beta1.CSIStorageCapacityList. +// In case of failure, all actual objects are appended to the failure message. +func MatchCapacities(match types.GomegaMatcher) types.GomegaMatcher { + return matchCSIStorageCapacities{match: match} +} + +type matchCSIStorageCapacities struct { + match types.GomegaMatcher +} + +var _ types.GomegaMatcher = matchCSIStorageCapacities{} + +func (m matchCSIStorageCapacities) Match(actual interface{}) (success bool, err error) { + return m.match.Match(actual) +} + +func (m matchCSIStorageCapacities) FailureMessage(actual interface{}) (message string) { + return m.match.FailureMessage(actual) + m.dump(actual) +} + +func (m matchCSIStorageCapacities) NegatedFailureMessage(actual interface{}) (message string) { + return m.match.NegatedFailureMessage(actual) + m.dump(actual) +} + +func (m matchCSIStorageCapacities) dump(actual interface{}) string { + capacities, ok := actual.(*storagev1beta1.CSIStorageCapacityList) + if !ok || capacities == nil { + return "" + } + lines := []string{"\n\nall CSIStorageCapacity objects:"} + for _, capacity := range capacities.Items { + lines = append(lines, fmt.Sprintf("%+v", capacity)) + } + return strings.Join(lines, "\n") +} + +// CapacityMatcher can be used to compose different matchers where one +// adds additional checks for CSIStorageCapacity objects already checked +// by another. +type CapacityMatcher interface { + types.GomegaMatcher + // MatchedCapacities returns all CSICapacityObjects which were + // found during the preceding Match call. + MatchedCapacities() []storagev1beta1.CSIStorageCapacity +} + +// HaveCapacitiesForClass filters all storage capacity objects in a *storagev1beta1.CSIStorageCapacityList +// by storage class. Success is when when there is at least one. +func HaveCapacitiesForClass(scName string) CapacityMatcher { + return &haveCSIStorageCapacities{scName: scName} +} + +type haveCSIStorageCapacities struct { + scName string + matchingCapacities []storagev1beta1.CSIStorageCapacity +} + +var _ CapacityMatcher = &haveCSIStorageCapacities{} + +func (h *haveCSIStorageCapacities) Match(actual interface{}) (success bool, err error) { + capacities, ok := actual.(*storagev1beta1.CSIStorageCapacityList) + if !ok { + return false, fmt.Errorf("expected *storagev1beta1.CSIStorageCapacityList, got: %T", actual) + } + h.matchingCapacities = nil + for _, capacity := range capacities.Items { + if capacity.StorageClassName == h.scName { + h.matchingCapacities = append(h.matchingCapacities, capacity) + } + } + return len(h.matchingCapacities) > 0, nil +} + +func (h *haveCSIStorageCapacities) MatchedCapacities() []storagev1beta1.CSIStorageCapacity { + return h.matchingCapacities +} + +func (h *haveCSIStorageCapacities) FailureMessage(actual interface{}) (message string) { + return fmt.Sprintf("no CSIStorageCapacity objects for storage class %q", h.scName) +} + +func (h *haveCSIStorageCapacities) NegatedFailureMessage(actual interface{}) (message string) { + return fmt.Sprintf("CSIStorageCapacity objects for storage class %q:\n%s", + h.scName, + strings.Join(formatCapacities(h.matchingCapacities), "\n"), + ) +} + +// HaveCapacitiesForClassAndNodes matches objects by storage class name. It finds +// all nodes on which the driver runs and expects one object per node. +func HaveCapacitiesForClassAndNodes(client kubernetes.Interface, driverName, scName, topologyKey string) CapacityMatcher { + return &haveLocalStorageCapacities{ + client: client, + driverName: driverName, + match: HaveCapacitiesForClass(scName), + topologyKey: topologyKey, + } +} + +type haveLocalStorageCapacities struct { + client kubernetes.Interface + driverName string + match CapacityMatcher + topologyKey string + + matchSuccess bool + expectedCapacities []storagev1beta1.CSIStorageCapacity + unexpectedCapacities []storagev1beta1.CSIStorageCapacity + missingTopologyValues []string +} + +var _ CapacityMatcher = &haveLocalStorageCapacities{} + +func (h *haveLocalStorageCapacities) Match(actual interface{}) (success bool, err error) { + h.expectedCapacities = nil + h.unexpectedCapacities = nil + h.missingTopologyValues = nil + + // First check with underlying matcher. + success, err = h.match.Match(actual) + h.matchSuccess = success + if !success || err != nil { + return + } + + // Find all nodes on which the driver runs. + csiNodes, err := h.client.StorageV1().CSINodes().List(context.Background(), metav1.ListOptions{}) + if err != nil { + return false, err + } + topologyValues := map[string]bool{} + for _, csiNode := range csiNodes.Items { + for _, driver := range csiNode.Spec.Drivers { + if driver.Name != h.driverName { + continue + } + node, err := h.client.CoreV1().Nodes().Get(context.Background(), csiNode.Name, metav1.GetOptions{}) + if err != nil { + return false, err + } + value, ok := node.Labels[h.topologyKey] + if !ok || value == "" { + return false, fmt.Errorf("driver %q should run on node %q, but its topology label %q was not set", + h.driverName, + node.Name, + h.topologyKey) + } + topologyValues[value] = true + break + } + } + if len(topologyValues) == 0 { + return false, fmt.Errorf("driver %q not running on any node", h.driverName) + } + + // Now check that for each topology value there is exactly one CSIStorageCapacity object. + remainingTopologyValues := map[string]bool{} + for value := range topologyValues { + remainingTopologyValues[value] = true + } + capacities := h.match.MatchedCapacities() + for _, capacity := range capacities { + if capacity.NodeTopology == nil || + len(capacity.NodeTopology.MatchExpressions) > 0 || + len(capacity.NodeTopology.MatchLabels) != 1 || + !remainingTopologyValues[capacity.NodeTopology.MatchLabels[h.topologyKey]] { + h.unexpectedCapacities = append(h.unexpectedCapacities, capacity) + continue + } + remainingTopologyValues[capacity.NodeTopology.MatchLabels[h.topologyKey]] = false + h.expectedCapacities = append(h.expectedCapacities, capacity) + } + + // Success is when there were no unexpected capacities and enough expected ones. + for value, remaining := range remainingTopologyValues { + if remaining { + h.missingTopologyValues = append(h.missingTopologyValues, value) + } + } + return len(h.unexpectedCapacities) == 0 && len(h.missingTopologyValues) == 0, nil +} + +func (h *haveLocalStorageCapacities) MatchedCapacities() []storagev1beta1.CSIStorageCapacity { + return h.match.MatchedCapacities() +} + +func (h *haveLocalStorageCapacities) FailureMessage(actual interface{}) (message string) { + if !h.matchSuccess { + return h.match.FailureMessage(actual) + } + var lines []string + if len(h.unexpectedCapacities) != 0 { + lines = append(lines, "unexpected CSIStorageCapacity objects:") + lines = append(lines, formatCapacities(h.unexpectedCapacities)...) + } + if len(h.missingTopologyValues) != 0 { + lines = append(lines, fmt.Sprintf("no CSIStorageCapacity objects with topology key %q and values %v", + h.topologyKey, h.missingTopologyValues, + )) + } + return strings.Join(lines, "\n") +} + +func (h *haveLocalStorageCapacities) NegatedFailureMessage(actual interface{}) (message string) { + if h.matchSuccess { + return h.match.NegatedFailureMessage(actual) + } + // It's not entirely clear whether negating this check is useful. Just dump all info that we have. + var lines []string + if len(h.expectedCapacities) != 0 { + lines = append(lines, "expected CSIStorageCapacity objects:") + lines = append(lines, formatCapacities(h.expectedCapacities)...) + } + if len(h.unexpectedCapacities) != 0 { + lines = append(lines, "unexpected CSIStorageCapacity objects:") + lines = append(lines, formatCapacities(h.unexpectedCapacities)...) + } + if len(h.missingTopologyValues) != 0 { + lines = append(lines, fmt.Sprintf("no CSIStorageCapacity objects with topology key %q and values %v", + h.topologyKey, h.missingTopologyValues, + )) + } + return strings.Join(lines, "\n") +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/disruptive.go b/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/disruptive.go index 6350752ea9d5..5f167cbe2efa 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/disruptive.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/disruptive.go @@ -26,63 +26,69 @@ import ( e2epod "k8s.io/kubernetes/test/e2e/framework/pod" e2epv "k8s.io/kubernetes/test/e2e/framework/pv" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" - e2evolume "k8s.io/kubernetes/test/e2e/framework/volume" - "k8s.io/kubernetes/test/e2e/storage/testpatterns" + storageframework "k8s.io/kubernetes/test/e2e/storage/framework" "k8s.io/kubernetes/test/e2e/storage/utils" + storageutils "k8s.io/kubernetes/test/e2e/storage/utils" ) type disruptiveTestSuite struct { - tsInfo TestSuiteInfo + tsInfo storageframework.TestSuiteInfo } -var _ TestSuite = &disruptiveTestSuite{} - -// InitDisruptiveTestSuite returns subPathTestSuite that implements TestSuite interface -func InitDisruptiveTestSuite() TestSuite { +// InitCustomDisruptiveTestSuite returns subPathTestSuite that implements TestSuite interface +// using custom test patterns +func InitCustomDisruptiveTestSuite(patterns []storageframework.TestPattern) storageframework.TestSuite { return &disruptiveTestSuite{ - tsInfo: TestSuiteInfo{ - Name: "disruptive", - FeatureTag: "[Disruptive][LinuxOnly]", - TestPatterns: []testpatterns.TestPattern{ - // FSVolMode is already covered in subpath testsuite - testpatterns.DefaultFsInlineVolume, - testpatterns.FsVolModePreprovisionedPV, - testpatterns.FsVolModeDynamicPV, - testpatterns.BlockVolModePreprovisionedPV, - testpatterns.BlockVolModeDynamicPV, - }, + tsInfo: storageframework.TestSuiteInfo{ + Name: "disruptive", + FeatureTag: "[Disruptive][LinuxOnly]", + TestPatterns: patterns, }, } } -func (s *disruptiveTestSuite) GetTestSuiteInfo() TestSuiteInfo { + +// InitDisruptiveTestSuite returns subPathTestSuite that implements TestSuite interface +// using test suite default patterns +func InitDisruptiveTestSuite() storageframework.TestSuite { + testPatterns := []storageframework.TestPattern{ + // FSVolMode is already covered in subpath testsuite + storageframework.DefaultFsInlineVolume, + storageframework.FsVolModePreprovisionedPV, + storageframework.FsVolModeDynamicPV, + storageframework.BlockVolModePreprovisionedPV, + storageframework.BlockVolModeDynamicPV, + } + return InitCustomDisruptiveTestSuite(testPatterns) +} + +func (s *disruptiveTestSuite) GetTestSuiteInfo() storageframework.TestSuiteInfo { return s.tsInfo } -func (s *disruptiveTestSuite) SkipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) { - skipVolTypePatterns(pattern, driver, testpatterns.NewVolTypeMap(testpatterns.PreprovisionedPV)) +func (s *disruptiveTestSuite) SkipUnsupportedTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) { + skipVolTypePatterns(pattern, driver, storageframework.NewVolTypeMap(storageframework.PreprovisionedPV)) + if pattern.VolMode == v1.PersistentVolumeBlock && !driver.GetDriverInfo().Capabilities[storageframework.CapBlock] { + e2eskipper.Skipf("Driver %s doesn't support %v -- skipping", driver.GetDriverInfo().Name, pattern.VolMode) + } } -func (s *disruptiveTestSuite) DefineTests(driver TestDriver, pattern testpatterns.TestPattern) { +func (s *disruptiveTestSuite) DefineTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) { type local struct { - config *PerTestConfig + config *storageframework.PerTestConfig driverCleanup func() cs clientset.Interface ns *v1.Namespace // VolumeResource contains pv, pvc, sc, etc., owns cleaning that up - resource *VolumeResource + resource *storageframework.VolumeResource pod *v1.Pod } var l local - // No preconditions to test. Normally they would be in a BeforeEach here. - - // This intentionally comes after checking the preconditions because it - // registers its own BeforeEach which creates the namespace. Beware that it - // also registers an AfterEach which renders f unusable. Any code using + // Beware that it also registers an AfterEach which renders f unusable. Any code using // f must run inside an It or Context callback. - f := framework.NewDefaultFramework("disruptive") + f := framework.NewFrameworkWithCustomTimeouts("disruptive", storageframework.GetDriverTimeouts(driver)) init := func() { l = local{} @@ -92,12 +98,8 @@ func (s *disruptiveTestSuite) DefineTests(driver TestDriver, pattern testpattern // Now do the more expensive test initialization. l.config, l.driverCleanup = driver.PrepareTest(f) - if pattern.VolMode == v1.PersistentVolumeBlock && !driver.GetDriverInfo().Capabilities[CapBlock] { - e2eskipper.Skipf("Driver %s doesn't support %v -- skipping", driver.GetDriverInfo().Name, pattern.VolMode) - } - testVolumeSizeRange := s.GetTestSuiteInfo().SupportedSizeRange - l.resource = CreateVolumeResource(driver, l.config, pattern, testVolumeSizeRange) + l.resource = storageframework.CreateVolumeResource(driver, l.config, pattern, testVolumeSizeRange) } cleanup := func() { @@ -115,7 +117,7 @@ func (s *disruptiveTestSuite) DefineTests(driver TestDriver, pattern testpattern l.resource = nil } - errs = append(errs, tryFunc(l.driverCleanup)) + errs = append(errs, storageutils.TryFunc(l.driverCleanup)) l.driverCleanup = nil framework.ExpectNoError(errors.NewAggregate(errs), "while cleaning up resource") } @@ -155,7 +157,7 @@ func (s *disruptiveTestSuite) DefineTests(driver TestDriver, pattern testpattern var err error var pvcs []*v1.PersistentVolumeClaim var inlineSources []*v1.VolumeSource - if pattern.VolType == testpatterns.InlineVolume { + if pattern.VolType == storageframework.InlineVolume { inlineSources = append(inlineSources, l.resource.VolSource) } else { pvcs = append(pvcs, l.resource.Pvc) @@ -167,9 +169,9 @@ func (s *disruptiveTestSuite) DefineTests(driver TestDriver, pattern testpattern InlineVolumeSources: inlineSources, SeLinuxLabel: e2epv.SELinuxLabel, NodeSelection: l.config.ClientNodeSelection, - ImageID: e2evolume.GetDefaultTestImageID(), + ImageID: e2epod.GetDefaultTestImageID(), } - l.pod, err = e2epod.CreateSecPodWithNodeSelection(l.cs, &podConfig, framework.PodStartTimeout) + l.pod, err = e2epod.CreateSecPodWithNodeSelection(l.cs, &podConfig, f.Timeouts.PodStart) framework.ExpectNoError(err, "While creating pods for kubelet restart test") if pattern.VolMode == v1.PersistentVolumeBlock && t.runTestBlock != nil { diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/driveroperations.go b/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/driveroperations.go deleted file mode 100644 index e2d41966fafa..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/driveroperations.go +++ /dev/null @@ -1,109 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package testsuites - -import ( - "fmt" - - storagev1 "k8s.io/api/storage/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apiserver/pkg/storage/names" - "k8s.io/kubernetes/test/e2e/framework" - "k8s.io/kubernetes/test/e2e/storage/testpatterns" -) - -// GetDriverNameWithFeatureTags returns driver name with feature tags -// For example) -// - [Driver: nfs] -// - [Driver: rbd][Feature:Volumes] -func GetDriverNameWithFeatureTags(driver TestDriver) string { - dInfo := driver.GetDriverInfo() - - return fmt.Sprintf("[Driver: %s]%s", dInfo.Name, dInfo.FeatureTag) -} - -// CreateVolume creates volume for test unless dynamicPV or CSI ephemeral inline volume test -func CreateVolume(driver TestDriver, config *PerTestConfig, volType testpatterns.TestVolType) TestVolume { - switch volType { - case testpatterns.InlineVolume, testpatterns.PreprovisionedPV: - if pDriver, ok := driver.(PreprovisionedVolumeTestDriver); ok { - return pDriver.CreateVolume(config, volType) - } - case testpatterns.CSIInlineVolume, - testpatterns.GenericEphemeralVolume, - testpatterns.DynamicPV: - // No need to create volume - default: - framework.Failf("Invalid volType specified: %v", volType) - } - return nil -} - -// GetStorageClass constructs a new StorageClass instance -// with a unique name that is based on namespace + suffix. -func GetStorageClass( - provisioner string, - parameters map[string]string, - bindingMode *storagev1.VolumeBindingMode, - ns string, - suffix string, -) *storagev1.StorageClass { - if bindingMode == nil { - defaultBindingMode := storagev1.VolumeBindingImmediate - bindingMode = &defaultBindingMode - } - return &storagev1.StorageClass{ - TypeMeta: metav1.TypeMeta{ - Kind: "StorageClass", - }, - ObjectMeta: metav1.ObjectMeta{ - // Name must be unique, so let's base it on namespace name and use GenerateName - // TODO(#96234): Remove unnecessary suffix. - Name: names.SimpleNameGenerator.GenerateName(ns + "-" + suffix), - }, - Provisioner: provisioner, - Parameters: parameters, - VolumeBindingMode: bindingMode, - } -} - -// GetSnapshotClass constructs a new SnapshotClass instance -// with a unique name that is based on namespace + suffix. -func GetSnapshotClass( - snapshotter string, - parameters map[string]string, - ns string, - suffix string, -) *unstructured.Unstructured { - snapshotClass := &unstructured.Unstructured{ - Object: map[string]interface{}{ - "kind": "VolumeSnapshotClass", - "apiVersion": snapshotAPIVersion, - "metadata": map[string]interface{}{ - // Name must be unique, so let's base it on namespace name and use GenerateName - // TODO(#96234): Remove unnecessary suffix. - "name": names.SimpleNameGenerator.GenerateName(ns + "-" + suffix), - }, - "driver": snapshotter, - "parameters": parameters, - "deletionPolicy": "Delete", - }, - } - - return snapshotClass -} diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/ephemeral.go b/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/ephemeral.go index cfa45ce81ccf..571210345012 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/ephemeral.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/ephemeral.go @@ -34,83 +34,75 @@ import ( e2epod "k8s.io/kubernetes/test/e2e/framework/pod" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" e2evolume "k8s.io/kubernetes/test/e2e/framework/volume" - "k8s.io/kubernetes/test/e2e/storage/testpatterns" + storageframework "k8s.io/kubernetes/test/e2e/storage/framework" storageutils "k8s.io/kubernetes/test/e2e/storage/utils" ) type ephemeralTestSuite struct { - tsInfo TestSuiteInfo + tsInfo storageframework.TestSuiteInfo } -var _ TestSuite = &ephemeralTestSuite{} +// InitCustomEphemeralTestSuite returns ephemeralTestSuite that implements TestSuite interface +// using custom test patterns +func InitCustomEphemeralTestSuite(patterns []storageframework.TestPattern) storageframework.TestSuite { + return &ephemeralTestSuite{ + tsInfo: storageframework.TestSuiteInfo{ + Name: "ephemeral", + TestPatterns: patterns, + }, + } +} // InitEphemeralTestSuite returns ephemeralTestSuite that implements TestSuite interface -func InitEphemeralTestSuite() TestSuite { - genericLateBinding := testpatterns.DefaultFsGenericEphemeralVolume +// using test suite default patterns +func InitEphemeralTestSuite() storageframework.TestSuite { + genericLateBinding := storageframework.DefaultFsGenericEphemeralVolume genericLateBinding.Name += " (late-binding)" genericLateBinding.BindingMode = storagev1.VolumeBindingWaitForFirstConsumer - genericImmediateBinding := testpatterns.DefaultFsGenericEphemeralVolume + genericImmediateBinding := storageframework.DefaultFsGenericEphemeralVolume genericImmediateBinding.Name += " (immediate-binding)" genericImmediateBinding.BindingMode = storagev1.VolumeBindingImmediate - patterns := []testpatterns.TestPattern{ - testpatterns.DefaultFsCSIEphemeralVolume, + patterns := []storageframework.TestPattern{ + storageframework.DefaultFsCSIEphemeralVolume, genericLateBinding, genericImmediateBinding, } - return &ephemeralTestSuite{ - tsInfo: TestSuiteInfo{ - Name: "ephemeral", - TestPatterns: patterns, - }, - } + return InitCustomEphemeralTestSuite(patterns) } -func (p *ephemeralTestSuite) GetTestSuiteInfo() TestSuiteInfo { +func (p *ephemeralTestSuite) GetTestSuiteInfo() storageframework.TestSuiteInfo { return p.tsInfo } -func (p *ephemeralTestSuite) SkipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) { +func (p *ephemeralTestSuite) SkipUnsupportedTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) { } -func (p *ephemeralTestSuite) DefineTests(driver TestDriver, pattern testpatterns.TestPattern) { +func (p *ephemeralTestSuite) DefineTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) { type local struct { - config *PerTestConfig + config *storageframework.PerTestConfig driverCleanup func() testCase *EphemeralTest - resource *VolumeResource + resource *storageframework.VolumeResource } var ( - dInfo = driver.GetDriverInfo() - eDriver EphemeralTestDriver + eDriver storageframework.EphemeralTestDriver l local ) - ginkgo.BeforeEach(func() { - ok := false - switch pattern.VolType { - case testpatterns.CSIInlineVolume: - eDriver, ok = driver.(EphemeralTestDriver) - case testpatterns.GenericEphemeralVolume: - _, ok = driver.(DynamicPVTestDriver) - } - if !ok { - e2eskipper.Skipf("Driver %s doesn't support %q volumes -- skipping", dInfo.Name, pattern.VolType) - } - }) - - // This intentionally comes after checking the preconditions because it - // registers its own BeforeEach which creates the namespace. Beware that it - // also registers an AfterEach which renders f unusable. Any code using + // Beware that it also registers an AfterEach which renders f unusable. Any code using // f must run inside an It or Context callback. - f := framework.NewDefaultFramework("ephemeral") + f := framework.NewFrameworkWithCustomTimeouts("ephemeral", storageframework.GetDriverTimeouts(driver)) init := func() { - if pattern.VolType == testpatterns.GenericEphemeralVolume { - enabled, err := GenericEphemeralVolumesEnabled(f.ClientSet, f.Namespace.Name) + if pattern.VolType == storageframework.CSIInlineVolume { + eDriver, _ = driver.(storageframework.EphemeralTestDriver) + } + if pattern.VolType == storageframework.GenericEphemeralVolume { + enabled, err := GenericEphemeralVolumesEnabled(f.ClientSet, f.Timeouts, f.Namespace.Name) framework.ExpectNoError(err, "check GenericEphemeralVolume feature") if !enabled { e2eskipper.Skipf("Cluster doesn't support %q volumes -- skipping", pattern.VolType) @@ -121,12 +113,13 @@ func (p *ephemeralTestSuite) DefineTests(driver TestDriver, pattern testpatterns // Now do the more expensive test initialization. l.config, l.driverCleanup = driver.PrepareTest(f) - l.resource = CreateVolumeResource(driver, l.config, pattern, e2evolume.SizeRange{}) + l.resource = storageframework.CreateVolumeResource(driver, l.config, pattern, e2evolume.SizeRange{}) switch pattern.VolType { - case testpatterns.CSIInlineVolume: + case storageframework.CSIInlineVolume: l.testCase = &EphemeralTest{ Client: l.config.Framework.ClientSet, + Timeouts: f.Timeouts, Namespace: f.Namespace.Name, DriverName: eDriver.GetCSIDriverName(l.config), Node: l.config.ClientNodeSelection, @@ -134,9 +127,10 @@ func (p *ephemeralTestSuite) DefineTests(driver TestDriver, pattern testpatterns return eDriver.GetVolume(l.config, volumeNumber) }, } - case testpatterns.GenericEphemeralVolume: + case storageframework.GenericEphemeralVolume: l.testCase = &EphemeralTest{ Client: l.config.Framework.ClientSet, + Timeouts: f.Timeouts, Namespace: f.Namespace.Name, Node: l.config.ClientNodeSelection, VolSource: l.resource.VolSource, @@ -147,7 +141,7 @@ func (p *ephemeralTestSuite) DefineTests(driver TestDriver, pattern testpatterns cleanup := func() { var cleanUpErrs []error cleanUpErrs = append(cleanUpErrs, l.resource.CleanupResource()) - cleanUpErrs = append(cleanUpErrs, tryFunc(l.driverCleanup)) + cleanUpErrs = append(cleanUpErrs, storageutils.TryFunc(l.driverCleanup)) err := utilerrors.NewAggregate(cleanUpErrs) framework.ExpectNoError(err, "while cleaning up") } @@ -158,7 +152,7 @@ func (p *ephemeralTestSuite) DefineTests(driver TestDriver, pattern testpatterns l.testCase.ReadOnly = true l.testCase.RunningPodCheck = func(pod *v1.Pod) interface{} { - storageutils.VerifyExecInPodSucceed(f, pod, "mount | grep /mnt/test | grep ro,") + e2evolume.VerifyExecInPodSucceed(f, pod, "mount | grep /mnt/test | grep ro,") return nil } l.testCase.TestEphemeral() @@ -170,7 +164,7 @@ func (p *ephemeralTestSuite) DefineTests(driver TestDriver, pattern testpatterns l.testCase.ReadOnly = false l.testCase.RunningPodCheck = func(pod *v1.Pod) interface{} { - storageutils.VerifyExecInPodSucceed(f, pod, "mount | grep /mnt/test | grep rw,") + e2evolume.VerifyExecInPodSucceed(f, pod, "mount | grep /mnt/test | grep rw,") return nil } l.testCase.TestEphemeral() @@ -194,7 +188,7 @@ func (p *ephemeralTestSuite) DefineTests(driver TestDriver, pattern testpatterns []v1.VolumeSource{pod.Spec.Volumes[0].VolumeSource}, readOnly, l.testCase.Node) - framework.ExpectNoError(e2epod.WaitForPodRunningInNamespaceSlow(f.ClientSet, pod2.Name, pod2.Namespace), "waiting for second pod with inline volume") + framework.ExpectNoError(e2epod.WaitTimeoutForPodRunningInNamespace(f.ClientSet, pod2.Name, pod2.Namespace, f.Timeouts.PodStartSlow), "waiting for second pod with inline volume") // If (and only if) we were able to mount // read/write and volume data is not shared @@ -203,11 +197,11 @@ func (p *ephemeralTestSuite) DefineTests(driver TestDriver, pattern testpatterns // visible in the other. if !readOnly && !shared { ginkgo.By("writing data in one pod and checking for it in the second") - storageutils.VerifyExecInPodSucceed(f, pod, "touch /mnt/test-0/hello-world") - storageutils.VerifyExecInPodSucceed(f, pod2, "[ ! -f /mnt/test-0/hello-world ]") + e2evolume.VerifyExecInPodSucceed(f, pod, "touch /mnt/test-0/hello-world") + e2evolume.VerifyExecInPodSucceed(f, pod2, "[ ! -f /mnt/test-0/hello-world ]") } - defer StopPodAndDependents(f.ClientSet, pod2) + defer StopPodAndDependents(f.ClientSet, f.Timeouts, pod2) return nil } @@ -216,7 +210,7 @@ func (p *ephemeralTestSuite) DefineTests(driver TestDriver, pattern testpatterns ginkgo.It("should support multiple inline ephemeral volumes", func() { if pattern.BindingMode == storagev1.VolumeBindingImmediate && - pattern.VolType == testpatterns.GenericEphemeralVolume { + pattern.VolType == storageframework.GenericEphemeralVolume { e2eskipper.Skipf("Multiple generic ephemeral volumes with immediate binding may cause pod startup failures when the volumes get created in separate topology segments.") } @@ -232,6 +226,7 @@ func (p *ephemeralTestSuite) DefineTests(driver TestDriver, pattern testpatterns // Not all parameters are used by all tests. type EphemeralTest struct { Client clientset.Interface + Timeouts *framework.TimeoutContext Namespace string DriverName string VolSource *v1.VolumeSource @@ -307,9 +302,9 @@ func (t EphemeralTest) TestEphemeral() { pod := StartInPodWithInlineVolume(client, t.Namespace, "inline-volume-tester", command, volumes, t.ReadOnly, t.Node) defer func() { // pod might be nil now. - StopPodAndDependents(client, pod) + StopPodAndDependents(client, t.Timeouts, pod) }() - framework.ExpectNoError(e2epod.WaitForPodRunningInNamespaceSlow(client, pod.Name, pod.Namespace), "waiting for pod with inline volume") + framework.ExpectNoError(e2epod.WaitTimeoutForPodRunningInNamespace(client, pod.Name, pod.Namespace, t.Timeouts.PodStartSlow), "waiting for pod with inline volume") runningPod, err := client.CoreV1().Pods(pod.Namespace).Get(context.TODO(), pod.Name, metav1.GetOptions{}) framework.ExpectNoError(err, "get pod") actualNodeName := runningPod.Spec.NodeName @@ -320,7 +315,7 @@ func (t EphemeralTest) TestEphemeral() { runningPodData = t.RunningPodCheck(pod) } - StopPodAndDependents(client, pod) + StopPodAndDependents(client, t.Timeouts, pod) pod = nil // Don't stop twice. // There should be no dangling PVCs in the namespace now. There might be for @@ -352,8 +347,8 @@ func StartInPodWithInlineVolume(c clientset.Interface, ns, podName, command stri Containers: []v1.Container{ { Name: "csi-volume-tester", - Image: e2evolume.GetDefaultTestImage(), - Command: e2evolume.GenerateScriptCmd(command), + Image: e2epod.GetDefaultTestImage(), + Command: e2epod.GenerateScriptCmd(command), }, }, RestartPolicy: v1.RestartPolicyNever, @@ -383,8 +378,8 @@ func StartInPodWithInlineVolume(c clientset.Interface, ns, podName, command stri // CSIInlineVolumesEnabled checks whether the running cluster has the CSIInlineVolumes feature gate enabled. // It does that by trying to create a pod that uses that feature. -func CSIInlineVolumesEnabled(c clientset.Interface, ns string) (bool, error) { - return VolumeSourceEnabled(c, ns, v1.VolumeSource{ +func CSIInlineVolumesEnabled(c clientset.Interface, t *framework.TimeoutContext, ns string) (bool, error) { + return VolumeSourceEnabled(c, t, ns, v1.VolumeSource{ CSI: &v1.CSIVolumeSource{ Driver: "no-such-driver.example.com", }, @@ -393,9 +388,9 @@ func CSIInlineVolumesEnabled(c clientset.Interface, ns string) (bool, error) { // GenericEphemeralVolumesEnabled checks whether the running cluster has the GenericEphemeralVolume feature gate enabled. // It does that by trying to create a pod that uses that feature. -func GenericEphemeralVolumesEnabled(c clientset.Interface, ns string) (bool, error) { +func GenericEphemeralVolumesEnabled(c clientset.Interface, t *framework.TimeoutContext, ns string) (bool, error) { storageClassName := "no-such-storage-class" - return VolumeSourceEnabled(c, ns, v1.VolumeSource{ + return VolumeSourceEnabled(c, t, ns, v1.VolumeSource{ Ephemeral: &v1.EphemeralVolumeSource{ VolumeClaimTemplate: &v1.PersistentVolumeClaimTemplate{ Spec: v1.PersistentVolumeClaimSpec{ @@ -414,7 +409,7 @@ func GenericEphemeralVolumesEnabled(c clientset.Interface, ns string) (bool, err // VolumeSourceEnabled checks whether a certain kind of volume source is enabled by trying // to create a pod that uses it. -func VolumeSourceEnabled(c clientset.Interface, ns string, volume v1.VolumeSource) (bool, error) { +func VolumeSourceEnabled(c clientset.Interface, t *framework.TimeoutContext, ns string, volume v1.VolumeSource) (bool, error) { pod := &v1.Pod{ TypeMeta: metav1.TypeMeta{ Kind: "Pod", @@ -451,7 +446,7 @@ func VolumeSourceEnabled(c clientset.Interface, ns string, volume v1.VolumeSourc switch { case err == nil: // Pod was created, feature supported. - StopPodAndDependents(c, pod) + StopPodAndDependents(c, t, pod) return true, nil case apierrors.IsInvalid(err): // "Invalid" because it uses a feature that isn't supported. diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/fsgroupchangepolicy.go b/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/fsgroupchangepolicy.go index 380185d891c4..999d0e9ed58b 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/fsgroupchangepolicy.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/fsgroupchangepolicy.go @@ -27,7 +27,7 @@ import ( e2epod "k8s.io/kubernetes/test/e2e/framework/pod" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" e2evolume "k8s.io/kubernetes/test/e2e/framework/volume" - "k8s.io/kubernetes/test/e2e/storage/testpatterns" + storageframework "k8s.io/kubernetes/test/e2e/storage/framework" storageutils "k8s.io/kubernetes/test/e2e/storage/utils" utilpointer "k8s.io/utils/pointer" ) @@ -42,19 +42,17 @@ const ( ) type fsGroupChangePolicyTestSuite struct { - tsInfo TestSuiteInfo + tsInfo storageframework.TestSuiteInfo } -var _ TestSuite = &fsGroupChangePolicyTestSuite{} +var _ storageframework.TestSuite = &fsGroupChangePolicyTestSuite{} -// InitFsGroupChangePolicyTestSuite returns fsGroupChangePolicyTestSuite that implements TestSuite interface -func InitFsGroupChangePolicyTestSuite() TestSuite { +// InitCustomFsGroupChangePolicyTestSuite returns fsGroupChangePolicyTestSuite that implements TestSuite interface +func InitCustomFsGroupChangePolicyTestSuite(patterns []storageframework.TestPattern) storageframework.TestSuite { return &fsGroupChangePolicyTestSuite{ - tsInfo: TestSuiteInfo{ - Name: "fsgroupchangepolicy", - TestPatterns: []testpatterns.TestPattern{ - testpatterns.DefaultFsDynamicPV, - }, + tsInfo: storageframework.TestSuiteInfo{ + Name: "fsgroupchangepolicy", + TestPatterns: patterns, SupportedSizeRange: e2evolume.SizeRange{ Min: "1Mi", }, @@ -62,47 +60,51 @@ func InitFsGroupChangePolicyTestSuite() TestSuite { } } -func (s *fsGroupChangePolicyTestSuite) GetTestSuiteInfo() TestSuiteInfo { +// InitFsGroupChangePolicyTestSuite returns fsGroupChangePolicyTestSuite that implements TestSuite interface +func InitFsGroupChangePolicyTestSuite() storageframework.TestSuite { + patterns := []storageframework.TestPattern{ + storageframework.DefaultFsDynamicPV, + } + return InitCustomFsGroupChangePolicyTestSuite(patterns) +} + +func (s *fsGroupChangePolicyTestSuite) GetTestSuiteInfo() storageframework.TestSuiteInfo { return s.tsInfo } -func (s *fsGroupChangePolicyTestSuite) SkipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) { - skipVolTypePatterns(pattern, driver, testpatterns.NewVolTypeMap(testpatterns.CSIInlineVolume, testpatterns.GenericEphemeralVolume)) +func (s *fsGroupChangePolicyTestSuite) SkipUnsupportedTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) { + skipVolTypePatterns(pattern, driver, storageframework.NewVolTypeMap(storageframework.CSIInlineVolume, storageframework.GenericEphemeralVolume)) + dInfo := driver.GetDriverInfo() + if !dInfo.Capabilities[storageframework.CapFsGroup] { + e2eskipper.Skipf("Driver %q does not support FsGroup - skipping", dInfo.Name) + } + + if pattern.VolMode == v1.PersistentVolumeBlock { + e2eskipper.Skipf("Test does not support non-filesystem volume mode - skipping") + } + + if pattern.VolType != storageframework.DynamicPV { + e2eskipper.Skipf("Suite %q does not support %v", s.tsInfo.Name, pattern.VolType) + } + + _, ok := driver.(storageframework.DynamicPVTestDriver) + if !ok { + e2eskipper.Skipf("Driver %s doesn't support %v -- skipping", dInfo.Name, pattern.VolType) + } } -func (s *fsGroupChangePolicyTestSuite) DefineTests(driver TestDriver, pattern testpatterns.TestPattern) { +func (s *fsGroupChangePolicyTestSuite) DefineTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) { type local struct { - config *PerTestConfig + config *storageframework.PerTestConfig driverCleanup func() - driver TestDriver - resource *VolumeResource + driver storageframework.TestDriver + resource *storageframework.VolumeResource } var l local - ginkgo.BeforeEach(func() { - dInfo := driver.GetDriverInfo() - if !dInfo.Capabilities[CapFsGroup] { - e2eskipper.Skipf("Driver %q does not support FsGroup - skipping", dInfo.Name) - } - - if pattern.VolMode == v1.PersistentVolumeBlock { - e2eskipper.Skipf("Test does not support non-filesystem volume mode - skipping") - } - - if pattern.VolType != testpatterns.DynamicPV { - e2eskipper.Skipf("Suite %q does not support %v", s.tsInfo.Name, pattern.VolType) - } - - _, ok := driver.(DynamicPVTestDriver) - if !ok { - e2eskipper.Skipf("Driver %s doesn't support %v -- skipping", dInfo.Name, pattern.VolType) - } - }) - // This intentionally comes after checking the preconditions because it - // registers its own BeforeEach which creates the namespace. Beware that it - // also registers an AfterEach which renders f unusable. Any code using + // Beware that it also registers an AfterEach which renders f unusable. Any code using // f must run inside an It or Context callback. - f := framework.NewDefaultFramework("fsgroupchangepolicy") + f := framework.NewFrameworkWithCustomTimeouts("fsgroupchangepolicy", storageframework.GetDriverTimeouts(driver)) init := func() { e2eskipper.SkipIfNodeOSDistroIs("windows") @@ -110,7 +112,7 @@ func (s *fsGroupChangePolicyTestSuite) DefineTests(driver TestDriver, pattern te l.driver = driver l.config, l.driverCleanup = driver.PrepareTest(f) testVolumeSizeRange := s.GetTestSuiteInfo().SupportedSizeRange - l.resource = CreateVolumeResource(l.driver, l.config, pattern, testVolumeSizeRange) + l.resource = storageframework.CreateVolumeResource(l.driver, l.config, pattern, testVolumeSizeRange) } cleanup := func() { @@ -123,7 +125,7 @@ func (s *fsGroupChangePolicyTestSuite) DefineTests(driver TestDriver, pattern te } if l.driverCleanup != nil { - errs = append(errs, tryFunc(l.driverCleanup)) + errs = append(errs, storageutils.TryFunc(l.driverCleanup)) l.driverCleanup = nil } @@ -244,7 +246,7 @@ func (s *fsGroupChangePolicyTestSuite) DefineTests(driver TestDriver, pattern te func createPodAndVerifyContentGid(f *framework.Framework, podConfig *e2epod.Config, createInitialFiles bool, expectedRootDirFileOwnership, expectedSubDirFileOwnership string) *v1.Pod { podFsGroup := strconv.FormatInt(*podConfig.FsGroup, 10) ginkgo.By(fmt.Sprintf("Creating Pod in namespace %s with fsgroup %s", podConfig.NS, podFsGroup)) - pod, err := e2epod.CreateSecPodWithNodeSelection(f.ClientSet, podConfig, framework.PodStartTimeout) + pod, err := e2epod.CreateSecPodWithNodeSelection(f.ClientSet, podConfig, f.Timeouts.PodStart) framework.ExpectNoError(err) framework.Logf("Pod %s/%s started successfully", pod.Namespace, pod.Name) @@ -252,15 +254,15 @@ func createPodAndVerifyContentGid(f *framework.Framework, podConfig *e2epod.Conf ginkgo.By(fmt.Sprintf("Creating a sub-directory and file, and verifying their ownership is %s", podFsGroup)) cmd := fmt.Sprintf("touch %s", rootDirFilePath) var err error - _, _, err = storageutils.PodExec(f, pod, cmd) + _, _, err = e2evolume.PodExec(f, pod, cmd) framework.ExpectNoError(err) storageutils.VerifyFilePathGidInPod(f, rootDirFilePath, podFsGroup, pod) cmd = fmt.Sprintf("mkdir %s", subdir) - _, _, err = storageutils.PodExec(f, pod, cmd) + _, _, err = e2evolume.PodExec(f, pod, cmd) framework.ExpectNoError(err) cmd = fmt.Sprintf("touch %s", subDirFilePath) - _, _, err = storageutils.PodExec(f, pod, cmd) + _, _, err = e2evolume.PodExec(f, pod, cmd) framework.ExpectNoError(err) storageutils.VerifyFilePathGidInPod(f, subDirFilePath, podFsGroup, pod) return pod diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/multivolume.go b/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/multivolume.go index 05f546bf2f21..520fec4465c5 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/multivolume.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/multivolume.go @@ -32,28 +32,25 @@ import ( e2epod "k8s.io/kubernetes/test/e2e/framework/pod" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" e2evolume "k8s.io/kubernetes/test/e2e/framework/volume" - "k8s.io/kubernetes/test/e2e/storage/testpatterns" + storageframework "k8s.io/kubernetes/test/e2e/storage/framework" "k8s.io/kubernetes/test/e2e/storage/utils" + storageutils "k8s.io/kubernetes/test/e2e/storage/utils" imageutils "k8s.io/kubernetes/test/utils/image" ) type multiVolumeTestSuite struct { - tsInfo TestSuiteInfo + tsInfo storageframework.TestSuiteInfo } -var _ TestSuite = &multiVolumeTestSuite{} +var _ storageframework.TestSuite = &multiVolumeTestSuite{} -// InitMultiVolumeTestSuite returns multiVolumeTestSuite that implements TestSuite interface -func InitMultiVolumeTestSuite() TestSuite { +// InitCustomMultiVolumeTestSuite returns multiVolumeTestSuite that implements TestSuite interface +// using custom test patterns +func InitCustomMultiVolumeTestSuite(patterns []storageframework.TestPattern) storageframework.TestSuite { return &multiVolumeTestSuite{ - tsInfo: TestSuiteInfo{ - Name: "multiVolume [Slow]", - TestPatterns: []testpatterns.TestPattern{ - testpatterns.FsVolModePreprovisionedPV, - testpatterns.FsVolModeDynamicPV, - testpatterns.BlockVolModePreprovisionedPV, - testpatterns.BlockVolModeDynamicPV, - }, + tsInfo: storageframework.TestSuiteInfo{ + Name: "multiVolume [Slow]", + TestPatterns: patterns, SupportedSizeRange: e2evolume.SizeRange{ Min: "1Mi", }, @@ -61,23 +58,39 @@ func InitMultiVolumeTestSuite() TestSuite { } } -func (t *multiVolumeTestSuite) GetTestSuiteInfo() TestSuiteInfo { +// InitMultiVolumeTestSuite returns multiVolumeTestSuite that implements TestSuite interface +// using test suite default patterns +func InitMultiVolumeTestSuite() storageframework.TestSuite { + patterns := []storageframework.TestPattern{ + storageframework.FsVolModePreprovisionedPV, + storageframework.FsVolModeDynamicPV, + storageframework.BlockVolModePreprovisionedPV, + storageframework.BlockVolModeDynamicPV, + } + return InitCustomMultiVolumeTestSuite(patterns) +} + +func (t *multiVolumeTestSuite) GetTestSuiteInfo() storageframework.TestSuiteInfo { return t.tsInfo } -func (t *multiVolumeTestSuite) SkipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) { - skipVolTypePatterns(pattern, driver, testpatterns.NewVolTypeMap(testpatterns.PreprovisionedPV)) +func (t *multiVolumeTestSuite) SkipUnsupportedTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) { + dInfo := driver.GetDriverInfo() + skipVolTypePatterns(pattern, driver, storageframework.NewVolTypeMap(storageframework.PreprovisionedPV)) + if pattern.VolMode == v1.PersistentVolumeBlock && !dInfo.Capabilities[storageframework.CapBlock] { + e2eskipper.Skipf("Driver %s doesn't support %v -- skipping", dInfo.Name, pattern.VolMode) + } } -func (t *multiVolumeTestSuite) DefineTests(driver TestDriver, pattern testpatterns.TestPattern) { +func (t *multiVolumeTestSuite) DefineTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) { type local struct { - config *PerTestConfig + config *storageframework.PerTestConfig driverCleanup func() cs clientset.Interface ns *v1.Namespace - driver TestDriver - resources []*VolumeResource + driver storageframework.TestDriver + resources []*storageframework.VolumeResource migrationCheck *migrationOpCheck } @@ -86,18 +99,9 @@ func (t *multiVolumeTestSuite) DefineTests(driver TestDriver, pattern testpatter l local ) - ginkgo.BeforeEach(func() { - // Check preconditions. - if pattern.VolMode == v1.PersistentVolumeBlock && !dInfo.Capabilities[CapBlock] { - e2eskipper.Skipf("Driver %s doesn't support %v -- skipping", dInfo.Name, pattern.VolMode) - } - }) - - // This intentionally comes after checking the preconditions because it - // registers its own BeforeEach which creates the namespace. Beware that it - // also registers an AfterEach which renders f unusable. Any code using + // Beware that it also registers an AfterEach which renders f unusable. Any code using // f must run inside an It or Context callback. - f := framework.NewDefaultFramework("multivolume") + f := framework.NewFrameworkWithCustomTimeouts("multivolume", storageframework.GetDriverTimeouts(driver)) init := func() { l = local{} @@ -116,7 +120,7 @@ func (t *multiVolumeTestSuite) DefineTests(driver TestDriver, pattern testpatter errs = append(errs, resource.CleanupResource()) } - errs = append(errs, tryFunc(l.driverCleanup)) + errs = append(errs, storageutils.TryFunc(l.driverCleanup)) l.driverCleanup = nil framework.ExpectNoError(errors.NewAggregate(errs), "while cleanup resource") l.migrationCheck.validateMigrationVolumeOpCounts() @@ -131,7 +135,7 @@ func (t *multiVolumeTestSuite) DefineTests(driver TestDriver, pattern testpatter // Currently, multiple volumes are not generally available for pre-provisoined volume, // because containerized storage servers, such as iSCSI and rbd, are just returning // a static volume inside container, not actually creating a new volume per request. - if pattern.VolType == testpatterns.PreprovisionedPV { + if pattern.VolType == storageframework.PreprovisionedPV { e2eskipper.Skipf("This test doesn't work with pre-provisioned volume -- skipping") } @@ -143,7 +147,7 @@ func (t *multiVolumeTestSuite) DefineTests(driver TestDriver, pattern testpatter for i := 0; i < numVols; i++ { testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange - resource := CreateVolumeResource(driver, l.config, pattern, testVolumeSizeRange) + resource := storageframework.CreateVolumeResource(driver, l.config, pattern, testVolumeSizeRange) l.resources = append(l.resources, resource) pvcs = append(pvcs, resource.Pvc) } @@ -161,7 +165,7 @@ func (t *multiVolumeTestSuite) DefineTests(driver TestDriver, pattern testpatter // Currently, multiple volumes are not generally available for pre-provisoined volume, // because containerized storage servers, such as iSCSI and rbd, are just returning // a static volume inside container, not actually creating a new volume per request. - if pattern.VolType == testpatterns.PreprovisionedPV { + if pattern.VolType == storageframework.PreprovisionedPV { e2eskipper.Skipf("This test doesn't work with pre-provisioned volume -- skipping") } @@ -169,8 +173,8 @@ func (t *multiVolumeTestSuite) DefineTests(driver TestDriver, pattern testpatter defer cleanup() // Check different-node test requirement - if l.driver.GetDriverInfo().Capabilities[CapSingleNodeVolume] { - e2eskipper.Skipf("Driver %s only supports %v -- skipping", l.driver.GetDriverInfo().Name, CapSingleNodeVolume) + if l.driver.GetDriverInfo().Capabilities[storageframework.CapSingleNodeVolume] { + e2eskipper.Skipf("Driver %s only supports %v -- skipping", l.driver.GetDriverInfo().Name, storageframework.CapSingleNodeVolume) } nodes, err := e2enode.GetReadySchedulableNodes(l.cs) framework.ExpectNoError(err) @@ -193,7 +197,7 @@ func (t *multiVolumeTestSuite) DefineTests(driver TestDriver, pattern testpatter for i := 0; i < numVols; i++ { testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange - resource := CreateVolumeResource(driver, l.config, pattern, testVolumeSizeRange) + resource := storageframework.CreateVolumeResource(driver, l.config, pattern, testVolumeSizeRange) l.resources = append(l.resources, resource) pvcs = append(pvcs, resource.Pvc) } @@ -215,7 +219,7 @@ func (t *multiVolumeTestSuite) DefineTests(driver TestDriver, pattern testpatter // Currently, multiple volumes are not generally available for pre-provisoined volume, // because containerized storage servers, such as iSCSI and rbd, are just returning // a static volume inside container, not actually creating a new volume per request. - if pattern.VolType == testpatterns.PreprovisionedPV { + if pattern.VolType == storageframework.PreprovisionedPV { e2eskipper.Skipf("This test doesn't work with pre-provisioned volume -- skipping") } @@ -232,7 +236,7 @@ func (t *multiVolumeTestSuite) DefineTests(driver TestDriver, pattern testpatter curPattern.VolMode = v1.PersistentVolumeFilesystem } testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange - resource := CreateVolumeResource(driver, l.config, curPattern, testVolumeSizeRange) + resource := storageframework.CreateVolumeResource(driver, l.config, curPattern, testVolumeSizeRange) l.resources = append(l.resources, resource) pvcs = append(pvcs, resource.Pvc) } @@ -254,7 +258,7 @@ func (t *multiVolumeTestSuite) DefineTests(driver TestDriver, pattern testpatter // Currently, multiple volumes are not generally available for pre-provisoined volume, // because containerized storage servers, such as iSCSI and rbd, are just returning // a static volume inside container, not actually creating a new volume per request. - if pattern.VolType == testpatterns.PreprovisionedPV { + if pattern.VolType == storageframework.PreprovisionedPV { e2eskipper.Skipf("This test doesn't work with pre-provisioned volume -- skipping") } @@ -262,8 +266,8 @@ func (t *multiVolumeTestSuite) DefineTests(driver TestDriver, pattern testpatter defer cleanup() // Check different-node test requirement - if l.driver.GetDriverInfo().Capabilities[CapSingleNodeVolume] { - e2eskipper.Skipf("Driver %s only supports %v -- skipping", l.driver.GetDriverInfo().Name, CapSingleNodeVolume) + if l.driver.GetDriverInfo().Capabilities[storageframework.CapSingleNodeVolume] { + e2eskipper.Skipf("Driver %s only supports %v -- skipping", l.driver.GetDriverInfo().Name, storageframework.CapSingleNodeVolume) } nodes, err := e2enode.GetReadySchedulableNodes(l.cs) framework.ExpectNoError(err) @@ -291,7 +295,7 @@ func (t *multiVolumeTestSuite) DefineTests(driver TestDriver, pattern testpatter curPattern.VolMode = v1.PersistentVolumeFilesystem } testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange - resource := CreateVolumeResource(driver, l.config, curPattern, testVolumeSizeRange) + resource := storageframework.CreateVolumeResource(driver, l.config, curPattern, testVolumeSizeRange) l.resources = append(l.resources, resource) pvcs = append(pvcs, resource.Pvc) } @@ -311,13 +315,13 @@ func (t *multiVolumeTestSuite) DefineTests(driver TestDriver, pattern testpatter numPods := 2 - if !l.driver.GetDriverInfo().Capabilities[CapMultiPODs] { + if !l.driver.GetDriverInfo().Capabilities[storageframework.CapMultiPODs] { e2eskipper.Skipf("Driver %q does not support multiple concurrent pods - skipping", dInfo.Name) } // Create volume testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange - resource := CreateVolumeResource(l.driver, l.config, pattern, testVolumeSizeRange) + resource := storageframework.CreateVolumeResource(l.driver, l.config, pattern, testVolumeSizeRange) l.resources = append(l.resources, resource) // Test access to the volume from pods on different node @@ -336,17 +340,17 @@ func (t *multiVolumeTestSuite) DefineTests(driver TestDriver, pattern testpatter numPods := 2 - if !l.driver.GetDriverInfo().Capabilities[CapMultiPODs] { + if !l.driver.GetDriverInfo().Capabilities[storageframework.CapMultiPODs] { e2eskipper.Skipf("Driver %q does not support multiple concurrent pods - skipping", dInfo.Name) } // Create volume testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange - resource := CreateVolumeResource(l.driver, l.config, pattern, testVolumeSizeRange) + resource := storageframework.CreateVolumeResource(l.driver, l.config, pattern, testVolumeSizeRange) l.resources = append(l.resources, resource) // Initialize the volume with a filesystem - it's going to be mounted as read-only below. - initializeVolume(l.cs, l.ns.Name, resource.Pvc, l.config.ClientNodeSelection) + initializeVolume(l.cs, f.Timeouts, l.ns.Name, resource.Pvc, l.config.ClientNodeSelection) // Test access to the volume from pods on a single node TestConcurrentAccessToSingleVolume(l.config.Framework, l.cs, l.ns.Name, @@ -364,8 +368,8 @@ func (t *multiVolumeTestSuite) DefineTests(driver TestDriver, pattern testpatter numPods := 2 - if !l.driver.GetDriverInfo().Capabilities[CapRWX] { - e2eskipper.Skipf("Driver %s doesn't support %v -- skipping", l.driver.GetDriverInfo().Name, CapRWX) + if !l.driver.GetDriverInfo().Capabilities[storageframework.CapRWX] { + e2eskipper.Skipf("Driver %s doesn't support %v -- skipping", l.driver.GetDriverInfo().Name, storageframework.CapRWX) } // Check different-node test requirement @@ -387,7 +391,7 @@ func (t *multiVolumeTestSuite) DefineTests(driver TestDriver, pattern testpatter // Create volume testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange - resource := CreateVolumeResource(l.driver, l.config, pattern, testVolumeSizeRange) + resource := storageframework.CreateVolumeResource(l.driver, l.config, pattern, testVolumeSizeRange) l.resources = append(l.resources, resource) // Test access to the volume from pods on different node @@ -404,11 +408,11 @@ func testAccessMultipleVolumes(f *framework.Framework, cs clientset.Interface, n podConfig := e2epod.Config{ NS: ns, PVCs: pvcs, - SeLinuxLabel: e2evolume.GetLinuxLabel(), + SeLinuxLabel: e2epod.GetLinuxLabel(), NodeSelection: node, - ImageID: e2evolume.GetDefaultTestImageID(), + ImageID: e2epod.GetDefaultTestImageID(), } - pod, err := e2epod.CreateSecPodWithNodeSelection(cs, &podConfig, framework.PodStartTimeout) + pod, err := e2epod.CreateSecPodWithNodeSelection(cs, &podConfig, f.Timeouts.PodStart) defer func() { framework.ExpectNoError(e2epod.DeletePodWithWait(cs, pod)) }() @@ -420,7 +424,7 @@ func testAccessMultipleVolumes(f *framework.Framework, cs clientset.Interface, n index := i + 1 path := fmt.Sprintf("/mnt/volume%d", index) ginkgo.By(fmt.Sprintf("Checking if the volume%d exists as expected volume mode (%s)", index, *pvc.Spec.VolumeMode)) - utils.CheckVolumeModeOfPath(f, pod, *pvc.Spec.VolumeMode, path) + e2evolume.CheckVolumeModeOfPath(f, pod, *pvc.Spec.VolumeMode, path) if readSeedBase > 0 { ginkgo.By(fmt.Sprintf("Checking if read from the volume%d works properly", index)) @@ -483,12 +487,12 @@ func TestConcurrentAccessToSingleVolume(f *framework.Framework, cs clientset.Int podConfig := e2epod.Config{ NS: ns, PVCs: []*v1.PersistentVolumeClaim{pvc}, - SeLinuxLabel: e2evolume.GetLinuxLabel(), + SeLinuxLabel: e2epod.GetLinuxLabel(), NodeSelection: node, PVCsReadOnly: readOnly, - ImageID: e2evolume.GetTestImageID(imageutils.DebianIptables), + ImageID: e2epod.GetTestImageID(imageutils.DebianIptables), } - pod, err := e2epod.CreateSecPodWithNodeSelection(cs, &podConfig, framework.PodStartTimeout) + pod, err := e2epod.CreateSecPodWithNodeSelection(cs, &podConfig, f.Timeouts.PodStart) defer func() { framework.ExpectNoError(e2epod.DeletePodWithWait(cs, pod)) }() @@ -521,7 +525,7 @@ func TestConcurrentAccessToSingleVolume(f *framework.Framework, cs clientset.Int for i, pod := range pods { index := i + 1 ginkgo.By(fmt.Sprintf("Checking if the volume in pod%d exists as expected volume mode (%s)", index, *pvc.Spec.VolumeMode)) - utils.CheckVolumeModeOfPath(f, pod, *pvc.Spec.VolumeMode, path) + e2evolume.CheckVolumeModeOfPath(f, pod, *pvc.Spec.VolumeMode, path) if readOnly { ginkgo.By("Skipping volume content checks, volume is read-only") @@ -557,7 +561,7 @@ func TestConcurrentAccessToSingleVolume(f *framework.Framework, cs clientset.Int index := i + 1 // index of pod and index of pvc match, because pods are created above way ginkgo.By(fmt.Sprintf("Rechecking if the volume in pod%d exists as expected volume mode (%s)", index, *pvc.Spec.VolumeMode)) - utils.CheckVolumeModeOfPath(f, pod, *pvc.Spec.VolumeMode, "/mnt/volume1") + e2evolume.CheckVolumeModeOfPath(f, pod, *pvc.Spec.VolumeMode, "/mnt/volume1") if readOnly { ginkgo.By("Skipping volume content checks, volume is read-only") @@ -637,7 +641,7 @@ func ensureTopologyRequirements(nodeSelection *e2epod.NodeSelection, nodes *v1.N } // initializeVolume creates a filesystem on given volume, so it can be used as read-only later -func initializeVolume(cs clientset.Interface, ns string, pvc *v1.PersistentVolumeClaim, node e2epod.NodeSelection) { +func initializeVolume(cs clientset.Interface, t *framework.TimeoutContext, ns string, pvc *v1.PersistentVolumeClaim, node e2epod.NodeSelection) { if pvc.Spec.VolumeMode != nil && *pvc.Spec.VolumeMode == v1.PersistentVolumeBlock { // Block volumes do not need to be initialized. return @@ -649,11 +653,11 @@ func initializeVolume(cs clientset.Interface, ns string, pvc *v1.PersistentVolum podConfig := e2epod.Config{ NS: ns, PVCs: []*v1.PersistentVolumeClaim{pvc}, - SeLinuxLabel: e2evolume.GetLinuxLabel(), + SeLinuxLabel: e2epod.GetLinuxLabel(), NodeSelection: node, - ImageID: e2evolume.GetDefaultTestImageID(), + ImageID: e2epod.GetDefaultTestImageID(), } - pod, err := e2epod.CreateSecPod(cs, &podConfig, framework.PodStartTimeout) + pod, err := e2epod.CreateSecPod(cs, &podConfig, t.PodStart) defer func() { framework.ExpectNoError(e2epod.DeletePodWithWait(cs, pod)) }() diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/provisioning.go b/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/provisioning.go index a46deb1e6d73..5bc00446459b 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/provisioning.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/provisioning.go @@ -38,13 +38,15 @@ import ( e2epv "k8s.io/kubernetes/test/e2e/framework/pv" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" e2evolume "k8s.io/kubernetes/test/e2e/framework/volume" - "k8s.io/kubernetes/test/e2e/storage/testpatterns" + storageframework "k8s.io/kubernetes/test/e2e/storage/framework" + storageutils "k8s.io/kubernetes/test/e2e/storage/utils" ) // StorageClassTest represents parameters to be used by provisioning tests. // Not all parameters are used by all tests. type StorageClassTest struct { Client clientset.Interface + Timeouts *framework.TimeoutContext Claim *v1.PersistentVolumeClaim SourceClaim *v1.PersistentVolumeClaim Class *storagev1.StorageClass @@ -61,21 +63,16 @@ type StorageClassTest struct { } type provisioningTestSuite struct { - tsInfo TestSuiteInfo + tsInfo storageframework.TestSuiteInfo } -var _ TestSuite = &provisioningTestSuite{} - -// InitProvisioningTestSuite returns provisioningTestSuite that implements TestSuite interface -func InitProvisioningTestSuite() TestSuite { +// InitCustomProvisioningTestSuite returns provisioningTestSuite that implements TestSuite interface +// using custom test patterns +func InitCustomProvisioningTestSuite(patterns []storageframework.TestPattern) storageframework.TestSuite { return &provisioningTestSuite{ - tsInfo: TestSuiteInfo{ - Name: "provisioning", - TestPatterns: []testpatterns.TestPattern{ - testpatterns.DefaultFsDynamicPV, - testpatterns.BlockVolModeDynamicPV, - testpatterns.NtfsDynamicPV, - }, + tsInfo: storageframework.TestSuiteInfo{ + Name: "provisioning", + TestPatterns: patterns, SupportedSizeRange: e2evolume.SizeRange{ Min: "1Mi", }, @@ -83,16 +80,35 @@ func InitProvisioningTestSuite() TestSuite { } } -func (p *provisioningTestSuite) GetTestSuiteInfo() TestSuiteInfo { +// InitProvisioningTestSuite returns provisioningTestSuite that implements TestSuite interface\ +// using test suite default patterns +func InitProvisioningTestSuite() storageframework.TestSuite { + patterns := []storageframework.TestPattern{ + storageframework.DefaultFsDynamicPV, + storageframework.BlockVolModeDynamicPV, + storageframework.NtfsDynamicPV, + } + return InitCustomProvisioningTestSuite(patterns) +} + +func (p *provisioningTestSuite) GetTestSuiteInfo() storageframework.TestSuiteInfo { return p.tsInfo } -func (p *provisioningTestSuite) SkipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) { +func (p *provisioningTestSuite) SkipUnsupportedTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) { + // Check preconditions. + if pattern.VolType != storageframework.DynamicPV { + e2eskipper.Skipf("Suite %q does not support %v", p.tsInfo.Name, pattern.VolType) + } + dInfo := driver.GetDriverInfo() + if pattern.VolMode == v1.PersistentVolumeBlock && !dInfo.Capabilities[storageframework.CapBlock] { + e2eskipper.Skipf("Driver %s doesn't support %v -- skipping", dInfo.Name, pattern.VolMode) + } } -func (p *provisioningTestSuite) DefineTests(driver TestDriver, pattern testpatterns.TestPattern) { +func (p *provisioningTestSuite) DefineTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) { type local struct { - config *PerTestConfig + config *storageframework.PerTestConfig driverCleanup func() testCase *StorageClassTest @@ -105,42 +121,24 @@ func (p *provisioningTestSuite) DefineTests(driver TestDriver, pattern testpatte } var ( dInfo = driver.GetDriverInfo() - dDriver DynamicPVTestDriver + dDriver storageframework.DynamicPVTestDriver l local ) - ginkgo.BeforeEach(func() { - // Check preconditions. - if pattern.VolType != testpatterns.DynamicPV { - e2eskipper.Skipf("Suite %q does not support %v", p.tsInfo.Name, pattern.VolType) - } - if pattern.VolMode == v1.PersistentVolumeBlock && !dInfo.Capabilities[CapBlock] { - e2eskipper.Skipf("Driver %q does not support block volumes - skipping", dInfo.Name) - } - - ok := false - dDriver, ok = driver.(DynamicPVTestDriver) - if !ok { - e2eskipper.Skipf("Driver %s doesn't support %v -- skipping", dInfo.Name, pattern.VolType) - } - }) - - // This intentionally comes after checking the preconditions because it - // registers its own BeforeEach which creates the namespace. Beware that it - // also registers an AfterEach which renders f unusable. Any code using + // Beware that it also registers an AfterEach which renders f unusable. Any code using // f must run inside an It or Context callback. - f := framework.NewDefaultFramework("provisioning") + f := framework.NewFrameworkWithCustomTimeouts("provisioning", storageframework.GetDriverTimeouts(driver)) init := func() { l = local{} - + dDriver, _ = driver.(storageframework.DynamicPVTestDriver) // Now do the more expensive test initialization. l.config, l.driverCleanup = driver.PrepareTest(f) l.migrationCheck = newMigrationOpCheck(f.ClientSet, dInfo.InTreePluginName) l.cs = l.config.Framework.ClientSet testVolumeSizeRange := p.GetTestSuiteInfo().SupportedSizeRange driverVolumeSizeRange := dDriver.GetDriverInfo().SupportedSizeRange - claimSize, err := getSizeRangesIntersection(testVolumeSizeRange, driverVolumeSizeRange) + claimSize, err := storageutils.GetSizeRangesIntersection(testVolumeSizeRange, driverVolumeSizeRange) framework.ExpectNoError(err, "determine intersection of test size range %+v and driver size range %+v", testVolumeSizeRange, driverVolumeSizeRange) l.sc = dDriver.GetDynamicProvisionStorageClass(l.config, pattern.FsType) @@ -160,6 +158,7 @@ func (p *provisioningTestSuite) DefineTests(driver TestDriver, pattern testpatte framework.Logf("In creating storage class object and pvc objects for driver - sc: %v, pvc: %v, src-pvc: %v", l.sc, l.pvc, l.sourcePVC) l.testCase = &StorageClassTest{ Client: l.config.Framework.ClientSet, + Timeouts: f.Timeouts, Claim: l.pvc, SourceClaim: l.sourcePVC, Class: l.sc, @@ -170,7 +169,7 @@ func (p *provisioningTestSuite) DefineTests(driver TestDriver, pattern testpatte } cleanup := func() { - err := tryFunc(l.driverCleanup) + err := storageutils.TryFunc(l.driverCleanup) l.driverCleanup = nil framework.ExpectNoError(err, "while cleaning up driver") @@ -190,20 +189,23 @@ func (p *provisioningTestSuite) DefineTests(driver TestDriver, pattern testpatte l.testCase.Class.MountOptions = dInfo.SupportedMountOption.Union(dInfo.RequiredMountOption).List() l.testCase.PvCheck = func(claim *v1.PersistentVolumeClaim) { - PVWriteReadSingleNodeCheck(l.cs, claim, l.config.ClientNodeSelection) + PVWriteReadSingleNodeCheck(l.cs, f.Timeouts, claim, l.config.ClientNodeSelection) } + _, clearProvisionedStorageClass := SetupStorageClass(l.testCase.Client, l.testCase.Class) + defer clearProvisionedStorageClass() + l.testCase.TestDynamicProvisioning() }) ginkgo.It("should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]", func() { - if !dInfo.Capabilities[CapSnapshotDataSource] { + if !dInfo.Capabilities[storageframework.CapSnapshotDataSource] { e2eskipper.Skipf("Driver %q does not support populate data from snapshot - skipping", dInfo.Name) } if !dInfo.SupportedFsType.Has(pattern.FsType) { e2eskipper.Skipf("Driver %q does not support %q fs type - skipping", dInfo.Name, pattern.FsType) } - sDriver, ok := driver.(SnapshottableTestDriver) + sDriver, ok := driver.(storageframework.SnapshottableTestDriver) if !ok { framework.Failf("Driver %q has CapSnapshotDataSource but does not implement SnapshottableTestDriver", dInfo.Name) } @@ -212,7 +214,7 @@ func (p *provisioningTestSuite) DefineTests(driver TestDriver, pattern testpatte defer cleanup() dc := l.config.Framework.DynamicClient - testConfig := convertTestConfig(l.config) + testConfig := storageframework.ConvertTestConfig(l.config) expectedContent := fmt.Sprintf("Hello from namespace %s", f.Namespace.Name) dataSource, cleanupFunc := prepareSnapshotDataSourceForProvisioning(f, testConfig, l.config, pattern, l.cs, dc, l.pvc, l.sc, sDriver, pattern.VolMode, expectedContent) defer cleanupFunc() @@ -222,7 +224,7 @@ func (p *provisioningTestSuite) DefineTests(driver TestDriver, pattern testpatte ginkgo.By("checking whether the created volume has the pre-populated data") tests := []e2evolume.Test{ { - Volume: *createVolumeSource(claim.Name, false /* readOnly */), + Volume: *storageutils.CreateVolumeSource(claim.Name, false /* readOnly */), Mode: pattern.VolMode, File: "index.html", ExpectedContent: expectedContent, @@ -234,13 +236,13 @@ func (p *provisioningTestSuite) DefineTests(driver TestDriver, pattern testpatte }) ginkgo.It("should provision storage with pvc data source", func() { - if !dInfo.Capabilities[CapPVCDataSource] { + if !dInfo.Capabilities[storageframework.CapPVCDataSource] { e2eskipper.Skipf("Driver %q does not support cloning - skipping", dInfo.Name) } init() defer cleanup() - testConfig := convertTestConfig(l.config) + testConfig := storageframework.ConvertTestConfig(l.config) expectedContent := fmt.Sprintf("Hello from namespace %s", f.Namespace.Name) dataSource, dataSourceCleanup := preparePVCDataSourceForProvisioning(f, testConfig, l.cs, l.sourcePVC, l.sc, pattern.VolMode, expectedContent) defer dataSourceCleanup() @@ -250,7 +252,7 @@ func (p *provisioningTestSuite) DefineTests(driver TestDriver, pattern testpatte ginkgo.By("checking whether the created volume has the pre-populated data") tests := []e2evolume.Test{ { - Volume: *createVolumeSource(claim.Name, false /* readOnly */), + Volume: *storageutils.CreateVolumeSource(claim.Name, false /* readOnly */), Mode: pattern.VolMode, File: "index.html", ExpectedContent: expectedContent, @@ -263,17 +265,17 @@ func (p *provisioningTestSuite) DefineTests(driver TestDriver, pattern testpatte ginkgo.It("should provision storage with pvc data source in parallel [Slow]", func() { // Test cloning a single volume multiple times. - if !dInfo.Capabilities[CapPVCDataSource] { + if !dInfo.Capabilities[storageframework.CapPVCDataSource] { e2eskipper.Skipf("Driver %q does not support cloning - skipping", dInfo.Name) } - if pattern.VolMode == v1.PersistentVolumeBlock && !dInfo.Capabilities[CapBlock] { + if pattern.VolMode == v1.PersistentVolumeBlock && !dInfo.Capabilities[storageframework.CapBlock] { e2eskipper.Skipf("Driver %q does not support block volumes - skipping", dInfo.Name) } init() defer cleanup() - testConfig := convertTestConfig(l.config) + testConfig := storageframework.ConvertTestConfig(l.config) expectedContent := fmt.Sprintf("Hello from namespace %s", f.Namespace.Name) dataSource, dataSourceCleanup := preparePVCDataSourceForProvisioning(f, testConfig, l.cs, l.sourcePVC, l.sc, pattern.VolMode, expectedContent) defer dataSourceCleanup() @@ -290,15 +292,12 @@ func (p *provisioningTestSuite) DefineTests(driver TestDriver, pattern testpatte myTestConfig := testConfig myTestConfig.Prefix = fmt.Sprintf("%s-%d", myTestConfig.Prefix, i) - // Each go routine must have its own testCase copy to store their claim - myTestCase := *l.testCase - myTestCase.Claim = myTestCase.Claim.DeepCopy() - myTestCase.Class = nil // Do not create/delete the storage class in TestDynamicProvisioning, it already exists. - myTestCase.PvCheck = func(claim *v1.PersistentVolumeClaim) { + t := *l.testCase + t.PvCheck = func(claim *v1.PersistentVolumeClaim) { ginkgo.By(fmt.Sprintf("checking whether the created volume %d has the pre-populated data", i)) tests := []e2evolume.Test{ { - Volume: *createVolumeSource(claim.Name, false /* readOnly */), + Volume: *storageutils.CreateVolumeSource(claim.Name, false /* readOnly */), Mode: pattern.VolMode, File: "index.html", ExpectedContent: expectedContent, @@ -306,38 +305,73 @@ func (p *provisioningTestSuite) DefineTests(driver TestDriver, pattern testpatte } e2evolume.TestVolumeClientSlow(f, myTestConfig, nil, "", tests) } - myTestCase.TestDynamicProvisioning() + t.TestDynamicProvisioning() }(i) } wg.Wait() }) } +// SetupStorageClass ensures that a StorageClass from a spec exists, if the StorageClass already exists +// then it's returned as it is, if it doesn't exist then it's created first +// and then returned, if the spec is nil then we return the `default` StorageClass +func SetupStorageClass( + client clientset.Interface, + class *storagev1.StorageClass, +) (*storagev1.StorageClass, func()) { + gomega.Expect(client).NotTo(gomega.BeNil(), "SetupStorageClass.client is required") + + var err error + var computedStorageClass *storagev1.StorageClass + var clearComputedStorageClass = func() {} + if class != nil { + computedStorageClass, err = client.StorageV1().StorageClasses().Get(context.TODO(), class.Name, metav1.GetOptions{}) + if err == nil { + // skip storageclass creation if it already exists + ginkgo.By("Storage class " + computedStorageClass.Name + " is already created, skipping creation.") + } else { + ginkgo.By("Creating a StorageClass") + class, err = client.StorageV1().StorageClasses().Create(context.TODO(), class, metav1.CreateOptions{}) + framework.ExpectNoError(err) + computedStorageClass, err = client.StorageV1().StorageClasses().Get(context.TODO(), class.Name, metav1.GetOptions{}) + framework.ExpectNoError(err) + clearComputedStorageClass = func() { + framework.Logf("deleting storage class %s", computedStorageClass.Name) + err := client.StorageV1().StorageClasses().Delete(context.TODO(), computedStorageClass.Name, metav1.DeleteOptions{}) + if err != nil && !apierrors.IsNotFound(err) { + framework.ExpectNoError(err, "delete storage class") + } + } + } + } else { + // StorageClass is nil, so the default one will be used + scName, err := e2epv.GetDefaultStorageClassName(client) + framework.ExpectNoError(err) + ginkgo.By("Wanted storage class is nil, fetching default StorageClass=" + scName) + computedStorageClass, err = client.StorageV1().StorageClasses().Get(context.TODO(), scName, metav1.GetOptions{}) + framework.ExpectNoError(err) + } + + return computedStorageClass, clearComputedStorageClass +} + // TestDynamicProvisioning tests dynamic provisioning with specified StorageClassTest +// it's assumed that the StorageClass `t.Class` is already provisioned, +// see #ProvisionStorageClass func (t StorageClassTest) TestDynamicProvisioning() *v1.PersistentVolume { + var err error + client := t.Client gomega.Expect(client).NotTo(gomega.BeNil(), "StorageClassTest.Client is required") claim := t.Claim gomega.Expect(claim).NotTo(gomega.BeNil(), "StorageClassTest.Claim is required") + gomega.Expect(claim.GenerateName).NotTo(gomega.BeEmpty(), "StorageClassTest.Claim.GenerateName must not be empty") class := t.Class + gomega.Expect(class).NotTo(gomega.BeNil(), "StorageClassTest.Class is required") + class, err = client.StorageV1().StorageClasses().Get(context.TODO(), class.Name, metav1.GetOptions{}) + framework.ExpectNoError(err, "StorageClass.Class "+class.Name+" couldn't be fetched from the cluster") - var err error - if class != nil { - framework.ExpectEqual(*claim.Spec.StorageClassName, class.Name) - ginkgo.By("creating a StorageClass " + class.Name) - _, err = client.StorageV1().StorageClasses().Create(context.TODO(), class, metav1.CreateOptions{}) - // The "should provision storage with snapshot data source" test already has created the class. - // TODO: make class creation optional and remove the IsAlreadyExists exception - framework.ExpectEqual(err == nil || apierrors.IsAlreadyExists(err), true) - class, err = client.StorageV1().StorageClasses().Get(context.TODO(), class.Name, metav1.GetOptions{}) - framework.ExpectNoError(err) - defer func() { - framework.Logf("deleting storage class %s", class.Name) - framework.ExpectNoError(client.StorageV1().StorageClasses().Delete(context.TODO(), class.Name, metav1.DeleteOptions{})) - }() - } - - ginkgo.By("creating a claim") + ginkgo.By(fmt.Sprintf("creating claim=%+v", claim)) claim, err = client.CoreV1().PersistentVolumeClaims(claim.Namespace).Create(context.TODO(), claim, metav1.CreateOptions{}) framework.ExpectNoError(err) defer func() { @@ -349,21 +383,22 @@ func (t StorageClassTest) TestDynamicProvisioning() *v1.PersistentVolume { } }() - if class == nil { - // StorageClass is nil, so the default one will be used - scName, err := e2epv.GetDefaultStorageClassName(client) - framework.ExpectNoError(err) - defaultSC, err := client.StorageV1().StorageClasses().Get(context.TODO(), scName, metav1.GetOptions{}) - framework.ExpectNoError(err) - // If late binding is configured, create and delete a pod to provision the volume - if *defaultSC.VolumeBindingMode == storagev1.VolumeBindingWaitForFirstConsumer { - ginkgo.By("creating a pod referring to the claim") - var pod *v1.Pod - pod, err := e2epod.CreatePod(t.Client, claim.Namespace, nil /* nodeSelector */, []*v1.PersistentVolumeClaim{claim}, true /* isPrivileged */, "" /* command */) - // Delete pod now, otherwise PV can't be deleted below - framework.ExpectNoError(err) - e2epod.DeletePodOrFail(t.Client, pod.Namespace, pod.Name) + // ensure that the claim refers to the provisioned StorageClass + framework.ExpectEqual(*claim.Spec.StorageClassName, class.Name) + + // if late binding is configured, create and delete a pod to provision the volume + if *class.VolumeBindingMode == storagev1.VolumeBindingWaitForFirstConsumer { + ginkgo.By(fmt.Sprintf("creating a pod referring to the class=%+v claim=%+v", class, claim)) + var podConfig *e2epod.Config = &e2epod.Config{ + NS: claim.Namespace, + PVCs: []*v1.PersistentVolumeClaim{claim}, } + + var pod *v1.Pod + pod, err := e2epod.CreateSecPod(client, podConfig, framework.PodStartTimeout) + // Delete pod now, otherwise PV can't be deleted below + framework.ExpectNoError(err) + e2epod.DeletePodOrFail(client, pod.Namespace, pod.Name) } // Run the checker @@ -381,11 +416,11 @@ func (t StorageClassTest) TestDynamicProvisioning() *v1.PersistentVolume { // it's expected for the caller to do it.) Technically, the first few delete // attempts may fail, as the volume is still attached to a node because // kubelet is slowly cleaning up the previous pod, however it should succeed - // in a couple of minutes. Wait 20 minutes to recover from random cloud - // hiccups. + // in a couple of minutes. Wait 20 minutes (or whatever custom value is specified in + // t.Timeouts.PVDeleteSlow) to recover from random cloud hiccups. if pv != nil && pv.Spec.PersistentVolumeReclaimPolicy == v1.PersistentVolumeReclaimDelete { ginkgo.By(fmt.Sprintf("deleting the claim's PV %q", pv.Name)) - framework.ExpectNoError(e2epv.WaitForPersistentVolumeDeleted(client, pv.Name, 5*time.Second, 20*time.Minute)) + framework.ExpectNoError(e2epv.WaitForPersistentVolumeDeleted(client, pv.Name, 5*time.Second, t.Timeouts.PVDeleteSlow)) } return pv @@ -406,7 +441,7 @@ func getBoundPV(client clientset.Interface, pvc *v1.PersistentVolumeClaim) (*v1. // checkProvisioning verifies that the claim is bound and has the correct properities func (t StorageClassTest) checkProvisioning(client clientset.Interface, claim *v1.PersistentVolumeClaim, class *storagev1.StorageClass) *v1.PersistentVolume { - err := e2epv.WaitForPersistentVolumeClaimPhase(v1.ClaimBound, client, claim.Namespace, claim.Name, framework.Poll, framework.ClaimProvisionTimeout) + err := e2epv.WaitForPersistentVolumeClaimPhase(v1.ClaimBound, client, claim.Namespace, claim.Name, framework.Poll, t.Timeouts.ClaimProvision) framework.ExpectNoError(err) ginkgo.By("checking the claim") @@ -467,7 +502,7 @@ func (t StorageClassTest) checkProvisioning(client clientset.Interface, claim *v // persistent across pods. // // This is a common test that can be called from a StorageClassTest.PvCheck. -func PVWriteReadSingleNodeCheck(client clientset.Interface, claim *v1.PersistentVolumeClaim, node e2epod.NodeSelection) *v1.PersistentVolume { +func PVWriteReadSingleNodeCheck(client clientset.Interface, timeouts *framework.TimeoutContext, claim *v1.PersistentVolumeClaim, node e2epod.NodeSelection) *v1.PersistentVolume { ginkgo.By(fmt.Sprintf("checking the created volume is writable on node %+v", node)) command := "echo 'hello world' > /mnt/test/data" pod := StartInPodWithVolume(client, claim.Namespace, claim.Name, "pvc-volume-tester-writer", command, node) @@ -475,7 +510,7 @@ func PVWriteReadSingleNodeCheck(client clientset.Interface, claim *v1.Persistent // pod might be nil now. StopPod(client, pod) }() - framework.ExpectNoError(e2epod.WaitForPodSuccessInNamespaceSlow(client, pod.Name, pod.Namespace)) + framework.ExpectNoError(e2epod.WaitForPodSuccessInNamespaceTimeout(client, pod.Name, pod.Namespace, timeouts.PodStartSlow)) runningPod, err := client.CoreV1().Pods(pod.Namespace).Get(context.TODO(), pod.Name, metav1.GetOptions{}) framework.ExpectNoError(err, "get pod") actualNodeName := runningPod.Spec.NodeName @@ -500,7 +535,7 @@ func PVWriteReadSingleNodeCheck(client clientset.Interface, claim *v1.Persistent if framework.NodeOSDistroIs("windows") { command = "select-string 'hello world' /mnt/test/data" } - RunInPodWithVolume(client, claim.Namespace, claim.Name, "pvc-volume-tester-reader", command, e2epod.NodeSelection{Name: actualNodeName}) + RunInPodWithVolume(client, timeouts, claim.Namespace, claim.Name, "pvc-volume-tester-reader", command, e2epod.NodeSelection{Name: actualNodeName}) return e2evolume } @@ -519,7 +554,7 @@ func PVWriteReadSingleNodeCheck(client clientset.Interface, claim *v1.Persistent // persistent across pods and across nodes. // // This is a common test that can be called from a StorageClassTest.PvCheck. -func PVMultiNodeCheck(client clientset.Interface, claim *v1.PersistentVolumeClaim, node e2epod.NodeSelection) { +func PVMultiNodeCheck(client clientset.Interface, timeouts *framework.TimeoutContext, claim *v1.PersistentVolumeClaim, node e2epod.NodeSelection) { framework.ExpectEqual(node.Name, "", "this test only works when not locked onto a single node") var pod *v1.Pod @@ -531,7 +566,7 @@ func PVMultiNodeCheck(client clientset.Interface, claim *v1.PersistentVolumeClai ginkgo.By(fmt.Sprintf("checking the created volume is writable on node %+v", node)) command := "echo 'hello world' > /mnt/test/data" pod = StartInPodWithVolume(client, claim.Namespace, claim.Name, "pvc-writer-node1", command, node) - framework.ExpectNoError(e2epod.WaitForPodSuccessInNamespaceSlow(client, pod.Name, pod.Namespace)) + framework.ExpectNoError(e2epod.WaitForPodSuccessInNamespaceTimeout(client, pod.Name, pod.Namespace, timeouts.PodStartSlow)) runningPod, err := client.CoreV1().Pods(pod.Namespace).Get(context.TODO(), pod.Name, metav1.GetOptions{}) framework.ExpectNoError(err, "get pod") actualNodeName := runningPod.Spec.NodeName @@ -547,7 +582,7 @@ func PVMultiNodeCheck(client clientset.Interface, claim *v1.PersistentVolumeClai command = "select-string 'hello world' /mnt/test/data" } pod = StartInPodWithVolume(client, claim.Namespace, claim.Name, "pvc-reader-node2", command, secondNode) - framework.ExpectNoError(e2epod.WaitForPodSuccessInNamespaceSlow(client, pod.Name, pod.Namespace)) + framework.ExpectNoError(e2epod.WaitForPodSuccessInNamespaceTimeout(client, pod.Name, pod.Namespace, timeouts.PodStartSlow)) runningPod, err = client.CoreV1().Pods(pod.Namespace).Get(context.TODO(), pod.Name, metav1.GetOptions{}) framework.ExpectNoError(err, "get pod") framework.ExpectNotEqual(runningPod.Spec.NodeName, actualNodeName, "second pod should have run on a different node") @@ -565,7 +600,7 @@ func (t StorageClassTest) TestBindingWaitForFirstConsumerMultiPVC(claims []*v1.P class, err := t.Client.StorageV1().StorageClasses().Create(context.TODO(), t.Class, metav1.CreateOptions{}) framework.ExpectNoError(err) defer func() { - err = deleteStorageClass(t.Client, class.Name) + err = storageutils.DeleteStorageClass(t.Client, class.Name) framework.ExpectNoError(err, "While deleting storage class") }() @@ -595,7 +630,7 @@ func (t StorageClassTest) TestBindingWaitForFirstConsumerMultiPVC(claims []*v1.P // Wait for ClaimProvisionTimeout (across all PVCs in parallel) and make sure the phase did not become Bound i.e. the Wait errors out ginkgo.By("checking the claims are in pending state") - err = e2epv.WaitForPersistentVolumeClaimsPhase(v1.ClaimBound, t.Client, namespace, claimNames, 2*time.Second /* Poll */, framework.ClaimProvisionShortTimeout, true) + err = e2epv.WaitForPersistentVolumeClaimsPhase(v1.ClaimBound, t.Client, namespace, claimNames, 2*time.Second /* Poll */, t.Timeouts.ClaimProvisionShort, true) framework.ExpectError(err) verifyPVCsPending(t.Client, createdClaims) @@ -610,7 +645,7 @@ func (t StorageClassTest) TestBindingWaitForFirstConsumerMultiPVC(claims []*v1.P framework.ExpectNoError(err) defer func() { e2epod.DeletePodOrFail(t.Client, pod.Namespace, pod.Name) - e2epod.WaitForPodToDisappear(t.Client, pod.Namespace, pod.Name, labels.Everything(), framework.Poll, framework.PodDeleteTimeout) + e2epod.WaitForPodToDisappear(t.Client, pod.Namespace, pod.Name, labels.Everything(), framework.Poll, t.Timeouts.PodDelete) }() if expectUnschedulable { // Verify that no claims are provisioned. @@ -629,7 +664,7 @@ func (t StorageClassTest) TestBindingWaitForFirstConsumerMultiPVC(claims []*v1.P claim, err = t.Client.CoreV1().PersistentVolumeClaims(claim.Namespace).Get(context.TODO(), claim.Name, metav1.GetOptions{}) framework.ExpectNoError(err) // make sure claim did bind - err = e2epv.WaitForPersistentVolumeClaimPhase(v1.ClaimBound, t.Client, claim.Namespace, claim.Name, framework.Poll, framework.ClaimProvisionTimeout) + err = e2epv.WaitForPersistentVolumeClaimPhase(v1.ClaimBound, t.Client, claim.Namespace, claim.Name, framework.Poll, t.Timeouts.ClaimProvision) framework.ExpectNoError(err) pv, err := t.Client.CoreV1().PersistentVolumes().Get(context.TODO(), claim.Spec.VolumeName, metav1.GetOptions{}) @@ -642,10 +677,14 @@ func (t StorageClassTest) TestBindingWaitForFirstConsumerMultiPVC(claims []*v1.P // RunInPodWithVolume runs a command in a pod with given claim mounted to /mnt directory. // It starts, checks, collects output and stops it. -func RunInPodWithVolume(c clientset.Interface, ns, claimName, podName, command string, node e2epod.NodeSelection) { +func RunInPodWithVolume(c clientset.Interface, t *framework.TimeoutContext, ns, claimName, podName, command string, node e2epod.NodeSelection) *v1.Pod { pod := StartInPodWithVolume(c, ns, claimName, podName, command, node) defer StopPod(c, pod) - framework.ExpectNoError(e2epod.WaitForPodSuccessInNamespaceSlow(c, pod.Name, pod.Namespace)) + framework.ExpectNoError(e2epod.WaitForPodSuccessInNamespaceTimeout(c, pod.Name, pod.Namespace, t.PodStartSlow)) + // get the latest status of the pod + pod, err := c.CoreV1().Pods(pod.Namespace).Get(context.TODO(), pod.Name, metav1.GetOptions{}) + framework.ExpectNoError(err) + return pod } // StartInPodWithVolume starts a command in a pod with given claim mounted to /mnt directory @@ -666,8 +705,8 @@ func StartInPodWithVolume(c clientset.Interface, ns, claimName, podName, command Containers: []v1.Container{ { Name: "volume-tester", - Image: e2evolume.GetDefaultTestImage(), - Command: e2evolume.GenerateScriptCmd(command), + Image: e2epod.GetDefaultTestImage(), + Command: e2epod.GenerateScriptCmd(command), VolumeMounts: []v1.VolumeMount{ { Name: "my-volume", @@ -715,7 +754,7 @@ func StopPod(c clientset.Interface, pod *v1.Pod) { // StopPodAndDependents first tries to log the output of the pod's container, // then deletes the pod and waits for that to succeed. Also waits for all owned // resources to be deleted. -func StopPodAndDependents(c clientset.Interface, pod *v1.Pod) { +func StopPodAndDependents(c clientset.Interface, timeouts *framework.TimeoutContext, pod *v1.Pod) { if pod == nil { return } @@ -762,14 +801,14 @@ func StopPodAndDependents(c clientset.Interface, pod *v1.Pod) { } framework.Logf("pod Delete API error: %v", err) } - framework.Logf("Wait up to %v for pod %q to be fully deleted", e2epod.PodDeleteTimeout, pod.Name) - e2epod.WaitForPodNotFoundInNamespace(c, pod.Name, pod.Namespace, e2epod.PodDeleteTimeout) + framework.Logf("Wait up to %v for pod %q to be fully deleted", timeouts.PodDelete, pod.Name) + e2epod.WaitForPodNotFoundInNamespace(c, pod.Name, pod.Namespace, timeouts.PodDelete) if len(podPVs) > 0 { for _, pv := range podPVs { // As with CSI inline volumes, we use the pod delete timeout here because conceptually // the volume deletion needs to be that fast (whatever "that" is). - framework.Logf("Wait up to %v for pod PV %s to be fully deleted", e2epod.PodDeleteTimeout, pv.Name) - e2epv.WaitForPersistentVolumeDeleted(c, pv.Name, 5*time.Second, e2epod.PodDeleteTimeout) + framework.Logf("Wait up to %v for pod PV %s to be fully deleted", timeouts.PodDelete, pv.Name) + e2epv.WaitForPersistentVolumeDeleted(c, pv.Name, 5*time.Second, timeouts.PodDelete) } } } @@ -786,22 +825,17 @@ func verifyPVCsPending(client clientset.Interface, pvcs []*v1.PersistentVolumeCl func prepareSnapshotDataSourceForProvisioning( f *framework.Framework, config e2evolume.TestConfig, - perTestConfig *PerTestConfig, - pattern testpatterns.TestPattern, + perTestConfig *storageframework.PerTestConfig, + pattern storageframework.TestPattern, client clientset.Interface, dynamicClient dynamic.Interface, initClaim *v1.PersistentVolumeClaim, class *storagev1.StorageClass, - sDriver SnapshottableTestDriver, + sDriver storageframework.SnapshottableTestDriver, mode v1.PersistentVolumeMode, injectContent string, ) (*v1.TypedLocalObjectReference, func()) { - var err error - if class != nil { - ginkgo.By("[Initialize dataSource]creating a StorageClass " + class.Name) - _, err = client.StorageV1().StorageClasses().Create(context.TODO(), class, metav1.CreateOptions{}) - framework.ExpectNoError(err) - } + _, clearComputedStorageClass := SetupStorageClass(client, class) ginkgo.By("[Initialize dataSource]creating a initClaim") updatedClaim, err := client.CoreV1().PersistentVolumeClaims(initClaim.Namespace).Create(context.TODO(), initClaim, metav1.CreateOptions{}) @@ -810,7 +844,7 @@ func prepareSnapshotDataSourceForProvisioning( // write namespace to the /mnt/test (= the volume). tests := []e2evolume.Test{ { - Volume: *createVolumeSource(updatedClaim.Name, false /* readOnly */), + Volume: *storageutils.CreateVolumeSource(updatedClaim.Name, false /* readOnly */), Mode: mode, File: "index.html", ExpectedContent: injectContent, @@ -818,7 +852,8 @@ func prepareSnapshotDataSourceForProvisioning( } e2evolume.InjectContent(f, config, nil, "", tests) - snapshotResource := CreateSnapshotResource(sDriver, perTestConfig, pattern, updatedClaim.GetName(), updatedClaim.GetNamespace()) + parameters := map[string]string{} + snapshotResource := storageframework.CreateSnapshotResource(sDriver, perTestConfig, pattern, updatedClaim.GetName(), updatedClaim.GetNamespace(), f.Timeouts, parameters) group := "snapshot.storage.k8s.io" dataSourceRef := &v1.TypedLocalObjectReference{ @@ -834,14 +869,11 @@ func prepareSnapshotDataSourceForProvisioning( framework.Failf("Error deleting initClaim %q. Error: %v", updatedClaim.Name, err) } - err = snapshotResource.CleanupResource() + err = snapshotResource.CleanupResource(f.Timeouts) framework.ExpectNoError(err) - ginkgo.By("deleting StorageClass " + class.Name) - err = client.StorageV1().StorageClasses().Delete(context.TODO(), class.GetName(), metav1.DeleteOptions{}) - if err != nil && !apierrors.IsNotFound(err) { - framework.Failf("Error deleting storage class %q. Error: %v", class.GetName(), err) - } + clearComputedStorageClass() + } return dataSourceRef, cleanupFunc @@ -856,12 +888,7 @@ func preparePVCDataSourceForProvisioning( mode v1.PersistentVolumeMode, injectContent string, ) (*v1.TypedLocalObjectReference, func()) { - var err error - if class != nil { - ginkgo.By("[Initialize dataSource]creating a StorageClass " + class.Name) - class, err = client.StorageV1().StorageClasses().Create(context.TODO(), class, metav1.CreateOptions{}) - framework.ExpectNoError(err) - } + _, clearComputedStorageClass := SetupStorageClass(client, class) ginkgo.By("[Initialize dataSource]creating a source PVC") sourcePVC, err := client.CoreV1().PersistentVolumeClaims(source.Namespace).Create(context.TODO(), source, metav1.CreateOptions{}) @@ -869,7 +896,7 @@ func preparePVCDataSourceForProvisioning( tests := []e2evolume.Test{ { - Volume: *createVolumeSource(sourcePVC.Name, false /* readOnly */), + Volume: *storageutils.CreateVolumeSource(sourcePVC.Name, false /* readOnly */), Mode: mode, File: "index.html", ExpectedContent: injectContent, @@ -888,13 +915,8 @@ func preparePVCDataSourceForProvisioning( if err != nil && !apierrors.IsNotFound(err) { framework.Failf("Error deleting source PVC %q. Error: %v", sourcePVC.Name, err) } - if class != nil { - framework.Logf("deleting class %q", class.Name) - err := client.StorageV1().StorageClasses().Delete(context.TODO(), class.Name, metav1.DeleteOptions{}) - if err != nil && !apierrors.IsNotFound(err) { - framework.Failf("Error deleting storage class %q. Error: %v", class.Name, err) - } - } + + clearComputedStorageClass() } return dataSourceRef, cleanupFunc diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/snapshottable.go b/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/snapshottable.go index 15c2286d09b9..87b5f1393fe7 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/snapshottable.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/snapshottable.go @@ -19,18 +19,17 @@ package testsuites import ( "context" "fmt" + "strings" "time" "github.com/onsi/ginkgo" + "github.com/onsi/gomega" v1 "k8s.io/api/core/v1" storagev1 "k8s.io/api/storage/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/runtime/schema" - utilerrors "k8s.io/apimachinery/pkg/util/errors" - "k8s.io/apimachinery/pkg/util/uuid" "k8s.io/client-go/dynamic" clientset "k8s.io/client-go/kubernetes" "k8s.io/kubernetes/test/e2e/framework" @@ -38,50 +37,30 @@ import ( e2epv "k8s.io/kubernetes/test/e2e/framework/pv" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" e2evolume "k8s.io/kubernetes/test/e2e/framework/volume" - "k8s.io/kubernetes/test/e2e/storage/testpatterns" + storageframework "k8s.io/kubernetes/test/e2e/storage/framework" "k8s.io/kubernetes/test/e2e/storage/utils" + storageutils "k8s.io/kubernetes/test/e2e/storage/utils" ) -// snapshot CRD api group -const snapshotGroup = "snapshot.storage.k8s.io" - -// snapshot CRD api version -const snapshotAPIVersion = "snapshot.storage.k8s.io/v1" - // data file name const datapath = "/mnt/test/data" -var ( - // SnapshotGVR is GroupVersionResource for volumesnapshots - SnapshotGVR = schema.GroupVersionResource{Group: snapshotGroup, Version: "v1", Resource: "volumesnapshots"} - // SnapshotClassGVR is GroupVersionResource for volumesnapshotclasses - SnapshotClassGVR = schema.GroupVersionResource{Group: snapshotGroup, Version: "v1", Resource: "volumesnapshotclasses"} - // SnapshotContentGVR is GroupVersionResource for volumesnapshotcontents - SnapshotContentGVR = schema.GroupVersionResource{Group: snapshotGroup, Version: "v1", Resource: "volumesnapshotcontents"} -) - type snapshottableTestSuite struct { - tsInfo TestSuiteInfo + tsInfo storageframework.TestSuiteInfo } -var _ TestSuite = &snapshottableTestSuite{} - var ( - sDriver SnapshottableTestDriver - dDriver DynamicPVTestDriver + sDriver storageframework.SnapshottableTestDriver + dDriver storageframework.DynamicPVTestDriver ) -// InitSnapshottableTestSuite returns snapshottableTestSuite that implements TestSuite interface -func InitSnapshottableTestSuite() TestSuite { +// InitCustomSnapshottableTestSuite returns snapshottableTestSuite that implements TestSuite interface +// using custom test patterns +func InitCustomSnapshottableTestSuite(patterns []storageframework.TestPattern) storageframework.TestSuite { return &snapshottableTestSuite{ - tsInfo: TestSuiteInfo{ - Name: "snapshottable", - TestPatterns: []testpatterns.TestPattern{ - testpatterns.DynamicSnapshotDelete, - testpatterns.DynamicSnapshotRetain, - testpatterns.PreprovisionedSnapshotDelete, - testpatterns.PreprovisionedSnapshotRetain, - }, + tsInfo: storageframework.TestSuiteInfo{ + Name: "snapshottable", + TestPatterns: patterns, SupportedSizeRange: e2evolume.SizeRange{ Min: "1Mi", }, @@ -90,38 +69,46 @@ func InitSnapshottableTestSuite() TestSuite { } } -func (s *snapshottableTestSuite) GetTestSuiteInfo() TestSuiteInfo { +// InitSnapshottableTestSuite returns snapshottableTestSuite that implements TestSuite interface +// using testsuite default patterns +func InitSnapshottableTestSuite() storageframework.TestSuite { + patterns := []storageframework.TestPattern{ + storageframework.DynamicSnapshotDelete, + storageframework.DynamicSnapshotRetain, + storageframework.PreprovisionedSnapshotDelete, + storageframework.PreprovisionedSnapshotRetain, + } + return InitCustomSnapshottableTestSuite(patterns) +} + +func (s *snapshottableTestSuite) GetTestSuiteInfo() storageframework.TestSuiteInfo { return s.tsInfo } -func (s *snapshottableTestSuite) SkipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) { +func (s *snapshottableTestSuite) SkipUnsupportedTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) { + // Check preconditions. + dInfo := driver.GetDriverInfo() + ok := false + _, ok = driver.(storageframework.SnapshottableTestDriver) + if !dInfo.Capabilities[storageframework.CapSnapshotDataSource] || !ok { + e2eskipper.Skipf("Driver %q does not support snapshots - skipping", dInfo.Name) + } + _, ok = driver.(storageframework.DynamicPVTestDriver) + if !ok { + e2eskipper.Skipf("Driver %q does not support dynamic provisioning - skipping", driver.GetDriverInfo().Name) + } } -func (s *snapshottableTestSuite) DefineTests(driver TestDriver, pattern testpatterns.TestPattern) { - ginkgo.BeforeEach(func() { - // Check preconditions. - dInfo := driver.GetDriverInfo() - ok := false - sDriver, ok = driver.(SnapshottableTestDriver) - if !dInfo.Capabilities[CapSnapshotDataSource] || !ok { - e2eskipper.Skipf("Driver %q does not support snapshots - skipping", dInfo.Name) - } - dDriver, ok = driver.(DynamicPVTestDriver) - if !ok { - e2eskipper.Skipf("Driver %q does not support dynamic provisioning - skipping", driver.GetDriverInfo().Name) - } - }) +func (s *snapshottableTestSuite) DefineTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) { - // This intentionally comes after checking the preconditions because it - // registers its own BeforeEach which creates the namespace. Beware that it - // also registers an AfterEach which renders f unusable. Any code using + // Beware that it also registers an AfterEach which renders f unusable. Any code using // f must run inside an It or Context callback. f := framework.NewDefaultFramework("snapshotting") ginkgo.Describe("volume snapshot controller", func() { var ( err error - config *PerTestConfig + config *storageframework.PerTestConfig driverCleanup func() cleanupSteps []func() @@ -133,6 +120,8 @@ func (s *snapshottableTestSuite) DefineTests(driver TestDriver, pattern testpatt originalMntTestData string ) init := func() { + sDriver, _ = driver.(storageframework.SnapshottableTestDriver) + dDriver, _ = driver.(storageframework.DynamicPVTestDriver) cleanupSteps = make([]func(), 0) // init snap class, create a source PV, PVC, Pod cs = f.ClientSet @@ -142,33 +131,73 @@ func (s *snapshottableTestSuite) DefineTests(driver TestDriver, pattern testpatt config, driverCleanup = driver.PrepareTest(f) cleanupSteps = append(cleanupSteps, driverCleanup) - var volumeResource *VolumeResource + var volumeResource *storageframework.VolumeResource cleanupSteps = append(cleanupSteps, func() { framework.ExpectNoError(volumeResource.CleanupResource()) }) - volumeResource = CreateVolumeResource(dDriver, config, pattern, s.GetTestSuiteInfo().SupportedSizeRange) + volumeResource = storageframework.CreateVolumeResource(dDriver, config, pattern, s.GetTestSuiteInfo().SupportedSizeRange) pvc = volumeResource.Pvc sc = volumeResource.Sc claimSize = pvc.Spec.Resources.Requests.Storage().String() - ginkgo.By("starting a pod to use the claim") + ginkgo.By("[init] starting a pod to use the claim") originalMntTestData = fmt.Sprintf("hello from %s namespace", pvc.GetNamespace()) command := fmt.Sprintf("echo '%s' > %s", originalMntTestData, datapath) - RunInPodWithVolume(cs, pvc.Namespace, pvc.Name, "pvc-snapshottable-tester", command, config.ClientNodeSelection) + pod := RunInPodWithVolume(cs, f.Timeouts, pvc.Namespace, pvc.Name, "pvc-snapshottable-tester", command, config.ClientNodeSelection) - err = e2epv.WaitForPersistentVolumeClaimPhase(v1.ClaimBound, cs, pvc.Namespace, pvc.Name, framework.Poll, framework.ClaimProvisionTimeout) + err = e2epv.WaitForPersistentVolumeClaimPhase(v1.ClaimBound, cs, pvc.Namespace, pvc.Name, framework.Poll, f.Timeouts.ClaimProvision) framework.ExpectNoError(err) - ginkgo.By("checking the claim") + // Get new copy of the claim + ginkgo.By("[init] checking the claim") pvc, err = cs.CoreV1().PersistentVolumeClaims(pvc.Namespace).Get(context.TODO(), pvc.Name, metav1.GetOptions{}) framework.ExpectNoError(err) // Get the bound PV - ginkgo.By("checking the PV") - _, err = cs.CoreV1().PersistentVolumes().Get(context.TODO(), pvc.Spec.VolumeName, metav1.GetOptions{}) + ginkgo.By("[init] checking the PV") + pv, err := cs.CoreV1().PersistentVolumes().Get(context.TODO(), pvc.Spec.VolumeName, metav1.GetOptions{}) framework.ExpectNoError(err) + + // At this point we know that: + // - a pod was created with a PV that's supposed to have data + // + // However there's a caching issue that @jinxu97 explained and it's related with the pod & volume + // lifecycle in windows, to understand it we first analyze what the volumemanager does: + // - when a pod is delete the volumemanager will try to cleanup the volume mounts + // - NodeUnpublishVolume: unbinds the bind mount from the container + // - Linux: the data is flushed to disk + // - Windows: we delete a symlink, data's not flushed yet to disk + // - NodeUnstageVolume: unmount the global mount + // - Linux: disk is detached + // - Windows: data is flushed to disk and the disk is detached + // + // Pod deletion might not guarantee a data flush to disk, however NodeUnstageVolume adds the logic + // to flush the data to disk (see #81690 for details). + // + // In the following code by checking if the PV is not in the node.Status.VolumesInUse field we + // ensure that the volume is not used by the node anymore (an indicator that NodeUnstageVolume has + // already finished) + if framework.NodeOSDistroIs("windows") { + nodeName := pod.Spec.NodeName + gomega.Expect(nodeName).NotTo(gomega.BeEmpty(), "pod.Spec.NodeName must not be empty") + + ginkgo.By(fmt.Sprintf("[init] waiting until the node=%s is not using the volume=%s", nodeName, pv.Name)) + success := storageutils.WaitUntil(framework.Poll, f.Timeouts.PVDelete, func() bool { + node, err := cs.CoreV1().Nodes().Get(context.TODO(), nodeName, metav1.GetOptions{}) + framework.ExpectNoError(err) + volumesInUse := node.Status.VolumesInUse + framework.Logf("current volumes in use: %+v", volumesInUse) + for i := 0; i < len(volumesInUse); i++ { + if strings.HasSuffix(string(volumesInUse[i]), pv.Name) { + return false + } + } + return true + }) + framework.ExpectEqual(success, true) + } } cleanup := func() { @@ -181,7 +210,7 @@ func (s *snapshottableTestSuite) DefineTests(driver TestDriver, pattern testpatt // Depending on how far the test executed, cleanup accordingly // Execute in reverse order, similar to defer stack for i := len(cleanupSteps) - 1; i >= 0; i-- { - err := tryFunc(cleanupSteps[i]) + err := storageutils.TryFunc(cleanupSteps[i]) framework.ExpectNoError(err, "while running cleanup steps") } @@ -201,25 +230,26 @@ func (s *snapshottableTestSuite) DefineTests(driver TestDriver, pattern testpatt ) ginkgo.BeforeEach(func() { - var sr *SnapshotResource + var sr *storageframework.SnapshotResource cleanupSteps = append(cleanupSteps, func() { - framework.ExpectNoError(sr.CleanupResource()) + framework.ExpectNoError(sr.CleanupResource(f.Timeouts)) }) - sr = CreateSnapshotResource(sDriver, config, pattern, pvc.GetName(), pvc.GetNamespace()) + parameters := map[string]string{} + sr = storageframework.CreateSnapshotResource(sDriver, config, pattern, pvc.GetName(), pvc.GetNamespace(), f.Timeouts, parameters) vs = sr.Vs vscontent = sr.Vscontent vsc = sr.Vsclass }) ginkgo.It("should check snapshot fields, check restore correctly works after modifying source data, check deletion", func() { - ginkgo.By("checking the snapshot") // Get new copy of the snapshot - vs, err = dc.Resource(SnapshotGVR).Namespace(vs.GetNamespace()).Get(context.TODO(), vs.GetName(), metav1.GetOptions{}) + ginkgo.By("checking the snapshot") + vs, err = dc.Resource(storageutils.SnapshotGVR).Namespace(vs.GetNamespace()).Get(context.TODO(), vs.GetName(), metav1.GetOptions{}) framework.ExpectNoError(err) // Get the bound snapshotContent snapshotStatus := vs.Object["status"].(map[string]interface{}) snapshotContentName := snapshotStatus["boundVolumeSnapshotContentName"].(string) - vscontent, err = dc.Resource(SnapshotContentGVR).Get(context.TODO(), snapshotContentName, metav1.GetOptions{}) + vscontent, err = dc.Resource(storageutils.SnapshotContentGVR).Get(context.TODO(), snapshotContentName, metav1.GetOptions{}) framework.ExpectNoError(err) snapshotContentSpec := vscontent.Object["spec"].(map[string]interface{}) @@ -228,7 +258,7 @@ func (s *snapshottableTestSuite) DefineTests(driver TestDriver, pattern testpatt // Check SnapshotContent properties ginkgo.By("checking the SnapshotContent") // PreprovisionedCreatedSnapshot do not need to set volume snapshot class name - if pattern.SnapshotType != testpatterns.PreprovisionedCreatedSnapshot { + if pattern.SnapshotType != storageframework.PreprovisionedCreatedSnapshot { framework.ExpectEqual(snapshotContentSpec["volumeSnapshotClassName"], vsc.GetName()) } framework.ExpectEqual(volumeSnapshotRef["name"], vs.GetName()) @@ -242,7 +272,7 @@ func (s *snapshottableTestSuite) DefineTests(driver TestDriver, pattern testpatt ginkgo.By("modifying the data in the source PVC") command := fmt.Sprintf("echo '%s' > %s", modifiedMntTestData, datapath) - RunInPodWithVolume(cs, pvc.Namespace, pvc.Name, "pvc-snapshottable-data-tester", command, config.ClientNodeSelection) + RunInPodWithVolume(cs, f.Timeouts, pvc.Namespace, pvc.Name, "pvc-snapshottable-data-tester", command, config.ClientNodeSelection) ginkgo.By("creating a pvc from the snapshot") restoredPVC = e2epv.MakePersistentVolumeClaim(e2epv.PersistentVolumeClaimConfig{ @@ -275,322 +305,35 @@ func (s *snapshottableTestSuite) DefineTests(driver TestDriver, pattern testpatt cleanupSteps = append(cleanupSteps, func() { StopPod(cs, restoredPod) }) - framework.ExpectNoError(e2epod.WaitForPodRunningInNamespaceSlow(cs, restoredPod.Name, restoredPod.Namespace)) + framework.ExpectNoError(e2epod.WaitTimeoutForPodRunningInNamespace(cs, restoredPod.Name, restoredPod.Namespace, f.Timeouts.PodStartSlow)) commands := e2evolume.GenerateReadFileCmd(datapath) _, err = framework.LookForStringInPodExec(restoredPod.Namespace, restoredPod.Name, commands, originalMntTestData, time.Minute) framework.ExpectNoError(err) ginkgo.By("should delete the VolumeSnapshotContent according to its deletion policy") - err = DeleteAndWaitSnapshot(dc, vs.GetNamespace(), vs.GetName(), framework.Poll, framework.SnapshotDeleteTimeout) + + // Delete both Snapshot and PVC at the same time because different storage systems + // have different ordering of deletion. Some may require delete PVC first before + // Snapshot deletion and some are opposite. + err = storageutils.DeleteSnapshotWithoutWaiting(dc, vs.GetNamespace(), vs.GetName()) + framework.ExpectNoError(err) + err = cs.CoreV1().PersistentVolumeClaims(restoredPVC.Namespace).Delete(context.TODO(), restoredPVC.Name, metav1.DeleteOptions{}) framework.ExpectNoError(err) + // Wait for the Snapshot to be actually deleted from API server + err = storageutils.WaitForNamespacedGVRDeletion(dc, storageutils.SnapshotGVR, vs.GetNamespace(), vs.GetNamespace(), framework.Poll, f.Timeouts.SnapshotDelete) + switch pattern.SnapshotDeletionPolicy { - case testpatterns.DeleteSnapshot: + case storageframework.DeleteSnapshot: ginkgo.By("checking the SnapshotContent has been deleted") - err = utils.WaitForGVRDeletion(dc, SnapshotContentGVR, vscontent.GetName(), framework.Poll, framework.SnapshotDeleteTimeout) + err = utils.WaitForGVRDeletion(dc, storageutils.SnapshotContentGVR, vscontent.GetName(), framework.Poll, f.Timeouts.SnapshotDelete) framework.ExpectNoError(err) - case testpatterns.RetainSnapshot: + case storageframework.RetainSnapshot: ginkgo.By("checking the SnapshotContent has not been deleted") - err = utils.WaitForGVRDeletion(dc, SnapshotContentGVR, vscontent.GetName(), 1*time.Second /* poll */, 30*time.Second /* timeout */) + err = utils.WaitForGVRDeletion(dc, storageutils.SnapshotContentGVR, vscontent.GetName(), 1*time.Second /* poll */, 30*time.Second /* timeout */) framework.ExpectError(err) } }) }) }) } - -// WaitForSnapshotReady waits for a VolumeSnapshot to be ready to use or until timeout occurs, whichever comes first. -func WaitForSnapshotReady(c dynamic.Interface, ns string, snapshotName string, poll, timeout time.Duration) error { - framework.Logf("Waiting up to %v for VolumeSnapshot %s to become ready", timeout, snapshotName) - - if successful := utils.WaitUntil(poll, timeout, func() bool { - snapshot, err := c.Resource(SnapshotGVR).Namespace(ns).Get(context.TODO(), snapshotName, metav1.GetOptions{}) - if err != nil { - framework.Logf("Failed to get snapshot %q, retrying in %v. Error: %v", snapshotName, poll, err) - return false - } - - status := snapshot.Object["status"] - if status == nil { - framework.Logf("VolumeSnapshot %s found but is not ready.", snapshotName) - return false - } - value := status.(map[string]interface{}) - if value["readyToUse"] == true { - framework.Logf("VolumeSnapshot %s found and is ready", snapshotName) - return true - } - - framework.Logf("VolumeSnapshot %s found but is not ready.", snapshotName) - return false - }); successful { - return nil - } - - return fmt.Errorf("VolumeSnapshot %s is not ready within %v", snapshotName, timeout) -} - -// DeleteAndWaitSnapshot deletes a VolumeSnapshot and waits for it to be deleted or until timeout occurs, whichever comes first -func DeleteAndWaitSnapshot(dc dynamic.Interface, ns string, snapshotName string, poll, timeout time.Duration) error { - var err error - ginkgo.By("deleting the snapshot") - err = dc.Resource(SnapshotGVR).Namespace(ns).Delete(context.TODO(), snapshotName, metav1.DeleteOptions{}) - if err != nil && !apierrors.IsNotFound(err) { - return err - } - - ginkgo.By("checking the Snapshot has been deleted") - err = utils.WaitForNamespacedGVRDeletion(dc, SnapshotGVR, ns, snapshotName, poll, timeout) - - return err -} - -// SnapshotResource represents a snapshot class, a snapshot and its bound snapshot contents for a specific test case -type SnapshotResource struct { - Config *PerTestConfig - Pattern testpatterns.TestPattern - - Vs *unstructured.Unstructured - Vscontent *unstructured.Unstructured - Vsclass *unstructured.Unstructured -} - -// CreateSnapshot creates a VolumeSnapshotClass with given SnapshotDeletionPolicy and a VolumeSnapshot -// from the VolumeSnapshotClass using a dynamic client. -// Returns the unstructured VolumeSnapshotClass and VolumeSnapshot objects. -func CreateSnapshot(sDriver SnapshottableTestDriver, config *PerTestConfig, pattern testpatterns.TestPattern, pvcName string, pvcNamespace string) (*unstructured.Unstructured, *unstructured.Unstructured) { - defer ginkgo.GinkgoRecover() - var err error - if pattern.SnapshotType != testpatterns.DynamicCreatedSnapshot && pattern.SnapshotType != testpatterns.PreprovisionedCreatedSnapshot { - err = fmt.Errorf("SnapshotType must be set to either DynamicCreatedSnapshot or PreprovisionedCreatedSnapshot") - framework.ExpectNoError(err) - } - dc := config.Framework.DynamicClient - - ginkgo.By("creating a SnapshotClass") - sclass := sDriver.GetSnapshotClass(config) - if sclass == nil { - framework.Failf("Failed to get snapshot class based on test config") - } - sclass.Object["deletionPolicy"] = pattern.SnapshotDeletionPolicy.String() - - sclass, err = dc.Resource(SnapshotClassGVR).Create(context.TODO(), sclass, metav1.CreateOptions{}) - framework.ExpectNoError(err) - - sclass, err = dc.Resource(SnapshotClassGVR).Get(context.TODO(), sclass.GetName(), metav1.GetOptions{}) - framework.ExpectNoError(err) - - ginkgo.By("creating a dynamic VolumeSnapshot") - // prepare a dynamically provisioned volume snapshot with certain data - snapshot := getSnapshot(pvcName, pvcNamespace, sclass.GetName()) - - snapshot, err = dc.Resource(SnapshotGVR).Namespace(snapshot.GetNamespace()).Create(context.TODO(), snapshot, metav1.CreateOptions{}) - framework.ExpectNoError(err) - - return sclass, snapshot -} - -// GetSnapshotContentFromSnapshot returns the VolumeSnapshotContent object Bound to a -// given VolumeSnapshot -func GetSnapshotContentFromSnapshot(dc dynamic.Interface, snapshot *unstructured.Unstructured) *unstructured.Unstructured { - defer ginkgo.GinkgoRecover() - err := WaitForSnapshotReady(dc, snapshot.GetNamespace(), snapshot.GetName(), framework.Poll, framework.SnapshotCreateTimeout) - framework.ExpectNoError(err) - - vs, err := dc.Resource(SnapshotGVR).Namespace(snapshot.GetNamespace()).Get(context.TODO(), snapshot.GetName(), metav1.GetOptions{}) - - snapshotStatus := vs.Object["status"].(map[string]interface{}) - snapshotContentName := snapshotStatus["boundVolumeSnapshotContentName"].(string) - framework.Logf("received snapshotStatus %v", snapshotStatus) - framework.Logf("snapshotContentName %s", snapshotContentName) - framework.ExpectNoError(err) - - vscontent, err := dc.Resource(SnapshotContentGVR).Get(context.TODO(), snapshotContentName, metav1.GetOptions{}) - framework.ExpectNoError(err) - - return vscontent - -} - -// CreateSnapshotResource creates a snapshot resource for the current test. It knows how to deal with -// different test pattern snapshot provisioning and deletion policy -func CreateSnapshotResource(sDriver SnapshottableTestDriver, config *PerTestConfig, pattern testpatterns.TestPattern, pvcName string, pvcNamespace string) *SnapshotResource { - var err error - r := SnapshotResource{ - Config: config, - Pattern: pattern, - } - r.Vsclass, r.Vs = CreateSnapshot(sDriver, config, pattern, pvcName, pvcNamespace) - - dc := r.Config.Framework.DynamicClient - - r.Vscontent = GetSnapshotContentFromSnapshot(dc, r.Vs) - - if pattern.SnapshotType == testpatterns.PreprovisionedCreatedSnapshot { - // prepare a pre-provisioned VolumeSnapshotContent with certain data - // Because this could be run with an external CSI driver, we have no way - // to pre-provision the snapshot as we normally would using their API. - // We instead dynamically take a snapshot (above step), delete the old snapshot, - // and create another snapshot using the first snapshot's snapshot handle. - - ginkgo.By("updating the snapshot content deletion policy to retain") - r.Vscontent.Object["spec"].(map[string]interface{})["deletionPolicy"] = "Retain" - - r.Vscontent, err = dc.Resource(SnapshotContentGVR).Update(context.TODO(), r.Vscontent, metav1.UpdateOptions{}) - framework.ExpectNoError(err) - - ginkgo.By("recording the volume handle and snapshotHandle") - snapshotHandle := r.Vscontent.Object["status"].(map[string]interface{})["snapshotHandle"].(string) - framework.Logf("Recording snapshot handle: %s", snapshotHandle) - csiDriverName := r.Vsclass.Object["driver"].(string) - - // If the deletion policy is retain on vscontent: - // when vs is deleted vscontent will not be deleted - // when the vscontent is manually deleted then the underlying snapshot resource will not be deleted. - // We exploit this to create a snapshot resource from which we can create a preprovisioned snapshot - ginkgo.By("deleting the snapshot and snapshot content") - err = dc.Resource(SnapshotGVR).Namespace(r.Vs.GetNamespace()).Delete(context.TODO(), r.Vs.GetName(), metav1.DeleteOptions{}) - if apierrors.IsNotFound(err) { - err = nil - } - framework.ExpectNoError(err) - - ginkgo.By("checking the Snapshot has been deleted") - err = utils.WaitForNamespacedGVRDeletion(dc, SnapshotGVR, r.Vs.GetName(), r.Vs.GetNamespace(), framework.Poll, framework.SnapshotDeleteTimeout) - framework.ExpectNoError(err) - - err = dc.Resource(SnapshotContentGVR).Delete(context.TODO(), r.Vscontent.GetName(), metav1.DeleteOptions{}) - if apierrors.IsNotFound(err) { - err = nil - } - framework.ExpectNoError(err) - - ginkgo.By("checking the Snapshot content has been deleted") - err = utils.WaitForGVRDeletion(dc, SnapshotContentGVR, r.Vscontent.GetName(), framework.Poll, framework.SnapshotDeleteTimeout) - framework.ExpectNoError(err) - - ginkgo.By("creating a snapshot content with the snapshot handle") - uuid := uuid.NewUUID() - - snapName := getPreProvisionedSnapshotName(uuid) - snapcontentName := getPreProvisionedSnapshotContentName(uuid) - - r.Vscontent = getPreProvisionedSnapshotContent(snapcontentName, snapName, pvcNamespace, snapshotHandle, pattern.SnapshotDeletionPolicy.String(), csiDriverName) - r.Vscontent, err = dc.Resource(SnapshotContentGVR).Create(context.TODO(), r.Vscontent, metav1.CreateOptions{}) - framework.ExpectNoError(err) - - ginkgo.By("creating a snapshot with that snapshot content") - r.Vs = getPreProvisionedSnapshot(snapName, pvcNamespace, snapcontentName) - r.Vs, err = dc.Resource(SnapshotGVR).Namespace(r.Vs.GetNamespace()).Create(context.TODO(), r.Vs, metav1.CreateOptions{}) - framework.ExpectNoError(err) - - err = WaitForSnapshotReady(dc, r.Vs.GetNamespace(), r.Vs.GetName(), framework.Poll, framework.SnapshotCreateTimeout) - framework.ExpectNoError(err) - - ginkgo.By("getting the snapshot and snapshot content") - r.Vs, err = dc.Resource(SnapshotGVR).Namespace(r.Vs.GetNamespace()).Get(context.TODO(), r.Vs.GetName(), metav1.GetOptions{}) - framework.ExpectNoError(err) - - r.Vscontent, err = dc.Resource(SnapshotContentGVR).Get(context.TODO(), r.Vscontent.GetName(), metav1.GetOptions{}) - framework.ExpectNoError(err) - } - return &r -} - -// CleanupResource cleans up the snapshot resource and ignores not found errors -func (sr *SnapshotResource) CleanupResource() error { - var err error - var cleanupErrs []error - - dc := sr.Config.Framework.DynamicClient - - if sr.Vs != nil { - framework.Logf("deleting snapshot %q/%q", sr.Vs.GetNamespace(), sr.Vs.GetName()) - - sr.Vs, err = dc.Resource(SnapshotGVR).Namespace(sr.Vs.GetNamespace()).Get(context.TODO(), sr.Vs.GetName(), metav1.GetOptions{}) - switch { - case err == nil: - snapshotStatus := sr.Vs.Object["status"].(map[string]interface{}) - snapshotContentName := snapshotStatus["boundVolumeSnapshotContentName"].(string) - framework.Logf("received snapshotStatus %v", snapshotStatus) - framework.Logf("snapshotContentName %s", snapshotContentName) - - boundVsContent, err := dc.Resource(SnapshotContentGVR).Get(context.TODO(), snapshotContentName, metav1.GetOptions{}) - switch { - case err == nil: - if boundVsContent.Object["spec"].(map[string]interface{})["deletionPolicy"] != "Delete" { - // The purpose of this block is to prevent physical snapshotContent leaks. - // We must update the SnapshotContent to have Delete Deletion policy, - // or else the physical snapshot content will be leaked. - boundVsContent.Object["spec"].(map[string]interface{})["deletionPolicy"] = "Delete" - boundVsContent, err = dc.Resource(SnapshotContentGVR).Update(context.TODO(), boundVsContent, metav1.UpdateOptions{}) - framework.ExpectNoError(err) - } - err = dc.Resource(SnapshotGVR).Namespace(sr.Vs.GetNamespace()).Delete(context.TODO(), sr.Vs.GetName(), metav1.DeleteOptions{}) - if apierrors.IsNotFound(err) { - err = nil - } - framework.ExpectNoError(err) - - err = utils.WaitForGVRDeletion(dc, SnapshotContentGVR, boundVsContent.GetName(), framework.Poll, framework.SnapshotDeleteTimeout) - framework.ExpectNoError(err) - - case apierrors.IsNotFound(err): - // the volume snapshot is not bound to snapshot content yet - err = dc.Resource(SnapshotGVR).Namespace(sr.Vs.GetNamespace()).Delete(context.TODO(), sr.Vs.GetName(), metav1.DeleteOptions{}) - if apierrors.IsNotFound(err) { - err = nil - } - framework.ExpectNoError(err) - - err = utils.WaitForNamespacedGVRDeletion(dc, SnapshotGVR, sr.Vs.GetName(), sr.Vs.GetNamespace(), framework.Poll, framework.SnapshotDeleteTimeout) - framework.ExpectNoError(err) - default: - cleanupErrs = append(cleanupErrs, err) - } - case apierrors.IsNotFound(err): - // Hope that the underlying snapshot content and resource is gone already - default: - cleanupErrs = append(cleanupErrs, err) - } - } - if sr.Vscontent != nil { - framework.Logf("deleting snapshot content %q", sr.Vscontent.GetName()) - - sr.Vscontent, err = dc.Resource(SnapshotContentGVR).Get(context.TODO(), sr.Vscontent.GetName(), metav1.GetOptions{}) - switch { - case err == nil: - if sr.Vscontent.Object["spec"].(map[string]interface{})["deletionPolicy"] != "Delete" { - // The purpose of this block is to prevent physical snapshotContent leaks. - // We must update the SnapshotContent to have Delete Deletion policy, - // or else the physical snapshot content will be leaked. - sr.Vscontent.Object["spec"].(map[string]interface{})["deletionPolicy"] = "Delete" - sr.Vscontent, err = dc.Resource(SnapshotContentGVR).Update(context.TODO(), sr.Vscontent, metav1.UpdateOptions{}) - framework.ExpectNoError(err) - } - err = dc.Resource(SnapshotContentGVR).Delete(context.TODO(), sr.Vscontent.GetName(), metav1.DeleteOptions{}) - if apierrors.IsNotFound(err) { - err = nil - } - framework.ExpectNoError(err) - - err = utils.WaitForGVRDeletion(dc, SnapshotContentGVR, sr.Vscontent.GetName(), framework.Poll, framework.SnapshotDeleteTimeout) - framework.ExpectNoError(err) - case apierrors.IsNotFound(err): - // Hope the underlying physical snapshot resource has been deleted already - default: - cleanupErrs = append(cleanupErrs, err) - } - } - if sr.Vsclass != nil { - framework.Logf("deleting snapshot class %q", sr.Vsclass.GetName()) - // typically this snapshot class has already been deleted - err = dc.Resource(SnapshotClassGVR).Delete(context.TODO(), sr.Vsclass.GetName(), metav1.DeleteOptions{}) - if err != nil && !apierrors.IsNotFound(err) { - framework.Failf("Error deleting snapshot class %q. Error: %v", sr.Vsclass.GetName(), err) - } - err = utils.WaitForGVRDeletion(dc, SnapshotClassGVR, sr.Vsclass.GetName(), framework.Poll, framework.SnapshotDeleteTimeout) - framework.ExpectNoError(err) - } - return utilerrors.NewAggregate(cleanupErrs) -} diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/snapshottable_stress.go b/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/snapshottable_stress.go index 3de43fefe897..392e51e9c57f 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/snapshottable_stress.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/snapshottable_stress.go @@ -33,21 +33,22 @@ import ( e2epv "k8s.io/kubernetes/test/e2e/framework/pv" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" e2evolume "k8s.io/kubernetes/test/e2e/framework/volume" - "k8s.io/kubernetes/test/e2e/storage/testpatterns" + storageframework "k8s.io/kubernetes/test/e2e/storage/framework" + storageutils "k8s.io/kubernetes/test/e2e/storage/utils" ) type snapshottableStressTestSuite struct { - tsInfo TestSuiteInfo + tsInfo storageframework.TestSuiteInfo } type snapshottableStressTest struct { - config *PerTestConfig - testOptions VolumeSnapshotStressTestOptions + config *storageframework.PerTestConfig + testOptions storageframework.VolumeSnapshotStressTestOptions driverCleanup func() pods []*v1.Pod - volumes []*VolumeResource - snapshots []*SnapshotResource + volumes []*storageframework.VolumeResource + snapshots []*storageframework.SnapshotResource // Because we are appending snapshot resources in parallel goroutines. snapshotsMutex sync.Mutex @@ -57,17 +58,13 @@ type snapshottableStressTest struct { cancel context.CancelFunc } -var _ TestSuite = &snapshottableStressTestSuite{} - -// InitSnapshottableStressTestSuite returns snapshottableStressTestSuite that implements TestSuite interface -func InitSnapshottableStressTestSuite() TestSuite { +// InitCustomSnapshottableStressTestSuite returns snapshottableStressTestSuite that implements TestSuite interface +// using custom test patterns +func InitCustomSnapshottableStressTestSuite(patterns []storageframework.TestPattern) storageframework.TestSuite { return &snapshottableStressTestSuite{ - tsInfo: TestSuiteInfo{ - Name: "snapshottable-stress", - TestPatterns: []testpatterns.TestPattern{ - testpatterns.DynamicSnapshotDelete, - testpatterns.DynamicSnapshotRetain, - }, + tsInfo: storageframework.TestSuiteInfo{ + Name: "snapshottable-stress", + TestPatterns: patterns, SupportedSizeRange: e2evolume.SizeRange{ Min: "1Mi", }, @@ -76,55 +73,58 @@ func InitSnapshottableStressTestSuite() TestSuite { } } -func (t *snapshottableStressTestSuite) GetTestSuiteInfo() TestSuiteInfo { +// InitSnapshottableStressTestSuite returns snapshottableStressTestSuite that implements TestSuite interface +// using testsuite default patterns +func InitSnapshottableStressTestSuite() storageframework.TestSuite { + patterns := []storageframework.TestPattern{ + storageframework.DynamicSnapshotDelete, + storageframework.DynamicSnapshotRetain, + } + return InitCustomSnapshottableStressTestSuite(patterns) +} + +func (t *snapshottableStressTestSuite) GetTestSuiteInfo() storageframework.TestSuiteInfo { return t.tsInfo } -func (t *snapshottableStressTestSuite) SkipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) { +func (t *snapshottableStressTestSuite) SkipUnsupportedTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) { + driverInfo := driver.GetDriverInfo() + var ok bool + if driverInfo.VolumeSnapshotStressTestOptions == nil { + e2eskipper.Skipf("Driver %s doesn't specify snapshot stress test options -- skipping", driverInfo.Name) + } + if driverInfo.VolumeSnapshotStressTestOptions.NumPods <= 0 { + framework.Failf("NumPods in snapshot stress test options must be a positive integer, received: %d", driverInfo.VolumeSnapshotStressTestOptions.NumPods) + } + if driverInfo.VolumeSnapshotStressTestOptions.NumSnapshots <= 0 { + framework.Failf("NumSnapshots in snapshot stress test options must be a positive integer, received: %d", driverInfo.VolumeSnapshotStressTestOptions.NumSnapshots) + } + _, ok = driver.(storageframework.SnapshottableTestDriver) + if !driverInfo.Capabilities[storageframework.CapSnapshotDataSource] || !ok { + e2eskipper.Skipf("Driver %q doesn't implement SnapshottableTestDriver - skipping", driverInfo.Name) + } + + _, ok = driver.(storageframework.DynamicPVTestDriver) + if !ok { + e2eskipper.Skipf("Driver %s doesn't implement DynamicPVTestDriver -- skipping", driverInfo.Name) + } } -func (t *snapshottableStressTestSuite) DefineTests(driver TestDriver, pattern testpatterns.TestPattern) { +func (t *snapshottableStressTestSuite) DefineTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) { var ( - driverInfo *DriverInfo - snapshottableDriver SnapshottableTestDriver + driverInfo *storageframework.DriverInfo + snapshottableDriver storageframework.SnapshottableTestDriver cs clientset.Interface stressTest *snapshottableStressTest ) - // Check preconditions before setting up namespace via framework below. - ginkgo.BeforeEach(func() { - driverInfo = driver.GetDriverInfo() - if driverInfo.VolumeSnapshotStressTestOptions == nil { - e2eskipper.Skipf("Driver %s doesn't specify snapshot stress test options -- skipping", driverInfo.Name) - } - if driverInfo.VolumeSnapshotStressTestOptions.NumPods <= 0 { - framework.Failf("NumPods in snapshot stress test options must be a positive integer, received: %d", driverInfo.VolumeSnapshotStressTestOptions.NumPods) - } - if driverInfo.VolumeSnapshotStressTestOptions.NumSnapshots <= 0 { - framework.Failf("NumSnapshots in snapshot stress test options must be a positive integer, received: %d", driverInfo.VolumeSnapshotStressTestOptions.NumSnapshots) - } - - // Because we're initializing snapshottableDriver, both vars must exist. - ok := false - - snapshottableDriver, ok = driver.(SnapshottableTestDriver) - if !driverInfo.Capabilities[CapSnapshotDataSource] || !ok { - e2eskipper.Skipf("Driver %q doesn't implement SnapshottableTestDriver - skipping", driverInfo.Name) - } - - _, ok = driver.(DynamicPVTestDriver) - if !ok { - e2eskipper.Skipf("Driver %s doesn't implement DynamicPVTestDriver -- skipping", driverInfo.Name) - } - }) - - // This intentionally comes after checking the preconditions because it - // registers its own BeforeEach which creates the namespace. Beware that it - // also registers an AfterEach which renders f unusable. Any code using + // Beware that it also registers an AfterEach which renders f unusable. Any code using // f must run inside an It or Context callback. f := framework.NewDefaultFramework("snapshottable-stress") init := func() { + driverInfo = driver.GetDriverInfo() + snapshottableDriver, _ = driver.(storageframework.SnapshottableTestDriver) cs = f.ClientSet config, driverCleanup := driver.PrepareTest(f) ctx, cancel := context.WithCancel(context.Background()) @@ -132,8 +132,8 @@ func (t *snapshottableStressTestSuite) DefineTests(driver TestDriver, pattern te stressTest = &snapshottableStressTest{ config: config, driverCleanup: driverCleanup, - volumes: []*VolumeResource{}, - snapshots: []*SnapshotResource{}, + volumes: []*storageframework.VolumeResource{}, + snapshots: []*storageframework.SnapshotResource{}, pods: []*v1.Pod{}, testOptions: *driverInfo.VolumeSnapshotStressTestOptions, ctx: ctx, @@ -145,7 +145,7 @@ func (t *snapshottableStressTestSuite) DefineTests(driver TestDriver, pattern te for i := 0; i < stressTest.testOptions.NumPods; i++ { framework.Logf("Creating resources for pod %d/%d", i, stressTest.testOptions.NumPods-1) - volume := CreateVolumeResource(driver, stressTest.config, pattern, t.GetTestSuiteInfo().SupportedSizeRange) + volume := storageframework.CreateVolumeResource(driver, stressTest.config, pattern, t.GetTestSuiteInfo().SupportedSizeRange) stressTest.volumes = append(stressTest.volumes, volume) podConfig := e2epod.Config{ @@ -194,26 +194,24 @@ func (t *snapshottableStressTestSuite) DefineTests(driver TestDriver, pattern te wg sync.WaitGroup ) - for i, snapshot := range stressTest.snapshots { - wg.Add(1) - - go func(i int, snapshot *SnapshotResource) { + wg.Add(len(stressTest.snapshots)) + for _, snapshot := range stressTest.snapshots { + go func(snapshot *storageframework.SnapshotResource) { defer ginkgo.GinkgoRecover() defer wg.Done() framework.Logf("Deleting snapshot %s/%s", snapshot.Vs.GetNamespace(), snapshot.Vs.GetName()) - err := snapshot.CleanupResource() + err := snapshot.CleanupResource(f.Timeouts) mu.Lock() defer mu.Unlock() errs = append(errs, err) - }(i, snapshot) + }(snapshot) } wg.Wait() - for i, pod := range stressTest.pods { - wg.Add(1) - - go func(i int, pod *v1.Pod) { + wg.Add(len(stressTest.pods)) + for _, pod := range stressTest.pods { + go func(pod *v1.Pod) { defer ginkgo.GinkgoRecover() defer wg.Done() @@ -222,14 +220,13 @@ func (t *snapshottableStressTestSuite) DefineTests(driver TestDriver, pattern te mu.Lock() defer mu.Unlock() errs = append(errs, err) - }(i, pod) + }(pod) } wg.Wait() - for i, volume := range stressTest.volumes { - wg.Add(1) - - go func(i int, volume *VolumeResource) { + wg.Add(len(stressTest.volumes)) + for _, volume := range stressTest.volumes { + go func(volume *storageframework.VolumeResource) { defer ginkgo.GinkgoRecover() defer wg.Done() @@ -238,11 +235,11 @@ func (t *snapshottableStressTestSuite) DefineTests(driver TestDriver, pattern te mu.Lock() defer mu.Unlock() errs = append(errs, err) - }(i, volume) + }(volume) } wg.Wait() - errs = append(errs, tryFunc(stressTest.driverCleanup)) + errs = append(errs, storageutils.TryFunc(stressTest.driverCleanup)) framework.ExpectNoError(errors.NewAggregate(errs), "while cleaning up resources") } @@ -275,7 +272,8 @@ func (t *snapshottableStressTestSuite) DefineTests(driver TestDriver, pattern te return default: framework.Logf("Pod-%d [%s], Iteration %d/%d", podIndex, pod.Name, snapshotIndex, stressTest.testOptions.NumSnapshots-1) - snapshot := CreateSnapshotResource(snapshottableDriver, stressTest.config, pattern, volume.Pvc.GetName(), volume.Pvc.GetNamespace()) + parameters := map[string]string{} + snapshot := storageframework.CreateSnapshotResource(snapshottableDriver, stressTest.config, pattern, volume.Pvc.GetName(), volume.Pvc.GetNamespace(), f.Timeouts, parameters) stressTest.snapshotsMutex.Lock() defer stressTest.snapshotsMutex.Unlock() stressTest.snapshots = append(stressTest.snapshots, snapshot) diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/subpath.go b/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/subpath.go index a432bd7f8137..f35a333f9d28 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/subpath.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/subpath.go @@ -39,8 +39,9 @@ import ( e2epod "k8s.io/kubernetes/test/e2e/framework/pod" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" e2evolume "k8s.io/kubernetes/test/e2e/framework/volume" - "k8s.io/kubernetes/test/e2e/storage/testpatterns" + storageframework "k8s.io/kubernetes/test/e2e/storage/framework" "k8s.io/kubernetes/test/e2e/storage/utils" + storageutils "k8s.io/kubernetes/test/e2e/storage/utils" imageutils "k8s.io/kubernetes/test/utils/image" ) @@ -55,22 +56,16 @@ var ( ) type subPathTestSuite struct { - tsInfo TestSuiteInfo + tsInfo storageframework.TestSuiteInfo } -var _ TestSuite = &subPathTestSuite{} - -// InitSubPathTestSuite returns subPathTestSuite that implements TestSuite interface -func InitSubPathTestSuite() TestSuite { +// InitCustomSubPathTestSuite returns subPathTestSuite that implements TestSuite interface +// using custom test patterns +func InitCustomSubPathTestSuite(patterns []storageframework.TestPattern) storageframework.TestSuite { return &subPathTestSuite{ - tsInfo: TestSuiteInfo{ - Name: "subPath", - TestPatterns: []testpatterns.TestPattern{ - testpatterns.DefaultFsInlineVolume, - testpatterns.DefaultFsPreprovisionedPV, - testpatterns.DefaultFsDynamicPV, - testpatterns.NtfsDynamicPV, - }, + tsInfo: storageframework.TestSuiteInfo{ + Name: "subPath", + TestPatterns: patterns, SupportedSizeRange: e2evolume.SizeRange{ Min: "1Mi", }, @@ -78,23 +73,35 @@ func InitSubPathTestSuite() TestSuite { } } -func (s *subPathTestSuite) GetTestSuiteInfo() TestSuiteInfo { +// InitSubPathTestSuite returns subPathTestSuite that implements TestSuite interface +// using testsuite default patterns +func InitSubPathTestSuite() storageframework.TestSuite { + patterns := []storageframework.TestPattern{ + storageframework.DefaultFsInlineVolume, + storageframework.DefaultFsPreprovisionedPV, + storageframework.DefaultFsDynamicPV, + storageframework.NtfsDynamicPV, + } + return InitCustomSubPathTestSuite(patterns) +} + +func (s *subPathTestSuite) GetTestSuiteInfo() storageframework.TestSuiteInfo { return s.tsInfo } -func (s *subPathTestSuite) SkipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) { - skipVolTypePatterns(pattern, driver, testpatterns.NewVolTypeMap( - testpatterns.PreprovisionedPV, - testpatterns.InlineVolume)) +func (s *subPathTestSuite) SkipUnsupportedTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) { + skipVolTypePatterns(pattern, driver, storageframework.NewVolTypeMap( + storageframework.PreprovisionedPV, + storageframework.InlineVolume)) } -func (s *subPathTestSuite) DefineTests(driver TestDriver, pattern testpatterns.TestPattern) { +func (s *subPathTestSuite) DefineTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) { type local struct { - config *PerTestConfig + config *storageframework.PerTestConfig driverCleanup func() hostExec utils.HostExec - resource *VolumeResource + resource *storageframework.VolumeResource roVolSource *v1.VolumeSource pod *v1.Pod formatPod *v1.Pod @@ -106,13 +113,9 @@ func (s *subPathTestSuite) DefineTests(driver TestDriver, pattern testpatterns.T } var l local - // No preconditions to test. Normally they would be in a BeforeEach here. - - // This intentionally comes after checking the preconditions because it - // registers its own BeforeEach which creates the namespace. Beware that it - // also registers an AfterEach which renders f unusable. Any code using + // Beware that it also registers an AfterEach which renders f unusable. Any code using // f must run inside an It or Context callback. - f := framework.NewDefaultFramework("provisioning") + f := framework.NewFrameworkWithCustomTimeouts("provisioning", storageframework.GetDriverTimeouts(driver)) init := func() { l = local{} @@ -121,24 +124,24 @@ func (s *subPathTestSuite) DefineTests(driver TestDriver, pattern testpatterns.T l.config, l.driverCleanup = driver.PrepareTest(f) l.migrationCheck = newMigrationOpCheck(f.ClientSet, driver.GetDriverInfo().InTreePluginName) testVolumeSizeRange := s.GetTestSuiteInfo().SupportedSizeRange - l.resource = CreateVolumeResource(driver, l.config, pattern, testVolumeSizeRange) + l.resource = storageframework.CreateVolumeResource(driver, l.config, pattern, testVolumeSizeRange) l.hostExec = utils.NewHostExec(f) // Setup subPath test dependent resource volType := pattern.VolType switch volType { - case testpatterns.InlineVolume: - if iDriver, ok := driver.(InlineVolumeTestDriver); ok { + case storageframework.InlineVolume: + if iDriver, ok := driver.(storageframework.InlineVolumeTestDriver); ok { l.roVolSource = iDriver.GetVolumeSource(true, pattern.FsType, l.resource.Volume) } - case testpatterns.PreprovisionedPV: + case storageframework.PreprovisionedPV: l.roVolSource = &v1.VolumeSource{ PersistentVolumeClaim: &v1.PersistentVolumeClaimVolumeSource{ ClaimName: l.resource.Pvc.Name, ReadOnly: true, }, } - case testpatterns.DynamicPV: + case storageframework.DynamicPV: l.roVolSource = &v1.VolumeSource{ PersistentVolumeClaim: &v1.PersistentVolumeClaimVolumeSource{ ClaimName: l.resource.Pvc.Name, @@ -175,7 +178,7 @@ func (s *subPathTestSuite) DefineTests(driver TestDriver, pattern testpatterns.T l.resource = nil } - errs = append(errs, tryFunc(l.driverCleanup)) + errs = append(errs, storageutils.TryFunc(l.driverCleanup)) l.driverCleanup = nil framework.ExpectNoError(errors.NewAggregate(errs), "while cleaning up resource") @@ -443,8 +446,8 @@ func (s *subPathTestSuite) DefineTests(driver TestDriver, pattern testpatterns.T defer cleanup() // Change volume container to busybox so we can exec later - l.pod.Spec.Containers[1].Image = e2evolume.GetDefaultTestImage() - l.pod.Spec.Containers[1].Command = e2evolume.GenerateScriptCmd("sleep 100000") + l.pod.Spec.Containers[1].Image = e2epod.GetDefaultTestImage() + l.pod.Spec.Containers[1].Command = e2epod.GenerateScriptCmd("sleep 100000") l.pod.Spec.Containers[1].Args = nil ginkgo.By(fmt.Sprintf("Creating pod %s", l.pod.Name)) @@ -457,7 +460,7 @@ func (s *subPathTestSuite) DefineTests(driver TestDriver, pattern testpatterns.T }() // Wait for pod to be running - err = e2epod.WaitForPodRunningInNamespace(f.ClientSet, l.pod) + err = e2epod.WaitTimeoutForPodRunningInNamespace(f.ClientSet, l.pod.Name, l.pod.Namespace, f.Timeouts.PodStart) framework.ExpectNoError(err, "while waiting for pod to be running") // Exec into container that mounted the volume, delete subpath directory @@ -518,19 +521,19 @@ func SubpathTestPod(f *framework.Framework, subpath, volumeType string, source * initSubpathContainer := e2epod.NewAgnhostContainer( fmt.Sprintf("test-init-subpath-%s", suffix), []v1.VolumeMount{volumeSubpathMount, probeMount}, nil, "mounttest") - initSubpathContainer.SecurityContext = e2evolume.GenerateSecurityContext(privilegedSecurityContext) + initSubpathContainer.SecurityContext = e2epod.GenerateContainerSecurityContext(privilegedSecurityContext) initVolumeContainer := e2epod.NewAgnhostContainer( fmt.Sprintf("test-init-volume-%s", suffix), []v1.VolumeMount{volumeMount, probeMount}, nil, "mounttest") - initVolumeContainer.SecurityContext = e2evolume.GenerateSecurityContext(privilegedSecurityContext) + initVolumeContainer.SecurityContext = e2epod.GenerateContainerSecurityContext(privilegedSecurityContext) subpathContainer := e2epod.NewAgnhostContainer( fmt.Sprintf("test-container-subpath-%s", suffix), []v1.VolumeMount{volumeSubpathMount, probeMount}, nil, "mounttest") - subpathContainer.SecurityContext = e2evolume.GenerateSecurityContext(privilegedSecurityContext) + subpathContainer.SecurityContext = e2epod.GenerateContainerSecurityContext(privilegedSecurityContext) volumeContainer := e2epod.NewAgnhostContainer( fmt.Sprintf("test-container-volume-%s", suffix), []v1.VolumeMount{volumeMount, probeMount}, nil, "mounttest") - volumeContainer.SecurityContext = e2evolume.GenerateSecurityContext(privilegedSecurityContext) + volumeContainer.SecurityContext = e2epod.GenerateContainerSecurityContext(privilegedSecurityContext) return &v1.Pod{ ObjectMeta: metav1.ObjectMeta{ @@ -541,9 +544,9 @@ func SubpathTestPod(f *framework.Framework, subpath, volumeType string, source * InitContainers: []v1.Container{ { Name: fmt.Sprintf("init-volume-%s", suffix), - Image: e2evolume.GetDefaultTestImage(), + Image: e2epod.GetDefaultTestImage(), VolumeMounts: []v1.VolumeMount{volumeMount, probeMount}, - SecurityContext: e2evolume.GenerateSecurityContext(privilegedSecurityContext), + SecurityContext: e2epod.GenerateContainerSecurityContext(privilegedSecurityContext), }, initSubpathContainer, initVolumeContainer, @@ -566,7 +569,7 @@ func SubpathTestPod(f *framework.Framework, subpath, volumeType string, source * }, }, }, - SecurityContext: e2evolume.GeneratePodSecurityContext(nil, seLinuxOptions), + SecurityContext: e2epod.GeneratePodSecurityContext(nil, seLinuxOptions), }, } } @@ -610,8 +613,8 @@ func volumeFormatPod(f *framework.Framework, volumeSource *v1.VolumeSource) *v1. Containers: []v1.Container{ { Name: fmt.Sprintf("init-volume-%s", f.Namespace.Name), - Image: e2evolume.GetDefaultTestImage(), - Command: e2evolume.GenerateScriptCmd("echo nothing"), + Image: e2epod.GetDefaultTestImage(), + Command: e2epod.GenerateScriptCmd("echo nothing"), VolumeMounts: []v1.VolumeMount{ { Name: volumeName, @@ -632,7 +635,7 @@ func volumeFormatPod(f *framework.Framework, volumeSource *v1.VolumeSource) *v1. } func setInitCommand(pod *v1.Pod, command string) { - pod.Spec.InitContainers[0].Command = e2evolume.GenerateScriptCmd(command) + pod.Spec.InitContainers[0].Command = e2epod.GenerateScriptCmd(command) } func setWriteCommand(file string, container *v1.Container) { @@ -727,7 +730,7 @@ func waitForPodSubpathError(f *framework.Framework, pod *v1.Pod, allowContainerT return fmt.Errorf("failed to find container that uses subpath") } - waitErr := wait.PollImmediate(framework.Poll, framework.PodStartTimeout, func() (bool, error) { + waitErr := wait.PollImmediate(framework.Poll, f.Timeouts.PodStart, func() (bool, error) { pod, err := f.ClientSet.CoreV1().Pods(pod.Namespace).Get(context.TODO(), pod.Name, metav1.GetOptions{}) if err != nil { return false, err @@ -789,11 +792,11 @@ func (h *podContainerRestartHooks) FixLivenessProbe(pod *v1.Pod, probeFilePath s func testPodContainerRestartWithHooks(f *framework.Framework, pod *v1.Pod, hooks *podContainerRestartHooks) { pod.Spec.RestartPolicy = v1.RestartPolicyOnFailure - pod.Spec.Containers[0].Image = e2evolume.GetDefaultTestImage() - pod.Spec.Containers[0].Command = e2evolume.GenerateScriptCmd("sleep 100000") + pod.Spec.Containers[0].Image = e2epod.GetDefaultTestImage() + pod.Spec.Containers[0].Command = e2epod.GenerateScriptCmd("sleep 100000") pod.Spec.Containers[0].Args = nil - pod.Spec.Containers[1].Image = e2evolume.GetDefaultTestImage() - pod.Spec.Containers[1].Command = e2evolume.GenerateScriptCmd("sleep 100000") + pod.Spec.Containers[1].Image = e2epod.GetDefaultTestImage() + pod.Spec.Containers[1].Command = e2epod.GenerateScriptCmd("sleep 100000") pod.Spec.Containers[1].Args = nil hooks.AddLivenessProbe(pod, probeFilePath) @@ -805,7 +808,7 @@ func testPodContainerRestartWithHooks(f *framework.Framework, pod *v1.Pod, hooks defer func() { e2epod.DeletePodWithWait(f.ClientSet, pod) }() - err = e2epod.WaitForPodRunningInNamespace(f.ClientSet, pod) + err = e2epod.WaitTimeoutForPodRunningInNamespace(f.ClientSet, pod.Name, pod.Namespace, f.Timeouts.PodStart) framework.ExpectNoError(err, "while waiting for pod to be running") ginkgo.By("Failing liveness probe") @@ -920,7 +923,7 @@ func TestPodContainerRestartWithConfigmapModified(f *framework.Framework, origin break } pod := SubpathTestPod(f, subpath, "configmap", &v1.VolumeSource{ConfigMap: &v1.ConfigMapVolumeSource{LocalObjectReference: v1.LocalObjectReference{Name: original.Name}}}, false) - pod.Spec.InitContainers[0].Command = e2evolume.GenerateScriptCmd(fmt.Sprintf("touch %v", probeFilePath)) + pod.Spec.InitContainers[0].Command = e2epod.GenerateScriptCmd(fmt.Sprintf("touch %v", probeFilePath)) modifiedValue := modified.Data[subpath] testPodContainerRestartWithHooks(f, pod, &podContainerRestartHooks{ @@ -956,18 +959,18 @@ func testSubpathReconstruction(f *framework.Framework, hostExec utils.HostExec, // Disruptive test run serially, we can cache all voluem global mount // points and verify after the test that we do not leak any global mount point. nodeList, err := e2enode.GetReadySchedulableNodes(f.ClientSet) - framework.ExpectNoError(err, "while listing scheduable nodes") + framework.ExpectNoError(err, "while listing schedulable nodes") globalMountPointsByNode := make(map[string]sets.String, len(nodeList.Items)) for _, node := range nodeList.Items { globalMountPointsByNode[node.Name] = utils.FindVolumeGlobalMountPoints(hostExec, &node) } // Change to busybox - pod.Spec.Containers[0].Image = e2evolume.GetDefaultTestImage() - pod.Spec.Containers[0].Command = e2evolume.GenerateScriptCmd("sleep 100000") + pod.Spec.Containers[0].Image = e2epod.GetDefaultTestImage() + pod.Spec.Containers[0].Command = e2epod.GenerateScriptCmd("sleep 100000") pod.Spec.Containers[0].Args = nil - pod.Spec.Containers[1].Image = e2evolume.GetDefaultTestImage() - pod.Spec.Containers[1].Command = e2evolume.GenerateScriptCmd("sleep 100000") + pod.Spec.Containers[1].Image = e2epod.GetDefaultTestImage() + pod.Spec.Containers[1].Command = e2epod.GenerateScriptCmd("sleep 100000") pod.Spec.Containers[1].Args = nil // If grace period is too short, then there is not enough time for the volume // manager to cleanup the volumes @@ -978,8 +981,7 @@ func testSubpathReconstruction(f *framework.Framework, hostExec utils.HostExec, removeUnusedContainers(pod) pod, err = f.ClientSet.CoreV1().Pods(f.Namespace.Name).Create(context.TODO(), pod, metav1.CreateOptions{}) framework.ExpectNoError(err, "while creating pod") - - err = e2epod.WaitForPodRunningInNamespace(f.ClientSet, pod) + err = e2epod.WaitTimeoutForPodRunningInNamespace(f.ClientSet, pod.Name, pod.Namespace, f.Timeouts.PodStart) framework.ExpectNoError(err, "while waiting for pod to be running") pod, err = f.ClientSet.CoreV1().Pods(f.Namespace.Name).Get(context.TODO(), pod.Name, metav1.GetOptions{}) @@ -991,7 +993,7 @@ func testSubpathReconstruction(f *framework.Framework, hostExec utils.HostExec, podNode = &nodeList.Items[i] } } - framework.ExpectNotEqual(podNode, nil, "pod node should exist in scheduable nodes") + framework.ExpectNotEqual(podNode, nil, "pod node should exist in schedulable nodes") utils.TestVolumeUnmountsFromDeletedPodWithForceOption(f.ClientSet, f, pod, forceDelete, true) @@ -1010,7 +1012,7 @@ func formatVolume(f *framework.Framework, pod *v1.Pod) { pod, err := f.ClientSet.CoreV1().Pods(f.Namespace.Name).Create(context.TODO(), pod, metav1.CreateOptions{}) framework.ExpectNoError(err, "while creating volume init pod") - err = e2epod.WaitForPodSuccessInNamespace(f.ClientSet, pod.Name, pod.Namespace) + err = e2epod.WaitForPodSuccessInNamespaceTimeout(f.ClientSet, pod.Name, pod.Namespace, f.Timeouts.PodStart) framework.ExpectNoError(err, "while waiting for volume init pod to succeed") err = e2epod.DeletePodWithWait(f.ClientSet, pod) diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/topology.go b/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/topology.go index b2005685f761..ac0f826f415c 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/topology.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/topology.go @@ -34,85 +34,85 @@ import ( e2epod "k8s.io/kubernetes/test/e2e/framework/pod" e2epv "k8s.io/kubernetes/test/e2e/framework/pv" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" - e2evolume "k8s.io/kubernetes/test/e2e/framework/volume" - "k8s.io/kubernetes/test/e2e/storage/testpatterns" + storageframework "k8s.io/kubernetes/test/e2e/storage/framework" + storageutils "k8s.io/kubernetes/test/e2e/storage/utils" ) type topologyTestSuite struct { - tsInfo TestSuiteInfo + tsInfo storageframework.TestSuiteInfo } type topologyTest struct { - config *PerTestConfig + config *storageframework.PerTestConfig driverCleanup func() migrationCheck *migrationOpCheck - resource VolumeResource + resource storageframework.VolumeResource pod *v1.Pod allTopologies []topology } type topology map[string]string -var _ TestSuite = &topologyTestSuite{} - -// InitTopologyTestSuite returns topologyTestSuite that implements TestSuite interface -func InitTopologyTestSuite() TestSuite { +// InitCustomTopologyTestSuite returns topologyTestSuite that implements TestSuite interface +// using custom test patterns +func InitCustomTopologyTestSuite(patterns []storageframework.TestPattern) storageframework.TestSuite { return &topologyTestSuite{ - tsInfo: TestSuiteInfo{ - Name: "topology", - TestPatterns: []testpatterns.TestPattern{ - testpatterns.TopologyImmediate, - testpatterns.TopologyDelayed, - }, + tsInfo: storageframework.TestSuiteInfo{ + Name: "topology", + TestPatterns: patterns, }, } } -func (t *topologyTestSuite) GetTestSuiteInfo() TestSuiteInfo { +// InitTopologyTestSuite returns topologyTestSuite that implements TestSuite interface +// using testsuite default patterns +func InitTopologyTestSuite() storageframework.TestSuite { + patterns := []storageframework.TestPattern{ + storageframework.TopologyImmediate, + storageframework.TopologyDelayed, + } + return InitCustomTopologyTestSuite(patterns) +} + +func (t *topologyTestSuite) GetTestSuiteInfo() storageframework.TestSuiteInfo { return t.tsInfo } -func (t *topologyTestSuite) SkipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) { +func (t *topologyTestSuite) SkipUnsupportedTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) { + dInfo := driver.GetDriverInfo() + var ok bool + _, ok = driver.(storageframework.DynamicPVTestDriver) + if !ok { + e2eskipper.Skipf("Driver %s doesn't support %v -- skipping", dInfo.Name, pattern.VolType) + } + + if !dInfo.Capabilities[storageframework.CapTopology] { + e2eskipper.Skipf("Driver %q does not support topology - skipping", dInfo.Name) + } } -func (t *topologyTestSuite) DefineTests(driver TestDriver, pattern testpatterns.TestPattern) { +func (t *topologyTestSuite) DefineTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) { var ( dInfo = driver.GetDriverInfo() - dDriver DynamicPVTestDriver + dDriver storageframework.DynamicPVTestDriver cs clientset.Interface err error ) - ginkgo.BeforeEach(func() { - // Check preconditions. - ok := false - dDriver, ok = driver.(DynamicPVTestDriver) - if !ok { - e2eskipper.Skipf("Driver %s doesn't support %v -- skipping", dInfo.Name, pattern.VolType) - } - - if !dInfo.Capabilities[CapTopology] { - e2eskipper.Skipf("Driver %q does not support topology - skipping", dInfo.Name) - } - - }) - - // This intentionally comes after checking the preconditions because it - // registers its own BeforeEach which creates the namespace. Beware that it - // also registers an AfterEach which renders f unusable. Any code using + // Beware that it also registers an AfterEach which renders f unusable. Any code using // f must run inside an It or Context callback. - f := framework.NewDefaultFramework("topology") + f := framework.NewFrameworkWithCustomTimeouts("topology", storageframework.GetDriverTimeouts(driver)) init := func() topologyTest { - + dDriver, _ = driver.(storageframework.DynamicPVTestDriver) l := topologyTest{} // Now do the more expensive test initialization. l.config, l.driverCleanup = driver.PrepareTest(f) - l.resource = VolumeResource{ + l.resource = storageframework.VolumeResource{ Config: l.config, Pattern: pattern, } @@ -141,7 +141,7 @@ func (t *topologyTestSuite) DefineTests(driver TestDriver, pattern testpatterns. testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange driverVolumeSizeRange := dDriver.GetDriverInfo().SupportedSizeRange - claimSize, err := getSizeRangesIntersection(testVolumeSizeRange, driverVolumeSizeRange) + claimSize, err := storageutils.GetSizeRangesIntersection(testVolumeSizeRange, driverVolumeSizeRange) framework.ExpectNoError(err, "determine intersection of test size range %+v and driver size range %+v", testVolumeSizeRange, driverVolumeSizeRange) l.resource.Pvc = e2epv.MakePersistentVolumeClaim(e2epv.PersistentVolumeClaimConfig{ ClaimSize: claimSize, @@ -154,7 +154,7 @@ func (t *topologyTestSuite) DefineTests(driver TestDriver, pattern testpatterns. cleanup := func(l topologyTest) { t.CleanupResources(cs, &l) - err := tryFunc(l.driverCleanup) + err := storageutils.TryFunc(l.driverCleanup) l.driverCleanup = nil framework.ExpectNoError(err, "while cleaning up driver") @@ -176,7 +176,7 @@ func (t *topologyTestSuite) DefineTests(driver TestDriver, pattern testpatterns. t.createResources(cs, &l, nil) - err = e2epod.WaitForPodRunningInNamespace(cs, l.pod) + err = e2epod.WaitTimeoutForPodRunningInNamespace(cs, l.pod.Name, l.pod.Namespace, f.Timeouts.PodStart) framework.ExpectNoError(err) ginkgo.By("Verifying pod scheduled to correct node") @@ -337,8 +337,8 @@ func (t *topologyTestSuite) createResources(cs clientset.Interface, l *topologyT NS: l.config.Framework.Namespace.Name, PVCs: []*v1.PersistentVolumeClaim{l.resource.Pvc}, NodeSelection: e2epod.NodeSelection{Affinity: affinity}, - SeLinuxLabel: e2evolume.GetLinuxLabel(), - ImageID: e2evolume.GetDefaultTestImageID(), + SeLinuxLabel: e2epod.GetLinuxLabel(), + ImageID: e2epod.GetDefaultTestImageID(), } l.pod, err = e2epod.MakeSecPod(&podConfig) framework.ExpectNoError(err) diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/volume_expand.go b/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/volume_expand.go index d6ebac20e966..472982c7e130 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/volume_expand.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/volume_expand.go @@ -34,7 +34,8 @@ import ( e2epod "k8s.io/kubernetes/test/e2e/framework/pod" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" e2evolume "k8s.io/kubernetes/test/e2e/framework/volume" - "k8s.io/kubernetes/test/e2e/storage/testpatterns" + storageframework "k8s.io/kubernetes/test/e2e/storage/framework" + storageutils "k8s.io/kubernetes/test/e2e/storage/utils" ) const ( @@ -52,24 +53,16 @@ const ( ) type volumeExpandTestSuite struct { - tsInfo TestSuiteInfo + tsInfo storageframework.TestSuiteInfo } -var _ TestSuite = &volumeExpandTestSuite{} - -// InitVolumeExpandTestSuite returns volumeExpandTestSuite that implements TestSuite interface -func InitVolumeExpandTestSuite() TestSuite { +// InitCustomVolumeExpandTestSuite returns volumeExpandTestSuite that implements TestSuite interface +// using custom test patterns +func InitCustomVolumeExpandTestSuite(patterns []storageframework.TestPattern) storageframework.TestSuite { return &volumeExpandTestSuite{ - tsInfo: TestSuiteInfo{ - Name: "volume-expand", - TestPatterns: []testpatterns.TestPattern{ - testpatterns.DefaultFsDynamicPV, - testpatterns.BlockVolModeDynamicPV, - testpatterns.DefaultFsDynamicPVAllowExpansion, - testpatterns.BlockVolModeDynamicPVAllowExpansion, - testpatterns.NtfsDynamicPV, - testpatterns.NtfsDynamicPVAllowExpansion, - }, + tsInfo: storageframework.TestSuiteInfo{ + Name: "volume-expand", + TestPatterns: patterns, SupportedSizeRange: e2evolume.SizeRange{ Min: "1Gi", }, @@ -77,19 +70,41 @@ func InitVolumeExpandTestSuite() TestSuite { } } -func (v *volumeExpandTestSuite) GetTestSuiteInfo() TestSuiteInfo { +// InitVolumeExpandTestSuite returns volumeExpandTestSuite that implements TestSuite interface +// using testsuite default patterns +func InitVolumeExpandTestSuite() storageframework.TestSuite { + patterns := []storageframework.TestPattern{ + storageframework.DefaultFsDynamicPV, + storageframework.BlockVolModeDynamicPV, + storageframework.DefaultFsDynamicPVAllowExpansion, + storageframework.BlockVolModeDynamicPVAllowExpansion, + storageframework.NtfsDynamicPV, + storageframework.NtfsDynamicPVAllowExpansion, + } + return InitCustomVolumeExpandTestSuite(patterns) +} + +func (v *volumeExpandTestSuite) GetTestSuiteInfo() storageframework.TestSuiteInfo { return v.tsInfo } -func (v *volumeExpandTestSuite) SkipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) { +func (v *volumeExpandTestSuite) SkipUnsupportedTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) { + // Check preconditions. + if !driver.GetDriverInfo().Capabilities[storageframework.CapControllerExpansion] { + e2eskipper.Skipf("Driver %q does not support volume expansion - skipping", driver.GetDriverInfo().Name) + } + // Check preconditions. + if !driver.GetDriverInfo().Capabilities[storageframework.CapBlock] && pattern.VolMode == v1.PersistentVolumeBlock { + e2eskipper.Skipf("Driver %q does not support block volume mode - skipping", driver.GetDriverInfo().Name) + } } -func (v *volumeExpandTestSuite) DefineTests(driver TestDriver, pattern testpatterns.TestPattern) { +func (v *volumeExpandTestSuite) DefineTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) { type local struct { - config *PerTestConfig + config *storageframework.PerTestConfig driverCleanup func() - resource *VolumeResource + resource *storageframework.VolumeResource pod *v1.Pod pod2 *v1.Pod @@ -97,21 +112,9 @@ func (v *volumeExpandTestSuite) DefineTests(driver TestDriver, pattern testpatte } var l local - ginkgo.BeforeEach(func() { - // Check preconditions. - if !driver.GetDriverInfo().Capabilities[CapBlock] && pattern.VolMode == v1.PersistentVolumeBlock { - e2eskipper.Skipf("Driver %q does not support block volume mode - skipping", driver.GetDriverInfo().Name) - } - if !driver.GetDriverInfo().Capabilities[CapControllerExpansion] { - e2eskipper.Skipf("Driver %q does not support volume expansion - skipping", driver.GetDriverInfo().Name) - } - }) - - // This intentionally comes after checking the preconditions because it - // registers its own BeforeEach which creates the namespace. Beware that it - // also registers an AfterEach which renders f unusable. Any code using + // Beware that it also registers an AfterEach which renders f unusable. Any code using // f must run inside an It or Context callback. - f := framework.NewDefaultFramework("volume-expand") + f := framework.NewFrameworkWithCustomTimeouts("volume-expand", storageframework.GetDriverTimeouts(driver)) init := func() { l = local{} @@ -120,7 +123,7 @@ func (v *volumeExpandTestSuite) DefineTests(driver TestDriver, pattern testpatte l.config, l.driverCleanup = driver.PrepareTest(f) l.migrationCheck = newMigrationOpCheck(f.ClientSet, driver.GetDriverInfo().InTreePluginName) testVolumeSizeRange := v.GetTestSuiteInfo().SupportedSizeRange - l.resource = CreateVolumeResource(driver, l.config, pattern, testVolumeSizeRange) + l.resource = storageframework.CreateVolumeResource(driver, l.config, pattern, testVolumeSizeRange) } cleanup := func() { @@ -144,7 +147,7 @@ func (v *volumeExpandTestSuite) DefineTests(driver TestDriver, pattern testpatte l.resource = nil } - errs = append(errs, tryFunc(l.driverCleanup)) + errs = append(errs, storageutils.TryFunc(l.driverCleanup)) l.driverCleanup = nil framework.ExpectNoError(errors.NewAggregate(errs), "while cleaning up resource") l.migrationCheck.validateMigrationVolumeOpCounts() @@ -156,7 +159,9 @@ func (v *volumeExpandTestSuite) DefineTests(driver TestDriver, pattern testpatte defer cleanup() var err error - gomega.Expect(l.resource.Sc.AllowVolumeExpansion).To(gomega.BeNil()) + gomega.Expect(l.resource.Sc.AllowVolumeExpansion).NotTo(gomega.BeNil()) + allowVolumeExpansion := *l.resource.Sc.AllowVolumeExpansion + gomega.Expect(allowVolumeExpansion).To(gomega.BeFalse()) ginkgo.By("Expanding non-expandable pvc") currentPvcSize := l.resource.Pvc.Spec.Resources.Requests[v1.ResourceStorage] newSize := currentPvcSize.DeepCopy() @@ -175,11 +180,11 @@ func (v *volumeExpandTestSuite) DefineTests(driver TestDriver, pattern testpatte podConfig := e2epod.Config{ NS: f.Namespace.Name, PVCs: []*v1.PersistentVolumeClaim{l.resource.Pvc}, - SeLinuxLabel: e2evolume.GetLinuxLabel(), + SeLinuxLabel: e2epod.GetLinuxLabel(), NodeSelection: l.config.ClientNodeSelection, - ImageID: e2evolume.GetDefaultTestImageID(), + ImageID: e2epod.GetDefaultTestImageID(), } - l.pod, err = e2epod.CreateSecPodWithNodeSelection(f.ClientSet, &podConfig, framework.PodStartTimeout) + l.pod, err = e2epod.CreateSecPodWithNodeSelection(f.ClientSet, &podConfig, f.Timeouts.PodStart) defer func() { err = e2epod.DeletePodWithWait(f.ClientSet, l.pod) framework.ExpectNoError(err, "while cleaning up pod already deleted in resize test") @@ -219,9 +224,9 @@ func (v *volumeExpandTestSuite) DefineTests(driver TestDriver, pattern testpatte podConfig = e2epod.Config{ NS: f.Namespace.Name, PVCs: []*v1.PersistentVolumeClaim{l.resource.Pvc}, - SeLinuxLabel: e2evolume.GetLinuxLabel(), + SeLinuxLabel: e2epod.GetLinuxLabel(), NodeSelection: l.config.ClientNodeSelection, - ImageID: e2evolume.GetDefaultTestImageID(), + ImageID: e2epod.GetDefaultTestImageID(), } l.pod2, err = e2epod.CreateSecPodWithNodeSelection(f.ClientSet, &podConfig, resizedPodStartupTimeout) defer func() { @@ -247,11 +252,11 @@ func (v *volumeExpandTestSuite) DefineTests(driver TestDriver, pattern testpatte podConfig := e2epod.Config{ NS: f.Namespace.Name, PVCs: []*v1.PersistentVolumeClaim{l.resource.Pvc}, - SeLinuxLabel: e2evolume.GetLinuxLabel(), + SeLinuxLabel: e2epod.GetLinuxLabel(), NodeSelection: l.config.ClientNodeSelection, - ImageID: e2evolume.GetDefaultTestImageID(), + ImageID: e2epod.GetDefaultTestImageID(), } - l.pod, err = e2epod.CreateSecPodWithNodeSelection(f.ClientSet, &podConfig, framework.PodStartTimeout) + l.pod, err = e2epod.CreateSecPodWithNodeSelection(f.ClientSet, &podConfig, f.Timeouts.PodStart) defer func() { err = e2epod.DeletePodWithWait(f.ClientSet, l.pod) framework.ExpectNoError(err, "while cleaning up pod already deleted in resize test") @@ -347,9 +352,9 @@ func WaitForResizingCondition(pvc *v1.PersistentVolumeClaim, c clientset.Interfa } // WaitForControllerVolumeResize waits for the controller resize to be finished -func WaitForControllerVolumeResize(pvc *v1.PersistentVolumeClaim, c clientset.Interface, duration time.Duration) error { +func WaitForControllerVolumeResize(pvc *v1.PersistentVolumeClaim, c clientset.Interface, timeout time.Duration) error { pvName := pvc.Spec.VolumeName - waitErr := wait.PollImmediate(resizePollInterval, duration, func() (bool, error) { + waitErr := wait.PollImmediate(resizePollInterval, timeout, func() (bool, error) { pvcSize := pvc.Spec.Resources.Requests[v1.ResourceStorage] pv, err := c.CoreV1().PersistentVolumes().Get(context.TODO(), pvName, metav1.GetOptions{}) diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/volume_io.go b/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/volume_io.go index 48ea56a2afbb..23aa911e2de4 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/volume_io.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/volume_io.go @@ -40,37 +40,32 @@ import ( e2epod "k8s.io/kubernetes/test/e2e/framework/pod" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" e2evolume "k8s.io/kubernetes/test/e2e/framework/volume" - "k8s.io/kubernetes/test/e2e/storage/testpatterns" - "k8s.io/kubernetes/test/e2e/storage/utils" + storageframework "k8s.io/kubernetes/test/e2e/storage/framework" + storageutils "k8s.io/kubernetes/test/e2e/storage/utils" ) // MD5 hashes of the test file corresponding to each file size. // Test files are generated in testVolumeIO() // If test file generation algorithm changes, these must be recomputed. var md5hashes = map[int64]string{ - testpatterns.FileSizeSmall: "5c34c2813223a7ca05a3c2f38c0d1710", - testpatterns.FileSizeMedium: "f2fa202b1ffeedda5f3a58bd1ae81104", - testpatterns.FileSizeLarge: "8d763edc71bd16217664793b5a15e403", + storageframework.FileSizeSmall: "5c34c2813223a7ca05a3c2f38c0d1710", + storageframework.FileSizeMedium: "f2fa202b1ffeedda5f3a58bd1ae81104", + storageframework.FileSizeLarge: "8d763edc71bd16217664793b5a15e403", } const mountPath = "/opt" type volumeIOTestSuite struct { - tsInfo TestSuiteInfo + tsInfo storageframework.TestSuiteInfo } -var _ TestSuite = &volumeIOTestSuite{} - -// InitVolumeIOTestSuite returns volumeIOTestSuite that implements TestSuite interface -func InitVolumeIOTestSuite() TestSuite { +// InitCustomVolumeIOTestSuite returns volumeIOTestSuite that implements TestSuite interface +// using custom test patterns +func InitCustomVolumeIOTestSuite(patterns []storageframework.TestPattern) storageframework.TestSuite { return &volumeIOTestSuite{ - tsInfo: TestSuiteInfo{ - Name: "volumeIO", - TestPatterns: []testpatterns.TestPattern{ - testpatterns.DefaultFsInlineVolume, - testpatterns.DefaultFsPreprovisionedPV, - testpatterns.DefaultFsDynamicPV, - }, + tsInfo: storageframework.TestSuiteInfo{ + Name: "volumeIO", + TestPatterns: patterns, SupportedSizeRange: e2evolume.SizeRange{ Min: "1Mi", }, @@ -78,22 +73,33 @@ func InitVolumeIOTestSuite() TestSuite { } } -func (t *volumeIOTestSuite) GetTestSuiteInfo() TestSuiteInfo { +// InitVolumeIOTestSuite returns volumeIOTestSuite that implements TestSuite interface +// using testsuite default patterns +func InitVolumeIOTestSuite() storageframework.TestSuite { + patterns := []storageframework.TestPattern{ + storageframework.DefaultFsInlineVolume, + storageframework.DefaultFsPreprovisionedPV, + storageframework.DefaultFsDynamicPV, + } + return InitCustomVolumeIOTestSuite(patterns) +} + +func (t *volumeIOTestSuite) GetTestSuiteInfo() storageframework.TestSuiteInfo { return t.tsInfo } -func (t *volumeIOTestSuite) SkipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) { - skipVolTypePatterns(pattern, driver, testpatterns.NewVolTypeMap( - testpatterns.PreprovisionedPV, - testpatterns.InlineVolume)) +func (t *volumeIOTestSuite) SkipUnsupportedTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) { + skipVolTypePatterns(pattern, driver, storageframework.NewVolTypeMap( + storageframework.PreprovisionedPV, + storageframework.InlineVolume)) } -func (t *volumeIOTestSuite) DefineTests(driver TestDriver, pattern testpatterns.TestPattern) { +func (t *volumeIOTestSuite) DefineTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) { type local struct { - config *PerTestConfig + config *storageframework.PerTestConfig driverCleanup func() - resource *VolumeResource + resource *storageframework.VolumeResource migrationCheck *migrationOpCheck } @@ -102,13 +108,9 @@ func (t *volumeIOTestSuite) DefineTests(driver TestDriver, pattern testpatterns. l local ) - // No preconditions to test. Normally they would be in a BeforeEach here. - - // This intentionally comes after checking the preconditions because it - // registers its own BeforeEach which creates the namespace. Beware that it - // also registers an AfterEach which renders f unusable. Any code using + // Beware that it also registers an AfterEach which renders f unusable. Any code using // f must run inside an It or Context callback. - f := framework.NewDefaultFramework("volumeio") + f := framework.NewFrameworkWithCustomTimeouts("volumeio", storageframework.GetDriverTimeouts(driver)) init := func() { l = local{} @@ -118,7 +120,7 @@ func (t *volumeIOTestSuite) DefineTests(driver TestDriver, pattern testpatterns. l.migrationCheck = newMigrationOpCheck(f.ClientSet, dInfo.InTreePluginName) testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange - l.resource = CreateVolumeResource(driver, l.config, pattern, testVolumeSizeRange) + l.resource = storageframework.CreateVolumeResource(driver, l.config, pattern, testVolumeSizeRange) if l.resource.VolSource == nil { e2eskipper.Skipf("Driver %q does not define volumeSource - skipping", dInfo.Name) } @@ -133,7 +135,7 @@ func (t *volumeIOTestSuite) DefineTests(driver TestDriver, pattern testpatterns. } if l.driverCleanup != nil { - errs = append(errs, tryFunc(l.driverCleanup)) + errs = append(errs, storageutils.TryFunc(l.driverCleanup)) l.driverCleanup = nil } @@ -149,23 +151,23 @@ func (t *volumeIOTestSuite) DefineTests(driver TestDriver, pattern testpatterns. fileSizes := createFileSizes(dInfo.MaxFileSize) testFile := fmt.Sprintf("%s_io_test_%s", dInfo.Name, f.Namespace.Name) var fsGroup *int64 - if !framework.NodeOSDistroIs("windows") && dInfo.Capabilities[CapFsGroup] { + if !framework.NodeOSDistroIs("windows") && dInfo.Capabilities[storageframework.CapFsGroup] { fsGroupVal := int64(1234) fsGroup = &fsGroupVal } podSec := v1.PodSecurityContext{ FSGroup: fsGroup, } - err := testVolumeIO(f, cs, convertTestConfig(l.config), *l.resource.VolSource, &podSec, testFile, fileSizes) + err := testVolumeIO(f, cs, storageframework.ConvertTestConfig(l.config), *l.resource.VolSource, &podSec, testFile, fileSizes) framework.ExpectNoError(err) }) } func createFileSizes(maxFileSize int64) []int64 { allFileSizes := []int64{ - testpatterns.FileSizeSmall, - testpatterns.FileSizeMedium, - testpatterns.FileSizeLarge, + storageframework.FileSizeSmall, + storageframework.FileSizeMedium, + storageframework.FileSizeLarge, } fileSizes := []int64{} @@ -197,7 +199,7 @@ func makePodSpec(config e2evolume.TestConfig, initCmd string, volsrc v1.VolumeSo InitContainers: []v1.Container{ { Name: config.Prefix + "-io-init", - Image: e2evolume.GetDefaultTestImage(), + Image: e2epod.GetDefaultTestImage(), Command: []string{ "/bin/sh", "-c", @@ -214,7 +216,7 @@ func makePodSpec(config e2evolume.TestConfig, initCmd string, volsrc v1.VolumeSo Containers: []v1.Container{ { Name: config.Prefix + "-io-client", - Image: e2evolume.GetDefaultTestImage(), + Image: e2epod.GetDefaultTestImage(), Command: []string{ "/bin/sh", "-c", @@ -247,9 +249,9 @@ func makePodSpec(config e2evolume.TestConfig, initCmd string, volsrc v1.VolumeSo // Write `fsize` bytes to `fpath` in the pod, using dd and the `ddInput` file. func writeToFile(f *framework.Framework, pod *v1.Pod, fpath, ddInput string, fsize int64) error { ginkgo.By(fmt.Sprintf("writing %d bytes to test file %s", fsize, fpath)) - loopCnt := fsize / testpatterns.MinFileSize - writeCmd := fmt.Sprintf("i=0; while [ $i -lt %d ]; do dd if=%s bs=%d >>%s 2>/dev/null; let i+=1; done", loopCnt, ddInput, testpatterns.MinFileSize, fpath) - stdout, stderr, err := utils.PodExec(f, pod, writeCmd) + loopCnt := fsize / storageframework.MinFileSize + writeCmd := fmt.Sprintf("i=0; while [ $i -lt %d ]; do dd if=%s bs=%d >>%s 2>/dev/null; let i+=1; done", loopCnt, ddInput, storageframework.MinFileSize, fpath) + stdout, stderr, err := e2evolume.PodExec(f, pod, writeCmd) if err != nil { return fmt.Errorf("error writing to volume using %q: %s\nstdout: %s\nstderr: %s", writeCmd, err, stdout, stderr) } @@ -259,7 +261,7 @@ func writeToFile(f *framework.Framework, pod *v1.Pod, fpath, ddInput string, fsi // Verify that the test file is the expected size and contains the expected content. func verifyFile(f *framework.Framework, pod *v1.Pod, fpath string, expectSize int64, ddInput string) error { ginkgo.By("verifying file size") - rtnstr, stderr, err := utils.PodExec(f, pod, fmt.Sprintf("stat -c %%s %s", fpath)) + rtnstr, stderr, err := e2evolume.PodExec(f, pod, fmt.Sprintf("stat -c %%s %s", fpath)) if err != nil || rtnstr == "" { return fmt.Errorf("unable to get file size via `stat %s`: %v\nstdout: %s\nstderr: %s", fpath, err, rtnstr, stderr) } @@ -272,7 +274,7 @@ func verifyFile(f *framework.Framework, pod *v1.Pod, fpath string, expectSize in } ginkgo.By("verifying file hash") - rtnstr, stderr, err = utils.PodExec(f, pod, fmt.Sprintf("md5sum %s | cut -d' ' -f1", fpath)) + rtnstr, stderr, err = e2evolume.PodExec(f, pod, fmt.Sprintf("md5sum %s | cut -d' ' -f1", fpath)) if err != nil { return fmt.Errorf("unable to test file hash via `md5sum %s`: %v\nstdout: %s\nstderr: %s", fpath, err, rtnstr, stderr) } @@ -293,7 +295,7 @@ func verifyFile(f *framework.Framework, pod *v1.Pod, fpath string, expectSize in // Delete `fpath` to save some disk space on host. Delete errors are logged but ignored. func deleteFile(f *framework.Framework, pod *v1.Pod, fpath string) { ginkgo.By(fmt.Sprintf("deleting test file %s...", fpath)) - stdout, stderr, err := utils.PodExec(f, pod, fmt.Sprintf("rm -f %s", fpath)) + stdout, stderr, err := e2evolume.PodExec(f, pod, fmt.Sprintf("rm -f %s", fpath)) if err != nil { // keep going, the test dir will be deleted when the volume is unmounted framework.Logf("unable to delete test file %s: %v\nerror ignored, continuing test\nstdout: %s\nstderr: %s", fpath, err, stdout, stderr) @@ -309,7 +311,7 @@ func deleteFile(f *framework.Framework, pod *v1.Pod, fpath string) { func testVolumeIO(f *framework.Framework, cs clientset.Interface, config e2evolume.TestConfig, volsrc v1.VolumeSource, podSecContext *v1.PodSecurityContext, file string, fsizes []int64) (err error) { ddInput := filepath.Join(mountPath, fmt.Sprintf("%s-%s-dd_if", config.Prefix, config.Namespace)) writeBlk := strings.Repeat("abcdefghijklmnopqrstuvwxyz123456", 32) // 1KiB value - loopCnt := testpatterns.MinFileSize / int64(len(writeBlk)) + loopCnt := storageframework.MinFileSize / int64(len(writeBlk)) // initContainer cmd to create and fill dd's input file. The initContainer is used to create // the `dd` input file which is currently 1MiB. Rather than store a 1MiB go value, a loop is // used to create a 1MiB file in the target directory. @@ -338,7 +340,7 @@ func testVolumeIO(f *framework.Framework, cs clientset.Interface, config e2evolu } }() - err = e2epod.WaitForPodRunningInNamespace(cs, clientPod) + err = e2epod.WaitTimeoutForPodRunningInNamespace(cs, clientPod.Name, clientPod.Namespace, f.Timeouts.PodStart) if err != nil { return fmt.Errorf("client pod %q not running: %v", clientPod.Name, err) } @@ -346,8 +348,8 @@ func testVolumeIO(f *framework.Framework, cs clientset.Interface, config e2evolu // create files of the passed-in file sizes and verify test file size and content for _, fsize := range fsizes { // file sizes must be a multiple of `MinFileSize` - if math.Mod(float64(fsize), float64(testpatterns.MinFileSize)) != 0 { - fsize = fsize/testpatterns.MinFileSize + testpatterns.MinFileSize + if math.Mod(float64(fsize), float64(storageframework.MinFileSize)) != 0 { + fsize = fsize/storageframework.MinFileSize + storageframework.MinFileSize } fpath := filepath.Join(mountPath, fmt.Sprintf("%s-%d", file, fsize)) defer func() { diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/volume_stress.go b/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/volume_stress.go index c75225b27536..5741f50fe9aa 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/volume_stress.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/volume_stress.go @@ -32,84 +32,87 @@ import ( e2epod "k8s.io/kubernetes/test/e2e/framework/pod" e2epv "k8s.io/kubernetes/test/e2e/framework/pv" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" - "k8s.io/kubernetes/test/e2e/storage/testpatterns" + storageframework "k8s.io/kubernetes/test/e2e/storage/framework" + storageutils "k8s.io/kubernetes/test/e2e/storage/utils" ) type volumeStressTestSuite struct { - tsInfo TestSuiteInfo + tsInfo storageframework.TestSuiteInfo } type volumeStressTest struct { - config *PerTestConfig + config *storageframework.PerTestConfig driverCleanup func() migrationCheck *migrationOpCheck - resources []*VolumeResource - pods []*v1.Pod + volumes []*storageframework.VolumeResource + pods []*v1.Pod // stop and wait for any async routines wg sync.WaitGroup ctx context.Context cancel context.CancelFunc - testOptions StressTestOptions + testOptions storageframework.StressTestOptions } -var _ TestSuite = &volumeStressTestSuite{} +var _ storageframework.TestSuite = &volumeStressTestSuite{} -// InitVolumeStressTestSuite returns volumeStressTestSuite that implements TestSuite interface -func InitVolumeStressTestSuite() TestSuite { +// InitCustomVolumeStressTestSuite returns volumeStressTestSuite that implements TestSuite interface +// using custom test patterns +func InitCustomVolumeStressTestSuite(patterns []storageframework.TestPattern) storageframework.TestSuite { return &volumeStressTestSuite{ - tsInfo: TestSuiteInfo{ - Name: "volume-stress", - TestPatterns: []testpatterns.TestPattern{ - testpatterns.DefaultFsDynamicPV, - testpatterns.BlockVolModeDynamicPV, - }, + tsInfo: storageframework.TestSuiteInfo{ + Name: "volume-stress", + TestPatterns: patterns, }, } } -func (t *volumeStressTestSuite) GetTestSuiteInfo() TestSuiteInfo { +// InitVolumeStressTestSuite returns volumeStressTestSuite that implements TestSuite interface +// using testsuite default patterns +func InitVolumeStressTestSuite() storageframework.TestSuite { + patterns := []storageframework.TestPattern{ + storageframework.DefaultFsDynamicPV, + storageframework.BlockVolModeDynamicPV, + } + return InitCustomVolumeStressTestSuite(patterns) +} + +func (t *volumeStressTestSuite) GetTestSuiteInfo() storageframework.TestSuiteInfo { return t.tsInfo } -func (t *volumeStressTestSuite) SkipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) { +func (t *volumeStressTestSuite) SkipUnsupportedTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) { + dInfo := driver.GetDriverInfo() + if dInfo.StressTestOptions == nil { + e2eskipper.Skipf("Driver %s doesn't specify stress test options -- skipping", dInfo.Name) + } + if dInfo.StressTestOptions.NumPods <= 0 { + framework.Failf("NumPods in stress test options must be a positive integer, received: %d", dInfo.StressTestOptions.NumPods) + } + if dInfo.StressTestOptions.NumRestarts <= 0 { + framework.Failf("NumRestarts in stress test options must be a positive integer, received: %d", dInfo.StressTestOptions.NumRestarts) + } + + if _, ok := driver.(storageframework.DynamicPVTestDriver); !ok { + e2eskipper.Skipf("Driver %s doesn't implement DynamicPVTestDriver -- skipping", dInfo.Name) + } + if !driver.GetDriverInfo().Capabilities[storageframework.CapBlock] && pattern.VolMode == v1.PersistentVolumeBlock { + e2eskipper.Skipf("Driver %q does not support block volume mode - skipping", dInfo.Name) + } } -func (t *volumeStressTestSuite) DefineTests(driver TestDriver, pattern testpatterns.TestPattern) { +func (t *volumeStressTestSuite) DefineTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) { var ( dInfo = driver.GetDriverInfo() cs clientset.Interface l *volumeStressTest ) - // Check preconditions before setting up namespace via framework below. - ginkgo.BeforeEach(func() { - if dInfo.StressTestOptions == nil { - e2eskipper.Skipf("Driver %s doesn't specify stress test options -- skipping", dInfo.Name) - } - if dInfo.StressTestOptions.NumPods <= 0 { - framework.Failf("NumPods in stress test options must be a positive integer, received: %d", dInfo.StressTestOptions.NumPods) - } - if dInfo.StressTestOptions.NumRestarts <= 0 { - framework.Failf("NumRestarts in stress test options must be a positive integer, received: %d", dInfo.StressTestOptions.NumRestarts) - } - - if _, ok := driver.(DynamicPVTestDriver); !ok { - e2eskipper.Skipf("Driver %s doesn't implement DynamicPVTestDriver -- skipping", dInfo.Name) - } - - if !driver.GetDriverInfo().Capabilities[CapBlock] && pattern.VolMode == v1.PersistentVolumeBlock { - e2eskipper.Skipf("Driver %q does not support block volume mode - skipping", dInfo.Name) - } - }) - - // This intentionally comes after checking the preconditions because it - // registers its own BeforeEach which creates the namespace. Beware that it - // also registers an AfterEach which renders f unusable. Any code using + // Beware that it also registers an AfterEach which renders f unusable. Any code using // f must run inside an It or Context callback. - f := framework.NewDefaultFramework("volume-stress") + f := framework.NewFrameworkWithCustomTimeouts("stress", storageframework.GetDriverTimeouts(driver)) init := func() { cs = f.ClientSet @@ -118,7 +121,7 @@ func (t *volumeStressTestSuite) DefineTests(driver TestDriver, pattern testpatte // Now do the more expensive test initialization. l.config, l.driverCleanup = driver.PrepareTest(f) l.migrationCheck = newMigrationOpCheck(f.ClientSet, dInfo.InTreePluginName) - l.resources = []*VolumeResource{} + l.volumes = []*storageframework.VolumeResource{} l.pods = []*v1.Pod{} l.testOptions = *dInfo.StressTestOptions l.ctx, l.cancel = context.WithCancel(context.Background()) @@ -127,8 +130,8 @@ func (t *volumeStressTestSuite) DefineTests(driver TestDriver, pattern testpatte createPodsAndVolumes := func() { for i := 0; i < l.testOptions.NumPods; i++ { framework.Logf("Creating resources for pod %v/%v", i, l.testOptions.NumPods-1) - r := CreateVolumeResource(driver, l.config, pattern, t.GetTestSuiteInfo().SupportedSizeRange) - l.resources = append(l.resources, r) + r := storageframework.CreateVolumeResource(driver, l.config, pattern, t.GetTestSuiteInfo().SupportedSizeRange) + l.volumes = append(l.volumes, r) podConfig := e2epod.Config{ NS: f.Namespace.Name, PVCs: []*v1.PersistentVolumeClaim{r.Pvc}, @@ -142,23 +145,47 @@ func (t *volumeStressTestSuite) DefineTests(driver TestDriver, pattern testpatte } cleanup := func() { - var errs []error - framework.Logf("Stopping and waiting for all test routines to finish") l.cancel() l.wg.Wait() + var ( + errs []error + mu sync.Mutex + wg sync.WaitGroup + ) + + wg.Add(len(l.pods)) for _, pod := range l.pods { - framework.Logf("Deleting pod %v", pod.Name) - err := e2epod.DeletePodWithWait(cs, pod) - errs = append(errs, err) + go func(pod *v1.Pod) { + defer ginkgo.GinkgoRecover() + defer wg.Done() + + framework.Logf("Deleting pod %v", pod.Name) + err := e2epod.DeletePodWithWait(cs, pod) + mu.Lock() + defer mu.Unlock() + errs = append(errs, err) + }(pod) } + wg.Wait() - for _, resource := range l.resources { - errs = append(errs, resource.CleanupResource()) + wg.Add(len(l.volumes)) + for _, volume := range l.volumes { + go func(volume *storageframework.VolumeResource) { + defer ginkgo.GinkgoRecover() + defer wg.Done() + + framework.Logf("Deleting volume %s", volume.Pvc.GetName()) + err := volume.CleanupResource() + mu.Lock() + defer mu.Unlock() + errs = append(errs, err) + }(volume) } + wg.Wait() - errs = append(errs, tryFunc(l.driverCleanup)) + errs = append(errs, storageutils.TryFunc(l.driverCleanup)) framework.ExpectNoError(errors.NewAggregate(errs), "while cleaning up resource") l.migrationCheck.validateMigrationVolumeOpCounts() } @@ -194,7 +221,7 @@ func (t *volumeStressTestSuite) DefineTests(driver TestDriver, pattern testpatte framework.Failf("Failed to create pod-%v [%+v]. Error: %v", podIndex, pod, err) } - err = e2epod.WaitForPodRunningInNamespace(cs, pod) + err = e2epod.WaitTimeoutForPodRunningInNamespace(cs, pod.Name, pod.Namespace, f.Timeouts.PodStart) if err != nil { l.cancel() framework.Failf("Failed to wait for pod-%v [%+v] turn into running status. Error: %v", podIndex, pod, err) diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/volumelimits.go b/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/volumelimits.go index 72a50ed83f37..772a94756fd4 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/volumelimits.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/volumelimits.go @@ -38,11 +38,12 @@ import ( e2enode "k8s.io/kubernetes/test/e2e/framework/node" e2epod "k8s.io/kubernetes/test/e2e/framework/pod" e2epv "k8s.io/kubernetes/test/e2e/framework/pv" - "k8s.io/kubernetes/test/e2e/storage/testpatterns" + storageframework "k8s.io/kubernetes/test/e2e/storage/framework" + storageutils "k8s.io/kubernetes/test/e2e/storage/utils" ) type volumeLimitsTestSuite struct { - tsInfo TestSuiteInfo + tsInfo storageframework.TestSuiteInfo } const ( @@ -55,36 +56,44 @@ const ( csiNodeInfoTimeout = 1 * time.Minute ) -var _ TestSuite = &volumeLimitsTestSuite{} +var _ storageframework.TestSuite = &volumeLimitsTestSuite{} -// InitVolumeLimitsTestSuite returns volumeLimitsTestSuite that implements TestSuite interface -func InitVolumeLimitsTestSuite() TestSuite { +// InitCustomVolumeLimitsTestSuite returns volumeLimitsTestSuite that implements TestSuite interface +// using custom test patterns +func InitCustomVolumeLimitsTestSuite(patterns []storageframework.TestPattern) storageframework.TestSuite { return &volumeLimitsTestSuite{ - tsInfo: TestSuiteInfo{ - Name: "volumeLimits", - TestPatterns: []testpatterns.TestPattern{ - testpatterns.FsVolModeDynamicPV, - }, + tsInfo: storageframework.TestSuiteInfo{ + Name: "volumeLimits", + TestPatterns: patterns, }, } } -func (t *volumeLimitsTestSuite) GetTestSuiteInfo() TestSuiteInfo { +// InitVolumeLimitsTestSuite returns volumeLimitsTestSuite that implements TestSuite interface +// using testsuite default patterns +func InitVolumeLimitsTestSuite() storageframework.TestSuite { + patterns := []storageframework.TestPattern{ + storageframework.FsVolModeDynamicPV, + } + return InitCustomVolumeLimitsTestSuite(patterns) +} + +func (t *volumeLimitsTestSuite) GetTestSuiteInfo() storageframework.TestSuiteInfo { return t.tsInfo } -func (t *volumeLimitsTestSuite) SkipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) { +func (t *volumeLimitsTestSuite) SkipUnsupportedTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) { } -func (t *volumeLimitsTestSuite) DefineTests(driver TestDriver, pattern testpatterns.TestPattern) { +func (t *volumeLimitsTestSuite) DefineTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) { type local struct { - config *PerTestConfig + config *storageframework.PerTestConfig testCleanup func() cs clientset.Interface ns *v1.Namespace // VolumeResource contains pv, pvc, sc, etc. of the first pod created - resource *VolumeResource + resource *storageframework.VolumeResource // All created PVCs, incl. the one in resource pvcs []*v1.PersistentVolumeClaim @@ -99,8 +108,9 @@ func (t *volumeLimitsTestSuite) DefineTests(driver TestDriver, pattern testpatte l local ) - // No preconditions to test. Normally they would be in a BeforeEach here. - f := framework.NewDefaultFramework("volumelimits") + // Beware that it also registers an AfterEach which renders f unusable. Any code using + // f must run inside an It or Context callback. + f := framework.NewFrameworkWithCustomTimeouts("volumelimits", storageframework.GetDriverTimeouts(driver)) // This checks that CSIMaxVolumeLimitChecker works as expected. // A randomly chosen node should be able to handle as many CSI volumes as @@ -112,16 +122,17 @@ func (t *volumeLimitsTestSuite) DefineTests(driver TestDriver, pattern testpatte // BEWARE: the test may create lot of volumes and it's really slow. ginkgo.It("should support volume limits [Serial]", func() { driverInfo := driver.GetDriverInfo() - if !driverInfo.Capabilities[CapVolumeLimits] { + if !driverInfo.Capabilities[storageframework.CapVolumeLimits] { ginkgo.Skip(fmt.Sprintf("driver %s does not support volume limits", driverInfo.Name)) } - var dDriver DynamicPVTestDriver - if dDriver = driver.(DynamicPVTestDriver); dDriver == nil { + var dDriver storageframework.DynamicPVTestDriver + if dDriver = driver.(storageframework.DynamicPVTestDriver); dDriver == nil { framework.Failf("Test driver does not provide dynamically created volumes") } l.ns = f.Namespace l.cs = f.ClientSet + l.config, l.testCleanup = driver.PrepareTest(f) defer l.testCleanup() @@ -144,16 +155,16 @@ func (t *volumeLimitsTestSuite) DefineTests(driver TestDriver, pattern testpatte // Create a storage class and generate a PVC. Do not instantiate the PVC yet, keep it for the last pod. testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange driverVolumeSizeRange := dDriver.GetDriverInfo().SupportedSizeRange - claimSize, err := getSizeRangesIntersection(testVolumeSizeRange, driverVolumeSizeRange) + claimSize, err := storageutils.GetSizeRangesIntersection(testVolumeSizeRange, driverVolumeSizeRange) framework.ExpectNoError(err, "determine intersection of test size range %+v and driver size range %+v", testVolumeSizeRange, dDriver) - l.resource = CreateVolumeResource(driver, l.config, pattern, testVolumeSizeRange) + l.resource = storageframework.CreateVolumeResource(driver, l.config, pattern, testVolumeSizeRange) defer func() { err := l.resource.CleanupResource() framework.ExpectNoError(err, "while cleaning up resource") }() defer func() { - cleanupTest(l.cs, l.ns.Name, l.runningPod.Name, l.unschedulablePod.Name, l.pvcs, l.pvNames) + cleanupTest(l.cs, l.ns.Name, l.runningPod.Name, l.unschedulablePod.Name, l.pvcs, l.pvNames, testSlowMultiplier*f.Timeouts.PVDelete) }() // Create PVCs for one gigantic pod. @@ -183,11 +194,11 @@ func (t *volumeLimitsTestSuite) DefineTests(driver TestDriver, pattern testpatte framework.ExpectNoError(err) ginkgo.By("Waiting for all PVCs to get Bound") - l.pvNames, err = waitForAllPVCsBound(l.cs, testSlowMultiplier*e2epv.PVBindingTimeout, l.pvcs) + l.pvNames, err = waitForAllPVCsBound(l.cs, testSlowMultiplier*f.Timeouts.PVBound, l.pvcs) framework.ExpectNoError(err) ginkgo.By("Waiting for the pod Running") - err = e2epod.WaitTimeoutForPodRunningInNamespace(l.cs, l.runningPod.Name, l.ns.Name, testSlowMultiplier*framework.PodStartTimeout) + err = e2epod.WaitTimeoutForPodRunningInNamespace(l.cs, l.runningPod.Name, l.ns.Name, testSlowMultiplier*f.Timeouts.PodStart) framework.ExpectNoError(err) ginkgo.By("Creating an extra pod with one volume to exceed the limit") @@ -203,7 +214,7 @@ func (t *volumeLimitsTestSuite) DefineTests(driver TestDriver, pattern testpatte framework.ExpectNoError(err, "Failed to create an extra pod with one volume to exceed the limit") ginkgo.By("Waiting for the pod to get unschedulable with the right message") - err = e2epod.WaitForPodCondition(l.cs, l.ns.Name, l.unschedulablePod.Name, "Unschedulable", framework.PodStartTimeout, func(pod *v1.Pod) (bool, error) { + err = e2epod.WaitForPodCondition(l.cs, l.ns.Name, l.unschedulablePod.Name, "Unschedulable", f.Timeouts.PodStart, func(pod *v1.Pod) (bool, error) { if pod.Status.Phase == v1.PodPending { reg, err := regexp.Compile(`max.+volume.+count`) if err != nil { @@ -225,7 +236,7 @@ func (t *volumeLimitsTestSuite) DefineTests(driver TestDriver, pattern testpatte }) } -func cleanupTest(cs clientset.Interface, ns string, runningPodName, unschedulablePodName string, pvcs []*v1.PersistentVolumeClaim, pvNames sets.String) error { +func cleanupTest(cs clientset.Interface, ns string, runningPodName, unschedulablePodName string, pvcs []*v1.PersistentVolumeClaim, pvNames sets.String, timeout time.Duration) error { var cleanupErrors []string if runningPodName != "" { err := cs.CoreV1().Pods(ns).Delete(context.TODO(), runningPodName, metav1.DeleteOptions{}) @@ -248,7 +259,7 @@ func cleanupTest(cs clientset.Interface, ns string, runningPodName, unschedulabl // Wait for the PVs to be deleted. It includes also pod and PVC deletion because of PVC protection. // We use PVs to make sure that the test does not leave orphan PVs when a CSI driver is destroyed // just after the test ends. - err := wait.Poll(5*time.Second, testSlowMultiplier*e2epv.PVDeletingTimeout, func() (bool, error) { + err := wait.Poll(5*time.Second, timeout, func() (bool, error) { existing := 0 for _, pvName := range pvNames.UnsortedList() { _, err := cs.CoreV1().PersistentVolumes().Get(context.TODO(), pvName, metav1.GetOptions{}) @@ -305,14 +316,14 @@ func waitForAllPVCsBound(cs clientset.Interface, timeout time.Duration, pvcs []* return pvNames, nil } -func getNodeLimits(cs clientset.Interface, config *PerTestConfig, nodeName string, driverInfo *DriverInfo) (int, error) { +func getNodeLimits(cs clientset.Interface, config *storageframework.PerTestConfig, nodeName string, driverInfo *storageframework.DriverInfo) (int, error) { if len(driverInfo.InTreePluginName) == 0 { return getCSINodeLimits(cs, config, nodeName, driverInfo) } return getInTreeNodeLimits(cs, nodeName, driverInfo) } -func getInTreeNodeLimits(cs clientset.Interface, nodeName string, driverInfo *DriverInfo) (int, error) { +func getInTreeNodeLimits(cs clientset.Interface, nodeName string, driverInfo *storageframework.DriverInfo) (int, error) { node, err := cs.CoreV1().Nodes().Get(context.TODO(), nodeName, metav1.GetOptions{}) if err != nil { return 0, err @@ -339,7 +350,7 @@ func getInTreeNodeLimits(cs clientset.Interface, nodeName string, driverInfo *Dr return int(limit.Value()), nil } -func getCSINodeLimits(cs clientset.Interface, config *PerTestConfig, nodeName string, driverInfo *DriverInfo) (int, error) { +func getCSINodeLimits(cs clientset.Interface, config *storageframework.PerTestConfig, nodeName string, driverInfo *storageframework.DriverInfo) (int, error) { // Retry with a timeout, the driver might just have been installed and kubelet takes a while to publish everything. var limit int err := wait.PollImmediate(2*time.Second, csiNodeInfoTimeout, func() (bool, error) { diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/volumemode.go b/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/volumemode.go index 1343335968b6..48df518457ce 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/volumemode.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/volumemode.go @@ -39,8 +39,8 @@ import ( e2epv "k8s.io/kubernetes/test/e2e/framework/pv" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" e2evolume "k8s.io/kubernetes/test/e2e/framework/volume" - "k8s.io/kubernetes/test/e2e/storage/testpatterns" - "k8s.io/kubernetes/test/e2e/storage/utils" + storageframework "k8s.io/kubernetes/test/e2e/storage/framework" + storageutils "k8s.io/kubernetes/test/e2e/storage/utils" ) const ( @@ -49,22 +49,18 @@ const ( ) type volumeModeTestSuite struct { - tsInfo TestSuiteInfo + tsInfo storageframework.TestSuiteInfo } -var _ TestSuite = &volumeModeTestSuite{} +var _ storageframework.TestSuite = &volumeModeTestSuite{} -// InitVolumeModeTestSuite returns volumeModeTestSuite that implements TestSuite interface -func InitVolumeModeTestSuite() TestSuite { +// InitCustomVolumeModeTestSuite returns volumeModeTestSuite that implements TestSuite interface +// using custom test patterns +func InitCustomVolumeModeTestSuite(patterns []storageframework.TestPattern) storageframework.TestSuite { return &volumeModeTestSuite{ - tsInfo: TestSuiteInfo{ - Name: "volumeMode", - TestPatterns: []testpatterns.TestPattern{ - testpatterns.FsVolModePreprovisionedPV, - testpatterns.FsVolModeDynamicPV, - testpatterns.BlockVolModePreprovisionedPV, - testpatterns.BlockVolModeDynamicPV, - }, + tsInfo: storageframework.TestSuiteInfo{ + Name: "volumeMode", + TestPatterns: patterns, SupportedSizeRange: e2evolume.SizeRange{ Min: "1Mi", }, @@ -72,22 +68,34 @@ func InitVolumeModeTestSuite() TestSuite { } } -func (t *volumeModeTestSuite) GetTestSuiteInfo() TestSuiteInfo { +// InitVolumeModeTestSuite returns volumeModeTestSuite that implements TestSuite interface +// using testsuite default patterns +func InitVolumeModeTestSuite() storageframework.TestSuite { + patterns := []storageframework.TestPattern{ + storageframework.FsVolModePreprovisionedPV, + storageframework.FsVolModeDynamicPV, + storageframework.BlockVolModePreprovisionedPV, + storageframework.BlockVolModeDynamicPV, + } + return InitCustomVolumeModeTestSuite(patterns) +} + +func (t *volumeModeTestSuite) GetTestSuiteInfo() storageframework.TestSuiteInfo { return t.tsInfo } -func (t *volumeModeTestSuite) SkipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) { +func (t *volumeModeTestSuite) SkipUnsupportedTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) { } -func (t *volumeModeTestSuite) DefineTests(driver TestDriver, pattern testpatterns.TestPattern) { +func (t *volumeModeTestSuite) DefineTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) { type local struct { - config *PerTestConfig + config *storageframework.PerTestConfig driverCleanup func() cs clientset.Interface ns *v1.Namespace // VolumeResource contains pv, pvc, sc, etc., owns cleaning that up - VolumeResource + storageframework.VolumeResource migrationCheck *migrationOpCheck } @@ -96,13 +104,9 @@ func (t *volumeModeTestSuite) DefineTests(driver TestDriver, pattern testpattern l local ) - // No preconditions to test. Normally they would be in a BeforeEach here. - - // This intentionally comes after checking the preconditions because it - // registers its own BeforeEach which creates the namespace. Beware that it - // also registers an AfterEach which renders f unusable. Any code using + // Beware that it also registers an AfterEach which renders f unusable. Any code using // f must run inside an It or Context callback. - f := framework.NewDefaultFramework("volumemode") + f := framework.NewFrameworkWithCustomTimeouts("volumemode", storageframework.GetDriverTimeouts(driver)) init := func() { l = local{} @@ -127,22 +131,22 @@ func (t *volumeModeTestSuite) DefineTests(driver TestDriver, pattern testpattern volumeNodeAffinity *v1.VolumeNodeAffinity ) - l.VolumeResource = VolumeResource{ + l.VolumeResource = storageframework.VolumeResource{ Config: l.config, Pattern: pattern, } // Create volume for pre-provisioned volume tests - l.Volume = CreateVolume(driver, l.config, pattern.VolType) + l.Volume = storageframework.CreateVolume(driver, l.config, pattern.VolType) switch pattern.VolType { - case testpatterns.PreprovisionedPV: + case storageframework.PreprovisionedPV: if pattern.VolMode == v1.PersistentVolumeBlock { scName = fmt.Sprintf("%s-%s-sc-for-block", l.ns.Name, dInfo.Name) } else if pattern.VolMode == v1.PersistentVolumeFilesystem { scName = fmt.Sprintf("%s-%s-sc-for-file", l.ns.Name, dInfo.Name) } - if pDriver, ok := driver.(PreprovisionedPVTestDriver); ok { + if pDriver, ok := driver.(storageframework.PreprovisionedPVTestDriver); ok { pvSource, volumeNodeAffinity = pDriver.GetPersistentVolumeSource(false, fsType, l.Volume) if pvSource == nil { e2eskipper.Skipf("Driver %q does not define PersistentVolumeSource - skipping", dInfo.Name) @@ -153,8 +157,8 @@ func (t *volumeModeTestSuite) DefineTests(driver TestDriver, pattern testpattern l.Pv = e2epv.MakePersistentVolume(pvConfig) l.Pvc = e2epv.MakePersistentVolumeClaim(pvcConfig, l.ns.Name) } - case testpatterns.DynamicPV: - if dDriver, ok := driver.(DynamicPVTestDriver); ok { + case storageframework.DynamicPV: + if dDriver, ok := driver.(storageframework.DynamicPVTestDriver); ok { l.Sc = dDriver.GetDynamicProvisionStorageClass(l.config, fsType) if l.Sc == nil { e2eskipper.Skipf("Driver %q does not define Dynamic Provision StorageClass - skipping", dInfo.Name) @@ -162,7 +166,7 @@ func (t *volumeModeTestSuite) DefineTests(driver TestDriver, pattern testpattern l.Sc.VolumeBindingMode = &volBindMode testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange driverVolumeSizeRange := dInfo.SupportedSizeRange - claimSize, err := getSizeRangesIntersection(testVolumeSizeRange, driverVolumeSizeRange) + claimSize, err := storageutils.GetSizeRangesIntersection(testVolumeSizeRange, driverVolumeSizeRange) framework.ExpectNoError(err, "determine intersection of test size range %+v and driver size range %+v", testVolumeSizeRange, driverVolumeSizeRange) l.Pvc = e2epv.MakePersistentVolumeClaim(e2epv.PersistentVolumeClaimConfig{ @@ -179,16 +183,16 @@ func (t *volumeModeTestSuite) DefineTests(driver TestDriver, pattern testpattern cleanup := func() { var errs []error errs = append(errs, l.CleanupResource()) - errs = append(errs, tryFunc(l.driverCleanup)) + errs = append(errs, storageutils.TryFunc(l.driverCleanup)) l.driverCleanup = nil framework.ExpectNoError(errors.NewAggregate(errs), "while cleaning up resource") l.migrationCheck.validateMigrationVolumeOpCounts() } // We register different tests depending on the drive - isBlockSupported := dInfo.Capabilities[CapBlock] + isBlockSupported := dInfo.Capabilities[storageframework.CapBlock] switch pattern.VolType { - case testpatterns.PreprovisionedPV: + case storageframework.PreprovisionedPV: if pattern.VolMode == v1.PersistentVolumeBlock && !isBlockSupported { ginkgo.It("should fail to create pod by failing to mount volume [Slow]", func() { manualInit() @@ -209,15 +213,15 @@ func (t *volumeModeTestSuite) DefineTests(driver TestDriver, pattern testpattern l.Pvc, err = l.cs.CoreV1().PersistentVolumeClaims(l.ns.Name).Create(context.TODO(), l.Pvc, metav1.CreateOptions{}) framework.ExpectNoError(err, "Failed to create pvc") - framework.ExpectNoError(e2epv.WaitOnPVandPVC(l.cs, l.ns.Name, l.Pv, l.Pvc), "Failed to bind pv and pvc") + framework.ExpectNoError(e2epv.WaitOnPVandPVC(l.cs, f.Timeouts, l.ns.Name, l.Pv, l.Pvc), "Failed to bind pv and pvc") ginkgo.By("Creating pod") podConfig := e2epod.Config{ NS: l.ns.Name, PVCs: []*v1.PersistentVolumeClaim{l.Pvc}, - SeLinuxLabel: e2evolume.GetLinuxLabel(), + SeLinuxLabel: e2epod.GetLinuxLabel(), NodeSelection: l.config.ClientNodeSelection, - ImageID: e2evolume.GetDefaultTestImageID(), + ImageID: e2epod.GetDefaultTestImageID(), } pod, err := e2epod.MakeSecPod(&podConfig) framework.ExpectNoError(err, "Failed to create pod") @@ -236,7 +240,7 @@ func (t *volumeModeTestSuite) DefineTests(driver TestDriver, pattern testpattern }.AsSelector().String() msg := "Unable to attach or mount volumes" - err = e2eevents.WaitTimeoutForEvent(l.cs, l.ns.Name, eventSelector, msg, framework.PodStartTimeout) + err = e2eevents.WaitTimeoutForEvent(l.cs, l.ns.Name, eventSelector, msg, f.Timeouts.PodStart) // Events are unreliable, don't depend on the event. It's used only to speed up the test. if err != nil { framework.Logf("Warning: did not get event about FailedMountVolume") @@ -249,7 +253,7 @@ func (t *volumeModeTestSuite) DefineTests(driver TestDriver, pattern testpattern }) } - case testpatterns.DynamicPV: + case storageframework.DynamicPV: if pattern.VolMode == v1.PersistentVolumeBlock && !isBlockSupported { ginkgo.It("should fail in binding dynamic provisioned PV to PVC [Slow][LinuxOnly]", func() { manualInit() @@ -273,7 +277,7 @@ func (t *volumeModeTestSuite) DefineTests(driver TestDriver, pattern testpattern }.AsSelector().String() msg := "does not support block volume provisioning" - err = e2eevents.WaitTimeoutForEvent(l.cs, l.ns.Name, eventSelector, msg, framework.ClaimProvisionTimeout) + err = e2eevents.WaitTimeoutForEvent(l.cs, l.ns.Name, eventSelector, msg, f.Timeouts.ClaimProvision) // Events are unreliable, don't depend on the event. It's used only to speed up the test. if err != nil { framework.Logf("Warning: did not get event about provisioing failed") @@ -293,7 +297,7 @@ func (t *volumeModeTestSuite) DefineTests(driver TestDriver, pattern testpattern skipTestIfBlockNotSupported(driver) init() testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange - l.VolumeResource = *CreateVolumeResource(driver, l.config, pattern, testVolumeSizeRange) + l.VolumeResource = *storageframework.CreateVolumeResource(driver, l.config, pattern, testVolumeSizeRange) defer cleanup() ginkgo.By("Creating pod") @@ -301,8 +305,8 @@ func (t *volumeModeTestSuite) DefineTests(driver TestDriver, pattern testpattern podConfig := e2epod.Config{ NS: l.ns.Name, PVCs: []*v1.PersistentVolumeClaim{l.Pvc}, - SeLinuxLabel: e2evolume.GetLinuxLabel(), - ImageID: e2evolume.GetDefaultTestImageID(), + SeLinuxLabel: e2epod.GetLinuxLabel(), + ImageID: e2epod.GetDefaultTestImageID(), } pod, err := e2epod.MakeSecPod(&podConfig) framework.ExpectNoError(err) @@ -332,7 +336,7 @@ func (t *volumeModeTestSuite) DefineTests(driver TestDriver, pattern testpattern } else { msg = "has volumeMode Filesystem, but is specified in volumeDevices" } - err = e2eevents.WaitTimeoutForEvent(l.cs, l.ns.Name, eventSelector, msg, framework.PodStartTimeout) + err = e2eevents.WaitTimeoutForEvent(l.cs, l.ns.Name, eventSelector, msg, f.Timeouts.PodStart) // Events are unreliable, don't depend on them. They're used only to speed up the test. if err != nil { framework.Logf("Warning: did not get event about mismatched volume use") @@ -350,7 +354,7 @@ func (t *volumeModeTestSuite) DefineTests(driver TestDriver, pattern testpattern } init() testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange - l.VolumeResource = *CreateVolumeResource(driver, l.config, pattern, testVolumeSizeRange) + l.VolumeResource = *storageframework.CreateVolumeResource(driver, l.config, pattern, testVolumeSizeRange) defer cleanup() ginkgo.By("Creating pod") @@ -358,8 +362,8 @@ func (t *volumeModeTestSuite) DefineTests(driver TestDriver, pattern testpattern podConfig := e2epod.Config{ NS: l.ns.Name, PVCs: []*v1.PersistentVolumeClaim{l.Pvc}, - SeLinuxLabel: e2evolume.GetLinuxLabel(), - ImageID: e2evolume.GetDefaultTestImageID(), + SeLinuxLabel: e2epod.GetLinuxLabel(), + ImageID: e2epod.GetDefaultTestImageID(), } pod, err := e2epod.MakeSecPod(&podConfig) framework.ExpectNoError(err) @@ -387,7 +391,7 @@ func (t *volumeModeTestSuite) DefineTests(driver TestDriver, pattern testpattern framework.ExpectNoError(err) ginkgo.By("Listing mounted volumes in the pod") - hostExec := utils.NewHostExec(f) + hostExec := storageutils.NewHostExec(f) defer hostExec.Cleanup() volumePaths, devicePaths, err := listPodVolumePluginDirectory(hostExec, pod, node) framework.ExpectNoError(err) @@ -469,7 +473,7 @@ func swapVolumeMode(podTemplate *v1.Pod) *v1.Pod { // Sample output: // /var/lib/kubelet/pods/a4717a30-000a-4081-a7a8-f51adf280036/volumes/kubernetes.io~secret/default-token-rphdt // /var/lib/kubelet/pods/4475b7a3-4a55-4716-9119-fd0053d9d4a6/volumeDevices/kubernetes.io~aws-ebs/pvc-5f9f80f5-c90b-4586-9966-83f91711e1c0 -func listPodVolumePluginDirectory(h utils.HostExec, pod *v1.Pod, node *v1.Node) (mounts []string, devices []string, err error) { +func listPodVolumePluginDirectory(h storageutils.HostExec, pod *v1.Pod, node *v1.Node) (mounts []string, devices []string, err error) { mountPath := filepath.Join("/var/lib/kubelet/pods/", string(pod.UID), "volumes") devicePath := filepath.Join("/var/lib/kubelet/pods/", string(pod.UID), "volumeDevices") @@ -484,7 +488,7 @@ func listPodVolumePluginDirectory(h utils.HostExec, pod *v1.Pod, node *v1.Node) return mounts, devices, nil } -func listPodDirectory(h utils.HostExec, path string, node *v1.Node) ([]string, error) { +func listPodDirectory(h storageutils.HostExec, path string, node *v1.Node) ([]string, error) { // Return no error if the directory does not exist (e.g. there are no block volumes used) _, err := h.IssueCommandWithResult("test ! -d "+path, node) if err == nil { diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/volumeperf.go b/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/volumeperf.go new file mode 100644 index 000000000000..1ca13da5d904 --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/volumeperf.go @@ -0,0 +1,312 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package testsuites + +import ( + "context" + "fmt" + "github.com/davecgh/go-spew/spew" + "sync" + "time" + + "github.com/onsi/ginkgo" + + "k8s.io/api/core/v1" + storagev1 "k8s.io/api/storage/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/util/errors" + "k8s.io/apimachinery/pkg/watch" + clientset "k8s.io/client-go/kubernetes" + "k8s.io/client-go/tools/cache" + "k8s.io/kubernetes/test/e2e/framework" + e2epv "k8s.io/kubernetes/test/e2e/framework/pv" + e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" + storageframework "k8s.io/kubernetes/test/e2e/storage/framework" +) + +type volumePerformanceTestSuite struct { + tsInfo storageframework.TestSuiteInfo +} + +var _ storageframework.TestSuite = &volumePerformanceTestSuite{} + +const testTimeout = 15 * time.Minute + +// Time intervals when a resource was created, it enters +// the desired state and the elapsed time between these +// two states +type interval struct { + create time.Time + enterDesiredState time.Time + elapsed time.Duration +} + +// Consolidates performance stats for any operation +type performanceStats struct { + mutex *sync.Mutex + perObjectInterval map[string]*interval + operationMetrics *storageframework.Metrics +} + +// waitForProvisionCh receives a signal from controller +// when all PVCs are Bound +// The signal received on this channel is the list of +// PVC objects that are created in the test +// The test blocks until waitForProvisionCh receives a signal +// or the test times out +var waitForProvisionCh chan []*v1.PersistentVolumeClaim + +// InitVolumePerformanceTestSuite returns volumePerformanceTestSuite that implements TestSuite interface +func InitVolumePerformanceTestSuite() storageframework.TestSuite { + return &volumePerformanceTestSuite{ + tsInfo: storageframework.TestSuiteInfo{ + Name: "volume-lifecycle-performance", + TestPatterns: []storageframework.TestPattern{ + storageframework.FsVolModeDynamicPV, + }, + }, + } +} + +func (t *volumePerformanceTestSuite) GetTestSuiteInfo() storageframework.TestSuiteInfo { + return t.tsInfo +} + +func (t *volumePerformanceTestSuite) SkipUnsupportedTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) { +} + +func (t *volumePerformanceTestSuite) SkipRedundantSuite(driver storageframework.TestDriver, pattern storageframework.TestPattern) { +} + +func (t *volumePerformanceTestSuite) DefineTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) { + type local struct { + config *storageframework.PerTestConfig + testCleanup func() + cs clientset.Interface + ns *v1.Namespace + scName string + pvcs []*v1.PersistentVolumeClaim + options *storageframework.PerformanceTestOptions + stopCh chan struct{} + } + var ( + dInfo *storageframework.DriverInfo + l *local + ) + ginkgo.BeforeEach(func() { + // Check preconditions + dDriver := driver.(storageframework.DynamicPVTestDriver) + if dDriver == nil { + e2eskipper.Skipf("Test driver does not support dynamically created volumes") + + } + dInfo = dDriver.GetDriverInfo() + if dInfo == nil { + e2eskipper.Skipf("Failed to get Driver info -- skipping") + } + if dInfo.PerformanceTestOptions == nil || dInfo.PerformanceTestOptions.ProvisioningOptions == nil { + e2eskipper.Skipf("Driver %s doesn't specify performance test options -- skipping", dInfo.Name) + } + }) + + frameworkOptions := framework.Options{ + ClientQPS: 200, + ClientBurst: 400, + } + f := framework.NewFramework("volume-lifecycle-performance", frameworkOptions, nil) + f.AddAfterEach("cleanup", func(f *framework.Framework, failed bool) { + ginkgo.By("Closing informer channel") + close(l.stopCh) + ginkgo.By("Deleting all PVCs") + for _, pvc := range l.pvcs { + err := e2epv.DeletePersistentVolumeClaim(l.cs, pvc.Name, pvc.Namespace) + framework.ExpectNoError(err) + err = e2epv.WaitForPersistentVolumeDeleted(l.cs, pvc.Spec.VolumeName, 1*time.Second, 5*time.Minute) + framework.ExpectNoError(err) + } + ginkgo.By(fmt.Sprintf("Deleting Storage Class %s", l.scName)) + err := l.cs.StorageV1().StorageClasses().Delete(context.TODO(), l.scName, metav1.DeleteOptions{}) + framework.ExpectNoError(err) + l.testCleanup() + }) + + ginkgo.It("should provision volumes at scale within performance constraints [Slow] [Serial]", func() { + l = &local{ + cs: f.ClientSet, + ns: f.Namespace, + options: dInfo.PerformanceTestOptions, + } + l.config, l.testCleanup = driver.PrepareTest(f) + + // Stats for volume provisioning operation + // TODO: Add stats for attach, resize and snapshot + provisioningStats := &performanceStats{ + mutex: &sync.Mutex{}, + perObjectInterval: make(map[string]*interval), + operationMetrics: &storageframework.Metrics{}, + } + sc := driver.(storageframework.DynamicPVTestDriver).GetDynamicProvisionStorageClass(l.config, pattern.FsType) + ginkgo.By(fmt.Sprintf("Creating Storage Class %v", sc)) + // TODO: Add support for WaitForFirstConsumer volume binding mode + if sc.VolumeBindingMode != nil && *sc.VolumeBindingMode == storagev1.VolumeBindingWaitForFirstConsumer { + e2eskipper.Skipf("WaitForFirstConsumer binding mode currently not supported for performance tests") + } + ginkgo.By(fmt.Sprintf("Creating Storage Class %s", sc.Name)) + sc, err := l.cs.StorageV1().StorageClasses().Create(context.TODO(), sc, metav1.CreateOptions{}) + framework.ExpectNoError(err) + l.scName = sc.Name + + // Create a controller to watch on PVCs + // When all PVCs provisioned by this test are in the Bound state, the controller + // sends a signal to the channel + controller := newPVCWatch(f, l.options.ProvisioningOptions.Count, provisioningStats) + l.stopCh = make(chan struct{}) + go controller.Run(l.stopCh) + waitForProvisionCh = make(chan []*v1.PersistentVolumeClaim) + + ginkgo.By(fmt.Sprintf("Creating %d PVCs of size %s", l.options.ProvisioningOptions.Count, l.options.ProvisioningOptions.VolumeSize)) + for i := 0; i < l.options.ProvisioningOptions.Count; i++ { + pvc := e2epv.MakePersistentVolumeClaim(e2epv.PersistentVolumeClaimConfig{ + ClaimSize: l.options.ProvisioningOptions.VolumeSize, + StorageClassName: &sc.Name, + }, l.ns.Name) + pvc, err = l.cs.CoreV1().PersistentVolumeClaims(l.ns.Name).Create(context.TODO(), pvc, metav1.CreateOptions{}) + framework.ExpectNoError(err) + // Store create time for each PVC + provisioningStats.mutex.Lock() + provisioningStats.perObjectInterval[pvc.Name] = &interval{ + create: pvc.CreationTimestamp.Time, + } + provisioningStats.mutex.Unlock() + } + + ginkgo.By("Waiting for all PVCs to be Bound...") + + select { + case l.pvcs = <-waitForProvisionCh: + framework.Logf("All PVCs in Bound state") + case <-time.After(testTimeout): + ginkgo.Fail(fmt.Sprintf("expected all PVCs to be in Bound state within %v minutes", testTimeout)) + } + + ginkgo.By("Calculating performance metrics for provisioning operations") + createPerformanceStats(provisioningStats, l.options.ProvisioningOptions.Count, l.pvcs) + + ginkgo.By(fmt.Sprintf("Validating performance metrics for provisioning operations against baseline %v", spew.Sdump(l.options.ProvisioningOptions.ExpectedMetrics))) + errList := validatePerformanceStats(provisioningStats.operationMetrics, l.options.ProvisioningOptions.ExpectedMetrics) + framework.ExpectNoError(errors.NewAggregate(errList), "while validating performance metrics") + }) + +} + +// createPerformanceStats calculates individual metrics for an operation +// given the intervals collected during that operation +func createPerformanceStats(stats *performanceStats, provisionCount int, pvcs []*v1.PersistentVolumeClaim) { + var min, max, sum time.Duration + for _, pvc := range pvcs { + pvcMetric, ok := stats.perObjectInterval[pvc.Name] + framework.ExpectEqual(ok, true) + + elapsedTime := pvcMetric.elapsed + sum += elapsedTime + if elapsedTime < min || min == 0 { + min = elapsedTime + } + if elapsedTime > max { + max = elapsedTime + } + } + stats.operationMetrics = &storageframework.Metrics{ + AvgLatency: time.Duration(int64(sum) / int64(provisionCount)), + Throughput: float64(provisionCount) / max.Seconds(), + } +} + +// validatePerformanceStats validates if test performance metrics meet the baseline target +func validatePerformanceStats(operationMetrics *storageframework.Metrics, baselineMetrics *storageframework.Metrics) []error { + var errList []error + framework.Logf("Metrics to evaluate: %+v", spew.Sdump(operationMetrics)) + + if operationMetrics.AvgLatency > baselineMetrics.AvgLatency { + err := fmt.Errorf("expected latency to be less than %v but calculated latency %v", baselineMetrics.AvgLatency, operationMetrics.AvgLatency) + errList = append(errList, err) + } + if operationMetrics.Throughput < baselineMetrics.Throughput { + err := fmt.Errorf("expected throughput to be greater than %f but calculated throughput %f", baselineMetrics.Throughput, operationMetrics.Throughput) + errList = append(errList, err) + } + return errList +} + +// newPVCWatch creates an informer to check whether all PVCs are Bound +// When all PVCs are bound, the controller sends a signal to +// waitForProvisionCh to unblock the test +func newPVCWatch(f *framework.Framework, provisionCount int, pvcMetrics *performanceStats) cache.Controller { + defer ginkgo.GinkgoRecover() + count := 0 + countLock := &sync.Mutex{} + ns := f.Namespace.Name + var pvcs []*v1.PersistentVolumeClaim + checkPVCBound := func(oldPVC *v1.PersistentVolumeClaim, newPVC *v1.PersistentVolumeClaim) { + now := time.Now() + pvcMetrics.mutex.Lock() + defer pvcMetrics.mutex.Unlock() + countLock.Lock() + defer countLock.Unlock() + + // Check if PVC entered the bound state + if oldPVC.Status.Phase != v1.ClaimBound && newPVC.Status.Phase == v1.ClaimBound { + newPVCInterval, ok := pvcMetrics.perObjectInterval[newPVC.Name] + framework.ExpectEqual(ok, true, "PVC %s should exist in interval map already", newPVC.Name) + count++ + newPVCInterval.enterDesiredState = now + newPVCInterval.elapsed = now.Sub(newPVCInterval.create) + pvcs = append(pvcs, newPVC) + } + if count == provisionCount { + // Number of Bound PVCs equals the number of PVCs + // provisioned by this test + // Send those PVCs to the channel to unblock test + waitForProvisionCh <- pvcs + } + } + _, controller := cache.NewInformer( + &cache.ListWatch{ + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { + obj, err := f.ClientSet.CoreV1().PersistentVolumeClaims(ns).List(context.TODO(), metav1.ListOptions{}) + return runtime.Object(obj), err + }, + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { + return f.ClientSet.CoreV1().PersistentVolumeClaims(ns).Watch(context.TODO(), metav1.ListOptions{}) + }, + }, + &v1.PersistentVolumeClaim{}, + 0, + cache.ResourceEventHandlerFuncs{ + UpdateFunc: func(oldObj, newObj interface{}) { + oldPVC, ok := oldObj.(*v1.PersistentVolumeClaim) + framework.ExpectEqual(ok, true) + newPVC, ok := newObj.(*v1.PersistentVolumeClaim) + framework.ExpectEqual(ok, true) + + checkPVCBound(oldPVC, newPVC) + }, + }, + ) + return controller +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/volumes.go b/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/volumes.go index 9599895583c6..ab9799497f50 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/volumes.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/testsuites/volumes.go @@ -34,46 +34,24 @@ import ( e2epod "k8s.io/kubernetes/test/e2e/framework/pod" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" e2evolume "k8s.io/kubernetes/test/e2e/framework/volume" - "k8s.io/kubernetes/test/e2e/storage/testpatterns" + storageframework "k8s.io/kubernetes/test/e2e/storage/framework" + storageutils "k8s.io/kubernetes/test/e2e/storage/utils" imageutils "k8s.io/kubernetes/test/utils/image" ) type volumesTestSuite struct { - tsInfo TestSuiteInfo + tsInfo storageframework.TestSuiteInfo } -var _ TestSuite = &volumesTestSuite{} +var _ storageframework.TestSuite = &volumesTestSuite{} -// InitVolumesTestSuite returns volumesTestSuite that implements TestSuite interface -func InitVolumesTestSuite() TestSuite { +// InitCustomVolumesTestSuite returns volumesTestSuite that implements TestSuite interface +// using custom test patterns +func InitCustomVolumesTestSuite(patterns []storageframework.TestPattern) storageframework.TestSuite { return &volumesTestSuite{ - tsInfo: TestSuiteInfo{ - Name: "volumes", - TestPatterns: []testpatterns.TestPattern{ - // Default fsType - testpatterns.DefaultFsInlineVolume, - testpatterns.DefaultFsPreprovisionedPV, - testpatterns.DefaultFsDynamicPV, - // ext3 - testpatterns.Ext3InlineVolume, - testpatterns.Ext3PreprovisionedPV, - testpatterns.Ext3DynamicPV, - // ext4 - testpatterns.Ext4InlineVolume, - testpatterns.Ext4PreprovisionedPV, - testpatterns.Ext4DynamicPV, - // xfs - testpatterns.XfsInlineVolume, - testpatterns.XfsPreprovisionedPV, - testpatterns.XfsDynamicPV, - // ntfs - testpatterns.NtfsInlineVolume, - testpatterns.NtfsPreprovisionedPV, - testpatterns.NtfsDynamicPV, - // block volumes - testpatterns.BlockVolModePreprovisionedPV, - testpatterns.BlockVolModeDynamicPV, - }, + tsInfo: storageframework.TestSuiteInfo{ + Name: "volumes", + TestPatterns: patterns, SupportedSizeRange: e2evolume.SizeRange{ Min: "1Mi", }, @@ -81,46 +59,76 @@ func InitVolumesTestSuite() TestSuite { } } -func (t *volumesTestSuite) GetTestSuiteInfo() TestSuiteInfo { +// InitVolumesTestSuite returns volumesTestSuite that implements TestSuite interface +// using testsuite default patterns +func InitVolumesTestSuite() storageframework.TestSuite { + patterns := []storageframework.TestPattern{ + // Default fsType + storageframework.DefaultFsInlineVolume, + storageframework.DefaultFsPreprovisionedPV, + storageframework.DefaultFsDynamicPV, + // ext3 + storageframework.Ext3InlineVolume, + storageframework.Ext3PreprovisionedPV, + storageframework.Ext3DynamicPV, + // ext4 + storageframework.Ext4InlineVolume, + storageframework.Ext4PreprovisionedPV, + storageframework.Ext4DynamicPV, + // xfs + storageframework.XfsInlineVolume, + storageframework.XfsPreprovisionedPV, + storageframework.XfsDynamicPV, + // ntfs + storageframework.NtfsInlineVolume, + storageframework.NtfsPreprovisionedPV, + storageframework.NtfsDynamicPV, + // block volumes + storageframework.BlockVolModePreprovisionedPV, + storageframework.BlockVolModeDynamicPV, + } + return InitCustomVolumesTestSuite(patterns) +} + +func (t *volumesTestSuite) GetTestSuiteInfo() storageframework.TestSuiteInfo { return t.tsInfo } -func (t *volumesTestSuite) SkipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) { +func (t *volumesTestSuite) SkipUnsupportedTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) { + if pattern.VolMode == v1.PersistentVolumeBlock { + skipTestIfBlockNotSupported(driver) + } } -func skipExecTest(driver TestDriver) { +func skipExecTest(driver storageframework.TestDriver) { dInfo := driver.GetDriverInfo() - if !dInfo.Capabilities[CapExec] { + if !dInfo.Capabilities[storageframework.CapExec] { e2eskipper.Skipf("Driver %q does not support exec - skipping", dInfo.Name) } } -func skipTestIfBlockNotSupported(driver TestDriver) { +func skipTestIfBlockNotSupported(driver storageframework.TestDriver) { dInfo := driver.GetDriverInfo() - if !dInfo.Capabilities[CapBlock] { + if !dInfo.Capabilities[storageframework.CapBlock] { e2eskipper.Skipf("Driver %q does not provide raw block - skipping", dInfo.Name) } } -func (t *volumesTestSuite) DefineTests(driver TestDriver, pattern testpatterns.TestPattern) { +func (t *volumesTestSuite) DefineTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) { type local struct { - config *PerTestConfig + config *storageframework.PerTestConfig driverCleanup func() - resource *VolumeResource + resource *storageframework.VolumeResource migrationCheck *migrationOpCheck } var dInfo = driver.GetDriverInfo() var l local - // No preconditions to test. Normally they would be in a BeforeEach here. - - // This intentionally comes after checking the preconditions because it - // registers its own BeforeEach which creates the namespace. Beware that it - // also registers an AfterEach which renders f unusable. Any code using + // Beware that it also registers an AfterEach which renders f unusable. Any code using // f must run inside an It or Context callback. - f := framework.NewDefaultFramework("volume") + f := framework.NewFrameworkWithCustomTimeouts("volume", storageframework.GetDriverTimeouts(driver)) init := func() { l = local{} @@ -129,7 +137,7 @@ func (t *volumesTestSuite) DefineTests(driver TestDriver, pattern testpatterns.T l.config, l.driverCleanup = driver.PrepareTest(f) l.migrationCheck = newMigrationOpCheck(f.ClientSet, dInfo.InTreePluginName) testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange - l.resource = CreateVolumeResource(driver, l.config, pattern, testVolumeSizeRange) + l.resource = storageframework.CreateVolumeResource(driver, l.config, pattern, testVolumeSizeRange) if l.resource.VolSource == nil { e2eskipper.Skipf("Driver %q does not define volumeSource - skipping", dInfo.Name) } @@ -142,20 +150,16 @@ func (t *volumesTestSuite) DefineTests(driver TestDriver, pattern testpatterns.T l.resource = nil } - errs = append(errs, tryFunc(l.driverCleanup)) + errs = append(errs, storageutils.TryFunc(l.driverCleanup)) l.driverCleanup = nil framework.ExpectNoError(errors.NewAggregate(errs), "while cleaning up resource") l.migrationCheck.validateMigrationVolumeOpCounts() } ginkgo.It("should store data", func() { - if pattern.VolMode == v1.PersistentVolumeBlock { - skipTestIfBlockNotSupported(driver) - } - init() defer func() { - e2evolume.TestServerCleanup(f, convertTestConfig(l.config)) + e2evolume.TestServerCleanup(f, storageframework.ConvertTestConfig(l.config)) cleanup() }() @@ -169,9 +173,9 @@ func (t *volumesTestSuite) DefineTests(driver TestDriver, pattern testpatterns.T dInfo.Name, f.Namespace.Name), }, } - config := convertTestConfig(l.config) + config := storageframework.ConvertTestConfig(l.config) var fsGroup *int64 - if framework.NodeOSDistroIs("windows") && dInfo.Capabilities[CapFsGroup] { + if framework.NodeOSDistroIs("windows") && dInfo.Capabilities[storageframework.CapFsGroup] { fsGroupVal := int64(1234) fsGroup = &fsGroupVal } @@ -180,7 +184,7 @@ func (t *volumesTestSuite) DefineTests(driver TestDriver, pattern testpatterns.T // and we don't have reliable way to detect volumes are unmounted or // not before starting the second pod. e2evolume.InjectContent(f, config, fsGroup, pattern.FsType, tests) - if driver.GetDriverInfo().Capabilities[CapPersistence] { + if driver.GetDriverInfo().Capabilities[storageframework.CapPersistence] { e2evolume.TestVolumeClient(f, config, fsGroup, pattern.FsType, tests) } else { ginkgo.By("Skipping persistence check for non-persistent volume") @@ -203,7 +207,7 @@ func testScriptInPod( f *framework.Framework, volumeType string, source *v1.VolumeSource, - config *PerTestConfig) { + config *storageframework.PerTestConfig) { const ( volPath = "/vol1" @@ -227,7 +231,7 @@ func testScriptInPod( Containers: []v1.Container{ { Name: fmt.Sprintf("exec-container-%s", suffix), - Image: e2evolume.GetTestImage(imageutils.Nginx), + Image: e2epod.GetTestImage(imageutils.Nginx), Command: command, VolumeMounts: []v1.VolumeMount{ { diff --git a/vendor/k8s.io/kubernetes/test/e2e/scheduling/ubernetes_lite_volumes.go b/vendor/k8s.io/kubernetes/test/e2e/storage/ubernetes_lite_volumes.go similarity index 92% rename from vendor/k8s.io/kubernetes/test/e2e/scheduling/ubernetes_lite_volumes.go rename to vendor/k8s.io/kubernetes/test/e2e/storage/ubernetes_lite_volumes.go index 6c13901afb78..9cc20d7aa4b7 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/scheduling/ubernetes_lite_volumes.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/ubernetes_lite_volumes.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package scheduling +package storage import ( "context" @@ -28,15 +28,17 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/uuid" + clientset "k8s.io/client-go/kubernetes" "k8s.io/kubernetes/test/e2e/framework" e2enode "k8s.io/kubernetes/test/e2e/framework/node" e2epod "k8s.io/kubernetes/test/e2e/framework/pod" "k8s.io/kubernetes/test/e2e/framework/providers/gce" e2epv "k8s.io/kubernetes/test/e2e/framework/pv" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" + "k8s.io/kubernetes/test/e2e/storage/utils" ) -var _ = SIGDescribe("Multi-AZ Cluster Volumes [sig-storage]", func() { +var _ = utils.SIGDescribe("Multi-AZ Cluster Volumes", func() { f := framework.NewDefaultFramework("multi-az") var zoneCount int var err error @@ -61,7 +63,7 @@ var _ = SIGDescribe("Multi-AZ Cluster Volumes [sig-storage]", func() { }) }) -// OnlyAllowNodeZones tests that GetAllCurrentZones returns only zones with Nodes +// OnlyAllowNodeZones tests that PDs are only provisioned in zones with nodes. func OnlyAllowNodeZones(f *framework.Framework, zoneCount int, image string) { gceCloud, err := gce.GetGCECloud() framework.ExpectNoError(err) @@ -83,7 +85,10 @@ func OnlyAllowNodeZones(f *framework.Framework, zoneCount int, image string) { break } } - framework.ExpectNotEqual(extraZone, "", fmt.Sprintf("No extra zones available in region %s", region)) + + if extraZone == "" { + e2eskipper.Skipf("All zones in region %s have compute instances, no extra zones available", region) + } ginkgo.By(fmt.Sprintf("starting a compute instance in unused zone: %v\n", extraZone)) project := framework.TestContext.CloudConfig.ProjectID @@ -176,6 +181,15 @@ func OnlyAllowNodeZones(f *framework.Framework, zoneCount int, image string) { framework.ExpectEqual(pvZones.Equal(expectedZones), true, fmt.Sprintf("PDs provisioned in unwanted zones. We want zones: %v, got: %v", expectedZones, pvZones)) } +// Return the number of zones in which we have nodes in this cluster. +func getZoneCount(c clientset.Interface) (int, error) { + zoneNames, err := e2enode.GetClusterZones(c) + if err != nil { + return -1, err + } + return len(zoneNames), nil +} + type staticPVTestConfig struct { pvSource *v1.PersistentVolumeSource pv *v1.PersistentVolume @@ -231,7 +245,7 @@ func PodsUseStaticPVsOrFail(f *framework.Framework, podCount int, image string) ginkgo.By("Waiting for all PVCs to be bound") for _, config := range configs { - e2epv.WaitOnPVandPVC(c, ns, config.pv, config.pvc) + e2epv.WaitOnPVandPVC(c, f.Timeouts, ns, config.pv, config.pvc) } ginkgo.By("Creating pods for each static PV") diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/utils/BUILD b/vendor/k8s.io/kubernetes/test/e2e/storage/utils/BUILD deleted file mode 100644 index 075b6d7d188d..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/utils/BUILD +++ /dev/null @@ -1,62 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "create.go", - "deployment.go", - "ebs.go", - "framework.go", - "host_exec.go", - "local.go", - "utils.go", - ], - importpath = "k8s.io/kubernetes/test/e2e/storage/utils", - deps = [ - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/rbac/v1:go_default_library", - "//staging/src/k8s.io/api/storage/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/dynamic:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/util/exec:go_default_library", - "//test/e2e/framework:go_default_library", - "//test/e2e/framework/node:go_default_library", - "//test/e2e/framework/pod:go_default_library", - "//test/e2e/framework/ssh:go_default_library", - "//test/e2e/framework/testfiles:go_default_library", - "//test/utils/image:go_default_library", - "//vendor/github.com/aws/aws-sdk-go/aws:go_default_library", - "//vendor/github.com/aws/aws-sdk-go/service/ec2:go_default_library", - "//vendor/github.com/onsi/ginkgo:go_default_library", - "//vendor/github.com/onsi/gomega:go_default_library", - "//vendor/github.com/pkg/errors:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/utils/deployment.go b/vendor/k8s.io/kubernetes/test/e2e/storage/utils/deployment.go index 4a2622d1f0ca..e86812406cb5 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/utils/deployment.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/utils/deployment.go @@ -41,7 +41,6 @@ import ( // that follow these conventions: // - driver and provisioner names are identical // - the driver binary accepts a --drivername parameter -// - the provisioner binary accepts a --provisioner parameter // - the paths inside the container are either fixed // and don't need to be patch (for example, --csi-address=/csi/csi.sock is // okay) or are specified directly in a parameter (for example, @@ -86,10 +85,6 @@ func PatchCSIDeployment(f *framework.Framework, o PatchCSIOptions, object interf switch container.Name { case o.DriverContainerName: container.Args = append(container.Args, o.DriverContainerArguments...) - case o.ProvisionerContainerName: - // Driver name is expected to be the same - // as the provisioner here. - container.Args = append(container.Args, "--provisioner="+o.NewDriverName) } } } diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/utils/host_exec.go b/vendor/k8s.io/kubernetes/test/e2e/storage/utils/host_exec.go index 256fa2676d1b..de75077b9d88 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/utils/host_exec.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/utils/host_exec.go @@ -106,7 +106,7 @@ func (h *hostExecutor) launchNodeExecPod(node string) *v1.Pod { } pod, err := cs.CoreV1().Pods(ns.Name).Create(context.TODO(), hostExecPod, metav1.CreateOptions{}) framework.ExpectNoError(err) - err = e2epod.WaitForPodRunningInNamespace(cs, pod) + err = e2epod.WaitTimeoutForPodRunningInNamespace(cs, pod.Name, pod.Namespace, f.Timeouts.PodStart) framework.ExpectNoError(err) return pod } diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/utils/pod.go b/vendor/k8s.io/kubernetes/test/e2e/storage/utils/pod.go new file mode 100644 index 000000000000..fda7db07851b --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/utils/pod.go @@ -0,0 +1,182 @@ +/* +Copyright 2020 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package utils + +import ( + "context" + "fmt" + "regexp" + "strings" + "time" + + "github.com/onsi/ginkgo" + "github.com/onsi/gomega" + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + clientset "k8s.io/client-go/kubernetes" + "k8s.io/kubernetes/test/e2e/framework" + e2enode "k8s.io/kubernetes/test/e2e/framework/node" + e2essh "k8s.io/kubernetes/test/e2e/framework/ssh" + "k8s.io/kubernetes/test/e2e/storage/podlogs" +) + +// StartPodLogs begins capturing log output and events from current +// and future pods running in the namespace of the framework. That +// ends when the returned cleanup function is called. +// +// The output goes to log files (when using --report-dir, as in the +// CI) or the output stream (otherwise). +func StartPodLogs(f *framework.Framework, driverNamespace *v1.Namespace) func() { + ctx, cancel := context.WithCancel(context.Background()) + cs := f.ClientSet + + ns := driverNamespace.Name + + to := podlogs.LogOutput{ + StatusWriter: ginkgo.GinkgoWriter, + } + if framework.TestContext.ReportDir == "" { + to.LogWriter = ginkgo.GinkgoWriter + } else { + test := ginkgo.CurrentGinkgoTestDescription() + // Clean up each individual component text such that + // it contains only characters that are valid as file + // name. + reg := regexp.MustCompile("[^a-zA-Z0-9_-]+") + var components []string + for _, component := range test.ComponentTexts { + components = append(components, reg.ReplaceAllString(component, "_")) + } + // We end the prefix with a slash to ensure that all logs + // end up in a directory named after the current test. + // + // Each component name maps to a directory. This + // avoids cluttering the root artifact directory and + // keeps each directory name smaller (the full test + // name at one point exceeded 256 characters, which was + // too much for some filesystems). + to.LogPathPrefix = framework.TestContext.ReportDir + "/" + + strings.Join(components, "/") + "/" + } + podlogs.CopyAllLogs(ctx, cs, ns, to) + + // pod events are something that the framework already collects itself + // after a failed test. Logging them live is only useful for interactive + // debugging, not when we collect reports. + if framework.TestContext.ReportDir == "" { + podlogs.WatchPods(ctx, cs, ns, ginkgo.GinkgoWriter) + } + + return cancel +} + +// KubeletCommand performs `start`, `restart`, or `stop` on the kubelet running on the node of the target pod and waits +// for the desired statues.. +// - First issues the command via `systemctl` +// - If `systemctl` returns stderr "command not found, issues the command via `service` +// - If `service` also returns stderr "command not found", the test is aborted. +// Allowed kubeletOps are `KStart`, `KStop`, and `KRestart` +func KubeletCommand(kOp KubeletOpt, c clientset.Interface, pod *v1.Pod) { + command := "" + systemctlPresent := false + kubeletPid := "" + + nodeIP, err := getHostAddress(c, pod) + framework.ExpectNoError(err) + nodeIP = nodeIP + ":22" + + framework.Logf("Checking if systemctl command is present") + sshResult, err := e2essh.SSH("systemctl --version", nodeIP, framework.TestContext.Provider) + framework.ExpectNoError(err, fmt.Sprintf("SSH to Node %q errored.", pod.Spec.NodeName)) + if !strings.Contains(sshResult.Stderr, "command not found") { + command = fmt.Sprintf("systemctl %s kubelet", string(kOp)) + systemctlPresent = true + } else { + command = fmt.Sprintf("service kubelet %s", string(kOp)) + } + + sudoPresent := isSudoPresent(nodeIP, framework.TestContext.Provider) + if sudoPresent { + command = fmt.Sprintf("sudo %s", command) + } + + if kOp == KRestart { + kubeletPid = getKubeletMainPid(nodeIP, sudoPresent, systemctlPresent) + } + + framework.Logf("Attempting `%s`", command) + sshResult, err = e2essh.SSH(command, nodeIP, framework.TestContext.Provider) + framework.ExpectNoError(err, fmt.Sprintf("SSH to Node %q errored.", pod.Spec.NodeName)) + e2essh.LogResult(sshResult) + gomega.Expect(sshResult.Code).To(gomega.BeZero(), "Failed to [%s] kubelet:\n%#v", string(kOp), sshResult) + + if kOp == KStop { + if ok := e2enode.WaitForNodeToBeNotReady(c, pod.Spec.NodeName, NodeStateTimeout); !ok { + framework.Failf("Node %s failed to enter NotReady state", pod.Spec.NodeName) + } + } + if kOp == KRestart { + // Wait for a minute to check if kubelet Pid is getting changed + isPidChanged := false + for start := time.Now(); time.Since(start) < 1*time.Minute; time.Sleep(2 * time.Second) { + kubeletPidAfterRestart := getKubeletMainPid(nodeIP, sudoPresent, systemctlPresent) + if kubeletPid != kubeletPidAfterRestart { + isPidChanged = true + break + } + } + framework.ExpectEqual(isPidChanged, true, "Kubelet PID remained unchanged after restarting Kubelet") + framework.Logf("Noticed that kubelet PID is changed. Waiting for 30 Seconds for Kubelet to come back") + time.Sleep(30 * time.Second) + } + if kOp == KStart || kOp == KRestart { + // For kubelet start and restart operations, Wait until Node becomes Ready + if ok := e2enode.WaitForNodeToBeReady(c, pod.Spec.NodeName, NodeStateTimeout); !ok { + framework.Failf("Node %s failed to enter Ready state", pod.Spec.NodeName) + } + } +} + +// getHostAddress gets the node for a pod and returns the first +// address. Returns an error if the node the pod is on doesn't have an +// address. +func getHostAddress(client clientset.Interface, p *v1.Pod) (string, error) { + node, err := client.CoreV1().Nodes().Get(context.TODO(), p.Spec.NodeName, metav1.GetOptions{}) + if err != nil { + return "", err + } + // Try externalAddress first + for _, address := range node.Status.Addresses { + if address.Type == v1.NodeExternalIP { + if address.Address != "" { + return address.Address, nil + } + } + } + // If no externalAddress found, try internalAddress + for _, address := range node.Status.Addresses { + if address.Type == v1.NodeInternalIP { + if address.Address != "" { + return address.Address, nil + } + } + } + + // If not found, return error + return "", fmt.Errorf("No address for pod %v on node %v", + p.Name, p.Spec.NodeName) +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/utils/snapshot.go b/vendor/k8s.io/kubernetes/test/e2e/storage/utils/snapshot.go new file mode 100644 index 000000000000..33548aa1dde1 --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/utils/snapshot.go @@ -0,0 +1,151 @@ +/* +Copyright 2020 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package utils + +import ( + "context" + "fmt" + "time" + + "github.com/onsi/ginkgo" + apierrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apiserver/pkg/storage/names" + "k8s.io/client-go/dynamic" + "k8s.io/kubernetes/test/e2e/framework" +) + +const ( + // SnapshotGroup is the snapshot CRD api group + SnapshotGroup = "snapshot.storage.k8s.io" + // SnapshotAPIVersion is the snapshot CRD api version + SnapshotAPIVersion = "snapshot.storage.k8s.io/v1" +) + +var ( + // SnapshotGVR is GroupVersionResource for volumesnapshots + SnapshotGVR = schema.GroupVersionResource{Group: SnapshotGroup, Version: "v1", Resource: "volumesnapshots"} + // SnapshotClassGVR is GroupVersionResource for volumesnapshotclasses + SnapshotClassGVR = schema.GroupVersionResource{Group: SnapshotGroup, Version: "v1", Resource: "volumesnapshotclasses"} + // SnapshotContentGVR is GroupVersionResource for volumesnapshotcontents + SnapshotContentGVR = schema.GroupVersionResource{Group: SnapshotGroup, Version: "v1", Resource: "volumesnapshotcontents"} +) + +// WaitForSnapshotReady waits for a VolumeSnapshot to be ready to use or until timeout occurs, whichever comes first. +func WaitForSnapshotReady(c dynamic.Interface, ns string, snapshotName string, poll, timeout time.Duration) error { + framework.Logf("Waiting up to %v for VolumeSnapshot %s to become ready", timeout, snapshotName) + + if successful := WaitUntil(poll, timeout, func() bool { + snapshot, err := c.Resource(SnapshotGVR).Namespace(ns).Get(context.TODO(), snapshotName, metav1.GetOptions{}) + if err != nil { + framework.Logf("Failed to get snapshot %q, retrying in %v. Error: %v", snapshotName, poll, err) + return false + } + + status := snapshot.Object["status"] + if status == nil { + framework.Logf("VolumeSnapshot %s found but is not ready.", snapshotName) + return false + } + value := status.(map[string]interface{}) + if value["readyToUse"] == true { + framework.Logf("VolumeSnapshot %s found and is ready", snapshotName) + return true + } + + framework.Logf("VolumeSnapshot %s found but is not ready.", snapshotName) + return false + }); successful { + return nil + } + + return fmt.Errorf("VolumeSnapshot %s is not ready within %v", snapshotName, timeout) +} + +// GetSnapshotContentFromSnapshot returns the VolumeSnapshotContent object Bound to a +// given VolumeSnapshot +func GetSnapshotContentFromSnapshot(dc dynamic.Interface, snapshot *unstructured.Unstructured) *unstructured.Unstructured { + defer ginkgo.GinkgoRecover() + err := WaitForSnapshotReady(dc, snapshot.GetNamespace(), snapshot.GetName(), framework.Poll, framework.SnapshotCreateTimeout) + framework.ExpectNoError(err) + + vs, err := dc.Resource(SnapshotGVR).Namespace(snapshot.GetNamespace()).Get(context.TODO(), snapshot.GetName(), metav1.GetOptions{}) + + snapshotStatus := vs.Object["status"].(map[string]interface{}) + snapshotContentName := snapshotStatus["boundVolumeSnapshotContentName"].(string) + framework.Logf("received snapshotStatus %v", snapshotStatus) + framework.Logf("snapshotContentName %s", snapshotContentName) + framework.ExpectNoError(err) + + vscontent, err := dc.Resource(SnapshotContentGVR).Get(context.TODO(), snapshotContentName, metav1.GetOptions{}) + framework.ExpectNoError(err) + + return vscontent + +} + +// DeleteSnapshotWithoutWaiting deletes a VolumeSnapshot and return directly without waiting +func DeleteSnapshotWithoutWaiting(dc dynamic.Interface, ns string, snapshotName string) error { + ginkgo.By("deleting the snapshot") + err := dc.Resource(SnapshotGVR).Namespace(ns).Delete(context.TODO(), snapshotName, metav1.DeleteOptions{}) + if err != nil && !apierrors.IsNotFound(err) { + return err + } + return nil +} + +// DeleteAndWaitSnapshot deletes a VolumeSnapshot and waits for it to be deleted or until timeout occurs, whichever comes first +func DeleteAndWaitSnapshot(dc dynamic.Interface, ns string, snapshotName string, poll, timeout time.Duration) error { + var err error + err = DeleteSnapshotWithoutWaiting(dc, ns, snapshotName) + if err != nil { + return err + } + + ginkgo.By("checking the Snapshot has been deleted") + err = WaitForNamespacedGVRDeletion(dc, SnapshotGVR, ns, snapshotName, poll, timeout) + + return err +} + +// GenerateSnapshotClassSpec constructs a new SnapshotClass instance spec +// with a unique name that is based on namespace + suffix. +func GenerateSnapshotClassSpec( + snapshotter string, + parameters map[string]string, + ns string, + suffix string, +) *unstructured.Unstructured { + snapshotClass := &unstructured.Unstructured{ + Object: map[string]interface{}{ + "kind": "VolumeSnapshotClass", + "apiVersion": SnapshotAPIVersion, + "metadata": map[string]interface{}{ + // Name must be unique, so let's base it on namespace name and use GenerateName + // TODO(#96234): Remove unnecessary suffix. + "name": names.SimpleNameGenerator.GenerateName(ns + "-" + suffix), + }, + "driver": snapshotter, + "parameters": parameters, + "deletionPolicy": "Delete", + }, + } + + return snapshotClass +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/utils/utils.go b/vendor/k8s.io/kubernetes/test/e2e/storage/utils/utils.go index 340be22c4c56..958f84b7ed98 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/utils/utils.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/utils/utils.go @@ -21,6 +21,7 @@ import ( "crypto/sha256" "encoding/base64" "fmt" + "math" "math/rand" "path/filepath" "strings" @@ -32,6 +33,7 @@ import ( v1 "k8s.io/api/core/v1" rbacv1 "k8s.io/api/rbac/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime/schema" @@ -39,13 +41,11 @@ import ( "k8s.io/apimachinery/pkg/util/wait" "k8s.io/client-go/dynamic" clientset "k8s.io/client-go/kubernetes" - clientexec "k8s.io/client-go/util/exec" "k8s.io/kubernetes/test/e2e/framework" - e2enode "k8s.io/kubernetes/test/e2e/framework/node" e2epod "k8s.io/kubernetes/test/e2e/framework/pod" e2essh "k8s.io/kubernetes/test/e2e/framework/ssh" + e2evolume "k8s.io/kubernetes/test/e2e/framework/volume" imageutils "k8s.io/kubernetes/test/utils/image" - uexec "k8s.io/utils/exec" ) // KubeletOpt type definition @@ -59,7 +59,9 @@ const ( // KStop defines stop value KStop KubeletOpt = "stop" // KRestart defines restart value - KRestart KubeletOpt = "restart" + KRestart KubeletOpt = "restart" + minValidSize string = "1Ki" + maxValidSize string = "10Ei" ) const ( @@ -67,37 +69,10 @@ const ( podSecurityPolicyPrivilegedClusterRoleName = "e2e-test-privileged-psp" ) -// PodExec runs f.ExecCommandInContainerWithFullOutput to execute a shell cmd in target pod -func PodExec(f *framework.Framework, pod *v1.Pod, shExec string) (string, string, error) { - if framework.NodeOSDistroIs("windows") { - return f.ExecCommandInContainerWithFullOutput(pod.Name, pod.Spec.Containers[0].Name, "powershell", "/c", shExec) - } - return f.ExecCommandInContainerWithFullOutput(pod.Name, pod.Spec.Containers[0].Name, "/bin/sh", "-c", shExec) - -} - -// VerifyExecInPodSucceed verifies shell cmd in target pod succeed -func VerifyExecInPodSucceed(f *framework.Framework, pod *v1.Pod, shExec string) { - stdout, stderr, err := PodExec(f, pod, shExec) - if err != nil { - - if exiterr, ok := err.(uexec.CodeExitError); ok { - exitCode := exiterr.ExitStatus() - framework.ExpectNoError(err, - "%q should succeed, but failed with exit code %d and error message %q\nstdout: %s\nstderr: %s", - shExec, exitCode, exiterr, stdout, stderr) - } else { - framework.ExpectNoError(err, - "%q should succeed, but failed with error message %q\nstdout: %s\nstderr: %s", - shExec, err, stdout, stderr) - } - } -} - // VerifyFSGroupInPod verifies that the passed in filePath contains the expectedFSGroup func VerifyFSGroupInPod(f *framework.Framework, filePath, expectedFSGroup string, pod *v1.Pod) { cmd := fmt.Sprintf("ls -l %s", filePath) - stdout, stderr, err := PodExec(f, pod, cmd) + stdout, stderr, err := e2evolume.PodExec(f, pod, cmd) framework.ExpectNoError(err) framework.Logf("pod %s/%s exec for cmd %s, stdout: %s, stderr: %s", pod.Namespace, pod.Name, cmd, stdout, stderr) fsGroupResult := strings.Fields(stdout)[3] @@ -105,131 +80,6 @@ func VerifyFSGroupInPod(f *framework.Framework, filePath, expectedFSGroup string "Expected fsGroup of %s, got %s", expectedFSGroup, fsGroupResult) } -// VerifyExecInPodFail verifies shell cmd in target pod fail with certain exit code -func VerifyExecInPodFail(f *framework.Framework, pod *v1.Pod, shExec string, exitCode int) { - stdout, stderr, err := PodExec(f, pod, shExec) - if err != nil { - if exiterr, ok := err.(clientexec.ExitError); ok { - actualExitCode := exiterr.ExitStatus() - framework.ExpectEqual(actualExitCode, exitCode, - "%q should fail with exit code %d, but failed with exit code %d and error message %q\nstdout: %s\nstderr: %s", - shExec, exitCode, actualExitCode, exiterr, stdout, stderr) - } else { - framework.ExpectNoError(err, - "%q should fail with exit code %d, but failed with error message %q\nstdout: %s\nstderr: %s", - shExec, exitCode, err, stdout, stderr) - } - } - framework.ExpectError(err, "%q should fail with exit code %d, but exit without error", shExec, exitCode) -} - -func isSudoPresent(nodeIP string, provider string) bool { - framework.Logf("Checking if sudo command is present") - sshResult, err := e2essh.SSH("sudo --version", nodeIP, provider) - framework.ExpectNoError(err, "SSH to %q errored.", nodeIP) - if !strings.Contains(sshResult.Stderr, "command not found") { - return true - } - return false -} - -// getHostAddress gets the node for a pod and returns the first -// address. Returns an error if the node the pod is on doesn't have an -// address. -func getHostAddress(client clientset.Interface, p *v1.Pod) (string, error) { - node, err := client.CoreV1().Nodes().Get(context.TODO(), p.Spec.NodeName, metav1.GetOptions{}) - if err != nil { - return "", err - } - // Try externalAddress first - for _, address := range node.Status.Addresses { - if address.Type == v1.NodeExternalIP { - if address.Address != "" { - return address.Address, nil - } - } - } - // If no externalAddress found, try internalAddress - for _, address := range node.Status.Addresses { - if address.Type == v1.NodeInternalIP { - if address.Address != "" { - return address.Address, nil - } - } - } - - // If not found, return error - return "", fmt.Errorf("No address for pod %v on node %v", - p.Name, p.Spec.NodeName) -} - -// KubeletCommand performs `start`, `restart`, or `stop` on the kubelet running on the node of the target pod and waits -// for the desired statues.. -// - First issues the command via `systemctl` -// - If `systemctl` returns stderr "command not found, issues the command via `service` -// - If `service` also returns stderr "command not found", the test is aborted. -// Allowed kubeletOps are `KStart`, `KStop`, and `KRestart` -func KubeletCommand(kOp KubeletOpt, c clientset.Interface, pod *v1.Pod) { - command := "" - systemctlPresent := false - kubeletPid := "" - - nodeIP, err := getHostAddress(c, pod) - framework.ExpectNoError(err) - nodeIP = nodeIP + ":22" - - framework.Logf("Checking if systemctl command is present") - sshResult, err := e2essh.SSH("systemctl --version", nodeIP, framework.TestContext.Provider) - framework.ExpectNoError(err, fmt.Sprintf("SSH to Node %q errored.", pod.Spec.NodeName)) - if !strings.Contains(sshResult.Stderr, "command not found") { - command = fmt.Sprintf("systemctl %s kubelet", string(kOp)) - systemctlPresent = true - } else { - command = fmt.Sprintf("service kubelet %s", string(kOp)) - } - - sudoPresent := isSudoPresent(nodeIP, framework.TestContext.Provider) - if sudoPresent { - command = fmt.Sprintf("sudo %s", command) - } - - if kOp == KRestart { - kubeletPid = getKubeletMainPid(nodeIP, sudoPresent, systemctlPresent) - } - - framework.Logf("Attempting `%s`", command) - sshResult, err = e2essh.SSH(command, nodeIP, framework.TestContext.Provider) - framework.ExpectNoError(err, fmt.Sprintf("SSH to Node %q errored.", pod.Spec.NodeName)) - e2essh.LogResult(sshResult) - gomega.Expect(sshResult.Code).To(gomega.BeZero(), "Failed to [%s] kubelet:\n%#v", string(kOp), sshResult) - - if kOp == KStop { - if ok := e2enode.WaitForNodeToBeNotReady(c, pod.Spec.NodeName, NodeStateTimeout); !ok { - framework.Failf("Node %s failed to enter NotReady state", pod.Spec.NodeName) - } - } - if kOp == KRestart { - // Wait for a minute to check if kubelet Pid is getting changed - isPidChanged := false - for start := time.Now(); time.Since(start) < 1*time.Minute; time.Sleep(2 * time.Second) { - kubeletPidAfterRestart := getKubeletMainPid(nodeIP, sudoPresent, systemctlPresent) - if kubeletPid != kubeletPidAfterRestart { - isPidChanged = true - break - } - } - framework.ExpectEqual(isPidChanged, true, "Kubelet PID remained unchanged after restarting Kubelet") - framework.Logf("Noticed that kubelet PID is changed. Waiting for 30 Seconds for Kubelet to come back") - time.Sleep(30 * time.Second) - } - if kOp == KStart || kOp == KRestart { - // For kubelet start and restart operations, Wait until Node becomes Ready - if ok := e2enode.WaitForNodeToBeReady(c, pod.Spec.NodeName, NodeStateTimeout); !ok { - framework.Failf("Node %s failed to enter Ready state", pod.Spec.NodeName) - } - } -} - // getKubeletMainPid return the Main PID of the Kubelet Process func getKubeletMainPid(nodeIP string, sudoPresent bool, systemctlPresent bool) string { command := "" @@ -325,7 +175,7 @@ func TestVolumeUnmountsFromDeletedPodWithForceOption(c clientset.Interface, f *f ginkgo.By("Starting the kubelet and waiting for pod to delete.") KubeletCommand(KStart, c, clientPod) - err = e2epod.WaitForPodNotFoundInNamespace(f.ClientSet, clientPod.Name, f.Namespace.Name, framework.PodDeleteTimeout) + err = e2epod.WaitForPodNotFoundInNamespace(f.ClientSet, clientPod.Name, f.Namespace.Name, f.Timeouts.PodDelete) if err != nil { framework.ExpectNoError(err, "Expected pod to be not found.") } @@ -411,7 +261,7 @@ func TestVolumeUnmapsFromDeletedPodWithForceOption(c clientset.Interface, f *fra ginkgo.By("Starting the kubelet and waiting for pod to delete.") KubeletCommand(KStart, c, clientPod) - err = e2epod.WaitForPodNotFoundInNamespace(f.ClientSet, clientPod.Name, f.Namespace.Name, framework.PodDeleteTimeout) + err = e2epod.WaitForPodNotFoundInNamespace(f.ClientSet, clientPod.Name, f.Namespace.Name, f.Timeouts.PodDelete) framework.ExpectNoError(err, "Expected pod to be not found.") if forceDelete { @@ -446,7 +296,7 @@ func TestVolumeUnmapsFromForceDeletedPod(c clientset.Interface, f *framework.Fra } // RunInPodWithVolume runs a command in a pod with given claim mounted to /mnt directory. -func RunInPodWithVolume(c clientset.Interface, ns, claimName, command string) { +func RunInPodWithVolume(c clientset.Interface, t *framework.TimeoutContext, ns, claimName, command string) { pod := &v1.Pod{ TypeMeta: metav1.TypeMeta{ Kind: "Pod", @@ -489,7 +339,7 @@ func RunInPodWithVolume(c clientset.Interface, ns, claimName, command string) { defer func() { e2epod.DeletePodOrFail(c, ns, pod.Name) }() - framework.ExpectNoError(e2epod.WaitForPodSuccessInNamespaceSlow(c, pod.Name, pod.Namespace)) + framework.ExpectNoError(e2epod.WaitForPodSuccessInNamespaceTimeout(c, pod.Name, pod.Namespace, t.PodStartSlow)) } // StartExternalProvisioner create external provisioner pod @@ -614,46 +464,39 @@ func PrivilegedTestPSPClusterRoleBinding(client clientset.Interface, } } -// CheckVolumeModeOfPath check mode of volume -func CheckVolumeModeOfPath(f *framework.Framework, pod *v1.Pod, volMode v1.PersistentVolumeMode, path string) { - if volMode == v1.PersistentVolumeBlock { - // Check if block exists - VerifyExecInPodSucceed(f, pod, fmt.Sprintf("test -b %s", path)) - - // Double check that it's not directory - VerifyExecInPodFail(f, pod, fmt.Sprintf("test -d %s", path), 1) - } else { - // Check if directory exists - VerifyExecInPodSucceed(f, pod, fmt.Sprintf("test -d %s", path)) - - // Double check that it's not block - VerifyExecInPodFail(f, pod, fmt.Sprintf("test -b %s", path), 1) +func isSudoPresent(nodeIP string, provider string) bool { + framework.Logf("Checking if sudo command is present") + sshResult, err := e2essh.SSH("sudo --version", nodeIP, provider) + framework.ExpectNoError(err, "SSH to %q errored.", nodeIP) + if !strings.Contains(sshResult.Stderr, "command not found") { + return true } + return false } // CheckReadWriteToPath check that path can b e read and written func CheckReadWriteToPath(f *framework.Framework, pod *v1.Pod, volMode v1.PersistentVolumeMode, path string) { if volMode == v1.PersistentVolumeBlock { // random -> file1 - VerifyExecInPodSucceed(f, pod, "dd if=/dev/urandom of=/tmp/file1 bs=64 count=1") + e2evolume.VerifyExecInPodSucceed(f, pod, "dd if=/dev/urandom of=/tmp/file1 bs=64 count=1") // file1 -> dev (write to dev) - VerifyExecInPodSucceed(f, pod, fmt.Sprintf("dd if=/tmp/file1 of=%s bs=64 count=1", path)) + e2evolume.VerifyExecInPodSucceed(f, pod, fmt.Sprintf("dd if=/tmp/file1 of=%s bs=64 count=1", path)) // dev -> file2 (read from dev) - VerifyExecInPodSucceed(f, pod, fmt.Sprintf("dd if=%s of=/tmp/file2 bs=64 count=1", path)) + e2evolume.VerifyExecInPodSucceed(f, pod, fmt.Sprintf("dd if=%s of=/tmp/file2 bs=64 count=1", path)) // file1 == file2 (check contents) - VerifyExecInPodSucceed(f, pod, "diff /tmp/file1 /tmp/file2") + e2evolume.VerifyExecInPodSucceed(f, pod, "diff /tmp/file1 /tmp/file2") // Clean up temp files - VerifyExecInPodSucceed(f, pod, "rm -f /tmp/file1 /tmp/file2") + e2evolume.VerifyExecInPodSucceed(f, pod, "rm -f /tmp/file1 /tmp/file2") // Check that writing file to block volume fails - VerifyExecInPodFail(f, pod, fmt.Sprintf("echo 'Hello world.' > %s/file1.txt", path), 1) + e2evolume.VerifyExecInPodFail(f, pod, fmt.Sprintf("echo 'Hello world.' > %s/file1.txt", path), 1) } else { // text -> file1 (write to file) - VerifyExecInPodSucceed(f, pod, fmt.Sprintf("echo 'Hello world.' > %s/file1.txt", path)) + e2evolume.VerifyExecInPodSucceed(f, pod, fmt.Sprintf("echo 'Hello world.' > %s/file1.txt", path)) // grep file1 (read from file and check contents) - VerifyExecInPodSucceed(f, pod, readFile("Hello word.", path)) + e2evolume.VerifyExecInPodSucceed(f, pod, readFile("Hello word.", path)) // Check that writing to directory as block volume fails - VerifyExecInPodFail(f, pod, fmt.Sprintf("dd if=/dev/urandom of=%s bs=64 count=1", path), 1) + e2evolume.VerifyExecInPodFail(f, pod, fmt.Sprintf("dd if=/dev/urandom of=%s bs=64 count=1", path), 1) } } @@ -699,8 +542,8 @@ func CheckReadFromPath(f *framework.Framework, pod *v1.Pod, volMode v1.Persisten sum := sha256.Sum256(genBinDataFromSeed(len, seed)) - VerifyExecInPodSucceed(f, pod, fmt.Sprintf("dd if=%s %s bs=%d count=1 | sha256sum", pathForVolMode, iflag, len)) - VerifyExecInPodSucceed(f, pod, fmt.Sprintf("dd if=%s %s bs=%d count=1 | sha256sum | grep -Fq %x", pathForVolMode, iflag, len, sum)) + e2evolume.VerifyExecInPodSucceed(f, pod, fmt.Sprintf("dd if=%s %s bs=%d count=1 | sha256sum", pathForVolMode, iflag, len)) + e2evolume.VerifyExecInPodSucceed(f, pod, fmt.Sprintf("dd if=%s %s bs=%d count=1 | sha256sum | grep -Fq %x", pathForVolMode, iflag, len, sum)) } // CheckWriteToPath that file can be properly written. @@ -724,8 +567,8 @@ func CheckWriteToPath(f *framework.Framework, pod *v1.Pod, volMode v1.Persistent encoded := base64.StdEncoding.EncodeToString(genBinDataFromSeed(len, seed)) - VerifyExecInPodSucceed(f, pod, fmt.Sprintf("echo %s | base64 -d | sha256sum", encoded)) - VerifyExecInPodSucceed(f, pod, fmt.Sprintf("echo %s | base64 -d | dd of=%s %s bs=%d count=1", encoded, pathForVolMode, oflag, len)) + e2evolume.VerifyExecInPodSucceed(f, pod, fmt.Sprintf("echo %s | base64 -d | sha256sum", encoded)) + e2evolume.VerifyExecInPodSucceed(f, pod, fmt.Sprintf("echo %s | base64 -d | dd of=%s %s bs=%d count=1", encoded, pathForVolMode, oflag, len)) } // findMountPoints returns all mount points on given node under specified directory. @@ -866,7 +709,7 @@ func WaitForGVRFinalizer(ctx context.Context, c dynamic.Interface, gvr schema.Gr // VerifyFilePathGidInPod verfies expected GID of the target filepath func VerifyFilePathGidInPod(f *framework.Framework, filePath, expectedGid string, pod *v1.Pod) { cmd := fmt.Sprintf("ls -l %s", filePath) - stdout, stderr, err := PodExec(f, pod, cmd) + stdout, stderr, err := e2evolume.PodExec(f, pod, cmd) framework.ExpectNoError(err) framework.Logf("pod %s/%s exec for cmd %s, stdout: %s, stderr: %s", pod.Namespace, pod.Name, cmd, stdout, stderr) ll := strings.Fields(stdout) @@ -877,7 +720,90 @@ func VerifyFilePathGidInPod(f *framework.Framework, filePath, expectedGid string // ChangeFilePathGidInPod changes the GID of the target filepath. func ChangeFilePathGidInPod(f *framework.Framework, filePath, targetGid string, pod *v1.Pod) { cmd := fmt.Sprintf("chgrp %s %s", targetGid, filePath) - _, _, err := PodExec(f, pod, cmd) + _, _, err := e2evolume.PodExec(f, pod, cmd) framework.ExpectNoError(err) VerifyFilePathGidInPod(f, filePath, targetGid, pod) } + +// DeleteStorageClass deletes the passed in StorageClass and catches errors other than "Not Found" +func DeleteStorageClass(cs clientset.Interface, className string) error { + err := cs.StorageV1().StorageClasses().Delete(context.TODO(), className, metav1.DeleteOptions{}) + if err != nil && !apierrors.IsNotFound(err) { + return err + } + return nil +} + +// CreateVolumeSource creates a volume source object +func CreateVolumeSource(pvcName string, readOnly bool) *v1.VolumeSource { + return &v1.VolumeSource{ + PersistentVolumeClaim: &v1.PersistentVolumeClaimVolumeSource{ + ClaimName: pvcName, + ReadOnly: readOnly, + }, + } +} + +// TryFunc try to execute the function and return err if there is any +func TryFunc(f func()) error { + var err error + if f == nil { + return nil + } + defer func() { + if recoverError := recover(); recoverError != nil { + err = fmt.Errorf("%v", recoverError) + } + }() + f() + return err +} + +// GetSizeRangesIntersection takes two instances of storage size ranges and determines the +// intersection of the intervals (if it exists) and return the minimum of the intersection +// to be used as the claim size for the test. +// if value not set, that means there's no minimum or maximum size limitation and we set default size for it. +func GetSizeRangesIntersection(first e2evolume.SizeRange, second e2evolume.SizeRange) (string, error) { + var firstMin, firstMax, secondMin, secondMax resource.Quantity + var err error + + //if SizeRange is not set, assign a minimum or maximum size + if len(first.Min) == 0 { + first.Min = minValidSize + } + if len(first.Max) == 0 { + first.Max = maxValidSize + } + if len(second.Min) == 0 { + second.Min = minValidSize + } + if len(second.Max) == 0 { + second.Max = maxValidSize + } + + if firstMin, err = resource.ParseQuantity(first.Min); err != nil { + return "", err + } + if firstMax, err = resource.ParseQuantity(first.Max); err != nil { + return "", err + } + if secondMin, err = resource.ParseQuantity(second.Min); err != nil { + return "", err + } + if secondMax, err = resource.ParseQuantity(second.Max); err != nil { + return "", err + } + + interSectionStart := math.Max(float64(firstMin.Value()), float64(secondMin.Value())) + intersectionEnd := math.Min(float64(firstMax.Value()), float64(secondMax.Value())) + + // the minimum of the intersection shall be returned as the claim size + var intersectionMin resource.Quantity + + if intersectionEnd-interSectionStart >= 0 { //have intersection + intersectionMin = *resource.NewQuantity(int64(interSectionStart), "BinarySI") //convert value to BinarySI format. E.g. 5Gi + // return the minimum of the intersection as the claim size + return intersectionMin.String(), nil + } + return "", fmt.Errorf("intersection of size ranges %+v, %+v is null", first, second) +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/volume_metrics.go b/vendor/k8s.io/kubernetes/test/e2e/storage/volume_metrics.go index 3afc7c2a4daa..c7de25343081 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/volume_metrics.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/volume_metrics.go @@ -63,6 +63,7 @@ var _ = utils.SIGDescribe("[Serial] Volume metrics", func() { test := testsuites.StorageClassTest{ Name: "default", + Timeouts: f.Timeouts, ClaimSize: "2Gi", } @@ -125,7 +126,7 @@ var _ = utils.SIGDescribe("[Serial] Volume metrics", func() { pod, err = c.CoreV1().Pods(ns).Create(context.TODO(), pod, metav1.CreateOptions{}) framework.ExpectNoError(err) - err = e2epod.WaitForPodRunningInNamespace(c, pod) + err = e2epod.WaitTimeoutForPodRunningInNamespace(c, pod.Name, pod.Namespace, f.Timeouts.PodStart) framework.ExpectNoError(err, "Error starting pod %s", pod.Name) framework.Logf("Deleting pod %q/%q", pod.Namespace, pod.Name) @@ -150,7 +151,7 @@ var _ = utils.SIGDescribe("[Serial] Volume metrics", func() { e2eskipper.Skipf("Environment does not support getting controller-manager metrics - skipping") } - ginkgo.By("Geting default storageclass") + ginkgo.By("Getting default storageclass") defaultClass, err := c.StorageV1().StorageClasses().Get(context.TODO(), defaultScName, metav1.GetOptions{}) framework.ExpectNoError(err, "Error getting default storageclass: %v", err) pluginName := defaultClass.Provisioner @@ -185,7 +186,7 @@ var _ = utils.SIGDescribe("[Serial] Volume metrics", func() { pod, err = c.CoreV1().Pods(ns).Create(context.TODO(), pod, metav1.CreateOptions{}) framework.ExpectNoError(err, "failed to create Pod %s/%s", pod.Namespace, pod.Name) - err = e2epod.WaitTimeoutForPodRunningInNamespace(c, pod.Name, pod.Namespace, framework.PodStartShortTimeout) + err = e2epod.WaitTimeoutForPodRunningInNamespace(c, pod.Name, pod.Namespace, f.Timeouts.PodStart) framework.ExpectError(err) framework.Logf("Deleting pod %q/%q", pod.Namespace, pod.Name) @@ -211,7 +212,7 @@ var _ = utils.SIGDescribe("[Serial] Volume metrics", func() { pod, err = c.CoreV1().Pods(ns).Create(context.TODO(), pod, metav1.CreateOptions{}) framework.ExpectNoError(err) - err = e2epod.WaitForPodRunningInNamespace(c, pod) + err = e2epod.WaitTimeoutForPodRunningInNamespace(c, pod.Name, pod.Namespace, f.Timeouts.PodStart) framework.ExpectNoError(err, "Error starting pod ", pod.Name) pod, err = c.CoreV1().Pods(ns).Get(context.TODO(), pod.Name, metav1.GetOptions{}) @@ -222,7 +223,7 @@ var _ = utils.SIGDescribe("[Serial] Volume metrics", func() { kubeletmetrics.VolumeStatsUsedBytesKey, kubeletmetrics.VolumeStatsCapacityBytesKey, kubeletmetrics.VolumeStatsAvailableBytesKey, - kubeletmetrics.VolumeStatsUsedBytesKey, + kubeletmetrics.VolumeStatsInodesKey, kubeletmetrics.VolumeStatsInodesFreeKey, kubeletmetrics.VolumeStatsInodesUsedKey, } @@ -268,7 +269,7 @@ var _ = utils.SIGDescribe("[Serial] Volume metrics", func() { pod, err = c.CoreV1().Pods(ns).Create(context.TODO(), pod, metav1.CreateOptions{}) framework.ExpectNoError(err) - err = e2epod.WaitForPodRunningInNamespace(c, pod) + err = e2epod.WaitTimeoutForPodRunningInNamespace(c, pod.Name, pod.Namespace, f.Timeouts.PodStart) framework.ExpectNoError(err, "Error starting pod ", pod.Name) pod, err = c.CoreV1().Pods(ns).Get(context.TODO(), pod.Name, metav1.GetOptions{}) @@ -299,7 +300,7 @@ var _ = utils.SIGDescribe("[Serial] Volume metrics", func() { pod, err = c.CoreV1().Pods(ns).Create(context.TODO(), pod, metav1.CreateOptions{}) framework.ExpectNoError(err) - err = e2epod.WaitForPodRunningInNamespace(c, pod) + err = e2epod.WaitTimeoutForPodRunningInNamespace(c, pod.Name, pod.Namespace, f.Timeouts.PodStart) framework.ExpectNoError(err, "Error starting pod ", pod.Name) pod, err = c.CoreV1().Pods(ns).Get(context.TODO(), pod.Name, metav1.GetOptions{}) @@ -336,7 +337,7 @@ var _ = utils.SIGDescribe("[Serial] Volume metrics", func() { // Create pod pod, err = c.CoreV1().Pods(ns).Create(context.TODO(), pod, metav1.CreateOptions{}) framework.ExpectNoError(err) - err = e2epod.WaitForPodRunningInNamespace(c, pod) + err = e2epod.WaitTimeoutForPodRunningInNamespace(c, pod.Name, pod.Namespace, f.Timeouts.PodStart) framework.ExpectNoError(err, "Error starting pod ", pod.Name) pod, err = c.CoreV1().Pods(ns).Get(context.TODO(), pod.Name, metav1.GetOptions{}) framework.ExpectNoError(err) diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/volume_provisioning.go b/vendor/k8s.io/kubernetes/test/e2e/storage/volume_provisioning.go index a8b494eb3acd..9b01c741879c 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/volume_provisioning.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/volume_provisioning.go @@ -140,11 +140,13 @@ var _ = utils.SIGDescribe("Dynamic Provisioning", func() { // filled in BeforeEach var c clientset.Interface + var timeouts *framework.TimeoutContext var ns string ginkgo.BeforeEach(func() { c = f.ClientSet ns = f.Namespace.Name + timeouts = f.Timeouts }) ginkgo.Describe("DynamicProvisioner [Slow]", func() { @@ -157,6 +159,7 @@ var _ = utils.SIGDescribe("Dynamic Provisioning", func() { { Name: "SSD PD on GCE/GKE", CloudProviders: []string{"gce", "gke"}, + Timeouts: f.Timeouts, Provisioner: "kubernetes.io/gce-pd", Parameters: map[string]string{ "type": "pd-ssd", @@ -165,7 +168,7 @@ var _ = utils.SIGDescribe("Dynamic Provisioning", func() { ClaimSize: "1.5Gi", ExpectedSize: "2Gi", PvCheck: func(claim *v1.PersistentVolumeClaim) { - volume := testsuites.PVWriteReadSingleNodeCheck(c, claim, e2epod.NodeSelection{}) + volume := testsuites.PVWriteReadSingleNodeCheck(c, f.Timeouts, claim, e2epod.NodeSelection{}) gomega.Expect(volume).NotTo(gomega.BeNil(), "get bound PV") err := checkGCEPD(volume, "pd-ssd") @@ -175,6 +178,7 @@ var _ = utils.SIGDescribe("Dynamic Provisioning", func() { { Name: "HDD PD on GCE/GKE", CloudProviders: []string{"gce", "gke"}, + Timeouts: f.Timeouts, Provisioner: "kubernetes.io/gce-pd", Parameters: map[string]string{ "type": "pd-standard", @@ -182,7 +186,7 @@ var _ = utils.SIGDescribe("Dynamic Provisioning", func() { ClaimSize: "1.5Gi", ExpectedSize: "2Gi", PvCheck: func(claim *v1.PersistentVolumeClaim) { - volume := testsuites.PVWriteReadSingleNodeCheck(c, claim, e2epod.NodeSelection{}) + volume := testsuites.PVWriteReadSingleNodeCheck(c, f.Timeouts, claim, e2epod.NodeSelection{}) gomega.Expect(volume).NotTo(gomega.BeNil(), "get bound PV") err := checkGCEPD(volume, "pd-standard") @@ -193,6 +197,7 @@ var _ = utils.SIGDescribe("Dynamic Provisioning", func() { { Name: "gp2 EBS on AWS", CloudProviders: []string{"aws"}, + Timeouts: f.Timeouts, Provisioner: "kubernetes.io/aws-ebs", Parameters: map[string]string{ "type": "gp2", @@ -201,7 +206,7 @@ var _ = utils.SIGDescribe("Dynamic Provisioning", func() { ClaimSize: "1.5Gi", ExpectedSize: "2Gi", PvCheck: func(claim *v1.PersistentVolumeClaim) { - volume := testsuites.PVWriteReadSingleNodeCheck(c, claim, e2epod.NodeSelection{}) + volume := testsuites.PVWriteReadSingleNodeCheck(c, f.Timeouts, claim, e2epod.NodeSelection{}) gomega.Expect(volume).NotTo(gomega.BeNil(), "get bound PV") err := checkAWSEBS(volume, "gp2", false) @@ -211,6 +216,7 @@ var _ = utils.SIGDescribe("Dynamic Provisioning", func() { { Name: "io1 EBS on AWS", CloudProviders: []string{"aws"}, + Timeouts: f.Timeouts, Provisioner: "kubernetes.io/aws-ebs", Parameters: map[string]string{ "type": "io1", @@ -219,7 +225,7 @@ var _ = utils.SIGDescribe("Dynamic Provisioning", func() { ClaimSize: "3.5Gi", ExpectedSize: "4Gi", // 4 GiB is minimum for io1 PvCheck: func(claim *v1.PersistentVolumeClaim) { - volume := testsuites.PVWriteReadSingleNodeCheck(c, claim, e2epod.NodeSelection{}) + volume := testsuites.PVWriteReadSingleNodeCheck(c, f.Timeouts, claim, e2epod.NodeSelection{}) gomega.Expect(volume).NotTo(gomega.BeNil(), "get bound PV") err := checkAWSEBS(volume, "io1", false) @@ -229,6 +235,7 @@ var _ = utils.SIGDescribe("Dynamic Provisioning", func() { { Name: "sc1 EBS on AWS", CloudProviders: []string{"aws"}, + Timeouts: f.Timeouts, Provisioner: "kubernetes.io/aws-ebs", Parameters: map[string]string{ "type": "sc1", @@ -236,7 +243,7 @@ var _ = utils.SIGDescribe("Dynamic Provisioning", func() { ClaimSize: "500Gi", // minimum for sc1 ExpectedSize: "500Gi", PvCheck: func(claim *v1.PersistentVolumeClaim) { - volume := testsuites.PVWriteReadSingleNodeCheck(c, claim, e2epod.NodeSelection{}) + volume := testsuites.PVWriteReadSingleNodeCheck(c, f.Timeouts, claim, e2epod.NodeSelection{}) gomega.Expect(volume).NotTo(gomega.BeNil(), "get bound PV") err := checkAWSEBS(volume, "sc1", false) @@ -246,6 +253,7 @@ var _ = utils.SIGDescribe("Dynamic Provisioning", func() { { Name: "st1 EBS on AWS", CloudProviders: []string{"aws"}, + Timeouts: f.Timeouts, Provisioner: "kubernetes.io/aws-ebs", Parameters: map[string]string{ "type": "st1", @@ -253,7 +261,7 @@ var _ = utils.SIGDescribe("Dynamic Provisioning", func() { ClaimSize: "500Gi", // minimum for st1 ExpectedSize: "500Gi", PvCheck: func(claim *v1.PersistentVolumeClaim) { - volume := testsuites.PVWriteReadSingleNodeCheck(c, claim, e2epod.NodeSelection{}) + volume := testsuites.PVWriteReadSingleNodeCheck(c, f.Timeouts, claim, e2epod.NodeSelection{}) gomega.Expect(volume).NotTo(gomega.BeNil(), "get bound PV") err := checkAWSEBS(volume, "st1", false) @@ -263,6 +271,7 @@ var _ = utils.SIGDescribe("Dynamic Provisioning", func() { { Name: "encrypted EBS on AWS", CloudProviders: []string{"aws"}, + Timeouts: f.Timeouts, Provisioner: "kubernetes.io/aws-ebs", Parameters: map[string]string{ "encrypted": "true", @@ -270,7 +279,7 @@ var _ = utils.SIGDescribe("Dynamic Provisioning", func() { ClaimSize: "1Gi", ExpectedSize: "1Gi", PvCheck: func(claim *v1.PersistentVolumeClaim) { - volume := testsuites.PVWriteReadSingleNodeCheck(c, claim, e2epod.NodeSelection{}) + volume := testsuites.PVWriteReadSingleNodeCheck(c, f.Timeouts, claim, e2epod.NodeSelection{}) gomega.Expect(volume).NotTo(gomega.BeNil(), "get bound PV") err := checkAWSEBS(volume, "gp2", true) @@ -281,17 +290,19 @@ var _ = utils.SIGDescribe("Dynamic Provisioning", func() { { Name: "generic Cinder volume on OpenStack", CloudProviders: []string{"openstack"}, + Timeouts: f.Timeouts, Provisioner: "kubernetes.io/cinder", Parameters: map[string]string{}, ClaimSize: "1.5Gi", ExpectedSize: "2Gi", PvCheck: func(claim *v1.PersistentVolumeClaim) { - testsuites.PVWriteReadSingleNodeCheck(c, claim, e2epod.NodeSelection{}) + testsuites.PVWriteReadSingleNodeCheck(c, f.Timeouts, claim, e2epod.NodeSelection{}) }, }, { Name: "Cinder volume with empty volume type and zone on OpenStack", CloudProviders: []string{"openstack"}, + Timeouts: f.Timeouts, Provisioner: "kubernetes.io/cinder", Parameters: map[string]string{ "type": "", @@ -300,38 +311,40 @@ var _ = utils.SIGDescribe("Dynamic Provisioning", func() { ClaimSize: "1.5Gi", ExpectedSize: "2Gi", PvCheck: func(claim *v1.PersistentVolumeClaim) { - testsuites.PVWriteReadSingleNodeCheck(c, claim, e2epod.NodeSelection{}) + testsuites.PVWriteReadSingleNodeCheck(c, f.Timeouts, claim, e2epod.NodeSelection{}) }, }, // vSphere generic test { Name: "generic vSphere volume", CloudProviders: []string{"vsphere"}, + Timeouts: f.Timeouts, Provisioner: "kubernetes.io/vsphere-volume", Parameters: map[string]string{}, ClaimSize: "1.5Gi", ExpectedSize: "1.5Gi", PvCheck: func(claim *v1.PersistentVolumeClaim) { - testsuites.PVWriteReadSingleNodeCheck(c, claim, e2epod.NodeSelection{}) + testsuites.PVWriteReadSingleNodeCheck(c, f.Timeouts, claim, e2epod.NodeSelection{}) }, }, // Azure { Name: "Azure disk volume with empty sku and location", CloudProviders: []string{"azure"}, + Timeouts: f.Timeouts, Provisioner: "kubernetes.io/azure-disk", Parameters: map[string]string{}, ClaimSize: "1Gi", ExpectedSize: "1Gi", PvCheck: func(claim *v1.PersistentVolumeClaim) { - testsuites.PVWriteReadSingleNodeCheck(c, claim, e2epod.NodeSelection{}) + testsuites.PVWriteReadSingleNodeCheck(c, f.Timeouts, claim, e2epod.NodeSelection{}) }, }, } var betaTest *testsuites.StorageClassTest for i, t := range tests { - // Beware of clojure, use local variables instead of those from + // Beware of closure, use local variables instead of those from // outer scope test := t @@ -346,32 +359,43 @@ var _ = utils.SIGDescribe("Dynamic Provisioning", func() { ginkgo.By("Testing " + test.Name) suffix := fmt.Sprintf("%d", i) test.Client = c - test.Class = newStorageClass(test, ns, suffix) + + // overwrite StorageClass spec with provisioned StorageClass + storageClass, clearStorageClass := testsuites.SetupStorageClass(test.Client, newStorageClass(test, ns, suffix)) + defer clearStorageClass() + + test.Class = storageClass test.Claim = e2epv.MakePersistentVolumeClaim(e2epv.PersistentVolumeClaimConfig{ ClaimSize: test.ClaimSize, StorageClassName: &test.Class.Name, VolumeMode: &test.VolumeMode, }, ns) + test.TestDynamicProvisioning() } // Run the last test with storage.k8s.io/v1beta1 on pvc if betaTest != nil { ginkgo.By("Testing " + betaTest.Name + " with beta volume provisioning") - class := newBetaStorageClass(*betaTest, "beta") - // we need to create the class manually, testDynamicProvisioning does not accept beta class - class, err := c.StorageV1beta1().StorageClasses().Create(context.TODO(), class, metav1.CreateOptions{}) + betaClass := newBetaStorageClass(*betaTest, "beta") + // create beta class manually + betaClass, err := c.StorageV1beta1().StorageClasses().Create(context.TODO(), betaClass, metav1.CreateOptions{}) + framework.ExpectNoError(err) + defer deleteStorageClass(c, betaClass.Name) + + // fetch V1beta1 StorageClass as V1 object for the test + class, err := c.StorageV1().StorageClasses().Get(context.TODO(), betaClass.Name, metav1.GetOptions{}) framework.ExpectNoError(err) - defer deleteStorageClass(c, class.Name) betaTest.Client = c - betaTest.Class = nil + betaTest.Class = class betaTest.Claim = e2epv.MakePersistentVolumeClaim(e2epv.PersistentVolumeClaimConfig{ ClaimSize: betaTest.ClaimSize, StorageClassName: &class.Name, VolumeMode: &betaTest.VolumeMode, }, ns) betaTest.Claim.Spec.StorageClassName = &(class.Name) + (*betaTest).TestDynamicProvisioning() } }) @@ -384,13 +408,14 @@ var _ = utils.SIGDescribe("Dynamic Provisioning", func() { Name: "HDD PD on GCE/GKE", CloudProviders: []string{"gce", "gke"}, Provisioner: "kubernetes.io/gce-pd", + Timeouts: f.Timeouts, Parameters: map[string]string{ "type": "pd-standard", }, ClaimSize: "1Gi", ExpectedSize: "1Gi", PvCheck: func(claim *v1.PersistentVolumeClaim) { - volume := testsuites.PVWriteReadSingleNodeCheck(c, claim, e2epod.NodeSelection{}) + volume := testsuites.PVWriteReadSingleNodeCheck(c, f.Timeouts, claim, e2epod.NodeSelection{}) gomega.Expect(volume).NotTo(gomega.BeNil(), "get bound PV") err := checkGCEPD(volume, "pd-standard") @@ -400,11 +425,16 @@ var _ = utils.SIGDescribe("Dynamic Provisioning", func() { test.Class = newStorageClass(test, ns, "reclaimpolicy") retain := v1.PersistentVolumeReclaimRetain test.Class.ReclaimPolicy = &retain + storageClass, clearStorageClass := testsuites.SetupStorageClass(test.Client, test.Class) + defer clearStorageClass() + test.Class = storageClass + test.Claim = e2epv.MakePersistentVolumeClaim(e2epv.PersistentVolumeClaimConfig{ ClaimSize: test.ClaimSize, StorageClassName: &test.Class.Name, VolumeMode: &test.VolumeMode, }, ns) + pv := test.TestDynamicProvisioning() ginkgo.By(fmt.Sprintf("waiting for the provisioned PV %q to enter phase %s", pv.Name, v1.VolumeReleased)) @@ -420,7 +450,6 @@ var _ = utils.SIGDescribe("Dynamic Provisioning", func() { ginkgo.It("should not provision a volume in an unmanaged GCE zone.", func() { e2eskipper.SkipUnlessProviderIs("gce", "gke") - var suffix string = "unmananged" ginkgo.By("Discovering an unmanaged zone") allZones := sets.NewString() // all zones in the project @@ -452,10 +481,11 @@ var _ = utils.SIGDescribe("Dynamic Provisioning", func() { test := testsuites.StorageClassTest{ Name: "unmanaged_zone", Provisioner: "kubernetes.io/gce-pd", + Timeouts: f.Timeouts, Parameters: map[string]string{"zone": unmanagedZone}, ClaimSize: "1Gi", } - sc := newStorageClass(test, ns, suffix) + sc := newStorageClass(test, ns, "unmanaged") sc, err = c.StorageV1().StorageClasses().Create(context.TODO(), sc, metav1.CreateOptions{}) framework.ExpectNoError(err) defer deleteStorageClass(c, sc.Name) @@ -473,7 +503,7 @@ var _ = utils.SIGDescribe("Dynamic Provisioning", func() { }() // The claim should timeout phase:Pending - err = e2epv.WaitForPersistentVolumeClaimPhase(v1.ClaimBound, c, ns, pvc.Name, 2*time.Second, framework.ClaimProvisionShortTimeout) + err = e2epv.WaitForPersistentVolumeClaimPhase(v1.ClaimBound, c, ns, pvc.Name, 2*time.Second, timeouts.ClaimProvisionShort) framework.ExpectError(err) framework.Logf(err.Error()) }) @@ -492,6 +522,7 @@ var _ = utils.SIGDescribe("Dynamic Provisioning", func() { test := testsuites.StorageClassTest{ Name: "deletion race", Provisioner: "", // Use a native one based on current cloud provider + Timeouts: f.Timeouts, ClaimSize: "1Gi", } @@ -572,7 +603,7 @@ var _ = utils.SIGDescribe("Dynamic Provisioning", func() { framework.ExpectNoError(err) ginkgo.By("waiting for the PV to get Released") - err = e2epv.WaitForPersistentVolumePhase(v1.VolumeReleased, c, pv.Name, 2*time.Second, e2epv.PVReclaimingTimeout) + err = e2epv.WaitForPersistentVolumePhase(v1.VolumeReleased, c, pv.Name, 2*time.Second, timeouts.PVReclaim) framework.ExpectNoError(err) ginkgo.By("deleting the PD") @@ -587,7 +618,7 @@ var _ = utils.SIGDescribe("Dynamic Provisioning", func() { framework.ExpectNoError(err) ginkgo.By("waiting for the PV to get deleted") - err = e2epv.WaitForPersistentVolumeDeleted(c, pv.Name, 5*time.Second, e2epv.PVDeletingTimeout) + err = e2epv.WaitForPersistentVolumeDeleted(c, pv.Name, 5*time.Second, timeouts.PVDelete) framework.ExpectNoError(err) }) }) @@ -636,10 +667,15 @@ var _ = utils.SIGDescribe("Dynamic Provisioning", func() { Client: c, Name: "external provisioner test", Provisioner: externalPluginName, + Timeouts: f.Timeouts, ClaimSize: "1500Mi", ExpectedSize: "1500Mi", } - test.Class = newStorageClass(test, ns, "external") + + storageClass, clearStorageClass := testsuites.SetupStorageClass(test.Client, newStorageClass(test, ns, "external")) + defer clearStorageClass() + test.Class = storageClass + test.Claim = e2epv.MakePersistentVolumeClaim(e2epv.PersistentVolumeClaimConfig{ ClaimSize: test.ClaimSize, StorageClassName: &test.Class.Name, @@ -647,6 +683,7 @@ var _ = utils.SIGDescribe("Dynamic Provisioning", func() { }, ns) ginkgo.By("creating a claim with a external provisioning annotation") + test.TestDynamicProvisioning() }) }) @@ -659,6 +696,7 @@ var _ = utils.SIGDescribe("Dynamic Provisioning", func() { test := testsuites.StorageClassTest{ Client: c, Name: "default", + Timeouts: f.Timeouts, ClaimSize: "2Gi", ExpectedSize: "2Gi", } @@ -667,6 +705,11 @@ var _ = utils.SIGDescribe("Dynamic Provisioning", func() { ClaimSize: test.ClaimSize, VolumeMode: &test.VolumeMode, }, ns) + // NOTE: this test assumes that there's a default storageclass + storageClass, clearStorageClass := testsuites.SetupStorageClass(test.Client, nil) + test.Class = storageClass + defer clearStorageClass() + test.TestDynamicProvisioning() }) @@ -679,6 +722,7 @@ var _ = utils.SIGDescribe("Dynamic Provisioning", func() { test := testsuites.StorageClassTest{ Name: "default", + Timeouts: f.Timeouts, ClaimSize: "2Gi", } @@ -716,6 +760,7 @@ var _ = utils.SIGDescribe("Dynamic Provisioning", func() { test := testsuites.StorageClassTest{ Name: "default", + Timeouts: f.Timeouts, ClaimSize: "2Gi", } @@ -745,7 +790,7 @@ var _ = utils.SIGDescribe("Dynamic Provisioning", func() { }) }) - framework.KubeDescribe("GlusterDynamicProvisioner", func() { + ginkgo.Describe("GlusterDynamicProvisioner", func() { ginkgo.It("should create and delete persistent volumes [fast]", func() { e2eskipper.SkipIfProviderIs("gke") ginkgo.By("creating a Gluster DP server Pod") @@ -756,12 +801,14 @@ var _ = utils.SIGDescribe("Dynamic Provisioning", func() { Client: c, Name: "Gluster Dynamic provisioner test", Provisioner: "kubernetes.io/glusterfs", + Timeouts: f.Timeouts, ClaimSize: "2Gi", ExpectedSize: "2Gi", Parameters: map[string]string{"resturl": serverURL}, } - suffix := fmt.Sprintf("glusterdptest") - test.Class = newStorageClass(test, ns, suffix) + storageClass, clearStorageClass := testsuites.SetupStorageClass(test.Client, newStorageClass(test, ns, "glusterdptest")) + defer clearStorageClass() + test.Class = storageClass ginkgo.By("creating a claim object with a suffix for gluster dynamic provisioner") test.Claim = e2epv.MakePersistentVolumeClaim(e2epv.PersistentVolumeClaimConfig{ @@ -780,27 +827,23 @@ var _ = utils.SIGDescribe("Dynamic Provisioning", func() { test := testsuites.StorageClassTest{ Name: "AWS EBS with invalid KMS key", Provisioner: "kubernetes.io/aws-ebs", + Timeouts: f.Timeouts, ClaimSize: "2Gi", Parameters: map[string]string{"kmsKeyId": "arn:aws:kms:us-east-1:123456789012:key/55555555-5555-5555-5555-555555555555"}, } ginkgo.By("creating a StorageClass") - suffix := fmt.Sprintf("invalid-aws") - class := newStorageClass(test, ns, suffix) - class, err := c.StorageV1().StorageClasses().Create(context.TODO(), class, metav1.CreateOptions{}) - framework.ExpectNoError(err) - defer func() { - framework.Logf("deleting storage class %s", class.Name) - framework.ExpectNoError(c.StorageV1().StorageClasses().Delete(context.TODO(), class.Name, metav1.DeleteOptions{})) - }() + storageClass, clearStorageClass := testsuites.SetupStorageClass(test.Client, newStorageClass(test, ns, "invalid-aws")) + defer clearStorageClass() + test.Class = storageClass ginkgo.By("creating a claim object with a suffix for gluster dynamic provisioner") claim := e2epv.MakePersistentVolumeClaim(e2epv.PersistentVolumeClaimConfig{ ClaimSize: test.ClaimSize, - StorageClassName: &class.Name, + StorageClassName: &test.Class.Name, VolumeMode: &test.VolumeMode, }, ns) - claim, err = c.CoreV1().PersistentVolumeClaims(claim.Namespace).Create(context.TODO(), claim, metav1.CreateOptions{}) + claim, err := c.CoreV1().PersistentVolumeClaims(claim.Namespace).Create(context.TODO(), claim, metav1.CreateOptions{}) framework.ExpectNoError(err) defer func() { framework.Logf("deleting claim %q/%q", claim.Namespace, claim.Name) @@ -892,19 +935,31 @@ func getDefaultPluginName() string { return "" } -func newStorageClass(t testsuites.StorageClassTest, ns string, suffix string) *storagev1.StorageClass { +func newStorageClass(t testsuites.StorageClassTest, ns string, prefix string) *storagev1.StorageClass { pluginName := t.Provisioner if pluginName == "" { pluginName = getDefaultPluginName() } - if suffix == "" { - suffix = "sc" + if prefix == "" { + prefix = "sc" } bindingMode := storagev1.VolumeBindingImmediate if t.DelayBinding { bindingMode = storagev1.VolumeBindingWaitForFirstConsumer } - sc := getStorageClass(pluginName, t.Parameters, &bindingMode, ns, suffix) + if t.Parameters == nil { + t.Parameters = make(map[string]string) + } + + if framework.NodeOSDistroIs("windows") { + // fstype might be forced from outside, in that case skip setting a default + if _, exists := t.Parameters["fstype"]; !exists { + t.Parameters["fstype"] = e2epv.GetDefaultFSType() + framework.Logf("settings a default fsType=%s in the storage class", t.Parameters["fstype"]) + } + } + + sc := getStorageClass(pluginName, t.Parameters, &bindingMode, ns, prefix) if t.AllowVolumeExpansion { sc.AllowVolumeExpansion = &t.AllowVolumeExpansion } @@ -916,7 +971,7 @@ func getStorageClass( parameters map[string]string, bindingMode *storagev1.VolumeBindingMode, ns string, - suffix string, + prefix string, ) *storagev1.StorageClass { if bindingMode == nil { defaultBindingMode := storagev1.VolumeBindingImmediate @@ -927,8 +982,8 @@ func getStorageClass( Kind: "StorageClass", }, ObjectMeta: metav1.ObjectMeta{ - // Name must be unique, so let's base it on namespace name - Name: ns + "-" + suffix, + // Name must be unique, so let's base it on namespace name and the prefix (the prefix is test specific) + GenerateName: ns + "-" + prefix, }, Provisioner: provisioner, Parameters: parameters, diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/BUILD b/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/BUILD deleted file mode 100644 index d6848660e29f..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/BUILD +++ /dev/null @@ -1,93 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "bootstrap.go", - "config.go", - "connection.go", - "context.go", - "nodemapper.go", - "persistent_volumes-vsphere.go", - "pv_reclaimpolicy.go", - "pvc_label_selector.go", - "vsphere.go", - "vsphere_common.go", - "vsphere_scale.go", - "vsphere_statefulsets.go", - "vsphere_stress.go", - "vsphere_utils.go", - "vsphere_volume_cluster_ds.go", - "vsphere_volume_datastore.go", - "vsphere_volume_diskformat.go", - "vsphere_volume_disksize.go", - "vsphere_volume_fstype.go", - "vsphere_volume_master_restart.go", - "vsphere_volume_node_delete.go", - "vsphere_volume_node_poweroff.go", - "vsphere_volume_ops_storm.go", - "vsphere_volume_perf.go", - "vsphere_volume_placement.go", - "vsphere_volume_vpxd_restart.go", - "vsphere_volume_vsan_policy.go", - "vsphere_zone_support.go", - ], - importpath = "k8s.io/kubernetes/test/e2e/storage/vsphere", - deps = [ - "//pkg/cluster/ports:go_default_library", - "//pkg/controller/volume/events:go_default_library", - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/storage/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/rand:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//test/e2e/framework:go_default_library", - "//test/e2e/framework/deployment:go_default_library", - "//test/e2e/framework/node:go_default_library", - "//test/e2e/framework/pod:go_default_library", - "//test/e2e/framework/pv:go_default_library", - "//test/e2e/framework/skipper:go_default_library", - "//test/e2e/framework/ssh:go_default_library", - "//test/e2e/framework/statefulset:go_default_library", - "//test/e2e/storage/utils:go_default_library", - "//test/utils/image:go_default_library", - "//vendor/github.com/onsi/ginkgo:go_default_library", - "//vendor/github.com/onsi/gomega:go_default_library", - "//vendor/github.com/vmware/govmomi:go_default_library", - "//vendor/github.com/vmware/govmomi/find:go_default_library", - "//vendor/github.com/vmware/govmomi/object:go_default_library", - "//vendor/github.com/vmware/govmomi/session:go_default_library", - "//vendor/github.com/vmware/govmomi/vapi/rest:go_default_library", - "//vendor/github.com/vmware/govmomi/vapi/tags:go_default_library", - "//vendor/github.com/vmware/govmomi/vim25:go_default_library", - "//vendor/github.com/vmware/govmomi/vim25/mo:go_default_library", - "//vendor/github.com/vmware/govmomi/vim25/soap:go_default_library", - "//vendor/github.com/vmware/govmomi/vim25/types:go_default_library", - "//vendor/gopkg.in/gcfg.v1:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/persistent_volumes-vsphere.go b/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/persistent_volumes-vsphere.go index f9494e0e35ae..4c1c070e5c11 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/persistent_volumes-vsphere.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/persistent_volumes-vsphere.go @@ -96,7 +96,7 @@ var _ = utils.SIGDescribe("PersistentVolumes:vsphere [Feature:vsphere]", func() ginkgo.By("Creating the PV and PVC") pv, pvc, err = e2epv.CreatePVPVC(c, pvConfig, pvcConfig, ns, false) framework.ExpectNoError(err) - framework.ExpectNoError(e2epv.WaitOnPVandPVC(c, ns, pv, pvc)) + framework.ExpectNoError(e2epv.WaitOnPVandPVC(c, f.Timeouts, ns, pv, pvc)) ginkgo.By("Creating the Client Pod") clientPod, err = e2epod.CreateClientPod(c, ns, pvc) diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/pv_reclaimpolicy.go b/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/pv_reclaimpolicy.go index eb9929fb3eda..b8f1d0f4b93b 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/pv_reclaimpolicy.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/pv_reclaimpolicy.go @@ -50,7 +50,7 @@ var _ = utils.SIGDescribe("PersistentVolumes [Feature:vsphere][Feature:ReclaimPo framework.ExpectNoError(framework.WaitForAllNodesSchedulable(c, framework.TestContext.NodeSchedulableTimeout)) }) - utils.SIGDescribe("persistentvolumereclaim:vsphere [Feature:vsphere]", func() { + ginkgo.Describe("persistentvolumereclaim:vsphere [Feature:vsphere]", func() { ginkgo.BeforeEach(func() { e2eskipper.SkipUnlessProviderIs("vsphere") Bootstrap(f) @@ -110,7 +110,7 @@ var _ = utils.SIGDescribe("PersistentVolumes [Feature:vsphere][Feature:ReclaimPo volumePath, pv, pvc, err = testSetupVSpherePersistentVolumeReclaim(c, nodeInfo, ns, v1.PersistentVolumeReclaimDelete) framework.ExpectNoError(err) // Wait for PV and PVC to Bind - framework.ExpectNoError(e2epv.WaitOnPVandPVC(c, ns, pv, pvc)) + framework.ExpectNoError(e2epv.WaitOnPVandPVC(c, f.Timeouts, ns, pv, pvc)) ginkgo.By("Creating the Pod") pod, err := e2epod.CreateClientPod(c, ns, pvc) @@ -173,7 +173,7 @@ var _ = utils.SIGDescribe("PersistentVolumes [Feature:vsphere][Feature:ReclaimPo volumePath, pv, pvc, err = testSetupVSpherePersistentVolumeReclaim(c, nodeInfo, ns, v1.PersistentVolumeReclaimRetain) framework.ExpectNoError(err) - writeContentToVSpherePV(c, pvc, volumeFileContent) + writeContentToVSpherePV(c, f.Timeouts, pvc, volumeFileContent) ginkgo.By("Delete PVC") framework.ExpectNoError(e2epv.DeletePersistentVolumeClaim(c, pvc.Name, ns), "Failed to delete PVC ", pvc.Name) @@ -196,8 +196,8 @@ var _ = utils.SIGDescribe("PersistentVolumes [Feature:vsphere][Feature:ReclaimPo framework.ExpectNoError(err) ginkgo.By("wait for the pv and pvc to bind") - framework.ExpectNoError(e2epv.WaitOnPVandPVC(c, ns, pv, pvc)) - verifyContentOfVSpherePV(c, pvc, volumeFileContent) + framework.ExpectNoError(e2epv.WaitOnPVandPVC(c, f.Timeouts, ns, pv, pvc)) + verifyContentOfVSpherePV(c, f.Timeouts, pvc, volumeFileContent) }) }) @@ -243,7 +243,7 @@ func deletePVCAfterBind(c clientset.Interface, ns string, pvc *v1.PersistentVolu var err error ginkgo.By("wait for the pv and pvc to bind") - framework.ExpectNoError(e2epv.WaitOnPVandPVC(c, ns, pv, pvc)) + framework.ExpectNoError(e2epv.WaitOnPVandPVC(c, f.Timeouts, ns, pv, pvc)) ginkgo.By("delete pvc") framework.ExpectNoError(e2epv.DeletePersistentVolumeClaim(c, pvc.Name, ns), "Failed to delete PVC ", pvc.Name) diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/pvc_label_selector.go b/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/pvc_label_selector.go index 1fdbdd5c29bc..3245f18569b9 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/pvc_label_selector.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/pvc_label_selector.go @@ -75,7 +75,7 @@ var _ = utils.SIGDescribe("PersistentVolumes [Feature:vsphere][Feature:LabelSele }) - utils.SIGDescribe("Selector-Label Volume Binding:vsphere [Feature:vsphere]", func() { + ginkgo.Describe("Selector-Label Volume Binding:vsphere [Feature:vsphere]", func() { ginkgo.AfterEach(func() { ginkgo.By("Running clean up actions") if framework.ProviderIs("vsphere") { @@ -87,7 +87,7 @@ var _ = utils.SIGDescribe("PersistentVolumes [Feature:vsphere][Feature:LabelSele framework.ExpectNoError(err) ginkgo.By("wait for the pvcSsd to bind with pvSsd") - framework.ExpectNoError(e2epv.WaitOnPVandPVC(c, ns, pvSsd, pvcSsd)) + framework.ExpectNoError(e2epv.WaitOnPVandPVC(c, f.Timeouts, ns, pvSsd, pvcSsd)) ginkgo.By("Verify status of pvcVvol is pending") err = e2epv.WaitForPersistentVolumeClaimPhase(v1.ClaimPending, c, ns, pvcVvol.Name, 3*time.Second, 300*time.Second) diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/vsphere_scale.go b/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/vsphere_scale.go index 19bbde5279ea..36db34cf143d 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/vsphere_scale.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/vsphere_scale.go @@ -149,7 +149,7 @@ var _ = utils.SIGDescribe("vcp at scale [Feature:vsphere] ", func() { volumeCountPerInstance = volumeCount } volumeCount = volumeCount - volumeCountPerInstance - go VolumeCreateAndAttach(client, namespace, scArrays, volumeCountPerInstance, volumesPerPod, nodeSelectorList, nodeVolumeMapChan) + go VolumeCreateAndAttach(client, f.Timeouts, namespace, scArrays, volumeCountPerInstance, volumesPerPod, nodeSelectorList, nodeVolumeMapChan) } // Get the list of all volumes attached to each node from the go routines by reading the data from the channel @@ -189,7 +189,7 @@ func getClaimsForPod(pod *v1.Pod, volumesPerPod int) []string { } // VolumeCreateAndAttach peforms create and attach operations of vSphere persistent volumes at scale -func VolumeCreateAndAttach(client clientset.Interface, namespace string, sc []*storagev1.StorageClass, volumeCountPerInstance int, volumesPerPod int, nodeSelectorList []*NodeSelector, nodeVolumeMapChan chan map[string][]string) { +func VolumeCreateAndAttach(client clientset.Interface, timeouts *framework.TimeoutContext, namespace string, sc []*storagev1.StorageClass, volumeCountPerInstance int, volumesPerPod int, nodeSelectorList []*NodeSelector, nodeVolumeMapChan chan map[string][]string) { defer ginkgo.GinkgoRecover() nodeVolumeMap := make(map[string][]string) nodeSelectorIndex := 0 @@ -206,7 +206,7 @@ func VolumeCreateAndAttach(client clientset.Interface, namespace string, sc []*s } ginkgo.By("Waiting for claim to be in bound phase") - persistentvolumes, err := e2epv.WaitForPVClaimBoundPhase(client, pvclaims, framework.ClaimProvisionTimeout) + persistentvolumes, err := e2epv.WaitForPVClaimBoundPhase(client, pvclaims, timeouts.ClaimProvision) framework.ExpectNoError(err) ginkgo.By("Creating pod to attach PV to the node") diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/vsphere_stress.go b/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/vsphere_stress.go index ef9f82db2ebf..1a742f256c36 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/vsphere_stress.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/vsphere_stress.go @@ -23,7 +23,7 @@ import ( "github.com/onsi/ginkgo" "github.com/onsi/gomega" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" storagev1 "k8s.io/api/storage/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" clientset "k8s.io/client-go/kubernetes" @@ -140,7 +140,7 @@ func PerformVolumeLifeCycleInParallel(f *framework.Framework, client clientset.I var pvclaims []*v1.PersistentVolumeClaim pvclaims = append(pvclaims, pvclaim) ginkgo.By(fmt.Sprintf("%v Waiting for claim: %v to be in bound phase", logPrefix, pvclaim.Name)) - persistentvolumes, err := e2epv.WaitForPVClaimBoundPhase(client, pvclaims, framework.ClaimProvisionTimeout) + persistentvolumes, err := e2epv.WaitForPVClaimBoundPhase(client, pvclaims, f.Timeouts.ClaimProvision) framework.ExpectNoError(err) ginkgo.By(fmt.Sprintf("%v Creating Pod using the claim: %v", logPrefix, pvclaim.Name)) @@ -149,7 +149,7 @@ func PerformVolumeLifeCycleInParallel(f *framework.Framework, client clientset.I framework.ExpectNoError(err) ginkgo.By(fmt.Sprintf("%v Waiting for the Pod: %v to be in the running state", logPrefix, pod.Name)) - err = e2epod.WaitForPodRunningInNamespaceSlow(f.ClientSet, pod.Name, f.Namespace.Name) + err = e2epod.WaitTimeoutForPodRunningInNamespace(f.ClientSet, pod.Name, f.Namespace.Name, f.Timeouts.PodStartSlow) framework.ExpectNoError(err) // Get the copy of the Pod to know the assigned node name. diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/vsphere_utils.go b/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/vsphere_utils.go index e98a1d2fb0db..a6a4d5f5d6ff 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/vsphere_utils.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/vsphere_utils.go @@ -196,14 +196,14 @@ func getVSpherePersistentVolumeClaimSpec(namespace string, labels map[string]str } // function to write content to the volume backed by given PVC -func writeContentToVSpherePV(client clientset.Interface, pvc *v1.PersistentVolumeClaim, expectedContent string) { - utils.RunInPodWithVolume(client, pvc.Namespace, pvc.Name, "echo "+expectedContent+" > /mnt/test/data") +func writeContentToVSpherePV(client clientset.Interface, timeouts *framework.TimeoutContext, pvc *v1.PersistentVolumeClaim, expectedContent string) { + utils.RunInPodWithVolume(client, timeouts, pvc.Namespace, pvc.Name, "echo "+expectedContent+" > /mnt/test/data") framework.Logf("Done with writing content to volume") } // function to verify content is matching on the volume backed for given PVC -func verifyContentOfVSpherePV(client clientset.Interface, pvc *v1.PersistentVolumeClaim, expectedContent string) { - utils.RunInPodWithVolume(client, pvc.Namespace, pvc.Name, "grep '"+expectedContent+"' /mnt/test/data") +func verifyContentOfVSpherePV(client clientset.Interface, timeouts *framework.TimeoutContext, pvc *v1.PersistentVolumeClaim, expectedContent string) { + utils.RunInPodWithVolume(client, timeouts, pvc.Namespace, pvc.Name, "grep '"+expectedContent+"' /mnt/test/data") framework.Logf("Successfully verified content of the volume") } @@ -762,7 +762,7 @@ func GetReadySchedulableNodeInfos() []*NodeInfo { } // GetReadySchedulableRandomNodeInfo returns NodeInfo object for one of the Ready and Schedulable Node. -// if multiple nodes are present with Ready and Scheduable state then one of the Node is selected randomly +// if multiple nodes are present with Ready and Schedulable state then one of the Node is selected randomly // and it's associated NodeInfo object is returned. func GetReadySchedulableRandomNodeInfo() *NodeInfo { nodesInfo := GetReadySchedulableNodeInfos() diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/vsphere_volume_diskformat.go b/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/vsphere_volume_diskformat.go index e5acb836b713..efbed401e9ca 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/vsphere_volume_diskformat.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/vsphere_volume_diskformat.go @@ -125,7 +125,7 @@ func invokeTest(f *framework.Framework, client clientset.Interface, namespace st }() ginkgo.By("Waiting for claim to be in bound phase") - err = e2epv.WaitForPersistentVolumeClaimPhase(v1.ClaimBound, client, pvclaim.Namespace, pvclaim.Name, framework.Poll, framework.ClaimProvisionTimeout) + err = e2epv.WaitForPersistentVolumeClaimPhase(v1.ClaimBound, client, pvclaim.Namespace, pvclaim.Name, framework.Poll, f.Timeouts.ClaimProvision) framework.ExpectNoError(err) // Get new copy of the claim diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/vsphere_volume_fstype.go b/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/vsphere_volume_fstype.go index b7e1d5c88e67..226b20cf50d5 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/vsphere_volume_fstype.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/vsphere_volume_fstype.go @@ -103,7 +103,7 @@ func invokeTestForFstype(f *framework.Framework, client clientset.Interface, nam // Create Persistent Volume ginkgo.By("Creating Storage Class With Fstype") - pvclaim, persistentvolumes := createVolume(client, namespace, scParameters) + pvclaim, persistentvolumes := createVolume(client, f.Timeouts, namespace, scParameters) // Create Pod and verify the persistent volume is accessible pod := createPodAndVerifyVolumeAccessible(client, namespace, pvclaim, persistentvolumes) @@ -122,7 +122,7 @@ func invokeTestForInvalidFstype(f *framework.Framework, client clientset.Interfa // Create Persistent Volume ginkgo.By("Creating Storage Class With Invalid Fstype") - pvclaim, persistentvolumes := createVolume(client, namespace, scParameters) + pvclaim, persistentvolumes := createVolume(client, f.Timeouts, namespace, scParameters) ginkgo.By("Creating pod to attach PV to the node") var pvclaims []*v1.PersistentVolumeClaim @@ -150,7 +150,7 @@ func invokeTestForInvalidFstype(f *framework.Framework, client clientset.Interfa framework.ExpectEqual(isFound, true, "Unable to verify MountVolume.MountDevice failure") } -func createVolume(client clientset.Interface, namespace string, scParameters map[string]string) (*v1.PersistentVolumeClaim, []*v1.PersistentVolume) { +func createVolume(client clientset.Interface, timeouts *framework.TimeoutContext, namespace string, scParameters map[string]string) (*v1.PersistentVolumeClaim, []*v1.PersistentVolume) { storageclass, err := client.StorageV1().StorageClasses().Create(context.TODO(), getVSphereStorageClassSpec("fstype", scParameters, nil, ""), metav1.CreateOptions{}) framework.ExpectNoError(err) defer client.StorageV1().StorageClasses().Delete(context.TODO(), storageclass.Name, metav1.DeleteOptions{}) @@ -162,7 +162,7 @@ func createVolume(client clientset.Interface, namespace string, scParameters map var pvclaims []*v1.PersistentVolumeClaim pvclaims = append(pvclaims, pvclaim) ginkgo.By("Waiting for claim to be in bound phase") - persistentvolumes, err := e2epv.WaitForPVClaimBoundPhase(client, pvclaims, framework.ClaimProvisionTimeout) + persistentvolumes, err := e2epv.WaitForPVClaimBoundPhase(client, pvclaims, timeouts.ClaimProvision) framework.ExpectNoError(err) return pvclaim, persistentvolumes } diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/vsphere_volume_node_poweroff.go b/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/vsphere_volume_node_poweroff.go index e294714287d6..7e47ed4c899c 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/vsphere_volume_node_poweroff.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/vsphere_volume_node_poweroff.go @@ -92,7 +92,7 @@ var _ = utils.SIGDescribe("Node Poweroff [Feature:vsphere] [Slow] [Disruptive]", ginkgo.By("Waiting for PVC to be in bound phase") pvclaims := []*v1.PersistentVolumeClaim{pvclaim} - pvs, err := e2epv.WaitForPVClaimBoundPhase(client, pvclaims, framework.ClaimProvisionTimeout) + pvs, err := e2epv.WaitForPVClaimBoundPhase(client, pvclaims, f.Timeouts.ClaimProvision) framework.ExpectNoError(err, fmt.Sprintf("Failed to wait until PVC phase set to bound: %v", err)) volumePath := pvs[0].Spec.VsphereVolume.VolumePath diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/vsphere_volume_ops_storm.go b/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/vsphere_volume_ops_storm.go index c2396aa5fe38..1d93c30dfb68 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/vsphere_volume_ops_storm.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/vsphere_volume_ops_storm.go @@ -24,7 +24,7 @@ import ( "github.com/onsi/ginkgo" "github.com/onsi/gomega" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" storagev1 "k8s.io/api/storage/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" clientset "k8s.io/client-go/kubernetes" @@ -104,7 +104,7 @@ var _ = utils.SIGDescribe("Volume Operations Storm [Feature:vsphere]", func() { } ginkgo.By("Waiting for all claims to be in bound phase") - persistentvolumes, err = e2epv.WaitForPVClaimBoundPhase(client, pvclaims, framework.ClaimProvisionTimeout) + persistentvolumes, err = e2epv.WaitForPVClaimBoundPhase(client, pvclaims, f.Timeouts.ClaimProvision) framework.ExpectNoError(err) ginkgo.By("Creating pod to attach PVs to the node") diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/vsphere_volume_perf.go b/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/vsphere_volume_perf.go index 424a421ce956..dcc9625675ad 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/vsphere_volume_perf.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/vsphere_volume_perf.go @@ -184,7 +184,7 @@ func invokeVolumeLifeCyclePerformance(f *framework.Framework, client clientset.I totalpvclaims = append(totalpvclaims, pvclaims) } for _, pvclaims := range totalpvclaims { - persistentvolumes, err := e2epv.WaitForPVClaimBoundPhase(client, pvclaims, framework.ClaimProvisionTimeout) + persistentvolumes, err := e2epv.WaitForPVClaimBoundPhase(client, pvclaims, f.Timeouts.ClaimProvision) framework.ExpectNoError(err) totalpvs = append(totalpvs, persistentvolumes) } diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/vsphere_volume_vsan_policy.go b/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/vsphere_volume_vsan_policy.go index 05bbc883aa9c..bbb245c8a9a3 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/vsphere_volume_vsan_policy.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/vsphere_volume_vsan_policy.go @@ -269,7 +269,7 @@ func invokeValidPolicyTest(f *framework.Framework, client clientset.Interface, n var pvclaims []*v1.PersistentVolumeClaim pvclaims = append(pvclaims, pvclaim) ginkgo.By("Waiting for claim to be in bound phase") - persistentvolumes, err := e2epv.WaitForPVClaimBoundPhase(client, pvclaims, framework.ClaimProvisionTimeout) + persistentvolumes, err := e2epv.WaitForPVClaimBoundPhase(client, pvclaims, f.Timeouts.ClaimProvision) framework.ExpectNoError(err) ginkgo.By("Creating pod to attach PV to the node") diff --git a/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/vsphere_zone_support.go b/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/vsphere_zone_support.go index b8f9a17d5389..a23d73cbebd5 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/vsphere_zone_support.go +++ b/vendor/k8s.io/kubernetes/test/e2e/storage/vsphere/vsphere_zone_support.go @@ -127,14 +127,14 @@ var _ = utils.SIGDescribe("Zone Support [Feature:vsphere]", func() { ginkgo.It("Verify dynamically created pv with allowed zones specified in storage class, shows the right zone information on its labels", func() { ginkgo.By(fmt.Sprintf("Creating storage class with the following zones : %s", zoneA)) zones = append(zones, zoneA) - verifyPVZoneLabels(client, namespace, nil, zones) + verifyPVZoneLabels(client, f.Timeouts, namespace, nil, zones) }) ginkgo.It("Verify dynamically created pv with multiple zones specified in the storage class, shows both the zones on its labels", func() { ginkgo.By(fmt.Sprintf("Creating storage class with the following zones : %s, %s", zoneA, zoneB)) zones = append(zones, zoneA) zones = append(zones, zoneB) - verifyPVZoneLabels(client, namespace, nil, zones) + verifyPVZoneLabels(client, f.Timeouts, namespace, nil, zones) }) ginkgo.It("Verify PVC creation with invalid zone specified in storage class fails", func() { @@ -151,21 +151,21 @@ var _ = utils.SIGDescribe("Zone Support [Feature:vsphere]", func() { ginkgo.It("Verify a pod is created and attached to a dynamically created PV, based on allowed zones specified in storage class ", func() { ginkgo.By(fmt.Sprintf("Creating storage class with zones :%s", zoneA)) zones = append(zones, zoneA) - verifyPVCAndPodCreationSucceeds(client, namespace, nil, zones, "") + verifyPVCAndPodCreationSucceeds(client, f.Timeouts, namespace, nil, zones, "") }) ginkgo.It("Verify a pod is created and attached to a dynamically created PV, based on multiple zones specified in storage class ", func() { ginkgo.By(fmt.Sprintf("Creating storage class with zones :%s, %s", zoneA, zoneB)) zones = append(zones, zoneA) zones = append(zones, zoneB) - verifyPVCAndPodCreationSucceeds(client, namespace, nil, zones, "") + verifyPVCAndPodCreationSucceeds(client, f.Timeouts, namespace, nil, zones, "") }) ginkgo.It("Verify a pod is created and attached to a dynamically created PV, based on the allowed zones and datastore specified in storage class", func() { ginkgo.By(fmt.Sprintf("Creating storage class with zone :%s and datastore :%s", zoneA, vsanDatastore1)) scParameters[Datastore] = vsanDatastore1 zones = append(zones, zoneA) - verifyPVCAndPodCreationSucceeds(client, namespace, scParameters, zones, "") + verifyPVCAndPodCreationSucceeds(client, f.Timeouts, namespace, scParameters, zones, "") }) ginkgo.It("Verify PVC creation with incompatible datastore and zone combination specified in storage class fails", func() { @@ -183,14 +183,14 @@ var _ = utils.SIGDescribe("Zone Support [Feature:vsphere]", func() { ginkgo.By(fmt.Sprintf("Creating storage class with zone :%s and storage policy :%s", zoneA, compatPolicy)) scParameters[SpbmStoragePolicy] = compatPolicy zones = append(zones, zoneA) - verifyPVCAndPodCreationSucceeds(client, namespace, scParameters, zones, "") + verifyPVCAndPodCreationSucceeds(client, f.Timeouts, namespace, scParameters, zones, "") }) ginkgo.It("Verify a pod is created on a non-Workspace zone and attached to a dynamically created PV, based on the allowed zones and storage policy specified in storage class", func() { ginkgo.By(fmt.Sprintf("Creating storage class with zone :%s and storage policy :%s", zoneB, compatPolicy)) scParameters[SpbmStoragePolicy] = compatPolicy zones = append(zones, zoneB) - verifyPVCAndPodCreationSucceeds(client, namespace, scParameters, zones, "") + verifyPVCAndPodCreationSucceeds(client, f.Timeouts, namespace, scParameters, zones, "") }) ginkgo.It("Verify PVC creation with incompatible storagePolicy and zone combination specified in storage class fails", func() { @@ -209,7 +209,7 @@ var _ = utils.SIGDescribe("Zone Support [Feature:vsphere]", func() { scParameters[SpbmStoragePolicy] = compatPolicy scParameters[Datastore] = vsanDatastore1 zones = append(zones, zoneA) - verifyPVCAndPodCreationSucceeds(client, namespace, scParameters, zones, "") + verifyPVCAndPodCreationSucceeds(client, f.Timeouts, namespace, scParameters, zones, "") }) ginkgo.It("Verify PVC creation with incompatible storage policy along with compatible zone and datastore combination specified in storage class fails", func() { @@ -314,40 +314,40 @@ var _ = utils.SIGDescribe("Zone Support [Feature:vsphere]", func() { scParameters[PolicyIopsLimit] = IopsLimitCapabilityVal scParameters[Datastore] = vsanDatastore1 zones = append(zones, zoneA) - verifyPVCAndPodCreationSucceeds(client, namespace, scParameters, zones, "") + verifyPVCAndPodCreationSucceeds(client, f.Timeouts, namespace, scParameters, zones, "") }) ginkgo.It("Verify a pod is created and attached to a dynamically created PV, based on the allowed zones specified in storage class when the datastore under the zone is present in another datacenter", func() { ginkgo.By(fmt.Sprintf("Creating storage class with zone :%s", zoneD)) zones = append(zones, zoneD) - verifyPVCAndPodCreationSucceeds(client, namespace, scParameters, zones, "") + verifyPVCAndPodCreationSucceeds(client, f.Timeouts, namespace, scParameters, zones, "") }) ginkgo.It("Verify a pod is created and attached to a dynamically created PV, based on the allowed zones and datastore specified in storage class when there are multiple datastores with the same name under different zones across datacenters", func() { ginkgo.By(fmt.Sprintf("Creating storage class with zone :%s and datastore name :%s", zoneD, localDatastore)) scParameters[Datastore] = localDatastore zones = append(zones, zoneD) - verifyPVCAndPodCreationSucceeds(client, namespace, scParameters, zones, "") + verifyPVCAndPodCreationSucceeds(client, f.Timeouts, namespace, scParameters, zones, "") }) ginkgo.It("Verify a pod is created and attached to a dynamically created PV with storage policy specified in storage class in waitForFirstConsumer binding mode", func() { ginkgo.By(fmt.Sprintf("Creating storage class with waitForFirstConsumer mode and storage policy :%s", compatPolicy)) scParameters[SpbmStoragePolicy] = compatPolicy - verifyPVCAndPodCreationSucceeds(client, namespace, scParameters, nil, storagev1.VolumeBindingWaitForFirstConsumer) + verifyPVCAndPodCreationSucceeds(client, f.Timeouts, namespace, scParameters, nil, storagev1.VolumeBindingWaitForFirstConsumer) }) ginkgo.It("Verify a pod is created and attached to a dynamically created PV with storage policy specified in storage class in waitForFirstConsumer binding mode with allowedTopologies", func() { ginkgo.By(fmt.Sprintf("Creating storage class with waitForFirstConsumer mode, storage policy :%s and zone :%s", compatPolicy, zoneA)) scParameters[SpbmStoragePolicy] = compatPolicy zones = append(zones, zoneA) - verifyPVCAndPodCreationSucceeds(client, namespace, scParameters, zones, storagev1.VolumeBindingWaitForFirstConsumer) + verifyPVCAndPodCreationSucceeds(client, f.Timeouts, namespace, scParameters, zones, storagev1.VolumeBindingWaitForFirstConsumer) }) ginkgo.It("Verify a pod is created and attached to a dynamically created PV with storage policy specified in storage class in waitForFirstConsumer binding mode with multiple allowedTopologies", func() { ginkgo.By(fmt.Sprintf("Creating storage class with waitForFirstConsumer mode and zones : %s, %s", zoneA, zoneB)) zones = append(zones, zoneA) zones = append(zones, zoneB) - verifyPVCAndPodCreationSucceeds(client, namespace, nil, zones, storagev1.VolumeBindingWaitForFirstConsumer) + verifyPVCAndPodCreationSucceeds(client, f.Timeouts, namespace, nil, zones, storagev1.VolumeBindingWaitForFirstConsumer) }) ginkgo.It("Verify a PVC creation fails when multiple zones are specified in the storage class without shared datastores among the zones in waitForFirstConsumer binding mode", func() { @@ -375,7 +375,7 @@ var _ = utils.SIGDescribe("Zone Support [Feature:vsphere]", func() { }) }) -func verifyPVCAndPodCreationSucceeds(client clientset.Interface, namespace string, scParameters map[string]string, zones []string, volumeBindingMode storagev1.VolumeBindingMode) { +func verifyPVCAndPodCreationSucceeds(client clientset.Interface, timeouts *framework.TimeoutContext, namespace string, scParameters map[string]string, zones []string, volumeBindingMode storagev1.VolumeBindingMode) { storageclass, err := client.StorageV1().StorageClasses().Create(context.TODO(), getVSphereStorageClassSpec("zone-sc", scParameters, zones, volumeBindingMode), metav1.CreateOptions{}) framework.ExpectNoError(err, fmt.Sprintf("Failed to create storage class with err: %v", err)) defer client.StorageV1().StorageClasses().Delete(context.TODO(), storageclass.Name, metav1.DeleteOptions{}) @@ -391,7 +391,7 @@ func verifyPVCAndPodCreationSucceeds(client clientset.Interface, namespace strin var persistentvolumes []*v1.PersistentVolume // If WaitForFirstConsumer mode, verify pvc binding status after pod creation. For immediate mode, do now. if volumeBindingMode != storagev1.VolumeBindingWaitForFirstConsumer { - persistentvolumes = waitForPVClaimBoundPhase(client, pvclaims, framework.ClaimProvisionTimeout) + persistentvolumes = waitForPVClaimBoundPhase(client, pvclaims, timeouts.ClaimProvision) } ginkgo.By("Creating pod to attach PV to the node") @@ -399,7 +399,7 @@ func verifyPVCAndPodCreationSucceeds(client clientset.Interface, namespace strin framework.ExpectNoError(err) if volumeBindingMode == storagev1.VolumeBindingWaitForFirstConsumer { - persistentvolumes = waitForPVClaimBoundPhase(client, pvclaims, framework.ClaimProvisionTimeout) + persistentvolumes = waitForPVClaimBoundPhase(client, pvclaims, timeouts.ClaimProvision) } if zones != nil { @@ -499,7 +499,7 @@ func verifyPVCCreationFails(client clientset.Interface, namespace string, scPara return fmt.Errorf("Failure message: %+q", eventList.Items[0].Message) } -func verifyPVZoneLabels(client clientset.Interface, namespace string, scParameters map[string]string, zones []string) { +func verifyPVZoneLabels(client clientset.Interface, timeouts *framework.TimeoutContext, namespace string, scParameters map[string]string, zones []string) { storageclass, err := client.StorageV1().StorageClasses().Create(context.TODO(), getVSphereStorageClassSpec("zone-sc", nil, zones, ""), metav1.CreateOptions{}) framework.ExpectNoError(err, fmt.Sprintf("Failed to create storage class with err: %v", err)) defer client.StorageV1().StorageClasses().Delete(context.TODO(), storageclass.Name, metav1.DeleteOptions{}) @@ -512,7 +512,7 @@ func verifyPVZoneLabels(client clientset.Interface, namespace string, scParamete var pvclaims []*v1.PersistentVolumeClaim pvclaims = append(pvclaims, pvclaim) ginkgo.By("Waiting for claim to be in bound phase") - persistentvolumes, err := e2epv.WaitForPVClaimBoundPhase(client, pvclaims, framework.ClaimProvisionTimeout) + persistentvolumes, err := e2epv.WaitForPVClaimBoundPhase(client, pvclaims, timeouts.ClaimProvision) framework.ExpectNoError(err) ginkgo.By("Verify zone information is present in the volume labels") diff --git a/vendor/k8s.io/kubernetes/test/e2e/upgrades/BUILD b/vendor/k8s.io/kubernetes/test/e2e/upgrades/BUILD deleted file mode 100644 index 72ad542dc159..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/upgrades/BUILD +++ /dev/null @@ -1,73 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "apparmor.go", - "cassandra.go", - "configmaps.go", - "etcd.go", - "horizontal_pod_autoscalers.go", - "kube_proxy_migration.go", - "mysql.go", - "nvidia-gpu.go", - "secrets.go", - "serviceaccount_admission_controller_migration.go", - "services.go", - "sysctl.go", - "upgrade.go", - ], - importpath = "k8s.io/kubernetes/test/e2e/upgrades", - deps = [ - "//pkg/kubelet/sysctl:go_default_library", - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/version:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//test/e2e/auth:go_default_library", - "//test/e2e/framework:go_default_library", - "//test/e2e/framework/autoscaling:go_default_library", - "//test/e2e/framework/job:go_default_library", - "//test/e2e/framework/kubectl:go_default_library", - "//test/e2e/framework/node:go_default_library", - "//test/e2e/framework/pod:go_default_library", - "//test/e2e/framework/security:go_default_library", - "//test/e2e/framework/service:go_default_library", - "//test/e2e/framework/skipper:go_default_library", - "//test/e2e/framework/statefulset:go_default_library", - "//test/e2e/framework/testfiles:go_default_library", - "//test/e2e/scheduling:go_default_library", - "//test/utils/image:go_default_library", - "//vendor/github.com/onsi/ginkgo:go_default_library", - "//vendor/github.com/onsi/gomega:go_default_library", - "//vendor/github.com/onsi/gomega/gstruct:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//test/e2e/upgrades/apps:all-srcs", - "//test/e2e/upgrades/storage:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/upgrades/apparmor.go b/vendor/k8s.io/kubernetes/test/e2e/upgrades/apparmor.go deleted file mode 100644 index c1d80f3ace18..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/upgrades/apparmor.go +++ /dev/null @@ -1,117 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package upgrades - -import ( - "context" - v1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/kubernetes/test/e2e/framework" - e2ekubectl "k8s.io/kubernetes/test/e2e/framework/kubectl" - e2esecurity "k8s.io/kubernetes/test/e2e/framework/security" - e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" - - "github.com/onsi/ginkgo" - "github.com/onsi/gomega" - "github.com/onsi/gomega/gstruct" -) - -// AppArmorUpgradeTest tests that AppArmor profiles are enforced & usable across upgrades. -type AppArmorUpgradeTest struct { - pod *v1.Pod -} - -// Name returns the tracking name of the test. -func (AppArmorUpgradeTest) Name() string { return "apparmor-upgrade" } - -// Skip returns true when this test can be skipped. -func (AppArmorUpgradeTest) Skip(upgCtx UpgradeContext) bool { - supportedImages := make(map[string]bool) - for _, d := range e2eskipper.AppArmorDistros { - supportedImages[d] = true - } - - for _, vCtx := range upgCtx.Versions { - if !supportedImages[vCtx.NodeImage] { - return true - } - } - return false -} - -// Setup creates a secret and then verifies that a pod can consume it. -func (t *AppArmorUpgradeTest) Setup(f *framework.Framework) { - ginkgo.By("Loading AppArmor profiles to nodes") - e2esecurity.LoadAppArmorProfiles(f.Namespace.Name, f.ClientSet) - - // Create the initial test pod. - ginkgo.By("Creating a long-running AppArmor enabled pod.") - t.pod = e2esecurity.CreateAppArmorTestPod(f.Namespace.Name, f.ClientSet, f.PodClient(), false, false) - - // Verify initial state. - t.verifyNodesAppArmorEnabled(f) - t.verifyNewPodSucceeds(f) -} - -// Test waits for the upgrade to complete, and then verifies that a -// pod can still consume the secret. -func (t *AppArmorUpgradeTest) Test(f *framework.Framework, done <-chan struct{}, upgrade UpgradeType) { - <-done - if upgrade == MasterUpgrade { - t.verifyPodStillUp(f) - } - t.verifyNodesAppArmorEnabled(f) - t.verifyNewPodSucceeds(f) -} - -// Teardown cleans up any remaining resources. -func (t *AppArmorUpgradeTest) Teardown(f *framework.Framework) { - // rely on the namespace deletion to clean up everything - ginkgo.By("Logging container failures") - e2ekubectl.LogFailedContainers(f.ClientSet, f.Namespace.Name, framework.Logf) -} - -func (t *AppArmorUpgradeTest) verifyPodStillUp(f *framework.Framework) { - ginkgo.By("Verifying an AppArmor profile is continuously enforced for a pod") - pod, err := f.PodClient().Get(context.TODO(), t.pod.Name, metav1.GetOptions{}) - framework.ExpectNoError(err, "Should be able to get pod") - framework.ExpectEqual(pod.Status.Phase, v1.PodRunning, "Pod should stay running") - gomega.Expect(pod.Status.ContainerStatuses[0].State.Running).NotTo(gomega.BeNil(), "Container should be running") - gomega.Expect(pod.Status.ContainerStatuses[0].RestartCount).To(gomega.BeZero(), "Container should not need to be restarted") -} - -func (t *AppArmorUpgradeTest) verifyNewPodSucceeds(f *framework.Framework) { - ginkgo.By("Verifying an AppArmor profile is enforced for a new pod") - e2esecurity.CreateAppArmorTestPod(f.Namespace.Name, f.ClientSet, f.PodClient(), false, true) -} - -func (t *AppArmorUpgradeTest) verifyNodesAppArmorEnabled(f *framework.Framework) { - ginkgo.By("Verifying nodes are AppArmor enabled") - nodes, err := f.ClientSet.CoreV1().Nodes().List(context.TODO(), metav1.ListOptions{}) - framework.ExpectNoError(err, "Failed to list nodes") - for _, node := range nodes.Items { - gomega.Expect(node.Status.Conditions).To(gstruct.MatchElements(conditionType, gstruct.IgnoreExtras, gstruct.Elements{ - "Ready": gstruct.MatchFields(gstruct.IgnoreExtras, gstruct.Fields{ - "Message": gomega.ContainSubstring("AppArmor enabled"), - }), - })) - } -} - -func conditionType(condition interface{}) string { - return string(condition.(v1.NodeCondition).Type) -} diff --git a/vendor/k8s.io/kubernetes/test/e2e/upgrades/apps/BUILD b/vendor/k8s.io/kubernetes/test/e2e/upgrades/apps/BUILD deleted file mode 100644 index 080c01341912..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/upgrades/apps/BUILD +++ /dev/null @@ -1,52 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "daemonsets.go", - "deployments.go", - "job.go", - "replicasets.go", - "statefulset.go", - ], - importpath = "k8s.io/kubernetes/test/e2e/upgrades/apps", - deps = [ - "//pkg/controller:go_default_library", - "//pkg/controller/deployment/util:go_default_library", - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/batch/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/version:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//test/e2e/framework:go_default_library", - "//test/e2e/framework/deployment:go_default_library", - "//test/e2e/framework/job:go_default_library", - "//test/e2e/framework/replicaset:go_default_library", - "//test/e2e/framework/statefulset:go_default_library", - "//test/e2e/upgrades:go_default_library", - "//test/utils/image:go_default_library", - "//vendor/github.com/onsi/ginkgo:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/test/e2e/upgrades/cassandra.go b/vendor/k8s.io/kubernetes/test/e2e/upgrades/apps/cassandra.go similarity index 97% rename from vendor/k8s.io/kubernetes/test/e2e/upgrades/cassandra.go rename to vendor/k8s.io/kubernetes/test/e2e/upgrades/apps/cassandra.go index 4fbf97f64df7..6aed50fcacc2 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/upgrades/cassandra.go +++ b/vendor/k8s.io/kubernetes/test/e2e/upgrades/apps/cassandra.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package upgrades +package apps import ( "context" @@ -34,6 +34,7 @@ import ( "k8s.io/kubernetes/test/e2e/framework" e2estatefulset "k8s.io/kubernetes/test/e2e/framework/statefulset" e2etestfiles "k8s.io/kubernetes/test/e2e/framework/testfiles" + "k8s.io/kubernetes/test/e2e/upgrades" ) const cassandraManifestPath = "test/e2e/testing-manifests/statefulset/cassandra" @@ -49,7 +50,7 @@ type CassandraUpgradeTest struct { func (CassandraUpgradeTest) Name() string { return "cassandra-upgrade" } // Skip returns true when this test can be skipped. -func (CassandraUpgradeTest) Skip(upgCtx UpgradeContext) bool { +func (CassandraUpgradeTest) Skip(upgCtx upgrades.UpgradeContext) bool { minVersion := version.MustParseSemantic("1.6.0") for _, vCtx := range upgCtx.Versions { if vCtx.Version.LessThan(minVersion) { @@ -169,7 +170,7 @@ func (t *CassandraUpgradeTest) getServiceIP(f *framework.Framework, ns, svcName // from the db. Each attempt is tallied and at the end we verify if the success // ratio is over a certain threshold (0.75). We also verify that we get // at least the same number of rows back as we successfully wrote. -func (t *CassandraUpgradeTest) Test(f *framework.Framework, done <-chan struct{}, upgrade UpgradeType) { +func (t *CassandraUpgradeTest) Test(f *framework.Framework, done <-chan struct{}, upgrade upgrades.UpgradeType) { ginkgo.By("Continuously polling the database during upgrade.") var ( success, failures, writeAttempts, lastUserCount int diff --git a/vendor/k8s.io/kubernetes/test/e2e/upgrades/apps/daemonsets.go b/vendor/k8s.io/kubernetes/test/e2e/upgrades/apps/daemonsets.go index 832ac1f1c0b9..063ad4cd28f5 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/upgrades/apps/daemonsets.go +++ b/vendor/k8s.io/kubernetes/test/e2e/upgrades/apps/daemonsets.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package upgrades +package apps import ( "context" diff --git a/vendor/k8s.io/kubernetes/test/e2e/upgrades/apps/deployments.go b/vendor/k8s.io/kubernetes/test/e2e/upgrades/apps/deployments.go index f03032c9af06..5d86c785c12d 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/upgrades/apps/deployments.go +++ b/vendor/k8s.io/kubernetes/test/e2e/upgrades/apps/deployments.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package upgrades +package apps import ( "context" diff --git a/vendor/k8s.io/kubernetes/test/e2e/upgrades/apps/etcd.go b/vendor/k8s.io/kubernetes/test/e2e/upgrades/apps/etcd.go new file mode 100644 index 000000000000..2112f3bc3dbf --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/upgrades/apps/etcd.go @@ -0,0 +1,211 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package apps + +import ( + "context" + "encoding/json" + "fmt" + "io/ioutil" + "net/http" + "path/filepath" + "sync" + "time" + + "github.com/onsi/ginkgo" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/version" + "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/kubernetes/test/e2e/framework" + e2estatefulset "k8s.io/kubernetes/test/e2e/framework/statefulset" + e2etestfiles "k8s.io/kubernetes/test/e2e/framework/testfiles" + "k8s.io/kubernetes/test/e2e/upgrades" +) + +const manifestPath = "test/e2e/testing-manifests/statefulset/etcd" + +// EtcdUpgradeTest tests that etcd is writable before and after a cluster upgrade. +type EtcdUpgradeTest struct { + ip string + successfulWrites int +} + +// Name returns the tracking name of the test. +func (EtcdUpgradeTest) Name() string { return "etcd-upgrade" } + +// Skip returns true when this test can be skipped. +func (EtcdUpgradeTest) Skip(upgCtx upgrades.UpgradeContext) bool { + minVersion := version.MustParseSemantic("1.6.0") + for _, vCtx := range upgCtx.Versions { + if vCtx.Version.LessThan(minVersion) { + return true + } + } + return false +} + +func kubectlCreate(ns, file string) { + data, err := e2etestfiles.Read(filepath.Join(manifestPath, file)) + if err != nil { + framework.Fail(err.Error()) + } + input := string(data) + framework.RunKubectlOrDieInput(ns, input, "create", "-f", "-") +} + +// Setup creates etcd statefulset and then verifies that the etcd is writable. +func (t *EtcdUpgradeTest) Setup(f *framework.Framework) { + ns := f.Namespace.Name + statefulsetPoll := 30 * time.Second + statefulsetTimeout := 10 * time.Minute + + ginkgo.By("Creating a PDB") + kubectlCreate(ns, "pdb.yaml") + + ginkgo.By("Creating an etcd StatefulSet") + e2estatefulset.CreateStatefulSet(f.ClientSet, manifestPath, ns) + + ginkgo.By("Creating an etcd--test-server deployment") + kubectlCreate(ns, "tester.yaml") + + ginkgo.By("Getting the ingress IPs from the services") + err := wait.PollImmediate(statefulsetPoll, statefulsetTimeout, func() (bool, error) { + if t.ip = t.getServiceIP(f, ns, "test-server"); t.ip == "" { + return false, nil + } + if _, err := t.listUsers(); err != nil { + framework.Logf("Service endpoint is up but isn't responding") + return false, nil + } + return true, nil + }) + framework.ExpectNoError(err) + framework.Logf("Service endpoint is up") + + ginkgo.By("Adding 2 dummy users") + err = t.addUser("Alice") + framework.ExpectNoError(err) + err = t.addUser("Bob") + framework.ExpectNoError(err) + t.successfulWrites = 2 + + ginkgo.By("Verifying that the users exist") + users, err := t.listUsers() + framework.ExpectNoError(err) + framework.ExpectEqual(len(users), 2) +} + +func (t *EtcdUpgradeTest) listUsers() ([]string, error) { + r, err := http.Get(fmt.Sprintf("http://%s:8080/list", t.ip)) + if err != nil { + return nil, err + } + defer r.Body.Close() + if r.StatusCode != http.StatusOK { + b, err := ioutil.ReadAll(r.Body) + if err != nil { + return nil, err + } + return nil, fmt.Errorf(string(b)) + } + var names []string + if err := json.NewDecoder(r.Body).Decode(&names); err != nil { + return nil, err + } + return names, nil +} + +func (t *EtcdUpgradeTest) addUser(name string) error { + val := map[string][]string{"name": {name}} + r, err := http.PostForm(fmt.Sprintf("http://%s:8080/add", t.ip), val) + if err != nil { + return err + } + defer r.Body.Close() + if r.StatusCode != http.StatusOK { + b, err := ioutil.ReadAll(r.Body) + if err != nil { + return err + } + return fmt.Errorf(string(b)) + } + return nil +} + +func (t *EtcdUpgradeTest) getServiceIP(f *framework.Framework, ns, svcName string) string { + svc, err := f.ClientSet.CoreV1().Services(ns).Get(context.TODO(), svcName, metav1.GetOptions{}) + framework.ExpectNoError(err) + ingress := svc.Status.LoadBalancer.Ingress + if len(ingress) == 0 { + return "" + } + return ingress[0].IP +} + +// Test waits for upgrade to complete and verifies if etcd is writable. +func (t *EtcdUpgradeTest) Test(f *framework.Framework, done <-chan struct{}, upgrade upgrades.UpgradeType) { + ginkgo.By("Continuously polling the database during upgrade.") + var ( + success, failures, writeAttempts, lastUserCount int + mu sync.Mutex + errors = map[string]int{} + ) + // Write loop. + go wait.Until(func() { + writeAttempts++ + if err := t.addUser(fmt.Sprintf("user-%d", writeAttempts)); err != nil { + framework.Logf("Unable to add user: %v", err) + mu.Lock() + errors[err.Error()]++ + mu.Unlock() + return + } + t.successfulWrites++ + }, 10*time.Millisecond, done) + // Read loop. + wait.Until(func() { + users, err := t.listUsers() + if err != nil { + framework.Logf("Could not retrieve users: %v", err) + failures++ + mu.Lock() + errors[err.Error()]++ + mu.Unlock() + return + } + success++ + lastUserCount = len(users) + }, 10*time.Millisecond, done) + framework.Logf("got %d users; want >=%d", lastUserCount, t.successfulWrites) + + framework.ExpectEqual(lastUserCount >= t.successfulWrites, true) + ratio := float64(success) / float64(success+failures) + framework.Logf("Successful gets %d/%d=%v", success, success+failures, ratio) + ratio = float64(t.successfulWrites) / float64(writeAttempts) + framework.Logf("Successful writes %d/%d=%v", t.successfulWrites, writeAttempts, ratio) + framework.Logf("Errors: %v", errors) + // TODO(maisem): tweak this value once we have a few test runs. + framework.ExpectEqual(ratio > 0.75, true) +} + +// Teardown does one final check of the data's availability. +func (t *EtcdUpgradeTest) Teardown(f *framework.Framework) { + users, err := t.listUsers() + framework.ExpectNoError(err) + framework.ExpectEqual(len(users) >= t.successfulWrites, true) +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/upgrades/apps/job.go b/vendor/k8s.io/kubernetes/test/e2e/upgrades/apps/job.go index 90a715621e85..367de4f58999 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/upgrades/apps/job.go +++ b/vendor/k8s.io/kubernetes/test/e2e/upgrades/apps/job.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package upgrades +package apps import ( "context" diff --git a/vendor/k8s.io/kubernetes/test/e2e/upgrades/mysql.go b/vendor/k8s.io/kubernetes/test/e2e/upgrades/apps/mysql.go similarity index 97% rename from vendor/k8s.io/kubernetes/test/e2e/upgrades/mysql.go rename to vendor/k8s.io/kubernetes/test/e2e/upgrades/apps/mysql.go index edc94a5c2023..18599f0570ee 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/upgrades/mysql.go +++ b/vendor/k8s.io/kubernetes/test/e2e/upgrades/apps/mysql.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package upgrades +package apps import ( "context" @@ -34,6 +34,7 @@ import ( "k8s.io/kubernetes/test/e2e/framework" e2estatefulset "k8s.io/kubernetes/test/e2e/framework/statefulset" e2etestfiles "k8s.io/kubernetes/test/e2e/framework/testfiles" + "k8s.io/kubernetes/test/e2e/upgrades" ) const mysqlManifestPath = "test/e2e/testing-manifests/statefulset/mysql-upgrade" @@ -49,7 +50,7 @@ type MySQLUpgradeTest struct { func (MySQLUpgradeTest) Name() string { return "mysql-upgrade" } // Skip returns true when this test can be skipped. -func (MySQLUpgradeTest) Skip(upgCtx UpgradeContext) bool { +func (MySQLUpgradeTest) Skip(upgCtx upgrades.UpgradeContext) bool { minVersion := version.MustParseSemantic("1.5.0") for _, vCtx := range upgCtx.Versions { @@ -125,7 +126,7 @@ func (t *MySQLUpgradeTest) Setup(f *framework.Framework) { // Test continually polls the db using the read and write connections, inserting data, and checking // that all the data is readable. -func (t *MySQLUpgradeTest) Test(f *framework.Framework, done <-chan struct{}, upgrade UpgradeType) { +func (t *MySQLUpgradeTest) Test(f *framework.Framework, done <-chan struct{}, upgrade upgrades.UpgradeType) { var writeSuccess, readSuccess, writeFailure, readFailure int ginkgo.By("Continuously polling the database during upgrade.") go wait.Until(func() { diff --git a/vendor/k8s.io/kubernetes/test/e2e/upgrades/apps/replicasets.go b/vendor/k8s.io/kubernetes/test/e2e/upgrades/apps/replicasets.go index f38d6a967400..2b3c88087e51 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/upgrades/apps/replicasets.go +++ b/vendor/k8s.io/kubernetes/test/e2e/upgrades/apps/replicasets.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package upgrades +package apps import ( "context" diff --git a/vendor/k8s.io/kubernetes/test/e2e/upgrades/apps/statefulset.go b/vendor/k8s.io/kubernetes/test/e2e/upgrades/apps/statefulset.go index 312c6ca2951f..65c844bee7e2 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/upgrades/apps/statefulset.go +++ b/vendor/k8s.io/kubernetes/test/e2e/upgrades/apps/statefulset.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package upgrades +package apps import ( "context" diff --git a/vendor/k8s.io/kubernetes/test/e2e/upgrades/etcd.go b/vendor/k8s.io/kubernetes/test/e2e/upgrades/etcd.go deleted file mode 100644 index 243cd7cfb33b..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/upgrades/etcd.go +++ /dev/null @@ -1,210 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package upgrades - -import ( - "context" - "encoding/json" - "fmt" - "io/ioutil" - "net/http" - "path/filepath" - "sync" - "time" - - "github.com/onsi/ginkgo" - - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/version" - "k8s.io/apimachinery/pkg/util/wait" - "k8s.io/kubernetes/test/e2e/framework" - e2estatefulset "k8s.io/kubernetes/test/e2e/framework/statefulset" - e2etestfiles "k8s.io/kubernetes/test/e2e/framework/testfiles" -) - -const manifestPath = "test/e2e/testing-manifests/statefulset/etcd" - -// EtcdUpgradeTest tests that etcd is writable before and after a cluster upgrade. -type EtcdUpgradeTest struct { - ip string - successfulWrites int -} - -// Name returns the tracking name of the test. -func (EtcdUpgradeTest) Name() string { return "etcd-upgrade" } - -// Skip returns true when this test can be skipped. -func (EtcdUpgradeTest) Skip(upgCtx UpgradeContext) bool { - minVersion := version.MustParseSemantic("1.6.0") - for _, vCtx := range upgCtx.Versions { - if vCtx.Version.LessThan(minVersion) { - return true - } - } - return false -} - -func kubectlCreate(ns, file string) { - data, err := e2etestfiles.Read(filepath.Join(manifestPath, file)) - if err != nil { - framework.Fail(err.Error()) - } - input := string(data) - framework.RunKubectlOrDieInput(ns, input, "create", "-f", "-") -} - -// Setup creates etcd statefulset and then verifies that the etcd is writable. -func (t *EtcdUpgradeTest) Setup(f *framework.Framework) { - ns := f.Namespace.Name - statefulsetPoll := 30 * time.Second - statefulsetTimeout := 10 * time.Minute - - ginkgo.By("Creating a PDB") - kubectlCreate(ns, "pdb.yaml") - - ginkgo.By("Creating an etcd StatefulSet") - e2estatefulset.CreateStatefulSet(f.ClientSet, manifestPath, ns) - - ginkgo.By("Creating an etcd--test-server deployment") - kubectlCreate(ns, "tester.yaml") - - ginkgo.By("Getting the ingress IPs from the services") - err := wait.PollImmediate(statefulsetPoll, statefulsetTimeout, func() (bool, error) { - if t.ip = t.getServiceIP(f, ns, "test-server"); t.ip == "" { - return false, nil - } - if _, err := t.listUsers(); err != nil { - framework.Logf("Service endpoint is up but isn't responding") - return false, nil - } - return true, nil - }) - framework.ExpectNoError(err) - framework.Logf("Service endpoint is up") - - ginkgo.By("Adding 2 dummy users") - err = t.addUser("Alice") - framework.ExpectNoError(err) - err = t.addUser("Bob") - framework.ExpectNoError(err) - t.successfulWrites = 2 - - ginkgo.By("Verifying that the users exist") - users, err := t.listUsers() - framework.ExpectNoError(err) - framework.ExpectEqual(len(users), 2) -} - -func (t *EtcdUpgradeTest) listUsers() ([]string, error) { - r, err := http.Get(fmt.Sprintf("http://%s:8080/list", t.ip)) - if err != nil { - return nil, err - } - defer r.Body.Close() - if r.StatusCode != http.StatusOK { - b, err := ioutil.ReadAll(r.Body) - if err != nil { - return nil, err - } - return nil, fmt.Errorf(string(b)) - } - var names []string - if err := json.NewDecoder(r.Body).Decode(&names); err != nil { - return nil, err - } - return names, nil -} - -func (t *EtcdUpgradeTest) addUser(name string) error { - val := map[string][]string{"name": {name}} - r, err := http.PostForm(fmt.Sprintf("http://%s:8080/add", t.ip), val) - if err != nil { - return err - } - defer r.Body.Close() - if r.StatusCode != http.StatusOK { - b, err := ioutil.ReadAll(r.Body) - if err != nil { - return err - } - return fmt.Errorf(string(b)) - } - return nil -} - -func (t *EtcdUpgradeTest) getServiceIP(f *framework.Framework, ns, svcName string) string { - svc, err := f.ClientSet.CoreV1().Services(ns).Get(context.TODO(), svcName, metav1.GetOptions{}) - framework.ExpectNoError(err) - ingress := svc.Status.LoadBalancer.Ingress - if len(ingress) == 0 { - return "" - } - return ingress[0].IP -} - -// Test waits for upgrade to complete and verifies if etcd is writable. -func (t *EtcdUpgradeTest) Test(f *framework.Framework, done <-chan struct{}, upgrade UpgradeType) { - ginkgo.By("Continuously polling the database during upgrade.") - var ( - success, failures, writeAttempts, lastUserCount int - mu sync.Mutex - errors = map[string]int{} - ) - // Write loop. - go wait.Until(func() { - writeAttempts++ - if err := t.addUser(fmt.Sprintf("user-%d", writeAttempts)); err != nil { - framework.Logf("Unable to add user: %v", err) - mu.Lock() - errors[err.Error()]++ - mu.Unlock() - return - } - t.successfulWrites++ - }, 10*time.Millisecond, done) - // Read loop. - wait.Until(func() { - users, err := t.listUsers() - if err != nil { - framework.Logf("Could not retrieve users: %v", err) - failures++ - mu.Lock() - errors[err.Error()]++ - mu.Unlock() - return - } - success++ - lastUserCount = len(users) - }, 10*time.Millisecond, done) - framework.Logf("got %d users; want >=%d", lastUserCount, t.successfulWrites) - - framework.ExpectEqual(lastUserCount >= t.successfulWrites, true) - ratio := float64(success) / float64(success+failures) - framework.Logf("Successful gets %d/%d=%v", success, success+failures, ratio) - ratio = float64(t.successfulWrites) / float64(writeAttempts) - framework.Logf("Successful writes %d/%d=%v", t.successfulWrites, writeAttempts, ratio) - framework.Logf("Errors: %v", errors) - // TODO(maisem): tweak this value once we have a few test runs. - framework.ExpectEqual(ratio > 0.75, true) -} - -// Teardown does one final check of the data's availability. -func (t *EtcdUpgradeTest) Teardown(f *framework.Framework) { - users, err := t.listUsers() - framework.ExpectNoError(err) - framework.ExpectEqual(len(users) >= t.successfulWrites, true) -} diff --git a/vendor/k8s.io/kubernetes/test/e2e/upgrades/horizontal_pod_autoscalers.go b/vendor/k8s.io/kubernetes/test/e2e/upgrades/horizontal_pod_autoscalers.go deleted file mode 100644 index a47fa3424cab..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/upgrades/horizontal_pod_autoscalers.go +++ /dev/null @@ -1,99 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package upgrades - -import ( - "fmt" - "time" - - autoscalingv1 "k8s.io/api/autoscaling/v1" - "k8s.io/kubernetes/test/e2e/framework" - e2eautoscaling "k8s.io/kubernetes/test/e2e/framework/autoscaling" - - "github.com/onsi/ginkgo" -) - -// HPAUpgradeTest tests that HPA rescales target resource correctly before and after a cluster upgrade. -type HPAUpgradeTest struct { - rc *e2eautoscaling.ResourceConsumer - hpa *autoscalingv1.HorizontalPodAutoscaler -} - -// Name returns the tracking name of the test. -func (HPAUpgradeTest) Name() string { return "hpa-upgrade" } - -// Setup creates a resource consumer and an HPA object that autoscales the consumer. -func (t *HPAUpgradeTest) Setup(f *framework.Framework) { - t.rc = e2eautoscaling.NewDynamicResourceConsumer( - "res-cons-upgrade", - f.Namespace.Name, - e2eautoscaling.KindRC, - 1, /* replicas */ - 250, /* initCPUTotal */ - 0, - 0, - 500, /* cpuLimit */ - 200, /* memLimit */ - f.ClientSet, - f.ScalesGetter) - t.hpa = e2eautoscaling.CreateCPUHorizontalPodAutoscaler( - t.rc, - 20, /* targetCPUUtilizationPercent */ - 1, /* minPods */ - 5) /* maxPods */ - - t.rc.Pause() - t.test() -} - -// Test waits for upgrade to complete and verifies if HPA works correctly. -func (t *HPAUpgradeTest) Test(f *framework.Framework, done <-chan struct{}, upgrade UpgradeType) { - // Block until upgrade is done - ginkgo.By(fmt.Sprintf("Waiting for upgrade to finish before checking HPA")) - <-done - t.test() -} - -// Teardown cleans up any remaining resources. -func (t *HPAUpgradeTest) Teardown(f *framework.Framework) { - // rely on the namespace deletion to clean up everything - e2eautoscaling.DeleteHorizontalPodAutoscaler(t.rc, t.hpa.Name) - t.rc.CleanUp() -} - -func (t *HPAUpgradeTest) test() { - const timeToWait = 15 * time.Minute - t.rc.Resume() - - ginkgo.By(fmt.Sprintf("HPA scales to 1 replica: consume 10 millicores, target per pod 100 millicores, min pods 1.")) - t.rc.ConsumeCPU(10) /* millicores */ - ginkgo.By(fmt.Sprintf("HPA waits for 1 replica")) - t.rc.WaitForReplicas(1, timeToWait) - - ginkgo.By(fmt.Sprintf("HPA scales to 3 replicas: consume 250 millicores, target per pod 100 millicores.")) - t.rc.ConsumeCPU(250) /* millicores */ - ginkgo.By(fmt.Sprintf("HPA waits for 3 replicas")) - t.rc.WaitForReplicas(3, timeToWait) - - ginkgo.By(fmt.Sprintf("HPA scales to 5 replicas: consume 700 millicores, target per pod 100 millicores, max pods 5.")) - t.rc.ConsumeCPU(700) /* millicores */ - ginkgo.By(fmt.Sprintf("HPA waits for 5 replicas")) - t.rc.WaitForReplicas(5, timeToWait) - - // We need to pause background goroutines as during upgrade master is unavailable and requests issued by them fail. - t.rc.Pause() -} diff --git a/vendor/k8s.io/kubernetes/test/e2e/upgrades/kube_proxy_migration.go b/vendor/k8s.io/kubernetes/test/e2e/upgrades/network/kube_proxy_migration.go similarity index 98% rename from vendor/k8s.io/kubernetes/test/e2e/upgrades/kube_proxy_migration.go rename to vendor/k8s.io/kubernetes/test/e2e/upgrades/network/kube_proxy_migration.go index b2d154eaa2e6..85fa4fb22aff 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/upgrades/kube_proxy_migration.go +++ b/vendor/k8s.io/kubernetes/test/e2e/upgrades/network/kube_proxy_migration.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package upgrades +package network import ( "context" @@ -29,6 +29,7 @@ import ( clientset "k8s.io/client-go/kubernetes" "k8s.io/kubernetes/test/e2e/framework" e2enode "k8s.io/kubernetes/test/e2e/framework/node" + "k8s.io/kubernetes/test/e2e/upgrades" "github.com/onsi/ginkgo" ) @@ -55,7 +56,7 @@ func (t *KubeProxyUpgradeTest) Setup(f *framework.Framework) { } // Test validates if kube-proxy is migrated from static pods to DaemonSet. -func (t *KubeProxyUpgradeTest) Test(f *framework.Framework, done <-chan struct{}, upgrade UpgradeType) { +func (t *KubeProxyUpgradeTest) Test(f *framework.Framework, done <-chan struct{}, upgrade upgrades.UpgradeType) { c := f.ClientSet // Block until upgrade is done. @@ -90,7 +91,7 @@ func (t *KubeProxyDowngradeTest) Setup(f *framework.Framework) { } // Test validates if kube-proxy is migrated from DaemonSet to static pods. -func (t *KubeProxyDowngradeTest) Test(f *framework.Framework, done <-chan struct{}, upgrade UpgradeType) { +func (t *KubeProxyDowngradeTest) Test(f *framework.Framework, done <-chan struct{}, upgrade upgrades.UpgradeType) { c := f.ClientSet // Block until upgrade is done. diff --git a/vendor/k8s.io/kubernetes/test/e2e/upgrades/services.go b/vendor/k8s.io/kubernetes/test/e2e/upgrades/network/services.go similarity index 95% rename from vendor/k8s.io/kubernetes/test/e2e/upgrades/services.go rename to vendor/k8s.io/kubernetes/test/e2e/upgrades/network/services.go index 1419450aad97..79f47ee1d76e 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/upgrades/services.go +++ b/vendor/k8s.io/kubernetes/test/e2e/upgrades/network/services.go @@ -14,13 +14,14 @@ See the License for the specific language governing permissions and limitations under the License. */ -package upgrades +package network import ( v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/kubernetes/test/e2e/framework" e2eservice "k8s.io/kubernetes/test/e2e/framework/service" + "k8s.io/kubernetes/test/e2e/upgrades" "github.com/onsi/ginkgo" ) @@ -85,11 +86,11 @@ func (t *ServiceUpgradeTest) Setup(f *framework.Framework) { } // Test runs a connectivity check to the service. -func (t *ServiceUpgradeTest) Test(f *framework.Framework, done <-chan struct{}, upgrade UpgradeType) { +func (t *ServiceUpgradeTest) Test(f *framework.Framework, done <-chan struct{}, upgrade upgrades.UpgradeType) { switch upgrade { - case MasterUpgrade, ClusterUpgrade: + case upgrades.MasterUpgrade, upgrades.ClusterUpgrade: t.test(f, done, true, true) - case NodeUpgrade: + case upgrades.NodeUpgrade: // Node upgrades should test during disruption only on GCE/GKE for now. t.test(f, done, shouldTestPDBs(), false) default: diff --git a/vendor/k8s.io/kubernetes/test/e2e/upgrades/node/apparmor.go b/vendor/k8s.io/kubernetes/test/e2e/upgrades/node/apparmor.go new file mode 100644 index 000000000000..941a56b6c1d5 --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/upgrades/node/apparmor.go @@ -0,0 +1,118 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package node + +import ( + "context" + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/kubernetes/test/e2e/framework" + e2ekubectl "k8s.io/kubernetes/test/e2e/framework/kubectl" + e2esecurity "k8s.io/kubernetes/test/e2e/framework/security" + e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" + "k8s.io/kubernetes/test/e2e/upgrades" + + "github.com/onsi/ginkgo" + "github.com/onsi/gomega" + "github.com/onsi/gomega/gstruct" +) + +// AppArmorUpgradeTest tests that AppArmor profiles are enforced & usable across upgrades. +type AppArmorUpgradeTest struct { + pod *v1.Pod +} + +// Name returns the tracking name of the test. +func (AppArmorUpgradeTest) Name() string { return "apparmor-upgrade" } + +// Skip returns true when this test can be skipped. +func (AppArmorUpgradeTest) Skip(upgCtx upgrades.UpgradeContext) bool { + supportedImages := make(map[string]bool) + for _, d := range e2eskipper.AppArmorDistros { + supportedImages[d] = true + } + + for _, vCtx := range upgCtx.Versions { + if !supportedImages[vCtx.NodeImage] { + return true + } + } + return false +} + +// Setup creates a secret and then verifies that a pod can consume it. +func (t *AppArmorUpgradeTest) Setup(f *framework.Framework) { + ginkgo.By("Loading AppArmor profiles to nodes") + e2esecurity.LoadAppArmorProfiles(f.Namespace.Name, f.ClientSet) + + // Create the initial test pod. + ginkgo.By("Creating a long-running AppArmor enabled pod.") + t.pod = e2esecurity.CreateAppArmorTestPod(f.Namespace.Name, f.ClientSet, f.PodClient(), false, false) + + // Verify initial state. + t.verifyNodesAppArmorEnabled(f) + t.verifyNewPodSucceeds(f) +} + +// Test waits for the upgrade to complete, and then verifies that a +// pod can still consume the secret. +func (t *AppArmorUpgradeTest) Test(f *framework.Framework, done <-chan struct{}, upgrade upgrades.UpgradeType) { + <-done + if upgrade == upgrades.MasterUpgrade { + t.verifyPodStillUp(f) + } + t.verifyNodesAppArmorEnabled(f) + t.verifyNewPodSucceeds(f) +} + +// Teardown cleans up any remaining resources. +func (t *AppArmorUpgradeTest) Teardown(f *framework.Framework) { + // rely on the namespace deletion to clean up everything + ginkgo.By("Logging container failures") + e2ekubectl.LogFailedContainers(f.ClientSet, f.Namespace.Name, framework.Logf) +} + +func (t *AppArmorUpgradeTest) verifyPodStillUp(f *framework.Framework) { + ginkgo.By("Verifying an AppArmor profile is continuously enforced for a pod") + pod, err := f.PodClient().Get(context.TODO(), t.pod.Name, metav1.GetOptions{}) + framework.ExpectNoError(err, "Should be able to get pod") + framework.ExpectEqual(pod.Status.Phase, v1.PodRunning, "Pod should stay running") + gomega.Expect(pod.Status.ContainerStatuses[0].State.Running).NotTo(gomega.BeNil(), "Container should be running") + gomega.Expect(pod.Status.ContainerStatuses[0].RestartCount).To(gomega.BeZero(), "Container should not need to be restarted") +} + +func (t *AppArmorUpgradeTest) verifyNewPodSucceeds(f *framework.Framework) { + ginkgo.By("Verifying an AppArmor profile is enforced for a new pod") + e2esecurity.CreateAppArmorTestPod(f.Namespace.Name, f.ClientSet, f.PodClient(), false, true) +} + +func (t *AppArmorUpgradeTest) verifyNodesAppArmorEnabled(f *framework.Framework) { + ginkgo.By("Verifying nodes are AppArmor enabled") + nodes, err := f.ClientSet.CoreV1().Nodes().List(context.TODO(), metav1.ListOptions{}) + framework.ExpectNoError(err, "Failed to list nodes") + for _, node := range nodes.Items { + gomega.Expect(node.Status.Conditions).To(gstruct.MatchElements(conditionType, gstruct.IgnoreExtras, gstruct.Elements{ + "Ready": gstruct.MatchFields(gstruct.IgnoreExtras, gstruct.Fields{ + "Message": gomega.ContainSubstring("AppArmor enabled"), + }), + })) + } +} + +func conditionType(condition interface{}) string { + return string(condition.(v1.NodeCondition).Type) +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/upgrades/configmaps.go b/vendor/k8s.io/kubernetes/test/e2e/upgrades/node/configmaps.go similarity index 97% rename from vendor/k8s.io/kubernetes/test/e2e/upgrades/configmaps.go rename to vendor/k8s.io/kubernetes/test/e2e/upgrades/node/configmaps.go index e9707f0d4b43..54529b500961 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/upgrades/configmaps.go +++ b/vendor/k8s.io/kubernetes/test/e2e/upgrades/node/configmaps.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package upgrades +package node import ( "context" @@ -24,6 +24,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/uuid" "k8s.io/kubernetes/test/e2e/framework" + "k8s.io/kubernetes/test/e2e/upgrades" imageutils "k8s.io/kubernetes/test/utils/image" "github.com/onsi/ginkgo" @@ -68,7 +69,7 @@ func (t *ConfigMapUpgradeTest) Setup(f *framework.Framework) { // Test waits for the upgrade to complete, and then verifies that a // pod can still consume the ConfigMap. -func (t *ConfigMapUpgradeTest) Test(f *framework.Framework, done <-chan struct{}, upgrade UpgradeType) { +func (t *ConfigMapUpgradeTest) Test(f *framework.Framework, done <-chan struct{}, upgrade upgrades.UpgradeType) { <-done ginkgo.By("Consuming the ConfigMap after upgrade") t.testPod(f) diff --git a/vendor/k8s.io/kubernetes/test/e2e/upgrades/nvidia-gpu.go b/vendor/k8s.io/kubernetes/test/e2e/upgrades/node/nvidia-gpu.go similarity index 91% rename from vendor/k8s.io/kubernetes/test/e2e/upgrades/nvidia-gpu.go rename to vendor/k8s.io/kubernetes/test/e2e/upgrades/node/nvidia-gpu.go index cf3b8c0cda30..9f4009d9297a 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/upgrades/nvidia-gpu.go +++ b/vendor/k8s.io/kubernetes/test/e2e/upgrades/node/nvidia-gpu.go @@ -14,12 +14,13 @@ See the License for the specific language governing permissions and limitations under the License. */ -package upgrades +package node import ( "k8s.io/kubernetes/test/e2e/framework" e2ejob "k8s.io/kubernetes/test/e2e/framework/job" "k8s.io/kubernetes/test/e2e/scheduling" + "k8s.io/kubernetes/test/e2e/upgrades" "github.com/onsi/ginkgo" ) @@ -45,11 +46,11 @@ func (t *NvidiaGPUUpgradeTest) Setup(f *framework.Framework) { // Test waits for the upgrade to complete, and then verifies that the // cuda pod started by the gpu job can successfully finish. -func (t *NvidiaGPUUpgradeTest) Test(f *framework.Framework, done <-chan struct{}, upgrade UpgradeType) { +func (t *NvidiaGPUUpgradeTest) Test(f *framework.Framework, done <-chan struct{}, upgrade upgrades.UpgradeType) { <-done ginkgo.By("Verifying gpu job success") scheduling.VerifyJobNCompletions(f, completions) - if upgrade == MasterUpgrade || upgrade == ClusterUpgrade { + if upgrade == upgrades.MasterUpgrade || upgrade == upgrades.ClusterUpgrade { // MasterUpgrade should be totally hitless. job, err := e2ejob.GetJob(f.ClientSet, f.Namespace.Name, "cuda-add") framework.ExpectNoError(err) diff --git a/vendor/k8s.io/kubernetes/test/e2e/upgrades/node/secrets.go b/vendor/k8s.io/kubernetes/test/e2e/upgrades/node/secrets.go new file mode 100644 index 000000000000..f6f90fd9a252 --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/upgrades/node/secrets.go @@ -0,0 +1,151 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package node + +import ( + "context" + "fmt" + + "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/uuid" + "k8s.io/kubernetes/test/e2e/framework" + "k8s.io/kubernetes/test/e2e/upgrades" + imageutils "k8s.io/kubernetes/test/utils/image" + + "github.com/onsi/ginkgo" +) + +// SecretUpgradeTest test that a secret is available before and after +// a cluster upgrade. +type SecretUpgradeTest struct { + secret *v1.Secret +} + +// Name returns the tracking name of the test. +func (SecretUpgradeTest) Name() string { return "[sig-storage] [sig-api-machinery] secret-upgrade" } + +// Setup creates a secret and then verifies that a pod can consume it. +func (t *SecretUpgradeTest) Setup(f *framework.Framework) { + secretName := "upgrade-secret" + + ns := f.Namespace + + t.secret = &v1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: ns.Name, + Name: secretName, + }, + Data: map[string][]byte{ + "data": []byte("keep it secret"), + }, + } + + ginkgo.By("Creating a secret") + var err error + if t.secret, err = f.ClientSet.CoreV1().Secrets(ns.Name).Create(context.TODO(), t.secret, metav1.CreateOptions{}); err != nil { + framework.Failf("unable to create test secret %s: %v", t.secret.Name, err) + } + + ginkgo.By("Making sure the secret is consumable") + t.testPod(f) +} + +// Test waits for the upgrade to complete, and then verifies that a +// pod can still consume the secret. +func (t *SecretUpgradeTest) Test(f *framework.Framework, done <-chan struct{}, upgrade upgrades.UpgradeType) { + <-done + ginkgo.By("Consuming the secret after upgrade") + t.testPod(f) +} + +// Teardown cleans up any remaining resources. +func (t *SecretUpgradeTest) Teardown(f *framework.Framework) { + // rely on the namespace deletion to clean up everything +} + +// testPod creates a pod that consumes a secret and prints it out. The +// output is then verified. +func (t *SecretUpgradeTest) testPod(f *framework.Framework) { + volumeName := "secret-volume" + volumeMountPath := "/etc/secret-volume" + + pod := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pod-secrets-" + string(uuid.NewUUID()), + Namespace: t.secret.ObjectMeta.Namespace, + }, + Spec: v1.PodSpec{ + Volumes: []v1.Volume{ + { + Name: volumeName, + VolumeSource: v1.VolumeSource{ + Secret: &v1.SecretVolumeSource{ + SecretName: t.secret.ObjectMeta.Name, + }, + }, + }, + }, + Containers: []v1.Container{ + { + Name: "secret-volume-test", + Image: imageutils.GetE2EImage(imageutils.Agnhost), + Args: []string{ + "mounttest", + fmt.Sprintf("--file_content=%s/data", volumeMountPath), + fmt.Sprintf("--file_mode=%s/data", volumeMountPath), + }, + VolumeMounts: []v1.VolumeMount{ + { + Name: volumeName, + MountPath: volumeMountPath, + }, + }, + }, + { + Name: "secret-env-test", + Image: imageutils.GetE2EImage(imageutils.BusyBox), + Command: []string{"sh", "-c", "env"}, + Env: []v1.EnvVar{ + { + Name: "SECRET_DATA", + ValueFrom: &v1.EnvVarSource{ + SecretKeyRef: &v1.SecretKeySelector{ + LocalObjectReference: v1.LocalObjectReference{ + Name: t.secret.ObjectMeta.Name, + }, + Key: "data", + }, + }, + }, + }, + }, + }, + RestartPolicy: v1.RestartPolicyNever, + }, + } + + expectedOutput := []string{ + "content of file \"/etc/secret-volume/data\": keep it secret", + "mode of file \"/etc/secret-volume/data\": -rw-r--r--", + } + + f.TestContainerOutput("volume consume secrets", pod, 0, expectedOutput) + + expectedOutput = []string{"SECRET_DATA=keep it secret"} + f.TestContainerOutput("env consume secrets", pod, 1, expectedOutput) +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/upgrades/node/sysctl.go b/vendor/k8s.io/kubernetes/test/e2e/upgrades/node/sysctl.go new file mode 100644 index 000000000000..d35b09a17cc9 --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/upgrades/node/sysctl.go @@ -0,0 +1,136 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package node + +import ( + "context" + "fmt" + + "github.com/onsi/ginkgo" + + "k8s.io/api/core/v1" + apierrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/uuid" + "k8s.io/kubernetes/pkg/kubelet/sysctl" + + "k8s.io/kubernetes/test/e2e/framework" + "k8s.io/kubernetes/test/e2e/upgrades" + imageutils "k8s.io/kubernetes/test/utils/image" +) + +// SysctlUpgradeTest tests that a pod with sysctls runs before and after an upgrade. During +// a master upgrade, the exact pod is expected to stay running. A pod with unsafe sysctls is +// expected to keep failing before and after the upgrade. +type SysctlUpgradeTest struct { + validPod *v1.Pod + invalidPod *v1.Pod +} + +// Setup creates two pods: one with safe sysctls, one with unsafe sysctls. It checks that the former +// launched and the later is rejected. +func (t *SysctlUpgradeTest) Setup(f *framework.Framework) { + t.validPod = t.verifySafeSysctlWork(f) + t.invalidPod = t.verifyUnsafeSysctlsAreRejected(f) +} + +// Test waits for the upgrade to complete, and then verifies that a +// pod can still consume the ConfigMap. +func (t *SysctlUpgradeTest) Test(f *framework.Framework, done <-chan struct{}, upgrade upgrades.UpgradeType) { + <-done + switch upgrade { + case upgrades.MasterUpgrade, upgrades.ClusterUpgrade: + ginkgo.By("Checking the safe sysctl pod keeps running on master upgrade") + pod, err := f.ClientSet.CoreV1().Pods(t.validPod.Namespace).Get(context.TODO(), t.validPod.Name, metav1.GetOptions{}) + framework.ExpectNoError(err) + framework.ExpectEqual(pod.Status.Phase, v1.PodRunning) + } + + ginkgo.By("Checking the old unsafe sysctl pod was not suddenly started during an upgrade") + pod, err := f.ClientSet.CoreV1().Pods(t.invalidPod.Namespace).Get(context.TODO(), t.invalidPod.Name, metav1.GetOptions{}) + if err != nil && !apierrors.IsNotFound(err) { + framework.ExpectNoError(err) + } + if err == nil { + framework.ExpectNotEqual(pod.Status.Phase, v1.PodRunning) + } + + t.verifySafeSysctlWork(f) + t.verifyUnsafeSysctlsAreRejected(f) +} + +// Teardown cleans up any remaining resources. +func (t *SysctlUpgradeTest) Teardown(f *framework.Framework) { + // rely on the namespace deletion to clean up everything +} + +func (t *SysctlUpgradeTest) verifySafeSysctlWork(f *framework.Framework) *v1.Pod { + ginkgo.By("Creating a pod with safe sysctls") + safeSysctl := "net.ipv4.ip_local_port_range" + safeSysctlValue := "1024 1042" + sysctlTestPod("valid-sysctls", map[string]string{safeSysctl: safeSysctlValue}) + validPod := f.PodClient().Create(t.validPod) + + ginkgo.By("Making sure the valid pod launches") + _, err := f.PodClient().WaitForErrorEventOrSuccess(t.validPod) + framework.ExpectNoError(err) + f.TestContainerOutput("pod with safe sysctl launched", t.validPod, 0, []string{fmt.Sprintf("%s = %s", safeSysctl, safeSysctlValue)}) + + return validPod +} + +func (t *SysctlUpgradeTest) verifyUnsafeSysctlsAreRejected(f *framework.Framework) *v1.Pod { + ginkgo.By("Creating a pod with unsafe sysctls") + invalidPod := sysctlTestPod("valid-sysctls-"+string(uuid.NewUUID()), map[string]string{ + "fs.mount-max": "1000000", + }) + invalidPod = f.PodClient().Create(invalidPod) + + ginkgo.By("Making sure the invalid pod failed") + ev, err := f.PodClient().WaitForErrorEventOrSuccess(invalidPod) + framework.ExpectNoError(err) + framework.ExpectEqual(ev.Reason, sysctl.ForbiddenReason) + + return invalidPod +} + +func sysctlTestPod(name string, sysctls map[string]string) *v1.Pod { + sysctlList := []v1.Sysctl{} + keys := []string{} + for k, v := range sysctls { + sysctlList = append(sysctlList, v1.Sysctl{Name: k, Value: v}) + keys = append(keys, k) + } + return &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + }, + Spec: v1.PodSpec{ + Containers: []v1.Container{ + { + Name: "test-container", + Image: imageutils.GetE2EImage(imageutils.BusyBox), + Command: append([]string{"/bin/sysctl"}, keys...), + }, + }, + RestartPolicy: v1.RestartPolicyNever, + SecurityContext: &v1.PodSecurityContext{ + Sysctls: sysctlList, + }, + }, + } +} diff --git a/vendor/k8s.io/kubernetes/test/e2e/upgrades/secrets.go b/vendor/k8s.io/kubernetes/test/e2e/upgrades/secrets.go deleted file mode 100644 index 3a6d35557e74..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/upgrades/secrets.go +++ /dev/null @@ -1,150 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package upgrades - -import ( - "context" - "fmt" - - "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/uuid" - "k8s.io/kubernetes/test/e2e/framework" - imageutils "k8s.io/kubernetes/test/utils/image" - - "github.com/onsi/ginkgo" -) - -// SecretUpgradeTest test that a secret is available before and after -// a cluster upgrade. -type SecretUpgradeTest struct { - secret *v1.Secret -} - -// Name returns the tracking name of the test. -func (SecretUpgradeTest) Name() string { return "[sig-storage] [sig-api-machinery] secret-upgrade" } - -// Setup creates a secret and then verifies that a pod can consume it. -func (t *SecretUpgradeTest) Setup(f *framework.Framework) { - secretName := "upgrade-secret" - - ns := f.Namespace - - t.secret = &v1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: ns.Name, - Name: secretName, - }, - Data: map[string][]byte{ - "data": []byte("keep it secret"), - }, - } - - ginkgo.By("Creating a secret") - var err error - if t.secret, err = f.ClientSet.CoreV1().Secrets(ns.Name).Create(context.TODO(), t.secret, metav1.CreateOptions{}); err != nil { - framework.Failf("unable to create test secret %s: %v", t.secret.Name, err) - } - - ginkgo.By("Making sure the secret is consumable") - t.testPod(f) -} - -// Test waits for the upgrade to complete, and then verifies that a -// pod can still consume the secret. -func (t *SecretUpgradeTest) Test(f *framework.Framework, done <-chan struct{}, upgrade UpgradeType) { - <-done - ginkgo.By("Consuming the secret after upgrade") - t.testPod(f) -} - -// Teardown cleans up any remaining resources. -func (t *SecretUpgradeTest) Teardown(f *framework.Framework) { - // rely on the namespace deletion to clean up everything -} - -// testPod creates a pod that consumes a secret and prints it out. The -// output is then verified. -func (t *SecretUpgradeTest) testPod(f *framework.Framework) { - volumeName := "secret-volume" - volumeMountPath := "/etc/secret-volume" - - pod := &v1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - Name: "pod-secrets-" + string(uuid.NewUUID()), - Namespace: t.secret.ObjectMeta.Namespace, - }, - Spec: v1.PodSpec{ - Volumes: []v1.Volume{ - { - Name: volumeName, - VolumeSource: v1.VolumeSource{ - Secret: &v1.SecretVolumeSource{ - SecretName: t.secret.ObjectMeta.Name, - }, - }, - }, - }, - Containers: []v1.Container{ - { - Name: "secret-volume-test", - Image: imageutils.GetE2EImage(imageutils.Agnhost), - Args: []string{ - "mounttest", - fmt.Sprintf("--file_content=%s/data", volumeMountPath), - fmt.Sprintf("--file_mode=%s/data", volumeMountPath), - }, - VolumeMounts: []v1.VolumeMount{ - { - Name: volumeName, - MountPath: volumeMountPath, - }, - }, - }, - { - Name: "secret-env-test", - Image: imageutils.GetE2EImage(imageutils.BusyBox), - Command: []string{"sh", "-c", "env"}, - Env: []v1.EnvVar{ - { - Name: "SECRET_DATA", - ValueFrom: &v1.EnvVarSource{ - SecretKeyRef: &v1.SecretKeySelector{ - LocalObjectReference: v1.LocalObjectReference{ - Name: t.secret.ObjectMeta.Name, - }, - Key: "data", - }, - }, - }, - }, - }, - }, - RestartPolicy: v1.RestartPolicyNever, - }, - } - - expectedOutput := []string{ - "content of file \"/etc/secret-volume/data\": keep it secret", - "mode of file \"/etc/secret-volume/data\": -rw-r--r--", - } - - f.TestContainerOutput("volume consume secrets", pod, 0, expectedOutput) - - expectedOutput = []string{"SECRET_DATA=keep it secret"} - f.TestContainerOutput("env consume secrets", pod, 1, expectedOutput) -} diff --git a/vendor/k8s.io/kubernetes/test/e2e/upgrades/serviceaccount_admission_controller_migration.go b/vendor/k8s.io/kubernetes/test/e2e/upgrades/serviceaccount_admission_controller_migration.go deleted file mode 100644 index f53fb349da7d..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/upgrades/serviceaccount_admission_controller_migration.go +++ /dev/null @@ -1,140 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package upgrades - -import ( - "context" - "fmt" - "time" - - "github.com/onsi/ginkgo" - v1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/wait" - e2eauth "k8s.io/kubernetes/test/e2e/auth" - "k8s.io/kubernetes/test/e2e/framework" - e2epod "k8s.io/kubernetes/test/e2e/framework/pod" - imageutils "k8s.io/kubernetes/test/utils/image" -) - -const ( - podBeforeMigrationName = "pod-before-migration" - podAfterMigrationName = "pod-after-migration" -) - -// ServiceAccountAdmissionControllerMigrationTest test that a pod is functioning before and after -// a cluster upgrade. -type ServiceAccountAdmissionControllerMigrationTest struct { - pod *v1.Pod -} - -// Name returns the tracking name of the test. -func (ServiceAccountAdmissionControllerMigrationTest) Name() string { - return "[sig-auth] serviceaccount-admission-controller-migration" -} - -// Setup creates pod-before-migration which has legacy service account token. -func (t *ServiceAccountAdmissionControllerMigrationTest) Setup(f *framework.Framework) { - t.pod = createPod(f, podBeforeMigrationName) - inClusterClientMustWork(f, t.pod) -} - -// Test waits for the upgrade to complete, and then verifies pod-before-migration -// and pod-after-migration are able to make requests using in cluster config. -func (t *ServiceAccountAdmissionControllerMigrationTest) Test(f *framework.Framework, done <-chan struct{}, upgrade UpgradeType) { - ginkgo.By("Waiting for upgrade to finish") - <-done - - ginkgo.By("Starting post-upgrade check") - ginkgo.By("Checking pod-before-migration makes successful requests using in cluster config") - podBeforeMigration, err := f.ClientSet.CoreV1().Pods(f.Namespace.Name).Get(context.TODO(), podBeforeMigrationName, metav1.GetOptions{}) - framework.ExpectNoError(err) - if podBeforeMigration.GetUID() != t.pod.GetUID() { - framework.Failf("Pod %q GetUID() = %q, want %q.", podBeforeMigration.Name, podBeforeMigration.GetUID(), t.pod.GetUID()) - } - if podBeforeMigration.Status.ContainerStatuses[0].RestartCount != 0 { - framework.Failf("Pod %q RestartCount = %d, want 0.", podBeforeMigration.Name, podBeforeMigration.Status.ContainerStatuses[0].RestartCount) - } - inClusterClientMustWork(f, podBeforeMigration) - - ginkgo.By("Checking pod-after-migration makes successful requests using in cluster config") - podAfterMigration := createPod(f, podAfterMigrationName) - if len(podAfterMigration.Spec.Volumes) != 1 || podAfterMigration.Spec.Volumes[0].Projected == nil { - framework.Failf("Pod %q Volumes[0].Projected.Sources = nil, want non-nil.", podAfterMigration.Name) - } - inClusterClientMustWork(f, podAfterMigration) - - ginkgo.By("Finishing post-upgrade check") -} - -// Teardown cleans up any remaining resources. -func (t *ServiceAccountAdmissionControllerMigrationTest) Teardown(f *framework.Framework) { - // rely on the namespace deletion to clean up everything -} - -func inClusterClientMustWork(f *framework.Framework, pod *v1.Pod) { - var logs string - since := time.Now() - if err := wait.PollImmediate(15*time.Second, 5*time.Minute, func() (done bool, err error) { - framework.Logf("Polling logs") - logs, err = e2epod.GetPodLogsSince(f.ClientSet, pod.Namespace, pod.Name, "inclusterclient", since) - if err != nil { - framework.Logf("Error pulling logs: %v", err) - return false, nil - } - numTokens, err := e2eauth.ParseInClusterClientLogs(logs) - if err != nil { - framework.Logf("Error parsing inclusterclient logs: %v", err) - return false, fmt.Errorf("inclusterclient reported an error: %v", err) - } - if numTokens == 0 { - framework.Logf("No authenticated API calls found") - return false, nil - } - return true, nil - }); err != nil { - framework.Failf("Unexpected error: %v\n%s", err, logs) - } -} - -// createPod creates a pod. -func createPod(f *framework.Framework, podName string) *v1.Pod { - pod := &v1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - Name: podName, - Namespace: f.Namespace.Name, - }, - Spec: v1.PodSpec{ - Containers: []v1.Container{{ - Name: "inclusterclient", - Image: imageutils.GetE2EImage(imageutils.Agnhost), - Args: []string{"inclusterclient", "--poll-interval=5"}, - }}, - RestartPolicy: v1.RestartPolicyNever, - }, - } - - createdPod, err := f.ClientSet.CoreV1().Pods(f.Namespace.Name).Create(context.TODO(), pod, metav1.CreateOptions{}) - framework.ExpectNoError(err) - framework.Logf("Created pod %s", podName) - - if !e2epod.CheckPodsRunningReady(f.ClientSet, f.Namespace.Name, []string{pod.Name}, time.Minute) { - framework.Failf("Pod %q/%q never became ready", createdPod.Namespace, createdPod.Name) - } - - return createdPod -} diff --git a/vendor/k8s.io/kubernetes/test/e2e/upgrades/sysctl.go b/vendor/k8s.io/kubernetes/test/e2e/upgrades/sysctl.go deleted file mode 100644 index 55e0ee689943..000000000000 --- a/vendor/k8s.io/kubernetes/test/e2e/upgrades/sysctl.go +++ /dev/null @@ -1,135 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package upgrades - -import ( - "context" - "fmt" - - "github.com/onsi/ginkgo" - - "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/uuid" - "k8s.io/kubernetes/pkg/kubelet/sysctl" - - "k8s.io/kubernetes/test/e2e/framework" - imageutils "k8s.io/kubernetes/test/utils/image" -) - -// SysctlUpgradeTest tests that a pod with sysctls runs before and after an upgrade. During -// a master upgrade, the exact pod is expected to stay running. A pod with unsafe sysctls is -// expected to keep failing before and after the upgrade. -type SysctlUpgradeTest struct { - validPod *v1.Pod - invalidPod *v1.Pod -} - -// Setup creates two pods: one with safe sysctls, one with unsafe sysctls. It checks that the former -// launched and the later is rejected. -func (t *SysctlUpgradeTest) Setup(f *framework.Framework) { - t.validPod = t.verifySafeSysctlWork(f) - t.invalidPod = t.verifyUnsafeSysctlsAreRejected(f) -} - -// Test waits for the upgrade to complete, and then verifies that a -// pod can still consume the ConfigMap. -func (t *SysctlUpgradeTest) Test(f *framework.Framework, done <-chan struct{}, upgrade UpgradeType) { - <-done - switch upgrade { - case MasterUpgrade, ClusterUpgrade: - ginkgo.By("Checking the safe sysctl pod keeps running on master upgrade") - pod, err := f.ClientSet.CoreV1().Pods(t.validPod.Namespace).Get(context.TODO(), t.validPod.Name, metav1.GetOptions{}) - framework.ExpectNoError(err) - framework.ExpectEqual(pod.Status.Phase, v1.PodRunning) - } - - ginkgo.By("Checking the old unsafe sysctl pod was not suddenly started during an upgrade") - pod, err := f.ClientSet.CoreV1().Pods(t.invalidPod.Namespace).Get(context.TODO(), t.invalidPod.Name, metav1.GetOptions{}) - if err != nil && !apierrors.IsNotFound(err) { - framework.ExpectNoError(err) - } - if err == nil { - framework.ExpectNotEqual(pod.Status.Phase, v1.PodRunning) - } - - t.verifySafeSysctlWork(f) - t.verifyUnsafeSysctlsAreRejected(f) -} - -// Teardown cleans up any remaining resources. -func (t *SysctlUpgradeTest) Teardown(f *framework.Framework) { - // rely on the namespace deletion to clean up everything -} - -func (t *SysctlUpgradeTest) verifySafeSysctlWork(f *framework.Framework) *v1.Pod { - ginkgo.By("Creating a pod with safe sysctls") - safeSysctl := "net.ipv4.ip_local_port_range" - safeSysctlValue := "1024 1042" - sysctlTestPod("valid-sysctls", map[string]string{safeSysctl: safeSysctlValue}) - validPod := f.PodClient().Create(t.validPod) - - ginkgo.By("Making sure the valid pod launches") - _, err := f.PodClient().WaitForErrorEventOrSuccess(t.validPod) - framework.ExpectNoError(err) - f.TestContainerOutput("pod with safe sysctl launched", t.validPod, 0, []string{fmt.Sprintf("%s = %s", safeSysctl, safeSysctlValue)}) - - return validPod -} - -func (t *SysctlUpgradeTest) verifyUnsafeSysctlsAreRejected(f *framework.Framework) *v1.Pod { - ginkgo.By("Creating a pod with unsafe sysctls") - invalidPod := sysctlTestPod("valid-sysctls-"+string(uuid.NewUUID()), map[string]string{ - "fs.mount-max": "1000000", - }) - invalidPod = f.PodClient().Create(invalidPod) - - ginkgo.By("Making sure the invalid pod failed") - ev, err := f.PodClient().WaitForErrorEventOrSuccess(invalidPod) - framework.ExpectNoError(err) - framework.ExpectEqual(ev.Reason, sysctl.ForbiddenReason) - - return invalidPod -} - -func sysctlTestPod(name string, sysctls map[string]string) *v1.Pod { - sysctlList := []v1.Sysctl{} - keys := []string{} - for k, v := range sysctls { - sysctlList = append(sysctlList, v1.Sysctl{Name: k, Value: v}) - keys = append(keys, k) - } - return &v1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - }, - Spec: v1.PodSpec{ - Containers: []v1.Container{ - { - Name: "test-container", - Image: imageutils.GetE2EImage(imageutils.BusyBox), - Command: append([]string{"/bin/sysctl"}, keys...), - }, - }, - RestartPolicy: v1.RestartPolicyNever, - SecurityContext: &v1.PodSecurityContext{ - Sysctls: sysctlList, - }, - }, - } -} diff --git a/vendor/k8s.io/kubernetes/test/e2e/upgrades/upgrade_suite.go b/vendor/k8s.io/kubernetes/test/e2e/upgrades/upgrade_suite.go new file mode 100644 index 000000000000..89f1a9068423 --- /dev/null +++ b/vendor/k8s.io/kubernetes/test/e2e/upgrades/upgrade_suite.go @@ -0,0 +1,151 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package upgrades + +import ( + "encoding/xml" + "fmt" + "os" + "path/filepath" + "regexp" + "strings" + "sync" + "time" + + "k8s.io/kubernetes/test/e2e/chaosmonkey" + "k8s.io/kubernetes/test/e2e/framework" + e2eginkgowrapper "k8s.io/kubernetes/test/e2e/framework/ginkgowrapper" + e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" + "k8s.io/kubernetes/test/utils/junit" + + "github.com/onsi/ginkgo" +) + +type chaosMonkeyAdapter struct { + test Test + testReport *junit.TestCase + framework *framework.Framework + upgradeType UpgradeType + upgCtx UpgradeContext +} + +func (cma *chaosMonkeyAdapter) Test(sem *chaosmonkey.Semaphore) { + start := time.Now() + var once sync.Once + ready := func() { + once.Do(func() { + sem.Ready() + }) + } + defer FinalizeUpgradeTest(start, cma.testReport) + defer ready() + if skippable, ok := cma.test.(Skippable); ok && skippable.Skip(cma.upgCtx) { + ginkgo.By("skipping test " + cma.test.Name()) + cma.testReport.Skipped = "skipping test " + cma.test.Name() + return + } + + defer cma.test.Teardown(cma.framework) + cma.test.Setup(cma.framework) + ready() + cma.test.Test(cma.framework, sem.StopCh, cma.upgradeType) +} + +// FinalizeUpgradeTest fills the necessary information about junit.TestCase. +func FinalizeUpgradeTest(start time.Time, tc *junit.TestCase) { + tc.Time = time.Since(start).Seconds() + r := recover() + if r == nil { + return + } + + switch r := r.(type) { + case e2eginkgowrapper.FailurePanic: + tc.Failures = []*junit.Failure{ + { + Message: r.Message, + Type: "Failure", + Value: fmt.Sprintf("%s\n\n%s", r.Message, r.FullStackTrace), + }, + } + case e2eskipper.SkipPanic: + tc.Skipped = fmt.Sprintf("%s:%d %q", r.Filename, r.Line, r.Message) + default: + tc.Errors = []*junit.Error{ + { + Message: fmt.Sprintf("%v", r), + Type: "Panic", + Value: fmt.Sprintf("%v", r), + }, + } + } +} + +func createUpgradeFrameworks(tests []Test) map[string]*framework.Framework { + nsFilter := regexp.MustCompile("[^[:word:]-]+") // match anything that's not a word character or hyphen + testFrameworks := map[string]*framework.Framework{} + for _, t := range tests { + ns := nsFilter.ReplaceAllString(t.Name(), "-") // and replace with a single hyphen + ns = strings.Trim(ns, "-") + testFrameworks[t.Name()] = framework.NewDefaultFramework(ns) + } + return testFrameworks +} + +// RunUpgradeSuite runs the actual upgrade tests. +func RunUpgradeSuite( + upgCtx *UpgradeContext, + tests []Test, + testSuite *junit.TestSuite, + upgradeType UpgradeType, + upgradeFunc func(), +) { + testFrameworks := createUpgradeFrameworks(tests) + + cm := chaosmonkey.New(upgradeFunc) + for _, t := range tests { + testCase := &junit.TestCase{ + Name: t.Name(), + Classname: "upgrade_tests", + } + testSuite.TestCases = append(testSuite.TestCases, testCase) + cma := chaosMonkeyAdapter{ + test: t, + testReport: testCase, + framework: testFrameworks[t.Name()], + upgradeType: upgradeType, + upgCtx: *upgCtx, + } + cm.Register(cma.Test) + } + + start := time.Now() + defer func() { + testSuite.Update() + testSuite.Time = time.Since(start).Seconds() + if framework.TestContext.ReportDir != "" { + fname := filepath.Join(framework.TestContext.ReportDir, fmt.Sprintf("junit_%supgrades.xml", framework.TestContext.ReportPrefix)) + f, err := os.Create(fname) + if err != nil { + return + } + defer f.Close() + xml.NewEncoder(f).Encode(testSuite) + } + }() + cm.Do() +} diff --git a/vendor/k8s.io/kubernetes/test/integration/.import-restrictions b/vendor/k8s.io/kubernetes/test/integration/.import-restrictions index 7cfc199c2f9d..e246ff685009 100644 --- a/vendor/k8s.io/kubernetes/test/integration/.import-restrictions +++ b/vendor/k8s.io/kubernetes/test/integration/.import-restrictions @@ -1,7 +1,7 @@ -rules: - # Discourage import of k8s.io/kubernetes/test/e2e - - selectorRegexp: k8s[.]io/kubernetes/test/e2e - # TODO: import-boss --include-test-files is catching these; drive to zero - allowedPrefixes: - # test/integration/auth/bootstraptoken_test.go is using this - - k8s.io/kubernetes/test/e2e/lifecycle/bootstrap +rules: + # Discourage import of k8s.io/kubernetes/test/e2e + - selectorRegexp: k8s[.]io/kubernetes/test/e2e + # TODO: import-boss --include-test-files is catching these; drive to zero + allowedPrefixes: + # test/integration/auth/bootstraptoken_test.go is using this + - k8s.io/kubernetes/test/e2e/lifecycle/bootstrap diff --git a/vendor/k8s.io/kubernetes/test/integration/BUILD b/vendor/k8s.io/kubernetes/test/integration/BUILD deleted file mode 100644 index 2b77bb78b94a..000000000000 --- a/vendor/k8s.io/kubernetes/test/integration/BUILD +++ /dev/null @@ -1,90 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "utils.go", - ], - importpath = "k8s.io/kubernetes/test/integration", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/storagebackend:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//vendor/go.etcd.io/etcd/clientv3:go_default_library", - "//vendor/go.etcd.io/etcd/pkg/transport:go_default_library", - "//vendor/google.golang.org/grpc:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//test/integration/apimachinery:all-srcs", - "//test/integration/apiserver:all-srcs", - "//test/integration/auth:all-srcs", - "//test/integration/benchmark/extractlog:all-srcs", - "//test/integration/benchmark/jsonify:all-srcs", - "//test/integration/certificates:all-srcs", - "//test/integration/client:all-srcs", - "//test/integration/configmap:all-srcs", - "//test/integration/cronjob:all-srcs", - "//test/integration/daemonset:all-srcs", - "//test/integration/defaulttolerationseconds:all-srcs", - "//test/integration/deployment:all-srcs", - "//test/integration/disruption:all-srcs", - "//test/integration/dryrun:all-srcs", - "//test/integration/dualstack:all-srcs", - "//test/integration/endpoints:all-srcs", - "//test/integration/endpointslice:all-srcs", - "//test/integration/etcd:all-srcs", - "//test/integration/events:all-srcs", - "//test/integration/evictions:all-srcs", - "//test/integration/examples:all-srcs", - "//test/integration/framework:all-srcs", - "//test/integration/garbagecollector:all-srcs", - "//test/integration/ipamperf:all-srcs", - "//test/integration/kubelet:all-srcs", - "//test/integration/master:all-srcs", - "//test/integration/metrics:all-srcs", - "//test/integration/namespace:all-srcs", - "//test/integration/node:all-srcs", - "//test/integration/objectmeta:all-srcs", - "//test/integration/openshift:all-srcs", - "//test/integration/pods:all-srcs", - "//test/integration/quota:all-srcs", - "//test/integration/replicaset:all-srcs", - "//test/integration/replicationcontroller:all-srcs", - "//test/integration/scale:all-srcs", - "//test/integration/scheduler:all-srcs", - "//test/integration/scheduler_perf:all-srcs", - "//test/integration/secrets:all-srcs", - "//test/integration/serviceaccount:all-srcs", - "//test/integration/serving:all-srcs", - "//test/integration/statefulset:all-srcs", - "//test/integration/storageclasses:all-srcs", - "//test/integration/storageversion:all-srcs", - "//test/integration/tls:all-srcs", - "//test/integration/ttlcontroller:all-srcs", - "//test/integration/util:all-srcs", - "//test/integration/volume:all-srcs", - "//test/integration/volumescheduling:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/test/integration/benchmark-controller.json b/vendor/k8s.io/kubernetes/test/integration/benchmark-controller.json index c0c1a901d0c1..48b2e573f249 100644 --- a/vendor/k8s.io/kubernetes/test/integration/benchmark-controller.json +++ b/vendor/k8s.io/kubernetes/test/integration/benchmark-controller.json @@ -17,7 +17,7 @@ "spec": { "containers": [{ "name": "test-container", - "image": "k8s.gcr.io/pause:3.2" + "image": "k8s.gcr.io/pause:3.4.1" }] } } diff --git a/vendor/k8s.io/kubernetes/test/integration/etcd/BUILD b/vendor/k8s.io/kubernetes/test/integration/etcd/BUILD deleted file mode 100644 index 1825b20d3259..000000000000 --- a/vendor/k8s.io/kubernetes/test/integration/etcd/BUILD +++ /dev/null @@ -1,90 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_test( - name = "go_default_test", - size = "large", - srcs = [ - "crd_overlap_storage_test.go", - "etcd_cross_group_test.go", - "etcd_storage_path_test.go", - "main_test.go", - ], - embed = [":go_default_library"], - tags = [ - "etcd", - "integration", - ], - deps = [ - "//cmd/kube-apiserver/app/options:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/controller/finalizer:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/dynamic:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1:go_default_library", - "//staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/typed/apiregistration/v1:go_default_library", - "//test/integration/framework:go_default_library", - "//vendor/go.etcd.io/etcd/clientv3:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_library( - name = "go_default_library", - srcs = [ - "data.go", - "server.go", - ], - importpath = "k8s.io/kubernetes/test/integration/etcd", - deps = [ - "//cmd/kube-apiserver/app:go_default_library", - "//cmd/kube-apiserver/app/options:go_default_library", - "//pkg/controlplane:go_default_library", - "//pkg/features:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/options:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/discovery/cached/memory:go_default_library", - "//staging/src/k8s.io/client-go/dynamic:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/restmapper:go_default_library", - "//test/integration:go_default_library", - "//test/integration/framework:go_default_library", - "//vendor/go.etcd.io/etcd/clientv3:go_default_library", - "//vendor/go.etcd.io/etcd/clientv3/concurrency:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/test/integration/etcd/data.go b/vendor/k8s.io/kubernetes/test/integration/etcd/data.go index ab97ed072779..9b1813bd6602 100644 --- a/vendor/k8s.io/kubernetes/test/integration/etcd/data.go +++ b/vendor/k8s.io/kubernetes/test/integration/etcd/data.go @@ -17,13 +17,11 @@ limitations under the License. package etcd import ( - apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" + apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" + "k8s.io/apiextensions-apiserver/test/integration/fixtures" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime/schema" - utilfeature "k8s.io/apiserver/pkg/util/feature" - "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/test/utils/image" - "k8s.io/utils/pointer" ) // GetEtcdStorageData returns etcd data for all persisted objects. @@ -154,6 +152,13 @@ func GetEtcdStorageDataForNamespace(namespace string) map[schema.GroupVersionRes Stub: `{"metadata": {"name": "job1"}, "spec": {"manualSelector": true, "selector": {"matchLabels": {"controller-uid": "uid1"}}, "template": {"metadata": {"labels": {"controller-uid": "uid1"}}, "spec": {"containers": [{"image": "` + image + `", "name": "container1"}], "dnsPolicy": "ClusterFirst", "restartPolicy": "Never"}}}}`, ExpectedEtcdPath: "/registry/jobs/" + namespace + "/job1", }, + gvr("batch", "v1", "cronjobs"): { + Stub: `{"metadata": {"name": "cjv1"}, "spec": {"jobTemplate": {"spec": {"template": {"metadata": {"labels": {"controller-uid": "uid0"}}, "spec": {"containers": [{"image": "` + image + `", "name": "container0"}], "dnsPolicy": "ClusterFirst", "restartPolicy": "Never"}}}}, "schedule": "* * * * *"}}`, + ExpectedEtcdPath: "/registry/cronjobs/" + namespace + "/cjv1", + // TODO (soltysh): in 1.22 this should be switched to v1. See https://github.com/kubernetes/kubernetes/pull/98965 + // this has to stay at v1beta1 for a release, otherwise a 1.20 API server won't be able to read the data persisted in etcd and will break during a multi-server upgrade + ExpectedGVK: gvkP("batch", "v1beta1", "CronJob"), + }, // -- // k8s.io/kubernetes/pkg/apis/batch/v1beta1 @@ -163,18 +168,11 @@ func GetEtcdStorageDataForNamespace(namespace string) map[schema.GroupVersionRes }, // -- - // k8s.io/kubernetes/pkg/apis/batch/v2alpha1 - gvr("batch", "v2alpha1", "cronjobs"): { - Stub: `{"metadata": {"name": "cjv2alpha1"}, "spec": {"jobTemplate": {"spec": {"template": {"metadata": {"labels": {"controller-uid": "uid0"}}, "spec": {"containers": [{"image": "` + image + `", "name": "container0"}], "dnsPolicy": "ClusterFirst", "restartPolicy": "Never"}}}}, "schedule": "* * * * *"}}`, - ExpectedEtcdPath: "/registry/cronjobs/" + namespace + "/cjv2alpha1", - ExpectedGVK: gvkP("batch", "v1beta1", "CronJob"), - }, - // -- - // k8s.io/kubernetes/pkg/apis/certificates/v1beta1 gvr("certificates.k8s.io", "v1beta1", "certificatesigningrequests"): { Stub: `{"metadata": {"name": "csr1"}, "spec": {"request": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQnlqQ0NBVE1DQVFBd2dZa3hDekFKQmdOVkJBWVRBbFZUTVJNd0VRWURWUVFJRXdwRFlXeHBabTl5Ym1saApNUll3RkFZRFZRUUhFdzFOYjNWdWRHRnBiaUJXYVdWM01STXdFUVlEVlFRS0V3cEhiMjluYkdVZ1NXNWpNUjh3CkhRWURWUVFMRXhaSmJtWnZjbTFoZEdsdmJpQlVaV05vYm05c2IyZDVNUmN3RlFZRFZRUURFdzUzZDNjdVoyOXYKWjJ4bExtTnZiVENCbnpBTkJna3Foa2lHOXcwQkFRRUZBQU9CalFBd2dZa0NnWUVBcFp0WUpDSEo0VnBWWEhmVgpJbHN0UVRsTzRxQzAzaGpYK1prUHl2ZFlkMVE0K3FiQWVUd1htQ1VLWUhUaFZSZDVhWFNxbFB6eUlCd2llTVpyCldGbFJRZGRaMUl6WEFsVlJEV3dBbzYwS2VjcWVBWG5uVUsrNWZYb1RJL1VnV3NocmU4dEoreC9UTUhhUUtSL0oKY0lXUGhxYVFoc0p1elpidkFkR0E4MEJMeGRNQ0F3RUFBYUFBTUEwR0NTcUdTSWIzRFFFQkJRVUFBNEdCQUlobAo0UHZGcStlN2lwQVJnSTVaTStHWng2bXBDejQ0RFRvMEprd2ZSRGYrQnRyc2FDMHE2OGVUZjJYaFlPc3E0ZmtIClEwdUEwYVZvZzNmNWlKeENhM0hwNWd4YkpRNnpWNmtKMFRFc3VhYU9oRWtvOXNkcENvUE9uUkJtMmkvWFJEMkQKNmlOaDhmOHowU2hHc0ZxakRnRkh5RjNvK2xVeWorVUM2SDFRVzdibgotLS0tLUVORCBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0="}}`, ExpectedEtcdPath: "/registry/certificatesigningrequests/csr1", + ExpectedGVK: gvkP("certificates.k8s.io", "v1", "CertificateSigningRequest"), }, // -- @@ -182,7 +180,6 @@ func GetEtcdStorageDataForNamespace(namespace string) map[schema.GroupVersionRes gvr("certificates.k8s.io", "v1", "certificatesigningrequests"): { Stub: `{"metadata": {"name": "csr2"}, "spec": {"signerName":"example.com/signer", "usages":["any"], "request": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQnlqQ0NBVE1DQVFBd2dZa3hDekFKQmdOVkJBWVRBbFZUTVJNd0VRWURWUVFJRXdwRFlXeHBabTl5Ym1saApNUll3RkFZRFZRUUhFdzFOYjNWdWRHRnBiaUJXYVdWM01STXdFUVlEVlFRS0V3cEhiMjluYkdVZ1NXNWpNUjh3CkhRWURWUVFMRXhaSmJtWnZjbTFoZEdsdmJpQlVaV05vYm05c2IyZDVNUmN3RlFZRFZRUURFdzUzZDNjdVoyOXYKWjJ4bExtTnZiVENCbnpBTkJna3Foa2lHOXcwQkFRRUZBQU9CalFBd2dZa0NnWUVBcFp0WUpDSEo0VnBWWEhmVgpJbHN0UVRsTzRxQzAzaGpYK1prUHl2ZFlkMVE0K3FiQWVUd1htQ1VLWUhUaFZSZDVhWFNxbFB6eUlCd2llTVpyCldGbFJRZGRaMUl6WEFsVlJEV3dBbzYwS2VjcWVBWG5uVUsrNWZYb1RJL1VnV3NocmU4dEoreC9UTUhhUUtSL0oKY0lXUGhxYVFoc0p1elpidkFkR0E4MEJMeGRNQ0F3RUFBYUFBTUEwR0NTcUdTSWIzRFFFQkJRVUFBNEdCQUlobAo0UHZGcStlN2lwQVJnSTVaTStHWng2bXBDejQ0RFRvMEprd2ZSRGYrQnRyc2FDMHE2OGVUZjJYaFlPc3E0ZmtIClEwdUEwYVZvZzNmNWlKeENhM0hwNWd4YkpRNnpWNmtKMFRFc3VhYU9oRWtvOXNkcENvUE9uUkJtMmkvWFJEMkQKNmlOaDhmOHowU2hHc0ZxakRnRkh5RjNvK2xVeWorVUM2SDFRVzdibgotLS0tLUVORCBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0="}}`, ExpectedEtcdPath: "/registry/certificatesigningrequests/csr2", - ExpectedGVK: gvkP("certificates.k8s.io", "v1beta1", "CertificateSigningRequest"), }, // -- @@ -190,7 +187,6 @@ func GetEtcdStorageDataForNamespace(namespace string) map[schema.GroupVersionRes gvr("coordination.k8s.io", "v1", "leases"): { Stub: `{"metadata": {"name": "leasev1"}, "spec": {"holderIdentity": "holder", "leaseDurationSeconds": 5}}`, ExpectedEtcdPath: "/registry/leases/" + namespace + "/leasev1", - ExpectedGVK: gvkP("coordination.k8s.io", "v1beta1", "Lease"), }, // -- @@ -198,6 +194,15 @@ func GetEtcdStorageDataForNamespace(namespace string) map[schema.GroupVersionRes gvr("coordination.k8s.io", "v1beta1", "leases"): { Stub: `{"metadata": {"name": "leasev1beta1"}, "spec": {"holderIdentity": "holder", "leaseDurationSeconds": 5}}`, ExpectedEtcdPath: "/registry/leases/" + namespace + "/leasev1beta1", + ExpectedGVK: gvkP("coordination.k8s.io", "v1", "Lease"), + }, + // -- + + // k8s.io/kubernetes/pkg/apis/discovery/v1 + gvr("discovery.k8s.io", "v1", "endpointslices"): { + Stub: `{"metadata": {"name": "slicev1"}, "addressType": "IPv4", "protocol": "TCP", "ports": [], "endpoints": []}`, + ExpectedEtcdPath: "/registry/endpointslices/" + namespace + "/slicev1", + ExpectedGVK: gvkP("discovery.k8s.io", "v1beta1", "EndpointSlice"), }, // -- @@ -228,7 +233,7 @@ func GetEtcdStorageDataForNamespace(namespace string) map[schema.GroupVersionRes gvr("extensions", "v1beta1", "ingresses"): { Stub: `{"metadata": {"name": "ingress1"}, "spec": {"backend": {"serviceName": "service", "servicePort": 5000}}}`, ExpectedEtcdPath: "/registry/ingress/" + namespace + "/ingress1", - ExpectedGVK: gvkP("networking.k8s.io", "v1beta1", "Ingress"), + ExpectedGVK: gvkP("networking.k8s.io", "v1", "Ingress"), }, // -- @@ -236,10 +241,12 @@ func GetEtcdStorageDataForNamespace(namespace string) map[schema.GroupVersionRes gvr("networking.k8s.io", "v1beta1", "ingresses"): { Stub: `{"metadata": {"name": "ingress2"}, "spec": {"backend": {"serviceName": "service", "servicePort": 5000}}}`, ExpectedEtcdPath: "/registry/ingress/" + namespace + "/ingress2", + ExpectedGVK: gvkP("networking.k8s.io", "v1", "Ingress"), }, gvr("networking.k8s.io", "v1beta1", "ingressclasses"): { Stub: `{"metadata": {"name": "ingressclass2"}, "spec": {"controller": "example.com/controller"}}`, ExpectedEtcdPath: "/registry/ingressclasses/ingressclass2", + ExpectedGVK: gvkP("networking.k8s.io", "v1", "IngressClass"), }, // -- @@ -247,12 +254,10 @@ func GetEtcdStorageDataForNamespace(namespace string) map[schema.GroupVersionRes gvr("networking.k8s.io", "v1", "ingresses"): { Stub: `{"metadata": {"name": "ingress3"}, "spec": {"defaultBackend": {"service":{"name":"service", "port":{"number": 5000}}}}}`, ExpectedEtcdPath: "/registry/ingress/" + namespace + "/ingress3", - ExpectedGVK: gvkP("networking.k8s.io", "v1beta1", "Ingress"), }, gvr("networking.k8s.io", "v1", "ingressclasses"): { Stub: `{"metadata": {"name": "ingressclass3"}, "spec": {"controller": "example.com/controller"}}`, ExpectedEtcdPath: "/registry/ingressclasses/ingressclass3", - ExpectedGVK: gvkP("networking.k8s.io", "v1beta1", "IngressClass"), }, gvr("networking.k8s.io", "v1", "networkpolicies"): { Stub: `{"metadata": {"name": "np2"}, "spec": {"podSelector": {"matchLabels": {"e": "f"}}}}`, @@ -260,6 +265,14 @@ func GetEtcdStorageDataForNamespace(namespace string) map[schema.GroupVersionRes }, // -- + // k8s.io/kubernetes/pkg/apis/policy/v1 + gvr("policy", "v1", "poddisruptionbudgets"): { + Stub: `{"metadata": {"name": "pdbv1"}, "spec": {"selector": {"matchLabels": {"anokkey": "anokvalue"}}}}`, + ExpectedEtcdPath: "/registry/poddisruptionbudgets/" + namespace + "/pdbv1", + ExpectedGVK: gvkP("policy", "v1beta1", "PodDisruptionBudget"), + }, + // -- + // k8s.io/kubernetes/pkg/apis/policy/v1beta1 gvr("policy", "v1beta1", "poddisruptionbudgets"): { Stub: `{"metadata": {"name": "pdb1"}, "spec": {"selector": {"matchLabels": {"anokkey": "anokvalue"}}}}`, @@ -279,10 +292,19 @@ func GetEtcdStorageDataForNamespace(namespace string) map[schema.GroupVersionRes }, // -- + // k8s.io/kubernetes/pkg/apis/storage/v1alpha1 + gvr("storage.k8s.io", "v1alpha1", "csistoragecapacities"): { + Stub: `{"metadata": {"name": "csc-12345-1"}, "storageClassName": "sc1"}`, + ExpectedEtcdPath: "/registry/csistoragecapacities/" + namespace + "/csc-12345-1", + ExpectedGVK: gvkP("storage.k8s.io", "v1beta1", "CSIStorageCapacity"), + }, + // -- + // k8s.io/kubernetes/pkg/apis/flowcontrol/v1alpha1 gvr("flowcontrol.apiserver.k8s.io", "v1alpha1", "flowschemas"): { Stub: `{"metadata": {"name": "va1"}, "spec": {"priorityLevelConfiguration": {"name": "name1"}}}`, ExpectedEtcdPath: "/registry/flowschemas/va1", + ExpectedGVK: gvkP("flowcontrol.apiserver.k8s.io", "v1beta1", "FlowSchema"), }, // -- @@ -290,6 +312,7 @@ func GetEtcdStorageDataForNamespace(namespace string) map[schema.GroupVersionRes gvr("flowcontrol.apiserver.k8s.io", "v1alpha1", "prioritylevelconfigurations"): { Stub: `{"metadata": {"name": "conf1"}, "spec": {"type": "Limited", "limited": {"assuredConcurrencyShares":3, "limitResponse": {"type": "Reject"}}}}`, ExpectedEtcdPath: "/registry/prioritylevelconfigurations/conf1", + ExpectedGVK: gvkP("flowcontrol.apiserver.k8s.io", "v1beta1", "PriorityLevelConfiguration"), }, // -- @@ -297,7 +320,6 @@ func GetEtcdStorageDataForNamespace(namespace string) map[schema.GroupVersionRes gvr("flowcontrol.apiserver.k8s.io", "v1beta1", "flowschemas"): { Stub: `{"metadata": {"name": "va2"}, "spec": {"priorityLevelConfiguration": {"name": "name1"}}}`, ExpectedEtcdPath: "/registry/flowschemas/va2", - ExpectedGVK: gvkP("flowcontrol.apiserver.k8s.io", "v1alpha1", "FlowSchema"), }, // -- @@ -305,7 +327,6 @@ func GetEtcdStorageDataForNamespace(namespace string) map[schema.GroupVersionRes gvr("flowcontrol.apiserver.k8s.io", "v1beta1", "prioritylevelconfigurations"): { Stub: `{"metadata": {"name": "conf2"}, "spec": {"type": "Limited", "limited": {"assuredConcurrencyShares":3, "limitResponse": {"type": "Reject"}}}}`, ExpectedEtcdPath: "/registry/prioritylevelconfigurations/conf2", - ExpectedGVK: gvkP("flowcontrol.apiserver.k8s.io", "v1alpha1", "PriorityLevelConfiguration"), }, // -- @@ -332,6 +353,13 @@ func GetEtcdStorageDataForNamespace(namespace string) map[schema.GroupVersionRes }, // -- + // k8s.io/kubernetes/pkg/apis/storage/v1beta1 + gvr("storage.k8s.io", "v1beta1", "csistoragecapacities"): { + Stub: `{"metadata": {"name": "csc-12345-2"}, "storageClassName": "sc1"}`, + ExpectedEtcdPath: "/registry/csistoragecapacities/" + namespace + "/csc-12345-2", + }, + // -- + // k8s.io/kubernetes/pkg/apis/storage/v1 gvr("storage.k8s.io", "v1", "storageclasses"): { Stub: `{"metadata": {"name": "sc2"}, "provisioner": "aws"}`, @@ -408,12 +436,10 @@ func GetEtcdStorageDataForNamespace(namespace string) map[schema.GroupVersionRes gvr("admissionregistration.k8s.io", "v1", "validatingwebhookconfigurations"): { Stub: `{"metadata":{"name":"hook2","creationTimestamp":null},"webhooks":[{"name":"externaladmissionhook.k8s.io","clientConfig":{"service":{"namespace":"ns","name":"n"},"caBundle":null},"rules":[{"operations":["CREATE"],"apiGroups":["group"],"apiVersions":["version"],"resources":["resource"]}],"failurePolicy":"Ignore","sideEffects":"None","admissionReviewVersions":["v1beta1"]}]}`, ExpectedEtcdPath: "/registry/validatingwebhookconfigurations/hook2", - ExpectedGVK: gvkP("admissionregistration.k8s.io", "v1beta1", "ValidatingWebhookConfiguration"), }, gvr("admissionregistration.k8s.io", "v1", "mutatingwebhookconfigurations"): { Stub: `{"metadata":{"name":"hook2","creationTimestamp":null},"webhooks":[{"name":"externaladmissionhook.k8s.io","clientConfig":{"service":{"namespace":"ns","name":"n"},"caBundle":null},"rules":[{"operations":["CREATE"],"apiGroups":["group"],"apiVersions":["version"],"resources":["resource"]}],"failurePolicy":"Ignore","sideEffects":"None","admissionReviewVersions":["v1beta1"]}]}`, ExpectedEtcdPath: "/registry/mutatingwebhookconfigurations/hook2", - ExpectedGVK: gvkP("admissionregistration.k8s.io", "v1beta1", "MutatingWebhookConfiguration"), }, // -- @@ -421,10 +447,12 @@ func GetEtcdStorageDataForNamespace(namespace string) map[schema.GroupVersionRes gvr("admissionregistration.k8s.io", "v1beta1", "validatingwebhookconfigurations"): { Stub: `{"metadata":{"name":"hook1","creationTimestamp":null},"webhooks":[{"name":"externaladmissionhook.k8s.io","clientConfig":{"service":{"namespace":"ns","name":"n"},"caBundle":null},"rules":[{"operations":["CREATE"],"apiGroups":["group"],"apiVersions":["version"],"resources":["resource"]}],"failurePolicy":"Ignore"}]}`, ExpectedEtcdPath: "/registry/validatingwebhookconfigurations/hook1", + ExpectedGVK: gvkP("admissionregistration.k8s.io", "v1", "ValidatingWebhookConfiguration"), }, gvr("admissionregistration.k8s.io", "v1beta1", "mutatingwebhookconfigurations"): { Stub: `{"metadata":{"name":"hook1","creationTimestamp":null},"webhooks":[{"name":"externaladmissionhook.k8s.io","clientConfig":{"service":{"namespace":"ns","name":"n"},"caBundle":null},"rules":[{"operations":["CREATE"],"apiGroups":["group"],"apiVersions":["version"],"resources":["resource"]}],"failurePolicy":"Ignore"}]}`, ExpectedEtcdPath: "/registry/mutatingwebhookconfigurations/hook1", + ExpectedGVK: gvkP("admissionregistration.k8s.io", "v1", "MutatingWebhookConfiguration"), }, // -- @@ -456,6 +484,7 @@ func GetEtcdStorageDataForNamespace(namespace string) map[schema.GroupVersionRes gvr("apiregistration.k8s.io", "v1beta1", "apiservices"): { Stub: `{"metadata": {"name": "as1.foo.com"}, "spec": {"group": "foo.com", "version": "as1", "groupPriorityMinimum":100, "versionPriority":10}}`, ExpectedEtcdPath: "/registry/apiregistration.k8s.io/apiservices/as1.foo.com", + ExpectedGVK: gvkP("apiregistration.k8s.io", "v1", "APIService"), }, // -- @@ -464,7 +493,6 @@ func GetEtcdStorageDataForNamespace(namespace string) map[schema.GroupVersionRes gvr("apiregistration.k8s.io", "v1", "apiservices"): { Stub: `{"metadata": {"name": "as2.foo.com"}, "spec": {"group": "foo.com", "version": "as2", "groupPriorityMinimum":100, "versionPriority":10}}`, ExpectedEtcdPath: "/registry/apiregistration.k8s.io/apiservices/as2.foo.com", - ExpectedGVK: gvkP("apiregistration.k8s.io", "v1beta1", "APIService"), }, // -- @@ -509,7 +537,7 @@ func GetEtcdStorageDataForNamespace(namespace string) map[schema.GroupVersionRes gvr("node.k8s.io", "v1alpha1", "runtimeclasses"): { Stub: `{"metadata": {"name": "rc1"}, "spec": {"runtimeHandler": "h1"}}`, ExpectedEtcdPath: "/registry/runtimeclasses/rc1", - ExpectedGVK: gvkP("node.k8s.io", "v1beta1", "RuntimeClass"), + ExpectedGVK: gvkP("node.k8s.io", "v1", "RuntimeClass"), }, // -- @@ -517,6 +545,7 @@ func GetEtcdStorageDataForNamespace(namespace string) map[schema.GroupVersionRes gvr("node.k8s.io", "v1beta1", "runtimeclasses"): { Stub: `{"metadata": {"name": "rc2"}, "handler": "h2"}`, ExpectedEtcdPath: "/registry/runtimeclasses/rc2", + ExpectedGVK: gvkP("node.k8s.io", "v1", "RuntimeClass"), }, // -- @@ -524,9 +553,6 @@ func GetEtcdStorageDataForNamespace(namespace string) map[schema.GroupVersionRes gvr("node.k8s.io", "v1", "runtimeclasses"): { Stub: `{"metadata": {"name": "rc3"}, "handler": "h3"}`, ExpectedEtcdPath: "/registry/runtimeclasses/rc3", - // TODO (SergeyKanzhelev): in 1.21 this should be switched to v1. See https://github.com/kubernetes/kubernetes/pull/95718/files#r520967927 - // this has to stay at v1beta1 for a release, otherwise a 1.19 API server won't be able to read the data persisted in etcd and will break during a multi-server upgrade - ExpectedGVK: gvkP("node.k8s.io", "v1beta1", "RuntimeClass"), }, // -- @@ -538,20 +564,18 @@ func GetEtcdStorageDataForNamespace(namespace string) map[schema.GroupVersionRes // -- } - // add csinodes if CSINodeInfo feature gate is enabled - if utilfeature.DefaultFeatureGate.Enabled(features.CSINodeInfo) { - // k8s.io/kubernetes/pkg/apis/storage/v1beta1 - etcdStorageData[gvr("storage.k8s.io", "v1beta1", "csinodes")] = StorageData{ - Stub: `{"metadata": {"name": "csini1"}, "spec": {"drivers": [{"name": "test-driver", "nodeID": "localhost", "topologyKeys": ["company.com/zone1", "company.com/zone2"]}]}}`, - ExpectedEtcdPath: "/registry/csinodes/csini1", - ExpectedGVK: gvkP("storage.k8s.io", "v1", "CSINode"), - } + // add csinodes + // k8s.io/kubernetes/pkg/apis/storage/v1beta1 + etcdStorageData[gvr("storage.k8s.io", "v1beta1", "csinodes")] = StorageData{ + Stub: `{"metadata": {"name": "csini1"}, "spec": {"drivers": [{"name": "test-driver", "nodeID": "localhost", "topologyKeys": ["company.com/zone1", "company.com/zone2"]}]}}`, + ExpectedEtcdPath: "/registry/csinodes/csini1", + ExpectedGVK: gvkP("storage.k8s.io", "v1", "CSINode"), + } - // k8s.io/kubernetes/pkg/apis/storage/v1 - etcdStorageData[gvr("storage.k8s.io", "v1", "csinodes")] = StorageData{ - Stub: `{"metadata": {"name": "csini2"}, "spec": {"drivers": [{"name": "test-driver", "nodeID": "localhost", "topologyKeys": ["company.com/zone1", "company.com/zone2"]}]}}`, - ExpectedEtcdPath: "/registry/csinodes/csini2", - } + // k8s.io/kubernetes/pkg/apis/storage/v1 + etcdStorageData[gvr("storage.k8s.io", "v1", "csinodes")] = StorageData{ + Stub: `{"metadata": {"name": "csini2"}, "spec": {"drivers": [{"name": "test-driver", "nodeID": "localhost", "topologyKeys": ["company.com/zone1", "company.com/zone2"]}]}}`, + ExpectedEtcdPath: "/registry/csinodes/csini2", } // add csidrivers @@ -559,14 +583,13 @@ func GetEtcdStorageDataForNamespace(namespace string) map[schema.GroupVersionRes etcdStorageData[gvr("storage.k8s.io", "v1beta1", "csidrivers")] = StorageData{ Stub: `{"metadata": {"name": "csid1"}, "spec": {"attachRequired": true, "podInfoOnMount": true}}`, ExpectedEtcdPath: "/registry/csidrivers/csid1", + ExpectedGVK: gvkP("storage.k8s.io", "v1", "CSIDriver"), } // k8s.io/kubernetes/pkg/apis/storage/v1 - // TODO: Remove ExpectedGVK in next release etcdStorageData[gvr("storage.k8s.io", "v1", "csidrivers")] = StorageData{ Stub: `{"metadata": {"name": "csid2"}, "spec": {"attachRequired": true, "podInfoOnMount": true}}`, ExpectedEtcdPath: "/registry/csidrivers/csid2", - ExpectedGVK: gvkP("storage.k8s.io", "v1beta1", "CSIDriver"), } return etcdStorageData @@ -589,36 +612,61 @@ type Prerequisite struct { // GetCustomResourceDefinitionData returns the resource definitions that back the custom resources // included in GetEtcdStorageData. They should be created using CreateTestCRDs before running any tests. -func GetCustomResourceDefinitionData() []*apiextensionsv1beta1.CustomResourceDefinition { - return []*apiextensionsv1beta1.CustomResourceDefinition{ - // namespaced with legacy version field +// We can switch this to v1 CRDs based on transitive call site analysis. +// Call sites: +// 1. TestDedupOwnerReferences - beta doesn't matter +// 2. TestWebhookAdmissionWithWatchCache/TestWebhookAdmissionWithoutWatchCache - beta doesn't matter +// 3. TestApplyStatus - the version fields don't matter. Pruning isn't checked, just ownership. +// 4. TestDryRun - versions and pruning don't matter +// 5. TestStorageVersionBootstrap - versions and pruning don't matter. +// 6. TestEtcdStoragePath - beta doesn't matter +// 7. TestCrossGroupStorage - beta doesn't matter +// 8. TestOverlappingCustomResourceCustomResourceDefinition - beta doesn't matter +// 9. TestOverlappingCustomResourceAPIService - beta doesn't matter +func GetCustomResourceDefinitionData() []*apiextensionsv1.CustomResourceDefinition { + return []*apiextensionsv1.CustomResourceDefinition{ + // namespaced { ObjectMeta: metav1.ObjectMeta{ Name: "foos.cr.bar.com", }, - Spec: apiextensionsv1beta1.CustomResourceDefinitionSpec{ - Group: "cr.bar.com", - Version: "v1", - Scope: apiextensionsv1beta1.NamespaceScoped, - Names: apiextensionsv1beta1.CustomResourceDefinitionNames{ + Spec: apiextensionsv1.CustomResourceDefinitionSpec{ + Group: "cr.bar.com", + Scope: apiextensionsv1.NamespaceScoped, + Names: apiextensionsv1.CustomResourceDefinitionNames{ Plural: "foos", Kind: "Foo", }, + Versions: []apiextensionsv1.CustomResourceDefinitionVersion{ + { + Name: "v1", + Served: true, + Storage: true, + Schema: fixtures.AllowAllSchema(), + }, + }, }, }, - // cluster scoped with legacy version field + // cluster scoped { ObjectMeta: metav1.ObjectMeta{ Name: "pants.custom.fancy.com", }, - Spec: apiextensionsv1beta1.CustomResourceDefinitionSpec{ - Group: "custom.fancy.com", - Version: "v2", - Scope: apiextensionsv1beta1.ClusterScoped, - Names: apiextensionsv1beta1.CustomResourceDefinitionNames{ + Spec: apiextensionsv1.CustomResourceDefinitionSpec{ + Group: "custom.fancy.com", + Scope: apiextensionsv1.ClusterScoped, + Names: apiextensionsv1.CustomResourceDefinitionNames{ Plural: "pants", Kind: "Pant", }, + Versions: []apiextensionsv1.CustomResourceDefinitionVersion{ + { + Name: "v2", + Served: true, + Storage: true, + Schema: fixtures.AllowAllSchema(), + }, + }, }, }, // cluster scoped with legacy version field and pruning. @@ -626,25 +674,29 @@ func GetCustomResourceDefinitionData() []*apiextensionsv1beta1.CustomResourceDef ObjectMeta: metav1.ObjectMeta{ Name: "integers.random.numbers.com", }, - Spec: apiextensionsv1beta1.CustomResourceDefinitionSpec{ - Group: "random.numbers.com", - Version: "v1", - Scope: apiextensionsv1beta1.ClusterScoped, - Names: apiextensionsv1beta1.CustomResourceDefinitionNames{ + Spec: apiextensionsv1.CustomResourceDefinitionSpec{ + Group: "random.numbers.com", + Scope: apiextensionsv1.ClusterScoped, + Names: apiextensionsv1.CustomResourceDefinitionNames{ Plural: "integers", Kind: "Integer", }, - Validation: &apiextensionsv1beta1.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensionsv1beta1.JSONSchemaProps{ - Type: "object", - Properties: map[string]apiextensionsv1beta1.JSONSchemaProps{ - "value": { - Type: "number", - }, - }, + Versions: []apiextensionsv1.CustomResourceDefinitionVersion{ + { + Name: "v1", + Served: true, + Storage: true, + Schema: &apiextensionsv1.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ + Type: "object", + Properties: map[string]apiextensionsv1.JSONSchemaProps{ + "value": { + Type: "number", + }, + }, + }}, }, }, - PreserveUnknownFields: pointer.BoolPtr(false), }, }, // cluster scoped with versions field @@ -652,38 +704,57 @@ func GetCustomResourceDefinitionData() []*apiextensionsv1beta1.CustomResourceDef ObjectMeta: metav1.ObjectMeta{ Name: "pandas.awesome.bears.com", }, - Spec: apiextensionsv1beta1.CustomResourceDefinitionSpec{ + Spec: apiextensionsv1.CustomResourceDefinitionSpec{ Group: "awesome.bears.com", - Versions: []apiextensionsv1beta1.CustomResourceDefinitionVersion{ + Versions: []apiextensionsv1.CustomResourceDefinitionVersion{ { Name: "v1", Served: true, Storage: true, + Schema: fixtures.AllowAllSchema(), + Subresources: &apiextensionsv1.CustomResourceSubresources{ + Status: &apiextensionsv1.CustomResourceSubresourceStatus{}, + Scale: &apiextensionsv1.CustomResourceSubresourceScale{ + SpecReplicasPath: ".spec.replicas", + StatusReplicasPath: ".status.replicas", + LabelSelectorPath: func() *string { path := ".status.selector"; return &path }(), + }, + }, }, { Name: "v2", Served: false, Storage: false, + Schema: fixtures.AllowAllSchema(), + Subresources: &apiextensionsv1.CustomResourceSubresources{ + Status: &apiextensionsv1.CustomResourceSubresourceStatus{}, + Scale: &apiextensionsv1.CustomResourceSubresourceScale{ + SpecReplicasPath: ".spec.replicas", + StatusReplicasPath: ".status.replicas", + LabelSelectorPath: func() *string { path := ".status.selector"; return &path }(), + }, + }, }, { Name: "v3", Served: true, Storage: false, + Schema: fixtures.AllowAllSchema(), + Subresources: &apiextensionsv1.CustomResourceSubresources{ + Status: &apiextensionsv1.CustomResourceSubresourceStatus{}, + Scale: &apiextensionsv1.CustomResourceSubresourceScale{ + SpecReplicasPath: ".spec.replicas", + StatusReplicasPath: ".status.replicas", + LabelSelectorPath: func() *string { path := ".status.selector"; return &path }(), + }, + }, }, }, - Scope: apiextensionsv1beta1.ClusterScoped, - Names: apiextensionsv1beta1.CustomResourceDefinitionNames{ + Scope: apiextensionsv1.ClusterScoped, + Names: apiextensionsv1.CustomResourceDefinitionNames{ Plural: "pandas", Kind: "Panda", }, - Subresources: &apiextensionsv1beta1.CustomResourceSubresources{ - Status: &apiextensionsv1beta1.CustomResourceSubresourceStatus{}, - Scale: &apiextensionsv1beta1.CustomResourceSubresourceScale{ - SpecReplicasPath: ".spec.replicas", - StatusReplicasPath: ".status.replicas", - LabelSelectorPath: func() *string { path := ".status.selector"; return &path }(), - }, - }, }, }, } @@ -696,3 +767,7 @@ func gvr(g, v, r string) schema.GroupVersionResource { func gvkP(g, v, k string) *schema.GroupVersionKind { return &schema.GroupVersionKind{Group: g, Version: v, Kind: k} } + +func gvk(g, v, k string) schema.GroupVersionKind { + return schema.GroupVersionKind{Group: g, Version: v, Kind: k} +} diff --git a/vendor/k8s.io/kubernetes/test/integration/etcd/server.go b/vendor/k8s.io/kubernetes/test/integration/etcd/server.go index 9d4fd38d634f..cd9b544f8ee1 100644 --- a/vendor/k8s.io/kubernetes/test/integration/etcd/server.go +++ b/vendor/k8s.io/kubernetes/test/integration/etcd/server.go @@ -30,7 +30,7 @@ import ( "go.etcd.io/etcd/clientv3" "go.etcd.io/etcd/clientv3/concurrency" - apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" + apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" apiextensionsclientset "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset" "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -122,6 +122,9 @@ func StartRealMasterOrDie(t *testing.T, configFuncs ...func(*options.ServerRunOp kubeClientConfig.QPS = 99999 kubeClientConfig.Burst = 9999 + // we make requests to all resources, don't log warnings about deprecated ones + restclient.SetDefaultWarningHandler(restclient.NoWarnings{}) + kubeClient := clientset.NewForConfigOrDie(kubeClientConfig) go func() { @@ -303,14 +306,14 @@ func JSONToUnstructured(stub, namespace string, mapping *meta.RESTMapping, dynam // CreateTestCRDs creates the given CRDs, any failure causes the test to Fatal. // If skipCrdExistsInDiscovery is true, the CRDs are only checked for the Established condition via their Status. // If skipCrdExistsInDiscovery is false, the CRDs are checked via discovery, see CrdExistsInDiscovery. -func CreateTestCRDs(t *testing.T, client apiextensionsclientset.Interface, skipCrdExistsInDiscovery bool, crds ...*apiextensionsv1beta1.CustomResourceDefinition) { +func CreateTestCRDs(t *testing.T, client apiextensionsclientset.Interface, skipCrdExistsInDiscovery bool, crds ...*apiextensionsv1.CustomResourceDefinition) { for _, crd := range crds { createTestCRD(t, client, skipCrdExistsInDiscovery, crd) } } -func createTestCRD(t *testing.T, client apiextensionsclientset.Interface, skipCrdExistsInDiscovery bool, crd *apiextensionsv1beta1.CustomResourceDefinition) { - if _, err := client.ApiextensionsV1beta1().CustomResourceDefinitions().Create(context.TODO(), crd, metav1.CreateOptions{}); err != nil { +func createTestCRD(t *testing.T, client apiextensionsclientset.Interface, skipCrdExistsInDiscovery bool, crd *apiextensionsv1.CustomResourceDefinition) { + if _, err := client.ApiextensionsV1().CustomResourceDefinitions().Create(context.TODO(), crd, metav1.CreateOptions{}); err != nil { t.Fatalf("Failed to create %s CRD; %v", crd.Name, err) } if skipCrdExistsInDiscovery { @@ -328,14 +331,14 @@ func createTestCRD(t *testing.T, client apiextensionsclientset.Interface, skipCr func waitForEstablishedCRD(client apiextensionsclientset.Interface, name string) error { return wait.PollImmediate(500*time.Millisecond, wait.ForeverTestTimeout, func() (bool, error) { - crd, err := client.ApiextensionsV1beta1().CustomResourceDefinitions().Get(context.TODO(), name, metav1.GetOptions{}) + crd, err := client.ApiextensionsV1().CustomResourceDefinitions().Get(context.TODO(), name, metav1.GetOptions{}) if err != nil { return false, err } for _, cond := range crd.Status.Conditions { switch cond.Type { - case apiextensionsv1beta1.Established: - if cond.Status == apiextensionsv1beta1.ConditionTrue { + case apiextensionsv1.Established: + if cond.Status == apiextensionsv1.ConditionTrue { return true, nil } } @@ -345,11 +348,8 @@ func waitForEstablishedCRD(client apiextensionsclientset.Interface, name string) } // CrdExistsInDiscovery checks to see if the given CRD exists in discovery at all served versions. -func CrdExistsInDiscovery(client apiextensionsclientset.Interface, crd *apiextensionsv1beta1.CustomResourceDefinition) bool { +func CrdExistsInDiscovery(client apiextensionsclientset.Interface, crd *apiextensionsv1.CustomResourceDefinition) bool { var versions []string - if len(crd.Spec.Version) != 0 { - versions = append(versions, crd.Spec.Version) - } for _, v := range crd.Spec.Versions { if v.Served { versions = append(versions, v.Name) @@ -363,7 +363,7 @@ func CrdExistsInDiscovery(client apiextensionsclientset.Interface, crd *apiexten return true } -func crdVersionExistsInDiscovery(client apiextensionsclientset.Interface, crd *apiextensionsv1beta1.CustomResourceDefinition, version string) bool { +func crdVersionExistsInDiscovery(client apiextensionsclientset.Interface, crd *apiextensionsv1.CustomResourceDefinition, version string) bool { resourceList, err := client.Discovery().ServerResourcesForGroupVersion(crd.Spec.Group + "/" + version) if err != nil { return false diff --git a/vendor/k8s.io/kubernetes/test/integration/framework/BUILD b/vendor/k8s.io/kubernetes/test/integration/framework/BUILD deleted file mode 100644 index 486199c747ea..000000000000 --- a/vendor/k8s.io/kubernetes/test/integration/framework/BUILD +++ /dev/null @@ -1,97 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) -load("//build:platforms.bzl", "go_platform_constraint") - -go_library( - name = "go_default_library", - srcs = [ - "etcd.go", - "master_utils.go", - "perf_utils.go", - "serializer.go", - "test_server.go", - "util.go", - ], - data = select({ - go_platform_constraint( - arch = "arm64", - os = "linux", - ): [ - "@com_coreos_etcd_arm64//:etcd", - ], - go_platform_constraint( - arch = "ppc64le", - os = "linux", - ): [ - "@com_coreos_etcd_ppc64le//:etcd", - ], - "//conditions:default": [ - "@com_coreos_etcd_amd64//:etcd", - ], - }), - importpath = "k8s.io/kubernetes/test/integration/framework", - deps = [ - "//cmd/kube-apiserver/app:go_default_library", - "//cmd/kube-apiserver/app/options:go_default_library", - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/core/v1/helper:go_default_library", - "//pkg/controller/nodelifecycle:go_default_library", - "//pkg/controlplane:go_default_library", - "//pkg/generated/openapi:go_default_library", - "//pkg/kubeapiserver:go_default_library", - "//pkg/kubelet/client:go_default_library", - "//pkg/util/env:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/versioning:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/authenticatorfactory:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/request/union:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/authorizerfactory:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/authorization/union:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/endpoints/openapi:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/features:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/options:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/server/storage:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/storagebackend:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/util/cert:go_default_library", - "//staging/src/k8s.io/component-base/version:go_default_library", - "//test/utils:go_default_library", - "//vendor/github.com/go-openapi/spec:go_default_library", - "//vendor/github.com/google/uuid:go_default_library", - "//vendor/go.etcd.io/etcd/clientv3:go_default_library", - "//vendor/google.golang.org/grpc/grpclog:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/common:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/test/integration/framework/etcd.go b/vendor/k8s.io/kubernetes/test/integration/framework/etcd.go index 4be970e21b30..983c512f990c 100644 --- a/vendor/k8s.io/kubernetes/test/integration/framework/etcd.go +++ b/vendor/k8s.io/kubernetes/test/integration/framework/etcd.go @@ -23,7 +23,6 @@ import ( "net" "os" "os/exec" - "path/filepath" "runtime" "strings" "time" @@ -47,12 +46,6 @@ You can use 'hack/install-etcd.sh' to install a copy in third_party/. // getEtcdPath returns a path to an etcd executable. func getEtcdPath() (string, error) { - bazelPath := filepath.Join(os.Getenv("RUNFILES_DIR"), fmt.Sprintf("com_coreos_etcd_%s", runtime.GOARCH), "etcd") - - p, err := exec.LookPath(bazelPath) - if err == nil { - return p, nil - } return exec.LookPath("etcd") } @@ -100,7 +93,7 @@ func RunCustomEtcd(dataDir string, customFlags []string) (url string, stopFn fun // TODO: Check for valid etcd version. etcdPath, err := getEtcdPath() if err != nil { - fmt.Fprintf(os.Stderr, installEtcd) + fmt.Fprint(os.Stderr, installEtcd) return "", nil, fmt.Errorf("could not find etcd in PATH: %v", err) } etcdPort, err := getAvailablePort() diff --git a/vendor/k8s.io/kubernetes/test/integration/framework/test_server.go b/vendor/k8s.io/kubernetes/test/integration/framework/test_server.go index fcd3d1698777..af2395885aef 100644 --- a/vendor/k8s.io/kubernetes/test/integration/framework/test_server.go +++ b/vendor/k8s.io/kubernetes/test/integration/framework/test_server.go @@ -127,7 +127,7 @@ func StartTestServer(t *testing.T, stopCh <-chan struct{}, setup TestServerSetup } go func() { if err := kubeAPIServer.GenericAPIServer.PrepareRun().Run(stopCh); err != nil { - t.Fatal(err) + t.Error(err) } }() diff --git a/vendor/k8s.io/kubernetes/test/integration/framework/util.go b/vendor/k8s.io/kubernetes/test/integration/framework/util.go index d5ffc81e91c1..7b2087e652cb 100644 --- a/vendor/k8s.io/kubernetes/test/integration/framework/util.go +++ b/vendor/k8s.io/kubernetes/test/integration/framework/util.go @@ -31,8 +31,8 @@ import ( "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/util/wait" clientset "k8s.io/client-go/kubernetes" + v1helper "k8s.io/component-helpers/scheduling/corev1" "k8s.io/klog/v2" - v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper" nodectlr "k8s.io/kubernetes/pkg/controller/nodelifecycle" ) @@ -266,7 +266,8 @@ func isNodeUntainted(node *v1.Node) bool { n = nodeCopy } - return v1helper.TolerationsTolerateTaintsWithFilter(fakePod.Spec.Tolerations, n.Spec.Taints, func(t *v1.Taint) bool { + _, untolerated := v1helper.FindMatchingUntoleratedTaint(n.Spec.Taints, fakePod.Spec.Tolerations, func(t *v1.Taint) bool { return t.Effect == v1.TaintEffectNoExecute || t.Effect == v1.TaintEffectNoSchedule }) + return !untolerated } diff --git a/vendor/k8s.io/kubernetes/test/utils/BUILD b/vendor/k8s.io/kubernetes/test/utils/BUILD deleted file mode 100644 index 86f4cce1ae98..000000000000 --- a/vendor/k8s.io/kubernetes/test/utils/BUILD +++ /dev/null @@ -1,89 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "admission_webhook.go", - "audit.go", - "conditions.go", - "create_resources.go", - "delete_resources.go", - "density_utils.go", - "deployment.go", - "node.go", - "paths.go", - "pki_helpers.go", - "pod_store.go", - "replicaset.go", - "runners.go", - "tmpdir.go", - "update_resources.go", - ], - importpath = "k8s.io/kubernetes/test/utils", - deps = [ - "//pkg/api/v1/pod:go_default_library", - "//pkg/apis/apps:go_default_library", - "//pkg/apis/batch:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/extensions:go_default_library", - "//pkg/controller/deployment/util:go_default_library", - "//pkg/util/labels:go_default_library", - "//staging/src/k8s.io/api/admission/v1beta1:go_default_library", - "//staging/src/k8s.io/api/apps/v1:go_default_library", - "//staging/src/k8s.io/api/batch/v1:go_default_library", - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/storage/v1:go_default_library", - "//staging/src/k8s.io/api/storage/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/json:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/mutating:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/apis/audit:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/audit:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/scale:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/util/cert:go_default_library", - "//staging/src/k8s.io/client-go/util/workqueue:go_default_library", - "//staging/src/k8s.io/kubectl/pkg/scale:go_default_library", - "//vendor/github.com/davecgh/go-spew/spew:go_default_library", - "//vendor/github.com/pkg/errors:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//test/utils/crd:all-srcs", - "//test/utils/harness:all-srcs", - "//test/utils/image:all-srcs", - "//test/utils/junit:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/test/utils/crd/BUILD b/vendor/k8s.io/kubernetes/test/utils/crd/BUILD deleted file mode 100644 index 668152f22c50..000000000000 --- a/vendor/k8s.io/kubernetes/test/utils/crd/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["crd_util.go"], - importpath = "k8s.io/kubernetes/test/utils/crd", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/test/integration/fixtures:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/client-go/dynamic:go_default_library", - "//test/e2e/framework:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/test/utils/crd/crd_util.go b/vendor/k8s.io/kubernetes/test/utils/crd/crd_util.go index 445c9852c261..e51df2d696f1 100644 --- a/vendor/k8s.io/kubernetes/test/utils/crd/crd_util.go +++ b/vendor/k8s.io/kubernetes/test/utils/crd/crd_util.go @@ -89,12 +89,7 @@ func CreateMultiVersionTestCRD(f *framework.Framework, group string, opts ...Opt Served: true, Storage: true, Name: "v1", - Schema: &apiextensionsv1.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{ - XPreserveUnknownFields: pointer.BoolPtr(true), - Type: "object", - }, - }, + Schema: fixtures.AllowAllSchema(), }} } diff --git a/vendor/k8s.io/kubernetes/test/utils/image/BUILD b/vendor/k8s.io/kubernetes/test/utils/image/BUILD deleted file mode 100644 index f07ee05fc191..000000000000 --- a/vendor/k8s.io/kubernetes/test/utils/image/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["manifest.go"], - importpath = "k8s.io/kubernetes/test/utils/image", - deps = [ - "//vendor/gopkg.in/yaml.v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["manifest_test.go"], - embed = [":go_default_library"], -) diff --git a/vendor/k8s.io/kubernetes/test/utils/image/OWNERS b/vendor/k8s.io/kubernetes/test/utils/image/OWNERS index 6f2c11b955b0..1afba53d816b 100644 --- a/vendor/k8s.io/kubernetes/test/utils/image/OWNERS +++ b/vendor/k8s.io/kubernetes/test/utils/image/OWNERS @@ -4,10 +4,10 @@ reviewers: - justaugustus - luxas - mkumatag - - listx + - dims approvers: - luxas - mkumatag - - listx + - dims emeritus_approvers: - ixdy diff --git a/vendor/k8s.io/kubernetes/test/utils/image/manifest.go b/vendor/k8s.io/kubernetes/test/utils/image/manifest.go index 269d4eb2665b..3c43843d4827 100644 --- a/vendor/k8s.io/kubernetes/test/utils/image/manifest.go +++ b/vendor/k8s.io/kubernetes/test/utils/image/manifest.go @@ -31,18 +31,17 @@ import ( // RegistryList holds public and private image registries type RegistryList struct { GcAuthenticatedRegistry string `yaml:"gcAuthenticatedRegistry"` - DockerLibraryRegistry string `yaml:"dockerLibraryRegistry"` - DockerGluster string `yaml:"dockerGluster"` E2eRegistry string `yaml:"e2eRegistry"` - E2eVolumeRegistry string `yaml:"e2eVolumeRegistry"` PromoterE2eRegistry string `yaml:"promoterE2eRegistry"` BuildImageRegistry string `yaml:"buildImageRegistry"` InvalidRegistry string `yaml:"invalidRegistry"` + GcEtcdRegistry string `yaml:"gcEtcdRegistry"` GcRegistry string `yaml:"gcRegistry"` SigStorageRegistry string `yaml:"sigStorageRegistry"` GcrReleaseRegistry string `yaml:"gcrReleaseRegistry"` PrivateRegistry string `yaml:"privateRegistry"` SampleRegistry string `yaml:"sampleRegistry"` + MicrosoftRegistry string `yaml:"microsoftRegistry"` } // Config holds an images registry, name, and version @@ -70,18 +69,17 @@ func (i *Config) SetVersion(version string) { func initReg() RegistryList { registry := RegistryList{ GcAuthenticatedRegistry: "gcr.io/authenticated-image-pulling", - DockerLibraryRegistry: "docker.io/library", - DockerGluster: "docker.io/gluster", E2eRegistry: "gcr.io/kubernetes-e2e-test-images", - E2eVolumeRegistry: "gcr.io/kubernetes-e2e-test-images/volume", PromoterE2eRegistry: "k8s.gcr.io/e2e-test-images", BuildImageRegistry: "k8s.gcr.io/build-image", InvalidRegistry: "invalid.com/invalid", + GcEtcdRegistry: "k8s.gcr.io", GcRegistry: "k8s.gcr.io", SigStorageRegistry: "k8s.gcr.io/sig-storage", - GcrReleaseRegistry: "gcr.io/gke-release", PrivateRegistry: "gcr.io/k8s-authenticated-test", SampleRegistry: "gcr.io/google-samples", + GcrReleaseRegistry: "gcr.io/gke-release", + MicrosoftRegistry: "mcr.microsoft.com", } repoList := os.Getenv("KUBE_TEST_REPO_LIST") if repoList == "" { @@ -101,23 +99,25 @@ func initReg() RegistryList { } var ( - registry = initReg() - dockerLibraryRegistry = registry.DockerLibraryRegistry - dockerGluster = registry.DockerGluster + registry = initReg() + + // PrivateRegistry is an image repository that requires authentication + PrivateRegistry = registry.PrivateRegistry + + // Preconfigured image configs + dockerLibraryRegistry = "docker.io/library" e2eRegistry = registry.E2eRegistry - e2eVolumeRegistry = registry.E2eVolumeRegistry promoterE2eRegistry = registry.PromoterE2eRegistry buildImageRegistry = registry.BuildImageRegistry gcAuthenticatedRegistry = registry.GcAuthenticatedRegistry + gcEtcdRegistry = registry.GcEtcdRegistry gcRegistry = registry.GcRegistry sigStorageRegistry = registry.SigStorageRegistry gcrReleaseRegistry = registry.GcrReleaseRegistry invalidRegistry = registry.InvalidRegistry - // PrivateRegistry is an image repository that requires authentication - PrivateRegistry = registry.PrivateRegistry - sampleRegistry = registry.SampleRegistry + sampleRegistry = registry.SampleRegistry + microsoftRegistry = registry.MicrosoftRegistry - // Preconfigured image configs imageConfigs, originalImageConfigs = initImageConfigs() ) @@ -172,6 +172,12 @@ const ( Nginx // NginxNew image NginxNew + // NodePerfNpbEp image + NodePerfNpbEp + // NodePerfNpbIs image + NodePerfNpbIs + // NodePerfTfWideDeep image + NodePerfTfWideDeep // Nonewprivs image Nonewprivs // NonRoot runs with a default user of 1234 @@ -201,49 +207,55 @@ const ( VolumeGlusterServer // VolumeRBDServer image VolumeRBDServer + // WindowsServer image + WindowsServer ) func initImageConfigs() (map[int]Config, map[int]Config) { configs := map[int]Config{} - configs[Agnhost] = Config{promoterE2eRegistry, "agnhost", "2.21"} + configs[Agnhost] = Config{promoterE2eRegistry, "agnhost", "2.30"} configs[AgnhostPrivate] = Config{PrivateRegistry, "agnhost", "2.6"} configs[AuthenticatedAlpine] = Config{gcAuthenticatedRegistry, "alpine", "3.7"} configs[AuthenticatedWindowsNanoServer] = Config{gcAuthenticatedRegistry, "windows-nanoserver", "v1"} - configs[APIServer] = Config{e2eRegistry, "sample-apiserver", "1.17"} - configs[AppArmorLoader] = Config{e2eRegistry, "apparmor-loader", "1.0"} - configs[BusyBox] = Config{dockerLibraryRegistry, "busybox", "1.29"} - configs[CheckMetadataConcealment] = Config{e2eRegistry, "metadata-concealment", "1.2"} + configs[APIServer] = Config{promoterE2eRegistry, "sample-apiserver", "1.17.4"} + configs[AppArmorLoader] = Config{promoterE2eRegistry, "apparmor-loader", "1.3"} + configs[BusyBox] = Config{promoterE2eRegistry, "busybox", "1.29-1"} + configs[CheckMetadataConcealment] = Config{promoterE2eRegistry, "metadata-concealment", "1.6"} configs[CudaVectorAdd] = Config{e2eRegistry, "cuda-vector-add", "1.0"} - configs[CudaVectorAdd2] = Config{e2eRegistry, "cuda-vector-add", "2.0"} - configs[DebianIptables] = Config{buildImageRegistry, "debian-iptables", "buster-v1.3.0"} - configs[EchoServer] = Config{e2eRegistry, "echoserver", "2.2"} - configs[Etcd] = Config{gcRegistry, "etcd", "3.4.13-0"} - configs[GlusterDynamicProvisioner] = Config{dockerGluster, "glusterdynamic-provisioner", "v1.0"} - configs[Httpd] = Config{dockerLibraryRegistry, "httpd", "2.4.38-alpine"} - configs[HttpdNew] = Config{dockerLibraryRegistry, "httpd", "2.4.39-alpine"} + configs[CudaVectorAdd2] = Config{promoterE2eRegistry, "cuda-vector-add", "2.2"} + configs[DebianIptables] = Config{buildImageRegistry, "debian-iptables", "buster-v1.5.0"} + configs[EchoServer] = Config{promoterE2eRegistry, "echoserver", "2.3"} + configs[Etcd] = Config{gcEtcdRegistry, "etcd", "3.4.13-0"} + configs[GlusterDynamicProvisioner] = Config{promoterE2eRegistry, "glusterdynamic-provisioner", "v1.0"} + configs[Httpd] = Config{promoterE2eRegistry, "httpd", "2.4.38-1"} + configs[HttpdNew] = Config{promoterE2eRegistry, "httpd", "2.4.39-1"} configs[InvalidRegistryImage] = Config{invalidRegistry, "alpine", "3.1"} - configs[IpcUtils] = Config{e2eRegistry, "ipc-utils", "1.0"} - configs[JessieDnsutils] = Config{e2eRegistry, "jessie-dnsutils", "1.0"} - configs[Kitten] = Config{e2eRegistry, "kitten", "1.0"} - configs[Nautilus] = Config{e2eRegistry, "nautilus", "1.0"} + configs[IpcUtils] = Config{promoterE2eRegistry, "ipc-utils", "1.2"} + configs[JessieDnsutils] = Config{promoterE2eRegistry, "jessie-dnsutils", "1.4"} + configs[Kitten] = Config{promoterE2eRegistry, "kitten", "1.4"} + configs[Nautilus] = Config{promoterE2eRegistry, "nautilus", "1.4"} configs[NFSProvisioner] = Config{sigStorageRegistry, "nfs-provisioner", "v2.2.2"} - configs[Nginx] = Config{dockerLibraryRegistry, "nginx", "1.14-alpine"} - configs[NginxNew] = Config{dockerLibraryRegistry, "nginx", "1.15-alpine"} - configs[Nonewprivs] = Config{e2eRegistry, "nonewprivs", "1.0"} - configs[NonRoot] = Config{e2eRegistry, "nonroot", "1.0"} + configs[Nginx] = Config{promoterE2eRegistry, "nginx", "1.14-1"} + configs[NginxNew] = Config{promoterE2eRegistry, "nginx", "1.15-1"} + configs[NodePerfNpbEp] = Config{promoterE2eRegistry, "node-perf/npb-ep", "1.1"} + configs[NodePerfNpbIs] = Config{promoterE2eRegistry, "node-perf/npb-is", "1.1"} + configs[NodePerfTfWideDeep] = Config{promoterE2eRegistry, "node-perf/tf-wide-deep", "1.1"} + configs[Nonewprivs] = Config{promoterE2eRegistry, "nonewprivs", "1.3"} + configs[NonRoot] = Config{promoterE2eRegistry, "nonroot", "1.1"} // Pause - when these values are updated, also update cmd/kubelet/app/options/container_runtime.go - configs[Pause] = Config{gcRegistry, "pause", "3.2"} - configs[Perl] = Config{dockerLibraryRegistry, "perl", "5.26"} + configs[Pause] = Config{gcRegistry, "pause", "3.4.1"} + configs[Perl] = Config{promoterE2eRegistry, "perl", "5.26"} configs[PrometheusDummyExporter] = Config{gcRegistry, "prometheus-dummy-exporter", "v0.1.0"} configs[PrometheusToSd] = Config{gcRegistry, "prometheus-to-sd", "v0.5.0"} - configs[Redis] = Config{dockerLibraryRegistry, "redis", "5.0.5-alpine"} - configs[RegressionIssue74839] = Config{e2eRegistry, "regression-issue-74839-amd64", "1.0"} - configs[ResourceConsumer] = Config{e2eRegistry, "resource-consumer", "1.5"} + configs[Redis] = Config{promoterE2eRegistry, "redis", "5.0.5-alpine"} + configs[RegressionIssue74839] = Config{promoterE2eRegistry, "regression-issue-74839", "1.2"} + configs[ResourceConsumer] = Config{promoterE2eRegistry, "resource-consumer", "1.9"} configs[SdDummyExporter] = Config{gcRegistry, "sd-dummy-exporter", "v0.2.0"} - configs[VolumeNFSServer] = Config{e2eVolumeRegistry, "nfs", "1.0"} - configs[VolumeISCSIServer] = Config{e2eVolumeRegistry, "iscsi", "2.0"} - configs[VolumeGlusterServer] = Config{e2eVolumeRegistry, "gluster", "1.0"} - configs[VolumeRBDServer] = Config{e2eVolumeRegistry, "rbd", "1.0.1"} + configs[VolumeNFSServer] = Config{promoterE2eRegistry, "volume/nfs", "1.2"} + configs[VolumeISCSIServer] = Config{promoterE2eRegistry, "volume/iscsi", "2.2"} + configs[VolumeGlusterServer] = Config{promoterE2eRegistry, "volume/gluster", "1.2"} + configs[VolumeRBDServer] = Config{promoterE2eRegistry, "volume/rbd", "1.0.3"} + configs[WindowsServer] = Config{microsoftRegistry, "windows", "1809"} // if requested, map all the SHAs into a known format based on the input originalImageConfigs := configs @@ -255,8 +267,7 @@ func initImageConfigs() (map[int]Config, map[int]Config) { } // GetMappedImageConfigs returns the images if they were mapped to the provided -// image repository. This method is public to allow tooling to convert these configs -// to an arbitrary repo. +// image repository. func GetMappedImageConfigs(originalImageConfigs map[int]Config, repo string) map[int]Config { configs := make(map[int]Config) for i, config := range originalImageConfigs { @@ -272,7 +283,7 @@ func GetMappedImageConfigs(originalImageConfigs map[int]Config, repo string) map // Build a new tag with a the index, a hash of the image spec (to be unique) and // shorten and make the pull spec "safe" so it will fit in the tag - configs[i] = mapConfigToRepos(i, config, repo) + configs[i] = getRepositoryMappedConfig(i, config, repo) } return configs } @@ -282,35 +293,24 @@ var ( reDashes = regexp.MustCompile(`-+`) ) -// mapConfigToRepos maps an existing image to the provided repo, generating a +// getRepositoryMappedConfig maps an existing image to the provided repo, generating a // tag that is unique with the input config. The tag will contain the index, a hash of // the image spec (to be unique) and shorten and make the pull spec "safe" so it will // fit in the tag to allow a human to recognize the value. If index is -1, then no // index will be added to the tag. -func mapConfigToRepos(index int, config Config, repo string) Config { +func getRepositoryMappedConfig(index int, config Config, repo string) Config { parts := strings.SplitN(repo, "/", 2) registry, name := parts[0], parts[1] pullSpec := config.GetE2EImage() - const ( - // length of hash in base64-url chosen to minimize possible collisions (64^16 possible) - hashLength = 16 - // maximum length of a Docker spec image tag - maxTagLength = 127 - // when building a tag, there are at most 6 characters in the format (e2e and 3 dashes), - // and we should allow up to 10 digits for the index and additional qualifiers we may add - // in the future - tagFormatCharacters = 6 + 10 - ) - h := sha256.New() h.Write([]byte(pullSpec)) - hash := base64.RawURLEncoding.EncodeToString(h.Sum(nil))[:hashLength] + hash := base64.RawURLEncoding.EncodeToString(h.Sum(nil))[:16] shortName := reCharSafe.ReplaceAllLiteralString(pullSpec, "-") shortName = reDashes.ReplaceAllLiteralString(shortName, "-") - maxLength := maxTagLength - hashLength - tagFormatCharacters + maxLength := 127 - 16 - 6 - 10 if len(shortName) > maxLength { shortName = shortName[len(shortName)-maxLength:] } @@ -328,9 +328,7 @@ func mapConfigToRepos(index int, config Config, repo string) Config { } } -// GetOriginalImageConfigs returns the configuration before any mapping rules. This -// method is public to allow tooling gain access to the default values for images regardless -// of environment variable being set. +// GetOriginalImageConfigs returns the configuration before any mapping rules. func GetOriginalImageConfigs() map[int]Config { return originalImageConfigs } @@ -375,7 +373,10 @@ func ReplaceRegistryInImageURL(imageURL string) (string, error) { } } last := strings.SplitN(parts[countParts-1], ":", 2) - config := mapConfigToRepos(index, Config{ + if len(last) == 1 { + return "", fmt.Errorf("image %q is required to be in an image:tag format", imageURL) + } + config := getRepositoryMappedConfig(index, Config{ registry: parts[0], name: strings.Join([]string{strings.Join(parts[1:countParts-1], "/"), last[0]}, "/"), version: last[1], @@ -386,8 +387,8 @@ func ReplaceRegistryInImageURL(imageURL string) (string, error) { switch registryAndUser { case "gcr.io/kubernetes-e2e-test-images": registryAndUser = e2eRegistry - case "gcr.io/kubernetes-e2e-test-images/volume": - registryAndUser = e2eVolumeRegistry + case "k8s.gcr.io/e2e-test-images": + registryAndUser = promoterE2eRegistry case "k8s.gcr.io": registryAndUser = gcRegistry case "k8s.gcr.io/sig-storage": diff --git a/vendor/k8s.io/kubernetes/test/utils/junit/BUILD b/vendor/k8s.io/kubernetes/test/utils/junit/BUILD deleted file mode 100644 index 07d236f2b560..000000000000 --- a/vendor/k8s.io/kubernetes/test/utils/junit/BUILD +++ /dev/null @@ -1,25 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["junit.go"], - importpath = "k8s.io/kubernetes/test/utils/junit", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/test/utils/runners.go b/vendor/k8s.io/kubernetes/test/utils/runners.go index 89a3102f6e6c..b5d83b82cba2 100644 --- a/vendor/k8s.io/kubernetes/test/utils/runners.go +++ b/vendor/k8s.io/kubernetes/test/utils/runners.go @@ -28,7 +28,7 @@ import ( apps "k8s.io/api/apps/v1" batch "k8s.io/api/batch/v1" v1 "k8s.io/api/core/v1" - storage "k8s.io/api/storage/v1" + storagev1 "k8s.io/api/storage/v1" storagev1beta1 "k8s.io/api/storage/v1beta1" apiequality "k8s.io/apimachinery/pkg/api/equality" apierrors "k8s.io/apimachinery/pkg/api/errors" @@ -1017,14 +1017,14 @@ type NodeAllocatableStrategy struct { // Node.status.allocatable to fill to all nodes. NodeAllocatable map[v1.ResourceName]string // Map -> VolumeNodeResources to fill into csiNode.spec.drivers[]. - CsiNodeAllocatable map[string]*storagev1beta1.VolumeNodeResources + CsiNodeAllocatable map[string]*storagev1.VolumeNodeResources // List of in-tree volume plugins migrated to CSI. MigratedPlugins []string } var _ PrepareNodeStrategy = &NodeAllocatableStrategy{} -func NewNodeAllocatableStrategy(nodeAllocatable map[v1.ResourceName]string, csiNodeAllocatable map[string]*storagev1beta1.VolumeNodeResources, migratedPlugins []string) *NodeAllocatableStrategy { +func NewNodeAllocatableStrategy(nodeAllocatable map[v1.ResourceName]string, csiNodeAllocatable map[string]*storagev1.VolumeNodeResources, migratedPlugins []string) *NodeAllocatableStrategy { return &NodeAllocatableStrategy{ NodeAllocatable: nodeAllocatable, CsiNodeAllocatable: csiNodeAllocatable, @@ -1063,20 +1063,20 @@ func (s *NodeAllocatableStrategy) CleanupNode(node *v1.Node) *v1.Node { } func (s *NodeAllocatableStrategy) createCSINode(nodeName string, client clientset.Interface) error { - csiNode := &storagev1beta1.CSINode{ + csiNode := &storagev1.CSINode{ ObjectMeta: metav1.ObjectMeta{ Name: nodeName, Annotations: map[string]string{ v1.MigratedPluginsAnnotationKey: strings.Join(s.MigratedPlugins, ","), }, }, - Spec: storagev1beta1.CSINodeSpec{ - Drivers: []storagev1beta1.CSINodeDriver{}, + Spec: storagev1.CSINodeSpec{ + Drivers: []storagev1.CSINodeDriver{}, }, } for driver, allocatable := range s.CsiNodeAllocatable { - d := storagev1beta1.CSINodeDriver{ + d := storagev1.CSINodeDriver{ Name: driver, Allocatable: allocatable, NodeID: nodeName, @@ -1084,7 +1084,7 @@ func (s *NodeAllocatableStrategy) createCSINode(nodeName string, client clientse csiNode.Spec.Drivers = append(csiNode.Spec.Drivers, d) } - _, err := client.StorageV1beta1().CSINodes().Create(context.TODO(), csiNode, metav1.CreateOptions{}) + _, err := client.StorageV1().CSINodes().Create(context.TODO(), csiNode, metav1.CreateOptions{}) if apierrors.IsAlreadyExists(err) { // Something created CSINode instance after we checked it did not exist. // Make the caller to re-try PrepareDependentObjects by returning Conflict error @@ -1093,7 +1093,7 @@ func (s *NodeAllocatableStrategy) createCSINode(nodeName string, client clientse return err } -func (s *NodeAllocatableStrategy) updateCSINode(csiNode *storagev1beta1.CSINode, client clientset.Interface) error { +func (s *NodeAllocatableStrategy) updateCSINode(csiNode *storagev1.CSINode, client clientset.Interface) error { for driverName, allocatable := range s.CsiNodeAllocatable { found := false for i, driver := range csiNode.Spec.Drivers { @@ -1104,7 +1104,7 @@ func (s *NodeAllocatableStrategy) updateCSINode(csiNode *storagev1beta1.CSINode, } } if !found { - d := storagev1beta1.CSINodeDriver{ + d := storagev1.CSINodeDriver{ Name: driverName, Allocatable: allocatable, } @@ -1114,12 +1114,12 @@ func (s *NodeAllocatableStrategy) updateCSINode(csiNode *storagev1beta1.CSINode, } csiNode.Annotations[v1.MigratedPluginsAnnotationKey] = strings.Join(s.MigratedPlugins, ",") - _, err := client.StorageV1beta1().CSINodes().Update(context.TODO(), csiNode, metav1.UpdateOptions{}) + _, err := client.StorageV1().CSINodes().Update(context.TODO(), csiNode, metav1.UpdateOptions{}) return err } func (s *NodeAllocatableStrategy) PrepareDependentObjects(node *v1.Node, client clientset.Interface) error { - csiNode, err := client.StorageV1beta1().CSINodes().Get(context.TODO(), node.Name, metav1.GetOptions{}) + csiNode, err := client.StorageV1().CSINodes().Get(context.TODO(), node.Name, metav1.GetOptions{}) if err != nil { if apierrors.IsNotFound(err) { return s.createCSINode(node.Name, client) @@ -1130,7 +1130,7 @@ func (s *NodeAllocatableStrategy) PrepareDependentObjects(node *v1.Node, client } func (s *NodeAllocatableStrategy) CleanupDependentObjects(nodeName string, client clientset.Interface) error { - csiNode, err := client.StorageV1beta1().CSINodes().Get(context.TODO(), nodeName, metav1.GetOptions{}) + csiNode, err := client.StorageV1().CSINodes().Get(context.TODO(), nodeName, metav1.GetOptions{}) if err != nil { if apierrors.IsNotFound(err) { return nil @@ -1303,7 +1303,7 @@ func MakePodSpec() v1.PodSpec { return v1.PodSpec{ Containers: []v1.Container{{ Name: "pause", - Image: "k8s.gcr.io/pause:3.2", + Image: "k8s.gcr.io/pause:3.4.1", Ports: []v1.ContainerPort{{ContainerPort: 80}}, Resources: v1.ResourceRequirements{ Limits: v1.ResourceList{ @@ -1369,35 +1369,39 @@ func CreatePodWithPersistentVolume(client clientset.Interface, namespace string, pv.Status.Phase = v1.VolumeBound // bind pvc to "pv-$i" - // pvc.Spec.VolumeName = pv.Name + pvc.Spec.VolumeName = pv.Name pvc.Status.Phase = v1.ClaimBound } else { pv.Status.Phase = v1.VolumeAvailable } - if err := CreatePersistentVolumeWithRetries(client, pv); err != nil { + + // Create PVC first as it's referenced by the PV when the `bindVolume` is true. + if err := CreatePersistentVolumeClaimWithRetries(client, namespace, pvc); err != nil { lock.Lock() defer lock.Unlock() - createError = fmt.Errorf("error creating PV: %s", err) + createError = fmt.Errorf("error creating PVC: %s", err) return } + // We need to update statuses separately, as creating pv/pvc resets status to the default one. - if _, err := client.CoreV1().PersistentVolumes().UpdateStatus(context.TODO(), pv, metav1.UpdateOptions{}); err != nil { + if _, err := client.CoreV1().PersistentVolumeClaims(namespace).UpdateStatus(context.TODO(), pvc, metav1.UpdateOptions{}); err != nil { lock.Lock() defer lock.Unlock() - createError = fmt.Errorf("error updating PV status: %s", err) + createError = fmt.Errorf("error updating PVC status: %s", err) return } - if err := CreatePersistentVolumeClaimWithRetries(client, namespace, pvc); err != nil { + if err := CreatePersistentVolumeWithRetries(client, pv); err != nil { lock.Lock() defer lock.Unlock() - createError = fmt.Errorf("error creating PVC: %s", err) + createError = fmt.Errorf("error creating PV: %s", err) return } - if _, err := client.CoreV1().PersistentVolumeClaims(namespace).UpdateStatus(context.TODO(), pvc, metav1.UpdateOptions{}); err != nil { + // We need to update statuses separately, as creating pv/pvc resets status to the default one. + if _, err := client.CoreV1().PersistentVolumes().UpdateStatus(context.TODO(), pv, metav1.UpdateOptions{}); err != nil { lock.Lock() defer lock.Unlock() - createError = fmt.Errorf("error updating PVC status: %s", err) + createError = fmt.Errorf("error updating PV status: %s", err) return } @@ -1482,10 +1486,10 @@ func makeUnboundPersistentVolumeClaim(storageClass string) *v1.PersistentVolumeC func NewCreatePodWithPersistentVolumeWithFirstConsumerStrategy(factory volumeFactory, podTemplate *v1.Pod) TestPodCreateStrategy { return func(client clientset.Interface, namespace string, podCount int) error { - volumeBindingMode := storage.VolumeBindingWaitForFirstConsumer - storageClass := &storage.StorageClass{ + volumeBindingMode := storagev1.VolumeBindingWaitForFirstConsumer + storageClass := &storagev1.StorageClass{ ObjectMeta: metav1.ObjectMeta{ - Name: "storage-class-1", + Name: "storagev1-class-1", }, Provisioner: "kubernetes.io/gce-pd", VolumeBindingMode: &volumeBindingMode, @@ -1493,7 +1497,7 @@ func NewCreatePodWithPersistentVolumeWithFirstConsumerStrategy(factory volumeFac claimTemplate := makeUnboundPersistentVolumeClaim(storageClass.Name) if err := CreateStorageClassWithRetries(client, storageClass); err != nil { - return fmt.Errorf("failed to create storage class: %v", err) + return fmt.Errorf("failed to create storagev1 class: %v", err) } factoryWithStorageClass := func(i int) *v1.PersistentVolume { @@ -1721,7 +1725,7 @@ type DaemonConfig struct { func (config *DaemonConfig) Run() error { if config.Image == "" { - config.Image = "k8s.gcr.io/pause:3.2" + config.Image = "k8s.gcr.io/pause:3.4.1" } nameLabel := map[string]string{ "name": config.Name + "-daemon", diff --git a/vendor/k8s.io/kubernetes/third_party/forked/golang/expansion/BUILD b/vendor/k8s.io/kubernetes/third_party/forked/golang/expansion/BUILD deleted file mode 100644 index f1a85c7a4e58..000000000000 --- a/vendor/k8s.io/kubernetes/third_party/forked/golang/expansion/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -licenses(["notice"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["expand.go"], - importpath = "k8s.io/kubernetes/third_party/forked/golang/expansion", -) - -go_test( - name = "go_default_test", - srcs = ["expand_test.go"], - embed = [":go_default_library"], - deps = ["//pkg/apis/core:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/third_party/forked/golang/net/dnsclient.go b/vendor/k8s.io/kubernetes/third_party/forked/golang/net/dnsclient.go new file mode 100644 index 000000000000..74fbbc26d724 --- /dev/null +++ b/vendor/k8s.io/kubernetes/third_party/forked/golang/net/dnsclient.go @@ -0,0 +1,58 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This package is copied from Go library net. +// https://golang.org/src/net/dnsclient.go +// The original private function reverseaddr +// is exported as public function. + +package net + +import "net" + +// Reverseaddr returns the in-addr.arpa. or ip6.arpa. hostname of the IP +// address addr suitable for rDNS (PTR) record lookup or an error if it fails +// to parse the IP address. +func Reverseaddr(addr string) (arpa string, err error) { + ip := net.ParseIP(addr) + if ip == nil { + return "", &net.DNSError{Err: "unrecognized address", Name: addr} + } + if ip.To4() != nil { + return uitoa(uint(ip[15])) + "." + uitoa(uint(ip[14])) + "." + uitoa(uint(ip[13])) + "." + uitoa(uint(ip[12])) + ".in-addr.arpa.", nil + } + // Must be IPv6 + buf := make([]byte, 0, len(ip)*4+len("ip6.arpa.")) + // Add it, in reverse, to the buffer + for i := len(ip) - 1; i >= 0; i-- { + v := ip[i] + buf = append(buf, hexDigit[v&0xF], + '.', + hexDigit[v>>4], + '.') + } + // Append "ip6.arpa." and return (buf already has the final .) + buf = append(buf, "ip6.arpa."...) + return string(buf), nil +} + +// Convert unsigned integer to decimal string. +func uitoa(val uint) string { + if val == 0 { // avoid string allocation + return "0" + } + var buf [20]byte // big enough for 64bit value base 10 + i := len(buf) - 1 + for val >= 10 { + q := val / 10 + buf[i] = byte('0' + val - q*10) + i-- + val = q + } + // val < 10 + buf[i] = byte('0' + val) + return string(buf[i:]) +} + +const hexDigit = "0123456789abcdef" diff --git a/vendor/k8s.io/kubernetes/third_party/forked/gonum/graph/BUILD b/vendor/k8s.io/kubernetes/third_party/forked/gonum/graph/BUILD deleted file mode 100644 index c5bd55ee2b8d..000000000000 --- a/vendor/k8s.io/kubernetes/third_party/forked/gonum/graph/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -licenses(["notice"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["graph.go"], - importpath = "k8s.io/kubernetes/third_party/forked/gonum/graph", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//third_party/forked/gonum/graph/internal/linear:all-srcs", - "//third_party/forked/gonum/graph/simple:all-srcs", - "//third_party/forked/gonum/graph/traverse:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/third_party/forked/gonum/graph/internal/linear/BUILD b/vendor/k8s.io/kubernetes/third_party/forked/gonum/graph/internal/linear/BUILD deleted file mode 100644 index 3860059b7132..000000000000 --- a/vendor/k8s.io/kubernetes/third_party/forked/gonum/graph/internal/linear/BUILD +++ /dev/null @@ -1,28 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -licenses(["notice"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["linear.go"], - importpath = "k8s.io/kubernetes/third_party/forked/gonum/graph/internal/linear", - deps = ["//third_party/forked/gonum/graph:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/third_party/forked/gonum/graph/simple/BUILD b/vendor/k8s.io/kubernetes/third_party/forked/gonum/graph/simple/BUILD deleted file mode 100644 index f4dc20f13c9a..000000000000 --- a/vendor/k8s.io/kubernetes/third_party/forked/gonum/graph/simple/BUILD +++ /dev/null @@ -1,48 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -licenses(["notice"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "directed_acyclic_test.go", - "edgeholder_test.go", - "undirected_test.go", - ], - embed = [":go_default_library"], - deps = ["//third_party/forked/gonum/graph:go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = [ - "directed_acyclic.go", - "edgeholder.go", - "simple.go", - "undirected.go", - ], - importpath = "k8s.io/kubernetes/third_party/forked/gonum/graph/simple", - deps = [ - "//third_party/forked/gonum/graph:go_default_library", - "//vendor/golang.org/x/tools/container/intsets:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/third_party/forked/gonum/graph/traverse/BUILD b/vendor/k8s.io/kubernetes/third_party/forked/gonum/graph/traverse/BUILD deleted file mode 100644 index 5952c8ccee96..000000000000 --- a/vendor/k8s.io/kubernetes/third_party/forked/gonum/graph/traverse/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -licenses(["notice"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "traverse.go", - "visit_depth_first.go", - ], - importpath = "k8s.io/kubernetes/third_party/forked/gonum/graph/traverse", - deps = [ - "//third_party/forked/gonum/graph:go_default_library", - "//third_party/forked/gonum/graph/internal/linear:go_default_library", - "//vendor/golang.org/x/tools/container/intsets:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/legacy-cloud-providers/aws/BUILD b/vendor/k8s.io/legacy-cloud-providers/aws/BUILD deleted file mode 100644 index 47d1f0ff5a78..000000000000 --- a/vendor/k8s.io/legacy-cloud-providers/aws/BUILD +++ /dev/null @@ -1,116 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "aws.go", - "aws_fakes.go", - "aws_instancegroups.go", - "aws_loadbalancer.go", - "aws_metrics.go", - "aws_routes.go", - "aws_utils.go", - "device_allocator.go", - "doc.go", - "instances.go", - "log_handler.go", - "retry_handler.go", - "sets_ippermissions.go", - "tags.go", - "volumes.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/legacy-cloud-providers/aws", - importpath = "k8s.io/legacy-cloud-providers/aws", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/informers/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/pkg/version:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/cloud-provider:go_default_library", - "//staging/src/k8s.io/cloud-provider/node/helpers:go_default_library", - "//staging/src/k8s.io/cloud-provider/service/helpers:go_default_library", - "//staging/src/k8s.io/cloud-provider/volume:go_default_library", - "//staging/src/k8s.io/cloud-provider/volume/errors:go_default_library", - "//staging/src/k8s.io/cloud-provider/volume/helpers:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - "//staging/src/k8s.io/csi-translation-lib/plugins:go_default_library", - "//vendor/github.com/aws/aws-sdk-go/aws:go_default_library", - "//vendor/github.com/aws/aws-sdk-go/aws/awserr:go_default_library", - "//vendor/github.com/aws/aws-sdk-go/aws/credentials:go_default_library", - "//vendor/github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds:go_default_library", - "//vendor/github.com/aws/aws-sdk-go/aws/credentials/stscreds:go_default_library", - "//vendor/github.com/aws/aws-sdk-go/aws/ec2metadata:go_default_library", - "//vendor/github.com/aws/aws-sdk-go/aws/endpoints:go_default_library", - "//vendor/github.com/aws/aws-sdk-go/aws/request:go_default_library", - "//vendor/github.com/aws/aws-sdk-go/aws/session:go_default_library", - "//vendor/github.com/aws/aws-sdk-go/service/autoscaling:go_default_library", - "//vendor/github.com/aws/aws-sdk-go/service/ec2:go_default_library", - "//vendor/github.com/aws/aws-sdk-go/service/elb:go_default_library", - "//vendor/github.com/aws/aws-sdk-go/service/elbv2:go_default_library", - "//vendor/github.com/aws/aws-sdk-go/service/kms:go_default_library", - "//vendor/github.com/aws/aws-sdk-go/service/sts:go_default_library", - "//vendor/gopkg.in/gcfg.v1:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "aws_loadbalancer_test.go", - "aws_test.go", - "device_allocator_test.go", - "instances_test.go", - "retry_handler_test.go", - "tags_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/cloud-provider/volume:go_default_library", - "//vendor/github.com/aws/aws-sdk-go/aws:go_default_library", - "//vendor/github.com/aws/aws-sdk-go/aws/awserr:go_default_library", - "//vendor/github.com/aws/aws-sdk-go/service/ec2:go_default_library", - "//vendor/github.com/aws/aws-sdk-go/service/elb:go_default_library", - "//vendor/github.com/aws/aws-sdk-go/service/elbv2:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/mock:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/legacy-cloud-providers/aws/OWNERS b/vendor/k8s.io/legacy-cloud-providers/aws/OWNERS index 091c62914c32..dc771f785495 100644 --- a/vendor/k8s.io/legacy-cloud-providers/aws/OWNERS +++ b/vendor/k8s.io/legacy-cloud-providers/aws/OWNERS @@ -1,11 +1,15 @@ # See the OWNERS docs at https://go.k8s.io/owners +# We are no longer accepting features into k8s.io/legacy-cloud-providers. +# Any kind/feature PRs must be approved by SIG Cloud Provider going forward. -approvers: +emeritus_approvers: - justinsb - gnufied - jsafrane - micahhausler - m00nf1sh +- zmerlynn +- mcrute reviewers: - gnufied - jsafrane @@ -14,6 +18,3 @@ reviewers: - nckturner - micahhausler - m00nf1sh -emeritus_approvers: -- zmerlynn -- mcrute diff --git a/vendor/k8s.io/legacy-cloud-providers/aws/aws.go b/vendor/k8s.io/legacy-cloud-providers/aws/aws.go index c74eef1199f6..3588f38cb4e0 100644 --- a/vendor/k8s.io/legacy-cloud-providers/aws/aws.go +++ b/vendor/k8s.io/legacy-cloud-providers/aws/aws.go @@ -233,6 +233,16 @@ const ServiceAnnotationLoadBalancerEIPAllocations = "service.beta.kubernetes.io/ // For example: "Key1=Val1,Key2=Val2,KeyNoVal1=,KeyNoVal2" const ServiceAnnotationLoadBalancerTargetNodeLabels = "service.beta.kubernetes.io/aws-load-balancer-target-node-labels" +// ServiceAnnotationLoadBalancerSubnets is the annotation used on the service to specify the +// Availability Zone configuration for the load balancer. The values are comma separated list of +// subnetID or subnetName from different AZs +// By default, the controller will auto-discover the subnets. If there are multiple subnets per AZ, auto-discovery +// will break the tie in the following order - +// 1. prefer the subnet with the correct role tag. kubernetes.io/role/elb for public and kubernetes.io/role/internal-elb for private access +// 2. prefer the subnet with the cluster tag kubernetes.io/cluster/ +// 3. prefer the subnet that is first in lexicographic order +const ServiceAnnotationLoadBalancerSubnets = "service.beta.kubernetes.io/aws-load-balancer-subnets" + // Event key when a volume is stuck on attaching state when being attached to a volume const volumeAttachmentStuck = "VolumeAttachmentStuck" @@ -2739,12 +2749,12 @@ func (c *Cloud) GetVolumeLabels(volumeName KubernetesVolumeID) (map[string]strin return nil, fmt.Errorf("volume did not have AZ information: %q", aws.StringValue(info.VolumeId)) } - labels[v1.LabelFailureDomainBetaZone] = az + labels[v1.LabelTopologyZone] = az region, err := azToRegion(az) if err != nil { return nil, err } - labels[v1.LabelFailureDomainBetaRegion] = region + labels[v1.LabelTopologyRegion] = region return labels, nil } @@ -3368,7 +3378,7 @@ func findTag(tags []*ec2.Tag, key string) (string, bool) { return "", false } -// Finds the subnets associated with the cluster, by matching tags. +// Finds the subnets associated with the cluster, by matching cluster tags if present. // For maximal backwards compatibility, if no subnets are tagged, it will fall-back to the current subnet. // However, in future this will likely be treated as an error. func (c *Cloud) findSubnets() ([]*ec2.Subnet, error) { @@ -3384,6 +3394,8 @@ func (c *Cloud) findSubnets() ([]*ec2.Subnet, error) { for _, subnet := range subnets { if c.tagging.hasClusterTag(subnet.Tags) { matches = append(matches, subnet) + } else if c.tagging.hasNoClusterPrefixTag(subnet.Tags) { + matches = append(matches, subnet) } } @@ -3447,7 +3459,7 @@ func (c *Cloud) findELBSubnets(internalELB bool) ([]string, error) { continue } - // Try to break the tie using a tag + // Try to break the tie using the role tag var tagName string if internalELB { tagName = TagNameSubnetInternalELB @@ -3465,8 +3477,17 @@ func (c *Cloud) findELBSubnets(internalELB bool) ([]string, error) { continue } + // Prefer the one with the cluster Tag + existingHasClusterTag := c.tagging.hasClusterTag(existing.Tags) + subnetHasClusterTag := c.tagging.hasClusterTag(subnet.Tags) + if existingHasClusterTag != subnetHasClusterTag { + if subnetHasClusterTag { + subnetsByAZ[az] = subnet + } + continue + } + // If we have two subnets for the same AZ we arbitrarily choose the one that is first lexicographically. - // TODO: Should this be an error. if strings.Compare(*existing.SubnetId, *subnet.SubnetId) > 0 { klog.Warningf("Found multiple subnets in AZ %q; choosing %q between subnets %q and %q", az, *subnet.SubnetId, *existing.SubnetId, *subnet.SubnetId) subnetsByAZ[az] = subnet @@ -3492,6 +3513,90 @@ func (c *Cloud) findELBSubnets(internalELB bool) ([]string, error) { return subnetIDs, nil } +func splitCommaSeparatedString(commaSeparatedString string) []string { + var result []string + parts := strings.Split(commaSeparatedString, ",") + for _, part := range parts { + part = strings.TrimSpace(part) + if len(part) == 0 { + continue + } + result = append(result, part) + } + return result +} + +// parses comma separated values from annotation into string slice, returns true if annotation exists +func parseStringSliceAnnotation(annotations map[string]string, annotation string, value *[]string) bool { + rawValue := "" + if exists := parseStringAnnotation(annotations, annotation, &rawValue); !exists { + return false + } + *value = splitCommaSeparatedString(rawValue) + return true +} + +func (c *Cloud) getLoadBalancerSubnets(service *v1.Service, internalELB bool) ([]string, error) { + var rawSubnetNameOrIDs []string + if exists := parseStringSliceAnnotation(service.Annotations, ServiceAnnotationLoadBalancerSubnets, &rawSubnetNameOrIDs); exists { + return c.resolveSubnetNameOrIDs(rawSubnetNameOrIDs) + } + return c.findELBSubnets(internalELB) +} + +func (c *Cloud) resolveSubnetNameOrIDs(subnetNameOrIDs []string) ([]string, error) { + var subnetIDs []string + var subnetNames []string + if len(subnetNameOrIDs) == 0 { + return []string{}, fmt.Errorf("unable to resolve empty subnet slice") + } + for _, nameOrID := range subnetNameOrIDs { + if strings.HasPrefix(nameOrID, "subnet-") { + subnetIDs = append(subnetIDs, nameOrID) + } else { + subnetNames = append(subnetNames, nameOrID) + } + } + var resolvedSubnets []*ec2.Subnet + if len(subnetIDs) > 0 { + req := &ec2.DescribeSubnetsInput{ + SubnetIds: aws.StringSlice(subnetIDs), + } + subnets, err := c.ec2.DescribeSubnets(req) + if err != nil { + return []string{}, err + } + resolvedSubnets = append(resolvedSubnets, subnets...) + } + if len(subnetNames) > 0 { + req := &ec2.DescribeSubnetsInput{ + Filters: []*ec2.Filter{ + { + Name: aws.String("tag:Name"), + Values: aws.StringSlice(subnetNames), + }, + { + Name: aws.String("vpc-id"), + Values: aws.StringSlice([]string{c.vpcID}), + }, + }, + } + subnets, err := c.ec2.DescribeSubnets(req) + if err != nil { + return []string{}, err + } + resolvedSubnets = append(resolvedSubnets, subnets...) + } + if len(resolvedSubnets) != len(subnetNameOrIDs) { + return []string{}, fmt.Errorf("expected to find %v, but found %v subnets", len(subnetNameOrIDs), len(resolvedSubnets)) + } + var subnets []string + for _, subnet := range resolvedSubnets { + subnets = append(subnets, aws.StringValue(subnet.SubnetId)) + } + return subnets, nil +} + func isSubnetPublic(rt []*ec2.RouteTable, subnetID string) (bool, error) { var subnetTable *ec2.RouteTable for _, table := range rt { @@ -3869,7 +3974,7 @@ func (c *Cloud) EnsureLoadBalancer(ctx context.Context, clusterName string, apiS if isNLB(annotations) { // Find the subnets that the ELB will live in - subnetIDs, err := c.findELBSubnets(internalELB) + subnetIDs, err := c.getLoadBalancerSubnets(apiService, internalELB) if err != nil { klog.Errorf("Error listing subnets in VPC: %q", err) return nil, err @@ -4036,7 +4141,7 @@ func (c *Cloud) EnsureLoadBalancer(ctx context.Context, clusterName string, apiS } // Find the subnets that the ELB will live in - subnetIDs, err := c.findELBSubnets(internalELB) + subnetIDs, err := c.getLoadBalancerSubnets(apiService, internalELB) if err != nil { klog.Errorf("Error listing subnets in VPC: %q", err) return nil, err diff --git a/vendor/k8s.io/legacy-cloud-providers/aws/tags.go b/vendor/k8s.io/legacy-cloud-providers/aws/tags.go index 9ec0cf67e2f9..532e697fd2a1 100644 --- a/vendor/k8s.io/legacy-cloud-providers/aws/tags.go +++ b/vendor/k8s.io/legacy-cloud-providers/aws/tags.go @@ -152,6 +152,15 @@ func (t *awsTagging) hasClusterTag(tags []*ec2.Tag) bool { return false } +func (t *awsTagging) hasNoClusterPrefixTag(tags []*ec2.Tag) bool { + for _, tag := range tags { + if strings.HasPrefix(aws.StringValue(tag.Key), TagNameKubernetesClusterPrefix) { + return false + } + } + return true +} + // Ensure that a resource has the correct tags // If it has no tags, we assume that this was a problem caused by an error in between creation and tagging, // and we add the tags. If it has a different cluster's tags, that is an error. diff --git a/vendor/k8s.io/legacy-cloud-providers/azure/BUILD b/vendor/k8s.io/legacy-cloud-providers/azure/BUILD deleted file mode 100644 index 8e4bda171b80..000000000000 --- a/vendor/k8s.io/legacy-cloud-providers/azure/BUILD +++ /dev/null @@ -1,202 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "azure.go", - "azure_backoff.go", - "azure_blobDiskController.go", - "azure_config.go", - "azure_controller_common.go", - "azure_controller_standard.go", - "azure_controller_vmss.go", - "azure_fakes.go", - "azure_file.go", - "azure_instance_metadata.go", - "azure_instances.go", - "azure_loadbalancer.go", - "azure_managedDiskController.go", - "azure_ratelimit.go", - "azure_routes.go", - "azure_standard.go", - "azure_storage.go", - "azure_storageaccount.go", - "azure_utils.go", - "azure_vmsets.go", - "azure_vmss.go", - "azure_vmss_cache.go", - "azure_wrap.go", - "azure_zones.go", - "doc.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/legacy-cloud-providers/azure", - importpath = "k8s.io/legacy-cloud-providers/azure", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/cloud-provider:go_default_library", - "//staging/src/k8s.io/cloud-provider/service/helpers:go_default_library", - "//staging/src/k8s.io/cloud-provider/volume:go_default_library", - "//staging/src/k8s.io/cloud-provider/volume/errors:go_default_library", - "//staging/src/k8s.io/cloud-provider/volume/helpers:go_default_library", - "//staging/src/k8s.io/component-base/featuregate:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/auth:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/cache:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/containerserviceclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/deploymentclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/diskclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/diskclient/mockdiskclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/fileclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/interfaceclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/interfaceclient/mockinterfaceclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/loadbalancerclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/loadbalancerclient/mockloadbalancerclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/publicipclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/publicipclient/mockpublicipclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/routeclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/routeclient/mockrouteclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/routetableclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/routetableclient/mockroutetableclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/securitygroupclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/securitygroupclient/mocksecuritygroupclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/snapshotclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/storageaccountclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/subnetclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/subnetclient/mocksubnetclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/vmclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/vmclient/mockvmclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/vmsizeclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/vmssclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/vmssclient/mockvmssclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/vmssvmclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/vmssvmclient/mockvmssvmclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/metrics:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-06-01/network:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/storage/mgmt/2019-06-01/storage:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/storage:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/adal:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/azure:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/to:go_default_library", - "//vendor/github.com/golang/mock/gomock:go_default_library", - "//vendor/github.com/rubiojr/go-vhd/vhd:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - "//vendor/sigs.k8s.io/yaml:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "azure_backoff_test.go", - "azure_blobDiskController_test.go", - "azure_config_test.go", - "azure_controller_common_test.go", - "azure_controller_standard_test.go", - "azure_controller_vmss_test.go", - "azure_instances_test.go", - "azure_loadbalancer_test.go", - "azure_managedDiskController_test.go", - "azure_ratelimit_test.go", - "azure_routes_test.go", - "azure_standard_test.go", - "azure_storage_test.go", - "azure_storageaccount_test.go", - "azure_test.go", - "azure_utils_test.go", - "azure_vmss_cache_test.go", - "azure_vmss_test.go", - "azure_wrap_test.go", - "azure_zones_test.go", - "main_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/cloud-provider:go_default_library", - "//staging/src/k8s.io/cloud-provider/service/helpers:go_default_library", - "//staging/src/k8s.io/cloud-provider/volume:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/auth:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/cache:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/diskclient/mockdiskclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/fileclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/fileclient/mockfileclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/interfaceclient/mockinterfaceclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/loadbalancerclient/mockloadbalancerclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/publicipclient/mockpublicipclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/routeclient/mockrouteclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/routetableclient/mockroutetableclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/securitygroupclient/mocksecuritygroupclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/storageaccountclient/mockstorageaccountclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/subnetclient/mocksubnetclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/vmclient/mockvmclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/vmssclient/mockvmssclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/vmssvmclient/mockvmssvmclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/mockvmsets:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-06-01/network:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/storage/mgmt/2019-06-01/storage:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/storage:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/azure:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/to:go_default_library", - "//vendor/github.com/golang/mock/gomock:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/k8s.io/utils/pointer:go_default_library", - "//vendor/sigs.k8s.io/yaml:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/legacy-cloud-providers/azure/auth:all-srcs", - "//staging/src/k8s.io/legacy-cloud-providers/azure/cache:all-srcs", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients:all-srcs", - "//staging/src/k8s.io/legacy-cloud-providers/azure/metrics:all-srcs", - "//staging/src/k8s.io/legacy-cloud-providers/azure/mockvmsets:all-srcs", - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/legacy-cloud-providers/azure/OWNERS b/vendor/k8s.io/legacy-cloud-providers/azure/OWNERS index 7ec0f8ac2434..f6521ab5374f 100644 --- a/vendor/k8s.io/legacy-cloud-providers/azure/OWNERS +++ b/vendor/k8s.io/legacy-cloud-providers/azure/OWNERS @@ -1,6 +1,8 @@ # See the OWNERS docs at https://go.k8s.io/owners +# We are no longer accepting features into k8s.io/legacy-cloud-providers. +# Any kind/feature PRs must be approved by SIG Cloud Provider going forward. -approvers: +emeritus_approvers: - andyzhangx - brendandburns - feiskyer diff --git a/vendor/k8s.io/legacy-cloud-providers/azure/auth/BUILD b/vendor/k8s.io/legacy-cloud-providers/azure/auth/BUILD deleted file mode 100644 index b3432a358bc6..000000000000 --- a/vendor/k8s.io/legacy-cloud-providers/azure/auth/BUILD +++ /dev/null @@ -1,49 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "azure_auth.go", - "doc.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/legacy-cloud-providers/azure/auth", - importpath = "k8s.io/legacy-cloud-providers/azure/auth", - visibility = ["//visibility:public"], - deps = [ - "//vendor/github.com/Azure/go-autorest/autorest/adal:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/azure:go_default_library", - "//vendor/golang.org/x/crypto/pkcs12:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["azure_auth_test.go"], - embed = [":go_default_library"], - deps = [ - "//vendor/github.com/Azure/go-autorest/autorest/adal:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/azure:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/legacy-cloud-providers/azure/azure_backoff.go b/vendor/k8s.io/legacy-cloud-providers/azure/azure_backoff.go index 316d7f6506cd..584d66ac02a1 100644 --- a/vendor/k8s.io/legacy-cloud-providers/azure/azure_backoff.go +++ b/vendor/k8s.io/legacy-cloud-providers/azure/azure_backoff.go @@ -183,11 +183,40 @@ func (az *Cloud) CreateOrUpdateSecurityGroup(sg network.SecurityGroup) error { return rerr.Error() } +func cleanupSubnetInFrontendIPConfigurations(lb *network.LoadBalancer) network.LoadBalancer { + if lb.LoadBalancerPropertiesFormat == nil || lb.FrontendIPConfigurations == nil { + return *lb + } + + frontendIPConfigurations := *lb.FrontendIPConfigurations + for i := range frontendIPConfigurations { + config := frontendIPConfigurations[i] + if config.FrontendIPConfigurationPropertiesFormat != nil && + config.Subnet != nil && + config.Subnet.ID != nil { + subnet := network.Subnet{ + ID: config.Subnet.ID, + } + if config.Subnet.Name != nil { + subnet.Name = config.FrontendIPConfigurationPropertiesFormat.Subnet.Name + } + config.FrontendIPConfigurationPropertiesFormat.Subnet = &subnet + frontendIPConfigurations[i] = config + continue + } + } + + lb.FrontendIPConfigurations = &frontendIPConfigurations + return *lb +} + // CreateOrUpdateLB invokes az.LoadBalancerClient.CreateOrUpdate with exponential backoff retry func (az *Cloud) CreateOrUpdateLB(service *v1.Service, lb network.LoadBalancer) error { ctx, cancel := getContextWithCancel() defer cancel() + lb = cleanupSubnetInFrontendIPConfigurations(&lb) + rgName := az.getLoadBalancerResourceGroup() rerr := az.LoadBalancerClient.CreateOrUpdate(ctx, rgName, to.String(lb.Name), lb, to.String(lb.Etag)) klog.V(10).Infof("LoadBalancerClient.CreateOrUpdate(%s): end", *lb.Name) diff --git a/vendor/k8s.io/legacy-cloud-providers/azure/azure_loadbalancer.go b/vendor/k8s.io/legacy-cloud-providers/azure/azure_loadbalancer.go index da75a051a702..57e7706f881e 100644 --- a/vendor/k8s.io/legacy-cloud-providers/azure/azure_loadbalancer.go +++ b/vendor/k8s.io/legacy-cloud-providers/azure/azure_loadbalancer.go @@ -95,10 +95,6 @@ const ( // to specify the idle timeout for connections on the load balancer in minutes. ServiceAnnotationLoadBalancerIdleTimeout = "service.beta.kubernetes.io/azure-load-balancer-tcp-idle-timeout" - // ServiceAnnotationLoadBalancerMixedProtocols is the annotation used on the service - // to create both TCP and UDP protocols when creating load balancer rules. - ServiceAnnotationLoadBalancerMixedProtocols = "service.beta.kubernetes.io/azure-load-balancer-mixed-protocols" - // ServiceAnnotationLoadBalancerEnableHighAvailabilityPorts is the annotation used on the service // to enable the high availability ports on the standard internal load balancer. ServiceAnnotationLoadBalancerEnableHighAvailabilityPorts = "service.beta.kubernetes.io/azure-load-balancer-enable-high-availability-ports" @@ -1630,117 +1626,112 @@ func (az *Cloud) reconcileLoadBalancerRule( var expectedProbes []network.Probe var expectedRules []network.LoadBalancingRule + highAvailabilityPortsEnabled := false for _, port := range ports { - protocols := []v1.Protocol{port.Protocol} - if v, ok := service.Annotations[ServiceAnnotationLoadBalancerMixedProtocols]; ok && v == "true" { - klog.V(2).Infof("reconcileLoadBalancerRule lb name (%s) flag(%s) is set", lbName, ServiceAnnotationLoadBalancerMixedProtocols) - if port.Protocol == v1.ProtocolTCP { - protocols = append(protocols, v1.ProtocolUDP) - } else if port.Protocol == v1.ProtocolUDP { - protocols = append(protocols, v1.ProtocolTCP) - } + if highAvailabilityPortsEnabled { + // Since the port is always 0 when enabling HA, only one rule should be configured. + break } - for _, protocol := range protocols { - lbRuleName := az.getLoadBalancerRuleName(service, protocol, port.Port) - klog.V(2).Infof("reconcileLoadBalancerRule lb name (%s) rule name (%s)", lbName, lbRuleName) - - transportProto, _, probeProto, err := getProtocolsFromKubernetesProtocol(protocol) - if err != nil { - return expectedProbes, expectedRules, err - } + lbRuleName := az.getLoadBalancerRuleName(service, port.Protocol, port.Port) + klog.V(2).Infof("reconcileLoadBalancerRule lb name (%s) rule name (%s)", lbName, lbRuleName) - probeProtocol, requestPath := parseHealthProbeProtocolAndPath(service) - if servicehelpers.NeedsHealthCheck(service) { - podPresencePath, podPresencePort := servicehelpers.GetServiceHealthCheckPathPort(service) - if probeProtocol == "" { - probeProtocol = string(network.ProbeProtocolHTTP) - } - if requestPath == "" { - requestPath = podPresencePath - } + transportProto, _, probeProto, err := getProtocolsFromKubernetesProtocol(port.Protocol) + if err != nil { + return expectedProbes, expectedRules, err + } - expectedProbes = append(expectedProbes, network.Probe{ - Name: &lbRuleName, - ProbePropertiesFormat: &network.ProbePropertiesFormat{ - RequestPath: to.StringPtr(requestPath), - Protocol: network.ProbeProtocol(probeProtocol), - Port: to.Int32Ptr(podPresencePort), - IntervalInSeconds: to.Int32Ptr(5), - NumberOfProbes: to.Int32Ptr(2), - }, - }) - } else if protocol != v1.ProtocolUDP && protocol != v1.ProtocolSCTP { - // we only add the expected probe if we're doing TCP - if probeProtocol == "" { - probeProtocol = string(*probeProto) - } - var actualPath *string - if !strings.EqualFold(probeProtocol, string(network.ProbeProtocolTCP)) { - if requestPath != "" { - actualPath = to.StringPtr(requestPath) - } else { - actualPath = to.StringPtr("/healthz") - } - } - expectedProbes = append(expectedProbes, network.Probe{ - Name: &lbRuleName, - ProbePropertiesFormat: &network.ProbePropertiesFormat{ - Protocol: network.ProbeProtocol(probeProtocol), - RequestPath: actualPath, - Port: to.Int32Ptr(port.NodePort), - IntervalInSeconds: to.Int32Ptr(5), - NumberOfProbes: to.Int32Ptr(2), - }, - }) + probeProtocol, requestPath := parseHealthProbeProtocolAndPath(service) + if servicehelpers.NeedsHealthCheck(service) { + podPresencePath, podPresencePort := servicehelpers.GetServiceHealthCheckPathPort(service) + if probeProtocol == "" { + probeProtocol = string(network.ProbeProtocolHTTP) } - - loadDistribution := network.LoadDistributionDefault - if service.Spec.SessionAffinity == v1.ServiceAffinityClientIP { - loadDistribution = network.LoadDistributionSourceIP + if requestPath == "" { + requestPath = podPresencePath } - expectedRule := network.LoadBalancingRule{ + expectedProbes = append(expectedProbes, network.Probe{ Name: &lbRuleName, - LoadBalancingRulePropertiesFormat: &network.LoadBalancingRulePropertiesFormat{ - Protocol: *transportProto, - FrontendIPConfiguration: &network.SubResource{ - ID: to.StringPtr(lbFrontendIPConfigID), - }, - BackendAddressPool: &network.SubResource{ - ID: to.StringPtr(lbBackendPoolID), - }, - LoadDistribution: loadDistribution, - FrontendPort: to.Int32Ptr(port.Port), - BackendPort: to.Int32Ptr(port.Port), - DisableOutboundSnat: to.BoolPtr(az.disableLoadBalancerOutboundSNAT()), - EnableTCPReset: enableTCPReset, - EnableFloatingIP: to.BoolPtr(true), + ProbePropertiesFormat: &network.ProbePropertiesFormat{ + RequestPath: to.StringPtr(requestPath), + Protocol: network.ProbeProtocol(probeProtocol), + Port: to.Int32Ptr(podPresencePort), + IntervalInSeconds: to.Int32Ptr(5), + NumberOfProbes: to.Int32Ptr(2), }, + }) + } else if port.Protocol != v1.ProtocolUDP && port.Protocol != v1.ProtocolSCTP { + // we only add the expected probe if we're doing TCP + if probeProtocol == "" { + probeProtocol = string(*probeProto) } - - if protocol == v1.ProtocolTCP { - expectedRule.LoadBalancingRulePropertiesFormat.IdleTimeoutInMinutes = lbIdleTimeout + var actualPath *string + if !strings.EqualFold(probeProtocol, string(network.ProbeProtocolTCP)) { + if requestPath != "" { + actualPath = to.StringPtr(requestPath) + } else { + actualPath = to.StringPtr("/healthz") + } } + expectedProbes = append(expectedProbes, network.Probe{ + Name: &lbRuleName, + ProbePropertiesFormat: &network.ProbePropertiesFormat{ + Protocol: network.ProbeProtocol(probeProtocol), + RequestPath: actualPath, + Port: to.Int32Ptr(port.NodePort), + IntervalInSeconds: to.Int32Ptr(5), + NumberOfProbes: to.Int32Ptr(2), + }, + }) + } - if requiresInternalLoadBalancer(service) && - strings.EqualFold(az.LoadBalancerSku, loadBalancerSkuStandard) && - strings.EqualFold(service.Annotations[ServiceAnnotationLoadBalancerEnableHighAvailabilityPorts], "true") { - expectedRule.FrontendPort = to.Int32Ptr(0) - expectedRule.BackendPort = to.Int32Ptr(0) - expectedRule.Protocol = network.TransportProtocolAll - } + loadDistribution := network.LoadDistributionDefault + if service.Spec.SessionAffinity == v1.ServiceAffinityClientIP { + loadDistribution = network.LoadDistributionSourceIP + } - // we didn't construct the probe objects for UDP or SCTP because they're not allowed on Azure. - // However, when externalTrafficPolicy is Local, Kubernetes HTTP health check would be used for probing. - if servicehelpers.NeedsHealthCheck(service) || (protocol != v1.ProtocolUDP && protocol != v1.ProtocolSCTP) { - expectedRule.Probe = &network.SubResource{ - ID: to.StringPtr(az.getLoadBalancerProbeID(lbName, az.getLoadBalancerResourceGroup(), lbRuleName)), - } - } + expectedRule := network.LoadBalancingRule{ + Name: &lbRuleName, + LoadBalancingRulePropertiesFormat: &network.LoadBalancingRulePropertiesFormat{ + Protocol: *transportProto, + FrontendIPConfiguration: &network.SubResource{ + ID: to.StringPtr(lbFrontendIPConfigID), + }, + BackendAddressPool: &network.SubResource{ + ID: to.StringPtr(lbBackendPoolID), + }, + LoadDistribution: loadDistribution, + FrontendPort: to.Int32Ptr(port.Port), + BackendPort: to.Int32Ptr(port.Port), + DisableOutboundSnat: to.BoolPtr(az.disableLoadBalancerOutboundSNAT()), + EnableTCPReset: enableTCPReset, + EnableFloatingIP: to.BoolPtr(true), + }, + } + + if port.Protocol == v1.ProtocolTCP { + expectedRule.LoadBalancingRulePropertiesFormat.IdleTimeoutInMinutes = lbIdleTimeout + } - expectedRules = append(expectedRules, expectedRule) + if requiresInternalLoadBalancer(service) && + strings.EqualFold(az.LoadBalancerSku, loadBalancerSkuStandard) && + strings.EqualFold(service.Annotations[ServiceAnnotationLoadBalancerEnableHighAvailabilityPorts], "true") { + expectedRule.FrontendPort = to.Int32Ptr(0) + expectedRule.BackendPort = to.Int32Ptr(0) + expectedRule.Protocol = network.TransportProtocolAll + highAvailabilityPortsEnabled = true } + + // we didn't construct the probe objects for UDP or SCTP because they're not allowed on Azure. + // However, when externalTrafficPolicy is Local, Kubernetes HTTP health check would be used for probing. + if servicehelpers.NeedsHealthCheck(service) || (port.Protocol != v1.ProtocolUDP && port.Protocol != v1.ProtocolSCTP) { + expectedRule.Probe = &network.SubResource{ + ID: to.StringPtr(az.getLoadBalancerProbeID(lbName, az.getLoadBalancerResourceGroup(), lbRuleName)), + } + } + + expectedRules = append(expectedRules, expectedRule) } return expectedProbes, expectedRules, nil diff --git a/vendor/k8s.io/legacy-cloud-providers/azure/azure_vmss.go b/vendor/k8s.io/legacy-cloud-providers/azure/azure_vmss.go index 4143bda3d654..8504aada304b 100644 --- a/vendor/k8s.io/legacy-cloud-providers/azure/azure_vmss.go +++ b/vendor/k8s.io/legacy-cloud-providers/azure/azure_vmss.go @@ -740,7 +740,7 @@ func (ss *scaleSet) getAgentPoolScaleSets(nodes []*v1.Node) (*[]string, error) { // (depending vmType configured) for service load balancer. If the service has // no loadbalancer mode annotation returns the primary VMSet. If service annotation // for loadbalancer exists then return the eligible VMSet. -func (ss *scaleSet) GetVMSetNames(service *v1.Service, nodes []*v1.Node) (vmSetNames *[]string, err error) { +func (ss *scaleSet) GetVMSetNames(service *v1.Service, nodes []*v1.Node) (*[]string, error) { hasMode, isAuto, serviceVMSetNames := getServiceLoadBalancerMode(service) useSingleSLB := ss.useStandardLoadBalancer() && !ss.EnableMultipleStandardLoadBalancers if !hasMode || useSingleSLB { @@ -764,7 +764,7 @@ func (ss *scaleSet) GetVMSetNames(service *v1.Service, nodes []*v1.Node) (vmSetN sort.Strings(*scaleSetNames) if !isAuto { - if serviceVMSetNames == nil || len(serviceVMSetNames) == 0 { + if len(serviceVMSetNames) == 0 { return nil, fmt.Errorf("service annotation for LoadBalancerMode is empty, it should have __auto__ or availability sets value") } // validate scale set exists @@ -782,10 +782,10 @@ func (ss *scaleSet) GetVMSetNames(service *v1.Service, nodes []*v1.Node) (vmSetN return nil, fmt.Errorf("scale set (%s) - not found", serviceVMSetNames[sasx]) } } - vmSetNames = &serviceVMSetNames + scaleSetNames = &serviceVMSetNames } - return vmSetNames, nil + return scaleSetNames, nil } // extractResourceGroupByVMSSNicID extracts the resource group name by vmss nicID. diff --git a/vendor/k8s.io/legacy-cloud-providers/azure/cache/BUILD b/vendor/k8s.io/legacy-cloud-providers/azure/cache/BUILD deleted file mode 100644 index 5209c698f7e5..000000000000 --- a/vendor/k8s.io/legacy-cloud-providers/azure/cache/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "azure_cache.go", - "doc.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/legacy-cloud-providers/azure/cache", - importpath = "k8s.io/legacy-cloud-providers/azure/cache", - visibility = ["//visibility:public"], - deps = ["//staging/src/k8s.io/client-go/tools/cache:go_default_library"], -) - -go_test( - name = "go_default_test", - srcs = ["azure_cache_test.go"], - embed = [":go_default_library"], - deps = ["//vendor/github.com/stretchr/testify/assert:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/legacy-cloud-providers/azure/clients/BUILD b/vendor/k8s.io/legacy-cloud-providers/azure/clients/BUILD deleted file mode 100644 index f2adee987c60..000000000000 --- a/vendor/k8s.io/legacy-cloud-providers/azure/clients/BUILD +++ /dev/null @@ -1,61 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "azure_client_config.go", - "doc.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/legacy-cloud-providers/azure/clients", - importpath = "k8s.io/legacy-cloud-providers/azure/clients", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient:all-srcs", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/containerserviceclient:all-srcs", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/deploymentclient:all-srcs", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/diskclient:all-srcs", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/fileclient:all-srcs", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/interfaceclient:all-srcs", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/loadbalancerclient:all-srcs", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/publicipclient:all-srcs", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/routeclient:all-srcs", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/routetableclient:all-srcs", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/securitygroupclient:all-srcs", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/snapshotclient:all-srcs", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/storageaccountclient:all-srcs", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/subnetclient:all-srcs", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/vmclient:all-srcs", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/vmsizeclient:all-srcs", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/vmssclient:all-srcs", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/vmssvmclient:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["azure_client_config_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) diff --git a/vendor/k8s.io/legacy-cloud-providers/azure/clients/armclient/BUILD b/vendor/k8s.io/legacy-cloud-providers/azure/clients/armclient/BUILD deleted file mode 100644 index 74dc22cddbce..000000000000 --- a/vendor/k8s.io/legacy-cloud-providers/azure/clients/armclient/BUILD +++ /dev/null @@ -1,48 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "azure_armclient.go", - "doc.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/legacy-cloud-providers/azure/clients/armclient", - importpath = "k8s.io/legacy-cloud-providers/azure/clients/armclient", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/client-go/pkg/version:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/azure:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["azure_armclient_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient/mockarmclient:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/legacy-cloud-providers/azure/clients/containerserviceclient/BUILD b/vendor/k8s.io/legacy-cloud-providers/azure/clients/containerserviceclient/BUILD deleted file mode 100644 index abbb1526082c..000000000000 --- a/vendor/k8s.io/legacy-cloud-providers/azure/clients/containerserviceclient/BUILD +++ /dev/null @@ -1,60 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "azure_containerserviceclient.go", - "doc.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/legacy-cloud-providers/azure/clients/containerserviceclient", - importpath = "k8s.io/legacy-cloud-providers/azure/clients/containerserviceclient", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/metrics:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/containerservice/mgmt/2020-04-01/containerservice:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/azure:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/to:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/containerserviceclient/mockcontainerserviceclient:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["azure_containerserviceclient_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient/mockarmclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/containerservice/mgmt/2020-04-01/containerservice:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/to:go_default_library", - "//vendor/github.com/golang/mock/gomock:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) diff --git a/vendor/k8s.io/legacy-cloud-providers/azure/clients/deploymentclient/BUILD b/vendor/k8s.io/legacy-cloud-providers/azure/clients/deploymentclient/BUILD deleted file mode 100644 index cf55de61bc9f..000000000000 --- a/vendor/k8s.io/legacy-cloud-providers/azure/clients/deploymentclient/BUILD +++ /dev/null @@ -1,60 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "azure_deploymentclient.go", - "doc.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/legacy-cloud-providers/azure/clients/deploymentclient", - importpath = "k8s.io/legacy-cloud-providers/azure/clients/deploymentclient", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/metrics:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/resources/mgmt/2017-05-10/resources:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/azure:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/to:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/deploymentclient/mockdeploymentclient:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["azure_deploymentclient_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient/mockarmclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/resources/mgmt/2017-05-10/resources:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/to:go_default_library", - "//vendor/github.com/golang/mock/gomock:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) diff --git a/vendor/k8s.io/legacy-cloud-providers/azure/clients/diskclient/BUILD b/vendor/k8s.io/legacy-cloud-providers/azure/clients/diskclient/BUILD deleted file mode 100644 index 283a95d042a9..000000000000 --- a/vendor/k8s.io/legacy-cloud-providers/azure/clients/diskclient/BUILD +++ /dev/null @@ -1,59 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "azure_diskclient.go", - "doc.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/legacy-cloud-providers/azure/clients/diskclient", - importpath = "k8s.io/legacy-cloud-providers/azure/clients/diskclient", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/metrics:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/azure:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/to:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["azure_diskclient_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient/mockarmclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/to:go_default_library", - "//vendor/github.com/golang/mock/gomock:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/diskclient/mockdiskclient:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/legacy-cloud-providers/azure/clients/diskclient/mockdiskclient/BUILD b/vendor/k8s.io/legacy-cloud-providers/azure/clients/diskclient/mockdiskclient/BUILD deleted file mode 100644 index 7bf9623fd94f..000000000000 --- a/vendor/k8s.io/legacy-cloud-providers/azure/clients/diskclient/mockdiskclient/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/legacy-cloud-providers/azure/clients/diskclient/mockdiskclient", - importpath = "k8s.io/legacy-cloud-providers/azure/clients/diskclient/mockdiskclient", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute:go_default_library", - "//vendor/github.com/golang/mock/gomock:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/legacy-cloud-providers/azure/clients/diskclient/mockdiskclient/interface.go b/vendor/k8s.io/legacy-cloud-providers/azure/clients/diskclient/mockdiskclient/interface.go index eb60a91264ba..bdf8ee50de60 100644 --- a/vendor/k8s.io/legacy-cloud-providers/azure/clients/diskclient/mockdiskclient/interface.go +++ b/vendor/k8s.io/legacy-cloud-providers/azure/clients/diskclient/mockdiskclient/interface.go @@ -119,5 +119,5 @@ func (m *MockInterface) ListByResourceGroup(ctx context.Context, resourceGroupNa // ListByResourceGroup indicates an expected call of ListByResourceGroup func (mr *MockInterfaceMockRecorder) ListByResourceGroup(ctx, resourceGroupName interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListByResourceGroup", reflect.TypeOf((*MockInterface)(nil).Delete), ctx, resourceGroupName) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListByResourceGroup", reflect.TypeOf((*MockInterface)(nil).ListByResourceGroup), ctx, resourceGroupName) } diff --git a/vendor/k8s.io/legacy-cloud-providers/azure/clients/fileclient/BUILD b/vendor/k8s.io/legacy-cloud-providers/azure/clients/fileclient/BUILD deleted file mode 100644 index 379b18e11a0c..000000000000 --- a/vendor/k8s.io/legacy-cloud-providers/azure/clients/fileclient/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "azure_fileclient.go", - "doc.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/legacy-cloud-providers/azure/clients/fileclient", - importpath = "k8s.io/legacy-cloud-providers/azure/clients/fileclient", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/storage/mgmt/2019-06-01/storage:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/fileclient/mockfileclient:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/legacy-cloud-providers/azure/clients/interfaceclient/BUILD b/vendor/k8s.io/legacy-cloud-providers/azure/clients/interfaceclient/BUILD deleted file mode 100644 index 2c84d4679cac..000000000000 --- a/vendor/k8s.io/legacy-cloud-providers/azure/clients/interfaceclient/BUILD +++ /dev/null @@ -1,58 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "azure_interfaceclient.go", - "doc.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/legacy-cloud-providers/azure/clients/interfaceclient", - importpath = "k8s.io/legacy-cloud-providers/azure/clients/interfaceclient", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/metrics:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-06-01/network:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/azure:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["azure_interfaceclient_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient/mockarmclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-06-01/network:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/to:go_default_library", - "//vendor/github.com/golang/mock/gomock:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/interfaceclient/mockinterfaceclient:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/legacy-cloud-providers/azure/clients/interfaceclient/mockinterfaceclient/BUILD b/vendor/k8s.io/legacy-cloud-providers/azure/clients/interfaceclient/mockinterfaceclient/BUILD deleted file mode 100644 index e04b515f1bbc..000000000000 --- a/vendor/k8s.io/legacy-cloud-providers/azure/clients/interfaceclient/mockinterfaceclient/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/legacy-cloud-providers/azure/clients/interfaceclient/mockinterfaceclient", - importpath = "k8s.io/legacy-cloud-providers/azure/clients/interfaceclient/mockinterfaceclient", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-06-01/network:go_default_library", - "//vendor/github.com/golang/mock/gomock:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/legacy-cloud-providers/azure/clients/loadbalancerclient/BUILD b/vendor/k8s.io/legacy-cloud-providers/azure/clients/loadbalancerclient/BUILD deleted file mode 100644 index 60885a8a974a..000000000000 --- a/vendor/k8s.io/legacy-cloud-providers/azure/clients/loadbalancerclient/BUILD +++ /dev/null @@ -1,59 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "azure_loadbalancerclient.go", - "doc.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/legacy-cloud-providers/azure/clients/loadbalancerclient", - importpath = "k8s.io/legacy-cloud-providers/azure/clients/loadbalancerclient", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/metrics:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-06-01/network:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/azure:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/to:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["azure_loadbalancerclient_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient/mockarmclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-06-01/network:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/to:go_default_library", - "//vendor/github.com/golang/mock/gomock:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/loadbalancerclient/mockloadbalancerclient:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/legacy-cloud-providers/azure/clients/loadbalancerclient/mockloadbalancerclient/BUILD b/vendor/k8s.io/legacy-cloud-providers/azure/clients/loadbalancerclient/mockloadbalancerclient/BUILD deleted file mode 100644 index 3f823f0ea08f..000000000000 --- a/vendor/k8s.io/legacy-cloud-providers/azure/clients/loadbalancerclient/mockloadbalancerclient/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/legacy-cloud-providers/azure/clients/loadbalancerclient/mockloadbalancerclient", - importpath = "k8s.io/legacy-cloud-providers/azure/clients/loadbalancerclient/mockloadbalancerclient", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-06-01/network:go_default_library", - "//vendor/github.com/golang/mock/gomock:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/legacy-cloud-providers/azure/clients/publicipclient/BUILD b/vendor/k8s.io/legacy-cloud-providers/azure/clients/publicipclient/BUILD deleted file mode 100644 index 94d81d2478be..000000000000 --- a/vendor/k8s.io/legacy-cloud-providers/azure/clients/publicipclient/BUILD +++ /dev/null @@ -1,60 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "azure_publicipclient.go", - "doc.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/legacy-cloud-providers/azure/clients/publicipclient", - importpath = "k8s.io/legacy-cloud-providers/azure/clients/publicipclient", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/metrics:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-06-01/network:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/azure:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/to:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["azure_publicipclient_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient/mockarmclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-06-01/network:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/to:go_default_library", - "//vendor/github.com/golang/mock/gomock:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/publicipclient/mockpublicipclient:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/legacy-cloud-providers/azure/clients/publicipclient/mockpublicipclient/BUILD b/vendor/k8s.io/legacy-cloud-providers/azure/clients/publicipclient/mockpublicipclient/BUILD deleted file mode 100644 index 468f5b94921e..000000000000 --- a/vendor/k8s.io/legacy-cloud-providers/azure/clients/publicipclient/mockpublicipclient/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/legacy-cloud-providers/azure/clients/publicipclient/mockpublicipclient", - importpath = "k8s.io/legacy-cloud-providers/azure/clients/publicipclient/mockpublicipclient", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-06-01/network:go_default_library", - "//vendor/github.com/golang/mock/gomock:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/legacy-cloud-providers/azure/clients/routeclient/BUILD b/vendor/k8s.io/legacy-cloud-providers/azure/clients/routeclient/BUILD deleted file mode 100644 index 1ddcf7db6386..000000000000 --- a/vendor/k8s.io/legacy-cloud-providers/azure/clients/routeclient/BUILD +++ /dev/null @@ -1,58 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "azure_routeclient.go", - "doc.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/legacy-cloud-providers/azure/clients/routeclient", - importpath = "k8s.io/legacy-cloud-providers/azure/clients/routeclient", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/metrics:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-06-01/network:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/azure:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["azure_routeclient_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient/mockarmclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-06-01/network:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/to:go_default_library", - "//vendor/github.com/golang/mock/gomock:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/routeclient/mockrouteclient:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/legacy-cloud-providers/azure/clients/routeclient/mockrouteclient/BUILD b/vendor/k8s.io/legacy-cloud-providers/azure/clients/routeclient/mockrouteclient/BUILD deleted file mode 100644 index e7a4b5ea88a6..000000000000 --- a/vendor/k8s.io/legacy-cloud-providers/azure/clients/routeclient/mockrouteclient/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/legacy-cloud-providers/azure/clients/routeclient/mockrouteclient", - importpath = "k8s.io/legacy-cloud-providers/azure/clients/routeclient/mockrouteclient", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-06-01/network:go_default_library", - "//vendor/github.com/golang/mock/gomock:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/legacy-cloud-providers/azure/clients/routetableclient/BUILD b/vendor/k8s.io/legacy-cloud-providers/azure/clients/routetableclient/BUILD deleted file mode 100644 index 2c4a0860512a..000000000000 --- a/vendor/k8s.io/legacy-cloud-providers/azure/clients/routetableclient/BUILD +++ /dev/null @@ -1,59 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "azure_routetableclient.go", - "doc.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/legacy-cloud-providers/azure/clients/routetableclient", - importpath = "k8s.io/legacy-cloud-providers/azure/clients/routetableclient", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/metrics:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-06-01/network:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/azure:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["azure_routetableclient_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient/mockarmclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-06-01/network:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/to:go_default_library", - "//vendor/github.com/golang/mock/gomock:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/routetableclient/mockroutetableclient:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/legacy-cloud-providers/azure/clients/routetableclient/mockroutetableclient/BUILD b/vendor/k8s.io/legacy-cloud-providers/azure/clients/routetableclient/mockroutetableclient/BUILD deleted file mode 100644 index e024049346b5..000000000000 --- a/vendor/k8s.io/legacy-cloud-providers/azure/clients/routetableclient/mockroutetableclient/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/legacy-cloud-providers/azure/clients/routetableclient/mockroutetableclient", - importpath = "k8s.io/legacy-cloud-providers/azure/clients/routetableclient/mockroutetableclient", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-06-01/network:go_default_library", - "//vendor/github.com/golang/mock/gomock:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/legacy-cloud-providers/azure/clients/securitygroupclient/BUILD b/vendor/k8s.io/legacy-cloud-providers/azure/clients/securitygroupclient/BUILD deleted file mode 100644 index 9bf929c4f527..000000000000 --- a/vendor/k8s.io/legacy-cloud-providers/azure/clients/securitygroupclient/BUILD +++ /dev/null @@ -1,60 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "azure_securitygroupclient.go", - "doc.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/legacy-cloud-providers/azure/clients/securitygroupclient", - importpath = "k8s.io/legacy-cloud-providers/azure/clients/securitygroupclient", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/metrics:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-06-01/network:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/azure:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/to:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["azure_securitygroupclient_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient/mockarmclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-06-01/network:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/to:go_default_library", - "//vendor/github.com/golang/mock/gomock:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/securitygroupclient/mocksecuritygroupclient:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/legacy-cloud-providers/azure/clients/securitygroupclient/mocksecuritygroupclient/BUILD b/vendor/k8s.io/legacy-cloud-providers/azure/clients/securitygroupclient/mocksecuritygroupclient/BUILD deleted file mode 100644 index 26d4497e9a87..000000000000 --- a/vendor/k8s.io/legacy-cloud-providers/azure/clients/securitygroupclient/mocksecuritygroupclient/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/legacy-cloud-providers/azure/clients/securitygroupclient/mocksecuritygroupclient", - importpath = "k8s.io/legacy-cloud-providers/azure/clients/securitygroupclient/mocksecuritygroupclient", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-06-01/network:go_default_library", - "//vendor/github.com/golang/mock/gomock:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/legacy-cloud-providers/azure/clients/snapshotclient/BUILD b/vendor/k8s.io/legacy-cloud-providers/azure/clients/snapshotclient/BUILD deleted file mode 100644 index 2fcb03133155..000000000000 --- a/vendor/k8s.io/legacy-cloud-providers/azure/clients/snapshotclient/BUILD +++ /dev/null @@ -1,60 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "azure_snapshotclient.go", - "doc.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/legacy-cloud-providers/azure/clients/snapshotclient", - importpath = "k8s.io/legacy-cloud-providers/azure/clients/snapshotclient", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/metrics:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/azure:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/to:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["azure_snapshotclient_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient/mockarmclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/to:go_default_library", - "//vendor/github.com/golang/mock/gomock:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/snapshotclient/mocksnapshotclient:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/legacy-cloud-providers/azure/clients/storageaccountclient/BUILD b/vendor/k8s.io/legacy-cloud-providers/azure/clients/storageaccountclient/BUILD deleted file mode 100644 index 396823b9aef2..000000000000 --- a/vendor/k8s.io/legacy-cloud-providers/azure/clients/storageaccountclient/BUILD +++ /dev/null @@ -1,60 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "azure_storageaccountclient.go", - "doc.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/legacy-cloud-providers/azure/clients/storageaccountclient", - importpath = "k8s.io/legacy-cloud-providers/azure/clients/storageaccountclient", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/metrics:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/storage/mgmt/2019-06-01/storage:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/azure:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/to:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["azure_storageaccountclient_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient/mockarmclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/storage/mgmt/2019-06-01/storage:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/to:go_default_library", - "//vendor/github.com/golang/mock/gomock:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/storageaccountclient/mockstorageaccountclient:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/legacy-cloud-providers/azure/clients/subnetclient/BUILD b/vendor/k8s.io/legacy-cloud-providers/azure/clients/subnetclient/BUILD deleted file mode 100644 index 34e04209a3ff..000000000000 --- a/vendor/k8s.io/legacy-cloud-providers/azure/clients/subnetclient/BUILD +++ /dev/null @@ -1,60 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "azure_subnetclient.go", - "doc.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/legacy-cloud-providers/azure/clients/subnetclient", - importpath = "k8s.io/legacy-cloud-providers/azure/clients/subnetclient", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/metrics:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-06-01/network:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/azure:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/to:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["azure_subnetclient_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient/mockarmclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-06-01/network:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/to:go_default_library", - "//vendor/github.com/golang/mock/gomock:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/subnetclient/mocksubnetclient:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/legacy-cloud-providers/azure/clients/subnetclient/mocksubnetclient/BUILD b/vendor/k8s.io/legacy-cloud-providers/azure/clients/subnetclient/mocksubnetclient/BUILD deleted file mode 100644 index cb107ecc0916..000000000000 --- a/vendor/k8s.io/legacy-cloud-providers/azure/clients/subnetclient/mocksubnetclient/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/legacy-cloud-providers/azure/clients/subnetclient/mocksubnetclient", - importpath = "k8s.io/legacy-cloud-providers/azure/clients/subnetclient/mocksubnetclient", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-06-01/network:go_default_library", - "//vendor/github.com/golang/mock/gomock:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/legacy-cloud-providers/azure/clients/vmclient/BUILD b/vendor/k8s.io/legacy-cloud-providers/azure/clients/vmclient/BUILD deleted file mode 100644 index 72c070260c0a..000000000000 --- a/vendor/k8s.io/legacy-cloud-providers/azure/clients/vmclient/BUILD +++ /dev/null @@ -1,60 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "azure_vmclient.go", - "doc.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/legacy-cloud-providers/azure/clients/vmclient", - importpath = "k8s.io/legacy-cloud-providers/azure/clients/vmclient", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/metrics:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/azure:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/to:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["azure_vmclient_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient/mockarmclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/to:go_default_library", - "//vendor/github.com/golang/mock/gomock:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/vmclient/mockvmclient:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/legacy-cloud-providers/azure/clients/vmclient/mockvmclient/BUILD b/vendor/k8s.io/legacy-cloud-providers/azure/clients/vmclient/mockvmclient/BUILD deleted file mode 100644 index 3318fca517b9..000000000000 --- a/vendor/k8s.io/legacy-cloud-providers/azure/clients/vmclient/mockvmclient/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/legacy-cloud-providers/azure/clients/vmclient/mockvmclient", - importpath = "k8s.io/legacy-cloud-providers/azure/clients/vmclient/mockvmclient", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute:go_default_library", - "//vendor/github.com/golang/mock/gomock:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/legacy-cloud-providers/azure/clients/vmsizeclient/BUILD b/vendor/k8s.io/legacy-cloud-providers/azure/clients/vmsizeclient/BUILD deleted file mode 100644 index 00bd45b76e35..000000000000 --- a/vendor/k8s.io/legacy-cloud-providers/azure/clients/vmsizeclient/BUILD +++ /dev/null @@ -1,59 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "azure_vmsizeclient.go", - "doc.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/legacy-cloud-providers/azure/clients/vmsizeclient", - importpath = "k8s.io/legacy-cloud-providers/azure/clients/vmsizeclient", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/metrics:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/azure:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["azure_vmsizeclient_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient/mockarmclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/to:go_default_library", - "//vendor/github.com/golang/mock/gomock:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/vmsizeclient/mockvmsizeclient:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/legacy-cloud-providers/azure/clients/vmssclient/BUILD b/vendor/k8s.io/legacy-cloud-providers/azure/clients/vmssclient/BUILD deleted file mode 100644 index e90d2d3bbec7..000000000000 --- a/vendor/k8s.io/legacy-cloud-providers/azure/clients/vmssclient/BUILD +++ /dev/null @@ -1,61 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "azure_vmssclient.go", - "doc.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/legacy-cloud-providers/azure/clients/vmssclient", - importpath = "k8s.io/legacy-cloud-providers/azure/clients/vmssclient", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/metrics:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/azure:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/to:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["azure_vmssclient_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient/mockarmclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/azure:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/to:go_default_library", - "//vendor/github.com/golang/mock/gomock:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/vmssclient/mockvmssclient:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/legacy-cloud-providers/azure/clients/vmssclient/mockvmssclient/BUILD b/vendor/k8s.io/legacy-cloud-providers/azure/clients/vmssclient/mockvmssclient/BUILD deleted file mode 100644 index 2ffffb33bfd8..000000000000 --- a/vendor/k8s.io/legacy-cloud-providers/azure/clients/vmssclient/mockvmssclient/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/legacy-cloud-providers/azure/clients/vmssclient/mockvmssclient", - importpath = "k8s.io/legacy-cloud-providers/azure/clients/vmssclient/mockvmssclient", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/azure:go_default_library", - "//vendor/github.com/golang/mock/gomock:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/legacy-cloud-providers/azure/clients/vmssvmclient/BUILD b/vendor/k8s.io/legacy-cloud-providers/azure/clients/vmssvmclient/BUILD deleted file mode 100644 index b1b538132d66..000000000000 --- a/vendor/k8s.io/legacy-cloud-providers/azure/clients/vmssvmclient/BUILD +++ /dev/null @@ -1,61 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "azure_vmssvmclient.go", - "doc.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/legacy-cloud-providers/azure/clients/vmssvmclient", - importpath = "k8s.io/legacy-cloud-providers/azure/clients/vmssvmclient", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/metrics:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/azure:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/to:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["azure_vmssvmclient_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient/mockarmclient:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/to:go_default_library", - "//vendor/github.com/golang/mock/gomock:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/vmssvmclient/mockvmssvmclient:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/legacy-cloud-providers/azure/clients/vmssvmclient/mockvmssvmclient/BUILD b/vendor/k8s.io/legacy-cloud-providers/azure/clients/vmssvmclient/mockvmssvmclient/BUILD deleted file mode 100644 index 99d0d278c069..000000000000 --- a/vendor/k8s.io/legacy-cloud-providers/azure/clients/vmssvmclient/mockvmssvmclient/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "interface.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/legacy-cloud-providers/azure/clients/vmssvmclient/mockvmssvmclient", - importpath = "k8s.io/legacy-cloud-providers/azure/clients/vmssvmclient/mockvmssvmclient", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", - "//vendor/github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute:go_default_library", - "//vendor/github.com/golang/mock/gomock:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/legacy-cloud-providers/azure/metrics/BUILD b/vendor/k8s.io/legacy-cloud-providers/azure/metrics/BUILD deleted file mode 100644 index 46ce36be8966..000000000000 --- a/vendor/k8s.io/legacy-cloud-providers/azure/metrics/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "azure_metrics.go", - "doc.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/legacy-cloud-providers/azure/metrics", - importpath = "k8s.io/legacy-cloud-providers/azure/metrics", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["azure_metrics_test.go"], - embed = [":go_default_library"], - deps = ["//vendor/github.com/stretchr/testify/assert:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/legacy-cloud-providers/azure/retry/BUILD b/vendor/k8s.io/legacy-cloud-providers/azure/retry/BUILD deleted file mode 100644 index 5e39a289e59a..000000000000 --- a/vendor/k8s.io/legacy-cloud-providers/azure/retry/BUILD +++ /dev/null @@ -1,46 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "azure_error.go", - "azure_retry.go", - "doc.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/legacy-cloud-providers/azure/retry", - importpath = "k8s.io/legacy-cloud-providers/azure/retry", - visibility = ["//visibility:public"], - deps = [ - "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/mocks:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "azure_error_test.go", - "azure_retry_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/mocks:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/legacy-cloud-providers/gce/BUILD b/vendor/k8s.io/legacy-cloud-providers/gce/BUILD deleted file mode 100644 index 5da7a3d6307c..000000000000 --- a/vendor/k8s.io/legacy-cloud-providers/gce/BUILD +++ /dev/null @@ -1,146 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "gce.go", - "gce_address_manager.go", - "gce_addresses.go", - "gce_alpha.go", - "gce_annotations.go", - "gce_backendservice.go", - "gce_cert.go", - "gce_clusterid.go", - "gce_clusters.go", - "gce_disks.go", - "gce_fake.go", - "gce_firewall.go", - "gce_forwardingrule.go", - "gce_healthchecks.go", - "gce_instancegroup.go", - "gce_instances.go", - "gce_interfaces.go", - "gce_loadbalancer.go", - "gce_loadbalancer_external.go", - "gce_loadbalancer_internal.go", - "gce_loadbalancer_metrics.go", - "gce_loadbalancer_naming.go", - "gce_networkendpointgroup.go", - "gce_routes.go", - "gce_securitypolicy.go", - "gce_targetpool.go", - "gce_targetproxy.go", - "gce_tpu.go", - "gce_urlmap.go", - "gce_util.go", - "gce_zones.go", - "metrics.go", - "support.go", - "token_source.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/legacy-cloud-providers/gce", - importpath = "k8s.io/legacy-cloud-providers/gce", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/version:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/pkg/version:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/cloud-provider:go_default_library", - "//staging/src/k8s.io/cloud-provider/service/helpers:go_default_library", - "//staging/src/k8s.io/cloud-provider/volume:go_default_library", - "//staging/src/k8s.io/cloud-provider/volume/errors:go_default_library", - "//staging/src/k8s.io/cloud-provider/volume/helpers:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - "//vendor/cloud.google.com/go/compute/metadata:go_default_library", - "//vendor/github.com/GoogleCloudPlatform/k8s-cloud-provider/pkg/cloud:go_default_library", - "//vendor/github.com/GoogleCloudPlatform/k8s-cloud-provider/pkg/cloud/filter:go_default_library", - "//vendor/github.com/GoogleCloudPlatform/k8s-cloud-provider/pkg/cloud/meta:go_default_library", - "//vendor/github.com/GoogleCloudPlatform/k8s-cloud-provider/pkg/cloud/mock:go_default_library", - "//vendor/golang.org/x/oauth2:go_default_library", - "//vendor/golang.org/x/oauth2/google:go_default_library", - "//vendor/google.golang.org/api/compute/v0.alpha:go_default_library", - "//vendor/google.golang.org/api/compute/v0.beta:go_default_library", - "//vendor/google.golang.org/api/compute/v1:go_default_library", - "//vendor/google.golang.org/api/container/v1:go_default_library", - "//vendor/google.golang.org/api/googleapi:go_default_library", - "//vendor/google.golang.org/api/option:go_default_library", - "//vendor/google.golang.org/api/tpu/v1:go_default_library", - "//vendor/gopkg.in/gcfg.v1:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "gce_address_manager_test.go", - "gce_annotations_test.go", - "gce_disks_test.go", - "gce_healthchecks_test.go", - "gce_instances_test.go", - "gce_loadbalancer_external_test.go", - "gce_loadbalancer_internal_test.go", - "gce_loadbalancer_metrics_test.go", - "gce_loadbalancer_test.go", - "gce_loadbalancer_utils_test.go", - "gce_test.go", - "gce_util_test.go", - "metrics_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/client-go/tools/record:go_default_library", - "//staging/src/k8s.io/cloud-provider:go_default_library", - "//staging/src/k8s.io/cloud-provider/service/helpers:go_default_library", - "//vendor/github.com/GoogleCloudPlatform/k8s-cloud-provider/pkg/cloud:go_default_library", - "//vendor/github.com/GoogleCloudPlatform/k8s-cloud-provider/pkg/cloud/meta:go_default_library", - "//vendor/github.com/GoogleCloudPlatform/k8s-cloud-provider/pkg/cloud/mock:go_default_library", - "//vendor/github.com/google/go-cmp/cmp:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - "//vendor/golang.org/x/oauth2/google:go_default_library", - "//vendor/google.golang.org/api/compute/v0.alpha:go_default_library", - "//vendor/google.golang.org/api/compute/v0.beta:go_default_library", - "//vendor/google.golang.org/api/compute/v1:go_default_library", - "//vendor/google.golang.org/api/googleapi:go_default_library", - "//vendor/k8s.io/utils/net:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/legacy-cloud-providers/gce/OWNERS b/vendor/k8s.io/legacy-cloud-providers/gce/OWNERS index b1c2f63c96b4..a43ade8d6cc6 100644 --- a/vendor/k8s.io/legacy-cloud-providers/gce/OWNERS +++ b/vendor/k8s.io/legacy-cloud-providers/gce/OWNERS @@ -1,6 +1,7 @@ # See the OWNERS docs at https://go.k8s.io/owners - -approvers: +# We are no longer accepting features into k8s.io/legacy-cloud-providers. +# Any kind/feature PRs must be approved by SIG Cloud Provider going forward. +emeritus_approvers: - saad-ali - jingxu97 - bowei diff --git a/vendor/k8s.io/legacy-cloud-providers/gce/gce_alpha.go b/vendor/k8s.io/legacy-cloud-providers/gce/gce_alpha.go index 98c31e5acbf7..6f4821b69d47 100644 --- a/vendor/k8s.io/legacy-cloud-providers/gce/gce_alpha.go +++ b/vendor/k8s.io/legacy-cloud-providers/gce/gce_alpha.go @@ -22,9 +22,6 @@ const ( // AlphaFeatureILBSubsets allows InternalLoadBalancer services to include a subset // of cluster nodes as backends instead of all nodes. AlphaFeatureILBSubsets = "ILBSubsets" - // AlphaFeatureILBCustomSubnet allows InternalLoadBalancer services to specify a - // network subnet to allocate ip addresses from. - AlphaFeatureILBCustomSubnet = "ILBCustomSubnet" ) // AlphaFeatureGate contains a mapping of alpha features to whether they are enabled diff --git a/vendor/k8s.io/legacy-cloud-providers/gce/gce_disks.go b/vendor/k8s.io/legacy-cloud-providers/gce/gce_disks.go index 3f30cacee9bc..3a913fcfc293 100644 --- a/vendor/k8s.io/legacy-cloud-providers/gce/gce_disks.go +++ b/vendor/k8s.io/legacy-cloud-providers/gce/gce_disks.go @@ -515,7 +515,10 @@ func (g *Cloud) GetLabelsForVolume(ctx context.Context, pv *v1.PersistentVolume) // If the zone is already labeled, honor the hint name := pv.Spec.GCEPersistentDisk.PDName - zone := pv.Labels[v1.LabelFailureDomainBetaZone] + zone := pv.Labels[v1.LabelTopologyZone] + if zone == "" { + zone = pv.Labels[v1.LabelFailureDomainBetaZone] + } disk, err := g.getDiskByNameAndOptionalLabelZones(name, zone) if err != nil { @@ -848,7 +851,7 @@ func (g *Cloud) ResizeDisk(diskToResize string, oldSize resource.Quantity, newSi } // GetAutoLabelsForPD builds the labels that should be automatically added to a PersistentVolume backed by a GCE PD -// Specifically, this builds FailureDomain (zone) and Region labels. +// Specifically, this builds Topology (zone) and Region labels. // The PersistentVolumeLabel admission controller calls this and adds the labels when a PV is created. func (g *Cloud) GetAutoLabelsForPD(disk *Disk) (map[string]string, error) { labels := make(map[string]string) @@ -858,16 +861,16 @@ func (g *Cloud) GetAutoLabelsForPD(disk *Disk) (map[string]string, error) { // Unexpected, but sanity-check return nil, fmt.Errorf("PD did not have zone/region information: %v", disk) } - labels[v1.LabelFailureDomainBetaZone] = zoneInfo.zone - labels[v1.LabelFailureDomainBetaRegion] = disk.Region + labels[v1.LabelTopologyZone] = zoneInfo.zone + labels[v1.LabelTopologyRegion] = disk.Region case multiZone: if zoneInfo.replicaZones == nil || zoneInfo.replicaZones.Len() <= 0 { // Unexpected, but sanity-check return nil, fmt.Errorf("PD is regional but does not have any replicaZones specified: %v", disk) } - labels[v1.LabelFailureDomainBetaZone] = + labels[v1.LabelTopologyZone] = volumehelpers.ZonesSetToLabelValue(zoneInfo.replicaZones) - labels[v1.LabelFailureDomainBetaRegion] = disk.Region + labels[v1.LabelTopologyRegion] = disk.Region case nil: // Unexpected, but sanity-check return nil, fmt.Errorf("PD did not have ZoneInfo: %v", disk) diff --git a/vendor/k8s.io/legacy-cloud-providers/gce/gce_instances.go b/vendor/k8s.io/legacy-cloud-providers/gce/gce_instances.go index cf69332d2517..027c45dddcea 100644 --- a/vendor/k8s.io/legacy-cloud-providers/gce/gce_instances.go +++ b/vendor/k8s.io/legacy-cloud-providers/gce/gce_instances.go @@ -407,7 +407,7 @@ func (g *Cloud) AddSSHKeyToAllInstances(ctx context.Context, user string, keyDat // GetAllCurrentZones returns all the zones in which k8s nodes are currently running func (g *Cloud) GetAllCurrentZones() (sets.String, error) { if g.nodeInformerSynced == nil { - klog.Warningf("Cloud object does not have informers set, should only happen in E2E binary.") + klog.Warning("Cloud object does not have informers set, should only happen in E2E binary.") return g.GetAllZonesFromCloudProvider() } g.nodeZonesLock.Lock() diff --git a/vendor/k8s.io/legacy-cloud-providers/gce/gce_loadbalancer_external.go b/vendor/k8s.io/legacy-cloud-providers/gce/gce_loadbalancer_external.go index f9dc2e141561..65ef48af68a0 100644 --- a/vendor/k8s.io/legacy-cloud-providers/gce/gce_loadbalancer_external.go +++ b/vendor/k8s.io/legacy-cloud-providers/gce/gce_loadbalancer_external.go @@ -170,7 +170,7 @@ func (g *Cloud) ensureExternalLoadBalancer(clusterName string, clusterID string, return nil, err } - firewallExists, firewallNeedsUpdate, err := g.firewallNeedsUpdate(loadBalancerName, serviceName.String(), g.region, ipAddressToUse, ports, sourceRanges) + firewallExists, firewallNeedsUpdate, err := g.firewallNeedsUpdate(loadBalancerName, serviceName.String(), ipAddressToUse, ports, sourceRanges) if err != nil { return nil, err } @@ -181,13 +181,13 @@ func (g *Cloud) ensureExternalLoadBalancer(clusterName string, clusterID string, // without needing to be deleted and recreated. if firewallExists { klog.Infof("ensureExternalLoadBalancer(%s): Updating firewall.", lbRefStr) - if err := g.updateFirewall(apiService, MakeFirewallName(loadBalancerName), g.region, desc, sourceRanges, ports, hosts); err != nil { + if err := g.updateFirewall(apiService, MakeFirewallName(loadBalancerName), desc, sourceRanges, ports, hosts); err != nil { return nil, err } klog.Infof("ensureExternalLoadBalancer(%s): Updated firewall.", lbRefStr) } else { klog.Infof("ensureExternalLoadBalancer(%s): Creating firewall.", lbRefStr) - if err := g.createFirewall(apiService, MakeFirewallName(loadBalancerName), g.region, desc, sourceRanges, ports, hosts); err != nil { + if err := g.createFirewall(apiService, MakeFirewallName(loadBalancerName), desc, sourceRanges, ports, hosts); err != nil { return nil, err } klog.Infof("ensureExternalLoadBalancer(%s): Created firewall.", lbRefStr) @@ -845,7 +845,7 @@ func translateAffinityType(affinityType v1.ServiceAffinity) string { } } -func (g *Cloud) firewallNeedsUpdate(name, serviceName, region, ipAddress string, ports []v1.ServicePort, sourceRanges utilnet.IPNetSet) (exists bool, needsUpdate bool, err error) { +func (g *Cloud) firewallNeedsUpdate(name, serviceName, ipAddress string, ports []v1.ServicePort, sourceRanges utilnet.IPNetSet) (exists bool, needsUpdate bool, err error) { fw, err := g.GetFirewall(MakeFirewallName(name)) if err != nil { if isHTTPErrorCode(err, http.StatusNotFound) { @@ -860,15 +860,15 @@ func (g *Cloud) firewallNeedsUpdate(name, serviceName, region, ipAddress string, return true, true, nil } // Make sure the allowed ports match. - allowedPorts := make([]string, len(ports)) - for ix := range ports { - allowedPorts[ix] = strconv.Itoa(int(ports[ix].Port)) - } - if !equalStringSets(allowedPorts, fw.Allowed[0].Ports) { + portNums, portRanges, _ := getPortsAndProtocol(ports) + // This logic checks if the existing firewall rules contains either enumerated service ports or port ranges. + // This is to prevent unnecessary noop updates to the firewall rule when the existing firewall rule is + // set up via the previous pattern using enumerated ports instead of port ranges. + if !equalStringSets(portNums, fw.Allowed[0].Ports) && !equalStringSets(portRanges, fw.Allowed[0].Ports) { return true, true, nil } - // The service controller already verified that the protocol matches on all ports, no need to check. + // The service controller already verified that the protocol matches on all ports, no need to check. actualSourceRanges, err := utilnet.ParseIPNets(fw.SourceRanges...) if err != nil { // This really shouldn't happen... GCE has returned something unexpected @@ -899,7 +899,7 @@ func (g *Cloud) ensureHTTPHealthCheckFirewall(svc *v1.Service, serviceName, ipAd return fmt.Errorf("error getting firewall for health checks: %v", err) } klog.Infof("Creating firewall %v for health checks.", fwName) - if err := g.createFirewall(svc, fwName, region, desc, sourceRanges, ports, hosts); err != nil { + if err := g.createFirewall(svc, fwName, desc, sourceRanges, ports, hosts); err != nil { return err } klog.Infof("Created firewall %v for health checks.", fwName) @@ -912,7 +912,7 @@ func (g *Cloud) ensureHTTPHealthCheckFirewall(svc *v1.Service, serviceName, ipAd !equalStringSets(fw.Allowed[0].Ports, []string{strconv.Itoa(int(ports[0].Port))}) || !equalStringSets(fw.SourceRanges, sourceRanges.StringSlice()) { klog.Warningf("Firewall %v exists but parameters have drifted - updating...", fwName) - if err := g.updateFirewall(svc, fwName, region, desc, sourceRanges, ports, hosts); err != nil { + if err := g.updateFirewall(svc, fwName, desc, sourceRanges, ports, hosts); err != nil { klog.Warningf("Failed to reconcile firewall %v parameters.", fwName) return err } @@ -948,8 +948,8 @@ func createForwardingRule(s CloudForwardingRuleService, name, serviceName, regio return nil } -func (g *Cloud) createFirewall(svc *v1.Service, name, region, desc string, sourceRanges utilnet.IPNetSet, ports []v1.ServicePort, hosts []*gceInstance) error { - firewall, err := g.firewallObject(name, region, desc, sourceRanges, ports, hosts) +func (g *Cloud) createFirewall(svc *v1.Service, name, desc string, sourceRanges utilnet.IPNetSet, ports []v1.ServicePort, hosts []*gceInstance) error { + firewall, err := g.firewallObject(name, desc, sourceRanges, ports, hosts) if err != nil { return err } @@ -966,8 +966,8 @@ func (g *Cloud) createFirewall(svc *v1.Service, name, region, desc string, sourc return nil } -func (g *Cloud) updateFirewall(svc *v1.Service, name, region, desc string, sourceRanges utilnet.IPNetSet, ports []v1.ServicePort, hosts []*gceInstance) error { - firewall, err := g.firewallObject(name, region, desc, sourceRanges, ports, hosts) +func (g *Cloud) updateFirewall(svc *v1.Service, name, desc string, sourceRanges utilnet.IPNetSet, ports []v1.ServicePort, hosts []*gceInstance) error { + firewall, err := g.firewallObject(name, desc, sourceRanges, ports, hosts) if err != nil { return err } @@ -985,11 +985,11 @@ func (g *Cloud) updateFirewall(svc *v1.Service, name, region, desc string, sourc return nil } -func (g *Cloud) firewallObject(name, region, desc string, sourceRanges utilnet.IPNetSet, ports []v1.ServicePort, hosts []*gceInstance) (*compute.Firewall, error) { - allowedPorts := make([]string, len(ports)) - for ix := range ports { - allowedPorts[ix] = strconv.Itoa(int(ports[ix].Port)) - } +func (g *Cloud) firewallObject(name, desc string, sourceRanges utilnet.IPNetSet, ports []v1.ServicePort, hosts []*gceInstance) (*compute.Firewall, error) { + // Concatenate service ports into port ranges. This help to workaround the gce firewall limitation where only + // 100 ports or port ranges can be used in a firewall rule. + _, portRanges, _ := getPortsAndProtocol(ports) + // If the node tags to be used for this cluster have been predefined in the // provider config, just use them. Otherwise, invoke computeHostTags method to get the tags. hostTags := g.nodeTags @@ -1014,7 +1014,7 @@ func (g *Cloud) firewallObject(name, region, desc string, sourceRanges utilnet.I // mixed TCP and UDP ports. It should be possible to use a // single firewall rule for both a TCP and UDP lb. IPProtocol: strings.ToLower(string(ports[0].Protocol)), - Ports: allowedPorts, + Ports: portRanges, }, }, } diff --git a/vendor/k8s.io/legacy-cloud-providers/gce/gce_loadbalancer_internal.go b/vendor/k8s.io/legacy-cloud-providers/gce/gce_loadbalancer_internal.go index 2a3805b900ad..d42bb14fa7bc 100644 --- a/vendor/k8s.io/legacy-cloud-providers/gce/gce_loadbalancer_internal.go +++ b/vendor/k8s.io/legacy-cloud-providers/gce/gce_loadbalancer_internal.go @@ -28,6 +28,7 @@ import ( "github.com/GoogleCloudPlatform/k8s-cloud-provider/pkg/cloud" "github.com/GoogleCloudPlatform/k8s-cloud-provider/pkg/cloud/meta" + "github.com/google/go-cmp/cmp" compute "google.golang.org/api/compute/v1" "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" @@ -46,6 +47,8 @@ const ( ILBFinalizerV2 = "gke.networking.io/l4-ilb-v2" // maxInstancesPerInstanceGroup defines maximum number of VMs per InstanceGroup. maxInstancesPerInstanceGroup = 1000 + // maxL4ILBPorts is the maximum number of ports that can be specified in an L4 ILB Forwarding Rule. Beyond this, "AllPorts" field should be used. + maxL4ILBPorts = 5 ) func (g *Cloud) ensureInternalLoadBalancer(clusterName, clusterID string, svc *v1.Service, existingFwdRule *compute.ForwardingRule, nodes []*v1.Node) (*v1.LoadBalancerStatus, error) { @@ -90,12 +93,6 @@ func (g *Cloud) ensureInternalLoadBalancer(clusterName, clusterID string, svc *v g.eventRecorder.Event(svc, v1.EventTypeWarning, "ILBOptionsIgnored", "Internal LoadBalancer options are not supported with Legacy Networks.") options = ILBOptions{} } - if !g.AlphaFeatureGate.Enabled(AlphaFeatureILBCustomSubnet) { - if options.SubnetName != "" { - g.eventRecorder.Event(svc, v1.EventTypeWarning, "ILBCustomSubnetOptionIgnored", "Internal LoadBalancer CustomSubnet options ignored as the feature gate is disabled.") - options.SubnetName = "" - } - } sharedBackend := shareBackendService(svc) backendServiceName := makeBackendServiceName(loadBalancerName, clusterID, sharedBackend, scheme, protocol, svc.Spec.SessionAffinity) @@ -136,20 +133,12 @@ func (g *Cloud) ensureInternalLoadBalancer(clusterName, clusterID string, svc *v } subnetworkURL := g.SubnetworkURL() - if g.AlphaFeatureGate.Enabled(AlphaFeatureILBCustomSubnet) { - // If this feature is enabled, changes to subnet annotation will be - // picked up and reflected in the forwarding rule. - // Removing the annotation will set the forwarding rule to use the default subnet. - if options.SubnetName != "" { - subnetworkURL = gceSubnetworkURL("", g.networkProjectID, g.region, options.SubnetName) - } - } else { - // TODO(84885) remove this once ILBCustomSubnet goes beta. - if existingFwdRule != nil && existingFwdRule.Subnetwork != "" { - // If the ILB already exists, continue using the subnet that it's already using. - // This is to support existing ILBs that were setup using the wrong subnet - https://github.com/kubernetes/kubernetes/pull/57861 - subnetworkURL = existingFwdRule.Subnetwork - } + // Any subnet specified using the subnet annotation will be picked up and reflected in the forwarding rule. + // Removing the annotation will set the forwarding rule to use the default subnet and result in a VIP change. + // In order to support existing ILBs that were setup using the wrong subnet - https://github.com/kubernetes/kubernetes/pull/57861, + // users will need to specify that subnet with the annotation. + if options.SubnetName != "" { + subnetworkURL = gceSubnetworkURL("", g.networkProjectID, g.region, options.SubnetName) } // Determine IP which will be used for this LB. If no forwarding rule has been established // or specified in the Service spec, then requestedIP = "". @@ -166,6 +155,12 @@ func (g *Cloud) ensureInternalLoadBalancer(clusterName, clusterID string, svc *v return nil, err } klog.V(2).Infof("ensureInternalLoadBalancer(%v): reserved IP %q for the forwarding rule", loadBalancerName, ipToUse) + defer func() { + // Release the address if all resources were created successfully, or if we error out. + if err := addrMgr.ReleaseAddress(); err != nil { + klog.Errorf("ensureInternalLoadBalancer: failed to release address reservation, possibly causing an orphan: %v", err) + } + }() } // Ensure firewall rules if necessary @@ -194,13 +189,18 @@ func (g *Cloud) ensureInternalLoadBalancer(clusterName, clusterID string, svc *v if options.AllowGlobalAccess { newFwdRule.AllowGlobalAccess = options.AllowGlobalAccess } + if len(ports) > maxL4ILBPorts { + newFwdRule.Ports = nil + newFwdRule.AllPorts = true + } fwdRuleDeleted := false if existingFwdRule != nil && !forwardingRulesEqual(existingFwdRule, newFwdRule) { // Delete existing forwarding rule before making changes to the backend service. For example - changing protocol // of backend service without first deleting forwarding rule will throw an error since the linked forwarding // rule would show the old protocol. - klog.V(2).Infof("ensureInternalLoadBalancer(%v): deleting existing forwarding rule with IP address %v", loadBalancerName, existingFwdRule.IPAddress) + frDiff := cmp.Diff(existingFwdRule, newFwdRule) + klog.V(2).Infof("ensureInternalLoadBalancer(%v): forwarding rule changed - Existing - %+v\n, New - %+v\n, Diff(-existing, +new) - %s\n. Deleting existing forwarding rule.", loadBalancerName, existingFwdRule, newFwdRule, frDiff) if err = ignoreNotFound(g.DeleteRegionForwardingRule(loadBalancerName, g.region)); err != nil { return nil, err } @@ -214,7 +214,8 @@ func (g *Cloud) ensureInternalLoadBalancer(clusterName, clusterID string, svc *v } if fwdRuleDeleted || existingFwdRule == nil { - if err := g.ensureInternalForwardingRule(existingFwdRule, newFwdRule); err != nil { + // existing rule has been deleted, pass in nil + if err := g.ensureInternalForwardingRule(nil, newFwdRule); err != nil { return nil, err } } @@ -224,13 +225,6 @@ func (g *Cloud) ensureInternalLoadBalancer(clusterName, clusterID string, svc *v g.clearPreviousInternalResources(svc, loadBalancerName, existingBackendService, backendServiceName, hcName) } - if addrMgr != nil { - // Now that the controller knows the forwarding rule exists, we can release the address. - if err := addrMgr.ReleaseAddress(); err != nil { - klog.Errorf("ensureInternalLoadBalancer: failed to release address reservation, possibly causing an orphan: %v", err) - } - } - // Get the most recent forwarding rule for the address. updatedFwdRule, err := g.GetRegionForwardingRule(loadBalancerName, g.region) if err != nil { @@ -1021,11 +1015,21 @@ func (g *Cloud) ensureInternalForwardingRule(existingFwdRule, newFwdRule *comput } func forwardingRulesEqual(old, new *compute.ForwardingRule) bool { + // basepath could have differences like compute.googleapis.com vs www.googleapis.com, compare resourceIDs + oldResourceID, err := cloud.ParseResourceURL(old.BackendService) + if err != nil { + klog.Errorf("forwardingRulesEqual(): failed to parse backend resource URL from existing FR, err - %v", err) + } + newResourceID, err := cloud.ParseResourceURL(new.BackendService) + if err != nil { + klog.Errorf("forwardingRulesEqual(): failed to parse resource URL from new FR, err - %v", err) + } return (old.IPAddress == "" || new.IPAddress == "" || old.IPAddress == new.IPAddress) && old.IPProtocol == new.IPProtocol && old.LoadBalancingScheme == new.LoadBalancingScheme && equalStringSets(old.Ports, new.Ports) && - old.BackendService == new.BackendService && + old.AllPorts == new.AllPorts && + oldResourceID.Equal(newResourceID) && old.AllowGlobalAccess == new.AllowGlobalAccess && old.Subnetwork == new.Subnetwork } diff --git a/vendor/k8s.io/legacy-cloud-providers/gce/gcpcredential/credentialutil.go b/vendor/k8s.io/legacy-cloud-providers/gce/gcpcredential/credentialutil.go new file mode 100644 index 000000000000..6f13eec0791e --- /dev/null +++ b/vendor/k8s.io/legacy-cloud-providers/gce/gcpcredential/credentialutil.go @@ -0,0 +1,113 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package gcpcredential + +import ( + "encoding/json" + "errors" + "fmt" + "io" + "io/ioutil" + "net/http" + + "k8s.io/cloud-provider/credentialconfig" + "k8s.io/klog/v2" +) + +const ( + maxReadLength = 10 * 1 << 20 // 10MB +) + +// HTTPError wraps a non-StatusOK error code as an error. +type HTTPError struct { + StatusCode int + URL string +} + +// Error implements error +func (he *HTTPError) Error() string { + return fmt.Sprintf("http status code: %d while fetching url %s", + he.StatusCode, he.URL) +} + +// ReadURL read contents from given url +func ReadURL(url string, client *http.Client, header *http.Header) (body []byte, err error) { + req, err := http.NewRequest("GET", url, nil) + if err != nil { + return nil, err + } + if header != nil { + req.Header = *header + } + resp, err := client.Do(req) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + klog.V(2).Infof("body of failing http response: %v", resp.Body) + return nil, &HTTPError{ + StatusCode: resp.StatusCode, + URL: url, + } + } + + limitedReader := &io.LimitedReader{R: resp.Body, N: maxReadLength} + contents, err := ioutil.ReadAll(limitedReader) + if err != nil { + return nil, err + } + + if limitedReader.N <= 0 { + return nil, errors.New("the read limit is reached") + } + + return contents, nil +} + +// ReadDockerConfigFileFromURL read a docker config file from the given url +func ReadDockerConfigFileFromURL(url string, client *http.Client, header *http.Header) (cfg credentialconfig.RegistryConfig, err error) { + if contents, err := ReadURL(url, client, header); err == nil { + return ReadDockerConfigFileFromBytes(contents) + } + + return nil, err +} + +type internalRegistryConfig map[string]RegistryConfigEntry + +// ReadDockerConfigFileFromBytes read a docker config file from the given bytes +func ReadDockerConfigFileFromBytes(contents []byte) (cfg credentialconfig.RegistryConfig, err error) { + serializableCfg := internalRegistryConfig{} + if err = json.Unmarshal(contents, &serializableCfg); err != nil { + return nil, errors.New("error occurred while trying to unmarshal json") + } + return convertToExternalConfig(serializableCfg), nil +} + +func convertToExternalConfig(in internalRegistryConfig) (cfg credentialconfig.RegistryConfig) { + configMap := credentialconfig.RegistryConfig{} + for k, v := range in { + configMap[k] = credentialconfig.RegistryConfigEntry{ + Username: v.Username, + Password: v.Password, + Email: v.Email, + } + } + return configMap +} diff --git a/vendor/k8s.io/legacy-cloud-providers/gce/gcpcredential/gcpcredential.go b/vendor/k8s.io/legacy-cloud-providers/gce/gcpcredential/gcpcredential.go new file mode 100644 index 000000000000..b51990d15433 --- /dev/null +++ b/vendor/k8s.io/legacy-cloud-providers/gce/gcpcredential/gcpcredential.go @@ -0,0 +1,130 @@ +/* +Copyright 2020 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package gcpcredential + +import ( + "encoding/json" + "net/http" + "strings" + + "k8s.io/cloud-provider/credentialconfig" + "k8s.io/klog/v2" +) + +const ( + metadataURL = "http://metadata.google.internal./computeMetadata/v1/" + metadataAttributes = metadataURL + "instance/attributes/" + // DockerConfigKey is the URL of the dockercfg metadata key used by DockerConfigKeyProvider. + DockerConfigKey = metadataAttributes + "google-dockercfg" + // DockerConfigURLKey is the URL of the dockercfg metadata key used by DockerConfigURLKeyProvider. + DockerConfigURLKey = metadataAttributes + "google-dockercfg-url" + serviceAccounts = metadataURL + "instance/service-accounts/" + metadataScopes = metadataURL + "instance/service-accounts/default/scopes" + metadataToken = metadataURL + "instance/service-accounts/default/token" + metadataEmail = metadataURL + "instance/service-accounts/default/email" + // StorageScopePrefix is the prefix checked by ContainerRegistryProvider.Enabled. + StorageScopePrefix = "https://www.googleapis.com/auth/devstorage" + cloudPlatformScopePrefix = "https://www.googleapis.com/auth/cloud-platform" + defaultServiceAccount = "default/" +) + +// GCEProductNameFile is the product file path that contains the cloud service name. +// This is a variable instead of a const to enable testing. +var GCEProductNameFile = "/sys/class/dmi/id/product_name" + +// For these urls, the parts of the host name can be glob, for example '*.gcr.io" will match +// "foo.gcr.io" and "bar.gcr.io". +var containerRegistryUrls = []string{"container.cloud.google.com", "gcr.io", "*.gcr.io", "*.pkg.dev"} + +var metadataHeader = &http.Header{ + "Metadata-Flavor": []string{"Google"}, +} + +// ProvideConfigKey implements a dockercfg-based authentication flow. +func ProvideConfigKey(client *http.Client, image string) credentialconfig.RegistryConfig { + // Read the contents of the google-dockercfg metadata key and + // parse them as an alternate .dockercfg + if cfg, err := ReadDockerConfigFileFromURL(DockerConfigKey, client, metadataHeader); err != nil { + klog.Errorf("while reading 'google-dockercfg' metadata: %v", err) + } else { + return cfg + } + + return credentialconfig.RegistryConfig{} +} + +// ProvideURLKey implements a dockercfg-url-based authentication flow. +func ProvideURLKey(client *http.Client, image string) credentialconfig.RegistryConfig { + // Read the contents of the google-dockercfg-url key and load a .dockercfg from there + if url, err := ReadURL(DockerConfigURLKey, client, metadataHeader); err != nil { + klog.Errorf("while reading 'google-dockercfg-url' metadata: %v", err) + } else { + if strings.HasPrefix(string(url), "http") { + if cfg, err := ReadDockerConfigFileFromURL(string(url), client, nil); err != nil { + klog.Errorf("while reading 'google-dockercfg-url'-specified url: %s, %v", string(url), err) + } else { + return cfg + } + } else { + // TODO(mattmoor): support reading alternate scheme URLs (e.g. gs:// or s3://) + klog.Errorf("Unsupported URL scheme: %s", string(url)) + } + } + + return credentialconfig.RegistryConfig{} +} + +// TokenBlob is used to decode the JSON blob containing an access token +// that is returned by GCE metadata. +type TokenBlob struct { + AccessToken string `json:"access_token"` +} + +// ProvideContainerRegistry implements a gcr.io-based authentication flow. +func ProvideContainerRegistry(client *http.Client, image string) credentialconfig.RegistryConfig { + cfg := credentialconfig.RegistryConfig{} + + tokenJSONBlob, err := ReadURL(metadataToken, client, metadataHeader) + if err != nil { + klog.Errorf("while reading access token endpoint: %v", err) + return cfg + } + + email, err := ReadURL(metadataEmail, client, metadataHeader) + if err != nil { + klog.Errorf("while reading email endpoint: %v", err) + return cfg + } + + var parsedBlob TokenBlob + if err := json.Unmarshal([]byte(tokenJSONBlob), &parsedBlob); err != nil { + klog.Errorf("while parsing json blob %s: %v", tokenJSONBlob, err) + return cfg + } + + entry := credentialconfig.RegistryConfigEntry{ + Username: "_token", + Password: parsedBlob.AccessToken, + Email: string(email), + } + + // Add our entry for each of the supported container registry URLs + for _, k := range containerRegistryUrls { + cfg[k] = entry + } + return cfg +} diff --git a/vendor/k8s.io/legacy-cloud-providers/gce/gcpcredential/registry_marshal.go b/vendor/k8s.io/legacy-cloud-providers/gce/gcpcredential/registry_marshal.go new file mode 100644 index 000000000000..75541e21166f --- /dev/null +++ b/vendor/k8s.io/legacy-cloud-providers/gce/gcpcredential/registry_marshal.go @@ -0,0 +1,110 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package gcpcredential + +import ( + "encoding/base64" + "encoding/json" + "fmt" + "strings" + + "k8s.io/cloud-provider/credentialconfig" +) + +// registryConfigEntryWithAuth is used solely for deserializing the Auth field +// into a dockerConfigEntry during JSON deserialization. +type registryConfigEntryWithAuth struct { + // +optional + Username string `json:"username,omitempty"` + // +optional + Password string `json:"password,omitempty"` + // +optional + Email string `json:"email,omitempty"` + // +optional + Auth string `json:"auth,omitempty"` +} + +// RegistryConfigEntry is a serializable wrapper around credentialconfig.RegistryConfigEntry. +type RegistryConfigEntry struct { + credentialconfig.RegistryConfigEntry +} + +// UnmarshalJSON implements the json.Unmarshaler interface. +func (ident *RegistryConfigEntry) UnmarshalJSON(data []byte) error { + var tmp registryConfigEntryWithAuth + err := json.Unmarshal(data, &tmp) + if err != nil { + return err + } + + ident.Username = tmp.Username + ident.Password = tmp.Password + ident.Email = tmp.Email + + if len(tmp.Auth) == 0 { + return nil + } + + ident.Username, ident.Password, err = decodeRegistryConfigFieldAuth(tmp.Auth) + return err +} + +// MarshalJSON implements the json.Marshaler interface. +func (ident RegistryConfigEntry) MarshalJSON() ([]byte, error) { + toEncode := registryConfigEntryWithAuth{ident.Username, ident.Password, ident.Email, ""} + toEncode.Auth = encodeRegistryConfigFieldAuth(ident.Username, ident.Password) + + return json.Marshal(toEncode) +} + +// decodeRegistryConfigFieldAuth deserializes the "auth" field from dockercfg into a +// username and a password. The format of the auth field is base64(:). +func decodeRegistryConfigFieldAuth(field string) (username, password string, err error) { + + var decoded []byte + + // StdEncoding can only decode padded string + // RawStdEncoding can only decode unpadded string + if strings.HasSuffix(strings.TrimSpace(field), "=") { + // decode padded data + decoded, err = base64.StdEncoding.DecodeString(field) + } else { + // decode unpadded data + decoded, err = base64.RawStdEncoding.DecodeString(field) + } + + if err != nil { + return + } + + parts := strings.SplitN(string(decoded), ":", 2) + if len(parts) != 2 { + err = fmt.Errorf("unable to parse auth field, must be formatted as base64(username:password)") + return + } + + username = parts[0] + password = parts[1] + + return +} + +func encodeRegistryConfigFieldAuth(username, password string) string { + fieldValue := username + ":" + password + + return base64.StdEncoding.EncodeToString([]byte(fieldValue)) +} diff --git a/vendor/k8s.io/legacy-cloud-providers/gce/token_source.go b/vendor/k8s.io/legacy-cloud-providers/gce/token_source.go index 34489dba17c6..8f5a5eb6758e 100644 --- a/vendor/k8s.io/legacy-cloud-providers/gce/token_source.go +++ b/vendor/k8s.io/legacy-cloud-providers/gce/token_source.go @@ -43,7 +43,7 @@ const ( /* * By default, all the following metrics are defined as falling under - * ALPHA stability level https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/20190404-kubernetes-control-plane-metrics-stability.md#stability-classes) + * ALPHA stability level https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/1209-metrics-stability/20190404-kubernetes-control-plane-metrics-stability.md#stability-classes) * * Promoting the stability level of the metric is a responsibility of the component owner, since it * involves explicitly acknowledging support for the metric across multiple releases, in accordance with diff --git a/vendor/k8s.io/legacy-cloud-providers/openstack/BUILD b/vendor/k8s.io/legacy-cloud-providers/openstack/BUILD deleted file mode 100644 index 822804d2d9c4..000000000000 --- a/vendor/k8s.io/legacy-cloud-providers/openstack/BUILD +++ /dev/null @@ -1,106 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "metadata.go", - "openstack.go", - "openstack_client.go", - "openstack_instances.go", - "openstack_loadbalancer.go", - "openstack_metrics.go", - "openstack_routes.go", - "openstack_volumes.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/legacy-cloud-providers/openstack", - importpath = "k8s.io/legacy-cloud-providers/openstack", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/util/cert:go_default_library", - "//staging/src/k8s.io/cloud-provider:go_default_library", - "//staging/src/k8s.io/cloud-provider/node/helpers:go_default_library", - "//staging/src/k8s.io/cloud-provider/service/helpers:go_default_library", - "//staging/src/k8s.io/cloud-provider/volume:go_default_library", - "//staging/src/k8s.io/cloud-provider/volume/errors:go_default_library", - "//staging/src/k8s.io/cloud-provider/volume/helpers:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - "//vendor/github.com/gophercloud/gophercloud:go_default_library", - "//vendor/github.com/gophercloud/gophercloud/openstack:go_default_library", - "//vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/extensions/volumeactions:go_default_library", - "//vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v1/volumes:go_default_library", - "//vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v2/volumes:go_default_library", - "//vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes:go_default_library", - "//vendor/github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/attachinterfaces:go_default_library", - "//vendor/github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/volumeattach:go_default_library", - "//vendor/github.com/gophercloud/gophercloud/openstack/compute/v2/servers:go_default_library", - "//vendor/github.com/gophercloud/gophercloud/openstack/identity/v3/extensions/trusts:go_default_library", - "//vendor/github.com/gophercloud/gophercloud/openstack/identity/v3/tokens:go_default_library", - "//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions:go_default_library", - "//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/external:go_default_library", - "//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/floatingips:go_default_library", - "//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/routers:go_default_library", - "//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas_v2/listeners:go_default_library", - "//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas_v2/loadbalancers:go_default_library", - "//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas_v2/monitors:go_default_library", - "//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas_v2/pools:go_default_library", - "//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/groups:go_default_library", - "//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/rules:go_default_library", - "//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/networks:go_default_library", - "//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/ports:go_default_library", - "//vendor/github.com/gophercloud/gophercloud/pagination:go_default_library", - "//vendor/github.com/mitchellh/mapstructure:go_default_library", - "//vendor/gopkg.in/gcfg.v1:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - "//vendor/k8s.io/utils/mount:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "metadata_test.go", - "openstack_routes_test.go", - "openstack_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/rand:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//staging/src/k8s.io/cloud-provider:go_default_library", - "//vendor/github.com/gophercloud/gophercloud:go_default_library", - "//vendor/github.com/gophercloud/gophercloud/openstack/compute/v2/servers:go_default_library", - "//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/routers:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/legacy-cloud-providers/openstack/MAINTAINERS.md b/vendor/k8s.io/legacy-cloud-providers/openstack/MAINTAINERS.md index 072e071c6b9b..0802490bcd11 100644 --- a/vendor/k8s.io/legacy-cloud-providers/openstack/MAINTAINERS.md +++ b/vendor/k8s.io/legacy-cloud-providers/openstack/MAINTAINERS.md @@ -2,5 +2,3 @@ * [Angus Lees](https://github.com/anguslees) - -[![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/staging/src/k8s.io/legacy-cloud-providers/openstack/MAINTAINERS.md?pixel)]() diff --git a/vendor/k8s.io/legacy-cloud-providers/openstack/OWNERS b/vendor/k8s.io/legacy-cloud-providers/openstack/OWNERS index e8856d16e94e..8c6dce01b630 100644 --- a/vendor/k8s.io/legacy-cloud-providers/openstack/OWNERS +++ b/vendor/k8s.io/legacy-cloud-providers/openstack/OWNERS @@ -1,6 +1,8 @@ # See the OWNERS docs at https://go.k8s.io/owners +# We are no longer accepting features into k8s.io/legacy-cloud-providers. +# Any kind/feature PRs must be approved by SIG Cloud Provider going forward. -approvers: +emeritus_approvers: - anguslees - NickrenREN - dims diff --git a/vendor/k8s.io/legacy-cloud-providers/openstack/openstack_volumes.go b/vendor/k8s.io/legacy-cloud-providers/openstack/openstack_volumes.go index 3d59714d20b9..92b9206326e1 100644 --- a/vendor/k8s.io/legacy-cloud-providers/openstack/openstack_volumes.go +++ b/vendor/k8s.io/legacy-cloud-providers/openstack/openstack_volumes.go @@ -739,19 +739,19 @@ func (os *OpenStack) GetLabelsForVolume(ctx context.Context, pv *v1.PersistentVo return nil, nil } - // Get metadata - md, err := getMetadata(os.metadataOpts.SearchOrder) + // Get Volume + volume, err := os.getVolume(pv.Spec.Cinder.VolumeID) if err != nil { return nil, err } // Construct Volume Labels labels := make(map[string]string) - if md.AvailabilityZone != "" { - labels[v1.LabelFailureDomainBetaZone] = md.AvailabilityZone + if volume.AvailabilityZone != "" { + labels[v1.LabelTopologyZone] = volume.AvailabilityZone } if os.region != "" { - labels[v1.LabelFailureDomainBetaRegion] = os.region + labels[v1.LabelTopologyRegion] = os.region } klog.V(4).Infof("The Volume %s has labels %v", pv.Spec.Cinder.VolumeID, labels) diff --git a/vendor/k8s.io/legacy-cloud-providers/vsphere/BUILD b/vendor/k8s.io/legacy-cloud-providers/vsphere/BUILD deleted file mode 100644 index 34b2fb712461..000000000000 --- a/vendor/k8s.io/legacy-cloud-providers/vsphere/BUILD +++ /dev/null @@ -1,105 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "credentialmanager.go", - "doc.go", - "nodemanager.go", - "vsphere.go", - "vsphere_util.go", - "vsphere_util_linux.go", - "vsphere_util_unsupported.go", - "vsphere_util_windows.go", - "vsphere_volume_map.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/legacy-cloud-providers/vsphere", - importpath = "k8s.io/legacy-cloud-providers/vsphere", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/version:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/tools/cache:go_default_library", - "//staging/src/k8s.io/cloud-provider:go_default_library", - "//staging/src/k8s.io/cloud-provider/node/helpers:go_default_library", - "//staging/src/k8s.io/cloud-provider/volume/errors:go_default_library", - "//staging/src/k8s.io/cloud-provider/volume/helpers:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/vsphere/vclib:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/vsphere/vclib/diskmanagers:go_default_library", - "//vendor/github.com/vmware/govmomi/find:go_default_library", - "//vendor/github.com/vmware/govmomi/object:go_default_library", - "//vendor/github.com/vmware/govmomi/property:go_default_library", - "//vendor/github.com/vmware/govmomi/vapi/rest:go_default_library", - "//vendor/github.com/vmware/govmomi/vapi/tags:go_default_library", - "//vendor/github.com/vmware/govmomi/vim25:go_default_library", - "//vendor/github.com/vmware/govmomi/vim25/mo:go_default_library", - "//vendor/github.com/vmware/govmomi/vim25/soap:go_default_library", - "//vendor/github.com/vmware/govmomi/vim25/types:go_default_library", - "//vendor/gopkg.in/gcfg.v1:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "credentialmanager_test.go", - "vsphere_test.go", - "vsphere_util_test.go", - "vsphere_volume_map_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/rand:go_default_library", - "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", - "//staging/src/k8s.io/cloud-provider:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/vsphere/vclib:go_default_library", - "//staging/src/k8s.io/legacy-cloud-providers/vsphere/vclib/fixtures:go_default_library", - "//vendor/github.com/vmware/govmomi:go_default_library", - "//vendor/github.com/vmware/govmomi/find:go_default_library", - "//vendor/github.com/vmware/govmomi/lookup/simulator:go_default_library", - "//vendor/github.com/vmware/govmomi/object:go_default_library", - "//vendor/github.com/vmware/govmomi/property:go_default_library", - "//vendor/github.com/vmware/govmomi/simulator:go_default_library", - "//vendor/github.com/vmware/govmomi/simulator/vpx:go_default_library", - "//vendor/github.com/vmware/govmomi/sts/simulator:go_default_library", - "//vendor/github.com/vmware/govmomi/vapi/rest:go_default_library", - "//vendor/github.com/vmware/govmomi/vapi/simulator:go_default_library", - "//vendor/github.com/vmware/govmomi/vapi/tags:go_default_library", - "//vendor/github.com/vmware/govmomi/vim25/mo:go_default_library", - "//vendor/github.com/vmware/govmomi/vim25/types:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/legacy-cloud-providers/vsphere/testing:all-srcs", - "//staging/src/k8s.io/legacy-cloud-providers/vsphere/vclib:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/legacy-cloud-providers/vsphere/OWNERS b/vendor/k8s.io/legacy-cloud-providers/vsphere/OWNERS index 0d7fc1af3026..02ec4847d154 100644 --- a/vendor/k8s.io/legacy-cloud-providers/vsphere/OWNERS +++ b/vendor/k8s.io/legacy-cloud-providers/vsphere/OWNERS @@ -1,17 +1,16 @@ # See the OWNERS docs at https://go.k8s.io/owners -approvers: +emeritus_approvers: - baludontu - divyenpatel - frapposelli - dougm - SandeepPissay +- imkin +- abrarshivani reviewers: - baludontu - divyenpatel - frapposelli - dougm - SandeepPissay -emeritus_approvers: -- imkin -- abrarshivani diff --git a/vendor/k8s.io/legacy-cloud-providers/vsphere/nodemanager.go b/vendor/k8s.io/legacy-cloud-providers/vsphere/nodemanager.go index 04c49a1aba37..791c9e204f76 100644 --- a/vendor/k8s.io/legacy-cloud-providers/vsphere/nodemanager.go +++ b/vendor/k8s.io/legacy-cloud-providers/vsphere/nodemanager.go @@ -25,10 +25,12 @@ import ( "sync" "github.com/vmware/govmomi/object" + "github.com/vmware/govmomi/vim25/mo" + "k8s.io/klog/v2" + v1 "k8s.io/api/core/v1" k8stypes "k8s.io/apimachinery/pkg/types" cloudprovider "k8s.io/cloud-provider" - "k8s.io/klog/v2" "k8s.io/legacy-cloud-providers/vsphere/vclib" ) @@ -201,7 +203,21 @@ func (nm *NodeManager) DiscoverNode(node *v1.Node) error { if vm != nil { klog.V(4).Infof("Found node %s as vm=%+v in vc=%s and datacenter=%s", node.Name, vm, res.vc, res.datacenter.Name()) - + var vmObj mo.VirtualMachine + err := vm.Properties(ctx, vm.Reference(), []string{"config"}, &vmObj) + if err != nil || vmObj.Config == nil { + klog.Errorf("failed to retrieve guest vmconfig for node: %s Err: %v", node.Name, err) + } else { + klog.V(4).Infof("vm hardware version for node:%s is %s", node.Name, vmObj.Config.Version) + // vmconfig.Version returns vm hardware version as vmx-11, vmx-13, vmx-14, vmx-15 etc. + vmhardwaredeprecated, err := isGuestHardwareVersionDeprecated(vmObj.Config.Version) + if err != nil { + klog.Errorf("failed to check if vm hardware version is deprecated. VM Hardware Version: %s Err: %v", vmObj.Config.Version, err) + } + if vmhardwaredeprecated { + klog.Warningf("VM Hardware version: %s from node: %s is deprecated. Please consider upgrading virtual machine hardware version to vmx-15 or higher", vmObj.Config.Version, node.Name) + } + } // Get the node zone information nodeFd := node.ObjectMeta.Labels[v1.LabelFailureDomainBetaZone] nodeRegion := node.ObjectMeta.Labels[v1.LabelFailureDomainBetaRegion] diff --git a/vendor/k8s.io/legacy-cloud-providers/vsphere/shared_datastore.go b/vendor/k8s.io/legacy-cloud-providers/vsphere/shared_datastore.go new file mode 100644 index 000000000000..603ecde9b751 --- /dev/null +++ b/vendor/k8s.io/legacy-cloud-providers/vsphere/shared_datastore.go @@ -0,0 +1,209 @@ +// +build !providerless + +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package vsphere + +import ( + "context" + "fmt" + + "github.com/vmware/govmomi/property" + "github.com/vmware/govmomi/vim25/mo" + "github.com/vmware/govmomi/vim25/types" + "k8s.io/klog/v2" + "k8s.io/legacy-cloud-providers/vsphere/vclib" +) + +type sharedDatastore struct { + nodeManager *NodeManager + candidateDatastores []*vclib.DatastoreInfo +} + +type hostInfo struct { + hostUUID string + hostMOID string + datacenter string +} + +const ( + summary = "summary" + runtimeHost = "summary.runtime.host" + hostsProperty = "host" + nameProperty = "name" +) + +func (shared *sharedDatastore) getSharedDatastore(ctcx context.Context) (*vclib.DatastoreInfo, error) { + nodes := shared.nodeManager.getNodes() + + // Segregate nodes according to VC-DC + dcNodes := make(map[string][]NodeInfo) + nodeHosts := make(map[string]hostInfo) + + for nodeName, node := range nodes { + nodeInfo, err := shared.nodeManager.GetNodeInfoWithNodeObject(node) + if err != nil { + return nil, fmt.Errorf("unable to find node %s: %v", nodeName, err) + } + vcDC := nodeInfo.vcServer + nodeInfo.dataCenter.String() + dcNodes[vcDC] = append(dcNodes[vcDC], nodeInfo) + } + + for vcDC, nodes := range dcNodes { + var hostInfos []hostInfo + var err error + hostInfos, err = shared.getNodeHosts(ctcx, nodes, vcDC) + if err != nil { + if vclib.IsManagedObjectNotFoundError(err) { + klog.Warningf("SharedHost.getSharedDatastore: batch fetching of hosts failed - switching to fetching them individually.") + hostInfos, err = shared.getEachNodeHost(ctcx, nodes, vcDC) + if err != nil { + klog.Errorf("SharedHost.getSharedDatastore: error fetching node hosts individually: %v", err) + return nil, err + } + } else { + return nil, err + } + } + for _, host := range hostInfos { + hostDCName := fmt.Sprintf("%s/%s", host.datacenter, host.hostMOID) + nodeHosts[hostDCName] = host + } + } + + if len(nodeHosts) < 1 { + msg := fmt.Sprintf("SharedHost.getSharedDatastore unable to find hosts associated with nodes") + klog.Error(msg) + return nil, fmt.Errorf("") + } + + for _, datastoreInfo := range shared.candidateDatastores { + dataStoreHosts, err := shared.getAttachedHosts(ctcx, datastoreInfo.Datastore) + if err != nil { + msg := fmt.Sprintf("error finding attached hosts to datastore %s: %v", datastoreInfo.Name(), err) + klog.Error(msg) + return nil, fmt.Errorf(msg) + } + if shared.isIncluded(dataStoreHosts, nodeHosts) { + return datastoreInfo, nil + } + } + return nil, fmt.Errorf("SharedHost.getSharedDatastore: unable to find any shared datastores") +} + +// check if all of the nodeHosts are included in the dataStoreHosts +func (shared *sharedDatastore) isIncluded(dataStoreHosts []hostInfo, nodeHosts map[string]hostInfo) bool { + result := true + for _, host := range nodeHosts { + hostFound := false + for _, targetHost := range dataStoreHosts { + if host.hostUUID == targetHost.hostUUID && host.hostMOID == targetHost.hostMOID { + hostFound = true + } + } + if !hostFound { + result = false + } + } + return result +} + +func (shared *sharedDatastore) getEachNodeHost(ctx context.Context, nodes []NodeInfo, dcVC string) ([]hostInfo, error) { + var hosts []hostInfo + for _, node := range nodes { + host, err := node.vm.GetHost(ctx) + if err != nil { + klog.Errorf("SharedHost.getEachNodeHost: unable to find host for vm %s: %v", node.vm.InventoryPath, err) + return nil, err + } + hosts = append(hosts, hostInfo{ + hostUUID: host.Summary.Hardware.Uuid, + hostMOID: host.Summary.Host.String(), + datacenter: node.dataCenter.String(), + }) + } + return hosts, nil +} + +func (shared *sharedDatastore) getNodeHosts(ctx context.Context, nodes []NodeInfo, dcVC string) ([]hostInfo, error) { + var vmRefs []types.ManagedObjectReference + if len(nodes) < 1 { + return nil, fmt.Errorf("no nodes found for dc-vc: %s", dcVC) + } + var nodeInfo NodeInfo + for _, n := range nodes { + nodeInfo = n + vmRefs = append(vmRefs, n.vm.Reference()) + } + pc := property.DefaultCollector(nodeInfo.dataCenter.Client()) + var vmoList []mo.VirtualMachine + err := pc.Retrieve(ctx, vmRefs, []string{nameProperty, runtimeHost}, &vmoList) + if err != nil { + klog.Errorf("SharedHost.getNodeHosts: unable to fetch vms from datacenter %s: %w", nodeInfo.dataCenter.String(), err) + return nil, err + } + var hostMoList []mo.HostSystem + var hostRefs []types.ManagedObjectReference + for _, vmo := range vmoList { + if vmo.Summary.Runtime.Host == nil { + msg := fmt.Sprintf("SharedHost.getNodeHosts: no host associated with vm %s", vmo.Name) + klog.Error(msg) + return nil, fmt.Errorf(msg) + } + hostRefs = append(hostRefs, vmo.Summary.Runtime.Host.Reference()) + } + pc = property.DefaultCollector(nodeInfo.dataCenter.Client()) + err = pc.Retrieve(ctx, hostRefs, []string{summary}, &hostMoList) + if err != nil { + klog.Errorf("SharedHost.getNodeHosts: unable to fetch hosts from datacenter %s: %w", nodeInfo.dataCenter.String(), err) + return nil, err + } + var hosts []hostInfo + for _, host := range hostMoList { + hosts = append(hosts, hostInfo{hostMOID: host.Summary.Host.String(), hostUUID: host.Summary.Hardware.Uuid, datacenter: nodeInfo.dataCenter.String()}) + } + return hosts, nil +} + +func (shared *sharedDatastore) getAttachedHosts(ctx context.Context, datastore *vclib.Datastore) ([]hostInfo, error) { + var ds mo.Datastore + + pc := property.DefaultCollector(datastore.Client()) + err := pc.RetrieveOne(ctx, datastore.Reference(), []string{hostsProperty}, &ds) + if err != nil { + return nil, err + } + + mounts := make(map[types.ManagedObjectReference]types.DatastoreHostMount) + var refs []types.ManagedObjectReference + for _, host := range ds.Host { + refs = append(refs, host.Key) + mounts[host.Key] = host + } + + var hs []mo.HostSystem + err = pc.Retrieve(ctx, refs, []string{summary}, &hs) + if err != nil { + return nil, err + } + var hosts []hostInfo + for _, h := range hs { + hosts = append(hosts, hostInfo{hostUUID: h.Summary.Hardware.Uuid, hostMOID: h.Summary.Host.String()}) + } + return hosts, nil + +} diff --git a/vendor/k8s.io/legacy-cloud-providers/vsphere/vclib/BUILD b/vendor/k8s.io/legacy-cloud-providers/vsphere/vclib/BUILD deleted file mode 100644 index 22c3ece53bed..000000000000 --- a/vendor/k8s.io/legacy-cloud-providers/vsphere/vclib/BUILD +++ /dev/null @@ -1,81 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "connection.go", - "constants.go", - "custom_errors.go", - "datacenter.go", - "datastore.go", - "folder.go", - "pbm.go", - "utils.go", - "virtualmachine.go", - "vmoptions.go", - "volumeoptions.go", - "vsphere_metrics.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/legacy-cloud-providers/vsphere/vclib", - importpath = "k8s.io/legacy-cloud-providers/vsphere/vclib", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/pkg/version:go_default_library", - "//staging/src/k8s.io/component-base/metrics:go_default_library", - "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", - "//vendor/github.com/vmware/govmomi/find:go_default_library", - "//vendor/github.com/vmware/govmomi/object:go_default_library", - "//vendor/github.com/vmware/govmomi/pbm:go_default_library", - "//vendor/github.com/vmware/govmomi/pbm/types:go_default_library", - "//vendor/github.com/vmware/govmomi/property:go_default_library", - "//vendor/github.com/vmware/govmomi/session:go_default_library", - "//vendor/github.com/vmware/govmomi/sts:go_default_library", - "//vendor/github.com/vmware/govmomi/vim25:go_default_library", - "//vendor/github.com/vmware/govmomi/vim25/mo:go_default_library", - "//vendor/github.com/vmware/govmomi/vim25/soap:go_default_library", - "//vendor/github.com/vmware/govmomi/vim25/types:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/legacy-cloud-providers/vsphere/vclib/diskmanagers:all-srcs", - "//staging/src/k8s.io/legacy-cloud-providers/vsphere/vclib/fixtures:all-srcs", - ], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = [ - "connection_test.go", - "datacenter_test.go", - "datastore_test.go", - "folder_test.go", - "utils_test.go", - "virtualmachine_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/legacy-cloud-providers/vsphere/vclib/fixtures:go_default_library", - "//vendor/github.com/vmware/govmomi:go_default_library", - "//vendor/github.com/vmware/govmomi/object:go_default_library", - "//vendor/github.com/vmware/govmomi/simulator:go_default_library", - ], -) diff --git a/vendor/k8s.io/legacy-cloud-providers/vsphere/vclib/connection.go b/vendor/k8s.io/legacy-cloud-providers/vsphere/vclib/connection.go index d4ad68b024d4..601d5bf9aea7 100644 --- a/vendor/k8s.io/legacy-cloud-providers/vsphere/vclib/connection.go +++ b/vendor/k8s.io/legacy-cloud-providers/vsphere/vclib/connection.go @@ -29,8 +29,9 @@ import ( "github.com/vmware/govmomi/sts" "github.com/vmware/govmomi/vim25" "github.com/vmware/govmomi/vim25/soap" - "k8s.io/client-go/pkg/version" "k8s.io/klog/v2" + + "k8s.io/client-go/pkg/version" ) // VSphereConnection contains information for connecting to vCenter @@ -84,7 +85,6 @@ func (connection *VSphereConnection) Connect(ctx context.Context) error { klog.Errorf("Failed to create govmomi client. err: %+v", err) return err } - setVCenterInfoMetric(connection) return nil } @@ -217,6 +217,13 @@ func (connection *VSphereConnection) NewClient(ctx context.Context) (*vim25.Clie connection.RoundTripperCount = RoundTripperDefaultCount } client.RoundTripper = vim25.Retry(client.RoundTripper, vim25.TemporaryNetworkError(int(connection.RoundTripperCount))) + vcdeprecated, err := isvCenterDeprecated(client.ServiceContent.About.Version, client.ServiceContent.About.ApiVersion) + if err != nil { + klog.Errorf("failed to check if vCenter version:%v and api version: %s is deprecated. Error: %v", client.ServiceContent.About.Version, client.ServiceContent.About.ApiVersion, err) + } + if vcdeprecated { + klog.Warningf("vCenter is deprecated. version: %s, api verson: %s Please consider upgrading vCenter and ESXi servers to 6.7u3 or higher", client.ServiceContent.About.Version, client.ServiceContent.About.ApiVersion) + } return client, nil } diff --git a/vendor/k8s.io/legacy-cloud-providers/vsphere/vclib/constants.go b/vendor/k8s.io/legacy-cloud-providers/vsphere/vclib/constants.go index 2209898c6f6a..4aa7f5f48467 100644 --- a/vendor/k8s.io/legacy-cloud-providers/vsphere/vclib/constants.go +++ b/vendor/k8s.io/legacy-cloud-providers/vsphere/vclib/constants.go @@ -53,6 +53,7 @@ const ( ClusterComputeResourceType = "ClusterComputeResource" HostSystemType = "HostSystem" NameProperty = "name" + MinvCenterVersion = "6.7.0" ) // Test Constants diff --git a/vendor/k8s.io/legacy-cloud-providers/vsphere/vclib/diskmanagers/BUILD b/vendor/k8s.io/legacy-cloud-providers/vsphere/vclib/diskmanagers/BUILD deleted file mode 100644 index 6aaeeb15a199..000000000000 --- a/vendor/k8s.io/legacy-cloud-providers/vsphere/vclib/diskmanagers/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "vdm.go", - "virtualdisk.go", - "vmdm.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/legacy-cloud-providers/vsphere/vclib/diskmanagers", - importpath = "k8s.io/legacy-cloud-providers/vsphere/vclib/diskmanagers", - deps = [ - "//staging/src/k8s.io/legacy-cloud-providers/vsphere/vclib:go_default_library", - "//vendor/github.com/vmware/govmomi/object:go_default_library", - "//vendor/github.com/vmware/govmomi/vim25/types:go_default_library", - "//vendor/k8s.io/klog/v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/legacy-cloud-providers/vsphere/vclib/utils.go b/vendor/k8s.io/legacy-cloud-providers/vsphere/vclib/utils.go index 86dd0ea6d58d..ac19f9b8f1b6 100644 --- a/vendor/k8s.io/legacy-cloud-providers/vsphere/vclib/utils.go +++ b/vendor/k8s.io/legacy-cloud-providers/vsphere/vclib/utils.go @@ -22,6 +22,7 @@ import ( "regexp" "strings" + "github.com/blang/semver" "github.com/vmware/govmomi/find" "github.com/vmware/govmomi/object" "github.com/vmware/govmomi/vim25/soap" @@ -199,3 +200,34 @@ func VerifyVolumePathsForVMDevices(vmDevices object.VirtualDeviceList, volPaths } } + +// isvCenterDeprecated takes vCenter version and vCenter API version as input and return true if vCenter is deprecated +func isvCenterDeprecated(vCenterVersion string, vCenerAPIVersion string) (bool, error) { + minvcversion, err := semver.New(MinvCenterVersion) + vcdeprecated := false + if err != nil { + return false, fmt.Errorf("failed to get parse vCenter version: %s. err: %+v", MinvCenterVersion, err) + } else { + vcversion, err := semver.New(vCenterVersion) + if err != nil { + return false, fmt.Errorf("failed to parse vCenter version: %s. err: %+v", vCenterVersion, err) + } else { + result := vcversion.Compare(*minvcversion) + if result == -1 { + // vcversion is less than minvcversion + vcdeprecated = true + } else if result == 0 { + // vcversion is equal to minvcversion + // check patch version + vcapiversion, err := semver.ParseTolerant(vCenerAPIVersion) + if err != nil { + return false, fmt.Errorf("failed to parse vCenter api version: %s. err: %+v", vCenerAPIVersion, err) + } + if vcapiversion.Patch < 3 { + vcdeprecated = true + } + } + } + } + return vcdeprecated, nil +} diff --git a/vendor/k8s.io/legacy-cloud-providers/vsphere/vclib/virtualmachine.go b/vendor/k8s.io/legacy-cloud-providers/vsphere/vclib/virtualmachine.go index 7fc6f1750dbe..a5e170438ad1 100644 --- a/vendor/k8s.io/legacy-cloud-providers/vsphere/vclib/virtualmachine.go +++ b/vendor/k8s.io/legacy-cloud-providers/vsphere/vclib/virtualmachine.go @@ -166,6 +166,24 @@ func (vm *VirtualMachine) AttachDisk(ctx context.Context, vmDiskPath string, vol return diskUUID, nil } +// GetHost returns host of the virtual machine +func (vm *VirtualMachine) GetHost(ctx context.Context) (mo.HostSystem, error) { + host, err := vm.HostSystem(ctx) + var hostSystemMo mo.HostSystem + if err != nil { + klog.Errorf("Failed to get host system for VM: %q. err: %+v", vm.InventoryPath, err) + return hostSystemMo, err + } + + s := object.NewSearchIndex(vm.Client()) + err = s.Properties(ctx, host.Reference(), []string{"summary"}, &hostSystemMo) + if err != nil { + klog.Errorf("Failed to retrieve datastores for host: %+v. err: %+v", host, err) + return hostSystemMo, err + } + return hostSystemMo, nil +} + // DetachDisk detaches the disk specified by vmDiskPath func (vm *VirtualMachine) DetachDisk(ctx context.Context, vmDiskPath string) error { device, err := vm.getVirtualDeviceByPath(ctx, vmDiskPath) diff --git a/vendor/k8s.io/legacy-cloud-providers/vsphere/vsphere.go b/vendor/k8s.io/legacy-cloud-providers/vsphere/vsphere.go index 83337adc7c20..350029a04c5e 100644 --- a/vendor/k8s.io/legacy-cloud-providers/vsphere/vsphere.go +++ b/vendor/k8s.io/legacy-cloud-providers/vsphere/vsphere.go @@ -411,6 +411,9 @@ func populateVsphereInstanceMap(cfg *VSphereConfig) (map[string]*VSphereInstance klog.Error(msg) return nil, errors.New(msg) } + if len(cfg.VirtualCenter) > 1 { + klog.Warning("Multi vCenter support is deprecated. vSphere CSI Driver does not support Kubernetes nodes spread across multiple vCenter servers. Please consider moving all Kubernetes nodes to single vCenter server") + } for vcServer, vcConfig := range cfg.VirtualCenter { klog.V(4).Infof("Initializing vc server %s", vcServer) @@ -1385,13 +1388,20 @@ func (vs *VSphere) CreateVolume(volumeOptions *vclib.VolumeOptions) (canonicalVo if len(zonesToSearch) == 0 { // If zone is not provided, get the shared datastore across all node VMs. klog.V(4).Infof("Validating if datastore %s is shared across all node VMs", datastoreName) - sharedDsList, err = getSharedDatastoresInK8SCluster(ctx, vs.nodeManager) + sharedDSFinder := &sharedDatastore{ + nodeManager: vs.nodeManager, + candidateDatastores: candidateDatastoreInfos, + } + datastoreInfo, err = sharedDSFinder.getSharedDatastore(ctx) if err != nil { klog.Errorf("Failed to get shared datastore: %+v", err) return "", err } - // Prepare error msg to be used later, if required. - err = fmt.Errorf("The specified datastore %s is not a shared datastore across node VMs", datastoreName) + if datastoreInfo == nil { + err = fmt.Errorf("The specified datastore %s is not a shared datastore across node VMs", datastoreName) + klog.Error(err) + return "", err + } } else { // If zone is provided, get the shared datastores in that zone. klog.V(4).Infof("Validating if datastore %s is in zone %s ", datastoreName, zonesToSearch) @@ -1400,21 +1410,19 @@ func (vs *VSphere) CreateVolume(volumeOptions *vclib.VolumeOptions) (canonicalVo klog.Errorf("Failed to find a shared datastore matching zone %s. err: %+v", zonesToSearch, err) return "", err } - // Prepare error msg to be used later, if required. - err = fmt.Errorf("The specified datastore %s does not match the provided zones : %s", datastoreName, zonesToSearch) - } - found := false - // Check if the selected datastore belongs to the list of shared datastores computed. - for _, sharedDs := range sharedDsList { - if datastoreInfo, found = candidateDatastores[sharedDs.Info.Url]; found { - klog.V(4).Infof("Datastore validation succeeded") - found = true - break + found := false + for _, sharedDs := range sharedDsList { + if datastoreInfo, found = candidateDatastores[sharedDs.Info.Url]; found { + klog.V(4).Infof("Datastore validation succeeded") + found = true + break + } + } + if !found { + err = fmt.Errorf("The specified datastore %s does not match the provided zones : %s", datastoreName, zonesToSearch) + klog.Error(err) + return "", err } - } - if !found { - klog.Error(err) - return "", err } } } diff --git a/vendor/k8s.io/legacy-cloud-providers/vsphere/vsphere_util.go b/vendor/k8s.io/legacy-cloud-providers/vsphere/vsphere_util.go index c0d474ab5577..0b778a6a7cc0 100644 --- a/vendor/k8s.io/legacy-cloud-providers/vsphere/vsphere_util.go +++ b/vendor/k8s.io/legacy-cloud-providers/vsphere/vsphere_util.go @@ -25,6 +25,7 @@ import ( "math/rand" "os" "path/filepath" + "strconv" "strings" "sync" "time" @@ -768,6 +769,21 @@ func IsUUIDSupportedNode(node *v1.Node) (bool, error) { return false, nil } +func isGuestHardwareVersionDeprecated(vmHardwareversion string) (bool, error) { + vmHardwareDeprecated := false + // vmconfig.Version returns vm hardware version as vmx-11, vmx-13, vmx-14, vmx-15 etc. + version := strings.Trim(vmHardwareversion, "vmx-") + value, err := strconv.ParseInt(version, 0, 64) + if err != nil { + return false, fmt.Errorf("failed to parse vm hardware version: %v Err: %v", version, err) + } else { + if value < 15 { + vmHardwareDeprecated = true + } + } + return vmHardwareDeprecated, nil +} + func GetNodeUUID(node *v1.Node) (string, error) { oldNode, err := IsUUIDSupportedNode(node) if err != nil { diff --git a/vendor/k8s.io/metrics/pkg/apis/custom_metrics/BUILD b/vendor/k8s.io/metrics/pkg/apis/custom_metrics/BUILD deleted file mode 100644 index 539cb4806404..000000000000 --- a/vendor/k8s.io/metrics/pkg/apis/custom_metrics/BUILD +++ /dev/null @@ -1,46 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "doc.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/metrics/pkg/apis/custom_metrics", - importpath = "k8s.io/metrics/pkg/apis/custom_metrics", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/metrics/pkg/apis/custom_metrics/install:all-srcs", - "//staging/src/k8s.io/metrics/pkg/apis/custom_metrics/v1beta1:all-srcs", - "//staging/src/k8s.io/metrics/pkg/apis/custom_metrics/v1beta2:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/metrics/pkg/apis/custom_metrics/v1beta1/BUILD b/vendor/k8s.io/metrics/pkg/apis/custom_metrics/v1beta1/BUILD deleted file mode 100644 index 3212a0d60233..000000000000 --- a/vendor/k8s.io/metrics/pkg/apis/custom_metrics/v1beta1/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "zz_generated.conversion.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/metrics/pkg/apis/custom_metrics/v1beta1", - importpath = "k8s.io/metrics/pkg/apis/custom_metrics/v1beta1", - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/metrics/pkg/apis/custom_metrics:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/metrics/pkg/apis/custom_metrics/v1beta1/generated.pb.go b/vendor/k8s.io/metrics/pkg/apis/custom_metrics/v1beta1/generated.pb.go index 06e822a6c7c4..8008615d469d 100644 --- a/vendor/k8s.io/metrics/pkg/apis/custom_metrics/v1beta1/generated.pb.go +++ b/vendor/k8s.io/metrics/pkg/apis/custom_metrics/v1beta1/generated.pb.go @@ -556,10 +556,7 @@ func (m *MetricListOptions) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -796,10 +793,7 @@ func (m *MetricValue) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -916,10 +910,7 @@ func (m *MetricValueList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/metrics/pkg/apis/custom_metrics/v1beta2/BUILD b/vendor/k8s.io/metrics/pkg/apis/custom_metrics/v1beta2/BUILD deleted file mode 100644 index 5cf76072da32..000000000000 --- a/vendor/k8s.io/metrics/pkg/apis/custom_metrics/v1beta2/BUILD +++ /dev/null @@ -1,46 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "zz_generated.conversion.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/metrics/pkg/apis/custom_metrics/v1beta2", - importpath = "k8s.io/metrics/pkg/apis/custom_metrics/v1beta2", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/metrics/pkg/apis/custom_metrics:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/metrics/pkg/apis/custom_metrics/v1beta2/generated.pb.go b/vendor/k8s.io/metrics/pkg/apis/custom_metrics/v1beta2/generated.pb.go index aa04d318339a..b9d623f5f683 100644 --- a/vendor/k8s.io/metrics/pkg/apis/custom_metrics/v1beta2/generated.pb.go +++ b/vendor/k8s.io/metrics/pkg/apis/custom_metrics/v1beta2/generated.pb.go @@ -645,10 +645,7 @@ func (m *MetricIdentifier) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -762,10 +759,7 @@ func (m *MetricListOptions) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -967,10 +961,7 @@ func (m *MetricValue) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1087,10 +1078,7 @@ func (m *MetricValueList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/metrics/pkg/apis/external_metrics/BUILD b/vendor/k8s.io/metrics/pkg/apis/external_metrics/BUILD deleted file mode 100644 index cb1fdc98a381..000000000000 --- a/vendor/k8s.io/metrics/pkg/apis/external_metrics/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/metrics/pkg/apis/external_metrics", - importpath = "k8s.io/metrics/pkg/apis/external_metrics", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/metrics/pkg/apis/external_metrics/install:all-srcs", - "//staging/src/k8s.io/metrics/pkg/apis/external_metrics/v1beta1:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/metrics/pkg/apis/external_metrics/v1beta1/BUILD b/vendor/k8s.io/metrics/pkg/apis/external_metrics/v1beta1/BUILD deleted file mode 100644 index aae01bdde897..000000000000 --- a/vendor/k8s.io/metrics/pkg/apis/external_metrics/v1beta1/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "zz_generated.conversion.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/metrics/pkg/apis/external_metrics/v1beta1", - importpath = "k8s.io/metrics/pkg/apis/external_metrics/v1beta1", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/metrics/pkg/apis/external_metrics:go_default_library", - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/metrics/pkg/apis/external_metrics/v1beta1/generated.pb.go b/vendor/k8s.io/metrics/pkg/apis/external_metrics/v1beta1/generated.pb.go index 1295170e48dc..59c301e3f168 100644 --- a/vendor/k8s.io/metrics/pkg/apis/external_metrics/v1beta1/generated.pb.go +++ b/vendor/k8s.io/metrics/pkg/apis/external_metrics/v1beta1/generated.pb.go @@ -558,7 +558,7 @@ func (m *ExternalMetricValue) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > postIndex { @@ -661,10 +661,7 @@ func (m *ExternalMetricValue) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -781,10 +778,7 @@ func (m *ExternalMetricValueList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/k8s.io/metrics/pkg/client/custom_metrics/BUILD b/vendor/k8s.io/metrics/pkg/client/custom_metrics/BUILD deleted file mode 100644 index 90c00c99198a..000000000000 --- a/vendor/k8s.io/metrics/pkg/client/custom_metrics/BUILD +++ /dev/null @@ -1,63 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "converter.go", - "discovery.go", - "interfaces.go", - "multi_client.go", - "versioned_client.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/metrics/pkg/client/custom_metrics", - importpath = "k8s.io/metrics/pkg/client/custom_metrics", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/client-go/discovery:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/metrics/pkg/apis/custom_metrics:go_default_library", - "//staging/src/k8s.io/metrics/pkg/apis/custom_metrics/v1beta1:go_default_library", - "//staging/src/k8s.io/metrics/pkg/apis/custom_metrics/v1beta2:go_default_library", - "//staging/src/k8s.io/metrics/pkg/client/custom_metrics/scheme:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/metrics/pkg/client/custom_metrics/fake:all-srcs", - "//staging/src/k8s.io/metrics/pkg/client/custom_metrics/scheme:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["util_test.go"], - embed = [":go_default_library"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/metrics/pkg/apis/custom_metrics:go_default_library", - "//staging/src/k8s.io/metrics/pkg/apis/custom_metrics/v1beta1:go_default_library", - "//staging/src/k8s.io/metrics/pkg/apis/custom_metrics/v1beta2:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - ], -) diff --git a/vendor/k8s.io/metrics/pkg/client/custom_metrics/scheme/BUILD b/vendor/k8s.io/metrics/pkg/client/custom_metrics/scheme/BUILD deleted file mode 100644 index 85e6e80a57fd..000000000000 --- a/vendor/k8s.io/metrics/pkg/client/custom_metrics/scheme/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["register.go"], - importmap = "k8s.io/kubernetes/vendor/k8s.io/metrics/pkg/client/custom_metrics/scheme", - importpath = "k8s.io/metrics/pkg/client/custom_metrics/scheme", - visibility = ["//visibility:public"], - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//staging/src/k8s.io/metrics/pkg/apis/custom_metrics:go_default_library", - "//staging/src/k8s.io/metrics/pkg/apis/custom_metrics/v1beta1:go_default_library", - "//staging/src/k8s.io/metrics/pkg/apis/custom_metrics/v1beta2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/metrics/pkg/client/custom_metrics/scheme/register.go b/vendor/k8s.io/metrics/pkg/client/custom_metrics/scheme/register.go index 9875f42f9c0f..703a51a7042a 100644 --- a/vendor/k8s.io/metrics/pkg/client/custom_metrics/scheme/register.go +++ b/vendor/k8s.io/metrics/pkg/client/custom_metrics/scheme/register.go @@ -26,12 +26,19 @@ import ( cmv1beta2 "k8s.io/metrics/pkg/apis/custom_metrics/v1beta2" ) +// GroupName is the group name use in this package. const GroupName = cmv1beta1.GroupName +// SchemeGroupVersion is group version used to register these objects. var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: runtime.APIVersionInternal} +// Scheme is the runtime.Scheme to which all custom metrics api types are registered. var Scheme = runtime.NewScheme() + +// Codecs provides access to encoding and decoding for the scheme. var Codecs = serializer.NewCodecFactory(Scheme) + +// ParameterCodec handles versioning of objects that are converted to query parameters. var ParameterCodec = runtime.NewParameterCodec(Scheme) func init() { diff --git a/vendor/k8s.io/metrics/pkg/client/external_metrics/BUILD b/vendor/k8s.io/metrics/pkg/client/external_metrics/BUILD deleted file mode 100644 index 06171e789cdd..000000000000 --- a/vendor/k8s.io/metrics/pkg/client/external_metrics/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "client.go", - "interfaces.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/metrics/pkg/client/external_metrics", - importpath = "k8s.io/metrics/pkg/client/external_metrics", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", - "//staging/src/k8s.io/metrics/pkg/apis/external_metrics/v1beta1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/metrics/pkg/client/external_metrics/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/mount-utils/BUILD b/vendor/k8s.io/mount-utils/BUILD deleted file mode 100644 index d57b710fe825..000000000000 --- a/vendor/k8s.io/mount-utils/BUILD +++ /dev/null @@ -1,107 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_mounter.go", - "mount.go", - "mount_helper_common.go", - "mount_helper_unix.go", - "mount_helper_windows.go", - "mount_linux.go", - "mount_unsupported.go", - "mount_windows.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/mount-utils", - importpath = "k8s.io/mount-utils", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/klog/v2:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - ] + select({ - "@io_bazel_rules_go//go/platform:aix": [ - "//vendor/k8s.io/utils/io:go_default_library", - ], - "@io_bazel_rules_go//go/platform:android": [ - "//vendor/k8s.io/utils/io:go_default_library", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "//vendor/k8s.io/utils/io:go_default_library", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "//vendor/k8s.io/utils/io:go_default_library", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "//vendor/k8s.io/utils/io:go_default_library", - ], - "@io_bazel_rules_go//go/platform:illumos": [ - "//vendor/k8s.io/utils/io:go_default_library", - ], - "@io_bazel_rules_go//go/platform:ios": [ - "//vendor/k8s.io/utils/io:go_default_library", - ], - "@io_bazel_rules_go//go/platform:js": [ - "//vendor/k8s.io/utils/io:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//vendor/k8s.io/utils/io:go_default_library", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "//vendor/k8s.io/utils/io:go_default_library", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "//vendor/k8s.io/utils/io:go_default_library", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "//vendor/k8s.io/utils/io:go_default_library", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "//vendor/k8s.io/utils/io:go_default_library", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "//vendor/k8s.io/utils/io:go_default_library", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "//vendor/k8s.io/utils/keymutex:go_default_library", - ], - "//conditions:default": [], - }), -) - -go_test( - name = "go_default_test", - srcs = [ - "mount_helper_test.go", - "mount_helper_unix_test.go", - "mount_helper_windows_test.go", - "mount_linux_test.go", - "mount_test.go", - "mount_windows_test.go", - "safe_format_and_mount_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//vendor/k8s.io/utils/exec:go_default_library", - "//vendor/k8s.io/utils/exec/testing:go_default_library", - ] + select({ - "@io_bazel_rules_go//go/platform:windows": [ - "//vendor/github.com/stretchr/testify/assert:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/mount-utils/OWNERS b/vendor/k8s.io/mount-utils/OWNERS index 5fa5cc24c378..5a474fbcb6cc 100644 --- a/vendor/k8s.io/mount-utils/OWNERS +++ b/vendor/k8s.io/mount-utils/OWNERS @@ -12,3 +12,5 @@ approvers: - saad-ali - jsafrane +labels: + - sig/storage diff --git a/vendor/k8s.io/mount-utils/go.mod b/vendor/k8s.io/mount-utils/go.mod index 61c8b578d5bf..70a160beee1b 100644 --- a/vendor/k8s.io/mount-utils/go.mod +++ b/vendor/k8s.io/mount-utils/go.mod @@ -2,13 +2,14 @@ module k8s.io/mount-utils -go 1.15 +go 1.16 require ( - github.com/kr/pretty v0.2.0 // indirect + github.com/kr/text v0.2.0 // indirect + github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect github.com/stretchr/testify v1.6.1 - gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect - k8s.io/klog/v2 v2.4.0 + gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect + k8s.io/klog/v2 v2.8.0 k8s.io/utils v0.0.0-20201110183641-67b214c5f920 ) diff --git a/vendor/k8s.io/mount-utils/go.sum b/vendor/k8s.io/mount-utils/go.sum index 6cc32d743168..6fadc4d5828c 100644 --- a/vendor/k8s.io/mount-utils/go.sum +++ b/vendor/k8s.io/mount-utils/go.sum @@ -1,18 +1,18 @@ +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/go-logr/logr v0.1.0 h1:M1Tv3VzNlEHg6uyACnRdtrploV2P7wZqH8BoQMtz0cg= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v0.2.0 h1:QvGt2nLcHH0WK9orKa+ppBPAxREcH364nPUedEpK0TY= -github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/go-logr/logr v0.4.0 h1:K7/B1jt6fIBQVd4Owv2MqGQClcgf0R266+7C/QjRcLc= +github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -20,13 +20,12 @@ github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -k8s.io/klog/v2 v2.0.0 h1:Foj74zO6RbjjP4hBEKjnYtjjAhGg4jNynUdYF6fJrok= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.4.0 h1:7+X0fUguPyrKEC4WjH8iGDg3laWgMo5tMnRTIGTTxGQ= -k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/klog/v2 v2.8.0 h1:Q3gmuM9hKEjefWFFYF0Mat+YyFJvsUyYuwyNNJ5C9Ts= +k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= k8s.io/utils v0.0.0-20201110183641-67b214c5f920 h1:CbnUZsM497iRC5QMVkHwyl8s2tB3g7yaSHkYPkpgelw= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= diff --git a/vendor/k8s.io/mount-utils/mount.go b/vendor/k8s.io/mount-utils/mount.go index c78cf13df917..93b60d3f9220 100644 --- a/vendor/k8s.io/mount-utils/mount.go +++ b/vendor/k8s.io/mount-utils/mount.go @@ -24,6 +24,7 @@ import ( "os" "path/filepath" "strings" + "time" utilexec "k8s.io/utils/exec" ) @@ -78,6 +79,13 @@ type Interface interface { // the mount interface. var _ Interface = &Mounter{} +type MounterForceUnmounter interface { + Interface + // UnmountWithForce unmounts given target but will retry unmounting with force option + // after given timeout. + UnmountWithForce(target string, umountTimeout time.Duration) error +} + // MountPoint represents a single line in /proc/mounts or /etc/fstab. type MountPoint struct { // nolint: golint Device string diff --git a/vendor/k8s.io/mount-utils/mount_helper_common.go b/vendor/k8s.io/mount-utils/mount_helper_common.go index 1d40549b5f42..a79874855628 100644 --- a/vendor/k8s.io/mount-utils/mount_helper_common.go +++ b/vendor/k8s.io/mount-utils/mount_helper_common.go @@ -19,6 +19,7 @@ package mount import ( "fmt" "os" + "time" "k8s.io/klog/v2" ) @@ -29,7 +30,7 @@ import ( // but properly handles bind mounts within the same fs. func CleanupMountPoint(mountPath string, mounter Interface, extensiveMountPointCheck bool) error { pathExists, pathErr := PathExists(mountPath) - if !pathExists { + if !pathExists && pathErr == nil { klog.Warningf("Warning: Unmount skipped because path does not exist: %v", mountPath) return nil } @@ -40,6 +41,41 @@ func CleanupMountPoint(mountPath string, mounter Interface, extensiveMountPointC return doCleanupMountPoint(mountPath, mounter, extensiveMountPointCheck, corruptedMnt) } +func CleanupMountWithForce(mountPath string, mounter MounterForceUnmounter, extensiveMountPointCheck bool, umountTimeout time.Duration) error { + pathExists, pathErr := PathExists(mountPath) + if !pathExists && pathErr == nil { + klog.Warningf("Warning: Unmount skipped because path does not exist: %v", mountPath) + return nil + } + corruptedMnt := IsCorruptedMnt(pathErr) + if pathErr != nil && !corruptedMnt { + return fmt.Errorf("Error checking path: %v", pathErr) + } + var notMnt bool + var err error + if !corruptedMnt { + notMnt, err = removePathIfNotMountPoint(mountPath, mounter, extensiveMountPointCheck) + // if mountPath was not a mount point - we would have attempted to remove mountPath + // and hence return errors if any. + if err != nil || notMnt { + return err + } + } + + // Unmount the mount path + klog.V(4).Infof("%q is a mountpoint, unmounting", mountPath) + if err := mounter.UnmountWithForce(mountPath, umountTimeout); err != nil { + return err + } + + notMnt, err = removePathIfNotMountPoint(mountPath, mounter, extensiveMountPointCheck) + // mountPath is not a mount point we should return whatever error we saw + if notMnt { + return err + } + return fmt.Errorf("Failed to unmount path %v", mountPath) +} + // doCleanupMountPoint unmounts the given path and // deletes the remaining directory if successful. // if extensiveMountPointCheck is true @@ -51,20 +87,12 @@ func doCleanupMountPoint(mountPath string, mounter Interface, extensiveMountPoin var notMnt bool var err error if !corruptedMnt { - if extensiveMountPointCheck { - notMnt, err = IsNotMountPoint(mounter, mountPath) - } else { - notMnt, err = mounter.IsLikelyNotMountPoint(mountPath) - } - - if err != nil { + notMnt, err = removePathIfNotMountPoint(mountPath, mounter, extensiveMountPointCheck) + // if mountPath was not a mount point - we would have attempted to remove mountPath + // and hence return errors if any. + if err != nil || notMnt { return err } - - if notMnt { - klog.Warningf("Warning: %q is not a mountpoint, deleting", mountPath) - return os.Remove(mountPath) - } } // Unmount the mount path @@ -73,19 +101,35 @@ func doCleanupMountPoint(mountPath string, mounter Interface, extensiveMountPoin return err } + notMnt, err = removePathIfNotMountPoint(mountPath, mounter, extensiveMountPointCheck) + // mountPath is not a mount point we should return whatever error we saw + if notMnt { + return err + } + return fmt.Errorf("Failed to unmount path %v", mountPath) +} + +// removePathIfNotMountPoint verifies if given mountPath is a mount point if not it attempts +// to remove the directory. Returns true and nil if directory was not a mount point and removed. +func removePathIfNotMountPoint(mountPath string, mounter Interface, extensiveMountPointCheck bool) (bool, error) { + var notMnt bool + var err error + if extensiveMountPointCheck { notMnt, err = IsNotMountPoint(mounter, mountPath) } else { notMnt, err = mounter.IsLikelyNotMountPoint(mountPath) } + if err != nil { - return err + return notMnt, err } + if notMnt { - klog.V(4).Infof("%q is unmounted, deleting the directory", mountPath) - return os.Remove(mountPath) + klog.Warningf("Warning: %q is not a mountpoint, deleting", mountPath) + return notMnt, os.Remove(mountPath) } - return fmt.Errorf("Failed to unmount path %v", mountPath) + return notMnt, nil } // PathExists returns true if the specified path exists. diff --git a/vendor/k8s.io/mount-utils/mount_linux.go b/vendor/k8s.io/mount-utils/mount_linux.go index 20993cf06b3b..10a1c3f01068 100644 --- a/vendor/k8s.io/mount-utils/mount_linux.go +++ b/vendor/k8s.io/mount-utils/mount_linux.go @@ -19,6 +19,7 @@ limitations under the License. package mount import ( + "context" "fmt" "os" "os/exec" @@ -26,6 +27,7 @@ import ( "strconv" "strings" "syscall" + "time" "k8s.io/klog/v2" utilexec "k8s.io/utils/exec" @@ -53,6 +55,8 @@ type Mounter struct { withSystemd bool } +var _ MounterForceUnmounter = &Mounter{} + // New returns a mount.Interface for the current system. // It provides options to override the default mounter behavior. // mounterPath allows using an alternative to `/bin/mount` for mounting. @@ -268,6 +272,20 @@ func (mounter *Mounter) Unmount(target string) error { return nil } +// UnmountWithForce unmounts given target but will retry unmounting with force option +// after given timeout. +func (mounter *Mounter) UnmountWithForce(target string, umountTimeout time.Duration) error { + err := tryUnmount(target, umountTimeout) + if err != nil { + if err == context.DeadlineExceeded { + klog.V(2).Infof("Timed out waiting for unmount of %s, trying with -f", target) + err = forceUmount(target) + } + return err + } + return nil +} + // List returns a list of all mounted filesystems. func (*Mounter) List() ([]MountPoint, error) { return ListProcMounts(procMountsPath) @@ -423,11 +441,10 @@ func (mounter *SafeFormatAndMount) formatAndMountSensitive(source string, target return nil } -// GetDiskFormat uses 'blkid' to see if the given disk is unformatted -func (mounter *SafeFormatAndMount) GetDiskFormat(disk string) (string, error) { +func getDiskFormat(exec utilexec.Interface, disk string) (string, error) { args := []string{"-p", "-s", "TYPE", "-s", "PTTYPE", "-o", "export", disk} klog.V(4).Infof("Attempting to determine if disk %q is formatted using blkid with args: (%v)", disk, args) - dataOut, err := mounter.Exec.Command("blkid", args...).CombinedOutput() + dataOut, err := exec.Command("blkid", args...).CombinedOutput() output := string(dataOut) klog.V(4).Infof("Output: %q", output) @@ -476,6 +493,11 @@ func (mounter *SafeFormatAndMount) GetDiskFormat(disk string) (string, error) { return fstype, nil } +// GetDiskFormat uses 'blkid' to see if the given disk is unformatted +func (mounter *SafeFormatAndMount) GetDiskFormat(disk string) (string, error) { + return getDiskFormat(mounter.Exec, disk) +} + // ListProcMounts is shared with NsEnterMounter func ListProcMounts(mountFilePath string) ([]MountPoint, error) { content, err := utilio.ConsistentRead(mountFilePath, maxListTries) @@ -573,3 +595,34 @@ func SearchMountPoints(hostSource, mountInfoPath string) ([]string, error) { return refs, nil } + +// tryUnmount calls plain "umount" and waits for unmountTimeout for it to finish. +func tryUnmount(path string, unmountTimeout time.Duration) error { + klog.V(4).Infof("Unmounting %s", path) + ctx, cancel := context.WithTimeout(context.Background(), unmountTimeout) + defer cancel() + + cmd := exec.CommandContext(ctx, "umount", path) + out, cmderr := cmd.CombinedOutput() + + // CombinedOutput() does not return DeadlineExceeded, make sure it's + // propagated on timeout. + if ctx.Err() != nil { + return ctx.Err() + } + + if cmderr != nil { + return fmt.Errorf("unmount failed: %v\nUnmounting arguments: %s\nOutput: %s", cmderr, path, string(out)) + } + return nil +} + +func forceUmount(path string) error { + cmd := exec.Command("umount", "-f", path) + out, cmderr := cmd.CombinedOutput() + + if cmderr != nil { + return fmt.Errorf("unmount failed: %v\nUnmounting arguments: %s\nOutput: %s", cmderr, path, string(out)) + } + return nil +} diff --git a/vendor/k8s.io/mount-utils/mount_windows.go b/vendor/k8s.io/mount-utils/mount_windows.go index 358bcf52f200..29d3bbbd376e 100644 --- a/vendor/k8s.io/mount-utils/mount_windows.go +++ b/vendor/k8s.io/mount-utils/mount_windows.go @@ -164,7 +164,7 @@ func newSMBMapping(username, password, remotepath string) (string, error) { // https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_environment_variables?view=powershell-5.1 cmdLine := `$PWord = ConvertTo-SecureString -String $Env:smbpassword -AsPlainText -Force` + `;$Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $Env:smbuser, $PWord` + - `;New-SmbGlobalMapping -RemotePath $Env:smbremotepath -Credential $Credential` + `;New-SmbGlobalMapping -RemotePath $Env:smbremotepath -Credential $Credential -RequirePrivacy $true` cmd := exec.Command("powershell", "/c", cmdLine) cmd.Env = append(os.Environ(), fmt.Sprintf("smbuser=%s", username), diff --git a/vendor/k8s.io/mount-utils/resizefs_linux.go b/vendor/k8s.io/mount-utils/resizefs_linux.go new file mode 100644 index 000000000000..3b2ffa313661 --- /dev/null +++ b/vendor/k8s.io/mount-utils/resizefs_linux.go @@ -0,0 +1,101 @@ +// +build linux + +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package mount + +import ( + "fmt" + + "k8s.io/klog/v2" + utilexec "k8s.io/utils/exec" +) + +// ResizeFs Provides support for resizing file systems +type ResizeFs struct { + exec utilexec.Interface +} + +// NewResizeFs returns new instance of resizer +func NewResizeFs(exec utilexec.Interface) *ResizeFs { + return &ResizeFs{exec: exec} +} + +// Resize perform resize of file system +func (resizefs *ResizeFs) Resize(devicePath string, deviceMountPath string) (bool, error) { + format, err := getDiskFormat(resizefs.exec, devicePath) + + if err != nil { + formatErr := fmt.Errorf("ResizeFS.Resize - error checking format for device %s: %v", devicePath, err) + return false, formatErr + } + + // If disk has no format, there is no need to resize the disk because mkfs.* + // by default will use whole disk anyways. + if format == "" { + return false, nil + } + + klog.V(3).Infof("ResizeFS.Resize - Expanding mounted volume %s", devicePath) + switch format { + case "ext3", "ext4": + return resizefs.extResize(devicePath) + case "xfs": + return resizefs.xfsResize(deviceMountPath) + case "btrfs": + return resizefs.btrfsResize(deviceMountPath) + } + return false, fmt.Errorf("ResizeFS.Resize - resize of format %s is not supported for device %s mounted at %s", format, devicePath, deviceMountPath) +} + +func (resizefs *ResizeFs) extResize(devicePath string) (bool, error) { + output, err := resizefs.exec.Command("resize2fs", devicePath).CombinedOutput() + if err == nil { + klog.V(2).Infof("Device %s resized successfully", devicePath) + return true, nil + } + + resizeError := fmt.Errorf("resize of device %s failed: %v. resize2fs output: %s", devicePath, err, string(output)) + return false, resizeError + +} + +func (resizefs *ResizeFs) xfsResize(deviceMountPath string) (bool, error) { + args := []string{"-d", deviceMountPath} + output, err := resizefs.exec.Command("xfs_growfs", args...).CombinedOutput() + + if err == nil { + klog.V(2).Infof("Device %s resized successfully", deviceMountPath) + return true, nil + } + + resizeError := fmt.Errorf("resize of device %s failed: %v. xfs_growfs output: %s", deviceMountPath, err, string(output)) + return false, resizeError +} + +func (resizefs *ResizeFs) btrfsResize(deviceMountPath string) (bool, error) { + args := []string{"filesystem", "resize", "max", deviceMountPath} + output, err := resizefs.exec.Command("btrfs", args...).CombinedOutput() + + if err == nil { + klog.V(2).Infof("Device %s resized successfully", deviceMountPath) + return true, nil + } + + resizeError := fmt.Errorf("resize of device %s failed: %v. btrfs output: %s", deviceMountPath, err, string(output)) + return false, resizeError +} diff --git a/vendor/k8s.io/kubernetes/pkg/util/resizefs/resizefs_unsupported.go b/vendor/k8s.io/mount-utils/resizefs_unsupported.go similarity index 80% rename from vendor/k8s.io/kubernetes/pkg/util/resizefs/resizefs_unsupported.go rename to vendor/k8s.io/mount-utils/resizefs_unsupported.go index 6fbae9ca477f..9cf11090c7c5 100644 --- a/vendor/k8s.io/kubernetes/pkg/util/resizefs/resizefs_unsupported.go +++ b/vendor/k8s.io/mount-utils/resizefs_unsupported.go @@ -1,7 +1,7 @@ // +build !linux /* -Copyright 2017 The Kubernetes Authors. +Copyright 2021 The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -16,22 +16,22 @@ See the License for the specific language governing permissions and limitations under the License. */ -package resizefs +package mount import ( "fmt" - "k8s.io/mount-utils" + utilexec "k8s.io/utils/exec" ) // ResizeFs Provides support for resizing file systems type ResizeFs struct { - mounter *mount.SafeFormatAndMount + exec utilexec.Interface } // NewResizeFs returns new instance of resizer -func NewResizeFs(mounter *mount.SafeFormatAndMount) *ResizeFs { - return &ResizeFs{mounter: mounter} +func NewResizeFs(exec utilexec.Interface) *ResizeFs { + return &ResizeFs{exec: exec} } // Resize perform resize of file system diff --git a/vendor/k8s.io/sample-apiserver/pkg/apis/wardle/BUILD b/vendor/k8s.io/sample-apiserver/pkg/apis/wardle/BUILD deleted file mode 100644 index 5e7e3b22b39f..000000000000 --- a/vendor/k8s.io/sample-apiserver/pkg/apis/wardle/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/sample-apiserver/pkg/apis/wardle", - importpath = "k8s.io/sample-apiserver/pkg/apis/wardle", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/sample-apiserver/pkg/apis/wardle/fuzzer:all-srcs", - "//staging/src/k8s.io/sample-apiserver/pkg/apis/wardle/install:all-srcs", - "//staging/src/k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1:all-srcs", - "//staging/src/k8s.io/sample-apiserver/pkg/apis/wardle/v1beta1:all-srcs", - "//staging/src/k8s.io/sample-apiserver/pkg/apis/wardle/validation:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1/BUILD b/vendor/k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1/BUILD deleted file mode 100644 index 6a381f0b09ab..000000000000 --- a/vendor/k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "defaults.go", - "doc.go", - "register.go", - "types.go", - "zz_generated.conversion.go", - "zz_generated.deepcopy.go", - "zz_generated.defaults.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1", - importpath = "k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1", - deps = [ - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/sample-apiserver/pkg/apis/wardle:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/modules.txt b/vendor/modules.txt index c80385cacc00..3abf659a1b5b 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -14,7 +14,7 @@ github.com/Azure/go-ansiterm github.com/Azure/go-ansiterm/winterm # github.com/Azure/go-autorest v14.2.0+incompatible github.com/Azure/go-autorest -# github.com/Azure/go-autorest/autorest v0.11.1 +# github.com/Azure/go-autorest/autorest v0.11.12 github.com/Azure/go-autorest/autorest github.com/Azure/go-autorest/autorest/azure # github.com/Azure/go-autorest/autorest/adal v0.9.5 @@ -41,12 +41,14 @@ github.com/JeffAshton/win_pdh # github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd ## explicit github.com/MakeNowJust/heredoc -# github.com/Microsoft/go-winio v0.4.15 +# github.com/Microsoft/go-winio v0.4.16 github.com/Microsoft/go-winio github.com/Microsoft/go-winio/pkg/guid +github.com/Microsoft/go-winio/pkg/security github.com/Microsoft/go-winio/vhd -# github.com/Microsoft/hcsshim v0.8.10-0.20200715222032-5eafd1556990 +# github.com/Microsoft/hcsshim v0.8.14 github.com/Microsoft/hcsshim +github.com/Microsoft/hcsshim/computestorage github.com/Microsoft/hcsshim/hcn github.com/Microsoft/hcsshim/internal/cni github.com/Microsoft/hcsshim/internal/cow @@ -67,8 +69,9 @@ github.com/Microsoft/hcsshim/internal/schema2 github.com/Microsoft/hcsshim/internal/timeout github.com/Microsoft/hcsshim/internal/vmcompute github.com/Microsoft/hcsshim/internal/wclayer +github.com/Microsoft/hcsshim/internal/winapi github.com/Microsoft/hcsshim/osversion -# github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46 +# github.com/NYTimes/gziphandler v1.1.1 github.com/NYTimes/gziphandler # github.com/PuerkitoBio/purell v1.1.1 github.com/PuerkitoBio/purell @@ -136,14 +139,12 @@ github.com/beorn7/perks/quantile github.com/blang/semver # github.com/boltdb/bolt v1.3.1 ## explicit -# github.com/certifi/gocertifi v0.0.0-20180905225744-ee1a9a0726d2 -github.com/certifi/gocertifi # github.com/cespare/xxhash/v2 v2.1.1 github.com/cespare/xxhash/v2 # github.com/checkpoint-restore/go-criu/v4 v4.1.0 github.com/checkpoint-restore/go-criu/v4 github.com/checkpoint-restore/go-criu/v4/rpc -# github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775 +# github.com/cilium/ebpf v0.2.0 github.com/cilium/ebpf github.com/cilium/ebpf/asm github.com/cilium/ebpf/internal @@ -151,13 +152,13 @@ github.com/cilium/ebpf/internal/btf github.com/cilium/ebpf/internal/unix # github.com/clusterhq/flocker-go v0.0.0-20160920122132-2b8b7259d313 github.com/clusterhq/flocker-go -# github.com/container-storage-interface/spec v1.2.0 +# github.com/container-storage-interface/spec v1.3.0 github.com/container-storage-interface/spec/lib/go/csi # github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59 github.com/containerd/cgroups/stats/v1 -# github.com/containerd/console v1.0.0 +# github.com/containerd/console v1.0.1 github.com/containerd/console -# github.com/containerd/containerd v1.4.1 +# github.com/containerd/containerd v1.4.4 github.com/containerd/containerd/api/services/containers/v1 github.com/containerd/containerd/api/services/tasks/v1 github.com/containerd/containerd/api/services/version/v1 @@ -166,12 +167,13 @@ github.com/containerd/containerd/api/types/task github.com/containerd/containerd/containers github.com/containerd/containerd/errdefs github.com/containerd/containerd/identifiers +github.com/containerd/containerd/log github.com/containerd/containerd/namespaces github.com/containerd/containerd/pkg/dialer -# github.com/containerd/continuity v0.0.0-20190827140505-75bee3e2ccb6 +github.com/containerd/containerd/platforms +github.com/containerd/containerd/sys +# github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e github.com/containerd/continuity/fs -github.com/containerd/continuity/pathdriver -github.com/containerd/continuity/syscallx github.com/containerd/continuity/sysx # github.com/containerd/ttrpc v1.0.2 github.com/containerd/ttrpc @@ -210,7 +212,7 @@ github.com/docker/distribution/manifest/schema1 github.com/docker/distribution/manifest/schema2 github.com/docker/distribution/reference github.com/docker/distribution/registry/api/errcode -# github.com/docker/docker v17.12.0-ce-rc1.0.20200916142827-bd33bbf0497b+incompatible +# github.com/docker/docker v20.10.3-0.20210216175712-646072ed6524+incompatible github.com/docker/docker/api github.com/docker/docker/api/types github.com/docker/docker/api/types/blkiodev @@ -229,7 +231,6 @@ github.com/docker/docker/api/types/versions github.com/docker/docker/api/types/volume github.com/docker/docker/client github.com/docker/docker/errdefs -github.com/docker/docker/opts github.com/docker/docker/pkg/archive github.com/docker/docker/pkg/fileutils github.com/docker/docker/pkg/homedir @@ -237,25 +238,17 @@ github.com/docker/docker/pkg/idtools github.com/docker/docker/pkg/ioutils github.com/docker/docker/pkg/jsonmessage github.com/docker/docker/pkg/longpath -github.com/docker/docker/pkg/mount github.com/docker/docker/pkg/pools github.com/docker/docker/pkg/stdcopy github.com/docker/docker/pkg/system -github.com/docker/docker/pkg/term -github.com/docker/docker/pkg/term/windows # github.com/docker/go-connections v0.4.0 github.com/docker/go-connections/nat github.com/docker/go-connections/sockets github.com/docker/go-connections/tlsconfig # github.com/docker/go-units v0.4.0 github.com/docker/go-units -# github.com/docker/libnetwork v0.0.0-20190731215715-7f13a5c99f4b -github.com/docker/libnetwork/ipamutils # github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7 github.com/docker/libtrust -# github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96 -github.com/docker/spdystream -github.com/docker/spdystream/spdy # github.com/dustin/go-humanize v1.0.0 github.com/dustin/go-humanize # github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153 @@ -282,11 +275,9 @@ github.com/fatih/camelcase github.com/form3tech-oss/jwt-go # github.com/fsnotify/fsnotify v1.4.9 github.com/fsnotify/fsnotify -# github.com/fsouza/go-dockerclient v0.0.0-20171004212419-da3951ba2e9e +# github.com/fsouza/go-dockerclient v1.7.1 ## explicit github.com/fsouza/go-dockerclient -# github.com/getsentry/raven-go v0.0.0-20190513200303-c977f96e1095 -github.com/getsentry/raven-go # github.com/ghodss/yaml v1.0.0 ## explicit github.com/ghodss/yaml @@ -294,13 +285,15 @@ github.com/ghodss/yaml ## explicit github.com/go-bindata/go-bindata github.com/go-bindata/go-bindata/go-bindata +# github.com/go-errors/errors v1.0.1 +github.com/go-errors/errors # github.com/go-logr/logr v0.4.0 github.com/go-logr/logr # github.com/go-openapi/jsonpointer v0.19.3 github.com/go-openapi/jsonpointer # github.com/go-openapi/jsonreference v0.19.3 github.com/go-openapi/jsonreference -# github.com/go-openapi/spec v0.19.3 +# github.com/go-openapi/spec v0.19.5 github.com/go-openapi/spec # github.com/go-openapi/swag v0.19.5 github.com/go-openapi/swag @@ -318,7 +311,7 @@ github.com/gogo/protobuf/sortkeys github.com/gogo/protobuf/types # github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e github.com/golang/groupcache/lru -# github.com/golang/mock v1.4.1 +# github.com/golang/mock v1.4.4 github.com/golang/mock/gomock # github.com/golang/protobuf v1.4.3 ## explicit @@ -335,7 +328,7 @@ github.com/golang/protobuf/ptypes/timestamp github.com/golang/protobuf/ptypes/wrappers # github.com/google/btree v1.0.0 github.com/google/btree -# github.com/google/cadvisor v0.38.5 +# github.com/google/cadvisor v0.39.0 github.com/google/cadvisor/accelerators github.com/google/cadvisor/cache/memory github.com/google/cadvisor/collector @@ -379,15 +372,18 @@ github.com/google/cadvisor/utils/sysinfo github.com/google/cadvisor/version github.com/google/cadvisor/watcher github.com/google/cadvisor/zfs -# github.com/google/go-cmp v0.5.2 +# github.com/google/go-cmp v0.5.4 ## explicit github.com/google/go-cmp/cmp +github.com/google/go-cmp/cmp/cmpopts github.com/google/go-cmp/cmp/internal/diff github.com/google/go-cmp/cmp/internal/flags github.com/google/go-cmp/cmp/internal/function github.com/google/go-cmp/cmp/internal/value # github.com/google/gofuzz v1.1.0 github.com/google/gofuzz +# github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 +github.com/google/shlex # github.com/google/uuid v1.1.2 ## explicit github.com/google/uuid @@ -429,8 +425,6 @@ github.com/gophercloud/gophercloud/openstack/networking/v2/networks github.com/gophercloud/gophercloud/openstack/networking/v2/ports github.com/gophercloud/gophercloud/openstack/utils github.com/gophercloud/gophercloud/pagination -# github.com/gorilla/context v1.1.1 -## explicit # github.com/gorilla/websocket v1.4.2 github.com/gorilla/websocket # github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 @@ -458,7 +452,7 @@ github.com/hashicorp/hcl/hcl/token github.com/hashicorp/hcl/json/parser github.com/hashicorp/hcl/json/scanner github.com/hashicorp/hcl/json/token -# github.com/heketi/heketi v9.0.1-0.20190917153846-c2e2a4ab7ab9+incompatible +# github.com/heketi/heketi v10.2.0+incompatible github.com/heketi/heketi/client/api/go-client github.com/heketi/heketi/pkg/glusterfs/api github.com/heketi/heketi/pkg/utils @@ -486,8 +480,6 @@ github.com/json-iterator/go github.com/karrick/godirwalk # github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd github.com/kevinburke/ssh_config -# github.com/konsorten/go-windows-terminal-sequences v1.0.3 -github.com/konsorten/go-windows-terminal-sequences # github.com/lestrrat-go/jspointer v0.0.0-20181205001929-82fadba7561c ## explicit github.com/lestrrat-go/jspointer @@ -530,7 +522,7 @@ github.com/mailru/easyjson/jlexer github.com/mailru/easyjson/jwriter # github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 github.com/matttproud/golang_protobuf_extensions/pbutil -# github.com/miekg/dns v1.1.4 +# github.com/miekg/dns v1.1.35 github.com/miekg/dns # github.com/mindprince/gonvml v0.0.0-20190828220739-9ebdce4bb989 github.com/mindprince/gonvml @@ -544,9 +536,14 @@ github.com/mitchellh/go-wordwrap github.com/mitchellh/mapstructure # github.com/moby/ipvs v1.0.1 github.com/moby/ipvs -# github.com/moby/sys/mountinfo v0.1.3 +# github.com/moby/spdystream v0.2.0 +github.com/moby/spdystream +github.com/moby/spdystream/spdy +# github.com/moby/sys/mount v0.2.0 +github.com/moby/sys/mount +# github.com/moby/sys/mountinfo v0.4.0 github.com/moby/sys/mountinfo -# github.com/moby/term v0.0.0-20200312100748-672ec06f55cd +# github.com/moby/term v0.0.0-20201216013528-df9cb8a40635 github.com/moby/term github.com/moby/term/windows # github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd @@ -556,9 +553,11 @@ github.com/modern-go/reflect2 # github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 ## explicit github.com/mohae/deepcopy +# github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 +github.com/monochromegane/go-gitignore # github.com/morikuni/aec v1.0.0 github.com/morikuni/aec -# github.com/mrunalp/fileutils v0.0.0-20200520151820-abd8a0e76976 +# github.com/mrunalp/fileutils v0.5.0 github.com/mrunalp/fileutils # github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 github.com/munnerz/goautoneg @@ -607,9 +606,10 @@ github.com/opencontainers/go-digest # github.com/opencontainers/image-spec v1.0.1 github.com/opencontainers/image-spec/specs-go github.com/opencontainers/image-spec/specs-go/v1 -# github.com/opencontainers/runc v1.0.0-rc92 +# github.com/opencontainers/runc v1.0.0-rc93 github.com/opencontainers/runc/libcontainer github.com/opencontainers/runc/libcontainer/apparmor +github.com/opencontainers/runc/libcontainer/capabilities github.com/opencontainers/runc/libcontainer/cgroups github.com/opencontainers/runc/libcontainer/cgroups/devices github.com/opencontainers/runc/libcontainer/cgroups/ebpf @@ -620,22 +620,24 @@ github.com/opencontainers/runc/libcontainer/cgroups/fscommon github.com/opencontainers/runc/libcontainer/cgroups/systemd github.com/opencontainers/runc/libcontainer/configs github.com/opencontainers/runc/libcontainer/configs/validate +github.com/opencontainers/runc/libcontainer/devices github.com/opencontainers/runc/libcontainer/intelrdt github.com/opencontainers/runc/libcontainer/keys github.com/opencontainers/runc/libcontainer/logs github.com/opencontainers/runc/libcontainer/seccomp +github.com/opencontainers/runc/libcontainer/seccomp/patchbpf github.com/opencontainers/runc/libcontainer/stacktrace github.com/opencontainers/runc/libcontainer/system github.com/opencontainers/runc/libcontainer/user github.com/opencontainers/runc/libcontainer/utils github.com/opencontainers/runc/types -# github.com/opencontainers/runtime-spec v1.0.3-0.20200728170252-4d89ac9fbff6 +# github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d github.com/opencontainers/runtime-spec/specs-go -# github.com/opencontainers/selinux v1.6.0 +# github.com/opencontainers/selinux v1.8.0 github.com/opencontainers/selinux/go-selinux github.com/opencontainers/selinux/go-selinux/label github.com/opencontainers/selinux/pkg/pwalk -# github.com/openshift/api v0.0.0-20210420151714-a3c8fa53e01b +# github.com/openshift/api v0.0.0-20210423140644-156ca80f8d83 ## explicit github.com/openshift/api github.com/openshift/api/annotations @@ -698,7 +700,7 @@ github.com/openshift/api/template/v1 github.com/openshift/api/unidling/v1alpha1 github.com/openshift/api/user github.com/openshift/api/user/v1 -# github.com/openshift/apiserver-library-go v0.0.0-20201214145556-6f1013f42f98 => github.com/openshift/apiserver-library-go v0.0.0-20201214145556-6f1013f42f98 +# github.com/openshift/apiserver-library-go v0.0.0-20210415093535-9176fb31e5dc ## explicit github.com/openshift/apiserver-library-go/pkg/admission/imagepolicy github.com/openshift/apiserver-library-go/pkg/admission/imagepolicy/apis/imagepolicy/v1 @@ -717,7 +719,7 @@ github.com/openshift/apiserver-library-go/pkg/securitycontextconstraints/selinux github.com/openshift/apiserver-library-go/pkg/securitycontextconstraints/user github.com/openshift/apiserver-library-go/pkg/securitycontextconstraints/util github.com/openshift/apiserver-library-go/pkg/securitycontextconstraints/util/sort -# github.com/openshift/build-machinery-go v0.0.0-20210209125900-0da259a2c359 +# github.com/openshift/build-machinery-go v0.0.0-20210423112049-9415d7ebd33e ## explicit github.com/openshift/build-machinery-go github.com/openshift/build-machinery-go/make @@ -727,7 +729,7 @@ github.com/openshift/build-machinery-go/make/targets/golang github.com/openshift/build-machinery-go/make/targets/openshift github.com/openshift/build-machinery-go/make/targets/openshift/operator github.com/openshift/build-machinery-go/scripts -# github.com/openshift/client-go v0.0.0-20210416122133-a6ef8fb5934b +# github.com/openshift/client-go v0.0.0-20210422153130-25c8450d1535 ## explicit github.com/openshift/client-go/apiserver/clientset/versioned/scheme github.com/openshift/client-go/apiserver/clientset/versioned/typed/apiserver/v1 @@ -796,7 +798,7 @@ github.com/openshift/client-go/user/informers/externalversions/internalinterface github.com/openshift/client-go/user/informers/externalversions/user github.com/openshift/client-go/user/informers/externalversions/user/v1 github.com/openshift/client-go/user/listers/user/v1 -# github.com/openshift/library-go v0.0.0-20201214135256-d265f469e75b => github.com/openshift/library-go v0.0.0-20201214135256-d265f469e75b +# github.com/openshift/library-go v0.0.0-20210420183610-0e395da73318 ## explicit github.com/openshift/library-go/pkg/apiserver/admission/admissionrestconfig github.com/openshift/library-go/pkg/apiserver/admission/admissiontimeout @@ -805,6 +807,7 @@ github.com/openshift/library-go/pkg/apiserver/httprequest github.com/openshift/library-go/pkg/apps/appsserialization github.com/openshift/library-go/pkg/apps/appsutil github.com/openshift/library-go/pkg/authentication/bootstrapauthenticator +github.com/openshift/library-go/pkg/authorization/hardcodedauthorizer github.com/openshift/library-go/pkg/authorization/scopemetadata github.com/openshift/library-go/pkg/build/naming github.com/openshift/library-go/pkg/config/client @@ -891,9 +894,9 @@ github.com/russross/blackfriday github.com/satori/go.uuid # github.com/seccomp/libseccomp-golang v0.9.1 github.com/seccomp/libseccomp-golang -# github.com/sergi/go-diff v1.0.0 +# github.com/sergi/go-diff v1.1.0 github.com/sergi/go-diff/diffmatchpatch -# github.com/sirupsen/logrus v1.6.0 +# github.com/sirupsen/logrus v1.7.0 github.com/sirupsen/logrus # github.com/soheilhy/cmux v0.1.4 github.com/soheilhy/cmux @@ -933,7 +936,7 @@ github.com/stretchr/testify/mock github.com/stretchr/testify/require # github.com/subosito/gotenv v1.2.0 github.com/subosito/gotenv -# github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2 +# github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 github.com/syndtr/gocapability/capability # github.com/thecodeteam/goscaleio v0.1.0 github.com/thecodeteam/goscaleio @@ -973,7 +976,7 @@ github.com/vmware/govmomi/vim25/progress github.com/vmware/govmomi/vim25/soap github.com/vmware/govmomi/vim25/types github.com/vmware/govmomi/vim25/xml -# github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243 +# github.com/willf/bitset v1.1.11 github.com/willf/bitset # github.com/xanzy/ssh-agent v0.2.1 github.com/xanzy/ssh-agent @@ -981,6 +984,8 @@ github.com/xanzy/ssh-agent ## explicit # github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 github.com/xiang90/probing +# github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca +github.com/xlab/treeprint # go.etcd.io/bbolt v1.3.5 go.etcd.io/bbolt # go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489 @@ -1085,6 +1090,13 @@ go.opencensus.io/trace go.opencensus.io/trace/internal go.opencensus.io/trace/propagation go.opencensus.io/trace/tracestate +# go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 +go.starlark.net/internal/compile +go.starlark.net/internal/spell +go.starlark.net/resolve +go.starlark.net/starlark +go.starlark.net/starlarkstruct +go.starlark.net/syntax # go.uber.org/atomic v1.4.0 go.uber.org/atomic # go.uber.org/multierr v1.1.1-0.20180122172545-ddea229ff1df @@ -1096,7 +1108,7 @@ go.uber.org/zap/internal/bufferpool go.uber.org/zap/internal/color go.uber.org/zap/internal/exit go.uber.org/zap/zapcore -# golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0 +# golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 ## explicit golang.org/x/crypto/bcrypt golang.org/x/crypto/blowfish @@ -1124,8 +1136,7 @@ golang.org/x/crypto/ssh golang.org/x/crypto/ssh/agent golang.org/x/crypto/ssh/internal/bcrypt_pbkdf golang.org/x/crypto/ssh/knownhosts -golang.org/x/crypto/ssh/terminal -# golang.org/x/net v0.0.0-20201110031124-69a78807bb2b +# golang.org/x/net v0.0.0-20210224082022-3d97a244fca7 ## explicit golang.org/x/net/bpf golang.org/x/net/context @@ -1156,14 +1167,17 @@ golang.org/x/oauth2/jwt # golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9 golang.org/x/sync/errgroup golang.org/x/sync/singleflight -# golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c -## explicit +# golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073 golang.org/x/sys/cpu +golang.org/x/sys/execabs golang.org/x/sys/internal/unsafeheader +golang.org/x/sys/plan9 golang.org/x/sys/unix golang.org/x/sys/windows golang.org/x/sys/windows/registry golang.org/x/sys/windows/svc +# golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d +golang.org/x/term # golang.org/x/text v0.3.4 golang.org/x/text/encoding golang.org/x/text/encoding/charmap @@ -1186,10 +1200,13 @@ golang.org/x/text/transform golang.org/x/text/unicode/bidi golang.org/x/text/unicode/norm golang.org/x/text/width -# golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e +# golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba golang.org/x/time/rate # golang.org/x/tools v0.1.0 golang.org/x/tools/container/intsets +# golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 +golang.org/x/xerrors +golang.org/x/xerrors/internal # google.golang.org/api v0.20.0 google.golang.org/api/compute/v0.alpha google.golang.org/api/compute/v0.beta @@ -1377,12 +1394,12 @@ gopkg.in/src-d/go-git.v4/utils/merkletrie/noder gopkg.in/tomb.v1 # gopkg.in/warnings.v0 v0.1.2 gopkg.in/warnings.v0 -# gopkg.in/yaml.v2 v2.3.0 +# gopkg.in/yaml.v2 v2.4.0 ## explicit gopkg.in/yaml.v2 # gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c gopkg.in/yaml.v3 -# k8s.io/api v0.21.0-rc.0 => github.com/openshift/kubernetes/staging/src/k8s.io/api v0.0.0-20210208155256-e509061a6d18 +# k8s.io/api v0.21.0-rc.0 => github.com/openshift/kubernetes/staging/src/k8s.io/api v0.0.0-20210429023751-daa555af5040 ## explicit k8s.io/api/admission/v1 k8s.io/api/admission/v1beta1 @@ -1401,13 +1418,12 @@ k8s.io/api/autoscaling/v2beta1 k8s.io/api/autoscaling/v2beta2 k8s.io/api/batch/v1 k8s.io/api/batch/v1beta1 -k8s.io/api/batch/v2alpha1 k8s.io/api/certificates/v1 k8s.io/api/certificates/v1beta1 k8s.io/api/coordination/v1 k8s.io/api/coordination/v1beta1 k8s.io/api/core/v1 -k8s.io/api/discovery/v1alpha1 +k8s.io/api/discovery/v1 k8s.io/api/discovery/v1beta1 k8s.io/api/events/v1 k8s.io/api/events/v1beta1 @@ -1420,6 +1436,7 @@ k8s.io/api/networking/v1beta1 k8s.io/api/node/v1 k8s.io/api/node/v1alpha1 k8s.io/api/node/v1beta1 +k8s.io/api/policy/v1 k8s.io/api/policy/v1beta1 k8s.io/api/rbac/v1 k8s.io/api/rbac/v1alpha1 @@ -1430,7 +1447,7 @@ k8s.io/api/scheduling/v1beta1 k8s.io/api/storage/v1 k8s.io/api/storage/v1alpha1 k8s.io/api/storage/v1beta1 -# k8s.io/apiextensions-apiserver v0.20.0 => github.com/openshift/kubernetes/staging/src/k8s.io/apiextensions-apiserver v0.0.0-20210208155256-e509061a6d18 +# k8s.io/apiextensions-apiserver v0.21.0-rc.0 => github.com/openshift/kubernetes/staging/src/k8s.io/apiextensions-apiserver v0.0.0-20210429023751-daa555af5040 ## explicit k8s.io/apiextensions-apiserver/pkg/apihelpers k8s.io/apiextensions-apiserver/pkg/apis/apiextensions @@ -1474,7 +1491,7 @@ k8s.io/apiextensions-apiserver/pkg/registry/customresource/tableconvertor k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition k8s.io/apiextensions-apiserver/test/integration k8s.io/apiextensions-apiserver/test/integration/fixtures -# k8s.io/apimachinery v0.21.0-rc.0 => github.com/openshift/kubernetes/staging/src/k8s.io/apimachinery v0.0.0-20210208155256-e509061a6d18 +# k8s.io/apimachinery v0.21.0-rc.0 => github.com/openshift/kubernetes/staging/src/k8s.io/apimachinery v0.0.0-20210429023751-daa555af5040 ## explicit k8s.io/apimachinery/pkg/api/apitesting k8s.io/apimachinery/pkg/api/equality @@ -1517,6 +1534,7 @@ k8s.io/apimachinery/pkg/util/httpstream k8s.io/apimachinery/pkg/util/httpstream/spdy k8s.io/apimachinery/pkg/util/intstr k8s.io/apimachinery/pkg/util/json +k8s.io/apimachinery/pkg/util/managedfields k8s.io/apimachinery/pkg/util/mergepatch k8s.io/apimachinery/pkg/util/naming k8s.io/apimachinery/pkg/util/net @@ -1538,7 +1556,7 @@ k8s.io/apimachinery/pkg/watch k8s.io/apimachinery/third_party/forked/golang/json k8s.io/apimachinery/third_party/forked/golang/netutil k8s.io/apimachinery/third_party/forked/golang/reflect -# k8s.io/apiserver v0.20.0 => github.com/openshift/kubernetes/staging/src/k8s.io/apiserver v0.0.0-20210208155256-e509061a6d18 +# k8s.io/apiserver v0.21.0-rc.0 => github.com/openshift/kubernetes/staging/src/k8s.io/apiserver v0.0.0-20210429023751-daa555af5040 ## explicit k8s.io/apiserver/pkg/admission k8s.io/apiserver/pkg/admission/configuration @@ -1679,22 +1697,54 @@ k8s.io/apiserver/plugin/pkg/audit/webhook k8s.io/apiserver/plugin/pkg/authenticator/token/oidc k8s.io/apiserver/plugin/pkg/authenticator/token/webhook k8s.io/apiserver/plugin/pkg/authorizer/webhook -# k8s.io/cli-runtime v0.20.0 => github.com/openshift/kubernetes/staging/src/k8s.io/cli-runtime v0.0.0-20210208155256-e509061a6d18 +# k8s.io/cli-runtime v0.21.0-rc.0 => github.com/openshift/kubernetes/staging/src/k8s.io/cli-runtime v0.0.0-20210429023751-daa555af5040 ## explicit k8s.io/cli-runtime/pkg/genericclioptions -k8s.io/cli-runtime/pkg/kustomize -k8s.io/cli-runtime/pkg/kustomize/k8sdeps -k8s.io/cli-runtime/pkg/kustomize/k8sdeps/configmapandsecret -k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kunstruct -k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kv -k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer -k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/hash -k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/patch -k8s.io/cli-runtime/pkg/kustomize/k8sdeps/validator k8s.io/cli-runtime/pkg/printers k8s.io/cli-runtime/pkg/resource -# k8s.io/client-go v0.21.0-rc.0 => github.com/openshift/kubernetes/staging/src/k8s.io/client-go v0.0.0-20210208155256-e509061a6d18 -## explicit +# k8s.io/client-go v0.21.0-rc.0 => github.com/openshift/kubernetes/staging/src/k8s.io/client-go v0.0.0-20210429023751-daa555af5040 +## explicit +k8s.io/client-go/applyconfigurations/admissionregistration/v1 +k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1 +k8s.io/client-go/applyconfigurations/apiserverinternal/v1alpha1 +k8s.io/client-go/applyconfigurations/apps/v1 +k8s.io/client-go/applyconfigurations/apps/v1beta1 +k8s.io/client-go/applyconfigurations/apps/v1beta2 +k8s.io/client-go/applyconfigurations/autoscaling/v1 +k8s.io/client-go/applyconfigurations/autoscaling/v2beta1 +k8s.io/client-go/applyconfigurations/autoscaling/v2beta2 +k8s.io/client-go/applyconfigurations/batch/v1 +k8s.io/client-go/applyconfigurations/batch/v1beta1 +k8s.io/client-go/applyconfigurations/certificates/v1 +k8s.io/client-go/applyconfigurations/certificates/v1beta1 +k8s.io/client-go/applyconfigurations/coordination/v1 +k8s.io/client-go/applyconfigurations/coordination/v1beta1 +k8s.io/client-go/applyconfigurations/core/v1 +k8s.io/client-go/applyconfigurations/discovery/v1 +k8s.io/client-go/applyconfigurations/discovery/v1beta1 +k8s.io/client-go/applyconfigurations/events/v1 +k8s.io/client-go/applyconfigurations/events/v1beta1 +k8s.io/client-go/applyconfigurations/extensions/v1beta1 +k8s.io/client-go/applyconfigurations/flowcontrol/v1alpha1 +k8s.io/client-go/applyconfigurations/flowcontrol/v1beta1 +k8s.io/client-go/applyconfigurations/internal +k8s.io/client-go/applyconfigurations/meta/v1 +k8s.io/client-go/applyconfigurations/networking/v1 +k8s.io/client-go/applyconfigurations/networking/v1beta1 +k8s.io/client-go/applyconfigurations/node/v1 +k8s.io/client-go/applyconfigurations/node/v1alpha1 +k8s.io/client-go/applyconfigurations/node/v1beta1 +k8s.io/client-go/applyconfigurations/policy/v1 +k8s.io/client-go/applyconfigurations/policy/v1beta1 +k8s.io/client-go/applyconfigurations/rbac/v1 +k8s.io/client-go/applyconfigurations/rbac/v1alpha1 +k8s.io/client-go/applyconfigurations/rbac/v1beta1 +k8s.io/client-go/applyconfigurations/scheduling/v1 +k8s.io/client-go/applyconfigurations/scheduling/v1alpha1 +k8s.io/client-go/applyconfigurations/scheduling/v1beta1 +k8s.io/client-go/applyconfigurations/storage/v1 +k8s.io/client-go/applyconfigurations/storage/v1alpha1 +k8s.io/client-go/applyconfigurations/storage/v1beta1 k8s.io/client-go/discovery k8s.io/client-go/discovery/cached k8s.io/client-go/discovery/cached/disk @@ -1720,7 +1770,6 @@ k8s.io/client-go/informers/autoscaling/v2beta2 k8s.io/client-go/informers/batch k8s.io/client-go/informers/batch/v1 k8s.io/client-go/informers/batch/v1beta1 -k8s.io/client-go/informers/batch/v2alpha1 k8s.io/client-go/informers/certificates k8s.io/client-go/informers/certificates/v1 k8s.io/client-go/informers/certificates/v1beta1 @@ -1730,7 +1779,7 @@ k8s.io/client-go/informers/coordination/v1beta1 k8s.io/client-go/informers/core k8s.io/client-go/informers/core/v1 k8s.io/client-go/informers/discovery -k8s.io/client-go/informers/discovery/v1alpha1 +k8s.io/client-go/informers/discovery/v1 k8s.io/client-go/informers/discovery/v1beta1 k8s.io/client-go/informers/events k8s.io/client-go/informers/events/v1 @@ -1749,6 +1798,7 @@ k8s.io/client-go/informers/node/v1 k8s.io/client-go/informers/node/v1alpha1 k8s.io/client-go/informers/node/v1beta1 k8s.io/client-go/informers/policy +k8s.io/client-go/informers/policy/v1 k8s.io/client-go/informers/policy/v1beta1 k8s.io/client-go/informers/rbac k8s.io/client-go/informers/rbac/v1 @@ -1795,8 +1845,6 @@ k8s.io/client-go/kubernetes/typed/batch/v1 k8s.io/client-go/kubernetes/typed/batch/v1/fake k8s.io/client-go/kubernetes/typed/batch/v1beta1 k8s.io/client-go/kubernetes/typed/batch/v1beta1/fake -k8s.io/client-go/kubernetes/typed/batch/v2alpha1 -k8s.io/client-go/kubernetes/typed/batch/v2alpha1/fake k8s.io/client-go/kubernetes/typed/certificates/v1 k8s.io/client-go/kubernetes/typed/certificates/v1/fake k8s.io/client-go/kubernetes/typed/certificates/v1beta1 @@ -1807,8 +1855,8 @@ k8s.io/client-go/kubernetes/typed/coordination/v1beta1 k8s.io/client-go/kubernetes/typed/coordination/v1beta1/fake k8s.io/client-go/kubernetes/typed/core/v1 k8s.io/client-go/kubernetes/typed/core/v1/fake -k8s.io/client-go/kubernetes/typed/discovery/v1alpha1 -k8s.io/client-go/kubernetes/typed/discovery/v1alpha1/fake +k8s.io/client-go/kubernetes/typed/discovery/v1 +k8s.io/client-go/kubernetes/typed/discovery/v1/fake k8s.io/client-go/kubernetes/typed/discovery/v1beta1 k8s.io/client-go/kubernetes/typed/discovery/v1beta1/fake k8s.io/client-go/kubernetes/typed/events/v1 @@ -1831,6 +1879,8 @@ k8s.io/client-go/kubernetes/typed/node/v1alpha1 k8s.io/client-go/kubernetes/typed/node/v1alpha1/fake k8s.io/client-go/kubernetes/typed/node/v1beta1 k8s.io/client-go/kubernetes/typed/node/v1beta1/fake +k8s.io/client-go/kubernetes/typed/policy/v1 +k8s.io/client-go/kubernetes/typed/policy/v1/fake k8s.io/client-go/kubernetes/typed/policy/v1beta1 k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake k8s.io/client-go/kubernetes/typed/rbac/v1 @@ -1862,13 +1912,12 @@ k8s.io/client-go/listers/autoscaling/v2beta1 k8s.io/client-go/listers/autoscaling/v2beta2 k8s.io/client-go/listers/batch/v1 k8s.io/client-go/listers/batch/v1beta1 -k8s.io/client-go/listers/batch/v2alpha1 k8s.io/client-go/listers/certificates/v1 k8s.io/client-go/listers/certificates/v1beta1 k8s.io/client-go/listers/coordination/v1 k8s.io/client-go/listers/coordination/v1beta1 k8s.io/client-go/listers/core/v1 -k8s.io/client-go/listers/discovery/v1alpha1 +k8s.io/client-go/listers/discovery/v1 k8s.io/client-go/listers/discovery/v1beta1 k8s.io/client-go/listers/events/v1 k8s.io/client-go/listers/events/v1beta1 @@ -1880,6 +1929,7 @@ k8s.io/client-go/listers/networking/v1beta1 k8s.io/client-go/listers/node/v1 k8s.io/client-go/listers/node/v1alpha1 k8s.io/client-go/listers/node/v1beta1 +k8s.io/client-go/listers/policy/v1 k8s.io/client-go/listers/policy/v1beta1 k8s.io/client-go/listers/rbac/v1 k8s.io/client-go/listers/rbac/v1alpha1 @@ -1944,20 +1994,21 @@ k8s.io/client-go/util/jsonpath k8s.io/client-go/util/keyutil k8s.io/client-go/util/retry k8s.io/client-go/util/workqueue -# k8s.io/cloud-provider v0.0.0 => github.com/openshift/kubernetes/staging/src/k8s.io/cloud-provider v0.0.0-20210208155256-e509061a6d18 +# k8s.io/cloud-provider v0.0.0 => github.com/openshift/kubernetes/staging/src/k8s.io/cloud-provider v0.0.0-20210429023751-daa555af5040 k8s.io/cloud-provider k8s.io/cloud-provider/api +k8s.io/cloud-provider/credentialconfig k8s.io/cloud-provider/node/helpers k8s.io/cloud-provider/service/helpers k8s.io/cloud-provider/volume k8s.io/cloud-provider/volume/errors k8s.io/cloud-provider/volume/helpers -# k8s.io/cluster-bootstrap v0.0.0 => github.com/openshift/kubernetes/staging/src/k8s.io/cluster-bootstrap v0.0.0-20210208155256-e509061a6d18 +# k8s.io/cluster-bootstrap v0.0.0 => github.com/openshift/kubernetes/staging/src/k8s.io/cluster-bootstrap v0.0.0-20210429023751-daa555af5040 k8s.io/cluster-bootstrap/token/api k8s.io/cluster-bootstrap/token/util k8s.io/cluster-bootstrap/util/secrets k8s.io/cluster-bootstrap/util/tokens -# k8s.io/component-base v0.20.0 => github.com/openshift/kubernetes/staging/src/k8s.io/component-base v0.0.0-20210208155256-e509061a6d18 +# k8s.io/component-base v0.21.0-rc.0 => github.com/openshift/kubernetes/staging/src/k8s.io/component-base v0.0.0-20210429023751-daa555af5040 ## explicit k8s.io/component-base/cli/flag k8s.io/component-base/cli/globalflag @@ -1980,25 +2031,26 @@ k8s.io/component-base/metrics/testutil k8s.io/component-base/term k8s.io/component-base/version k8s.io/component-base/version/verflag -# k8s.io/component-helpers v0.0.0 => github.com/openshift/kubernetes/staging/src/k8s.io/component-helpers v0.0.0-20210208155256-e509061a6d18 +# k8s.io/component-helpers v0.0.0 => github.com/openshift/kubernetes/staging/src/k8s.io/component-helpers v0.0.0-20210429023751-daa555af5040 ## explicit k8s.io/component-helpers/apimachinery/lease +k8s.io/component-helpers/apps/poddisruptionbudget k8s.io/component-helpers/auth/rbac/reconciliation k8s.io/component-helpers/auth/rbac/validation +k8s.io/component-helpers/node/topology k8s.io/component-helpers/scheduling/corev1 k8s.io/component-helpers/scheduling/corev1/nodeaffinity -# k8s.io/controller-manager v0.0.0 => github.com/openshift/kubernetes/staging/src/k8s.io/controller-manager v0.0.0-20210208155256-e509061a6d18 -k8s.io/controller-manager/pkg/clientbuilder -# k8s.io/cri-api v0.0.0 => github.com/openshift/kubernetes/staging/src/k8s.io/cri-api v0.0.0-20210208155256-e509061a6d18 +k8s.io/component-helpers/storage/volume +# k8s.io/cri-api v0.0.0 => github.com/openshift/kubernetes/staging/src/k8s.io/cri-api v0.0.0-20210429023751-daa555af5040 k8s.io/cri-api/pkg/apis k8s.io/cri-api/pkg/apis/runtime/v1alpha2 -# k8s.io/csi-translation-lib v0.0.0 => github.com/openshift/kubernetes/staging/src/k8s.io/csi-translation-lib v0.0.0-20210208155256-e509061a6d18 +# k8s.io/csi-translation-lib v0.0.0 => github.com/openshift/kubernetes/staging/src/k8s.io/csi-translation-lib v0.0.0-20210429023751-daa555af5040 k8s.io/csi-translation-lib k8s.io/csi-translation-lib/plugins # k8s.io/klog/v2 v2.8.0 ## explicit k8s.io/klog/v2 -# k8s.io/kube-aggregator v0.20.0 => github.com/openshift/kubernetes/staging/src/k8s.io/kube-aggregator v0.0.0-20210208155256-e509061a6d18 +# k8s.io/kube-aggregator v0.21.0-rc.0 => github.com/openshift/kubernetes/staging/src/k8s.io/kube-aggregator v0.0.0-20210429023751-daa555af5040 k8s.io/kube-aggregator/pkg/apis/apiregistration k8s.io/kube-aggregator/pkg/apis/apiregistration/install k8s.io/kube-aggregator/pkg/apis/apiregistration/v1 @@ -2026,7 +2078,7 @@ k8s.io/kube-aggregator/pkg/controllers/status k8s.io/kube-aggregator/pkg/registry/apiservice k8s.io/kube-aggregator/pkg/registry/apiservice/etcd k8s.io/kube-aggregator/pkg/registry/apiservice/rest -# k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd +# k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7 ## explicit k8s.io/kube-openapi/pkg/aggregator k8s.io/kube-openapi/pkg/builder @@ -2042,14 +2094,15 @@ k8s.io/kube-openapi/pkg/validation/spec k8s.io/kube-openapi/pkg/validation/strfmt k8s.io/kube-openapi/pkg/validation/strfmt/bson k8s.io/kube-openapi/pkg/validation/validate -# k8s.io/kube-proxy v0.0.0 => github.com/openshift/kubernetes/staging/src/k8s.io/kube-proxy v0.0.0-20210208155256-e509061a6d18 +# k8s.io/kube-proxy v0.0.0 => github.com/openshift/kubernetes/staging/src/k8s.io/kube-proxy v0.0.0-20210429023751-daa555af5040 k8s.io/kube-proxy/config/v1alpha1 -# k8s.io/kube-scheduler v0.0.0 => github.com/openshift/kubernetes/staging/src/k8s.io/kube-scheduler v0.0.0-20210208155256-e509061a6d18 +# k8s.io/kube-scheduler v0.0.0 => github.com/openshift/kubernetes/staging/src/k8s.io/kube-scheduler v0.0.0-20210429023751-daa555af5040 k8s.io/kube-scheduler/extender/v1 -# k8s.io/kubectl v0.20.0 => github.com/openshift/kubernetes/staging/src/k8s.io/kubectl v0.0.0-20210208155256-e509061a6d18 +# k8s.io/kubectl v0.21.0-rc.0 => github.com/openshift/kubernetes/staging/src/k8s.io/kubectl v0.0.0-20210429023751-daa555af5040 ## explicit k8s.io/kubectl/pkg/apps k8s.io/kubectl/pkg/cmd/util +k8s.io/kubectl/pkg/cmd/util/podcmd k8s.io/kubectl/pkg/describe k8s.io/kubectl/pkg/polymorphichelpers k8s.io/kubectl/pkg/scale @@ -2070,10 +2123,11 @@ k8s.io/kubectl/pkg/util/storage k8s.io/kubectl/pkg/util/templates k8s.io/kubectl/pkg/util/term k8s.io/kubectl/pkg/validation -# k8s.io/kubelet v0.20.0 => github.com/openshift/kubernetes/staging/src/k8s.io/kubelet v0.0.0-20210208155256-e509061a6d18 +# k8s.io/kubelet v0.21.0-rc.0 => github.com/openshift/kubernetes/staging/src/k8s.io/kubelet v0.0.0-20210429023751-daa555af5040 ## explicit k8s.io/kubelet/config/v1alpha1 k8s.io/kubelet/config/v1beta1 +k8s.io/kubelet/pkg/apis k8s.io/kubelet/pkg/apis/credentialprovider k8s.io/kubelet/pkg/apis/credentialprovider/install k8s.io/kubelet/pkg/apis/credentialprovider/v1alpha1 @@ -2082,7 +2136,7 @@ k8s.io/kubelet/pkg/apis/pluginregistration/v1 k8s.io/kubelet/pkg/apis/podresources/v1 k8s.io/kubelet/pkg/apis/podresources/v1alpha1 k8s.io/kubelet/pkg/apis/stats/v1alpha1 -# k8s.io/kubernetes v1.20.0 => github.com/openshift/kubernetes v1.20.1-0.20210208155256-e509061a6d18 +# k8s.io/kubernetes v1.21.0-rc.0 => github.com/openshift/kubernetes v1.21.0-rc.0.0.20210426183659-cd6d8b086ad5 ## explicit k8s.io/kubernetes/cmd/kube-apiserver/app k8s.io/kubernetes/cmd/kube-apiserver/app/options @@ -2101,6 +2155,7 @@ k8s.io/kubernetes/openshift-kube-apiserver/admission/autoscaling/apis/runoncedur k8s.io/kubernetes/openshift-kube-apiserver/admission/autoscaling/apis/runonceduration/v1 k8s.io/kubernetes/openshift-kube-apiserver/admission/autoscaling/apis/runonceduration/validation k8s.io/kubernetes/openshift-kube-apiserver/admission/autoscaling/clusterresourceoverride +k8s.io/kubernetes/openshift-kube-apiserver/admission/autoscaling/managementcpusoverride k8s.io/kubernetes/openshift-kube-apiserver/admission/autoscaling/runonceduration k8s.io/kubernetes/openshift-kube-apiserver/admission/customresourcevalidation k8s.io/kubernetes/openshift-kube-apiserver/admission/customresourcevalidation/apiserver @@ -2141,6 +2196,9 @@ k8s.io/kubernetes/openshift-kube-apiserver/authorization/browsersafe k8s.io/kubernetes/openshift-kube-apiserver/authorization/scopeauthorizer k8s.io/kubernetes/openshift-kube-apiserver/configdefault k8s.io/kubernetes/openshift-kube-apiserver/enablement +k8s.io/kubernetes/openshift-kube-apiserver/filters +k8s.io/kubernetes/openshift-kube-apiserver/filters/deprecatedapirequest +k8s.io/kubernetes/openshift-kube-apiserver/filters/deprecatedapirequest/v1helpers k8s.io/kubernetes/openshift-kube-apiserver/openshiftkubeapiserver k8s.io/kubernetes/pkg/api/legacyscheme k8s.io/kubernetes/pkg/api/persistentvolume @@ -2196,7 +2254,6 @@ k8s.io/kubernetes/pkg/apis/batch k8s.io/kubernetes/pkg/apis/batch/install k8s.io/kubernetes/pkg/apis/batch/v1 k8s.io/kubernetes/pkg/apis/batch/v1beta1 -k8s.io/kubernetes/pkg/apis/batch/v2alpha1 k8s.io/kubernetes/pkg/apis/batch/validation k8s.io/kubernetes/pkg/apis/certificates k8s.io/kubernetes/pkg/apis/certificates/install @@ -2220,7 +2277,7 @@ k8s.io/kubernetes/pkg/apis/core/v1/validation k8s.io/kubernetes/pkg/apis/core/validation k8s.io/kubernetes/pkg/apis/discovery k8s.io/kubernetes/pkg/apis/discovery/install -k8s.io/kubernetes/pkg/apis/discovery/v1alpha1 +k8s.io/kubernetes/pkg/apis/discovery/v1 k8s.io/kubernetes/pkg/apis/discovery/v1beta1 k8s.io/kubernetes/pkg/apis/discovery/validation k8s.io/kubernetes/pkg/apis/events @@ -2253,6 +2310,7 @@ k8s.io/kubernetes/pkg/apis/node/v1beta1 k8s.io/kubernetes/pkg/apis/node/validation k8s.io/kubernetes/pkg/apis/policy k8s.io/kubernetes/pkg/apis/policy/install +k8s.io/kubernetes/pkg/apis/policy/v1 k8s.io/kubernetes/pkg/apis/policy/v1beta1 k8s.io/kubernetes/pkg/apis/policy/validation k8s.io/kubernetes/pkg/apis/rbac @@ -2319,7 +2377,6 @@ k8s.io/kubernetes/pkg/kubeapiserver/authorizer k8s.io/kubernetes/pkg/kubeapiserver/authorizer/modes k8s.io/kubernetes/pkg/kubeapiserver/options k8s.io/kubernetes/pkg/kubelet -k8s.io/kubernetes/pkg/kubelet/apis k8s.io/kubernetes/pkg/kubelet/apis/config k8s.io/kubernetes/pkg/kubelet/apis/config/scheme k8s.io/kubernetes/pkg/kubelet/apis/config/v1alpha1 @@ -2342,6 +2399,8 @@ k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/topology k8s.io/kubernetes/pkg/kubelet/cm/cpuset k8s.io/kubernetes/pkg/kubelet/cm/devicemanager k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/checkpoint +k8s.io/kubernetes/pkg/kubelet/cm/memorymanager +k8s.io/kubernetes/pkg/kubelet/cm/memorymanager/state k8s.io/kubernetes/pkg/kubelet/cm/topologymanager k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/bitmask k8s.io/kubernetes/pkg/kubelet/cm/util @@ -2376,7 +2435,6 @@ k8s.io/kubernetes/pkg/kubelet/kubeletconfig/configfiles k8s.io/kubernetes/pkg/kubelet/kubeletconfig/status k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/codec k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/files -k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/log k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/panic k8s.io/kubernetes/pkg/kubelet/kuberuntime k8s.io/kubernetes/pkg/kubelet/kuberuntime/logs @@ -2384,6 +2442,7 @@ k8s.io/kubernetes/pkg/kubelet/leaky k8s.io/kubernetes/pkg/kubelet/legacy k8s.io/kubernetes/pkg/kubelet/lifecycle k8s.io/kubernetes/pkg/kubelet/logs +k8s.io/kubernetes/pkg/kubelet/managed k8s.io/kubernetes/pkg/kubelet/metrics k8s.io/kubernetes/pkg/kubelet/metrics/collectors k8s.io/kubernetes/pkg/kubelet/network/dns @@ -2604,6 +2663,7 @@ k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodeaffinity k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodename k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodeports k8s.io/kubernetes/pkg/scheduler/framework/plugins/noderesources +k8s.io/kubernetes/pkg/scheduler/internal/parallelize k8s.io/kubernetes/pkg/scheduler/util k8s.io/kubernetes/pkg/security/apparmor k8s.io/kubernetes/pkg/security/podsecuritypolicy @@ -2642,7 +2702,6 @@ k8s.io/kubernetes/pkg/util/parsers k8s.io/kubernetes/pkg/util/pod k8s.io/kubernetes/pkg/util/procfs k8s.io/kubernetes/pkg/util/removeall -k8s.io/kubernetes/pkg/util/resizefs k8s.io/kubernetes/pkg/util/rlimit k8s.io/kubernetes/pkg/util/selinux k8s.io/kubernetes/pkg/util/slice @@ -2700,7 +2759,6 @@ k8s.io/kubernetes/plugin/pkg/admission/certificates k8s.io/kubernetes/plugin/pkg/admission/certificates/approval k8s.io/kubernetes/plugin/pkg/admission/certificates/signing k8s.io/kubernetes/plugin/pkg/admission/certificates/subjectrestriction -k8s.io/kubernetes/plugin/pkg/admission/defaultingressclass k8s.io/kubernetes/plugin/pkg/admission/defaulttolerationseconds k8s.io/kubernetes/plugin/pkg/admission/deny k8s.io/kubernetes/plugin/pkg/admission/eventratelimit @@ -2708,13 +2766,14 @@ k8s.io/kubernetes/plugin/pkg/admission/eventratelimit/apis/eventratelimit k8s.io/kubernetes/plugin/pkg/admission/eventratelimit/apis/eventratelimit/install k8s.io/kubernetes/plugin/pkg/admission/eventratelimit/apis/eventratelimit/v1alpha1 k8s.io/kubernetes/plugin/pkg/admission/eventratelimit/apis/eventratelimit/validation -k8s.io/kubernetes/plugin/pkg/admission/exec k8s.io/kubernetes/plugin/pkg/admission/extendedresourcetoleration k8s.io/kubernetes/plugin/pkg/admission/gc k8s.io/kubernetes/plugin/pkg/admission/imagepolicy k8s.io/kubernetes/plugin/pkg/admission/limitranger k8s.io/kubernetes/plugin/pkg/admission/namespace/autoprovision k8s.io/kubernetes/plugin/pkg/admission/namespace/exists +k8s.io/kubernetes/plugin/pkg/admission/network/defaultingressclass +k8s.io/kubernetes/plugin/pkg/admission/network/denyserviceexternalips k8s.io/kubernetes/plugin/pkg/admission/noderestriction k8s.io/kubernetes/plugin/pkg/admission/nodetaint k8s.io/kubernetes/plugin/pkg/admission/podnodeselector @@ -2743,6 +2802,9 @@ k8s.io/kubernetes/test/e2e/auth k8s.io/kubernetes/test/e2e/autoscaling k8s.io/kubernetes/test/e2e/chaosmonkey k8s.io/kubernetes/test/e2e/common +k8s.io/kubernetes/test/e2e/common/network +k8s.io/kubernetes/test/e2e/common/node +k8s.io/kubernetes/test/e2e/common/storage k8s.io/kubernetes/test/e2e/framework k8s.io/kubernetes/test/e2e/framework/auth k8s.io/kubernetes/test/e2e/framework/autoscaling @@ -2793,6 +2855,8 @@ k8s.io/kubernetes/test/e2e/instrumentation/monitoring k8s.io/kubernetes/test/e2e/kubectl k8s.io/kubernetes/test/e2e/lifecycle k8s.io/kubernetes/test/e2e/network +k8s.io/kubernetes/test/e2e/network/common +k8s.io/kubernetes/test/e2e/network/netpol k8s.io/kubernetes/test/e2e/network/scale k8s.io/kubernetes/test/e2e/node k8s.io/kubernetes/test/e2e/perftype @@ -2800,14 +2864,20 @@ k8s.io/kubernetes/test/e2e/reporters k8s.io/kubernetes/test/e2e/scheduling k8s.io/kubernetes/test/e2e/storage k8s.io/kubernetes/test/e2e/storage/drivers +k8s.io/kubernetes/test/e2e/storage/drivers/csi-test/driver +k8s.io/kubernetes/test/e2e/storage/drivers/csi-test/mock/cache +k8s.io/kubernetes/test/e2e/storage/drivers/csi-test/mock/service +k8s.io/kubernetes/test/e2e/storage/drivers/proxy k8s.io/kubernetes/test/e2e/storage/external +k8s.io/kubernetes/test/e2e/storage/framework k8s.io/kubernetes/test/e2e/storage/podlogs -k8s.io/kubernetes/test/e2e/storage/testpatterns k8s.io/kubernetes/test/e2e/storage/testsuites k8s.io/kubernetes/test/e2e/storage/utils k8s.io/kubernetes/test/e2e/storage/vsphere k8s.io/kubernetes/test/e2e/upgrades k8s.io/kubernetes/test/e2e/upgrades/apps +k8s.io/kubernetes/test/e2e/upgrades/network +k8s.io/kubernetes/test/e2e/upgrades/node k8s.io/kubernetes/test/integration k8s.io/kubernetes/test/integration/etcd k8s.io/kubernetes/test/integration/framework @@ -2816,11 +2886,12 @@ k8s.io/kubernetes/test/utils/crd k8s.io/kubernetes/test/utils/image k8s.io/kubernetes/test/utils/junit k8s.io/kubernetes/third_party/forked/golang/expansion +k8s.io/kubernetes/third_party/forked/golang/net k8s.io/kubernetes/third_party/forked/gonum/graph k8s.io/kubernetes/third_party/forked/gonum/graph/internal/linear k8s.io/kubernetes/third_party/forked/gonum/graph/simple k8s.io/kubernetes/third_party/forked/gonum/graph/traverse -# k8s.io/legacy-cloud-providers v0.20.0 => github.com/openshift/kubernetes/staging/src/k8s.io/legacy-cloud-providers v0.0.0-20210208155256-e509061a6d18 +# k8s.io/legacy-cloud-providers v0.21.0-rc.0 => github.com/openshift/kubernetes/staging/src/k8s.io/legacy-cloud-providers v0.0.0-20210429023751-daa555af5040 ## explicit k8s.io/legacy-cloud-providers/aws k8s.io/legacy-cloud-providers/azure @@ -2859,11 +2930,12 @@ k8s.io/legacy-cloud-providers/azure/clients/vmssvmclient/mockvmssvmclient k8s.io/legacy-cloud-providers/azure/metrics k8s.io/legacy-cloud-providers/azure/retry k8s.io/legacy-cloud-providers/gce +k8s.io/legacy-cloud-providers/gce/gcpcredential k8s.io/legacy-cloud-providers/openstack k8s.io/legacy-cloud-providers/vsphere k8s.io/legacy-cloud-providers/vsphere/vclib k8s.io/legacy-cloud-providers/vsphere/vclib/diskmanagers -# k8s.io/metrics v0.0.0 => github.com/openshift/kubernetes/staging/src/k8s.io/metrics v0.0.0-20210208155256-e509061a6d18 +# k8s.io/metrics v0.0.0 => github.com/openshift/kubernetes/staging/src/k8s.io/metrics v0.0.0-20210429023751-daa555af5040 k8s.io/metrics/pkg/apis/custom_metrics k8s.io/metrics/pkg/apis/custom_metrics/v1beta1 k8s.io/metrics/pkg/apis/custom_metrics/v1beta2 @@ -2872,9 +2944,9 @@ k8s.io/metrics/pkg/apis/external_metrics/v1beta1 k8s.io/metrics/pkg/client/custom_metrics k8s.io/metrics/pkg/client/custom_metrics/scheme k8s.io/metrics/pkg/client/external_metrics -# k8s.io/mount-utils v0.0.0 => github.com/openshift/kubernetes/staging/src/k8s.io/mount-utils v0.0.0-20210208155256-e509061a6d18 +# k8s.io/mount-utils v0.0.0 => github.com/openshift/kubernetes/staging/src/k8s.io/mount-utils v0.0.0-20210429023751-daa555af5040 k8s.io/mount-utils -# k8s.io/sample-apiserver v0.0.0 => github.com/openshift/kubernetes/staging/src/k8s.io/sample-apiserver v0.0.0-20210208155256-e509061a6d18 +# k8s.io/sample-apiserver v0.0.0 => github.com/openshift/kubernetes/staging/src/k8s.io/sample-apiserver v0.0.0-20210429023751-daa555af5040 k8s.io/sample-apiserver/pkg/apis/wardle k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1 # k8s.io/utils v0.0.0-20201110183641-67b214c5f920 @@ -2894,33 +2966,87 @@ k8s.io/utils/path k8s.io/utils/pointer k8s.io/utils/strings k8s.io/utils/trace -# sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14 +# sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15 sigs.k8s.io/apiserver-network-proxy/konnectivity-client/pkg/client sigs.k8s.io/apiserver-network-proxy/konnectivity-client/proto/client -# sigs.k8s.io/kustomize v2.0.3+incompatible -sigs.k8s.io/kustomize/pkg/commands/build -sigs.k8s.io/kustomize/pkg/constants -sigs.k8s.io/kustomize/pkg/expansion -sigs.k8s.io/kustomize/pkg/factory -sigs.k8s.io/kustomize/pkg/fs -sigs.k8s.io/kustomize/pkg/git -sigs.k8s.io/kustomize/pkg/gvk -sigs.k8s.io/kustomize/pkg/ifc -sigs.k8s.io/kustomize/pkg/ifc/transformer -sigs.k8s.io/kustomize/pkg/image -sigs.k8s.io/kustomize/pkg/internal/error -sigs.k8s.io/kustomize/pkg/loader -sigs.k8s.io/kustomize/pkg/patch -sigs.k8s.io/kustomize/pkg/patch/transformer -sigs.k8s.io/kustomize/pkg/resid -sigs.k8s.io/kustomize/pkg/resmap -sigs.k8s.io/kustomize/pkg/resource -sigs.k8s.io/kustomize/pkg/target -sigs.k8s.io/kustomize/pkg/transformers -sigs.k8s.io/kustomize/pkg/transformers/config -sigs.k8s.io/kustomize/pkg/transformers/config/defaultconfig -sigs.k8s.io/kustomize/pkg/types -# sigs.k8s.io/structured-merge-diff/v4 v4.0.2 +# sigs.k8s.io/kustomize/api v0.8.5 +sigs.k8s.io/kustomize/api/builtins +sigs.k8s.io/kustomize/api/filesys +sigs.k8s.io/kustomize/api/filters/annotations +sigs.k8s.io/kustomize/api/filters/fieldspec +sigs.k8s.io/kustomize/api/filters/filtersutil +sigs.k8s.io/kustomize/api/filters/fsslice +sigs.k8s.io/kustomize/api/filters/imagetag +sigs.k8s.io/kustomize/api/filters/labels +sigs.k8s.io/kustomize/api/filters/nameref +sigs.k8s.io/kustomize/api/filters/namespace +sigs.k8s.io/kustomize/api/filters/patchjson6902 +sigs.k8s.io/kustomize/api/filters/patchstrategicmerge +sigs.k8s.io/kustomize/api/filters/prefixsuffix +sigs.k8s.io/kustomize/api/filters/refvar +sigs.k8s.io/kustomize/api/filters/replicacount +sigs.k8s.io/kustomize/api/filters/valueadd +sigs.k8s.io/kustomize/api/hasher +sigs.k8s.io/kustomize/api/ifc +sigs.k8s.io/kustomize/api/image +sigs.k8s.io/kustomize/api/internal/accumulator +sigs.k8s.io/kustomize/api/internal/conflict +sigs.k8s.io/kustomize/api/internal/generators +sigs.k8s.io/kustomize/api/internal/git +sigs.k8s.io/kustomize/api/internal/kusterr +sigs.k8s.io/kustomize/api/internal/plugins/builtinconfig +sigs.k8s.io/kustomize/api/internal/plugins/builtinhelpers +sigs.k8s.io/kustomize/api/internal/plugins/execplugin +sigs.k8s.io/kustomize/api/internal/plugins/fnplugin +sigs.k8s.io/kustomize/api/internal/plugins/loader +sigs.k8s.io/kustomize/api/internal/plugins/utils +sigs.k8s.io/kustomize/api/internal/target +sigs.k8s.io/kustomize/api/internal/utils +sigs.k8s.io/kustomize/api/internal/validate +sigs.k8s.io/kustomize/api/internal/wrappy +sigs.k8s.io/kustomize/api/konfig +sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts +sigs.k8s.io/kustomize/api/krusty +sigs.k8s.io/kustomize/api/kv +sigs.k8s.io/kustomize/api/loader +sigs.k8s.io/kustomize/api/provenance +sigs.k8s.io/kustomize/api/provider +sigs.k8s.io/kustomize/api/resid +sigs.k8s.io/kustomize/api/resmap +sigs.k8s.io/kustomize/api/resource +sigs.k8s.io/kustomize/api/types +# sigs.k8s.io/kustomize/kyaml v0.10.15 +sigs.k8s.io/kustomize/kyaml/comments +sigs.k8s.io/kustomize/kyaml/errors +sigs.k8s.io/kustomize/kyaml/ext +sigs.k8s.io/kustomize/kyaml/fieldmeta +sigs.k8s.io/kustomize/kyaml/filtersutil +sigs.k8s.io/kustomize/kyaml/fn/runtime/container +sigs.k8s.io/kustomize/kyaml/fn/runtime/exec +sigs.k8s.io/kustomize/kyaml/fn/runtime/runtimeutil +sigs.k8s.io/kustomize/kyaml/fn/runtime/starlark +sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/qri-io/starlib/util +sigs.k8s.io/kustomize/kyaml/kio +sigs.k8s.io/kustomize/kyaml/kio/filters +sigs.k8s.io/kustomize/kyaml/kio/kioutil +sigs.k8s.io/kustomize/kyaml/openapi +sigs.k8s.io/kustomize/kyaml/openapi/kubernetesapi +sigs.k8s.io/kustomize/kyaml/openapi/kubernetesapi/v1204 +sigs.k8s.io/kustomize/kyaml/openapi/kustomizationapi +sigs.k8s.io/kustomize/kyaml/runfn +sigs.k8s.io/kustomize/kyaml/sets +sigs.k8s.io/kustomize/kyaml/yaml +sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/labels +sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/selection +sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/util/errors +sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/util/sets +sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/util/validation +sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/util/validation/field +sigs.k8s.io/kustomize/kyaml/yaml/merge2 +sigs.k8s.io/kustomize/kyaml/yaml/merge3 +sigs.k8s.io/kustomize/kyaml/yaml/schema +sigs.k8s.io/kustomize/kyaml/yaml/walk +# sigs.k8s.io/structured-merge-diff/v4 v4.1.0 sigs.k8s.io/structured-merge-diff/v4/fieldpath sigs.k8s.io/structured-merge-diff/v4/merge sigs.k8s.io/structured-merge-diff/v4/schema @@ -2930,36 +3056,30 @@ sigs.k8s.io/structured-merge-diff/v4/value ## explicit sigs.k8s.io/yaml # github.com/onsi/ginkgo => github.com/openshift/onsi-ginkgo v4.7.0-origin.0+incompatible -# github.com/openshift/apiserver-library-go => github.com/openshift/apiserver-library-go v0.0.0-20201214145556-6f1013f42f98 -# github.com/openshift/library-go => github.com/openshift/library-go v0.0.0-20201214135256-d265f469e75b -# k8s.io/api => github.com/openshift/kubernetes/staging/src/k8s.io/api v0.0.0-20210208155256-e509061a6d18 -# k8s.io/apiextensions-apiserver => github.com/openshift/kubernetes/staging/src/k8s.io/apiextensions-apiserver v0.0.0-20210208155256-e509061a6d18 -# k8s.io/apimachinery => github.com/openshift/kubernetes/staging/src/k8s.io/apimachinery v0.0.0-20210208155256-e509061a6d18 -# k8s.io/apiserver => github.com/openshift/kubernetes/staging/src/k8s.io/apiserver v0.0.0-20210208155256-e509061a6d18 -# k8s.io/cli-runtime => github.com/openshift/kubernetes/staging/src/k8s.io/cli-runtime v0.0.0-20210208155256-e509061a6d18 -# k8s.io/client-go => github.com/openshift/kubernetes/staging/src/k8s.io/client-go v0.0.0-20210208155256-e509061a6d18 -# k8s.io/cloud-provider => github.com/openshift/kubernetes/staging/src/k8s.io/cloud-provider v0.0.0-20210208155256-e509061a6d18 -# k8s.io/cluster-bootstrap => github.com/openshift/kubernetes/staging/src/k8s.io/cluster-bootstrap v0.0.0-20210208155256-e509061a6d18 -# k8s.io/code-generator => github.com/openshift/kubernetes/staging/src/k8s.io/code-generator v0.0.0-20210208155256-e509061a6d18 -# k8s.io/component-base => github.com/openshift/kubernetes/staging/src/k8s.io/component-base v0.0.0-20210208155256-e509061a6d18 -# k8s.io/component-helpers => github.com/openshift/kubernetes/staging/src/k8s.io/component-helpers v0.0.0-20210208155256-e509061a6d18 -# k8s.io/controller-manager => github.com/openshift/kubernetes/staging/src/k8s.io/controller-manager v0.0.0-20210208155256-e509061a6d18 -# k8s.io/cri-api => github.com/openshift/kubernetes/staging/src/k8s.io/cri-api v0.0.0-20210208155256-e509061a6d18 -# k8s.io/csi-translation-lib => github.com/openshift/kubernetes/staging/src/k8s.io/csi-translation-lib v0.0.0-20210208155256-e509061a6d18 -# k8s.io/gengo => k8s.io/gengo v0.0.0-20200114144118-36b2048a9120 -# k8s.io/heapster => k8s.io/heapster v1.2.0-beta.1 -# k8s.io/klog => k8s.io/klog v1.0.0 -# k8s.io/kube-aggregator => github.com/openshift/kubernetes/staging/src/k8s.io/kube-aggregator v0.0.0-20210208155256-e509061a6d18 -# k8s.io/kube-controller-manager => github.com/openshift/kubernetes/staging/src/k8s.io/kube-controller-manager v0.0.0-20210208155256-e509061a6d18 -# k8s.io/kube-proxy => github.com/openshift/kubernetes/staging/src/k8s.io/kube-proxy v0.0.0-20210208155256-e509061a6d18 -# k8s.io/kube-scheduler => github.com/openshift/kubernetes/staging/src/k8s.io/kube-scheduler v0.0.0-20210208155256-e509061a6d18 -# k8s.io/kubectl => github.com/openshift/kubernetes/staging/src/k8s.io/kubectl v0.0.0-20210208155256-e509061a6d18 -# k8s.io/kubelet => github.com/openshift/kubernetes/staging/src/k8s.io/kubelet v0.0.0-20210208155256-e509061a6d18 -# k8s.io/kubernetes => github.com/openshift/kubernetes v1.20.1-0.20210208155256-e509061a6d18 -# k8s.io/legacy-cloud-providers => github.com/openshift/kubernetes/staging/src/k8s.io/legacy-cloud-providers v0.0.0-20210208155256-e509061a6d18 -# k8s.io/metrics => github.com/openshift/kubernetes/staging/src/k8s.io/metrics v0.0.0-20210208155256-e509061a6d18 -# k8s.io/mount-utils => github.com/openshift/kubernetes/staging/src/k8s.io/mount-utils v0.0.0-20210208155256-e509061a6d18 -# k8s.io/sample-apiserver => github.com/openshift/kubernetes/staging/src/k8s.io/sample-apiserver v0.0.0-20210208155256-e509061a6d18 -# k8s.io/sample-cli-plugin => github.com/openshift/kubernetes/staging/src/k8s.io/sample-cli-plugin v0.0.0-20210208155256-e509061a6d18 -# k8s.io/sample-controller => github.com/openshift/kubernetes/staging/src/k8s.io/sample-controller v0.0.0-20210208155256-e509061a6d18 -# k8s.io/system-validators => k8s.io/system-validators v1.0.4 +# k8s.io/api => github.com/openshift/kubernetes/staging/src/k8s.io/api v0.0.0-20210429023751-daa555af5040 +# k8s.io/apiextensions-apiserver => github.com/openshift/kubernetes/staging/src/k8s.io/apiextensions-apiserver v0.0.0-20210429023751-daa555af5040 +# k8s.io/apimachinery => github.com/openshift/kubernetes/staging/src/k8s.io/apimachinery v0.0.0-20210429023751-daa555af5040 +# k8s.io/apiserver => github.com/openshift/kubernetes/staging/src/k8s.io/apiserver v0.0.0-20210429023751-daa555af5040 +# k8s.io/cli-runtime => github.com/openshift/kubernetes/staging/src/k8s.io/cli-runtime v0.0.0-20210429023751-daa555af5040 +# k8s.io/client-go => github.com/openshift/kubernetes/staging/src/k8s.io/client-go v0.0.0-20210429023751-daa555af5040 +# k8s.io/cloud-provider => github.com/openshift/kubernetes/staging/src/k8s.io/cloud-provider v0.0.0-20210429023751-daa555af5040 +# k8s.io/cluster-bootstrap => github.com/openshift/kubernetes/staging/src/k8s.io/cluster-bootstrap v0.0.0-20210429023751-daa555af5040 +# k8s.io/code-generator => github.com/openshift/kubernetes/staging/src/k8s.io/code-generator v0.0.0-20210429023751-daa555af5040 +# k8s.io/component-base => github.com/openshift/kubernetes/staging/src/k8s.io/component-base v0.0.0-20210429023751-daa555af5040 +# k8s.io/component-helpers => github.com/openshift/kubernetes/staging/src/k8s.io/component-helpers v0.0.0-20210429023751-daa555af5040 +# k8s.io/controller-manager => github.com/openshift/kubernetes/staging/src/k8s.io/controller-manager v0.0.0-20210429023751-daa555af5040 +# k8s.io/cri-api => github.com/openshift/kubernetes/staging/src/k8s.io/cri-api v0.0.0-20210429023751-daa555af5040 +# k8s.io/csi-translation-lib => github.com/openshift/kubernetes/staging/src/k8s.io/csi-translation-lib v0.0.0-20210429023751-daa555af5040 +# k8s.io/kube-aggregator => github.com/openshift/kubernetes/staging/src/k8s.io/kube-aggregator v0.0.0-20210429023751-daa555af5040 +# k8s.io/kube-controller-manager => github.com/openshift/kubernetes/staging/src/k8s.io/kube-controller-manager v0.0.0-20210429023751-daa555af5040 +# k8s.io/kube-proxy => github.com/openshift/kubernetes/staging/src/k8s.io/kube-proxy v0.0.0-20210429023751-daa555af5040 +# k8s.io/kube-scheduler => github.com/openshift/kubernetes/staging/src/k8s.io/kube-scheduler v0.0.0-20210429023751-daa555af5040 +# k8s.io/kubectl => github.com/openshift/kubernetes/staging/src/k8s.io/kubectl v0.0.0-20210429023751-daa555af5040 +# k8s.io/kubelet => github.com/openshift/kubernetes/staging/src/k8s.io/kubelet v0.0.0-20210429023751-daa555af5040 +# k8s.io/kubernetes => github.com/openshift/kubernetes v1.21.0-rc.0.0.20210426183659-cd6d8b086ad5 +# k8s.io/legacy-cloud-providers => github.com/openshift/kubernetes/staging/src/k8s.io/legacy-cloud-providers v0.0.0-20210429023751-daa555af5040 +# k8s.io/metrics => github.com/openshift/kubernetes/staging/src/k8s.io/metrics v0.0.0-20210429023751-daa555af5040 +# k8s.io/mount-utils => github.com/openshift/kubernetes/staging/src/k8s.io/mount-utils v0.0.0-20210429023751-daa555af5040 +# k8s.io/sample-apiserver => github.com/openshift/kubernetes/staging/src/k8s.io/sample-apiserver v0.0.0-20210429023751-daa555af5040 +# k8s.io/sample-cli-plugin => github.com/openshift/kubernetes/staging/src/k8s.io/sample-cli-plugin v0.0.0-20210429023751-daa555af5040 +# k8s.io/sample-controller => github.com/openshift/kubernetes/staging/src/k8s.io/sample-controller v0.0.0-20210429023751-daa555af5040 diff --git a/vendor/sigs.k8s.io/apiserver-network-proxy/konnectivity-client/pkg/client/client.go b/vendor/sigs.k8s.io/apiserver-network-proxy/konnectivity-client/pkg/client/client.go index 3ccec331a1bd..1d9a4950024e 100644 --- a/vendor/sigs.k8s.io/apiserver-network-proxy/konnectivity-client/pkg/client/client.go +++ b/vendor/sigs.k8s.io/apiserver-network-proxy/konnectivity-client/pkg/client/client.go @@ -115,6 +115,12 @@ func (t *grpcTunnel) serve(c clientConn) { connid: resp.ConnectID, } } + + if resp.Error != "" { + // On dial error, avoid leaking serve goroutine. + return + } + case client.PacketType_DATA: resp := pkt.GetData() // TODO: flow control diff --git a/vendor/k8s.io/controller-manager/LICENSE b/vendor/sigs.k8s.io/kustomize/api/LICENSE similarity index 100% rename from vendor/k8s.io/controller-manager/LICENSE rename to vendor/sigs.k8s.io/kustomize/api/LICENSE diff --git a/vendor/sigs.k8s.io/kustomize/api/builtins/AnnotationsTransformer.go b/vendor/sigs.k8s.io/kustomize/api/builtins/AnnotationsTransformer.go new file mode 100644 index 000000000000..68d351e18166 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/builtins/AnnotationsTransformer.go @@ -0,0 +1,44 @@ +// Code generated by pluginator on AnnotationsTransformer; DO NOT EDIT. +// pluginator {unknown 1970-01-01T00:00:00Z } + +package builtins + +import ( + "sigs.k8s.io/kustomize/api/filters/annotations" + "sigs.k8s.io/kustomize/api/resmap" + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/yaml" +) + +// Add the given annotations to the given field specifications. +type AnnotationsTransformerPlugin struct { + Annotations map[string]string `json:"annotations,omitempty" yaml:"annotations,omitempty"` + FieldSpecs []types.FieldSpec `json:"fieldSpecs,omitempty" yaml:"fieldSpecs,omitempty"` +} + +func (p *AnnotationsTransformerPlugin) Config( + _ *resmap.PluginHelpers, c []byte) (err error) { + p.Annotations = nil + p.FieldSpecs = nil + return yaml.Unmarshal(c, p) +} + +func (p *AnnotationsTransformerPlugin) Transform(m resmap.ResMap) error { + if len(p.Annotations) == 0 { + return nil + } + for _, r := range m.Resources() { + err := r.ApplyFilter(annotations.Filter{ + Annotations: p.Annotations, + FsSlice: p.FieldSpecs, + }) + if err != nil { + return err + } + } + return nil +} + +func NewAnnotationsTransformerPlugin() resmap.TransformerPlugin { + return &AnnotationsTransformerPlugin{} +} diff --git a/vendor/sigs.k8s.io/kustomize/api/builtins/ConfigMapGenerator.go b/vendor/sigs.k8s.io/kustomize/api/builtins/ConfigMapGenerator.go new file mode 100644 index 000000000000..d853a1cfd487 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/builtins/ConfigMapGenerator.go @@ -0,0 +1,39 @@ +// Code generated by pluginator on ConfigMapGenerator; DO NOT EDIT. +// pluginator {unknown 1970-01-01T00:00:00Z } + +package builtins + +import ( + "sigs.k8s.io/kustomize/api/kv" + "sigs.k8s.io/kustomize/api/resmap" + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/yaml" +) + +type ConfigMapGeneratorPlugin struct { + h *resmap.PluginHelpers + types.ObjectMeta `json:"metadata,omitempty" yaml:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + types.ConfigMapArgs +} + +func (p *ConfigMapGeneratorPlugin) Config(h *resmap.PluginHelpers, config []byte) (err error) { + p.ConfigMapArgs = types.ConfigMapArgs{} + err = yaml.Unmarshal(config, p) + if p.ConfigMapArgs.Name == "" { + p.ConfigMapArgs.Name = p.Name + } + if p.ConfigMapArgs.Namespace == "" { + p.ConfigMapArgs.Namespace = p.Namespace + } + p.h = h + return +} + +func (p *ConfigMapGeneratorPlugin) Generate() (resmap.ResMap, error) { + return p.h.ResmapFactory().FromConfigMapArgs( + kv.NewLoader(p.h.Loader(), p.h.Validator()), p.ConfigMapArgs) +} + +func NewConfigMapGeneratorPlugin() resmap.GeneratorPlugin { + return &ConfigMapGeneratorPlugin{} +} diff --git a/vendor/sigs.k8s.io/kustomize/api/builtins/HashTransformer.go b/vendor/sigs.k8s.io/kustomize/api/builtins/HashTransformer.go new file mode 100644 index 000000000000..c7ce6f7e86b5 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/builtins/HashTransformer.go @@ -0,0 +1,40 @@ +// Code generated by pluginator on HashTransformer; DO NOT EDIT. +// pluginator {unknown 1970-01-01T00:00:00Z } + +package builtins + +import ( + "fmt" + + "sigs.k8s.io/kustomize/api/ifc" + "sigs.k8s.io/kustomize/api/resmap" +) + +type HashTransformerPlugin struct { + hasher ifc.KunstructuredHasher +} + +func (p *HashTransformerPlugin) Config( + h *resmap.PluginHelpers, _ []byte) (err error) { + p.hasher = h.ResmapFactory().RF().Hasher() + return nil +} + +// Transform appends hash to generated resources. +func (p *HashTransformerPlugin) Transform(m resmap.ResMap) error { + for _, res := range m.Resources() { + if res.NeedHashSuffix() { + h, err := p.hasher.Hash(res) + if err != nil { + return err + } + res.StorePreviousId() + res.SetName(fmt.Sprintf("%s-%s", res.GetName(), h)) + } + } + return nil +} + +func NewHashTransformerPlugin() resmap.TransformerPlugin { + return &HashTransformerPlugin{} +} diff --git a/vendor/sigs.k8s.io/kustomize/api/builtins/HelmChartInflationGenerator.go b/vendor/sigs.k8s.io/kustomize/api/builtins/HelmChartInflationGenerator.go new file mode 100644 index 000000000000..e03d5abadf51 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/builtins/HelmChartInflationGenerator.go @@ -0,0 +1,287 @@ +// Code generated by pluginator on HelmChartInflationGenerator; DO NOT EDIT. +// pluginator {unknown 1970-01-01T00:00:00Z } + +package builtins + +import ( + "bytes" + "fmt" + "io" + "io/ioutil" + "os" + "os/exec" + "path/filepath" + "regexp" + "strings" + + "github.com/imdario/mergo" + "github.com/pkg/errors" + "sigs.k8s.io/kustomize/api/filesys" + "sigs.k8s.io/kustomize/api/resmap" + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/yaml" +) + +// HelmChartInflationGeneratorPlugin is a plugin to generate resources +// from a remote or local helm chart. +type HelmChartInflationGeneratorPlugin struct { + h *resmap.PluginHelpers + types.ObjectMeta `json:"metadata,omitempty" yaml:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + runHelmCommand func([]string) ([]byte, error) + types.HelmChartArgs + tmpDir string +} + +var KustomizePlugin HelmChartInflationGeneratorPlugin + +// Config uses the input plugin configurations `config` to setup the generator +// options +func (p *HelmChartInflationGeneratorPlugin) Config(h *resmap.PluginHelpers, config []byte) error { + p.h = h + err := yaml.Unmarshal(config, p) + if err != nil { + return err + } + tmpDir, err := filesys.NewTmpConfirmedDir() + if err != nil { + return err + } + p.tmpDir = string(tmpDir) + if p.ChartName == "" { + return fmt.Errorf("chartName cannot be empty") + } + if p.ChartHome == "" { + p.ChartHome = filepath.Join(p.tmpDir, "chart") + } + if p.ChartRepoName == "" { + p.ChartRepoName = "stable" + } + if p.HelmBin == "" { + p.HelmBin = "helm" + } + if p.HelmHome == "" { + p.HelmHome = filepath.Join(p.tmpDir, ".helm") + } + if p.Values == "" { + p.Values = filepath.Join(p.ChartHome, p.ChartName, "values.yaml") + } + if p.ValuesMerge == "" { + p.ValuesMerge = "override" + } + // runHelmCommand will run `helm` command with args provided. Return stdout + // and error if there is any. + p.runHelmCommand = func(args []string) ([]byte, error) { + stdout := new(bytes.Buffer) + stderr := new(bytes.Buffer) + cmd := exec.Command(p.HelmBin, args...) + cmd.Stdout = stdout + cmd.Stderr = stderr + cmd.Env = append(cmd.Env, + fmt.Sprintf("HELM_CONFIG_HOME=%s", p.HelmHome), + fmt.Sprintf("HELM_CACHE_HOME=%s/.cache", p.HelmHome), + fmt.Sprintf("HELM_DATA_HOME=%s/.data", p.HelmHome), + ) + err := cmd.Run() + if err != nil { + return stdout.Bytes(), + errors.Wrap( + fmt.Errorf("failed to run command %s %s", p.HelmBin, strings.Join(args, " ")), + stderr.String(), + ) + } + return stdout.Bytes(), nil + } + return nil +} + +// EncodeValues for writing +func (p *HelmChartInflationGeneratorPlugin) EncodeValues(w io.Writer) error { + d, err := yaml.Marshal(p.ValuesLocal) + if err != nil { + return err + } + _, err = w.Write(d) + if err != nil { + return err + } + return nil +} + +// useValuesLocal process (merge) inflator config provided values with chart default values.yaml +func (p *HelmChartInflationGeneratorPlugin) useValuesLocal() error { + // not override, merge, none + if !(p.ValuesMerge == "none" || p.ValuesMerge == "no" || p.ValuesMerge == "false") { + var pValues []byte + var err error + + if filepath.IsAbs(p.Values) { + pValues, err = ioutil.ReadFile(p.Values) + } else { + pValues, err = p.h.Loader().Load(p.Values) + } + if err != nil { + return err + } + chValues := make(map[string]interface{}) + err = yaml.Unmarshal(pValues, &chValues) + if err != nil { + return err + } + if p.ValuesMerge == "override" { + err = mergo.Merge(&chValues, p.ValuesLocal, mergo.WithOverride) + if err != nil { + return err + } + } + if p.ValuesMerge == "merge" { + err = mergo.Merge(&chValues, p.ValuesLocal) + if err != nil { + return err + } + } + p.ValuesLocal = chValues + } + b, err := yaml.Marshal(p.ValuesLocal) + if err != nil { + return err + } + path, err := p.writeValuesBytes(b) + if err != nil { + return err + } + p.Values = path + return nil +} + +// copyValues will copy the relative values file into the temp directory +// to avoid messing up with CWD. +func (p *HelmChartInflationGeneratorPlugin) copyValues() error { + // only copy when the values path is not absolute + if filepath.IsAbs(p.Values) { + return nil + } + // we must use use loader to read values file + b, err := p.h.Loader().Load(p.Values) + if err != nil { + return err + } + path, err := p.writeValuesBytes(b) + if err != nil { + return err + } + p.Values = path + return nil +} + +func (p *HelmChartInflationGeneratorPlugin) writeValuesBytes(b []byte) (string, error) { + path := filepath.Join(p.ChartHome, p.ChartName, "kustomize-values.yaml") + err := ioutil.WriteFile(path, b, 0644) + if err != nil { + return "", err + } + return path, nil +} + +// Generate implements generator +func (p *HelmChartInflationGeneratorPlugin) Generate() (resmap.ResMap, error) { + // cleanup + defer os.RemoveAll(p.tmpDir) + // check helm version. we only support V3 + err := p.checkHelmVersion() + if err != nil { + return nil, err + } + // pull the chart + if !p.checkLocalChart() { + _, err := p.runHelmCommand(p.getPullCommandArgs()) + if err != nil { + return nil, err + } + } + + // inflator config valuesLocal + if len(p.ValuesLocal) > 0 { + err := p.useValuesLocal() + if err != nil { + return nil, err + } + } else { + err := p.copyValues() + if err != nil { + return nil, err + } + } + + // render the charts + stdout, err := p.runHelmCommand(p.getTemplateCommandArgs()) + if err != nil { + return nil, err + } + + return p.h.ResmapFactory().NewResMapFromBytes(stdout) +} + +func (p *HelmChartInflationGeneratorPlugin) getTemplateCommandArgs() []string { + args := []string{"template"} + if p.ReleaseName != "" { + args = append(args, p.ReleaseName) + } + args = append(args, filepath.Join(p.ChartHome, p.ChartName)) + if p.ReleaseNamespace != "" { + args = append(args, "--namespace", p.ReleaseNamespace) + } + if p.Values != "" { + args = append(args, "--values", p.Values) + } + args = append(args, p.ExtraArgs...) + return args +} + +func (p *HelmChartInflationGeneratorPlugin) getPullCommandArgs() []string { + args := []string{"pull", "--untar", "--untardir", p.ChartHome} + chartName := fmt.Sprintf("%s/%s", p.ChartRepoName, p.ChartName) + if p.ChartVersion != "" { + args = append(args, "--version", p.ChartVersion) + } + if p.ChartRepoURL != "" { + args = append(args, "--repo", p.ChartRepoURL) + chartName = p.ChartName + } + + args = append(args, chartName) + + return args +} + +// checkLocalChart will return true if the chart does exist in +// local chart home. +func (p *HelmChartInflationGeneratorPlugin) checkLocalChart() bool { + path := filepath.Join(p.ChartHome, p.ChartName) + s, err := os.Stat(path) + if err != nil { + return false + } + return s.IsDir() +} + +// checkHelmVersion will return an error if the helm version is not V3 +func (p *HelmChartInflationGeneratorPlugin) checkHelmVersion() error { + stdout, err := p.runHelmCommand([]string{"version", "-c", "--short"}) + if err != nil { + return err + } + r, err := regexp.Compile(`v\d+(\.\d+)+`) + if err != nil { + return err + } + v := string(r.Find(stdout))[1:] + majorVersion := strings.Split(v, ".")[0] + if majorVersion != "3" { + return fmt.Errorf("this plugin requires helm V3 but got v%s", v) + } + return nil +} + +func NewHelmChartInflationGeneratorPlugin() resmap.GeneratorPlugin { + return &HelmChartInflationGeneratorPlugin{} +} diff --git a/vendor/sigs.k8s.io/kustomize/api/builtins/ImageTagTransformer.go b/vendor/sigs.k8s.io/kustomize/api/builtins/ImageTagTransformer.go new file mode 100644 index 000000000000..a09ef163dfb5 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/builtins/ImageTagTransformer.go @@ -0,0 +1,50 @@ +// Code generated by pluginator on ImageTagTransformer; DO NOT EDIT. +// pluginator {unknown 1970-01-01T00:00:00Z } + +package builtins + +import ( + "sigs.k8s.io/kustomize/api/filters/imagetag" + "sigs.k8s.io/kustomize/api/resmap" + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/yaml" +) + +// Find matching image declarations and replace +// the name, tag and/or digest. +type ImageTagTransformerPlugin struct { + ImageTag types.Image `json:"imageTag,omitempty" yaml:"imageTag,omitempty"` + FieldSpecs []types.FieldSpec `json:"fieldSpecs,omitempty" yaml:"fieldSpecs,omitempty"` +} + +func (p *ImageTagTransformerPlugin) Config( + _ *resmap.PluginHelpers, c []byte) (err error) { + p.ImageTag = types.Image{} + p.FieldSpecs = nil + return yaml.Unmarshal(c, p) +} + +func (p *ImageTagTransformerPlugin) Transform(m resmap.ResMap) error { + for _, r := range m.Resources() { + // traverse all fields at first + err := r.ApplyFilter(imagetag.LegacyFilter{ + ImageTag: p.ImageTag, + }) + if err != nil { + return err + } + // then use user specified field specs + err = r.ApplyFilter(imagetag.Filter{ + ImageTag: p.ImageTag, + FsSlice: p.FieldSpecs, + }) + if err != nil { + return err + } + } + return nil +} + +func NewImageTagTransformerPlugin() resmap.TransformerPlugin { + return &ImageTagTransformerPlugin{} +} diff --git a/vendor/sigs.k8s.io/kustomize/api/builtins/LabelTransformer.go b/vendor/sigs.k8s.io/kustomize/api/builtins/LabelTransformer.go new file mode 100644 index 000000000000..647e57efd066 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/builtins/LabelTransformer.go @@ -0,0 +1,44 @@ +// Code generated by pluginator on LabelTransformer; DO NOT EDIT. +// pluginator {unknown 1970-01-01T00:00:00Z } + +package builtins + +import ( + "sigs.k8s.io/kustomize/api/filters/labels" + "sigs.k8s.io/kustomize/api/resmap" + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/yaml" +) + +// Add the given labels to the given field specifications. +type LabelTransformerPlugin struct { + Labels map[string]string `json:"labels,omitempty" yaml:"labels,omitempty"` + FieldSpecs []types.FieldSpec `json:"fieldSpecs,omitempty" yaml:"fieldSpecs,omitempty"` +} + +func (p *LabelTransformerPlugin) Config( + _ *resmap.PluginHelpers, c []byte) (err error) { + p.Labels = nil + p.FieldSpecs = nil + return yaml.Unmarshal(c, p) +} + +func (p *LabelTransformerPlugin) Transform(m resmap.ResMap) error { + if len(p.Labels) == 0 { + return nil + } + for _, r := range m.Resources() { + err := r.ApplyFilter(labels.Filter{ + Labels: p.Labels, + FsSlice: p.FieldSpecs, + }) + if err != nil { + return err + } + } + return nil +} + +func NewLabelTransformerPlugin() resmap.TransformerPlugin { + return &LabelTransformerPlugin{} +} diff --git a/vendor/sigs.k8s.io/kustomize/api/builtins/LegacyOrderTransformer.go b/vendor/sigs.k8s.io/kustomize/api/builtins/LegacyOrderTransformer.go new file mode 100644 index 000000000000..322cea93aab7 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/builtins/LegacyOrderTransformer.go @@ -0,0 +1,46 @@ +// Code generated by pluginator on LegacyOrderTransformer; DO NOT EDIT. +// pluginator {unknown 1970-01-01T00:00:00Z } + +package builtins + +import ( + "sort" + + "github.com/pkg/errors" + "sigs.k8s.io/kustomize/api/resmap" + "sigs.k8s.io/kustomize/api/resource" +) + +// Sort the resources using an ordering defined in the Gvk class. +// This puts cluster-wide basic resources with no +// dependencies (like Namespace, StorageClass, etc.) +// first, and resources with a high number of dependencies +// (like ValidatingWebhookConfiguration) last. +type LegacyOrderTransformerPlugin struct{} + +// Nothing needed for configuration. +func (p *LegacyOrderTransformerPlugin) Config( + _ *resmap.PluginHelpers, _ []byte) (err error) { + return nil +} + +func (p *LegacyOrderTransformerPlugin) Transform(m resmap.ResMap) (err error) { + resources := make([]*resource.Resource, m.Size()) + ids := m.AllIds() + sort.Sort(resmap.IdSlice(ids)) + for i, id := range ids { + resources[i], err = m.GetByCurrentId(id) + if err != nil { + return errors.Wrap(err, "expected match for sorting") + } + } + m.Clear() + for _, r := range resources { + m.Append(r) + } + return nil +} + +func NewLegacyOrderTransformerPlugin() resmap.TransformerPlugin { + return &LegacyOrderTransformerPlugin{} +} diff --git a/vendor/sigs.k8s.io/kustomize/api/builtins/NamespaceTransformer.go b/vendor/sigs.k8s.io/kustomize/api/builtins/NamespaceTransformer.go new file mode 100644 index 000000000000..0ed2796a4e0d --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/builtins/NamespaceTransformer.go @@ -0,0 +1,60 @@ +// Code generated by pluginator on NamespaceTransformer; DO NOT EDIT. +// pluginator {unknown 1970-01-01T00:00:00Z } + +package builtins + +import ( + "fmt" + + "sigs.k8s.io/kustomize/api/filters/namespace" + "sigs.k8s.io/kustomize/api/resmap" + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/yaml" +) + +// Change or set the namespace of non-cluster level resources. +type NamespaceTransformerPlugin struct { + types.ObjectMeta `json:"metadata,omitempty" yaml:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + FieldSpecs []types.FieldSpec `json:"fieldSpecs,omitempty" yaml:"fieldSpecs,omitempty"` +} + +func (p *NamespaceTransformerPlugin) Config( + _ *resmap.PluginHelpers, c []byte) (err error) { + p.Namespace = "" + p.FieldSpecs = nil + return yaml.Unmarshal(c, p) +} + +func (p *NamespaceTransformerPlugin) Transform(m resmap.ResMap) error { + if len(p.Namespace) == 0 { + return nil + } + for _, r := range m.Resources() { + empty, err := r.IsEmpty() + if err != nil { + return err + } + if empty { + // Don't mutate empty objects? + continue + } + r.StorePreviousId() + err = r.ApplyFilter(namespace.Filter{ + Namespace: p.Namespace, + FsSlice: p.FieldSpecs, + }) + if err != nil { + return err + } + matches := m.GetMatchingResourcesByCurrentId(r.CurId().Equals) + if len(matches) != 1 { + return fmt.Errorf( + "namespace transformation produces ID conflict: %+v", matches) + } + } + return nil +} + +func NewNamespaceTransformerPlugin() resmap.TransformerPlugin { + return &NamespaceTransformerPlugin{} +} diff --git a/vendor/sigs.k8s.io/kustomize/api/builtins/PatchJson6902Transformer.go b/vendor/sigs.k8s.io/kustomize/api/builtins/PatchJson6902Transformer.go new file mode 100644 index 000000000000..dfe4db43bdd7 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/builtins/PatchJson6902Transformer.go @@ -0,0 +1,93 @@ +// Code generated by pluginator on PatchJson6902Transformer; DO NOT EDIT. +// pluginator {unknown 1970-01-01T00:00:00Z } + +package builtins + +import ( + "fmt" + + jsonpatch "github.com/evanphx/json-patch" + "github.com/pkg/errors" + "sigs.k8s.io/kustomize/api/filters/patchjson6902" + "sigs.k8s.io/kustomize/api/ifc" + "sigs.k8s.io/kustomize/api/resmap" + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/yaml" +) + +type PatchJson6902TransformerPlugin struct { + ldr ifc.Loader + decodedPatch jsonpatch.Patch + Target *types.Selector `json:"target,omitempty" yaml:"target,omitempty"` + Path string `json:"path,omitempty" yaml:"path,omitempty"` + JsonOp string `json:"jsonOp,omitempty" yaml:"jsonOp,omitempty"` +} + +func (p *PatchJson6902TransformerPlugin) Config( + h *resmap.PluginHelpers, c []byte) (err error) { + p.ldr = h.Loader() + err = yaml.Unmarshal(c, p) + if err != nil { + return err + } + if p.Target.Name == "" { + return fmt.Errorf("must specify the target name") + } + if p.Path == "" && p.JsonOp == "" { + return fmt.Errorf("empty file path and empty jsonOp") + } + if p.Path != "" { + if p.JsonOp != "" { + return fmt.Errorf("must specify a file path or jsonOp, not both") + } + rawOp, err := p.ldr.Load(p.Path) + if err != nil { + return err + } + p.JsonOp = string(rawOp) + if p.JsonOp == "" { + return fmt.Errorf("patch file '%s' empty seems to be empty", p.Path) + } + } + if p.JsonOp[0] != '[' { + // if it doesn't seem to be JSON, imagine + // it is YAML, and convert to JSON. + op, err := yaml.YAMLToJSON([]byte(p.JsonOp)) + if err != nil { + return err + } + p.JsonOp = string(op) + } + p.decodedPatch, err = jsonpatch.DecodePatch([]byte(p.JsonOp)) + if err != nil { + return errors.Wrapf(err, "decoding %s", p.JsonOp) + } + if len(p.decodedPatch) == 0 { + return fmt.Errorf( + "patch appears to be empty; file=%s, JsonOp=%s", p.Path, p.JsonOp) + } + return err +} + +func (p *PatchJson6902TransformerPlugin) Transform(m resmap.ResMap) error { + if p.Target == nil { + return fmt.Errorf("must specify a target for patch %s", p.JsonOp) + } + resources, err := m.Select(*p.Target) + if err != nil { + return err + } + for _, res := range resources { + err = res.ApplyFilter(patchjson6902.Filter{ + Patch: p.JsonOp, + }) + if err != nil { + return err + } + } + return nil +} + +func NewPatchJson6902TransformerPlugin() resmap.TransformerPlugin { + return &PatchJson6902TransformerPlugin{} +} diff --git a/vendor/sigs.k8s.io/kustomize/api/builtins/PatchStrategicMergeTransformer.go b/vendor/sigs.k8s.io/kustomize/api/builtins/PatchStrategicMergeTransformer.go new file mode 100644 index 000000000000..77ebbc8aebaf --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/builtins/PatchStrategicMergeTransformer.go @@ -0,0 +1,86 @@ +// Code generated by pluginator on PatchStrategicMergeTransformer; DO NOT EDIT. +// pluginator {unknown 1970-01-01T00:00:00Z } + +package builtins + +import ( + "fmt" + + "sigs.k8s.io/kustomize/api/resmap" + "sigs.k8s.io/kustomize/api/resource" + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/yaml" +) + +type PatchStrategicMergeTransformerPlugin struct { + loadedPatches []*resource.Resource + Paths []types.PatchStrategicMerge `json:"paths,omitempty" yaml:"paths,omitempty"` + Patches string `json:"patches,omitempty" yaml:"patches,omitempty"` +} + +func (p *PatchStrategicMergeTransformerPlugin) Config( + h *resmap.PluginHelpers, c []byte) (err error) { + err = yaml.Unmarshal(c, p) + if err != nil { + return err + } + if len(p.Paths) == 0 && p.Patches == "" { + return fmt.Errorf("empty file path and empty patch content") + } + if len(p.Paths) != 0 { + for _, onePath := range p.Paths { + // The following oddly attempts to interpret a path string as an + // actual patch (instead of as a path to a file containing a patch). + // All tests pass if this code is commented out. This code should + // be deleted; the user should use the Patches field which + // exists for this purpose (inline patch declaration). + res, err := h.ResmapFactory().RF().SliceFromBytes([]byte(onePath)) + if err == nil { + p.loadedPatches = append(p.loadedPatches, res...) + continue + } + res, err = h.ResmapFactory().RF().SliceFromPatches( + h.Loader(), []types.PatchStrategicMerge{onePath}) + if err != nil { + return err + } + p.loadedPatches = append(p.loadedPatches, res...) + } + } + if p.Patches != "" { + res, err := h.ResmapFactory().RF().SliceFromBytes([]byte(p.Patches)) + if err != nil { + return err + } + p.loadedPatches = append(p.loadedPatches, res...) + } + + if len(p.loadedPatches) == 0 { + return fmt.Errorf( + "patch appears to be empty; files=%v, Patch=%s", p.Paths, p.Patches) + } + // Merge the patches, looking for conflicts. + _, err = h.ResmapFactory().ConflatePatches(p.loadedPatches) + if err != nil { + return err + } + return nil +} + +func (p *PatchStrategicMergeTransformerPlugin) Transform(m resmap.ResMap) error { + for _, patch := range p.loadedPatches { + target, err := m.GetById(patch.OrgId()) + if err != nil { + return err + } + if err = m.ApplySmPatch( + resource.MakeIdSet([]*resource.Resource{target}), patch); err != nil { + return err + } + } + return nil +} + +func NewPatchStrategicMergeTransformerPlugin() resmap.TransformerPlugin { + return &PatchStrategicMergeTransformerPlugin{} +} diff --git a/vendor/sigs.k8s.io/kustomize/api/builtins/PatchTransformer.go b/vendor/sigs.k8s.io/kustomize/api/builtins/PatchTransformer.go new file mode 100644 index 000000000000..0696f3e1a69a --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/builtins/PatchTransformer.go @@ -0,0 +1,139 @@ +// Code generated by pluginator on PatchTransformer; DO NOT EDIT. +// pluginator {unknown 1970-01-01T00:00:00Z } + +package builtins + +import ( + "fmt" + "strings" + + jsonpatch "github.com/evanphx/json-patch" + "sigs.k8s.io/kustomize/api/filters/patchjson6902" + "sigs.k8s.io/kustomize/api/resmap" + "sigs.k8s.io/kustomize/api/resource" + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/yaml" +) + +type PatchTransformerPlugin struct { + loadedPatch *resource.Resource + decodedPatch jsonpatch.Patch + Path string `json:"path,omitempty" yaml:"path,omitempty"` + Patch string `json:"patch,omitempty" yaml:"patch,omitempty"` + Target *types.Selector `json:"target,omitempty" yaml:"target,omitempty"` +} + +func (p *PatchTransformerPlugin) Config( + h *resmap.PluginHelpers, c []byte) error { + err := yaml.Unmarshal(c, p) + if err != nil { + return err + } + p.Patch = strings.TrimSpace(p.Patch) + if p.Patch == "" && p.Path == "" { + return fmt.Errorf( + "must specify one of patch and path in\n%s", string(c)) + } + if p.Patch != "" && p.Path != "" { + return fmt.Errorf( + "patch and path can't be set at the same time\n%s", string(c)) + } + if p.Path != "" { + loaded, loadErr := h.Loader().Load(p.Path) + if loadErr != nil { + return loadErr + } + p.Patch = string(loaded) + } + + patchSM, errSM := h.ResmapFactory().RF().FromBytes([]byte(p.Patch)) + patchJson, errJson := jsonPatchFromBytes([]byte(p.Patch)) + if (errSM == nil && errJson == nil) || + (patchSM != nil && patchJson != nil) { + return fmt.Errorf( + "illegally qualifies as both an SM and JSON patch: [%v]", + p.Patch) + } + if errSM != nil && errJson != nil { + return fmt.Errorf( + "unable to parse SM or JSON patch from [%v]", p.Patch) + } + if errSM == nil { + p.loadedPatch = patchSM + } else { + p.decodedPatch = patchJson + } + return nil +} + +func (p *PatchTransformerPlugin) Transform(m resmap.ResMap) error { + if p.loadedPatch == nil { + return p.transformJson6902(m, p.decodedPatch) + } else { + // The patch was a strategic merge patch + return p.transformStrategicMerge(m, p.loadedPatch) + } +} + +// transformStrategicMerge applies the provided strategic merge patch +// to all the resources in the ResMap that match either the Target or +// the identifier of the patch. +func (p *PatchTransformerPlugin) transformStrategicMerge(m resmap.ResMap, patch *resource.Resource) error { + if p.Target == nil { + target, err := m.GetById(patch.OrgId()) + if err != nil { + return err + } + return target.ApplySmPatch(patch) + } + selected, err := m.Select(*p.Target) + if err != nil { + return err + } + return m.ApplySmPatch(resource.MakeIdSet(selected), patch) +} + +// transformJson6902 applies the provided json6902 patch +// to all the resources in the ResMap that match the Target. +func (p *PatchTransformerPlugin) transformJson6902(m resmap.ResMap, patch jsonpatch.Patch) error { + if p.Target == nil { + return fmt.Errorf("must specify a target for patch %s", p.Patch) + } + resources, err := m.Select(*p.Target) + if err != nil { + return err + } + for _, res := range resources { + res.StorePreviousId() + err = res.ApplyFilter(patchjson6902.Filter{ + Patch: p.Patch, + }) + if err != nil { + return err + } + } + return nil +} + +// jsonPatchFromBytes loads a Json 6902 patch from +// a bytes input +func jsonPatchFromBytes( + in []byte) (jsonpatch.Patch, error) { + ops := string(in) + if ops == "" { + return nil, fmt.Errorf("empty json patch operations") + } + + if ops[0] != '[' { + jsonOps, err := yaml.YAMLToJSON(in) + if err != nil { + return nil, err + } + ops = string(jsonOps) + } + return jsonpatch.DecodePatch([]byte(ops)) +} + +func NewPatchTransformerPlugin() resmap.TransformerPlugin { + return &PatchTransformerPlugin{} +} diff --git a/vendor/sigs.k8s.io/kustomize/api/builtins/PrefixSuffixTransformer.go b/vendor/sigs.k8s.io/kustomize/api/builtins/PrefixSuffixTransformer.go new file mode 100644 index 000000000000..20265d592b2b --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/builtins/PrefixSuffixTransformer.go @@ -0,0 +1,104 @@ +// Code generated by pluginator on PrefixSuffixTransformer; DO NOT EDIT. +// pluginator {unknown 1970-01-01T00:00:00Z } + +package builtins + +import ( + "errors" + + "sigs.k8s.io/kustomize/api/filters/prefixsuffix" + "sigs.k8s.io/kustomize/api/resid" + "sigs.k8s.io/kustomize/api/resmap" + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/yaml" +) + +// Add the given prefix and suffix to the field. +type PrefixSuffixTransformerPlugin struct { + Prefix string `json:"prefix,omitempty" yaml:"prefix,omitempty"` + Suffix string `json:"suffix,omitempty" yaml:"suffix,omitempty"` + FieldSpecs types.FsSlice `json:"fieldSpecs,omitempty" yaml:"fieldSpecs,omitempty"` +} + +// A Gvk skip list for prefix/suffix modification. +// hard coded for now - eventually should be part of config. +var prefixSuffixFieldSpecsToSkip = types.FsSlice{ + {Gvk: resid.Gvk{Kind: "CustomResourceDefinition"}}, + {Gvk: resid.Gvk{Group: "apiregistration.k8s.io", Kind: "APIService"}}, + {Gvk: resid.Gvk{Kind: "Namespace"}}, +} + +func (p *PrefixSuffixTransformerPlugin) Config( + _ *resmap.PluginHelpers, c []byte) (err error) { + p.Prefix = "" + p.Suffix = "" + p.FieldSpecs = nil + err = yaml.Unmarshal(c, p) + if err != nil { + return + } + if p.FieldSpecs == nil { + return errors.New("fieldSpecs is not expected to be nil") + } + return +} + +func (p *PrefixSuffixTransformerPlugin) Transform(m resmap.ResMap) error { + // Even if both the Prefix and Suffix are empty we want + // to proceed with the transformation. This allows to add contextual + // information to the resources (AddNamePrefix and AddNameSuffix). + for _, r := range m.Resources() { + // TODO: move this test into the filter (i.e. make a better filter) + if p.shouldSkip(r.OrgId()) { + continue + } + id := r.OrgId() + // current default configuration contains + // only one entry: "metadata/name" with no GVK + for _, fs := range p.FieldSpecs { + // TODO: this is redundant to filter (but needed for now) + if !id.IsSelected(&fs.Gvk) { + continue + } + // TODO: move this test into the filter. + if smellsLikeANameChange(&fs) { + // "metadata/name" is the only field. + // this will add a prefix and a suffix + // to the resource even if those are + // empty + + r.AddNamePrefix(p.Prefix) + r.AddNameSuffix(p.Suffix) + if p.Prefix != "" || p.Suffix != "" { + r.StorePreviousId() + } + } + err := r.ApplyFilter(prefixsuffix.Filter{ + Prefix: p.Prefix, + Suffix: p.Suffix, + FieldSpec: fs, + }) + if err != nil { + return err + } + } + } + return nil +} + +func smellsLikeANameChange(fs *types.FieldSpec) bool { + return fs.Path == "metadata/name" +} + +func (p *PrefixSuffixTransformerPlugin) shouldSkip(id resid.ResId) bool { + for _, path := range prefixSuffixFieldSpecsToSkip { + if id.IsSelected(&path.Gvk) { + return true + } + } + return false +} + +func NewPrefixSuffixTransformerPlugin() resmap.TransformerPlugin { + return &PrefixSuffixTransformerPlugin{} +} diff --git a/vendor/sigs.k8s.io/kustomize/api/builtins/ReplicaCountTransformer.go b/vendor/sigs.k8s.io/kustomize/api/builtins/ReplicaCountTransformer.go new file mode 100644 index 000000000000..03fbf6f1e5f2 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/builtins/ReplicaCountTransformer.go @@ -0,0 +1,73 @@ +// Code generated by pluginator on ReplicaCountTransformer; DO NOT EDIT. +// pluginator {unknown 1970-01-01T00:00:00Z } + +package builtins + +import ( + "fmt" + + "sigs.k8s.io/kustomize/api/filters/replicacount" + "sigs.k8s.io/kustomize/api/resid" + "sigs.k8s.io/kustomize/api/resmap" + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/yaml" +) + +// Find matching replicas declarations and replace the count. +// Eases the kustomization configuration of replica changes. +type ReplicaCountTransformerPlugin struct { + Replica types.Replica `json:"replica,omitempty" yaml:"replica,omitempty"` + FieldSpecs []types.FieldSpec `json:"fieldSpecs,omitempty" yaml:"fieldSpecs,omitempty"` +} + +func (p *ReplicaCountTransformerPlugin) Config( + _ *resmap.PluginHelpers, c []byte) (err error) { + p.Replica = types.Replica{} + p.FieldSpecs = nil + return yaml.Unmarshal(c, p) +} + +func (p *ReplicaCountTransformerPlugin) Transform(m resmap.ResMap) error { + found := false + for _, fs := range p.FieldSpecs { + matcher := p.createMatcher(fs) + resList := m.GetMatchingResourcesByAnyId(matcher) + if len(resList) > 0 { + found = true + for _, r := range resList { + // There are redundant checks in the filter + // that we'll live with until resolution of + // https://github.com/kubernetes-sigs/kustomize/issues/2506 + err := r.ApplyFilter(replicacount.Filter{ + Replica: p.Replica, + FieldSpec: fs, + }) + if err != nil { + return err + } + } + } + } + + if !found { + gvks := make([]string, len(p.FieldSpecs)) + for i, replicaSpec := range p.FieldSpecs { + gvks[i] = replicaSpec.Gvk.String() + } + return fmt.Errorf("resource with name %s does not match a config with the following GVK %v", + p.Replica.Name, gvks) + } + + return nil +} + +// Match Replica.Name and FieldSpec +func (p *ReplicaCountTransformerPlugin) createMatcher(fs types.FieldSpec) resmap.IdMatcher { + return func(r resid.ResId) bool { + return r.Name == p.Replica.Name && r.Gvk.IsSelected(&fs.Gvk) + } +} + +func NewReplicaCountTransformerPlugin() resmap.TransformerPlugin { + return &ReplicaCountTransformerPlugin{} +} diff --git a/vendor/sigs.k8s.io/kustomize/api/builtins/SecretGenerator.go b/vendor/sigs.k8s.io/kustomize/api/builtins/SecretGenerator.go new file mode 100644 index 000000000000..5e8581eb9a0f --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/builtins/SecretGenerator.go @@ -0,0 +1,39 @@ +// Code generated by pluginator on SecretGenerator; DO NOT EDIT. +// pluginator {unknown 1970-01-01T00:00:00Z } + +package builtins + +import ( + "sigs.k8s.io/kustomize/api/kv" + "sigs.k8s.io/kustomize/api/resmap" + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/yaml" +) + +type SecretGeneratorPlugin struct { + h *resmap.PluginHelpers + types.ObjectMeta `json:"metadata,omitempty" yaml:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + types.SecretArgs +} + +func (p *SecretGeneratorPlugin) Config(h *resmap.PluginHelpers, config []byte) (err error) { + p.SecretArgs = types.SecretArgs{} + err = yaml.Unmarshal(config, p) + if p.SecretArgs.Name == "" { + p.SecretArgs.Name = p.Name + } + if p.SecretArgs.Namespace == "" { + p.SecretArgs.Namespace = p.Namespace + } + p.h = h + return +} + +func (p *SecretGeneratorPlugin) Generate() (resmap.ResMap, error) { + return p.h.ResmapFactory().FromSecretArgs( + kv.NewLoader(p.h.Loader(), p.h.Validator()), p.SecretArgs) +} + +func NewSecretGeneratorPlugin() resmap.GeneratorPlugin { + return &SecretGeneratorPlugin{} +} diff --git a/vendor/sigs.k8s.io/kustomize/api/builtins/ValueAddTransformer.go b/vendor/sigs.k8s.io/kustomize/api/builtins/ValueAddTransformer.go new file mode 100644 index 000000000000..c2c460ab9132 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/builtins/ValueAddTransformer.go @@ -0,0 +1,141 @@ +// Code generated by pluginator on ValueAddTransformer; DO NOT EDIT. +// pluginator {unknown 1970-01-01T00:00:00Z } + +package builtins + +import ( + "fmt" + "path/filepath" + "strings" + + "sigs.k8s.io/kustomize/api/filters/namespace" + "sigs.k8s.io/kustomize/api/filters/valueadd" + "sigs.k8s.io/kustomize/api/resmap" + "sigs.k8s.io/kustomize/api/resource" + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/yaml" +) + +// An 'Add' transformer inspired by the IETF RFC 6902 JSON spec Add operation. +type ValueAddTransformerPlugin struct { + // Value is the value to add. + // Defaults to base name of encompassing kustomization root. + Value string `json:"value,omitempty" yaml:"value,omitempty"` + + // Targets is a slice of targets that should have the value added. + Targets []Target `json:"targets,omitempty" yaml:"targets,omitempty"` + + // TargetFilePath is a file path. If specified, the file will be parsed into + // a slice of Target, and appended to anything that was specified in the + // Targets field. This is just a means to share common target specifications. + TargetFilePath string `json:"targetFilePath,omitempty" yaml:"targetFilePath,omitempty"` +} + +// Target describes where to put the value. +type Target struct { + // Selector selects the resources to modify. + Selector *types.Selector `json:"selector,omitempty" yaml:"selector,omitempty"` + + // NotSelector selects the resources to exclude + // from those included by overly broad selectors. + // TODO: implement this? + // NotSelector *types.Selector `json:"notSelector,omitempty" yaml:"notSelector,omitempty"` + + // FieldPath is a JSON-style path to the field intended to hold the value. + FieldPath string `json:"fieldPath,omitempty" yaml:"fieldPath,omitempty"` + + // FilePathPosition is passed to the filter directly. Look there for doc. + FilePathPosition int `json:"filePathPosition,omitempty" yaml:"filePathPosition,omitempty"` +} + +func (p *ValueAddTransformerPlugin) Config(h *resmap.PluginHelpers, c []byte) error { + err := yaml.Unmarshal(c, p) + if err != nil { + return err + } + p.Value = strings.TrimSpace(p.Value) + if p.Value == "" { + p.Value = filepath.Base(h.Loader().Root()) + } + if p.TargetFilePath != "" { + bytes, err := h.Loader().Load(p.TargetFilePath) + if err != nil { + return err + } + var targets struct { + Targets []Target `json:"targets,omitempty" yaml:"targets,omitempty"` + } + err = yaml.Unmarshal(bytes, &targets) + if err != nil { + return err + } + p.Targets = append(p.Targets, targets.Targets...) + } + if len(p.Targets) == 0 { + return fmt.Errorf("must specify at least one target") + } + for _, target := range p.Targets { + if err = validateSelector(target.Selector); err != nil { + return err + } + // TODO: call validateSelector(target.NotSelector) if field added. + if err = validateJsonFieldPath(target.FieldPath); err != nil { + return err + } + if target.FilePathPosition < 0 { + return fmt.Errorf( + "value of FilePathPosition (%d) cannot be negative", + target.FilePathPosition) + } + } + return nil +} + +// TODO: implement +func validateSelector(_ *types.Selector) error { + return nil +} + +// TODO: Enforce RFC 6902? +func validateJsonFieldPath(p string) error { + if len(p) == 0 { + return fmt.Errorf("fieldPath cannot be empty") + } + return nil +} + +func (p *ValueAddTransformerPlugin) Transform(m resmap.ResMap) (err error) { + for _, t := range p.Targets { + var resources []*resource.Resource + if t.Selector == nil { + resources = m.Resources() + } else { + resources, err = m.Select(*t.Selector) + if err != nil { + return err + } + } + // TODO: consider t.NotSelector if implemented + for _, res := range resources { + if t.FieldPath == types.MetadataNamespacePath { + err = res.ApplyFilter(namespace.Filter{ + Namespace: p.Value, + }) + } else { + err = res.ApplyFilter(valueadd.Filter{ + Value: p.Value, + FieldPath: t.FieldPath, + FilePathPosition: t.FilePathPosition, + }) + } + if err != nil { + return err + } + } + } + return nil +} + +func NewValueAddTransformerPlugin() resmap.TransformerPlugin { + return &ValueAddTransformerPlugin{} +} diff --git a/vendor/sigs.k8s.io/kustomize/api/builtins/doc.go b/vendor/sigs.k8s.io/kustomize/api/builtins/doc.go new file mode 100644 index 000000000000..37a8dc6e7df0 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/builtins/doc.go @@ -0,0 +1,8 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +// Package builtins holds code generated from the builtin plugins. +// The "builtin" plugins are written as normal plugins and can +// be used as such, but they are also used to generate the code +// in this package so they can be statically linked to client code. +package builtins diff --git a/vendor/sigs.k8s.io/kustomize/api/filesys/confirmeddir.go b/vendor/sigs.k8s.io/kustomize/api/filesys/confirmeddir.go new file mode 100644 index 000000000000..4b0008427211 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/filesys/confirmeddir.go @@ -0,0 +1,79 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package filesys + +import ( + "io/ioutil" + "path/filepath" + "strings" +) + +// ConfirmedDir is a clean, absolute, delinkified path +// that was confirmed to point to an existing directory. +type ConfirmedDir string + +// NewTmpConfirmedDir returns a temporary dir, else error. +// The directory is cleaned, no symlinks, etc. so it's +// returned as a ConfirmedDir. +func NewTmpConfirmedDir() (ConfirmedDir, error) { + n, err := ioutil.TempDir("", "kustomize-") + if err != nil { + return "", err + } + + // In MacOs `ioutil.TempDir` creates a directory + // with root in the `/var` folder, which is in turn + // a symlinked path to `/private/var`. + // Function `filepath.EvalSymlinks`is used to + // resolve the real absolute path. + deLinked, err := filepath.EvalSymlinks(n) + return ConfirmedDir(deLinked), err +} + +// HasPrefix returns true if the directory argument +// is a prefix of self (d) from the point of view of +// a file system. +// +// I.e., it's true if the argument equals or contains +// self (d) in a file path sense. +// +// HasPrefix emulates the semantics of strings.HasPrefix +// such that the following are true: +// +// strings.HasPrefix("foobar", "foobar") +// strings.HasPrefix("foobar", "foo") +// strings.HasPrefix("foobar", "") +// +// d := fSys.ConfirmDir("/foo/bar") +// d.HasPrefix("/foo/bar") +// d.HasPrefix("/foo") +// d.HasPrefix("/") +// +// Not contacting a file system here to check for +// actual path existence. +// +// This is tested on linux, but will have trouble +// on other operating systems. +// TODO(monopole) Refactor when #golang/go/18358 closes. +// See also: +// https://github.com/golang/go/issues/18358 +// https://github.com/golang/dep/issues/296 +// https://github.com/golang/dep/blob/master/internal/fs/fs.go#L33 +// https://codereview.appspot.com/5712045 +func (d ConfirmedDir) HasPrefix(path ConfirmedDir) bool { + if path.String() == string(filepath.Separator) || path == d { + return true + } + return strings.HasPrefix( + string(d), + string(path)+string(filepath.Separator)) +} + +func (d ConfirmedDir) Join(path string) string { + return filepath.Join(string(d), path) +} + +func (d ConfirmedDir) String() string { + return string(d) +} diff --git a/vendor/sigs.k8s.io/kustomize/api/filesys/file.go b/vendor/sigs.k8s.io/kustomize/api/filesys/file.go new file mode 100644 index 000000000000..5044c653e714 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/filesys/file.go @@ -0,0 +1,15 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package filesys + +import ( + "io" + "os" +) + +// File groups the basic os.File methods. +type File interface { + io.ReadWriteCloser + Stat() (os.FileInfo, error) +} diff --git a/vendor/sigs.k8s.io/kustomize/api/filesys/fileinfo.go b/vendor/sigs.k8s.io/kustomize/api/filesys/fileinfo.go new file mode 100644 index 000000000000..57646d24401c --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/filesys/fileinfo.go @@ -0,0 +1,34 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package filesys + +import ( + "os" + "time" +) + +var _ os.FileInfo = fileInfo{} + +// fileInfo implements os.FileInfo for a fileInMemory instance. +type fileInfo struct { + node *fsNode +} + +// Name returns the name of the file +func (fi fileInfo) Name() string { return fi.node.Name() } + +// Size returns the size of the file +func (fi fileInfo) Size() int64 { return fi.node.Size() } + +// Mode returns the file mode +func (fi fileInfo) Mode() os.FileMode { return 0777 } + +// ModTime returns a bogus time +func (fi fileInfo) ModTime() time.Time { return time.Time{} } + +// IsDir returns true if it is a directory +func (fi fileInfo) IsDir() bool { return fi.node.isNodeADir() } + +// Sys should return underlying data source, but it now returns nil +func (fi fileInfo) Sys() interface{} { return nil } diff --git a/vendor/sigs.k8s.io/kustomize/api/filesys/fileondisk.go b/vendor/sigs.k8s.io/kustomize/api/filesys/fileondisk.go new file mode 100644 index 000000000000..8ed92d90ee6c --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/filesys/fileondisk.go @@ -0,0 +1,27 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package filesys + +import ( + "os" +) + +var _ File = &fileOnDisk{} + +// fileOnDisk implements File using the local filesystem. +type fileOnDisk struct { + file *os.File +} + +// Close closes a file. +func (f *fileOnDisk) Close() error { return f.file.Close() } + +// Read reads a file's content. +func (f *fileOnDisk) Read(p []byte) (n int, err error) { return f.file.Read(p) } + +// Write writes bytes to a file +func (f *fileOnDisk) Write(p []byte) (n int, err error) { return f.file.Write(p) } + +// Stat returns an interface which has all the information regarding the file. +func (f *fileOnDisk) Stat() (os.FileInfo, error) { return f.file.Stat() } diff --git a/vendor/sigs.k8s.io/kustomize/api/filesys/filesystem.go b/vendor/sigs.k8s.io/kustomize/api/filesys/filesystem.go new file mode 100644 index 000000000000..041b4bdb398b --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/filesys/filesystem.go @@ -0,0 +1,50 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +// Package filesys provides a file system abstraction layer. +package filesys + +import ( + "path/filepath" +) + +const ( + Separator = string(filepath.Separator) + SelfDir = "." + ParentDir = ".." +) + +// FileSystem groups basic os filesystem methods. +// It's supposed be functional subset of https://golang.org/pkg/os +type FileSystem interface { + // Create a file. + Create(path string) (File, error) + // MkDir makes a directory. + Mkdir(path string) error + // MkDirAll makes a directory path, creating intervening directories. + MkdirAll(path string) error + // RemoveAll removes path and any children it contains. + RemoveAll(path string) error + // Open opens the named file for reading. + Open(path string) (File, error) + // IsDir returns true if the path is a directory. + IsDir(path string) bool + // CleanedAbs converts the given path into a + // directory and a file name, where the directory + // is represented as a ConfirmedDir and all that implies. + // If the entire path is a directory, the file component + // is an empty string. + CleanedAbs(path string) (ConfirmedDir, string, error) + // Exists is true if the path exists in the file system. + Exists(path string) bool + // Glob returns the list of matching files, + // emulating https://golang.org/pkg/path/filepath/#Glob + Glob(pattern string) ([]string, error) + // ReadFile returns the contents of the file at the given path. + ReadFile(path string) ([]byte, error) + // WriteFile writes the data to a file at the given path, + // overwriting anything that's already there. + WriteFile(path string, data []byte) error + // Walk walks the file system with the given WalkFunc. + Walk(path string, walkFn filepath.WalkFunc) error +} diff --git a/vendor/sigs.k8s.io/kustomize/api/filesys/fsnode.go b/vendor/sigs.k8s.io/kustomize/api/filesys/fsnode.go new file mode 100644 index 000000000000..e81c3df78816 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/filesys/fsnode.go @@ -0,0 +1,557 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package filesys + +import ( + "bytes" + "fmt" + "log" + "os" + "path/filepath" + "regexp" + "sort" + "strings" + + "github.com/pkg/errors" +) + +var _ File = &fsNode{} +var _ FileSystem = &fsNode{} + +// fsNode is either a file or a directory. +type fsNode struct { + // What node owns me? + parent *fsNode + + // Value to return as the Name() when the + // parent is nil. + nilParentName string + + // A directory mapping names to nodes. + // If dir is nil, then self node is a file. + // If dir is non-nil, then self node is a directory, + // albeit possibly an empty directory. + dir map[string]*fsNode + + // if this node is a file, this is the content. + content []byte + + // if this node is a file, this tracks whether or + // not it is "open". + open bool +} + +// MakeEmptyDirInMemory returns an empty directory. +// The paths of nodes in this object will never +// report a leading Separator, meaning they +// aren't "absolute" in the sense defined by +// https://golang.org/pkg/path/filepath/#IsAbs. +func MakeEmptyDirInMemory() *fsNode { + return &fsNode{ + dir: make(map[string]*fsNode), + } +} + +// MakeFsInMemory returns an empty 'file system'. +// The paths of nodes in this object will always +// report a leading Separator, meaning they +// are "absolute" in the sense defined by +// https://golang.org/pkg/path/filepath/#IsAbs. +// This is a relevant difference when using Walk, +// Glob, Match, etc. +func MakeFsInMemory() FileSystem { + return &fsNode{ + nilParentName: Separator, + dir: make(map[string]*fsNode), + } +} + +// Name returns the name of the node. +func (n *fsNode) Name() string { + if n.parent == nil { + // Unable to lookup name in parent. + return n.nilParentName + } + if !n.parent.isNodeADir() { + log.Fatal("parent not a dir") + } + for key, value := range n.parent.dir { + if value == n { + return key + } + } + log.Fatal("unable to find fsNode name") + return "" +} + +// Path returns the full path to the node. +func (n *fsNode) Path() string { + if n.parent == nil { + return n.nilParentName + } + if !n.parent.isNodeADir() { + log.Fatal("parent not a dir, structural error") + } + return filepath.Join(n.parent.Path(), n.Name()) +} + +// mySplit trims trailing separators from the directory +// result of filepath.Split. +func mySplit(s string) (string, string) { + dName, fName := filepath.Split(s) + return StripTrailingSeps(dName), fName +} + +func (n *fsNode) addFile(name string, c []byte) (result *fsNode, err error) { + parent := n + dName, fileName := mySplit(name) + if dName != "" { + parent, err = parent.addDir(dName) + if err != nil { + return nil, err + } + } + if !isLegalFileNameForCreation(fileName) { + return nil, fmt.Errorf( + "illegal name '%s' in file creation", fileName) + } + result, ok := parent.dir[fileName] + if ok { + // File already exists; overwrite it. + result.content = c + return result, nil + } + result = &fsNode{ + content: c, + parent: parent, + } + parent.dir[fileName] = result + return result, nil +} + +// Create implements FileSystem. +// Create makes an empty file. +func (n *fsNode) Create(path string) (result File, err error) { + return n.AddFile(path, []byte{}) +} + +// WriteFile implements FileSystem. +func (n *fsNode) WriteFile(path string, d []byte) error { + _, err := n.AddFile(path, d) + return err +} + +// AddFile adds a file and any necessary containing +// directories to the node. +func (n *fsNode) AddFile( + name string, c []byte) (result *fsNode, err error) { + if n.dir == nil { + return nil, fmt.Errorf( + "cannot add a file to a non-directory '%s'", n.Name()) + } + return n.addFile(cleanQueryPath(name), c) +} + +func (n *fsNode) addDir(path string) (result *fsNode, err error) { + parent := n + dName, subDirName := mySplit(path) + if dName != "" { + parent, err = n.addDir(dName) + if err != nil { + return nil, err + } + } + switch subDirName { + case "", SelfDir: + return n, nil + case ParentDir: + if n.parent == nil { + return nil, fmt.Errorf( + "cannot add a directory above '%s'", n.Path()) + } + return n.parent, nil + default: + if !isLegalFileNameForCreation(subDirName) { + return nil, fmt.Errorf( + "illegal name '%s' in directory creation", subDirName) + } + result, ok := parent.dir[subDirName] + if ok { + if result.isNodeADir() { + // it's already there. + return result, nil + } + return nil, fmt.Errorf( + "cannot make dir '%s'; a file of that name already exists in '%s'", + subDirName, parent.Name()) + } + result = &fsNode{ + dir: make(map[string]*fsNode), + parent: parent, + } + parent.dir[subDirName] = result + return result, nil + } +} + +// Mkdir implements FileSystem. +// Mkdir creates a directory. +func (n *fsNode) Mkdir(path string) error { + _, err := n.AddDir(path) + return err +} + +// MkdirAll implements FileSystem. +// MkdirAll creates a directory. +func (n *fsNode) MkdirAll(path string) error { + _, err := n.AddDir(path) + return err +} + +// AddDir adds a directory to the node, not complaining +// if it is already there. +func (n *fsNode) AddDir(path string) (result *fsNode, err error) { + if n.dir == nil { + return nil, fmt.Errorf( + "cannot add a directory to file node '%s'", n.Name()) + } + return n.addDir(cleanQueryPath(path)) +} + +// CleanedAbs implements FileSystem. +func (n *fsNode) CleanedAbs(path string) (ConfirmedDir, string, error) { + node, err := n.Find(path) + if err != nil { + return "", "", errors.Wrap(err, "unable to clean") + } + if node == nil { + return "", "", fmt.Errorf("'%s' doesn't exist", path) + } + if node.isNodeADir() { + return ConfirmedDir(node.Path()), "", nil + } + return ConfirmedDir(node.parent.Path()), node.Name(), nil +} + +// Exists implements FileSystem. +// Exists returns true if the path exists. +func (n *fsNode) Exists(path string) bool { + if !n.isNodeADir() { + return n.Name() == path + } + result, err := n.Find(path) + if err != nil { + return false + } + return result != nil +} + +func cleanQueryPath(path string) string { + // Always ignore leading separator? + // Remember that filepath.Clean returns "." if + // given an empty string argument. + return filepath.Clean(StripLeadingSeps(path)) +} + +// Find finds the given node, else nil if not found. +// Return error on structural/argument errors. +func (n *fsNode) Find(path string) (*fsNode, error) { + if !n.isNodeADir() { + return nil, fmt.Errorf("can only find inside a dir") + } + if path == "" { + // Special case; check *before* cleaning and *before* + // comparison to nilParentName. + return nil, nil + } + if (n.parent == nil && path == n.nilParentName) || path == SelfDir { + // Special case + return n, nil + } + return n.findIt(cleanQueryPath(path)) +} + +func (n *fsNode) findIt(path string) (result *fsNode, err error) { + parent := n + dName, item := mySplit(path) + if dName != "" { + parent, err = n.findIt(dName) + if err != nil { + return nil, err + } + if parent == nil { + // all done, target doesn't exist. + return nil, nil + } + } + if !parent.isNodeADir() { + return nil, fmt.Errorf("'%s' is not a directory", parent.Path()) + } + return parent.dir[item], nil +} + +// RemoveAll implements FileSystem. +// RemoveAll removes an item and everything it contains. +func (n *fsNode) RemoveAll(path string) error { + result, err := n.Find(path) + if err != nil { + return err + } + if result == nil { + return fmt.Errorf("cannot find '%s' to remove it", path) + } + return result.Remove() +} + +// Remove drop the node, and everything it contains, from its parent. +func (n *fsNode) Remove() error { + if n.parent == nil { + return fmt.Errorf("cannot remove a root node") + } + if !n.parent.isNodeADir() { + log.Fatal("parent not a dir") + } + for key, value := range n.parent.dir { + if value == n { + delete(n.parent.dir, key) + return nil + } + } + log.Fatal("unable to find self in parent") + return nil +} + +// isNodeADir returns true if the node is a directory. +// Cannot collide with the poorly named "IsDir". +func (n *fsNode) isNodeADir() bool { + return n.dir != nil +} + +// IsDir implements FileSystem. +// IsDir returns true if the argument resolves +// to a directory rooted at the node. +func (n *fsNode) IsDir(path string) bool { + result, err := n.Find(path) + if err != nil || result == nil { + return false + } + return result.isNodeADir() +} + +// Size returns the size of the node. +func (n *fsNode) Size() int64 { + if n.isNodeADir() { + return int64(len(n.dir)) + } + return int64(len(n.content)) +} + +// Open implements FileSystem. +// Open opens the node for reading (just marks it). +func (n *fsNode) Open(path string) (File, error) { + result, err := n.Find(path) + if err != nil { + return nil, err + } + if result == nil { + return nil, fmt.Errorf("cannot find '%s' to open it", path) + } + result.open = true + return result, nil +} + +// Close marks the node closed. +func (n *fsNode) Close() error { + n.open = false + return nil +} + +// ReadFile implements FileSystem. +func (n *fsNode) ReadFile(path string) (c []byte, err error) { + result, err := n.Find(path) + if err != nil { + return nil, err + } + if result == nil { + return nil, fmt.Errorf("cannot find '%s' to read it", path) + } + c = make([]byte, len(result.content)) + _, err = result.Read(c) + return c, err +} + +// Read returns the content of the file node. +func (n *fsNode) Read(d []byte) (c int, err error) { + if n.isNodeADir() { + return 0, fmt.Errorf( + "cannot read content from non-file '%s'", n.Path()) + } + return copy(d, n.content), nil +} + +// Write saves the contents of the argument to the file node. +func (n *fsNode) Write(p []byte) (c int, err error) { + if n.isNodeADir() { + return 0, fmt.Errorf( + "cannot write content to non-file '%s'", n.Path()) + } + n.content = make([]byte, len(p)) + return copy(n.content, p), nil +} + +// ContentMatches returns true if v matches fake file's content. +func (n *fsNode) ContentMatches(v []byte) bool { + return bytes.Equal(v, n.content) +} + +// GetContent the content of a fake file. +func (n *fsNode) GetContent() []byte { + return n.content +} + +// Stat returns an instance of FileInfo. +func (n *fsNode) Stat() (os.FileInfo, error) { + return fileInfo{node: n}, nil +} + +// Walk implements FileSystem. +func (n *fsNode) Walk(path string, walkFn filepath.WalkFunc) error { + result, err := n.Find(path) + if err != nil { + return err + } + if result == nil { + return fmt.Errorf("cannot find '%s' to walk it", path) + } + return result.WalkMe(walkFn) +} + +// Walk runs the given walkFn on each node. +func (n *fsNode) WalkMe(walkFn filepath.WalkFunc) error { + fi, err := n.Stat() + // always visit self first + err = walkFn(n.Path(), fi, err) + if !n.isNodeADir() { + // it's a file, so nothing more to do + return err + } + // process self as a directory + if err == filepath.SkipDir { + return nil + } + // Walk is supposed to visit in lexical order. + for _, k := range n.sortedDirEntries() { + if err := n.dir[k].WalkMe(walkFn); err != nil { + if err == filepath.SkipDir { + // stop processing this directory + break + } + // bail out completely + return err + } + } + return nil +} + +func (n *fsNode) sortedDirEntries() []string { + keys := make([]string, len(n.dir)) + i := 0 + for k := range n.dir { + keys[i] = k + i++ + } + sort.Strings(keys) + return keys +} + +// FileCount returns a count of files. +// Directories, empty or otherwise, not counted. +func (n *fsNode) FileCount() int { + count := 0 + n.WalkMe(func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + if !info.IsDir() { + count++ + } + return nil + }) + return count +} + +func (n *fsNode) DebugPrint() { + n.WalkMe(func(path string, info os.FileInfo, err error) error { + if err != nil { + fmt.Printf("err '%v' at path %q\n", err, path) + return nil + } + if info.IsDir() { + if info.Size() == 0 { + fmt.Println("empty dir: " + path) + } + } else { + fmt.Println(" file: " + path) + } + return nil + }) +} + +var legalFileNamePattern = regexp.MustCompile("^[a-zA-Z0-9-_.]+$") + +// This rules enforced here should be simpler and tighter +// than what's allowed on a real OS. +// Should be fine for testing or in-memory purposes. +func isLegalFileNameForCreation(n string) bool { + if n == "" || n == SelfDir || !legalFileNamePattern.MatchString(n) { + return false + } + return !strings.Contains(n, ParentDir) +} + +// RegExpGlob returns a list of file paths matching the regexp. +// Excludes directories. +func (n *fsNode) RegExpGlob(pattern string) ([]string, error) { + var result []string + var expression = regexp.MustCompile(pattern) + n.WalkMe(func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + if !info.IsDir() { + if expression.MatchString(path) { + result = append(result, path) + } + } + return nil + }) + sort.Strings(result) + return result, nil +} + +// Glob implements FileSystem. +// Glob returns the list of file paths matching +// per filepath.Match semantics, i.e. unlike RegExpGlob, +// Match("foo/a*") will not match sub-sub directories of foo. +// This is how /bin/ls behaves. +func (n *fsNode) Glob(pattern string) ([]string, error) { + var result []string + n.WalkMe(func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + if !info.IsDir() { + match, err := filepath.Match(pattern, path) + if err != nil { + return err + } + if match { + result = append(result, path) + } + } + return nil + }) + sort.Strings(result) + return result, nil +} diff --git a/vendor/sigs.k8s.io/kustomize/api/filesys/fsondisk.go b/vendor/sigs.k8s.io/kustomize/api/filesys/fsondisk.go new file mode 100644 index 000000000000..6becbb6f1323 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/filesys/fsondisk.go @@ -0,0 +1,114 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package filesys + +import ( + "fmt" + "io/ioutil" + "log" + "os" + "path/filepath" +) + +var _ FileSystem = fsOnDisk{} + +// fsOnDisk implements FileSystem using the local filesystem. +type fsOnDisk struct{} + +// MakeFsOnDisk makes an instance of fsOnDisk. +func MakeFsOnDisk() FileSystem { + return fsOnDisk{} +} + +// Create delegates to os.Create. +func (fsOnDisk) Create(name string) (File, error) { return os.Create(name) } + +// Mkdir delegates to os.Mkdir. +func (fsOnDisk) Mkdir(name string) error { + return os.Mkdir(name, 0777|os.ModeDir) +} + +// MkdirAll delegates to os.MkdirAll. +func (fsOnDisk) MkdirAll(name string) error { + return os.MkdirAll(name, 0777|os.ModeDir) +} + +// RemoveAll delegates to os.RemoveAll. +func (fsOnDisk) RemoveAll(name string) error { + return os.RemoveAll(name) +} + +// Open delegates to os.Open. +func (fsOnDisk) Open(name string) (File, error) { return os.Open(name) } + +// CleanedAbs converts the given path into a +// directory and a file name, where the directory +// is represented as a ConfirmedDir and all that implies. +// If the entire path is a directory, the file component +// is an empty string. +func (x fsOnDisk) CleanedAbs( + path string) (ConfirmedDir, string, error) { + absRoot, err := filepath.Abs(path) + if err != nil { + return "", "", fmt.Errorf( + "abs path error on '%s' : %v", path, err) + } + deLinked, err := filepath.EvalSymlinks(absRoot) + if err != nil { + return "", "", fmt.Errorf( + "evalsymlink failure on '%s' : %v", path, err) + } + if x.IsDir(deLinked) { + return ConfirmedDir(deLinked), "", nil + } + d := filepath.Dir(deLinked) + if !x.IsDir(d) { + // Programmer/assumption error. + log.Fatalf("first part of '%s' not a directory", deLinked) + } + if d == deLinked { + // Programmer/assumption error. + log.Fatalf("d '%s' should be a subset of deLinked", d) + } + f := filepath.Base(deLinked) + if filepath.Join(d, f) != deLinked { + // Programmer/assumption error. + log.Fatalf("these should be equal: '%s', '%s'", + filepath.Join(d, f), deLinked) + } + return ConfirmedDir(d), f, nil +} + +// Exists returns true if os.Stat succeeds. +func (fsOnDisk) Exists(name string) bool { + _, err := os.Stat(name) + return err == nil +} + +// Glob returns the list of matching files +func (fsOnDisk) Glob(pattern string) ([]string, error) { + return filepath.Glob(pattern) +} + +// IsDir delegates to os.Stat and FileInfo.IsDir +func (fsOnDisk) IsDir(name string) bool { + info, err := os.Stat(name) + if err != nil { + return false + } + return info.IsDir() +} + +// ReadFile delegates to ioutil.ReadFile. +func (fsOnDisk) ReadFile(name string) ([]byte, error) { return ioutil.ReadFile(name) } + +// WriteFile delegates to ioutil.WriteFile with read/write permissions. +func (fsOnDisk) WriteFile(name string, c []byte) error { + return ioutil.WriteFile(name, c, 0666) +} + +// Walk delegates to filepath.Walk. +func (fsOnDisk) Walk(path string, walkFn filepath.WalkFunc) error { + return filepath.Walk(path, walkFn) +} diff --git a/vendor/sigs.k8s.io/kustomize/api/filesys/util.go b/vendor/sigs.k8s.io/kustomize/api/filesys/util.go new file mode 100644 index 000000000000..0ccb2913248e --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/filesys/util.go @@ -0,0 +1,125 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package filesys + +import ( + "os" + "path/filepath" + "strings" +) + +// RootedPath returns a rooted path, e.g. "/foo/bar" as +// opposed to "foo/bar". +func RootedPath(elem ...string) string { + return Separator + filepath.Join(elem...) +} + +// StripTrailingSeps trims trailing filepath separators from input. +func StripTrailingSeps(s string) string { + k := len(s) + for k > 0 && s[k-1] == filepath.Separator { + k-- + } + return s[:k] +} + +// StripLeadingSeps trims leading filepath separators from input. +func StripLeadingSeps(s string) string { + k := 0 + for k < len(s) && s[k] == filepath.Separator { + k++ + } + return s[k:] +} + +// PathSplit converts a file path to a slice of string. +// If the path is absolute (if the path has a leading slash), +// then the first entry in the result is an empty string. +// Desired: path == PathJoin(PathSplit(path)) +func PathSplit(incoming string) []string { + if incoming == "" { + return []string{} + } + dir, path := filepath.Split(incoming) + if dir == string(os.PathSeparator) { + if path == "" { + return []string{""} + } + return []string{"", path} + } + dir = strings.TrimSuffix(dir, string(os.PathSeparator)) + if dir == "" { + return []string{path} + } + return append(PathSplit(dir), path) +} + +// PathJoin converts a slice of string to a file path. +// If the first entry is an empty string, then the returned +// path is absolute (it has a leading slash). +// Desired: path == PathJoin(PathSplit(path)) +func PathJoin(incoming []string) string { + if len(incoming) == 0 { + return "" + } + if incoming[0] == "" { + return string(os.PathSeparator) + filepath.Join(incoming[1:]...) + } + return filepath.Join(incoming...) +} + +// InsertPathPart inserts 'part' at position 'pos' in the given filepath. +// The first position is 0. +// +// E.g. if part == 'PEACH' +// +// OLD : NEW : POS +// -------------------------------------------------------- +// {empty} : PEACH : irrelevant +// / : /PEACH : irrelevant +// pie : PEACH/pie : 0 (or negative) +// /pie : /PEACH/pie : 0 (or negative) +// raw : raw/PEACH : 1 (or larger) +// /raw : /raw/PEACH : 1 (or larger) +// a/nice/warm/pie : a/nice/warm/PEACH/pie : 3 +// /a/nice/warm/pie : /a/nice/warm/PEACH/pie : 3 +// +// * An empty part results in no change. +// +// * Absolute paths get their leading '/' stripped, treated like +// relative paths, and the leading '/' is re-added on output. +// The meaning of pos is intentionally the same in either absolute or +// relative paths; if it weren't, this function could convert absolute +// paths to relative paths, which is not desirable. +// +// * For robustness (liberal input, conservative output) Pos values that +// that are too small (large) to index the split filepath result in a +// prefix (postfix) rather than an error. Use extreme position values +// to assure a prefix or postfix (e.g. 0 will always prefix, and +// 9999 will presumably always postfix). +func InsertPathPart(path string, pos int, part string) string { + if part == "" { + return path + } + parts := PathSplit(path) + if pos < 0 { + pos = 0 + } else if pos > len(parts) { + pos = len(parts) + } + if len(parts) > 0 && parts[0] == "" && pos < len(parts) { + // An empty string at 0 indicates an absolute path, and means + // we must increment pos. This change means that a position + // specification has the same meaning in relative and absolute paths. + // E.g. in either the path 'a/b/c' or the path '/a/b/c', + // 'a' is at 0, 'b' is at 1 and 'c' is at 2, and inserting at + // zero means a new first field _without_ changing an absolute + // path to a relative path. + pos++ + } + result := make([]string, len(parts)+1) + copy(result, parts[0:pos]) + result[pos] = part + return PathJoin(append(result, parts[pos:]...)) +} diff --git a/vendor/sigs.k8s.io/kustomize/api/filters/annotations/annotations.go b/vendor/sigs.k8s.io/kustomize/api/filters/annotations/annotations.go new file mode 100644 index 000000000000..cd0e3b4d5d60 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/filters/annotations/annotations.go @@ -0,0 +1,44 @@ +// Copyright 2020 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package annotations + +import ( + "sigs.k8s.io/kustomize/api/filters/filtersutil" + "sigs.k8s.io/kustomize/api/filters/fsslice" + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/kio" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +type annoMap map[string]string + +type Filter struct { + // Annotations is the set of annotations to apply to the inputs + Annotations annoMap `yaml:"annotations,omitempty"` + + // FsSlice contains the FieldSpecs to locate the namespace field + FsSlice types.FsSlice +} + +var _ kio.Filter = Filter{} + +func (f Filter) Filter(nodes []*yaml.RNode) ([]*yaml.RNode, error) { + keys := yaml.SortedMapKeys(f.Annotations) + _, err := kio.FilterAll(yaml.FilterFunc( + func(node *yaml.RNode) (*yaml.RNode, error) { + for _, k := range keys { + if err := node.PipeE(fsslice.Filter{ + FsSlice: f.FsSlice, + SetValue: filtersutil.SetEntry( + k, f.Annotations[k], yaml.NodeTagString), + CreateKind: yaml.MappingNode, // Annotations are MappingNodes. + CreateTag: yaml.NodeTagMap, + }); err != nil { + return nil, err + } + } + return node, nil + })).Filter(nodes) + return nodes, err +} diff --git a/vendor/sigs.k8s.io/kustomize/api/filters/annotations/doc.go b/vendor/sigs.k8s.io/kustomize/api/filters/annotations/doc.go new file mode 100644 index 000000000000..b1f6a0b66e60 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/filters/annotations/doc.go @@ -0,0 +1,6 @@ +// Copyright 2020 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +// Package annotations contains a kio.Filter implementation of the kustomize +// annotations transformer. +package annotations diff --git a/vendor/sigs.k8s.io/kustomize/api/filters/fieldspec/doc.go b/vendor/sigs.k8s.io/kustomize/api/filters/fieldspec/doc.go new file mode 100644 index 000000000000..6f643630a538 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/filters/fieldspec/doc.go @@ -0,0 +1,6 @@ +// Copyright 2020 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +// Package fieldspec contains a yaml.Filter to modify a resource +// that matches the FieldSpec. +package fieldspec diff --git a/vendor/sigs.k8s.io/kustomize/api/filters/fieldspec/fieldspec.go b/vendor/sigs.k8s.io/kustomize/api/filters/fieldspec/fieldspec.go new file mode 100644 index 000000000000..d728e9ebcf24 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/filters/fieldspec/fieldspec.go @@ -0,0 +1,185 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package fieldspec + +import ( + "fmt" + "strings" + + "sigs.k8s.io/kustomize/api/filters/filtersutil" + "sigs.k8s.io/kustomize/api/internal/utils" + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/errors" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +var _ yaml.Filter = Filter{} + +// Filter possibly mutates its object argument using a FieldSpec. +// If the object matches the FieldSpec, and the node found +// by following the fieldSpec's path is non-null, this filter calls +// the setValue function on the node at the end of the path. +// If any part of the path doesn't exist, the filter returns +// without doing anything and without error, unless it was set +// to create the path. If set to create, it creates a tree of maps +// along the path, and the leaf node gets the setValue called on it. +// Error on GVK mismatch, empty or poorly formed path. +// Filter expect kustomize style paths, not JSON paths. +// Filter stores internal state and should not be reused +type Filter struct { + // FieldSpec contains the path to the value to set. + FieldSpec types.FieldSpec `yaml:"fieldSpec"` + + // Set the field using this function + SetValue filtersutil.SetFn + + // CreateKind defines the type of node to create if the field is not found + CreateKind yaml.Kind + + CreateTag string + + // path keeps internal state about the current path + path []string +} + +func (fltr Filter) Filter(obj *yaml.RNode) (*yaml.RNode, error) { + // check if the FieldSpec applies to the object + if match, err := isMatchGVK(fltr.FieldSpec, obj); !match || err != nil { + return obj, errors.Wrap(err) + } + fltr.path = utils.PathSplitter(fltr.FieldSpec.Path) + err := fltr.filter(obj) + if err != nil { + s, _ := obj.String() + return nil, errors.WrapPrefixf(err, + "considering field '%s' of object\n%v", fltr.FieldSpec.Path, s) + } + return obj, nil +} + +// Recursively called. +func (fltr Filter) filter(obj *yaml.RNode) error { + if len(fltr.path) == 0 { + // found the field -- set its value + return fltr.SetValue(obj) + } + if obj.IsTaggedNull() || obj.IsNil() { + return nil + } + switch obj.YNode().Kind { + case yaml.SequenceNode: + return fltr.handleSequence(obj) + case yaml.MappingNode: + return fltr.handleMap(obj) + case yaml.AliasNode: + return fltr.filter(yaml.NewRNode(obj.YNode().Alias)) + default: + return errors.Errorf("expected sequence or mapping node") + } +} + +// handleMap calls filter on the map field matching the next path element +func (fltr Filter) handleMap(obj *yaml.RNode) error { + fieldName, isSeq := isSequenceField(fltr.path[0]) + if fieldName == "" { + return fmt.Errorf("cannot set or create an empty field name") + } + // lookup the field matching the next path element + var operation yaml.Filter + var kind yaml.Kind + tag := yaml.NodeTagEmpty + switch { + case !fltr.FieldSpec.CreateIfNotPresent || fltr.CreateKind == 0 || isSeq: + // don't create the field if we don't find it + operation = yaml.Lookup(fieldName) + if isSeq { + // The query path thinks this field should be a sequence; + // accept this hint for use later if the tag is NodeTagNull. + kind = yaml.SequenceNode + } + case len(fltr.path) <= 1: + // create the field if it is missing: use the provided node kind + operation = yaml.LookupCreate(fltr.CreateKind, fieldName) + kind = fltr.CreateKind + tag = fltr.CreateTag + default: + // create the field if it is missing: must be a mapping node + operation = yaml.LookupCreate(yaml.MappingNode, fieldName) + kind = yaml.MappingNode + tag = yaml.NodeTagMap + } + + // locate (or maybe create) the field + field, err := obj.Pipe(operation) + if err != nil { + return errors.WrapPrefixf(err, "fieldName: %s", fieldName) + } + if field == nil { + // No error if field not found. + return nil + } + + // if the value exists, but is null and kind is set, + // then change it to the creation type + // TODO: update yaml.LookupCreate to support this + if field.YNode().Tag == yaml.NodeTagNull && yaml.IsCreate(kind) { + field.YNode().Kind = kind + field.YNode().Tag = tag + } + + // copy the current fltr and change the path on the copy + var next = fltr + // call filter for the next path element on the matching field + next.path = fltr.path[1:] + return next.filter(field) +} + +// seq calls filter on all sequence elements +func (fltr Filter) handleSequence(obj *yaml.RNode) error { + if err := obj.VisitElements(func(node *yaml.RNode) error { + // recurse on each element -- re-allocating a Filter is + // not strictly required, but is more consistent with field + // and less likely to have side effects + // keep the entire path -- it does not contain parts for sequences + return fltr.filter(node) + }); err != nil { + return errors.WrapPrefixf(err, + "visit traversal on path: %v", fltr.path) + } + return nil +} + +// isSequenceField returns true if the path element is for a sequence field. +// isSequence also returns the path element with the '[]' suffix trimmed +func isSequenceField(name string) (string, bool) { + shorter := strings.TrimSuffix(name, "[]") + return shorter, shorter != name +} + +// isMatchGVK returns true if the fs.GVK matches the obj GVK. +func isMatchGVK(fs types.FieldSpec, obj *yaml.RNode) (bool, error) { + meta, err := obj.GetMeta() + if err != nil { + return false, err + } + if fs.Kind != "" && fs.Kind != meta.Kind { + // kind doesn't match + return false, err + } + + // parse the group and version from the apiVersion field + group, version := parseGV(meta.APIVersion) + + if fs.Group != "" && fs.Group != group { + // group doesn't match + return false, nil + } + + if fs.Version != "" && fs.Version != version { + // version doesn't match + return false, nil + } + + return true, nil +} diff --git a/vendor/sigs.k8s.io/kustomize/api/filters/fieldspec/gvk.go b/vendor/sigs.k8s.io/kustomize/api/filters/fieldspec/gvk.go new file mode 100644 index 000000000000..42e21a80dc2f --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/filters/fieldspec/gvk.go @@ -0,0 +1,49 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 +package fieldspec + +import ( + "strings" + + "sigs.k8s.io/kustomize/api/resid" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +// Return true for 'v' followed by a 1 or 2, and don't look at rest. +// I.e. 'v1', 'v1beta1', 'v2', would return true. +func looksLikeACoreApiVersion(s string) bool { + if len(s) < 2 { + return false + } + if s[0:1] != "v" { + return false + } + return s[1:2] == "1" || s[1:2] == "2" +} + +// parseGV parses apiVersion field into group and version. +func parseGV(apiVersion string) (group, version string) { + // parse the group and version from the apiVersion field + parts := strings.SplitN(apiVersion, "/", 2) + group = parts[0] + if len(parts) > 1 { + version = parts[1] + } + // Special case the original "apiVersion" of what + // we now call the "core" (empty) group. + if version == "" && looksLikeACoreApiVersion(group) { + version = group + group = "" + } + return +} + +// GetGVK parses the metadata into a GVK +func GetGVK(meta yaml.ResourceMeta) resid.Gvk { + group, version := parseGV(meta.APIVersion) + return resid.Gvk{ + Group: group, + Version: version, + Kind: meta.Kind, + } +} diff --git a/vendor/sigs.k8s.io/kustomize/api/filters/filtersutil/setters.go b/vendor/sigs.k8s.io/kustomize/api/filters/filtersutil/setters.go new file mode 100644 index 000000000000..cc04afe898c8 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/filters/filtersutil/setters.go @@ -0,0 +1,33 @@ +package filtersutil + +import ( + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +// SetFn is a function that accepts an RNode to possibly modify. +type SetFn func(*yaml.RNode) error + +// SetScalar returns a SetFn to set a scalar value +func SetScalar(value string) SetFn { + return func(node *yaml.RNode) error { + return node.PipeE(yaml.FieldSetter{StringValue: value}) + } +} + +// SetEntry returns a SetFn to set an entry in a map +func SetEntry(key, value, tag string) SetFn { + n := &yaml.Node{ + Kind: yaml.ScalarNode, + Value: value, + Tag: tag, + } + if tag == yaml.NodeTagString && yaml.IsYaml1_1NonString(n) { + n.Style = yaml.DoubleQuotedStyle + } + return func(node *yaml.RNode) error { + return node.PipeE(yaml.FieldSetter{ + Name: key, + Value: yaml.NewRNode(n), + }) + } +} diff --git a/vendor/sigs.k8s.io/kustomize/api/filters/fsslice/doc.go b/vendor/sigs.k8s.io/kustomize/api/filters/fsslice/doc.go new file mode 100644 index 000000000000..b0f197722e55 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/filters/fsslice/doc.go @@ -0,0 +1,6 @@ +// Copyright 2020 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +// Package fsslice contains a yaml.Filter to modify a resource if +// it matches one or more FieldSpec entries. +package fsslice diff --git a/vendor/sigs.k8s.io/kustomize/api/filters/fsslice/fsslice.go b/vendor/sigs.k8s.io/kustomize/api/filters/fsslice/fsslice.go new file mode 100644 index 000000000000..9eb5c13133b6 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/filters/fsslice/fsslice.go @@ -0,0 +1,47 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package fsslice + +import ( + "sigs.k8s.io/kustomize/api/filters/fieldspec" + "sigs.k8s.io/kustomize/api/filters/filtersutil" + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +var _ yaml.Filter = Filter{} + +// Filter ranges over an FsSlice to modify fields on a single object. +// An FsSlice is a range of FieldSpecs. A FieldSpec is a GVK plus a path. +type Filter struct { + // FieldSpecList list of FieldSpecs to set + FsSlice types.FsSlice `yaml:"fsSlice"` + + // SetValue is called on each field that matches one of the FieldSpecs + SetValue filtersutil.SetFn + + // CreateKind is used to create fields that do not exist + CreateKind yaml.Kind + + // CreateTag is used to set the tag if encountering a null field + CreateTag string +} + +func (fltr Filter) Filter(obj *yaml.RNode) (*yaml.RNode, error) { + for i := range fltr.FsSlice { + // apply this FieldSpec + // create a new filter for each iteration because they + // store internal state about the field paths + _, err := (&fieldspec.Filter{ + FieldSpec: fltr.FsSlice[i], + SetValue: fltr.SetValue, + CreateKind: fltr.CreateKind, + CreateTag: fltr.CreateTag, + }).Filter(obj) + if err != nil { + return nil, err + } + } + return obj, nil +} diff --git a/vendor/sigs.k8s.io/kustomize/api/filters/imagetag/doc.go b/vendor/sigs.k8s.io/kustomize/api/filters/imagetag/doc.go new file mode 100644 index 000000000000..d919491dd62f --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/filters/imagetag/doc.go @@ -0,0 +1,12 @@ +// Copyright 2020 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +// Package imagetag contains two kio.Filter implementations to cover the +// functionality of the kustomize imagetag transformer. +// +// Filter updates fields based on a FieldSpec and an ImageTag. +// +// LegacyFilter doesn't use a FieldSpec, and instead only updates image +// references if the field is name image and it is underneath a field called +// either containers or initContainers. +package imagetag diff --git a/vendor/sigs.k8s.io/kustomize/api/filters/imagetag/imagetag.go b/vendor/sigs.k8s.io/kustomize/api/filters/imagetag/imagetag.go new file mode 100644 index 000000000000..0770317544fb --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/filters/imagetag/imagetag.go @@ -0,0 +1,69 @@ +// Copyright 2020 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package imagetag + +import ( + "sigs.k8s.io/kustomize/api/filters/filtersutil" + "sigs.k8s.io/kustomize/api/filters/fsslice" + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/kio" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +// Filter modifies an "image tag", the value used to specify the +// name, tag, version digest etc. of (docker) container images +// used by a pod template. +type Filter struct { + // imageTag is the tag we want to apply to the inputs + // The name of the image is used as a key, and other fields + // can specify a new name, tag, etc. + ImageTag types.Image `json:"imageTag,omitempty" yaml:"imageTag,omitempty"` + + // FsSlice contains the FieldSpecs to locate an image field, + // e.g. Path: "spec/myContainers[]/image" + FsSlice types.FsSlice `json:"fieldSpecs,omitempty" yaml:"fieldSpecs,omitempty"` +} + +var _ kio.Filter = Filter{} + +func (f Filter) Filter(nodes []*yaml.RNode) ([]*yaml.RNode, error) { + _, err := kio.FilterAll(yaml.FilterFunc(f.filter)).Filter(nodes) + return nodes, err +} + +func (f Filter) filter(node *yaml.RNode) (*yaml.RNode, error) { + // FsSlice is an allowlist, not a denyList, so to deny + // something via configuration a new config mechanism is + // needed. Until then, hardcode it. + if f.isOnDenyList(node) { + return node, nil + } + if err := node.PipeE(fsslice.Filter{ + FsSlice: f.FsSlice, + SetValue: updateImageTagFn(f.ImageTag), + }); err != nil { + return nil, err + } + return node, nil +} + +func (f Filter) isOnDenyList(node *yaml.RNode) bool { + meta, err := node.GetMeta() + if err != nil { + // A missing 'meta' field will cause problems elsewhere; + // ignore it here to keep the signature simple. + return false + } + // Ignore CRDs + // https://github.com/kubernetes-sigs/kustomize/issues/890 + return meta.Kind == `CustomResourceDefinition` +} + +func updateImageTagFn(imageTag types.Image) filtersutil.SetFn { + return func(node *yaml.RNode) error { + return node.PipeE(imageTagUpdater{ + ImageTag: imageTag, + }) + } +} diff --git a/vendor/sigs.k8s.io/kustomize/api/filters/imagetag/legacy.go b/vendor/sigs.k8s.io/kustomize/api/filters/imagetag/legacy.go new file mode 100644 index 000000000000..5014e9c82b8c --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/filters/imagetag/legacy.go @@ -0,0 +1,113 @@ +// Copyright 2020 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package imagetag + +import ( + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/kio" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +// LegacyFilter is an implementation of the kio.Filter interface +// that scans through the provided kyaml data structure and updates +// any values of any image fields that is inside a sequence under +// a field called either containers or initContainers. The field is only +// update if it has a value that matches and image reference and the name +// of the image is a match with the provided ImageTag. +type LegacyFilter struct { + ImageTag types.Image `json:"imageTag,omitempty" yaml:"imageTag,omitempty"` +} + +var _ kio.Filter = LegacyFilter{} + +func (lf LegacyFilter) Filter(nodes []*yaml.RNode) ([]*yaml.RNode, error) { + return kio.FilterAll(yaml.FilterFunc(lf.filter)).Filter(nodes) +} + +func (lf LegacyFilter) filter(node *yaml.RNode) (*yaml.RNode, error) { + meta, err := node.GetMeta() + if err != nil { + return nil, err + } + + // We do not make any changes if the type of the resource + // is CustomResourceDefinition. + if meta.Kind == `CustomResourceDefinition` { + return node, nil + } + + fff := findFieldsFilter{ + fields: []string{"containers", "initContainers"}, + fieldCallback: checkImageTagsFn(lf.ImageTag), + } + if err := node.PipeE(fff); err != nil { + return nil, err + } + return node, nil +} + +type fieldCallback func(node *yaml.RNode) error + +// findFieldsFilter is an implementation of the kio.Filter +// interface. It will walk the data structure and look for fields +// that matches the provided list of field names. For each match, +// the value of the field will be passed in as a parameter to the +// provided fieldCallback. +// TODO: move this to kyaml/filterutils +type findFieldsFilter struct { + fields []string + + fieldCallback fieldCallback +} + +func (f findFieldsFilter) Filter(obj *yaml.RNode) (*yaml.RNode, error) { + return obj, f.walk(obj) +} + +func (f findFieldsFilter) walk(node *yaml.RNode) error { + switch node.YNode().Kind { + case yaml.MappingNode: + return node.VisitFields(func(n *yaml.MapNode) error { + err := f.walk(n.Value) + if err != nil { + return err + } + key := n.Key.YNode().Value + if contains(f.fields, key) { + return f.fieldCallback(n.Value) + } + return nil + }) + case yaml.SequenceNode: + return node.VisitElements(func(n *yaml.RNode) error { + return f.walk(n) + }) + } + return nil +} + +func contains(slice []string, str string) bool { + for _, s := range slice { + if s == str { + return true + } + } + return false +} + +func checkImageTagsFn(imageTag types.Image) fieldCallback { + return func(node *yaml.RNode) error { + if node.YNode().Kind != yaml.SequenceNode { + return nil + } + + return node.VisitElements(func(n *yaml.RNode) error { + // Look up any fields on the provided node that is named + // image. + return n.PipeE(yaml.Get("image"), imageTagUpdater{ + ImageTag: imageTag, + }) + }) + } +} diff --git a/vendor/sigs.k8s.io/kustomize/api/filters/imagetag/updater.go b/vendor/sigs.k8s.io/kustomize/api/filters/imagetag/updater.go new file mode 100644 index 000000000000..1c3637cdec91 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/filters/imagetag/updater.go @@ -0,0 +1,43 @@ +// Copyright 2020 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package imagetag + +import ( + "sigs.k8s.io/kustomize/api/image" + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +// imageTagUpdater is an implementation of the kio.Filter interface +// that will update the value of the yaml node based on the provided +// ImageTag if the current value matches the format of an image reference. +type imageTagUpdater struct { + Kind string `yaml:"kind,omitempty"` + ImageTag types.Image `yaml:"imageTag,omitempty"` +} + +func (u imageTagUpdater) Filter(rn *yaml.RNode) (*yaml.RNode, error) { + if err := yaml.ErrorIfInvalid(rn, yaml.ScalarNode); err != nil { + return nil, err + } + + value := rn.YNode().Value + + if !image.IsImageMatched(value, u.ImageTag.Name) { + return rn, nil + } + + name, tag := image.Split(value) + if u.ImageTag.NewName != "" { + name = u.ImageTag.NewName + } + if u.ImageTag.NewTag != "" { + tag = ":" + u.ImageTag.NewTag + } + if u.ImageTag.Digest != "" { + tag = "@" + u.ImageTag.Digest + } + + return rn.Pipe(yaml.FieldSetter{StringValue: name + tag}) +} diff --git a/vendor/sigs.k8s.io/kustomize/api/filters/labels/doc.go b/vendor/sigs.k8s.io/kustomize/api/filters/labels/doc.go new file mode 100644 index 000000000000..978033c7e014 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/filters/labels/doc.go @@ -0,0 +1,6 @@ +// Copyright 2020 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +// Package labels contains a kio.Filter implementation of the kustomize +// labels transformer. +package labels diff --git a/vendor/sigs.k8s.io/kustomize/api/filters/labels/labels.go b/vendor/sigs.k8s.io/kustomize/api/filters/labels/labels.go new file mode 100644 index 000000000000..92f298bfe99d --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/filters/labels/labels.go @@ -0,0 +1,45 @@ +// Copyright 2020 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package labels + +import ( + "sigs.k8s.io/kustomize/api/filters/filtersutil" + "sigs.k8s.io/kustomize/api/filters/fsslice" + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/kio" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +type labelMap map[string]string + +// Filter sets labels. +type Filter struct { + // Labels is the set of labels to apply to the inputs + Labels labelMap `yaml:"labels,omitempty"` + + // FsSlice identifies the label fields. + FsSlice types.FsSlice +} + +var _ kio.Filter = Filter{} + +func (f Filter) Filter(nodes []*yaml.RNode) ([]*yaml.RNode, error) { + keys := yaml.SortedMapKeys(f.Labels) + _, err := kio.FilterAll(yaml.FilterFunc( + func(node *yaml.RNode) (*yaml.RNode, error) { + for _, k := range keys { + if err := node.PipeE(fsslice.Filter{ + FsSlice: f.FsSlice, + SetValue: filtersutil.SetEntry( + k, f.Labels[k], yaml.NodeTagString), + CreateKind: yaml.MappingNode, // Labels are MappingNodes. + CreateTag: yaml.NodeTagMap, + }); err != nil { + return nil, err + } + } + return node, nil + })).Filter(nodes) + return nodes, err +} diff --git a/vendor/sigs.k8s.io/kustomize/api/filters/nameref/doc.go b/vendor/sigs.k8s.io/kustomize/api/filters/nameref/doc.go new file mode 100644 index 000000000000..b78499d51e80 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/filters/nameref/doc.go @@ -0,0 +1,3 @@ +// Package nameref contains a kio.Filter implementation of the kustomize +// name reference transformer. +package nameref diff --git a/vendor/sigs.k8s.io/kustomize/api/filters/nameref/nameref.go b/vendor/sigs.k8s.io/kustomize/api/filters/nameref/nameref.go new file mode 100644 index 000000000000..e5a3d2635a00 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/filters/nameref/nameref.go @@ -0,0 +1,402 @@ +package nameref + +import ( + "encoding/json" + "fmt" + "strings" + + "github.com/pkg/errors" + "sigs.k8s.io/kustomize/api/filters/fieldspec" + "sigs.k8s.io/kustomize/api/resid" + "sigs.k8s.io/kustomize/api/resmap" + "sigs.k8s.io/kustomize/api/resource" + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/filtersutil" + "sigs.k8s.io/kustomize/kyaml/kio" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +// Filter updates a name references. +type Filter struct { + // Referrer refers to another resource X by X's name. + // E.g. A Deployment can refer to a ConfigMap. + // The Deployment is the Referrer, + // the ConfigMap is the ReferralTarget. + // This filter seeks to repair the reference in Deployment, given + // that the ConfigMap's name may have changed. + Referrer *resource.Resource + + // NameFieldToUpdate is the field in the Referrer + // that holds the name requiring an update. + // This is the field to write. + NameFieldToUpdate types.FieldSpec + + // ReferralTarget is the source of the new value for + // the name, always in the 'metadata/name' field. + // This is the field to read. + ReferralTarget resid.Gvk + + // Set of resources to scan to find the ReferralTarget. + ReferralCandidates resmap.ResMap +} + +// At time of writing, in practice this is called with a slice with only +// one entry, the node also referred to be the resource in the Referrer field. +func (f Filter) Filter(nodes []*yaml.RNode) ([]*yaml.RNode, error) { + return kio.FilterAll(yaml.FilterFunc(f.run)).Filter(nodes) +} + +// The node passed in here is the same node as held in Referrer; +// that's how the referrer's name field is updated. +// Currently, however, this filter still needs the extra methods on Referrer +// to consult things like the resource Id, its namespace, etc. +// TODO(3455): No filter should use the Resource api; all information +// about names should come from annotations, with helper methods +// on the RNode object. Resource should get stupider, RNode smarter. +func (f Filter) run(node *yaml.RNode) (*yaml.RNode, error) { + if err := f.confirmNodeMatchesReferrer(node); err != nil { + // sanity check. + return nil, err + } + if err := node.PipeE(fieldspec.Filter{ + FieldSpec: f.NameFieldToUpdate, + SetValue: f.set, + }); err != nil { + return nil, errors.Wrapf( + err, "updating name reference in '%s' field of '%s'", + f.NameFieldToUpdate.Path, f.Referrer.CurId().String()) + } + return node, nil +} + +// This function is called on the node found at FieldSpec.Path. +// It's some node in the Referrer. +func (f Filter) set(node *yaml.RNode) error { + if yaml.IsMissingOrNull(node) { + return nil + } + switch node.YNode().Kind { + case yaml.ScalarNode: + return f.setScalar(node) + case yaml.MappingNode: + return f.setMapping(node) + case yaml.SequenceNode: + return applyFilterToSeq(seqFilter{ + setScalarFn: f.setScalar, + setMappingFn: f.setMapping, + }, node) + default: + return fmt.Errorf("node must be a scalar, sequence or map") + } +} + +// This method used when NameFieldToUpdate doesn't lead to +// one scalar field (typically called 'name'), but rather +// leads to a map field (called anything). In this case we +// must complete the field path, looking for both a 'name' +// and a 'namespace' field to help select the proper +// ReferralTarget to read the name and namespace from. +func (f Filter) setMapping(node *yaml.RNode) error { + if node.YNode().Kind != yaml.MappingNode { + return fmt.Errorf("expect a mapping node") + } + nameNode, err := node.Pipe(yaml.FieldMatcher{Name: "name"}) + if err != nil { + return errors.Wrap(err, "trying to match 'name' field") + } + if nameNode == nil { + // This is a _configuration_ error; the field path + // specified in NameFieldToUpdate.Path doesn't resolve + // to a map with a 'name' field, so we have no idea what + // field to update with a new name. + return fmt.Errorf("path config error; no 'name' field in node") + } + candidates, err := f.filterMapCandidatesByNamespace(node) + if err != nil { + return err + } + oldName := nameNode.YNode().Value + referral, err := f.selectReferral(oldName, candidates) + if err != nil || referral == nil { + // Nil referral means nothing to do. + return err + } + f.recordTheReferral(referral) + if referral.GetName() == oldName && referral.GetNamespace() == "" { + // The name has not changed, nothing to do. + return nil + } + if err = node.PipeE(yaml.FieldSetter{ + Name: "name", + StringValue: referral.GetName(), + }); err != nil { + return err + } + if referral.GetNamespace() == "" { + // Don't write an empty string into the namespace field, as + // it should not replace the value "default". The empty + // string is handled as a wild card here, not as an implicit + // specification of the "default" k8s namespace. + return nil + } + return node.PipeE(yaml.FieldSetter{ + Name: "namespace", + StringValue: referral.GetNamespace(), + }) +} + +func (f Filter) filterMapCandidatesByNamespace( + node *yaml.RNode) ([]*resource.Resource, error) { + namespaceNode, err := node.Pipe(yaml.FieldMatcher{Name: "namespace"}) + if err != nil { + return nil, errors.Wrap(err, "trying to match 'namespace' field") + } + if namespaceNode == nil { + return f.ReferralCandidates.Resources(), nil + } + namespace := namespaceNode.YNode().Value + nsMap := f.ReferralCandidates.GroupedByOriginalNamespace() + if candidates, ok := nsMap[namespace]; ok { + return candidates, nil + } + nsMap = f.ReferralCandidates.GroupedByCurrentNamespace() + // This could be nil, or an empty list. + return nsMap[namespace], nil +} + +func (f Filter) setScalar(node *yaml.RNode) error { + referral, err := f.selectReferral( + node.YNode().Value, f.ReferralCandidates.Resources()) + if err != nil || referral == nil { + // Nil referral means nothing to do. + return err + } + f.recordTheReferral(referral) + if referral.GetName() == node.YNode().Value { + // The name has not changed, nothing to do. + return nil + } + return node.PipeE(yaml.FieldSetter{StringValue: referral.GetName()}) +} + +// In the resource, make a note that it is referred to by the Referrer. +func (f Filter) recordTheReferral(referral *resource.Resource) { + referral.AppendRefBy(f.Referrer.CurId()) +} + +// getRoleRefGvk returns a Gvk in the roleRef field. Return error +// if the roleRef, roleRef/apiGroup or roleRef/kind is missing. +func getRoleRefGvk(res json.Marshaler) (*resid.Gvk, error) { + n, err := filtersutil.GetRNode(res) + if err != nil { + return nil, err + } + roleRef, err := n.Pipe(yaml.Lookup("roleRef")) + if err != nil { + return nil, err + } + if roleRef.IsNil() { + return nil, fmt.Errorf("roleRef cannot be found in %s", n.MustString()) + } + apiGroup, err := roleRef.Pipe(yaml.Lookup("apiGroup")) + if err != nil { + return nil, err + } + if apiGroup.IsNil() { + return nil, fmt.Errorf( + "apiGroup cannot be found in roleRef %s", roleRef.MustString()) + } + kind, err := roleRef.Pipe(yaml.Lookup("kind")) + if err != nil { + return nil, err + } + if kind.IsNil() { + return nil, fmt.Errorf( + "kind cannot be found in roleRef %s", roleRef.MustString()) + } + return &resid.Gvk{ + Group: apiGroup.YNode().Value, + Kind: kind.YNode().Value, + }, nil +} + +// sieveFunc returns true if the resource argument satisfies some criteria. +type sieveFunc func(*resource.Resource) bool + +// doSieve uses a function to accept or ignore resources from a list. +// If list is nil, returns immediately. +// It's a filter obviously, but that term is overloaded here. +func doSieve(list []*resource.Resource, fn sieveFunc) (s []*resource.Resource) { + for _, r := range list { + if fn(r) { + s = append(s, r) + } + } + return +} + +func acceptAll(r *resource.Resource) bool { + return true +} + +func previousNameMatches(name string) sieveFunc { + return func(r *resource.Resource) bool { + for _, id := range r.PrevIds() { + if id.Name == name { + return true + } + } + return false + } +} + +func previousIdSelectedByGvk(gvk *resid.Gvk) sieveFunc { + return func(r *resource.Resource) bool { + for _, id := range r.PrevIds() { + if id.IsSelected(gvk) { + return true + } + } + return false + } +} + +// If the we are updating a 'roleRef/name' field, the 'apiGroup' and 'kind' +// fields in the same 'roleRef' map must be considered. +// If either object is cluster-scoped (!IsNamespaceableKind), there +// can be a referral. +// E.g. a RoleBinding (which exists in a namespace) can refer +// to a ClusterRole (cluster-scoped) object. +// https://kubernetes.io/docs/reference/access-authn-authz/rbac/#role-and-clusterrole +// Likewise, a ClusterRole can refer to a Secret (in a namespace). +// Objects in different namespaces generally cannot refer to other +// with some exceptions (e.g. RoleBinding and ServiceAccount are both +// namespaceable, but the former can refer to accounts in other namespaces). +func (f Filter) roleRefFilter() sieveFunc { + if !strings.HasSuffix(f.NameFieldToUpdate.Path, "roleRef/name") { + return acceptAll + } + roleRefGvk, err := getRoleRefGvk(f.Referrer) + if err != nil { + return acceptAll + } + return previousIdSelectedByGvk(roleRefGvk) +} + +func prefixSuffixEquals(other resource.ResCtx) sieveFunc { + return func(r *resource.Resource) bool { + return r.PrefixesSuffixesEquals(other) + } +} + +func (f Filter) sameCurrentNamespaceAsReferrer() sieveFunc { + referrerCurId := f.Referrer.CurId() + if !referrerCurId.IsNamespaceableKind() { + // If the referrer is cluster-scoped, let anything through. + return acceptAll + } + return func(r *resource.Resource) bool { + if !r.CurId().IsNamespaceableKind() { + // Allow cluster-scoped through. + return true + } + if r.GetKind() == "ServiceAccount" { + // Allow service accounts through, even though they + // are in a namespace. A RoleBinding in another namespace + // can reference them. + return true + } + return referrerCurId.IsNsEquals(r.CurId()) + } +} + +// selectReferral picks the best referral from a list of candidates. +func (f Filter) selectReferral( + // The name referral that may need to be updated. + oldName string, + candidates []*resource.Resource) (*resource.Resource, error) { + candidates = doSieve(candidates, previousNameMatches(oldName)) + candidates = doSieve(candidates, previousIdSelectedByGvk(&f.ReferralTarget)) + candidates = doSieve(candidates, f.roleRefFilter()) + candidates = doSieve(candidates, f.sameCurrentNamespaceAsReferrer()) + if len(candidates) == 1 { + return candidates[0], nil + } + candidates = doSieve(candidates, prefixSuffixEquals(f.Referrer)) + if len(candidates) == 1 { + return candidates[0], nil + } + if len(candidates) == 0 { + return nil, nil + } + if allNamesAreTheSame(candidates) { + // Just take the first one. + return candidates[0], nil + } + ids := getIds(candidates) + f.failureDetails(candidates) + return nil, fmt.Errorf(" found multiple possible referrals: %s", ids) +} + +func (f Filter) failureDetails(resources []*resource.Resource) { + fmt.Printf( + "\n**** Too many possible referral targets to referrer:\n%s\n", + f.Referrer.MustYaml()) + for i, r := range resources { + fmt.Printf( + "--- possible referral %d:\n%s", i, r.MustYaml()) + fmt.Println("------") + } +} + +func allNamesAreTheSame(resources []*resource.Resource) bool { + name := resources[0].GetName() + for i := 1; i < len(resources); i++ { + if name != resources[i].GetName() { + return false + } + } + return true +} + +func getIds(rs []*resource.Resource) string { + var result []string + for _, r := range rs { + result = append(result, r.CurId().String()) + } + return strings.Join(result, ", ") +} + +func checkEqual(k, a, b string) error { + if a != b { + return fmt.Errorf( + "node-referrerOriginal '%s' mismatch '%s' != '%s'", + k, a, b) + } + return nil +} + +func (f Filter) confirmNodeMatchesReferrer(node *yaml.RNode) error { + meta, err := node.GetMeta() + if err != nil { + return err + } + gvk := f.Referrer.GetGvk() + if err = checkEqual( + "APIVersion", meta.APIVersion, gvk.ApiVersion()); err != nil { + return err + } + if err = checkEqual( + "Kind", meta.Kind, gvk.Kind); err != nil { + return err + } + if err = checkEqual( + "Name", meta.Name, f.Referrer.GetName()); err != nil { + return err + } + if err = checkEqual( + "Namespace", meta.Namespace, f.Referrer.GetNamespace()); err != nil { + return err + } + return nil +} diff --git a/vendor/sigs.k8s.io/kustomize/api/filters/nameref/seqfilter.go b/vendor/sigs.k8s.io/kustomize/api/filters/nameref/seqfilter.go new file mode 100644 index 000000000000..c880694d1abd --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/filters/nameref/seqfilter.go @@ -0,0 +1,57 @@ +package nameref + +import ( + "fmt" + + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +type setFn func(*yaml.RNode) error + +type seqFilter struct { + setScalarFn setFn + setMappingFn setFn +} + +func (sf seqFilter) Filter(node *yaml.RNode) (*yaml.RNode, error) { + if yaml.IsMissingOrNull(node) { + return node, nil + } + switch node.YNode().Kind { + case yaml.ScalarNode: + // Kind: Role/ClusterRole + // FieldSpec is rules.resourceNames + err := sf.setScalarFn(node) + return node, err + case yaml.MappingNode: + // Kind: RoleBinding/ClusterRoleBinding + // FieldSpec is subjects + // Note: The corresponding fieldSpec had been changed from + // from path: subjects/name to just path: subjects. This is + // what get mutatefield to request the mapping of the whole + // map containing namespace and name instead of just a simple + // string field containing the name + err := sf.setMappingFn(node) + return node, err + default: + return node, fmt.Errorf( + "%#v is expected to be either a string or a map of string", node) + } +} + +// applyFilterToSeq will apply the filter to each element in the sequence node +func applyFilterToSeq(filter yaml.Filter, node *yaml.RNode) error { + if node.YNode().Kind != yaml.SequenceNode { + return fmt.Errorf("expect a sequence node but got %v", node.YNode().Kind) + } + + for _, elem := range node.Content() { + rnode := yaml.NewRNode(elem) + err := rnode.PipeE(filter) + if err != nil { + return err + } + } + + return nil +} diff --git a/vendor/sigs.k8s.io/kustomize/api/filters/namespace/doc.go b/vendor/sigs.k8s.io/kustomize/api/filters/namespace/doc.go new file mode 100644 index 000000000000..539758b2824a --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/filters/namespace/doc.go @@ -0,0 +1,9 @@ +// Copyright 2020 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +// Package namespace contains a kio.Filter implementation of the kustomize +// namespace transformer. +// +// Special cases for known Kubernetes resources have been hardcoded in addition +// to those defined by the FsSlice. +package namespace diff --git a/vendor/sigs.k8s.io/kustomize/api/filters/namespace/namespace.go b/vendor/sigs.k8s.io/kustomize/api/filters/namespace/namespace.go new file mode 100644 index 000000000000..85e56c572434 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/filters/namespace/namespace.go @@ -0,0 +1,169 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package namespace + +import ( + "sigs.k8s.io/kustomize/api/filters/fieldspec" + "sigs.k8s.io/kustomize/api/filters/filtersutil" + "sigs.k8s.io/kustomize/api/filters/fsslice" + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/kio" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +type Filter struct { + // Namespace is the namespace to apply to the inputs + Namespace string `yaml:"namespace,omitempty"` + + // FsSlice contains the FieldSpecs to locate the namespace field + FsSlice types.FsSlice `json:"fieldSpecs,omitempty" yaml:"fieldSpecs,omitempty"` +} + +var _ kio.Filter = Filter{} + +func (ns Filter) Filter(nodes []*yaml.RNode) ([]*yaml.RNode, error) { + return kio.FilterAll(yaml.FilterFunc(ns.run)).Filter(nodes) +} + +// Run runs the filter on a single node rather than a slice +func (ns Filter) run(node *yaml.RNode) (*yaml.RNode, error) { + // hacks for hardcoded types -- :( + if err := ns.hacks(node); err != nil { + return nil, err + } + + // Remove the fieldspecs that are for hardcoded fields. The fieldspecs + // exist for backwards compatibility with other implementations + // of this transformation. + // This implementation of the namespace transformation + // Does not use the fieldspecs for implementing cases which + // require hardcoded logic. + ns.FsSlice = ns.removeFieldSpecsForHacks(ns.FsSlice) + + // transformations based on data -- :) + err := node.PipeE(fsslice.Filter{ + FsSlice: ns.FsSlice, + SetValue: filtersutil.SetScalar(ns.Namespace), + CreateKind: yaml.ScalarNode, // Namespace is a ScalarNode + CreateTag: yaml.NodeTagString, + }) + return node, err +} + +// hacks applies the namespace transforms that are hardcoded rather +// than specified through FieldSpecs. +func (ns Filter) hacks(obj *yaml.RNode) error { + meta, err := obj.GetMeta() + if err != nil { + return err + } + + if err := ns.metaNamespaceHack(obj, meta); err != nil { + return err + } + + return ns.roleBindingHack(obj, meta) +} + +// metaNamespaceHack is a hack for implementing the namespace transform +// for the metadata.namespace field on namespace scoped resources. +// namespace scoped resources are determined by NOT being present +// in a hard-coded list of cluster-scoped resource types (by apiVersion and kind). +// +// This hack should be updated to allow individual resources to specify +// if they are cluster scoped through either an annotation on the resources, +// or through inlined OpenAPI on the resource as a YAML comment. +func (ns Filter) metaNamespaceHack(obj *yaml.RNode, meta yaml.ResourceMeta) error { + gvk := fieldspec.GetGVK(meta) + if !gvk.IsNamespaceableKind() { + return nil + } + f := fsslice.Filter{ + FsSlice: []types.FieldSpec{ + {Path: types.MetadataNamespacePath, CreateIfNotPresent: true}, + }, + SetValue: filtersutil.SetScalar(ns.Namespace), + CreateKind: yaml.ScalarNode, // Namespace is a ScalarNode + } + _, err := f.Filter(obj) + return err +} + +// roleBindingHack is a hack for implementing the namespace transform +// for RoleBinding and ClusterRoleBinding resource types. +// RoleBinding and ClusterRoleBinding have namespace set on +// elements of the "subjects" field if and only if the subject elements +// "name" is "default". Otherwise the namespace is not set. +// +// Example: +// +// kind: RoleBinding +// subjects: +// - name: "default" # this will have the namespace set +// ... +// - name: "something-else" # this will not have the namespace set +// ... +func (ns Filter) roleBindingHack(obj *yaml.RNode, meta yaml.ResourceMeta) error { + if meta.Kind != roleBindingKind && meta.Kind != clusterRoleBindingKind { + return nil + } + + // Lookup the namespace field on all elements. + // We should change the fieldspec so this isn't necessary. + obj, err := obj.Pipe(yaml.Lookup(subjectsField)) + if err != nil || yaml.IsMissingOrNull(obj) { + return err + } + + // add the namespace to each "subject" with name: default + err = obj.VisitElements(func(o *yaml.RNode) error { + // copied from kunstruct based kustomize NamespaceTransformer plugin + // The only case we need to force the namespace + // if for the "service account". "default" is + // kind of hardcoded here for right now. + name, err := o.Pipe( + yaml.Lookup("name"), yaml.Match("default"), + ) + if err != nil || yaml.IsMissingOrNull(name) { + return err + } + + // set the namespace for the default account + v := yaml.NewScalarRNode(ns.Namespace) + return o.PipeE( + yaml.LookupCreate(yaml.ScalarNode, "namespace"), + yaml.FieldSetter{Value: v}, + ) + }) + + return err +} + +// removeFieldSpecsForHacks removes from the list fieldspecs that +// have hardcoded implementations +func (ns Filter) removeFieldSpecsForHacks(fs types.FsSlice) types.FsSlice { + var val types.FsSlice + for i := range fs { + // implemented by metaNamespaceHack + if fs[i].Path == types.MetadataNamespacePath { + continue + } + // implemented by roleBindingHack + if fs[i].Kind == roleBindingKind && fs[i].Path == subjectsField { + continue + } + // implemented by roleBindingHack + if fs[i].Kind == clusterRoleBindingKind && fs[i].Path == subjectsField { + continue + } + val = append(val, fs[i]) + } + return val +} + +const ( + subjectsField = "subjects" + roleBindingKind = "RoleBinding" + clusterRoleBindingKind = "ClusterRoleBinding" +) diff --git a/vendor/sigs.k8s.io/kustomize/api/filters/patchjson6902/doc.go b/vendor/sigs.k8s.io/kustomize/api/filters/patchjson6902/doc.go new file mode 100644 index 000000000000..ec4cfa82111d --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/filters/patchjson6902/doc.go @@ -0,0 +1,6 @@ +// Copyright 2020 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +// Package namespace contains a kio.Filter implementation of the kustomize +// patchjson6902 transformer +package patchjson6902 diff --git a/vendor/sigs.k8s.io/kustomize/api/filters/patchjson6902/patchjson6902.go b/vendor/sigs.k8s.io/kustomize/api/filters/patchjson6902/patchjson6902.go new file mode 100644 index 000000000000..5749d6ddfd90 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/filters/patchjson6902/patchjson6902.go @@ -0,0 +1,65 @@ +// Copyright 2020 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package patchjson6902 + +import ( + "strings" + + jsonpatch "github.com/evanphx/json-patch" + "sigs.k8s.io/kustomize/kyaml/kio" + "sigs.k8s.io/kustomize/kyaml/yaml" + k8syaml "sigs.k8s.io/yaml" +) + +type Filter struct { + Patch string + + decodedPatch jsonpatch.Patch +} + +var _ kio.Filter = Filter{} + +func (pf Filter) Filter(nodes []*yaml.RNode) ([]*yaml.RNode, error) { + decodedPatch, err := pf.decodePatch() + if err != nil { + return nil, err + } + pf.decodedPatch = decodedPatch + return kio.FilterAll(yaml.FilterFunc(pf.run)).Filter(nodes) +} + +func (pf Filter) decodePatch() (jsonpatch.Patch, error) { + patch := pf.Patch + // If the patch doesn't look like a JSON6902 patch, we + // try to parse it to json. + if !strings.HasPrefix(pf.Patch, "[") { + p, err := k8syaml.YAMLToJSON([]byte(patch)) + if err != nil { + return nil, err + } + patch = string(p) + } + decodedPatch, err := jsonpatch.DecodePatch([]byte(patch)) + if err != nil { + return nil, err + } + return decodedPatch, nil +} + +func (pf Filter) run(node *yaml.RNode) (*yaml.RNode, error) { + // We don't actually use the kyaml library for manipulating the + // yaml here. We just marshal it to json and rely on the + // jsonpatch library to take care of applying the patch. + // This means ordering might not be preserved with this filter. + b, err := node.MarshalJSON() + if err != nil { + return nil, err + } + res, err := pf.decodedPatch.Apply(b) + if err != nil { + return nil, err + } + err = node.UnmarshalJSON(res) + return node, err +} diff --git a/vendor/sigs.k8s.io/kustomize/api/filters/patchstrategicmerge/doc.go b/vendor/sigs.k8s.io/kustomize/api/filters/patchstrategicmerge/doc.go new file mode 100644 index 000000000000..1733fd8a2c12 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/filters/patchstrategicmerge/doc.go @@ -0,0 +1,6 @@ +// Copyright 2020 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +// Package patchstrategicmerge contains a kio.Filter implementation of the +// kustomize strategic merge patch transformer. +package patchstrategicmerge diff --git a/vendor/sigs.k8s.io/kustomize/api/filters/patchstrategicmerge/patchstrategicmerge.go b/vendor/sigs.k8s.io/kustomize/api/filters/patchstrategicmerge/patchstrategicmerge.go new file mode 100644 index 000000000000..3fa532df0536 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/filters/patchstrategicmerge/patchstrategicmerge.go @@ -0,0 +1,37 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package patchstrategicmerge + +import ( + "sigs.k8s.io/kustomize/api/konfig" + "sigs.k8s.io/kustomize/kyaml/kio" + "sigs.k8s.io/kustomize/kyaml/yaml" + "sigs.k8s.io/kustomize/kyaml/yaml/merge2" +) + +type Filter struct { + Patch *yaml.RNode +} + +var _ kio.Filter = Filter{} + +// Filter does a strategic merge patch, which can delete nodes. +func (pf Filter) Filter(nodes []*yaml.RNode) ([]*yaml.RNode, error) { + var result []*yaml.RNode + for i := range nodes { + r, err := merge2.Merge( + pf.Patch, nodes[i], + yaml.MergeOptions{ + ListIncreaseDirection: yaml.MergeOptionsListPrepend, + }, + ) + if err != nil { + return nil, err + } + if !konfig.FlagEnableKyamlDefaultValue || r != nil { + result = append(result, r) + } + } + return result, nil +} diff --git a/vendor/sigs.k8s.io/kustomize/api/filters/prefixsuffix/doc.go b/vendor/sigs.k8s.io/kustomize/api/filters/prefixsuffix/doc.go new file mode 100644 index 000000000000..319374436f65 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/filters/prefixsuffix/doc.go @@ -0,0 +1,6 @@ +// Copyright 2020 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +// Package prefixsuffix contains a kio.Filter implementation of the kustomize +// PrefixSuffixTransformer. +package prefixsuffix diff --git a/vendor/sigs.k8s.io/kustomize/api/filters/prefixsuffix/prefixsuffix.go b/vendor/sigs.k8s.io/kustomize/api/filters/prefixsuffix/prefixsuffix.go new file mode 100644 index 000000000000..4b4247d41afe --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/filters/prefixsuffix/prefixsuffix.go @@ -0,0 +1,43 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package prefixsuffix + +import ( + "fmt" + + "sigs.k8s.io/kustomize/api/filters/fieldspec" + "sigs.k8s.io/kustomize/api/filters/filtersutil" + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/kio" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +// Filter applies resource name prefix's and suffix's using the fieldSpecs +type Filter struct { + Prefix string `json:"prefix,omitempty" yaml:"prefix,omitempty"` + Suffix string `json:"suffix,omitempty" yaml:"suffix,omitempty"` + + FieldSpec types.FieldSpec `json:"fieldSpec,omitempty" yaml:"fieldSpec,omitempty"` +} + +var _ kio.Filter = Filter{} + +func (f Filter) Filter(nodes []*yaml.RNode) ([]*yaml.RNode, error) { + return kio.FilterAll(yaml.FilterFunc(f.run)).Filter(nodes) +} + +func (f Filter) run(node *yaml.RNode) (*yaml.RNode, error) { + err := node.PipeE(fieldspec.Filter{ + FieldSpec: f.FieldSpec, + SetValue: f.evaluateField, + CreateKind: yaml.ScalarNode, // Name is a ScalarNode + CreateTag: yaml.NodeTagString, + }) + return node, err +} + +func (f Filter) evaluateField(node *yaml.RNode) error { + return filtersutil.SetScalar(fmt.Sprintf( + "%s%s%s", f.Prefix, node.YNode().Value, f.Suffix))(node) +} diff --git a/vendor/sigs.k8s.io/kustomize/api/filters/refvar/doc.go b/vendor/sigs.k8s.io/kustomize/api/filters/refvar/doc.go new file mode 100644 index 000000000000..ab3a01d5454a --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/filters/refvar/doc.go @@ -0,0 +1,3 @@ +// Package refvar contains a kio.Filter implementation of the kustomize +// refvar transformer (find and replace $(FOO) style variables in strings). +package refvar diff --git a/vendor/sigs.k8s.io/kustomize/api/filters/refvar/expand.go b/vendor/sigs.k8s.io/kustomize/api/filters/refvar/expand.go new file mode 100644 index 000000000000..3bcbd7a53bd5 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/filters/refvar/expand.go @@ -0,0 +1,147 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package refvar + +import ( + "fmt" + "log" + "strings" +) + +const ( + operator = '$' + referenceOpener = '(' + referenceCloser = ')' +) + +// syntaxWrap returns the input string wrapped by the expansion syntax. +func syntaxWrap(input string) string { + var sb strings.Builder + sb.WriteByte(operator) + sb.WriteByte(referenceOpener) + sb.WriteString(input) + sb.WriteByte(referenceCloser) + return sb.String() +} + +// MappingFunc maps a string to anything. +type MappingFunc func(string) interface{} + +// MakePrimitiveReplacer returns a MappingFunc that uses a map to do +// replacements, and a histogram to count map hits. +// +// Func behavior: +// +// If the input key is NOT found in the map, the key is wrapped up as +// as a variable declaration string and returned, e.g. key FOO becomes $(FOO). +// This string is presumably put back where it was found, and might get replaced +// later. +// +// If the key is found in the map, the value is returned if it is a primitive +// type (string, bool, number), and the hit is counted. +// +// If it's not a primitive type (e.g. a map, struct, func, etc.) then this +// function doesn't know what to do with it and it returns the key wrapped up +// again as if it had not been replaced. This should probably be an error. +func MakePrimitiveReplacer( + counts map[string]int, someMap map[string]interface{}) MappingFunc { + return func(key string) interface{} { + if value, ok := someMap[key]; ok { + switch typedV := value.(type) { + case string, int, int32, int64, float32, float64, bool: + counts[key]++ + return typedV + default: + // If the value is some complicated type (e.g. a map or struct), + // this function doesn't know how to jam it into a string, + // so just pretend it was a cache miss. + // Likely this should be an error instead of a silent failure, + // since the programmer passed an impossible value. + log.Printf( + "MakePrimitiveReplacer: bad replacement type=%T val=%v", + typedV, typedV) + return syntaxWrap(key) + } + } + // If unable to return the mapped variable, return it + // as it was found, and a later mapping might be able to + // replace it. + return syntaxWrap(key) + } +} + +// DoReplacements replaces variable references in the input string +// using the mapping function. +func DoReplacements(input string, mapping MappingFunc) interface{} { + var buf strings.Builder + checkpoint := 0 + for cursor := 0; cursor < len(input); cursor++ { + if input[cursor] == operator && cursor+1 < len(input) { + // Copy the portion of the input string since the last + // checkpoint into the buffer + buf.WriteString(input[checkpoint:cursor]) + + // Attempt to read the variable name as defined by the + // syntax from the input string + read, isVar, advance := tryReadVariableName(input[cursor+1:]) + + if isVar { + // We were able to read a variable name correctly; + // apply the mapping to the variable name and copy the + // bytes into the buffer + mapped := mapping(read) + if input == syntaxWrap(read) { + // Preserve the type of variable + return mapped + } + + // Variable is used in a middle of a string + buf.WriteString(fmt.Sprintf("%v", mapped)) + } else { + // Not a variable name; copy the read bytes into the buffer + buf.WriteString(read) + } + + // Advance the cursor in the input string to account for + // bytes consumed to read the variable name expression + cursor += advance + + // Advance the checkpoint in the input string + checkpoint = cursor + 1 + } + } + + // Return the buffer and any remaining unwritten bytes in the + // input string. + return buf.String() + input[checkpoint:] +} + +// tryReadVariableName attempts to read a variable name from the input +// string and returns the content read from the input, whether that content +// represents a variable name to perform mapping on, and the number of bytes +// consumed in the input string. +// +// The input string is assumed not to contain the initial operator. +func tryReadVariableName(input string) (string, bool, int) { + switch input[0] { + case operator: + // Escaped operator; return it. + return input[0:1], false, 1 + case referenceOpener: + // Scan to expression closer + for i := 1; i < len(input); i++ { + if input[i] == referenceCloser { + return input[1:i], true, i + 1 + } + } + + // Incomplete reference; return it. + return string(operator) + string(referenceOpener), false, 1 + default: + // Not the beginning of an expression, ie, an operator + // that doesn't begin an expression. Return the operator + // and the first rune in the string. + return string(operator) + string(input[0]), false, 1 + } +} diff --git a/vendor/sigs.k8s.io/kustomize/api/filters/refvar/refvar.go b/vendor/sigs.k8s.io/kustomize/api/filters/refvar/refvar.go new file mode 100644 index 000000000000..016c574ec7a3 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/filters/refvar/refvar.go @@ -0,0 +1,110 @@ +package refvar + +import ( + "fmt" + "strconv" + + "sigs.k8s.io/kustomize/api/filters/fieldspec" + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/kio" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +// Filter updates $(VAR) style variables with values. +// The fieldSpecs are the places to look for occurrences of $(VAR). +type Filter struct { + MappingFunc MappingFunc `json:"mappingFunc,omitempty" yaml:"mappingFunc,omitempty"` + FieldSpec types.FieldSpec `json:"fieldSpec,omitempty" yaml:"fieldSpec,omitempty"` +} + +func (f Filter) Filter(nodes []*yaml.RNode) ([]*yaml.RNode, error) { + return kio.FilterAll(yaml.FilterFunc(f.run)).Filter(nodes) +} + +func (f Filter) run(node *yaml.RNode) (*yaml.RNode, error) { + err := node.PipeE(fieldspec.Filter{ + FieldSpec: f.FieldSpec, + SetValue: f.set, + }) + return node, err +} + +func (f Filter) set(node *yaml.RNode) error { + if yaml.IsMissingOrNull(node) { + return nil + } + switch node.YNode().Kind { + case yaml.ScalarNode: + return f.setScalar(node) + case yaml.MappingNode: + return f.setMap(node) + case yaml.SequenceNode: + return f.setSeq(node) + default: + return fmt.Errorf("invalid type encountered %v", node.YNode().Kind) + } +} + +func updateNodeValue(node *yaml.Node, newValue interface{}) { + switch newValue := newValue.(type) { + case int: + node.Value = strconv.FormatInt(int64(newValue), 10) + node.Tag = yaml.NodeTagInt + case int32: + node.Value = strconv.FormatInt(int64(newValue), 10) + node.Tag = yaml.NodeTagInt + case int64: + node.Value = strconv.FormatInt(newValue, 10) + node.Tag = yaml.NodeTagInt + case bool: + node.SetString(strconv.FormatBool(newValue)) + node.Tag = yaml.NodeTagBool + case float32: + node.SetString(strconv.FormatFloat(float64(newValue), 'f', -1, 32)) + node.Tag = yaml.NodeTagFloat + case float64: + node.SetString(strconv.FormatFloat(newValue, 'f', -1, 64)) + node.Tag = yaml.NodeTagFloat + default: + node.SetString(newValue.(string)) + node.Tag = yaml.NodeTagString + } + node.Style = 0 +} + +func (f Filter) setScalar(node *yaml.RNode) error { + if !yaml.IsYNodeString(node.YNode()) { + return nil + } + v := DoReplacements(node.YNode().Value, f.MappingFunc) + updateNodeValue(node.YNode(), v) + return nil +} + +func (f Filter) setMap(node *yaml.RNode) error { + contents := node.YNode().Content + for i := 0; i < len(contents); i += 2 { + if !yaml.IsYNodeString(contents[i]) { + return fmt.Errorf( + "invalid map key: value='%s', tag='%s'", + contents[i].Value, contents[i].Tag) + } + if !yaml.IsYNodeString(contents[i+1]) { + continue + } + newValue := DoReplacements(contents[i+1].Value, f.MappingFunc) + updateNodeValue(contents[i+1], newValue) + } + return nil +} + +func (f Filter) setSeq(node *yaml.RNode) error { + for _, item := range node.YNode().Content { + if !yaml.IsYNodeString(item) { + return fmt.Errorf("invalid value type expect a string") + } + newValue := DoReplacements(item.Value, f.MappingFunc) + updateNodeValue(item, newValue) + } + return nil +} diff --git a/vendor/sigs.k8s.io/kustomize/api/filters/replicacount/doc.go b/vendor/sigs.k8s.io/kustomize/api/filters/replicacount/doc.go new file mode 100644 index 000000000000..a22d13034b91 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/filters/replicacount/doc.go @@ -0,0 +1,6 @@ +// Copyright 2020 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +// Package replicacount contains a kio.Filter implementation of the kustomize +// ReplicaCountTransformer. +package replicacount diff --git a/vendor/sigs.k8s.io/kustomize/api/filters/replicacount/replicacount.go b/vendor/sigs.k8s.io/kustomize/api/filters/replicacount/replicacount.go new file mode 100644 index 000000000000..8a503966a147 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/filters/replicacount/replicacount.go @@ -0,0 +1,37 @@ +package replicacount + +import ( + "strconv" + + "sigs.k8s.io/kustomize/api/filters/fieldspec" + "sigs.k8s.io/kustomize/api/filters/filtersutil" + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/kio" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +// Filter updates/sets replicas fields using the fieldSpecs +type Filter struct { + Replica types.Replica `json:"replica,omitempty" yaml:"replica,omitempty"` + FieldSpec types.FieldSpec `json:"fieldSpec,omitempty" yaml:"fieldSpec,omitempty"` +} + +var _ kio.Filter = Filter{} + +func (rc Filter) Filter(nodes []*yaml.RNode) ([]*yaml.RNode, error) { + return kio.FilterAll(yaml.FilterFunc(rc.run)).Filter(nodes) +} + +func (rc Filter) run(node *yaml.RNode) (*yaml.RNode, error) { + err := node.PipeE(fieldspec.Filter{ + FieldSpec: rc.FieldSpec, + SetValue: rc.set, + CreateKind: yaml.ScalarNode, // replicas is a ScalarNode + CreateTag: yaml.NodeTagInt, + }) + return node, err +} + +func (rc Filter) set(node *yaml.RNode) error { + return filtersutil.SetScalar(strconv.FormatInt(rc.Replica.Count, 10))(node) +} diff --git a/vendor/sigs.k8s.io/kustomize/api/filters/valueadd/valueadd.go b/vendor/sigs.k8s.io/kustomize/api/filters/valueadd/valueadd.go new file mode 100644 index 000000000000..326466a45dd2 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/filters/valueadd/valueadd.go @@ -0,0 +1,134 @@ +// Copyright 2020 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package valueadd + +import ( + "strings" + + "sigs.k8s.io/kustomize/api/filesys" + "sigs.k8s.io/kustomize/kyaml/kio" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +// An 'Add' operation aspiring to IETF RFC 6902 JSON. +// +// The filter tries to add a value to a node at a particular field path. +// +// Kinds of target fields: +// +// - Non-existent target field. +// +// The field will be added and the value inserted. +// +// - Existing field, scalar or map. +// +// E.g. 'spec/template/spec/containers/[name:nginx]/image' +// +// This behaves like an IETF RFC 6902 Replace operation would; +// the existing value is replaced without complaint, even though +// this is an Add operation. In contrast, a Replace operation +// must fail (report an error) if the field doesn't exist. +// +// - Existing field, list (array) +// Not supported yet. +// TODO: Honor fields with RFC-6902-style array indices +// TODO: like 'spec/template/spec/containers/2' +// TODO: Modify kyaml/yaml/PathGetter to allow this. +// The value will be inserted into the array at the given position, +// shifting other contents. To instead replace an array entry, use +// an implementation of an IETF RFC 6902 Replace operation. +// +// For the common case of a filepath in the field value, and a desire +// to add the value to the filepath (rather than replace the filepath), +// use a non-zero value of FilePathPosition (see below). +type Filter struct { + // Value is the value to add. + // + // Empty values are disallowed, i.e. this filter isn't intended + // for use in erasing or removing fields. For that, use a filter + // more aligned with the IETF RFC 6902 JSON Remove operation. + // + // At the time of writing, Value's value should be a simple string, + // not a JSON document. This particular filter focuses on easing + // injection of a single-sourced cloud project and/or cluster name + // into various fields, especially namespace and various filepath + // specifications. + Value string + + // FieldPath is a JSON-style path to the field intended to hold the value. + FieldPath string + + // FilePathPosition is a filepath field index. + // + // Call the value of this field _i_. + // + // If _i_ is zero, negative or unspecified, this field has no effect. + // + // If _i_ is > 0, then it's assumed that + // - 'Value' is a string that can work as a directory or file name, + // - the field value intended for replacement holds a filepath. + // + // The filepath is split into a string slice, the value is inserted + // at position [i-1], shifting the rest of the path to the right. + // A value of i==1 puts the new value at the start of the path. + // This change never converts an absolute path to a relative path, + // meaning adding a new field at position i==1 will preserve a + // leading slash. E.g. if Value == 'PEACH' + // + // OLD : NEW : FilePathPosition + // -------------------------------------------------------- + // {empty} : PEACH : irrelevant + // / : /PEACH : irrelevant + // pie : PEACH/pie : 1 (or less to prefix) + // /pie : /PEACH/pie : 1 (or less to prefix) + // raw : raw/PEACH : 2 (or more to postfix) + // /raw : /raw/PEACH : 2 (or more to postfix) + // a/nice/warm/pie : a/nice/warm/PEACH/pie : 4 + // /a/nice/warm/pie : /a/nice/warm/PEACH/pie : 4 + // + // For robustness (liberal input, conservative output) FilePathPosition + // values that that are too large to index the split filepath result in a + // postfix rather than an error. So use 1 to prefix, 9999 to postfix. + FilePathPosition int `json:"filePathPosition,omitempty" yaml:"filePathPosition,omitempty"` +} + +var _ kio.Filter = Filter{} + +func (f Filter) Filter(nodes []*yaml.RNode) ([]*yaml.RNode, error) { + _, err := kio.FilterAll(yaml.FilterFunc( + func(node *yaml.RNode) (*yaml.RNode, error) { + var fields []string + // if there is forward slash '/' in the field name, a back slash '\' + // will be used to escape it. + for _, f := range strings.Split(f.FieldPath, "/") { + if len(fields) > 0 && strings.HasSuffix(fields[len(fields)-1], "\\") { + concatField := strings.TrimSuffix(fields[len(fields)-1], "\\") + "/" + f + fields = append(fields[:len(fields)-1], concatField) + } else { + fields = append(fields, f) + } + } + // TODO: support SequenceNode. + // Presumably here one could look for array indices (digits) at + // the end of the field path (as described in IETF RFC 6902 JSON), + // and if found, take it as a signal that this should be a + // SequenceNode instead of a ScalarNode, and insert the value + // into the proper slot, shifting every over. + n, err := node.Pipe(yaml.LookupCreate(yaml.ScalarNode, fields...)) + if err != nil { + return node, err + } + // TODO: allow more kinds + if err := yaml.ErrorIfInvalid(n, yaml.ScalarNode); err != nil { + return nil, err + } + newValue := f.Value + if f.FilePathPosition > 0 { + newValue = filesys.InsertPathPart( + n.YNode().Value, f.FilePathPosition-1, newValue) + } + return n.Pipe(yaml.FieldSetter{StringValue: newValue}) + })).Filter(nodes) + return nodes, err +} diff --git a/vendor/sigs.k8s.io/kustomize/api/hasher/hasher.go b/vendor/sigs.k8s.io/kustomize/api/hasher/hasher.go new file mode 100644 index 000000000000..36d930af69d3 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/hasher/hasher.go @@ -0,0 +1,156 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package hasher + +import ( + "crypto/sha256" + "encoding/json" + "fmt" + "sort" + + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +// SortArrayAndComputeHash sorts a string array and +// returns a hash for it +func SortArrayAndComputeHash(s []string) (string, error) { + sort.Strings(s) + data, err := json.Marshal(s) + if err != nil { + return "", err + } + return Encode(Hash(string(data))) +} + +// Copied from https://github.com/kubernetes/kubernetes +// /blob/master/pkg/kubectl/util/hash/hash.go +func Encode(hex string) (string, error) { + if len(hex) < 10 { + return "", fmt.Errorf( + "input length must be at least 10") + } + enc := []rune(hex[:10]) + for i := range enc { + switch enc[i] { + case '0': + enc[i] = 'g' + case '1': + enc[i] = 'h' + case '3': + enc[i] = 'k' + case 'a': + enc[i] = 'm' + case 'e': + enc[i] = 't' + } + } + return string(enc), nil +} + +// Hash returns the hex form of the sha256 of the argument. +func Hash(data string) string { + return fmt.Sprintf("%x", sha256.Sum256([]byte(data))) +} + +// HashRNode returns the hash value of input RNode +func HashRNode(node *yaml.RNode) (string, error) { + // get node kind + kindNode, err := node.Pipe(yaml.FieldMatcher{Name: "kind"}) + if err != nil { + return "", err + } + kind := kindNode.YNode().Value + + // calculate hash for different kinds + encoded := "" + switch kind { + case "ConfigMap": + encoded, err = encodeConfigMap(node) + case "Secret": + encoded, err = encodeSecret(node) + default: + var encodedBytes []byte + encodedBytes, err = json.Marshal(node.YNode()) + encoded = string(encodedBytes) + } + if err != nil { + return "", err + } + return Encode(Hash(encoded)) +} + +func getNodeValues(node *yaml.RNode, paths []string) (map[string]interface{}, error) { + values := make(map[string]interface{}) + for _, p := range paths { + vn, err := node.Pipe(yaml.Lookup(p)) + if err != nil { + return map[string]interface{}{}, err + } + if vn == nil { + values[p] = "" + continue + } + if vn.YNode().Kind != yaml.ScalarNode { + vs, err := vn.MarshalJSON() + if err != nil { + return map[string]interface{}{}, err + } + // data, binaryData and stringData are all maps + var v map[string]interface{} + json.Unmarshal(vs, &v) + values[p] = v + } else { + values[p] = vn.YNode().Value + } + } + return values, nil +} + +// encodeConfigMap encodes a ConfigMap. +// Data, Kind, and Name are taken into account. +// BinaryData is included if it's not empty to avoid useless key in output. +func encodeConfigMap(node *yaml.RNode) (string, error) { + // get fields + paths := []string{"metadata/name", "data", "binaryData"} + values, err := getNodeValues(node, paths) + if err != nil { + return "", err + } + m := map[string]interface{}{"kind": "ConfigMap", "name": values["metadata/name"], + "data": values["data"]} + if _, ok := values["binaryData"].(map[string]interface{}); ok { + m["binaryData"] = values["binaryData"] + } + + // json.Marshal sorts the keys in a stable order in the encoding + data, err := json.Marshal(m) + if err != nil { + return "", err + } + return string(data), nil +} + +// encodeSecret encodes a Secret. +// Data, Kind, Name, and Type are taken into account. +// StringData is included if it's not empty to avoid useless key in output. +func encodeSecret(node *yaml.RNode) (string, error) { + // get fields + paths := []string{"type", "metadata/name", "data", "stringData"} + values, err := getNodeValues(node, paths) + if err != nil { + return "", err + } + m := map[string]interface{}{"kind": "Secret", "type": values["type"], + "name": values["metadata/name"], "data": values["data"]} + if _, ok := values["stringData"].(map[string]interface{}); ok { + m["stringData"] = values["stringData"] + } + + // json.Marshal sorts the keys in a stable order in the encoding + data, err := json.Marshal(m) + if err != nil { + return "", err + } + return string(data), nil +} diff --git a/vendor/sigs.k8s.io/kustomize/api/ifc/ifc.go b/vendor/sigs.k8s.io/kustomize/api/ifc/ifc.go new file mode 100644 index 000000000000..ee1ce0338beb --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/ifc/ifc.go @@ -0,0 +1,130 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +// Package ifc holds miscellaneous interfaces used by kustomize. +package ifc + +import ( + "sigs.k8s.io/kustomize/api/resid" + "sigs.k8s.io/kustomize/api/types" +) + +// Validator provides functions to validate annotations and labels +type Validator interface { + MakeAnnotationValidator() func(map[string]string) error + MakeAnnotationNameValidator() func([]string) error + MakeLabelValidator() func(map[string]string) error + MakeLabelNameValidator() func([]string) error + ValidateNamespace(string) []string + ErrIfInvalidKey(string) error + IsEnvVarName(k string) error +} + +// KvLoader reads and validates KV pairs. +type KvLoader interface { + Validator() Validator + Load(args types.KvPairSources) (all []types.Pair, err error) +} + +// Loader interface exposes methods to read bytes. +type Loader interface { + // Root returns the root location for this Loader. + Root() string + // New returns Loader located at newRoot. + New(newRoot string) (Loader, error) + // Load returns the bytes read from the location or an error. + Load(location string) ([]byte, error) + // Cleanup cleans the loader + Cleanup() error +} + +// Kunstructured represents a Kubernetes Resource Model object. +type Kunstructured interface { + // Several uses. + Copy() Kunstructured + + // GetAnnotations returns the k8s annotations. + GetAnnotations() map[string]string + + // GetData returns a top-level "data" field, as in a ConfigMap. + GetDataMap() map[string]string + + // GetData returns a top-level "binaryData" field, as in a ConfigMap. + GetBinaryDataMap() map[string]string + + // Used by ResAccumulator and ReplacementTransformer. + GetFieldValue(string) (interface{}, error) + + // Used by Resource.OrgId + GetGvk() resid.Gvk + + // Used by resource.Factory.SliceFromBytes + GetKind() string + + // GetLabels returns the k8s labels. + GetLabels() map[string]string + + // Used by Resource.CurId and resource factory. + GetName() string + + // Used by special case code in + // ResMap.SubsetThatCouldBeReferencedByResource + GetSlice(path string) ([]interface{}, error) + + // GetString returns the value of a string field. + // Used by Resource.GetNamespace + GetString(string) (string, error) + + // Several uses. + Map() (map[string]interface{}, error) + + // Used by Resource.AsYAML and Resource.String + MarshalJSON() ([]byte, error) + + // Used by resWrangler.Select + MatchesAnnotationSelector(selector string) (bool, error) + + // Used by resWrangler.Select + MatchesLabelSelector(selector string) (bool, error) + + // SetAnnotations replaces the k8s annotations. + SetAnnotations(map[string]string) + + // SetDataMap sets a top-level "data" field, as in a ConfigMap. + SetDataMap(map[string]string) + + // SetDataMap sets a top-level "binaryData" field, as in a ConfigMap. + SetBinaryDataMap(map[string]string) + // Used by PatchStrategicMergeTransformer. + SetGvk(resid.Gvk) + + // SetLabels replaces the k8s labels. + SetLabels(map[string]string) + + // SetName changes the name. + SetName(string) + + // SetNamespace changes the namespace. + SetNamespace(string) + + // Needed, for now, by kyaml/filtersutil.ApplyToJSON. + UnmarshalJSON([]byte) error +} + +// KunstructuredFactory makes instances of Kunstructured. +type KunstructuredFactory interface { + SliceFromBytes([]byte) ([]Kunstructured, error) + FromMap(m map[string]interface{}) Kunstructured + Hasher() KunstructuredHasher + MakeConfigMap(kvLdr KvLoader, args *types.ConfigMapArgs) (Kunstructured, error) + MakeSecret(kvLdr KvLoader, args *types.SecretArgs) (Kunstructured, error) +} + +// KunstructuredHasher returns a hash of the argument +// or an error. +type KunstructuredHasher interface { + Hash(Kunstructured) (string, error) +} + +// See core.v1.SecretTypeOpaque +const SecretTypeOpaque = "Opaque" diff --git a/vendor/sigs.k8s.io/kustomize/api/image/image.go b/vendor/sigs.k8s.io/kustomize/api/image/image.go new file mode 100644 index 000000000000..059999062d0b --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/image/image.go @@ -0,0 +1,50 @@ +// Copyright 2020 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package image + +import ( + "regexp" + "strings" +) + +// IsImageMatched returns true if the value of t is identical to the +// image name in the full image name and tag as given by s. +func IsImageMatched(s, t string) bool { + // Tag values are limited to [a-zA-Z0-9_.{}-]. + // Some tools like Bazel rules_k8s allow tag patterns with {} characters. + // More info: https://github.com/bazelbuild/rules_k8s/pull/423 + pattern, _ := regexp.Compile("^" + t + "(@sha256)?(:[a-zA-Z0-9_.{}-]*)?$") + return pattern.MatchString(s) +} + +// Split separates and returns the name and tag parts +// from the image string using either colon `:` or at `@` separators. +// Note that the returned tag keeps its separator. +func Split(imageName string) (name string, tag string) { + // check if image name contains a domain + // if domain is present, ignore domain and check for `:` + ic := -1 + if slashIndex := strings.Index(imageName, "/"); slashIndex < 0 { + ic = strings.LastIndex(imageName, ":") + } else { + lastIc := strings.LastIndex(imageName[slashIndex:], ":") + // set ic only if `:` is present + if lastIc > 0 { + ic = slashIndex + lastIc + } + } + ia := strings.LastIndex(imageName, "@") + if ic < 0 && ia < 0 { + return imageName, "" + } + + i := ic + if ia > 0 { + i = ia + } + + name = imageName[:i] + tag = imageName[i:] + return +} diff --git a/vendor/sigs.k8s.io/kustomize/api/internal/accumulator/loadconfigfromcrds.go b/vendor/sigs.k8s.io/kustomize/api/internal/accumulator/loadconfigfromcrds.go new file mode 100644 index 000000000000..a43f66d8fa71 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/internal/accumulator/loadconfigfromcrds.go @@ -0,0 +1,195 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package accumulator + +import ( + "encoding/json" + "strings" + + "github.com/go-openapi/spec" + "github.com/pkg/errors" + "sigs.k8s.io/kustomize/api/filesys" + "sigs.k8s.io/kustomize/api/ifc" + "sigs.k8s.io/kustomize/api/internal/plugins/builtinconfig" + "sigs.k8s.io/kustomize/api/resid" + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/yaml" +) + +// OpenAPIDefinition describes single type. +// Normally these definitions are auto-generated using gen-openapi. +// Same as in k8s.io / kube-openapi / pkg / common. +type OpenAPIDefinition struct { + Schema spec.Schema + Dependencies []string +} + +type myProperties map[string]spec.Schema +type nameToApiMap map[string]OpenAPIDefinition + +// LoadConfigFromCRDs parse CRD schemas from paths into a TransformerConfig +func LoadConfigFromCRDs( + ldr ifc.Loader, paths []string) (*builtinconfig.TransformerConfig, error) { + tc := builtinconfig.MakeEmptyConfig() + for _, path := range paths { + content, err := ldr.Load(path) + if err != nil { + return nil, err + } + m, err := makeNameToApiMap(content) + if err != nil { + return nil, errors.Wrapf(err, "unable to parse open API definition from '%s'", path) + } + otherTc, err := makeConfigFromApiMap(m) + if err != nil { + return nil, err + } + tc, err = tc.Merge(otherTc) + if err != nil { + return nil, err + } + } + return tc, nil +} + +func makeNameToApiMap(content []byte) (result nameToApiMap, err error) { + if content[0] == '{' { + err = json.Unmarshal(content, &result) + } else { + err = yaml.Unmarshal(content, &result) + } + return +} + +func makeConfigFromApiMap(m nameToApiMap) (*builtinconfig.TransformerConfig, error) { + result := builtinconfig.MakeEmptyConfig() + for name, api := range m { + if !looksLikeAk8sType(api.Schema.SchemaProps.Properties) { + continue + } + tc := builtinconfig.MakeEmptyConfig() + err := loadCrdIntoConfig( + tc, makeGvkFromTypeName(name), m, name, []string{}) + if err != nil { + return result, err + } + result, err = result.Merge(tc) + if err != nil { + return result, err + } + } + return result, nil +} + +// TODO: Get Group and Version for CRD from the +// openAPI definition once +// "x-kubernetes-group-version-kind" is available in CRD +func makeGvkFromTypeName(n string) resid.Gvk { + names := strings.Split(n, filesys.SelfDir) + kind := names[len(names)-1] + return resid.Gvk{Kind: kind} +} + +func looksLikeAk8sType(properties myProperties) bool { + _, ok := properties["kind"] + if !ok { + return false + } + _, ok = properties["apiVersion"] + if !ok { + return false + } + _, ok = properties["metadata"] + return ok +} + +const ( + // "x-kubernetes-annotation": "" + xAnnotation = "x-kubernetes-annotation" + + // "x-kubernetes-label-selector": "" + xLabelSelector = "x-kubernetes-label-selector" + + // "x-kubernetes-identity": "" + xIdentity = "x-kubernetes-identity" + + // "x-kubernetes-object-ref-api-version": + xVersion = "x-kubernetes-object-ref-api-version" + + // "x-kubernetes-object-ref-kind": + xKind = "x-kubernetes-object-ref-kind" + + // "x-kubernetes-object-ref-name-key": "name" + // default is "name" + xNameKey = "x-kubernetes-object-ref-name-key" +) + +// loadCrdIntoConfig loads a CRD spec into a TransformerConfig +func loadCrdIntoConfig( + theConfig *builtinconfig.TransformerConfig, theGvk resid.Gvk, theMap nameToApiMap, + typeName string, path []string) (err error) { + api, ok := theMap[typeName] + if !ok { + return nil + } + for propName, property := range api.Schema.SchemaProps.Properties { + _, annotate := property.Extensions.GetString(xAnnotation) + if annotate { + err = theConfig.AddAnnotationFieldSpec( + makeFs(theGvk, append(path, propName))) + if err != nil { + return + } + } + _, label := property.Extensions.GetString(xLabelSelector) + if label { + err = theConfig.AddLabelFieldSpec( + makeFs(theGvk, append(path, propName))) + if err != nil { + return + } + } + _, identity := property.Extensions.GetString(xIdentity) + if identity { + err = theConfig.AddPrefixFieldSpec( + makeFs(theGvk, append(path, propName))) + if err != nil { + return + } + } + version, ok := property.Extensions.GetString(xVersion) + if ok { + kind, ok := property.Extensions.GetString(xKind) + if ok { + nameKey, ok := property.Extensions.GetString(xNameKey) + if !ok { + nameKey = "name" + } + err = theConfig.AddNamereferenceFieldSpec( + builtinconfig.NameBackReferences{ + Gvk: resid.Gvk{Kind: kind, Version: version}, + Referrers: []types.FieldSpec{ + makeFs(theGvk, append(path, propName, nameKey))}, + }) + if err != nil { + return + } + } + } + if property.Ref.GetURL() != nil { + loadCrdIntoConfig( + theConfig, theGvk, theMap, + property.Ref.String(), append(path, propName)) + } + } + return nil +} + +func makeFs(in resid.Gvk, path []string) types.FieldSpec { + return types.FieldSpec{ + CreateIfNotPresent: false, + Gvk: in, + Path: strings.Join(path, "/"), + } +} diff --git a/vendor/sigs.k8s.io/kustomize/api/internal/accumulator/namereferencetransformer.go b/vendor/sigs.k8s.io/kustomize/api/internal/accumulator/namereferencetransformer.go new file mode 100644 index 000000000000..a94ebcdf0077 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/internal/accumulator/namereferencetransformer.go @@ -0,0 +1,154 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package accumulator + +import ( + "fmt" + "log" + + "sigs.k8s.io/kustomize/api/filters/nameref" + "sigs.k8s.io/kustomize/api/internal/plugins/builtinconfig" + "sigs.k8s.io/kustomize/api/resmap" + "sigs.k8s.io/kustomize/api/resource" +) + +type nameReferenceTransformer struct { + backRefs []builtinconfig.NameBackReferences +} + +const doDebug = false + +var _ resmap.Transformer = &nameReferenceTransformer{} + +type filterMap map[*resource.Resource][]nameref.Filter + +// newNameReferenceTransformer constructs a nameReferenceTransformer +// with a given slice of NameBackReferences. +func newNameReferenceTransformer( + br []builtinconfig.NameBackReferences) resmap.Transformer { + if br == nil { + log.Fatal("backrefs not expected to be nil") + } + return &nameReferenceTransformer{backRefs: br} +} + +// Transform updates name references in resource A that +// refer to resource B, given that B's name may have +// changed. +// +// For example, a HorizontalPodAutoscaler (HPA) +// necessarily refers to a Deployment, the thing that +// an HPA scales. In this case: +// +// - the HPA instance is the Referrer, +// - the Deployment instance is the ReferralTarget. +// +// If the Deployment's name changes, e.g. a prefix is added, +// then the HPA's reference to the Deployment must be fixed. +// +func (t *nameReferenceTransformer) Transform(m resmap.ResMap) error { + fMap := t.determineFilters(m.Resources()) + debug(fMap) + for r, fList := range fMap { + c := m.SubsetThatCouldBeReferencedByResource(r) + for _, f := range fList { + f.Referrer = r + f.ReferralCandidates = c + if err := f.Referrer.ApplyFilter(f); err != nil { + return err + } + } + } + return nil +} + +func debug(fMap filterMap) { + if !doDebug { + return + } + fmt.Printf("filterMap has %d entries:\n", len(fMap)) + rCount := 0 + for r, fList := range fMap { + yml, _ := r.AsYAML() + rCount++ + fmt.Printf(` +---- %3d. possible referrer ------------- +%s +---------`, rCount, string(yml), + ) + for i, f := range fList { + fmt.Printf(` +%3d/%3d update: %s + from: %s +`, rCount, i+1, f.NameFieldToUpdate.Path, f.ReferralTarget, + ) + } + } +} + +// Produce a map from referrer resources that might need to be fixed +// to filters that might fix them. The keys to this map are potential +// referrers, so won't include resources like ConfigMap or Secret. +// +// In the inner loop over the resources below, say we +// encounter an HPA instance. Then, in scanning the set +// of all known backrefs, we encounter an entry like +// +// - kind: Deployment +// fieldSpecs: +// - kind: HorizontalPodAutoscaler +// path: spec/scaleTargetRef/name +// +// This entry says that an HPA, via its +// 'spec/scaleTargetRef/name' field, may refer to a +// Deployment. +// +// This means that a filter will need to hunt for the right Deployment, +// obtain it's new name, and write that name into the HPA's +// 'spec/scaleTargetRef/name' field. Return a filter that can do that. +func (t *nameReferenceTransformer) determineFilters( + resources []*resource.Resource) (fMap filterMap) { + fMap = make(filterMap) + for _, backReference := range t.backRefs { + for _, referrerSpec := range backReference.Referrers { + for _, res := range resources { + if res.OrgId().IsSelected(&referrerSpec.Gvk) { + // If this is true, the res might be a referrer, and if + // so, the name reference it holds might need an update. + if resHasField(res, referrerSpec.Path) { + // Optimization - the referrer has the field + // that might need updating. + fMap[res] = append(fMap[res], nameref.Filter{ + // Name field to write in the Referrer. + // If the path specified here isn't found in + // the Referrer, nothing happens (no error, + // no field creation). + NameFieldToUpdate: referrerSpec, + // Specification of object class to read from. + // Always read from metadata/name field. + ReferralTarget: backReference.Gvk, + }) + } + } + } + } + } + return fMap +} + +// TODO: check res for field existence here to avoid extra work. +// res.GetFieldValue, which uses yaml.Lookup under the hood, doesn't know +// how to parse fieldspec-style paths that make no distinction +// between maps and sequences. This means it cannot lookup commonly +// used "indeterminate" paths like +// spec/containers/env/valueFrom/configMapKeyRef/name +// ('containers' is a list, not a map). +// However, the fieldspec filter does know how to handle this; +// extract that code and call it here? +func resHasField(res *resource.Resource, path string) bool { + return true + // fld := strings.Join(utils.PathSplitter(path), ".") + // _, e := res.GetFieldValue(fld) + // return e == nil +} diff --git a/vendor/sigs.k8s.io/kustomize/api/internal/accumulator/refvartransformer.go b/vendor/sigs.k8s.io/kustomize/api/internal/accumulator/refvartransformer.go new file mode 100644 index 000000000000..a02edc4fb363 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/internal/accumulator/refvartransformer.go @@ -0,0 +1,57 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package accumulator + +import ( + "sigs.k8s.io/kustomize/api/filters/refvar" + "sigs.k8s.io/kustomize/api/resmap" + "sigs.k8s.io/kustomize/api/types" +) + +type refVarTransformer struct { + varMap map[string]interface{} + replacementCounts map[string]int + fieldSpecs []types.FieldSpec +} + +// newRefVarTransformer returns a new refVarTransformer +// that replaces $(VAR) style variables with values. +// The fieldSpecs are the places to look for occurrences of $(VAR). +func newRefVarTransformer( + varMap map[string]interface{}, fs []types.FieldSpec) *refVarTransformer { + return &refVarTransformer{ + varMap: varMap, + fieldSpecs: fs, + } +} + +// UnusedVars returns slice of Var names that were unused +// after a Transform run. +func (rv *refVarTransformer) UnusedVars() []string { + var unused []string + for k := range rv.varMap { + if _, ok := rv.replacementCounts[k]; !ok { + unused = append(unused, k) + } + } + return unused +} + +// Transform replaces $(VAR) style variables with values. +func (rv *refVarTransformer) Transform(m resmap.ResMap) error { + rv.replacementCounts = make(map[string]int) + mf := refvar.MakePrimitiveReplacer(rv.replacementCounts, rv.varMap) + for _, res := range m.Resources() { + for _, fieldSpec := range rv.fieldSpecs { + err := res.ApplyFilter(refvar.Filter{ + MappingFunc: mf, + FieldSpec: fieldSpec, + }) + if err != nil { + return err + } + } + } + return nil +} diff --git a/vendor/sigs.k8s.io/kustomize/api/internal/accumulator/resaccumulator.go b/vendor/sigs.k8s.io/kustomize/api/internal/accumulator/resaccumulator.go new file mode 100644 index 000000000000..b49db9b12116 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/internal/accumulator/resaccumulator.go @@ -0,0 +1,169 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package accumulator + +import ( + "fmt" + "log" + "strings" + + "sigs.k8s.io/kustomize/api/internal/plugins/builtinconfig" + "sigs.k8s.io/kustomize/api/resid" + "sigs.k8s.io/kustomize/api/resmap" + "sigs.k8s.io/kustomize/api/types" +) + +// ResAccumulator accumulates resources and the rules +// used to customize those resources. It's a ResMap +// plus stuff needed to modify the ResMap. +type ResAccumulator struct { + resMap resmap.ResMap + tConfig *builtinconfig.TransformerConfig + varSet types.VarSet +} + +func MakeEmptyAccumulator() *ResAccumulator { + ra := &ResAccumulator{} + ra.resMap = resmap.New() + ra.tConfig = &builtinconfig.TransformerConfig{} + ra.varSet = types.NewVarSet() + return ra +} + +// ResMap returns a copy of the internal resMap. +func (ra *ResAccumulator) ResMap() resmap.ResMap { + return ra.resMap.ShallowCopy() +} + +// Vars returns a copy of underlying vars. +func (ra *ResAccumulator) Vars() []types.Var { + return ra.varSet.AsSlice() +} + +func (ra *ResAccumulator) AppendAll(resources resmap.ResMap) error { + return ra.resMap.AppendAll(resources) +} + +func (ra *ResAccumulator) AbsorbAll(resources resmap.ResMap) error { + return ra.resMap.AbsorbAll(resources) +} + +func (ra *ResAccumulator) MergeConfig( + tConfig *builtinconfig.TransformerConfig) (err error) { + ra.tConfig, err = ra.tConfig.Merge(tConfig) + return err +} + +func (ra *ResAccumulator) GetTransformerConfig() *builtinconfig.TransformerConfig { + return ra.tConfig +} + +// MergeVars accumulates vars into ResAccumulator. +// A Var is a tuple of name, object reference and field reference. +// This func takes a list of vars from the current kustomization file and +// annotates the accumulated resources with the names of the vars that match +// those resources. E.g. if there's a var named "sam" that wants to get +// its data from a ConfigMap named "james", and the resource list contains a +// ConfigMap named "james", then that ConfigMap will be annotated with the +// var name "sam". Later this annotation is used to find the data for "sam" +// by digging into a particular fieldpath of "james". +func (ra *ResAccumulator) MergeVars(incoming []types.Var) error { + for _, v := range incoming { + targetId := resid.NewResIdWithNamespace(v.ObjRef.GVK(), v.ObjRef.Name, v.ObjRef.Namespace) + idMatcher := targetId.GvknEquals + if targetId.Namespace != "" || !targetId.IsNamespaceableKind() { + // Preserve backward compatibility. An empty namespace means + // wildcard search on the namespace hence we still use GvknEquals + idMatcher = targetId.Equals + } + matched := ra.resMap.GetMatchingResourcesByAnyId(idMatcher) + if len(matched) > 1 { + return fmt.Errorf( + "found %d resId matches for var %s "+ + "(unable to disambiguate)", + len(matched), v) + } + if len(matched) == 1 { + matched[0].AppendRefVarName(v) + } + } + return ra.varSet.MergeSlice(incoming) +} + +func (ra *ResAccumulator) MergeAccumulator(other *ResAccumulator) (err error) { + err = ra.AppendAll(other.resMap) + if err != nil { + return err + } + err = ra.MergeConfig(other.tConfig) + if err != nil { + return err + } + return ra.varSet.MergeSet(other.varSet) +} + +func (ra *ResAccumulator) findVarValueFromResources(v types.Var) (interface{}, error) { + for _, res := range ra.resMap.Resources() { + for _, varName := range res.GetRefVarNames() { + if varName == v.Name { + s, err := res.GetFieldValue(v.FieldRef.FieldPath) + if err != nil { + return "", fmt.Errorf( + "field specified in var '%v' "+ + "not found in corresponding resource", v) + } + return s, nil + } + } + } + return "", fmt.Errorf( + "var '%v' cannot be mapped to a field "+ + "in the set of known resources", v) +} + +// makeVarReplacementMap returns a map of Var names to +// their final values. The values are strings intended +// for substitution wherever the $(var.Name) occurs. +func (ra *ResAccumulator) makeVarReplacementMap() (map[string]interface{}, error) { + result := map[string]interface{}{} + for _, v := range ra.Vars() { + s, err := ra.findVarValueFromResources(v) + if err != nil { + return nil, err + } + result[v.Name] = s + } + return result, nil +} + +func (ra *ResAccumulator) Transform(t resmap.Transformer) error { + return t.Transform(ra.resMap) +} + +func (ra *ResAccumulator) ResolveVars() error { + replacementMap, err := ra.makeVarReplacementMap() + if err != nil { + return err + } + if len(replacementMap) == 0 { + return nil + } + t := newRefVarTransformer( + replacementMap, ra.tConfig.VarReference) + err = ra.Transform(t) + if len(t.UnusedVars()) > 0 { + log.Printf( + "well-defined vars that were never replaced: %s\n", + strings.Join(t.UnusedVars(), ",")) + } + return err +} + +func (ra *ResAccumulator) FixBackReferences() (err error) { + if ra.tConfig.NameReference == nil { + return nil + } + return ra.Transform( + newNameReferenceTransformer(ra.tConfig.NameReference)) +} diff --git a/vendor/sigs.k8s.io/kustomize/api/internal/conflict/factory.go b/vendor/sigs.k8s.io/kustomize/api/internal/conflict/factory.go new file mode 100644 index 000000000000..3cfed193a1bf --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/internal/conflict/factory.go @@ -0,0 +1,23 @@ +// Copyright 2020 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package conflict + +import ( + "sigs.k8s.io/kustomize/api/resid" + "sigs.k8s.io/kustomize/api/resource" +) + +type cdFactory struct{} + +var _ resource.ConflictDetectorFactory = &cdFactory{} + +// NewFactory returns a new conflict detector factory. +func NewFactory() resource.ConflictDetectorFactory { + return &cdFactory{} +} + +// New returns an instance of smPatchMergeOnlyDetector. +func (c cdFactory) New(_ resid.Gvk) (resource.ConflictDetector, error) { + return &smPatchMergeOnlyDetector{}, nil +} diff --git a/vendor/sigs.k8s.io/kustomize/api/internal/conflict/smpatchmergeonlydetector.go b/vendor/sigs.k8s.io/kustomize/api/internal/conflict/smpatchmergeonlydetector.go new file mode 100644 index 000000000000..a33fdc3c38f7 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/internal/conflict/smpatchmergeonlydetector.go @@ -0,0 +1,33 @@ +// Copyright 2020 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package conflict + +import ( + "sigs.k8s.io/kustomize/api/resource" +) + +// smPatchMergeOnlyDetector ignores conflicts, +// but does real strategic merge patching. +// This is part of an effort to eliminate dependence on +// apimachinery package to allow kustomize integration +// into kubectl (#2506 and #1500) +type smPatchMergeOnlyDetector struct{} + +var _ resource.ConflictDetector = &smPatchMergeOnlyDetector{} + +func (c *smPatchMergeOnlyDetector) HasConflict( + _, _ *resource.Resource) (bool, error) { + return false, nil +} + +// There's at least one case that doesn't work. Suppose one has a +// Deployment with a volume with the bizarre "emptyDir: {}" entry. +// If you want to get rid of this entry via a patch containing +// the entry "emptyDir: null", then the following won't work, +// because null entries are eliminated. +func (c *smPatchMergeOnlyDetector) MergePatches( + r, patch *resource.Resource) (*resource.Resource, error) { + err := r.ApplySmPatch(patch) + return r, err +} diff --git a/vendor/sigs.k8s.io/kustomize/api/internal/generators/configmap.go b/vendor/sigs.k8s.io/kustomize/api/internal/generators/configmap.go new file mode 100644 index 000000000000..19a0e2832e3a --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/internal/generators/configmap.go @@ -0,0 +1,45 @@ +// Copyright 2020 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package generators + +import ( + "sigs.k8s.io/kustomize/api/ifc" + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +// MakeConfigMap makes a configmap. +// +// ConfigMap: https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.19/#configmap-v1-core +// +// ConfigMaps and Secrets are similar. +// +// Both objects have a `data` field, which contains a map from keys to +// values that must be UTF-8 valid strings. Such data might be simple text, +// or whoever made the data may have done so by performing a base64 encoding +// on binary data. Regardless, k8s has no means to know this, so it treats +// the data field as a string. +// +// The ConfigMap has an additional field `binaryData`, also a map, but its +// values are _intended_ to be interpreted as a base64 encoding of []byte, +// by whatever makes use of the ConfigMap. +// +// In a ConfigMap, any key used in `data` cannot also be used in `binaryData` +// and vice-versa. A key must be unique across both maps. +func MakeConfigMap( + ldr ifc.KvLoader, args *types.ConfigMapArgs) (rn *yaml.RNode, err error) { + rn, err = makeBaseNode("ConfigMap", args.Name, args.Namespace) + if err != nil { + return nil, err + } + m, err := makeValidatedDataMap(ldr, args.Name, args.KvPairSources) + if err != nil { + return nil, err + } + if err = rn.LoadMapIntoConfigMapData(m); err != nil { + return nil, err + } + copyLabelsAndAnnotations(rn, args.Options) + return rn, nil +} diff --git a/vendor/sigs.k8s.io/kustomize/api/internal/generators/secret.go b/vendor/sigs.k8s.io/kustomize/api/internal/generators/secret.go new file mode 100644 index 000000000000..a46f497db28d --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/internal/generators/secret.go @@ -0,0 +1,58 @@ +// Copyright 2020 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package generators + +import ( + "sigs.k8s.io/kustomize/api/ifc" + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +// MakeSecret makes a kubernetes Secret. +// +// Secret: https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.19/#secret-v1-core +// +// ConfigMaps and Secrets are similar. +// +// Like a ConfigMap, a Secret has a `data` field, but unlike a ConfigMap it has +// no `binaryData` field. +// +// All of a Secret's data is assumed to be opaque in nature, and assumed to be +// base64 encoded from its original representation, regardless of whether the +// original data was UTF-8 text or binary. +// +// This encoding provides no secrecy. It's just a neutral, common means to +// represent opaque text and binary data. Beneath the base64 encoding +// is presumably further encoding under control of the Secret's consumer. +// +// A Secret has string field `type` which holds an identifier, used by the +// client, to choose the algorithm to interpret the `data` field. Kubernetes +// cannot make use of this data; it's up to a controller or some pod's service +// to interpret the value, using `type` as a clue as to how to do this. +func MakeSecret( + ldr ifc.KvLoader, args *types.SecretArgs) (rn *yaml.RNode, err error) { + rn, err = makeBaseNode("Secret", args.Name, args.Namespace) + if err != nil { + return nil, err + } + t := "Opaque" + if args.Type != "" { + t = args.Type + } + if _, err := rn.Pipe( + yaml.FieldSetter{ + Name: "type", + Value: yaml.NewStringRNode(t)}); err != nil { + return nil, err + } + m, err := makeValidatedDataMap(ldr, args.Name, args.KvPairSources) + if err != nil { + return nil, err + } + if err = rn.LoadMapIntoSecretData(m); err != nil { + return nil, err + } + copyLabelsAndAnnotations(rn, args.Options) + return rn, nil +} diff --git a/vendor/sigs.k8s.io/kustomize/api/internal/generators/utils.go b/vendor/sigs.k8s.io/kustomize/api/internal/generators/utils.go new file mode 100644 index 000000000000..d1630fc847d4 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/internal/generators/utils.go @@ -0,0 +1,78 @@ +// Copyright 2020 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package generators + +import ( + "fmt" + + "github.com/go-errors/errors" + "sigs.k8s.io/kustomize/api/ifc" + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +func makeBaseNode(kind, name, namespace string) (*yaml.RNode, error) { + rn, err := yaml.Parse(fmt.Sprintf(` +apiVersion: v1 +kind: %s +`, kind)) + if err != nil { + return nil, err + } + if name == "" { + return nil, errors.Errorf("a configmap must have a name") + } + if _, err := rn.Pipe(yaml.SetK8sName(name)); err != nil { + return nil, err + } + if namespace != "" { + if _, err := rn.Pipe(yaml.SetK8sNamespace(namespace)); err != nil { + return nil, err + } + } + return rn, nil +} + +func makeValidatedDataMap( + ldr ifc.KvLoader, name string, sources types.KvPairSources) (map[string]string, error) { + pairs, err := ldr.Load(sources) + if err != nil { + return nil, errors.WrapPrefix(err, "loading KV pairs", 0) + } + knownKeys := make(map[string]string) + for _, p := range pairs { + // legal key: alphanumeric characters, '-', '_' or '.' + if err := ldr.Validator().ErrIfInvalidKey(p.Key); err != nil { + return nil, err + } + if _, ok := knownKeys[p.Key]; ok { + return nil, errors.Errorf( + "configmap %s illegally repeats the key `%s`", name, p.Key) + } + knownKeys[p.Key] = p.Value + } + return knownKeys, nil +} + +// copyLabelsAndAnnotations copies labels and annotations from +// GeneratorOptions into the given object. +func copyLabelsAndAnnotations( + rn *yaml.RNode, opts *types.GeneratorOptions) error { + if opts == nil { + return nil + } + for _, k := range yaml.SortedMapKeys(opts.Labels) { + v := opts.Labels[k] + if _, err := rn.Pipe(yaml.SetLabel(k, v)); err != nil { + return err + } + } + for _, k := range yaml.SortedMapKeys(opts.Annotations) { + v := opts.Annotations[k] + if _, err := rn.Pipe(yaml.SetAnnotation(k, v)); err != nil { + return err + } + } + return nil +} diff --git a/vendor/sigs.k8s.io/kustomize/api/internal/git/cloner.go b/vendor/sigs.k8s.io/kustomize/api/internal/git/cloner.go new file mode 100644 index 000000000000..e3daccd88aef --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/internal/git/cloner.go @@ -0,0 +1,51 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package git + +import ( + "sigs.k8s.io/kustomize/api/filesys" +) + +// Cloner is a function that can clone a git repo. +type Cloner func(repoSpec *RepoSpec) error + +// ClonerUsingGitExec uses a local git install, as opposed +// to say, some remote API, to obtain a local clone of +// a remote repo. +func ClonerUsingGitExec(repoSpec *RepoSpec) error { + r, err := newCmdRunner() + if err != nil { + return err + } + repoSpec.Dir = r.dir + if err = r.run("init"); err != nil { + return err + } + if err = r.run( + "remote", "add", "origin", repoSpec.CloneSpec()); err != nil { + return err + } + ref := "HEAD" + if repoSpec.Ref != "" { + ref = repoSpec.Ref + } + if err = r.run("fetch", "--depth=1", "origin", ref); err != nil { + return err + } + if err = r.run("checkout", "FETCH_HEAD"); err != nil { + return err + } + return r.run("submodule", "update", "--init", "--recursive") +} + +// DoNothingCloner returns a cloner that only sets +// cloneDir field in the repoSpec. It's assumed that +// the cloneDir is associated with some fake filesystem +// used in a test. +func DoNothingCloner(dir filesys.ConfirmedDir) Cloner { + return func(rs *RepoSpec) error { + rs.Dir = dir + return nil + } +} diff --git a/vendor/sigs.k8s.io/kustomize/api/internal/git/gitrunner.go b/vendor/sigs.k8s.io/kustomize/api/internal/git/gitrunner.go new file mode 100644 index 000000000000..94bb78c6005e --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/internal/git/gitrunner.go @@ -0,0 +1,58 @@ +// Copyright 2020 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package git + +import ( + "os/exec" + "time" + + "github.com/pkg/errors" + "sigs.k8s.io/kustomize/api/filesys" + "sigs.k8s.io/kustomize/api/internal/utils" +) + +// Arbitrary, but non-infinite, timeout for running commands. +const defaultDuration = 27 * time.Second + +// gitRunner runs the external git binary. +type gitRunner struct { + gitProgram string + duration time.Duration + dir filesys.ConfirmedDir +} + +// newCmdRunner returns a gitRunner if it can find the binary. +// It also creats a temp directory for cloning repos. +func newCmdRunner() (*gitRunner, error) { + gitProgram, err := exec.LookPath("git") + if err != nil { + return nil, errors.Wrap(err, "no 'git' program on path") + } + dir, err := filesys.NewTmpConfirmedDir() + if err != nil { + return nil, err + } + return &gitRunner{ + gitProgram: gitProgram, + duration: defaultDuration, + dir: dir, + }, nil +} + +// run a command with a timeout. +func (r gitRunner) run(args ...string) error { + //nolint: gosec + cmd := exec.Command(r.gitProgram, args...) + cmd.Dir = r.dir.String() + return utils.TimedCall( + cmd.String(), + r.duration, + func() error { + _, err := cmd.CombinedOutput() + if err != nil { + return errors.Wrapf(err, "git cmd = '%s'", cmd.String()) + } + return err + }) +} diff --git a/vendor/sigs.k8s.io/kustomize/api/internal/git/repospec.go b/vendor/sigs.k8s.io/kustomize/api/internal/git/repospec.go new file mode 100644 index 000000000000..ad8dfc24d72d --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/internal/git/repospec.go @@ -0,0 +1,219 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package git + +import ( + "fmt" + "path/filepath" + "regexp" + "strings" + + "sigs.k8s.io/kustomize/api/filesys" +) + +// Used as a temporary non-empty occupant of the cloneDir +// field, as something distinguishable from the empty string +// in various outputs (especially tests). Not using an +// actual directory name here, as that's a temporary directory +// with a unique name that isn't created until clone time. +const notCloned = filesys.ConfirmedDir("/notCloned") + +// RepoSpec specifies a git repository and a branch and path therein. +type RepoSpec struct { + // Raw, original spec, used to look for cycles. + // TODO(monopole): Drop raw, use processed fields instead. + raw string + + // Host, e.g. github.com + Host string + + // orgRepo name (organization/repoName), + // e.g. kubernetes-sigs/kustomize + OrgRepo string + + // Dir where the orgRepo is cloned to. + Dir filesys.ConfirmedDir + + // Relative path in the repository, and in the cloneDir, + // to a Kustomization. + Path string + + // Branch or tag reference. + Ref string + + // e.g. .git or empty in case of _git is present + GitSuffix string +} + +// CloneSpec returns a string suitable for "git clone {spec}". +func (x *RepoSpec) CloneSpec() string { + if isAzureHost(x.Host) || isAWSHost(x.Host) { + return x.Host + x.OrgRepo + } + return x.Host + x.OrgRepo + x.GitSuffix +} + +func (x *RepoSpec) CloneDir() filesys.ConfirmedDir { + return x.Dir +} + +func (x *RepoSpec) Raw() string { + return x.raw +} + +func (x *RepoSpec) AbsPath() string { + return x.Dir.Join(x.Path) +} + +func (x *RepoSpec) Cleaner(fSys filesys.FileSystem) func() error { + return func() error { return fSys.RemoveAll(x.Dir.String()) } +} + +// From strings like git@github.com:someOrg/someRepo.git or +// https://github.com/someOrg/someRepo?ref=someHash, extract +// the parts. +func NewRepoSpecFromUrl(n string) (*RepoSpec, error) { + if filepath.IsAbs(n) { + return nil, fmt.Errorf("uri looks like abs path: %s", n) + } + host, orgRepo, path, gitRef, gitSuffix := parseGitUrl(n) + if orgRepo == "" { + return nil, fmt.Errorf("url lacks orgRepo: %s", n) + } + if host == "" { + return nil, fmt.Errorf("url lacks host: %s", n) + } + return &RepoSpec{ + raw: n, Host: host, OrgRepo: orgRepo, + Dir: notCloned, Path: path, Ref: gitRef, GitSuffix: gitSuffix}, nil +} + +const ( + refQuery = "?ref=" + refQueryRegex = "\\?(version|ref)=" + gitSuffix = ".git" + gitDelimiter = "_git/" +) + +// From strings like git@github.com:someOrg/someRepo.git or +// https://github.com/someOrg/someRepo?ref=someHash, extract +// the parts. +func parseGitUrl(n string) ( + host string, orgRepo string, path string, gitRef string, gitSuff string) { + + if strings.Contains(n, gitDelimiter) { + index := strings.Index(n, gitDelimiter) + // Adding _git/ to host + host = normalizeGitHostSpec(n[:index+len(gitDelimiter)]) + orgRepo = strings.Split(strings.Split(n[index+len(gitDelimiter):], "/")[0], "?")[0] + path, gitRef = peelQuery(n[index+len(gitDelimiter)+len(orgRepo):]) + return + } + host, n = parseHostSpec(n) + gitSuff = gitSuffix + if strings.Contains(n, gitSuffix) { + index := strings.Index(n, gitSuffix) + orgRepo = n[0:index] + n = n[index+len(gitSuffix):] + path, gitRef = peelQuery(n) + return + } + + i := strings.Index(n, "/") + if i < 1 { + return "", "", "", "", "" + } + j := strings.Index(n[i+1:], "/") + if j >= 0 { + j += i + 1 + orgRepo = n[:j] + path, gitRef = peelQuery(n[j+1:]) + return + } + path = "" + orgRepo, gitRef = peelQuery(n) + return host, orgRepo, path, gitRef, gitSuff +} + +func peelQuery(arg string) (string, string) { + + r, _ := regexp.Compile(refQueryRegex) + j := r.FindStringIndex(arg) + + if len(j) > 0 { + return arg[:j[0]], arg[j[0]+len(r.FindString(arg)):] + } + return arg, "" +} + +func parseHostSpec(n string) (string, string) { + var host string + // Start accumulating the host part. + for _, p := range []string{ + // Order matters here. + "git::", "gh:", "ssh://", "https://", "http://", + "git@", "github.com:", "github.com/"} { + if len(p) < len(n) && strings.ToLower(n[:len(p)]) == p { + n = n[len(p):] + host += p + } + } + if host == "git@" { + i := strings.Index(n, "/") + if i > -1 { + host += n[:i+1] + n = n[i+1:] + } else { + i = strings.Index(n, ":") + if i > -1 { + host += n[:i+1] + n = n[i+1:] + } + } + return host, n + } + + // If host is a http(s) or ssh URL, grab the domain part. + for _, p := range []string{ + "ssh://", "https://", "http://"} { + if strings.HasSuffix(host, p) { + i := strings.Index(n, "/") + if i > -1 { + host = host + n[0:i+1] + n = n[i+1:] + } + break + } + } + + return normalizeGitHostSpec(host), n +} + +func normalizeGitHostSpec(host string) string { + s := strings.ToLower(host) + if strings.Contains(s, "github.com") { + if strings.Contains(s, "git@") || strings.Contains(s, "ssh:") { + host = "git@github.com:" + } else { + host = "https://github.com/" + } + } + if strings.HasPrefix(s, "git::") { + host = strings.TrimPrefix(s, "git::") + } + return host +} + +// The format of Azure repo URL is documented +// https://docs.microsoft.com/en-us/azure/devops/repos/git/clone?view=vsts&tabs=visual-studio#clone_url +func isAzureHost(host string) bool { + return strings.Contains(host, "dev.azure.com") || + strings.Contains(host, "visualstudio.com") +} + +// The format of AWS repo URL is documented +// https://docs.aws.amazon.com/codecommit/latest/userguide/regions.html +func isAWSHost(host string) bool { + return strings.Contains(host, "amazonaws.com") +} diff --git a/vendor/sigs.k8s.io/kustomize/api/internal/kusterr/yamlformaterror.go b/vendor/sigs.k8s.io/kustomize/api/internal/kusterr/yamlformaterror.go new file mode 100644 index 000000000000..950ffea8a4c1 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/internal/kusterr/yamlformaterror.go @@ -0,0 +1,35 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +// Package error has contextual error types. +package kusterr + +import ( + "fmt" + "strings" +) + +// YamlFormatError represents error with yaml file name where json/yaml format error happens. +type YamlFormatError struct { + Path string + ErrorMsg string +} + +func (e YamlFormatError) Error() string { + return fmt.Sprintf("YAML file [%s] encounters a format error.\n%s\n", e.Path, e.ErrorMsg) +} + +// Handler handles YamlFormatError +func Handler(e error, path string) error { + if isYAMLSyntaxError(e) { + return YamlFormatError{ + Path: path, + ErrorMsg: e.Error(), + } + } + return e +} + +func isYAMLSyntaxError(e error) bool { + return strings.Contains(e.Error(), "error converting YAML to JSON") || strings.Contains(e.Error(), "error unmarshaling JSON") +} diff --git a/vendor/sigs.k8s.io/kustomize/api/internal/plugins/builtinconfig/doc.go b/vendor/sigs.k8s.io/kustomize/api/internal/plugins/builtinconfig/doc.go new file mode 100644 index 000000000000..f41f79b0c12a --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/internal/plugins/builtinconfig/doc.go @@ -0,0 +1,10 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +// Package builtinconfig provides legacy methods for +// configuring builtin plugins from a common config file. +// As a user, its best to configure plugins individually +// with plugin config files specified in the `transformers:` +// or `generators:` field, than to use this legacy +// configuration technique. +package builtinconfig diff --git a/vendor/sigs.k8s.io/kustomize/api/internal/plugins/builtinconfig/loaddefaultconfig.go b/vendor/sigs.k8s.io/kustomize/api/internal/plugins/builtinconfig/loaddefaultconfig.go new file mode 100644 index 000000000000..bf5e3f8a3264 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/internal/plugins/builtinconfig/loaddefaultconfig.go @@ -0,0 +1,42 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package builtinconfig + +import ( + "sigs.k8s.io/kustomize/api/ifc" + "sigs.k8s.io/yaml" +) + +// loadDefaultConfig returns a TranformerConfig +// object from a list of files. +func loadDefaultConfig( + ldr ifc.Loader, paths []string) (*TransformerConfig, error) { + result := &TransformerConfig{} + for _, path := range paths { + data, err := ldr.Load(path) + if err != nil { + return nil, err + } + t, err := makeTransformerConfigFromBytes(data) + if err != nil { + return nil, err + } + result, err = result.Merge(t) + if err != nil { + return nil, err + } + } + return result, nil +} + +// makeTransformerConfigFromBytes returns a TransformerConfig object from bytes +func makeTransformerConfigFromBytes(data []byte) (*TransformerConfig, error) { + var t TransformerConfig + err := yaml.Unmarshal(data, &t) + if err != nil { + return nil, err + } + t.sortFields() + return &t, nil +} diff --git a/vendor/sigs.k8s.io/kustomize/api/internal/plugins/builtinconfig/namebackreferences.go b/vendor/sigs.k8s.io/kustomize/api/internal/plugins/builtinconfig/namebackreferences.go new file mode 100644 index 000000000000..e458786c4d9c --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/internal/plugins/builtinconfig/namebackreferences.go @@ -0,0 +1,99 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package builtinconfig + +import ( + "strings" + + "sigs.k8s.io/kustomize/api/resid" + "sigs.k8s.io/kustomize/api/types" +) + +// NameBackReferences is an association between a gvk.GVK (a ReferralTarget) +// and a list of Referrers that could refer to it. +// +// It is used to handle name changes, and can be thought of as a +// a contact list. If you change your own contact info (name, +// phone number, etc.), you must tell your contacts or they won't +// know about the change. +// +// For example, ConfigMaps can be used by Pods and everything that +// contains a Pod; Deployment, Job, StatefulSet, etc. +// The ConfigMap is the ReferralTarget, the others are Referrers. +// +// If the the name of a ConfigMap instance changed from 'alice' to 'bob', +// one must +// - visit all objects that could refer to the ConfigMap (the Referrers) +// - see if they mention 'alice', +// - if so, change the Referrer's name reference to 'bob'. +// +// The NameBackReferences instance to aid in this could look like +// { +// kind: ConfigMap +// version: v1 +// fieldSpecs: +// - kind: Pod +// version: v1 +// path: spec/volumes/configMap/name +// - kind: Deployment +// path: spec/template/spec/volumes/configMap/name +// - kind: Job +// path: spec/template/spec/volumes/configMap/name +// (etc.) +// } +type NameBackReferences struct { + resid.Gvk `json:",inline,omitempty" yaml:",inline,omitempty"` + // TODO: rename json 'fieldSpecs' to 'referrers' for clarity. + // This will, however, break anyone using a custom config. + Referrers types.FsSlice `json:"fieldSpecs,omitempty" yaml:"fieldSpecs,omitempty"` +} + +func (n NameBackReferences) String() string { + var r []string + for _, f := range n.Referrers { + r = append(r, f.String()) + } + return n.Gvk.String() + ": (\n" + + strings.Join(r, "\n") + "\n)" +} + +type nbrSlice []NameBackReferences + +func (s nbrSlice) Len() int { return len(s) } +func (s nbrSlice) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s nbrSlice) Less(i, j int) bool { + return s[i].Gvk.IsLessThan(s[j].Gvk) +} + +func (s nbrSlice) mergeAll(o nbrSlice) (result nbrSlice, err error) { + result = s + for _, r := range o { + result, err = result.mergeOne(r) + if err != nil { + return nil, err + } + } + return result, nil +} + +func (s nbrSlice) mergeOne(other NameBackReferences) (nbrSlice, error) { + var result nbrSlice + var err error + found := false + for _, c := range s { + if c.Gvk.Equals(other.Gvk) { + c.Referrers, err = c.Referrers.MergeAll(other.Referrers) + if err != nil { + return nil, err + } + found = true + } + result = append(result, c) + } + + if !found { + result = append(result, other) + } + return result, nil +} diff --git a/vendor/sigs.k8s.io/kustomize/api/internal/plugins/builtinconfig/transformerconfig.go b/vendor/sigs.k8s.io/kustomize/api/internal/plugins/builtinconfig/transformerconfig.go new file mode 100644 index 000000000000..a28627a13f36 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/internal/plugins/builtinconfig/transformerconfig.go @@ -0,0 +1,148 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package builtinconfig + +import ( + "log" + "sort" + + "sigs.k8s.io/kustomize/api/ifc" + "sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts" + "sigs.k8s.io/kustomize/api/types" +) + +// TransformerConfig holds the data needed to perform transformations. +type TransformerConfig struct { + NamePrefix types.FsSlice `json:"namePrefix,omitempty" yaml:"namePrefix,omitempty"` + NameSuffix types.FsSlice `json:"nameSuffix,omitempty" yaml:"nameSuffix,omitempty"` + NameSpace types.FsSlice `json:"namespace,omitempty" yaml:"namespace,omitempty"` + CommonLabels types.FsSlice `json:"commonLabels,omitempty" yaml:"commonLabels,omitempty"` + CommonAnnotations types.FsSlice `json:"commonAnnotations,omitempty" yaml:"commonAnnotations,omitempty"` + NameReference nbrSlice `json:"nameReference,omitempty" yaml:"nameReference,omitempty"` + VarReference types.FsSlice `json:"varReference,omitempty" yaml:"varReference,omitempty"` + Images types.FsSlice `json:"images,omitempty" yaml:"images,omitempty"` + Replicas types.FsSlice `json:"replicas,omitempty" yaml:"replicas,omitempty"` +} + +// MakeEmptyConfig returns an empty TransformerConfig object +func MakeEmptyConfig() *TransformerConfig { + return &TransformerConfig{} +} + +// MakeDefaultConfig returns a default TransformerConfig. +func MakeDefaultConfig() *TransformerConfig { + c, err := makeTransformerConfigFromBytes( + builtinpluginconsts.GetDefaultFieldSpecs()) + if err != nil { + log.Fatalf("Unable to make default transformconfig: %v", err) + } + return c +} + +// MakeTransformerConfig returns a merger of custom config, +// if any, with default config. +func MakeTransformerConfig( + ldr ifc.Loader, paths []string) (*TransformerConfig, error) { + t1 := MakeDefaultConfig() + if len(paths) == 0 { + return t1, nil + } + t2, err := loadDefaultConfig(ldr, paths) + if err != nil { + return nil, err + } + return t1.Merge(t2) +} + +// sortFields provides determinism in logging, tests, etc. +func (t *TransformerConfig) sortFields() { + sort.Sort(t.NamePrefix) + sort.Sort(t.NameSpace) + sort.Sort(t.CommonLabels) + sort.Sort(t.CommonAnnotations) + sort.Sort(t.NameReference) + sort.Sort(t.VarReference) + sort.Sort(t.Images) + sort.Sort(t.Replicas) +} + +// AddPrefixFieldSpec adds a FieldSpec to NamePrefix +func (t *TransformerConfig) AddPrefixFieldSpec(fs types.FieldSpec) (err error) { + t.NamePrefix, err = t.NamePrefix.MergeOne(fs) + return err +} + +// AddSuffixFieldSpec adds a FieldSpec to NameSuffix +func (t *TransformerConfig) AddSuffixFieldSpec(fs types.FieldSpec) (err error) { + t.NameSuffix, err = t.NameSuffix.MergeOne(fs) + return err +} + +// AddLabelFieldSpec adds a FieldSpec to CommonLabels +func (t *TransformerConfig) AddLabelFieldSpec(fs types.FieldSpec) (err error) { + t.CommonLabels, err = t.CommonLabels.MergeOne(fs) + return err +} + +// AddAnnotationFieldSpec adds a FieldSpec to CommonAnnotations +func (t *TransformerConfig) AddAnnotationFieldSpec(fs types.FieldSpec) (err error) { + t.CommonAnnotations, err = t.CommonAnnotations.MergeOne(fs) + return err +} + +// AddNamereferenceFieldSpec adds a NameBackReferences to NameReference +func (t *TransformerConfig) AddNamereferenceFieldSpec( + nbrs NameBackReferences) (err error) { + t.NameReference, err = t.NameReference.mergeOne(nbrs) + return err +} + +// Merge merges two TransformerConfigs objects into +// a new TransformerConfig object +func (t *TransformerConfig) Merge(input *TransformerConfig) ( + merged *TransformerConfig, err error) { + if input == nil { + return t, nil + } + merged = &TransformerConfig{} + merged.NamePrefix, err = t.NamePrefix.MergeAll(input.NamePrefix) + if err != nil { + return nil, err + } + merged.NameSuffix, err = t.NameSuffix.MergeAll(input.NameSuffix) + if err != nil { + return nil, err + } + merged.NameSpace, err = t.NameSpace.MergeAll(input.NameSpace) + if err != nil { + return nil, err + } + merged.CommonAnnotations, err = t.CommonAnnotations.MergeAll( + input.CommonAnnotations) + if err != nil { + return nil, err + } + merged.CommonLabels, err = t.CommonLabels.MergeAll(input.CommonLabels) + if err != nil { + return nil, err + } + merged.VarReference, err = t.VarReference.MergeAll(input.VarReference) + if err != nil { + return nil, err + } + merged.NameReference, err = t.NameReference.mergeAll(input.NameReference) + if err != nil { + return nil, err + } + merged.Images, err = t.Images.MergeAll(input.Images) + if err != nil { + return nil, err + } + merged.Replicas, err = t.Replicas.MergeAll(input.Replicas) + if err != nil { + return nil, err + } + merged.sortFields() + return merged, nil +} diff --git a/vendor/sigs.k8s.io/kustomize/api/internal/plugins/builtinhelpers/builtinplugintype_string.go b/vendor/sigs.k8s.io/kustomize/api/internal/plugins/builtinhelpers/builtinplugintype_string.go new file mode 100644 index 000000000000..7b775fadb438 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/internal/plugins/builtinhelpers/builtinplugintype_string.go @@ -0,0 +1,38 @@ +// Code generated by "stringer -type=BuiltinPluginType"; DO NOT EDIT. + +package builtinhelpers + +import "strconv" + +func _() { + // An "invalid array index" compiler error signifies that the constant values have changed. + // Re-run the stringer command to generate them again. + var x [1]struct{} + _ = x[Unknown-0] + _ = x[AnnotationsTransformer-1] + _ = x[ConfigMapGenerator-2] + _ = x[HashTransformer-3] + _ = x[ImageTagTransformer-4] + _ = x[LabelTransformer-5] + _ = x[LegacyOrderTransformer-6] + _ = x[NamespaceTransformer-7] + _ = x[PatchJson6902Transformer-8] + _ = x[PatchStrategicMergeTransformer-9] + _ = x[PatchTransformer-10] + _ = x[PrefixSuffixTransformer-11] + _ = x[ReplicaCountTransformer-12] + _ = x[SecretGenerator-13] + _ = x[ValueAddTransformer-14] + _ = x[HelmChartInflationGenerator-15] +} + +const _BuiltinPluginType_name = "UnknownAnnotationsTransformerConfigMapGeneratorHashTransformerImageTagTransformerLabelTransformerLegacyOrderTransformerNamespaceTransformerPatchJson6902TransformerPatchStrategicMergeTransformerPatchTransformerPrefixSuffixTransformerReplicaCountTransformerSecretGeneratorValueAddTransformerHelmChartInflationGenerator" + +var _BuiltinPluginType_index = [...]uint16{0, 7, 29, 47, 62, 81, 97, 119, 139, 163, 193, 209, 232, 255, 270, 289, 316} + +func (i BuiltinPluginType) String() string { + if i < 0 || i >= BuiltinPluginType(len(_BuiltinPluginType_index)-1) { + return "BuiltinPluginType(" + strconv.FormatInt(int64(i), 10) + ")" + } + return _BuiltinPluginType_name[_BuiltinPluginType_index[i]:_BuiltinPluginType_index[i+1]] +} diff --git a/vendor/sigs.k8s.io/kustomize/api/internal/plugins/builtinhelpers/builtins.go b/vendor/sigs.k8s.io/kustomize/api/internal/plugins/builtinhelpers/builtins.go new file mode 100644 index 000000000000..f53583981c72 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/internal/plugins/builtinhelpers/builtins.go @@ -0,0 +1,77 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package builtinhelpers + +import ( + "sigs.k8s.io/kustomize/api/builtins" + "sigs.k8s.io/kustomize/api/resmap" +) + +//go:generate stringer -type=BuiltinPluginType +type BuiltinPluginType int + +const ( + Unknown BuiltinPluginType = iota + AnnotationsTransformer + ConfigMapGenerator + HashTransformer + ImageTagTransformer + LabelTransformer + LegacyOrderTransformer + NamespaceTransformer + PatchJson6902Transformer + PatchStrategicMergeTransformer + PatchTransformer + PrefixSuffixTransformer + ReplicaCountTransformer + SecretGenerator + ValueAddTransformer + HelmChartInflationGenerator +) + +var stringToBuiltinPluginTypeMap map[string]BuiltinPluginType + +func init() { + stringToBuiltinPluginTypeMap = makeStringToBuiltinPluginTypeMap() +} + +func makeStringToBuiltinPluginTypeMap() (result map[string]BuiltinPluginType) { + result = make(map[string]BuiltinPluginType, 23) + for k := range GeneratorFactories { + result[k.String()] = k + } + for k := range TransformerFactories { + result[k.String()] = k + } + return +} + +func GetBuiltinPluginType(n string) BuiltinPluginType { + result, ok := stringToBuiltinPluginTypeMap[n] + if ok { + return result + } + return Unknown +} + +var GeneratorFactories = map[BuiltinPluginType]func() resmap.GeneratorPlugin{ + ConfigMapGenerator: builtins.NewConfigMapGeneratorPlugin, + SecretGenerator: builtins.NewSecretGeneratorPlugin, + HelmChartInflationGenerator: builtins.NewHelmChartInflationGeneratorPlugin, +} + +var TransformerFactories = map[BuiltinPluginType]func() resmap.TransformerPlugin{ + AnnotationsTransformer: builtins.NewAnnotationsTransformerPlugin, + HashTransformer: builtins.NewHashTransformerPlugin, + ImageTagTransformer: builtins.NewImageTagTransformerPlugin, + LabelTransformer: builtins.NewLabelTransformerPlugin, + LegacyOrderTransformer: builtins.NewLegacyOrderTransformerPlugin, + NamespaceTransformer: builtins.NewNamespaceTransformerPlugin, + PatchJson6902Transformer: builtins.NewPatchJson6902TransformerPlugin, + PatchStrategicMergeTransformer: builtins.NewPatchStrategicMergeTransformerPlugin, + PatchTransformer: builtins.NewPatchTransformerPlugin, + PrefixSuffixTransformer: builtins.NewPrefixSuffixTransformerPlugin, + ReplicaCountTransformer: builtins.NewReplicaCountTransformerPlugin, + ValueAddTransformer: builtins.NewValueAddTransformerPlugin, +} diff --git a/vendor/sigs.k8s.io/kustomize/api/internal/plugins/execplugin/execplugin.go b/vendor/sigs.k8s.io/kustomize/api/internal/plugins/execplugin/execplugin.go new file mode 100644 index 000000000000..a6f801ebb943 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/internal/plugins/execplugin/execplugin.go @@ -0,0 +1,189 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package execplugin + +import ( + "bytes" + "fmt" + "io/ioutil" + "os" + "os/exec" + "runtime" + "strings" + + "github.com/google/shlex" + + "github.com/pkg/errors" + "sigs.k8s.io/kustomize/api/internal/plugins/utils" + "sigs.k8s.io/kustomize/api/resmap" + "sigs.k8s.io/yaml" +) + +const ( + tmpConfigFilePrefix = "kust-plugin-config-" +) + +// ExecPlugin record the name and args of an executable +// It triggers the executable generator and transformer +type ExecPlugin struct { + // absolute path of the executable + path string + + // Optional command line arguments to the executable + // pulled from specially named fields in cfg. + // This is for executables that don't want to parse YAML. + args []string + + // Plugin configuration data. + cfg []byte + + // PluginHelpers + h *resmap.PluginHelpers +} + +func NewExecPlugin(p string) *ExecPlugin { + return &ExecPlugin{path: p} +} + +func (p *ExecPlugin) ErrIfNotExecutable() error { + f, err := os.Stat(p.path) + if err != nil { + return err + } + // In Windows, it is not possible to determine whether a + // file is executable through file mode. + // TODO: provide for setting the executable FileMode bit on Windows + // The (fs *fileStat) Mode() (m FileMode) {} function in + // https://golang.org/src/os/types_windows.go + // lacks the ability to set the FileMode executable bit in response + // to file data on Windows. + if f.Mode()&0111 == 0000 && runtime.GOOS != "windows" { + return fmt.Errorf("unexecutable plugin at: %s", p.path) + } + return nil +} + +func (p *ExecPlugin) Path() string { + return p.path +} + +func (p *ExecPlugin) Args() []string { + return p.args +} + +func (p *ExecPlugin) Cfg() []byte { + return p.cfg +} + +func (p *ExecPlugin) Config(h *resmap.PluginHelpers, config []byte) error { + p.h = h + p.cfg = config + return p.processOptionalArgsFields() +} + +type argsConfig struct { + ArgsOneLiner string `json:"argsOneLiner,omitempty" yaml:"argsOneLiner,omitempty"` + ArgsFromFile string `json:"argsFromFile,omitempty" yaml:"argsFromFile,omitempty"` +} + +func (p *ExecPlugin) processOptionalArgsFields() error { + var c argsConfig + yaml.Unmarshal(p.cfg, &c) + if c.ArgsOneLiner != "" { + p.args, _ = shlex.Split(c.ArgsOneLiner) + } + if c.ArgsFromFile != "" { + content, err := p.h.Loader().Load(c.ArgsFromFile) + if err != nil { + return err + } + for _, x := range strings.Split(string(content), "\n") { + x := strings.TrimLeft(x, " ") + if x != "" { + p.args = append(p.args, x) + } + } + } + return nil +} + +func (p *ExecPlugin) Generate() (resmap.ResMap, error) { + output, err := p.invokePlugin(nil) + if err != nil { + return nil, err + } + rm, err := p.h.ResmapFactory().NewResMapFromBytes(output) + if err != nil { + return nil, err + } + return utils.UpdateResourceOptions(rm) +} + +func (p *ExecPlugin) Transform(rm resmap.ResMap) error { + // add ResIds as annotations to all objects so that we can add them back + inputRM, err := utils.GetResMapWithIDAnnotation(rm) + if err != nil { + return err + } + + // encode the ResMap so it can be fed to the plugin + resources, err := inputRM.AsYaml() + if err != nil { + return err + } + + // invoke the plugin with resources as the input + output, err := p.invokePlugin(resources) + if err != nil { + return fmt.Errorf("%v %s", err, string(output)) + } + + // update the original ResMap based on the output + return utils.UpdateResMapValues(p.path, p.h, output, rm) +} + +// invokePlugin writes plugin config to a temp file, then +// passes the full temp file path as the first arg to a process +// running the plugin binary. Process output is returned. +func (p *ExecPlugin) invokePlugin(input []byte) ([]byte, error) { + f, err := ioutil.TempFile("", tmpConfigFilePrefix) + if err != nil { + return nil, errors.Wrap( + err, "creating tmp plugin config file") + } + _, err = f.Write(p.cfg) + if err != nil { + return nil, errors.Wrap( + err, "writing plugin config to "+f.Name()) + } + err = f.Close() + if err != nil { + return nil, errors.Wrap( + err, "closing plugin config file "+f.Name()) + } + //nolint:gosec + cmd := exec.Command( + p.path, append([]string{f.Name()}, p.args...)...) + cmd.Env = p.getEnv() + cmd.Stdin = bytes.NewReader(input) + cmd.Stderr = os.Stderr + if _, err := os.Stat(p.h.Loader().Root()); err == nil { + cmd.Dir = p.h.Loader().Root() + } + result, err := cmd.Output() + if err != nil { + return nil, errors.Wrapf( + err, "failure in plugin configured via %s; %v", + f.Name(), err.Error()) + } + return result, os.Remove(f.Name()) +} + +func (p *ExecPlugin) getEnv() []string { + env := os.Environ() + env = append(env, + "KUSTOMIZE_PLUGIN_CONFIG_STRING="+string(p.cfg), + "KUSTOMIZE_PLUGIN_CONFIG_ROOT="+p.h.Loader().Root()) + return env +} diff --git a/vendor/sigs.k8s.io/kustomize/api/internal/plugins/fnplugin/fnplugin.go b/vendor/sigs.k8s.io/kustomize/api/internal/plugins/fnplugin/fnplugin.go new file mode 100644 index 000000000000..ddd980d74a13 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/internal/plugins/fnplugin/fnplugin.go @@ -0,0 +1,197 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package fnplugin + +import ( + "bytes" + "fmt" + + "github.com/pkg/errors" + + "sigs.k8s.io/kustomize/api/internal/plugins/utils" + "sigs.k8s.io/kustomize/api/resmap" + "sigs.k8s.io/kustomize/api/resource" + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/fn/runtime/runtimeutil" + "sigs.k8s.io/kustomize/kyaml/runfn" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +// FnPlugin is the struct to hold function information +type FnPlugin struct { + // Function runner + runFns runfn.RunFns + + // Plugin configuration data. + cfg []byte + + // Plugin name cache for error output + pluginName string + + // PluginHelpers + h *resmap.PluginHelpers +} + +func bytesToRNode(yml []byte) (*yaml.RNode, error) { + rnode, err := yaml.Parse(string(yml)) + if err != nil { + return nil, err + } + return rnode, nil +} + +func resourceToRNode(res *resource.Resource) (*yaml.RNode, error) { + yml, err := res.AsYAML() + if err != nil { + return nil, err + } + + return bytesToRNode(yml) +} + +// GetFunctionSpec return function spec is there is. Otherwise return nil +func GetFunctionSpec(res *resource.Resource) *runtimeutil.FunctionSpec { + rnode, err := resourceToRNode(res) + if err != nil { + return nil + } + + return runtimeutil.GetFunctionSpec(rnode) +} + +func toStorageMounts(mounts []string) []runtimeutil.StorageMount { + var sms []runtimeutil.StorageMount + for _, mount := range mounts { + sms = append(sms, runtimeutil.StringToStorageMount(mount)) + } + return sms +} + +// NewFnPlugin creates a FnPlugin struct +func NewFnPlugin(o *types.FnPluginLoadingOptions) *FnPlugin { + return &FnPlugin{ + runFns: runfn.RunFns{ + Functions: []*yaml.RNode{}, + Network: o.Network, + EnableStarlark: o.EnableStar, + EnableExec: o.EnableExec, + StorageMounts: toStorageMounts(o.Mounts), + Env: o.Env, + }, + } +} + +// Cfg returns function config +func (p *FnPlugin) Cfg() []byte { + return p.cfg +} + +// Config is called by kustomize to pass-in config information +func (p *FnPlugin) Config(h *resmap.PluginHelpers, config []byte) error { + p.h = h + p.cfg = config + + fn, err := bytesToRNode(p.cfg) + if err != nil { + return err + } + + meta, err := fn.GetMeta() + if err != nil { + return err + } + + p.pluginName = fmt.Sprintf("api: %s, kind: %s, name: %s", + meta.APIVersion, meta.Kind, meta.Name) + + return nil +} + +// Generate is called when run as generator +func (p *FnPlugin) Generate() (resmap.ResMap, error) { + output, err := p.invokePlugin(nil) + if err != nil { + return nil, err + } + rm, err := p.h.ResmapFactory().NewResMapFromBytes(output) + if err != nil { + return nil, err + } + return utils.UpdateResourceOptions(rm) +} + +// Transform is called when run as transformer +func (p *FnPlugin) Transform(rm resmap.ResMap) error { + // add ResIds as annotations to all objects so that we can add them back + inputRM, err := utils.GetResMapWithIDAnnotation(rm) + if err != nil { + return err + } + + // encode the ResMap so it can be fed to the plugin + resources, err := inputRM.AsYaml() + if err != nil { + return err + } + + // invoke the plugin with resources as the input + output, err := p.invokePlugin(resources) + if err != nil { + return fmt.Errorf("%v %s", err, string(output)) + } + + // update the original ResMap based on the output + return utils.UpdateResMapValues(p.pluginName, p.h, output, rm) +} + +func injectAnnotation(input *yaml.RNode, k, v string) error { + err := input.PipeE(yaml.SetAnnotation(k, v)) + if err != nil { + return err + } + return nil +} + +// invokePlugin uses Function runner to run function as plugin +func (p *FnPlugin) invokePlugin(input []byte) ([]byte, error) { + // get function config rnode + functionConfig, err := bytesToRNode(p.cfg) + if err != nil { + return nil, err + } + + // This annotation will let kustomize ingnore this item in output + err = injectAnnotation(functionConfig, "config.kubernetes.io/local-config", "true") + if err != nil { + return nil, err + } + // we need to add config as input for generators. Some of them don't work with FunctionConfig + // and in addition kio.Pipeline won't create anything if there are no objects + // see https://github.com/kubernetes-sigs/kustomize/blob/master/kyaml/kio/kio.go#L93 + // Since we added `local-config` annotation so it will be ignored in generator output + // TODO(donnyxia): This is actually not used by generator and only used to bypass a kio limitation. + // Need better solution. + if input == nil { + yml, err := functionConfig.String() + if err != nil { + return nil, err + } + input = []byte(yml) + } + + // Configure and Execute Fn. We don't need to convert resources to ResourceList here + // because function runtime will do that. See kyaml/fn/runtime/runtimeutil/runtimeutil.go + var ouputBuffer bytes.Buffer + p.runFns.Input = bytes.NewReader(input) + p.runFns.Functions = append(p.runFns.Functions, functionConfig) + p.runFns.Output = &ouputBuffer + + err = p.runFns.Execute() + if err != nil { + return nil, errors.Wrap( + err, "couldn't execute function") + } + + return ouputBuffer.Bytes(), nil +} diff --git a/vendor/sigs.k8s.io/kustomize/api/internal/plugins/loader/loader.go b/vendor/sigs.k8s.io/kustomize/api/internal/plugins/loader/loader.go new file mode 100644 index 000000000000..aaa7c36004c0 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/internal/plugins/loader/loader.go @@ -0,0 +1,246 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package loader + +import ( + "fmt" + "log" + "os" + "path/filepath" + "plugin" + "reflect" + "strings" + + "github.com/pkg/errors" + "sigs.k8s.io/kustomize/api/ifc" + "sigs.k8s.io/kustomize/api/internal/plugins/builtinhelpers" + "sigs.k8s.io/kustomize/api/internal/plugins/execplugin" + "sigs.k8s.io/kustomize/api/internal/plugins/fnplugin" + "sigs.k8s.io/kustomize/api/internal/plugins/utils" + "sigs.k8s.io/kustomize/api/konfig" + "sigs.k8s.io/kustomize/api/resid" + "sigs.k8s.io/kustomize/api/resmap" + "sigs.k8s.io/kustomize/api/resource" + "sigs.k8s.io/kustomize/api/types" +) + +// Loader loads plugins using a file loader (a different loader). +type Loader struct { + pc *types.PluginConfig + rf *resmap.Factory +} + +func NewLoader( + pc *types.PluginConfig, rf *resmap.Factory) *Loader { + return &Loader{pc: pc, rf: rf} +} + +func (l *Loader) LoadGenerators( + ldr ifc.Loader, v ifc.Validator, rm resmap.ResMap) ([]resmap.Generator, error) { + var result []resmap.Generator + for _, res := range rm.Resources() { + g, err := l.LoadGenerator(ldr, v, res) + if err != nil { + return nil, err + } + result = append(result, g) + } + return result, nil +} + +func (l *Loader) LoadGenerator( + ldr ifc.Loader, v ifc.Validator, res *resource.Resource) (resmap.Generator, error) { + c, err := l.loadAndConfigurePlugin(ldr, v, res) + if err != nil { + return nil, err + } + g, ok := c.(resmap.Generator) + if !ok { + return nil, fmt.Errorf("plugin %s not a generator", res.OrgId()) + } + return g, nil +} + +func (l *Loader) LoadTransformers( + ldr ifc.Loader, v ifc.Validator, rm resmap.ResMap) ([]resmap.Transformer, error) { + var result []resmap.Transformer + for _, res := range rm.Resources() { + t, err := l.LoadTransformer(ldr, v, res) + if err != nil { + return nil, err + } + result = append(result, t) + } + return result, nil +} + +func (l *Loader) LoadTransformer( + ldr ifc.Loader, v ifc.Validator, res *resource.Resource) (resmap.Transformer, error) { + c, err := l.loadAndConfigurePlugin(ldr, v, res) + if err != nil { + return nil, err + } + t, ok := c.(resmap.Transformer) + if !ok { + return nil, fmt.Errorf("plugin %s not a transformer", res.OrgId()) + } + return t, nil +} + +func relativePluginPath(id resid.ResId) string { + return filepath.Join( + id.Group, + id.Version, + strings.ToLower(id.Kind)) +} + +func AbsolutePluginPath(pc *types.PluginConfig, id resid.ResId) string { + return filepath.Join( + pc.AbsPluginHome, relativePluginPath(id), id.Kind) +} + +func (l *Loader) absolutePluginPath(id resid.ResId) string { + return AbsolutePluginPath(l.pc, id) +} + +func isBuiltinPlugin(res *resource.Resource) bool { + // TODO: the special string should appear in Group, not Version. + return res.GetGvk().Group == "" && + res.GetGvk().Version == konfig.BuiltinPluginApiVersion +} + +func (l *Loader) loadAndConfigurePlugin( + ldr ifc.Loader, + v ifc.Validator, + res *resource.Resource) (c resmap.Configurable, err error) { + if isBuiltinPlugin(res) { + switch l.pc.BpLoadingOptions { + case types.BploLoadFromFileSys: + c, err = l.loadPlugin(res) + case types.BploUseStaticallyLinked: + // Instead of looking for and loading a .so file, + // instantiate the plugin from a generated factory + // function (see "pluginator"). Being able to do this + // is what makes a plugin "builtin". + c, err = l.makeBuiltinPlugin(res.GetGvk()) + default: + err = fmt.Errorf( + "unknown plugin loader behavior specified: %v", + l.pc.BpLoadingOptions) + } + } else { + switch l.pc.PluginRestrictions { + case types.PluginRestrictionsNone: + c, err = l.loadPlugin(res) + case types.PluginRestrictionsBuiltinsOnly: + err = types.NewErrOnlyBuiltinPluginsAllowed(res.OrgId().Kind) + default: + err = fmt.Errorf( + "unknown plugin restriction specified: %v", + l.pc.PluginRestrictions) + } + } + if err != nil { + return nil, err + } + yaml, err := res.AsYAML() + if err != nil { + return nil, errors.Wrapf(err, "marshalling yaml from res %s", res.OrgId()) + } + err = c.Config(resmap.NewPluginHelpers(ldr, v, l.rf), yaml) + if err != nil { + return nil, errors.Wrapf( + err, "plugin %s fails configuration", res.OrgId()) + } + return c, nil +} + +func (l *Loader) makeBuiltinPlugin(r resid.Gvk) (resmap.Configurable, error) { + bpt := builtinhelpers.GetBuiltinPluginType(r.Kind) + if f, ok := builtinhelpers.GeneratorFactories[bpt]; ok { + return f(), nil + } + if f, ok := builtinhelpers.TransformerFactories[bpt]; ok { + return f(), nil + } + return nil, errors.Errorf("unable to load builtin %s", r) +} + +func (l *Loader) loadPlugin(res *resource.Resource) (resmap.Configurable, error) { + spec := fnplugin.GetFunctionSpec(res) + if spec != nil { + return fnplugin.NewFnPlugin(&l.pc.FnpLoadingOptions), nil + } + return l.loadExecOrGoPlugin(res.OrgId()) +} + +func (l *Loader) loadExecOrGoPlugin(resId resid.ResId) (resmap.Configurable, error) { + // First try to load the plugin as an executable. + p := execplugin.NewExecPlugin(l.absolutePluginPath(resId)) + err := p.ErrIfNotExecutable() + if err == nil { + return p, nil + } + if !os.IsNotExist(err) { + // The file exists, but something else is wrong, + // likely it's not executable. + // Assume the user forgot to set the exec bit, + // and return an error, rather than adding ".so" + // to the name and attempting to load it as a Go + // plugin, which will likely fail and result + // in an obscure message. + return nil, err + } + // Failing the above, try loading it as a Go plugin. + c, err := l.loadGoPlugin(resId) + if err != nil { + return nil, err + } + return c, nil +} + +// registry is a means to avoid trying to load the same .so file +// into memory more than once, which results in an error. +// Each test makes its own loader, and tries to load its own plugins, +// but the loaded .so files are in shared memory, so one will get +// "this plugin already loaded" errors if the registry is maintained +// as a Loader instance variable. So make it a package variable. +var registry = make(map[string]resmap.Configurable) + +func (l *Loader) loadGoPlugin(id resid.ResId) (resmap.Configurable, error) { + regId := relativePluginPath(id) + if c, ok := registry[regId]; ok { + return copyPlugin(c), nil + } + absPath := l.absolutePluginPath(id) + ".so" + if !utils.FileExists(absPath) { + return nil, fmt.Errorf( + "expected file with Go object code at: %s", absPath) + } + log.Printf("Attempting plugin load from '%s'", absPath) + p, err := plugin.Open(absPath) + if err != nil { + return nil, errors.Wrapf(err, "plugin %s fails to load", absPath) + } + symbol, err := p.Lookup(konfig.PluginSymbol) + if err != nil { + return nil, errors.Wrapf( + err, "plugin %s doesn't have symbol %s", + regId, konfig.PluginSymbol) + } + c, ok := symbol.(resmap.Configurable) + if !ok { + return nil, fmt.Errorf("plugin '%s' not configurable", regId) + } + registry[regId] = c + return copyPlugin(c), nil +} + +func copyPlugin(c resmap.Configurable) resmap.Configurable { + indirect := reflect.Indirect(reflect.ValueOf(c)) + newIndirect := reflect.New(indirect.Type()) + newIndirect.Elem().Set(reflect.ValueOf(indirect.Interface())) + newNamed := newIndirect.Interface() + return newNamed.(resmap.Configurable) +} diff --git a/vendor/sigs.k8s.io/kustomize/api/internal/plugins/utils/utils.go b/vendor/sigs.k8s.io/kustomize/api/internal/plugins/utils/utils.go new file mode 100644 index 000000000000..12dd6e89f05c --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/internal/plugins/utils/utils.go @@ -0,0 +1,237 @@ +// Copyright 2020 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package utils + +import ( + "encoding/json" + "fmt" + "os" + "path/filepath" + "runtime" + "strconv" + "time" + + "sigs.k8s.io/kustomize/api/filesys" + "sigs.k8s.io/kustomize/api/konfig" + "sigs.k8s.io/kustomize/api/resmap" + "sigs.k8s.io/kustomize/api/resource" + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/yaml" +) + +const ( + idAnnotation = "kustomize.config.k8s.io/id" + HashAnnotation = "kustomize.config.k8s.io/needs-hash" + BehaviorAnnotation = "kustomize.config.k8s.io/behavior" +) + +func GoBin() string { + return filepath.Join(runtime.GOROOT(), "bin", "go") +} + +// DeterminePluginSrcRoot guesses where the user +// has her ${g}/${v}/$lower(${k})/${k}.go files. +func DeterminePluginSrcRoot(fSys filesys.FileSystem) (string, error) { + return konfig.FirstDirThatExistsElseError( + "source directory", fSys, []konfig.NotedFunc{ + { + Note: "relative to unit test", + F: func() string { + return filepath.Clean( + filepath.Join( + os.Getenv("PWD"), + "..", "..", + konfig.RelPluginHome)) + }, + }, + { + Note: "relative to unit test (internal pkg)", + F: func() string { + return filepath.Clean( + filepath.Join( + os.Getenv("PWD"), + "..", "..", "..", "..", + konfig.RelPluginHome)) + }, + }, + { + Note: "relative to api package", + F: func() string { + return filepath.Clean( + filepath.Join( + os.Getenv("PWD"), + "..", "..", "..", + konfig.RelPluginHome)) + }, + }, + { + Note: "old style $GOPATH", + F: func() string { + return filepath.Join( + os.Getenv("GOPATH"), + "src", konfig.DomainName, + konfig.ProgramName, konfig.RelPluginHome) + }, + }, + { + Note: "HOME with literal 'gopath'", + F: func() string { + return filepath.Join( + konfig.HomeDir(), "gopath", + "src", konfig.DomainName, + konfig.ProgramName, konfig.RelPluginHome) + }, + }, + { + Note: "home directory", + F: func() string { + return filepath.Join( + konfig.HomeDir(), konfig.DomainName, + konfig.ProgramName, konfig.RelPluginHome) + }, + }, + }) +} + +// FileYoungerThan returns true if the file both exists and has an +// age is <= the Duration argument. +func FileYoungerThan(path string, d time.Duration) bool { + fi, err := os.Stat(path) + if err != nil { + if os.IsNotExist(err) { + return false + } + } + return time.Since(fi.ModTime()) <= d +} + +// FileModifiedAfter returns true if the file both exists and was +// modified after the given time.. +func FileModifiedAfter(path string, t time.Time) bool { + fi, err := os.Stat(path) + if err != nil { + if os.IsNotExist(err) { + return false + } + } + return fi.ModTime().After(t) +} + +func FileExists(path string) bool { + if _, err := os.Stat(path); err != nil { + if os.IsNotExist(err) { + return false + } + } + return true +} + +// GetResMapWithIDAnnotation returns a new copy of the given ResMap with the ResIds annotated in each Resource +func GetResMapWithIDAnnotation(rm resmap.ResMap) (resmap.ResMap, error) { + inputRM := rm.DeepCopy() + for _, r := range inputRM.Resources() { + idString, err := yaml.Marshal(r.CurId()) + if err != nil { + return nil, err + } + annotations := r.GetAnnotations() + annotations[idAnnotation] = string(idString) + r.SetAnnotations(annotations) + } + return inputRM, nil +} + +// UpdateResMapValues updates the Resource value in the given ResMap +// with the emitted Resource values in output. +func UpdateResMapValues(pluginName string, h *resmap.PluginHelpers, output []byte, rm resmap.ResMap) error { + mapFactory := h.ResmapFactory() + resFactory := mapFactory.RF() + resources, err := resFactory.SliceFromBytes(output) + if err != nil { + return err + } + // Don't use resources here, or error message will be unfriendly to plugin builders + newMap, err := mapFactory.NewResMapFromBytes([]byte{}) + if err != nil { + return err + } + + for _, r := range resources { + removeIDAnnotation(r) // stale--not manipulated by plugin transformers + + // Add to the new map, checking for duplicates + if err := newMap.Append(r); err != nil { + prettyID, err := json.Marshal(r.CurId()) + if err != nil { + prettyID = []byte(r.CurId().String()) + } + return fmt.Errorf("plugin %s generated duplicate resource: %s", pluginName, prettyID) + } + + // Add to or update the old map + oldIdx, err := rm.GetIndexOfCurrentId(r.CurId()) + if err != nil { + return err + } + if oldIdx != -1 { + rm.GetByIndex(oldIdx).ResetPrimaryData(r) + } else { + if err := rm.Append(r); err != nil { + return err + } + } + } + + // Remove items the transformer deleted from the old map + for _, id := range rm.AllIds() { + newIdx, _ := newMap.GetIndexOfCurrentId(id) + if newIdx == -1 { + rm.Remove(id) + } + } + + return nil +} + +func removeIDAnnotation(r *resource.Resource) { + // remove the annotation set by Kustomize to track the resource + annotations := r.GetAnnotations() + delete(annotations, idAnnotation) + if len(annotations) == 0 { + annotations = nil + } + r.SetAnnotations(annotations) +} + +// UpdateResourceOptions updates the generator options for each resource in the +// given ResMap based on plugin provided annotations. +func UpdateResourceOptions(rm resmap.ResMap) (resmap.ResMap, error) { + for _, r := range rm.Resources() { + // Disable name hashing by default and require plugin to explicitly + // request it for each resource. + annotations := r.GetAnnotations() + behavior := annotations[BehaviorAnnotation] + var needsHash bool + if val, ok := annotations[HashAnnotation]; ok { + b, err := strconv.ParseBool(val) + if err != nil { + return nil, fmt.Errorf( + "the annotation %q contains an invalid value (%q)", + HashAnnotation, val) + } + needsHash = b + } + delete(annotations, HashAnnotation) + delete(annotations, BehaviorAnnotation) + if len(annotations) == 0 { + annotations = nil + } + r.SetAnnotations(annotations) + r.SetOptions(types.NewGenArgs( + &types.GeneratorArgs{ + Behavior: behavior, + Options: &types.GeneratorOptions{DisableNameSuffixHash: !needsHash}})) + } + return rm, nil +} diff --git a/vendor/sigs.k8s.io/kustomize/api/internal/target/errmissingkustomization.go b/vendor/sigs.k8s.io/kustomize/api/internal/target/errmissingkustomization.go new file mode 100644 index 000000000000..45e4895932b2 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/internal/target/errmissingkustomization.go @@ -0,0 +1,48 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package target + +import ( + "fmt" + "strings" + + "github.com/pkg/errors" + "sigs.k8s.io/kustomize/api/konfig" +) + +type errMissingKustomization struct { + path string +} + +func (e *errMissingKustomization) Error() string { + return fmt.Sprintf( + "unable to find one of %v in directory '%s'", + commaOr(quoted(konfig.RecognizedKustomizationFileNames())), + e.path) +} + +func IsMissingKustomizationFileError(err error) bool { + _, ok := err.(*errMissingKustomization) + if ok { + return true + } + _, ok = errors.Cause(err).(*errMissingKustomization) + return ok +} + +func NewErrMissingKustomization(p string) *errMissingKustomization { + return &errMissingKustomization{path: p} +} + +func quoted(l []string) []string { + r := make([]string, len(l)) + for i, v := range l { + r[i] = "'" + v + "'" + } + return r +} + +func commaOr(q []string) string { + return strings.Join(q[:len(q)-1], ", ") + " or " + q[len(q)-1] +} diff --git a/vendor/sigs.k8s.io/kustomize/api/internal/target/kusttarget.go b/vendor/sigs.k8s.io/kustomize/api/internal/target/kusttarget.go new file mode 100644 index 000000000000..acc3d1316311 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/internal/target/kusttarget.go @@ -0,0 +1,452 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package target + +import ( + "encoding/json" + "fmt" + "path/filepath" + "strings" + + "github.com/pkg/errors" + "sigs.k8s.io/kustomize/api/builtins" + "sigs.k8s.io/kustomize/api/ifc" + "sigs.k8s.io/kustomize/api/internal/accumulator" + "sigs.k8s.io/kustomize/api/internal/plugins/builtinconfig" + "sigs.k8s.io/kustomize/api/internal/plugins/builtinhelpers" + "sigs.k8s.io/kustomize/api/internal/plugins/loader" + "sigs.k8s.io/kustomize/api/konfig" + "sigs.k8s.io/kustomize/api/resmap" + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/openapi" + "sigs.k8s.io/yaml" +) + +// KustTarget encapsulates the entirety of a kustomization build. +type KustTarget struct { + kustomization *types.Kustomization + ldr ifc.Loader + validator ifc.Validator + rFactory *resmap.Factory + pLdr *loader.Loader +} + +// NewKustTarget returns a new instance of KustTarget. +func NewKustTarget( + ldr ifc.Loader, + validator ifc.Validator, + rFactory *resmap.Factory, + pLdr *loader.Loader) *KustTarget { + return &KustTarget{ + ldr: ldr, + validator: validator, + rFactory: rFactory, + pLdr: pLdr, + } +} + +// Load attempts to load the target's kustomization file. +func (kt *KustTarget) Load() error { + content, err := loadKustFile(kt.ldr) + if err != nil { + return err + } + content, err = types.FixKustomizationPreUnmarshalling(content) + if err != nil { + return err + } + var k types.Kustomization + err = k.Unmarshal(content) + if err != nil { + return err + } + k.FixKustomizationPostUnmarshalling() + errs := k.EnforceFields() + if len(errs) > 0 { + return fmt.Errorf( + "Failed to read kustomization file under %s:\n"+ + strings.Join(errs, "\n"), kt.ldr.Root()) + } + kt.kustomization = &k + return nil +} + +// Kustomization returns a copy of the immutable, internal kustomization object. +func (kt *KustTarget) Kustomization() types.Kustomization { + var result types.Kustomization + b, _ := json.Marshal(*kt.kustomization) + json.Unmarshal(b, &result) + return result +} + +func loadKustFile(ldr ifc.Loader) ([]byte, error) { + var content []byte + match := 0 + for _, kf := range konfig.RecognizedKustomizationFileNames() { + c, err := ldr.Load(kf) + if err == nil { + match += 1 + content = c + } + } + switch match { + case 0: + return nil, NewErrMissingKustomization(ldr.Root()) + case 1: + return content, nil + default: + return nil, fmt.Errorf( + "Found multiple kustomization files under: %s\n", ldr.Root()) + } +} + +// MakeCustomizedResMap creates a fully customized ResMap +// per the instructions contained in its kustomization instance. +func (kt *KustTarget) MakeCustomizedResMap() (resmap.ResMap, error) { + return kt.makeCustomizedResMap() +} + +func (kt *KustTarget) makeCustomizedResMap() (resmap.ResMap, error) { + ra, err := kt.AccumulateTarget() + if err != nil { + return nil, err + } + + // The following steps must be done last, not as part of + // the recursion implicit in AccumulateTarget. + + err = kt.addHashesToNames(ra) + if err != nil { + return nil, err + } + + // Given that names have changed (prefixs/suffixes added), + // fix all the back references to those names. + err = ra.FixBackReferences() + if err != nil { + return nil, err + } + + // With all the back references fixed, it's OK to resolve Vars. + err = ra.ResolveVars() + if err != nil { + return nil, err + } + + return ra.ResMap(), nil +} + +func (kt *KustTarget) addHashesToNames( + ra *accumulator.ResAccumulator) error { + p := builtins.NewHashTransformerPlugin() + err := kt.configureBuiltinPlugin(p, nil, builtinhelpers.HashTransformer) + if err != nil { + return err + } + return ra.Transform(p) +} + +// AccumulateTarget returns a new ResAccumulator, +// holding customized resources and the data/rules used +// to do so. The name back references and vars are +// not yet fixed. +func (kt *KustTarget) AccumulateTarget() ( + ra *accumulator.ResAccumulator, err error) { + return kt.accumulateTarget(accumulator.MakeEmptyAccumulator()) +} + +// ra should be empty when this KustTarget is a Kustomization, or the ra of the parent if this KustTarget is a Component +// (or empty if the Component does not have a parent). +func (kt *KustTarget) accumulateTarget(ra *accumulator.ResAccumulator) ( + resRa *accumulator.ResAccumulator, err error) { + ra, err = kt.accumulateResources(ra, kt.kustomization.Resources) + if err != nil { + return nil, errors.Wrap(err, "accumulating resources") + } + ra, err = kt.accumulateComponents(ra, kt.kustomization.Components) + if err != nil { + return nil, errors.Wrap(err, "accumulating components") + } + tConfig, err := builtinconfig.MakeTransformerConfig( + kt.ldr, kt.kustomization.Configurations) + if err != nil { + return nil, err + } + err = ra.MergeConfig(tConfig) + if err != nil { + return nil, errors.Wrapf( + err, "merging config %v", tConfig) + } + crdTc, err := accumulator.LoadConfigFromCRDs(kt.ldr, kt.kustomization.Crds) + if err != nil { + return nil, errors.Wrapf( + err, "loading CRDs %v", kt.kustomization.Crds) + } + err = ra.MergeConfig(crdTc) + if err != nil { + return nil, errors.Wrapf( + err, "merging CRDs %v", crdTc) + } + err = kt.runGenerators(ra) + if err != nil { + return nil, err + } + err = kt.runTransformers(ra) + if err != nil { + return nil, err + } + err = kt.runValidators(ra) + if err != nil { + return nil, err + } + err = ra.MergeVars(kt.kustomization.Vars) + if err != nil { + return nil, errors.Wrapf( + err, "merging vars %v", kt.kustomization.Vars) + } + return ra, nil +} + +func (kt *KustTarget) runGenerators( + ra *accumulator.ResAccumulator) error { + var generators []resmap.Generator + gs, err := kt.configureBuiltinGenerators() + if err != nil { + return err + } + generators = append(generators, gs...) + gs, err = kt.configureExternalGenerators() + if err != nil { + return errors.Wrap(err, "loading generator plugins") + } + generators = append(generators, gs...) + for _, g := range generators { + resMap, err := g.Generate() + if err != nil { + return err + } + err = ra.AbsorbAll(resMap) + if err != nil { + return errors.Wrapf(err, "merging from generator %v", g) + } + } + return nil +} + +func (kt *KustTarget) configureExternalGenerators() ([]resmap.Generator, error) { + ra := accumulator.MakeEmptyAccumulator() + var generatorPaths []string + for _, p := range kt.kustomization.Generators { + // handle inline generators + rm, err := kt.rFactory.NewResMapFromBytes([]byte(p)) + if err != nil { + // not an inline config + generatorPaths = append(generatorPaths, p) + continue + } + ra.AppendAll(rm) + } + ra, err := kt.accumulateResources(ra, generatorPaths) + if err != nil { + return nil, err + } + return kt.pLdr.LoadGenerators(kt.ldr, kt.validator, ra.ResMap()) +} + +func (kt *KustTarget) runTransformers(ra *accumulator.ResAccumulator) error { + var r []resmap.Transformer + tConfig := ra.GetTransformerConfig() + lts, err := kt.configureBuiltinTransformers(tConfig) + if err != nil { + return err + } + r = append(r, lts...) + lts, err = kt.configureExternalTransformers(kt.kustomization.Transformers) + if err != nil { + return err + } + r = append(r, lts...) + return ra.Transform(newMultiTransformer(r)) +} + +func (kt *KustTarget) configureExternalTransformers(transformers []string) ([]resmap.Transformer, error) { + ra := accumulator.MakeEmptyAccumulator() + var transformerPaths []string + for _, p := range transformers { + // handle inline transformers + rm, err := kt.rFactory.NewResMapFromBytes([]byte(p)) + if err != nil { + // not an inline config + transformerPaths = append(transformerPaths, p) + continue + } + ra.AppendAll(rm) + } + ra, err := kt.accumulateResources(ra, transformerPaths) + + if err != nil { + return nil, err + } + return kt.pLdr.LoadTransformers(kt.ldr, kt.validator, ra.ResMap()) +} + +func (kt *KustTarget) runValidators(ra *accumulator.ResAccumulator) error { + validators, err := kt.configureExternalTransformers(kt.kustomization.Validators) + if err != nil { + return err + } + for _, v := range validators { + // Validators shouldn't modify the resource map + orignal := ra.ResMap().DeepCopy() + err = v.Transform(ra.ResMap()) + if err != nil { + return err + } + new := ra.ResMap().DeepCopy() + kt.removeValidatedByLabel(new) + if err = orignal.ErrorIfNotEqualSets(new); err != nil { + return fmt.Errorf("validator shouldn't modify the resource map: %v", err) + } + } + return nil +} + +func (kt *KustTarget) removeValidatedByLabel(rm resmap.ResMap) { + resources := rm.Resources() + for _, r := range resources { + labels := r.GetLabels() + if _, found := labels[konfig.ValidatedByLabelKey]; !found { + continue + } + delete(labels, konfig.ValidatedByLabelKey) + if len(labels) == 0 { + r.SetLabels(nil) + } else { + r.SetLabels(labels) + } + } +} + +// accumulateResources fills the given resourceAccumulator +// with resources read from the given list of paths. +func (kt *KustTarget) accumulateResources( + ra *accumulator.ResAccumulator, paths []string) (*accumulator.ResAccumulator, error) { + for _, path := range paths { + // try loading resource as file then as base (directory or git repository) + if errF := kt.accumulateFile(ra, path); errF != nil { + ldr, err := kt.ldr.New(path) + if err != nil { + return nil, errors.Wrapf( + err, "accumulation err='%s'", errF.Error()) + } + ra, err = kt.accumulateDirectory(ra, ldr, false) + if err != nil { + return nil, errors.Wrapf( + err, "accumulation err='%s'", errF.Error()) + } + } + } + return ra, nil +} + +// accumulateResources fills the given resourceAccumulator +// with resources read from the given list of paths. +func (kt *KustTarget) accumulateComponents( + ra *accumulator.ResAccumulator, paths []string) (*accumulator.ResAccumulator, error) { + for _, path := range paths { + // Components always refer to directories + ldr, errL := kt.ldr.New(path) + if errL != nil { + return nil, fmt.Errorf("loader.New %q", errL) + } + var errD error + ra, errD = kt.accumulateDirectory(ra, ldr, true) + if errD != nil { + return nil, fmt.Errorf("accumulateDirectory: %q", errD) + } + } + return ra, nil +} + +func (kt *KustTarget) accumulateDirectory( + ra *accumulator.ResAccumulator, ldr ifc.Loader, isComponent bool) (*accumulator.ResAccumulator, error) { + defer ldr.Cleanup() + subKt := NewKustTarget(ldr, kt.validator, kt.rFactory, kt.pLdr) + err := subKt.Load() + if err != nil { + return nil, errors.Wrapf( + err, "couldn't make target for path '%s'", ldr.Root()) + } + var bytes []byte + path := ldr.Root() + if openApiPath, exists := subKt.Kustomization().OpenAPI["path"]; exists { + bytes, err = ldr.Load(filepath.Join(path, openApiPath)) + if err != nil { + return nil, err + } + } + err = openapi.SetSchema(subKt.Kustomization().OpenAPI, bytes, false) + if err != nil { + return nil, err + } + if isComponent && subKt.kustomization.Kind != types.ComponentKind { + return nil, fmt.Errorf( + "expected kind '%s' for path '%s' but got '%s'", types.ComponentKind, ldr.Root(), subKt.kustomization.Kind) + } else if !isComponent && subKt.kustomization.Kind == types.ComponentKind { + return nil, fmt.Errorf( + "expected kind != '%s' for path '%s'", types.ComponentKind, ldr.Root()) + } + + var subRa *accumulator.ResAccumulator + if isComponent { + // Components don't create a new accumulator: the kustomization directives are added to the current accumulator + subRa, err = subKt.accumulateTarget(ra) + ra = accumulator.MakeEmptyAccumulator() + } else { + // Child Kustomizations create a new accumulator which resolves their kustomization directives, which will later + // be merged into the current accumulator. + subRa, err = subKt.AccumulateTarget() + } + if err != nil { + return nil, errors.Wrapf( + err, "recursed accumulation of path '%s'", ldr.Root()) + } + err = ra.MergeAccumulator(subRa) + if err != nil { + return nil, errors.Wrapf( + err, "recursed merging from path '%s'", ldr.Root()) + } + return ra, nil +} + +func (kt *KustTarget) accumulateFile( + ra *accumulator.ResAccumulator, path string) error { + resources, err := kt.rFactory.FromFile(kt.ldr, path) + if err != nil { + return errors.Wrapf(err, "accumulating resources from '%s'", path) + } + err = ra.AppendAll(resources) + if err != nil { + return errors.Wrapf(err, "merging resources from '%s'", path) + } + return nil +} + +func (kt *KustTarget) configureBuiltinPlugin( + p resmap.Configurable, c interface{}, bpt builtinhelpers.BuiltinPluginType) (err error) { + var y []byte + if c != nil { + y, err = yaml.Marshal(c) + if err != nil { + return errors.Wrapf( + err, "builtin %s marshal", bpt) + } + } + err = p.Config(resmap.NewPluginHelpers(kt.ldr, kt.validator, kt.rFactory), y) + if err != nil { + return errors.Wrapf( + err, "trouble configuring builtin %s with config: `\n%s`", bpt, string(y)) + } + return nil +} diff --git a/vendor/sigs.k8s.io/kustomize/api/internal/target/kusttarget_configplugin.go b/vendor/sigs.k8s.io/kustomize/api/internal/target/kusttarget_configplugin.go new file mode 100644 index 000000000000..640cc742add0 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/internal/target/kusttarget_configplugin.go @@ -0,0 +1,318 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package target + +import ( + "fmt" + + "sigs.k8s.io/kustomize/api/internal/plugins/builtinconfig" + "sigs.k8s.io/kustomize/api/internal/plugins/builtinhelpers" + "sigs.k8s.io/kustomize/api/resmap" + "sigs.k8s.io/kustomize/api/types" +) + +// Functions dedicated to configuring the builtin +// transformer and generator plugins using config data +// read from a kustomization file and from the +// config.TransformerConfig, whose data may be a +// mix of hardcoded values and data read from file. +// +// Non-builtin plugins will get their configuration +// from their own dedicated structs and YAML files. +// +// There are some loops in the functions below because +// the kustomization file would, say, allow someone to +// request multiple secrets be made, or run multiple +// image tag transforms. In these cases, we'll need +// N plugin instances with differing configurations. + +func (kt *KustTarget) configureBuiltinGenerators() ( + result []resmap.Generator, err error) { + for _, bpt := range []builtinhelpers.BuiltinPluginType{ + builtinhelpers.ConfigMapGenerator, + builtinhelpers.SecretGenerator, + builtinhelpers.HelmChartInflationGenerator, + } { + r, err := generatorConfigurators[bpt]( + kt, bpt, builtinhelpers.GeneratorFactories[bpt]) + if err != nil { + return nil, err + } + result = append(result, r...) + } + return result, nil +} + +func (kt *KustTarget) configureBuiltinTransformers( + tc *builtinconfig.TransformerConfig) ( + result []resmap.Transformer, err error) { + for _, bpt := range []builtinhelpers.BuiltinPluginType{ + builtinhelpers.PatchStrategicMergeTransformer, + builtinhelpers.PatchTransformer, + builtinhelpers.NamespaceTransformer, + builtinhelpers.PrefixSuffixTransformer, + builtinhelpers.LabelTransformer, + builtinhelpers.AnnotationsTransformer, + builtinhelpers.PatchJson6902Transformer, + builtinhelpers.ReplicaCountTransformer, + builtinhelpers.ImageTagTransformer, + } { + r, err := transformerConfigurators[bpt]( + kt, bpt, builtinhelpers.TransformerFactories[bpt], tc) + if err != nil { + return nil, err + } + result = append(result, r...) + } + return result, nil +} + +type gFactory func() resmap.GeneratorPlugin + +var generatorConfigurators = map[builtinhelpers.BuiltinPluginType]func( + kt *KustTarget, + bpt builtinhelpers.BuiltinPluginType, + factory gFactory) (result []resmap.Generator, err error){ + builtinhelpers.SecretGenerator: func(kt *KustTarget, bpt builtinhelpers.BuiltinPluginType, f gFactory) ( + result []resmap.Generator, err error) { + var c struct { + types.SecretArgs + } + for _, args := range kt.kustomization.SecretGenerator { + c.SecretArgs = args + c.SecretArgs.Options = types.MergeGlobalOptionsIntoLocal( + c.SecretArgs.Options, kt.kustomization.GeneratorOptions) + p := f() + err := kt.configureBuiltinPlugin(p, c, bpt) + if err != nil { + return nil, err + } + result = append(result, p) + } + return + }, + + builtinhelpers.ConfigMapGenerator: func(kt *KustTarget, bpt builtinhelpers.BuiltinPluginType, f gFactory) ( + result []resmap.Generator, err error) { + var c struct { + types.ConfigMapArgs + } + for _, args := range kt.kustomization.ConfigMapGenerator { + c.ConfigMapArgs = args + c.ConfigMapArgs.Options = types.MergeGlobalOptionsIntoLocal( + c.ConfigMapArgs.Options, kt.kustomization.GeneratorOptions) + p := f() + err := kt.configureBuiltinPlugin(p, c, bpt) + if err != nil { + return nil, err + } + result = append(result, p) + } + return + }, + + builtinhelpers.HelmChartInflationGenerator: func(kt *KustTarget, bpt builtinhelpers.BuiltinPluginType, f gFactory) ( + result []resmap.Generator, err error) { + var c struct { + types.HelmChartArgs + } + for _, args := range kt.kustomization.HelmChartInflationGenerator { + c.HelmChartArgs = args + p := f() + err := kt.configureBuiltinPlugin(p, c, bpt) + if err != nil { + return nil, err + } + result = append(result, p) + } + return + }, +} + +type tFactory func() resmap.TransformerPlugin + +var transformerConfigurators = map[builtinhelpers.BuiltinPluginType]func( + kt *KustTarget, + bpt builtinhelpers.BuiltinPluginType, + f tFactory, + tc *builtinconfig.TransformerConfig) (result []resmap.Transformer, err error){ + builtinhelpers.NamespaceTransformer: func( + kt *KustTarget, bpt builtinhelpers.BuiltinPluginType, f tFactory, tc *builtinconfig.TransformerConfig) ( + result []resmap.Transformer, err error) { + var c struct { + types.ObjectMeta `json:"metadata,omitempty" yaml:"metadata,omitempty"` + FieldSpecs []types.FieldSpec + } + c.Namespace = kt.kustomization.Namespace + c.FieldSpecs = tc.NameSpace + p := f() + err = kt.configureBuiltinPlugin(p, c, bpt) + if err != nil { + return nil, err + } + result = append(result, p) + return + }, + + builtinhelpers.PatchJson6902Transformer: func( + kt *KustTarget, bpt builtinhelpers.BuiltinPluginType, f tFactory, _ *builtinconfig.TransformerConfig) ( + result []resmap.Transformer, err error) { + var c struct { + Target *types.Selector `json:"target,omitempty" yaml:"target,omitempty"` + Path string `json:"path,omitempty" yaml:"path,omitempty"` + JsonOp string `json:"jsonOp,omitempty" yaml:"jsonOp,omitempty"` + } + for _, args := range kt.kustomization.PatchesJson6902 { + c.Target = args.Target + c.Path = args.Path + c.JsonOp = args.Patch + p := f() + err = kt.configureBuiltinPlugin(p, c, bpt) + if err != nil { + return nil, err + } + result = append(result, p) + } + return + }, + builtinhelpers.PatchStrategicMergeTransformer: func( + kt *KustTarget, bpt builtinhelpers.BuiltinPluginType, f tFactory, _ *builtinconfig.TransformerConfig) ( + result []resmap.Transformer, err error) { + if len(kt.kustomization.PatchesStrategicMerge) == 0 { + return + } + var c struct { + Paths []types.PatchStrategicMerge `json:"paths,omitempty" yaml:"paths,omitempty"` + } + c.Paths = kt.kustomization.PatchesStrategicMerge + p := f() + err = kt.configureBuiltinPlugin(p, c, bpt) + if err != nil { + return nil, err + } + result = append(result, p) + return + }, + builtinhelpers.PatchTransformer: func( + kt *KustTarget, bpt builtinhelpers.BuiltinPluginType, f tFactory, _ *builtinconfig.TransformerConfig) ( + result []resmap.Transformer, err error) { + if len(kt.kustomization.Patches) == 0 { + return + } + var c struct { + Path string `json:"path,omitempty" yaml:"path,omitempty"` + Patch string `json:"patch,omitempty" yaml:"patch,omitempty"` + Target *types.Selector `json:"target,omitempty" yaml:"target,omitempty"` + } + for _, pc := range kt.kustomization.Patches { + c.Target = pc.Target + c.Patch = pc.Patch + c.Path = pc.Path + p := f() + err = kt.configureBuiltinPlugin(p, c, bpt) + if err != nil { + return nil, err + } + result = append(result, p) + } + return + }, + builtinhelpers.LabelTransformer: func( + kt *KustTarget, bpt builtinhelpers.BuiltinPluginType, f tFactory, tc *builtinconfig.TransformerConfig) ( + result []resmap.Transformer, err error) { + var c struct { + Labels map[string]string + FieldSpecs []types.FieldSpec + } + c.Labels = kt.kustomization.CommonLabels + c.FieldSpecs = tc.CommonLabels + p := f() + err = kt.configureBuiltinPlugin(p, c, bpt) + if err != nil { + return nil, err + } + result = append(result, p) + return + }, + builtinhelpers.AnnotationsTransformer: func( + kt *KustTarget, bpt builtinhelpers.BuiltinPluginType, f tFactory, tc *builtinconfig.TransformerConfig) ( + result []resmap.Transformer, err error) { + var c struct { + Annotations map[string]string + FieldSpecs []types.FieldSpec + } + c.Annotations = kt.kustomization.CommonAnnotations + c.FieldSpecs = tc.CommonAnnotations + p := f() + err = kt.configureBuiltinPlugin(p, c, bpt) + if err != nil { + return nil, err + } + result = append(result, p) + return + }, + builtinhelpers.PrefixSuffixTransformer: func( + kt *KustTarget, bpt builtinhelpers.BuiltinPluginType, f tFactory, tc *builtinconfig.TransformerConfig) ( + result []resmap.Transformer, err error) { + var c struct { + Prefix string + Suffix string + FieldSpecs []types.FieldSpec + } + c.Prefix = kt.kustomization.NamePrefix + c.Suffix = kt.kustomization.NameSuffix + c.FieldSpecs = tc.NamePrefix + p := f() + err = kt.configureBuiltinPlugin(p, c, bpt) + if err != nil { + return nil, err + } + result = append(result, p) + return + }, + builtinhelpers.ImageTagTransformer: func( + kt *KustTarget, bpt builtinhelpers.BuiltinPluginType, f tFactory, tc *builtinconfig.TransformerConfig) ( + result []resmap.Transformer, err error) { + var c struct { + ImageTag types.Image + FieldSpecs []types.FieldSpec + } + for _, args := range kt.kustomization.Images { + c.ImageTag = args + c.FieldSpecs = tc.Images + p := f() + err = kt.configureBuiltinPlugin(p, c, bpt) + if err != nil { + return nil, err + } + result = append(result, p) + } + return + }, + builtinhelpers.ReplicaCountTransformer: func( + kt *KustTarget, bpt builtinhelpers.BuiltinPluginType, f tFactory, tc *builtinconfig.TransformerConfig) ( + result []resmap.Transformer, err error) { + var c struct { + Replica types.Replica + FieldSpecs []types.FieldSpec + } + for _, args := range kt.kustomization.Replicas { + c.Replica = args + c.FieldSpecs = tc.Replicas + p := f() + err = kt.configureBuiltinPlugin(p, c, bpt) + if err != nil { + return nil, err + } + result = append(result, p) + } + return + }, + // No kustomization file keyword for this yet. + builtinhelpers.ValueAddTransformer: func( + kt *KustTarget, bpt builtinhelpers.BuiltinPluginType, f tFactory, tc *builtinconfig.TransformerConfig) ( + result []resmap.Transformer, err error) { + return nil, fmt.Errorf("valueadd keyword not yet defined") + }, +} diff --git a/vendor/sigs.k8s.io/kustomize/api/internal/target/multitransformer.go b/vendor/sigs.k8s.io/kustomize/api/internal/target/multitransformer.go new file mode 100644 index 000000000000..1896bdf04748 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/internal/target/multitransformer.go @@ -0,0 +1,85 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package target + +import ( + "fmt" + + "sigs.k8s.io/kustomize/api/resmap" +) + +// multiTransformer contains a list of transformers. +type multiTransformer struct { + transformers []resmap.Transformer + checkConflictEnabled bool +} + +var _ resmap.Transformer = &multiTransformer{} + +// newMultiTransformer constructs a multiTransformer. +func newMultiTransformer(t []resmap.Transformer) resmap.Transformer { + r := &multiTransformer{ + transformers: make([]resmap.Transformer, len(t)), + checkConflictEnabled: false} + copy(r.transformers, t) + return r +} + +// Transform applies the member transformers in order to the resources, +// optionally detecting and erroring on commutation conflict. +func (o *multiTransformer) Transform(m resmap.ResMap) error { + if o.checkConflictEnabled { + return o.transformWithCheckConflict(m) + } + return o.transform(m) +} + +func (o *multiTransformer) transform(m resmap.ResMap) error { + for _, t := range o.transformers { + err := t.Transform(m) + if err != nil { + return err + } + } + for _, r := range m.Resources() { + empty, err := r.IsEmpty() + if err != nil { + return err + } + if empty { + err := m.Remove(r.CurId()) + if err != nil { + return err + } + } + } + return nil +} + +// Of the len(o.transformers)! possible transformer orderings, compare to a reversed order. +// A spot check to perform when the transformations are supposed to be commutative. +// Fail if there's a difference in the result. +func (o *multiTransformer) transformWithCheckConflict(m resmap.ResMap) error { + mcopy := m.DeepCopy() + err := o.transform(m) + if err != nil { + return err + } + o.reverseTransformers() + err = o.transform(mcopy) + if err != nil { + return err + } + err = m.ErrorIfNotEqualSets(mcopy) + if err != nil { + return fmt.Errorf("found conflict between different patches\n%v", err) + } + return nil +} + +func (o *multiTransformer) reverseTransformers() { + for i, j := 0, len(o.transformers)-1; i < j; i, j = i+1, j-1 { + o.transformers[i], o.transformers[j] = o.transformers[j], o.transformers[i] + } +} diff --git a/vendor/sigs.k8s.io/kustomize/api/internal/utils/errtimeout.go b/vendor/sigs.k8s.io/kustomize/api/internal/utils/errtimeout.go new file mode 100644 index 000000000000..24b8abe664c1 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/internal/utils/errtimeout.go @@ -0,0 +1,36 @@ +// Copyright 2020 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package utils + +import ( + "fmt" + "time" + + "github.com/pkg/errors" +) + +type errTimeOut struct { + duration time.Duration + cmd string +} + +func NewErrTimeOut(d time.Duration, c string) errTimeOut { + return errTimeOut{duration: d, cmd: c} +} + +func (e errTimeOut) Error() string { + return fmt.Sprintf("hit %s timeout running '%s'", e.duration, e.cmd) +} + +func IsErrTimeout(err error) bool { + if err == nil { + return false + } + _, ok := err.(errTimeOut) + if ok { + return true + } + _, ok = errors.Cause(err).(errTimeOut) + return ok +} diff --git a/vendor/sigs.k8s.io/kustomize/api/internal/utils/pathsplitter.go b/vendor/sigs.k8s.io/kustomize/api/internal/utils/pathsplitter.go new file mode 100644 index 000000000000..c8d2f3342ee3 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/internal/utils/pathsplitter.go @@ -0,0 +1,22 @@ +// Copyright 2021 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package utils + +import "strings" + +// PathSplitter splits a slash delimited string, permitting escaped slashes. +func PathSplitter(path string) []string { + ps := strings.Split(path, "/") + var res []string + res = append(res, ps[0]) + for i := 1; i < len(ps); i++ { + last := len(res) - 1 + if strings.HasSuffix(res[last], `\`) { + res[last] = strings.TrimSuffix(res[last], `\`) + "/" + ps[i] + } else { + res = append(res, ps[i]) + } + } + return res +} diff --git a/vendor/sigs.k8s.io/kustomize/api/internal/utils/timedcall.go b/vendor/sigs.k8s.io/kustomize/api/internal/utils/timedcall.go new file mode 100644 index 000000000000..0afadd0c3f23 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/internal/utils/timedcall.go @@ -0,0 +1,23 @@ +// Copyright 2020 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package utils + +import ( + "time" +) + +// TimedCall runs fn, failing if it doesn't complete in the given duration. +// The description is used in the timeout error message. +func TimedCall(description string, d time.Duration, fn func() error) error { + done := make(chan error) + timer := time.NewTimer(d) + defer timer.Stop() + go func() { done <- fn() }() + select { + case err := <-done: + return err + case <-timer.C: + return NewErrTimeOut(d, description) + } +} diff --git a/vendor/sigs.k8s.io/kustomize/api/internal/validate/fieldvalidator.go b/vendor/sigs.k8s.io/kustomize/api/internal/validate/fieldvalidator.go new file mode 100644 index 000000000000..5ccfc3ce7b4f --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/internal/validate/fieldvalidator.go @@ -0,0 +1,68 @@ +// Copyright 2020 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package validate + +import ( + "sigs.k8s.io/kustomize/api/ifc" +) + +// FieldValidator implements ifc.Validator to check +// the values of various KRM string fields, +// e.g. labels, annotations, names, namespaces. +// +// TODO: Have this use kyaml/yaml/internal/k8sgen/pkg/labels +// which has label and annotation validation code, but is internal +// so this impl would need to move to kyaml (a fine idea). +type FieldValidator struct { +} + +var _ ifc.Validator = (*FieldValidator)(nil) + +func NewFieldValidator() *FieldValidator { + return &FieldValidator{} +} + +// TODO(#FieldValidator): implement MakeAnnotationValidator +func (f FieldValidator) MakeAnnotationValidator() func(map[string]string) error { + return func(x map[string]string) error { + return nil + } +} + +// TODO(#FieldValidator): implement MakeAnnotationNameValidator +func (f FieldValidator) MakeAnnotationNameValidator() func([]string) error { + return func(x []string) error { + return nil + } +} + +// TODO(#FieldValidator): implement MakeLabelValidator +func (f FieldValidator) MakeLabelValidator() func(map[string]string) error { + return func(x map[string]string) error { + return nil + } +} + +// TODO(#FieldValidator): implement MakeLabelNameValidator +func (f FieldValidator) MakeLabelNameValidator() func([]string) error { + return func(x []string) error { + return nil + } +} + +// TODO(#FieldValidator): implement ValidateNamespace +func (f FieldValidator) ValidateNamespace(s string) []string { + var errs []string + return errs +} + +// TODO(#FieldValidator): implement ErrIfInvalidKey +func (f FieldValidator) ErrIfInvalidKey(s string) error { + return nil +} + +// TODO(#FieldValidator): implement IsEnvVarName +func (f FieldValidator) IsEnvVarName(k string) error { + return nil +} diff --git a/vendor/sigs.k8s.io/kustomize/api/internal/wrappy/factory.go b/vendor/sigs.k8s.io/kustomize/api/internal/wrappy/factory.go new file mode 100644 index 000000000000..b155ed3c66f1 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/internal/wrappy/factory.go @@ -0,0 +1,108 @@ +// Copyright 2020 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package wrappy + +import ( + "fmt" + + "sigs.k8s.io/kustomize/api/hasher" + "sigs.k8s.io/kustomize/api/ifc" + "sigs.k8s.io/kustomize/api/internal/generators" + "sigs.k8s.io/kustomize/api/konfig" + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/filtersutil" + "sigs.k8s.io/kustomize/kyaml/kio" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +// WNodeFactory makes instances of WNode. +// +// These instances in turn adapt +// sigs.k8s.io/kustomize/kyaml/yaml.RNode +// to implement ifc.Unstructured. +// This factory is meant to implement ifc.KunstructuredFactory. +// +// This implementation should be thin, as both WNode and WNodeFactory must be +// factored away (deleted) along with ifc.Kunstructured in favor of direct use +// of RNode methods upon completion of +// https://github.com/kubernetes-sigs/kustomize/issues/2506. +// +// See also api/krusty/internal/provider/depprovider.go +type WNodeFactory struct { +} + +var _ ifc.KunstructuredFactory = (*WNodeFactory)(nil) + +func (k *WNodeFactory) SliceFromBytes(bs []byte) ([]ifc.Kunstructured, error) { + yamlRNodes, err := kio.FromBytes(bs) + if err != nil { + return nil, err + } + var result []ifc.Kunstructured + for i := range yamlRNodes { + rn := yamlRNodes[i] + meta, err := rn.GetValidatedMetadata() + if err != nil { + return nil, err + } + if !shouldDropObject(meta) { + if foundNil, path := rn.HasNilEntryInList(); foundNil { + return nil, fmt.Errorf("empty item at %v in object %v", path, rn) + } + result = append(result, FromRNode(rn)) + } + } + return result, nil +} + +// shouldDropObject returns true if the resource should not be accumulated. +func shouldDropObject(m yaml.ResourceMeta) bool { + _, y := m.ObjectMeta.Annotations[konfig.IgnoredByKustomizeAnnotation] + return y +} + +func (k *WNodeFactory) FromMap(m map[string]interface{}) ifc.Kunstructured { + rn, err := FromMap(m) + if err != nil { + // TODO(#WNodeFactory): handle or bubble error" + panic(err) + } + return rn +} + +// kustHash computes a hash of an unstructured object. +type kustHash struct{} + +// Hash returns a hash of the given object +func (h *kustHash) Hash(m ifc.Kunstructured) (string, error) { + node, err := filtersutil.GetRNode(m) + if err != nil { + return "", err + } + return hasher.HashRNode(node) +} + +func (k *WNodeFactory) Hasher() ifc.KunstructuredHasher { + return &kustHash{} +} + +// MakeConfigMap makes a wrapped configmap. +func (k *WNodeFactory) MakeConfigMap( + ldr ifc.KvLoader, args *types.ConfigMapArgs) (ifc.Kunstructured, error) { + rn, err := generators.MakeConfigMap(ldr, args) + if err != nil { + return nil, err + } + return FromRNode(rn), nil +} + +// MakeSecret makes a wrapped secret. +func (k *WNodeFactory) MakeSecret( + ldr ifc.KvLoader, args *types.SecretArgs) (ifc.Kunstructured, error) { + rn, err := generators.MakeSecret(ldr, args) + if err != nil { + return nil, err + } + return FromRNode(rn), nil +} diff --git a/vendor/sigs.k8s.io/kustomize/api/internal/wrappy/wnode.go b/vendor/sigs.k8s.io/kustomize/api/internal/wrappy/wnode.go new file mode 100644 index 000000000000..81a35d1745f9 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/internal/wrappy/wnode.go @@ -0,0 +1,292 @@ +// Copyright 2020 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package wrappy + +import ( + "fmt" + "log" + "regexp" + "strconv" + "strings" + + "sigs.k8s.io/kustomize/api/ifc" + "sigs.k8s.io/kustomize/api/resid" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +// WNode implements ifc.Kunstructured using yaml.RNode. +// +// It exists only to help manage a switch from +// kunstruct.UnstructAdapter to yaml.RNode as the core +// representation of KRM objects in kustomize. +// +// It's got a silly name because we don't want it around for long, +// and want its use to be obvious. +type WNode struct { + node *yaml.RNode +} + +var _ ifc.Kunstructured = (*WNode)(nil) + +func NewWNode() *WNode { + return FromRNode(yaml.NewRNode(nil)) +} + +func FromMap(m map[string]interface{}) (*WNode, error) { + n, err := yaml.FromMap(m) + if err != nil { + return nil, err + } + return FromRNode(n), nil +} + +func FromRNode(node *yaml.RNode) *WNode { + return &WNode{node: node} +} + +func (wn *WNode) AsRNode() *yaml.RNode { + return wn.node +} + +func (wn *WNode) demandMetaData(label string) yaml.ResourceMeta { + meta, err := wn.node.GetMeta() + if err != nil { + // Log and die since interface doesn't allow error. + log.Fatalf("for %s', expected valid resource: %v", label, err) + } + return meta +} + +// Copy implements ifc.Kunstructured. +func (wn *WNode) Copy() ifc.Kunstructured { + return &WNode{node: wn.node.Copy()} +} + +// GetAnnotations implements ifc.Kunstructured. +func (wn *WNode) GetAnnotations() map[string]string { + return wn.demandMetaData("GetAnnotations").Annotations +} + +// convertSliceIndex traverses the items in `fields` and find +// if there is a slice index in the item and change it to a +// valid Lookup field path. For example, 'ports[0]' will be +// converted to 'ports' and '0'. +func convertSliceIndex(fields []string) []string { + var res []string + for _, s := range fields { + if !strings.HasSuffix(s, "]") { + res = append(res, s) + continue + } + re := regexp.MustCompile(`^(.*)\[(\d+)\]$`) + groups := re.FindStringSubmatch(s) + if len(groups) == 0 { + // no match, add to result + res = append(res, s) + continue + } + if groups[1] != "" { + res = append(res, groups[1]) + } + res = append(res, groups[2]) + } + return res +} + +// GetFieldValue implements ifc.Kunstructured. +func (wn *WNode) GetFieldValue(path string) (interface{}, error) { + fields := convertSliceIndex(strings.Split(path, ".")) + rn, err := wn.node.Pipe(yaml.Lookup(fields...)) + if err != nil { + return nil, err + } + if rn == nil { + return nil, NoFieldError{path} + } + yn := rn.YNode() + + // If this is an alias node, resolve it + if yn.Kind == yaml.AliasNode { + yn = yn.Alias + } + + // Return value as map for DocumentNode and MappingNode kinds + if yn.Kind == yaml.DocumentNode || yn.Kind == yaml.MappingNode { + var result map[string]interface{} + if err := yn.Decode(&result); err != nil { + return nil, err + } + return result, err + } + + // Return value as slice for SequenceNode kind + if yn.Kind == yaml.SequenceNode { + var result []interface{} + if err := yn.Decode(&result); err != nil { + return nil, err + } + return result, nil + } + if yn.Kind != yaml.ScalarNode { + return nil, fmt.Errorf("expected ScalarNode, got Kind=%d", yn.Kind) + } + + // TODO: When doing kustomize var replacement, which is likely a + // a primary use of this function and the reason it returns interface{} + // rather than string, we do conversion from Nodes to Go types and back + // to nodes. We should figure out how to do replacement using raw nodes, + // assuming we keep the var feature in kustomize. + // The other end of this is: refvar.go:updateNodeValue. + switch yn.Tag { + case yaml.NodeTagString: + return yn.Value, nil + case yaml.NodeTagInt: + return strconv.Atoi(yn.Value) + case yaml.NodeTagFloat: + return strconv.ParseFloat(yn.Value, 64) + case yaml.NodeTagBool: + return strconv.ParseBool(yn.Value) + default: + // Possibly this should be an error or log. + return yn.Value, nil + } +} + +// GetGvk implements ifc.Kunstructured. +func (wn *WNode) GetGvk() resid.Gvk { + meta := wn.demandMetaData("GetGvk") + g, v := resid.ParseGroupVersion(meta.APIVersion) + return resid.Gvk{Group: g, Version: v, Kind: meta.Kind} +} + +// GetDataMap implements ifc.Kunstructured. +func (wn *WNode) GetDataMap() map[string]string { + return wn.node.GetDataMap() +} + +// SetDataMap implements ifc.Kunstructured. +func (wn *WNode) SetDataMap(m map[string]string) { + wn.node.SetDataMap(m) +} + +// GetBinaryDataMap implements ifc.Kunstructured. +func (wn *WNode) GetBinaryDataMap() map[string]string { + return wn.node.GetBinaryDataMap() +} + +// SetBinaryDataMap implements ifc.Kunstructured. +func (wn *WNode) SetBinaryDataMap(m map[string]string) { + wn.node.SetBinaryDataMap(m) +} + +// GetKind implements ifc.Kunstructured. +func (wn *WNode) GetKind() string { + return wn.demandMetaData("GetKind").Kind +} + +// GetLabels implements ifc.Kunstructured. +func (wn *WNode) GetLabels() map[string]string { + return wn.demandMetaData("GetLabels").Labels +} + +// GetName implements ifc.Kunstructured. +func (wn *WNode) GetName() string { + return wn.demandMetaData("GetName").Name +} + +// GetSlice implements ifc.Kunstructured. +func (wn *WNode) GetSlice(path string) ([]interface{}, error) { + value, err := wn.GetFieldValue(path) + if err != nil { + return nil, err + } + if sliceValue, ok := value.([]interface{}); ok { + return sliceValue, nil + } + return nil, fmt.Errorf("node %s is not a slice", path) +} + +// GetSlice implements ifc.Kunstructured. +func (wn *WNode) GetString(path string) (string, error) { + value, err := wn.GetFieldValue(path) + if err != nil { + return "", err + } + if v, ok := value.(string); ok { + return v, nil + } + return "", fmt.Errorf("node %s is not a string: %v", path, value) +} + +// Map implements ifc.Kunstructured. +func (wn *WNode) Map() (map[string]interface{}, error) { + return wn.node.Map() +} + +// MarshalJSON implements ifc.Kunstructured. +func (wn *WNode) MarshalJSON() ([]byte, error) { + return wn.node.MarshalJSON() +} + +// MatchesAnnotationSelector implements ifc.Kunstructured. +func (wn *WNode) MatchesAnnotationSelector(selector string) (bool, error) { + return wn.node.MatchesAnnotationSelector(selector) +} + +// MatchesLabelSelector implements ifc.Kunstructured. +func (wn *WNode) MatchesLabelSelector(selector string) (bool, error) { + return wn.node.MatchesLabelSelector(selector) +} + +// SetAnnotations implements ifc.Kunstructured. +func (wn *WNode) SetAnnotations(annotations map[string]string) { + if err := wn.node.SetAnnotations(annotations); err != nil { + log.Fatal(err) // interface doesn't allow error. + } +} + +// SetGvk implements ifc.Kunstructured. +func (wn *WNode) SetGvk(gvk resid.Gvk) { + wn.setMapField(yaml.NewScalarRNode(gvk.Kind), yaml.KindField) + wn.setMapField(yaml.NewScalarRNode(gvk.ApiVersion()), yaml.APIVersionField) +} + +// SetLabels implements ifc.Kunstructured. +func (wn *WNode) SetLabels(labels map[string]string) { + if err := wn.node.SetLabels(labels); err != nil { + log.Fatal(err) // interface doesn't allow error. + } +} + +// SetName implements ifc.Kunstructured. +func (wn *WNode) SetName(name string) { + wn.setMapField(yaml.NewScalarRNode(name), yaml.MetadataField, yaml.NameField) +} + +// SetNamespace implements ifc.Kunstructured. +func (wn *WNode) SetNamespace(ns string) { + if err := wn.node.SetNamespace(ns); err != nil { + log.Fatal(err) // interface doesn't allow error. + } +} + +func (wn *WNode) setMapField(value *yaml.RNode, path ...string) { + if err := wn.node.SetMapField(value, path...); err != nil { + // Log and die since interface doesn't allow error. + log.Fatalf("failed to set field %v: %v", path, err) + } +} + +// UnmarshalJSON implements ifc.Kunstructured. +func (wn *WNode) UnmarshalJSON(data []byte) error { + return wn.node.UnmarshalJSON(data) +} + +type NoFieldError struct { + Field string +} + +func (e NoFieldError) Error() string { + return fmt.Sprintf("no field named '%s'", e.Field) +} diff --git a/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/commonannotations.go b/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/commonannotations.go new file mode 100644 index 000000000000..97c1d6b22d39 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/commonannotations.go @@ -0,0 +1,47 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package builtinpluginconsts + +const commonAnnotationFieldSpecs = ` +commonAnnotations: +- path: metadata/annotations + create: true + +- path: spec/template/metadata/annotations + create: true + version: v1 + kind: ReplicationController + +- path: spec/template/metadata/annotations + create: true + kind: Deployment + +- path: spec/template/metadata/annotations + create: true + kind: ReplicaSet + +- path: spec/template/metadata/annotations + create: true + kind: DaemonSet + +- path: spec/template/metadata/annotations + create: true + kind: StatefulSet + +- path: spec/template/metadata/annotations + create: true + group: batch + kind: Job + +- path: spec/jobTemplate/metadata/annotations + create: true + group: batch + kind: CronJob + +- path: spec/jobTemplate/spec/template/metadata/annotations + create: true + group: batch + kind: CronJob + +` diff --git a/vendor/sigs.k8s.io/kustomize/pkg/transformers/config/defaultconfig/commonlabels.go b/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/commonlabels.go similarity index 83% rename from vendor/sigs.k8s.io/kustomize/pkg/transformers/config/defaultconfig/commonlabels.go rename to vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/commonlabels.go index 66943c1ed002..7775a544ff6a 100644 --- a/vendor/sigs.k8s.io/kustomize/pkg/transformers/config/defaultconfig/commonlabels.go +++ b/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/commonlabels.go @@ -1,20 +1,7 @@ -/* -Copyright 2018 The Kubernetes Authors. +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package defaultconfig +package builtinpluginconsts const commonLabelFieldSpecs = ` commonLabels: @@ -64,6 +51,11 @@ commonLabels: group: apps kind: Deployment +- path: spec/template/spec/topologySpreadConstraints/labelSelector/matchLabels + create: false + group: apps + kind: Deployment + - path: spec/selector/matchLabels create: true kind: ReplicaSet @@ -110,7 +102,12 @@ commonLabels: group: apps kind: StatefulSet -- path: spec/volumeClaimTemplates/metadata/labels +- path: spec/template/spec/topologySpreadConstraints/labelSelector/matchLabels + create: false + group: apps + kind: StatefulSet + +- path: spec/volumeClaimTemplates[]/metadata/labels create: true group: apps kind: StatefulSet diff --git a/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/defaultconfig.go b/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/defaultconfig.go new file mode 100644 index 000000000000..435491ccdd50 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/defaultconfig.go @@ -0,0 +1,38 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package builtinpluginconsts + +import ( + "bytes" +) + +// GetDefaultFieldSpecs returns default fieldSpecs. +func GetDefaultFieldSpecs() []byte { + configData := [][]byte{ + []byte(namePrefixFieldSpecs), + []byte(commonLabelFieldSpecs), + []byte(commonAnnotationFieldSpecs), + []byte(namespaceFieldSpecs), + []byte(varReferenceFieldSpecs), + []byte(nameReferenceFieldSpecs), + []byte(imagesFieldSpecs), + []byte(replicasFieldSpecs), + } + return bytes.Join(configData, []byte("\n")) +} + +// GetDefaultFieldSpecsAsMap returns default fieldSpecs +// as a string->string map. +func GetDefaultFieldSpecsAsMap() map[string]string { + result := make(map[string]string) + result["nameprefix"] = namePrefixFieldSpecs + result["commonlabels"] = commonLabelFieldSpecs + result["commonannotations"] = commonAnnotationFieldSpecs + result["namespace"] = namespaceFieldSpecs + result["varreference"] = varReferenceFieldSpecs + result["namereference"] = nameReferenceFieldSpecs + result["images"] = imagesFieldSpecs + result["replicas"] = replicasFieldSpecs + return result +} diff --git a/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/doc.go b/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/doc.go new file mode 100644 index 000000000000..4b7b5faac56a --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/doc.go @@ -0,0 +1,8 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +// Package builtinpluginconsts provides builtin plugin +// configuration data. Builtin plugins can also be +// configured individually with plugin config files, +// in which case the constants in this package are ignored. +package builtinpluginconsts diff --git a/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/images.go b/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/images.go new file mode 100644 index 000000000000..b8d8bf1e387d --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/images.go @@ -0,0 +1,18 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package builtinpluginconsts + +const ( + imagesFieldSpecs = ` +images: +- path: spec/containers[]/image + create: true +- path: spec/initContainers[]/image + create: true +- path: spec/template/spec/containers[]/image + create: true +- path: spec/template/spec/initContainers[]/image + create: true +` +) diff --git a/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/nameprefix.go b/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/nameprefix.go new file mode 100644 index 000000000000..59a25a61fa9e --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/nameprefix.go @@ -0,0 +1,11 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package builtinpluginconsts + +const ( + namePrefixFieldSpecs = ` +namePrefix: +- path: metadata/name +` +) diff --git a/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/namereference.go b/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/namereference.go new file mode 100644 index 000000000000..a9af15706eb7 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/namereference.go @@ -0,0 +1,403 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package builtinpluginconsts + +// TODO: rename 'fieldSpecs' to 'referrers' for clarity. +// This will, however, break anyone using a custom config. + +const ( + nameReferenceFieldSpecs = ` +nameReference: +- kind: Deployment + fieldSpecs: + - path: spec/scaleTargetRef/name + kind: HorizontalPodAutoscaler + +- kind: ReplicationController + fieldSpecs: + - path: spec/scaleTargetRef/name + kind: HorizontalPodAutoscaler + +- kind: ReplicaSet + fieldSpecs: + - path: spec/scaleTargetRef/name + kind: HorizontalPodAutoscaler + +- kind: StatefulSet + fieldSpecs: + - path: spec/scaleTargetRef/name + kind: HorizontalPodAutoscaler + +- kind: ConfigMap + version: v1 + fieldSpecs: + - path: spec/volumes/configMap/name + version: v1 + kind: Pod + - path: spec/containers/env/valueFrom/configMapKeyRef/name + version: v1 + kind: Pod + - path: spec/initContainers/env/valueFrom/configMapKeyRef/name + version: v1 + kind: Pod + - path: spec/containers/envFrom/configMapRef/name + version: v1 + kind: Pod + - path: spec/initContainers/envFrom/configMapRef/name + version: v1 + kind: Pod + - path: spec/volumes/projected/sources/configMap/name + version: v1 + kind: Pod + - path: template/spec/volumes/configMap/name + kind: PodTemplate + - path: spec/template/spec/volumes/configMap/name + kind: Deployment + - path: spec/template/spec/containers/env/valueFrom/configMapKeyRef/name + kind: Deployment + - path: spec/template/spec/initContainers/env/valueFrom/configMapKeyRef/name + kind: Deployment + - path: spec/template/spec/containers/envFrom/configMapRef/name + kind: Deployment + - path: spec/template/spec/initContainers/envFrom/configMapRef/name + kind: Deployment + - path: spec/template/spec/volumes/projected/sources/configMap/name + kind: Deployment + - path: spec/template/spec/volumes/configMap/name + kind: ReplicaSet + - path: spec/template/spec/containers/env/valueFrom/configMapKeyRef/name + kind: ReplicaSet + - path: spec/template/spec/initContainers/env/valueFrom/configMapKeyRef/name + kind: ReplicaSet + - path: spec/template/spec/containers/envFrom/configMapRef/name + kind: ReplicaSet + - path: spec/template/spec/initContainers/envFrom/configMapRef/name + kind: ReplicaSet + - path: spec/template/spec/volumes/projected/sources/configMap/name + kind: ReplicaSet + - path: spec/template/spec/volumes/configMap/name + kind: DaemonSet + - path: spec/template/spec/containers/env/valueFrom/configMapKeyRef/name + kind: DaemonSet + - path: spec/template/spec/initContainers/env/valueFrom/configMapKeyRef/name + kind: DaemonSet + - path: spec/template/spec/containers/envFrom/configMapRef/name + kind: DaemonSet + - path: spec/template/spec/initContainers/envFrom/configMapRef/name + kind: DaemonSet + - path: spec/template/spec/volumes/projected/sources/configMap/name + kind: DaemonSet + - path: spec/template/spec/volumes/configMap/name + kind: StatefulSet + - path: spec/template/spec/containers/env/valueFrom/configMapKeyRef/name + kind: StatefulSet + - path: spec/template/spec/initContainers/env/valueFrom/configMapKeyRef/name + kind: StatefulSet + - path: spec/template/spec/containers/envFrom/configMapRef/name + kind: StatefulSet + - path: spec/template/spec/initContainers/envFrom/configMapRef/name + kind: StatefulSet + - path: spec/template/spec/volumes/projected/sources/configMap/name + kind: StatefulSet + - path: spec/template/spec/volumes/configMap/name + kind: Job + - path: spec/template/spec/containers/env/valueFrom/configMapKeyRef/name + kind: Job + - path: spec/template/spec/initContainers/env/valueFrom/configMapKeyRef/name + kind: Job + - path: spec/template/spec/containers/envFrom/configMapRef/name + kind: Job + - path: spec/template/spec/initContainers/envFrom/configMapRef/name + kind: Job + - path: spec/template/spec/volumes/projected/sources/configMap/name + kind: Job + - path: spec/jobTemplate/spec/template/spec/volumes/configMap/name + kind: CronJob + - path: spec/jobTemplate/spec/template/spec/volumes/projected/sources/configMap/name + kind: CronJob + - path: spec/jobTemplate/spec/template/spec/containers/env/valueFrom/configMapKeyRef/name + kind: CronJob + - path: spec/jobTemplate/spec/template/spec/initContainers/env/valueFrom/configMapKeyRef/name + kind: CronJob + - path: spec/jobTemplate/spec/template/spec/containers/envFrom/configMapRef/name + kind: CronJob + - path: spec/jobTemplate/spec/template/spec/initContainers/envFrom/configMapRef/name + kind: CronJob + - path: spec/configSource/configMap + kind: Node + - path: rules/resourceNames + kind: Role + - path: rules/resourceNames + kind: ClusterRole + - path: metadata/annotations/nginx.ingress.kubernetes.io\/fastcgi-params-configmap + kind: Ingress + +- kind: Secret + version: v1 + fieldSpecs: + - path: spec/volumes/secret/secretName + version: v1 + kind: Pod + - path: spec/containers/env/valueFrom/secretKeyRef/name + version: v1 + kind: Pod + - path: spec/initContainers/env/valueFrom/secretKeyRef/name + version: v1 + kind: Pod + - path: spec/containers/envFrom/secretRef/name + version: v1 + kind: Pod + - path: spec/initContainers/envFrom/secretRef/name + version: v1 + kind: Pod + - path: spec/imagePullSecrets/name + version: v1 + kind: Pod + - path: spec/volumes/projected/sources/secret/name + version: v1 + kind: Pod + - path: spec/template/spec/volumes/secret/secretName + kind: Deployment + - path: spec/template/spec/containers/env/valueFrom/secretKeyRef/name + kind: Deployment + - path: spec/template/spec/initContainers/env/valueFrom/secretKeyRef/name + kind: Deployment + - path: spec/template/spec/containers/envFrom/secretRef/name + kind: Deployment + - path: spec/template/spec/initContainers/envFrom/secretRef/name + kind: Deployment + - path: spec/template/spec/imagePullSecrets/name + kind: Deployment + - path: spec/template/spec/volumes/projected/sources/secret/name + kind: Deployment + - path: spec/template/spec/volumes/secret/secretName + kind: ReplicaSet + - path: spec/template/spec/containers/env/valueFrom/secretKeyRef/name + kind: ReplicaSet + - path: spec/template/spec/initContainers/env/valueFrom/secretKeyRef/name + kind: ReplicaSet + - path: spec/template/spec/containers/envFrom/secretRef/name + kind: ReplicaSet + - path: spec/template/spec/initContainers/envFrom/secretRef/name + kind: ReplicaSet + - path: spec/template/spec/imagePullSecrets/name + kind: ReplicaSet + - path: spec/template/spec/volumes/projected/sources/secret/name + kind: ReplicaSet + - path: spec/template/spec/volumes/secret/secretName + kind: DaemonSet + - path: spec/template/spec/containers/env/valueFrom/secretKeyRef/name + kind: DaemonSet + - path: spec/template/spec/initContainers/env/valueFrom/secretKeyRef/name + kind: DaemonSet + - path: spec/template/spec/containers/envFrom/secretRef/name + kind: DaemonSet + - path: spec/template/spec/initContainers/envFrom/secretRef/name + kind: DaemonSet + - path: spec/template/spec/imagePullSecrets/name + kind: DaemonSet + - path: spec/template/spec/volumes/projected/sources/secret/name + kind: DaemonSet + - path: spec/template/spec/volumes/secret/secretName + kind: StatefulSet + - path: spec/template/spec/containers/env/valueFrom/secretKeyRef/name + kind: StatefulSet + - path: spec/template/spec/initContainers/env/valueFrom/secretKeyRef/name + kind: StatefulSet + - path: spec/template/spec/containers/envFrom/secretRef/name + kind: StatefulSet + - path: spec/template/spec/initContainers/envFrom/secretRef/name + kind: StatefulSet + - path: spec/template/spec/imagePullSecrets/name + kind: StatefulSet + - path: spec/template/spec/volumes/projected/sources/secret/name + kind: StatefulSet + - path: spec/template/spec/volumes/secret/secretName + kind: Job + - path: spec/template/spec/containers/env/valueFrom/secretKeyRef/name + kind: Job + - path: spec/template/spec/initContainers/env/valueFrom/secretKeyRef/name + kind: Job + - path: spec/template/spec/containers/envFrom/secretRef/name + kind: Job + - path: spec/template/spec/initContainers/envFrom/secretRef/name + kind: Job + - path: spec/template/spec/imagePullSecrets/name + kind: Job + - path: spec/template/spec/volumes/projected/sources/secret/name + kind: Job + - path: spec/jobTemplate/spec/template/spec/volumes/secret/secretName + kind: CronJob + - path: spec/jobTemplate/spec/template/spec/volumes/projected/sources/secret/name + kind: CronJob + - path: spec/jobTemplate/spec/template/spec/containers/env/valueFrom/secretKeyRef/name + kind: CronJob + - path: spec/jobTemplate/spec/template/spec/initContainers/env/valueFrom/secretKeyRef/name + kind: CronJob + - path: spec/jobTemplate/spec/template/spec/containers/envFrom/secretRef/name + kind: CronJob + - path: spec/jobTemplate/spec/template/spec/initContainers/envFrom/secretRef/name + kind: CronJob + - path: spec/jobTemplate/spec/template/spec/imagePullSecrets/name + kind: CronJob + - path: spec/tls/secretName + kind: Ingress + - path: metadata/annotations/ingress.kubernetes.io\/auth-secret + kind: Ingress + - path: metadata/annotations/nginx.ingress.kubernetes.io\/auth-secret + kind: Ingress + - path: metadata/annotations/nginx.ingress.kubernetes.io\/auth-tls-secret + kind: Ingress + - path: spec/tls/secretName + kind: Ingress + - path: imagePullSecrets/name + kind: ServiceAccount + - path: parameters/secretName + kind: StorageClass + - path: parameters/adminSecretName + kind: StorageClass + - path: parameters/userSecretName + kind: StorageClass + - path: parameters/secretRef + kind: StorageClass + - path: rules/resourceNames + kind: Role + - path: rules/resourceNames + kind: ClusterRole + - path: spec/template/spec/containers/env/valueFrom/secretKeyRef/name + kind: Service + group: serving.knative.dev + version: v1 + - path: spec/azureFile/secretName + kind: PersistentVolume + +- kind: Service + version: v1 + fieldSpecs: + - path: spec/serviceName + kind: StatefulSet + group: apps + - path: spec/rules/http/paths/backend/serviceName + kind: Ingress + - path: spec/backend/serviceName + kind: Ingress + - path: spec/rules/http/paths/backend/service/name + kind: Ingress + - path: spec/defaultBackend/service/name + kind: Ingress + - path: spec/service/name + kind: APIService + group: apiregistration.k8s.io + - path: webhooks/clientConfig/service + kind: ValidatingWebhookConfiguration + group: admissionregistration.k8s.io + - path: webhooks/clientConfig/service + kind: MutatingWebhookConfiguration + group: admissionregistration.k8s.io + +- kind: Role + group: rbac.authorization.k8s.io + fieldSpecs: + - path: roleRef/name + kind: RoleBinding + group: rbac.authorization.k8s.io + +- kind: ClusterRole + group: rbac.authorization.k8s.io + fieldSpecs: + - path: roleRef/name + kind: RoleBinding + group: rbac.authorization.k8s.io + - path: roleRef/name + kind: ClusterRoleBinding + group: rbac.authorization.k8s.io + +- kind: ServiceAccount + version: v1 + fieldSpecs: + - path: subjects + kind: RoleBinding + group: rbac.authorization.k8s.io + - path: subjects + kind: ClusterRoleBinding + group: rbac.authorization.k8s.io + - path: spec/serviceAccountName + kind: Pod + - path: spec/template/spec/serviceAccountName + kind: StatefulSet + - path: spec/template/spec/serviceAccountName + kind: Deployment + - path: spec/template/spec/serviceAccountName + kind: ReplicationController + - path: spec/jobTemplate/spec/template/spec/serviceAccountName + kind: CronJob + - path: spec/template/spec/serviceAccountName + kind: Job + - path: spec/template/spec/serviceAccountName + kind: DaemonSet + +- kind: PersistentVolumeClaim + version: v1 + fieldSpecs: + - path: spec/volumes/persistentVolumeClaim/claimName + kind: Pod + - path: spec/template/spec/volumes/persistentVolumeClaim/claimName + kind: StatefulSet + - path: spec/template/spec/volumes/persistentVolumeClaim/claimName + kind: Deployment + - path: spec/template/spec/volumes/persistentVolumeClaim/claimName + kind: ReplicationController + - path: spec/jobTemplate/spec/template/spec/volumes/persistentVolumeClaim/claimName + kind: CronJob + - path: spec/template/spec/volumes/persistentVolumeClaim/claimName + kind: Job + - path: spec/template/spec/volumes/persistentVolumeClaim/claimName + kind: DaemonSet + +- kind: PersistentVolume + version: v1 + fieldSpecs: + - path: spec/volumeName + kind: PersistentVolumeClaim + - path: rules/resourceNames + kind: ClusterRole + +- kind: StorageClass + version: v1 + group: storage.k8s.io + fieldSpecs: + - path: spec/storageClassName + kind: PersistentVolume + - path: spec/storageClassName + kind: PersistentVolumeClaim + - path: spec/volumeClaimTemplates/spec/storageClassName + kind: StatefulSet + +- kind: PriorityClass + version: v1 + group: scheduling.k8s.io + fieldSpecs: + - path: spec/priorityClassName + kind: Pod + - path: spec/template/spec/priorityClassName + kind: StatefulSet + - path: spec/template/spec/priorityClassName + kind: Deployment + - path: spec/template/spec/priorityClassName + kind: ReplicationController + - path: spec/jobTemplate/spec/template/spec/priorityClassName + kind: CronJob + - path: spec/template/spec/priorityClassName + kind: Job + - path: spec/template/spec/priorityClassName + kind: DaemonSet + +- kind: IngressClass + version: v1 + group: networking.k8s.io/v1 + fieldSpecs: + - path: spec/ingressClassName + kind: Ingress +` +) diff --git a/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/namespace.go b/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/namespace.go new file mode 100644 index 000000000000..2a922b25a82c --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/namespace.go @@ -0,0 +1,23 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package builtinpluginconsts + +const ( + namespaceFieldSpecs = ` +namespace: +- path: metadata/namespace + create: true +- path: metadata/name + kind: Namespace + create: true +- path: subjects + kind: RoleBinding +- path: subjects + kind: ClusterRoleBinding +- path: spec/service/namespace + group: apiregistration.k8s.io + kind: APIService + create: true +` +) diff --git a/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/replicas.go b/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/replicas.go new file mode 100644 index 000000000000..76549c21faed --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/replicas.go @@ -0,0 +1,23 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package builtinpluginconsts + +const replicasFieldSpecs = ` +replicas: +- path: spec/replicas + create: true + kind: Deployment + +- path: spec/replicas + create: true + kind: ReplicationController + +- path: spec/replicas + create: true + kind: ReplicaSet + +- path: spec/replicas + create: true + kind: StatefulSet +` diff --git a/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/varreference.go b/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/varreference.go new file mode 100644 index 000000000000..f4011d825df9 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts/varreference.go @@ -0,0 +1,223 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package builtinpluginconsts + +const ( + varReferenceFieldSpecs = ` +varReference: +- path: spec/jobTemplate/spec/template/spec/containers/args + kind: CronJob + +- path: spec/jobTemplate/spec/template/spec/containers/command + kind: CronJob + +- path: spec/jobTemplate/spec/template/spec/containers/env/value + kind: CronJob + +- path: spec/jobTemplate/spec/template/spec/containers/volumeMounts/mountPath + kind: CronJob + +- path: spec/jobTemplate/spec/template/spec/initContainers/args + kind: CronJob + +- path: spec/jobTemplate/spec/template/spec/initContainers/command + kind: CronJob + +- path: spec/jobTemplate/spec/template/spec/initContainers/env/value + kind: CronJob + +- path: spec/jobTemplate/spec/template/spec/initContainers/volumeMounts/mountPath + kind: CronJob + +- path: spec/jobTemplate/spec/template/volumes/nfs/server + kind: CronJob + +- path: spec/template/spec/containers/args + kind: DaemonSet + +- path: spec/template/spec/containers/command + kind: DaemonSet + +- path: spec/template/spec/containers/env/value + kind: DaemonSet + +- path: spec/template/spec/containers/volumeMounts/mountPath + kind: DaemonSet + +- path: spec/template/spec/initContainers/args + kind: DaemonSet + +- path: spec/template/spec/initContainers/command + kind: DaemonSet + +- path: spec/template/spec/initContainers/env/value + kind: DaemonSet + +- path: spec/template/spec/initContainers/volumeMounts/mountPath + kind: DaemonSet + +- path: spec/template/spec/volumes/nfs/server + kind: DaemonSet + +- path: spec/template/spec/containers/args + kind: Deployment + +- path: spec/template/spec/containers/command + kind: Deployment + +- path: spec/template/spec/containers/env/value + kind: Deployment + +- path: spec/template/spec/containers/volumeMounts/mountPath + kind: Deployment + +- path: spec/template/spec/initContainers/args + kind: Deployment + +- path: spec/template/spec/initContainers/command + kind: Deployment + +- path: spec/template/spec/initContainers/env/value + kind: Deployment + +- path: spec/template/spec/initContainers/volumeMounts/mountPath + kind: Deployment + +- path: spec/template/spec/volumes/nfs/server + kind: Deployment + +- path: spec/template/metadata/annotations + kind: Deployment + +- path: spec/rules/host + kind: Ingress + +- path: spec/tls/hosts + kind: Ingress + +- path: spec/tls/secretName + kind: Ingress + +- path: spec/template/spec/containers/args + kind: Job + +- path: spec/template/spec/containers/command + kind: Job + +- path: spec/template/spec/containers/env/value + kind: Job + +- path: spec/template/spec/containers/volumeMounts/mountPath + kind: Job + +- path: spec/template/spec/initContainers/args + kind: Job + +- path: spec/template/spec/initContainers/command + kind: Job + +- path: spec/template/spec/initContainers/env/value + kind: Job + +- path: spec/template/spec/initContainers/volumeMounts/mountPath + kind: Job + +- path: spec/template/spec/volumes/nfs/server + kind: Job + +- path: spec/containers/args + kind: Pod + +- path: spec/containers/command + kind: Pod + +- path: spec/containers/env/value + kind: Pod + +- path: spec/containers/volumeMounts/mountPath + kind: Pod + +- path: spec/initContainers/args + kind: Pod + +- path: spec/initContainers/command + kind: Pod + +- path: spec/initContainers/env/value + kind: Pod + +- path: spec/initContainers/volumeMounts/mountPath + kind: Pod + +- path: spec/volumes/nfs/server + kind: Pod + +- path: spec/template/spec/containers/args + kind: ReplicaSet + +- path: spec/template/spec/containers/command + kind: ReplicaSet + +- path: spec/template/spec/containers/env/value + kind: ReplicaSet + +- path: spec/template/spec/containers/volumeMounts/mountPath + kind: ReplicaSet + +- path: spec/template/spec/initContainers/args + kind: ReplicaSet + +- path: spec/template/spec/initContainers/command + kind: ReplicaSet + +- path: spec/template/spec/initContainers/env/value + kind: ReplicaSet + +- path: spec/template/spec/initContainers/volumeMounts/mountPath + kind: ReplicaSet + +- path: spec/template/spec/volumes/nfs/server + kind: ReplicaSet + +- path: spec/ports/port + kind: Service + +- path: spec/ports/targetPort + kind: Service + +- path: spec/template/spec/containers/args + kind: StatefulSet + +- path: spec/template/spec/containers/command + kind: StatefulSet + +- path: spec/template/spec/containers/env/value + kind: StatefulSet + +- path: spec/template/spec/containers/volumeMounts/mountPath + kind: StatefulSet + +- path: spec/template/spec/initContainers/args + kind: StatefulSet + +- path: spec/template/spec/initContainers/command + kind: StatefulSet + +- path: spec/template/spec/initContainers/env/value + kind: StatefulSet + +- path: spec/template/spec/initContainers/volumeMounts/mountPath + kind: StatefulSet + +- path: spec/volumeClaimTemplates/spec/nfs/server + kind: StatefulSet + +- path: spec/nfs/server + kind: PersistentVolume + +- path: metadata/labels + +- path: metadata/annotations +` +) diff --git a/vendor/sigs.k8s.io/kustomize/api/konfig/doc.go b/vendor/sigs.k8s.io/kustomize/api/konfig/doc.go new file mode 100644 index 000000000000..44f659afba66 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/konfig/doc.go @@ -0,0 +1,6 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +// Package konfig provides configuration methods and constants +// for the kustomize API. +package konfig diff --git a/vendor/sigs.k8s.io/kustomize/api/konfig/general.go b/vendor/sigs.k8s.io/kustomize/api/konfig/general.go new file mode 100644 index 000000000000..40167bae09b6 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/konfig/general.go @@ -0,0 +1,72 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package konfig + +// RecognizedKustomizationFileNames is a list of file names +// that kustomize recognizes. +// To avoid ambiguity, a kustomization directory may not +// contain more than one match to this list. +func RecognizedKustomizationFileNames() []string { + return []string{ + "kustomization.yaml", + "kustomization.yml", + "Kustomization", + } +} + +func DefaultKustomizationFileName() string { + return RecognizedKustomizationFileNames()[0] +} + +// IfApiMachineryElseKyaml returns true if executing the apimachinery code +// path, else we're executing the kyaml code paths. +func IfApiMachineryElseKyaml(s1, s2 string) string { + if !FlagEnableKyamlDefaultValue { + return s1 + } + return s2 +} + +const ( + // FlagEnableKyamlDefaultValue is the default value for the --enable_kyaml + // flag. This value is also used in unit tests. See provider.DepProvider. + // + // TODO(#3588): Delete this constant. + // + // All tests should pass for either true or false values + // of this constant, without having to check its value. + // In the cases where there's a different outcome, either decide + // that the difference is acceptable, or make the difference go away. + // + // Historically, tests passed for enable_kyaml == false, i.e. using + // apimachinery libs. This doesn't mean the code was better, it just + // means regression tests preserved those outcomes. + FlagEnableKyamlDefaultValue = true + + // An environment variable to consult for kustomization + // configuration data. See: + // https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html + XdgConfigHomeEnv = "XDG_CONFIG_HOME" + + // Use this when XdgConfigHomeEnv not defined. + XdgConfigHomeEnvDefault = ".config" + + // A program name, for use in help, finding the XDG_CONFIG_DIR, etc. + ProgramName = "kustomize" + + // ConfigAnnoDomain is configuration-related annotation namespace. + ConfigAnnoDomain = "config.kubernetes.io" + + // If a resource has this annotation, kustomize will drop it. + IgnoredByKustomizeAnnotation = ConfigAnnoDomain + "/local-config" + + // Label key that indicates the resources are built from Kustomize + ManagedbyLabelKey = "app.kubernetes.io/managed-by" + + // An environment variable to turn on/off adding the ManagedByLabelKey + EnableManagedbyLabelEnv = "KUSTOMIZE_ENABLE_MANAGEDBY_LABEL" + + // Label key that indicates the resources are validated by a validator + ValidatedByLabelKey = "validated-by" +) diff --git a/vendor/sigs.k8s.io/kustomize/api/konfig/plugins.go b/vendor/sigs.k8s.io/kustomize/api/konfig/plugins.go new file mode 100644 index 000000000000..a42e5e296af0 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/konfig/plugins.go @@ -0,0 +1,159 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package konfig + +import ( + "os" + "path/filepath" + "runtime" + + "sigs.k8s.io/kustomize/api/filesys" + "sigs.k8s.io/kustomize/api/types" +) + +const ( + // Symbol that must be used inside Go plugins. + PluginSymbol = "KustomizePlugin" + + // Name of environment variable used to set AbsPluginHome. + // See that variable for an explanation. + KustomizePluginHomeEnv = "KUSTOMIZE_PLUGIN_HOME" + + // Relative path below XDG_CONFIG_HOME/kustomize to find plugins. + // e.g. AbsPluginHome = XDG_CONFIG_HOME/kustomize/plugin + RelPluginHome = "plugin" + + // Location of builtin plugins below AbsPluginHome. + BuiltinPluginPackage = "builtin" + + // The value of kubernetes ApiVersion to use in configuration + // files for builtin plugins. + // The value for non-builtins can be anything. + BuiltinPluginApiVersion = BuiltinPluginPackage + + // Domain from which kustomize code is imported, for locating + // plugin source code under $GOPATH when GOPATH is defined. + DomainName = "sigs.k8s.io" + + // Injected into plugin paths when plugins are disabled. + // Provides a clue in flows that shouldn't happen. + NoPluginHomeSentinal = "/No/non-builtin/plugins!" +) + +func EnabledPluginConfig(b types.BuiltinPluginLoadingOptions) (*types.PluginConfig, error) { + dir, err := DefaultAbsPluginHome(filesys.MakeFsOnDisk()) + if err != nil { + return nil, err + } + return MakePluginConfig(types.PluginRestrictionsNone, b, dir), nil +} + +func DisabledPluginConfig() *types.PluginConfig { + return MakePluginConfig( + types.PluginRestrictionsBuiltinsOnly, + types.BploUseStaticallyLinked, + NoPluginHomeSentinal) +} + +func MakePluginConfig( + pr types.PluginRestrictions, + b types.BuiltinPluginLoadingOptions, + home string) *types.PluginConfig { + return &types.PluginConfig{ + PluginRestrictions: pr, + AbsPluginHome: home, + BpLoadingOptions: b, + } +} + +type NotedFunc struct { + Note string + F func() string +} + +// DefaultAbsPluginHome returns the absolute path in the given file +// system to first directory that looks like a good candidate for +// the home of kustomize plugins. +func DefaultAbsPluginHome(fSys filesys.FileSystem) (string, error) { + return FirstDirThatExistsElseError( + "plugin home directory", fSys, []NotedFunc{ + { + Note: "homed in $" + KustomizePluginHomeEnv, + F: func() string { + return os.Getenv(KustomizePluginHomeEnv) + }, + }, + { + Note: "homed in $" + XdgConfigHomeEnv, + F: func() string { + return filepath.Join( + os.Getenv(XdgConfigHomeEnv), + ProgramName, RelPluginHome) + }, + }, + { + Note: "homed in default value of $" + XdgConfigHomeEnv, + F: func() string { + return filepath.Join( + HomeDir(), XdgConfigHomeEnvDefault, + ProgramName, RelPluginHome) + }, + }, + { + Note: "homed in home directory", + F: func() string { + return filepath.Join( + HomeDir(), ProgramName, RelPluginHome) + }, + }, + }) +} + +// FirstDirThatExistsElseError tests different path functions for +// existence, returning the first that works, else error if all fail. +func FirstDirThatExistsElseError( + what string, + fSys filesys.FileSystem, + pathFuncs []NotedFunc) (string, error) { + var nope []types.Pair + for _, dt := range pathFuncs { + dir := dt.F() + if fSys.Exists(dir) { + return dir, nil + } + nope = append(nope, types.Pair{Key: dt.Note, Value: dir}) + } + return "", types.NewErrUnableToFind(what, nope) +} + +func HomeDir() string { + home := os.Getenv(homeEnv()) + if len(home) > 0 { + return home + } + return "~" +} + +func homeEnv() string { + if runtime.GOOS == "windows" { + return "USERPROFILE" + } + return "HOME" +} + +func CurrentWorkingDir() string { + // Try for full path first to be explicit. + pwd := os.Getenv(pwdEnv()) + if len(pwd) > 0 { + return pwd + } + return filesys.SelfDir +} + +func pwdEnv() string { + if runtime.GOOS == "windows" { + return "CD" + } + return "PWD" +} diff --git a/vendor/sigs.k8s.io/kustomize/api/krusty/doc.go b/vendor/sigs.k8s.io/kustomize/api/krusty/doc.go new file mode 100644 index 000000000000..bf516ca94b56 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/krusty/doc.go @@ -0,0 +1,11 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +// Package krusty is intended as the entry point package +// for those seeking to add kustomize ability to other +// programs. +// +// To use, follow the example of the kustomize CLI's 'build' +// command. Also, see the high level tests in this package, +// which serve a dual purpose as examples. +package krusty diff --git a/vendor/sigs.k8s.io/kustomize/api/krusty/kustomizer.go b/vendor/sigs.k8s.io/kustomize/api/krusty/kustomizer.go new file mode 100644 index 000000000000..8120f9351f63 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/krusty/kustomizer.go @@ -0,0 +1,110 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package krusty + +import ( + "fmt" + "path/filepath" + + "sigs.k8s.io/kustomize/api/builtins" + "sigs.k8s.io/kustomize/api/filesys" + pLdr "sigs.k8s.io/kustomize/api/internal/plugins/loader" + "sigs.k8s.io/kustomize/api/internal/target" + "sigs.k8s.io/kustomize/api/konfig" + fLdr "sigs.k8s.io/kustomize/api/loader" + "sigs.k8s.io/kustomize/api/provenance" + "sigs.k8s.io/kustomize/api/provider" + "sigs.k8s.io/kustomize/api/resmap" + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/openapi" +) + +// Kustomizer performs kustomizations. +// +// It's meant to behave similarly to the kustomize CLI, and can be +// used instead of performing an exec to a kustomize CLI subprocess. +// To use, load a filesystem with kustomization files (any +// number of overlays and bases), then make a Kustomizer +// injected with the given fileystem, then call Run. +type Kustomizer struct { + options *Options + depProvider *provider.DepProvider +} + +// MakeKustomizer returns an instance of Kustomizer. +func MakeKustomizer(o *Options) *Kustomizer { + return &Kustomizer{ + options: o, + depProvider: provider.NewDepProvider(o.UseKyaml), + } +} + +// Run performs a kustomization. +// +// It reads given path from the given file system, interprets it as +// a kustomization.yaml file, perform the kustomization it represents, +// and return the resulting resources. +// +// Any files referenced by the kustomization must be present on the +// filesystem. One may call Run any number of times, on any number +// of internal paths (e.g. the filesystem may contain multiple overlays, +// and Run can be called on each of them). +func (b *Kustomizer) Run( + fSys filesys.FileSystem, path string) (resmap.ResMap, error) { + resmapFactory := resmap.NewFactory( + b.depProvider.GetResourceFactory(), + b.depProvider.GetConflictDetectorFactory()) + lr := fLdr.RestrictionNone + if b.options.LoadRestrictions == types.LoadRestrictionsRootOnly { + lr = fLdr.RestrictionRootOnly + } + ldr, err := fLdr.NewLoader(lr, path, fSys) + if err != nil { + return nil, err + } + defer ldr.Cleanup() + kt := target.NewKustTarget( + ldr, + b.depProvider.GetFieldValidator(), + resmapFactory, + pLdr.NewLoader(b.options.PluginConfig, resmapFactory), + ) + err = kt.Load() + if err != nil { + return nil, err + } + var bytes []byte + if openApiPath, exists := kt.Kustomization().OpenAPI["path"]; exists { + bytes, err = ldr.Load(filepath.Join(ldr.Root(), openApiPath)) + if err != nil { + return nil, err + } + } + err = openapi.SetSchema(kt.Kustomization().OpenAPI, bytes, true) + if err != nil { + return nil, err + } + var m resmap.ResMap + m, err = kt.MakeCustomizedResMap() + if err != nil { + return nil, err + } + if b.options.DoLegacyResourceSort { + builtins.NewLegacyOrderTransformerPlugin().Transform(m) + } + if b.options.AddManagedbyLabel { + t := builtins.LabelTransformerPlugin{ + Labels: map[string]string{ + konfig.ManagedbyLabelKey: fmt.Sprintf( + "kustomize-%s", provenance.GetProvenance().Semver())}, + FieldSpecs: []types.FieldSpec{{ + Path: "metadata/labels", + CreateIfNotPresent: true, + }}, + } + t.Transform(m) + } + m.RemoveBuildAnnotations() + return m, nil +} diff --git a/vendor/sigs.k8s.io/kustomize/api/krusty/options.go b/vendor/sigs.k8s.io/kustomize/api/krusty/options.go new file mode 100644 index 000000000000..91d7fac053f6 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/krusty/options.go @@ -0,0 +1,77 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package krusty + +import ( + "sigs.k8s.io/kustomize/api/internal/plugins/builtinhelpers" + "sigs.k8s.io/kustomize/api/konfig" + "sigs.k8s.io/kustomize/api/types" +) + +// Options holds high-level kustomize configuration options, +// e.g. are plugins enabled, should the loader be restricted +// to the kustomization root, etc. +type Options struct { + // When true, sort the resources before emitting them, + // per a particular sort order. When false, don't do the + // sort, and instead respect the depth-first resource input + // order as specified by the kustomization file(s). + DoLegacyResourceSort bool + + // When true, a label + // app.kubernetes.io/managed-by: kustomize- + // is added to all the resources in the build out. + AddManagedbyLabel bool + + // Restrictions on what can be loaded from the file system. + // See type definition. + LoadRestrictions types.LoadRestrictions + + // Create an inventory object for pruning. + DoPrune bool + + // Options related to kustomize plugins. + PluginConfig *types.PluginConfig + + // TODO(#3588): Delete this field (it's always true). + // When true, use kyaml/ packages to manipulate KRM yaml. + // When false, use k8sdeps/ instead (uses k8s.io/api* packages). + UseKyaml bool + + // When true, allow name and kind changing via a patch + // When false, patch name/kind don't overwrite target name/kind + AllowResourceIdChanges bool +} + +// MakeDefaultOptions returns a default instance of Options. +func MakeDefaultOptions() *Options { + return &Options{ + DoLegacyResourceSort: false, + AddManagedbyLabel: false, + LoadRestrictions: types.LoadRestrictionsRootOnly, + DoPrune: false, + PluginConfig: konfig.DisabledPluginConfig(), + UseKyaml: konfig.FlagEnableKyamlDefaultValue, + AllowResourceIdChanges: false, + } +} + +func (o Options) IfApiMachineryElseKyaml(s1, s2 string) string { + if !o.UseKyaml { + return s1 + } + return s2 +} + +// GetBuiltinPluginNames returns a list of builtin plugin names +func GetBuiltinPluginNames() []string { + var ret []string + for k := range builtinhelpers.GeneratorFactories { + ret = append(ret, k.String()) + } + for k := range builtinhelpers.TransformerFactories { + ret = append(ret, k.String()) + } + return ret +} diff --git a/vendor/sigs.k8s.io/kustomize/api/kv/kv.go b/vendor/sigs.k8s.io/kustomize/api/kv/kv.go new file mode 100644 index 000000000000..b887e583c822 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/kv/kv.go @@ -0,0 +1,213 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package kv + +import ( + "bufio" + "bytes" + "fmt" + "os" + "path" + "strings" + "unicode" + "unicode/utf8" + + "github.com/pkg/errors" + "sigs.k8s.io/kustomize/api/ifc" + "sigs.k8s.io/kustomize/api/types" +) + +var utf8bom = []byte{0xEF, 0xBB, 0xBF} + +// loader reads and validates KV pairs. +type loader struct { + // Used to read the filesystem. + ldr ifc.Loader + + // Used to validate various k8s data fields. + validator ifc.Validator +} + +func NewLoader(ldr ifc.Loader, v ifc.Validator) ifc.KvLoader { + return &loader{ldr: ldr, validator: v} +} + +func (kvl *loader) Validator() ifc.Validator { + return kvl.validator +} + +func (kvl *loader) Load( + args types.KvPairSources) (all []types.Pair, err error) { + pairs, err := kvl.keyValuesFromEnvFiles(args.EnvSources) + if err != nil { + return nil, errors.Wrap(err, fmt.Sprintf( + "env source files: %v", + args.EnvSources)) + } + all = append(all, pairs...) + + pairs, err = keyValuesFromLiteralSources(args.LiteralSources) + if err != nil { + return nil, errors.Wrap(err, fmt.Sprintf( + "literal sources %v", args.LiteralSources)) + } + all = append(all, pairs...) + + pairs, err = kvl.keyValuesFromFileSources(args.FileSources) + if err != nil { + return nil, errors.Wrap(err, fmt.Sprintf( + "file sources: %v", args.FileSources)) + } + return append(all, pairs...), nil +} + +func keyValuesFromLiteralSources(sources []string) ([]types.Pair, error) { + var kvs []types.Pair + for _, s := range sources { + k, v, err := parseLiteralSource(s) + if err != nil { + return nil, err + } + kvs = append(kvs, types.Pair{Key: k, Value: v}) + } + return kvs, nil +} + +func (kvl *loader) keyValuesFromFileSources(sources []string) ([]types.Pair, error) { + var kvs []types.Pair + for _, s := range sources { + k, fPath, err := parseFileSource(s) + if err != nil { + return nil, err + } + content, err := kvl.ldr.Load(fPath) + if err != nil { + return nil, err + } + kvs = append(kvs, types.Pair{Key: k, Value: string(content)}) + } + return kvs, nil +} + +func (kvl *loader) keyValuesFromEnvFiles(paths []string) ([]types.Pair, error) { + var kvs []types.Pair + for _, p := range paths { + content, err := kvl.ldr.Load(p) + if err != nil { + return nil, err + } + more, err := kvl.keyValuesFromLines(content) + if err != nil { + return nil, err + } + kvs = append(kvs, more...) + } + return kvs, nil +} + +// keyValuesFromLines parses given content in to a list of key-value pairs. +func (kvl *loader) keyValuesFromLines(content []byte) ([]types.Pair, error) { + var kvs []types.Pair + + scanner := bufio.NewScanner(bytes.NewReader(content)) + currentLine := 0 + for scanner.Scan() { + // Process the current line, retrieving a key/value pair if + // possible. + scannedBytes := scanner.Bytes() + kv, err := kvl.keyValuesFromLine(scannedBytes, currentLine) + if err != nil { + return nil, err + } + currentLine++ + + if len(kv.Key) == 0 { + // no key means line was empty or a comment + continue + } + + kvs = append(kvs, kv) + } + return kvs, nil +} + +// KeyValuesFromLine returns a kv with blank key if the line is empty or a comment. +// The value will be retrieved from the environment if necessary. +func (kvl *loader) keyValuesFromLine(line []byte, currentLine int) (types.Pair, error) { + kv := types.Pair{} + + if !utf8.Valid(line) { + return kv, fmt.Errorf("line %d has invalid utf8 bytes : %v", line, string(line)) + } + + // We trim UTF8 BOM from the first line of the file but no others + if currentLine == 0 { + line = bytes.TrimPrefix(line, utf8bom) + } + + // trim the line from all leading whitespace first + line = bytes.TrimLeftFunc(line, unicode.IsSpace) + + // If the line is empty or a comment, we return a blank key/value pair. + if len(line) == 0 || line[0] == '#' { + return kv, nil + } + + data := strings.SplitN(string(line), "=", 2) + key := data[0] + if err := kvl.validator.IsEnvVarName(key); err != nil { + return kv, err + } + + if len(data) == 2 { + kv.Value = data[1] + } else { + // No value (no `=` in the line) is a signal to obtain the value + // from the environment. + kv.Value = os.Getenv(key) + } + kv.Key = key + return kv, nil +} + +// ParseFileSource parses the source given. +// +// Acceptable formats include: +// 1. source-path: the basename will become the key name +// 2. source-name=source-path: the source-name will become the key name and +// source-path is the path to the key file. +// +// Key names cannot include '='. +func parseFileSource(source string) (keyName, filePath string, err error) { + numSeparators := strings.Count(source, "=") + switch { + case numSeparators == 0: + return path.Base(source), source, nil + case numSeparators == 1 && strings.HasPrefix(source, "="): + return "", "", fmt.Errorf("key name for file path %v missing", strings.TrimPrefix(source, "=")) + case numSeparators == 1 && strings.HasSuffix(source, "="): + return "", "", fmt.Errorf("file path for key name %v missing", strings.TrimSuffix(source, "=")) + case numSeparators > 1: + return "", "", errors.New("key names or file paths cannot contain '='") + default: + components := strings.Split(source, "=") + return components[0], components[1], nil + } +} + +// ParseLiteralSource parses the source key=val pair into its component pieces. +// This functionality is distinguished from strings.SplitN(source, "=", 2) since +// it returns an error in the case of empty keys, values, or a missing equals sign. +func parseLiteralSource(source string) (keyName, value string, err error) { + // leading equal is invalid + if strings.Index(source, "=") == 0 { + return "", "", fmt.Errorf("invalid literal source %v, expected key=value", source) + } + // split after the first equal (so values can have the = character) + items := strings.SplitN(source, "=", 2) + if len(items) != 2 { + return "", "", fmt.Errorf("invalid literal source %v, expected key=value", source) + } + return items[0], strings.Trim(items[1], "\"'"), nil +} diff --git a/vendor/sigs.k8s.io/kustomize/api/loader/fileloader.go b/vendor/sigs.k8s.io/kustomize/api/loader/fileloader.go new file mode 100644 index 000000000000..9e8412de4c7e --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/loader/fileloader.go @@ -0,0 +1,336 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package loader + +import ( + "fmt" + "io/ioutil" + "log" + "net/http" + "net/url" + "path/filepath" + "strings" + + "sigs.k8s.io/kustomize/api/filesys" + "sigs.k8s.io/kustomize/api/ifc" + "sigs.k8s.io/kustomize/api/internal/git" +) + +// fileLoader is a kustomization's interface to files. +// +// The directory in which a kustomization file sits +// is referred to below as the kustomization's _root_. +// +// An instance of fileLoader has an immutable root, +// and offers a `New` method returning a new loader +// with a new root. +// +// A kustomization file refers to two kinds of files: +// +// * supplemental data paths +// +// `Load` is used to visit these paths. +// +// These paths refer to resources, patches, +// data for ConfigMaps and Secrets, etc. +// +// The loadRestrictor may disallow certain paths +// or classes of paths. +// +// * bases (other kustomizations) +// +// `New` is used to load bases. +// +// A base can be either a remote git repo URL, or +// a directory specified relative to the current +// root. In the former case, the repo is locally +// cloned, and the new loader is rooted on a path +// in that clone. +// +// As loaders create new loaders, a root history +// is established, and used to disallow: +// +// - A base that is a repository that, in turn, +// specifies a base repository seen previously +// in the loading stack (a cycle). +// +// - An overlay depending on a base positioned at +// or above it. I.e. '../foo' is OK, but '.', +// '..', '../..', etc. are disallowed. Allowing +// such a base has no advantages and encourages +// cycles, particularly if some future change +// were to introduce globbing to file +// specifications in the kustomization file. +// +// These restrictions assure that kustomizations +// are self-contained and relocatable, and impose +// some safety when relying on remote kustomizations, +// e.g. a remotely loaded ConfigMap generator specified +// to read from /etc/passwd will fail. +// +type fileLoader struct { + // Loader that spawned this loader. + // Used to avoid cycles. + referrer *fileLoader + + // An absolute, cleaned path to a directory. + // The Load function will read non-absolute + // paths relative to this directory. + root filesys.ConfirmedDir + + // Restricts behavior of Load function. + loadRestrictor LoadRestrictorFunc + + // If this is non-nil, the files were + // obtained from the given repository. + repoSpec *git.RepoSpec + + // File system utilities. + fSys filesys.FileSystem + + // Used to load from HTTP + http *http.Client + + // Used to clone repositories. + cloner git.Cloner + + // Used to clean up, as needed. + cleaner func() error +} + +// NewFileLoaderAtCwd returns a loader that loads from PWD. +// A convenience for kustomize edit commands. +func NewFileLoaderAtCwd(fSys filesys.FileSystem) *fileLoader { + return newLoaderOrDie( + RestrictionRootOnly, fSys, filesys.SelfDir) +} + +// NewFileLoaderAtRoot returns a loader that loads from "/". +// A convenience for tests. +func NewFileLoaderAtRoot(fSys filesys.FileSystem) *fileLoader { + return newLoaderOrDie( + RestrictionRootOnly, fSys, filesys.Separator) +} + +// Root returns the absolute path that is prepended to any +// relative paths used in Load. +func (fl *fileLoader) Root() string { + return fl.root.String() +} + +func newLoaderOrDie( + lr LoadRestrictorFunc, + fSys filesys.FileSystem, path string) *fileLoader { + root, err := demandDirectoryRoot(fSys, path) + if err != nil { + log.Fatalf("unable to make loader at '%s'; %v", path, err) + } + return newLoaderAtConfirmedDir( + lr, root, fSys, nil, git.ClonerUsingGitExec) +} + +// newLoaderAtConfirmedDir returns a new fileLoader with given root. +func newLoaderAtConfirmedDir( + lr LoadRestrictorFunc, + root filesys.ConfirmedDir, fSys filesys.FileSystem, + referrer *fileLoader, cloner git.Cloner) *fileLoader { + return &fileLoader{ + loadRestrictor: lr, + root: root, + referrer: referrer, + fSys: fSys, + cloner: cloner, + cleaner: func() error { return nil }, + } +} + +// Assure that the given path is in fact a directory. +func demandDirectoryRoot( + fSys filesys.FileSystem, path string) (filesys.ConfirmedDir, error) { + if path == "" { + return "", fmt.Errorf( + "loader root cannot be empty") + } + d, f, err := fSys.CleanedAbs(path) + if err != nil { + return "", err + } + if f != "" { + return "", fmt.Errorf( + "got file '%s', but '%s' must be a directory to be a root", + f, path) + } + return d, nil +} + +// New returns a new Loader, rooted relative to current loader, +// or rooted in a temp directory holding a git repo clone. +func (fl *fileLoader) New(path string) (ifc.Loader, error) { + if path == "" { + return nil, fmt.Errorf("new root cannot be empty") + } + + repoSpec, err := git.NewRepoSpecFromUrl(path) + if err == nil { + // Treat this as git repo clone request. + if err = fl.errIfRepoCycle(repoSpec); err != nil { + return nil, err + } + return newLoaderAtGitClone( + repoSpec, fl.fSys, fl, fl.cloner) + } + + if filepath.IsAbs(path) { + return nil, fmt.Errorf("new root '%s' cannot be absolute", path) + } + root, err := demandDirectoryRoot(fl.fSys, fl.root.Join(path)) + if err != nil { + return nil, err + } + if err = fl.errIfGitContainmentViolation(root); err != nil { + return nil, err + } + if err = fl.errIfArgEqualOrHigher(root); err != nil { + return nil, err + } + return newLoaderAtConfirmedDir( + fl.loadRestrictor, root, fl.fSys, fl, fl.cloner), nil +} + +// newLoaderAtGitClone returns a new Loader pinned to a temporary +// directory holding a cloned git repo. +func newLoaderAtGitClone( + repoSpec *git.RepoSpec, fSys filesys.FileSystem, + referrer *fileLoader, cloner git.Cloner) (ifc.Loader, error) { + cleaner := repoSpec.Cleaner(fSys) + err := cloner(repoSpec) + if err != nil { + cleaner() + return nil, err + } + root, f, err := fSys.CleanedAbs(repoSpec.AbsPath()) + if err != nil { + cleaner() + return nil, err + } + // We don't know that the path requested in repoSpec + // is a directory until we actually clone it and look + // inside. That just happened, hence the error check + // is here. + if f != "" { + cleaner() + return nil, fmt.Errorf( + "'%s' refers to file '%s'; expecting directory", + repoSpec.AbsPath(), f) + } + return &fileLoader{ + // Clones never allowed to escape root. + loadRestrictor: RestrictionRootOnly, + root: root, + referrer: referrer, + repoSpec: repoSpec, + fSys: fSys, + cloner: cloner, + cleaner: cleaner, + }, nil +} + +func (fl *fileLoader) errIfGitContainmentViolation( + base filesys.ConfirmedDir) error { + containingRepo := fl.containingRepo() + if containingRepo == nil { + return nil + } + if !base.HasPrefix(containingRepo.CloneDir()) { + return fmt.Errorf( + "security; bases in kustomizations found in "+ + "cloned git repos must be within the repo, "+ + "but base '%s' is outside '%s'", + base, containingRepo.CloneDir()) + } + return nil +} + +// Looks back through referrers for a git repo, returning nil +// if none found. +func (fl *fileLoader) containingRepo() *git.RepoSpec { + if fl.repoSpec != nil { + return fl.repoSpec + } + if fl.referrer == nil { + return nil + } + return fl.referrer.containingRepo() +} + +// errIfArgEqualOrHigher tests whether the argument, +// is equal to or above the root of any ancestor. +func (fl *fileLoader) errIfArgEqualOrHigher( + candidateRoot filesys.ConfirmedDir) error { + if fl.root.HasPrefix(candidateRoot) { + return fmt.Errorf( + "cycle detected: candidate root '%s' contains visited root '%s'", + candidateRoot, fl.root) + } + if fl.referrer == nil { + return nil + } + return fl.referrer.errIfArgEqualOrHigher(candidateRoot) +} + +// TODO(monopole): Distinguish branches? +// I.e. Allow a distinction between git URI with +// path foo and tag bar and a git URI with the same +// path but a different tag? +func (fl *fileLoader) errIfRepoCycle(newRepoSpec *git.RepoSpec) error { + // TODO(monopole): Use parsed data instead of Raw(). + if fl.repoSpec != nil && + strings.HasPrefix(fl.repoSpec.Raw(), newRepoSpec.Raw()) { + return fmt.Errorf( + "cycle detected: URI '%s' referenced by previous URI '%s'", + newRepoSpec.Raw(), fl.repoSpec.Raw()) + } + if fl.referrer == nil { + return nil + } + return fl.referrer.errIfRepoCycle(newRepoSpec) +} + +// Load returns the content of file at the given path, +// else an error. Relative paths are taken relative +// to the root. +func (fl *fileLoader) Load(path string) ([]byte, error) { + if u, err := url.Parse(path); err == nil && (u.Scheme == "http" || u.Scheme == "https") { + var hc *http.Client + if fl.http != nil { + hc = fl.http + } else { + hc = &http.Client{} + } + resp, err := hc.Get(path) + if err != nil { + return nil, err + } + defer resp.Body.Close() + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return nil, err + } + return body, nil + } + + if !filepath.IsAbs(path) { + path = fl.root.Join(path) + } + path, err := fl.loadRestrictor(fl.fSys, fl.root, path) + if err != nil { + return nil, err + } + return fl.fSys.ReadFile(path) +} + +// Cleanup runs the cleaner. +func (fl *fileLoader) Cleanup() error { + return fl.cleaner() +} diff --git a/vendor/sigs.k8s.io/kustomize/api/loader/loader.go b/vendor/sigs.k8s.io/kustomize/api/loader/loader.go new file mode 100644 index 000000000000..c72a9596541b --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/loader/loader.go @@ -0,0 +1,34 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +// Package loader has a data loading interface and various implementations. +package loader + +import ( + "sigs.k8s.io/kustomize/api/filesys" + "sigs.k8s.io/kustomize/api/ifc" + "sigs.k8s.io/kustomize/api/internal/git" +) + +// NewLoader returns a Loader pointed at the given target. +// If the target is remote, the loader will be restricted +// to the root and below only. If the target is local, the +// loader will have the restrictions passed in. Regardless, +// if a local target attempts to transitively load remote bases, +// the remote bases will all be root-only restricted. +func NewLoader( + lr LoadRestrictorFunc, + target string, fSys filesys.FileSystem) (ifc.Loader, error) { + repoSpec, err := git.NewRepoSpecFromUrl(target) + if err == nil { + // The target qualifies as a remote git target. + return newLoaderAtGitClone( + repoSpec, fSys, nil, git.ClonerUsingGitExec) + } + root, err := demandDirectoryRoot(fSys, target) + if err != nil { + return nil, err + } + return newLoaderAtConfirmedDir( + lr, root, fSys, nil, git.ClonerUsingGitExec), nil +} diff --git a/vendor/sigs.k8s.io/kustomize/api/loader/loadrestrictions.go b/vendor/sigs.k8s.io/kustomize/api/loader/loadrestrictions.go new file mode 100644 index 000000000000..99b5562fbf96 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/loader/loadrestrictions.go @@ -0,0 +1,35 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package loader + +import ( + "fmt" + + "sigs.k8s.io/kustomize/api/filesys" +) + +type LoadRestrictorFunc func( + filesys.FileSystem, filesys.ConfirmedDir, string) (string, error) + +func RestrictionRootOnly( + fSys filesys.FileSystem, root filesys.ConfirmedDir, path string) (string, error) { + d, f, err := fSys.CleanedAbs(path) + if err != nil { + return "", err + } + if f == "" { + return "", fmt.Errorf("'%s' must resolve to a file", path) + } + if !d.HasPrefix(root) { + return "", fmt.Errorf( + "security; file '%s' is not in or below '%s'", + path, root) + } + return d.Join(f), nil +} + +func RestrictionNone( + _ filesys.FileSystem, _ filesys.ConfirmedDir, path string) (string, error) { + return path, nil +} diff --git a/vendor/sigs.k8s.io/kustomize/api/provenance/provenance.go b/vendor/sigs.k8s.io/kustomize/api/provenance/provenance.go new file mode 100644 index 000000000000..4ad40395a18f --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/provenance/provenance.go @@ -0,0 +1,68 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package provenance + +import ( + "fmt" + "runtime" + "strings" +) + +var ( + version = "unknown" + // sha1 from git, output of $(git rev-parse HEAD) + gitCommit = "$Format:%H$" + // build date in ISO8601 format, output of $(date -u +'%Y-%m-%dT%H:%M:%SZ') + buildDate = "1970-01-01T00:00:00Z" + goos = runtime.GOOS + goarch = runtime.GOARCH +) + +// Provenance holds information about the build of an executable. +type Provenance struct { + // Version of the kustomize binary. + Version string `json:"version,omitempty"` + // GitCommit is a git commit + GitCommit string `json:"gitCommit,omitempty"` + // BuildDate is date of the build. + BuildDate string `json:"buildDate,omitempty"` + // GoOs holds OS name. + GoOs string `json:"goOs,omitempty"` + // GoArch holds architecture name. + GoArch string `json:"goArch,omitempty"` +} + +// GetProvenance returns an instance of Provenance. +func GetProvenance() Provenance { + return Provenance{ + version, + gitCommit, + buildDate, + goos, + goarch, + } +} + +// Full returns the full provenance stamp. +func (v Provenance) Full() string { + return fmt.Sprintf("%+v", v) +} + +// Short returns the shortened provenance stamp. +func (v Provenance) Short() string { + return fmt.Sprintf( + "%v", + Provenance{ + Version: v.Version, + BuildDate: v.BuildDate, + }) +} + +// Semver returns the semantic version of kustomize. +// kustomize version is set in format "kustomize/vX.X.X" in every release. +// X.X.X is a semver. If the version string is not in this format, +// return the original version string +func (v Provenance) Semver() string { + return strings.TrimPrefix(v.Version, "kustomize/") +} diff --git a/vendor/sigs.k8s.io/kustomize/api/provider/depprovider.go b/vendor/sigs.k8s.io/kustomize/api/provider/depprovider.go new file mode 100644 index 000000000000..4bd567f3ee16 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/provider/depprovider.go @@ -0,0 +1,201 @@ +// Copyright 2020 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package provider + +import ( + "log" + + "sigs.k8s.io/kustomize/api/ifc" + "sigs.k8s.io/kustomize/api/internal/conflict" + "sigs.k8s.io/kustomize/api/internal/validate" + "sigs.k8s.io/kustomize/api/internal/wrappy" + "sigs.k8s.io/kustomize/api/konfig" + "sigs.k8s.io/kustomize/api/resource" +) + +// DepProvider is a dependency provider. +// +// The instances it returns are either +// - old implementations backed by k8sdeps code, +// - new implementations backed by kyaml code. +// +// History: +// +// kubectl depends on k8s.io code, and at the time of writing, so +// does kustomize. Code that imports k8s.io/api* cannot be imported +// back into k8s.io/*, yet kustomize appears inside k8s.io/kubectl. +// +// To allow kustomize to appear inside kubectl, yet still be developed +// outside kubectl, the kustomize code was divided into the following +// packages +// +// api/ +// k8sdeps/ (and internal/ks8deps/) +// ifc/ +// krusty/ +// everythingElse/ +// +// with the following rules: +// +// - Only k8sdeps/ may import k8s.io/api*. +// +// - Only krusty/ (and its internals) may import k8sdeps/. +// I.e., ifc/ and everythingElse/ must not +// import k8sdeps/ or k8s.io/api*. +// +// - Code in krusty/ may use code in k8sdeps/ to create +// objects then inject said objects into +// everythingElse/ behind dependency neutral interfaces. +// +// The idea was to periodically copy, not import, the large k8sdeps/ +// tree (plus a snippet from krusty/kustomizer.go) into the kubectl +// codebase via a large PR, and have kubectl depend on the rest via +// normal importing. +// +// Over 2019, however, kubectl underwent large changes including +// a switch to Go modules, and a concerted attempt to extract kubectl +// from the k8s repo. This made large kustomize integration PRs too +// intrusive to review. +// +// In 2020, kubectl is based on Go modules, and almost entirely +// extracted from the k8s.io repositories, and further the kyaml +// library has a appeared as a viable replacement to k8s.io/api* +// KRM manipulation code. +// +// The new plan is to eliminate k8sdeps/ entirely, along with its +// k8s.io/api* dependence, allowing kustomize code to be imported +// into kubectl via normal Go module imports. Then the kustomize API +// code can then move into the github.com/kubernetes-sigs/cli-utils +// repo. The kustomize CLI in github.com/kubernetes-sigs/kustomize +// and the kubectl CLI can then both depend on the kustomize API. +// +// So, all code that depends on k8sdeps must go behind interfaces, +// and kustomize must be factored to choose the implementation. +// +// That problem has been reduced to three interfaces, each having +// two implementations. (1) is k8sdeps-based, (2) is kyaml-based. +// +// - ifc.Kunstructured +// +// 1) api/k8sdeps/kunstruct.UnstructAdapter +// +// This adapts structs in +// k8s.io/apimachinery/pkg/apis/meta/v1/unstructured +// to ifc.Kunstructured. +// +// 2) api/wrappy.WNode +// +// This adapts sigs.k8s.io/kustomize/kyaml/yaml.RNode +// to ifc.Unstructured. +// +// At time of writing, implementation started. +// Further reducing the size of ifc.Kunstructed +// would really reduce the work +// (e.g. drop Vars, drop ReplacementTranformer). +// +// - resource.ConflictDetector +// +// 1) api/internal/k8sdeps/conflict.conflictDetectorJson +// api/internal/k8sdeps/conflict.conflictDetectorSm +// +// Uses k8s.io/apimachinery/pkg/util/strategicpatch, +// apimachinery/pkg/util/mergepatch, etc. to merge +// resource.Resource instances. +// +// 2) api/internal/conflict.smPatchMergeOnlyDetector +// +// At time of writing, this doesn't report conflicts, +// but it does know how to merge patches. Conflict +// reporting isn't vital to kustomize function. It's +// rare that a person would configure one transformer +// with many patches, much less so many that it became +// hard to spot conflicts. In the case of an undetected +// conflict, the last patch applied wins, likely what +// the user wants anyway. Regardless, the effect of this +// is plainly visible and usable in the output, even if +// a conflict happened but wasn't reported as an error. +// +// - ifc.Validator +// +// 1) api/k8sdeps/validator.KustValidator +// +// Uses k8s.io/apimachinery/pkg/api/validation and +// friends to validate strings. +// +// 2) api/internal/validate.FieldValidator +// +// See TODO inside the validator for status. +// At time of writing, this is a do-nothing +// validator as it's not critical to kustomize function. +// +// Proposed plan: +// [x] Ship kustomize with the ability to switch from 1 to 2 via +// an --enable_kyaml flag. +// [x] Make --enable_kyaml true by default. +// [x] When 2 is not noticeably more buggy than 1, delete 1. +// I.e. delete k8sdeps/, transitively deleting all k8s.io/api* deps. +// This DepProvider should be left in place to retain these +// comments, but it will have only one choice. +// [x] The way is now clear to reintegrate into kubectl. +// This should be done ASAP; the last step is cleanup. +// [ ] Cleanup. With only one impl of Kunstructure remaining, +// that interface and WNode can be deleted, along with this +// DepProvider. The other two interfaces could be dropped too. +// +// When the above is done, kustomize will use yaml.RNode and/or +// KRM Config Functions directly and exclusively. +// If you're reading this, plan not done. +// +type DepProvider struct { + kFactory ifc.KunstructuredFactory + resourceFactory *resource.Factory + conflictDectectorFactory resource.ConflictDetectorFactory + fieldValidator ifc.Validator +} + +// The dependencies this method needs have been deleted - +// see comments above. This method will be deleted +// along with DepProvider in the final step. +func makeK8sdepBasedInstances() *DepProvider { + log.Fatal("This binary cannot use k8s.io code; it must use kyaml.") + return nil +} + +func makeKyamlBasedInstances() *DepProvider { + kf := &wrappy.WNodeFactory{} + rf := resource.NewFactory(kf) + return &DepProvider{ + kFactory: kf, + resourceFactory: rf, + conflictDectectorFactory: conflict.NewFactory(), + fieldValidator: validate.NewFieldValidator(), + } +} + +func NewDepProvider(useKyaml bool) *DepProvider { + if useKyaml { + return makeKyamlBasedInstances() + } + return makeK8sdepBasedInstances() +} + +func NewDefaultDepProvider() *DepProvider { + return NewDepProvider(konfig.FlagEnableKyamlDefaultValue) +} + +func (dp *DepProvider) GetKunstructuredFactory() ifc.KunstructuredFactory { + return dp.kFactory +} + +func (dp *DepProvider) GetResourceFactory() *resource.Factory { + return dp.resourceFactory +} + +func (dp *DepProvider) GetConflictDetectorFactory() resource.ConflictDetectorFactory { + return dp.conflictDectectorFactory +} + +func (dp *DepProvider) GetFieldValidator() ifc.Validator { + return dp.fieldValidator +} diff --git a/vendor/sigs.k8s.io/kustomize/api/resid/gvk.go b/vendor/sigs.k8s.io/kustomize/api/resid/gvk.go new file mode 100644 index 000000000000..70f7107386ac --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/resid/gvk.go @@ -0,0 +1,221 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package resid + +import ( + "strings" + + "sigs.k8s.io/kustomize/kyaml/openapi" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +// Gvk identifies a Kubernetes API type. +// https://github.com/kubernetes/community/blob/master/contributors/design-proposals/api-machinery/api-group.md +type Gvk struct { + Group string `json:"group,omitempty" yaml:"group,omitempty"` + Version string `json:"version,omitempty" yaml:"version,omitempty"` + Kind string `json:"kind,omitempty" yaml:"kind,omitempty"` +} + +// FromKind makes a Gvk with only the kind specified. +func FromKind(k string) Gvk { + return Gvk{ + Kind: k, + } +} + +// ParseGroupVersion parses a KRM metadata apiVersion field. +func ParseGroupVersion(apiVersion string) (group, version string) { + if i := strings.Index(apiVersion, "/"); i > -1 { + return apiVersion[:i], apiVersion[i+1:] + } + return "", apiVersion +} + +// GvkFromString makes a Gvk from the output of Gvk.String(). +func GvkFromString(s string) Gvk { + values := strings.Split(s, fieldSep) + g := values[0] + if g == noGroup { + g = "" + } + v := values[1] + if v == noVersion { + v = "" + } + k := values[2] + if k == noKind { + k = "" + } + return Gvk{ + Group: g, + Version: v, + Kind: k, + } +} + +// Values that are brief but meaningful in logs. +const ( + noGroup = "~G" + noVersion = "~V" + noKind = "~K" + fieldSep = "_" +) + +// String returns a string representation of the GVK. +func (x Gvk) String() string { + g := x.Group + if g == "" { + g = noGroup + } + v := x.Version + if v == "" { + v = noVersion + } + k := x.Kind + if k == "" { + k = noKind + } + return strings.Join([]string{g, v, k}, fieldSep) +} + +// ApiVersion returns the combination of Group and Version +func (x Gvk) ApiVersion() string { + if x.Group == "" { + return x.Version + } + return x.Group + "/" + x.Version +} + +// StringWoEmptyField returns a string representation of the GVK. Non-exist +// fields will be omitted. +func (x Gvk) StringWoEmptyField() string { + var s []string + if x.Group != "" { + s = append(s, x.Group) + } + if x.Version != "" { + s = append(s, x.Version) + } + if x.Kind != "" { + s = append(s, x.Kind) + } + return strings.Join(s, fieldSep) +} + +// Equals returns true if the Gvk's have equal fields. +func (x Gvk) Equals(o Gvk) bool { + return x.Group == o.Group && x.Version == o.Version && x.Kind == o.Kind +} + +// An attempt to order things to help k8s, e.g. +// a Service should come before things that refer to it. +// Namespace should be first. +// In some cases order just specified to provide determinism. +var orderFirst = []string{ + "Namespace", + "ResourceQuota", + "StorageClass", + "CustomResourceDefinition", + "ServiceAccount", + "PodSecurityPolicy", + "Role", + "ClusterRole", + "RoleBinding", + "ClusterRoleBinding", + "ConfigMap", + "Secret", + "Endpoints", + "Service", + "LimitRange", + "PriorityClass", + "PersistentVolume", + "PersistentVolumeClaim", + "Deployment", + "StatefulSet", + "CronJob", + "PodDisruptionBudget", +} +var orderLast = []string{ + "MutatingWebhookConfiguration", + "ValidatingWebhookConfiguration", +} +var typeOrders = func() map[string]int { + m := map[string]int{} + for i, n := range orderFirst { + m[n] = -len(orderFirst) + i + } + for i, n := range orderLast { + m[n] = 1 + i + } + return m +}() + +// IsLessThan returns true if self is less than the argument. +func (x Gvk) IsLessThan(o Gvk) bool { + indexI := typeOrders[x.Kind] + indexJ := typeOrders[o.Kind] + if indexI != indexJ { + return indexI < indexJ + } + return x.String() < o.String() +} + +// IsSelected returns true if `selector` selects `x`; otherwise, false. +// If `selector` and `x` are the same, return true. +// If `selector` is nil, it is considered a wildcard match, returning true. +// If selector fields are empty, they are considered wildcards matching +// anything in the corresponding fields, e.g. +// +// this item: +// +// +// is selected by +// +// +// but rejected by +// +// +func (x Gvk) IsSelected(selector *Gvk) bool { + if selector == nil { + return true + } + if len(selector.Group) > 0 { + if x.Group != selector.Group { + return false + } + } + if len(selector.Version) > 0 { + if x.Version != selector.Version { + return false + } + } + if len(selector.Kind) > 0 { + if x.Kind != selector.Kind { + return false + } + } + return true +} + +// toKyamlTypeMeta returns a yaml.TypeMeta from x's information. +func (x Gvk) toKyamlTypeMeta() yaml.TypeMeta { + var apiVersion strings.Builder + if x.Group != "" { + apiVersion.WriteString(x.Group) + apiVersion.WriteString("/") + } + apiVersion.WriteString(x.Version) + return yaml.TypeMeta{ + APIVersion: apiVersion.String(), + Kind: x.Kind, + } +} + +// IsNamespaceableKind returns true if x is a namespaceable Gvk +// Implements https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/#not-all-objects-are-in-a-namespace +func (x Gvk) IsNamespaceableKind() bool { + isNamespaceScoped, found := openapi.IsNamespaceScoped(x.toKyamlTypeMeta()) + return !found || isNamespaceScoped +} diff --git a/vendor/sigs.k8s.io/kustomize/api/resid/resid.go b/vendor/sigs.k8s.io/kustomize/api/resid/resid.go new file mode 100644 index 000000000000..28310e8f3733 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/resid/resid.go @@ -0,0 +1,127 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package resid + +import ( + "strings" +) + +// ResId is an identifier of a k8s resource object. +type ResId struct { + // Gvk of the resource. + Gvk `json:",inline,omitempty" yaml:",inline,omitempty"` + + // Name of the resource before transformation. + Name string `json:"name,omitempty" yaml:"name,omitempty"` + + // Namespace the resource belongs to. + // An untransformed resource has no namespace. + // A fully transformed resource has the namespace + // from the top most overlay. + Namespace string `json:"namespace,omitempty" yaml:"namespace,omitempty"` +} + +// NewResIdWithNamespace creates new ResId +// in a given namespace. +func NewResIdWithNamespace(k Gvk, n, ns string) ResId { + return ResId{Gvk: k, Name: n, Namespace: ns} +} + +// NewResId creates new ResId. +func NewResId(k Gvk, n string) ResId { + return ResId{Gvk: k, Name: n} +} + +// NewResIdKindOnly creates a new ResId. +func NewResIdKindOnly(k string, n string) ResId { + return ResId{Gvk: FromKind(k), Name: n} +} + +const ( + noNamespace = "~X" + noName = "~N" + separator = "|" + TotallyNotANamespace = "_non_namespaceable_" + DefaultNamespace = "default" +) + +// String of ResId based on GVK, name and prefix +func (id ResId) String() string { + ns := id.Namespace + if ns == "" { + ns = noNamespace + } + nm := id.Name + if nm == "" { + nm = noName + } + return strings.Join( + []string{id.Gvk.String(), ns, nm}, separator) +} + +func FromString(s string) ResId { + values := strings.Split(s, separator) + g := GvkFromString(values[0]) + + ns := values[1] + if ns == noNamespace { + ns = "" + } + nm := values[2] + if nm == noName { + nm = "" + } + return ResId{ + Gvk: g, + Namespace: ns, + Name: nm, + } +} + +// GvknString of ResId based on GVK and name +func (id ResId) GvknString() string { + return id.Gvk.String() + separator + id.Name +} + +// GvknEquals returns true if the other id matches +// Group/Version/Kind/name. +func (id ResId) GvknEquals(o ResId) bool { + return id.Name == o.Name && id.Gvk.Equals(o.Gvk) +} + +// Equals returns true if the other id matches +// namespace/Group/Version/Kind/name. +func (id ResId) Equals(o ResId) bool { + return id.IsNsEquals(o) && id.GvknEquals(o) +} + +// IsNsEquals returns true if the id is in +// the same effective namespace. +func (id ResId) IsNsEquals(o ResId) bool { + return id.EffectiveNamespace() == o.EffectiveNamespace() +} + +// IsInDefaultNs returns true if id is a namespaceable +// ResId and the Namespace is either not set or set +// to DefaultNamespace. +func (id ResId) IsInDefaultNs() bool { + return id.IsNamespaceableKind() && id.isPutativelyDefaultNs() +} + +func (id ResId) isPutativelyDefaultNs() bool { + return id.Namespace == "" || id.Namespace == DefaultNamespace +} + +// EffectiveNamespace returns a non-ambiguous, non-empty +// namespace for use in reporting and equality tests. +func (id ResId) EffectiveNamespace() string { + // The order of these checks matters. + if !id.IsNamespaceableKind() { + return TotallyNotANamespace + } + if id.isPutativelyDefaultNs() { + return DefaultNamespace + } + return id.Namespace +} diff --git a/vendor/sigs.k8s.io/kustomize/api/resmap/factory.go b/vendor/sigs.k8s.io/kustomize/api/resmap/factory.go new file mode 100644 index 000000000000..a93b0ad6c627 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/resmap/factory.go @@ -0,0 +1,163 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package resmap + +import ( + "github.com/pkg/errors" + "sigs.k8s.io/kustomize/api/ifc" + "sigs.k8s.io/kustomize/api/internal/kusterr" + "sigs.k8s.io/kustomize/api/resource" + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +// Factory makes instances of ResMap. +type Factory struct { + // Makes resources. + resF *resource.Factory + // Makes ConflictDetectors. + cdf resource.ConflictDetectorFactory +} + +// NewFactory returns a new resmap.Factory. +func NewFactory( + rf *resource.Factory, cdf resource.ConflictDetectorFactory) *Factory { + return &Factory{resF: rf, cdf: cdf} +} + +// RF returns a resource.Factory. +func (rmF *Factory) RF() *resource.Factory { + return rmF.resF +} + +func New() ResMap { + return newOne() +} + +// FromResource returns a ResMap with one entry. +func (rmF *Factory) FromResource(res *resource.Resource) ResMap { + m, err := newResMapFromResourceSlice([]*resource.Resource{res}) + if err != nil { + panic(err) + } + return m +} + +// FromResourceSlice returns a ResMap with a slice of resources. +func (rmF *Factory) FromResourceSlice(ress []*resource.Resource) ResMap { + m, err := newResMapFromResourceSlice(ress) + if err != nil { + panic(err) + } + return m +} + +// FromFile returns a ResMap given a resource path. +func (rmF *Factory) FromFile( + loader ifc.Loader, path string) (ResMap, error) { + content, err := loader.Load(path) + if err != nil { + return nil, err + } + m, err := rmF.NewResMapFromBytes(content) + if err != nil { + return nil, kusterr.Handler(err, path) + } + return m, nil +} + +// NewResMapFromBytes decodes a list of objects in byte array format. +func (rmF *Factory) NewResMapFromBytes(b []byte) (ResMap, error) { + resources, err := rmF.resF.SliceFromBytes(b) + if err != nil { + return nil, err + } + return newResMapFromResourceSlice(resources) +} + +// NewResMapFromConfigMapArgs returns a Resource slice given +// a configmap metadata slice from kustomization file. +func (rmF *Factory) NewResMapFromConfigMapArgs( + kvLdr ifc.KvLoader, argList []types.ConfigMapArgs) (ResMap, error) { + var resources []*resource.Resource + for _, args := range argList { + res, err := rmF.resF.MakeConfigMap(kvLdr, &args) + if err != nil { + return nil, errors.Wrap(err, "NewResMapFromConfigMapArgs") + } + resources = append(resources, res) + } + return newResMapFromResourceSlice(resources) +} + +// FromConfigMapArgs creates a new ResMap containing one ConfigMap. +func (rmF *Factory) FromConfigMapArgs( + kvLdr ifc.KvLoader, args types.ConfigMapArgs) (ResMap, error) { + res, err := rmF.resF.MakeConfigMap(kvLdr, &args) + if err != nil { + return nil, err + } + return rmF.FromResource(res), nil +} + +// NewResMapFromSecretArgs takes a SecretArgs slice, generates +// secrets from each entry, and accumulates them in a ResMap. +func (rmF *Factory) NewResMapFromSecretArgs( + kvLdr ifc.KvLoader, argsList []types.SecretArgs) (ResMap, error) { + var resources []*resource.Resource + for _, args := range argsList { + res, err := rmF.resF.MakeSecret(kvLdr, &args) + if err != nil { + return nil, errors.Wrap(err, "NewResMapFromSecretArgs") + } + resources = append(resources, res) + } + return newResMapFromResourceSlice(resources) +} + +// FromSecretArgs creates a new ResMap containing one secret. +func (rmF *Factory) FromSecretArgs( + kvLdr ifc.KvLoader, args types.SecretArgs) (ResMap, error) { + res, err := rmF.resF.MakeSecret(kvLdr, &args) + if err != nil { + return nil, err + } + return rmF.FromResource(res), nil +} + +// ConflatePatches creates a new ResMap containing a merger of the +// incoming patches. +// Error if conflict found. +func (rmF *Factory) ConflatePatches(patches []*resource.Resource) (ResMap, error) { + return (&merginator{cdf: rmF.cdf}).ConflatePatches(patches) +} + +func newResMapFromResourceSlice( + resources []*resource.Resource) (ResMap, error) { + result := New() + for _, res := range resources { + err := result.Append(res) + if err != nil { + return nil, err + } + } + return result, nil +} + +// NewResMapFromRNodeSlice returns a ResMap from a slice of RNodes +func (rmF *Factory) NewResMapFromRNodeSlice(rnodes []*yaml.RNode) (ResMap, error) { + var resources []*resource.Resource + for _, rnode := range rnodes { + s, err := rnode.String() + if err != nil { + return nil, err + } + r, err := rmF.resF.SliceFromBytes([]byte(s)) + if err != nil { + return nil, err + } + resources = append(resources, r...) + } + return newResMapFromResourceSlice(resources) +} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/resmap/idslice.go b/vendor/sigs.k8s.io/kustomize/api/resmap/idslice.go similarity index 88% rename from vendor/sigs.k8s.io/kustomize/pkg/resmap/idslice.go rename to vendor/sigs.k8s.io/kustomize/api/resmap/idslice.go index cdf759203bd8..f2e46d44069b 100644 --- a/vendor/sigs.k8s.io/kustomize/pkg/resmap/idslice.go +++ b/vendor/sigs.k8s.io/kustomize/api/resmap/idslice.go @@ -19,7 +19,7 @@ package resmap import ( "sort" - "sigs.k8s.io/kustomize/pkg/resid" + "sigs.k8s.io/kustomize/api/resid" ) // IdSlice implements the sort interface. @@ -30,8 +30,8 @@ var _ sort.Interface = IdSlice{} func (a IdSlice) Len() int { return len(a) } func (a IdSlice) Swap(i, j int) { a[i], a[j] = a[j], a[i] } func (a IdSlice) Less(i, j int) bool { - if !a[i].Gvk().Equals(a[j].Gvk()) { - return a[i].Gvk().IsLessThan(a[j].Gvk()) + if !a[i].Gvk.Equals(a[j].Gvk) { + return a[i].Gvk.IsLessThan(a[j].Gvk) } return a[i].String() < a[j].String() } diff --git a/vendor/sigs.k8s.io/kustomize/api/resmap/merginator.go b/vendor/sigs.k8s.io/kustomize/api/resmap/merginator.go new file mode 100644 index 000000000000..c09b5aacb2d4 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/resmap/merginator.go @@ -0,0 +1,123 @@ +// Copyright 2020 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package resmap + +import ( + "fmt" + + "sigs.k8s.io/kustomize/api/resource" +) + +// merginator coordinates merging the resources in incoming to the result. +type merginator struct { + incoming []*resource.Resource + cdf resource.ConflictDetectorFactory + result ResMap +} + +func (m *merginator) ConflatePatches(in []*resource.Resource) (ResMap, error) { + m.result = New() + m.incoming = in + for index := range m.incoming { + alreadyInResult, err := m.appendIfNoMatch(index) + if err != nil { + return nil, err + } + if alreadyInResult != nil { + // The resource at index has the same resId as a previously + // considered resource. + // + // If they conflict with each other (e.g. they both want to change + // the image name in a Deployment, but to different values), + // return an error. + // + // If they don't conflict, then merge them into a single resource, + // since they both target the same item, and we want cumulative + // behavior. E.g. say both patches modify a map. Without a merge, + // the last patch wins, replacing the entire map. + err = m.mergeWithExisting(index, alreadyInResult) + if err != nil { + return nil, err + } + } + } + return m.result, nil +} + +func (m *merginator) appendIfNoMatch(index int) (*resource.Resource, error) { + candidate := m.incoming[index] + matchedResources := m.result.GetMatchingResourcesByAnyId( + candidate.OrgId().Equals) + if len(matchedResources) == 0 { + m.result.Append(candidate) + return nil, nil + } + if len(matchedResources) > 1 { + return nil, fmt.Errorf("multiple resources targeted by patch") + } + return matchedResources[0], nil +} + +func (m *merginator) mergeWithExisting( + index int, alreadyInResult *resource.Resource) error { + candidate := m.incoming[index] + cd, err := m.cdf.New(candidate.OrgId().Gvk) + if err != nil { + return err + } + hasConflict, err := cd.HasConflict(candidate, alreadyInResult) + if err != nil { + return err + } + if hasConflict { + return m.makeError(cd, index) + } + merged, err := cd.MergePatches(alreadyInResult, candidate) + if err != nil { + return err + } + _, err = m.result.Replace(merged) + return err +} + +// Make an error message describing the conflict. +func (m *merginator) makeError(cd resource.ConflictDetector, index int) error { + conflict, err := m.findConflict(cd, index) + if err != nil { + return err + } + if conflict == nil { + return fmt.Errorf("expected conflict for %s", m.incoming[index].OrgId()) + } + conflictMap, _ := conflict.Map() + incomingIndexMap, _ := m.incoming[index].Map() + return fmt.Errorf( + "conflict between %#v at index %d and %#v", + incomingIndexMap, + index, + conflictMap, + ) +} + +// findConflict looks for a conflict in a resource slice. +// It returns the first conflict between the resource at index +// and some other resource. Two resources can only conflict if +// they have the same original ResId. +func (m *merginator) findConflict( + cd resource.ConflictDetector, index int) (*resource.Resource, error) { + targetId := m.incoming[index].OrgId() + for i, p := range m.incoming { + if i == index || !targetId.Equals(p.OrgId()) { + continue + } + conflict, err := cd.HasConflict(p, m.incoming[index]) + if err != nil { + return nil, err + } + if conflict { + return p, nil + } + } + return nil, nil +} diff --git a/vendor/sigs.k8s.io/kustomize/api/resmap/resmap.go b/vendor/sigs.k8s.io/kustomize/api/resmap/resmap.go new file mode 100644 index 000000000000..b803453e1284 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/resmap/resmap.go @@ -0,0 +1,245 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +// Package resmap implements a map from ResId to Resource that +// tracks all resources in a kustomization. +package resmap + +import ( + "sigs.k8s.io/kustomize/api/ifc" + "sigs.k8s.io/kustomize/api/resid" + "sigs.k8s.io/kustomize/api/resource" + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +// A Transformer modifies an instance of ResMap. +type Transformer interface { + // Transform modifies data in the argument, + // e.g. adding labels to resources that can be labelled. + Transform(m ResMap) error +} + +// A Generator creates an instance of ResMap. +type Generator interface { + Generate() (ResMap, error) +} + +// Something that's configurable accepts an +// instance of PluginHelpers and a raw config +// object (YAML in []byte form). +type Configurable interface { + Config(h *PluginHelpers, config []byte) error +} + +// NewPluginHelpers makes an instance of PluginHelpers. +func NewPluginHelpers(ldr ifc.Loader, v ifc.Validator, rf *Factory) *PluginHelpers { + return &PluginHelpers{ldr: ldr, v: v, rf: rf} +} + +// PluginHelpers holds things that any or all plugins might need. +// This should be available to each plugin, in addition to +// any plugin-specific configuration. +type PluginHelpers struct { + ldr ifc.Loader + v ifc.Validator + rf *Factory +} + +func (c *PluginHelpers) Loader() ifc.Loader { + return c.ldr +} + +func (c *PluginHelpers) ResmapFactory() *Factory { + return c.rf +} + +func (c *PluginHelpers) Validator() ifc.Validator { + return c.v +} + +type GeneratorPlugin interface { + Generator + Configurable +} + +type TransformerPlugin interface { + Transformer + Configurable +} + +// ResMap is an interface describing operations on the +// core kustomize data structure, a list of Resources. +// +// Every Resource has two ResIds: OrgId and CurId. +// +// In a ResMap, no two resources may have the same CurId, +// but they may have the same OrgId. The latter can happen +// when mixing two or more different overlays apply different +// transformations to a common base. When looking for a +// resource to transform, try the OrgId first, and if this +// fails or finds too many, it might make sense to then try +// the CurrId. Depends on the situation. +type ResMap interface { + // Size reports the number of resources. + Size() int + + // Resources provides a discardable slice + // of resource pointers, returned in the order + // as appended. + Resources() []*resource.Resource + + // Append adds a Resource. Error on CurId collision. + // + // A class invariant of ResMap is that all of its + // resources must differ in their value of + // CurId(), aka current Id. The Id is the tuple + // of {namespace, group, version, kind, name} + // (see ResId). + // + // This invariant reflects the invariant of a + // kubernetes cluster, where if one tries to add + // a resource to the cluster whose Id matches + // that of a resource already in the cluster, + // only two outcomes are allowed. Either the + // incoming resource is _merged_ into the existing + // one, or the incoming resource is rejected. + // One cannot end up with two resources + // in the cluster with the same Id. + Append(*resource.Resource) error + + // AppendAll appends another ResMap to self, + // failing on any CurId collision. + AppendAll(ResMap) error + + // AbsorbAll appends, replaces or merges the contents + // of another ResMap into self, + // allowing and sometimes demanding ID collisions. + // A collision would be demanded, say, when a generated + // ConfigMap has the "replace" option in its generation + // instructions, meaning it _must_ replace + // something in the known set of resources. + // If a resource id for resource X is found to already + // be in self, then the behavior field for X must + // be BehaviorMerge or BehaviorReplace. If X is not in + // self, then its behavior _cannot_ be merge or replace. + AbsorbAll(ResMap) error + + // AsYaml returns the yaml form of resources. + AsYaml() ([]byte, error) + + // GetByIndex returns a resource at the given index, + // nil if out of range. + GetByIndex(int) *resource.Resource + + // GetIndexOfCurrentId returns the index of the resource + // with the given CurId. + // Returns error if there is more than one match. + // Returns (-1, nil) if there is no match. + GetIndexOfCurrentId(id resid.ResId) (int, error) + + // GetMatchingResourcesByCurrentId returns the resources + // who's CurId is matched by the argument. + GetMatchingResourcesByCurrentId(matches IdMatcher) []*resource.Resource + + // GetMatchingResourcesByAnyId returns the resources + // who's current or previous IDs is matched by the argument. + GetMatchingResourcesByAnyId(matches IdMatcher) []*resource.Resource + + // GetByCurrentId is shorthand for calling + // GetMatchingResourcesByCurrentId with a matcher requiring + // an exact match, returning an error on multiple or no matches. + GetByCurrentId(resid.ResId) (*resource.Resource, error) + + // GetById is shorthand for calling + // GetMatchingResourcesByAnyId with a matcher requiring + // an exact match, returning an error on multiple or no matches. + GetById(resid.ResId) (*resource.Resource, error) + + // GroupedByCurrentNamespace returns a map of namespace + // to a slice of *Resource in that namespace. + // Resources for whom IsNamespaceableKind is false are + // are not included at all (see NonNamespaceable). + // Resources with an empty namespace are placed + // in the resid.DefaultNamespace entry. + GroupedByCurrentNamespace() map[string][]*resource.Resource + + // GroupByOrginalNamespace performs as GroupByNamespace + // but use the original namespace instead of the current + // one to perform the grouping. + GroupedByOriginalNamespace() map[string][]*resource.Resource + + // NonNamespaceable returns a slice of resources that + // cannot be placed in a namespace, e.g. + // Node, ClusterRole, Namespace itself, etc. + NonNamespaceable() []*resource.Resource + + // AllIds returns all CurrentIds. + AllIds() []resid.ResId + + // Replace replaces the resource with the matching CurId. + // Error if there's no match or more than one match. + // Returns the index where the replacement happened. + Replace(*resource.Resource) (int, error) + + // Remove removes the resource whose CurId matches the argument. + // Error if not found. + Remove(resid.ResId) error + + // Clear removes all resources and Ids. + Clear() + + // SubsetThatCouldBeReferencedByResource returns a ResMap subset + // of self with resources that could be referenced by the + // resource argument. + // This is a filter; it excludes things that cannot be + // referenced by the resource, e.g. objects in other + // namespaces. Cluster wide objects are never excluded. + SubsetThatCouldBeReferencedByResource(*resource.Resource) ResMap + + // DeepCopy copies the ResMap and underlying resources. + DeepCopy() ResMap + + // ShallowCopy copies the ResMap but + // not the underlying resources. + ShallowCopy() ResMap + + // ErrorIfNotEqualSets returns an error if the + // argument doesn't have the same resources as self. + // Ordering is _not_ taken into account, + // as this function was solely used in tests written + // before internal resource order was maintained, + // and those tests are initialized with maps which + // by definition have random ordering, and will + // fail spuriously. + // TODO: modify tests to not use resmap.FromMap, + // TODO: - and replace this with a stricter equals. + ErrorIfNotEqualSets(ResMap) error + + // ErrorIfNotEqualLists returns an error if the + // argument doesn't have the resource objects + // data as self, in the same order. + // Meta information is ignored; this is similar + // to comparing the AsYaml() strings, but allows + // for more informed errors on not equals. + ErrorIfNotEqualLists(ResMap) error + + // Debug prints the ResMap. + Debug(title string) + + // Select returns a list of resources that + // are selected by a Selector + Select(types.Selector) ([]*resource.Resource, error) + + // ToRNodeSlice converts the resources in the resmp + // to a list of RNodes + ToRNodeSlice() ([]*yaml.RNode, error) + + // ApplySmPatch applies a strategic-merge patch to the + // selected set of resources. + ApplySmPatch( + selectedSet *resource.IdSet, patch *resource.Resource) error + + // RemoveBuildAnnotations removes annotations created by the build process. + RemoveBuildAnnotations() +} diff --git a/vendor/sigs.k8s.io/kustomize/api/resmap/reswrangler.go b/vendor/sigs.k8s.io/kustomize/api/resmap/reswrangler.go new file mode 100644 index 000000000000..f76276c481b0 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/resmap/reswrangler.go @@ -0,0 +1,643 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package resmap + +import ( + "bytes" + "fmt" + "strings" + + "github.com/pkg/errors" + "sigs.k8s.io/kustomize/api/resid" + "sigs.k8s.io/kustomize/api/resource" + "sigs.k8s.io/kustomize/api/types" + kyaml_yaml "sigs.k8s.io/kustomize/kyaml/yaml" + "sigs.k8s.io/yaml" +) + +// resWrangler implements ResMap. +type resWrangler struct { + // Resource list maintained in load (append) order. + // This is important for transformers, which must + // be performed in a specific order, and for users + // who for whatever reasons wish the order they + // specify in kustomizations to be maintained and + // available as an option for final YAML rendering. + rList []*resource.Resource +} + +func newOne() *resWrangler { + result := &resWrangler{} + result.Clear() + return result +} + +// Clear implements ResMap. +func (m *resWrangler) Clear() { + m.rList = nil +} + +// Size implements ResMap. +func (m *resWrangler) Size() int { + return len(m.rList) +} + +func (m *resWrangler) indexOfResource(other *resource.Resource) int { + for i, r := range m.rList { + if r == other { + return i + } + } + return -1 +} + +// Resources implements ResMap. +func (m *resWrangler) Resources() []*resource.Resource { + tmp := make([]*resource.Resource, len(m.rList)) + copy(tmp, m.rList) + return tmp +} + +// Append implements ResMap. +func (m *resWrangler) Append(res *resource.Resource) error { + id := res.CurId() + if r := m.GetMatchingResourcesByCurrentId(id.Equals); len(r) > 0 { + return fmt.Errorf( + "may not add resource with an already registered id: %s", id) + } + m.rList = append(m.rList, res) + return nil +} + +// Remove implements ResMap. +func (m *resWrangler) Remove(adios resid.ResId) error { + tmp := newOne() + for _, r := range m.rList { + if r.CurId() != adios { + tmp.Append(r) + } + } + if tmp.Size() != m.Size()-1 { + return fmt.Errorf("id %s not found in removal", adios) + } + m.rList = tmp.rList + return nil +} + +// Replace implements ResMap. +func (m *resWrangler) Replace(res *resource.Resource) (int, error) { + id := res.CurId() + i, err := m.GetIndexOfCurrentId(id) + if err != nil { + return -1, errors.Wrap(err, "in Replace") + } + if i < 0 { + return -1, fmt.Errorf("cannot find resource with id %s to replace", id) + } + m.rList[i] = res + return i, nil +} + +// AllIds implements ResMap. +func (m *resWrangler) AllIds() (ids []resid.ResId) { + ids = make([]resid.ResId, m.Size()) + for i, r := range m.rList { + ids[i] = r.CurId() + } + return +} + +// Debug implements ResMap. +func (m *resWrangler) Debug(title string) { + fmt.Println("--------------------------- " + title) + firstObj := true + for i, r := range m.rList { + if firstObj { + firstObj = false + } else { + fmt.Println("---") + } + fmt.Printf("# %d %s\n", i, r.OrgId()) + m, err := r.Map() + if err != nil { + panic(err) + } + blob, err := yaml.Marshal(m) + if err != nil { + panic(err) + } + fmt.Println(string(blob)) + } +} + +type IdMatcher func(resid.ResId) bool + +// GetByIndex implements ResMap. +func (m *resWrangler) GetByIndex(i int) *resource.Resource { + if i < 0 || i >= m.Size() { + return nil + } + return m.rList[i] +} + +// GetIndexOfCurrentId implements ResMap. +func (m *resWrangler) GetIndexOfCurrentId(id resid.ResId) (int, error) { + count := 0 + result := -1 + for i, r := range m.rList { + if id.Equals(r.CurId()) { + count++ + result = i + } + } + if count > 1 { + return -1, fmt.Errorf("id matched %d resources", count) + } + return result, nil +} + +type IdFromResource func(r *resource.Resource) resid.ResId + +func GetCurrentId(r *resource.Resource) resid.ResId { return r.CurId() } + +// GetMatchingResourcesByCurrentId implements ResMap. +func (m *resWrangler) GetMatchingResourcesByCurrentId( + matches IdMatcher) []*resource.Resource { + return m.filteredById(matches, GetCurrentId) +} + +// GetMatchingResourcesByAnyId implements ResMap. +func (m *resWrangler) GetMatchingResourcesByAnyId( + matches IdMatcher) []*resource.Resource { + var result []*resource.Resource + for _, r := range m.rList { + for _, id := range append(r.PrevIds(), r.CurId()) { + if matches(id) { + result = append(result, r) + break + } + } + } + return result +} + +func (m *resWrangler) filteredById( + matches IdMatcher, idGetter IdFromResource) []*resource.Resource { + var result []*resource.Resource + for _, r := range m.rList { + if matches(idGetter(r)) { + result = append(result, r) + } + } + return result +} + +// GetByCurrentId implements ResMap. +func (m *resWrangler) GetByCurrentId( + id resid.ResId) (*resource.Resource, error) { + return demandOneMatch(m.GetMatchingResourcesByCurrentId, id, "Current") +} + +// GetById implements ResMap. +func (m *resWrangler) GetById( + id resid.ResId) (*resource.Resource, error) { + r, err := demandOneMatch(m.GetMatchingResourcesByAnyId, id, "Id") + if err != nil { + return nil, fmt.Errorf( + "%s; failed to find unique target for patch %s", + err.Error(), id.GvknString()) + } + return r, nil +} + +type resFinder func(IdMatcher) []*resource.Resource + +func demandOneMatch( + f resFinder, id resid.ResId, s string) (*resource.Resource, error) { + r := f(id.Equals) + if len(r) == 1 { + return r[0], nil + } + if len(r) > 1 { + return nil, fmt.Errorf("multiple matches for %s %s", s, id) + } + return nil, fmt.Errorf("no matches for %sId %s", s, id) +} + +// GroupedByCurrentNamespace implements ResMap.GroupByCurrentNamespace +func (m *resWrangler) GroupedByCurrentNamespace() map[string][]*resource.Resource { + items := m.groupedByCurrentNamespace() + delete(items, resid.TotallyNotANamespace) + return items +} + +// NonNamespaceable implements ResMap.NonNamespaceable +func (m *resWrangler) NonNamespaceable() []*resource.Resource { + return m.groupedByCurrentNamespace()[resid.TotallyNotANamespace] +} + +func (m *resWrangler) groupedByCurrentNamespace() map[string][]*resource.Resource { + byNamespace := make(map[string][]*resource.Resource) + for _, res := range m.rList { + namespace := res.CurId().EffectiveNamespace() + if _, found := byNamespace[namespace]; !found { + byNamespace[namespace] = []*resource.Resource{} + } + byNamespace[namespace] = append(byNamespace[namespace], res) + } + return byNamespace +} + +// GroupedByNamespace implements ResMap.GroupByOrginalNamespace +func (m *resWrangler) GroupedByOriginalNamespace() map[string][]*resource.Resource { + items := m.groupedByOriginalNamespace() + delete(items, resid.TotallyNotANamespace) + return items +} + +func (m *resWrangler) groupedByOriginalNamespace() map[string][]*resource.Resource { + byNamespace := make(map[string][]*resource.Resource) + for _, res := range m.rList { + namespace := res.OrgId().EffectiveNamespace() + if _, found := byNamespace[namespace]; !found { + byNamespace[namespace] = []*resource.Resource{} + } + byNamespace[namespace] = append(byNamespace[namespace], res) + } + return byNamespace +} + +// AsYaml implements ResMap. +func (m *resWrangler) AsYaml() ([]byte, error) { + firstObj := true + var b []byte + buf := bytes.NewBuffer(b) + for _, res := range m.Resources() { + out, err := res.AsYAML() + if err != nil { + m, _ := res.Map() + return nil, errors.Wrapf(err, "%#v", m) + } + if firstObj { + firstObj = false + } else { + if _, err = buf.WriteString("---\n"); err != nil { + return nil, err + } + } + if _, err = buf.Write(out); err != nil { + return nil, err + } + } + return buf.Bytes(), nil +} + +// ErrorIfNotEqualSets implements ResMap. +func (m *resWrangler) ErrorIfNotEqualSets(other ResMap) error { + m2, ok := other.(*resWrangler) + if !ok { + panic("bad cast") + } + if m.Size() != m2.Size() { + return fmt.Errorf( + "lists have different number of entries: %#v doesn't equal %#v", + m.rList, m2.rList) + } + seen := make(map[int]bool) + for _, r1 := range m.rList { + id := r1.CurId() + others := m2.GetMatchingResourcesByCurrentId(id.Equals) + if len(others) == 0 { + return fmt.Errorf( + "id in self missing from other; id: %s", id) + } + if len(others) > 1 { + return fmt.Errorf( + "id in self matches %d in other; id: %s", len(others), id) + } + r2 := others[0] + if !r1.KunstructEqual(r2) { + return fmt.Errorf( + "kunstruct not equal: \n -- %s,\n -- %s\n\n--\n%#v\n------\n%#v\n", + r1, r2, r1, r2) + } + seen[m2.indexOfResource(r2)] = true + } + if len(seen) != m.Size() { + return fmt.Errorf("counting problem %d != %d", len(seen), m.Size()) + } + return nil +} + +// ErrorIfNotEqualList implements ResMap. +func (m *resWrangler) ErrorIfNotEqualLists(other ResMap) error { + m2, ok := other.(*resWrangler) + if !ok { + panic("bad cast") + } + if m.Size() != m2.Size() { + return fmt.Errorf( + "lists have different number of entries: %#v doesn't equal %#v", + m.rList, m2.rList) + } + for i, r1 := range m.rList { + r2 := m2.rList[i] + if err := r1.ErrIfNotEquals(r2); err != nil { + return err + } + } + return nil +} + +type resCopier func(r *resource.Resource) *resource.Resource + +// ShallowCopy implements ResMap. +func (m *resWrangler) ShallowCopy() ResMap { + return m.makeCopy( + func(r *resource.Resource) *resource.Resource { + return r + }) +} + +// DeepCopy implements ResMap. +func (m *resWrangler) DeepCopy() ResMap { + return m.makeCopy( + func(r *resource.Resource) *resource.Resource { + return r.DeepCopy() + }) +} + +// makeCopy copies the ResMap. +func (m *resWrangler) makeCopy(copier resCopier) ResMap { + result := &resWrangler{} + result.rList = make([]*resource.Resource, m.Size()) + for i, r := range m.rList { + result.rList[i] = copier(r) + } + return result +} + +// SubsetThatCouldBeReferencedByResource implements ResMap. +func (m *resWrangler) SubsetThatCouldBeReferencedByResource( + referrer *resource.Resource) ResMap { + referrerId := referrer.CurId() + if !referrerId.IsNamespaceableKind() { + // A cluster scoped resource can refer to anything. + return m + } + result := newOne() + roleBindingNamespaces := getNamespacesForRoleBinding(referrer) + for _, possibleTarget := range m.Resources() { + id := possibleTarget.CurId() + if !id.IsNamespaceableKind() { + // A cluster-scoped resource can be referred to by anything. + result.append(possibleTarget) + continue + } + if id.IsNsEquals(referrerId) { + // The two objects are in the same namespace. + result.append(possibleTarget) + continue + } + // The two objects are namespaced (not cluster-scoped), AND + // are in different namespaces. + // There's still a chance they can refer to each other. + ns := possibleTarget.GetNamespace() + if roleBindingNamespaces[ns] { + result.append(possibleTarget) + } + } + return result +} + +// getNamespacesForRoleBinding returns referenced ServiceAccount namespaces +// if the resource is a RoleBinding +func getNamespacesForRoleBinding(r *resource.Resource) map[string]bool { + result := make(map[string]bool) + if r.GetKind() != "RoleBinding" { + return result + } + subjects, err := r.GetSlice("subjects") + if err != nil || subjects == nil { + return result + } + for _, s := range subjects { + subject := s.(map[string]interface{}) + if ns, ok1 := subject["namespace"]; ok1 { + if kind, ok2 := subject["kind"]; ok2 { + if kind.(string) == "ServiceAccount" { + result[ns.(string)] = true + } + } + } + } + return result +} + +func (m *resWrangler) append(res *resource.Resource) { + m.rList = append(m.rList, res) +} + +// AppendAll implements ResMap. +func (m *resWrangler) AppendAll(other ResMap) error { + if other == nil { + return nil + } + for _, res := range other.Resources() { + if err := m.Append(res); err != nil { + return err + } + } + return nil +} + +// AbsorbAll implements ResMap. +func (m *resWrangler) AbsorbAll(other ResMap) error { + if other == nil { + return nil + } + for _, r := range other.Resources() { + err := m.appendReplaceOrMerge(r) + if err != nil { + return err + } + } + return nil +} + +func (m *resWrangler) appendReplaceOrMerge(res *resource.Resource) error { + id := res.CurId() + matches := m.GetMatchingResourcesByAnyId(id.Equals) + switch len(matches) { + case 0: + switch res.Behavior() { + case types.BehaviorMerge, types.BehaviorReplace: + return fmt.Errorf( + "id %#v does not exist; cannot merge or replace", id) + default: + // presumably types.BehaviorCreate + return m.Append(res) + } + case 1: + old := matches[0] + if old == nil { + return fmt.Errorf("id lookup failure") + } + index := m.indexOfResource(old) + if index < 0 { + return fmt.Errorf("indexing problem") + } + switch res.Behavior() { + case types.BehaviorReplace: + res.CopyMergeMetaDataFieldsFrom(old) + case types.BehaviorMerge: + res.CopyMergeMetaDataFieldsFrom(old) + res.MergeDataMapFrom(old) + res.MergeBinaryDataMapFrom(old) + default: + return fmt.Errorf( + "id %#v exists; behavior must be merge or replace", id) + } + i, err := m.Replace(res) + if err != nil { + return err + } + if i != index { + return fmt.Errorf("unexpected target index in replacement") + } + return nil + default: + return fmt.Errorf( + "found multiple objects %v that could accept merge of %v", + matches, id) + } +} + +// Select returns a list of resources that +// are selected by a Selector +func (m *resWrangler) Select(s types.Selector) ([]*resource.Resource, error) { + var result []*resource.Resource + sr, err := types.NewSelectorRegex(&s) + if err != nil { + return nil, err + } + for _, r := range m.Resources() { + curId := r.CurId() + orgId := r.OrgId() + + // It first tries to match with the original namespace + // then matches with the current namespace + if !sr.MatchNamespace(orgId.EffectiveNamespace()) && + !sr.MatchNamespace(curId.EffectiveNamespace()) { + continue + } + + // It first tries to match with the original name + // then matches with the current name + if !sr.MatchName(orgId.Name) && + !sr.MatchName(curId.Name) { + continue + } + + // matches the GVK + if !sr.MatchGvk(r.GetGvk()) { + continue + } + + // matches the label selector + matched, err := r.MatchesLabelSelector(s.LabelSelector) + if err != nil { + return nil, err + } + if !matched { + continue + } + + // matches the annotation selector + matched, err = r.MatchesAnnotationSelector(s.AnnotationSelector) + if err != nil { + return nil, err + } + if !matched { + continue + } + result = append(result, r) + } + return result, nil +} + +// ToRNodeSlice converts the resources in the resmp +// to a list of RNodes +func (m *resWrangler) ToRNodeSlice() ([]*kyaml_yaml.RNode, error) { + var rnodes []*kyaml_yaml.RNode + for _, r := range m.Resources() { + s, err := r.AsYAML() + if err != nil { + return nil, err + } + rnode, err := kyaml_yaml.Parse(string(s)) + if err != nil { + return nil, err + } + rnodes = append(rnodes, rnode) + } + return rnodes, nil +} + +func (m *resWrangler) ApplySmPatch( + selectedSet *resource.IdSet, patch *resource.Resource) error { + newRm := New() + for _, res := range m.Resources() { + if !selectedSet.Contains(res.CurId()) { + newRm.Append(res) + continue + } + patchCopy := patch.DeepCopy() + patchCopy.CopyMergeMetaDataFieldsFrom(patch) + patchCopy.SetGvk(res.GetGvk()) + err := res.ApplySmPatch(patchCopy) + if err != nil { + // Check for an error string from UnmarshalJSON that's indicative + // of an object that's missing basic KRM fields, and thus may have been + // entirely deleted (an acceptable outcome). This error handling should + // be deleted along with use of ResMap and apimachinery functions like + // UnmarshalJSON. + if !strings.Contains(err.Error(), "Object 'Kind' is missing") { + // Some unknown error, let it through. + return err + } + empty, err := res.IsEmpty() + if err != nil { + return err + } + if !empty { + m, _ := res.Map() + return errors.Wrapf( + err, "with unexpectedly non-empty object map of size %d", + len(m)) + } + // Fall through to handle deleted object. + } + empty, err := res.IsEmpty() + if err != nil { + return err + } + if !empty { + // IsEmpty means all fields have been removed from the object. + // This can happen if a patch required deletion of the + // entire resource (not just a part of it). This means + // the overall resmap must shrink by one. + newRm.Append(res) + } + } + m.Clear() + m.AppendAll(newRm) + return nil +} + +func (m *resWrangler) RemoveBuildAnnotations() { + for _, r := range m.Resources() { + r.RemoveBuildAnnotations() + } +} diff --git a/vendor/sigs.k8s.io/kustomize/api/resource/conflictdetector.go b/vendor/sigs.k8s.io/kustomize/api/resource/conflictdetector.go new file mode 100644 index 000000000000..f079cdd5abbf --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/resource/conflictdetector.go @@ -0,0 +1,20 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package resource + +import "sigs.k8s.io/kustomize/api/resid" + +// ConflictDetector detects conflicts between resources. +type ConflictDetector interface { + // HasConflict returns true if the given resources have a conflict. + HasConflict(patch1, patch2 *Resource) (bool, error) + // Merge two resources into one. + MergePatches(patch1, patch2 *Resource) (*Resource, error) +} + +// ConflictDetectorFactory makes instances of ConflictDetector that know +// how to handle the given Group, Version, Kind tuple. +type ConflictDetectorFactory interface { + New(gvk resid.Gvk) (ConflictDetector, error) +} diff --git a/vendor/sigs.k8s.io/kustomize/api/resource/doc.go b/vendor/sigs.k8s.io/kustomize/api/resource/doc.go new file mode 100644 index 000000000000..32d34b1626f6 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/resource/doc.go @@ -0,0 +1,5 @@ +// Copyright 2020 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +// Package resource implements representations of k8s API resources. +package resource diff --git a/vendor/sigs.k8s.io/kustomize/api/resource/factory.go b/vendor/sigs.k8s.io/kustomize/api/resource/factory.go new file mode 100644 index 000000000000..df08c5dbf511 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/resource/factory.go @@ -0,0 +1,181 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package resource + +import ( + "encoding/json" + "fmt" + "log" + "strings" + + "sigs.k8s.io/kustomize/api/ifc" + "sigs.k8s.io/kustomize/api/internal/kusterr" + "sigs.k8s.io/kustomize/api/resid" + "sigs.k8s.io/kustomize/api/types" +) + +// Factory makes instances of Resource. +type Factory struct { + kf ifc.KunstructuredFactory +} + +// NewFactory makes an instance of Factory. +func NewFactory(kf ifc.KunstructuredFactory) *Factory { + return &Factory{kf: kf} +} + +func (rf *Factory) Hasher() ifc.KunstructuredHasher { + return rf.kf.Hasher() +} + +// FromMap returns a new instance of Resource. +func (rf *Factory) FromMap(m map[string]interface{}) *Resource { + return rf.makeOne(rf.kf.FromMap(m), nil) +} + +// FromMapWithName returns a new instance with the given "original" name. +func (rf *Factory) FromMapWithName(n string, m map[string]interface{}) *Resource { + return rf.FromMapWithNamespaceAndName(resid.DefaultNamespace, n, m) +} + +// FromMapWithNamespaceAndName returns a new instance with the given "original" namespace. +func (rf *Factory) FromMapWithNamespaceAndName(ns string, n string, m map[string]interface{}) *Resource { + return rf.makeOne(rf.kf.FromMap(m), nil).setPreviousNamespaceAndName(ns, n) +} + +// FromMapAndOption returns a new instance of Resource with given options. +func (rf *Factory) FromMapAndOption( + m map[string]interface{}, args *types.GeneratorArgs) *Resource { + return rf.makeOne(rf.kf.FromMap(m), types.NewGenArgs(args)) +} + +// FromKunstructured returns a new instance of Resource. +func (rf *Factory) FromKunstructured(u ifc.Kunstructured) *Resource { + return rf.makeOne(u, nil) +} + +// makeOne returns a new instance of Resource. +func (rf *Factory) makeOne( + u ifc.Kunstructured, o *types.GenArgs) *Resource { + if u == nil { + log.Fatal("unstruct ifc must not be null") + } + if o == nil { + o = types.NewGenArgs(nil) + } + r := &Resource{ + kunStr: u, + options: o, + } + return r +} + +// SliceFromPatches returns a slice of resources given a patch path +// slice from a kustomization file. +func (rf *Factory) SliceFromPatches( + ldr ifc.Loader, paths []types.PatchStrategicMerge) ([]*Resource, error) { + var result []*Resource + for _, path := range paths { + content, err := ldr.Load(string(path)) + if err != nil { + return nil, err + } + res, err := rf.SliceFromBytes(content) + if err != nil { + return nil, kusterr.Handler(err, string(path)) + } + result = append(result, res...) + } + return result, nil +} + +// FromBytes unmarshalls bytes into one Resource. +func (rf *Factory) FromBytes(in []byte) (*Resource, error) { + result, err := rf.SliceFromBytes(in) + if err != nil { + return nil, err + } + if len(result) != 1 { + return nil, fmt.Errorf( + "expected 1 resource, found %d in %v", len(result), in) + } + return result[0], nil +} + +// SliceFromBytes unmarshals bytes into a Resource slice. +func (rf *Factory) SliceFromBytes(in []byte) ([]*Resource, error) { + kunStructs, err := rf.kf.SliceFromBytes(in) + if err != nil { + return nil, err + } + var result []*Resource + for len(kunStructs) > 0 { + u := kunStructs[0] + kunStructs = kunStructs[1:] + if strings.HasSuffix(u.GetKind(), "List") { + m, err := u.Map() + if err != nil { + return nil, err + } + items := m["items"] + itemsSlice, ok := items.([]interface{}) + if !ok { + if items == nil { + // an empty list + continue + } + return nil, fmt.Errorf("items in List is type %T, expected array", items) + } + for _, item := range itemsSlice { + itemJSON, err := json.Marshal(item) + if err != nil { + return nil, err + } + innerU, err := rf.kf.SliceFromBytes(itemJSON) + if err != nil { + return nil, err + } + // append innerU to kunStructs so nested Lists can be handled + kunStructs = append(kunStructs, innerU...) + } + } else { + result = append(result, rf.FromKunstructured(u)) + } + } + return result, nil +} + +// SliceFromBytesWithNames unmarshals bytes into a Resource slice with specified original +// name. +func (rf *Factory) SliceFromBytesWithNames(names []string, in []byte) ([]*Resource, error) { + result, err := rf.SliceFromBytes(in) + if err != nil { + return nil, err + } + if len(names) != len(result) { + return nil, fmt.Errorf("number of names doesn't match number of resources") + } + for i, res := range result { + res.setPreviousNamespaceAndName(resid.DefaultNamespace, names[i]) + } + return result, nil +} + +// MakeConfigMap makes an instance of Resource for ConfigMap +func (rf *Factory) MakeConfigMap(kvLdr ifc.KvLoader, args *types.ConfigMapArgs) (*Resource, error) { + u, err := rf.kf.MakeConfigMap(kvLdr, args) + if err != nil { + return nil, err + } + return rf.makeOne(u, types.NewGenArgs(&args.GeneratorArgs)), nil +} + +// MakeSecret makes an instance of Resource for Secret +func (rf *Factory) MakeSecret(kvLdr ifc.KvLoader, args *types.SecretArgs) (*Resource, error) { + u, err := rf.kf.MakeSecret(kvLdr, args) + if err != nil { + return nil, err + } + return rf.makeOne(u, types.NewGenArgs(&args.GeneratorArgs)), nil +} diff --git a/vendor/sigs.k8s.io/kustomize/api/resource/idset.go b/vendor/sigs.k8s.io/kustomize/api/resource/idset.go new file mode 100644 index 000000000000..eaa253381642 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/resource/idset.go @@ -0,0 +1,30 @@ +// Copyright 2020 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package resource + +import "sigs.k8s.io/kustomize/api/resid" + +type IdSet struct { + ids map[resid.ResId]bool +} + +func MakeIdSet(slice []*Resource) *IdSet { + set := make(map[resid.ResId]bool) + for _, r := range slice { + id := r.CurId() + if _, ok := set[id]; !ok { + set[id] = true + } + } + return &IdSet{ids: set} +} + +func (s IdSet) Contains(id resid.ResId) bool { + _, ok := s.ids[id] + return ok +} + +func (s IdSet) Size() int { + return len(s.ids) +} diff --git a/vendor/sigs.k8s.io/kustomize/api/resource/resource.go b/vendor/sigs.k8s.io/kustomize/api/resource/resource.go new file mode 100644 index 000000000000..d9f2b107b032 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/resource/resource.go @@ -0,0 +1,523 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package resource + +import ( + "errors" + "fmt" + "log" + "reflect" + "strings" + + "sigs.k8s.io/kustomize/api/filters/patchstrategicmerge" + "sigs.k8s.io/kustomize/api/ifc" + "sigs.k8s.io/kustomize/api/internal/wrappy" + "sigs.k8s.io/kustomize/api/konfig" + "sigs.k8s.io/kustomize/api/resid" + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/filtersutil" + "sigs.k8s.io/kustomize/kyaml/kio" + kyaml "sigs.k8s.io/kustomize/kyaml/yaml" + "sigs.k8s.io/yaml" +) + +// Resource is a representation of a Kubernetes Resource Model (KRM) object +// paired with metadata used by kustomize. +// For more history, see sigs.k8s.io/kustomize/api/ifc.Unstructured +type Resource struct { + kunStr ifc.Kunstructured + options *types.GenArgs + refBy []resid.ResId + refVarNames []string +} + +const ( + buildAnnotationPreviousNames = konfig.ConfigAnnoDomain + "/previousNames" + buildAnnotationPrefixes = konfig.ConfigAnnoDomain + "/prefixes" + buildAnnotationSuffixes = konfig.ConfigAnnoDomain + "/suffixes" + buildAnnotationPreviousNamespaces = konfig.ConfigAnnoDomain + "/previousNamespaces" +) + +var buildAnnotations = []string{ + buildAnnotationPreviousNames, + buildAnnotationPrefixes, + buildAnnotationSuffixes, + buildAnnotationPreviousNamespaces, +} + +func (r *Resource) ResetPrimaryData(incoming *Resource) { + r.kunStr = incoming.Copy() +} + +func (r *Resource) GetAnnotations() map[string]string { + annotations := r.kunStr.GetAnnotations() + if annotations == nil { + return make(map[string]string) + } + return annotations +} + +func (r *Resource) Copy() ifc.Kunstructured { + return r.kunStr.Copy() +} + +func (r *Resource) GetFieldValue(f string) (interface{}, error) { + return r.kunStr.GetFieldValue(f) +} + +func (r *Resource) GetDataMap() map[string]string { + return r.kunStr.GetDataMap() +} + +func (r *Resource) GetBinaryDataMap() map[string]string { + return r.kunStr.GetBinaryDataMap() +} + +func (r *Resource) GetGvk() resid.Gvk { + return r.kunStr.GetGvk() +} + +func (r *Resource) GetKind() string { + return r.kunStr.GetKind() +} + +func (r *Resource) GetLabels() map[string]string { + return r.kunStr.GetLabels() +} + +func (r *Resource) GetName() string { + return r.kunStr.GetName() +} + +func (r *Resource) GetSlice(p string) ([]interface{}, error) { + return r.kunStr.GetSlice(p) +} + +func (r *Resource) GetString(p string) (string, error) { + return r.kunStr.GetString(p) +} + +func (r *Resource) IsEmpty() (bool, error) { + m, err := r.kunStr.Map() + return len(m) == 0, err +} + +func (r *Resource) Map() (map[string]interface{}, error) { + return r.kunStr.Map() +} + +func (r *Resource) MarshalJSON() ([]byte, error) { + return r.kunStr.MarshalJSON() +} + +func (r *Resource) MatchesLabelSelector(selector string) (bool, error) { + return r.kunStr.MatchesLabelSelector(selector) +} + +func (r *Resource) MatchesAnnotationSelector(selector string) (bool, error) { + return r.kunStr.MatchesAnnotationSelector(selector) +} + +func (r *Resource) SetAnnotations(m map[string]string) { + if len(m) == 0 { + // Force field erasure. + r.kunStr.SetAnnotations(nil) + return + } + r.kunStr.SetAnnotations(m) +} + +func (r *Resource) SetDataMap(m map[string]string) { + r.kunStr.SetDataMap(m) +} + +func (r *Resource) SetBinaryDataMap(m map[string]string) { + r.kunStr.SetBinaryDataMap(m) +} + +func (r *Resource) SetGvk(gvk resid.Gvk) { + r.kunStr.SetGvk(gvk) +} + +func (r *Resource) SetLabels(m map[string]string) { + if len(m) == 0 { + // Force field erasure. + r.kunStr.SetLabels(nil) + return + } + r.kunStr.SetLabels(m) +} + +func (r *Resource) SetName(n string) { + r.kunStr.SetName(n) +} + +func (r *Resource) SetNamespace(n string) { + r.kunStr.SetNamespace(n) +} + +func (r *Resource) UnmarshalJSON(s []byte) error { + return r.kunStr.UnmarshalJSON(s) +} + +// ResCtx is an interface describing the contextual added +// kept kustomize in the context of each Resource object. +// Currently mainly the name prefix and name suffix are added. +type ResCtx interface { + AddNamePrefix(p string) + AddNameSuffix(s string) + GetNamePrefixes() []string + GetNameSuffixes() []string +} + +// ResCtxMatcher returns true if two Resources are being +// modified in the same kustomize context. +type ResCtxMatcher func(ResCtx) bool + +// DeepCopy returns a new copy of resource +func (r *Resource) DeepCopy() *Resource { + rc := &Resource{ + kunStr: r.Copy(), + } + rc.copyOtherFields(r) + return rc +} + +// CopyMergeMetaDataFields copies everything but the non-metadata in +// the ifc.Kunstructured map, merging labels and annotations. +func (r *Resource) CopyMergeMetaDataFieldsFrom(other *Resource) { + r.SetLabels(mergeStringMaps(other.GetLabels(), r.GetLabels())) + r.SetAnnotations( + mergeStringMaps(other.GetAnnotations(), r.GetAnnotations())) + r.SetName(other.GetName()) + r.SetNamespace(other.GetNamespace()) + r.copyOtherFields(other) +} + +func (r *Resource) copyOtherFields(other *Resource) { + r.options = other.options + r.refBy = other.copyRefBy() + r.refVarNames = copyStringSlice(other.refVarNames) +} + +func (r *Resource) MergeDataMapFrom(o *Resource) { + r.SetDataMap(mergeStringMaps(o.GetDataMap(), r.GetDataMap())) +} + +func (r *Resource) MergeBinaryDataMapFrom(o *Resource) { + r.SetBinaryDataMap(mergeStringMaps(o.GetBinaryDataMap(), r.GetBinaryDataMap())) +} + +func (r *Resource) ErrIfNotEquals(o *Resource) error { + meYaml, err := r.AsYAML() + if err != nil { + return err + } + otherYaml, err := o.AsYAML() + if err != nil { + return err + } + if !r.ReferencesEqual(o) { + return fmt.Errorf( + `unequal references - self: +%sreferenced by: %s +--- other: +%sreferenced by: %s +`, meYaml, r.GetRefBy(), otherYaml, o.GetRefBy()) + } + if string(meYaml) != string(otherYaml) { + return fmt.Errorf(`--- self: +%s +--- other: +%s +`, meYaml, otherYaml) + } + return nil +} + +func (r *Resource) ReferencesEqual(other *Resource) bool { + setSelf := make(map[resid.ResId]bool) + setOther := make(map[resid.ResId]bool) + for _, ref := range other.refBy { + setOther[ref] = true + } + for _, ref := range r.refBy { + if _, ok := setOther[ref]; !ok { + return false + } + setSelf[ref] = true + } + return len(setSelf) == len(setOther) +} + +func (r *Resource) KunstructEqual(o *Resource) bool { + return reflect.DeepEqual(r.kunStr, o.kunStr) +} + +func (r *Resource) copyRefBy() []resid.ResId { + if r.refBy == nil { + return nil + } + s := make([]resid.ResId, len(r.refBy)) + copy(s, r.refBy) + return s +} + +func copyStringSlice(s []string) []string { + if s == nil { + return nil + } + c := make([]string, len(s)) + copy(c, s) + return c +} + +// Implements ResCtx AddNamePrefix +func (r *Resource) AddNamePrefix(p string) { + r.appendCsvAnnotation(buildAnnotationPrefixes, p) +} + +// Implements ResCtx AddNameSuffix +func (r *Resource) AddNameSuffix(s string) { + r.appendCsvAnnotation(buildAnnotationSuffixes, s) +} + +func (r *Resource) appendCsvAnnotation(name, value string) { + if value == "" { + return + } + annotations := r.GetAnnotations() + if existing, ok := annotations[name]; ok { + annotations[name] = existing + "," + value + } else { + annotations[name] = value + } + r.SetAnnotations(annotations) +} + +func SameEndingSubarray(shortest, longest []string) bool { + if len(shortest) > len(longest) { + longest, shortest = shortest, longest + } + diff := len(longest) - len(shortest) + if len(shortest) == 0 { + return diff == 0 + } + for i := len(shortest) - 1; i >= 0; i-- { + if longest[i+diff] != shortest[i] { + return false + } + } + return true +} + +// Implements ResCtx GetNamePrefixes +func (r *Resource) GetNamePrefixes() []string { + return r.getCsvAnnotation(buildAnnotationPrefixes) +} + +// Implements ResCtx GetNameSuffixes +func (r *Resource) GetNameSuffixes() []string { + return r.getCsvAnnotation(buildAnnotationSuffixes) +} + +func (r *Resource) getCsvAnnotation(name string) []string { + annotations := r.GetAnnotations() + if _, ok := annotations[name]; !ok { + return nil + } + return strings.Split(annotations[name], ",") +} + +// PrefixesSuffixesEquals is conceptually doing the same task +// as OutermostPrefixSuffix but performs a deeper comparison +// of the suffix and prefix slices. +func (r *Resource) PrefixesSuffixesEquals(o ResCtx) bool { + return SameEndingSubarray(r.GetNamePrefixes(), o.GetNamePrefixes()) && SameEndingSubarray(r.GetNameSuffixes(), o.GetNameSuffixes()) +} + +// RemoveBuildAnnotations removes annotations created by the build process. +// These are internal-only to kustomize, added to the data pipeline to +// track name changes so name references can be fixed. +func (r *Resource) RemoveBuildAnnotations() { + annotations := r.GetAnnotations() + if len(annotations) == 0 { + return + } + for _, a := range buildAnnotations { + delete(annotations, a) + } + r.SetAnnotations(annotations) +} + +func (r *Resource) setPreviousNamespaceAndName(ns string, n string) *Resource { + r.appendCsvAnnotation(buildAnnotationPreviousNames, n) + r.appendCsvAnnotation(buildAnnotationPreviousNamespaces, ns) + return r +} + +// String returns resource as JSON. +func (r *Resource) String() string { + bs, err := r.MarshalJSON() + if err != nil { + return "<" + err.Error() + ">" + } + return strings.TrimSpace(string(bs)) + r.options.String() +} + +// AsYAML returns the resource in Yaml form. +// Easier to read than JSON. +func (r *Resource) AsYAML() ([]byte, error) { + json, err := r.MarshalJSON() + if err != nil { + return nil, err + } + return yaml.JSONToYAML(json) +} + +// MustYaml returns YAML or panics. +func (r *Resource) MustYaml() string { + yml, err := r.AsYAML() + if err != nil { + log.Fatal(err) + } + return string(yml) +} + +// SetOptions updates the generator options for the resource. +func (r *Resource) SetOptions(o *types.GenArgs) { + r.options = o +} + +// Behavior returns the behavior for the resource. +func (r *Resource) Behavior() types.GenerationBehavior { + return r.options.Behavior() +} + +// NeedHashSuffix returns true if a resource content +// hash should be appended to the name of the resource. +func (r *Resource) NeedHashSuffix() bool { + return r.options != nil && r.options.ShouldAddHashSuffixToName() +} + +// GetNamespace returns the namespace the resource thinks it's in. +func (r *Resource) GetNamespace() string { + namespace, _ := r.GetString("metadata.namespace") + // if err, namespace is empty, so no need to check. + return namespace +} + +// OrgId returns the original, immutable ResId for the resource. +// This doesn't have to be unique in a ResMap. +func (r *Resource) OrgId() resid.ResId { + ids := r.PrevIds() + if len(ids) > 0 { + return ids[0] + } + return r.CurId() +} + +// PrevIds returns a list of ResIds that includes every +// previous ResId the resource has had through all of its +// GVKN transformations, in the order that it had that ID. +// I.e. the oldest ID is first. +// The returned array does not include the resource's current +// ID. If there are no previous IDs, this will return nil. +func (r *Resource) PrevIds() []resid.ResId { + var ids []resid.ResId + // TODO: merge previous names and namespaces into one list of + // pairs on one annotation so there is no chance of error + names := r.getCsvAnnotation(buildAnnotationPreviousNames) + ns := r.getCsvAnnotation(buildAnnotationPreviousNamespaces) + if len(names) != len(ns) { + panic(errors.New( + "number of previous names not equal to " + + "number of previous namespaces")) + } + for i := range names { + ids = append(ids, resid.NewResIdWithNamespace( + r.GetGvk(), names[i], ns[i])) + } + return ids +} + +// StorePreviousId stores the resource's current ID via build annotations. +func (r *Resource) StorePreviousId() { + id := r.CurId() + r.setPreviousNamespaceAndName(id.EffectiveNamespace(), id.Name) +} + +// CurId returns a ResId for the resource using the +// mutable parts of the resource. +// This should be unique in any ResMap. +func (r *Resource) CurId() resid.ResId { + return resid.NewResIdWithNamespace( + r.GetGvk(), r.GetName(), r.GetNamespace()) +} + +// GetRefBy returns the ResIds that referred to current resource +func (r *Resource) GetRefBy() []resid.ResId { + return r.refBy +} + +// AppendRefBy appends a ResId into the refBy list +func (r *Resource) AppendRefBy(id resid.ResId) { + r.refBy = append(r.refBy, id) +} + +// GetRefVarNames returns vars that refer to current resource +func (r *Resource) GetRefVarNames() []string { + return r.refVarNames +} + +// AppendRefVarName appends a name of a var into the refVar list +func (r *Resource) AppendRefVarName(variable types.Var) { + r.refVarNames = append(r.refVarNames, variable.Name) +} + +// ApplySmPatch applies the provided strategic merge patch. +func (r *Resource) ApplySmPatch(patch *Resource) error { + node, err := filtersutil.GetRNode(patch) + if err != nil { + return err + } + n, ns := r.GetName(), r.GetNamespace() + err = r.ApplyFilter(patchstrategicmerge.Filter{ + Patch: node, + }) + if err != nil { + return err + } + empty, err := r.IsEmpty() + if err != nil { + return err + } + if !empty { + r.SetName(n) + r.SetNamespace(ns) + } + return err +} + +func (r *Resource) ApplyFilter(f kio.Filter) error { + if wn, ok := r.kunStr.(*wrappy.WNode); ok { + l, err := f.Filter([]*kyaml.RNode{wn.AsRNode()}) + if len(l) == 0 { + // Hack to deal with deletion. + r.kunStr = wrappy.NewWNode() + } + return err + } + return filtersutil.ApplyToJSON(f, r) +} + +func mergeStringMaps(maps ...map[string]string) map[string]string { + result := map[string]string{} + for _, m := range maps { + for key, value := range m { + result[key] = value + } + } + return result +} diff --git a/vendor/sigs.k8s.io/kustomize/api/types/builtinpluginloadingoptions_string.go b/vendor/sigs.k8s.io/kustomize/api/types/builtinpluginloadingoptions_string.go new file mode 100644 index 000000000000..033a4512349a --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/types/builtinpluginloadingoptions_string.go @@ -0,0 +1,25 @@ +// Code generated by "stringer -type=BuiltinPluginLoadingOptions"; DO NOT EDIT. + +package types + +import "strconv" + +func _() { + // An "invalid array index" compiler error signifies that the constant values have changed. + // Re-run the stringer command to generate them again. + var x [1]struct{} + _ = x[BploUndefined-0] + _ = x[BploUseStaticallyLinked-1] + _ = x[BploLoadFromFileSys-2] +} + +const _BuiltinPluginLoadingOptions_name = "BploUndefinedBploUseStaticallyLinkedBploLoadFromFileSys" + +var _BuiltinPluginLoadingOptions_index = [...]uint8{0, 13, 36, 55} + +func (i BuiltinPluginLoadingOptions) String() string { + if i < 0 || i >= BuiltinPluginLoadingOptions(len(_BuiltinPluginLoadingOptions_index)-1) { + return "BuiltinPluginLoadingOptions(" + strconv.FormatInt(int64(i), 10) + ")" + } + return _BuiltinPluginLoadingOptions_name[_BuiltinPluginLoadingOptions_index[i]:_BuiltinPluginLoadingOptions_index[i+1]] +} diff --git a/vendor/sigs.k8s.io/kustomize/api/types/configmapargs.go b/vendor/sigs.k8s.io/kustomize/api/types/configmapargs.go new file mode 100644 index 000000000000..69877769fb2c --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/types/configmapargs.go @@ -0,0 +1,10 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package types + +// ConfigMapArgs contains the metadata of how to generate a configmap. +type ConfigMapArgs struct { + // GeneratorArgs for the configmap. + GeneratorArgs `json:",inline,omitempty" yaml:",inline,omitempty"` +} diff --git a/vendor/sigs.k8s.io/kustomize/api/types/doc.go b/vendor/sigs.k8s.io/kustomize/api/types/doc.go new file mode 100644 index 000000000000..22c38a651024 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/types/doc.go @@ -0,0 +1,9 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +// Package types holds the definition of the kustomization struct and +// supporting structs. It's the k8s API conformant object that describes +// a set of generation and transformation operations to create and/or +// modify k8s resources. +// A kustomization file is a serialization of this struct. +package types diff --git a/vendor/sigs.k8s.io/kustomize/api/types/erronlybuiltinpluginsallowed.go b/vendor/sigs.k8s.io/kustomize/api/types/erronlybuiltinpluginsallowed.go new file mode 100644 index 000000000000..73ee95fd7d81 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/types/erronlybuiltinpluginsallowed.go @@ -0,0 +1,33 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package types + +import ( + "fmt" + + "github.com/pkg/errors" +) + +type errOnlyBuiltinPluginsAllowed struct { + name string +} + +func (e *errOnlyBuiltinPluginsAllowed) Error() string { + return fmt.Sprintf( + "external plugins disabled; unable to load external plugin '%s'", + e.name) +} + +func NewErrOnlyBuiltinPluginsAllowed(n string) *errOnlyBuiltinPluginsAllowed { + return &errOnlyBuiltinPluginsAllowed{name: n} +} + +func IsErrOnlyBuiltinPluginsAllowed(err error) bool { + _, ok := err.(*errOnlyBuiltinPluginsAllowed) + if ok { + return true + } + _, ok = errors.Cause(err).(*errOnlyBuiltinPluginsAllowed) + return ok +} diff --git a/vendor/sigs.k8s.io/kustomize/api/types/errunabletofind.go b/vendor/sigs.k8s.io/kustomize/api/types/errunabletofind.go new file mode 100644 index 000000000000..a39e9a38546b --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/types/errunabletofind.go @@ -0,0 +1,40 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package types + +import ( + "fmt" + "strings" + + "github.com/pkg/errors" +) + +type errUnableToFind struct { + // What are we unable to find? + what string + // What things did we try? + attempts []Pair +} + +func (e *errUnableToFind) Error() string { + var m []string + for _, p := range e.attempts { + m = append(m, "('"+p.Value+"'; "+p.Key+")") + } + return fmt.Sprintf( + "unable to find plugin root - tried: %s", strings.Join(m, ", ")) +} + +func NewErrUnableToFind(w string, a []Pair) *errUnableToFind { + return &errUnableToFind{what: w, attempts: a} +} + +func IsErrUnableToFind(err error) bool { + _, ok := err.(*errUnableToFind) + if ok { + return true + } + _, ok = errors.Cause(err).(*errUnableToFind) + return ok +} diff --git a/vendor/sigs.k8s.io/kustomize/api/types/fieldspec.go b/vendor/sigs.k8s.io/kustomize/api/types/fieldspec.go new file mode 100644 index 000000000000..f5b711ee576c --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/types/fieldspec.go @@ -0,0 +1,92 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package types + +import ( + "fmt" + + "sigs.k8s.io/kustomize/api/resid" +) + +// FieldSpec completely specifies a kustomizable field in +// an unstructured representation of a k8s API object. +// It helps define the operands of transformations. +// +// For example, a directive to add a common label to objects +// will need to know that a 'Deployment' object (in API group +// 'apps', any version) can have labels at field path +// 'spec/template/metadata/labels', and further that it is OK +// (or not OK) to add that field path to the object if the +// field path doesn't exist already. +// +// This would look like +// { +// group: apps +// kind: Deployment +// path: spec/template/metadata/labels +// create: true +// } +type FieldSpec struct { + resid.Gvk `json:",inline,omitempty" yaml:",inline,omitempty"` + Path string `json:"path,omitempty" yaml:"path,omitempty"` + CreateIfNotPresent bool `json:"create,omitempty" yaml:"create,omitempty"` +} + +func (fs FieldSpec) String() string { + return fmt.Sprintf( + "%s:%v:%s", fs.Gvk.String(), fs.CreateIfNotPresent, fs.Path) +} + +// If true, the primary key is the same, but other fields might not be. +func (fs FieldSpec) effectivelyEquals(other FieldSpec) bool { + return fs.IsSelected(&other.Gvk) && fs.Path == other.Path +} + +type FsSlice []FieldSpec + +func (s FsSlice) Len() int { return len(s) } +func (s FsSlice) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s FsSlice) Less(i, j int) bool { + return s[i].Gvk.IsLessThan(s[j].Gvk) +} + +// MergeAll merges the argument into this, returning the result. +// Items already present are ignored. +// Items that conflict (primary key matches, but remain data differs) +// result in an error. +func (s FsSlice) MergeAll(incoming FsSlice) (result FsSlice, err error) { + result = s + for _, x := range incoming { + result, err = result.MergeOne(x) + if err != nil { + return nil, err + } + } + return result, nil +} + +// MergeOne merges the argument into this, returning the result. +// If the item's primary key is already present, and there are no +// conflicts, it is ignored (we don't want duplicates). +// If there is a conflict, the merge fails. +func (s FsSlice) MergeOne(x FieldSpec) (FsSlice, error) { + i := s.index(x) + if i > -1 { + // It's already there. + if s[i].CreateIfNotPresent != x.CreateIfNotPresent { + return nil, fmt.Errorf("conflicting fieldspecs") + } + return s, nil + } + return append(s, x), nil +} + +func (s FsSlice) index(fs FieldSpec) int { + for i, x := range s { + if x.effectivelyEquals(fs) { + return i + } + } + return -1 +} diff --git a/vendor/sigs.k8s.io/kustomize/api/types/fix.go b/vendor/sigs.k8s.io/kustomize/api/types/fix.go new file mode 100644 index 000000000000..de70467ed9d4 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/types/fix.go @@ -0,0 +1,54 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package types + +import ( + "regexp" + + "sigs.k8s.io/yaml" +) + +// FixKustomizationPreUnmarshalling modifies the raw data +// before marshalling - e.g. changes old field names to +// new field names. +func FixKustomizationPreUnmarshalling(data []byte) ([]byte, error) { + deprecatedFieldsMap := map[string]string{ + "imageTags:": "images:", + } + for oldname, newname := range deprecatedFieldsMap { + pattern := regexp.MustCompile(oldname) + data = pattern.ReplaceAll(data, []byte(newname)) + } + doLegacy, err := useLegacyPatch(data) + if err != nil { + return nil, err + } + if doLegacy { + pattern := regexp.MustCompile("patches:") + data = pattern.ReplaceAll(data, []byte("patchesStrategicMerge:")) + } + return data, nil +} + +func useLegacyPatch(data []byte) (bool, error) { + found := false + var object map[string]interface{} + err := yaml.Unmarshal(data, &object) + if err != nil { + return false, err + } + if rawPatches, ok := object["patches"]; ok { + patches, ok := rawPatches.([]interface{}) + if !ok { + return false, err + } + for _, p := range patches { + _, ok := p.(string) + if ok { + found = true + } + } + } + return found, nil +} diff --git a/vendor/sigs.k8s.io/kustomize/api/types/genargs.go b/vendor/sigs.k8s.io/kustomize/api/types/genargs.go new file mode 100644 index 000000000000..a3229c8e3391 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/types/genargs.go @@ -0,0 +1,46 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package types + +import ( + "strconv" + "strings" +) + +// GenArgs is a facade over GeneratorArgs, exposing a few readonly properties. +type GenArgs struct { + args *GeneratorArgs +} + +// NewGenArgs returns a new instance of GenArgs. +func NewGenArgs(args *GeneratorArgs) *GenArgs { + return &GenArgs{args: args} +} + +func (g *GenArgs) String() string { + if g == nil { + return "{nilGenArgs}" + } + return "{" + + strings.Join([]string{ + "nsfx:" + strconv.FormatBool(g.ShouldAddHashSuffixToName()), + "beh:" + g.Behavior().String()}, + ",") + + "}" +} + +// ShouldAddHashSuffixToName returns true if a resource +// content hash should be appended to the name of the resource. +func (g *GenArgs) ShouldAddHashSuffixToName() bool { + return g.args != nil && + (g.args.Options == nil || !g.args.Options.DisableNameSuffixHash) +} + +// Behavior returns Behavior field of GeneratorArgs +func (g *GenArgs) Behavior() GenerationBehavior { + if g.args == nil { + return BehaviorUnspecified + } + return NewGenerationBehavior(g.args.Behavior) +} diff --git a/vendor/sigs.k8s.io/kustomize/api/types/generationbehavior.go b/vendor/sigs.k8s.io/kustomize/api/types/generationbehavior.go new file mode 100644 index 000000000000..f8f36278032e --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/types/generationbehavior.go @@ -0,0 +1,46 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package types + +// GenerationBehavior specifies generation behavior of configmaps, secrets and maybe other resources. +type GenerationBehavior int + +const ( + // BehaviorUnspecified is an Unspecified behavior; typically treated as a Create. + BehaviorUnspecified GenerationBehavior = iota + // BehaviorCreate makes a new resource. + BehaviorCreate + // BehaviorReplace replaces a resource. + BehaviorReplace + // BehaviorMerge attempts to merge a new resource with an existing resource. + BehaviorMerge +) + +// String converts a GenerationBehavior to a string. +func (b GenerationBehavior) String() string { + switch b { + case BehaviorReplace: + return "replace" + case BehaviorMerge: + return "merge" + case BehaviorCreate: + return "create" + default: + return "unspecified" + } +} + +// NewGenerationBehavior converts a string to a GenerationBehavior. +func NewGenerationBehavior(s string) GenerationBehavior { + switch s { + case "replace": + return BehaviorReplace + case "merge": + return BehaviorMerge + case "create": + return BehaviorCreate + default: + return BehaviorUnspecified + } +} diff --git a/vendor/sigs.k8s.io/kustomize/api/types/generatorargs.go b/vendor/sigs.k8s.io/kustomize/api/types/generatorargs.go new file mode 100644 index 000000000000..a4145db3d8c1 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/types/generatorargs.go @@ -0,0 +1,27 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package types + +// GeneratorArgs contains arguments common to ConfigMap and Secret generators. +type GeneratorArgs struct { + // Namespace for the configmap, optional + Namespace string `json:"namespace,omitempty" yaml:"namespace,omitempty"` + + // Name - actually the partial name - of the generated resource. + // The full name ends up being something like + // NamePrefix + this.Name + hash(content of generated resource). + Name string `json:"name,omitempty" yaml:"name,omitempty"` + + // Behavior of generated resource, must be one of: + // 'create': create a new one + // 'replace': replace the existing one + // 'merge': merge with the existing one + Behavior string `json:"behavior,omitempty" yaml:"behavior,omitempty"` + + // KvPairSources for the generator. + KvPairSources `json:",inline,omitempty" yaml:",inline,omitempty"` + + // Local overrides to global generatorOptions field. + Options *GeneratorOptions `json:"options,omitempty" yaml:"options,omitempty"` +} diff --git a/vendor/sigs.k8s.io/kustomize/api/types/generatoroptions.go b/vendor/sigs.k8s.io/kustomize/api/types/generatoroptions.go new file mode 100644 index 000000000000..c30f6517d0bc --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/types/generatoroptions.go @@ -0,0 +1,70 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package types + +// GeneratorOptions modify behavior of all ConfigMap and Secret generators. +type GeneratorOptions struct { + // Labels to add to all generated resources. + Labels map[string]string `json:"labels,omitempty" yaml:"labels,omitempty"` + + // Annotations to add to all generated resources. + Annotations map[string]string `json:"annotations,omitempty" yaml:"annotations,omitempty"` + + // DisableNameSuffixHash if true disables the default behavior of adding a + // suffix to the names of generated resources that is a hash of the + // resource contents. + DisableNameSuffixHash bool `json:"disableNameSuffixHash,omitempty" yaml:"disableNameSuffixHash,omitempty"` +} + +// MergeGlobalOptionsIntoLocal merges two instances of GeneratorOptions. +// Values in the first 'local' argument cannot be overridden by the second +// 'global' argument, except in the case of booleans. +// +// With booleans, there's no way to distinguish an 'intentional' +// false from 'default' false. So the rule is, if the global value +// of the value of a boolean is true, i.e. disable, it trumps the +// local value. If the global value is false, then the local value is +// respected. Bottom line: a local false cannot override a global true. +// +// boolean fields are always a bad idea; should always use enums instead. +func MergeGlobalOptionsIntoLocal( + localOpts *GeneratorOptions, + globalOpts *GeneratorOptions) *GeneratorOptions { + if globalOpts == nil { + return localOpts + } + if localOpts == nil { + localOpts = &GeneratorOptions{} + } + overrideMap(&localOpts.Labels, globalOpts.Labels) + overrideMap(&localOpts.Annotations, globalOpts.Annotations) + if globalOpts.DisableNameSuffixHash { + localOpts.DisableNameSuffixHash = true + } + return localOpts +} + +func overrideMap(localMap *map[string]string, globalMap map[string]string) { + if *localMap == nil { + if globalMap != nil { + *localMap = CopyMap(globalMap) + } + return + } + for k, v := range globalMap { + _, ok := (*localMap)[k] + if !ok { + (*localMap)[k] = v + } + } +} + +// CopyMap copies a map. +func CopyMap(in map[string]string) map[string]string { + out := make(map[string]string) + for k, v := range in { + out[k] = v + } + return out +} diff --git a/vendor/sigs.k8s.io/kustomize/api/types/helmchartargs.go b/vendor/sigs.k8s.io/kustomize/api/types/helmchartargs.go new file mode 100644 index 000000000000..570372083786 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/types/helmchartargs.go @@ -0,0 +1,22 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package types + +// HelmChartArgs contains the metadata of how to generate a secret. +type HelmChartArgs struct { + ChartName string `json:"chartName,omitempty" yaml:"chartName,omitempty"` + ChartVersion string `json:"chartVersion,omitempty" yaml:"chartVersion,omitempty"` + ChartRepoURL string `json:"chartRepoUrl,omitempty" yaml:"chartRepoUrl,omitempty"` + ChartHome string `json:"chartHome,omitempty" yaml:"chartHome,omitempty"` + // Use chartRelease to keep compatible with old exec plugin + ChartRepoName string `json:"chartRelease,omitempty" yaml:"chartRelease,omitempty"` + HelmBin string `json:"helmBin,omitempty" yaml:"helmBin,omitempty"` + HelmHome string `json:"helmHome,omitempty" yaml:"helmHome,omitempty"` + Values string `json:"values,omitempty" yaml:"values,omitempty"` + ValuesLocal map[string]interface{} `json:"valuesLocal,omitempty" yaml:"valuesLocal,omitempty"` + ValuesMerge string `json:"valuesMerge,omitempty" yaml:"valuesMerge,omitempty"` + ReleaseName string `json:"releaseName,omitempty" yaml:"releaseName,omitempty"` + ReleaseNamespace string `json:"releaseNamespace,omitempty" yaml:"releaseNamespace,omitempty"` + ExtraArgs []string `json:"extraArgs,omitempty" yaml:"extraArgs,omitempty"` +} diff --git a/vendor/sigs.k8s.io/kustomize/api/types/image.go b/vendor/sigs.k8s.io/kustomize/api/types/image.go new file mode 100644 index 000000000000..c7982338f4a5 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/types/image.go @@ -0,0 +1,21 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package types + +// Image contains an image name, a new name, a new tag or digest, +// which will replace the original name and tag. +type Image struct { + // Name is a tag-less image name. + Name string `json:"name,omitempty" yaml:"name,omitempty"` + + // NewName is the value used to replace the original name. + NewName string `json:"newName,omitempty" yaml:"newName,omitempty"` + + // NewTag is the value used to replace the original tag. + NewTag string `json:"newTag,omitempty" yaml:"newTag,omitempty"` + + // Digest is the value used to replace the original image tag. + // If digest is present NewTag value is ignored. + Digest string `json:"digest,omitempty" yaml:"digest,omitempty"` +} diff --git a/vendor/sigs.k8s.io/kustomize/api/types/inventory.go b/vendor/sigs.k8s.io/kustomize/api/types/inventory.go new file mode 100644 index 000000000000..544deb5e5deb --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/types/inventory.go @@ -0,0 +1,16 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package types + +// Inventory records all objects touched in a build operation. +type Inventory struct { + Type string `json:"type,omitempty" yaml:"type,omitempty"` + ConfigMap NameArgs `json:"configMap,omitempty" yaml:"configMap,omitempty"` +} + +// NameArgs holds both namespace and name. +type NameArgs struct { + Name string `json:"name,omitempty" yaml:"name,omitempty"` + Namespace string `json:"namespace,omitempty" yaml:"namespace,omitempty"` +} diff --git a/vendor/sigs.k8s.io/kustomize/api/types/kustomization.go b/vendor/sigs.k8s.io/kustomize/api/types/kustomization.go new file mode 100644 index 000000000000..30f0e4b2e578 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/types/kustomization.go @@ -0,0 +1,225 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package types + +import ( + "bytes" + "encoding/json" + + "sigs.k8s.io/yaml" +) + +const ( + KustomizationVersion = "kustomize.config.k8s.io/v1beta1" + KustomizationKind = "Kustomization" + ComponentVersion = "kustomize.config.k8s.io/v1alpha1" + ComponentKind = "Component" + MetadataNamespacePath = "metadata/namespace" +) + +// Kustomization holds the information needed to generate customized k8s api resources. +type Kustomization struct { + TypeMeta `json:",inline" yaml:",inline"` + + // MetaData is a pointer to avoid marshalling empty struct + MetaData *ObjectMeta `json:"metadata,omitempty" yaml:"metadata,omitempty"` + + // OpenAPI contains information about what kubernetes schema to use. + OpenAPI map[string]string `json:"openapi,omitempty" yaml:"openapi,omitempty"` + + // + // Operators - what kustomize can do. + // + + // NamePrefix will prefix the names of all resources mentioned in the kustomization + // file including generated configmaps and secrets. + NamePrefix string `json:"namePrefix,omitempty" yaml:"namePrefix,omitempty"` + + // NameSuffix will suffix the names of all resources mentioned in the kustomization + // file including generated configmaps and secrets. + NameSuffix string `json:"nameSuffix,omitempty" yaml:"nameSuffix,omitempty"` + + // Namespace to add to all objects. + Namespace string `json:"namespace,omitempty" yaml:"namespace,omitempty"` + + // CommonLabels to add to all objects and selectors. + CommonLabels map[string]string `json:"commonLabels,omitempty" yaml:"commonLabels,omitempty"` + + // CommonAnnotations to add to all objects. + CommonAnnotations map[string]string `json:"commonAnnotations,omitempty" yaml:"commonAnnotations,omitempty"` + + // PatchesStrategicMerge specifies the relative path to a file + // containing a strategic merge patch. Format documented at + // https://github.com/kubernetes/community/blob/master/contributors/devel/strategic-merge-patch.md + // URLs and globs are not supported. + PatchesStrategicMerge []PatchStrategicMerge `json:"patchesStrategicMerge,omitempty" yaml:"patchesStrategicMerge,omitempty"` + + // JSONPatches is a list of JSONPatch for applying JSON patch. + // Format documented at https://tools.ietf.org/html/rfc6902 + // and http://jsonpatch.com + PatchesJson6902 []Patch `json:"patchesJson6902,omitempty" yaml:"patchesJson6902,omitempty"` + + // Patches is a list of patches, where each one can be either a + // Strategic Merge Patch or a JSON patch. + // Each patch can be applied to multiple target objects. + Patches []Patch `json:"patches,omitempty" yaml:"patches,omitempty"` + + // Images is a list of (image name, new name, new tag or digest) + // for changing image names, tags or digests. This can also be achieved with a + // patch, but this operator is simpler to specify. + Images []Image `json:"images,omitempty" yaml:"images,omitempty"` + + // Replicas is a list of {resourcename, count} that allows for simpler replica + // specification. This can also be done with a patch. + Replicas []Replica `json:"replicas,omitempty" yaml:"replicas,omitempty"` + + // Vars allow things modified by kustomize to be injected into a + // kubernetes object specification. A var is a name (e.g. FOO) associated + // with a field in a specific resource instance. The field must + // contain a value of type string/bool/int/float, and defaults to the name field + // of the instance. Any appearance of "$(FOO)" in the object + // spec will be replaced at kustomize build time, after the final + // value of the specified field has been determined. + Vars []Var `json:"vars,omitempty" yaml:"vars,omitempty"` + + // + // Operands - what kustomize operates on. + // + + // Resources specifies relative paths to files holding YAML representations + // of kubernetes API objects, or specifications of other kustomizations + // via relative paths, absolute paths, or URLs. + Resources []string `json:"resources,omitempty" yaml:"resources,omitempty"` + + // Components specifies relative paths to specifications of other Components + // via relative paths, absolute paths, or URLs. + Components []string `json:"components,omitempty" yaml:"components,omitempty"` + + // Crds specifies relative paths to Custom Resource Definition files. + // This allows custom resources to be recognized as operands, making + // it possible to add them to the Resources list. + // CRDs themselves are not modified. + Crds []string `json:"crds,omitempty" yaml:"crds,omitempty"` + + // Deprecated. + // Anything that would have been specified here should + // be specified in the Resources field instead. + Bases []string `json:"bases,omitempty" yaml:"bases,omitempty"` + + // + // Generators (operators that create operands) + // + + // ConfigMapGenerator is a list of configmaps to generate from + // local data (one configMap per list item). + // The resulting resource is a normal operand, subject to + // name prefixing, patching, etc. By default, the name of + // the map will have a suffix hash generated from its contents. + ConfigMapGenerator []ConfigMapArgs `json:"configMapGenerator,omitempty" yaml:"configMapGenerator,omitempty"` + + // SecretGenerator is a list of secrets to generate from + // local data (one secret per list item). + // The resulting resource is a normal operand, subject to + // name prefixing, patching, etc. By default, the name of + // the map will have a suffix hash generated from its contents. + SecretGenerator []SecretArgs `json:"secretGenerator,omitempty" yaml:"secretGenerator,omitempty"` + + // HelmChartInflationGenerator is a list of helm chart configurations. + // The resulting resource is a normal operand rendered from + // a remote chart by `helm template` + HelmChartInflationGenerator []HelmChartArgs `json:"helmChartInflationGenerator,omitempty" yaml:"helmChartInflationGenerator,omitempty"` + + // GeneratorOptions modify behavior of all ConfigMap and Secret generators. + GeneratorOptions *GeneratorOptions `json:"generatorOptions,omitempty" yaml:"generatorOptions,omitempty"` + + // Configurations is a list of transformer configuration files + Configurations []string `json:"configurations,omitempty" yaml:"configurations,omitempty"` + + // Generators is a list of files containing custom generators + Generators []string `json:"generators,omitempty" yaml:"generators,omitempty"` + + // Transformers is a list of files containing transformers + Transformers []string `json:"transformers,omitempty" yaml:"transformers,omitempty"` + + // Validators is a list of files containing validators + Validators []string `json:"validators,omitempty" yaml:"validators,omitempty"` + + // Inventory appends an object that contains the record + // of all other objects, which can be used in apply, prune and delete + Inventory *Inventory `json:"inventory,omitempty" yaml:"inventory,omitempty"` +} + +// FixKustomizationPostUnmarshalling fixes things +// like empty fields that should not be empty, or +// moving content of deprecated fields to newer +// fields. +func (k *Kustomization) FixKustomizationPostUnmarshalling() { + if k.Kind == "" { + k.Kind = KustomizationKind + } + if k.APIVersion == "" { + if k.Kind == ComponentKind { + k.APIVersion = ComponentVersion + } else { + k.APIVersion = KustomizationVersion + } + } + k.Resources = append(k.Resources, k.Bases...) + k.Bases = nil + for i, g := range k.ConfigMapGenerator { + if g.EnvSource != "" { + k.ConfigMapGenerator[i].EnvSources = + append(g.EnvSources, g.EnvSource) + k.ConfigMapGenerator[i].EnvSource = "" + } + } + for i, g := range k.SecretGenerator { + if g.EnvSource != "" { + k.SecretGenerator[i].EnvSources = + append(g.EnvSources, g.EnvSource) + k.SecretGenerator[i].EnvSource = "" + } + } +} + +// FixKustomizationPreMarshalling fixes things +// that should occur after the kustomization file +// has been processed. +func (k *Kustomization) FixKustomizationPreMarshalling() { + // PatchesJson6902 should be under the Patches field. + k.Patches = append(k.Patches, k.PatchesJson6902...) + k.PatchesJson6902 = nil +} + +func (k *Kustomization) EnforceFields() []string { + var errs []string + if k.Kind != "" && k.Kind != KustomizationKind && k.Kind != ComponentKind { + errs = append(errs, "kind should be "+KustomizationKind+" or "+ComponentKind) + } + requiredVersion := KustomizationVersion + if k.Kind == ComponentKind { + requiredVersion = ComponentVersion + } + if k.APIVersion != "" && k.APIVersion != requiredVersion { + errs = append(errs, "apiVersion for "+k.Kind+" should be "+requiredVersion) + } + return errs +} + +// Unmarshal replace k with the content in YAML input y +func (k *Kustomization) Unmarshal(y []byte) error { + j, err := yaml.YAMLToJSON(y) + if err != nil { + return err + } + dec := json.NewDecoder(bytes.NewReader(j)) + dec.DisallowUnknownFields() + var nk Kustomization + err = dec.Decode(&nk) + if err != nil { + return err + } + *k = nk + return nil +} diff --git a/vendor/sigs.k8s.io/kustomize/api/types/kvpairsources.go b/vendor/sigs.k8s.io/kustomize/api/types/kvpairsources.go new file mode 100644 index 000000000000..9898defade9d --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/types/kvpairsources.go @@ -0,0 +1,36 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package types + +// KvPairSources defines places to obtain key value pairs. +type KvPairSources struct { + // LiteralSources is a list of literal + // pair sources. Each literal source should + // be a key and literal value, e.g. `key=value` + LiteralSources []string `json:"literals,omitempty" yaml:"literals,omitempty"` + + // FileSources is a list of file "sources" to + // use in creating a list of key, value pairs. + // A source takes the form: [{key}=]{path} + // If the "key=" part is missing, the key is the + // path's basename. If they "key=" part is present, + // it becomes the key (replacing the basename). + // In either case, the value is the file contents. + // Specifying a directory will iterate each named + // file in the directory whose basename is a + // valid configmap key. + FileSources []string `json:"files,omitempty" yaml:"files,omitempty"` + + // EnvSources is a list of file paths. + // The contents of each file should be one + // key=value pair per line, e.g. a Docker + // or npm ".env" file or a ".ini" file + // (wikipedia.org/wiki/INI_file) + EnvSources []string `json:"envs,omitempty" yaml:"envs,omitempty"` + + // Older, singular form of EnvSources. + // On edits (e.g. `kustomize fix`) this is merged into the plural form + // for consistency with LiteralSources and FileSources. + EnvSource string `json:"env,omitempty" yaml:"env,omitempty"` +} diff --git a/vendor/sigs.k8s.io/kustomize/api/types/loadrestrictions.go b/vendor/sigs.k8s.io/kustomize/api/types/loadrestrictions.go new file mode 100644 index 000000000000..6617abdac206 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/types/loadrestrictions.go @@ -0,0 +1,24 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package types + +// Restrictions on what things can be referred to +// in a kustomization file. +// +//go:generate stringer -type=LoadRestrictions +type LoadRestrictions int + +const ( + LoadRestrictionsUnknown LoadRestrictions = iota + + // Files referenced by a kustomization file must be in + // or under the directory holding the kustomization + // file itself. + LoadRestrictionsRootOnly + + // The kustomization file may specify absolute or + // relative paths to patch or resources files outside + // its own tree. + LoadRestrictionsNone +) diff --git a/vendor/sigs.k8s.io/kustomize/api/types/loadrestrictions_string.go b/vendor/sigs.k8s.io/kustomize/api/types/loadrestrictions_string.go new file mode 100644 index 000000000000..d2355950be85 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/types/loadrestrictions_string.go @@ -0,0 +1,25 @@ +// Code generated by "stringer -type=LoadRestrictions"; DO NOT EDIT. + +package types + +import "strconv" + +func _() { + // An "invalid array index" compiler error signifies that the constant values have changed. + // Re-run the stringer command to generate them again. + var x [1]struct{} + _ = x[LoadRestrictionsUnknown-0] + _ = x[LoadRestrictionsRootOnly-1] + _ = x[LoadRestrictionsNone-2] +} + +const _LoadRestrictions_name = "LoadRestrictionsUnknownLoadRestrictionsRootOnlyLoadRestrictionsNone" + +var _LoadRestrictions_index = [...]uint8{0, 23, 47, 67} + +func (i LoadRestrictions) String() string { + if i < 0 || i >= LoadRestrictions(len(_LoadRestrictions_index)-1) { + return "LoadRestrictions(" + strconv.FormatInt(int64(i), 10) + ")" + } + return _LoadRestrictions_name[_LoadRestrictions_index[i]:_LoadRestrictions_index[i+1]] +} diff --git a/vendor/sigs.k8s.io/kustomize/api/types/objectmeta.go b/vendor/sigs.k8s.io/kustomize/api/types/objectmeta.go new file mode 100644 index 000000000000..4f5d41f4a3a6 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/types/objectmeta.go @@ -0,0 +1,13 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package types + +// ObjectMeta partially copies apimachinery/pkg/apis/meta/v1.ObjectMeta +// No need for a direct dependence; the fields are stable. +type ObjectMeta struct { + Name string `json:"name,omitempty" yaml:"name,omitempty"` + Namespace string `json:"namespace,omitempty" yaml:"namespace,omitempty"` + Labels map[string]string `json:"labels,omitempty" yaml:"labels,omitempty"` + Annotations map[string]string `json:"annotations,omitempty" yaml:"annotations,omitempty"` +} diff --git a/vendor/sigs.k8s.io/kustomize/api/types/pair.go b/vendor/sigs.k8s.io/kustomize/api/types/pair.go new file mode 100644 index 000000000000..63cfb776e099 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/types/pair.go @@ -0,0 +1,10 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package types + +// Pair is a key value pair. +type Pair struct { + Key string + Value string +} diff --git a/vendor/sigs.k8s.io/kustomize/api/types/patch.go b/vendor/sigs.k8s.io/kustomize/api/types/patch.go new file mode 100644 index 000000000000..48b521d7e872 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/types/patch.go @@ -0,0 +1,28 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package types + +// Patch represent either a Strategic Merge Patch or a JSON patch +// and its targets. +// The content of the patch can either be from a file +// or from an inline string. +type Patch struct { + // Path is a relative file path to the patch file. + Path string `json:"path,omitempty" yaml:"path,omitempty"` + + // Patch is the content of a patch. + Patch string `json:"patch,omitempty" yaml:"patch,omitempty"` + + // Target points to the resources that the patch is applied to + Target *Selector `json:"target,omitempty" yaml:"target,omitempty"` +} + +// Equals return true if p equals o. +func (p *Patch) Equals(o Patch) bool { + targetEqual := (p.Target == o.Target) || + (p.Target != nil && o.Target != nil && *p.Target == *o.Target) + return p.Path == o.Path && + p.Patch == o.Patch && + targetEqual +} diff --git a/vendor/sigs.k8s.io/kustomize/api/types/patchstrategicmerge.go b/vendor/sigs.k8s.io/kustomize/api/types/patchstrategicmerge.go new file mode 100644 index 000000000000..81a5ba456d8f --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/types/patchstrategicmerge.go @@ -0,0 +1,9 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package types + +// PatchStrategicMerge represents a relative path to a +// stategic merge patch with the format +// https://github.com/kubernetes/community/blob/master/contributors/devel/sig-api-machinery/strategic-merge-patch.md +type PatchStrategicMerge string diff --git a/vendor/sigs.k8s.io/kustomize/api/types/pluginconfig.go b/vendor/sigs.k8s.io/kustomize/api/types/pluginconfig.go new file mode 100644 index 000000000000..2756f982681d --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/types/pluginconfig.go @@ -0,0 +1,35 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package types + +// PluginConfig holds plugin configuration. +type PluginConfig struct { + // AbsPluginHome is the home of kustomize plugins. + // Kustomize plugin configuration files are k8s-style objects + // containing the fields 'apiVersion' and 'kind', e.g. + // apiVersion: apps/v1 + // kind: Deployment + // kustomize reads plugin configuration data from a file path + // specified in the 'generators:' or 'transformers:' field of a + // kustomization file. kustomize must then use this data to both + // locate the plugin and configure it. + // Every kustomize plugin (its code, its tests, its supporting data + // files, etc.) must be housed in its own directory at + // ${AbsPluginHome}/${pluginApiVersion}/LOWERCASE(${pluginKind}) + // where + // - ${AbsPluginHome} is an absolute path, defined below. + // - ${pluginApiVersion} is taken from the plugin config file. + // - ${pluginKind} is taken from the plugin config file. + // The value of AbsPluginHome can be any absolute path. + AbsPluginHome string + + // PluginRestrictions distinguishes plugin restrictions. + PluginRestrictions PluginRestrictions + + // BpLoadingOptions distinguishes builtin plugin behaviors. + BpLoadingOptions BuiltinPluginLoadingOptions + + // FnpLoadingOptions sets the way function-based plugin behaviors. + FnpLoadingOptions FnPluginLoadingOptions +} diff --git a/vendor/sigs.k8s.io/kustomize/api/types/pluginrestrictions.go b/vendor/sigs.k8s.io/kustomize/api/types/pluginrestrictions.go new file mode 100644 index 000000000000..6dae63a97a1d --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/types/pluginrestrictions.go @@ -0,0 +1,58 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package types + +// Some plugin classes +// - builtin: plugins defined in the kustomize repo. +// May be freely used and re-configured. +// - local: plugins that aren't builtin but are +// locally defined (presumably by the user), meaning +// the kustomization refers to them via a relative +// file path, not a URL. +// - remote: require a build-time download to obtain. +// Unadvised, unless one controls the +// serving site. +// +//go:generate stringer -type=PluginRestrictions +type PluginRestrictions int + +const ( + PluginRestrictionsUnknown PluginRestrictions = iota + + // Non-builtin plugins completely disabled. + PluginRestrictionsBuiltinsOnly + + // No restrictions, do whatever you want. + PluginRestrictionsNone +) + +// BuiltinPluginLoadingOptions distinguish ways in which builtin plugins are used. +//go:generate stringer -type=BuiltinPluginLoadingOptions +type BuiltinPluginLoadingOptions int + +const ( + BploUndefined BuiltinPluginLoadingOptions = iota + + // Desired in production use for performance. + BploUseStaticallyLinked + + // Desired in testing and development cycles where it's undesirable + // to generate static code. + BploLoadFromFileSys +) + +// FnPluginLoadingOptions set way functions-based pluing are restricted +type FnPluginLoadingOptions struct { + // Allow to run executables + EnableExec bool + // Allow to run starlark + EnableStar bool + // Allow container access to network + Network bool + NetworkName string + // list of mounts + Mounts []string + // list of env variables to pass to fn + Env []string +} diff --git a/vendor/sigs.k8s.io/kustomize/api/types/pluginrestrictions_string.go b/vendor/sigs.k8s.io/kustomize/api/types/pluginrestrictions_string.go new file mode 100644 index 000000000000..b9dba7dfc6b1 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/types/pluginrestrictions_string.go @@ -0,0 +1,25 @@ +// Code generated by "stringer -type=PluginRestrictions"; DO NOT EDIT. + +package types + +import "strconv" + +func _() { + // An "invalid array index" compiler error signifies that the constant values have changed. + // Re-run the stringer command to generate them again. + var x [1]struct{} + _ = x[PluginRestrictionsUnknown-0] + _ = x[PluginRestrictionsBuiltinsOnly-1] + _ = x[PluginRestrictionsNone-2] +} + +const _PluginRestrictions_name = "PluginRestrictionsUnknownPluginRestrictionsBuiltinsOnlyPluginRestrictionsNone" + +var _PluginRestrictions_index = [...]uint8{0, 25, 55, 77} + +func (i PluginRestrictions) String() string { + if i < 0 || i >= PluginRestrictions(len(_PluginRestrictions_index)-1) { + return "PluginRestrictions(" + strconv.FormatInt(int64(i), 10) + ")" + } + return _PluginRestrictions_name[_PluginRestrictions_index[i]:_PluginRestrictions_index[i+1]] +} diff --git a/vendor/sigs.k8s.io/kustomize/api/types/replacement.go b/vendor/sigs.k8s.io/kustomize/api/types/replacement.go new file mode 100644 index 000000000000..57c2507ada7e --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/types/replacement.go @@ -0,0 +1,27 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package types + +// Replacement defines how to perform a substitution +// where it is from and where it is to. +type Replacement struct { + Source *ReplSource `json:"source" yaml:"source"` + Target *ReplTarget `json:"target" yaml:"target"` +} + +// ReplSource defines where a substitution is from +// It can from two different kinds of sources +// - from a field of one resource +// - from a string +type ReplSource struct { + ObjRef *Target `json:"objref,omitempty" yaml:"objref,omitempty"` + FieldRef string `json:"fieldref,omitempty" yaml:"fiedldref,omitempty"` + Value string `json:"value,omitempty" yaml:"value,omitempty"` +} + +// ReplTarget defines where a substitution is to. +type ReplTarget struct { + ObjRef *Selector `json:"objref,omitempty" yaml:"objref,omitempty"` + FieldRefs []string `json:"fieldrefs,omitempty" yaml:"fieldrefs,omitempty"` +} diff --git a/vendor/sigs.k8s.io/kustomize/api/types/replica.go b/vendor/sigs.k8s.io/kustomize/api/types/replica.go new file mode 100644 index 000000000000..8267366b5d46 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/types/replica.go @@ -0,0 +1,16 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package types + +// Replica specifies a modification to a replica config. +// The number of replicas of a resource whose name matches will be set to count. +// This struct is used by the ReplicaCountTransform, and is meant to supplement +// the existing patch functionality with a simpler syntax for replica configuration. +type Replica struct { + // The name of the resource to change the replica count + Name string `json:"name,omitempty" yaml:"name,omitempty"` + + // The number of replicas required. + Count int64 `json:"count" yaml:"count"` +} diff --git a/vendor/sigs.k8s.io/kustomize/api/types/secretargs.go b/vendor/sigs.k8s.io/kustomize/api/types/secretargs.go new file mode 100644 index 000000000000..62dbe26a732f --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/types/secretargs.go @@ -0,0 +1,19 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package types + +// SecretArgs contains the metadata of how to generate a secret. +type SecretArgs struct { + // GeneratorArgs for the secret. + GeneratorArgs `json:",inline,omitempty" yaml:",inline,omitempty"` + + // Type of the secret. + // + // This is the same field as the secret type field in v1/Secret: + // It can be "Opaque" (default), or "kubernetes.io/tls". + // + // If type is "kubernetes.io/tls", then "literals" or "files" must have exactly two + // keys: "tls.key" and "tls.crt" + Type string `json:"type,omitempty" yaml:"type,omitempty"` +} diff --git a/vendor/sigs.k8s.io/kustomize/api/types/selector.go b/vendor/sigs.k8s.io/kustomize/api/types/selector.go new file mode 100644 index 000000000000..007b508f1314 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/types/selector.go @@ -0,0 +1,115 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package types + +import ( + "regexp" + + "sigs.k8s.io/kustomize/api/resid" +) + +// Selector specifies a set of resources. +// Any resource that matches intersection of all conditions +// is included in this set. +type Selector struct { + resid.Gvk `json:",inline,omitempty" yaml:",inline,omitempty"` + Namespace string `json:"namespace,omitempty" yaml:"namespace,omitempty"` + Name string `json:"name,omitempty" yaml:"name,omitempty"` + + // AnnotationSelector is a string that follows the label selection expression + // https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#api + // It matches with the resource annotations. + AnnotationSelector string `json:"annotationSelector,omitempty" yaml:"annotationSelector,omitempty"` + + // LabelSelector is a string that follows the label selection expression + // https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#api + // It matches with the resource labels. + LabelSelector string `json:"labelSelector,omitempty" yaml:"labelSelector,omitempty"` +} + +// SelectorRegex is a Selector with regex in GVK +// Any resource that matches intersection of all conditions +// is included in this set. +type SelectorRegex struct { + selector *Selector + groupRegex *regexp.Regexp + versionRegex *regexp.Regexp + kindRegex *regexp.Regexp + nameRegex *regexp.Regexp + namespaceRegex *regexp.Regexp +} + +// NewSelectorRegex returns a pointer to a new SelectorRegex +// which uses the same condition as s. +func NewSelectorRegex(s *Selector) (*SelectorRegex, error) { + sr := new(SelectorRegex) + var err error + sr.selector = s + sr.groupRegex, err = regexp.Compile(anchorRegex(s.Gvk.Group)) + if err != nil { + return nil, err + } + sr.versionRegex, err = regexp.Compile(anchorRegex(s.Gvk.Version)) + if err != nil { + return nil, err + } + sr.kindRegex, err = regexp.Compile(anchorRegex(s.Gvk.Kind)) + if err != nil { + return nil, err + } + sr.nameRegex, err = regexp.Compile(anchorRegex(s.Name)) + if err != nil { + return nil, err + } + sr.namespaceRegex, err = regexp.Compile(anchorRegex(s.Namespace)) + if err != nil { + return nil, err + } + return sr, nil +} + +func anchorRegex(pattern string) string { + if pattern == "" { + return pattern + } + return "^(?:" + pattern + ")$" +} + +// MatchGvk return true if gvk can be matched by s. +func (s *SelectorRegex) MatchGvk(gvk resid.Gvk) bool { + if len(s.selector.Gvk.Group) > 0 { + if !s.groupRegex.MatchString(gvk.Group) { + return false + } + } + if len(s.selector.Gvk.Version) > 0 { + if !s.versionRegex.MatchString(gvk.Version) { + return false + } + } + if len(s.selector.Gvk.Kind) > 0 { + if !s.kindRegex.MatchString(gvk.Kind) { + return false + } + } + return true +} + +// MatchName returns true if the name in selector is +// empty or the n can be matches by the name in selector +func (s *SelectorRegex) MatchName(n string) bool { + if s.selector.Name == "" { + return true + } + return s.nameRegex.MatchString(n) +} + +// MatchNamespace returns true if the namespace in selector is +// empty or the ns can be matches by the namespace in selector +func (s *SelectorRegex) MatchNamespace(ns string) bool { + if s.selector.Namespace == "" { + return true + } + return s.namespaceRegex.MatchString(ns) +} diff --git a/vendor/sigs.k8s.io/kustomize/api/types/typemeta.go b/vendor/sigs.k8s.io/kustomize/api/types/typemeta.go new file mode 100644 index 000000000000..0ddafd3d80ed --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/types/typemeta.go @@ -0,0 +1,11 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package types + +// TypeMeta partially copies apimachinery/pkg/apis/meta/v1.TypeMeta +// No need for a direct dependence; the fields are stable. +type TypeMeta struct { + Kind string `json:"kind,omitempty" yaml:"kind,omitempty"` + APIVersion string `json:"apiVersion,omitempty" yaml:"apiVersion,omitempty"` +} diff --git a/vendor/sigs.k8s.io/kustomize/api/types/var.go b/vendor/sigs.k8s.io/kustomize/api/types/var.go new file mode 100644 index 000000000000..f636d0d35bbe --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/api/types/var.go @@ -0,0 +1,213 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package types + +import ( + "fmt" + "reflect" + "sort" + "strings" + + "sigs.k8s.io/kustomize/api/resid" +) + +const defaultFieldPath = "metadata.name" + +// Var represents a variable whose value will be sourced +// from a field in a Kubernetes object. +type Var struct { + // Value of identifier name e.g. FOO used in container args, annotations + // Appears in pod template as $(FOO) + Name string `json:"name" yaml:"name"` + + // ObjRef must refer to a Kubernetes resource under the + // purview of this kustomization. ObjRef should use the + // raw name of the object (the name specified in its YAML, + // before addition of a namePrefix and a nameSuffix). + ObjRef Target `json:"objref" yaml:"objref"` + + // FieldRef refers to the field of the object referred to by + // ObjRef whose value will be extracted for use in + // replacing $(FOO). + // If unspecified, this defaults to fieldPath: $defaultFieldPath + FieldRef FieldSelector `json:"fieldref,omitempty" yaml:"fieldref,omitempty"` +} + +// Target refers to a kubernetes object by Group, Version, Kind and Name +// gvk.Gvk contains Group, Version and Kind +// APIVersion is added to keep the backward compatibility of using ObjectReference +// for Var.ObjRef +type Target struct { + APIVersion string `json:"apiVersion,omitempty" yaml:"apiVersion,omitempty"` + resid.Gvk `json:",inline,omitempty" yaml:",inline,omitempty"` + Name string `json:"name" yaml:"name"` + Namespace string `json:"namespace,omitempty" yaml:"namespace,omitempty"` +} + +// GVK returns the Gvk object in Target +func (t *Target) GVK() resid.Gvk { + if t.APIVersion == "" { + return t.Gvk + } + versions := strings.Split(t.APIVersion, "/") + if len(versions) == 2 { + t.Group = versions[0] + t.Version = versions[1] + } + if len(versions) == 1 { + t.Version = versions[0] + } + return t.Gvk +} + +// FieldSelector contains the fieldPath to an object field. +// This struct is added to keep the backward compatibility of using ObjectFieldSelector +// for Var.FieldRef +type FieldSelector struct { + FieldPath string `json:"fieldPath,omitempty" yaml:"fieldPath,omitempty"` +} + +// defaulting sets reference to field used by default. +func (v *Var) Defaulting() { + if v.FieldRef.FieldPath == "" { + v.FieldRef.FieldPath = defaultFieldPath + } + v.ObjRef.GVK() +} + +// DeepEqual returns true if var a and b are Equals. +// Note 1: The objects are unchanged by the VarEqual +// Note 2: Should be normalize be FieldPath before doing +// the DeepEqual. spec.a[b] is supposed to be the same +// as spec.a.b +func (v Var) DeepEqual(other Var) bool { + v.Defaulting() + other.Defaulting() + return reflect.DeepEqual(v, other) +} + +// VarSet is a set of Vars where no var.Name is repeated. +type VarSet struct { + set map[string]Var +} + +// NewVarSet returns an initialized VarSet +func NewVarSet() VarSet { + return VarSet{set: map[string]Var{}} +} + +// AsSlice returns the vars as a slice. +func (vs *VarSet) AsSlice() []Var { + s := make([]Var, len(vs.set)) + i := 0 + for _, v := range vs.set { + s[i] = v + i++ + } + sort.Sort(byName(s)) + return s +} + +// Copy returns a copy of the var set. +func (vs *VarSet) Copy() VarSet { + newSet := make(map[string]Var, len(vs.set)) + for k, v := range vs.set { + newSet[k] = v + } + return VarSet{set: newSet} +} + +// MergeSet absorbs other vars with error on name collision. +func (vs *VarSet) MergeSet(incoming VarSet) error { + for _, incomingVar := range incoming.set { + if err := vs.Merge(incomingVar); err != nil { + return err + } + } + return nil +} + +// MergeSlice absorbs a Var slice with error on name collision. +// Empty fields in incoming vars are defaulted. +func (vs *VarSet) MergeSlice(incoming []Var) error { + for _, v := range incoming { + if err := vs.Merge(v); err != nil { + return err + } + } + return nil +} + +// Merge absorbs another Var with error on name collision. +// Empty fields in incoming Var is defaulted. +func (vs *VarSet) Merge(v Var) error { + if vs.Contains(v) { + return fmt.Errorf( + "var '%s' already encountered", v.Name) + } + v.Defaulting() + vs.set[v.Name] = v + return nil +} + +// AbsorbSet absorbs other vars with error on (name,value) collision. +func (vs *VarSet) AbsorbSet(incoming VarSet) error { + for _, v := range incoming.set { + if err := vs.Absorb(v); err != nil { + return err + } + } + return nil +} + +// AbsorbSlice absorbs a Var slice with error on (name,value) collision. +// Empty fields in incoming vars are defaulted. +func (vs *VarSet) AbsorbSlice(incoming []Var) error { + for _, v := range incoming { + if err := vs.Absorb(v); err != nil { + return err + } + } + return nil +} + +// Absorb absorbs another Var with error on (name,value) collision. +// Empty fields in incoming Var is defaulted. +func (vs *VarSet) Absorb(v Var) error { + conflicting := vs.Get(v.Name) + if conflicting == nil { + // no conflict. The var is valid. + v.Defaulting() + vs.set[v.Name] = v + return nil + } + + if !reflect.DeepEqual(v, *conflicting) { + // two vars with the same name are pointing at two + // different resources. + return fmt.Errorf( + "var '%s' already encountered", v.Name) + } + return nil +} + +// Contains is true if the set has the other var. +func (vs *VarSet) Contains(other Var) bool { + return vs.Get(other.Name) != nil +} + +// Get returns the var with the given name, else nil. +func (vs *VarSet) Get(name string) *Var { + if v, found := vs.set[name]; found { + return &v + } + return nil +} + +// byName is a sort interface which sorts Vars by name alphabetically +type byName []Var + +func (v byName) Len() int { return len(v) } +func (v byName) Swap(i, j int) { v[i], v[j] = v[j], v[i] } +func (v byName) Less(i, j int) bool { return v[i].Name < v[j].Name } diff --git a/vendor/sigs.k8s.io/kustomize/LICENSE b/vendor/sigs.k8s.io/kustomize/kyaml/LICENSE similarity index 100% rename from vendor/sigs.k8s.io/kustomize/LICENSE rename to vendor/sigs.k8s.io/kustomize/kyaml/LICENSE diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/LICENSE_TEMPLATE b/vendor/sigs.k8s.io/kustomize/kyaml/LICENSE_TEMPLATE new file mode 100644 index 000000000000..0c2b3b6556ae --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/LICENSE_TEMPLATE @@ -0,0 +1,2 @@ +Copyright {{.Year}} {{.Holder}} +SPDX-License-Identifier: Apache-2.0 diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/comments/comments.go b/vendor/sigs.k8s.io/kustomize/kyaml/comments/comments.go new file mode 100644 index 000000000000..9d6dc22dc4a6 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/comments/comments.go @@ -0,0 +1,78 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package comments + +import ( + "sigs.k8s.io/kustomize/kyaml/openapi" + "sigs.k8s.io/kustomize/kyaml/yaml" + "sigs.k8s.io/kustomize/kyaml/yaml/walk" +) + +// CopyComments recursively copies the comments on fields in from to fields in to +func CopyComments(from, to *yaml.RNode) error { + copy(from, to) + // walk the fields copying comments + _, err := walk.Walker{ + Sources: []*yaml.RNode{from, to}, + Visitor: &copier{}, + VisitKeysAsScalars: true}.Walk() + return err +} + +// copier implements walk.Visitor, and copies comments to fields shared between 2 instances +// of a resource +type copier struct{} + +func (c *copier) VisitMap(s walk.Sources, _ *openapi.ResourceSchema) (*yaml.RNode, error) { + copy(s.Dest(), s.Origin()) + return s.Dest(), nil +} + +func (c *copier) VisitScalar(s walk.Sources, _ *openapi.ResourceSchema) (*yaml.RNode, error) { + to := s.Origin() + // TODO: File a bug with upstream yaml to handle comments for FoldedStyle scalar nodes + // Hack: convert FoldedStyle scalar node to DoubleQuotedStyle as the line comments are + // being serialized without space + // https://github.com/GoogleContainerTools/kpt/issues/766 + if to != nil && to.Document().Style == yaml.FoldedStyle { + to.Document().Style = yaml.DoubleQuotedStyle + } + + copy(s.Dest(), to) + return s.Dest(), nil +} + +func (c *copier) VisitList(s walk.Sources, _ *openapi.ResourceSchema, _ walk.ListKind) ( + *yaml.RNode, error) { + copy(s.Dest(), s.Origin()) + destItems := s.Dest().Content() + originItems := s.Origin().Content() + + for i := 0; i < len(destItems) && i < len(originItems); i++ { + dest := destItems[i] + origin := originItems[i] + + if dest.Value == origin.Value { + copy(yaml.NewRNode(dest), yaml.NewRNode(origin)) + } + } + + return s.Dest(), nil +} + +// copy copies the comment from one field to another +func copy(from, to *yaml.RNode) { + if from == nil || to == nil { + return + } + if to.Document().LineComment == "" { + to.Document().LineComment = from.Document().LineComment + } + if to.Document().HeadComment == "" { + to.Document().HeadComment = from.Document().HeadComment + } + if to.Document().FootComment == "" { + to.Document().FootComment = from.Document().FootComment + } +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/errors/errors.go b/vendor/sigs.k8s.io/kustomize/kyaml/errors/errors.go new file mode 100644 index 000000000000..f072c3c9793d --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/errors/errors.go @@ -0,0 +1,40 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +// Package errors provides libraries for working with the go-errors/errors library. +package errors + +import ( + "fmt" + + goerrors "github.com/go-errors/errors" +) + +// Wrap returns err wrapped in a go-error. If err is nil, returns nil. +func Wrap(err interface{}) error { + if err == nil { + return nil + } + return goerrors.Wrap(err, 1) +} + +// WrapPrefixf returns err wrapped in a go-error with a message prefix. If err is nil, returns nil. +func WrapPrefixf(err interface{}, msg string, args ...interface{}) error { + if err == nil { + return nil + } + return goerrors.WrapPrefix(err, fmt.Sprintf(msg, args...), 1) +} + +// Errorf returns a new go-error. +func Errorf(msg string, args ...interface{}) error { + return goerrors.Wrap(fmt.Errorf(msg, args...), 1) +} + +// GetStack returns a stack trace for the error if it has one +func GetStack(err error) string { + if e, ok := err.(*goerrors.Error); ok { + return string(e.Stack()) + } + return "" +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/ext/ext.go b/vendor/sigs.k8s.io/kustomize/kyaml/ext/ext.go new file mode 100644 index 000000000000..c946577cceb4 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/ext/ext.go @@ -0,0 +1,10 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package ext + +// IgnoreFileName returns the name for ignore files in +// packages. It can be overridden by tools using this library. +var IgnoreFileName = func() string { + return ".krmignore" +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/fieldmeta/fieldmeta.go b/vendor/sigs.k8s.io/kustomize/kyaml/fieldmeta/fieldmeta.go new file mode 100644 index 000000000000..83fdff3d5b85 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/fieldmeta/fieldmeta.go @@ -0,0 +1,275 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package fieldmeta + +import ( + "encoding/json" + "fmt" + "reflect" + "strconv" + "strings" + + "github.com/go-openapi/spec" + "sigs.k8s.io/kustomize/kyaml/errors" + "sigs.k8s.io/kustomize/kyaml/openapi" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +// FieldMeta contains metadata that may be attached to fields as comments +type FieldMeta struct { + Schema spec.Schema + + Extensions XKustomize + + SettersSchema *spec.Schema +} + +type XKustomize struct { + SetBy string `yaml:"setBy,omitempty" json:"setBy,omitempty"` + PartialFieldSetters []PartialFieldSetter `yaml:"partialSetters,omitempty" json:"partialSetters,omitempty"` + FieldSetter *PartialFieldSetter `yaml:"setter,omitempty" json:"setter,omitempty"` +} + +// PartialFieldSetter defines how to set part of a field rather than the full field +// value. e.g. the tag part of an image field +type PartialFieldSetter struct { + // Name is the name of this setter. + Name string `yaml:"name" json:"name"` + + // Value is the current value that has been set. + Value string `yaml:"value" json:"value"` +} + +// IsEmpty returns true if the FieldMeta has any empty Schema +func (fm *FieldMeta) IsEmpty() bool { + if fm == nil { + return true + } + return reflect.DeepEqual(fm.Schema, spec.Schema{}) +} + +// Read reads the FieldMeta from a node +func (fm *FieldMeta) Read(n *yaml.RNode) error { + // check for metadata on head and line comments + comments := []string{n.YNode().LineComment, n.YNode().HeadComment} + for _, c := range comments { + if c == "" { + continue + } + c := strings.TrimLeft(c, "#") + + // check for new short hand notation or fall back to openAPI ref format + if !fm.processShortHand(c) { + // if it doesn't Unmarshal that is fine, it means there is no metadata + // other comments are valid, they just don't parse + // TODO: consider more sophisticated parsing techniques similar to what is used + // for go struct tags. + if err := fm.Schema.UnmarshalJSON([]byte(c)); err != nil { + // note: don't return an error if the comment isn't a fieldmeta struct + return nil + } + } + fe := fm.Schema.VendorExtensible.Extensions["x-kustomize"] + if fe == nil { + return nil + } + b, err := json.Marshal(fe) + if err != nil { + return errors.Wrap(err) + } + return json.Unmarshal(b, &fm.Extensions) + } + return nil +} + +// processShortHand parses the comment for short hand ref, loads schema to fm +// and returns true if successful, returns false for any other cases and not throw +// error, as the comment might not be a setter ref +func (fm *FieldMeta) processShortHand(comment string) bool { + input := map[string]string{} + err := json.Unmarshal([]byte(comment), &input) + if err != nil { + return false + } + name := input[shortHandRef] + if name == "" { + return false + } + + // check if setter with the name exists, else check for a substitution + // setter and substitution can't have same name in shorthand + + setterRef, err := spec.NewRef(DefinitionsPrefix + SetterDefinitionPrefix + name) + if err != nil { + return false + } + + setterRefBytes, err := setterRef.MarshalJSON() + if err != nil { + return false + } + + if _, err := openapi.Resolve(&setterRef, fm.SettersSchema); err == nil { + setterErr := fm.Schema.UnmarshalJSON(setterRefBytes) + return setterErr == nil + } + + substRef, err := spec.NewRef(DefinitionsPrefix + SubstitutionDefinitionPrefix + name) + if err != nil { + return false + } + + substRefBytes, err := substRef.MarshalJSON() + if err != nil { + return false + } + + if _, err := openapi.Resolve(&substRef, fm.SettersSchema); err == nil { + substErr := fm.Schema.UnmarshalJSON(substRefBytes) + return substErr == nil + } + return false +} + +func isExtensionEmpty(x XKustomize) bool { + if x.FieldSetter != nil { + return false + } + if x.SetBy != "" { + return false + } + if len(x.PartialFieldSetters) > 0 { + return false + } + return true +} + +// Write writes the FieldMeta to a node +func (fm *FieldMeta) Write(n *yaml.RNode) error { + if !isExtensionEmpty(fm.Extensions) { + return fm.WriteV1Setters(n) + } + + // Ref is removed when a setter is deleted, so the Ref string could be empty. + if fm.Schema.Ref.String() != "" { + // Ex: {"$ref":"#/definitions/io.k8s.cli.setters.replicas"} should be converted to + // {"$openAPI":"replicas"} and added to the line comment + ref := fm.Schema.Ref.String() + var shortHandRefValue string + switch { + case strings.HasPrefix(ref, DefinitionsPrefix+SetterDefinitionPrefix): + shortHandRefValue = strings.TrimPrefix(ref, DefinitionsPrefix+SetterDefinitionPrefix) + case strings.HasPrefix(ref, DefinitionsPrefix+SubstitutionDefinitionPrefix): + shortHandRefValue = strings.TrimPrefix(ref, DefinitionsPrefix+SubstitutionDefinitionPrefix) + default: + return fmt.Errorf("unexpected ref format: %s", ref) + } + n.YNode().LineComment = fmt.Sprintf(`{"%s":"%s"}`, shortHandRef, + shortHandRefValue) + } else { + n.YNode().LineComment = "" + } + + return nil +} + +// WriteV1Setters is the v1 setters way of writing setter definitions +// TODO: pmarupaka - remove this method after migration +func (fm *FieldMeta) WriteV1Setters(n *yaml.RNode) error { + fm.Schema.VendorExtensible.AddExtension("x-kustomize", fm.Extensions) + b, err := json.Marshal(fm.Schema) + if err != nil { + return errors.Wrap(err) + } + n.YNode().LineComment = string(b) + return nil +} + +// FieldValueType defines the type of input to register +type FieldValueType string + +const ( + // String defines a string flag + String FieldValueType = "string" + // Bool defines a bool flag + Bool = "boolean" + // Int defines an int flag + Int = "integer" +) + +func (it FieldValueType) String() string { + if it == "" { + return "string" + } + return string(it) +} + +func (it FieldValueType) Validate(value string) error { + switch it { + case Int: + if _, err := strconv.Atoi(value); err != nil { + return errors.WrapPrefixf(err, "value must be an int") + } + case Bool: + if _, err := strconv.ParseBool(value); err != nil { + return errors.WrapPrefixf(err, "value must be a bool") + } + } + return nil +} + +func (it FieldValueType) Tag() string { + switch it { + case String: + return yaml.NodeTagString + case Bool: + return yaml.NodeTagBool + case Int: + return yaml.NodeTagInt + } + return "" +} + +func (it FieldValueType) TagForValue(value string) string { + switch it { + case String: + return yaml.NodeTagString + case Bool: + if _, err := strconv.ParseBool(string(it)); err != nil { + return "" + } + return yaml.NodeTagBool + case Int: + if _, err := strconv.ParseInt(string(it), 0, 32); err != nil { + return "" + } + return yaml.NodeTagInt + } + return "" +} + +const ( + // CLIDefinitionsPrefix is the prefix for cli definition keys. + CLIDefinitionsPrefix = "io.k8s.cli." + + // SetterDefinitionPrefix is the prefix for setter definition keys. + SetterDefinitionPrefix = CLIDefinitionsPrefix + "setters." + + // SubstitutionDefinitionPrefix is the prefix for substitution definition keys. + SubstitutionDefinitionPrefix = CLIDefinitionsPrefix + "substitutions." + + // DefinitionsPrefix is the prefix used to reference definitions in the OpenAPI + DefinitionsPrefix = "#/definitions/" +) + +// shortHandRef is the shorthand reference to setters and substitutions +var shortHandRef = "$openapi" + +func SetShortHandRef(ref string) { + shortHandRef = ref +} + +func ShortHandRef() string { + return shortHandRef +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/filtersutil/doc.go b/vendor/sigs.k8s.io/kustomize/kyaml/filtersutil/doc.go new file mode 100644 index 000000000000..b5cb975fa29c --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/filtersutil/doc.go @@ -0,0 +1,6 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +// Package filtersutil provides utilities for working with yaml.Filter and +// kio.Filter interfaces. +package filtersutil diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/filtersutil/filtersutil.go b/vendor/sigs.k8s.io/kustomize/kyaml/filtersutil/filtersutil.go new file mode 100644 index 000000000000..80e4505ada50 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/filtersutil/filtersutil.go @@ -0,0 +1,83 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package filtersutil + +import ( + "encoding/json" + + "sigs.k8s.io/kustomize/kyaml/errors" + "sigs.k8s.io/kustomize/kyaml/kio" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +// ApplyToJSON applies the filter to the json objects. +// +// ApplyToJSON marshals the objects into a slice of yaml.RNodes, runs +// the filter on the slice, and then unmarshals the values back. +// +// The filter must not create or delete objects because the objects +// are updated in place. +func ApplyToJSON(filter kio.Filter, objs ...marshalerUnmarshaler) error { + var nodes []*yaml.RNode + + // convert the json objects to rnodes + for i := range objs { + node, err := GetRNode(objs[i]) + if err != nil { + return err + } + nodes = append(nodes, node) + } + + // apply the filter + nodes, err := filter.Filter(nodes) + if err != nil { + return err + } + if len(nodes) != len(objs) { + return errors.Errorf("filter cannot create or delete objects") + } + + // convert the rnodes to json objects + for i := range nodes { + err = setRNode(objs[i], nodes[i]) + if err != nil { + return err + } + } + + return nil +} + +type marshalerUnmarshaler interface { + json.Unmarshaler + json.Marshaler +} + +// GetRNode converts k into an RNode +func GetRNode(k json.Marshaler) (*yaml.RNode, error) { + j, err := k.MarshalJSON() + if err != nil { + return nil, err + } + return yaml.Parse(string(j)) +} + +// setRNode marshals node into k +func setRNode(k json.Unmarshaler, node *yaml.RNode) error { + s, err := node.String() + if err != nil { + return err + } + m := map[string]interface{}{} + if err := yaml.Unmarshal([]byte(s), &m); err != nil { + return err + } + + b, err := json.Marshal(m) + if err != nil { + return err + } + return k.UnmarshalJSON(b) +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/container/container.go b/vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/container/container.go new file mode 100644 index 000000000000..e36d44ed1dfd --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/container/container.go @@ -0,0 +1,192 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package container + +import ( + "fmt" + + runtimeexec "sigs.k8s.io/kustomize/kyaml/fn/runtime/exec" + "sigs.k8s.io/kustomize/kyaml/fn/runtime/runtimeutil" + + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +// Filter filters Resources using a container image. +// The container must start a process that reads the list of +// input Resources from stdin, reads the Configuration from the env +// API_CONFIG, and writes the filtered Resources to stdout. +// If there is a error or validation failure, the process must exit +// non-zero. +// The full set of environment variables from the parent process +// are passed to the container. +// +// Function Scoping: +// Filter applies the function only to Resources to which it is scoped. +// +// Resources are scoped to a function if any of the following are true: +// - the Resource were read from the same directory as the function config +// - the Resource were read from a subdirectory of the function config directory +// - the function config is in a directory named "functions" and +// they were read from a subdirectory of "functions" parent +// - the function config doesn't have a path annotation (considered globally scoped) +// - the Filter has GlobalScope == true +// +// In Scope Examples: +// +// Example 1: deployment.yaml and service.yaml in function.yaml scope +// same directory as the function config directory +// . +// ├── function.yaml +// ├── deployment.yaml +// └── service.yaml +// +// Example 2: apps/deployment.yaml and apps/service.yaml in function.yaml scope +// subdirectory of the function config directory +// . +// ├── function.yaml +// └── apps +//    ├── deployment.yaml +//    └── service.yaml +// +// Example 3: apps/deployment.yaml and apps/service.yaml in functions/function.yaml scope +// function config is in a directory named "functions" +// . +// ├── functions +// │   └── function.yaml +// └── apps +//    ├── deployment.yaml +//    └── service.yaml +// +// Out of Scope Examples: +// +// Example 1: apps/deployment.yaml and apps/service.yaml NOT in stuff/function.yaml scope +// . +// ├── stuff +// │   └── function.yaml +// └── apps +//    ├── deployment.yaml +//    └── service.yaml +// +// Example 2: apps/deployment.yaml and apps/service.yaml NOT in stuff/functions/function.yaml scope +// . +// ├── stuff +// │   └── functions +// │    └── function.yaml +// └── apps +//    ├── deployment.yaml +//    └── service.yaml +// +// Default Paths: +// Resources emitted by functions will have default path applied as annotations +// if none is present. +// The default path will be the function-dir/ (or parent directory in the case of "functions") +// + function-file-name/ + namespace/ + kind_name.yaml +// +// Example 1: Given a function in fn.yaml that produces a Deployment name foo and a Service named bar +// dir +// └── fn.yaml +// +// Would default newly generated Resources to: +// +// dir +// ├── fn.yaml +// └── fn +//    ├── deployment_foo.yaml +//    └── service_bar.yaml +// +// Example 2: Given a function in functions/fn.yaml that produces a Deployment name foo and a Service named bar +// dir +// └── fn.yaml +// +// Would default newly generated Resources to: +// +// dir +// ├── functions +// │   └── fn.yaml +// └── fn +//    ├── deployment_foo.yaml +//    └── service_bar.yaml +// +// Example 3: Given a function in fn.yaml that produces a Deployment name foo, namespace baz and a Service named bar namespace baz +// dir +// └── fn.yaml +// +// Would default newly generated Resources to: +// +// dir +// ├── fn.yaml +// └── fn +// └── baz +//    ├── deployment_foo.yaml +//    └── service_bar.yaml +type Filter struct { + runtimeutil.ContainerSpec `json:",inline" yaml:",inline"` + + Exec runtimeexec.Filter + + UIDGID string +} + +func (c Filter) String() string { + if c.Exec.DeferFailure { + return fmt.Sprintf("%s deferFailure: %v", c.Image, c.Exec.DeferFailure) + } + return c.Image +} +func (c Filter) GetExit() error { + return c.Exec.GetExit() +} + +func (c *Filter) Filter(nodes []*yaml.RNode) ([]*yaml.RNode, error) { + c.setupExec() + return c.Exec.Filter(nodes) +} + +func (c *Filter) setupExec() { + // don't init 2x + if c.Exec.Path != "" { + return + } + + path, args := c.getCommand() + c.Exec.Path = path + c.Exec.Args = args +} + +// getArgs returns the command + args to run to spawn the container +func (c *Filter) getCommand() (string, []string) { + network := runtimeutil.NetworkNameNone + if c.ContainerSpec.Network { + network = runtimeutil.NetworkNameHost + } + // run the container using docker. this is simpler than using the docker + // libraries, and ensures things like auth work the same as if the container + // was run from the cli. + args := []string{"run", + "--rm", // delete the container afterward + "-i", "-a", "STDIN", "-a", "STDOUT", "-a", "STDERR", // attach stdin, stdout, stderr + "--network", string(network), + + // added security options + "--user", c.UIDGID, + "--security-opt=no-new-privileges", // don't allow the user to escalate privileges + // note: don't make fs readonly because things like heredoc rely on writing tmp files + } + + // TODO(joncwong): Allow StorageMount fields to have default values. + for _, storageMount := range c.StorageMounts { + args = append(args, "--mount", storageMount.String()) + } + + args = append(args, runtimeutil.NewContainerEnvFromStringSlice(c.Env).GetDockerFlags()...) + a := append(args, c.Image) + return "docker", a +} + +// NewContainer returns a new container filter +func NewContainer(spec runtimeutil.ContainerSpec, uidgid string) Filter { + f := Filter{ContainerSpec: spec, UIDGID: uidgid} + + return f +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/exec/doc.go b/vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/exec/doc.go new file mode 100644 index 000000000000..2747a96fbac9 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/exec/doc.go @@ -0,0 +1,5 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +// Package exec contains the exec function implementation. +package exec diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/exec/exec.go b/vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/exec/exec.go new file mode 100644 index 000000000000..3346bc998f2b --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/exec/exec.go @@ -0,0 +1,36 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package exec + +import ( + "io" + "os" + "os/exec" + + "sigs.k8s.io/kustomize/kyaml/fn/runtime/runtimeutil" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +type Filter struct { + // Path is the path to the executable to run + Path string `yaml:"path,omitempty"` + + // Args are the arguments to the executable + Args []string `yaml:"args,omitempty"` + + runtimeutil.FunctionFilter +} + +func (c *Filter) Filter(nodes []*yaml.RNode) ([]*yaml.RNode, error) { + c.FunctionFilter.Run = c.Run + return c.FunctionFilter.Filter(nodes) +} + +func (c *Filter) Run(reader io.Reader, writer io.Writer) error { + cmd := exec.Command(c.Path, c.Args...) + cmd.Stdin = reader + cmd.Stdout = writer + cmd.Stderr = os.Stderr + return cmd.Run() +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/runtimeutil/doc.go b/vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/runtimeutil/doc.go new file mode 100644 index 000000000000..89f9036a4cab --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/runtimeutil/doc.go @@ -0,0 +1,5 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +// Package runtimeutil contains libraries for implementing function runtimes. +package runtimeutil diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/runtimeutil/functiontypes.go b/vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/runtimeutil/functiontypes.go new file mode 100644 index 000000000000..83e7ff0eca02 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/runtimeutil/functiontypes.go @@ -0,0 +1,305 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package runtimeutil + +import ( + "fmt" + "os" + "sort" + "strings" + + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +const ( + FunctionAnnotationKey = "config.kubernetes.io/function" + oldFunctionAnnotationKey = "config.k8s.io/function" +) + +var functionAnnotationKeys = []string{FunctionAnnotationKey, oldFunctionAnnotationKey} + +// ContainerNetworkName is a type for network name used in container +type ContainerNetworkName string + +const ( + NetworkNameNone ContainerNetworkName = "none" + NetworkNameHost ContainerNetworkName = "host" +) +const defaultEnvValue string = "true" + +// ContainerEnv defines the environment present in a container. +type ContainerEnv struct { + // EnvVars is a key-value map that will be set as env in container + EnvVars map[string]string + + // VarsToExport are only env key. Value will be the value in the host system + VarsToExport []string +} + +// GetDockerFlags returns docker run style env flags +func (ce *ContainerEnv) GetDockerFlags() []string { + envs := ce.EnvVars + if envs == nil { + envs = make(map[string]string) + } + + flags := []string{} + // return in order to keep consistent among different runs + keys := []string{} + for k := range envs { + keys = append(keys, k) + } + sort.Strings(keys) + for _, key := range keys { + flags = append(flags, "-e", key+"="+envs[key]) + } + + for _, key := range ce.VarsToExport { + flags = append(flags, "-e", key) + } + + return flags +} + +// AddKeyValue adds a key-value pair into the envs +func (ce *ContainerEnv) AddKeyValue(key, value string) { + if ce.EnvVars == nil { + ce.EnvVars = make(map[string]string) + } + ce.EnvVars[key] = value +} + +// HasExportedKey returns true if the key is a exported key +func (ce *ContainerEnv) HasExportedKey(key string) bool { + for _, k := range ce.VarsToExport { + if k == key { + return true + } + } + return false +} + +// AddKey adds a key into the envs +func (ce *ContainerEnv) AddKey(key string) { + if !ce.HasExportedKey(key) { + ce.VarsToExport = append(ce.VarsToExport, key) + } +} + +// Raw returns a slice of string which represents the envs. +// Example: [foo=bar, baz] +func (ce *ContainerEnv) Raw() []string { + var ret []string + for k, v := range ce.EnvVars { + ret = append(ret, k+"="+v) + } + + ret = append(ret, ce.VarsToExport...) + return ret +} + +// NewContainerEnv returns a pointer to a new ContainerEnv +func NewContainerEnv() *ContainerEnv { + var ce ContainerEnv + ce.EnvVars = make(map[string]string) + // default envs + ce.EnvVars["LOG_TO_STDERR"] = defaultEnvValue + ce.EnvVars["STRUCTURED_RESULTS"] = defaultEnvValue + return &ce +} + +// NewContainerEnvFromStringSlice returns a new ContainerEnv pointer with parsing +// input envStr. envStr example: ["foo=bar", "baz"] +func NewContainerEnvFromStringSlice(envStr []string) *ContainerEnv { + ce := NewContainerEnv() + for _, e := range envStr { + parts := strings.SplitN(e, "=", 2) + if len(parts) == 1 { + ce.AddKey(e) + } else { + ce.AddKeyValue(parts[0], parts[1]) + } + } + return ce +} + +// FunctionSpec defines a spec for running a function +type FunctionSpec struct { + DeferFailure bool `json:"deferFailure,omitempty" yaml:"deferFailure,omitempty"` + + // Container is the spec for running a function as a container + Container ContainerSpec `json:"container,omitempty" yaml:"container,omitempty"` + + // Starlark is the spec for running a function as a starlark script + Starlark StarlarkSpec `json:"starlark,omitempty" yaml:"starlark,omitempty"` + + // ExecSpec is the spec for running a function as an executable + Exec ExecSpec `json:"exec,omitempty" yaml:"exec,omitempty"` + + // Mounts are the storage or directories to mount into the container + StorageMounts []StorageMount `json:"mounts,omitempty" yaml:"mounts,omitempty"` +} + +type ExecSpec struct { + Path string `json:"path,omitempty" yaml:"path,omitempty"` +} + +// ContainerSpec defines a spec for running a function as a container +type ContainerSpec struct { + // Image is the container image to run + Image string `json:"image,omitempty" yaml:"image,omitempty"` + + // Network defines network specific configuration + Network bool `json:"network,omitempty" yaml:"network,omitempty"` + + // Mounts are the storage or directories to mount into the container + StorageMounts []StorageMount `json:"mounts,omitempty" yaml:"mounts,omitempty"` + + // Env is a slice of env string that will be exposed to container + Env []string `json:"envs,omitempty" yaml:"envs,omitempty"` +} + +// StarlarkSpec defines how to run a function as a starlark program +type StarlarkSpec struct { + Name string `json:"name,omitempty" yaml:"name,omitempty"` + + // Path specifies a path to a starlark script + Path string `json:"path,omitempty" yaml:"path,omitempty"` + + // URL specifies a url containing a starlark script + URL string `json:"url,omitempty" yaml:"url,omitempty"` +} + +// StorageMount represents a container's mounted storage option(s) +type StorageMount struct { + // Type of mount e.g. bind mount, local volume, etc. + MountType string `json:"type,omitempty" yaml:"type,omitempty"` + + // Source for the storage to be mounted. + // For named volumes, this is the name of the volume. + // For anonymous volumes, this field is omitted (empty string). + // For bind mounts, this is the path to the file or directory on the host. + Src string `json:"src,omitempty" yaml:"src,omitempty"` + + // The path where the file or directory is mounted in the container. + DstPath string `json:"dst,omitempty" yaml:"dst,omitempty"` + + // Mount in ReadWrite mode if it's explicitly configured + // See https://docs.docker.com/storage/bind-mounts/#use-a-read-only-bind-mount + ReadWriteMode bool `json:"rw,omitempty" yaml:"rw,omitempty"` +} + +func (s *StorageMount) String() string { + mode := "" + if !s.ReadWriteMode { + mode = ",readonly" + } + return fmt.Sprintf("type=%s,source=%s,target=%s%s", s.MountType, s.Src, s.DstPath, mode) +} + +// GetFunctionSpec returns the FunctionSpec for a resource. Returns +// nil if the resource does not have a FunctionSpec. +// +// The FunctionSpec is read from the resource metadata.annotation +// "config.kubernetes.io/function" +func GetFunctionSpec(n *yaml.RNode) *FunctionSpec { + meta, err := n.GetMeta() + if err != nil { + return nil + } + + if fn := getFunctionSpecFromAnnotation(n, meta); fn != nil { + fn.StorageMounts = []StorageMount{} + return fn + } + + // legacy function specification for backwards compatibility + container := meta.Annotations["config.kubernetes.io/container"] + if container != "" { + return &FunctionSpec{Container: ContainerSpec{Image: container}} + } + return nil +} + +// getFunctionSpecFromAnnotation parses the config function from an annotation +// if it is found +func getFunctionSpecFromAnnotation(n *yaml.RNode, meta yaml.ResourceMeta) *FunctionSpec { + var fs FunctionSpec + for _, s := range functionAnnotationKeys { + fn := meta.Annotations[s] + if fn != "" { + err := yaml.Unmarshal([]byte(fn), &fs) + if err != nil { + fmt.Fprintf(os.Stderr, "%v\n", err) + } + return &fs + } + } + n, err := n.Pipe(yaml.Lookup("metadata", "configFn")) + if err != nil || yaml.IsMissingOrNull(n) { + return nil + } + s, err := n.String() + if err != nil { + fmt.Fprintf(os.Stderr, "%v\n", err) + } + err = yaml.Unmarshal([]byte(s), &fs) + if err != nil { + fmt.Fprintf(os.Stderr, "%v\n", err) + } + return &fs +} + +func StringToStorageMount(s string) StorageMount { + m := make(map[string]string) + options := strings.Split(s, ",") + for _, option := range options { + keyVal := strings.SplitN(option, "=", 2) + if len(keyVal) == 2 { + m[keyVal[0]] = keyVal[1] + } + } + var sm StorageMount + for key, value := range m { + switch { + case key == "type": + sm.MountType = value + case key == "src" || key == "source": + sm.Src = value + case key == "dst" || key == "target": + sm.DstPath = value + case key == "rw" && value == "true": + sm.ReadWriteMode = true + } + } + return sm +} + +// IsReconcilerFilter filters Resources based on whether or not they are Reconciler Resource. +// Resources with an apiVersion starting with '*.gcr.io', 'gcr.io' or 'docker.io' are considered +// Reconciler Resources. +type IsReconcilerFilter struct { + // ExcludeReconcilers if set to true, then Reconcilers will be excluded -- e.g. + // Resources with a reconcile container through the apiVersion (gcr.io prefix) or + // through the annotations + ExcludeReconcilers bool `yaml:"excludeReconcilers,omitempty"` + + // IncludeNonReconcilers if set to true, the NonReconciler will be included. + IncludeNonReconcilers bool `yaml:"includeNonReconcilers,omitempty"` +} + +// Filter implements kio.Filter +func (c *IsReconcilerFilter) Filter(inputs []*yaml.RNode) ([]*yaml.RNode, error) { + var out []*yaml.RNode + for i := range inputs { + isFnResource := GetFunctionSpec(inputs[i]) != nil + if isFnResource && !c.ExcludeReconcilers { + out = append(out, inputs[i]) + } + if !isFnResource && c.IncludeNonReconcilers { + out = append(out, inputs[i]) + } + } + return out, nil +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/runtimeutil/runtimeutil.go b/vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/runtimeutil/runtimeutil.go new file mode 100644 index 000000000000..29e2ea0adf9c --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/runtimeutil/runtimeutil.go @@ -0,0 +1,256 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package runtimeutil + +import ( + "bytes" + "fmt" + "io" + "io/ioutil" + "path" + "strings" + + "sigs.k8s.io/kustomize/kyaml/comments" + "sigs.k8s.io/kustomize/kyaml/errors" + "sigs.k8s.io/kustomize/kyaml/kio" + "sigs.k8s.io/kustomize/kyaml/kio/kioutil" + + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +// FunctionFilter wraps another filter to be invoked in the context of a function. +// FunctionFilter manages scoping the function, deferring failures, and saving results +// to files. +type FunctionFilter struct { + // Run implements the function. + Run func(reader io.Reader, writer io.Writer) error + + // FunctionConfig is passed to the function through ResourceList.functionConfig. + FunctionConfig *yaml.RNode `yaml:"functionConfig,omitempty"` + + // GlobalScope explicitly scopes the function to all input resources rather than only those + // resources scoped to it by path. + GlobalScope bool + + // ResultsFile is the file to write function ResourceList.results to. + // If unset, results will not be written. + ResultsFile string + + // DeferFailure will cause the Filter to return a nil error even if Run returns an error. + // The Run error will be available through GetExit(). + DeferFailure bool + + // results saves the results emitted from Run + results *yaml.RNode + + // exit saves the error returned from Run + exit error + + ids map[string]*yaml.RNode +} + +// GetExit returns the error from Run +func (c FunctionFilter) GetExit() error { + return c.exit +} + +// functionsDirectoryName is keyword directory name for functions scoped 1 directory higher +const functionsDirectoryName = "functions" + +// getFunctionScope returns the path of the directory containing the function config, +// or its parent directory if the base directory is named "functions" +func (c *FunctionFilter) getFunctionScope() (string, error) { + m, err := c.FunctionConfig.GetMeta() + if err != nil { + return "", errors.Wrap(err) + } + p, found := m.Annotations[kioutil.PathAnnotation] + if !found { + return "", nil + } + + functionDir := path.Clean(path.Dir(p)) + + if path.Base(functionDir) == functionsDirectoryName { + // the scope of functions in a directory called "functions" is 1 level higher + // this is similar to how the golang "internal" directory scoping works + functionDir = path.Dir(functionDir) + } + return functionDir, nil +} + +// scope partitions the input nodes into 2 slices. The first slice contains only Resources +// which are scoped under dir, and the second slice contains the Resources which are not. +func (c *FunctionFilter) scope(dir string, nodes []*yaml.RNode) ([]*yaml.RNode, []*yaml.RNode, error) { + // scope container filtered Resources to Resources under that directory + var input, saved []*yaml.RNode + if c.GlobalScope { + return nodes, nil, nil + } + + // global function + if dir == "" || dir == "." { + return nodes, nil, nil + } + + // identify Resources read from directories under the function configuration + for i := range nodes { + m, err := nodes[i].GetMeta() + if err != nil { + return nil, nil, err + } + p, found := m.Annotations[kioutil.PathAnnotation] + if !found { + // this Resource isn't scoped under the function -- don't know where it came from + // consider it out of scope + saved = append(saved, nodes[i]) + continue + } + + resourceDir := path.Clean(path.Dir(p)) + if path.Base(resourceDir) == functionsDirectoryName { + // Functions in the `functions` directory are scoped to + // themselves, and should see themselves as input + resourceDir = path.Dir(resourceDir) + } + if !strings.HasPrefix(resourceDir, dir) { + // this Resource doesn't fall under the function scope if it + // isn't in a subdirectory of where the function lives + saved = append(saved, nodes[i]) + continue + } + + // this input is scoped under the function + input = append(input, nodes[i]) + } + + return input, saved, nil +} + +func (c *FunctionFilter) Filter(nodes []*yaml.RNode) ([]*yaml.RNode, error) { + in := &bytes.Buffer{} + out := &bytes.Buffer{} + + // only process Resources scoped to this function, save the others + functionDir, err := c.getFunctionScope() + if err != nil { + return nil, err + } + input, saved, err := c.scope(functionDir, nodes) + if err != nil { + return nil, err + } + + // set ids on each input so it is possible to copy comments from inputs back to outputs + if err := c.setIds(input); err != nil { + return nil, err + } + + // write the input + err = kio.ByteWriter{ + WrappingAPIVersion: kio.ResourceListAPIVersion, + WrappingKind: kio.ResourceListKind, + Writer: in, + KeepReaderAnnotations: true, + FunctionConfig: c.FunctionConfig}.Write(input) + if err != nil { + return nil, err + } + + // capture the command stdout for the return value + r := &kio.ByteReader{Reader: out} + + // don't exit immediately if the function fails -- write out the validation + c.exit = c.Run(in, out) + + output, err := r.Read() + if err != nil { + return nil, err + } + + // copy the comments from the inputs to the outputs + if err := c.setComments(output); err != nil { + return nil, err + } + + if err := c.doResults(r); err != nil { + return nil, err + } + + if c.exit != nil && !c.DeferFailure { + return append(output, saved...), c.exit + } + + // annotate any generated Resources with a path and index if they don't already have one + if err := kioutil.DefaultPathAnnotation(functionDir, output); err != nil { + return nil, err + } + + // emit both the Resources output from the function, and the out-of-scope Resources + // which were not provided to the function + return append(output, saved...), nil +} + +const idAnnotation = "config.k8s.io/id" + +func (c *FunctionFilter) setIds(nodes []*yaml.RNode) error { + // set the id on each node to map inputs to outputs + var id int + c.ids = map[string]*yaml.RNode{} + for i := range nodes { + id++ + idStr := fmt.Sprintf("%v", id) + err := nodes[i].PipeE(yaml.SetAnnotation(idAnnotation, idStr)) + if err != nil { + return errors.Wrap(err) + } + c.ids[idStr] = nodes[i] + } + return nil +} + +func (c *FunctionFilter) setComments(nodes []*yaml.RNode) error { + for i := range nodes { + node := nodes[i] + anID, err := node.Pipe(yaml.GetAnnotation(idAnnotation)) + if err != nil { + return errors.Wrap(err) + } + if anID == nil { + continue + } + + var in *yaml.RNode + var found bool + if in, found = c.ids[anID.YNode().Value]; !found { + continue + } + if err := comments.CopyComments(in, node); err != nil { + return errors.Wrap(err) + } + if err := node.PipeE(yaml.ClearAnnotation(idAnnotation)); err != nil { + return errors.Wrap(err) + } + } + return nil +} + +func (c *FunctionFilter) doResults(r *kio.ByteReader) error { + // Write the results to a file if configured to do so + if c.ResultsFile != "" && r.Results != nil { + results, err := r.Results.String() + if err != nil { + return err + } + err = ioutil.WriteFile(c.ResultsFile, []byte(results), 0600) + if err != nil { + return err + } + } + + if r.Results != nil { + c.results = r.Results + } + return nil +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/runtimeutil/types.go b/vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/runtimeutil/types.go new file mode 100644 index 000000000000..5edc4ebc332c --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/runtimeutil/types.go @@ -0,0 +1,8 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package runtimeutil + +type DeferFailureFunction interface { + GetExit() error +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/starlark/context.go b/vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/starlark/context.go new file mode 100644 index 000000000000..bbf07f66c5ce --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/starlark/context.go @@ -0,0 +1,79 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package starlark + +import ( + "encoding/json" + "os" + "strings" + + "go.starlark.net/starlark" + "go.starlark.net/starlarkstruct" + "sigs.k8s.io/kustomize/kyaml/errors" + "sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/qri-io/starlib/util" + "sigs.k8s.io/kustomize/kyaml/openapi" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +type Context struct { + resourceList starlark.Value +} + +func (c *Context) predeclared() (starlark.StringDict, error) { + e, err := env() + if err != nil { + return nil, err + } + oa, err := oa() + if err != nil { + return nil, err + } + dict := starlark.StringDict{ + "resource_list": c.resourceList, + "open_api": oa, + "environment": e, + } + + return starlark.StringDict{ + "ctx": starlarkstruct.FromStringDict(starlarkstruct.Default, dict), + }, nil +} + +func oa() (starlark.Value, error) { + return interfaceToValue(openapi.Schema()) +} + +func env() (starlark.Value, error) { + env := map[string]interface{}{} + for _, e := range os.Environ() { + pair := strings.SplitN(e, "=", 2) + if len(pair) < 2 { + continue + } + env[pair[0]] = pair[1] + } + value, err := util.Marshal(env) + if err != nil { + return nil, errors.Wrap(err) + } + return value, nil +} + +func interfaceToValue(i interface{}) (starlark.Value, error) { + b, err := json.Marshal(i) + if err != nil { + return nil, err + } + + var in map[string]interface{} + if err := yaml.Unmarshal(b, &in); err != nil { + return nil, errors.Wrap(err) + } + + value, err := util.Marshal(in) + if err != nil { + return nil, errors.Wrap(err) + } + return value, nil +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/starlark/doc.go b/vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/starlark/doc.go new file mode 100644 index 000000000000..70f0a2c7b4e5 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/starlark/doc.go @@ -0,0 +1,36 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +// Package starlark contains a kio.Filter which can be applied to resources to transform +// them through starlark program. +// +// Starlark has become a popular runtime embedding in go programs, especially for Kubernetes +// and data processing. +// Examples: https://github.com/cruise-automation/isopod, https://qri.io/docs/starlark/starlib, +// https://github.com/stripe/skycfg, https://github.com/k14s/ytt +// +// The resources are provided to the starlark program through the global variable "resourceList". +// "resourceList" is a dictionary containing an "items" field with a list of resources. +// The starlark modified "resourceList" is the Filter output. +// +// After being run through the starlark program, the filter will copy the comments from the input +// resources to restore them -- due to them being dropped as a result of serializing the resources +// as starlark values. +// +// "resourceList" may also contain a "functionConfig" entry to configure the starlark script itself. +// Changes made by the starlark program to the "functionConfig" will be reflected in the +// Filter.FunctionConfig value. +// +// The Filter will also format the output so that output has the preferred field ordering +// rather than an alphabetical field ordering. +// +// The resourceList variable adheres to the kustomize function spec as specified by: +// https://github.com/kubernetes-sigs/kustomize/blob/master/cmd/config/docs/api-conventions/functions-spec.md +// +// All items in the resourceList are resources represented as starlark dictionaries/ +// The items in the resourceList respect the io spec specified by: +// https://github.com/kubernetes-sigs/kustomize/blob/master/cmd/config/docs/api-conventions/config-io.md +// +// The starlark language spec can be found here: +// https://github.com/google/starlark-go/blob/master/doc/spec.md +package starlark diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/starlark/starlark.go b/vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/starlark/starlark.go new file mode 100644 index 000000000000..825ff63a02f2 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/fn/runtime/starlark/starlark.go @@ -0,0 +1,181 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package starlark + +import ( + "bytes" + "fmt" + "io" + "io/ioutil" + "net/http" + + "go.starlark.net/starlark" + "sigs.k8s.io/kustomize/kyaml/errors" + "sigs.k8s.io/kustomize/kyaml/fn/runtime/runtimeutil" + "sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/qri-io/starlib/util" + "sigs.k8s.io/kustomize/kyaml/kio/filters" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +// Filter transforms a set of resources through the provided program +type Filter struct { + Name string + + // Program is a starlark script which will be run against the resources + Program string + + // URL is the url of a starlark program to fetch and run + URL string + + // Path is the path to a starlark program to read and run + Path string + + runtimeutil.FunctionFilter +} + +func (sf *Filter) String() string { + return fmt.Sprintf( + "name: %v path: %v url: %v program: %v", sf.Name, sf.Path, sf.URL, sf.Program) +} + +func (sf *Filter) Filter(nodes []*yaml.RNode) ([]*yaml.RNode, error) { + err := sf.setup() + if err != nil { + return nil, err + } + sf.FunctionFilter.Run = sf.Run + + return sf.FunctionFilter.Filter(nodes) +} + +func (sf *Filter) setup() error { + if (sf.URL != "" && sf.Path != "") || + (sf.URL != "" && sf.Program != "") || + (sf.Path != "" && sf.Program != "") { + return errors.Errorf("Filter Path, Program and URL are mutually exclusive") + } + + // read the program from a file + if sf.Path != "" { + b, err := ioutil.ReadFile(sf.Path) + if err != nil { + return err + } + sf.Program = string(b) + } + + // read the program from a URL + if sf.URL != "" { + err := func() error { + resp, err := http.Get(sf.URL) + if err != nil { + return err + } + defer resp.Body.Close() + b, err := ioutil.ReadAll(resp.Body) + if err != nil { + return err + } + sf.Program = string(b) + return nil + }() + if err != nil { + return err + } + } + + return nil +} + +func (sf *Filter) Run(reader io.Reader, writer io.Writer) error { + // retain map of inputs to outputs by id so if the name is changed by the + // starlark program, we are able to match the same resources + value, err := sf.readResourceList(reader) + if err != nil { + return errors.Wrap(err) + } + + // run the starlark as program as transformation function + thread := &starlark.Thread{Name: sf.Name} + + ctx := &Context{resourceList: value} + pd, err := ctx.predeclared() + if err != nil { + return errors.Wrap(err) + } + _, err = starlark.ExecFile(thread, sf.Name, sf.Program, pd) + if err != nil { + return errors.Wrap(err) + } + + return sf.writeResourceList(value, writer) +} + +// inputToResourceList transforms input into a starlark.Value +func (sf *Filter) readResourceList(reader io.Reader) (starlark.Value, error) { + // read and parse the inputs + rl := bytes.Buffer{} + _, err := rl.ReadFrom(reader) + if err != nil { + return nil, errors.Wrap(err) + } + rn, err := yaml.Parse(rl.String()) + if err != nil { + return nil, errors.Wrap(err) + } + + // convert to a starlark value + b, err := yaml.Marshal(rn.Document()) // convert to bytes + if err != nil { + return nil, errors.Wrap(err) + } + var in map[string]interface{} + err = yaml.Unmarshal(b, &in) // convert to map[string]interface{} + if err != nil { + return nil, errors.Wrap(err) + } + return util.Marshal(in) // convert to starlark value +} + +// resourceListToOutput converts the output of the starlark program to the filter output +func (sf *Filter) writeResourceList(value starlark.Value, writer io.Writer) error { + // convert the modified resourceList back into a slice of RNodes + // by first converting to a map[string]interface{} + out, err := util.Unmarshal(value) + if err != nil { + return errors.Wrap(err) + } + b, err := yaml.Marshal(out) + if err != nil { + return errors.Wrap(err) + } + + rl, err := yaml.Parse(string(b)) + if err != nil { + return errors.Wrap(err) + } + + // preserve the comments from the input + items, err := rl.Pipe(yaml.Lookup("items")) + if err != nil { + return errors.Wrap(err) + } + err = items.VisitElements(func(node *yaml.RNode) error { + // starlark will serialize the resources sorting the fields alphabetically, + // format them to have a better ordering + _, err := filters.FormatFilter{}.Filter([]*yaml.RNode{node}) + return err + }) + if err != nil { + return errors.Wrap(err) + } + + s, err := rl.String() + if err != nil { + return errors.Wrap(err) + } + + _, err = writer.Write([]byte(s)) + return err +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/qri-io/starlib/util/LICENSE b/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/qri-io/starlib/util/LICENSE new file mode 100644 index 000000000000..31f292dce540 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/qri-io/starlib/util/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2018 QRI, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/qri-io/starlib/util/doc.go b/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/qri-io/starlib/util/doc.go new file mode 100644 index 000000000000..035b479216da --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/qri-io/starlib/util/doc.go @@ -0,0 +1,25 @@ +// The MIT License (MIT) + +// Copyright (c) 2018 QRI, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: + +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. + +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package util is forked from https://github.com/qri-io/starlib in order to prune +// excessive transitive dependencies from pulling in that library. +package util diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/qri-io/starlib/util/util.go b/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/qri-io/starlib/util/util.go new file mode 100644 index 000000000000..96b4a9aeaa19 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/qri-io/starlib/util/util.go @@ -0,0 +1,273 @@ +// The MIT License (MIT) + +// Copyright (c) 2018 QRI, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: + +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. + +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package util + +import ( + "fmt" + + "github.com/pkg/errors" + "go.starlark.net/starlark" + "go.starlark.net/starlarkstruct" +) + +// // asString unquotes a starlark string value +// func asString(x starlark.Value) (string, error) { +// return strconv.Unquote(x.String()) +// } + +// IsEmptyString checks is a starlark string is empty ("" for a go string) +// starlark.String.String performs repr-style quotation, which is necessary +// for the starlark.Value contract but a frequent source of errors in API +// clients. This helper method makes sure it'll work properly +func IsEmptyString(s starlark.String) bool { + return s.String() == `""` +} + +// Unmarshal decodes a starlark.Value into it's golang counterpart +//nolint:nakedret +func Unmarshal(x starlark.Value) (val interface{}, err error) { + switch v := x.(type) { + case starlark.NoneType: + val = nil + case starlark.Bool: + val = v.Truth() == starlark.True + case starlark.Int: + val, err = starlark.AsInt32(x) + case starlark.Float: + if f, ok := starlark.AsFloat(x); !ok { + err = fmt.Errorf("couldn't parse float") + } else { + val = f + } + case starlark.String: + val = v.GoString() + // case starlibtime.Time: + // val = time.Time(v) + case *starlark.Dict: + var ( + dictVal starlark.Value + pval interface{} + kval interface{} + keys []interface{} + vals []interface{} + // key as interface if found one key is not a string + ki bool + ) + + for _, k := range v.Keys() { + dictVal, _, err = v.Get(k) + if err != nil { + return + } + + pval, err = Unmarshal(dictVal) + if err != nil { + err = fmt.Errorf("unmarshaling starlark value: %w", err) + return + } + + kval, err = Unmarshal(k) + if err != nil { + err = fmt.Errorf("unmarshaling starlark key: %w", err) + return + } + + if _, ok := kval.(string); !ok { + // found key as not a string + ki = true + } + + keys = append(keys, kval) + vals = append(vals, pval) + } + + // prepare result + + rs := map[string]interface{}{} + ri := map[interface{}]interface{}{} + + for i, key := range keys { + // key as interface + if ki { + ri[key] = vals[i] + } else { + rs[key.(string)] = vals[i] + } + } + + if ki { + val = ri // map[interface{}]interface{} + } else { + val = rs // map[string]interface{} + } + case *starlark.List: + var ( + i int + listVal starlark.Value + iter = v.Iterate() + value = make([]interface{}, v.Len()) + ) + + defer iter.Done() + for iter.Next(&listVal) { + value[i], err = Unmarshal(listVal) + if err != nil { + return + } + i++ + } + val = value + case starlark.Tuple: + var ( + i int + tupleVal starlark.Value + iter = v.Iterate() + value = make([]interface{}, v.Len()) + ) + + defer iter.Done() + for iter.Next(&tupleVal) { + value[i], err = Unmarshal(tupleVal) + if err != nil { + return + } + i++ + } + val = value + case *starlark.Set: + fmt.Println("errnotdone: SET") + err = fmt.Errorf("sets aren't yet supported") + case *starlarkstruct.Struct: + if _var, ok := v.Constructor().(Unmarshaler); ok { + err = _var.UnmarshalStarlark(x) + if err != nil { + err = errors.Wrapf(err, "failed marshal %q to Starlark object", v.Constructor().Type()) + return + } + val = _var + } else { + err = fmt.Errorf("constructor object from *starlarkstruct.Struct not supported Marshaler to starlark object: %s", v.Constructor().Type()) + } + default: + fmt.Println("errbadtype:", x.Type()) + err = fmt.Errorf("unrecognized starlark type: %s", x.Type()) + } + return +} + +// Marshal turns go values into starlark types +//nolint:nakedret +func Marshal(data interface{}) (v starlark.Value, err error) { + switch x := data.(type) { + case nil: + v = starlark.None + case bool: + v = starlark.Bool(x) + case string: + v = starlark.String(x) + case int: + v = starlark.MakeInt(x) + case int8: + v = starlark.MakeInt(int(x)) + case int16: + v = starlark.MakeInt(int(x)) + case int32: + v = starlark.MakeInt(int(x)) + case int64: + v = starlark.MakeInt64(x) + case uint: + v = starlark.MakeUint(x) + case uint8: + v = starlark.MakeUint(uint(x)) + case uint16: + v = starlark.MakeUint(uint(x)) + case uint32: + v = starlark.MakeUint(uint(x)) + case uint64: + v = starlark.MakeUint64(x) + case float32: + v = starlark.Float(float64(x)) + case float64: + v = starlark.Float(x) + // case time.Time: + // v = starlibtime.Time(x) + case []interface{}: + var elems = make([]starlark.Value, len(x)) + for i, val := range x { + elems[i], err = Marshal(val) + if err != nil { + return + } + } + v = starlark.NewList(elems) + case map[interface{}]interface{}: + dict := &starlark.Dict{} + var elem starlark.Value + for ki, val := range x { + var key starlark.Value + key, err = Marshal(ki) + if err != nil { + return + } + + elem, err = Marshal(val) + if err != nil { + return + } + if err = dict.SetKey(key, elem); err != nil { + return + } + } + v = dict + case map[string]interface{}: + dict := &starlark.Dict{} + var elem starlark.Value + for key, val := range x { + elem, err = Marshal(val) + if err != nil { + return + } + if err = dict.SetKey(starlark.String(key), elem); err != nil { + return + } + } + v = dict + case Marshaler: + v, err = x.MarshalStarlark() + default: + return starlark.None, fmt.Errorf("unrecognized type: %#v", x) + } + return +} + +// Unmarshaler is the interface use to unmarshal starlark custom types. +type Unmarshaler interface { + // UnmarshalStarlark unmarshal a starlark object to custom type. + UnmarshalStarlark(starlark.Value) error +} + +// Marshaler is the interface use to marshal starlark custom types. +type Marshaler interface { + // MarshalStarlark marshal a custom type to starlark object. + MarshalStarlark() (starlark.Value, error) +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/kio/byteio_reader.go b/vendor/sigs.k8s.io/kustomize/kyaml/kio/byteio_reader.go new file mode 100644 index 000000000000..7469698f40f2 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/kio/byteio_reader.go @@ -0,0 +1,248 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package kio + +import ( + "bytes" + "fmt" + "io" + "sort" + "strings" + + "sigs.k8s.io/kustomize/kyaml/errors" + "sigs.k8s.io/kustomize/kyaml/kio/kioutil" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +const ( + ResourceListKind = "ResourceList" + ResourceListAPIVersion = "config.kubernetes.io/v1alpha1" +) + +// ByteReadWriter reads from an input and writes to an output. +type ByteReadWriter struct { + // Reader is where ResourceNodes are decoded from. + Reader io.Reader + + // Writer is where ResourceNodes are encoded. + Writer io.Writer + + // OmitReaderAnnotations will configures Read to skip setting the config.kubernetes.io/index + // annotation on Resources as they are Read. + OmitReaderAnnotations bool + + // KeepReaderAnnotations if set will keep the Reader specific annotations when writing + // the Resources, otherwise they will be cleared. + KeepReaderAnnotations bool + + // Style is a style that is set on the Resource Node Document. + Style yaml.Style + + FunctionConfig *yaml.RNode + + Results *yaml.RNode + + NoWrap bool + WrappingAPIVersion string + WrappingKind string +} + +func (rw *ByteReadWriter) Read() ([]*yaml.RNode, error) { + b := &ByteReader{ + Reader: rw.Reader, + OmitReaderAnnotations: rw.OmitReaderAnnotations, + } + val, err := b.Read() + if rw.FunctionConfig == nil { + rw.FunctionConfig = b.FunctionConfig + } + rw.Results = b.Results + + if !rw.NoWrap { + rw.WrappingAPIVersion = b.WrappingAPIVersion + rw.WrappingKind = b.WrappingKind + } + return val, errors.Wrap(err) +} + +func (rw *ByteReadWriter) Write(nodes []*yaml.RNode) error { + return ByteWriter{ + Writer: rw.Writer, + KeepReaderAnnotations: rw.KeepReaderAnnotations, + Style: rw.Style, + FunctionConfig: rw.FunctionConfig, + Results: rw.Results, + WrappingAPIVersion: rw.WrappingAPIVersion, + WrappingKind: rw.WrappingKind, + }.Write(nodes) +} + +// ParseAll reads all of the inputs into resources +func ParseAll(inputs ...string) ([]*yaml.RNode, error) { + return (&ByteReader{ + Reader: bytes.NewBufferString(strings.Join(inputs, "\n---\n")), + }).Read() +} + +// FromBytes reads from a byte slice. +func FromBytes(bs []byte) ([]*yaml.RNode, error) { + return (&ByteReader{ + OmitReaderAnnotations: true, + Reader: bytes.NewBuffer(bs), + }).Read() +} + +// StringAll writes all of the resources to a string +func StringAll(resources []*yaml.RNode) (string, error) { + var b bytes.Buffer + err := (&ByteWriter{Writer: &b}).Write(resources) + return b.String(), err +} + +// ByteReader decodes ResourceNodes from bytes. +// By default, Read will set the config.kubernetes.io/index annotation on each RNode as it +// is read so they can be written back in the same order. +type ByteReader struct { + // Reader is where ResourceNodes are decoded from. + Reader io.Reader + + // OmitReaderAnnotations will configures Read to skip setting the config.kubernetes.io/index + // annotation on Resources as they are Read. + OmitReaderAnnotations bool + + // SetAnnotations is a map of caller specified annotations to set on resources as they are read + // These are independent of the annotations controlled by OmitReaderAnnotations + SetAnnotations map[string]string + + FunctionConfig *yaml.RNode + + Results *yaml.RNode + + // DisableUnwrapping prevents Resources in Lists and ResourceLists from being unwrapped + DisableUnwrapping bool + + // WrappingAPIVersion is set by Read(), and is the apiVersion of the object that + // the read objects were originally wrapped in. + WrappingAPIVersion string + + // WrappingKind is set by Read(), and is the kind of the object that + // the read objects were originally wrapped in. + WrappingKind string +} + +var _ Reader = &ByteReader{} + +func (r *ByteReader) Read() ([]*yaml.RNode, error) { + output := ResourceNodeSlice{} + + // by manually splitting resources -- otherwise the decoder will get the Resource + // boundaries wrong for header comments. + input := &bytes.Buffer{} + _, err := io.Copy(input, r.Reader) + if err != nil { + return nil, errors.Wrap(err) + } + + // replace the ending \r\n (line ending used in windows) with \n and then separate by \n---\n + values := strings.Split(strings.ReplaceAll(input.String(), "\r\n", "\n"), "\n---\n") + + index := 0 + for i := range values { + // the Split used above will eat the tail '\n' from each resource. This may affect the + // literal string value since '\n' is meaningful in it. + if i != len(values)-1 { + values[i] += "\n" + } + decoder := yaml.NewDecoder(bytes.NewBufferString(values[i])) + node, err := r.decode(index, decoder) + if err == io.EOF { + continue + } + if err != nil { + return nil, errors.Wrap(err) + } + if yaml.IsMissingOrNull(node) { + // empty value + continue + } + + // ok if no metadata -- assume not an InputList + meta, err := node.GetMeta() + if err != yaml.ErrMissingMetadata && err != nil { + return nil, errors.WrapPrefixf(err, "[%d]", i) + } + + // the elements are wrapped in an InputList, unwrap them + // don't check apiVersion, we haven't standardized on the domain + if !r.DisableUnwrapping && + len(values) == 1 && // Only unwrap if there is only 1 value + (meta.Kind == ResourceListKind || meta.Kind == "List") && + (node.Field("items") != nil || node.Field("functionConfig") != nil) { + r.WrappingKind = meta.Kind + r.WrappingAPIVersion = meta.APIVersion + + // unwrap the list + if fc := node.Field("functionConfig"); fc != nil { + r.FunctionConfig = fc.Value + } + if res := node.Field("results"); res != nil { + r.Results = res.Value + } + + items := node.Field("items") + if items != nil { + for i := range items.Value.Content() { + // add items + output = append(output, yaml.NewRNode(items.Value.Content()[i])) + } + } + continue + } + + // add the node to the list + output = append(output, node) + + // increment the index annotation value + index++ + } + return output, nil +} + +func (r *ByteReader) decode(index int, decoder *yaml.Decoder) (*yaml.RNode, error) { + node := &yaml.Node{} + err := decoder.Decode(node) + if err == io.EOF { + return nil, io.EOF + } + if err != nil { + return nil, errors.Wrap(err) + } + + if yaml.IsYNodeEmptyDoc(node) { + return nil, nil + } + + // set annotations on the read Resources + // sort the annotations by key so the output Resources is consistent (otherwise the + // annotations will be in a random order) + n := yaml.NewRNode(node) + if r.SetAnnotations == nil { + r.SetAnnotations = map[string]string{} + } + if !r.OmitReaderAnnotations { + r.SetAnnotations[kioutil.IndexAnnotation] = fmt.Sprintf("%d", index) + } + var keys []string + for k := range r.SetAnnotations { + keys = append(keys, k) + } + sort.Strings(keys) + for _, k := range keys { + _, err = n.Pipe(yaml.SetAnnotation(k, r.SetAnnotations[k])) + if err != nil { + return nil, errors.Wrap(err) + } + } + return yaml.NewRNode(node), nil +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/kio/byteio_writer.go b/vendor/sigs.k8s.io/kustomize/kyaml/kio/byteio_writer.go new file mode 100644 index 000000000000..84097f10865e --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/kio/byteio_writer.go @@ -0,0 +1,140 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package kio + +import ( + "encoding/json" + "io" + + "sigs.k8s.io/kustomize/kyaml/errors" + "sigs.k8s.io/kustomize/kyaml/kio/kioutil" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +// Writer writes ResourceNodes to bytes. +type ByteWriter struct { + // Writer is where ResourceNodes are encoded. + Writer io.Writer + + // KeepReaderAnnotations if set will keep the Reader specific annotations when writing + // the Resources, otherwise they will be cleared. + KeepReaderAnnotations bool + + // ClearAnnotations is a list of annotations to clear when writing the Resources. + ClearAnnotations []string + + // Style is a style that is set on the Resource Node Document. + Style yaml.Style + + // FunctionConfig is the function config for an ResourceList. If non-nil + // wrap the results in an ResourceList. + FunctionConfig *yaml.RNode + + Results *yaml.RNode + + // WrappingKind if set will cause ByteWriter to wrap the Resources in + // an 'items' field in this kind. e.g. if WrappingKind is 'List', + // ByteWriter will wrap the Resources in a List .items field. + WrappingKind string + + // WrappingAPIVersion is the apiVersion for WrappingKind + WrappingAPIVersion string + + // Sort if set, will cause ByteWriter to sort the the nodes before writing them. + Sort bool +} + +var _ Writer = ByteWriter{} + +func (w ByteWriter) Write(nodes []*yaml.RNode) error { + yaml.DoSerializationHacksOnNodes(nodes) + if w.Sort { + if err := kioutil.SortNodes(nodes); err != nil { + return errors.Wrap(err) + } + } + + encoder := yaml.NewEncoder(w.Writer) + defer encoder.Close() + for i := range nodes { + // clean resources by removing annotations set by the Reader + if !w.KeepReaderAnnotations { + _, err := nodes[i].Pipe(yaml.ClearAnnotation(kioutil.IndexAnnotation)) + if err != nil { + return errors.Wrap(err) + } + } + for _, a := range w.ClearAnnotations { + _, err := nodes[i].Pipe(yaml.ClearAnnotation(a)) + if err != nil { + return errors.Wrap(err) + } + } + + if err := yaml.ClearEmptyAnnotations(nodes[i]); err != nil { + return err + } + + if w.Style != 0 { + nodes[i].YNode().Style = w.Style + } + } + + // don't wrap the elements + if w.WrappingKind == "" { + for i := range nodes { + if err := w.encode(encoder, nodes[i].Document()); err != nil { + return err + } + } + return nil + } + // wrap the elements in a list + items := &yaml.Node{Kind: yaml.SequenceNode} + list := &yaml.Node{ + Kind: yaml.MappingNode, + Style: w.Style, + Content: []*yaml.Node{ + {Kind: yaml.ScalarNode, Value: "apiVersion"}, + {Kind: yaml.ScalarNode, Value: w.WrappingAPIVersion}, + {Kind: yaml.ScalarNode, Value: "kind"}, + {Kind: yaml.ScalarNode, Value: w.WrappingKind}, + {Kind: yaml.ScalarNode, Value: "items"}, items, + }} + if w.FunctionConfig != nil { + list.Content = append(list.Content, + &yaml.Node{Kind: yaml.ScalarNode, Value: "functionConfig"}, + w.FunctionConfig.YNode()) + } + if w.Results != nil { + list.Content = append(list.Content, + &yaml.Node{Kind: yaml.ScalarNode, Value: "results"}, + w.Results.YNode()) + } + doc := &yaml.Node{ + Kind: yaml.DocumentNode, + Content: []*yaml.Node{list}} + for i := range nodes { + items.Content = append(items.Content, nodes[i].YNode()) + } + err := w.encode(encoder, doc) + yaml.UndoSerializationHacksOnNodes(nodes) + return err +} + +// encode encodes the input document node to appropriate node format +func (w ByteWriter) encode(encoder *yaml.Encoder, doc *yaml.Node) error { + rNode := &yaml.RNode{} + rNode.SetYNode(doc) + str, err := rNode.String() + if err != nil { + return errors.Wrap(err) + } + if json.Valid([]byte(str)) { + je := json.NewEncoder(w.Writer) + je.SetIndent("", " ") + return errors.Wrap(je.Encode(rNode)) + } + return encoder.Encode(doc) +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/kio/doc.go b/vendor/sigs.k8s.io/kustomize/kyaml/kio/doc.go new file mode 100644 index 000000000000..9c11a14630f7 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/kio/doc.go @@ -0,0 +1,35 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +// Package kio contains libraries for reading and writing collections of Resources. +// +// Reading Resources +// +// Resources are Read using a kio.Reader function. Examples: +// [kio.LocalPackageReader{}, kio.ByteReader{}] +// +// Resources read using a LocalPackageReader will have annotations applied so they can be +// written back to the files they were read from. +// +// Modifying Resources +// +// Resources are modified using a kio.Filter. The kio.Filter accepts a collection of +// Resources as input, and returns a new collection as output. +// It is recommended to use the yaml package for manipulating individual Resources in +// the collection. +// +// Writing Resources +// +// Resources are Read using a kio.Reader function. Examples: +// [kio.LocalPackageWriter{}, kio.ByteWriter{}] +// +// ReadWriters +// +// It is preferred to use a ReadWriter when reading and writing from / to the same source. +// +// Building Pipelines +// +// The preferred way to transforms a collection of Resources is to use kio.Pipeline to Read, +// Modify and Write the collection of Resources. Pipeline will automatically sequentially +// invoke the Read, Modify, Write steps, returning and error immediately on any failure. +package kio diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/filters.go b/vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/filters.go new file mode 100644 index 000000000000..f8ceb51ca2cc --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/filters.go @@ -0,0 +1,199 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package filters + +import ( + "fmt" + "sort" + "strings" + + "sigs.k8s.io/kustomize/kyaml/kio" + "sigs.k8s.io/kustomize/kyaml/kio/kioutil" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +// Filters are the list of known filters for unmarshalling a filter into a concrete +// implementation. +var Filters = map[string]func() kio.Filter{ + "FileSetter": func() kio.Filter { return &FileSetter{} }, + "FormatFilter": func() kio.Filter { return &FormatFilter{} }, + "GrepFilter": func() kio.Filter { return GrepFilter{} }, + "MatchModifier": func() kio.Filter { return &MatchModifyFilter{} }, + "Modifier": func() kio.Filter { return &Modifier{} }, +} + +// filter wraps a kio.filter so that it can be unmarshalled from yaml. +type KFilter struct { + kio.Filter +} + +func (t KFilter) MarshalYAML() (interface{}, error) { + return t.Filter, nil +} + +func (t *KFilter) UnmarshalYAML(unmarshal func(interface{}) error) error { + i := map[string]interface{}{} + if err := unmarshal(i); err != nil { + return err + } + meta := &yaml.ResourceMeta{} + if err := unmarshal(meta); err != nil { + return err + } + filter, found := Filters[meta.Kind] + if !found { + var knownFilters []string + for k := range Filters { + knownFilters = append(knownFilters, k) + } + sort.Strings(knownFilters) + return fmt.Errorf("unsupported filter Kind %v: may be one of: [%s]", + meta, strings.Join(knownFilters, ",")) + } + t.Filter = filter() + + return unmarshal(t.Filter) +} + +// Modifier modifies the input Resources by invoking the provided pipeline. +// Modifier will return any Resources for which the pipeline does not return an error. +type Modifier struct { + Kind string `yaml:"kind,omitempty"` + + Filters yaml.YFilters `yaml:"pipeline,omitempty"` +} + +var _ kio.Filter = &Modifier{} + +func (f Modifier) Filter(input []*yaml.RNode) ([]*yaml.RNode, error) { + for i := range input { + if _, err := input[i].Pipe(f.Filters.Filters()...); err != nil { + return nil, err + } + } + return input, nil +} + +type MatchModifyFilter struct { + Kind string `yaml:"kind,omitempty"` + + MatchFilters []yaml.YFilters `yaml:"match,omitempty"` + + ModifyFilters yaml.YFilters `yaml:"modify,omitempty"` +} + +var _ kio.Filter = &MatchModifyFilter{} + +func (f MatchModifyFilter) Filter(input []*yaml.RNode) ([]*yaml.RNode, error) { + var matches = input + var err error + for _, filter := range f.MatchFilters { + matches, err = MatchFilter{Filters: filter}.Filter(matches) + if err != nil { + return nil, err + } + } + _, err = Modifier{Filters: f.ModifyFilters}.Filter(matches) + if err != nil { + return nil, err + } + return input, nil +} + +type MatchFilter struct { + Kind string `yaml:"kind,omitempty"` + + Filters yaml.YFilters `yaml:"pipeline,omitempty"` +} + +var _ kio.Filter = &MatchFilter{} + +func (f MatchFilter) Filter(input []*yaml.RNode) ([]*yaml.RNode, error) { + var output []*yaml.RNode + for i := range input { + if v, err := input[i].Pipe(f.Filters.Filters()...); err != nil { + return nil, err + } else if v == nil { + continue + } + output = append(output, input[i]) + } + return output, nil +} + +type FilenameFmtVerb string + +const ( + // KindFmt substitutes kind + KindFmt FilenameFmtVerb = "%k" + + // NameFmt substitutes metadata.name + NameFmt FilenameFmtVerb = "%n" + + // NamespaceFmt substitutes metdata.namespace + NamespaceFmt FilenameFmtVerb = "%s" +) + +// FileSetter sets the file name and mode annotations on Resources. +type FileSetter struct { + Kind string `yaml:"kind,omitempty"` + + // FilenamePattern is the pattern to use for generating filenames. FilenameFmtVerb + // FielnameFmtVerbs may be specified to substitute Resource metadata into the filename. + FilenamePattern string `yaml:"filenamePattern,omitempty"` + + // Mode is the filemode to write. + Mode string `yaml:"mode,omitempty"` + + // Override will override the existing filename if it is set on the pattern. + // Otherwise the existing filename is kept. + Override bool `yaml:"override,omitempty"` +} + +var _ kio.Filter = &FileSetter{} + +const DefaultFilenamePattern = "%n_%k.yaml" + +func (f *FileSetter) Filter(input []*yaml.RNode) ([]*yaml.RNode, error) { + if f.Mode == "" { + f.Mode = fmt.Sprintf("%d", 0600) + } + if f.FilenamePattern == "" { + f.FilenamePattern = DefaultFilenamePattern + } + + resources := map[string][]*yaml.RNode{} + for i := range input { + m, err := input[i].GetMeta() + if err != nil { + return nil, err + } + file := f.FilenamePattern + file = strings.ReplaceAll(file, string(KindFmt), strings.ToLower(m.Kind)) + file = strings.ReplaceAll(file, string(NameFmt), strings.ToLower(m.Name)) + file = strings.ReplaceAll(file, string(NamespaceFmt), strings.ToLower(m.Namespace)) + + if _, found := m.Annotations[kioutil.PathAnnotation]; !found || f.Override { + if _, err := input[i].Pipe(yaml.SetAnnotation(kioutil.PathAnnotation, file)); err != nil { + return nil, err + } + } + resources[file] = append(resources[file], input[i]) + } + + var output []*yaml.RNode + for i := range resources { + if err := kioutil.SortNodes(resources[i]); err != nil { + return nil, err + } + for j := range resources[i] { + if _, err := resources[i][j].Pipe( + yaml.SetAnnotation(kioutil.IndexAnnotation, fmt.Sprintf("%d", j))); err != nil { + return nil, err + } + output = append(output, resources[i][j]) + } + } + return output, nil +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/fmtr.go b/vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/fmtr.go new file mode 100644 index 000000000000..7f2acbda4c20 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/fmtr.go @@ -0,0 +1,314 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +// Package yamlfmt contains libraries for formatting yaml files containing +// Kubernetes Resource configuration. +// +// Yaml files are formatted by: +// - Sorting fields and map values +// - Sorting unordered lists for whitelisted types +// - Applying a canonical yaml Style +// +// Fields are ordered using a relative ordering applied to commonly +// encountered Resource fields. All Resources, including non-builtin +// Resources such as CRDs, share the same field precedence. +// +// Fields that do not appear in the explicit ordering are ordered +// lexicographically. +// +// A subset of well known known unordered lists are sorted by element field +// values. +package filters + +import ( + "bytes" + "fmt" + "io" + "sort" + + "sigs.k8s.io/kustomize/kyaml/kio" + "sigs.k8s.io/kustomize/kyaml/openapi" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +type FormattingStrategy = string + +const ( + // NoFmtAnnotation determines if the resource should be formatted. + FmtAnnotation string = "config.kubernetes.io/formatting" + + // FmtStrategyStandard means the resource will be formatted according + // to the default rules. + FmtStrategyStandard FormattingStrategy = "standard" + + // FmtStrategyNone means the resource will not be formatted. + FmtStrategyNone FormattingStrategy = "none" +) + +// FormatInput returns the formatted input. +func FormatInput(input io.Reader) (*bytes.Buffer, error) { + buff := &bytes.Buffer{} + err := kio.Pipeline{ + Inputs: []kio.Reader{&kio.ByteReader{Reader: input}}, + Filters: []kio.Filter{FormatFilter{}}, + Outputs: []kio.Writer{kio.ByteWriter{Writer: buff}}, + }.Execute() + + return buff, err +} + +// FormatFileOrDirectory reads the file or directory and formats each file's +// contents by writing it back to the file. +func FormatFileOrDirectory(path string) error { + return kio.Pipeline{ + Inputs: []kio.Reader{kio.LocalPackageReader{ + PackagePath: path, + }}, + Filters: []kio.Filter{FormatFilter{}}, + Outputs: []kio.Writer{kio.LocalPackageWriter{PackagePath: path}}, + }.Execute() +} + +type FormatFilter struct { + Process func(n *yaml.Node) error + UseSchema bool +} + +var _ kio.Filter = FormatFilter{} + +func (f FormatFilter) Filter(slice []*yaml.RNode) ([]*yaml.RNode, error) { + for i := range slice { + fmtStrategy, err := getFormattingStrategy(slice[i]) + if err != nil { + return nil, err + } + + if fmtStrategy == FmtStrategyNone { + continue + } + + kindNode, err := slice[i].Pipe(yaml.Get("kind")) + if err != nil { + return nil, err + } + if kindNode == nil { + continue + } + apiVersionNode, err := slice[i].Pipe(yaml.Get("apiVersion")) + if err != nil { + return nil, err + } + if apiVersionNode == nil { + continue + } + kind, apiVersion := kindNode.YNode().Value, apiVersionNode.YNode().Value + var s *openapi.ResourceSchema + if f.UseSchema { + s = openapi.SchemaForResourceType(yaml.TypeMeta{APIVersion: apiVersion, Kind: kind}) + } else { + s = nil + } + err = (&formatter{apiVersion: apiVersion, kind: kind, process: f.Process}). + fmtNode(slice[i].YNode(), "", s) + if err != nil { + return nil, err + } + } + return slice, nil +} + +// getFormattingStrategy looks for the formatting annotation to determine +// which strategy should be used for formatting. The default is standard +// if no annotation is found. +func getFormattingStrategy(node *yaml.RNode) (FormattingStrategy, error) { + value, err := node.Pipe(yaml.GetAnnotation(FmtAnnotation)) + if err != nil || value == nil { + return FmtStrategyStandard, err + } + + fmtStrategy := value.YNode().Value + + switch fmtStrategy { + case FmtStrategyStandard: + return FmtStrategyStandard, nil + case FmtStrategyNone: + return FmtStrategyNone, nil + default: + return "", fmt.Errorf( + "formatting annotation has illegal value %s", fmtStrategy) + } +} + +type formatter struct { + apiVersion string + kind string + process func(n *yaml.Node) error +} + +// fmtNode recursively formats the Document Contents. +// See: https://godoc.org/gopkg.in/yaml.v3#Node +func (f *formatter) fmtNode(n *yaml.Node, path string, schema *openapi.ResourceSchema) error { + if n.Kind == yaml.ScalarNode && schema != nil && schema.Schema != nil { + // ensure values that are interpreted as non-string values (e.g. "true") + // are properly quoted + yaml.FormatNonStringStyle(n, *schema.Schema) + } + + // sort the order of mapping fields + if n.Kind == yaml.MappingNode { + sort.Sort(sortedMapContents(*n)) + } + + // sort the order of sequence elements if it is whitelisted + if n.Kind == yaml.SequenceNode { + if yaml.WhitelistedListSortKinds.Has(f.kind) && + yaml.WhitelistedListSortApis.Has(f.apiVersion) { + if sortField, found := yaml.WhitelistedListSortFields[path]; found { + sort.Sort(sortedSeqContents{Node: *n, sortField: sortField}) + } + } + } + + // format the Content + for i := range n.Content { + // MappingNode are structured as having their fields as Content, + // with the field-key and field-value alternating. e.g. Even elements + // are the keys and odd elements are the values + isFieldKey := n.Kind == yaml.MappingNode && i%2 == 0 + isFieldValue := n.Kind == yaml.MappingNode && i%2 == 1 + isElement := n.Kind == yaml.SequenceNode + + // run the process callback on the node if it has been set + // don't process keys: their format should be fixed + if f.process != nil && !isFieldKey { + if err := f.process(n.Content[i]); err != nil { + return err + } + } + + // get the schema for this Node + p := path + var s *openapi.ResourceSchema + switch { + case isFieldValue: + // if the node is a field, lookup the schema using the field name + p = fmt.Sprintf("%s.%s", path, n.Content[i-1].Value) + if schema != nil { + s = schema.Field(n.Content[i-1].Value) + } + case isElement: + // if the node is a list element, lookup the schema for the array items + if schema != nil { + s = schema.Elements() + } + } + // format the node using the schema + err := f.fmtNode(n.Content[i], p, s) + if err != nil { + return err + } + } + return nil +} + +// sortedMapContents sorts the Contents field of a MappingNode by the field names using a statically +// defined field precedence, and falling back on lexicographical sorting +type sortedMapContents yaml.Node + +func (s sortedMapContents) Len() int { + return len(s.Content) / 2 +} +func (s sortedMapContents) Swap(i, j int) { + // yaml MappingNode Contents are a list of field names followed by + // field values, rather than a list of field pairs. + // increment. + // + // e.g. ["field1Name", "field1Value", "field2Name", "field2Value"] + iFieldNameIndex := i * 2 + jFieldNameIndex := j * 2 + iFieldValueIndex := iFieldNameIndex + 1 + jFieldValueIndex := jFieldNameIndex + 1 + + // swap field names + s.Content[iFieldNameIndex], s.Content[jFieldNameIndex] = + s.Content[jFieldNameIndex], s.Content[iFieldNameIndex] + + // swap field values + s.Content[iFieldValueIndex], s.Content[jFieldValueIndex] = s. + Content[jFieldValueIndex], s.Content[iFieldValueIndex] +} + +func (s sortedMapContents) Less(i, j int) bool { + iFieldNameIndex := i * 2 + jFieldNameIndex := j * 2 + iFieldName := s.Content[iFieldNameIndex].Value + jFieldName := s.Content[jFieldNameIndex].Value + + // order by their precedence values looked up from the index + iOrder, foundI := yaml.FieldOrder[iFieldName] + jOrder, foundJ := yaml.FieldOrder[jFieldName] + if foundI && foundJ { + return iOrder < jOrder + } + + // known fields come before unknown fields + if foundI { + return true + } + if foundJ { + return false + } + + // neither field is known, sort them lexicographically + return iFieldName < jFieldName +} + +// sortedSeqContents sorts the Contents field of a SequenceNode by the value of +// the elements sortField. +// e.g. it will sort spec.template.spec.containers by the value of the container `name` field +type sortedSeqContents struct { + yaml.Node + sortField string +} + +func (s sortedSeqContents) Len() int { + return len(s.Content) +} +func (s sortedSeqContents) Swap(i, j int) { + s.Content[i], s.Content[j] = s.Content[j], s.Content[i] +} +func (s sortedSeqContents) Less(i, j int) bool { + // primitive lists -- sort by the element's primitive values + if s.sortField == "" { + iValue := s.Content[i].Value + jValue := s.Content[j].Value + return iValue < jValue + } + + // map lists -- sort by the element's sortField values + var iValue, jValue string + for a := range s.Content[i].Content { + if a%2 != 0 { + continue // not a fieldNameIndex + } + // locate the index of the sortField field + if s.Content[i].Content[a].Value == s.sortField { + // a is the yaml node for the field key, a+1 is the node for the field value + iValue = s.Content[i].Content[a+1].Value + } + } + for a := range s.Content[j].Content { + if a%2 != 0 { + continue // not a fieldNameIndex + } + + // locate the index of the sortField field + if s.Content[j].Content[a].Value == s.sortField { + // a is the yaml node for the field key, a+1 is the node for the field value + jValue = s.Content[j].Content[a+1].Value + } + } + + // compare the field values + return iValue < jValue +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/grep.go b/vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/grep.go new file mode 100644 index 000000000000..2eb8a8886630 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/grep.go @@ -0,0 +1,117 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package filters + +import ( + "regexp" + "strings" + + "sigs.k8s.io/kustomize/kyaml/kio" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +type GrepType int + +const ( + Regexp GrepType = 1 << iota + GreaterThanEq + GreaterThan + LessThan + LessThanEq +) + +// GrepFilter filters RNodes with a matching field +type GrepFilter struct { + Path []string `yaml:"path,omitempty"` + Value string `yaml:"value,omitempty"` + MatchType GrepType `yaml:"matchType,omitempty"` + InvertMatch bool `yaml:"invertMatch,omitempty"` + Compare func(a, b string) (int, error) +} + +var _ kio.Filter = GrepFilter{} + +func (f GrepFilter) Filter(input []*yaml.RNode) ([]*yaml.RNode, error) { + // compile the regular expression 1 time if we are matching using regex + var reg *regexp.Regexp + var err error + if f.MatchType == Regexp || f.MatchType == 0 { + reg, err = regexp.Compile(f.Value) + if err != nil { + return nil, err + } + } + + var output kio.ResourceNodeSlice + for i := range input { + node := input[i] + val, err := node.Pipe(&yaml.PathMatcher{Path: f.Path}) + if err != nil { + return nil, err + } + if val == nil || len(val.Content()) == 0 { + if f.InvertMatch { + output = append(output, input[i]) + } + continue + } + found := false + err = val.VisitElements(func(elem *yaml.RNode) error { + // get the value + var str string + if f.MatchType == Regexp { + style := elem.YNode().Style + defer func() { elem.YNode().Style = style }() + elem.YNode().Style = yaml.FlowStyle + str, err = elem.String() + if err != nil { + return err + } + str = strings.TrimSpace(strings.ReplaceAll(str, `"`, "")) + } else { + // if not regexp, then it needs to parse into a quantity and comments will + // break that + str = elem.YNode().Value + if str == "" { + return nil + } + } + + if f.MatchType == Regexp || f.MatchType == 0 { + if reg.MatchString(str) { + found = true + } + return nil + } + + comp, err := f.Compare(str, f.Value) + if err != nil { + return err + } + + if f.MatchType == GreaterThan && comp > 0 { + found = true + } + if f.MatchType == GreaterThanEq && comp >= 0 { + found = true + } + if f.MatchType == LessThan && comp < 0 { + found = true + } + if f.MatchType == LessThanEq && comp <= 0 { + found = true + } + return nil + }) + if err != nil { + return nil, err + } + if found == f.InvertMatch { + continue + } + + output = append(output, input[i]) + } + return output, nil +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/local.go b/vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/local.go new file mode 100644 index 000000000000..bdac1a28fc18 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/local.go @@ -0,0 +1,38 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package filters + +import ( + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +const LocalConfigAnnotation = "config.kubernetes.io/local-config" + +// IsLocalConfig filters Resources using the config.kubernetes.io/local-config annotation +type IsLocalConfig struct { + // IncludeLocalConfig will include local-config if set to true + IncludeLocalConfig bool `yaml:"includeLocalConfig,omitempty"` + + // ExcludeNonLocalConfig will exclude non local-config if set to true + ExcludeNonLocalConfig bool `yaml:"excludeNonLocalConfig,omitempty"` +} + +// Filter implements kio.Filter +func (c *IsLocalConfig) Filter(inputs []*yaml.RNode) ([]*yaml.RNode, error) { + var out []*yaml.RNode + for i := range inputs { + meta, err := inputs[i].GetMeta() + if err != nil { + return nil, err + } + _, local := meta.Annotations[LocalConfigAnnotation] + + if local && c.IncludeLocalConfig { + out = append(out, inputs[i]) + } else if !local && !c.ExcludeNonLocalConfig { + out = append(out, inputs[i]) + } + } + return out, nil +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/merge.go b/vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/merge.go new file mode 100644 index 000000000000..5159052cc065 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/merge.go @@ -0,0 +1,86 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +// Package merge contains libraries for merging Resources and Patches +package filters + +import ( + "sigs.k8s.io/kustomize/kyaml/kio" + "sigs.k8s.io/kustomize/kyaml/yaml" + "sigs.k8s.io/kustomize/kyaml/yaml/merge2" +) + +// MergeFilter merges Resources with the Group/Version/Kind/Namespace/Name together using +// a 2-way merge strategy. +// +// - Fields set to null in the source will be cleared from the destination +// - Fields with matching keys will be merged recursively +// - Lists with an associative key (e.g. name) will have their elements merged using the key +// - List without an associative key will have the dest list replaced by the source list +type MergeFilter struct { + Reverse bool +} + +var _ kio.Filter = MergeFilter{} + +type mergeKey struct { + apiVersion string + kind string + namespace string + name string +} + +// MergeFilter implements kio.Filter by merging Resources with the same G/V/K/NS/N +func (c MergeFilter) Filter(input []*yaml.RNode) ([]*yaml.RNode, error) { + // invert the merge precedence + if c.Reverse { + for i, j := 0, len(input)-1; i < j; i, j = i+1, j-1 { + input[i], input[j] = input[j], input[i] + } + } + + // index the Resources by G/V/K/NS/N + index := map[mergeKey][]*yaml.RNode{} + // retain the original ordering + var order []mergeKey + for i := range input { + meta, err := input[i].GetMeta() + if err != nil { + return nil, err + } + key := mergeKey{ + apiVersion: meta.APIVersion, + kind: meta.Kind, + namespace: meta.Namespace, + name: meta.Name, + } + if _, found := index[key]; !found { + order = append(order, key) + } + index[key] = append(index[key], input[i]) + } + + // merge each of the G/V/K/NS/N lists + var output []*yaml.RNode + var err error + for _, k := range order { + var merged *yaml.RNode + resources := index[k] + for i := range resources { + patch := resources[i] + if merged == nil { + // first resources, don't merge it + merged = resources[i] + } else { + merged, err = merge2.Merge(patch, merged, yaml.MergeOptions{ + ListIncreaseDirection: yaml.MergeOptionsListPrepend, + }) + if err != nil { + return nil, err + } + } + } + output = append(output, merged) + } + return output, nil +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/merge3.go b/vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/merge3.go new file mode 100644 index 000000000000..27dd0f766d2a --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/merge3.go @@ -0,0 +1,203 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package filters + +import ( + "fmt" + + "sigs.k8s.io/kustomize/kyaml/kio" + "sigs.k8s.io/kustomize/kyaml/kio/kioutil" + "sigs.k8s.io/kustomize/kyaml/yaml" + "sigs.k8s.io/kustomize/kyaml/yaml/merge3" +) + +const ( + mergeSourceAnnotation = "config.kubernetes.io/merge-source" + mergeSourceOriginal = "original" + mergeSourceUpdated = "updated" + mergeSourceDest = "dest" +) + +// Merge3 performs a 3-way merge on the original, updated, and destination packages. +type Merge3 struct { + OriginalPath string + UpdatedPath string + DestPath string + MatchFilesGlob []string + + // MergeOnPath will use the relative filepath as part of the merge key. + // This may be necessary if the directory contains multiple copies of + // the same resource, or resources patches. + MergeOnPath bool +} + +func (m Merge3) Merge() error { + // Read the destination package. The ReadWriter will take take of deleting files + // for removed resources. + var inputs []kio.Reader + dest := &kio.LocalPackageReadWriter{ + PackagePath: m.DestPath, + MatchFilesGlob: m.MatchFilesGlob, + SetAnnotations: map[string]string{mergeSourceAnnotation: mergeSourceDest}, + } + inputs = append(inputs, dest) + + // Read the original package + inputs = append(inputs, kio.LocalPackageReader{ + PackagePath: m.OriginalPath, + MatchFilesGlob: m.MatchFilesGlob, + SetAnnotations: map[string]string{mergeSourceAnnotation: mergeSourceOriginal}, + }) + + // Read the updated package + inputs = append(inputs, kio.LocalPackageReader{ + PackagePath: m.UpdatedPath, + MatchFilesGlob: m.MatchFilesGlob, + SetAnnotations: map[string]string{mergeSourceAnnotation: mergeSourceUpdated}, + }) + + return kio.Pipeline{ + Inputs: inputs, + Filters: []kio.Filter{m}, + Outputs: []kio.Writer{dest}, + }.Execute() +} + +// Filter combines Resources with the same GVK + N + NS into tuples, and then merges them +func (m Merge3) Filter(nodes []*yaml.RNode) ([]*yaml.RNode, error) { + // index the nodes by their identity + tl := tuples{mergeOnPath: m.MergeOnPath} + for i := range nodes { + if err := tl.add(nodes[i]); err != nil { + return nil, err + } + } + + // iterate over the inputs, merging as needed + var output []*yaml.RNode + for i := range tl.list { + t := tl.list[i] + switch { + case t.original == nil && t.updated == nil && t.dest != nil: + // added locally -- keep dest + output = append(output, t.dest) + case t.original == nil && t.updated != nil && t.dest == nil: + // added in the update -- add update + output = append(output, t.updated) + case t.original != nil && t.updated == nil: + // deleted in the update + // don't include the resource in the output + case t.original != nil && t.dest == nil: + // deleted locally + // don't include the resource in the output + default: + // dest and updated are non-nil -- merge them + node, err := t.merge() + if err != nil { + return nil, err + } + if node != nil { + output = append(output, node) + } + } + } + return output, nil +} + +// tuples combines nodes with the same GVK + N + NS +type tuples struct { + list []*tuple + + // mergeOnPath if set to true will use the resource filepath + // as part of the merge key + mergeOnPath bool +} + +// isSameResource returns true if meta1 and meta2 are for the same logic resource +func (ts *tuples) isSameResource(meta1, meta2 yaml.ResourceMeta) bool { + if meta1.Name != meta2.Name { + return false + } + if meta1.Namespace != meta2.Namespace { + return false + } + if meta1.APIVersion != meta2.APIVersion { + return false + } + if meta1.Kind != meta2.Kind { + return false + } + if ts.mergeOnPath { + // directories may contain multiple copies of a resource with the same + // name, namespace, apiVersion and kind -- e.g. kustomize patches, or + // multiple environments + // mergeOnPath configures the merge logic to use the path as part of the + // resource key + if meta1.Annotations[kioutil.PathAnnotation] != meta2.Annotations[kioutil.PathAnnotation] { + return false + } + } + return true +} + +// add adds a node to the list, combining it with an existing matching Resource if found +func (ts *tuples) add(node *yaml.RNode) error { + nodeMeta, err := node.GetMeta() + if err != nil { + return err + } + for i := range ts.list { + t := ts.list[i] + if ts.isSameResource(t.meta, nodeMeta) { + return t.add(node) + } + } + t := &tuple{meta: nodeMeta} + if err := t.add(node); err != nil { + return err + } + ts.list = append(ts.list, t) + return nil +} + +// tuple wraps an original, updated, and dest tuple for a given Resource +type tuple struct { + meta yaml.ResourceMeta + original *yaml.RNode + updated *yaml.RNode + dest *yaml.RNode +} + +// add sets the corresponding tuple field for the node +func (t *tuple) add(node *yaml.RNode) error { + meta, err := node.GetMeta() + if err != nil { + return err + } + switch meta.Annotations[mergeSourceAnnotation] { + case mergeSourceDest: + if t.dest != nil { + return fmt.Errorf("dest source already specified") + } + t.dest = node + case mergeSourceOriginal: + if t.original != nil { + return fmt.Errorf("original source already specified") + } + t.original = node + case mergeSourceUpdated: + if t.updated != nil { + return fmt.Errorf("updated source already specified") + } + t.updated = node + default: + return fmt.Errorf("no source annotation for Resource") + } + return nil +} + +// merge performs a 3-way merge on the tuple +func (t *tuple) merge() (*yaml.RNode, error) { + return merge3.Merge(t.dest, t.original, t.updated) +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/modify.go b/vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/modify.go new file mode 100644 index 000000000000..b1090302af28 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/modify.go @@ -0,0 +1,4 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package filters diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/stripcomments.go b/vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/stripcomments.go new file mode 100644 index 000000000000..8e9ecb3f248e --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/kio/filters/stripcomments.go @@ -0,0 +1,32 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package filters + +import ( + "sigs.k8s.io/kustomize/kyaml/kio" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +type StripCommentsFilter struct{} + +var _ kio.Filter = StripCommentsFilter{} + +func (f StripCommentsFilter) Filter(slice []*yaml.RNode) ([]*yaml.RNode, error) { + for i := range slice { + stripComments(slice[i].YNode()) + } + return slice, nil +} + +func stripComments(node *yaml.Node) { + if node == nil { + return + } + node.HeadComment = "" + node.LineComment = "" + node.FootComment = "" + for i := range node.Content { + stripComments(node.Content[i]) + } +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/kio/ignorefilesmatcher.go b/vendor/sigs.k8s.io/kustomize/kyaml/kio/ignorefilesmatcher.go new file mode 100644 index 000000000000..9a6ce924bdf5 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/kio/ignorefilesmatcher.go @@ -0,0 +1,100 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package kio + +import ( + "os" + "path/filepath" + "strings" + + "github.com/monochromegane/go-gitignore" + "sigs.k8s.io/kustomize/kyaml/ext" +) + +// ignoreFilesMatcher handles `.krmignore` files, which allows for ignoring +// files or folders in a package. The format of this file is a subset of the +// gitignore format, with recursive patterns (like a/**/c) not supported. If a +// file or folder matches any of the patterns in the .krmignore file for the +// package, it will be excluded. +// +// It works as follows: +// +// * It will look for .krmignore file in the top folder and on the top level +// of any subpackages. Subpackages are defined by the presence of a Krmfile +// in the folder. +// * `.krmignore` files only cover files and folders for the package in which +// it is defined. So ignore patterns defined in a parent package does not +// affect which files are ignored from a subpackage. +// * An ignore pattern can not ignore a subpackage. So even if the parent +// package contains a pattern that ignores the directory foo, if foo is a +// subpackage, it will still be included if the IncludeSubpackages property +// is set to true +type ignoreFilesMatcher struct { + matchers []matcher +} + +// readIgnoreFile checks whether there is a .krmignore file in the path, and +// if it is, reads it in and turns it into a matcher. If we can't find a file, +// we just add a matcher that match nothing. +func (i *ignoreFilesMatcher) readIgnoreFile(path string) error { + i.verifyPath(path) + m, err := gitignore.NewGitIgnore(filepath.Join(path, ext.IgnoreFileName())) + if err != nil { + if os.IsNotExist(err) { + i.matchers = append(i.matchers, matcher{ + matcher: gitignore.DummyIgnoreMatcher(false), + basePath: path, + }) + return nil + } + return err + } + i.matchers = append(i.matchers, matcher{ + matcher: m, + basePath: path, + }) + return nil +} + +// verifyPath checks whether the top matcher on the stack +// is correct for the provided filepath. Matchers are removed once +// we encounter a filepath that is not a subpath of the basepath for +// the matcher. +func (i *ignoreFilesMatcher) verifyPath(path string) { + for j := len(i.matchers) - 1; j >= 0; j-- { + matcher := i.matchers[j] + if strings.HasPrefix(path, matcher.basePath) || path == matcher.basePath { + i.matchers = i.matchers[:j+1] + return + } + } +} + +// matchFile checks whether the file given by the provided path matches +// any of the patterns in the .krmignore file for the package. +func (i *ignoreFilesMatcher) matchFile(path string) bool { + if len(i.matchers) == 0 { + return false + } + i.verifyPath(filepath.Dir(path)) + return i.matchers[len(i.matchers)-1].matcher.Match(path, false) +} + +// matchFile checks whether the directory given by the provided path matches +// any of the patterns in the .krmignore file for the package. +func (i *ignoreFilesMatcher) matchDir(path string) bool { + if len(i.matchers) == 0 { + return false + } + i.verifyPath(path) + return i.matchers[len(i.matchers)-1].matcher.Match(path, true) +} + +// matcher wraps the gitignore matcher and the path to the folder +// where the file was found. +type matcher struct { + matcher gitignore.IgnoreMatcher + + basePath string +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/kio/kio.go b/vendor/sigs.k8s.io/kustomize/kyaml/kio/kio.go new file mode 100644 index 000000000000..12271aa81097 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/kio/kio.go @@ -0,0 +1,149 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +// Package kio contains low-level libraries for reading, modifying and writing +// Resource Configuration and packages. +package kio + +import ( + "sigs.k8s.io/kustomize/kyaml/errors" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +// Reader reads ResourceNodes. Analogous to io.Reader. +type Reader interface { + Read() ([]*yaml.RNode, error) +} + +// ResourceNodeSlice is a collection of ResourceNodes. +// While ResourceNodeSlice has no inherent constraints on ordering or uniqueness, specific +// Readers, Filters or Writers may have constraints. +type ResourceNodeSlice []*yaml.RNode + +var _ Reader = ResourceNodeSlice{} + +func (o ResourceNodeSlice) Read() ([]*yaml.RNode, error) { + return o, nil +} + +// Writer writes ResourceNodes. Analogous to io.Writer. +type Writer interface { + Write([]*yaml.RNode) error +} + +// WriterFunc implements a Writer as a function. +type WriterFunc func([]*yaml.RNode) error + +func (fn WriterFunc) Write(o []*yaml.RNode) error { + return fn(o) +} + +// ReaderWriter implements both Reader and Writer interfaces +type ReaderWriter interface { + Reader + Writer +} + +// Filter modifies a collection of Resource Configuration by returning the modified slice. +// When possible, Filters should be serializable to yaml so that they can be described +// as either data or code. +// +// Analogous to http://www.linfo.org/filters.html +type Filter interface { + Filter([]*yaml.RNode) ([]*yaml.RNode, error) +} + +// FilterFunc implements a Filter as a function. +type FilterFunc func([]*yaml.RNode) ([]*yaml.RNode, error) + +func (fn FilterFunc) Filter(o []*yaml.RNode) ([]*yaml.RNode, error) { + return fn(o) +} + +// Pipeline reads Resource Configuration from a set of Inputs, applies some +// transformation filters, and writes the results to a set of Outputs. +// +// Analogous to http://www.linfo.org/pipes.html +type Pipeline struct { + // Inputs provide sources for Resource Configuration to be read. + Inputs []Reader `yaml:"inputs,omitempty"` + + // Filters are transformations applied to the Resource Configuration. + // They are applied in the order they are specified. + // Analogous to http://www.linfo.org/filters.html + Filters []Filter `yaml:"filters,omitempty"` + + // Outputs are where the transformed Resource Configuration is written. + Outputs []Writer `yaml:"outputs,omitempty"` + + // ContinueOnEmptyResult configures what happens when a filter in the pipeline + // returns an empty result. + // If it is false (default), subsequent filters will be skipped and the result + // will be returned immediately. This is useful as an optimization when you + // know that subsequent filters will not alter the empty result. + // If it is true, the empty result will be provided as input to the next + // filter in the list. This is useful when subsequent functions in the + // pipeline may generate new resources. + ContinueOnEmptyResult bool `yaml:"continueOnEmptyResult,omitempty"` +} + +// Execute executes each step in the sequence, returning immediately after encountering +// any error as part of the Pipeline. +func (p Pipeline) Execute() error { + return p.ExecuteWithCallback(nil) +} + +// PipelineExecuteCallbackFunc defines a callback function that will be called each time a step in the pipeline succeeds. +type PipelineExecuteCallbackFunc = func(op Filter) + +// ExecuteWithCallback executes each step in the sequence, returning immediately after encountering +// any error as part of the Pipeline. The callback will be called each time a step succeeds. +func (p Pipeline) ExecuteWithCallback(callback PipelineExecuteCallbackFunc) error { + var result []*yaml.RNode + + // read from the inputs + for _, i := range p.Inputs { + nodes, err := i.Read() + if err != nil { + return errors.Wrap(err) + } + result = append(result, nodes...) + } + + // apply operations + var err error + for i := range p.Filters { + op := p.Filters[i] + if callback != nil { + callback(op) + } + result, err = op.Filter(result) + // TODO (issue 2872): This len(result) == 0 should be removed and empty result list should be + // handled by outputs. However currently some writer like LocalPackageReadWriter + // will clear the output directory and which will cause unpredictable results + if len(result) == 0 && !p.ContinueOnEmptyResult || err != nil { + return errors.Wrap(err) + } + } + + // write to the outputs + for _, o := range p.Outputs { + if err := o.Write(result); err != nil { + return errors.Wrap(err) + } + } + return nil +} + +// FilterAll runs the yaml.Filter against all inputs +func FilterAll(filter yaml.Filter) Filter { + return FilterFunc(func(nodes []*yaml.RNode) ([]*yaml.RNode, error) { + for i := range nodes { + _, err := filter.Filter(nodes[i]) + if err != nil { + return nil, errors.Wrap(err) + } + } + return nodes, nil + }) +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/kio/kioutil/kioutil.go b/vendor/sigs.k8s.io/kustomize/kyaml/kio/kioutil/kioutil.go new file mode 100644 index 000000000000..1d5e3bf5863e --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/kio/kioutil/kioutil.go @@ -0,0 +1,233 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package kioutil + +import ( + "fmt" + "path" + "sort" + "strconv" + "strings" + + "sigs.k8s.io/kustomize/kyaml/errors" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +type AnnotationKey = string + +const ( + // IndexAnnotation records the index of a specific resource in a file or input stream. + IndexAnnotation AnnotationKey = "config.kubernetes.io/index" + + // PathAnnotation records the path to the file the Resource was read from + PathAnnotation AnnotationKey = "config.kubernetes.io/path" +) + +func GetFileAnnotations(rn *yaml.RNode) (string, string, error) { + meta, err := rn.GetMeta() + if err != nil { + return "", "", err + } + path := meta.Annotations[PathAnnotation] + index := meta.Annotations[IndexAnnotation] + return path, index, nil +} + +// ErrorIfMissingAnnotation validates the provided annotations are present on the given resources +func ErrorIfMissingAnnotation(nodes []*yaml.RNode, keys ...AnnotationKey) error { + for _, key := range keys { + for _, node := range nodes { + val, err := node.Pipe(yaml.GetAnnotation(key)) + if err != nil { + return errors.Wrap(err) + } + if val == nil { + return errors.Errorf("missing annotation %s", key) + } + } + } + return nil +} + +// CreatePathAnnotationValue creates a default path annotation value for a Resource. +// The path prefix will be dir. +func CreatePathAnnotationValue(dir string, m yaml.ResourceMeta) string { + filename := fmt.Sprintf("%s_%s.yaml", strings.ToLower(m.Kind), m.Name) + return path.Join(dir, m.Namespace, filename) +} + +// DefaultPathAndIndexAnnotation sets a default path or index value on any nodes missing the +// annotation +func DefaultPathAndIndexAnnotation(dir string, nodes []*yaml.RNode) error { + counts := map[string]int{} + + // check each node for the path annotation + for i := range nodes { + m, err := nodes[i].GetMeta() + if err != nil { + return err + } + + // calculate the max index in each file in case we are appending + if p, found := m.Annotations[PathAnnotation]; found { + // record the max indexes into each file + if i, found := m.Annotations[IndexAnnotation]; found { + index, _ := strconv.Atoi(i) + if index > counts[p] { + counts[p] = index + } + } + + // has the path annotation already -- do nothing + continue + } + + // set a path annotation on the Resource + path := CreatePathAnnotationValue(dir, m) + if err := nodes[i].PipeE(yaml.SetAnnotation(PathAnnotation, path)); err != nil { + return err + } + } + + // set the index annotations + for i := range nodes { + m, err := nodes[i].GetMeta() + if err != nil { + return err + } + + if _, found := m.Annotations[IndexAnnotation]; found { + continue + } + + p := m.Annotations[PathAnnotation] + + // set an index annotation on the Resource + c := counts[p] + counts[p] = c + 1 + if err := nodes[i].PipeE( + yaml.SetAnnotation(IndexAnnotation, fmt.Sprintf("%d", c))); err != nil { + return err + } + } + return nil +} + +// DefaultPathAnnotation sets a default path annotation on any Reources +// missing it. +func DefaultPathAnnotation(dir string, nodes []*yaml.RNode) error { + // check each node for the path annotation + for i := range nodes { + m, err := nodes[i].GetMeta() + if err != nil { + return err + } + + if _, found := m.Annotations[PathAnnotation]; found { + // has the path annotation already -- do nothing + continue + } + + // set a path annotation on the Resource + path := CreatePathAnnotationValue(dir, m) + if err := nodes[i].PipeE(yaml.SetAnnotation(PathAnnotation, path)); err != nil { + return err + } + } + return nil +} + +// Map invokes fn for each element in nodes. +func Map(nodes []*yaml.RNode, fn func(*yaml.RNode) (*yaml.RNode, error)) ([]*yaml.RNode, error) { + var returnNodes []*yaml.RNode + for i := range nodes { + n, err := fn(nodes[i]) + if err != nil { + return nil, errors.Wrap(err) + } + if n != nil { + returnNodes = append(returnNodes, n) + } + } + return returnNodes, nil +} + +func MapMeta(nodes []*yaml.RNode, fn func(*yaml.RNode, yaml.ResourceMeta) (*yaml.RNode, error)) ( + []*yaml.RNode, error) { + var returnNodes []*yaml.RNode + for i := range nodes { + meta, err := nodes[i].GetMeta() + if err != nil { + return nil, errors.Wrap(err) + } + n, err := fn(nodes[i], meta) + if err != nil { + return nil, errors.Wrap(err) + } + if n != nil { + returnNodes = append(returnNodes, n) + } + } + return returnNodes, nil +} + +// SortNodes sorts nodes in place: +// - by PathAnnotation annotation +// - by IndexAnnotation annotation +func SortNodes(nodes []*yaml.RNode) error { + var err error + // use stable sort to keep ordering of equal elements + sort.SliceStable(nodes, func(i, j int) bool { + if err != nil { + return false + } + var iMeta, jMeta yaml.ResourceMeta + if iMeta, _ = nodes[i].GetMeta(); err != nil { + return false + } + if jMeta, _ = nodes[j].GetMeta(); err != nil { + return false + } + + iValue := iMeta.Annotations[PathAnnotation] + jValue := jMeta.Annotations[PathAnnotation] + if iValue != jValue { + return iValue < jValue + } + + iValue = iMeta.Annotations[IndexAnnotation] + jValue = jMeta.Annotations[IndexAnnotation] + + // put resource config without an index first + if iValue == jValue { + return false + } + if iValue == "" { + return true + } + if jValue == "" { + return false + } + + // sort by index + var iIndex, jIndex int + iIndex, err = strconv.Atoi(iValue) + if err != nil { + err = fmt.Errorf("unable to parse config.kubernetes.io/index %s :%v", iValue, err) + return false + } + jIndex, err = strconv.Atoi(jValue) + if err != nil { + err = fmt.Errorf("unable to parse config.kubernetes.io/index %s :%v", jValue, err) + return false + } + if iIndex != jIndex { + return iIndex < jIndex + } + + // elements are equal + return false + }) + return errors.Wrap(err) +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/kio/pkgio_reader.go b/vendor/sigs.k8s.io/kustomize/kyaml/kio/pkgio_reader.go new file mode 100644 index 000000000000..2fb1758e2d43 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/kio/pkgio_reader.go @@ -0,0 +1,308 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package kio + +import ( + "fmt" + "os" + "path/filepath" + + "sigs.k8s.io/kustomize/kyaml/errors" + "sigs.k8s.io/kustomize/kyaml/kio/kioutil" + "sigs.k8s.io/kustomize/kyaml/sets" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +// requiredResourcePackageAnnotations are annotations that are required to write resources back to +// files. +var requiredResourcePackageAnnotations = []string{kioutil.IndexAnnotation, kioutil.PathAnnotation} + +// PackageBuffer implements Reader and Writer, storing Resources in a local field. +type PackageBuffer struct { + Nodes []*yaml.RNode +} + +func (r *PackageBuffer) Read() ([]*yaml.RNode, error) { + return r.Nodes, nil +} + +func (r *PackageBuffer) Write(nodes []*yaml.RNode) error { + r.Nodes = nodes + return nil +} + +// LocalPackageReadWriter reads and writes Resources from / to a local directory. +// When writing, LocalPackageReadWriter will delete files if all of the Resources from +// that file have been removed from the output. +type LocalPackageReadWriter struct { + Kind string `yaml:"kind,omitempty"` + + KeepReaderAnnotations bool `yaml:"keepReaderAnnotations,omitempty"` + + // PackagePath is the path to the package directory. + PackagePath string `yaml:"path,omitempty"` + + // PackageFileName is the name of file containing package metadata. + // It will be used to identify package. + PackageFileName string `yaml:"packageFileName,omitempty"` + + // MatchFilesGlob configures Read to only read Resources from files matching any of the + // provided patterns. + // Defaults to ["*.yaml", "*.yml"] if empty. To match all files specify ["*"]. + MatchFilesGlob []string `yaml:"matchFilesGlob,omitempty"` + + // IncludeSubpackages will configure Read to read Resources from subpackages. + // Subpackages are identified by presence of PackageFileName. + IncludeSubpackages bool `yaml:"includeSubpackages,omitempty"` + + // ErrorIfNonResources will configure Read to throw an error if yaml missing missing + // apiVersion or kind is read. + ErrorIfNonResources bool `yaml:"errorIfNonResources,omitempty"` + + // OmitReaderAnnotations will cause the reader to skip annotating Resources with the file + // path and mode. + OmitReaderAnnotations bool `yaml:"omitReaderAnnotations,omitempty"` + + // SetAnnotations are annotations to set on the Resources as they are read. + SetAnnotations map[string]string `yaml:"setAnnotations,omitempty"` + + // NoDeleteFiles if set to true, LocalPackageReadWriter won't delete any files + NoDeleteFiles bool `yaml:"noDeleteFiles,omitempty"` + + files sets.String +} + +func (r *LocalPackageReadWriter) Read() ([]*yaml.RNode, error) { + nodes, err := LocalPackageReader{ + PackagePath: r.PackagePath, + MatchFilesGlob: r.MatchFilesGlob, + IncludeSubpackages: r.IncludeSubpackages, + ErrorIfNonResources: r.ErrorIfNonResources, + SetAnnotations: r.SetAnnotations, + PackageFileName: r.PackageFileName, + }.Read() + if err != nil { + return nil, errors.Wrap(err) + } + // keep track of all the files + if !r.NoDeleteFiles { + r.files, err = r.getFiles(nodes) + if err != nil { + return nil, errors.Wrap(err) + } + } + return nodes, nil +} + +func (r *LocalPackageReadWriter) Write(nodes []*yaml.RNode) error { + newFiles, err := r.getFiles(nodes) + if err != nil { + return errors.Wrap(err) + } + var clear []string + for k := range r.SetAnnotations { + clear = append(clear, k) + } + err = LocalPackageWriter{ + PackagePath: r.PackagePath, + ClearAnnotations: clear, + KeepReaderAnnotations: r.KeepReaderAnnotations, + }.Write(nodes) + if err != nil { + return errors.Wrap(err) + } + deleteFiles := r.files.Difference(newFiles) + for f := range deleteFiles { + if err = os.Remove(filepath.Join(r.PackagePath, f)); err != nil { + return errors.Wrap(err) + } + } + return nil +} + +func (r *LocalPackageReadWriter) getFiles(nodes []*yaml.RNode) (sets.String, error) { + val := sets.String{} + for _, n := range nodes { + path, _, err := kioutil.GetFileAnnotations(n) + if err != nil { + return nil, errors.Wrap(err) + } + val.Insert(path) + } + return val, nil +} + +// LocalPackageReader reads ResourceNodes from a local package. +type LocalPackageReader struct { + Kind string `yaml:"kind,omitempty"` + + // PackagePath is the path to the package directory. + PackagePath string `yaml:"path,omitempty"` + + // PackageFileName is the name of file containing package metadata. + // It will be used to identify package. + PackageFileName string `yaml:"packageFileName,omitempty"` + + // MatchFilesGlob configures Read to only read Resources from files matching any of the + // provided patterns. + // Defaults to ["*.yaml", "*.yml"] if empty. To match all files specify ["*"]. + MatchFilesGlob []string `yaml:"matchFilesGlob,omitempty"` + + // IncludeSubpackages will configure Read to read Resources from subpackages. + // Subpackages are identified by presence of PackageFileName. + IncludeSubpackages bool `yaml:"includeSubpackages,omitempty"` + + // ErrorIfNonResources will configure Read to throw an error if yaml missing missing + // apiVersion or kind is read. + ErrorIfNonResources bool `yaml:"errorIfNonResources,omitempty"` + + // OmitReaderAnnotations will cause the reader to skip annotating Resources with the file + // path and mode. + OmitReaderAnnotations bool `yaml:"omitReaderAnnotations,omitempty"` + + // SetAnnotations are annotations to set on the Resources as they are read. + SetAnnotations map[string]string `yaml:"setAnnotations,omitempty"` +} + +var _ Reader = LocalPackageReader{} + +var DefaultMatch = []string{"*.yaml", "*.yml"} +var JSONMatch = []string{"*.json"} +var MatchAll = append(DefaultMatch, JSONMatch...) + +// Read reads the Resources. +func (r LocalPackageReader) Read() ([]*yaml.RNode, error) { + if r.PackagePath == "" { + return nil, fmt.Errorf("must specify package path") + } + + // use slash for path + r.PackagePath = filepath.ToSlash(r.PackagePath) + if len(r.MatchFilesGlob) == 0 { + r.MatchFilesGlob = DefaultMatch + } + + var operand ResourceNodeSlice + var pathRelativeTo string + var err error + ignoreFilesMatcher := &ignoreFilesMatcher{} + r.PackagePath, err = filepath.Abs(r.PackagePath) + if err != nil { + return nil, errors.Wrap(err) + } + err = filepath.Walk(r.PackagePath, func( + path string, info os.FileInfo, err error) error { + if err != nil { + return errors.Wrap(err) + } + + // is this the user specified path? + if path == r.PackagePath { + if info.IsDir() { + // skip the root package directory, but check for a + // .krmignore file first. + pathRelativeTo = r.PackagePath + return ignoreFilesMatcher.readIgnoreFile(path) + } + + // user specified path is a file rather than a directory. + // make its path relative to its parent so it can be written to another file. + pathRelativeTo = filepath.Dir(r.PackagePath) + } + + // check if we should skip the directory or file + if info.IsDir() { + return r.shouldSkipDir(path, ignoreFilesMatcher) + } + if match, err := r.shouldSkipFile(path, ignoreFilesMatcher); err != nil { + return err + } else if !match { + // skip this file + return nil + } + + // get the relative path to file within the package so we can write the files back out + // to another location. + path, err = filepath.Rel(pathRelativeTo, path) + if err != nil { + return errors.WrapPrefixf(err, pathRelativeTo) + } + + r.initReaderAnnotations(path, info) + nodes, err := r.readFile(filepath.Join(pathRelativeTo, path), info) + if err != nil { + return errors.WrapPrefixf(err, filepath.Join(pathRelativeTo, path)) + } + operand = append(operand, nodes...) + return nil + }) + return operand, err +} + +// readFile reads the ResourceNodes from a file +func (r *LocalPackageReader) readFile(path string, _ os.FileInfo) ([]*yaml.RNode, error) { + f, err := os.Open(path) + if err != nil { + return nil, err + } + defer f.Close() + + rr := &ByteReader{ + DisableUnwrapping: true, + Reader: f, + OmitReaderAnnotations: r.OmitReaderAnnotations, + SetAnnotations: r.SetAnnotations, + } + return rr.Read() +} + +// shouldSkipFile returns true if the file should be skipped +func (r *LocalPackageReader) shouldSkipFile(path string, matcher *ignoreFilesMatcher) (bool, error) { + // check if the file is covered by a .krmignore file. + if matcher.matchFile(path) { + return false, nil + } + + // check if the files are in scope + for _, g := range r.MatchFilesGlob { + if match, err := filepath.Match(g, filepath.Base(path)); err != nil { + return false, errors.Wrap(err) + } else if match { + return true, nil + } + } + return false, nil +} + +// initReaderAnnotations adds the LocalPackageReader Annotations to r.SetAnnotations +func (r *LocalPackageReader) initReaderAnnotations(path string, _ os.FileInfo) { + if r.SetAnnotations == nil { + r.SetAnnotations = map[string]string{} + } + if !r.OmitReaderAnnotations { + r.SetAnnotations[kioutil.PathAnnotation] = path + } +} + +// shouldSkipDir returns a filepath.SkipDir if the directory should be skipped +func (r *LocalPackageReader) shouldSkipDir(path string, matcher *ignoreFilesMatcher) error { + if matcher.matchDir(path) { + return filepath.SkipDir + } + + if r.PackageFileName == "" { + return nil + } + // check if this is a subpackage + _, err := os.Stat(filepath.Join(path, r.PackageFileName)) + if os.IsNotExist(err) { + return nil + } else if err != nil { + return errors.Wrap(err) + } + if !r.IncludeSubpackages { + return filepath.SkipDir + } + return matcher.readIgnoreFile(path) +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/kio/pkgio_writer.go b/vendor/sigs.k8s.io/kustomize/kyaml/kio/pkgio_writer.go new file mode 100644 index 000000000000..b671512e33d0 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/kio/pkgio_writer.go @@ -0,0 +1,152 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package kio + +import ( + "fmt" + "os" + "path/filepath" + "strings" + + "sigs.k8s.io/kustomize/kyaml/errors" + "sigs.k8s.io/kustomize/kyaml/kio/kioutil" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +// LocalPackageWriter writes ResourceNodes to a filesystem +type LocalPackageWriter struct { + Kind string `yaml:"kind,omitempty"` + + // PackagePath is the path to the package directory. + PackagePath string `yaml:"path,omitempty"` + + // KeepReaderAnnotations if set will retain the annotations set by LocalPackageReader + KeepReaderAnnotations bool `yaml:"keepReaderAnnotations,omitempty"` + + // ClearAnnotations will clear annotations before writing the resources + ClearAnnotations []string `yaml:"clearAnnotations,omitempty"` +} + +var _ Writer = LocalPackageWriter{} + +func (r LocalPackageWriter) Write(nodes []*yaml.RNode) error { + // set the path and index annotations if they are missing + if err := kioutil.DefaultPathAndIndexAnnotation("", nodes); err != nil { + return err + } + + if s, err := os.Stat(r.PackagePath); err != nil { + return err + } else if !s.IsDir() { + // if the user specified input isn't a directory, the package is the directory of the + // target + r.PackagePath = filepath.Dir(r.PackagePath) + } + + // setup indexes for writing Resources back to files + if err := r.errorIfMissingRequiredAnnotation(nodes); err != nil { + return err + } + outputFiles, err := r.indexByFilePath(nodes) + if err != nil { + return err + } + for k := range outputFiles { + if err = kioutil.SortNodes(outputFiles[k]); err != nil { + return errors.Wrap(err) + } + } + + if !r.KeepReaderAnnotations { + r.ClearAnnotations = append(r.ClearAnnotations, kioutil.PathAnnotation) + } + + // validate outputs before writing any + for path := range outputFiles { + outputPath := filepath.Join(r.PackagePath, path) + if st, err := os.Stat(outputPath); !os.IsNotExist(err) { + if err != nil { + return errors.Wrap(err) + } + if st.IsDir() { + return fmt.Errorf("config.kubernetes.io/path cannot be a directory: %s", path) + } + } + + err = os.MkdirAll(filepath.Dir(outputPath), 0700) + if err != nil { + return errors.Wrap(err) + } + } + + // write files + for path := range outputFiles { + outputPath := filepath.Join(r.PackagePath, path) + err = os.MkdirAll(filepath.Dir(filepath.Join(r.PackagePath, path)), 0700) + if err != nil { + return errors.Wrap(err) + } + + f, err := os.OpenFile(outputPath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, os.FileMode(0600)) + if err != nil { + return errors.Wrap(err) + } + if err := func() error { + defer f.Close() + w := ByteWriter{ + Writer: f, + KeepReaderAnnotations: r.KeepReaderAnnotations, + ClearAnnotations: r.ClearAnnotations, + } + if err = w.Write(outputFiles[path]); err != nil { + return errors.Wrap(err) + } + return nil + }(); err != nil { + return errors.Wrap(err) + } + } + + return nil +} + +func (r LocalPackageWriter) errorIfMissingRequiredAnnotation(nodes []*yaml.RNode) error { + for i := range nodes { + for _, s := range requiredResourcePackageAnnotations { + key, err := nodes[i].Pipe(yaml.GetAnnotation(s)) + if err != nil { + return errors.Wrap(err) + } + if key == nil || key.YNode() == nil || key.YNode().Value == "" { + return errors.Errorf( + "resources must be annotated with %s to be written to files", s) + } + } + } + return nil +} + +func (r LocalPackageWriter) indexByFilePath(nodes []*yaml.RNode) (map[string][]*yaml.RNode, error) { + outputFiles := map[string][]*yaml.RNode{} + for i := range nodes { + // parse the file write path + node := nodes[i] + value, err := node.Pipe(yaml.GetAnnotation(kioutil.PathAnnotation)) + if err != nil { + // this should never happen if errorIfMissingRequiredAnnotation was run + return nil, errors.Wrap(err) + } + path := value.YNode().Value + outputFiles[path] = append(outputFiles[path], node) + + if filepath.IsAbs(path) { + return nil, errors.Errorf("package paths may not be absolute paths") + } + if strings.Contains(filepath.Clean(path), "..") { + return nil, fmt.Errorf("resource must be written under package %s: %s", + r.PackagePath, filepath.Clean(path)) + } + } + return outputFiles, nil +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/kio/testing.go b/vendor/sigs.k8s.io/kustomize/kyaml/kio/testing.go new file mode 100644 index 000000000000..67471c6654e9 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/kio/testing.go @@ -0,0 +1,55 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package kio + +import ( + "io/ioutil" + "os" + "path/filepath" + "testing" + + "github.com/stretchr/testify/assert" +) + +// Setup creates directories and files for testing +type Setup struct { + // root is the tmp directory + Root string +} + +// setupDirectories creates directories for reading test configuration from +func SetupDirectories(t *testing.T, dirs ...string) Setup { + d, err := ioutil.TempDir("", "kyaml-test") + if !assert.NoError(t, err) { + assert.FailNow(t, err.Error()) + } + err = os.Chdir(d) + if !assert.NoError(t, err) { + assert.FailNow(t, err.Error()) + } + for _, s := range dirs { + err = os.MkdirAll(s, 0700) + if !assert.NoError(t, err) { + assert.FailNow(t, err.Error()) + } + } + return Setup{Root: d} +} + +// writeFile writes a file under the test directory +func (s Setup) WriteFile(t *testing.T, path string, value []byte) { + err := os.MkdirAll(filepath.Dir(filepath.Join(s.Root, path)), 0700) + if !assert.NoError(t, err) { + assert.FailNow(t, err.Error()) + } + err = ioutil.WriteFile(filepath.Join(s.Root, path), value, 0600) + if !assert.NoError(t, err) { + assert.FailNow(t, err.Error()) + } +} + +// clean deletes the test config +func (s Setup) Clean() { + os.RemoveAll(s.Root) +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/kio/tree.go b/vendor/sigs.k8s.io/kustomize/kyaml/kio/tree.go new file mode 100644 index 000000000000..d17293722d9f --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/kio/tree.go @@ -0,0 +1,514 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package kio + +import ( + "fmt" + "io" + "os" + "path/filepath" + "sort" + "strings" + + "github.com/xlab/treeprint" + "sigs.k8s.io/kustomize/kyaml/kio/kioutil" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +type TreeStructure string + +const ( + // TreeStructurePackage configures TreeWriter to generate the tree structure off of the + // Resources packages. + TreeStructurePackage TreeStructure = "directory" + + // TreeStructureOwners configures TreeWriter to generate the tree structure off of the + // Resource owners. + TreeStructureGraph TreeStructure = "owners" +) + +var GraphStructures = []string{string(TreeStructureGraph), string(TreeStructurePackage)} + +// TreeWriter prints the package structured as a tree. +// TODO(pwittrock): test this package better. it is lower-risk since it is only +// used for printing rather than updating or editing. +type TreeWriter struct { + Writer io.Writer + Root string + Fields []TreeWriterField + Structure TreeStructure + OpenAPIFileName string +} + +// TreeWriterField configures a Resource field to be included in the tree +type TreeWriterField struct { + yaml.PathMatcher + Name string + SubName string +} + +func (p TreeWriter) packageStructure(nodes []*yaml.RNode) error { + indexByPackage := p.index(nodes) + + // create the new tree + tree := treeprint.New() + tree.SetValue(p.Root) + + // add each package to the tree + treeIndex := map[string]treeprint.Tree{} + keys := p.sort(indexByPackage) + for _, pkg := range keys { + // create a branch for this package -- search for the parent package and create + // the branch under it -- requires that the keys are sorted + branch := tree + for parent, subTree := range treeIndex { + if strings.HasPrefix(pkg, parent) { + // found a package whose path is a prefix to our own, use this + // package if a closer one isn't found + branch = subTree + // don't break, continue searching for more closely related ancestors + } + } + + // create a new branch for the package + createOk := pkg != "." // special edge case logic for tree on current working dir + if createOk { + branch = branch.AddBranch(branchName(p.Root, pkg, p.OpenAPIFileName)) + } + + // cache the branch for this package + treeIndex[pkg] = branch + + // print each resource in the package + for i := range indexByPackage[pkg] { + var err error + if _, err = p.doResource(indexByPackage[pkg][i], "", branch); err != nil { + return err + } + } + } + + _, err := io.WriteString(p.Writer, tree.String()) + return err +} + +// branchName takes the root directory and relative path to the directory +// and returns the branch name +func branchName(root, dirRelPath, openAPIFileName string) string { + name := filepath.Base(dirRelPath) + _, err := os.Stat(filepath.Join(root, dirRelPath, openAPIFileName)) + if !os.IsNotExist(err) { + // add Pkg: prefix indicating that it is a separate package as it has + // openAPIFile + return fmt.Sprintf("Pkg: %s", name) + } + return name +} + +// Write writes the ascii tree to p.Writer +func (p TreeWriter) Write(nodes []*yaml.RNode) error { + switch p.Structure { + case TreeStructurePackage: + return p.packageStructure(nodes) + case TreeStructureGraph: + return p.graphStructure(nodes) + } + + // If any resource has an owner reference, default to the graph structure. Otherwise, use package structure. + for _, node := range nodes { + if owners, _ := node.Pipe(yaml.Lookup("metadata", "ownerReferences")); owners != nil { + return p.graphStructure(nodes) + } + } + return p.packageStructure(nodes) +} + +// node wraps a tree node, and any children nodes +type node struct { + p TreeWriter + *yaml.RNode + children []*node +} + +func (a node) Len() int { return len(a.children) } +func (a node) Swap(i, j int) { a.children[i], a.children[j] = a.children[j], a.children[i] } +func (a node) Less(i, j int) bool { + return compareNodes(a.children[i].RNode, a.children[j].RNode) +} + +// Tree adds this node to the root +func (a node) Tree(root treeprint.Tree) error { + sort.Sort(a) + branch := root + var err error + + // generate a node for the Resource + if a.RNode != nil { + branch, err = a.p.doResource(a.RNode, "Resource", root) + if err != nil { + return err + } + } + + // attach children to the branch + for _, n := range a.children { + if err := n.Tree(branch); err != nil { + return err + } + } + return nil +} + +// graphStructure writes the tree using owners for structure +func (p TreeWriter) graphStructure(nodes []*yaml.RNode) error { + resourceToOwner := map[string]*node{} + root := &node{} + // index each of the nodes by their owner + for _, n := range nodes { + ownerVal, err := ownerToString(n) + if err != nil { + return err + } + var owner *node + if ownerVal == "" { + // no owner -- attach to the root + owner = root + } else { + // owner found -- attach to the owner + var found bool + owner, found = resourceToOwner[ownerVal] + if !found { + // initialize the owner if not found + resourceToOwner[ownerVal] = &node{p: p} + owner = resourceToOwner[ownerVal] + } + } + + nodeVal, err := nodeToString(n) + if err != nil { + return err + } + val, found := resourceToOwner[nodeVal] + if !found { + // initialize the node if not found -- may have already been initialized if it + // is the owner of another node + resourceToOwner[nodeVal] = &node{p: p} + val = resourceToOwner[nodeVal] + } + val.RNode = n + owner.children = append(owner.children, val) + } + + for k, v := range resourceToOwner { + if v.RNode == nil { + return fmt.Errorf( + "owner '%s' not found in input, but found as an owner of input objects", k) + } + } + + // print the tree + tree := treeprint.New() + if err := root.Tree(tree); err != nil { + return err + } + + _, err := io.WriteString(p.Writer, tree.String()) + return err +} + +// nodeToString generates a string to identify the node -- matches ownerToString format +func nodeToString(node *yaml.RNode) (string, error) { + meta, err := node.GetMeta() + if err != nil { + return "", err + } + + return fmt.Sprintf("%s %s/%s", meta.Kind, meta.Namespace, meta.Name), nil +} + +// ownerToString generate a string to identify the owner -- matches nodeToString format +func ownerToString(node *yaml.RNode) (string, error) { + meta, err := node.GetMeta() + if err != nil { + return "", err + } + namespace := meta.Namespace + + owners, err := node.Pipe(yaml.Lookup("metadata", "ownerReferences")) + if err != nil { + return "", err + } + if owners == nil { + return "", nil + } + + elements, err := owners.Elements() + if err != nil { + return "", err + } + if len(elements) == 0 { + return "", err + } + owner := elements[0] + var kind, name string + + if value := owner.Field("kind"); !value.IsNilOrEmpty() { + kind = value.Value.YNode().Value + } + if value := owner.Field("name"); !value.IsNilOrEmpty() { + name = value.Value.YNode().Value + } + + return fmt.Sprintf("%s %s/%s", kind, namespace, name), nil +} + +// index indexes the Resources by their package +func (p TreeWriter) index(nodes []*yaml.RNode) map[string][]*yaml.RNode { + // index the ResourceNodes by package + indexByPackage := map[string][]*yaml.RNode{} + for i := range nodes { + meta, err := nodes[i].GetMeta() + if err != nil || meta.Kind == "" { + // not a resource + continue + } + pkg := filepath.Dir(meta.Annotations[kioutil.PathAnnotation]) + indexByPackage[pkg] = append(indexByPackage[pkg], nodes[i]) + } + return indexByPackage +} + +func compareNodes(i, j *yaml.RNode) bool { + metai, _ := i.GetMeta() + metaj, _ := j.GetMeta() + pi := metai.Annotations[kioutil.PathAnnotation] + pj := metaj.Annotations[kioutil.PathAnnotation] + + // compare file names + if filepath.Base(pi) != filepath.Base(pj) { + return filepath.Base(pi) < filepath.Base(pj) + } + + // compare namespace + if metai.Namespace != metaj.Namespace { + return metai.Namespace < metaj.Namespace + } + + // compare name + if metai.Name != metaj.Name { + return metai.Name < metaj.Name + } + + // compare kind + if metai.Kind != metaj.Kind { + return metai.Kind < metaj.Kind + } + + // compare apiVersion + if metai.APIVersion != metaj.APIVersion { + return metai.APIVersion < metaj.APIVersion + } + return true +} + +// sort sorts the Resources in the index in display order and returns the ordered +// keys for the index +// +// Packages are sorted by package name +// Resources within a package are sorted by: [filename, namespace, name, kind, apiVersion] +func (p TreeWriter) sort(indexByPackage map[string][]*yaml.RNode) []string { + var keys []string + for k := range indexByPackage { + pkgNodes := indexByPackage[k] + sort.Slice(pkgNodes, func(i, j int) bool { return compareNodes(pkgNodes[i], pkgNodes[j]) }) + keys = append(keys, k) + } + + // return the package names sorted lexicographically + sort.Strings(keys) + return keys +} + +func (p TreeWriter) doResource(leaf *yaml.RNode, metaString string, branch treeprint.Tree) (treeprint.Tree, error) { + meta, _ := leaf.GetMeta() + if metaString == "" { + path := meta.Annotations[kioutil.PathAnnotation] + path = filepath.Base(path) + metaString = path + } + + value := fmt.Sprintf("%s %s", meta.Kind, meta.Name) + if len(meta.Namespace) > 0 { + value = fmt.Sprintf("%s %s/%s", meta.Kind, meta.Namespace, meta.Name) + } + + fields, err := p.getFields(leaf) + if err != nil { + return nil, err + } + + n := branch.AddMetaBranch(metaString, value) + for i := range fields { + field := fields[i] + + // do leaf node + if len(field.matchingElementsAndFields) == 0 { + n.AddNode(fmt.Sprintf("%s: %s", field.name, field.value)) + continue + } + + // do nested nodes + b := n.AddBranch(field.name) + for j := range field.matchingElementsAndFields { + elem := field.matchingElementsAndFields[j] + b := b.AddBranch(elem.name) + for k := range elem.matchingElementsAndFields { + field := elem.matchingElementsAndFields[k] + b.AddNode(fmt.Sprintf("%s: %s", field.name, field.value)) + } + } + } + + return n, nil +} + +// getFields looks up p.Fields from leaf and structures them into treeFields. +// TODO(pwittrock): simplify this function +func (p TreeWriter) getFields(leaf *yaml.RNode) (treeFields, error) { + fieldsByName := map[string]*treeField{} + + // index nested and non-nested fields + for i := range p.Fields { + f := p.Fields[i] + seq, err := leaf.Pipe(&f) + if err != nil { + return nil, err + } + if seq == nil { + continue + } + + if fieldsByName[f.Name] == nil { + fieldsByName[f.Name] = &treeField{name: f.Name} + } + + // non-nested field -- add directly to the treeFields list + if f.SubName == "" { + // non-nested field -- only 1 element + val, err := yaml.String(seq.Content()[0], yaml.Trim, yaml.Flow) + if err != nil { + return nil, err + } + fieldsByName[f.Name].value = val + continue + } + + // nested-field -- create a parent elem, and index by the 'match' value + if fieldsByName[f.Name].subFieldByMatch == nil { + fieldsByName[f.Name].subFieldByMatch = map[string]treeFields{} + } + index := fieldsByName[f.Name].subFieldByMatch + for j := range seq.Content() { + elem := seq.Content()[j] + matches := f.Matches[elem] + str, err := yaml.String(elem, yaml.Trim, yaml.Flow) + if err != nil { + return nil, err + } + + // map the field by the name of the element + // index the subfields by the matching element so we can put all the fields for the + // same element under the same branch + matchKey := strings.Join(matches, "/") + index[matchKey] = append(index[matchKey], &treeField{name: f.SubName, value: str}) + } + } + + // iterate over collection of all queried fields in the Resource + for _, field := range fieldsByName { + // iterate over collection of elements under the field -- indexed by element name + for match, subFields := range field.subFieldByMatch { + // create a new element for this collection of fields + // note: we will convert name to an index later, but keep the match for sorting + elem := &treeField{name: match} + field.matchingElementsAndFields = append(field.matchingElementsAndFields, elem) + + // iterate over collection of queried fields for the element + for i := range subFields { + // add to the list of fields for this element + elem.matchingElementsAndFields = append(elem.matchingElementsAndFields, subFields[i]) + } + } + // clear this cached data + field.subFieldByMatch = nil + } + + // put the fields in a list so they are ordered + fieldList := treeFields{} + for _, v := range fieldsByName { + fieldList = append(fieldList, v) + } + + // sort the fields + sort.Sort(fieldList) + for i := range fieldList { + field := fieldList[i] + // sort the elements under this field + sort.Sort(field.matchingElementsAndFields) + + for i := range field.matchingElementsAndFields { + element := field.matchingElementsAndFields[i] + // sort the elements under a list field by their name + sort.Sort(element.matchingElementsAndFields) + // set the name of the element to its index + element.name = fmt.Sprintf("%d", i) + } + } + + return fieldList, nil +} + +// treeField wraps a field node +type treeField struct { + // name is the name of the node + name string + + // value is the value of the node -- may be empty + value string + + // matchingElementsAndFields is a slice of fields that go under this as a branch + matchingElementsAndFields treeFields + + // subFieldByMatch caches matchingElementsAndFields indexed by the name of the matching elem + subFieldByMatch map[string]treeFields +} + +// treeFields wraps a slice of treeField so they can be sorted +type treeFields []*treeField + +func (nodes treeFields) Len() int { return len(nodes) } + +func (nodes treeFields) Less(i, j int) bool { + iIndex, iFound := yaml.FieldOrder[nodes[i].name] + jIndex, jFound := yaml.FieldOrder[nodes[j].name] + if iFound && jFound { + return iIndex < jIndex + } + if iFound { + return true + } + if jFound { + return false + } + + if nodes[i].name != nodes[j].name { + return nodes[i].name < nodes[j].name + } + if nodes[i].value != nodes[j].value { + return nodes[i].value < nodes[j].value + } + return false +} + +func (nodes treeFields) Swap(i, j int) { nodes[i], nodes[j] = nodes[j], nodes[i] } diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/openapi/Makefile b/vendor/sigs.k8s.io/kustomize/kyaml/openapi/Makefile new file mode 100644 index 000000000000..f5cd8dc6770a --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/openapi/Makefile @@ -0,0 +1,58 @@ +# Copyright 2020 The Kubernetes Authors. +# SPDX-License-Identifier: Apache-2.0 + +MYGOBIN := $(shell go env GOPATH)/bin +API_VERSION := "v1.19.1" + +.PHONY: all +all: \ + kustomizationapi/swagger.go \ + kubernetesapi/swagger.go \ + kubernetesapi/openapiinfo.go + +.PHONY: clean +clean: + rm kustomizationapi/swagger.go + rm kubernetesapi/openapiinfo.go + +# This will remove all currently built-in schema, +# so think twice before deleting. +# To replace what this will delete typically requires the ability +# to contact a live kubernetes API server. +.PHONY: nuke +nuke: clean + rm -r kubernetesapi/* + +$(MYGOBIN)/go-bindata: + go install github.com/go-bindata/go-bindata/v3/go-bindata + +$(MYGOBIN)/kind: + ( \ + set -e; \ + d=$(shell mktemp -d); cd $$d; \ + wget -O ./kind https://github.com/kubernetes-sigs/kind/releases/download/v0.7.0/kind-$(shell uname)-amd64; \ + chmod +x ./kind; \ + mv ./kind $(MYGOBIN); \ + rm -rf $$d; \ + ) + +$(MYGOBIN)/kpt: + ../../hack/install_kpt.sh 0.34.0 $(MYGOBIN) + +kustomizationapi/swagger.go: $(MYGOBIN)/go-bindata kustomizationapi/swagger.json + $(MYGOBIN)/go-bindata \ + --pkg kustomizationapi \ + -o kustomizationapi/swagger.go \ + kustomizationapi/swagger.json + +.PHONY: kubernetesapi/openapiinfo.go +kubernetesapi/openapiinfo.go: + ./scripts/makeOpenApiInfoDotGo.sh + +.PHONY: kubernetesapi/swagger.json +kubernetesapi/swagger.json: $(MYGOBIN)/kind $(MYGOBIN)/kpt + ./scripts/fetchSchemaFromCluster.sh $(API_VERSION) + +.PHONY: kubernetesapi/swagger.go +kubernetesapi/swagger.go: $(MYGOBIN)/go-bindata kubernetesapi/swagger.json + ./scripts/generateSwaggerDotGo.sh $(API_VERSION) diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/openapi/README.md b/vendor/sigs.k8s.io/kustomize/kyaml/openapi/README.md new file mode 100644 index 000000000000..935c6eb8c148 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/openapi/README.md @@ -0,0 +1,63 @@ +# Sampling New OpenAPI Data + +[OpenAPI schema]: ./kubernetesapi/ +[kind]: https://hub.docker.com/r/kindest/node/tags + +This document describes how to fetch OpenAPI data from a +live kubernetes API server, e.g. an instance of [kind]. + +### Delete all currently built-in schema +``` +make nuke +``` + +### Add a new built-in schema + +In this directory, fetch the openapi schema and generate the +corresponding swagger.go for the kubernetes api: + +``` +make kubernetesapi/swagger.go +``` + +To fetch the schema without generating the swagger.go, you can +run: + +``` +make nuke +make kubernetesapi/swagger.json +``` + +Note that generating the swagger.go will re-fetch the schema. + +You can specify a specific version with the "API_VERSION" +parameter. The default version is v1.19.1. Here is an +example for generating swagger.go for v1.14.1. + +``` +make kubernetesapi/swagger.go API_VERSION=v1.14.1 +``` + +This will update the [OpenAPI schema]. The above command will +create a directory kubernetesapi/v1141 and store the resulting +swagger.json and swagger.go files there. + +### Make the schema available for use + +While the above commands generate the swagger.go files, they +do not make them available for use nor do they update the +info field reported by `kustomize openapi info`. To make the +newly fetched schema and swagger.go available: + +``` +make kubernetesapi/openapiinfo.go +``` + +### Run all tests + +At the top of the repository, run the tests. + +``` +make prow-presubmit-check >& /tmp/k.txt; echo $? +# The exit code should be zero; if not examine /tmp/k.txt +``` diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/openapi/kubernetesapi/openapiinfo.go b/vendor/sigs.k8s.io/kustomize/kyaml/openapi/kubernetesapi/openapiinfo.go new file mode 100644 index 000000000000..2cf472c8ab09 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/openapi/kubernetesapi/openapiinfo.go @@ -0,0 +1,18 @@ +// Copyright 2020 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +// Code generated by ./scripts/makeOpenApiInfoDotGo.sh; DO NOT EDIT. + +package kubernetesapi + +import ( + "sigs.k8s.io/kustomize/kyaml/openapi/kubernetesapi/v1204" +) + +const Info = "{title:Kubernetes,version:v1.20.4}" + +var OpenAPIMustAsset = map[string]func(string) []byte{ + "v1204": v1204.MustAsset, +} + +const DefaultOpenAPI = "v1204" diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/openapi/kubernetesapi/v1204/swagger.go b/vendor/sigs.k8s.io/kustomize/kyaml/openapi/kubernetesapi/v1204/swagger.go new file mode 100644 index 000000000000..21462426e44f --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/openapi/kubernetesapi/v1204/swagger.go @@ -0,0 +1,251 @@ +// Copyright 2021 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +// Code generated for package v1204 by go-bindata DO NOT EDIT. (@generated) +// sources: +// kubernetesapi/v1204/swagger.json +package v1204 + +import ( + "bytes" + "compress/gzip" + "fmt" + "io" + "io/ioutil" + "os" + "path/filepath" + "strings" + "time" +) + +func bindataRead(data []byte, name string) ([]byte, error) { + gz, err := gzip.NewReader(bytes.NewBuffer(data)) + if err != nil { + return nil, fmt.Errorf("Read %q: %v", name, err) + } + + var buf bytes.Buffer + _, err = io.Copy(&buf, gz) + clErr := gz.Close() + + if err != nil { + return nil, fmt.Errorf("Read %q: %v", name, err) + } + if clErr != nil { + return nil, err + } + + return buf.Bytes(), nil +} + +type asset struct { + bytes []byte + info os.FileInfo +} + +type bindataFileInfo struct { + name string + size int64 + mode os.FileMode + modTime time.Time +} + +// Name return file name +func (fi bindataFileInfo) Name() string { + return fi.name +} + +// Size return file size +func (fi bindataFileInfo) Size() int64 { + return fi.size +} + +// Mode return file mode +func (fi bindataFileInfo) Mode() os.FileMode { + return fi.mode +} + +// Mode return file modify time +func (fi bindataFileInfo) ModTime() time.Time { + return fi.modTime +} + +// IsDir return file whether a directory +func (fi bindataFileInfo) IsDir() bool { + return fi.mode&os.ModeDir != 0 +} + +// Sys return file is sys mode +func (fi bindataFileInfo) Sys() interface{} { + return nil +} + +var _kubernetesapiV1204SwaggerJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\xff\x73\xdb\xb8\xd5\x37\xfa\xfb\xfb\x57\x60\xbc\xb7\x93\x64\x47\x96\x93\xdd\xb6\x4f\xdf\x74\x3a\xf7\xba\x49\xb6\x75\x9b\xcd\xfa\xb5\x9d\x76\xde\xfb\xb8\xf3\x06\x22\x21\x09\x8f\x49\x80\x0b\x80\x76\xd4\x3b\xcf\xff\x7e\x07\xe7\x00\x20\x48\x51\x22\x25\x4b\xb6\xec\xb0\x3f\x74\x63\x0a\x04\xf1\xf5\x7c\xfd\x9c\x73\xfe\xbf\xff\x41\xc8\x51\xca\xa6\x5c\x70\xc3\xa5\xd0\x47\x6f\x89\x7d\x44\xc8\x11\x97\xe3\x9b\x3f\xe8\x31\x2d\xf8\x98\xa6\x39\xd7\x9a\x4b\xa1\xd8\x8c\x6b\xa3\xa8\x6d\x3a\xbe\x7d\x33\xfe\xb9\x34\xd4\x70\x31\xfb\x27\x9b\xcc\xa5\xbc\x09\x2f\x43\x9f\x3a\x51\xbc\xb0\x2d\x8f\xde\x92\xa3\x46\x4b\x82\x3f\x4f\x98\x26\x54\x90\xd0\x3f\xb9\x73\x3f\x53\x91\x12\x33\x67\x44\x31\x2d\x4b\x95\x40\xb3\x94\xc8\x82\xe1\xb7\x35\xe1\x86\xd0\xa2\xc8\x38\xd3\xc4\xc8\xf1\xd1\xc8\x7f\xb6\x50\xb6\x91\xe1\x4c\x47\x83\x21\xe4\x28\x7c\xe2\x82\xdd\x72\x76\xf7\x0f\xa6\x74\x6d\xba\xed\xa3\x3e\x6d\x7f\x8b\x70\x18\xb6\x54\x29\x53\x2c\x25\x19\xd7\x86\xc8\x29\x29\x14\x9b\x32\x65\x9f\x7c\x69\xbc\xf8\x85\xdc\xfa\x57\xed\xac\xfc\x22\xb0\xaf\x05\x4b\x8c\x1e\x93\xd3\xf3\x33\xa2\x99\xba\x65\x8a\xdc\xf1\x2c\x23\x46\x2d\x88\x91\xa4\xd4\x8c\x4c\xb9\xd2\xc6\xbf\x4e\xb8\x80\x0e\xe0\x8b\x77\x73\x9e\xcc\xed\x42\xe8\xb2\x28\xa4\xb2\xfd\x9c\x4d\x89\x90\x82\xd9\xc1\xd8\x66\xe1\xa3\xba\x60\x09\x9f\x72\x96\x62\x07\x5c\x63\x0f\xee\x45\x96\x92\xc9\x22\x1a\xc3\x88\xdc\xd2\x8c\xa7\xb0\xd2\x38\x9e\x29\xe5\x19\x99\x4a\x85\xef\xca\xc9\x7f\xb1\xc4\xc0\xd7\x28\x29\xec\x37\xb4\xed\xc3\xef\x5d\x22\xc5\x94\xcf\x4a\xdc\xa9\xf0\x69\x4d\x68\x96\xc9\x3b\x96\x56\xa3\xb2\x5b\x9a\x4a\xa6\x89\x90\x86\x70\x91\x64\x65\xca\x08\x15\x8b\xaa\xc5\x8d\x90\x77\xc2\xae\x84\x9d\x8d\x1d\xe0\xa5\x1b\x60\x42\xb3\x4c\xfb\x1f\xfc\x87\xab\xa1\xda\x9e\x27\x8c\xe8\x12\x46\xea\xdb\xd9\x9f\x4a\xc5\x48\x21\x33\x9e\x2c\xaa\x43\x83\xc7\xdd\xb0\xbc\x79\x1c\x08\x39\x32\x8b\x82\xd9\x93\xa0\x8d\xe2\x62\x76\x14\xfd\xf8\xdf\xb5\xd7\x7d\x3b\xaa\x14\x5d\x54\xcd\xa2\x46\x47\x49\xc6\x99\x30\xef\x60\x75\x9a\xe7\xee\xff\x52\x6c\x6a\x5f\xff\xee\x24\xba\x8b\x27\x7d\xae\xa0\x3b\x4b\xef\xe2\xce\x47\x6b\x8e\x74\xdc\x90\xc0\xc7\x98\x26\x73\x79\x67\x17\x29\x91\x79\x5e\x0a\x9e\x50\xc3\xc8\x1d\x37\x73\x58\x35\xdb\xfb\x98\x5c\xb0\x5f\x4b\xae\x58\xda\x3e\x35\xb7\xb2\xe7\xb0\xb0\x1d\x77\xea\xa7\xb8\x6d\x6d\x04\xa5\x50\x2c\x91\x33\xc1\xff\xcd\x52\xc2\x94\x92\x4a\x93\xa9\x92\x39\x0c\xa3\xa2\x11\x4c\xa4\x85\xe4\xc2\x10\xaa\x18\x99\x53\x91\x66\x2c\x25\xc7\xd5\xf1\xa2\x59\x69\x4f\x9b\x62\xe4\x6c\x26\xa4\x62\x44\x2a\x62\x3f\x3a\x26\xef\xd9\x94\x96\x99\x81\x83\x03\x4f\x8e\x5a\xf7\xb0\xb9\xd7\xf1\x4c\x73\x6a\x92\x79\xaf\x79\x46\x2d\xeb\xeb\x3c\x67\xe4\xfa\x48\x95\x19\xd3\xd7\x47\x78\x0f\xb9\xb6\x57\x3d\xb5\xc3\x82\xb7\xec\x65\x90\x39\x17\x33\xa2\xd8\xaf\x25\xd3\x40\x22\x96\xa7\x77\x7d\xf4\xe1\x2b\x4d\xcc\xf5\x91\x9d\xe1\xf5\xd1\x87\x5f\x4b\x7e\x4b\x33\x26\xcc\xf5\xd1\xf8\x5a\x5c\x8b\x63\x02\xbf\xbf\x75\x9d\x52\xdf\x1b\x91\x22\x5b\x10\x3e\xb5\xb4\x83\xd9\x16\xd9\x02\x9b\xd8\x7e\x23\x5a\x61\xc7\x38\x26\x3f\x49\x65\x5b\xe5\x45\xc6\x46\xf6\xa5\x94\x15\x99\x5c\xe4\x4c\x18\x4d\x12\x2a\xec\x3d\xcb\x65\x8a\x6f\xdc\x72\x6a\xc9\xb2\x3e\xb9\x7d\x33\xf2\xff\x98\x30\x43\xed\x5f\x22\x25\xec\xab\x61\x02\x6e\x76\xf5\x7c\x52\x9a\x68\x39\x70\x64\x48\x0a\x52\xf2\x85\x16\xfc\x2f\x4a\x96\x85\x7e\xfb\x9f\xd7\x47\xb6\xbf\xeb\xa3\x7f\xd9\x8e\xb9\xa7\xc4\xf6\xf9\xed\x1b\x78\x1a\x58\xc5\x5b\xf2\x9f\xd7\x47\xd1\x28\xaf\x8f\xfe\xf5\x65\x14\xcd\xde\xc8\xda\xd0\x08\xcc\xaf\x39\x30\x72\x27\xcb\x2c\x05\xca\x64\x09\x09\x13\xa6\x41\x6d\xfc\x0a\x87\x45\x5f\x5e\x66\x3e\xf5\x2b\xa3\xe1\x29\x8e\x0f\xb6\x1c\x29\x31\xcc\x7a\x44\xd8\x2d\x13\xb8\x74\x42\x9a\x39\x53\x40\xe9\x66\x76\xde\x76\x6c\x8e\x18\xee\x7d\x23\xec\xf3\xc3\xdd\x88\x09\xb3\x7c\xe5\x96\x01\xb7\xaa\x5e\x84\x51\xaf\xda\x9d\xf8\xba\xd7\xaf\xc7\xe6\xf7\x5e\xd0\x9c\x75\x5c\xf8\xab\x39\x23\xb6\x99\xe7\xbe\x4b\x52\xcd\x98\x7c\xb2\x3f\xeb\xb9\x9f\xd1\xb4\xcc\xb2\x05\xf9\xb5\xa4\x19\xec\xda\x88\xb0\xf1\x6c\x3c\x22\x3c\xa7\x33\xe6\x98\xd4\x4d\x39\x61\x4a\x30\xc3\xf4\x98\xcb\x11\xb9\x9b\x33\xb8\xf8\x51\x93\xeb\x23\x4b\x3f\x4c\xe3\xe3\xee\x93\xb8\xad\xb5\x4e\xda\x5a\x4b\x35\xa3\x82\xff\x1b\x99\x4a\xa0\xf5\x5b\x90\x47\xdb\xa9\x2e\x68\xc2\x2e\x59\xc6\x12\x23\xd5\xa6\x8c\x2e\xa7\xc9\x9c\x0b\xa6\x16\xe3\xe2\x66\x66\x1f\xe8\x71\xce\x0c\xb5\x9c\xee\x23\x9d\xb0\x2c\xf4\xbb\x8e\xc7\x7d\x6a\x8e\x82\xa4\x2c\xe1\x29\xd3\x76\xfd\xe0\x86\x19\x49\x54\x29\x6a\xd2\x83\x14\x20\xd3\xa1\xc4\x30\xa1\x96\x1e\xdb\xad\xf3\x2f\xb8\x15\x83\x6e\x9d\x28\x44\x8d\x6f\xee\xa9\xa7\x6d\xa5\xdd\x37\x41\x3e\x82\xc5\xc5\x36\xdc\x68\x96\x4d\x41\x74\xac\x7a\x1a\x41\x0b\x78\xdd\x92\x7b\xae\xad\x3c\x35\x95\x2a\xc7\xaf\x3b\x49\xcb\xae\x40\x4a\x0d\x1d\x67\x76\x09\xf4\x52\xcf\x3a\x50\x8e\x24\x2b\xb5\x61\x8a\xe8\x44\x16\x96\x82\xbb\xab\x38\xb2\xa4\x5e\x30\x2b\x5f\xea\x1b\x5e\xe8\xa5\xab\x52\xa3\x2d\xab\x16\x67\xe1\x3e\x68\x97\x51\xea\x78\x3d\x38\xca\x70\x54\x6b\x99\x70\x0a\xc2\xa0\x15\x1f\x2c\x39\x11\x19\xbb\x65\x99\xa5\x28\x53\x72\x7d\xf4\xda\x33\xab\x37\xd7\x47\x7f\x24\x64\x21\x4b\x94\xda\x34\x33\xb5\xc5\x23\x54\x93\xa9\xb4\x2c\x4f\xbf\x25\xd7\xcb\xc7\xea\xda\x9e\xab\x6b\x41\xc8\x35\xf2\xd9\x0f\x5f\x0b\xc5\xe0\xb2\x69\xfb\xd3\x7f\xda\x9f\x08\xb6\xb0\xff\xbb\x3e\xba\x61\x0b\xfb\x43\x3c\xa2\x51\xf5\x2b\x2a\x16\xd8\xed\xf5\xd1\x27\x69\xce\x44\xed\x77\x64\xba\x51\xcf\xf8\xf8\x75\xd4\x88\xe0\xa4\xfc\x9f\xff\xc2\x7f\xfc\xb7\xfd\xcf\xbf\xae\xc5\x7f\xdb\x45\x3e\x9b\x12\x2e\xb4\x61\x34\xc5\x89\x53\x24\x5b\x40\x6a\x37\x5f\xf0\xe6\x62\xa3\x5c\xc1\xc4\x2d\x57\x52\xe4\x40\xe6\x70\xcd\x0b\x25\x53\xbf\xec\xda\xd0\x19\x17\x33\xbb\xf8\x8f\xb0\xf6\xb5\xc1\xad\x5c\xfe\x7e\x6b\x8f\xb3\xaa\x2d\x7f\x98\xdc\xba\x4d\xb8\x64\x8c\xcc\x8d\x29\xf4\xdb\x93\x93\x1a\x5d\x3c\x49\x65\xa2\x4f\x12\x29\x12\x56\x18\x7d\x22\x6f\x99\xb2\xaa\xdb\xc9\x9d\x54\x37\x5c\xcc\x8e\xed\x22\x1f\xbb\xfd\x38\xc1\x8b\x78\x02\x84\x20\xb7\x32\xa6\xbb\x3c\xda\x2e\x39\xfc\x18\x96\x53\xc7\xbc\xc8\xb3\x29\x96\x17\x66\x41\x6a\x14\x6d\xe4\x14\x3a\x4f\x4b\xec\x6d\x5d\x18\x4b\x16\xc6\xed\xb4\x16\xc7\xf2\xa8\x84\xf6\x97\xda\x10\xfa\x50\xd9\x40\x58\x79\x8d\x84\xcd\xa9\xae\xa8\xa0\xa7\x72\xf5\x09\xda\x33\xcf\xec\x61\x80\x23\x4f\x67\xd4\xde\x25\x32\x91\xee\xe8\xcb\x2c\xc5\xd1\x00\xc7\x13\xec\xce\xfd\x05\x64\x3a\xc8\x10\x2d\xa2\x02\xb2\x48\xae\xad\x7c\xa1\x39\x6a\xf4\x95\x20\x3e\x25\x8c\xc3\x5c\xd6\x52\xfa\x53\x22\xca\x2c\xf3\x6d\x5e\x56\x63\x71\xfa\x7a\x42\x35\xf0\xda\x44\x31\x6a\xd8\xc8\xde\xc5\x6a\x84\x8d\x36\x29\xcb\x98\x61\xaf\x6c\x9b\x8a\x1f\xc1\x2c\x12\x2a\x2c\x95\x9d\xd3\x5b\xe6\xd6\x88\xbc\xcc\xf8\x0d\x23\x94\xbc\x0f\x52\xd6\x85\xcc\xb2\x09\x4d\x6e\xe0\x7d\x72\x2e\xd3\x73\x25\xbf\x2e\x7e\x29\xd0\x6c\x82\xdd\xbd\xf2\x04\xbb\x65\xca\x63\xf2\x59\xb3\x78\x6b\x02\x59\xf0\x5a\x43\xbc\x9d\x5c\x13\x59\x98\x63\x2e\x46\x64\xc2\x12\x5a\x6a\x66\xd5\x33\xab\xcd\x28\xbb\xa1\x0b\x60\x37\xed\xd2\x10\x99\x2c\x2c\xe9\x31\x76\xc7\xc1\xa6\xe1\x76\x7d\x0f\x37\x45\x31\x2e\x6e\x65\x02\xe2\x4d\x2f\xdd\x6d\xf9\x05\xc2\x45\x0a\x8a\x71\x74\xba\xe7\x5c\x87\xc9\x54\x42\x5d\x42\x33\xab\x90\xe6\x65\x66\x78\x91\x31\x62\x78\x6e\xe5\x7f\x4d\x0a\xaa\xc0\x4c\x44\x89\xe6\x62\x96\xd5\x54\x5a\x3c\xd7\x20\x7d\xb5\x2a\x7a\x9f\xec\x1c\xaf\x8f\x9c\x90\x7e\x36\xfd\xc4\x58\xca\x52\xa7\xe7\xc1\x8f\x6f\x97\x4d\x21\x4e\x79\xf1\x03\xb2\x64\xca\xcc\xed\x99\x12\x96\x83\x88\x8e\x81\x20\xc7\xc2\x0f\xb5\x74\x5e\x75\x4c\x0d\xc9\x18\x05\xb5\xd2\x76\x95\x02\xa9\xa1\x19\x4c\x3c\x9e\x77\x43\x8b\x0f\x5f\x6a\x90\x82\x09\xb3\x27\xc2\x36\x34\xa0\x26\xe9\x4a\xab\x99\x2c\x08\x8a\x39\x55\x37\x45\x56\xce\xb8\xd0\x84\x4e\x8d\x93\xd2\x80\xd6\xd1\xac\x32\x47\xd1\x2c\x1b\x7b\x93\x9b\xc6\x9b\x84\x3a\xee\xc2\x99\xb3\x60\xdb\xc9\xf7\x79\xa9\xcd\xf7\x76\x5e\x3c\x65\x79\x21\x0d\x13\x66\x44\xe8\xc4\x6e\xa1\x24\x85\x92\x09\xd3\x3a\x30\x64\x33\x67\x0b\x52\x28\x76\xcb\x65\xa9\xb3\x45\x18\xef\x98\x7c\x92\x86\xbd\x25\xdf\xa3\xc4\x58\xe6\x13\x4b\x3b\xa6\xf1\xba\x54\x47\x4b\xfb\x7b\x38\x2b\xa9\xa2\xc2\x30\xbc\x87\x13\x16\xd4\x72\x29\xd8\x98\x7c\x6f\x57\x68\x45\x07\x8a\x69\x7b\x59\xb8\x20\xd3\x52\xc1\xda\xe0\x6a\xf9\xdf\xdd\x2d\xc2\x61\x8f\xfc\xa2\xe0\xb1\x6a\xfd\xb2\xed\xfc\xc6\x13\x58\xfb\xed\xbb\xda\xca\x95\x40\x1c\xaa\x55\xb3\x77\x7c\xc2\x88\x62\xde\x18\x6a\xe9\x08\x17\x3c\xe7\xff\x66\xbd\x96\xc0\x7e\xc2\x48\x6f\x71\x64\x11\xcd\xc3\x2d\xa5\x59\x46\x72\x30\x1e\x83\xc9\x50\xb1\x78\xc8\x89\xb4\x4c\xd7\x52\x54\x3b\x2e\x1a\xec\x96\xee\x00\xd5\xe9\x8d\x93\xbd\x5a\x54\x43\x77\xbb\xb6\xd0\x77\x40\x5d\xee\x20\x26\x17\xb6\x4d\x64\xf0\xbe\x03\xc5\xa1\x32\x65\x83\x96\x41\x4d\xa5\x37\x9f\xe8\x72\x52\x19\xbe\xe3\x9b\x97\x50\x65\x49\xc2\x44\x96\x66\x4c\xae\xda\x7f\x80\x15\xf4\xbd\x3b\x2b\x8f\xa7\x94\xff\x87\x8a\xc5\xff\x21\x17\x60\xd7\xf9\xab\xbc\x63\x60\x4b\xe5\xce\x92\x8d\xc7\x9c\xdd\x5a\x16\xf9\x8f\xb0\x90\xc1\x92\x1d\x6e\x90\xa5\x41\xde\x9c\xbf\xfc\x2b\x18\xec\x8a\xb2\xa2\xeb\x5e\x25\x41\x82\x63\xc0\xb6\x08\xe4\xdb\xb1\x33\x38\x3d\x89\x15\xb7\x58\x8a\x6f\x5b\x49\xcb\x4e\xc4\xef\x6e\xb6\x20\x29\xd7\x74\x92\xf9\x2e\xf1\xd2\x8f\xee\x31\x4a\x38\xfe\xa0\x0f\x39\x22\x26\x63\x2f\x84\xb7\xba\x81\x78\x57\x7d\xc4\x9b\x5a\x6b\xf6\xed\xf8\x3b\xad\x0d\x1c\xc5\xe8\x67\x6e\xde\xde\x0e\x6c\x37\xf5\x9f\xdc\xcc\x7f\x09\x07\xeb\x5e\xc6\x6a\x2b\x16\x7c\x98\x4e\xed\xc8\x3b\x8e\xf7\x65\xd5\x12\xb7\x77\x05\x87\xb4\x22\x9e\xed\x95\x30\x6c\x3c\x26\xa7\x89\x15\xb5\x81\xc2\x56\xcc\xee\x2d\xf9\x24\x05\x1b\xc1\xff\xff\x22\xde\xab\xc5\x45\x29\xc8\xcb\x40\x84\x50\x82\x42\x03\x97\xb7\x10\x59\x1a\x44\x33\x2d\x03\x59\xbf\x94\x39\x58\x7d\x3f\x0b\x70\x20\xbc\x8a\xc8\x3f\xa8\x4a\xf1\x30\xc8\xcf\x9f\x2f\xaf\x08\xb7\x27\xcd\x8a\x4f\x60\x9e\xb2\x4a\x00\xcf\xb8\x73\x60\x2c\xb4\x61\xf9\xc8\xf2\xca\x84\x45\xd6\xab\x40\xf9\xec\xf6\x22\x73\xa2\x64\x5a\x9a\x52\x31\xa2\x0d\x2b\xbc\x5c\x57\x1d\xab\x64\x4e\xc5\x8c\x05\xdf\x56\x6d\x14\x76\xbd\xd8\x54\xc2\xb1\x0c\xb4\xb8\x14\x29\x30\x80\x0b\x7f\x1e\x83\xa2\x97\xe2\xba\x50\x63\x14\x9f\x94\x60\xae\x47\x9e\x4c\x4b\x23\x8f\xc3\x98\x90\xb3\x2e\x82\x65\xb2\xe2\xe0\x6e\x15\xfc\xc6\xfd\xe9\x4f\x7e\xb1\xec\xba\xd9\xf5\xdb\x82\x18\x5a\x86\x2f\x4b\x73\x69\xd7\x2f\xed\x3a\x36\x57\xb5\xc6\x91\x9b\xc8\x4e\xcf\xf5\x54\xb9\x9c\x82\x05\xed\x34\xf0\x79\xdf\xa6\xa0\x5a\x33\x3d\x6a\xd0\xc9\x2c\x0b\x4b\xc2\xc1\x0b\x90\x12\xa9\x82\x1b\xa9\xfa\x1d\xdc\x45\x41\x29\x69\xf1\x12\x01\x99\xf5\xdf\x82\x63\x4a\xac\xa0\x60\x3b\x9e\x30\x73\xc7\x98\x20\x68\x85\xfc\xf1\x35\xd1\x38\x99\x9a\x0c\xfb\xa6\x7a\x5c\x5f\xd1\xa9\x54\x39\x35\x76\x29\xb8\x30\x3f\xfe\xd0\xbe\xdc\x5c\x18\x36\x63\x2a\x5a\xef\xff\xd1\x58\xf7\x23\xe5\x3d\x33\x6f\xc9\x7f\x36\xec\x95\xab\x9c\x4f\x2b\xee\xf9\xa8\xdb\x5d\xea\x5a\xfc\x2b\x7c\xdd\x0f\x14\xa9\x1c\xfe\xee\xc6\xb6\x8d\x07\xb9\x46\x3a\xfb\xbb\x93\xeb\x14\xb7\x62\xb5\xc0\x7f\xea\xd4\x78\x0a\x9b\xb5\x2c\x1d\x80\x74\x43\x81\x22\xd9\x93\x82\x57\x08\xda\xda\x8b\xee\xae\x6e\x25\x4a\xf5\x71\x39\x07\xeb\x78\x97\x97\xf9\xfc\xcc\x35\x0c\x8e\xa2\xc8\x7b\xcb\x52\xa2\x93\x39\xcb\x29\xca\xd0\xdc\xca\x7c\x85\x62\x56\x93\x8d\xa6\x14\x9c\xb2\xe8\x21\xd5\x5e\x21\x71\x46\x73\x12\x79\xd6\xb0\xb7\x20\x1a\x66\x96\x64\x5b\x09\xd2\x30\x65\x65\x33\x38\xe3\xa3\x30\x73\xb7\x10\x35\xdf\x1c\x52\xeb\x31\xf9\xd9\xd2\x2b\x2e\xa6\xf2\x6d\x30\xa9\xcc\xb8\x81\x4d\xe7\xf2\xc4\x79\x13\xcd\xe2\x24\x91\x02\xe9\x94\x54\xfa\x24\x65\xb7\x2c\x3b\xd1\x7c\x76\x4c\x55\x32\xe7\x86\x25\x96\x64\x9e\xd0\x82\x1f\xc3\x60\x05\x8a\x85\x79\xfa\x5d\x90\x81\x36\x27\x45\x37\x5c\xa4\x1d\xab\xfe\x77\x8e\x6a\xbf\x15\x4a\x6c\x47\xee\x72\x87\xc5\xf5\xc2\xc6\xc5\x87\xcb\xab\xca\x79\x13\x39\xc0\xab\xa6\xba\x5a\x76\xbb\x64\x5c\x4c\x3d\xf3\x0b\xee\xcb\xe0\xb4\x44\x91\xc8\x5e\x46\xa2\xcb\x49\xce\x8d\xae\xc4\x0d\x23\xc7\xe4\x5d\x90\x8a\xca\xc2\x0a\xc4\xe9\x98\x9c\x09\xf2\x8e\xe6\x2c\x7b\x47\x35\xdb\xfb\xa2\xdb\xd5\xd5\xc7\x76\xfd\xb6\x58\x76\x6f\xa8\xde\xa1\x31\x0a\x8d\x24\x3f\x33\x43\xd7\x5a\xa2\x2e\x0d\x15\x29\x55\x69\xb0\xd3\xb8\x91\xfc\x71\xdf\xeb\x15\x6c\xf3\xed\x2b\xe2\x05\x97\x8e\xc3\x18\xe4\x13\x38\x90\x1e\x50\x72\x17\x0b\xb3\x20\x4b\x00\xa5\x8e\x0c\xfb\x4d\x5c\xcc\xbe\xa5\xcc\x26\xe0\xa7\xa7\x88\x59\xfb\xe9\xeb\x71\x65\x77\x3d\x2e\xac\x64\x72\x9c\x33\x35\x63\xc7\x37\x6c\x61\x5f\x69\xb0\xae\xf6\x37\x60\x50\x6c\x06\x2f\xc0\xdb\xeb\x58\x64\x83\x49\x85\xe7\xb5\x7e\xc1\xe1\x7a\xec\x88\xee\xb1\x23\x20\x15\x47\xad\xed\x1e\xb4\x85\xe9\xb5\x2e\x14\x9e\xad\xfa\x1c\x5c\x87\x6b\x39\x57\xfd\x8d\xdb\xc0\x3c\x8e\x6e\xdf\x2c\x4f\xef\x5f\x3b\xe5\xb5\x1f\xb9\x36\x5b\xf2\xdb\x8f\x0e\xc2\x50\x9d\xdb\x75\xad\x07\xc6\x79\xd0\x8c\xb3\x8d\x62\x34\x97\xfd\xe3\x46\xdb\xbc\xb2\xdb\x5d\x12\xa2\xfa\x35\xba\x8f\xe2\x3b\x48\x0e\xcf\x45\x72\xb0\xc7\xb4\xbf\xdc\x00\xb4\x2b\x30\xf3\x87\x5c\xab\x8d\x75\x3b\xbc\x4c\x5d\xaa\xd8\xc1\x72\x39\x60\x35\xfb\xe5\x74\x2d\xc6\xb0\xd5\xbc\x6d\xb9\x31\x5e\x6e\x53\x16\x19\x78\xe4\xa2\x1f\x2c\x71\xbf\xf0\xd4\x75\x4c\xce\x80\xf1\x59\x02\x9f\xe7\x4c\xa4\xde\x8d\x76\xc3\x88\x2e\xd1\xdb\x62\xc0\x80\x0d\xf6\x0a\xe8\x8e\x7d\x2d\xa8\xd0\xc1\x96\x0d\x06\xeb\x7e\x2c\x11\xf1\x57\xdd\x1c\x11\xdb\x79\x94\x4f\x80\x92\xe9\x06\x9e\x7a\xc2\x32\x69\xe9\x94\x1c\x93\x17\xdf\xbf\x80\x19\x67\x99\x6b\x0a\x00\x13\xf7\xd4\x11\x2a\xb4\xaf\x64\x4c\xcc\xcc\xdc\x3b\x73\x74\xc6\x93\xca\x1a\x12\x2c\x55\x2d\xd0\xa1\xfd\x83\x6b\x23\x28\x5a\x6f\xa1\xa1\xb6\x48\x35\x80\x76\xd7\x32\xf9\xc6\x4f\x70\xa1\x64\xdb\x95\x68\x5b\xa7\xfa\x75\x00\xcb\x47\xf5\xa4\x6e\xd8\x5c\x72\x41\x1c\x93\x77\x17\x1f\x4e\xaf\x3e\x8c\xc8\xe7\xf3\xf7\xf0\xdf\xf7\x1f\x3e\x7e\xb0\xff\x7d\xf7\xcb\xa7\x4f\x1f\xde\x5d\x11\xa9\xc8\xf7\x60\xde\xb3\xcb\x09\xcb\x24\x75\xed\x0b\x60\xa5\x11\x0b\x6f\x51\xad\x3e\x56\x1b\x05\x45\x14\x30\x4d\x53\x60\x77\x4f\x6d\x33\x2a\x41\xad\xc3\x85\x14\xce\x63\x4d\xce\x8e\x9d\x44\x96\x0e\x95\x19\x8b\xa3\x22\x1a\xc0\xae\xb7\xe4\x45\x21\x53\xfd\x82\xe4\x8c\x0a\x4d\xec\xbf\xc7\xf8\xe8\x24\x93\x33\xff\x18\x16\x4c\xce\x48\xe4\x83\x82\xd8\x06\x6c\xfd\xbd\x6f\x66\xb7\x2d\x7c\x1e\x51\xbc\x56\xf8\x88\x3d\x57\xbe\xf3\xda\x3b\x35\xd7\x56\xd4\xef\x89\x4e\x68\xc6\x6a\x2d\xed\x83\x66\x87\xdf\x9f\xb4\x8f\xc0\x6b\xc8\x5c\xd5\xdf\x70\xb0\xab\x3b\x9e\xa5\x89\xe5\xf2\xcd\xa3\x11\x05\x3a\xc0\xea\x81\x4d\x98\x09\xa0\xde\x55\xe7\xa9\x84\xc9\xc9\x5b\xa6\x32\x5a\xa0\xf5\x9c\xd1\x64\x8e\xde\x68\xe7\x50\x2c\x98\x48\xad\xe4\xe7\xcc\xc8\x4c\x24\x99\xd4\xf0\xc0\xf9\x5e\x6b\x53\xcf\xf9\x6c\x6e\xbc\x87\xde\x41\xd7\x1f\xf1\x20\x02\x5e\xb0\xe3\x10\x42\x9b\x86\xa1\x1e\x9f\x05\xfd\x0a\x1c\x8b\xe0\x30\xab\xc3\x17\xde\xa1\x0f\xf0\xfa\x68\x44\xae\x2b\x74\x66\x6a\xff\x46\x44\xc3\xf7\xd7\x47\x71\xb3\x70\x16\xa9\x03\xab\x3b\x27\xe2\x71\x03\xd7\xa8\x71\xc3\xd0\xbd\x11\x0d\x21\x7c\x02\x48\xbb\xf7\xd9\xdb\xb1\xd4\x3b\x1a\x37\x86\xb3\xf4\xdd\x00\x7e\xeb\xfe\x26\x4e\x22\xea\x00\x5c\x3a\xce\xd1\xee\x16\x4a\x31\xbb\x57\x89\x73\x7c\x5f\xd6\x0e\x84\xeb\xaf\xb6\xa6\xf6\x3c\x17\x54\x59\x91\xdf\xb7\xac\x9c\x0b\x5c\xe3\x37\xfb\x7a\x6a\xba\xcc\x22\x1b\x4b\x59\x56\x73\xe1\x09\xbb\x60\x53\xa6\x98\x48\xd8\x1a\x19\xab\xd9\x94\xcc\x65\x96\x22\x2a\xde\x3f\x31\x92\xb8\x56\xe3\x8c\xcd\x68\xb2\x68\x0a\x98\x2b\x85\xa3\x1e\xd8\xec\x2f\xb6\xcd\x97\x36\xe8\xb3\x76\xdf\xac\x22\x5c\xb6\x07\x3d\xf7\x19\x04\x34\xac\x8d\x04\x0f\xea\xee\x86\x53\x50\x33\xef\x1a\x89\x6d\xf3\xc5\x87\xb1\x15\x0e\x95\xf1\xf9\xe2\x23\xb1\x3f\x38\xff\xbc\xf7\x9f\x01\x66\x8e\x23\x1e\x35\x82\xee\xc3\xd1\xf7\xc3\xdd\x62\x94\x52\x99\x8e\x51\x9e\x4d\xab\x60\x14\x24\xd7\xf6\x25\x4f\x60\xdd\xa7\xf1\xae\xcd\xa5\x06\xb5\x3b\xf8\x09\x23\x0f\xdc\x6f\x7f\xfb\x23\x48\x1a\x13\x9a\xdc\xdc\x59\x26\x90\xc8\xbc\xa0\x86\x4f\x78\xc6\xcd\x62\x4c\xbe\xd8\x5e\xbf\x44\x08\x2e\x87\x23\xc1\xaf\x39\xfc\xca\xcb\x37\xc7\xbf\xff\xdd\xef\x7e\xfc\xdd\x08\x83\x22\x34\xbf\x65\xaf\x1e\xdc\xa1\x87\x87\xac\x19\x95\xd0\xa5\x08\x6e\x7c\xaf\x97\x10\x0f\x6b\x2e\xf6\x52\xdb\x21\xb2\x73\x88\xec\x1c\x22\x3b\xab\xd7\x87\xc8\xce\x21\xb2\x73\x88\xec\x3c\xbc\x80\xc2\x21\xb2\xf3\x40\x36\x62\x88\xec\x1c\x22\x3b\x87\xc8\xce\x21\xb2\x73\x88\xec\x1c\x22\x3b\x0f\x26\xb2\x73\x08\xec\x1c\x02\x3b\x87\xc0\xce\xc3\x0f\xec\x1c\xc2\xaf\x86\xf0\xab\x21\xfc\x6a\x08\xbf\x1a\xc2\xaf\x86\xf0\xab\x21\xfc\x6a\x07\xae\x9e\xbe\x01\x58\x1d\x64\x79\xc7\x21\x58\x4e\x62\x09\x9c\xc9\xde\x64\xd0\xaa\x87\x38\xac\xc3\x86\x93\x0f\x68\xea\xe7\x82\xa6\x1e\xe2\xb0\x0e\x29\x0e\x6b\xd9\x45\xdf\x53\xda\x1c\x22\xb1\x02\x46\xbd\x83\xf7\xed\x17\xa1\xbe\xfe\xe3\x1d\xd1\x58\xdd\x2f\xd7\xcf\xef\xfa\xf6\x03\x0b\x3d\x68\x16\xba\x49\x44\x56\xdf\x8d\x5e\xd9\xf1\x6e\x89\xd2\x10\x95\x35\xc8\x11\x43\x54\xd6\x53\xe1\x78\x0f\x10\x97\xd5\x06\x69\x5a\xcd\xe6\x5a\x5a\x5b\x26\x60\x28\x77\x68\x3b\x7b\x12\xac\x16\x6f\x59\x87\x0f\xbc\xa2\xe4\xea\xe3\xa5\x6d\x26\x58\xe2\x60\x6e\xce\x68\xe3\xa4\xb8\x6e\x6e\x97\xd0\x3f\x97\x22\xcd\x3a\xe1\xbc\xbe\x1d\x02\x69\xc9\xf9\x87\x9f\x09\x13\x89\x4c\x59\x4a\xde\x9d\x92\x09\xfc\xd6\xc0\xd2\x7a\x30\x50\x48\x77\x16\x0d\xec\x85\xf6\x48\xc1\xc4\x8e\x0a\x72\xb8\x31\xf0\x08\x97\x22\xc2\xc1\xa2\x41\x8c\x18\x55\x6a\x43\x94\x94\x46\x7b\xd3\x89\xbd\x67\xd8\x01\x55\xf8\xa9\x95\x36\x8f\xc9\xc2\xb0\xcd\xc9\x81\x83\xdc\xee\x0e\xe2\xb6\x84\x20\x5f\x47\x14\xbe\xb8\xcf\xbb\xe5\xae\x21\xc7\x63\x40\xf0\xb2\xd5\xea\x03\x7a\x7a\xaa\x0e\xa4\x22\x5f\x4a\x95\x7d\x09\xb6\xa4\xb0\xbe\x3e\x62\xa4\xe1\x0b\x51\xa5\x10\x80\x2f\xe6\x66\xee\xdd\x3a\x68\x58\x07\xcb\x97\x00\x9f\xab\x93\x53\x4a\xcd\xaa\x4f\xad\x50\x47\x4a\x95\x75\x9d\x2e\x18\xdf\x8c\xdf\x32\x1f\x93\x93\x04\x19\xa9\xe6\xe4\xe2\x82\x68\x4f\x2e\x3f\x5f\x7c\xb4\xd3\xcf\xc9\xcb\x2f\x20\x1a\xb1\xb7\x27\x27\x73\xa9\xcd\xdb\x42\x2a\x73\x02\xa0\xef\x57\x63\xc4\x8e\x61\x72\x41\xdb\x1b\x7e\x49\xc6\xeb\xd3\xbe\x2c\x57\x73\x46\xbe\xd8\xee\x02\x58\xda\x72\x36\xd8\x07\x00\xee\x84\x1d\xf0\xab\x55\x5f\xa9\x3f\xba\xe4\x81\xd1\xea\x90\x29\x67\x59\x1a\x32\xf3\x81\xb1\xcf\x7e\xc0\x85\xc7\x4c\x10\x26\x9c\xdd\x3a\x8b\x33\xfb\xea\x04\xbb\xf7\x9f\x2e\x61\xde\x32\x8f\x4e\xbd\x26\x2f\x11\x65\xf3\xc5\x52\xd6\xe3\xf0\xfc\x8b\x77\x75\xb8\xbe\x08\x17\xc7\xde\x2b\x62\x3b\xa2\xba\xe1\x4b\xa4\x24\xa3\x0b\x86\x32\x04\x97\x19\x2c\xfb\xab\xb1\x9f\x7a\x30\x77\x4f\x20\x59\xe1\xd9\x39\xa1\x69\xaa\x98\x46\x77\xf0\x79\xc6\xa8\x86\xd4\x8a\xcc\x27\x4c\xb4\xfd\x7c\xb1\xdb\x97\x61\x07\x76\xa5\xdf\xfc\xf0\x1f\xe3\xd7\xe3\xd7\xe3\x37\x5f\xec\xe7\xa9\xef\xdb\x9e\x34\xae\x6f\x16\xa4\x14\x19\xd3\x1a\x4e\x95\xb1\x54\x6d\xa6\x18\xf8\x09\x15\xab\x7c\xaf\x91\x71\x5f\x0a\x08\x87\xb2\x9d\x68\x47\x71\x6c\x1b\x2a\x22\x9a\xe0\x5c\x6b\x18\x77\xc4\xa2\x50\xd5\x08\x71\x1b\x5f\x9a\xcb\x12\xe0\x8a\xda\xc0\xcf\xf6\xcb\x19\xbf\x61\xd9\xc2\x19\xc7\x85\x14\xc7\xf6\x54\xd1\x09\x80\xd6\xc6\x6c\x3c\x82\xe3\xc0\xa8\x86\x26\xa6\x54\x82\x94\x05\xfa\x9d\x04\xbb\xf3\xa7\x20\x9c\x24\x3c\xa0\xe1\xa8\x5d\x1f\x01\x47\xbf\x3e\xfa\x23\x1c\x11\x7b\x92\xdd\x4f\x33\x2e\x3c\xe8\xc4\x33\x7d\x07\x83\x3c\xc5\x70\x85\x90\x8d\x92\x66\xce\xe7\x3b\xf5\x51\x5e\xde\x4d\x40\xc5\xc2\x8b\x85\x05\x53\x40\x8d\x26\x99\x4b\x82\xfa\xf9\xe2\xe3\x98\xfc\x6f\x59\x42\x5b\x7f\x44\xa1\x63\x23\xc1\xbc\x0d\xeb\xa8\x26\xdc\x28\xaa\x42\x37\x4d\x5f\xf3\x34\xc6\xd9\xd0\xca\xed\x96\x5a\xf9\x62\xca\xdd\xc4\x4f\x8d\x61\x79\x61\x5c\x07\x98\xb4\xb2\xd4\x4c\x11\x88\x4f\xd0\x3c\x21\xb4\x34\x73\x40\x8b\x91\xeb\x23\xfb\xcb\x5b\x3b\x82\x3b\xa9\xd2\xff\x07\xe1\x60\x80\xc6\xf1\xf1\x62\x3f\x29\x3a\x43\x98\xe0\xcb\xeb\xa3\xef\xc6\xe3\xf1\xf5\xd1\x2b\x58\x81\x5f\x4b\xa6\x16\xa4\xa0\x8a\xe6\xcc\xc0\xd5\xb8\x3e\xfa\xbf\xfd\xef\x2e\xf5\xa7\xeb\x65\xe4\x1c\xe1\x8f\x15\x46\x04\x4e\xa4\xa1\x92\xd4\x10\x6f\xf0\x74\xe3\x0d\x62\x87\xd3\x97\xff\x7c\xe1\xce\xf4\x8b\x7f\x7d\x79\x1e\x91\x08\x78\x43\x87\x70\x84\xed\xc2\x11\xf0\xb7\x21\x20\x61\x08\x48\x18\x02\x12\xbe\x95\x80\x04\xbc\x2b\x43\x2c\xc2\x10\x8b\x30\xc4\x22\x0c\xb1\x08\xfe\xd7\x21\x16\x61\x88\x45\x18\xaa\x4c\x0d\xc1\x08\x43\x30\xc2\xf3\x0c\x46\x18\xaa\x4c\x0d\x55\xa6\x86\x2a\x53\x43\x95\xa9\xa1\xca\xd4\x10\xe6\xf4\x3c\xc3\x9c\xd0\x12\xfc\x7c\x62\x9d\x5c\xd0\xcd\xc8\x05\x3d\x5d\xca\xbc\x19\xfa\x34\x44\x2e\x6d\x1c\xb9\x54\xb3\x7e\xbb\x1f\x87\x70\xa6\xdd\x84\x33\xfd\x78\x80\xe1\x4c\x5d\x90\xb7\x9d\x38\x84\x9f\x4e\x61\x28\xab\x25\x29\x96\x50\x67\x78\xbf\x7d\x33\x7e\xf3\xfb\x11\x29\x32\x2a\x84\x65\x3d\xd0\x45\x2e\x6f\x41\x3e\x81\x5f\xff\x27\x2a\x43\xeb\xe0\x7c\x27\xb7\x6f\xd6\x93\x7f\x2f\x75\x0c\x50\xee\x43\x86\x72\x0f\x28\xe6\xe7\x82\x62\x1e\xa2\xa1\x0e\x28\x1a\xaa\x1d\x41\xd4\x53\x24\x1d\x02\xa2\xee\x5b\x9a\x0a\x96\x7f\x07\xe8\xf0\x6e\xbe\x3f\x14\xa9\x1a\xf8\xe8\xa6\x21\x51\x8f\x58\xa4\xaa\x87\x20\x7b\x1f\xbd\x79\x90\x26\x9e\x8b\x34\x31\xc4\x44\xe1\xf3\x43\x63\x7a\x1d\x11\x51\xbb\x65\x7c\x43\xcd\xaa\xa1\x66\xd5\x9a\x25\x1a\x6a\x56\x0d\x35\xab\x0e\x62\x33\x86\x9a\x55\x43\xcd\xaa\xa1\x66\xd5\x50\xb3\xea\x49\xd6\xac\x42\x51\x6b\x28\x5c\x55\x7d\x7f\x28\x5c\xb5\xe9\x28\x87\xc2\x55\x2b\xee\xe6\x63\x17\xae\xc2\xcb\x3d\x54\xaf\x1a\xa2\x49\x87\x68\xd2\x21\x9a\x74\x88\x26\x1d\xa2\x49\x87\x68\xd2\x21\x9a\x74\x88\x26\x5d\x73\xd7\x87\x68\xd2\x21\x9a\x74\x88\x26\x1d\xa2\x49\xe1\x7f\x43\x34\xe9\x37\x10\x4d\x3a\x04\x93\x0e\xc1\xa4\x43\x30\xe9\xe1\x07\x93\x0e\x21\x5f\x43\xc8\xd7\x10\xf2\x35\x84\x7c\x0d\x21\x5f\x2b\x4e\xc6\x10\xf2\xf5\xdc\x42\xbe\x9e\x7e\x31\xaa\x7d\xc5\x7e\x75\x4c\x70\x88\xfe\x7a\x0a\xa8\xf5\x01\xaf\xfd\x5c\xf0\xda\x43\xf4\xd7\xc1\x45\x7f\x0d\x05\xb1\xdc\x8b\x8f\x51\x10\x6b\xb7\x40\xf8\xa1\x34\xd6\xc0\x51\x9f\x59\x69\xac\x5e\xf2\xed\x7d\x14\xea\x41\xb6\x78\x2e\xb2\xc5\x10\x0b\x86\xcf\x0f\x8f\x01\x3e\x68\x34\xd8\x50\x29\x6b\xa8\x94\xd5\x8d\x5b\x5f\x47\x23\x86\x72\x59\x66\x28\x97\x35\x94\xcb\x1a\xca\x65\x0d\xe5\xb2\x9e\x64\xb9\xac\xa2\xd0\x56\x1e\x7c\x67\x45\x35\x99\x65\x4c\x5d\xb0\x5b\xae\xd7\x1b\xc2\x97\x1b\x57\xde\x2a\xd8\x17\x9e\xe7\x25\xfa\xc4\xb4\xa0\x85\x9e\x4b\xd0\x8d\xd0\x79\x8a\x22\x24\xca\x10\x78\x82\x15\xd3\x85\x14\xb8\xf7\x76\xc3\x34\x53\x9c\x66\xfc\xdf\x90\xf9\x54\xa4\x24\x65\xf1\x93\xca\x01\xef\x28\x84\x93\x40\x5c\x4c\x58\x50\x3d\xe1\x6b\x63\xf2\x0b\xba\xc8\x5a\x86\x3c\xa7\x9a\x4c\x18\x13\x44\x97\x49\xc2\xb4\x46\xc8\x21\x02\x11\x52\x80\x85\x25\x54\x90\xa6\xd6\x70\x55\x83\xe2\x47\xce\x99\x28\x68\xc0\x2a\xd1\x10\x82\xe9\x15\x10\x30\xf2\xe3\x21\x83\x0b\x5e\x1a\x2f\x6a\xbc\xa7\x86\x22\xbd\x1d\xb7\x8c\x11\x14\x9f\x11\x99\x7b\x57\xf7\x84\x39\x10\x84\x4b\xcd\x0b\x3d\x8f\x48\x5a\x02\x01\xb2\x4a\x8f\x3d\xbc\x93\x45\x05\xfe\x78\x4f\x59\x2e\xc5\x25\x43\x9f\xc2\xa5\xfd\xee\xb4\xcc\xec\xdf\x49\xf8\x1a\xfa\x89\x71\x86\xd0\x4c\x39\xa4\xc4\xa8\xa6\x97\x71\xbb\x5c\x76\xef\x2a\xcf\x7b\xb8\xc9\x51\xa8\x01\x80\x27\xa1\x97\xba\x65\x01\x5d\x8d\x1a\xb3\xfb\x1a\x8c\x22\x05\xb2\xac\x91\x3c\x24\xee\x44\x44\x4c\x2c\x85\xc8\x51\xc0\xc4\xa0\x5f\xd6\x87\x24\x61\x72\x81\x42\xf1\x9c\x2a\x9e\x2d\x60\xfc\x61\xe3\xdd\x12\x44\xf3\x1b\xec\x2b\x07\x6d\x5f\xb9\xbf\x6a\xab\x4a\x61\x78\xce\xc6\x17\xf4\xee\x83\x47\x48\xaf\x95\x5a\xe1\xda\x71\x0f\x56\x42\xe2\xc2\x96\x8e\xac\x8f\x39\x04\x4a\x32\x58\x44\x9e\xb7\x45\x64\x3b\x6f\xcb\x0b\xfd\x70\x76\x91\x30\xe9\xd6\x25\x51\xcb\x7c\xbb\x6d\xfc\x15\xc7\x0e\x35\x00\x30\xd2\xd0\x3d\x8e\xcf\x7c\x75\xf0\x10\x4c\xf2\x1e\x9c\x3d\xab\xd1\x01\xbf\xff\xed\x8e\xd1\x01\x61\x4e\x0f\x69\xcf\x29\x0a\xdd\x6e\xb7\x69\x91\x91\x56\xdb\x69\x36\x31\xd1\xac\x94\xc1\x3a\xbc\x10\xed\x2f\x78\x45\xdc\x11\x12\x27\x1e\x81\x30\x15\xfc\x11\x2d\xe2\xd0\x12\xce\x6b\xe0\x95\x07\xc8\x2b\xfb\xf8\x22\xce\x6c\x1b\xcf\xdd\x56\xef\xb8\xde\x91\x33\x62\xb5\x06\x31\xb8\x1a\x06\xc6\xda\xd3\xd5\xf0\xf0\xac\xf3\x60\xfd\x09\x1b\xf0\x9f\x0e\x5f\xc1\x16\x3c\x28\xe8\x8b\x6b\xd8\x4e\xa5\x53\x56\xf7\x67\x05\xe6\x8d\xa4\xd0\x96\x68\x66\x06\xc6\x72\xd0\x8c\x65\xa0\xb7\xcf\x85\xde\x3e\x75\x45\x46\x17\x2c\xd9\xdc\xa3\xd5\xa4\x5f\x97\xb6\x97\x75\xf3\xbf\x9a\x33\x92\x32\x6d\x29\x3e\x99\xb0\x39\xbd\xe5\x52\x05\x82\x11\x91\xad\x7d\x2f\x86\x9d\xee\x31\x15\xe9\xb1\x55\xb9\x4a\xbd\x62\x4d\xf0\xb7\xfb\xaf\x0a\xf6\xd3\xb5\x2e\x49\xa9\x20\xb3\x16\x7e\xb6\x75\x55\xae\xf0\x81\xa1\xde\x04\x28\x4b\x90\x33\xc1\x88\x38\x59\xa0\x17\xe8\x8e\x8b\x54\xde\xc1\xfb\x3c\x67\x63\x72\x2e\x8b\x32\xa3\x4e\x9b\x04\x35\x13\x7c\xa7\x63\x72\xc1\x68\x7a\x2c\x45\xb6\x78\xc4\xe5\xee\x32\xa1\x3f\x08\x8f\xaf\xf8\xef\x7e\xd8\xfa\x3b\x29\xb0\x70\x59\x1f\xfe\x1e\x1a\x37\xb0\xed\x68\x1c\x00\xfe\x1e\xd9\x97\x0d\xa1\xe0\x28\xa7\x5c\x10\xa0\xdc\x3d\x38\x7e\x46\xb5\xb9\x52\x54\x68\xf8\xcc\x15\x5f\xce\x24\x70\x0f\x42\x08\xdd\xad\x3b\xea\x1f\xa9\x36\x58\xd9\xcf\x49\x2f\x6e\xb6\x26\x8c\xc8\x87\x74\x49\xc1\xfc\x65\x30\xd2\x87\x94\xaf\x30\x09\xe6\x4c\x6b\x3a\xeb\x02\x2b\x9c\x92\x79\x99\x53\x41\x14\xa3\x29\x78\x4a\xdc\x6b\xde\x2e\x63\x99\x69\xca\x0c\xe5\x99\x8f\x8b\x83\x60\x92\x30\xb2\x6d\xea\xbb\x31\xaa\x3b\x45\xab\x2b\x30\x06\xd9\x86\xce\x65\x1f\x2d\xcc\x0b\x4d\x32\x58\xb2\xfb\x8c\xa2\x9d\x94\x2d\x33\xa7\x40\x78\xa2\x01\x8c\xbc\x77\xfc\x4a\x59\x89\xeb\x27\x9a\x69\x36\xba\x4f\x24\xd0\xa2\x33\xb5\xe3\xd5\x02\x33\x0e\x56\x07\x3d\x8c\x66\x6b\xdf\x5c\xbb\xa6\x01\xef\x2f\x2f\x54\x97\xea\xd1\xfb\xea\x77\x18\x93\x6a\xed\x50\xcc\x4b\xac\xb2\x91\x78\x91\xb9\xa2\xfe\x83\x91\xe8\xb0\x65\xf9\x3e\x46\xa2\xd3\x60\x19\x6a\xdd\xd7\x95\xfd\x6c\x25\x76\x0c\x96\xa0\x41\x33\x39\x70\xd0\xe9\xb3\xb0\x10\xd5\x69\xfd\x7e\x24\xc8\xcb\xba\x7a\xb6\x92\x8d\xd8\x76\xc1\xc5\x8a\x88\xb5\x64\x5b\xc3\x50\xce\x85\xd5\x10\x16\x3d\x43\x76\xe7\x0c\xcb\xf6\x96\x79\x54\xb1\xd7\x45\xb7\x82\x54\x83\xa8\x2b\x40\x40\x55\x90\x8f\x88\xc5\x17\x32\x8d\x72\x51\x59\x11\x6d\x11\x02\x31\x21\xf7\xcc\x14\x10\x09\xce\xb5\xc2\x14\x49\x14\xd5\x73\x2e\x66\x88\x38\xe2\xc6\xc1\xb1\xa2\x2c\x12\xf4\x96\xf2\xcc\x0a\x7a\xf5\x28\xe6\xd7\xe4\xa5\xfd\x58\xa8\x42\xdd\xf2\x02\xa1\x9a\x68\x29\x85\xfd\x2f\x77\x55\x15\x68\xba\xd8\x51\x7a\xd5\x16\x0f\xe2\x5f\xb9\x36\x52\x2d\x3e\xf2\x9c\x77\xa5\xa0\xbd\xaa\x15\x45\x96\x59\x4a\xe6\xf8\x32\x00\xe2\x18\xe2\x72\x24\x82\x9a\x02\xac\xc4\x29\x8f\x40\xaf\x81\x90\x22\x52\x31\xe5\x90\xa3\xb6\xe4\x7a\x1e\x42\x96\xd9\xd7\x22\xe3\x09\x37\xe4\xdf\x4c\x49\xcc\x5f\x22\x4d\x04\x80\xac\xad\xe5\x9b\xd7\x3b\x5f\x12\xfd\x98\x39\x64\x4e\x5d\xbe\x1c\x84\x8d\xc9\x5b\xa6\x20\x27\x7c\x95\xdb\x3f\xa7\x82\xce\x2a\x65\xba\x66\xb4\x28\xb5\x09\xc9\x12\xab\xfc\x18\x78\xc4\xd0\x8a\x9c\x02\x8e\x26\xaf\x1a\x62\x06\xe1\x94\x18\x96\x17\x56\x2e\x02\x71\x1f\x53\x8f\xb4\x10\xdf\xfb\x66\x08\x3a\xf9\x0e\xfe\x7b\x1c\xb2\x01\xad\x10\xd1\xdd\x60\x36\xb6\x7d\x24\x52\x31\xbb\xde\xe7\x32\xbd\x72\x7d\x74\xda\x84\x4e\xeb\x69\x65\xea\x5a\x2f\x2c\x0d\x40\x52\xfd\x65\x45\xba\x81\x98\xb0\x8a\x78\xc0\xcf\xf8\x5b\x5c\xfa\x9c\x24\xb2\x58\x04\x29\xd6\x76\x06\x85\xe3\xed\xd6\x0a\x99\x3a\x5c\x6a\x9c\x44\x27\xda\x06\x68\x10\xd2\xcd\xbc\x84\x94\x33\xf1\xbb\x7c\x4a\x84\x6c\xb4\xe2\x51\xde\xdb\x57\x1b\xef\xa0\xdd\xb8\x4c\xd2\x54\x9f\x44\x38\xaa\x13\xc5\xec\x75\x04\x2a\x5e\x3d\xfe\xae\x90\xe9\x71\xd8\xa6\xd6\x4d\x44\xf1\xe7\xb2\x8a\x58\xbc\xa7\x19\xeb\x73\xbd\xbf\x8e\x2d\x75\xc8\x36\x1f\x30\x89\xa4\xa9\xc8\x68\x62\xf7\x07\x89\x4e\x9d\xf6\xbb\xac\x16\x82\xdd\x61\x11\x86\xcd\x65\x02\xbd\x7c\xbf\x8f\x9a\x4b\x74\x7f\x8d\xee\xb2\xa9\x4a\xaf\x66\xc6\xa8\x4f\x37\xfd\x35\x4b\x66\xbe\x0d\xf9\xb2\x55\x10\x81\x65\xbc\x93\xa5\xe8\xe2\x15\xd0\xc6\x7e\x64\x4e\xf5\x9c\x84\x57\x75\xb0\x33\x84\xd1\x36\x6f\x54\x75\xd6\x48\xa9\x7d\x49\x0f\x04\xa9\x53\xaf\xa7\x22\x88\x81\xde\x4a\x9e\x52\x91\x30\x92\xb3\x64\x4e\x05\xd7\x39\xb9\x9b\x33\x81\x49\xfe\x58\x0a\x7c\xc2\xdd\xcd\x90\xe9\xd1\x7f\x5f\xb0\x3b\xab\x0b\x2e\xbb\xd9\x76\xce\x56\x82\x09\xa1\xbb\xba\x49\x6d\xc3\x9c\xb6\x5a\x89\x06\x72\xa2\x99\xba\xf5\x89\x98\x6a\x06\xb9\x17\xba\xb6\xbf\xcd\x64\xbe\x3b\xd3\xed\x2a\x8b\x62\x4f\x25\xaf\x2b\xb0\xb9\x16\x0a\xdd\x30\x8a\x6c\x1e\x0a\x1d\xaf\x3a\x2e\xc7\x27\x90\x57\x2e\x93\x39\x4b\xcb\x8c\x75\xa9\x96\x75\x09\xc7\x92\xd8\x88\x01\xfb\x90\x0a\x6a\x48\xc6\xa8\x36\xe4\x8d\xbf\x3f\x96\xbe\x43\xc6\x0f\xc5\x30\xcf\xb8\x8b\x33\xf2\x59\xdf\xaa\x66\x3b\x22\xcd\xd8\xa1\x66\xe6\x64\xd7\x87\xd5\x39\x49\x36\x5f\x36\x23\x0d\xcd\xda\x17\x2f\x12\xae\xdd\x12\xd6\x17\x85\xbc\xc4\xdc\xba\xf6\x17\x7c\x2d\x91\x4a\x31\xe0\xa5\xed\x6f\xec\x8a\xc5\xed\x6f\x1d\x71\x21\x4e\xfd\xdd\xdd\xf6\xdc\x75\x2e\x9d\x3d\x76\x90\x09\x0f\x6c\xa5\x2e\x0b\xa3\xb3\xa4\x46\xcd\xc2\xd9\x15\xb1\xae\xf1\x12\x95\x1d\x28\x3f\xe5\x0f\xb5\x15\x23\xc6\x0d\x15\xec\xd5\x7e\x56\xe7\x67\xae\xf5\x2e\x2f\x66\x7d\xce\x98\x4d\xdb\x47\x5a\x3c\xf1\x6b\x89\x73\x87\x3d\x39\xa4\xa3\x04\xe7\x67\xe7\x0c\x13\x87\xff\x59\xd0\x87\xbb\x3d\x71\x25\x89\xc3\xbd\x36\x28\x00\xb0\xf4\x2f\x4c\xb0\xa5\x04\x56\xab\x56\x26\x97\x1a\x6c\xe2\x56\x36\x98\x85\x17\x89\xef\x6b\x59\x9f\x8c\x24\xb0\xdd\xe0\x7f\x97\x74\x83\xdd\xb2\x97\x98\x04\xb8\xfe\xa3\x3d\x7c\xc8\xfc\x66\x2b\x64\x8e\xf5\x84\xaf\x9b\xf9\xae\xa0\x03\x3b\xd3\x2c\x3e\xaf\x52\xd8\x56\x6a\x18\xf5\x37\x82\x31\xbe\x4c\x4c\x88\xb1\x76\x87\x08\xce\x56\x53\x27\x83\x9b\x13\x69\x00\xdd\xba\x87\x3d\x8e\x5c\xcc\xf0\xbb\x5b\xab\x94\x17\x71\x2f\x2b\x9c\xef\x4d\x99\x1c\x5f\xf1\x53\x40\xd0\x1b\x46\xf5\xe9\x31\x39\x77\x21\x8e\x21\x27\xec\xa2\x60\xe4\x4f\xe4\xfa\xa8\xf6\xa5\xeb\xa3\x15\xce\xe3\x0d\x3c\x92\xd1\xf5\xc4\xa1\x80\xc3\x01\xa3\x36\x1b\x1f\xc3\x0c\xd7\xbf\x88\xf7\x10\x3c\x76\x7d\x54\xab\x94\x56\x6b\xfb\x50\xf1\x86\x55\x5a\xde\x75\x87\x2b\x34\x22\x4c\x58\x3a\xab\x49\xca\x92\x8c\x5a\x7a\x75\xeb\xcf\x10\xea\x8f\xe7\x56\x6b\xc7\x12\xb4\x60\xa2\xb8\x1c\xbc\x94\x87\xee\xa5\x1c\xfc\x7a\xcf\xc5\xaf\x77\xcf\x44\x75\x2b\x48\xe1\xfd\x70\x80\x81\x74\x74\x1a\x7d\x2f\x9b\xce\x29\xb3\x12\x19\xc8\xa2\x74\xe2\xab\x46\x7d\x4f\xa4\x5e\x35\xee\x6e\xa8\xde\xcf\x95\x1c\x97\x2d\x2a\xf1\x4d\xd7\xc0\x33\xed\x23\xee\xa2\xdf\x0f\xe3\xae\xac\x98\xc0\x6e\x7d\x95\xa1\xdf\x5e\x70\xb7\xe5\xd6\xab\xf1\x6e\x55\xb9\x9e\x01\xf0\x16\xcf\x09\xa5\x87\x87\x9e\xcf\x15\xf0\xc6\x6a\x4e\x58\xab\xc0\x4d\xea\x8e\xea\x40\x9f\x07\xa4\xde\xb7\x83\xd4\x8b\xae\xe8\x53\x83\xea\x85\x91\x77\x61\xf5\x6a\x0d\xeb\xa9\x26\xab\xdf\x06\x01\xf8\xb0\x05\xe0\xad\x63\x39\x5b\xb7\x78\x65\x97\xdb\x89\x1f\x03\x64\x6f\x10\xed\xef\x09\xd9\x7b\xda\x50\xba\x3a\x2d\xde\x93\x7c\xda\x05\xa6\xab\x35\x5c\x89\xa6\xeb\xab\xb0\xec\x18\x67\xf7\xf3\x16\x18\xbb\x27\x81\xac\xdb\xb5\x91\xbe\xa0\xa5\xee\x34\x69\x9f\x45\xf9\x38\xa8\x71\x7b\x1a\x24\x19\xae\x09\xf6\xb2\x42\x92\x99\x48\x99\x31\x2a\x56\x7c\x5f\xc9\x99\x62\x5a\xbf\x67\x34\xcd\xb8\x60\x1b\xc0\x28\xe9\x57\xd8\x62\x90\xaf\xb9\xa8\x6d\x70\x4d\x19\xf2\x69\xeb\xfc\xa7\xc8\x04\x4b\xc7\xe0\xb2\xd6\xab\x69\x4d\xb0\x78\x89\x47\x4e\xd5\xe5\x35\x0f\xf4\x40\x14\x95\xb4\x8c\x00\xb3\x5b\x15\x4a\x26\xb6\x63\x7c\xb5\x56\xdd\x15\x7c\x31\xb1\xe4\xcf\x8d\x3d\x79\xe7\x8d\x69\x7f\xf8\x9a\x30\x96\x42\x9a\x1f\x90\x9a\x43\x01\xff\x52\x4d\x69\xe2\xab\x83\xd7\x06\x84\x82\x5d\x94\x6c\xab\x9a\x20\xbc\xed\x78\x05\xd3\x86\xe7\xe8\x65\x28\x95\xe7\x5c\xb0\x66\xb4\x7d\x13\x6b\x27\xf5\xf7\xaf\x5f\xef\xa8\xe8\x4a\x4d\x85\x00\x3b\x68\xd7\x26\x7f\x0a\x77\xd7\x13\x10\x40\x3c\xed\x0b\xa1\x79\x98\x98\xd5\xc8\x66\x3c\xe0\x56\xef\x8f\x5b\xfd\x58\xab\xf2\x08\xb4\x02\x0f\xd5\x07\x8f\xb6\x8b\x17\x1c\xeb\x77\x02\xea\x0e\xc0\x32\xf0\x9a\x77\x42\x72\x1d\x6e\x29\xe4\xfd\xb3\x6a\x47\xa8\x04\xe1\x5b\x54\x37\xac\x3f\xa2\x75\x95\xc6\x7b\x5f\x84\x62\x64\xbe\xeb\x01\x4e\xbc\x6a\x52\x9b\x0a\xa1\x08\x29\x2f\x5b\x80\x8a\x75\x78\xa2\x5d\x90\xf1\x46\xf8\x28\x3c\xdc\x7f\x67\x8b\x43\xc0\xdb\xfa\x86\xcb\x48\x5b\xdd\x0e\xb5\x3d\x34\x24\x66\xd3\x5a\xdb\x4b\x94\x43\x8b\x89\x13\xe6\xf2\x4d\x6d\xb8\xdd\x2a\xbd\x17\x6f\x2e\xfa\xb1\x80\xab\x86\x1f\xbd\x12\x8f\x60\x1f\xda\xa0\x0d\x4d\x54\x03\x31\x54\xcd\xd8\x8a\x3b\xb9\x7b\xf0\xe4\x4e\x41\xa7\x11\xf1\xb8\xaa\xfd\xfd\xc0\xb0\xd3\x8a\x26\x3e\x25\xb8\x69\xb5\xcf\xfb\xc6\x9b\xb6\xd8\xf4\x7b\x9a\x28\x1e\x0d\x70\xba\x15\x38\x67\x1d\x20\xa7\xed\x6c\xee\x1c\x90\x03\xf7\x7d\x4b\xda\x81\xb4\x02\xe9\xf7\x03\x92\x84\x9e\xc2\x6e\x73\xb4\x42\x8a\x63\xc3\x54\xce\x85\xd7\x4d\xd7\x0e\x9b\xbc\xc4\x14\xc3\xae\xc2\x70\x25\x62\x78\x1e\xb3\xfb\x90\xac\x52\xdc\x97\x9a\x47\x3d\x74\xef\x4b\x10\x70\x4d\x0b\xbe\xaa\x1e\x7b\xa4\x0d\x77\x29\x8e\x41\x6b\xf0\xc4\xac\xae\x12\x02\x90\xee\xcd\xeb\xd7\xbf\x89\x68\x48\x42\x0b\x9a\x40\x16\xdf\x2b\xac\x03\xba\xf0\x85\xa4\x27\xac\xf1\x0d\x0f\xe1\x9a\x94\x06\xe4\xe7\x05\xab\x11\xa3\x38\x1c\x0a\x87\xe3\x80\x7b\x06\xf3\x3a\x07\xa1\x61\xd7\x9b\x82\x96\xc1\x2d\x37\x64\xd3\x43\x07\xd3\x83\x89\xc5\x66\x1e\x2f\xc2\x20\xca\x70\x3f\x88\xb6\x7b\x08\x43\xdd\xb8\xb1\xa5\xc6\x91\x0c\x38\x97\x77\x1b\xcb\xbe\x0f\x8a\x13\x5b\xe1\xb7\xbe\x17\x50\x6c\x79\x45\xae\x10\x3a\xd6\xc0\x67\xb5\x4b\xed\xdb\xb8\xc7\x62\xbc\x18\xc3\xcb\xe2\xa1\x62\x4d\xb0\xda\xa3\xe3\xc5\x2a\xe9\x68\xcd\xa1\xaa\x1a\x11\x26\x74\xa9\x02\x1c\xb4\xd2\xbc\xeb\xf4\x8c\x78\xc6\xd1\x8c\xe6\xa0\x62\x01\x55\x3e\x04\x26\x2e\x1a\xfc\x68\x87\xec\x47\x1b\xbc\x4d\xcf\xc5\xdb\xd4\x13\x48\xe6\x2a\x01\x7d\x44\x39\x0c\xf4\x90\xe8\xea\xdb\xab\xcc\xf2\xc2\x2c\xa0\x08\xd0\x02\xfe\x4e\x91\x7c\x05\xfb\x33\x48\x6d\x50\xa8\x00\xaf\xdf\xb9\x4c\x5f\x5a\x35\xd6\x5b\xde\xa3\xee\x30\xc8\xda\xee\xfa\xb3\x4c\x98\x57\xcd\xb4\x17\x50\xae\x46\xb4\x36\x72\x44\x45\xfa\xed\x73\x48\xa9\x17\xad\x5b\x37\x50\x6f\x0b\x93\x4f\xbc\x5c\x43\xae\xbd\xbd\xb8\x78\x23\x99\x62\xa7\xee\xdd\xaa\xdf\x3e\xf0\xc3\x96\xd6\xab\xe1\x87\x4e\x5e\x01\xd0\xff\x13\xc4\x1f\x36\xf1\x7a\x43\xd2\xbd\x01\xca\xd7\xba\x1e\x4e\x57\x89\x8f\xfb\x13\xc3\xf2\x55\xd7\xba\x03\xcb\x57\x6f\xd8\x96\x78\x6f\x08\x69\x79\x2a\x9a\xc8\x26\x95\xa2\xe3\x5d\xdd\x63\x76\x96\xdd\x5a\xe1\x23\x96\xd9\xd3\xf8\x3e\x68\x6c\xcf\x5a\x63\x3b\xe4\x94\x7e\x4f\xac\x8e\x74\x0f\x39\x75\xf7\x50\xc4\x86\xfa\xd7\x87\x4d\x75\x24\xf6\x6b\xf3\x63\x0e\x80\xc3\x87\x05\x1c\xf6\xf4\x87\x79\x0f\x86\xdf\x4d\xb1\x04\x06\xf3\x1d\xdd\x0b\xfa\x14\x55\xcb\x6e\xc2\xc1\xf6\xc8\xf8\x4e\xbe\xbb\x9b\x53\x73\xcc\xf5\x31\x3d\xee\xc1\x19\x9f\x38\xe6\xea\x32\x4a\xfb\x46\xd7\xe5\x0d\x74\x77\xa1\x72\x5e\x7a\x19\x3b\x91\xa5\x30\x63\x34\xaa\x91\x1b\xb6\x40\x58\x25\xca\x5c\x2e\x39\x5d\x8f\x9c\x82\xc1\x83\x15\x89\xee\x43\x9e\xc1\x95\xb8\x27\x77\xf1\x36\x4f\x3a\x48\xf8\x94\x70\xa1\xcb\xe9\x94\x27\x20\xad\xd4\x3c\x19\x29\x33\x00\x91\x7b\x8c\xb4\x7f\x3d\xf9\x6b\xb8\x2d\xbb\x53\xb4\x3a\x31\x58\xcd\xa6\x7d\xf2\xe1\x6d\xc4\xce\x36\x76\xd6\xd7\x88\x6e\xc5\x26\xc2\x66\xf6\x02\x5f\x85\xd2\xfa\xf1\x9d\x7b\x42\x18\xa2\x68\xd8\x7b\x06\x11\xb5\x59\xe6\x7a\xea\x31\x8f\x06\x22\x82\xb2\xd4\x40\x95\xfb\x43\x0e\x6a\xc7\xaa\xa2\xfd\x80\x22\x88\xd1\x2b\x5e\x89\xca\x82\x27\xa5\x49\x9b\xfd\x33\x7f\x22\xf7\x70\xb2\x36\x46\x49\xfd\xb2\xf4\x02\x51\x6c\x9a\xb9\x8a\xe0\x75\x04\xd5\x74\x9d\xc5\xbd\x1f\xe4\x6e\xff\x20\xaa\xda\x76\xe1\x8d\x0f\x14\xe0\x41\x2e\xf7\x96\xf2\x62\x73\x59\x71\x55\xe3\xa9\x78\xe9\xf1\xa9\x8b\x79\x3d\x99\x5a\x58\xc7\x7b\x33\xb5\xf6\xb4\x44\xab\x59\x1b\x28\x65\x8d\x1c\x4b\x6d\x9e\xb8\x28\x69\x90\xaa\xc1\x53\xfa\x28\x6b\xf4\xeb\x9a\x0c\x6c\x9b\x89\xb9\xa5\xe1\xd9\x98\x0b\xa3\x8d\x1a\x9f\x09\xf3\x8b\xba\x44\xbb\x45\x97\xf7\xc0\x07\x24\x55\x87\xac\x91\xb9\x17\x08\x5d\x82\xb8\x96\x18\xfb\x16\x05\xe6\xf8\x6c\x49\xff\x00\x8b\x92\x6b\x4b\x05\xa1\x13\x2d\xb3\xd2\x84\xcb\xf8\x92\x7d\x7d\x4b\x7e\xf7\x8a\x40\xac\x53\xc1\x94\x3d\xe7\x74\x86\x24\xb1\x01\xea\x6a\x0c\xc2\x79\x91\xb5\xa1\xca\x78\x1a\xe4\x50\x40\xd0\xe9\x9b\xd7\xbf\x79\x35\x26\xa7\x8d\xef\x71\x4d\x12\x9a\x25\xce\x6b\x07\xb6\xa9\xe8\xab\x93\x05\x51\xb2\x14\x29\x6e\x99\x53\xc8\x92\x60\x8e\x7a\x5d\x61\x74\xd0\x52\xc6\xb5\xd5\xaf\x3e\x7c\xa5\x79\x91\xb1\xb7\x08\x47\x36\x4e\x89\xb3\xdb\x6f\x24\xf9\xf1\xf5\x6f\x46\x76\xac\x70\x8f\x7f\x7c\xfd\x1b\x3f\xd4\xfb\x25\xee\x1c\xb3\xb1\x8f\x9b\x6a\xcf\x5e\xf6\x0a\xd6\xdc\x43\xda\xb8\xd3\x4e\xb4\x91\x45\xe1\x90\x84\x34\x24\x6d\x5e\xc6\xe2\x00\x4a\x3b\xa4\x0f\xa3\xca\x68\x70\x81\xda\xb7\x1d\x78\xa7\x3e\x1d\xa9\xd9\xd2\xf6\x08\x2b\x54\x33\x41\x26\xf6\x4c\x68\x52\x16\x00\x28\x6b\xb4\xc2\x68\x30\x3b\xbc\x8c\x26\x6c\x4c\x7e\x11\x09\xf3\x80\xed\x2a\x5e\x25\x9c\xb0\x11\xd8\x0a\x6c\xaf\x10\xa9\xc6\x52\x4d\xa4\x30\x92\x80\xd7\xaa\xd1\xf7\x88\x98\x79\xa9\x11\xa4\x84\x6b\x48\x4d\x25\xe0\xfd\x07\x0e\x5d\x2a\x3e\xe3\x62\xed\x31\x8b\xbf\x0f\x4b\x95\x65\xb0\x48\xba\xe5\xb8\xef\x12\x8c\xb5\x02\x0c\x77\x7f\xf2\xb4\x0d\x4d\xba\x2c\xd5\xb2\xe3\xef\xb1\xa8\xd1\x12\x0d\x0a\x59\xfd\x08\x9d\xc8\x06\x88\xb3\xfe\xda\xbd\x08\x52\x1c\xbd\x17\xd3\x18\x4f\x25\x7c\xa4\xe2\x6b\xab\x38\xfe\x5c\x23\xe4\x96\x20\xbc\xbe\x2f\x35\x8a\xcd\x3a\x3f\xfc\xee\x37\x7d\x08\x8f\xbf\x4a\x11\xd6\x26\xac\x19\xb5\x0b\x56\x16\x84\xe7\x39\x4b\x39\x35\x2c\x5b\xf8\x8e\x58\xe3\x90\x38\x22\x30\x22\xba\x04\xdb\x82\xa3\xbd\x4d\x1a\x26\x33\xcc\xed\x19\x2e\x6f\x2a\x61\x4d\x18\x04\x85\x92\x37\x8e\x5e\xd4\xa3\x20\xe1\xca\xdb\x37\xe1\x0d\xa0\x58\x80\x2c\xbe\xe1\x59\xc6\xd2\x51\xe7\xf0\xa7\xa5\xb2\xb7\x7f\xd4\xb8\xe9\xad\xc8\xea\x06\xfa\x10\x3c\xe4\x4b\xb7\x18\xcc\x3b\x8e\xc2\xb5\x0e\x79\x85\xe1\xff\x20\x39\xf7\x03\xf2\xeb\x55\xd7\x63\xfb\x43\x9f\xca\x3b\xb1\xfa\x7a\x01\x4d\x72\x17\x6b\xcb\xab\x51\x0f\x4c\x6d\x9c\x2d\xfb\x75\xdb\xfa\x3f\x96\x8f\xc0\x06\x77\xc6\x1d\xf0\x1a\x3f\x03\xf5\x63\xd4\xe3\xeb\xe1\x6c\x4f\x65\x96\xc9\x3b\x34\xfd\xd9\x06\xf8\x99\x96\xeb\xbd\x74\x0d\x56\x05\x19\xf4\xe5\x69\xee\x36\xd4\xb8\xe6\xaa\xdb\xb0\x53\x9e\x77\x69\xa8\x61\xd3\x32\x03\x4b\x52\x27\xd6\xbd\xeb\x55\x3b\x8d\x2a\x47\x2a\x38\xbd\x12\x3b\x3b\x40\x8a\x33\xc3\x30\x84\xb6\xab\x97\xab\x45\xd1\x87\x61\x16\x54\x99\x26\x24\xa9\x6d\xd0\xe7\xbe\x9d\xc7\xc6\x38\x83\xa4\x54\x29\x08\x25\xd4\x38\x87\x8b\x7d\x18\x0d\x27\x92\x10\xc3\xa7\x22\xbb\x7f\x25\x9c\xee\x28\xe8\xf9\xbe\xfb\x1a\x0d\x7d\x9d\xfc\x12\x4d\x30\x32\x1a\x22\x32\xc5\x1f\x5b\x88\x4c\x00\xb7\x8f\x36\x10\xee\x9f\x32\x61\x17\x80\xe9\x31\x39\x0b\xff\xf6\x78\x54\x2e\xac\x4c\xa0\xdf\x5e\x0b\x72\x4c\x3e\x31\x63\x75\xde\xb7\xe4\x94\x68\x2e\x66\x19\xdc\x50\x7b\x01\xde\x7f\xba\xc4\x94\xd4\x52\x1b\x41\x73\x36\x86\xe6\x97\x46\x2a\x3a\x63\x6f\xc9\xa9\x26\xb9\xe5\x16\xff\x90\x59\x99\xb3\x77\x19\xe5\xb9\x26\x34\xf8\xac\x59\x3a\xbe\x16\x57\x8d\x0d\x9a\x95\x54\x51\x61\x58\x85\x8e\x47\xe9\x5a\xe0\x18\xfc\xb0\x17\x68\x72\xa6\xd9\x1d\x5d\xd8\xaf\x14\x1e\xb9\x01\xb8\x59\x8d\x23\x08\x8d\x07\x60\xca\x41\x03\x53\x06\xc0\xc5\x73\x01\x5c\x44\x10\xf9\x76\x2f\xe4\x7d\xc0\xe0\x31\x5b\xd9\x18\x0d\xee\x39\x6f\x45\xf6\x02\x65\xe4\x4e\xcc\x01\xdb\x65\xfb\xb0\xef\x87\xc6\xae\xf1\xc3\x0d\xe1\xd8\xcb\x5e\x9f\xf3\x78\xcc\x51\xd7\xdb\x21\xb1\x0f\x0d\xf6\x1c\x73\xbc\x9d\x62\x49\xa2\x8e\xfb\x00\x9f\xdb\x9a\xaf\x46\x3e\x6b\xd7\xfa\x89\x22\x9f\x87\x52\xe3\x03\xea\xb9\x2f\xea\x39\x3e\xea\x4f\x0c\xf5\x1c\xdd\xe9\x0e\xd8\x73\xa3\x65\x1b\xee\x39\x6a\x32\x00\x9f\x0f\x5b\xbe\x6c\x05\x3e\xdf\xd7\x5b\x1f\x33\xaa\xa8\x8b\x01\x6d\xfc\xcd\x0a\xbf\x01\x6d\xbc\x31\xbd\x3b\x20\x38\x6f\x93\x46\xee\x4b\x06\xeb\x00\xf4\x9e\x92\x46\xdb\x35\x98\xde\x58\x06\xee\x61\x62\x92\xe9\xcf\x10\x34\x9b\x33\x61\xce\x65\xc6\x93\xae\x0a\x65\x2d\x6f\x78\x57\x11\x66\x83\x08\xe6\x49\x0f\x7f\x73\xb6\x40\x38\x3e\x34\x43\xc3\x24\x29\x8b\x11\x5a\x3c\x31\x73\x44\x48\x19\x21\x05\xba\x30\x47\x04\x60\xc2\x4c\x04\x3b\xa5\xb7\xe2\x86\x08\x61\x52\xe0\xd7\xb9\x26\x5f\x7e\x51\x00\xdf\x05\xb0\xd5\x17\xe8\x59\xb1\xe5\x91\x70\x41\xb8\xb0\x7f\x68\xdb\x21\xa2\x22\x5f\x16\x32\x3d\x7e\x3d\x72\xee\x40\x99\x1e\xbf\x19\x11\x66\x92\x57\xde\xf3\xb8\x94\xe8\xf2\x8e\x72\x4b\xf3\x0d\xcf\x08\xa3\xc9\x1c\x3c\xa9\x1e\x1d\xec\x53\x69\xba\x64\x98\x5c\xcc\xc6\xe4\x9f\xcd\x49\x8c\xaa\xc4\x69\x68\xc5\xcd\xe5\x6d\x95\xd1\x52\x16\x85\xd4\xdc\x30\x1c\x1e\x4e\x98\x66\xc0\x80\xa0\x92\x4e\x34\xe9\x73\xaa\x68\x96\xb1\xec\x8b\x33\xef\xc5\xd5\x8c\xbd\x2e\x57\xb8\x36\x98\xf5\xd3\x43\x3a\xbd\xfe\x87\x7b\xe1\x31\xd6\x76\x66\x80\xa6\xb6\x53\x97\xc2\xfd\x0a\x16\x64\xe8\x3a\x85\x92\x44\x60\xe5\xf5\xae\x73\x29\x92\xde\x79\x25\x36\x07\xb1\xa8\x06\x88\x65\xd9\x19\x17\x5a\x38\x99\x10\xcd\x63\x1e\xb3\x09\xab\xa7\x99\x5b\x66\xdf\x97\x70\x89\x80\x84\x66\xc1\xb8\x8d\xa1\xe7\x5c\x68\x43\x85\xe1\x15\xe2\x2d\x18\xd1\x7c\x97\x58\x97\xd0\x4a\xe3\xb7\x3c\x2d\x69\x16\x81\x39\x33\xed\xb2\xe8\xd0\x16\xcb\xe2\x62\x4c\xce\xa6\x31\xbc\x7a\xe4\x8f\xf1\xe1\x64\xdb\x6c\x7b\x25\xe0\x87\x96\x5c\x42\xbe\x75\x23\xfd\x5f\x4e\x39\xc2\xf3\xc3\x89\x8e\x28\xd2\x0b\x1d\x5e\xf3\xd5\xe7\xf1\x84\x37\x9f\xfa\x15\x44\xd8\x21\x64\x2f\xf2\x5f\xb3\x5c\x36\x70\x70\x74\x65\x50\x6f\x18\xc8\x16\x84\x16\x45\xc6\x59\xba\x44\x31\x1d\xb5\xae\x53\x90\x0a\x7e\xf1\xcc\xf2\x7a\xea\x5d\x61\xcc\x9f\x00\x1c\x5c\xdb\x9e\x12\xf6\x89\x2e\x9b\x09\x96\x56\x25\xb4\x0c\x71\x14\xf6\xdf\xfe\xa2\xe3\xcf\xb8\x30\x33\x3b\x42\xa1\x57\x19\x96\x7c\x5b\x58\x1c\xc8\x7a\xe4\x69\x7f\xe3\xc8\x23\x35\x05\x06\xa1\x0b\x7b\xa8\xad\x56\x5f\xe5\x13\x6c\xd8\xf1\xc3\x48\xcc\x18\x4d\x5b\x33\x66\xc8\xfb\x4f\x97\x27\xde\xa9\xe0\xb6\x0d\x1d\x79\xb8\x1f\xd4\x58\xee\xf0\x16\x98\x97\x17\x08\x8e\x91\xfa\x8e\xa3\x19\x8f\xdd\xa1\x1f\xeb\xdb\x64\x9c\x64\xa5\x36\x4c\x8d\x33\x99\xd0\xcc\xb1\xcb\xeb\xa3\x96\x1e\xae\x8f\xec\xd8\x31\xb1\x46\x48\x4f\x10\xbb\x28\x56\x66\xb7\xeb\xa5\x69\x3f\x24\x92\xdf\x3c\x18\x92\xff\x83\x97\x0b\xb4\xa1\x79\xc1\x52\x30\x3d\xb6\xac\x1d\x74\x3f\x2d\xb3\xa9\xfd\x2f\x1c\xb4\x3a\x9b\x71\xdc\xa4\x14\xfc\xd7\xb2\xf2\xdf\x54\xca\x89\x62\x3a\x60\xd6\x6a\x72\x5f\xeb\x62\xef\xa8\xb2\x7f\xf4\xa1\x0d\x6a\xfb\x97\x8d\x9a\x93\x35\x47\xe5\xca\x2e\xeb\xbb\x60\xd7\x46\x2e\xd0\xf9\xea\xbc\xca\x95\xf9\xb7\xb1\xb2\x56\xe8\xa2\x15\x5b\x81\x33\x9c\x42\x9a\xde\x20\x1c\xb4\xaf\xd2\x6d\xe5\x9e\xf3\x2d\xbb\xc4\x94\xb6\x57\xea\x85\x5e\x12\xf4\xf6\x61\x56\xf2\x00\x07\x73\xbe\x78\x48\x9f\x36\x65\x8a\x59\x59\x8a\x34\x5d\x80\x91\xf8\xd9\x42\x44\x72\x8a\x50\xba\x06\x21\xe1\x0c\xd3\x98\xe2\x67\xb9\x5d\x8a\x3b\xea\x56\xd3\x33\x68\x5c\xfa\x98\xf2\x50\x2c\xa6\xfc\xe1\xd6\xf2\x09\x78\x37\x58\xd6\x31\x1a\xd4\xd2\x3a\x3c\x93\xde\x93\x2f\x05\xab\xe0\xe9\x2f\x27\x0b\xa0\xa7\xaf\x08\xae\xc8\xcf\x90\xd0\x95\x0b\x68\x55\x45\xed\xb9\xed\x32\x41\x48\x3b\x6d\xfb\x98\xa1\x37\x4c\x93\x42\xb1\x84\xa5\x0c\xb0\x3d\x96\x71\x51\xb1\x70\x9d\xeb\x66\x3f\x23\x74\xea\x06\x89\x0d\x5c\xb0\xbb\x89\x49\x08\xd4\xc6\xca\x10\x20\xd6\x45\x4e\xdc\xcd\xed\x1d\x3d\xf5\xe0\xb5\xe9\x90\x57\xf0\xbf\x1d\x1a\x05\x3b\x43\x74\x96\xda\xae\x8b\xd1\x61\xdb\x68\xa7\x1b\xa5\x0f\xae\x37\x0e\x1e\xa3\xae\xa4\xc2\x0d\xd6\xbe\xf2\xf2\x3d\x40\x5a\xe1\x77\xe1\x6b\x17\x8e\x6e\x3d\xa5\xd0\xa0\xc8\x14\xbe\xe7\xd0\xa0\x56\xe7\x55\xcf\x5b\xf8\x68\xb1\x41\x6e\x41\x7a\xc6\x99\x34\x5a\x2f\x47\xfd\x02\xe3\xf3\x62\xc9\x5a\xb1\xac\x12\x17\xe2\xdf\x9d\x3a\x14\x18\x31\x74\x12\xbe\xba\xaf\xd3\x57\xef\xbf\xef\x1a\x60\xeb\x91\x95\xbe\x00\x06\x8a\x09\xe3\xea\x22\x84\x9f\xcf\xb2\x34\x14\xf0\x5a\x2e\xd6\xa8\x2e\x34\x68\xf6\x6b\x09\xec\xe5\x3f\x5f\x8f\x1a\x8b\xde\x4c\x11\xdc\x47\xa0\xdd\x38\x40\x6a\xf9\x85\x96\x88\x9d\xd6\x44\xd3\x21\xda\xa8\x46\xc1\xce\xec\xd6\x2b\x14\x13\xd2\xe0\xc8\xa8\xab\xe0\x55\x6f\x23\x67\x39\xe2\xa1\xfc\x22\x91\x82\xe4\xa5\x73\x9f\xb8\x73\x75\x7a\x7e\xe6\xec\xe4\x8f\x1a\x7b\x55\x6b\x7b\xaf\x1b\x51\x45\xd8\x51\x48\xb1\xb6\x20\xef\x56\xf8\xee\x1e\x2c\x5e\xab\x69\xea\xda\x66\x5e\x7b\xca\x9e\xdc\xf3\xba\xd6\x1b\xef\xfb\xb6\xfa\xf5\x3a\x6e\x64\x78\x1e\xf9\x1f\x5e\x6d\x7e\x79\x37\x4b\x16\xdd\x68\xfd\x40\x24\xba\xbe\xca\x7b\xc2\x65\xee\x39\x62\x6e\xb5\x06\xd9\x4b\xd8\xfc\xbc\x4e\x95\xd4\x35\xcd\x71\xcd\x92\x83\x52\xe9\x2a\xb7\x14\x4c\xd9\xa5\xf3\x55\xea\x81\x8a\x72\x91\x64\x65\xca\x34\xa8\x1c\x34\x45\xea\x40\xb3\x0a\xe9\xab\x89\x60\x09\xd3\x9a\xaa\x45\xdc\x47\x04\x79\xf6\xe2\x5d\xb5\x81\x7e\x74\x8f\x93\x0b\xbb\x0d\x0a\xbd\x4e\x67\xaf\xbd\xdc\x89\x7c\xd6\x28\xef\x02\x32\xa2\x99\x7a\x7a\x25\x06\xba\xdd\x2a\xd4\x13\x7f\x51\xdf\x79\xe3\x20\x19\x6b\x0d\x0a\x8f\x98\x1d\xbb\x34\x73\xab\x6a\xa3\xaf\xce\xee\xcd\x9f\x65\x29\x52\xc4\x08\x5e\x78\xfd\x7f\xcd\x0d\x68\x6b\x8e\x56\x86\x60\x3d\x40\x14\x52\xcd\xb0\x45\x89\x91\x37\x0c\x84\x8a\x89\xed\x80\x18\xb9\x63\x7c\x46\x93\x98\xbb\xd1\x34\x23\x9f\x77\x09\x7d\x6d\x7e\x89\xfc\x83\x66\x3c\x25\xe0\xfc\x06\xd3\xca\x8b\x73\x99\xbe\x00\xc3\xeb\x8b\x4b\x96\x28\x66\x5e\x6c\x31\x1a\xd1\x6d\x50\xfe\x14\x59\x8f\xef\x31\xef\x92\x77\x4d\xfb\xf3\xd9\xfb\x6d\xbf\xb3\xbb\x03\x7b\x65\x4f\xd2\x05\x82\x1e\xd6\x1c\xd4\xb8\x59\x85\x91\xf0\x07\x11\xcb\x11\xa2\x9f\xce\x1b\xd1\x69\x82\xde\x86\x01\x38\x74\xc8\xc0\xa1\x01\x9b\xf3\x5c\xb0\x39\xfb\x01\xa6\xaf\xa5\x17\xe0\x9d\x69\xff\xd8\x96\x70\xf2\xf5\x9f\xeb\xcc\x62\xbd\xc2\xe6\x1a\x0d\xf3\x41\xa0\x47\xf5\x59\xe0\x81\x6b\xc7\x22\xd5\xa8\xef\x6e\x80\x48\xdd\x3b\xd6\x8f\xca\x83\x83\xdd\x19\xf8\xb5\xbf\x89\x85\x92\xb7\x3c\x65\x69\x2c\x21\x82\xa1\x10\xf9\x80\xbb\xa0\x7d\x68\x7e\x99\x72\x2b\xdd\x74\x29\x64\xa7\xbe\x1d\x88\x00\x28\x78\x1b\x26\x52\x26\x52\x12\xfa\xa8\xf2\x26\xdc\x30\x31\x26\xa7\x96\x88\xf3\x02\x06\x1c\x0d\x0e\x3c\x1d\xce\x35\x32\x05\xcd\x2d\xd7\x2c\x9b\xba\x6a\xb5\xc2\xfd\x34\xe5\x95\x37\xc3\x7b\x7a\xda\x3f\xe4\x20\x35\x66\xce\xd4\x1d\xd7\xcc\x33\x12\xc7\x07\x6a\xe3\xf1\xe2\x9a\x2e\x9d\x8d\x27\x2f\x33\xc3\x8b\x8c\x45\x5d\xbb\x80\x06\x2f\x8e\x47\xfb\xc8\x08\x9d\xd9\x4d\x08\x09\x13\x6d\xdf\xd5\x8b\x76\x94\x56\x8f\x2c\x0d\xe1\x79\x91\x41\x88\x1b\x99\xf3\xd9\x9c\xa4\x6c\xa6\x18\xca\x32\xaa\x04\x67\x36\xa6\x08\x84\xb1\x41\xc9\xa3\xaa\x9b\x7e\xe6\xdc\x55\xb4\x6d\x0b\x54\xe8\xa4\x26\xfa\xee\x80\x54\xb4\x8a\xde\xeb\x54\xa1\xfa\x0b\xdd\x62\x77\xd8\xd2\xe0\xbc\x0c\xd2\x37\x38\x19\xa2\xdf\xa0\xa8\xd0\x84\x59\x56\xc9\x5d\x4a\x0d\x4d\x32\x29\x66\xbe\xe0\x05\xbe\xe9\x7a\x07\xa8\x81\x1e\x93\x4f\xbf\x5c\x7d\x78\x0b\x5d\x59\x11\x1c\x4c\x82\xea\x85\x26\xee\x56\xde\x72\x76\x57\xb1\x47\xf8\x0c\x74\xef\xbd\x0f\xf5\xe9\xa0\xb3\x19\x93\x5f\xd4\x0f\x99\x90\x66\x4c\xfe\xce\x58\x41\x3e\x7c\x2d\x38\xda\x0c\x5d\x2e\x33\xa2\x73\x9a\x65\x84\x4f\xc9\x42\x96\xe4\x8e\xe2\x8d\xcf\x0b\xcb\xc2\x6f\xa5\x5b\xea\xf6\xed\x64\xcd\xbe\x3a\x2e\xf6\xf2\xb7\x9d\xad\x25\x84\x4e\x92\xb4\xac\xb2\x48\xc1\x4c\x23\x30\x85\xa7\x34\xd1\xc2\xc3\xf5\x52\x4e\x16\x33\xa5\x12\xe1\xe6\xbb\x7a\xd4\x29\x9f\xa2\x94\x5d\xf5\x16\x3e\xa1\x25\xa1\x9e\xc8\x55\xae\x9d\x39\x4b\x6e\xe0\x73\x2f\xaa\xe9\xbd\x70\xbe\x22\x8e\xbe\x68\x70\xdd\x36\x15\xcd\x2d\x6d\xa8\x3d\xf9\x59\x45\x3b\xb7\x36\xda\xf4\xe1\xb3\x3d\xd9\x44\x2d\x96\x4b\x31\x6d\xf5\xf0\xad\x58\x42\xb5\xc4\x57\x3c\x67\x80\xb2\x78\xc8\x08\xa1\x0f\xcb\x9f\x0f\x95\xf8\x38\x6a\x84\xd5\x08\xab\x63\x68\x0f\x1a\x50\x6c\x4b\xea\x57\x98\x3e\xec\x6f\x9d\x55\xea\x9c\x42\x8f\x70\x51\xfa\x6b\xc9\xc8\x84\x51\x05\x29\x3e\xa1\xeb\xdd\x86\x9f\xc0\x90\x5a\xaf\x6f\xb5\xf8\x3b\x3f\x5d\x96\x82\x75\x1f\x2b\xa0\x73\xd4\x18\x96\x17\x88\xa3\xac\xb3\x42\x77\xae\xec\x73\x02\xc1\x40\x96\x65\x2a\x2c\x11\xff\xb6\x46\x2b\x83\xba\xe0\x58\x6b\x42\x93\x79\x65\xb5\xbd\x63\x93\xb9\x94\x37\xae\xbb\xe8\x1b\x52\x91\x22\x2b\x67\x80\x2b\x86\x96\x56\x1e\x3c\xb6\x87\xa9\xe1\x2e\x19\x14\xda\x41\xa1\x1d\x14\x5a\x6c\xf3\xe4\x15\x5a\x4b\x31\xfa\xc5\x5c\xcf\x65\x06\xce\x2b\x64\xf2\x80\x13\x09\x41\x9b\x6e\x43\xc9\x84\xd9\x43\xc4\xec\xc1\xb2\x3b\xf9\x30\x4a\x32\x4c\x61\x93\xe8\xeb\x29\xa4\x51\xb2\x64\xce\x97\xa8\x82\xb3\x8c\xe0\xd6\x60\x87\xbf\x9b\x33\x90\x22\xe3\xf9\xf9\x24\x40\x11\x65\xde\xaa\x38\xfc\xc1\x6b\xe6\xc0\xb2\xf6\xab\x98\x87\x93\xd7\x8b\x33\xfa\x48\x21\x4a\xa2\x36\x35\xbd\x94\xd4\xbf\xb4\x57\xa5\xbc\x06\x88\xac\xa0\x87\x56\x89\xd6\x95\xd2\x14\x68\xa8\x3b\x5f\x15\xce\x3f\xa0\xfb\x9c\x08\xef\xdf\xd6\x84\xea\x31\xf1\xdf\x39\xa6\x77\xa0\xfd\x2f\x73\x6a\xed\xf4\x20\xa6\xf8\x74\xb1\xa4\xa5\x41\x60\x08\x58\x0b\xd2\x7a\x0a\x67\x17\x5a\x5c\xd7\xa3\x63\xa4\x22\x04\x76\x08\x19\xfd\x6a\x07\xe0\xad\x1f\xa3\xda\x9b\x3e\x8e\x06\x5d\x50\x8e\xb7\x86\x1f\xdd\x67\xfe\x1e\x4e\x2e\x69\x91\x24\xc8\xc3\xa8\xdc\x8f\x2a\x88\xee\x42\x78\xec\xab\x99\x54\x6d\x97\x15\x93\x47\xb9\x27\x00\x0d\xf6\x47\x22\xbe\x23\xc9\x5c\x6a\x16\xe8\x6f\x5d\x0a\x0d\x75\xb8\x13\x99\x17\xd4\x00\x3e\x18\x2e\xcc\x44\xba\x5b\x53\x93\x98\x45\x1a\x0c\x4e\x75\x63\x16\xba\xbb\x97\xcd\x5b\x20\xf8\xe9\x2a\xde\xbb\xd1\x23\x50\x9a\xe8\x02\xb8\xd0\x39\xf8\xc6\x0b\x1d\x59\x8e\x00\xeb\xeb\xad\x6d\xcd\x61\x9d\x9e\x9f\xb9\xa0\x14\x66\xaa\xf8\xc6\x71\xd5\x2f\x6a\xd3\x4e\x68\x8d\x0c\x1a\x98\x64\xa2\x9a\x79\xcb\xf2\x21\x78\xda\x69\x60\x1e\x4d\x82\x99\x4f\x9b\xfd\x1b\xe9\x4a\x12\x57\x44\x22\x1e\xa5\x23\x4c\xbc\x9a\x16\x01\x9a\x03\x74\x80\x36\xb4\x0a\xfb\x41\xbb\x1e\x08\x83\x69\x7e\xd1\x7d\x10\xc3\x2f\xc2\x6f\x11\x9f\xb4\x5f\xb9\x3e\x32\xaa\x64\xd7\x47\xa3\x98\xf8\x69\x67\x2e\xf2\xd6\xbe\x0e\x3a\x52\xd9\x88\x1e\x9c\x90\xd4\xe6\xd3\x79\x09\x6a\x73\x8f\xdc\xfb\x4b\xc4\x9a\x6a\x2d\x13\x4e\x03\x63\xa8\x29\x78\xed\x74\x67\x22\x65\xc6\xa8\x58\x61\x93\x52\x6a\x39\x54\xab\xa9\xf6\xdb\x36\xab\x87\x95\xd8\x63\x29\x5e\x80\x58\x0e\xe6\x20\x96\x6e\xe1\x0a\xd6\x6c\xe3\x88\xb1\x16\x42\xf8\x59\x33\x75\x26\xa6\x72\xad\x74\x67\x1b\x79\xa2\xe7\x5f\x58\x5a\x58\x88\x87\xf1\xa6\xfc\x25\xd3\xc5\xee\x48\x77\x18\xf1\x6a\x8a\x1d\xc6\x88\x62\x35\xd2\xa5\x36\xd1\xda\x2e\x22\x98\xe6\xd0\x3e\xce\xf3\x22\x63\xae\x40\x3f\xfe\x38\x86\x6e\x80\xa8\x4d\x69\xd2\x27\x17\x1f\xfb\x6a\xd4\x92\xc6\x52\xc1\x82\xce\xdb\x5f\x23\xab\xef\xd8\xda\x5b\xd6\xb8\x67\xab\x6f\x5a\xf3\x42\x36\x2f\x54\x1d\xbb\x14\xaf\x56\xd8\xd3\x36\x7e\xb2\xe2\x06\xc5\x9b\xda\x3c\xb8\x20\x38\xf7\x4a\x9f\x0f\x51\x6c\x72\x4a\xf0\x0d\x14\xa4\x4a\x77\x14\x29\x64\x22\x24\x72\xfa\xe0\x74\xaa\x1b\x83\x71\xea\x03\xb1\xd0\x06\x00\xb7\x3f\x92\x42\xab\x79\xd0\x44\x49\xad\x5d\x0a\xec\xb3\x69\x7d\x86\x18\x44\x8d\x09\x6e\x5d\xc6\x20\xfc\xcd\xeb\x55\x3e\x76\x05\x96\x23\xf5\x22\xa4\x4b\xf1\x07\xa0\xd5\xca\x38\xfd\xf9\xec\x7d\xd3\x1b\xd3\x97\xc8\xf4\x40\xb7\xf8\xdd\xc2\xa9\xe2\xe4\xb3\xc5\x8a\x39\xe7\xe0\xb1\xc8\x32\x42\x13\x88\x53\xb7\x4f\x7b\x8f\x6d\x67\x64\x64\xc2\x0c\x1d\x6c\x88\x2b\x4f\xf0\x60\x43\x1c\x6c\x88\x83\x0d\xf1\x31\x6d\x88\x4b\x04\xea\x89\x1a\x12\x97\xe7\x31\x58\x13\xe1\x7f\x0f\x64\x4d\x84\xf5\xbf\x8f\x49\xb1\xfd\x20\x0e\x76\xc5\xc1\xae\x38\xd8\x15\xfb\x12\xbb\xc1\xb8\x38\x18\x17\x07\xe3\xe2\x60\x5c\xfc\xb6\x8c\x8b\x48\x0d\x9f\x9c\x85\xb1\x31\xec\xc1\xcc\x48\x06\x33\xe3\x60\x66\x1c\xcc\x8c\x3d\x69\x89\x54\xfc\xdf\xc1\x59\xf1\x51\x26\x34\xbb\x2c\xe1\xad\xd3\x24\x61\x5a\x77\x5a\x1b\x57\xbd\x82\xd4\xbc\x52\x76\xa5\x82\xb0\x79\x8a\xf3\x95\x0a\xcf\x2f\xe8\xbd\x3e\xc4\x98\x0a\x98\x3d\x84\x86\x57\x25\x61\xec\x79\x2f\xa0\xfa\xe1\x5f\xe9\x2d\x54\x27\xab\x9e\x11\x9d\xc8\x82\xa5\x95\x16\x94\x43\x76\x25\x6e\x48\x5e\x26\x73\xc2\xa8\xe6\x58\x20\x7e\xa6\xa8\x30\xcb\xef\xb9\xa4\xa3\x78\x16\x7d\x60\x74\xc1\x54\xce\x35\x66\xd3\x81\x49\x70\x31\x1b\xac\x95\x83\xb5\x72\xb0\x56\x36\x97\xfd\x29\x59\x2b\x6b\x74\xae\x85\x5e\xed\xcd\x5e\x39\x26\xa8\x91\x55\xc4\x27\xc7\x40\x24\xc2\x7e\x2d\x69\xe6\xef\x65\xf5\xf3\x42\x96\x2e\xa9\x5f\xd4\xa9\xd3\x59\xc6\xc4\x72\x44\x9f\x7b\xc4\x20\x47\x04\xeb\x48\xdd\x5c\xb8\x1b\xcb\x68\xe7\x9a\x3d\x8c\x6d\xd4\xde\x5a\x97\x53\x10\xb9\xc8\xd3\xb0\x8b\x56\xab\xb7\xce\x2c\xba\x92\xe5\xee\x0c\x71\x59\xdb\xc5\x4f\x52\x5c\x38\xe2\x76\x6a\x90\x60\xb0\x75\x06\x9f\xd6\xf6\x15\xaf\xf4\xa2\x6f\xf8\x06\xa1\x55\xab\x2a\xab\xda\x14\xf6\x4d\x1c\x07\xba\x1a\xd1\x40\xe8\xe3\xd4\xf5\x01\xc6\x13\xa7\x56\xf4\x29\x24\x68\xe6\x1d\x64\xff\x9c\x9a\x79\xd0\xd4\x2e\x3e\x12\xfb\x4a\x23\x80\x6a\x73\xba\x77\xcb\xd4\xa4\xe3\xbb\xff\x60\x6a\x12\xb2\xd9\x1b\x2a\x52\xaa\x52\xf2\xd7\xab\xab\x73\x02\x2f\x3f\xb0\x5c\x17\xed\xe2\x45\x99\xad\xcb\xc6\xd1\x68\xd9\x42\xf0\x1a\x79\x65\x29\x51\x65\x9c\xf9\x37\xda\xe5\xee\x0d\x14\xd5\xd7\x3e\x5f\x7c\xec\x52\x7f\x3e\xd5\x5b\x3b\x6e\xee\xaa\x1f\x52\x05\x59\xf8\x4b\x95\x85\x9a\x82\x20\x69\x3a\xc1\x08\xb3\x62\xc1\xfd\x02\xbe\x4b\xbe\xaf\x25\x2b\x75\xa1\x82\x22\x5b\xf8\xe8\xc4\x69\x99\x65\x23\x32\x85\x42\x93\xda\xb0\xc2\xdb\xbf\xec\x01\x1a\x13\x72\x7d\xf4\xfd\xf5\x11\xc9\x19\x15\x40\x9c\x1e\x5c\xdf\xb2\xa7\xa8\x6b\xbd\xfc\x19\xac\xdc\x08\x15\x59\xab\x5f\x47\x97\xee\x64\xa2\x47\x24\xe3\x37\xec\x2d\x99\x31\x33\x22\x85\xd4\xf6\xff\x4b\x33\x72\x6a\xd7\x88\x40\x6a\xc0\x11\x99\x33\x9a\x8e\x88\x2c\x50\x8c\x78\xa4\xd5\xe8\x49\xfa\x71\xa5\xba\x68\x7f\xef\xab\xb4\x11\xf5\xdc\x11\xe9\xdc\x31\xd9\xf4\x5c\x6a\xdd\xd9\xf9\x0b\x68\x67\x8e\x80\xd9\xe3\x81\x0f\x1c\xe5\xf4\xf3\xea\xdc\xfa\x5d\xe6\xa3\x69\xc9\x6c\x1e\x16\x06\x65\xae\x2a\x6e\x16\xb3\xb1\x5c\x1f\xcd\x98\xb9\x3e\xb2\x52\x83\xb7\x1b\xf8\x1f\xf0\xef\xeb\xa3\x31\xb9\x3e\xba\x3e\x22\x2f\x41\xa4\x7a\x75\xef\x79\x80\x04\xd7\x63\x32\x28\xe9\x45\x33\xc2\x07\xde\x71\x86\x5a\x70\x63\x52\x63\x42\xde\xf9\x72\x00\x60\xd4\x50\xd0\x83\x90\x24\xe5\xda\x70\xe1\x5f\xc2\x00\x77\x21\xa3\x7e\xc1\x5a\x92\x65\xd5\x13\x5d\x9f\x76\x2c\x46\xc2\x12\xad\x92\x4a\x96\xdf\x43\x1b\xbd\x7d\xc7\xe5\x5e\x3f\x6e\xe8\xe4\xba\x6d\x85\xaf\x8f\x68\x96\x5d\x1f\xa1\x60\xb0\x4a\x9b\x77\xfa\x14\x25\x6d\xe6\x05\xa9\xc8\x25\xcb\xa6\x9d\x92\x53\xbf\xb2\x1d\x8e\x61\x75\xe5\x8e\x75\xa7\xcd\xea\x84\x95\x9b\x13\x42\xd7\x71\xa7\xbc\xd6\x68\x95\xaa\x9d\xdc\x0d\x5d\x4e\x7a\x0e\xee\xb2\x6a\xb9\xc1\xf8\xc2\xf0\x84\x14\xdb\x14\x3c\xd9\x40\x12\xa2\x31\xf7\x59\xe2\x3c\x35\xc6\x63\xd9\xd5\x88\xdc\x21\xaf\xc1\x4c\x83\x23\xa7\x1f\x47\xac\x48\xc9\xaf\x8b\x9d\x2c\xf2\x6d\x2f\xb3\x8d\xb7\xd9\x44\x34\xf1\x1f\xf5\x0c\x61\xf7\xa7\x8a\x3b\x13\xf8\x7a\x4a\x7b\x35\x51\xcf\x4d\x2c\x64\xfc\x00\x7a\xe2\x24\x58\xbc\x65\xb1\x26\x16\xa5\x06\x04\xdf\xae\xbb\xb2\x98\x8d\x00\xfb\x50\x29\xc3\x0a\x49\x5a\xbc\x30\x44\xf3\x99\x80\x9a\x4e\xc2\x8c\xc0\x6e\xe2\x12\xab\x90\xb4\x84\xfc\x8b\x86\x69\x34\x43\x15\x52\x6b\x3e\xc1\xe4\x11\x5c\x24\x32\x2f\xec\x86\xf7\xb3\xc0\xfd\xa5\x8f\x19\xfd\xf4\xfc\x0c\xdb\xb5\xb1\x14\xff\x23\x0a\x91\x21\xf9\x4b\xcc\x6d\x34\x6a\xe1\x21\x81\x89\x3d\x0a\xce\x1a\x6f\x45\xca\xa8\x14\x0e\xe4\x58\x4c\x62\xef\x37\xab\xdc\x8f\xf1\x15\x15\x65\x0e\x59\x41\x63\xe2\xc7\x05\xbc\x1f\x7a\x0f\x29\x37\xdc\x16\x1c\x80\x14\xea\x07\x0b\x2c\xad\x27\xf5\x84\xb6\xe8\x34\x77\x12\x24\x54\xea\xe0\xa6\x3a\x7a\x51\x41\x10\x58\x77\x7b\x3a\xb1\xfe\x8d\x13\xde\x4f\x83\x6f\x98\x19\x37\x7d\x68\xcd\x6e\x99\x5a\x98\x39\x1e\xba\x03\x5c\xa7\xbe\x6b\xd4\x40\xff\x54\x67\x02\x0d\xc2\x4b\xeb\xd1\x98\x5f\xf0\xd5\xfb\x93\x48\xc2\xd5\x18\x5f\x0b\xdb\xfa\x64\x2a\xe5\xf5\x51\x33\xb1\x7d\xc4\x6d\xc8\x8b\xa9\x94\x2f\x50\x5c\x82\x32\x45\xd1\xa9\x5c\xd5\xf5\x93\xd3\x81\x3a\xf4\x9f\x1d\xb2\xa1\x67\xa5\x02\xad\x92\xbb\xd6\x64\xb9\x6d\x7f\xa3\xc5\x47\x64\xa2\xfa\x0a\xa0\xbf\xb7\x3a\x88\xc6\x84\x7c\x92\x06\x4c\x8a\x58\x82\x8f\xd0\x25\x23\xab\x93\x33\xed\x6f\x35\xc9\xd7\xca\xfc\x20\x3a\x3a\xfb\x81\x3d\xc8\x34\x23\x09\xd5\x6c\x44\x26\x2c\xa1\xa5\x76\xee\x37\x6f\x3b\xa0\xd9\x1d\x5d\x68\xa0\xbc\x56\x23\x0b\x59\x71\x22\x5b\xe5\xa2\x7d\x9c\x83\xd7\x68\xf0\x1a\x0d\x5e\xa3\x67\xe3\x35\x6a\xa7\x62\xfb\xf4\x1c\x21\x38\x40\xa4\x5e\xbe\x0c\xae\x23\x2b\xfd\x0c\xfe\x9e\x27\xe8\xef\xe9\x65\xb4\xd8\x99\xbb\x67\xdd\x91\xdd\x98\x5d\xaf\xc5\xc7\x3b\xdb\x7a\x48\x4a\x47\x3e\x7c\xa5\x89\xc9\x16\x5e\xcd\x09\xa6\xd0\x78\x88\x91\x5d\xd4\x1e\x8b\xd8\xd9\xb4\xa2\x99\xbf\x00\x9a\x99\x8d\xdc\x0b\xad\xe6\xda\x2d\x6f\x46\xbb\x0f\x6d\xdd\xad\x68\xf7\xa2\x55\x4e\x94\x98\x2c\xa0\x85\xb2\x66\x9e\xaf\xaf\xed\x7a\x15\x63\x97\x13\xdd\x70\x96\x5d\x7b\xb7\x6e\xbe\xdd\x73\xdd\x99\x6d\x24\x3a\xdd\x17\x65\xc6\x36\x92\x5e\xa3\x17\x2a\xa5\xdd\x29\x4f\x6c\xc9\x6c\xb2\x52\x90\xbd\xe3\x56\x49\x8d\x91\x4c\xbe\x5c\xac\x03\x5b\x37\x8d\x30\x2e\xf4\xb2\x32\x87\x90\x94\x15\x4c\xa4\x50\xef\x59\x44\xe4\x15\x80\xe3\xb1\x53\x21\x97\xa9\x13\xd4\xa8\x58\x10\x40\xec\x6a\xc2\xbe\x16\x4c\x01\xee\x39\x94\xb1\x06\xf9\x03\x39\x0f\x08\xd8\x2b\x26\xed\x24\x46\x9f\xa5\x75\xb2\x20\x9f\xcf\x40\x4a\xd4\x73\x79\x77\x32\xe7\xa9\xb7\x5e\x63\xa5\x6b\x23\xc9\xaf\x25\x4f\x6e\xb2\x05\xc9\x98\x01\x4c\xb7\x48\x71\x3d\x14\xa3\x3a\xe6\x82\x5c\xc5\xc8\x2b\xa8\x55\xe1\x3e\xf6\xe9\x97\x2b\xf2\xe7\xea\x83\xec\xab\x13\x42\xf5\x42\x5b\xb5\xca\x7e\x24\x55\xfc\xb6\xe9\x4e\x49\x59\xe2\x6a\xa2\x51\xaf\x38\x53\xae\x99\xb6\xe2\xee\x14\x3a\x4b\x59\x51\x9a\xc5\x08\x23\x5a\x49\xc6\xa7\xcc\xf0\x9c\x9d\x54\x89\x3e\x71\xe1\xa0\xf0\x50\x62\x84\x3d\x97\x50\xe8\x55\xd9\xf1\xb5\x10\x48\x6c\x0e\xb6\xf3\x9a\x9a\xe3\xf3\xf6\xba\x8e\xb0\x66\xa1\xb4\x72\x3c\x64\x26\x6d\x1f\xb4\x77\xf1\xb4\xa0\xd0\x07\x6d\x62\xd0\x26\x06\x6d\x02\xdb\x3c\x07\x6d\x22\x22\xb0\xfb\x53\x26\x1e\x44\x5b\x88\x67\xb2\x7b\x65\xa1\x85\xcd\xd2\x25\xe6\xfa\x44\xa2\x66\x37\xd6\x16\x62\x59\x65\xef\xca\x42\xf3\x44\x46\xc2\xd1\x4a\x61\x7b\x63\xf7\xb7\x91\xe1\x78\x82\x4d\x1b\x8a\x97\x8e\xc9\x85\xdb\xa3\x07\x77\x9a\x6d\x68\xd3\xdc\x2d\xe6\x7d\xe0\xee\x03\x77\x1f\xb8\x7b\x73\xd9\x9f\x2e\x77\x7f\x40\x3b\xe1\x60\x07\x7c\x8a\x9c\xfd\xe1\x6c\x80\x9b\xdb\xff\x9e\x81\xed\xef\x69\x46\x9c\x7e\xb0\xa3\x6e\xab\x74\x1c\xc2\x6e\xc7\x7f\x61\x06\x5a\xbd\x7c\x45\x72\x66\xe6\x32\xad\x78\x42\x3d\x08\x95\x90\x4b\x0e\x55\x5c\x20\xba\xcd\xd2\x94\xa2\x8c\x92\x68\x54\xc8\x51\x5f\xee\x03\x4a\xbf\x64\x2e\x5f\xc1\x9c\xa9\x55\x80\xb0\x7b\xc7\xb1\xd6\xd1\x37\xce\xb5\xb1\x90\xe5\x0b\xc5\x88\x95\x1d\x2c\x75\x9b\x2e\x85\xd1\xee\x1f\x50\x30\xd8\x8b\x9f\x91\xbd\x38\x9a\x6b\xbf\x3a\x94\x6b\x79\xae\x3d\x92\x6b\xd2\x24\x6c\x9a\x9d\x60\x4d\x3e\x01\xd0\x15\x5a\x2e\x03\x39\xc3\x92\x44\x88\xbc\x59\x90\x6b\x78\xeb\xfa\x08\x22\x17\xac\x84\x77\xed\xee\x95\xcb\x7a\x01\x48\x45\xee\xe4\xf0\x42\x61\xd4\xb4\x26\xd7\x47\xff\x04\x7a\x30\x85\xc4\x05\xe4\x8e\x29\xe6\x94\x94\x9c\xf9\x0a\xcf\x54\x2c\xdc\xad\x3c\x00\x15\xac\x33\x27\x4d\xb7\x80\xb2\x5a\xa3\x42\xf1\xa2\x4b\x9d\x72\x42\x08\xc7\x63\x06\xba\x29\xb9\x52\x25\xb3\xab\x18\xe1\xb5\xef\xbc\x69\x3c\x04\x95\x4c\x69\xa6\x59\x55\x1f\x6d\x9b\x1c\x1b\x29\x13\xbc\x73\x84\xef\xa1\x11\xe0\x7e\x1d\xa2\x6e\xfd\x00\xb1\xd3\x51\x54\xb9\x0d\x46\x0a\x67\x0c\x92\xdf\xd0\x6a\xca\x38\x07\xcb\xa2\xd3\xf0\x15\x78\xe6\x4e\x59\x83\x9b\xcc\x29\x40\xd2\x65\xc1\x05\x48\x08\xa2\x12\xed\x64\xd5\x2e\x1a\xd5\x98\xb8\xd1\xbb\xc2\x5c\x76\x7c\xc6\x8d\x3d\x5a\x79\xfb\x68\xab\x1c\x25\xc1\xa7\xf1\xa1\x4f\xb6\x92\x7a\x6b\x07\x53\x74\x62\x6a\x88\x7e\xd2\x32\x67\xe8\x4a\x21\x32\x01\x27\x4f\xcd\x8d\x52\xb7\xe8\x83\x4d\x00\x4b\x6f\x6b\x62\xb9\xb3\x62\xd9\xc2\x83\x5c\x19\x96\x84\x47\xcf\x08\x74\x68\x17\x3a\x46\x1a\x49\xab\x38\x96\x76\xcb\x0c\x53\x39\x17\xcd\xee\xb5\x13\xb4\x05\xd1\x05\x37\x20\x6e\x71\x33\x26\x3f\x41\xd2\x15\x6d\xa8\x48\xd8\x88\x5c\xfc\xf9\xf4\x9d\x4f\x31\x07\x1e\x16\x08\xa3\x57\x32\x63\x18\xf8\xc4\x84\x2c\x67\x73\x78\xe0\x30\xac\x86\x67\x99\x4f\x26\x86\x63\x72\x75\xde\x96\xfc\x36\xcb\x79\x9d\x7a\x53\x46\xec\xaa\x13\x13\x09\xdf\xab\x9d\x6d\x2c\x64\x5e\xe9\x0e\x0b\xe0\x08\xa8\x35\x40\xa2\x9b\x4a\x6d\xc0\x43\xbb\xe3\xda\x51\x9e\x6e\x74\x69\x16\x9b\xd2\xbd\x65\xf3\x69\x27\xd9\x5b\x7a\x65\x09\xb3\x1c\xaa\x91\xa1\x8d\xcd\x9d\xc7\xab\x39\x77\xff\xf6\x07\x63\xbd\x73\xd1\x55\x81\xf4\xf7\x5c\xc7\xaa\x1c\x47\x9f\x1a\x9f\x95\x2a\xa4\x16\xea\x74\x38\xc6\xce\xc6\x3f\x3b\xd8\x5d\xfd\x68\xe3\x78\x21\x4a\x0f\xe4\xf6\x5b\x36\xb2\x44\x81\x06\x00\x2c\xa3\x0a\x61\xd2\xe8\x2f\xe5\xe6\x85\x26\x9a\x4e\xb1\x70\xa1\xd6\x65\xce\x6a\xe8\xf5\x39\x75\x30\xe1\xca\xcf\x38\x22\xec\xd6\x72\xca\x29\xfe\x80\xdd\xe8\xcd\x60\xe7\xf7\xa3\x30\x76\xf1\x71\x2a\x76\x26\x89\xcc\x27\x5c\xe0\xf4\x61\x1d\x61\x7b\xc7\xf5\xf3\x1e\x68\x45\x93\xf8\xc0\xba\x54\xc3\x19\x11\x5d\x26\x73\xcb\xf4\xa9\x88\x49\x34\x46\x70\x4a\x86\xb0\xfc\xb2\x28\xa4\x32\xcb\xef\x62\x3e\x32\x6a\x48\x1c\x24\x00\xba\xda\x89\x54\xa4\x11\x27\xda\xe2\xa1\xde\x82\x1e\x54\x2f\x77\x2c\xe2\x59\x75\x54\x1d\x6b\xc0\x22\xfd\x1e\x2d\x1e\xa5\x2d\x03\xa3\x83\x3d\xa0\x90\x5c\x45\xd5\x46\x88\x97\x80\x6b\x92\x4b\x6d\xa0\xfa\x3f\x44\x80\x32\x01\x65\xbb\x19\x1c\x66\xdb\x6d\x6d\xf9\x6a\xab\x1a\x7c\xd1\xf1\xef\x6d\x4b\xab\xe3\xf3\xbe\x05\x1b\x13\x8d\xf5\xee\x1f\x2a\x8b\xdb\x73\x9f\xe0\x8e\x58\xb7\x78\x88\x00\x0f\xb2\x46\xdb\xbb\x97\xf6\x05\xd1\x30\xf7\x51\x10\xd5\x06\x5b\xb0\xbb\xf5\x7f\xba\x6b\x7f\xbf\x85\xef\xc9\x8c\xeb\x9b\xb2\xee\xce\xb4\x93\x9a\x5d\x31\x71\x4c\xc4\x36\xa4\x50\x1a\x52\x28\x0d\x0e\xae\xc1\xc1\xf5\xcc\x1d\x5c\x48\xec\x86\x3c\x4a\x3b\x5c\xb8\xc1\xa9\xf6\x18\xc9\x94\xb6\x49\x38\xbf\xbc\x9f\x43\x5a\xa5\x6f\x30\xad\xd2\xd2\xd6\x0f\xb9\x95\x86\xdc\x4a\x43\x6e\xa5\x7b\xde\xa7\x21\xc1\xd2\x90\x60\x69\x48\xb0\x34\x24\x58\x1a\x12\x2c\x6d\x28\x13\x0d\x09\x96\xba\x07\xb5\x5b\xd1\x6f\xc8\xb2\xb4\xde\x46\x37\x64\x59\x1a\xb2\x2c\x3d\xc2\x3a\x0d\x59\x96\x0e\x4a\x1b\x1a\xb2\x2c\x6d\xcf\x61\x86\x54\x4b\x43\xaa\xa5\xc1\xbb\x34\x78\x97\xbe\x4d\xef\xd2\xb7\x94\x6f\x69\xf0\x0b\x1d\x54\xd2\xa5\xdd\xb8\x85\x86\xf4\x4b\xbb\x8f\x32\x59\xe7\x70\x7b\x7e\x31\x35\x2b\x6d\xe2\x8f\x17\x58\xb3\x5b\x1b\xca\x90\x8d\x69\xc8\xc6\x34\x64\x63\x1a\x14\x8e\x41\xe1\x18\x14\x8e\x03\x52\x38\x9e\x7e\x4a\xa6\x9a\x42\x31\xe4\x65\x7a\xe4\xbc\x4c\x3b\xd7\x27\xbe\xc5\x0c\x4d\x2b\x75\xe4\x21\x4d\xd3\xc0\xf6\xc9\xc0\xf6\x07\xb6\x7f\xf0\x28\xf6\xc1\x86\xf8\x64\x59\xfe\x63\xd8\x0f\x87\xd4\x4d\xfe\xe1\x90\xba\xe9\x41\x52\x37\x0d\x99\x9b\x06\x53\xf3\xe1\x98\x9a\xa3\x09\x7f\x53\x39\x9c\x9e\x70\x0a\xa7\x2e\x19\x64\xc8\xe3\xb4\x66\x84\x43\x1e\xa7\x21\x8f\xd3\x90\xc7\xe9\xe9\xe6\x71\xea\xb0\xb9\x0e\xc9\x9c\x86\x64\x4e\x43\x32\xa7\x21\x99\xd3\x90\xcc\x09\x1f\xdf\x5f\x21\x1b\x32\x3a\x3d\xc6\x06\x3c\xf7\xb4\x4e\x52\x27\x34\xe3\x62\x36\xbe\x7d\x33\x7e\xa7\xa4\xd6\xce\x4d\x83\x36\xe9\x0b\x36\x65\xca\x72\xbf\x35\xfc\x7c\xcd\x5b\x15\x4b\x77\xd2\x5a\x2d\x01\x80\x04\x64\x8e\xd5\x11\x79\x6a\x85\xcc\xe9\xc2\x71\xfe\x29\x03\xe6\xe0\x57\x65\xc7\x7e\x28\xef\x74\xaa\xe2\x7e\x61\xb4\x5b\x24\x71\xe8\xeb\x81\x69\x7c\xe8\x8f\x0f\xe8\xdf\xb8\x3e\xda\x5f\x0c\x75\xd7\xb4\xde\x9e\x9c\x54\x26\x6b\x3b\xb1\x54\x26\xfa\xa4\xd4\x4c\x1d\xcf\x4a\x9e\xb2\x13\xb7\xed\x9c\x29\xfd\x1d\x38\x6c\x77\x2b\xf1\xc2\xf6\x34\xe7\xb5\xa3\xab\xf2\x57\x4b\x29\xec\xe1\xce\xce\x65\x7a\xea\x7e\xab\xd9\x4d\x9a\x4b\xe6\x05\xcd\xca\xa1\x49\xe6\xa1\x13\x52\xc8\x94\xd0\xd0\xcd\xe0\x79\x1d\x3c\xaf\x83\xe7\xb5\xb9\xec\xfb\xf5\xbc\x76\x38\x0c\x31\xfd\x8e\xdb\x1b\x3f\x92\xbd\xaf\x57\x98\x72\xeb\x82\x6c\xeb\x17\xee\x41\xc8\x3a\x9d\xc2\x13\x36\xa7\xb7\x5c\x96\xca\xa9\xd7\x9e\x72\xed\x7b\x45\xec\x9c\x8f\xa9\x48\x8f\xd1\x88\xb4\x73\x5c\x59\x9f\xb5\xe9\xf6\x30\x7b\xfc\x75\xbb\x8d\x3e\x26\xf4\xfd\xad\xd2\xbb\xf5\x04\xfb\x79\xb6\x3b\x80\x57\xb1\xb7\xd5\x4e\xe0\xcd\xfc\xbf\x3d\x56\xf9\x23\xd7\x66\x0d\x3b\xf5\xba\xc8\x4a\x1e\xea\xee\xaa\x1e\x78\xe9\x41\xf3\xd2\x36\x6d\x6d\x07\x7b\xbd\xb2\xef\xdd\x91\x81\x7b\xe9\xe2\x83\x08\xf1\x5c\x44\x08\x4b\xa7\xfa\x0b\x10\x70\x94\x83\xf8\xb0\xb9\x4e\x83\x47\xba\x4b\x89\x39\x00\x56\x01\xe4\xfb\x01\xd9\x45\x07\x56\xc8\x65\x97\x48\x76\xa4\x7d\xe5\xf4\xeb\x05\x03\xdb\x54\x17\xed\x2a\x8b\x82\x29\x92\xf1\x9c\x9b\x2a\xb9\x61\xe9\x5d\xd7\x85\x4c\x9d\x69\xdf\xf9\x32\x34\x33\x1e\x8a\x56\x0d\xe8\x8f\xf6\x57\x77\xe9\x74\x4e\xb3\x0c\x6d\xe1\x82\xfc\xcc\x85\x1f\x46\x83\xf4\xa1\xd8\x61\x07\xc0\x85\xf9\xf1\x87\xf6\x9b\x62\x39\xc9\x2c\x26\x64\xb5\xab\x52\xf5\xdd\x31\xc5\xa8\x65\xb0\x14\xca\xbb\x35\xb3\x56\xbe\xb5\x91\xe4\x6e\xce\x93\x79\x63\xbe\xb0\x18\xf0\x4f\x92\xca\x3b\x81\xbe\x33\x97\x53\x0c\x5e\x7a\x63\x17\x6e\x4c\x48\xe3\xcb\x91\x01\x72\xc2\xc8\xeb\xe0\x49\xce\x8a\x39\x25\x53\x46\x2d\x49\x21\x33\x6a\x18\xf9\xeb\xf9\xe9\xa5\xed\xff\x4a\xfe\xbf\x4c\x49\xf4\x72\xd2\x49\xc6\x52\xf4\xff\x18\x92\x31\xea\x12\xea\xa0\x8a\x40\xa4\x22\x1f\xbc\xcd\x3c\x67\x46\xf1\xa4\xee\x3d\x1a\x13\x72\x89\x87\x14\x46\x92\x18\x08\x0b\xd3\x24\x93\x62\x06\x36\xf7\xb8\x4f\xd7\x01\x12\x74\x1e\x65\xe8\xdb\xf9\x2e\xc2\x2a\x5e\x51\x35\x63\xe6\x02\x48\xdc\xbd\x04\xe2\x75\x06\xc2\x75\xe4\x4f\x05\x83\xa0\x91\xb8\xb1\x95\x75\xef\x8f\x6b\xd8\x3a\xe4\x27\xca\x18\x55\xa2\x16\xd5\x18\x98\x5d\x22\x85\x2e\x73\x04\xf9\xd9\x8d\x83\xf6\xf6\x0a\xd9\xd6\x29\xd3\x96\x7e\x36\x6f\xdb\x64\x41\x4a\x70\x26\x5b\xce\x06\x87\x20\xce\x52\xb3\x42\x9f\x30\xb0\x82\xef\xce\x3f\x7f\x36\x3c\x73\x26\xe2\x73\xa6\x12\x2b\xda\xcd\xba\x8c\x65\xf8\x32\xa1\xb7\x4c\xd1\x19\x23\xef\xce\x3f\x93\xb2\xea\x86\xbc\x0c\x6c\x1a\x21\x2f\x94\x14\xa1\x67\xbc\x2d\x3e\xcf\xd3\xbb\xf3\xcf\xaf\x88\x04\x7c\x6a\x96\x61\x16\x51\x99\xea\x3f\xda\x73\x6e\xa9\x43\x95\x41\x07\xa7\x0f\xf7\x85\x44\x5b\xe8\x13\xd8\xfb\xb4\x4f\xa5\x5e\xf2\x32\x6f\x79\xe2\x7a\x72\xaf\xc6\x69\x1c\xb5\x13\xd4\xfd\x9a\xe8\x3a\xfd\xd3\xfe\x94\x39\x94\xc2\x7a\x5e\xd1\xcd\x2a\x5c\x77\x5b\x9e\x1d\x3f\x98\x55\x87\x27\x9c\x06\x7b\x12\x46\x64\x93\xa3\x34\x22\x6c\x3c\x1b\x93\xff\x78\x1d\xe7\xbb\xa2\x22\x7c\xca\x4e\x94\x6b\x77\x59\x84\xbc\x23\xff\xf1\xfa\x37\x08\xd5\xd0\xf5\x8e\x76\x4e\xb4\xdc\xa4\x7b\xb2\x1f\xbf\x44\x2d\xfc\xc5\xdf\xf9\x9c\x0a\x3a\x8b\x7c\xaa\x6d\xbc\x7e\x47\x63\x77\x54\xa7\xe7\xd8\x97\x69\xd4\x63\x8e\x3d\xa3\xda\x20\x5b\xe4\xcb\x1e\x80\x7b\x88\xc8\xd0\xdd\x3a\xfe\x60\x3f\x4c\x0c\x77\xb0\x87\x15\x17\xd7\x33\x8e\x65\x09\xea\x8f\x21\x42\xbb\x21\x47\x38\x30\x92\x92\x19\x99\xcb\x3b\x22\xa7\xc6\xf9\xda\x1b\x3c\x01\x10\x25\x54\xcc\x56\xc6\x29\xca\x09\x20\x46\xd2\xbf\x30\xc1\xd0\x82\xdf\x25\x13\x49\x0d\xaa\xbc\x3d\x98\xb3\xf0\x12\xf1\xfd\x6c\xb8\x9b\xbf\xff\xed\x8e\x09\x71\xf3\x86\xad\x39\xc0\x3b\xa2\xc6\x70\xae\xd6\xa1\x82\x80\x13\x47\xe9\xe3\x28\xf1\x5c\xcb\xa3\xa4\xea\x48\xda\xc1\xae\x73\xd0\x76\x9d\xc1\xc0\xf1\x5c\x0c\x1c\xf7\xf4\x91\xec\xdd\xdb\xdd\x66\x4d\xd9\xb1\x93\x04\x88\x53\xa7\x4b\x24\x26\x1d\xce\x3d\xa2\xbc\x93\x1c\x68\xfc\xb3\x72\x8e\xe0\x9a\xf4\x77\x85\x54\xe2\xf4\xe3\xad\x07\xb9\x60\x34\x3d\x96\x22\x5b\x1c\xaa\xe3\x05\xd9\xe4\x3e\xec\x66\xd5\x19\xee\x60\xc2\x10\x43\x57\xc5\xb2\x80\x48\x55\x05\xb9\x80\x3a\xa4\x97\xd5\xe6\x4e\x66\xac\xb6\x95\x88\x3d\x24\x5c\x07\x4b\x92\x13\x04\x1d\xc3\xdd\x8f\x02\x7b\x0f\x29\xa7\x1b\x01\x5d\xb5\x6a\x26\xcc\x6d\x53\x3e\xf7\xb8\xda\x34\x31\x25\xcd\xa2\xc5\x0e\x02\x6a\xb5\xea\xf1\x8d\xdd\xed\xa2\xc7\x34\x89\x65\x2c\x31\x9d\x20\xe4\x8c\x4e\x58\x46\x7e\x2d\x99\x5a\xa0\xea\x5b\x19\x50\x9d\xb8\x95\x53\xe3\xec\x89\x41\x93\x02\x50\x6c\x85\x99\xd5\x34\x67\xbe\x3a\x0b\xf6\xe7\x3f\x0e\x71\x05\x3e\x1d\x31\x8a\x24\x38\x33\xc0\x65\xdf\x4a\x6e\x97\xc5\x28\x69\xc9\x0a\x08\x7e\x93\x85\x93\x24\x1c\xb8\xd1\xbd\xe4\xed\x2b\xbe\x2b\xfb\x41\xd7\x91\xfb\x2e\xcc\xe0\xb8\xa0\x8a\xe6\x44\x2f\x84\xa1\x5f\x23\x5a\xe8\x3c\xc5\xf5\xb1\xe9\x9e\x98\x2a\x78\x4b\x7f\x07\xff\x39\x0e\x2f\xef\x16\x58\xa5\x76\xaa\x1b\xfc\x80\x40\xcb\x77\x08\x15\x64\xca\x03\x1e\x7f\x06\x23\xe9\x65\xb3\x5e\xc1\x12\xfc\x70\xdd\x7b\x11\xf8\xdc\x2a\x80\xde\xfa\x48\xa4\x88\x63\xf2\x9c\x39\xf6\x46\xc8\x3b\x80\x25\xfe\x3d\xac\xf0\xc8\x6e\x58\x65\x57\xe3\xa2\x12\x15\xad\x78\x0e\x06\x6e\x3d\xf2\xd4\x12\xa2\x03\x68\x32\x47\xd3\x49\xdd\x66\x89\xdf\x75\xa6\xc0\x97\x60\x79\x79\x77\xfe\x99\x48\x45\x72\x96\x4b\xb5\x78\x35\x26\x70\x84\x50\xb2\xaf\x32\xb3\xa3\x31\x26\x25\x46\xce\x30\x24\x69\xc2\xa6\xf6\xa0\x60\xac\x7d\x22\xf3\x82\x2a\x34\x79\xdb\xaf\x61\xff\x63\x42\x2e\xcb\x64\xee\xe6\x85\x91\x08\x93\x92\x67\x78\xb8\x1b\xf3\x13\xae\xa8\x91\xcf\x58\xec\xb5\x2e\x57\x95\x07\x02\x29\xa4\x2b\xd6\x22\x35\x8b\xaa\xc9\x18\x49\x84\x3d\xd5\x19\x29\x98\x3a\xb6\x73\xf6\x1f\x44\x9b\x91\x1d\xd0\xf5\x91\xbd\xa1\xd7\x47\x24\x54\x33\xf8\x45\xb8\x88\xeb\x6b\x67\x18\xbd\x3e\x82\x1a\x12\x51\x82\x37\xcd\x4c\x0f\x12\x97\xf8\x8d\xef\xb2\x0f\xf9\x76\x6d\xc9\xf9\xa3\x1f\x45\xb0\xa8\xc6\x24\x0f\x26\x02\xe3\xdc\x0b\x90\x52\x74\x15\xa3\xe1\x82\x60\x40\xe7\x4a\xf8\xfd\xba\x11\xe0\xc8\x4f\xf1\x10\x45\xf6\xc7\x5e\x16\xeb\xe5\xd7\xfc\x48\xdd\x31\x46\x7d\xcd\x47\xd7\x3b\xb3\x61\x73\x02\xee\x72\xd1\x44\x49\xad\x5d\xea\xf7\x8c\xdd\x52\x61\xfa\xd9\x2c\xa3\x70\x2d\xaf\xf8\x2e\x7d\xc3\x0b\x06\xb6\xc3\x9d\xb3\xa6\xda\x62\xfc\xc3\x7e\xff\xde\xca\xd5\x38\x70\xf2\xff\x55\x52\x61\xb8\x59\xac\x15\xa1\x97\x47\xb0\x97\x8d\x80\xc5\x57\xf4\xce\x75\xf7\xd2\x8a\x00\x8c\x02\x7c\x79\xfd\xbe\xbc\x1a\x11\xcd\x73\x9e\x51\xe5\xe9\x50\xb8\xf6\xee\xa3\x51\xad\x98\x2d\x9c\xde\x70\x8f\x46\x6d\x37\xff\x21\x18\x50\x97\x34\xb7\xf6\xbd\x46\xe6\x30\xcf\x0d\xc2\x86\xed\x89\x0b\x51\x62\x29\x70\xd6\xa0\x6f\xf7\xe1\x4d\x87\xca\x50\x9e\x03\x9f\x70\xfb\xb0\x31\x99\x5e\xf9\x9e\x9f\xc1\xd2\x71\x3b\x28\x42\x0d\x6e\x7d\x10\x74\x20\x7a\x6d\xc2\x42\xf0\x2e\x9f\x92\x2f\xcb\x44\xef\x0b\xc4\xc9\x6a\x16\x64\xf4\x2a\x01\x89\x5d\x7d\x4f\x6a\x62\xa4\xc7\xbe\x5c\x53\x8f\xc9\x0d\x5a\x86\xb0\x9f\xfd\x7e\x20\x7e\x10\x4e\x41\x55\x10\x43\x33\x63\x8f\xdb\x8c\xaa\x34\x63\x5a\x57\x97\xb0\x7b\xbf\x0f\x49\x10\xdb\x96\xbd\xb5\x9c\xb1\xfd\x73\xbf\x21\xf6\xab\x7b\x43\x87\xd8\xaf\x21\xf6\xcb\xdd\x17\x0f\x06\xeb\x69\xa5\x68\x6b\xbe\xd6\x38\xe1\xa8\x1b\xe4\xba\xd1\x5a\x26\x1c\x6a\xb9\xb9\x14\x05\x8b\x48\xe2\xf2\xfe\x96\x97\x96\xb7\xb2\xaf\x34\x2f\x32\x46\x32\x26\x66\x58\xa5\xfa\xd7\x92\x95\x40\xbc\x92\x4c\x96\x56\xa0\xd2\x9a\xce\x2c\xf9\xd4\x4c\xdd\xf2\x84\x41\xb2\xf4\xff\x75\x7e\x89\x8e\xb2\x4c\xd2\x74\x42\x33\x2a\x12\xa6\x88\x2a\x85\x00\xc1\xad\x34\x9a\xa7\xb0\xe7\xae\x2c\xe7\xab\x71\x2d\x77\xda\x7d\x35\x79\x9c\xeb\xa7\xee\xa3\x57\x35\x6c\x23\xd5\x1e\x96\x77\x2f\x8d\x19\x3b\xb9\x5c\x61\x8e\xbc\x0f\x4e\x98\x4e\x58\x16\xfa\x5d\xc7\xe0\xeb\x43\x40\x0c\x0e\x9a\x78\x02\xad\xa4\x81\xed\x21\x6c\x42\x33\xc5\xc1\x6a\xe4\xb2\xfb\xcf\xf8\x2d\x13\x6e\x41\xd6\x42\xda\x0e\x5a\xad\xf5\x5a\x40\x10\x67\x66\x99\x9c\x54\xf8\xcb\x97\x20\x85\xfc\xea\x3e\xf5\x6a\x4c\x7e\x2e\x4d\x49\xb3\x6c\x41\xd8\x57\x7b\x50\xf9\x2d\xc3\x0b\x83\x88\x33\xf8\xc2\xda\xc5\x78\xc4\x55\xe8\xd4\xea\xb7\x9b\x73\xbc\xb8\x5b\x28\xde\xd1\xc5\xdc\x23\xed\xec\x52\xb0\xdb\x9a\x77\xeb\xd5\xf5\xb3\xd2\x9b\x8e\xf6\x51\x28\x9f\x96\x0e\xe0\xe5\x7c\x6f\x49\x46\xc8\xa0\xc7\x1d\xa5\xce\x68\xb6\x4e\xdb\x79\xcc\x29\x76\xeb\x37\xed\x37\x63\x1d\x75\xbf\x17\xa7\x09\xac\x19\x88\x32\x60\x92\x22\x84\x2d\x17\x41\x2f\x81\x1a\x21\x03\x07\x6a\x70\xa0\xcd\x29\xcf\xaa\xf3\xb8\x4b\x8a\xb4\x79\x38\xff\x2a\x90\xa2\x3f\xa9\xb5\x68\x7f\x44\xae\xad\x04\x11\x8f\x5c\x14\x84\x7d\x62\x15\xa4\x04\x08\x3a\x02\x3f\x75\xec\xcb\x44\x57\xa6\xcf\x79\x58\xa9\xa6\x56\xe6\xcb\x23\xc4\xd4\x92\xc7\x98\x4c\xa8\xdd\x40\x97\x14\xcb\x5b\xd5\x82\x49\x71\xc0\xd2\x0d\x58\xba\x01\x4b\xd7\x42\x88\x1f\x09\x4b\xe7\xbf\xec\xa9\x89\x7e\xae\xf9\x07\xd6\x93\xdf\x4e\xc4\x9d\x76\xe9\xbe\x4d\x55\x3f\x3a\xa9\x28\x6e\x84\xc3\x2b\x03\x10\xef\x59\xa6\x2a\xe8\x58\xc6\x6e\x90\x9e\x0e\x19\xf1\x63\x31\xeb\x9b\xc9\x5e\xf0\xc3\x16\x29\xec\xfb\xae\xfe\x3b\x29\x30\x9b\xfb\xe6\xc2\x44\x78\xb5\x01\xc7\xb3\xbb\xe5\x64\xd1\x55\x62\x08\x35\x84\x92\x84\x29\x48\xa3\x06\xb4\xba\x07\x8f\xcf\xa8\x36\x57\x8a\x0a\x0d\x1f\x7d\x8c\x20\x90\xfa\xd7\x43\x34\x69\x2d\x3c\x24\x09\xab\x62\x42\x6b\xe6\xd2\xcb\x4b\xc1\x3c\x74\xce\x48\x42\x05\x24\x0b\x5e\x45\xdd\xb5\xee\x8e\xbf\x72\xad\x90\xb5\xce\xcb\x9c\x8a\x63\xc5\x68\x0a\xee\x4a\xf6\xb5\xc8\xa8\xcb\x79\xe9\x8c\xdd\x96\xcd\xa6\xcc\x50\x9e\xe9\xe8\xc6\x54\xe3\xdc\x53\xbe\x59\x15\xf2\xcd\xa2\xb0\x08\x7f\x79\x12\x18\xd6\xeb\x85\x76\x2b\x19\x86\xb3\x85\x76\xd2\x4e\xae\xd6\x92\x93\x3a\xf2\xb7\xda\xbe\x97\x57\xca\xca\x66\x3f\x61\x62\xe6\xcf\x02\x3c\xdf\xaf\xb6\x00\xb9\x60\x9b\xb5\x80\x96\x45\xc1\x1a\x97\xc8\x13\xb9\x30\x9e\xdd\x1a\xa0\xe1\xfd\xe5\x75\x7b\x00\xa5\xa5\x23\x71\xca\x1a\xc5\x85\x92\x21\xab\xca\xf3\xd0\x18\xfa\x64\x55\x81\x36\xcd\xd4\x9e\x8f\x92\x62\xa5\x43\x09\x8f\xba\x1e\xf2\xac\x7c\xb3\xaa\x53\xaf\x3c\x2b\x2b\x15\xa7\x21\xef\xca\xde\x05\xdd\x8e\xd8\x92\x35\x6f\x35\x38\xb3\x0f\x01\x99\x96\x02\x60\xf6\x34\xe3\x66\xe1\xc5\x87\x15\xdd\xec\x34\x67\x4b\xd4\x32\x54\x39\x59\x9b\xc6\x65\x83\x84\x26\x65\x01\x80\x97\x2a\xa1\x0b\x00\x5c\x20\x82\x21\xdf\x67\x36\x17\x34\xf9\xf5\xb2\x7a\x37\x32\xf1\xd7\x14\x6b\x0c\xc2\x71\x73\x94\xa4\xd4\x58\xf1\x81\x66\x49\x69\x19\x69\x6d\xff\xea\x46\xcb\x97\x60\x79\xa4\x5f\x79\x5e\xe6\x8d\x9f\x22\x08\x92\x1f\x41\x9c\xa2\xc2\x43\xe3\xdb\xfb\xc5\x14\xe9\xf8\xf9\x94\xe4\x65\x66\x78\x91\x2d\x3c\xd1\x06\x03\x2c\x99\x30\x73\xc7\x5c\xe8\x77\xcd\xb9\x86\xb9\xe2\x9b\x8e\x05\x17\x48\xbe\x9c\x58\xc0\xc1\xd6\x3e\xa8\x99\x1c\x45\xd8\x44\xf8\xae\x36\x24\x65\x89\x95\xbd\x43\x74\x89\xe5\xa0\x61\x90\x5c\xe0\x8f\x29\xca\x16\xb7\x3c\x61\x40\x13\xe8\x98\x90\x4b\x86\x2b\xc7\x45\xca\x6f\x79\x5a\x56\x7e\xab\x08\x28\x85\x4b\x9f\x7b\xaa\x5f\x57\xcc\xe7\xf2\x0e\xe1\x9d\x20\xe9\x56\x5e\x1f\x18\x97\x03\x4d\xed\x91\x75\x3b\xd7\x5c\x54\xd0\x8e\x6c\xc3\xad\x87\x9c\x43\x43\xce\xa1\x8d\xd1\x69\x6b\xed\x5a\xb5\xa1\xa0\x21\x44\xd7\x83\x65\x22\x91\xce\x01\x70\xf0\x82\x46\x4e\xaf\x80\xf7\xad\x68\x5f\x70\xa1\x04\xa8\x4b\x22\xb3\x8c\x25\x06\xee\xb7\x26\x77\x2c\xcb\x08\x9e\x36\x8c\xb1\xcb\x16\x2e\xc5\xc4\xb2\x3f\x67\x9b\x6a\xd1\x0f\x97\x48\xa7\x97\x6d\x71\x73\xb6\x8f\x36\x81\x76\x95\xbc\x57\xe6\x9d\x7e\xc8\x6f\x54\xed\x3b\x53\xc8\x84\x86\x41\x70\xc4\xba\x31\xd1\x0f\x7e\x23\x1c\x6d\xa9\xe5\xee\xa8\xb0\x5b\x56\x8c\xc7\x73\x35\x5a\x51\x44\xd4\x55\x60\x46\xec\x7b\xd4\x3f\x55\x70\x47\x1f\x5e\xbf\xaa\x0c\x94\xf7\x21\xdd\x6e\xef\x7e\xee\x25\x67\xd4\x1b\xd7\xcc\x7c\x8a\xd1\xb4\x32\x70\xc6\xde\xca\x2a\xc7\xcb\xba\xbc\x29\x7b\xe0\x6a\x35\xcb\xcd\x7d\x16\x67\xb3\x84\x46\x31\x97\xb9\x57\x8e\x23\x20\x48\xb0\xb8\xda\x0a\x41\x4b\x69\x72\x0e\x23\x07\x52\x93\x9d\xdf\x2b\x35\x52\x35\xe5\x48\x36\xdc\xff\xc4\x1f\x35\x81\x52\xf8\x70\xbb\xd9\x7c\xe3\xac\x4a\xa3\xc3\xcb\xaa\xb4\xfc\x82\x9f\xeb\xf3\xc9\xb7\x34\x6a\xe5\x5f\xbb\x64\xe5\x91\xb0\xbe\x9a\x6f\x57\x8d\x02\x4c\xa4\x01\x53\x0e\x90\x92\x10\x6c\xe6\x91\x58\x10\xce\xf3\xc5\x8e\xf0\x0b\x30\x41\xa8\xaf\x0c\xcc\x0f\xa2\xf3\x21\xae\x9e\xb3\x2c\xad\x03\x85\xad\xb8\x2a\x45\xc2\x5e\x6d\x12\xd3\xe5\x63\xee\x76\x23\x65\xae\x0d\x41\x5f\x0b\x56\x0b\xe1\x61\x41\x9a\x04\x68\x3c\x0a\x80\x4b\x31\x37\x2f\x7d\x25\x2e\x94\x02\xba\x42\xfb\x5e\xb5\x05\x05\x6e\x10\xee\xe7\x3d\x2f\xfd\xc3\xfd\x0e\x35\xda\x2f\x24\x71\xa0\xa2\xa1\x62\xd9\x81\xb8\x1c\xba\x5e\xad\x72\x94\xeb\xaf\xe7\xa7\x61\x63\xbd\xc4\xe1\xdf\x9a\x66\x74\xb6\x82\x38\xf9\x0a\x69\x3b\x39\x59\xad\xd1\x02\xeb\x0e\x54\xa8\xcf\x16\x1f\xa3\x3a\xa4\xd5\x17\xcc\xee\x0f\x6d\xb5\x2a\x2d\xe8\xab\xba\x86\x59\x0c\x17\x39\x36\x2b\x24\x32\x87\x7b\xaa\x64\x0e\x59\x06\xa4\x80\x1c\x25\xab\x63\x02\x1e\x38\x00\x61\x15\x47\x01\x6a\xb8\x8b\x2d\x0b\x50\x9d\x7e\x1b\x16\x5c\x01\xd5\x76\xb9\x7d\x6a\xbb\xa7\x37\x6b\xc3\x37\x46\x64\xce\x8d\x3e\xb6\xd7\x42\x33\xcb\x04\x80\xca\x0a\x72\x26\x66\x0a\xc2\xe1\xe0\x95\x55\x6b\x60\x6f\xcc\x4e\x56\xe0\x5c\xa6\xba\xf7\xfc\x81\xe3\xaf\x9f\x7d\xbf\xf0\xe3\xda\x3a\x80\xab\xda\x95\x9b\x3b\x2e\x94\x4c\x98\xd6\x2c\x8d\x56\x66\x97\x69\x33\xb0\x93\x15\xab\xaa\x76\xc9\x68\x36\xe6\x2f\x8f\xc2\x55\xee\x11\x2e\x7e\xa8\xfc\xe3\x7e\x00\x02\x1f\x9e\x51\x37\xb1\x86\xcc\x26\x67\x26\x12\x68\x40\xe6\x99\x92\xeb\xe5\xf4\x00\xd7\x47\x23\x72\x1d\x82\x1a\xf0\x2f\x24\x36\xf8\xef\x73\x1c\xb1\x54\xe4\xfa\x28\x7e\x07\xb6\x23\xa7\x45\x01\x93\x83\x2b\x56\x97\xa6\xdc\x36\x79\x62\xff\x49\x1a\xf6\xb6\x7d\x00\xc4\x4f\xa7\x5a\x4d\x2c\x7a\x8d\x3d\x38\xee\x78\xec\xcd\x96\x4b\xec\xb3\xb2\x5d\xee\x01\x34\xb1\x07\x51\xb7\xcb\x48\x55\x8b\x2c\xa9\xdb\xa4\xac\x12\x75\x5c\x37\x4a\x34\xe4\xdd\x83\x13\x57\x7b\xe4\xe4\x3b\x68\x71\xf5\xb9\x93\x9b\x7d\x4a\x96\xdd\x7b\x3f\x48\x96\x07\x25\x59\x76\x6f\xd8\xf3\x96\x2c\xbb\xe7\x3f\x48\x96\xdb\x4b\x96\xdd\xab\x3b\x48\x96\x4f\x43\xb2\xf4\xe7\x6f\x4f\x72\x65\x95\x5a\x45\x0f\xb2\x65\x3f\xd9\xb2\xc5\x40\xb0\x5a\xc2\x5c\x6e\xdc\x27\xfb\x43\x8d\xc0\xef\x88\xb2\x77\xe3\x76\x1f\x31\xae\x99\x6e\x97\xe3\xae\x23\x95\xd1\x83\xc5\x06\xef\x2c\x0b\xc5\xaa\x74\xb8\x0f\x12\xfd\xab\xa3\xb8\x5f\x13\xb2\xda\x1e\x33\x91\xc8\x14\xfd\xdf\xb9\x53\x83\x3c\xba\x32\x3a\x9a\x8d\x8c\xba\x1e\x88\x13\x87\x03\x93\x7f\x5a\x62\x00\x39\x9e\x38\xc8\x99\x05\xb5\xbc\x17\x10\x2b\x82\xd0\x14\x7d\x1e\x96\xfa\x52\x45\x73\x66\x58\x48\x23\x15\x50\x17\x00\xb2\xad\xf0\x50\x21\x14\x39\x34\x48\x24\xa8\xc9\xf0\xa5\x52\xc0\xb7\xfe\xab\xd4\x26\xea\x05\xf6\x2f\x86\x99\xd9\x8f\xcc\x28\xba\x29\xb0\x9b\xb5\xc9\x22\x1e\x15\xd7\xe2\xee\x44\xe5\x2a\x05\x8d\x35\x6d\x4b\x67\xb0\x66\x0a\x4f\x30\xdf\xc5\x16\x74\xbf\x99\x94\x6f\x45\x6c\x79\xbc\x24\x7b\x63\x13\x5d\x86\x88\xe5\xc6\xdd\x89\x2e\x06\x5e\xb1\x59\x02\xbc\x9d\x30\x8b\x27\x9c\x19\x63\x05\x49\x18\xd8\xdf\x43\xb3\x3f\x2f\x54\x2f\xcb\x86\x7b\x67\x8c\xe3\x81\x33\xee\x91\x95\xec\x2d\x4d\xc9\x92\x47\x6e\x35\x27\x69\x36\xdd\x50\xdd\xd8\x93\x45\x65\xd7\x06\x95\xee\xa0\x8f\x7d\x51\xb5\x81\xa8\x3d\x43\x99\xfe\xa0\xb3\xe1\xed\x47\xa6\xe9\x49\xfa\xd6\xc9\xcc\xb5\x55\xdb\x13\xb9\xeb\x12\x9c\x9b\x4d\xb7\x11\x9b\xf7\x43\xf3\x9e\x5d\x3e\xb9\x27\x67\x7f\x19\x48\xf5\x7a\xf9\xb3\x29\x2a\x3c\x29\xe9\xf3\x5e\xf4\xab\xed\xe6\xed\x92\x80\x6d\x58\xca\x68\xa8\x60\xf4\x6d\x55\x30\x1a\xea\x03\x0d\xf5\x81\x1e\x5d\x74\x3c\xb8\x7a\x10\x5b\x16\x50\xd8\x23\xdd\xee\x12\x3e\x0f\xa8\xf0\xcf\x37\x5a\xe2\x67\x28\xa0\x33\x14\xd0\x19\x0a\xe8\x0c\x05\x74\x56\x9f\xb1\xdd\xb1\x87\x1f\x86\x52\xa5\x83\xa0\x3f\x94\x2a\xdd\x8f\x2a\xb2\x03\xdf\xd1\x0f\x0e\xf5\x7f\xd5\xb2\x14\xed\xce\xa2\x2a\xc0\x75\x49\x66\x6e\x33\xa0\xdc\x9f\x40\x2d\x3b\x92\xf6\x51\xd4\x6b\x35\xa1\x1a\x4a\x5a\x3e\x71\x79\xb7\x27\x3d\x79\xf7\xd8\x25\x2d\x77\x78\x9d\x81\x8d\xf7\x89\x6d\xa9\xf2\xba\x56\x39\xcc\xea\x87\xb4\xe3\x52\x6f\x46\x16\x57\xd9\xa1\x1f\x4f\xee\x79\x00\xba\x32\x14\x0b\xdc\xe8\x36\x0c\xc5\x02\xd7\x4e\xeb\x99\x17\x0b\xfc\xe1\x5b\x2f\x16\xd8\x17\xa6\xb1\x43\x6e\x71\x16\x4e\x4c\x8f\x42\x47\x24\x9c\xaf\x9a\x04\xe8\x7e\x9c\x2c\x90\xae\x5b\x29\x20\x38\x06\xbf\x39\x11\xd6\xbd\xb7\x3c\xdb\x3d\xde\x93\x27\x5a\x18\xee\xa9\x0b\x3d\x4f\xf8\x32\x6e\x7d\x98\xfd\xd6\xed\xf2\x34\xbb\x84\x9f\x5c\xcc\xce\x65\xc6\x93\xc5\xba\x2c\x89\x8d\xa6\x2e\x1f\x39\x2a\x3c\x05\x3e\x72\x89\x27\x4b\x6d\xc8\x5c\x66\x29\x31\xca\xed\x2a\x8d\x14\xa9\x82\xfa\x5c\xf6\xb7\x34\xeb\x71\x64\x0b\xa6\xb8\x4c\x2f\x01\xab\xd2\x95\xa8\xed\x3c\x6e\xdb\xa0\x38\x77\x5c\xa4\x90\x0b\x0c\x13\x8e\x45\x49\x82\xe7\x61\x02\xce\x6a\x12\x06\x3f\x26\xf5\x1e\x61\x6a\x13\x46\x66\x8a\x51\x40\x17\xcc\xa9\x20\xff\x66\x4a\xa2\x4a\xe8\xf2\x24\x0b\xcb\x83\xd8\xaf\x25\xcd\x20\x2b\xeb\x1f\x5e\xbf\x26\x2f\x7f\x7c\x4d\x72\x2e\x5e\xed\xde\xb5\xd7\x1d\xbe\x77\xe5\xa2\xdd\x3c\x52\x01\x97\x65\x51\x53\xa2\x70\xfe\x5b\xd8\x44\x6e\xdb\xcc\xe3\x8d\x01\xa0\xfd\xba\x76\xf1\x69\xee\xcb\xc4\xb9\x94\xa3\xb8\x15\x5c\x5b\x25\x34\xe7\x26\x4a\x86\xe7\x86\x46\xce\xcc\xea\xe5\xdf\xc9\xaa\xf6\xbc\x99\xcd\xb2\x19\xb7\xcd\xea\xe7\xf5\x03\xbb\x9f\xeb\x7a\x51\x66\x6c\x6d\x4e\xd3\x7a\xcb\x2a\x23\xaf\xae\x6d\xbb\xab\x3d\x85\x80\x18\x29\x18\x49\xb9\x62\x80\x15\x03\x20\xac\x66\x04\x5f\xa7\x8a\x11\x5a\x14\x99\xbd\xbf\x74\x6a\x20\x17\x31\x26\x2d\xb4\xbd\xbc\x6f\xa4\x47\x04\xd1\xcb\x1b\x11\x3c\x51\xff\xeb\xf9\x29\xf4\xb9\x80\x1c\x58\x98\x03\x39\x1e\xca\x2d\xcb\x64\xc2\xcd\xc2\x6e\xbb\x3b\xa1\x20\xd6\xc5\x07\x94\x33\x1d\xf5\x51\x28\x66\x35\x05\x32\xcd\x5c\xc6\x91\xfa\x9b\x08\x4c\xa2\x93\xca\x63\x86\x14\x60\x44\xb4\xc4\xfc\x01\xa6\x3d\xfd\xb2\x4b\x2b\x80\x4e\x28\x6d\xa8\x30\xd9\x62\x44\x9c\x67\x64\x84\xfd\xd2\x29\xd3\x81\x6d\xf9\xc2\x09\x6d\x5f\xc3\x14\x83\x52\x33\xd1\x87\xd4\xb9\x49\x76\xdc\x27\xdf\xac\x5e\x10\xa5\x90\xc6\x72\xa5\xc8\xf6\x03\xed\x20\xaf\xab\xbd\x5b\x2e\xf5\x18\x50\x81\xb4\x54\xd1\xe2\x8e\xc9\x69\x9c\x86\xd9\xd1\x42\x7f\xd9\x02\xe5\x1e\x61\x86\xbc\x3b\xae\x99\xdf\xd1\xda\x19\xf3\x56\xf6\x94\xeb\x84\xaa\x14\x3d\x88\x5c\xdc\xd2\x8c\xa7\xfb\xca\x80\xda\xc2\xc2\xa2\x3e\x37\xce\x82\x8a\xfc\x7a\x89\x17\xb6\x6d\x42\xdc\xb4\x8d\xba\xe2\xa2\xd7\xf9\x8a\x5b\xfe\x31\x39\x9b\xfa\x23\x36\x72\x41\x00\x90\xc5\xdb\x1d\xa8\x9f\xe9\x57\xec\x17\xc1\x78\xbe\xf7\xed\x4a\x21\x55\x27\xf2\x9f\x70\x20\xfb\x31\xd2\xcb\x95\x2f\x06\x43\x52\xb8\x38\xda\xfd\x50\x71\xd4\x02\xd3\xe4\x5a\xe5\x9f\x89\xd4\x65\xe5\x8f\xf3\x50\x0b\xab\x80\x29\x2b\xcc\xce\x79\x56\xd1\x80\xb2\xb0\x9c\xd3\xff\x85\x49\xce\xd7\x8c\xa4\x95\x1d\xc4\xac\xb7\x83\x33\xff\xf8\x7b\xcb\x99\xed\x91\x9f\xcb\x52\xbd\xaa\x6f\x4b\xa9\xd9\xf2\xd6\xe8\xb7\xe4\x98\xfc\xe4\xc6\xc8\x48\x59\xbc\x25\xaf\xc9\x4b\x3e\x66\x63\x22\x64\xe3\xfe\x73\x4d\x52\x29\xd8\xab\x71\xed\x15\x3b\xa9\xb7\xe4\xc7\xd7\xfe\xb5\x75\x74\xc3\xb6\xf2\x8b\x9b\x49\x31\xdb\x91\xf4\xb0\xc4\xe7\xee\xc3\x91\x86\xaa\xb4\x1d\x34\x7d\xa8\x31\x35\x54\xa5\x1d\x4a\x2b\x91\x3e\xfc\x7d\xa8\x4a\xbb\xb1\xf0\x33\x54\xa5\xdd\xe7\x32\x0e\x55\x69\xfb\x54\xa5\xfd\xe1\x5e\xc5\xba\x56\xae\xfe\x9f\x9d\x6e\xba\xb9\x2c\xe1\xdf\xec\xd4\x7a\xdd\xd1\xf6\x01\xb9\x82\x4c\xa4\x99\x93\xcf\x05\xb0\xbd\xf7\xf2\x4e\x54\xfa\xb0\x26\x2f\xa1\x73\xf7\x23\xfc\x1b\x5a\x40\xf2\x21\x0d\x05\x8c\x18\x94\xb7\xc9\x16\x7d\xdc\x09\xa1\x83\xdd\x1c\xe0\x86\x61\x60\xed\x91\x0d\x43\xe7\xba\x61\xff\x81\xdb\xef\x1f\xbd\x07\xf1\x7b\xbd\xa6\xc2\x31\x15\x53\x96\xc5\xfe\x9e\xd4\x41\x29\xe2\x32\x44\x88\x36\x44\xd3\x75\x24\xd7\xb6\x8b\xbe\x20\x19\xe3\xe7\xe6\x7c\x36\x67\x4b\xca\x44\xa0\x52\x50\x3f\xe0\xc7\xd7\xaf\x35\x92\x33\x2c\xc5\xb5\xa6\xe4\xcf\xe7\xe2\x71\x96\xfb\x73\xd1\xb1\xd8\x9f\x8b\x3e\x4b\xed\x17\xc4\x9e\xdc\xb7\xd7\x82\x90\xef\x43\xcd\x2e\xab\x7f\x40\x44\x13\x68\x39\xbf\x45\xa4\x44\xc1\x14\xf9\x7d\xd0\x21\xf0\x85\x54\x96\x80\xfa\x58\x2e\x86\xd0\x6c\xfd\xa9\x45\xa3\x41\x3d\xf4\x41\x75\x89\xa1\x3a\xf5\x50\x9d\x7a\xa8\x4e\x3d\x54\xa7\xde\x75\x75\xea\x95\x04\x67\xbb\xea\xd4\xf6\xad\xa1\x42\xf5\x73\xb2\x1e\x3c\xc1\x0a\xd5\xab\x0d\x72\xf7\xb1\x8a\x0f\x66\x94\xe7\x62\x46\x19\x2a\x54\xd7\x4e\xf4\x3d\x2a\x54\xef\x49\xe9\x3d\xf4\x0a\xd5\x93\x65\xa5\xbc\xd7\x99\xdc\x4a\xf1\x5f\x77\x48\x27\x8f\xae\xe3\xaf\xd4\xd7\x9a\x7e\xd1\x69\xe4\x2f\xaa\x3a\x46\x35\x99\x2a\xb6\xa4\x53\xc5\x24\x60\x28\x08\x3e\x14\x04\xff\xa6\x0b\x82\xaf\xbc\x65\xae\xb1\x5f\x74\xcd\x8c\xdd\xd5\x3f\xbc\xfe\x4d\x08\x86\x7d\x77\xfe\x99\x94\x55\xc0\xf4\x1e\x85\xae\xa1\xb6\xf8\x50\x5b\x3c\x34\xd2\xbb\xae\x2d\xbe\x3e\x98\xa5\xd3\xf6\x38\xd4\x16\xdf\x9f\xa9\x60\xa8\x2d\xfe\x54\x6a\x8b\xf7\x30\x2f\xdf\x87\x74\x3f\xbf\xda\xe2\x3f\x0c\xb5\xc5\x87\xda\xe2\x9b\x4d\x7c\xa8\x2d\x3e\xd4\x16\x3f\xf4\xda\xe2\x2d\x01\x3f\x5d\x45\x17\xab\xa6\x35\xd3\x7a\x08\xf2\xc1\x10\x7b\x90\x71\x6a\x59\x2d\x7d\xd0\xe3\x5e\xb3\xec\xd5\x62\xa5\x36\x77\x46\x7d\x13\x59\x44\x9f\x63\xb6\xd0\x9d\x07\x00\x0f\x25\xf7\xb7\x4a\xa5\xb4\x36\xe4\xf1\xa0\x6b\x98\x0e\x25\xf7\x1f\xb7\xe4\xfe\x8a\x98\xfb\x75\x07\x6a\x28\x8c\xfa\xb8\x85\x51\x7f\xf8\xe6\x4b\xee\xff\x30\x94\xdc\xdf\x53\x61\xd4\x1f\x86\x92\xfb\xcf\xb5\x30\xea\x50\x72\xff\x90\xca\xa2\xfe\xf0\x9c\x4b\xee\x77\x25\xd4\x7b\xba\xe2\xea\x73\x27\x37\xfb\x94\x2c\x87\x92\xfb\x4f\x4c\xb2\xfc\x06\x4b\xee\xff\x30\x94\xdc\x7f\x28\xc9\x72\x28\xb9\xff\x5c\x24\xcb\xa1\xe4\xfe\x61\xca\x96\x57\xcd\x34\x7b\xed\xb2\x25\x36\xab\x79\x15\x62\xd2\x30\x0a\x50\x26\xf7\xa7\x54\xe1\x49\x04\x6c\x72\xd2\x67\xdd\x36\xdd\x23\xb4\x60\xd3\x52\x14\xcb\x2f\x3c\x89\x62\x3a\xe4\x1d\xd2\x11\x48\x94\x9e\x2d\x08\xe4\xa3\x81\x26\x17\x8d\x31\x45\xc0\xb5\x5d\xbb\x46\x0f\xad\x0a\xf5\x5e\x0b\x36\x6e\x41\xea\x2a\xf4\x7f\x40\x8a\x44\x63\xf0\xc4\x23\x3a\x7a\x23\xf2\x8f\x70\x27\x6a\x55\x14\x36\xf6\x81\xb5\x66\x30\xdb\xf7\x9e\xdc\x3e\x5c\x71\xf9\xfd\x50\xb8\x38\xed\x63\x17\x99\x8b\xda\x42\x6a\xbd\x55\xb9\x1f\xfb\x3b\x4c\x37\xa6\x5d\x4f\xbc\x8c\xce\x73\x27\x47\x0f\x56\xc1\xf3\xf1\x2f\xfb\x96\x65\xf0\x97\x6e\xfb\x3d\x6e\x70\x8b\x13\x63\xf5\x15\x5e\x6e\xbc\x61\x9d\x6e\xba\x2b\xed\xb3\x93\x2a\x84\x52\xea\xbf\xec\x4e\x2d\x5f\x07\xbd\x6d\x3d\x61\x4f\x38\x35\x6d\xcc\xb7\x9f\x71\x9e\xe8\xe6\x31\x59\x9e\xf6\xf2\x76\xee\x92\x81\xb6\x58\x7a\x7a\x5e\xbf\xad\xeb\x46\x3f\xdc\x1d\x7c\x26\x09\xa6\x07\x52\xf2\xc8\x59\xae\xd7\xec\xc5\x2e\xef\xe2\x92\x37\x7b\xf5\x4d\x6c\x36\xdd\x90\x0d\xee\xc9\x1a\xb9\x6b\x63\x64\xe7\x05\x7f\xc2\x87\xf2\x1b\xe1\x6f\x0f\x52\x07\x61\xc9\x58\xdf\xeb\xe2\x6c\xcd\xc0\xf6\x73\x7b\xbe\x19\x76\xf6\x84\x2f\xed\xbd\x39\xc9\x2e\x4f\xfd\x50\x2d\x7f\x28\xa2\xf9\x04\xaa\xe5\x3f\x4f\xbe\xb6\xa2\x44\xe5\x1e\xef\xf7\x50\x55\xfd\xd0\xab\x4c\x3e\x0f\xf6\xfc\x34\x6b\x38\x6e\x7b\xf1\x26\xd4\x24\xf3\xf1\xed\x9b\xf1\xdf\xe4\x64\xcd\xe5\xfa\x9b\x9c\xc4\x6e\x21\xb3\x94\x1c\x3e\x06\xdd\xfd\x97\x9c\x0c\xd9\xd4\x0e\x3a\x9b\xda\x90\x44\xec\xb9\x24\x11\xeb\x99\x8b\xfd\xb2\x9e\x7b\xfd\x85\x7e\xd2\xd9\xd7\x63\xa2\xd5\x99\x5e\xfd\xb2\x96\x52\xdd\x51\x6a\x1f\xd1\x1d\x67\xa6\xa2\x40\xb8\x1e\x38\x9f\xfa\x4e\xd3\xa9\xd7\xd6\xa5\x9b\x6d\xbe\x6b\xc9\x71\xf1\xb8\x4b\xb0\xc4\x04\xf7\x97\x8e\x0e\xd6\xaa\x3d\x11\x9d\x65\x85\xb5\x1f\xe2\x84\x73\x6f\x36\xc8\x35\x17\xef\x47\x9f\xcc\xc9\x71\xb3\x08\xe4\x1e\xe7\x22\x61\xd5\x36\xf5\x4b\x81\x7c\xae\xe4\xe4\xc1\x73\x00\x7c\x5c\x91\xe3\xf8\x8e\x6a\x92\xcc\x59\x72\xb3\x32\x0e\xff\x71\xb3\x36\xaf\x1a\xb7\x4b\x32\xbc\x26\x2d\xf3\xaa\x9c\x71\xbd\xf2\x32\xff\xb5\xcc\xa9\x20\x21\x15\x73\x48\xd3\x8c\xca\xcb\x72\x1a\xe6\xfb\x27\x3e\xee\x95\x88\xf9\xe5\x44\x71\x36\x7d\x75\x00\x29\x98\x2f\xdb\x93\x2e\x8f\x3c\xd6\xb2\x2d\xf7\xf2\x36\x0a\x7b\xcf\xfa\x8d\x72\x6a\x2f\x60\x3c\x8e\x77\x32\x2f\x32\x66\x6f\xa7\x22\x3f\x51\x9e\xf5\x2f\x10\xd6\x53\xee\xdf\x71\x06\xe6\x98\x32\x75\xa4\x58\x76\x2d\x50\x16\x74\x99\xa5\x1c\x27\xfd\x2f\x39\x19\xf2\x26\x1f\xb6\xa4\xbf\x75\xde\xe4\xbf\xd5\xf6\x76\x65\x5f\x9b\x8a\x25\x43\xee\xe3\x41\x6d\xe9\x9b\xfb\xf8\xb2\x3d\xd7\xf1\x23\x28\x2c\x3d\x89\xf4\x83\xe7\x54\x5e\x2f\xc4\xae\xcf\x9c\xbc\xad\x20\xdb\x91\x95\xc4\xb5\x88\xc4\x57\xf0\xac\xcc\xc1\x2c\x44\xd8\x57\x96\x94\x28\x0a\xf2\x2c\x23\x99\x94\x37\x24\xe3\x37\x7d\xcc\x8b\x98\x53\xf2\x3d\xa3\x69\xc6\x05\xeb\x59\x39\xb3\x66\x06\x4f\xbd\xb1\x8a\x8b\x50\xca\x51\xb1\x8c\x42\xae\x4a\xc7\x04\xb4\xa1\xca\x5c\xa1\x04\xe8\xaa\xd2\xda\x71\x5b\x02\x30\x61\x3e\xaf\xa5\xf3\xb1\x40\xfb\x85\x36\x2c\x27\x46\xc1\x47\x24\x31\x4c\xe5\x5c\x58\x39\x9d\x9b\x3f\x3a\xe2\xe3\x4b\x63\x16\xd2\x4a\x49\xb7\x8c\x78\x38\xe8\x6a\x20\x69\xff\xac\x4f\xd1\x3d\x9d\xd0\xe4\x46\x4e\xa7\x1f\x79\xce\x97\xac\xb0\x6b\x17\x26\xce\x6b\x86\x33\x71\x33\xcc\xa9\xba\x41\x8a\xc9\x35\xac\xc3\x14\x65\x1b\xf2\x3e\xca\x46\xfa\xfb\x5d\x03\x62\x13\x14\xa6\x7a\x24\x4b\x6c\xec\xef\x52\x9a\x36\x5d\x26\x09\xd3\x7a\x5a\x66\xd9\x82\x58\x12\xa5\xe7\x2c\x45\x84\xaa\xdf\xd9\xca\xad\xa4\x4a\x01\x01\x94\x90\x4f\xd7\x18\x17\xc3\x2d\x78\x46\x72\x46\x85\xae\x0e\x84\xeb\xd5\x57\xb0\x2c\x64\x4a\x34\x9f\x09\x9a\xe9\xa5\x9f\xb3\xcc\x81\x90\x21\xaf\x2a\x86\x5f\x16\x54\xd1\x2c\x63\x19\xd7\xb9\xfd\x00\xd8\xf0\xb1\x1f\x77\x3c\x10\xfd\x51\x1b\xc5\x9b\x78\x0c\x71\x07\x5c\xa3\x03\x02\x7d\x7c\x6f\x42\x42\xe2\x68\x10\xf8\xce\xea\x41\xba\x95\x68\xa5\xab\x15\x81\xb2\xa4\x35\x95\x89\xb6\x54\x35\x61\x85\xd1\x27\x77\x52\xdd\x64\x92\xa6\xfa\xc4\xa5\x60\xcb\x98\xd2\x27\x56\x26\x3c\x56\xa5\x38\x36\xf2\xb8\xda\xc8\x93\x9d\xe7\xa3\xa6\xa2\xa4\x55\x6a\xab\xae\x7c\xdc\x71\x63\x9f\x31\x4e\xd7\xb2\xb3\x41\xa2\x38\xcc\x64\x85\x7e\x1d\x58\x31\xf7\x8a\x1e\x93\x8f\xcc\xee\xd3\x97\x7a\x57\x5f\x30\xcd\x14\x29\x05\x64\xe1\x5e\xc8\x12\x5c\x36\xbe\x54\xd1\x9d\x5d\x79\xff\x30\x95\x55\x72\xaa\xa9\xd5\x54\xac\xae\xe0\xb2\x54\x45\x94\xa4\xe0\xc9\x8d\x1f\x46\x29\xf8\xaf\xa5\x23\x4d\xee\x02\xc2\x39\x2a\x0a\x06\x51\x60\xe0\xd6\x71\x6d\xab\xdc\xb0\xc4\xb0\xbc\xb0\xc2\xec\x98\xe0\xd7\x0c\x68\x47\xf6\xd7\x52\x63\x71\x57\x0c\x24\xd3\xdc\x6a\x9b\x56\xad\xb3\x1f\x85\x9a\xbf\xf8\xc1\x68\x15\x9a\x35\xbc\xdd\xc4\xc7\x04\xd4\x9c\x52\xc1\xe8\x60\xcc\xb4\xf6\x36\x50\xcc\x84\x62\xe1\x5e\x8e\x7d\x61\x82\x29\x7b\x40\xd0\x03\x65\x42\x42\x7c\x0c\x6e\x4b\x4c\xb6\x18\x13\xf2\x57\x79\xc7\x6e\x99\x1a\x91\xff\x2d\x4b\xe8\x46\xb3\xa5\x85\xff\x93\x9d\xd3\x17\x4b\xc8\xb1\x3b\xbb\xd0\x77\xcc\x2e\x3d\x94\x1f\x76\x91\xd0\x10\x0f\x97\xa5\xe4\x0b\xfb\x6a\x98\xd0\x20\x9e\xdc\xbe\x99\x30\x43\xdf\x7c\x21\xa7\xe7\x67\xfb\x3d\xf2\xdf\x55\x6b\x77\xbc\x90\xa5\x3a\x96\x77\xe2\xb8\x90\xe9\xb1\x6e\x4d\xc8\xe6\x8f\xfd\x44\xca\x8c\x51\xb1\x22\xbe\xb7\xba\xfa\x1b\x91\x46\x9f\x37\x7d\x99\x44\xb6\x11\x43\x4b\x09\xa9\x01\xa2\x84\xfe\x32\xc3\x73\x86\xf0\x36\xcc\x20\xdc\x7c\xdf\x07\x6b\x5b\xc6\x6a\x18\x4d\x17\xce\x56\xe5\x61\x0a\x55\xc9\x67\x38\x0c\xee\x6d\x88\x38\x7c\xf9\x72\x6c\xd7\x69\x1c\x11\x7d\x72\x4c\xc6\xae\xda\x64\x45\xc0\x5f\x91\xeb\xf2\xf5\xeb\x1f\x13\x82\xcd\xa3\x85\x78\x35\x22\x50\xbd\x39\x04\x30\xda\x5d\x22\x19\x9b\x42\x12\xf2\x14\xd2\x5b\x57\x03\xc8\xe9\xd7\x98\x80\x3e\x2d\xaa\xf7\xa8\x29\x02\x4f\xdd\xcd\xfe\xb5\x64\x6a\x41\xe4\x2d\x53\xfe\xf0\xd0\x90\x56\x05\x62\x52\x03\x21\xc2\x94\xd2\xe4\x13\xf8\x9a\xb3\x45\x8d\xce\x69\x06\x7e\x44\xab\x4d\x41\xf8\xaa\x25\x43\x0b\x59\x6e\xbc\x1f\x76\x1c\xb7\x9c\xdd\xc1\xc6\xd8\xab\x66\x6f\xfe\xb1\xab\xed\x73\x82\x94\xec\xe4\x3b\xf8\x6f\xb8\x78\x2b\xac\xee\x9e\x6e\x6e\x6c\x77\x4f\xa4\x62\x76\x2d\xcf\x65\x7a\xe5\xfa\xe8\x74\x4b\xbc\xaf\xe5\x30\x01\xb2\x0d\x44\xcc\xdd\x98\x40\xc7\xec\xa1\x76\x52\x33\x60\xc7\xf7\xcf\xa9\xdb\xd7\xc6\x64\x4e\xe4\x3e\x9d\x1a\xa6\x7e\x72\xb2\x54\x57\x38\x61\xfb\x5b\x0e\x33\xe1\xec\x0d\x53\x06\x16\x57\xb0\x6b\xff\x4d\x4e\x70\x1d\xe6\x54\x57\x02\x5b\xa5\x35\xbc\x64\x1c\x98\xc8\xb2\xbd\x0d\x6b\x80\x44\x07\x8a\x6b\x57\xa7\x60\xc5\x18\xe8\xd4\xb8\xc0\x46\xfb\x51\xf7\x2d\xed\xd3\x53\xb2\x8c\xcf\xb8\xc3\x4a\x4c\x58\xa3\xa8\x79\xca\xec\xb7\x53\xc7\xcc\x7d\x17\x5c\x3b\xd4\x95\xfb\x79\x04\x19\xb8\xed\xfc\x92\x45\x92\x31\x32\x2b\xa9\xa2\xc2\x30\xa6\x1d\xf6\x63\xca\x05\xcd\xf8\xbf\x99\xd2\xaf\xc2\xbe\xcf\xa5\x90\x90\x4e\x7f\x69\x32\x91\xa8\x60\xbf\x76\x27\xc5\x0b\xb3\x66\x68\x6d\x8b\xe1\xcb\xf0\x57\xbd\x4c\x58\x22\x73\xb6\x34\x5d\xd7\x0b\xe1\x79\xce\x52\x4e\x0d\xcb\x16\x6e\xbd\xb8\x09\x4b\xe5\x52\xfd\x85\x0f\x40\xb6\xbf\xe3\xcc\xea\xd9\x3e\x6b\x3d\xc4\xf8\xba\x29\x91\xc9\xc2\xe5\xf0\x74\x24\x03\x63\xc8\x61\x28\x57\x57\x1f\xeb\x9b\xe3\x62\xd0\xf7\x54\x63\x7f\x85\x89\xd5\x5f\xff\x5d\x18\x55\x3b\xe1\x4a\xa1\xcd\x12\xae\x62\xd9\xdb\xf3\xb7\x7e\x80\x0a\x50\x4e\xbb\xec\xd7\x35\x75\x8f\xba\x02\x3a\x81\x81\xef\x25\xc0\xb1\x22\x2e\x0f\xed\xcf\xb9\x88\x96\xd6\xd2\x98\x20\x22\x58\x61\x07\x9c\x51\x8e\x8e\xa4\x90\x1f\xc7\x25\xd4\x09\x17\xd5\x97\xd2\xd0\x58\xac\x68\x0e\x82\xb7\x3e\x76\xca\xb1\x54\x29\x53\x3e\x04\x52\x33\x2b\x54\xd8\x0d\x2b\x9c\x4a\xa1\x7d\x97\x71\xfc\x29\x17\xe4\xe2\xa7\x77\x3f\xfe\xf8\xe3\xff\xc4\x94\xba\xee\x9e\x70\x41\x3e\x5f\xbd\x43\x09\xab\x5a\x2d\x1c\xb3\xbf\x46\x76\x10\xb5\xf1\xfb\x7b\x58\xd3\x72\x57\xf8\xa1\x7a\x97\x1f\xb8\xaa\x0c\xe1\x51\x76\x08\x48\x5d\xed\xea\xf7\xc4\x56\xf6\x17\x0d\xe7\xa4\xa3\x88\x34\xd8\x0a\x74\x70\xd1\xd4\x1c\x37\x0e\xc0\x0a\xaa\x2f\x80\x3b\xff\xf4\x27\x72\x7d\x84\x84\xfc\xfa\xe8\x21\x65\xb2\x5d\xd8\xb4\x37\xae\x5a\x50\xfb\xa9\x66\x05\x2c\x6c\xb7\xc7\x39\x53\x33\x76\x7c\xc3\x16\x3e\x24\xbf\xf3\x0d\x6d\xec\xe1\x9b\x2d\x10\xe7\xad\x66\x2b\x82\x98\xd0\x7c\xb3\x11\x89\x00\x11\x0f\x0b\x8d\x28\x46\x13\xb0\x9f\xcc\xa9\x66\xed\x6e\xae\x1d\x88\xb8\xde\x00\x77\x50\x74\x82\x26\x37\x42\xde\x65\x2c\x9d\x55\x59\x6b\x9d\x0b\xd0\x9d\xb7\x83\x20\x20\x2b\x96\xd4\xd2\x07\x96\xee\x6a\xe3\x2f\x7d\x77\x7b\xe2\xce\x1b\x72\x5b\x50\xe7\xc7\xef\x94\x14\xeb\x21\x8c\xae\x45\x7f\x18\x63\xa2\xa4\x18\xb0\x8c\x07\xef\xe1\x1c\x9c\x82\xcf\xc5\x29\xf8\x4d\x63\x19\x6b\x64\x6c\x97\xa0\x46\x4f\xc6\x46\x84\x8b\x24\x2b\xd3\x60\xca\xb5\x24\xbd\xcc\xf6\x7f\xcc\x1e\x02\xf1\x58\x5f\xbd\xed\xa0\x8f\x81\xde\x7f\xeb\xf8\x47\xcf\x4b\x57\xbb\x8e\x61\xb9\xb7\xf0\x1f\xd7\xb6\xa9\x03\x77\x14\xb5\x6a\xc3\x1e\xf9\xdd\x1a\x00\x48\x87\xcd\x9e\xb7\x06\x20\xb9\xfd\xdf\x35\x08\xa9\x2e\x2e\xf6\x54\xd8\x06\xc1\xe3\x59\x0b\x1e\x03\x1a\xe9\x81\x58\x4a\x07\x22\x69\x27\x6c\xa5\x03\x9f\x14\xb5\xda\x10\xa3\x04\x84\x18\x2c\x03\xdc\xf9\x69\x42\x39\x55\x55\x8a\x7e\x39\xe6\xd1\x5a\x96\x2c\xce\x65\xc6\x93\x45\x6f\x17\xae\x0b\x4e\x37\x8a\x51\x88\x72\xf4\x46\xb7\x30\x54\x5d\x19\x8a\xc9\x3f\x20\xa7\xa6\x0b\x14\xa7\x8a\xbd\x25\xc7\xe4\xfa\xe8\x34\xcb\xe4\xdd\xf5\x11\x79\xe9\x0a\x09\xbf\x7a\xeb\xf1\x28\x9e\xd0\xda\x2f\xa8\x52\x44\xfd\x67\x8b\x3f\xc2\xbb\x3f\x49\x35\xe1\xe9\xf5\xd1\x5b\x32\x85\x7f\xe9\x78\x0c\xaa\x14\x7a\x44\xf4\x0d\xc7\xb2\x07\x82\x7d\x85\x67\x84\x4f\x49\xa1\xd8\x2d\x97\x25\xf8\x87\xc9\x9c\x6a\xf1\xc2\x54\x4e\x9d\x05\x33\xd8\xfb\x05\x2b\x32\x9a\x30\xdb\x7d\x42\x45\xc2\xb2\x60\x54\x8c\x0c\xd3\x1e\xfb\xa0\xb0\xb1\xc6\x3d\x30\x73\x42\x89\x60\x77\x44\x8a\x2d\x92\x4d\xa2\x35\xcc\x4e\xfd\xaf\x5c\x1b\xa9\x16\x7d\x90\x53\x75\x23\x09\x76\x51\x4d\xca\x83\x1b\x14\x33\x94\x8b\xa8\x18\x12\xd6\xfb\xc5\xaa\x66\x29\xd7\x96\xf2\x97\x5c\xcf\x43\x65\x71\xf6\xb5\xc8\x78\xc2\x0d\xf8\x67\x60\xa6\x50\x68\xdb\x47\x1d\xd7\x11\x57\x6f\x76\x6e\x75\xfb\x2f\x39\xb9\xda\xd6\xfb\x59\xbf\x85\x7f\xab\x7a\xea\xab\xc5\xb0\x0a\x80\xd0\xcf\x07\xea\x4e\xec\x2a\x73\x97\x53\x6c\x7a\x6c\xa4\x6f\x4a\xb8\x80\x4e\x09\xae\xe4\x08\x20\x27\x9e\x9a\x33\x31\xbe\xe3\x37\xbc\x60\x29\xa7\x63\xa9\x66\x27\xf6\xaf\x13\xdb\x7c\xbb\x70\x07\x65\x67\xb1\x19\x8e\xf1\x17\x57\xd5\x90\xa4\xee\xb5\x18\xc2\x38\x95\x8a\xf8\x6e\xc3\x42\xf2\xa9\xbd\x21\x39\xd7\x9a\xe9\x30\xcd\x14\xad\x9b\x90\xde\x53\x2c\x5c\x5c\xc7\x98\x90\x9f\x39\xd4\xe2\x83\xc3\x1b\x91\x94\xb0\x0f\xb2\xf4\xc9\x33\xdd\x79\x97\x82\xad\x75\x13\x6d\x05\x5f\xac\xdc\x18\xf7\xba\x92\x55\x37\x0f\x7d\x2d\x7f\xdc\xbd\x31\xbc\xd4\x05\xeb\x94\x32\xd1\x0d\x9b\xd1\x19\x31\x2c\xcb\x82\x59\xd3\x19\xa6\x21\xab\x09\xf6\x63\xa5\x41\x6d\x05\xc1\x1a\xeb\x00\x97\x77\x2a\x99\xab\x26\x51\x14\xd9\x02\x02\x9b\x32\xe5\x91\x3c\xca\xc4\x4e\x78\x3d\x26\xb5\x69\x03\x98\x6d\xc5\x55\x58\x06\x33\xf5\x14\x5e\xc2\x25\x5e\x41\xa4\xba\xc4\x9a\xcd\x44\x86\x2e\x67\x6d\xad\x5d\x0f\x87\xed\x26\xa6\xe3\x3e\x5e\xdb\xd3\xa0\x15\xb9\xf3\x0a\x0b\xdf\xca\x25\x77\xa5\x2f\x79\x4c\xcb\xca\xe4\x78\x5b\x68\x4c\x58\x1a\x18\x37\xf6\xa1\x5d\x3c\x67\x51\x7d\x13\x60\x28\x77\xb4\xad\x34\xb1\x77\xf8\xd4\x90\xc3\x81\x7e\xee\x22\x09\xec\x7a\x76\xb9\x16\x30\x10\xb7\x6c\x14\x41\xb2\x2a\x82\xc3\xcf\x38\x7b\x03\x38\x57\x61\xa6\x9e\x8f\x82\xa2\x48\x03\x3c\xb4\x57\x7a\xb9\x83\xb3\xf1\x46\x88\x65\x5d\x9f\x19\x28\xc3\x15\xf6\xf5\xe9\x9a\x82\x77\x1b\xd6\xbe\x0e\xde\x7d\x18\x56\xcd\x55\x37\x25\xb1\x67\x72\x8a\xf9\x7b\xec\xb2\xbc\xab\xfe\xbe\xe4\x33\x4b\xf0\x2e\xd0\xaa\xb1\x8e\x72\xaf\x7a\xc7\x9d\x2c\x4d\x0a\x25\x6f\x79\xca\x20\xd3\x5d\x32\xa7\xc2\xc1\xf2\xe5\x04\x20\xdc\x5f\x7f\xf7\xfa\x7f\x92\x78\x20\x00\x63\x02\xa3\x8a\x13\x46\xa3\x1f\x01\x61\x6f\x9f\x3a\x6b\x4b\x48\xd2\x03\xd8\x58\x43\xa8\x5e\x88\x64\xae\xa4\x90\xa5\xce\x16\x96\xd5\x2a\x79\x6b\x05\x2b\xb0\x12\xe9\x92\xa5\xe3\x6b\x71\x2d\xfe\x5e\x4e\x58\xc6\x8c\x26\x01\x3d\x7d\x7a\x7e\x56\x8d\xe9\xed\xb5\x20\x6f\xc6\xde\xc0\x53\x1b\x9b\x65\xdb\xa5\x99\xdb\x5d\x81\xf1\x18\x09\xb9\x66\x8f\xed\x15\xc4\xf2\xc9\x2f\x03\x30\xfa\xfa\xa8\x0e\xa9\xa8\x37\x3c\xc6\xee\xc1\x26\x90\x41\x12\x2e\x3b\x37\xa6\x3e\xd1\x9c\xbd\x1a\x5f\x0b\xf2\xc3\x18\x8b\x38\x89\x59\x7d\x08\x56\xb8\xbc\xfa\x78\x19\x8c\x51\xba\x39\x82\x84\x82\x8a\x29\x58\x02\x78\x34\xcd\x92\x52\xb1\x6c\xd1\x31\xb2\x8c\x99\x63\xf7\xbd\xa5\xb1\x5c\x8b\x2b\xbf\x48\xae\xbe\xac\xaf\xec\xec\xf6\xe1\x61\xd6\xaa\x3e\x2e\x28\x86\x50\x9d\xa3\xfa\x1a\x41\x61\xad\x52\x1b\x99\x13\x21\xc5\x71\x54\x82\x07\x7b\x18\x8c\xda\x87\x6d\xd4\x1e\x4c\xbf\xcf\xc5\xf4\x1b\xc9\x23\xbb\x63\xe4\xbd\x19\x57\x27\x97\xb7\x9f\x6f\xa4\x35\x8b\xd8\x4d\x8d\xcd\x58\x8d\x36\xcf\x4b\x03\x88\x3d\x04\xeb\x82\x78\xc4\xad\x8a\x0f\x59\x15\xa3\x4a\x17\xa3\x88\x54\xe1\xeb\xa5\xa6\x33\xe6\xd0\xbc\xda\xd3\x51\xcd\x0c\x91\x22\xee\x07\xd0\xd7\xae\x11\x44\x35\x31\xc5\x6f\x11\x13\x15\x51\x31\x57\xea\xdb\x9d\xb4\x5c\xa6\x98\x3a\x6f\xb2\x80\x08\x24\xbd\xca\x70\xb3\x9d\x0f\xb8\xff\x6a\x77\xfb\x85\x9d\x3f\x38\xac\x78\x5c\x15\x11\x73\x6f\xc4\x15\x71\x3c\x7b\xb1\xd7\xdc\xf3\x72\xa9\x48\xca\x04\x67\xe9\x28\xc4\xe2\xc5\x5b\x86\x6c\xde\x43\xc8\x70\x13\x90\x55\xcc\x19\x58\x57\x4a\x15\x27\x1e\x89\x52\x80\x60\x5b\xdf\x66\x8b\xe2\x33\x70\x94\x1f\xd0\x1d\x50\xdb\x17\xa4\x1f\x2b\x9c\x03\x2b\xe5\xba\x9d\x04\x2f\xf7\x3e\x1f\x7d\x52\xf4\x74\xbf\x1c\x29\x66\x34\xda\x49\xb0\x0b\x74\x49\xa3\xfd\x52\xfa\x3c\x5e\x7e\x9c\xe5\xaf\x87\xb2\x49\xcb\x49\x73\x1a\xb9\x61\xbc\x9a\xd6\x9e\x3e\x87\x9c\x4d\x7d\x84\xc3\x1d\x42\x88\x05\xbb\x8b\x33\xf0\xf8\x92\x75\x69\x8a\x97\x8c\x0a\xc2\xbe\xa2\xc5\xae\x96\x91\xc6\x75\xcd\x35\xb1\xc2\xfc\xcc\xde\x43\x0c\x5c\x04\x91\x2e\x0d\x76\x2b\x50\x16\x65\xcd\x80\x03\x51\x6e\xab\x2d\x17\x9f\x81\x61\x3e\xc6\x92\x57\x5f\xae\x2d\xb7\x53\xee\x60\x9d\x91\x9b\x87\x50\xd1\x64\x19\x92\xbc\x79\x5a\x22\x9f\x87\x28\x50\x43\x4a\xe6\xed\x99\x8a\x40\x50\xae\xe7\x28\x8a\xe9\x23\x58\xc6\xf6\x94\xa4\xc8\x25\x27\xaa\x12\xbd\x52\x02\x69\x8b\x9a\x59\x8b\xee\x39\x96\x5e\x69\x8a\xf4\x36\x69\x8a\xc8\xa9\x63\x1d\x23\xf2\x3e\x62\x1c\x08\xaf\x8e\x21\xf3\x56\xf6\x73\x1c\xf5\xfa\x08\x3a\xf1\xb5\x22\x5d\x57\xd7\x47\xfb\xc9\x79\xe4\x6b\x5e\xd6\x26\x35\x26\x7f\x87\x54\xb9\xd1\x00\xad\x3c\x70\x7d\xe4\xa7\x83\x25\x2d\x71\x4a\xf6\xdf\x76\x52\x11\xc6\xdf\xaa\x6d\xa7\xa2\xd6\x3e\xe6\x7b\xfe\xa6\xdf\x72\x0a\xdf\x3d\x41\x06\x4b\x33\x2b\xd6\x7a\x71\x79\x14\xf3\xc7\x78\x93\x01\xb2\x1d\x6b\xd7\x55\x94\x7f\x1b\x03\xc6\xc1\x44\xa3\xdd\xed\x48\x50\x1e\x88\xc7\xe1\xb6\x71\xed\x58\xfc\x4a\xad\x1d\x8b\x3b\x71\xeb\x46\x12\xc9\x0d\xa8\x14\xc3\x57\x9b\x82\x09\x7e\x36\x5e\x32\x5c\x8b\xe6\xfe\xe6\xa5\x73\x79\xb3\xaf\x49\x56\x6a\x7e\xcb\xfa\x1f\xe0\x4a\x22\x54\x2c\x47\x61\x49\x24\x0c\xa7\x04\xdf\x0f\xb9\xbf\x1b\x6c\xd3\x05\x21\x7b\x16\x90\x65\xf2\xee\xd0\x13\x6c\xf5\x16\x3a\xba\x50\x70\xeb\xde\x6b\xc3\xc5\x75\x1a\xbc\x06\xcb\xc2\x21\x5b\x16\x36\x82\xcb\x6d\xbf\xf7\x2b\xbf\xb5\x53\x85\x6b\x80\xd7\x0d\x36\x96\x18\x5e\xb7\x31\x51\x7e\x70\x08\xdb\xfd\x75\xd6\xdd\x25\xdd\xda\xcc\x8a\xb4\x05\x0b\xb9\xec\x63\x5c\xea\x61\x89\x66\x5f\x8d\x5a\x3a\x2f\x34\x45\x0e\x4e\xb3\xf3\xf6\xd7\xc8\x6a\x12\xb4\xe6\xa8\x92\x26\x29\x59\x4d\x4c\x9a\x34\xa7\xb1\x2c\x30\xea\x6a\xfa\xf8\x27\x35\x78\xe1\x58\x90\xe2\x21\x65\x0e\xc0\x92\xbc\xb3\xd1\x3e\x5d\xb9\xa6\x63\x72\x2e\x8b\x32\x83\x86\x4e\xae\x3b\x3d\x3f\xf3\xea\x67\x64\x4b\x43\x9b\x9d\x37\xd8\xad\x10\x66\x64\xad\xc8\x5a\xfd\xa2\xc2\x99\xed\x62\x15\xd8\xa8\x9a\x25\xfc\x4d\x72\x96\x4f\x98\xd2\x73\x5e\x3c\xea\x2c\x57\xf0\x9f\xd5\x5b\xbf\x5d\x4c\x6d\xc6\xb5\x39\x0e\x8d\x8d\xcc\x57\x55\x7e\x50\x4b\xde\xc4\xb6\x25\x0d\x3e\xa5\xa0\x15\x2f\x7b\x09\x9b\x8e\x40\xc2\x44\x22\x53\x0c\xdf\xa4\xe4\xfa\xe8\xdd\x87\x8b\xab\xb3\x9f\xce\xde\x9d\x5e\x7d\x20\x17\x1f\xfe\xd7\xe7\x0f\x97\x57\xd7\x47\xe4\xfc\xc3\xcf\x64\x92\xc9\xe4\xc6\x85\x51\x6b\xa6\x38\x24\x88\x00\xe8\xd5\xdf\x2e\x7f\xf9\x64\xd5\xbd\xff\x7d\xfa\xf3\xc7\x51\xe5\xf3\x47\x9d\xc0\x5d\xb5\x6c\x41\x26\x54\xb3\xdf\xff\xf6\xd8\x7d\x70\x25\x22\x69\xb2\xe8\xd0\x82\x77\xb0\x9e\x95\x89\xb9\x4b\x6f\x0e\x0d\x1b\x05\x5b\xaa\xba\xcc\xde\x52\x4a\x3d\xc7\xff\xb5\xa4\x19\x5a\x95\x05\xcd\x51\x7d\xb1\xa4\xf7\xe4\x0e\x32\xd0\x04\x7e\x6c\xd5\xff\x95\xc7\x18\xed\xdc\x53\x9e\x19\x3c\xb5\x51\xc2\x0c\x2c\x84\x62\xf7\x0a\xd2\x0d\x55\x23\xfc\xd3\xa7\xd3\x9f\x3f\x5c\x1f\x61\x33\x9f\x37\x07\x3e\xff\x4f\x96\x65\xc7\x58\x3f\x66\xd9\xa1\x07\x40\x5c\x74\xdc\xf6\x74\x26\xbe\x45\x45\x4d\xb7\x3b\x2f\xe1\xaa\xd6\x9d\x9d\xeb\xbd\x99\xe3\x6b\x41\xc8\x45\xbc\x2c\x30\x5b\xa7\x1d\x5a\xd5\x4e\x30\x7b\x79\x69\x69\xe4\x71\xd0\x9d\x27\x0b\xec\xa6\x82\x93\x1d\xe7\x54\xd0\x99\xdd\x0a\xf7\xf9\xba\x12\x7b\x7d\x94\x68\xe5\x4e\x3f\xea\xae\x1e\x86\xc6\xc5\xaa\xae\x9c\x3b\x79\x43\x87\x74\xf7\xfa\xdc\xd4\xfc\xe8\xf7\x5b\x20\x37\xd9\xa5\xd5\x09\x73\xc6\x87\x1b\xcc\x7a\xe4\xbd\x24\xbb\x5b\xc4\x1f\xdb\x17\xb1\xee\x3b\x77\xab\xd6\xea\xbc\x6f\x5d\x36\x58\x9e\xba\x4f\x7f\xe4\x02\xc3\xfb\xb9\xf6\x77\x7f\xf4\x76\xbd\x72\xd7\x02\x44\xf2\x60\xc1\x54\x71\xb5\x24\x6a\xaa\x24\x14\x7f\xa8\xb2\x4f\x28\x0f\x89\x3b\xa1\x00\x15\x3b\xb6\xc7\x4b\xc0\xff\xff\xfb\x24\x5a\xd5\x63\x37\x9c\x63\x4f\x93\x4e\xbe\x8b\x88\xa9\x23\x0f\x76\x08\xef\x10\x10\x50\x91\x1a\x24\x4f\x34\xd3\x98\x43\xa0\x02\x9d\x5e\x55\x66\x1d\xa7\x77\x3b\xd2\x72\xa5\x4a\x6d\x00\xc8\x0a\x52\x0c\x97\xe2\x2d\xc6\x0e\xc0\xf3\x97\xef\x4e\xc9\xa4\x14\x69\xc6\xf4\x2b\x74\xde\xf9\x86\x60\x7f\xb1\x77\xf0\x9c\xa9\x9c\x1b\x20\xb8\x25\xaa\x8c\x6f\x61\xb1\x03\xa0\xc8\x19\xe7\x53\xae\x9d\x19\xc6\x37\xc4\x44\x05\x8e\x5c\xbb\xc3\x78\xe1\x84\xfa\x11\x29\x7c\xbf\xe0\xeb\xc2\x28\x82\x94\x39\xc6\x59\x65\xe7\xf3\x05\xb3\x3c\xdb\x7c\x59\x85\xac\x7a\xbf\x9b\xfb\xdc\x69\x66\x70\x89\x60\xaf\x70\x28\xfe\x54\x82\xfe\x33\xb2\x0a\x9f\x51\x3c\x31\xbe\x18\x96\x1f\x30\x1a\x01\x5e\x75\xcd\x2b\x8c\x6a\x69\x66\xbf\xed\x33\xb3\x1b\xb6\xf0\x3e\xd5\x13\xec\xcb\xf2\xff\xea\xa9\xed\xe8\x77\x63\xf2\xe1\x6b\xc1\x31\xf7\x40\x7c\x66\x42\x56\xac\xb7\x61\xde\x98\x96\x6a\xca\xbf\x2e\x7b\x0f\x43\x0a\x03\x7b\x5a\xdd\x6f\x34\xcd\xb9\xb0\xdf\xf8\x3d\x08\x13\xd0\x85\x54\x60\x78\xac\xf3\xc6\xd3\x3a\x05\x88\x96\x73\x0b\x63\x72\xc9\xbb\x54\xf6\x92\xa7\x75\x95\xc3\x3e\x38\x04\x51\x7b\xed\xb4\x60\xc7\xba\x66\x86\x9b\x5d\x55\xde\xa3\xe8\x3e\x9f\xc6\x47\xa1\x12\x68\xdc\x49\x77\xe4\xab\x69\x89\xad\x51\x4b\x4b\x7a\x5b\x99\xdc\xa2\x70\x59\xbf\x5c\xb7\x6f\xc9\xf5\x51\xca\x67\xdc\xd0\x0c\x93\xbd\x9a\x52\x31\xb4\xc3\xdb\x31\x30\x91\xf0\x62\xce\x54\x0e\xf2\x85\x7d\xea\x7a\xb5\x34\xcb\x99\xe4\x97\x3e\xdc\xce\x27\xda\xbe\xdc\xfe\x89\x15\xe3\x71\xbb\x14\x7d\x79\x29\x6c\xe9\x5a\xd8\x76\x9e\x96\xaf\xe9\xcb\x9e\x27\x2c\xff\x96\xe7\xdc\xb8\x4f\xc3\xdb\xed\x43\xb2\x4f\xe9\x4c\x31\x16\x8d\xd2\x8a\xd2\x8d\x96\xd0\x83\x9d\x36\x7c\xcf\x7d\x4a\x65\xd1\x5f\xfe\x05\x48\xd0\xe4\x3a\x62\x4b\x8f\xa8\x58\xf8\xde\x6a\xb3\x5e\xda\x00\xf7\x45\x99\x06\xfd\xc1\x7d\x26\xa7\x3c\x23\x85\x92\x06\x4d\x7d\x6e\x05\x4f\x72\x9e\x33\xff\x16\x2f\x34\x4b\x08\x60\xfc\x21\xbf\x22\xb6\xc1\xa7\xa6\x14\x82\x65\xf1\x13\x7b\xd3\xfc\x9b\x96\xcc\x68\x43\xf3\x22\x7c\x4f\x26\xba\xa8\x8f\x20\xe7\x89\x92\x5a\x4e\x0d\xd1\xb3\x04\x1f\x09\x66\x74\x42\x0b\x86\x4f\x0e\x5b\xb1\xb3\xd3\xed\x51\xd6\xcf\x37\xab\x13\xa8\xb8\xc0\xdf\x61\x51\xa8\x9e\x46\x34\xb5\x04\xa6\x88\x35\xb3\xbd\x3b\x38\xba\x83\x2b\xd6\xbf\x59\xed\x46\xe4\x4a\xf2\x3a\x8f\x57\x17\x83\xb7\xef\x04\x9d\x6d\x27\xce\xdd\x55\xf7\xc8\xd6\xf0\x52\x2b\xa8\x6f\x8f\x30\xce\xaa\x75\xc7\x81\xaa\x03\x7f\x48\x11\x0e\x03\x46\x2e\x8a\x96\xef\xd7\x79\xbb\xc3\x71\x51\x11\x7c\x6c\x75\x6f\xa0\x33\x5e\x37\x33\x31\x5a\xbe\xb3\xc6\x45\x38\x26\xbf\x88\x84\x55\xc3\x19\x35\x32\x45\x56\x07\xd1\xd2\xe5\xb3\xe9\x92\x69\xb0\x69\xdd\xe0\xba\xc2\x3c\xd5\x7d\x77\xe0\xb3\x8b\xfc\xaa\xc1\x83\x89\x3b\x10\xbe\xaa\x2c\x8d\x13\x9a\xb0\xbc\x30\x0b\x97\xbc\x92\x45\xba\x97\x95\x5b\x5a\xfd\x96\xab\xbe\x18\xbc\xa7\xfd\xbe\x18\x18\x10\x5e\x47\x77\x91\x2c\x23\xf0\xa2\x75\x3c\x7f\x48\xe8\xef\x8e\x25\xfa\xf6\x15\xc9\xad\x02\x11\x2c\x38\xda\xc9\xd3\xa7\x59\x16\x3d\xc4\x17\x31\xeb\x1d\x28\x2b\x91\x1d\xe8\xfa\x08\xd3\xeb\x8e\x42\xc7\x42\x92\x39\xa3\x29\x53\xba\x3a\xb0\xde\x8e\x64\xf9\x95\xd5\xaa\x7c\x69\x01\x4a\xfe\xfc\xe1\xc2\x1b\x7d\xc8\xe9\xe5\xa7\xf1\x9b\x98\x2c\x11\x6d\x54\x09\xfe\x02\x02\xfe\x68\x04\x28\xa5\x2e\x8a\x10\xa6\xfc\x5b\xbb\x78\x17\x3f\xbd\xfb\xdd\x0f\x7f\x78\xed\xc4\xf7\x4f\x52\x1c\xdb\xc1\x7b\xfe\x9a\x53\xc0\xac\x33\x1a\xaa\x4c\x4b\x15\xa5\x51\x6d\x4e\x27\x9a\xb7\xb3\xda\x94\xe2\x16\xd7\x98\xa5\x96\xf7\x60\x94\x59\x26\xef\x08\xd6\x8a\x2f\x32\x2a\xa8\x91\x6a\x41\x0c\xfb\x6a\x56\x8e\xf4\x77\xe3\x1f\xdc\x58\xff\xe3\xb7\xbf\xff\x83\x3f\xa3\x39\x56\x64\xa0\xb8\x21\xe1\xdb\xd1\x2d\xa9\x56\xb1\xf2\x60\x34\x28\x03\xc3\x84\xe7\x91\xb9\xa7\x0a\x8c\x0b\xa4\x06\x00\x4b\x77\x5c\xbb\x9c\xea\x53\xae\xec\x1e\xf8\x8f\xb5\x93\x15\xfc\x76\x14\x7e\xe7\x16\xa6\xc2\x25\x18\xc7\x50\xa8\x46\x8f\xa6\x4b\xbc\xda\x90\xce\x45\x4a\x6a\xb9\xe0\xac\x84\x36\xa7\x22\xd5\x73\x7a\x03\x3a\xc5\xb5\xb8\x5a\x42\x1c\xc6\xd6\x47\xbb\x30\x68\x05\x44\x9b\xd5\x8e\xec\x8c\x23\xa2\xa5\x55\x51\x12\x29\x34\xb7\xe2\xa3\x9c\xbe\xb5\xfd\x5b\xaa\x88\x2d\x5f\xe2\x1f\xc7\xf6\x7f\x7f\xfe\xf0\x97\xb3\x4f\x24\x3a\x2d\xf0\x14\x1b\x8c\xc7\xe3\xa8\xe5\x87\x4f\xef\x57\xb4\x7b\xf5\x98\x96\xcd\xde\xe9\x34\x63\xf4\x44\x51\x64\xbc\x2a\xc5\xee\xdd\x2b\xf7\x84\xd1\x3c\xb0\x47\x77\x87\xa9\x2e\x61\xb1\x73\x5a\x1c\xdf\xb0\x85\xae\x49\x2c\x55\x37\xd1\xa3\x7f\xf5\xdc\xb6\x9c\x16\xbb\x0f\x3d\x72\xd1\xa2\x5b\xc4\x1f\xbd\x8f\xc1\xa0\xab\x59\xe8\x00\xca\x38\x64\x50\xc6\x00\x45\x78\x2e\x50\x84\x87\x08\xf7\xe8\x20\x16\x9d\x31\x1f\x4d\x06\x1e\xa4\x6c\xa3\x59\x36\xc5\x0a\x30\x62\x11\x71\xe3\x38\x4a\x61\xaf\xa1\x15\x5d\x33\xeb\x8e\xaf\x78\xef\xc2\x45\x96\xe3\x2a\x62\x9e\xf8\x38\x19\xf1\xf6\x1a\xaf\xb0\x69\x6a\xa3\xcd\x56\xbe\x35\x72\x61\x08\x21\x18\x42\x08\x10\xbf\xed\x2d\x7c\x01\x0c\xbf\xb7\x90\x81\xc3\x8b\x0f\x78\xb4\x60\x80\xad\x6a\x16\xef\x34\x18\xa0\x96\xa5\xe5\xfa\xc8\x7e\xd0\x3e\xad\xae\x49\xab\xf6\x19\x1a\x3e\x6a\x2c\x01\x3a\xfe\xb6\x56\x84\x76\x82\x06\xdf\x91\x69\xb4\x83\x76\x37\x01\xe0\x83\x02\x70\x78\x0a\x40\x2b\x2a\x7b\x47\xca\x76\x97\x6e\xd9\x53\xd1\x1e\x14\x97\x67\xad\xb8\x0c\x18\xea\x87\x92\xa5\x3b\xd0\xd4\x98\x3a\x2e\x52\x5f\x5a\xe2\xee\x1b\xb1\xe1\xce\x57\x18\x45\xe1\xfb\xb0\x0c\x4b\x15\x3f\xf7\x08\xbc\x1f\xb9\xda\x99\xf7\x0f\xbc\x7f\xa6\x60\xee\x0f\x80\xde\x5e\xab\x55\x42\x7d\x53\x6d\xf5\x84\x4b\x86\x9e\xdc\xf1\x99\x98\x4a\xe4\x54\x53\x9a\x60\x5e\x44\x27\xa4\xee\x0b\x8f\xfd\x17\xc0\x5f\xef\x6d\x9c\x87\xe6\x78\xef\x87\xa8\xfe\x73\xcd\x95\x40\xce\xff\xfe\xee\xf2\xbb\x37\xaf\xc9\xbb\xcb\x0b\x70\x3d\x3c\x09\x08\xf3\x45\x03\xa9\xdc\x54\x35\x7c\x2d\x9f\x26\x70\xd9\xe3\x80\xec\xb4\xde\x92\x2f\x3a\x91\x05\x3b\x9e\x4b\x6d\x00\xd5\xcc\xe5\x89\xfd\xef\x17\x10\xda\xc1\x53\x39\x0a\xc9\x87\xa1\x4c\x1f\xc8\xf7\x2c\x75\x3e\xca\xb3\x29\xe1\xe6\x85\xfd\x88\xc3\x70\xb6\xc0\x86\x7c\x81\x43\xaa\x61\xa0\x29\x7a\x53\x36\xc4\xde\x3a\xef\xe6\xf2\xf7\x5a\xd0\x42\xfd\x3f\x58\xc3\xa9\x3a\x1f\xe4\x2f\x95\xb3\xad\xde\xcd\x52\x0f\x19\x9b\xd1\x64\x71\x5c\x06\xf5\xe7\x5a\xbc\x8f\x80\x90\x20\xee\x02\x0c\x12\xf2\xa5\x3a\x54\xb6\xab\xc8\x44\xec\x1d\x94\x53\x32\xa1\x22\x1d\x43\xdd\x61\x4b\x87\xb1\x5c\x68\x2b\x30\xfc\x4b\xc3\x4d\xf8\x65\x2f\x60\xb9\xcf\x67\xef\xf7\x4f\xd3\xee\x0d\x7c\x73\x70\xc1\xcf\x2b\xf1\x6f\x65\xc8\x22\xc0\xbe\xba\x9c\x99\x37\x6c\x11\x4e\x31\xf8\x84\xed\x40\x61\x16\x95\x38\x67\xa4\xcc\xf4\x98\x33\x33\x85\xac\xbb\x73\x93\x67\x27\x6a\x9a\xfc\xee\x87\x3f\xbc\xfe\xce\xf9\x82\x8f\x7f\x3b\xfe\x61\xfc\x66\xfc\x23\x9e\xa9\x2d\xde\x7c\xf3\x43\x37\xf0\x0c\xfe\x6c\x83\x9e\x39\xb8\xd6\x06\xe0\xb3\xf0\x3c\x86\x9f\x61\xff\x7d\x00\x68\xf8\xa0\x82\xa0\xc1\xdf\x4d\x10\x1a\x76\xc7\x5a\x1e\xae\x04\xa2\x61\xbf\x9d\x50\x34\xfc\xdc\x32\x18\x0d\x7b\xec\x82\xa3\x45\xcf\x03\x20\x2d\x7a\xb6\x06\x92\x06\xcf\x1a\xa0\x34\x78\xd6\x84\xa5\xc1\xc3\x67\x08\x4c\x3b\x7b\x70\x1a\xd0\x53\xb7\x50\x75\x1d\x75\xcf\x96\x92\x65\x24\xd9\xfd\x21\x5a\x67\xd3\xd6\xa4\x11\xa3\x66\x12\x65\x20\x56\x90\x7a\x7e\x05\xc2\x83\xcc\xd9\x9a\x7a\xb5\x07\x05\x4a\x78\xd7\x05\x4a\x18\x11\x5d\x26\x73\x12\xd6\x83\x66\x3e\xad\x15\xcd\xf6\x83\x38\xe8\xed\xdf\xd8\xcd\xdd\x3c\x58\xd8\x81\x94\x2a\xe5\x02\x3d\x79\x56\xeb\x67\x54\xb3\x35\xca\x28\xfc\x1e\xac\x7c\x94\x64\xf0\xb7\xab\x8b\x3a\xe4\x90\x3c\x68\x9b\xe2\x60\x9b\x7b\x2e\xb6\xb9\x9e\x39\xad\x9f\x5e\x42\xea\x56\x72\xb4\x5d\x66\x6a\x78\xf5\x80\x73\x50\xef\xd2\xfe\x19\xaf\xda\x3a\xfb\x27\x52\xf7\xdd\xe4\x8a\x68\xdb\xa9\x8e\xd4\x42\xa1\x0d\x92\x18\x5f\x61\x00\x79\x8a\x4b\x18\x33\xf0\x90\x83\xe6\x21\x7d\xb2\x05\x9d\x55\xd9\x82\xfc\x16\xfb\x85\x6e\xee\xf1\xca\x3e\xb7\x26\x16\x83\xf7\x6a\xe0\x90\x43\x81\x3d\x7c\xfe\xd0\x9c\x65\x87\x99\x88\x56\xca\x01\x1d\xdc\x05\x32\x0c\xe1\xf5\x6c\x0a\x05\xd4\x89\x04\x7d\x2a\xe4\xc0\xe2\xef\x18\x35\xf5\x33\x4f\x94\xec\x84\x4e\x45\xdf\xc6\x79\x00\x48\x0d\xe0\x65\x31\xec\x0b\xf5\x2e\x30\x20\xe0\x0b\xe9\x0a\x10\xd8\x5c\x66\x29\x53\x67\xa9\x3d\x7f\xa6\xab\xfe\x5f\xbd\x71\x3d\x2a\x91\xfb\xa7\x4e\xbe\xc2\xb6\xae\xfa\x50\x3c\xaa\x2d\xac\xbe\xf0\xde\x7b\x57\x12\xbf\x5f\x81\xb2\xb6\x57\x70\xc1\x52\x5f\x5a\xdf\xa7\x2c\x49\x21\x00\x08\x03\x8c\xbd\xc6\x2a\x18\xda\x20\xee\x28\x87\xcc\x11\x53\x69\xc9\xb4\x5b\x4b\xc2\x4d\x55\xb1\x2b\x67\x54\x43\x18\xd3\xcc\x2e\x85\x09\x89\x70\x01\xd1\x26\x27\x60\xd7\x4c\xc9\x05\x13\xec\xee\x0a\xb0\x78\x2b\x0c\x32\xdb\x56\xe4\x82\xf1\x56\xf8\xc5\x5e\xeb\x12\x35\xf7\x58\xc7\xaa\x5c\x99\x89\x7e\x84\xdd\xc3\x15\xf1\x05\xc8\x70\x5f\xd7\x16\x5b\xdb\x6a\x1e\xca\xaf\xd0\x83\x5f\xa9\xf0\xe5\x75\x17\x2a\x3e\xce\xb8\x20\x73\xaa\x63\xd8\x22\x06\x72\xb9\x13\xbe\x73\xc3\x0b\x9a\xa3\x06\xeb\xcb\xf3\x95\x9c\x07\xd9\xf2\xb9\xc8\x96\xdf\x8a\xf5\x25\xa2\x49\x83\x09\xe6\xa1\x4c\x30\x1b\x43\xcd\x56\xee\xd9\x60\x8c\x79\xee\x2c\xe5\x80\x8d\x31\xb1\x3c\x33\x58\x64\x06\xae\x39\x58\x64\xc8\x01\x5a\x64\x76\xc7\x6c\x06\xdb\xcc\x60\x9b\x19\x6c\x33\x83\x6d\xe6\x99\xd8\x66\xb0\x12\xf9\xe9\x3f\x2f\x3f\xd8\xaf\xf0\xe4\xcf\x99\x4c\x6e\x2e\x8d\x54\xec\x1f\x32\x2b\x73\x76\x09\x42\xc4\x1a\x82\x77\x51\x55\x6c\xa7\xe4\xdc\xd2\x5c\x0d\xa0\xcd\xf7\x5c\xdf\x54\x42\x08\x17\xe4\xf4\x9f\x97\xbe\x32\xd1\xe9\x3f\x2f\xc9\x87\x3f\x5f\x92\xd4\xb6\x81\x3c\x4b\x10\x2c\xec\x53\x1f\xe5\xb2\x74\xc2\x8c\x24\x21\x8d\x3c\x53\x98\x9c\xb5\x7a\xc7\x67\x6f\x75\x30\x6f\x4d\x73\x06\x3d\xff\x5b\x0a\xc8\xc5\x04\x60\x58\xc4\x3e\x8f\x49\xf3\xab\x09\x64\x33\xca\x16\x18\xcb\x51\x0a\x17\xa1\xa9\x18\x4d\x4f\xee\x14\x37\x0c\x0a\xe8\x8c\xc3\x4b\xb7\xb0\x1a\x9a\xe8\xb2\x28\xa4\x32\x44\xde\x09\x97\xe6\x1d\x53\xdd\xe6\x00\xf0\x14\x29\xb9\xfc\xf0\x91\x8b\xf2\x2b\x51\x0c\x72\x4e\x71\x31\xeb\x41\xeb\xa7\xfa\xaa\x3b\xbe\xf3\x27\x9e\x31\x84\x7c\x92\x38\xd4\x13\x47\x86\x74\x66\x21\x4b\x72\x47\x05\x10\x13\x98\xd5\x98\x5c\xf1\xe2\x2d\xf9\x20\x80\x7a\x40\x1b\x4c\xac\x54\xef\x8a\x87\x89\x55\xe9\xf4\xe6\xd2\x92\x96\x82\x29\x57\x23\x11\x9a\x8f\xc9\x87\xaf\x34\x2f\x32\xa6\xdf\x92\xeb\x23\xf6\xd5\xfc\x16\x63\x47\xbf\x4e\xb5\xcb\x5d\x68\xec\xbf\xc6\xe4\x2c\x2f\x32\x9e\x70\x93\x39\xe1\x52\x21\xa5\x83\x98\x5a\x7c\x8d\x70\x08\x96\xad\x52\xef\xb6\x88\x3e\x75\x18\x3a\xe4\x06\x76\x36\x40\x7d\xa2\x8d\x54\x74\xc6\x4e\xdc\xce\x7c\x47\xef\x34\xc3\x33\x8c\x09\xa0\xec\x19\xde\x9c\x09\x14\x54\x99\x66\xb8\x7f\xdb\x66\xd8\xa3\x18\xda\xfa\x23\xd8\xb1\x15\xff\x3f\x7b\xef\xba\xdc\x38\x8e\xad\x0b\xfe\x9f\xa7\xc0\xb8\x76\x84\xed\x73\x24\x39\xb3\xae\xdd\xd9\x71\x7e\xb8\x6c\x67\x95\x4f\x65\x3a\xbd\x6d\x67\xd6\x74\xb4\x3b\xaa\x21\x12\x92\x70\x4c\x01\x6c\x02\xb4\xad\x3a\xb3\x23\xe6\x35\xe6\xf5\xe6\x49\x26\xb0\xd6\x02\x08\x52\x37\xea\x62\xa7\x2b\x4b\xb1\x77\x54\xa7\x45\x10\xc4\x75\xdd\xd7\xb7\xce\x07\x4c\x7b\x40\x5b\xc2\xca\xe2\x65\x06\x6a\xa9\x6f\xe4\x16\x9f\x7a\x81\x2c\x85\x68\xb9\xdf\xea\xc2\x3f\x72\x02\xdf\x91\x49\xf9\xeb\x0e\x7c\x06\xd7\x10\x77\xad\x1a\x13\xe4\x1b\xbf\x76\x7b\x71\x2d\xc7\x32\xe3\x45\x36\xe9\xc4\xa3\xac\x5a\x3a\x96\xe4\xbb\x74\x83\xb9\xdd\x7b\x75\xbb\xc7\x0e\x74\x01\xbd\xbb\x9b\x92\x09\x0f\xac\x46\x27\x78\x82\x29\x13\x87\x4f\x40\xa0\x79\xfa\x41\x65\xcb\x64\x84\x6b\x9a\xf2\xed\x9e\x85\x8c\xea\x88\x7b\xaa\x14\x82\xe3\x31\x17\x0c\x3b\xab\x46\x2d\x15\x43\xba\xf6\xde\xad\x36\x65\x6f\xdb\x2a\x7b\x7b\xde\xfe\xdc\xee\x0d\x30\x11\xfc\x19\x8f\x69\x5f\xeb\x4c\xf0\x39\x98\x01\xd8\xdd\xf9\xe9\xb2\x34\x07\x25\xff\x5d\x0a\x76\x7e\xea\xa9\x45\x5e\x51\xe8\x74\x06\x85\x66\x07\xc7\x63\xfe\xbb\x56\x11\xcd\x3b\xfc\x9c\x37\xb3\xa5\x72\x12\x56\x63\x99\x7e\xb2\x94\x11\x0e\x80\xf9\x4f\x16\x30\x3c\xdf\x04\xf9\x38\x56\xfd\x70\x0c\xdb\xff\x6c\x92\x91\x48\xcb\x0c\x10\xa8\xca\x4c\xb4\x31\x2d\x29\x9d\x8a\x19\x5f\x66\x2d\xed\x11\x38\xf4\x8b\xb8\x93\x45\x92\x48\x85\x9b\xe5\xbe\x3b\x7f\xe0\x21\xcf\x2a\xd7\xf3\xe4\xfa\x5c\xa7\x1b\x8f\xfb\x32\xea\xa3\xdd\xb0\x73\x9d\x2e\x18\xf5\x81\xe8\x0d\x7b\x2c\xd1\xdd\x4c\x63\x35\x82\x91\xc4\x57\x62\x39\xc1\xcd\xbc\x03\x92\x42\x87\x09\x9b\xf4\x1c\xb5\x34\x7a\x4c\x08\x84\xae\xf9\x81\x39\x3c\x5c\x30\x6b\x65\xe5\x56\x66\x1e\xf7\xb3\xc2\xec\x95\x95\xdd\x65\x4b\xc0\xef\xb5\x4c\x59\x5e\x5a\x32\x0c\x6d\x65\x19\x36\x96\x34\xad\xe5\x6e\xb8\x48\x85\x17\x5d\xb3\x5a\xc3\x5a\xe5\x5f\x62\x60\x9c\x5a\xa0\x98\xe8\xa6\xb2\xfc\xa6\xa5\xe2\x5e\x26\xe2\x92\xdb\xd1\x12\xc2\x79\x1a\x1a\x46\x46\x33\xe2\x0a\xee\x09\xcb\xdd\xa3\x87\x91\x28\x44\xcc\x54\x2b\xd8\x8f\x50\xe4\x60\x75\x19\xa4\x45\xda\xca\x45\x84\x9c\x1c\xd6\x01\xc7\xb0\x5d\xca\x0a\x63\xe9\xcc\x5c\xc0\x8d\x69\xed\xef\x65\x21\x9c\x9a\xd0\x52\xd3\x08\xed\xe3\x1d\xe1\x8a\xc1\xef\xec\x94\x5b\x8e\x4a\x07\x0a\x52\x5a\x55\x52\x2c\x94\x23\x90\x2a\xa5\x47\x64\x29\x07\xb2\xb6\xf4\xc4\x24\xa0\xf8\x0d\xdf\xbb\xe3\xb5\x78\x4f\x7e\x76\x9f\x3a\xc1\xe6\x6c\xac\x53\xf1\x86\x5d\xc0\xcd\x72\x62\x08\x24\xa8\xd3\x3f\x7f\x75\xfa\xc5\x1a\x06\x0a\xc7\xb0\x5b\xe4\xcb\x3a\xd1\x34\x3e\x1f\x90\xff\x06\xcc\x9e\xae\x7e\x3f\xd3\x7d\x46\x4c\x7a\xbd\x51\x7c\xbc\x3a\x6f\x31\x88\x8f\x57\xe7\x4f\x31\x80\xb5\x94\xa5\x4a\x0a\x7f\x1f\x70\x7d\x9b\x5a\x50\x7b\x15\xa8\xb7\x6d\xe5\xe7\x49\xbc\xec\x67\x8f\xb9\x48\x6c\x70\xf0\xb0\xeb\x11\x2f\x44\xfa\x86\x8d\xcb\xcc\xca\x3c\xa3\x7d\x70\x1b\x63\x9c\x5c\xe8\x77\x84\xf1\x24\x81\x7b\xc2\x4e\x05\xe2\xf2\xa6\x6f\x98\x91\x6a\x18\xbf\x31\xfb\x85\xf7\xa0\x0b\xa7\x6f\x18\x87\x3b\x89\xaa\x71\x1a\x1d\x80\x03\xd0\xb9\xa5\x0a\x8f\x88\x4c\xca\x0c\x18\x99\xb0\x87\xbd\x08\x05\x4c\x33\x03\x43\x5e\x0b\xbf\xaa\x8d\x1a\x11\xa3\x38\x81\x80\xcf\x0e\x2a\x0b\xc0\x61\xaf\x52\x20\x80\xce\x43\xa2\x1a\x6a\x19\x35\xed\xc2\x08\x64\xb1\x0d\xe5\x62\xce\xa6\x4e\x8b\xf5\x2d\x49\x71\xb8\xfe\x33\x2e\xe3\x56\x68\xb1\xbb\x33\x95\x05\x67\x15\xaa\xec\xde\x9c\x49\x95\xe1\xc1\xb5\x28\x80\x65\x6e\x97\x30\xff\xa1\xb6\x38\x0e\x58\x10\x49\x21\x6c\x0b\x3a\x1e\x57\x48\xc0\x97\xc8\x98\xec\x0d\xe2\xb8\xc4\xd7\x74\x09\x8f\xe9\x12\x02\xe9\x77\x0b\xfb\x8b\x98\xac\x81\xbf\x16\x46\x67\x72\x9e\xb4\x1d\x22\xb4\xf5\xfc\x66\xcd\xb1\xd6\xcc\x21\x5e\x40\x25\x33\xde\xa5\x5e\x83\x06\x00\xed\x68\xb1\xce\x40\x16\x59\xe3\x66\x6d\x41\x74\x8a\x36\x7a\xe6\xa8\xb6\x76\x67\x77\x37\xf5\x4f\x79\x53\xbf\xf0\xe3\xfd\xa3\x54\xa9\x1b\xd8\xfc\x03\x4d\x2d\x98\x3b\x71\x08\xfd\x88\x51\x0e\x15\x70\xe9\xdf\xa8\xfc\x01\xd8\x50\x3b\x8c\xa3\x02\x6c\x58\x5f\x97\x2a\xd2\x1b\x9d\xbc\xc7\xbd\x1a\x2d\x8a\x1e\x3b\x75\x17\x04\x24\x1f\x77\x8e\x5e\xf7\x7e\xe8\xb0\x1c\xfd\x31\x50\xb8\xcf\x89\xb0\xf8\xed\x5a\xf1\x0f\xb7\xfd\xb9\x4e\x0d\x93\xca\x58\xc1\xdb\x5c\x8d\x5d\x50\xd1\x2e\x4e\x75\x17\x71\xc3\x36\xf4\xc0\xb6\x8c\x53\x0d\x31\x37\xb8\x37\xfb\xe6\xb3\xc6\xdd\x44\x4b\x62\x79\x31\x14\x53\x50\x5e\xad\xed\x88\x38\xfd\x2b\x5f\x34\x73\x29\x02\x3a\x7e\x2e\x50\xcb\xa6\xb7\x0a\xd8\x3c\x5d\x7c\x53\x5f\xb2\x85\x96\xc0\x39\x70\xaf\x38\xb7\x65\xdc\x60\x8b\x81\x43\xb3\xa3\x84\x3c\x3b\x99\x1f\x23\xb4\x52\x78\x10\xae\xfc\xc9\xf5\xf9\xca\x0a\x53\xe4\x30\xf7\xfa\x33\x6c\x81\x34\x41\x29\x76\xec\x48\x41\x65\x4b\xa0\xb6\x27\xd7\xe7\xde\xbe\x98\x16\xf2\x5e\x14\xec\xe0\x47\x61\x39\x1b\x08\x80\x4b\x3a\x6c\x61\xc4\x0a\x68\x2b\x67\x8f\x39\x57\xe9\x35\xf0\xee\x2b\x38\x5f\xeb\x9d\xb9\xd0\x43\x8b\x33\x77\x32\xef\xeb\x48\x5a\x43\xb5\xd7\x70\xe8\x50\x84\xa2\xf3\x49\x42\x14\x18\x60\x04\xc4\x8c\xdc\x8b\x1a\x74\x97\xd5\x2c\xe7\x26\xf0\x2a\xb7\x5a\xb4\x4c\x56\xb3\x44\x3b\xd6\x6f\x45\x78\xd4\x1c\x0c\xd9\x97\x13\x9e\x65\x55\xb8\x0d\xd4\x86\xcd\x47\x9c\x80\xc9\x1c\x9f\xa3\xd3\x6d\x98\x50\xbc\x0f\xb6\x76\x7c\xff\xe4\xfa\xfc\x13\xc5\x06\xd0\x7e\xb0\x21\xb7\xa2\x59\x37\x4c\xc3\x6a\xf0\xac\x62\x9a\x7d\x81\x3e\x54\x26\x07\x4c\x69\x3f\x69\x2a\x88\x0a\xb1\x54\xa1\x56\xd7\xac\xf5\x30\x8d\xb2\x4c\xd8\xa8\xc3\x78\x96\xd1\xbf\x11\xcc\xd2\x2d\xcd\xdc\xb8\xac\xea\x5c\x5c\x96\xfd\x4c\x9a\xd1\xe7\x3a\x18\xcd\xcf\x7f\xde\x93\x41\xa3\xa1\xa3\xe1\x36\xac\x7a\xf6\x51\xe5\xb5\xa7\xee\xe0\x98\x3f\xc6\x6e\xe3\xdc\x97\x69\x61\xb8\x40\x72\xba\x42\x63\xb5\x74\x4e\x08\x0e\xb5\xa6\x91\x32\x55\x75\x7b\xd7\xb0\x65\xbe\x78\x8b\xee\x1a\x3e\x1c\x9d\x8a\xcf\x72\xa7\x2e\x66\x7c\xf8\x73\xdc\xa6\x68\x1c\xd1\x3d\x72\xbf\xfe\x81\x6f\x90\xdb\xd5\x6b\xcb\x87\xe2\xf9\xf7\xb4\xfe\xd9\xcf\xb5\xa3\x30\x8a\xc6\x7e\xce\xfa\xed\xa3\x32\xd1\xaf\x7f\xa0\x1d\x6e\x69\xab\xfa\x40\x83\x7f\x03\x31\x89\xa8\x15\x46\xab\x39\x87\x95\x84\xda\xb5\x4b\x4c\x5d\x6b\xc7\x03\x1d\x5b\x2a\x3a\x3f\x15\xa0\xdb\x0e\x66\xba\x2d\x5a\xe3\xb4\xaf\x9e\x3e\xdb\x0c\x4a\xd4\x8c\xee\xfa\x1a\xa8\xcf\xd8\xc7\xcf\x5c\xa5\xd9\x32\xde\xf0\x29\x6a\xea\x59\x57\x89\xa1\x4f\x51\x34\x1d\x2b\x84\x2d\x0b\x55\x71\x83\x48\xb0\xce\xb3\x72\x28\xd5\xff\xf7\xff\xfc\xbf\x86\x9d\x00\xa6\xf8\xa7\x30\x03\xb8\x65\xfe\x8e\x50\x73\xac\x79\x1f\x57\x9d\xa4\x33\xbe\x2a\x17\x6c\xa9\x45\x11\xeb\x9e\xb7\x3a\x9b\xda\xda\x82\x10\xbb\x5a\xb8\x2f\xd9\x3b\x20\xd0\x26\xe4\x37\x54\x5b\x0f\xec\xb9\xb3\x48\xab\x69\x4c\x6b\x7e\xd8\xc6\x66\x92\x4b\x4c\xd8\x9c\xaa\x35\x82\x55\x33\x75\xf9\xe5\x44\x2b\x53\x66\x16\x0b\xea\x4c\x74\x59\x60\xa1\xff\x10\x05\x95\xe8\xa2\x70\xd4\x46\x91\x5f\xa2\x10\x43\xa7\xf7\x15\x55\xc1\xf9\x24\x2b\xdd\x0f\xcf\x2f\x00\x2d\x77\x48\x0f\xa0\xa2\x4d\x5e\xe8\x7b\x99\xfa\xf0\x46\xa4\xb5\x48\xbb\xa4\x21\xb2\xe8\xcf\x39\x37\x46\x27\x12\x2c\xa0\xd1\xea\x3d\x8c\x64\x32\x42\xd3\x7b\x2a\xac\x28\xc6\x52\x89\x5a\xa8\x64\x2c\x80\x69\x80\xc0\x9c\x7c\x6e\xe1\xe9\x9d\x4e\x78\xb6\x8a\x89\xe4\x8b\x94\xa0\x9e\x87\xc1\x56\x2b\xb4\x3d\x56\x7b\x1d\xa1\x5e\xbb\x57\xba\x10\x42\x90\x68\x35\x90\x43\x9f\x64\xe3\xef\xa8\xbf\xcb\x5f\x18\x7f\xfd\xd4\xf8\x38\x18\x8e\x84\xa1\xc3\xd3\xf5\x49\x66\xac\x22\x9f\x48\xe7\xaa\x2d\x98\x3e\x72\x15\xc1\x03\x5a\x87\x3f\xee\x1b\x96\xea\xa4\x1c\x07\xbf\x01\x00\xba\x07\x25\x8a\x6c\xfa\x2d\x59\xf9\x6a\xac\x6d\x63\x16\xc6\x73\x0c\x23\xa9\x2f\xfc\x94\xa8\x92\xa6\x86\xec\x39\x63\x7d\x2f\x0c\xbb\xfc\x70\x7d\xfe\x7f\xb1\x24\x7a\x1b\x0d\xf2\x45\xa9\x14\x55\xaf\xc3\xf4\x93\x56\x39\xe2\xe9\x32\x8f\xc2\x31\x54\xc8\x8b\x3f\xf7\x84\x30\xda\x73\xac\x00\x3a\x5f\x5a\x71\x61\x8c\x05\xf1\x9f\x7b\x98\x53\x47\x66\xd5\x43\x20\xf2\xd1\xdb\xeb\x4d\x4c\xb2\x9c\xb9\x3e\x58\xc4\x6b\xc9\xe1\xed\xee\x53\xc6\x0d\x05\x81\x66\x72\x20\x7c\x0e\x1e\x7a\x15\xdd\x6b\x03\x13\xf2\x84\x52\x0d\x1c\x77\x61\xba\x90\x2e\xd6\xcb\x16\x1a\x6b\x25\xad\x2e\x96\x25\xe1\x79\x51\xf4\x0d\x7b\x4f\x2f\x20\x17\x4b\x9c\x62\x92\x78\x81\x0d\xa6\xeb\x7b\x9c\xe5\x06\x21\xef\xa9\xaf\x37\xe4\xa3\xfa\x8f\x12\x98\xf0\xd1\xd5\xd9\xf1\xe9\xfb\xb3\xde\x38\xfd\x6a\xa4\x1f\xba\x56\x77\x4b\x23\xba\xd2\x3e\xf7\xa9\xce\x97\x87\xf4\x56\x3a\xdb\x47\x83\xd9\x5e\x6e\x27\x7d\xf2\x57\xa1\xb5\xed\xb0\x82\x43\xe0\x33\xb0\x38\x48\x94\x2a\xb3\x0c\x97\xc8\x16\x42\x74\xe2\x18\x95\xa3\x27\x8b\x4a\xab\x06\xfa\xb4\x21\x11\x4f\xb5\xdb\x2b\x04\x57\xb8\x7b\xd6\x7a\x35\xae\xc3\x2b\x5e\xc8\x87\x20\x6c\xab\xa1\xe6\x05\xf8\x67\x1d\xbf\xfa\x68\x44\x51\xdf\x29\x61\x13\x98\xc0\x11\x40\xf8\x93\xa8\xf2\xc4\x93\x5f\x1e\x64\xf5\x5c\xd6\xa3\xe6\x02\x92\x38\x3b\x25\xcc\xf2\xd2\x8e\x84\xb2\x3e\x59\x9d\x96\x69\xe6\x8a\x82\x14\xb9\xcd\xf3\x33\x73\x99\xdc\x6e\xad\x72\xa7\x83\xee\x57\xf0\x54\x1b\xa8\xd7\x00\xda\x5a\x6d\xe8\xa8\xd4\x3d\xf7\xe6\xb7\x94\x85\x02\x65\xdf\x58\x1a\x02\x46\xb8\x63\x7f\x3b\xf6\xb7\x63\x7f\x3b\xf6\xf7\xc5\xb1\xbf\x95\x6d\x3a\x3b\x1e\xf8\x27\xe4\x81\x52\xa5\xa2\xd8\x4c\x19\x4c\xa0\x0f\x6f\xd3\x8e\x93\xa5\x3f\xe4\x42\x19\xcb\x93\xbb\x1e\x3b\x66\x27\xb5\x66\x2b\x22\x5a\xc4\x6f\xcd\xc2\xb4\x28\xc4\x90\xf2\xf9\x6b\x88\x16\xb5\x6f\xbe\x28\x60\x8a\xed\x7a\xe6\x9f\x11\x6e\xa2\x79\xfc\xc7\x13\xf3\xef\xac\x8b\x67\xa0\x9b\xa7\xd5\xf9\xff\x53\xf0\xbe\x15\x67\xdf\x82\xdd\x3d\xbf\xc6\x03\xf1\xb4\x06\xaf\xdd\x5c\x63\x7d\xce\x0b\x3e\x16\x56\x14\x40\x2f\x53\x34\xc6\x2b\x45\xa1\xe4\xee\xa2\x5f\xc3\x45\xdf\x08\x89\x81\x6e\xb9\x4c\xc3\x37\x10\xcb\x8a\x70\x3b\xfc\x63\x45\x24\xe7\x59\xce\x67\x4b\x8a\xbc\x35\x74\x05\x24\x59\x3b\x3a\xbc\xa3\xc3\x3b\x3a\xfc\x47\xa5\xc3\x1b\x88\xde\x3b\x62\xfc\xa2\x88\x31\x24\x98\x9c\x5f\x9e\x80\x27\x75\x01\x21\xae\x37\x6c\xc2\x61\xd4\x1c\xb1\x10\xff\x83\xed\xd9\xf9\x25\xeb\x73\xb7\xba\x46\x18\xc8\x5b\xf2\x78\x25\x2d\xc8\x9d\x95\x63\xa1\x4b\xdb\x0e\x84\xb1\xde\x38\xaa\x92\x4c\x8e\x6c\xf8\x35\x8c\xeb\xfc\x92\x08\x1f\x8d\xca\x58\x99\xdc\x4d\x00\x8f\xaf\x17\x05\x73\x8d\x89\x62\xde\x96\xaf\x5e\x7d\x23\x5e\xc1\xff\x7e\xfd\x3d\xfe\x17\x7f\x4c\xfe\xc7\x5f\xbe\xff\xf6\xd5\xab\x03\xa7\x1c\xbe\x66\x29\x9f\x1c\x3a\xd2\x46\x19\x94\x01\x24\xe8\x7f\xfc\x0f\x76\x1b\x56\xd0\x51\x48\xa2\x27\x55\xdc\xc5\xeb\x57\x7f\xa1\x5e\xbe\x61\x23\x5d\x16\x66\x4b\xa0\x5a\x53\xe7\x69\xd5\xf3\xa1\xc7\xb9\x56\x42\x45\x15\x42\xe7\x9f\x91\xd9\x65\x74\x43\xd9\x54\x02\xe8\xf4\x3d\xb6\x38\x01\xa2\x28\xf4\x32\xc5\x37\x0c\x8c\x41\x6b\x06\x35\x95\x11\x5f\xb3\xfa\x14\xe0\xa6\x45\x19\x80\x23\xc1\x33\x3b\x62\xc9\x48\x24\x77\xd1\x7b\x6b\x44\xa9\x8c\x85\x31\x7c\xb8\x8c\x29\xbf\xc7\x56\x33\x57\x65\xf1\x58\xa7\xcb\x93\xd7\x47\xbf\xc6\x90\x4d\xb3\xcc\xef\xac\x11\x63\x2d\x60\x1f\x3b\xb5\x60\xb4\xb5\xea\xde\xee\xe9\xed\xde\xcf\x30\xbe\xc9\xed\x9e\x93\x13\x6e\x00\x57\xcd\x89\x07\x6f\x11\x3c\xad\xc3\xa0\xd1\xc7\x50\x47\x7e\xf5\x19\xd8\xe5\x62\xd0\x0d\x81\x23\xb6\x1b\xf9\x9b\x78\xd4\xdb\x25\xd5\xf0\xfe\xf4\xea\x6f\x4c\xb8\xfd\x3c\xa6\x8b\x36\x4f\x5d\x90\x5a\x4b\x76\x80\xa9\x0c\xb5\x1f\xdf\x49\x63\x0f\x01\x78\xd4\xc4\x41\x6c\x58\x3a\x1e\x0f\x9f\x3b\x88\x71\x4e\xec\x1b\x8c\x34\x3a\xbe\x3c\x77\xf4\x2b\xad\xe5\xca\xde\xbf\xee\xbd\xfe\xeb\x7f\xdf\x25\xbe\xbe\xe4\xc4\xd7\xd6\xd5\xac\xdf\x11\x8e\x7e\xb8\x39\xd5\x9d\x32\x01\x75\x78\x5b\xa8\xfa\x73\xb9\x4e\x4b\xbf\x48\xed\x51\x2d\x8b\x30\xe7\x36\x19\x75\xc7\xa2\x18\x8a\xee\x9d\x98\x80\xcc\x50\xbf\x9a\xb3\xdf\x30\xb6\xe0\x56\x0c\xe1\x05\x78\x7b\x97\x47\xbc\xcb\x23\x7e\x71\x79\xc4\xcb\xe4\xbc\xf0\xfb\x53\x65\xd6\x36\xf9\x51\xad\xd1\xc6\x19\xb6\xd3\xdc\x6a\x01\xc3\xab\x44\x17\x9e\x65\x75\xf1\xc5\x44\x81\xdc\x9e\x9a\xf1\xb8\x58\x48\x93\x59\xfa\xaa\x21\x3b\xc6\xf7\xc5\x30\xbe\x36\x65\x64\xde\x2d\x39\x0e\x4f\xc4\xee\xae\x1b\x25\x9d\x76\x15\x64\xfe\xc4\x7c\xe8\x25\x57\x90\x89\xd7\x6a\x65\x8d\xe8\xd9\x8b\xc8\xb4\xe2\x58\xdb\xac\xe6\xeb\xaf\xb5\x1a\xc8\xe1\x7b\x9e\x2f\x54\xce\xa8\x0d\x29\x5f\xf5\x8c\x06\x80\x4c\x74\x1c\x0b\x00\x85\xd0\x08\x6a\xca\x71\xab\xc2\x31\x3b\x0e\xf3\xd9\x38\x4c\x5f\x2a\x5e\x4c\x4e\x67\x90\x83\x76\x09\x22\x95\xad\xaf\x3f\xb1\x75\x0d\x65\xfd\xf4\x91\x1f\xc3\xa0\xea\xc5\x74\x70\xb0\x0c\xc9\xc6\x19\x4f\x46\x10\x48\x04\x96\x4f\x77\xda\x88\x11\x02\x10\x86\x2a\xc7\xa2\x90\x09\x4b\x46\xbc\xe0\x89\x15\x85\xe9\xb0\xfd\xee\x7e\x87\xed\xff\xb6\xcf\x74\xc1\xf6\x7b\xfb\x3d\x16\x7f\x87\x2b\xff\x2d\xe6\x66\xc2\x30\x4d\x32\x89\x33\x53\x1c\xc9\x27\xff\xda\xc7\x9b\xb7\xdd\xbf\xb0\x82\xab\x21\x19\x61\xef\xc4\x84\xb2\x5c\x40\xb8\x8a\x7a\x86\xe1\xb9\x57\xf5\xbd\x28\x32\x9e\x63\xbe\x9e\xeb\x44\xbb\x03\x4c\x1d\x42\x53\x48\x85\xea\xe0\xd9\x95\x86\x09\x05\x8e\x99\x94\xa5\xa5\xe7\x7d\xde\xc2\x91\x17\x3a\x11\xc6\xf4\xd8\x47\x13\xb0\xb2\x31\x91\x0a\x1c\x3a\x44\xcc\xd8\xeb\xde\xeb\x57\xff\x9d\x39\x52\x0d\x87\x1d\xce\xaa\xf7\x03\xae\x9e\xdf\x3a\x8b\x69\x3c\x69\x1a\xd1\xf4\x09\x98\xa6\x39\x5b\x39\x08\x9f\xd0\x24\x08\x3b\xa3\xb4\xea\xe2\xf6\x36\xce\x01\x74\xef\xe1\xd4\xa2\x0d\x86\x75\x9f\x79\x0a\x96\xec\x3f\xb4\xa6\xfd\x6f\xf6\xb7\xd2\x29\x58\x7d\x2b\xe5\x78\x5c\x5a\x00\xfb\x5e\x4c\x71\xcf\x7d\xbb\x0e\x93\x03\x2c\x53\xa1\x99\x2d\x1c\xdd\x13\x50\xa2\x85\xae\x07\x50\xff\x6a\xe2\x90\xb9\x15\xd8\x45\xd2\x94\x96\x08\x55\x97\x24\x34\x2f\x09\xc0\x1d\x84\xea\x36\x29\x78\x5a\x0f\x43\x1a\x68\xed\xbb\x10\xe6\x09\x47\xbd\xd1\x9e\xb9\x6b\xaa\xbc\x67\x84\xdc\x16\xe8\x2c\x53\x32\xc6\xca\x61\x7d\xe1\x97\x19\xc1\x71\xd0\x99\x1c\xe6\x7a\x96\x8f\xc4\x58\x14\x3c\x9b\x89\x93\xb3\x86\x13\x73\x27\xe8\x7e\x29\x82\xee\xce\xe0\xe2\x7b\x5d\x4d\x7c\xf5\xd2\xe5\xd3\x08\xad\x67\xea\x7e\x69\x74\xce\x74\x63\x66\x44\xe6\x34\x64\xc6\x23\x5a\x65\x35\xcb\x75\x5e\x66\x9c\xf2\x9a\x85\xba\x97\x85\x56\x10\x0c\x73\xcf\x0b\xe9\xe8\x03\x32\x0a\xa8\x0d\x76\x83\x3c\xc9\x82\x77\x99\x1c\x50\x84\x56\x17\xfa\xdc\x37\x11\x77\xf7\xfc\x99\xee\xaa\xe7\x03\x5d\xbc\xee\x39\x97\x85\x61\xdc\xcc\xfe\x6c\x9b\xc2\x2c\xab\x55\x62\xa0\x70\x62\xbb\x72\xc5\x1c\xc7\xcb\xee\xa5\x78\x38\x7a\xd0\xc5\x9d\x54\xc3\xae\x5b\x91\x2e\x99\x1c\x8e\x00\x61\xf9\xe8\x2b\xf8\x9f\xd5\xaf\xad\xcf\x03\x6f\x59\x51\xe9\x61\x24\x28\x07\x20\xe6\x39\xde\x1d\x8e\x7a\x42\xeb\xc8\x93\x65\x57\xa5\xf5\x91\xfc\x45\x4c\xae\xe1\x78\xd5\x9c\xc2\x53\x73\x08\x27\xd0\xc9\x2f\x40\x9e\xa3\xc3\xd8\x62\xbf\xd1\x3b\xb0\xac\xae\x81\xeb\xdc\x6a\x3a\xef\xeb\xc0\x1b\xec\x4e\x15\x9e\x2a\x5d\x30\xc7\x22\x83\xb0\xb9\x85\x03\x36\xdb\xee\xe0\xf6\x75\x99\xd5\xa1\xf5\x59\x5c\x62\x83\xae\xb5\xf3\xb8\x11\x24\x60\x44\x71\x4e\xb1\xe1\x39\xac\xc7\xae\x18\xf9\x1f\x40\xc7\x5f\xa9\x18\x39\x66\xcb\x35\x36\x7a\xfb\x56\x64\x2f\x10\xec\xec\xc7\x3b\xb1\xba\xa5\xfd\xf8\x05\x08\xce\x2f\xdc\x48\x1c\xd3\xfb\xa7\x91\xb4\x2f\x74\x2a\xf0\x8f\xf6\x02\x77\xf3\x9d\x46\x81\xec\x3a\xdc\x50\x95\xe0\x16\x4b\xe5\x1c\xf3\x60\x21\x9c\x93\xee\xa8\x77\x8e\x5e\xd4\x62\xe1\xe6\x0b\x4a\x68\xf5\xc2\x2e\x7f\x59\x2a\x35\xfd\xd2\x68\xce\x52\x91\x64\xbc\x70\xa2\x3f\x20\x4a\x39\x09\xa0\x2e\xed\x24\x22\x8d\x4d\x1e\xba\x28\x84\xc9\x21\x92\x93\x58\x4b\xad\x4b\x6f\xc1\x32\xb6\x28\xe1\x44\x36\xb0\x90\xfc\x41\x63\x12\x71\xdb\x12\x6e\xe6\xe2\xd8\x6c\x43\x72\x23\xc2\x1f\xb4\x54\x35\x2d\xce\xd5\x26\xd8\xc4\x6e\xda\xe6\x78\xdb\xd4\x71\x09\xf5\x5e\x66\x8e\xbc\x56\xdd\xe5\x39\x87\xef\x39\x48\x3b\x51\xe7\xaa\xde\x7a\x6a\x2a\xcd\xe7\x2b\x4c\x68\xa0\x8b\xbe\x4c\x53\x01\x95\x7e\xe1\x8a\x38\xc1\xb6\x13\x03\x43\xa7\xd5\x23\x70\x2a\xad\x31\xdd\x52\x2e\xe3\xbf\x1f\xcf\x4f\xa7\xa6\xf5\xb1\x2a\xee\xfa\x99\xa7\xd2\x92\xbe\x57\x87\xb2\x79\xb3\x3a\x0b\x08\xcc\xd6\xc4\xf7\xcb\x42\xff\x2f\xcc\xff\x5f\x08\x13\xc5\xf3\x86\x29\x43\x2a\x48\x5c\xc8\xf1\xf5\x50\x6e\x71\x13\xbb\x45\x5f\x30\x92\x86\xe8\xae\x4c\xf5\xee\x48\x35\xa4\xec\xb0\xd2\x78\xe1\x2a\xb6\x73\x47\x3d\x52\x5e\x92\x6b\x8d\x35\x99\x3a\xac\x54\x99\x30\xc4\x17\x40\x20\x15\x19\xe6\x21\x41\x29\x50\x34\xcb\xa4\x68\x40\x0f\x18\x62\x63\x9e\xe7\x50\xd8\x44\x0f\xf0\x4b\x00\x5a\x67\x47\xa6\xc7\x2e\xb4\x0d\x35\xc4\xd1\xf6\x8b\x59\x13\x09\xcf\x42\x42\xd5\x40\x0e\xc7\x3c\x0f\xe5\x30\x91\xb9\xb8\x2f\xf8\xe8\x67\x9f\x86\x3c\x6e\xc7\x68\x5a\x09\xdb\xb5\x8c\xa2\x0e\x13\xe4\xc1\x88\xac\x40\x33\xd6\x6b\x11\xbf\xa9\x76\xc7\x6f\x07\xec\x7e\x94\x1b\x02\x2c\x14\xd6\xfa\x61\xa4\x0d\xc1\x4d\xd2\xd5\x74\xdc\xcc\x5d\x27\x3a\x11\xfe\x67\x18\x0d\x18\xe1\xa3\xb1\x7a\xfd\x40\xa4\xb8\xda\x0b\xbe\x1c\xde\xc2\xfd\xc0\x2b\x5b\xaa\xa9\xb7\x49\x14\xa6\x93\x05\x1f\x44\x83\x88\x34\x51\x1f\xc8\x78\xa5\x21\x60\x48\x34\x9f\x35\x7d\x0d\xb5\x82\xe1\x46\xd8\x92\x96\x06\xe3\xe6\xe9\x78\x49\xaa\x5d\x50\xdc\x89\x34\xa0\x0e\xf6\xd8\xa5\x1b\x64\xd0\xeb\x0b\x91\x71\xc0\x43\xf4\xba\x9f\xfb\xac\xf7\x10\xba\x8f\xec\xf7\x7a\xfb\x08\x68\xa0\x0b\x66\x2c\x2f\x08\x89\xd3\xfd\xbe\x65\x75\xe9\x17\x31\xb9\xd1\x71\x09\x53\xb6\x8e\xba\xb4\xb3\xe2\x4c\x59\x71\xcc\x67\xb7\x13\xb6\x2d\x85\x36\x97\xbc\x3f\x05\x51\x7f\x81\xa4\xbc\x9a\xf7\xd3\xe6\xad\x12\xb5\x6f\x51\x3d\xb7\x4a\x13\x1c\x43\x45\x2e\x77\xa4\x7c\x72\x9e\x11\x96\xe5\xa2\x18\x4b\x48\xd9\x32\x4c\x2b\x96\x00\x48\x73\x4a\x2b\xda\x0f\xd5\x03\xa3\x5c\x57\xc5\x74\x62\xbd\xd1\x89\xf5\x85\x7d\x10\x42\xb1\x57\xaf\x5e\xbd\x82\xf9\xbc\xfa\xe1\x87\x1f\x18\x24\x86\xa4\x22\x91\xe3\xe9\x86\xd0\xea\xbb\xd7\xaf\x7b\xec\xef\xc7\xef\xdf\x31\x9e\xc0\x7d\x64\x7d\xed\x68\x14\xf4\xec\x1a\xd4\x5e\x36\x1d\xf6\x3f\xaf\x3f\x5c\x54\xc5\x42\xea\x4f\x41\xcb\x0a\xd3\xab\xc3\x94\xbe\xfa\xfe\xdb\x6f\x7b\xec\x54\x16\x60\xe4\x96\xe4\x15\xa1\xb3\x01\x74\xd1\xc7\x4c\xf0\xc1\x00\x39\x03\x64\xec\x3a\xa2\x8e\xc9\xa5\x24\xe9\x8d\xe5\x70\x64\x29\x77\xd9\x31\xe4\x4c\x26\x44\x4a\xb1\xa8\x37\xde\x79\x1f\x87\x01\x7d\x55\xa7\x6d\x0c\x05\xc1\x33\x79\x27\xd8\xc0\xfc\xe4\x14\x64\x64\x33\x48\xc1\x00\x2e\x94\xdc\xc4\xd8\x59\xb5\x57\x66\x2a\x06\x62\xcd\xbc\xb5\x55\x2d\x6d\x3b\xe6\xbf\x63\xfe\x3b\xe6\xff\xe7\x66\xfe\x08\xe3\xb0\x88\xe1\xfb\x02\xd6\x3c\xcf\x33\x8f\xee\x14\xf0\x1f\xa6\x6b\xa0\x15\xa5\xf2\xf4\x97\xb7\xac\x72\xca\x8b\xe1\x32\x5a\x75\x5c\x0c\x01\x5b\x39\x18\xb1\x84\xb2\xc5\x04\x6c\xdc\x18\xf0\x94\xea\xe4\x4e\x14\x4c\x8e\xf9\x50\xec\x1b\x76\xf2\x1e\xd4\x7d\x60\x83\x72\x10\xb4\xae\x18\xca\xbd\xc7\x3e\x91\x3f\x3b\xc6\xde\xfe\x8f\x83\x4f\xc7\x57\xbf\x5d\x1c\xbf\x3f\x3b\x04\xb6\x21\xa0\x54\x95\x48\x23\xd1\x23\x4c\x7e\xbf\xe6\x1e\x27\x8a\xe1\x9d\xe4\x51\xb0\x51\x21\x8c\xce\xee\x3d\xd9\xaa\x0c\x8b\x74\x85\xa5\xca\x4b\xeb\xdd\x02\x9e\x90\x95\x2a\x19\x71\x35\x14\x14\xcf\x15\x0f\xcb\x4c\x94\xe5\x8f\x9e\x9b\x08\x93\xf0\xdc\x0b\x30\x9c\xa5\xba\x74\x1f\xff\x8f\xff\xe8\x30\x29\xde\xb0\xff\x88\x5e\xec\xb1\x33\x6a\x1b\xcd\x17\x49\x9f\xb8\x17\x05\x74\x46\xb3\xed\xb0\x42\x0c\x79\x91\x02\xa1\xd2\x83\xda\x09\x0e\x13\x04\x7c\x10\xe3\xce\xb1\xd2\x76\xa6\x2b\xa1\xdd\x95\xb5\xdc\xdc\x99\x23\xa9\xdc\x91\xed\xa6\xdc\xf2\x6e\x74\xd4\x90\x28\x89\x6e\xa2\xc7\x63\xae\xd2\x2e\xa7\x83\xd0\x0d\xbb\x70\xf4\x15\x01\x4e\x77\x79\x68\x25\x55\x97\x77\xcd\x48\x64\xd9\x73\xc3\x09\xd2\x08\x96\x1c\xe7\xb3\x70\x7a\x19\xf4\x05\x16\x02\x26\x1e\x45\x52\x7a\x61\x14\xee\x0f\x4c\x61\xe6\x01\x3f\xbb\xb8\xb9\xfa\xfb\xe5\x87\xf3\x8b\x9b\xdd\x39\xdf\x9d\xf3\xe7\x3f\xe7\x42\xdd\xb7\x4c\x07\x9a\x1d\xb8\x44\xba\x89\xaf\xff\x51\xe1\x09\x4d\x2f\xef\x76\xa5\x98\x33\x75\xff\x89\x17\x4f\x92\x1a\xab\xa6\x2a\x45\xaf\x9f\x1a\x2b\xd4\xfd\xdb\x42\x8f\x5b\xae\x31\x79\xe4\x6b\x41\x63\xb3\xd7\x7d\x7a\xc1\x43\xb8\x30\x09\x1f\x11\xf5\x41\x1b\xe4\x38\x40\x20\x9d\xfc\x76\x7e\x7a\x76\x71\x73\xfe\xf6\xfc\xec\xaa\xc7\x8e\xb3\x8c\x49\x05\x51\xc0\x75\x21\xbc\x10\x04\x8c\xc4\xa1\x1e\xa4\xb8\x77\x43\x78\x18\x89\xc6\xa7\x41\xb0\x76\x12\x2b\x68\x60\xbf\xba\xe7\x28\x70\xd3\x85\x93\x8a\x8d\xcb\xcc\xca\x3c\xf3\xe6\x50\xd3\xa9\x34\x82\xb8\xce\x4a\x08\x64\xce\xb8\xb1\x95\xe9\x34\xcb\x98\xe5\x77\x20\xd2\x27\x22\x75\x74\x20\x04\x58\xfb\xb9\x62\x65\x9d\x33\x75\x1f\xe8\x4a\x89\x57\x12\xd5\x91\xd9\x7d\x3c\xc3\x11\x75\x7b\x4f\xb6\x98\x4d\x6e\x29\x70\x8b\x65\xc5\x7f\x22\xc6\x02\xfa\xd8\xca\xa2\x76\x55\xe8\xe1\x08\x7a\x31\x73\xea\xa9\x80\xa9\x3b\xcb\xf4\x03\x1b\xc9\xa1\x23\xb3\x99\xb8\x17\x99\x77\xa7\x46\x46\x13\xab\x83\xb1\x5b\x17\x10\xae\x5e\xc8\xb4\x76\x72\xf0\x33\x52\x31\x27\xdd\x67\x9a\xa3\xd6\x88\x85\xc3\x0c\x6a\xe1\xa7\x22\xcf\xf4\x64\x4c\xb5\xfa\x53\x76\x6d\xb9\x15\x83\x32\xbb\x16\x73\x6b\xda\x2f\x8c\x5d\x71\x9f\xbc\x2c\xb3\xec\x52\x67\x32\x59\xe6\xb6\x3d\x87\xd5\xcc\xcb\x2c\x63\x39\xb4\xef\xb1\x0f\x0a\x94\x9a\xe3\xec\x81\x4f\x4c\x87\x5d\x38\x5e\xd4\x61\xe7\x83\x0b\x6d\x2f\xbd\xce\x19\x9b\x35\xb0\xa1\xe3\xea\x6f\x28\x18\xc8\xf2\x61\x4d\x19\x05\x50\x90\xb8\x03\x34\x2d\x3c\x48\x33\xf3\x90\x6e\xbc\xad\x5f\x41\x4f\x8e\x03\xe1\xdf\xab\x2f\x62\x26\x07\x22\x99\x24\xd3\xd1\xfe\xed\x41\xb4\x42\x0f\x8b\x22\x34\x8e\x93\xc8\x52\x03\x3e\xbf\xea\x70\x11\x86\x1b\x45\x62\xc1\xe5\x96\x8a\xa1\x93\xdc\x08\x4a\x18\xa3\x73\x16\xc6\x8b\x44\xcc\xcc\xbc\xfb\x73\x66\x7a\x2f\x94\x30\xe6\xb2\xd0\xfd\xf5\x67\x8b\x6f\x2f\x9a\xe9\xa5\x28\xa4\x4e\xb1\x82\x4d\xdf\x83\xb7\x84\xd1\xe3\x18\xc0\x68\x49\xbf\x55\x34\x1a\x48\xaf\x17\x1b\x05\xbd\x3f\xe0\x32\x9b\x39\xcb\x55\x0f\x8f\xbf\x97\xe6\x28\xd7\xf8\x9f\x6e\x58\xcc\xaf\xc2\x10\xbb\xf0\x55\xb3\x15\x4b\x41\x35\xef\xca\x5a\x03\xe6\xa6\xd3\x8b\xeb\xdf\xde\x1d\xff\x78\xf6\x8e\x32\x74\x22\x32\x42\x3a\x2a\xb2\xb8\x11\xbf\x77\x4c\x8e\xaa\xdf\x81\x65\xea\x20\xbc\x7b\xb8\x9c\xec\xb7\xb9\x00\x8e\x31\xb6\xcd\xa3\x86\xb6\xee\x3c\x8a\xc7\x5c\x1b\x51\x45\x77\x45\xcc\xfb\xcc\x3d\xc2\xa0\x48\xb0\x41\x03\x94\xde\x50\xde\x7b\x0c\x2f\x3c\xeb\x55\x6e\xd4\x0c\x68\x24\xd7\x4e\x09\xeb\x36\xcc\xe3\xc5\xc1\xdd\x89\x50\x1e\x9d\x7e\x61\x3a\xac\x5f\xa2\xd1\xbc\x90\x63\x5e\x48\x04\x2a\xf4\x9d\xf1\x0c\x75\x18\x5c\xfb\x49\x73\x48\xa7\x1f\xce\xae\xd9\xc5\x87\x1b\xc7\x47\xef\x85\x87\xc5\x87\xe7\x30\xad\xbe\x70\x6f\xe0\x44\xd3\x1e\x3b\x56\x13\x7c\x18\xcc\x6d\x60\xae\x83\xf0\x4f\xad\x6a\xde\xd0\xdb\xbd\x57\x3d\xf8\xbf\xdb\x3d\x37\xcf\x02\x4c\x6b\xca\x38\x7e\x11\xcf\xc0\x9f\x7b\x9e\x24\xc2\x18\xe9\xe4\xfa\xb0\x9e\x34\xfb\xa7\x67\xec\xe1\x1a\x5e\xea\xc2\x6e\x2e\x82\xba\x35\xe9\x8e\x79\xee\xe4\x4f\x53\x8b\x14\x60\x8c\x4a\x54\x57\x5f\x6b\x24\x44\xe6\x85\xb6\x3a\xd1\x59\x3c\x8a\x7f\x2e\xf9\x94\x1f\xd7\xb8\x99\x3f\xb1\x4c\x30\x9e\x3f\x92\x0d\x24\xe4\x42\xf0\x54\x7e\x6e\x12\x6b\x10\xb4\x8e\x85\xc1\xcc\xa6\xb5\x58\x14\x0a\x0e\x9c\x7f\xc3\x87\x68\x9a\x97\x4b\x80\xab\x48\xdf\x75\x17\xd7\x07\x0e\x51\x45\x09\x10\xc6\x16\xae\xf5\x89\x1e\xe7\xa5\x15\xcc\xbf\x18\x45\x44\x79\x9f\xcd\x42\x5d\x71\x0d\x19\xa7\x0a\x82\x3b\x42\x29\xc1\x69\xd7\x6e\x10\xdd\x30\xff\x48\x09\x9f\x0b\x0e\x5a\x16\xd2\x4e\xdc\xde\x8b\x47\xbb\x09\x54\x73\xad\x9f\x85\xa9\x5d\xd4\x36\x72\x4b\x09\x60\x66\x24\xd9\x78\x43\xec\xca\x6b\x82\x02\xeb\x91\x9f\x13\x4c\x5e\x3c\xda\xa3\x95\xcc\x1c\x7e\x61\x45\xd7\x9d\xbc\x6a\xfd\xa6\x7a\x9d\x0b\xb7\x57\xd8\x32\x7f\xea\xab\x7d\x1d\x7d\x86\x49\x95\x82\xe6\x17\x89\x8d\x97\x3a\x65\x23\x6e\x98\x29\x81\x6d\x0c\xca\x0c\xb8\x9e\xb4\x92\x67\xf2\x77\xaa\xfa\x18\xc9\xe3\x4a\x93\x77\x0f\xaf\x15\x59\xd6\xc8\xaa\x57\x2a\x2b\x33\x7f\x86\xb1\x62\x65\xbd\x67\xaa\x21\x09\x2c\x36\xd0\x82\x4e\x18\xc8\x94\xe8\xd6\x61\xff\x0b\x10\x97\x03\x09\xa9\x09\x9d\xf0\x3a\xda\xd5\xdc\x17\xd1\x8a\xe6\xfd\xc2\x64\x1c\x64\xa9\x1c\xa0\x7f\x85\x3e\x19\x61\xc8\xd2\x12\xf4\xc5\x50\x62\x3d\x3f\x40\xa2\xbc\xd4\xe9\xbe\xa9\xe4\xe2\x0e\xea\xf5\xd2\x92\xf3\x14\xc4\x69\xce\x32\xad\x86\x90\xfe\xea\xbe\x05\xea\x19\xe4\xd5\xea\x82\x3d\xf0\x62\xec\x18\x33\x4f\x46\x90\x42\xcb\x95\x4f\x27\x36\x56\xf0\x74\xd2\x35\x4e\x4d\xf3\x30\xca\x5a\x55\xc3\xff\xfc\xf4\xd0\xd8\x54\x2e\x0b\xa5\xfc\x35\x58\x10\x63\x52\xe5\xef\xa4\xd3\x7e\xc1\xb8\xc0\x59\xbf\x74\x2b\x8f\x65\x22\x5d\xbf\x53\x96\x19\x77\x81\x31\x83\xf8\xbc\x6e\xd8\x35\xc2\x76\x80\xe1\x50\xc0\xff\x9c\xd7\xe1\xb8\x70\x54\x22\xc9\x01\x2d\x15\x3b\xfb\xf0\xb6\x42\x52\x75\x4a\x3a\xcf\xcc\x5a\xa9\xc4\xf0\xd5\x0f\x6a\x69\x80\xec\xaf\x91\x49\x75\x6a\x6e\x21\x1f\x26\xd3\x94\xce\x8e\x93\x49\x46\x5c\x29\x91\x31\x3e\xb0\x4e\x4c\xb7\x70\x09\xfb\x42\x28\x77\x30\xbc\xdd\x26\x38\xa6\xac\xe5\xc9\x88\x2c\x48\xb4\x18\x06\x72\xb4\xa3\x1e\x8d\x2d\x04\x1f\xfb\xa4\xc7\x31\x97\xd8\x15\xe3\x49\xa1\x8d\xa9\x0c\x4d\xd8\x99\xc7\xb8\x35\x78\xc1\xfd\x54\x19\x86\x0c\x54\x29\xe0\xe1\x6b\x34\xac\x9a\x6b\x0c\x6e\x69\x27\x14\x3c\x09\xf7\x5f\xb0\x81\x2c\x8c\xf5\x79\x19\xf8\x45\x32\x89\xba\xfe\x42\xdc\x80\xa2\x91\x1a\x1a\xaa\x4a\x43\x28\x05\x5c\xa7\xaa\x43\xea\x2a\x95\x86\x24\x78\xd3\x71\xf7\x17\xa5\x67\x5c\x68\x3f\x52\x58\xea\xd4\x17\xf2\x84\xde\xe9\xa7\xa8\xbb\xd8\x44\x17\xc8\x4d\x75\x10\x07\x19\x5a\x22\xe0\xf0\x74\x6a\x72\x36\x21\x01\x78\x22\x3a\x75\x4c\x23\x3b\x7c\x21\x12\x81\xae\xed\xd9\xa7\x72\x8d\x43\x89\x85\x95\x81\x70\x10\x7a\xec\xe5\x2a\xe5\x9d\x2e\x21\x58\x24\xac\x9b\x0f\xed\xb0\x3a\xfa\x25\xf6\x8a\x44\x9f\x63\x84\x69\x1b\xa8\xf4\x43\x21\xad\x15\xb0\xe4\xbe\x52\x54\x08\x49\x88\xfb\xa8\x60\xe5\x7b\xcc\x23\xde\x46\xef\x4a\x65\x05\xf8\x65\x10\x0b\xbe\x5f\x48\x31\x60\x03\xe9\x54\x39\x04\x45\xed\x38\x16\x32\x22\x53\x2b\x37\x46\x14\x30\x1c\x47\xfc\xcb\x42\xf8\x61\xf5\xd8\xaf\x34\x2e\x5b\x94\x0a\xa1\xd7\x08\xb6\x5e\xe9\x54\x38\x06\x32\x84\xb8\x20\x2a\x61\xf5\xed\xab\xbf\x7e\x0f\xb0\x13\x06\x0d\xc4\x56\x5b\x9e\x85\x39\x66\x42\x0d\xdd\x4a\xe1\xdd\x81\x38\xf5\x60\x2b\x0a\x0b\x90\xc9\xb1\x24\xd4\x83\xd7\x5f\xdf\xf5\xeb\xc6\xad\xa3\x54\xdc\x1f\x45\xcb\xd7\xcd\xf4\x70\x3b\x1a\xf6\x8c\x23\xd0\xca\x60\x47\xcc\x9f\x8d\xf4\x03\xc6\xab\xcd\xd8\x5b\xa2\x56\x8e\x4f\xfa\xc0\xb1\x1e\x54\x7c\xc3\x49\x7b\x48\x8e\x5a\xe8\xdb\xcc\x13\x39\x95\xdd\x5d\xa3\x1a\xb6\x34\xe1\x93\x5a\x61\xd8\x14\xc9\x09\x70\x6f\x69\x6f\x7b\xec\x2d\xcf\xb2\x3e\x4f\xee\x6e\xf4\x3b\x3d\x34\x1f\xd4\x19\xc4\x97\xd4\xc6\x02\x16\xf1\x64\x54\xaa\xbb\x86\x6d\x48\x0f\x99\x2e\x6d\xee\x54\xfa\xc1\xdc\x09\x0f\xa8\x64\x16\x12\x30\x1f\xce\x54\xf5\x22\x1e\x65\xb0\xbf\x73\x02\x93\xc6\x03\x13\xf7\x6f\xe2\xb3\xf0\xf5\xab\x6f\x11\xd0\x04\x3c\x6a\x7f\x79\xc5\x32\xa7\x37\x75\xf0\x86\x09\x2a\x43\x6f\xc6\x3c\xcb\x9c\x84\x1f\x9f\x19\xb7\xd0\x5b\x3a\x23\x76\xd9\x71\x68\xcd\xc6\x6f\x6e\xfe\x0e\x3c\x5c\x5a\x23\xb2\x41\x07\xcb\x5f\x84\x20\xb6\x7d\x20\x7a\xfb\x74\x79\x1d\xcf\xd8\x0e\xf3\xc5\xd0\xa2\x53\xe1\x34\xc9\x65\xe6\xa4\x5a\xdb\x66\x62\x65\x3f\xd3\xc9\x1d\x4b\xe9\x21\x0e\x13\x64\x44\x22\x0e\x95\xb2\xb5\x5d\x4b\xc8\xa7\x68\x50\x4f\xe2\x8b\xc3\x29\x01\xf5\xdf\x92\xbd\xe1\x3e\xaa\x3e\xb1\x64\xc9\x9d\xb4\xee\xa3\x43\x7d\x29\x91\xe5\xd4\xff\xa9\xad\x4f\x51\xf9\x8c\x27\x59\x72\x98\xe6\x36\x57\x9c\x22\xb7\x4e\x65\x0b\x38\xfb\xb0\xa2\xf4\x12\x4b\x29\x1e\x74\x52\x81\xf7\xd4\xc3\x07\xa7\x84\xd1\x7d\x13\x8c\x8a\x21\x3a\xc1\xb8\xd6\xc8\xfc\x43\x74\x68\x50\x6d\xd3\x69\xa1\x1b\x1c\x23\x1b\x10\xa9\xa9\x88\xae\xf9\x89\x40\xdb\xc8\xeb\xc1\x51\x9f\x37\xbc\x84\x53\x1e\x42\xf8\xb3\x5f\x37\xa8\xa2\x6b\x71\x69\x6c\x17\x46\xd8\xb5\xc8\xa1\x73\x14\xc7\x4b\x59\x4e\xee\x01\x07\x9a\x34\x0c\x00\xef\x7b\x4c\xf4\x86\x3d\xf6\x8f\xdb\x3d\x37\x89\x61\x52\x38\xfd\x6e\x34\xc9\x45\xe1\xce\xd6\x9b\xfb\xd7\xbd\x57\xbd\x1f\x10\x30\x1f\xe3\x64\x46\x65\xdf\x35\x19\x6a\x3d\xcc\xc4\x6f\x91\x27\x6b\xfa\xa5\x7f\x3e\x77\xe8\x84\x91\xbf\x8b\x1f\x1d\x03\x6c\x01\x98\xe1\xda\x7a\x07\x07\x2d\x89\x22\xb9\x6c\x41\xc8\xf0\xf7\xdf\xae\x5d\xea\x62\x41\xe2\xd9\xf6\x0e\x1c\x98\x81\x17\x26\xec\x56\xed\xe2\xaa\x29\x3c\x38\x2a\xc0\x39\x80\x41\x0a\xa8\x04\xce\x60\x54\x73\xcf\x64\x32\x67\x1c\x33\xcf\x66\x39\xee\x8b\xc2\xbb\x63\x22\x6f\x0c\xb9\x21\x72\xb0\x87\x9c\x5f\x7a\xdf\x83\x0f\x25\x0f\x31\x13\x18\x1f\x01\x2f\x2b\xe8\xab\xc3\x5e\x51\x19\x14\xf6\xe8\xff\xf1\xfd\x77\xdf\x7d\xf3\xfd\xd6\x83\xc0\x47\xda\xd8\xf3\xcb\xa5\x92\x0e\xb7\x58\xba\xea\xfc\x12\x04\x00\x49\x52\x9e\x78\x24\xe8\x09\x9a\xf8\x1a\x72\x96\xeb\x76\x0b\x6b\xec\xba\x99\x0e\x00\x5f\x77\x95\x5d\x47\x3f\x6b\x63\x2f\xe8\x28\xd5\x3d\xea\x55\xbf\x63\xc7\xaa\x58\xed\x2c\xf6\xd8\x7b\x6d\x6c\xac\xec\x50\xb5\x66\x25\x9c\x70\x3b\x92\x0b\x6f\xe5\x5a\x7b\xd8\xc2\x09\xba\x68\x61\x14\x3b\x3f\xbe\x38\xfe\xed\xfa\xd3\x09\xc4\xc6\x51\xec\x3b\x38\x38\xe3\x24\x09\x9d\x92\x6f\xd4\x7d\x2e\x8d\x6e\xd7\x02\xe7\x68\x8f\x81\xf7\xd5\xa7\xbf\xe3\xd6\xb9\xc3\x44\xa6\x46\x08\xbe\xf3\x55\xcc\x26\xde\xef\xb1\x4e\xe8\x45\xf0\x55\x2d\x91\xba\xa8\x19\x81\xbf\x16\x51\x46\xcb\xc7\xd3\xcb\x0e\xbb\x39\xb9\x84\x88\x89\xeb\x93\x9b\xcb\xba\x66\x71\xbb\x77\x73\x72\xd9\xbe\xa8\x4a\x4b\xa2\x99\xcc\xf2\xf6\x6d\x4e\x3c\x21\x8e\xa5\x0d\xf5\x84\x86\x04\x91\xeb\x76\x92\xdc\x9e\x64\x60\x1d\xc4\x8e\x14\xa8\xb4\xa6\x31\x40\x45\x5a\xa7\x7d\xba\x3b\x84\xf8\x22\xfd\x28\x85\x82\x64\x29\xe5\x79\xd2\x78\xea\xf6\x54\x8e\x59\xd7\x4a\x1a\x56\x1f\xce\xaf\x5c\xda\x76\xf9\x4f\x14\xec\xb8\xb6\xf1\xbf\xfe\xdd\x2b\xea\x6d\x91\x33\xe0\x54\x58\x2e\x33\x13\x2a\x06\xd1\x08\xaa\x75\x5a\x6c\x70\x10\x53\x41\xbf\x6b\x8e\xf5\xa6\xea\x70\x95\xe1\x56\xe3\x58\x36\xe2\x07\xdc\x84\x2d\x0d\x97\xb6\x74\xa5\xb1\xd2\x08\x66\x0e\x74\xea\x76\x6d\x74\x51\xae\xa6\x8e\xd1\xe2\xfb\x42\xed\x09\x7d\x8a\xfe\x08\x57\x86\xaf\x24\x67\x90\xdd\xf4\x78\x65\x7f\xe0\x02\x80\x9a\x1b\xd9\x8c\x31\x6d\x4a\x8d\x72\x2c\xea\x36\xcc\xc8\x25\xc0\x0d\x1a\x84\x0e\x0a\xd1\x3d\xa4\xe1\x3d\xd9\xd2\xdf\xcc\xba\x18\x8b\x57\xbf\x7a\x05\x37\x20\x3a\xd3\x6b\xee\x41\x68\xbb\xb4\xb2\x61\xac\x44\x9e\x9f\x7a\xd5\x0e\x39\x38\xdb\x47\xb5\xe2\xcd\xd1\x11\xca\x12\xa1\xdb\xdf\x64\x8a\x85\xee\xf6\x57\xe7\x6b\xe2\x51\xda\x93\xe5\xf9\x9d\x67\x8f\xd2\x7a\xb3\x60\x88\x59\x81\x6d\x8c\x4d\x76\xcd\x28\xa8\x6d\x0b\x22\xee\x9c\x9a\xd1\x4b\x3a\xcd\xb5\x25\xa8\x9d\xe3\x68\xd8\xab\x95\x9a\xc3\x6c\x00\x9f\x00\xb1\xe2\x1a\xb7\x2c\xa2\x6a\x96\xc2\xb1\x1c\x80\x95\xff\x90\x61\xe3\xb5\xf7\xbc\x55\x59\x3b\x39\x6c\x91\xc7\x06\x8d\x3e\xe3\xd9\x7b\x01\x84\x34\x2f\xc4\xbd\xd4\xa5\x21\x77\xfe\xac\x59\xb3\x16\x04\x75\xb6\xa4\x18\x08\xc1\x76\x85\xc4\x5f\xa7\xf8\xfc\x62\xea\x4b\xed\x91\xf4\x7a\x16\xbd\x26\xdd\x5d\xf7\xde\x3d\x8c\x26\xd3\x2e\x48\xa7\x62\x4d\x84\xf5\xfc\x78\x2d\x3c\xa4\xd5\xef\xdd\xb6\x86\xb1\x55\xae\xba\xa4\x6a\x61\xad\x65\x85\x6f\x96\x92\xfc\x15\x0a\x39\x95\x05\x04\x7d\x98\xa8\x60\x65\x2d\xb4\xea\x25\x31\xd6\x75\x83\xf5\x5b\x98\xd7\xd0\xa4\x36\xed\xf2\xa6\x0d\xde\x38\x62\x7e\xcd\x91\x2f\x5d\xd2\x73\x6c\x35\x45\x82\xf6\xc9\x70\xba\xc6\x92\x39\xa2\xde\x54\x2d\xd9\x06\x6a\xc1\x0a\xfa\x40\x73\x0a\x53\xfc\x25\x94\x22\x9b\x13\x6c\xdf\xc2\x48\xd2\xb0\xca\xad\x1f\x13\xbe\x1d\x0f\x64\x21\x78\xba\xcc\x07\x79\x1d\xca\x31\x3f\xcc\x8c\xa1\x19\x71\xc3\x72\x6e\x20\xf5\x13\x70\x3d\x29\x04\x15\x43\xb9\xd6\x71\x2b\x52\xa8\xc7\x09\xb8\x88\x96\xdf\x1e\x15\xec\x76\x56\x8e\x85\x99\x31\x3c\x08\xd9\x89\xe2\xd5\x88\xee\x64\x13\x2a\x70\x4d\x54\xb6\xea\x28\x15\x3c\x8d\xed\x6b\x60\x50\x82\x4d\xf0\xc4\x97\xba\x84\x88\xda\x59\xc0\x5a\x09\xcf\x12\xc2\x74\x01\x81\xa5\xd1\x63\x8f\xfd\x08\x27\x4e\x1b\x11\x7f\x87\x17\x82\x99\x12\x81\x56\xad\x66\x43\x5e\xf4\x1d\x65\x48\x74\x96\x61\x3c\x3c\xd9\x75\x31\xf5\x0c\xdc\x43\x43\x61\x59\xc2\xf3\x1c\xeb\x3d\x7c\xc7\xfa\x13\xf6\xd3\xc9\xd6\xed\x7f\x5e\xa6\xd8\xea\x51\xa1\xe8\x4a\x3a\x28\xec\xbc\x0a\x68\x04\xa8\x1d\x8c\xea\xe9\x8b\x44\xc3\xae\x16\xa5\xa0\x40\x2c\x53\x0b\x97\x34\x58\xe2\x24\x15\x85\x53\xcf\x42\x1c\x63\x8f\x5d\x09\x23\xe2\xb2\xff\xb3\x53\xff\xa2\x63\xa1\x0b\x26\x07\xbe\x1e\x0c\xcb\xb4\x11\x86\xe4\x0e\x2b\xc6\xb9\x2e\x20\xdb\xa0\xc7\xce\x8d\x8f\x67\x83\x31\x41\xb7\x4a\x4f\x8d\x8a\x72\xfb\xd6\x0b\x6a\x7b\x11\x04\xd0\xb3\xe7\x99\x74\xaf\xa5\x4c\xd9\x84\x05\x44\x8a\x33\xef\xb2\x4f\xf1\xce\x19\x2c\x69\x53\xe1\xf4\x94\x8b\xb1\x56\x67\x14\xf7\xbe\xc8\xdf\x58\x6b\x58\x49\x31\xb3\xca\x7a\x93\xfb\x07\x5f\x09\x41\xf5\x2d\xe4\x97\x16\x7e\x89\xcb\xca\x9d\xe0\x39\xed\x50\xde\x8b\x59\x9f\xd9\xe4\xb6\xb7\xdc\xd0\xad\x58\x91\x4f\xf5\x83\x7a\xe0\x45\x7a\x7c\x79\xde\x0a\xcd\xf1\xaa\x72\xbe\xa5\xf4\x2a\x16\xf1\x54\x03\x8d\x76\x76\xea\xc5\xa9\x0d\x73\x60\x1e\x97\xa3\x1f\xa6\xd5\xa8\x9e\x19\xff\xd0\x83\x8d\x57\x98\xf2\xd1\x0a\x61\xc0\x04\xc4\x68\x6c\x37\x12\x63\xea\x1b\x6f\xdd\x27\xa2\xce\xda\xf9\x94\x37\x55\x2c\x66\x0f\x63\xc1\xbd\x9c\xd5\x3e\xf6\xcf\x36\x20\x94\x11\x69\xac\x8a\xa3\x8c\x30\xfc\x7d\xae\x02\xe4\x08\x2f\xdf\x4b\x68\x76\x05\xab\xbb\x1e\x69\xc6\x72\x39\x6f\x5d\x37\xa1\x1a\xc6\x22\xfa\x4c\x09\x2b\xe9\x1b\x56\x55\xc6\xa8\xe1\x5f\xe5\x3a\x7d\xc3\xa0\x78\x14\x48\x83\x30\x67\xd3\x61\x00\xf0\x66\x3a\x98\x3d\xc8\x55\xca\x2a\x14\x60\x14\x31\x72\x4c\x8d\x9f\x23\xc8\x8e\xb7\x8e\xf6\x46\x05\xd9\x32\xd1\x89\x9d\x82\x2f\x1d\xde\x6d\x76\xc4\x0e\x91\x86\x08\x19\xaf\x16\xa8\xf3\xe5\xa1\xb8\xe5\xcb\x83\x97\xab\x83\x0a\x71\xa5\xd2\x30\x1a\x2b\xe1\x86\x01\x34\x58\x0c\xa2\xed\x23\x9a\xfb\xc2\x23\x01\x92\x9b\x94\x74\x1a\xde\x37\x3a\x2b\xad\x70\x27\x60\x26\xd0\x58\xe5\x55\x2d\xed\xa0\xfb\x17\x26\x54\xa2\x53\x8f\xdf\x82\x91\xed\x8e\x3e\x56\x00\x5e\xf1\x48\x42\x0d\xba\x06\x54\xd9\xfa\x08\xd7\x6f\x37\x25\x0d\x57\x71\x47\xad\x88\x43\x45\x12\x42\xa1\x86\xa6\x22\x4e\xb4\x21\x64\x90\x61\x04\xac\x09\x58\xd1\x50\x80\xe1\x00\x7f\xec\x25\x79\xd9\xa1\x06\xbd\xb1\x18\xeb\x62\xd2\x09\x8d\xdc\xc3\xda\x5b\xd4\x02\x51\x7b\x2a\x7d\x6a\x26\x65\x69\x29\x59\xe4\x11\xa6\xdb\x36\x24\x8b\x96\x50\xa2\x73\xde\xa8\x07\xfc\xd0\x9d\x8f\x58\xc7\x94\x1c\xd2\x0b\x3c\x9b\x55\x02\xc4\xcb\x84\xe5\xb4\x1a\x02\xb3\xdb\xa1\x70\xb2\x1d\xb0\xe7\x0e\xd8\xb3\x49\xf6\xd6\x94\x6a\xd3\xe9\x1b\xf2\xe5\xca\xb5\x67\xe3\xdc\x4e\x4e\x65\xd1\x92\x0e\x45\x3a\x0e\x57\x94\xea\x10\xa2\x87\xe1\x7c\x72\x8a\x90\x6a\x3c\x7a\x5a\x4a\x33\x16\xa9\x2c\x97\x01\x40\x41\xf4\x9e\x5b\x1e\x40\x81\xb2\xba\xe0\x43\xc1\xf0\xcd\x90\xad\xc2\x93\x3b\xbc\x14\x51\x48\xf4\x4d\xa4\x4f\x49\xc3\x6e\xf7\x6e\xf7\x7c\x98\xb3\xe0\x2a\x10\x2a\x9f\x1f\x14\x85\x46\x63\xe7\x35\x9a\x82\x4b\x46\xc0\x6e\x07\xd4\xf0\xd0\x11\x92\xf7\xc0\xab\x56\xb6\xa3\xd3\x44\x8e\x68\x81\xbf\x82\x0f\xa4\x72\x2d\xff\xe6\xef\xe2\x9d\xe3\xac\x1b\x7b\x0e\x7b\x9e\x97\xf7\xfe\xb3\xe4\xca\x4a\x3b\x59\xec\x3d\x84\x84\x29\x8e\xa1\xff\x7a\xc0\x32\x9d\x40\xca\x16\xee\x50\x48\x6a\x47\x87\x8c\x34\xcc\x9f\xd9\xa0\x34\x87\xe8\x5f\x10\x0c\xe0\x36\x67\x46\x7b\x14\x4e\xc0\xaf\x70\x94\x13\x16\x38\x6c\xca\x0d\x40\xdd\x3c\xca\x71\x39\x66\xa5\xcf\x1f\xaa\xb5\xa9\x3e\xf4\xe0\x73\x99\x00\x1f\x47\x2a\x78\xa9\x4e\xef\xdd\x93\x6b\xbf\x82\x11\xac\x0a\x40\x7a\x78\x1a\x68\x4a\x90\xf5\xe8\x2b\x24\xe7\x40\xd1\xe3\x5a\x5a\x58\xc0\x03\x6d\x9e\x3d\x25\xb3\xfa\xd1\xf3\xc9\xd7\x61\xe2\xa5\xf2\x26\xbd\xe6\x41\x9a\x7d\x8e\x4a\x23\x8a\xee\xb0\x94\xe9\x8c\x13\xb4\x45\x2a\x43\x46\xa0\x63\x0c\xfc\x5d\x40\x60\x1a\x2d\x29\xb4\xa5\xcc\x33\xb2\x8a\xa4\x14\x5f\x6f\xbc\x35\x2b\x0a\x27\x5e\x4e\x27\x46\xda\xd8\x56\x0e\x10\x01\x61\xaf\x95\x2e\x00\x25\x9d\xc9\x18\xb7\xba\x9f\x2a\x6f\xf1\xbd\xf3\xcb\xa9\x2f\xf5\xd8\x7b\x42\x31\xee\x0b\x96\x69\x9d\x03\x79\x3a\x78\xfd\xf5\x0f\x88\xe2\x72\xf4\x97\x43\xc7\x6c\xd5\x5d\x17\x6f\xcc\xc1\xeb\xef\xff\xda\xfb\xfa\xbb\x6f\xe1\xd9\xeb\xef\x0f\xc1\x58\x1c\x3d\x87\xc4\xdd\x04\x62\x9a\x0e\xbe\xfe\xfa\x5b\xea\xe4\xeb\x6f\x0f\x7b\xec\xfc\xf2\xfe\xfb\xea\xde\x80\xa8\xe2\x24\x84\x12\x15\x10\xcc\xe5\x0f\x62\xb3\xbb\x28\xee\xc4\xe6\x19\xb7\x8e\x4b\x9b\x1e\x3b\xce\x8c\xee\xb0\x44\x14\xa0\x03\x55\xe7\x0c\xb2\xf7\xb5\x72\x0c\x83\xe4\x02\xf7\xac\x9b\x17\xfa\x71\xd2\x09\x22\x09\x7c\x1d\x8c\xae\xeb\x54\x1f\xd2\xa9\xb8\x58\xbe\xa7\x95\x80\x78\xe1\x84\x0e\x77\x12\x42\x11\xf6\x6a\xc1\x67\xe5\xff\xa7\x02\xfd\x6b\x31\x0e\x09\x2e\x28\x18\xe4\x54\xcd\xc4\xd6\x7a\xd8\x88\xf1\xbf\xb9\x9d\xe6\xca\xe3\x76\x2e\xb1\xd1\x78\x80\x51\xab\x7d\x91\x3c\xc4\x35\xf0\x16\xa6\xca\x4e\xbb\xb2\x4e\x24\xf3\x8d\x35\x22\x7f\xed\x97\x64\x3b\xc4\xcd\x16\x90\x86\x60\xea\x86\xc8\xe6\x36\x75\x2e\xf3\xcb\x76\x71\xd3\xee\xa6\xc6\xe0\xce\x79\x1c\x47\x8d\x70\x14\x10\x4c\x1d\x81\xfa\x0d\x74\x96\xe9\x07\x70\xd2\x60\x79\xe9\x5f\xaa\xdb\x01\x22\x0e\x81\xb7\xf6\xd8\x47\xd5\xcd\x0b\x31\x90\x8f\x82\x6c\x61\x70\x41\x9c\xbc\x55\xdc\x13\xff\x3b\x3f\xbe\x38\xae\x7a\xf2\xf8\x38\xd8\xf8\x80\x1b\xa7\xe6\xb0\xab\xb7\x27\xdd\xef\xbf\xf9\xe6\x3b\xe0\x3a\x44\xf9\x1f\x1e\x1e\x7a\x92\x2b\xde\xd3\xc5\xf0\x88\x1b\x23\x87\x00\x76\x69\x8e\xa8\x8b\x2e\x74\x71\xd8\x63\x17\x5a\x75\x43\xff\x7e\x76\xa1\x16\xa7\x93\x73\x1a\x43\xf4\x19\xd5\xe3\x89\xbb\xea\x5c\x4d\x7a\x89\x1e\x1f\x8d\x27\xdd\xa4\x34\x56\x8f\xbb\xbe\x8f\x39\xa5\xdc\x61\xe7\xa4\x61\xc3\x92\x17\x69\x95\x4b\x79\x8d\xc3\x3a\xae\x36\xa6\x56\xcf\x1d\xa6\x16\x55\x81\xf7\xda\xdb\x93\xd4\x5a\x03\xf7\x6d\xcc\x09\x70\x8b\xa3\xe4\x15\x4c\x7f\x00\xcb\x8f\x6b\xb8\xef\xe1\x1c\xbd\x27\xcf\x97\x95\x73\x77\x8d\x66\x76\x59\x8b\xb9\xaf\x39\xd9\x3d\xa5\x42\xb3\x88\x1c\x40\x74\x78\x4e\x27\x7e\xb1\xc3\x6e\x19\x9c\x5a\x8b\x99\xe6\xd3\x8e\x9c\xed\xba\x70\x56\x4f\x56\x20\xf6\x38\xef\xae\x2d\x4f\x5c\x70\x0b\x77\x73\x72\xb9\xe5\x9c\x85\x7c\x1b\x4e\x26\x4f\xd1\xae\xcb\xbe\x11\x6d\x48\x1f\x36\xc4\x7b\x04\xb5\x25\x41\x7e\x44\x09\x88\xb4\x7e\x08\x3f\x1b\x8f\xb5\x02\xcb\x87\x47\xc7\x43\x61\x32\x60\x57\xd3\xa3\x08\x5a\x0b\x83\x12\x4e\x78\x61\x85\x91\x1c\x68\x5b\x5a\x26\xd0\xea\x38\xf4\xff\xc8\x2e\xb1\xb3\xb7\xba\x60\xe2\x91\x8f\xf3\x4c\x74\xd0\xd5\xf7\xe6\x56\x31\xf6\xbf\xdd\x7f\x58\xf5\xc2\x1b\xf6\x8f\xff\x7d\xbb\x27\xf3\xdb\xbd\x37\xec\x76\xef\xf5\xab\x9e\xfb\xff\xde\xeb\xdb\xbd\xff\xea\xb0\xa9\x07\x5f\xf7\xbe\xbe\xdd\xfb\xaf\x7f\x76\xb0\x0f\xf8\xd0\x1b\x58\x0c\xd7\x87\xbb\x59\xd8\x98\x63\xf6\xa2\x9b\x95\xfb\xe1\x2f\xdf\xff\xf0\x1d\xf6\x56\x35\xe9\xd7\x9b\x7c\xf3\xea\xaf\xff\xf5\x4f\xd7\xeb\x7f\x61\xc1\x1d\xb4\x45\x40\xc8\x5e\x73\x19\x88\xf9\xdf\x4b\xf1\x00\x2e\xfe\x37\x38\x18\xfe\x86\xfd\x83\x85\xe1\xbf\x71\xdf\xec\xb0\x30\x6a\xf8\x9b\xf9\x81\xf7\xeb\x6d\xbf\x79\xf5\xd7\xb8\xe9\x37\xaf\xfe\xca\xfe\xd9\x82\x27\xf9\x15\x5c\x66\xc0\xb8\x8c\x77\x1f\x74\x03\x3d\x18\x50\x54\x03\x18\x94\x29\x49\xc9\x9b\x6c\x0a\xe1\x0b\x69\x70\x43\x42\x97\x3b\x19\x26\x16\x6f\x2a\xf0\x86\x38\x6c\x81\x0f\x50\x91\x02\x90\xa2\x3e\xcf\xb8\x4a\x20\x1e\x44\xa5\x04\xaa\x82\xba\xb0\x95\x99\xfc\xbd\x29\x12\x6d\x8e\xf3\x5b\xd7\x20\x56\x36\x94\xd4\x24\x46\x7b\xe5\xe6\x7d\xbc\xfd\x25\x76\x12\xb3\x97\x6a\x2b\x83\x73\x63\xbd\x59\x5f\x24\x9c\x4c\x06\x93\x7a\xc4\x8e\x8f\x1c\x0f\x60\xcf\x1d\x7c\x5e\x88\x04\xbb\x42\xa0\x2a\x30\xa7\xfb\x10\xa6\x64\x24\x92\x3b\x20\x7a\x73\x9a\x7a\xa8\x2b\x6c\xf9\x82\x37\xa6\x0d\xe2\x67\x14\x68\x60\x18\xbf\xe7\x32\x03\x05\x9f\xa2\xa3\xfc\x6e\xc4\x5b\xf6\x44\x13\x5e\x05\x97\x72\xfb\x9a\x74\x1b\x1d\x9a\xa4\xad\x2a\x30\xab\x4e\xe9\x50\xf4\x72\x04\x1c\x81\xa4\x9d\x68\x9b\xd8\x92\x67\x5e\xae\xec\xb1\x33\x24\xf0\x40\x03\x9d\x8e\xe5\x48\xeb\x78\x62\xee\x93\xdb\x3d\xa0\x75\xc8\x8c\x1c\x91\x47\xca\x47\xd4\x7f\x3b\xf4\x3f\x70\x80\xad\x51\x7f\xb7\xb2\xab\x0c\xf4\x9b\xde\x37\x2b\x8f\xe7\xaf\xdf\x2c\x19\xcd\x0f\xdf\xd7\x06\xd3\x86\x15\xec\xca\xf0\x7f\xb6\x32\xfc\xbb\x72\xf5\x5f\x4a\xb9\x7a\x34\x97\x2c\x2d\x58\x7f\xed\x95\x5f\xdc\x9b\x7d\x53\xd5\x40\x7e\xea\x15\x9b\x51\xcc\x3e\x36\xcf\x23\xad\x6d\x03\x84\x81\x32\x2d\xcf\xb2\x69\xf1\xbe\x54\xfe\xa6\x67\x19\xa3\x2e\x7b\x91\x7c\xef\x84\x97\x3c\xe3\x89\x87\x60\xa3\x26\x8c\x27\x89\xa6\x6c\x2f\xbc\xed\xe7\x97\x06\xe5\x17\x33\xe2\x85\xe8\xb1\xaa\xf6\x15\x59\x6e\x41\x13\x09\x58\x81\xc0\xda\x3b\xcc\x68\xd4\xa3\x51\x8a\x42\xf3\x86\x93\x88\x1c\x91\x98\x7e\xe6\xce\xef\x41\x4d\x58\x4a\x5c\x1b\x8c\x55\x0e\x68\x9c\x95\xe1\xfc\xd0\x63\x16\x7a\x04\x47\xe0\x69\x34\x1e\x84\xcd\x4e\xa5\xc9\x33\x3e\x41\x3c\x9a\xaa\x0f\x3f\x4d\x9f\xf4\x11\x61\x7d\xa2\xba\x73\xa1\xa3\x89\x65\x19\xe3\x79\x2e\x38\x44\xc0\x83\x43\x37\x5a\x40\x95\xb2\x8b\xa6\x80\xe9\xc7\x62\xf8\x58\xd0\xb7\xdc\x4d\x27\xe3\x7f\xed\xdd\x48\x54\x4f\xf4\x38\x2f\xa4\x11\x8e\xb2\x10\x47\x7e\x1a\x51\x86\x94\xcf\xad\x0b\x33\xe1\xf7\x1a\xae\x11\x68\xad\x5d\x62\x4a\x5d\x22\xb0\x95\x5e\x5d\x3b\xdd\xd0\xd6\xf5\x58\x9f\x38\xbd\x54\x49\x3a\xf5\xc7\xf7\x81\x5b\xee\xdd\xbf\x9e\x1e\xef\x3f\x5b\x0b\x59\xef\xa4\x69\xa3\x93\x43\xbb\xba\x13\x39\x5c\xbc\x56\xe6\xc7\x1d\x7f\xff\x5c\xfc\xbd\x4d\x8c\xc0\xbb\xf9\x7b\xba\xd5\x6b\xb8\x99\xf2\xb4\x93\x54\xbe\x14\x49\xc5\x9d\xb7\xf6\x72\x0a\x50\x9c\x67\x93\x51\xe2\xb5\x5a\xdd\x51\x04\x17\x65\x99\xc9\xf4\xf9\xb8\x06\x90\xf7\x2d\x73\x8e\xb8\x1c\xd5\x22\xce\x11\xb5\x8b\xa3\xf8\x40\x4a\x08\x71\x92\xdc\xcb\x72\xa1\x14\xaa\x69\x95\x6d\x8a\x6d\x37\x71\x2e\x86\x0f\x9e\xa9\x7b\x9a\xcd\xc2\x10\x8e\x5a\xb9\x56\x88\xb9\xcb\x1c\xbd\x70\xc4\x60\x9e\xed\x5f\x0c\xe4\xe3\x32\x86\xa7\xaa\x82\x58\x98\x07\x31\x90\x8e\xce\x68\x96\x17\x22\x17\x0a\xfc\xb3\xbe\x16\xf3\x54\x69\xe1\xd8\xbf\x52\x2b\xc7\xb6\x46\x6c\x8c\x48\x8a\xcd\xbc\xb5\xd7\xd0\x43\xfb\xd5\xc4\xf6\xf3\x97\x72\x73\x43\x12\xd4\xf6\x5b\x78\x44\x3f\xf1\xa2\x16\x61\xaa\x66\x16\xca\x8b\x4b\x3b\xf3\x0a\xc3\xa8\x85\xe0\xb3\x62\xd5\xa2\x59\x1f\xdf\xe2\x1e\x03\x33\x5c\x32\x9c\x35\xcb\x83\x06\x44\x04\x5f\x4b\xaf\x5d\xc1\x41\x84\x31\x57\x93\xa8\x10\xca\x8c\xd7\xfe\xec\x45\x46\xeb\xe8\x64\xed\xa1\xc9\x9a\x5b\x3f\xab\x86\xe4\x8a\xa5\x32\x5b\xdc\x6d\x22\xf9\x5e\xd1\x9c\xb5\xa3\xfb\xc6\x17\x72\x8f\x24\x23\xaa\x5a\x8b\x12\x1b\x01\x2c\x40\xa4\xd6\xba\xf9\x8e\xcb\xd8\x70\x3b\x02\xd2\x86\xd3\x85\x66\xf5\x70\x75\x53\x5f\x09\x9c\x19\xea\x28\xf8\x52\x3b\x64\x05\xa4\xf5\xbf\x88\xc9\x56\xd8\xdd\x2f\x62\xb2\x62\x5e\x83\xe3\x3c\xc0\xaa\x2b\xbe\x33\x0f\x15\xe8\x99\x13\xb3\x16\xa5\x63\x51\x30\x57\x64\xdd\x72\x87\xa2\x53\xff\x13\x92\xb1\x3a\xec\x5f\xe1\x47\x4c\xd9\xfa\xc7\x3e\xe2\x4f\xfc\x72\xf6\x77\x82\x9d\xf8\xe7\xbf\xe2\x56\x51\x96\xd7\xec\xa6\x26\x17\x49\xcf\xc7\x6d\xd1\x9f\x44\xe2\x8e\x93\x44\x97\xca\xd2\x03\x80\xdc\xe8\x21\x36\x67\xf8\x33\xd7\x69\xf3\x2f\x33\x67\xc9\xbf\xf0\xc4\x17\xfa\x53\xe4\x23\x31\x16\x05\xcf\xba\x14\x33\x5b\x4f\x89\xe9\x34\xf3\x61\xea\x39\x32\x53\x6f\xb7\x4a\x97\x99\x92\x8d\x36\xbc\x80\xd7\xbe\x93\x75\x6f\x1f\x8e\x82\xc9\x18\x6a\x36\x9c\xe1\x6d\xca\x4d\x7e\xb9\x82\xa0\xb3\x80\xf8\x1d\x2b\x36\xdd\xde\x7b\xe5\xfc\x9f\x60\xeb\x23\xf4\x48\x9e\x42\xfd\x8a\x2a\x93\x1f\x62\x0c\x15\xb2\x3c\xc7\xa6\x21\x11\x54\x43\x95\xc1\xa2\x8b\xd5\x95\xa0\x7a\x70\x62\xe5\xbd\x74\xf4\x31\x04\x64\xa5\xa2\x5f\x0e\x87\x90\xd8\x11\xc6\x10\x07\x19\x93\xdf\x39\x3a\x9e\x05\x58\x7c\xd2\x32\x73\x1f\x1a\x96\xbc\xe0\xca\x0a\x61\x42\x0a\x07\xd5\xf8\xad\x84\x0b\xaa\x8a\xe9\x31\x0b\xa0\x1a\x31\x94\xa1\x7d\xc0\x02\xc5\x6e\xb0\x60\x86\xc2\x9a\x6e\xba\x68\x14\x48\x71\x13\x9b\x1e\x1a\x03\x7b\xaf\xa1\xf7\x01\xe1\x36\x11\x01\xb8\x83\x06\x4b\x65\x05\xa4\x56\x9d\x90\x20\x4b\x6b\x28\xee\x65\x02\x5f\x98\x39\xed\x71\x15\x52\x8b\x8b\xdd\xf7\x69\x0a\xd9\x84\xf9\xa2\xad\x55\x7d\x30\x47\x9a\x9c\x20\x34\xa9\x52\x42\xe1\xad\x7b\xc9\xa3\x83\x16\x66\x11\x7d\xc8\x94\x7d\x3f\xda\xe6\x0a\x56\xc6\xe3\xf8\x3b\x4c\x3b\xd9\x0c\xba\x8f\x82\xe5\x14\xe3\x59\x3e\xe2\x21\xfc\x2d\x8a\x7a\x73\x2f\x4f\x1f\x2f\x13\x9a\x0e\x32\xde\x26\x79\x82\x17\xc3\x65\x16\xb0\x63\xaa\xb0\x1e\x6c\x81\x22\x14\xe5\x9f\x59\x71\xff\xe4\xfd\xe9\xae\xd4\xfe\xae\xd4\xfe\xf3\x97\xda\xa7\x11\x2c\x43\x89\x0c\xa7\x97\x41\x5f\x58\x8e\x35\x14\x9f\xab\x8a\xba\xbb\x29\xcc\x3c\xe0\x67\x17\x37\x57\x7f\xbf\xfc\x70\x7e\x71\xb3\x3b\xe7\xbb\x73\xfe\xfc\xe7\x5c\xa8\xfb\xd6\x4e\x8b\x59\x96\x06\xca\x8a\x6d\x1a\x1c\x9e\xa5\x5e\xff\x27\x5e\x3c\x49\x4d\x95\x06\x8a\xcf\x46\xe5\x54\x04\xda\x67\x5b\xae\xb1\x97\xdf\xe3\x4a\x55\xed\x2c\x3c\x78\xed\xee\xc4\xa4\x32\x0d\x55\xd4\x07\x25\x9d\xf1\x6c\xfb\x16\x3b\xce\x32\x26\x15\x82\xf9\x43\x07\x55\xcd\x4b\x4a\xd3\xc1\x3a\x67\x58\x43\x7a\x36\xae\x94\x8f\x32\xa4\x82\x80\x28\x4e\xd3\x85\x93\xaa\xf2\xde\xd3\x04\x3b\x91\xa2\xce\x8d\xd1\x09\x0a\x9f\x40\x13\x02\xd8\x69\x40\xa3\xc9\x32\x2c\x71\x99\x17\x22\x11\xa9\xa3\x03\x8e\x16\x42\x22\xb3\x9f\x6b\x7f\x42\xda\x7e\xa0\x2b\x25\x5e\x49\x58\x93\x39\x7d\x3c\xc3\x11\x8d\x6c\xf8\x9b\xdc\xd2\x36\xd0\x8a\xa7\x11\x63\x21\xd0\xbc\xcf\x84\xa4\x78\x59\x66\x59\xbb\xfa\x6f\x30\xd6\xbc\xcc\x32\x86\xf5\x6f\x7b\xec\x03\xc2\xdc\x1f\x03\xe4\x58\x87\x5d\x38\x4a\xdf\x61\xe7\x83\x0b\x6d\x2f\xd1\xe2\x53\xb7\xd3\x61\x43\xc7\x33\xdf\x90\x5b\xd9\x62\x99\xc4\x08\xc6\x44\x17\xb5\x0e\x30\x65\xfc\x41\x9a\x99\x47\x60\xe3\x45\xfb\xca\xcb\xfe\xdd\x75\x17\x31\x94\x48\x5d\x5b\x09\x7e\x17\x7a\x58\xa4\xfc\x86\x56\x5e\xd4\x70\xba\xd0\x03\x25\x08\xcd\xd0\xa7\xe6\x19\x47\x6a\x15\x70\xd7\x1e\x73\x8b\x9a\xe0\x55\x7d\xdf\x0d\x46\xbb\xaa\xaf\x60\x86\x5e\x59\x25\xe5\x3a\xca\x18\xa7\xdc\x80\xb6\x05\x39\x3e\x9e\xda\x12\x8a\x25\x1f\x6b\x35\x6c\xa4\xe7\x76\xa0\xaa\x71\x0d\x11\x51\xa5\x73\xa6\xb2\x56\x96\x4e\x9b\x10\xe8\x55\xd6\x73\xab\xd4\x71\xad\xba\xfc\x73\x8c\x73\xcf\x55\x94\x7e\x2b\x07\xf0\x33\x54\x78\xaf\x2a\xbb\xb7\x1e\xfb\x6c\xa3\x47\x69\x04\x33\x39\x65\x13\xfa\x2e\x33\x0a\xbd\xa3\x02\x8d\xa9\xd7\xed\x73\xbd\xc0\xd2\xf7\xd9\x4a\xb7\x53\xdb\x0d\x69\xde\x33\xd5\x4a\xdf\xce\x89\xdb\xd5\xd0\x6e\x2e\xc6\xae\x86\xf6\xae\x86\xf6\x8b\xaa\xa1\x0d\x49\xfc\x81\x25\xb6\x80\x21\x70\xdb\xeb\xee\x93\xad\x25\x15\xc7\x4b\x00\x83\xbf\xd4\xe9\x75\x2e\x92\x08\x09\x74\x96\x40\x83\x9f\xf7\x99\x9d\x33\x1a\x04\x95\xb0\x0c\x17\x36\xf8\x44\x0c\x3b\x38\xbf\x3c\xe9\xb0\xcb\xf3\xd3\x0e\x13\x36\x39\x9c\x01\x6d\x1f\xc0\x05\x85\xc5\x03\x32\x4f\xb4\x42\x20\x78\xf7\x8d\x87\x11\xb7\xb0\xdc\xd1\x87\x00\xce\x71\xc4\x2b\x10\x17\x2a\xa3\x16\x83\x9d\xce\xba\xad\x20\x8c\x79\xc4\x20\x3c\x09\x68\xda\xde\x4e\xad\xeb\x5d\xb9\xf3\x5d\xb9\xf3\x5d\xb9\xf3\x5d\xb9\xf3\x5d\xb9\xf3\x5d\xb9\xf3\x5d\xb9\xf3\x5d\xb9\xf3\x5d\xb9\xf3\xa9\x20\x97\xf5\x60\x21\x83\x80\x48\xe8\x99\x1e\xe4\x67\xc4\x55\x9a\x79\x6d\x4a\xe9\x62\x1c\xc1\xfc\xa5\x85\xbc\x6f\x15\x34\xec\x44\xfc\x0f\x2a\x6b\x5f\x11\x06\xb1\x12\xba\x10\x6b\xe5\x37\x08\x79\x59\x08\x3d\x24\x1c\xc1\x98\xa5\x60\x39\x8e\x03\xf7\xea\x91\x13\xba\xc4\xe1\xfa\xd4\xf8\x24\xe3\x72\x7c\x23\xc6\x79\xb6\x49\xc9\x8c\x4b\x51\x18\x69\x9c\xf8\xf0\x69\x46\xaf\x8b\xcc\x11\xbf\x46\x67\x36\x02\x9b\xe7\x88\x24\xd5\xe5\x99\x56\x82\x5d\x7e\x3a\xc1\xc0\x7a\x7d\x2f\x21\xc5\x2c\x5e\x99\x1b\x8a\x53\x01\x01\x3f\x14\x9e\x9f\x79\x4c\x50\x28\xe8\x0b\x08\x93\xf1\xb7\xc5\xf5\x05\x90\x9f\x5e\xdf\xb9\xfc\x74\xd2\x61\xb2\x27\x7a\xfe\xaf\xd0\x34\x15\x99\x40\x81\x60\x88\x8c\x36\xb8\x97\x40\x67\x60\x37\x0d\xcd\x29\x7e\xf7\x5f\x18\x6d\xe8\x46\x0a\xf9\xf7\x10\x72\xd8\xc5\x1f\xe9\x2c\x56\xbf\xff\x8b\x3d\x00\x38\xe3\xbf\xe6\x3e\x27\x8e\x08\x5f\x0b\x69\x4d\xff\x22\xdd\x8c\x88\xa6\xf9\x17\xc6\x10\x60\x48\x4c\x8f\x01\x81\xe7\x99\x4c\xf1\x88\x91\x01\xe0\x7f\x79\x98\x5c\x58\xc4\xa0\xf2\x39\x49\x01\x4b\x76\xc2\x37\xc8\xe0\x82\x3e\x3d\x04\x53\x75\xb3\x3b\x18\xc4\x58\x3b\x56\x6b\x96\x69\x35\x3c\xec\xdd\xaa\x5b\x75\x1c\xc5\x86\xe1\x4a\xc0\x62\x71\x8b\x3d\xfa\x9b\xe7\xba\x75\xeb\x1f\xb8\xb7\x1b\x07\x8c\xed\xbf\x29\x6d\xff\x5b\x38\x1c\x91\x7a\x06\x91\x67\xf7\x5a\xfa\x98\x04\xae\x20\xb7\x0f\xf1\x35\x68\xb1\xfa\x13\x36\x96\xc6\xf2\x3b\xd1\x63\xd7\xe4\x4b\xac\xa6\x69\x50\x67\x04\x41\xa2\xa6\xef\x57\xfd\xb8\x21\x57\x11\x62\x68\xfd\x00\x9d\x85\xe5\x85\xe8\x7a\x94\x66\x6a\x35\x16\x5c\xd9\x19\x92\x48\xae\x89\x6e\xbb\x76\x23\x4c\x58\x24\xe2\x1a\xe4\x4f\x3c\x7c\x45\x0c\x83\xe7\xc7\x09\x61\x57\xfe\x0f\x74\x7e\x3a\xd5\xd4\x51\xa7\xcc\x43\x24\xa3\x70\x47\x84\x5b\x09\x27\x6f\xf3\x62\xd2\x01\xbc\x17\x19\xa2\xf7\x4a\x23\x06\x65\x86\xbe\xd6\x31\x57\x25\x74\x50\x88\x44\x2b\x63\x8b\x12\x2b\x7f\x70\xd6\x2f\xf4\x9d\x50\x2c\xc9\x4a\x63\x45\x01\xbb\x18\xc1\xc5\x49\x13\x91\x2b\xa8\x8a\xa0\x19\xc6\x68\x54\xfa\xd3\x98\xa7\xb0\xf6\x11\x92\x1c\xcd\xc7\xad\xc0\xb4\x11\xcb\x83\xd7\xbb\x4f\x79\x10\xfc\x4e\x85\x2f\xef\xa6\x24\xb3\x85\x71\xe4\xab\xf2\x8f\x7b\xb1\xb0\x6a\x0d\x3c\xa7\xba\xc1\x02\xf1\x80\x07\x95\xaf\xda\xe8\xb1\xc0\xab\xe9\x99\x28\x2d\x15\x63\xf0\xa2\xf1\xa5\xc6\xbc\xee\x50\x08\x8b\x29\x6a\x68\x7b\x02\x65\xa4\x90\xc3\xa1\xf7\xcd\x90\xce\x82\xc1\x7f\xe2\x5e\x67\xf7\x82\x2e\x0a\xd8\x3b\xb1\x57\x80\x3a\x2a\xc7\x51\x4a\xac\x5b\x9b\x42\x40\xb5\x6f\x54\x83\xe4\xd8\xed\x60\x3c\x54\x72\x5b\x63\xa9\x9b\x2b\xac\x85\x58\x88\x41\x26\xfc\x66\x03\x7e\x12\x10\x6d\x80\x66\x2d\xb2\x09\x5c\x11\x1c\x1d\xf8\x38\xbd\x94\x20\x55\x29\xe8\xfc\xc1\x09\xd5\x03\xfc\x86\x89\xee\x34\x7e\xa1\x5a\x87\x4a\xeb\xb4\x74\x55\x78\x54\x59\xe4\x1e\x2a\x53\x19\xdb\x15\x83\x81\x2e\x6c\x07\x4c\x29\x88\xf6\xc2\x33\x30\xe9\xb5\x89\x0e\x6c\x96\xbd\x99\xc9\x60\x00\x59\x0a\x31\x66\x1e\xdc\x05\xe4\x77\x42\x1d\x11\x00\x51\x54\x28\x16\x0f\xe9\x55\xf8\x81\x72\x91\x57\x57\xd3\x76\x29\xd3\x9f\x2f\x65\x3a\x59\xbb\xe4\x9d\x93\x0c\xe0\xda\x38\xca\xa4\x13\x08\x31\x6f\xca\xbf\x9b\xa3\x0a\xc2\x27\xa0\x64\xed\xf6\x52\x72\xdf\xcb\xa4\xd0\xed\xca\xe0\x52\xa4\x8d\x13\x8f\x90\x44\x70\x43\x06\x78\xdd\x47\x24\xcf\xb9\xf9\x21\x85\x81\x71\x1b\xcb\xc7\x53\x90\xc1\x4f\x5a\xbe\x17\x89\x5b\xa3\x7a\xb4\x68\x0c\xdf\x1d\xd2\x02\x22\x1a\x0f\x60\xa2\x7a\x00\x79\x69\xde\xb2\x9e\x5b\x34\x4a\xb2\x9b\x49\x2e\xde\xbb\x4f\x1f\xce\x09\x36\x51\x40\x81\x53\x4c\x67\x79\x16\xf8\x5b\x37\x41\xca\x60\x8f\x2c\xea\x81\x09\xf5\x75\x69\xe7\x6c\xca\x2e\xab\xfe\xb3\x64\xd5\x67\xfc\x45\x5d\x85\xb1\xc6\xf3\x0f\x61\x48\x48\xb7\x54\x12\x41\x83\x87\x9b\x12\xee\xc8\x26\x15\xd6\x8f\xd9\xa8\x1c\x73\xd5\x75\x72\x20\x84\xc0\x46\xcf\xbd\xd6\xd3\xa8\x46\xec\x78\x37\x70\xac\x35\x78\xe9\x0e\x6b\x69\x6a\x49\x5a\x95\xc0\xbe\x89\x34\x03\x88\xcf\x34\x23\x90\xb2\x68\x5d\x50\xde\x43\x2c\x65\xb7\x89\x44\x1c\x80\xfe\x38\x79\xd1\x50\x98\x36\xd6\xad\x27\x41\xd0\x16\x5c\x19\x58\xe9\xca\x28\x18\x16\xa7\x5e\x89\x7a\xad\x4a\xba\xa0\x75\x3d\x0b\xc9\x0d\x28\xc6\xc6\xe9\x3f\x29\x2f\x26\x9e\xda\x61\x15\x9b\x42\x00\xbe\x51\x26\x1e\x49\x70\x9c\x1f\x77\xe3\x14\x04\xa9\x86\x27\x1e\x4a\x7e\x85\x30\x30\x38\x1d\x3a\xcb\x7c\x9a\x95\x18\x4b\x0b\xc6\x85\xc0\x9f\x3b\x4c\xf4\x86\x3d\xf6\xaf\x7a\xb0\x20\xd5\x57\xfd\xd7\x5a\x8b\x4c\xe3\x3d\x57\x6e\xf3\x97\x06\x2c\xd4\x4b\x53\xd3\x60\x25\xbd\x1b\x8f\x2e\x13\xb6\xfb\x38\xf9\x7d\xb0\xce\xa0\x8c\x28\x9a\x92\xfd\x4a\x21\xb1\x6e\xa5\xae\xb1\x8f\x45\x9b\x7e\xca\x2d\x8f\xea\xb4\xa2\x00\x84\xdf\x8e\x29\x65\x94\x06\xac\x0b\x28\x6a\x21\x07\x4c\xba\x23\xee\x83\x2c\xac\x56\xf8\xf6\xbc\xd0\x98\xa6\x45\x72\x9d\xf9\xb4\x03\x62\x08\x15\x0c\x58\xd8\xd9\x68\x2e\x3d\x76\xdd\xa4\x00\x8b\x09\xc0\x9c\x09\xd1\x26\x2e\xa4\x37\x54\xba\x26\x5a\xc8\x03\x34\x53\x74\xd8\xaf\xbc\x50\x52\x0d\x0f\x3b\x4c\x89\x07\x28\x72\x63\x58\x12\xc6\x05\xa6\x38\x5f\x4b\xbe\x74\x24\x71\xbb\x36\xe7\x40\x4c\xe7\x4b\x79\xcb\x2c\xd2\xe1\xf7\x27\x03\x7d\x01\x93\x44\xed\xd1\xc6\x60\x2f\xae\xcb\x65\x10\x61\xbe\x4d\x03\x1e\x0c\xf4\xf7\x1d\x36\xd8\x8b\x56\x74\x57\xc2\x06\xbb\x9f\x8e\xe6\xdc\x38\x11\x01\x8e\x6c\x4b\x7f\xdc\x4e\x7b\x79\x39\xda\xcb\x0e\x13\xec\x8f\x87\x09\x16\x68\xf9\xf6\x59\xc4\x75\x53\xf8\x9a\xc9\x24\xb0\x55\xa8\x23\x1b\xd7\x87\x86\x4a\x0e\xf0\x34\x50\x9a\xe0\x3c\x0b\x3a\xc5\x03\x37\x47\xe0\x63\xcd\x73\x01\xc5\x3f\xc9\xa8\xac\x4b\x93\x61\x69\x3e\x00\x58\x05\x93\x77\x1b\x60\x95\xe5\x46\xbe\x8b\x60\xe0\xab\x74\x62\x4a\x71\x83\xc0\x55\x18\x71\x99\x57\x3c\xc2\x58\x36\x12\xbc\xb0\x7d\xc1\x2d\x0c\x64\xdb\xa6\x3f\xf7\x89\x0f\x64\x65\xfb\x7c\x16\x40\x12\xe7\x61\xbe\xb1\xb5\x80\x06\xb6\x6d\x3f\xcb\x72\x08\x9e\xaa\x95\x3f\x5e\xf5\xfa\xe3\xe0\x6a\x24\x97\x46\xab\xb3\xd1\x4e\x11\x0b\x0a\x1b\xd2\xff\xa6\x65\x51\x1a\x36\x14\x4a\x14\x6b\x46\x6a\x8d\xb4\x59\x7a\x40\x75\xea\x7d\xc5\x6a\x2b\x9f\xdf\x78\xbf\x1e\x45\x72\xdc\x74\xa8\x4c\x6d\x57\x68\x54\x2b\x69\x75\xbb\x47\x11\xb6\x21\xa4\xe4\x76\x8f\x54\xe7\x76\x7b\xd6\x22\x31\xfe\x04\x5b\x79\xc7\x37\xbd\x04\x71\x78\x08\xc4\x01\x19\xf2\x4e\x3b\x95\x69\x23\x3a\x11\x3d\xb0\x53\x21\x36\xc1\xb2\xe1\xfb\x02\x07\xa7\xd6\x96\x1d\xec\x1f\xed\x1f\x4e\x85\xc9\x34\x02\x9f\x6e\xa2\x37\x1d\x4d\x91\xe3\x3c\x9b\xc0\x38\xf6\xd3\x0e\x93\xc1\xb7\x8d\x4b\x03\xa3\xa2\xb4\xfd\x0e\x33\x9a\xd9\x82\xa7\xd2\xdb\x21\xdc\xaf\xa0\x58\x83\x2b\x56\x2b\xc3\x0e\xf6\xff\xef\x7d\x8a\x7d\x7e\xd0\x6a\xdf\xc2\xf0\x7b\xec\x06\x0b\x7a\x86\x8e\x26\xba\x64\x4a\x08\xc2\x22\xc9\x33\x99\x48\x9b\x4d\x58\xc2\xb3\x8c\x81\xaa\xab\x91\x02\x13\x5c\xc0\xd9\xa3\xb4\x91\x7d\xee\x15\x66\x07\x04\xf7\x5c\x26\xef\xc5\xd1\x48\xf0\xcc\x8e\xbc\x83\x57\x75\x7f\x17\x85\xc6\xf2\x8d\xf4\xa4\x5d\x80\xd7\xa6\x19\xe5\x9b\x9e\xe7\xb7\x27\x6b\x04\x08\xb1\xb7\xb2\x5f\x08\x76\x42\x39\x17\x3e\xc4\x64\xd6\xaf\x58\x8e\x07\x5c\xe1\x7d\x11\x82\xa5\xa9\x8e\x0a\x86\xe5\x80\xfb\x7e\xde\xdb\x4f\x53\x6d\x76\x60\x6e\x96\x6b\xeb\x6f\xc3\x29\xc6\x9a\xb3\x3e\xd8\x2f\x06\x2c\x1c\x34\xda\x54\x15\x16\x29\xb2\xc1\xd1\x38\x6f\xdb\x55\x43\xe6\x6f\xc5\xd9\x63\x8f\xdd\xee\x89\x47\xfb\x2d\x96\x96\x78\x1c\x18\xfc\x87\xb2\xee\x5f\x3d\x76\x3e\x0e\xa7\x14\xa4\xf0\x22\x44\x89\xfb\xd7\x98\x1c\xb0\x52\x85\xb8\xb7\x35\xe8\x6f\x56\x2e\x53\x49\xab\xe8\xf9\xb7\x27\x94\xab\xc0\xb2\x52\x91\x63\x70\xdb\xbc\xbf\x65\x5c\x58\x35\xa8\x25\xd1\x5e\xec\x8a\x3a\xc4\x12\xae\x10\x7b\x31\xd0\x05\xc5\x8a\x84\x87\x54\x3d\xdb\x11\xb2\x28\x8a\x72\x9e\x75\xb6\x45\x36\xc9\xaf\xbf\x5e\x2c\x53\x3a\x67\x2d\xec\x83\x2e\xb2\xf4\x41\xa6\xa1\x1a\xa0\xeb\xe7\xf0\xb9\x71\x29\x1e\x1e\x64\xba\xd2\xe8\x29\x90\x08\x46\xcf\x60\xf8\x15\xce\xab\x61\x07\xd0\xdf\x21\x3b\x93\x18\x09\xe6\xfe\x62\xba\x70\x2c\xa1\xef\x03\xd2\x9d\xb4\x15\x16\x0e\x2e\xb5\x3b\x63\x3e\x8f\x17\x92\x6d\x7c\x1d\x53\x0c\x97\x97\xe3\x32\xb3\x5c\x09\x10\x8c\xff\x20\x74\x36\x13\x8f\xcd\xf0\xbf\xa5\x34\x77\xfe\x4b\x75\x1c\x46\x90\x82\x64\xc2\xf2\xd0\xd6\xef\x4a\xa4\xee\x63\x18\x59\x08\x0e\x14\xe9\x11\xe5\x91\x45\xe1\x61\x8e\x2d\xb3\x3e\x37\x22\x65\x79\x56\x0e\x65\x1b\xb9\x04\xc3\x3e\x97\x61\x24\x40\xa3\x5a\x38\x1e\xc9\xd8\xf8\xba\x2f\xc1\x1d\x0a\x03\x12\x4f\x59\x9d\xa8\xbd\x7c\xd2\x1e\x57\x84\x8e\x3e\x92\x02\x1c\xb2\x71\x82\xae\xdb\x77\xdc\x6d\x86\xc3\x5e\x63\x1d\xa8\xca\x7f\x73\x21\x78\xea\xc5\xa9\xcb\xd9\xfb\xb9\xd2\x6d\x99\x4b\x17\xce\x1e\x6d\xc1\x83\xdc\x47\x63\x71\x1c\x8b\xab\x79\x15\x82\x75\xcd\xcc\xfc\xa5\x71\x86\x6d\xc1\x4f\xaf\xe6\xba\x7b\xc3\xc2\x5b\x18\x96\xd8\x08\x9e\x24\xc8\x45\x32\x03\x92\x08\x8f\x45\x15\xc1\x89\x79\x2f\x6a\x5a\xa6\xd5\x2c\xe7\x26\x98\x8c\x91\x44\xd0\x11\x35\x84\xc1\xe0\x21\xfc\x20\xa9\x48\x0e\x98\xd2\x8d\xaf\xc4\x10\x21\x94\x20\x3a\x67\x20\x06\x9d\x8c\x90\xb3\xa6\x95\x6f\xd4\xc1\xc2\x37\xf0\x6f\xaa\x76\xc3\x8d\x89\x92\xdf\xeb\xa3\x5a\xdd\x9e\x45\x04\x6d\x99\x41\xab\x0d\xc5\x5f\x81\xce\x7f\xf2\x04\x7b\x06\x5d\xdf\x11\xf3\x1d\x31\xdf\x11\xf3\x2f\x89\x98\xbf\xd3\x09\xcf\xd6\x09\xc6\xd8\x51\xf4\xcf\x49\xd1\x01\xe9\x6b\x2d\x83\x09\xbe\xea\x29\xb9\xb7\x83\x10\xf1\xf1\x4f\xf9\x10\xe2\x11\x3e\x28\x8c\x80\x07\xab\x89\x46\x5c\xae\x94\x5b\x6e\x04\xa0\x6a\xc3\x33\xfa\xfb\xe3\xc7\xf3\xd3\x28\x82\x09\xaa\x92\xd5\xbf\x65\x58\xaa\x31\x43\x6e\x91\x25\x45\x17\xeb\x19\x52\xa2\x61\xad\x10\xd3\x43\x6f\x41\xe6\x18\x5a\x83\xbc\xa7\x8b\x61\xaa\x4f\x65\xf3\x8d\x9b\x3b\x7e\xe2\x27\x37\xb3\xbe\x31\x60\x26\xe7\x85\x80\x14\xf8\xd5\xa9\x6c\xb4\xa6\x4b\x26\x03\xcb\x5e\x9f\x4c\x05\xf8\x4b\xc0\x53\x51\xb5\x13\x80\xb7\xf6\x23\xa7\xf6\xcf\x64\xaf\xfe\xe9\xe4\xac\xd2\x20\x4f\xa5\xb9\x5b\xe7\xf4\x56\x3d\x30\xd7\x45\x25\x88\x48\xc5\x7e\xd2\x7a\x98\x09\x76\xa2\xc7\x79\x69\x05\x3b\x53\x43\xa9\x04\x26\x36\xb1\x9f\x4e\xce\xd8\xe5\x29\x6a\xf2\x90\x16\xc1\xfa\x62\xe0\x08\x00\x9c\x7f\xca\x27\xe0\x4d\x2c\xc5\xd4\x7d\x02\xde\x81\x7c\xeb\xbe\xa8\xd5\xde\x73\x7d\xe6\x85\x06\xaa\xe2\x2e\xc2\xef\xee\x82\x70\x14\x45\x28\xc6\xaa\xc7\xc2\xa7\xdb\x19\x1f\x11\xd7\xda\xa7\xec\x8c\xb9\x9a\x60\xc0\x7b\x8f\xba\x79\x51\x66\x48\x3a\x76\x71\x62\xe6\x44\x97\xec\x81\x32\xab\x48\xf4\xb9\x91\xf9\x1b\x76\xa6\x4c\x59\x44\xf8\x1c\x4d\x29\x48\x9a\x15\x04\x21\x48\x5e\x33\x6f\xb6\x6d\xb6\x5c\x15\xf6\x8f\xb2\x4d\x8f\x88\xba\x7d\x35\x4c\x44\x65\xf6\x70\x47\x67\x0d\xc4\x36\x5e\x58\xd9\x22\x47\x06\x52\x28\x7d\x5b\x7f\x28\x97\xec\xc3\xf9\x80\x69\x8c\x58\x44\xf7\x4a\x5a\x01\x04\x84\xe4\xf1\xfe\x84\x45\xa9\x8b\xf1\x5a\xbf\xd5\x81\x65\x00\xa8\x86\x49\xf9\x6b\xf4\x66\xe0\x02\x52\xf6\x5c\x18\x13\x37\xec\x76\xef\xb5\xdb\x88\x6b\x39\x96\x19\x2f\xb2\x49\x27\x1e\x65\xd5\xd2\xd1\x52\xdf\xa5\x1b\xcc\xed\xde\xab\xdb\x3d\x76\xa0\x0b\xe8\xdd\x5d\x9b\x4c\xf0\x7b\xca\xaa\xc3\xe3\x3b\x41\x11\xe0\xf0\xa9\xb7\x6c\x73\x43\x72\x9e\xb6\x60\x48\x1f\x91\x4c\xd7\x12\x51\x4f\xeb\xa4\xed\xe4\xac\xc7\x3e\x92\x20\x42\xe4\x1c\x57\x1c\x48\x94\x6f\xf1\xf9\x0f\x70\x4b\x89\x7a\x33\x39\x79\x5a\x0c\x7f\xae\xa9\x4f\xcb\xe2\x2d\xe5\x3e\x3a\x07\x9b\xca\x7d\x3f\x49\x7b\x25\x72\xbd\x0e\xe7\x6c\xa4\xcf\x07\x64\x99\x2a\x25\x3a\xc6\x93\xe1\x6c\x28\x31\x48\xd5\x48\x44\x37\xf8\x89\xfe\x5e\x45\x98\x9b\xf1\x96\x6f\x3e\x83\x4b\x39\x4e\x7d\x7a\x76\x79\x75\x76\x72\x7c\x73\x76\xfa\x86\xd1\x64\xdd\x68\x2b\x59\x0a\x3c\xaa\x55\x5e\x39\xaf\x01\x54\x51\xfe\x24\x7e\xb2\x43\x34\x8d\x2b\x76\xe6\xa8\xc5\xa9\x2c\x30\x0e\x9e\x2b\x76\xae\x64\x85\xb4\x45\x05\x72\x33\xad\x42\x1c\x7d\xae\xc9\x78\x31\x94\x88\xaf\xa5\xa8\x33\x88\x44\xae\xf5\x06\xb7\x15\x0a\x37\xcc\x00\x31\x99\x2f\xad\x7a\x9f\xf6\x32\x42\x8f\x0e\x99\xca\x05\x4e\xa8\xbe\x3e\xdd\xd6\x47\xf8\x68\x82\x6c\xc3\x45\xd8\xef\xf5\xf6\x7b\xcc\x51\xfc\xfd\xde\xbe\xe7\xad\x59\x80\xa4\xa0\xa3\x50\x75\x1a\x67\xd6\x37\xf7\x9d\x7d\xf0\x50\xb9\x1d\xc7\x30\x1b\xe8\x16\xde\xe5\x22\x2b\x70\xa6\x19\xbd\x04\xb1\xa9\xec\xc7\x1f\xa5\x73\x87\x09\xaf\x30\xb1\xf5\x22\xe4\xf1\x23\x4b\x49\x4e\x18\xcd\xc7\xab\x77\xeb\x7c\x08\x8f\x5c\x8b\xa8\x07\x4c\x97\x1e\x85\x70\x85\x0a\x2b\xd6\x77\xb2\x65\x9c\x8e\x68\x11\x36\xa6\x30\x98\x1e\x3d\x30\x2b\xbb\x88\x6a\xd4\x26\x74\x13\xee\x0d\xb7\x10\xc4\xe4\x71\x81\x06\xc2\x52\x78\x13\x47\x2c\x86\xea\x8d\xe7\xd0\x16\x43\xf9\xdd\xa5\xd5\x1d\xa8\xdd\x05\x61\x2a\xd4\x02\x4f\x2b\x58\x84\x54\x58\x2e\x33\x13\xcd\xc2\xea\x5c\x67\x7a\x38\x99\xc9\x9a\x08\x80\xc1\xf8\xb0\x49\x9a\xf2\xd1\xd0\xbf\x7e\x74\x75\x76\x7c\xfa\xfe\xac\x37\x4e\xbf\xc2\x84\xfb\x2e\xef\xe6\x7a\x0d\x4d\x52\xc4\x13\xc0\xfa\x45\x2b\xcc\x18\x5e\x88\xcd\xab\xf8\x03\x55\x14\x27\x43\x4a\x35\x67\xff\xb1\x08\x6d\xd1\xe3\x10\x80\xc0\x86\x34\xc3\x7f\xa1\xfa\x40\x1a\xf1\xf3\xa0\x5e\x55\x9f\x23\x9d\xaa\xaf\x4b\x05\xf8\x0d\x9f\x79\x49\xf3\xe5\x58\x7f\x00\xbe\x46\xcb\xd6\x3c\xd8\xcc\xbd\xff\x99\xa7\xb0\x0d\x31\x6d\x6a\x5e\xa8\x5d\x79\xdd\x16\xc8\x7b\xa5\xca\xe6\xa2\x18\x4b\x8f\x4b\xda\x4e\x7e\xdb\xee\x72\xac\x2d\xba\x89\x19\x75\xe1\xf1\x0c\x6c\x8d\xd6\xee\x28\xec\x1f\x98\xc2\xee\xc8\xc1\x8e\x1c\x6c\x85\x1c\xfc\x7c\x73\x73\xf9\x93\xb0\x4b\x63\x7a\x6b\xed\xe2\xb0\x5e\xe5\x61\x53\xd0\xd5\xaa\x15\x73\x4d\xd9\x4f\xc2\x56\x15\x1a\x97\x5f\xdc\x16\xb1\xd0\x3f\x6b\xe3\xaf\xa6\x66\x84\xda\xcc\xac\xee\x4c\x31\xf2\x5c\xa7\xec\xfc\xb2\xc7\xfe\xae\x4b\xa7\xb4\xf5\x79\x3f\x9b\x04\xbb\x94\x11\x96\xdd\x42\x5f\xb7\x7b\x4e\x43\x70\x1b\xfd\xb3\xe0\xa9\x28\x0c\x84\xd6\x0a\xbe\x56\x28\x77\xd5\xcb\x32\x51\xbd\x34\x56\x8f\xd9\x88\x3e\x59\x2f\x63\x44\x0b\xd6\xc3\x25\x04\xd0\x75\xc8\x73\xc3\xd0\x5b\x7a\x67\xcb\xc8\x89\xee\x53\x38\xf4\x8d\xe2\xe6\xda\x12\x24\xa7\x0a\x23\xda\x2b\x79\x37\x60\xaa\x08\xc3\xb1\x66\xb5\x89\xcd\x72\x24\x4a\x2b\xb3\x9e\xbb\x5a\xb6\xe8\x9d\x2b\xfb\xa1\xb8\xc6\xcf\x2d\xf2\x46\xa2\x33\xa7\x88\x01\x62\xe0\xdc\x15\x76\x7a\x7e\x91\x75\x9f\xd2\x4d\x7c\x64\x9f\xdf\x74\xae\x86\x82\xbd\x76\x6f\x7e\xff\xdd\x77\xdf\x7c\xd7\x63\x17\x71\x1d\x0f\xae\xd8\xf9\xf1\xc5\xf1\x6f\xd7\x9f\x4e\xa0\x3c\xd9\xbc\x7c\xe2\x64\x24\x96\xda\xfc\xae\xa1\x51\x1c\x9f\x40\xf7\x28\xc2\x36\x72\x37\xb1\x4e\x1d\xdd\x0e\x6d\x59\x77\xcc\xa3\xd2\x1b\x1b\x91\x2e\x3a\xb9\x8b\xe9\x16\x36\xaa\xe5\x22\x24\xf1\x35\x8c\x11\xd9\x24\xd1\xaf\x1c\x0a\x20\x2c\x27\x5c\x2d\xaa\xba\xdc\xb8\x55\xc5\x0f\xa1\x66\x32\x5d\xe7\x6b\x5b\xd5\xdd\xa7\x3e\x85\x2f\x6d\x75\xef\x1a\xa3\xa7\x71\x6d\xbc\x99\x80\xac\xb9\x70\x27\xb1\x45\x48\x0e\xe6\xde\xc4\x91\x78\x0e\x44\x39\x0c\x01\x51\x8c\xdf\x09\xd5\x42\x66\x7c\x14\xc9\xfa\x79\xf8\x55\x3e\xcc\xc2\xf0\x85\x19\x2e\x6d\xf0\x48\x69\x47\xe3\xc1\xd1\x54\x39\xb1\x2b\xdf\x90\xeb\x3d\xfc\x8d\x92\x9c\x9f\xaa\x86\xe9\xcd\x21\x06\x8e\x1d\xfd\x24\xd6\x47\x26\xaa\x0b\x05\x8b\x26\x46\x2d\x1b\x83\x74\xdf\xf7\xcc\x0c\x62\x2c\x44\x31\xd0\xc5\x78\x1e\x72\x40\x92\x5f\xeb\xe4\x6e\x83\xf1\xde\x9c\x5c\x62\x0f\x2d\x46\x1c\xda\x46\x63\xae\x84\x18\x4c\xfa\x47\xe4\xbb\x9b\x93\x4b\xa0\xe9\x3d\xf8\xd7\x48\xeb\x3b\x4c\xd5\x99\x08\x5b\xf9\x0d\xb7\xe8\xab\x76\x42\xc9\x71\x26\xf9\xa2\x44\xcb\xd0\x86\x8d\x74\x96\xe2\x6a\x8f\x79\x9e\xbb\x11\xf7\x85\x7d\x10\x42\xb1\xf3\x4b\x38\x6b\x8e\x90\x63\x24\x3d\x66\x57\x92\xb9\x15\xeb\x47\x56\xc5\xf5\x94\xad\x4c\xa5\x58\x0b\xd8\xbd\x88\x49\x4c\x2d\x05\x37\xf8\x4a\x0b\xe9\x0d\x47\xe3\x0d\x94\xbc\xaf\xef\x05\x0c\x36\x4d\x0b\x61\x5a\xca\x35\x5b\x0c\xf5\x97\x53\xb8\x4c\x4d\x60\x93\x30\x36\x7f\x5f\xc1\x3b\x0c\xc0\xf1\x08\x96\xfa\x4c\x51\x0c\x6e\xf1\x9c\xf4\xb4\x8e\xca\x0e\x43\x76\xd2\x19\x9c\x13\x5f\xa9\x81\xb4\xf3\x9f\xc3\xc3\xe7\xd0\xce\xdb\xca\x88\x3e\xb2\x24\x58\xed\x49\x94\x42\xd1\x84\x02\xac\x72\x52\x6f\x39\x33\x93\x71\x26\xd5\x1d\x64\xd3\x91\x7e\xe8\xa8\x2a\x59\x24\xd4\x9d\x97\x6c\x0a\xc1\xb3\xf9\x8a\xef\x2a\x8e\x3b\x37\x90\x7c\x0a\x0c\xbc\x15\x3a\x7f\x4b\x94\x14\x77\x49\xfc\xae\x93\x1f\xb2\x26\x93\xdd\xee\xdd\xee\x3d\xf3\x2c\xda\x8a\x76\xdb\xd0\x4a\xcf\xaf\x4f\xae\xcf\x57\x76\x06\x2c\x78\xab\x16\x58\xac\x18\xb4\x04\x37\x76\x8f\xfe\xbd\x6a\xba\x5e\xfd\xad\xa7\x89\x8f\x49\x46\x3c\x3f\x2e\xed\xe8\x54\x9a\x44\xdf\x8b\xa5\xde\x26\x5f\x7d\xd8\x8f\x46\xc2\x18\xc3\xdb\xec\xe4\xe7\xe3\x4b\xc6\x4b\x3b\x12\xca\x52\xd9\xe0\x35\xa2\x3f\xfd\xa8\xae\xb1\xe2\xd3\x5a\x63\xa2\x77\xb7\x34\xa2\x5d\x1c\xd1\xe6\x71\x44\xd2\x24\x46\xae\x81\x30\xe3\xa4\x32\x6e\x75\x9b\xca\x51\x64\xfa\xc0\x13\x70\xee\x5f\x04\x6d\x17\xa8\x7a\xad\xaf\x5a\x54\x2d\x1a\xf2\x60\x88\xe7\xca\x8a\x62\xc0\x13\xd1\x48\x83\x43\xdc\x28\xec\x5b\x86\x36\x08\x8c\x4e\x09\x86\x6e\x83\x78\x86\x01\x96\x6f\xe6\x40\xa6\x07\x31\xc9\x23\x77\x57\xd9\xdf\xa8\x28\xaf\x05\x50\x28\xff\xbd\x34\xb6\x0a\x87\x88\xe3\xff\xcf\x92\x67\x38\xef\x8b\xf5\xfc\xd3\xf5\x95\x5a\xf2\x69\xbf\x1f\x7e\xcd\x2e\x82\xf5\xbb\x34\x28\x1b\x63\x0b\x40\xf6\x43\x79\x38\xe6\x44\xfb\x64\x7e\xdb\x67\x07\x36\xc9\xe7\xd5\x18\xd8\x2c\x0f\x17\x07\x40\x6b\xf4\x2e\x24\xe0\x6e\x1d\x78\x17\x4f\xc8\x32\x51\xb6\x36\x9a\x4b\x78\x85\xbd\x93\xc6\x62\xf8\x26\xfd\x20\x0d\x13\x98\xf3\xc9\x41\x22\xd7\x05\x93\xf9\x6f\x4e\x9c\x7c\x83\x74\x30\xb2\x19\x49\x83\xa5\x81\x31\x30\xdc\x87\xc8\x1d\xd8\x49\x2e\x13\x40\x60\xf7\x9a\x88\x61\x7f\xf9\xfe\x15\xf0\x93\x6f\xbe\xfe\xfe\x55\x73\xad\x9f\x5e\x62\xfe\x5c\x81\x56\x2f\x3e\xe1\x0c\xf8\x18\xbe\x80\x15\x93\xf0\xc6\xe0\x11\x01\xe8\x87\x40\xee\x1a\xdc\x6e\xb6\x94\x08\x2f\xe2\x49\x5a\xfd\x30\x7e\xee\x73\xb8\xa9\x04\x59\x9b\x7d\x83\x8a\x36\xc8\xc6\x56\xe4\xcc\xb5\x4a\xc4\xec\x24\xc8\x9d\x04\xb9\x93\x20\x77\x12\xe4\x4e\x82\xdc\x49\x90\x5b\x96\x20\xf3\x9d\x04\xf9\x65\x48\x90\x2b\x67\xb9\xee\xc4\xc8\x16\xa7\xee\x05\x8a\x91\xbf\x88\xc9\x8d\x6e\x54\x63\x6e\xae\xf0\x7b\x9e\x47\x18\xb5\x77\x62\x82\xc9\x7f\x60\xc6\x76\xcc\x49\xaa\x90\x2f\xd1\x42\xb0\xc3\xb2\x94\xcb\x5c\xc1\xf4\x15\xca\x17\x5c\xa7\xb2\x82\x4e\x97\x11\xff\x2a\x33\xdb\x35\x66\x7d\x69\x4d\x28\xd3\x67\x1c\xcf\xac\x82\xae\xd0\x8e\x2f\xc9\xb7\x54\xc1\x13\x28\xa6\x13\xeb\x31\x97\x83\x1b\xeb\xd5\xab\x57\x78\x38\x5e\xfd\xf0\xc3\x0f\x0c\x6a\xc9\xa5\x22\x91\xe3\xe9\x86\xd0\xea\xbb\xd7\xaf\x7b\xec\xef\xc7\xef\xdf\x85\x92\xef\x00\x96\x84\x3d\x43\xca\x70\xfc\xb2\xe9\xb0\xff\x79\xfd\xe1\xa2\xaa\x66\x5b\x7f\x4a\x10\xff\x34\x9f\x79\x55\x36\x7d\x4a\x03\x9e\xf0\xf7\xae\x79\x5c\x5c\xd3\xe7\x8f\xfb\xda\x9a\x88\x7c\x38\xc8\x64\x42\x19\x13\x78\x4b\x3c\xa0\x00\x30\x4c\x3e\x18\xf8\x42\x7b\xe0\x66\x72\x63\xe8\xb0\x4c\xde\x09\x36\x30\x3f\x15\xba\xcc\x43\xb1\x7b\x56\x08\xe3\x2e\x96\xd3\x37\xfa\x82\x3a\xab\xf6\xc0\x88\xe6\x86\x6f\x81\xbb\x2d\x77\xe0\xdc\xc0\xc0\x32\x28\xde\x85\x87\xdb\xbb\xba\xa9\xda\xf8\x98\xe7\x98\xac\x0a\x67\xb3\xc7\xde\xf3\x89\xaf\xe1\xc6\x15\xe3\x7d\xa3\xb3\xd2\x86\x00\x45\x7a\x18\x67\x79\x40\xa7\x02\xab\x80\x51\xd2\x89\x6f\x16\x65\xa3\x60\x89\x11\xb8\x6b\xd0\x66\xbb\xb4\xc5\x5d\xbf\x6d\x47\xe2\xbd\x93\x03\x91\x4c\x92\x6c\x91\x0e\x1a\xda\xc4\xc1\x2c\x49\x74\x7e\xd0\x1f\x1c\x14\x47\xd2\x31\x28\xb8\xc0\xf2\x3b\x38\x85\x85\x30\xb9\x56\xc6\x07\xd2\xf9\xaa\xd9\xa1\x6f\xc2\x76\x87\xf4\x4b\xcc\x34\x32\x16\x8a\x23\xc2\xd1\xbb\x2c\xc4\xb5\xd5\x79\xd4\x1e\xab\xa2\x16\xa6\x53\x73\x12\x0e\xea\xe1\x4f\x58\x45\xd1\x44\x45\x14\xbd\xcb\xdd\x50\x1d\x0d\x2b\x3a\xac\x54\x99\x30\xa6\xf1\x66\x5e\x68\x88\xa8\x1a\x70\x99\x99\x4e\x55\xc2\x33\xe1\x54\x08\x9c\x06\x40\xa5\x90\x8a\x1a\x1e\xea\x7c\x6f\xa4\x9f\xd5\xfa\x61\x12\x14\xb3\xb2\x88\xa5\x57\x6b\xe7\xe6\xc9\xb3\x4c\xa4\x4c\x8e\xc7\x22\x95\xdc\x8a\x6c\x42\xb5\x0e\xe3\x8c\x32\xd7\x8e\xca\x1d\x7a\x5f\xa7\x9f\x1f\x2d\x40\x7d\x75\x64\x55\xab\x5f\xa4\xb0\x43\x85\x80\x8b\xe0\xfe\x4a\x12\x1d\x2a\xd7\x21\x44\x39\xde\x91\x1c\xea\xc6\xf7\x30\xcf\x6a\xb5\x6d\x1b\x69\x7d\x17\x76\x6c\x36\xfc\xfd\x22\xb5\xb1\xaa\xa6\x5f\xfd\xb3\x1b\xce\x52\x17\xc2\x2c\x8e\xbe\xaa\x1e\xc1\x0f\x73\xc8\x11\x9e\xc4\xa7\xdd\x3f\x3a\xed\xb3\x77\x8f\xf2\xf9\xf9\xdc\xed\x48\x4b\xb8\x65\x5c\xb1\xe3\xcb\xf3\x10\x12\xa3\x6b\x4b\x4e\x35\x23\xa1\x6a\x28\xa2\xab\x2a\x61\x9c\x7e\xcd\x0b\x5b\xe6\x18\x89\xe6\xeb\xe2\x77\x58\x5e\x08\x31\x86\xe1\x75\xaa\x6c\x5d\xca\xa2\x84\x1f\x85\x4d\x50\x74\x8b\x6e\x05\xd0\x50\x1a\x7e\x73\x83\x93\x82\x9b\x11\x56\xac\x17\x8f\x12\x61\x4f\xea\x65\x7d\xa2\xe2\xf9\xd2\x34\xc0\x49\xe8\x23\x5e\x58\x4c\xf7\x4d\xad\xfd\xb0\x70\x0a\x61\x2e\x0a\xa9\x53\x06\x90\xdc\xa9\x7e\x70\xfc\x6a\x28\x95\xf1\xcb\x07\x34\x86\xd6\xd9\x6d\xb7\xc0\xe4\x1d\xc4\xea\x4d\x7b\x54\x6e\x31\x8b\xe2\x30\x74\x69\x13\x5d\x25\x2e\xd3\x20\x9a\x37\x03\x98\x31\xac\x2e\x16\x32\x0d\xfb\xe2\x05\x2e\xbb\x74\xcc\x5b\xb8\x21\x6e\x61\xab\x67\x73\x17\x07\xcb\xa6\x26\xa3\x35\x2c\x31\x9b\x5e\xa9\x29\xa6\xb7\x32\xe7\x1a\x4b\x7b\xc5\xd5\x70\x31\xeb\xf2\x8d\x9c\x68\x62\xaa\xb3\x5b\x1a\x3e\x14\x58\x09\x15\xe5\x2e\xb7\x0a\xec\x4e\xaa\xd4\x2d\x75\x9c\x90\xce\x59\xc8\xde\xda\x15\x1e\x79\xd1\x85\x47\x76\x65\x3b\xbe\x94\xb2\x1d\x7f\xf4\x42\x78\x4e\x65\x5b\xdf\x80\x13\x68\xd6\xb5\xeb\x66\xe1\x02\xe4\x22\xa9\x91\x0f\x22\x68\x42\x81\xe1\x6a\x36\x51\xdf\xe6\x32\xb8\x89\x76\xb9\x4a\xbb\x08\xdc\xbe\x02\x79\x0f\xbf\x3f\x55\x69\x92\x88\x3f\xd4\x9e\x6f\x5a\x9b\xa4\xea\xf7\xdc\x8a\x71\x2b\xde\x73\x8e\xe8\x84\x3e\x82\x7c\x2c\xd5\xd1\x98\x3f\xc6\x3c\x88\x6a\x49\x4c\x1a\x70\x93\x63\x6e\x13\x90\x92\x14\xb0\xa6\x36\x68\x0b\x68\x16\x58\x0f\xb4\x70\xe5\x1b\xdb\xf3\xc3\xed\xfd\x67\xc9\x95\x95\x76\xd2\x1a\xe9\x90\xac\xa5\xd5\x84\x49\xe7\x05\x69\x07\xd7\x84\x0c\x2e\xd1\xa2\x60\xb9\xff\x88\x3f\x63\x43\x47\x9d\x11\xef\x67\x0d\x64\x44\x5a\xb1\x2b\xa4\xc7\x7f\x98\x85\xa3\xf1\xfa\x5c\xcb\x74\xd1\x72\x7a\x0d\xa0\xc5\x82\x16\x55\xb7\xeb\x2f\xe9\x98\x3f\xbe\xfc\x75\x7c\x1f\x6e\x60\xa2\x95\xb1\x05\x97\x00\x08\x43\xc6\x42\x90\x04\x9b\x2b\xb5\xde\x52\x20\x1d\xc0\x75\xbd\x72\xd2\xdb\x1f\x62\x6d\xa6\x46\x3d\x03\x12\xc5\xad\x49\x5a\x2d\x11\x24\x8f\x8d\xf8\xbd\x53\x4d\xfd\x39\xc2\x3a\x28\xee\x92\xa2\xa5\xb1\x10\x68\x21\x0d\xd5\x3b\x1e\xc0\xd9\x82\x4d\x52\x79\x2f\x53\x41\xeb\x1e\xce\x21\xd9\x66\x38\x40\xbf\x88\x7f\x97\x3c\xf3\x52\xac\x50\xe5\x18\x2b\xd1\xe0\xd1\xfe\x5b\x43\x54\xf6\x99\x0a\x8f\xac\x5f\x16\xc6\x06\xa7\x68\x7d\xdc\xeb\xec\xaa\x9c\x12\xef\x5f\xe0\x26\x4a\xf5\x0c\x07\x7c\x85\x0a\x9c\x75\xde\x06\xa3\xc0\x7d\xe7\x00\xd9\x03\xa2\xf0\x96\xbd\x31\xee\xfd\xcd\x4d\xa4\x9e\x8f\x2f\x29\x5a\x59\x6f\x58\xaf\x5c\x19\x29\xa2\xe0\xef\xdc\xa9\x92\x2f\x5a\x95\x6c\x53\xc3\xd2\x49\x75\x66\xee\x2e\xe3\x7a\xae\x65\xa9\x1c\xc8\x61\x89\x65\xc9\x8f\xd0\x02\xd4\x4d\x10\xe8\xb3\x1b\x66\xd4\x0d\x76\x95\xa3\xed\x26\x66\x47\x52\xf3\x5c\x3a\xb3\xab\xa0\xf9\x27\x52\xc5\x77\x15\x34\xf1\xf7\xa7\x57\x53\xb7\x5f\x46\xb3\x61\x49\x68\xc3\xb9\x6a\x16\x85\xf9\xaa\x6a\x20\x44\x91\x9e\xba\x82\x96\x8a\x66\x8a\x25\x04\xe2\x1d\xda\x32\xa4\xb7\x6c\x34\x49\x2c\x68\xd5\x44\x66\x2b\xe9\x32\x98\x3e\x9e\x8a\x2e\x82\xd6\xbf\x32\x6d\x6c\x79\x28\x69\x61\x36\x16\x59\x34\x4f\x7f\xe4\x19\x57\x89\x28\xce\xd5\xb0\x10\x66\x51\x7a\xef\x8c\xd6\x4d\x19\xba\xaa\xcb\xc7\x59\xa6\x79\xda\xed\x53\x7b\x26\xe9\x05\xa0\xae\x6f\x98\x2d\xf8\x60\x20\x13\x10\x07\x54\x1a\x05\x22\x1a\x51\xdc\xcb\x44\xd4\x70\xd3\x31\x64\x95\xab\x7a\x27\x2b\xe4\xff\xb6\x4c\xff\x85\xa0\x4c\x8a\x6e\x5a\x30\xfa\xe8\x14\x9d\x5e\x5c\x13\xb4\x4c\x14\x41\x74\xfc\xeb\x75\xfd\xf5\x66\xa1\xb0\x56\x92\x45\x8b\xfc\xdf\x95\x87\x7b\x7e\x39\x3d\xda\x9f\x4e\xce\x9c\xc2\xf4\x21\x17\xea\xda\xf2\xe4\x6e\xf3\xa1\x43\xf4\xd4\xb2\x54\x5a\x88\xb0\xaa\x09\x45\x4e\xf0\x2b\x52\x38\x3c\xfe\x10\x60\x1c\xd6\xf9\x00\x22\x56\x3a\x4c\x40\x98\x37\x84\x71\x21\xe9\x09\x65\xf7\x1b\xa7\x06\x95\xcb\x28\x7f\x5c\xda\xed\x5e\x73\x37\xfc\xeb\x86\x29\x73\xf1\x15\xaf\x3d\xaa\x31\x09\x37\xff\x6e\x68\x6c\xf5\x58\x26\xdb\x74\x7f\x45\x97\x96\x46\xdc\xee\x86\x63\xe3\xd6\x17\xbc\xc5\x6d\x94\x53\x14\x66\xe6\xb9\xa6\xb3\x5b\x9d\x8d\xa8\x50\x46\xe3\x60\x7b\xa2\x51\x1f\x09\xbb\x59\x9d\xb8\xd8\x91\x30\xa2\xd1\xfd\xb6\x59\xc3\x0c\x62\xbb\x39\x7f\x58\xf9\x38\xcc\x88\xfa\x5c\x74\x20\xa6\x9b\x57\x30\x97\x42\xe9\x72\x38\x6a\xd6\x2c\xc9\x04\xa6\x1a\x64\x3a\xe1\x56\x50\x30\x18\xbd\x9b\x86\xb2\x24\x55\x8d\xdb\x3a\xb4\x65\x8b\x73\xd4\x82\xa2\xc7\x05\x2d\xe8\xe3\x76\x65\x15\x4b\xdf\xbb\xe3\x22\x1e\x8e\xa8\xec\x6e\xf7\x41\xda\x51\x97\x24\x89\x23\x18\xf1\xd1\x57\x08\x2f\xb1\xa6\x35\x62\x9d\xcd\x6b\x99\x10\x04\x6d\xe3\xdb\x8b\x80\x05\xd9\xa4\x1b\x8a\x51\x51\x8e\x04\x86\xa4\x29\x9d\x0a\xe6\xae\x8d\x13\xb4\xd9\xc1\x8f\xc2\x72\x36\x10\xdc\x89\xd4\x87\x4f\x54\x2c\x21\x02\xe2\xaf\x6c\x3b\x90\x9c\xf4\x30\x12\x14\xff\x10\x70\x14\x20\x8e\x81\xa5\xc2\xdd\xdf\x67\x2f\x1e\x85\x2a\x27\x96\x05\xe0\xa5\xd5\x5d\x23\x32\xa8\x71\x01\x9f\xc7\xaf\x6f\x5c\xf1\xb5\x65\xfc\xe2\xa0\xcc\x10\x28\xc2\x1b\x56\x28\xd0\x93\x60\x28\xdc\x3e\xc2\x82\x52\xe4\xa5\x0f\x8c\x8e\x01\x2b\x8a\xda\x6a\xb2\x83\x54\x9a\xbb\x4e\x55\x7f\xa0\xc3\x7a\xbd\xde\xb6\x03\x9e\xb7\x12\x85\x78\xf1\xf6\x7a\xad\x7c\xb8\x8b\xb7\xd7\xad\x31\x41\x5d\xdb\x97\x84\x37\xe2\xe1\xe9\xc5\x63\xfd\x5c\xbb\x71\x12\x32\xdd\xa6\xc9\x51\x6a\xb0\x86\x0d\x61\x1b\xc9\x12\x6e\x0e\x38\xaf\xad\x63\x63\x6e\x65\xfe\x4b\x52\x30\x8a\xe5\xe5\xf8\xd0\xde\xe4\x95\x53\xaf\x8f\xb8\x43\x33\x8d\xdf\xf3\x59\x76\xb4\xe5\xf5\xa5\xc9\x6e\x3b\xac\x78\x16\x04\xf7\x2c\x5e\x8e\xa8\xd7\x50\xe4\x20\x45\x74\xb5\x44\x13\x10\x0d\x3c\x86\x52\x20\x6e\x1d\xc7\x65\x66\x65\x9e\x45\x02\x05\x48\x92\x9a\xf2\x00\x76\xe6\xf4\x17\x6d\x4e\xdf\x99\x83\xbf\x14\x73\xf0\x9f\x3a\x32\x2b\x50\xac\xd5\x03\xb3\xfa\x62\xc4\xef\xa5\x0e\xb0\xad\x55\x4c\xe9\xe7\x0b\xd1\x8a\x97\xa5\x69\x41\x58\x77\x61\xb0\x9f\x25\x47\xc3\x96\x26\x4a\x25\x81\x2b\x58\x16\x05\xdc\xc1\xc8\x0c\xf1\x12\x96\x68\x99\x66\xf7\xe4\xee\x81\x8a\x91\x6e\xd5\x33\x10\xba\x3d\xd1\x2a\x6d\x96\x61\x9b\xcb\xa8\x43\xe3\xca\x54\xe0\xb1\xea\x79\x5f\x97\xb8\x7d\xc0\xae\x57\x51\xfb\x9d\xd4\x7e\x53\x70\xa8\x94\xaa\xd5\x8d\x9c\x36\x02\x6c\x40\xaf\xa0\xbb\x39\xc4\xd1\x18\x3e\x9c\xfa\x56\x4b\x11\xd9\x4c\x8b\x11\x6d\xde\x9c\x7d\xcf\x66\xdf\x90\x2a\xe4\x3f\x25\xf5\x8d\x30\x5c\x6f\x0a\x27\x11\xbc\x75\x22\x72\x87\x7d\x54\x77\x4a\x3f\xac\x93\xdd\xbf\x42\xe4\x46\x55\xa0\x04\x6e\x98\xce\x32\x51\x54\x03\x7b\x8a\xa0\x8d\xe9\x35\xdb\x9a\x48\xba\x24\x8a\xa3\xd6\xae\x6e\xc9\x0e\x8f\x76\xe1\x1b\x2f\x5b\xde\x5c\x29\x7c\x23\xf6\x2e\x56\x3a\x89\x77\x2c\x92\x23\x22\x03\xa0\x84\xed\x1b\x1a\xe1\x34\x6d\x39\x86\xa3\xe2\x19\x2b\x9b\xa1\x77\x32\xfb\x17\x28\xb3\xef\x42\x38\xf0\xf7\x27\x97\xd1\xb6\x1f\xc1\x51\xd7\x38\x5a\x30\x2d\x52\x3c\x62\xd9\x9a\x5b\xdc\x18\xcc\x23\x58\x2d\x9d\x6d\x20\x15\xcf\xe4\xef\xcb\x2b\x8c\xbc\x0d\x0d\x81\x20\x28\xa6\x73\xfe\xef\xb2\x22\xac\x84\x70\x80\xd1\x22\x64\xe4\xc7\xe2\xf6\x88\xd4\x3e\xe6\x4a\x28\x9b\x39\x86\x33\xd6\xf7\x9e\xfc\xe2\xe5\x27\x23\x58\x5b\xf2\x6b\xb9\xb9\x33\x47\x3c\x1d\x4b\x25\x8d\x15\x45\x37\xc1\xb2\x39\x2b\x13\xdc\x4d\x11\x68\x96\x29\x0f\xed\x37\x7f\x99\x7f\xb7\xd1\xd2\x6d\x41\xec\xbc\x43\xe1\x7c\xb9\x9e\xd5\x02\xda\xcd\xcb\x7c\xcb\xce\xc3\x55\xdd\xbd\x4c\x52\x06\xbf\xe7\x32\xe3\xfd\xcc\xed\xaf\x11\xc5\x3d\x47\x10\x01\x18\x46\xd8\x9d\x7d\x53\x1b\x66\x33\x28\x79\x6b\xdc\xb1\x52\x7d\x5a\xee\xec\x7c\x57\x7f\xce\x6d\x32\xea\x8e\x45\x31\x14\x5d\x04\x49\x69\x4a\xb1\xb3\xdf\x30\xb6\xe0\x56\x0c\xe1\x05\x78\x7b\x8e\x07\x69\xc4\xcd\x32\x51\xfd\xd2\xb5\xf1\xe2\x8c\x5f\xbf\x0a\x2d\x01\xba\xf0\x2a\x85\x5a\xa8\x59\x6f\xe5\x4a\x3d\x99\xaf\xf4\xa2\x0e\x0e\x33\x75\x13\x74\x2a\x50\x24\x71\x32\x97\x28\xd0\xff\x29\x15\xfb\xa5\x9a\x15\x3b\xe3\x09\x39\x46\xc1\x6f\x41\x29\x0b\x25\xd6\xa6\xa6\x9a\xd3\x12\xc2\x6d\x70\x35\x79\x32\x12\xec\x40\xf6\x44\xcf\xfd\x24\x6c\x92\x1e\xee\x14\x80\x17\xad\x00\xec\x84\xd7\x2f\x45\x78\xfd\x73\x1b\x9c\x75\xba\xa1\xad\x99\x53\xe0\xc0\x1f\xd6\xb2\xec\x56\x60\xb9\x51\xf9\xbd\x36\x40\xe3\x50\x86\x44\xe1\x02\x22\x61\x62\x4b\x1a\xae\xc4\x65\x28\x07\x4f\x0e\x77\x1f\x39\x72\xe5\xdd\xd2\x7f\x6a\x7b\xb3\x63\xaf\xdb\x55\x61\x74\x2a\x8e\xd1\x21\xbe\x84\x6f\x53\xab\xca\xb8\x1c\xcb\xb0\x21\x77\x4f\xa7\x4e\x42\x9c\x2a\xdf\x33\x9f\x0d\x4f\x7d\x7b\xd6\xf7\x6f\xa8\xeb\x39\x75\x81\xb6\x64\x4f\xbd\x88\xbe\x00\x61\x4d\xc1\xa6\xeb\x43\x95\x3b\xec\xec\x11\x19\x31\xe2\x1d\x9e\x2b\xff\xd7\x13\x5b\x59\xfd\x32\x6d\x6c\x66\x75\x1b\x49\xe1\x66\xcb\xe4\xb4\x10\x96\x06\x6c\x18\x4e\x26\x58\x9b\x6b\xcf\x9c\xb8\x92\x96\x99\x63\xc7\x45\x99\xb5\x32\xbd\xe6\x10\x1a\x58\x88\xf4\xb4\x74\x8b\x73\x1d\x7a\x38\x1f\x2a\x1d\x7e\x3e\x03\xa8\x9f\xe5\xe2\x99\x3b\x1a\x34\x08\x0f\xef\x83\x1f\x00\xb0\x41\x7a\xc0\x72\x9d\x82\x48\xe5\x06\x4f\x7a\xae\xe1\x56\x9a\x01\x12\x99\x30\x1d\xf1\xe8\x84\x06\x44\x26\xac\x80\x82\x81\x14\xf9\x22\xe2\x1d\xd6\x2f\x2d\x93\x16\x84\x89\x64\xa4\xb5\x11\x44\xc7\xb1\xdf\x7b\xa9\x41\x68\xc3\xb3\x53\xb0\xb1\xa3\x56\x44\xe3\xa2\xee\x31\xd4\xad\x7a\x4d\x1a\x36\x86\xca\x4b\x7e\x75\xbc\xb6\xe0\xba\x09\xf0\x75\x43\x40\x01\x33\x4e\x3a\x19\xbb\x4e\x1f\x84\x1c\x8e\xac\xe9\x30\x10\x7f\x03\x52\x4e\xd5\xed\x58\x08\x6b\x18\xcf\x32\x3f\x84\x78\xc3\xaa\x24\x74\xc3\x0e\x9a\x49\xe6\x1d\xff\x7c\x6a\x9f\x66\x2e\x17\x82\x4c\x1d\x76\x18\x65\xc3\x39\xc9\xad\x1c\xbb\xa5\x93\xd6\x47\x01\xda\x51\x01\xa1\xab\xb0\x14\x19\x7d\x58\xd7\x2a\xb4\x3b\xc1\x96\xa7\x00\x4f\x76\xbb\x87\xb3\xbb\xdd\x0b\xe5\xd8\xcb\xb1\xc7\xaa\x82\x19\x7a\x00\x06\x74\xc4\x14\x88\x61\x07\xef\xc2\x93\xb3\x6a\x74\x7f\x0b\x2f\x1d\x98\xc3\x6a\x39\x47\x72\x38\xf2\xab\xc9\x09\x75\xaa\xbe\x0b\x5b\x56\x6f\x2f\x7d\xbf\xd5\x6a\xde\x88\x62\x8d\x8c\x95\x9a\xbf\x6b\xf6\x36\xb5\xbb\x4e\xab\xf1\x7a\x08\xc0\xd4\x8b\xe1\xd1\x08\xa0\x2e\x1c\x92\xda\x31\x9b\x73\xa9\x60\xf5\x9d\x64\x3d\x16\x96\xb9\xcb\x59\x1d\x36\x2b\x1d\xdd\xa5\x52\x74\x78\xc1\x49\x04\xf7\xb7\x3b\x65\x5a\xd1\x09\xa1\x38\xcc\x75\x46\x90\x08\x6e\x42\xb1\x68\x1a\x85\x1e\x0b\x8c\x4a\x67\x29\xac\x22\x0c\x41\xf8\xa5\x64\x07\xa2\x37\xec\x45\x78\x6e\xa8\x13\x1c\x76\x22\xc1\x05\xa8\x04\x60\xbb\x21\x1c\xa5\x2d\xc0\xa6\x16\x21\x90\x89\x7b\x49\xe8\x9e\xae\x73\x50\x49\x9c\xda\x01\x33\xd9\xb2\x66\xde\xca\x9d\x1c\xb7\xab\x98\x7d\x30\x2d\x4d\xb1\x7d\x92\x61\xdb\x79\x92\x7f\x16\xbc\xb0\x7d\xc1\xed\x53\x38\x92\x17\x1d\xca\x77\xdc\x58\x38\x4a\xec\x41\xb0\xa1\xb6\xd5\x76\xa1\xd9\x75\x28\xef\x85\x8a\x9d\xa6\x33\xaf\xda\xd3\x3b\xc3\xdb\xcd\xa1\xe6\x79\x46\x0c\x75\x49\xe6\x58\xc7\x2e\x48\xb0\x86\x43\x09\x18\xb0\x73\xa6\x33\xc7\xc9\xde\xcc\xd3\x2a\xc7\x5c\x41\x58\x28\xd8\x06\xe9\x25\x26\x55\x0a\x48\xd3\x6a\xd8\x08\x33\xc8\x60\x98\x61\x95\xd6\x90\xd5\x66\x7b\xf0\x1b\xc3\x3a\xe8\x17\x52\x0c\x0e\x6b\xa8\x84\xf1\xb2\xec\x9b\x2d\x8c\xe4\x8f\x1a\x11\xe0\xb8\xe3\x1f\x2d\x02\x00\x09\xcf\x40\x0e\x97\x86\x99\x37\x9b\xc6\x65\x5b\x19\x49\x31\xd1\x2a\x54\x19\xfb\x50\x2a\x23\xb1\x54\x70\xd7\x94\x7d\x24\xfd\x07\xe2\x31\xc9\x4a\x14\x1c\xc8\x5c\x70\x18\xfc\x20\x4a\xab\xae\x92\x6d\x62\x58\xf1\x53\xef\xf9\xfa\xe8\xa3\x27\xbe\x87\xa9\xc5\x58\x44\x17\xc2\x5b\x28\xa9\x87\xb4\x1f\x44\x13\xbf\x40\x95\x2c\x34\xda\x3e\x4f\x71\xa3\x5c\xea\x03\x69\x34\x6d\x78\xc1\x4c\xf3\x0a\x0d\xe4\x90\x71\x63\xe4\x50\x21\xa3\x76\xef\xf7\xae\x73\x91\xf4\xe2\x65\x69\xa3\x60\x26\x56\xde\xaf\x4c\xa6\xe7\x9f\xca\x45\x1b\x71\x0c\xdf\x62\x85\xc0\x0c\x4a\x98\xca\x48\x24\x77\x20\x42\x88\xd4\xcf\x2b\xc8\xaf\x12\x91\x9a\xef\x45\x36\x61\xa5\x91\x6a\xd8\x63\xd4\x05\x88\x39\xc1\x82\xe9\xd3\x49\x62\xe7\x01\x29\xfe\x7e\xc9\x8e\xfd\x5a\xe1\x37\x3a\x4c\xd7\x9b\x3b\xde\xf1\x8b\x23\x3c\x3f\x69\x5d\x35\x4a\x45\x2e\x50\x60\xd6\x8a\xf9\xa2\x3a\xdc\x5a\x40\x93\x45\x84\xe0\x92\xf0\x94\x1b\x1f\x20\xa4\x71\x88\xc0\xe0\x8a\x89\xa2\xd0\xf3\xb8\x8c\xdf\xc6\x67\xda\x03\x3f\xce\xd6\xbb\x00\x6b\x4d\x72\x59\x69\x44\x8f\xfd\x3a\x12\x6a\xce\x81\x73\x5b\x46\x96\xdf\x4e\xd5\x43\xd5\x3d\xf9\x74\x8d\xd1\x89\xe4\xd1\xc7\x72\x3e\xc9\x34\x07\x84\xdc\x0c\x52\xc4\x30\xf9\x87\x67\x5a\x0d\x51\x1d\xe1\x94\x89\x1b\xf3\xd5\x90\x49\x89\xbd\x44\x2a\x23\xdc\x71\x72\x12\x80\xcf\x01\x5e\xb5\xda\x2b\xa4\x4e\x82\xa4\x4f\x57\x83\xeb\x10\x12\xb4\x5f\x97\xea\x45\xa9\xc2\xfe\xf6\xaa\x9d\x86\x24\x10\x9c\x6d\x88\xb4\xa1\x8b\x8a\x10\xd5\x98\xe7\x07\x3d\x8c\xb8\x61\x7d\xe1\x44\xa8\x78\xa9\xad\xa6\x72\x58\xbf\xfa\xd4\xb2\x5f\xca\xbe\xc8\x84\x45\x68\x5b\x82\xa4\x86\x2a\xbd\xb6\x40\x8c\x21\x36\xe6\x77\xb3\x4f\x1c\xfc\x86\xd7\x83\x7e\xe9\x4f\x20\x07\x15\x54\x52\x05\x8e\x0f\x99\xf2\xe0\x1a\xa8\x8d\xc4\x6f\x40\xf0\x1f\x01\x55\x09\x93\x9e\x7d\x72\xe1\x54\x2f\x61\xb9\x67\xae\x4d\x0c\xbd\xae\x26\x00\xcf\x9c\x89\x31\x2e\xaf\x4a\x64\xe6\x87\x34\x7d\x9e\x48\x6f\xa9\xcd\xab\xc7\xa0\x53\x74\x57\xe8\x24\x29\x8b\x0e\xaa\xf6\x58\xe6\xa9\xd3\xb8\xa1\xd5\x3c\xe7\xf7\x8f\x87\x2e\xba\x1b\x6e\xd3\x16\x74\x04\xea\x08\x2d\x59\x74\x9a\xe1\xa4\x4e\x7d\xa4\xd9\x0f\xbc\xa5\x0b\xbf\x1f\x33\x77\x93\x30\xa9\x9b\x13\x75\x5a\x57\x2a\x07\x98\x3a\xea\xf3\x8d\x1f\x46\x32\x73\xfa\x94\x4a\xdc\x07\xc2\x1a\xf1\x22\x93\xa2\x40\xd2\x63\xbc\x2e\xa6\x1f\x94\xff\x7c\x35\x1d\xf7\x1a\x36\x3b\xac\x14\x48\x2a\x95\x00\x18\xc2\x85\xce\xb2\x3e\x4f\xa0\x2c\x74\x8d\x52\xc6\x9e\x36\xa3\xb3\x7b\xc1\x78\x52\x68\x63\xc2\x39\x2e\x04\x1c\xdc\x1e\x7b\xc7\x6d\x73\x30\xfe\x6c\x56\x4b\x81\x45\xe4\x67\x50\xa3\x43\x4f\xf1\x5b\x8c\x09\x5c\x4e\xe4\x1b\x74\xdf\x4c\xb8\x93\x2b\x11\x68\xb1\x34\xa8\x54\xe6\xda\x18\xd9\xc7\xea\x0a\x7e\xe4\x60\x75\x81\xd3\xda\x9f\xb0\x81\x7c\x0c\xf7\xa4\xc1\x6d\xa5\x9a\xde\xe2\x1e\xfb\xbb\x2e\x21\xb9\x71\x20\xc9\x42\x83\xa9\x3d\x53\xea\x60\x2a\xfa\xe5\x70\x08\xb5\xe7\x27\xcc\x08\x30\xb6\xd3\x87\xf0\xe3\x95\xfe\x50\x23\x08\x99\xf6\xe7\x1e\xa5\x98\x91\xd3\x3a\xba\x41\xeb\x88\x6e\x5d\x30\xa6\x41\x63\x08\x42\xf8\x1b\x23\xbd\x0a\x4b\xed\xc1\x02\x07\x7e\xa6\x0b\xd8\xef\xd0\x37\x04\xb6\xa0\x15\x8f\xdc\xb0\x78\x1c\xb2\x50\x54\xdc\x58\xde\x97\x99\xb4\x13\xff\x29\x7c\xd7\x8a\x47\xdb\xdc\x7f\x62\xc3\xeb\x58\xa4\xb3\x78\x53\x9f\x87\x39\xd6\xa5\x80\xd5\x38\xe4\x80\x67\x19\xf3\x07\x12\x52\x85\xa5\x65\x42\x01\x80\xbb\xe3\x45\x5e\x0a\x68\x27\x3f\x20\x2f\x6b\x92\xf8\xbe\x48\xf4\x98\x44\xc2\x59\x12\x4b\x95\xa2\x0c\xe3\x4a\x05\x42\xa7\x8b\xa8\xd2\x45\xb3\x4b\x69\x60\x3b\x33\x01\x37\x19\xac\x84\x89\xa5\x32\x2c\x32\xc4\xb2\x64\x13\x26\x1d\x6d\x1d\x0b\x5f\x9b\x91\xb3\xd7\xaf\xba\x63\xa9\x4a\x2b\x98\xd1\xfc\xce\x63\xb2\x03\xcf\x72\x73\x0b\x43\xc9\x28\xe7\x1b\xf8\xa0\x1e\xcc\x1a\x41\xe5\x2c\x9e\x29\xad\xb9\x26\xc4\x01\x68\x16\x02\x91\xce\x81\x47\xe3\x87\xe1\x86\xcf\x5d\x9f\x1e\xbb\xd0\xd6\x5b\x92\x07\x33\xf8\x00\xf2\x5b\x01\x19\x9f\x4a\x66\xec\xc0\xed\x0b\x89\x22\x94\xd9\x49\x76\xab\xfa\xba\xbb\xbb\x98\x19\x5d\xab\x70\x10\x77\xd4\x71\x63\xe2\x7e\x93\x6b\x1d\x46\x93\xe3\xd9\x03\x9f\x18\x47\x62\xca\xb1\x48\xd9\x10\x46\xec\x28\x4a\x74\x01\x81\xef\x43\x0b\x2a\x7e\x53\xc5\x45\x91\x57\x69\x2c\xec\x48\xc3\xba\xf8\x8d\xaf\xf8\x41\x74\x67\xa3\x7d\x56\xc2\x98\x8e\xdb\x4d\x58\x48\x34\xd8\x23\xfe\x5b\x41\x6b\x59\xe9\x87\xee\x88\x10\x4d\x1a\x94\xb6\x2c\xb6\x6e\x7d\x3b\xe5\x62\xac\xd5\x19\x85\x1a\x2c\x53\x96\x1a\xad\x21\x54\xcf\x10\x34\x8b\xce\x05\xa9\x45\x29\xb4\x32\xac\x28\x95\x22\x31\x1e\xf2\x97\xda\x59\xe4\xee\x90\x88\xf9\x8f\xac\x4d\x83\xea\x63\x5d\x48\x81\x7c\x23\x54\x38\x64\x32\x8a\x25\xc2\x0c\x8a\xf4\x43\x22\xf7\x76\x97\x7e\x59\x52\x01\x35\xf1\x2e\x97\x87\x91\xce\xaa\xe0\x48\x47\xf7\x2e\xc0\x6f\x84\x03\x86\x80\x24\x90\x75\x0b\x31\x84\x80\x2b\x2f\x19\x8d\xb9\xfb\x6b\x17\x7c\xf4\xa2\x83\x8f\xda\x64\x1f\xbc\xa3\xad\x07\x77\xe1\x96\x03\x1c\x75\xba\x8b\xfc\xdf\x05\x4f\xed\x22\xff\x9f\x27\x5a\xe6\x09\x82\xfe\x63\x3f\xe8\x7c\x9e\x72\x8c\x22\xaa\xa1\x96\x4d\x44\xaf\x52\x45\x9a\x8c\xb7\xa5\xe9\x41\x2d\x68\x00\x60\x4d\xd8\xbf\x4b\x01\xa6\x11\x7d\x0f\x80\x32\x4e\xf4\xf2\x94\xe9\x6f\x3e\x74\x00\x84\xc3\xc6\x17\x3e\x5c\x05\x97\x3f\x8d\x21\x62\x0f\x55\x7c\x55\x7d\x94\x4e\xac\x6a\x13\xc3\xa1\xa2\x45\xb8\x71\xef\x2c\x0d\x38\xc7\x73\xd2\x63\xc7\x81\xaf\xce\xfa\x32\x68\x05\xf0\x4f\xf0\x08\x7f\xb8\xda\xba\x07\xfe\xa2\x31\xf2\x27\x03\x8b\x9c\x5e\xa2\x6d\x78\x48\x7c\x8f\x57\x95\x4b\x7b\xa5\x43\x58\x95\x1d\x40\xfe\x10\x96\xdf\x1d\xa4\xe0\xed\xf5\xf5\x30\x39\xbb\x13\x13\x64\xf8\x90\x34\x22\x0a\x1e\x1a\x43\x45\x47\x92\x47\xee\xc4\xc4\x5b\xe0\xca\x56\x31\x40\xed\x6a\x95\xe2\x05\x80\xaa\x90\x5e\xbd\x0b\x03\x5e\x1d\x95\x3c\x22\xe6\x7e\x26\xed\xd3\x24\x60\x25\xf6\x0d\xd5\xb1\xd4\x0a\xf0\x88\xc0\xbf\x42\x17\xd2\x0b\x3e\x9f\x78\x26\xd3\xb0\x54\x78\x8c\xcf\x55\xc7\xe9\x67\xee\x7f\xce\x1e\x9d\x1c\xdf\x61\xa7\x5a\x98\x0b\x6d\xe1\xcf\x1e\xfb\x89\x6c\xb3\xef\xd6\x29\xc8\x8a\x5f\x5e\x26\x48\x2a\x06\xe7\x18\x70\x1e\x23\xa1\xc0\x04\x9d\x34\xec\xae\x34\x8e\x2d\xeb\xc2\x0f\x19\x04\x4e\x4c\x10\xc2\x2e\x62\xcf\x18\x18\x53\x66\xf6\x81\x33\x75\xfd\xc4\x73\x5d\xd0\xdd\xfc\xae\x7e\x02\xbc\xa7\x77\x73\x5f\xa6\x14\x01\x23\xd5\x30\x0b\x91\x45\x1d\x12\xd7\x7d\xf9\x55\x90\x62\xf3\x42\x78\xfd\x5e\x31\xaa\x6b\x4a\xc6\x00\xec\x0f\x65\xe8\x8c\x27\x50\xa8\xaf\x40\x83\x1d\x25\x82\xc8\x84\x41\x1a\x08\x83\xf4\x90\xe7\xa9\x93\xdd\x92\xd8\x34\x8a\x8f\x86\xf3\xbd\x4d\x92\x03\xd4\x72\x21\xad\x29\xb3\x0c\xaa\x40\x40\xe6\xd8\x34\x79\x0f\xf1\x5a\x4a\x57\x00\xec\x58\x58\x30\x8a\xcf\x41\xa6\x85\xf1\x58\xc7\x17\xa7\x58\x33\x57\xb0\x1b\x9d\xeb\x4c\x0f\x27\xf1\x68\x10\x7b\x2e\x18\x6e\x80\xa0\x95\x7d\xba\x90\x5e\x0f\x8e\x5f\x68\x41\x99\x9a\x91\x63\xcb\xee\xd5\x1c\x76\x56\x9b\x52\x7f\xe2\x4d\x18\x40\xd1\xb6\x0d\x71\x39\x8f\x2f\x6c\xa2\x65\xc0\x32\xbc\x95\x22\x4b\xb7\xbc\x02\xe0\x71\x7f\xb1\x2b\xb0\x0d\x63\xc3\xb2\x64\x50\x6a\x32\x3f\x0f\x14\x81\x83\x83\x8b\x98\x2a\xbf\x82\x89\xa1\x75\x14\xc2\x54\x0c\xc5\xea\x0b\xda\xda\xaa\x7c\x3e\x55\x7a\xc6\x04\xe7\xd3\x50\xd8\x19\x71\x18\xa8\x3c\xba\x6b\x7d\x3a\x51\x7c\x2c\x13\x32\x02\xe1\x27\x3d\x02\x26\x1b\x72\x2b\x2a\xf6\xa0\x78\x3f\x8b\x50\x65\xbd\xdd\x28\xd8\x98\x7d\x24\xdf\x1c\x5f\x9e\x0f\xdc\x3e\x5d\x72\x9e\x4f\x1d\xd3\x4f\x50\x3d\xbd\xd0\x16\xcc\x3f\x64\x28\x33\xc8\x4c\xc0\xfa\x19\x3e\xd7\x63\x57\x98\x14\x4b\x81\x8c\xe0\x19\x7d\xdd\x7b\xfd\x4d\x8f\x19\x21\x2a\xed\x4c\x1a\xe3\xd8\x2d\x29\x68\xdf\xbf\xfe\xeb\xf7\xdf\xaf\x03\xf2\x9c\x9e\x9c\x9f\x5e\x2d\x85\x79\x86\x56\x4d\x8d\x20\xd7\x29\x3b\xbf\x64\x05\x58\x40\x83\xbb\x27\x8e\x9c\x5c\x7b\x40\xcb\x88\x84\x6f\xd6\x1c\x92\x1f\x8e\x99\x39\x1e\xd8\x6b\x04\xb7\xef\x4f\xd8\xa5\x4e\xa9\x40\x0e\xb7\x71\xa0\x67\x88\xe0\x94\xa6\x79\x0e\x5f\xd9\x11\xa1\x51\xc3\x29\x42\x20\x7c\x5a\x0a\x58\x21\xda\xc1\x73\x8a\xe6\xa6\x92\xe2\xdc\x62\x14\xf0\x6b\x32\x9c\x84\xb8\x6a\x3d\x60\xe7\x97\xf7\xdf\x82\xac\x76\x7e\x79\xff\xfd\x53\xca\x00\xdb\xca\x4e\x45\xf4\xbe\x62\xe9\xb9\x3f\x3f\x8d\x33\x71\x6a\xc1\x37\x68\xd8\xd1\x65\xea\xb1\x00\x43\xf2\x25\xfa\xfe\xde\xb0\xdb\xf2\xd5\xab\x6f\x92\x4b\x7a\x7a\xc1\xc7\x02\x7e\x11\x6f\x8e\x8e\xea\x8f\xae\x71\x83\x12\x47\x60\xce\x4f\xb1\xd1\x1a\xa1\x70\xbc\x61\x41\x9f\x39\xa1\xe9\x8a\x58\xc8\x82\xf0\xed\x2d\xb3\xa0\x1b\xd7\xe9\x46\x2c\xb7\x54\x14\xd0\xec\xe8\xdc\x92\xb9\x7d\x8c\xdb\x7a\xd8\x1f\x43\x1c\xd8\x3f\x09\x2e\x4c\x25\x1e\x20\x03\xa2\xc7\x7e\x9c\x78\xef\x4c\x27\xf0\x97\xa8\xa7\x95\x31\x54\xc0\x0c\x01\xff\x3d\xfa\x6a\xcc\x55\xc9\xb3\xae\xfb\xa3\xeb\x93\x91\x91\xdc\xb7\x85\xf9\xdc\x0a\xf7\x6d\x13\x89\xb6\x4e\x22\x7e\xcb\x28\x67\xca\xd4\x59\xaa\x90\x79\x13\x73\x68\x8f\xa5\x9e\x39\x39\xed\xab\x60\xf6\xff\x04\xfb\x0f\x45\x86\xd7\x6f\x61\x87\xc9\x41\x95\xb5\xbf\xd1\xe6\x55\xc3\xb8\xd0\x56\xbc\x41\x95\x28\x90\xd5\x54\x24\x19\x2f\x50\x71\x02\x5a\xe3\xbe\x87\x2e\x74\x48\x99\x00\xad\xc8\xe9\xe9\x54\x57\xdc\x94\x83\x81\x4c\x24\x3a\x56\x31\x73\xbb\x13\x0a\xf4\x2b\x86\x0e\xc3\x94\x5b\x0e\x8e\xba\x12\xdd\xfa\xde\xa7\x2c\xe9\x1b\x69\x8f\x9d\xf0\x2c\x8b\x3c\x16\x52\x19\x2b\x78\x0a\xfc\x9e\x03\x24\x73\x97\x94\x35\xb0\x68\xa0\x5a\xc6\xae\x85\x80\xe9\xbf\x39\x3a\xca\x0b\xcf\x6f\x7f\xf8\xeb\x37\x7f\x7d\x4d\x75\x3c\x7d\x20\xcd\x13\x08\xa1\xc7\xf5\x3c\xad\x65\x74\x60\x19\x8d\x7f\x32\xcc\x02\x9e\x01\x4e\xfc\x2c\x4a\xf3\xf2\x4a\xe5\x1d\x57\x83\x6d\xca\x0f\x55\xa5\x9b\x70\x47\xab\xba\x1b\x15\x9e\x85\xdb\xf7\x2a\xa5\xa4\x0e\x66\x7c\xc2\x73\x9e\x48\x3b\x59\xa3\xba\x5e\x42\xaf\xbe\xfc\x25\xf4\x93\x6c\xae\x9f\xd5\x16\x62\x17\xa6\x56\x71\x6d\x2c\xe4\x5c\x14\x06\xdc\xb8\xb6\xeb\x61\x91\xc3\x32\xad\xbe\xc0\x6d\x01\x4d\x42\xc6\x8a\x07\xb8\x09\xc6\x2e\x4f\xca\x43\xd6\x71\x3d\x36\x7e\xf5\x12\x70\x31\xd5\x0c\xdd\x6c\x9f\x92\xfc\x71\xf0\x4f\x50\xb3\xdb\x86\xaa\xd9\x1a\x9e\x74\x4e\x9c\x78\xac\x3a\xdc\x4b\x0e\x7f\xa4\xa8\x60\x06\x75\x31\xa9\xa9\x98\x73\x02\x3f\xd3\xb9\xa1\x1a\xab\xcf\xad\x19\xf6\xd1\x26\x3a\x02\x66\xb8\x30\xb6\x63\xe6\xb0\xe5\x98\x0f\x5b\x0b\x1e\xa1\x46\x21\xc3\xd7\x42\xed\x51\x35\x95\x64\xbe\xe9\x79\x3e\xf1\x9f\x3a\x77\x5f\xda\x48\x48\x76\x83\x3b\x57\x83\xa9\x2a\xbd\xab\x99\x8a\x20\x35\x0f\xba\x59\x78\xd8\xd0\x90\x28\x53\x73\x54\x96\x12\x13\x88\x51\x98\xc9\x26\x3e\x90\x78\x12\x49\x6a\x1b\x10\x12\xf7\xd6\xfa\xe8\x42\x6e\x4e\x35\x84\xa1\x69\xac\x85\x79\x58\x43\x9b\x0e\x1c\x7b\x83\x0a\x19\x5e\x58\x54\xe2\x5e\x14\x2c\xf7\x40\x0e\xe8\xd9\x50\xfa\x01\x05\xc9\x60\x5c\x59\xc3\xd1\x81\xfc\xe4\x98\x2a\xa9\xb4\x3c\xe7\xbe\xaa\x44\x25\x16\xf8\x4a\x2c\xf3\x2d\x1f\x9b\x1e\x78\x3f\x44\x2c\x9b\xb1\xd1\x81\xa7\xe1\x9f\xab\x8f\x4b\x8f\x41\x50\x29\xe0\xeb\x20\xf8\xf8\xc9\x43\xb1\x61\xc1\x0e\xa8\xd2\xc3\x61\xec\xfd\xfd\x4c\x8e\x8c\x75\x74\xbb\xea\xde\x2e\xd1\xef\x42\x43\xef\xe6\x5c\xe9\x26\xb7\xd0\xf2\xa2\xf0\x89\x16\x8e\xcc\xe3\xa8\x39\x85\xdd\xd6\x3d\xf0\xab\x5f\x86\xbe\xd6\x76\xa9\x4d\xe7\x47\xad\x2d\x3b\x3f\x9d\xf9\xc9\x35\x2e\x60\x60\x19\x57\xa5\xb2\x72\x2c\xda\xc5\xb0\x9d\x34\xde\x62\x3e\xa2\x6d\xd6\xa8\x02\x46\x40\x41\x8d\x0b\x31\xd6\x56\xb0\xe3\xcb\xf3\x10\xe2\x9f\xdc\x89\xe2\xcd\xd1\xd1\xeb\xde\x77\xbd\x57\xad\x0b\xe6\xc4\x11\x54\x8e\xb2\x65\xed\x06\xff\x0b\xb4\x5d\x3c\x64\xd0\xcc\xf7\x4b\x28\x31\xd2\x2d\xf6\x69\x9c\xdf\xf4\x5e\x7f\xdf\x7b\xd5\x7d\xd5\xeb\xe7\xba\xf7\x6d\x97\x8f\xd3\xef\xbf\x5d\x6b\xb4\x65\x5f\x5c\x16\xfa\x71\xd2\x72\xc0\xbe\xf9\xc2\x31\xaf\x39\x8e\x4c\xd8\xf6\xa3\x70\xd2\xd6\x96\xc7\x40\x2a\xd1\xd2\x73\xff\xde\xb7\x9b\xfd\x61\xf6\x56\x17\x1e\x50\x8e\xba\x0c\x89\x41\x09\xa7\x2c\x77\xb2\x7a\x02\x92\x5e\xc3\xca\x5c\xa1\x43\xb0\x77\x82\x17\x0a\xc3\x75\xe0\x18\x8c\xb9\x3a\xf8\xee\xd0\xf7\xda\x95\xe9\x1b\x6f\x8b\x18\x73\xf5\x43\x4f\x17\xc3\xa3\x4c\xaa\xf2\xd1\xfd\xd9\xcd\x9d\xdc\xe5\xfe\xf5\xdd\x51\xf5\x42\xef\xbb\xde\xc8\x8e\xb3\x75\x83\x1a\xa4\x1a\x22\xf5\x6b\x41\x96\x3e\x84\xfa\x5c\xf8\xca\x96\x48\x93\x36\x28\xe7\x2d\x1e\xc0\x87\x6b\x06\xcd\x16\xdc\xa9\x23\x61\x93\x23\x6d\xba\x85\xc8\x00\x9c\x01\x2f\xd6\xa9\xe8\x4b\xae\xd8\x4f\x17\x1f\x8f\xb0\x00\xd4\x0f\xec\xe0\x61\x24\xc4\xef\x93\xc3\x75\xee\x17\xe2\x34\x7c\xfc\xb8\xf4\x50\x5d\x87\x86\x6b\x9f\xaa\xea\x5c\xd6\x4f\xd1\xcd\x2c\x27\x46\xe2\xb8\xd4\x95\x48\xd9\xcf\xdc\x42\x0d\x23\x13\xa4\x33\x9e\x24\xc2\x98\x5e\x21\xd2\x11\xb7\xbd\x44\x8f\x9d\x84\x56\x8e\x7d\xdc\xef\x91\x50\xdd\xd2\x1c\x15\x22\xfd\x6d\xc4\xed\x6f\xa6\xec\x87\x89\xfc\x56\xd5\xd0\x3a\x7a\x7d\xe4\x0e\xda\x51\x31\x32\x63\x60\x8b\xdb\x4d\x13\xaf\xee\xea\xec\xc5\x9e\xe6\x65\x73\x49\xf4\x8c\xb3\xd5\x82\x2b\xcd\xa7\x5d\x8b\xa8\xeb\x82\x0b\xd5\x99\xc3\xff\xe9\xe7\xb5\x83\x2c\x10\x44\x0f\x9c\xed\x2d\x02\x0b\x67\xb4\x26\xa7\x3b\x18\x3e\xaa\x88\x71\x91\xd2\x91\xaa\x45\x81\x6f\x31\x38\xfd\x53\x3d\x05\x99\x42\xd1\xdd\x3f\x61\x74\xbe\x8a\xe0\x43\x21\xad\x15\x48\x52\x21\xb2\x4f\x0f\x3a\x21\xe9\xc4\x9d\xf1\xdb\xbd\xfb\xd7\xb7\x7b\x6b\x5c\xdd\x81\xff\xcc\x32\x7f\xa8\x1b\x09\x8d\x12\x97\xc4\x6a\x5a\xb3\x90\xd7\x1a\x50\x61\x9c\xa4\x41\x31\xa2\x5b\x06\x4e\xa8\x86\xbb\x9d\x13\xd3\xa6\x94\xe8\x9a\x55\x44\x25\xd4\x54\xb4\x18\x8a\x9a\x7a\xe1\x38\x40\x53\x6d\xff\x2c\x45\xab\x3e\x55\x41\xf4\xe9\x0e\xc6\xf9\x80\xe6\x44\xc9\x6a\x9c\xe5\x52\x20\x78\x44\xb8\x31\xc1\xeb\x80\x3f\x3a\x7a\x5e\x78\x04\xec\x0e\x0a\x06\x14\x50\x57\xe5\x55\xa0\x17\x19\xb3\x3e\xd9\xff\xbc\xfe\x70\x71\xf4\x93\xf6\xf1\x01\x40\xba\x31\x6d\x11\xc3\xd4\x4c\x99\x8c\x18\x07\x44\x04\x77\x66\xae\x01\x55\x79\xcc\x95\x1c\x08\xe3\x88\x3b\x51\x37\xf3\x8f\xaf\xff\x89\x3c\x26\xe4\x01\x13\x16\x56\x88\xd9\xf7\x9b\x4c\x25\x33\x23\x13\xcf\x83\xb4\x23\x18\x52\xae\x53\x1a\xf4\x03\x0c\xd6\xf2\x3b\x42\xc0\x41\x57\x77\x26\xef\xc4\x1b\x76\x0b\xc0\x98\xd1\xb7\xff\xb7\x13\x6e\xff\xeb\x76\x0f\x38\x6d\x21\xd8\x2d\x94\x83\xbd\xdd\xab\x25\xa2\x23\x74\x71\x64\x9c\xa3\x8f\x63\xf0\x66\x21\x87\x43\x48\x95\x81\x9c\x81\x7b\xa1\xec\xa1\x3b\x5e\x72\xc0\x94\x8e\x1a\x87\x8a\xe0\xe1\x42\x4e\x0d\xe6\x1f\x5f\xff\xd3\x8d\xa4\x3e\x3b\x26\x55\x2a\x1e\xd9\xd7\x78\xa1\x1d\x7b\xd5\xe9\x21\x71\x56\x33\x51\x96\x3f\x42\x2c\xcd\x48\x1b\xa1\x30\xb3\xdd\x6a\x0c\x1c\x04\x94\xa7\x07\x91\x65\x5d\x5f\xde\xfa\x01\x4d\xc7\x7e\x41\x31\x08\x30\xe7\x85\x9d\x43\x4a\x5b\x9f\xcb\xb6\xb9\x1b\x6d\x6a\xe8\xbe\x98\xcc\x88\x3f\x6c\x61\xe0\xc6\x1c\x9a\x15\x11\xe7\x4d\x84\x2a\x90\x3c\xfd\x6c\x56\x42\xee\x8e\x26\xe3\xdd\x39\xed\x28\xaf\x8f\xc8\x60\x8d\xd7\x30\xcd\x57\x42\xc0\x0c\x44\xc5\x46\xd4\x65\xcc\x53\x24\x3f\x5c\x3d\x3d\x1e\xab\x5b\x32\x70\xe2\x24\x93\x2e\x45\x3a\x00\x3c\x6b\xa2\x15\x7a\x9a\x92\x39\x9e\xa5\x45\x6b\xe4\xc4\xdd\x25\x21\x16\x55\x40\xcc\xd3\x1e\xd9\x52\xb6\xbe\x75\x9b\x1a\xd1\x2e\x83\x73\x8e\x2c\x93\xf3\x05\x87\x66\x53\x76\x70\xf9\xe9\xd0\x27\x95\x61\x05\xeb\x90\x39\x06\xf1\x08\x24\x72\xf6\x27\xe0\x7e\xab\xe2\x3f\x74\x01\xf1\x55\xe0\x96\xe3\x99\x1e\x6a\x42\x26\xdb\xb6\x9b\x71\x97\x75\xf9\x92\xb3\x2e\x77\x59\x8b\x5f\x4a\xd6\xe2\x9f\x1a\xf2\xbd\x49\x15\x57\x83\x7f\xe7\xc1\xb4\x53\x11\x0a\x56\x51\xb2\x50\x53\xfe\xa1\x16\x77\x09\x16\xc8\x1e\xbb\x5c\x46\x64\xb7\x17\xb0\x31\x83\xb8\xce\x5e\xca\xcd\xd0\xe3\xa7\x16\xb3\xb5\xff\xbf\x11\xc5\xe2\x63\x3c\x22\x65\xf6\x88\x42\xf7\x7c\xb4\xf8\xd4\x2a\xaf\x0d\x35\xff\x14\x6b\xba\x8c\xaf\x87\xdf\x9f\x2a\x55\x76\x4a\x30\xa8\xb5\xda\x34\x65\xb6\xd9\xfb\x49\xc6\xe5\xa2\x54\xa2\x99\xed\x91\x35\x94\x46\x14\xfb\x81\x42\x53\x40\x5f\xca\x12\x68\x81\x1a\x7c\x73\xa7\x77\x82\xc1\x4e\x30\xd8\x09\x06\x3b\xc1\xe0\x59\x05\x03\x20\x59\xab\x17\x87\x21\x1b\x20\x4b\x46\xbc\xe0\x89\x15\x85\x34\x56\x26\x14\x97\x49\xe2\x01\x1d\x42\x12\x03\x20\xab\x87\x97\x76\xf4\x54\x22\x00\xfe\x02\x04\xf6\x79\xc4\x00\x5c\xba\x27\x90\x05\xe6\x88\x5b\x30\xb5\x27\xe7\xfa\x73\x96\xf1\xc5\x71\x7e\xe4\xcd\x4f\xcf\xfe\xdb\x60\xd1\x2f\x7e\x91\x8c\xc6\xd9\xdc\x32\xe7\xf9\x7d\xd2\x0e\x95\xfe\xb2\xd0\x7d\xf1\x59\x11\xe9\x73\x37\x82\xd4\xdb\xcd\xff\xb8\x18\xf4\xe4\x76\x7c\x42\x20\xfa\xee\x8b\x03\xa2\xff\x48\xf9\x2d\xe8\x0a\x42\x61\xae\x0f\x78\x04\x23\x5d\xd8\x4e\x88\x05\x28\x55\x2a\x0a\x03\xdc\xcf\x0d\x9f\x64\x19\x70\x8e\x0c\xe5\xbd\xf0\x91\x9b\x01\xcd\x7e\x11\x92\x3d\x3b\x1f\x10\xe4\x0b\x00\xc2\xdd\xee\x5d\x09\x23\x7f\x77\x1a\x54\x61\x45\x7a\xbb\xe7\x8b\xbf\x70\xe5\xe1\x66\x52\x51\x64\x13\x28\x61\x31\x45\x00\xa5\x61\x7d\x81\x05\x61\x5c\x27\xeb\x84\x66\xce\x66\x01\xeb\xa2\xda\xbf\x50\x84\xfa\x99\xe4\x68\x09\xb4\xdc\xdc\x77\xea\xb5\xeb\xe7\x68\x3c\x56\xb4\x42\xe3\xd9\xe9\x2f\x2f\x1b\x4e\xae\x82\x48\x98\x23\x7d\xac\x9e\x85\xb2\xba\xcc\xb1\xd5\x00\xe7\xd9\x52\x43\xd4\xd9\x0e\xd6\xee\x4f\xab\x07\xee\x60\xed\xf0\xf7\x67\x95\xd8\xb7\x8f\x73\x37\x5f\xa3\x5d\x91\xdb\xcd\x00\x3b\x71\xfb\xa8\x55\xad\xf6\xfd\x20\xb8\x15\x53\x71\x2f\x13\x40\xd2\x4f\x19\xcf\x32\xfd\xe0\x6e\x3c\xc1\x18\x3b\xb9\xc8\x67\x3f\x77\x43\x9c\x64\xd5\x4f\x9b\x7a\x20\x89\x30\xe6\x3d\x00\x7b\x2e\xa1\xda\x55\xcb\x2a\x6c\x2a\x56\xd2\x29\x94\x67\x4c\x35\x05\x7d\xb6\x85\x67\x88\x23\x7e\xbf\xd5\x34\x4a\xfc\x5c\x17\x3e\xd7\x7d\xfd\x2c\x49\x1b\x11\xa1\x70\xd7\x73\x43\x50\x99\x9b\x49\x2e\xd2\x77\x3a\xe1\x59\x33\x7e\x6d\x11\xa5\x88\x62\x63\x13\xae\x80\xcc\x1a\x4c\xde\xc1\xfd\x9f\x50\x75\x94\x37\xec\xbf\xb1\x63\xc5\xc4\xa3\x34\xc0\x09\xc8\xa7\xa0\x78\x6e\x46\xda\x7a\x0e\x70\x60\xe8\x87\x1e\xad\xb4\x27\x2d\xf5\xe6\x87\x8d\xce\x2e\x3f\x9d\xb0\x83\x99\xa7\xbb\xd9\x32\x29\x8d\xd5\xe3\x98\xfd\x70\x1b\x43\x54\x41\xd6\x3b\x25\x47\x41\x0d\xb9\xe3\x2c\x1f\xf1\x43\x84\x5c\x4b\xb1\x6c\x65\x69\xc4\x74\x3f\x8e\x72\x35\x7a\x6b\x76\x86\x28\x17\xc7\x6a\x82\xe3\x3b\x0d\x5b\xb6\x10\x51\x27\x40\xae\x55\x6e\x7c\x00\xcd\x87\x44\x79\x12\xd5\x28\xee\x22\x83\x72\x03\x8a\x99\x32\x77\x8a\x47\x23\x72\x12\x46\x63\xa8\x24\x84\xb4\x08\x96\x83\xe8\x45\x8c\x03\x08\x05\x5d\x90\x3e\x37\x50\x5e\x24\xc4\x89\x45\xc0\x5f\xb3\xfb\x9b\xa3\x37\x56\x72\xdb\xba\x67\xf2\x8a\x7a\x88\x50\xa3\x16\x5b\x9d\xae\x42\xae\x74\xc3\xf0\x34\x96\x4a\x8e\xcb\x71\x94\x4c\xfd\xf4\x24\xa1\x9a\xff\x6c\xad\x6c\x3a\x9a\xb8\xd5\xea\x2c\x62\xee\xbc\x2f\xb2\x56\x65\x20\x8f\x23\xfc\xd2\x09\xa2\x97\x86\x54\x3c\x08\xf8\x33\x00\x24\xe3\x28\x7a\x5f\x42\x11\xa2\x39\x9b\x4c\xf3\x3f\xc9\xb8\x31\x17\xab\xc5\x9a\x5d\x47\xaf\x86\x72\xa6\x95\x67\x15\xec\x7e\x5b\xcc\x73\x77\x9f\x69\x52\xe6\xf6\x89\x8d\x8e\xd3\x2c\x99\x5b\xd5\x30\xe8\x6f\x0f\x10\x5c\x49\x75\xdf\x2a\x85\x7e\xce\x64\x3f\x81\xc4\xac\x07\xec\xad\xcc\x04\x55\xa8\x94\x06\x28\x8a\xbb\x71\x00\xc1\xe1\x84\x59\xa9\x92\xac\x4c\xb1\x18\x08\xfa\xd6\x20\x06\x73\xdd\xa9\xb5\xd8\xb6\x4f\xa1\xa1\x4f\x62\xa5\x53\x51\xaf\x67\xe6\x1e\x4c\x85\x26\xf5\x79\x72\x87\xc2\xbf\x34\x34\xd3\xcf\x14\x50\x15\xdb\xae\x57\x15\x93\x02\x26\xcd\x3c\x04\x9a\x79\xa6\xeb\x67\x11\x7a\x78\x62\x4b\x9e\xcd\x95\x79\xaa\x2d\x10\xc0\x2c\x47\x7c\xab\x3a\xed\xe7\x95\x7d\xfe\x38\x38\x1f\x57\x75\x9e\x44\x9b\x56\xc3\xf7\x68\x98\x03\x29\x1a\xe2\x29\xb1\x39\xe8\x28\x57\x86\xfb\xf9\x86\x10\x90\x45\x56\x32\x56\xba\xf9\xa0\x20\x51\xf5\xef\x21\x5f\xa9\x4c\xc9\x7e\xcd\x38\xba\xbf\xed\x92\xce\x8b\xbd\x1b\x2d\xcf\x5d\xed\xd1\x73\xa2\x77\xb4\xc1\x17\x40\x6c\x81\x39\x8e\xb6\x80\x27\x30\x73\x21\x3e\x2b\x21\xbe\x11\xe3\x3c\xe3\x76\x95\x30\xd7\xda\x7b\x58\x51\x0b\x95\x8d\xbc\xd0\x69\x99\x4c\x33\x1f\xb4\xd4\x52\x48\x2f\xe3\x26\xce\x13\x38\xcb\x47\x62\x2c\x0a\x9e\x91\x72\xd1\xb6\x66\xe5\xe7\x73\xce\xbf\x8f\x50\x10\x11\xab\x96\xc0\xbf\x95\x46\x1b\x30\xa9\x20\xfe\x86\x25\x3a\x97\x20\x25\x78\xd6\xfc\xe9\x04\x85\x08\x10\xfb\xa1\x86\xa1\xed\xb1\x0b\xcd\xc0\xfb\x43\xe0\xaf\x88\xc2\xe0\x34\x7b\x81\x05\xdf\x7d\x6f\x68\x01\xae\x90\x97\x7d\xd5\xb4\xb9\xbe\xb0\xcf\xe0\xb2\xbf\xa9\x54\x94\xa4\xaa\x7a\x36\x4b\x2c\xc1\xf3\x0f\xd8\x18\x94\x34\x44\xaa\x0e\x24\xa2\xe0\xc2\x95\x0a\x0b\x12\x35\x96\x10\x9d\x42\xc2\x56\xe0\xaf\x64\x96\x74\xd2\x01\x1d\x4e\xec\xd9\x38\x81\xc9\x2f\x2b\x56\xe3\x9c\x73\x44\x71\xd1\x8d\xa6\xac\xa4\x91\x58\x52\xe1\x68\xb6\x0d\x0c\x56\xfc\x49\x1c\x29\xf1\x1d\x59\xf5\xc2\xc6\xef\x56\xf2\x22\xb9\xbe\x30\x62\xcc\x2d\xab\xcf\xf5\x73\x6b\x16\x32\x2c\x28\x47\x88\xd8\xcb\x40\xaa\x94\xc4\x4f\x5d\xaa\x94\x5d\x7e\x42\xff\x84\x2e\x91\xee\xf1\xc0\x88\x42\x64\xa1\x86\xaa\x06\xcb\xc7\x25\x4d\x87\x09\x03\x86\x6a\x9e\x65\x93\x0e\xe3\xec\xa1\xe0\x79\x2e\x0a\xc6\x0b\xf8\x18\x39\x49\x9b\xe2\x3c\x15\x79\xa8\xe2\x42\x8d\x1e\x0b\xad\x04\x13\x99\x11\xec\xa0\x0a\x5d\x3c\x6c\x03\x0f\xec\xc6\xd5\x42\x1e\x3f\xf1\xed\xbc\x44\xea\x73\xbb\xe6\x9d\xaf\x99\x8b\x8b\xb5\xb7\x10\x7a\x16\x2a\xdc\xe2\x19\xf6\x21\x98\xcf\xeb\xf4\x68\xe9\xf1\x4d\x3f\xa8\x6c\x59\x75\x82\x5f\xa1\x22\x9e\x46\x03\x8f\x80\xd8\x11\xf7\x96\x93\x38\xa8\x72\x2b\xd9\x9f\xde\xc3\xc1\x09\x88\x73\x6c\xc0\x33\x33\x4f\xda\x6a\x01\x88\x39\xfb\x52\x56\x7b\xba\xed\x9b\xb9\xa2\x77\x73\xb9\x63\x73\xe7\xd3\xfc\x42\x7c\x9a\xef\xe6\x79\x34\xb7\xa9\xf7\x3d\xad\xa4\xbe\xf3\x57\xee\xfc\x95\x3b\x7f\xe5\xb3\xfb\x2b\x9f\xde\x55\xb9\xa2\x97\x12\x1c\x94\x24\xe5\xb4\x49\xd0\x79\x7a\x83\x1b\xcf\x32\x06\x15\x53\x23\x0b\x1b\x39\xbf\x08\xc1\xed\xa9\x8c\x6b\xcf\x6d\x5a\xe3\x0f\xe6\x2c\xe3\xc6\xca\xe4\xc7\x4c\x27\x77\xd7\x56\x4f\x03\xaa\xb5\x87\xdd\xfb\xf5\x7a\xaa\xb3\x9a\x5a\xb1\xd0\x5f\x31\xe3\xe5\xd8\xe6\xc1\x15\x3b\xfe\xf5\x9a\x9d\x4a\x73\xd7\xf4\xee\x99\x1a\xa6\x20\xf7\xe5\x22\xf6\x0d\xc0\xf6\x84\x00\x40\x27\x14\x80\xb5\x4a\x3c\xe6\xda\x54\x00\x84\xa0\x41\xac\xb9\x9d\x61\x0f\x1f\x8c\xc0\xd1\xf7\xdd\xe8\x0d\xac\xe3\xec\x15\xff\xbd\x2c\x84\x9b\xc5\xfa\xcb\xec\x7b\x68\xbf\xb6\xfe\x8d\xe6\x82\xba\xdf\xd9\x29\xb7\x1c\xd7\x15\x0e\xb7\x77\x0c\xc2\xda\xb9\x35\xeb\x4b\xaf\x81\xc5\x2b\xb6\x60\x76\x6f\xe5\x34\xac\xf5\x6a\xb3\x73\x3d\x4c\x91\x89\x96\xf3\x74\xef\xce\x9c\x27\x3c\x70\x6c\x5c\x26\x62\x0b\x53\xfd\xe3\x58\xa5\x8f\x67\x95\x6f\x9f\x22\xab\x90\xd6\xe5\x0d\xd5\x90\xd4\xe5\x91\xb9\x5f\x06\x16\xb5\xc8\x47\x83\xf5\x1d\xcd\x27\x22\x1f\xbd\xbd\x5e\xe3\x4c\xe1\x8b\xb5\x03\xc5\xdc\x6f\xec\xed\xf5\x8c\x43\x04\x04\xc9\x8c\x78\x01\xe9\xa6\xb9\x4e\xf7\x0d\x60\xbf\x5a\x39\x9e\x07\xdf\x2c\x55\x2a\x56\x76\x11\x57\xf3\x82\xd7\xd7\x99\x17\xbc\x58\x9f\x17\x8e\xc5\x73\xbc\x40\x54\x83\x05\x06\xa3\x06\x42\x35\x9e\x98\xba\xce\x3c\x24\x84\x94\x13\xaa\xee\x8c\x27\xe6\xdf\x59\x17\xbf\xd2\xcd\xd3\xa3\xab\xb3\xe3\xd3\xf7\x67\xbd\xf1\x9c\x9a\x41\xa0\x57\x5f\xc1\x42\xac\xb7\x38\xab\xc4\xb9\x9c\xd0\xc7\x00\x1a\xce\xdb\x90\x59\x5f\x76\x53\x59\x88\x04\x2f\x74\xf0\x89\xf6\x85\x7d\x10\x42\x4d\xab\xd7\x6e\xa9\xe6\x18\x22\xcf\x1e\x73\xb4\xae\x5a\xed\xab\xf7\x29\x99\xa1\xb9\x16\x8c\x5d\x3d\xf2\xc1\x4c\xbb\x62\x31\xbf\x48\x3a\x95\xf9\x1e\x1d\xb3\xd5\x08\xd0\x40\x76\xf9\xe9\x64\x9b\xd7\x94\xe6\x39\x67\x5b\x8c\x5c\xff\xb8\x5e\x9f\xaf\x73\x56\xaf\xcf\xe3\x83\xea\x23\xd5\x3c\xf7\x1f\x71\x95\x66\x21\x2d\x3b\x04\xcd\xb8\xb7\xd2\x42\xde\x8b\x82\x1d\xfc\x28\x2c\xf7\x51\x38\x87\x73\x08\xfa\x60\x7d\x5b\xf6\xdb\x93\xd6\x73\x79\x7b\x52\xbf\x73\x6f\x65\xbf\x10\xec\x64\xc4\x95\x12\xd9\x13\x48\x36\x73\xe6\x9a\x89\xc7\x29\x0c\x92\x15\xe7\x9c\x89\xc7\x35\xf6\xf2\x6d\xf8\x72\x7d\x1d\x86\x42\x89\x42\x26\x55\x96\x5d\x63\x21\x22\x90\x93\xa3\xb0\x28\x68\xd3\x84\x4d\x17\x09\xc5\x35\xe5\x59\x39\x94\xf3\x3c\x16\x83\x0c\xe0\x6b\x37\x98\x34\xbc\xbf\xc2\x6c\xa1\x7d\x63\xcb\xe9\xc7\x26\x9d\x5d\xb6\xc5\xd3\xbb\x0b\x56\x70\x69\x0d\x56\xe9\x22\x53\x7a\x2a\x72\xa1\x7c\xad\x2e\x11\xbe\x46\x31\x64\xcc\x90\x04\x44\x6e\x5c\x44\xb7\x9f\xbd\x5a\xc3\x24\x92\xc2\x36\x92\x59\x7f\x3a\x39\xab\xf7\xd4\x7a\x05\xa7\xde\xac\xaf\xe5\x4f\x27\x67\x4f\xa6\x13\xcc\x81\x7c\xd8\x58\x59\x18\x26\xa2\xa2\xb9\xa9\x5b\xd6\xd9\xab\x8f\xd0\x13\x1b\x08\x3d\x3f\xf9\x1e\xd6\xb8\xa7\xe1\xdd\xc6\x7a\x87\x9f\x1b\xde\x91\xfa\x72\x07\x89\x7a\xd3\x75\x6d\x8a\x10\xb4\x86\x47\x61\x71\x96\x09\x11\x6e\x24\xb3\xa0\x08\x5b\x2f\xe2\xcf\xd4\x41\xeb\x95\xf3\x2f\xd4\x17\x0e\xc5\x08\x5d\x4c\x62\x79\x71\x7a\x2d\x18\x18\xa7\x9c\xde\xc0\xa0\x6c\x2b\x82\x8f\xc0\xbd\x46\x6f\xf8\xa0\xcc\xb0\x9e\x0e\x54\xdb\x85\x72\x5f\xfe\x1d\x88\x49\x85\x13\x2d\x30\x18\x56\xab\x6c\xf2\x7f\xb2\x0f\xaa\x0b\xdb\xe1\xd9\x66\x28\x12\x95\x13\x8a\xae\x54\x8c\xab\x09\xc0\xee\xb9\xb7\x7f\x3d\x7f\xf7\x8e\x5d\x7c\xb8\x61\xbf\x7e\xb8\xfa\x05\x5d\x9a\xe3\x32\xb3\x12\xbf\x15\x00\x51\x36\xbc\x04\x6e\x48\x79\x04\xc6\xd9\x30\x81\x9b\x4d\xa4\x8c\xf3\xeb\xf5\xe4\x0c\x78\xaf\xa1\x3b\xe2\x6f\xcf\x4d\x62\xe6\xe4\x9e\xea\x84\x67\x6b\xaf\x0a\x84\x7e\xb7\x5e\x0b\x68\x1d\xaf\x05\x1e\xe0\x6c\xd2\x0d\xb3\xf6\x07\x0a\xf0\x1f\xb1\x6a\xe1\x00\x46\x30\xaf\xa8\xad\xd3\x21\x3e\xe4\x6d\x82\x96\xaa\x94\x2d\xd2\xb1\xf0\xad\x0e\x03\x08\xea\x7f\xdc\xee\x15\xfa\x76\xaf\xc3\x6e\xf7\x8c\x1e\xd8\xdb\xbd\x7f\x62\xad\x50\x0a\x58\x10\x29\xeb\xd2\x7b\x58\x30\x54\x8e\xf3\x6c\xc2\x06\x5c\x66\x4c\x62\x8d\x7f\x28\x3d\x07\xcd\xb7\x28\x36\x1f\x7d\x05\x1f\xed\xd2\x60\x9f\xdb\x96\xa7\x36\xe0\x14\x17\x6f\xaf\x5b\x9f\x8c\x8b\x86\x3a\xac\xd8\xc5\x2c\x5d\xf8\xe9\xf8\xa7\x9b\xe8\xec\x15\xd0\xa9\x38\xf6\x47\x70\xdd\xa5\x20\xf5\x2b\xee\x6a\xe1\x6a\x44\x0d\x83\x07\x34\xd1\xca\xd8\x02\xea\x5c\x22\xb1\xc8\xe4\x58\x5a\x0c\x16\x56\x14\xbb\x59\x05\x3d\x90\x69\x19\xed\xc0\x14\x6c\x52\x07\x25\x57\x83\xac\xac\x42\x2a\xaa\x52\x6a\xe0\x01\xd4\x29\x7d\x24\xd4\xe1\xf5\x76\xf2\x99\x8b\x94\x37\xe8\xe2\x15\x3a\xeb\x2f\x75\x26\x93\xa5\x7e\x77\xf7\x99\x11\xcf\x73\xa1\xcc\x1c\xb8\x1f\x54\x68\x09\x32\x9e\x02\x67\x9c\x84\x5a\x45\x40\x43\x7d\x7e\x0c\x66\xe2\x85\x60\x57\x02\xc2\x9d\x0e\x52\xef\xa2\xd7\x05\xc3\x5a\x96\xd9\x24\xc4\xdf\x34\x89\xb9\x39\xec\xb0\x53\x47\x6d\x45\xfd\x45\x2a\x37\x05\xef\xc6\xb0\x88\xb3\xde\x77\x84\xf9\x8a\xaa\xf2\x1c\x54\x95\x71\x0e\x7b\xe1\x57\x9f\xa9\x51\xb1\x4a\x0a\xe7\xa6\xa9\xa2\xaa\x11\x07\x4c\xc2\xf2\x37\x3f\xb6\xdd\x94\x03\x58\x48\x47\x2b\x56\x76\xde\xe5\x23\x6d\xb5\xda\x92\x44\x7f\x39\xa3\xb3\xd6\x24\x64\xd6\xcb\x75\x71\x09\x5b\x9c\x54\x79\x2f\xd1\x41\x73\x22\xf3\x6a\xd6\xa9\x39\xeb\xa1\x0b\xfb\xa0\x8b\x4d\x15\xe1\xcb\x5a\x37\x6d\x66\x5f\x7b\xa1\x3e\x6f\x3f\xa6\xb5\x8c\x70\xb3\xa7\xf9\xef\x52\xf7\x27\x76\xfd\xf9\xfd\x27\xbe\xdf\x7a\x7a\xd4\xbe\x3e\x2f\xff\xe3\x36\x4c\xa6\x45\x7f\xca\xf5\xdf\x3e\xe1\xe8\xc7\xd3\x35\x04\xc3\xab\x1f\x4f\xeb\xd3\xb9\xe2\xa9\x36\x0c\x3c\x55\xec\x54\xcc\xf1\x28\x2c\x9a\xd9\x4a\xca\x4e\xd1\x5f\x6a\x2b\x35\x09\xcf\xc4\xf9\x87\xb5\xd7\xe5\x1a\xdf\x5f\x63\x6d\xe8\xcd\xfa\xfa\xf8\x1f\xa7\xd9\xc3\xbc\x03\xfd\x4b\xa0\x87\xc8\x21\xb7\x9b\x8d\x54\xcb\x44\xaa\x23\x2b\x4f\x0f\xb1\x2f\x32\xad\x86\xa6\xc7\xce\xc6\xb9\x9d\x50\xd8\x88\x07\xf3\xe0\xb6\xc6\xbb\x53\x2d\x50\x9d\xc2\x97\x10\x6b\x65\x52\xfb\xde\x5a\x78\x1e\xf0\xba\x5e\x5f\xa0\xa3\x01\x7c\x58\xc7\xe5\x11\xde\x6d\xec\x69\xf8\x79\x81\xea\xef\x0e\xff\x02\x45\xc8\x6f\x78\x08\xb7\xcd\x75\xba\xca\x4d\x08\x0b\xb3\xec\x3e\x6c\x92\xd3\x25\x23\xb4\x2f\x50\x14\xac\x50\x69\x30\xdc\x43\x44\x3a\xa8\x3c\x9c\xea\xaf\x43\x80\x70\x95\xd0\xa5\x21\x89\xb4\x10\x63\x27\xd6\x48\xc5\x0a\xfe\xc0\xc0\x2b\x8c\xd0\x48\xeb\x65\x81\xad\x9b\xff\x65\xf2\x91\xf0\x5e\xf8\xf5\x45\x62\xea\x45\x16\xb6\xe4\xd9\x4a\x9c\xfe\x53\x3c\x80\xfa\x79\xba\xbf\x86\x47\x9b\x72\xba\xff\xa3\x31\xeb\x4d\x63\x2e\x57\x4e\x1f\x5b\x23\x73\xac\x55\x12\x42\x1b\x4c\xa6\x63\x36\x5a\x11\x95\xe9\x61\x54\x13\x61\xe1\x7c\xfb\x32\x1a\xee\x74\xae\x23\x56\xb6\x4d\x61\xa1\x41\x4d\x5f\xb1\x50\x2a\xba\x43\x71\xdf\x58\x3f\xc3\x49\xba\x1d\x77\x9f\x82\x3a\x01\x26\xb2\xad\x67\x8e\xe2\x0c\xd6\x09\x56\x5e\x0e\x4f\x75\x85\x88\x52\x10\x87\xd8\x2f\xa4\x18\x54\xa1\x7e\x35\x0c\xaa\x0a\xa1\xc1\xf1\x8f\x01\x97\x59\x59\x20\xcd\x84\x82\xec\x5c\x79\xcd\x08\x89\x69\xce\x0b\xf2\x7d\xa4\xcc\xca\x74\xe2\x84\xe2\x3c\x83\xd8\x44\xcc\xc6\x7a\x77\xfe\x6c\xb9\x3f\xcb\x34\x81\xf9\x57\xe9\x6a\x5a\xe4\x67\x0b\x64\xfe\x10\x02\xb1\xfc\xfa\x0c\xcc\xcd\x0c\x64\xab\xa6\x77\xa6\xa2\xbf\x10\xf3\x6f\x35\x12\x9e\x1e\x7b\x4f\x9a\x1f\x8f\x09\x3b\xb4\x99\xd2\x05\x81\x2c\x85\x5a\x55\x01\xc5\xf8\xec\xb1\xc7\x6e\xf7\xc4\xa3\xfd\x16\x0d\x55\x8f\x03\x83\xff\x50\xd6\xfd\xab\xc7\xce\x1d\xb9\x4f\xa4\xcd\x28\x9e\xb4\x08\x1c\xc6\xbf\xe6\x6e\x49\xa9\x42\x42\xfe\x3a\x57\x33\x5d\x5a\x56\xed\xfc\x94\xf8\x38\x95\x4a\x13\x66\xf9\x46\x6c\xb7\x2e\x13\x0c\x92\xfe\x5c\x3f\x72\x5e\xa7\x8b\x48\xb6\xa6\x48\xe0\xc4\xcd\x27\xf1\x71\x30\x55\x4d\x1b\x5c\x83\x84\x2b\x56\x94\x0a\x0b\xf2\xa0\x0d\xeb\x06\x63\xd6\x8d\xcf\x21\x09\x16\x89\xfe\x84\xa2\x7c\x31\x58\x86\x6c\x32\xc0\xb2\xac\xc6\x7a\x71\xbb\x30\xfb\x17\x1d\x66\xbf\x0b\x21\xff\x52\x42\xc8\xff\xdc\xd0\xc7\x3a\x6d\x05\x74\x5c\x0b\xab\x8e\x71\x94\xfa\x62\xc4\xef\xa5\x2e\x42\x64\xe0\x9c\x78\xd8\x6d\xae\x87\x9b\x31\x54\x11\xaa\x63\x43\x6e\x17\xd8\x58\xa7\x2d\x60\x8c\xdf\x3b\xf6\x3d\x5d\xb0\xbd\x12\xdf\xc3\x92\x60\x70\x05\xb7\x1c\x2e\x70\xb8\x80\x8e\x46\xa6\xa0\xd7\xad\x59\xd1\xe0\x79\xd6\x75\x99\x94\xf7\xf4\x79\x08\x3a\xdd\x72\xda\x81\x4e\x67\x38\x7b\x66\xb1\x7e\xef\x96\x44\x52\x0e\xe3\x84\x7a\xe4\x8e\x9d\x21\x80\xb7\x6f\x10\xb9\x56\x8a\x32\x13\x6d\x58\x78\xa8\x23\x7b\x0a\x59\xd3\xd7\xa1\x87\xf3\xa1\xd2\xe1\xe7\xb3\x47\x91\x94\x76\x39\x9f\xbf\xa9\xfc\x3b\x50\x59\x2f\xcb\xa8\x50\x2d\x20\x6e\xd1\x03\xf2\xf9\xe8\xe0\x4b\xe2\x96\x19\x6e\xa5\xa1\x42\x91\x61\x3a\xe2\xd1\x71\x1f\x03\xbe\x96\x0a\xd8\x09\x4e\xa7\x77\x2e\x75\x58\xbf\xb4\x4c\x5a\x38\xd4\xc9\x48\x6b\x23\xa8\x38\x14\xa5\xdb\x4a\x0d\xdc\x1f\xdc\xa6\x50\x8f\xb2\x08\xf8\x3e\x51\xf7\x98\x0e\x5d\xbd\xe6\x94\x16\x77\xb3\xc2\xea\x78\xfd\xd8\x75\x03\xd6\x13\xf7\xc7\x10\x84\x29\xe3\xd8\xdc\xd8\x75\xfa\x20\xe4\x70\x64\x4d\x87\xc9\x9e\xe8\x81\xbe\x23\x78\x32\x8a\xba\x1d\x0b\x61\x31\x3f\x23\xaa\x7a\xea\x37\x2c\xc2\x90\x62\x07\x81\x1b\x13\xe7\xec\x04\x4c\x9e\xe6\x3e\xcd\x5c\xae\x0e\x13\x36\xe9\x1d\x76\x58\xa2\xc7\x79\x09\x08\x5a\x6e\x8c\xfd\x09\x93\xd6\x8b\xfa\xbe\x56\x3a\x2c\x85\x07\x18\xf3\x02\x18\x95\x9b\x54\x29\xe3\x29\xc4\x8c\xde\xee\xe1\xec\x6e\xf7\xbc\x54\xe5\x3a\xa4\x1a\x92\x30\xc3\x11\x37\xb8\xb3\x68\x9d\x1c\x73\x9b\x8c\x02\x62\x5f\x51\x08\x93\x6b\x0c\x3f\xcd\xab\x93\x7f\x23\x8a\xf1\xdf\x42\x17\x07\xe6\xb0\x5a\xdc\x91\x1c\x8e\xfc\xda\xf2\x02\x33\x65\xeb\x7b\xb2\x65\x28\x8e\x5f\x61\x7e\x22\xbd\xac\x0f\x6f\x23\xa7\xf6\xbc\x4d\x5b\xeb\x72\x11\xd0\x5a\xd8\xef\xda\x89\x99\x73\x3f\x60\xe9\x1c\xb1\x1f\x0b\xcb\xdc\x3d\xab\xce\x8d\x95\x63\xd1\x09\x56\x4c\xb8\xab\xc4\x15\x1a\xda\x80\x0d\x35\xaa\xd7\x1a\x41\x02\xd5\xb7\x51\x37\xf4\xa3\xd0\x63\xf7\x55\x27\x2c\x12\x58\x83\x1b\x82\xf0\xeb\xe0\x6b\xf5\x97\x82\xbc\xb4\x3a\x25\x38\x30\x14\x18\x0f\x3b\x11\x7f\x82\x9b\x0f\xa6\x05\xe4\x6a\xb6\x80\xe2\x9c\x50\x23\x14\xbd\xb0\xe2\x5e\x26\xb6\x8a\x39\xf4\x2e\x5d\x9c\xd2\xaf\x04\x00\x53\x08\x58\x2a\x08\x15\xca\xb3\xea\x46\xe0\xa7\x32\x69\xf0\x72\x28\x4a\xb5\x8a\xcf\xb3\xfb\x9a\xbb\xe7\x8d\x73\x0d\xfd\x01\x91\x36\x10\x39\x4d\x64\xc1\xdd\x7e\xac\x64\x1c\xfc\xb3\x40\xfb\xa6\x55\xe4\x8d\x33\x56\x37\x3d\xc8\x1b\x9b\x56\x1a\x03\x98\xcf\xe6\x4e\xab\x1a\x57\xc2\x86\xb0\x80\x03\xe5\x74\x02\x77\x98\x1c\x59\x07\x82\xe2\x55\x96\x2c\x46\x92\x63\x85\xc8\x30\xb8\x9c\x4e\xeb\x50\xde\x0b\x55\xe1\x08\x1c\x98\xc3\xc3\xc8\xf7\xe1\x4e\x41\x85\xb4\x9e\xe8\x6e\xa6\xc1\x75\xce\x0e\xfc\xc1\x86\xda\xb2\xee\x30\xd5\x1e\x2a\x2b\xbb\x55\x0b\x47\xa8\x3a\x0c\x0b\xda\x46\xcd\x20\x82\x15\x0b\xc1\x72\xe3\xe3\x53\x51\x25\x07\x2a\xf9\x00\x73\xb9\xf7\x36\xf4\x30\x17\x24\x7c\x77\x62\xc2\x6e\xcb\x57\xaf\xbe\x49\xac\xce\x75\xa6\x87\x93\x5f\xc4\x04\x7e\x10\x11\x41\xe5\x04\x11\x33\xc1\x2e\xb5\x22\x92\x8b\x37\xc5\xb3\x96\x68\x21\x65\x18\x49\x9b\x92\x06\x31\x46\xdf\x0b\xc1\xfe\x0b\xe7\x22\x28\xcc\x9d\x60\xf8\x4d\x1c\x79\x71\xd3\x9c\xe3\x73\xab\xaa\xa1\x2e\xa1\xaf\x55\xc3\x40\xcb\x3c\x33\x8b\x1e\x4d\x9f\x3e\x9e\xe7\x99\x44\x60\xc2\x03\xbf\x49\x7c\xc8\xa5\x32\xf6\xf0\x6f\x4c\x95\x8e\xdd\x17\x4c\x80\x37\x8e\x12\x80\xb9\x32\xec\x76\xcf\x9f\xc6\x7d\x53\x7d\xe0\x76\xef\xb9\x03\xaf\xa2\x93\xb6\x54\xba\xdb\xea\xed\xf1\x24\xd9\x2c\xba\xda\x53\x15\xd6\xab\xad\x78\x92\xdb\x17\xad\x46\x9b\x1b\xa7\x26\xd5\x7d\xcb\x30\x41\xa6\x71\xe3\xbc\x1f\x36\xee\x98\x62\x58\x09\xc5\x68\xcb\x85\xe2\xe3\xfd\xdc\x82\x5d\xf2\x58\x59\xd9\x56\x51\x51\x56\xb6\xd0\x56\x6a\xad\xbe\x10\x95\x25\x3e\xdd\x3b\xbd\xa5\x9d\xde\x32\x6f\xcd\x76\xca\x4b\xf8\xf9\xcb\x53\x5e\x6a\x9b\xfe\xf9\x34\x98\xd5\x87\xb1\x53\x63\xfe\xc4\x6a\x4c\xab\x7a\x63\x51\xb3\x0a\x8c\xc3\x87\x2f\x78\xc0\x37\x1f\x60\x91\xc4\x78\xa6\x5e\x10\x6c\xc1\xfc\x76\x15\xc7\x76\x15\xc7\xb6\x53\x71\x4c\x2b\xd1\x7d\xd0\x45\xda\x89\x42\x3a\xa2\x02\x62\xb5\xf5\x9a\x51\x44\x6c\x5b\x65\xbe\x66\xd7\x65\xf4\x80\x3a\x35\x3f\x46\x75\xd4\xd8\x09\x26\x1d\xdc\x14\x6e\x26\x6f\x79\x66\x44\x87\x7d\x54\x77\x4a\x3f\xac\x9e\xa0\xf1\xa0\x8b\xbb\x4c\xf3\xd4\x1c\x39\x09\xc0\xfd\xa7\x9b\xc9\x01\x06\xd1\x7f\xe5\xfe\x8a\xc0\x8a\x57\x9e\xf4\xac\x0a\x65\x4d\x09\x74\x92\x87\x5c\x79\x0f\xde\xd8\x98\xee\x67\x9f\x51\x5b\xdd\xe3\x89\x6a\xa7\xe9\xf4\xf4\xe2\xfa\x44\xab\x81\x1c\x2e\xa6\xc0\xa1\x59\x2d\xce\xe0\xf4\xe2\x9a\xe5\xbc\xe0\x63\xe1\xd8\x18\x45\xb5\x69\x4c\x1d\x4c\x3d\x45\xd0\x64\x67\x82\x54\xee\x0a\x36\xf5\xf4\xe2\x1a\x93\x4b\x5a\x10\x67\xd0\x4d\xd1\x4d\xde\x3a\x43\xcc\x8d\x0d\xd0\x31\xf1\x45\x76\x7e\xe9\xc6\xe4\x64\x61\x61\xc8\x6b\xe7\x11\x6e\x21\x73\x25\xad\x22\x55\xfb\xee\xca\x46\xdf\x9c\x3f\x74\x76\x5a\xe6\x99\x44\x1d\x39\x7e\xa1\xc2\xce\x1d\xeb\xfb\xb6\x9c\x7b\x8b\xb6\x07\xbd\x62\x3a\x9d\x5b\x2c\xa7\x62\x64\x6e\xa5\xe8\xe5\xc6\x22\x01\x5a\x75\x5a\x89\xe2\xb0\x48\x3e\x63\xa7\xd5\x02\x09\x65\x0b\x30\xfd\x34\x16\x87\x5d\xb9\x2f\xa3\x68\x17\x3a\x04\x4b\xa3\x54\x8c\x12\x03\xf1\x25\x7d\x2f\x8a\x42\x82\xf6\xa4\x0d\xe9\x50\x6e\xf3\x78\xb0\x67\xc0\xa8\x66\x1c\xad\x45\xeb\xbe\x8a\xc4\x14\xee\x01\x8e\x6b\xa3\x4d\x32\x82\x17\x4e\x1b\x5a\x69\x97\xf0\x25\x96\xea\x31\x88\x41\x8e\xa3\x8c\xb4\xb1\x5d\x38\xea\x99\xd6\x77\x65\xde\xe6\x74\x53\x37\x39\xb7\xa3\x96\xbb\x57\x7b\xe3\xb3\x9c\xef\x2d\xc8\x9b\xcd\xed\x6b\x47\xf3\xb0\x71\xa0\x7c\xb3\x2e\x4b\xa0\x7d\x2d\xa9\xd9\xd2\xf0\x50\xe4\x02\xeb\xc4\x76\xf3\xac\xdc\xa0\x76\xe7\xea\x6b\x7a\x7e\xb9\x60\x19\x2b\xaa\x1b\xd7\x7e\x46\x5b\x08\x91\x03\xba\xb9\x07\x79\x56\x16\x3c\x3b\x64\xd0\x25\x69\x87\x3d\x76\xe6\x54\x27\xd7\x74\xe2\x03\xdf\xcd\x9b\x5b\xc5\x18\x3b\xbf\x7c\xc3\x8e\x55\x44\xd6\xc1\xec\x87\x67\x35\xce\xa5\xbe\xd2\xa5\x05\x39\x91\x5b\x96\x09\x27\x6c\x39\x12\x46\x1f\xf5\x69\xeb\xcb\x37\x4d\xe6\x4b\xb6\x4c\xe6\x60\x99\xab\x8d\xe8\xe0\xfc\xf2\xfe\x5b\xa7\x7d\x9e\x5f\xde\x7f\x7f\xc8\xb8\x31\x72\xa8\x6a\xe3\xfb\xff\xd9\xfb\xd7\xe6\x46\x6e\x24\x5f\x1c\x7e\x7f\x3e\x05\x42\x7e\x4e\xb4\x34\x41\x52\xdd\xb6\xc7\xb3\xa7\x37\xf6\x85\x5a\x52\xdb\x3a\xd3\xad\xa6\x25\xd9\x8e\x7d\x8e\x36\x3c\x60\x15\x48\x62\x55\x2c\x94\x0b\x28\x49\x9c\xd8\x0f\xff\x0f\x64\x26\x6e\xc5\x5b\x89\xa2\xda\x6d\x0f\x63\x22\xc6\x2d\x16\x0a\x85\x4b\x22\x91\xd7\x5f\x7e\xae\x60\x5c\x95\x6f\x02\x0d\xc6\x16\x2d\x9c\x60\xb0\xfe\xef\xc3\x15\xbf\xe0\x70\xc5\x27\xa1\x02\xdb\xed\x7c\xe1\xb9\xec\xfc\xc6\xdd\xe3\x01\xef\x83\x39\xf7\x78\xc0\x9f\x23\x0e\xef\x05\x20\x80\x55\x7e\x25\x78\x6e\x19\xbd\xfe\x7e\x43\xc9\x97\x56\xd3\xb4\xce\x55\x52\x6d\x0c\x75\x4c\xaf\x6a\x77\xa8\xae\xe0\x9a\x76\x48\xfe\x38\x8d\xdb\xe2\x77\x09\xd3\x20\x18\xb9\x48\x78\x40\x0f\x73\xf8\x19\x88\x0e\xf4\xa3\xe0\x77\x9d\x57\x9d\x73\xa7\x3a\xd2\x4b\x3a\x99\x1d\x58\x00\xae\x45\xd6\xd4\xd2\xcc\x4f\x55\x69\xc4\xe3\x06\x19\xa1\xd5\x98\x4d\x55\x91\x83\x89\xb5\x5f\xd8\xe3\xc2\x34\x3d\x8f\xab\xc8\x02\x6a\x28\xd6\x96\xf5\xa9\x15\xae\x26\x83\x65\x99\x2a\x2a\x96\xe2\xca\xa1\x10\x47\x85\x4a\x77\xee\x9d\x81\x4e\x3f\x3e\x60\xec\x3d\xb8\x10\xf0\x96\x4e\x52\x37\xda\x6d\x99\xe1\x77\xc2\xf6\x9a\x89\x1c\xe8\x08\xc2\x1f\xc6\xad\xd7\x17\x27\xd8\x29\xa7\xe8\x7b\x3a\x5a\xeb\xb5\x38\x70\x80\xf0\x02\x52\x85\xd0\x7b\xc0\x0b\xf2\xe3\x3a\x45\xd6\x85\x3b\xf0\xa2\x88\xb3\x50\x00\x6c\x09\x84\x59\x58\x2b\x97\x67\x0b\xb5\x47\xc1\xd7\x0d\xe4\xf8\x77\xcc\x88\x84\x3a\x8e\x50\xbe\x06\x1d\x94\x0f\xb6\x8b\xa9\xac\x50\xa8\x0a\x95\x52\xd0\xe3\xe2\xab\x97\x10\x41\xbf\xbd\x2d\x6f\xcb\x37\xe8\xfe\x54\x0f\xe0\xe5\xff\xfe\xe2\xcc\xeb\x7b\x80\x1c\x77\x0d\xf3\x65\x5f\x53\xad\x1b\x61\x26\x32\x67\x23\x09\xb2\xa3\x16\x86\x1d\x96\xe2\x01\x13\xa4\x7c\x5a\x0c\x9d\x18\x87\x05\x42\xbd\xf9\x8f\x53\x97\x47\xec\x1b\xec\xb3\x12\xf5\x4c\x82\xd3\xd2\xf6\x8b\x64\xf1\xe9\xea\x15\x59\x1f\xea\x87\x7e\xfd\xd0\xef\xf7\xfb\x76\xac\x50\x99\x4c\x0b\xd3\x4b\xd6\xc0\xfb\xac\x66\x2a\x97\xe4\x4b\x0e\x2b\x61\x09\x32\x7c\x42\xbb\x10\x84\xa5\x45\xd7\x50\x67\x01\x01\xbf\x34\xdf\x7d\xbb\xfc\x2c\x5b\x91\x72\x22\xea\x15\xe0\x82\x48\x1f\xa7\xb0\x27\x9d\xf0\x54\x96\xbc\xe1\xe5\xe5\x38\x2c\x1f\xb6\x19\x02\x31\x56\x4c\xcd\x59\x3c\x7d\x06\xfb\xd8\x5e\x84\x08\xf1\xe7\x70\xa7\x24\x94\xfc\xb4\xa4\x9f\x80\xcb\xa0\xbd\xa5\x2c\xe6\x40\x97\xe0\x33\x4b\xe8\x0e\xfd\xb9\xae\xe4\x2c\x8d\xd8\xd5\x90\x75\xc3\x39\x6c\xad\xf4\xd1\x80\x5d\xd0\xe6\x4c\xf9\xbd\x60\xa5\x62\x62\x3c\xb6\x32\x94\x2a\x99\x70\x75\xb9\xd2\x0f\xe9\x26\x9b\x32\xae\xdf\x5a\xd6\x52\xdb\x7d\xce\x40\x27\x9f\xf1\x0a\x39\x0b\xc4\xff\xe4\xb2\x76\x20\x32\x74\x9a\x2d\xc9\xdc\x1e\x7c\x2a\xaf\x94\x32\x1f\xa5\x06\x8e\x7c\x7b\x00\x6f\xdc\x1e\x9c\x14\x0f\x7c\x8e\xe9\x76\x63\x44\x3d\x73\xce\xc9\x5e\xf4\xd4\x15\x1a\xdb\xc6\x61\xd0\x94\x27\x9d\xd8\x82\xa5\x76\x7b\xc0\x8c\x82\x14\x33\x14\x11\x4d\x3d\x47\x21\x31\x18\xac\x89\x6b\x56\xb5\xca\x84\xd6\x03\xf6\x93\x16\x10\x09\x03\x2e\x18\x07\x75\x23\xe9\x2c\x0c\xd8\x47\x3e\x47\x3e\x4a\xf5\xf6\x64\xc9\xda\x8c\x8d\xd9\xb9\xd3\xb3\x91\x32\xd3\x76\x03\x04\x90\x5d\x60\x88\x78\xce\x50\x46\x0e\x2e\xdd\xc5\xfe\x81\xe1\xea\x98\xe3\xa2\xf3\x83\x9b\x88\x49\xef\xfa\xa8\xc1\xb2\x5f\x2a\xd8\xf4\x4d\x7e\x73\x9f\x74\x4c\x01\x8c\xf1\x32\x83\xeb\xd5\xee\x07\xd7\x10\x3d\x52\xf6\x6b\xa5\x00\x49\xa9\x46\x57\x37\xb8\x47\x16\x18\x8e\x03\x1a\x83\x27\x72\xc6\x27\x60\x74\x70\xbb\x64\x14\x13\xa5\x6e\x6a\x17\x52\x62\x02\x4a\x04\x7d\xea\xa7\x8b\x33\xf6\x9a\x1d\xda\x6f\x1d\xc1\xf2\x03\x36\x99\x51\x4c\x1b\x5e\xb7\xc7\x28\xc7\xae\x0b\x2a\xcf\x08\x91\x7c\x35\xd6\x32\xea\xd9\xa3\x05\x27\x27\x54\x6b\xf3\x6c\xb7\x12\xb5\x5d\x6a\x28\x57\xf0\xe5\xd1\x49\xe7\x32\x4c\xed\x7d\xff\x49\x2f\x22\xb8\x2e\x39\x6d\x3f\x6d\x71\xda\xa8\x4e\x94\xa6\x32\xe0\x75\x3a\x23\xdc\x69\xa7\x6d\xb4\xd3\x73\xbf\xc4\x35\xfe\x1c\x67\x51\x8b\x0f\xb2\x6c\x1e\x57\x00\xfb\x75\x47\x2c\x39\x4f\xba\x59\xa7\xfd\xd9\xdd\xa5\xe6\x58\xd4\xef\xd1\x90\x94\x83\xa2\x55\xbe\x28\x5a\xb9\xa3\x13\xd8\x7f\x4a\x01\xee\xec\xc2\xd1\x71\xf6\x45\xc6\x59\xcd\xcb\x5c\xcd\x16\xbe\xe6\x43\xbc\xc2\xb2\xb2\x3f\xcc\xfe\xaf\xd8\xc5\x2c\x53\xb3\x6a\x58\xab\xf1\x73\xca\x37\x5c\xa7\xdd\x6c\xda\x45\xfa\xaa\x37\xae\x53\xf5\x7d\x57\x35\x3b\x91\x8c\x43\x8c\xc7\xf2\x09\x44\xd2\x36\x5c\xc8\xdd\xdd\x2d\x20\x9b\xeb\x98\x78\xec\xd7\xc7\xb2\x86\x78\x33\x60\x0d\xc0\x46\x64\xd9\xda\xf4\xde\xa2\x03\x34\x1a\xf5\x2b\xbb\x13\x72\xc6\xeb\xb9\xbd\xf9\x71\xef\x13\x12\x2c\x95\xfb\xb4\x77\xe1\xe4\xe4\xbf\xb1\x62\xea\xaa\x23\xbb\xc2\xd6\xb6\xee\x24\xaf\x3b\xcb\xdb\x38\xb4\xe6\x3a\x33\xc5\xc6\x48\x04\x6c\x05\xaa\x63\x64\x6b\xf6\xf1\xc7\x39\xa3\x7e\x10\x53\x27\xa9\xe8\x38\x84\x50\x42\xab\x04\x34\x65\x80\x5c\x70\xed\x0f\xdb\x04\xe2\xce\xef\x11\x9b\xc9\xc9\xd4\xf8\xfb\xb4\xe0\x4d\x99\x4d\x77\xec\x1d\xc4\x79\x3d\x6b\x01\x1f\x64\x99\xab\x07\xfd\x5c\x9e\xf9\x0b\x76\xd3\xe2\x02\x5d\x59\x28\xbd\xed\x8b\x2e\x79\x55\xfd\xa9\x6c\x54\x79\xd7\x2d\xf8\x5b\x78\x72\x04\xda\x2c\xca\x91\x3a\x08\xdc\x9f\x5d\xe4\xd8\xa9\xa7\x65\x53\xa1\x2b\x6c\x81\x36\xe7\x56\x09\x96\xae\x2e\x44\x9e\x19\x79\x2f\xce\x04\xcf\x0b\x59\x8a\x6b\x91\xa9\x32\xdf\x74\xee\x70\xff\x79\xc1\xf2\xa6\xe6\xce\x8e\xa5\xf1\x55\x1f\xfe\x38\xe3\x73\x04\x1d\x85\xb4\x1f\x82\xad\x83\x48\xde\x38\x17\x08\x8a\x76\xdf\xc8\xa0\x52\x46\xf1\x96\x78\x55\xc2\xfb\x56\x6d\xc4\x70\xcb\x19\xaf\xef\xac\xb8\x6a\x0f\x20\x61\x39\xdd\x41\x3b\xad\x55\x26\xc1\x44\x10\x53\x13\x42\x61\xcd\x3c\xda\x4a\xa5\xb4\x84\x6f\x13\x97\xda\xb9\xb0\xc2\x9f\x0b\x0f\xdb\x09\x14\xd6\x52\x75\x7a\x44\xd0\x84\x18\x85\xde\x46\x10\xb1\x2b\x46\xda\x18\x05\x68\x34\x54\xb2\xe8\x24\xcb\xec\x5f\x37\xea\x4e\x6c\xf4\xbe\xad\x79\x35\x02\x61\x7a\x98\x0a\xa8\x77\xcb\x7d\x4d\x00\x8e\x0d\x99\x81\x96\x21\x49\x05\xc6\xc2\x0d\x01\xab\xba\x1a\x68\x5b\xc8\xef\x61\xef\x3b\x7a\xb2\x22\x11\x00\x11\xf6\x28\xd0\xd6\x5f\x14\xa7\xa1\x41\x86\x9e\x14\x0a\x10\x2d\xe6\xe1\x42\x85\x0c\x37\x8a\x41\xb9\x81\x18\x5f\x4f\x72\xce\x57\xac\xca\x44\xe7\x82\x42\xce\xd0\xff\x82\x7b\x66\xb7\x97\x89\x1f\x7f\xd7\xfb\x24\x79\xb4\xa9\x54\x3d\x44\x20\x6c\x7a\xa3\x63\xa9\xfa\xbc\xd4\x0b\x01\x64\x4f\x9b\x6b\x12\x85\xb6\xd6\xbd\xe3\xb3\xc7\xd6\x04\x9f\x0d\xd8\x30\xfc\x18\xae\x01\xd8\xde\x56\x2c\x93\xcb\x6a\xf4\xe1\x2f\xb6\x4b\x34\x2f\x39\x16\x49\x06\xad\x32\x8e\x29\x5a\xb5\x0c\x9d\x6c\x7b\xd7\xc2\xe0\xc8\xd1\xac\x97\x48\x37\xb1\x9a\x79\x7b\x70\x8a\xb1\x09\xef\xad\xbc\x79\x7b\xb0\xc4\xbc\xf5\x2a\x6e\xf1\x8b\x34\xd3\x1f\x94\x36\x97\xc2\xbc\xea\xa5\x8f\xec\xdf\xd4\xf5\x2b\x4b\xf3\xaf\x2e\x55\x29\x5e\x0d\xda\x0b\xe8\x43\xae\x42\xac\xdf\xaa\xd8\x2f\x1a\xbc\x4f\xcd\x82\x07\x51\xd8\xd0\x8d\x42\xfb\x9e\xfd\x82\x93\x02\xec\x7d\xce\x01\x0c\x13\x5a\x4f\x71\xac\x0f\xaa\xbe\xeb\xb1\xb9\x6a\xf0\x05\xa3\x68\xcb\xe6\xf1\x22\x89\x47\x8f\x89\x65\xd4\xea\x69\x6f\x61\xa7\x13\x25\x1f\x15\x82\xf8\xe1\x07\x59\xde\x6d\x62\x40\xe7\x0b\x2f\x2c\xe1\x9c\x71\xa4\x0b\x86\x20\x13\x27\xd5\x11\xf3\x94\x25\x95\xd5\x07\xd0\x4b\xbc\x08\x44\x79\x2f\x6b\x55\x42\xc5\x86\x7b\x5e\x4b\xfb\x2d\xdd\x4b\xd3\xf8\xf4\xbc\x34\xfc\x11\xc2\xc1\xb0\x82\x4b\x61\x47\x31\x60\xee\x7a\x7f\x9b\x90\x91\xa9\x9b\xad\x2c\x2a\xde\x18\x7b\xfa\x54\xd6\x1c\xcc\xb8\x11\x93\x26\x35\xc9\xeb\x6a\xec\x7c\x59\x2b\x12\x3e\xa8\x31\xd4\xef\x91\x58\xb2\xc2\x8a\x26\x76\x95\xd0\x72\x05\x36\x98\x3e\xb0\x14\x38\xb6\x3c\x23\x12\x43\x53\x31\xcb\xc5\xa8\x99\x4c\x20\x47\x10\x2c\xda\xa0\x62\x64\x9e\x63\x07\xa6\x00\x98\x9a\xe0\xa3\x80\xc4\x29\xfb\x19\x8c\x07\x91\x71\x7b\xf0\x21\x50\xe2\x0a\x70\x7b\xb7\x15\x90\xb2\x59\x89\x0c\x5c\xf3\xaa\xce\x31\xb7\x8d\xe7\x39\x8c\x7d\x71\x86\xa8\xc1\x25\xb3\xea\x11\x3c\xbb\x13\x05\xfc\x5b\xd1\xb2\xe8\x66\xe4\x21\xee\x12\xfc\x77\xcd\x78\x51\x4d\x39\xb9\xde\x08\x14\x10\x6c\xf6\x53\x05\xa9\x44\x50\x96\x9e\x22\x12\x40\xdd\x47\x7a\x87\xef\x9d\x2f\xee\xb0\x2b\x85\xb5\xe3\xbb\x6c\xf1\x4b\x5f\xfc\xa5\x66\xb9\xd3\x49\x21\xb9\xde\x18\x9d\xf9\x43\x68\x49\xf1\x5f\xca\xc9\xd9\x4e\xb3\x05\xd4\x37\xd8\x9e\x8b\x21\xed\x83\x63\xac\x29\x13\x08\x64\x80\xaf\x8c\x65\x21\x98\x8c\x84\xc6\x50\xf2\x05\x76\x19\x6c\xbb\x70\x85\x94\x0a\xab\xb9\x10\x47\xa5\xb4\xed\x9d\xee\xa2\x9f\xe8\x8b\x6c\x9e\xac\x76\xb9\x75\x17\xc3\xd3\x4d\xc9\x1a\x74\xea\x6c\xeb\x57\x9a\xc9\x2a\x0b\x06\x88\x25\xbc\xd4\x9e\x5c\x30\xac\x6f\xc3\x4b\xa3\x8d\xe9\x40\x4c\xac\xc4\xa6\x2e\x07\x54\x68\xe3\xad\x20\x8e\x7b\xb6\x46\x4f\x6f\xc4\x33\xb8\xa0\x08\x3a\x24\x46\xf2\xcc\x3a\x9d\xa3\x36\x2d\x32\x04\x43\x8b\xcf\x37\x0b\xd4\xb6\xab\xd9\x0f\x37\xe2\x4d\xb6\x66\x54\xc9\xfc\x65\xf7\xa3\x43\x0c\x6e\x2a\x6d\xba\x97\x9c\x97\x60\xa8\xf2\x25\xce\xc3\xf4\x04\x43\x7b\xb7\xc6\x1a\x5d\xf3\x9c\xf4\xe4\xbe\xcb\xa7\x07\x81\x6e\x0b\xd1\x05\xbc\x0e\xc3\xa6\x28\xae\xc1\x2f\xba\x89\x4f\x5d\xb4\x9a\xaf\x62\x56\x3e\xd2\x06\xc4\x07\xed\x1a\x13\x5a\x80\x9d\x90\xdf\x17\x67\x96\xb5\xb4\x59\x35\x05\x25\x1f\xfb\xc4\x7d\x18\x20\x19\xf1\x5c\xca\x27\xd9\x3e\xd0\xc0\x93\x2c\x1b\xc4\xa4\xe3\xc7\xbc\x9f\x8a\x6b\x2a\x8c\x64\x45\xac\x7b\x99\x37\xbc\x80\x0f\x59\x11\x6b\xe6\xac\xba\x78\xf5\x93\x1c\x3d\xa3\x31\x0d\xd8\x7b\x55\x33\x82\x0b\xef\xb9\xe1\x03\xa2\x85\x1a\xb3\x1c\x04\xa7\x1e\x32\x51\x94\xa2\x48\xe0\x45\x2c\x57\x1a\x87\x95\xb1\xe9\x22\x7d\x72\xa6\x50\xb8\xbe\x8f\x71\x1d\xbe\x22\xb9\x56\x96\x93\x3e\xfc\x62\x27\x42\x5f\xea\xab\xb2\xcf\xfb\x0b\xd1\xc0\xcf\xe5\xd8\x50\xab\xa9\x5d\xec\xf4\x4b\xbf\x79\xed\x84\x9e\x2c\x73\xa2\x28\x58\xc8\x7f\xf2\x38\x49\x74\xb5\x75\xe0\xa2\x94\x26\x6e\x65\x77\x1a\xd3\x8b\xd1\x60\x88\xb2\x5c\x55\x4b\x04\x6d\x4f\xfa\x03\x34\x5f\xc3\x6b\x43\x76\x4a\x4b\xf1\x32\xe9\x0f\xac\x5c\x3a\x24\x50\x4b\xac\xfc\x23\x73\x41\x60\xbe\xa0\xea\x44\xa6\xb0\xa8\x58\x29\xcf\x32\x55\xbb\xb4\x61\x0c\x0a\x85\x8f\x79\xcd\x6a\x8a\x07\x10\x08\x9e\x97\xed\x2f\x83\x28\x50\xcf\x12\xa1\xd3\xf1\xf5\x06\xf2\x13\x19\x9f\x59\x1d\x6c\xc1\x7e\xdb\x5a\x11\x97\x2e\x0d\x43\xfd\xe0\x72\xdc\x9c\xa4\xdd\x63\x3e\x56\x0f\x53\x56\x75\x8f\x7d\xb0\xea\x63\xfc\x83\xaa\xd1\x4e\xd8\x54\xf4\x13\x8e\xde\x89\xb2\x57\x71\x72\x38\x46\x76\xb7\x26\x03\x09\xfe\x1c\x8d\x53\x96\x73\x92\x15\x8a\x52\xc2\x23\xa3\xd9\x68\xce\xc6\x54\x82\x37\x06\x09\xa0\xdb\xf3\x18\xab\x2c\x79\xdf\x5c\x88\xe1\x9d\x57\x14\xfe\x0d\x85\xd8\xb0\x6a\x28\x20\x0a\xa0\x7e\xe5\x03\xa6\x10\xd6\xa4\xf6\x00\x07\xca\x01\x1c\xa4\x2b\xad\x07\xec\x83\x9c\xb9\x78\xa5\xc8\x58\x2e\x5b\x8b\x0b\x66\x24\x2d\x67\xb2\xe0\x96\x58\xf4\x14\x72\x11\xdb\x5b\xd0\xcd\x6e\xb5\x24\x4e\xf8\x79\x49\x8d\x76\xb0\xfd\x88\x7d\xfd\xab\xda\xb5\x4a\x95\x8b\x2e\xa5\x44\xa8\x19\x9a\xf3\x89\xe4\x12\x88\x13\x8f\x8d\x05\x90\x09\x3c\xf8\x55\x3c\x72\x02\x86\xce\x59\x19\x1e\x82\x99\x7a\x31\x14\x88\xa8\x5d\xa1\x3a\xf7\x83\x6e\xf5\x68\x5c\xf9\xb0\x1e\xe3\x5a\x37\x33\x8f\x1d\x6f\x89\x9e\x58\x48\xc0\x0e\x71\x47\x6e\x0b\x89\xc3\x7e\x63\x15\x80\x55\xb7\xf2\xf6\x5d\x33\xc0\x96\xac\x71\x00\x2e\x42\x34\x33\xfa\x8b\x60\x45\x88\xc5\x99\xba\x11\xb1\x49\x0d\xc4\x44\x69\x02\x50\xd1\x80\x5d\x2f\x79\x13\xec\x2b\xd4\x02\x32\xb2\x47\x22\x42\x16\xa0\x7e\x5a\xe8\x17\x61\xd9\xb7\x91\x0d\x82\x85\xf1\x18\x93\x82\xec\xed\x0f\x95\x34\x8f\x9f\x5e\x03\x5f\xdd\x8b\x7a\x2a\xf8\x42\xa2\x43\xb7\x3d\x79\x72\x4c\xfe\xc0\x1b\x23\x7e\x6c\x78\x69\x92\xba\x8e\x1b\x36\xf2\x13\x8d\x34\xae\xf8\x61\xa2\x3b\x81\xb9\xa9\xc4\x8e\x21\x8c\xf9\x24\xc8\x29\xee\xeb\x1b\x73\x32\x58\x5e\xa1\x8b\x17\x6b\xea\x2c\x44\x30\x92\x97\xa2\xf2\x18\xbc\xdc\x40\xb9\x41\x0c\x8f\x84\xd8\x0e\x72\x1a\xc7\xfd\x44\x4d\x32\x0f\x77\xef\x41\x4e\x36\xb6\xb4\x34\x8a\x96\x96\xbc\x17\xa6\x04\xa4\xe6\x4c\x50\xe8\xdc\xb4\x4a\x04\x86\xc8\xfa\xe4\x0f\xbc\x24\x37\x7f\x02\x66\x47\x29\x4b\x4b\xba\x21\xf2\x46\xa3\xea\x34\x5e\xd8\xa2\x16\x3c\x9f\x33\x08\x13\xbc\x18\xa7\x5f\x42\x49\x05\x88\x93\x44\x13\x6f\xe2\x25\x11\x9a\x04\xf8\x1e\xf3\x5b\xd9\xd2\x6f\x82\x0b\xd6\x29\x38\x4e\xf8\x4e\x40\x51\xe2\xcf\xf6\x18\x60\x42\x3c\x48\x2d\x2c\xcf\xa2\x99\x41\x9d\x1c\x8c\x6a\x83\x2b\x9a\x22\x89\xb9\x66\xff\x14\xb5\xda\x94\xd3\x21\xca\x29\x2f\x33\x64\x75\xc7\x77\xa2\xd2\x90\xc8\x01\x07\xec\xeb\xd7\x6f\xfe\xcf\xeb\xaf\xbf\xfe\x0e\x8e\x9c\x5b\x97\xc1\x2c\x5f\x67\x5a\x03\x09\x25\xaa\x45\x75\xff\x66\xf0\xe6\xbb\xde\x53\x4d\x6e\x43\x95\xfb\x65\x5b\x6e\x6a\xeb\x72\xdc\xab\x5a\xd8\x6b\x42\xaa\xb2\x93\xc3\x61\xd8\x6a\xee\x10\x11\x86\xc1\x01\xe1\x7a\x44\x93\x24\x05\x58\x14\xea\xc1\xc9\xc0\xd2\xcc\x07\xec\x53\x09\xba\xd3\xa5\xb8\xb7\xaa\x13\xf5\xfa\xc1\x36\x1a\xfa\x36\xb1\xe5\x79\x59\x8b\x28\x42\x35\x5d\xec\x91\x30\xb4\xd6\x3d\x36\x89\xb1\xb2\x2f\x55\x39\xf4\xa3\xf3\xdd\xd0\xe2\xf5\x27\x5b\x96\xa6\xa1\x7e\x3a\x44\x0b\xba\xa6\xa4\xa6\xb3\x9f\x79\x2d\x55\xa3\x9d\xb3\x3b\x53\xb3\x4a\x95\xc0\xc7\x7c\x99\x4d\x9c\x14\xdc\x3c\x28\x5a\x86\x4e\x62\xdc\x70\x40\x16\xf2\x33\x3a\xf1\x67\xfc\x74\x39\x1b\x91\x80\x71\x75\xef\x3e\x55\x53\x4e\x19\xc5\x66\x44\x5f\x46\x06\xb2\x94\x67\x38\x2e\xa8\xe3\x81\x42\x37\x6e\x1c\xbe\x80\x1a\xf6\x02\x92\x74\x1d\xce\x74\x2f\xc8\xd7\x75\x32\xb3\x75\x0e\xf9\x6f\xbe\xde\xc2\x21\x5f\xb5\x07\xb4\x19\x06\x2b\xb2\x27\xc8\x28\xb8\xd7\x19\x64\x02\x25\xdf\x1e\x90\x09\xc6\xb2\x83\x7e\x56\x4b\xf0\x60\xfb\xe0\x70\x7a\x48\xa9\xc1\xc9\x73\xab\x90\x3c\x28\x9f\xc9\x71\x27\xe6\x0f\xaa\xf6\xe0\x66\xee\xab\x89\x12\x42\x9f\x45\xdc\x03\x72\x9f\x41\xf4\x6d\x4d\xba\xe4\x92\xc6\xf3\x01\x3b\x29\xe7\xc8\x15\x51\xdb\x73\x02\x8e\xe3\xa9\xa3\x79\xec\xb6\x48\x76\xcf\x65\x25\xd2\xd7\xac\x90\x02\xfb\xb9\xd2\x58\x15\xc8\xd3\xb1\x72\x17\x4f\xae\x6a\xe0\xb5\x04\xe8\x56\x53\x8d\x70\xf7\x78\x3b\x1c\x9d\x90\xe1\xb5\xd1\x62\x95\x6c\x29\x87\x4b\xc1\x29\x9d\x13\xf4\xb7\xd1\x78\x85\x25\x4e\xee\xcc\xa4\x76\x4a\xbe\xe5\x80\x9d\x38\x1d\x1c\xef\x3d\x70\xf9\xd8\xce\xa0\xfa\x6c\x6a\x02\xc0\x16\x27\x97\x67\x4e\x3d\x26\x2c\x97\x34\x9a\x08\x05\x96\x74\x24\x70\xcf\x12\xa8\x8e\xf8\xad\xe1\x05\xba\x70\x6f\xea\x46\xdc\x1e\x6c\x77\x55\xa1\x4d\xf7\xf8\xf5\xeb\xd7\x7f\x83\x9b\x0a\x06\xf7\xbf\xbf\x7e\xf7\xbf\xbf\x7e\xf7\x12\x69\xb6\x69\x9e\x5e\x47\xe5\x6c\xc5\x26\x47\x16\x8b\x8d\x38\x07\x18\xda\x1e\x79\xc3\x5b\xb9\x4f\x51\xb2\x3e\xb0\x4d\xba\x86\x30\x47\xa3\xc7\x3e\x95\xef\xb1\x26\x56\x0f\x6f\xa6\xc4\x66\x8d\x8d\x76\x8a\xf2\x73\xfc\x15\x4d\xaf\x8f\x43\xde\x2a\x35\xc4\x4b\x3e\x1d\x18\xdb\x55\xab\x79\x92\x92\x98\x08\x6f\x74\xee\x65\x88\xd9\x22\x0a\xc3\x68\xd2\x9e\x4b\xd9\xf1\x1e\xe8\x86\xac\xab\x18\x0a\xef\x7c\x0b\xc8\x28\xd2\xae\xbd\x7c\x1e\xe3\x37\x5a\xb6\x92\xb3\x0c\x25\xb8\x65\x60\x81\x75\x53\xa6\xa9\x09\x91\x76\x7b\x7b\x50\x88\x09\xcf\xe6\xb7\x07\xe9\x97\x62\x8f\x84\x1b\x31\x5a\xaa\x25\x15\xc6\xc2\x2f\x52\xa9\xc5\x92\xe0\x7f\x03\x7d\xfb\x9a\xd7\x38\x48\xc7\xca\x5c\x20\x37\xda\xd9\xea\x67\x88\x8f\xd4\x53\x1f\x86\xe1\xc5\x46\x2c\xe4\x26\x0c\x77\xb2\xc9\x72\x99\xf1\xdb\x6d\xe0\xbd\x9c\x21\xe0\xc9\xd7\x60\xb2\x29\x96\xaf\x4b\x0d\x26\x10\x92\x52\x3d\x53\xf3\x5f\x58\x77\x4b\x2c\xef\xc4\xad\x6f\xe8\x62\x8b\x09\xae\x4c\x40\x7d\x32\x17\x6b\xe7\xb2\xae\x8d\x26\xda\x7d\x2a\xeb\xf2\x18\x0c\x20\xd1\x01\x63\xd7\x82\x70\xc8\xe2\xa0\x4f\x28\x4f\x4e\x8b\x18\x12\x51\xc1\x50\x89\xe2\xdc\xaa\x35\x8b\x43\xf8\x36\x50\xc5\x99\xaf\x62\x9e\x46\xfe\xb9\x10\x54\xfb\x94\x22\x29\x0a\xc9\xd1\xf2\x91\xb6\x44\x91\x30\xf4\xf3\x16\x5c\x90\x7a\xa1\x0d\x93\xa5\x36\x56\x9d\xda\x86\x0a\xda\x9d\x6d\x8c\xa4\x5a\xfc\x7a\xe0\x4c\x4e\xd6\x6e\xcd\x98\x5c\x56\x0b\x5c\xaf\xdb\x15\x61\xb8\xbe\x0b\xf6\x1b\xd1\x27\xc8\x37\xa4\x83\xe8\x77\x9a\x4b\x9f\x4c\xd6\x2b\x6c\x3a\xeb\x57\xc3\xfc\x40\x1e\xc4\x13\xfd\xfe\xc7\xb3\xcb\x0e\x30\xb0\x75\x23\xd6\x39\x20\x63\xcd\x3e\x16\x8c\x6d\xef\x3d\x56\x73\x83\x42\x3d\xc7\xfb\xa3\x10\x1c\x63\xf2\xd9\x61\xc4\x47\x8f\x20\xd4\x25\x24\xbd\xe0\x25\xdd\xc3\x85\x44\xf8\xf5\xa0\x91\x08\xe8\xda\x5d\x48\x7e\x3c\xa8\x76\xd0\xf6\xdc\xd9\x25\x2e\xf0\x1b\x96\xbd\xa6\x2d\xb4\xa9\x9b\xcc\xb0\xc6\x68\xfb\x3b\x7e\xdc\x85\xa7\x77\xf8\x7c\x2d\x26\x52\x9b\x7a\x1e\x80\xc9\xc3\x20\xc8\xb8\xe7\x9b\xdc\x89\x39\xfb\xe1\xef\xe7\xff\xf9\xeb\x87\x4f\xa7\x27\x1f\x7e\xfd\x78\x72\xfa\xc3\xc5\xe5\xf9\xed\xed\xf5\x7f\x5e\xdf\x9c\x7f\xbc\xbd\x3d\x45\x33\x3c\x69\x67\xd7\xc2\xdc\xde\x12\x69\xe9\xdb\xdb\x9b\xac\x92\xd5\xed\x6d\x14\x78\x68\x14\x4c\x1e\x3d\x44\xc0\x3f\x7d\xb2\x1f\xc8\x8a\xb8\xe8\x30\xee\x29\xd7\x21\x11\x76\x37\x3e\x77\xa8\x2e\x3e\xc4\x14\x95\x4b\xe7\xae\xdd\x74\x9c\xa6\xe0\xb5\x60\x5a\x96\x93\x42\xf8\x04\x97\xe0\xed\x1d\x09\xf3\x20\x48\x78\x6e\xa7\xca\xc5\x39\xea\x04\x99\x8b\x97\xa2\xbd\xf9\x13\x69\x8e\x6c\x72\x60\x12\x51\xec\x5e\x8a\x07\xb4\x33\xc9\x49\xc9\x0b\xf7\x55\x41\xda\x2d\x6a\x40\xed\x7c\x1f\xf2\x43\xfb\x60\xad\xc5\xac\x9c\x85\x8c\x9c\x44\x2e\xf1\x30\x4c\xc3\x8b\x33\xf6\x66\xc0\x7e\xc0\x08\x05\xe8\xeb\x7a\xd9\xca\xf9\x58\x30\x65\xa6\x64\xea\xda\x75\x4c\x82\x6e\x46\x08\xe9\xf6\xe4\x0b\x7e\xdc\x14\xc5\x9c\x59\x9d\x03\x2f\xf3\xa1\xca\x17\xcf\xfe\xed\x01\x56\xbf\x70\x0f\xb0\xf4\xc5\x00\x7f\xf4\xdf\x4e\x7e\xb5\x34\x1b\xaa\x27\xe0\x13\x7d\x9f\xd1\x53\xd2\x8e\x59\xfc\xe2\xf2\x7c\xea\x05\xc9\x10\xe8\x9f\xd3\x9b\x30\x4a\x0e\x90\xfd\x5b\xdc\x19\x46\xd4\x33\x59\x82\x1d\xfd\xfb\x9a\x67\x62\x28\x6a\x09\x42\xc0\xae\xd2\x21\x4a\x21\x10\x9f\xde\x7d\x49\xb0\x89\xfd\x10\x2c\x3a\xa6\x76\x82\xbe\x6c\x95\x71\x4c\xa6\x67\xb9\x28\x44\x30\xc4\xb6\x73\x19\x4a\x55\xf6\x4b\x31\xe1\x49\x36\x03\xd8\x5a\x90\x47\xa1\xbe\xed\xcd\x17\xd4\x99\x9c\xcd\x44\x6e\x6f\x68\xfb\x51\x17\xda\x83\x2f\x58\x95\x5c\x16\xbd\x44\xd8\x85\x21\xb2\x0a\x16\x23\x8d\xf1\x71\xd7\x33\x7c\x31\x69\x46\x57\xe7\xb2\xc5\xe0\x63\xe3\xcd\x3d\xee\x78\x3a\x7b\x7c\x50\xcd\x40\x83\x06\xcc\x0e\xce\xa2\x7d\x71\x27\xdb\x1d\x54\x4c\xa7\x24\x54\xed\xa8\x43\xfb\xf6\x58\xd5\x99\x1c\x15\x73\x36\xe5\x85\x09\xe5\xd4\x21\x53\x04\xbb\x19\xb0\x6b\x61\xe2\xe9\x17\xaa\x9c\xc4\xd7\x96\x78\xac\xd0\x5e\x9d\xd9\xb3\xd6\x54\xf8\x3d\xcb\xed\xe7\xaa\x59\x91\xd1\xfb\xcd\x6b\x37\xd5\x9d\xe7\x95\x18\x55\x08\x5c\xd0\xa7\x59\x3b\xc2\xed\x1c\xf5\xb0\xe3\x80\xbe\x1b\xdf\xf3\x4e\xca\x9c\x5c\x57\xb5\xe0\xf9\x69\x94\xbf\xb2\xc1\xba\xba\xea\xbd\xa8\xe6\xf5\x54\x3d\xc4\xb5\x2e\xc0\x38\xad\x9a\xc9\x14\x1d\xac\xf0\x22\xe3\x59\xad\xb4\xf6\x65\x40\x1c\x32\xe6\x80\x5d\xa7\xc5\x27\xd2\x92\x13\x70\x5d\x3d\xf0\xb9\xab\x37\x32\x92\xb9\xd0\x51\x82\xa9\x1b\xcc\x80\x9d\x14\x05\x5b\x39\x47\x20\xdb\x93\xcb\xb3\x9d\xe7\x7f\xac\x5a\x9d\xe7\xbb\xcd\x0b\xa9\x4d\x7f\xc6\xab\xfe\x9d\x98\xeb\x04\x5a\x28\xd9\xce\xbf\x8b\x79\x3b\x55\xd4\x9e\xda\x9f\x4a\x82\xa3\xb7\x37\x78\x3c\x98\xff\xda\xf0\x45\x37\xbc\x19\xdf\x1c\xe9\x99\xf8\xf4\x57\x0d\xe8\x19\xae\x7d\x2a\xf0\xde\x31\xb8\x88\x5a\x87\x5a\xd0\x10\x12\x0e\xb9\x4e\x60\x87\xdd\x14\x6c\xb4\x65\x41\x7a\x37\xc8\x9d\x92\x15\x16\x60\xff\x82\x62\x2f\x7a\xb5\xb0\xab\xf7\x77\x4b\x8b\x61\xaf\xfe\x57\x6b\x6c\xab\xa1\xb0\x5c\x9c\xd8\xff\x6a\x51\xe1\x36\x69\x9b\x6d\x18\xf5\x65\x89\x9b\x68\xe2\x8d\xdc\xd7\x8b\xb9\x1e\x26\xc1\x57\x77\xc0\x4d\xf8\xc3\x8c\xcf\x99\x3d\xc8\x05\xb4\xe2\x99\x69\x78\x01\x8d\x05\xb6\x45\xdf\x43\x8f\x09\x72\x31\x14\xf3\xa4\x9a\x0a\x90\x20\xc6\x86\xbb\x5b\xd7\x45\x09\xd9\xa5\xc8\x02\x46\x48\xad\x0a\x56\x15\xbc\xec\x52\x14\x3f\x02\x2d\xdf\x80\x8d\x46\x35\x16\x5c\x5e\xa0\x1f\xf8\x36\x74\xbe\x35\x96\xfa\x0e\x8c\xdd\xa1\xec\xc4\x4b\x9c\x84\x16\x58\xfb\xb3\x58\x95\x27\x71\x24\xa0\x8d\x4c\xeb\x86\xaa\x91\x80\x56\xa9\x4a\xc2\x37\xb1\x42\x5e\x9a\xc6\x88\x61\x6e\xa5\x1c\x83\x8c\x1a\x83\xec\xea\x28\xe2\x0c\x22\x07\x1a\x53\x35\xc0\x08\xff\x81\x71\xb3\x56\x88\xb4\x42\xd6\x3f\x76\xbf\xe5\xbc\x8c\xec\x29\xae\x58\xf1\xcb\xc4\x9f\x5d\xb7\x2a\x21\x6f\x21\xf9\x2c\xe6\x48\x75\xdc\x24\x62\x06\x18\xc2\x39\x5f\x9e\x31\x85\x47\xdd\xaa\x4a\x0b\xb9\x53\xdd\x52\x80\xaa\xb8\xec\xf4\xef\x9f\x04\xb4\xcb\x85\xc7\x14\x8f\x4d\x02\x75\x80\x61\x26\x6b\x85\x7d\xcd\xde\xcc\x28\xf2\x45\xd1\xb9\xce\x20\xe0\x4a\xca\x49\x54\x62\xe7\x22\xd8\xb5\xb7\xb1\x68\x26\xa1\xcc\xcf\x3f\xbf\xad\xe8\xd8\x85\x43\x7c\xe3\x6a\x61\x61\xd9\x72\xa6\x9b\xcc\xea\x3a\xe3\xa6\x68\xbf\x1a\x00\xd8\xd0\xe3\xf9\x1f\x11\xa0\xd5\x2c\x29\x7c\x4e\x81\xce\x4b\xdf\xd5\x1e\x04\x00\x21\xc7\xfe\xa5\x79\x41\xb7\xca\x35\x27\x6c\xda\xcc\x78\xc9\xba\xd7\xae\x79\x98\xce\x63\x4a\xf5\xb5\x39\x43\x71\xa0\x2d\xc2\x38\xd1\x92\x91\x5f\x76\x8b\x70\x5d\x68\xef\xec\x7a\xc0\x66\x1e\xbc\xb5\x0f\x43\x09\x20\x56\x47\x93\xe5\x0e\x15\xb6\xe0\x90\xf4\xd5\xf9\xa2\x64\x4c\x1f\x53\x59\x03\x44\x0b\xb7\x4a\x19\xd7\x2c\x44\x39\xb1\x7b\x99\x19\x39\xd3\x40\x95\x12\xe3\xd9\x64\xed\xed\x30\x89\xb1\x01\x8d\x19\x69\x1c\xa0\x37\xbc\x4e\x1a\x5e\xf3\xd2\x08\x11\x20\xdf\x62\xc7\x56\x2b\xba\x53\xba\x12\x60\x41\x8f\xb4\xd2\x5b\x2e\x32\x28\x40\xa1\xac\x78\x95\x79\x83\x3b\x13\x85\x16\x58\x36\x53\x8e\x5d\xe4\x06\x14\x03\x1b\x89\x4c\xcd\x04\xe3\xf7\x5c\x16\xb0\xe7\x5a\x29\x00\x86\x4a\xfb\x05\x84\xa8\xd0\xf9\x84\x26\x1a\x0a\xb3\x26\xa3\x42\xf7\x2f\x05\xe2\xf8\xf8\x0d\x88\x54\xa5\x72\x85\x0e\x79\x13\x8d\x37\x61\x35\x07\xec\x04\x03\x95\x75\x53\x98\x5e\x1c\x08\x44\xd9\xb7\xb9\x1c\x43\xae\x88\x41\xa3\x8a\xcb\xd8\x71\xe1\xd0\x91\xed\x06\x49\xf2\x39\x1c\xb2\x9a\x72\xbd\xb1\x8a\x8f\xfd\xd4\x94\x32\x77\x00\x7d\x81\x42\x80\x25\xe6\xf6\xd8\x45\x70\x1e\xbb\x66\x06\xb0\x4a\x6a\x4c\x15\x4c\x5d\xa2\x16\x9e\x1c\x69\x34\xf3\x3c\x06\xf9\x65\x14\xe3\x01\x87\xbb\xe7\xa2\x3b\xb4\x15\xe7\xcb\xdc\x1f\x50\xc4\xa7\x0d\xf6\xe6\x28\x23\x29\x72\x04\xe2\xbd\x0e\x3d\x79\x07\x05\x96\x98\xc4\x53\x1d\x69\x08\x84\xfc\x01\x6f\x38\xf4\x09\xb0\x81\xd9\x8d\xaf\x94\xd6\xd2\xd2\x0a\x4e\x1c\xfd\x82\x00\xcd\x3a\x14\x10\x3f\xf9\x16\x61\x52\x55\x0e\xf7\xc4\x08\xcc\xf2\x99\x65\xac\x21\x72\x2e\xf2\x3c\x3b\xad\xc2\x1e\xbe\x25\x75\x2f\xa3\x3b\x05\x53\xb6\xd0\x23\x61\xb0\x5f\x22\x24\x97\x7a\x4a\x35\x18\x28\x74\x36\x06\x14\x0d\xe7\x87\x6b\xf6\x20\x00\xdd\x05\x9b\xe9\xca\x92\x53\xae\x1e\x4a\xcb\xf1\xc1\x6c\x88\x1f\x02\x10\x5e\x60\x0e\x0e\x09\x00\xef\xe6\x0c\x42\x14\x00\xb2\x97\xdb\x9f\xec\x76\x5d\xa1\xc5\x71\xc9\xcc\x47\xaa\x29\x11\x94\xc8\x85\xc1\x97\xf9\x0a\x2f\x05\x5c\x5c\xe9\xb4\x4e\x56\x40\x7d\xd8\xcd\x81\x48\x54\xfc\x2e\xe4\xb3\x48\xef\x81\x70\x9e\x06\x70\x52\xf1\x1a\x38\x37\xa4\x65\xb8\xbf\x06\xec\xda\xde\xbf\x22\x17\xf9\x5b\xb0\x21\x2d\x7a\x31\x70\x12\xf6\x9c\x3b\xe3\x32\x18\x90\xe9\xde\xc6\x69\x24\xf1\x14\xc2\xe7\x1d\xbd\x87\xe4\xa1\x27\x74\x4c\x8b\xb2\x7c\xae\x76\x25\xd3\x31\x8c\x31\xa8\xc6\x1f\x12\x6a\x28\x24\x30\x36\xf1\x28\xbd\x79\xb6\x54\x65\x1f\x8c\xd6\x4e\xe5\xad\xd9\x43\xda\x1d\xd1\x23\x12\xe1\xc0\x55\x13\x7b\x0b\x19\x7a\x50\xe9\x91\x8e\x9b\xd3\x9b\x45\x14\x26\x49\x94\x40\x0b\xa0\x46\x30\x8e\xbc\xc7\xcc\xbc\x22\xd4\x19\x57\x05\xb2\x64\xa2\xae\xb1\xae\x31\xe1\xb9\xd3\x7d\x1a\x6a\x87\x2a\x6d\xe2\x08\x4c\x7b\x9c\x76\x2d\xb4\x20\x43\x7b\x3a\x1f\x6c\x55\x51\x59\xc6\x07\x77\x53\xe8\x64\x51\xc2\xf5\x9d\x6d\xc3\xbf\xa1\x54\xcb\x86\x81\x63\x23\x0a\xaf\xb0\x63\x89\x2b\x71\xad\x98\xcb\x45\x52\x71\x56\xea\xb6\x6d\xfc\xb5\x71\xfa\x6a\x94\xc0\x41\x6f\x5f\x0c\x5d\x20\xec\x10\x6b\x60\x63\xe6\x94\xff\x0e\x37\x28\xe4\xbe\x21\x17\x82\x4f\x0c\x53\x63\x06\xf5\x5a\x30\x53\xff\xfe\xbb\x18\x3d\x42\x6a\x8a\x34\x82\x95\x83\x44\xfe\xc0\x4b\x42\xdf\x73\xd1\x0e\x8b\xdc\x81\xb5\xe2\x62\xf8\x85\xa7\xdc\xff\xa6\x34\x44\x6f\x75\xb8\xc9\x7f\x6c\x78\x41\x91\xd0\xe4\x3e\x67\x87\x3f\x7e\xba\x3e\xc2\xa8\x2e\x39\x86\x53\x6b\xef\xde\xc5\x52\x39\x01\x8b\x67\x69\x42\x13\x84\xd7\x0c\x55\xfe\xe3\xa7\x6b\x0c\x25\x83\x50\x1b\xd0\xb1\xbd\xe8\xf5\xe3\xa7\x6b\xfc\x90\xd0\xdb\xd6\x84\xc0\x64\x9d\x5a\x55\x4a\xf3\x42\x1f\x63\x48\x18\x8d\xa7\xff\x9b\x5a\x2c\x81\xb2\xb3\xfa\x92\x27\x6c\x54\x4b\x31\x8e\xaa\x4a\x6e\xab\x3d\x00\x97\x1d\x30\xa8\xa2\xfb\xea\xdc\x8a\xd7\x22\x7f\xb5\x55\xdd\x49\x54\x00\x3f\x67\xe1\xd1\xab\xf7\xa7\xec\x9b\x6f\xbe\xf9\x3f\x0c\x80\x96\x41\x1c\x93\xe8\x42\x0e\x6a\xbd\x8b\x80\xe6\x9a\xf1\xcc\xde\x36\x85\xc8\x27\xa9\x64\x54\xf8\x1c\x04\xc8\x3e\xf0\x20\x76\x0e\xcf\x19\xd2\xcc\xf3\x65\xe2\xd1\xa1\x3e\x4a\x50\x9b\x76\x8b\x1d\x78\x23\x66\x55\xb1\xb1\x52\x86\x6b\x15\xb9\xca\x38\x33\xee\x47\x3b\x3a\x1f\x1d\x9e\xa9\x4a\x0a\x67\x89\xae\x85\x0b\x20\xef\x08\x33\xb8\x2f\xec\xf4\xbb\x15\x76\xda\x97\x2e\xfa\xb3\x94\x2e\x42\x08\x86\xee\xc5\x8b\x70\x6f\x5e\xe9\xcf\x57\xc0\xc8\x4f\x7a\xb9\x87\x7f\x91\x27\x75\x5a\x92\x65\x7c\x0d\xb0\x51\xd7\xad\x42\xc4\xda\x02\x1f\x01\x3b\x52\x82\x58\xe3\xcc\x1b\x44\x9d\x64\x7e\x72\x23\x1d\xbc\xc8\x2a\x59\x19\x14\xcc\x92\xba\x65\x2f\xdc\xc8\xf8\xfd\xef\x2f\x58\xbd\xc9\xdf\x1c\x49\x83\x1d\x54\x70\x72\x1d\x6f\x2e\x20\x18\xb7\x5c\x28\x24\xe8\x1e\xee\x0b\x0a\x7e\xd9\xf7\xce\x13\x0b\x0a\xfa\x33\xb7\x7b\x2f\xad\xa7\xe8\xe7\x18\xe6\xf7\xd7\xe8\x9f\xe5\x1a\xdd\x57\x00\xc4\xdf\x3f\xc3\x1d\xf2\x22\x95\x00\x13\x11\xa0\xd3\x3d\x02\x30\xe9\x41\xc5\x81\xf8\x54\x6e\x38\x05\xd4\x13\x9b\x06\x33\x4c\x00\xf2\x74\x32\x41\xd0\x87\x36\x5f\x37\x7b\x99\x6f\xe1\xfc\xea\x74\x93\x3a\x2d\xc7\x02\x06\xfe\xda\x99\x13\x0a\x8e\xbf\x88\x31\x80\x59\x4b\xc0\x50\x88\x8a\x9c\xad\x8b\xa3\xfb\x32\xa4\xbb\xcd\xb4\x5f\x9b\xc5\xe0\xb2\x55\xc4\x08\x66\xec\x4d\x28\xc4\x68\xea\x06\x41\xc4\x0a\x17\xb5\xc3\x19\x50\xa3\x02\x20\xf8\xc9\xe4\xed\x02\xb5\xa0\x46\xdb\x0d\x65\x9e\x73\x6f\x05\x47\x8b\xb9\x9e\x62\xca\x2d\x80\x0c\x45\x39\xea\x45\xa1\x1e\x00\x84\xb2\x29\x84\x7e\xcb\xfa\x6c\xd4\xc8\xc2\xf4\xa5\xb3\xb4\x53\xb6\x1a\xbe\x3e\x12\xed\x24\x69\x49\xf8\xa5\xe8\x31\x53\x5a\x50\xcb\x46\x8b\xdb\x92\x45\x56\x2c\x48\x32\xb8\x2d\xfb\x2c\x2b\x54\x93\xdb\x49\xdc\xcb\x3c\xd4\x58\xca\xd2\xcf\x81\xbd\x17\x8b\xc7\xf1\x10\x95\x99\x0e\xde\xf6\x4f\x33\x1d\x2b\x35\x20\x18\xc0\x41\xa6\x66\xc7\xe1\xfa\xdc\xc6\xda\x5d\x6f\xca\xb4\xb3\x5b\xed\x42\xe9\x61\xd1\xcb\x66\x36\x12\x9e\x8e\x93\xfd\x00\x2f\x25\x64\xe4\xa2\xe7\x04\xc4\x53\xbb\x97\x84\x56\xbe\x7b\x48\x05\x65\x54\xa6\x8a\x8d\x78\x21\xd8\xcc\x4f\xc3\xfd\xbd\xcd\x1c\xb0\x42\xa4\x2f\xd4\x12\xc0\xcb\xdf\xb2\xdb\x83\x9b\xd3\xe1\xed\x41\x8f\xdd\x1e\xfc\x74\x46\xff\xb8\x3e\xbd\x19\xde\x1e\xec\xb6\x5e\x2a\xec\xda\xb2\x65\xd8\x74\xe1\x76\x39\xd6\x0f\xaa\x7e\xc4\x98\xda\x6b\x90\x0a\xd7\xde\x6b\x8b\xcd\xe3\x40\x52\xce\x5c\x0b\x57\xff\xd0\xe3\x2c\x75\xa9\x41\xda\xa1\xb4\xed\xfb\x6b\xaa\x69\x9b\x60\x2f\x41\xa1\x4e\x44\x33\x01\x8b\xb9\x51\x18\xdd\xcc\x3e\xfa\xf2\x1b\xed\x26\x61\x43\xc9\xa2\x8a\xae\xb5\x0a\xd2\x09\xca\x89\x77\xf5\x9d\x3f\x0e\xd8\xed\x81\x78\x34\xdf\xe2\xf6\x3e\x8e\xb1\xe6\xe2\xcc\xc3\xb9\x83\x80\x4c\xa8\x88\x90\xa6\x84\x8d\xdb\x35\xd4\xb6\x43\x9a\xf8\x54\x16\x9b\xf0\x07\xe2\x34\x10\xc8\xdd\x62\x87\xf6\xcd\xe3\x87\x5a\x1a\x71\x34\x00\x98\xc3\x4f\x80\xee\xe3\xcb\x07\x8c\x55\x4d\x61\x1f\xfe\xa1\xcb\x39\x94\x25\xc3\xdd\xfd\x68\x17\x70\x15\xc4\xda\xda\x3c\x30\xdc\xfa\x8d\x70\xb9\x3f\x53\x33\x02\x75\xb4\x2b\x99\xdb\xbb\x0c\xe0\x6a\x17\x28\x69\xb7\x07\xca\x0f\xf1\xd9\x07\x08\xa0\x0c\x6a\x91\x5f\x7b\x28\xc7\x1b\x51\xcf\xd6\x9c\xa1\x13\x97\xef\x5f\xb9\x57\x63\x18\x48\x23\xea\x99\x47\x28\x00\xff\x3f\x8c\x83\xb0\x02\x3c\x7e\xc0\x83\x80\x40\xa3\xd7\xec\x50\x0e\xc4\x80\x49\x2b\x75\x71\x56\xaa\xbe\xaa\x8e\x06\xec\x84\x95\x4d\x51\x74\xf8\x40\xa9\x7c\xff\xd4\x91\xc6\x20\x1e\xdf\xd7\xe6\x63\x5b\x79\xb4\xdd\xad\x65\xad\x18\x1b\x0f\x56\x6f\x9d\xd0\x75\x82\xc1\x43\x1e\x3d\xcf\x4e\xa8\xb7\x80\xb5\xb6\x88\xd6\x85\x4b\xb6\x22\x15\x1d\x1f\x6e\x20\xd8\x5f\x70\xd1\xdb\x9f\x4a\x2a\x1b\xa4\xdf\x2c\x5b\x13\xf3\x28\xbe\x35\xd4\x36\x7e\xd3\x7f\xf3\xfa\xf5\x6e\x60\x87\x3a\xd2\x3d\xcd\xb3\xb7\x74\xfb\x9e\x7f\x16\xd4\x68\xed\xed\x61\x9f\x27\xee\x9e\xa9\xe0\x85\x99\xb2\x6c\x2a\xb2\x3b\x62\x9f\xbe\xb0\x27\xe3\x13\x2e\x4b\x6d\xe2\x9a\x5b\xb6\x4d\x2e\x30\x2e\x43\x84\x52\x15\x68\xa8\x2b\xa0\xda\x53\x4d\xf1\xa0\x28\x55\x62\xac\x5d\xcd\xc7\x63\x99\x75\xa0\x65\xf1\xf8\x0c\x8d\xe1\xfc\x51\x64\x27\x80\x2d\xbb\x96\x7e\x3f\x95\x28\x4f\x42\xe4\xa1\x2a\x7d\xa4\x48\x10\x56\x03\xba\x49\x04\x63\x6e\x7b\xf7\x7f\x6b\x97\x7a\xe1\x6a\xf3\xf1\x3b\xb1\x82\xb2\x29\x0a\xe6\x66\x5a\x0b\x3d\x55\xc5\x26\x3b\xd2\x47\x59\xca\x59\x33\x83\xf4\x31\x91\x35\x90\xe2\x49\x5d\x44\x68\x92\xb0\x91\xb8\x5f\x11\x2a\xb0\x43\x03\x86\x68\x3d\xab\xfc\xd8\xb9\xb8\x00\xa2\x56\xba\xe2\x80\xb9\x2f\xf9\x14\xd0\x37\x3b\x07\xe0\xb2\x2a\xd6\xf7\x62\x7b\x30\x8e\x1f\x6e\x6e\x86\xdf\x0b\xd3\x61\x53\xa9\x65\x6b\x83\xec\xf7\x63\x38\x55\xa2\xed\x15\x3b\x45\x00\xd0\x67\xa2\xe0\xf3\x6e\xe9\xbf\x97\x5e\x30\x5f\x4c\x73\x4d\x23\xa3\x5c\x0c\x34\x79\x89\x8b\x14\xe7\x18\x82\xf6\x7c\x29\x92\xdd\x86\x41\x87\xf0\x67\xfc\xd6\xce\x35\x82\x27\xa4\x4b\xff\xa0\x1e\x98\x1a\x1b\x51\xb2\xc3\x90\x1a\x7c\x14\x17\x65\xf1\xd4\x9d\x60\x18\xbc\x09\xc9\xb5\x9f\x83\x6c\x29\x78\xee\x39\x47\x96\xba\xd8\x7c\x66\xa3\x00\xfb\xe4\xdc\xe2\x59\x4e\x0f\xed\x9b\x81\x97\xa7\xdf\x40\xbf\x9e\x8c\x00\xfd\x00\x71\xb2\x3f\xcb\x0a\x99\xac\xba\x56\xd9\xdd\x33\x8e\xf6\xcd\xe9\x10\x7b\xe8\x70\xb8\x7d\xdb\xe8\x78\xf3\xd2\xb1\x5f\x59\xde\xab\xe2\x1e\x41\xec\x6e\x4e\x87\xa0\x53\x0e\xe0\x5f\x53\xa5\xee\x74\xc8\xc2\x70\x0a\xc7\x8a\x29\xc9\x99\x50\x8d\x79\xde\xc1\x8f\xb2\x42\x70\xbb\xe5\x4c\x68\xa6\x1a\xd3\xda\x48\x7a\x6d\xe9\x5e\x7d\xf9\xa7\xff\xd9\xb6\xac\x5a\x61\xc5\x9a\x8e\x5a\xef\x55\xac\xe0\x56\xee\x65\xa7\xe1\xa2\x7e\xbb\x59\xb6\x20\x60\x83\x8f\x2a\xdf\xa4\xe3\xda\x26\x6c\x24\x8d\xf6\xe8\x66\x5a\x18\xcb\xa2\x08\x0e\x13\xc2\xe8\xbd\xa1\xd8\xea\xb5\x11\x8a\x55\x38\xa3\xbc\x64\x2a\x33\xce\xa5\xe7\xa1\x4f\x5e\xbf\x7e\xfd\x1a\x0e\xec\xeb\xbf\xfd\xed\x6f\x0c\x40\x88\x73\x91\xc9\xd9\x62\x43\x68\xf5\xd7\x37\x6f\x06\xec\x3f\x4f\x3e\x7e\xa0\xe0\x6c\x8d\x08\x22\xd8\xb3\x6d\x90\xbc\xac\x7b\xec\xff\x5e\x7f\xba\x74\x41\x6d\xba\xf5\x14\xb8\xc6\xcc\x4d\x6f\xc0\xce\x64\x0d\xb2\xb1\x43\x96\x74\xb1\xbf\xdc\x4c\xe1\x4e\xb2\x67\x87\x03\xa6\x4c\x54\x7f\x83\x34\x55\x0a\x7d\xc2\xa2\xb8\x50\x86\x08\xd0\x81\x0a\xe9\x70\x23\x31\x81\xc1\x97\x5f\x9e\x72\xd7\x97\x37\x19\xc0\x50\x7a\xac\x90\x77\x82\x8d\xf5\xf7\x88\x30\xe7\xa2\xe3\x31\xbb\xc0\x25\x4b\x63\x67\x7e\xe8\x90\x2e\xb4\x73\xbe\x4f\xee\xce\xf5\xd4\x51\x24\x29\xdd\x8e\x1e\x77\x9f\x62\x8a\x87\x63\xe8\xbb\x7f\xba\x07\xf3\xb9\xe7\xf4\xc7\x46\x8d\xe6\x46\x6c\x73\x4a\xe9\x55\xb2\x02\xc1\xde\x17\xdc\xa5\x1c\x5b\xf6\x04\x01\x77\x21\xb5\xd9\xb5\x77\x79\xf2\xb9\x42\x08\x18\xe4\xd9\x4c\x3d\x94\xa2\xd6\x53\x59\xb1\x19\x2f\xf9\x04\x82\x35\xa1\x36\x04\xd5\x4e\xaf\x05\xe0\xad\x5b\xaa\xdc\xcc\x08\x9c\x0b\x6b\xdd\x26\x03\x2d\x62\xd1\xd9\xca\xed\x34\x87\x9b\xda\xfe\xe8\x44\x13\x84\x32\xc5\xfe\x5e\xca\xba\xb4\xd6\x7a\x94\x2e\x1b\x49\x17\x0e\x57\x00\x31\xcf\x05\xcf\xfb\x98\xcb\x19\xf8\x57\x7a\x1b\x6d\x8d\x37\xe4\x70\xaf\x36\xce\x80\xe0\xb1\x12\x43\x25\x41\x44\x59\x7e\xd4\x14\x46\x56\x45\x98\x8d\x7f\x21\x54\x3c\xf4\x6e\x01\x1e\xb9\xd8\x39\x02\x94\xbd\x05\x12\xa9\xb8\xac\xd9\xa1\xef\x4b\x94\x06\xb8\x1a\x02\xca\x54\xbc\x0e\xf6\x82\x4c\xcd\x66\x5c\x1f\x39\xd4\x8e\xcc\x0e\x07\x09\x33\xb3\x6f\xf1\x22\x00\x7a\x59\x76\xb9\x14\x43\xa1\x1b\xb0\x50\xc9\x37\xc2\xea\xdd\x40\x23\x4b\xe0\xce\x82\x81\x88\xf4\xad\x9d\x25\xc6\xfc\x8e\x67\x77\xa2\xcc\xd9\x4f\xda\x4d\x26\x9f\x97\x7c\x46\x69\x0c\xe0\xf5\xa0\x98\x95\xd6\x81\xea\x05\x09\xc3\xde\x65\x64\x72\xad\x8a\x66\x22\xcb\xa7\xcf\xac\xd1\x62\x93\x77\xe9\x27\x8d\xd6\x82\x75\xe7\x87\xaa\x43\xd5\xf2\x3e\x13\xae\x30\x0b\x74\xfd\xe4\x01\x91\x89\xb2\x8b\xbd\x33\x09\xd2\x00\xc6\x14\x55\xab\xb2\x52\x25\x61\xdb\xbb\xfb\xbd\xb5\x11\xa3\x39\x42\x21\xef\xd6\x1c\xea\x4f\xd2\xe2\x9c\x9e\x6b\x14\xba\x7a\x77\x36\x14\xb5\x96\xda\x88\xd2\x6c\xc3\xca\xaf\x78\xae\x34\x7b\x57\xa8\xec\x8e\x9d\x09\x70\xdb\x74\xe5\xea\x57\xef\xce\x3c\x47\x5f\xcb\xca\x01\x35\x6d\x1b\x5e\xde\xcd\x67\xd1\x72\x3d\x90\xc1\xc7\x31\x4d\x3b\x8d\xb9\x6a\xd8\x03\x47\x6c\x47\x98\xdd\x80\xdd\xc8\xea\x2d\x3b\x2f\x75\x53\x47\xb9\x9e\x6d\x2f\x86\xd4\x4f\x70\x64\x80\x07\x51\xbf\x5d\x74\x67\xd8\x7f\x94\x66\x5b\xc7\xc6\x33\xc1\x61\xbe\xaa\x47\x5b\x64\x1b\x40\x18\x7b\x87\x5c\x8d\x1a\xa8\x07\x5a\x13\x86\xf8\x92\xd1\x92\x73\x55\x3b\x3f\x3c\x8d\xec\xb8\x1e\xe5\xc7\x57\xe7\x27\x67\x1f\xcf\x07\xb3\xfc\xab\xa9\x7a\xe8\x1b\xd5\x6f\xb4\xe8\x4b\xb3\x45\x2c\xb4\x98\xc3\xc3\x0d\x71\x5c\xd8\xca\x3b\x2e\xad\x24\x6c\x14\x20\x3b\xc2\xef\xf6\x46\xb8\x7a\x77\x66\xd9\xdb\x20\x96\x03\x8e\x85\xc9\x8e\x33\x51\x4d\x8f\xe9\x3b\xbf\xdf\x44\x67\xaa\x94\x46\x6d\xac\x7b\x76\xc2\x32\x55\x14\x28\x5b\xda\x23\x71\x2a\xaa\x29\x73\xef\xbe\xcc\xe8\x57\x88\xc4\x5d\x2b\xfa\x74\x88\xd4\xab\xd4\x46\xdf\x74\xa0\x4a\xdb\x98\x88\x32\xda\xc9\x7a\xb4\xfc\x48\x7d\x96\xbd\xdb\x85\x50\xb8\xd1\xa5\xb8\x44\xfa\x7b\xd1\x09\xaf\x07\xad\x84\xf2\x85\x57\xa0\x14\x6d\x67\x4a\xba\x76\x3d\x90\x1b\x65\x6d\xc4\x90\x6b\x0b\xb2\x7b\x04\xf1\xcb\x1b\x33\x15\xa5\x71\xb1\x44\x38\xaa\xf4\xb4\x5f\x8c\x5d\x5c\x49\x0e\x49\xc7\x35\xc0\xbd\xf9\xe3\x1e\x2b\x05\xb2\xd8\xd9\x8a\x6e\x2b\x80\x05\x32\xb7\x8d\x17\xc9\x9c\xe7\x33\x59\x7e\x66\x42\xef\x28\x0d\x79\x06\xb6\x70\xdf\xec\x40\x18\xda\x8b\x40\x7b\x11\x68\x2f\x02\xed\x45\xa0\xbd\x08\xb4\x17\x81\xfe\x34\x22\xd0\xd2\x2a\xcd\x7b\x39\x68\x2f\x07\xad\x92\x83\x84\xbd\x61\x61\x8b\x43\xa9\xb8\xf5\xd2\xd0\x62\xfb\x76\x10\x68\x52\x92\x14\x45\xa0\x3a\xbc\x17\x17\xc1\xdc\x27\xef\x7d\xc9\xc9\x7b\xfb\x6c\xb7\x3f\x4b\xb6\x5b\xc7\x04\x22\x2a\x49\xfb\x01\x4b\x16\xc3\xc1\x5d\x7e\xe0\xa1\xc4\xbd\xaf\xbf\x35\x87\xbf\xc9\xed\xed\x45\x74\x5f\x5a\x83\xbb\x12\xa1\xf9\xa1\x3e\x0a\xea\xc3\x72\x96\x40\x9a\x90\x06\x90\xe3\x3f\x61\x36\xd3\xd2\xf5\xec\x94\xdf\x94\xb0\x35\xfd\x94\x84\xa7\x15\xcc\xf7\xf7\xcb\x81\x8a\x17\xb3\x9d\xca\xb4\x8b\xe5\x5c\x02\xef\xb9\x1c\x34\x97\x34\x9b\x14\xa6\x54\x8d\x00\xe0\x36\x8f\x70\xb7\xd7\xad\x22\x04\x3f\x40\x26\x21\x81\x43\x29\x04\x38\x06\x48\x99\xd1\x1c\x51\xc9\x1e\xa0\xce\x10\x74\x25\xad\xdc\x31\x8c\xf1\x74\x63\x40\xb3\x2b\xe7\xa6\xfd\x82\x53\xd4\xfc\xef\x2f\x95\x3c\xba\x5c\x2a\x49\x9a\x3e\x37\x85\x74\xe9\x27\x02\x92\xf7\x13\x25\x20\xff\x62\x2b\xc1\x34\x02\x63\x5f\xc1\xee\x38\x84\x55\x8b\x1a\xc0\x1d\xe1\x72\xeb\x20\x14\x15\x5c\x9b\x9b\x9a\x97\x1a\xbe\xf9\xb9\x41\x93\x00\x55\x98\x6b\x83\x58\x49\x26\x06\xbe\x64\xc6\x8f\xca\xa5\xce\xaa\xd2\x03\xd8\x03\xb2\x1e\xc4\xef\xac\x08\xbc\x7d\x29\xdc\x5b\x3b\xc6\x30\xb2\xed\x12\x80\x36\x43\x6a\xdd\x04\xb0\x4f\x17\xeb\xe9\x17\xe6\x95\xa6\x25\x7b\xce\x28\x96\xf3\xca\xe5\x9c\x2d\xa0\x55\xe2\x00\x7a\x2e\xc2\xfd\x06\xc0\x99\xdf\x5b\x4d\xb7\xe7\xe0\x13\xb7\x29\x96\xb4\xd9\xd4\x78\x43\xf6\xc5\x15\x94\xff\x64\xd4\xe1\x8e\xca\x52\x0b\x30\xff\x20\x65\x6f\xbb\xd5\x94\x36\xa0\x98\xac\x7c\x07\x45\xe6\xd4\xe6\xb4\x7c\x99\xf6\x00\x27\x5f\xb6\x8e\xf4\x14\x80\x93\x55\x3b\xbc\x7d\xa0\x6f\xd4\xcb\x71\xd4\x7b\xb6\xe2\xd2\x7c\x6e\x24\xe2\xf2\x7b\xf9\x39\x36\xca\xbd\x8a\xf9\x67\x51\x31\xf7\x80\x2a\xf8\xfb\x67\x95\x89\x77\x0f\xad\xb2\x5a\x3f\x7d\xe2\x35\x07\x2a\xab\x5c\xa1\xad\x3e\xc3\x20\x38\x93\xa5\xd5\x91\x3a\x26\x66\xb9\xb4\x8a\x72\x21\x4f\xc3\x8a\x68\x14\xf8\xc9\x4a\xf1\x50\x84\x40\xbf\x08\x0e\x66\xe4\x8a\x5a\x3c\x48\x33\xb5\x92\x24\x2f\x01\x6d\x36\x29\xf7\xcf\xb2\x9a\xeb\x29\xa0\x7a\xdb\x4e\xa5\x59\x4c\xee\xf1\xa0\xb1\xa9\xbf\xe1\x35\x3b\x8c\x6b\x06\x2c\x7b\x81\x71\x0d\x18\xff\xf6\xbf\x98\x5e\x09\x03\x3a\xda\x75\xc8\x3b\xed\xc7\xa6\xf5\xa4\xad\xf6\x9a\x73\x58\x57\x67\x7c\x70\x1d\x0d\xa2\x52\xe6\xc0\x51\x29\x69\x54\x6a\xcb\xb1\x1b\xa9\xa7\x3e\xbf\x41\x3c\x52\x32\x35\x40\x7f\x5b\x79\x20\x71\xe9\xb6\x33\x9f\x5e\xec\xb2\xfc\xea\x61\xca\x4d\x5f\xea\x3e\xef\x77\xb8\x4c\x77\x90\x66\x40\x09\xc9\xed\x35\xe7\x39\x0a\xc6\xbc\x18\x2e\x3f\x04\xec\x29\x9e\xc2\x05\x87\x0f\xa5\x6b\x23\xa4\x1e\x1f\x89\x82\xfd\xd6\x88\x7a\x8e\xf8\xf9\x01\x1c\x91\x8e\x40\x40\xc3\xf6\x7b\x9f\x61\x50\xc0\xc5\x98\xc5\x9d\x91\x3d\x10\x89\x34\x31\x06\xa2\xf0\x07\x36\x45\xba\x88\x5d\x19\x8f\x61\x02\xb3\x08\x76\x47\x76\x27\xe6\x98\xc7\x46\x99\x2a\x30\x98\x08\x98\x5b\x96\x4c\xd5\x39\x52\xd3\x48\x04\xe6\x11\xf2\x52\x96\xf3\x96\x1e\x93\xe3\x50\xe0\x3f\x8c\x8e\x46\xa6\xca\xd6\x68\x9e\x48\x67\x76\xf5\xee\xa5\x78\x00\x82\x93\xe5\xa4\x6f\x59\x46\x9f\x92\xfa\x8f\xf1\x23\xc7\x5f\xc1\x7f\xfb\x6e\xe3\x57\xdc\xdc\xb1\x46\xd2\xa6\x99\xdf\x07\x3e\x93\x4e\x3b\xc9\x53\xb0\x23\xa9\xa1\xc3\x17\x0b\x69\x43\x6a\xca\x31\x93\xa5\x6e\xc6\x63\x99\x81\x2c\xe5\xd8\x03\x99\x8c\x0d\x64\x14\x11\xaf\x30\xfc\x4e\x00\x89\x64\x22\x17\x65\x26\x90\x22\x39\x73\xc3\xb8\x12\xe3\x17\x3d\xfe\x95\xca\xfb\x66\x01\x26\xf0\xd9\xd9\x33\xeb\x6c\x94\x4f\xbd\x54\x17\x2a\x06\x82\x98\xea\x2a\xe9\x45\x75\x02\xb7\x77\xb8\xb9\x9b\xe7\xaa\xdb\x8d\x70\x93\xdc\x02\xe1\xde\xf2\x1b\x7d\x88\x37\x28\x60\xa7\xbb\x5a\x02\xad\x4b\xdc\x61\x60\xaf\x3c\xbb\x3b\xcf\xf0\xea\x5c\xa5\xf0\x2a\x5d\x6a\xd2\x61\xc3\x34\xd1\x58\x8c\x25\x75\xd7\xad\xfc\x2b\x9d\x6c\xd3\xae\x0b\xa2\x6d\x30\x67\x76\x54\xd1\x92\x47\x9f\xb3\x30\x21\x54\xc0\x06\xf6\x2f\xf2\xad\xe8\x2e\x5c\x5b\x80\xe6\x45\x3c\x3d\x01\x04\x29\xbc\x57\xcb\x33\x2c\xc7\xde\xd6\x5b\xf8\x77\x4d\x7b\xce\xbf\xf0\xbd\x28\x5d\xc9\xe4\xf5\x53\xfd\xb4\xf0\x02\xab\xc5\xb8\x00\xb4\x18\x48\x14\x0a\xbf\xd3\x4c\x56\x38\x34\x9e\x3e\xc1\xad\xea\x54\xc3\x81\xdf\x6a\x1b\x91\x55\x78\xd6\xf1\xb9\xb9\xc2\x96\x42\x70\x7b\xb5\x71\xb1\xe3\x59\x39\x91\xf8\x0f\x2e\xbb\x76\xd4\x98\xfd\x32\x3e\xdf\xe6\x8a\xd6\x9c\xf7\x52\x14\xf9\xf5\xa2\xb4\xbc\xb8\x31\x4b\xda\xc7\xb7\x65\xd0\xd9\x42\x25\xb4\xc3\xac\x6a\x7a\x6c\x26\x66\xaa\x9e\x1f\xb9\xa4\x63\x59\xbb\x52\xa5\xb4\x54\x1b\xef\x4d\xdf\x75\x87\x22\x78\xbe\x56\x20\x44\x21\xbd\x75\x49\xda\x79\x9c\x66\xd8\xa3\x84\x69\x5e\x60\x4d\x99\xf2\x9e\xdd\xf3\x55\x12\xe3\x3a\x5b\x4f\x2e\xef\xa5\x5e\x54\x32\x9e\x6c\xea\x19\x78\x04\xb9\x1f\x1b\x5e\x1a\x69\xe6\x5d\x20\x39\x49\x3e\x4c\x16\xd3\x23\x46\x3e\x56\x4a\x03\x5b\xa2\xbd\xe8\x39\xc9\x1c\x74\xbd\xdb\x83\x37\xb7\x07\xab\x0e\xaa\x6e\xc7\x6d\x2f\xa7\x07\x5c\xd7\xb7\x91\x5d\x50\x11\x60\xd5\xae\xf3\xf6\x68\x40\xbb\x22\xf9\x1f\x1b\x95\x98\xe7\x56\x91\x3a\xb4\x63\x5a\x18\xcd\xf8\x64\x52\x8b\x89\xbd\xcf\x7e\x83\x1f\x6b\x61\x67\x83\x19\xe9\x4c\x94\x10\x14\x99\x43\xf1\x4f\x00\xbb\xac\x78\x17\xb0\x84\xbd\x6f\x61\x1f\x7f\xb5\x37\x8e\x6f\xc7\x31\xf7\x00\xce\x8b\x2c\xed\xe9\xa1\x4e\xce\xb0\x08\x4c\xed\x73\xd7\xe2\xd8\x65\xa4\x52\xbc\x0a\x9d\x23\x94\xe2\x95\xa0\x0a\xff\x9e\x95\x23\x9b\x87\x32\xdd\x26\xa8\x97\x8d\xe6\x93\x7f\xbd\x9a\x25\xe9\xbd\xb9\x63\x97\x48\xd4\xf5\x46\x8f\x7f\xab\x6d\x5a\xb9\x24\xbd\xb5\x41\xe9\xdf\xfb\xf7\xbf\xe8\x3b\xb8\x8b\x7f\xff\xc2\xb6\x59\xb7\xd1\x64\x05\x7e\xb2\xfe\x57\xa9\x42\x66\xf3\xa8\x22\xa0\xed\x4d\x1f\xef\xda\x74\x14\x9f\x9c\x8e\x96\xa2\xbd\xbc\xf2\xa7\x96\x57\xf6\xce\x7c\xfc\xfd\xb3\xdc\x56\x2f\xe1\xc4\x6f\x4b\x5c\x1d\x6f\xac\x95\xc2\xd7\x14\xf7\x19\x4e\x8e\x51\x4e\x04\x01\xcb\x04\xbc\xd8\xe1\x16\xb3\x5d\x6c\xe7\xe9\xdc\x85\xa9\x62\x25\x5f\x6b\x2d\x07\x4c\xd4\x85\x2d\x08\x13\x7b\xb6\xe3\x35\xf0\x65\x7e\xad\x2a\x1d\x2c\x18\x2f\xc3\xe1\xbb\xf8\x05\x75\xa6\x2a\xb1\xc4\x44\xd6\x69\x01\x03\x82\x42\xd2\xcb\xba\x75\x4a\xbe\x17\xa1\x95\xa7\x31\x8d\x63\x59\x18\xcb\xa0\x01\xd8\x0f\x5e\x59\xf4\xe7\x62\xb5\x64\xf2\x2c\xd6\x3c\xbb\x43\x4f\x2e\x27\xf1\x76\xd4\x18\x26\x1e\x2b\x28\xf0\x9c\xb3\x46\xdb\x1b\x22\x19\xe6\x27\xc8\x2e\xf7\xc5\xba\x47\xb2\x44\x69\x06\x50\xb1\x7c\xed\x7b\x27\x69\xbc\x07\x9c\xc5\xd8\x1c\x04\xa3\xe8\x21\x98\x22\x0d\xf1\xe4\xf2\x8c\xa5\x13\x3c\x94\xe3\xb4\x24\x89\xfd\xe3\xa8\x87\xf3\x18\x09\xc2\x71\xcf\x57\xc4\x35\x63\xb7\x4f\xcc\x41\x76\x6b\xf7\xb4\xf5\x02\xb7\x3c\x20\xe6\xa5\x35\xae\x71\x31\x97\xe0\xd9\x77\x73\x44\x3d\x37\x2d\x79\x93\x7e\xf0\x34\x8e\xb6\xd9\x77\xba\xd0\x3a\xe1\x6a\x5e\x83\x8a\x8f\x34\x40\x81\x3b\x4f\x49\xa3\xbb\x14\xca\xf8\x63\xb0\xb4\x1f\x16\x59\xda\xd2\x05\xf8\xe2\x78\x5a\xa3\xc5\x1f\x60\x79\x01\x82\x4f\xa6\x9e\x78\x4f\x47\x46\x19\x5e\xa0\x4a\x1e\xbc\x8c\xc4\x7b\x08\xca\xcf\x1b\x63\x57\xc4\xc1\x2f\xac\xd0\xae\xce\xd2\x55\x54\xef\xbc\xc3\x61\x8a\x9b\xb7\xa2\x3f\x32\x35\xab\x1a\x23\x96\x97\x52\xef\x92\xcf\x02\x04\xf8\xe5\x6f\xf5\x07\x3c\x28\xe9\xe4\x67\xfc\x11\x42\x0c\x39\x22\xc1\xa8\xf1\xc2\x72\x00\xbf\x55\x0f\x5b\xc0\x93\x24\x99\xd4\xc7\x98\x1a\xd9\xa7\xee\xfb\xbe\xfb\xbe\xf7\x3d\x6d\x71\xc8\x9c\x1e\xf4\xe5\xaf\xfe\x95\xd3\xd8\x5a\xeb\x4f\x21\x9e\xeb\xd6\xdf\x29\x03\x70\x3b\xfa\x7e\xac\x52\x39\x93\xc6\x90\xe3\x2d\x2a\x6f\x01\x61\x6c\xb1\x2f\x8a\x76\x5e\x8e\xf1\x3a\x96\xda\x07\x2d\x16\xf3\xf8\xaa\x85\xec\xa6\x07\xa9\x05\x26\x3b\x41\x9d\x18\x38\x06\xb0\x83\x7d\x57\x30\x1d\xa4\x91\x2f\x86\x1a\x9e\xcb\x50\x08\xad\xe8\x53\xd5\x0e\xa8\x59\xd0\x18\x93\x86\x10\x02\x16\x45\x66\x60\x3c\x1f\xaf\xaa\x42\x86\xb8\x41\x3f\x99\x0e\x5c\xc4\xaa\x90\x9b\x52\x31\x6c\x1b\xbb\x7d\x0e\x61\x09\x5e\xa2\x30\x48\x44\xa6\x86\xef\xeb\x85\xef\x6f\x93\x35\xa6\x8a\x8d\x1e\x4a\x55\x10\x10\xa9\x87\x7c\xb2\xbf\xbc\xcc\x78\xba\xe6\x6c\x25\xe3\x01\x68\xa7\x97\x19\x4f\x57\xf4\xd8\x64\x3c\x00\xde\xb1\xc3\xf1\x3c\x9b\xf8\x33\x5e\x88\x8b\x4f\x4f\x86\x56\x5d\xfb\x5e\x8a\x90\x5c\xf9\x36\x8c\xde\x6a\x97\xe2\xda\x2d\x26\x58\xc0\xfd\x7a\xa1\xaa\x6d\x31\xc6\x57\x84\xc0\x42\x4f\x9f\x4e\x48\x13\x6e\xc4\x03\xdf\x04\x14\x74\xe3\x46\xc9\xf3\xdc\xaa\x93\x4e\x20\x73\x6b\x7a\x32\xbc\x60\xdf\x63\x4f\xdb\xd4\x73\xac\x95\x41\xe5\xed\x4c\xcd\xb8\xec\x92\x2c\x1a\xc3\xed\xb8\x41\x0c\x7d\x37\x0c\xfb\x89\x73\x49\x81\xfb\x43\x62\x3a\xa0\x96\xfd\x0b\x55\xb2\xfb\xbd\xc0\x21\x23\x48\x68\x62\x30\x11\x10\x92\xdb\x33\x60\x49\xa0\x3e\x42\x6d\x02\x2d\x20\xc5\xf7\x1e\xaf\xf6\x7a\x06\xd7\x35\x48\x1e\x86\x32\x22\xac\x7e\xee\x90\x93\x7a\xec\x83\x9a\xc8\xd2\x1d\x1d\x30\x5c\xd8\xe5\xe4\xb2\x58\x65\x4d\xd0\xc5\x79\xc9\x47\xc5\xa2\x72\xd4\x3e\xd7\x05\x9f\xa0\xb5\xce\xb6\x3e\xce\xa5\x86\x90\xd5\xeb\xeb\x0f\x8c\xac\xb0\x59\x64\x2a\x21\xd2\xf7\x31\x38\xb8\xf1\xdb\xec\x15\x52\x67\x87\xfa\x1a\x17\x98\xb0\x2d\xb4\xaf\x20\x86\x49\xf3\xf0\x3e\xc9\x64\xae\xb8\x87\x4f\xc8\xb9\x99\xca\xec\x6e\x18\x21\x9c\xab\xda\xfe\x56\x46\x3f\x25\x5c\xa5\xfd\x6c\x9b\xbc\x6b\x18\xd0\xb0\x1b\x9e\x9a\xa3\x8a\x6b\x9a\x86\x7d\x6d\x69\x55\xbc\xc0\x31\x58\x0e\x47\x7d\x9b\xa1\x01\x9b\x7d\x22\xaf\x71\x0b\x4c\xfc\x1c\x32\x3a\x3c\x6f\x91\xa5\x9b\xc1\x16\xc3\xc1\xcd\xea\x10\x01\x17\x0f\xc9\xef\x71\x1b\x71\x9d\x14\x64\xb7\xa0\xee\xfa\x21\x01\x7c\x71\x49\xa5\x4e\x4b\xc1\xec\x38\xb1\xdc\xdd\x32\x8b\xcb\xbf\x94\x51\xd1\x6f\x5b\x47\x82\xd1\xb4\x9f\x26\x4e\xec\x85\x08\x57\x18\x76\x2f\x45\xec\xa5\x88\xf6\xb8\x7f\x57\x7c\xc5\xbd\x28\xb1\x17\x25\xf6\xa2\x44\xe7\xe1\xec\x45\x89\x5d\x8a\x12\xcb\x9d\xc3\x8b\x2e\x48\xf0\x54\x86\x92\xce\xad\x44\xc3\x93\xcb\xb3\x50\xb8\x9f\x52\x58\x43\x9b\x08\xcc\xcc\xf6\x92\x7b\x93\x64\xdc\xdf\x93\xfc\x02\xe0\xae\x3c\x47\xe7\x6f\x87\x5c\xbd\x13\x1f\x7e\xb5\x30\x8d\xc8\x75\x31\x9a\xd3\xe3\x96\x3f\xa6\xa3\x27\xf4\x69\xbe\xf4\xdc\x79\x4f\xdc\xea\x47\x5e\x94\xcf\xef\x45\xdd\x3c\xa4\x8d\xb4\xb1\x61\x57\x29\xb6\xcb\x97\x04\xb7\x07\x8c\x4c\x72\xda\x17\x26\xe4\xb4\x01\xf6\xd4\x62\x7c\x20\x77\x97\x96\x7b\xa7\x16\x10\x4d\x18\xa8\x09\x8f\x78\x48\x0b\xef\x40\x3d\xae\xc7\xee\x19\x9e\x34\xb0\x57\x1a\xbf\x6f\x77\x76\x2a\xa1\xfa\x1b\x77\x9e\x53\x17\x47\xf0\x33\x2f\x64\xee\x07\x8d\xb6\xec\x8b\xb2\xc7\x2e\x95\xb1\xff\x39\x7f\x94\xda\xe8\x1e\x3b\x53\x42\x5f\x2a\x03\x7f\x6e\xc3\x93\xed\x70\x9e\xc8\x03\xc3\x92\x79\xa8\x4d\xbf\x1f\xc1\x58\xba\x0d\x47\x86\xa9\x6f\x3a\x83\x25\x03\xaa\x85\x53\x18\x85\xf8\x69\x92\x5a\x44\xd8\x68\xa9\xd9\x45\x69\xaf\x5c\x5a\x33\x08\x55\xc5\x9c\x7f\xec\xc2\x05\x57\x94\xaa\xec\x43\xe2\xfe\xd2\x3e\x70\xa9\x6d\x3f\xf1\x62\xaf\xe9\x8e\xba\x82\x94\x73\x7c\x42\x19\x86\x3c\x13\x39\xcb\x1b\x2c\x29\xc7\x28\x75\x55\x66\x0c\x12\x57\x19\x24\xb4\xfe\x4e\xd1\x12\xcb\x6f\x91\x40\x1d\xbd\x25\x54\xff\xec\x4b\x43\x64\x99\x9a\x55\xc3\x5a\x59\xb5\x6d\x9d\xea\x99\x34\xf4\x81\x16\x50\xf7\xe2\xd8\xdb\xe3\x5f\x69\x2b\xef\xda\x86\x56\x5a\x81\x96\x24\xd9\xeb\x01\xfb\xe4\x4a\xb0\xfb\x47\xc8\x62\x08\x51\x33\xa9\xf1\xb9\xda\xff\x63\x65\x73\xab\x9a\x2d\x0e\x79\xd9\xb0\xdb\xcd\x1d\x7c\xa0\xa0\xe2\xb2\xd1\x64\x40\x7e\x40\xf5\xd5\x21\x57\x94\x2a\x8f\x25\xc9\x46\x23\x8a\x41\x98\x81\xa3\xb6\xaa\x16\x91\x48\x14\xbf\x6d\x14\x7b\x50\xf5\x5d\xac\x20\xdb\x21\x8a\x32\xb7\x04\x58\x71\x33\xed\x11\x1f\xba\x17\x4e\x65\xb8\x6b\x46\xa2\x10\xe6\x55\x22\x67\xb5\xd7\xd5\xce\x0c\x15\x05\xe8\x19\x8a\x3e\xe2\x2a\x82\x03\x93\x5c\x3c\xb7\x07\x1f\xdc\x0a\x6c\xa5\x2e\x77\xf0\x26\xe1\xa7\x22\xc9\x5c\x66\x53\x76\x27\xad\x7a\x33\x5e\x18\xb5\x43\x8e\x20\x07\x60\x60\xb1\xde\x59\xf8\xf6\xb6\xbc\x2d\xfd\xa0\x59\x7f\xeb\x7d\xba\x6a\x4a\x23\x67\xc2\x49\xf6\xfd\xd4\x73\xc4\x6a\x7c\xec\xb5\x17\x4f\x94\xad\x6e\x7e\x2a\x61\x13\xec\x77\xfb\xac\x54\x4b\xda\xb9\xb9\xbc\x00\xc2\xe1\xa6\xe3\xbd\x3c\x86\xb5\x29\x49\x8e\x5a\x11\xb7\x9a\x4b\xbb\x81\x33\x59\xd2\xc5\xb9\x24\xcb\x7f\x2c\x45\x91\xeb\xbe\x51\xfd\xa8\xb1\x78\xd7\x36\x06\x2c\x3f\x90\x81\xe6\xdc\x6f\x31\x73\x5c\x58\x89\x8d\x91\xae\xa8\x5e\xaf\x67\x4e\x56\xc7\x9e\xaa\x22\xd7\x4e\xe1\x06\xb0\x5e\xd0\x16\x1c\xf0\xaa\x9d\x25\x1e\x5f\x0c\xd8\x19\xcd\x2d\xbd\xba\xda\x38\x78\x89\x90\x0a\x71\x66\x5f\x86\x35\xf0\x47\xbc\x80\x6a\x96\x53\x5e\xb2\x8f\xfc\x11\x3f\x78\x2d\xff\x29\xb0\x97\x7d\x7e\xc7\x17\x9d\xdf\xb1\x2c\x70\xbe\x5b\xe8\x4b\xc8\xa1\xb7\xfb\x9c\x7c\x79\x7b\x74\x26\xa0\x2e\x2f\x30\x47\x46\x22\x0c\xad\x3f\xe7\x96\x81\x0a\x92\x65\x00\x2f\x0c\x15\x1e\x5e\x54\x53\x5e\x36\x33\x51\xcb\x8c\x65\x53\x5e\xf3\xcc\x88\x5a\xf7\xd8\xab\xfe\xab\x1e\x7b\xf5\xeb\x2b\x2b\x1f\xbd\x1a\xbc\x42\x22\xd7\xa2\x96\xbc\x80\x1d\xb2\xb3\x08\x3a\x5d\x38\x1e\x20\xc7\x8f\xb8\x16\xdf\x7d\xcb\x44\x99\xa9\x1c\x0c\x86\x35\xa0\x9c\x2d\x64\x6b\xf0\x7a\x24\x4d\xcd\xeb\x39\x3b\xa4\x80\xdb\x39\x08\x6d\xf8\xc2\x11\xf6\x88\x99\x1e\x53\x51\x03\x08\x1a\x46\xf0\x00\xc3\x76\x14\x61\x94\x2a\xf4\x40\x0a\x33\x1e\xa8\x7a\x72\x3c\x35\xb3\xe2\xb8\x1e\x67\xdf\x7e\xf7\xed\xbf\x7d\xa5\xd1\xba\xd1\x5f\x01\x47\xb1\x2e\xc0\x49\xce\x66\x8d\xe1\xa3\x8d\xf2\xc0\x85\x6b\x07\x40\x51\xf6\xb2\xb4\x74\x0f\x68\xb9\x02\x2a\x5f\x51\x28\x2e\x4c\x46\x1b\x55\x47\x66\x05\x5c\xb8\xac\x9d\x45\xc2\x0e\xe1\xee\xa5\x60\x5d\x97\x21\xe1\x2a\x99\xcf\x54\x0e\x51\x43\x47\x21\x66\x37\xfe\x28\x96\xd8\xb2\x7c\xa6\xd5\x1e\x30\xa3\xcb\x39\x21\x89\x9f\xc5\x58\x56\x50\x67\x25\xe0\xae\x8d\x84\xe7\x55\x68\xb8\x03\x0d\xdd\x4f\xf4\xbc\x9a\x8a\x99\xa8\x79\xf1\x33\xd5\x25\x1b\x0b\x6e\x8f\x18\x9b\x2c\x02\xd4\x74\x32\xd7\xed\x13\x80\xfe\x2c\x09\x40\x7f\xf8\x84\x65\x58\xae\xb3\xad\x99\xfb\x96\xec\x3b\x7c\x16\x43\x3e\x5d\xc1\xf2\xb9\x25\x6b\xcb\x11\x47\xb2\xe4\x50\xcf\x3c\xe2\xb4\xa5\x3b\x0a\x96\x17\x0f\xd8\x05\x18\x51\x7c\x61\x25\xa8\x73\x0e\x1e\x13\xac\xde\x8e\xcb\x20\x01\x1f\x6d\x26\xcc\x54\xe5\x03\x76\x52\x2c\xc2\xe6\xf1\x5a\xa0\xe2\x6a\xb9\x14\xdd\xe0\x79\x90\x5d\x54\x89\x9d\xf6\x00\x64\xcd\xfe\x13\xb4\xde\x72\xce\xc4\x23\x42\x34\x06\xbd\x1d\x4b\x38\x89\x7b\xe1\x41\x51\x1e\xa6\x02\xf1\xd7\x61\xd8\xee\xb4\x9d\x0c\x2f\xba\xc6\x30\x3f\x4d\x8f\x80\x10\x6b\x70\x22\x65\xb2\x90\x80\xa9\x5f\xd5\x6a\x52\xf3\xd9\x8c\x1b\x99\xb1\x29\x2f\xf3\xc2\x0e\x05\xd5\x0a\x7f\x5f\xee\x28\x04\x6c\xb9\x28\xbd\xc3\x74\x30\x92\x62\x93\x67\xcf\xcd\x01\xc3\x3e\xcf\xcb\xfb\xcd\xae\xe3\xb4\x25\x59\x8b\x20\xe6\x0e\xd7\xd2\x28\x56\x51\xbd\x0a\xe2\xaa\xf7\xb2\x56\x25\xd8\xfb\xee\x79\x2d\xed\x5d\xa2\xc1\x72\x3e\xb0\x1a\xda\x0d\x29\x53\x60\x52\x23\xd1\xc2\xf0\x7a\x22\x0c\x75\xf8\x4a\xc7\x52\x34\xe8\x7d\x9e\xa9\xa3\x96\x2b\xe6\x7d\xbc\x17\x2a\x2e\x6b\xa8\xca\xbf\xf4\x9b\x1d\x64\xeb\x72\xb3\xf1\xec\x32\x32\x9c\x91\x93\xce\xec\x18\xfe\x11\x62\xfc\x8f\xbf\x82\xff\x3c\x9d\xbf\x3b\x20\xa0\x4d\xc8\xff\xc8\x6a\x12\x07\x18\xed\xa0\xd3\x54\x48\x4d\xee\x7a\xb5\x3f\xdb\xde\x0c\x5f\xff\xbb\x98\x77\xf0\x3d\x2c\xb4\x8d\xe8\xd0\x4a\xbc\xa0\xaf\x61\xa3\x0e\xdb\x8e\x18\x75\x9b\x4c\xa6\xd4\x6f\x24\xfb\x7a\x78\x20\xe0\x6a\x03\x16\xd9\x66\xee\xc1\x1c\x41\xed\xee\xc4\x36\xde\xfd\x3d\x31\xda\xb5\x03\x8c\x64\x1d\xd4\x98\x1d\xd0\xe5\x72\x3b\x89\x25\x82\x1d\x58\x41\x6b\x61\x36\xa0\x3e\x84\x46\x29\x0a\x40\x67\x72\xdd\x5b\x00\xfe\x70\x08\x0f\xc4\x08\xb6\x85\x76\x48\x73\x39\xf4\x12\x01\xe0\xd9\xfe\x47\xec\x73\xa5\xe8\xba\x07\x74\xf8\x17\xd2\xe7\xf6\x80\x0e\xf8\xfb\xcb\x4a\xf0\xbb\x47\x72\xc0\x7e\x87\xb5\xfa\x6f\x34\x80\xad\x73\xd0\xe7\xbc\x42\x1f\x36\x72\x26\xd0\xfa\xc0\x43\xf2\xdf\x00\xb2\x4d\x01\x2d\x5b\x8b\xe8\xe8\xcb\xa2\x40\x0f\xf0\xb3\xb4\xbb\xb6\x72\x3a\x84\x78\x52\x9a\x3e\x89\xf2\xcb\x4c\xe7\x54\x13\x12\xdc\x25\x20\x88\x0c\xd8\xa5\x32\xde\x65\x8d\x06\x2c\x99\x63\x01\xe2\xc2\x79\xe0\x61\x5e\x49\x5c\x8e\x2f\xcc\x80\x60\x15\xe8\xaf\x99\xa9\xbc\x4b\xf6\x76\x27\xc6\x9f\x94\x97\xef\x61\x7e\x74\xaa\x9e\x2c\x99\x5d\x2a\xbf\x65\x22\x77\xa2\x4f\x58\x48\xb7\x72\x5e\x37\x0f\x4b\x48\x0e\xac\x87\xa9\xd2\xe4\xd5\xa7\xec\x62\x2b\x31\xd9\xbb\x96\x76\xce\xfd\x4c\xc9\x84\x17\xe3\x76\xce\xbf\x3d\xc6\x22\xc7\x2d\x58\xf3\xe5\x80\x6b\x50\x71\x33\xd5\x3d\xaa\xc0\xb0\xf0\x36\x31\x54\x22\x02\xf8\x20\x8a\xe6\x52\x47\x7d\xa0\x93\xcf\x47\x26\xa2\x52\x97\xd8\x49\x7b\xf1\x7c\xb5\x30\x4d\x85\xfd\x8b\xba\x56\xb5\xfd\xb0\xd0\xae\xd6\xc5\x8c\xd7\x77\x22\xf7\x48\xa8\x03\x36\xb4\x23\xf4\x62\xa3\xf7\x8e\x3a\x09\xc4\x7e\x93\xac\xe7\xf0\x91\x57\x83\xc1\x2b\xac\x5b\x6f\xf5\x09\xc3\x6b\x83\x01\x5e\xf6\xf7\x1d\x87\xfb\xfc\x5d\xcc\x6f\x94\x1d\xde\xb3\x6e\xdc\xbd\x86\xf0\x42\x1a\xc2\x56\x62\x7f\x08\xf1\xdd\x24\xfb\xfb\x96\x69\xd0\x3d\xcd\xc7\x3f\x05\x63\xda\x14\xcc\x19\xaa\x99\x4c\xe3\xa8\x5e\xcb\xe3\x6a\x61\x6a\x29\xee\x45\x60\xe1\x60\x91\x7b\x02\x5c\x6b\x57\xfa\x91\x9a\x35\xa5\xfc\xad\x41\x06\x0a\xdc\xdc\x7f\x05\x47\xe2\xe6\xe3\xf9\xae\x4f\xdc\xde\x4e\xef\xc5\x09\x6c\x1e\x1a\x0e\x21\xad\x75\xcb\x33\x3f\x4e\x64\x2f\x91\xc6\x0e\x0c\xd2\x51\x09\xce\xe9\xb3\xa5\x7e\xc2\x08\x3a\x26\x68\xf8\xeb\xf9\x3a\xb9\x9e\x77\x7e\x29\xef\xe2\x2a\xbe\x8e\x6f\x5a\xed\xd2\x34\x98\x7a\x28\x45\x0d\x11\x71\x98\x7b\x0e\xc6\x38\xcb\x7a\x7d\xee\xb2\x80\xc4\x5c\x59\x4e\x3a\x5c\xbf\x74\x5b\x77\x88\xed\xfe\x44\x0c\xe5\x2d\xdc\xec\x6c\x64\x79\x43\x43\x26\x61\x2d\x0c\xab\x44\x3d\x93\x18\x21\xca\x54\xe9\x63\x7e\x71\xfe\x23\x5f\xee\x25\x0a\xb4\x29\x99\xca\x8c\x53\x60\x7d\x1d\xa2\xd7\xaf\x5f\xbf\x86\xf9\xbc\xfe\xdb\xdf\xfe\xc6\x20\x64\x3c\x17\x99\x9c\x2d\x36\x84\x56\x7f\x7d\xf3\x66\xc0\xfe\xf3\xe4\xe3\x07\xc6\x33\xe0\xaa\x88\x21\x84\x3d\xdb\x06\xc9\xcb\xba\xc7\xfe\xef\xf5\xa7\x4b\x17\x2c\xa9\x5b\x4f\x21\x44\xdd\x4f\xaf\x55\x26\xea\xbb\x6f\xbf\x1d\xb0\x33\x59\x83\x5d\x4c\x92\xad\x95\x76\x12\x6e\x37\x5e\x0b\xb8\xfb\xf8\x78\x8c\x97\xbb\x2b\x85\x43\x21\x56\xe4\x14\x9c\xc9\xc9\x14\x16\x00\xa0\x92\xca\x71\x21\x33\xba\x10\x31\xdd\xc0\xc5\xda\x60\x62\x35\xf4\x15\x68\xc3\x0e\xae\x87\x48\x4e\x63\xfd\xbd\x15\x87\x7b\x0e\x2d\xdd\xf2\x06\x2b\x78\x91\xa3\x12\x3b\x0b\x7b\x95\x84\x6f\x31\xb6\x13\xa8\xfe\xbd\xf0\xb6\x17\xde\xd8\x5a\x6a\xf8\xfc\xc2\xdb\x2e\x05\x1f\xbd\xad\xe4\xb3\x90\x40\xd0\x21\x7c\x38\x16\x29\x83\xe8\x61\xb0\x4c\xca\x2b\x9d\x8a\x06\xcd\x0a\xf3\xc9\x3a\x71\x93\xd2\x44\x8e\xe9\x46\xf9\x6a\x99\xbd\xeb\x25\xaf\xe9\xa6\x96\x66\x7e\x6a\x4f\xde\xe3\x06\x3b\x6e\xdc\x32\x44\x8d\xc1\xaf\x2c\xb1\xd9\xa5\xe5\xae\x22\xd4\x92\x08\x46\x66\xc0\xae\xd5\x8c\xa2\x38\xd0\x23\x1b\x9d\x29\xb8\x2c\xda\x5f\xb4\x67\x61\xa8\xf2\xd6\xcf\x03\xc6\x7e\x99\x0a\x7a\xc5\x76\xa3\x45\x1a\xe0\x2c\xcb\x85\x9e\x0c\xbf\x13\x51\x2d\xad\x2e\x46\xe8\xa2\x50\x0f\xc3\x5a\xde\xcb\x42\x4c\xc4\xb9\xce\x78\xd1\xa5\x3a\xcd\xc9\x8a\xd7\x5c\xa1\x96\x90\x91\x05\x16\x83\xcc\x32\x08\x7b\x51\x4c\xec\x39\x9f\x29\x58\x14\x7a\x99\xa2\xe8\xec\x11\xa8\x38\x00\x69\xd1\x0b\x74\x7f\x59\x6a\x67\x39\xdc\x83\xe8\x09\xc7\xfe\xe5\x98\x42\x3d\x7f\x2d\xc5\xc3\xaf\xb6\x37\xcd\xc6\x05\x9f\xf8\xdd\x81\xd8\xfd\xb2\x15\xe5\xe9\xbb\x5e\x39\x01\xcb\xa2\xeb\x46\x30\x5e\x3c\xf0\xb9\x46\xa7\x77\xda\x87\xd4\x6f\xd9\x9b\x23\x56\x37\x50\x9f\xd1\xf7\x91\xb3\xaf\x8f\x40\xcc\x3f\x3d\x19\xfe\x7a\xfd\x9f\xd7\xbf\x9e\x9c\x7d\xbc\xb8\xdc\xe2\x04\x67\xbc\xe2\x23\x59\xc8\x25\x41\x0a\xdd\x99\xdb\x69\xdc\xc9\x3a\xfb\x1f\x08\xa0\x51\x63\xa0\xe6\x3c\x3f\xce\x6b\x55\x91\xcb\xbf\x29\x4b\x2b\x4e\xfa\x15\x68\x49\x2a\xb1\x15\x86\x12\x26\x92\x0e\x27\x35\x8f\xf3\x84\x16\x42\x6e\x57\xa4\x29\x7a\x02\xd9\x64\x8d\xbe\x6a\xca\x78\x77\xca\x40\x5a\x39\x5a\x85\xd8\x10\x77\x1d\xcf\x4c\xf4\x34\xcc\x08\x0e\x98\x6d\x52\x1a\xc9\x8b\x62\xce\xac\xc0\x76\xcf\x0b\x70\x4e\x2b\x56\x2b\xe5\x89\x69\xaa\xb4\x49\x17\x00\x12\x1d\xb7\x09\x9d\xb2\xd4\x08\x89\xad\x1b\x66\xe8\xdb\xb1\x5c\x94\xca\xa5\xc8\x18\x2a\xb5\x6e\x9f\x62\xda\x35\x71\xea\x38\xef\xd7\xef\xd8\x4d\xb4\x4b\x52\xbb\xf1\x0f\x7d\xcf\x28\x05\x34\xda\xa3\xbb\xad\x08\x8c\x46\xa1\xb5\x16\x3c\x87\xc8\x14\x10\x40\xe8\x36\xd7\x77\x4e\x22\xa1\xa3\xeb\xc5\x5e\xdb\xa3\xff\x14\xc0\x0d\xb9\xa8\xb3\x31\xe5\x98\x8e\x84\x8b\x56\x7b\x46\x6a\xf2\x95\x52\x26\xa4\xa4\x6f\x58\xd4\x5f\xfc\x4d\x2c\xe3\x1a\x41\x53\x90\xe7\x6c\x8f\x18\x7a\x03\x5b\x1f\x72\xd8\x93\xd4\xd0\xad\x37\xbe\x6e\xca\x13\x14\xa7\x3b\x38\xac\xbf\xbf\x38\x03\x1a\x6c\x4a\x72\x87\x98\x7a\x8e\x0e\x91\x50\xef\xbf\xcd\xde\x7e\xb2\xfb\xd8\x0e\x69\x97\x20\x1a\x0b\xab\x13\xf1\x39\x62\xb7\xba\x0c\x81\x72\xf9\x05\x74\x31\x76\x8f\x9f\x70\x71\x45\x97\x54\x0a\x9f\xba\xec\xb6\xd2\x4b\xaf\x2b\xb6\xa0\x2f\x6c\x57\x93\xcc\x2e\xf3\xa5\x2a\x2d\x5d\x74\x4e\x25\xf6\x09\x54\x61\x59\x41\x2a\x23\x7e\xcf\x21\xa4\x0b\xa8\xa2\xd1\xf6\xb6\xbf\x18\x47\xb1\x9b\x7f\xc7\x54\x0d\xbc\x84\x20\x78\xc0\xc5\xcf\xc8\x19\x9f\x08\xc6\x8d\xdf\x15\x48\xac\xd6\x4d\x4d\xf6\x6f\x69\x58\xae\x04\x0a\xe1\xf4\xa9\x9f\x2e\xce\xd8\x6b\x76\x68\xbf\x85\x35\xaa\xc6\x5c\x82\x59\x1c\xe5\xe2\xd6\xad\x34\x76\x5d\xc0\x90\x60\xa3\xad\x68\x09\x34\xda\x63\xa5\x62\xba\xc9\xa6\x6e\x4c\x3e\x4f\xdc\xaa\x07\xa2\xb6\x4b\x0d\x48\x85\x7f\x04\xba\xe8\x7e\xc2\x7e\xda\x8c\x35\x66\x0f\xd8\x4f\x5b\x1c\xb0\x98\xff\x43\xfe\x7e\x32\x23\xdc\x6c\x1f\xfb\x2b\xc7\x69\x71\xe3\x3f\xc4\x32\x3f\xff\xf8\x69\xb1\x02\x22\x90\x3d\xcd\xa7\x9d\x22\x0d\x6e\x12\x66\x9c\x5d\x2a\x73\xd3\x5c\x8b\x30\xe8\x0e\x4b\xaa\x87\x2f\xde\x7e\x70\x58\xac\xb0\x6c\x99\x84\xbd\x20\x78\x99\xab\xd9\xc2\xc7\x3c\x9c\x6e\xf4\x81\x2f\x76\xbb\x57\xe9\x8f\xcb\x33\x00\x9f\xb8\x69\x69\x37\x9b\x36\xcd\xe5\x85\x79\x63\x14\x0a\x32\xce\xa2\x95\x6e\x57\xbb\x31\xea\x58\x2e\x74\xd6\xe0\xea\x91\x22\xcb\x6e\x9b\xd7\xaf\xbf\xfe\x2e\xda\x51\x00\x7f\x6c\x6f\xb3\xeb\x4a\xdd\x8b\xba\x96\xb9\xf0\xaf\xd3\x83\x15\x8b\xf5\x20\xcb\x5c\x3d\xe8\xe7\x52\xf8\x2f\xd8\x4d\x6b\xc7\xba\x12\x3c\xbd\xed\x0b\xee\xfb\x14\xcb\x44\x41\x2d\x8a\x44\x1c\x5c\x46\xf5\x6e\x11\x7c\xe4\xc5\x22\xb5\xf9\x4b\x03\x93\xe1\x7e\x3f\x8a\x7d\xbe\x7d\xa0\xbe\x97\x1b\x7c\x3c\xd0\x02\xe3\x5c\x10\x1d\x9b\x8f\xb4\xa9\xb9\x07\x6b\xd7\x6a\x6c\x1e\x50\x33\xc7\xa6\x87\x70\xfc\x1f\xf9\xac\x2a\x44\x8f\xcd\xe6\xfa\xb7\xe2\xc8\x25\xec\x50\xa4\x32\xa4\xc7\x31\xb0\xac\xc7\xad\xd9\x37\xdf\xbc\xfe\xee\x28\xc8\x1e\x55\xad\x1e\xe7\x68\x0e\x04\xfb\x76\xb0\xba\xa6\x69\xf6\xb9\x30\xa2\x9e\x81\xd7\x04\x05\x78\xa8\x89\x8b\xcc\xaa\xd4\x0f\xa2\x0e\x11\x32\x14\x68\x5b\x83\x0f\xca\x7f\x63\x1f\xa7\xf6\x45\xc7\xa9\xed\x83\xb1\xfe\x2c\xc1\x58\x7f\xf8\xe4\x9a\xe7\x54\x03\x24\x5e\xfa\xf4\x3a\x80\x23\x31\xe5\xf7\x52\x61\x99\x79\xc7\x67\xff\xb8\xf5\x00\xdd\x3a\x6c\xae\x04\xf8\x71\x79\x31\xef\x50\xed\x1f\xef\x02\x5a\x8f\x21\x65\x6a\x04\x30\x1e\x32\x56\x5c\x39\x3b\xc6\x8b\x53\xcf\x17\x5c\x26\xd0\xdd\xf5\x3b\x0e\xd2\x83\x4e\x4f\xb2\xac\x65\xc0\x5b\x21\x47\x50\x43\x36\xb2\x1c\x89\x19\x35\x01\xeb\xd3\x5b\xf6\x17\x92\x2e\x7a\xac\x29\x73\x51\x6b\xa3\x14\xec\xa2\x55\x2a\xc9\xb3\x57\x89\x7a\xca\x2b\xf0\x6a\x57\xa2\x96\xd5\x54\xd4\xbc\xa0\x2d\xd6\x3d\xc4\x39\x2b\x29\x70\xce\xcc\xa1\xc7\xaa\x96\x65\x26\x2b\x4e\x78\xd9\xe4\xa3\xe5\x8d\x99\x62\x74\x9d\x25\x15\xc0\xe0\x69\xcc\x54\xd5\x70\x19\xfe\x25\xe0\xdd\xa0\xa7\x46\xef\x45\x83\x2f\x59\x34\xe0\x8d\x51\x60\xf5\x4d\x09\xec\x46\xdd\x89\x8d\xbb\xb1\xe6\xd5\x04\xba\x03\x2d\xa4\x20\x53\x3a\x2f\x00\x44\x8e\x40\x90\x01\xca\xbc\x9c\xe8\x9a\x36\x63\xca\xc1\xb9\x0b\x88\x98\x06\xfa\x83\x71\x72\x08\xe9\x2c\xe6\x68\xa7\xb6\xc2\xc0\x29\x85\x0d\xa0\xc2\x95\xdb\x86\xc6\x6b\x5d\xa0\xa3\x6d\x63\xf6\x01\xc3\xcb\xb0\x29\x8a\x6b\x22\xe1\x4d\xe9\xdf\x69\xf3\x34\xda\x3f\x05\x6f\xd4\xae\x09\x5a\x89\x34\x9f\x89\x05\x1f\x29\x9c\xc5\xaa\x29\x0a\x97\x57\x09\xe3\x41\xb7\x83\x5d\x44\x82\xb9\x72\x61\x56\xb0\x90\xe9\x1e\x0c\xd8\xc2\x98\xac\x86\x91\x83\x06\x41\x19\x4a\xcc\x3d\x19\x89\x8c\xdb\xaf\xba\xbf\x7d\xce\x78\x53\x46\xf8\x77\x95\xca\x7b\x50\x51\x6b\x69\xcf\x60\xe4\xe6\x59\x86\xa5\xb6\xe8\xfa\x20\xc4\x99\x6d\x12\x1c\x48\xc3\x3c\xc6\x99\x1f\x7f\x15\x72\x61\xfb\xf0\x93\x5d\x1d\x5a\xca\xbe\x2a\xfb\xbc\x5f\xa9\x7c\xb7\x7e\xfd\xa5\x70\x9d\xcf\x71\xf1\xef\x85\xf0\xbd\x10\xfe\x85\x08\xe1\x9d\xb8\x5a\xc4\xcc\x5c\x50\x51\x74\xab\xbb\xba\x44\x64\x18\x6d\xe8\xd8\x27\x4c\xde\xc5\x0f\x2e\x61\x4f\x5f\x5c\xca\xd3\x96\x27\x3d\x79\x94\x48\x9e\x80\xf9\xd6\x87\x34\xfa\x3e\xa6\x94\x62\x84\xed\xa6\x37\x08\x3b\x0e\x5e\x80\xb7\xbf\x40\x19\xd8\x89\xab\x2f\x28\x0a\x6f\x4c\x9b\x6c\x37\x6e\xa7\x4f\x26\xe2\x32\x45\xa7\xef\x45\xd1\x2f\x59\x14\xed\x12\x97\xf9\x61\xe9\xfe\x76\xce\xa1\x34\x5c\xdf\x05\x6e\x22\xac\xd4\x10\xd5\xbc\x0a\xbf\x93\x58\xda\x27\xb1\x74\xc7\x65\xb3\x5b\xa7\x68\x2f\x54\xec\x85\x8a\x7d\x9a\xe5\xe7\xbd\xba\x5e\x22\xdd\x72\x41\x09\xee\x94\x7b\xb9\xf6\xbd\x56\x1d\x0e\x1f\xc3\xdd\x56\x9b\x51\x47\xa6\x84\x10\x8c\x9a\xaa\x42\x27\xa4\xd0\xb9\xbc\x07\x59\x6a\x7b\xbb\xf0\x15\xbd\xf8\xf8\x70\x27\xcb\x81\xe7\x3a\xaa\xbf\x61\xb5\x53\xab\x2f\xf2\x09\x97\xa5\x36\x56\x49\xd7\xec\xf0\xef\x7e\xd7\x40\x6b\x47\x3e\xc1\x54\x1d\xea\x1a\x1e\x75\xf1\x12\x35\xb9\x6c\x65\x4d\x2d\x5b\xb4\x13\x6a\xe6\x84\x53\x7b\x11\x96\xe0\xb7\x75\x0f\x5c\x12\x8c\x9d\xd2\x80\x9d\xd8\xbb\x54\x56\xc0\x8d\xc0\x06\x8c\x53\x85\x88\x1c\xb4\x78\x8d\xe7\x4c\x1a\x2d\x8a\x31\x06\x8a\x7b\x4b\xd8\x58\xb6\xa3\x32\x00\xb5\x6e\xd9\x67\x7a\xa1\xfa\x02\x94\x71\xa4\xdb\x9c\x2e\xe3\x68\x34\x37\x71\x0f\x79\x2b\x06\x32\xfa\x2c\x75\x6e\xd9\x04\xac\xe6\x16\x31\x6d\xe2\xb1\x92\x28\x35\x5f\x8b\x4c\xd9\xf3\xbb\x7e\x61\xcf\xdb\xed\xdd\x0a\x13\xef\x46\x94\x63\x2f\xc3\x40\x1c\x90\x34\xf3\x96\x29\x39\xa5\xa8\x01\x3b\xd1\x61\xfa\x8c\x57\x55\xad\x38\xd4\x92\x0e\xa3\xeb\xc5\x06\x03\x97\x23\x50\x15\xcd\x44\x52\x84\x11\xbc\x63\xe4\xbd\x80\x60\x3a\xe3\xe2\xa1\x56\x7c\xf0\x26\xea\x0c\x5e\xa7\x58\xa7\x1a\xd0\xb4\x20\x14\xd3\x77\x41\x54\x3f\x8e\xff\xd0\x4c\x15\x39\xdc\x6d\xbc\x64\xff\xf6\x9a\x55\xa2\xce\x88\x76\xa0\x8c\x3d\x45\x5e\x15\xf2\x5e\x40\xe0\xfd\xea\x97\xbf\xfe\x96\x4d\x55\x53\xeb\x41\x1c\xea\xf3\x06\x7e\x43\x71\xcd\xe5\x15\x19\x56\x08\xae\x0d\x7b\xf3\x9a\xcd\x64\xd9\x98\x05\x50\xf9\xe7\x47\xd2\x54\xdc\x4c\x37\xec\xff\x90\x9b\xa9\xdb\x72\xc8\x9f\x68\xa3\x08\x63\x84\x68\x12\xd7\x04\x59\x2b\x46\x39\x8e\x13\x2f\x45\xd9\x1d\x2d\xbc\xe3\x6d\x52\x45\x99\x16\xcf\x40\x66\x01\xaa\xe9\xa6\x63\x80\xc8\x89\xe1\xfc\x31\x84\x07\x3c\xdb\x43\xb4\xfe\x79\x54\x0a\xb7\xa5\x2f\x22\xeb\xef\x85\xfc\xbd\x90\xbf\x17\xf2\x3f\x97\x90\xff\x62\xd2\xfd\x50\xd5\x1d\x6e\x0c\xdb\x2a\x20\x31\xc7\x89\xfa\xaa\x74\x6c\xe6\x95\x86\xf0\xad\x4e\xf7\x47\x35\xac\x95\x51\x59\xa7\xba\x4f\x10\xac\x47\x05\xb5\x2a\x7a\x8d\x32\x39\x24\x7d\x12\xf5\x03\xcc\x58\x1d\x2b\xc2\x1a\x75\x34\x17\x89\xf1\x58\x29\x59\xcf\x4b\xc3\x1f\x07\xec\xa7\xb2\x5f\xd5\x62\x2c\x1f\x45\x8e\x0e\x2b\xf0\xfb\x58\x96\x01\x21\x05\xf6\x13\x17\x27\x97\x27\xa1\x27\x27\x9a\x61\xe3\x43\xae\xad\x14\xc5\xae\xde\x9f\xf6\xbf\xfb\xe6\x9b\xbf\xc2\xc5\x62\xc9\xf8\xed\xf1\xf1\xc3\xc3\xc3\x40\xf2\x92\x03\x76\x33\xd7\x5a\x4e\x00\xac\x51\x1f\x3b\x33\x0c\x74\x71\x34\x60\x97\x00\x0c\x4d\xfd\xbb\xd9\xf9\x3b\xce\xea\x24\xad\x21\x42\xb0\x3a\xd7\x6c\x36\xcf\xd4\xac\xe2\xe5\x7c\x90\xa9\xd9\xf1\x6c\xde\xcf\x1a\x6d\xd4\xac\xef\xfa\x58\x81\x7c\xec\x8a\x3c\x4d\x1a\x5e\xe7\xc1\xaf\xe5\x54\xb6\xb0\x31\x09\xfc\x31\x4c\x2d\x02\x4d\x76\x39\xe4\x2f\x02\xfa\x97\x96\x6f\xa1\x2d\x8e\x93\xbc\x7d\x74\x07\xa6\x71\x7b\x4c\xc2\xb3\xcb\xeb\x5f\x3f\x9c\xbc\x3b\xff\x80\x18\xb0\xf6\x35\x1d\x10\x1d\xa2\x50\x1b\x7c\x07\x3c\xb2\x84\xfb\x40\xa9\xfe\x90\x57\x08\x71\x89\xb9\xa8\xdd\x05\xe3\xae\x06\x4d\x85\xd3\xa8\xa3\x1e\x0e\x0e\xba\x82\xd2\x4c\x98\xa6\x6b\x7b\x7a\x45\x8b\x4d\xe3\x3d\xa7\x0e\x86\x40\xaa\x2e\x7f\xdf\x8a\xd8\xca\x55\xfa\x88\x8f\x99\xd4\xbe\x80\x03\x64\x56\x05\x9f\xf2\x36\xeb\xad\xf2\xf6\x11\x5f\xb5\xe6\x88\x6a\x50\x62\x98\x36\x54\x8a\x50\x01\x61\x22\x72\x6c\x63\xb9\x7f\xa5\x21\x43\x5a\x94\xbe\x84\xc6\x25\x7d\xca\xaa\x0f\x1f\x14\xcf\xdf\xf1\x82\x97\x19\x04\x7a\xff\xa4\x1b\x70\x72\xe3\x49\x58\x8c\xc6\x81\xfc\x6b\xbc\xdf\xe3\x0c\xec\x1e\x93\x65\xbf\xe6\xe5\x84\xa4\x36\x7b\xf1\xca\x12\x4e\x85\x4c\x23\x6e\x7b\x91\x92\x6a\x7c\x49\x9c\xb4\xe8\x1f\xf3\xc0\xe2\xa1\x7f\xee\x88\x8b\x12\x57\x29\x8e\x3d\x47\xfd\x27\x78\x79\x42\xc6\x96\x2a\x05\xf6\x64\x02\xcb\x69\x65\x8d\x0b\x42\x5d\xc0\xca\x39\xae\x07\x5c\x49\x9f\xca\x52\x0a\xfb\x15\xd3\xa3\xa6\xe9\x48\x23\x76\xe6\x86\xf6\x20\x2b\xd7\x39\x08\x1e\x69\xe7\x46\xb1\x52\xb1\x42\x95\x13\x51\xbb\xae\xd9\xa1\x18\x4c\x06\x2c\x9b\xf2\x72\x02\xb4\x0c\xe9\x65\x56\xe0\xf1\x3b\x65\x14\x3b\x2d\x1a\x6d\x44\x7d\x31\x3c\x7a\x7a\x1e\x33\x89\x97\xfd\x52\x18\x42\xce\x71\xbf\x1d\xc3\xdd\xdb\xb7\x54\x64\x17\x78\xd7\x78\x07\xd5\x13\x28\x3a\xc9\x4c\x76\x84\x1b\x10\x21\x96\x1d\xac\x1d\x0c\xb0\xfb\xf5\x76\x31\x5c\x79\xab\x5d\x23\xd4\x88\x66\xb7\x07\x37\xa7\x43\x2c\xf2\xfa\xd3\x19\xfc\xc3\x1e\x87\xdb\x83\xeb\xd3\x9b\x61\xab\xe2\xeb\xcd\xe9\x70\x9b\xf2\x35\x80\xac\xb2\x8c\x51\x3c\x4d\x34\x6c\x8c\x2c\x06\x96\x57\x9a\x7a\x70\x51\x9a\x4f\xf5\x35\x7e\x74\x9d\x70\x78\xd9\xcc\x46\x68\x57\x8b\x8b\x76\x55\x44\x9f\x18\x81\xe1\x72\x4c\x31\x58\x04\x06\x1b\x71\x11\x77\x1f\x50\x4f\xee\x46\x20\xf6\x0b\x0c\x84\xbd\xb1\x9d\x7d\xf7\xd7\xbf\x7e\xf3\xd7\x01\xbb\x8c\x51\x72\x78\x09\xb7\xfc\xaf\xd7\x3f\x9f\xfe\x7a\x79\xf2\xf1\x3c\x29\x28\xca\x7d\x99\x87\x88\xe1\x14\x4a\xdd\x89\x9c\x35\x15\xa5\xbd\x41\x08\x3c\x8c\x97\xbe\x48\x38\x35\x43\x80\x0b\x88\x72\xa4\xec\x5e\x2e\xd4\x2b\x6d\xe5\x1a\x20\x17\xa4\x45\x78\x65\x5f\x79\x15\xb8\x0c\xd8\x3b\x0f\xe3\x98\xb6\x19\xaf\x8e\x12\x7e\x61\x3b\x9e\x94\x50\x8f\x61\x0c\xb0\xc1\x78\x46\xd1\x06\x98\xb9\xc3\xfe\x1f\x97\xaa\x24\xa6\x1a\xea\xf3\xa8\x99\x34\x06\xeb\x7e\x6a\x61\x98\xf8\xad\x41\xb0\xb9\xf6\x48\x76\xcb\x28\x90\xac\xca\x49\x9f\x3b\x1f\xd5\x16\x26\x14\x4b\xb8\x3b\x32\xa1\x5c\xa7\xf1\xbc\x2b\x04\x62\x0a\xc8\xc5\xc2\x1d\x68\xd5\xe0\x06\x75\x14\x97\x2a\xc9\x31\xff\x0d\x01\x78\x80\x82\xf9\x22\xbf\x59\x8b\x3f\x60\xaf\xa2\xf8\x26\x75\x7c\x7b\x93\xfe\xbf\xf6\x5d\x6f\x89\x91\x63\x16\x7e\xf4\x37\x60\x12\x94\x16\xee\xc3\x45\x5a\x82\xeb\xa4\x75\xcf\x27\x95\xa7\x4d\xdd\x08\xcb\x9c\x2e\x4c\x54\xb9\xcc\xd2\xd3\xed\x01\xe4\x5e\xde\x1e\x38\x2b\x23\x91\x25\x2b\x14\xcf\xfb\x23\xea\x2e\xca\xfa\x14\x20\x25\x85\xd1\x0e\xd8\xfa\x19\xda\xcf\xc5\x75\xbe\x3a\x0c\x1e\x8e\x82\x5b\x84\xac\x10\xbc\x76\x42\x80\xf0\x02\x0e\xdc\xa4\x94\x35\x54\xce\x09\xd8\xc7\x15\x4b\x8a\x0f\x20\xd4\x9f\xe9\x43\xac\x1e\xf4\x2b\x35\x0e\x67\xaa\xf0\x60\x8e\xe6\x4c\x93\x3d\x02\x28\x05\x25\xeb\x58\x10\xff\xf0\xce\xcd\xe6\x14\x71\x1d\x9c\x38\xbe\x4d\xec\x9f\x3f\xf5\x1b\xc8\xc6\xb7\x73\xe6\xd2\x8b\x61\xbb\xae\xb7\x37\x4e\x97\xc4\x8f\x5a\x72\x1d\x66\xff\x15\x58\x9b\x90\x97\xfe\xf5\x44\x42\x9a\xf1\x12\x5e\xeb\x01\xb3\x22\x09\xcf\xab\x53\xe4\x92\x49\xe2\x63\x8e\x7a\xee\x8b\x41\x04\x4c\x58\x72\x20\x54\x5f\x4d\x1a\x06\xfa\xef\x91\x5c\xe8\x05\xad\xd6\x5c\x96\xcb\x5d\x0e\x83\xc7\x92\x83\xdb\x77\xca\x11\x42\xc3\x8f\x76\xf8\x3e\x9e\x44\xa2\xfd\x87\x9c\x46\xc0\x86\x08\x34\x73\xfe\x88\x76\x48\xb8\x7d\x0e\x51\x1c\x8c\x80\x00\xfc\x97\x31\xfc\x68\x54\xf0\xf2\xee\x88\x11\x60\x41\xda\x7f\xda\x35\x88\x74\x69\xe7\x1e\x1a\x2e\xe3\x5a\xc4\x7d\xc3\xc9\x20\x05\x84\xce\x47\x24\x0c\x6b\xcf\xd1\x18\x1f\xa9\x7b\x71\x34\x60\x54\x77\x2e\x2a\xa3\x71\x7b\x60\xef\x0e\x2b\x83\x40\xe9\x48\x67\x9d\x3b\xbc\x3d\xb8\x3d\x38\xea\x21\x50\x18\xa2\xc3\x07\xf2\x19\xb0\x6b\xaa\x5b\x0e\x63\x01\x1e\x80\xbd\xb0\x19\xe4\xb2\x71\x76\x7b\x30\x15\x3c\x87\x05\xa5\x8d\xb9\x3d\x60\x87\xa5\x62\xf7\xb2\x36\xf6\x22\xba\x18\x1e\xf5\x02\x24\x53\xa3\xc5\xb8\x29\x50\x1e\x46\x0c\x94\x60\xc2\xcb\x54\x59\xa2\x9f\xd0\xc3\xcc\x8c\x45\x5d\x53\x64\x37\x64\x77\x41\x09\x75\xc7\x5d\xf0\x46\x19\x30\x2c\xbc\x18\xaa\x82\xc2\xaa\xeb\x20\x21\xf7\x3c\x07\x42\x72\x4c\x99\xdf\x16\x2a\x81\xa2\xfa\x83\xf1\xe6\xed\x4e\x21\x58\xe8\x7a\xb7\xf7\x36\xed\x4b\x5f\x56\x1a\xd3\x1b\xc8\xb2\x61\xd7\x77\x01\x5b\xa5\x8b\x0c\xea\xd9\xcf\xa6\xeb\xcd\x6f\x48\x2b\x2c\x39\xd0\x9b\xd0\x81\x25\x01\x43\x08\xa2\x3e\x95\xd8\xad\xc5\x3a\xe6\xb5\xe7\x5e\xcf\xe4\x5e\xc0\x1a\xfe\x3c\xdc\x6b\xcf\xbe\xbe\x08\xf6\xb5\x38\xc8\x96\x02\x15\x9d\x29\x50\x55\x5d\x59\x3f\xe7\xe5\x09\x12\x0e\x29\x32\x6b\xa6\xdd\x23\x37\x10\x99\xf8\x62\x48\x92\xc0\xa9\xfe\xdf\xeb\xff\x42\x1c\x43\xdf\x31\x58\x15\x7d\x1e\x04\x02\x1a\xde\x96\xb7\xe5\x4f\xe1\xb8\xdd\x1e\x5c\x0c\xef\xbf\x3b\x6b\x78\x71\x6d\x78\x76\x77\x7b\x90\xda\x5a\xa5\x76\xa6\xd6\x5e\x6b\x6c\x85\x9c\x49\xe2\x12\xaa\x14\xce\x9f\x89\x44\xe5\xd4\x59\xff\x69\x42\x32\x5d\x31\x65\xd1\xe9\x9b\xf6\xc0\x4d\x55\x91\x33\xce\x66\xfc\x51\xce\x1a\xac\x8e\xf8\xa0\x00\x0b\xc4\x92\xd9\x61\x6e\xef\x00\x6d\xe7\xc1\x2e\x86\xba\x67\xd9\x9b\x90\x88\x9f\x59\xe7\xa2\xb6\x87\xf0\x66\x2a\xb4\x15\x26\xb5\x2b\xd4\x58\xd7\x42\x57\xaa\xf4\xec\x8e\xce\x27\x71\x36\x59\xbd\xe7\x33\x09\x44\x4c\x43\x7e\xa7\x62\xdd\x15\x51\x95\xa2\x56\xf6\x90\x4c\xd4\xbd\xbd\xc6\xbc\x4d\x80\x1e\xcf\x87\xaa\x90\xd9\xfc\x25\xf4\xd6\x27\xdd\x7f\x3b\x2d\x8d\xbd\x3a\xde\xda\xde\x84\x7d\xdf\xd8\xa8\x99\xcc\x56\x05\xd1\xe0\xb9\xda\x7c\xd9\x46\x2d\xd7\xdc\xb6\x56\xc3\x42\x3a\x2c\x55\x1e\xca\xc3\x3a\xc5\x8e\x40\x42\xb4\x22\x70\x58\x66\x6a\x3e\x1e\xcb\x2c\x18\xbc\xbc\x0d\x27\xa2\x16\x87\xe3\x8a\xf8\xba\xb0\xb5\xc1\x97\x83\x2d\x51\xc5\x86\xc8\x01\x4b\x51\x5a\x5a\x3d\x0a\xe0\x03\xec\x71\x45\x8e\xcd\xc3\xe7\x78\x5d\xcb\x7b\x4b\x31\x06\xe0\x8a\x72\x41\xda\xa0\x1d\xc1\xc5\x70\xc0\xd8\x09\xcb\xd4\x6c\xa6\x4a\x0f\x3f\x00\xc6\x6e\x8a\x1f\x48\xd4\x53\xa7\xe4\xd3\x18\x2b\x5e\xfb\xe8\x91\xc8\xe1\x44\x06\xee\xcf\x52\x27\x7d\xc9\xf6\x76\x40\xbb\x8c\x9b\x3a\xbd\xcf\xcf\x38\xce\xc8\xe2\x86\xe5\x52\x67\xf6\x9c\xcd\xd9\x4c\xd8\xfb\x5b\xea\x99\x76\x15\xcb\x4c\x53\x23\x0c\x54\xc9\x78\x21\xb9\x5e\xd8\x5a\x32\x47\x83\x9b\x86\x9d\x5e\x9e\x7c\x3c\x87\xd0\x8d\x3a\x07\x2f\x58\xb8\xd7\x02\x03\xbf\x57\xc5\x3d\x5c\x6c\xa1\xec\x54\xa1\x1e\x44\x0d\x62\xc1\xd5\xfb\xd3\xfe\x9b\x37\x5f\x7f\x03\xb0\x73\x60\x38\x3c\xdc\x50\x3a\xd5\xb6\x46\xb8\x28\x2f\xb7\x00\xe2\x1a\x48\x2c\xdb\xc4\xa1\xe1\x22\xdd\x20\x6d\x21\xa3\xe9\xb8\xd8\xc9\x3b\x1e\xbb\xae\xed\x73\xc8\x85\x46\xe9\x4a\xb1\x5a\x35\x26\xda\x17\x47\xcf\x60\xf6\xcf\x45\x1f\xc1\x33\x54\xed\x0e\x5c\xff\x41\xe6\x91\xe3\x6a\xe0\xca\x9b\xdf\x1e\x20\xe6\x66\x7d\xef\xd0\xec\x28\xd2\x01\x83\x27\xec\x91\xb6\xc2\xf1\xbd\x92\x39\xd5\xce\xb0\x5c\x7a\xaa\x2a\xd8\xcd\x05\x7b\xc9\x25\x99\xf7\xf1\xae\x76\xdc\x12\x73\xea\x6a\xa9\xef\x34\xab\x94\xf1\xc8\x81\x72\x46\x67\x27\xf7\xe3\xd7\x15\x95\x4d\xb4\x23\x24\x41\xe5\xf6\x80\xa9\x91\xce\x9a\x7a\xdd\x10\xed\xc5\x84\x29\x7e\xc9\x28\xc1\x32\x83\x76\x99\x12\x00\x9a\xed\x48\xe2\x04\xcc\x89\x52\x39\xa4\x56\xf2\x82\xce\x73\x18\xc2\xd3\x49\x60\x2a\x78\x61\xa6\xa7\x53\x91\xdd\x5d\x76\xf3\xb3\x2d\x79\xc3\x4b\x1c\x38\x5d\x6c\x91\xd9\x16\xcc\x39\xef\x3c\x6e\x61\xea\xf9\x54\xb1\xbc\x97\xb8\xe2\xc8\xd0\xb6\xb0\x61\xcb\xe9\x2f\x7e\x21\xe3\xc5\x3a\x77\x9c\x6e\x79\xe4\x56\xeb\x34\x88\x83\xb3\xd4\xe5\x86\x3d\x6f\xb0\x38\x0e\x98\x17\xfe\x5c\x46\x37\x71\x90\x94\x0d\x1f\x41\x2c\x70\xe3\x14\x05\xe7\x36\xf0\xf8\x2f\xf6\x54\x71\x36\x91\xf7\xa2\x44\x8e\x8f\x71\x6f\xa9\x53\x37\xe1\x53\xca\x12\x8f\xf9\x03\x3b\xf9\x8e\x76\x8f\x2f\xee\x85\xad\x4d\x79\xc3\x43\x2f\x95\xb5\x85\x85\xb1\x7b\x80\x23\xbe\x18\xde\x7f\xdb\xb3\xff\xff\xdd\xd1\x06\x5d\x5d\x6a\x90\x51\xbd\x68\xb7\x5e\x7c\x06\xb9\x20\xde\xb4\x05\x35\x3f\x25\xb8\x11\xd7\xe8\x68\x77\xb2\x4a\x8a\x6b\xec\xd0\x85\x96\xcb\x93\x6b\x28\x24\x98\x09\xd2\x58\x63\x58\x06\x38\x73\xfc\x9e\xcb\x02\x0c\xbf\xa9\xb4\xd4\x8b\xe5\x5b\xf7\x41\x2a\xa0\x6b\x69\xa9\x75\xc8\x9e\x68\x24\x68\xad\x8e\x65\x9d\xd2\x6b\xd4\x54\x0a\xfb\xad\xfd\x06\x7d\x11\x62\x1e\x72\x28\x6d\x0b\xf0\xa6\x33\x75\x8f\x54\x89\x6c\x97\xd7\x73\xbf\xb9\x73\xe4\xb7\x31\x60\x23\x74\x12\x51\x27\xa0\x2b\xc9\x59\xf2\x96\x1b\xec\xb5\x17\x01\x97\x68\xed\x96\x5c\x6e\x0f\xc8\xed\x69\xf7\xff\xf6\x20\x9d\x8b\x6a\x29\xbf\xd7\xce\xde\x4f\x5a\x6a\x47\x45\x18\x7f\x81\xf1\xdb\xce\xe6\xa8\xec\x3b\xdd\xfe\xf6\x20\x84\xc9\xb2\x1d\x69\xb5\x58\xec\x62\x4b\x95\xcb\x1d\xaa\x35\x7a\x97\x3f\x77\x9d\x94\xaf\x48\xcb\x82\xf1\x60\xf9\xf7\x80\xd0\xb8\x2b\x55\xec\xcb\x56\x8f\xd2\x21\x77\xe3\x79\x6e\x7e\x51\x7e\x8b\x9d\x7d\xd8\xac\x7e\x29\xb4\x8e\x38\x81\xaa\xbd\xf1\xc6\xc7\x23\x5c\x3f\x8b\xf1\xa1\x66\x5f\x0b\xbc\x96\xe9\x9e\x75\x00\x80\xc0\x88\xca\x98\x5f\xc5\x80\xe0\xf6\xc4\xc8\x72\x52\x08\xe8\x7a\x10\x8e\x0f\x65\xda\xdc\x1e\x44\x8f\x6f\x0f\xd8\x21\x67\x1a\x7e\x08\xe7\xf8\xa8\xc7\x6e\x0f\x86\xa0\x32\xc4\x63\x3c\xb4\xb4\x1b\xf3\x7f\x55\x46\x8b\xe2\xd9\xad\xf0\x46\x14\x8d\x56\xb8\x76\xf7\x10\x69\x08\xbf\xb9\x37\xa9\x39\x9a\xed\x6e\x0f\xae\x70\x31\x9f\xf7\xed\x38\x90\xc8\x32\xcc\x23\xcc\xbc\x88\x49\x3c\x36\xf7\x68\x07\x67\x9f\x8b\x4a\x94\xb9\x0b\x53\x88\x9c\xf8\xd2\x5b\x31\xba\xf3\x0b\xbd\x8e\x5f\x3c\x5d\x4c\x2d\x22\xfe\xb6\xd1\x09\xd8\x36\x22\x3a\xde\x65\x55\xa5\xb7\xa9\x44\x99\xfc\x01\x33\x9a\x08\xe3\x0b\xce\x90\x66\x0d\x3b\xd8\xca\x36\x0a\x6b\x82\x4b\x42\x54\x8c\x6b\xa8\x31\xec\x2c\x54\x83\x00\xf8\x9f\x02\x74\xc3\xac\x50\x4d\xde\x27\x8a\xae\x5d\x29\x9e\xa4\xae\x3c\x04\xfe\x27\x13\xc6\xe5\xe5\xf0\x2b\xf3\xde\x65\x7b\xf7\xe1\x48\x97\x4a\x62\x2e\x86\xc2\x7b\xa8\x93\x0f\xfb\xfb\xcd\x15\x03\x8a\x0c\x6a\xcf\xdc\x20\x2c\x9d\x74\x65\x45\xec\x0e\x15\x5d\xc2\xc2\x42\x28\x07\x8e\x26\x70\x8c\xaa\xe0\xc6\x4a\x7f\x64\xd4\x23\x55\xdd\x0e\x25\x0b\x46\x91\x18\xfa\xb0\x35\xcf\xd4\x21\xef\xd6\xc6\xf5\x10\xf9\x2b\xfc\x30\x48\x5b\xbb\x18\xea\x5d\x2f\xeb\xed\xc1\x93\x32\xa2\x31\x6e\xa8\x1f\x05\x0f\xf7\xe9\xd4\x46\x49\xd1\xe9\xf7\xfb\x63\x59\x8b\x07\x5e\x14\xdd\x92\xa3\x77\x68\xaf\xa9\x3a\x04\x75\xdc\x44\x88\x15\x48\xf5\xde\x00\xb5\x2a\xaa\xed\x8b\xb3\x77\x3e\x35\xc7\x64\x18\xc5\xf5\x6c\x5a\xd8\x0d\xd7\xfe\x8c\x57\xfd\x3b\x31\xd7\x49\xe0\x90\x5f\xfc\xe4\xed\x38\x7e\x2f\xfa\xf9\xbf\x3a\x0a\x16\x33\x5e\x3d\x0d\x44\x63\x31\x42\xf2\x89\x20\x1a\x31\x25\x35\xa3\x42\xea\xe9\xa5\x32\x57\x82\xe7\xf3\x13\x67\xa1\xdd\x54\x48\x61\xc5\x6b\x11\xe8\x15\x52\x5b\x39\x67\x7c\x22\x7c\x59\x84\x5c\xf0\x82\x42\x6a\x96\x68\xd4\xee\xee\x20\x0b\x4c\x2e\x75\x2d\x26\xbc\xce\x11\x01\x0a\x7b\x46\x74\xe1\x31\x14\x16\x98\x1f\x97\xca\xf4\xe1\x5f\x78\xed\x3a\x5d\xc1\xaa\xf7\x60\xf5\xc3\x48\x9e\xc8\x17\xe7\x15\x19\x8a\xcd\x36\xdc\x88\x71\x53\x5c\x43\x7d\xb8\x1f\x9c\x4b\x2e\x12\xc0\xab\x5a\x55\x1c\x7c\x1e\xd7\x57\x3f\x83\x2d\x12\xad\x90\xd8\x83\x34\x9a\x0d\x55\xae\xbd\xc5\xa5\x6a\x6a\x7b\xb6\xe0\xd0\x09\xcb\xa2\x9c\x09\x14\x07\x18\x99\x7a\xa9\x00\x4b\xe1\x4d\xc3\x13\x51\x0a\xbb\x67\x3e\xfe\x1b\x65\x07\xf7\xd7\x75\x81\x71\xc5\x94\x09\x06\x5f\xf4\x52\x17\xe4\xac\x55\x50\x83\x9f\x3c\x8e\x33\xc1\xa9\xca\x0e\x2f\x8a\x68\xb1\xed\xf9\x77\x11\xeb\xc2\x2a\x47\xb0\x7c\xb7\x07\x4c\xdc\x87\x1c\xd0\x21\x62\x6c\x89\x99\x16\xc5\xbd\xf0\x96\xf5\x01\x3b\x99\x80\xa0\x4a\xee\x56\x55\xea\x66\x46\xc8\x57\xd1\xcc\xdc\x44\xf2\xe8\xb3\xf1\xa5\x11\xe6\xa7\xea\x95\xd3\xb3\x72\xa4\xe6\x63\x81\x9a\xb8\xfd\x0c\xcc\xcc\xe1\x58\x6e\x13\xd7\xe4\x10\x7f\xdb\xb4\x6d\xd5\x55\x54\x69\x87\xcb\x83\xeb\xd8\x53\xd8\x77\xbb\xa8\x0a\x58\x62\xbd\x84\x16\x0c\xb1\x04\x30\x6c\xa6\x94\x65\x02\x65\xab\xec\x86\x93\x82\x05\x39\x02\x9e\x6e\xdd\xd8\xc1\x86\x80\xae\x68\xb4\x3b\xb9\xa2\x48\xbd\x44\x81\x97\x9a\x56\x0d\xae\x5c\x87\x25\xe7\xed\xc1\xae\x92\x10\x78\x4a\xc0\x39\x6c\x22\x13\x97\x73\x11\x46\x5b\xea\xab\xa0\xcd\x54\x2e\xc7\xf3\xc1\x33\x7d\xc7\xd1\xad\x4e\x16\xc8\x17\x8b\x3b\x59\x4e\x27\x71\x88\xe7\x22\x99\x40\x35\xc4\x93\x31\xdc\x38\x9b\xb4\xb9\x28\xe6\xfa\x14\x64\x99\x8b\xa1\xb7\x3b\xa0\xcf\x1f\x8a\x88\xc0\x3e\xcc\xb8\xc4\x02\x6d\xf4\x09\xc6\xe9\x1b\x03\x76\x8e\x21\x7d\x5e\x1c\x22\x3b\xd3\x62\x43\xe7\xdb\x70\x1f\xb3\x64\x70\x09\x49\x06\x71\x7a\x35\xfe\xf2\x45\x87\xef\xb4\x96\xf9\x14\x84\xac\x67\x00\xc2\x2e\xeb\x6d\xdd\xc1\x5c\xfa\xfd\x90\xb3\x46\xb0\xf6\xc1\xb4\xa7\x31\x43\xb6\xb5\x1f\x2b\xc2\xe3\x55\xa5\x0a\x35\x99\xff\x1d\x05\x88\x75\xf4\x13\x37\x45\x1b\x68\xe5\xbd\x68\x7d\x30\xcd\x78\x29\xce\x35\xa5\xc2\x84\x18\x1b\x32\xab\x0a\x28\x25\x1a\x8f\x91\x2e\x85\x28\x29\x0c\x2e\x32\x2a\x77\x8c\xde\x15\x6d\xe5\xe5\xc0\x9f\x51\xe7\x01\x19\xb8\x8d\x58\x06\x16\x44\xcb\x8e\x5d\x1e\xab\xc6\xea\x00\x3e\x72\x00\xb0\x00\xb8\x5e\xee\x2d\xf8\x0f\xf2\x11\xdc\x24\x83\x77\xd1\x07\x18\x3a\xd3\x62\x80\xdc\xb2\x19\x6d\xd8\x9b\xef\xa8\x31\x4f\x63\x77\x06\xf1\x0d\x69\xaf\xb3\xa9\xd2\xa2\x0c\x96\x59\xcc\xc8\xaf\xb5\x49\x56\x8c\x50\x2d\xbc\x11\x75\xc4\xb3\x3b\xab\x3e\xae\xb5\xca\xc2\x70\xe0\xfe\x44\x5b\x1a\x70\xd2\x52\xf9\x97\xf1\x86\x0d\xe9\x5c\xfe\x83\xde\x3c\x26\x17\x78\xf3\x94\xeb\xa4\x8b\xb1\xc3\xa0\xa7\xc3\x4f\x75\x2e\x7d\x4c\x0f\x6d\xa3\x73\x02\xd0\x42\xf8\xb2\xaa\xb7\x07\x7f\x81\xb8\xa2\x79\x0c\x70\x02\xb7\xff\xed\x81\x95\x9b\xdc\x90\x2c\x23\x02\x0d\x2b\x03\xf9\x90\x17\x3e\xc1\x5d\x8e\x5d\x4e\x94\x65\xea\x18\xa1\xa4\x45\xa9\x7d\x4c\x48\xc1\xb5\x71\xfe\x9d\xd2\x43\xe1\xad\xce\x4c\xb0\x3c\x09\xee\x28\x28\x97\xe3\xd7\xc4\xca\x0b\xa6\xe6\x48\x6f\x69\xe9\xbf\xdd\x47\x44\x7b\x7a\x5b\xae\x66\xbf\xbc\x8e\x46\x4d\xd6\x9e\x7d\x7b\xf9\x45\x95\x07\xa6\xea\x21\x9e\x42\x94\x39\x97\x72\x77\x7f\xcd\x0e\xc8\xf4\x1d\x17\xf0\x48\xa3\xab\x3a\xde\xc8\xb7\x21\x48\xd2\xde\x5e\xe4\x54\xb3\xdc\xc8\x79\x88\x3d\x2a\x42\x14\xe4\x6d\x29\x37\x52\xf9\x09\x58\x24\x72\x23\xa7\xe7\xd4\xcf\x34\xca\xc4\xa1\x1a\x0c\x0e\x41\x04\x93\x4d\x5b\x1e\xc0\xd1\x9c\xbc\x23\x44\x41\x4d\x16\xa1\x3d\x44\xc2\x24\x66\xf1\x2f\xc8\x94\x84\x7c\x07\xe4\x9a\x84\xac\x87\xd8\xbe\x24\xee\x0e\xe9\xcf\x45\x58\x3a\x87\x4e\x2a\x41\x93\xfe\x23\x72\x4c\xe9\x21\xb8\xe7\xd0\xa6\xe6\x64\x8e\xe2\x50\x55\xda\xf7\x3d\x80\x8f\xe2\x3e\xdc\x1e\xb0\x51\x23\x0b\x34\x60\xf9\xe5\x77\x2c\xc7\x6f\x80\x4f\xb3\x84\x40\x0a\x0c\x42\xc1\x68\x4a\x85\xb9\x23\x2a\x70\xe2\x68\x90\xad\x68\x2e\x74\xe9\x87\x2d\x4f\x3e\xee\x5d\xcb\xc0\x7a\x28\xff\x24\x96\x17\x53\xbb\xce\xa1\x1c\x47\xa6\x23\xe7\x8c\x6a\x6a\xa8\x39\x09\x26\x92\xa3\x6d\x87\x18\x13\x2f\x10\xa2\xe4\x5a\xb4\x80\x92\x17\x6c\x48\x22\x91\x1d\xaf\x05\xb8\xeb\x29\xdd\xc2\x99\x5b\x15\xba\x97\x9c\x8b\x26\x09\x20\x0d\x2e\x9a\x5d\x0a\x4c\x44\x22\xb2\x9c\xf4\x7d\x3b\x27\x34\x81\xb4\xfc\xd9\x0a\xb8\xc6\x50\xf9\x9b\x13\x95\x10\x18\xbf\xe5\x95\x70\xbb\x1b\x60\xf3\x9f\x92\x9b\xe4\x9d\x86\x1b\x23\xb5\xdd\x67\x9c\x21\xc0\xaa\xe7\x3b\xb1\x14\xad\x41\xa4\x38\x75\xa3\x7b\x71\xcb\x11\x74\xf3\x39\x2c\x44\xf0\xe2\x8e\x2c\x44\xb1\xb1\x79\x6b\xf1\x3c\x66\x3d\x1d\x8a\x36\x24\x9e\x82\x54\x24\x5f\x20\x44\x67\xc0\xf7\xfc\xa9\x87\x99\xf2\x70\x7d\xba\x8a\xdd\x3b\x3d\x4f\xeb\xf5\x96\xc5\x73\xb5\x4c\xcf\x68\x9f\xaf\x0e\x9a\xc6\xe6\x63\x46\x2a\xe1\xf6\xb5\x6e\xa9\x83\x0e\xda\x93\xfb\xd6\x26\x85\xe9\x74\x93\x42\xbb\xcb\x9d\xc1\x3a\xd9\x9f\xae\x87\xa2\xd6\x50\xf1\xc9\xfc\x0c\x30\x6a\xe8\x23\x59\xb3\x47\x57\x31\xc6\xa0\xef\x86\x55\xbe\x1f\x87\xc7\xe6\xec\x53\x1d\x76\x63\xac\x6f\x36\x4b\x80\xa1\xc8\x2a\x5a\x42\xac\xe8\x4e\xf0\xd0\x3e\x86\x71\xdc\x6a\xb3\xe0\xb5\x99\x5a\x65\x89\x10\x0c\xca\x89\x07\x49\x38\x7f\xb4\x37\xaa\x78\x34\xdf\x62\x26\xf8\xe3\x58\xe3\x3f\x4a\x63\xff\x35\x60\x17\xb3\xaa\x90\x99\x34\x05\x41\x1c\xd5\x1e\xcb\xda\xbd\xd6\x2e\xb8\xb8\x7d\x45\xd9\x0d\xeb\xb0\x50\x05\x98\x1d\xda\x37\x8f\x1f\x6a\x69\xc4\x11\x96\x5f\x01\x93\x13\xb8\xab\x31\x3c\x45\x21\x7e\x93\x08\x0f\x9d\xa5\x57\x96\x0c\x37\xfe\x23\x42\xe3\x6e\x5d\xfd\xfd\x0a\x0e\xce\x76\x87\xa9\x0d\xa7\xbd\x16\xef\xc8\x7d\xad\x15\xdc\x47\xe5\xe4\xa3\x9a\x08\x6a\x64\x4f\x9b\x73\x5c\x06\x52\x3d\x19\x5e\x58\xc9\x2d\x47\xfd\x5e\x2f\x8d\xa4\x73\xe5\x6b\xc9\xc0\xe8\x55\x30\x63\xac\xb2\x66\xb7\x77\xe9\x52\x20\xe9\x77\x08\x0d\xfe\xd9\x37\x74\x81\xc1\xd3\x66\xc6\x4b\x30\xd0\x83\x7a\x16\xe7\xeb\x87\xa1\x3b\xcc\x4e\xda\xb3\x08\x5a\x07\x54\x3e\x42\x5c\xf1\xb8\x2c\xbe\x54\xc4\x16\xd4\x18\xa6\x02\x3d\x74\x9e\x0f\x96\xa6\x68\xed\x4d\xa6\x2a\x3f\x1b\x62\x0f\x34\x48\x3f\x37\xb7\x0d\x51\x7d\x8b\xc4\xbc\x60\x5c\x51\x74\x4c\xfd\x0f\xad\x5a\x51\x91\xa0\x1c\x53\x80\x55\x2b\x62\x1c\xd6\xd4\x8e\x85\xb4\xaf\x91\x60\x33\x59\xd7\xa0\x25\xb7\x87\x83\xa6\x06\x39\x99\x1a\xa8\xef\x6d\xc4\x04\x39\x35\xa4\x5b\xb2\x68\xfb\x28\x63\xb9\xa4\x7f\x27\xc5\x1c\x1d\x15\x91\x25\xbe\xa9\xf1\x6d\x88\x7b\xa2\x67\xc8\x38\xe6\xaa\xf1\xe1\xee\x88\x83\xef\xe7\xa7\x97\xac\xd4\x65\x78\x88\xc1\xe3\xca\x99\xb7\xfb\xe2\x51\x6a\xb3\x38\x1b\x9f\x7e\x4d\x7e\xf9\xcf\x25\x50\xbb\x01\xec\x2f\x97\xfd\xe5\xf2\x3b\x5d\x2e\x4b\x4b\xb3\xec\x6f\x98\xfd\x0d\xb3\xbf\x61\xfe\x0c\x37\xcc\x5c\x67\xa6\x58\xa7\x53\x42\x03\x8f\xcc\xc2\xd9\x9d\xdd\xac\x82\x55\xbc\xe6\x33\x61\xd7\xde\xb8\x22\xd9\x9b\xef\x92\x0e\x10\x7b\x97\x74\xac\x00\x80\xdd\x76\x32\xc7\x42\x5e\x66\x8b\x03\x62\x59\xc3\xa6\x63\xe1\xc2\x21\xb7\xfd\xde\xc2\x06\x2c\x87\x01\x6a\x55\xa3\xa1\xb1\xd1\xdf\x5b\xe3\x02\xdd\x9c\x0e\xaf\x55\x76\x27\xcc\xc9\x26\xe0\xfb\x56\xcb\x08\x1f\x88\x97\x8c\xca\x23\x7b\xaf\x96\xaa\x44\x49\xe1\x9e\xf0\xce\xe6\x8d\xb5\x57\xf7\xa6\xe8\x4d\xca\x8e\x7f\xcb\x7e\xb0\xf7\xbc\x3b\x8e\xe4\x7e\x62\x46\xf5\x16\xd0\xd9\x2b\x95\xb3\x8b\x6d\x30\xc3\x96\x81\xb0\x7d\x59\x68\x61\x51\x75\xf4\xdd\x40\x83\xfd\x4e\xc8\x54\x37\x5c\xae\xad\xa4\x09\x88\x99\x2a\xa7\x90\x1a\x68\x0d\x4e\x0f\x63\x78\x36\x75\x21\x23\x2e\xf7\x5c\x8c\xc7\x22\xb3\x0c\x17\xb2\x5b\xa0\xbe\x95\x63\x9f\x14\x7d\x69\x54\x81\x81\x4b\xf6\x05\xe8\xad\x83\x04\x8b\xdd\x6e\x20\xcf\x2b\x0f\x56\x60\x87\x8c\xaf\xf8\x82\x03\x30\x6c\x15\x17\x04\x24\x86\x9e\x8c\x07\x9a\x39\x3f\x19\xf6\x80\x57\xff\xa5\xba\xb6\x93\x6d\x0a\xd1\x63\x18\x85\x1e\x7e\xa1\x6c\xc5\xf3\x47\x91\x35\x66\x1b\x31\x00\xed\xb0\xdd\xa7\x86\x93\xb9\x13\x73\x62\xdc\x71\xc1\x79\xd8\xaa\x6d\x30\xfa\xe4\x4c\x9c\xe4\xb9\x58\x00\xce\x7e\x86\xad\xfc\x46\xb6\xeb\x77\xb5\x49\xcb\x7d\xb4\x6d\xe1\xc4\x20\x01\xe3\x01\x42\xdd\x9c\x1f\xb8\x66\xdc\xbe\x00\xc0\x5f\xce\xcf\x6b\x45\x73\x23\x4a\x10\x27\xfc\x3e\xe0\x1b\x7a\x95\x10\xd9\xe1\x62\x09\x4b\x8d\xde\xec\x90\xdd\x42\xb2\x8d\x89\xf7\x62\xc7\xb8\xfd\x96\x26\x7a\x0b\x07\xe0\xd9\x67\x1d\x89\x7d\xc3\x45\x43\x7c\x1b\xcf\xbb\x7f\xa3\x7d\xe8\xdd\xc1\xd1\x70\xd0\x71\x1d\x42\x80\x03\x49\xa5\xa6\x96\x55\x21\xd8\x6d\xf3\xfa\xf5\x37\xd9\x9d\x98\xf7\x30\x8a\x80\xd8\x84\xfd\x55\xf8\xb2\x77\x22\x44\xb1\xa1\x0a\xa9\x6a\x7a\xd1\xfd\x89\x2f\xec\x8a\x5f\x9c\x23\x87\x88\x83\x50\xdd\x7e\x12\xf3\x80\x28\x2c\x93\x4d\x07\xec\x1c\x82\xe8\x66\x82\x97\x14\x6b\x07\x81\x1e\x71\x63\x07\xf0\x1b\x27\xa3\x52\xc9\xbf\x28\xd7\xec\x77\xe6\x23\x7f\x17\x73\xa7\x0b\x45\x4c\x64\xca\x5d\x11\x0a\xbf\xd7\x21\x58\x6f\xfd\xdc\xef\xc4\xdc\xc5\xc4\x08\xe8\x4c\x6a\x17\xcc\xe1\xf7\xd0\x5d\x78\xe7\x56\x6c\xd6\xff\x8e\x74\x95\xa9\xd9\x48\x96\xf8\x31\xec\xda\x2d\x36\xf3\xc1\x26\xda\x47\xd4\xc0\x67\x9e\xbe\x20\x6e\x08\x1b\xe5\x1a\x1a\x69\x52\x3d\xe8\x4e\xcc\x5f\x69\xaa\xe7\xa1\x4a\x3d\x95\x55\x92\xd4\x16\xa2\x29\xf0\x65\x17\x4f\x61\xe7\x88\xa1\xb8\xbf\x35\xbc\x48\x43\x31\xe8\x27\x6a\x64\x97\xea\xb7\x46\xde\xf3\x42\x40\x25\x16\xab\x40\xe4\x19\xaf\x11\x0f\x91\xc2\x6d\xb4\x72\x78\x8f\xf6\x48\x66\xbc\x0c\x17\x96\xdf\x05\x72\xb1\x56\xbc\x36\x32\x6b\x0a\x5e\x33\x4b\xcf\x13\x55\x77\x66\x4a\x49\x34\x9a\x23\x82\x6e\x15\x70\x6e\xda\xed\xdb\xbc\xbc\x12\xb5\x54\x39\x5c\xc4\x50\x06\x26\x25\xb4\xc3\x14\x60\x46\x8d\xdd\xd9\xf3\x07\x21\x45\x5f\x5e\x02\x45\x7a\x14\xb1\xa2\xe8\x12\x7f\xe7\x91\xc4\x21\x26\xcd\x45\x8a\x08\xe3\x41\x6d\x88\xec\xda\xf7\xbf\x5d\x7e\x71\x2f\x6a\x76\x48\x22\x82\xb8\x97\x99\x39\x1a\xb0\xff\xbf\xa8\x15\x42\x45\x8b\x09\x16\x79\x69\x99\x2e\x0c\x65\x27\x71\xcd\x5e\xb3\x43\x78\x8d\xc9\xd9\x4c\xe4\x92\x1b\x51\xcc\x8f\x5a\xc8\xd4\xbb\xae\x57\xd3\x5d\x5b\x4a\x78\x00\xde\x6e\xad\x7d\xf1\x4c\x5c\xf9\xe3\xed\x0f\x34\x44\xe0\x5a\x12\x8e\x41\x65\x03\xd2\xab\x3b\xff\x7e\xd7\xfe\xdb\x6e\x2e\x67\xb5\x98\x00\x71\x22\xf5\x7d\x2e\xf5\xd8\x85\x76\x5d\x53\xf4\xd0\x07\x3e\x12\x05\xc9\x53\x33\xb1\x56\xf2\x3d\x09\xd1\x68\x3e\xf6\xa8\x0e\x6f\x12\x84\xaf\x7b\x92\xdc\x7d\x08\x09\x00\xa1\x8a\x11\x56\x7e\x89\xa1\x6a\x3e\x27\xcd\x83\x4d\x00\x5c\x99\xd3\x1b\xc6\x4d\x1a\x82\xb6\xf2\x96\xdb\xcc\xef\x21\xad\xc7\xc5\x4b\x06\x46\xef\xc7\x1c\xb1\xf9\x2d\x95\xf3\x4d\xec\xe1\xa4\x64\x10\x07\x01\x5e\xea\xa8\xd4\x8a\x1e\xb0\x4f\x0e\x65\xaa\x0d\x73\x8f\x23\x76\x46\x89\x02\x4a\xb8\x0d\xd8\x39\xcf\xa6\x10\x5a\x39\x07\xab\x2a\x9e\x3c\xa9\xd9\xa7\xab\x05\x5b\xcb\x0b\xc5\xeb\x6d\x27\xba\xd1\x32\x3d\x5f\x74\x4b\xe9\xf8\x46\xd4\xb3\x27\xd2\xae\x11\xf5\xac\xcd\x9d\x6b\xa1\x9b\x02\xd4\x24\x5c\xf5\xdf\x1a\x51\x4b\xbb\x3b\x27\xac\x6c\x8a\xc2\x07\x67\xae\xea\xce\x11\x7c\xa9\x42\xe8\xdc\xcd\x54\xc4\xe7\xc4\x05\x5e\xcc\xe0\x86\x3c\xb9\x3c\x23\xf1\x9d\x32\xe3\xe0\x10\x35\x23\x8a\x8a\x1b\x37\x65\x86\x56\x06\x69\xe6\x96\x91\x5e\xaa\x5c\xc4\x73\x7e\xb9\xe3\x04\x53\x01\xf6\x70\xfe\x68\xd7\x48\x77\x88\x41\x3a\x59\x8c\xb7\x5e\xc6\x2a\xb4\xe5\xfc\xb0\xc0\x6d\x31\xe6\xb9\xb9\x6c\x1b\xd9\xdb\xf3\xa9\x7c\x5b\x42\x05\xec\x9b\x53\x1f\xc6\xbb\x4e\xe3\x58\xf1\x4a\x64\xe2\x86\x68\x57\x45\x98\x3e\x41\x51\x00\x75\x9e\xcf\x14\x29\x10\xc8\x76\xdd\x56\x74\xd8\x73\xd8\x93\xeb\x15\xa9\x3e\xcf\x29\x5c\x94\xf4\xbb\x36\x7a\x29\x6e\xe9\x61\xd8\x8d\x62\x63\x59\xb6\x26\x3a\x70\xa9\x56\x51\x14\xb9\xf4\x75\x67\x3c\x4f\x87\x9c\xad\xa6\xa4\x0c\xda\x80\x55\x63\x17\xa8\x24\x03\xd7\x18\x57\x0e\x8f\x88\xac\x17\x74\x5b\xa2\xe5\x5c\xcd\xb8\x2c\x57\xe8\xd0\x33\xfe\x78\x7d\x27\x1e\x36\x9c\x90\x8f\xd8\xaa\x05\x67\x9e\x8b\x49\x2d\xc0\x7a\x88\xb2\x18\x8c\xc6\x85\xa5\x97\xe2\x5e\x58\xbd\x3e\x97\x9a\x40\xcf\x73\x52\xae\xfe\xf1\x30\x15\xe5\x4f\xa5\xe6\x46\xea\xb1\xe4\xa3\x42\xfc\xc7\x99\xba\x54\xc6\xa9\x50\xff\x70\xa2\x1e\x6a\x93\x88\x70\x51\xd9\xf9\x03\xf6\x7c\x2e\xc7\x0e\x72\x6c\x24\xcc\x83\x20\x6f\x47\x58\x94\x94\xae\x52\xc0\x7d\xbf\x28\x2e\xc8\x77\x52\xa8\x11\x2f\xd8\x4c\x96\xf6\x33\x03\xf6\xde\xf2\x4a\x44\x76\x03\xc4\x0c\xce\xbe\xe9\xff\x53\x95\x11\xf4\x8a\x5b\x8b\x80\x89\xf4\x06\xe3\xab\x43\x7a\x97\x0f\x7d\x4d\x28\xd3\xd1\x3d\xd7\xec\xcd\xf1\x9b\xe3\xd7\x6f\xd9\xff\x30\xdb\xf5\x1b\xfa\xef\xd7\xf4\xdf\x6f\xd8\xff\xb0\xff\x61\x8c\x0d\x19\x4b\xfe\xcb\xe0\xbf\x7d\x26\xc7\xf1\x18\xde\xd8\x61\x66\x6a\x46\x13\x06\xed\xc2\x23\x9b\xd3\x8a\x02\x0d\x61\xd7\x70\x21\x67\x6a\x26\x60\x0c\x6f\xfe\xdd\xb5\xc1\x94\x30\xa6\x4a\x6a\xf9\xe6\x10\x86\x74\xc4\x1e\x40\x22\x9c\xf1\x3b\xa4\xbd\x93\xcc\x34\xbc\xb0\x1f\x3f\xfc\xba\xff\xfa\x88\xa9\x32\x6d\x7e\x2f\x55\x61\x05\x71\x1a\xe1\xe1\x9b\xa3\xc1\xc2\x90\xbf\x5e\x32\xe4\x64\xb4\x30\x0a\x5e\xce\xa1\xeb\xd5\x54\xe3\x08\xe6\xa4\x9c\x3f\xf0\xb9\x27\x1b\x77\xf6\x2c\x1f\x61\x53\x39\x99\x8a\x9a\x55\xb5\xc8\x44\x8e\x38\x75\x3e\x3f\x41\x3a\xb7\x10\x76\x3a\x67\xd2\xd8\x3b\xed\x95\x06\x39\x97\x70\x37\x08\x86\xe0\x2c\xf6\x73\xc2\xba\xc3\x9e\xbf\x76\x2a\x09\x99\x09\x76\x8e\xab\x14\x25\x0b\x6d\xd4\xe1\x7c\x4b\x77\x78\xac\xbc\xa8\xc6\x68\xf8\xa5\x8b\x0b\xae\x62\x9a\x36\x26\x09\x12\xeb\x09\x30\x87\xf6\x2d\xc8\xc0\x00\xc7\x6f\xc6\x8b\xd8\xf6\x11\x25\x92\xa2\x6c\xe7\x2a\x2e\xa1\x1f\x81\x78\x36\xfb\x25\xb4\xc4\x6a\x41\xc1\x78\x84\xbd\x91\xd9\x88\x23\x32\xee\xa8\xc9\xee\x84\x71\x55\x4b\xac\x74\x68\x14\xab\x1a\xc3\x3c\x1e\xdc\x02\xcf\x33\x0a\x3b\xc6\x57\x57\xed\xdb\xd3\x05\xe2\x05\x32\xdb\xb0\xec\xbf\xb4\xdb\x47\xb6\x28\xba\xef\x72\xc1\x69\x7d\xd1\x00\x20\xc7\x0e\x01\xa9\x7c\x15\x88\x0f\x23\xdc\x81\x43\x84\xb4\x19\x7b\x78\x12\xe6\xc8\x0e\x49\x1f\x3e\x62\x46\x14\x85\x73\x1b\xe3\xc3\x9a\x8c\xe1\xfe\x07\xa0\xe8\x3e\x4b\x0f\xca\xd2\x17\xe3\x97\x9c\xcf\x47\xa2\xf9\x1f\x12\x13\xa4\x2a\x7b\xb7\x25\x03\xf8\xa6\x89\x04\x80\xa7\x4e\x47\x0b\xd9\xc7\x54\x14\x15\xab\x45\xde\x60\x88\x85\xed\x48\xdf\x89\x87\xc1\x6d\x79\x12\x4d\x96\xd0\xa6\x42\xa2\x72\xb2\xae\xb7\x07\x98\xc1\x5d\xa6\xcc\x43\x8e\xb1\x02\xb1\x65\x79\x72\x4c\x39\x13\x95\xd2\x08\xf4\x09\xa4\x0f\xb8\x5e\xa0\xec\xf9\xc4\x2b\xfb\x26\x0e\xcd\x31\xac\x5b\x77\xc9\xa1\xdf\x43\xab\x84\x9e\x3f\xcf\xb5\xf0\x8d\x65\xc9\xeb\xaf\x85\x21\xfc\x6f\xf1\x7a\xb8\x18\xb3\x25\x94\xe8\xc7\x92\xd0\xd0\x53\x6e\x8c\xaf\x81\xb1\x7f\x73\x14\x5d\x1c\xdf\x1c\x7f\x7d\xfc\xe6\xd0\x8e\xf5\xeb\x23\x3b\xea\xe4\x4a\x78\xe3\xaf\x04\xff\x26\x8d\x48\xe8\xe4\x52\xb8\x28\x29\x5f\xe3\x41\xd5\x39\x19\x21\x3c\xc0\x1a\x2f\x99\x36\x0e\x10\xc4\x83\x42\x12\x58\xa3\xa7\xd9\x07\x65\xcf\x0f\x5c\x4d\xd2\xb0\xbf\xcc\x54\x2d\xfe\x12\x35\x7f\x26\x4f\xe8\xa8\x28\x3a\x01\x6a\x05\xcf\x5e\xcb\x59\x9e\xad\x4e\xce\x2b\x91\x2f\x0d\x0c\x5a\x23\xa6\xaf\x7a\x27\xc4\x75\x8b\x12\x12\xf7\xe3\x1a\x8e\x46\xb1\x42\x18\x08\xbf\xc0\x3c\x25\x14\xaa\x6c\x5f\x01\x02\x36\x77\x09\x59\x12\xce\x70\xa0\xf7\x25\xe1\x35\xeb\x2a\x07\x7f\x4f\xf5\x2e\x37\xd4\x0d\x86\x66\xee\xaa\x83\x1a\x99\x1e\x93\xc1\x17\x7b\x45\x24\xf9\x30\x42\xb0\x83\xc5\xef\x2e\xa9\xaf\x14\x42\x69\xa0\xc0\x6c\xcb\x21\x6c\xd7\x1e\x22\xa3\xe0\x8b\xc8\x19\xa2\x5a\x2f\x53\x59\xe7\xfd\x8a\x43\xfc\xc2\xbc\x12\xba\x97\x7c\xcd\x43\xb1\x6f\xe1\x17\xe8\x5e\x0f\xd7\x6d\x0d\x82\x66\xac\x58\x89\x17\x29\xcc\x18\xc7\x69\x39\xe7\xfb\x73\x47\xd0\xd5\x60\x63\xd7\xa7\x3d\xda\xe7\x1e\x30\x0c\x5f\x5a\x73\x9a\x7e\x76\x71\x9c\x91\xcf\x01\xab\x7d\x51\xf4\x16\xdc\x15\xde\x81\x4e\xca\x11\xc6\x20\x60\xc4\xa5\xa5\x9d\x50\x00\x4c\xfa\x22\x66\x5d\x8e\xca\x83\x3e\x2f\xb8\x36\x32\x7b\x57\xa8\xec\xee\xda\xa8\x7a\x61\x83\x3a\xdb\x20\x4e\x7e\xb9\x5e\xe8\x2c\x09\x77\x5d\xa7\xff\x2e\x7b\x39\x59\x94\x92\x9d\xfc\x72\xcd\xce\xa4\xbe\x8b\x0b\x31\xf3\x85\x20\x04\xee\x2a\xd8\xbf\xd2\x18\x87\x4a\xea\xb9\xd3\xd7\x4a\x8f\x64\x14\x62\x53\x9e\x9e\xc4\x87\xd1\x5e\xc7\xb8\x45\xfa\x2b\xfe\xa0\x05\x8e\x7e\x64\x47\xaf\x61\x1d\x97\x1e\x01\xfe\xcf\xa6\x16\x76\x16\xdb\x2f\xb3\xeb\xa1\xfb\xda\xba\x37\xda\x0b\x6a\x7f\x67\x67\xdc\x70\x5c\x57\x2c\x52\x4f\x71\x2d\xb0\x76\x76\xcd\x46\xc0\xc2\xe0\x51\xb4\x62\x6b\x66\xf7\x5e\x2e\x8a\xbc\x4f\x9b\x9d\xed\xe1\x69\xb3\xb3\x6f\x2c\x9d\x1d\x3c\x70\xb9\xd1\xcf\x9f\x60\x26\xaa\xe9\x78\xc1\x1a\xd8\x3d\x59\x4a\x54\xd3\xf7\xd7\x9d\xa7\x86\xcd\x53\xde\x60\x7f\x63\xef\xaf\x97\xcc\x05\x15\xd1\x29\xaf\x29\x05\x38\x7f\xa5\x59\x21\xc7\xc2\xc8\xd9\x0a\x62\xcc\x64\x99\x3f\x23\x41\xef\x14\x5e\xef\x3e\x1b\x68\x9e\xce\x06\x47\xe0\x58\x9d\x3f\xc7\xdc\xed\x08\x86\xb1\xd1\x89\x4e\x0f\xf4\xd2\x43\x4b\x12\xb6\x76\xe5\xbd\x67\x73\xfd\x5b\xd1\xc7\xaf\xf4\xab\xfc\xf8\xea\xfc\xe4\xec\xe3\xf9\x60\x96\xaf\x58\x10\xc8\x45\xfb\xc8\x17\x64\x87\xee\x6b\xe2\x7a\xe8\xbe\x2c\xee\x8d\xd6\xca\xf8\x9f\x69\x5f\x41\xd7\xa8\x54\xd5\x14\x28\x3c\x49\x4d\xcb\xb6\x62\x2a\x5a\x6e\x3f\x89\xeb\x8b\xee\xc3\xbf\xbe\x60\x87\xa7\xfe\xfa\xa1\x38\x58\x76\x51\x1a\x51\x8f\x79\x26\x8e\xe2\x69\x89\x6a\x2a\x66\x90\x69\x4d\x1c\xd4\xb3\xf0\x29\x2f\x73\x2a\xfc\x9c\x89\x1a\x00\x6f\x7c\x26\xb9\xfd\x44\x5e\x4b\x40\x6e\x38\x7c\x07\x75\xa6\xd1\xd4\x7f\xb4\xe2\x94\xe6\xea\xa1\x7c\xe0\x75\x7e\x32\xbc\xd8\x7a\x0d\xce\x42\x1f\x9d\xd7\x22\x7a\x27\x9e\xb5\x1b\x0e\x08\x7d\x7c\xa4\x1a\xe3\x15\xe4\xed\xf6\x16\x5c\x31\x67\x72\xfb\x93\x7b\x4e\x1d\x74\x9e\x99\x7b\x21\xa5\x51\x23\x66\x95\xaa\x79\x3d\xa7\xfa\x42\xaa\x9e\xaf\xe5\x42\xcf\xbe\x67\x61\xe2\xb9\x5c\x61\xe9\xf2\xd4\xb5\xfd\xba\xb8\x1e\xba\x2f\x8c\xa7\xe8\x64\x65\x88\xa1\x2d\xa1\x6e\x8f\x8e\xe1\x8f\x00\x92\x36\x3b\x3c\x89\xbd\x58\x84\x09\x8b\xfd\xd0\x12\x66\xf3\x0c\x55\x72\x23\x13\xf1\x85\x02\x19\x5d\xc9\x4d\xc3\xfa\x31\x7e\xb7\xc3\x4a\x1d\x89\xb1\xaa\x83\x69\x46\x1b\x5e\x1b\x4d\x50\xd4\x96\xbb\xfa\x52\xdb\xce\x76\xa3\x11\x89\x5b\xe4\x58\x5b\xc8\xc5\x5d\xc8\xf1\x5b\xc6\x8f\xe2\xfc\x02\x17\x80\x57\x0a\x91\x43\x2f\x32\x32\x01\xd5\x4d\xa9\x7b\x6c\x74\xe4\x26\xa6\xd1\x9e\x58\xcf\x78\x41\xef\xdb\xc9\xdd\x21\xe2\xa7\x02\xcf\x30\x94\x52\xd2\x25\xaf\xf4\x54\x01\x36\x47\xc6\x2b\x9e\x49\x33\xbf\x2d\x19\x63\xa6\xe6\xd9\x1d\x04\x35\xd7\x82\x3e\xd9\xbb\x2d\x33\x1c\x51\x6b\x4d\x5b\x69\x0d\x08\x27\xc7\x7d\xab\xac\xe0\xda\x2d\xc1\xd2\xf7\x3d\xf8\x6b\x3e\x2f\xf9\x4c\x66\x6e\xc6\xe0\xb3\xd4\x52\x51\xca\x0b\xf4\x0b\x83\xe3\xac\x9d\x47\x7c\x5a\x70\x39\x63\x87\x5a\x08\xb6\x94\xba\x40\xe3\x9c\xa9\x1a\x4c\x5a\x89\xc6\x1c\x02\x8c\x09\xd6\x27\xf2\x56\x78\x06\x01\x6a\x1a\x7e\xba\xcc\x97\x7f\xfc\xc8\xef\xdf\xf2\xb1\xa9\x1a\x32\xdf\x5d\xce\x88\x28\x73\x55\xf7\x69\xd9\x32\xcb\xb3\x10\xb4\xc5\x6d\x16\x5a\xbf\xb0\x27\x42\x73\x81\x62\x01\x80\x5b\x82\x38\x3f\x8e\x54\x11\x6d\x45\x96\xb9\xbc\x97\x79\xc3\x0b\x10\xac\xdc\x60\x2c\x57\x87\xd7\xe5\x64\x6a\xfa\x0f\xc2\xfe\x87\x61\x91\x91\x70\x4d\xb8\x8f\x12\xc6\x60\xb8\x09\xec\xd6\xce\x04\x47\x99\xcd\x83\x18\x81\xbd\x90\xcf\x59\x9f\xd9\xf5\x06\x0f\x93\xca\x1a\x0f\x75\xe5\xe6\x48\x5d\xb8\x95\x8f\x57\x1d\x86\x77\xe2\xad\x5a\x8d\x16\x6c\xa4\xa8\x98\x2b\x90\xee\xe2\xd8\xc0\x44\xd7\x4e\xcc\xd3\x0b\x68\x57\x2b\xee\xaa\x71\xb6\x35\xb7\x7a\x7f\xda\x99\x4d\xbd\x3f\x4d\xf9\xd3\x7b\x39\xaa\x05\x3b\x9d\xf2\xb2\x14\xc5\x0b\x28\x54\x2b\xe6\x5a\x88\xc7\x05\x85\xf8\x89\x73\xf6\x5d\x74\x99\xb5\x6f\x9c\xce\x1e\xc0\x26\xc3\x69\x5e\x98\xbe\x3f\xde\x22\x3f\xf6\x4b\x81\xf1\xa9\x80\x70\x23\x32\x4a\xb1\xa8\x8a\x66\xb2\xd2\x31\x3a\xb6\xaa\xe0\x33\xc4\xeb\xf7\xf8\xfe\x13\x66\x0b\xed\x5b\x1b\x4d\x3f\xb6\x25\xec\x35\x1b\x4b\xa1\x15\x11\x52\xb6\xdd\x55\xd7\x11\x41\x90\x7a\xb8\x15\xb2\xc9\x34\x65\xb9\xd2\xec\x33\xc9\x44\xe0\x3c\xcf\xd2\x7d\xbf\x3f\x3d\x4f\x7b\xea\xbc\x38\x0b\x6f\xa6\xcb\xf4\xfd\xe9\xf9\x97\x6a\x5b\x98\x64\x22\x70\x97\xdc\xae\xde\xf2\x45\x96\xe6\x4a\x54\x6a\xfb\xa5\xc5\xf7\xbb\x2f\x28\xb6\x6f\x1d\x2c\x69\xec\x0f\x4a\x4b\x90\x05\x31\x60\x35\xc4\xa3\xd6\x02\x8f\xd5\x80\x9d\x9d\x0f\xaf\xce\x4f\x4f\x6e\xce\xcf\xde\x32\xd7\x13\xd2\x5c\x2d\xa8\x34\xcf\x8d\x0a\xe7\x10\xf5\x21\x52\x31\xc8\x0f\xe6\xbe\xd5\x23\x55\x98\x97\xcc\x4b\xa9\x12\xdd\xbf\xec\xa2\x94\x26\xe8\x26\x04\x98\xa7\x4a\xe1\x82\x9e\x2a\x45\xc7\x7a\x22\x0d\xd5\x2e\x20\x43\xc0\x54\xb4\x7a\x0b\xf9\x90\x21\xe3\x67\xc5\x4e\xa0\x7c\xf7\x0c\x33\xc1\xf7\xae\x87\xee\xbb\xe1\xde\x68\x91\xb5\xff\xf9\x69\xe6\x82\x4e\xba\x35\x11\xe8\xb1\x9f\xef\x26\xed\xda\x7e\x76\xc8\xcd\x74\xeb\x75\xf9\x81\x3a\xe8\xbc\x2c\xee\x85\x74\x55\x7c\xf2\x26\x08\x9b\x56\x58\x55\x75\xa4\xc1\xc4\x8b\xe4\x0e\xb8\xe3\x06\xd8\xaa\x98\xb7\x0f\x7a\x94\x05\xe6\xe2\xd2\x10\xd1\xb8\x28\xe6\x28\x9b\x00\xaa\x34\x26\xcd\x73\x04\x44\xb6\x72\x97\x41\xff\xa7\xbc\x97\x85\xc0\x02\xba\xb2\x9c\x44\xa8\xeb\x2e\x77\x00\x32\x19\xc5\xc2\xb8\xec\x3e\x41\xc1\x15\xfa\x3a\xc5\x20\x5f\x7e\xba\xc1\xda\x4d\x56\x50\x7c\x36\x03\xb2\x1f\xac\xec\xb6\x2d\xdd\x54\xa9\x9f\x63\x69\xb8\xb8\x7e\x8a\xad\x01\x5a\xb7\xcc\x7c\xf8\xdb\x67\xe4\xdd\xab\x8e\x01\x2c\xc4\xa6\x23\xd0\xc1\x03\xf2\xb3\x53\xf9\x4a\x84\x35\xf6\xb0\x0b\x67\x97\xd7\xbf\x7e\x38\x79\x77\xfe\x01\x86\x9c\x26\xa0\x6f\x7b\xd9\xa8\x7b\x7b\x8d\x8b\x87\x63\x82\xa2\xeb\xdb\xfe\xfa\x14\xc2\x79\x0c\x5e\xb7\xe3\xaf\xe0\x3f\x5b\x78\x7b\x9e\xc1\x01\x2f\x9f\x60\x25\xbd\x6c\x99\x48\x4b\x76\xf9\x64\xfb\xe8\x73\xcf\x88\x9d\xeb\xd2\x45\xa8\x96\xa9\x5c\x5b\x2f\xcb\x52\x05\xae\xf3\x42\x6d\x7c\x3b\x65\x93\x51\x61\x4e\xb5\x52\xb1\x8d\x83\x77\x82\x93\x76\xdb\xe5\x0c\xab\xd5\x77\x2b\x1b\x7e\xc2\x5f\x32\xfb\xd9\x55\x8b\x3d\x55\x46\x95\x3b\x92\x35\x87\x4b\x3a\xeb\xbe\xd4\x4b\x5e\x4e\x57\x17\x5b\x9c\x7a\x40\xff\x58\x85\xb4\x52\xde\xd3\x8c\xe1\xab\xb3\xa7\x1f\x54\xfd\x5c\x9d\x6b\x98\x74\xd3\x65\xf6\xc9\x0b\xad\xcb\x97\x9e\x6d\x65\xf3\x5f\x31\xcd\x5a\xfd\x37\x64\x07\x6c\x3f\x43\xd7\x43\xf7\xab\x08\x8a\x45\x42\x38\x51\x51\xd8\x53\xa0\xca\xb8\x12\x01\x42\xa4\xe8\x1e\x99\xf1\x67\xbc\x72\x76\xa6\xc8\x16\xbc\x7c\x36\xbf\x35\x6a\x34\x37\xdb\xef\xd6\x8f\xf8\x7e\xe7\x99\x50\xfb\x74\x97\xdc\x8f\xbb\xf0\x32\xd5\xa3\xed\x37\xe6\xea\xdd\x59\xe7\x89\x5c\xbd\x3b\x4b\x27\x71\xc5\x73\xa5\x19\xf8\x93\xd9\x99\x58\xe1\x01\xdc\x99\x18\x5c\x8f\x36\xba\x97\x74\xc6\x0b\x71\xf1\x69\x7b\xc0\x7a\x7c\xbf\xf3\x8a\x50\xfb\x74\x55\xdc\x8f\x8b\x58\x52\xab\x8e\x62\x8c\xeb\xa2\x72\xb1\x2a\x99\x1a\x69\xfe\x19\x68\xfc\xf6\xf5\xee\x73\x43\x10\xa2\x64\x6a\x0e\x98\x68\x83\x53\xe5\xd9\x12\x31\xcd\x74\xf9\x2a\x60\x5b\xb5\xbd\xec\xb3\x1c\x2b\x6c\xed\x5a\x78\xf0\x99\x7a\x39\x6e\xd8\x6e\x36\xf8\x5e\x57\x53\xe1\x62\x3a\xb6\x9e\xde\xcf\xd4\x0b\xe2\x5b\x3f\xe9\x56\xfd\x39\x1e\x40\xcb\xe1\x72\x0d\x8f\x9e\x7b\xab\xfc\xaf\xd6\xac\xd7\x81\xc0\xd0\x9f\xcf\x0c\x0d\x42\xc6\xb4\x26\x40\xe8\x3e\x6a\x16\xa3\xbd\xb0\x19\xaf\x00\x5e\x09\xb2\x7e\x6b\xfe\xc0\x20\xf6\x84\xe5\x82\xca\xb1\x12\x32\x55\x64\xae\xd8\x18\x0f\x84\xef\x2e\xd3\xd1\x5b\x83\x0a\x0d\x5d\xb0\x56\x05\xff\xc6\xb0\x3d\x57\xc8\x20\xb5\xbc\x60\xc2\x47\xa8\x15\x3b\x12\x30\x05\xd0\xb8\xb6\x08\x67\xeb\xa0\x4a\x95\x1e\x68\x25\x64\x15\x96\x01\x96\x68\x9d\x40\x5b\xa9\x1d\x47\x97\xb5\x71\x83\xa2\xa5\xde\x0d\x21\x01\xb4\xdc\xc6\x40\x33\x68\x95\x92\x91\xfd\xc5\xd3\xd1\xcf\x09\x64\xd8\xd3\xa8\x07\x7a\xea\x40\x3c\x40\x36\x91\xe2\x1a\xe8\x24\xc1\xfa\xa0\xa3\x1c\x32\x8a\xe9\x1c\xbb\x62\xfd\xa5\xf2\x96\x0f\xf6\xea\xed\xab\x2d\x48\x08\x07\x4c\xc5\xba\x52\x34\x8c\x65\xe3\x6e\x37\x6f\x97\x61\x80\xe7\x84\xf5\xef\x2a\x80\xe5\xe8\xcd\x0c\xe2\x86\x8a\xa7\x4b\x29\x44\x14\xc6\xcc\xe7\x8c\xd7\xaa\x29\x5d\x9a\x93\x4f\x54\xff\xd8\xfa\xf0\x25\x21\x55\x23\x0e\x5b\x5a\x05\x63\x24\x0c\xb7\x44\xfc\x66\xf0\xe6\xf5\xcb\x9c\x2a\xf8\x5e\xeb\x54\x05\xb0\x2f\x24\xa0\x97\x03\x66\xfc\x48\xcc\xdc\x36\xef\xbb\x98\x7d\x53\x37\xa2\x87\x3f\x01\x40\x63\x94\x75\x7e\x88\xe8\x8d\xaa\x8e\x71\x23\x8f\x52\x40\x06\x68\xb2\x15\x28\x63\x33\xda\x82\xde\x89\xb0\x81\x30\x02\xb9\x7b\xb2\x78\xa5\xd7\x90\x7e\x3c\xec\xdb\x83\xdb\x03\x76\xe8\x43\x04\x6a\xa5\x4c\xbb\x2c\x7b\xa7\xa2\x4a\x38\x89\xf3\xc7\x6a\x13\x42\xc6\xf9\x63\xc5\xcb\x5c\xe4\xc8\xec\x77\x34\xa3\x77\x62\xca\xef\xad\xca\x24\x67\xb2\xe0\x35\xd6\x5a\xb8\xc6\x31\x41\xb8\xbe\x28\xef\x65\xad\x4a\x48\xbf\xb8\xe7\x35\x26\x26\x78\xe3\x84\x66\xff\xbf\xc3\x9f\x4f\xae\x00\x3b\xeb\xc8\x55\xaa\xc4\x51\x06\x44\x99\x78\x24\x51\x77\x1d\x96\xd3\x8d\xc4\xae\x0e\x9c\x57\x37\x32\xfb\xa5\x59\x63\xb0\xee\xbb\x78\xcc\x8a\x46\xcb\xfb\xce\x74\xbf\xe5\xa5\x11\x38\xec\x6e\xee\x8c\x4b\x95\x8b\x25\x35\xcb\x56\x40\x4e\x46\x8d\x7d\xb4\x49\x5c\x9f\x07\x6e\xf9\x42\xce\xa4\xe5\xe2\xdc\xa0\x2c\x99\x04\x2b\x50\x9e\x9e\x8f\x5e\xb6\x04\xd3\xe1\x62\x89\x16\x67\x4b\x73\x62\x94\x3d\xbe\x5e\x87\x74\x89\x1e\x51\xca\xb1\xd5\xd6\x21\x0b\x68\x61\xae\x2e\xb0\x7f\x26\x76\x5a\x2d\x00\x97\x9b\x6c\x12\xeb\x41\x9a\x42\xa3\x24\x3c\xdc\x5b\x44\x18\x2f\x54\x39\x41\x97\x19\xde\x32\x01\xac\x37\x0a\x20\xd1\x9d\xea\x71\xec\x2a\x34\x32\x9a\xd9\xba\xbd\x88\x63\x61\x42\xd4\x5c\x88\x8b\xcc\xb9\xe1\x54\x6d\x73\x75\x61\xbe\x1d\x87\x02\x3e\x6b\xe8\xd1\x58\xba\x0d\x7e\x27\x1a\xf5\xb3\x86\x4c\x1a\x75\xc7\xd1\x42\x44\xc0\x49\x06\x69\xe7\x37\xea\x4e\x2c\x08\x54\x4f\xad\xcd\x1b\xf7\xf5\xcc\x79\x2c\xf4\xb7\x66\x52\xcf\x3e\xc0\xeb\x55\xdc\x8e\xb0\xdf\x2d\x95\x76\x8f\xf4\x1d\xcd\xa5\x93\x5c\x83\xe6\x0f\x2c\x29\x78\x71\xb6\xa9\x26\x27\x45\xfe\x61\x73\xf6\x0e\xe2\x7b\x3e\xf2\x92\x4f\x10\xe5\xe7\xf0\x7a\xf8\xee\xe3\x91\x25\x16\xf0\x18\x5f\x9c\x31\xae\xb5\xca\x64\x5a\x87\xfe\x3a\xfe\xe6\x96\xa5\xf4\x75\xbb\x8f\xdd\x8e\xbc\xdc\x6e\x54\x48\x85\x5d\xa5\x5d\xf4\xc0\x42\xfa\x37\x5c\xa2\x2d\x5a\xbe\x9f\xe5\x77\xbb\x95\x94\xa2\xe1\x3d\x57\x34\xfa\x05\x42\x11\x45\x3e\x54\xb9\x13\x77\x36\xa0\xec\xdc\x4c\x05\xc3\x00\x46\xc4\x60\x2b\x0a\x67\x02\x41\x5c\x9c\x9c\xad\xe8\xd3\x95\x1a\x03\x57\x3f\x20\x60\x56\xa2\xee\x23\xcc\x2a\x41\x7f\x40\x2f\xf6\x94\x61\x2d\x4e\x7b\x50\xec\xf3\x43\x7d\xb4\x99\x0f\x54\x2b\x67\xc0\x9e\xe8\x00\x4a\xfb\xe9\x22\x41\x0d\x18\x46\x51\xba\xa2\x3d\x80\x13\xd4\x5b\x7a\x68\x52\xd4\x11\x5c\xc8\x15\x26\x48\x7c\xb8\x81\x02\x29\x96\xb4\xfd\xa9\xa8\x38\x72\xfb\x9b\xad\x85\xea\xb5\xb0\x7b\xfb\x6f\x5e\xb7\x75\xe9\x2d\x71\x19\x3a\x52\x33\x4d\xb3\xb7\x7a\x2b\x9f\x4d\xe4\xb2\xcc\xd5\x83\xbe\x16\x59\x53\x63\x85\x29\x23\x1e\x0d\x42\x3b\xaf\xab\xf8\xb6\xf6\x3d\x6f\x8e\xa1\x56\x21\x8a\xd8\x17\x9b\xc4\x62\x81\xbe\x20\xc0\x66\x1a\x9e\xcc\x34\x3f\xf5\x6f\x5c\x57\x62\x21\x5e\xb6\x1d\x0a\xf5\xf1\xfa\x24\x7d\x81\x49\xa8\x55\x4b\xc1\xef\xf6\x39\xe3\xf9\x4c\x62\x51\xa9\x07\x31\x9a\x2a\x75\xc7\x0e\x9d\x23\x60\x22\xcd\xb4\x19\x0d\x32\x35\x8b\x7c\x02\x7d\x2d\x27\xfa\xf8\x81\xa6\x65\xc7\x74\xc4\x64\x59\x48\x17\x4a\x66\x27\x1e\x61\x5c\xe1\x47\xc2\x44\x41\x9d\xa0\xb4\x4e\xba\x39\x17\x87\x09\x36\x94\x6d\x41\x27\x16\x97\xa9\xc3\xcd\xb1\x62\x0c\xad\xf4\xdb\x95\xf3\xc1\x02\x10\xdb\x98\x7a\x9a\xf2\x44\xff\xa4\x45\xdd\x61\x8c\x96\xb7\xba\xa6\x2c\x90\x96\xfd\x78\xdd\xe0\x29\x05\x34\x38\x28\x10\xb9\x68\x79\xa6\xaa\xe5\xa9\xa6\x6f\x9b\x34\xda\x2a\x43\x3e\x39\x40\x96\x4c\xce\xec\x2d\x3a\x13\x86\x83\x64\xd8\x92\x3f\xd8\x47\x3e\x67\xbc\xd0\x0e\x23\xdf\xbe\x31\x54\x79\xeb\x20\x40\x76\x38\x3d\x85\xb8\xf1\xd6\x73\x8c\xd2\x5f\x78\x2d\x41\x50\x8c\xc7\xd4\x7e\xdd\x40\xa1\xdd\x00\x98\xf1\xd2\xf0\x89\xb9\xd4\x99\xba\x17\xf5\x7c\x70\xff\x66\x24\x0c\x7f\x33\x70\x75\x52\xd7\xf0\x08\xd7\xa4\xe5\x9c\x93\xe5\xa4\x10\xac\x50\x13\x40\x84\xb9\x3d\xa0\x62\xc6\x56\xd4\x73\x05\xa9\x09\xab\xbe\x73\x91\x48\x2a\x2a\xbb\x11\x7e\xd0\xb7\x43\x02\x91\xa1\x70\x3d\xa6\xd9\xa4\xc7\xd7\x9b\x53\x39\x78\x09\x8d\xa8\xab\x1a\xf2\x63\x78\x96\xa9\x3a\x86\x7d\x4e\x6f\x91\xb4\x84\x2c\x7d\xd3\x4a\xe2\x0e\x02\xe8\x54\x95\xba\x99\x89\x9a\xcc\xa7\x98\x15\xe4\xe1\xa8\x4c\x48\x32\x08\xe3\x8d\x4c\xe4\x76\xff\x91\xbe\x65\xcd\xd4\x43\x09\x69\x31\x23\x59\x48\x03\x48\x7d\xc1\x2c\xeb\xb8\x30\x37\xac\x10\xdc\x0a\xe8\xa5\x1f\x0e\x58\xd4\x4a\x85\x79\x0f\x90\xb2\xb1\x78\xb7\xed\x14\x37\x31\x79\xb4\xba\x5c\xa5\x5e\xe5\x4f\x5d\x5d\x07\x74\xa3\xf8\xb2\x9a\x78\x4f\x43\xa7\xeb\x64\x99\xf0\xed\x00\x6d\xb1\xc2\x2a\xb1\xb4\xc4\xa4\x27\xb2\xd5\xf1\xb0\x1d\xec\xed\xae\xd9\x52\xda\xf5\xb4\x1a\x17\xf3\x1e\x61\xdd\x6c\x24\xb5\xa4\xc6\xb0\x51\x00\xa7\x26\xcb\x49\x23\xf5\x34\x7a\x00\xa6\x5b\x80\x43\x42\x33\xd1\xa1\x18\x4c\x06\x96\xfa\xce\x2e\xaf\x31\xb0\xeb\xc8\x2a\x86\x85\x01\x20\xef\xb8\x06\xbc\xcc\xa6\x58\x2e\xde\x85\x81\xf9\xf1\x06\x63\x6f\x84\xc9\x33\x6e\xca\x09\x00\xeb\xe0\x17\x66\xae\xcb\x13\x87\x11\x85\xdf\x3c\x0a\x6a\x68\xa1\x1e\x44\x9d\x71\x8d\xa1\x9a\x15\xd7\x1a\x06\x05\x88\x79\xec\xf0\xea\xfd\x29\x7b\xf3\xe6\xeb\x6f\x8e\xb0\x2e\x3c\x26\xf1\x6c\xe1\xf7\x50\x79\x97\x62\x42\xae\x59\x1b\x3f\x33\xbe\x2b\x2f\xad\xf8\x6e\x17\xc1\x17\xc5\x6f\x6d\x18\x59\x41\x1d\xca\x58\x80\xe6\x0b\xcb\x8a\x79\x50\x10\x77\x67\xbb\x4b\x76\x9a\x5e\xc7\xf2\xe5\x91\x18\x9d\xb0\x9f\x4b\x37\x50\x87\x8a\x39\xe1\x5b\x81\x89\x23\xea\xdd\xe7\xaa\x69\xe8\xbf\x86\xa0\xba\xad\x08\xc4\x28\x4c\x81\x60\x62\x40\xcd\x4c\xb6\x22\x5e\xed\xf5\x78\x68\xed\x09\xf1\x1c\xcf\x3a\x2f\x86\xcb\x6f\x9b\xb5\x6b\xd6\x66\x82\xed\x89\x45\xf5\xec\x91\x8f\xf0\x7a\x24\x0d\xe4\xce\xfa\x67\x09\x6b\x59\xa2\x27\x25\x77\x96\x06\x70\xb6\x63\x94\x19\x2a\x2e\xeb\xc0\xfc\x6d\x2f\xe1\x2d\x04\x67\xc3\x9e\x07\x3b\x08\x0a\x46\x18\x38\xe6\x6b\xe5\x5b\xc6\x23\xcb\xac\x68\x72\x01\x41\x09\x88\xb6\xa8\xc6\xec\xcd\x77\xed\x11\xba\xe0\x78\x6c\xad\x11\x8d\x89\x20\x74\xc0\x6f\x10\xa2\xaf\xc7\xaa\x28\xd4\x03\xea\x83\x45\xc1\xee\x4a\x7b\xe1\xdd\x89\xb9\x7e\xcb\xfe\xc2\xd2\xc1\x3b\x7e\xf3\x36\x12\xa2\x52\x34\xff\x94\x83\x22\xa6\xd7\x6d\xc9\x22\xa5\xc0\x2d\xad\x1d\x0d\x55\x71\xa7\xc1\x12\x13\x0b\xae\xce\xe4\xce\xb7\xbd\x04\x70\xbc\xc1\x6d\xf9\x97\x00\xf9\x95\x8e\xf2\x9f\xaa\x5c\x33\x42\x40\x02\xf3\xc3\xb1\xbd\x6e\x3b\xa2\x8e\xc3\xa9\xc5\x44\xaa\x72\xf5\x80\xf0\xf9\x4b\x0c\x29\x75\x57\x87\x8c\x1f\xe0\xee\x2e\x30\x84\x32\x8f\xed\x65\x80\xc0\xbd\x8c\x57\x92\xdd\x8b\x1a\xd0\x78\x57\xf0\xb1\x58\x96\x65\x4f\xd0\xb6\x83\x14\xb9\xad\x56\xdd\x49\xd2\xd8\x2c\x30\x87\xc6\xab\x6a\xa9\x7b\x89\x84\x72\x6b\x03\xaf\xeb\xe0\x44\xe3\xf9\x26\xe7\x3a\xb4\x49\x28\x01\xe2\x76\x22\xa6\x4a\x05\xb2\x2b\x4e\x16\x5b\xab\x89\xc8\x7b\xc1\x4c\xcd\xc7\x63\x99\xf5\x52\x19\xf9\x61\xca\x0d\x60\xe8\x93\x11\xd9\x4a\xa8\xbc\xe4\x13\x67\x85\x09\x1c\xed\x84\x95\xb2\x58\xa0\x44\x5e\xb2\xa6\xc4\xb3\x0f\x65\xdd\x01\xf4\x0d\xac\x61\x19\xd4\xf8\x0f\x52\x0e\x51\xa0\x97\xd6\x71\xd4\xc9\xcb\x8c\x6b\x08\x11\x20\x30\xbe\x4c\xcd\x2a\x6e\x24\x08\xd0\x73\xfb\x40\xab\x52\x63\x10\xc1\xdc\x75\x57\xc2\xe0\xc1\x2a\x6d\xea\xc6\x01\x08\xe2\x75\x8d\x16\x6f\x7f\x65\x6f\x57\xd3\xb1\xbe\xb7\xb7\xc8\xfa\x4d\xa1\x56\x50\xea\xc0\x03\x6a\xc2\xd2\xdb\x91\x8a\x47\xcb\xb4\xc9\xe0\x6a\x1c\x60\x5f\x2d\x26\xbc\xce\x0b\xa8\x53\x45\xa5\x8f\xa2\x41\xe3\x72\xc4\x82\xa1\x93\x4c\x3c\x79\x05\xd9\x8d\xf0\xff\xec\xfc\x31\xde\xd9\x7d\xd8\x51\x84\xcb\xb6\x89\xbe\x00\x6a\x70\x29\x8b\xde\xe2\x0e\xe5\xf6\x4e\x77\x5c\x1e\x7b\xf2\x5f\x7d\xba\x98\x73\x13\xbe\xe9\x0f\x4f\x17\x91\x67\xed\xb6\x44\x13\xd9\xb0\x35\xf1\xa2\x6e\x3a\x35\xc9\xf2\x74\x25\xf7\xd3\x27\x11\xb8\x51\x90\x13\x1f\xc2\xed\xe2\xef\x03\xb0\x67\x3c\x86\xdf\x6f\xad\x77\x6f\x8d\x18\xa6\x75\xe2\x56\x31\x58\xdb\xac\x95\x86\x61\x7f\x69\x3c\x92\x5a\x3a\xe3\x2e\x58\x83\xd5\xb0\x56\x46\x65\x6a\x01\x74\x64\x89\x1d\x0b\xea\x2c\x20\x14\x2a\xab\xe8\x35\x42\x1c\xb4\x6c\x55\xd5\xa9\x4a\x87\x32\x90\xb6\x9b\x5b\xe6\xbc\xce\x63\x01\x98\xd0\xbe\xe7\xa5\xe1\x8f\x03\xf6\x53\xd9\xaf\x6a\x31\x96\x8f\x22\x8f\x0a\x95\xda\x59\xd6\xf7\x94\x7b\x78\x71\x72\x79\x12\x7a\x72\xd9\xdb\xd8\xf8\x90\x6b\x56\x89\x9a\x5d\xbd\x3f\xed\x7f\xf7\xcd\x37\x7f\x85\xab\xd8\x4a\x8a\x6f\x8f\x8f\x1f\x1e\x1e\x06\x92\x97\x7c\xa0\xea\xc9\x31\xe0\xa0\x42\xe8\x8c\x3e\xa6\x2e\xfa\x4e\x39\xbc\x54\x65\xdf\xf7\xef\x66\xe7\xe9\xd6\x6a\x88\xad\x21\xea\x26\x9b\x5a\x9e\x3c\x9b\x03\x2b\x2e\xe7\x60\x73\x9d\xcd\xfb\x59\xa3\x8d\x9a\xf5\x5d\x1f\x2f\x15\xc5\x16\x6b\x6d\x7e\xf9\x4f\x8a\x82\x21\xe4\x07\x60\xd7\xb6\x6c\x3a\x64\xb6\x01\xd0\x63\x4a\xc0\xc3\x2c\x3d\xaa\x8d\x92\xb6\x06\xf1\xc6\x4a\xd2\x14\x04\x98\x68\x30\xb4\x7c\x3d\x57\x07\xc9\xc9\x4b\xde\x40\x49\x2e\xf0\x01\x8c\xe6\xff\xfd\xd7\x00\x3f\x14\x6a\x07\x0a\x09\x8a\x3a\x96\x10\xc4\xe2\x0c\x54\x59\x43\xd5\x5e\x4b\xa6\x84\xc1\xa0\x1a\x5b\xf1\xd9\x85\xad\x24\x66\xa0\xef\xbe\x61\xd9\x94\xd7\x3c\x33\x96\xdb\x14\xca\x72\x88\xbf\x78\x95\x42\x53\x79\x03\xd0\xc5\x19\x2a\xe3\x45\x35\xe5\xa5\x65\x4e\x32\x8b\x5f\x55\x35\x7b\xd5\x7f\xe5\x5f\x06\x9c\x19\x20\x28\x51\x12\x67\x71\x15\x1b\x16\x5e\x0e\x20\xd9\xae\x7e\xd4\x13\xab\xc4\xb4\x72\x9f\x3a\x90\x00\x14\x75\x0c\xd0\xd0\xa9\x50\x72\x41\xa4\xb1\x88\xf2\x89\x24\xe2\xea\xc8\xd6\xc2\x8e\x24\x73\x42\x6c\xc0\xfb\x0c\xa6\xc3\xa5\x76\x3c\xe6\xfd\x23\xee\x9a\xdc\x39\xfa\x77\xd5\x9d\x3b\x5d\x0c\x57\x32\x25\x67\x8a\xf9\xe9\x6c\xd8\x63\x37\xa7\xc3\x9e\xdd\xe5\xeb\xd3\x9b\x61\xb2\x63\x37\xa7\x9d\x4b\x7c\xee\xfe\x06\x40\x86\xbd\xf9\x0a\xc0\xa3\x99\x5a\xa6\x7d\xd9\x91\x78\xfb\xe9\x1e\xf7\xb6\xe9\xc8\x30\x8d\x90\xad\x54\x66\xc2\xb1\x52\x03\xaa\x12\x99\xe1\xbc\x59\x2b\xfd\x2c\xe9\xd0\x3d\x5f\xcf\x26\x14\x04\xf1\xe5\xa8\x68\xa9\xff\x5b\xc9\x12\x45\xec\xaa\x56\x0e\xf6\x9a\x8d\x9b\xa2\x60\x34\xd8\x25\xa2\xe7\x26\x43\x79\x87\xb0\x90\xd8\x6c\x9d\x96\x96\x76\x80\xb0\xce\x92\x9c\xf1\xba\x96\xce\xa1\x25\x75\x3a\x55\xe4\xa4\x2d\x3b\xb6\x15\x4e\x03\x1f\x1d\x45\x36\x43\xdb\x77\x3b\x92\x59\xce\x66\x8d\x81\x60\x4f\x3e\x06\x4c\xe7\x5a\x70\x27\x25\xc6\x06\x02\x37\x1e\xb4\x9e\x03\xc4\x3c\x6a\x4b\xc5\x3c\x04\xac\x58\xbe\x77\x31\xbc\xff\xf6\x2d\xbb\x4a\xd3\xc7\x87\xf7\xdf\xb2\x13\xec\x61\x80\x6d\xbe\x5b\xd2\xe6\xbb\xb8\xcd\xfb\x1f\xcf\x2e\xd3\x36\xec\x7d\x53\x14\x73\xf6\x63\xc3\x0b\x74\xdd\x9c\x41\xc5\x0c\xb6\x65\x04\x08\xaf\xe4\xcf\xa8\xea\x6e\xc6\x30\xa6\x86\x3e\x20\x13\x31\x9c\x6a\x44\xaf\x01\xa8\xeb\x19\xf7\x77\x9c\x27\x7b\x1e\xe9\x90\x48\x94\x03\xb8\x70\x22\x49\x33\x53\xe5\xbd\x00\x71\x29\x53\x93\x52\xfe\xd3\xf7\xe6\x6f\xa8\xc2\x0a\xad\x06\xd9\x5c\xe9\x40\xfe\x7b\xbe\xfe\x4e\x2d\xc0\x46\xd7\x94\x51\x0f\xae\xe8\xd3\x92\x04\xac\x89\x34\x2e\xa5\x2e\x53\xb3\x59\x53\x4a\x33\x3f\x06\xb4\x19\x39\x6a\x8c\xaa\xf5\x71\x2e\xee\x45\x71\xac\xe5\xa4\xcf\xeb\x6c\x2a\x8d\xc8\xac\xe8\x79\xcc\x2b\xd9\x87\xc1\x96\xa0\x3a\x0f\x66\xf9\x57\x3e\x11\xf3\xe9\x6b\xef\x4f\xd5\x86\xa5\x0f\x6c\x02\x4c\x95\xae\xfe\x0f\x49\x05\xd1\xd3\x98\xf0\xa9\x7c\x15\x1d\x82\x95\x86\xb3\xd7\xaf\x5f\xaf\x54\x2c\xb7\xad\x14\xb4\xc6\x93\xb7\x5b\x4f\x0e\x37\x6a\x26\xb3\x67\x43\x50\xf3\xa4\x4e\x58\xa0\x5c\x67\x3a\xb8\x3a\xbf\xbe\x89\x11\x1f\xa4\x37\x0a\x07\xde\x1e\x68\x1a\xd7\x7a\x2c\xe8\x56\xf3\x39\x19\x91\x12\x2b\x58\x56\x48\xf0\xe1\x34\xa3\x99\x34\x08\xb5\x2d\xb4\xc1\xe2\x77\xa7\xbc\xb4\x37\xfd\x48\xb0\xa6\xca\xd1\xf2\x75\x51\xb2\x53\x3e\x13\xc5\x29\xd7\xcb\x53\x0a\x77\x49\xd1\xc0\xdc\xfa\x76\xfd\xb6\xa0\x69\xe7\xd3\xde\x61\x65\x23\xb4\xea\x7f\x14\x86\x6f\xc8\x4c\x24\x85\x00\xf7\xe6\x95\xf6\xfe\xf5\x15\xd6\x79\x10\xac\x36\x90\x08\x0a\x5f\xe9\xe5\xe4\xce\x5f\x29\xcc\x83\xaa\xef\x48\x40\x73\x90\x1e\xa3\x39\xfa\xb6\x82\x3e\xbc\xe4\x54\x82\x28\xb8\x52\xc2\x87\x8c\x1c\xd2\x0c\x7c\x71\x53\x69\x16\xd5\x7e\x2b\x05\xa0\x60\x48\x3c\x39\xc7\xd7\xa8\x0b\xcc\x80\x47\xdd\x00\x9f\x12\x9e\x51\x29\x51\xf3\x70\x6c\x34\xe9\xfb\xf6\x80\x3b\xc5\xe4\xf6\xa0\x33\x17\xa1\x0f\xbf\x34\x03\x19\x46\xf5\xc7\x5f\x8a\x89\x3c\xcd\x94\x0b\x72\xce\x52\xa6\xbe\xc9\xc2\xeb\x7f\x4f\xc6\x06\x48\xfd\x7d\xba\x56\xfb\xc4\xc5\xc2\x67\x13\x62\x9d\x50\xed\x81\x83\xb0\x60\xc8\x04\xd2\xb9\x53\x27\x07\xcb\x0d\x0e\xd0\xe4\xde\xcb\x00\x07\xb4\xe4\x8b\x0b\xf2\x5f\x5b\x4a\xca\x1f\xa4\xee\x62\x30\xf1\x6d\x53\x89\xd9\x9d\x36\x7f\x9e\x80\x16\x3b\x64\x11\xec\x25\x9b\xdf\x4f\xb2\x59\x76\xf0\x17\xca\xd0\x6d\xd8\xd8\x95\x1d\x3d\x8f\x83\x20\xf1\x77\x64\x21\x7b\xc9\xe2\x4f\x2d\x59\x58\x12\xec\x2e\x57\x00\x27\x5a\x26\x53\x74\xbc\x30\x90\x96\xbf\xec\x5b\x01\x78\xf5\xee\x6e\x06\x71\x0f\x14\x7c\xff\x66\x70\x7e\xbf\xbe\xf2\x31\x3c\x77\xa1\x18\x20\x9b\x90\xd7\x11\x7e\xd7\x6a\x26\xd0\x3f\xec\x8c\x5b\x08\x04\x08\x55\x5d\x03\xfa\x5d\x2e\x4a\x05\x06\x4f\x35\x13\xe4\xa7\x48\x2b\xb3\xfa\xa4\x11\x18\x97\xaf\x29\x47\xf1\x00\xb5\x30\x48\xac\x58\x37\x1c\xab\xbb\xc9\xc9\xc4\x9e\x3d\xe0\xc7\x42\x6b\x3e\x11\x78\x10\xc5\xbd\x2a\xee\x05\xf9\x2f\x00\xc0\x05\x7b\x5d\x74\x43\xa1\xd9\xae\xf0\x68\x7f\x46\xce\x5c\x0e\xbc\x9b\x9f\xc7\x99\xbc\x17\x25\xbb\x02\xff\x20\xab\xc5\xb8\x10\x19\xc5\x29\x92\x5d\xd4\xb6\x6d\xca\x5c\xd4\xc5\x1c\x58\x08\x8e\x0e\x4c\x64\xce\xe4\x27\xcb\x46\xe4\x0c\x30\x07\x21\x9c\x45\x8d\xf1\x1b\xbe\xac\x17\x37\xf4\x05\x37\x62\x1d\x79\xe0\xa2\x7a\xe2\x3e\x44\xe4\x5e\xf4\xd8\x48\x68\xd3\x17\xe3\xb1\xaa\x4d\x0f\x2c\x1d\x68\xa8\xe2\x05\xc3\xc3\xb0\xf9\x36\x6e\xa7\x17\x2e\x23\x02\x6c\x84\x31\xd4\xdc\x30\xfa\xf3\xc1\x5e\x96\xfc\x4e\x94\xc7\x63\x2e\x0b\xd8\xa7\x09\x4f\x62\x23\xc3\x0f\xee\x1a\xbe\x30\xe8\x00\x86\xa3\xdf\xaf\x05\xcf\xf9\xa8\x58\x88\x6d\x22\x66\x88\xe6\xdf\xb1\xaa\x59\x29\x1e\xdc\x9a\x40\x51\x41\x03\xee\x2a\x24\x13\x83\xde\xe0\x37\x5f\xff\x5b\x64\x82\xde\x5b\x5c\xfe\x50\x72\x49\x08\x01\x39\x6d\x41\x58\x2c\xdb\x80\x56\x6b\x17\xac\x1e\xc5\x91\x50\xec\xae\xd6\x0d\xdc\xf2\x23\x9e\xdd\x01\xe2\x56\xea\xf0\x87\x83\x47\x31\x6a\xc4\x24\xc0\x08\xb9\x6b\x03\x7c\x18\xd8\x7b\x59\x6b\x73\x23\x67\x42\x1b\x3e\x7b\x72\x1a\xed\x9a\x1b\xd3\xf6\xb9\xf6\xb6\x5c\x35\x86\xdd\x2f\xde\x86\x25\xf8\xc0\x7f\xf7\x15\x48\x86\xf0\xd9\x17\x60\x21\x03\xb4\xd3\xcc\x43\x7d\x0a\xfb\xa5\x0e\x40\x49\xed\x0f\x7e\xa6\x79\xc2\x9d\x06\x7b\xb1\xbb\xad\xfd\x28\xb3\x5a\x6d\xdc\x5f\xff\x65\x5f\xbd\xce\xfe\x9b\xea\x59\x48\x4d\x43\xb7\x97\xd6\xd8\x9e\x00\xa6\x46\xe8\x1a\x77\x97\x52\x28\xab\xb7\xd7\x2e\xfe\xd4\xda\x45\x64\xb7\x5c\xfa\x49\x2b\xab\x6e\x8c\x01\x37\x02\x77\x7a\xda\xcc\x78\xe9\x05\x19\x16\xb5\xf3\x0e\xde\x28\x1f\xc0\xee\x34\x66\x4a\x5b\x31\xef\x23\x7f\x94\x33\x5e\xb0\x42\x94\x13\x33\x0d\x91\xa9\xd8\xf7\x9b\xbb\x77\x18\x1d\x5b\xc8\x51\xcd\x6b\x29\x62\x79\x30\x8e\xbf\xa3\x1c\x12\x8a\x9d\x6f\x2a\xfb\xdb\x77\xdf\xde\xbd\xdb\x0e\x80\x47\x6f\x94\x7f\xb0\x11\x4a\x83\x98\xc8\xd6\x16\x08\xdd\x91\x4a\x17\xe7\x8b\x90\xf2\xbc\x48\xfa\x59\x82\xd9\x83\x00\xec\x83\xbe\x01\xec\xc9\x85\xae\x7b\xb6\x64\x69\x69\xa4\x1a\xd3\x8e\x6e\x94\x50\x7c\xb6\x64\x9f\x3c\x7f\x50\xb5\x71\xfd\x11\x6a\xac\x77\x4f\xeb\x1e\x83\x84\x8a\x2b\x01\x31\x46\xd7\xc2\x9c\x2e\x6b\x15\x3d\xd7\x84\x3f\x25\x35\x29\x3c\x60\xd7\xc6\x12\xf9\x23\x91\xf1\x46\x43\x55\x5c\x9e\x19\xed\xeb\x19\xa3\xe6\x86\xc1\x31\x51\x57\x4e\xa2\x5d\xb5\xec\x56\x6e\xdd\x1e\xbd\xe5\x69\x8b\x0e\xdf\x72\xd7\x00\xe6\x9d\xf2\x82\x69\x91\xa9\x32\xe7\xf5\xdc\xad\xbf\x2f\xfe\x62\x2f\xbc\x42\x3c\x12\x1d\xeb\x01\x3b\xb7\xcb\x08\x57\x47\x5b\x85\x89\x34\x4f\xef\x8d\x06\xec\x78\x51\x08\x77\xea\xdd\x00\x36\xac\x08\x6d\x65\xd8\xa3\x8d\xe7\x6e\xe1\x8d\x65\x79\x9a\x11\x65\x80\x52\xe9\xf6\x33\x50\x1b\x91\xc9\x3f\xd2\x70\x70\xc2\x45\xfc\xc7\x13\x8e\xe9\x56\xe7\x8f\x26\x71\x51\x6a\xc3\xcb\x45\x41\x68\xd5\xa4\x5d\x7b\x37\xe5\x8b\xb3\x25\x13\x96\xd4\x28\x9e\x61\x21\x4c\xff\x71\xfe\xcf\xf1\x53\x26\xf6\x72\xfc\x47\x8b\x7a\x31\xa9\x64\xf3\x39\x68\x19\x6c\xae\xb1\x97\x75\xa7\x00\x3f\x04\x4e\x26\x6e\x78\x94\xa7\x86\x0c\x87\x1e\x47\x47\x3f\xb2\xee\xdb\xb5\x90\x05\x96\x98\x7f\x15\x12\x37\x8d\x2a\xf1\xed\x55\x69\x35\x9b\x43\x4b\x20\x80\xa4\x55\x5d\x38\x1a\xc3\xe1\x25\x54\x05\xeb\xb1\x5f\x78\x5d\xca\x72\x72\xd4\x83\x4d\xc1\xb0\x8e\xcc\x5d\x7e\x08\x93\x40\xa6\x23\xcc\x0d\xd8\x81\x65\x61\xd7\x25\xbd\x9d\xe0\xb2\x54\x38\xfe\x8c\xd6\x46\x22\x9d\xb5\xa6\x46\x30\x02\xae\x36\x2f\x6e\x6f\x59\xdc\xe4\x63\x72\x6d\xd2\x08\x0a\x24\x51\x8a\x94\xea\x56\xee\x7b\x6f\xba\xf9\x82\x5d\x4a\xd0\x26\xdd\x62\xb7\xd0\xed\x3d\x5e\xd9\xe7\x16\x5c\x72\xef\x4d\xda\xeb\x7b\xcf\xf4\x26\xbd\xf4\x5a\xf9\xe9\x7e\xf9\x5e\xab\xae\xf7\xc8\x06\x57\xd5\xf6\x77\xc9\x75\x5b\x74\x5a\x7a\x9b\x60\x2b\x0f\x80\xd0\xaa\xa6\x49\x62\x8f\x77\xbe\xf4\x98\x1c\x88\x01\xd6\x5c\x72\xb5\x23\xf5\x31\x94\x6b\xad\x2a\x51\x3a\x4d\x4b\x96\x8d\x6a\x74\x81\x22\x03\x68\x41\xe8\x5a\xfa\x41\x3d\x30\x35\x36\xa2\x04\x20\x14\x38\x6d\x41\xc6\xba\xf6\x12\x18\xea\xe4\x70\x88\x9d\xa8\xa5\x6a\x10\x20\x21\x8e\x35\xa7\xf8\xe9\xf4\xa1\x15\x70\x6e\x0f\x1c\xa1\xc1\x79\xef\x4f\xd4\xb1\x51\xaa\xd0\xc7\x38\x7a\xfc\xcf\xaf\xa3\x5a\xf1\x3c\xe3\xe0\x78\x9b\xa8\xdb\x03\x7b\x23\x3d\x20\x1e\x31\x46\x38\x99\xba\xc9\x0c\x0e\x24\xe7\x04\x83\x3e\x15\xbc\x36\x23\xc1\x49\xd8\xb5\x92\xee\xa4\x91\xb9\x60\x98\x7a\x01\xb7\x4f\x18\x8a\x53\x1e\xb9\x49\x93\x2f\xd7\x60\x45\x6e\xb6\xe3\x67\xb1\xf5\x3e\x04\xe0\xab\x0c\x83\x77\xb3\x38\x66\x18\xd7\x32\x2c\x64\xc1\xb5\x09\x73\xa0\xea\x9a\x3b\xb6\xdb\xdb\x6f\x7c\x22\x2b\xe1\xef\x62\xd2\x6c\x0f\x60\xd1\xb2\x09\xcb\x80\xe2\x92\xbf\x28\x68\xad\x1e\xb8\x5d\x36\x51\xba\xaa\xbf\xe9\x8a\x6d\xe1\x27\xc7\x2d\x5d\xb7\x3e\x9b\xb8\xd1\xc6\x83\x4e\x21\x21\x7b\x9f\xf4\xde\x27\xfd\xa5\xf9\xa4\xf7\xde\xe6\x3f\x8d\xca\xb2\xf7\x36\xef\xbd\xcd\x7b\x6f\xf3\xde\xdb\xbc\xf7\x36\xef\xad\x0f\x7b\x6f\xf3\xbf\x88\xb7\x79\xef\x47\xde\xfb\x91\xf7\x7e\xe4\xbd\x1f\x79\xef\x47\x6e\x5b\x5a\xf6\xce\xe4\xae\xce\xe4\xbd\x87\x38\x7a\xb4\x9b\x04\x94\x88\x0e\xf7\xbe\xe2\x3f\xbb\xe1\xe5\x8b\xf4\x15\xc7\x36\xe7\xa8\x8f\xbd\xc3\xf8\x5f\x56\x65\xdb\x3b\x8c\xbf\x24\x87\xf1\x2e\xae\x96\x2f\xcf\x75\xbc\xf7\xa0\xee\x3d\xa8\xbb\xf4\xa0\x3e\x1a\x51\x22\x30\xb2\x23\xfc\x1f\x6e\x6e\x86\x17\xe5\xa4\x16\x5a\xb7\x4a\x76\xb5\x17\xa9\xd5\x32\x00\x8f\xdb\x9b\xca\xd7\x79\x65\x9c\x51\xb9\x0e\x7b\x3d\x64\x0a\x1c\x93\x4d\x5d\xe8\xb4\xaa\x52\xe5\x2a\xa3\x8e\x55\xfd\xc0\xeb\x3c\xe0\x79\xbb\xb7\x37\x93\x3e\xb5\x7c\xba\x76\xb3\xb8\x0a\x34\xaf\x77\xd4\xe3\x3a\x5a\xa1\x36\x89\xb4\xe7\xe1\xe7\x03\x5e\x66\xb8\x56\x55\x54\xe8\x96\xc0\x8f\xff\x3f\xf6\xfe\xbe\xb9\x6d\x24\xc9\x17\x85\xff\x7f\x3e\x45\x85\x36\x9e\x90\xd5\x41\x51\x76\x77\xef\xdc\x19\x4f\x6c\x6c\xa8\x6d\xf7\x8c\xee\xba\xdd\x3a\x92\xbb\x27\xce\x1d\x4e\xac\x8a\x40\x91\xac\x35\x88\xe2\xa0\x00\xc9\x9c\x1b\xe7\xbb\xdf\xa8\xcc\xac\x37\x00\x24\x40\x8a\x92\x65\x19\x27\xe2\xcc\xb6\xa9\xaa\x42\xbd\xe6\x7b\xfe\xd2\xa1\x57\x87\xab\xdf\x84\x73\xd3\xb3\x90\x9a\xd4\xae\x86\x18\x9f\x73\xa3\x9a\xfa\x8d\x46\x29\x53\xda\xe3\x20\xb6\x3e\x66\x6f\x1c\xfc\x19\x69\x9f\x96\xa8\x05\x28\x8d\xa9\xd4\x3c\xcb\xd4\x5d\x58\xa0\xda\x73\x1b\xa8\xcf\x62\xbe\x31\x39\x62\x2b\x4e\x3e\x76\xf6\xdb\xd5\x7b\xc6\x3d\x6e\xcd\x74\xcd\xae\x7e\x7e\xc3\x7e\xf8\xd3\x1f\xff\x30\x66\x66\xb2\xda\xe2\xba\xcd\x65\x6e\x6f\xcd\xf1\xd9\x31\x01\xdf\x04\xc5\x74\x46\x50\x22\x6d\x05\x5d\xe0\xeb\xf5\x35\x20\x8c\x1b\x2d\x7c\x1f\xf0\x47\x5e\x2e\x7a\x60\xdd\x5d\x52\xb3\xb0\x90\xb7\xd9\x08\x07\xdc\xc8\x43\xeb\x2a\x9c\x87\xbd\xee\xb8\x62\xe8\x4c\xe0\xb9\x2a\x77\xd6\x13\x8f\x4d\x87\x62\xf9\x6b\xf6\x1d\x7b\xf7\x99\x27\xe5\x6b\xf6\x0b\xac\x09\x3f\x63\xf6\x13\x0e\x52\x98\xbf\x65\xeb\x31\xfb\x8e\x5d\x02\x46\xaa\x6f\x37\x85\x6a\x7e\x2a\xa7\xed\x87\xe6\x88\xa3\xca\xf4\x2a\x93\xa5\x39\x05\xd8\xe3\x5f\xec\x3b\x94\x7a\x92\x33\x96\xc2\x74\x72\xfb\x86\x05\x61\x18\x4e\xd7\xfe\x3f\xb9\x96\x1a\xaa\xb4\x85\x0d\xe0\xce\x6b\xa2\x94\x66\x20\x2b\x87\x13\xec\xbf\x2d\x8f\x6f\xfa\xb8\x09\x98\x5f\x8e\xcf\x8e\x99\x16\x2b\x5e\xf0\x52\x15\x66\x58\x3a\x4a\x10\x79\xcd\x40\x08\x0e\x3f\x03\x70\x52\xb3\x08\x26\x81\x99\x16\x6b\x06\x8e\x31\x9e\xdb\x39\x9c\x42\xdd\x6e\x5a\xa4\x9a\xb1\x15\x6d\xab\x19\xc4\x0e\x6a\x86\x18\xb3\x0f\x0a\x42\xae\x78\x09\x35\xc0\x2d\x5b\xb3\x4b\xa1\xc3\x58\xd1\x33\x42\x9c\x47\xb8\x34\x66\x24\xd5\xd2\x43\xe6\xd1\x07\x46\x04\xa8\x6d\xe4\x63\x4e\xf3\xc7\xaa\x25\x67\x33\xa5\xce\xa6\xbc\x70\xeb\x12\xda\xfd\x76\x36\xe5\xff\x42\x6b\x7a\xaa\x04\x76\xc6\xae\xb6\xc1\x94\xff\xeb\x04\xa0\xf9\x2f\xa2\xc0\xaa\x6b\xc2\x02\x7d\xcd\x2e\xba\xaf\x9f\x0b\x2c\x33\x33\x00\x4b\x16\x92\xba\x37\x19\xd7\x7a\x5c\x1b\x19\x2b\x8e\x40\xc4\x06\x8a\x03\x1c\x76\x03\x0f\x4b\xb8\x8b\x0c\xbb\x52\x50\x3b\x59\x7a\xb0\x71\x2c\xc9\x7d\x49\x07\x52\xe0\x55\xc6\x7d\x05\xe9\x7d\x3c\xc9\xeb\x1f\x44\xf8\x61\xaa\xa5\x5c\x2a\x8b\xc3\xe8\xde\x3d\x75\x8c\xaa\x72\xb5\x6f\xc7\x81\xed\x2e\x96\xbb\x3c\x0c\xaf\xbd\xaa\x32\xf1\xbb\x79\xf2\xfd\x18\xae\x6b\x1e\xab\xbc\x46\x75\x20\x84\x50\x55\x68\x06\x0c\x87\x82\x58\x68\xfa\x1a\x94\x34\xd0\xf3\x3e\x73\xb3\x6d\xaf\x2d\x5c\xf3\xa4\x7a\xf9\xf2\x87\x64\xa1\x74\x09\xff\x25\xe8\x07\xa0\xe5\xf0\xc3\x7f\xe2\x0f\x5a\x18\x65\xc3\xd0\x76\xfc\x99\x9d\xd2\xff\xa5\x2f\x50\xe5\x07\xfc\x5f\xd3\xcc\x01\xc9\x57\x45\x16\xc0\x15\x9b\x49\x59\x2e\x30\xb2\xb6\x10\xd2\x5d\x2d\x3b\xb4\x85\x6e\xf0\x19\x58\x36\x06\x6f\x1f\x05\x68\xc4\xf7\x74\xcf\xd1\x90\x12\x9e\xa7\x56\xf2\x02\x8a\x0a\x7e\xd4\xe3\xff\x3c\x06\x78\xe1\x7f\x3b\xee\x21\x47\x00\x7b\xe9\x32\xf3\xb0\x44\x65\x19\x15\xd0\x36\xa4\x06\x58\x12\x55\xd2\x5e\x85\x8a\xb2\xdf\xf9\x03\x59\x20\xba\x65\xb6\x9d\xed\x11\x3d\x9f\x00\x6e\xcc\x01\x1f\x00\x4d\x7a\xcb\x9d\xa7\x16\x78\xcd\xe3\x2d\x2f\xaa\xcc\x62\xe7\x81\x40\xc2\x64\x3e\x55\x55\x0e\x66\xb2\x1c\x9b\x69\xaa\x76\x90\x2c\x6a\x00\xbd\x81\x24\x12\xc8\xa7\xe7\xb9\xa5\x86\x96\x35\x63\xcd\xf0\x8a\x68\xd1\x5c\xde\xba\x82\xd0\x9a\x99\xf5\x14\xb9\x21\x72\xa7\xf0\x09\xf0\xad\x1a\xc9\x76\xc4\x32\xc5\x53\x36\xe5\x19\x78\x0c\x5c\x81\x0b\x8b\xa1\x2f\xd8\xf5\xf5\xfb\x11\x53\xb3\x99\x28\xd0\x77\x82\xbc\xfa\x16\xab\x3e\xbb\x0a\x50\xa2\x4c\xc6\xec\xed\xbb\xcb\xab\x77\x6f\xce\x3f\xbe\x7b\xcb\x4e\xd1\x83\x00\x9a\xb2\x35\x28\x9a\x8d\x08\xf6\x28\x08\x9c\x98\xae\x2d\xa4\xa1\x11\x3a\xc8\x90\x40\x1b\x6f\xbb\x8c\xd9\xb5\x10\x24\xb1\x66\x82\x6b\x74\xec\x6a\xef\x9a\x0a\x94\xd9\xc1\x48\xfa\xa4\x8d\xa4\x83\x1d\xf1\xb9\xd8\x11\xef\x0f\x90\xfa\x05\xac\x89\xa1\x8f\xb1\xa5\xd2\xee\x3d\x74\x70\x28\xdc\xbb\x75\x23\xa8\x50\x2f\x06\x8e\x69\x10\x1c\x5d\x9d\x9a\x40\xc2\x7d\xf0\x6d\x31\x0b\x3f\xe5\x79\x7a\x8a\xd1\x34\x9b\x6a\xb4\xc3\xdf\x0e\xb8\x3f\x38\x60\xc7\x55\x29\x2b\xab\x9a\x45\x15\x27\x9f\xd0\x1e\x35\x64\x90\x07\x34\x31\xbb\xcd\x6c\xb7\x2f\x5b\xb1\xe4\x80\xd6\xe5\x4e\x13\x53\xa7\x08\xe4\xed\x4c\xe6\xaf\x53\xa1\x41\x25\x0a\xea\x70\xb6\x54\x16\x80\xb2\x97\xaa\xe8\x57\xe4\x4b\xdf\x2f\xe6\xd3\x28\x82\xe9\x7b\x95\xf0\x6c\x97\x68\x99\x2b\xcb\x66\x64\x10\x68\x74\x25\x66\x50\xb7\x31\xc7\x8a\xa2\x41\xed\x13\xc7\x95\xc8\x9a\x00\xf5\x60\x56\x3c\xa9\xdf\x63\x1f\xa5\x3f\x0b\xfa\xe8\xb0\x10\x07\xed\x11\x94\x45\x31\xfb\x44\xff\xbe\x74\x58\xce\xc4\x94\x7c\x21\xe7\x2d\xa5\xb8\x92\x3e\x25\x40\xaf\x23\xdc\xe9\x30\x68\xa6\x69\x2f\xdc\x2f\xb6\xc3\x2e\xe0\x7e\xdc\xa8\x2a\x65\x36\x36\x77\xaa\x2c\xc6\x17\x79\xf9\x6b\x71\x8d\x5f\xed\x22\xc2\x7e\x6d\x36\xbb\x66\xd3\xda\xfa\xbf\xfa\xdd\x1f\x54\x47\x3c\x40\xd0\xaa\x4d\xa9\xb0\x74\x70\x10\x76\x9f\xb2\xb0\xdb\x27\x22\xe0\xc2\x46\x04\x84\x20\xef\x8d\xe3\xdd\x38\xdc\xfd\x98\xf2\x10\x12\x30\x88\xf2\x3b\x87\x04\x3c\x09\x41\xbe\xa7\x29\xe8\xf1\xc3\x02\xfa\xc9\x6c\x87\x8e\x0a\xd8\xf8\xc2\xaf\xaa\x6c\x9b\xad\x36\x68\x55\xaf\xc8\x8a\x76\xab\x25\x5f\xad\x42\xe7\xa7\xc6\xac\x4b\xf3\xa2\xad\xc0\x01\x86\x20\x9f\x80\x88\x51\xbd\xd6\xca\x6a\xcd\x50\x81\x57\x35\x72\x81\xa1\xdd\x53\x18\xba\x80\x79\x34\x20\x1e\xc2\x88\x60\x4d\x1d\x99\x51\x73\x56\xa8\xaa\x6c\xf8\x5a\x5b\x6b\x48\x3b\x07\x42\xdd\x04\xdd\x83\x57\x9a\xcf\x76\x50\xb4\xbf\x2a\xed\x42\x12\x66\x50\x13\xe9\x9f\xae\x26\x52\x8a\x35\x91\xac\xc4\xc4\x5d\xad\x0e\x33\xee\x68\xa3\x67\x91\x9c\x3c\xa1\x57\x2d\x15\xb7\x92\x1c\x0d\x8e\xba\x4d\x60\x7a\x81\xbf\x12\x3d\x6c\x17\xe1\xb8\x32\x77\xe3\xbe\x66\xaf\xc6\xec\xe2\xd2\xd7\x70\x23\x6f\x68\xe8\x3d\xe5\x79\x63\x97\xc0\xa2\xa8\x72\xf3\xc7\xd5\x0a\xfc\x22\x93\x9c\x91\x07\xe6\xd2\x8a\xb3\xa0\xca\x3a\xef\x13\x68\x69\x96\x63\x4d\xf2\xef\x31\xed\xff\xe6\xf5\x0d\x4b\x05\x26\x14\x17\xd6\xc9\x54\x08\x73\x6b\xc2\xb8\xf9\xb8\xce\x9c\x9d\xe3\x24\x9f\x94\x2c\x98\x68\x28\xac\xf9\x49\x63\x0d\xad\x55\x26\x13\x69\x1a\xbd\xfe\xe3\x4b\xb8\x3e\xe0\x5d\xe0\x79\x8a\x83\xbc\xfe\xf1\xc7\x1f\xdc\xcf\x66\x7e\x3f\x29\xbc\x29\x1a\x4b\x8b\xc4\x69\xd1\x2e\x44\x76\x9b\xbf\x36\x72\x54\xc3\x55\x0d\x0c\xf9\x8d\x6b\x67\x4b\x27\x2e\xe8\xe6\x44\x6e\xe2\x50\x17\x80\x3b\x8e\xea\x92\xf5\xb7\x3b\xe7\x68\xb9\x08\x24\xfc\xe6\x37\x26\xf9\x24\xff\x2b\xe6\x43\xe4\x58\xcd\x77\x55\x88\x44\x6a\x31\x39\x22\x2f\x3e\x30\xe1\xf0\x82\x9a\x07\x63\xe3\x9c\xc3\x2a\xaf\xa9\x2a\x9b\x97\x97\xbc\x82\x93\xa3\x99\x52\xe3\x29\x2f\xc6\x89\x5a\x4e\x8e\x4e\x98\x2a\xd8\xe4\xe8\x4e\x66\x69\xc2\x8b\x74\x72\x34\xda\xf4\x31\x57\x18\x93\x9c\xe6\x18\x24\xcd\x6c\x4f\x2a\xf6\x69\x3f\xf2\xdd\xd8\x7c\x06\x3f\x81\x97\xc9\x35\x74\x0e\x7e\x76\xfc\xdd\x31\xea\x3f\x7c\xb5\x12\xbc\x30\x4f\x4a\x96\x5a\x64\x33\xf3\x1e\xbc\x47\xe5\xed\x87\x6b\x1a\x1d\x45\x49\x74\x65\xe2\x05\xb7\xd3\xc0\xc2\xdd\xec\x7f\xab\xca\x06\xbc\x53\x3a\x7c\x6d\x7e\xfe\x13\x38\x53\xd8\xf1\xff\xf8\x0f\x33\x63\x98\xe9\x95\xbd\x2b\xd6\x2f\xd4\x76\x5f\xa0\x13\x95\x80\xcb\x6b\xcf\xfe\x8e\xaf\xf1\xd9\xce\x98\xa5\x33\x74\x8e\x23\x22\xae\xe8\xbb\x5d\x3a\x1f\xbb\x91\xc3\x0d\xed\x26\xf7\x30\x5c\x7d\x38\xb0\x85\xe0\x29\xbe\x3b\x61\x08\x94\xa1\x9c\x66\xc8\x31\xfb\x3e\x1a\xde\xaf\x91\x08\xed\xde\x9f\x29\x95\xff\x12\xdc\xd6\x6a\x36\x93\x9f\xd9\x0b\x28\x74\x6e\x39\x08\x9e\x09\xec\xe6\x89\x25\x20\x6e\x93\xcd\x17\xf6\xd0\x27\xcd\x64\x0e\x61\xa7\x6a\xf5\x72\x3e\xa4\x06\x78\x1d\x1b\x20\x37\xb0\x66\xa0\xb5\xde\x98\x12\x12\x0c\x70\x56\x6a\x51\xb0\x3b\xa9\xe1\x9c\x14\xa2\x1d\x3c\xd9\x18\xa4\x73\x07\x06\x63\x39\x78\xc2\x57\xe0\x8f\x52\x33\x92\x14\x22\x9a\x0b\x4e\xb3\x54\xe5\xc7\x36\xc2\x80\xe7\x6b\xbc\x26\xec\xbc\x64\x99\xe0\x46\x5b\xc2\xa8\x94\x63\x1a\x11\xfd\xa7\x20\xbb\x1c\xbb\x2a\x8c\xde\x36\x52\xab\xc0\xe8\xb2\x9e\x4a\x45\xce\x39\xd0\xc2\x14\x4f\xc9\x2b\x56\x84\x79\x33\x90\xc0\x04\xf3\x37\xb3\xcc\xd4\x5c\x26\xe0\xfa\x87\xd1\x0d\x3d\x99\x67\x6a\xca\x33\xdb\x68\x83\x21\x46\x06\x81\x0c\x3d\xac\x31\x17\xb5\xe6\x6d\xc9\x4c\x61\x1b\x0b\x08\xe2\xd4\x29\xa4\xa0\x81\xa8\x14\xb5\xb6\xaa\x3e\x12\xee\x60\xb1\x40\xc3\x7c\x6d\x50\xa4\x0b\x7e\x44\x34\x00\x64\x3c\x11\x8d\x54\xe8\x5a\xc6\x14\xad\x77\x9c\x98\xef\xdd\x30\x20\xb0\x94\xb4\xf9\xb3\x2a\x5c\xa6\xb4\x8e\x53\xa5\x47\x36\xdb\x98\x97\x41\x17\xaa\xfe\x0e\x71\x2b\xf6\x70\xd1\x94\x68\xbe\x2e\x52\xc4\xf9\xb8\x75\x9a\xa1\x39\x67\x5c\x7f\xb0\x32\xc0\x2c\x59\xca\xd2\x10\x3f\xcc\x9d\xb1\x74\x8d\x92\xb8\x8d\x64\xe9\x3f\x09\xbc\x20\x95\x33\x30\x0f\x95\xce\xea\x50\x0f\x08\xb1\x66\x91\xf3\xcb\x0b\x57\xca\x7c\x9e\x1b\xa9\x80\xf6\x5b\x68\xc7\x73\x39\x83\xcd\x08\xef\xa5\xf7\xe9\xe2\xb9\x38\x65\xd8\xd6\x5b\xe5\xc5\x27\x44\x23\xa1\xdb\x65\x79\x2d\x71\x7c\x1b\x82\xa0\x85\x19\xde\x3e\x33\x54\xb7\x5d\xad\x5b\xda\x8f\x9f\x5b\xdc\xa6\x23\x34\x80\x59\xea\x1d\xdf\x11\x95\x54\x6e\xa5\xfb\x64\xb3\x99\xd7\xd8\x19\xa8\xe0\x82\x43\x0c\x5f\x41\xe5\xc3\x2e\xca\xb9\xb7\x63\x1f\xc0\xc5\x2c\x16\xa6\x54\xc1\x72\x85\x8c\x8a\x58\xd7\x28\x92\xa6\xe0\xf2\xe4\x4e\x55\xa9\xd1\xa2\x07\x37\xb6\x80\x2a\x76\x1f\x83\x4b\x99\x75\xed\xe2\xc7\xf7\xd7\x6e\xb3\xe8\x8d\xc5\x42\xb4\xb3\x3b\xe7\xbe\x76\xac\xcf\x5a\x63\xa6\xff\x0a\x90\x6d\x7e\xfc\xf1\x07\xd8\x60\x57\xe7\x77\x29\x96\x53\xa8\x7e\x4d\xf7\x1c\x8e\xcb\x92\x3e\xff\x3c\xcc\xe9\x69\x90\x25\xd6\x5e\x0c\xa2\x31\x3e\x07\xb2\x2c\x48\x85\x10\x30\x95\x24\x2a\x82\xb0\x31\x23\x00\x71\xf3\xf2\x6e\xb9\x28\x54\x35\x47\xfd\xee\xfa\xc3\x05\x4c\xd3\xed\xf3\xc8\xbe\x5e\x69\x63\x22\xfc\x53\x9f\x55\xd9\x4c\x66\x99\x15\x3f\x6c\x0b\xb7\xf0\xeb\x0f\x17\x0f\x7e\xec\x1f\xdf\x5f\x1f\x20\xd2\xe5\xfe\xd2\x46\xdd\xa1\xb7\x49\xde\x40\x27\x9c\x95\x38\xba\x5d\x71\xdd\xc2\x86\xe1\xa7\x3f\x11\x3f\xdd\xdb\x6f\xf3\x3e\x18\xa4\x87\x2f\x31\x6c\x1e\xa7\x95\x87\x8b\xa9\x5c\xd0\x97\x99\xe3\xa9\x65\xfa\x0f\x6b\xf9\x37\x17\xa2\xf3\x18\xcc\x15\x8f\xa5\xbe\xb2\xe0\xb9\x86\x27\x93\xf1\xb5\x28\x98\x16\x49\x55\xc8\x72\xdd\xb0\x82\x78\x05\xb9\xa7\xc9\xa3\x8b\xaa\x18\x65\x01\x15\x60\x1e\x51\x69\x6d\xeb\x72\x3a\x55\x06\xe8\x8f\xf9\xcc\x0c\xca\x7a\x22\xeb\x25\x30\x05\x9b\xaa\x81\x19\x45\x95\xd5\x2f\x9c\x30\x73\x46\xf4\x9e\x86\x2a\x33\x7d\x2d\x92\x42\x94\x71\x0c\x65\xa4\x31\x00\xab\xd0\xa2\x04\x79\x6c\x46\xd0\x5f\x9b\xa4\xb7\x88\x16\x48\x6d\xf7\x08\xc8\x47\x26\x66\x65\xc8\x4b\xfa\x11\x85\x4d\xbc\x6f\x0f\xd2\xae\x61\xa9\x7d\x9c\x73\xae\x61\x9b\x20\x88\xc3\x38\xbe\x19\x45\x72\x39\x36\xa8\x72\xa4\xee\x3f\x5b\x29\x18\x56\xdf\x14\x85\x4d\x9f\x42\x55\x25\xe2\xd9\x90\x21\xc2\x90\x5f\x47\xa1\x79\xa6\x72\x6f\xe0\xb0\x7f\x42\xcc\x83\x0c\x60\xd7\xf0\x08\x66\x99\x4c\x3c\xec\x9a\x60\x13\xb8\x52\x93\x23\xab\x3e\xa2\xdc\x55\x51\x21\xdb\xd8\x2a\x35\xaa\x8d\x4d\xb7\x04\x4e\xdb\x9a\x2d\x54\x0e\x42\x1b\x4a\x3b\xb4\x15\x7f\x8d\xd5\x53\xd7\x89\x56\xf4\xd0\x75\xfc\x67\x99\xba\xa3\xcb\xe7\xde\xff\xcf\x99\xba\x7b\x2b\x21\x68\xae\x32\x1a\x5b\xf1\x8b\x28\x17\x6a\x9b\x4f\x7d\x43\x8f\x5a\x69\xe0\x25\xfe\x08\x56\x1b\xf3\x5d\x96\x86\x5d\x7a\x10\x81\x1e\xd9\xe8\x37\xa6\xcd\x4d\x3d\x1f\xbd\xf9\x35\x3b\x99\x8f\x60\x02\xa0\xda\xf4\x41\xe5\xfa\xc9\xd1\x4f\xeb\xdf\xb4\x28\x26\x47\x70\x64\xe6\x9f\x1f\xac\x73\x7c\x72\x84\x36\x14\x44\x0e\x3a\x68\x54\x34\xf4\xef\x72\x03\xec\x7a\x96\xd7\xe0\xc2\xec\x38\x3e\x6c\x14\xb9\x54\xbd\x23\x95\x53\x94\x24\x6d\xa5\x0e\x23\xfe\xe9\x2c\x21\x3f\x26\x15\x0c\x5b\x71\x10\xf0\xd5\xcc\x05\x91\x1a\x75\xa3\xf0\x76\xa7\x72\xc1\xb4\x5c\xca\x8c\x17\x8c\x97\xe8\x6a\x11\x84\xd3\xa0\x29\xde\x1d\x24\x2a\x08\x28\x5d\x71\x09\x09\x75\xb8\xa9\xfa\x75\x83\x9c\x04\xf3\x07\xa5\x88\x4d\x8e\x9a\x27\x3e\x39\x1a\xbc\xd0\x4f\xda\x0b\x3d\xf8\x69\x9f\x8b\x9f\xb6\x67\xc8\xe5\x8d\xfd\xb4\xa3\xd7\xfa\x49\xf9\x6e\xef\x1b\x84\xb9\x9d\x1e\x77\x06\x62\xde\x98\x8f\xfa\xad\xa1\x34\x9c\x28\x15\xc9\xc6\x67\x4e\xc5\x82\xdf\x4a\x55\x20\xe9\xf5\xdf\xf8\xaa\x63\x34\x3b\xb6\xaf\x5b\xb7\xba\xc1\x0f\xdf\xb4\x45\x6a\xa2\x46\xf5\x44\xf6\xaa\x4b\x78\x3b\xa0\xdf\x3f\xdc\x54\xf3\x66\x81\x04\x6e\x45\x07\x08\x24\x88\xc3\x05\x02\x6c\x3f\xdb\x37\x2a\x4f\x65\x19\x33\xe1\xcd\x32\x8b\x6b\x1d\x28\xa2\x89\xfd\xcd\x06\x72\x06\xe7\xdc\xc3\x10\xc0\x75\xf9\xd1\xa8\xb1\x30\xc4\x81\x53\xe6\x3b\xb3\xe5\x6f\x9a\x9f\x77\x57\x18\xd2\xb2\x20\x6d\x9e\xf2\x84\x69\xe5\xa5\x6b\x6e\xf3\x88\x55\xee\x60\x08\x7d\xec\xe7\x06\x53\x3f\xc1\x64\x77\x89\xd6\xd4\xec\xa6\x15\x05\x91\xfe\xc8\x64\x9e\x02\x91\x82\xe8\x80\x92\xcb\x8c\xb0\xf0\x68\xea\x6e\x9e\x0f\x85\x54\x78\x83\xad\x68\x92\x55\x2e\xff\x69\x24\x23\x95\x8b\xd3\x3b\x55\xa4\x23\xcf\x95\x19\x61\x1a\xce\x3c\x14\x37\x6e\xe6\xb1\x3e\xc0\x5c\xdb\x69\x5e\x07\x81\x8a\x4d\x3d\x6e\x42\x20\x60\x18\xe9\xe2\x63\x61\xd6\xf2\x33\xcf\xb4\x18\xb1\xdf\xf2\x4f\xb9\xba\xcb\x77\x57\x45\x46\x07\x50\xa8\x6a\xf3\xbb\xb7\x36\x74\x10\x0d\xa7\x23\x54\x35\x6e\x18\x67\x7a\x06\x1a\xc4\x00\x62\xf5\x35\x28\x0b\x7d\x42\x56\x6f\xa0\xd1\xcd\xa6\x93\x3e\x54\xd8\x6a\x87\xda\x7d\x1f\x73\xdb\xa0\x12\x3d\x17\x95\xa8\x57\xe8\xea\x16\x85\x68\xc0\xb7\x7a\x00\x81\xf6\xc0\xd1\xad\x3d\xf4\xbd\x3e\xdc\xa9\x16\x49\xb3\xa0\x68\x0f\xdf\xe0\x58\xd7\xb4\xc1\x4c\xa9\x4f\x9a\x65\xf2\x53\x9f\xe0\xd1\x74\xab\x65\xb7\xd7\x3d\xdf\xc9\x6a\xbc\xf5\xc2\xb7\x4c\xe6\xc6\xf1\x48\x58\xb9\x82\x78\x8b\xca\x86\x9e\x36\x0d\xb9\x60\x2c\x8f\x22\x71\xac\xbf\x46\x6a\x62\x85\x63\x76\x93\xcb\xec\x26\x32\x47\x73\xa4\x61\xf1\x58\x12\xf1\x78\xa6\x99\x48\x09\x4b\xb9\xa2\x28\x39\x9e\xdd\xf1\xb5\x66\xe4\x68\x44\x94\x59\x24\x21\x9b\x64\x6a\x8a\xef\xbd\x74\x01\x1f\x9d\xe2\x75\xa3\xc7\x8d\xf3\x08\x98\x6d\x58\x28\xa5\x05\xe3\x4b\x45\x14\x3d\xe0\x64\xe1\xba\x6d\xd2\x9a\x43\x21\x82\xb0\x92\x85\xd2\x22\x0f\xc5\x1c\xc3\x32\x68\x28\x33\xac\xf3\x79\xe4\xd5\x52\x14\x04\x36\x92\xa9\x3b\x23\x39\xbc\xc0\x08\x8e\x3b\x01\x48\xdf\x80\xc1\x20\x30\xac\x08\x5a\x2d\xe4\x7c\x21\x74\x79\xe2\x90\x6f\xfc\x02\xc6\x8c\xbd\xe3\xc9\xa2\xe5\x2f\xc4\xa6\x6c\x70\x4c\xc1\xf3\x39\xfa\xd4\xfe\xfe\x6a\xf4\xea\xe5\xcb\x97\x2f\xff\xd1\x82\x2a\x13\x04\xcf\x50\xa0\x6e\x10\x55\x21\x4b\xe7\xc8\xd7\x02\x82\x27\xcc\x38\x41\x24\xca\xc1\x71\xd5\x56\x85\x54\x85\x2c\xd7\xef\x0d\x5d\x7d\x13\x86\x33\x1c\xe4\x41\x5d\x6e\x1c\xbe\x5f\x2e\xe0\xcd\xe6\xf9\xdd\x58\xe9\xd1\x65\x93\x31\xce\x36\x7f\xaf\x59\xc3\xa9\x96\x8b\x16\x00\x30\x1b\x11\x23\xbb\xb5\x31\xc3\xc1\x85\xb3\x87\x83\xd1\x46\x29\xc9\x9f\x36\x5a\x48\xe6\xb7\x3c\x93\x70\x03\x8c\x2c\x81\x9a\x50\xa8\x58\xb4\x6b\x84\x3d\x22\x76\x6e\xa0\xd1\x4d\x40\x51\xf1\x3a\x17\x51\x14\x6c\x40\x33\x80\xc6\x58\xc2\x01\x11\x64\xc1\x2a\x6c\xac\x29\xf7\xb0\x4a\x33\x58\x0a\x44\xaa\x98\xff\x0e\x03\xfe\x30\x18\xc5\xa3\x6b\x2c\x03\xd0\x29\xf7\x3e\x01\x93\xd9\x22\x2f\x21\x61\xc9\x64\x82\x0e\xc5\xc2\x83\xb7\xe4\xca\x4f\x39\xc2\x7a\x6b\x33\x6d\xb0\x43\x0b\xb4\x97\x2a\x93\xc9\xfa\xca\xac\xe2\x6f\xb2\x5c\x5c\x57\xa8\x25\xf5\x95\x6e\xa3\x3f\x45\x4c\xdf\x08\x36\xa7\xae\x71\xa9\x96\x32\xd9\x03\x49\x65\xf3\x4b\x7c\x18\x67\x5a\x67\x94\x4a\xbd\x69\x3d\x6b\xa5\x11\xaa\xb2\xa3\x89\xca\x1b\xb8\xba\xae\xbf\x6f\x59\xd3\x84\x1a\xd3\xd0\xb1\x7e\xf4\x28\xea\x91\x37\xf5\x1d\xe6\x26\x2d\xf9\xea\xf4\x93\x58\xeb\xe8\x7e\xb0\xba\x6b\x35\xba\x11\x1d\x77\x72\xc9\x57\x0f\x64\xb9\xf8\x8b\x91\x61\xe9\x25\x6d\xb9\x4a\x61\x33\xb6\x50\x59\xaa\xc9\xb2\x06\x0c\xd3\xa3\xa3\x1a\x41\x08\x45\x68\x23\xe9\x1a\xb5\x0c\x0b\x16\x74\xde\xa5\xbc\x3b\x9c\x23\x0f\x02\x39\x20\x94\x1b\xfd\xc1\x5e\xec\x10\x7a\x84\x59\x16\xdf\x4d\x8e\x02\x88\xa9\x2c\x0b\x9a\x13\x3e\x4e\xa0\xb0\x2c\xaa\xe9\x38\x51\xcb\x33\xbf\xf7\x67\x4e\x86\x3f\x9b\x66\x6a\x7a\xb6\x84\x82\x9a\x67\xab\x4f\xf3\x33\x5e\x95\x0b\x04\x42\x33\xb3\x3a\x33\xe3\xc2\xff\x8c\xe7\xca\xc3\xba\xde\x89\x2c\x3b\x05\xc3\x18\x4d\x11\x52\xda\x1f\xcc\x5f\x0f\x5b\x77\x48\x12\xf3\x5e\x2e\x65\x79\x05\x90\x5e\x7a\x5b\x42\x5c\xd4\xae\x2e\x31\x53\x75\x98\x58\x2a\x4e\x78\x6e\x73\xf0\xc5\x67\x91\x40\x9e\x5a\x21\xe7\x8b\x92\xe5\xea\xae\xc7\x2d\xf9\x67\x25\xaa\x7d\x2a\xad\xb4\xad\xf2\x7f\xe1\x58\x31\xa5\xde\x2a\xcb\xd0\xd7\x6f\xe8\x01\x90\xfd\x31\x10\x51\x56\xbc\xe0\x4b\x01\x90\x9a\xe6\x32\x50\xfb\x28\x90\x9e\x42\x94\x73\x95\x9f\x22\x9f\xb5\x3c\xdb\xdb\x38\x6f\x26\x47\x66\x6e\x62\x72\x74\xb3\x7f\x45\x04\x3f\x9c\x1b\x0d\xdf\xc6\x15\x98\xda\x26\x47\xe3\xe0\x0f\x4b\xc1\x73\x3a\xa1\xee\xf3\xaa\x56\x2a\x67\xbc\x28\xe4\x2d\xcf\x20\x4c\x65\x41\xf9\x39\x1c\x16\x2c\x58\x95\x97\x32\xc3\xa8\x56\x0a\xb8\x76\x7d\xc1\x0d\x42\xdb\x82\x05\x34\xb1\x02\x16\x07\x68\xcf\x60\x76\xf7\x9c\x12\xda\x13\xcd\x90\x5f\x32\x46\xa6\xdd\xc2\x50\xe5\xc4\x31\x37\x58\x15\x52\x69\x0e\x12\x82\xb5\x54\x71\x44\xc5\x2d\x6a\x6a\x83\xb9\x4a\xfa\xb4\x54\xa7\x41\x63\xf1\xd3\xba\xc9\x19\xfd\x83\x39\xa2\xfb\x1e\xf1\xb8\xfb\xd9\x15\xde\x63\x05\xd4\xcd\x32\x7b\x17\xed\xd8\xd6\x37\x50\x94\xb7\x51\x14\x73\xda\xc4\x65\x4c\x1b\xb8\x53\x1a\xca\x76\xf0\x34\xa5\x54\x82\xf2\x4e\x31\xa9\x75\x25\xf4\xeb\x49\xce\xbe\x83\x5a\xcd\x16\x93\x12\x46\x72\x41\xff\x56\x86\x63\x99\x99\x8f\x2d\xf1\xfa\x9f\xd0\xeb\x6f\xe6\x73\xbe\x12\x16\x60\xaa\x82\xc6\x1a\x4f\x48\x7c\x4e\x04\x84\x61\x0b\xec\xfe\x9f\x3d\x6c\xf8\x5a\x57\x85\x48\xdf\xa8\x9c\xc0\xba\xd7\xd7\x0b\x5e\x74\x2b\x15\x9b\xfa\xdd\xb0\x17\xe7\x6f\xae\x4f\x7c\x2a\x00\xd2\x2a\x7c\x2e\x60\xab\x31\x13\x8b\x12\x10\xf1\x2d\x52\xc0\xb9\x87\x0f\x77\x4b\xb3\x5e\x81\xda\x06\x11\xef\x5d\xd3\x6b\xac\xa8\xf0\x6c\xe9\x0c\x00\x54\xe3\xf6\xfc\xcd\xb5\x53\xb3\x39\x5b\x29\x2d\x4b\x79\x6b\x3f\x84\xd6\x01\x64\xb8\xc7\xe0\x36\xb5\xcb\xa1\x69\xbd\xb8\x7e\xf3\xfe\x04\xed\x22\xb7\x32\x35\xba\x9a\xb3\x3f\x04\x8d\x4f\x5d\xfc\x6a\x5a\x9b\x26\xc4\xd3\x9a\xcd\x57\x05\x3a\x2a\xc1\x27\x21\x0b\x46\x1b\x18\x7d\x52\xc3\x16\x12\xcd\x5e\x15\x2a\xad\x6c\xda\x4e\x5b\x6b\xb4\x20\xbc\x38\x7f\xf3\xfb\x09\x3b\x3d\x3d\xdd\xb4\x7d\xb5\x7d\x4a\x2a\xbf\x4f\xe0\x48\x35\x5d\xcd\x25\x04\x58\x43\x5d\x25\x8b\xda\x0a\x5e\x4f\x72\x48\x2d\x76\xff\xef\xfc\xcd\xef\x2f\xb2\x13\xf6\x1f\x2c\x11\x32\x7b\xc1\xae\xdf\xbc\x67\xdf\x99\x5d\x36\x3f\x9e\xb1\x17\x4c\x57\xcb\xbf\xd7\x37\xe1\xd3\x3f\xa0\xc5\xa7\x13\x76\xc2\x4e\xcc\x80\x53\xa8\x3b\x45\xf3\x85\x33\x86\x73\x12\x3c\xc7\x94\x17\xa3\x2b\x14\xb7\xe1\x8a\x03\x62\xfc\x82\x8c\x57\xe2\xf3\x4a\x18\xf6\xaf\x2c\x80\x2f\x02\xfc\x5c\xbe\x3f\x89\xf8\xde\x02\x60\x66\xe3\x5c\x1b\x35\x63\x3f\xbc\x3c\x3c\xd2\xfc\x06\xe9\x85\xed\x2d\x29\xc4\xf2\xd0\x76\xb7\x79\xd8\xf4\xc6\x3a\xa2\x05\x95\x26\x2e\x15\x4b\x55\x1b\xd1\xd8\x2a\x17\x3d\x90\xe4\xff\x41\xe5\x16\xa9\xc9\x2b\xd6\x5b\x28\x76\x6b\x7b\xa4\x1e\xab\x42\xe0\x3a\x23\x61\x1c\x84\x1c\xe7\xed\xf1\xc9\xe1\xb5\x24\x16\x59\xb0\x5b\x51\x4c\xc9\xd6\x29\x58\xc9\x8b\xb9\x28\xe3\xce\xbf\x5d\xbd\x1f\xb3\x73\xd6\x3e\x85\x4e\x73\xc8\x54\x95\x0b\xf6\x82\x9f\x6c\xb2\x8b\x98\xcf\xb7\xda\x45\x60\x94\x17\xd3\x8d\x1d\x73\x3f\x9f\xdf\xae\xde\xb7\x9b\x56\x7a\xa8\x3e\xf1\x28\x5d\x54\xbf\xd6\x9c\x14\x6a\x0a\x75\xad\x8a\xcc\x26\x90\x5b\x06\x89\xca\x0f\x31\x2e\x4c\xd6\x4e\x12\x48\x89\x55\xce\xff\x1a\x16\x2e\xc3\x9c\x37\x0b\x25\x6c\xc8\xce\x29\x9b\x1c\x9d\x2d\x04\xcf\xca\xc5\xbf\x26\x47\x18\x05\x3f\xe7\x59\xf8\xa7\xef\xf0\x77\x99\x35\xfe\x12\x74\x00\x1c\x6c\x7f\x39\x00\xee\x37\x6c\x7a\x66\x46\xe1\x99\x56\xdb\x1a\x99\x49\x40\x43\x77\xec\x59\xc6\x56\xa2\x38\x4d\xd4\x72\xa5\x72\xc8\xab\x82\x56\x2c\x59\x88\xe4\x93\x1e\x4f\x72\x54\x08\xc3\xf6\xd1\xe5\xaa\x8a\x4c\x07\x16\x30\x32\x91\x44\x79\x93\xe6\x40\xe1\x36\x89\xbc\x2c\xd6\x1b\xa5\xca\x83\xe6\x3e\xf4\x34\x0d\x68\x51\xb6\xd3\x41\xb8\xd5\x5d\x97\x09\x1a\xd5\x6c\x32\xce\xb0\x87\xef\xa2\xfd\x8e\x34\xf7\x14\x5a\x83\x59\xf6\x19\xec\x63\x4f\x35\x00\xf7\x78\xb4\xf9\x2d\x1f\x52\x2d\xdf\x64\xfe\xdc\x4c\xb2\x37\xf4\x80\xa3\xb1\x80\x83\x0c\x02\x33\x90\x54\xac\x56\x99\xc4\xdc\x78\x4f\x4b\x81\x4a\x30\xef\xd5\x04\x61\x0d\xfa\x24\x2a\xd7\x32\x35\x92\x03\x62\x18\xa0\x10\xbe\xe4\x9f\xac\x51\x98\x86\x18\xd9\x40\x93\x29\x9b\x8a\x20\x67\x1d\x4a\x3f\x10\xd1\xf7\x41\x01\xe0\xd8\xe1\x89\x55\xeb\x48\x88\xd8\xb4\x92\x7b\xd3\x7e\x5d\x1f\x69\x07\xf2\x6f\x27\x0d\xd3\xc2\x8c\x5a\x77\xfa\x57\x1b\x6d\xed\x3b\x31\x84\xab\x3e\xce\x85\x7a\xfb\xda\x7b\x6e\xe5\x9a\xc4\x1d\x28\xcd\x61\xed\x1f\xfd\xbd\xf9\xf4\xc3\x59\x6c\xdb\x25\x96\x07\xb6\xfe\x47\xb1\x7f\x3b\x1c\x4a\xd1\x72\x22\xe0\x53\x31\x47\xf2\x80\xe7\xe1\x81\x07\xea\xb0\x0f\xf5\x29\x99\x8e\x2d\x77\x67\x81\x51\x5b\xa1\x91\xea\x01\xcf\xf4\x8b\x1e\xa8\x6e\x92\xd0\xb6\xb3\x74\x34\xa2\x86\x3c\x98\x43\x55\x51\x90\xaf\x1c\xf6\xa8\x39\xa5\xca\x70\x3d\x15\xd9\xa7\x3d\x2c\x4c\x62\xd4\x4b\x5b\x9a\xf9\x23\x78\xd7\x9c\x66\xdc\x42\x66\x5c\xd1\x2e\x73\x75\x8c\x0c\x8c\x77\x08\x2f\x0b\x66\x94\x6a\x24\x72\x40\x84\xd7\xba\x14\xcb\xd7\x81\x95\x9a\x9c\x9c\xf4\x87\x2a\x8f\xff\x14\xd8\xc5\x1d\xad\x42\x2d\xce\x79\x06\x77\x63\xd1\x7b\xdd\x01\xeb\x7e\x78\xe0\x83\xef\xc9\xd3\x75\xcd\xad\x78\x18\xde\xbd\x8f\x8d\x6c\x8b\x71\xac\xee\xc9\x8b\xfe\x08\x9e\xbc\x58\xfb\x1f\x22\x49\x9f\x74\x24\xe9\x10\x63\xf9\x5c\x62\x2c\x87\xb4\xb3\x3d\x68\xe0\xc3\xa5\xa1\x4d\x8e\xe8\xb6\x9e\x5a\x7a\x38\x39\x7a\x76\x09\x69\x5b\x36\xf6\x30\x09\x6a\x4f\x6c\x17\xbb\xac\xa0\x5f\x34\xb2\x77\x0b\xa7\x7f\xd8\x28\xdf\xcd\x1f\xee\x93\xca\xd6\xa3\x77\xc4\xed\x7d\xda\x97\x9a\xed\x2e\x6b\x0c\xc9\x6d\xad\xf3\x1a\x92\xdb\xfa\xcf\x75\x48\x6e\x7b\xac\xe4\xb6\xcd\xa4\xa1\x23\xd9\x6d\x7b\xc7\xd8\x48\xb5\x45\xd7\x19\x92\xe1\xbe\x06\x15\x66\xef\x64\xb8\x9a\x68\x21\xc5\x43\xe6\xc4\x6d\xe1\xce\x3d\xad\x0f\x83\xfe\xf6\xac\xf5\xb7\xfb\xe6\xc8\x3d\x09\xed\xad\xa7\xa5\xeb\x2b\xc8\x93\xeb\xe0\x3d\x5f\x4a\xa2\xf6\xc9\x2f\xfb\x70\xbf\x2b\x9f\xb2\x62\xc1\x16\xc3\x18\x6a\xb0\xed\x52\x05\x30\xe2\x18\x6d\x0a\x18\x39\xd3\x2a\x2d\xfa\x14\xd2\xef\x11\x5f\x7d\x63\xda\xdc\xb4\x41\xe5\xd5\xa2\xbe\x62\x6b\xa3\xf5\xe9\xb9\x92\x50\x5f\x4b\x98\x73\x87\x3d\x62\x9f\x93\x85\xb4\xc9\x18\x70\xee\x10\xa6\x59\x8a\x43\x3c\x5c\x30\xd3\xd6\xa0\xcd\xee\x00\x27\x91\xde\xd4\xc2\x33\xa3\xd2\x0f\x18\xa8\x69\xeb\x93\xd0\x07\xeb\xab\x8e\x82\xa2\xc9\x01\xe2\xa3\xa2\x6b\x5e\xdc\x28\x38\x9a\x06\x3c\x48\x78\x74\x10\x9f\x25\x20\x6e\xad\x2d\xca\x51\xea\x46\x88\x29\x9d\xa6\x2f\x11\xef\x82\x2b\xc7\x8c\x9d\xfb\xf8\xb6\x9b\xc9\xd1\xbb\xcf\x66\x49\x93\xa3\x9b\xd6\x98\xe6\x0d\x81\x95\xb6\xc8\x47\xf0\x5d\x1b\xa4\xf9\xc2\x25\x85\x42\x23\x71\x2b\x30\xd2\x5c\xa4\x27\xb0\x67\xa9\x82\x9e\xa9\x28\x0b\x9e\x94\x5e\x24\x48\xf8\x8a\x27\xe6\x0b\x00\x91\xc7\x6f\xb9\xcc\x40\xaf\x2c\x15\x85\xec\xd5\xe2\x05\x1b\x0b\xf1\xfb\x1e\xae\xe4\x05\x3f\xe9\x5c\xcd\x7f\xf3\x42\xfc\x77\x33\x4c\xd7\xf9\xd7\x21\x6b\xc2\xc1\x72\x52\x1c\x28\xdd\x34\x3f\x6f\x8b\xee\xe7\xa7\x2e\x3e\x27\x59\xa5\xe5\xad\xc0\xa2\xf4\x2d\x9f\xfe\xe6\x03\xc0\x3d\xe9\xb0\xe7\x77\xc0\x00\xf0\x4e\xc3\xe3\x5e\x34\xb4\x6f\xae\x5a\xab\x55\xf2\x01\xb3\xd6\x5a\xa7\xb1\x7d\x12\xec\xf1\xf4\x97\x6f\x39\x89\xad\x35\x95\x67\xf3\xdd\x6b\x6b\xbe\x63\x4e\x4f\x0f\xb0\x68\x9e\xa7\xd7\xf2\x5f\x9d\x8c\xc8\xb6\xb3\x21\x22\x4b\x88\x67\x8c\x23\xe4\x29\x48\x38\x0e\xe7\xd7\x8b\x6a\x36\xcb\x04\x04\xac\x43\x58\x48\x18\x70\x2e\xf3\x52\x21\x57\x30\x74\xfc\x6f\x0b\x91\x33\x91\xdb\xc4\x1b\x1f\x2c\x65\x23\x13\x1a\x61\xfd\x2e\x5c\xe9\x98\x72\x91\x1d\x1e\x6a\xc1\x5e\x38\x15\x76\xc5\x65\x01\x81\xf9\x0b\xae\x17\x0e\xae\x40\xc0\x3f\x89\x75\x04\xe0\x01\x76\xc2\x61\x08\x05\x4e\x11\xf9\x96\xe0\x19\xe3\x20\x3c\x38\x5e\x20\xff\x15\x42\xdb\x2f\x44\x21\xc6\x0c\x02\xd0\x5c\xb4\x97\x66\xab\xaa\xc4\xe5\x52\x98\x0b\xee\x8d\x2a\xc0\xc6\x42\xe3\x4b\x92\xaa\xcd\xe0\x63\x16\xec\xb9\x97\x3c\x58\xc6\x8b\x39\x6e\x75\xce\x6e\xb0\xdf\x0d\x1a\x65\x7c\xd2\x87\x96\xf3\x1c\x3c\x4f\x50\x24\x00\xce\xca\x6c\x88\x56\x0e\x86\x56\xdc\xb1\x85\xe0\xb7\x6b\xc4\xa8\xb5\xcc\x58\xf3\xd2\xdc\x27\xc1\x96\xca\xe7\xbd\xe2\x37\x4e\xc6\xcc\x55\xec\xaf\xb4\x28\x4e\x67\x3c\xc1\xda\x52\x41\x21\x09\x5f\xbd\x9f\xa0\xd2\x6f\x05\x9b\x57\x32\xe5\x50\xc3\x23\x77\xb8\xde\x61\xe5\x8a\x1e\xd1\xf7\x7f\x3c\x78\xf0\x3d\xac\xe9\xbd\xc8\xe7\xe5\x02\xd8\x4d\xd7\xed\xaf\xb7\x77\x84\x76\xc9\x3f\xcb\x65\xb5\x6c\x4b\xa6\xa0\xc2\x67\x14\xa4\x74\xc7\x25\x2c\x1d\x12\xd0\x30\xe9\x04\xd3\xd0\x36\x49\x56\x36\xe9\xe2\xcf\x90\xaa\xa3\x75\x2c\xbb\xfa\xcc\x31\xdc\xbf\x18\x22\xc2\xbe\xcb\x31\x63\x17\xb3\x2d\xe0\x0f\xb4\xd3\x38\xc9\x7f\x3f\x7c\x8e\x03\x5e\x9d\x5e\x9b\xeb\x79\x97\xdf\x4a\x7a\x15\x1b\xd2\x9e\x30\xc4\x93\xda\x40\x91\x24\x23\x27\x8b\x95\xc8\x53\x2a\x85\x57\x62\xa2\x4a\x2d\x28\x74\xe3\x56\x5d\xd3\xed\x94\x88\x88\xc1\xc4\x6c\x26\x92\x12\xc5\xb6\x55\x21\x28\x88\x89\xc8\x83\x23\x67\x4e\xcc\x5d\xf2\x4f\xb6\x70\x4e\x1b\x7a\xb6\x91\x05\x3c\xaa\x7f\x00\x9c\xa0\x99\x2c\x0a\x91\x89\x5b\x9e\x97\xbd\x9e\xc3\x1f\x7e\x3c\xcc\x41\x1d\x92\xb5\xed\x94\xa2\xb1\x63\x7e\x06\x88\xdd\x8d\x04\x8d\x11\x44\xf7\xd6\x62\x78\x8f\x75\x57\xb0\x61\x4b\x4c\x63\x14\x9d\x1b\x7f\xa5\xa6\xe0\xbd\xde\x2b\x3d\x63\xb4\x2d\x38\x97\xaf\xe4\x5f\xe2\xc0\xb6\xb8\x67\xd2\x19\xd6\xbb\xa1\x27\x28\x2d\xe9\x49\x7b\x42\x88\x85\x67\xdf\x37\xf4\xd7\xcd\xba\x33\xf7\xcf\x36\xdc\x14\xbc\x7f\x7e\x79\x61\x23\xfb\xfa\x46\xf0\xc7\x5d\xa0\xd8\x83\x0b\xe2\xff\xea\x22\xf8\x03\x6a\x49\x90\x31\xd7\x89\xea\xb6\x0b\x84\x6d\x5b\xed\x03\x16\x56\xa0\x5e\x78\x2d\xe0\x06\x6b\xc6\x83\x2a\xf6\x84\x5c\xb4\xe0\xab\x95\xc8\x35\x13\x12\xc6\xb1\x35\x3d\xa3\xe0\x77\x02\x14\x72\x7d\x21\x61\x3a\x0c\x48\xc7\x67\x47\x39\x2c\xee\xae\x9d\x10\x18\x4e\x54\xad\x6d\x29\x4b\xca\xb8\x9e\xf1\x0c\x3f\x84\xd9\x9d\x37\xbe\xe3\x4d\x68\x7f\x21\x5b\xa4\x99\xbb\x33\xc3\x64\x51\x85\xbc\xe8\x68\xa6\x4a\x65\x82\xe7\xed\x3b\xee\x3f\xd1\xc7\xe6\x68\x27\x13\x23\x83\x50\x78\xb9\x7f\x51\x64\x38\x31\x77\x27\x08\xd8\x07\x33\x85\xdb\x1f\xc8\xd1\x75\x96\x29\xde\x18\x25\xae\x6a\x29\x67\xf6\x38\x0c\xf9\xf1\x15\x57\x82\x1a\x38\xbc\x6c\x8e\xa1\x0a\x20\x3c\x2d\xed\xe1\x4d\x8d\x59\x80\x1a\x55\x7b\x65\xf9\x3a\x90\x67\xfd\x88\xd3\xca\x5c\x21\x4c\x78\x72\x10\x5a\xd1\xa2\xfe\xdb\xfd\x99\xee\xd8\x7f\xc7\x97\x4c\x93\x08\x59\xbb\xc0\x78\xbe\xc8\xe8\x79\x69\x53\x32\x11\xc8\x8f\xd2\x51\xcd\x41\x8f\x60\x06\xce\xda\x56\x7b\x04\x9a\x95\x45\x55\x2f\x37\xf9\xa4\x5e\xb8\xf7\x5b\xf6\x8c\xca\xdf\x48\x36\x3d\xf1\x7f\x21\xc7\x62\x3c\x02\xfc\xb1\x22\xe1\x5a\x00\x19\x5d\x65\x55\xc1\xb3\x13\xc8\xe1\x04\x02\x49\x61\x67\x23\xa6\xab\xa9\xe7\x86\x61\x0a\xdd\x88\xfd\x9d\x4d\x8e\x6c\x6d\xe7\xc9\xd1\x88\x4d\x8e\x72\x95\x0a\x7d\x86\xd1\x08\x93\x23\xf6\x0f\x2b\x9e\xb8\x83\xe9\x22\xd5\x7e\x9a\xcf\x8a\x52\x7f\x91\x9c\xb5\x67\xb0\x85\x3d\x8d\x96\x8d\x74\x35\x2f\x6e\xb4\x3e\xa6\x43\x7a\x5b\xae\xf1\x01\x9c\x63\x7e\x44\x37\xe2\x50\x6b\xfb\x2e\xe8\x21\x7a\x65\xa7\x94\x85\xf1\x00\x20\x44\xed\x4e\x32\x77\xfd\xe2\x59\xdb\xd0\x95\x36\x58\xa2\x42\xcc\x79\x91\x66\x50\x60\x10\x05\xc7\x7b\x05\x1a\x39\x56\xd0\x9b\xe1\x46\x8b\x20\xc6\xd6\xb9\x92\x07\x05\x31\xc2\xf9\x8f\x1e\xd0\xe5\xd7\xe3\xda\xb9\x34\x46\x2f\xbe\xab\x42\xce\xd1\x1a\x8f\x86\x67\xaf\x0a\xd4\xeb\x04\x45\xc9\x83\x11\x54\x14\x65\xe0\xd8\x94\x1f\x0e\xf5\x39\x0b\x21\x18\x40\x7a\x86\x1b\xcf\xf3\xe0\x83\x7f\x36\xa3\x62\x82\x11\x48\xe6\x70\x93\xe8\x96\x33\xba\xe5\x3d\x2e\xb6\xf5\xc0\xdf\xdf\x7d\x18\xe1\x85\xb5\xde\xc4\x1e\xb1\x30\xf6\x0e\xed\x11\xf5\x17\xdd\xca\x83\xac\xa8\x9d\x30\xb5\x7e\xdd\x1c\xc4\x41\xbe\xf9\x9b\x16\x45\xf3\x4b\x3d\x9f\x0a\x6c\x70\xd7\xab\x38\x90\xeb\x09\xbe\xb5\xa7\xeb\xc9\x85\x7d\xc0\x9d\x89\x46\x69\x3b\xc9\x1a\xc5\xaf\xb7\xa7\xbd\x3f\x32\x5b\x77\x40\x17\x56\x78\x12\x9b\xa9\x42\xd0\xaa\x8b\x05\x81\x0d\xf7\xa1\xf9\x8e\xf9\x08\xf0\x9e\xbe\xe0\x77\x4f\x18\x81\x2e\x17\xe5\x9d\x2a\x3e\xc9\x7c\x3e\xbe\x8d\x2a\xcb\x5f\xf2\x72\xb1\xe5\x4c\x6a\x2d\xbd\x11\x10\x2c\x5e\xe6\x17\xac\xf0\xe9\x6a\x16\xb3\x8b\x3c\x51\x4b\x88\x99\x29\xb2\x1a\x7e\x29\xb4\x37\x44\x79\xa6\x8a\x3b\x5e\xa4\x54\x13\x72\x21\x9a\x15\x8f\x0f\x5e\x27\x3e\xde\x80\x1d\x4a\xc4\x53\x9b\x28\x84\x35\x88\xc3\xb1\x6c\xc2\xc7\x02\x2a\x82\x7c\x2a\xb1\x44\x2a\x54\xb8\xb4\x26\xeb\x70\xe1\x1b\xe2\x2a\x56\xf1\x81\xb4\x4d\x09\x4e\x42\x5a\xe5\x3c\x65\x7c\x6e\xf4\xe2\xd2\xef\x31\x86\xce\x4a\x7b\x12\x2e\xcd\xd4\x97\x5e\x96\x08\x87\x63\xcd\x11\xc9\x82\x17\x3c\x01\xff\x5b\x2a\xb5\xb5\xfd\xfb\xa8\x06\x17\x0c\xc7\x33\x36\x81\x29\x4e\x8e\xd8\x8a\x17\x25\xf2\xea\xdf\xae\xde\x13\xfc\xb2\xcc\x91\x47\x5f\xfd\xfc\x86\xfd\xf0\xa7\x3f\xfe\x61\xcc\xcc\x64\xb5\x15\xf6\xe7\x32\xb7\x17\xe6\xf8\xec\x78\x8c\x3e\xb3\xa8\x64\x36\x38\xe6\xa0\x0b\x7c\xbd\xbe\x06\xf4\x1f\xd0\xc2\xf7\x90\xe0\xcc\xd0\x1f\xbb\x23\x57\x2e\xa9\x99\xa1\x40\x50\xd3\x93\x0e\x1e\xa2\x89\x57\x85\x28\xa3\xac\x28\x38\x0f\x7b\xd3\x71\xc5\xd0\x99\x80\xf9\x02\x97\xd9\x4c\x99\xad\x75\x81\xa9\xfa\x35\xfb\x8e\xbd\xfb\xcc\x93\xf2\x35\x22\x67\xd3\x67\xcc\x7e\xc2\x41\x0a\xf3\xb7\x6c\x3d\x66\xdf\xb1\x4b\x00\x9c\xf1\xed\x5c\x01\x54\xee\x9b\x23\x28\x0d\xd3\xab\x4c\x96\xe6\x14\x60\x8f\x2d\x24\x37\x93\x7a\x92\x33\x84\x54\x83\x6e\xf8\x05\x2a\xa7\x3f\x5d\xfb\xff\xe4\x5a\xea\x31\x3b\x8f\x1b\xc0\x9d\xb7\xd9\xd9\x66\x20\xab\x15\x66\x7c\x4a\xe8\x5f\xee\xfe\xb9\x09\x98\x5f\x8e\xcf\x8e\x99\x16\x2b\x5e\x18\x76\x37\x0e\xec\x48\x46\xb7\x34\x03\x21\x11\x35\x64\x1d\x17\x01\x16\x23\xc8\x8f\x5e\x59\xb0\x64\x9c\xc3\xe9\x9d\xd4\xc2\x2e\x52\xcd\xd8\x8a\xb6\xd5\x0c\x62\x07\x35\x43\xb4\x00\x8a\x43\x2a\x84\x5d\x8a\x0d\xb8\xa3\x67\xc4\x0d\x13\xc1\x4b\x63\x46\x52\x2d\x3d\x64\x1e\x7d\x60\x44\xe8\x2b\x46\xf3\x25\xa4\x68\xf6\x42\x8c\xe7\x63\x76\x36\x53\xea\x6c\xca\x0b\xb7\x2e\xa1\xdd\x6f\x67\x53\xfe\xaf\x51\x9b\x15\xca\x36\x98\xf2\x7f\x9d\x8c\x27\xf9\x77\xb5\x52\xfe\xd7\x94\x89\xf7\x9a\x5d\x74\x5f\x3f\xf0\x05\xaf\x58\xa9\xcc\x0c\xca\x5a\xe1\xfc\x71\x6d\x64\x0d\x57\xb4\x2c\x84\x75\x51\x73\x44\x39\x82\xc3\x12\xee\x22\xc3\xae\x14\xd4\x4e\x5a\xfc\x04\xc4\x84\x2f\x15\xdd\x4c\xd3\x02\xae\x32\xee\x2b\x84\x1c\x8f\x27\x79\xfd\x83\x16\x12\x10\xd2\x08\x4b\x65\x4b\xb2\xba\x77\x4f\x1d\x0f\xcb\x3a\x2d\xd3\x38\x38\xf7\xbc\xaa\x32\xf1\xbb\x79\xc9\xfd\x58\xa8\x6b\x1e\xdb\x55\x16\x65\xb9\x62\x5a\x64\x22\x29\x55\xa1\x31\x2a\x95\x20\x28\x68\xe6\x1a\x02\xc6\x11\x09\x0e\x21\xa3\xa0\xd3\xeb\xb3\xb3\x49\xf5\xf2\xe5\x0f\xc9\x42\xe9\x12\xfe\x4b\xd0\x0f\x40\xa2\xe1\x87\xff\xc4\x1f\xb4\xe0\x45\xb2\x30\x24\x1b\x7f\x66\xa7\xf4\x7f\xe9\x0b\xec\x0e\x31\xc8\xe1\x7f\x4d\x33\x97\xc0\x53\x15\x19\x4b\x54\x51\x00\xde\x1a\x9c\x99\x25\xee\x23\x9b\xb7\x41\x96\x75\xcb\xe5\x6c\x2c\x02\x49\x47\xc4\x9d\xe0\x49\x97\xa8\x7d\xcd\x4a\x51\xf8\x57\x66\x28\x04\xcf\x53\x36\x15\x33\x55\x50\xf9\x07\x59\x98\x3f\xfc\xe7\xb1\xb9\x56\xc7\xff\x76\xdc\x43\x32\x00\xae\xd1\x95\x92\xc2\x12\x95\x99\x7d\xb6\x39\x75\xc0\x69\x48\xbe\x5b\x85\x41\xfb\x7e\xe7\x0f\x13\x67\xb4\x5d\x00\x3b\xac\xd9\x6a\x6f\x70\x75\xd8\xc1\xc3\x3c\x92\x8b\xcb\x9f\x32\x95\x7c\xda\xf2\x2e\xa8\x45\x00\xd7\xcf\xe1\xe2\xc9\xa4\xca\x78\xc1\xde\x5c\xbc\xbd\x62\x2f\xde\x7d\x1e\xb3\xc9\xd1\xab\x3f\x7d\x3f\x7e\xf5\x87\x3f\x8e\x5f\x8d\x5f\x9d\x7d\xff\xe3\xe4\x68\x34\x39\xfa\xfe\xe5\xcb\x57\xaf\xd3\xe9\x9f\x5e\xbf\x3e\xfb\xc3\x8f\x93\xa3\x13\xa2\xf6\x51\xe0\x02\x10\x79\x95\x7a\x41\x09\x8a\x0c\x7f\xc0\x79\xa2\x07\xd5\xd0\xd6\x63\xf3\xe4\xd2\x6b\x7a\x7f\xe8\x66\x17\x9f\x13\xb1\x2a\xd1\x24\x19\xcc\xd0\x4c\x8a\xee\x0b\xc5\xab\x90\xf1\xd3\xd5\x9d\x37\xd2\x8d\x85\x13\x29\xaa\xac\x4f\x9d\x96\x44\xa6\x0d\x85\xb7\xb6\x57\xb0\x19\x61\x5e\x4b\x23\xa3\xe5\xe2\x92\xe1\x76\xfe\x0e\xd5\x15\x88\x4c\xd8\x12\xd7\xf5\x0d\x44\x25\xa6\xb6\x87\xbb\x4b\x53\xb8\x4b\x1d\x73\x7f\x87\x5b\x19\x63\xf3\xf4\xde\x48\x9e\x1f\x62\x69\x8c\x26\x41\x95\xff\x2d\xa1\xb2\x71\x28\x24\x25\xac\x61\x48\x55\x95\x5a\xa6\x48\x86\x60\xdf\xa1\x64\xc9\x03\x1a\xa3\x77\x7e\xa7\x70\x61\x0e\xf4\x4c\x91\x08\x6d\x7b\xa6\xd8\x02\xcf\x2f\xa6\x9e\x85\x87\x54\xc2\x02\xfd\xb6\x06\x78\xa2\xf2\x1c\x9b\x01\x29\x05\xe8\xe9\x28\x63\x2a\xd2\x15\x02\xe5\xf1\xdc\x55\xda\xb7\xc2\xb3\x8b\xc7\x83\x17\x3d\x97\xb7\xc2\xaa\x5c\x1a\xc2\xb4\x8a\xdc\x88\x21\xa7\xf0\x09\x08\x57\x36\x6a\xe7\x88\x65\x8a\xa7\x6c\xca\x33\x88\xdd\x22\x2d\x6c\xe4\xea\xf3\x0b\x76\x7d\xfd\x7e\xc4\xd4\x6c\x26\x0a\x34\x2f\xa3\x34\x7d\x2b\x8b\xb2\xe2\x19\x14\xf6\x37\x0f\x4b\x94\xc9\x90\x10\xf9\xa4\x13\x22\x87\x9c\xc0\xe7\x92\x13\xd8\x13\xd3\xe5\xfa\x49\xe5\x00\x86\x46\xf3\x7d\x10\x5c\x5a\x89\x71\x27\x50\x0b\x24\x40\x91\x91\xd2\x22\xb2\xb8\x58\xf9\x40\xe7\xfb\xaa\x31\x58\xda\xb7\xa6\x1b\x6a\x85\x32\x1b\x36\xa5\x12\x3c\x8d\xed\x69\x30\xfa\x87\x4b\x07\x0d\xf6\x71\x5b\x0e\xa8\x15\x04\x36\x27\x7b\xee\x90\xe7\xb9\xd5\xd8\xda\x29\x6a\x78\x8b\xab\x53\x0c\xb2\x2c\x10\x1d\x30\xe3\x0d\xa3\x90\x9d\x97\x2e\x4f\xd9\x4a\x15\x7d\xfc\x00\x96\xc4\xef\x7c\x23\x13\x55\x08\x80\x3e\x59\xaf\x44\xfa\x5e\x25\x3c\x43\x9a\xd5\xaf\x48\xdb\x55\x10\x7f\xc6\x73\xe6\xba\x06\xb8\x26\xec\xbf\xdc\x59\x07\xe1\x6a\x79\xd3\x7f\x1c\x5c\x62\x27\x0f\x5c\xcc\xa2\x10\xb7\xd0\xa4\x6a\x77\x69\xfc\xc1\x88\x3a\x10\x6c\x4f\x3f\x5c\xaa\x82\x70\x83\x89\x17\xb9\x6e\x14\xc4\x04\x7c\x73\x59\x19\xa9\x28\x5b\xfb\x54\x30\x17\x0b\x0f\xc6\xdc\x89\xf5\x2a\x4d\x8e\x36\x18\xb5\xe9\x7b\x07\x22\x02\x38\x58\x1f\xe3\x3d\x35\xf5\x06\x7b\xb3\x1c\xfb\x23\x18\xbb\x7e\xb2\xa2\xe7\x2e\xcb\xb5\x67\x19\xaf\xb7\xeb\x51\xef\xf4\x5a\xc0\x5e\xd7\xfd\x56\xa0\x59\x23\x8d\x0b\x7e\x8c\xef\xc9\x28\x74\x5a\x90\x65\xd6\x5e\x21\xc3\x4f\x50\xed\xbd\x91\xf8\x13\x8c\x30\xf6\xa4\xc7\x90\x43\xa9\x4f\x29\x98\xfb\x14\xfe\x7c\xc3\x40\x82\x41\xd9\x94\xa4\x75\x6b\xf9\xb1\x21\x9d\xa4\x1c\xe4\x91\x15\x32\x48\xf5\xb0\xe8\xc6\x22\x75\xb5\x1b\xd1\x27\xc0\x99\x96\xf9\x3c\x8b\xcd\x97\xfe\x82\x03\x7c\x2a\x18\x2c\xfd\x14\xa8\x16\x64\x09\xe8\x32\xb9\xb8\x73\xcb\xf3\x61\x5c\xe6\xf8\x54\x55\x1a\x45\x06\x27\xe2\xa2\x04\xad\x46\xc8\xb5\x96\xf3\x1c\x4a\x8b\x48\x57\x4f\x12\x5b\x0f\x9a\xc0\xa0\x09\x0c\x9a\x40\x7d\xdb\x07\x4d\xa0\xc9\xec\x0e\xa6\x09\x00\xd5\x3b\x98\x3a\x40\x2e\xa0\x41\xe8\xad\x0b\xbd\xc8\x6b\x1f\x4e\xf2\x85\xf1\x3b\x60\xbc\xea\x4d\xdb\xec\x6d\x61\x1b\x31\xf0\xa3\xa7\xcd\x8f\xfa\x40\x75\x5d\x98\x36\x75\xc0\xf3\x4d\xa7\xbc\x71\xd4\xfb\x91\x97\x01\x92\x6b\x60\xba\x7d\x21\xb9\x1c\xcb\xc5\x14\x0a\xcb\x6e\xbf\x02\x50\xac\x3d\x18\x42\x07\xf6\xd5\x41\x98\x42\x07\x06\x52\xbd\x29\x5b\x15\xea\x56\xa6\x22\x86\xb2\x42\x60\xd2\x48\xf1\xf3\x1a\x57\x3f\xac\x0e\x2c\xe9\xd7\xe9\x85\x74\x0d\x6d\x34\x10\x11\xf0\x10\xc6\xca\x8f\x16\xb9\xf7\xa8\xae\x24\xbc\x56\x54\xa7\x50\xe3\x06\xc7\x11\xda\x74\x52\x39\x03\x0d\xb5\x64\x93\xa3\x59\xc6\x6f\x55\xa1\x27\x47\xbe\x00\x65\x50\x79\x90\xf4\x57\x6d\x3e\xeb\xbf\x37\x8e\x13\x82\xd6\xaa\x02\x32\x01\xd5\xb8\xfc\xd8\x97\x31\xd4\x84\x1b\x47\xda\x40\x15\x43\x90\xc2\x41\x61\x9a\x01\x3a\x81\xd3\x19\x31\xbf\x59\x2d\xb9\xcc\x4f\xa9\x1c\x58\x8a\x31\x2c\xb9\x42\x1c\x01\x80\x39\xf8\xfe\xdf\x5f\x86\xf1\x75\x32\x67\x19\xa4\xe2\x8f\x18\x44\x0c\x4d\x8e\x78\xb2\x14\xa0\x60\xe3\x89\xf9\x12\x8b\xc5\xe4\x28\x42\x70\x92\x9a\xc9\xe5\xb2\x2a\xf9\x34\xab\x27\x8a\xf5\x8b\x7d\xb3\x2b\x7f\x64\xd3\x57\xb0\xe5\x14\xf7\x92\x7f\x42\xb0\xa5\xa4\xd2\xa5\x5a\x7a\xb2\x4f\xf1\x88\x10\x23\x92\x22\xd2\x0a\xaf\x43\xa1\x05\x48\xb7\xf1\x19\x19\x8e\xb1\xa2\x2e\xb2\x71\x19\x5d\xcc\x15\x51\x24\x26\x3e\x97\x05\x0f\x90\x47\x1e\xcc\x94\xd3\x4f\xf2\xeb\x10\xfa\x06\x69\xef\x59\x4b\x7b\x0f\x29\xe6\x0d\x12\xde\x20\xe1\xed\x2c\xe1\x3d\x09\xa3\xca\xf3\x90\x26\x1f\x58\x90\xec\x80\x2b\x09\x5a\xd5\xfd\x04\x05\x95\xcf\x5b\xad\xc2\x0c\x0d\xcd\xaa\x3c\x15\x85\x79\xce\x1e\x14\x4a\x61\x91\x42\x4c\x7e\xc8\x00\x04\xc6\x06\x8e\xda\x70\x9c\x20\xf5\x23\x0a\xd6\xc7\x50\x4e\x61\x88\x02\x82\xc7\x80\xfb\x0e\x46\x84\xb8\xbc\x11\xa2\x26\x14\xaa\x2a\x1b\x09\x21\x21\xe8\x0c\xf8\x5e\x10\xb5\x88\x42\x9d\xeb\x51\xb5\x3d\x78\xa4\xf9\x6c\x07\x39\xfb\xab\x42\x46\x0c\x61\xa8\x55\x96\xad\xd9\x3f\x2b\x9e\xe1\x3e\xa0\xb4\xe7\xe4\x5d\xce\xe8\x44\x60\x39\xa3\x8d\x39\x10\x14\x8e\x1e\xc6\xff\xa7\xe2\x56\x52\x48\xb4\x23\x6d\x13\x98\x5e\x90\x59\x81\xb9\x00\x17\xe1\xb8\x32\x77\xe3\xbe\x66\xaf\xc6\xec\xe2\x52\x3b\x1c\x4b\x0a\x7d\x0c\xf3\x3c\xbc\x22\xe0\x63\x8f\x13\xc3\xbd\x73\xf3\xc7\xd5\x0a\x22\xb8\xa1\xea\x35\x05\x11\x92\xbb\x11\xb4\x0d\x17\x27\x0f\x82\xb3\xe5\x54\x93\xfc\x7b\x72\x16\xbd\xbe\x61\xa9\x40\xec\xc3\xc2\x86\xc3\x17\xc2\xdc\x1a\xb8\x1f\x04\xbe\xb1\x52\x45\xd9\x9c\xe3\x24\x9f\x94\x2c\x98\x28\xc6\x6a\x52\x42\x89\x8f\x02\x03\x91\x77\x95\xc9\x44\x9a\x46\xaf\xff\xf8\x12\xae\x0f\x04\x4c\xf3\x3c\xc5\x41\x5e\xff\xf8\xe3\x0f\xee\x67\x33\xbf\x9f\xa8\x52\x9b\x16\xc0\x45\x92\x05\xcf\xe7\xce\x91\x3a\xab\x0c\x01\xda\x74\x59\xdb\x52\x6a\xe0\xaa\x06\xb1\xc9\x8d\x6b\x87\xc0\x20\xd4\x50\xea\x38\xa1\x25\x74\xb4\xc1\x1d\x47\x77\xb6\xcd\x0c\x72\x69\x1c\xe5\x22\xd4\x2d\x1a\xdf\x98\xe4\x93\x1c\x6e\x26\x79\xda\x26\x47\xab\x42\x24\x52\x8b\xc9\x51\x58\x62\x3e\xbc\xa0\xd6\xdb\x05\x89\x48\x14\xf9\x86\xa0\x67\x65\xf3\xf2\x52\xfe\xc2\xe4\x68\xa6\xd4\x78\xca\x8b\x71\xa2\x96\x93\xa3\x13\x8c\xa6\xbc\x93\x59\x9a\xf0\x22\x9d\x1c\x8d\x36\x7d\xcc\x29\x40\x94\xde\x43\xee\x3b\xdb\x13\xb3\x44\xdc\x47\xbe\x1b\x9b\xcf\xe0\x27\xf0\x32\xb9\x86\x4e\x55\x62\xc7\xdf\x1d\xa3\x6f\x9a\xaf\x56\x82\x17\xe6\x49\xc9\x52\x8b\x6c\xc6\xb8\x0e\x82\xc4\xdf\x7e\xb8\xa6\xd1\x51\x84\x0c\xa0\x47\xdc\x34\xe0\xef\x63\xf6\xbf\x55\x65\xf6\xcf\xdc\x43\xac\xd1\x5c\x9f\x9f\xff\x04\xce\x14\x76\xfc\x3f\xfe\x03\x13\xfe\x4e\x30\xb5\x0f\xee\x8a\xf5\x17\xb6\xdd\x17\xe8\x44\x1a\x5b\x5e\x7b\xf6\x77\x7c\x8d\xcf\x76\xc6\x2c\x9d\xa1\x73\x1c\x45\x79\xcd\x3e\x33\xda\x96\x34\x24\x8d\x06\xae\x3e\x1c\xd8\x42\xf0\x14\xdf\x9d\x30\x04\xca\x50\x4e\x33\xe4\x98\x7d\x1f\x0d\xef\xd7\x38\xf2\xf0\x34\x7b\x7d\xa6\x54\xfe\x4b\x70\x5b\xab\xd9\x4c\x7e\x66\x2f\x0a\xb1\x54\xb7\x96\x83\xe0\x99\xc0\x6e\x9e\x58\x02\xe2\x36\x39\x0e\x88\xee\x2d\x0c\x99\xc9\xdc\xd3\xa1\xd2\x9a\xb3\xf1\x40\xfa\x5e\x2d\x3e\xa1\x93\x35\xc7\xed\xe3\x58\x85\x20\x22\xa4\x35\x6c\xe1\x20\x69\xaf\x10\x16\x22\x37\xa5\x36\xe2\xfb\xb4\x81\x36\xf0\x20\x2d\x5e\x9d\xb7\x9e\xf8\xf0\x14\x7a\x9b\xb5\xf0\x94\x3d\xac\x15\xaa\xd8\x3d\xf5\x3c\x3e\x8f\x78\x63\x2f\xcd\x80\x5b\xcd\x14\xca\x73\xdd\xb6\x6d\x38\x47\x06\x85\xcc\xbf\xa0\x7f\x20\xdc\x9f\xd4\x3e\xa9\x09\xe5\x9b\xd6\xb3\xdd\xc3\x52\x7a\xc0\xac\xdf\x30\xbc\xb0\xfb\x52\x1a\x01\xc0\x47\x60\x85\x47\x6a\x73\xa3\xd9\x9d\xd4\x0b\xac\x64\x0d\x17\xa2\xc7\x65\xa4\x80\x8a\xe6\xd3\xd8\xe7\x78\x77\x48\xe2\x7d\x1b\x7d\xd7\xde\x75\x2b\x64\xb6\xd8\x29\xeb\xc0\x63\xf9\xb1\x83\x8c\xca\xd7\x48\xc7\x0c\x91\xc5\xa2\xc2\x0e\x47\xdc\x73\xfd\xda\x07\x2d\xd6\x4d\x10\x5e\x75\x31\xab\x37\x22\x09\x4a\x0b\x2a\xe6\x0d\x53\xa9\x63\xce\x86\x40\x68\x7e\x42\xf6\xd6\xc2\x74\x5c\x1a\xd6\xca\x52\x6a\x17\x53\xef\x4d\x66\x1b\xcc\x18\x81\xc1\xf9\x43\x37\xe1\xb8\xa8\x35\x6f\x2b\x6b\x10\x05\xf0\x10\xe6\x55\x00\x69\x68\x68\x4b\x20\xe4\x47\xad\xad\x71\x0a\x45\x8e\xc0\x96\x07\x2b\x74\x06\xdb\x08\xde\x8d\x6c\x81\x85\x58\x65\x84\x67\x26\x58\x6a\xd4\x1e\xac\xc5\x7b\x53\x8b\x69\x22\x99\xb6\x11\xd0\x84\xb6\x64\x73\x41\xee\x78\x91\x9a\x9d\x5b\xae\x78\x29\xa7\x32\x93\xe5\xda\x08\x41\x22\xb7\xb1\x4d\x2e\x00\x49\x6a\x3c\xbb\xa0\x14\x3f\x06\x29\x9a\xaf\x8b\x14\x6a\x51\xa8\x5b\x67\xd0\x40\x00\xd9\x8f\xb1\x95\xd2\xc8\xab\x62\x29\x4b\xc3\xb6\x79\x01\x86\x50\xe2\xc8\x28\x50\x18\x11\x27\xf8\x64\xcd\xb6\x6d\xed\x64\xf5\xa4\x4b\x6b\xc8\x3b\xbf\xbc\xb0\xf7\x5c\xce\x73\x23\xcf\xd2\x7e\x6f\x8b\x8d\x0a\xb3\x32\x6a\x61\x58\x84\x6e\xb6\xe4\xc5\x27\xb4\x87\xd3\xfb\xb6\x52\x62\x2d\x2a\x4c\x8b\xb2\x81\x08\xea\xe0\x51\x69\x3f\x7e\xb6\x18\xbc\x81\x87\x83\x62\xd7\x6a\xb7\x99\xee\x48\x88\xe0\xbb\x4f\x35\xb6\x1e\x65\xc6\xcf\x7d\xa6\xa6\x91\x88\xf0\x95\xd9\x45\xb9\x04\x95\x38\xb4\xf8\x62\x16\xab\x01\x50\xb8\x1e\x45\x2c\x87\x24\x11\xea\x01\x70\x79\x72\xa7\x64\xdb\x4d\x6a\x00\x23\xb0\x83\x9b\x07\x1f\xb9\x1c\x78\x99\x75\x6d\xf7\xc7\xf7\xd7\xb1\xc9\x7f\x5c\xd3\x13\x9d\x6c\x61\x64\x7c\x4a\x20\xd6\x5e\xd8\x37\xfd\xcd\x4f\x23\xf6\xe3\x8f\x3f\xc0\x49\x2c\xab\xac\x94\xab\xcc\x82\x88\xfa\x07\x01\xe7\x6a\xf1\x24\xfd\x3b\x32\xc7\xac\x47\x98\x12\xe6\x24\x7d\x1a\xe3\x73\xa0\xae\x81\xe2\x03\xd9\xcb\xb5\xb2\xf1\x30\x02\x50\x41\xaf\xd2\x95\x8b\x42\x55\x73\x34\x61\x5c\x7f\xb8\x80\x69\x12\xd0\xb4\xb9\xe2\xf4\xcc\x65\x83\x54\xb3\x59\x95\xcd\x64\x96\x59\x09\xdb\xb6\x70\x0b\xbf\xfe\x70\xf1\x90\xf7\xe3\xe3\xfb\xeb\x47\xcf\x4f\xbd\x97\x7c\xd3\x55\x15\x21\x6a\xe7\x64\x9c\xee\x74\x81\x1e\x25\x64\x14\x4f\x7f\xc2\xa4\xb3\xdd\x21\x8c\xac\x8f\xed\x7d\x30\x48\x8f\x7c\x87\xb0\x79\x88\xa9\xd9\x56\x64\x16\x1c\x0f\x8a\xa7\xa7\x94\x19\x57\x3c\x98\xcf\xcb\x5c\x9a\xce\x13\x30\x2f\x20\x16\x31\xa1\x58\x25\xbc\xa8\x8c\xaf\x45\xc1\xb4\x48\x2a\xc0\xcc\xae\xdb\x01\x77\x72\x70\xc3\x73\xee\x61\xf5\x43\x49\x8e\x47\xd4\x5e\xfb\x8c\x54\xd2\x77\x80\x3c\x99\xcf\x40\x71\x64\x11\xc0\x72\x13\x08\x86\x83\x98\xac\xac\x86\xed\x84\xa2\x33\xe2\x1b\x34\x54\x99\xe9\x6b\x91\x14\xa2\x1c\x5b\x59\xd0\x79\xc9\x9c\xce\x0c\x2c\xc7\xc6\x9f\x5b\xdf\xa7\x39\xc4\x69\x78\xe8\x6d\xa4\x42\x6a\x1f\xfc\x2d\x67\x2c\x13\xb3\x32\xe4\x49\x4f\x00\x5f\x71\x1b\x9f\xd0\xb0\x31\x3d\x84\xd0\x6b\xd7\xb0\x4d\xfc\xc4\x61\x1c\xb7\xf6\x19\xa0\xe6\x18\x2d\xf3\x55\x39\x92\x71\xe0\x17\x3f\x5b\x5f\x3b\x6c\x98\xf3\x28\x97\x8a\x92\x5c\x4d\xc7\x42\x55\x70\x1e\xce\x7a\x67\x08\xba\xa3\xf9\x3c\x53\xb9\xb7\x0a\xda\x3f\x21\x78\xbe\x59\xbf\xc8\xf1\xd4\x66\x19\x60\xec\x3a\xc3\xf6\x04\x6e\xe1\xe4\xc8\xda\x5c\x50\xe4\x83\xa9\x4f\xeb\xa6\xdc\x51\x6d\x6c\xba\x58\x70\x41\xac\xad\x4f\xe5\x20\x2f\x3a\xe8\x75\x67\x9c\xf2\x36\x1d\xd7\x89\x56\xf4\xd0\xa5\x4f\x63\x62\x11\xa5\xe2\x6f\xa1\x17\x51\xbb\x80\x64\xdc\x19\x09\xdc\x5a\x31\x03\x49\xca\x01\x18\x81\x2a\x6e\xc4\x4e\x35\x63\x97\x2a\x70\xc4\x0d\x4e\xf4\x27\xe8\x44\x1f\x7c\xcd\xcf\xc5\xd7\x3c\x84\xf0\x8f\x1b\x30\x23\x9d\x31\xfc\x28\x50\x04\xc0\x4e\x36\x98\x7f\x2a\x16\xfc\x56\xaa\xc2\x2b\xcb\xd1\xe0\xbb\x08\x71\x8f\xef\x04\x8f\x69\xfc\x03\xb8\xc1\xa3\x0f\xbc\xeb\xe3\x12\xdf\xd0\x63\x13\x12\x0d\xf1\x0f\xcb\x5f\xea\x40\x33\xaa\x82\x3f\xef\x09\x34\x63\x47\x0d\x84\xc5\xa9\x2a\x17\xd6\x6b\x0a\x80\x4b\x64\xd3\x82\xaa\xe5\x52\xb3\xa9\x28\xf9\x29\x15\x4d\xcc\xd9\xab\xf1\x1f\x7b\x60\x23\x99\xd1\x3a\x48\xeb\x7b\x92\x7a\x53\x28\x4c\x42\x75\xb9\x60\x16\xe6\xda\xa9\xaa\x9c\x2b\xa0\xae\x38\xe1\x31\x7b\xc7\x93\x05\x33\x52\x63\x2c\xf5\x4a\x30\x96\x4d\xc1\x59\x5d\x69\xac\x84\x95\xa9\xb9\x4c\x78\xc6\x7e\xbd\x6a\x29\xa2\x80\x45\x10\x54\xc1\x96\x52\x9b\xf6\xa3\xc0\x1b\x15\xc2\x88\xe3\x5c\x5e\xd8\x0d\x23\x67\x33\xd4\x29\xc0\x1d\x37\x0d\xda\xaa\x34\x10\xbd\x87\xcd\x74\x0a\x52\x54\x96\xc4\xac\xc2\x79\xc7\xec\xb7\x29\x32\xd5\xcb\x88\x88\xdb\x5f\x86\x87\x66\xa7\x17\x0e\x06\x92\x24\x09\xf8\x2d\xa5\x1d\x0e\xa3\x9b\x47\x77\x0b\x3c\x1b\x3d\x25\xf3\x76\x9b\x8c\xda\xfd\x6e\xb4\x5f\x0b\xf7\x12\x10\xce\xcc\x4a\xa4\x0e\x0d\x89\x51\x10\x5c\x78\x63\x30\xb8\x77\xe3\x95\x61\xe6\x4a\x93\x1d\x68\xef\xcb\x13\x4d\x7c\xcb\x1d\x0a\xda\xdd\xef\x2a\xdd\xf7\x16\xf9\x87\x25\xb0\x96\xe7\xa3\x5c\x24\x51\x83\xfd\xed\x75\x91\x1e\x40\x17\xe8\x17\xda\xb4\xa9\xcb\x9e\x84\xfc\x7e\x88\x61\xdd\x84\xdc\x88\x95\x3d\xac\x15\xa6\x59\xcf\xe7\xe8\xf2\x9a\xc1\xda\xee\x63\xd4\x6d\xc9\x59\x9e\x24\xd6\x61\xf7\x14\x1f\xa5\x2b\x02\xb2\xf9\x3d\x62\x93\xa7\xf3\x14\x41\x35\x78\xca\x8f\x71\xb4\x1f\xd3\xc7\x5b\x5a\xbf\x47\x58\x09\x18\x2e\x91\x34\x57\x8a\xec\xde\x5b\xef\xd2\x20\x16\x7c\xdd\x62\xc1\x03\x50\xf3\x8e\x04\x88\x46\xdb\x18\x1d\x35\x36\xfe\xd8\x12\x19\x83\x25\xe7\x29\x5b\x72\x76\x4a\x87\xf0\x47\x6d\x37\xba\x7e\xc6\x0f\xf5\x42\x86\xcc\x88\xc1\x5a\x75\xcf\xdc\xd7\x21\x2b\xe2\x5e\x06\xa1\x87\xca\x8d\x68\x4a\x52\x3d\xf9\x8f\x69\x1b\xeb\x0f\x02\x23\x4f\xd0\xf9\xe3\x74\x07\x75\x06\xe2\x3c\xfb\xd5\xf0\xff\x44\x14\x58\x46\x01\x24\x1c\x1f\x74\x83\x65\x5c\xd0\xab\x88\x4a\x46\x37\xdb\x92\xab\x3a\x70\x72\xaf\xeb\xbd\x01\x7e\x79\xdb\x8d\xf6\x00\xcc\xc8\xf4\x56\xc4\x61\xf3\x58\x6b\xa2\x66\x2d\x12\x14\x20\x2e\x19\xe9\x28\xa7\x02\x8f\x64\xb7\x44\x30\x33\x5a\x3c\xc6\x00\x6d\x88\x37\x73\x61\xa3\x56\x97\x3a\xe4\xab\xe6\x53\x91\xb9\x71\xb7\x3e\x6d\x68\xa4\xd9\x07\x5f\x06\x13\x45\x54\x0a\x57\x3b\xd5\x89\x5a\x09\x8a\x11\xd7\x51\x4a\x2e\x46\x76\x6b\xa6\x1d\x75\x80\x38\x72\x0b\xe6\xce\xb4\x58\xf2\xbc\x94\x89\xfe\x73\x50\xfb\x0e\x6a\x00\x50\x49\x48\x59\x52\xe3\x7a\xbd\x51\x88\xf8\xbf\x00\xb7\x95\x5d\x04\x2a\xab\x5a\xb9\x10\x41\x94\x26\x9b\xf7\x17\x42\x84\xef\x16\x2a\x13\x6e\x70\xd3\xf0\xd2\x69\xb6\x66\x71\xd1\xc0\x34\x92\xdf\x00\x27\xde\x4f\xd7\xfe\x67\xaf\xf1\xfe\x6a\x8e\x18\xca\x31\xd4\x16\x00\xdf\xd8\x75\xb8\x4d\xfa\x4b\xfa\x45\xaf\x85\x47\x84\xab\x1d\x2a\xa9\x49\xb4\x6a\xb3\xe2\x07\xbd\x13\x46\xdd\xb2\xb7\xa1\xb1\x77\x4f\xfd\x4e\xf4\xfa\x06\x52\x9e\x63\xcd\xd4\x5d\xee\x47\x3e\x7c\x70\x4a\x53\x3d\xea\xcb\x15\x8c\xf2\x16\x71\x05\xf3\x43\x83\x2b\xa8\xbc\x9f\x29\xfe\x7e\xd7\xb9\x2a\x65\x36\x96\x79\xa9\xcb\x62\x7c\x91\x97\xbf\x16\xd7\x28\x2e\x6d\xbf\xcb\x36\xbd\x0a\x77\xdc\x06\xa6\xaa\x52\x25\x2a\xa3\xeb\x6b\x48\xb5\xab\x9c\xcc\x38\xcb\xab\xa5\x28\x40\x43\x57\x08\x93\x9d\xba\x31\xcc\x0e\xa4\x2d\x2c\xc1\xc8\x95\x04\x52\x91\x92\xc6\x5e\x57\xd6\x91\xc6\x81\x82\x83\xd1\xf3\x7a\xd3\xfb\xa7\xd9\x75\x85\x0b\x9a\xa5\x51\x53\xf6\xe2\xe3\x9b\xcb\x11\xfb\xed\xed\x25\x44\x5c\x5e\xbf\xf9\x78\x79\x62\xcb\x31\x35\xec\x73\x30\xfd\x5a\xdc\x76\xb0\x9a\x34\x88\xc8\xf9\xf8\xe6\xf2\x0b\x46\x46\x74\x44\xec\x37\xda\x7a\x98\x90\x20\xa9\xcc\xbb\x16\x6b\x06\xcd\xee\x2b\x2b\xea\x18\xf1\x6d\xb3\xb0\x96\x24\x41\xa9\x6e\x88\x0d\xaf\xe0\x26\xad\x56\x99\xf4\x06\x56\x47\x46\x80\xb0\xb1\x5f\xeb\x2e\x84\xc0\x24\x8b\x86\x15\x2a\xe5\x98\xab\x68\xe2\xd2\x51\x24\x97\xbd\xaa\x52\xf6\x02\xcc\x39\x14\x66\x6e\x25\x1a\x47\x98\xac\xf1\xc6\x1b\x6b\x4e\x46\xec\xd7\xab\x5e\x06\x9c\x60\x61\x8c\x27\x85\xd2\x78\xa5\x49\xe6\x69\xb5\x52\x18\x7a\x0b\x19\x90\x9e\xe2\x85\x25\x2f\xdb\x9f\x10\x1a\xbe\xbc\xd5\x29\x1e\x19\xd2\x2d\xe9\xcb\xf5\x8d\x7b\x61\xa1\x5d\xcd\xce\xa8\x4c\x60\x79\x1e\x91\x6b\x8c\x4e\xe6\xa5\xb7\xde\x85\x2c\xc6\xe8\x2f\x5a\x51\x52\xef\xda\xde\xfb\x93\x3a\xf4\xc8\x66\xb7\x23\x7b\x20\xf5\xfc\xdd\xce\xf1\xc9\xed\xc6\x88\x46\x8d\x83\x6d\xf7\xd7\x86\xd7\xf6\xbf\xc0\x1f\x9b\xf7\x16\xc0\x4d\xcc\x75\xfc\x42\x17\xd8\xe3\x00\xd3\xb0\xc7\x9a\x65\xca\x50\xf2\x5c\xa5\xa2\xf7\x95\x0f\xf7\xe2\x0b\xde\x79\x07\xdd\x82\xdc\x96\xe7\xeb\x07\xba\xf2\x0f\x7e\xa3\xf7\x08\xb9\x7f\x92\xa2\xf1\x75\x20\xdd\xc1\xe6\x06\x55\x0f\x1b\xc7\x47\xa6\x2c\x7c\x44\x9a\x52\x7e\xcc\xda\x9a\xcf\xcd\x3c\x21\xff\xd6\xcc\x41\xc7\xbe\x06\x00\x7e\xf2\xc9\x22\xbf\xd8\xb8\x7e\x1b\x03\xb8\xb2\xef\xca\x88\x32\xd8\xcb\x47\xea\x93\xfb\x0f\x1f\xed\x05\xdd\xb4\x84\xdb\xd4\xdb\x78\x26\x33\x55\x30\x28\x5b\x12\x39\xc2\x10\x94\xe8\x56\x64\xeb\x3a\x75\xfc\xf0\xeb\x47\x1f\x2b\x0a\xde\xbe\xbe\x5a\x00\xe4\xd7\xe0\x03\x68\x7b\x34\x56\x03\x70\xee\x94\xbc\x4d\x3e\x8e\xee\x86\xd9\xf5\x8f\xeb\x55\x67\x5e\x8b\x25\x79\xf0\xbc\xc1\x28\xe7\x9f\x4c\x7c\x84\x88\xf9\x80\xd6\x43\xac\xc2\x83\x6b\xb5\x45\x78\xe8\x5e\x63\xdd\xfd\x77\xee\xbf\x21\x79\xdc\xc6\x20\xdb\x9f\x37\x48\x8d\x81\x10\x26\x4b\xcc\xba\xf0\x49\x30\x41\x8e\x3c\xa4\x1a\x62\x2e\xd5\xcc\x67\x82\x14\xec\x5d\x70\x7a\x7f\xf6\x17\x01\x16\x64\xcb\x5c\xf2\xdc\x36\xd3\x04\xb0\x04\xa6\x19\xad\xab\x25\xdd\xb8\xd9\xcc\x5c\x99\x77\x14\x35\x0d\xd9\x56\xb0\xff\x34\xda\x8b\xbb\x85\x40\x4b\x47\x01\x93\x86\x0c\x91\x60\x74\x3b\x1f\x1a\xfe\x64\xc3\xf8\x61\x96\xd0\x5a\x55\xec\x8e\x53\xe1\xd0\x42\x96\x02\x0a\x1e\x22\x12\x18\x38\x97\xf0\x3c\x09\xcf\x0c\xb3\x6f\x1d\x20\x82\x4d\x5d\x09\xce\x9c\xfd\x3d\x38\x02\xf6\x8f\x31\x7b\x2f\x3f\x89\x3b\x48\x30\x97\xad\x5f\xb3\x4c\x06\xb3\x20\xe9\x14\x68\xe3\x72\x65\xc5\x1e\xcf\xdc\x82\x99\xd8\xcf\xf3\x68\x02\x68\xe4\x46\xef\x3a\xc6\xce\x87\x33\x7a\xa1\xa5\x39\x3c\x5d\x99\xb7\x65\xbf\x7d\xe7\x4a\x40\xd9\x1e\x2d\x47\x95\xa7\xd4\xce\xb3\x43\x7b\x43\x4a\xc5\xfe\xc7\x4c\xe8\xef\xe1\x5d\x64\xff\x38\x90\x0c\xf3\x48\x65\x9d\x42\xa2\xde\x65\xb6\xed\xa7\x45\xb4\x24\x40\x6f\x29\xca\xde\x68\x6c\xe5\x07\x9b\xfb\x0d\xda\xdb\x54\x20\x68\x86\xcd\x8f\x3e\x7c\x0a\x7a\x18\xbe\x1f\xea\xac\xd7\x3e\x1f\xbd\x3f\x54\xff\x07\x50\x31\x27\x47\xfb\x54\xfb\x87\xae\x5d\x13\x77\x09\xe0\x30\x75\xa7\x31\x87\xd9\xe1\x88\x25\xf1\xc7\x97\x27\xf7\x5b\x09\x5f\x8a\xc6\x3a\x30\x47\xd2\x4c\x44\xe6\xe5\x0f\xdf\xb7\x2f\x52\xe6\xa5\x98\x87\xc1\x04\x87\x51\x52\xb1\xb6\xf7\xb7\x5e\x4b\x1a\x77\x61\x28\x28\x3d\x14\x94\x1e\x0a\x4a\x0f\x05\xa5\x87\x82\xd2\x4f\xb4\xa0\x74\x94\x60\xd9\xbe\x1d\x4f\xb9\xe8\x74\x83\xd7\x0e\x95\xa7\x87\xca\xd3\x7b\x4b\x2b\x7b\x96\x9f\xde\x5d\xa3\x39\x5c\x41\xe9\x48\xcc\x1a\xca\xd5\x0e\xe5\x6a\xbf\xca\xb8\xc8\x21\x66\xf0\xb9\xc4\x0c\x0e\x19\xae\x11\x45\x1e\x6a\xd6\x76\xec\xcf\x50\xb8\xf6\x8b\x15\xae\x85\x83\xd8\x37\x92\xb4\xd5\xbc\x33\x94\xb0\x7d\xe4\x12\xb6\xb4\x47\xf5\xfa\xb5\x5b\xca\xd7\x6e\xad\x43\xdb\x07\x55\x26\x70\x84\xc4\x26\xe9\x16\x68\xd0\xdd\x39\x52\xb0\x80\xc7\x0f\x06\x8b\xd7\xb6\xda\x0e\x7b\xfa\x30\x56\xe3\xa1\xca\xed\x50\xe5\x76\x50\x20\x06\x05\x62\x50\x20\x06\x05\x62\x28\x75\xfb\x74\x4a\xdd\x1e\x4e\x56\x1e\x8a\xde\x7e\x83\xec\xe9\x09\x17\xbd\x6d\x91\x3b\x77\x36\x7b\x0f\x8c\xf8\x19\x32\xe2\xa1\xf2\x6d\x1b\x29\x7e\x3c\x1e\x31\xd4\xc0\x1d\x6a\xe0\x0e\x35\x70\x9f\x69\x0d\xdc\xe8\xb9\x0f\x85\x70\x07\x09\xb0\x4b\x02\x7c\x70\xd1\x6f\x90\xfa\x06\xa9\x6f\xa8\x86\xfb\x64\xab\xe1\x1e\x4e\xb8\x1c\xea\xe2\x0e\x75\x71\x87\xba\xb8\x43\x5d\xdc\xa1\x2e\xee\x50\x17\x77\xa8\x8b\xbb\x73\x58\xf9\x43\x2a\x82\x5f\xb2\x04\xe9\x97\x49\xfa\x3a\xaf\x57\xf4\x63\x09\x5f\x41\x00\xb0\x9a\x91\xa4\x10\xd1\xdc\x2d\x65\x47\xcf\x43\x84\x06\x35\x63\xc7\x34\x22\x06\xac\x83\xec\x72\xdc\x56\x70\x34\x36\xa2\x34\xeb\x1a\x95\x5b\xea\x4a\xa9\xc2\xce\xdf\xcc\x12\x70\x7b\x21\xd7\xc2\xe5\xff\xce\x33\x35\xe5\x2e\x63\x7b\xa8\x2e\x3a\x54\x17\x1d\xaa\x8b\x7e\xd3\xd5\x45\x9b\xaa\xd8\x7d\xec\x2e\x43\xd1\xd0\xaf\xa4\x68\x68\x74\xec\x3b\x54\x0e\x7d\x50\x69\x63\x28\x08\xfa\xe5\x0a\x82\x36\x2e\xc4\x50\x15\xf4\x9b\xad\x0a\xda\x4a\xda\x87\x3a\x9f\xcf\xb2\xce\xa7\x4a\x81\x76\xfd\x7a\x2b\x0a\x33\x8b\x2d\xcf\xde\x36\x61\xba\x2c\x2a\xb0\x87\x37\xec\xb1\x56\x22\x54\xb6\x69\xfd\xe1\x17\x55\x8e\x0e\x53\xc0\x97\xeb\x03\xc2\x9a\xfe\x2c\x3f\x8b\x86\x16\xe8\x1d\xae\x97\xed\x3d\xd9\x5e\x6e\x87\xb1\xd3\x1f\xfe\x57\xc5\xf3\x52\x96\x5b\x2a\x0f\xd4\xfd\xc6\x34\xd3\xfa\x9e\xcc\xe8\xc7\x3d\x77\x66\xe3\x59\x1e\xe4\xd4\xaf\xaa\xbc\x94\x4b\xd1\x15\xdd\x1f\x36\x73\xea\x18\xf7\x11\x1c\xc4\xbc\x8c\x46\x87\x2d\xad\xf8\xe2\x69\x25\xa9\x7c\x48\x6e\xa3\xf1\xa4\x17\xa2\x1d\xe6\x46\xa0\xeb\xc5\xe3\x06\x8d\x8b\x2a\x07\xd1\xd9\x35\xd2\xf8\xa0\x01\xb8\x30\xfc\x82\xb0\x96\xd1\x1c\x81\x7b\xa2\x14\x61\x30\x4e\xa8\xc2\x03\x39\x16\xea\x56\x82\x53\xb9\x40\x0f\x6f\x90\xa7\x40\x4b\xb9\x54\xa9\x4f\x51\xf8\xaf\x6a\x2a\x32\x01\xef\x1d\xd3\xdf\xb1\x00\x0f\xbc\x60\xa1\x55\xe6\xec\x4a\xe1\x8c\x80\x36\xba\x81\xad\x69\xd6\xde\x80\xd2\xa2\x2f\x7a\x2d\x28\x15\x25\x97\x99\x1e\x31\x2d\x84\xf3\x62\xc5\x3a\x6c\xaa\x12\x7d\x96\xa8\x3c\x11\xab\x12\xfe\x83\x36\xe5\x8c\xb6\x0e\xb3\x24\xce\x06\xa7\xfc\x53\x76\xca\x63\xe0\x51\x57\x68\xd3\x5f\xb1\x55\x84\x01\x27\xd0\xe9\x95\xad\xc1\x3a\x45\xaf\x85\x2a\x26\x05\xf1\x28\x0e\x36\xf0\xcd\xd5\x85\x37\x9d\xe0\xdf\x40\x17\xaa\x34\x14\x24\xa3\x08\x28\xc0\x33\xb4\xe7\xe7\x22\xa1\xcc\xef\x54\x68\x8a\x04\x27\xf3\xbe\x2c\x7c\xb1\x8b\xb3\x52\xa9\x60\x93\xea\xe5\xcb\xef\xff\x00\x5f\xab\x29\x7d\xec\x02\xad\xbb\x16\x73\x8f\xb2\xfd\xe9\xcb\x05\x09\x73\xb7\x5c\x66\x9c\x2a\x5a\x21\x32\x0c\xe2\xa2\x9a\x95\xb9\x96\x56\xb2\x30\xaf\x0a\xf9\x7d\x21\x98\xf8\x67\x25\x6f\x79\x06\xa8\x2f\x61\xdf\x5a\xe0\x15\xb7\xc3\xb0\x84\x43\xb8\xd6\xe4\xa8\xa8\xf2\x64\x72\xc4\x96\x72\xbe\xf0\xea\xa3\xdb\x38\xf3\x57\xf6\xeb\x9b\x0b\xb7\xc9\x2f\xb0\x04\x81\xe1\xef\xb7\x82\xbd\x97\x79\xf5\x39\xa0\x49\x27\x0d\xc8\x0b\x43\xb7\x6c\xb8\x4f\x83\x6e\x99\xcd\xb5\xc7\x6b\xad\x47\x99\xba\x13\x05\xc2\x5f\x9a\x3d\x54\xc5\xd2\x6e\xf1\xdb\x0f\xd7\xec\x3d\xfa\x25\xae\x7e\x7e\xc3\x5e\xbd\xfa\xfe\x87\x13\x1b\x32\x64\xce\x95\x90\x11\xef\x19\x8a\x35\xc4\x52\x3c\x97\x58\x8a\x9e\xa9\x2c\x5f\x34\x5d\x45\x35\x05\xd1\x5e\xcb\x6e\x4a\xb2\xdb\x96\xe8\x64\xd9\xfb\x49\xb0\x51\x7e\x70\xc8\xe1\xc7\xed\xbc\x7b\x92\xf7\xe2\xde\x86\xd5\xa5\x95\xd1\x03\x4f\xc5\xad\x84\xc0\xba\xb3\x95\x4a\x4f\xed\xa4\xce\x26\x79\x2d\xd2\x32\x07\xc4\x4c\xa6\x4b\x5e\xc0\x63\xbb\x7d\x35\x7e\xf5\x47\xfb\xf8\xc1\x92\xb6\x50\xb9\x2a\xa8\x56\x23\xbd\x2f\xa0\x69\x22\xc7\x22\x94\x28\xd8\xb8\x7d\x99\x09\x0e\x6e\xe6\x0d\xba\xa0\x9b\xe0\xde\xc7\x74\xed\x87\xd8\x1a\xd9\xe3\x9a\xb1\x85\xca\x52\xc2\xb9\xf4\x3f\x26\x2a\xd7\x65\xc1\x21\x59\xbb\x06\x28\x0d\xcc\xcb\x1e\x17\xe9\x74\x52\xc7\xc2\x27\x30\x2e\x1c\x0d\xa9\xb3\x99\x1e\xed\x8c\x05\xa8\x92\x98\xf1\x1c\x7c\x54\x6a\x96\xcb\x6c\xd4\x32\x5e\xc8\xd1\x00\x91\xdc\x0b\xc2\x46\xdc\xcc\x10\xd7\x7b\x7b\xf8\x66\x7b\xb4\x90\x15\x0d\x1e\x33\x5e\xc8\x1c\xd5\xb6\x48\xa1\x48\x7d\xd8\x1c\x2a\xb4\x4b\x94\x50\x8b\x62\xd2\x11\x8d\x5a\x6f\x1a\x03\x67\x45\xa7\x33\xd4\x24\xfc\x1a\x84\xe0\x27\x55\x93\xb0\x4d\x51\xbe\x8f\x15\x6d\x10\xa6\x9e\x8b\x30\x35\x14\x23\x7c\x7c\x26\x73\xc0\x2a\x84\x4d\x31\x64\x0b\xe2\xb6\x67\xfd\xb1\xce\xbd\x41\x10\x99\x81\x9b\xd7\x08\x12\xc4\xfe\x51\x60\x8c\x04\xc4\x1e\x68\xdc\x2a\xdd\x58\x6e\xaf\x9f\xfd\xb3\xaf\xf5\xbf\xb6\xdc\xf0\xc3\x70\x71\xb5\x85\x7a\x45\x18\x44\xd2\x4b\x6d\x41\x34\x95\xb7\x49\x4d\x0d\xd9\x68\x8c\xe5\xc5\x50\x5b\x6e\x4a\x4e\x2e\xa8\x73\x5a\x93\xc8\x38\x5a\x12\x82\x42\xef\xd0\x59\x47\x45\xdd\xa3\xa1\xa2\xf9\x4b\xcd\x96\xa2\x98\xfb\xc0\x3e\x2c\xb2\x02\x51\x48\xa0\xb7\x07\x8d\xc7\xec\x3c\x5f\x47\x8e\x80\x2c\x63\x18\x04\x4a\x46\x39\x92\xea\x90\xb1\xa2\x49\x90\xa7\x50\xf8\x7a\x63\xd8\x41\xc3\x68\x1b\xba\xcb\x55\x46\xd5\xd9\xbb\x18\x5e\xd0\x12\x2d\x23\xab\x95\xc8\x53\x91\xb2\x17\x80\x43\x0e\xde\xe9\xb4\x5a\x65\xe0\xd4\xd2\x27\x66\x9e\x7d\xe4\xdf\xb4\x2a\x30\x7f\x89\xd6\x30\x62\x02\x2a\x1f\x40\xe9\x0c\x56\xe5\x52\x39\x93\x24\x55\xe5\xa0\xa3\xc6\xe9\xf8\xf4\x36\xb3\x37\x46\xec\xa8\x9b\x3a\x0f\xc4\x87\x5d\x4e\x97\xdb\x86\xbe\x5c\x38\xfa\x53\x44\xae\xcc\xcd\x3e\x75\x8d\x4b\xb5\x94\xc9\xe1\x4c\xeb\xe8\x4e\x1d\xbc\x2a\xdf\xa0\x57\x05\x8f\xfe\x5b\x72\xad\xbc\x48\x6c\x04\xcf\xc9\xf3\x73\xb3\x04\x72\x99\xc8\x17\x3c\x4f\xd0\xb4\x7a\xf6\x49\xac\x34\x08\x63\xe6\xd8\x63\x2f\xcb\x78\xd9\xa3\x7e\xf0\xa0\x62\x0e\x7e\x96\xc1\xcf\x32\xf8\x59\x5c\x9b\xc1\x34\xf0\x5c\x4c\x03\xdf\x82\x9f\xa5\x26\xe0\x3e\x41\x67\xcb\x8e\x1c\xfc\xfb\x97\xaf\xfe\xf4\xf2\xfb\xef\xff\x70\x1a\x7a\x5a\xc6\xcb\xb4\x96\x8f\xc1\xb3\xd5\xc2\x96\x26\xe3\x40\x13\x03\x24\xd5\xdb\x57\xe3\x57\xff\x3e\x7a\xca\x7e\x17\x3c\xb6\xc1\xf9\x42\x7b\xfb\xfc\x9d\x2f\x3b\xe7\x69\x6f\x52\x62\x06\x37\xcc\xb7\x25\x23\x3f\x41\x37\x4c\x8b\x66\x3d\xf8\x62\x06\x81\x6b\xf0\xc5\xb0\xa7\xe7\x8b\xb9\x17\xdf\x19\xbc\x32\x83\x57\x66\xf0\xca\x0c\x5e\x99\x83\x79\x65\xb0\x7c\xb5\xa3\x2f\xe7\x08\xe2\xf2\xe6\xfa\xe2\x6d\x21\x6f\x23\x43\x60\x43\xb2\xac\x35\x0d\x95\x58\x97\x94\x2a\xf3\x4c\xe6\x82\xbd\xb9\xbe\x60\xd4\x0a\x4b\x50\xba\x5a\xdc\x74\x43\x2b\xfd\x10\x75\x98\x0b\x31\x97\xba\x84\xb2\x05\x61\xa6\x95\x99\x4d\x8a\xcb\xdb\x33\x87\xa8\x9d\x2d\xc1\xec\xba\xb8\xd2\x6e\x07\xf1\x73\x26\x3e\xff\xae\xb2\x6a\xb9\x0d\x08\xaa\xd1\xb6\xf5\x28\xcc\x9f\x6f\xf1\xcf\xf7\x3a\x83\xb4\x7e\x31\xda\xa6\x84\x8d\xda\xd2\xdc\x82\x69\x60\xa3\x03\x17\xad\xa4\xe9\x1d\xf6\x18\xfe\xaa\x74\xd9\x51\x1b\xba\xd6\x32\xd2\xb6\x20\xf1\x8d\x16\x9d\xa8\x1c\x79\x21\x31\x20\x6b\x9d\x45\xb3\x07\x79\x85\xa8\xa8\x3c\x14\x80\x35\x64\xb1\x54\xe6\x74\xc6\xec\xc2\x01\x5f\x52\xe5\x93\xa0\xc4\x2d\x1e\x22\x39\x97\x7a\xd6\x7c\xc4\x3a\xa5\x1d\x67\xe9\x1b\xda\xf3\x8c\x3e\x6b\xed\xd2\xe1\x22\x7d\x8a\x28\xcc\xd9\xa1\x76\x5a\x6e\x7b\xf3\xdd\xcd\x98\x7d\x2c\xb8\x44\x21\x25\xe3\x80\x81\x62\x18\x45\x59\xc8\xe5\x52\xa4\x88\x20\x71\xcb\x33\x99\xf2\x32\xaa\x98\x4d\x9f\x25\xee\x08\x1f\x85\x02\xb7\x93\x7c\x92\xbf\x43\xa3\xba\x7e\xcd\x6e\xce\x66\x4a\xdd\x50\xb5\x7d\xcc\x86\xc4\x9f\x46\xf8\x7f\xcf\x6e\x80\xfc\xdf\xd8\x3a\xb3\x37\x71\x0f\x87\x67\x85\x3f\xa7\x37\x4c\x15\xec\xe6\x4c\x94\x09\xb4\xda\x03\x46\x41\xf0\xf4\xd7\x3c\x5b\x77\x6c\x35\xac\x3a\x2a\x90\x02\xd7\x03\xa7\x12\x6c\x70\x4b\x29\x71\x5b\x72\xd6\xc8\x24\x72\x06\x46\x1d\x7b\x18\xaa\xca\x4b\x5b\x66\x16\xa7\xb1\xe1\xcd\x4d\x95\xca\x04\xcf\x0f\xcf\x56\xde\x51\xb0\xf6\x96\xf7\x63\x9b\x30\x08\xec\xd6\xd6\xb2\x09\x15\xaf\x4b\x14\x92\x8c\xca\x07\xaa\x63\xa9\x20\x53\x99\xcb\x1c\x5f\x8a\x91\x6f\xa1\xa8\x12\x9f\x89\x72\x1d\xca\xb6\x61\x81\x7a\x5d\x4d\xbd\x61\x75\x66\xc4\xbb\x31\x0b\x6a\x2f\x9b\x41\x41\x76\xd2\x15\xa0\xd5\x30\x1b\x61\x6e\x7a\x27\x85\xb0\xe2\xc3\xe5\xaf\xd7\x1f\x09\xf2\x60\x3c\x1e\x9f\x99\xf7\x69\x0b\xc7\x2a\xe4\x33\x54\x4d\xd6\xf6\x1f\xec\x39\x4f\xdb\x9e\x93\x8a\x4c\x94\xe2\xd7\x55\xab\x5c\x7b\x0f\xdd\xfb\x6d\x34\xee\x36\x0d\x26\x6a\x69\x51\x63\x08\x25\x3c\x1d\x4c\x34\xcf\xdb\x44\xd3\xd3\x27\xe6\x9b\xd5\xb0\x25\x40\xcd\x23\x81\x6e\x2a\xa0\x8a\xae\x21\x3c\x71\x05\xb9\x2e\x3a\x7e\x40\x5b\x09\x92\xfe\x76\x33\x89\xe3\x03\x87\x33\x8f\xd4\x38\xcd\xcf\xd7\x7f\x31\x13\xb9\x2e\x8d\xba\x37\x5f\x37\x5f\x75\x7d\x5f\xdb\x3b\x44\xc4\x55\xd3\xdf\xa0\x10\x3b\x10\x3b\x45\xad\x1c\xc8\x11\xb0\x87\xa8\x71\x9f\x22\x88\x3c\x9f\x77\x82\x2b\x61\x23\x94\x8d\x16\xc2\x89\xec\xf4\xb3\x9a\xb1\x99\x66\xb0\xf7\x7a\xcc\xd8\xc5\x0c\x00\xf3\x51\x88\xc9\xe4\x27\x08\xa5\x98\x29\xf3\xae\x9d\x1e\x60\xdb\x23\x66\xa0\x91\xc8\x42\x3c\x45\x18\xd7\x03\x3d\x40\x48\x03\x24\x4f\xc1\xba\xa1\x66\xf4\x95\xad\x55\x6f\xc4\xd3\x5f\x2a\x5d\x5e\x55\xf9\xf9\xa1\x34\xe7\xda\x71\x5e\xbc\xbd\x32\x13\xba\x97\x35\xbb\x88\x61\x74\x5b\x37\x19\x00\x12\xeb\xa7\xed\xc4\xf3\x54\x26\x80\x9e\x73\x67\x7e\xa1\x0b\xe3\xc2\xc2\x2c\xae\x2a\x41\xba\xbc\x51\x79\x29\x3e\x97\x0f\x0d\x4f\x51\xdb\x27\x50\x3b\x54\x51\xe2\x6e\x6d\xbe\xed\x51\xbb\x20\xac\x0e\x8f\xdd\x22\x78\x21\xc0\xd2\xee\xea\x49\xa4\x9f\x4c\x95\xbd\x43\xe1\xf5\xd9\x59\x4d\x59\xf2\x2e\xfd\x64\xc9\x9d\x62\x62\x3e\x60\x0b\x41\x9a\x15\x8d\x10\xe5\x46\xcb\xdb\x7a\xdc\x09\x82\xa7\x99\xee\x32\x2f\x7f\xf8\xbe\xfd\xb4\x8c\x9c\x33\xf7\xca\x64\x8d\x15\xc8\x2e\x59\x6d\x29\x73\x7f\xa9\x02\xe0\xdf\x87\x99\x5a\x4f\xfd\xd8\x4c\x7b\x14\x6f\xef\x81\x74\x65\xfb\x56\xb7\xe0\x23\x61\x0b\x5f\x00\x85\xb3\xa5\xcc\xcf\xcc\x01\xa2\x60\x1a\x51\x37\xc0\xd4\x7f\xdb\x47\x7a\x7e\x8c\x3b\xf2\x87\x1f\x9f\xec\x1d\xe9\x3f\xb5\x2f\x7e\x47\x2e\x55\xfa\x56\xea\xa2\x82\xf5\xff\x54\xa5\x73\xb1\xcd\x75\xde\xd2\x9a\x2a\xf7\x2a\xa7\x08\x22\x25\x81\x3d\x33\x87\x9c\xba\xf6\x48\xbf\x08\x62\x11\x34\x3b\xb2\xcf\xc7\x45\x39\x0c\x01\x1b\xf4\xb3\xa7\xac\x9f\x0d\xaa\xce\x33\x54\x75\x5a\x3f\xb9\x57\x45\xce\x6e\x0a\xd3\xab\x28\x27\xc2\xde\xd1\x1b\x2c\x83\xea\x9c\x53\xb1\xe0\xb7\x52\x15\xf6\xf7\x96\x0f\x6c\x0a\x4a\xdb\xaf\x06\x7f\x8f\x05\x75\x63\x28\xfe\x02\x48\xac\x22\x41\xf8\x50\x35\x85\x10\xbb\xb4\x06\x9c\xd8\xb1\x94\x27\xa2\x34\xb6\xf1\x8c\x07\xd3\x1f\x5b\x3e\xd6\x11\xdf\xb5\xa1\x47\x5b\x01\xa8\x96\xa6\x83\x71\xf0\x69\x33\x9f\xd6\x60\xaf\x03\x29\xb7\x6d\x17\xfb\x3e\x8a\xee\xc0\x28\x9f\x0b\xa3\x74\x61\x5b\x3b\x8b\xee\x8f\x1e\x1a\xb5\x23\xe5\x3e\x70\x70\x54\x4f\xe6\xbf\x13\xf5\xb6\x25\xba\xad\xa1\x75\xe5\x88\x63\x3b\xc3\xec\xa3\x9e\xfe\x96\xbb\x4c\xa2\xfb\x5d\x93\xaa\x94\xd9\x58\xe6\xa5\x2e\x8b\xf1\x45\x5e\xfe\x5a\x5c\xe3\xcd\xdc\x26\x0b\x9c\xc7\xbe\x2c\xab\x64\xcb\x19\xe3\x25\x5b\x1a\x41\x61\x52\x9b\xe3\xe4\x08\x0d\x3b\x18\xb5\x84\x66\x9f\xc9\x91\x8d\x61\x9a\x1c\x81\x39\xb2\xf2\xed\x19\x9f\x95\x02\x21\x7c\xed\x97\x46\x4c\x8e\xc5\x98\x89\x5b\x91\x43\xd8\xd1\x54\x23\xc0\xff\xcc\xb7\x12\x29\xe6\x1c\x45\xf9\x50\x2a\xc7\x3a\x46\xab\xc2\x74\x2d\x9d\x23\x33\x2f\x79\xb1\x76\xa3\x6b\x48\x1b\xc0\xd4\x28\x43\xb3\x5e\x86\x8e\xbe\x65\x55\x62\xa6\x25\xc4\x1a\x19\xed\xd9\x01\x0d\x83\x61\x73\x62\x14\xdc\x73\xbf\xd6\x0d\xe2\x5b\xd8\xe8\x89\x1d\x1a\x96\xcf\xa8\xaf\xa3\xe3\xcc\xc0\x94\xa7\x4b\x32\xe8\xed\x70\x76\x60\x77\xde\x72\x7e\xec\x1a\x8c\xcc\xf6\x0c\xc1\x04\xbd\xfb\x11\x4e\x8e\x5e\xbd\x7c\xf9\xff\xdf\x78\x1a\x7a\x43\x68\xe1\x7d\xa8\x2c\x9f\x8a\xcc\x85\x2c\x6e\x3b\x0c\xcc\x71\xfb\x67\x25\x8a\x35\x96\xa8\x80\x9d\xbe\x5b\x28\x2d\x82\xf5\x10\x98\x2a\x9f\xfb\x38\xb3\xc0\x1c\x31\xdd\x59\xbe\xbe\x07\xd1\xeb\x02\x8c\xdf\xd8\x27\x0c\x1d\x6a\x2f\x4f\xec\x55\x88\x76\x7a\xc8\x68\x20\x23\x14\x94\x05\x97\x19\xde\x9f\xc4\xbc\x49\x8f\x42\xcf\x99\x5e\xeb\x52\x2c\xfb\x54\x36\xc6\x1c\xea\xbf\x0a\x9e\x95\x8b\xae\x08\x0a\x8b\x10\x9f\x57\xcb\xa9\x00\x9d\x6d\x81\xfd\x62\x43\x0f\x3b\x8c\x0d\x98\x74\xc4\x7e\x53\x5b\xca\x5c\x2e\xab\xa5\x53\x2c\x1f\x69\x8a\x78\x3e\x22\xbd\x34\x83\x3f\x0e\xae\x81\x7f\x62\x1f\xe5\x72\x8b\xf3\xa6\xee\x06\x0f\xa7\xea\x81\xff\x9b\xd7\xb0\xe5\xf5\xb1\x3b\xae\xd9\xaa\x50\x89\xd0\xda\x3f\x3f\x28\xe8\x02\x42\xaa\x6f\x18\x86\x81\xd8\xd4\xdb\x69\x55\xb2\x05\xc7\x18\xa5\xb5\x30\x82\xa8\xc8\xbd\xd2\x4c\x83\xb5\x59\x23\xc3\xf2\xc5\xe7\xe0\x8a\xb5\x0e\x13\x0b\x99\xbf\xe4\x2b\x2f\x10\x43\xbe\xee\x9d\xad\xd5\x15\xcc\xce\xcf\x3c\xa4\xc3\x61\x6c\x4a\xb3\xbb\xf9\x1a\x44\x16\x8b\x1c\xe2\x52\xde\xfe\x14\x42\xe6\x73\xcd\x16\x1c\xb2\xff\x61\x31\x54\x83\x06\x2a\x74\x8b\x4c\xc0\xe8\x2f\x54\x41\xc4\x9f\xc3\xd0\xaa\x2a\xa9\x66\xdb\x27\xb1\xb6\x84\xdf\xcc\xbf\x25\x8c\x2f\x0c\xa0\x45\x1d\x82\x1a\xed\xb9\x44\x07\x42\xef\x66\x97\xca\x34\x3f\x2e\x99\x4a\x92\xaa\xc0\xba\x3e\x6e\xc5\xc0\xc3\xca\x85\x30\x3a\x81\x77\x51\x41\xb5\x32\x91\xfa\xdd\x86\x74\x06\x5e\x95\xca\x5c\x9e\x04\x24\x02\xb3\x4f\x5b\x8f\x91\x36\x44\xab\x25\x2e\x05\xe6\x05\xc9\xdb\x25\x84\x5b\xcd\x95\xd0\x4c\x2f\x95\xb2\xf1\xc9\x66\x7f\x7c\x5d\x71\xb1\x5c\x95\x6b\x57\xce\x00\x64\x2b\xda\x30\x1c\xec\x3d\x2f\xe6\x22\x78\xf9\xc2\xa8\x2b\xb6\xc0\x02\x6e\x36\x2a\x53\x29\x44\x46\x9b\x4d\x9b\x66\x62\x49\xd0\xfb\x66\xfd\x76\x7f\xea\x0e\xd7\x3e\xf1\xdb\x9e\x1b\x69\x0a\x57\xec\x0a\xa6\x75\x13\x85\x4f\xfb\xee\x41\x41\x77\x5f\x91\x92\x0a\x40\x1e\x9a\x82\x89\xcf\x58\x77\xb2\x8d\x80\x35\xc2\xce\x4b\x9e\x05\xdb\xbb\x42\x42\x52\xe5\x65\x10\x8a\xdf\xe0\xc9\x87\x9e\xb0\x25\x1c\x7f\x11\xb9\x8d\xfe\xde\x3e\xed\xc0\x58\xc7\xe6\xae\x93\x27\x40\xf0\x9c\x40\x33\x76\xc9\x08\xe6\xb5\x23\x27\x1e\xb3\xb7\x8d\x63\xc5\x20\x05\xf3\x42\x2c\xbb\x0e\x89\xa8\xd4\x18\x59\xe9\x82\x05\x9b\x13\xc6\x7a\x80\x60\xda\xb9\x7c\xfb\xd3\xb1\xd3\xfe\xfd\xec\x1e\xd5\x21\xd5\x72\x71\x47\x1b\x05\x84\xcd\xfc\x79\xd3\xa5\x3a\x9c\x73\xcb\x46\x01\x5c\xa2\x56\xbc\x55\x00\x8b\xdb\xb2\xb9\x11\x2c\xa9\xce\x0d\xc7\x42\x6a\x66\xfb\x97\xfc\x93\xa8\x55\xd5\xe3\x90\xf3\x10\x45\x1d\x30\x0a\x3b\x88\x9d\xf6\x7c\xb5\xca\xa4\x75\x7b\x59\x8a\xed\x60\x1f\x06\xcb\xe3\x93\xb6\x3c\x0e\xd6\xbc\xe7\x62\xcd\xeb\x19\xe1\xf7\xb4\x6a\xb5\x1f\xde\x2d\x17\xd3\xbb\x4e\xa7\x9c\xc6\xe2\xa9\x9e\x98\x50\xd4\x91\xc8\x21\xa0\xed\x29\x86\x37\x36\x19\xc0\x43\x5a\x3a\xe3\x4f\x75\x7b\xa9\x9a\xed\xe3\x04\xf5\x26\x4b\x1a\xf0\x08\xbe\x06\x46\xd1\x07\x8f\x40\x3e\x12\x1e\x41\xa7\x44\x34\xf8\xb7\x06\x8e\x38\xc0\x12\xb0\x2f\xc0\x8b\x1e\xdc\xf3\xd6\xc2\xdf\x77\xe0\x47\xd7\x9d\xec\xbe\x9b\x09\x19\xd5\xf0\xb2\x90\xb7\x32\x13\x73\xf1\x4e\x27\x3c\xeb\xa3\x7d\x6f\xea\xe6\xa1\x41\x35\xb8\x5d\x40\x83\x4a\x78\x64\x95\xc3\xcc\xbc\x95\xed\xcc\x84\xeb\xdd\x2c\x71\x9c\x86\xa5\x30\x8b\x6a\x13\x12\x5e\x33\x09\x6f\x54\x5b\x62\x90\x74\xdd\x59\x9a\xb9\xde\x9e\xe2\x27\x61\x1c\xcb\x09\x82\x24\xed\x94\x5a\x45\xc8\x09\xe2\xf3\x2a\x93\x89\x2c\xb3\xb5\xcd\x4d\x04\x4b\xd7\x54\xa4\x29\xe1\x14\x58\xfc\x40\xf0\xe7\x40\x41\x6c\x34\x84\x91\x65\x90\xac\x59\x56\x7d\xcd\xd7\xc1\xb7\xa2\x22\xd8\x33\x55\xd8\xd9\x88\xd5\x42\x2c\x45\xc1\x6d\x1a\x63\x94\xca\x07\x35\x5d\x00\x79\xac\x1d\x53\x8c\xaa\x0a\x87\xe6\x5f\x88\x5f\xd7\x36\xff\xfb\x02\x3e\x42\xd9\xd2\x04\x2d\xc6\xe6\xbc\xac\x1f\xca\x81\xf8\x60\x23\xad\xfe\x3e\x6c\xd0\xde\x01\xbe\x42\x33\x41\xd3\x66\xdf\x7a\xc3\xe3\x1e\xb1\x2c\x90\x84\x7f\x09\xe3\x66\xe9\xaa\x93\x0d\x21\x4d\xad\x20\xe5\x8d\x08\x2c\x1e\x35\x0f\xaa\x95\xdb\x4c\x36\x0e\xf7\x84\xd2\x84\xc1\x0c\x51\x95\x0b\x55\x1c\x83\x29\x2e\x29\x04\x3e\x97\xff\xad\x2a\xbc\x71\x86\x53\xa2\xe9\xd6\xcf\x0b\xcc\xd1\x90\x51\xd0\xb6\x16\xc4\xc9\x45\x92\xfc\xb6\x50\xab\xf0\x8f\x8f\x5e\x0e\x96\xd7\xb3\xf1\x7b\x9e\x4e\xd0\xa1\xed\x91\xfa\xbc\x79\x3d\x66\xec\x1d\x3c\x2f\x55\xb0\x5c\x66\x8d\xf7\x95\x65\x61\x6b\x7b\x0a\x90\xde\xcf\xf0\x11\xad\x78\xc1\x97\x86\xba\x99\x2f\x39\x08\x0d\x7c\x43\xce\x76\x5f\x69\x3e\x6f\x49\xdb\xd7\x91\x3b\x1a\x9b\x4e\x8e\xe8\x6f\x93\x23\x2a\x54\xff\x90\xcf\x28\x00\x45\x38\xc0\x41\xd9\x8c\xfd\x9e\xc7\xe4\x9a\xb7\x1d\x92\x4b\x47\xd7\x63\x3a\xa2\x96\xb3\xf1\x8d\xa2\xa3\x79\xc8\x1d\x73\xf8\x05\x07\xd8\xaf\xcb\x42\x25\xbf\xa8\x2a\x2f\x3f\x1a\xa1\xb2\x1f\xff\x89\xfb\xb4\xed\x9c\xbd\x50\x71\xcb\xf1\xd6\x8b\x0e\xd7\x15\x60\x68\x91\xb3\x46\x7d\xe3\x6b\xff\x11\x75\xc9\x00\x3a\x21\x6e\x6c\x59\xc0\x2c\xe3\x73\xcb\xe0\x30\xe3\xe9\x4b\xd1\x8f\xdf\x72\xcd\x67\xe2\x7a\xad\x93\x32\xeb\x79\x35\xa3\x2e\x31\x81\x0f\x58\xb8\xdd\xe9\x0a\x5a\x33\x8d\xcd\x63\xf1\x24\x87\xb2\xd0\xef\x78\xb2\x00\x0f\xd5\x1a\xc8\x84\x04\x7f\x02\x67\xab\x8c\xcb\x9c\xfa\x91\x4f\xd0\xf0\xd7\x14\xa8\xff\xe4\xe8\xbb\xc9\x91\xf9\x0f\x42\x53\xe7\x1a\x7c\x74\x12\xfc\xb9\x5a\xa6\x00\xc6\xc2\x21\xbd\x9f\x00\x0b\xfc\xd9\xd3\x54\xc6\xec\x1a\x73\x11\xbf\x63\x4b\xc1\x73\x20\x36\xb5\xd9\x22\xa6\x10\xf9\x9b\x1c\x06\xfa\x02\x15\x7d\x7f\xaf\xb8\xc5\x4e\x68\x2c\x37\xdc\x10\xd3\xe5\x56\xc9\x94\xd4\x7f\xc3\x8c\x62\x30\x09\x31\x9e\x8f\xd9\xe4\x68\xa6\xd4\x99\x59\x1c\x8c\xa8\xe9\x87\x29\x2f\x26\x47\x23\xf7\x8f\x7f\x99\x7f\x88\x32\x19\x07\x9d\xc6\xf5\x4e\xe3\xb0\xd3\x38\xe8\xf4\xd8\x57\x8d\x8e\xfc\x3c\xdd\x45\x98\x68\xef\x64\xdd\xbf\xf4\x57\x0b\xbf\xd4\x14\x2c\x9c\x6f\x02\x84\x82\xba\x38\xc1\xaa\x3c\x13\xda\x27\x36\x83\x11\xd0\x02\x7b\x23\x7a\x7e\xa1\x56\xf8\x77\x2f\x1c\x8c\x19\x4a\x0f\x7c\xdd\x21\x3c\x6c\x98\xfb\x56\xf9\x21\x16\x70\x70\xda\xe0\x7a\x36\x77\x50\x2e\xeb\xef\x0a\x05\xd2\x5c\x08\x44\x11\x81\x48\x80\xb8\xd0\x7e\x9b\x04\x63\xa6\xfc\xc5\x8e\x7f\x3f\xb5\xa9\xa3\xb7\xf5\xa9\x37\xae\x85\x2b\xf8\x7f\xb7\x10\x96\xa2\x60\x68\x00\x08\x9d\x73\x43\x5c\x00\xb2\xd8\x69\x55\x70\x73\x72\x80\x01\x59\x71\x88\xee\xa1\x0e\xfb\x68\x50\x33\x55\x4c\x65\x9a\x8a\xbc\x1f\x69\xad\x37\xdf\x48\x56\x5d\xc3\xa7\x40\x51\x1b\x93\x69\xa5\xa9\x21\x31\x75\x3d\xb6\xd3\x3e\x6c\xb6\x2b\xf1\x8b\x7a\x3d\x19\xea\x37\xd3\x7f\x21\x43\xca\xbd\x3c\x1b\x1b\x10\x07\xb6\x59\xb6\xe8\xcb\x7d\x33\xce\x5d\xc6\xbe\x4d\x39\xa7\x80\xa4\x46\xca\x79\xeb\x32\x8d\xb8\x79\x71\xf9\xa6\xe3\x9e\x53\xab\x9a\xcd\x23\xb0\xc3\x10\x03\x43\xc5\x00\xd4\x82\xbf\x52\x17\x99\x47\xe4\x7a\x9f\x47\x69\xbe\xfe\x41\x94\x77\xaa\xf8\xd4\x63\x9e\xd4\x72\xd7\xb9\xda\x6e\x07\x9a\xef\xe5\xc5\xdb\x1e\x73\xbd\xbc\x78\xbb\xeb\x3c\x4d\x97\x43\xcd\x51\x15\x65\x17\x85\x73\xed\xc2\x79\x22\xad\x71\x60\x00\x2c\x40\xa1\x88\x41\xe3\xc4\xe7\x95\x7a\x30\xed\x25\x46\x35\xb8\xcf\x5b\x77\xbc\xa4\xcb\x81\xe0\x1b\xf6\x31\xff\x4d\x05\x96\x04\xd2\x9e\x59\x6d\x2a\xa6\xb4\xf5\xac\x2c\x2e\xd7\x95\x52\xe5\xcf\x32\x13\x18\x1b\xdb\x05\x5a\xd1\xda\x89\xd5\x31\xc4\x90\xa0\x20\x08\x48\x50\xf2\x83\x0a\x81\x10\x8e\x9a\x19\x0b\xf5\xa9\x42\xa9\x92\xcd\x64\x26\x6c\x80\x2e\xb3\x91\x79\x5e\x48\x8b\x04\xb2\xc0\xd1\x11\x8e\x98\xab\xfc\x74\xf3\xa8\xa8\x82\x5d\x5f\x5a\xd7\x5d\x2a\x72\x07\xcc\x89\xb8\xf6\xb8\x80\x19\xcf\x08\xcd\xd4\x7f\x1d\x3c\x75\x7d\xa6\x6e\x8e\x0d\xe2\x03\x01\x5d\x6e\x5a\x95\x2e\x5a\x90\x24\x33\xb4\x2c\xb3\x52\xed\x77\x66\xed\x02\x63\xe7\xa9\xb5\x77\x73\x08\x2f\x9b\x45\x66\x23\xfa\xae\xc2\x00\xc7\xc0\x0a\xc7\x3e\x2e\x84\x16\x04\xf2\x46\xf8\x2c\x04\xb5\x41\xbd\x20\xf6\xc7\xf9\xa1\x40\x8e\x7d\x74\x96\x5b\x54\xf9\xf9\x61\xb8\xee\x95\x1b\x69\x17\xc6\xeb\x7b\xf5\xe0\xbd\x4e\x56\x87\x2c\x89\xa0\x2b\xd5\x1c\x42\x1b\x39\x5a\x19\xb4\xb0\x11\xac\x61\x49\x0c\xb5\x94\x65\x69\x54\x02\xba\xd9\xc7\x3a\x1c\xc6\xd0\x92\x92\x7f\x12\x60\x10\x87\x31\xc7\x61\x49\x8d\xc8\x5a\x11\x74\x0b\xad\xd5\x75\x53\xc5\xe6\x4d\xff\x4d\x37\x31\x3b\xf7\xda\x73\x33\xd0\x2e\x5b\xee\xbe\xbe\xdf\x8e\x43\xcf\x0d\x1b\xbe\x71\xb9\x6d\xf5\xe5\xf6\x5d\xb1\x1b\x6b\xc7\x45\x47\xd5\x37\x76\x5d\x77\x58\x47\x0e\x8b\xbb\x58\xba\xd8\x79\xc1\x8a\x7a\x9d\x37\xd7\xb8\xca\x0b\x61\xde\x30\x60\x83\xb1\x77\xe8\x57\x5b\x02\x24\x76\x34\x6e\x2a\x56\xa0\x7b\xa8\x9c\xd5\xe1\x91\xe3\xcb\x47\x68\x63\x5b\x2f\x9f\x16\x50\x90\xea\xbe\x07\x71\xfd\x0e\x86\xd9\xe5\x0c\xe8\xcb\x3b\x6f\x7f\x84\x1d\xde\x75\xd9\x00\x3e\x0b\x4b\x98\x65\xf0\x3c\xef\x7d\xe5\xae\x1b\x23\xee\xb4\xe8\x46\xef\xbe\x4a\x46\xd8\x93\x00\xc5\x30\xcb\x6f\x67\x85\xe3\xb6\x97\xd7\xe3\x76\xb3\xab\x83\x70\x4b\x57\x59\x35\x97\xf9\x26\x4b\x7a\xae\x58\xab\x83\xe3\xa3\x75\xca\x7a\x04\x54\x0d\x19\x69\xa6\x95\x91\xb2\x8f\xbf\x3b\x7e\x1c\xbe\xf7\xff\xab\x35\xde\x10\x35\x60\x5f\x48\x2b\xc5\xde\x7e\xd5\x5a\x94\x59\xfa\xe5\xbe\xa1\xcc\x9b\xd9\xeb\xd6\x42\x37\xed\x7d\x3a\xc0\xf4\x0c\xfb\x7b\x4a\x80\x7a\x73\x99\xc6\xcf\x1f\x2f\x56\x1f\x6c\xbd\xb9\x4c\x07\x58\xbd\x9d\x61\xf5\x76\x15\xb4\x0e\x0b\x18\x0e\xeb\x38\xe4\xb3\x69\x93\x90\x3a\x5e\x4d\x4b\x97\xaf\xec\xd1\x54\xfb\x3f\x9a\x6a\x78\x34\x87\x79\x34\x5b\x65\xe5\xa7\xfc\x66\x36\xca\xd8\x5b\x9f\xcd\xa6\x5e\x21\x24\xdc\xfd\x85\xee\x9e\x61\x67\x22\xad\x17\x58\xee\xe9\xb4\x6d\x74\x6b\x93\x88\xe2\x7a\x31\xd0\x2a\x3a\x60\x1b\x64\x66\x64\x76\xd2\x15\xce\x29\xf8\x4a\xcd\xc8\x83\x80\x76\x7f\x17\x81\xd5\x18\x32\x08\xeb\xa0\x88\x68\x0a\xff\x32\x1b\x85\x99\x62\x60\x53\xc9\x5d\x6e\x65\x10\xe8\x05\x13\xad\x6b\xac\x6d\x7a\x08\x95\x9a\xc8\x9b\x77\xf2\xd1\xfc\x5d\xf5\x99\xf5\xf3\x73\x35\xd6\x53\x73\x78\x36\xfe\x5e\x2a\x74\x82\xe6\xde\xae\xf5\x31\x68\xff\xcb\x6f\xd7\x1f\xc1\x10\x43\xa4\x94\x44\xec\x8d\xb7\x82\x36\xdc\x9f\x6a\x2e\x33\x5f\x58\x61\x59\xb9\x3b\x7d\xb9\xb1\x9e\xfb\xbe\xaf\x7d\xe3\x05\x3f\x10\x05\xd8\xa0\xdc\x6d\x29\x70\xd5\xda\xe1\xf1\x38\xe6\x03\x11\xf1\x4d\x9a\xe7\xce\x11\xdb\xa4\x52\xec\x09\x69\xef\xaa\x17\xd1\x36\xef\xa0\x6c\xdb\x93\x08\x4d\x90\x68\x20\xff\xb3\xff\x2d\x62\xd5\x6d\xd1\xdc\x3e\x2c\x7a\x2c\xd5\x59\xaa\x12\x7d\x56\x72\xfd\x49\x9f\xd9\x0a\xde\x02\x4a\xd1\x3a\xeb\xe7\x99\x26\xbd\x14\x7e\x12\x9f\xcb\xb3\x2f\xcb\xd1\xba\x55\xf8\x2d\x57\xbb\xab\xef\x57\x84\x4c\xde\x62\x52\xe8\x89\x51\xde\xec\x39\x48\x88\xfb\xa1\x95\xb7\x99\x75\xbe\x2c\x72\x79\x31\xe5\x89\xa1\x2e\xe7\xf3\x79\x21\xe6\x10\x2b\x72\x15\xaf\xb9\x11\x44\x18\xb7\x0c\xea\x1f\x2c\xd4\x9d\xb9\x3d\x99\x02\xb0\x84\x37\x59\xa5\x4b\x51\x5c\x29\x08\xf4\x56\x8c\x53\x3f\x43\x5f\x28\xd0\x28\x68\xd2\x03\x78\xc6\x37\xb6\x28\x41\x5d\x6f\xe2\x4d\x4b\x17\x2a\x11\x1d\x64\x5e\xb9\xbf\xa0\x9b\xb5\x5e\xa0\x7f\x26\xf3\x34\x5e\x0c\xf8\x6e\xfc\x4b\x36\x17\x40\x83\x72\x05\x4c\x0d\xdd\x73\x7e\x54\xa8\x0d\x34\xc2\x17\x53\x5b\xf4\xb1\x66\x2b\x51\x50\xf5\x3c\x1d\x07\x63\x1d\xe4\x49\xf4\x86\x5b\xba\xbf\x39\x6d\xc7\xfb\x16\x1e\xfd\xe6\xbb\x16\xb4\x22\x04\x4f\xfc\x81\x41\x61\xf3\x11\xcb\xd4\x5c\x26\xf6\x29\xc9\x7c\x8e\x89\x93\x86\x0a\x98\xab\x59\x0f\x9e\x9f\x89\x42\xe4\x89\x8d\xcf\xa9\x72\x59\x22\x80\xbe\x19\xfe\x27\x99\x43\x19\x44\x55\x84\x07\x44\xbf\xf6\x51\x3b\x36\xbe\x9f\x5e\x07\xb5\xf1\x1d\x6e\x63\xf3\xf5\x97\x48\x60\xdc\xf0\x77\x9e\x59\x11\xdf\x6c\x41\xe3\x8d\x4e\x2b\x99\xd9\x7a\x8b\x19\x69\x58\xe0\x74\x08\x16\x0f\x57\xba\xe5\x1b\x5a\x94\xc1\x75\xc6\xfe\x80\x3d\xe2\x61\x5b\x2c\xee\x96\x79\x29\xa9\x2c\x44\x52\xb2\x64\x81\x9c\xa8\x54\xd4\xc5\xde\x76\x5d\xaa\xe5\xca\x8b\xdc\x01\x86\xcf\x86\x88\xdc\x21\xb9\x75\x40\x41\x18\x72\x3e\xef\x49\xfe\xef\x8f\x82\xb0\x59\x60\xea\x62\xcb\xf8\xfe\x89\x0f\x23\x76\x54\x44\xb5\xdb\x88\xd1\x61\x24\x44\x4b\x65\xfd\xd7\x0e\xcf\xf9\x0e\x98\x51\x0a\xd3\xc5\xf4\x2c\xf9\x2f\xcc\x63\xdc\x56\xf6\x7a\xe3\x76\x45\xa9\xa5\x3b\x64\x95\xb6\x30\x6b\xe2\x88\xfd\x78\xb6\x65\xaa\x8e\xf5\x1a\xb2\x10\xfc\x7d\x04\x61\x40\xe6\x5d\x92\xf6\xc8\x64\x89\x75\x6b\x30\xb2\x8b\x7a\xc5\x9d\xac\xa0\x3c\xcf\xd4\x94\x63\x80\xae\x5e\xf1\x84\x68\x2b\x4f\x11\x8c\x2e\x82\x58\xba\x95\x9c\x5d\x63\xb5\xc2\x01\x3d\x61\x60\x30\x03\x83\xa9\x6f\xfb\xd7\xc4\x60\x54\x26\xae\x60\x56\xfb\x09\xd8\x57\xd4\x7f\x6b\x60\x1a\xb6\xf1\x65\xe5\x77\x24\x45\x0e\x3e\x31\x18\x88\x2e\x87\xb9\x90\xd9\xad\x0d\x12\x3a\x27\xda\x6e\x44\xe6\x0a\x6c\xf6\x65\x55\xe4\x50\xee\xb4\x28\xd4\x26\x09\x98\x0a\xaf\x76\xb1\x59\xa2\x78\x96\xd3\x06\x44\x98\x28\x08\x81\x8d\xa0\x12\x6b\x96\x83\x08\x65\xba\x19\x82\x79\x5f\x7e\x4b\x53\x79\xb0\xa8\x0d\x7b\x29\xba\x4c\x86\x4f\x82\x37\x5b\x16\xfa\xc0\x2c\xba\x03\x82\xa8\xbd\x43\x5b\x9d\x8c\x66\xcb\xa1\x44\xd3\x93\x66\xa2\x7d\x20\x88\x2e\x9a\x10\x44\xdb\xce\x79\xe3\xb8\xbb\x50\x81\x96\x37\x70\x1f\xdb\xec\x20\x2b\x3c\x17\x59\x61\x37\x00\xa2\xad\x92\x42\x4f\x86\xf1\xe8\xe0\x40\xf7\x66\x17\x1d\x80\x41\xf7\x63\x19\xfd\x79\x45\x0f\x26\x31\x70\x87\x67\xce\x1d\x1e\x8e\x2d\x0c\xfc\x60\xe0\x07\x03\x3f\x08\xda\xb7\xf0\x83\xc3\x33\x82\xc0\x1a\xba\x0d\x22\xce\x36\x22\x7d\x32\x34\xb0\xd5\x9c\x4c\xae\x26\x75\x51\x59\x23\x9f\x8b\x8d\x72\x96\xbe\x46\x1d\x89\xbb\x85\x72\xfe\xd4\x40\x15\x65\x00\x4e\x20\x93\x85\xd7\xaf\xdb\x9a\xf5\x33\xec\xb5\x67\x85\x34\x99\x4e\x9c\xad\x11\x96\x5a\xb0\x7f\x24\xdf\xa2\x2d\x8b\x01\x33\xb2\x44\x19\xe3\x2a\x96\x55\x56\xca\x55\x86\xc0\x67\x41\x0e\x47\x00\x42\xc7\xf3\x35\xe3\x51\xe5\x05\x91\x32\x3e\x37\x23\x96\x50\x7b\xc9\x16\xf8\xc9\xab\xa5\x28\x0c\x65\xf0\x1f\x81\x3a\x4e\xf9\xda\x8f\xee\xfd\xc7\xad\xd0\xff\x0f\x1f\xd1\x97\xab\xfc\x8a\x66\xf7\xdb\xd5\xfb\xae\x5d\xfe\x10\xb7\x26\xb2\x8c\x40\x25\x2b\x5e\x94\x92\x67\xac\x2a\x6c\x04\x16\x67\x95\x16\x85\x65\xdd\x0b\x7e\x2b\x18\x4f\x00\xa6\xc2\x10\x50\xf6\x5d\x94\x0d\x8d\x57\x0e\x2c\x37\x1c\x8f\x66\x56\x65\xd9\x88\xcd\x64\x0e\x55\x6f\xc4\xca\xa5\x74\xf3\x72\xc1\xae\x65\x9e\x08\x4a\x91\x25\x92\x0f\x33\x32\x23\x9a\x2b\xeb\xee\x1d\x58\x6d\xa2\x8c\x2f\xf8\x84\xb9\x83\x09\xc4\x8c\xcd\x62\xf7\xb1\x0e\x9d\xce\xc0\x16\x78\x9b\x77\x99\x1c\xa2\x09\xcf\x1d\x08\x05\x04\xd6\x94\x0a\x0e\xd7\x9f\xf8\x0b\x5d\x25\x0b\xb3\xa4\xc9\xd1\x4a\xa5\x7a\x72\x64\xde\xc6\xe4\x48\x8b\xa4\x10\xa5\x9e\x1c\x9d\x00\x34\x53\x6d\x1d\x04\x6e\x15\xf4\x35\x2c\x60\x72\x74\x32\x62\xce\xfc\x3e\x55\xe5\xe2\xf1\xd3\x4f\x69\x92\x7d\xc2\x73\xaf\xc2\xb6\x75\x47\xf7\x9d\x61\x6e\x4e\x50\x09\x02\x72\xdb\xc8\x04\xf3\x61\xb2\xe6\xb2\x05\x71\xb8\x41\x5d\x11\x1f\x7c\xfb\xc5\x76\xa5\xef\x8e\xd4\xc4\x34\x7f\x59\x50\x1e\x6e\xac\xde\xf6\x3b\xcf\xb2\xb0\xba\x14\x87\x7f\x5a\xfa\xf5\xd8\x8b\xbe\x15\xc5\xb4\x6b\xc1\xbf\x9b\x36\xf1\x62\xf1\x27\xa4\x0f\xee\xc5\xbc\x7f\x8f\x22\x1c\x2d\xc6\x88\x7c\x18\xb2\x73\x5e\xa2\x6c\x24\xae\x28\xf1\x12\x82\x6e\x6c\xdc\x62\xea\xd0\x12\xcd\x9e\x8d\x19\x0c\xde\xb2\x49\x20\x25\x3d\xa9\x94\x35\xdc\xbc\x2e\xd9\xa5\x4b\x08\xe8\x88\xc4\xf1\x21\x38\x21\x35\x3c\x78\xfc\xcd\xe0\x9e\x7b\xd2\xba\xe3\xa0\x62\x3d\x17\x15\xeb\xab\x88\xff\x18\x02\x3f\xfa\x69\x87\x87\x8f\xf8\xe8\x17\xea\xb1\x31\xc6\xa3\x50\x9b\xf5\xbe\x0d\x11\x1e\xa1\x3f\x15\x22\xc7\xbd\xb6\x07\xd9\x5f\xfd\xdc\xae\x65\x67\x00\x08\xca\x02\x7e\xf0\xb0\xd9\x74\xdd\xd0\x34\x65\xc9\xc4\x67\xa9\xa1\xfe\xa6\x91\x9e\x02\xe7\x08\x28\x60\x6c\x2e\x6f\x45\x1e\x4e\x16\x90\xaf\x8d\x7e\x82\x48\xbe\x38\x59\x1e\x68\x11\x03\x8f\x1b\x78\xdc\xc0\xe3\xea\xdb\xfe\x35\xf1\xb8\x47\x0e\x41\xd9\x44\x26\x5d\x75\xdd\x7d\x28\xe5\x10\xa0\x32\x04\xa8\xd4\x65\x88\x07\x89\x4c\xe9\x1f\x92\xd2\x23\x16\x65\x08\x42\xf9\x5a\xd8\xe8\x9e\x6e\xc6\x87\x8b\x3e\x19\xc2\x4e\x06\xf9\x60\x70\x33\xf6\x66\x02\x87\x77\x33\xf6\x08\x34\xd9\x16\x61\x32\x84\x96\x3c\x67\x9a\xff\x00\xc4\x7e\xa0\xf2\x03\x95\x1f\xa8\x7c\xd0\x3e\xa4\xf2\x0f\x43\xde\x63\xad\x78\xa3\x4e\x6b\x83\x26\x1a\x21\x24\x70\xc3\x1d\x8d\x04\x95\x0f\x61\x4d\x2b\x1d\x64\xc4\x77\x06\x78\xf4\x8c\xef\xb0\xe1\x1d\x18\x3d\x81\x56\x67\x1f\xc5\x41\x5f\xf6\x6e\xab\x07\x35\x25\x99\x2f\x03\x6c\x48\xe0\xc3\x3d\xc0\x0c\xf2\x6e\x44\xa5\x10\x3e\xc9\x06\xba\xdc\x77\x06\x3d\x1f\x8a\x3b\xaf\xfa\x9e\xd5\x57\xd0\xf5\x96\xba\xee\xa6\x55\xef\xb7\x21\xbd\x20\x49\x76\x77\x93\x07\x66\x97\xc8\x1c\xc1\x54\x81\xb1\x28\x32\x35\x54\x0f\xd1\xc2\xe9\xae\x92\x2d\x3c\x72\xb8\x03\x88\x74\x10\xdb\xb1\x50\x59\xca\xb8\x4d\x8b\x3f\xbf\xbc\xf0\xdc\x80\xbe\x37\x42\x3b\x0e\xb2\x93\x19\x85\x74\x58\x5b\x88\x0d\xe3\x80\x29\x18\x71\x01\x6f\x2f\x98\x76\x76\x88\x81\xea\xfb\x44\xd0\x34\x43\x81\x4f\xf4\x2d\x0a\x4a\x0a\x1c\xba\x64\xf0\x19\xdb\xda\x5f\xf0\x84\x27\x47\x58\x6c\x04\x58\x9b\x4c\xc4\x79\x92\xa8\x0a\xb9\x16\x16\x39\xae\xb5\xde\x48\xc5\x68\x98\xdf\xec\x8a\x71\x66\x6e\x98\x87\x7b\x97\x6a\x66\xcf\xa6\xfe\x0e\xc6\xec\x77\x44\xf6\x43\xd1\x91\xd0\x0b\xa4\x0e\x76\x89\x17\x82\x4d\x8e\xcc\xa4\xb1\xbe\x0a\xcc\xda\xfc\xa7\x59\xc2\xe4\x28\xde\x94\xc9\x91\x33\xc9\x05\x26\x37\xe7\x3c\x09\xa4\x40\xd3\xc4\xcc\xdf\x4a\x8c\xb5\x2e\x24\x80\x16\x02\x0a\x45\x78\x3b\xdd\x83\x51\x0e\xba\x0c\x9b\xf6\x69\xbf\x0f\x83\x91\xb2\xc7\xd7\xc9\xea\xd9\xb8\x8f\x56\x2c\xb7\x7b\x4a\xb3\xfb\x44\xc4\xd6\xbc\xa7\x20\x6f\xd8\x47\x46\xe1\x69\x61\x54\x55\x74\x5e\x70\xb6\x54\x3f\x15\x8f\x04\x43\x88\x0e\xba\xfb\x3d\xa9\xe6\x43\x50\x48\xaa\x4f\x38\x80\x00\x0d\x20\x40\xf5\x07\xf9\x70\x20\x40\x78\xe9\xbe\x2e\x24\x20\xf6\xd6\xe8\x6c\x09\x84\xe2\xca\x9c\xdd\xbe\x1a\xbf\xfa\xbf\xcc\x7f\xcc\xf8\xad\x2a\x40\x74\xda\xc4\xc5\xce\x6e\x5f\xc5\xd8\x07\xe6\x06\x51\xfd\x13\x96\xa9\x7c\x2e\x0a\xc4\x18\x2c\x6e\xdd\xd8\xdf\x7f\xff\x78\xd0\x43\xed\x24\x60\x9b\xd2\x34\xe0\x0f\x0d\x06\xa6\xc1\x37\x3f\x58\x65\x9e\x94\x6f\xfe\x6b\xc0\x1f\x42\x52\xfb\x3c\x63\xd1\xfa\x81\x10\xc1\x0e\xec\x6e\x64\x6a\x48\x0c\x5f\x3d\x1c\xd1\xc1\xe4\x09\x5a\xdc\x01\xc5\x8a\x81\xcf\x0d\x7c\x6e\xe0\x73\x4f\x95\xcf\xdd\x2f\x06\x8d\x8a\x3d\x0c\x58\x48\x8f\x1e\x6a\x66\x41\xc9\xbf\xf5\x78\xb3\x9d\x00\x91\x0e\x2c\x2e\x3c\x24\x34\xd2\xc1\x39\xba\xf9\xf6\xc0\xd5\x9f\x03\x57\x7f\xa2\xb8\x4c\x1b\x85\xea\x9d\x89\xd3\x20\xc1\x3c\x43\x09\x66\x88\x9f\xa8\xdd\xe9\xdd\xc1\x99\x0e\xc5\xbe\x0e\x0b\xd3\x74\x38\x4e\xa5\x07\xfe\x34\xf0\xa7\xc3\x47\xf1\x35\xfd\x43\x03\x47\x1a\x38\xd2\xc0\x91\x58\xfd\x4e\xef\x00\x0f\x75\x2f\x56\x34\x00\x45\x0d\x40\x51\x03\x50\xd4\x00\x14\xf5\xc8\xd7\x65\x00\x8a\xda\xb6\x2b\x0f\x05\x14\x75\xfc\xdd\xf1\x46\x80\x28\x07\xd4\xe0\x4a\xdd\x3a\x92\x39\x66\xc7\xdf\x9d\xcd\x94\x8a\x3a\x43\xdb\x6a\xea\x6e\xdb\x31\x34\x80\xb2\xbe\x7d\x87\x1d\x20\xa9\xbe\x35\x48\x2a\xef\xa3\x78\x02\xb8\x54\xf7\xd3\x95\x0f\x1c\xf0\x35\xe8\xc8\x83\x67\x76\xd0\x22\x9f\xaa\x67\xf6\x49\x23\x60\x3d\xe7\xd0\xa3\x87\x8c\x39\x1a\x00\xb1\x1e\x10\x10\xeb\xfe\xcc\x75\x88\x7e\x1a\x78\xec\xc0\x63\xbf\x1d\x1e\xfb\x25\xa2\x9f\x06\x18\xae\x21\x36\xea\x29\x61\x71\x1d\x4a\x9e\x39\x2c\x2a\xd7\xc1\x78\xf9\x10\xf7\xf4\x5c\xf8\xf9\x53\x83\x02\x6b\x4a\xf4\xf7\x31\x14\x0e\xd2\xca\x73\x91\x56\x06\xbf\x72\xed\x4e\xef\x80\x07\x76\x6f\x66\x74\x5f\x64\xb0\xfb\xf3\x9d\x81\xe1\x0c\x0c\xe7\x41\x22\x98\x86\xd0\xa5\x81\xc5\x0c\x2c\x66\x7f\x30\xb2\x7b\xf3\x96\x01\x96\x6c\x80\x25\x7b\x82\xb0\x64\xb1\xb9\x63\xc0\x26\x1b\xb0\xc9\x06\x6c\xb2\x01\x9b\x6c\xc0\x26\xb3\x64\xd2\xa8\x2a\x69\x95\xc9\x7c\x0e\xa5\x9b\x0a\xa9\x0a\x59\xae\xdf\x64\x5c\xeb\x6d\xf1\xc7\x61\x3b\xa7\x52\x2d\xf9\x0a\x02\x81\x28\xb8\x72\x45\x8d\x58\x02\xad\x80\xc1\x10\x25\x75\x7f\x32\x3a\x91\x51\xff\x60\x6b\xc7\xec\xa3\x51\xca\x60\x97\x29\x70\x88\xe7\x6b\xf3\x83\x4c\x6d\xcb\x41\x2b\x7c\xd2\x5a\x61\xbc\xc3\xdb\x36\x3f\xf8\x27\x85\x90\xf2\x62\x2a\xcb\x82\x17\x6b\xab\x5e\x81\x5c\x58\xe9\x8a\x67\xd9\x9a\xad\x0a\x75\x2b\x53\xa1\xd9\xbc\x92\xa9\xc8\xe0\xb4\x54\xce\xee\x10\xa3\x4a\xea\xfa\x75\xa3\x73\x20\x7c\xb9\x3d\xe8\x10\x3a\x92\x88\x45\x75\x2c\x26\x6a\xeb\x42\x2b\xb5\x99\x1d\xf0\x7c\x98\x60\xfc\x68\xfc\xfc\x12\x95\x6b\x99\x8a\x02\x83\xe3\xcc\xd5\x48\x69\x20\xb7\x24\xc3\xfe\x56\x2a\xa5\xa0\xba\x54\x01\x05\xc2\xb8\xeb\x7c\x5d\x5b\xf9\x98\xfd\x9a\x67\x6b\x08\x58\x8f\xbf\x48\x4f\x6a\xc9\x8b\x4f\xf8\xa9\x9b\x68\xda\x37\x63\xf6\x57\x75\x27\x6e\x45\x31\x62\x72\xc6\x96\xe6\x8e\x95\x0b\x40\x24\xa8\x8d\x24\xb4\x0d\x4f\xb8\x93\xe5\xc2\xcc\x58\x16\xf5\xc1\x28\x2c\x5b\x8b\x12\xee\x7b\x61\x59\x95\x5e\xf2\x2c\x33\xf7\x1e\x9f\xb9\x9a\x21\xf5\x25\xaf\x9d\x5d\x78\xfd\x73\x11\x54\xe0\x86\x4d\xda\x70\xc4\x53\xa5\x32\xc1\xf3\x41\xe9\x7f\xde\x4a\xff\xfd\xbd\xe0\x0f\xbd\x63\x6e\xd1\xad\x5b\xb2\x2a\x84\x91\x28\xa4\xca\x31\x6e\xac\xe3\x56\x5e\xd6\x9a\x5b\x2d\x8e\xfe\x05\xf4\x82\x9a\xe4\x73\x24\x1d\xf0\x56\x33\x75\x27\x0a\xff\x64\xd8\xaf\x98\xd6\xf2\x01\x9f\x3d\x8d\xfa\xde\x34\xba\x74\x6d\x42\x29\xbd\xad\x85\xa1\x16\x55\xae\x45\x39\x46\x5d\xc7\x25\x64\x18\xdd\xeb\x94\xb0\x23\xe7\x60\x34\x26\xfc\xbf\x0f\x2a\xbf\x74\xb3\x73\xc3\xcc\x04\x37\x7b\x77\x6a\x9a\xee\x41\xaf\xe1\x5d\x76\x6c\x9b\x97\x2f\x2c\x4f\xaf\xd3\x4e\x58\x01\x6d\x26\x4f\xca\x8a\x67\xbe\x09\xd9\x29\xc0\x7f\x9f\x08\x79\x2b\x2c\xf7\x11\x14\x7c\x15\xa7\x27\x19\xb5\x0f\x08\x2f\x46\x26\x48\x20\xe1\xc0\x1c\x6a\xab\x43\x4b\x88\x99\x9f\xcc\xcb\x1f\xbe\x6f\x5f\x3a\xc9\x3f\x7b\xc4\x89\xc3\xbe\x3c\xa2\x71\x2a\x10\x29\xb7\x19\xa5\x62\x59\x73\xb3\x65\x6a\x07\xa3\xd4\x16\x61\xb6\xc3\xf5\xd1\x68\xdb\xe6\x03\x89\xef\x4a\x5f\x75\x7b\x90\x45\x9f\xb0\x87\x42\x5a\x0f\x05\xec\x02\xf9\x28\x6a\xd2\xc7\x61\xbc\x15\xdb\x14\xad\x60\xa8\xc1\x6f\xf1\xcd\x8a\x30\xbb\xf9\x2d\xe0\xb2\xda\x59\x7c\x01\xd9\xa5\x27\xf7\x79\x74\xd7\xc8\x3e\xdc\xe7\x70\x85\x5a\xa2\x57\x4e\x79\x00\x3d\x6d\x2a\x6f\xdf\x5d\x5e\xbd\x7b\x73\xfe\xf1\xdd\x5b\x76\x8a\x62\x08\xda\x11\x69\x2a\x0d\xc2\x64\x5e\x74\xea\xfd\xf1\xd3\x35\x6b\x2c\xfd\xec\xf6\xd5\x59\xd4\x67\xcc\x06\xcb\xcd\xc0\x2d\x07\xcb\xcd\x60\xb9\x19\x2c\x37\x83\xd8\xf3\x34\xc4\x9e\xc1\x72\x33\x58\x6e\x06\xcb\xcd\x73\xb4\xdc\xec\x1a\x53\xd4\x25\x3c\x0f\x36\x9c\x6f\x4e\x2a\x7d\xc2\x36\x9c\x36\xed\x6e\x30\xe4\x0c\x12\xcd\x60\xc8\x79\xb2\x86\x9c\x9d\x19\x52\xa9\x0a\x3e\x17\xe6\x4c\xdf\x5c\x5f\xbc\x2d\xe4\xad\x28\xb6\x61\xc3\xda\x36\x2c\xe1\x2b\x73\x02\xba\x05\x58\x8f\xb3\x37\x04\x3d\x54\xb0\x6b\x1c\x9f\x5d\x18\x9a\x3d\xe3\x89\x60\x2f\xde\x5c\x5f\x9c\xb0\x5b\x95\x55\x4b\xc1\x52\x1c\x2c\x15\xab\x4c\xad\x45\xca\x14\xe5\xc2\x62\xd2\xeb\x98\xfd\x97\xdb\x61\xc6\xcb\x92\x27\x0b\x96\x0a\xf8\x3f\x41\x95\xae\x4a\x5b\xf4\x29\xa2\x00\xa5\x32\xad\x44\xb1\x94\xb9\x70\x5a\x2e\x75\x97\xf8\xb0\xcd\xe1\xe3\xe8\x99\x28\x7b\x8e\x60\x04\xa4\x70\xb1\xb9\x10\x29\xb0\xa6\xa9\x60\x2b\x43\x82\x61\xfa\x4b\x55\xe5\xe5\x98\xf9\x8d\xb2\x51\x8d\x88\xee\x16\x44\x65\xa5\x03\x63\x7e\xd2\x8c\x79\xe0\x56\xcf\x85\x5b\xed\xa7\x7f\x07\xda\xb7\xfb\x2f\x0c\x27\xcf\x53\x99\x98\x1b\xdf\x00\xeb\x7c\x73\x7d\x61\x49\x1a\x01\x02\x86\x27\x3d\x33\x87\x5b\xaa\x3f\x33\x59\xb2\x5f\x7e\xbb\xfe\x68\x0e\x28\x82\x65\xa1\x84\x7c\xaf\x8b\x9a\xf1\xfe\x22\xca\xcb\xac\x9a\xcb\xdc\x7c\xfb\xc5\x09\x4b\x78\x96\x51\x38\x3f\x2f\xe9\x6b\x68\x9c\xa6\x2f\xc3\x48\x90\xdf\x3f\x15\xec\x0f\x3f\xb0\x64\xc1\x0b\x9e\x94\xe6\xe3\xaa\x60\x99\xd0\x7a\xc4\xa6\x62\x2e\xf3\x1c\x02\xb9\xf3\xd4\x5c\x2c\xf3\x9f\xa0\x84\xf3\x9c\xf1\x6c\xb5\xe0\x80\x00\x2a\x13\xdf\x9b\xbd\xf8\x3b\x3f\xfd\xd7\xcb\xd3\x3f\x9d\x9f\xfe\x3f\xff\x38\xc1\xc6\x29\xd7\x0b\xa1\xd9\x8b\xd3\x93\x11\x4b\x55\xa9\xd9\x8b\xf1\x09\x55\xac\x0a\xc6\x00\x65\xfb\x4e\x88\xfc\x0b\x9b\x31\x8c\x76\xbb\x33\xd6\x43\x1b\x83\xbc\x36\x03\x6d\xbd\x49\x68\x64\x4d\x1c\x71\xb5\x87\x89\xfd\xf7\xc8\xbf\x81\xb9\x3f\xa6\x68\x42\xcb\xde\x0a\x17\xec\x04\x86\xc3\x38\x96\x5a\x76\xba\x0b\xaa\x3e\x6c\xd7\x0a\x54\x5f\x67\xc3\x03\xcf\x7d\xd2\x3c\x77\x6f\x65\x78\xc3\x5d\xdc\x5b\x0d\x6e\x13\x8b\x07\xd5\x77\x10\x26\x06\xd5\xf7\x0b\xf0\x97\x03\x06\x2f\x6c\xe2\xe6\x3d\x78\x8c\x69\x67\xc9\x8e\xae\x33\x78\xee\x29\x50\x1f\x16\x03\xca\xe8\x95\x3f\x8a\x6d\x74\x21\x6e\x1c\x49\x9f\x52\x83\x54\x11\x2b\xd3\x74\xc2\xe8\xb6\x46\xad\xd7\xcc\x02\xa7\xfa\x62\x2a\x12\x5e\x69\x00\xe0\x93\xcb\x55\x26\x96\x0e\x59\xd9\x8c\xf4\xc6\xa9\xd5\x97\xd5\x34\x93\x7a\xf1\x3b\x0c\xfd\xe2\xc4\xdc\xe1\x85\x4a\x4f\x6c\xae\x10\xa1\x5d\xf7\xd1\xcf\x2d\x47\xb3\x08\x95\xd4\x90\x26\x2d\x9d\x61\x00\x21\x02\x93\x85\x48\x3e\x11\x23\x85\x16\xd8\x7c\x09\xf4\xa9\xe4\x65\x85\x40\x83\x77\xdc\x10\xaa\x2a\x2f\x65\x16\xb4\x05\xf2\x09\xed\x8d\x0c\x2d\x66\xe6\xb9\xad\x0a\x95\x08\x01\x02\x6e\xa9\x50\x3d\x07\x24\xde\x8f\xb4\x64\xf1\x19\x19\xe8\x29\x75\x2c\x58\xa2\x54\x91\xca\x1c\xf6\x18\xc4\xdc\xe6\x1e\x9b\x29\x20\x39\xdc\x3e\x55\xeb\x83\x69\x1e\x84\xd4\x2c\x51\xe6\x00\x4a\x8f\xdf\xe5\xae\xd0\x95\x98\x4b\x5d\x16\xce\xed\x04\x1e\x2a\xd3\x45\xe4\x7c\x9a\x51\x45\xf2\xd2\xf9\x8b\xa4\x0e\xb0\xae\x4b\xc5\x66\x3c\xd3\xe4\xd2\x6e\x7c\xd7\xd5\x2b\xff\x24\x57\x2b\x43\xcc\x7f\x2d\x17\xa2\xb8\x93\x5a\x6c\x6f\x6f\x8e\x6f\x63\xa8\xc2\x56\x3f\xf6\x4c\x43\x9e\x59\x2f\xd7\xe1\x5b\x92\xa3\x24\x6e\x48\x95\xa7\xa2\xc8\xd6\xc0\x0c\x71\xff\x75\xb5\x5a\xa9\xa2\xd4\x58\x88\x1d\x30\x99\xef\x72\x51\xe8\x85\x5c\xc1\xa6\xac\x44\xb1\x94\x5a\x07\x62\x37\x75\xa4\xdb\x80\xd9\x7b\x70\x0b\xcc\xe2\xaf\x04\x70\x46\x15\x3d\x6a\xf6\xf3\x75\x30\x63\x92\x9a\x10\x66\x3c\x4d\x81\x55\x40\x34\x40\xc9\x65\xa6\xeb\x6e\x45\xd0\x7b\xac\x5f\x91\xe7\x1e\xb5\x7f\xa1\x72\x55\x50\x10\x13\xb1\x66\x44\x81\x87\x13\xb5\xc7\x8f\xcf\x2d\xfe\x7e\x78\x07\xf6\x70\x3d\xae\x54\x7a\x91\xcf\xd4\xaf\xf9\x2f\x66\xd1\x5d\x70\x16\xb3\x38\x2a\x22\xee\xbc\x0b\xed\xf1\x3b\x55\xb7\x9b\xbd\xc8\xe4\x27\x61\x7e\x35\x0a\x2d\x7c\xe2\xb7\x8b\xb7\x23\x26\xca\x64\x7c\xc2\xd2\xaa\x70\x07\xe4\x6f\xa1\x86\x27\x42\x33\xa3\xdb\x5d\x1f\x96\xd0\x56\xca\x56\x73\x9c\x8d\x7e\x31\x47\x65\xba\xfb\xe7\x4f\x13\xf7\x61\x31\xb5\x25\x73\x0d\xd5\x21\xcc\x6d\x8a\x8c\x95\xe6\x95\xe3\xc3\x85\x8d\xb2\xa6\x44\x98\x85\xf9\x7c\x63\x7e\x5c\x33\x3c\x5d\x43\x63\xc5\xe7\xd2\xa2\xf9\x99\x49\x7c\x50\xa9\xa8\x13\x5c\xf3\xe0\x74\x63\x9e\xa0\x46\xe8\x95\xca\xb5\xb4\x05\x20\x56\xbc\xd0\x56\x93\x87\x70\x34\xee\x44\xc5\xf0\xfb\xb4\x27\xb2\x39\x13\xfc\xc8\x4c\x65\x99\xba\x33\x3d\xdd\x1f\xcd\x2c\xed\xfb\xb7\xdd\x67\x8d\x3b\xa1\xc3\x2b\x43\xef\x01\xc5\x1e\x39\x5f\x94\x6c\x5e\xa8\x3b\xc4\xac\xc5\xe0\x3a\x31\x93\x9f\xa3\x98\x99\x31\x9b\x1c\x25\xda\xf3\x66\x92\x86\x56\x2a\x1d\xe7\x7c\x29\x26\x47\xaf\xcd\x27\xd1\xf4\xb2\xb5\x25\x58\x55\xc3\xe6\x98\x3b\xbb\xb1\x4f\x25\x53\xd3\x1a\x1f\xcf\x0b\xf3\xcb\x6f\x17\x6f\x4f\xda\xdb\x8b\xd5\x42\x2c\x45\xc1\x33\xd3\x63\x72\x64\x96\x3a\x39\x62\x72\x36\xab\x73\x9f\x9c\xb9\xa6\x4c\xe6\x99\xcc\xed\x5f\x27\x39\xeb\xf8\x7f\x41\xa2\x35\xf7\xc4\xe0\x1a\xe4\xfc\x11\x53\x8e\x4e\x4f\x8e\xe0\x0e\x4f\x8e\x26\xf9\x24\xef\x9a\x2d\xa1\xda\x8b\x3b\x47\x47\x64\x1e\xb2\xed\x57\xe3\x57\x7f\x00\x80\x5f\x4b\xa8\xac\x80\x08\x77\x0b\x6f\x9d\x26\xde\x4c\xc4\x17\xca\x77\xc0\xba\x27\x47\x97\x46\x10\xd3\xa5\xc8\xcb\xc9\x11\xa5\x7d\xbf\x0b\x3e\x8e\x4b\x78\x2f\x67\x22\x59\x27\x99\xf8\x45\xa5\x82\x38\x8e\x1b\x3a\xe1\x39\xcb\x04\xbf\x15\xee\xc5\xb0\x54\x6a\xc7\xe6\xce\x54\xc1\xe4\x3c\xc7\x80\x2f\x4b\x69\xc7\xec\x5c\xd7\x16\xf1\xef\x90\x4a\x9e\x1f\x97\x6e\x96\xbe\xf9\x28\xfa\x18\xac\xd2\x36\x52\xb9\x60\x4b\x95\x52\xb4\x44\xe8\x87\xc0\x94\x69\xeb\x8a\x70\x1c\xd7\xbf\x7e\xef\x22\xb0\xfb\x03\x03\x01\x55\x97\x7a\x04\xfb\x27\x3e\x73\xc3\xe3\x01\x28\x99\x1b\x86\xbf\x34\xe3\xc0\xad\x58\xf1\x82\x2f\xcd\x08\x96\x51\xa5\x35\xe9\xb1\x3f\x87\xb5\x54\xf7\x4a\xac\x90\x88\x74\xd6\xf2\xa8\xb5\xaf\x99\x34\x03\x7a\x73\xc7\x8d\x78\x78\xd3\x20\x50\x37\xc4\x49\x57\xa2\x90\xca\xf4\xcd\xb2\x35\xc9\x08\x86\x14\x14\x62\x96\x19\x8d\x14\x22\x00\x95\x46\x62\x05\x2c\xdb\xa1\x98\x12\x0f\xa6\xd7\x11\xf1\xd1\x34\x08\xea\x41\x72\x6d\x6e\xfa\x07\x55\x8a\xd7\xec\x7c\x06\xa7\x61\x8e\x27\x11\x5a\xcf\x2a\xf3\xcc\x24\x54\xef\x69\x4c\x12\x26\x34\x32\x6a\xad\x36\x1a\x6d\x5e\x22\x51\x35\xc3\x36\xdb\x92\x98\x0a\xb7\x03\x45\x3b\x54\x8d\x0d\x8d\x34\x7b\x10\x89\x13\x63\xf6\x41\xdc\x11\x97\x22\x58\x97\x90\xff\x68\x21\x72\x7c\xc6\x45\x85\x66\x56\x5b\x8c\xa3\x80\xa5\xd8\x40\x1e\x6b\x6c\x75\x6f\xd3\xdc\x0e\x2c\xf2\x73\xcb\x65\x06\x92\x81\x13\x21\xdf\x5c\x5f\xc4\x88\x0a\x1f\xd5\x27\x91\xfb\x67\xed\xa4\xc3\x7d\xae\x10\x11\x90\x37\x7c\xc5\x13\x59\x76\x89\x69\x75\x31\xa1\xd6\x3b\xba\x4e\xa4\x29\x34\x65\x05\xbc\x5a\x10\x76\xe4\xfc\xa0\x66\x48\x1b\x72\x8a\x32\x19\xf9\x0f\x13\x3b\xb4\x1b\xb0\xc1\x8d\xf1\x04\x08\x98\x60\xba\x66\x49\x21\x90\x13\x9a\x8d\xab\x4d\xd0\x3a\xe5\x40\xbc\x4f\xfc\xb4\x1d\xbb\xa4\x63\x12\xa8\x8f\xd8\xf0\x54\x2b\x7e\xcb\xe5\x52\xa4\x92\x97\x22\x5b\x87\x84\x03\xb8\xb0\x33\xc9\x5f\xe4\xb6\x40\x08\x88\x2b\x85\xba\x95\x46\x2e\x35\x8d\x0c\x39\xc6\xcd\xb0\xa1\x6f\xe6\xba\x59\x6c\x15\x92\x21\x8c\x96\xe6\x15\x9c\xe6\x72\x17\x46\x34\xc1\x2b\x2c\x52\xa6\x15\x48\xc7\xb2\x84\x4b\xb3\x71\xc9\xb0\xae\xf3\x0c\x54\x9e\x52\xde\x8a\x6c\x3d\x0a\x87\xa7\x75\x3a\x3a\x68\x63\x68\xe9\x61\x42\x24\x1d\x53\x05\xbe\x4a\x94\x6f\x5d\x05\x94\x59\x06\x1a\x05\xac\xa5\xc0\x6d\x69\x9c\x5e\x28\x90\x98\xf9\x4f\xcd\x43\x71\x8b\xd8\xf0\x36\xe0\xd3\x5d\x2f\xa3\xb6\xda\x96\x57\x81\x3e\x92\xba\x20\xb8\xc7\x5b\x29\xcd\xbb\xbb\x22\x1b\x59\x57\x50\x5f\xd8\x76\x33\x99\x45\x5f\xf2\x4a\xa5\xfa\x18\xd4\x03\x99\x40\xbd\x31\xa0\x2f\xf0\x39\x0d\x0a\xbb\x76\xfa\xab\x7d\x4b\xe0\x08\x52\x10\x75\x2d\x0c\x3d\xe4\xc5\x9a\xf1\xaa\x5c\x88\xbc\x24\xeb\xc4\xb8\x45\x36\x05\x3c\x26\x1a\x36\xdf\x41\x2c\xdd\x20\x94\x12\xe9\x34\x82\xa8\x08\xc5\x50\xa4\xa0\x2d\x82\xa5\xf9\xd0\xeb\x76\x41\x4b\x47\x24\x6e\x8c\xb3\x34\x42\xd7\xff\x6b\x04\xa8\xc9\xd1\xa4\x7a\xf9\xf2\x87\x84\x57\xa9\x14\x79\x22\xe0\x5f\xc2\xfd\xd9\x34\x80\x1e\x20\xa5\x41\x4b\xfc\x27\x34\x1b\xd9\x26\xe2\xf3\x4a\xa2\x62\xf1\x51\x2e\x85\x2e\xf9\x72\xe5\x3b\xf8\x3f\xb2\xd2\xfe\xd5\x6c\xca\xd5\xcf\x6f\x7e\xf8\xe1\x87\x3f\x05\x43\xfd\x1f\xf8\xdf\xf1\x78\x3c\xc9\xff\x4f\xc0\xa0\x68\x6a\xa6\x8f\x30\xba\x74\x78\x05\x82\xc8\xfa\x54\xce\x00\xcc\xa5\x44\x7f\x59\xc9\x96\x8a\x8a\xf0\xc1\x94\xe1\xe6\x62\xd9\x30\x90\x4f\xc7\xec\xa3\x72\xa1\x9d\x28\xd0\x61\x3b\x0e\x0c\x11\x66\xbd\x1e\xb1\x26\x6b\xa7\xd7\x09\xd1\xe9\x40\xb0\xe5\x7c\x2e\x8a\x96\xb3\x0d\x59\xf9\xe3\x73\xa9\x03\x58\xea\xc3\x8d\xee\x6b\xac\x8f\xfe\x14\x99\x35\x8d\x0a\x73\xea\x1a\x97\x6a\x29\x93\x0d\xb1\xbd\x4d\x19\xb7\x8b\x2a\xb4\x75\x71\x3e\xa4\x3b\xc3\x34\x3e\x11\x38\x93\xe5\x12\x1b\xf4\x6d\x6b\x0e\xa9\x11\xb7\x99\xf7\x8d\xb8\x6b\x24\x75\x4d\x5c\x1f\x91\xd4\x4a\x26\xcd\x4a\x1b\x4a\x1d\x81\x3d\xe1\x23\x8f\x6d\x9d\x40\xf3\xad\xe1\x10\xf5\xc9\x40\x10\x37\x72\x2e\x0e\x56\xf1\x8c\x5d\xfe\x7e\x76\xf9\xfb\x1b\xb6\x14\x46\xf2\x93\x7a\x89\xb3\x04\x45\x06\x65\x65\x98\x53\xa0\x2f\x10\xd3\x04\x3a\x97\x8a\x91\x5b\x3d\x2f\xfc\xcc\x48\xa9\x92\x20\x24\xa0\x4e\x49\x91\xcb\xce\x58\x17\x2a\x4e\x56\x70\x97\x05\xcb\xec\x7e\xc3\x92\xc9\x56\x86\x1b\x65\xff\x00\x42\x1e\x06\x52\x8f\xd9\xb9\xdd\xe5\x05\xb7\x71\x3e\xfc\xce\x4c\xc5\x3a\xf4\x42\x5b\x2a\x69\x4f\x73\x45\x52\xcc\x5c\x94\x8c\x6f\xa0\xa0\x40\xb5\x49\xbf\xb0\xf2\xe4\xcf\xaa\xc0\xb4\x96\x66\x3c\x95\xdb\x6e\x54\xeb\xdd\xee\x68\x21\x9c\x1b\x21\xb8\xb8\x86\xa8\xce\x65\xb9\xa8\xa6\x86\x9e\xa6\x2a\xd1\x5e\x1f\x3c\xcd\x54\xc2\xb3\x53\xda\xd7\xf1\xa2\x5c\x66\x7e\x99\x86\x52\x84\x7a\x91\x9d\x11\x4a\xbe\x1a\x15\x25\x34\xbf\xc2\xef\xf8\xcf\x25\x5f\xc3\xce\xa4\xa9\xad\x34\x27\xd8\xac\x32\x8f\xbd\x2d\xe4\xfe\x21\xeb\xcb\xf5\x7c\xcb\x5a\x94\x3b\xd4\x21\xea\xe7\x49\x30\xe7\xbc\xdd\x87\x60\x5a\xb4\x54\xb2\xa5\x88\xb9\x2c\x0b\xf8\xa9\x69\xa1\x4b\xd4\xa5\x4c\x13\x96\x83\xda\x1c\x36\xa0\x2c\x2b\x23\x36\x80\xc8\x6c\x44\x5d\x67\x44\x84\x4f\x91\x4b\x10\x31\xf8\xb2\x35\x68\xcc\x99\x32\x02\xaa\xc6\xa4\x80\x8a\x2c\xbe\x66\xf0\x53\x1c\xf7\xb4\x40\xbb\x33\x2f\x98\x79\x5c\x09\x2f\xbc\xde\x82\x62\xe2\xa7\x50\x94\xe0\x55\xa9\xcc\x32\x50\xf9\x5b\xa9\x55\x95\x6d\x98\x85\x45\x9f\x0c\x64\x86\xc0\xae\x66\x07\x5d\x41\x98\x0b\xb3\x93\x40\xe1\xc5\x6d\x1d\x65\x56\xf9\x60\x19\x28\xb3\x87\x5b\x13\x63\xa0\x99\x07\x22\xb5\x86\x42\x3e\xd2\x96\xdc\x24\x68\x42\xf3\x3f\x82\x62\xf1\x82\x88\x0c\x1d\xb0\x32\x8a\x41\xcc\xe1\x8d\xd1\xc4\xad\x08\x65\x33\x55\xa5\xd9\xcc\x3b\x26\x72\x55\xcd\x17\xa4\xf2\x97\xce\x02\xe1\x8e\xc3\xb9\x66\xe3\x75\xf0\x9c\xfd\x7a\x97\x8b\xe2\xca\xc3\x2f\x36\xf1\x41\x13\x55\xa0\xa5\x0f\x74\x82\xdc\xef\xe6\x10\xc2\xf0\xa4\x43\x18\x06\x4f\xff\x73\xf1\xf4\xf7\x0c\x1b\x74\xc1\x81\x51\xe0\x5d\xcd\x3b\x0a\xef\xd7\x34\xd8\x54\x64\xe7\xfe\xb1\x69\x86\xbc\x74\x46\xa6\xe9\x6d\x4e\x6c\xcb\xc8\x9e\x4b\x74\x1a\x2c\xe6\x01\xe2\x06\xcc\xb8\x7d\x42\xe5\x7d\xbb\x8d\x9c\xbf\xf5\x1c\x8c\xf0\x15\xfa\x7c\x9a\xd2\x40\x0f\x16\x90\x19\x51\x0f\xac\x41\xf7\xb9\x57\x28\xb5\x9a\x85\x5c\xb5\x93\xc4\x7a\xb0\x82\xff\x6c\xbd\x72\x33\x69\x2e\xbe\x4c\x33\x84\x4d\xe4\xce\x66\x0e\x05\xd5\x1d\x17\x06\x11\xd9\xe7\x47\xb4\x8a\x92\xad\x2f\xa9\x07\xaa\x6b\x98\x47\xb9\x73\xf8\x2e\x4d\xe5\xc0\x01\xbc\x7b\x80\xc8\xaa\x54\x5c\xbc\xed\x58\x29\x36\xb2\xeb\x83\xbd\x76\x7c\x81\x56\x8a\xbc\xc1\xa8\x9a\x52\xdc\x45\xfb\x8c\x8a\x7a\xe4\x68\x01\xf3\x2c\x90\xf9\xc4\x48\x38\xa0\x70\x59\x23\x9f\x5e\x6b\x88\xcc\x0b\x61\x00\xf4\x82\x17\xe1\x1e\xa9\xa5\xc8\x93\x0c\x4d\x01\x08\xfb\x9c\x1a\x6e\xfe\xb3\x77\x95\x8c\xc2\xcf\xa1\x14\x40\x2e\x7a\x57\x13\xd2\xac\x02\xb0\x6c\xcd\x7f\xbd\x32\x8a\xac\xf5\x2e\xc6\x53\x89\xbb\x07\x93\x08\xfb\x9f\x1b\xad\xf3\x6f\x0b\x11\xa9\xb1\x52\xeb\x4a\xe8\xc0\x63\x63\xfb\xc7\xe3\x9b\x49\x61\xbc\x84\xd5\xe3\x70\x9e\x2e\x90\x00\x65\x48\x32\x91\xa2\xc0\xed\x76\x17\xbd\x24\x7e\x6e\x8e\x43\xb0\x4a\x5b\x01\xe0\xe2\xad\xb7\x77\xd7\xbe\x0d\x12\x38\xc4\x47\xe8\x92\xe7\xe9\x88\x89\xf1\x7c\xec\xd7\x04\x44\x43\x70\xb0\x21\xb8\x8d\xaa\xbf\x22\x97\x09\xb3\xfb\xed\x2b\xd5\x4a\x65\x6a\xbe\xfe\x2f\xb1\xee\x32\x76\x84\x4d\xeb\x61\x9b\x9f\xcc\x6f\xa4\x73\xfa\x57\x63\x2d\xe8\x70\x2c\x3c\x70\x7d\x93\xa7\x07\x24\x41\xa0\x85\xe4\x9d\x83\x3d\x76\x20\x1c\x1c\x9c\x13\xe6\xce\xd3\x97\xf1\x33\x56\x4a\xf7\x9b\xa6\xd9\x0b\xda\xb5\x44\x2d\x57\x3c\x5f\x8f\x13\xb5\x3c\xfb\x97\xca\x05\xe2\x59\x87\xbf\x1a\xad\x44\xe5\x93\xa3\x93\x3e\xd3\x72\xe7\xee\xe6\xe4\x6e\x5f\x3c\x27\x0e\x2a\x19\x3c\x23\x2b\xd9\x46\xd6\x5a\xf1\x79\xa5\x50\x4f\xd3\x8d\xae\x9a\x65\x7c\x2a\x32\x40\x1a\x31\xb2\x9c\xba\xcb\x23\x35\xa1\x71\xab\x01\x6b\xdb\x0d\x82\xa6\x8c\xd0\x2d\xd1\xbc\xa9\x70\x4c\xb5\x64\x28\x99\x2c\xec\x87\x65\xe9\xe1\xa0\xcb\x42\x8a\xdb\x80\xba\x04\x33\xc1\xc0\x1c\xae\x35\x9b\xf2\xe4\x93\xbd\xef\xce\x4d\x02\x0a\x9b\x73\x12\x82\xd7\xd9\x99\x46\x81\x3e\x98\x1e\x66\x4a\xfe\xe7\x68\x27\xc6\x1e\x7f\x7e\x2a\xac\xb1\xcb\x47\x6b\x58\x80\x71\xe7\x16\xa6\xbe\x4f\xaa\xd2\x3d\x30\xad\x26\x71\xef\x12\xa9\xfa\x8b\x2b\xdd\x81\xf4\xb6\xd5\x86\x30\xfa\x40\x9d\x1f\x82\xe8\x9f\xb6\x06\x7a\x9f\x20\xfa\xa6\xc8\x7c\x98\x10\xfa\x58\xaf\x18\x02\xe8\xbf\x61\xb5\x7a\x08\xa0\x7f\x64\x15\xf8\xa1\xc2\xe7\x9d\xc1\xa1\x93\xaf\x40\xe8\xfc\x4e\x2a\x70\x0f\x8b\x78\x37\x13\xa2\xce\x5d\x60\x6f\xf6\x13\x61\x11\xb7\x70\x9a\xc1\x74\xac\xb5\x18\x20\xc6\x20\xfa\x38\x0f\x8d\xd0\xa6\x99\x9f\xb1\xa7\xad\x46\xd2\xaa\x72\xb7\x86\x11\x01\xf0\x80\xc4\x92\xa8\x25\x49\x2d\x87\xf7\x88\xc6\xb6\x8a\x7b\xbb\x51\x56\xbc\x4c\x16\xa7\x4b\x51\xcc\xc5\xe9\x27\xb1\x06\x05\x33\x16\x5c\xda\x7b\x80\x35\x5f\xcc\xd7\x68\x2d\x2b\xe6\x7b\x58\x98\xec\x51\x1e\x40\x22\xb2\xa1\x22\x1d\x60\x95\x61\x33\x86\x7f\x9b\x92\x70\xe2\x42\xf7\x28\x2a\x9c\xa0\x94\xd4\xcc\x29\x69\xe6\x67\x14\x95\xbd\xc7\xf5\x77\x72\x66\xda\x18\x9b\x75\xce\x97\xd6\x77\x62\xa5\x70\x8a\x81\x09\xbf\x2d\xda\xa0\x03\xfe\xdc\xb0\x5d\xb8\x50\x1b\x98\x0a\x4f\x12\xc8\x61\x00\x57\xa4\x28\x93\x14\xd5\x14\xe6\x4d\x9a\x10\x20\xdb\x47\x90\xcb\x32\x75\x87\x53\x7f\xf7\x79\xc5\xf3\x3e\x22\x5d\x4b\x17\x23\x92\xdd\x85\x98\x83\x8d\x19\x9b\x4e\x56\x8b\x16\xa6\xdb\x86\x72\x5c\x5b\x43\x73\x60\x14\x91\x7e\x44\x19\xbf\xbe\x98\xb6\x48\x48\xc3\xfc\x92\xd2\xab\x2c\xa5\xeb\x6a\x26\x5b\x08\xe7\x83\xee\x38\x36\xf6\x2e\x48\x6a\x21\x4f\x96\x15\x68\xad\x76\xe6\x15\x5d\xa7\xc0\x44\x84\x4f\x8f\xd9\x79\x4e\x1a\x0c\x2d\x61\x7d\x2d\x8c\x1c\xae\x8a\x8f\xa2\x58\x5a\x66\xc8\x73\x4d\x8e\x2c\xa8\xd4\xe3\x47\x2b\x68\x39\xe0\x39\x8b\x75\xfd\xbe\x49\x08\xe4\x3b\xf7\x11\x79\x14\xb9\x71\x20\xe2\x94\xa8\x82\x62\x35\x9a\xcb\xbb\x97\x7c\x38\x28\x1c\x83\xcb\x6b\x90\xcd\x7b\x3d\xc2\x67\x8c\x54\x09\xe1\x91\xbf\xc2\x3c\xbb\x48\xff\xdb\x76\x42\xde\xc2\xb0\x2d\x25\xa8\x31\xac\x42\x90\xa3\xdf\x87\xc9\x6a\x0a\x6b\xa7\x19\x90\x51\xf6\xef\x93\xa3\x42\xa1\x45\x51\xab\x59\x39\x39\xfa\xc7\x98\x7d\x50\xa5\x8b\x92\x4c\xd9\xa9\x4d\x78\x42\x5e\x7e\xf9\x3b\x85\x93\x6b\xb9\x5c\x65\x6b\x36\xe3\x32\x63\x12\xfd\x42\xc0\xc7\xa1\xe7\xe3\x18\xb0\xc2\x4c\x32\x27\xf6\xd4\xb7\xd6\x67\x7b\x5d\xb6\x8b\x11\x3b\x4d\xa5\x0e\x7a\xe8\xa5\x2d\x5f\xaa\xb1\x26\x82\x61\x6a\x91\x3d\x44\x72\xad\x58\xa2\x8c\xd1\x18\xb7\xdb\x4e\x73\x83\x05\x3c\x14\x2a\x1b\xbb\xe1\x3f\xd7\x89\x87\xea\x27\x16\x47\x00\xdb\x9a\xa8\xb5\xe9\xef\x61\x8f\x2f\x44\x92\x71\xb9\xec\x97\x64\x79\xf8\x9b\x0f\x7c\x32\x98\x41\x0c\xcc\xfa\x56\x40\x9a\xeb\x1e\xb0\xa9\x30\x0f\x2a\x1d\xff\x4b\x1c\x63\xd5\xb6\xb2\xdf\xeb\xed\x83\xfd\x5e\xa8\xbb\xc6\x0a\xdf\x98\x19\x87\x70\xd7\xe1\x76\x18\x9e\x3c\x55\x55\x9e\x8e\x19\x9a\xd2\x21\xfa\x7d\xc4\xa2\x8f\x5c\xd8\x4c\x00\xf3\x30\x31\x9b\xed\x41\xe5\xae\xfb\x56\x56\x0c\x6f\xed\x13\xb3\x56\x44\x7a\xd9\xa1\xcd\x15\xe1\xe0\x1d\xb6\xf0\x7a\xd3\x36\x83\x78\xf4\x20\x06\x88\xd5\x27\x2e\x9f\xee\x54\xc8\x3f\x34\x88\xc7\x7a\xf8\xc1\xcd\x33\xd1\x8d\x1f\x8c\xe3\x83\x00\x3e\x18\xc7\xbf\x0c\xbb\x79\x10\x0b\x79\x94\x8e\xb2\x99\xdd\x44\xe9\x41\xae\x36\x7b\x20\xdf\x42\x98\x54\x6b\x52\x58\x1f\xb6\x43\xd9\x48\x5d\x4c\xc7\x25\x2d\x69\x02\x0e\x28\x45\x9e\x1a\x21\xc8\xfe\x81\xa4\x54\xca\x4d\xca\xd9\x24\x9a\xf8\xf5\x4a\x24\x90\xbe\x41\x71\x0b\x36\x13\x85\xb8\x8a\x1d\x45\xdb\x70\x6f\x66\x2e\x3d\xd0\x90\x3d\xa4\x42\x9f\xa1\x75\x2d\x12\x65\x5e\xee\xf6\xc5\xbd\xab\xb7\xb7\xab\x4c\xab\xc2\x31\x4d\x50\xa9\x20\x4f\xb2\xef\x42\xa3\x88\x74\xbb\x60\x07\xe0\x3f\x69\x7e\x16\xa2\x72\xda\xc7\xdb\x82\xb9\xff\x87\x1f\x0f\x8c\xb9\xef\xae\xc4\x01\x6c\xe9\x28\xb5\x9e\x3b\xdc\x9b\x2d\xf7\xbc\xde\xd4\x23\x08\xbb\x0b\x57\x06\x11\x55\xaa\xb0\x50\x42\x81\x7f\xc8\xa5\x8b\xb3\x52\x9d\x39\x66\xe3\xff\x08\x8e\x98\x49\x3e\xc9\x1b\x1f\x1b\x50\x78\xbf\x52\xd9\x6d\x10\x6d\x9e\x8b\x68\x73\x6f\x14\xde\xaf\x1a\x3c\xb6\x4e\x91\xf6\xc3\x90\x4d\x85\x06\x6c\x16\x24\x92\x67\x44\x21\x1d\xc4\xd5\x82\xdf\x4a\x55\x8c\xd9\x25\xe5\x62\xb9\x88\xca\x20\x0a\x10\xe3\x47\x37\xa5\x21\x00\x6c\xd9\x41\xd7\x89\x23\x76\x9c\x78\x59\x39\x80\x8d\x06\xe9\xa6\x47\xd5\xb2\x2a\x73\x78\xe5\xda\xe2\xa8\xd9\x67\xde\x60\x20\x0e\x46\x6a\xc4\xe4\x58\x8c\xb1\x6b\x1d\xf5\xed\x99\x60\xf2\x36\x18\xf2\xa1\xa5\xda\xfa\x07\x3a\x8c\x29\x6d\xcd\xdb\x0c\x2a\x9b\x18\xf6\xc0\x9d\x9f\x34\x77\xde\xdb\xb2\x52\x3f\xef\xc3\x1b\x57\x1a\x2f\x61\x30\xb0\x0c\x52\xc8\x60\x60\xf9\x72\xac\xe8\x41\x8c\x2c\x0d\x71\x03\x9e\xd5\x0e\x0c\x89\x50\x22\x82\x5c\x35\x9f\xcb\x13\x38\x11\xa7\xc2\x01\xcb\x8e\xd9\x15\x00\x1b\xe6\xea\x0e\xbd\x3b\xce\xab\x54\x8b\xf0\x72\x48\xb4\xb7\x92\x3b\x81\xc3\xfe\x5a\x8c\x98\xcc\x09\x28\x81\xdd\x09\x78\xe8\x18\x03\xc5\x33\xad\x62\xe8\x40\x08\xdd\x5a\xa9\x54\x8f\xd9\xbb\xcf\x3c\x29\xa9\x82\xea\x52\x2c\xa7\x1e\xb3\x49\x8b\x3e\x99\xe1\x38\x2e\x39\x9b\xf6\x11\x69\x6d\x00\x4f\xdd\x95\xd6\x29\xcf\xd6\xbf\xec\x6d\x5d\x16\x18\x38\x2e\xae\x63\xd1\x8c\xc2\x24\xab\x95\xfb\xa8\xc3\x41\x09\x31\x13\x57\x2a\x3d\xd6\x76\xeb\x42\x10\x90\xba\x53\x6e\xe5\x24\x49\x38\xc0\x00\x9e\xe0\x17\x39\x27\x9b\x90\xf5\xbf\xb1\x8b\xc0\x2c\x57\x16\x3c\xd7\xd8\x13\x06\xd3\xae\x9e\xf4\xa6\x4f\x63\x46\x58\xdb\x6e\x6d\x81\x8e\xdd\x01\x39\x36\xdd\x3c\xf3\x0d\x7e\xeb\xda\x54\x3e\x74\xe7\x4b\x7e\x08\xe2\x0c\x9b\x47\xe0\x0e\x68\x6f\x57\xe5\xfd\xed\x4e\x1d\x61\xc8\x6d\xcd\xb7\x40\x79\x6f\x54\x41\xfa\x22\x7b\x77\x86\x04\x9c\x5b\xac\xe9\xcd\xb5\x64\x62\xa0\x1f\x38\x71\xc8\x39\x5d\xf0\x3c\xcd\x84\x95\x50\x49\x35\x6a\x64\xb4\x86\x89\xa8\xb5\x04\xd4\x3d\x73\x4d\x7b\xdc\x93\x8f\x2e\x88\xd2\x26\x2d\xde\x46\xd8\x8a\x21\x4d\x2c\xd5\x1e\xf3\xd0\x75\xea\xde\x8f\x66\x75\xf3\x8b\xad\xc2\x40\x83\x43\x04\x2b\xdb\xc4\x23\xf6\x30\xcb\xda\x9b\xd3\x5c\x6f\xdb\x49\x3c\x80\xf1\xf6\xba\xae\xfc\x77\x3e\x23\x54\xdc\xed\x43\x72\x6a\xfc\x01\x5e\xd0\xbb\xa2\x50\x8d\x47\xb4\xfb\x41\xe3\x30\xdb\x4e\xf7\x23\xa8\x66\xba\x64\xc2\x34\x65\x22\x07\xff\x0a\x14\x3c\x27\x2c\xea\x3a\x24\x3a\x54\x20\xe7\xf9\x3a\xa2\xdf\x00\xfb\x00\xe4\x1a\x59\x71\x3f\x13\xc5\xae\x86\x89\x51\xe3\xba\x74\x69\x25\x17\x11\x7d\xf1\x38\xc5\x1e\x3e\x35\x5b\x07\x92\xcd\x23\xad\x68\x8f\xc0\x6e\x77\x95\x7e\xd9\xa0\x13\x3c\x68\x0c\xda\x6f\x2b\x44\x04\xb6\x90\xb3\x38\x9d\x51\x98\xcf\x1d\x89\x15\x54\x4a\x2b\x06\xbc\xac\x83\x03\x34\xb0\xf6\x81\x98\x58\x00\x11\x87\xd7\x5d\xaa\x10\xc1\xf6\x6f\x5c\x96\x3f\xab\xe2\xdc\x19\xb9\x10\x85\xdb\x01\x33\x7e\xb9\xf3\xdb\x16\x2c\x87\x96\xb8\x27\xf4\xa8\x5b\x4c\x83\xf7\x7d\xd4\x0f\x6c\x6d\x74\x0f\xfe\x60\x94\xbf\x7e\x1c\xed\xe4\x1e\x5a\x79\x67\x1d\xcf\xb7\x50\x4a\x4b\x60\xdc\x1e\xf4\xa0\xf7\x4b\x23\xe7\xcf\xbb\x44\x8b\xeb\xd2\x1d\x9b\xcc\xec\x8e\x6f\x9c\x88\x7f\x1d\x6f\x6b\x87\x42\xe7\x4b\x26\x1a\xc2\xae\xcb\xd4\x7c\x2e\xd2\x11\x33\x7a\x97\xe3\xe6\xb9\x72\x72\x3f\xd3\x22\xd7\xb2\x94\xb7\x91\x8e\xb2\x0f\x6a\x82\x6c\xca\x50\xf7\xb0\x65\x7c\x94\xf5\xe4\xab\xfa\x3b\x90\x4b\x11\xec\xd4\x1d\xd7\xe1\x6e\x6d\xbd\x84\xfb\x5e\xaa\x18\x2a\xa6\xeb\x72\x45\xad\xc9\x7a\x86\xd8\x0d\xce\x42\x96\x49\x30\x6a\xc5\x78\x30\x01\x34\x66\x8f\x2b\x96\xf4\xa8\x7c\xf1\x0b\xff\x2c\x97\xd5\x92\xe5\x15\x28\xd5\x6a\xc6\xaa\x5c\xfe\xb3\xf2\x2a\xf8\x92\xe7\x7c\x1e\x23\xbb\x84\xb2\x79\x08\xb3\x1a\x24\x05\x9e\x47\x82\xa2\xd4\x88\x9d\xef\xa4\x60\xc4\x52\x44\x20\x74\xd7\x0b\x6b\xc3\x20\x08\x36\xe2\xfb\xf9\x81\x13\x31\x82\x9b\x59\xde\xc9\x84\xaa\x58\x40\xfc\x41\x51\x65\x82\xf1\xd5\x2a\x93\xb6\x54\x49\x3c\x7f\xf7\x7d\x40\x64\x49\x19\x5f\x2a\x73\xff\xab\xac\x94\xab\x0c\x20\x34\xb5\x05\xbe\x73\x20\x29\x84\xab\x17\x72\x38\x00\x52\xb0\xee\x76\x80\x04\xa4\x3e\x2e\xb3\xc9\xef\x9f\x0b\xb8\x26\x48\x4f\xbb\xb4\x2a\x87\xa8\xda\x06\xec\x48\x14\xf5\xf0\xc3\xf7\x7b\x47\x3d\xec\x7c\x73\xb1\xcc\xf9\x53\x2c\x7f\xdc\x1b\xf2\x31\x2a\x72\x18\x80\x3e\x5e\x10\x0a\x0c\x20\x3e\x1a\x6a\x67\x51\x1f\xe9\x13\x3d\x80\x1f\x09\x47\x24\x86\x04\xe7\x11\x3e\x55\x59\x83\x82\xc4\xb9\xe9\xb0\x28\x56\xc3\xc6\xed\xb8\x26\xc1\x80\x0c\x95\x9e\x07\x2f\xd6\x10\x63\x32\x78\x77\x86\x4a\xcf\x43\xa5\xe7\x2f\x1d\xac\x53\x13\x08\x86\x72\xcf\xbd\xcb\x3d\xc3\xce\xed\xe5\xc9\xab\xed\xf9\x50\xf8\xf9\xdb\x62\xc1\x4f\xaf\xf0\x73\x5d\x2b\xd8\x68\x2a\x1c\xc2\x47\xbe\x21\x01\x63\x08\x1f\x79\x6a\xd5\x9f\x0f\xc6\x72\x86\x3a\xd0\x43\x1d\xe8\xa1\x0e\xf4\x50\x07\x7a\xa8\x03\x3d\xd4\x81\x1e\xea\x40\x0f\x75\xa0\x87\x3a\xd0\x43\x1d\xe8\xa1\x0e\xf4\x50\x07\x7a\xa8\x03\xdd\x5b\x4c\x18\xea\x40\x0f\x75\xa0\x87\x3a\xd0\x6d\x2f\x65\xa8\x03\x3d\xd4\x81\x1e\xea\x40\x3f\x4a\x1d\x68\x34\xeb\x7d\x3d\xc5\xa0\x5b\x64\xe3\xa1\x18\xf4\x50\x0c\xfa\xb9\x15\x83\xfe\x32\xe5\x96\xf6\x0f\x06\xec\x28\xe9\xfc\xf6\xdd\xe5\xd5\xbb\x37\xe7\x1f\xdf\xbd\x65\xa7\xa8\xb3\x80\x77\xc3\x55\x08\x0e\xaa\x26\x49\xf3\x9c\x57\x85\x48\x2c\x76\x05\x7d\xed\xec\xf6\xd5\x19\xb5\x19\xb3\x6b\x81\xf7\xb7\x10\x99\xe0\x5a\x18\x0d\x82\x8c\x8d\xf5\x8b\x10\xd4\x12\x1e\xca\x49\x0f\xe5\xa4\x87\x72\xd2\xcf\x3a\x30\x62\x08\x1d\x78\x2e\xa1\x03\x5f\x51\x39\xe9\x88\x09\x0e\x35\xa5\x77\xa8\x29\x7d\x80\x68\x84\x6f\xa7\xba\x34\x2e\xf9\xa9\x94\x98\x1e\xca\x49\x0f\xe5\xa4\x87\x72\xd2\x43\x39\xe9\xa1\x9c\xf4\x50\x4e\x7a\x28\x27\xdd\x43\x48\x19\x6a\x4a\x7f\x3b\x6a\xe8\x53\xab\x29\x1d\x9b\xe9\x76\x7e\x47\x83\x82\xfd\x0c\x15\xec\x21\x36\xff\x69\x15\x96\x3e\x90\x2e\x3c\x94\x98\x7e\xc2\x25\xa6\xdb\xac\x16\xf7\xf6\xb6\x3e\x8b\x3a\xd3\xb8\x33\x43\xb1\xe9\xa1\xd8\x74\x39\x14\x9b\x1e\x8a\x4d\x0f\x9a\xc8\xe0\x10\x1b\xe4\xf5\xa1\xd8\xf4\x50\x6c\x7a\x28\x36\x3d\x14\x9b\x1e\x8a\x4d\x0f\xc5\xa6\x9f\x4c\xf5\xcf\x07\x34\x61\x0c\x65\xa7\xbf\x61\x49\xf5\x89\x96\x9d\x6e\x31\x4c\x0c\xf6\xf3\x41\x1e\x1f\xec\xe7\x5f\x86\xfb\x3c\xb0\x11\x7d\xa8\x42\x3d\x54\xa1\xee\x59\x85\xfa\x2b\x2d\x42\x1d\x46\x11\x0e\x95\xa8\x07\x71\x6e\x30\x3c\x0e\x82\xce\x50\x89\xba\x57\xd0\xf5\xb3\x2f\x47\xbd\x61\xb1\x43\x4d\x6a\xfc\xfd\xc9\xd5\xa4\xbe\xaf\xb4\x3b\x54\xa7\x1e\x38\xf6\x01\x0c\x30\x0f\x5e\x9d\x7a\x83\xcc\x3a\xd8\x61\x06\xf1\x64\xb0\xc3\x7c\x39\xce\xf4\xc0\xb6\x98\xa1\x58\xf5\x50\xac\x7a\x28\x56\xfd\xad\x15\xab\xde\xa2\x70\x0d\x15\xab\xfd\x20\x43\xc5\xea\xdd\x39\xc7\x56\x01\xe1\x99\x96\xad\xde\xaa\xd2\x3f\x8b\xda\xd5\xe1\x0a\x87\x02\xd6\x43\x01\x6b\xc6\x5a\x3e\x36\x14\xb0\xfe\x0a\x0b\x58\x1f\xfa\x65\x7f\xd3\x55\xac\x9b\x9b\x39\x94\xb2\x1e\x4a\x59\x1f\x5a\x62\x1f\xea\x59\x3f\xeb\x7a\xd6\x32\xfb\xaa\xab\x58\x1b\x92\x0c\x29\x6f\xfa\xd4\xc7\xb2\xb8\xc7\x15\x35\x30\xaf\xec\x4d\xa5\x4b\xb5\xb4\x17\xf4\x8d\x59\x5a\xfe\xd6\x3d\xd5\x6d\x49\xb6\x5b\x3b\x06\x55\x53\xc0\x73\x52\x2d\x73\xbc\xdf\x30\x1f\x00\x7f\x64\xab\x42\x62\xc1\xa5\x1e\x39\xb5\xd1\xb7\xb7\xe6\xd5\xfa\x7f\xe2\x63\x5b\x54\x4b\x6e\xe4\x14\x9e\x42\xac\x73\xf8\x77\xeb\x37\xc1\xf9\xed\x41\xf1\xdc\xc9\x6e\x9b\x11\x36\x22\xb4\x64\xb5\x42\x79\x8e\xfd\xba\x12\xf9\xf9\xe5\x05\x86\xe0\x7b\xda\x48\xb6\x1c\x3f\x29\xb8\xff\xc7\x46\x1d\x3e\x66\xc1\x48\xf0\x0c\x1c\x6a\xd0\xaa\x90\x4b\x5e\xac\x99\x4c\x0d\x07\x9f\x49\xa8\x54\x05\x7b\x5e\x2a\xc6\xb5\x06\x1f\x56\x4e\x16\x77\x6d\x9b\xad\xb1\xfa\x00\xb4\x23\xa5\xc7\x91\x24\x00\x92\x03\x04\xd2\xc0\x66\xbc\xa8\xa6\x80\x54\xf3\xeb\xf9\xc5\x19\xcd\xff\x34\x72\x02\x9f\x4d\x33\x35\x3d\x5b\x72\x5d\x8a\xe2\x8c\xec\xa4\xfa\xec\xfb\xf1\xcb\xf1\x32\xfd\x37\x23\xe0\x02\x60\x32\xbe\x5e\x5b\x25\x69\xf7\x5d\xff\x1f\xad\xf2\x4b\x5e\x76\x95\xb2\xb0\xcd\x88\xe6\x02\x4a\x2e\xfb\xbf\xaf\x7f\xfd\xc0\x56\xe6\xd7\x17\x20\xc4\xa0\x50\x5b\x14\x7c\x6d\x68\x0e\x2c\xe2\xc4\xe3\x1e\x8b\x5b\x9e\x55\x20\xfc\xf2\x39\x97\xb9\x91\xbb\xa0\x82\x19\x5c\xfd\xc0\x1d\xa2\xd8\xaa\x50\x69\x95\x20\x3b\x42\x17\x4a\xfd\x20\xf7\x30\x58\x74\x1b\x2b\xc0\x4c\xd2\x76\xcd\xe1\x0f\xd6\x2e\xb8\xf7\x0c\x56\x85\x54\x45\x77\xcd\x07\xdb\x8c\xee\x38\x91\x32\xba\xd5\x24\xcd\x14\x22\xe3\x28\x63\x2c\x0d\x41\xe5\x2e\x74\xcf\xed\x10\x88\x9d\x9c\xd8\x01\x80\x40\xeb\x31\x7b\xaf\xee\x44\x41\xb4\x97\x32\x3f\x3c\xdb\x58\xc8\x39\xd4\x66\xa7\xcf\x8f\x19\x52\x21\xb2\x2f\x92\xf8\xa3\x96\xb2\x24\x20\x6a\xe0\xb3\x22\x65\x58\xfc\x47\x27\x22\xe7\x85\x54\x61\xfe\x05\xe2\x7f\x71\x37\x24\x9b\x43\x9e\x09\x30\xc0\x9c\xbd\x3c\x0c\x61\x0f\x45\x26\x6c\xb4\x15\xdc\xca\x10\x08\xdc\xd8\xde\x34\xe3\x09\xbd\xdb\x9e\x4a\x40\x1d\x9e\x08\xc6\x6b\x7b\xf3\x7b\x2a\x09\xf7\xe4\x8a\xf9\x6d\xc3\x61\xdf\xc5\x0f\x6d\x97\x20\x77\x7f\xa1\xee\xa8\x8a\x09\xb8\xde\x3d\xda\x94\xdd\x72\x2a\x17\x79\xd5\x83\x23\x06\xc0\x06\xdb\x6e\x8f\x6d\x16\xf0\x63\x33\x8b\x1a\x05\x73\x2f\xcb\xcc\x0b\xea\x23\x42\xc9\x6e\x37\xaf\x31\x3b\xc7\xc4\x76\x5b\xf1\x8e\x17\xe2\x35\x3b\x65\x37\x1f\x54\x2e\x6e\x5e\x03\x8f\xb2\xbd\x0b\x54\x2c\xa9\xa2\x0f\xe8\xe1\x2e\xde\x01\xeb\x33\x3a\x05\xa4\x54\x80\x71\x9e\xaf\x09\xf3\x9d\x64\x30\x94\xbc\x6a\x53\x1c\x9b\xcf\xfd\x4d\x4c\x17\x4a\x7d\xba\x79\xcd\xcc\x33\x40\x6f\x33\xc6\xf5\x62\x09\x49\x05\x0a\x9c\xf5\x54\xdd\x61\x6b\x2a\x82\x51\xba\x39\x6a\xd0\x94\xce\x7d\x19\xba\x40\xed\x99\xe4\x0c\x84\x40\x21\x52\xaa\x73\x85\xbe\xee\x55\xa0\x5e\xb9\x4a\x76\x66\x4f\xc7\x60\x4b\x2d\x6e\xc5\x6f\xf9\xa7\x5c\xdd\xe5\x3f\xa3\x5b\x05\x25\x5a\xaa\x47\x67\x56\x0d\x6d\x83\xef\x07\x93\xab\x3b\xbf\x7a\x93\x67\x1a\x63\x57\x9d\x6b\xc7\xb7\x40\x9b\x1e\x3c\x82\x6d\x4a\x99\x5d\x57\xf3\xd6\x5b\x37\x99\xdf\x04\x7b\x42\x63\xe6\x4a\x98\x42\xb1\x88\x1b\x7b\x6b\x6f\x82\x12\x72\xee\xf0\xf7\x09\x81\xb2\x8f\xe5\x4b\x50\x8f\x3d\xa4\xe9\x40\x8e\x8e\x1c\xbb\x41\x00\x46\x64\xac\x47\x10\xbf\xd4\xaa\x37\xe6\x71\xd0\x24\x19\xbb\x28\x35\x4a\x03\x16\x4f\xd4\x62\xf0\xa3\x30\x89\x95\x4d\xc6\x70\x3d\xa1\xa6\x1e\x14\x31\x19\x87\x3f\x83\xff\x9c\x7e\x1f\xa2\x9b\x9e\x72\x74\xd3\x10\xf0\xf3\x5c\x02\x7e\x82\x78\xe4\xd6\x4f\xee\x13\xf1\x7b\x20\x2a\xd6\x0f\xfc\xbb\x46\xff\xa1\xe6\x8b\xab\xec\x16\xaa\x9a\xf0\x22\xf9\x6a\x25\xf8\x06\x19\x79\xbf\x88\xdf\x43\x2d\xb6\x3b\x2e\x98\x1c\x85\xb1\x13\x9c\x27\x65\xc5\x33\x70\x22\x7a\xf0\xe7\x4d\x6c\x61\x77\x7e\xf6\xc8\x21\xbd\xf1\x76\x6d\x85\x81\xdb\xb4\xc6\xcd\x21\x54\xfd\xa3\xa7\x0e\x74\xa6\x6f\x54\x9e\xee\xcb\x8f\x5d\x5f\x1f\x53\x43\x0a\x91\xd7\xb6\xab\x02\x84\xfa\xc4\x35\xb5\x1c\x6c\xa5\xfa\x24\xf4\x64\x5c\x97\x1f\x0b\x0e\x36\x79\x2c\x43\xf6\x98\x46\xf5\xe6\xd7\xd1\xe1\x54\x5a\x63\xbb\x5f\x56\xe9\x9a\x19\x51\xd9\x90\x7c\x95\x3b\xbf\x39\xc8\xe2\x20\xd6\x6f\x70\xf6\xf6\xf3\x8c\x50\xab\xc0\xc6\x71\xea\x6c\x1c\xee\x6f\xf8\xf2\xbc\x07\x45\x13\xc6\x1f\x4e\xdc\xcd\x72\x2f\x58\x0b\xae\x3b\x05\x19\x6c\x84\x53\x44\x8b\xf4\xc8\xec\xc4\xe9\x9d\x2a\xd2\x91\xe7\x61\x8c\xda\x79\xab\x0c\x6d\xe4\xb1\x3e\xc0\x4c\xdb\xa9\xe4\x06\x52\x55\x8f\x70\x88\xa6\x03\xcc\xd8\x70\xe2\x8f\x50\xc0\xf3\x67\xd4\x61\x48\xbd\xd9\xc7\x2d\xd4\xdf\xc6\x51\xc7\x24\x09\xe6\xf4\x11\x0c\x10\x32\x4f\xb2\x2a\x15\xec\x9d\x2e\x39\x55\x86\x1c\x31\xa8\xe7\x7c\x9e\x24\x62\x55\x92\xbf\xe1\x23\x60\x49\xf3\xd8\xb8\xbc\x7d\xc2\x3d\x29\x6f\xdd\x2e\x41\xdb\xfe\x65\xf5\x8a\x2e\xd4\xe5\x2d\xdd\x62\xfc\xc9\x8d\x5a\xc8\x90\xdc\xf0\x35\x88\xff\xfd\x11\x99\xb1\xf4\x5f\x9e\xca\x5b\x99\x1a\x39\xa5\xeb\xe0\x0f\x92\xec\x70\x28\x2d\x3a\xf8\xea\x90\x12\xf1\xcd\x6a\x48\x2e\x25\x62\x67\x1a\xfe\xe8\x79\x07\xf7\x17\x9f\x3b\xb2\x10\x1e\x5d\x84\x06\x96\xbb\x07\xcb\x81\x7e\x2d\xf1\xc2\x40\x97\x61\x36\x54\xc9\xb4\x4b\x8d\xd8\x1c\x08\xc1\x4b\x31\x57\x45\x37\xf4\xaa\x6f\x18\xf3\x40\x38\x35\x91\x86\xfa\x29\xb8\x56\x6a\x3e\xbf\xa9\xc8\x54\x3e\x87\x79\x63\x89\x8f\x63\x9e\x65\xc7\x27\x3e\x8a\xd9\xd7\xdf\x96\x39\x58\xe4\x52\xa9\x13\x75\x2b\x8a\x35\x4b\x55\x52\x41\x0e\x19\x32\x1c\x88\x7b\x98\xae\x9d\x7b\x16\x82\xe3\xb0\x94\x84\xcc\x6f\x15\x61\xb3\xb2\x4c\x7e\x12\xec\xc6\xdc\xc5\xa4\xcc\xb0\x7e\x68\x96\xdd\x3c\x3a\x0a\x5f\x0f\x0a\xfa\x89\x28\x28\x08\x99\xa2\xb0\x85\x4b\x6c\xcd\xda\x50\xfb\xb7\xd5\x39\x72\x55\x2c\x01\x10\xce\x8b\xcb\x60\x35\x97\xf9\xbc\xca\x78\x31\xa6\x1b\xe1\xf7\x1f\x60\xad\x01\xb9\x03\xeb\xd4\xd8\x82\x22\x48\xac\x09\x01\xe3\xc6\x7c\xf2\x86\xf1\x12\x09\x9e\xb0\x47\x81\x91\x85\xbb\x93\x31\x73\x47\xfe\xab\x7b\xfd\xb6\x59\xc7\x1e\xc0\x8d\x73\x2e\x06\xbf\x23\x21\x74\xdd\xe4\x08\xd7\x60\x08\xc0\xe4\x68\x1f\x17\x6e\x56\x15\x3c\xeb\x72\xe0\x42\x23\x3b\x5d\xfa\x57\x18\xc7\x1f\xba\xba\xe1\x99\x62\x5c\x42\xab\x1b\x09\xfe\x9e\x62\x11\x1c\x76\x63\x58\x89\x3e\x43\x73\x72\x60\x48\xa6\x5f\x88\x8a\xd1\x6f\xe3\xf1\x98\x7e\xc7\x29\xe0\xcf\x37\x63\xf6\x4b\xa5\x4b\xb6\xe4\x25\x01\x6e\x44\x15\xb5\x36\x49\x2e\x2f\x02\x3b\x37\xbb\xc1\x61\x81\xd4\x8c\xc3\xc1\xc7\x8d\x99\xdd\x9c\xd0\xf7\xa6\x02\x32\x7b\x32\x75\x27\x8a\x84\x6f\xac\x07\xbf\x55\x29\x5b\xa8\xa2\xac\xd3\xca\xb6\x03\xf0\x0d\x71\x0b\xcd\x3f\x89\x30\x5a\x75\xd1\x6e\xf2\xc8\x59\xfb\x1f\x8c\xae\xe0\x9e\xc0\x24\xbc\x4b\xe0\x06\x9e\xea\xb2\xc7\xce\x3c\x3c\x0d\xb2\x64\xa1\x6b\x57\xa9\x99\x7b\x87\xf6\xdf\x6d\x57\x7b\xcb\xf2\xa2\x17\xe9\x7e\x4e\x89\xbc\x1c\x1a\x21\x11\x1f\x6c\x9d\xe2\x7e\x59\x0d\xb3\xab\xe0\xc2\x96\x6e\x35\x4b\x30\xaf\xd9\x81\x65\x11\x11\x17\x32\x04\xf7\x88\x77\x6c\x71\xc9\xb3\x07\xd7\x42\x7a\x3a\x41\x93\xd0\xfb\x8f\xba\x6d\xf0\x93\x16\xa5\x51\x22\xfc\xd3\x7e\x73\xf5\x76\x83\x91\xcc\x8a\x90\xdb\x6e\x39\x16\x99\xa6\x2b\x6e\x08\x02\xfe\xe0\xf0\x38\x30\xc1\xb0\xe1\x4e\xbf\x27\xfd\x1e\x8f\xc7\x8f\x4f\x98\xf7\x8b\xa1\xfa\x52\xbe\x03\x24\xfc\xdb\xee\x09\x52\x78\x0c\xcd\x58\xc7\x8c\xd6\x10\x70\x10\x16\x62\x2e\x50\x3f\xc6\x4d\x71\x5b\x2d\x31\x09\x9d\x41\x5c\x6d\x71\x0c\xa1\xa8\xce\x4b\x57\x6d\x1b\xff\x88\x71\x72\x88\x5a\x55\x06\x48\x57\x74\xc0\x36\x5c\x89\x0c\x39\x21\xca\xad\xa0\x4b\x06\xee\x7e\x4a\xc9\xa4\x6a\x11\x36\xe6\x3a\x08\x1b\x19\xc1\x4e\x8c\x7c\x4a\x3b\x6c\x8e\x99\xa5\x9d\x09\x55\xfb\xf7\x0d\x0a\x43\xc3\xef\xf8\x5a\xfb\x8f\xd5\xf3\x55\x83\x02\xec\x32\x67\x33\x7e\xab\x20\xba\x97\x5e\x27\xbb\xf9\x7c\x6a\xbb\x9e\x56\xb8\x27\xa7\xf8\xb5\x1b\x30\x22\x15\x15\x88\x93\x37\xe0\x22\xb7\x81\x32\x7f\xff\xee\x1f\x63\x5c\xee\x58\xe1\xea\x7f\xff\xe1\x1a\xfe\x7d\x13\x47\x65\x79\x95\xd2\x15\xe1\x2f\xb9\xfe\xa4\xcf\x38\xe4\xe3\x84\x2a\x27\x5f\xc9\x33\x3c\xf6\x53\xf7\x50\xeb\x3f\x9c\x86\x17\xf9\xdf\x56\x45\x95\xcb\x7c\x0e\x6a\x6a\xa5\xed\x32\xcc\x2f\xf1\x42\x7a\xc4\x73\x6d\x4d\x60\xd2\x89\xea\x34\xed\x42\x9b\xe0\x1a\x85\x15\x38\x36\xd0\x26\x08\x0e\xc7\xb2\x8b\xa7\x4c\x21\xb7\x86\x90\xbd\x53\x18\x2c\x6d\x8b\x46\x62\x37\x6f\xb0\xc7\x0d\x5c\x8e\x9b\x0f\x0e\x42\xad\x37\x7f\x0e\x16\x66\x8f\xb3\x63\x6d\x2e\x6c\xab\x86\x15\x62\xa4\x07\x73\xf1\xc3\xb0\xae\xad\xb4\xd8\x1a\x42\x73\x27\x01\x82\xec\x86\xb5\x50\x57\x15\x95\xbc\x57\x45\x0a\xc9\xb6\xf4\xee\xe8\x09\xb9\x8f\x98\x6e\x66\x06\x2d\x92\xa1\xab\x5f\xef\x58\x10\x5a\xb6\xa4\x66\x93\x23\x73\xd5\x4e\x8d\x10\x38\x39\x82\xfa\x8c\x88\xfc\x6e\xa4\x44\x3e\x55\xb7\x80\x48\x17\xb7\xaa\x8d\xa2\x47\x01\x21\x80\x39\x8a\x94\x65\xe2\xb3\x4c\xd4\xbc\xe0\xab\x05\x22\x7d\x8f\xd9\xe4\xe8\xbf\x9a\x63\x68\xa6\x4b\x5e\x94\x14\x87\xcb\x26\x47\xb7\x66\x16\x10\x7e\xcf\xa1\x82\x2b\x9d\x34\xe4\xc7\x53\x08\xfe\x0b\xb3\x92\x25\xff\x1f\x55\xd8\x51\x4e\xa8\x8b\x8d\xae\xce\xd6\xe4\xe0\x80\x55\x4e\x8e\x20\x35\x7d\x72\x64\x2e\xd3\xe4\x68\x2a\x4a\xf3\xdf\xe6\x9a\x90\x87\x2a\x1e\x58\xe6\xc1\xc0\xc0\x27\x35\xd6\xf3\xd7\x98\x08\x30\x93\x85\x86\x8c\xa9\xbf\x9c\xa3\xa4\x2c\x98\x19\xd2\xfe\x37\x7c\x8b\xbd\xc0\xe2\x2d\x7f\x39\x47\xe3\x82\x0b\x78\x32\xcb\xcc\x8d\x1c\x3e\x9b\xc9\xcf\x4c\x43\xfc\x9b\xc6\xfe\xaa\xc0\xbe\x27\x28\xbd\xc3\x82\xa6\x6b\x8a\x8a\xc5\x7c\x9e\x60\xc9\xb4\xe2\x68\xb6\x58\xbe\x05\xab\xdc\xda\xd9\xda\x3b\x69\xf7\xfb\x35\xbb\x7d\xf5\x72\xc4\x6e\xbf\x1f\xb1\xdb\x57\xe6\xff\x43\x6a\x0b\xfc\xeb\xa5\xf9\xaf\x1f\x46\xec\xf6\x07\xc8\x76\x31\x3f\x7d\x0f\x33\xc2\x76\xf0\x9f\xdf\x8f\xd8\x4c\xa9\x57\xf8\xbf\xf5\x78\xd8\x2f\x6b\x17\xb6\x6e\x87\x9d\x15\x8b\x9e\x82\x39\xca\x62\x0d\xd9\xa2\x41\x0f\xdb\xe8\xc8\x17\x96\xde\xbb\x32\xa1\xb7\x77\xac\xd9\xeb\xfa\xc5\x34\x74\x3b\x8a\xc8\x61\xd7\xaa\x1e\x3f\x19\x09\x2d\x9a\x25\xb3\xa5\xa6\xc9\x64\xe9\xea\x87\x43\xb0\x07\x64\x53\x9a\x77\x6a\x69\x37\xda\x33\x03\x22\xfc\x71\x21\xd6\x36\x2c\x3d\x28\x35\xbb\xe0\x79\x30\xaa\xc4\xdc\x99\x0d\x92\x9d\xf3\x88\x76\x9a\x37\x5d\x43\x77\x7c\x74\x72\x86\xe9\xaf\x78\x51\xca\x04\x74\x61\x6e\xbe\x56\xda\xd0\xe3\x5e\xe1\x1b\x5f\xf6\x9d\xfb\xf0\x8d\x7b\x99\x10\x4a\x55\x88\xf4\xf7\x7e\x8c\x3e\x6e\x0c\x34\x15\x61\x5f\x42\x0e\x1f\xcf\x97\xae\xc7\x9d\xe1\x02\x02\xaa\xa0\x13\xf0\x88\x91\x43\x0b\x9e\x7c\x22\x37\x92\x16\x01\x07\x37\xcc\xce\xb0\x8b\xa5\xc3\x42\x81\x54\x15\x48\x9c\x82\x29\xf8\xb6\x32\x87\xba\x6a\xa8\xc7\x39\x99\x76\x59\x61\x11\x7c\xad\xa2\x51\xc0\xe5\xa3\xb2\x8c\xd0\x76\xcc\x4e\xea\x45\xd4\xc2\x87\x6b\x38\x5e\xf5\x42\xe4\x1a\x13\x4e\x73\xc5\x54\x96\x46\x30\xb5\x99\x98\x41\x4a\x11\x49\xeb\x21\xcf\x2a\xc4\x52\xdd\x0a\xab\xcd\xb8\xa2\x32\x6e\xe6\xe4\xfa\xa2\xe2\xcf\x4e\xf8\x41\x17\x19\xb9\xb8\x70\x0c\x8a\x2a\x89\x45\xec\x1b\x23\x6d\x60\xd1\x8a\x35\x56\x44\x44\x7d\xc3\x8e\xf7\x28\xb6\xa8\x06\xcb\x78\x54\x7a\xde\x74\xb0\xf7\x25\xe8\xbf\x37\x72\x12\xbc\x6c\x62\x6e\x19\x58\x22\xba\x49\x77\x00\x4b\x00\x1e\x74\xca\xbb\xe9\x78\x45\x9b\xba\x85\xb9\x82\x3e\x28\x3f\xa1\x3f\x3a\x84\x01\x99\xb3\x8f\x70\xb9\x55\x55\xae\xaa\xb2\x53\x9f\x82\xda\xf7\x22\x4f\xc4\x19\x94\xbb\x07\x3d\x8a\xfc\x9a\x86\xa6\xeb\xb3\x7f\x2b\x44\x22\x24\xe8\x45\x4e\xb1\x3a\xe5\xfa\x14\x9e\x50\xac\x1c\x19\xf9\x39\x57\x6e\x4e\x20\x0d\x5a\x75\x77\x04\xd9\x65\xf9\x3c\xb3\x89\x56\x86\xe4\xaf\x32\xbe\x76\x38\x04\x73\x1f\xd0\xd2\xd4\x74\xa0\x68\xcb\x97\xa7\xaf\x8d\xcc\xcf\xfb\x10\x57\xaf\x5a\x77\x66\x6b\x06\x3a\xb8\x17\x32\xa4\x76\xb7\x72\xc3\xc6\x19\xf5\x26\xd2\xe1\xa9\x18\x3d\x25\x0b\x94\x10\xba\x64\x1a\x05\x3e\xf4\x78\x60\x3c\x7c\xc1\x38\xbb\xe3\x05\xa4\xa9\x2d\x04\x27\x05\x8b\x9c\x36\x86\x6c\x17\x42\xaf\x54\x5e\x37\x02\x43\x62\xc7\x3e\x2a\xb3\x9d\xb0\x54\xf9\xdf\xf0\xb3\x3d\x77\xc8\x77\x60\x46\x9a\x28\x5c\xcd\x7f\x0b\xf0\x6e\x57\xe1\xde\x4b\xa9\xd0\xd7\x85\xd6\xff\xff\x8f\xbd\x77\x5f\x6e\x23\xb7\xf6\x85\xff\xdf\x4f\x81\xd2\xa4\xca\x52\x3e\x92\x12\x25\x7b\x92\x51\x6a\xd7\x1c\x8d\x2f\x13\x7d\x63\x8f\xf5\x59\xf2\xe4\xe4\x0c\x67\x1f\x81\xdd\x20\x89\xa8\x09\x74\x1a\xdd\x92\x99\x78\xaa\xf6\x83\x9c\xf3\x72\xfb\x49\xbe\xc2\x5a\x0b\x97\x6e\x36\xaf\xa2\x64\x67\xb6\x53\x15\x8f\x48\xe2\xba\x00\x2c\x2c\xac\xcb\x6f\xf5\xd8\x1b\x3e\xab\x61\x3e\x60\xa8\x45\xa0\x20\x04\x5b\x58\xc2\xe1\x9d\xd2\x6c\x77\xc1\xfa\xd4\x15\x29\xf6\x12\x28\x44\xa2\xa7\x53\xa1\x52\xd8\xdb\x6e\x01\x95\xb8\xb3\x97\x41\xfd\xd1\x6a\x7f\x14\x7f\xaf\x78\x66\x1f\x3f\x2e\xd4\xce\x94\x7c\x28\x33\x59\xce\x3a\x2e\xe7\x18\x70\xf9\x6d\xec\x75\x1b\x44\x50\xc6\xaf\x63\xfb\x1d\xe5\x4e\xfb\xaf\xff\xfc\x3f\xb7\xfd\xff\xfa\xcf\xff\xdb\x81\xbf\x8e\xe1\x61\x04\x1f\x45\x99\xac\xab\x43\xad\xd1\x8b\x97\x1b\xdb\xc4\xae\x2d\x1d\xae\xb1\xc9\xb0\x48\x5b\x58\xa3\x40\x11\xf5\xa8\xa2\xf6\x4f\x98\x62\x6e\x95\xbe\x9c\x34\x84\xf5\x2c\xb7\xf4\x25\x48\xd3\x96\x17\xdf\xfa\xb6\x3a\x8c\x34\x5c\x28\x75\xd0\x4e\x25\xcc\x84\x35\xb8\xc7\x22\x68\x69\xa0\xf0\x2a\x51\x10\x57\x16\x5e\xf5\xa3\x8c\x8f\x11\xc6\x4e\xaa\xf1\x61\x2a\x0d\xfe\x55\x1f\x02\x88\x30\xf8\x30\x70\x9b\x5f\x72\x74\x1e\x3a\xbb\x38\x5f\xe0\x4b\xb3\x5c\xed\x86\x32\xd7\x1a\x32\x6b\xe4\x1d\xdb\x3c\xb7\x41\x1b\x0b\x04\x6e\x2a\x62\xe7\x76\x75\xac\x99\xbd\x02\xdd\x86\xb3\x95\x89\x08\xd2\xb1\xa6\xe7\xa0\xf2\xff\xbe\x64\xbb\x2e\x9f\x67\x35\x2c\x5a\x60\x36\x1e\x7e\xd7\x5e\xc6\x1d\x2f\xdd\xb7\x51\x41\xaf\xc6\xbf\x83\xd8\xac\xf8\x97\xb6\x2d\xb9\x48\xf7\x39\xe1\xb7\x62\x8b\x08\xb7\x66\xfc\x2c\xed\xe5\x96\x5d\xf3\x29\x54\x11\x11\x41\x2f\x13\x9e\x2d\xc3\x37\x5d\x5e\xd1\x9b\xd3\x28\xa8\xd0\xb9\x0c\x59\x6e\x61\x7f\x8e\xc8\x8e\xf2\x6c\xfd\x4d\xb6\x96\xf7\xfd\x50\x64\x2e\x2b\xf0\x1a\x28\x03\x73\xe5\x6b\xde\xac\x01\x6e\x80\x2c\x14\xf0\xca\x9e\xc3\x0f\x00\x74\x15\x5d\xa0\xac\x81\xd1\xa3\x38\xdd\x6b\xf4\x2f\xee\x19\xea\xe0\xba\xc7\xde\xda\x2b\xdc\xb7\x6b\xe0\xa8\xb9\x84\xf6\x75\x20\x03\xb2\x82\x80\x02\x35\xf2\x69\xc0\xca\x30\x54\xb2\xf1\xf5\xb0\x97\x6b\x7b\x0b\x5f\x43\xcc\xdf\x75\x28\x4f\x12\xd5\x9d\x2e\x6e\xf0\x58\xff\x59\x17\xf2\x1f\x5a\x95\x3c\xbb\xd0\xe9\x59\x55\x6a\x20\x7d\x11\xbf\x44\xc1\xa3\xd1\x01\xc9\x48\x13\x91\xc1\x1b\xd8\x9d\x72\x16\x2b\xec\xdb\x77\x1f\x27\xe0\xa9\x0f\xcc\x4d\xd7\x16\xaa\x92\xd2\x21\x32\x04\xc4\xd5\xd8\xa5\x06\x56\x20\x54\x91\x5e\xbb\x3d\xd2\xc5\xb4\xd5\x2d\xf2\x01\x8d\x2f\x5f\x01\x31\xba\xf1\x3e\x44\xd5\xbb\x4f\x96\x8d\x0e\x4a\x4e\x32\x70\x90\x03\xb4\x47\xda\x6e\xab\x0e\xba\x32\x35\x77\x02\x35\x44\x75\xae\x0f\xa1\xe3\xeb\xda\x09\x68\xcb\x78\x84\xd9\xbd\x91\x42\xdb\xc8\x10\xb9\x48\xde\x89\x3c\x93\x09\x37\x6b\x9c\x8e\x66\xf1\x1d\x1f\x8e\x5c\x24\xbd\x82\x9a\x7f\xa8\xa3\x81\xa7\x61\x47\x8b\xb8\x70\x95\x50\x6a\x0f\xf8\x63\x5a\xb1\xef\x5f\x5e\x6d\x1d\x07\xb2\xc9\x12\xcd\x55\x78\x10\x0e\xf6\xd0\xcb\x84\x1c\x6c\x67\x0b\xd5\x1c\xf5\x16\xa7\xad\x69\x1d\xb9\xaf\x63\xd0\xdc\xd1\x5b\xbe\xea\x9f\xfa\x9e\xdf\xcc\xe6\x30\x57\x73\xc9\x4d\x8f\xbf\xaf\xba\xea\x59\x80\x73\xf5\xfe\xf8\x01\xdb\x2c\xdc\x79\xed\x1b\xbc\xde\x5a\x50\x2e\x74\xd8\xef\xc9\xff\xce\xde\x42\x87\x0b\xc6\xd2\xa6\xb1\xf8\x3d\xbb\x78\x7f\xd5\x50\x47\x88\xd6\x16\x4a\x7e\x23\x5a\xce\x18\xae\x1b\x3e\x79\xe4\x58\xd9\x6b\x0d\x41\x36\x28\xd8\x6e\x56\x4e\xec\xad\x27\x3e\x24\x22\x2f\x6b\x94\x2a\xb9\xfa\x07\xc7\x01\x1c\x5e\xbc\xbd\xbc\x3a\xbc\x38\xbb\x7a\xfe\xe7\xb9\xb1\xcc\x29\xa7\xe6\x3a\x99\x6b\x74\xef\x13\xed\xae\xad\x36\x96\xa9\x31\x36\x9a\x07\x78\x19\x37\x65\x47\xb3\xa5\xf0\x68\x1a\xc2\x2d\x7b\xcc\xa7\x0a\x4a\xd6\xcb\x9f\xd9\x76\x9e\x75\x6b\x5e\x73\xd1\xe9\x5d\x88\xc7\x8d\xb7\x73\x3a\xe0\xf6\x78\x63\x01\x2e\xd1\x35\x27\x29\xd0\x3e\x83\x6f\xfb\xd7\xc4\xfa\x29\x38\xeb\xb3\x89\xea\x9e\xe7\x4e\x1b\x87\x75\xaf\xa6\x16\x71\x95\x88\x5c\xc4\x3c\x08\xee\xfe\x94\xf5\x7b\x2b\x4f\x9e\xc3\x73\xf3\xc1\x41\xed\x47\xf1\xda\xf7\x86\x27\x9c\x9e\x96\x2e\x28\xee\x78\x75\x47\xad\x03\x5e\xc6\x5d\x34\x39\xef\x90\xc9\x72\xf9\x08\x3e\xb1\xc1\x24\x52\x3e\xad\xcb\x2d\x42\x95\x7a\x50\x48\xd0\x3d\xb1\xa9\x28\x27\x3a\xdd\x96\x43\x34\xbc\xc2\x1e\x78\xff\xdb\xbb\x0d\x3b\xba\x28\x74\xbe\x7c\xbf\x37\x46\xe6\x74\xa2\xce\x89\xef\xf6\xc4\x29\xe4\x4a\x0d\x7a\xdd\xba\x4a\x0e\xf8\x28\x69\xe5\x1e\x7f\xdd\x5f\x12\xe4\xd3\x0b\x72\x80\x5f\xb5\xe8\xad\xe5\x9d\xf9\xd5\xd9\x8d\x00\xf3\x37\x82\x93\xaa\xdd\xf0\xd0\x7f\x2a\x52\xef\x73\xbf\x2e\x20\xf0\x12\x24\xcb\x75\xc4\xfb\xaa\x98\x8b\xe5\xd8\x75\x9e\x8a\x2d\xf6\xd8\x12\x52\x83\x78\x15\x83\x18\xa9\x19\x6e\x1b\x14\xbc\x40\xac\x76\x4e\x56\x08\x32\x07\xfa\x73\x07\xbb\x7a\xca\x86\x5a\x67\x1d\x06\x09\x67\x3b\x6c\x94\x69\x0e\x7f\xe0\x64\x3b\xec\xe7\x5f\xc0\x92\x38\xe2\x89\xf8\xe7\xaf\x1d\x36\xe5\xf9\xcf\xf8\x53\xfc\x3d\x6c\x4e\x25\xb3\xde\x0e\xa7\x1c\x1f\xab\xe5\xb3\x8f\x4a\x22\x53\xb1\x5f\x76\xe9\x94\xa1\x83\x9b\xdd\x6a\xf5\x6c\x8a\x2f\x0a\x3e\x2a\xd9\x53\xb6\x3f\x29\xcb\xfc\xf4\xf0\xf0\x6f\x46\xab\xae\xf3\x2c\x2d\xc6\x87\x07\x6b\x6c\x35\x62\x26\x1b\xef\xb1\xdf\xb5\x1b\x0a\xd6\xa9\x1a\xec\xb7\xe7\x6d\xb1\xc8\x0f\xcb\xde\xde\x16\xdf\x69\x9d\xad\x1a\xd8\x42\x24\xfd\x4f\x39\xba\x2c\x7b\x3b\xb7\x54\x8f\x63\x05\x6e\xee\xe5\xfb\x98\x7d\xb9\x9a\xfd\x16\xa6\x41\x6f\xf8\x47\xd8\x1e\x4b\x2f\x64\xa7\x4a\x00\x9e\x51\x4f\xe3\x6d\x6f\xa0\x4a\x39\x13\x42\xcd\x29\xdf\xdb\xa9\xc9\xbf\x97\xa3\x73\x29\xe5\x54\x8a\x34\x21\x73\x2e\x22\xae\x92\x2b\x3a\xe6\xa5\xa8\xb5\xb6\x21\xee\xe1\x02\xc1\x3f\x22\xde\x76\xe9\x2e\x3e\xf5\xce\x59\x9e\x13\x22\xb7\x62\x81\x4a\x5a\xd8\xcb\xe7\x30\xbb\xb7\x05\xa6\x1a\x38\xab\xef\xfe\xed\xa6\x7a\x2f\x41\x46\xa8\x6a\xfa\xe9\x58\xc5\xbd\xf8\x03\x79\x58\x3f\x06\x7f\x58\xd0\x7f\x92\x55\x46\xde\x0a\x02\xf4\x5f\x44\xfe\xa5\xc6\xd5\xd0\x88\x54\xf7\x68\xc4\xcb\xd1\x0f\x7d\x9b\xb6\x8b\xf8\xad\xa3\xda\x1c\x95\x3d\x7a\xe4\xd0\xf7\x64\x20\x71\xb0\x47\xf4\x35\x0a\xa7\xf8\x3c\x76\xae\x97\x5e\x80\x8b\x8b\xd0\xc3\x48\xa4\xa7\x03\x35\x50\x5d\x36\x34\x5a\xe1\x61\x92\xe9\xa9\xe5\xc9\xc6\x63\xab\xb0\xf3\x17\x94\x50\x85\xb3\xe3\xa7\xf6\xd1\x5d\xf0\xa4\x14\x85\x61\x13\xf1\xc1\x99\xb2\xba\xac\x2a\xe4\xa9\x1d\xea\xfb\x77\xe7\x8c\x1b\x96\xf3\x82\xa2\x7b\xbf\xd7\x19\x57\x63\xa6\x44\x79\x58\x15\x59\xef\xc2\xfe\xf0\x0e\x9f\xfd\xb6\x6c\x97\x89\x29\x97\x19\xd4\x85\xbf\x18\x4f\xd3\x42\x18\xb3\xb0\x15\x5b\x08\x9b\x39\xa3\x92\x5d\x36\xd1\x06\x42\x81\xed\xd8\x51\x7a\x6f\xc0\xf1\x40\x3e\x06\xc5\xce\x01\x4f\x47\x94\x50\x81\xfc\x68\xb8\x89\xb3\x1c\xbe\x7b\xf5\x9c\xf5\x8f\x4e\xac\x08\x4f\xc9\x94\x4f\x7a\x7d\xf6\xf3\xbb\x57\xcf\xed\xb7\xbf\xf4\x58\x97\xc9\xfc\xf6\x29\x8c\xf7\xfc\xe2\xf6\x29\x3b\xbf\x58\x34\x52\x1c\xe4\xf9\x05\x56\xf9\xda\x55\xf9\x7a\xbd\x2a\x89\x4c\x0b\x3b\x9d\xe7\xe7\x2f\xde\x2d\x2f\x0e\x25\xba\x6c\xca\x13\x5b\xfe\xcd\xd9\xf3\x55\x24\xc4\x6a\xb6\x60\x97\x55\x15\xac\xb8\x62\xef\xdf\x9f\xbf\x20\x97\x71\x7c\x67\x56\x79\x8e\x81\xc4\x31\x79\xd0\x6b\x76\x2c\x3e\xb0\xfd\x6f\xe5\xc1\x7f\xfc\x7c\xd4\xfd\x86\x77\x47\xbf\xfc\xf3\x8f\xbf\x76\xbf\xf5\x1f\x9e\xae\xf7\xa1\x7f\xfc\xeb\xef\x68\x04\x27\x7e\x08\x27\x3b\x1c\xc3\x89\xff\x74\xb2\xce\x20\x9e\xfa\x41\x3c\xdd\xe1\x20\x9e\xd6\x07\xf1\xc7\x6f\xf8\xf0\x97\xf6\x71\x45\x43\x79\xe6\x87\xf2\x6c\x87\x43\x79\xb6\xe9\x50\xa4\x19\x2a\xdc\xb6\x97\xdf\xfd\xd8\x3f\x62\xba\xc0\xbf\x4e\x5c\x44\x12\x1d\x7f\x08\xd1\x1f\xec\x1d\x9d\x1c\xf7\xff\xf0\xac\x7f\xf4\xf4\xc4\xc5\x32\x7d\xf3\x87\x3f\x76\xfd\xb7\xfd\xc1\x1e\xb5\xd9\x3f\x8a\x5b\x5d\xdd\x16\xd5\x3a\x09\xb5\x16\x8c\xa0\xa5\xbf\xa4\x10\xa9\x2c\x13\x5e\x00\x63\xc3\x4f\xcc\x7e\x74\x2d\xb4\x52\xf2\x3f\xf6\xbf\x3d\x85\x95\x03\x5a\xec\x7f\x7b\x8a\x7f\x9f\xfc\x7a\xf0\xed\xc7\x67\x3f\xf7\xbb\xcf\x7e\xa1\x1f\x9f\xfe\xfa\xf1\xeb\xfd\x6f\x4f\x8f\xfa\xfd\x8f\x40\x5e\xfc\xfe\xc0\x57\xfd\x78\xf2\xf3\xd3\x3f\xb8\xc2\x27\xbf\x7e\x3c\xb1\x85\x7f\x3e\xea\x3e\xfb\xe5\xe3\xcf\x5f\xff\xb1\x5e\xba\xff\xeb\xc7\xfd\x6f\x4f\x8f\xfb\x27\xfd\x8f\xfd\x3f\x1e\x1d\x7d\x3c\x79\x36\x18\xa4\xb6\x4f\xfb\x9f\x7e\xff\xd7\x83\xdf\x85\x24\x67\x4a\x2b\x96\xca\xb1\x9d\x4b\xe0\xc8\x53\xf9\x01\x1d\x91\xbb\xcc\x18\xbb\x72\xec\x7d\xef\xb2\xc7\x8c\x4e\x24\xcf\x2c\x43\xab\x20\x69\x00\x4d\x3c\x5c\x0d\xd1\xbc\xb1\xc7\x9f\xbb\xec\x97\x6f\xed\x9f\xc7\xe1\xcf\xa7\xb0\x25\x26\xe2\x43\xa2\x33\x5d\xc0\x52\x4c\xc4\x07\x9e\x8a\x44\x4e\xd1\x1f\x5a\x17\x2c\xd1\xa9\x70\x8b\xf1\xd5\x2b\xf8\xdf\x69\x7b\x47\x5f\x7d\xbb\x4f\xdb\xed\xac\xfb\xca\x52\xf6\x63\xfc\xf1\x6b\x3b\xd9\x2e\x2b\xc6\xc3\xd0\xdb\xbb\xef\xbf\x9b\xeb\xa5\x18\x0f\x5d\x77\xc5\x78\xb8\x7f\xfc\xec\x59\x87\xfe\xff\x0d\xac\xfe\x70\x56\x8a\x53\x36\xe4\x46\x7c\xfd\x14\xb2\x2f\xa5\x76\xa5\xa5\xe2\xc5\x8c\x41\x24\x6e\x17\x92\xbe\xdd\x69\xd8\x1e\x6a\xe6\x01\x50\xfc\xc5\x66\xaf\x49\x4b\xc9\x14\x23\x54\xe2\xdd\x76\x7c\x74\xf4\x75\xf7\xa8\xdf\x3d\x3a\x1e\xec\x35\xae\x91\x51\x95\x65\x5d\xa8\x22\x95\xbd\x53\x4e\x4e\x4e\xbe\xb1\x8d\x55\x18\xcf\x00\x0d\xd2\xdf\xcd\x46\x8f\x99\x32\xd8\xde\x1c\xef\x2e\xe5\x54\x20\xf3\x7e\xe1\x2a\x03\x35\xa6\x39\x2f\xe5\x30\x13\xb8\x3d\x2e\x13\x9e\x45\xcd\x93\xc4\x80\x33\xb1\x2d\xf8\xd9\x00\x66\x66\x73\x4a\xfd\xa7\xdd\xfe\x71\xb7\xff\xec\xaa\xff\xcd\xe9\xc9\xd1\xe9\xf1\x51\xef\xe8\xe8\xe8\x7f\xcd\x4d\xd0\x36\xd0\x85\x06\xc2\x04\xb7\x70\x07\x90\x73\xfe\x8c\x5b\x03\xc9\x3d\xf4\xcb\xe4\x6c\xb1\xc4\x3d\xe5\x1f\x5a\xf5\x49\xb5\x04\x1c\x5f\x3f\xdd\x22\x01\xc7\x94\x7f\x78\x2d\xd4\x78\xde\x4b\x62\x27\x4d\x2f\xd6\x35\xed\xa4\xf9\x36\xb9\x3d\x34\x9c\xea\x6a\xd8\x34\x08\xba\x96\x91\x43\x2d\x68\x58\xaa\x87\x22\xb6\x54\x0f\x46\x6c\xa9\x1e\x94\xd8\xed\x8f\xa4\x1d\x10\x9b\xd2\x93\xcd\xeb\xcd\xee\xdf\xb6\xd2\x8f\xa1\xc3\x6a\xd5\x9d\xd4\x86\x51\x65\x19\x1f\xce\xbf\x97\xd7\x7a\x61\x6a\xd5\x42\x9a\x7f\x3d\x95\x62\xce\x4b\xfb\x30\xda\x86\x17\x53\xd5\xc5\xbb\xfb\x73\xd0\x2b\xdd\x4f\x95\xb4\xc0\x80\xf1\x9b\x98\x5b\xe4\xcb\xb5\xce\x1e\xde\x21\x48\x56\x29\xcb\xc5\x87\x6e\x53\xc0\xe6\xb5\x6c\x93\x80\x7d\xdd\x7a\x77\xac\x75\xd6\x6b\x40\x9b\x62\x3a\x14\x69\x2a\x52\xef\x65\xbb\x42\x9f\xb3\xbc\x72\xe4\xf9\xe3\x92\xba\xa3\x3f\x1f\xa6\x7c\xa5\xe2\xec\x07\xdf\x04\x2b\x2a\x05\xd2\xe0\x5b\xf2\xba\x02\xc9\xef\x6a\x96\x8b\x37\x82\x00\x68\x42\x8a\x06\xd4\x04\x01\x70\xb5\xf3\x6f\x76\x3e\x18\x88\x6e\x48\x2e\x8c\x10\x39\x56\x15\xe0\x42\x51\x08\x4b\xca\xa4\x24\xa7\x5c\x1a\x80\xab\x86\x78\x37\x8d\xc4\x49\x35\x74\x1b\xaf\x61\x62\xbc\x2a\xf5\x94\x97\x0e\x66\xa3\x46\x88\x05\x08\x36\x8d\x31\x0d\x05\x05\xcc\x0d\xab\x92\xa5\x5a\x18\x08\xc3\x9d\xf0\x5b\x41\xbf\xca\xd8\xad\xc3\x56\xc6\x1c\xdb\x01\xf1\x67\xbf\xca\x6d\xd1\xe6\xb0\x03\x64\xcf\x22\xec\xa6\xf5\x37\x84\x54\x65\x57\x17\x5d\xda\x80\x1b\x6c\x86\x5a\xc5\x28\xd6\x94\xb6\x82\xc7\x8c\x94\x86\x09\x09\x6b\x13\xe5\xb0\x83\x34\xa3\x4e\x19\xe8\x72\x85\x52\x08\x56\x07\xf7\x4e\x5e\xce\x98\x4f\xd2\x46\x44\x85\x60\x68\xfb\x1d\x37\x2c\x99\xc8\x2c\x45\xbc\xea\xd9\xdb\x11\x40\x83\x8a\xc2\x25\xa5\x1b\x45\x8f\x37\xad\x7c\xb4\x5c\xf8\x92\xd8\xbf\x01\x45\x62\xff\x00\x1b\x39\x1d\x28\xc6\x58\x17\xba\x38\x75\x63\xad\x7d\x87\x43\x1e\xa8\xe3\x03\x06\xc6\x45\x57\x23\xaa\xde\xde\xc0\x7c\x13\xf0\x55\xaf\xd7\x63\xff\x10\x85\xb6\x04\x99\xea\x62\x81\x34\xb2\xfe\x6a\x66\xd2\x94\xdd\x29\xcf\xbb\x37\x62\xb6\x2a\x6e\x78\x71\x45\x06\x98\xc8\xe0\x9d\xc5\x15\xf9\x0e\xc3\x41\xb5\x34\x9c\xaf\x06\x2b\x72\x3d\xe5\xf9\xb5\x7d\x61\x51\xbc\x8e\x7b\x36\x43\x7b\x10\x0b\x45\xe0\xa1\x52\xa5\xe2\x83\x5b\x90\x29\xcf\x7b\x76\x05\x00\x42\xaa\xe4\x63\xcc\xa6\xe4\xc2\x29\x5d\x4a\x5c\x04\x06\x80\x8d\x85\xa7\x67\x62\xdf\x7c\xed\x03\x19\xec\x31\x7f\xed\xb8\x20\x8b\xc1\xde\x94\xe7\x83\xbd\x1e\x3b\xcb\x8c\xee\x04\x3e\x65\xa2\xa3\xe6\x01\x43\x03\xaa\x69\x14\x54\x61\x9f\xa6\x05\x2c\x60\x4a\xa1\x15\x2e\x04\x0e\x76\x21\xc6\x53\x54\x85\x60\xfb\x4a\x33\x25\x8c\x33\x13\x7a\x87\x8b\x03\x9a\xa6\x60\xe1\x56\x8e\x7a\x87\xae\xe8\x98\x40\x9c\x3e\xe5\xed\xd2\x05\xce\xb8\x61\xa9\xec\xd8\x59\x01\x8e\x80\x25\x86\x36\xb5\x56\x2d\x1b\x23\x25\x32\xea\x8f\xb3\x8c\x80\xc9\xed\x15\xf2\xe8\xa0\x92\xed\xcb\xb4\xf1\xde\xc4\x63\x3f\xbf\x2f\x23\xde\xef\xe2\x1c\x99\x04\xcf\xbc\x5c\x67\x7a\xec\x12\xb4\x87\x3d\x51\x4b\xd2\x5e\xdf\x61\x0e\xa6\x1e\x48\x7e\xc2\x72\x6d\x0c\xa8\x27\x70\xb3\x38\x56\x71\xcd\x4b\x3d\x95\xc9\xf5\x69\x00\xa7\x02\xce\x25\xf0\xda\x30\x21\x6e\x1d\xf3\xbe\x77\x50\x49\xe1\x76\x51\x8f\xf8\xc1\x19\xb4\x42\x3d\x83\x93\xfb\x10\x6b\x14\x22\x9b\xb1\x42\xe4\x19\x4f\x5c\x04\xa1\x87\x26\xaf\xcf\x85\x5a\x22\xe8\x13\x9f\x40\x5a\xcd\x7c\xb6\x07\x18\xdd\x3e\x6e\xcf\x0e\x0d\xa0\x63\xb9\x8e\xdd\x8f\xc7\x07\xec\xda\x88\xf2\xda\xf1\xad\x4b\x51\x06\xb8\x2b\x97\xed\xd3\x52\xcb\x5f\x5b\x3e\xeb\x33\xc2\xdd\x7b\x9e\x00\x89\x9f\xc9\xe7\xe8\x25\x4f\x26\xd4\x20\x5e\x00\xcd\x63\xd4\x09\x19\x06\xb0\x85\xda\x62\x5b\x1e\x84\x0c\x85\xc8\x0c\x77\x85\x9b\x6a\xc4\x8b\x16\xf1\x21\xaa\xd6\x1b\xa8\x93\x03\xe4\x4a\x6e\x7e\xe8\x0d\x45\x4b\x5d\x90\x26\x6e\xca\x73\x83\xf1\x07\x28\xc1\xc8\x82\x89\x4c\x00\xdc\xab\x3b\x7a\x4a\xab\x2e\x72\xad\x1b\x31\xa3\xb6\x1c\x18\x8d\xcb\xf9\x6b\xab\x4e\x7b\xec\x2d\x62\x89\x45\xf0\x78\xac\xca\xc1\xbb\xb1\xa0\x08\x4f\xdb\xa1\xe5\x74\x6e\xed\xda\x76\x23\x39\x48\xc2\x34\xfd\x60\x2c\xc3\x81\x55\x45\x59\x66\xa0\xe2\xc0\x79\x9c\x34\x1e\x77\x4b\xa2\x6d\xa2\xba\x5b\x97\x61\x93\x73\xea\x97\xae\x76\x4c\x69\xa5\x77\x70\x4e\xe1\x28\x38\x91\x80\x9a\xad\x1d\xd9\xe3\x85\x47\x76\x5c\x70\x55\x65\xbc\x68\xec\x05\x58\xfc\x00\x35\x84\x9f\xf7\x6f\xc4\xac\x8b\x5b\x37\xe7\xb2\x30\x07\xd0\x09\x64\x28\x26\x31\x0f\xac\x95\xca\x39\x25\x94\xd4\x24\x44\x24\x43\x31\xf4\xe6\xdd\x07\x28\x95\xc4\x0a\x33\xf6\xcb\xa1\xed\x4e\xc9\xbc\xca\x38\x05\x4c\x18\x91\xf3\x82\x97\xd0\xbb\x2e\x4c\x00\x39\xa7\x06\x63\x18\x82\xa1\x98\xf0\x5b\xa9\xab\xc2\xb3\x74\x3b\x56\x3a\xc4\x3b\x65\x48\x40\x83\x35\xf9\xd1\x3d\x37\xd9\x02\x31\x7a\x93\x3d\xb7\x48\x12\x37\xa5\xce\x03\x74\x2b\x81\x4e\xa4\x22\xd1\x29\x48\xab\xa5\xc8\x71\xbd\xc8\xb7\x76\x4d\xe8\xcd\xc8\x31\x97\x9c\x06\x71\xc9\xf8\x68\x04\x10\x3e\xd4\x4a\x21\x92\xaa\x30\xf2\x56\x64\x33\x14\xfe\xcd\x9d\x2c\x93\x89\x30\x6c\xc8\x13\xc8\x4d\x8a\xb8\xec\xbe\xf7\xb0\xba\x72\x04\xe2\x83\x48\xe3\x1b\xdd\xae\x78\xcb\x8b\xbd\x8e\x97\xe2\x01\x36\xe2\x81\xc1\xee\xf3\x62\x05\x80\x6b\xc6\x3e\x4e\x3d\x4c\x43\x04\x4f\x0f\x5d\x0c\x65\x9a\x8a\x45\xa9\x88\xe6\x65\xd0\x7f\x6b\xac\xee\xc3\xf9\xc1\xb6\xe8\xb3\xd7\xf6\x0d\xa5\x0a\xf5\x84\x9f\x78\xba\x31\xba\xae\x46\x21\xf4\x22\x8d\x5d\x4b\xd1\x00\x8f\xf7\x8e\x1e\x35\x7f\xee\xb1\x37\x5c\x5a\x1e\x05\xb1\x71\x94\x89\x1f\x22\x68\x09\x67\xaa\x2a\x20\xa8\xe9\x81\x5c\x64\xc9\xf9\x71\x03\x62\xd8\xf2\x31\x2d\xda\xa6\xcb\x68\xad\xdd\x8d\x1e\x5f\x34\xb0\x85\x5c\x2c\x96\x2b\x47\x5b\x75\xf6\x60\xb3\x8c\xbd\xab\x36\x98\x6c\x54\xad\xbe\xfe\xad\xb3\xa6\x97\x2c\x2c\xf5\xae\x66\x72\x29\x8a\x5b\x99\x88\x77\x0e\x33\x69\xc9\xe8\x9b\x45\xd9\x44\xc3\x5d\xe3\x1d\xe7\x41\x6b\x40\xa5\x7a\x99\x18\xf3\x64\xd6\x4c\x7a\xb2\xd0\x67\x79\x43\xc4\x96\x18\x70\xda\x50\x8f\x3e\x99\xf0\x96\x68\xd1\x39\x5f\xa9\x6c\xf2\xe5\xe2\x71\xe0\x17\xbb\x1b\x4c\xbe\x3a\x76\x17\xc3\x16\x51\x7a\x21\xe8\x53\xf6\xfe\xdd\x6b\x0c\x67\xe4\x25\xdd\x12\x76\x3c\x2e\x2d\xb3\xbb\x2f\x21\x94\x3e\xd9\xee\x6a\xb4\x0f\xc5\x55\x03\x83\x24\x03\xf5\x81\x11\x49\x18\xfc\xb6\xe6\xe0\xd8\xb5\x2d\x7d\x1d\xa1\x95\x38\xff\x23\x68\xc5\xe1\xb6\xf6\xbb\x5f\x3f\x7b\x76\xf2\xac\x83\xf9\xe1\xec\x85\x76\x50\xe7\x06\x4f\x9f\x82\x67\x17\x5c\x6b\x77\xbc\x48\xbd\x4d\x17\x80\x86\x76\x93\xd6\x7f\xee\x9a\x59\x8c\xd4\x81\x7b\xac\x09\x54\x44\x1f\x1f\x38\x62\xd7\xa5\xf3\x06\x58\xa8\xe7\x5a\x8d\xe4\x78\xc9\x61\x6f\x29\x1d\x60\x18\x50\x4b\xe2\x73\xa7\x5b\x42\x4f\x31\x76\xf5\xea\xf5\xa5\x2d\xa6\xc8\xc5\xcb\xbf\xbf\x5c\xc2\xef\x75\xf2\xf8\x7c\x57\xa9\x74\x5e\x81\x3d\x97\xc5\x07\x8b\xa1\xab\xf3\xc5\xcb\x37\xde\x09\xe1\xf9\x19\x1b\xe2\x4f\xb8\xd1\xdc\xe6\x72\x0f\x22\xa7\x40\x8d\xc7\xf5\xc4\x38\x09\x2c\xb1\x63\x82\x68\x0c\x01\x7a\xbf\x4a\x45\x78\x6f\x66\x66\x4a\x31\xb5\x57\x8c\x29\x59\xa1\xb5\x7d\xf4\xa0\x4c\xe3\x17\xc0\x83\x38\x2f\xdc\x5b\xc3\x59\xb9\x40\x8b\xb6\x34\xbc\x1f\x0f\xd1\x03\xdb\xf5\xe6\x6e\x83\xa5\x81\x92\x74\xae\xe5\xdc\x1d\x10\x31\xc2\xa0\xb6\xf2\x39\xdf\x5f\xa2\x30\xe3\x0a\x58\x71\xaf\xc8\xfc\x23\xdc\x93\x1b\xf4\x51\x04\x5f\xed\x18\x85\x04\xfd\x3c\x48\xa4\x76\x6b\xb9\x48\x7e\x44\x00\x27\x64\xe4\x99\xae\x1c\xdb\xa8\x8c\x40\xfc\x2c\x99\x88\xeb\x05\x6e\xe9\x2d\x81\x55\x8d\x79\xda\xd1\x8d\xe5\x2d\x45\x82\x66\x94\x3f\xc5\x31\x7c\x1a\x5a\x07\xf1\x47\xb8\x4a\x2d\x97\xb1\xbc\x18\xd2\x1c\xec\x5f\x83\xb4\x2b\x4e\x0f\x0f\x27\xda\x94\xa7\x96\x7b\x1d\x5a\x2e\x7d\x7d\xd0\x63\x2f\x23\x00\x25\x3d\x62\xd7\x55\x91\x21\x14\x8b\x1b\xf2\x02\xa2\xd8\x47\xfa\xb5\x6d\xce\xf3\x47\xfb\x16\x80\x15\x80\xa7\xb6\x27\xad\xa3\x55\x9d\x4e\x7f\xa2\xa4\x49\x11\x6d\x1c\x90\xa8\x32\xa5\xe0\xe4\xe0\x0a\x9e\x9c\x53\x39\x9e\x10\x30\xa7\xd1\x99\x03\xb1\xf2\xa1\x71\x2f\x7e\xbc\x84\x79\xeb\x69\x74\x04\x0c\x26\xc6\xea\x60\x6e\x99\xb0\xef\xae\xad\x28\x8b\x23\x85\xb6\x98\x54\x5d\x1a\x12\x34\xc4\x1d\x74\x6a\x60\xf9\x19\x9f\x09\x4c\xc5\x27\x75\x06\x64\x3f\xe8\xb9\xa9\xdb\x47\x35\xcf\x0c\xd8\x29\xc0\x01\xd4\x79\x67\x02\x8d\x2e\x32\xc1\x0d\x3c\x92\x48\x8c\x06\x2c\x48\x76\x6d\x97\x2f\xc3\x06\x2c\xa5\xfb\xc7\x7f\xe8\x1d\xf5\x8e\x7a\xfd\x6b\x7c\x86\x52\xdb\x76\x9f\x49\x73\x33\x63\x95\xca\x84\x31\xb0\xa7\x20\x3a\x1f\xb0\xea\x58\x02\x78\xc0\xda\xd2\xb7\xb6\xb7\x19\x06\x13\x02\xe9\xdc\x53\xcd\x96\xb1\xf2\xb9\x67\x10\xf8\x35\x12\x56\x09\xe4\x49\xc0\x3d\x21\x39\x95\x87\x2b\xf4\xc7\xe5\xb2\x4a\x26\x98\xf5\xca\xfe\xec\xd4\x42\xd9\x8c\x4c\x34\x4a\xab\xae\xdd\x55\x7c\x98\x09\xf4\x27\xee\xc0\x76\x10\xdc\x40\x11\x80\x17\xa9\x72\xbb\x4c\x9c\x29\x71\xe7\x76\x81\xdf\x49\xb8\x41\xfd\x56\x1b\xec\x01\x5a\xce\x60\xef\x4f\xb0\x45\xec\x4e\xa6\x9f\xc6\x92\x18\x3a\x15\x39\x3d\x3c\x1c\xec\x41\x33\x67\xcc\x09\x24\xee\xd2\x27\xb4\x82\x91\xd7\xf3\x92\x0a\x90\x2b\x87\x41\x83\xc6\x10\x52\x86\xc0\xe0\xde\xbf\x7b\xdd\x63\x7f\xd5\x15\x94\x75\x5b\x14\x1a\x2e\x35\x38\x93\xe1\x3b\x67\x28\xcb\x82\x17\xbe\x19\x62\x37\xfe\x18\x62\x90\x26\x38\xea\x77\x18\x77\xb3\x75\x6a\x30\x49\x13\x3f\x2b\x4b\x31\xcd\x5d\xea\x09\xdb\x19\xe5\xa7\x01\x59\xc1\xc8\x84\xf1\xaa\x9c\x20\x14\xe0\x60\xcf\xfe\x72\xea\xdc\xd9\xfe\xc7\x60\x0f\x31\x46\xca\x80\x50\xf2\xaa\xe0\x63\x54\x82\xed\x0f\xf6\xbe\xea\xf5\x7a\x83\x3d\x54\xca\xfc\xbd\x12\xc5\x8c\xe5\xbc\xe0\x53\x01\x9e\x84\xfb\x83\xbd\x6f\xdd\xef\xf4\x88\xa7\x56\x3a\xf4\xca\xdb\x1a\x3d\xe4\x41\xa5\x86\xb6\xb4\x3b\x8b\x64\x86\x38\x09\x4e\x2d\x19\xbc\x86\x3d\x0e\x78\x4f\xbe\x08\x2d\xdc\x1a\x82\x41\xbb\xe0\xf2\x10\xd7\x60\x9b\xa8\xb4\xec\x26\x8c\x87\xe6\x5e\x06\xf6\xc4\x16\x55\x82\x48\xdc\x76\x53\xc6\x14\xa8\xdd\x69\xe0\x13\xc9\x4b\x31\x9e\xd9\xba\xd7\xd4\xf9\xa2\xfb\x2a\x90\xee\x9d\xb8\x95\xe2\x6e\x4d\x24\xeb\x45\xd5\x9c\xb0\xee\xd2\x37\x50\xdc\x7b\x0e\xb7\x89\xfd\xe6\xfa\x79\xa3\xe6\x75\x40\x74\xb6\xd3\xa0\xe1\x32\xf1\x01\xe0\xc4\xf1\xee\x88\x54\x5a\x51\x96\x3e\x41\x29\x14\x3c\x84\xa8\x0a\xfa\x40\xe4\x8a\xb2\x74\x06\x29\x07\xbd\x1b\x4c\xa3\x21\x71\x44\x5d\xa1\x44\xf8\xcf\xf5\xf0\x61\x36\x9c\x45\x83\xe8\xd4\x36\x9c\x1d\xd0\x88\xcb\x6c\x61\x6e\x1d\xdb\x33\x0f\xb8\xdd\x7e\x8a\x09\x2c\xb0\xf7\x2e\x0d\xe0\xc5\x2e\x2b\x89\xc7\xf3\x56\x69\x30\xa7\xbb\xd4\xd5\x10\x00\xed\x4a\x60\x70\x09\xf1\x2e\x3b\xd0\x4b\x37\xd0\x70\x09\x34\xde\x47\x76\xc8\x9f\x08\xe4\xba\xfd\x41\xb3\x70\x27\x3e\xca\x7b\x06\x10\x59\x57\x61\x19\xaf\x0b\xff\xd0\xac\x18\x2f\xae\x03\x77\x26\xdd\x99\xdd\xd3\x00\x17\x94\x17\x52\xd5\x13\x8d\x2f\x64\x5d\xff\xef\xe5\xdb\x1f\xd7\x40\xe4\x72\xc5\x28\x09\xb1\x84\x74\x1e\x01\xa6\x68\x1f\x82\x85\xd0\x51\xbd\x86\x96\xe5\x60\xf2\xa4\x61\xe2\x96\x67\x15\x6a\xd5\xc7\xf6\xa9\x56\xa2\x6a\x7f\x0e\xb6\x4b\xb3\xbc\xd0\x69\x95\x88\xc8\x27\xc6\x4b\xea\x38\xe1\x2d\x14\x04\x4b\x42\x03\xe7\x62\x5c\xfd\xc7\x28\xc5\x3f\xf3\x29\xfe\xe3\xdf\x1d\xb6\xeb\xd6\xc3\xda\x3c\x2e\xcc\xeb\x2e\x5c\x80\x18\x18\x75\xc2\xdd\x32\x47\x2b\xe0\x7a\x4f\xec\x6b\xfe\x09\x8b\x5a\xca\xf3\x4c\xa2\x84\x07\xb2\x0c\xa1\xbb\x04\x59\xc4\xed\x2d\x2b\xb5\x1b\x43\x90\xf6\x2e\x6d\xa3\xb3\xdc\x01\x2c\x2b\x96\xa3\xbb\xc5\xaf\xa3\xed\xb0\x8e\x87\x3e\x96\xe5\xa4\x1a\xf6\x12\x3d\x3d\x7c\x7b\x76\x7e\x48\xe3\xef\xd6\x40\x06\x0e\x87\x99\x1e\x1e\x4e\xb9\x15\x8c\x0e\x1d\x4b\x3a\x3c\xee\x1d\xf5\xa6\xe9\x57\x29\x2f\x79\x17\x01\x19\x56\x67\x89\xda\x11\x06\xf3\xdc\xf2\xc3\x0f\x9e\x3d\x6f\xbb\xee\x79\x21\x75\x21\xcb\xd9\xca\x04\x68\x58\x8c\xd6\xde\x79\x00\xe1\x6a\xfb\xd8\x0a\xfb\xfc\xb0\x6f\x96\x29\x08\xdb\xca\x69\xfc\xfc\x16\xa0\x7c\x3d\xb8\xda\x60\x5f\x33\x3d\xf6\x5a\xdf\xf9\x2c\x43\x28\xbb\x27\x1a\xc0\xc6\x6c\xb9\x89\x1c\xdb\x77\xb0\xeb\xbe\xc7\x1c\x2c\x3e\xda\xb5\x51\x60\xd6\xce\x61\x48\xb1\x4c\x4e\xa5\xfd\x13\xf5\x8d\x26\x11\x8a\x17\x52\x9b\x48\x47\x86\x20\x77\xdc\x37\xe9\xa1\xb5\x01\xb7\xa7\x89\x4b\xb7\xa5\xba\x6b\x85\xc3\x60\x83\xb8\xde\x41\x4a\xad\x7f\x96\x3e\xa3\xfd\xbc\x81\x6e\x6f\xaf\x49\x98\x4e\xcb\x05\xf0\x09\xaf\xc6\x35\x04\xf8\x45\x55\x5a\xe4\x78\xf8\xad\x8c\xb2\xd9\xc4\x19\x51\x38\x7b\xfe\x6e\x1d\x55\xdf\x17\x51\xf6\xbf\xb1\x28\x5b\xd3\xd3\x5f\xff\x3c\xd8\xa3\x8d\x3b\xd8\xfb\xe5\xf1\x93\x9b\xbb\x17\xd8\x4a\xcc\x54\x7a\xa8\x05\x8a\xd9\x03\xd1\x9a\x0a\x80\x8e\x88\x5d\x40\x51\xde\x09\xa1\x3c\xc9\xda\xf2\x18\x9e\xb2\x2e\xbb\xfe\x51\x2b\x71\x7d\x8a\xd9\x05\xa8\x76\x81\x1e\x26\x08\xc9\xe6\x54\xcd\xb1\x73\xf0\x9d\x57\x00\x96\x1a\xb2\xca\xa9\x19\xb9\x77\x38\x9d\x5e\xfb\xc6\xe8\x86\x97\xe6\x69\xb4\x6c\xb8\x40\xf8\x48\xd5\x35\x18\x2c\xb7\x82\xa5\x66\x29\x81\xca\xf9\x9d\xd8\x63\x67\x21\x81\x4b\x64\x19\x18\x28\x06\xba\x12\x21\xd2\xd8\x83\x11\xc5\x2b\xf2\x00\xd8\x10\x5d\x04\x35\x4b\x50\x36\xea\xff\xae\xc5\x5c\x81\x95\x8c\x68\xa6\x06\x5a\x47\x74\x68\x69\xef\x61\x75\x0e\xc8\xb3\x37\x55\x3c\xb4\x4d\x7b\x67\xfa\x07\x6f\xc2\xa4\x8c\x21\xae\x14\xa8\x47\xc9\x71\xb5\x55\x5b\xb1\xe6\xa5\xe9\xcf\xdc\x27\xbb\x14\xb7\x78\x29\x46\x6f\xc4\x9a\xc1\xbe\x8e\x91\x19\x44\x32\x97\xb3\x9d\xec\x44\x81\x91\xf7\x18\x3b\x2f\x0d\x4a\xba\xe0\x53\x3c\xf4\x28\xc3\xf4\x80\xc0\xac\x20\x00\x44\xdd\x0b\xe9\xd8\x7b\xf1\xd7\x51\x12\x11\xcb\x4f\xe3\xbc\xb6\xb7\xfd\x5e\xff\xeb\x0e\xcb\x33\xae\x14\x9d\x3d\x48\xae\x05\x07\xd4\xfe\x7a\x7c\xdc\x63\xef\x0d\xf0\x93\x88\x50\x68\xaf\x3f\xbc\xed\x2f\xce\xe3\xec\xac\x04\x6b\xe4\x8b\xf2\xac\x6a\x05\x5f\x3d\xbb\x38\xff\xa9\x91\x37\x3b\xba\x27\xad\xcc\x8b\xa8\x69\x4e\xe4\x6e\x80\x50\x80\x8f\xbd\x8f\xa1\xb8\x24\x2b\x04\x2d\x82\x13\x55\x0a\x91\xe8\xb1\x02\xe4\x78\x6c\xcd\xdf\x4d\x19\x2f\x05\x3c\xbd\x88\xd3\x91\x07\xb3\xf3\xdc\x2b\x04\x38\xf2\x55\x2a\x6a\x01\x19\x77\x2b\xc8\xfc\x58\x96\x8e\x8a\x89\x9e\x4e\x2b\x25\xcb\xd9\x21\x24\x62\x93\xc3\xaa\xd4\x85\x39\x4c\xc5\xad\xc8\x0e\x8d\x1c\x77\x79\x91\x4c\x64\x29\xc0\x33\xdb\xe5\xa8\xba\xb5\xaf\x3e\xbb\x14\xd3\xf4\xab\x05\xd9\x28\xd6\xe1\x60\x90\x3c\x7e\x39\xd5\x7f\x90\x8a\x12\x9a\x90\x2e\x1d\xf5\x00\x9e\xb8\xee\xf1\x03\x39\x4b\xa2\x0d\x1e\x9c\x1b\xc3\x11\x08\x64\xb7\x24\x93\x6a\xe4\xf2\xdf\x50\xd6\x37\x11\x30\x4d\xd1\x14\x65\x39\x16\x33\xd5\x70\x2a\x4b\x13\xc3\x95\xf6\xd8\x73\xb4\x12\x0d\x45\xf0\x2a\x3e\x57\xec\x39\x9f\x8a\xec\x39\x64\xe5\x7f\x60\xa2\xc3\x63\xa1\x6b\xe9\xb7\x05\xd9\x5d\xdc\xcb\xa6\xb7\xc5\x94\x27\x13\xa9\x44\x31\x0b\x1c\xcc\x36\xd5\xbb\xed\xf7\x42\xbc\xd1\x62\x68\xfe\xc7\xb8\x9c\x96\x25\xfb\x5f\x6e\x28\xce\x45\xd2\x7c\x42\x4c\x04\xda\x5b\xee\xb8\x2a\xeb\x4a\x0d\x74\x17\xce\x73\xc1\x17\xbc\x3a\x1f\x03\x41\x78\xc5\x8c\xb7\x44\x11\x26\x27\xde\xf5\x12\xa9\x6e\x7e\x9f\xda\x75\x58\x75\x97\xfa\xef\x6b\x4e\xaa\x70\x8f\x74\x89\xdd\x76\x89\x75\x84\xa6\x6b\x84\xc6\x74\xb8\xa7\xc0\xdd\xe7\x2e\x8e\x3a\x4d\xa8\xa1\x85\x57\x68\xbd\x74\x78\x9f\xba\xa7\xc0\x3c\x0d\x7e\x79\x04\x59\x20\xe4\x19\xdd\x5c\x28\xf0\x75\x83\xb3\x0c\x69\x1c\xa2\x27\x5a\x01\x0f\x66\x9f\xa8\xd5\xdf\x6a\xb9\x5e\xe7\x52\xcd\xb8\x29\xaf\x0a\xae\x0c\x54\xbe\x92\xf3\x5a\xb6\x7b\xf0\x1a\x68\x6e\xd9\xbe\x9e\xef\x9d\xd9\xaf\x10\xf2\x82\x1e\x05\x34\xad\xd2\x17\x73\x09\x3d\xed\x13\x98\x0e\x46\xc8\x3b\xba\xc0\xce\x35\x15\xc6\xac\x4e\x76\x45\xa5\x22\x25\x62\xd7\x2b\x11\xfd\x6f\x78\x06\xed\x6d\xe6\xd6\x82\x0f\x75\x55\xd2\xc0\xfd\x28\xb7\x78\x26\x14\x82\x9b\x95\xc2\x0d\x16\xc2\x21\x62\xa8\x6c\xc7\x52\xa2\x7b\xa7\x8b\xb4\x13\xee\x35\x46\xe5\x82\xda\x93\x08\xf9\xc4\xec\x60\xa4\xed\x4c\x73\x01\xd3\xaa\x01\xe5\xbb\x38\x32\x37\x1c\xb8\xa0\xed\xed\x7c\x05\xa1\x90\xaf\xf0\x51\x46\xef\xb5\x2d\x46\xb6\x81\x12\xb1\x74\xd1\xb6\xf3\x63\xba\x02\x0d\x9f\x53\x50\xbc\x34\x25\x1f\x66\xd2\x4c\x44\xda\x61\x90\xc2\xf9\x8c\xf2\x39\x83\x54\x77\x25\x8a\xa9\x54\xbc\xdc\x20\x15\xce\x9a\x3c\xb8\xa9\xf8\x23\xb2\x7f\x06\x2f\x9c\xd7\xd2\x94\x5b\x30\xb4\xd7\x14\xac\x11\x20\xd1\x17\xbe\x0b\x28\x4d\xf0\x97\x77\xc1\x67\xfd\x2e\x68\x85\xf8\x69\x90\x1d\x83\xe7\x30\x4e\x47\xa5\xf2\x56\xa6\x56\x6c\x59\xb5\xf0\x9f\x20\x97\xed\x8a\x47\xfd\x7d\x34\x82\x5f\xde\x4f\xbf\x95\xf7\x93\x65\x61\x8d\xd7\xd3\x9a\xdc\x1c\xf7\xf0\xbf\x94\x48\x0d\x6c\xfe\xb3\x14\xab\xe1\x1a\xde\xe2\x06\x82\x7a\x8d\x87\x14\xf8\xd2\xc7\xd9\xa1\xa4\x59\xfc\x90\x5a\xc3\xe5\xbc\x14\x63\x5d\xb4\xc0\xd0\xcc\x39\x9d\xbb\x82\xf5\x2b\x11\xd6\x4f\xa4\xac\x91\xf9\xb3\xe9\x75\x31\x14\x99\x56\x63\x18\x37\x78\xc8\xb2\x27\x3c\xcb\x9e\x84\xa8\x4a\x96\x57\x24\xb4\x30\xa9\x40\x55\x98\x4a\x93\xe8\x5b\x51\xcc\x7c\xba\x09\x83\xf7\x4f\x45\xf8\x75\xce\x57\xc0\x92\x02\x0d\x46\x4c\xaa\x5b\x72\x51\x36\x18\x46\x09\x6e\xb8\x49\x99\xb1\xb1\x00\x67\xc3\xc7\xb7\xae\xac\xc1\x4b\x6f\x88\x97\x92\xeb\xb8\xcb\xf1\xe8\x50\x03\x63\x05\x81\x03\x57\xc1\x10\xc5\x6c\x16\x89\xd0\x60\x1a\x90\x6a\x5c\x65\xbc\xe8\xd1\x8e\x88\xf2\x5a\x29\x03\x96\x7b\x13\x5b\xf2\x3c\x0c\x08\xa1\x3f\x5c\xdb\x2e\xaf\x23\x90\x05\x5a\x0a\xb0\x66\x6d\x21\xde\xda\x3d\xf2\xc3\xea\xf9\xbb\x62\x2b\x68\x00\x3b\xce\xdb\x51\x02\x45\x62\x5b\xda\x60\x0f\xe7\x60\x59\xc1\x60\x6f\x1b\xbf\x89\xac\x2a\xf8\x2a\xaf\x78\x2c\xe4\x86\x4b\x9f\xe2\xb0\xac\xd8\xd9\x08\x8e\xe9\xba\x69\xb3\x37\x4d\x93\x4d\xdf\xe3\x10\xf0\x6b\x97\xc6\x74\xca\x4b\x0a\x35\x8a\x47\xb6\x50\x90\xd9\x8f\x14\xf0\xec\x1a\x9b\x05\x56\xd3\x8b\x1b\xef\xcd\x8d\xec\xfa\x20\x4a\x52\x98\x65\x2c\xd3\x77\x88\x26\xbb\xcd\x43\x6d\xa2\x8b\xb2\xc9\x2b\xdb\x16\x20\x14\x44\x12\x4e\x20\x30\x0a\x3e\xbb\x27\x64\xc8\x6d\xe8\xcc\x10\x0f\xc6\x57\x90\x26\x30\x88\x60\xab\xb8\x86\xa3\x3a\x5d\x83\x32\x8f\x60\xe1\x25\xb6\xb0\x8a\xaa\x54\xcc\x9f\x43\xf7\xb9\x6d\x6b\x2f\x99\x5e\xed\x44\xfa\xaf\x53\x62\x2f\x3b\x7e\x75\xd2\x81\x6d\x72\xdc\xcf\xe0\xd5\x79\x59\xd7\x4d\xaf\x7b\xe7\x5f\xce\x6b\x8c\x79\x43\x5f\x2c\x8b\x1a\x87\x21\x85\xf1\xea\xa7\x67\x14\xa6\x0e\x0f\x3b\x72\xba\x5a\xb1\x2d\x16\x55\x8b\x5d\x27\x82\x05\x3c\xa1\x1f\x31\x55\x1e\x1e\xbb\x2b\xd0\x49\xe9\xaa\xcc\xab\xb2\xee\xe2\xd4\x92\x95\xd8\x47\x53\x1d\x42\xd8\x0a\x64\x23\x26\x49\x3b\x11\x79\x69\x0e\xbf\x2a\x44\x22\xe4\xad\xfd\xcd\x73\xd2\x2e\x37\x5d\x08\x03\xa9\x7b\x3a\xb1\x73\x1f\x85\xd1\xa1\x27\x05\x38\x06\x38\x17\x10\x61\xfc\x78\x1d\x72\x43\x70\x54\xb8\xd2\x79\x37\xb3\x92\x3f\xe6\xf9\x12\x85\x93\x68\x7d\x1d\x0e\x19\xe1\xcb\x0a\x6e\x62\x9f\x5c\x80\x5c\x5e\x58\xe9\xeb\xeb\x62\x61\xf5\x28\xc2\xce\x03\x41\x90\x53\x5d\x2a\x4d\x9e\x71\x8f\xd5\xc4\xc7\x62\x41\x6a\x7f\x7b\x5e\x5b\xc2\xee\x3e\xd9\x2b\x74\xce\x15\xf9\x3e\xbc\x2b\x69\x73\xde\x7a\xb4\x89\xf8\xbe\x97\x86\x40\xc4\xce\x62\xa8\xa9\x89\xbe\x32\xa2\xb4\xaf\xe1\x70\x33\x3d\x7f\xf7\x62\x81\xde\xd7\xbd\x85\x96\x9d\x46\x28\xe3\x38\xb4\xbd\xcf\xf0\x8b\xe5\x19\xf6\xef\x2d\x7e\xf4\x7a\xbd\xc7\x97\x2b\xb6\x8c\x65\xff\x94\xd6\x31\x14\x5e\x96\x6d\x16\x94\x52\x08\x87\xad\x2e\x2c\x5a\x36\x03\x02\x6f\x5d\x92\x69\xae\xe5\x22\x87\xdf\x16\xe7\xa1\x95\xde\xbf\x6d\x0e\x47\xf1\x73\x93\x97\xf5\x4c\x4b\xab\x30\x58\x9c\x9f\x2b\xe9\x26\x83\x2f\x48\x80\x5c\x02\x87\x1a\xf2\xca\xa3\x18\x34\x53\xea\x82\x8f\x45\xaf\x86\xa2\x88\xb8\x8a\x01\xff\xd1\x12\x07\xd3\x92\xb8\x61\x42\x28\x42\x0d\x20\x92\x67\x77\x7c\x16\xe1\x3b\x01\x2b\x26\xd7\x29\xa7\xe0\x74\x32\x8b\x3b\x2a\xf3\x8c\x7f\x0e\x52\x03\x9c\x46\x30\xa5\x54\x14\x4f\x6f\x1a\x01\xf5\x91\x13\xca\xa9\x8f\xbc\xf6\x60\x71\x91\x1b\x17\x39\xa1\xb0\x0b\x1c\xa6\xd7\xd7\x56\xaa\x36\xc1\x04\x4d\x0d\xab\x71\x6e\x28\xbe\x13\x5e\x70\xeb\xe0\xef\x9c\xc2\xac\xae\x03\x9c\xd3\xca\x3b\xb9\xe4\xe6\xc6\x1c\xf2\x24\x11\xc6\xc4\x1d\xd8\xbb\x19\xb7\x67\xb8\x8a\x9b\x5f\x74\xe3\x53\xf7\x15\x81\xea\xc0\x5d\x58\xf9\x11\xda\x6f\x1a\x18\x41\xab\x1d\x96\x97\x02\x2f\x9a\x44\xaf\x34\xad\x40\x99\x68\xbb\xdf\x4d\x04\x65\x7a\x5d\xc8\x48\x2d\xe3\xa5\xb0\xca\xae\xbd\xd6\x3d\xb0\x41\x17\x1a\x4b\xdb\xdc\x1b\xd9\xf5\x73\xac\x71\x0d\x9b\xf8\xfa\x47\x57\x27\xbd\xf6\x7b\x0d\xbc\xcf\xe2\x1f\xb6\x78\x3c\xb5\x67\x8a\x7e\x24\x16\x58\xcb\x53\xbd\xd4\x39\x20\xce\x38\xed\xd8\xe0\x1d\x38\x8e\xc5\xbf\x2c\x5b\x83\x09\x5f\x4b\xb2\x9b\xcb\x6d\xbd\xae\x78\x57\xab\xb8\x40\xc6\x6b\x5f\x83\xdb\xb6\xec\xbb\x8f\xb4\x02\x51\xe6\xdf\x65\xf4\x8f\xb8\x47\x78\x64\x04\x68\x2a\x7c\x05\x2f\xce\x73\xbb\x40\x04\x6d\x59\x8f\x79\x36\x45\x62\x6a\x0d\x88\x62\xed\x35\x21\xee\xbd\xd9\x72\xac\x65\x68\xf3\x7e\xec\x41\xa6\x72\x5f\x3d\xb0\x54\xb5\x40\xa9\xb3\x5c\xd2\x42\xe7\x7b\x2b\xdc\xbb\x0b\xe1\xda\x11\xf0\x9a\xec\x56\x23\xff\x15\xb1\x9c\x50\xc0\x0e\x6e\xa8\xcb\x49\x04\xab\xc0\xde\xba\x88\xaf\xa8\xa2\x41\x4f\xd7\x50\x28\xbe\xdc\x00\x5b\x22\x2a\xd8\x74\x8a\x5c\x9b\x67\xdd\xae\x17\xf5\x70\x1b\x45\x39\x78\x4d\xa0\x1e\xc1\xe6\x89\x96\xcb\xac\x5c\xaf\xb6\x99\x36\x27\x7a\xb5\x31\xbd\xa7\xf5\xc5\x0a\x0d\x93\x17\xfa\x86\xcb\xe1\xac\xbe\xca\xeb\xb7\xdc\xa9\xb1\xf2\x46\x45\xe8\x2d\x1a\xc1\x2c\x15\x49\x64\xb4\xe1\x42\xec\x02\x21\x85\xb6\xe8\xbd\x08\xd3\xd9\x9b\x92\x9d\x05\x4f\x1a\x36\xd8\x03\xd8\x8a\x4c\xde\x88\xc1\x5e\x87\xc9\x12\xe5\x18\x03\xe8\x45\x43\x7d\x0b\x90\x0b\xf5\x52\x8d\x56\x4c\x27\x12\x11\x7d\x38\x8a\xf8\x20\x13\x3d\x2e\x78\x3e\x71\x88\xdd\x83\xbd\x1f\xe6\xdb\x30\xcc\x94\xbc\x20\x6c\x4d\xce\x06\x7b\xb7\x76\x14\x80\x6c\xc2\x0b\x07\x10\x8d\x4a\x3a\xee\x71\x90\x10\xa9\xf8\x6f\x96\x63\x61\x2b\x07\x54\xc5\x05\x32\x66\x33\x72\xe9\x80\x59\x0e\xf6\x78\x96\x4f\xb8\x4b\x26\x65\x39\xe9\x60\x0f\x96\x85\x7c\x72\xea\x0d\x4b\x15\x35\xec\x72\x36\xc3\x09\xc7\x00\x15\xdc\x1d\xc3\x19\xfb\xfe\x0c\xf5\x80\x02\x73\x8f\xd2\xdf\xd0\x17\xdb\xbf\x03\x04\xba\xef\xcf\xd0\x74\x12\x42\x58\xca\x09\x53\x9a\x99\x6a\x34\x92\x1f\x98\x81\x10\x06\x83\xf5\xe1\xba\xca\x27\xfc\x00\x75\x93\x30\xa1\xe1\x8c\x02\xed\xec\x3c\x6a\x53\xa6\x19\xd7\x46\xdb\x63\x67\xca\xa1\x41\xb8\xd1\xfa\xd4\xee\x44\xef\x53\x76\xdb\x3f\xea\xb0\xdb\xe3\x0e\xbb\xed\xdb\xff\xc3\xcd\x02\x9f\x8e\xec\x5f\x27\x1d\x76\x7b\x02\x97\x8d\xfd\xea\x18\x46\x84\xe5\xe0\xcf\xe3\x0e\x1b\x69\xdd\xc7\x7f\x9b\x21\x76\x9f\x81\x11\xdc\x39\x5a\x6c\xac\x7f\x58\x53\xf7\x88\xef\xf5\xb9\xf7\xe7\x9c\x18\xfa\x39\x28\x23\x9b\x3e\x50\x6b\xab\x23\xdb\x9c\x39\xd7\xf3\xe2\x5c\xad\x90\x24\xc7\xa4\x56\x95\xff\xe7\xf5\x6c\xaf\x0d\x15\x18\x40\x64\x8b\x85\x64\x7a\x1e\xa8\x16\x40\x71\xed\x11\x75\x6c\x1b\x0d\xb5\x11\xff\xbd\x9a\x88\x99\x0b\x72\x0d\x51\x84\x10\xa8\x1a\x5a\x95\x18\x9b\xb6\x18\x0a\x23\x6d\x4f\x28\x3c\xaf\x9c\xa2\x82\x7e\x0d\x69\xf9\xac\x90\x97\xf3\xa2\x94\x09\x28\xf9\xb9\x81\xc8\x3f\x8a\x61\x5c\xcb\x6b\xf5\x33\x38\xe2\xc1\x61\xf5\x5e\x06\x92\x52\x17\x22\x5d\x33\x06\xb3\x5e\xd8\x41\x56\x47\x72\xec\xbc\xa7\x98\x43\x77\xb2\xb7\x80\xb8\x15\x45\x88\x4a\xec\xb1\xab\x82\x27\x37\xf4\x7e\x37\x51\x7c\x24\x65\x67\xe4\x6c\x2a\xc7\x14\xab\x08\x50\x08\x80\xc5\x00\x43\x08\x65\xa5\x62\xa2\x4c\x5c\x76\x56\x94\x3a\x8c\x95\x93\x41\xf1\x6e\x74\xad\x15\x70\x6d\xd1\x59\x26\x0a\x50\x31\x58\x4a\x9a\x49\xad\x44\x70\x50\xf5\x77\xd5\x3e\x00\xda\xdb\x61\x2a\xcd\x74\xe6\xb2\x76\x90\xa0\x21\x46\x25\x62\x80\x81\x1e\x27\xbe\xb3\x20\xee\x46\x38\x3d\x57\x39\x17\x05\x4a\x2e\x3e\x14\xfd\xe9\x85\x1f\x74\x05\x22\x57\x1e\x6c\x83\xfc\x68\xaf\xe1\x50\x04\x09\xea\x6e\x22\x33\x68\xdf\x3e\x07\x08\x45\x20\xb4\xf7\x69\x30\x43\x1e\x9f\xbd\xcf\xbb\x14\xae\xcb\xdf\x7f\x9a\x0b\x73\x0e\x02\x8a\xdd\x6a\xa0\xad\xfe\x62\x5a\x9a\x37\x2d\x6d\x6f\x1e\xba\x68\x29\xeb\xa1\xfc\x39\xea\x0d\x29\xc6\x10\x71\x30\x12\xe7\x80\x69\xd8\x7e\xb0\x2a\xb9\xaa\x41\xc9\x5a\xa1\x99\x1b\x5e\x63\x07\x5f\xcc\x50\xbb\x34\x43\xa5\xfe\xf9\xbb\x12\xdd\x25\x8a\x44\x0c\x32\x93\x34\x4d\xa5\x42\x93\x7a\xf6\x8d\x26\x0d\x0b\xf5\x7b\xec\x2f\x96\x83\xd2\x4e\xc0\xe4\x3b\xb6\x50\xe4\xf0\x58\x6f\x18\x37\xaf\x60\x9c\xdd\xf1\x02\x94\x35\x13\xc1\xe9\x95\xe8\x60\x29\x31\x0b\x53\xae\x55\xd3\x4e\x0f\x9a\xe9\x6d\x34\xad\x6e\xc0\x52\xab\xbf\x60\xb7\x6b\x52\x28\x54\x60\x56\x2e\x2a\x64\x1a\xf4\x7e\xa0\x13\x75\xb3\xf0\xe7\xbd\xd4\xe8\x8e\x84\x0e\x1a\x3d\xf6\x86\xcf\x7c\x12\x02\x4b\x26\x8c\xd5\x0d\x14\xbc\x76\x59\x8b\xf0\x62\x6c\xb6\xbb\x60\x7d\x6a\x8b\x00\x87\xbb\x10\x89\x9e\x4e\x85\x4a\x61\x83\xbb\x05\x54\xe2\xce\xde\x68\xf5\x97\xb7\xfd\x51\xfc\xbd\xe2\x70\xda\x1c\x04\x89\x29\x39\xda\x08\x3a\x4c\x8e\x20\x12\x04\xae\xaa\x07\x46\x96\x89\x9f\xf8\x98\x95\x1c\x1c\xef\xfe\xeb\x3f\xff\xcf\x6d\xff\xbf\xfe\xf3\xff\x76\xe0\xaf\x63\x38\x39\xf0\x51\x94\xc9\xba\x1a\xad\x1a\xbd\x78\xb9\xb9\x86\x0b\x94\x22\xd8\x64\x58\xa4\x2d\x74\xde\xa0\x15\xfc\x6c\x75\xad\xa4\xf7\xdc\x5e\xcf\xba\x92\x6b\xdc\x43\x65\x5a\xbb\x86\x6a\xc6\xb1\xcd\xae\xa1\x79\x3d\xef\xa2\x0b\x69\x31\xba\xef\x4a\xae\x4a\xbb\x0f\xd4\x27\xa3\x8c\x8f\x99\x50\x7c\x98\x49\x35\x3e\x4c\xa5\xc1\xbf\xea\xe4\x02\x59\x11\x9f\x61\xee\x80\x4a\x8e\xde\xe8\x67\x17\xe7\x0b\x9c\xb3\x97\x5b\x94\x50\xb8\x5d\xe3\x71\x10\x05\x5e\x35\x79\x4b\x83\x34\x4d\x5b\xe8\xdc\xc9\x8b\x8d\xa3\x57\xa0\x44\x72\xe6\x4b\x11\x01\xe8\xd6\x14\x4a\x54\xfe\xdf\x97\x1c\xa9\xe5\xf3\xfc\x8d\xd9\x91\xe6\xcf\xd0\x62\xbb\xd2\xed\xf2\x03\xb5\x86\x5d\xa8\x7e\xaa\xe2\x0a\x5b\x1c\xad\xfa\x1c\x57\x9f\xaa\x35\xd5\x56\x4d\xc4\x26\x3a\x81\x2d\x7b\xfd\x93\x29\xae\xa2\x6d\x70\x99\xf0\x6c\x59\x6a\x86\xe5\x15\xbd\x47\x0e\x41\x80\x38\xa7\x79\x01\xf9\x75\x44\x4c\x62\x7c\xee\xd4\xdf\xed\x6b\xc5\xa4\x0e\x45\x76\x29\x32\x91\x94\xba\x58\x03\xe9\x70\xae\x7c\x2d\xbc\x2b\x40\x1e\x92\x7f\x03\xa8\x63\xe6\x30\x0c\x21\x39\x8a\x2e\x50\x94\x43\x90\x18\x9c\xee\x35\x46\xdd\xf5\x0c\x75\x70\xdd\x63\x6f\xad\x84\xe4\xdb\xc5\xc4\x60\xba\xc2\x58\x9a\x3a\x98\x22\xf9\x50\x10\xb0\xaf\xf7\xea\xc5\xca\x30\x54\x32\x68\xf5\xb0\x17\xc4\x91\x06\x38\x8e\xeb\x50\x9e\x36\xf6\x9d\x2e\x6e\x90\x23\xfd\x59\x17\xf2\x1f\x5a\x95\x3c\xbb\xd0\xe9\x59\x55\x6a\x20\x7d\x11\x6b\x2b\x20\xba\x07\x35\xfb\x70\x62\x03\x19\xa2\x04\x65\xa8\xc0\xc7\x0a\xfb\x70\x92\x40\x1f\x9e\x89\x0f\xcc\x4d\x97\x92\xfd\x39\x54\x48\x1f\x88\xcc\x63\xa7\x72\x58\x81\x50\x45\x7a\x0b\xc8\x48\x17\xd3\xd6\x10\xa1\x07\x74\x89\xf8\x0a\x88\xd1\x8d\xf7\x21\x9a\x67\x0a\x81\x8e\xfe\xe4\xa2\xef\x04\x2f\x87\x74\x47\x7b\xa4\x4d\x28\xe8\x10\xc0\x79\x63\x27\xb8\x94\x9f\x64\xc4\x3a\x84\x8e\xaf\x6b\x27\x00\xac\x3d\x4e\x4c\xa6\x48\x40\x4c\xf6\x49\xe9\x40\xb7\x10\xd1\x72\x91\xbc\x13\x79\x26\x13\x6e\xd6\x38\x1d\xcd\xe2\x3b\x3e\x1c\xb9\x48\x7a\x05\x35\xff\x50\x47\x03\x4f\xc3\x8e\x16\x71\xe1\x2a\xe1\xa3\x08\x50\xaa\x8a\x42\x17\x4c\x2b\xf6\xfd\xcb\xab\xad\xa3\xa3\x37\x59\xa2\xb9\x0a\x0f\xc2\xc1\x1e\x7a\x99\x90\x83\xed\x6c\xa1\x9a\xa3\xde\xe2\xb4\x35\x2d\x68\xf7\x75\x8d\x9f\x3b\x7a\xcb\x57\xfd\xb3\xb8\xec\x37\x33\x53\xcd\xd5\x5c\x72\xdd\xe3\xef\xab\xee\x7b\x76\xe9\x71\x00\x7c\x80\xaa\xbb\x97\x44\x74\xf1\xb5\xef\xf2\x7a\x6b\x41\x81\xd3\x61\xbf\xa7\x30\x14\x7b\x15\x1d\x2e\x18\x4b\x9b\x56\xe8\xf7\xec\xe2\xfd\x55\x43\xe5\x23\x5a\x5b\x28\x31\x0b\x4d\xb3\x01\x4d\xb9\xbc\x21\x27\xc1\x58\xd9\xbb\x0d\x01\xf5\x08\x87\x62\x56\x4e\xec\xd5\x27\x3e\x24\x22\x2f\x6b\x94\x2a\xb9\xfa\x07\xc7\x01\x1c\x5e\xbc\xbd\xbc\x3a\xbc\x38\xbb\x7a\xfe\xe7\xb9\xb1\xcc\x69\x01\xe7\x3a\x99\x6b\x74\xef\x53\x6e\xb1\xad\x76\x97\xa9\xb1\x38\x9a\x0c\x44\xdc\x35\xa5\x48\xb3\xa5\x18\x69\x1a\x62\x2e\x7b\xf4\xf7\x16\x0a\xda\xcb\xf5\x19\x3c\x13\x0d\x53\x70\x73\xf9\xe9\x99\x82\x07\x8f\xb7\x33\x3e\x60\xfe\x78\x81\x01\x6c\xe9\x35\x27\xa1\xd0\x3e\xe8\x6f\xfb\xd7\x74\x13\x10\x78\xc1\xe7\x85\x84\x34\xcf\xac\x36\x86\x42\x5a\x4d\x32\x62\x32\x11\xcd\x88\x97\x80\xda\x43\xa4\xa7\xac\xdf\x5b\x79\x10\x1d\xe4\xb6\x0f\x9e\x6f\x3f\x99\xd7\xbe\x37\x3c\xf0\x3a\xce\x7b\xdf\x63\xc7\xab\x3b\x6a\x1d\xf0\x32\x66\xa3\xc9\xcd\x96\xec\xdd\xcb\x47\xf0\x39\x18\xda\x7e\x6a\xf3\xeb\x5c\xce\x3c\x42\x95\x7a\xbc\x74\xa4\x2e\x9b\x8a\x72\xa2\xd3\x6d\x19\x86\x46\x57\xfb\x9f\x4e\x2e\x1f\x4d\x09\xda\xc8\xcc\xb8\x74\xe7\x37\x86\xe7\x14\xd2\x2e\x40\xe0\xf6\xc4\x69\x0b\x29\x07\xcd\x62\x55\xe8\x27\xda\x01\x2f\x09\xfc\xf5\x05\x45\x89\xae\x5a\xfe\xd6\xf2\xce\x8a\xef\x2c\x8f\x90\xc3\x32\x02\x96\xad\xdd\xff\x30\x88\x54\xa4\x3e\x30\x15\x9a\x58\x63\x2b\x2c\xc9\x3d\xb0\xce\x0b\xa0\x25\x0d\xd8\xa7\xcd\xbc\x13\x76\xdb\x8a\x84\xa2\x35\x1c\x52\x35\xa3\x34\x89\xf0\x0b\xa5\x47\x45\x87\x3d\xc4\x40\xaf\x41\x4b\x9f\x42\x82\xd4\x0e\x93\xaa\xfc\xfa\x69\x87\x8d\x32\xcd\xe1\x0f\x9c\x71\x87\xfd\xfc\x0b\x18\xa4\x47\x3c\x11\xff\xfc\xb5\xc3\xa6\x3c\xff\x19\x7f\x8a\xbf\x87\x6d\xaa\x64\xb6\xa3\x8c\xa4\xed\xa7\x6c\xed\x9c\xaa\xc8\x68\xec\x97\x5d\x3a\x74\xe8\x31\x69\x37\x5d\x0d\x34\x9e\xbd\x28\xf8\xa8\x64\x4f\xd9\xfe\xa4\x2c\xf3\xd3\xc3\xc3\xbf\x19\xad\xba\x94\x9b\x58\x17\xe3\xc3\x83\x35\x36\x1d\x31\x98\x8d\x77\xdb\xef\xda\x8d\x36\xeb\x54\x0d\xbe\x00\xe7\x6d\x48\x3e\x8f\xc0\xf2\x28\xa7\xef\x8a\xd1\x5d\xb4\x93\xec\x33\x18\x62\x96\xbd\x9d\x5b\xb4\x47\x34\xd0\x37\xb7\xf6\x7d\x2c\xf2\x5c\xcd\x7e\x33\x73\x21\x25\xc0\x63\xed\x96\xa5\x17\x77\x1a\x22\x92\xb8\xd7\x4e\x84\x2c\x39\x3e\x3d\x79\x3d\x30\xd0\x3b\x13\x90\x27\x39\x47\x37\xe6\x91\xe0\x65\x55\xc4\xfa\x94\x39\x3f\x24\x57\xc9\x15\x1d\x43\xfa\xd1\x45\xee\x4a\xa8\xfc\x71\xe3\x0a\xd1\x7c\x09\x25\xd4\x0f\xa1\x70\xb7\x7d\xb6\xaf\x0b\xb0\xd2\x17\x07\x8b\xe3\x53\xcf\x2e\xce\x17\xbc\x30\x22\x9a\x37\x17\x66\x8d\xa3\xfe\xb9\xec\xba\xf8\x5e\x9e\x9f\x61\x6e\x05\x0e\x95\xb4\x70\xaa\xcf\x66\x8a\xf5\x04\xe3\xf7\x9c\xef\xbd\xe4\x24\xa1\xaa\xe9\x27\x66\x38\xf7\xe2\x32\x14\x0c\xf0\x68\x5c\x66\xc1\x20\xc8\x54\xfa\x86\x7f\x90\xd3\x79\x82\xae\x65\xa3\x0e\x8d\x48\x75\x8f\x46\xbc\xc0\xfe\x28\xf7\x74\xfb\x83\xa2\x75\x68\x9b\x67\xed\x8a\xde\x55\xf4\x3d\x59\x6c\x1c\x3a\x29\x7d\x8d\x52\x30\xbe\xcd\x9d\xbf\xb0\x17\x12\xe3\x22\x2e\x42\x2f\x3d\x1d\xa8\x81\xea\xb2\xa1\xd1\x0a\xcf\x96\x4c\x4f\x2d\x7b\x37\x1e\xfd\x90\x9d\xbf\xc0\xec\xab\x8c\xb3\xe3\xa7\xf6\xc5\x5f\xf0\x04\x32\x7e\x4e\xc4\x07\x67\x5b\xeb\xb2\xaa\x90\xa7\x76\xa8\xef\xdf\x9d\x33\x6e\x58\xce\x0b\x02\xdc\xf9\x5e\x67\x5c\x8d\x99\x12\xe5\x61\x55\x64\xbd\x0b\xfb\xc3\x3b\xd4\x39\xd8\xb2\x5d\x26\xa6\x5c\x66\x50\x17\xfe\x72\xc9\x6e\x17\xb6\x62\x0b\x61\x33\x67\x54\xb2\x0b\x79\x69\x15\x9f\x8a\x53\x9f\x4d\xbd\x01\x98\x09\x11\xa2\x8a\x9d\x03\xe2\xa5\x28\x31\x07\x30\xfa\x4d\x71\xe3\x7d\x06\x86\x33\xf6\xee\xd5\x73\xd6\x3f\x3a\xb1\x6f\x05\x4a\xf5\x7d\xd2\xeb\xb3\x9f\xdf\xbd\x7a\x6e\xbf\xfd\xa5\xc7\xba\x4c\xe6\xb7\x4f\x4f\x31\x33\xef\xed\x53\x48\xcf\xdb\x3e\x52\x1c\xe4\xf9\x05\x56\xf9\xda\x55\xf9\x7a\xbd\x2a\x89\x4c\x0b\x3b\x9d\xe7\xe7\x2f\xde\x2d\x2f\x0e\x25\xba\x6c\xca\x13\x5b\xfe\xcd\xd9\xf3\x55\x24\xc4\x6a\xb6\x60\x97\x55\x15\xac\xb8\x62\xef\xdf\x9f\xbf\xa0\x60\x07\x7c\xd5\x56\x79\x8e\xd8\x3e\x31\x79\xd0\xd5\x7b\x2c\x3e\xb0\xfd\x6f\xe5\xc1\x7f\xfc\x7c\xd4\xfd\x86\x77\x47\xbf\xfc\xf3\x8f\xbf\x76\xbf\xf5\x1f\x9e\xae\xf7\xa1\x7f\xfc\xeb\xef\x68\x04\x27\x7e\x08\x27\x3b\x1c\xc3\x89\xff\x74\xb2\xce\x20\x9e\xfa\x41\x3c\xdd\xe1\x20\x9e\xd6\x07\xf1\xc7\x6f\xf8\xf0\x97\xf6\x71\x45\x43\x79\xe6\x87\xf2\x6c\x87\x43\x79\xb6\xe9\x50\xa4\x19\x2a\xdc\xb6\x97\xdf\xfd\xd8\x3f\x62\xba\xc0\xbf\x4e\x5c\x18\x1d\x1d\x7f\x40\xcd\x1a\xec\x1d\x9d\x1c\xf7\xff\xf0\xac\x7f\xf4\xf4\xc4\x05\xe0\x7d\xf3\x87\x3f\x76\xfd\xb7\xfd\xc1\x1e\xb5\xd9\x3f\x8a\x5b\x5d\xdd\x16\xd5\x3a\x09\xb5\x16\x8c\xa0\xa5\xbf\xa4\x10\xa9\x2c\x13\x5e\x00\x63\xc3\x4f\xcc\x7e\x74\x2d\xb4\x52\xf2\x3f\xf6\xbf\x3d\x85\x95\x03\x5a\xec\x7f\x7b\x8a\x7f\x9f\xfc\x7a\xf0\xed\xc7\x67\x3f\xf7\xbb\xcf\x7e\xa1\x1f\x9f\xfe\xfa\xf1\xeb\xfd\x6f\x4f\x8f\xfa\xfd\x8f\x40\x5e\xfc\xfe\xc0\x57\xfd\x78\xf2\xf3\xd3\x3f\xb8\xc2\x27\xbf\x7e\x3c\xb1\x85\x7f\x3e\xea\x3e\xfb\xe5\xe3\xcf\x5f\xff\xb1\x5e\xba\xff\xeb\xc7\xfd\x6f\x4f\x8f\xfb\x27\xfd\x8f\xfd\x3f\x1e\x1d\x7d\x3c\x79\x36\x18\xa4\xb6\x4f\xfb\x9f\x7e\xff\xd7\x83\xdf\x51\xf0\xa4\x9a\x41\xa8\x66\x2a\xc7\x76\x2e\x81\x23\x4f\xe5\x07\x74\x9c\xef\x32\x63\xec\xca\xb1\xf7\xbd\xcb\x1e\x33\x3a\x91\x3c\xb3\x0c\xad\x82\xe4\x79\x34\xf1\x70\x35\x44\xf3\xc6\x1e\x7f\xee\xb2\x5f\xbe\xb5\x7f\x1e\x87\x3f\x9f\xc2\x96\x98\x88\x0f\x89\xce\x74\x01\x4b\x31\x11\x1f\x78\x2a\x12\x39\x45\xff\x7d\x5d\xb0\x44\xa7\xc2\x2d\xc6\x57\xaf\xe0\x7f\xa7\xed\x1d\x7d\xf5\xed\x3e\x6d\xb7\xb3\xee\x2b\x4b\xd9\x8f\xf1\xc7\xaf\xed\x64\xbb\xac\x18\x0f\x43\x6f\xef\xbe\xff\x6e\xae\x97\x62\x3c\x74\xdd\x15\xe3\xe1\xfe\xf1\xb3\x67\x1d\xfa\xff\x37\xb0\xfa\xc3\x59\x29\x4e\xd9\x90\x1b\xf1\xf5\x53\x26\x94\xad\x98\xb2\xa1\x54\xbc\x98\x31\x00\x16\xe9\x32\x97\xfe\xfa\x14\xe8\xea\x30\x09\xfd\xc5\x66\xaf\x49\x4b\xc9\x14\x63\xab\xe2\xdd\x76\x7c\x74\xf4\x75\xf7\xa8\xdf\x3d\x3a\x1e\xec\x35\xae\x91\x51\x95\x65\x5d\xa8\x22\x95\xbd\x53\x4e\x4e\x4e\xbe\xb1\x8d\x51\x62\x32\x68\xd0\x27\x29\xab\x37\x7a\xcc\x94\xc1\xf6\xe6\x78\x77\x29\xa7\x02\x99\xf7\x0b\x57\x19\xa8\x81\x40\x25\x99\xc0\xed\x71\x99\xf0\x2c\x6a\x9e\x24\x06\x9c\x89\x6d\xc1\xcf\x06\xa0\xed\x9b\x53\xea\x3f\xed\xf6\x8f\xbb\xfd\x67\x57\xfd\x6f\x4e\x4f\x8e\x4e\x8f\x8f\x7a\x47\x47\x47\xff\x6b\x6e\x82\xb6\x81\x2e\x34\x10\x26\xb8\x85\x7f\x82\x9c\xf3\x0d\xdd\x1a\xea\xf9\x51\x5e\x2b\x67\x8b\x05\xf0\x29\xff\xd0\xaa\xb8\xaa\x65\xa3\xfc\xfa\xe9\x16\xd9\x28\xa7\xfc\xc3\x6b\xa1\xc6\xf3\xbe\x1b\x3b\x69\x7a\xb1\x3e\x6b\x27\xcd\xb7\x49\xf0\xa1\xe1\x54\x57\xc3\xa6\x5d\xd2\xb5\x8c\x6c\x6a\x41\xc3\x52\x3d\x14\xb1\xa5\x7a\x30\x62\x4b\xf5\xa0\xc4\x6e\x7f\x2e\xed\x80\xd8\x55\x56\xca\x3c\x13\xf3\x1a\xb9\xfb\xb7\xad\xf4\xa3\x29\xc6\x5a\x35\x2b\xb5\xb1\x54\x59\xc6\x87\xf3\x6f\xe8\xb5\x1e\x9c\x5a\xb5\xd0\xe7\x5f\x54\x63\x99\xf3\xd2\xbe\x93\xb6\x61\xcd\x54\x75\xf1\x3e\xff\x6c\x54\x4f\xf7\xd3\x36\x2d\x30\x9c\xfc\x76\x26\x18\x79\x9d\xad\xb3\xa5\x77\x08\x68\x5b\xca\x72\xf1\x19\xdc\x34\xe1\xca\x5a\x26\x52\xc8\x5d\xd3\x7a\x9f\xac\x75\xf4\x6b\xb0\x6c\x62\x3a\x14\x69\x2a\x52\xef\x0f\xbc\x42\xd1\xb3\xbc\x72\xe4\x99\xc4\x4b\x07\x10\x57\xb9\xc4\xd3\xae\x38\xfb\xc1\x37\xc1\x8a\x4a\x81\x98\xf8\x96\x5c\xc3\x40\x24\xbc\x9a\xe5\xe2\x8d\x20\xa0\xbd\x90\x76\x0d\x55\x44\x90\x78\xc6\xa9\xda\x9d\x67\x08\x22\x91\xbb\xac\xb9\xa5\x66\xa3\xaa\x00\xc7\x8e\x42\x58\x52\x26\x25\xb9\x0f\xd3\x00\x5c\x35\xc4\xf5\x6b\x64\x72\xad\xa1\xf8\x79\xd5\x13\xe3\x55\xa9\xa7\xbc\x74\xa0\x31\xeb\x80\xdb\x35\xc6\x34\x14\x14\x39\x39\xac\xca\x90\xcc\x77\xc2\x6f\x05\xfd\x2a\x63\x67\x13\x5b\xd9\xca\xe5\xb3\x08\x75\x6f\xbf\xca\x6d\xd1\xe6\xb0\x03\x34\xe1\x22\xa0\xca\xf5\x37\x84\x54\x65\x57\x17\x5d\xda\x80\x1b\x6c\x86\x5a\xc5\x28\x68\x9a\xb6\x82\xc7\x77\x97\x86\x09\x09\x6b\x13\x25\x79\xd7\x85\x77\xaa\x27\x2f\x58\x44\xe2\x47\x7a\xc1\xde\xc9\xcb\x19\xf3\x59\xcc\x89\xa8\x10\xda\x6f\xbf\xe3\x86\x25\x13\x99\xa5\x98\x6a\x66\xf6\x76\x04\x30\xfe\xa2\x70\x59\xdb\x47\xd1\xab\x2e\x4a\x00\x1d\xbe\xa4\x8b\xc0\x80\x86\xb1\x7f\x80\x8d\x9c\x0e\x14\x63\xac\x0b\x5d\x9c\xba\xb1\xd6\xbe\xc3\x21\x0f\xd4\xf1\x01\x03\x7b\xa6\xab\x11\x55\x6f\x6f\x60\xbe\x09\xf8\xaa\xd7\xeb\xb1\x7f\x88\x42\x5b\x82\x4c\x75\xb1\x40\x42\x59\x7f\x35\x33\x69\xca\xee\x94\xe7\xdd\x1b\x31\x5b\x15\x00\xbf\xb8\x22\x83\x4c\x26\xe0\x33\xc6\x15\x79\x39\xc3\x41\xb5\x34\x9c\xaf\x06\x2b\x72\x3d\xe5\xf9\xb5\x7d\x7a\x51\x3c\x94\x7b\x4f\x43\x7b\x10\x35\xc4\x5d\x82\xdc\x54\x7c\x70\x0b\x32\xe5\x79\xcf\xae\x00\x64\x62\x28\xf9\x18\x53\xb2\xba\xb8\xda\x8a\x32\xb8\x22\xcc\x05\x6c\x2c\x3c\x3d\x13\xfb\x18\x6c\x1f\xc8\x60\x2f\x60\x4b\xba\x70\x90\xc1\xde\x94\xe7\x83\xbd\x1e\x3b\xcb\x8c\xee\x04\x3e\x15\x27\x02\xf7\xe0\xfe\x21\x03\x41\x14\xfe\x61\xdf\xac\x05\x2c\x60\x4a\x41\x20\x2e\x26\x12\x76\x21\x46\x7e\x54\x85\x60\xfb\x4a\x33\x25\x8c\x33\x45\x7a\x97\x8f\x03\x9a\xa6\x60\xe1\x6a\x8e\x7a\x87\xae\xe8\x98\xc4\xc8\x9d\xba\xc0\x19\x37\xac\xa1\x1d\x3b\x2b\x40\xc5\xb0\xc4\xd0\xa6\xd6\xaa\x65\x63\xa4\x5d\xf6\xd0\x83\x88\xcd\x66\xaf\x90\x47\x07\x80\x6f\x5f\xa6\x8d\xf7\x26\x1e\xfb\xf9\x7d\x19\xf1\x7e\x17\xeb\xca\x24\xf8\x0b\xe6\x3a\xd3\xe3\x19\x65\xf9\x08\x7b\x02\x48\xdd\xbe\xc3\x5c\x86\x29\x20\xf9\x09\xcb\xb5\x31\xa0\xb7\xc0\xcd\xe2\x58\xc5\x35\x2f\xf5\x54\x26\xd7\xa7\x01\x0f\x0e\x38\x17\x1a\x81\xb9\x09\x28\x06\x42\x95\x10\x78\x0d\xda\x0b\xb7\x8b\x7a\xc4\x0f\xce\xa0\x15\xea\xd9\x41\xb6\xda\x1a\x85\xc8\x66\xac\x10\x79\xc6\x13\x17\xa6\xe9\x13\x0a\xd5\xe7\x42\x2d\x11\x9a\x8f\x9b\x0b\x57\x33\x9f\xad\x0d\x46\xb7\x8f\xdb\xb3\x43\x03\xe8\x58\xae\x63\xf7\xe3\xf1\x01\xbb\x36\xa2\xbc\x76\x7c\xeb\x52\x94\x01\xbc\x8d\xce\x9b\x8f\x1c\x04\x9a\xb8\xa7\x16\x6e\xa5\xc0\x13\x0c\x9f\x0a\xe7\xf5\xf4\x92\x27\x13\x6a\x10\x2f\x80\xe6\x31\xea\x84\xe4\x60\xd8\x42\x6d\xb1\x2d\x0f\x42\x86\x42\x64\x86\xbb\xc2\x4d\x35\xe2\x45\x8b\xf8\x10\x55\xeb\x0d\xd4\xc9\x01\x72\x25\x37\x3f\xf4\xc7\xa2\xa5\x2e\x48\x45\x37\xe5\xb9\xc1\x48\x09\x94\x60\x64\xc1\x44\x26\x20\x35\x83\x3b\x7a\x4a\xab\x2e\x72\xad\x1b\x31\xa3\xb6\x1c\xbe\x12\x86\x50\x22\x9a\xf2\xb4\xc7\xde\x22\x32\x5e\x04\x03\xcc\xaa\x1c\xdc\x2d\x0b\x0a\xa3\xb5\x1d\x5a\x4e\xe7\xd6\xae\x6d\x37\x92\xc7\x26\x4c\xd3\x0f\xc6\x32\x1c\x58\x55\x94\x65\x06\x2a\x46\x50\xc0\x49\xe3\x71\xb7\x24\xda\x26\xbc\xbf\x75\x19\x36\x39\xa7\x7e\xe9\x6a\xc7\x94\x56\x7a\x07\xe7\x14\x8e\x82\x13\x09\xa8\xd9\xda\x91\x3d\x5e\x78\x64\xc7\x05\x57\x55\xc6\x8b\xc6\x5e\x80\xc5\x0f\xe8\x59\xf8\x79\xff\x46\xcc\xba\xb8\x75\x73\x2e\x0b\x73\x00\x9d\x08\x9e\x4c\x1c\x3a\x32\x98\x31\x95\xf3\x60\x28\xa9\x49\x08\xfb\x86\x62\xe8\x63\xbc\x0f\xc0\x40\x89\x15\x66\xec\x97\x43\xdb\x9d\x92\x79\x95\x71\x8a\xea\x30\x22\xe7\x05\x00\x91\x26\xa5\x2e\x4c\x48\x48\x44\x0d\xc6\x78\x14\x43\x31\xe1\xb7\x52\x57\x85\x67\xe9\x76\xac\x74\x88\x77\xca\x90\x80\x06\x6b\xf2\xa3\x7b\x6e\xb2\x05\x62\xf4\x26\x7b\x6e\x91\x24\x6e\x4a\x9d\x07\x4c\x55\x42\x1f\x49\x45\xa2\x53\x90\x56\x4b\x91\xe3\x7a\x39\xc8\x83\xf5\x20\xc6\xe7\xf0\x06\x68\xc9\xf8\x68\x04\x80\x54\xd4\x4a\x21\x92\xaa\x30\xf2\x56\x64\x33\x14\xfe\xcd\x9d\x2c\x93\x89\x30\x80\xdf\x6d\x8f\x02\xe6\x50\xf2\xbd\x87\xd5\x95\x23\x10\x1f\x44\x1a\xdf\xe8\x76\xc5\x5b\x9e\xed\x75\xf4\x1c\x8f\xb4\x12\x0f\x0c\x76\x9f\x17\x2b\x00\x50\x3c\xf6\xa3\xea\x61\x1a\x51\x78\x7a\xe8\x62\x28\xd3\x54\x2c\x4a\x25\x3a\x2f\x83\xfe\x5b\x63\x75\x1f\xd8\x1d\xb7\x45\xd1\xbd\xb6\x77\x2a\x55\xa8\xb9\xec\xd2\xed\x84\xc1\x80\x35\x32\xa1\x1f\x6b\xec\xdc\x8a\xe6\x79\xbc\x7c\xf4\xa8\xf9\x73\x8f\xbd\xe1\xd2\x32\x2a\x08\xe5\x03\x8c\x34\x0a\xf8\x25\xe8\xb4\xaa\x80\xf0\xab\x87\xf4\xd4\x25\xcf\xcb\x0d\x28\x62\xcb\xc7\x04\x69\x9b\x33\xa3\x55\x77\x77\xfb\x1c\x3a\xbd\x0b\x1d\x73\xe5\x68\xd3\xce\x1e\x76\xaa\xb1\x53\xd6\x06\x33\x8e\xaa\xd5\x77\x42\xeb\xd4\xe9\x61\x0b\x8b\xbe\xd3\xe9\x5c\x8a\xe2\x56\x26\xe2\x9d\x03\x04\x5b\x32\x85\x66\x51\x36\xd1\x70\xff\x78\x9f\x7e\xd0\x24\x50\xa9\x5e\x26\xc6\x3c\x99\x35\xd3\x17\x2e\x74\xa2\xde\x10\xce\x27\xc6\x25\x36\xd4\x23\x7b\xe7\xd4\x70\x5b\x81\x09\x01\xe0\xfc\x1a\x43\x80\x72\xf1\x38\xf0\x8b\xdd\x0d\x26\x5f\x1d\x79\x8c\xf1\x96\x28\xd1\x38\x24\xe7\xf7\xef\x5e\x63\x1c\x26\x2f\xe9\xe6\xb0\xe3\xb9\x13\xc3\x89\xd6\x37\xfe\x0e\x05\x20\x80\x64\xbb\xeb\xd2\x3e\x1e\x57\x0d\x0c\x92\x84\xd5\x07\x46\x24\x61\xf0\xdb\x9a\x83\x63\xd7\xb6\xf4\x75\x84\xf5\xe1\x9c\x95\xa0\x15\x87\x4c\xdc\xef\x7e\xfd\xec\xd9\xc9\xb3\x0e\xe6\x7c\xb6\x97\xdc\x41\x9d\x2f\x3c\x7d\x7a\x52\x4b\x55\xd1\xc8\x54\x51\xa7\x41\xcd\xac\x74\x72\xbc\xae\x59\x69\xee\xea\x59\x0c\x36\x82\x7b\xac\x89\x62\x45\x1f\x1f\x23\xde\xf8\x2f\x48\xf1\xe7\x00\x1c\xf6\x1c\x52\x04\x2c\x39\xf1\x2d\xa5\x03\x92\x04\xaa\x4f\x90\x66\x84\x95\x39\xc5\xc8\xdb\xab\xd7\x97\xb6\x98\x22\xa7\x30\xff\x30\xa3\xe5\x5e\x23\xa4\x22\xe1\xdf\x55\x2a\x9d\xd7\x6c\xcf\xa5\xe2\xc4\x62\xe8\x67\x7d\xf1\xf2\x8d\x77\x5b\x78\x7e\xc6\x86\xf8\x13\xee\x36\xb7\xc3\xe6\x60\xf7\xa3\x71\x3d\x31\x4e\x34\x4b\xec\x98\x20\x46\x04\xf1\xfc\x2b\x15\xc1\x02\x9a\x99\x29\xc5\xd4\xde\x38\xa6\x64\x85\xd6\xf6\x35\x84\xc2\x8e\x5f\x05\x8f\x55\xbe\x70\x83\x0d\x67\xe5\x02\xf5\xda\x52\x84\x02\x3c\x49\x8f\x61\x04\x9c\xbb\x17\x96\x06\x77\xd2\x09\x97\x73\xb7\x41\xc4\x12\x83\x52\xcb\xed\x03\xf6\x12\xa5\x1c\x57\xc0\x0a\x83\x45\xe6\x9f\xe8\x01\x09\xde\x3e\x9c\x08\xaa\xdd\xb1\x0c\x09\xda\x7b\x90\x57\xed\xfe\x72\x88\x04\x98\x5f\x84\x50\xc0\x67\xba\x72\x0c\x04\x80\xfa\xa9\x9f\xeb\x05\x6e\xee\x2d\xd1\x5f\x8d\x79\xda\xd1\x8d\xe5\x2d\x45\xaf\x66\x94\x09\xd1\xb1\x7e\x1a\x5a\x07\x71\x54\xb8\x4a\x2d\xbf\xb1\x5c\x19\x32\x3e\xed\x5f\x83\x2c\x2c\x4e\x0f\x0f\x27\xda\x94\xa7\x96\x8f\x1d\x5a\x7e\x7d\x7d\xd0\x63\x2f\x23\x0c\x2b\x3d\x62\xd7\x55\x91\x21\xa4\x8c\x1b\xf2\x02\xa2\xd8\x27\xfc\xb5\x6d\xce\x73\x4a\xfb\x52\x80\x15\x80\x87\xb8\x27\xad\xa3\x55\x9d\x4e\x7f\xa2\xf4\xa7\x11\x6d\x1c\x68\x2e\x65\x32\x00\x25\x01\x38\x80\x4e\xe5\x78\x42\x20\xb4\x46\x67\x0e\x47\xcc\xc7\xef\xbd\xf8\xf1\x12\xe6\xad\xa7\xd1\x39\x30\x98\xe2\xb6\x83\x59\x22\xc3\xe6\xbb\xb6\x32\x2e\x8e\x14\xda\x62\x52\x75\x69\x48\xd0\x10\x77\x30\xc1\x81\xf9\x67\x7c\x26\x30\xbd\xb6\xd4\x19\x90\xfd\xa0\xe7\xa6\x6e\x9f\xdc\x3c\x33\x60\xc5\x00\xbf\x51\xe7\xd4\x09\x34\xba\xc8\x04\x37\xf0\x84\x22\xf9\x1a\x23\x23\xae\xed\xf2\x65\xd8\x80\xa5\x74\xff\xf8\x0f\xbd\xa3\xde\x51\xaf\x7f\x8d\x8f\x54\x6a\xdb\xee\x33\x69\x6e\x66\xac\x52\x99\x30\x06\xf6\x14\x00\x0c\x00\xa4\x21\x4b\x00\x00\x5b\x5b\xfa\xd6\xf6\x36\xc3\x88\x47\x20\x9d\x7b\xc8\xd9\x32\x56\x70\xf7\x5c\x02\xbf\x46\xc2\x2a\x81\x8c\x09\x58\x28\xa4\x99\xf5\xa8\x96\xfe\xb8\x5c\x56\xc9\x04\xf3\xd7\xda\x9f\x9d\xd2\x28\x9b\x91\x01\x47\x69\xd5\xb5\xbb\x8a\x0f\x33\x81\x6e\xc8\x1d\xd8\x0e\x82\x1b\x28\x02\x30\x29\x55\x6e\x97\x89\x33\x25\xee\xdc\x2e\xf0\x3b\x09\x37\xa8\xdf\x6a\x83\x3d\x40\xfd\x19\xec\xfd\x09\xb6\x88\xdd\xc9\xf4\xd3\x58\x12\x57\xa7\x22\xa7\x87\x87\x83\x3d\x68\xe6\x8c\x39\xd1\xc4\x5d\xff\x04\xb8\xe0\x93\xa2\x38\x05\x21\x57\x0e\x4b\x07\x4d\x25\xa4\x2a\x81\xc1\xbd\x7f\xf7\xba\xc7\xfe\xaa\x2b\x28\xeb\xb6\x28\x34\x5c\x6a\xf0\x41\xc3\x07\xd0\x50\x96\x05\x2f\x7c\x33\xc4\x6e\xfc\x31\xc4\x48\x52\xf0\xf4\xef\x30\xee\x66\xeb\x94\x64\x92\x26\x7e\x56\x96\x62\x9a\xbb\x04\x5c\xb6\x33\x4a\x32\x09\x52\x83\x91\x09\xe3\x55\x39\x41\xc4\xc8\xc1\x9e\xfd\xe5\xd4\x79\xc1\xfd\x8f\xc1\x1e\x62\xa5\x94\x01\x69\xe5\x55\xc1\xc7\xa8\x22\xdb\x1f\xec\x7d\xd5\xeb\xf5\x06\x7b\xa8\xb2\xf9\x7b\x25\x8a\x19\xcb\x79\xc1\xa7\x02\x1c\x10\xf7\x07\x7b\xdf\xba\xdf\xe9\x89\x4f\xad\x74\xe8\xf9\xb7\x35\x0a\xca\x7a\xf2\xc3\x5c\xb6\xf4\x9e\x8f\xb1\xff\xff\x2a\x0e\xca\x99\x25\xb2\x81\x2b\x42\x50\x84\xf2\x83\x48\xbb\x18\x5d\xdf\x70\x27\x07\x3c\x10\x14\xd8\xc0\x54\x9a\x17\xfa\x16\x10\x4e\x31\x63\xbc\xc4\x3d\x51\x98\x09\xa2\x1e\x54\x2a\x7c\xb0\xbb\x01\x62\x58\x2d\x01\xff\x7a\xf6\xe6\x35\xf0\x56\xa7\x7d\x80\xd7\x06\xd0\x62\x1f\x49\x7c\x66\xce\x55\xf9\xf5\x53\xfb\x09\xd0\xa8\x74\x61\xc2\xde\xae\x3d\x82\x7d\xc4\x00\xe8\xe4\x10\x9b\xf3\xef\x34\x21\x4a\x58\x41\xff\x3b\x3d\xfd\x77\x97\xd6\x56\x8e\x95\x48\x7f\x84\x89\x60\x19\xfa\x1e\x92\x56\xd0\x37\x8a\xb1\xfd\x1f\x3d\xa7\x99\x2f\xe0\x76\x3f\x58\x14\x3b\x21\xaf\xff\x60\x6f\xb0\xc7\xc0\x59\x59\x2a\xaa\x46\xce\xa2\x97\xe7\x94\x18\xf0\xc0\x0d\x14\x5c\x59\xeb\xa3\xa4\x81\x1e\xb1\x8f\xac\xcf\x3e\x82\x21\xef\x23\xfb\x86\x45\xe5\x4d\xb3\x42\x98\x58\xdc\xde\xc7\xf9\xef\x5a\x1a\xa1\xe4\x85\x11\x29\x16\xb6\x6b\xda\x1a\x36\xb5\x5c\x87\xab\xcb\xd9\x29\x2d\x1c\x86\x5d\x97\x39\x6a\xe0\x30\xf6\xfe\x9f\xc1\x9e\x6d\x71\xaf\x3b\xd8\x5b\xb8\x8a\xf5\x41\xd7\x26\xf5\x71\xae\x8b\x96\x42\x2d\x8b\xdc\x42\x0c\xf4\xa3\x75\x8b\x19\xa6\x89\x8b\xfc\xf2\x43\xae\x95\x50\x73\xab\x50\xdf\x02\xed\x4d\x45\x5d\xfd\x20\xd9\x47\xf6\xc6\xfe\xf3\xbd\xfd\xe7\xca\xfe\x73\x61\xff\x79\x29\x61\x67\x62\x48\x07\xa7\x77\xd9\x25\x0a\xb2\x90\x6f\x4f\x96\xe6\x4f\xec\x52\x08\x44\x7a\x3b\x3d\x3c\xcc\x27\x33\x23\x13\xd3\x53\xd2\x94\xbd\xb1\xbe\x3d\x4c\xaa\xea\xf0\xbd\x2d\x77\x88\xfd\xf7\x26\xe5\x34\x0b\x7b\xb2\x31\xd2\x30\xa6\x29\x2c\x00\xac\xc3\x8d\x1d\x9d\x1d\x9c\x1d\x9b\x1d\x9a\x1d\x59\xe3\xc8\xf4\x8f\x8e\x9f\xb2\x7f\x67\xfd\x1f\x24\xe8\x2a\xfb\x47\x47\x47\xf6\xe3\xcd\x9f\xd8\x39\x4b\x65\xaa\x9e\x94\x2c\x99\x68\x4d\x77\x42\xc2\x73\x59\xfa\x63\xdd\x6b\x0e\xa7\x41\x56\xdc\x13\x62\xd9\x5e\xb0\x63\x7d\xb9\xa4\x80\x65\x17\x3f\xda\x5b\xba\x2c\xfd\x05\x4e\xe2\x5f\x39\x29\x84\x00\x70\x23\x45\xc6\xce\xa9\x71\x48\xe0\xf6\x22\x66\x8e\xc1\x00\x0f\xf0\x4c\x32\x24\xf0\x71\x20\xc9\x00\x07\x72\xfc\x1f\x5f\x9f\x74\xfb\x96\x1b\x4c\xf9\x58\xc9\xb2\x4a\x85\x6d\xa4\x80\xca\xd2\x59\xc0\x34\x98\x5c\xb9\x62\x27\xcc\xf9\x96\x83\x66\xdc\xf4\x18\x8e\xda\xb0\x8c\x17\xe4\xe3\x00\xa5\xf3\x42\x24\xd2\x88\xf0\xe4\xe6\x79\x8e\xa6\xdd\x42\x57\x80\xb9\x50\xe5\x3d\xb6\xff\xb2\x37\xee\x9d\xb2\xa3\x5e\x7f\x4a\x20\x6b\xfe\x47\xcb\x75\xfb\xd3\xde\x01\xaa\x74\x1d\x3b\x73\x80\x0d\x2e\xc7\x69\x05\xf6\x67\x39\x62\x77\xde\x7e\x1c\x8d\xc4\x4c\x39\x64\x5d\x20\x8a\x48\x81\x7c\x1a\x80\x5d\x38\x8b\x6f\x16\x72\xeb\x06\x3e\xc9\x3d\x24\x81\x4b\xc7\x54\x88\xa9\x00\xd2\x95\xce\x35\x47\x8f\x5c\x12\x21\xa0\x51\x8a\xd2\x47\x94\xe9\x9f\xcc\x83\x68\x19\x1a\x73\x48\x1b\x25\x94\x2d\x2d\x4d\x04\x8d\x08\xe3\xf9\x4e\x8c\x74\x11\xae\x0e\xe8\xda\x0f\xce\x11\x30\xaf\x20\xd3\xc2\x60\x2f\xe1\x4a\x2b\xc0\x2f\xb5\x4b\x3f\xd8\x23\xa5\xf7\x54\x70\x45\xe2\xac\xdb\x8e\x87\x34\x44\xd7\x04\x4f\xff\x56\x81\x96\xbd\xca\x2d\x75\x52\x7d\xa7\xd8\x3e\xa5\x7e\x0a\xc8\x70\x78\x1f\x26\x05\x48\xb3\x80\xbf\x4f\x7f\x4b\xc5\xde\xd8\x41\x19\xc3\x0f\x30\x77\x92\xed\x0d\x6c\x4b\xbc\xc7\x7e\xd4\xb4\xe6\x04\xc0\x92\x69\x03\x36\xa2\x21\xfc\x34\x2a\x78\x42\xec\x00\x59\x6b\x30\xb6\xa0\xf7\x8a\x2d\x4a\x68\xd8\x7e\x6b\xef\xdb\x25\x84\x29\x1c\xc0\xed\x4f\x9b\x0c\xdc\xf0\xc9\xe4\xd5\xa3\x5b\x57\x8e\x95\x6f\x51\x93\x3f\x0c\x49\xd2\xa0\x3e\xc3\x9d\x6f\x85\x28\x31\xe6\xa5\xbc\x15\x40\xf8\x97\x28\xb5\x19\x98\x43\xbf\xf7\xcc\x37\x11\x61\x57\x72\xc3\x06\x7b\xfd\x67\x47\x47\xd3\xc1\x1e\x15\xfb\x5e\x2e\x29\x78\xf2\xf5\x1b\x69\x4b\xda\xf3\xeb\x98\x8d\x1d\xc2\xdf\x6b\x0b\xfa\xe3\xcb\x9f\x5e\xbe\x03\x6f\x28\x64\x95\x59\x36\x6b\xc2\x9f\x71\x84\xc8\x00\xc1\x15\xe4\x1d\x27\xdb\x5c\x4d\x30\x08\x11\x84\xd0\x89\xce\x04\xfd\xee\x00\xac\xc5\x07\x51\xd8\xb3\xd7\xc3\x41\xa8\x6e\xd8\x31\xe4\x00\x82\x39\xc6\x4a\xfb\x2f\x6c\x7c\x20\xad\x56\x63\xf2\x56\x99\x81\xa0\x78\x27\x32\xdc\x62\x96\xad\x58\x1e\x19\x32\xac\x76\x85\x73\x39\x52\x64\x3d\xae\x6f\xca\x1e\xdb\xbf\xd4\x2e\x37\xac\x3d\x0f\xf5\x9f\x3b\xb8\xfb\x2c\x8f\x4d\xe5\x68\x04\xec\x14\x9d\x61\x42\x84\xa5\xa5\x0b\x9c\x74\xf7\x56\x91\x58\x58\x26\x84\xdd\x47\xc7\xcc\xb8\xc5\x0d\x20\x85\x77\x85\x04\xaa\xc1\x1b\x11\x32\xa9\xd9\xd3\x6a\xdf\xb3\x3c\x63\x13\xae\x52\x10\xf9\x20\x5e\x85\xd8\xc8\x44\xe7\xc1\x87\x8b\xd3\x4c\x13\x6e\xbb\x90\x76\x83\x58\x41\x5b\x17\x68\x73\xb6\xef\x3f\x94\xde\x41\x16\x25\xda\xfb\x62\x4d\x04\x99\x36\x61\x7a\x0d\x11\xd9\xf4\xa6\xa2\xe4\xbd\xdb\x7e\xef\xec\xe2\xfc\xfb\x46\x96\xea\xa6\x88\xec\x8a\xd4\x75\x66\x18\x49\x09\x9c\xc8\xf9\xe3\xf8\x2c\x30\x3e\x5f\x8c\x3d\xb3\x23\x51\x14\x75\x3c\x7d\x8e\x39\xae\xd7\x49\x43\xe2\xdd\xf3\x56\xa8\x34\xce\x2e\xce\x7f\x6a\xa4\xec\x8e\xe0\xf2\x45\xea\xc0\x89\xdc\x26\x6e\x11\xee\x95\xf7\x68\xbc\xa4\x57\x3f\xe9\x22\x30\xf7\x77\x09\x59\x03\xc6\x0a\x0e\xa3\x83\x57\xa7\xb7\x5a\xc6\x4b\x01\x99\x6a\x48\x8b\x40\xfe\x44\xce\x8e\x5e\x08\x30\xab\x57\x2a\x6a\x01\x8f\x4a\x2b\x38\xed\x58\x96\x64\x6f\x38\x4c\xf4\x74\x6a\xa5\x9a\xd9\x21\x24\xf9\x91\xc3\xca\x6e\x94\xc3\x54\xdc\x8a\xec\xd0\xc8\x71\x97\x17\xc9\x44\x96\x02\xfc\xa4\x5c\xea\x93\x5b\xfb\x30\xd4\xca\xf4\xa6\xe9\x57\x0b\xb0\xb7\xd7\xd1\xd2\xdd\x48\xb5\x0a\xc5\xfd\x07\xa9\x08\xc3\x9d\xde\xae\x68\xfe\xf3\xc4\x75\xfe\x6a\x00\xd3\x1e\xa1\xc5\x05\x57\x83\x60\x32\x0a\x64\x07\xd1\x40\x8d\x5c\x5a\x02\xff\xb8\xf0\xb8\x67\xa8\xfa\x81\x17\x97\xa9\x86\x53\xcb\xee\x23\x48\xb3\x1e\x7b\x8e\x5a\x99\xa1\x08\x3e\x3e\xe7\x8a\x3d\xe7\x53\x91\x3d\xe7\x46\x3c\x38\xd1\x01\x9d\xa8\x6b\xe9\xb7\x05\xd9\xef\x61\x41\x6a\x9c\xaa\xb5\xbb\xf4\x87\x74\xc1\x59\x5b\xa5\x98\x5d\xc2\x5e\x80\x71\x50\xb3\xaf\x74\xf1\xc2\xe5\x4c\x5b\xaa\x87\x6d\x8e\xa7\x99\xfc\x22\x30\x15\x0a\xe0\x0c\xee\x08\x2e\x5b\x65\x5e\xe8\x21\x1f\x66\x33\x57\xd5\xc1\xf8\xbb\x5c\x8a\x4b\x52\x17\x14\x14\x63\xfe\xdd\x8c\x0c\x06\xe7\x2f\xde\xad\xcc\x7b\x04\x1e\x48\x7a\xe4\xb6\x25\xc4\x67\x3b\xb8\xd2\xc2\x07\x67\x97\x74\xb5\x52\x8a\x6c\xdc\xdf\xb8\x6a\xce\x4d\xc5\xd6\x9a\x88\x2c\x77\x49\x51\x58\x01\x8e\x2e\x4e\x11\x49\x37\xca\x14\x62\xd9\x45\x79\xa7\x8b\x9b\xae\xb0\xd7\x16\x74\x7b\xc7\x67\x41\x74\x61\xcf\xa9\x85\x84\x2b\x2f\x35\xf2\xdc\xb2\xda\x42\x42\x64\x63\x7d\x70\x1c\x9c\x7d\x11\xd3\x05\x86\x4f\xa2\xc5\x0c\x53\xa1\xc2\x19\x82\xa7\xbd\x1e\x05\x9f\x35\xf8\x49\x98\x8e\x1f\x6e\xa4\xa8\x46\xe5\xb2\x1a\x0b\x97\x4d\xd5\x4e\xd9\x36\x8d\x72\x98\xcf\x5e\x83\xb0\x91\xe0\x95\x84\x7e\x97\x40\x71\x22\x16\xb8\x3d\xab\x9b\xc8\x1b\x9e\x48\x6c\x67\x45\x03\x7b\x15\x34\x64\xa7\xe4\x01\x0b\x2a\xb2\x06\xae\xb2\x67\xcf\xe7\x17\x38\x43\xdb\x65\xc7\x39\x8c\x53\xb3\x40\x6e\x07\x0b\x8a\x23\x44\x45\x6b\xbd\x01\xc7\xad\x58\xa6\xf5\x8d\x61\xbc\x64\xff\xb3\xfb\x4a\x17\x77\xbc\x48\x45\x6a\xff\x72\xa9\x7a\x74\xc1\xfe\x67\xf7\x9d\xe0\x59\xf7\x3c\x8f\xbe\x23\x7e\xd5\x7b\x27\xa6\xba\x04\x54\x03\xb6\xef\x1c\xe6\x20\xcb\xea\x81\xdd\x08\x63\x51\x9b\xf2\xf9\xc5\x6e\x52\x31\x2d\x39\xaf\x97\x8b\x4e\xc0\xbd\xdc\x55\x37\x4d\x0b\xec\xd2\x31\x86\x34\xb2\x5e\xc4\x70\xd9\xe0\xda\x78\xdd\xee\xc9\xb1\x90\x7d\x6d\x4c\x8d\x0d\xac\xab\x7b\x6d\x94\x5b\x65\x5c\xf5\xdf\xd7\x3c\xb9\x80\x4a\x2e\x7d\x45\x97\x6e\xf4\xd0\x5d\x6d\x31\xc6\x24\x06\xee\xd5\x89\x4a\x95\xbc\x14\x58\xff\x35\x64\xe4\xde\xbb\xed\xcf\x4f\xf7\x97\xed\x05\xd2\xd7\xd2\x94\x6b\x08\xa5\xaf\xc9\x33\x2f\x00\x72\xba\x5f\x3a\x28\x4f\x67\xfa\xce\x33\xa7\x52\xfb\xac\x9d\xfe\xde\xe0\x25\x83\x64\x47\x5f\xa4\xd1\xcf\x5a\x1a\x85\xdd\xb9\x8a\x81\x60\xa1\xf6\xed\xf0\xe0\xbc\xc2\x1f\x90\xfb\x70\xca\x2f\x42\xf7\xe3\x09\xdd\x6b\xb2\x64\xda\x79\x9f\x0d\x03\x06\xc6\xf8\xf0\x4c\xf8\xdd\x7c\x2c\x63\x0b\x9b\x7b\xe7\x31\xaf\xa3\x58\xb5\xf0\x2a\xe1\x61\x03\x82\x02\x73\x22\xc0\x53\x02\xd5\x94\xde\x93\x28\x5d\xcb\x95\xa6\x14\x63\x5d\xb4\x04\xdf\xce\x39\xd3\xb8\x82\x75\x3e\xe0\x1f\x48\x22\x65\x8d\x74\x52\x7e\x8c\x43\x61\xe5\x55\x60\xa4\x60\xf1\x67\x4f\x78\x96\x3d\x39\x78\xec\xe8\x9e\x71\x43\x21\xd3\x36\x4d\x28\xe3\x5e\x37\xe1\x41\x84\x5f\xd3\x74\x03\xd6\x38\x7b\x09\xa1\x7f\x72\x9a\x67\x6e\x89\x6a\x25\x49\xb3\x83\xc9\x19\x89\x18\x98\xbf\xf7\x15\x28\x49\x03\x1a\x7e\x07\x49\xe6\xc3\x03\x78\x94\xf0\x9a\x2e\x9a\x51\x2c\x8e\x03\xf2\xfb\x60\x6f\x8b\x57\xe9\x1a\xac\xf0\x86\x58\x21\xc4\xc4\xd9\xbf\x9d\xeb\xac\x9f\x04\x2d\xe3\x2b\xad\x9f\xcc\x15\x8c\x36\xe7\x93\x91\xd6\xcd\x75\x7e\x80\xc7\x7a\x9e\x55\x05\xcf\x6a\x6f\x76\xbf\x46\xf7\xf0\xf6\x5c\x45\xa6\x50\x30\x02\xae\x97\xb5\xd3\x59\x3b\x8e\xf6\x81\xa2\x74\x33\xd9\xf2\x7a\xc9\xe6\x26\xba\x28\x5b\xd3\xbf\x37\x7d\xad\x7c\xc1\xfa\x31\x35\xd5\x78\x8c\xbe\xfa\x50\x82\x72\xa7\x2f\x27\xd6\xc3\x9f\x48\xfb\x02\xac\x32\x5e\xfc\xb8\x7a\xbd\xe3\xa2\x5e\xfb\x40\xdf\xb5\xaf\x3c\xa3\x78\x07\xc4\xfb\x8a\x64\x55\x50\x26\xfb\x5d\x03\xd9\x29\x5c\x43\x3a\xe7\x7f\xaf\x44\x36\xa3\xa7\x74\xa3\x4f\x30\x91\x81\xc9\x25\xc1\x70\xc5\x42\xd8\xe7\x13\x46\x69\x40\x02\x03\x08\x88\xa2\x00\x16\x4b\x3e\x68\x7d\xa8\xcb\x49\xe8\x02\x10\xdb\xa9\xeb\x90\x84\x27\x48\x06\xf6\x96\x4b\xca\x8c\x3d\x7f\x7d\xce\x3c\x84\xf6\x56\xf9\x8a\x40\x35\x43\x02\xf3\x9f\xb9\x59\xe5\x35\x0c\xbe\x5c\xdc\x4c\x48\xf0\x71\x1e\xcb\x75\x0d\x4f\xa7\xa6\x31\xaa\xb3\x79\x69\x9c\x14\x8d\x06\x00\x30\x9d\xdd\x15\xb2\x2c\x85\x72\x42\x34\x04\xaf\x43\x5a\xf6\x1e\xfb\xa9\x16\x72\x17\xc5\x00\xe1\x2a\xb0\xe1\x2c\xa4\xb0\x85\xd4\x46\x90\x30\x56\x96\x33\x74\xd3\x2d\x24\x40\x2b\xaa\x7a\x2c\x3f\xb8\x6e\x06\xb5\x0f\x57\x8c\x67\xf9\x24\x20\xec\x3a\x71\x1d\xf3\x2d\x80\x1b\x4f\xc8\x9c\x5e\xb3\x4f\x36\xb2\xc4\xe7\x3a\x0a\x87\xaa\xfb\x73\x82\x8e\x85\xf4\x1d\x97\x73\x64\xaf\x21\xf6\x42\x88\x39\x26\xa7\xa0\x41\x62\x07\xce\x60\xc9\x65\xe4\x1a\x2d\x6e\x85\xb2\xed\xca\x92\x8d\x0b\x9e\x56\x96\xc1\x6c\xb1\x13\x6e\x45\x31\x5c\x43\x47\x30\x9c\x63\x19\x4e\x39\x60\xb7\x24\xc3\x12\xfb\x18\xfd\xae\x92\xac\x4a\x85\x61\x63\x51\x76\xa0\x42\x87\xdd\xf1\x32\x99\x74\x08\x60\xb8\x43\xd2\x6a\x87\xe5\xf8\x75\x2a\x32\x61\x3f\xe2\x7f\x13\x9d\x65\xe8\xfe\xdb\xa1\x0c\x06\xfa\xc3\xec\xd1\xe5\x81\xdb\xb5\x1e\x9d\xb7\x75\x65\x69\xab\xe5\x65\xa5\x54\xd0\xcc\x4e\xbb\x40\x2e\xb8\xb7\x58\x70\xdb\x67\xfb\x98\xe9\x9f\xd2\x2d\x71\x46\x2e\xbb\xf3\x43\x28\xc2\x98\x9f\x90\xe2\xe7\x60\x7d\x89\x62\x4b\xc5\x4b\x8d\xe3\xb7\x5f\xba\x4d\x59\x65\x6e\x27\xaf\x7a\x32\xdc\x4b\x2e\x5f\xad\x1f\x89\x4b\xce\xbd\x89\xdf\xf9\x6c\x67\x28\x8c\x3b\x8f\x72\xcc\x6a\x35\x67\x5a\x88\xd2\x96\xc6\xaa\x38\xee\xe4\xfe\x84\xe4\x49\x7b\x48\x3c\x07\x26\x8f\xc9\x9a\x40\xb6\xa9\xdc\xff\x45\xe7\xf2\x89\x75\x2e\xeb\x51\x3f\x2e\xea\x38\xd0\xdc\x8e\x40\xc2\xb7\xec\xcc\x91\x5e\xdb\x49\xf4\x8b\xae\xe4\x53\x1b\x28\x17\x26\x93\x6e\xd0\x3e\xb0\x8c\x39\xbf\x81\x79\xae\x12\x58\x05\x7a\x87\xb4\xf1\x08\xf6\x60\x7a\x3b\xaf\xeb\xd8\xf8\x96\xde\x44\x87\xe4\x4e\x52\x2b\x2d\x3f\x07\xf5\x52\xed\x6a\x79\x78\x0d\xd3\x4f\xf3\x56\xa1\xc5\x4c\xdd\x78\x00\x8d\xc8\x2c\x84\x38\xc9\x56\x58\xbe\xe5\x32\xc3\x80\x81\x4d\x94\xfe\xce\x5a\x4c\x0c\xab\xd0\xba\x44\xff\x7c\xda\x9f\x18\xfc\x69\x85\x15\xc8\x2a\xf1\xe5\xb2\xfa\x8c\x2f\xab\x2f\xb7\xc1\x27\xb9\x0d\xbe\xb8\x4c\x7c\x71\x99\xf8\xe2\x32\xf1\xf9\xb8\x4c\xf0\x5c\x2e\xbb\x1f\x1f\x47\x73\xba\xa6\x54\xe4\xe7\xb8\x1e\x3f\xf9\x1c\x44\xa4\x9f\xe6\x87\xfc\x20\xe2\xd1\x73\xad\x30\x3a\x6c\x59\x7e\x52\x57\x26\x08\xd8\xa9\x28\xb9\xcc\x30\x03\xa9\x56\x82\x71\xfb\x3c\xf7\xe6\xaf\xa4\x2a\x40\x21\x63\x4a\xcb\xcb\x9c\x6c\x61\xe5\xa1\x77\x73\x8a\xf5\x85\x32\x4e\xc6\x4d\x79\x55\x70\x65\xa0\xeb\x2b\x39\xaf\x10\xbf\xc7\x59\x82\xe6\x96\xb9\x06\xce\xf7\xee\x84\x37\xfb\x0b\xc2\xdb\x93\xe2\xca\x45\xd7\xf9\xd2\x4e\x79\x6d\x09\x43\x6a\x70\x48\x62\x0b\xc8\x52\x74\x9b\x04\xa0\x06\x04\xc6\x9a\x50\xaa\xb3\x6c\x86\x4e\xdd\x9e\xe2\xa0\x95\x4d\x7b\x0c\x81\x36\xf1\x8e\xb2\xb7\x38\x00\x26\x51\xe0\x76\xc8\x5d\x06\xe3\xf2\x2d\x5a\x8a\xa3\x36\x95\x9a\x01\xa1\x24\x49\x44\x5e\xe2\x19\x6d\xe5\x08\x53\x61\x0c\x1f\xaf\x32\x3f\x50\x29\x14\x73\x26\xd5\x94\x2b\xcb\x9f\x53\xdb\x2e\xf3\xbf\xa1\x11\xc8\x0e\xce\x6d\x18\x3e\x74\xf9\xf7\x03\xbd\x7a\xb5\xd8\x18\x8f\x1f\x4a\x08\xa3\x9b\x8b\x0a\x7a\x88\xe8\x6d\xdf\x0b\x25\x8a\x66\xf6\xd5\xb6\xb9\xcc\x57\x88\x21\x66\xec\x60\x7b\x0e\xb3\xb5\x37\x0e\x65\xc2\xb5\xe7\x97\xeb\x8e\x1b\xc0\xad\x1c\x72\x43\xe8\x71\x78\x05\x42\x14\xb2\x02\x2d\xd8\xa8\xbd\x31\x69\xdc\xb1\xc9\x66\xac\x7f\x8c\xa1\x0a\xd0\x35\x6e\xa1\x9e\xef\xc4\xfc\xfc\xe1\x97\x5e\xcb\x90\xa5\x61\xdf\x74\x1a\xe3\xb1\x12\x65\x05\xe7\x12\xd0\x1b\x20\x48\xa6\x10\x78\x58\x7d\x52\xe6\xb9\xc3\x2a\xfc\x78\x97\x21\x7e\x6c\x05\x24\x5f\x08\x6e\x56\xae\x07\x16\x0a\xdc\x86\xb3\xbc\xd0\xe3\x82\x4f\x01\xd2\x37\x8a\x48\x8e\x77\x18\xbe\xf3\xa1\xa2\xcf\x89\xef\xe8\xf0\xc4\xd0\xb1\x8d\xf6\xdc\x45\xa1\xd3\x2a\xb1\x82\x9b\x0b\xab\x18\xc9\x24\x3e\xcf\x90\xfa\xd5\x6e\x4a\x7c\x39\x31\xf1\xc1\x92\xcd\xbf\x51\x08\x7e\x98\x2b\xa9\xc6\x26\x80\x35\xc0\x79\xeb\xd4\xbc\x10\xca\x00\x59\xca\xc1\x5e\x06\x9a\xe8\x42\xa4\x8c\xb3\x71\xc5\x0b\xae\x4a\x21\x52\x78\xfa\x81\xf4\x85\xaf\x85\x18\xca\xc5\xcb\xe8\x1e\x76\x37\xb2\x94\xd8\x21\x92\x5c\x0f\x07\x67\x2b\xd3\x58\x5b\x4e\xf4\xf6\x94\xe4\x41\x63\x8f\x84\xea\x38\x14\x86\x2b\x80\xff\x05\x4c\xb2\x8e\x4b\x1e\xb6\xc5\x58\xd6\x00\x2e\x74\xa1\x6b\xd1\x3e\x8f\xde\x31\x0c\xce\x1b\x1b\x69\xdd\x23\xc9\xb3\x97\xe8\xe9\x61\x78\xe7\xec\x56\xa1\x0f\xf5\xe7\x69\xd9\x59\x7a\x93\xcd\x9f\x88\x16\x06\xbc\x7b\xb5\xfe\x0b\x30\x36\xbd\x05\x42\x2e\x53\x87\xd4\xca\x39\xc6\x4c\x81\xe8\x84\x22\x08\x76\x2b\x12\xbe\xed\x3d\xe3\x92\xae\x7f\xd1\x5d\x7c\xc6\xba\x8b\xb4\x98\xbd\xab\x56\xd1\x1d\xc2\x4a\x89\x94\x9d\xc8\x91\x03\x21\x65\x75\xea\xb3\x41\x9b\x18\x44\xc5\x6e\x10\xbb\x32\x06\xf4\x0a\x67\xf6\x48\x22\x00\x15\x40\x16\x46\x54\xc2\x31\xb0\x54\x16\x22\x29\xe5\xad\x70\x4f\x41\x03\xb9\x63\xe1\x35\x28\x8a\x02\xde\x61\x26\xd7\xca\xa0\x85\x5a\x05\x04\xd2\xbc\xd0\x89\x30\x20\xf2\x78\xf5\x2e\xbe\xd8\x18\xe4\xce\x8f\x78\xed\x29\xeb\xb2\xb3\x2c\x3b\x05\x6c\x91\xb4\x98\x01\xa6\x88\x29\xf9\x58\x84\xc0\x4d\x6a\xae\x89\x3c\xf6\x18\xde\x57\x3c\x11\x17\xa2\x90\x3a\xbd\x14\x96\x95\xad\x62\xc0\xf6\x6e\xf0\xa9\x97\xa4\x62\x06\x6b\xb1\x21\xc6\xdd\x96\x01\x8d\x3e\xdc\x1d\x68\x5e\x4e\x9b\xbe\x05\x4a\xab\xae\x0b\x21\x75\x50\xe7\xf1\xe5\x03\xb0\xe6\x61\xe9\xb1\x15\x26\xa7\x53\x91\x4a\x5e\x82\x3f\x88\x03\x7e\xf7\x8e\x06\x4a\x66\x28\x7e\x38\xd8\x53\x98\xa0\xdd\x15\x52\x07\x8f\xa9\x00\x79\x09\x5c\x3c\x06\x9a\xaa\x43\x91\x71\x50\x79\xd0\x84\xa8\x93\x51\x1d\xd9\x93\xe0\xd7\x31\x64\xb8\x65\x8c\xbb\x16\x5e\xbe\xa8\xfe\x3e\x89\xea\x4f\x17\xf9\x84\xab\x17\x0e\xb1\x77\xd5\x31\x79\x61\x09\x98\x40\x06\x52\x96\x23\x98\x91\x53\x79\x5d\x14\x3a\xe7\x63\x38\x40\x17\x3a\x93\xc9\xac\x13\x09\x6d\x7e\x2f\xa6\xbe\x01\x7b\xca\xfa\xbd\x3f\xf4\xd8\x25\x1e\x28\xdc\xdd\x34\x0e\x5a\x30\x03\xb1\xda\x30\x44\x20\xeb\x08\xc0\x35\x0f\x47\x28\x07\x21\x58\x09\xfe\x3c\xd8\x63\x23\xa9\x20\xcc\xba\x88\x82\xd9\x31\x3a\xf8\xd0\xb9\xdc\xf8\xc5\xc5\xe6\x9f\x98\x50\xc9\x90\xaf\x24\xe1\x80\x45\x43\xd7\xc5\xfc\xdc\xdc\xbd\x6d\x44\x89\xaf\x09\xd8\x01\xba\x9c\x6c\xe3\x6f\x67\x29\xe2\x1f\x20\x3b\x7c\x88\x5f\xd4\xda\x5d\xf6\x22\x7f\x43\xac\x6b\x54\x65\x23\x99\x65\x22\x75\x7c\x8f\x93\x2c\x42\x8f\x28\x5e\x14\x96\xbb\xe8\xaa\x84\xc5\xb0\x93\x76\x7a\xd7\x0e\xe3\xec\xe9\xd1\x37\xec\xb9\x56\xa3\x4c\x26\xa5\x7b\x9d\x87\x88\xf0\xb2\x2a\xec\x2a\x2e\xce\xcb\x53\xa3\xf0\xea\x8b\x94\x52\x67\xa4\x6c\xa2\xef\xd8\x98\x17\x43\xfb\x2c\x0e\xce\x3e\xe1\x12\x12\x05\x86\xa8\x2f\x58\xdc\xb7\x8d\x23\xb0\x78\x6d\x81\x89\x3b\x0e\x9c\xe3\x46\x90\x06\xe0\x2e\xd2\xe0\xaa\x25\x3e\x48\x4c\x73\x10\x36\xa4\x7d\xb6\x3a\x15\xb6\x7b\x9f\x46\x3b\xcf\x05\x5a\x3b\x9e\xd5\xf5\x4f\xa6\x7a\x67\x3d\x76\xe6\x15\x0c\xb5\x9b\xf8\x09\xce\xe1\x09\xeb\xd2\x69\xa9\x9f\x26\xf3\x27\xf6\xe4\x3b\x9e\xdc\x8c\x01\x3a\xc3\x96\x42\xeb\x1a\x18\xf8\xeb\x84\xd3\x00\xd6\x46\xfc\xbe\xde\x88\x9b\xc1\xd0\xb7\xf4\x27\xf6\xe4\x95\x2e\x44\xd4\x2c\x4b\xb8\x49\x78\x8a\x80\x04\x40\x1f\x90\x6c\xb0\x3d\x83\xa2\xc2\x5c\x83\x23\xdf\xc6\xae\x50\xa6\x1e\x5c\x8b\x58\x17\xf6\xd7\xd2\x23\x76\x56\x74\xc4\x53\x00\x1e\xd3\xaa\x89\x53\xfb\xaf\xd5\x31\xf8\x7f\x6d\xd3\x7b\x21\xc6\xd2\x94\x28\x81\x7d\x32\x12\xec\x7c\x10\x1b\x93\xa3\x86\x80\xf9\xd8\x64\xd8\x79\xe7\x5b\x4c\xff\x93\xee\x83\x07\xe8\x7e\x73\x12\xe4\xe6\x11\x27\x7c\xdf\xce\x1e\x7f\x7a\xb6\xc7\xe3\x4d\x7a\xac\xca\x89\x15\x97\x93\x4f\xb3\xa5\x76\xdf\xfb\xc6\x24\xaf\xca\x89\x2e\x1c\x30\xd9\x27\x98\xff\x6e\x3b\xdf\x62\xfa\xda\x24\x00\xe2\xf8\x98\xb3\xde\x49\x9f\xc7\x9f\x6a\xb2\xc7\x9b\x9e\xb2\x21\x2f\x93\xc9\xa3\xd1\x77\x07\xbd\x6d\x4a\xd9\xfb\x77\x79\x0c\xc1\x21\x9b\xf4\x19\x81\x7f\x3f\xba\x30\xb0\xf3\xbe\x37\x25\x78\xa2\x75\x91\x4a\xf5\x49\xb8\xd6\xce\xfb\xde\x74\xf2\xce\xdb\x71\x2e\x6b\xc5\x56\xbd\x6f\xbc\xf1\x76\xdb\xfd\xa6\x93\x17\xb7\xa0\xa2\x7b\xe4\x35\xdf\x61\xaf\x1b\x4f\xd8\x4b\xdd\x8f\xdb\xef\x28\xd3\x77\xa0\x75\xd4\x59\x2f\xc0\xf1\x7f\x92\x1d\xf7\x70\x43\xd9\x94\x28\x72\xca\xc7\x82\x14\x2e\x9f\x84\x14\xce\x2e\xf6\xa9\x97\x84\x1c\x2d\xa5\x1a\x3f\xf6\x51\xdc\x71\xcf\x9b\xee\x00\xa5\x53\xf1\xe8\x53\xde\x55\x9f\x9b\x2f\xf3\xae\x7a\xde\x94\xcc\x78\xc6\x1e\xb7\xcf\x62\xc8\x93\xde\x27\x7d\x10\x3d\xd0\x08\x36\x5e\xf6\x07\x1a\xc7\xa6\x0b\x62\x92\x89\x48\xab\xec\x13\x30\x99\x1d\xf7\xbc\xf1\x02\xec\xb8\xff\x8d\x09\x8f\xb1\xe3\x8f\x4e\xf5\x1d\x76\xbb\x39\xc9\x77\xd8\x79\x93\xde\xf4\xd7\x16\x7e\xc2\xaf\x20\x39\xe6\x4f\xfd\x25\x4e\x43\xae\x08\xa2\x19\x80\x09\x5c\x80\xeb\xa1\xcb\xaf\xaf\x18\x77\x70\x07\x2e\xe3\x36\xe5\x32\xbd\x2a\xa4\xe8\xf8\xec\x15\x68\xa8\x47\x64\x6b\x9e\x4c\xd8\x8d\x98\xc5\x89\xe8\xd9\x93\xde\x93\x79\x83\x3a\xc1\x12\x94\x46\x64\xa3\x08\xc5\x9c\xc0\x9b\x21\x6f\xaf\x8e\x7c\x4b\x45\xd9\xa9\x65\x0a\xac\xb5\xc7\x99\xa9\x86\x5d\x6f\x7c\x93\xa5\x98\x52\x5c\x04\x16\x86\x96\x31\x1d\x7d\x94\xa0\xde\x08\x36\xa2\x1c\xaf\x53\x5e\x9a\x53\xf6\x64\x74\x4a\xf9\x0f\xf8\x14\x33\x21\x88\x27\x1d\x76\x07\x89\x26\x9b\x3f\x34\x61\x56\xb9\x4f\x2c\xc4\x1c\xbd\x60\xc0\x40\x0b\xfb\x9d\x9d\xd1\x93\x5b\xea\x00\xec\x6c\xad\x3d\x44\xbf\xb8\x2e\xc4\x07\x9e\x94\xec\x6f\xc6\xe7\xf5\xf0\x3e\x8d\xd8\xb1\x4f\x37\xce\x9e\x48\x6a\x1f\x12\x28\xb7\xb6\x1f\xfd\x82\x98\x10\xe8\xe4\x86\x2d\x41\x23\xd2\xa7\x44\x7e\x72\x43\xcd\xdd\x88\x99\x69\x6d\x2d\xfc\x80\x3e\x14\x14\xb9\x13\x0f\xea\x89\x01\x1a\xd0\x9e\x42\x67\x2d\x59\xb0\x4a\xc9\xbf\x57\xde\xe0\x78\x6e\x7b\xbf\x81\xf0\x98\xdc\xd4\x16\x1e\x37\xa9\x4f\xc4\xee\x37\x0e\x98\x00\x6d\x8d\xc8\xf1\x17\xf1\xf4\xcb\x90\xaa\xb0\xf4\xe9\x51\x90\x86\x01\xe6\x9b\x52\xb2\x82\x57\x8e\x1c\xbb\x07\xda\xa1\xdf\xe8\x69\x17\x92\x48\x77\x53\x39\x1a\x05\xcb\xdf\xbd\xfd\xf9\x16\xc2\x46\x2e\x3e\xa5\x71\x95\x7a\xc0\xec\x00\x79\xd0\x21\x71\x90\xc1\x1e\x9c\xa2\xc1\x5e\xf8\x4c\xdb\x1f\xd6\xd6\x01\xdc\xb2\x73\x20\xc0\x94\x03\xb6\x02\x4e\xd8\x52\xfc\x46\x88\xdc\x25\x84\x6e\x66\x0f\x5c\xe8\x1b\xb8\x6d\x20\x78\x1d\x14\xec\xec\xe2\xbc\x25\x26\x3c\x18\x72\xa7\xf3\x53\xdd\xdc\x29\x65\x33\xac\x8c\xfa\x00\xdb\x86\xa4\x47\x31\xa9\x6b\x31\x67\x86\xdf\x8a\xc8\xc3\xc7\x90\xfb\xbc\xae\x86\x19\x66\x70\xc8\x33\x59\x7a\x46\x18\x2f\xf0\x8e\x5d\x5d\x17\x45\x17\x3b\x5a\xb8\xeb\x65\x77\x1b\xfc\x35\x1f\x8a\xec\x52\xa0\xd5\x7f\x59\xfc\x2e\xcb\x6c\x49\x66\xa8\x28\xc1\x50\xc0\x77\x98\x49\x0a\xc2\x72\xfd\x95\xe4\x7d\x28\x91\xaf\x93\xf7\xa1\x1e\x61\xd8\x1a\xf4\x4a\x0e\xde\xf6\xf3\xcb\x0f\x96\x27\x84\xf8\xa7\xb3\x1f\x5f\x90\x93\x23\x32\x95\x46\xdf\x14\x78\x07\x9e\x04\xe4\x23\xd4\x63\x67\x4c\x55\x59\xb6\xa8\xa8\xd2\xbe\xe4\xea\x53\xd2\x1c\xd3\xaa\x48\x8d\xe6\x14\x6a\x10\x1d\x8d\x01\xd1\xc2\x4f\xd1\xff\xec\x6a\x22\x6a\xdf\x44\xb3\x5f\xcb\x5b\xf2\x1e\x8e\x41\xb5\x95\x7f\x17\xc6\x70\x2f\x97\xcb\x68\x75\x9b\x44\x6b\xcb\xd1\xbd\xbd\xfb\x67\xdb\x12\xd0\xae\x8a\x2f\xb6\x7f\xde\x88\x59\x07\xee\xa2\x5f\x31\x5d\xbd\xdd\x27\x84\x96\x15\xff\xe6\xfc\x72\xa2\x66\x6c\x0b\x56\x28\xfa\x7b\x25\x6f\x79\x26\x54\xe9\xae\x39\xcc\xdf\xe0\xf7\x72\xb4\xf0\xf6\xae\xd5\x46\x84\xfb\xd3\x36\x30\xd8\xbb\x11\xb3\xc1\x1e\xde\x85\x76\xe2\x9c\x8e\xcf\x60\xef\x5c\xd9\xef\x9d\xe3\x8f\xf7\xe5\x29\xf8\x2c\x5c\x1c\x10\x1a\x3a\xd8\x43\x31\x63\x6f\x83\x1d\xd3\xc6\x1a\xda\x79\xd1\x5a\x7e\x33\x53\x9e\x77\xfd\x06\x80\x5c\xf8\xf7\xe5\x36\xf1\x9e\xdb\x80\xf1\x44\x93\x27\x3f\x50\xf7\x0b\x26\x2b\x77\x84\x43\x72\x76\x50\x4e\x41\x2a\x43\x12\x60\x5a\x00\x28\x5c\x88\x8c\x3c\xaf\x71\xd1\xe0\x3a\x43\x27\xf3\xd5\x5c\xe2\x46\xac\xf2\x4f\x23\xb9\x1a\xbd\xdd\xed\x24\xec\x17\x3e\xa8\xc9\x8f\x9b\xe7\x04\xdb\xa4\x97\x5f\x27\xb5\xdf\xea\x79\xfe\xed\x46\x24\x09\x08\x87\x05\xa3\x5b\x55\x01\x5c\x1c\xc4\x18\xca\x43\xe5\x05\xee\xa1\x44\xb3\x55\x41\x5e\x8e\xb4\xb5\xec\xe1\x37\x62\xf6\xc4\x20\xa1\xed\x11\x99\xc8\xdc\x25\x02\x85\x23\xe4\x5c\xfa\xd1\xb1\xdc\x35\x81\xbb\xfa\x5c\x75\xd8\x8f\xba\xb4\xff\x79\xf9\x01\x30\x23\xec\xfa\xbc\xd0\xc2\xfc\xa8\x4b\xf8\x66\x1b\x68\x32\xe8\x70\x95\x54\x81\x47\x91\xd0\xdc\x5c\x62\xfb\xd8\xe1\xd8\x90\x7f\x76\xfd\x48\x9f\x2b\xfb\x84\xa0\x31\xcf\x9d\xe9\xd8\x37\x1c\x03\x89\xda\xda\xa0\xa9\xea\xa2\x36\xd3\x25\xcd\x51\x53\x08\x3d\x08\xbf\x60\xac\x46\x06\x08\x90\x69\x55\xd0\x8b\x0b\x17\x5b\x26\x0c\x96\x1a\x61\xd2\x3e\xab\x28\xe2\xfa\x96\x0d\xdb\xee\x01\xa4\x1e\x69\xca\x37\xa2\xe4\x4b\xf8\x8e\x2b\xc2\xf0\xfb\xa1\x30\xde\x6b\x13\x8f\xb0\x99\xa9\x72\x22\x4a\x99\x44\xe0\x37\xb0\x24\x13\x7e\x2b\x28\x01\x38\xf8\x40\x66\x7e\xeb\xde\xf2\x42\xea\xca\x78\xe8\xc6\x20\xba\x78\x47\x75\x8f\xbb\x06\x7c\x9f\xde\xbe\xff\x7c\x0b\x25\xed\x70\x3a\xcc\x0d\xec\xd7\x75\xb0\x76\xb5\x7d\x6f\x57\x2b\xd3\x56\x53\xb1\xc8\xe9\xd5\x21\x03\x40\xe6\x51\xfb\xd9\x0a\x34\x53\x59\x3a\xf4\x43\x4a\x94\xa5\x47\xf0\x66\x34\xde\xb3\x97\xb0\xc2\xea\x31\x2d\x11\x9e\xc0\x84\x13\xa8\x25\x10\x32\x44\xb3\x47\xa1\x11\xd2\xc3\x31\xba\x58\xa0\x28\x4f\xb6\x34\x06\x7e\x80\x50\x5f\xe7\x82\xef\x42\x8a\x22\x6f\x7d\xbb\x40\x10\xbf\x89\x7e\xbe\x20\x8c\x95\xda\x0e\xb3\x90\x82\xa4\x7d\x25\x3e\x94\x8e\x0f\xf9\x91\x84\x55\x79\x8e\x54\xc1\xd3\x03\x31\x85\xa6\xb4\x97\x0e\xb4\x15\xc5\x04\x3a\xe7\x67\x47\x32\x97\xb3\x1b\xd2\x93\xbb\x68\x12\x3b\x6f\x17\x23\xec\x52\xdf\x41\xa2\x3c\xce\x46\xe2\x8e\x4d\xa5\xaa\x2c\xb9\x60\xe9\x73\x6e\x8c\x48\xbd\xe0\x0c\x1b\xc3\x3d\xc4\x50\xac\x70\xd4\xc6\x48\x31\x17\x9d\x8c\x68\x98\xb8\x92\x48\x4a\xe7\xfd\x8c\x01\x9d\x09\xcf\x1c\xa5\x88\xd2\xf4\x3c\x92\x85\x29\x7d\x34\x50\x27\xce\x2c\x0c\xe3\x29\x44\x22\xa4\x27\x65\xa9\x6f\x84\xa2\x04\x78\x2e\x92\x88\x02\xea\xb6\x60\xc7\x08\x40\x29\xd5\xf8\xbc\x14\xd3\xe7\xba\x52\xab\x12\xfa\xcf\x57\xf0\x9a\x1d\xbf\x25\x4d\x35\x34\x76\x67\xa8\x92\x76\x27\x4d\x14\x56\x0e\x81\x82\x5c\x86\x5b\xc2\x95\x0c\xe9\x28\xa0\x8c\xa3\x85\x67\xd0\xf4\x2d\xee\x36\x12\x31\x44\x4a\xb7\xba\x2e\x68\x59\xdc\x8d\x6e\x28\x6c\xbc\x3e\x2a\x3f\x72\x37\x28\xc3\x2a\x0c\xe2\xf4\x22\x60\x3d\x4c\x22\x13\xa3\x92\x55\x0a\x4e\x9f\x4a\x7d\xba\x3a\xe2\xe8\xb5\x04\xb2\xf5\x81\xc2\x46\x98\xe6\xe0\xbe\xbd\x4f\x5a\xbd\xa1\xa0\x3c\x65\x3e\xc0\x3d\x99\x54\xea\x06\xd4\x0d\xe1\xd7\xd2\x3d\x8a\x5d\x1c\x3e\x14\x3a\x08\xf3\x29\x04\x91\x0e\xb7\x70\x73\x4e\x38\x91\xb9\x80\x8f\x8d\x66\xe2\x62\x72\x74\x96\xba\xe4\x93\xb7\xfd\x5e\xff\x19\x4b\x35\x46\x27\x01\x30\x88\xeb\x03\x8f\x89\xcf\x02\x57\x99\x08\x93\xac\x6d\xa7\xfc\x5e\x98\x52\x4e\x21\xa2\xf9\xf7\x78\x5c\xe5\x3f\x48\x2f\x17\xc2\x06\x02\x7e\x4c\x2d\x8b\x39\x70\xe4\x45\x6d\x63\xce\x6b\x60\x27\x05\x7d\x00\x25\xd6\x03\x44\x78\xd7\x58\xc2\x8a\xf3\x72\x49\xb9\xa8\x01\xd9\xc0\xc5\x75\xc7\x10\x2f\x4f\x4c\x14\x83\x19\x23\x76\x86\x88\x29\x14\xac\xb9\xf2\x8c\x38\xe0\xe4\x62\xa0\x40\x29\x8a\xa9\x54\x04\x8c\xe0\xa2\x76\x80\x77\x78\x78\x85\xf5\xa1\x77\x11\x9f\x15\x78\x20\xab\x14\xc6\x43\xda\x3e\x79\x72\x13\x67\xf0\x17\x45\x8f\x5d\x34\x11\x72\x0d\xa4\x90\xed\xb1\x77\x82\xa7\x5d\x7b\x85\x3e\x78\xe0\x55\xa2\x15\x06\xf8\x27\xb3\x2e\xb9\x2e\x74\xb9\x4a\xbb\xfe\xc2\x68\x1a\x37\xd7\xc3\x62\xca\x46\xaf\xa5\xba\x59\x15\x30\x4e\xc5\xf0\x1d\xf4\xfe\xdd\xeb\xa6\xd6\xde\x2f\xe1\x5a\xa4\x1a\xa8\x81\x7a\xf1\xf2\xe2\xdd\xcb\xe7\x67\x57\x2f\x5f\xb0\x1f\xfc\x73\xc1\xe5\x81\xd4\x39\xf3\x21\x3a\xae\x7d\xaf\x45\xef\xf7\x8e\x8f\xec\x19\x81\x78\xb0\x3a\x43\x93\x86\xe5\x19\x57\x0a\xaf\xf0\x3a\xfa\x71\xbf\x77\xdc\x77\xd5\x1e\x3b\xbf\x78\x10\x08\xdf\x70\xc5\xc7\x22\x45\xe5\xf5\x4b\x55\x2e\xd5\xf0\xce\x17\xc6\x05\xb8\xd3\xc5\xcd\x28\xd3\x77\x5d\x69\xc5\x20\xd4\x84\x5f\x12\xcb\x0b\x30\x9a\x0b\x40\x7c\x83\xa4\x84\x9a\x77\x5b\xaf\xe5\x5d\xf8\xd0\x51\xdf\x51\xb0\x77\x7d\x5c\x7e\xa9\x1b\x23\x43\xc8\x6a\xaf\xa7\x9f\xd7\x71\xff\xcd\x1e\x79\x30\x43\x81\x56\x55\xe7\xdd\xcc\x1e\x2e\x16\x8d\x83\x18\x39\x2a\xba\x95\x48\xac\x34\x51\xcc\xe0\xb0\x17\x70\xea\xeb\xe3\xe3\xd1\x48\xa2\x6b\x2d\xf1\x21\x98\xbc\x2a\x35\x20\x59\x40\xba\x54\x8f\x10\xbe\x85\x78\x82\x6b\x71\xb5\x1a\x31\xe1\x95\x2f\xe8\xae\xcf\x54\xda\x02\x53\xa9\xe0\x61\xe7\xa2\x73\x03\x98\x32\x19\x58\x88\x74\x91\x22\x1d\x48\x5a\x88\x3a\x60\x89\x7f\x0e\x78\x69\x13\x44\xb8\x53\x36\xf0\x66\xc1\x6d\x94\xec\xa3\x79\xab\x23\xbb\xa7\x5e\xd1\x1b\x32\x97\xe9\xeb\xbc\x29\x73\xa2\xc1\xca\xe4\xa5\x50\xb0\x4f\xba\xb5\x76\xb4\x31\xfe\x11\xe6\x01\xd3\xe3\x69\x43\xa0\xf3\x22\xac\x1d\x38\xab\xab\x54\x17\x78\xa2\x0b\x7a\xf0\x47\xf0\x27\x74\x48\xdd\xc9\x66\xd0\x1c\x19\x02\x8c\x3b\xaa\xdb\x20\xe8\xe4\xeb\x01\xe7\xbc\xcd\x23\xf0\x99\x32\x4a\x2a\xed\x1b\x20\x79\x36\x13\x3c\xc5\xdb\x51\x1a\xd6\xc2\xa0\x86\x02\x60\x8f\xf0\xda\xc5\x43\x0b\x5b\xea\x36\x0e\xe8\xaf\x63\xac\x80\xa0\xf7\xe4\x2c\xcf\xb3\xd9\x13\xd8\x9f\x4f\xde\x43\x68\xf3\x93\x6d\x30\x47\x1e\x19\x5d\xca\xe3\x49\xc9\xa9\x30\x25\x9f\x82\x32\xd8\xc1\x36\xf9\x85\x63\x77\xa2\x40\xb3\xa3\xe5\x3d\x24\xea\x91\x41\xdb\x29\x56\xec\xab\xae\xb6\x0a\x44\x91\x87\xbd\x8e\x64\x52\xe8\x06\x22\xd7\xdc\x9e\x75\x65\x20\x07\x41\xe0\x8e\xf0\x15\xe0\x10\x4d\x6d\x09\xc4\x30\x60\xc8\x73\x7d\xe2\xed\xe8\x42\x09\x02\xa9\x5d\xdc\x6e\x19\x93\xf6\xfe\x59\x89\x83\xe6\x62\xc9\x54\x42\x21\xb0\x74\xd6\xd4\x2c\x3c\xcb\x02\xee\x45\xbb\xaa\x85\xa0\x5f\x5d\x86\x80\xc8\x2a\x04\xea\x0b\x2a\x8b\x7b\x7f\x9d\x9b\xd4\x5e\x23\xbc\x35\x0e\xfb\x41\x6d\x18\x67\xa1\x5f\x62\x44\x95\x0a\xf6\x6d\xd0\x1d\xe3\xb3\x7d\xca\x73\x74\x01\x49\x19\x25\x65\xaf\x5f\xd6\x91\x16\x67\x38\x03\x13\x31\x08\xf7\xa5\xd6\x19\x9a\x3b\x4b\x4d\x69\x29\xbc\x3a\x84\x17\x43\x59\x16\xf6\xd2\xf5\xa1\xc9\x96\x47\xcc\xfc\x3b\x19\x6c\x7c\xa0\x1f\x81\xec\x25\x1e\xfe\x02\xc4\x4d\xd0\xb3\xc0\xe9\x02\x69\x1d\x10\xd6\xbc\x1a\xa5\x21\x7f\x9f\x1e\x1e\x06\x3d\xb4\x95\xc0\x53\x9d\x98\x43\xbb\x4e\xdd\x71\x25\x53\x71\x18\x93\x7f\x3d\x83\x46\xc4\x67\x92\xac\x32\xa5\x58\x27\xbb\xcb\x55\x03\xc1\x9a\x6a\xd2\x66\x8a\xa0\x3e\x42\x2a\xa9\x60\x33\x76\xda\xa8\x14\x83\xbc\x2b\x69\x26\xd1\xd6\x84\x45\x81\xac\xfe\xd0\x01\xa0\xab\x38\x14\x6c\x7b\x7f\x05\x19\x80\x3a\x35\x35\xb8\x29\x7a\x9e\xe3\x63\x79\x86\xde\x1b\x85\x1c\x4f\x4a\xa6\xf4\x1d\xda\x31\x7c\x1e\x10\x69\xd8\x58\xc3\x7d\xa4\x99\x1c\x2b\x20\x35\xe8\xee\x28\xd8\x1c\x37\x3d\x40\xc4\x00\xef\xf6\x48\x2e\x9b\xb3\x70\x68\x8a\xe0\x95\x80\xa5\x3e\x26\x3f\x7f\xde\xec\x1c\x25\xee\xc0\xde\xe7\xdc\x95\x88\x40\x31\x5e\x5f\x78\xd0\xde\x71\x13\xee\xc2\x73\xaf\x11\x89\xb0\xc2\xc2\x6b\x5e\x2a\x36\xe1\x79\x2e\x94\xe9\x12\x1e\x02\x60\x94\x32\x6e\x99\xab\x61\x46\xe4\xbc\x00\x1a\xbb\x4b\xc2\x04\xed\x81\xd3\x12\x7a\x95\x05\x1c\x60\xd7\x65\x9c\xc7\x5f\x2a\xf6\xee\xd5\xf3\x93\x93\x93\x6f\xd0\x5b\x81\x23\xca\x89\x54\xec\xfd\xd5\x73\x78\x99\xad\xf3\xd6\xfd\xb1\xc2\x54\xfc\xa8\x73\x7e\xf0\xb7\xaf\xe3\x15\x0b\xb0\x90\x08\x34\xe2\xfb\x4d\x61\x78\x7e\x0c\x8a\x3c\x02\xe0\xf1\x29\x8b\x9c\x80\xe2\x14\x13\x1a\x31\x70\x46\x95\x15\xf4\x51\x0b\x61\xd7\x82\x16\x4a\x96\x11\xf2\x44\x03\xfc\xc3\x51\x0f\xd2\xfc\xd8\xf5\x89\x40\xb7\x9a\xfb\x2c\x33\x1a\xa5\x84\x37\x9c\x24\xf1\xa1\xc0\xac\x56\x02\x20\x49\xc2\x0a\xec\x5a\xd7\x33\x37\x9e\xc7\x3c\x74\x2f\xda\x88\xf1\xee\xd5\x73\x06\xdb\x14\xd8\x09\x3c\x6d\xed\x11\xe3\xa5\xe7\x9c\xf1\xe3\x31\x20\xbe\x10\x4a\x52\x9d\xcf\xd1\x15\x15\x9d\x57\x58\x05\xee\x57\xb5\x86\x3c\x42\xbc\x2b\x9c\x00\x7b\x6b\x74\xdc\x51\xb1\xe7\x0c\x31\xaf\x70\x41\x11\x20\x63\x38\x63\x9c\x14\x4b\x75\x85\x3a\xd8\xf6\x1d\xe0\x20\x9e\x76\x1a\x24\xdb\x57\x1a\xb1\x9b\x0b\x76\x2b\xf1\xb1\x05\xdb\xa6\x96\x38\xc7\x74\x08\x36\x8b\x60\x93\x5d\x6f\x96\xd3\x1f\x30\x3e\x2a\x09\x97\x10\xa8\xe3\x94\xcb\x84\x5d\xa8\x55\x22\xe8\xcd\x53\x03\x9e\x81\x31\xa1\x35\xef\xcc\xc0\x10\xec\xdb\xa7\xad\xa0\xb7\x72\x83\xda\xb5\x53\x23\xd3\x30\xd3\xc9\x8d\xa5\xf5\x5b\xd7\x4d\xeb\xae\x06\x0f\xcd\x08\x60\x2a\xb2\x68\xa0\xa6\x16\x13\x55\xd9\xbf\x1c\x30\x98\x54\xa4\x7f\xc3\x74\x55\x1d\xc6\xb3\x72\xa2\xab\xf1\xc4\x9e\x34\x27\x75\xb8\x63\xc1\x9a\x19\xfc\xa8\x80\xa3\x72\x5e\x48\x54\x94\xa2\x55\x41\x4e\x45\x0d\xcc\xba\xc3\x38\x1a\x9f\x10\x0c\x8e\xec\x3c\x20\x11\xb2\x5c\xa7\xe8\x13\x88\x2d\x49\xc5\x4e\x8e\x1c\xaf\xc0\x55\xfe\xa1\x1a\xda\x1f\x1d\xf4\x19\x4f\x60\x9f\x19\xa1\x52\x34\xe7\xf8\xfd\xe5\x78\x06\xf8\x90\xc9\xb1\x0a\x26\x12\xa7\xe5\x0f\xc0\xe3\xb9\x4e\x7b\xec\x8c\x56\x96\x97\x51\xa7\x68\x9d\xad\x75\x6a\xfb\x62\x9c\x4d\x78\x91\xb6\x75\xb2\x7f\x79\xfe\xfd\x0f\xe7\xaf\x5f\x1f\xcc\x75\x87\x37\x3c\xf4\x92\x64\x82\xab\x2a\xef\x10\xf7\x72\x83\x08\x4c\x0c\x10\x2d\xcf\x69\x74\x70\x97\x24\x20\xd0\x50\xe8\x0c\x78\x57\x22\x4b\xe8\xd4\xf8\xa6\xa5\xa9\x29\xed\x30\x01\xa7\xc6\x6f\xd7\xf8\xc5\xd4\x61\x95\x2a\x65\x06\x16\xf0\x74\x2a\x15\x02\x22\x68\x40\xf0\x26\x05\x0b\xac\x22\x80\xbb\x81\x76\x38\xe8\x81\xcb\xc6\x41\x6b\xf0\xe7\xd4\x03\x07\xc1\x26\x9c\x3f\xec\x24\x93\xd1\x68\x27\xdc\xd0\xce\x14\x2a\x30\x81\x65\x97\xe2\x7a\x6c\xe4\x31\xd5\xc4\xcb\xaf\xca\x70\xbc\x57\x29\x2a\x62\x9b\x7f\x0b\x2e\x5d\x74\x2a\xfc\x26\x21\x30\x8b\x59\x8f\x81\xb3\xb7\xf0\x0a\xcb\x9a\xa6\x23\x4a\xb8\x99\x6b\x85\x5c\x2f\xd1\xd3\x5c\x2b\xe1\x0c\xaa\x2e\x63\x9c\xdb\x8a\xd8\x92\xef\x07\xa1\xb3\xc8\x0e\x35\xcf\x72\xea\x6b\x0a\x0c\x5b\x75\x01\xd2\xce\xb6\x03\x59\x5e\x63\x13\x9c\xdd\x50\xee\xaa\xa5\xcb\xbb\xc7\x5e\x05\x36\x18\x30\x33\x11\x5c\x90\xde\x33\x5e\xaf\xcc\xd5\x0c\x05\xb5\x1e\x63\x6f\x41\x60\x93\x86\xfd\xf8\xf6\x8a\x09\x35\xd2\x45\x02\xe8\x56\xc1\x22\xa6\x4a\x04\xab\x35\x70\x3e\x21\xe2\x59\x95\xac\x90\xe6\x06\x1d\x3f\xaa\xe4\x26\xe2\xc1\xbd\x98\x1f\xa3\x0f\xd2\x84\xdb\xe7\x98\xc7\xa6\x9d\x31\x0e\xae\x3d\xf0\x14\xc8\xed\xbe\x37\xe8\x0f\x0c\x28\xce\x28\x40\xca\x40\xad\x00\x12\xe5\xae\x81\x30\x2f\xa9\x70\x1e\xde\x06\x27\xf1\xb4\x39\x8d\x0f\x67\x46\x96\x95\xc7\x2c\x0c\xef\x97\xb0\x7a\xf1\x9a\xba\x75\x46\x75\x5b\xe8\x38\x36\x91\x4a\xc3\xee\xb8\x44\xf8\x2a\xf4\xe1\x27\xa6\x85\x17\x37\xf9\x76\xfb\x87\x25\x9e\x39\xf0\x9e\x07\xb3\xfc\x81\x1d\xbd\xa5\x66\x4a\xd7\xef\xc2\x81\xf0\x78\xe6\xbc\xac\x0f\xa3\x43\x5e\xa3\x60\x5d\x84\xd0\x06\xc1\x53\x7b\xb7\xf5\xd8\x5f\xa4\xbd\x77\xca\xb0\x96\x40\xa1\x1a\xdc\x16\xba\x10\x8d\x0a\x21\x2c\x91\x48\x64\x9f\xda\x97\x1c\x68\xd9\xa7\x46\x64\xb7\x84\x31\xec\xde\xb8\xb7\x55\xa6\x44\x01\x17\xb9\xab\x02\x4a\x33\x30\x61\xd5\x8c\xc8\x0f\xe9\x36\xb3\x23\xa7\x2d\x42\xbe\x16\x6b\x3c\x85\xbf\x8f\x8a\x12\x63\xf0\x09\x21\xf3\x42\x8c\xe4\x87\x8e\x37\xfb\x05\x51\xad\x83\x49\x1a\xb0\xaa\xbd\xac\x31\x40\x00\x9e\xbc\x6f\x7f\x7c\xfd\x57\x76\xfe\x0a\x4a\x43\xab\xb8\x71\x6a\x8c\xdc\xa1\xdd\x06\xa0\x4b\x2f\x16\xda\xce\x3a\x21\x5a\xc3\x7b\x3b\xb8\xab\x12\x71\x18\xbd\x6c\xe9\x9f\xd3\xa5\x03\x3d\x83\x6a\xc1\x8d\xc2\xcb\x38\x14\xb1\x62\x40\xdc\x4b\xf4\x74\x08\x56\x7c\x52\xa2\xd0\x04\x4c\x35\x1a\xc9\x0f\x28\x46\x78\x44\x5e\xac\x3e\x21\x69\x0c\xde\xf6\xa0\x39\x25\x2c\xf3\x2a\x13\xc6\x89\x6a\x61\xbe\x9d\xd8\x81\xa5\x2c\x2a\x95\xc4\x37\x55\x26\xd4\x38\x24\x28\xc2\x5e\x9d\x73\x23\x4c\x75\xca\xc9\x66\x82\x9d\xd3\xf0\xc8\x00\x4d\x16\x50\x7b\x07\xce\x91\x2f\x20\x80\x7a\xcb\x13\x2d\x13\x2a\x22\xf0\xd2\x27\xa1\xc5\xc9\xdd\x96\x32\x96\x3d\xba\x94\x21\x80\xe3\xd7\x05\x9c\x72\xc1\xd3\x8e\x7f\x4b\x91\x3b\x01\x15\x3b\x3e\xea\xb3\xe7\x64\xcb\xd5\x05\x7b\x76\x74\x84\xd4\x7c\x87\x38\xe1\x68\xca\xb7\x77\x80\x3d\xad\x11\x96\x78\x7d\xbb\x24\x31\xc8\xed\x48\x57\xca\xab\xf9\xf1\x6d\x91\x65\xba\x2c\x9d\x6f\x51\x8c\xc4\x89\x6a\xa8\x42\xd8\x7b\x68\xdf\xed\xd9\x6c\x36\x2f\x7e\xa3\x3b\x92\x6f\xf6\x9d\xad\xd1\x45\x51\x0e\xf3\x92\x1c\x00\x29\xcf\xc0\xae\x95\xfa\xf4\xaa\xee\x44\x34\x40\x51\x1f\x58\x56\x90\xa9\x98\xe6\x7a\x4b\xd3\xf1\x78\x5d\x4c\xfe\x33\x86\x3e\x32\x89\xf7\x51\x69\x86\x68\xf9\x84\x90\x01\x02\x5f\xbb\xdb\xdd\xc0\x2e\x05\x48\xfb\xb5\x6c\xcb\xbb\x7e\x18\x67\x8f\xef\x63\xfe\x06\x5d\xca\xc9\x0b\xf4\x46\xcc\x4c\xe4\x2f\x3c\xef\x23\x01\x57\xc8\x98\x2b\xf9\x0f\x7c\x26\xbb\x74\xf6\xff\x10\x6c\xdf\x24\x3a\x27\x4d\x2a\xb8\x0c\x1d\x44\xea\x52\x4e\x39\x87\x82\x37\x11\x3a\x0f\xe5\x19\xc1\x47\x31\x72\x33\xc8\x1c\x6a\x24\x64\x54\x4a\x5a\x80\xb1\x57\xea\x5a\x89\x8a\x1b\xab\x59\xa7\xb1\x81\x69\x2d\xdb\x1a\x95\xc5\x78\xb1\xc8\x50\x5e\xcf\x2a\xe9\xbc\x3b\xe2\xa8\x46\x9f\xfa\x86\x3a\xc5\x3d\x66\xc5\x51\x6a\x25\xa8\x65\xa7\xda\xd8\xc7\xff\x08\xf0\xe9\x49\x38\x99\xe8\xca\x88\x1b\x21\x72\xa9\xc6\xc8\x40\xd0\x26\x50\xce\x72\xb2\x0f\x23\x17\x51\x4f\x4a\xa6\x48\xf3\x47\xaf\x5f\xc8\x17\x62\xca\xba\x4f\x53\x8f\x9d\x05\x73\x20\xad\xb7\xd3\x45\x3c\xc1\x94\xa8\x1d\xf4\x17\xa4\x35\xf2\x5f\x92\xe0\x15\x02\x10\xfd\x01\xe3\x79\x9e\xcd\x30\x5f\x1d\x18\xca\x07\x7b\x89\xec\x26\xa9\x73\xf7\x6f\x44\x79\x1a\x67\xa2\x22\x66\x16\x72\x72\x92\x03\x81\x1f\x1e\xec\xc3\x86\x5e\x3e\xc8\xe0\x0f\x1e\x61\xd2\xe2\x54\xb1\xb1\xeb\x70\xb4\xe9\xd6\x48\xd1\x0f\xfc\xda\xf9\x18\xd1\x0d\x63\xef\x23\x10\x1f\xbd\x0e\xbe\xc7\xce\x4d\xb8\x69\x81\x3e\xa8\xdc\x8e\x92\x23\x9b\x48\xb9\x61\xf4\x34\xce\x70\x69\x2f\x74\x84\x4e\x75\x9a\x25\xf4\x2c\x75\x2a\x0a\xd1\x60\x98\xf6\x01\x1d\x65\x1e\x43\x9b\x40\xec\xa1\xd0\xf3\xf7\x4c\x5e\xc8\x29\x2f\xa4\xbd\x7c\x9c\x43\x9b\xdd\xcc\x4e\xf5\xce\xc2\xcd\x40\x3c\xa5\xe6\x63\x1a\x16\xa8\x15\x8f\x7a\x53\xe6\x10\x1e\x87\xe6\x2b\xa0\xdd\xe6\x97\x91\x27\xf9\x1a\xeb\x86\xe6\x91\xd8\x25\x05\xbf\xa1\xf5\xc3\x77\x0d\xe4\x83\x53\xf3\xab\x1c\xc5\x8a\x45\xa6\x96\x66\xf4\x0e\x3a\x0e\x10\x9c\xee\x60\x2f\x14\x45\x88\xdf\xf8\x27\x32\xb7\x27\x5c\x69\x05\x8e\xb3\xf5\xe4\x07\x3d\xf6\xa3\x2e\x6b\x96\x46\x5e\x88\x9a\xf4\x36\x14\x0c\xb8\x3c\xbd\xd1\xc2\xa8\xba\x91\x4c\xa7\x6b\xa2\x1b\x3e\xcd\xb4\xf1\x3e\xc8\x5e\xc4\x45\xa5\xa0\x95\x50\x9c\x02\x80\xb3\x17\x3f\x5e\xfe\xef\xd7\x67\xdf\xbd\x7c\xbd\x93\xc5\xf6\xe3\xdb\x06\x3e\xfc\x4e\x89\xe2\x9d\x00\x21\x7c\x75\x36\xd9\xd7\x14\x17\xe7\xe6\x48\x50\xc0\xc4\xd7\x23\x8f\xb5\xf3\x11\x3b\x7b\xfd\xda\x97\x8b\x1f\xa8\xe0\x5a\x08\xaf\x08\xd2\x76\xd4\xd5\x5b\x8e\x6c\x0d\x58\xe3\xf8\xad\x11\xd4\x10\xd1\xb5\x12\xb3\x6d\x7a\x6e\x73\xe5\x14\x26\xb1\x72\x02\x3a\x20\x57\x73\x1d\x3c\xaf\x5d\x4d\x10\x81\x9d\x52\x0f\xbf\x8c\x5c\x96\xc0\xad\xa9\x12\xce\xcd\x27\xb8\x2d\x05\xa7\x70\xad\x44\x70\x35\x09\x8d\x3c\x38\xc7\x7e\x5b\x5b\xc9\x5d\xbd\x58\x6b\x71\x49\x95\x4c\x77\xf5\xc4\xdd\xcc\x11\xf6\x4c\x39\x57\x53\x3c\x7b\x14\x00\x56\xcb\x42\xf5\x18\x8e\xb0\x6f\xa2\x80\x06\xc8\xee\x96\x97\x72\x2a\x4d\x89\xb9\x91\x9c\x2f\x69\x87\x2a\x40\x9b\xe0\x93\x1c\x5e\x3f\x77\x20\x1e\x06\x0f\x20\xad\x62\x17\x00\x5d\xb4\xc4\xe0\x7a\x83\x64\x05\x49\x9a\x04\x4a\x0a\x26\x44\x14\xd5\x62\x2e\xd6\x73\xbe\xbd\xc2\xf4\x98\xc1\x22\x86\xbe\x44\xa8\xd7\x01\xcd\x73\x52\x65\xbc\x58\x3e\xb2\x75\x2d\x9b\x1b\xba\x0f\xff\xa6\xdd\x7e\x2f\xff\x9b\xba\xfd\x46\x94\xb2\x5c\x64\x39\x91\xde\x9f\xbf\x70\x97\x38\x09\x82\x96\x83\x4b\xf2\xc7\xc0\xab\x18\x19\x41\xc3\xa8\xec\xac\xf3\xe1\x81\x10\xb4\x27\x75\x5b\xa5\x56\xcc\x54\x49\x22\x8c\x19\x55\x59\x10\xd2\x40\xb6\xf7\x9b\x3e\xb2\x4e\x3a\x2b\x76\xa9\xdd\xe1\xd6\x8a\x5d\xbc\xbf\x8a\x5d\x07\xd6\x3d\x0f\xf7\x11\xe6\x2a\xb9\x76\x92\x90\xdd\xbb\xb6\x35\xae\x98\x25\x4e\x61\xb5\x82\xc1\xe2\x29\x14\x5a\x1c\x15\x2a\x11\xe8\xdd\x98\x89\x12\x02\x96\x68\x9e\x33\x50\x62\xde\xa9\xe0\x89\x04\x12\x62\xed\x1b\xcf\x4d\x48\xb2\xf0\x1e\x3b\xb8\x39\x48\x9d\xe7\x33\x15\x74\xc8\x20\x4a\x3e\x3b\x5d\x94\xee\x3a\xcc\x68\x8a\x8b\x81\x55\x8e\x1a\xc0\xe7\xe2\x6e\x3d\xb7\xe7\xbd\xc7\x51\xf5\xb9\xc5\x11\x02\x33\x31\x10\xd9\xd9\xf9\x57\x74\x4f\x89\x57\x3a\xec\xec\xc7\x17\x2e\xd6\x0d\x44\x3f\xaf\x17\x1d\xec\x85\x2c\x0e\xae\xd1\x38\x27\x4b\x14\x16\x85\x15\x83\xec\x33\x67\xb5\xba\x11\xb3\x2e\xe5\xe9\x03\x77\x35\x34\x46\x92\x77\x81\xdb\x14\xf0\x81\x6c\x43\x71\x6a\x23\xc8\x0d\xd3\x63\x57\xba\x11\x2c\xe4\x8d\xca\xf6\xa5\x6f\x40\xe0\xb7\xdd\x0e\xf6\x62\x1b\x8d\x8e\xa6\xd6\x41\x8b\xc6\x9d\x34\x82\x3d\x3d\x3e\x66\xfb\xef\x15\x59\x66\xc0\x4c\xf0\x52\x95\xb2\x9c\x1d\xb4\xe4\x37\x69\x5d\x8e\xa5\x09\x60\x82\x98\xb7\xee\x3a\x34\x88\x01\xf2\xa8\x4f\xaf\xb6\x5a\x7c\x5c\x6b\x54\xeb\x66\x64\x6a\xee\xc7\xcf\x3a\xdf\xd1\xba\x9a\x84\x55\x93\x7a\x8c\x27\xf4\x7a\x37\xdd\x4e\x47\x7a\x9f\xfb\xa1\x3d\xb2\x3b\x62\x71\xcd\xbd\xd5\x5c\x96\xc6\xd4\xe9\xd3\x0e\x63\xbf\x2f\x00\xc2\x7b\xf1\xbd\x03\xbf\x93\x09\x16\x8d\x3f\xa5\x66\x63\x79\x2b\xf0\x79\x98\x14\xa2\x8c\x1c\x3b\xc1\x1f\x9f\x8e\x5c\x24\x39\x5d\x9c\x5d\x3d\xff\xb3\xd7\x09\x0d\x75\x1a\x83\x33\xdd\x7f\x0a\x0b\x72\x45\xcd\x4d\x25\x2e\xe7\xaf\xbb\xf9\xfc\x4e\x2a\x7a\x4c\xec\xa3\x0a\x81\x5c\x8a\x44\x87\x89\x32\xe9\x1d\x34\x13\x3f\xad\xbe\xd5\x36\x8c\x52\xac\xc1\x37\x95\xbc\x18\x8b\xd2\xe7\xb2\x9e\xdf\x3a\x3b\x3b\x3b\xad\xfd\xbe\x3f\x7f\xf1\xe9\x22\xd1\x16\x27\xa1\x5f\xbc\xce\x0b\xeb\xb0\x89\xc8\x72\x13\x9b\xcc\x6a\xaf\xd4\x48\x96\xe5\x58\xd9\x2b\x91\x9d\x5a\xdc\x5e\x97\x1d\x12\x82\x40\x74\x52\x51\x6b\xd0\x45\xa8\x31\xad\x23\x4a\x2c\x46\x25\x68\x9b\x53\xdb\xbc\xae\x26\x82\x41\x1f\xa0\x50\x41\x0d\xa0\x7b\xe5\xd9\x57\x38\xda\x49\x10\x9f\xee\xfc\x02\x2e\x7e\x39\xae\x0a\xc1\x5c\x0a\xec\x35\x26\xb7\x4d\x32\xdf\x98\xdc\xab\x64\x36\xea\xda\x29\x12\x9c\xed\xdc\x54\x12\x1d\x14\xf1\xb9\xec\x56\x07\xdd\xf7\x11\xb2\xca\x4e\x80\x0f\xf5\x2d\xd2\x80\xac\x1c\xa4\x7c\xe0\x6c\xa2\x4d\x89\x76\x05\xf7\xd7\x69\xae\x8b\xb2\x63\x09\xa1\x2d\x39\xe0\xe3\x8e\xf1\xc9\xa2\x95\x5b\x48\x8f\xdd\x73\xec\xcb\x66\xf2\xe4\xf9\x18\x67\xc0\xd3\x80\xe7\x30\x19\xa6\xc3\xd3\xce\xbe\xe1\x68\xe9\x53\xad\x9e\x94\xae\x04\x22\x48\xac\x0f\x0a\xf6\x25\xad\xee\xa7\x4b\xab\x9b\xe8\x74\x95\xc0\x76\x59\x8d\xc7\xe8\x1c\xfc\xe7\xab\xab\x0b\xb7\xc8\xb6\x62\x78\xe0\x23\xee\x4a\x87\x1d\xf9\x44\xa7\x62\x69\x78\xfe\xc9\xf1\x56\x2e\xdb\x90\x88\x7f\x87\x8e\xda\xb8\xbd\x5f\x50\xbb\xcb\x4c\xd4\x2f\x3f\x90\xd5\x08\xd1\x55\x8c\xd1\x89\x04\x45\x82\xd7\x48\x63\x32\xec\x1e\x43\x5f\x40\x4a\xe7\x1e\xe5\x60\x97\xa5\xb1\x2f\x1f\x04\x96\x84\x96\xb0\xdb\xa6\xe7\xb6\x77\x10\x72\x2a\x1f\xe8\xd1\x7b\xea\xb4\x06\x54\x24\x1a\xde\xec\x88\xa3\x36\x73\xc7\x40\x7c\x48\x44\x5e\xba\x14\x81\x88\xf2\x49\x7a\x0f\x1a\xde\x92\xf0\xce\x2f\x09\x63\x3f\xc9\x03\xca\x25\x50\x5f\xe5\x61\x32\xa9\xa6\x5c\x75\x0b\xc1\x53\xb8\xeb\xa2\xdf\xbd\xdf\x53\x94\xf3\x1e\xb6\x15\xc9\xa1\x5b\x5c\xcb\xde\xc5\x76\x77\x27\xcf\xe3\x44\x2d\x3b\x74\x97\x25\x57\x29\x2f\x52\x02\x06\xf2\xf1\x73\x8f\xb8\x80\x0b\xcc\x23\x90\xf7\x7e\xd5\x1a\xd1\xf4\x17\xae\xd2\xdd\x64\xd6\x58\x1b\x0a\x4c\xa2\x30\x6c\x2e\xb3\xaa\x10\x00\x5e\x6b\x97\xb2\x25\x6f\x35\xda\x65\x63\x25\x59\xac\xbc\x8b\x30\xa0\xce\x9c\xdf\x58\x92\xf1\x02\xc5\x72\xae\x90\x9f\xd3\x3e\x01\x7e\x3e\xac\xec\x55\x2e\x90\xc5\xe8\x5b\x51\x14\x32\xb5\x9c\x6b\x1b\x51\xae\x29\x5a\x2c\x58\x60\xbf\x47\xa3\x38\xaf\x1e\x7b\x0b\xf0\x5c\xa7\x6c\xb0\x77\x89\x7a\xe0\xc1\x9e\x95\xbd\x22\xa2\x3c\xf8\x2e\x30\xb9\x48\xc0\xf0\x40\x33\xd9\xcd\xb3\xc5\x7f\xff\x50\xa9\x53\x2f\x5b\x46\xbb\x08\x4c\xde\x09\x94\xdb\x0a\x8e\xcf\x79\x65\x96\x29\x9a\xa3\x52\xee\xcd\x4f\x18\x65\xb5\x6d\x3a\xb4\x8f\x0a\xf0\xe5\x90\xd4\x30\x1b\xe1\x32\xc7\x60\x6f\x09\x37\xc2\x90\xcf\x4d\x95\x95\x32\xcf\x04\x62\x64\xa1\x87\x80\x50\x89\xae\xac\x68\x26\xd6\xd1\x0c\xc3\x6d\xbb\xc6\x1b\x89\x80\xd4\xdb\x00\x45\x00\x77\x8c\xa3\x43\x9a\x3d\x94\x30\x96\x0e\xe3\xe8\x94\x04\x37\xad\xbd\x9a\x00\x76\xa1\x81\xc3\xf4\x06\xae\x38\x08\xaa\x66\xa9\x46\x88\x8a\x5c\x9b\x72\x24\x3f\x30\x17\xa2\x0b\xb2\x95\x42\xb9\x8b\x97\xb8\x81\xad\x28\x79\x56\x14\x7c\x86\x53\xfe\x87\x28\x74\x17\x50\xcc\xed\x1d\xc7\xbc\x1f\xd8\x8c\xf1\x3c\x17\xbc\xa8\x99\xbd\x31\x40\x36\x06\x5d\x84\xc1\x1b\x96\x56\x02\xdf\x77\x50\x7b\xc2\x6f\x2d\xb1\x1b\x14\xee\xb1\xb7\x24\x95\x20\xb4\x3d\x06\x12\x99\xd3\x81\x62\x6c\x00\xda\xa5\xc1\x1e\xb9\x5f\x20\xc5\xfc\x97\xee\x55\x8b\x70\x1b\x9e\x84\x58\x11\xcc\xec\x3f\x1f\xfd\xd2\x5b\xa3\x05\xf4\xaa\xc7\xc1\x7b\xbf\x01\x6a\x62\x1b\x7c\x8e\xdd\x5d\xb4\x18\xeb\x40\x1f\x80\x5e\x3d\x16\xcb\x74\x3e\x9e\xc2\x45\xa4\x72\xd3\x45\x74\x6c\x2b\xd6\xf1\x74\xa1\xfa\x78\x39\xba\xdb\x4e\xae\xa0\x45\xe3\xdf\xfa\xa6\xf9\x74\xda\x9d\x9a\x28\xbf\x8a\x27\x51\x39\x07\x73\x8b\x40\x85\xde\xc5\x95\x05\xb6\x81\x67\xfd\xcd\xd9\x5f\xa3\xb8\xff\x38\x08\x5a\x3b\xc6\x16\x57\x6f\xe1\x6e\x11\xf0\xdd\x15\xb8\x49\xc3\x6d\xec\xd9\x0b\x67\x97\x31\x72\xa5\x7f\xde\xde\x81\x8b\xa6\x3f\xfe\xde\x1c\x02\x31\xb3\x35\xd7\x03\x8a\x51\x8f\x5d\x3b\x09\xd5\xcd\xeb\x72\xfc\x23\xc0\x41\x9d\x80\xcf\x97\x6f\xbd\x13\x03\x10\x70\x63\xaa\x29\x71\x3a\x08\xba\x71\xa5\xdc\x76\x86\x0d\x61\xf9\x33\xf8\x26\x74\xbc\x57\xa7\xeb\x64\x1d\x6d\x15\x30\xa0\x75\x34\x55\xc8\xa9\x08\x82\xd5\xa1\x51\x20\xd8\x25\x2d\x64\xdb\x8b\x0c\x49\xea\x48\x8d\x37\x4a\x70\x2f\x8b\x7f\x45\xae\xe9\x56\x12\xdb\x14\x29\x71\xc8\x07\xf7\x0d\x8a\x2f\xd3\xa8\xd1\x8d\xdd\x38\x9d\x64\xb0\x8a\x9c\x94\x60\xc0\xaf\x68\xf3\x7a\x6b\xa3\x25\x49\x89\x31\xd1\xb6\xe0\x5a\x6b\x3c\x2a\xed\x00\x6d\xb1\x1d\x8c\x8f\xbd\x55\xe8\x61\x1a\xbc\x00\xf0\x41\x0e\x61\x2d\x71\x18\x9f\x8b\x7e\xf6\x5d\xd8\xa7\xed\xe7\xfd\x50\x5c\xc3\xd2\xe6\x81\x38\xee\x4d\x4a\xb6\x7f\x17\x50\x2a\x91\x67\x22\xd2\x3b\x34\x4f\xea\x63\xd4\x9f\x7a\x3c\xa9\x83\xad\x6e\xb5\xb2\x98\x41\xf0\xc8\x7a\x78\x06\xe7\xa3\x10\x3c\xd2\x89\xa3\x52\x3c\xbe\x41\x1c\xc8\xe9\x5f\x59\x01\x64\x05\x61\x5a\xd2\x1e\xbb\xb4\xfb\x84\xc4\x49\xd4\x40\x60\x60\x4b\xac\x6d\x40\x17\x2f\x7e\x03\x76\x1d\x9e\x81\x1a\xb0\x14\x8c\x83\x13\x19\xeb\x46\x5e\xa6\xd4\x50\x59\x17\x02\x7c\x9b\x13\x7d\x87\x31\xe8\xa5\x86\x70\x40\x3f\x4a\x7e\xe3\x74\x26\xcd\xe6\x77\xae\x4c\xdb\xd0\xfa\x89\xfb\xa5\xb7\x70\x23\x04\x5c\x82\x05\x9b\xe1\x5f\xd7\xaf\x66\x05\x5a\x94\x03\x8a\xe2\xec\xae\xb0\x72\x77\xc1\x38\xb8\x69\x60\xe0\x3d\x62\x46\x01\x4d\x4c\x95\xe7\xba\x28\xed\x53\xbb\x28\x30\x56\xbc\x30\x13\xc8\x25\x6d\x37\xc2\x5f\xcf\xde\xbc\x86\x1b\xd8\xbe\x18\x7a\x8c\xfd\x05\x5b\x43\x51\xdf\x5b\x4c\x47\x90\x79\x43\xcd\xdc\xca\x8c\x20\x1a\x16\xc0\x85\x26\x3a\x8d\x50\xa1\xe1\x20\xe4\x3c\xb9\xe1\x63\x7b\xec\x47\xa2\x30\x8f\x06\x4d\xf5\x17\xc8\xde\x70\xbb\x3c\xfd\x00\xfc\x5e\x47\xb4\xa7\xbd\x04\x99\x62\x51\x3e\x06\x87\xcc\x88\x31\xaf\x21\x55\xd0\x3a\xdf\x4b\x55\x55\x54\x0a\x56\xef\x1d\xbf\x7b\xe9\x72\xc7\x2e\xd5\x54\xbd\x75\x4e\xcf\xf6\x49\xf4\x7b\x2b\x3e\x3b\xc0\xc2\xb3\x34\xc5\x08\xbe\x37\xe4\xf1\x79\x8a\xb1\x2a\xe2\x0e\x63\xbc\xea\xd1\xdb\xbd\x66\x75\x4c\x97\x46\x95\x5a\x2a\x30\x39\x9d\x8a\xd4\x72\xf0\xcc\x47\xad\xbb\x08\xf1\xb9\xc6\x5e\x5a\xb6\x74\xca\x7e\x1f\xac\x3a\x85\xb0\xb7\x18\xe8\xa3\xff\x44\x76\x1b\xb8\x95\x80\x5f\x41\x98\xa4\x11\xca\xc0\x73\xad\x6e\xaa\xb4\x57\x9e\xf8\x50\x2e\x50\x1e\x97\x2d\xb0\x8e\xf7\xb5\x90\x41\xfd\xce\xdc\x3a\xaf\x32\x8a\x3d\xb8\xc2\x25\xda\xec\x6b\x29\x5d\x3a\x2b\x7a\xe1\x29\xb9\x4b\x2d\x4d\xa3\xf7\x19\xf7\xba\x71\x4e\x7d\xd7\x35\xc1\x29\xac\x4e\x96\xf9\x60\x93\xdf\xed\x08\x36\x26\x44\x2e\x43\xa6\xea\xc7\x25\xc0\x6e\x7b\xde\x62\xe2\x9f\x6e\xed\x77\xdd\xf7\xe6\x93\xcf\x17\xa4\x25\xdf\xfd\x54\xef\xd5\xd3\x23\x4f\xcc\x76\x77\xbc\x49\x77\x55\x39\xc1\x5c\x0c\x8f\xbf\x87\x76\xdc\xf5\xc6\x94\x5e\x3b\xcd\xf0\x43\xcc\x7c\x87\x3d\x6f\x31\x71\x6d\x12\x10\xa1\x1f\x6d\xbe\xf7\xef\xf0\xf8\x93\x4c\xf3\x78\xd3\x03\x35\x04\x77\xce\x47\x21\xeb\x7d\xbb\xda\x94\xa0\xf7\xec\xef\x78\xe3\xcc\xc8\x89\x7d\xa9\x8c\x30\x73\xcf\xa3\x1e\xd0\xdd\x76\xbc\x29\x9d\x13\xad\x8b\x94\xf0\xd9\x1e\x77\xda\x3b\xed\x78\xd3\x69\xa7\x2e\x99\xed\xfd\xbb\xde\x78\xa7\xed\xb0\xef\x4d\xa7\x0d\xef\xf6\xc7\xdd\xde\xbb\xea\x72\xe3\xa9\x7a\x69\xf9\x11\x3b\x1d\x65\xfa\x8e\x62\x4e\x7a\x1e\xa8\xf8\x13\x6c\xb1\x07\x1a\xc7\xa6\xe4\x90\x53\x3e\x16\xb9\xce\x64\xf2\x29\xce\x99\x73\x03\xfd\xa4\x2b\x41\x68\x94\x52\x8d\x1f\xf5\xd4\xed\xb2\xdb\x4d\x57\x5d\xe9\x54\x3c\xee\x64\x77\xd2\xe1\xe6\x4b\xbb\x93\x6e\x37\xa5\x2e\x1e\xa7\x47\xec\xb0\x18\xf2\xa4\xf7\xe9\xde\x2f\x0f\xd1\xfd\xc6\x4b\xfd\x10\x83\xd8\x74\x1d\x4c\x32\x11\x69\x95\x3d\x36\x27\xd9\x65\xb7\x1b\xd3\x7d\x97\x9d\x6f\x4c\xef\x52\x17\x7c\xfc\xb8\x9c\x6c\x67\x7d\x6e\x4e\xe9\x5d\xf5\xdc\x24\x33\xfd\xb5\x9e\x07\x63\xab\x55\x67\xb1\x81\x2a\x2e\x16\xa7\xa6\x98\xe8\x2c\x65\x41\x00\x64\x52\x05\xc0\x56\x1a\x2c\xa2\x0d\x5c\x69\xe6\x32\x3f\x76\xd0\x98\xe2\xf2\x6b\xa1\x41\x70\xc2\x0d\xab\x75\xc2\x0d\xb8\x0c\x82\x7b\x8e\x54\x6c\xa6\xab\xc2\x37\xdd\x89\xc3\x5c\x20\x77\x09\xfa\xeb\x38\xcb\x13\x15\xf7\xd1\x29\x58\xa6\xc7\xfe\xaa\x2b\xc4\xe5\x74\x10\x6c\xa8\xed\x14\x05\x96\x77\x89\x73\xf3\xac\x1a\x4b\x0c\x08\xc0\xc1\x1f\x1e\xb2\x73\xd7\x16\x99\x11\x4f\x71\x64\x6f\x66\x67\x17\xe7\xd4\x2d\xf6\xc2\xfe\x39\x50\x83\xd2\x91\xf7\x6a\x96\x0b\xc8\x38\x73\xfd\x37\xa3\xd5\xe9\x60\xaf\x23\x55\x26\x95\x18\xec\x5d\xdb\x62\x6f\x66\x17\xd8\x97\x2b\x4f\x4d\xb9\xd2\x53\xfa\x1d\x8a\xff\x8a\x5d\xe2\x37\x67\xb5\xee\xce\xd0\x25\xd1\xc5\x1e\xb8\xea\x1c\xbf\xc6\xda\x34\x91\x97\x1f\x1e\x65\x22\xb5\xb5\x7c\xc0\xe9\xbc\x45\x8f\xc8\x3b\x59\x08\x74\x7a\x00\x1f\x53\x70\x0d\xcb\xb4\xbe\x01\x9f\x97\x72\x82\x09\x92\x6f\x70\xff\x9d\x62\x27\x03\x38\x6d\x83\xbd\xd3\xc1\x5e\x34\xf9\xc1\x5e\x07\x7f\x0c\x81\x58\x50\xe4\xb6\xef\x7f\x09\xb3\x70\x2d\xc5\x6d\xd1\x7c\x5c\xe9\x32\x1a\xf6\xe9\x60\x6f\xa4\x35\xfd\xf2\x6b\x87\x26\x71\xa9\xd1\xb3\x8d\xd2\x7f\x7c\xcb\x5e\x08\x8c\x27\x02\x27\x4f\x70\xf6\xb2\xf3\x67\xba\x60\x33\x3e\x05\xe0\xf8\x4a\x91\xb9\xdc\xb9\xdf\x81\x43\xad\x0b\xc8\x01\xfc\xfc\xda\x79\x89\x57\xb7\xc7\xae\x10\x5e\x08\x5a\x06\x87\x06\x7e\x87\x54\x23\x3c\x31\xc8\xf9\x83\x58\x65\x4a\x97\xac\x52\x76\xa7\xb8\x74\x5e\x98\xcd\xb8\x14\x00\xee\x0f\xd1\x36\xf9\x8c\xed\x63\x6e\xe0\xfc\x66\x7c\x88\xa1\x63\x96\x6c\x07\x01\xc8\x7f\xee\x20\x42\x8a\x04\xdc\x29\x6e\x1f\x3e\x31\x0e\x5b\xe1\x32\x99\x88\x29\xc2\xe0\x86\xd6\xd8\xa8\x52\x49\x49\x3c\xc6\x94\x1c\x22\x8b\x91\x75\xc0\x62\xe3\x28\xc3\x0e\xa0\xcc\x45\x52\xd5\xb8\x4a\x87\x95\x55\x41\x89\x64\xc3\xf0\x9c\x0f\x82\x83\x5f\x9a\xe5\xce\xff\xaf\xd4\x85\x2f\x0c\x45\x1d\x0d\xf7\xaf\xde\xbe\x78\x7b\xea\x40\xf1\x13\x6e\x00\x8c\x69\x0e\x25\x1d\xa3\xec\x5c\xfe\x5d\x6a\xd8\x9f\x91\xf7\xf4\x7d\x03\x4f\x2c\x71\xb0\x43\x34\x02\x91\xf6\x0e\xe6\x1d\x12\x36\x71\xe1\xa8\x4a\x99\xf5\xa4\x2a\x4d\x59\xf4\xce\x55\xf9\xb6\xc0\x74\xad\x4b\xf8\x7d\x54\x8a\x72\xe0\x40\x04\xba\x03\xa6\x02\xb6\xcf\x15\x03\x87\x1b\x86\xe0\xdd\x50\xb8\xc7\xd8\x5f\x30\x59\x34\x12\x1f\xd6\x42\x17\xe8\xd0\x41\x9b\x16\x9c\x3c\x00\x22\x53\x45\xdf\x00\xf6\x6f\xee\xf0\xd1\x35\x64\xb6\x36\xd5\x54\x38\xc8\x2c\x45\xe6\x78\xe7\x4f\x0c\x30\x37\x98\x3e\xda\xde\x43\x90\xa2\x6b\x54\x4f\xec\x00\x9d\xe3\x25\xe3\x47\xce\x13\x88\x03\xe3\x04\x90\x59\x10\x2a\x6d\xab\x3b\x88\x54\x65\x57\x17\x5d\x32\xd2\xcf\xad\xc0\x26\x2e\x21\x2e\xe9\xe2\xb9\x1a\xe9\xa5\x64\x1f\xe9\x80\x41\x43\x95\x10\x99\xdc\x7b\xd1\xf6\xc0\x65\xea\x4e\x3c\xc9\x32\x76\xc7\x29\xd8\x5a\x1a\xe7\xd5\x86\x29\x78\xa3\xe2\xab\xbd\x44\x86\x95\xcc\xd2\x17\xbc\x5c\xdf\x4d\x21\x08\x25\x7b\x89\x9e\xe6\xb2\x05\x4e\x64\x2d\x14\x61\x59\x3e\xd7\xd3\xa9\x9c\xf3\x50\x59\xb3\xf2\x55\x21\xc4\x65\xb9\xe5\xc0\xc7\xb2\x5c\x10\x69\xbb\x56\x6d\x7d\x8f\xca\x53\xfe\x37\xbd\x15\xc1\xa6\x52\x6d\x57\x31\xcf\x78\x69\xb7\xc4\xae\x1d\x51\x70\x26\x73\x23\x6c\x27\x73\xeb\xca\x2f\x5a\xd1\x4e\xdb\xfe\x6c\x5d\x80\xb6\xcd\xd8\x36\x75\x27\x1f\x6f\xc2\x4a\x6f\xaa\xa1\xe8\xf2\xf1\xb8\x10\x63\x5e\xea\x22\xb8\x77\x35\x4d\xe5\xb7\xfd\xde\xd9\xc5\xf9\x25\x62\x24\x2f\x39\xe1\xa1\x50\xc3\xdd\x0b\x7d\xe8\xe7\x60\xed\xbe\xb7\xcf\x86\x9f\x5c\xca\xd6\x1a\xf2\xec\xc0\x3d\x07\x7a\xf0\xb6\x18\xec\x7d\x09\x2f\xff\xac\xc3\xcb\xbf\x44\x11\x7f\xa2\x28\xe2\x9d\x07\xec\x46\xe9\x46\x5b\xbb\x34\xb9\x48\x36\xea\x6e\x3b\x36\x73\x69\xbb\xe9\x2c\xd9\x4e\xb6\x40\x94\xc4\x2b\x8a\xc4\x81\xec\x7d\xda\xa5\x49\x00\x8c\x67\x58\x23\xfa\x86\x72\x55\x20\x53\xda\x24\xa6\xf5\x21\x66\xd9\x12\xc4\xd9\x1e\x3a\xeb\x67\x9a\x8a\x42\x22\x02\x64\x4b\x64\xe5\xd9\xc5\xf9\xfc\xc4\xe6\xae\xbb\x87\xf3\x9c\xdc\xc4\xc9\x2a\xba\x52\xd6\xd2\x7a\x2d\x53\x01\x6d\x47\xfd\xe7\x0e\xd9\x69\xad\x3b\xcd\x97\xf6\xde\xee\xa6\xee\xac\x8b\xf4\x77\x37\x20\xa6\x59\x0b\x97\x1d\x70\xa3\xd5\x97\x58\xc6\x4d\x79\x55\x70\x65\xa0\xab\xab\x47\x4e\xfa\xfc\x9a\x9b\x12\x3d\xca\x09\x7b\x99\x66\x5c\xfa\x11\x39\x80\x41\xad\x7c\x00\x09\x80\x51\x80\x4f\xf1\xa2\x0c\xe2\x6b\x85\x60\xfe\xb9\x1e\x80\x49\x95\xe2\x94\x27\x3e\x06\x0c\xb6\x7b\x06\x63\xf5\x03\x7b\xa8\xd8\xca\xf7\x00\x7d\xda\xb1\x13\xee\xde\xe9\x22\xed\x84\xbb\xc1\xa1\x6b\xb8\x84\x50\x9e\x5e\x4f\xcc\x0e\x46\xb7\x49\x60\xbd\x34\x73\x50\x10\xd1\x70\xe0\x92\xb3\x37\xdc\x15\x80\x1e\xbe\xe2\x99\x11\x1d\x46\x2f\xf4\x6d\x52\x91\xaf\x4e\xe6\x1f\xa7\xf1\x77\x51\x88\xf5\x31\xad\xd9\xed\x9a\xb2\x7a\xd3\x69\x9c\x88\xf7\x78\x62\xf1\x6b\x69\x96\x05\x41\xd4\x0b\xa2\x18\x94\x11\x8c\x7b\xc4\x34\xbe\x60\x29\xfd\x2b\x08\xbb\x6d\x91\xa1\x5b\x85\x8b\x6e\xf9\x02\x8b\x7a\xd8\x38\x76\xf4\x8b\xa0\xfe\x5b\x11\xd4\x3d\xb2\xce\xc6\xcc\x12\xb7\xea\x2a\xde\xf8\xc9\xc5\x42\x60\xa9\x9f\x48\x34\xbc\xac\xbf\x72\x16\xb3\xf3\xdd\x3c\x43\x28\x89\x36\x6c\x5b\xc8\x3f\x87\x21\x84\x18\xec\x0a\x60\xdd\x33\x5d\x41\x80\xa0\xcb\xad\x98\x4a\xc4\x4f\x8e\xfc\x3e\x2d\x4f\xc7\x3f\xd7\x53\x8d\x26\xfc\xbb\x4a\xa5\xd9\xaa\xab\xfc\xf9\x19\x16\x43\x96\x70\xf1\xf2\x0d\x40\xb0\xa4\x22\x65\xcf\xcf\xd8\x10\x7f\x8a\x8c\x15\x51\xf2\x2e\xca\xef\x27\xea\x2f\x93\x27\x08\xe1\x08\x50\x2f\x61\xf0\x00\x45\x51\xa9\x28\xca\x97\xf2\xd0\x96\x45\x65\x4a\x56\x68\x5d\x1a\x07\x11\x12\x92\xf7\x5b\x8a\xd8\xde\x16\x46\xcd\x0e\x67\xa5\x58\x7a\x5a\x6b\xbf\xd5\x76\xba\xbd\x9e\xbb\x9e\xa3\x96\x7a\x2a\x93\xed\xc3\xf1\x41\xd5\xe5\x04\x22\x4b\x0b\x8c\xcd\x07\x45\x7d\x84\x6a\x09\x48\x94\x5b\xb0\x17\x68\xed\xa2\x90\xba\x90\xe5\xec\x8d\x54\x72\x5a\xcd\xa9\x43\xdb\x46\x14\x57\x51\xd5\xd4\x0d\x30\xa7\xaf\x71\x68\x38\x54\xba\xf2\x21\x13\x07\x2f\x59\x26\xb8\x29\x7b\xec\xcf\x72\x3c\x11\x45\xa8\x30\x15\x5c\x45\xc1\xa9\x63\x37\xed\x1c\x70\x95\x8b\x7a\xbe\x0f\x6d\x67\x9c\xe9\xbb\xb8\x01\xad\xec\xdd\xff\xa3\x76\xda\x7e\x8c\x55\x74\xe6\x76\x2f\xa5\x60\xc3\x53\x39\x9e\xb8\xb4\x82\x33\x08\x27\x65\x13\x1c\x50\xeb\xec\x28\x53\x87\xa9\x00\x26\xc3\xa5\xfa\x9a\xe8\xcc\x0d\x74\x2c\x40\x5f\x39\xa9\x4f\xca\x25\xb2\x94\x53\x5e\xcc\x98\xd1\x05\xc8\x6f\x43\x6e\x20\xcd\xe1\x7c\x57\xd3\x0a\x32\xb9\xa6\xc2\x4e\x17\xda\x32\xa5\x4b\x10\x58\x6a\x98\xb0\x29\xd9\xfe\xf1\x91\x8b\xe3\xec\x1f\x1d\xb8\x34\x65\x56\x3e\x6e\xed\x05\x63\xc5\xf3\x09\x1f\x0a\xc8\x79\x05\x29\x61\x79\x21\x4d\xc0\x77\x51\x11\xe0\xb6\x13\xd8\xd8\xfe\x6d\xbf\x37\xe4\x85\xeb\xea\xb6\xdf\x1b\x69\x7d\xc0\xfe\x22\x9e\xa4\x21\x28\xb4\x61\x49\x3e\x65\xbf\x27\x16\xcd\xf6\x09\x5b\x30\xb8\x41\x1c\xd8\xd5\xef\xff\xf1\xe8\xe8\x08\x98\xda\x05\xe7\x97\xc2\xb0\xfd\xb7\xb9\x50\x97\x13\x39\x2a\x3b\xec\x85\x90\xb6\x14\x64\x73\xf2\x51\xa7\x64\x80\x25\x53\xe3\xf1\xd1\xd1\x91\x59\x74\x66\xb7\x8d\x74\x97\xca\x88\xa4\x2a\xc4\xe5\x8d\xcc\xaf\x5e\x5f\xfe\x64\xb9\xe1\x6c\x15\xb0\x40\x5b\x1d\xc7\x5c\x0d\xbb\x7a\x7d\xb9\x90\xc3\x52\xda\xb3\x79\xa6\x1e\x9d\xe7\x90\x58\xcf\x94\x85\x56\xe3\x0c\xda\x4e\x74\x55\x70\xc8\x64\x03\x5e\x1b\x01\x49\x17\x68\x13\xf8\x2d\x26\x0e\xdd\x06\x73\xde\xcc\xe9\xea\xd9\x4e\x85\x51\xba\xfc\x42\x12\x8a\xa5\x1a\x2c\x7a\xdc\x10\xb8\xac\x03\xdb\x8f\x72\xe1\xd8\x5f\x3d\xc4\x68\xb8\x29\x7a\x8c\x9d\x13\x1a\x43\x20\x33\xa4\xfc\xb0\x97\x23\x7b\xfa\xf4\xc4\xa7\x7f\x8e\xfa\x80\x84\xd8\x08\x03\x4c\xcc\x48\xb0\x09\x57\x69\xe6\x92\x31\xd7\x58\xb0\x33\xc1\x4b\x83\x85\x44\x0a\x97\x76\x96\xcd\xf0\xd4\xd5\x96\x52\x00\x14\x2e\x25\x75\x91\xd3\xdc\x2e\xa7\xc8\x2c\xbd\xfc\x74\x94\xdd\xc6\x19\xb5\x55\xb0\x64\xc2\xa5\xa2\xbd\xef\x51\xc3\x17\xa8\x49\x6e\xd7\x7a\xcf\xfd\x14\x06\xec\x26\x12\xd2\x17\x36\x2e\x92\x1e\x63\xaf\x62\xb3\x31\xba\x7a\x6c\x7e\xbd\x50\x07\x8e\xc9\xad\x37\x42\x57\xda\xa5\x4f\xc0\xf1\xfa\x9c\xd0\x8e\x93\xc7\x13\x90\xca\xc8\x14\x78\x98\x95\xfe\x61\x7d\x7a\x8c\xb9\x84\x6d\x63\xf0\x1d\x28\x10\xe8\xec\x1f\xa2\xd0\x2b\x18\x73\x63\x1c\xf3\x3c\x79\x31\x33\xbe\x94\x80\xa3\x56\x3e\x31\xd1\x98\x38\x8e\x88\xd2\x2a\x23\x3f\x27\xfc\x0b\x33\xe5\x59\xd6\x61\x79\xa1\x87\x7c\x98\xcd\x1c\x9b\xeb\x1f\x19\x78\xa4\x80\x0f\x85\x1e\x31\xf1\xf7\x2a\xca\x8c\x45\xf7\x8b\x14\x94\x47\xd8\x7d\x4f\xaf\xae\xa6\x34\x65\x19\x7e\x45\x40\x25\x94\xfe\x1c\x87\xc6\x1d\xa5\xe8\x2c\x34\xda\x91\x86\x0d\xf6\xe0\x70\x5b\xde\x3e\xd8\x0b\x89\x88\x81\x62\x88\x8f\xad\xb4\xaa\x97\x6a\xb4\x62\x3a\x24\xe3\x59\xb6\xee\xe8\x98\x89\x0f\x32\xd1\xe3\x82\xe7\x13\x97\x86\x71\xb0\xf7\xc3\x7c\x1b\x00\x1b\x5c\x94\x4e\xe4\x1d\xec\xdd\xda\x51\x60\x72\xb8\xc2\x9e\x7c\xca\xea\x03\xf9\xe3\x88\xb0\xfb\x98\x81\xe3\x6f\xda\x5f\xfe\x07\x54\x25\x4a\x52\x8c\x3a\x2f\x98\xe5\x60\x0f\x6e\x47\x07\x1f\x39\x14\xa5\xfd\x1b\x72\x93\xa3\x6e\xb2\xde\xb0\x54\x51\xc3\xb0\x8f\x8c\x80\xc1\x18\x10\xbb\xc9\x41\x69\x38\x63\xdf\x9f\xb1\x41\x75\x74\x74\x22\x98\x6d\xd2\xfd\x0d\x7d\x01\x46\x4a\x21\x6c\x11\x60\x6d\x8e\x62\x30\x4d\xa5\x5d\x42\x6a\x10\x37\xb8\xc1\xfa\xba\xc0\xba\x07\x3e\x17\x99\x02\x89\x08\x2f\x73\x35\xae\x4f\x99\x66\x5c\x1b\x2d\xe6\x69\xc4\x13\xed\x46\xeb\x34\x49\x8e\xde\xa7\xec\xb6\x7f\xd4\x61\xb7\xc7\x1d\x76\xdb\xb7\xff\xc7\x20\x5b\xfb\xd7\x91\xfd\xeb\xa4\xc3\x6e\x4f\xc0\xc5\xd2\x7e\x45\x51\x6e\x50\x0e\xfe\x3c\xee\xb0\x91\xd6\x7d\xfc\xf7\x68\x37\x88\x34\x6b\x3e\x4d\x5b\x05\xd9\x25\x9c\xe8\xf1\x14\x7c\x2b\x21\xd4\x9b\x45\x37\x37\xd9\xac\x7e\xb1\xb5\xa5\xac\x68\x1b\xcb\x73\x82\x61\x74\x97\x6b\xb0\x51\xe4\x92\x06\xb9\x03\xb4\xb3\xfb\x5a\x5d\xd6\xd4\x63\xad\x78\xa2\x4d\x79\xde\xbd\x11\x33\x53\xdb\x48\xa1\x99\xe8\xab\x5f\xd6\x7c\xec\x4d\x79\xbe\xa4\xd3\x96\x8c\x8c\x0d\xed\xf3\xe6\x29\x19\xe7\x4e\xc7\x8e\xb7\xf1\x9c\xbc\xb6\x3c\x13\x46\x5c\x14\xfc\xe1\xe6\x24\x37\xb7\x89\xac\xf0\x33\x1f\x96\xb5\x70\x03\xaf\x9b\x36\x88\x84\x9b\xf8\x45\x63\xda\x6c\x85\x0f\x93\x41\x37\xea\x1d\xbf\xb8\xef\x10\xac\xb8\xba\x31\xc2\x19\xc8\xb8\xf4\xf2\x73\xe7\x18\x01\x69\xb5\xc1\xc7\x86\x18\x4e\xb4\xbe\xf1\x79\xbb\xec\xba\x3c\x7d\x7a\x02\x32\xee\x90\x27\x37\x77\xbc\x48\xf1\x66\x29\xe5\x50\x66\xf0\x92\xbd\xb6\xad\x5e\x47\xc0\x68\x9c\x72\x4e\x42\x6f\xee\x8a\xec\x77\xbf\x7e\xf6\xec\xe4\x19\xa1\xf2\x1a\x79\x2b\x9a\x20\x6f\xbb\xba\x05\x76\xbb\xcf\xe1\x4a\xfb\xe2\xab\xf4\xc5\x7c\xf3\xc5\x57\xe9\xbf\x85\x09\xe4\x53\xfa\x2a\x35\x79\xcd\x6f\xd8\x61\x69\x6e\xaa\x5f\xbc\x96\x96\x7b\x2d\x6d\x12\xbd\x76\x8f\x75\xf8\xe2\xbf\xf4\xc5\x7f\xe9\x8b\xff\xd2\x17\xff\xa5\x9d\x31\x94\x2f\x4e\x4c\xff\x7d\xa4\xe0\x4f\xe1\xc4\x34\xf7\x3e\x5b\x53\x03\xf4\x45\x8c\xff\x4d\x8b\xf1\xff\xdd\x3d\x99\x1e\x49\x5c\xfc\xe2\xd3\xf4\xc5\xa7\xe9\x8b\x4f\xd3\x17\x9f\xa6\x2f\x3e\x4d\x5f\x7c\x9a\xbe\xf8\x34\xb5\xdf\x96\x5f\x1c\x9b\xbe\x38\x36\xad\x1a\xe1\x17\xc7\xa6\x2f\x8e\x4d\x5f\x1c\x9b\xbe\x38\x36\x21\x37\x59\xf3\xa5\xfa\x99\x39\x36\x2d\x30\xe9\x7c\xf1\x6e\xda\x89\x5e\xeb\x8b\x8b\xd3\xa3\xbb\x38\x2d\x10\xdf\xbe\xf8\x39\x7d\xf1\x73\xfa\x6c\xfd\x9c\xfe\x8d\x4a\xec\xc9\x18\x39\x6d\xaf\x94\x25\x28\xb0\x40\xe2\xc0\xf3\x45\xfd\xd6\xd5\x86\xbd\xe3\xa3\xde\xd3\x3d\xdf\x48\xce\xcb\x49\xd8\x86\x7b\x87\xbd\x3b\x91\x65\x5d\xb0\x91\x1d\xea\x5c\x28\x99\x76\x13\xad\x46\x72\x5c\xe1\xa1\x39\x8c\x0f\xc7\x58\xd4\x17\xae\xb9\x6c\x63\x11\xd8\x2d\x4f\x20\x03\x3b\x93\xc6\x54\xa2\x60\xf6\x95\x7c\xfe\x82\xd5\xda\xee\x20\x14\x29\x42\x00\x72\xdc\x66\x4f\xde\x9e\xbf\x78\xce\x7c\xda\x02\x96\xea\xe4\x49\x7c\x03\xfa\xb4\x9d\xe7\x29\xf5\x48\x87\xef\x0c\xfb\x3b\x87\xee\xb0\xb7\xe7\x71\x67\x35\x40\x2c\x02\xd9\x6b\x70\xca\x3d\x9e\xe7\x19\xbd\x71\x0f\xff\x66\x62\xc6\xfc\x4b\xcd\xa0\x8a\xb9\x9b\xe7\x2e\xa0\xe3\xa3\xa3\xf9\xdb\xa3\x99\x1a\xf0\x87\xda\xee\x60\x88\x3b\x3c\x6d\x2a\xca\x97\x1e\xa6\x78\xf3\xb0\xb9\x3b\xe3\xe9\x51\x7f\xe5\x28\xde\x2b\x07\x30\x2d\xd2\xda\xed\xd3\xfe\xa6\x06\x38\xca\x39\x6a\x81\xce\xb6\x9d\x44\x25\x1f\xcf\x15\xff\x8b\xc8\xb2\x1f\xec\x52\x47\x55\xfe\x2d\xee\xd6\xb1\xf5\x43\x9e\xcb\xe5\xdb\xce\x01\x23\xae\x5c\xbf\xce\xa2\x5f\x67\x7c\x9a\x2d\xfe\xf5\x56\xa5\xbd\x28\x1d\x69\x5e\xe8\x52\x0f\xab\x51\xfb\x5c\x5b\xce\x80\x4f\x80\x1e\x3f\xef\xcc\xf2\x6d\xfc\x5c\x17\x22\x18\x30\xcd\x56\xdb\xf5\x31\xa6\xfb\x68\xbb\xff\x1e\xa6\xa2\x98\x8e\xff\xe2\xa7\x26\xd1\x85\x58\xeb\xc0\xdc\xf6\x7f\x2b\x67\xa6\xcd\x5c\xbd\xe0\xc0\xfc\xd4\x3f\xbb\x38\x7f\xd7\x56\xfe\xcb\x99\xd9\xfc\xcc\x38\x42\x82\x21\xf2\x37\x70\x6e\xfe\x77\x0c\xff\xb0\xfc\xe8\x58\xc1\x50\x2b\xa1\x4a\x74\xa9\xa9\xad\xd4\xfa\x67\xe9\xf7\x87\xbf\x5f\x6b\xbf\xa3\xc2\x02\x1d\x60\xac\x38\x0d\x19\xee\x9f\xbb\x21\xcc\x39\x4e\x36\x37\xbf\xad\x8e\xbb\x7f\x49\x9d\x4f\x75\x00\x16\x56\xb0\x9d\xfd\xc9\x94\x85\xe0\xd3\x7f\xbf\x9b\xcf\xb8\xb6\x46\xdb\xf5\xda\x9f\xf7\x49\xeb\xd9\x0d\x68\xcf\x55\x63\x89\x7e\x9b\x67\x2b\xaa\x50\x7b\xf0\x63\xb6\x7a\xb7\x67\xf7\x16\x15\x6b\x75\xb2\x68\x77\xad\x68\x77\xa2\x58\x7c\x0e\x56\xe3\xc1\x84\xe7\x57\xce\x0b\x3e\x15\xa5\x28\xcc\x62\x1f\x8f\x06\xf9\x01\x83\x1b\x72\x55\x7c\xa7\xf5\xcd\x94\x17\x37\x91\x17\x0f\xec\x53\xcc\x5f\x6e\xc8\x40\x36\xcb\x05\x1b\xec\x7d\xf7\xf6\xed\x0f\x6f\xce\xde\xfd\x30\xd8\x0b\xfe\x42\xf0\x98\x4d\x35\x00\xce\xcb\x69\x9e\x89\xa9\x50\x25\x1b\xfa\x56\xc1\x9f\x68\xac\x74\x41\x66\xf3\x51\xc6\xd1\xb9\x22\x14\x01\x05\xae\xad\x45\x06\x5e\xef\x75\x60\x9f\x53\x85\x20\x27\x49\x32\x41\xd3\xa3\xd7\x76\xc7\x8d\xe5\x66\x8d\x86\x0a\x51\x56\x85\x12\x29\xb8\xf8\xaa\x99\x7b\x8f\x27\xe8\xe0\x76\xcb\xb3\x0e\x53\x90\x7d\x1e\xf4\xd0\x33\xd7\x48\xe8\x97\x94\xec\x02\x74\xd0\x33\xe6\xe6\x4c\xf9\xdc\xd3\x0a\xf4\xbd\x9c\x19\x81\x89\xa6\x51\x7d\x8f\x26\x43\x18\x14\x92\xaf\x43\xb3\x05\x0c\x73\xfb\x2b\x90\x20\xf5\xda\xfe\x91\xe0\x65\x55\x08\x06\x46\xa8\xc6\x42\x50\x4b\x42\x59\xb1\x02\xc0\xd8\xbd\xff\xc4\xa2\x66\x1b\x0a\x41\x58\xe3\xbf\x57\xa2\x68\x28\xdf\x48\x73\xd3\xb6\xfc\xcb\x6d\x96\xb5\x1f\x2b\x70\xba\x3d\x27\xad\x63\x59\x54\xa2\xed\xd0\x2e\x75\x40\x45\x67\xd3\x52\xaa\x4a\x90\x65\x20\xd2\x66\x18\x51\xa2\xa9\xb6\x10\x65\x21\x05\x38\x9e\x4c\x35\xac\xad\xa9\xb2\x32\x72\x4a\x73\x36\x3e\x34\xfc\x00\x69\xd0\x09\x2e\x58\xd4\xd0\xa3\x32\xed\x78\x1f\x06\xbb\xf2\x5a\x65\x33\x6f\xbe\xf5\x03\xc1\xaa\xd0\x38\x67\xff\x3f\x7b\x7f\xdb\xdc\x36\x72\xe5\x71\xc3\xef\xfd\x29\xba\x9c\x17\x1a\xd7\x4a\xd4\x3a\xbb\x55\x9b\x3b\x53\xa9\xbb\x3c\x1e\x4d\x32\x3b\x76\xac\xb5\x9c\x99\xba\xaa\xbc\x75\xa5\x05\x34\xa9\x2e\x81\x68\x2c\x1a\x94\xcc\xa4\xf2\xdd\xaf\xea\xd3\x0f\x00\x28\x90\x02\x29\x80\x04\xc8\x7f\xde\x8c\x23\x92\x40\x3f\xf7\x39\xe7\x77\x1e\xb2\x5c\x3c\x50\x4d\x11\x1a\x46\xf7\x6a\xbb\x1b\x64\x6c\xcb\xe4\x26\xee\xb3\x72\xff\x05\xfa\xee\x81\xa5\x7d\xa4\x9a\x86\x97\xbc\xf1\x00\xc1\xb7\xaf\xe2\x63\xc9\x57\x9b\x22\xcd\xce\x12\x76\x35\x04\xf7\xcb\xb0\x84\x82\xa5\xe9\xc9\xcf\xcc\x2f\x58\xa2\xd2\x99\xc8\x9d\x61\xe8\xf1\x4e\x10\x4d\x89\x17\x64\xf8\x13\xdf\x32\x69\x6f\x66\xf6\xdd\x4c\xa4\x22\x27\x2e\x33\x95\x0f\xf4\xe9\x54\x4e\x0b\x61\x01\xc6\xa2\x10\xfa\x8d\x2d\x13\x50\x33\x81\xb0\xe8\x8e\xa7\x33\x51\xb5\x6c\xd9\xc5\x59\xdf\x45\xf6\x5a\x8b\x3d\x42\xfa\xcf\xb7\xff\xce\xbc\xb0\x76\x65\x9a\x20\x62\x26\xf2\xdc\x8c\x95\x9a\xd9\x06\xba\x6f\x86\x1e\x15\xea\x5e\xa4\xa1\xcb\xce\xef\x30\x15\x82\x8c\x99\x46\x9e\x91\xba\x30\x7f\x32\xe7\x34\x21\x32\xe2\xce\xb9\xb0\xe8\xaa\xb8\x13\x32\xb7\x9c\xc5\x3c\x58\x2d\x8a\xfa\x8c\xd3\x3e\x9a\xb0\x4f\xe6\xd5\x8f\x52\xbb\x42\x24\xee\x2d\x66\x66\xdc\x31\x60\x51\x14\x3d\xc7\x9d\x92\xde\x71\xc0\xb5\xd0\x4c\x8f\x20\x50\x10\xfe\x6e\x3a\x4b\x9d\x7b\x76\x58\xe8\xb9\xd4\x60\x62\xdd\x7e\x71\x53\xc1\x8e\x7b\xb1\xb4\x05\x3d\xc2\x9f\x9d\xbf\xae\x4e\x79\xa6\xef\x54\xe1\x09\x9f\x39\x0c\xd2\xca\x80\x84\xef\x87\x85\xec\x9a\x6f\xb7\xd0\x45\x90\xe3\xe8\x00\x37\x27\xa7\xab\x5e\x71\xce\xe6\x2a\x76\x16\x4c\x95\x13\x29\xa7\x9a\x16\x53\x0b\x71\x7d\x79\x93\x95\xc1\xb0\xd0\x93\x2c\x8d\xb1\x3d\xb3\xa8\x40\x89\x13\x6b\xce\x19\xd7\xb4\x20\x9d\xb9\x4c\xe6\xa6\x63\xf6\xc0\x2e\x1f\xfc\xf5\xb5\xef\xf2\xd7\xd7\xb6\xf4\x50\xed\xac\x33\xbb\x20\xb8\xd9\xd9\x03\xc2\xde\x54\x52\xd3\x21\x54\xde\x11\x34\x73\xb4\x00\xdc\x69\x5c\x1d\x3d\x3b\x08\xb4\x06\x3d\x94\xf7\x8e\xb3\xee\xe6\xb8\x5d\x56\x67\xcc\xec\x57\xf3\xea\xb9\xd4\x9a\x6e\x04\x3b\x3c\x56\xe4\xd3\xdb\x9e\xbc\x7e\xe9\xb5\x77\x71\x7b\xf9\x69\xfb\x8e\x69\x91\x88\xa8\xa0\x7d\x46\x7b\x23\x97\x91\xdd\x09\x1e\x41\x86\xbe\xfb\x55\x61\xc7\x40\xe6\x76\xf8\x75\x30\x4f\x93\xdb\xb8\x78\x10\xf9\x92\xbc\x8f\xb6\xed\x3e\x3d\xed\xc6\xb5\x66\x34\x63\x90\xf0\x5b\x91\x74\x36\x06\xf4\xb4\x43\x8c\x41\x22\xe7\xd2\x05\x36\xcc\xf9\x37\x39\x5f\xcc\x3d\x2b\xa0\xde\x3b\x0d\xc4\x8e\x8f\x19\x0a\x17\x27\x4c\xe3\x13\xf1\x24\xa1\x63\x98\x2e\x62\x22\x8e\x4c\x7c\xa3\x43\xf7\xa9\xe8\x64\xc7\xf5\xef\x7e\xad\xff\xdd\xed\x61\x77\x59\xd0\xf3\xbc\xa3\x35\xc5\x27\xb9\x0d\x18\x4a\xbd\x78\xf7\x89\x70\x96\x6a\xc2\x49\x46\x5b\x09\x97\xae\x6d\xa5\x11\x0f\x44\x79\x5a\x9a\x57\xdb\xbe\x98\x69\x32\x42\x6a\x61\x9d\x79\x99\xed\xbb\xbd\x6c\x6d\xdf\xc4\xa3\x77\x4a\xb1\x27\x15\x9d\x64\xe6\xa0\x9b\x93\xfd\x9f\xbc\x59\x4c\x2f\xbf\x5b\x64\xe6\x65\xff\x10\xb9\xb2\x7f\x79\xe3\x4f\x37\x2b\x11\x72\x3a\xd0\xfd\xaf\xfd\xda\x21\x0f\x09\x99\x14\xe4\x71\x61\x71\x71\x1c\x44\x10\x27\xea\xd4\xa4\x10\xeb\x89\x1f\x55\x63\x71\x2a\x77\x14\x39\x10\x1b\x11\x63\x2e\x53\x11\x6e\xf3\x9a\x50\x44\x67\xa9\x37\x46\xd5\xfd\xf9\xa3\x3b\xa5\xb4\xa0\x53\xac\x50\xfe\x0c\x75\x73\x61\x86\x85\xe7\xb3\x05\x89\xed\x9c\x2e\x25\xea\x10\x0d\x92\xe9\x9b\x6b\x4f\xcd\xce\x65\x47\xf7\xe7\x29\x0b\x4b\xaa\x14\x46\xbc\x7c\xb3\xd2\x01\xa9\x99\x98\x67\xc5\xb2\x2e\x88\x05\xe9\x9b\x17\x46\x66\xd9\xd4\xa1\x4d\x97\x81\x9c\xae\x5c\x05\xf6\xf6\x08\xeb\x72\xb6\xe0\x39\x4f\x0b\x21\x2a\x9e\xae\x7e\xa6\xc2\xb6\x7f\xb4\xe5\x8f\xc8\xcd\xd9\xb7\x3d\x5c\x6c\x41\xe4\x2b\x14\xa1\x21\xa7\x04\xc8\x74\x96\x88\x72\x87\x04\x29\xc3\x2f\xb8\x0b\x57\xd5\x47\x1b\xad\x23\xbc\x72\xbb\x9b\xd6\x5f\xb2\xa4\x63\xe8\x85\x88\x1b\xaf\x5b\xd2\x75\x16\xb7\xda\x7c\x39\x2d\x42\x0f\xe2\xa0\xd6\x55\x3c\x1b\xd5\x5c\x14\x72\x2e\x34\x0b\x3e\xbe\x66\x17\xae\x48\x54\xa5\x80\x61\x66\x54\xa4\x7a\x91\xfb\xe1\xe3\x5e\x44\x72\x9d\x73\xa3\x66\xbb\x4c\x1b\x93\x84\x21\xeb\x5f\x45\xee\x74\x8b\xf4\xde\xd6\xd4\x62\x44\xc7\x12\x9e\xcf\xfc\x44\xd3\x8e\xb7\x8f\xb7\x1a\x99\x16\x82\x16\x5e\xa6\xb4\x96\x66\xc1\xf9\x90\x2b\xb3\xe0\xaa\xfb\xcb\xc5\x97\x94\x3a\x19\xbd\xc7\x3b\xd6\x54\x7d\xaa\x6a\x3e\xb6\xb6\xd5\x8f\x5c\xbb\x3d\x17\xf4\xce\x10\x5a\x59\x93\x70\xac\xdc\xcf\xb5\x99\xe0\x68\x91\xd0\x1b\x65\xb9\x6c\xb6\x3e\xfd\x65\xbd\x76\x4e\x03\x69\xed\xf8\xd8\xff\x79\xca\xce\xcc\xef\xce\x9c\x5f\x12\x8d\xc4\xa2\xc8\x16\x85\xf3\xf3\x2e\x8a\x25\xcb\x72\xf3\xf6\xad\x7b\x63\x7f\xbd\xcf\x4b\x6c\x55\x76\xd3\xd6\x03\xdc\x2c\xdc\x22\xe7\x32\x25\xda\x4e\x65\xf9\x42\xc8\x53\xf0\x67\xe3\x61\x2f\x99\xb3\xe7\xd6\x1d\x0f\x36\x66\xd6\x9c\x98\x22\x04\x24\x55\xac\x78\x52\x5d\xc6\x2a\xd2\x97\xc1\x73\xe2\x92\x56\xfb\x05\xcf\xa4\x0f\x3f\x32\x2a\x9f\xbe\x0c\xf1\x6a\x17\xe1\x85\x53\xda\xd6\x14\x17\x4b\x47\x52\x55\x80\x58\xa4\x5a\x14\x5b\x0e\xf7\x4a\xe7\x0f\x38\xee\x1f\xe9\xb8\x0d\x57\x92\xa6\xd2\x66\xab\x73\x63\x44\x8d\x2c\x4b\xa4\x3d\x60\xc2\x29\x69\x76\x32\xad\xbd\x3b\x39\xbb\x4b\x96\x75\xa7\xf3\xea\xcc\xd5\xde\xe5\x0c\x03\x14\xa4\x13\x9e\xe4\x6a\xf7\x35\xbc\xd8\x7c\x77\x7c\x33\xfa\xf1\xa9\x81\xb9\xdf\x69\xfd\x22\xe7\xc2\x5c\x58\xde\x60\x61\x86\xf6\xd2\xde\xa5\x56\xe4\xa3\x4b\x83\x0e\x2d\xeb\xe8\x10\x7b\x0b\x80\x97\x53\xc8\x85\x36\x17\x33\x9e\xc7\x89\xd0\xae\x72\xe2\x92\xf1\xa8\x90\x0f\x14\x1f\x92\x33\x99\xfa\xff\xb7\xed\xf9\x52\xd8\xe6\xdd\x50\x98\xc5\x1a\x1b\x55\x4f\xc7\xe6\x6f\x56\x71\x54\xb9\xb3\x75\x84\x80\x59\x9f\x60\x20\x2e\x89\x1f\x5d\x91\x4e\x66\x2a\xee\xc4\xdc\x5e\xa6\xd6\xec\x4f\x03\x12\xc7\xe7\xee\xba\x3a\x77\xdf\x9d\x5b\xff\xdd\xa2\xa2\x4a\xb2\x1b\x17\x17\xb3\xb2\x28\xb6\x1d\xb4\x06\x4a\xb1\xb3\x3d\xcf\xfd\xeb\x7f\xdb\xd1\xa7\xcb\x7f\x9a\x36\xfc\xab\x57\x08\x95\x0b\x1e\xaf\xd8\xbf\xda\x23\x28\xf3\xe3\xc1\x22\xa8\x71\x92\xa1\x53\xa4\x42\x33\x71\x8c\x50\xa8\xea\xa8\xb9\xb1\x11\xf6\x04\xca\x78\x71\xd7\x7c\x00\xd1\x7f\x6b\x9f\x54\xdc\xc6\xcd\xf9\xb2\xc7\x0b\x6e\x2c\xd2\xef\x33\x07\x6d\x3a\x95\xb3\x39\xcf\xf6\xc1\xf7\x73\xa7\x4b\x3f\x05\xfd\xa6\x11\x1f\x6b\xbe\xd5\x9b\x10\xbf\xfb\xf6\x4f\x2a\x7f\x97\x24\xc1\x2f\x77\x10\x27\x2d\x60\xff\xea\x91\xee\x26\x0b\x98\xbf\xe1\x6b\x1d\x9c\xe8\x4f\x77\x0e\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\xff\x16\xc7\xfe\x58\x4c\x9c\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x63\x01\xfc\x3e\xe9\xf3\x21\xb1\xd3\x55\x68\x43\x1b\xec\x14\xbe\x0d\xec\xb4\x3a\xea\xc3\xc3\x4e\x61\xb2\x80\x9d\x1a\xbe\xf6\x62\xec\xd4\xb4\x73\x80\x9d\x80\x9d\x80\x9d\x80\x9d\x80\x9d\x80\x9d\x80\x9d\x80\x9d\x80\x9d\x80\x9d\x80\x9d\x80\x9d\x80\x9d\x80\x9d\x80\x9d\x80\x9d\xb6\x38\xf6\x81\x9d\x80\x9d\x80\x9d\xc6\x31\xa3\xc0\x4e\xf5\xe1\x01\x76\x1a\x34\x76\x22\x13\xf1\x21\x99\x93\x69\x40\x3b\xde\x64\xbe\x09\xd6\xb4\x3a\xda\x03\x64\x4d\x66\xa2\xc0\x99\x1a\xbe\xf6\x72\xce\xb4\xb2\x5b\xc0\x98\xc0\x98\xc0\x98\xc0\x98\xc0\x98\xc0\x98\xc0\x98\xc0\x98\xc0\x98\xc0\x98\xc0\x98\xc0\x98\xc0\x98\xc0\x98\xc0\x98\xc0\x98\xb6\x38\xf6\xc1\x98\xc0\x98\xc0\x98\xc6\x31\xa3\x60\x4c\xf5\xe1\x01\x63\x1a\x32\x63\xa2\x65\x91\xd3\xe0\x1c\x10\x34\x7d\x30\xad\xf8\x6c\x5a\xd1\x8a\x36\x95\x5f\x07\x72\x5a\x1d\xf7\xe1\x21\xa7\x72\xb6\xc0\x9d\x1a\xbe\xf6\x62\xee\xd4\xb8\x79\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\xb6\x38\xf6\x01\x9f\x00\x9f\x00\x9f\xc6\x31\xa3\x80\x4f\xf5\xe1\x01\x7c\x1a\x32\x7c\x4a\x4b\x6e\x73\x38\xf6\x14\xe0\x51\x2b\xf4\xd4\xf8\xed\x35\x06\x74\xf6\x0c\xbe\x80\x11\xfd\x88\x8d\xe8\x1b\x36\xda\x16\x86\xf4\x67\xb6\xde\xe6\xcd\xb7\x82\xd4\x36\x2f\x46\x98\xd4\x61\x52\x87\x49\x1d\x26\xf5\x63\x33\xa9\xb7\x3b\x87\x1b\xcd\xea\x9b\x85\xe7\x0e\xcf\xde\xbd\x19\xd8\xdb\x0d\xc6\x7a\x23\xfb\x38\x46\x64\x1b\x73\x7b\xbb\x11\x59\x6f\x72\xdf\xdb\x88\xc0\xf8\x0e\xe3\x3b\x8c\xef\x30\xbe\xc3\xf8\xde\x9b\xf1\xbd\xe5\x5d\xf0\xc4\x00\xff\x8c\x2d\xa9\xc3\x4b\xe0\x88\x8d\xd7\xed\x06\x7f\x93\x01\x7b\x6f\x57\x31\x4c\xd9\xfb\x9a\xdf\xa7\xe6\xec\xbd\x4d\xf2\x41\x0d\xdb\xed\x06\x6b\x83\x71\x7b\x7f\x47\xd2\x50\xcd\xdc\xed\x86\xf0\xa9\xa9\xfb\xa5\x16\xb7\x46\x83\x34\x42\x11\x86\x11\x8a\x10\xac\xf7\x88\x44\x68\xf8\xda\x8b\x23\x11\x9a\xe0\x48\xcf\x81\x08\x63\x71\x4e\x78\xb5\x32\x45\xaf\x33\xa5\x3b\xc6\x5c\x56\x31\x61\xbc\x15\xd1\xb2\x5f\xee\x80\x69\xd9\x51\xbc\x55\xf1\xda\x33\xb6\xe9\x33\x23\x8a\xca\x5c\xc4\x6e\x9c\x7a\xdc\xe9\x2d\x77\xf9\x33\x97\x9c\x59\x5a\x4e\xe1\x38\x67\x32\x8d\xcd\xe1\xe8\x15\xaa\x9a\xf1\xb1\x8a\xc6\x6e\x05\xcb\xcc\xd2\xd7\x66\xed\xb1\x77\x29\x93\xa9\x35\xfd\xab\x9c\x2d\xd2\x40\x0f\x62\x16\xe7\xcb\xcf\x8b\x94\xc5\x32\x17\x46\x1c\x10\xc1\x24\x6d\xb4\x17\x52\x0f\x9d\x4d\xde\x9f\xa8\xce\x02\xca\xa6\x8b\x9c\x6c\x09\x59\xae\x22\xa1\x49\x8f\x73\xd2\x87\x93\xf5\x27\xec\x57\x7a\x23\xd9\x68\x48\xf1\xfa\x23\xbb\x60\xef\x92\xe4\x8f\xa4\xa5\xc5\xf9\x92\xe5\x8b\x94\xe9\x82\x9b\x9b\xdb\xab\xa6\xee\x71\x22\xde\xe1\x46\xb5\x7d\x39\x8c\xcc\x46\x06\x86\x8f\x3c\xe5\x33\x91\x5b\x53\x99\x69\x15\xe3\x5a\xab\x48\x92\xee\x17\x8c\x52\x9c\x6c\x8b\x2a\x67\x22\x2d\x8c\x30\xe6\x95\xe1\x39\xbf\x37\xa3\x58\xdc\x09\x2d\xbc\x44\x63\x64\x3d\x0f\x72\x88\x65\xdc\x0a\x46\x12\x1d\x19\xa0\x54\xce\xde\xfe\xfe\x0f\xe6\xbb\x39\x8f\x88\x38\x25\x2a\x9d\x59\xf9\x85\x8c\x44\x46\x9b\xe7\x32\xb5\xa7\x10\x19\x61\xca\xef\x92\x15\xde\xf1\x30\x76\xbb\x0c\x22\xfa\x4c\x25\x3c\x9d\x4d\x54\x3e\xbb\xcc\xee\x67\x97\x8b\x54\x46\x2a\x16\x97\xbf\xfb\x59\x5f\x9b\xa7\xec\x6c\xd5\x75\x83\xd3\xe5\xf4\x0c\x4a\xe0\x19\x9b\x1c\xd2\x56\x06\xf9\x7d\x0b\x19\xe4\xbd\x35\x4c\x0d\xa3\xb9\xbf\x7f\xb6\xb9\xef\x22\xa3\x59\x0e\xa3\xbd\xc7\x24\xe2\x91\x60\x31\x34\x11\xef\x15\xdb\xe8\xfe\x73\xf9\xcf\xf0\xef\x7f\x5d\xde\x9a\xfb\x35\x9d\xd5\x7c\x82\x76\x90\x0c\x71\x67\xb7\x12\x72\x1b\xee\xeb\x9e\x5d\x06\x4f\xf4\x96\x6e\x19\xdc\xd4\x74\x43\xf7\x3c\x21\xce\xb2\x6e\x67\x21\x8d\x99\x39\xe7\x98\x8e\x54\x26\xce\x99\x5e\x44\x77\xa6\xf7\x64\x06\x13\x7c\x6e\x6d\x38\x59\xae\xc8\x92\xdf\xd4\xc1\x8c\x17\x77\xcd\xfd\x4b\x9b\xcf\x8e\x0d\xba\x40\xcf\x1d\x87\xf2\xf8\x54\x79\xfc\xc1\x9e\xbe\xdb\xaa\x8e\x71\xc3\xef\x46\xae\x42\xfa\x1e\xad\x97\x21\x20\xfa\xf6\x31\xaa\x03\x12\x7c\xb7\x6e\xec\x41\xc5\xde\x2d\x5b\x0b\xa1\x37\x7c\xfd\x19\xa1\xf7\xe9\xd9\xd6\xb1\xc8\x6b\x1d\x39\xe7\x3c\xab\x09\xbd\xd6\xa7\xa0\xdb\x73\xde\x3e\x93\x45\x2a\x49\x44\xe4\x71\xd5\x7b\x7a\xfd\x47\x9e\x6d\x38\xf5\xed\x0f\xed\xa9\xff\x3e\xfc\xba\x3c\xff\x1b\x9f\xd1\xef\x0d\xb0\xfb\x96\x99\xf3\xe8\x4e\xa6\x22\x5f\x4e\xb2\xfb\x99\xf9\x83\x9e\xcc\x45\xc1\xcd\x26\xfa\x91\xfa\xf9\x89\x06\x4c\x77\x62\x3c\x84\x67\x35\x3c\xab\xe1\x59\x0d\xcf\x6a\x78\x56\x57\x3f\xdf\x0f\x11\x80\x11\xa8\xf5\x44\x1d\x12\xdc\xc0\x01\xbe\x49\x68\x08\x1e\x45\x32\x65\xda\x3a\xf9\xb0\x5b\x31\xb5\x51\x7c\xc1\x21\xb2\x14\x25\xdc\xe9\x45\x4b\xa7\x62\x04\x4b\x55\x7a\x91\x8a\x19\xa7\x05\xea\xbc\x81\xaa\xc6\x32\xeb\x1c\x1d\xb6\x86\x93\x10\xe5\x7c\x2e\x62\xc9\x0b\x91\x2c\xcb\xf0\xba\xf2\xca\x95\xc9\xb9\xf3\xf2\xa1\x41\x67\xb3\x9c\x47\xb4\x6b\xa4\x8a\x83\x40\x50\x5e\xda\x14\xbb\xe8\x57\xe9\x42\x9b\x46\x56\xa7\x8b\x9b\x5f\xfa\x0e\xb9\x97\x4c\xed\x19\xe8\x1f\x31\xb1\xed\x9c\x0b\x9e\x36\xb6\x71\x87\x69\xa6\x36\x5f\x53\x93\x0f\xeb\x43\x85\x68\x07\x44\x3b\x20\xda\x01\xd1\x0e\x88\x76\x40\xb4\x03\xa2\x1d\xc2\x25\xf0\xa3\xc8\x72\x61\x84\x92\xf8\x8f\x2c\x4b\x04\xd7\x22\x1c\x41\xd7\xb9\xca\xf8\x8c\xa4\xa3\x6b\x95\xc8\x68\x59\x8b\xc9\xf7\x8b\x2e\x0e\x0f\x30\xcb\xee\xed\xe4\xbf\x26\xec\xc6\x9e\x67\x56\x74\xc9\x44\x6a\x36\x4b\x79\xa7\x0a\xa6\xf2\xec\x8e\xa7\x3e\x47\x40\xbe\x10\x97\x53\x9e\x78\x5d\xf9\xeb\x6b\xfb\xf1\xd7\xd7\x6c\x2a\x53\x9e\xc8\x7f\xf8\x8b\xe4\x56\x30\x1e\x93\xd3\xbe\xba\xb4\x4e\xcb\x71\xa9\x86\xd9\xc7\x9f\xe9\xf2\x47\x56\x3f\x9d\xb0\x2b\x49\x87\x63\xa5\xe9\x2a\x7f\xda\xb7\x32\x60\xa3\xb0\xea\x31\xe9\x28\xaa\xb8\xdb\x65\x42\x6d\x0f\x7e\xf4\x7d\x3f\x54\xba\x81\xdf\xdc\xbd\x60\x36\xec\x9d\x7a\x64\x33\x9e\xdf\xf2\x59\xcd\x30\x19\x94\x1a\x91\x4f\x55\x3e\x37\x73\xd2\x38\x5e\x9f\x56\x7a\xb4\x7e\xb8\x48\xe8\xf5\x12\x6b\x66\xc7\x56\x1a\x69\x32\x92\x71\xa9\x0a\x93\xac\x40\xc6\x89\x30\xc7\xe6\xb2\x76\x37\xa9\x97\x06\x26\x95\xc9\xf4\xf7\x48\x88\x91\x08\xf9\x2e\xea\x2f\x9b\x30\x6b\xfd\xa7\xbb\xa9\xaa\xd9\x9d\xd9\x3e\x9c\xb1\x0b\xb7\x00\xeb\x0b\x54\x7f\xcf\xce\x7e\xe0\xd1\xfd\x2c\x57\x8b\x34\x36\xdf\xa2\xbc\x11\xf4\xa5\x95\x81\xb3\x22\xa4\x93\x8f\xeb\x0f\xf1\x3d\xb8\x0d\x4f\xfa\x9e\x9d\xfd\xa4\x72\x51\x79\x2c\x8b\xb8\x8e\x78\x6c\x7a\xef\xc6\xc7\xa6\x16\xa1\xe7\x69\xab\x7a\x3e\x79\xe0\x34\x3c\x63\x97\x05\x99\xad\x2e\xf7\x41\x04\xf5\x20\xb4\x6a\x08\xb3\x80\xd0\x2a\x84\x56\x1d\x5b\x68\x55\x23\xa5\x83\xd3\xc0\x96\x98\xee\xa6\xe0\xc5\xa2\x2d\x9f\x3b\x2a\xd4\x6d\xef\xe2\x52\x4e\xea\x0f\x7b\x37\x21\xdd\x6d\xc2\x79\xf6\x9c\xc8\xad\x0d\xc5\x6e\x48\xe4\xf6\x32\x72\x8d\x94\x6e\x48\xe9\x66\x3f\x42\x4a\x37\x38\x1e\xc0\xf1\x00\x8e\x07\x70\x3c\x80\xe3\x01\x88\x36\x20\xe7\xf3\x23\x02\xc8\x09\xc8\x09\xc8\x09\xc8\x09\xc8\x79\xc2\x90\x13\xdc\x01\xdc\x01\xdc\x01\xdc\x01\x29\xdd\x90\xd2\x0d\x29\xdd\xc2\x27\xad\x83\x1e\x83\xf5\x1e\x29\xdd\x1a\xbe\x76\x70\x06\xb4\x43\xe2\x0e\xa4\x23\x40\x3a\x82\x90\x8e\xa0\x0d\xd4\x6b\x4e\x48\x70\x80\x80\xd4\xde\x53\x12\x94\x7d\x6a\x77\xd0\x21\x38\xea\x08\x82\xa3\x4e\x34\x5f\x0e\xb2\xda\x8d\xc4\x4b\x67\xe7\xd3\xe9\xc0\xc9\x3d\x76\x68\xee\x41\xd3\x7b\x6c\xdd\xde\x63\x92\x72\xfb\x4d\xf0\xb1\xa3\x94\xfb\x8a\xed\x92\xe2\xc3\xfe\xf9\x5f\x7b\xca\xf4\xd1\x4e\x84\xaa\x66\xf7\x40\x4e\x8f\x86\xde\x40\x74\x1a\xa3\xe8\x84\x28\xea\x13\x8a\xa2\x46\xb8\x18\xc2\xc5\x10\x2e\x86\x70\x31\x68\x7d\xeb\x76\xd1\x20\x63\x33\x0e\xa3\x55\x21\xb4\x64\x6d\x68\xc9\xe0\xd4\xac\x60\x67\xee\x3c\xa0\x24\x17\x3c\x5e\x91\xb1\xda\x68\x4b\xe6\x67\x7d\x46\x91\x54\xa4\x0e\xf1\x8d\x7c\xc3\x6e\xcd\xbf\x78\x54\x4c\x18\xbb\x32\xff\xf5\x7f\x9f\x73\x49\x66\x38\xcd\xa2\x64\xa1\x0b\x91\x97\x77\x89\x75\x22\x65\x89\xbc\x17\xec\x2c\xb4\xf3\xcc\x88\x8c\x5e\xcc\x99\xb0\xeb\x84\xa7\xa9\xb0\xb2\x26\x09\x22\x3c\xb1\xb2\xcf\xdb\x3f\xec\x72\x38\x53\x1b\x0f\x24\x22\x84\x41\x0b\x12\xf6\xad\x1f\x3e\xd3\x53\x76\x65\x47\xcc\x5c\x0b\x99\xf6\xa3\xe3\xdc\xa7\x16\x5a\xe4\xe4\xf7\x54\x0a\xcb\xcb\x9e\x07\xca\x34\xe6\x78\x29\xf5\xb0\xef\x2e\x98\xd4\x48\x71\x13\xc3\xb3\xa8\xbd\x84\x1b\x13\x15\x71\xd6\x8e\x35\xaf\x6f\x83\x84\x87\x42\x83\x81\xc1\x47\x87\xc1\xc9\x6f\xa6\x95\x80\xb2\x7a\xfe\x5e\xd0\x6f\xff\x6d\xf3\x51\x3c\x17\xf9\x4c\xb4\xfa\xa6\x2e\x72\x5e\x88\x99\x8c\x2e\xda\xff\xc6\xfc\x7b\xe9\xbe\x49\x87\x7e\x1b\x01\x2a\xe3\x79\x21\x29\xac\xcd\xfa\x78\xed\x20\x4c\xd1\x1b\x07\x60\x79\xee\x0b\xde\x6f\xd0\x34\xae\xeb\x8e\x56\x0c\xf6\xe8\x23\xb7\x47\x9f\x0e\xca\x5f\x09\x0f\xf1\x9b\xcb\x86\x30\x99\x93\xa6\x0c\x8b\xff\x6e\xcd\x29\xf4\x86\xac\x71\x36\x6e\x99\x27\xf4\xcb\x54\xa5\x17\xf6\xd7\xf4\x0d\x32\x88\x6b\xf6\xdd\x7f\x6b\x95\x5e\xdb\xe8\xf0\x8f\xe6\xbc\x73\xff\xbe\xf1\xa7\x60\xf9\xc7\x37\x43\xf2\x31\x68\xbf\x6e\x7e\x52\x79\x44\xc4\x60\xa6\x68\xf2\x15\xfb\xfa\x7a\x6a\xfe\xf6\xf5\x35\x7b\x57\x1b\x4d\x72\x3e\xb7\xe6\x7d\x52\x6a\xdc\x46\xbd\xe0\x11\x4d\x00\xc5\x17\x27\x32\x72\x06\x4b\xd2\x81\xd4\xa3\x9b\x5b\x1b\x7f\x9b\x09\x95\x25\x62\xc2\xec\x3b\x29\xad\x80\x5f\x53\xe4\x02\xde\x38\x11\xe1\xf5\xbb\x0c\xaf\x79\x11\x54\x21\xfb\x01\x54\xa1\x83\x78\x17\xac\xf8\x4b\x0f\x4d\x19\x5a\x74\x6e\xf7\xca\x12\x1e\xed\x22\xad\xb9\x5f\x1e\xb1\xbc\x06\x67\x4b\x48\x68\xa7\x20\xa1\x0d\x48\x10\xc2\x7d\x1d\x3e\x81\xb3\xa5\x7b\xf2\x51\x89\x17\x8b\xe1\x59\x5a\x5f\xb1\xf6\xbe\x8b\x22\x8d\x33\x25\xd3\xe2\x30\xd5\xc9\xae\xc2\xdb\xd7\x8b\x25\xcf\x55\x27\x6b\x7c\x06\x3c\x19\x91\x24\x0c\x49\xc2\x90\x24\x0c\x49\xc2\x90\x24\xec\x20\xca\x06\x74\xc2\xd6\x13\x85\xea\x64\x43\xca\xe5\x06\xbf\xfa\x13\xf2\xab\x47\xe2\x3e\x24\xee\x43\xe2\x3e\x24\xee\x43\xe2\x3e\x24\xee\x43\xe2\x3e\x84\x9b\x21\xdc\x0c\xe1\x66\x08\x37\x5b\x5d\x91\xa8\x4e\x86\x2c\xa1\xc8\x12\x8a\x2c\xa1\x23\xcf\x12\xda\x48\xe9\x80\xe2\x11\x42\xba\xfa\x83\x83\x57\x27\x6b\x42\xba\x03\xae\x4e\xd6\x86\x62\x37\x55\x27\x7b\x11\xb9\x46\x75\x32\x54\x27\xb3\x1f\xa1\x3a\x19\x1c\x0f\xe0\x78\x00\xc7\x03\x38\x1e\xc0\xf1\x00\x44\x1b\x90\xf3\xf9\x11\x01\xe4\x04\xe4\x04\xe4\x04\xe4\x04\xe4\x3c\x61\xc8\x09\xee\x00\xee\x00\xee\x00\xee\x80\xea\x64\xa8\x4e\x86\xea\x64\xe1\x93\xd6\x61\x8f\xc1\x7a\x8f\xea\x64\x0d\x5f\x3b\x38\x03\x42\x75\xb2\x53\x48\xcb\xd6\x57\x75\xb2\x36\x48\xaf\xb9\x36\xd9\x01\xc2\x51\x7b\x4f\x97\x51\xf6\xa9\xdd\x31\x87\xd0\xa8\x23\x08\x8d\x42\xba\x0c\xa4\xcb\x68\x68\xcc\x80\x05\xb1\x71\xa4\xcb\xd8\xa1\xb9\x07\xad\x4d\xb6\x75\x7b\x8f\x49\xc6\xed\xb7\x36\xd9\x8e\x32\xee\x2b\xb6\x43\x7e\x8f\xfd\x96\x26\xdb\x36\xb1\x07\xd2\x79\x34\xf4\x06\x72\xd3\x18\xe5\x26\x04\x50\x9f\x50\x00\x35\x22\xc5\x10\x29\x86\x48\x31\x44\x8a\x41\xe5\x5b\xb7\x8b\x06\x19\x96\x81\xc2\x64\x83\xd1\xb0\xfa\x2e\x4c\x36\xb8\x58\x92\x86\xc2\x64\x6d\xb4\xa5\xa6\xc2\x64\x5d\x06\x90\xa0\x30\x59\x58\x03\xed\x45\x04\x14\x26\x73\xff\xc3\xdd\x05\x7b\xda\xc1\x0b\x93\x1d\x00\x19\x57\x0b\x93\xad\x79\x3d\x0a\x93\x35\xf7\x19\x04\x1c\x85\xc9\xfa\x28\x4c\xd6\x46\x98\x6a\x2c\x4c\x76\x44\xe4\x1e\x85\xc9\x60\x8f\x3e\x3d\x8e\x8f\xc2\x64\x5d\xae\x1b\x14\x26\x83\x2a\x04\x55\xe8\xe9\x30\x8e\xa4\x30\xd9\x8b\x95\xa1\xfd\x14\x26\x6b\x67\xfa\x6a\x2c\x4c\x76\x44\xf2\x1a\x3c\x2d\x21\xa1\x9d\x82\x84\x36\x20\x41\x08\xf7\x75\xf8\x04\x9e\x96\xee\xc9\x47\x25\x5e\xf4\x59\x98\x6c\x1f\x8e\x8b\x94\xad\xec\x30\x55\xc9\xcc\xab\x5b\x3a\x2e\x36\x56\x24\x5b\xfd\x3d\xdc\x17\x91\x14\x0c\x49\xc1\x90\x14\x0c\x49\xc1\x90\x14\xec\x20\x1a\x06\x14\xc1\xd6\x13\x85\x6a\x64\x43\xca\xdd\x06\x67\xfa\x13\x72\xa6\x47\xa2\x3e\x24\xea\x43\xa2\x3e\x24\xea\x43\xa2\x3e\x24\xea\x43\xa2\x3e\xc4\x98\x21\xc6\x0c\x31\x66\x88\x31\x5b\x5d\x91\xa8\x46\x86\xac\xa0\xc8\x0a\x8a\xac\xa0\x23\xcf\x0a\xda\x48\xe7\xc0\xdf\x11\x37\xba\xfa\x83\xc3\x57\x23\x5b\xc1\xb9\x43\xae\x44\xf6\x0c\xb9\x6e\xac\x42\xb6\x2b\xad\x46\x05\x32\x54\x20\xb3\x1f\xa1\x02\x19\x9c\x0d\xe0\x6c\x00\x67\x03\x38\x1b\xc0\xd9\x00\x14\x1b\x60\xf3\xf9\x11\x01\xd8\x04\xd8\x04\xd8\x04\xd8\x04\xd8\x3c\x61\xb0\x09\xd6\x00\xd6\x00\xd6\x00\xd6\x80\x0a\x64\xa8\x40\x86\x0a\x64\xe1\x93\xf6\xf1\x8d\x46\xe8\x47\xf5\xb1\x86\xaf\x1d\x94\xf9\xa0\xf2\xd8\x29\xe4\x5d\xeb\xab\xf2\x18\x4f\x9f\xa5\x78\x6b\x0a\x8f\xed\x37\xea\xb4\xff\x54\x18\xd4\x9f\x76\x27\x1b\xa2\x9f\x8e\x20\xfa\x09\x69\x30\x90\x06\xa3\xa1\x31\x03\x95\xbb\x46\x92\x02\x63\xbb\xa6\x1e\xb6\xd0\xd8\x36\x6d\x3d\x26\x51\xb6\xe7\x22\x63\xdb\x8b\xb2\xaf\xd8\xb6\x79\x3a\xf6\x5b\x5d\xac\x85\x8c\xb4\xa6\xb8\x18\x32\x73\x40\x3e\x1a\xab\x7c\x84\x58\xe8\x13\x8a\x85\x46\xd0\x17\x82\xbe\x10\xf4\x85\xa0\x2f\xa8\x76\xeb\x76\xd1\x20\x23\x2c\x50\x58\x6c\x30\x5a\x55\xef\x85\xc5\x86\x14\x16\xd2\x54\x54\xec\x19\x0d\xa9\xb1\xa0\x58\x47\xb1\x20\x28\x26\x16\xe6\xbe\xbd\x58\x80\x62\x62\xee\x7f\xb8\xaf\x60\x33\x0b\x1f\x1e\xa4\x90\xd8\x7e\xe9\x6f\xad\x88\xd8\xd3\x57\xa3\x80\x58\x73\x9f\x01\xb2\x51\x40\xac\x97\x02\x62\xcf\x08\x4e\xcd\xc5\xc3\x8e\x83\xbe\xa3\x70\x18\xec\xcd\xa7\xc7\xe3\x51\x38\xac\xcb\x75\x83\xc2\x61\x50\x7b\xa0\xf6\x8c\xb3\x68\xd8\x4b\x14\x9f\x3d\x15\x0c\x7b\xd6\xac\xd5\x5c\x2c\xec\x38\xe4\x33\x78\x47\x42\x1a\x3b\x76\x69\x6c\x40\x42\x0f\xee\xe6\xf0\xc9\xc9\x7b\x47\x1e\x95\x18\xd1\x6b\x71\xb0\x7e\x1d\x0e\x29\x48\x31\xa7\xc3\xeb\x20\xd5\xc1\x3e\x98\xf7\x7f\x36\xef\x6f\xe9\x7e\xd8\x54\x22\xac\xf9\x21\xf0\x46\x44\xea\x2e\xa4\xee\x42\xea\x2e\xa4\xee\x42\xea\xae\x83\x28\x19\xd0\x05\x5b\x4f\x14\xea\x84\x0d\x29\xc3\x1a\x7c\xe3\x4f\xc8\x37\x1e\xe9\xf4\x90\x4e\x0f\xe9\xf4\x90\x4e\x0f\xe9\xf4\x90\x4e\x0f\xe9\xf4\x10\x32\x86\x90\x31\x84\x8c\x21\x64\x6c\x75\x45\xa2\x4e\x18\x72\x77\x22\x77\x27\x72\x77\x8e\x3c\x77\x67\x23\xa7\x03\x82\x47\x18\xe8\xea\x0f\x0e\x5e\x27\xac\x91\xe9\x0e\xb8\x58\x58\x2b\x90\xdd\x54\x31\xec\x65\xf0\x1a\x65\xc3\x50\x36\xcc\x7e\x84\xb2\x61\xf0\x3d\x80\xef\x01\x7c\x0f\xe0\x7b\x00\xdf\x03\x40\x6d\x70\xce\xe7\x47\x04\x9c\x13\x9c\x13\x9c\x13\x9c\x13\x9c\xf3\x84\x39\x27\xd0\x03\xd0\x03\xd0\x03\xd0\x03\xca\x86\xa1\x6c\x18\xca\x86\x85\x4f\x5a\x47\x3d\x96\xe6\x7b\xd4\x0e\x6b\xf8\xda\xe1\x39\x10\x0a\x88\x9d\x42\xde\xb5\xde\x0a\x88\xb5\x03\x7b\xcd\x45\xc4\x0e\x11\x97\xda\x7b\xae\x8c\x4a\xa7\xda\x1d\x76\x08\x92\x3a\x82\x20\x29\x24\xcc\x40\xc2\x8c\x86\xc6\x0c\x59\x1e\x1b\x47\xd6\x8c\x5d\xda\x7b\xd0\xc2\x62\xdb\x37\xf8\x98\x84\xdd\x7e\xab\x8b\xed\x2a\xec\xbe\x62\x3b\x65\xfc\xd8\x73\x9d\xb1\xed\x93\x7d\x20\xc5\x47\x53\x6f\x20\x41\x8d\x51\x82\x42\x50\xf5\x09\x05\x55\x23\x7a\x0c\xd1\x63\x88\x1e\x43\xf4\x18\x94\xbf\x75\xbb\x68\x90\xa1\x1a\x28\x38\x36\x18\x45\xab\xef\x82\x63\xc3\x8b\x2f\x69\xa8\x3a\xd6\x4a\x61\x6a\x2a\x3d\xd6\x69\x50\x09\xea\x8f\x85\x55\xd0\x5e\x4a\x40\xfd\x31\xf7\x3f\x5c\x5f\x30\xad\x1d\xbe\x08\xd9\x21\x30\x72\xb5\x12\xd9\xba\xf7\xa3\x1c\x59\x73\x9f\x81\xc5\x51\x8e\xac\x8f\x72\x64\xad\x24\xaa\xc6\x9a\x64\xc7\x04\xf3\x51\x98\x0c\x76\xe9\xd3\x23\xfb\x28\x4c\xd6\xe5\xba\x41\x61\x32\xe8\x43\xd0\x87\x1a\xc6\x71\x24\xd5\xc9\x5e\xae\x11\xed\xa7\x44\x59\x4b\x1b\x58\x63\x9d\xb2\x63\x92\xd9\xe0\x80\x09\x31\xed\x24\xc4\xb4\x01\x49\x43\xb8\xb4\xc3\x27\x70\xc0\x0c\x8f\x3e\x2a\x21\xa3\xcf\xda\x65\xfb\x70\x67\xf4\xb7\x50\x5a\x3c\xa8\x64\x31\x17\x51\xc2\xe5\xfc\x30\xb5\xcc\xae\x43\x53\x7e\xa5\xa6\xbc\x37\x4d\x69\xe9\xe9\xd8\x54\xd6\xec\xd9\xe7\xc1\xfd\x11\x59\xc6\x90\x65\x0c\x59\xc6\x90\x65\x0c\x59\xc6\x0e\xa2\x94\x40\x77\x6c\x3d\x51\xa8\x70\x36\xa4\x64\x70\x70\xc6\x3f\x21\x67\x7c\x64\xfe\x43\xe6\x3f\x64\xfe\x43\xe6\x3f\x64\xfe\x43\xe6\x3f\x64\xfe\x43\x8c\x1a\x62\xd4\x10\xa3\x86\x18\xb5\xd5\x15\x89\x0a\x67\x48\x33\x8a\x34\xa3\x48\x33\x3a\xf2\x34\xa3\x8d\xf4\x0e\xc8\x1e\x71\xa7\xab\x3f\x38\x78\x85\xb3\xe7\xf0\xee\x80\x8b\x9d\x6d\x4b\xba\x9b\xea\x9e\x75\x46\xb7\x51\x02\x0d\x25\xd0\xec\x47\x28\x81\x06\xe7\x04\x38\x27\xc0\x39\x01\xce\x09\x70\x4e\x00\xf5\x06\x08\x7d\x7e\x44\x00\x42\x01\x42\x01\x42\x01\x42\x01\x42\x4f\x18\x84\x82\x4d\x80\x4d\x80\x4d\x80\x4d\xa0\x04\x1a\x4a\xa0\xa1\x04\x5a\xf8\xa4\x75\x04\x65\xa3\x25\x1f\xd5\xd0\x1a\xbe\x36\x28\x66\x84\xc2\x68\xa7\x90\x01\xae\xbf\xc2\x68\xdb\x42\xc0\xe6\x1a\x69\x07\x0e\x72\xed\x3d\x5b\x47\x73\xff\xda\x1d\x8c\x08\xbe\x3a\x82\xe0\x2b\x24\xee\x40\xe2\x8e\x86\xc6\x8c\x44\x8c\x1b\x47\x0e\x8f\x17\x36\xfd\xa0\xf5\xd4\x5e\xd4\xf6\x63\x92\x9c\xfb\x2d\xad\xd6\x81\xe4\xfc\x8a\xbd\x34\x2d\xc9\xbe\x0b\xae\xbd\x24\x23\xc9\x60\x44\xb4\x91\xe4\x21\x81\x38\x56\x9d\xe4\xc1\x8a\x63\x88\xfc\x3e\xa1\xc8\x6f\x84\xb8\x21\xc4\x0d\x21\x6e\x08\x71\x83\x26\xb9\x6e\x17\x0d\x51\x93\x84\x3a\x36\x04\x75\xac\xef\x02\x6c\x83\x0e\x7f\x69\xa8\xc5\xb6\xad\x2e\xd5\x54\x96\xad\xaf\x98\x17\x54\x68\x0b\x6b\xa3\xbd\x00\x81\x0a\x6d\xee\x7f\xb8\xd9\x70\x3b\x0c\xaa\x58\xdb\x81\x29\x77\xb5\x6e\x5b\x8b\xa6\xa0\x84\x5b\x73\x9f\x01\xf0\x51\xc2\xad\x8f\x12\x6e\xdb\x0a\x62\x8d\xd5\xdc\x8e\xd4\xed\x00\x85\xdd\x60\xe9\x3e\x3d\xc7\x03\x14\x76\xeb\x72\xdd\xa0\xb0\x1b\xd4\x28\xa8\x51\x47\x51\xe3\xad\x53\x45\x6a\x3f\xe5\xde\xb6\x37\xb3\x35\x56\x7e\x3b\x52\xf9\x0e\x6e\xa5\x90\xee\x4e\x4d\xba\x1b\x90\x10\x85\xbb\x3e\x7c\x02\xb7\xd2\x67\x9a\x7e\x54\x62\x4a\x9f\x55\xe2\x86\xe4\x99\x79\xa9\x6d\xe2\xc3\x8a\x83\x66\x3f\x6c\xd1\xbe\xc7\xdf\x60\x7b\xa0\x8c\x2e\xa3\x23\xce\x2d\x6c\x7e\xa0\x1e\xa0\x1e\xa0\x1e\xa0\x9e\x21\xa2\x9e\xae\xee\xc5\xf6\xd0\xa7\xe1\x62\x1c\xa5\x69\x00\xe8\x07\xc6\x81\xd3\x33\x0e\x00\xfd\x74\xb9\x6e\x80\x7e\x60\x0e\x82\x5a\x05\xf4\x53\x1f\xa6\xfe\xd0\x4f\x77\x56\x90\xf6\x10\xe8\x58\xe4\x3d\xa0\x20\x48\x7b\xa7\x26\xed\x0d\x48\xa8\xc2\xdd\x1f\x3e\x01\x0a\x7a\xa6\xe9\x47\x25\xb6\x1c\x13\x0a\x52\xb1\xde\x53\x2e\x8e\x4a\x54\xb2\x9a\xb2\x6b\x15\x6f\x90\x66\xaa\x59\x38\xde\x87\xdf\x55\xc4\x9a\xfa\xaf\x91\x7d\x03\x85\x76\x50\x68\x07\x85\x76\x50\x68\x07\x85\x76\x0e\xa2\x7f\x40\x4d\x6c\x3d\x51\x87\x54\x13\x51\x0f\x09\xb9\xa0\x4e\x38\x17\x14\x8a\x5f\xa1\xf8\x15\x8a\x5f\xa1\xf8\x15\x8a\x5f\xa1\xf8\x15\x8a\x5f\x21\x45\x22\x52\x24\x22\x45\x22\x52\x24\xae\xae\xc8\xbd\xd6\x78\x43\xa5\xbd\x21\xcc\x02\x2a\xed\xa1\xd2\xde\xb1\x55\xda\x6b\x24\x73\xa0\xf3\x5b\x62\x3a\xe7\x2a\x75\x82\x94\xdb\xde\xc5\xa5\x9c\xd4\x23\xf2\x56\xf1\x8e\x5e\x79\x9d\x07\x26\x5a\x33\x58\xee\x54\x67\x2f\xaf\xab\x29\x33\x6d\x7d\x86\x59\x9b\xdf\x3e\x71\xbf\xdb\x8d\x53\xaf\xb4\x8a\xa4\x30\xaa\x87\xf9\x83\x52\xf7\x73\x9e\xdf\xeb\xd2\xa7\xdb\x36\x95\x0c\x2f\xda\x99\x87\x96\x99\xd1\x21\x7e\xf8\xf4\xe9\x97\x8f\xef\x3e\xff\xf2\xf5\x75\x69\xfa\xb0\x52\x96\x22\x51\x55\xce\xb3\x44\x90\x8d\xe3\x36\x3c\xd5\xc8\x15\x72\x96\x5a\xd3\xaf\x11\x7e\x13\x3e\x23\xb1\xb3\xfc\x8a\x51\x33\xab\x2a\xa2\xb5\x27\x9c\x69\x16\x4b\x1d\xe5\xc2\xb4\xb9\x84\x46\x15\xd8\xe1\xec\x1a\xf5\x07\x05\x4b\x83\x51\xa1\x8d\xba\xee\x05\x5a\x73\xe4\xe5\x0f\x3c\x39\x67\xa9\xb2\x3c\x97\x14\xe1\x60\x1c\x59\xb5\xaf\x11\x51\x5c\x32\xdf\x67\x67\x88\x0a\x6a\xb0\x16\x9a\x2a\x79\x06\x0b\xb3\xb3\x97\x38\x94\x55\xd3\xea\xcc\xa7\x34\x04\x71\x40\xa4\x53\xc1\x0b\xa3\x8c\xcf\x78\x21\xd8\xca\x44\xb8\x27\x89\xd4\x48\xdb\xd6\xee\x90\xc9\x92\xdd\x36\x3d\x76\x87\x8b\xa2\x61\x09\x1c\x48\xa3\x82\x9b\x01\xdc\x0c\xe0\x66\x00\x37\x03\xb8\x19\x34\x1d\xbe\xe0\xd7\x23\x1a\x11\x20\x4d\x20\x4d\x20\x4d\x20\x4d\x20\x4d\x20\xcd\xe3\x42\x9a\xa0\x0c\xa0\x0c\xa0\x0c\xa0\x0c\xbd\x53\x86\x2d\x48\xbc\x55\xe6\x54\xee\x83\x2b\xcd\xf4\x5b\x72\x6c\xbe\x77\x4b\x97\x98\x9d\x54\x4b\xba\x9d\x74\x52\xdc\x89\xb9\xbd\xb6\x74\x91\x0b\x3e\xa7\xe1\x89\xe3\x73\x77\x31\x9c\xbb\xef\xce\xd5\x03\xc9\x3e\x15\xf5\x8e\xdd\xd8\xaa\x44\xab\x4b\x7d\x97\x21\x7c\xdc\xb4\xc0\xc6\x9f\x39\x61\xed\x0f\xcc\xcb\xbe\xb7\x03\xff\xa7\xa7\x63\xd0\xe6\xd9\xf5\x5f\x0f\x1b\x04\x95\xb1\x8e\x2a\xfe\x20\x75\x71\x8a\xdc\xc7\x9c\x5f\x43\x64\x3d\x3b\xa4\xb6\x43\xfe\xb7\xd1\xe5\x7f\x53\xba\x63\xa2\x67\xb5\x30\xc6\x9f\x81\x77\xf6\x6b\x1d\xe1\xbb\xa1\x66\xc9\x50\x31\x72\x62\x9c\x4e\xb0\x13\x72\x62\x20\x27\x46\x43\x63\x06\x29\x6c\x8d\x24\x03\xc6\x36\x0d\x3d\x6c\x09\xe7\xf6\x2d\x3d\x26\xd9\x95\xc4\x87\xe1\xc8\xae\xaf\xd8\x76\x89\x38\x5c\x06\xf6\x3d\xe5\xe3\x78\x4e\x24\xaa\xe6\xe0\x40\xe6\x8d\xda\xdb\x21\x10\x8d\x51\x20\x42\xac\xf3\x09\xc5\x3a\x23\xa8\x0b\x41\x5d\x08\xea\x42\x50\x17\x74\xb9\x75\xbb\xe8\xf0\xba\x1c\x54\xa4\x43\x85\x75\x0c\x48\x49\x0a\xb6\xdf\x7e\xaa\x4c\xd5\x65\xa6\xcd\x1a\x4f\x63\x25\xa9\x4e\x22\x38\x2a\x92\x83\xf8\x46\x7e\x59\xb7\xe6\x5f\x3c\x2a\x26\x8c\x5d\x99\xff\xfa\xbf\xcf\xb9\x24\x03\x99\x66\x51\xb2\xd0\x85\xc8\xcb\xfb\xc0\x25\x91\x4f\xe4\xbd\x60\x67\xa1\x85\x67\x46\xec\xf3\xa2\xca\x84\x5d\x27\x3c\x4d\x5d\xf6\x7f\x12\x26\x78\x62\xe5\x97\xb7\x7f\xd8\xe5\x80\xa5\x36\x1e\xe8\x9a\x0f\x83\x16\xa4\xe4\x5b\x3f\x7c\xa6\xa7\xec\xca\x8e\x98\x39\xda\x33\xed\x47\xc7\xb9\x2e\x51\x46\xfe\x88\xa7\x15\x81\x77\xd9\xf3\x40\x99\xc6\x1c\x2f\x21\x3e\xbe\xfb\xe7\x98\x4e\xf5\x7e\x0b\x94\xed\x93\xd9\xd6\xca\x91\xad\xbe\x18\xc5\xc7\x9a\xfb\x0c\xf8\x8c\xe2\x63\xdd\x14\x1f\xdb\x46\x5c\x6a\x2e\x30\x76\x0c\xc8\x1c\x85\xc4\x60\x35\x3e\x3d\x8c\x8e\x42\x62\x5d\xae\x1b\x14\x12\x83\xb2\x03\x65\x67\x8c\x65\xc3\x76\x57\x77\xfa\x2a\x12\xb6\x9d\x11\xab\xb9\x10\xd8\x31\xc8\x65\x70\x65\x84\x0c\x76\xdc\x32\xd8\x80\x44\x1d\xdc\xc8\xe1\x93\x93\x76\x65\x3c\x2a\xd1\xa1\xd7\xd2\x5d\x7b\xf2\x0f\xbc\xe4\x45\xc1\x6b\x96\xaa\xee\xd9\x59\xa4\xd2\x54\x44\x05\xfb\xf3\xd5\x97\x52\xeb\x2b\x14\xb3\xaf\x7e\xbe\x80\x97\xfb\xbd\x95\x42\xfe\x2c\x8a\x9a\x20\xf2\xce\xb6\xbf\xc5\xb1\xb2\xb6\xb9\x7b\xdb\xfa\x2b\x27\xe8\x09\xee\x19\x37\x95\xbd\xee\x1b\xbb\x22\xbc\x4f\xe6\xde\x60\x83\xcf\x65\xc6\x65\x6a\x04\x8b\xd4\xe5\x63\xa2\x2c\x5b\x22\x5a\x14\x3e\xc9\xd8\x7c\xce\xd3\x15\xf7\xba\xaa\x04\x60\x7e\x4b\xd2\x59\x4e\x0a\x3f\x7d\xa4\xd2\x95\x47\x53\xfa\x0f\xb5\xb5\xc5\x3b\x3c\xa3\x1b\xa3\x77\x3b\x13\xfe\x0a\x84\xd9\x30\x3b\x20\x32\xcd\x7d\x1e\x14\x91\xb9\x29\x62\x91\xdb\x35\x9a\x2f\xc4\xaa\x9a\xa3\xdd\xa7\xb4\xac\x6f\x8d\x86\x61\xf5\x15\x51\x3a\x9d\xba\x53\xdf\xc6\xb3\x57\x77\x01\xa5\x61\xd9\x72\x45\xdb\xf7\x35\x2f\xe7\x26\xd3\x51\x37\x03\x20\x53\xdf\xff\xf3\xd0\x43\x1b\x8f\xaf\x0b\x9e\xc6\x3c\x8f\x99\x4c\xb3\x45\x51\x89\x32\x77\x3b\xd6\x8d\x82\xd4\x0d\xfd\x27\xff\xce\x1d\x06\x40\xa6\xfb\xee\xbf\x5a\x14\x1b\x16\x80\xb2\x70\x6e\x6f\x0b\x40\x2d\x8a\xbd\x0e\xc0\x97\x2f\xff\xcf\xba\xde\x73\x56\x14\xcb\xd2\x11\x37\x49\x94\x75\xfa\x6d\xec\xba\x4f\xae\x93\x71\xa3\x45\xb3\xe2\x2e\x57\x8b\xd9\x5d\xc8\x84\x64\x0f\xfb\x7c\x91\x52\x92\x19\x6d\xf3\x1b\x98\xc7\x4b\x5d\x79\xb2\xcb\x90\xf5\xa8\xf2\x7b\x91\xb3\x54\xc5\xc2\x7b\x8f\x3e\x79\x46\x07\xab\x6d\x2d\x2f\xdd\x7a\xa8\xdd\xbf\x7a\x8d\xd6\x75\x62\xe7\xf5\xa7\x9b\x0e\xe4\xce\x6b\xa5\x21\x78\x42\xf0\xec\x49\xf0\xdc\x55\x7b\xbb\x35\x07\x50\x3a\xab\xaa\x6f\x3b\x88\xae\xb0\x5c\xb6\x3a\xfd\x1a\xac\x96\x3d\x0b\x5b\x27\x6a\xab\x7c\x7e\x2a\xd6\xda\x29\xf7\xa8\xcc\xfc\xe0\xf6\x1e\x74\x98\xb1\xe9\x30\xe3\xf5\x2a\xeb\x2b\xa5\x89\xbb\x47\x6c\xc2\xc5\x1d\xb3\x9b\x3c\xdd\x0f\x63\x27\x83\xbe\x47\xeb\xe5\xa5\xc6\x21\x06\xd7\x78\xe1\xa8\x0e\x88\x6d\x6c\xdd\xd8\x83\xc6\x21\x6d\xd9\xda\x63\x12\xf0\xfb\x4d\xd7\xd0\x78\xd7\xf7\x25\xd4\x8b\x07\xe9\xbb\x05\xa9\x1e\x52\x3d\xa4\xfa\x7d\x4a\xf5\x57\x7e\xf3\x41\xac\x87\x58\x3f\x76\xb1\xde\xdf\x24\x2f\x92\xeb\x1b\x76\xc4\x58\x05\x7b\x97\xfd\xe0\xe1\xed\xad\x28\xf8\xdb\x49\xe8\x19\x04\xfc\xc3\x8c\xee\x00\x04\xfd\x17\x37\xfa\x20\x02\xff\x0b\x5b\x0d\xc1\x3f\x7c\x3d\x08\xfe\xd9\xd3\x9c\x1f\x41\xfc\x6f\x16\x0a\x6a\xf2\x3f\x4d\x44\x97\x4a\xc0\x37\x11\x1d\xc4\x2b\xcb\xbc\xf8\x85\x3e\x59\x57\xa6\xed\x00\x63\xa3\xd8\x3e\xfb\x00\x63\x66\x3d\xec\xdd\x1f\xeb\xbd\xf5\xb4\x22\x57\x04\xd2\x2d\xe7\xaa\x08\xfe\x57\x15\xb7\xac\x09\xe3\xf9\xec\x81\xf1\x3c\xe7\xcb\x09\xfb\xab\x2a\xfc\x07\x56\x0d\x33\x9a\x2c\xd3\x77\x22\x49\xb6\xf7\xb6\xa2\x57\xed\x53\x91\x79\x0f\xff\xb3\xe7\xfc\xcf\xd6\xae\x45\xa8\x78\xcd\x7d\x1e\x94\x8a\xf7\xd9\xb9\x13\xd5\x9d\xad\xac\x9d\x69\x2b\x67\xab\x91\x38\x9b\x35\xf7\xf7\x78\x9d\xcb\x9a\xfb\xeb\x94\xf8\x7d\x4c\xf0\x88\x9c\xc9\x48\x50\xeb\x68\xa6\x8f\xc3\xb1\x6b\x07\xd1\xf5\x89\x5b\x17\x64\x57\xc8\xae\x9d\xc8\xae\xbb\x2a\x7e\x89\x9a\xf5\xaa\xf7\x51\x26\xbb\x44\x05\xe8\xf2\xc2\x84\x76\x1f\xd4\xac\xcd\x76\x29\xc4\xb7\xe2\x32\x4b\xf8\xea\x7d\x72\xdc\x26\x33\x6c\xd1\xe3\x49\x26\x56\x8f\xef\x31\x97\x70\x50\xb0\x9c\x60\x92\xa8\x99\xde\x42\xb1\x1a\xb1\x4e\xf5\x93\x0a\x69\x7f\xcd\x49\xf2\x44\x30\xeb\x40\x22\x99\xd2\x2b\xf6\x2a\x8b\xc9\x54\x8b\x68\x91\x8b\x9b\x7b\x99\x7d\xf9\x70\xf3\xab\xc8\xe5\x74\xf9\x03\x8f\xee\x45\x1a\xaf\x0a\x67\x04\x67\x33\xe9\xaa\x05\x57\xf8\x79\xa4\xd2\xa9\xcc\x6d\xbe\x6d\x02\xe7\x54\x75\x71\x1a\x6a\x5e\x53\xb1\x60\x91\xbb\xda\x82\x41\x33\xbd\xf5\xaf\x21\x56\xe5\x2e\x36\x9b\xeb\x65\xc2\x6c\xa8\x00\x49\x82\x73\x7e\x6f\x15\xf9\xbf\x7c\xf9\x72\x7d\x13\xbe\xa8\x52\x76\x2b\x8a\x47\xe1\xa8\x57\xd9\x32\x9f\x11\x3a\x3c\xdf\xf5\xd1\x85\x1f\xd8\x4c\x31\xf5\x9f\x44\x3c\x35\x1d\x79\xa0\xee\x87\x39\xa6\xd2\xdb\xb6\x75\xb6\x58\x2f\x75\xc4\x28\xa0\x21\xbd\x78\x2e\x78\xc2\xcc\xfe\x4e\x44\x31\x61\x36\x29\xbd\xf0\x7f\x70\xdd\x9a\xca\xd9\xc2\x95\x0f\xae\xbc\x20\xbc\xfc\x4c\xb3\x2f\x1f\x6e\x58\x94\x0b\x2a\x9f\xcc\x13\x7d\x6e\x5e\x1a\x2b\x61\x0b\x38\x9b\xf6\xfa\xe8\x06\xdf\x71\x57\xfa\xb1\xfa\x76\xf3\xb2\x87\x45\x92\x8a\x9c\x40\x36\x65\xb0\x9f\xf3\x34\xa4\xce\x96\x71\x9c\xb8\x68\x8c\x7b\xf6\x9d\x98\xcc\x26\x8c\xa7\xee\xff\x9b\x11\x08\xb3\x29\xd3\x42\xe4\x91\xc8\x0a\x4f\xe3\x17\x3c\x29\x87\x23\x52\x73\xca\xa3\xd3\x34\x00\x6f\xb6\x5d\xf0\x9b\x56\xdf\x5e\xb7\xc1\xcf\x53\x9b\xb1\x9c\x6a\xa4\x87\x6a\xef\xb7\xcb\xc2\x57\x7a\xe7\x95\x94\xf2\x6e\xcd\xf8\xb2\x07\x54\x8d\x96\x17\xce\x37\xc1\x8a\x19\xa4\xbc\xf9\xf5\xc6\x97\x34\xae\xb1\xd4\x59\xc2\x97\x54\x46\x78\x9e\x51\x8e\x70\x4a\x63\xce\x12\x99\xd2\x9e\x48\xd4\x6c\x26\xbd\x7f\x42\xa5\x08\xbb\x4e\xe4\xec\xae\x48\x96\xb6\xf0\xb7\xd1\xfa\xfd\x1f\x4a\x57\x87\xba\x54\x43\xd5\x52\xb7\x9d\x0c\xfa\xd1\x0f\xa6\xcb\xcd\x43\xdf\x54\x70\xa0\x7b\x5b\x15\x0c\x54\xa3\x33\x50\x8d\xc5\x07\xa1\xad\x39\x86\x36\x5d\x96\x8b\x07\xa9\x16\x3a\xec\x6f\x11\x57\x64\x97\xa7\x62\xcf\x4e\x17\xbe\x7f\xc9\x5e\xcf\xba\x77\x2c\x17\x89\xad\xbc\x42\x61\x76\xcd\x95\x5c\xa2\x45\x9e\x53\xf1\x7a\xe9\xaf\xbb\x52\xf4\xbb\x53\x8f\x6e\x04\xea\x45\x58\x32\x73\x4b\xc6\x42\x97\x75\xe2\x39\x99\xac\x1e\xb9\x66\xba\xe0\x39\x55\xf3\x27\xf9\xd0\xfc\x9a\x69\x99\xba\xdc\x4c\xe6\x4b\xf4\x85\x60\xfa\x09\x85\xe3\x9f\xd6\x79\xf1\x85\x0f\x16\xc5\x22\x17\xe7\x2c\x55\xf6\x69\x4f\x7f\xf9\xc9\xdb\xf1\xd5\xd4\xbe\xcb\x55\x54\xa1\x23\xd4\xfc\xff\x2f\xa6\x89\xbe\x60\x45\x28\xea\xb2\xad\x01\xad\xf2\xe4\xbd\x1e\x9c\xcd\x77\x56\x42\x95\xd1\xc3\x5d\x65\xe4\x1f\x77\xb8\xd2\x28\xb9\xe9\xa3\x61\xad\xd5\xb2\x39\xb7\x9f\xf3\x5c\xd0\x17\xd2\xf2\x11\xe4\x24\x53\xad\xb7\x1d\x76\x81\x1f\xc7\xa6\x71\xdd\xd6\x18\xc7\x65\xf2\xc1\x34\x7d\xdf\x43\x68\x23\x9a\x79\x1c\x1b\x69\xe8\xf3\x4f\xef\xff\xe3\x3f\xfe\xe3\xff\x67\x3a\xe2\xfe\xf9\x57\x9e\x2a\x5a\xca\xba\xe0\xf3\x8c\x39\x29\xf8\x56\xcc\x64\x9a\x3a\x2f\x4e\xf1\x20\xf2\x65\xf5\x12\x0f\xd7\xff\xcb\x4d\x94\xfe\xc5\x5d\x9d\x10\xee\x5f\xff\xbb\xab\xa1\x26\x53\x79\x31\x55\xf9\x23\xcf\xe3\x83\x80\xfa\xca\xfb\x5f\xc8\xeb\xaf\x2b\x3d\x81\xe9\x73\x14\x76\x95\x7d\x98\x3e\xcd\xb2\xf8\xc9\x2e\x8b\xbd\xd3\xfb\x15\x49\xf8\xb9\xa6\x40\x36\x6e\xee\xf3\xa0\x64\xe3\x0f\x52\x17\x66\x4e\xcd\xc1\x65\xef\x01\x77\x7a\x7d\xf6\xd9\x81\x1f\x8d\xc8\xbc\xa0\x90\x80\xdf\xc4\xed\x8d\x8a\xee\x45\x73\xaf\x37\xc9\x91\xe6\xe9\x1d\xdd\x9c\xfe\x8a\x38\x04\xcc\xda\xfd\x78\x7f\xc2\xb4\x70\xbe\xe3\x7c\xf7\x7f\xee\xf0\x7c\xdf\x59\x70\xca\xd5\xb7\x65\xdf\x85\x69\xfd\xbe\xfa\xf1\xea\xc3\xd5\x97\xab\xfa\xce\x32\xef\xdf\x72\x4f\xd9\x42\xaf\xf5\x5d\x45\xdd\xc0\x7e\xc2\x7e\xf2\xfb\xc9\x2c\x88\x97\x49\x4a\xfb\x53\x1e\x76\xd8\x03\x4f\xd4\x06\x6c\x00\x6c\x80\x8e\x37\xc0\x9d\xe0\x71\x3f\x3b\xe0\x2f\x57\xef\x7e\x7c\xf1\x16\xf8\x8b\xe0\x31\xf6\x00\xf6\x40\xaf\x7b\x40\xb9\x5f\xf7\xb2\x0d\x3e\x5d\x7f\xf9\xf9\xd3\x5f\x6f\x5e\xbc\x13\x5c\x17\xb1\x19\xb0\x19\x7a\xdd\x0c\x1d\xd8\x8e\xd6\x36\x02\x56\xa3\xe6\x3e\x0f\xca\x6a\x74\xcd\x8b\x3b\x1f\xc4\xf3\xb7\xcf\x1f\x98\x69\xba\x39\xb4\x16\x5a\x04\x57\x68\x0f\xe8\xec\x41\xe6\x8e\x36\x6b\x44\xd9\x9e\xb2\x3e\x19\x9a\x43\x14\x05\xdc\xda\x7c\xf4\xee\xcb\xfb\xbf\xbc\xf8\x50\xa7\x1a\x59\x38\xd2\x71\xa4\xf7\x7b\xa4\xef\xd1\x88\xba\xcb\x26\x78\x62\x3e\xc5\x1e\xc0\x1e\xe8\x7a\x0f\x74\x5d\xde\x2b\x6c\x81\xbf\x75\xb0\x03\x16\xd8\x00\xd8\x00\xbd\x6c\x80\x57\xec\x05\xcc\xe0\xf2\x9f\x46\x38\xfb\xd7\x91\xa0\x83\xdf\x64\x71\x77\x5d\x17\x36\xb1\xb1\xb0\xb1\x4e\x0f\x21\x60\x23\x60\x23\xb0\xee\x37\xc2\x28\x51\x02\xf6\x02\xf6\x02\xeb\x7e\x2f\x8c\x1b\x29\x60\x53\x60\x53\xb0\x1e\x74\x70\xa0\x85\xd3\x46\x0b\x1e\x25\xd8\xd8\x4d\xad\x16\xf9\x6a\xdb\x9e\xeb\xd2\xd3\x4f\x00\x4a\x4e\x18\x94\xe0\xa2\xc2\x45\xc5\x7a\xb8\xa8\xc6\x08\x4c\xb0\x17\xb0\x17\x58\x0f\x7b\x61\x74\xe0\x04\x1b\x01\x1b\x81\x75\xb6\x11\x5e\xb1\xdd\x00\x8a\x2e\x78\xb1\xd0\xfd\x67\x16\xb3\xef\xe9\x28\xb9\xd8\x8d\x6d\x74\x8b\x8d\x73\xdc\x79\xc4\x5a\x17\x80\x32\xa3\x7c\x82\x5b\xf6\x78\xb2\x8c\x21\x03\xcc\xd8\x8d\x0a\x63\xc9\x00\xe3\xfe\xb5\x93\xd2\xbd\x7a\xda\x5e\xd0\x6f\xff\x6d\xf3\xc1\x3b\x17\xf9\x4c\xb4\xfa\xa6\x2e\x72\x5e\x88\x99\x8c\x2e\xda\xff\xc6\xfc\x7b\xe9\xbe\x49\x47\x7c\x9b\x1b\x2b\xe3\x79\x21\x79\x92\x2c\xd9\x22\x8b\x79\x21\x76\xbc\xbd\xe8\xad\xed\xae\xaf\x51\xd6\xcd\x99\xf3\xe8\x4e\xa6\x22\x5f\x4e\xb2\xfb\x99\xf9\x83\x9e\xcc\x45\xc1\xe9\xc2\xa1\x45\xd3\xee\xca\xd9\x7c\xd7\xa0\x5c\x5d\x75\xea\x9f\x1e\x02\x9b\x4b\xd6\x6d\x3e\x08\x36\x1f\x05\x5b\x4d\xd3\xe9\x14\xaf\xb3\x19\xeb\xa8\xbf\x36\xeb\xa1\x4b\x52\x60\x6e\x2d\x3a\x6d\x4a\x75\xf1\xbb\x35\x27\xd1\x1b\x76\xbb\x28\x98\x85\x6f\x3c\xa1\x5f\xa6\x2a\xbd\xb0\xbf\xa6\x6f\x30\x33\x6b\x9a\x7d\xf7\xdf\x5a\xa5\xb4\x97\xce\xd9\x47\x73\xe6\xb9\x7f\xdf\xf8\x93\xb0\xfc\xe3\x4a\x62\xc1\x76\x2b\x66\x6d\x65\xbd\xbd\xad\x9b\x9f\x54\x1e\x51\xca\xaa\x99\xb2\x69\x2d\xd9\xd7\xd7\x53\xf3\xb7\xaf\xaf\xd9\xbb\xda\x68\x4e\xd8\xcf\x85\x4b\x4c\xb9\xd0\x22\xf7\x1b\xf5\x82\x47\x34\x01\x94\x45\x32\x91\x36\x3b\x26\xf5\x4b\x33\xf5\xe8\xe6\x56\xd9\xad\x2a\x54\x96\x88\x09\xb3\xef\x9c\x26\x7c\x16\xd6\xd4\x22\xd5\xa2\x68\x9c\x88\xf0\xfa\x5d\x86\x57\xad\x92\x83\x67\x12\x13\x3d\x3b\xb0\x8d\xb7\x17\x94\x1f\x28\x3f\x0d\x05\xb0\xe8\x0a\x1e\xa2\xfa\xd3\xb5\xa9\x2e\x17\x59\xc2\xa3\x5d\xa5\x34\xf7\xeb\x23\x96\xd3\x76\xd8\x09\x90\xc9\x20\x93\x8d\x48\x26\x1b\x90\xe8\x83\x1b\x3a\x7c\xd2\xc7\x0d\x7d\xd8\xb2\xff\xa7\x2a\x4a\x2c\x86\x64\x47\x7d\xc5\xb6\x42\x1d\x85\x98\x67\x89\xb9\x9e\xfa\x8e\x0f\xb1\xcf\x64\x91\x4a\x12\x11\xca\x2b\x5f\xab\xf8\x8b\x6b\xc0\x06\x19\xc4\xfe\xd4\x8a\x20\xef\xc3\xef\x6b\xc2\x48\xd3\x53\xfa\x15\x47\x7a\x31\x0c\xd9\xa8\x17\x8f\xb8\xba\x10\x46\x7c\x01\x0e\x99\x2e\x84\xd3\xa9\xbd\xd4\x71\x2b\x98\x51\xeb\x28\x7d\x60\x2e\x8a\x5c\x0a\x2a\x4f\x40\x39\xe2\xad\x38\xa1\x57\x53\xd6\x4f\xd8\x8d\x4b\xb9\x5c\xcd\xa7\xec\xd2\xd9\xbb\x9b\xe9\x9c\x45\x89\x14\x69\x61\xf3\xd6\xd3\xa5\xb6\xd0\x22\x24\xfe\xa5\x86\xd8\x9f\xd2\xc3\x79\x99\x28\x9b\x6e\x24\x2f\xc9\xd0\xe5\x2b\xa9\xa0\x41\xc4\x13\xf7\x59\x39\xa5\xec\x3b\xf1\x8d\x4a\x0c\x78\x27\x2d\xfb\x48\x35\x0d\x2f\x79\x13\xca\x38\xb8\xf6\xd9\x84\xf8\x64\x60\xe7\xab\x4d\xa9\x96\x4b\x08\xb2\xd6\xc4\x57\x63\x28\x85\xe5\xd5\x9f\x69\x9b\x3d\x3a\x35\x32\x84\x15\xd7\x1e\xef\x04\x49\x59\xf1\x42\xd8\xea\x5a\x99\xb4\x6b\x99\x7d\x37\x13\xa9\xc8\xc9\x70\x3a\xa5\xdc\xd9\x8a\x4d\xe5\xb4\x10\x22\x65\x73\x99\x2e\x0a\xa1\xdf\x18\xf9\x80\x87\x8a\x0f\xf6\x67\x56\xae\x60\x2a\xad\xf4\xe5\xbc\xda\x2f\x2f\xff\x65\x2a\x75\x32\x0b\x67\xff\xf9\xf6\xdf\xd9\x67\xe7\x9c\x77\x65\x9a\x20\x7c\xc1\xbf\x42\xcd\x6c\x03\xdd\x37\x43\x8f\x0a\x75\x2f\xd2\xd0\x65\x3b\x87\x2c\x15\x22\xd6\xf6\x5b\x24\x9a\xa6\x05\x4b\xa4\x2e\xa8\xbe\x04\x49\x37\xb9\xb0\x69\xb7\x8b\x3b\x21\x73\xfa\x8c\x1e\xac\x16\x45\x7d\xc6\x49\xa0\x98\xb0\x4f\xe6\xd5\x8f\x52\x8b\xf3\xea\x5b\xcc\xcc\x68\x91\xc6\x8c\xa7\xd6\x16\x41\xcf\xf1\x8e\x76\x41\x0c\xa3\x16\xba\x42\x1a\x55\xf1\xcc\x74\x96\x3a\xf7\xec\xb0\xd0\x73\xa9\xc1\xb5\x12\x14\xa9\xf8\x56\xb0\x7b\xb1\x3c\x27\xcb\x53\xf8\x33\x9d\x8b\x05\xd3\x29\xcf\xf4\x9d\x2a\xce\x5d\x02\x73\xca\x20\x5e\x19\x90\xf0\xfd\xb0\x90\x5d\xf3\xed\x16\xba\x60\x96\xea\xf8\x02\x75\xb9\x4b\x88\x6d\x76\x8a\xd5\x06\x28\xa9\xb9\xd9\x3f\x66\xf3\xc7\x8c\x4f\x0b\x61\xd7\xf4\x54\xe6\xba\x58\x1d\x0c\x2b\x75\xcb\x34\x4a\x16\xb1\x88\x7d\x32\x73\x2f\xb6\x90\x8c\x68\x16\xa4\xf9\xaf\x9d\x94\x7b\xb1\xb4\x69\xb9\xcb\x07\x7f\x7d\xed\xbb\xfc\xf5\xf5\xe4\x6b\xfa\x35\xad\x5b\xed\x28\xaf\xf7\x22\xcb\x54\x5e\xf8\xfc\xa2\x8f\x64\xee\x91\xda\x96\x08\x64\xef\x2b\x5b\xdc\x2e\x00\xee\xbe\x52\x19\x3d\x3b\x08\xb4\x06\x7f\xb5\xb7\x96\xdb\x36\x3e\xc3\xba\x11\x62\x2b\x33\x66\xf5\x94\x82\xcd\xa5\xd6\x8c\xa7\xcb\xba\xb2\xb4\x8b\x18\xeb\x97\xdf\x61\x34\x0c\x28\x82\xad\x27\xea\x90\x8a\xe0\x3b\xa6\x85\x91\x29\xe8\x70\xa4\x03\x2d\x97\xae\x98\x66\xe2\x92\xef\x86\x05\xeb\xb7\xb2\x5d\xb8\x32\x77\xb6\xd4\x7a\xa6\x76\xca\xe7\x5e\xdc\xc9\x74\xb6\xb3\xea\x75\xe3\x5a\x74\x98\x11\x31\x42\x43\xec\xef\x9f\xe6\xea\x0e\x8e\x54\x97\xa2\x84\x3b\xbd\x68\xe9\x54\x54\xdf\x54\xa5\x17\xa9\x98\xd9\x6a\x11\x2e\x95\x70\x55\x45\xfe\x87\xc8\x55\x65\x6b\x38\x29\x51\xce\xe7\x22\x36\x4a\x78\xb2\x6c\xa8\xdf\x90\xca\xc4\x9e\xf4\xb1\x1d\x74\x36\xcb\x79\x44\xbb\x46\xaa\xb2\xd2\x67\x79\x69\x9b\x41\x0b\xab\x74\xa1\xc5\x4a\xa5\x2d\x6e\x7e\xe9\x3b\xe4\x5e\xb2\x52\xdb\x60\x62\xdb\x69\xed\xeb\x0d\x6d\xdc\x61\x9a\xa9\xcd\xd7\xd4\xe4\xa6\xda\x0f\xcf\x24\x60\x1e\xca\xf2\x4f\xf8\xad\x48\x3a\x5d\xfe\xf4\xc4\xc3\x2e\x7f\xaa\x63\x64\x4d\x42\x73\xfe\x4d\xce\x17\xf3\x4a\x79\x8c\x60\x1f\xb0\xa3\x45\xa5\x5e\x08\x6e\xd9\xd1\xb2\xa5\x65\x7f\x9e\x5a\x31\x5a\x9a\xb6\x30\xf1\x8d\x44\xa6\x55\xd9\xc4\x08\xdf\xe6\x6f\x7f\xf7\xb7\xd4\xdf\xdd\x0d\xec\x44\x3d\x7a\x9e\xd1\x0c\xa8\x6c\x16\x2d\x54\xbb\x3a\xe9\xfe\x88\x78\xea\x97\x73\x29\x09\x69\x4e\xe5\x58\x64\x21\x83\xc8\x6c\x5b\x69\x84\x7b\x51\xca\x3a\xe6\xd5\xb6\x2f\x66\xd2\x26\xec\x46\x14\x24\x11\x71\x5b\xf8\xa9\x5a\x3b\x6a\x2a\x1e\x49\x68\xe0\x69\xf5\x86\x30\x62\xca\x5c\x2d\x52\x7a\x8c\xed\xe5\x77\x8b\xcc\xbc\xcc\x6e\x68\xf3\x97\x37\x5e\x36\x11\x0f\x46\x4c\xe2\x74\x39\xf9\x5f\xfb\x95\x64\xe4\x92\xa9\x4c\x0a\x61\x24\x54\x23\x35\x9a\x3b\xca\x2b\x10\xee\x74\xa9\xe9\x10\xf6\x3e\x8d\x44\xb5\x98\x48\x29\x61\x9a\x16\xc4\xc2\x56\xdc\x11\x41\x16\xaf\xa9\x34\x24\x09\x3d\x70\x99\xf0\xdb\x44\x98\xae\x9b\x19\xb1\x92\x4c\x74\xa7\x94\x16\xb4\xf5\x0b\xe5\x25\x20\x37\x17\x66\x58\x78\x3e\x5b\xcc\xa9\x2f\x24\x52\x52\x87\x68\x90\x4c\xdf\x5c\x7b\xc2\xa3\xcb\xd1\xfd\x79\xca\xc2\x92\x2a\x4f\x25\xaf\x9d\xac\x74\x40\x6a\x26\xe6\x59\xb1\xac\xab\x51\x5c\x1b\xe5\xdb\xce\x7c\xaa\x36\x76\x68\x93\x28\x27\xa7\x2b\x82\x9c\x95\xfd\xc2\xba\x9c\x2d\x78\xce\xd3\x42\x54\x0b\xf6\xf9\x99\x0a\x87\x40\x25\xdf\x7c\x68\x7b\x10\x4b\x83\xc2\x56\x28\x26\xb5\x5e\xd8\x55\x65\xbe\x9c\x88\x72\x87\x04\x1d\xc1\x2f\xb8\x0b\x6f\x53\xa5\x72\x3c\xfe\x95\xdb\xc9\xc9\x5e\x44\x36\xf2\xb9\xd6\x0b\x11\x37\x0a\xcb\x46\xae\xd4\x8b\x5b\x6d\xbe\x9c\x16\xa1\x07\x71\x85\xa4\xd2\x08\x9a\xb9\x52\x73\x41\x05\x54\x58\x2e\xa6\x22\x77\x15\xf8\xf8\x8a\x3e\x54\xaa\x07\x66\x46\x45\xaa\x17\x79\x59\x8c\xda\x29\x38\xde\x60\x6c\x47\xcd\x76\x99\x36\x26\xa9\x32\x4c\xcf\x79\x92\x88\x9c\x45\x77\x8b\xf4\x9e\x10\x0d\x67\xb6\x26\x0c\xcf\x67\x7e\xa2\x69\xc7\xdb\xc7\x9b\x4e\x1b\x8d\x89\x0a\x5c\xb3\x4c\x69\x2d\xcd\x82\x73\xc3\x46\x0b\xae\xba\xbf\xac\x9b\x4e\x6c\xae\x74\x3b\x1d\xf4\x1e\xaa\xf2\xa6\xed\x1c\x3b\xa3\x92\x5f\xc3\xee\x2e\xa4\x56\x3f\x72\xed\x65\x58\x5f\xbc\x86\x0a\x33\x3d\xd1\x4f\xac\xd6\xce\xa9\xac\x78\xb4\x48\xe8\x8d\xb2\x5c\x36\x3b\xdd\x05\x66\xa0\x0e\x74\x2d\xfe\x28\xb2\x5c\x50\xed\xf0\x3f\xb2\x2c\x11\x5c\x8b\x70\x04\x5d\xe7\x2a\xe3\x33\x92\x8e\xae\x55\x22\xa3\xe5\xb9\x15\x50\xec\xa6\xf3\x8b\x2e\x0e\x0f\x30\xcb\xee\xed\xe4\xbf\x26\xec\xc6\x9e\x67\x56\x74\xc9\x44\x6a\x36\x4b\x79\xa7\x0a\xa6\xf2\xec\x8e\x87\x9a\x55\xf9\x42\x5c\x52\xd1\x9f\x73\xa7\xb3\xd9\x8f\xbf\xbe\xb6\x55\xff\xe4\x3f\xfc\x45\x72\x2b\x18\x8f\x63\x5a\x9d\x97\xb9\x98\x2b\xa3\x1c\x07\x35\xcc\x3e\xfe\x4c\x97\x3f\xb2\xfa\xe9\x84\x5d\x49\x3a\x1c\x2b\x4d\x57\xf9\xd3\xbe\x85\xf2\x56\xa2\xb0\xea\x31\xe9\x28\xaa\xb8\xdb\x65\x42\x6d\x0f\x7e\xf4\x7d\x5f\x2b\xf2\xec\x44\xff\xb7\x52\xcc\xa8\xeb\x66\xc3\xde\xa9\x47\x36\xe3\xf9\x2d\x9f\xd5\x8c\x93\x41\xa9\x11\xf9\x54\xe5\x73\x33\x27\x8d\xe3\xf5\x69\xa5\x47\xeb\x87\x8b\x84\x5e\x2f\xb1\x66\x76\x6c\xa5\x91\x26\x23\x19\x97\xaa\x30\xc9\x0a\xd6\x49\xc3\xcf\xb1\xb9\xac\x7d\x0d\x4e\x27\x0d\x4c\x2a\x93\xe9\xef\x11\xaf\x6a\x5f\xb8\x2b\x26\x5a\x79\xd9\x84\xbd\x8b\x22\x91\x59\xa8\x54\xd5\xec\xce\x6c\x1f\xce\xd8\x85\x5b\x80\xf5\x05\xaa\xbf\x67\x67\x3f\xf0\xe8\x7e\x96\xab\x45\x1a\x9b\x6f\xf1\x50\xc7\x76\x65\xe0\xac\x08\xe9\xe4\xe3\xfa\x43\x7c\x0f\x6e\xc3\x93\xbe\x67\x67\x3f\xa9\x5c\x54\x1e\xcb\x22\xae\x23\x1e\x9b\xde\xbb\xf1\xa1\x13\xc8\x3e\x4f\x5b\xd5\xf3\xc9\x03\xa7\xe1\x19\xbb\x2c\xc8\x6c\x75\xb9\x1f\x46\xe2\x5c\x35\x93\x68\x51\xf8\x5b\xa6\xc8\xb9\x34\xa7\x44\xca\x1e\xcd\x60\xf8\x6f\xfa\x23\xdb\x7c\xcd\x5f\x7c\x61\xe9\xe5\xfe\x04\x30\xe2\x8d\x08\x9c\xb0\xc2\xc0\xa4\xba\x8c\x55\xa4\x2f\xe9\x62\x33\xe2\xd4\x25\x5d\x4d\x17\x3c\x93\x97\x3c\x93\x17\x91\x4a\xcd\x5a\xd1\x97\xbf\x0b\xcb\x2a\xbc\x70\x4a\x77\x70\xc1\x65\xa2\x49\x7e\xa8\xca\xfe\xe4\x29\xb4\xc3\x3c\xac\x0c\xc0\x20\x66\xe1\x23\x49\x4a\x41\x9a\xd4\x74\x54\xac\xce\x94\xd1\x12\xb2\x2c\x91\x56\x36\x08\x02\x8e\xf5\xc7\x92\x9a\xdd\xc9\xd9\x1d\xb9\x69\x45\x6a\x3e\x37\x4b\x37\xb6\x8b\xba\xf1\x5d\xce\x22\x6f\x06\xb8\x7c\x92\x91\xb7\x72\xd1\xf4\x62\xf3\xdd\x71\xce\xef\xc7\x15\xef\x9b\x3d\x4e\xf2\x17\x39\x17\x46\xf2\xf4\x66\x02\x33\xd0\x97\x56\x28\xb6\xba\x1b\x49\x7f\x24\x79\xd8\xa8\xf0\x60\x08\xf1\x0a\x07\x4f\x92\x73\x96\x8b\x19\xcf\x63\x02\xfb\x46\x5c\x4b\x97\x8c\x47\x85\x7c\xa0\xba\xd5\x39\x93\xa9\xff\x7f\xbb\x1c\x4a\x85\x6d\x62\x1f\x66\x81\x46\x52\x07\xfe\xbe\x25\xa6\x73\xae\x4f\x27\xc8\xba\xed\x5d\x5c\xca\x49\xbd\x82\xef\x06\xa8\x7b\xd0\x9c\x6e\xd6\x1c\x96\x3b\x15\xda\xcb\xed\x6a\xca\x4c\x9b\x5b\xb2\x6c\xf3\x8c\x06\x67\xba\x97\xf0\xeb\x95\x56\x92\x74\xf6\x9b\x69\xe2\x0f\x4a\xdd\xcf\x79\x7e\xaf\x4b\x9f\x6b\xdb\x74\x32\xc8\x68\x67\x36\x5a\x66\x46\xb7\xf8\xe1\xd3\xa7\x5f\x3e\xbe\xfb\xfc\xcb\xd7\xd7\xa5\x49\xc4\x4a\x5f\xca\xd6\x74\x9f\x67\x89\x20\xdb\xc7\x6d\x78\xaa\x91\x37\xe4\x2c\xb5\x26\x61\x23\x14\x27\x7c\x46\xe2\x68\xf9\x15\xaa\x06\x5b\x51\x1d\x43\xc1\xfa\x58\xea\x28\x17\xa6\xcd\x25\x4c\xaa\x40\x10\x67\xef\xa8\x3f\x28\x58\x20\x8c\x6a\x6d\xd4\x78\x2f\xe8\x52\xc1\xf9\x07\x9e\x9c\xb3\x54\x59\xce\x4b\x0a\x72\x30\x9a\xac\xda\xdd\x88\x34\x2e\x99\xef\xb3\x33\x50\x05\xf5\x58\x0b\xad\xa9\x61\xde\xf2\xec\xec\x28\x0e\x71\xd5\xb4\x3d\xf3\x29\x0d\x41\x1c\xd0\xe9\x54\xf0\xc2\x28\xe9\x33\x5e\x08\xb6\x32\x11\xee\x49\x22\x35\x52\xb8\xb5\x47\xf8\x2a\xfe\xeb\x1e\xbb\xc3\x05\xd2\xb0\x04\x0e\xa4\x69\xc1\xfd\x00\xee\x07\x70\x3f\x80\xfb\x01\xdc\x0f\x9a\x0e\x5f\x70\xed\x11\x8d\x08\x50\x27\x50\x27\x50\x27\x50\x27\x50\x27\x50\xe7\x71\xa1\x4e\xd0\x07\xd0\x07\xd0\x07\xd0\x87\xde\xe9\xc3\x16\x84\xde\x2a\x73\x2a\xf7\x61\x95\x3e\xe3\xb0\xfd\xde\x2d\x5d\x62\x76\x52\x2d\x01\x77\xd2\x49\x71\x27\xe6\xf6\xda\xd2\x45\x2e\xf8\x9c\x86\x27\x8e\xcf\xdd\xc5\x70\xee\xbe\x3b\x57\x0f\x24\xfb\x54\xd4\x3b\x76\x43\xe2\xca\x72\x75\xa9\xef\x32\x84\x8f\x9b\x16\xd8\xf8\x33\x1b\xac\xfd\x81\x79\xd9\xf7\x76\xe0\xff\xf4\x74\x0c\xda\x3c\xbb\xfe\xeb\x61\x03\xa2\x6a\xdc\xa3\xb7\xdf\x7f\x90\xba\x38\x45\x2e\x64\xce\xb1\x21\xb3\xa0\x1d\x92\xca\x21\x17\xdb\xe8\x72\xb1\x75\x9f\xf1\x99\xb4\x32\xc6\x5b\xc2\x3d\xfb\xf5\x8e\xf1\xde\x70\xb3\x65\x84\x5e\xb5\x3b\xf0\x10\x2c\x75\x04\xc1\x52\xc8\x9a\x81\xac\x19\x0d\x8d\x19\xb4\x50\x36\x9a\xec\x19\xdb\x37\xf8\xf7\xcf\x36\xd8\x3a\xfd\x0e\xa5\xc5\xc7\x24\xf3\x92\xb8\x31\x3c\x99\xf7\x15\xdb\x2d\x01\x88\xcb\x79\xbe\xa7\x3c\x20\x6d\x45\xaa\x6a\xee\x0f\x64\xfc\x68\xec\x0d\x04\xa9\x31\x0a\x52\x88\xb1\x3e\xa1\x18\x6b\x04\x93\x21\x98\x0c\xc1\x64\x08\x26\x83\x0e\xb8\x6e\x17\x0d\x47\x07\x84\x4a\x75\xe8\xf0\x92\x01\x2a\x55\xc1\xc6\xdc\x4f\xfd\xa7\x62\x35\x23\x73\x0b\xcd\x68\x4d\xf5\xa7\x0e\x23\x49\x2a\x12\x86\xf8\x46\xfe\x61\xb7\xe6\x5f\x3c\x2a\x26\x8c\x5d\x99\xff\xfa\xbf\xcf\xb9\x24\x03\x9c\x66\x51\xb2\xd0\x85\xc8\xcb\x7b\xc3\x25\x9b\x4f\xe4\xbd\x60\x67\xa1\xa5\x67\x46\x3c\xf4\x22\xcd\x84\x5d\x27\x3c\x4d\x5d\x95\x00\x12\x3a\x78\x62\xe5\x9c\xb7\x7f\xd8\xe5\x20\xa6\x36\x1e\x48\x1c\x08\x83\x16\xa4\xe9\x5b\x3f\x7c\xa6\xa7\xec\xca\x8e\x98\xb9\x02\x32\xed\x47\xc7\xb9\x50\x51\xe6\xfe\x88\xa7\x15\xc1\x78\xd9\xf3\x40\x99\xc6\x1c\x2f\xa9\x3e\xde\x7b\xea\x98\x4e\xfd\xbe\x0b\x91\xed\x9f\x1d\xaf\x14\x24\x6b\x6e\x00\x0a\x93\x35\xf7\x19\x30\x1c\x85\xc9\xba\x29\x4c\xb6\x8b\x58\xb5\xae\x2c\xd9\xf1\x20\x7c\x14\x26\x83\x15\xfa\xf4\x70\x3e\x0a\x93\x75\xb9\x6e\x50\x98\x0c\x4a\x11\x94\xa2\xa6\x81\x1c\x4f\x81\xb2\x97\xaa\x45\x7d\x15\x2a\xdb\xcd\x18\xb6\xae\x4c\xd9\xf1\xc8\x6d\x70\xbd\x84\xac\x76\x1a\xb2\xda\x80\x44\x22\xdc\xdc\xe1\x13\xb8\x5e\x56\x9e\x7d\x54\xa2\x46\xcf\x05\xcc\xfa\xf7\x63\x34\xd7\xbf\xdb\x3c\xe6\x3c\xca\x55\x92\xd8\xcb\x7d\xff\x25\xcd\x3e\x97\x4d\x79\x1f\x9a\xd2\xd2\xc1\xb1\xa9\xb8\xd9\xb3\xcf\x83\xd3\x23\xf2\x8c\x21\xcf\x18\xf2\x8c\x21\xcf\x18\xf2\x8c\x1d\x44\x2f\x81\xfa\xd8\x7a\xa2\x50\xe6\x6c\x48\xe9\xe0\xe0\x82\x7f\x42\x2e\xf8\xc8\xfd\x87\xdc\x7f\xc8\xfd\x87\xdc\x7f\xc8\xfd\x87\xdc\x7f\xc8\xfd\x87\xc8\x34\x44\xa6\x21\x32\x0d\x91\x69\xab\x2b\x12\x65\xce\x90\x68\x14\x89\x46\x91\x68\x74\xe4\x89\x46\x1b\xe9\x1d\xa8\x3d\xca\x9c\xad\xfe\xe0\xe0\x65\xce\x9e\xc3\xbb\x03\x2e\x78\xb6\x2d\xe9\x6e\x2a\x7d\xd6\x19\xdd\x46\x11\x34\x14\x41\xb3\x1f\xa1\x08\x1a\x9c\x13\xe0\x9c\x00\xe7\x04\x38\x27\xc0\x39\x01\xd4\x1b\x20\xf4\xf9\x11\x01\x08\x05\x08\x05\x08\x05\x08\x05\x08\x3d\x61\x10\x0a\x36\x01\x36\x01\x36\x01\x36\x81\x22\x68\x28\x82\x86\x22\x68\xe1\x93\xd6\x31\x94\x8d\x96\x7c\x94\x43\x6b\xf8\xda\xa0\x98\x11\x0a\xa3\x9d\x42\x2e\xb8\xfe\x0a\xa3\x6d\x0b\x01\x9b\x4b\xa4\x1d\x38\xc8\xb5\xf7\x8c\x1d\xcd\xfd\x6b\x77\x30\x22\xf8\xea\x08\x82\xaf\x90\xbb\x03\xb9\x3b\x1a\x1a\x33\x12\x31\x6e\x1c\x59\x3c\x5e\xd8\xf4\x83\xe6\xfd\x7f\x51\xdb\x8f\x49\x72\xee\xb7\xa8\x5a\x07\x92\xf3\x2b\xf6\xd2\xb4\x24\xfb\x2e\xb4\xf6\x92\x8c\x24\x83\x11\xd1\x46\x92\x87\x04\xe2\x58\x75\x92\x07\x2b\x8e\x21\xf2\xfb\x84\x22\xbf\x11\xe2\x86\x10\x37\x84\xb8\x21\xc4\x0d\x9a\xe4\xba\x5d\x34\xc8\x78\x92\xc3\x68\x64\x08\x87\x39\x40\x59\xb6\x41\x07\xc1\x34\x14\x68\xdb\x56\xa3\x6a\x2a\xd5\xd6\x57\xe4\x0b\x8a\xb6\x85\xb5\xd1\x5e\x8c\x40\xd1\x36\xf7\x3f\xdc\x6f\x30\xd9\x0d\xaa\x7c\xdb\x81\x59\x77\xb5\x90\x5b\x8b\xa6\xa0\xa4\x5b\x73\x9f\x81\xf1\x51\xd2\xad\x8f\x92\x6e\xdb\x0a\x62\x8d\xc5\xdd\x8e\xd4\xf9\x00\x65\xde\x60\xef\x3e\x3d\xf7\x03\x94\x79\xeb\x72\xdd\xa0\xcc\x1b\xd4\x28\xa8\x51\x47\x51\xf0\xad\x53\x45\x6a\x3f\xa5\xdf\xb6\x37\xb3\x35\x16\x81\x3b\x52\xf9\x0e\xce\xa5\x90\xee\x4e\x4d\xba\x1b\x90\x10\x85\xbb\x3e\x7c\x02\xe7\xd2\x67\x9a\x7e\x54\x62\x4a\x9f\xc5\xe2\x86\xe4\x9f\x79\xa9\x23\x9e\x54\x7d\x32\x7b\x42\x8b\xf4\x1a\x7f\x7f\xed\x81\x31\xde\x50\xb7\x70\x68\x3d\xb7\xf3\xf9\xa2\x50\x66\x6e\x64\x3a\x23\xfa\x4f\xc3\x76\x82\x1b\xbe\x23\xbc\x53\x19\xce\xe6\xbd\xbf\xba\x2e\xf7\x48\x76\x1a\x5e\x0d\x92\xd3\xdc\x67\x90\x1c\x90\x9c\x6e\x48\x4e\x47\xf7\x5e\x7b\xa4\xf3\xf4\xe2\x1b\xa5\xde\x0f\xae\x03\xcd\xff\xf4\x34\x7f\x70\x9d\x2e\xd7\x0d\xb8\x0e\x6c\x3d\x50\x9b\x7a\x55\x9b\x3a\xc3\x39\xfd\x2a\x4e\x7d\x91\x9c\xce\xac\x1a\xed\x91\xce\x91\xc8\x77\x2f\xd9\x41\x10\xea\x20\xd4\x8d\x48\xa8\x1b\x90\xec\x84\x2b\x3e\x7c\xd2\xeb\x15\x7f\x18\x8a\x03\xa1\xa4\x53\x78\xd3\x87\x48\xf2\x8a\x75\xc6\x6d\x6c\x9c\x5e\xff\xe0\x86\xde\xb3\x4f\x72\x63\x3b\x86\x03\x0a\xd0\x16\x21\x3a\x08\xd1\x01\xd8\x01\xd8\x19\x24\xd8\xe9\xe8\x5e\xdc\x82\xec\x3c\xbd\x18\x47\xa9\xfa\x03\xed\xc0\x0a\x70\x7a\x56\x00\xa0\x9d\x2e\xd7\x0d\xd0\x0e\xec\x3e\x50\xab\x46\xc6\x78\x46\x1c\xb2\xd3\x9d\x15\x64\x0b\xd2\x73\x24\xf2\x1e\x42\x78\x20\xed\x9d\x9a\xb4\x37\x20\xa1\x0a\x77\x7f\xf8\x04\x21\x3c\xcf\x34\xfd\xa8\xc4\x96\xa3\x0a\xe1\xb1\xb9\x52\xff\x6f\xa1\x0a\xae\xf7\x94\x53\xbd\x92\x5d\x56\x4d\x43\x8d\xf7\xff\x31\x4d\xd8\x20\xe1\x54\xf3\xaa\xbf\x0f\x4f\xa8\x8a\x3a\x6b\x9e\x83\xcc\xea\x2e\x65\x77\x28\x3f\x6b\x35\xfd\x4a\x72\x6e\xa3\x6c\x52\x9d\x5a\x57\xfb\xd8\xdc\x84\xb5\xa2\xb9\x21\x8b\xb2\xad\x7c\x3b\x61\x37\x32\xa5\x80\xf3\x6a\xde\x6d\x57\x15\xd7\xdd\x6a\xf5\x8a\xbc\xb5\xa2\xc4\xa1\x21\xf6\xa7\xf4\x70\x5e\xd6\x9e\xb7\x95\x98\x7d\x89\x54\x73\x71\x97\x75\x72\xed\x67\xe5\x94\xb2\xef\xc4\xb7\x48\x64\x65\x35\x44\xfb\x48\x35\x0d\x2f\x79\x13\x12\x03\xbb\xf6\xd9\x6a\xcd\x84\x06\xf8\x6a\x53\x64\xc1\x62\x25\x6c\x1d\xe0\x20\xa7\xb9\x14\xe3\x55\xf1\x7c\xf5\x67\xe6\x17\x74\xfd\x8b\x9c\x59\x51\xcf\x17\x53\x8e\x17\x82\xaa\x7c\x7f\xcb\xa4\x4b\x98\xfe\xdd\x4c\xa4\x22\x27\x93\xef\xd4\xc8\x7c\x85\x62\x53\x39\x2d\x84\x48\xd9\x5c\xa6\x8b\x42\xe8\x37\x8c\x2a\x64\x47\x2a\x9d\xca\x99\xcf\xb3\x6e\x65\x12\x5f\xed\xda\xf6\xe5\x69\x95\x6c\x7b\xe5\x39\x79\x87\xb3\xff\x7c\xfb\xef\x61\x83\x5d\x99\x26\x88\xd8\x49\x94\x85\x9a\xd9\x06\xba\x6f\x86\x1e\x15\xea\x5e\xa4\xa1\xcb\xae\x22\x6f\x2a\x44\xbc\x52\xc8\x37\xa1\x2a\xdd\xb2\xb0\x92\x51\x2e\x6c\x0d\x7d\x57\xe7\x5c\xea\x22\x14\x2d\x7e\x5a\xb5\x79\xc2\x3e\x99\x57\x3f\x4a\x9f\xd2\xdb\xbd\x85\x4a\xf1\x8b\x34\x66\x3c\xb5\x16\x12\x57\x2b\xd7\x16\x87\x0d\x22\x1c\xb5\xd0\x57\x03\xae\x88\x76\xa6\xb3\xd4\xb9\x67\x87\x85\x9e\x4b\x0d\x26\xeb\x8c\x5f\xdc\x54\xec\xfb\x5e\x2c\x6d\xc2\xea\xf0\xe7\xc4\x88\xfc\xd5\xca\xc5\x8f\x77\xd2\x16\x85\x96\x69\x65\x40\xc2\xf7\xc3\x42\xae\x94\xfa\xd5\xec\x22\x24\x38\xb7\x99\x2f\x73\xb1\x65\xc1\xe6\x95\xc1\x78\x5a\xab\xd9\x25\xbf\x26\x91\x87\xe4\x4b\xb3\x20\xcd\x7f\xed\xa4\xdc\x8b\xa5\xab\x7e\x1d\x1e\xfc\xf5\xb5\xef\xf2\xd7\xd7\xae\xb8\xf5\xfa\x6a\xd8\x74\x40\xd4\xeb\x61\xb3\xf7\x95\x2d\x6e\x17\x00\x77\x5f\xa9\x8c\x9e\x7e\x52\x2c\xd6\x6d\x9b\x50\x23\xdb\xe5\xfc\x76\x33\x66\x75\x9c\x82\xcd\xa5\xd6\x54\x98\xb4\xa6\x68\xed\x22\x02\xfb\xe5\x77\x18\xed\x04\x4a\x64\xeb\x89\x3a\xa4\x12\xf9\x8e\x69\x51\x26\x6f\x37\x07\x5a\x2e\xa3\x22\x94\xd8\x35\x63\x13\x16\x6c\xa8\x55\xb0\x74\x9b\xcb\x5a\x78\xeb\x85\x23\xc4\x83\xc8\x97\xc5\x9d\x4c\x67\x3b\xab\x6d\x37\xae\x45\x87\x19\x11\xd4\xf9\x38\xa1\x3a\x1f\x2f\x5a\xfe\x09\xbf\x15\x49\xa7\xcb\x9f\x9e\x78\xd8\xe5\x4f\x25\xb4\xad\x39\x69\xce\xbf\xc9\xf9\x62\xce\xd2\xc5\xfc\xd6\x2c\x92\x69\x38\x4c\xb5\x1d\x2d\xaa\x1c\x4d\xc8\xad\x2c\x7c\x4e\x4b\x96\xc4\x68\x69\xda\x62\x4b\x5a\x3c\x95\x4d\x8c\xf0\x6d\xfe\xf6\x77\x7f\x4b\xfd\xdd\x57\xd5\x48\xcb\xd1\xf7\x05\x2f\xec\x42\xb5\xab\x93\xee\x8f\x88\xa7\x7e\x39\x97\x92\x90\xe6\x73\xb3\xcb\x64\x21\x83\xc8\x6c\x5b\x69\x84\x7b\x51\xca\x3a\xe6\xd5\xb6\x2f\x66\xd2\x26\xec\x46\x14\x24\x11\x71\x5b\x3e\xdc\x89\xca\xb6\x6f\xe2\x91\x84\x06\x9e\x56\x6f\x08\x23\xa6\xcc\xd5\x22\xa5\xc7\xd8\x5e\x7e\xb7\xc8\xcc\xcb\xec\x86\x36\x7f\x79\xe3\x65\x13\xf1\x60\xc4\x24\x4e\x97\x93\xff\xb5\x5f\x49\x46\x2e\x99\xca\xa4\x10\x46\x42\x35\x52\xa3\xb9\xa3\xbc\x02\xe1\x4e\x97\x9a\x0e\x61\xef\xd3\x28\xf8\x2e\xd5\x25\x4c\x5b\x7e\xc3\xd5\xbd\x0f\xb2\x78\x4d\xa5\x21\x49\xe8\x81\xcb\x84\xdf\x26\xc2\x74\xdd\xcc\x88\x95\x64\xa2\x3b\xa5\x34\x15\xf7\x36\xcf\x71\x12\x90\x9b\x0b\x33\x2c\x3c\x9f\x2d\xe6\xd4\x97\x34\xf6\xb7\x2d\x0d\x92\xe9\x9b\x6b\x4f\x78\x74\x39\xba\x3f\x4f\x59\x58\x52\xe5\xa9\xe4\xb5\x93\x95\x0e\x48\xcd\xc4\x3c\x2b\x96\x75\x35\x8a\x6b\xa3\x80\xdb\x99\x4f\xd5\xc6\x0e\x6d\x12\xe5\xe4\x74\x45\x90\xb3\xb2\x5f\x58\x97\xb3\x05\xcf\x79\x5a\x08\x2f\xa4\x94\x27\xbd\x2e\x0f\x01\x92\x07\xa9\x28\x7f\xd9\xf6\x20\x96\x06\x85\xad\x50\x4c\x6a\xbd\xb0\xab\xca\x7c\x39\x11\xe5\x0e\x09\x3a\x82\x5f\x70\x17\xde\x1e\x7b\x6e\xba\xe7\x5f\xb9\x9d\x9c\xec\x45\x64\x23\x9f\x6b\xbd\x10\x71\xa3\xb0\x6c\xe4\x4a\xbd\xb8\xd5\xe6\xcb\x69\x11\x7a\x10\x57\xf8\x2e\x8d\xa0\x99\x2b\x35\x17\x85\x9c\x0b\xd3\xf7\xa9\xc8\x73\x2a\x30\x64\x2b\xc4\x57\xc4\xff\x52\x3d\x30\x33\x2a\x52\xbd\xc8\x45\xc8\x72\xef\x14\x1c\x6f\x6c\xb6\xa3\x66\xbb\x4c\x1b\x93\x54\x19\xa6\xe7\x3c\x49\x44\xce\xa2\xbb\x45\x7a\x6f\xcb\xf2\x33\x73\x88\xb2\x84\xe7\x33\x3f\xd1\xb4\xe3\xed\xe3\x4d\xa7\x8d\xc6\x24\x68\xe1\x65\x4a\x6b\x69\x16\x9c\x1b\x36\x5a\x70\xd5\xfd\x65\x1d\x8c\x62\x73\xa5\xdb\xe9\xa0\xf7\x88\xd8\xce\x07\x29\xcf\x4e\x3c\x77\x6b\xd8\xdd\x85\xd4\xea\x47\xae\xbd\x0c\xcb\xdc\x8a\x30\x63\xf2\x54\x3f\xb1\x5a\x3b\xd7\x66\x82\xa3\x45\x62\xeb\x3e\x95\xcb\x66\xa7\xbb\xc0\x0c\xd4\x81\xae\x45\x94\xbf\x42\xf9\x2b\x94\xbf\x42\xf9\xab\xbd\x48\x9c\xab\x66\x12\x2d\x0a\x7f\xcb\x14\x39\x97\xe6\x94\x48\xd9\xa3\x19\x0c\xff\x4d\x7f\x64\x9b\xaf\xf9\x8b\x2f\x2c\xbd\xdc\x9f\x00\x46\xbc\x11\x81\x31\x56\xf8\x99\x54\x97\xb1\x8a\xf4\x25\x5d\x6c\x46\x9c\xba\xa4\xab\xe9\x82\x67\xf2\x92\x67\xf2\x22\x52\xa9\x59\x2b\xfa\xf2\x77\x61\x59\x85\x17\x4e\xe9\x0e\x2e\xb8\x4c\x34\xc9\x0f\x55\xd9\x9f\xfc\x97\x76\x98\x87\x95\x01\x18\xc4\x2c\x7c\x24\x49\x29\x48\x93\x9a\x8e\x8a\xd5\x99\x32\x5a\x42\x96\x25\xd2\xca\x06\x41\xc0\xb1\x5e\x62\x52\xb3\x3b\x39\xbb\x23\xe7\xb1\x48\xcd\xe7\x66\xe9\xc6\x76\x51\x37\xbe\xcb\x59\xe4\xcd\x00\x97\x4f\x32\xf2\x56\x2e\x9a\x5e\x6c\xbe\x3b\xce\xf9\xfd\xb8\xe2\x01\xb4\xc7\x49\xfe\x22\xe7\xc2\x48\x9e\xde\x4c\x60\x06\xfa\xd2\x0a\xc5\x56\x77\x23\xe9\x8f\x24\x0f\x6d\xcf\x30\x6f\x08\xf1\x0a\x07\x4f\x92\x73\x96\x8b\x19\xcf\x63\x72\x0a\x30\xe2\x5a\xba\x64\x3c\x2a\xe4\x83\x2c\x96\xe6\x56\x90\xa9\xff\x7f\xbb\x1c\x4a\x85\x6d\x62\x1f\x66\x81\x46\x5a\x07\x76\x8f\x92\x76\xab\x3f\xd8\x58\xd2\xae\x94\x93\xfa\x04\xe2\xcd\x58\xf7\xa0\x45\xed\xac\x41\x2c\x77\x4a\xb4\x97\xdc\xd5\x94\x99\x56\xb7\x26\xda\xe6\x29\x4f\x1d\xf6\x5e\x48\xb1\x57\x5a\x4a\x32\xda\x6f\xa6\x99\x3f\x28\x75\x3f\xe7\xf9\xbd\x2e\xfd\xc1\x6d\xf3\xc9\x2c\xa3\x9d\xf1\x68\x99\x19\x0d\xe3\x87\x4f\x9f\x7e\xf9\xf8\xee\xf3\x2f\x5f\x5f\x97\x86\x11\x2b\x83\x29\x12\x64\xe5\x3c\x4b\x04\x59\x40\x6e\xc3\x53\x8d\xd4\x21\x67\xa9\x35\x0c\x1b\xd1\x38\xe1\x33\x12\x4a\xcb\xaf\x18\x25\xb4\xaa\x40\x5a\x6b\xc3\x99\x66\xb1\xd4\x51\x2e\x4c\x9b\x4b\xa4\x54\x41\x21\xce\xea\x51\x7f\x50\xb0\x43\x18\x05\xdb\x28\xf3\x5e\xdc\x35\x07\x62\xfe\xc0\x93\x73\x96\x2a\x4b\x7b\x49\x4d\x0e\xa6\x93\x55\xeb\x1b\xf1\xc6\x25\xf3\x7d\x76\x66\xaa\xa0\x24\x6b\xa1\x35\x35\xcc\xdb\x9f\x9d\x35\xc5\x81\xae\x9a\xce\x67\x3e\xa5\x21\x88\x03\x40\x9d\x0a\x5e\x18\x55\x7d\xc6\x0b\xc1\x56\x26\xc2\x3d\x49\xa4\x46\x16\xb7\x56\x89\x4c\x96\x64\xb7\xe9\xb1\x3b\x5c\x23\x0d\x4b\xe0\x40\xfa\x16\x9c\x10\xe0\x84\x00\x27\x04\x38\x21\xc0\x09\xa1\xe9\xf0\x05\xdd\x1e\xd1\x88\x00\x78\x02\x78\x02\x78\x02\x78\x02\x78\x02\x78\x1e\x17\xf0\x04\x83\x00\x83\x00\x83\x00\x83\xe8\x9d\x41\x6c\xc1\xe9\xad\x32\xa7\x72\x1f\x98\x69\xa6\xdf\x72\x65\xf3\xbd\x5b\xba\xc4\xec\xa4\x5a\x0e\xee\xa4\x93\xe2\x4e\xcc\xed\xb5\xa5\x8b\x5c\xf0\x39\x0d\x4f\x1c\x9f\xbb\x8b\xe1\xdc\x7d\x77\xae\x1e\x48\xf6\xa9\xa8\x77\xec\x86\xc4\x95\xe5\xea\x52\xdf\x65\x08\x1f\x37\x2d\xb0\xf1\x67\x5d\x58\xfb\x03\xf3\xb2\xef\xed\xc0\xff\xe9\xe9\x18\xb4\x79\x76\xfd\xd7\xc3\xc6\x44\x95\x38\xc9\x8a\x05\xff\x83\xd4\xc5\x29\xf2\x21\x73\x92\x0d\x9b\x09\xed\x90\x2a\x0f\xf9\xe4\x46\x97\x4f\x4e\xe9\x8e\xc9\x9f\xd5\xcc\x18\x6f\x0d\xf9\xec\x0f\x3a\xc7\x7c\x83\xcd\xc4\x51\xed\x57\xbb\x83\x0f\xc1\x53\x47\x10\x3c\x85\x0c\x1c\xc8\xc0\xd1\xd0\x98\x81\x8b\x67\x63\xc9\xbc\xb1\x53\x93\x7f\xff\x6c\x93\xad\x23\xf0\x70\xda\x7c\x4c\x12\x30\x89\x1e\x43\x94\x80\x5f\xb1\x5d\xd3\x83\xb8\x0c\xf1\x7b\xca\x12\xd2\x5e\xc4\xaa\x66\x06\x39\xb8\x88\x35\x92\x7c\x20\x10\xab\xaa\x93\x3c\x58\xb1\x0a\x11\xd8\x27\x14\x81\x8d\x50\x33\x84\x9a\x21\xd4\x0c\xa1\x66\xd0\x08\xd7\xed\xa2\x21\x69\x84\x50\xaf\x0e\x1f\x80\x32\x48\x05\x2b\x58\x9f\xfb\xa9\x9b\x55\xac\xe4\x89\x6e\xa7\x23\x35\x57\xc9\xea\x36\xd6\xa4\x22\x6b\x88\x6f\xe4\x41\x76\x6b\xfe\xc5\xa3\x62\xc2\xd8\x95\xf9\xaf\xff\xfb\x9c\x4b\x32\xcc\x69\x16\x25\x0b\x5d\x88\xbc\xbc\x41\x5c\xaa\xfc\x44\xde\x0b\x76\x16\xda\x7a\x66\x04\x45\x2f\xdc\x4c\xd8\x75\xc2\xd3\xd4\xd5\x38\x20\xf1\x83\x27\x56\xe2\x79\xfb\x87\x5d\x8e\x64\x6a\xe3\x81\x04\x83\x30\x68\x41\xae\xbe\xf5\xc3\x67\x7a\xca\xae\xec\x88\x99\xcb\x20\xd3\x7e\x74\x9c\x93\x15\xd5\x1d\x88\x78\x5a\x11\x91\x97\x3d\x0f\x94\x69\xcc\xf1\xb2\xec\x63\xbe\xb1\x8e\xe9\xf4\xef\xb9\x20\xdb\x41\xe8\x72\xbd\x10\xdb\xda\x26\xa0\x00\x5b\x73\x9f\x01\xcc\x51\x80\xad\x9b\x02\x6c\xbb\x09\x58\x6b\xca\xad\x1d\x15\xe6\x47\x81\x35\x58\xa6\x4f\x0f\xf8\xa3\xc0\x5a\x97\xeb\x06\x05\xd6\xa0\x1e\x41\x3d\x1a\x79\x61\xb5\x0e\x14\xa4\xbe\x0a\xaa\xed\x6a\x1e\x5b\x53\x3e\xed\xa8\xe4\x37\xb8\x69\x42\x6a\x3b\x15\xa9\x6d\x40\xc2\x11\xee\xf0\xf0\x09\xdc\x34\x8f\x59\xec\xe8\xb7\x30\xda\xe1\x3c\x1e\x2f\x6d\x95\xd6\xaa\xe3\x63\x3f\x6c\x6f\x7d\x35\xd8\x8e\x28\x5f\x43\xe9\x57\x9c\x43\xd8\xd4\x1b\x36\x35\x50\x0b\x50\x0b\x50\xcb\xcb\x7b\xe3\xfe\x05\xd4\x52\x45\x2d\x2f\xbd\xef\x9e\x87\x2e\xc7\x52\xeb\x1c\xe8\x05\x4a\xfc\xe9\x29\xf1\x40\x2f\x5d\xae\x1b\xa0\x17\x98\x6d\xa0\x2e\x01\xbd\xf4\x85\x5e\x5e\x6e\xbd\x78\x1e\xc2\x1c\x8b\x3c\x07\x14\x03\x29\xee\x54\xa4\xb8\x01\x09\x4b\xb8\xd3\xc3\x27\x40\x31\xc7\x2c\x86\x1c\x01\x8a\xd1\x22\xca\x45\xa1\xf7\x94\x6e\xa2\x12\x88\xab\xa6\xec\x86\xde\xbd\x41\x56\xa9\xe6\x9c\x78\x1f\x7e\x5a\x0a\x2d\x4f\x1f\x80\xb4\x13\xa8\x00\x83\x0a\x30\xa8\x00\x83\x0a\x30\xa8\x00\x73\x10\x85\x03\x7a\x61\xeb\x89\x3a\xa4\x5e\x88\x42\x3d\x48\x82\x74\xc2\x49\x90\x50\x95\x09\x55\x99\x50\x95\x09\x55\x99\x50\x95\x09\x55\x99\x50\x95\x09\xb9\x01\x91\x1b\x10\xb9\x01\x91\x1b\x70\x75\x45\xee\xb5\xf8\x18\x4a\xc0\x0d\x61\x16\x50\x02\x0e\x25\xe0\x8e\xad\x04\x5c\x23\x9f\x03\x8e\xdf\x12\xd3\x39\x9f\xa8\x13\xc4\xdc\xf6\x2e\x2e\xe5\xa4\xfe\x98\xf7\x13\x9e\x7b\xd0\x44\xa0\xd6\x12\x96\x3b\xed\xd9\x8b\xec\x6a\xca\x4c\x73\x9f\x87\xd7\xe6\xe7\xab\x5e\x76\xbb\x03\xeb\x95\xb6\x91\x38\x46\x15\x1b\x7f\x50\xea\x7e\xce\xf3\x7b\x5d\x7a\x69\xdb\x06\x93\x05\x46\x3b\x3b\xd1\x32\x33\xca\xc4\x0f\x9f\x3e\xfd\xf2\xf1\xdd\xe7\x5f\xbe\xbe\x2e\x6d\x20\x56\xdc\x52\x24\xb3\xca\x79\x96\x08\x32\x76\xdc\x86\xa7\x1a\x01\x43\xce\x52\x6b\x03\x36\x52\x70\xc2\x67\x24\x7f\x96\x5f\x31\xfa\x66\x55\x57\xb4\x86\x85\x33\xcd\x62\xa9\x4d\x7f\xa5\x4a\x4b\x7a\x54\xa1\x1e\xce\xc0\x51\x7f\x50\x30\x39\x18\x5d\xda\xe8\xed\x5e\xb2\x35\x67\x5f\xfe\xc0\x93\x73\x96\x2a\x0b\x76\x49\x23\x0e\x56\x92\x55\x43\x1b\xa1\xc5\x25\xf3\x7d\x76\x16\xa9\xa0\x0f\x6b\xa1\xa9\xd6\x64\x30\x35\x3b\xc3\x89\x63\x5a\x35\xf5\xce\x7c\x4a\x43\x10\x07\x56\x3a\x15\xbc\x30\x5a\xf9\x8c\x17\x82\xad\x4c\x84\x7b\x92\x48\x8d\xd8\x6d\x0d\x10\x99\x2c\x21\x6e\xd3\x63\x77\xb8\x31\x1a\x96\xc0\x81\x54\x2b\xf8\x1b\xc0\xdf\x00\xfe\x06\xf0\x37\x80\xbf\x41\xd3\xe1\x0b\x90\x3d\xa2\x11\x01\xdb\x04\xdb\x04\xdb\x04\xdb\x04\xdb\x04\xdb\x3c\x2e\xb6\x09\xdc\x00\xdc\x00\xdc\x00\xdc\xd0\x3b\x6e\xd8\x02\xc9\x5b\x65\x4e\xe5\x3e\xac\xd2\x4c\xbf\x45\xc8\xe6\x7b\xb7\x74\x89\xd9\x49\xb5\xc8\xdb\x49\x27\xc5\x9d\x98\xdb\x6b\x4b\x17\xb9\xe0\x73\x1a\x9e\x38\x3e\x77\x17\xc3\xb9\xfb\xee\x5c\x3d\x90\xec\x53\x51\xef\xd8\x8d\xad\xdf\xb3\xba\xd4\x77\x19\xc2\xc7\x4d\x0b\x6c\xfc\xb9\x10\xd6\xfe\xc0\xbc\xec\x7b\x3b\xf0\x7f\x7a\x3a\x06\x6d\x9e\x5d\xff\xf5\xb0\x89\x50\x88\x76\xb4\xa6\xfb\x0f\x52\x17\xa7\xc8\x80\xcc\x11\x36\x50\xee\xb3\x43\x6a\x3a\xe4\x71\x1b\x5d\x1e\x37\xa5\x3b\xa6\x7b\x56\x17\x63\xfc\x79\x90\x67\xbf\xd9\x1d\xca\x1b\x68\x8e\x0c\xd7\xa1\x76\x87\x1b\x82\xa0\x8e\x20\x08\x0a\xc9\x31\x90\x1c\xa3\xa1\x31\x43\x95\xbd\xc6\x91\x15\x63\xdb\xb6\x1e\xb4\xc2\xf1\x76\x8d\x3d\x26\x81\x96\x04\x8a\x41\x09\xb4\xaf\xd8\xd6\x59\x3b\x5c\xe6\xf4\x3d\x25\xef\x68\x21\x2a\x55\x13\x76\x20\x4d\x07\xa4\xa4\x63\x90\x92\x10\x18\x7d\x42\x81\xd1\x88\x00\x43\x04\x18\x22\xc0\x10\x01\x06\x05\x6f\xdd\x2e\x1a\x64\xb8\xc5\x61\xd4\x28\x44\x8b\xac\x8d\x16\x19\x96\x6a\x15\xcc\xc8\xfd\x14\x94\xaa\x0b\x58\xcf\x2a\x49\x4d\xf5\xa3\x3a\x0b\x0c\xa9\x08\x1b\xe2\x1b\xb9\x7b\xdd\x9a\x7f\xf1\xa8\x98\x30\x76\x65\xfe\xeb\xff\x3e\xe7\x92\x0c\x6d\x9a\x45\xc9\x42\x17\x22\x2f\xaf\x10\x97\x6d\x3e\x91\xf7\x82\x9d\x85\x46\x9e\x19\x49\xd1\x4b\x37\x13\x76\x9d\xf0\x34\x75\x65\x02\x48\xfe\xe0\x89\x15\x79\xde\xfe\x61\x97\x33\x99\xda\x78\x20\xc9\x20\x0c\x5a\x10\xac\x6f\xfd\xf0\x99\x9e\xb2\x2b\x3b\x62\xe6\x36\xc8\xb4\x1f\x1d\xe7\x11\x45\xa9\xfb\x23\x9e\x56\x64\xe4\x65\xcf\x03\x65\x1a\x73\xbc\xe0\x79\xd8\x57\x16\x4c\x67\xfd\x16\x2b\xdb\x37\x0a\xae\x56\x29\x6b\x7a\x37\xca\x93\x35\xf7\x19\x58\x1b\xe5\xc9\xba\x29\x4f\xb6\xa5\xf4\xd4\x58\x8d\xec\x58\x60\x3c\x0a\x90\xc1\xee\x7c\x7a\x74\x1e\x05\xc8\xba\x5c\x37\x28\x40\x06\xdd\x07\xba\xcf\x38\x2b\x8f\xbd\x4c\xfb\xe9\xab\xe4\xd8\xd6\xf6\xad\xc6\x0a\x63\xc7\x22\xa3\xc1\x61\x12\x22\xd9\xd1\x8b\x64\x03\x92\x7c\x70\x41\x87\x4f\xe0\x30\x79\x5c\xc2\x44\x9f\xf5\xc3\xfa\x77\x41\xcc\x1f\x64\x24\x78\x14\xa9\x45\x7a\xb0\x02\x62\xd4\x86\x77\xb6\x0d\x2d\xfd\x12\x9b\x0b\x89\xad\x7b\x10\x3c\x15\x91\xe0\x0b\x09\xbe\x90\xe0\x0b\x09\xbe\x90\xe0\xeb\x20\x3a\x07\x54\xc3\xd6\x13\x85\x82\x62\x43\xca\xc3\x06\xbf\xf9\x13\xf2\x9b\x47\xd2\x3d\x24\xdd\x43\xd2\x3d\x24\xdd\x43\xd2\x3d\x24\xdd\x43\xd2\x3d\x84\x93\x21\x9c\x0c\xe1\x64\x08\x27\x5b\x5d\x91\x28\x28\x86\x0c\x9f\xc8\xf0\x89\x0c\x9f\x23\xcf\xf0\xd9\xc8\xeb\x40\xe4\x11\x22\xba\xfa\x83\x01\x14\x14\x5b\xc3\x75\x07\x5d\x58\xac\x25\xd4\x6e\x2e\x30\xf6\x52\x90\x8d\x42\x63\x28\x34\x66\x3f\x42\xa1\x31\xf8\x21\xc0\x0f\x01\x7e\x08\xf0\x43\x80\x1f\x02\x00\x37\x98\xe7\xf3\x23\x02\xe6\x09\xe6\x09\xe6\x09\xe6\x09\xe6\x79\xc2\xcc\x13\x18\x02\x18\x02\x18\x02\x18\x02\x85\xc6\x50\x68\x0c\x85\xc6\xc2\x27\x5b\xc4\x43\x56\x4d\xf8\x28\x38\xd6\xf0\xb5\x61\x70\x21\x14\x1e\x3b\x85\x0c\x6d\x7d\x16\x1e\x6b\x09\xfa\xd6\x15\x20\x3b\x4c\xcc\xea\x1e\xf2\x6a\xd4\x3a\xd6\xee\xf0\x43\x10\xd5\x11\x04\x51\x21\xbf\x06\xf2\x6b\x34\x34\x66\xe8\x32\xda\x58\xf2\x6c\xec\xd6\xe6\x03\x17\x28\xdb\xa5\xd1\xc7\x24\x08\xf7\x5d\xa8\x6c\x77\x41\xf8\x15\xdb\x39\x5b\xc8\xfe\x0b\x97\xed\x90\x28\xe4\xf0\xa2\xd6\x48\xd2\x83\x40\xba\xaa\x4e\xf2\x60\xa5\x2b\x04\x64\x9f\x50\x40\x36\x22\xcf\x10\x79\x86\xc8\x33\x44\x9e\x41\x31\x5c\xb7\x8b\x06\xa5\x18\x42\xc9\x1a\x40\x44\xca\x30\xd5\xac\x60\x8a\xde\x4f\xf1\xb2\x96\x8a\x52\x73\x11\xb3\x8e\x83\x4f\x50\xcc\x2c\xac\x86\xf6\xd2\x01\x8a\x99\xb9\xff\xe1\xda\xc2\x0d\xf0\xf4\x07\x87\x29\x6a\x76\x18\xdc\x5c\x2f\x6e\xb6\xbe\x0d\x28\x72\xd6\xdc\x67\x20\x74\x14\x39\xeb\xa7\xc8\x59\x4b\x29\x6b\x4d\xb1\xb3\xe3\x02\xff\x28\x7a\x06\x1b\xf5\xe9\x79\x00\xa0\xe8\x59\x97\xeb\x06\x45\xcf\xa0\x23\x41\x47\x1a\x7b\xf1\xb3\x2e\xb4\xa4\x7d\x15\x41\x6b\x6d\x27\x5b\x53\x0c\xed\xb8\x64\x38\x38\x6f\x42\x74\x3b\x19\xd1\x6d\x40\x12\x12\x2e\xf2\xf0\x09\x9c\x37\x8f\x5b\xf8\xe8\xb7\x58\xda\x21\xdd\x20\x2f\x29\x17\x50\xd5\x19\x72\x07\x5b\x2f\x6e\xc9\x56\x96\xce\x86\x1b\xb2\x67\xbb\xed\x89\xde\x8b\xcf\x4f\xc5\xda\x3b\xb1\xe7\x09\xa9\x52\x91\x2f\x66\xe7\x7d\xb6\x0b\x11\x4c\x04\x4c\x64\xf4\x61\x85\x36\xad\x1c\x25\x42\xe9\x34\xbe\x90\x36\xca\x11\xe8\xa9\x66\x6b\xd8\x4c\x3b\x94\x2d\xf4\xe1\xed\xa4\x76\x04\xac\x17\xac\x20\x69\xef\x61\x90\x07\x20\x71\x77\xd5\xf6\x83\x78\xf4\x75\xd3\xf8\xa3\x52\x1b\x3a\x0a\x9f\x5a\x19\x59\x33\xe0\x52\x35\x2b\x13\xeb\x65\x8a\x1e\x54\x89\x5a\xe1\xe5\xc3\x64\xaa\xde\x70\xb3\x6c\x48\x51\xdd\x81\x7b\x20\x72\x53\x23\x37\x35\x72\x53\x23\x37\x35\x72\x53\x23\x37\x35\x72\x53\x23\x37\x35\x72\x53\x23\x37\xf5\xda\x11\x41\x6e\x6a\xe4\xa6\x46\x6e\x6a\xe4\xa6\x46\x6e\x6a\xe4\xa6\x46\x6e\x6a\xe4\xa6\x46\x6e\x6a\xe4\xa6\x46\x6e\x6a\xe4\xa6\xde\xc8\xd9\xd6\xfe\xe0\xb4\x73\x53\x23\x29\x75\xc3\xd7\xba\x72\x42\xdb\xd5\xf1\x1d\xd9\xa8\xe1\x36\x52\x3e\x76\xd7\x6c\xd4\xbb\xba\x89\x1c\x81\x6b\xc8\xca\x21\x87\xd8\x05\xc4\x2e\x1c\xb9\x8f\x26\x62\x17\xc6\xe2\x51\xb5\xdb\xd9\x34\x8c\xa0\x85\x81\xfb\x4c\xed\xd8\xda\x63\x92\x6b\xf7\x92\x63\xba\x7f\x57\xa8\x03\x65\x95\xde\x20\x32\x6d\x4c\x27\xbd\x3f\x91\x09\x79\xa4\x21\x2c\x21\x8f\x34\xf2\x48\xef\x30\xd9\xc8\x23\x8d\x3c\xd2\xc8\x23\x8d\x3c\xd2\xd0\xf3\xd6\xed\xa2\x2e\xf5\xbc\x0d\xe2\xd6\x4d\xc1\x8b\x45\x5b\x39\xeb\x40\xba\x54\x67\xcd\x3f\x26\xe5\x6a\x4f\xb9\xa5\x77\xc4\x06\x7b\x4c\x2a\xbd\x41\x4f\xda\x90\x4d\xba\x83\x38\x11\xa4\x91\x0e\xf3\xdf\x5e\x38\x40\x1a\x69\xf7\x3f\xdc\x5a\x30\xa1\x3d\x7f\xca\xef\x23\x7f\xf4\xfe\xc8\x70\x43\xe2\xe8\xed\x91\xef\x50\x68\x2f\x30\xf7\xe8\x30\x37\x32\x46\x6f\x2d\x42\x6d\x4a\x15\x3d\x7e\x38\x8f\x1c\xd1\xb0\x3f\x9f\x1e\xac\x47\x8e\xe8\x2e\xd7\x0d\x72\x44\x43\x01\x82\x02\xb4\x3a\x88\xe3\x4a\x0e\xbd\xab\x0a\xb4\xd7\xac\xd0\x1b\x0d\x5d\x9b\xd2\x41\x8f\x5f\x4e\x83\x13\x25\xe4\xb2\xe3\x97\xcb\x06\x24\xfe\xe0\x96\x0e\x9f\xc0\x89\xf2\xd8\x44\x8a\x3d\xa4\x7c\xde\x9b\x57\xe2\x65\x96\xab\x6f\xcb\xbe\x7d\x13\x23\x95\xa6\x22\x2a\xd8\x8f\x57\x1f\xae\xbe\x5c\x95\xea\x61\xa1\x18\xbd\xdf\x5c\x50\x2d\x22\x3d\xec\x53\xac\x94\x62\xfd\xfc\x9e\xc8\x2a\xd7\xd4\x9d\x16\x87\xce\xda\xa6\xef\xed\x60\x58\x39\x5f\x4f\x70\x27\xb9\x09\xed\x7d\x37\xd1\xa2\xf0\x2e\xa1\x03\x01\xd2\x7e\x4b\xfc\xf9\xea\x4b\x27\xfb\xe1\xcf\xa2\xc0\x66\x68\x6a\x05\x36\x43\xe7\x9b\xe1\x4e\xf0\xb8\x9f\xdd\xf0\x97\xab\x77\x3f\x76\xb2\x1d\xfe\x22\x78\x8c\xfd\xd0\xd4\x0a\xec\x87\xce\xf7\x83\x72\xbf\xee\x65\x4b\x7c\xba\xfe\xf2\xf3\xa7\xbf\xde\x74\xb2\x2b\x5c\x37\xb1\x31\x9a\x5a\x81\x8d\xd1\xf9\xc6\xe8\xc6\xc7\x63\x7d\x43\xe0\xef\xd1\xdc\xe7\x41\xf9\x7b\x5c\xf3\xc2\x26\x81\xbb\x13\x2c\xe3\x39\xa5\xf1\xfb\xdb\xe7\x0f\xce\x50\xea\xf2\xa5\x31\xa7\x97\x32\x91\xc6\x99\x92\x69\xa1\xcd\xa8\x4c\xa7\xf2\x9b\xd0\xd6\x6c\x56\xc9\xfd\x5b\x28\x8a\xf6\xf0\x41\x33\xd1\x22\xcf\x45\x5a\xb8\x53\xd1\xa7\xc3\x2a\x94\x7f\x26\xf1\x2e\x26\xbe\xf1\x79\x96\xb8\x70\x8d\xc7\x3b\x95\x04\x7b\xa8\x69\x0d\x25\x6b\x2a\x8a\xec\x8f\x97\x97\x89\x8a\x78\x72\xa7\x74\xd1\xa0\x49\x9b\x6d\x76\xa1\x97\xba\x10\xf3\x52\x93\x16\x09\xd7\x85\x8c\xb4\xe0\x79\x74\x77\x91\xa8\xd9\x4c\xa6\xb3\xcb\xff\xd7\xfe\xff\xff\xff\xff\xfd\x69\xa1\x45\xfe\xc7\x7b\x39\x8f\xee\x96\x13\xe6\x47\xa3\xf9\xe3\x6d\xdd\x5d\x9e\xac\x82\x43\x38\xbb\x6c\x7b\xa3\x5d\xbf\xfb\xf2\xfe\x2f\x9d\xdc\x67\xc4\x7d\x71\x9b\x35\xb5\x02\xb7\x59\xf7\xb7\x59\xf7\x69\x4e\xfc\x8e\xf8\x74\xd3\x8d\x15\xe0\x5a\x69\x98\x01\x1a\x5b\x81\xfd\xd0\xfd\x7e\xe8\x1a\x5f\x87\xed\xf0\xb7\x8e\x76\xc3\x02\x9b\xa1\xb1\x15\xd8\x0c\x5d\x6d\x86\x57\xec\x85\xe8\xe5\xf2\x9f\x46\x88\xeb\x3d\x3b\xc4\x9e\x09\xcc\x6f\xb2\xb8\xbb\xae\x0b\xa7\xd8\x68\xd8\x68\xa7\x4d\x62\xb0\x29\xb0\x29\x58\x3f\x9b\x62\xd4\x44\x06\xfb\x02\xfb\x82\xf5\xb3\x2f\x8e\x83\xcc\x60\x83\x60\x83\xb0\x9e\x74\x78\x10\x1a\x10\x1a\xd3\x54\x9f\xdf\xdf\x27\x2a\xda\xae\x4b\x4f\x3f\x01\x6f\x02\x6f\x3a\x25\xde\x84\x3b\x1a\x77\x34\xeb\xe9\x8e\x1e\x33\x77\xc2\xbe\xc0\xbe\x60\x3d\xed\x8b\xd1\xf2\x27\x6c\x0a\x6c\x0a\xd6\xe9\xa6\x78\xc5\x76\xe7\x50\xda\x26\x41\xac\x10\xa8\x7e\xd2\xef\xd9\xf7\x78\xd5\xb1\xa3\x44\x7c\x2e\x83\x63\x8b\x8d\x84\x30\xc3\x53\x8f\xdc\x43\x36\x34\x06\xdb\xcb\xc0\x6c\x2f\xc8\x86\xb6\xe6\x8b\x63\xc8\x86\xb6\xfb\x8d\xb6\x29\x2f\x5a\xc3\x95\x36\xca\xac\x1b\xc8\x8e\x86\x2c\x1c\xa7\x97\x85\x03\xd9\xd1\xba\x5c\x37\xc8\x8e\xb6\xd5\xc0\x36\xde\x62\x50\x88\xa0\x10\x21\x3b\x5a\x99\x1d\xed\x25\x76\x88\x4d\x79\xd2\x8e\x45\x6e\x43\xb6\x34\xc8\x69\xc7\x2f\xa7\x0d\x48\x1c\xc2\xad\x1d\x3e\x41\xb6\xb4\x63\x13\x31\xc6\x99\x2d\x6d\x7f\xe5\x5a\xff\xda\x60\x91\x6c\x55\xb0\x75\x7f\x82\x06\x0a\xb5\x42\xc4\x40\xa1\x56\x14\x6a\xdd\x61\xb2\x51\xa8\x15\x85\x5a\x51\xa8\x15\x85\x5a\xa1\x1d\xad\xdb\x45\x28\xd4\x8a\x42\xad\x6c\x83\x02\xd5\x77\xa1\xd6\x26\x7d\x62\x68\xa5\x5a\xdb\xe8\x48\x0d\x3e\x62\xbb\x68\x48\x28\xd2\x8a\x22\xad\xa0\x70\x7b\xbb\xb1\x82\x89\xac\xdc\xb4\x27\x78\xc6\xf7\xea\x98\xf8\xd2\x03\xfe\x85\xae\x89\x6b\x5e\x3f\x26\xe7\x44\xf8\xe8\xad\xf9\xe2\x18\x7c\xf4\xb6\x97\x24\x9a\x7c\xf3\xc6\x4f\x75\xe1\x8d\x07\x13\xec\xe9\x51\x5e\x78\xe3\x75\xb9\x6e\xe0\x8d\x07\x3d\x00\x7a\xc0\xd3\x61\x1c\x89\x3f\xde\x8b\x35\x81\xfd\xd4\x2b\x6d\x67\xed\x69\xf2\xc4\x1b\xbf\x94\xb6\xf3\x3e\x80\x5c\x06\xb9\x6c\x44\x72\xd9\x80\xc4\x1f\xdc\xd2\xe1\x93\xfe\x6e\xe9\xc3\xfa\xdf\x9d\xb6\x50\xd1\xa7\x07\xde\x8e\x22\xc5\x2b\xd6\xc6\x07\xef\xd2\xf3\xf9\xaa\x33\xde\x0e\xe6\x48\xdc\x7e\xad\x4c\x91\x0d\x37\x5f\xcf\x86\xd5\x13\xbd\xef\x9e\x9f\x8a\xb5\x77\x5d\xcf\x13\x02\xc3\x7d\xeb\x29\xea\xd7\x70\xdf\x97\xa6\xe5\x4f\xd4\xa7\xd1\x4f\xbb\x6b\x5d\x3f\xf9\x53\xfa\xb4\xb4\x2f\xc8\x8d\xfd\x8c\x2b\xe4\x46\xc8\x8d\x2f\x94\x1b\x0f\x9d\xd1\x6a\x47\x7f\x25\xe4\xb2\xb2\x9f\x60\x7f\xc2\x69\x04\xb2\x27\x9c\x46\x86\x97\xd8\x69\x57\xf7\x91\x63\x49\x0d\x00\x27\x12\xc0\x8a\xd3\x33\xde\xc0\x89\xa4\xcb\x75\x03\x27\x12\xe0\x29\xe8\x05\x4f\x87\x11\x4e\x24\xfd\xa4\x75\xda\xdd\xb0\x79\x2c\x52\x1b\x9c\x4a\x20\xa7\x9d\x82\x9c\x36\x20\x71\x08\xb7\x76\xf8\x04\x70\xc0\x3d\xf9\xa8\x84\x8c\xd1\xc0\x01\x15\xd7\x96\x78\x9f\xc9\x9c\x2a\x89\x2f\xd4\x94\xfd\x55\xc5\x6d\x73\x3a\xbd\x0f\x3f\x5c\xfd\x11\x12\x3b\xb9\x8c\x41\xe6\xbe\x90\xe9\x42\x38\x1d\xba\x92\x1b\xc8\xa8\x71\x8f\x46\x14\xc9\x45\x91\x4b\xf1\x60\x6e\xaa\xb9\xca\x85\x13\x15\x74\x99\xc4\x45\x8b\xfc\x41\xe4\x13\x76\x23\x53\x72\x3a\xae\xa6\xfd\xb1\x9f\xf9\x5b\xe7\x9c\x45\x89\x0c\x89\x48\xe8\xc2\xf2\x69\x6b\x42\x43\xec\x4f\xe9\xe1\xdc\x88\x41\x0f\x52\x2d\x34\xa3\xdb\xc6\x4b\x29\x74\xb1\xca\xd8\xdc\xa6\x11\x4f\xdc\x67\x95\xc2\x82\xdf\x89\x6f\x91\xc8\x8a\x90\x55\xc8\x3e\x52\x4d\xc3\x4b\xde\x84\xbc\x24\xae\x7d\xa6\x39\xb9\xa0\x64\x42\x7c\xb5\x29\xb2\x60\xb1\x12\x9a\xa4\xac\x20\x47\xb9\x0c\x47\x55\x81\x78\xf5\x67\xe6\x17\x74\x3d\x8b\x9c\x59\x51\xec\xd1\x65\x76\x89\x17\xc2\xe8\xe7\xe2\x5b\x26\x5d\xbe\xa6\xef\x66\x22\x15\x39\x99\x4a\xa7\x46\x26\x2b\x14\x9b\xca\x69\x21\x44\xca\xe6\x32\x5d\x14\x42\xbf\x31\x77\x3f\xb5\x6d\x2a\x67\x3e\xcd\x93\x95\x19\x98\x4a\x2b\x7d\x39\xaf\xf6\xcb\xcb\x76\x99\x4a\x9d\x3c\xc2\xd9\x7f\xbe\xfd\x77\xf6\xd9\xa5\x63\xb9\x32\x4d\x10\xb1\x93\xf8\x0a\x35\xb3\x0d\x74\xdf\x0c\x3d\x2a\xd4\xbd\x48\x43\x97\xed\x1c\xb2\x54\x88\x58\xdb\x6f\x91\xd8\x99\x16\x94\xba\xe7\xdc\x0c\x18\x49\x2e\xb9\xd0\x05\xcf\x0b\xf3\x1b\x99\xd3\x67\xf4\x60\xb5\x28\xea\x33\x4e\xc2\xc2\x84\x7d\x32\xaf\x7e\x94\x3e\xa3\x90\x7b\x8b\x99\x19\x2d\xd2\x98\xf1\xd4\xda\x1e\xe8\x39\xbe\xe4\x63\x10\xb1\xa8\x85\x66\x7a\x84\x7c\xa8\x8a\x5e\xa6\xb3\xd4\xb9\x67\x87\x85\x9e\x4b\x0d\x26\xbb\x87\x5f\xdc\xa9\xf8\x56\xb0\x7b\xb1\xb4\xf9\x72\xc2\x9f\x13\x23\x92\x17\x4c\xa7\x3c\xd3\x77\xaa\x38\x67\x8f\x77\x32\xa2\x8a\x90\x32\xad\x0c\x48\xf8\x7e\x58\xc8\xae\xf9\x76\x0b\x5d\x84\xfc\x4a\x36\x4c\x3f\x17\x2c\xb2\x17\xeb\xb9\x93\xf4\xcd\xbf\x54\xee\x13\x75\x31\x3e\x2d\x84\x5d\xd3\x53\x99\xeb\x62\x75\x30\xac\x44\xed\x6a\x71\xc6\x3e\x09\x8d\x17\x49\x48\xfe\x33\x0b\xd2\xfc\xd7\x4e\xca\xbd\x58\x92\xa0\x5e\x79\xf0\xd7\xd7\xbe\xcb\x5f\x5f\x4f\xbe\xa6\x5f\xd3\xba\x95\x8e\xf2\x07\x2c\x32\x9b\x74\xc0\x1e\x10\x8f\x64\xde\x91\x9a\xa4\xb5\x09\x7b\x5f\xd9\xe2\x76\x01\x70\xf7\x95\xca\xe8\xd9\x41\xa0\x35\xf8\xab\xbd\x7f\xdc\xb6\xc9\x45\xb1\xc8\xd3\x32\xe5\x90\x9b\x31\xab\x83\x14\x6c\x2e\xb5\x66\x3c\x5d\xd6\x15\xa1\x5d\x44\x54\xbf\xfc\x0e\xa3\x3d\x40\xc9\x6b\x3d\x51\x87\x54\xf2\xde\x31\x2d\xca\xdc\x51\xe6\x40\xcb\x65\x64\x8f\x2f\xda\x7a\x6a\x5a\x2e\xd8\x90\x2a\x6d\xe9\x36\x97\xb5\x9d\xd6\xf3\xd6\x89\x07\x91\x2f\x8b\x3b\x99\xce\x76\x56\xab\x6e\x5c\x8b\x0e\x33\x22\x48\x33\x78\x42\x69\x06\x5f\xb4\xfc\x13\x7e\x2b\x92\x4e\x97\x3f\x3d\xf1\xb0\xcb\x3f\x91\x73\x59\x58\x73\xcf\x9c\x7f\x93\xf3\xc5\x9c\xa5\x8b\xf9\xad\x59\x24\xd3\x70\x98\x6a\x3b\x5a\x66\x60\x2c\xcc\xb2\xa3\x15\xf1\x24\xa1\x25\x4b\x62\xb4\x34\x6d\xb1\x19\xf5\x9e\xca\x26\x46\xf8\x36\x7f\xfb\xbb\xbf\xa5\xfe\xee\x93\xfa\xa5\xe5\xe8\xfb\x7c\x7b\x76\xa1\xda\xd5\x49\xf7\x47\xc4\x53\xbf\x9c\x4b\x49\x48\xf3\xb9\xd9\x65\xb2\x90\x41\x64\xb6\xad\x34\xc2\xbd\x28\x65\x1d\xf3\x6a\xdb\x17\x33\x69\x13\x76\x23\x0a\x92\x88\x4c\x27\x4c\xdf\xad\xa8\x6c\xfb\x26\x1e\x49\x68\xe0\x69\xf5\x86\x30\x62\xca\x5c\x2d\x52\x7a\x8c\xed\xe5\x77\x8b\xcc\xbc\xcc\x6e\x68\xf3\x97\x37\x5e\x36\x11\x0f\x46\x4c\xe2\x74\x39\xf9\x5f\xfb\x95\x64\xe4\x92\xa9\x4c\x0a\x61\x24\x54\x23\x35\x9a\x3b\xca\x2b\x10\xee\x74\xa9\xe9\x10\xf6\x3e\x8d\x82\xbb\x4b\x5d\xc2\xb4\xd9\xff\x0a\x91\xcf\x65\x2a\x82\x2c\x5e\x53\x69\x48\x12\x7a\xe0\x32\xe1\xb7\x89\x98\x50\xe5\x02\xa3\x4f\x98\x2e\x47\x77\x4a\x69\x41\x5b\xbf\x50\x5e\x02\x72\x73\x61\x86\x85\xe7\xb3\xc5\x9c\xfa\x92\xc6\xfe\xb6\xa5\x41\x32\x7d\x73\xed\x09\x8f\x2e\x47\xf7\xe7\x29\x0b\x4b\xaa\x3c\x95\xbc\x76\xb2\xd2\x01\xa9\x99\x98\x67\xc5\xb2\xae\x46\x71\x6d\x94\x6c\x3b\xf3\xa9\xda\xd8\xa1\x4d\xa2\x9c\x9c\xae\x08\x72\x56\xf6\x0b\xeb\x72\xb6\xe0\x39\x4f\x0b\xe1\x85\x94\xf2\xa4\xd7\xe5\x21\x40\xf2\xe0\x82\xc4\x86\xd0\xf6\x20\x96\x06\x85\xad\x50\x4c\x6a\xbd\xb0\xab\xca\x7c\x39\x11\xe5\x0e\x09\x3a\x82\x5f\x70\x17\xde\x5e\x7a\x6e\xba\xe7\x5f\xb9\x9d\x9c\xec\x45\x64\x23\x9f\x6b\xbd\x10\x71\xa3\xb0\x6c\xe4\x4a\xbd\xb8\xd5\xe6\xcb\x69\x11\x7a\x10\x57\xc8\x29\x8d\xa0\x99\x2b\x35\x17\x85\x9c\x0b\xd3\xf7\xa9\xc8\x73\xca\x6f\x6a\xe4\xea\x9a\x3e\x54\xaa\x07\x66\x46\x45\xaa\x17\xb9\x08\x29\xb9\x9c\x82\xe3\x8d\xc1\x76\xd4\x6c\x97\x69\x63\x92\x2a\xc3\xf4\x9c\x27\x89\xc8\x59\x74\xb7\x48\xef\x09\xc3\x70\x66\x0e\x51\x96\xf0\x7c\xe6\x27\x9a\x76\xbc\x7d\xbc\xe9\xb4\xd1\x98\x04\x2d\xbc\x4c\x69\x2d\xcd\x82\x73\xc3\x46\x0b\xae\xba\xbf\xac\x63\x4e\x6c\xae\x74\x3b\x1d\xf4\x1e\x11\xdb\xf9\x20\xe5\xd9\x89\xe7\x6e\x0d\xbb\xbb\x90\x5a\xfd\xc8\xb5\x97\x61\x99\x5b\x11\x66\x4c\x9e\xea\x27\x56\x6b\xe7\xda\x4c\x70\xb4\x48\x6c\xda\xd9\x72\xd9\xec\x74\x17\x98\x81\x3a\xd0\xb5\x88\xec\xbb\xc8\xbe\x8b\xec\xbb\xc8\xbe\xbb\x17\x89\x73\xd5\x4c\xa2\x45\xe1\x6f\x99\x22\xe7\xd2\x9c\x12\x29\x7b\x34\x83\xe1\xbf\xe9\x8f\x6c\xf3\x35\x7f\xf1\x85\xa5\x97\xfb\x13\xc0\x88\x37\x22\x30\xc0\x0a\xdf\x92\xea\x32\x56\x91\xbe\xa4\x8b\xcd\x88\x53\x97\x74\x35\x5d\xf0\x4c\x5e\xf2\x4c\x5e\x44\x2a\x35\x6b\x45\x5f\xfe\x2e\x2c\xab\xf0\xc2\x29\xdd\xc1\x05\x97\x89\x26\xf9\xa1\x2a\xfb\x93\x67\xd0\x0e\xf3\xb0\x32\x00\x83\x98\x85\x8f\x24\x29\x05\x69\x52\xd3\x51\xb1\x3a\x53\x46\x4b\xc8\xb2\x44\x5a\xd9\x20\x08\x38\xd6\xff\x4a\x6a\x76\x27\x67\x77\xe4\x96\x15\xa9\xf9\xdc\x2c\xdd\xd8\x2e\xea\xc6\x77\x39\x8b\xbc\x19\xe0\xf2\x49\x46\xde\xca\x45\xd3\x8b\xcd\x77\xc7\x39\xbf\x1f\x57\xfc\x6c\xf6\x38\xc9\x5f\xe4\x5c\x18\xc9\xd3\x9b\x09\xcc\x40\x5f\x5a\xa1\xd8\xea\x6e\x24\xfd\x91\xe4\xa1\xed\x19\xe6\x0d\x21\x5e\xe1\xe0\x49\x72\xce\x72\x31\xe3\x79\x4c\xd0\xde\x88\x6b\xe9\x92\xf1\xa8\x90\x0f\xb2\x58\x9a\x5b\x41\xa6\xfe\xff\xed\x72\x28\x15\xb6\x89\x7d\x98\x05\x1a\x89\x1c\xd8\x3a\x32\x6a\xaf\xfe\x60\x63\x46\xed\x52\x4e\xea\x11\x64\xd7\x69\xee\x41\xd3\x6a\x5b\x3b\x58\xee\x74\x67\x2f\xb0\xab\x29\x33\x8d\x7d\x0e\x56\x9b\x1f\x3b\xe7\xb8\x1d\x01\xf5\x4a\x6b\x48\xfc\xfa\xcd\x34\xe5\x07\xa5\xee\xe7\x3c\xbf\xd7\xa5\x13\xb5\x6d\x22\x59\x5c\xb4\xb3\x0b\x2d\x33\xa3\x3c\xfc\xf0\xe9\xd3\x2f\x1f\xdf\x7d\xfe\xe5\xeb\xeb\xd2\xe6\x61\xc5\x2b\x45\x32\xaa\x9c\x67\x89\x20\xe3\xc6\x6d\x78\xaa\x11\x28\xe4\x2c\xb5\x36\x5f\x23\xf5\x26\x7c\x46\xf2\x66\xf9\x15\xa3\x5f\x56\x75\x43\x6b\x48\x38\xd3\x2c\x96\x3a\xca\x85\x69\x73\x49\x8b\x2a\x94\xc3\x19\x34\xea\x0f\x0a\x26\x06\xa3\x3b\x1b\x3d\xdd\x4b\xb2\xe6\xac\xcb\x1f\x78\x72\xce\x52\x65\x41\x2e\x69\xc0\xc1\x2a\xb2\x6a\x58\x23\x94\xb8\x64\xbe\xcf\xce\x02\x15\xf4\x5f\x2d\xb4\xa6\x86\x79\xd3\xb2\x33\x94\x38\x86\x55\x53\xe7\xcc\xa7\x34\x04\x71\x60\xa3\x53\xc1\x0b\xa3\x85\xcf\x78\x21\xd8\xca\x44\xb8\x27\x89\xd4\x88\xd9\xd6\xe0\x90\xc9\x12\xda\x36\x3d\x76\x87\x1b\xa2\x61\x09\x1c\x48\x95\x82\x7f\x01\xfc\x0b\xe0\x5f\x00\xff\x02\xf8\x17\x34\x1d\xbe\x00\xd7\x23\x1a\x11\xb0\x4c\xb0\x4c\xb0\x4c\xb0\x4c\xb0\x4c\xb0\xcc\xe3\x62\x99\xc0\x0b\xc0\x0b\xc0\x0b\xc0\x0b\xbd\xe3\x85\x2d\x10\xbc\x55\xe6\x54\xee\x63\x22\xcd\xf4\x5b\x64\x6c\xbe\x77\x4b\x97\x98\x9d\x54\x8b\xb8\x9d\x74\x52\xdc\x89\xb9\xbd\xb6\x74\x91\x0b\x3e\xa7\xe1\x89\xe3\x73\x77\x31\x9c\xbb\xef\xce\xd5\x03\xc9\x3e\x15\xf5\x8e\xdd\xd8\x8a\x78\xab\x4b\x7d\x97\x21\x7c\xdc\xb4\xc0\xc6\x9f\xaa\x60\xed\x0f\xcc\xcb\xbe\xb7\x03\xff\xa7\xa7\x63\xd0\xe6\xd9\xf5\x5f\x0f\x9b\x00\x95\xe1\x8a\x2a\x16\x1f\xa4\x2e\x4e\x91\xf8\x98\x03\x6c\x90\x94\x67\x87\x34\x69\xe3\xcd\x2b\xa6\x74\xc7\x48\xcb\xaa\x23\x8c\x3f\x47\xaf\xec\xf7\x5e\xc6\xaf\x86\x9a\xd1\xc1\x74\xa7\xdd\x8e\x46\x9c\xcf\x11\xc4\xf9\x20\x99\x03\x92\x39\x34\x34\x66\x98\xe2\xc6\x48\xf2\x38\x6c\xd5\xd2\x43\xd4\xc5\xdf\xa9\xa9\xc7\x24\xbf\x91\xe8\x30\x20\xf9\xed\x15\x5b\x97\x69\xc2\x65\xa0\xde\x53\xc2\x89\x67\x25\x9f\x6a\x92\x09\xa4\x96\x80\xd8\x33\x56\xb1\x07\xc1\xbc\x27\x14\xcc\x8b\xa8\x25\x44\x2d\x21\x6a\x09\x51\x4b\xd0\xd8\xd6\xed\xa2\x41\x86\x08\x1c\x46\x37\x42\x84\xc3\xda\x08\x87\x21\x69\x4c\xc1\x0a\xdc\x4f\x21\x9e\xba\x78\xf5\x8c\x52\x54\xa9\xbc\xd3\x4d\x30\x43\x45\xb8\x10\xdf\xc8\x45\xe9\xd6\xfc\x8b\x47\xc5\x84\xb1\x2b\xf3\x5f\xff\xf7\x39\x97\x64\x29\xd3\x2c\x4a\x16\xba\x10\x79\x79\x65\xb8\x04\xe6\x89\xbc\x17\xec\x2c\x64\x40\x3c\x33\x92\xa1\x97\x66\x26\xec\x3a\xe1\x69\xea\x32\xcf\x93\xbc\xc1\x13\x2b\xe2\xbc\xfd\xc3\x2e\x67\x30\xb5\xf1\x40\x92\x40\x18\xb4\x20\x48\xdf\xfa\xe1\x33\x3d\x65\x57\x76\xc4\xcc\xe9\x9f\x69\x3f\x3a\xce\x8b\x87\xb2\xc1\x47\x3c\xad\xc8\xc4\xcb\x9e\x07\xca\x34\xe6\x78\x61\xe9\xb0\xaf\xa8\x93\xb7\x7f\xf5\x5b\xea\x69\xaf\xf8\xb2\x56\xe5\xe9\xc9\x9b\x51\xe0\x09\x05\x9e\xf6\x52\xe0\x69\x2b\x81\xa1\x5a\xd1\xe9\x28\xf0\x31\xca\x38\xc1\xb4\x7a\x7a\x44\x19\x65\x9c\xba\x5c\x37\x28\xe3\x04\x71\x1f\xe2\xfe\x28\x2b\x38\xbd\x40\xe0\xef\xab\x78\xd3\x96\x06\x9c\x6a\xb5\xa6\xa3\x90\xc8\xe0\xd0\x07\xf1\xeb\xc8\xc5\xaf\x01\x49\x39\xb8\x8c\xc3\x27\x27\xee\xd0\x77\x54\x62\x43\xaf\x35\x99\xba\x77\x92\xbb\xcc\x72\xf5\x6d\xd9\xb7\xab\x5c\xa4\xd2\x54\x44\x05\xfb\xf1\xea\xc3\xd5\x97\xab\x52\xc5\x2b\x14\xa3\xf7\xb7\x28\xd5\xe4\x1e\x61\xe5\x0d\xeb\x83\x66\x7e\x71\x4d\xcd\x6f\x71\x82\xac\x6d\xea\xde\x76\xf9\xca\x61\x79\x82\x9b\xc3\xcd\x61\xbf\x1b\x84\x56\x84\x77\x4f\x1c\x08\x1f\xf5\xeb\xff\xcf\x57\x5f\x5e\xbe\xf8\xff\x2c\x0a\xac\x7c\xac\x7c\xfb\xe7\x8e\x57\xfe\x9d\xe0\x71\x3f\x4b\xff\x2f\x57\xef\x7e\x7c\xf9\xda\xff\x8b\xe0\x31\x16\x3f\x16\xbf\xfd\x73\xc7\x8b\x5f\xb9\x5f\xf7\xb2\xfe\x3f\x5d\x7f\xf9\xf9\xd3\x5f\x6f\x5e\xbe\x05\x5c\x1f\xb1\x0b\xb0\x0b\xec\x9f\x3b\xde\x05\x1d\xf8\x13\xac\x6f\xc5\x98\x7c\x0b\xae\x79\x61\x73\x42\xdd\x09\xf6\xb7\xcf\x1f\x98\x69\x35\xe5\x16\xd1\x22\x84\x13\x44\x8b\x3c\x17\x69\xe1\x76\xb2\x4f\x70\x53\x28\x66\x74\xac\xad\x1d\x0e\x9e\x0c\xcb\x21\xdc\x0d\xb6\x3d\xd8\xae\xdf\x7d\x79\xff\x97\x97\x1f\x6b\x84\xe1\x70\xa8\xe1\x50\xb3\x7f\xee\xfa\x50\xeb\x3e\xef\x81\x5f\xfe\x9f\x6e\x3a\xd0\xe9\xae\x95\x86\x52\x87\xc5\xef\xfe\xdc\xf5\xe2\xef\x1a\x18\x86\xb5\xff\xb7\x2e\x96\xfe\x02\x2b\x1f\x2b\xdf\xfd\xb9\x9b\x95\xff\x8a\xb5\xb2\x7a\x5f\xfe\xd3\x48\x5c\xbd\xc7\x89\xf7\x6c\xfc\xfe\x4d\x16\x77\xd7\x75\xc9\x11\x7b\x07\x7b\xe7\x84\x8c\xe0\xd8\x01\xd8\x01\xac\x87\x1d\x30\x2a\x63\x38\x36\x01\x36\x01\xeb\x61\x13\x8c\xd3\x28\x8e\xdd\x80\xdd\xc0\xfa\x50\xa5\x61\x1c\x0f\xee\xd1\x77\x3e\xd3\xb2\x4f\xbd\xb1\x5d\x6f\x9e\x7e\x02\x53\xff\x29\x9a\xfa\x71\x54\xe3\xa8\x66\x7d\x1c\xd5\x63\x32\xf9\x63\x13\x60\x13\xb0\x3e\x36\xc1\x68\x4c\xff\xd8\x01\xd8\x01\xac\xbb\x1d\xf0\x8a\x3d\x87\x00\xb4\xcd\x4c\x55\x31\xfe\xf7\x93\x16\xc9\xbe\xc7\x6b\x00\x3b\x26\x48\x72\x69\xb4\x5a\xec\x0d\x44\xca\x9c\x74\xfc\x09\xb2\xd4\x0c\x50\x59\x46\x96\x9a\x35\x5f\x1c\x43\x96\x9a\x1d\xcf\xef\x95\x7c\x35\x0d\x07\xf8\x28\x63\xa4\x91\xb5\x06\x61\xd3\xa7\x17\x36\x8d\xac\x35\x5d\xae\x1b\x64\xad\xd9\x6a\x60\x1b\x6f\x2d\x88\xff\x10\xff\x91\xb5\x86\x47\x3b\xcb\x67\x4f\xf2\xd7\x1c\x8b\x84\x86\x2c\x36\x10\xc7\x8e\x5c\x1c\x1b\x90\xd4\x83\xcb\x39\x7c\x82\x2c\x36\xc7\x23\x46\x8c\x20\x8b\x8d\xbf\x5c\xd2\xe2\x41\x25\x8b\xb9\x88\x12\x2e\xe7\xfd\xda\xf3\xa9\xd8\xbd\xca\x99\x2d\xc3\xee\x2b\x17\xa9\x29\x33\x5d\x63\xd7\xa1\x41\xbf\x52\x83\xde\x9b\x06\x6d\x90\x40\xcc\xd3\x1c\x07\x6b\xfa\xe5\x4f\x2a\x7f\x97\x24\xa1\x08\xc1\x20\x8c\xff\x6b\x7f\x70\xa2\xf5\xbc\x1b\x27\x0e\x05\xbe\x1b\xbe\xf6\xe2\x53\xe3\xb9\xdd\xd5\x33\x8c\xa0\xa2\x4f\xbf\x99\xb5\xf9\x83\x52\xf7\x73\x9e\xdf\xeb\xd2\xe6\x63\xcf\x03\xf1\x40\x85\x99\xac\x90\xb5\xcc\x04\xfb\xfa\xfa\x87\x4f\x9f\x7e\xf9\xf8\xee\xf3\x2f\x5f\x5f\x4f\xd8\x8d\xc8\x4d\x03\x5d\x51\x27\x45\x32\xb2\x9c\x67\x89\x98\x8b\xb4\x60\xb7\xe1\xa9\x73\xbe\x64\x72\x96\xda\x92\x7a\x52\x5b\x9b\x85\x11\xa7\xca\xaf\xf0\x5c\x30\x23\x8c\x33\x5e\x58\xa5\x87\x1e\x7d\xa6\x59\x2c\x75\x94\x0b\xd3\xe6\x09\x7b\x9f\x48\x6a\x4f\x45\x24\xe7\xda\x1c\x7f\x2b\x0f\xca\x45\xb1\xc8\x8d\x00\xc6\x0b\xc6\xd3\x25\x0b\xc5\x50\x64\x5a\x88\xfc\x81\x27\xe7\x2c\x55\x39\x35\xab\xb8\x13\x4b\xff\x90\xf2\xbd\x56\x70\xd6\x22\x8d\xe9\xf7\xbe\xcf\x76\x3c\x58\xbc\x30\x42\x15\xe3\x4c\x1b\x11\xdd\x34\xcc\x57\xee\x93\xda\x36\xca\x0e\x5f\xad\x88\x9c\xf9\x94\x86\xc0\xd5\x82\xbb\x13\x6c\x2a\x78\xb1\xc8\x05\x9b\xf1\x42\xb0\x95\x89\x70\x4f\x12\xa9\x91\x2f\xa9\xde\x1c\xcf\xa4\x6d\xdc\xba\xc7\x6e\x49\x59\x1a\xa6\xbf\x19\xb9\x34\x59\x78\x3a\x20\x48\x46\x04\x37\x92\xb4\x4c\x17\xc2\x19\x11\x2b\x55\x16\xb5\x28\xd8\xa3\x51\xd2\x72\x51\xe4\x52\x3c\x98\x01\x9f\x2b\x9a\x5b\x4d\xf5\x0c\x43\x39\x3c\x3b\x28\x13\x76\x23\xd3\x48\xac\x14\x50\x74\xb3\xe9\xe4\xf1\x73\x16\xb9\x05\x64\x66\x9e\x44\x79\x5f\x00\x30\x34\xc4\xfe\x94\x1e\xce\x8d\x82\xf8\x20\xd5\x42\x33\x1a\x46\xaf\xbf\xd1\x6e\x90\xb1\xd1\x33\x22\x9e\xb8\xcf\xca\xfd\xc7\xbe\x13\xdf\x22\x91\x15\xc1\xcb\xd2\x3e\x52\x4d\xc3\x4b\xde\x84\x0a\x6f\xae\x7d\xa6\x39\xb9\xa0\xb2\x8c\x7c\xb5\x29\xd2\xec\x2c\x61\x57\x43\xd0\x30\xc3\x12\x2a\x6d\x03\xab\x3f\x33\xbf\x20\xc5\x45\xe4\xcc\x2a\xa9\x8f\xae\x46\x5e\xbc\x10\xac\x50\x4c\x7c\xcb\xa4\xab\x7c\xf9\xdd\x4c\xa4\x22\x27\x42\x34\x35\xda\x6a\xa1\xd8\x54\x4e\x0b\x21\x52\x36\x97\xe9\xa2\x10\xfa\x8d\x91\x11\xa8\x6d\x53\x39\xf3\x05\x33\xad\x36\xc5\x54\x5a\xe9\xcb\xf9\x93\x5d\x64\xaf\x38\xa7\xa9\x71\xf6\x9f\x6f\xff\x9d\x7d\x76\xde\xb5\x57\xa6\x09\x22\x76\xba\x70\xa1\x66\xb6\x81\xee\x9b\xa1\x47\x85\xba\x17\x69\xe8\xb2\x9d\x43\x96\x0a\x11\x6b\xfb\x2d\x77\x88\x52\x11\xc4\x73\x33\x60\xa4\xd3\xe5\x42\x17\x3c\xa7\xd3\x44\xe6\xf4\x19\x3d\x58\x2d\x8a\xfa\x8c\xd3\x3e\x9a\xb0\x4f\xe6\xd5\x8f\xd2\xd7\x66\x74\x6f\x31\x33\xe3\x8e\x01\x6b\x7c\xa5\xe7\x78\x4f\xd9\xa0\x7c\x52\x0b\xcd\xf4\x08\xf9\x50\x55\x4a\x4d\x67\xa9\x73\xcf\x0e\x0b\x3d\x97\x1a\x4c\x86\x5f\xbf\xb8\x53\xf1\xad\x60\xf7\x62\x69\x2b\x0f\x86\x3f\x27\xbc\x30\xef\xd7\x29\xcf\xf4\x9d\x2a\xce\xd9\xe3\x9d\x8c\xc8\xdd\x57\xa6\x95\x01\x09\xdf\x0f\x0b\xd9\x35\xdf\x6e\xa1\x8b\x20\xef\xd9\xfa\x47\xb9\x60\x91\xd5\x3b\xce\x9d\x0d\xc4\xfc\x4b\xe5\xbe\xe4\x29\xe3\xd3\x42\xd8\x35\x3d\x95\xb9\x2e\x56\x07\xc3\xda\x1a\x64\x1a\x25\x8b\xd8\x9e\x59\xce\x95\x9a\x44\x1c\xd2\x8c\xcd\x82\x34\xff\xb5\x93\x72\x2f\x96\xf6\xc0\x2e\x1f\xfc\xf5\xb5\xef\xf2\xd7\xd7\x93\xaf\xe9\xd7\xb4\x8e\x29\xa8\x30\xd3\x22\xb3\xd5\x9c\xec\x01\x61\x6f\x2a\xa9\xe9\x10\x2a\xef\x08\x9a\x39\x5a\x00\xee\x34\xae\x8e\x9e\x1d\x04\x5a\x83\xbf\xda\x1b\xd6\x6d\x9b\x70\x73\xb8\xe2\x8d\x6e\xc6\xac\x75\xa6\x60\x73\xa9\x35\xdd\x08\x35\x13\xd1\xb6\x27\xaf\x5f\x7a\xdd\x10\xee\x76\xa7\xed\x3b\xa6\x45\x59\xd0\xd1\xec\x8d\x5c\x46\x76\x27\x58\x15\x60\x5a\xf6\x3d\xd4\x2f\x5d\xba\x79\xb2\x1c\xa2\x5e\x4c\x56\x3c\x88\x7c\x59\xdc\xc9\x74\xb6\x6d\xf7\xe9\x69\x37\xae\x35\xa3\x19\x83\x84\xdf\x8a\xa4\xb3\x31\xa0\xa7\x1d\x62\x0c\x12\x39\x97\x85\x35\xa5\xcd\xf9\x37\x39\x5f\xcc\x59\xba\x98\xdf\x8a\xdc\xf6\xde\x69\x23\x76\x7c\xcc\x50\x58\x1e\x68\xc7\x27\xe2\x49\x42\xc7\x30\x5d\xc4\xd2\xb4\xc2\x56\x37\x7d\x7a\xba\x99\xeb\xdb\xfc\xed\xef\x7e\xad\xff\xdd\x17\x58\x4d\xcb\xf1\xf6\xb5\x4f\x6d\x6d\x62\xbb\x01\xe9\x24\x8a\x78\xea\x2b\x18\x97\x67\xa9\xe6\x73\x73\xb8\xc8\x42\x86\x4b\xd7\xb6\xd2\x88\x07\xa2\x3c\x2d\xcd\xab\x6d\x5f\xcc\x34\x19\x21\xb5\x28\xac\xb8\x66\xfb\x6e\x2f\x5b\xdb\x37\xf1\x48\xc7\x0e\x4f\xab\x26\x56\x73\xd0\xcd\xd5\x22\xa5\xc7\xd8\x5e\x7e\xb7\xc8\xcc\xcb\x6c\x0d\x67\xf3\x97\x37\xfe\x74\xb3\x12\x21\xa7\x03\xdd\xff\xda\xaf\x1d\x73\xb2\x4d\x65\x52\x08\x73\xc7\x99\x7b\xc7\x1c\x23\x51\x5d\x86\xad\x49\x21\xd6\x20\x1d\x05\x17\xa1\xfa\x1d\x65\x2b\xb1\x16\x22\x9f\xcb\x54\x84\xdb\xbc\x26\x14\xd1\x59\xfa\xc0\x65\x62\xa4\xc6\x52\x3e\x37\x5d\x8e\xee\x94\xd2\x82\x4e\xb1\x42\xf9\x33\xd4\xcd\x85\x19\x16\x9e\xcf\x16\x24\xb6\xf3\x34\xf6\x37\x14\x0d\x92\xe9\x9b\x6b\x4f\x78\x74\x39\xba\x3f\x4f\x59\x58\x52\xa5\x30\xe2\xe5\x9b\x95\x0e\x48\xcd\xc4\x3c\x2b\x96\x75\x41\x2c\x48\xdf\xbc\x30\x32\xcb\xa6\x0e\x6d\xba\x0c\xe4\x74\xe5\x2a\xb0\xb7\x47\x58\x97\xb3\x05\xcf\x79\x5a\x08\x6f\xe5\x2f\x4b\x29\xeb\x72\xdb\xd3\x8d\xb2\x20\xbb\x7b\x68\x7b\xb8\xd8\x82\xc8\x57\x28\x26\xb5\x5e\x38\x25\x40\xa6\xb3\x44\x94\x3b\x24\x48\x19\x7e\xc1\x5d\x78\x5b\xb4\xd1\x3a\xc2\x2b\xb7\xbb\x69\xfd\x25\x4b\x3a\x86\x5e\x88\xb8\xf1\xba\x25\x5d\x67\x71\xab\xcd\x97\xd3\x22\xf4\x20\xae\xc0\xe7\x2f\x4e\x4d\xd1\x6a\x2e\x0a\x39\x17\xa6\xef\x53\x91\xe7\x54\x6b\xda\xdc\xcc\x35\x89\xaa\x14\x30\xcc\x8c\x8a\x54\x2f\x72\x11\xaa\x25\x3a\x11\xc9\x1b\xda\xed\xa8\xd9\x2e\xd3\xc6\x24\x61\x88\xe9\x39\x4f\x12\x91\xb3\xe8\x6e\x91\xde\x93\x65\x89\x33\x73\x6c\xb2\x84\xe7\x33\x3f\xd1\xb4\xe3\xed\xe3\xad\x46\xa6\x85\xa0\x85\x97\x29\xad\xa5\x59\x70\x6e\xd8\x68\xc1\x55\xf7\x97\xf5\x68\x8a\x4b\x9d\x8c\xde\x23\x62\x3b\x1f\x24\x7e\xbb\x0b\xde\xad\x61\x57\xfe\x9c\x5a\xfd\xc8\xb5\x87\x40\x5e\xef\x34\x63\xf2\x54\xc2\xb1\x72\x3f\xd7\x66\x82\xa3\x45\x62\x4b\x80\x97\xcb\x66\xeb\xd3\xdf\x0c\x52\xf3\xa9\xdf\x54\x03\xfd\x84\xdc\xf5\xda\xf5\x66\x55\x76\xd3\xa2\xf0\x0b\xb7\xc8\xb9\x34\x27\x77\xca\x1e\xcd\x0c\xfb\x6f\xfa\x55\x60\xbe\xe6\xf7\x52\xa8\xeb\x9d\xfb\xf2\xea\xe6\xc4\x14\x01\xd9\x54\x2c\x7a\x52\x5d\xc6\x2a\xd2\x97\xb4\x57\xcc\x09\x7d\x49\xab\xfd\x82\x67\xf2\x92\x67\xf2\x22\x52\xa9\x51\xf9\xf4\xe5\xef\x42\xcd\xee\xf0\xc2\x29\x6d\xeb\x82\xcb\x44\xd3\x91\x54\x15\x20\xc8\x5f\x63\xcb\xe1\x5e\xe9\xfc\x01\xc7\xfd\x23\x1d\xb7\xe1\x4a\xd2\x54\x79\x7d\x75\x6e\x8c\xa8\x91\x65\x89\xb4\x07\x4c\x38\x25\xad\x1f\x8c\xd4\xec\x4e\xce\xee\xc8\x3d\x26\x52\xf3\xb9\x48\xa9\xe8\x7d\x75\xe6\x6a\xef\x72\x86\x01\x33\xa4\xe5\x93\xcc\xa1\x9d\x8b\xa6\x17\x9b\xef\x8e\x6f\x46\x3f\x3e\x35\x36\xf7\x3b\xad\x5f\xe4\x5c\x98\x0b\xcb\x1b\x2c\xcc\xd0\x5e\xda\xbb\xd4\x8a\x7c\x74\x69\xd0\xa1\x65\xe3\x49\x63\x6f\x01\xf0\x72\x0a\x4f\x92\x73\x96\x8b\x19\xcf\x63\xe2\xa8\xe6\x94\x4f\x97\x8c\x47\x85\x7c\x90\xc5\xd2\xdc\x6c\x32\xf5\xff\x6f\xdb\xf3\xa5\xb0\xcd\xbb\x11\x91\x4a\xe3\x35\x36\xaa\x9e\x8e\xcd\xdf\xac\xe2\xa8\x72\x4f\x8e\x7d\x7c\xb0\xfd\xde\x2d\x5d\xad\x76\xf2\x6c\xd9\x7e\x27\x33\x15\x77\x62\x6e\x2f\x53\x8b\x00\x68\x40\xe2\xf8\xdc\x5d\x57\xe7\xee\xbb\x73\xf5\x40\x12\x59\x45\x95\x64\x37\xb6\xec\xf0\xea\x72\xde\x76\xd0\x1a\x88\xc5\xce\xf6\x3c\xf7\xaf\xff\x6d\xc5\xac\x74\xdf\xb9\xa7\xec\x33\x59\xa4\x12\xa3\x3d\xb9\x55\xb8\x6a\x4a\xdf\xc0\xa8\xec\xef\x2d\xa5\x7a\x1f\x1e\xb2\xe9\x01\xfd\x3a\xcd\xf4\xe2\xb8\x6c\x13\x6a\xf9\x30\xa3\x76\xe4\x66\x33\xb2\x81\xb9\x16\xe6\x5a\x98\x6b\x61\xae\x3d\x36\x73\x6d\x3b\x5f\xab\x46\x93\xed\xde\xdc\xe0\xe0\xad\xd8\x7a\xa2\x0e\xe9\xad\xb8\x37\x1b\xfb\x16\xfe\x81\x8d\x36\xe6\xbd\x8d\xc8\x97\xaa\xb2\x20\x8d\xa2\x4e\x32\x3c\xbb\x15\x53\xeb\x0c\x10\xec\x31\xa5\x28\xe1\x4e\x2f\x5a\x3a\x15\xff\xcc\x54\xa5\x17\xa9\x98\x71\x5a\xa0\x4e\xdc\xaf\xfa\x71\x5a\xdb\x6c\xd8\x1a\x4e\x4a\x94\xf3\xb9\x88\x25\x2f\x44\xb2\x2c\x29\x7d\x79\xe5\xca\xe4\xdc\x89\xf3\x34\xe8\x6c\x96\xf3\x88\x76\x8d\x54\x71\x10\x08\xca\x4b\x9b\x5c\x20\xfc\x2a\x5d\x68\xd3\xc8\xea\x74\x71\xf3\x4b\xdf\x21\xf7\x92\xa9\x3d\x03\xfd\x23\x26\xb6\x9d\x36\xfe\xa3\xa1\x8d\x3b\x4c\x33\xb5\xf9\x9a\x9a\xdc\xa4\x22\x3d\xa3\x24\x0d\x65\xf9\x6f\x83\x57\xda\x8d\xcb\x7a\xc4\xb2\xb7\xe5\x0f\xd8\x02\xd8\x02\xd8\x02\xd8\x02\xd8\xd2\x1b\x6c\x69\x79\x17\x3c\x01\x2e\xfb\xbb\x16\x7f\x14\x59\x2e\x8c\x50\x12\xff\x91\x65\x89\xe0\x5a\x84\x23\xe8\x3a\x57\x19\x9f\x91\x74\x74\xad\x12\x19\x2d\x6b\xae\x7d\x7e\xd1\xc5\xe1\x01\x66\xd9\xbd\x9d\xfc\xd7\x84\xdd\xd8\xf3\xcc\x8a\x2e\x99\x48\xcd\x66\x29\xef\x54\xc1\x54\x9e\xdd\xf1\xd4\xbb\x1a\xe6\x0b\x71\x39\xe5\x89\xd7\x95\xbf\xbe\xb6\x1f\x7f\x7d\xcd\xa6\x32\xe5\x89\xfc\x87\xbf\x48\x6e\x05\xe3\x31\x59\xe0\xd5\xa5\xb5\x4e\xc6\xa5\x1a\x66\x1f\x7f\xa6\xcb\x1f\x59\xfd\x74\xc2\xae\x24\x1d\x8e\x95\xa6\xab\xfc\x69\xdf\x4a\xde\x52\x58\xf5\x98\x74\x14\x55\xdc\xed\x32\xa1\xb6\x07\x3f\xfa\xbe\xaf\x15\x79\x76\x8a\x4e\xdd\x4a\x31\xa3\xae\x9b\x0d\x7b\xa7\x1e\xd9\x8c\xe7\xb7\x7c\x56\x33\x4e\x06\xa5\x46\xe4\x53\x95\xcf\xcd\x9c\x34\x8e\xd7\xa7\x95\x1e\xad\x1f\x2e\x12\x7a\xbd\xc4\x9a\xd9\xb1\x95\x46\x9a\x8c\x64\x5c\xaa\xc2\x24\x2b\xd8\x20\x62\x3f\xc7\xe6\xb2\x76\x37\xa9\x97\x06\x26\x95\xc9\xf4\xf7\x48\x00\x1e\xc1\x6d\xb6\xfe\xb2\x09\x7b\x17\x45\x22\xb3\x91\x4f\x55\xcd\xee\xcc\xf6\xe1\x8c\x5d\xb8\x05\x58\x5f\xa0\xfa\x7b\x76\xf6\x03\x8f\xee\x67\xb9\x5a\xa4\xb1\xf9\x16\xb9\xa0\xd2\x97\x56\x06\xce\x8a\x90\x4e\x3e\xae\x3f\xc4\xf7\xe0\x36\x3c\xe9\x7b\x76\xf6\x93\xca\x45\xe5\xb1\x2c\xe2\x3a\xe2\xb1\xe9\xbd\x1b\x1f\xeb\xa1\x4c\xcf\xd3\x56\xf5\x7c\xf2\xc0\x69\x78\xc6\x2e\x0b\x32\x5b\x5d\xee\x87\x91\x38\x8f\x98\x8c\xb6\x9b\x87\x4d\x74\xf4\x50\xb3\x00\x4e\xda\xdb\xfc\x3e\x65\xa5\xfb\xb3\x6d\x1c\x92\x9a\xb6\x1b\xac\x0d\xe4\xf4\xa5\xf2\x4f\x23\xa9\x43\x90\xe8\x96\x98\xce\x05\xe8\xb7\xe3\x73\x47\x15\x59\x65\xef\xe2\x52\x4e\xda\x5f\x94\xd5\x8e\x01\x56\x07\x8e\xbc\xdc\x29\xe8\x72\x17\x88\x8d\x20\xb1\xd3\x09\x12\x6b\x77\x8b\x3c\x17\x28\xb6\x3f\x75\x0b\x3e\x08\xf0\x41\x80\x0f\x02\x7c\x10\xe0\x83\xd0\x74\xf8\x02\x6e\x8f\x68\x44\xc0\x3b\xc1\x3b\xc1\x3b\xc1\x3b\xc1\x3b\xc1\x3b\x8f\x8b\x77\x02\x41\x00\x41\x00\x41\x00\x41\xf4\x8e\x20\xb6\xc0\xf4\x03\x0d\xe3\x6a\x37\x84\x4f\x43\xb9\x8e\x2a\xfd\xf6\xda\x1f\x20\x01\x1f\x19\xf1\x91\x7b\xaf\xe1\x6b\x43\xa1\x42\x3b\xa4\xdd\x1b\x4b\x28\xfe\xab\x95\x99\xea\xa3\xfa\x24\xa9\x29\x8c\x6f\x43\xbb\xec\x6f\xba\xe3\x5d\x03\xcd\x74\xfe\xa4\x6b\xed\x4e\x00\xc4\x11\x1d\x41\x1c\x11\xb2\x9e\x23\xeb\x79\x43\x63\x86\x2f\xaa\x8c\x23\x03\xfa\xee\xad\xfe\xfd\xb3\xad\xb6\x9e\xb1\x83\x6a\xf6\x31\xc9\x84\x24\x82\x0c\x54\x26\x7c\xc5\xda\x64\xc7\x70\xa5\x5a\xf7\x94\x24\x63\x2b\xc9\xaa\x9a\x18\x03\xe9\x30\x20\x4a\x1d\x83\x28\x85\x00\xe4\x13\x0a\x40\x46\xa4\x15\x22\xad\x10\x69\x85\x48\x2b\x68\x81\xeb\x76\xd1\xc0\xb4\x40\xe8\x53\xec\xb0\xfa\x94\x53\x3d\x06\xaa\x51\x05\xcb\x73\xe7\xb1\x17\xb9\xe0\xf1\x8a\x68\xb5\x85\xa2\x64\x7e\xdd\x5b\xc0\x45\x45\xe0\x10\xdf\xc8\x8d\xea\xd6\xfc\x8b\x47\xc5\x84\xb1\x2b\xf3\x5f\xff\xf7\x39\x97\x64\x91\xd3\x2c\x4a\x16\xba\x10\x79\x79\x8d\xb8\xc2\xc1\x89\xbc\x17\xec\x2c\xd4\xdb\x3a\x33\xd2\xa2\x97\x70\x26\xec\x3a\xe1\x69\xea\x2a\x3e\x93\x0c\xc2\x13\x2b\xf6\xbc\xfd\xc3\x2e\xe7\x32\xb5\xf1\x40\xd2\x41\x18\xb4\x20\x5c\xdf\xfa\xe1\x33\x3d\x65\x57\x76\xc4\xcc\x8d\x90\x69\x3f\x3a\xce\xd3\x88\xaa\x30\x47\x3c\xad\xc8\xc9\xcb\x9e\x07\xca\x34\xe6\x78\x81\xee\x91\x5f\x5b\xc7\x74\xfe\xcf\xc4\x60\xcd\x69\x2f\x41\xac\x84\x4b\x9c\xd9\x63\x73\x2b\xa4\x2f\x31\x7d\xd7\x0c\x54\xe9\xbf\xb5\x4f\x36\x90\xbf\x9e\xd3\x34\x8f\x17\x1c\x93\xfb\x45\xab\x0b\x7c\xf5\x6c\xba\xa0\xdf\xfe\xdb\xe6\x63\x6a\x2e\xf2\x99\x68\xf5\x4d\x5d\xe4\xbc\x10\x33\x19\x5d\xb4\xff\x0d\x55\xd1\x77\xdf\xa4\x03\xb1\x8d\x80\x91\xf1\xbc\x90\x14\x1d\x65\x5d\x85\x76\x17\x36\xe8\xc5\x87\x36\xca\xf6\x85\xbb\x37\x98\x6c\xaf\xeb\x3e\x3b\x0c\xa6\xda\x23\x37\xd5\x9e\x0e\xf5\x5e\x89\x34\xf0\x9b\xcb\x46\xc3\x98\xd3\xa6\x8c\xb0\xfe\x6e\xcd\x49\xf4\x86\x0c\x55\x36\x04\x96\x27\xf4\xcb\x54\xa5\x17\xf6\xd7\xf4\x0d\xb2\x15\x6b\xf6\xdd\x7f\x6b\x95\x5e\xdb\x40\xe3\x8f\xe6\xcc\x73\xff\xbe\xf1\x27\x61\xf9\xc7\x37\x43\xc2\xf1\xed\xd7\xcd\x4f\x2a\x8f\xc8\x98\x3e\x53\x34\xf9\x8a\x7d\x7d\x3d\x35\x7f\xfb\xfa\x9a\xbd\xab\x8d\x26\xf9\x31\x5b\xcb\x37\x09\xfd\x6e\xa3\x5e\xf0\x88\x26\x80\x42\x55\x13\x19\x39\x5b\x1e\xe9\x08\xea\xd1\xcd\xad\x0d\xe5\xcc\x84\xca\x12\x31\x61\xf6\x9d\x14\xa1\xee\xd7\x14\x79\x13\x37\x4e\x44\x78\xfd\x2e\xc3\x6b\x5e\x04\x55\xc1\x7e\x00\x55\xe1\x90\xe8\x7d\xc5\x03\x77\xa0\xca\xc2\xa2\x73\x4b\x51\x96\xf0\xe8\x05\xf2\x9b\x7b\xc0\xb1\x4a\x70\x70\x58\x84\xe8\x76\x42\xa2\xdb\x80\x24\x24\x5c\xe4\xe1\x13\x38\x2c\x36\xb6\xfa\xa8\xc4\x8f\xc5\x60\x2d\x95\xaf\xd8\x16\x8e\x7f\x97\xda\xa6\x7c\xab\xf8\xff\xf5\x43\xb7\xec\x7b\xfc\xb5\xd4\x31\xe7\x72\x79\xeb\x70\xf0\x60\x0b\x37\xfc\x00\xb0\x01\xb0\x01\xb0\xe1\x80\xb0\xa1\x83\xb3\x7f\x03\x76\x68\x38\xfc\x47\xa9\xba\x02\x3e\x40\x83\x3d\x3d\x0d\x16\xf0\xa1\xcb\x75\x03\xf8\x00\x9b\x05\x54\x07\xc0\x07\xfa\x62\x6f\xf0\xa1\x13\x5d\x7e\x03\x86\x38\x16\x89\x0e\x30\x02\xa2\xdc\x09\x89\x72\x03\x92\x98\x70\xb1\x87\x4f\x00\x23\x1a\x5b\x7d\x54\xe2\xc8\xd8\x60\x84\x8a\xfb\x25\x0e\xcf\xd4\x32\x51\xf1\x06\xc9\xa4\x52\xbe\x44\xc5\x3f\xa9\xfc\x5d\x92\x84\x88\x95\x41\x20\x86\xb5\x3f\x38\xd5\x04\x75\x2a\x46\x4e\xba\x86\xaf\xbd\x7c\xe7\xab\x78\x7f\xd8\x02\x85\x7d\x8e\xb8\xb0\xcf\xf3\x0c\xe6\xb9\xa2\x3e\x1b\xed\x3c\x1d\xf0\x25\x94\xf2\x41\x29\x1f\x94\xf2\x41\x29\x9f\x63\x2b\xe5\xf3\xfc\xc9\xdb\x58\xc6\xa7\x67\x9a\xbf\xb7\xe2\x3d\xcf\x77\x7f\x7d\xe1\x9e\x21\x8f\xc1\x36\xe5\x7a\x9e\x1f\x83\xf5\xa5\x7a\x7a\x1e\x03\x14\xe8\x41\x81\x1e\x14\xe8\x41\x81\x1e\x14\xe8\xe9\xad\x40\x4f\x8b\xd3\xff\x49\x71\x9e\x8d\x09\xf2\x4e\xc8\x99\xaf\x5d\x6f\x8e\xb8\xc0\xd0\xf3\xc3\xbd\xa9\xb8\xd0\x7e\xc7\x1d\x25\x85\x7a\x99\xd1\xa7\xe5\x84\x7a\x9e\xd6\x83\x16\x11\x7a\x7e\x78\x36\x14\x10\xea\xfb\xd8\x1c\x6a\xd9\xa0\xe7\x07\xad\x81\x46\xec\x6c\xcf\x73\xff\xfa\xdf\x75\x64\xa9\x10\xf3\x8c\x2c\x12\x87\x25\x4c\x5f\x5c\x33\xda\x92\x26\xff\x7d\x10\xa7\xd5\x91\x1f\x24\x71\xf2\xd3\x05\xf2\xd4\xf0\xb5\x2e\xc8\x53\xc3\xfe\x01\x81\x02\x81\x02\x81\x02\x81\x02\x81\x02\x81\x02\x81\x02\x81\x02\x81\x02\x81\x02\x81\x02\x81\x02\x81\x02\x81\x02\x81\x02\x81\xda\xe2\xd8\x07\x81\x02\x81\x02\x81\x1a\xc7\x8c\x82\x40\xd5\x87\x07\x04\x6a\xc8\x04\x2a\x17\x81\x79\x18\x79\x23\x57\xe6\xb6\x3f\x24\x8b\xfa\x5c\x36\xe8\x7d\x68\x50\x2b\x2a\xd5\xf8\x4b\xf0\xa9\xd5\xd9\x18\x1e\x9f\x6a\x9c\x38\x90\xaa\x86\xaf\xbd\x98\x54\x3d\xb7\xbb\xc0\xac\xc0\xac\xc0\xac\xc0\xac\xc0\xac\xc0\xac\xc0\xac\xc0\xac\xc0\xac\xc0\xac\xc0\xac\xc0\xac\xc0\xac\xc0\xac\xc0\xac\xc0\xac\xb6\x38\xf6\xc1\xac\xc0\xac\xc0\xac\xc6\x31\xa3\x60\x56\xf5\xe1\x01\xb3\x1a\x36\xb3\xb2\xed\xfc\xbf\x85\x2a\xf8\x61\x59\x95\x6d\xc8\xff\x98\x86\xb4\x64\x54\x95\x5f\x80\x4d\xad\x8e\xfe\x10\xd9\x54\x65\xc2\xc0\xa4\x1a\xbe\xd6\x01\x93\x6a\xde\x45\x60\x51\x60\x51\x60\x51\x60\x51\x60\x51\x60\x51\x60\x51\x60\x51\x60\x51\x60\x51\x60\x51\x60\x51\x60\x51\x60\x51\x60\x51\x60\x51\x5b\x1c\xfb\x60\x51\x60\x51\x60\x51\xe3\x98\x51\xb0\xa8\xfa\xf0\x80\x45\x0d\x99\x45\x69\x11\xe5\xa2\x38\x24\x84\xba\xa1\x16\xb4\xa2\x4f\xf6\xab\xc0\x4e\xab\xe3\x3d\x3c\xec\x64\x67\x0a\xbc\xa9\xe1\x6b\x2f\xe6\x4d\x4f\x36\x0c\x40\x13\x40\x13\x40\x13\x40\x13\x40\x13\x40\x13\x40\x13\x40\x13\x40\x13\x40\x13\x40\x13\x40\x13\x40\x13\x40\x13\x40\x13\x40\xd3\x16\xc7\x3e\x40\x13\x40\x13\x40\xd3\x38\x66\x14\xa0\xa9\x3e\x3c\x00\x4d\xc3\x06\x4d\xf9\x83\x8c\x04\x8f\x22\x23\x32\x1f\x16\x38\x51\x4b\xde\xd9\x96\xb4\x04\x4f\xd5\x9f\x00\x40\xad\x8e\xff\x10\x01\x54\x75\xc6\x00\xa2\x1a\xbe\xd6\x01\x88\x5a\xb3\x91\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\xb6\x38\xf6\x01\xa4\x00\xa4\x00\xa4\xc6\x31\xa3\x00\x52\xf5\xe1\x01\x90\x1a\x01\x90\x1a\x00\x89\xda\x06\x41\x81\x3d\xad\x8e\xf8\x60\xd9\x13\xa0\x53\xc3\xd7\xba\x82\x4e\xa0\x4d\xa0\x4d\xa0\x4d\xa0\x4d\xa0\x4d\xa0\x4d\xa0\x4d\xa0\x4d\x1d\x9d\xb6\xa0\x4d\xa0\x4d\xa0\x4d\xa0\x4d\xa0\x4d\xa0\x4d\xa0\x4d\xa0\x4d\xa0\x4d\xa0\x4d\xa0\x4d\x83\x9c\x51\xd0\xa6\xfa\xf0\x80\x36\x0d\x99\x36\xd1\x8b\x2e\xad\x61\x68\xce\xb3\x7e\xa9\x93\x13\xf0\xd2\x58\x3e\xc8\x78\xc1\x93\xea\xb4\xf0\xa0\xc4\xbd\xa7\xc6\x7c\xe4\xd9\x84\xc5\x22\xcb\x45\x64\xee\xeb\x3f\x06\x29\xfb\x8c\x9e\x72\x56\x9a\xec\x6a\x36\x98\xc0\xa9\x98\x4c\x75\x21\x78\xed\x3a\x5c\xa5\x58\xf4\x24\x8b\xb1\xc2\x4b\x3f\x48\x8d\x40\xaa\x27\x13\x39\x18\x98\x35\xe7\xd1\x9d\x4c\x45\xbe\x9c\x64\xf7\x33\xf3\x07\x3d\x31\x7a\xe8\xe4\xe1\xed\x84\x76\xfb\x95\x51\xe8\x4e\x91\x6e\xd1\xe4\xf5\x8b\xb8\xc2\x1e\x01\xe4\x02\xe4\x02\xe4\x02\xe4\x02\xe4\x02\xe4\x02\xe4\x02\xe4\xea\xe8\xb4\x05\xe4\x02\xe4\x02\xe4\x02\xe4\x02\xe4\x02\xe4\x02\xe4\x02\xe4\x02\xe4\x02\xe4\x02\xe4\x1a\xe4\x8c\x02\x72\xd5\x87\x07\x90\x6b\xf8\x90\x4b\xa4\x71\xa6\x64\xdf\x39\xfe\xda\x31\xae\x2b\xdf\x96\x7d\x32\xae\xf0\x52\x30\xae\xa6\x89\x04\xe3\x02\xe3\x7a\x1d\xf6\x08\x18\x17\x18\x17\x18\x17\x18\x17\x18\x17\x18\x17\x18\x17\x18\x57\x47\xa7\x2d\x18\x17\x18\x17\x18\x17\x18\x17\x18\x17\x18\x17\x18\x17\x18\x17\x18\x17\x18\x17\x18\xd7\x20\x67\x14\x8c\xab\x3e\x3c\x60\x5c\x23\x60\x5c\x64\x28\x1e\x02\xe0\x32\x0d\xd9\x2b\xdc\x32\x2f\x04\xd8\x6a\x9a\x40\x80\x2d\x80\xad\xd7\x76\x6c\x01\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x06\x00\x74\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\xea\xbd\x01\xd4\x02\xd4\x02\xd4\x02\xd4\x02\xd4\x3a\x5d\xa8\x45\x8b\x23\xa7\x21\x1a\x00\xd9\xfa\x60\x5a\xf3\xd9\x7c\xb0\x4f\xbc\x55\xbe\x15\x8c\xab\x69\x2a\xc1\xb8\xc0\xb8\x5e\x97\x9b\x04\xa0\x0b\xa0\x0b\xa0\x0b\xa0\x0b\xa0\x0b\xa0\x0b\xa0\x0b\xa0\xab\xa3\xd3\x16\xa0\x0b\xa0\x0b\xa0\x0b\xa0\x0b\xa0\x0b\xa0\x0b\xa0\x0b\xa0\x0b\xa0\x0b\xa0\x0b\xa0\x6b\x90\x33\x0a\xd0\x55\x1f\x1e\x80\xae\xe1\x83\xae\xb4\x04\x3a\x87\xe7\x5c\x81\x2e\xed\x13\x73\x85\x97\x7e\x58\x01\x05\xa0\x5a\xa0\x5a\xec\x34\xa9\x56\xd8\x13\x80\x5a\x80\x5a\x80\x5a\x80\x5a\x80\x5a\x80\x5a\x80\x5a\x80\x5a\x1d\x9d\xb6\x80\x5a\x80\x5a\x80\x5a\x80\x5a\x80\x5a\x80\x5a\x80\x5a\x80\x5a\x80\x5a\x80\x5a\x80\x5a\x83\x9c\x51\x40\xad\xfa\xf0\x00\x6a\x8d\x09\x6a\x5d\xfe\x33\xfc\xfb\x5f\x97\xd6\x5e\x34\xe7\xd9\x10\x58\xd7\x7b\x6a\xcc\x47\x9e\x1d\x84\x75\xc5\xe1\xf5\xa0\x5e\xa0\x5e\xa0\x5e\xb4\x51\xc2\x9e\x00\xf5\x02\xf5\x02\xf5\x02\xf5\x02\xf5\x02\xf5\x02\xf5\x02\xf5\xea\xe8\xb4\x05\xf5\x02\xf5\x02\xf5\x02\xf5\x02\xf5\x02\xf5\x02\xf5\x3a\x39\xea\xe5\x7a\x6d\x1a\x40\x53\xc9\x17\xc5\x1d\xd3\x91\xca\xc4\x39\xd3\x8b\xe8\xce\xcc\x3c\xe9\x2b\x82\xcf\xad\xfd\x36\xcb\x15\x8d\x72\x53\xd7\x32\x5e\xdc\x35\xf7\x2c\x6d\x76\xde\x35\xeb\xcf\x48\xfa\xae\xf5\x7b\xbc\xef\x80\xfb\x80\xfb\x80\xfb\xc6\x31\xa3\xc0\x7d\xf5\xe1\x01\xee\x3b\x02\xdc\x67\xff\xfc\xaf\x3d\x50\xbf\x2a\xea\x4b\xbd\x9c\xa3\xa6\xec\x5e\xa6\x71\xc7\xc8\xef\xbc\xd4\x6b\x48\x77\x73\x32\xb0\x51\x8d\x4a\x85\xed\xac\xa6\xe8\x57\x9e\xbd\x3b\x30\x04\x2c\x04\x2c\x1c\x05\x2c\x04\x28\x04\x28\x04\x28\x04\x28\x04\x28\x04\x28\x04\x28\x04\x28\x04\x28\x04\x28\x04\x28\x04\x28\x04\x28\x04\x28\x04\x28\x04\x28\x6c\x7b\xfa\xef\x1d\x14\x12\x21\x74\x23\xb0\xc6\xd4\xd0\x86\x01\x0e\x05\xff\x81\x7b\x82\x7b\x82\x7b\x82\x7b\x0e\x7a\x46\xc1\x3d\xeb\xc3\x03\xee\x39\x5a\xee\x29\xd2\x38\x53\x32\x2d\x86\x10\xe5\x78\xe5\xdb\x72\x98\x28\xc7\xf0\x7a\x44\x39\x02\x5c\x8e\x06\x5c\xf6\x1b\xe5\x18\xf6\x04\xe0\x25\xe0\x25\xe0\x25\xe0\x25\xe0\x25\xe0\x25\xe0\x25\xe0\x65\x47\xa7\x2d\xe0\x25\xe0\x25\xe0\x25\xe0\x25\xe0\x25\xe0\x25\xe0\xe5\xc9\xc1\x4b\xd0\x3e\xd0\x3e\xd0\x3e\xd0\xbe\x41\xcf\x28\x68\x5f\x7d\x78\x40\xfb\xc6\x4f\xfb\x06\x12\xe4\xd8\x2d\xf1\xdb\x73\x90\x63\x13\x1b\x01\x2b\x04\x2b\x5c\x79\xea\x80\x58\x21\x38\x21\x38\x21\x38\x21\x38\x21\x38\x21\x38\x21\x38\x21\x38\x21\x38\x21\x38\x21\x38\x21\x38\x21\x38\x21\x38\x21\x38\x21\x38\x61\xdb\xd3\xff\xa0\x41\x8e\x6b\x4c\x0d\x08\x72\x6c\xee\x33\xb0\x27\xb0\x27\xb0\x27\xb0\x27\xb0\x27\xb0\xe7\xc9\x62\x4f\xe2\x00\x43\x88\x70\x34\x0d\x39\x50\x74\xa3\x79\x35\x22\x1b\x41\x2b\x47\x43\x2b\x7b\x8e\x6c\xa4\xb1\x05\xad\x04\xad\x04\xad\x04\xad\x04\xad\x04\xad\x04\xad\x04\xad\x1c\x00\xa9\x03\xad\x04\xad\x04\xad\x04\xad\x04\xad\x04\xad\x04\xad\x1c\x23\xad\x04\xde\x03\xde\x03\xde\x03\xde\x1b\xf4\x8c\x02\xef\xd5\x87\x07\x78\x6f\xe4\x78\x6f\x28\x21\x8d\x9d\x21\xbe\x7d\x87\x33\xae\x00\x11\xc0\x41\xc0\xc1\x95\xa7\x0e\x08\x0e\x02\x0c\x02\x0c\x02\x0c\x02\x0c\x02\x0c\x02\x0c\x02\x0c\x02\x0c\x02\x0c\x02\x0c\x02\x0c\x02\x0c\x02\x0c\x02\x0c\x02\x0c\x02\x0c\x0e\x12\x0c\xd6\xc2\x18\x9f\x9a\x19\x10\xc2\xd8\xdc\x67\x30\x4e\x30\x4e\x30\x4e\x30\x4e\x30\x4e\x30\xce\x53\x65\x9c\xb4\x66\x72\x1a\xb9\x01\xc4\x31\x7e\x30\xad\xf9\x6c\x3e\x38\x4c\x30\x63\xf9\x7e\x44\x34\x02\x5a\x8e\x06\x5a\xf6\x1b\xd1\x58\x6e\x0a\xd0\x4b\xd0\x4b\xd0\x4b\xd0\x4b\xd0\x4b\xd0\x4b\xd0\x4b\xd0\xcb\x8e\x4e\x5b\xd0\x4b\xd0\x4b\xd0\x4b\xd0\x4b\xd0\x4b\xd0\x4b\xd0\xcb\x93\xa3\x97\x40\x7e\x40\x7e\x40\x7e\x40\x7e\x83\x9e\x51\x20\xbf\xfa\xf0\x00\xf9\x1d\x03\xf2\x1b\x48\x6c\x63\xc7\xd8\x6f\xcf\x01\x8e\x8d\x7c\x04\xc0\x10\xc0\x70\xe5\xa9\x03\x02\x86\x80\x85\x80\x85\x80\x85\x0c\xb0\x10\xb0\x10\xb0\x10\xb0\x10\xb0\x10\xb0\x10\xb0\x10\xb0\x10\xb0\x10\xb0\x10\xb0\x10\xb0\x10\xb0\xb0\xed\xe9\x7f\xd0\x50\xc7\x75\xb6\x06\xc4\x3b\x36\xf7\x19\xf0\x13\xf0\x13\xf0\x13\xf0\x13\xf0\x13\xf0\xf3\x54\xe1\x67\x66\x1a\x4f\x32\xe1\x83\x4a\x16\x73\x11\x25\x5c\xce\x87\x10\xfa\x78\x1d\x1a\xf6\x2b\x35\xec\xbd\x69\xd8\x61\xa2\x20\x1b\x9b\x82\x80\x48\xf0\xcd\xd1\xf0\xcd\x7e\x03\x22\x1b\xf7\x07\x70\x27\x70\x27\x70\x27\x70\x27\x70\x27\x70\x27\x70\x27\x70\x67\x47\xa7\x2d\x70\x27\x70\x27\x70\x27\x70\x27\x70\x27\x70\x27\x70\xe7\xc9\xe1\x4e\xe0\x41\xe0\x41\xe0\x41\xe0\xc1\x41\xcf\x28\xf0\x60\x7d\x78\x80\x07\x8f\x0c\x0f\x0e\x24\x4c\xb2\x3f\x44\xb8\xe7\x88\xc9\xe7\x00\x0a\xe0\x22\xe0\xe2\xca\x53\x07\x04\x17\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x47\x01\x16\xab\x71\x94\x2d\xcc\x0e\x08\xa9\x6c\xee\x33\x98\x29\x98\x29\x98\x29\x98\x29\x98\x29\x98\xe9\xc9\x32\x53\x15\x0f\x22\x80\x52\xc5\x07\x0a\x97\x54\x31\x82\x23\xc1\x2f\x47\xc3\x2f\x7b\x0e\x8e\x54\x31\x88\x25\x88\x25\x88\x25\x88\x25\x88\x25\x88\x25\x88\x25\x88\x65\x47\xa7\x2d\x88\x25\x88\x25\x88\x25\x88\x25\x88\x25\x88\x25\x88\xe5\xc9\x11\x4b\x60\x3d\x60\x3d\x60\x3d\x60\xbd\x41\xcf\x28\xb0\x5e\x7d\x78\x80\xf5\x46\x8d\xf5\x86\x12\xf8\xd8\x11\xda\xdb\x77\x98\x63\x0d\x85\x00\x0a\x02\x0a\xae\x3c\x75\x40\x50\x10\x40\x10\x40\x10\x40\x10\x40\x10\x40\x10\x40\x10\x40\x10\x40\x10\x40\x10\x40\x10\x40\x10\x40\x10\x40\x10\x40\x10\x40\x10\x40\x70\x80\x40\xb0\x16\xc2\xb8\x6a\x64\x40\xc0\x62\x73\x9f\x41\x36\x41\x36\x41\x36\x41\x36\x41\x36\x41\x36\x4f\x98\x6c\x16\x62\x9e\x91\xc1\x69\x18\x81\x8b\x5f\x5c\x73\x0e\x16\xc0\xe8\x1b\x80\x40\x46\x30\xcb\xd1\x30\xcb\xde\x03\x19\xfd\xae\x00\xbf\x04\xbf\x04\xbf\x04\xbf\x04\xbf\x04\xbf\x04\xbf\x04\xbf\xec\xe8\xb4\x05\xbf\x04\xbf\x04\xbf\x04\xbf\x04\xbf\x04\xbf\x04\xbf\x3c\x39\x7e\x09\xec\x07\xec\x07\xec\x07\xec\x37\xe8\x19\x05\xf6\xab\x0f\x0f\xb0\xdf\x51\x60\xbf\xe1\x04\x36\x76\x8a\xfe\xf6\x1f\xe0\xd8\x80\x48\x00\x0d\x01\x0d\x57\x9e\x3a\x20\x68\x08\x60\x08\x60\x08\x60\x68\x3f\x04\x30\x04\x30\x04\x30\x04\x30\x04\x30\x04\x30\x04\x30\x04\x30\x04\x30\x04\x30\x04\x30\x04\x30\x04\x30\x1c\x24\x30\x5c\x09\x78\x6c\x36\x36\x20\xf0\xb1\xb9\xcf\x20\xa0\x20\xa0\x20\xa0\x20\xa0\x20\xa0\x20\xa0\xa7\x4a\x40\x73\x11\x40\x97\x11\x2b\x73\x65\x84\xba\x21\x84\x40\x7e\x2e\x1b\xf6\x3e\x34\xec\x30\xc1\x90\x8d\x4d\x41\x58\x24\x08\xe7\x68\x08\x67\xbf\x61\x91\x8d\xfb\x03\xbc\x13\xbc\x13\xbc\x13\xbc\x13\xbc\x13\xbc\x13\xbc\x13\xbc\xb3\xa3\xd3\x16\xbc\x13\xbc\x13\xbc\x13\xbc\x13\xbc\x13\xbc\x13\xbc\xf3\xe4\x78\x27\xf0\x20\xf0\x20\xf0\x20\xf0\xe0\xa0\x67\x14\x78\xb0\x3e\x3c\xc0\x83\x47\x86\x07\x07\x12\x2a\xd9\x1f\x22\xdc\x73\xd0\xe4\x73\x00\x05\x70\x11\x70\x71\xe5\xa9\x03\x82\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x8b\xa3\x00\x8b\xd5\x40\xca\x16\x66\x07\x84\x54\x36\xf7\x19\xcc\x14\xcc\x14\xcc\x14\xcc\x14\xcc\x14\xcc\xf4\x74\x99\xa9\xed\xc4\xff\x2d\x54\xc1\x87\x11\x4a\x69\x1b\xf4\x3f\xa6\x41\x87\x0a\xa1\xac\x34\x01\xa1\x93\xa0\x9b\xa3\xa1\x9b\x7d\x87\x4e\x56\xf6\x05\xc8\x26\xc8\x26\xc8\x26\xc8\x26\xc8\x26\xc8\x26\xc8\x26\xc8\x66\x47\xa7\x2d\xc8\x26\xc8\x26\xc8\x26\xc8\x26\xc8\x26\xc8\x26\xc8\xe6\xc9\x91\x4d\xe0\x3f\xe0\x3f\xe0\x3f\xe0\xbf\x41\xcf\x28\xf0\x5f\x7d\x78\x80\xff\x8e\x04\xff\x0d\x26\x54\xb2\x6b\x04\xb8\xf7\x10\xc9\x66\x50\x02\x78\x08\x78\xb8\xf2\xd4\x01\xc1\x43\x80\x43\x80\x43\x80\x43\xff\x21\xc0\x21\xc0\x21\xc0\x21\xc0\x21\xc0\x21\xc0\x21\xc0\x21\xc0\x21\xc0\x21\xc0\x21\xc0\x21\xc0\x21\xc0\xe1\x20\xc1\x61\x3d\x24\x72\xad\xb9\x01\xa1\x90\xcd\x7d\x06\x0b\x05\x0b\x05\x0b\x05\x0b\x05\x0b\x05\x0b\x3d\x55\x16\xaa\x45\x94\x8b\x62\x08\x31\x90\x37\xd4\x92\xc3\x04\x3f\xda\x77\x23\xea\x11\xe0\x72\x34\xe0\xb2\xdf\xa8\x47\xbb\x21\x40\x2d\x41\x2d\x41\x2d\x41\x2d\x41\x2d\x41\x2d\x41\x2d\x41\x2d\x3b\x3a\x6d\x41\x2d\x41\x2d\x41\x2d\x41\x2d\x41\x2d\x41\x2d\x41\x2d\x4f\x8e\x5a\x02\xf1\x01\xf1\x01\xf1\x01\xf1\x0d\x7a\x46\x81\xf8\xea\xc3\x03\xc4\x37\x76\xc4\x37\x90\x38\xc7\x0e\x31\xdf\x9e\x03\x1c\x9f\x30\x11\x00\x42\x00\xc2\x95\xa7\x0e\x08\x10\x02\x0e\x02\x0e\x02\x0e\x02\x0e\x02\x0e\x02\x0e\x02\x0e\x02\x0e\x02\x0e\x02\x0e\x02\x0e\x02\x0e\x02\x0e\x02\x0e\x02\x0e\x02\x0e\x0e\x13\x0e\x56\x43\x1a\x9b\xec\x0c\x88\x65\x6c\xee\x33\x40\x27\x40\x27\x40\x27\x40\x27\x40\x27\x40\xe7\xe9\x82\xce\xfc\x41\x46\x82\x47\x91\x51\x8a\x86\x11\xd3\x48\x2d\x7a\x67\x5b\x74\xa8\xd8\xc6\x6a\x1b\x10\xe3\x08\x84\x39\x1a\x84\xd9\x77\x8c\x63\x75\x63\x00\x67\x02\x67\x02\x67\x02\x67\x02\x67\x02\x67\x02\x67\x02\x67\x76\x74\xda\x02\x67\x02\x67\x02\x67\x02\x67\x02\x67\x02\x67\x02\x67\x9e\x1c\xce\x04\x02\x04\x02\x04\x02\x04\x02\x1c\xf4\x8c\x02\x01\xd6\x87\x07\x08\xf0\x58\x10\xe0\x60\x62\x1e\x3b\xc7\x80\x7b\x8f\x7d\x5c\xc3\x4a\x00\x10\x01\x10\x57\x9e\x3a\x20\x80\x08\x78\x08\x78\x08\x78\x18\x3e\x04\x3c\x04\x3c\x04\x3c\x04\x3c\x04\x3c\x04\x3c\x04\x3c\x04\x3c\x04\x3c\x04\x3c\x04\x3c\x04\x3c\x04\x3c\x1c\x24\x3c\xac\xc7\x42\xae\xb7\x37\x20\x26\xb2\xb9\xcf\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x27\x0e\x44\x07\x14\x0c\x79\xd0\x28\x48\x84\x3f\x82\x5e\x8e\x86\x5e\xee\x25\xfc\x11\xe8\x12\xe8\x12\xe8\x12\xe8\x12\xe8\x12\xe8\x12\xe8\x12\xe8\xb2\xa3\xd3\x16\xe8\x12\xe8\x12\xe8\x12\xe8\x12\xe8\x12\xe8\x12\xe8\xf2\xe4\xd0\x25\x30\x1f\x30\x1f\x30\x1f\x30\xdf\xa0\x67\x14\x98\xaf\x3e\x3c\xc0\x7c\xa3\xc7\x7c\xc3\x0a\x78\x1c\x71\xa4\x23\x20\x21\x20\xe1\x28\x20\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\xe1\x40\x01\x61\x43\x6c\x23\x82\x1a\x41\x3b\x41\x3b\x07\xc2\xc6\x40\x3b\x41\x3b\x41\x3b\x41\x3b\x57\x06\xed\xc0\xb4\xf3\xe0\x60\x33\x70\xc2\x11\xa2\x4d\x20\x4d\x20\xcd\x13\x47\x9a\x4d\x7b\x01\x50\x13\x50\x13\x50\x13\x50\x13\x50\x13\x50\x13\x50\x13\x50\x13\x50\x13\x50\x13\x50\x13\x50\x13\x50\x13\x50\x13\x50\x13\x50\x73\x8b\x63\xbf\x0a\x35\xd7\x98\x1a\xc6\x84\x35\x41\xf7\x40\xf7\x40\xf7\xc6\x31\xa3\xa0\x7b\xf5\xe1\x01\xdd\x1b\x01\xdd\x53\xf1\x20\x12\x93\xfe\x55\xc5\xfb\xcd\x4a\xaa\x62\x24\x22\x65\x00\x72\xa3\x01\x72\xfd\x26\x22\x35\xdb\x01\x3c\x0e\x3c\x0e\x3c\x0e\x3c\x0e\x3c\x0e\x3c\x0e\x3c\x0e\x3c\xae\xa3\xd3\x16\x3c\x0e\x3c\x0e\x3c\x0e\x3c\x0e\x3c\x0e\x3c\x0e\x3c\xee\xe4\x78\x1c\x00\x16\x00\x16\x00\xd6\x38\x66\x14\x00\xab\x3e\x3c\x00\x58\x23\x01\x58\x43\x89\x4c\xeb\x0a\x62\xed\x27\x28\xad\x6e\xf3\x07\xfe\x02\xfe\x5a\x79\xea\x80\xf0\x17\xd0\x17\xd0\x17\xd0\x17\xd0\x17\xd0\x17\xd0\x17\xd0\x17\xd0\x17\xd0\x17\xd0\x17\xd0\x17\xd0\x17\xd0\x17\xd0\x17\xd0\x17\xd0\xd7\x10\xd1\x57\x2d\x14\xed\x89\x95\x01\x51\x68\x80\x78\x87\x47\x3e\x80\x78\x80\x78\x80\x78\x80\x78\x2b\x83\xb6\x67\x88\x97\x99\x56\x92\xf4\xf3\xa0\x92\xc5\x5c\x44\x09\x97\xf3\x21\x84\xa5\x5d\x87\x86\xfd\x4a\x0d\x7b\x6f\x1a\xb6\xcf\x38\xb5\xc6\x06\x7c\x90\xba\xf8\x49\xe5\xef\x92\x24\x44\xb8\x6b\x90\x3c\x90\xbc\x51\x90\xbc\x7e\x03\xd9\x1a\xf7\x0b\xf0\x1e\xf0\x1e\xf0\x1e\xf0\x1e\xf0\x1e\xf0\x1e\xf0\x1e\xf0\x5e\x47\xa7\x2d\xf0\x1e\xf0\x1e\xf0\x1e\xf0\x1e\xf0\x1e\xf0\x1e\xf0\xde\xc9\xe1\x3d\x40\x31\x40\x31\x40\xb1\x71\xcc\x28\xa0\x58\x7d\x78\x00\xc5\xc6\x07\xc5\x86\xc8\xc3\x0e\x89\xc2\x90\xbe\x11\xd4\x0b\xd4\xab\x91\x7a\x01\x78\x01\x78\x01\x78\x01\x78\x01\x78\x01\x78\x01\x78\x01\x78\x75\x74\xda\x02\x78\x01\x78\x01\x78\x01\x78\x01\x78\x01\x78\x01\x78\x01\x78\x01\x78\x01\x78\x01\x78\x0d\x72\x46\x01\xbc\xea\xc3\x03\xe0\x35\x42\xe0\x35\x90\xb4\x8e\xbd\x40\xaf\xbd\xa4\x78\xdc\xc0\x05\x80\xcb\x80\xcb\x56\x9e\x3a\x20\x5c\x06\x54\x06\x54\x06\x54\x56\xf9\x10\xa8\x0c\xa8\x0c\xa8\x0c\xa8\x0c\xa8\x0c\xa8\x0c\xa8\x0c\xa8\x0c\xa8\x0c\xa8\x0c\xa8\x0c\xa8\x0c\xa8\x6c\x90\xa8\xac\x9a\xfa\x71\xb3\xc5\x01\x69\x20\x01\x00\x0f\x8f\x8b\x00\x00\x01\x00\x01\x00\x01\x00\x57\x06\x6d\xdf\x00\x50\xc5\x83\x08\x72\x53\xf1\x5e\xe3\xda\x54\x8c\x84\x8e\x4d\x93\x07\x56\x37\x0a\x56\xd7\x73\x68\x9b\x8a\x81\xe8\x80\xe8\x80\xe8\x80\xe8\x80\xe8\x80\xe8\x80\xe8\x80\xe8\x3a\x3a\x6d\x81\xe8\x80\xe8\x80\xe8\x80\xe8\x80\xe8\x80\xe8\x80\xe8\x4e\x0e\xd1\x01\x66\x01\x66\x01\x66\x8d\x63\x46\x01\xb3\xea\xc3\x03\x98\x35\x0a\x98\x55\x88\x79\x46\x76\x89\x61\x40\xad\x2f\xae\x39\x7b\x86\x5b\xfe\xb5\x80\x5c\x4d\x93\x09\xc8\x05\xc8\xf5\xba\xb2\x4b\x00\xbb\x00\xbb\x00\xbb\x00\xbb\x00\xbb\x00\xbb\x00\xbb\x00\xbb\x3a\x3a\x6d\x01\xbb\x00\xbb\x00\xbb\x00\xbb\x00\xbb\x00\xbb\x00\xbb\x00\xbb\x00\xbb\x00\xbb\x00\xbb\x06\x39\xa3\x80\x5d\xf5\xe1\x01\xec\x1a\x3e\xec\xca\x45\x60\x21\x46\xea\xc8\x95\xb9\xf3\x87\x80\xbd\x3e\x97\x0d\x7b\x1f\x1a\xb6\x4f\x00\xd6\xd8\x00\xa0\xb0\xa6\x09\x06\x0a\x03\x0a\x7b\xdd\xb8\x5f\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x3a\x3a\x6d\x01\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x06\x39\xa3\x80\x62\xf5\xe1\x01\x14\x1b\x03\x14\xb3\xad\xfd\xbf\x85\x2a\xf8\x30\x60\x98\x6d\xd0\xff\x98\x06\xed\x17\x82\x55\x5e\x0c\xf8\xd5\x34\xa1\x80\x5f\x80\x5f\xaf\x6b\xfb\x04\xd0\x0b\xd0\x0b\xd0\x0b\xd0\x0b\xd0\x0b\xd0\x0b\xd0\x0b\xd0\xab\xa3\xd3\x16\xd0\x0b\xd0\x0b\xd0\x0b\xd0\x0b\xd0\x0b\xd0\x0b\xd0\x0b\xd0\x0b\xd0\x0b\xd0\x0b\xd0\x6b\x90\x33\x0a\xe8\x55\x1f\x1e\x40\xaf\xe1\x43\x2f\x2d\xa2\x5c\x14\x43\xa0\x5d\x37\xd4\x92\x7d\x62\x2e\xfb\x46\xf0\xad\xa6\x29\x04\xdf\x02\xdf\x7a\x6d\x37\x08\xc0\x16\xc0\x16\xc0\x16\xc0\x16\xc0\x16\xc0\x16\xc0\x16\xc0\x56\x47\xa7\x2d\xc0\x16\xc0\x16\xc0\x16\xc0\x16\xc0\x16\xc0\x16\xc0\x16\xc0\x16\xc0\x16\xc0\x16\xc0\xd6\x20\x67\x14\x60\xab\x3e\x3c\x00\x5b\x63\x00\x5b\xf9\x83\x8c\x04\x8f\x22\x23\x38\x0f\x03\x70\x51\x8b\xde\xd9\x16\xed\x17\x74\x55\xdf\x0c\xe0\xd5\x34\xa5\x00\x5e\x00\x5e\xaf\xeb\x1b\x05\xe0\x0b\xe0\x0b\xe0\x0b\xe0\x0b\xe0\x0b\xe0\x0b\xe0\x0b\xe0\xab\xa3\xd3\x16\xe0\x0b\xe0\x0b\xe0\x0b\xe0\x0b\xe0\x0b\xe0\x0b\xe0\x0b\xe0\x0b\xe0\x0b\xe0\x0b\xe0\x6b\x90\x33\x0a\xf0\x55\x1f\x1e\x80\xaf\xd1\x80\xaf\x01\x11\xaf\x03\xa0\x2e\x30\xae\xa6\x49\x04\xe3\x02\xe3\xf2\x8c\x0b\x70\x0b\x70\x0b\x70\x0b\x70\x0b\x70\x0b\x70\x0b\x70\x0b\x70\xab\xa3\xd3\x16\x70\x0b\x70\x0b\x70\x0b\x70\x0b\x70\x0b\x70\x0b\x70\x0b\x70\x0b\x70\x0b\x70\x0b\x70\x6b\x90\x33\x0a\xb8\x55\x1f\x1e\xc0\xad\xa1\xc2\x2d\x7d\xb9\x13\xcc\xea\x1b\xe6\xb4\x01\x65\x33\x51\x54\xc4\xd9\x77\xd7\x3f\x87\x1b\x62\x03\xcf\x9a\x89\xe2\xdd\xf5\xcf\xbf\x36\x7c\xf1\x50\xdc\x6a\xb4\x38\xe9\xdd\xf5\xcf\x7f\xce\xd5\x22\xfb\x20\xf5\xe8\x81\x92\xe9\x58\xe5\xdb\xaf\xaa\x6f\xac\x6f\x17\x1e\xcf\x25\x21\x83\x5c\xcc\xa4\x91\x55\x88\x6b\x98\xd1\x92\x6a\xdc\x7b\x49\xa6\x53\x95\xcf\xc3\xad\xc0\x99\xa5\x5d\x9b\xf7\x52\xd3\x68\xf8\x85\x81\xdd\xd5\xc1\xee\x1a\xfd\xce\x6a\x5a\x21\x1d\x6c\xb5\x87\xb7\xe3\xde\x6d\x35\x43\x8c\x15\x3f\x76\xd8\x6a\xbf\xbe\x7d\x77\xfd\xf3\xe7\xa6\x07\x60\xc3\x6d\xbf\xe1\xfc\x40\x1e\xc5\x8d\xd6\xb4\x5c\xea\x3e\x13\x2f\xd8\x7a\xf3\x45\xc1\x0b\x99\xce\x1e\xc5\xed\x9d\x52\xf7\x35\xa8\x58\x73\x8f\xb2\xd6\xb0\x6e\x3d\xa4\xec\x33\x59\xa4\x92\x44\x44\xfe\xba\xfa\xe8\x5a\xf4\x9b\x6d\xd1\xfb\x6a\x8b\x36\x6c\x2c\xfb\xac\x35\x7b\xeb\x7d\x78\x43\xdb\xa7\xaf\xf1\xe1\x60\xab\x0b\xc4\x0a\xff\xb7\x2a\x5e\xae\xae\x6d\x2f\xfd\x37\x7d\xd6\xcb\xba\xff\x91\x46\xe0\x53\x66\xa7\xae\xdd\xaa\xdf\xbc\xdc\xe1\x16\x00\xb7\x00\xb8\x05\xc0\x2d\xe0\xd8\xdc\x02\x36\x18\x6d\x9e\x73\x0d\xd8\x6c\x00\xdc\x6c\xbc\xd9\xea\xec\xfd\xcd\x0c\x9c\x03\x22\xe7\xe4\x45\x1c\x99\x15\x65\xd7\x41\xad\x6f\x55\x17\xbc\x5b\xc1\x32\x33\x5a\xba\x10\xf1\x84\xbd\x4b\x99\x4c\xed\xc9\xa2\x72\xb6\x48\xc3\xe1\x14\xb3\x38\x5f\x7e\x5e\xa4\x2c\x96\xb9\xb9\x17\x1f\x44\x58\xf1\xe6\xf8\x24\x7c\xe5\xb6\xbc\x5f\x1b\x6e\x80\xd9\x74\x91\xd3\x2e\xcb\x72\x15\x09\x4d\x9c\xc9\x59\x1e\xdd\x2a\x9b\xb0\x5f\xe9\x8d\x34\x5b\xb4\x76\xfe\xc8\x2e\xd8\xbb\x24\xf9\x23\x51\xa4\xd8\x9c\xd2\x8b\xd4\x4c\xfc\x4c\xe8\xb0\x24\xdd\xe3\x44\xbc\xc3\x44\xd9\xbe\x1c\x66\x9a\xf6\xe6\xcb\xd1\x6e\x28\xd6\xfb\x73\xec\x6d\x44\xbe\x54\x8d\xd2\x32\x65\xda\xda\x8a\xd9\xad\x98\x5a\xa7\xd3\xc0\xfd\x4a\x51\xc2\x9d\x5e\xb4\x74\x16\xc2\x5e\x0e\xb7\x82\xa5\x2a\xbd\x48\xc5\x8c\xd3\x02\x75\x66\xe5\x09\xfb\x12\x2e\x6c\xeb\x03\x10\xb6\x86\x13\x27\xe5\x7c\x2e\x62\xc9\x0b\x91\x2c\x4b\x6f\xd0\xf2\xca\x95\xc9\xb9\x33\x1b\xd3\xa0\xb3\x59\xce\x23\xda\x35\x52\xc5\x41\x20\x28\x2f\x6d\x72\xb5\xf5\xab\x74\xa1\x4d\x23\xab\xd3\xc5\xcd\x2f\x7d\x87\xdc\x4b\xa6\xf6\x0c\xf4\x8f\x98\xd8\x76\xce\x05\x4f\x1b\xdb\xb8\xc3\x34\x53\x9b\xaf\xa9\xc9\x4d\xa6\xf8\x67\x8c\xf1\x43\x59\xfe\xdb\xb8\xf1\xb4\x1b\x97\xf5\xae\x3c\x7b\x5b\xfe\x70\xea\x81\x53\x0f\x9c\x7a\xe0\xd4\x03\xa7\x9e\xde\x9c\x7a\x5a\xde\x05\x4f\x1c\x7b\xf6\x77\x2d\xfe\x58\x89\xe5\xcb\x12\xc1\xb5\x08\x47\xd0\x75\xae\x32\x3e\x23\xe9\xe8\x5a\x25\x32\x5a\xd6\x42\x48\xfc\xa2\x2b\x83\x01\xcd\xb2\x7b\x3b\xf9\xaf\x09\xbb\xb1\xe7\x99\x15\x5d\x32\x91\x9a\xcd\x52\xde\xa9\x82\xa9\x3c\xbb\xe3\xa9\x0f\x69\xc9\x17\xe2\x72\xca\x13\xaf\x2b\x7f\x7d\x6d\x3f\xfe\xfa\x9a\x4d\x65\xca\x13\xf9\x0f\x7f\x91\xdc\x0a\xc6\x63\xf2\xf4\x50\x97\x96\x82\xc7\xa5\x1a\x66\x1f\x7f\xa6\xcb\x1f\x59\xfd\x74\xc2\xae\x24\x1d\x8e\x95\xa6\xab\xfc\x69\xdf\x4a\xbf\x9e\xc2\xaa\xc7\xa4\xa3\xa8\xe2\x6e\x97\x09\xb5\x3d\xf8\xd1\xf7\x7d\xad\xc8\xd3\xc4\xd4\xbb\x55\xcc\xa8\xeb\x66\xc3\xde\xa9\x47\x36\xe3\xf9\x2d\x9f\xd5\xac\x98\x41\xa9\x11\xf9\x54\xe5\x73\x33\x27\x8d\xe3\xf5\x69\xa5\x47\xeb\x87\x8b\x84\x5e\x2f\xb1\x66\x76\x6c\xa5\x91\x26\x23\x19\x97\xaa\x30\xc9\x0a\x64\x9c\x08\x73\xac\x89\x07\xd2\xa7\x5e\x1a\x98\x54\x26\xd3\xdf\x23\xc1\xb1\x26\x84\x67\xd5\x5f\x36\x61\xef\xa2\x48\x64\x05\xdd\x4d\x55\xcd\xee\xcc\xf6\xe1\x8c\x5d\xb8\x05\x58\x5f\xa0\xfa\x7b\x76\xf6\x03\x8f\xee\x67\xb9\x5a\xa4\xb1\xf9\x16\x85\x3a\xd1\x97\x56\x06\xce\x8a\x90\x4e\x3e\xae\x3f\xc4\xf7\xe0\x36\x3c\xe9\x7b\x76\xf6\x93\xca\x45\xe5\xb1\x2c\xe2\x3a\xe2\xb1\xe9\xbd\x1b\x1f\x1b\x09\x47\xcf\xd3\x56\xf5\x7c\xf2\xc0\x69\x78\xc6\x2e\x0b\x32\x5b\x5d\xee\x87\x91\x38\x8f\xd8\x03\xaf\xdd\x3c\x6c\xf2\xc2\x3b\xd4\x2c\xc0\x1f\xaf\xb7\xf9\x7d\xea\x93\xb7\x3f\xdb\xc6\x21\xbd\xf3\xda\x0d\xd6\x06\x0f\xbd\x97\xca\x3f\x8d\x48\x0f\x78\x7a\x4b\x4c\x77\x53\xf0\x62\xd1\x96\xcf\x8d\x99\x4a\x57\x9e\xb0\x26\x92\xdf\x5e\xce\xa5\xe0\xd4\x45\x40\xff\x26\xe0\xdd\x1c\xec\xdf\x12\x09\x6f\x93\x01\xa0\xf3\x5c\x22\xd6\x98\x96\x3b\x05\xdc\x4b\xfd\x6a\xca\x4c\x27\x76\x45\xe6\xe6\xa1\x6b\x80\x79\xd7\x98\x1c\xe9\x0e\x4e\x27\xdd\x41\xbb\x7b\xea\xb9\x94\x07\xfb\x53\xe8\xe0\xe5\x00\x2f\x07\x78\x39\xc0\xcb\x01\x5e\x0e\x4d\x87\x2f\xf0\xf9\x88\x46\x04\x44\x15\x44\x15\x44\x15\x44\x15\x44\x15\x44\xf5\xb8\x88\x2a\x20\x07\x20\x07\x20\x07\x20\x47\xef\x90\x63\x0b\x47\x80\x81\x26\x24\x68\x37\x84\x4f\x93\x12\xbc\xd4\xe2\x36\x28\x3c\xb4\xf6\x07\xa7\x95\x44\x7a\xd2\x8c\x43\x1e\xde\x4e\x36\x59\xf8\x4f\x24\x6c\xf2\x79\x40\xd5\x55\x96\xe9\x41\x40\xa9\x1d\xd2\x52\x8f\x25\x55\xd5\xab\x95\x19\x7d\x9d\x29\xdd\x31\x81\xb3\xca\x0f\xe3\xbb\xc2\x36\xfb\xfb\x3d\xe1\xb6\xdd\xa2\x52\x8d\x94\x2c\x73\x11\xbb\xe1\x3d\xf0\x21\xd4\x49\x04\x2b\xa2\xa8\xaa\x0b\x62\xb0\x51\x54\x64\x1f\xf9\xc8\x53\x3e\x13\xb9\xb5\xf4\x99\x56\x31\xae\xb5\x8a\x24\xa9\xae\xc1\xa6\xc6\xc9\x34\xaa\x72\x26\xd2\xc2\xc8\x92\x5e\x97\x9f\xf3\x7b\x33\x8a\xc5\x9d\xd0\xc2\x0b\x64\xd5\x58\x21\x1f\x53\x44\x02\x29\xd9\xcf\x54\xce\xde\xfe\xfe\x0f\xe6\xbb\x39\x8f\x08\x98\x25\x2a\x9d\x59\xf1\x8b\x6c\x5c\x91\x4a\x0b\x2e\x53\x7b\xc0\x91\x0d\xa9\xfc\x2e\x41\x04\x87\xf3\xd8\xed\x32\x68\x18\x33\x95\xf0\x74\x36\x51\xf9\xec\x32\xbb\x9f\x5d\x2e\x52\x19\xa9\x58\x5c\xfe\xee\x67\x7d\x6d\x9e\xb2\xb3\x51\xda\x0d\x4e\x97\xd3\x33\x28\x79\xed\x18\xc5\xa8\xb6\x22\xd4\xef\x5b\x88\x50\xef\xad\xed\x6d\x3c\x5d\xfa\xfd\xb3\x5d\xb2\x1e\xc5\xe3\xe9\xd3\x51\x4b\xba\x24\x30\x8d\x5c\xd2\x7d\xc5\xba\x4d\x7f\x72\xf9\x4f\x73\x04\xff\x6b\x4f\x59\x50\x76\x96\x2c\x37\x66\x3e\x19\x86\x64\x39\x92\x7c\x27\x90\x16\xab\x93\x3c\x58\x69\x11\x11\xe6\x27\x14\x61\x8e\x50\x3a\x84\xd2\x21\x94\x0e\xa1\x74\x50\x74\xd7\xed\xa2\x41\xc6\xad\x1c\x46\x01\x44\xd8\x4d\xfb\xb0\x9b\xb1\x6b\x7b\xc1\xd6\xdf\x79\xb0\x4d\x2e\x78\xbc\x22\xa3\xed\xa8\x9a\x99\x27\x1d\x26\xc2\xa6\x22\xe2\x88\x6f\xe4\x37\x77\x6b\xfe\xc5\xa3\x62\xc2\xd8\x95\xf9\xaf\xff\xfb\x9c\x4b\x32\x73\x6a\x16\x25\x0b\x5d\x88\xbc\xbc\xb8\xac\x83\x2d\x4b\xe4\xbd\x60\x67\xa1\x48\xf0\x99\x91\x4f\xbd\x4c\x35\x61\xd7\x09\x4f\x53\x61\x05\x5b\x92\x7a\x78\x62\x05\xad\xb7\x7f\xd8\xe5\x26\xa0\x36\x1e\x48\x1e\x09\x83\x16\xc4\xf9\x5b\x3f\x7c\xa6\xa7\xec\xca\x8e\x98\xb9\x83\x32\xed\x47\xc7\xb9\x96\x2d\xb4\xc8\xc9\x27\xac\x94\xcc\x97\x3d\x0f\x94\x69\xcc\xf1\x12\xfc\x61\x5f\x94\x30\x35\xee\x7c\xfd\xcc\xc4\xe8\x2d\x8d\x2f\x61\xea\x44\xb6\x9c\xf9\xa6\x7d\x8b\xec\x81\x90\xf1\xe2\xae\x99\xa6\xd3\x7f\x6b\x9f\x6c\xa0\xb9\x3d\xd7\xb0\x19\xaf\xd7\x00\x79\xf4\xec\x94\x7d\xfe\x82\x7e\xfb\x6f\x9b\x0f\xc2\xb9\xc8\x67\xa2\xd5\x37\x69\x3d\x8b\x99\x8c\x2e\xda\xff\xc6\xfc\x7b\xe9\xbe\x49\x47\x6e\x1b\x59\x27\xe3\x79\x21\x29\xe0\xce\x7a\x9f\x75\x23\xf7\x50\x23\x06\x6d\x91\xee\xcb\xd7\x61\x83\x06\x72\x5d\xf7\x17\x63\xb0\x53\x1f\xb9\x9d\xfa\x74\xbc\x1a\x56\xa2\x5c\xfc\xe6\xb2\x91\x58\xe6\x58\x2a\xa3\xfb\xbf\x5b\x73\x64\xbd\x21\x2b\x9d\x0d\xbf\xe6\x09\xfd\x32\x55\xe9\x85\xfd\x35\x7d\x83\x0c\xe5\x9a\x7d\xf7\xdf\x5a\xa5\xd7\x36\xc8\xfd\xa3\x39\x1c\xdd\xbf\x6f\xfc\x91\x59\xfe\xf1\xcd\x90\xdc\x2d\xda\xaf\x9b\x9f\x54\x1e\x11\x49\x98\x29\x9a\x7c\xc5\xbe\xbe\x9e\x9a\xbf\x7d\x7d\xcd\xde\xd5\x46\x93\x7c\xe8\xad\xd9\x9f\xf4\x0f\xb7\x51\x2f\x78\x44\x13\x40\x61\xd2\x89\x8c\x9c\x21\x93\xd4\x15\xf5\xe8\xe6\xd6\x86\x11\x67\x42\x65\x89\x98\x30\xfb\x4e\xca\x8e\xe0\xd7\x14\x79\xb2\x37\x4e\x44\x78\xfd\x2e\xc3\x6b\x5e\x04\xad\xc5\x7e\x00\xad\xe5\xe9\x53\x07\xaa\xb5\x64\x2b\xbe\xe2\x23\xd7\x5b\x16\x9d\xdb\xcc\xb2\x84\x47\x1d\x89\x8f\xee\x61\x27\x29\x40\xc2\x59\x16\x62\x25\xc4\x4a\x38\xcb\x42\xc8\x08\xff\x5e\x01\x8b\x47\xe7\x2c\x7b\xdc\x72\xd3\x62\xf4\xd6\xde\x57\x6c\x6b\xbf\x52\xba\x01\x07\x56\x58\xef\xd7\xd0\xa6\x7e\x4a\xeb\xb5\x7f\x3e\x9c\x4d\x91\x76\x0e\x69\xe7\x90\x76\x0e\x69\xe7\x90\x76\xee\x20\x2a\x14\x34\xdd\xd6\x13\x85\xe2\x7a\x43\xca\x0e\x88\xd0\x87\x13\x0a\x7d\x40\x2a\x48\xa4\x82\x44\x2a\x48\xa4\x82\x44\x2a\x48\xa4\x82\x44\x2a\x48\x44\x04\x22\x22\x10\x11\x81\x88\x08\x5c\x5d\x91\x28\xae\x87\xbc\xb3\xc8\x3b\x8b\xbc\xb3\x23\xcf\x3b\xdb\x88\xf5\xe0\x60\x80\x28\xdf\x71\x17\xd7\x6b\x0d\x85\x07\x5c\x5e\x6f\x67\x70\xbe\xa1\xc0\x5e\xf7\xb0\x1c\x25\xf6\x50\x62\xcf\x7e\x84\x12\x7b\xf0\x75\x80\xaf\x03\x7c\x1d\xe0\xeb\x00\x5f\x07\x40\x74\x70\xd5\xe7\x47\x04\x5c\x15\x5c\x15\x5c\x15\x5c\x15\x5c\xf5\x84\xb9\x2a\x50\x07\x50\x07\x50\x07\x50\x07\x4a\xec\xa1\xc4\x1e\x4a\xec\x85\x4f\x76\x8f\x0d\xdd\x6c\xe3\x47\x91\xbd\x83\x17\xd9\xeb\x05\x4e\xa1\xcc\x5e\x27\x65\xf6\x76\x86\x6e\x1b\x0b\xed\x0d\x25\x46\x75\xff\xd9\x43\x9e\xe9\x79\xbb\x83\x08\x51\x55\x47\x10\x55\x85\xfc\x21\xc8\x1f\xd2\xd0\x98\xd1\x0b\x54\x23\xcd\x20\xd2\x55\xa7\x86\x55\x70\xaf\x9b\x5e\x1d\xb5\xdc\x7b\xb8\x92\x7b\x5d\xca\xbd\xaf\x58\xd7\xc9\x51\xf6\x5d\x76\xaf\x9f\xbc\x28\x43\x91\x34\x47\x92\x0d\x05\xb2\x63\x75\x92\x07\x2b\x3b\x22\xfe\xfc\x84\xe2\xcf\x11\x68\x87\x40\x3b\x04\xda\x21\xd0\x0e\x6a\xef\xba\x5d\x34\xc8\xa8\x16\x94\xde\x1b\xae\xce\x77\xc8\xd2\x7b\xe3\x08\xc5\x69\x28\xbe\xb7\xb3\x82\xb6\xa1\xfc\x5e\xef\xf1\x37\x28\xc0\x17\x16\x4d\x7b\xa9\x04\x05\xf8\xdc\xff\x70\x5d\xc2\xf4\x78\x8c\x25\xf8\x86\x42\xdc\xab\x45\xf8\xb6\x69\x13\xca\xf0\xa1\x0c\xdf\x01\xca\xf0\xed\x2c\x01\x6d\x2a\xc4\x37\x14\x0b\x35\x4a\xf1\xc1\x6e\x0d\x9f\x07\x94\xe2\x7b\xba\x62\x50\x8a\x0f\xa5\xf8\xa0\xbf\x40\x7f\x19\x52\x31\xbe\x7e\x34\x98\xfd\x94\xe3\x7b\x81\x21\xed\xff\x63\xef\xef\x7a\x1b\x37\xb2\xb5\x7f\xf8\xbc\x3f\x45\xc1\x73\xe0\x04\x63\xcb\x77\x37\x6e\x60\x82\x04\xfb\xc0\x49\x77\xf6\xd3\x33\xe9\xdd\x46\x77\x30\x73\xd2\xc1\x3d\x25\xb2\x24\x17\x4c\x91\x04\x8b\xb2\xe3\x79\xb0\xbf\xfb\x1f\xb5\xea\x85\xa4\x44\x49\x94\x44\x4a\x24\x75\xcd\x49\x3c\x2d\x89\x64\xbd\xb0\xea\x5a\xeb\xb7\x56\xad\x6d\x05\xf9\xc6\x2e\x24\x11\x54\x0b\x81\x09\x81\x89\xa0\x5a\xc8\x8d\x0b\x0b\xaa\x1d\xb7\x86\x3a\x57\x61\xbe\x33\x47\x9f\x52\x4e\xe1\xdd\xc2\x56\x07\xdc\x59\x9e\xaf\x75\xc0\x69\x8f\xa3\x88\x43\xf9\x2c\xc3\x25\x8f\xca\xa9\xad\xdc\x1f\x40\xb3\xad\x7a\xe1\xa4\x14\x58\xf5\xa3\x0f\xc9\xba\xa6\x0b\x5f\x17\xa7\x93\x55\x8e\x9b\xf2\x82\x8e\xc9\x58\xe5\x82\x57\x3c\xbe\xab\x72\xef\x65\x8b\xd7\x70\xdb\x83\xfd\xb6\x92\xc9\x87\xcc\xd4\xbe\x46\x94\x50\x62\xf5\x87\x67\x11\x23\x05\xd5\x4f\xf8\xf3\xe5\xa1\x76\x51\xe0\x7d\x7f\x26\x86\x13\x43\x47\x7c\x62\xe8\x6e\xa4\xb7\xeb\xb4\xd0\xad\x9e\xc1\x16\x70\x25\xce\x08\xc5\x19\xa1\x38\x23\x14\x67\x84\x8e\xed\x8c\xd0\xdd\x2b\x6f\xed\xf9\xa0\x1d\x07\x87\x9c\xec\x54\xd0\xdd\xcd\xdf\x7c\x22\x68\x9f\xfb\x60\x9f\x73\x40\x77\xf7\xc1\xe6\x33\x40\x3b\xee\x03\x9c\xfc\x89\x93\x3f\x71\xf2\x27\x4e\xfe\xc4\xc9\x9f\x9d\x9d\xfc\xd9\x60\xf5\x5f\x3b\xf5\x73\x6b\x8a\xe7\x05\xc5\x86\x36\x6b\xcd\x88\x4f\x2e\xdd\xdd\xdd\xdb\x4e\x2d\x3d\x6d\xbf\xe3\xac\xd2\x4e\x46\x74\xfd\x9c\xd2\x8e\x87\xf5\xac\xa7\x93\xee\xee\x9e\x2d\x27\x93\x76\xbd\x6c\xf6\xf5\x3c\xd2\xdd\x9d\x56\x43\x3b\x0e\xf6\xe7\xd9\xbf\xfe\xe8\x06\xbe\xd5\x1c\xff\xd2\x11\x83\x2b\x83\xb7\xd8\x09\x01\x57\xf4\xab\x73\x00\x77\x53\xd8\x02\x64\xef\x58\xdd\xa8\xcd\x89\xc2\xc8\xb9\xae\x18\xc7\xa5\x6b\x77\x81\xef\x80\xee\x80\xee\x86\x89\xee\x80\xed\x80\xed\x80\xed\x80\xed\x80\xed\x80\xed\x80\xed\x80\xed\x80\xed\x80\xed\x80\xed\x80\xed\x80\xed\x80\xed\x80\xed\x80\xed\xc6\x82\xed\xca\xc7\xd6\x34\xf7\x3e\xe0\xd0\x1a\x80\xc9\xf3\x63\x2c\x80\x49\x80\x49\x80\x49\x80\xc9\x95\x4e\xeb\x15\x98\xdc\x51\x99\xa2\x07\x79\x81\xdb\x93\x27\xcf\x9a\x19\xd8\xa0\xdc\x21\x00\x23\x00\xe3\x20\x01\x23\x6a\x54\x02\x33\x02\x33\x02\x33\x02\x33\x02\x33\x02\x33\x02\x33\x02\x33\x02\x33\x02\x33\x02\x33\x02\x33\x02\x33\x02\x33\x02\x33\x8e\x0b\x33\x02\xc2\x01\xc2\x01\xc2\x0d\x63\x44\x01\xe1\xaa\xdd\x03\x08\x37\x72\x08\xd7\x93\xfc\xc0\x13\x80\xb8\xf3\x64\x08\xee\x71\x9a\x3b\x10\x1e\x10\xde\x60\x10\x1e\xf0\x1d\xf0\x1d\xf0\x1d\xf0\x1d\xf0\x1d\xf0\x1d\xf0\x1d\xf0\x1d\xf0\x1d\xf0\x1d\xf0\x1d\xf0\x1d\xf0\x1d\xf0\x1d\xf0\x1d\xf0\xdd\x78\xf0\x1d\x8a\xdb\x03\x51\x02\x51\x1e\xd0\xef\x40\x94\x40\x94\x40\x94\x40\x94\x9b\x11\xe5\x54\xe4\xfc\xed\xdd\x41\xec\xf1\x2c\xf5\x47\x57\x86\x7f\x2e\xf2\xaa\xae\x37\x23\xbd\x85\x14\xce\x45\xbe\x81\x13\x52\x57\xdc\x3f\x7c\xfc\x52\x77\x15\x14\x61\xdd\x93\xd8\x95\x3a\x92\x32\x25\x47\x8a\xed\x68\xd2\x94\x2e\xf3\xa6\xfc\x28\x07\xbc\x89\x8d\xcb\x78\x1a\x5b\xab\xdd\x28\x01\x73\x4d\x16\x24\x51\x24\x02\xb7\x7d\x34\x3d\x60\x77\xe5\x3d\x33\xd7\xda\xf6\xaa\xfd\xe2\x6f\xd3\xf8\x0c\xdf\x4e\xab\xad\x77\xf2\x1a\xbc\xa7\x6e\xf8\x9c\x9a\xf1\x6b\xf6\x12\x6c\x9f\xfd\x20\x4f\x20\x4f\x20\x4f\x20\x4f\x63\x23\x4f\xcd\x2a\xef\xd7\xd2\xa7\x23\xab\xee\x37\x5f\x7b\xff\xa5\x3b\xce\xfa\xdc\x6e\xe8\x68\x8b\x40\xcf\x28\x33\x0f\x2a\x6d\x2b\x47\x79\x4c\x05\x4b\x75\x6f\xa9\x5c\x84\x13\x76\x1f\x33\x19\x9b\x95\x25\xc9\xd8\x32\xf6\x8b\x53\xc8\xc2\xec\xf5\xcb\x32\x66\xa1\xcc\xf4\xbe\xf8\x2c\xfc\x8c\xd7\xcb\x27\x79\x48\xed\x2b\xef\xe6\x86\xed\x60\x36\x5b\x66\xf4\x96\xa5\x59\x12\x08\x45\xae\x4c\x6b\xf8\xd9\x59\x36\x31\x7e\x33\x33\x5a\x34\x77\x7e\x64\xb7\xec\x3e\x8a\x7e\x24\x47\x65\xa8\x57\xe9\x65\xac\x07\x5e\x9b\x50\x6e\x4a\xda\xcb\xad\x57\xb8\x6f\x30\x50\xa6\x2d\xe7\x19\xa6\x93\xe1\xc2\x66\x5d\xb1\x19\x19\x9e\xac\x47\x7e\x2f\xfb\x04\x64\xcc\x94\x31\xd5\xd9\x54\xcc\x4c\x5c\x93\x77\x2d\x17\x52\xc2\xae\x5e\x34\x75\x96\xc2\x6c\x0e\x53\x6d\x0d\xc7\xb7\xb1\x98\x73\x9a\xa0\xd6\xaa\x9f\xb0\xdf\xfd\x86\x6d\x30\x93\x7f\x35\xac\xa6\x94\x8b\x85\x08\x25\xcf\x45\xf4\x5a\x04\x1c\x15\x5b\xae\x8c\x6e\xac\xd5\x4e\x9d\xce\xe6\x19\x0f\xe8\xad\x91\x49\xe8\x05\x41\xb1\x69\x53\x34\x97\x9b\xa5\x4b\xa5\x1f\xb2\x3c\x5c\x5c\xff\xd2\x35\xc8\xde\x64\x66\xd6\x40\x77\x89\x89\x79\xce\x85\xe0\x71\xed\x33\x1e\x30\xcc\xf4\xcc\x0f\xf4\xc8\x75\x9e\x90\x1d\xbe\x90\xbe\x4c\xff\x7d\x48\x71\xb3\x7e\xd9\x4c\x8b\x4f\x36\xfd\xc1\x8d\xc1\x8d\xc1\x8d\xc1\x8d\xc1\x8d\x3b\xe3\xc6\x0d\xf7\x82\x35\x76\x7c\xba\x6d\xf1\x7d\x29\x81\x25\x8d\x04\x57\xc2\x2f\x41\x0f\x59\x92\xf2\x39\xa9\xa3\x87\x24\x92\xc1\x6b\x25\x4a\xd9\x4d\xba\x22\x03\x46\x4f\xbb\xb7\x93\xbf\x4d\xd8\x57\xb3\x9e\x19\xe9\x92\x8a\x58\xbf\x2c\xc5\x9e\x2a\x58\x92\xa5\x8f\x3c\x76\x51\xd3\xd9\x52\xdc\xcd\x78\xe4\x6c\xe5\x6f\x57\xe6\xe3\x6f\x57\x6c\x26\x63\x1e\xc9\xff\xb8\x8d\x64\x2a\x18\x0f\x09\xb4\x25\x77\x06\x42\x84\x85\x19\x66\x2e\x7f\xad\x8a\x1f\x19\xfb\x74\xc2\x3e\x48\x5a\x1c\x4b\x8f\x9e\x64\xeb\x6d\x2b\xb0\x6a\x6e\xcc\x63\xb2\x51\x92\xfc\xf1\x90\x01\x35\x2d\x78\xef\xda\xbe\x51\xf2\xd4\x21\x8d\x76\x0d\x33\x6a\xba\x7e\x61\x1f\x93\x17\x36\xe7\xd9\x94\xcf\x2b\xae\x4c\x6f\xd4\x88\x6c\x96\x64\x0b\x3d\x26\xb5\xfd\xf5\x79\xa5\x45\x9b\xbb\x8b\x44\xaf\x53\xac\xa9\xe9\x5b\xa9\xd5\x64\x20\xc3\xc2\x14\x26\xad\x40\xce\x09\x3f\xc6\x7a\xb3\xb6\x3b\xa9\x53\x03\x93\xd2\x60\xba\x7d\xc4\x73\x4d\x9f\x01\x50\xbd\xd9\x84\xdd\x07\x81\x48\x73\xda\x9b\xca\x96\xdd\xb5\x69\xc3\x35\xbb\xb5\x13\xb0\x3a\x41\xd5\x4f\xec\xfa\x67\x1e\x3c\xcd\xb3\x64\x19\x87\xfa\x5b\x14\x4d\x4f\x5f\x5a\xe9\x38\x23\x21\xad\x3e\xae\x5e\xc4\xb5\x60\xea\xaf\xf4\x13\xbb\xfe\x35\xc9\x44\xe9\xb2\x2c\xe0\x2a\xe0\xa1\x6e\xbd\xed\x1f\x93\x6c\x41\xd7\x53\xc6\xf4\x5c\xbb\xe0\xcc\x5f\xe3\x90\x09\x99\xae\x4e\xf7\xf3\x28\xce\x11\x07\x40\x34\x1b\x87\x6d\x41\x10\xe7\x1a\x05\x84\x43\x74\x36\xbe\xeb\x21\x11\xa7\xf3\x6d\x9c\x33\x38\xa2\x59\x67\x6d\x09\x90\x38\x56\xff\xd4\x72\x3d\xd0\xea\x3d\x31\xdd\xd7\x9c\xe7\xcb\xa6\x7c\x6e\xf0\x90\xba\x74\x99\x0d\x09\xa6\x66\x87\x2e\xd4\xd3\x79\x72\x4d\x0f\xac\x47\xb9\xd2\xdc\xf5\x74\xd3\xd6\xd3\xeb\x8d\x5b\x2d\xb3\xa6\xb8\xd3\xff\x4d\x2a\xef\x6e\x21\xe8\xfa\xa2\xdb\xf8\x79\xdb\xd4\x1c\x09\xb6\x97\x93\x60\xdb\x6c\xdb\xda\x95\x64\x7b\x3a\xfb\x0e\x41\x0f\x08\x7a\x40\xd0\x03\x82\x1e\x10\xf4\x50\xb7\xf8\x82\xa6\x0f\xa8\x47\x00\x58\x01\x58\x01\x58\x01\x58\x01\x58\x01\x58\xc7\x05\x58\xc1\x3c\xc0\x3c\xc0\x3c\xc0\x3c\x3a\x67\x1e\x7b\xc4\x05\xf4\x34\x3d\xb4\x59\x17\xae\xa7\x88\x1e\xeb\x71\xeb\x15\x2d\xda\xf8\x83\xcb\x3a\xf6\x74\x52\x0f\x46\x2c\xc7\x98\x6c\x73\xf3\x5f\x52\x66\xe5\x6e\x68\x75\xbe\x9a\x86\x5d\x81\xaa\x03\xce\x45\x1d\xca\x39\x22\x6f\x56\x86\xf5\x2a\x4d\x54\xcb\x54\xce\xd8\x42\x8c\x1f\x0a\xe0\xcc\xef\x4f\x89\xe0\x0e\x4b\x5c\xdd\x72\x68\xcd\xb9\x16\xa6\x56\x32\x5d\x91\x6d\x55\x9e\x15\xbd\xcd\xb6\x22\xc7\xc9\x27\x1e\xf3\xb9\xc8\x8c\x0b\x90\xce\x6b\xe2\x4a\x25\x81\x24\x9b\xd6\x3b\xdb\x38\xf9\x4c\x93\x8c\x89\x38\xd7\x22\xd3\x19\xf9\x0b\xfe\xa4\x7b\x31\x7f\x14\x4a\x38\xa5\x56\xce\x29\x72\xb9\x47\xa4\x54\xc9\xb1\x96\x64\xec\xed\xbb\x1f\xf4\x77\x33\x1e\x10\x49\x8b\x92\x78\x6e\x74\x19\x39\xbf\x82\x24\xce\xb9\x8c\xcd\x52\x47\xce\xa5\xe2\xbb\x44\x17\x2c\xe7\x63\xd3\x57\x6f\x7a\xcc\x93\x88\xc7\xf3\x49\x92\xcd\xef\xd2\xa7\xf9\xdd\x32\x96\x41\x12\x8a\xbb\xbf\x7c\x54\x0f\xfa\x2a\x07\x7b\xab\x6d\xe7\xb4\x39\x3c\xbd\x12\x72\xa3\xd5\x57\x4d\xb5\xd5\xbb\x06\xda\xea\x17\xe3\x99\x1b\x58\xbb\xde\xed\x6c\x97\x89\x41\x1e\x58\xc3\xc6\x2f\x86\x49\x4e\x8d\x41\x0c\xbf\x61\x1d\x9c\xa4\x52\x53\x73\xa5\xc3\x03\x55\x0e\x56\xa0\xbb\x0f\x51\xe9\x87\x02\x1d\xc8\xd1\x29\x10\x94\xe5\x41\xee\xad\xa0\x44\xb2\xfa\x05\x25\xab\x23\x2b\x0f\x59\x79\xc8\xca\x43\x56\x1e\x6c\xe1\x4d\x6f\x51\x2f\x53\x60\xce\x63\x19\x22\x83\x67\xfd\x32\x5b\x33\x78\x46\x61\x01\x7a\x44\xd0\x7a\xde\x4e\x26\x78\xb8\xa2\xd6\x0e\xb4\xd4\xf4\x95\xce\x98\xac\x53\x52\x3c\xe2\x4f\x0a\xc1\x9b\xea\xbf\x78\x90\x4f\x18\xfb\xa0\xff\xeb\xfe\x7d\xc1\x25\x39\x46\x15\x0b\xa2\xa5\xca\x45\x56\xec\x63\x26\x56\x97\x45\xf2\x49\xb0\xeb\xff\xe1\x0b\xa1\x52\x1e\x88\x6b\x2d\x57\x9d\xc4\x9a\xb0\x87\x88\xc7\xb1\x30\x3a\x97\x44\x10\x8f\x8c\xee\x7a\xfb\xc3\x21\x1b\x03\x3d\xe3\x99\xe4\x89\xef\x34\xaf\xee\xa7\xae\xfb\x74\x4b\xd9\x07\xd3\x63\x7a\x4b\x4a\x95\xeb\x1d\x1b\xa5\xb6\x54\x22\xa3\xf0\xb2\x42\xa8\xbf\x76\xdc\x51\xfa\x61\xc6\x1b\x0c\xd0\xef\x7d\x13\x2e\xc9\x16\xb6\xa4\xb9\x18\x87\x47\xf2\x18\x3c\x5f\x2e\x65\xd2\xfc\xb1\x50\xc8\xe4\x14\x01\x08\x14\x2b\x74\xd0\xd1\xf7\xb7\xf4\xdb\xbf\x6e\x5f\x17\x17\x22\x9b\x8b\x46\xdf\xa4\x49\x2d\xe6\x32\xb8\x6d\xfe\x1b\xfd\xf7\xab\xfd\x26\xad\xc0\x4d\xf4\x4f\xca\xb3\x5c\x52\x2a\x9f\x89\x6b\x6b\x47\x0b\xa5\x5b\x8a\x71\xf7\xc8\x69\xdd\x55\xd8\xc4\x16\x23\xe5\xa1\x1a\x8e\xc6\xe0\xca\x1e\xb9\x2b\xfb\x72\x62\x23\x56\x92\x68\xdc\xcb\x65\x12\xbd\xf4\xda\x54\x1c\x1e\xf0\xdd\x86\x75\xeb\x7b\x72\xe4\x99\xec\x6e\x1e\xd1\x2f\xe3\x24\xbe\x35\xbf\xa6\x6f\x90\x2f\x5d\xb1\xef\xfe\xae\x92\xf8\xc1\xe4\xd0\x7f\xd2\x2b\xa4\xfd\xfb\xab\x5b\x37\x8b\x7f\xfc\xbe\x4f\x41\x1b\xcd\xe7\xcd\xaf\x49\x16\x10\x6c\x98\x27\x34\xf8\x09\xfb\x76\x35\xd3\xff\xf6\xed\x8a\xdd\x57\x7a\x93\x42\xf4\x0d\x19\x20\x9b\xc4\xbe\xa8\xb7\x3c\xa0\x01\xa0\x2c\xec\x48\x06\xd6\xd7\x49\x26\x4c\xf2\x62\xc7\xd6\x64\x29\xa7\x22\x49\x23\x31\x61\xe6\x9e\x74\xf8\x82\x9b\x53\x14\x28\x5f\x3b\x10\xfe\xf6\x87\x74\xaf\xbe\x11\x2c\x19\xf3\x01\x2c\x99\x01\x5a\x32\xe9\x4a\x50\xfa\x18\x6c\x99\x65\xeb\xbe\xb5\x34\xe2\x41\x4b\x92\xd2\x5e\xec\x72\x45\x25\x62\x71\xa1\x37\x1b\x0c\xd3\xe5\xe8\xcd\x1e\xc9\x3a\xa8\x0f\xff\xc9\xf9\x97\xb1\xd1\xc6\xe2\x5e\x80\xaa\x5a\x8e\xc3\x3f\xfc\x86\x1d\x16\xb1\xfa\xec\x4b\x5b\xf7\xa7\xfa\x5f\xe3\x72\xdb\xc7\xd4\xff\x6b\x7e\x13\x84\xb1\xe2\x30\x3c\x1c\x86\x87\xc3\xf0\x70\x18\x1e\x0e\xc3\x3b\x8b\x81\x05\x3b\xb8\xf1\x40\xa1\x02\x60\x9f\xce\x2c\x44\x52\xc5\x05\x25\x55\xe0\x80\x4a\x1c\x50\x89\x03\x2a\x71\x40\x25\x0e\xa8\xc4\x01\x95\x38\xa0\x12\xb9\x86\xc8\x35\x44\xae\x21\x72\x0d\x57\x67\x24\x2a\x00\xe2\x34\x5c\x9c\x86\x8b\xd3\x70\x07\x7e\x1a\x6e\x2d\xdb\x43\xf8\x01\xf2\x87\x47\x50\x01\xb0\x31\x19\x3e\x7f\x2e\xf1\xf6\x1a\x80\x07\x73\xf4\x5d\x55\x00\xdb\x67\xe7\xa8\x03\x88\x3a\x80\xe6\x23\xd4\x01\x44\xe8\x03\x42\x1f\x10\xfa\x80\xd0\x07\x84\x3e\x80\xa9\x03\xb3\xee\xee\x11\x60\x56\x60\x56\x60\x56\x60\x56\x60\xd6\x0b\xc6\xac\x20\x1f\x20\x1f\x20\x1f\x20\x1f\xa8\x03\x88\x3a\x80\xa8\x03\xe8\x3f\x39\x32\x87\x74\xbb\xa3\x1f\x95\x00\xfb\x51\x09\xb0\x3b\x60\x85\x5a\x80\xad\xd4\x02\x3c\x18\xc4\xed\xae\x06\xd8\x97\x34\xd6\x33\x9d\x41\xb2\xa3\xf9\xcd\x16\x27\x64\x5f\x8d\x20\xfb\x0a\xa7\x90\xe0\x14\x92\x9a\x87\x19\x87\xd2\x1a\xf2\x39\x24\x6d\xb5\xac\x87\x55\x01\xdb\x69\xda\xf8\xa5\xf1\xf9\xea\x02\xb6\x2e\x8d\xdf\xb0\x4e\xce\x59\x39\x75\x6d\xc0\x0e\x8f\x58\xe9\x8b\x22\x1d\xc8\xc1\x2a\x90\x97\xe5\x41\xee\xad\xbc\x44\x2a\xfb\x05\xa5\xb2\x23\x67\x0f\x39\x7b\xc8\xd9\x43\xce\x1e\x2c\xe3\x4d\x6f\x51\x2f\x13\x64\x50\x1f\xb0\xe7\x76\xe0\x39\xeb\x03\x0e\x28\xab\xa7\xa6\x42\xe0\xc1\xf6\xda\xae\x1a\x81\x9d\xa7\xf2\xa0\x4a\xa0\x9f\x39\xcd\x45\x0a\xaa\x04\xda\xff\x61\xf7\x84\x8b\xd2\x7e\x34\xd2\x3a\x81\xbd\x82\xf7\xe5\x4a\x81\xfb\x3c\x18\x6a\x05\xa2\x56\xe0\x19\x6a\x05\x1e\xac\x8a\x76\x56\x0b\xec\x8b\x13\x1b\xf5\x02\xe1\xda\x46\xe4\x04\xea\x05\xae\xcf\x18\xd4\x0b\x44\xbd\x40\xd8\x34\xb0\x69\xb6\xd8\x34\x67\xac\x18\xd8\xa1\x55\x73\x9a\x9a\x81\x47\x38\xdc\x76\x56\x0d\x1c\xbb\xb8\x44\xcc\x2e\x94\x67\xa3\x61\xba\x1c\xe5\xd9\x23\x81\x07\x1d\xe2\x3f\xe9\xc3\x42\x36\xe2\x98\xdd\x0b\x50\x58\xe7\xaa\x1e\xd8\x9b\xb8\x56\x4a\x72\xbc\x5b\xd8\x62\x86\x3b\x6b\x08\xb6\xce\x4a\xed\xf9\x18\x71\x28\x9f\x65\xb8\xe4\x51\x39\xd7\x96\xfb\x13\x71\xb6\x15\x5b\x9c\x94\xa2\xb5\x7e\xf4\x71\x5e\xd7\x74\xe1\xeb\xe2\xb8\xb4\xca\xf9\x57\x5e\xf3\x31\x19\xab\x5c\xf0\x8a\xa3\x78\x55\x11\xbe\xec\x72\x36\x6e\x7b\xba\xdf\x56\xb2\x0a\x91\x2f\xdb\xd7\x58\x15\x4a\xf7\xfe\xf0\x2c\x62\xe4\xc4\x06\x95\xb7\xf3\x7c\x89\xb1\x9d\xd5\xad\xdf\x9f\xac\xe1\x44\xd3\x11\x9f\x68\xba\x1b\x0c\xee\x3a\xcd\x74\xab\x6b\xb1\x05\xe8\x89\x33\x4c\x71\x86\x29\xce\x30\xc5\x19\xa6\x63\x3b\xc3\x74\xf7\xca\x5b\x7b\x7e\x69\xc7\x21\x26\x27\x3b\xb5\x74\x77\xf3\x37\x9f\x58\xda\xe7\x3e\xd8\xe7\x9c\xd2\xdd\x7d\xb0\xf9\x8c\xd2\x8e\xfb\x00\x27\x93\xe2\x64\x52\x9c\x4c\x8a\x93\x49\x71\x32\x69\x67\x27\x93\x36\x58\xfd\xd7\x4e\x25\xdd\x9a\x46\x7a\x41\x11\xa6\xcd\x5a\x33\xe2\x93\x55\x77\x77\xf7\xb6\x53\x55\x4f\xdb\xef\x38\x4b\xb5\x93\x11\x5d\x3f\x47\xb5\xe3\x61\x3d\xeb\xe9\xa9\xbb\xbb\x67\xcb\xc9\xa9\x5d\x2f\x9b\x7d\x3d\x2f\x75\x77\xa7\xd5\x70\x8f\x83\xfd\x79\xf6\xaf\x3f\x3a\x04\x72\x35\x87\xcd\x74\xc4\xe5\xca\x30\x2e\x76\x6a\xc0\x95\x27\xeb\x1c\xca\xdd\x14\x06\x01\x19\x3d\x56\x3c\x6a\x9b\xa2\xb0\x74\xae\x2b\x16\x72\xe9\xda\x9d\x21\x3d\xe0\x3c\xe0\xbc\x01\xe3\x3c\xa0\x3c\xa0\x3c\xa0\x3c\xa0\x3c\xa0\x3c\xa0\x3c\xa0\x3c\xa0\x3c\xa0\x3c\xa0\x3c\xa0\x3c\xa0\x3c\xa0\x3c\xa0\x3c\xa0\x3c\xa0\xbc\x51\xa1\xbc\xf2\x81\x38\xcd\x5d\x10\x38\x0e\x07\xb0\xf2\xfc\x68\x0b\xb0\x12\xb0\x12\xb0\x12\xb0\x72\xa5\xd3\xfa\x07\x2b\x77\xd4\xc6\xe8\x41\xfe\xe0\xf6\x74\xcb\xf3\x67\x10\x36\xa8\xd3\x08\xe8\x08\xe8\x38\x5c\xe8\x88\xe2\x9a\x40\x8f\x40\x8f\x40\x8f\x40\x8f\x40\x8f\x40\x8f\x40\x8f\x40\x8f\x40\x8f\x40\x8f\x40\x8f\x40\x8f\x40\x8f\x40\x8f\x40\x8f\x23\x44\x8f\x00\x73\x00\x73\x00\x73\xc3\x18\x51\x80\xb9\x6a\xf7\x00\xcc\x5d\x02\x98\xeb\x49\x1e\xe1\x09\xe0\xdc\x19\x33\x09\xf7\x38\x2c\x1e\x58\x0f\x58\x6f\x58\x58\x0f\x48\x0f\x48\x0f\x48\x0f\x48\x0f\x48\x0f\x48\x0f\x48\x0f\x48\x0f\x48\x0f\x48\x0f\x48\x0f\x48\x0f\x48\x0f\x48\x0f\x48\x0f\x48\x6f\x64\x48\x0f\xe5\xf5\x81\x2d\x81\x2d\x0f\xe8\x77\x60\x4b\x60\x4b\x60\xcb\xcb\xc6\x96\xa9\x14\x7f\xe6\x22\xa6\x17\xc3\xe1\xca\x83\xd0\xe3\x59\x6a\x9a\xae\x0c\xf7\x5c\xe4\x4c\xc6\xb3\x24\x5b\xf8\xe9\xcd\x99\x41\x1a\x9b\x59\xe1\x5c\xe4\xf7\xe5\x5e\xb8\x7f\xf8\xf8\xdf\xab\x3f\x41\x21\xd7\x3d\xd9\x9c\xef\xc4\xa1\x93\xb9\xf2\xcc\x28\xfd\xec\x4d\xf9\xd6\x0d\x5e\xa9\xe7\xb7\xc3\x7e\xab\x2a\xd6\xb1\x59\x2f\xf7\x78\xa5\xfe\xf9\xf6\xfe\xe1\xe3\x97\xba\x1f\xe2\xc5\xda\xff\xc5\x72\x1d\x49\x09\xc8\x63\x7a\xbf\xfe\xdf\xf3\xdb\xe3\x5e\xb1\x60\xa9\xf2\x64\xe1\x66\x68\xa9\x6f\xcb\xef\x9e\x71\x43\xb4\x1b\x4f\x63\xae\xc9\x82\x24\x8a\x44\xe0\xb6\x9e\x5f\xe8\x69\xdc\x68\xbd\xf7\x4f\xb3\xe5\xc5\x31\xd7\x59\x79\x77\x7e\xf1\x57\x6d\x72\xc5\x0d\xb0\x7c\xad\x68\xbc\x51\x20\xd3\x24\xdc\x58\x2a\xbd\xee\xb3\x4e\xe6\xf4\x7b\x6a\xf5\xe7\x34\xaf\x2e\xb2\x6c\xdb\x8c\xde\x3e\x95\xc1\x5f\xc1\x5f\xc1\x5f\xc1\x5f\xc7\xc6\x5f\xb7\x58\x8e\xbb\x18\xec\x76\x2f\xc4\x76\x0b\x72\xaf\xb5\xf7\x5f\xba\xe3\xac\xe7\xf9\x86\xce\x80\x09\xf4\x8c\x32\xf3\xa0\xd2\xb6\x72\xac\xd3\x54\xb0\x54\xf7\x96\xca\x45\x38\x61\xf7\x31\x93\xb1\x59\x59\x92\x8c\x2d\x63\xbf\x38\x85\x2c\xcc\x5e\xbf\x2c\x63\x16\xca\x4c\xef\x89\xcf\xc2\xcf\x78\xbd\x7c\x12\x27\xb0\xaf\xbc\x9b\x1b\xb6\x83\xd9\x6c\x99\xd1\x5b\x96\x66\x49\x20\x14\x39\xf4\xad\xfb\xc3\xce\xb2\x89\xf1\x1e\x9b\xd1\xa2\xb9\xf3\x23\xbb\x65\xf7\x51\xf4\x23\xb9\xeb\x43\xbd\x4a\x2f\x63\x3d\xf0\x73\xa1\xfc\x94\xb4\x97\x13\xe1\x01\x03\x65\xda\x72\x9e\x61\x3a\x19\x34\x6f\xd6\x15\x9b\xc1\xf9\xc9\x7a\xe4\xf7\xb2\x67\x4c\xc6\x4c\x19\x87\x15\x9b\x8a\x99\x89\xee\xf3\x80\xa5\x90\x12\x76\xf5\xa2\xa9\xb3\x14\x66\x73\x98\x0a\x16\x27\xf1\x6d\x2c\xe6\x9c\x26\xa8\xf5\x6d\x4d\xd8\xef\x7e\xc3\x36\xb0\xd5\xbf\x1a\x56\x3e\xca\xc5\x42\x84\x92\xe7\x22\x7a\x2d\xc2\xee\x8a\x2d\x57\x46\x37\xd6\x77\x45\x9d\xce\xe6\x19\x0f\xe8\xad\x91\x49\xe8\x05\x41\xb1\x69\x53\x4c\xa3\x9b\xa5\x4b\xa5\x1f\xb2\x3c\x5c\x5c\xff\xd2\x35\xc8\xde\x64\x66\xd6\x40\x77\x89\x89\x79\xce\x85\xe0\x71\xed\x33\x1e\x30\xcc\xf4\xcc\x0f\xf4\xc8\x75\xfe\xc0\x1d\x1e\xc1\xbe\x4c\xff\x7d\xe2\x25\x9a\xf5\xcb\xe6\x98\x89\x93\x4d\x7f\x44\x4f\x20\x7a\x02\xd1\x13\x88\x9e\x40\xf4\x44\x67\xd1\x13\x0d\xf7\x82\xb5\x08\x8a\xd3\x6d\x8b\xef\x4b\x59\x5d\x69\x24\xb8\x12\x7e\x09\x7a\xc8\x92\x94\xcf\x49\x1d\x3d\x24\x91\x0c\x5e\x2b\xb1\xfa\x6e\xd2\x15\x69\x61\x7a\xda\xbd\x9d\xfc\x6d\xc2\xbe\x9a\xf5\xcc\x48\x97\x54\xc4\xfa\x65\x29\xf6\x54\xc1\x92\x2c\x7d\xe4\xb1\xcb\x1d\xc8\x96\xe2\x6e\xc6\x23\x67\x2b\x7f\xbb\x32\x1f\x7f\xbb\x62\x33\x19\xf3\x48\xfe\xc7\x6d\x24\x53\xc1\x78\x48\xb8\x39\xb9\x33\x28\x2e\x2c\xcc\x30\x73\xf9\x6b\x55\xfc\xc8\xd8\xa7\x13\xf6\x41\xd2\xe2\x58\x7a\xf4\x24\x5b\x6f\x5b\x11\x5c\x90\x1b\xf3\x98\x6c\x94\x24\x7f\x3c\x64\x40\x4d\x0b\xde\xbb\xb6\x6f\x94\x3c\x75\x60\xaf\x5d\xc3\x8c\x9a\xae\x5f\xd8\xc7\xe4\x85\xcd\x79\x36\xe5\xf3\x8a\xd7\xd2\x1b\x35\x22\x9b\x25\xd9\x42\x8f\x49\x6d\x7f\x7d\x5e\x69\xd1\xe6\xee\x22\xd1\xeb\x14\x6b\x6a\xfa\x56\x6a\x35\x19\xc8\xb0\x30\x85\x49\x2b\x90\x73\xc2\x8f\xb1\x22\x96\x47\x9f\x3a\x35\x30\x29\x0d\xa6\xdb\x47\x3c\xdd\xf7\x79\x30\xd5\x9b\x4d\xd8\x7d\x10\x88\x34\xa7\xbd\xa9\x6c\xd9\x5d\x9b\x36\x5c\xb3\x5b\x3b\x01\xab\x13\x54\xfd\xc4\xae\x7f\xe6\xc1\xd3\x3c\x4b\x96\x71\xa8\xbf\x45\x39\x25\xf4\xa5\x95\x8e\x33\x12\xd2\xea\xe3\xea\x45\x5c\x0b\xa6\xfe\x4a\x3f\xb1\xeb\x5f\x93\x4c\x94\x2e\xcb\x02\xae\x02\x1e\xea\xd6\xdb\xfe\x31\x29\x47\x74\x3d\x65\x4c\xcf\xb5\x0b\xce\xfc\x35\x0e\x99\x90\xe9\xea\x74\x3f\x8f\xe2\x1c\x71\x18\x50\xb3\x71\xd8\x16\x0a\x74\xae\x51\x40\x50\x50\x67\xe3\xbb\x1e\x18\x74\x3a\xdf\xc6\x39\x43\x84\x9a\x75\xd6\x96\x30\xa1\x63\xf5\x4f\x2d\xc2\x03\x7a\xde\x13\xd3\x7d\xcd\x79\xbe\x6c\xca\xe7\x86\x48\x9c\x4b\xbf\xdc\x90\x5e\x6d\x36\xe5\x42\x30\xb5\x92\x69\x5d\x03\xb3\xeb\x33\xac\x1b\xe0\xdf\xd5\xdc\xea\x6d\x69\xd5\xad\x9f\x2a\x61\x1c\x67\x99\x35\xb6\x9d\xc2\x77\x07\x4a\x1c\x80\xc3\xf5\x05\x57\x61\x78\x8b\x08\x1c\x39\xe3\x97\x93\x33\xde\x6c\x0f\xda\x95\x37\x7e\x3a\x63\x0d\x11\x0c\x88\x60\x40\x04\x03\x22\x18\x10\xc1\x50\xb7\xf8\x02\x8d\x0f\xa8\x47\x40\x4b\x41\x4b\x41\x4b\x41\x4b\x41\x4b\x41\x4b\xc7\x45\x4b\x01\x30\x00\x30\x00\x30\x00\x30\x3a\x07\x18\x7b\x40\xfe\x9e\x66\x3c\x37\xeb\xc2\xf5\xac\xe7\x63\x3d\x6e\xbd\x42\x3f\x1b\x7f\x70\x59\x67\xfa\x16\xfe\xfc\x5b\xef\xc4\x2d\x70\x53\x95\x87\x3c\xbf\x9d\x6c\x72\xf9\x8f\x3c\xff\x71\x37\x8d\x6a\xad\x7c\xe7\xb9\x08\xd4\x01\x07\xfb\x0e\xe5\x20\x9c\x37\x2b\xa3\x78\x95\x26\xaa\x65\xdc\x66\x2c\x1f\xc6\x0f\x21\x6b\xe6\xb7\x1d\xb2\xb5\xc3\xd2\x4b\xb7\x1c\xb0\xd4\x87\x15\xa7\x95\xdc\x54\xe4\x47\x95\x67\x48\x6f\xf3\xa3\xc8\x3b\xf2\x89\xc7\x7c\x2e\x32\xe3\xe7\xa3\x73\xc6\xb8\x52\x49\x20\xc9\x70\xf5\x1e\x35\x4e\x8e\xd1\x24\x63\x22\xce\xb5\x92\x74\x96\xfc\x82\x3f\xe9\x5e\xcc\x1f\x85\x12\x4e\x8e\x95\xb3\x80\x5c\xb6\x10\xc9\x51\xf2\x9e\x25\x19\x7b\xfb\xee\x07\xfd\xdd\x8c\x07\x84\xcb\xa2\x24\x9e\x1b\xf1\x45\x1e\xae\x20\x89\x73\x2e\x63\xb3\xc2\x91\x07\xa9\xf8\x2e\x21\x04\x0b\xf3\xd8\xf4\xd5\xdb\x17\xf3\x24\xe2\xf1\x7c\x92\x64\xf3\xbb\xf4\x69\x7e\xb7\x8c\x65\x90\x84\xe2\xee\x2f\x1f\xd5\x83\xbe\xca\xc1\x2e\x69\xdb\x39\x6d\x0e\x4f\xaf\xd4\xda\x45\x88\xa8\xa6\x02\xea\x5d\x03\x01\xf5\x8b\x71\xc5\x0d\xb8\x8d\xef\x76\xb6\xd1\x44\x13\x0f\xb8\x91\xa3\x54\xc2\x24\xae\x06\xa8\x84\xdf\xb0\xe3\xcf\x36\xa9\xa9\x17\xd4\xe1\x11\x27\x07\xa9\xcd\xfa\x63\x4d\xce\xae\x36\x07\x72\x98\x09\x04\x63\x79\x90\x7b\x2b\x18\x91\x3e\x7e\x41\xe9\xe3\xc8\x93\x43\x9e\x1c\xf2\xe4\x90\x27\x07\x5b\x77\xd3\x5b\xd4\xcb\xa4\x94\xf3\x58\x78\xc8\xa9\x61\x5b\x6c\x37\x6b\xac\x0c\xd0\x7a\xf3\xbe\xfd\xd6\x33\x69\x32\xc1\xc3\x15\x3d\x76\x80\xd9\xa5\xaf\x72\xba\xf4\x99\x92\x7c\x11\x7f\x52\x50\xdc\x54\xff\xc5\x83\x7c\xc2\xd8\x07\xfd\x5f\xf7\xef\x0b\x2e\xc9\x8b\xa9\x58\x10\x2d\x55\x2e\xb2\x62\x53\x32\xd1\xb3\x2c\x92\x4f\x82\x5d\xff\x0f\x5f\x08\x95\xf2\x40\x5c\x6b\xed\xe9\xf4\xd2\x84\x3d\x44\x3c\x8e\x85\x11\xad\xa4\x68\x78\x64\x44\xd4\xdb\x1f\x0e\x59\xe5\xe9\x19\xcf\xa4\x35\x7c\xa7\x79\xa9\x3e\x75\xdd\xa7\x5b\xca\x3e\x98\x1e\xd3\xfb\x4b\xaa\x5c\xef\xd8\xb8\xb1\xa5\x12\x19\x05\x7c\x15\xaa\xfb\xb5\xe3\x8e\xd2\x0f\x33\x5e\x3c\xdf\xef\x4d\x10\x7e\x42\x76\xf4\x5e\x33\x17\x83\x74\x13\x1e\x03\xcc\xcb\xd5\x71\x9a\x3d\x0d\xea\xe2\x9c\x22\x1c\x80\xe2\x74\x0e\x3a\x03\xfe\x96\x7e\xfb\xd7\xed\x2b\xe0\x42\x64\x73\xd1\xe8\x9b\x54\xdc\x59\xcc\x65\x70\xdb\xfc\x37\xfa\xef\x57\xfb\x4d\x5a\x6b\x9b\x88\x9a\x94\x67\xb9\xa4\x34\x3a\x13\x53\x76\xbc\xc0\xa1\x07\xe8\x9d\x5b\xb9\xab\x20\x86\x2d\x66\xc4\x43\x35\xea\x8b\xc1\xd9\x3c\x72\x67\xf3\xe5\x44\x27\xac\xe4\xaa\xb8\x97\xcb\xe4\x53\xe9\x65\xa8\xc8\xd1\xff\x6e\xc3\x12\xf5\x3d\xb9\xda\x4c\x12\x35\x8f\xe8\x97\x71\x12\xdf\x9a\x5f\xd3\x37\xc8\xdb\xad\xd8\x77\x7f\x57\x49\xfc\x60\x52\xd5\x3f\xe9\xc5\xd0\xfe\xfd\xd5\x2d\x91\xc5\x3f\x7e\xdf\xa7\xb0\x89\xe6\xf3\xe6\xd7\x24\x0b\x08\x07\xcc\x13\x1a\xfc\x84\x7d\xbb\x9a\xe9\x7f\xfb\x76\xc5\xee\x2b\xbd\x49\x91\xf0\xc6\x77\x4f\x86\x86\x7d\x51\x6f\x79\x40\x03\x40\xc9\xce\x91\x0c\xac\x37\x92\xec\x92\xe4\xc5\x8e\xad\x49\x06\x4e\x45\x92\x46\x62\xc2\xcc\x3d\xe9\x8c\x03\x37\xa7\x28\x1e\xbd\x76\x20\xfc\xed\x0f\xe9\x5e\x7d\x23\x98\x27\xe6\x03\x98\x27\xc3\x33\x4f\xd2\x95\xd0\xef\x01\x1a\x28\xcb\xd6\x3d\x61\x69\xc4\x83\x16\xb4\xa2\xbd\xd0\xc5\xa8\x45\x84\xbc\x42\x54\xee\x39\x4c\x97\x23\x2a\x7b\xa4\xdd\x20\x31\xfc\x27\xfd\x5a\xd2\x2e\x22\xe4\x75\x9c\x32\x6a\x39\x48\x2f\xef\x1b\xd6\x5a\x30\xe8\x9d\x32\x5c\xf9\x90\x92\x93\x7b\x31\x4a\x73\x1f\xb7\x6b\x9e\x8a\x56\x5a\x6a\x8e\x05\x13\x8b\xc9\x6a\xdf\x03\x19\x55\x3b\x11\xc8\x08\xc8\x68\x44\xc8\xa8\xc5\xfd\x66\x1f\x78\x54\xb3\xe1\x0c\xd2\x29\x00\x84\x04\x6b\xff\xf2\xac\x7d\x20\xa4\x36\xe7\x0d\x10\x12\xfc\x3b\x30\x57\xfa\x6a\xae\x00\x21\x6d\x44\x48\xad\xfa\x2a\xf6\x81\x49\x63\x51\x8f\x40\x4a\x10\x99\x7b\x0e\xd3\xe5\x88\xcc\x1e\x69\x39\x48\x0e\xff\x49\xbf\x96\x34\x20\xa5\xc1\xca\xaa\xd1\x23\x25\x3a\x38\x72\x33\x58\xea\x14\x25\xd9\xf3\xc6\xe3\x50\x3e\xcb\x70\xc9\xa3\xf2\xd9\xa5\xdc\x57\x18\xd8\xd4\x25\x93\x52\x32\xfd\x8f\x3e\x0d\xff\x9a\x2e\x7a\x5d\x94\x9e\xa9\xd4\x12\xf1\x7a\x8e\xc9\x58\xe5\x82\x57\x3c\xbd\xab\x6a\xef\x65\x0f\x4f\xe1\x6f\x2b\x67\x32\xe2\xa8\xd1\xbe\x66\x0e\xd3\x49\xb9\x1f\x9e\x45\x7c\xd9\x87\x88\xd2\x28\x5e\xe2\x49\xa2\x28\xf7\x36\xe2\x72\x6f\xbb\x51\xdd\xae\x52\x6f\x5b\xbd\x7e\x2d\x60\x48\x14\x78\x43\x81\x37\x14\x78\x43\x81\xb7\xb1\x15\x78\xdb\xbd\xf2\xd6\x16\x77\xeb\x38\xe8\xe3\x64\x25\xdd\x76\x37\x7f\x73\x39\xb7\x3e\xf7\xc1\x3e\x45\xdc\x76\xf7\xc1\xe6\x02\x6e\x1d\xf7\x01\xca\xb6\xa1\x6c\x1b\xca\xb6\xa1\x6c\x1b\xca\xb6\x75\x56\xb6\xad\xc1\xea\xbf\x56\xb2\x6d\xeb\xb1\x9d\x17\x14\xf3\xd9\xac\x35\x23\x2e\x3b\xb7\xbb\xbb\xb7\x95\x9c\x3b\x6d\xbf\xa3\xd0\x5c\x27\x23\xba\x5e\x64\xae\xe3\x61\x3d\x6b\x69\xb9\xdd\xdd\xb3\xa5\xac\x5c\xd7\xcb\x66\x5f\x8b\xc9\xed\xee\xb4\x1a\xb2\x71\xb0\x3f\xcf\xfe\xf5\x47\x7b\x30\xad\xe6\xc8\xfe\x8e\x98\x5a\x19\xa4\xc5\x6e\xf3\x4f\x66\xec\x49\xc6\x9b\x03\x9f\x5a\x01\x6a\x37\x85\xf6\x27\xfb\xc6\xea\x44\x6d\x3e\x14\x46\xcd\x75\xc5\x18\x2e\x5d\xbb\x2d\x1c\x07\x14\x07\x14\x37\x2c\x14\x07\x0c\x07\x0c\x07\x0c\x57\x7c\x11\x18\x0e\x18\x0e\x18\x0e\x18\x0e\x18\x0e\x18\x0e\x18\x0e\x18\x0e\x18\x0e\x18\x0e\x18\x0e\x18\x0e\x18\x6e\x78\x18\x0e\x07\xcb\x00\x32\x02\x32\x02\x32\x9e\x7f\x44\x01\x19\xab\xdd\x03\xc8\x38\x38\xc8\x38\x15\x39\x7f\x7b\x77\x10\x43\x3c\x4b\xce\xef\xca\xb0\xcf\x45\x5e\x55\xf2\x66\x84\xb7\x70\xbf\xb9\xc8\x57\xa8\x1f\x75\xc1\xfd\xc3\xc7\x2f\x75\xbf\x46\xc2\xf3\x9e\x14\xae\xd4\x91\x94\xc5\x38\x32\x14\x47\x93\xa5\xf4\xf3\x37\xe5\x47\xd8\xe3\x8d\x6b\x94\x22\xdb\x61\x05\xfe\x52\x19\xe2\x2d\x49\xb1\x5b\xde\xa3\xda\x6a\xfc\xd4\xb6\x5f\xfc\xa5\xcf\x7f\x2e\xfe\x40\x8a\xf3\x83\x1f\x81\x1f\x81\x1f\x81\x1f\x8d\x8d\x1f\x35\x3b\xc1\xa6\x96\x21\x9d\xec\x70\x21\x9c\x01\xd5\x78\xa0\xce\x79\x06\xd4\xc9\xa0\xdf\x1e\xa7\x2e\xd5\x42\xaf\x93\xf5\xc8\xef\x65\xfb\x5e\xc6\x4c\x19\xb3\x9b\x4d\xc5\xcc\x44\x27\x79\x07\x71\x21\x25\xec\xea\x45\x53\xa7\x74\xea\x55\x9c\xc4\xb7\xb1\x98\x73\x9a\xa0\xd6\x42\x2f\x9f\x8e\x65\x60\x91\x7f\x35\xac\x86\x94\x8b\x85\x08\x25\xcf\x45\xf4\x5a\x84\x0d\x15\x5b\xae\x8c\x6e\xac\x05\x4e\x9d\xce\xe6\x19\x0f\xe8\xad\x91\x49\xe8\x05\x41\xb1\x69\x53\x4c\x96\x9b\xa5\x4b\xa5\x1f\xb2\x3c\x5c\x5c\xff\xd2\x35\xc8\xde\x64\x56\x2a\x5a\x2d\xf5\x0f\xe8\x39\xcd\x59\xa1\x35\xcf\x78\xc0\x30\xd3\x33\x3f\xd0\x23\xd7\x79\x35\x76\xf8\x35\xfa\x32\xfd\xf7\xe1\xbd\xcd\xfa\x65\x33\xf3\x3d\xd9\xf4\x07\xfd\x05\xfd\x05\xfd\x05\xfd\x05\xfd\xed\x8c\xfe\x36\xdc\x0b\xd6\x08\xf0\xe9\xb6\xc5\xf7\xa5\x14\x93\x34\x12\x5c\x09\xbf\x04\x3d\x64\x49\xca\xe7\xa4\x8e\x1e\x92\x48\x06\xaf\x95\x58\x63\x37\xe9\x8a\x1c\x15\x3d\xed\xde\x4e\xfe\x36\x61\x5f\xcd\x7a\x66\xa4\x4b\x2a\x62\xfd\xb2\x14\x7b\xaa\x60\x49\x96\x3e\xf2\xd8\xc5\x3e\x67\x4b\x71\x37\xe3\x91\xb3\x95\xbf\x5d\x99\x8f\xbf\x5d\xb1\x99\x8c\x79\x24\xff\xe3\x36\x92\xa9\x60\x3c\x24\x68\x96\xdc\x19\xa0\x10\x16\x66\x98\xb9\xfc\xb5\x2a\x7e\x64\xec\xd3\x09\xfb\x20\x69\x71\x2c\x3d\x7a\x92\xad\xb7\xad\x40\xa4\xb9\x31\x8f\xc9\x46\x49\xf2\xc7\x43\x06\xd4\xb4\xe0\xbd\x6b\xfb\x46\xc9\x73\xd0\x49\xe6\x7b\x19\x66\xd4\x74\xfd\xc2\x3e\x26\x2f\x6c\xce\xb3\x29\x9f\x57\x5c\x97\xde\xa8\x11\xd9\x2c\xc9\x16\x7a\x4c\x6a\xfb\xeb\xf3\x4a\x8b\x36\x77\x17\x89\x5e\xa7\x58\x53\xd3\xb7\x52\xab\xc9\x40\x86\x85\x29\x4c\x5a\xc1\x1c\x38\xef\xc6\x58\x6f\xd6\x76\x27\x75\x6a\x60\x52\x1a\x4c\xb7\x8f\x78\x46\xe9\xe3\xf8\xab\x37\x9b\xb0\xfb\x20\x10\xa9\x39\x4f\xb6\x6c\xd9\x5d\x9b\x36\x5c\xb3\x5b\x3b\x01\xab\x13\x54\xfd\xc4\xae\x7f\xe6\xc1\xd3\x3c\x4b\x96\x71\xa8\xbf\x45\x31\xf1\xf4\xa5\x95\x8e\x33\x12\xd2\xea\xe3\xea\x45\x5c\x0b\xa6\xfe\x4a\x3f\xb1\xeb\x5f\x93\x4c\x94\x2e\xcb\x02\xae\x02\x1e\xea\xd6\xdb\xfe\x31\x29\x13\x74\x3d\x65\x4c\xcf\xb5\x0b\xce\xfc\x35\x0e\x99\x90\xe9\xea\x74\x3f\x8f\xe2\x1c\x71\x30\x43\xb3\x71\xd8\x16\xd0\x70\xae\x51\x40\x68\x43\x67\xe3\xbb\x1e\xde\x70\x3a\xdf\xc6\x39\x03\x1d\x9a\x75\xd6\x96\x60\x87\x63\xf5\x4f\x2d\xc7\x03\x89\xde\x13\xd3\xd9\x82\x09\x23\x07\xd0\xa5\x9f\x6f\x48\x08\x35\x3b\x73\xa1\x9a\x7a\x9f\x1b\xba\xd2\xc4\xf5\x04\xd1\xd6\xd3\xdc\x8d\x0b\x2d\xb3\x66\xb7\xd3\xfa\xbb\x32\xdc\xb7\xd0\x71\x7d\xc1\x5a\x36\xde\x22\x11\x47\x0a\xec\xe5\xa4\xc0\x36\xdb\x92\x76\xa5\xc1\x9e\xce\x76\x43\x40\x03\x02\x1a\x10\xd0\x80\x80\x06\x04\x34\xd4\x2d\xbe\x20\xe5\x03\xea\x11\xc0\x53\xc0\x53\xc0\x53\xc0\x53\xc0\x53\xc0\xd3\x71\xc1\x53\xf0\x0c\xf0\x0c\xf0\x0c\xf0\x8c\xce\x79\xc6\x1e\xcc\xbf\xa7\x69\x9c\xcd\xba\x70\x3d\x95\x73\x54\x75\xdf\x37\xfe\xe0\xb2\x8e\x20\xdd\xaf\x12\x2a\xb9\xfd\x37\x96\x43\xbd\x84\x14\xc9\xdd\x84\x6a\x10\x85\x03\x77\x52\xa9\x03\x8e\x2d\x1d\xca\x61\x1f\x6f\x56\x86\xf2\x2a\x4d\x54\xcb\x08\xce\x18\x42\x8c\x1f\x42\xdb\xcc\x6f\xbb\xe6\x6d\x43\x2e\xa3\xbf\x7d\x15\x42\x2d\xfd\xcb\xc9\xa3\x42\x2d\x7d\xd4\xd2\xaf\x79\x98\x51\xaa\xab\x11\x15\xd4\x6f\xab\xa1\xef\x76\x36\xd4\xc4\x1f\x0f\xbd\xa5\xe3\x15\xcb\x24\xbd\x86\x2a\x96\xdf\xb0\x96\x8e\x49\xa9\x29\x7e\xd2\xe1\x69\x29\x07\xa9\xd2\x2d\x27\xa4\x9c\x5d\x95\x0e\xe4\x5c\x14\x68\xca\xf2\x20\xf7\x56\x53\x22\x13\xfd\x82\x32\xd1\x91\x72\x87\x94\x3b\xa4\xdc\x21\xe5\x0e\xe6\xf0\xa6\xb7\xa8\x97\xf9\x2d\xe7\x31\xfd\x90\x9e\xb3\xd3\x9e\xb3\x66\xcb\x50\x2d\x3a\x8f\x04\x5a\x4f\xca\xc9\x04\x0f\x57\x94\xd9\x01\x56\x98\xbe\xca\x89\x33\x71\x4a\x6a\x46\xfc\x49\xf1\x75\x53\xfd\x17\x0f\xf2\x09\x63\x1f\xf4\x7f\xdd\xbf\x2f\xb8\x24\xbf\xa7\x62\x41\xb4\x54\xb9\xc8\x8a\x3d\xca\x04\xe2\xb2\x48\x3e\x09\x76\xfd\x3f\x7c\x21\x54\xca\x03\x71\xad\xa5\xa8\x93\x4f\x13\xf6\x10\xf1\x38\x16\x46\xc3\x92\xc0\xe1\x91\xd1\x54\x6f\x7f\x38\x64\xd1\xa7\x67\x3c\x93\xf4\xf0\x9d\xe6\x95\xfb\xd4\x75\x9f\x6e\x29\xfb\x60\x7a\x4c\x6f\x37\xa9\x72\xbd\x63\x43\xd0\x96\x4a\x64\x14\x3b\x56\x88\xf0\xd7\x8e\x3b\x4a\x3f\xcc\x78\x49\x7f\xbf\xf7\x44\xf8\x13\xcb\xa3\x79\xec\xfe\x33\x17\xc3\x75\x27\x1e\xc3\xde\x51\x46\xa4\x9f\x91\x05\x14\x01\x74\xd0\x01\xf4\xb7\xf4\xdb\xbf\x6e\x5f\x10\x17\x22\x9b\x8b\x46\xdf\x54\x79\xc6\x73\x31\x97\xc1\x6d\xf3\xdf\xe8\xbf\x5f\xed\x37\x69\xe9\x6d\x22\x74\x52\x9e\xe5\x92\x12\xf4\x4c\xb4\xda\xf1\xa2\x27\xad\x29\x6e\xdd\x13\xcf\x73\x57\xf1\x10\x5b\x2c\x8d\x87\x6a\x50\x19\x83\x3f\x7a\xe4\xfe\xe8\xcb\x89\x71\x58\x49\x85\x71\x2f\x97\x49\xd7\xd2\x6b\x51\x71\x04\xc0\x77\x1b\xd6\xa9\xef\xc9\x1b\x67\x72\xb4\x79\x44\xbf\x8c\x93\xf8\xd6\xfc\x9a\xbe\x41\x0e\x71\xc5\xbe\xfb\xbb\x4a\xe2\x07\x93\x09\xff\x49\xaf\x88\xf6\xef\xaf\x6e\x9d\x2c\xfe\xf1\xfb\x3e\x05\x5f\x34\x9f\x37\xbf\x26\x59\x40\xc4\x60\x9e\xd0\xe0\x27\xec\xdb\xd5\x4c\xff\xdb\xb7\x2b\x76\x5f\xe9\x4d\x0a\xb4\x37\xee\x7d\x32\x3e\xec\x8b\x7a\xcb\x03\x1a\x00\xca\xa5\x8e\x64\x60\x1d\x96\x64\xab\x24\x2f\x76\x6c\x4d\xae\x71\x2a\x92\x34\x12\x13\x66\xee\x49\x47\x28\xb8\x39\x45\xe1\xee\xb5\x03\xe1\x6f\x7f\x48\xf7\xea\x1b\xc1\x64\x31\x1f\xc0\x64\x19\xb2\xc9\x92\xae\xc4\x98\x0f\xd5\x68\x59\xb6\xee\x31\x4b\x23\x1e\xb4\xa0\x1f\xed\x85\x2e\x4b\x41\x22\xa2\x16\x6a\xf3\x90\x61\xba\x1c\xb5\xd9\x23\x51\x07\xed\xe1\x3f\xe9\xe1\xba\x76\x39\x11\xb5\x23\x16\x59\xcb\xe1\xfa\x85\xdf\xb0\x76\xc3\x4c\xef\x94\x81\xd5\x87\x94\xc9\xdc\x0b\x77\x9a\xfb\xb8\xed\xf4\xa4\xe0\xd3\xf2\x78\x2c\xa7\x58\x65\x4e\xb8\xca\x80\x3e\x81\x3e\x81\x3e\xd5\x7c\xf3\x7c\xf4\xa9\xc5\x3d\x68\x6f\x0e\x55\xb3\x09\x0d\xd2\x97\x00\x1a\x05\xff\xc0\xe5\xf9\x07\x40\xa3\xda\x9c\x37\xa0\x51\xf0\x08\xc1\x84\x61\xbd\x37\x61\x40\xa3\xea\x47\xd3\xd1\xa8\x56\x7d\x1a\x7b\x73\xa9\xb1\x28\x4a\xd0\x29\xa8\xcf\x43\x86\xe9\x72\xd4\x67\x8f\x44\x1e\xb4\x88\xff\xa4\x87\xeb\x1a\xe8\xd4\x08\x44\xd7\x05\xd1\x29\x3a\x14\x73\x33\xa3\xea\x94\x4a\xd9\xb3\xd4\xe3\x50\x3e\xcb\x70\xc9\xa3\xf2\xb9\xac\xdc\x57\x4f\xd8\xd4\x39\x93\x52\xb2\xff\x8f\xfe\x98\x80\x6b\xba\xe8\x75\x51\x56\xa7\x52\x27\xc5\x4b\x3e\x26\x63\x95\x0b\x5e\x71\x10\xaf\x0a\xc2\x97\x7d\x1d\x8c\xbf\xad\x1c\x35\x89\xb3\x54\xfb\x9a\xde\x4c\x47\x01\x7f\x78\x16\x31\x0e\x48\x35\xd3\xfc\x62\x4f\x49\x45\x65\xbb\x11\x57\xb6\xdb\x0d\xfc\x76\x55\xb5\xdb\xea\x36\x6c\x01\x66\xa2\x96\x1d\x6a\xd9\xa1\x96\x1d\x6a\xd9\x8d\xad\x96\xdd\xee\x95\xb7\xb6\x8e\x5d\xc7\xa1\x23\x27\xab\x5e\xb7\xbb\xf9\x9b\x2b\xd7\xf5\xb9\x0f\xf6\xa9\x57\xb7\xbb\x0f\x36\xd7\xaa\xeb\xb8\x0f\x50\xa1\x0e\x15\xea\x50\xa1\x0e\x15\xea\x50\xa1\xae\xb3\x0a\x75\x0d\x56\xff\xb5\xea\x74\x5b\x4f\x19\xbd\xa0\xc8\xd1\x66\xad\x19\x71\x85\xbd\xdd\xdd\xbd\xad\xba\xde\x69\xfb\x1d\x35\xf5\x3a\x19\xd1\xf5\x7a\x7a\x1d\x0f\xeb\x59\xab\xe8\xed\xee\x9e\x2d\x15\xf4\xba\x5e\x36\xfb\x5a\x37\x6f\x77\xa7\xd5\x30\x8e\x83\xfd\x79\xf6\xaf\x3f\x5a\x06\x6c\x35\xb5\x06\x3a\xe2\x6c\x65\xb8\x16\x3b\x05\x90\xcc\xd8\x93\x8c\x37\xc7\x4b\xb5\x02\xd9\x6e\x0a\x03\x80\x8c\x1c\x2b\x16\xb5\x0d\x51\x58\x36\xd7\x15\x8b\xb8\x74\xed\x56\x11\x1d\xf0\x1c\xf0\xdc\x00\xf1\x1c\xd0\x1c\xd0\x1c\xd0\x1c\xd0\x1c\xd0\x1c\xd0\x1c\xd0\x1c\xd0\x1c\xd0\x1c\xd0\x1c\xd0\x1c\xd0\x1c\xd0\x1c\xd0\x1c\xd0\x1c\xd0\xdc\xe0\xd1\x1c\x8e\xac\x01\x78\x04\x78\x04\x78\x3c\xff\x88\x02\x3c\x56\xbb\x07\xe0\xb1\xd7\xe0\x31\x13\x73\x49\xc7\x79\xe9\xa7\xb4\xe8\xf1\x20\x98\x78\x96\x4c\xe1\x95\x01\x9f\x53\xd1\xd5\x59\x92\x2d\xfc\x04\xe7\xcc\x00\x8c\xcd\x0c\x70\x2e\xf2\xfb\x6a\x3f\xdc\x3f\x7c\xfc\xef\xd5\x1f\x21\x41\x7a\x4f\x06\xe7\x3b\x71\xf8\x04\xae\x3c\x37\x4a\x3f\x7c\x53\xbe\x79\xa3\x17\xeb\xf9\xed\xb0\xdf\xad\x8a\x7d\x6c\xd6\xcd\xbd\x5e\xac\x7f\xbe\xbd\x7f\xf8\xf8\xa5\xee\xa7\x78\xbd\xf6\x7f\xbd\x5c\x47\x52\xda\xf0\xb8\xde\xb2\xff\xf7\xfc\xf6\xd8\x17\xcd\xe2\x44\x19\x54\x86\xd1\x55\xb4\x6d\x35\x3e\xc6\xd6\xce\x2e\x15\x22\x4f\x66\xec\xfe\xe1\xe3\x57\x73\xff\x2d\xaf\x88\xf9\xe5\xda\x5b\xf2\x8b\xbf\x52\xfd\x55\xba\x3d\x25\xa8\x93\xf9\xfa\x9e\x5a\xfa\x39\x35\xa7\x02\x34\x9b\xad\xdb\xa7\x29\xf8\x2a\xf8\x2a\xf8\x2a\xf8\xea\xd8\xf8\x6a\xb3\xd3\xa1\x6a\x19\xeb\xc9\x0e\xee\xc2\xf9\x6a\x8d\x07\xea\x9c\xe7\xab\x9d\x0c\x8a\xef\x71\xa2\x59\x2d\x14\x3e\x59\x8f\xfc\x5e\xf6\x7f\xc9\x98\x29\xe3\x96\x62\x53\x31\x33\xd1\x7b\x1e\xa0\x14\x52\xc2\xae\x5e\x34\x75\x4a\x27\xca\xc5\x49\x7c\x1b\x8b\x39\xa7\x09\x6a\x3d\x58\xe5\x93\xe7\x0c\x4c\xf5\xaf\x86\x15\x89\x72\xb1\x10\xa1\xe4\xb9\x88\x5e\x8b\xb0\xba\x62\xcb\x95\xd1\x8d\xf5\x50\x51\xa7\xb3\x79\xc6\x03\x7a\x6b\x64\x12\x7a\x41\x50\x6c\xda\x14\xb3\xe8\x66\xe9\x52\xe9\x87\x2c\x0f\x17\xd7\xbf\x74\x0d\xb2\x37\x99\x95\x0a\xd1\x4b\xfd\x03\x7a\x4e\x73\x40\x6f\xcd\x33\x1e\x30\xcc\xf4\xcc\x0f\xf4\xc8\x75\x5e\xbf\x1d\x7e\xbf\xbe\x4c\xff\x7d\xe2\x21\x9a\xf5\xcb\xe6\x98\x88\x93\x4d\x7f\x44\x47\x20\x3a\x02\xd1\x11\x88\x8e\x40\x74\x44\x67\xd1\x11\x0d\xf7\x82\xb5\x08\x89\xd3\x6d\x8b\xef\x4b\x19\x59\x69\x24\xb8\x12\x7e\x09\x7a\xc8\x92\x94\xcf\x49\x1d\x3d\x24\x91\x0c\x5e\x2b\xb1\xf8\x6e\xd2\x15\x29\x5d\x7a\xda\xbd\x9d\xfc\x6d\xc2\xbe\x9a\xf5\xcc\x48\x97\x54\xc4\xfa\x65\x29\xf6\x54\xc1\x92\x2c\x7d\xe4\xb1\xcb\x0d\xc8\x96\xe2\x6e\xc6\x23\x67\x2b\x7f\xbb\x32\x1f\x7f\xbb\x62\x33\x19\xf3\x48\xfe\xc7\x6d\x24\x53\xc1\x78\x48\x50\x39\xb9\x33\xc0\x2d\x2c\xcc\x30\x73\xf9\x6b\x55\xfc\xc8\xd8\xa7\x13\xf6\x41\xd2\xe2\x58\x7a\xf4\x24\x5b\x6f\x5b\x11\x42\x90\x1b\xf3\x98\x6c\x94\x24\x7f\x3c\x64\x40\x4d\x0b\xde\xbb\xb6\x6f\x94\x3c\x07\x95\x0f\xd8\xcb\x30\xa3\xa6\xeb\x17\xf6\x31\x79\x61\x73\x9e\x4d\xf9\xbc\xe2\x9b\xf4\x46\x8d\xc8\x66\x49\xb6\xd0\x63\x52\xdb\x5f\x9f\x57\x5a\xb4\xb9\xbb\x48\xf4\x3a\xc5\x9a\x9a\xbe\x95\x5a\x4d\x06\x32\x2c\x4c\x61\xd2\x0a\xa6\xca\x83\x1b\x63\x45\xbc\x8e\x3e\x75\x6a\x60\x52\x1a\x4c\xb7\x8f\x78\x86\xef\xf3\x5c\xaa\x37\x9b\xb0\xfb\x20\x10\xa9\x39\xab\xb9\x6c\xd9\x5d\x9b\x36\x5c\xb3\x5b\x3b\x01\xab\x13\x54\xfd\xc4\xae\x7f\xe6\xc1\xd3\x3c\x4b\x96\x71\xa8\xbf\x45\x39\x23\xf4\xa5\x95\x8e\x33\x12\xd2\xea\xe3\xea\x45\x5c\x0b\xa6\xfe\x4a\x3f\xb1\xeb\x5f\x93\x4c\x94\x2e\xcb\x02\xae\x02\x1e\xea\xd6\xdb\xfe\x31\x29\x45\x74\x3d\x65\x4c\xcf\xb5\x0b\xce\xfc\x35\x0e\x99\x90\xe9\xea\x74\x3f\x8f\xe2\x1c\x71\xb0\x4f\xb3\x71\xd8\x16\xf0\x73\xae\x51\x40\xe8\x4f\x67\xe3\xbb\x1e\xfe\x73\x3a\xdf\xc6\x39\x03\x81\x9a\x75\xd6\x96\x60\xa0\x63\xf5\x4f\x2d\xa8\x03\x56\xde\x13\xd3\xd9\x8a\x24\x63\xa6\xc9\xa5\xdf\x6e\x48\x99\x36\xdb\x72\x21\x99\x5a\xca\x9e\xae\x01\xd5\xf5\xf9\xd3\xb5\xd0\x77\x35\x63\x7a\x5b\xb2\x74\xeb\x27\x40\x18\x77\x59\x66\x4d\x6c\xa7\xeb\xdd\xe1\x0f\x8d\x50\xb7\xbe\x44\x5d\x38\xc8\x11\x78\x1b\xf9\xde\x97\x93\xef\xdd\x6c\x7f\xd9\x95\xf3\x7d\x3a\x43\x0c\xd1\x09\x88\x4e\x40\x74\x02\xa2\x13\x10\x9d\x50\xb7\xf8\x02\x7b\x0f\xa8\x47\x40\x42\x41\x42\x41\x42\x41\x42\x41\x42\x41\x42\xc7\x45\x42\x01\x27\x00\x27\x00\x27\x00\x27\x3a\x87\x13\x7b\x00\xfc\x9e\xe6\x2c\x37\xeb\xc2\xf5\xbc\xe5\x63\x3d\x6e\xbd\xc2\x3a\x1b\x7f\x70\x41\x27\xef\xea\x67\xbf\xe5\xf3\xb9\x7e\x13\xf3\xa4\x5a\x25\xb8\x42\x38\x4c\x92\xa2\x75\xef\x8f\x3e\x47\x71\x37\x55\x6a\xb1\x44\xe6\xe9\x48\xd2\x01\xc7\xee\x0e\xe5\xb0\x9a\x37\x2b\x23\x77\x95\x26\xaa\x65\x6c\x66\x6c\x1b\xc6\xe3\x66\x88\xcc\x7c\xbd\x65\x48\x76\x58\x0e\xe8\x96\xb3\x8e\x4e\xbd\x74\xb4\x92\x2c\x8a\x84\xa5\xf2\x6c\xe8\x6d\xc2\x12\xb9\x34\x3e\xf1\x98\xcf\x45\x66\x9c\x73\x74\xb0\x17\x57\x2a\x09\x24\x59\x9b\xde\x0d\xc6\xc9\x9b\x99\x64\x4c\xc4\xb9\x96\x7f\xce\xfc\x5e\xf0\x27\xdd\x8b\xf9\xa3\x50\xc2\x69\xa8\x72\x5a\x8e\x4b\xdf\x21\x0d\x49\x2e\xaf\x24\x63\x6f\xdf\xfd\xa0\xbf\x9b\xf1\x80\x18\x57\x94\xc4\x73\xa3\x98\xc8\x2d\x15\x24\x71\xce\x65\x6c\x16\x2d\x72\xfb\x14\xdf\x25\xbf\xbf\x25\x70\x6c\xfa\xea\x8d\x82\x79\x12\xf1\x78\x3e\x49\xb2\xf9\x5d\xfa\x34\xbf\x5b\xc6\x32\x48\x42\x71\xf7\x97\x8f\xea\x41\x5f\xe5\x60\x3f\xb2\xed\x9c\x36\x87\xa7\x57\x12\x6b\x74\xca\xa7\xa9\xea\x79\xd7\x40\xf5\xfc\x62\x7c\x65\x03\x69\xcf\xbb\x9d\xed\x31\x61\xbb\x03\x69\xd0\x48\x65\x29\xa9\x9e\x81\xc8\xd2\x37\xec\xb0\x03\x40\x6a\x8a\xe4\x74\x78\x0e\x48\x53\xb9\xb7\xe1\xf0\x0f\x1c\xf9\xc1\x36\x75\x30\x54\x5c\x79\x90\x7b\xab\xe2\x90\x64\x7d\x41\x49\xd6\xc8\x26\x43\x36\x19\xb2\xc9\x90\x4d\x06\x03\x74\xd3\x5b\xd4\xcb\xd4\x8d\x33\x98\x67\xc8\x3c\xd9\x69\x8c\x59\xab\x64\x20\xe6\x98\xf7\x9c\xb7\x9e\x6f\x92\x09\x1e\xae\xa8\xb0\x46\x26\x95\xfe\x5d\xb7\x49\x26\x25\x69\x22\xfe\xa4\xd0\xb1\xa9\xfe\x8b\x07\xf9\x84\xb1\x0f\xfa\xbf\xee\xdf\x17\x5c\x92\xdb\x50\xb1\x20\x5a\xaa\x5c\x64\xc5\x86\x63\x62\x4c\x59\x24\x9f\x04\xbb\xfe\x1f\xbe\x10\x2a\xe5\x81\xb8\xd6\xba\xd2\x69\xa1\x09\x7b\x88\x78\x1c\x0b\x23\x48\x49\xad\xf0\xc8\x08\xa4\xb7\x3f\x1c\xb2\x82\xd3\x33\x9e\x49\x47\xf8\x4e\xf3\x32\x7c\xea\xba\x4f\xb7\x94\x7d\x30\x3d\xa6\xf7\x8e\x54\xb9\xde\xb1\xd1\x55\x4b\x25\x32\x0a\x8b\x2a\x14\xf5\x6b\xc7\x1d\xa5\x1f\x66\xbc\x10\xbb\xc7\x1b\x1c\x1c\x78\x07\xec\x19\x73\x31\x18\xff\xdd\x31\x58\xb9\x5c\xe1\x65\xd3\xfd\x51\xd3\xe5\x14\x98\x9c\x22\x54\x0e\x3a\xb7\xfc\x96\x7e\xfb\xd7\xed\xab\xda\x42\x64\x73\xd1\xe8\x9b\x34\x57\xc5\x5c\x06\xb7\xcd\x7f\xa3\xff\x7e\xb5\xdf\xa4\xf5\xb3\x89\x1c\x49\x79\x96\x4b\x4a\x20\x33\xd1\x54\x87\x48\x93\xd4\x96\x1a\x3f\xbf\xb3\xb7\x13\xb6\xbf\x5d\xdc\x3f\x54\xa3\x9a\x18\x5c\xc0\x23\x77\x01\x5f\x0e\xc8\x5f\xc9\xc5\x70\x2f\x97\xc9\x17\xd2\x8b\x4d\x91\x83\xfe\xdd\x86\x85\xe8\x7b\x72\x80\x99\x24\x61\x1e\xd1\x2f\xe3\x24\xbe\x35\xbf\xa6\x6f\x90\x0f\x5a\xb1\xef\xfe\xae\x92\xf8\xc1\xa4\x62\x7f\xd2\x4b\x9e\xfd\xfb\xab\x5b\x08\x8b\x7f\xfc\xbe\x4f\x11\x06\xcd\xe7\xcd\xaf\x49\x16\x90\x93\x7e\x9e\xd0\xe0\x27\xec\xdb\xd5\x4c\xff\xdb\xb7\x2b\x76\x5f\xe9\x4d\x8a\xf4\x36\x1e\x75\x32\x11\xec\x8b\x7a\xcb\x03\x1a\x00\x4a\xe6\x8d\x64\x60\x7d\x84\x64\x51\x24\x2f\x76\x6c\x4d\xb2\x6b\x2a\x92\x34\x12\x13\x66\xee\x49\x39\xfc\x6e\x4e\x51\xbc\x75\xed\x40\xf8\xdb\x1f\xd2\xbd\xfa\x46\x30\x2c\xcc\x07\x30\x2c\x56\xae\xda\x3b\xc3\x22\x5d\x09\x64\x1e\x88\x69\xb1\x6c\xdd\x17\x95\x46\x3c\x38\x48\xf3\xd9\x9f\x8e\x57\xf5\x21\xa2\x13\x42\x10\x42\x10\x11\x9d\x90\x05\xe6\xef\x15\xc4\x36\xae\x88\xce\xb1\xca\x9c\xe5\x60\xfc\xa7\x6f\xd8\x51\xf1\x8f\x77\xca\x30\xd6\x43\x4a\x10\xee\x45\xee\xcc\x7d\xdc\xbe\xd7\x2e\xc3\xb3\x9c\x18\x0b\x1b\x16\x02\x80\x14\x80\x14\x80\x94\x41\x83\x94\xa3\x76\x8a\x5d\x48\xa5\x66\xab\x18\x9e\x89\x0d\xb0\x02\x7b\xfa\x22\xed\x69\x80\x95\x36\xe7\x0d\xc0\x0a\x3c\x28\x30\x34\xfa\x61\x68\x00\xac\x54\xc0\xca\x91\xde\x82\x5d\x88\x65\x14\x2a\x10\xa0\x05\xc2\x10\xc2\x10\xa0\x05\x32\xc1\xfc\x0d\xd0\x32\x40\xd9\x33\x52\xd0\x42\x47\xf6\x95\x71\x4b\xa7\x80\xc5\x9e\xed\x1c\x87\xf2\x59\x86\x4b\x1e\x95\xcf\x89\xe4\xfe\x34\xf7\xa2\xe1\x93\x52\x82\xf5\x8f\x3e\x35\xfb\x9a\x2e\x73\x5d\x14\xf6\xa8\x54\x6a\xf0\x1a\x8b\xc9\x58\xe5\x82\x57\xfc\xa6\xab\x0a\xec\x65\x87\x17\xee\xb7\x95\x73\xef\x70\x78\x63\x5f\x33\x48\xe9\xec\xd1\x0f\xcf\x22\xbe\xf4\xa3\x1a\x69\x1c\x2f\xe5\xbc\x46\x94\xcd\x1a\x71\xd9\xac\xdd\x88\x6b\x57\xc9\xac\xad\x7e\xb4\x16\xf0\x1d\x0a\x65\xa1\x50\x16\x0a\x65\xa1\x50\xd6\xd8\x0a\x65\xed\x5e\x79\x6b\x8b\x64\x75\x1c\x2c\x71\xb2\xd2\x58\xbb\x9b\xbf\xb9\x2c\x56\x9f\xfb\x60\x9f\x62\x58\xbb\xfb\x60\x73\x21\xac\x8e\xfb\x00\xe5\xaf\x50\xfe\x0a\xe5\xaf\x50\xfe\x0a\xe5\xaf\x3a\x2b\x7f\xd5\x60\xf5\x5f\x2b\x7d\xb5\xf5\xd0\xc6\x0b\x8a\x95\x6c\xd6\x9a\x11\x97\xef\xda\xdd\xdd\xdb\x4a\x77\x9d\xb6\xdf\x51\xb0\xab\x93\x11\x5d\x2f\xd6\xd5\xf1\xb0\x9e\xb5\x44\xd7\xee\xee\xd9\x52\x9e\xab\xeb\x65\xb3\xaf\x45\xb9\x76\x77\x5a\x0d\xcf\x38\xd8\x9f\x67\xff\xfa\xe3\x38\x38\x56\x73\x16\x7b\x47\x8c\xac\x0c\xc6\x62\xb7\xe1\x27\x33\xf6\x24\xe3\xb0\x6d\x40\x76\x53\x28\x7c\xb2\x62\xac\x1a\xd4\x46\x42\x61\xba\x5c\x57\x4c\xde\xd2\xb5\x8f\xc1\x6b\x40\x6b\x40\x6b\x43\x43\x6b\xc0\x6a\xc0\x6a\xc0\x6a\xc0\x6a\xc0\x6a\xc0\x6a\xc0\x6a\xc0\x6a\xc0\x6a\xc0\x6a\xc0\x6a\xc0\x6a\xc0\x6a\xc0\x6a\xc0\x6a\xc0\x6a\x43\xc3\x6a\x38\x52\xa5\xf9\xe8\x00\x13\x02\x13\x02\x13\x02\x13\x02\x13\x02\x13\x7a\x4c\x38\x15\x39\x7f\x7b\x77\x10\x13\x3c\x4b\x56\xed\xca\xc0\xcf\x45\x5e\x55\xef\x66\x8c\xb7\x50\xbd\xb9\xc8\xd7\x98\x1e\x75\xc2\xfd\xc3\xc7\x2f\x75\xbf\x47\x52\xf1\x9e\xc4\xad\xd4\x91\x94\x81\x38\x3a\xec\x46\xd3\xa5\x74\x81\x37\xe5\x87\xd8\xeb\xbd\xdb\x90\xba\xda\x61\x89\xf4\x52\x01\xd9\x4a\xb2\xea\x96\x37\x66\x43\xb5\x74\x6a\xc1\x2f\xfe\x72\x28\x9e\xce\x36\x75\x3d\x88\x10\x88\x10\x88\x10\x88\xd0\xd8\x88\x50\xb3\x13\x60\x6a\xa9\xd0\xc9\x0e\xe7\xc1\x19\x4a\x8d\x07\xea\x9c\x67\x28\x9d\x0c\xe3\xed\x71\x6a\x51\x2d\xc6\x3a\x59\x8f\xfc\x5e\xb6\xdf\x65\xcc\x94\x31\xab\xd9\x54\xcc\x4c\xbc\x91\x77\xf9\x16\x52\xc2\xae\x5e\x34\x75\x4a\xa7\x46\xc5\x49\x7c\x1b\x8b\x39\xa7\x09\x6a\x2d\xf0\xf2\xe9\x52\x06\xff\xf8\x57\xc3\x2a\x45\xb9\x58\x88\x50\xf2\x5c\x44\xaf\x45\x20\x50\xb1\xe5\xca\xe8\xc6\x5a\xd8\xa6\x84\xff\x3c\xe3\x01\xbd\x35\x32\x09\xbd\x20\x28\x36\x6d\x8a\xb2\x72\xb3\x74\xa9\xf4\x43\x96\x87\x8b\xeb\x5f\xba\x06\xd9\x9b\xcc\x4a\x85\x87\xa5\xfe\x01\x3d\xa7\x39\x1f\xb3\xe6\x19\x0f\x18\x66\x7a\xe6\x07\x7a\xe4\x3a\xaf\xc5\x0e\xbf\x45\x5f\xa6\xff\x3e\x04\xb7\x59\xbf\x6c\xa6\xb8\x27\x9b\xfe\xe0\xb9\xe0\xb9\xe0\xb9\xe0\xb9\xe0\xb9\x9d\xf1\xdc\x86\x7b\xc1\x1a\xd3\x3d\xdd\xb6\xf8\xbe\x94\x1e\x92\x46\x82\x2b\xe1\x97\xa0\x87\x2c\x49\xf9\x9c\xd4\xd1\x43\x12\xc9\xe0\xb5\x12\x3d\xec\x26\x5d\x91\x5f\xa2\xa7\xdd\xdb\xc9\xdf\x26\xec\xab\x59\xcf\x8c\x74\x49\x45\xac\x5f\x96\x62\x4f\x15\x2c\xc9\xd2\x47\x1e\xbb\x68\xe6\x6c\x29\xee\x66\x3c\x72\xb6\xf2\xb7\x2b\xf3\xf1\xb7\x2b\x36\x93\x31\x8f\xe4\x7f\xdc\x46\x32\x15\x8c\x87\x04\xc5\x92\x3b\x03\x0c\xc2\xc2\x0c\x33\x97\xbf\x56\xc5\x8f\x8c\x7d\x3a\x61\x1f\x24\x2d\x8e\xa5\x47\x4f\xb2\xf5\xb6\x15\x08\x34\x37\xe6\x31\xd9\x28\x49\xfe\x78\xc8\x80\x9a\x16\xbc\x77\x6d\xdf\x28\x79\x0e\x3a\xbd\x7b\x2f\xc3\x8c\x9a\xae\x5f\xd8\xc7\xe4\x85\xcd\x79\x36\xe5\xf3\x8a\x83\xd2\x1b\x35\x22\x9b\x25\xd9\x42\x8f\x49\x6d\x7f\x7d\x5e\x69\xd1\xe6\xee\x22\xd1\xeb\x14\x6b\x6a\xfa\x56\x6a\x35\x19\xc8\xb0\x30\x85\x49\x2b\x98\x43\xd6\xdd\x18\xeb\xcd\xda\xee\xa4\x4e\x0d\x4c\x4a\x83\xe9\xf6\x11\xcf\x20\x7d\x64\x7e\xf5\x66\x13\x76\x1f\x04\x22\x35\xe7\xb1\x96\x2d\xbb\x6b\xd3\x86\x6b\x76\x6b\x27\x60\x75\x82\xaa\x9f\xd8\xf5\xcf\x3c\x78\x9a\x67\xc9\x32\x0e\xf5\xb7\x28\xca\x9d\xbe\xb4\xd2\x71\x46\x42\x5a\x7d\x5c\xbd\x88\x6b\xc1\xd4\x5f\xe9\x27\x76\xfd\x6b\x92\x89\xd2\x65\x59\xc0\x55\xc0\x43\xdd\x7a\xdb\x3f\x26\x09\x82\xae\xa7\x8c\xe9\xb9\x76\xc1\x99\xbf\xc6\x21\x13\x32\x5d\x9d\xee\xe7\x51\x9c\x23\x0e\x56\x68\x36\x0e\xdb\x02\x16\xce\x35\x0a\x08\x5d\xe8\x6c\x7c\xd7\xc3\x17\x4e\xe7\xdb\x38\x67\x20\x43\xb3\xce\xda\x12\xcc\x70\xac\xfe\xa9\xa5\x75\xa0\xcc\x7b\x62\x3a\x5b\x5c\x60\xf4\x70\xb9\x74\x81\x0d\x89\x9d\x66\x6f\x2e\x74\x53\x2f\x73\x3c\x57\x9a\xb5\x9e\xe8\xd9\x7a\x2a\xba\x71\x9c\x65\xd6\xd8\x76\x0a\x7f\x3d\x0b\x7d\x0b\xf9\xd6\x97\xd8\x18\x2c\x72\x04\xed\x46\xc2\xea\xe5\x24\xac\x36\xdb\x6e\x76\x25\xad\x9e\xce\x2e\x43\xb0\x02\x82\x15\x10\xac\x80\x60\x05\x04\x2b\xd4\x2d\xbe\xa0\xe0\x03\xea\x11\x80\x51\x80\x51\x80\x51\x80\x51\x80\x51\x80\xd1\x71\x81\x51\xb0\x0a\xb0\x0a\xb0\x0a\xb0\x8a\xce\x59\xc5\x1e\x3c\xbf\xa7\x29\x98\xcd\xba\x70\x3d\x0d\x73\x54\x75\xcc\x37\xfe\xe0\x82\x8e\x09\xdd\xa3\x72\x28\xb9\xf8\x27\x2b\x85\x14\x41\x9a\xae\x7a\x5b\x98\x6f\x27\x5d\x3a\xe0\x18\xd1\xa1\x1c\xc5\xf1\x66\x65\xf8\xae\xd2\x44\xb5\x8c\xd2\x8c\xa9\xc3\x78\xdc\x0c\x9b\x99\xaf\x77\x01\xce\x86\x59\x17\x7e\x75\x39\x41\x71\xf8\xcb\x49\x6c\x42\x71\x78\x14\x87\xaf\x79\x98\xc1\x4b\xa2\x51\x54\x88\x3f\xbc\x51\xef\x76\x36\xca\x04\xfa\x0e\xa9\x55\x63\x56\xae\xa4\x89\x86\xa4\x5c\xdf\xb0\x23\xce\x12\xa9\xa9\xf4\xd1\xe1\x91\x22\x4d\x65\xe1\xb6\x73\x44\x70\x7a\x08\xdb\xd4\xcb\x10\x7a\xe5\x41\xee\xad\xd0\x43\xbe\xf6\x05\xe5\x6b\x23\x31\x0d\x89\x69\x48\x4c\x43\x62\x1a\x6c\xd4\x4d\x6f\x51\x2f\xb3\x40\xce\x60\xb7\x21\x89\x65\x9f\x24\x96\x41\x99\x68\xde\xe1\xde\x7a\xea\x4a\x26\x78\xb8\xa2\xc7\x1a\x59\x58\xfa\x77\x27\xc8\x57\x29\x29\x15\xf1\x27\x45\xa1\x4d\xf5\x5f\x3c\xc8\x27\x8c\x7d\xd0\xff\x75\xff\xbe\xe0\x92\x1c\x8d\x8a\x05\xd1\x52\xe5\x22\x2b\xf6\x1f\x13\xae\xca\x22\xf9\x24\xd8\xf5\xff\xf0\x85\x50\x29\x0f\xc4\xb5\x96\x99\x4e\x1a\x4d\xd8\x43\xc4\xe3\x58\x18\x7d\x4a\xe2\x85\x47\x46\x2f\xbd\xfd\xe1\x90\x05\x9d\x9e\xf1\x4c\xb2\xc2\x77\x9a\x57\xe5\x53\xd7\x7d\xba\xa5\xec\x83\xe9\x31\xbd\x95\xa4\xca\xf5\x8e\x0d\xd4\x5a\x2a\x91\x51\x84\x55\x21\xb0\x5f\x3b\xee\x28\xfd\x30\xe3\xe5\xe1\x3d\xde\xef\xe0\xe8\x3b\x6a\x1f\x99\x8b\x61\xf9\xf9\x8e\x21\xd4\x28\x7e\xb1\xd2\xcc\xb3\x11\x77\x8a\x7d\x39\xe8\xd0\xf4\x5b\xfa\xed\x5f\xb7\x2f\x72\x0b\x91\xcd\x45\xa3\x6f\xd2\x84\x15\x73\x19\xdc\x36\xff\x8d\xfe\xfb\xd5\x7e\x93\x96\xd3\x26\x12\x25\xe5\x59\x2e\x29\x35\xcd\xc4\x69\x1d\x22\x57\xd2\xda\x02\xcb\xe3\x0a\x13\xd8\xae\xff\x1f\xaa\x41\x53\x0c\x5e\xe2\x91\x7b\x89\x2f\x27\x1c\x60\x25\xd5\xc3\xbd\x5c\x26\x1d\x49\xaf\x38\x45\x8a\xfb\x77\x1b\x56\xa3\xef\xc9\x47\x66\x72\x90\x79\x44\xbf\x8c\x93\xf8\xd6\xfc\x9a\xbe\x41\x6e\x6a\xc5\xbe\xfb\xbb\x4a\xe2\x07\x93\xe9\xfd\x49\xaf\x7b\xf6\xef\xaf\x6e\x35\x2c\xfe\xf1\xfb\x3e\xc5\x29\x34\x9f\x37\xbf\x26\x59\x40\x7e\xfc\x79\x42\x83\x9f\xb0\x6f\x57\x33\xfd\x6f\xdf\xae\xd8\x7d\xa5\x37\x29\x90\xdc\x38\xdd\xc9\x6c\xb0\x2f\xea\x2d\x0f\x68\x00\x28\x57\x38\x92\x81\x75\x23\x92\x95\x91\xbc\xd8\xb1\x35\xb9\xb4\xa9\x48\xd2\x48\x4c\x98\xb9\x27\x1d\x11\xe0\xe6\x14\x85\x73\xd7\x0e\x84\xbf\xfd\x21\xdd\xab\x6f\x04\x63\xc3\x7c\x00\x63\xa3\xee\xaa\xfd\x34\x36\xd2\xde\x96\xd4\xdf\x6d\x6e\x2c\x5b\xf7\x59\xa5\x11\x0f\x0e\xd2\x81\xf6\xa7\x23\x57\x82\x08\x18\x85\x42\x6c\x30\x4c\x97\xa3\x10\x7b\x24\xc4\xa0\x17\xfc\x27\xe7\xd6\x0b\xa3\x0c\x18\x1d\xb5\x08\x5a\x0e\xcb\xe3\xfa\x86\x1d\x1f\x59\x79\xa7\x0c\xb8\x3d\xa4\x6c\xe2\x5e\x10\xd0\xdc\xc7\x6d\x88\x1d\xe0\x40\x4b\xa0\xb1\xec\x61\x85\x00\x93\x59\xe9\x44\x30\x19\x30\x99\x41\x33\x99\xa3\x76\x8f\x46\x74\xa6\x66\xfb\x18\x9e\x65\x0e\x46\x03\x0b\xfc\x22\x2d\x70\x30\x9a\x36\xe7\x0d\x18\x0d\x7c\x2e\x30\x3e\x4a\x6d\xed\x85\xf1\x01\x46\xb3\xce\x68\x8e\xf4\x2a\x34\xa2\x35\xa3\x50\x86\x60\x36\x50\x8c\x0d\x86\xe9\x72\x14\x63\x8f\x84\x19\xf4\x83\xff\xe4\xdc\xfa\x01\xcc\x66\x68\xa2\x68\xf4\xcc\x86\x8e\x23\x2c\x93\x9b\x4e\x59\x8d\x3d\xb7\x3a\x0e\xe5\xb3\x0c\x97\x3c\x2a\x9f\x81\xc9\xfd\x49\xf5\x45\x17\x4c\x4a\x09\xe0\x3f\xfa\xd4\xf1\x6b\xba\xcc\x75\x51\xb4\xa4\x52\x85\xc2\xcb\x30\x26\x63\x95\x0b\x5e\x71\xb7\xae\x8a\xb4\x97\x26\xce\xbb\xdf\x56\x8e\xf3\xc3\xe9\x94\x7d\x4d\x73\xa5\xc3\x55\x3f\x3c\x8b\x18\xc7\x50\xba\xc9\x7d\x51\x67\x51\xa2\x42\xd8\x88\x2b\x84\xed\x06\x65\xbb\xaa\x83\x6d\x75\xc4\xb5\x00\x01\x51\x13\x0c\x35\xc1\x50\x13\x0c\x35\xc1\xc6\x56\x13\x6c\xf7\xca\x5b\x5b\x0f\xac\xe3\x90\x8b\x93\x55\x01\xdb\xdd\xfc\xcd\x15\xc0\xfa\xdc\x07\xfb\xd4\xfd\xda\xdd\x07\x9b\x6b\x7e\x75\xdc\x07\xa8\xf4\x85\x4a\x5f\xa8\xf4\x85\x4a\x5f\xa8\xf4\xd5\x59\xa5\xaf\x06\xab\xff\x5a\x95\xaf\xad\x67\x4c\x5e\x50\xc4\x65\xb3\xd6\x8c\xb8\x52\xd9\xee\xee\xde\x56\xa5\xec\xb4\xfd\x8e\xda\x64\x9d\x8c\xe8\x7a\x5d\xb2\x8e\x87\xf5\xac\xd5\xc8\x76\x77\xcf\x96\x4a\x64\x5d\x2f\x9b\x7d\xad\x3f\xb6\xbb\xd3\x6a\xc8\xc6\xc1\xfe\x3c\xfb\xd7\x1f\x2d\x00\xb3\x9a\x43\xe4\x3b\xe2\x66\x65\x58\x16\xbb\x5d\x3f\x99\xb1\x27\x19\x87\x6d\x43\xb3\x9b\x42\xe6\x93\x29\x63\x25\xa1\xb6\x14\x0a\xfb\xe5\xba\x62\xf7\x96\xae\x7d\x34\x72\x03\x6e\x03\x6e\x1b\x24\x6e\x03\x6a\x03\x6a\x03\x6a\x03\x6a\x03\x6a\x03\x6a\x03\x6a\x03\x6a\x03\x6a\x03\x6a\x03\x6a\x03\x6a\x03\x6a\x03\x6a\x03\x6a\x03\x6a\x1b\x24\x6a\xc3\x61\x2d\xcd\x47\x07\xe8\x10\xe8\x10\xe8\x10\xe8\x10\xe8\xf0\x12\xd1\x61\xaa\xee\x0e\x02\x81\x67\xc9\xbb\x5d\x19\xde\x39\x95\xc8\x9c\x25\xd9\xc2\x4f\x67\xce\x0c\x94\xd8\x4c\xf3\xe6\x22\xbf\x4f\x53\x75\xff\xf0\xf1\xbf\x57\xbf\x89\x1c\xe3\x3d\x71\x9a\xef\xc4\xc1\xc3\xb4\xca\xb7\xdf\x94\xef\x58\xf3\xc2\x3c\xbf\x1d\xf6\x3b\x53\xb1\x6b\xcd\xea\xb7\xfb\x85\xf9\xe7\xdb\xfb\x87\x8f\x5f\xea\xbe\x8f\xd7\x66\xff\xd7\xc6\x75\x24\x65\xea\x8e\xe0\xed\xf9\x7f\xcf\x6f\xf7\x7b\x81\xb4\xb1\x9e\x25\xda\x54\xce\xc4\xb3\x24\x61\xd6\x69\x40\x8a\xf1\x78\x66\xd6\x67\xe2\x4c\x6a\x17\x8b\xf2\x8b\x7f\x9a\x2f\xf6\x69\xb6\xbc\x10\xfa\x52\xe6\x8d\x58\xff\xd9\xaf\x49\x76\x1f\x45\xbe\xea\x65\x2f\xde\x13\x84\x85\xd0\x0b\x39\xd1\x53\x4f\xbf\x7e\xeb\xa3\x36\xce\xb7\x70\x77\x00\x48\x7b\xa9\xd6\xa9\xaa\x8f\xf6\xd8\xfa\x62\xad\x46\x7d\x20\xe0\x03\x01\x1f\x08\xf8\x40\xc0\x07\x02\x3e\x10\xf0\x81\x80\x0f\x04\x7c\xec\xb3\xda\x22\xe0\x03\x01\x1f\x08\xf8\x40\xc0\x07\x02\x3e\x10\xf0\x81\x80\x8f\x8b\x0b\xf8\x40\x80\x04\x02\x24\x10\x20\x31\x8c\x11\x45\x80\x44\xb5\x7b\x10\x20\xd1\xf3\x00\x89\xe7\xb7\x77\x21\x17\x0b\x6d\x39\xe4\xe7\xa4\x54\xef\xe9\x21\xbe\x56\x8b\xee\x6d\x84\x53\xfe\xdb\x60\x52\xab\xbd\xde\x3f\x26\xe5\x07\x0b\x28\xaa\xe6\x6b\xad\xa0\xa8\xba\xb7\x07\x04\x0a\x04\x0a\x04\x0a\x04\x0a\x04\x0a\x04\x0a\x04\x0a\x04\x0a\x04\x0a\x04\x0a\x04\x0a\x04\x0a\x04\x0a\x04\x0a\x04\x0a\x04\x6a\x8f\x65\x1f\x04\x0a\x04\x0a\x04\x6a\x18\x23\x0a\x02\x55\xed\x1e\x10\xa8\x01\x10\x28\x91\x46\xc9\xab\xd6\x8f\x67\x45\x50\xfe\x29\x9a\x31\x28\xff\x75\x40\xa8\xd5\x7e\xef\x21\x84\xf2\xa3\x05\x0a\x55\xf3\xb5\x76\x28\x54\xdd\x0b\x04\x0c\x05\x0c\x05\x0c\x05\x0c\x05\x0c\x05\x0c\x05\x0c\x05\x0c\x05\x0c\x05\x0c\x05\x0c\x05\x0c\x05\x0c\x05\x0c\x05\x0c\x05\x0c\xb5\xc7\xb2\x0f\x0c\x05\x0c\x05\x0c\x35\x8c\x11\x05\x86\xaa\x76\x0f\x30\x54\xff\x31\x54\xec\x09\x8e\x29\x23\x49\x7f\xff\xef\xae\xe3\xfc\x8c\xda\x69\x17\x54\x99\x6b\xb2\x40\xdf\x35\x70\x93\x74\xaf\x83\xfc\xcc\x15\xdc\x51\x7e\xee\x32\x9e\x51\x85\xdb\x2f\xb6\xc1\x11\xcf\x56\x51\x88\x19\xc1\x69\x12\xbe\xae\x22\x1b\x37\x84\x75\x9f\x75\x72\xf0\xe4\x7b\x6a\xf0\x67\xea\x42\xd5\x90\xef\x6c\x07\x3b\xf0\xed\xc2\xb7\x0b\xdf\x2e\x7c\xbb\x63\xf3\xed\x6e\xd9\x79\x77\xf9\x77\xb7\xab\xb8\xed\x3b\xf0\x5e\x6b\xef\xbf\x74\xc7\x59\xab\xf6\x86\xc9\x38\xd4\x4d\x71\x56\x7b\xa5\x6d\x65\x8e\x3a\x15\x2c\xd5\xbd\xa5\xb4\x01\xc8\xee\x63\x26\x63\xb3\xb2\x24\x19\x5b\xc6\x7e\x71\x0a\x59\x98\xbd\x7e\x59\xc6\x2c\x94\x99\xde\x17\x9f\x85\x9f\xf1\x7a\xf9\x24\x1f\x84\x7d\xe5\xdd\xdc\xb0\x1d\xcc\x66\xcb\x8c\xde\xb2\x34\x4b\x02\xa1\xc8\x59\x60\xe5\xa3\x9d\x65\x13\xf6\x4f\xba\x23\x8d\x16\xcd\x9d\x1f\xd9\x2d\xbb\x8f\xa2\x1f\xc9\x15\x10\xea\x55\x7a\x19\xeb\x81\xd7\x42\xcc\x4d\x49\x7b\x39\x11\x1e\x30\x50\xa6\x2d\xe7\x19\xa6\x93\x39\xe4\x9b\x75\xc5\x66\xa7\xfc\xc9\x7a\xe4\xf7\xb2\x65\x21\xb5\x55\x4f\x82\x9f\x4d\xc5\xcc\x44\x0e\x78\xe7\x4d\x21\x25\xec\xea\x45\x53\x67\x29\xcc\xe6\x30\xd5\x9a\x3a\xbe\x8d\xc5\x9c\xd3\x04\xb5\xb6\x81\x36\x63\xdc\x0e\x6a\x1c\xb9\xfe\xd5\xb0\x9a\x51\x2e\x16\x22\x94\x3c\x17\xd1\x6b\x81\xf4\x8b\x2d\x57\x46\x37\x56\xfb\x53\xa7\xb3\x79\xc6\x03\x7a\x6b\x64\x12\x7a\x41\x50\x6c\xda\x14\x2f\xe1\x66\xe9\x52\xe9\x87\x2c\x0f\x17\xd7\xbf\x74\x0d\xb2\x37\x99\x99\x35\xd0\x5d\x62\x62\x9e\x73\x21\x78\x5c\xfb\x8c\x07\x0c\x33\x3d\xf3\x03\x3d\x72\x9d\x3d\xb5\xc3\xa2\xea\xcb\xf4\xdf\x87\xc5\x34\xeb\x97\xcd\x3c\xe6\x64\xd3\x1f\x64\x06\x64\x06\x64\x06\x64\x06\x64\xa6\x33\x32\xd3\x70\x2f\x58\xa3\x33\xa7\xdb\x16\xdf\x8b\x34\x13\x5a\x94\x84\x3f\xb2\x34\x12\x5c\x09\xbf\x04\x3d\x64\x49\xca\xe7\xa4\x8e\x1e\x92\x48\x06\xaf\x95\x38\x40\x37\xe9\x42\x7f\x01\x3d\xed\xde\x4e\xfe\x36\x61\x5f\xcd\x7a\x66\xa4\x4b\x2a\x62\xfd\xb2\x14\x7b\xaa\x60\x49\x96\x3e\xf2\xd8\xc5\x25\x66\x4b\x71\x37\xe3\x91\xb3\x95\xbf\x5d\x99\x8f\xbf\x5d\xb1\x99\x8c\x79\x24\xff\xe3\x36\x92\xa9\x60\x3c\x24\x77\x7d\x72\x67\x5c\x99\x61\x61\x86\x99\xcb\x5f\xab\xe2\x47\xc6\x3e\x9d\xb0\x0f\x92\x16\xc7\xd2\xa3\x27\xd9\x7a\xdb\x0a\x38\x93\x1b\xf3\x98\x6c\x94\x24\x7f\x3c\x64\x40\x4d\x0b\xde\xbb\xb6\x6f\x94\x3c\x75\x8e\xd1\x76\x0d\x33\x6a\xba\x7e\x61\x1f\x93\x17\x36\xe7\xd9\x94\xcf\x2b\xae\x4a\x6f\xd4\x88\x6c\x96\x64\x0b\x3d\x26\xb5\xfd\xf5\x79\xa5\x45\x9b\xbb\x8b\x44\xaf\x53\xac\xa9\xe9\x5b\xa9\xd5\x64\x20\xc3\xc2\x14\x26\xad\x40\xce\x09\x3f\xc6\x8a\xaa\x68\xd1\xa7\x4e\x0d\x4c\x4a\x83\xe9\xf6\x11\x4f\x47\x7c\x8c\x6d\xf5\x66\x13\x76\x1f\x04\x22\xcd\x69\x6f\x2a\x5b\x76\xd7\xa6\x0d\xd7\xec\xd6\x4e\xc0\xea\x04\x55\x3f\xb1\xeb\x9f\x79\xf0\x34\xcf\x92\x65\x1c\xea\x6f\x51\xbc\x2a\x7d\x69\xa5\xe3\x8c\x84\xb4\xfa\xb8\x7a\x11\xd7\x82\xa9\xbf\xd2\x4f\xec\xfa\xd7\x24\x13\xa5\xcb\xb2\x80\xab\x80\x87\xba\xf5\xb6\x7f\x4c\x38\x33\x5d\x4f\x19\xd3\x73\xed\x82\x33\x7f\x8d\x43\x26\x64\xba\x3a\xdd\xcf\xa3\x38\x47\x8c\x51\x9b\x8d\xc3\x36\x94\x7a\xae\x51\x00\x54\xed\x6c\x7c\xd7\xc1\xea\xe9\x7c\x1b\xe7\x44\xac\xcd\x3a\x6b\x0b\x66\x3d\x56\xff\xd4\x72\x3b\xd4\x87\xdb\x13\xd3\x7d\xcd\x79\xbe\x6c\xca\xe7\x46\x95\x7f\x65\xf6\xe2\x42\x27\x75\x9b\x8b\xd5\x5a\x71\xaa\x61\x54\xab\x6b\x1b\x6c\x23\xcb\xec\x72\xb2\xcc\x9a\xed\x2c\xbb\x32\xcd\x4e\x67\x82\x21\x2e\x01\x71\x09\x88\x4b\x40\x5c\x02\xe2\x12\xea\x16\x5f\x00\xef\x01\xf5\x08\x18\x28\x18\x28\x18\x28\x18\x28\x18\x28\x18\xe8\xb8\x18\x28\xb0\x04\xb0\x04\xb0\x04\xb0\x44\xe7\x58\x62\x0f\x74\xdf\xd3\x3c\xb0\x66\x5d\xb8\x9e\x0b\x76\xac\xc7\xad\x57\x40\x67\xe3\x0f\x2e\xf4\xbc\xbe\x75\x37\x3e\xce\xed\xab\xf9\x5a\xbf\x58\xd1\x01\xe7\xf7\x59\xad\xa8\xdf\x72\x5a\x47\xf4\x98\x30\x15\x24\xa9\xb8\x61\x6a\x19\x3c\xea\x85\x87\x16\x76\xc1\x17\x66\x55\x4a\xb3\x84\xb4\x69\x5d\x2e\x69\xca\xf3\xc7\xfa\x54\x52\x9f\xcf\x59\xfd\x58\x0b\x2d\x99\x89\xd0\x2e\x0f\x95\xcf\xba\xcd\x57\x1e\xca\x61\x06\xf6\xaf\x3f\x8a\x41\x4e\x54\xcb\x44\xd0\xd8\x69\x8c\xef\x07\xff\xcc\xaf\xba\xc1\x7f\x87\xe5\xb5\x6e\x99\x4c\x5d\x2d\x8a\xad\x24\xba\x22\xd9\xaa\x3c\xea\xbd\x4d\xb6\x22\xa7\xcc\x27\x1e\xf3\xb9\xc8\x8c\x7b\xd1\xac\x9a\x4a\x25\x81\x24\x7b\xd9\x3b\xf2\x38\xf9\x63\x93\x8c\x89\x38\xd7\x02\xd6\x39\x10\x16\xfc\x49\xf7\x62\xfe\x28\x94\x70\x2a\xb0\x9c\x52\xe4\x52\x8f\x48\x05\x93\xd3\x2e\xc9\xd8\xdb\x77\x3f\xe8\xef\x66\x3c\x20\x4a\x17\x25\xf1\xdc\x68\x3e\x72\xac\x05\x49\x9c\x73\x19\x9b\xa5\x8a\x1c\x57\xc5\x77\x89\x5c\x58\x86\xc8\xa6\xaf\xde\xac\x99\x27\x11\x8f\xe7\x93\x24\x9b\xdf\xa5\x4f\xf3\xbb\x65\x2c\x83\x24\x14\x77\x7f\xf9\xa8\x1e\xf4\x55\x0e\xf6\x84\xdb\xce\x69\x73\x78\x7a\x25\x12\x07\xab\xdd\x9a\xea\xb6\x77\x0d\x74\xdb\x2f\xc6\xab\xd7\xb3\xe7\x7e\xb7\xf3\xb9\x4d\x08\x71\xcf\x1e\x7c\x4c\x42\x99\x84\x49\xaf\x85\xf2\x1b\xd6\xc2\xd9\x23\xe6\xf3\xff\x3d\xd1\x11\x24\x7b\x8a\xb2\xf2\xb1\x23\xfd\x10\x65\x03\x39\x6c\x04\x1a\xac\x3c\xc8\xbd\xd5\x60\x48\xef\xbe\xa0\xf4\x6e\xe4\xb1\x21\x8f\x0d\x79\x6c\xc8\x63\x83\xf9\xb8\xe9\x2d\xea\x65\xd2\xc8\x79\x8c\x31\xe4\xbc\x6c\xcc\x79\xe9\xb7\x51\xe6\x1d\xdb\xad\x67\xba\x64\x82\x87\x2b\x82\x6b\x2f\x63\x4a\xff\xfe\x24\xe9\x2d\x25\x51\x22\xfe\xa4\xa0\xb5\xa9\xfe\x8b\x07\xf9\x84\xb1\x0f\xfa\xbf\xee\xdf\x17\x5c\x92\xbb\x4f\xb1\x20\x5a\xaa\x5c\x64\xc5\x56\x63\xa2\x5b\x59\x24\x9f\x04\xbb\xf6\x0f\x7c\xad\x15\xa5\x53\x41\x13\xf6\x10\xf1\x38\x16\x46\x8a\x92\x4e\xe1\x91\x91\x46\x6f\x7f\x38\x64\xed\xa6\x67\x3c\x93\x82\xf0\x9d\xe6\x05\xf8\xd4\x75\x9f\x6e\x29\xfb\x60\x7a\x4c\xef\x1a\xa9\x72\xbd\x63\xe3\xba\x96\x4a\x64\x14\x90\x55\x68\xe9\xd7\x8e\x3b\x4a\x3f\xcc\x78\xf1\x79\xbf\xb7\x36\x38\xea\x2a\xbb\xc2\x5c\xf4\xdc\x4f\x77\x0c\xd0\x26\x26\x63\x5d\x24\xbb\x9e\xa3\x09\xb4\xee\x0b\xaf\x06\xa8\x1f\x1c\xa8\xa7\x78\x9f\x46\x8a\x66\x75\x79\xbe\xa5\xdf\xfe\x75\xfb\x4a\xbd\x10\xd9\x5c\x34\xfa\xa6\xca\x33\x9e\x8b\xb9\x0c\x6e\x9b\xff\x46\xff\xfd\x6a\xbf\x49\x7b\x42\x13\xc5\x95\xf2\x2c\x97\x94\x8e\x67\x62\xd3\x8e\x51\x5f\x74\xeb\x3e\x79\xb2\xbb\x0a\x2f\xd8\x62\xb9\x3c\x54\x43\xc6\x18\xfc\xdb\x23\xf7\x6f\x5f\x4e\x8c\xc1\x4a\xa2\x8b\x7b\xb9\x4c\x32\x96\x5e\x7b\x8a\x04\xff\xef\x36\xac\x4b\xdf\x93\x77\xcf\x64\x60\xf3\x88\x7e\x19\x27\xf1\xad\xf9\x35\x7d\x83\x1c\xec\x8a\x7d\xf7\x77\x95\xc4\x0f\x26\xcf\xfd\x93\x5e\x01\xed\xdf\x5f\xdd\xba\x58\xfc\xe3\xf7\x7d\x0a\x7e\x68\x3e\x6f\x7e\x4d\xb2\x80\x08\xc4\x3c\xa1\xc1\x4f\xd8\xb7\xab\x99\xfe\xb7\x6f\x57\xec\xbe\xd2\x9b\x14\x46\x6f\x70\x01\x59\x41\xf6\x45\xbd\xe5\x01\x0d\x00\x65\x4a\x47\x32\xb0\x0e\x50\x32\x9a\x92\x17\x3b\xb6\x26\x93\x38\x15\x49\x1a\x89\x09\x33\xf7\xa4\x03\x12\xdc\x9c\xa2\x60\xf6\xda\x81\xf0\xb7\x3f\xa4\x7b\xf5\x8d\x60\x3b\x99\x0f\x60\x3b\x9d\x37\xc8\x61\x25\x04\xbc\xd7\xd6\xd3\xb2\x75\x87\x5a\x1a\xf1\xe0\x28\x55\x67\x2f\x71\x09\xba\x0e\x61\xa3\x90\x74\x17\x25\xe9\x7a\xa4\x9c\xb0\xc1\xfb\x4f\x10\x36\x7a\x19\xc2\x64\xd9\x73\xa7\xee\x1b\xb6\x6f\xf0\x65\xc8\xc5\x42\xbf\x22\xf9\x79\xea\xbd\xbd\xa7\xdb\x7f\xad\x3a\xcb\xf7\x2c\xf3\x56\x7b\x0d\x04\x5c\xe2\x14\x35\x9c\xa2\x86\x53\xd4\x70\x8a\x1a\x4e\x51\x3b\x8b\x49\x02\xcb\xb1\xf1\x40\xa1\xba\x5b\x9f\x0e\xbb\x43\xf8\xff\x05\x85\xff\xe3\x64\x43\x9c\x6c\x88\x93\x0d\x71\xb2\x21\x4e\x36\xc4\xc9\x86\x38\xd9\x10\x59\x71\xc8\x8a\x43\x56\x1c\xb2\xe2\x56\x67\x24\xaa\xbb\xe1\x18\x55\x1c\xa3\x8a\x63\x54\x07\x7e\x8c\x6a\x2d\xa5\x03\xb0\x47\xa6\xeb\xea\x0f\x7a\x51\xdd\xad\x0e\xeb\xf6\xb8\xa8\x5b\x13\x92\x5d\x57\xcb\xed\x28\x7a\x8d\x12\x6e\x28\xe1\x66\x3e\x42\x09\x37\x04\x1f\x20\xf8\x00\xc1\x07\x08\x3e\x40\xf0\x01\xa8\x36\x40\xe7\xee\x1e\x01\xe8\x04\xe8\x04\xe8\x04\xe8\x04\xe8\xbc\x60\xd0\x09\xf6\x00\xf6\x00\xf6\x00\xf6\x80\x12\x6e\x28\xe1\x86\x12\x6e\xfe\x93\xc6\x79\x91\xde\x7b\x8f\xca\x6d\x35\x5f\xeb\x05\x07\x42\xc1\xb6\x4b\x38\x07\xae\xbb\x82\x6d\x4d\xc0\x5e\x7d\x9d\xb6\x33\x24\xa6\x76\x7e\xce\x46\xd1\xa6\x66\x8b\x1d\x92\xa4\x46\x90\x24\x85\xe3\x35\x70\xbc\x46\xcd\xc3\xf4\x58\x8e\x0d\xe3\x54\x8d\x03\x1e\xf7\xac\x35\xd8\xf6\x7e\xde\x31\x29\xdd\xee\x4b\xaf\x1d\xa8\x74\xdf\xb0\xc3\x0f\xfd\x38\x75\xa1\xb5\x7d\xcf\xfb\xc0\x29\x1f\x35\xad\x81\x88\x1a\xa2\x88\x42\x5e\xf5\x05\xe5\x55\x23\x81\x0c\x09\x64\x48\x20\x43\x02\x19\xec\xbf\x4d\x6f\x51\x2f\xb3\x35\x50\x56\xad\x37\xe6\xd6\x29\xca\xaa\xf5\x2e\xc5\xa4\xa6\x9a\x5a\x13\x8b\xa9\xae\x88\x5a\x9b\x79\x25\xa8\x9d\xe6\xe7\x40\x73\x99\x80\xda\x69\xf6\x7f\xd8\xbf\xe0\x60\xeb\x45\xc9\xb4\x33\x90\xe4\x72\xa5\xb4\x0d\xb7\x47\x81\xb4\xfa\x36\x03\x8c\xa3\x40\x5a\x17\x05\xd2\x9a\x08\xaa\xda\xba\x68\x23\xc2\xf9\x28\x87\x06\xbf\xf4\xe5\xc1\x7d\x94\x43\x6b\x73\xde\xa0\x1c\x1a\xcc\x21\x98\x43\xeb\xdd\x38\xa0\x2a\x68\x47\x1b\x44\xa7\x29\x7e\xd6\xcc\x05\x56\x5b\xf3\x6c\x44\x9a\x0d\x21\x98\x50\x69\x97\xa0\xd2\x7a\x24\x86\xb0\x67\xfb\x4f\x10\x82\x69\xaf\x3c\x2a\x89\xd1\x75\x3d\xb3\xf3\x45\x34\xde\x29\x43\x4e\x4b\x81\x8d\xdd\xd0\x3a\x73\x1f\xb7\x37\xb5\xc8\xed\x2c\xfa\xc5\xca\x83\x57\x19\xf0\x04\xf0\x64\xbf\x36\x03\x9e\x00\x9e\xb4\x03\x4f\x8e\xd9\xdf\xb6\x63\x94\x9a\x0d\x6e\x90\x86\x39\x60\x0a\xcc\xf4\xcb\x33\xd3\x01\x53\xda\x9c\x37\x80\x29\x70\xcc\xc0\x3c\x5a\xef\x46\xc0\x94\xe3\x61\xca\x71\x1e\x8a\xed\x58\x65\x2c\x1a\x0e\x70\x05\xaa\xed\x12\x54\x5b\x8f\xc4\x11\xf6\x70\xff\x09\xe0\x8a\xbd\xf2\xa8\x24\xc7\x78\xe0\x8a\x48\xa3\xe4\x75\x41\x29\xb7\xa7\x39\x28\xa2\x94\x4a\x9b\xcc\xd8\x7b\x7f\xff\x2d\x4a\xa5\x7c\x6a\xc4\x2f\xfe\xe7\x25\xc9\x52\x7b\x11\x1c\x20\x81\x4a\x2d\xa8\xd4\x82\x4a\x2d\xa8\xd4\x82\x4a\x2d\x67\x31\x3d\x60\x21\x36\x1e\xa8\x73\x5a\x88\x28\xa8\x83\xe3\x8c\x2e\xf8\x38\x23\x54\x4f\x42\xf5\x24\x54\x4f\x42\xf5\x24\x54\x4f\x42\xf5\x24\x54\x4f\xc2\x29\x7f\x38\xe5\x0f\xa7\xfc\xe1\x94\xbf\xd5\x19\x79\xd2\x22\x61\x28\xd5\xd6\x87\x51\x40\xa9\x36\x94\x6a\x1b\x5b\xa9\xb6\x5a\x4e\x07\x30\x8f\x93\x3b\x57\x7f\xb0\xf5\xe4\xce\x42\x27\x75\x4c\xc1\xeb\xb8\xee\x59\x0f\xf1\x34\x1e\xb1\xcc\x5a\xd1\x4e\xba\x27\x33\xa6\x1f\xb9\x19\xcc\xd6\x97\x58\x8b\xb9\x3b\x0a\x60\xaf\x3c\x23\xc9\x33\xaa\xb4\xf8\x73\x92\x3c\x2d\x78\xf6\xa4\x8a\x78\x6d\xf3\xe0\xe4\x91\x51\xd6\x6f\xf4\x9a\x6a\xe3\xe2\xe7\xcf\x9f\xff\xf1\xe9\xfe\xcb\x3f\xbe\x5d\x15\x3e\x11\x23\xbf\x12\xd2\xb0\x72\x91\x46\x82\x9c\x1f\x53\x7f\x55\x2d\x38\xe4\x3c\x36\x3e\x61\xad\x8a\x23\x3e\x27\x3d\x5a\x7c\x45\xdb\x9f\x65\xdb\xd1\x38\x1a\xae\x15\x0b\xa5\x0a\x32\xa1\x9f\xb9\xa0\x49\x25\x0a\x62\x1d\x1e\xd5\x0b\x79\x17\x84\xb6\xad\xb5\x1d\xef\x94\xae\x5e\x0b\xb3\x67\x1e\xdd\xb0\x38\x31\xa0\x97\x2c\x64\xef\x35\x59\x75\xbc\x11\x6a\x7c\x65\xae\xcd\xd6\x43\xe5\xed\x63\x25\x14\xd5\x88\xf4\xae\x67\xeb\x48\xb1\x8c\xab\x62\xee\xe9\x4f\xa9\x0b\x42\xcf\x4e\x67\x82\xe7\xda\x4a\x9f\xf3\x5c\xb0\x95\x81\xb0\x57\x12\xb1\x96\xe1\xc6\x21\x91\xca\x02\xea\xd6\x5d\xf6\x80\x1d\xa4\x66\x0a\x9c\xc9\xd4\x42\xfc\x01\xe2\x0f\x10\x7f\x80\xf8\x03\xc4\x1f\xd4\x2d\xbe\x00\xdb\x03\xea\x11\xb0\x4e\xb0\x4e\xb0\x4e\xb0\x4e\xb0\x4e\xb0\xce\x71\xb1\x4e\xe0\x07\xe0\x07\xe0\x07\xe0\x87\xce\xf1\xc3\x1e\x88\xde\x18\x73\x49\xe6\x12\x2e\xf5\xf0\x1b\xa4\xac\xbf\x37\xa5\x4d\xcc\x0c\xaa\x41\xe0\x56\x9d\xe4\x8f\x62\x61\xb6\x2d\x95\x67\x82\x2f\xa8\x7b\xc2\xf0\xc6\x6e\x0c\x37\xf6\xbb\x8b\xe4\x99\xb4\x4f\xc9\xbc\x63\x5f\x4d\x2d\x9e\xd5\xa9\x7e\x48\x17\xbe\x6c\x9b\x60\xc3\x3f\x15\x61\xe3\x0f\xf4\xcd\x7e\x32\x1d\xff\x5f\xeb\x7d\xd0\xe4\xda\xd5\x5f\xf7\x9b\x10\x15\xb9\x90\xde\x7d\xff\x9b\x54\x17\x99\x10\xa9\x97\xb1\x9e\xb3\xa0\x03\x0e\xa9\xc3\xa9\x6e\x83\x3b\xd5\x2d\x51\x2d\x13\x3f\x63\x97\x31\xde\x0c\xee\x99\x6f\xb7\x8b\xf7\xfa\x7a\x9a\x46\xd1\xa8\x66\x0b\x1e\x92\xa5\x46\x90\x2c\x85\xe3\x34\x70\x9c\x46\xcd\xc3\xf4\x59\x93\x0d\xe4\x3c\x8d\x03\x9e\xf7\x1c\x05\x8d\x8f\x78\xe0\x31\x09\x5e\x12\x1a\xbd\x14\xbc\x6f\xd8\x11\x67\x80\xd8\x13\xd6\x4f\x74\x14\x48\x43\x51\x55\x3e\xfe\x03\x87\x7e\xd4\xb5\x06\x5a\x6a\x88\x5a\x0a\x69\xd6\x17\x94\x66\x8d\x7c\x32\xe4\x93\x21\x9f\x0c\xf9\x64\x30\x03\x37\xbd\x45\xbd\x4c\xde\x38\x8f\x91\x85\xdc\x93\x8d\xb9\x27\xfd\x34\xba\xbc\x03\xba\x9b\x42\x54\x55\xa1\xd5\xc8\x68\xaa\xad\x3f\xd5\x66\x9a\x49\x49\x7c\x88\x3f\x29\x78\x6c\xaa\xff\xe2\x41\x3e\x61\xec\x83\xfe\xaf\xfb\xf7\x05\x97\xe4\x9e\x53\x2c\x88\x96\x2a\x17\x59\xb1\xa5\xd8\x53\xec\x23\xf9\x24\xd8\xb5\x7f\xd0\x6b\xad\x1c\x9d\xda\x99\xb0\x87\x88\xc7\xb1\x2d\x3f\x40\x7a\x84\x47\x46\x02\xbd\xfd\xe1\x90\x35\x9a\x9e\xf1\x4c\x4a\xc1\x77\x9a\x17\xda\x53\xd7\x7d\xba\xa5\xec\x83\xe9\x31\xbd\x3b\xa4\xca\xf5\x8e\x8d\xaf\xa2\x92\x00\x01\x8f\x4b\x9a\xf9\xb5\xe3\x8e\xd2\x0f\x33\x5e\x8c\xdd\xef\x2d\x0c\x8e\xb6\x13\x15\x3f\x3b\x03\x58\xae\x54\x3f\xdb\x70\x7f\x94\x3f\xab\x6f\x33\x40\x39\xca\x9f\xb5\x53\xfe\xec\x00\x55\x55\x5f\xf5\x6c\x44\x78\x1f\x05\xcf\xe0\x9f\xbe\x3c\xd6\x8f\x82\x67\x6d\xce\x1b\x14\x3c\x83\x4d\x04\x9b\xa8\xa6\x1f\x87\x54\xf1\xec\x68\xab\xa8\xab\x92\x67\x07\xf9\xc2\xea\x2b\x9d\x8d\x48\xb7\x21\x2c\x13\x52\xed\x22\xa4\x5a\x8f\x14\x11\x36\x6e\xff\x09\xc2\x32\xfd\xa5\x47\x25\x34\x3a\xaf\x73\x76\xc6\x20\xc7\x3b\x15\xf0\xa8\x1c\xd8\xd8\x11\xbc\xa3\xdb\xd4\x94\x68\x3d\x9e\xe2\x7d\xa5\x06\x60\xf1\xd9\xf9\x32\x2f\xf3\x44\x8f\x82\x8c\xe7\x84\xd0\xa9\xdb\x2e\xf0\x75\x6e\x8b\xa5\x14\xdd\x59\xff\x56\xaf\xce\xcb\x13\xd2\x94\x9a\x5b\x03\xa4\xd4\xb7\x19\x20\x05\x20\xa5\x1d\x90\x72\xcc\x0e\xb7\x83\xa8\xac\x6f\x71\x83\x34\xcf\x81\x55\x60\xab\x5f\x9e\xad\x0e\xac\xd2\xe6\xbc\x01\x56\x81\x77\x06\x06\x52\xa7\x06\x52\x7b\x60\xa5\x53\x13\xa9\x2b\xb4\x72\x9c\xa7\x62\x07\x63\x19\x89\x92\x3b\xe6\x5d\x81\x7c\x83\x7c\x1b\x90\x7c\xeb\x91\x4a\xc2\x66\xee\x3f\xe9\x74\x33\x3f\x13\x6c\x81\xfc\x68\x15\xb7\x74\x20\x3e\xde\xb0\x36\x80\x8b\xc9\x5d\xeb\x9e\xb8\xd0\x7d\xba\x41\x2e\xa6\x09\x58\x85\x00\x50\x91\xbd\x82\xec\x15\x40\x17\x40\x97\x73\x41\x97\x63\x36\xb9\x5d\xd4\x65\x7d\x97\x1b\xa4\xb1\x0e\xec\x02\xbb\xfd\xf2\xec\x76\x60\x97\x36\xe7\x0d\xb0\x0b\x3c\x35\xb0\x91\x6a\xfa\xb1\x7f\xd0\x65\x80\xd9\x2c\x47\xba\x2a\x76\x31\x97\x91\xe8\x38\x64\xb7\x40\xba\x5d\x84\x74\xeb\x91\x42\xc2\x46\xee\x3f\x41\x76\x8b\xbf\xf4\xa8\x84\xc7\x78\xb2\x5b\xb4\x12\x90\x01\x57\x22\x57\x27\x3a\xbb\xbb\x74\xb6\x69\x32\x63\x5f\xcc\xfd\xbf\x8a\xa6\xe7\x78\xff\xe2\x7f\x5e\xe8\x96\xfa\x8b\xe0\x44\x6f\x94\xd1\x47\x19\x7d\x94\xd1\x47\x19\x7d\x94\xd1\x3f\x8b\xf5\x01\x23\xb1\xf1\x40\x9d\xd3\x48\x3c\xaa\xb6\xbf\x71\xc7\xb6\x59\xdb\x9f\xae\x78\xde\xda\xfe\xa8\x2f\x71\x41\xf5\x25\x8e\x9a\xfe\x11\x9f\x8a\xa8\xd5\xe9\x4f\x57\x3c\xef\xf4\x37\xa5\xe7\xc9\x5d\xb4\xe0\x7f\xca\xc5\x72\xc1\xe2\xe5\x62\xaa\x27\xc9\xcc\x2f\xa6\xca\xf4\x16\xd5\x0e\x26\x3e\x56\x94\xbe\xa6\x29\x4b\x32\x5a\xea\x67\x31\xa5\x14\xd6\xb5\x89\x16\xdf\xfa\xdf\xfe\xed\x76\xa9\x7f\xbb\x6a\x0e\x71\xd1\xfb\xae\xd0\x82\x99\xa8\x66\x76\xd2\xfe\x11\xf0\xd8\x4d\xe7\x42\x09\x29\xbe\xd0\x6f\x99\xcc\xa5\x97\xcc\xe6\x29\xb5\xb8\x17\x85\xd6\xd1\xb7\x36\x6d\xd1\x83\x36\x61\x5f\x45\x9e\x9b\xaa\xf7\xa6\xed\x46\x2a\x9b\xb6\x89\x17\x12\x0d\x3c\x2e\xef\x10\x5a\xa6\x2c\x92\x65\x4c\x97\x31\xad\xfc\x6e\x99\xea\x9b\x99\x17\x5a\xff\xcb\xf7\x4e\x9b\x88\x67\xaa\x8b\x4f\x9b\x93\xfb\x75\xb9\xf4\xfe\x4c\x46\xb9\xd0\x0a\x55\xab\x46\xbd\x47\x39\x03\xc2\xae\x2e\x15\x1b\xc2\xec\xa7\x81\x8f\x23\xaa\x2a\x4c\x53\xf6\xc1\x56\x3e\xf7\x5a\xbc\x62\xd2\x90\x12\x7a\xe6\x32\xe2\xd3\x48\xe8\xa6\xeb\x11\x31\x4a\x26\x78\x4c\x12\x45\xe5\x9d\xf5\x75\xac\x02\xb2\x63\xa1\xbb\x85\x67\xf3\xe5\x82\xda\x12\x87\x6e\xb7\xa5\x4e\xd2\x6d\xb3\xcf\xe3\x2f\x5d\xf4\xee\xc7\x19\xf3\x53\xaa\x58\x95\x9c\x75\xb2\xd2\x00\xa9\x98\x58\xa4\xf9\x6b\xd5\x8c\xe2\x4a\x9b\xde\x66\xe4\xe3\x64\x6b\x83\xb6\x49\x39\x39\x5b\x11\x72\x46\xfb\xf9\x79\x39\x5f\xf2\x8c\xc7\xb9\x70\x22\xa5\x58\xe9\x55\xb1\x08\x90\x1e\xa4\xb2\xec\xc5\xb3\x7b\x59\xea\x0d\xb6\x3c\x61\x52\xa9\xa5\x99\x55\xfa\xcb\x91\x28\xde\x10\x6f\x23\xb8\x09\x77\xeb\xfc\xad\x37\xba\x79\xee\x96\xfb\xe9\x64\x27\x91\xb5\x3e\x57\x6a\x29\xc2\x5a\xb1\xac\x75\xa5\x5a\x4e\x95\xfe\x72\x9c\xfb\x16\x84\x25\x18\x4b\x3d\xa8\xc7\x2a\x59\x88\x5c\x2e\x84\x6e\xfb\x4c\x64\x99\xa9\x95\xcf\x57\xec\xa1\xc2\x3c\xd0\x23\x2a\x62\xb5\xcc\x84\x3f\x7a\xdd\x1a\x38\xce\x99\x6c\x7a\xcd\x34\x99\x5e\x4c\x32\x65\x98\x5a\xf0\x28\x12\x19\x0b\x1e\x97\xf1\x93\x29\xcc\xce\xf4\x22\xca\x22\x9e\xcd\xdd\x40\xd3\x1b\x6f\x2e\xaf\x1b\xad\x2d\x26\x41\x13\x2f\x4d\x94\x92\x7a\xc2\xd9\x6e\xa3\x09\x57\x7e\xbf\x4c\xdc\x4f\xa8\xb7\x74\x33\x1c\x74\x1f\x11\x9a\xf1\x20\xe3\xd9\xca\x73\x3b\x87\xed\x5e\x48\x4f\xfd\xc2\x95\xd3\xb0\xcc\xce\x08\xdd\x27\xeb\xf6\x89\xb1\xda\xb9\xd2\x03\x1c\x2c\x23\x53\x6f\xa8\x98\x36\x07\xed\x05\xba\xa3\xce\xb4\x2d\xa2\xec\x12\xca\x2e\xa1\xec\x12\xca\x2e\x9d\x44\x71\xae\xba\x49\x94\xc8\xdd\x2e\x93\x67\x5c\xea\x55\x22\x66\x2f\xba\x33\xdc\x37\xdd\x92\xad\xbf\xe6\x36\x3e\x3f\xf5\x32\xb7\x02\x68\x79\x23\x3c\x43\x2c\xf1\x31\x99\xdc\x85\x49\xa0\xee\x68\x63\xd3\x72\xea\x8e\xb6\xa6\x5b\x9e\xca\x3b\x9e\xca\xdb\x20\x89\xf5\x5c\x51\x77\x7f\xf1\xd3\xca\xdf\x70\x46\x7b\x70\xce\x65\xa4\x48\x3f\x94\xb5\x3f\x05\x1b\x1d\x30\x0e\x2b\x1d\xd0\x8b\x51\xf8\x44\x4a\xc9\xab\x49\x45\x4b\xc5\xea\x48\x69\x2b\x21\x4d\x23\x69\xb4\x81\x17\x38\x26\xa4\x4b\x2a\xf6\x28\xe7\x8f\x14\xe9\x15\x24\x8b\x85\x9e\xba\xa1\x99\xd4\xb5\xf7\xb2\x1e\x79\xdd\xc1\xc5\x95\xb4\xde\xca\x44\xdd\x8d\xf5\x77\x87\x39\xbe\x9f\x56\x22\x77\x4e\x38\xc8\xbf\xcb\x85\xd0\xca\xd3\xb9\x09\x74\x47\xdf\x19\x51\x6c\x6c\x37\x52\x7f\xa4\x3c\x94\x59\xc3\x9c\x23\xc4\x19\x1c\x3c\x8a\x6e\x58\x26\xe6\x3c\x0b\x09\xfa\x6b\xb9\x16\xbf\x32\x1e\xe4\xf2\x59\xe6\xaf\x7a\x57\x90\xb1\xfb\x7f\x87\x2c\x4a\xb9\x79\xc4\x2e\xdc\x02\xb5\x9c\x0e\x6c\x1e\xa5\xd4\x56\x7f\xb0\xb5\x94\x5a\xa1\x93\xba\xc5\xe0\xb5\x5c\xf7\xac\x45\xd5\x8c\x47\x2c\xb3\x56\xb4\x93\xee\xc9\x8c\xe9\x47\x6e\x06\xb3\xf5\x25\x56\x03\xef\x8e\x03\xd8\x2b\xcf\x48\xf2\xec\x5f\xfa\x01\x7f\x4e\x92\xa7\x05\xcf\x9e\x54\x11\xb7\x6d\x1e\x9c\x3c\x32\xca\xfa\x8d\x5e\x53\x6d\x5c\xfc\xfc\xf9\xf3\x3f\x3e\xdd\x7f\xf9\xc7\xb7\xab\xc2\x27\x62\xe4\x57\x42\x1a\x56\x2e\xd2\x48\x90\xf3\x63\xea\xaf\xaa\x05\x87\x9c\xc7\xc6\x27\xac\x55\x71\xc4\xe7\xa4\x47\x8b\xaf\x68\xfb\xb3\x6c\x3b\x1a\x47\xc3\xb5\x62\xa1\x54\x41\x26\xf4\x33\x17\x34\xa9\x44\x41\xac\xc3\xa3\x7a\x21\xef\x82\xd0\xb6\xb5\xb6\xe3\x9d\xd2\xd5\x6b\x61\xf6\xcc\xa3\x1b\x16\x27\x06\xf4\x92\x85\xec\xbd\x26\xab\x8e\x37\x42\x8d\xaf\xcc\xb5\xd9\x7a\xa8\xbc\x7d\xac\x84\x52\xf4\x60\xce\xf5\x6c\x1d\x29\x96\x71\x55\xcc\x3d\xfd\x29\x75\x41\xe8\xd9\xe9\x4c\xf0\x5c\x5b\xe9\x73\x9e\x0b\xb6\x32\x10\xf6\x4a\x22\xd6\x32\xdc\x38\x24\x52\x59\x40\xdd\xba\xcb\x1e\xb0\x83\xd4\x4c\x81\x33\x99\x5a\x88\x3f\x40\xfc\x01\xe2\x0f\x10\x7f\x80\xf8\x83\xba\xc5\x17\x60\x7b\x40\x3d\x02\xd6\x09\xd6\x09\xd6\x09\xd6\x09\xd6\x09\xd6\x39\x2e\xd6\x09\xfc\x00\xfc\x00\xfc\x00\xfc\xd0\x39\x7e\xd8\x03\xd1\x1b\x63\x2e\xc9\x5c\xce\xa5\x1e\x7e\x83\x94\xf5\xf7\xa6\xb4\x89\x99\x41\x35\x08\xdc\xaa\x93\xfc\x51\x2c\xcc\xb6\xa5\xf2\x4c\xf0\x05\x75\x4f\x18\xde\xd8\x8d\xe1\xc6\x7e\x77\x91\x3c\x93\xf6\x29\x99\x77\xec\x2b\xc9\x95\xd7\xd5\xa9\x7e\x48\x17\xbe\x6c\x9b\x60\xc3\x3f\x1d\x61\xe3\x0f\xf4\xcd\x7e\x32\x1d\xff\x5f\xeb\x7d\xd0\xe4\xda\xd5\x5f\xf7\x9b\x10\xf9\x6c\xc8\xc2\x7d\xff\x9b\x54\x17\x99\x11\xa9\x97\xb1\x9e\xb3\xa0\x03\xce\xab\xc3\xf9\x6e\x83\x3b\xdf\x2d\x51\x2d\x13\x3f\x63\x97\x31\xde\x0c\xee\x99\x6f\xb7\x8b\xf7\x7a\x7a\xa2\x46\xa9\x51\xcd\x16\x3c\x24\x4b\x8d\x20\x59\x0a\x27\x6a\xe0\x44\x8d\x9a\x87\xe9\xb3\x26\x1b\xc6\x89\x1a\x87\x3c\xef\xbb\x9d\xcf\x6b\x42\x7e\x7b\xf2\xc0\x63\x12\xbc\x24\x34\x7a\x29\x78\xdf\xb0\x23\xce\x00\xb1\x07\xae\x9f\xe8\x28\x90\x86\xa2\xaa\x7c\xfc\x07\x0e\xfd\xa8\x6b\x0d\xb4\xd4\x10\xb5\x14\xd2\xac\x2f\x28\xcd\x1a\xf9\x64\xc8\x27\x43\x3e\x19\xf2\xc9\x60\x06\x6e\x7a\x8b\x7a\x99\xbc\x71\x1e\x23\x0b\xb9\x27\x1b\x73\x4f\xfa\x69\x74\x79\x07\x74\x37\x75\xa9\xaa\x42\xab\x91\xd1\x54\x57\x8d\xaa\xd5\x34\x93\x92\xf8\x10\x7f\x52\xf0\xd8\x54\xff\xc5\x83\x7c\xc2\xd8\x07\xfd\x5f\xf7\xef\x0b\x2e\xc9\x3d\xa7\x58\x10\x2d\x55\x2e\xb2\x62\x4b\xb1\xa7\xd9\x47\xf2\x49\xb0\x6b\xff\xa0\xd7\x5a\x39\x3a\xb5\x33\x61\x0f\x11\x8f\x63\x5b\x86\x80\xf4\x08\x8f\x8c\x04\x7a\xfb\xc3\x21\x6b\x34\x3d\xe3\x99\x94\x82\xef\x34\x2f\xb4\xa7\xae\xfb\x74\x4b\xd9\x07\xd3\x63\x7a\x77\x48\x95\xeb\x1d\x1b\x5f\x45\xa5\x01\x02\x1e\x97\x34\xf3\x6b\xc7\x1d\xa5\x1f\x66\xbc\x18\xbb\xdf\x5b\x18\x1c\x6d\xa7\x29\x84\x76\x0e\xb0\x5c\x2e\x84\xb6\xe9\xfe\x28\x84\x56\xdf\x66\x80\x72\x14\x42\x6b\xa7\x10\xda\x01\xaa\xaa\xb6\xfc\xd9\x98\xf0\x3e\x0a\x9f\xc1\x3f\x7d\x79\xac\x1f\x85\xcf\xda\x9c\x37\x28\x7c\x06\x9b\x08\x36\x51\x4d\x3f\x0e\xa8\xf0\xd9\xf1\x56\x51\x57\x85\xcf\x0e\xf2\x85\xd5\x96\x3b\x1b\x93\x6e\x43\x58\x26\xa4\xda\x45\x48\xb5\x1e\x29\x22\x6c\xdc\xfe\x13\x84\x65\xfa\x4b\x8f\x4a\x68\x74\x5d\xe8\xec\x9c\x41\x8e\x77\x2a\xe0\x51\x39\xb0\xb1\x23\x78\x47\xb7\x59\x2f\xd4\xda\x02\xc5\xfb\x4a\x0d\xc0\xe2\xb3\xf3\x65\x5e\xe6\x89\x1e\x05\x19\xcf\x09\xa1\x53\xb7\x5d\xe0\xeb\xdc\x16\x4b\x29\xba\xb3\xfe\xad\x5e\x9d\x97\x27\xa4\x29\x35\xb7\x06\x48\xa9\x6f\x33\x40\x0a\x40\x4a\x3b\x20\xe5\x98\x1d\x6e\x07\x51\x59\xdf\xe2\x06\x69\x9e\x03\xab\xc0\x56\xbf\x3c\x5b\x1d\x58\xa5\xcd\x79\x03\xac\x02\xef\x0c\x0c\xa4\x4e\x0d\xa4\xf6\xc0\x4a\xa7\x26\x52\x57\x68\xe5\x38\x4f\xc5\x0e\xc6\x32\x12\x25\x77\xcc\xbb\x02\xf9\x06\xf9\x36\x20\xf9\xd6\x23\x95\x84\xcd\xdc\x7f\xd2\xe9\x66\x7e\x26\xd8\x02\xf9\xd1\x2a\x6e\xe9\x40\x7c\xbc\x61\x6d\x00\x17\x93\xbb\xd6\x3d\x71\xa1\xfb\x74\x83\x5c\x4c\x13\xb0\x0a\x01\xa0\x22\x7b\x05\xd9\x2b\x80\x2e\x80\x2e\xe7\x82\x2e\xc7\x6c\x72\xbb\xa8\xcb\xfa\x2e\x37\x48\x63\x1d\xd8\x05\x76\xfb\xe5\xd9\xed\xc0\x2e\x6d\xce\x1b\x60\x17\x78\x6a\x60\x23\xd5\xf4\x63\xff\xa0\xcb\x00\xb3\x59\x8e\x74\x55\xec\x62\x2e\x23\xd1\x71\xc8\x6e\x81\x74\xbb\x08\xe9\xd6\x23\x85\x84\x8d\xdc\x7f\x82\xec\x16\x7f\xe9\x51\x09\x8f\xf1\x64\xb7\x68\x19\x21\x66\xcb\x48\x89\x5c\x9d\xe8\xf0\xee\xd2\xe1\xa6\xc9\x8c\x7d\xb5\x0f\xd0\xfc\x24\xef\x5f\xfc\xef\x0b\xe5\xb2\xe1\x2a\x38\xd4\x1b\x95\xf4\x51\x49\x1f\x95\xf4\x51\x49\x1f\x95\xf4\xcf\x62\x80\xc0\x4e\x6c\x3c\x50\xe7\xb4\x13\x8f\x2a\xef\x6f\x3c\xb2\x6d\x96\xf7\xa7\x2b\x9e\xb7\xbc\x3f\x4a\x4c\x5c\x50\x89\x89\xa3\xa6\x7f\xc4\xa7\x22\x6a\x75\xfa\xd3\x15\xcf\x3b\xfd\x4d\xf5\x79\xf2\x18\x2d\xf8\x9f\x72\xb1\x5c\xb0\x78\xb9\x98\xea\x49\x32\xf3\x8b\xa9\x32\xbd\x45\xe5\x83\x09\x91\x15\xd5\xaf\x69\xca\x92\x8c\x96\xfa\x59\x4c\x35\x85\x75\x6d\xa2\xc5\xb7\xfe\xb7\x7f\xbb\x5d\xea\xdf\xae\xa0\x43\x5c\xf4\xbe\xab\xb5\x60\x26\xaa\x99\x9d\xb4\x7f\x04\x3c\x76\xd3\xb9\x50\x42\x8a\x2f\xf4\x5b\x26\x73\xe9\x25\xb3\x79\x4a\x2d\xee\x45\xa1\x75\xf4\xad\x4d\x5b\xf4\xa0\x4d\xd8\x57\x91\xe7\xa6\xf0\xbd\x69\xbb\x91\xca\xa6\x6d\xe2\x85\x44\x03\x8f\xcb\x3b\x84\x96\x29\x8b\x64\x19\xd3\x65\x4c\x2b\xbf\x5b\xa6\xfa\x66\xe6\x85\xd6\xff\xf2\xbd\xd3\x26\xe2\x99\x4a\xe3\xd3\xe6\xe4\x7e\x5d\xae\xbe\x3f\x93\x51\x2e\xb4\x42\xd5\xaa\x51\xef\x51\xce\x80\xb0\xab\x4b\xc5\x86\x30\xfb\x69\xe0\x43\x89\xaa\x0a\xd3\x54\x7e\xb0\xc5\xcf\xbd\x16\xaf\x98\x34\xa4\x84\x9e\xb9\x8c\xf8\x34\x12\xba\xe9\x7a\x44\x8c\x92\x09\x1e\x93\x44\x51\x85\x67\x7d\x1d\xab\x80\xec\x58\xe8\x6e\xe1\xd9\x7c\xb9\xa0\xb6\xc4\xa1\xdb\x6d\xa9\x93\x74\xdb\xec\xf3\xf8\x4b\x17\xbd\xfb\x71\xc6\xfc\x94\x2a\x56\x25\x67\x9d\xac\x34\x40\x2a\x26\x16\x69\xfe\x5a\x35\xa3\xb8\xd2\xc6\xb7\x19\xf9\x38\xd9\xda\xa0\x6d\x52\x4e\xce\x56\x84\x9c\xd1\x7e\x7e\x5e\xce\x97\x3c\xe3\x71\x2e\x9c\x48\x29\x56\x7a\x55\x2c\x02\xa4\x07\xa9\x32\x7b\xf1\xec\x5e\x96\x7a\x83\x2d\x4f\x98\x54\x6a\x69\x66\x95\xfe\x72\x24\x8a\x37\xc4\xdb\x08\x6e\xc2\xdd\x3a\x97\xeb\x8d\x6e\x9e\xbb\xe5\x7e\x3a\xd9\x49\x64\xad\xcf\x95\x5a\x8a\xb0\x56\x2c\x6b\x5d\xa9\x96\x53\xa5\xbf\x1c\xe7\xbe\x05\x61\x89\xc7\x52\x0f\xea\xb1\x4a\x16\x22\x97\x0b\xa1\xdb\x3e\x13\x59\x66\xca\xe5\xf3\x15\x7b\xa8\x30\x0f\xf4\x88\x8a\x58\x2d\x33\xe1\x4f\x5f\xb7\x06\x8e\xf3\x27\x9b\x5e\x33\x4d\xa6\x17\x93\x4c\x19\xa6\x16\x3c\x8a\x44\xc6\x82\xc7\x65\xfc\x64\x6a\xb3\x33\xbd\x88\xb2\x88\x67\x73\x37\xd0\xf4\xc6\x9b\xcb\xeb\x46\x6b\x8b\x49\xd0\xc4\x4b\x13\xa5\xa4\x9e\x70\xb6\xdb\x68\xc2\x95\xdf\x2f\x13\xfa\x13\xea\x2d\xdd\x0c\x07\xdd\x47\x84\x66\x3c\xc8\x78\xb6\xf2\xdc\xce\x61\xbb\x17\xd2\x53\xbf\x70\xe5\x34\x2c\xb3\x33\x42\xf7\xc9\xba\x7d\x62\xac\x76\xae\xf4\x00\x07\xcb\xc8\x94\x1c\x2a\xa6\xcd\x41\x7b\x81\xee\xa8\x33\x6d\x8b\xa8\xbc\x84\xca\x4b\xa8\xbc\x84\xca\x4b\x27\x51\x9c\xab\x6e\x12\x25\x72\xb7\xcb\xe4\x19\x97\x7a\x95\x88\xd9\x8b\xee\x0c\xf7\x4d\xb7\x64\xeb\xaf\xb9\x8d\xcf\x4f\xbd\xcc\xad\x00\x5a\xde\x08\x8f\x11\x4b\x88\x4c\x26\x77\x61\x12\xa8\x3b\xda\xd8\xb4\x9c\xba\xa3\xad\xe9\x96\xa7\xf2\x8e\xa7\xf2\x36\x48\x62\x3d\x57\xd4\xdd\x5f\xfc\xb4\xf2\x37\x9c\xd1\x1e\x9c\x73\x19\x29\xd2\x0f\x65\xed\x4f\xf1\x46\x07\x8c\xc3\x4a\x07\xf4\x62\x14\x3e\x91\x52\xf2\x6a\x52\xd1\x52\xb1\x3a\x52\xda\x4a\x48\xd3\x48\x1a\x6d\xe0\x05\x8e\x89\xea\x92\x8a\x3d\xca\xf9\x23\x05\x7b\x05\xc9\x62\xa1\xa7\x6e\x68\x26\x75\xed\xbd\xac\x47\x5e\x77\x70\x71\x25\xad\xb7\x32\x51\x77\x63\xfd\xdd\x61\x8e\xef\xa7\x95\xe0\x9d\x13\x0e\xf2\xef\x72\x21\xb4\xf2\x74\x6e\x02\xdd\xd1\x77\x46\x14\x1b\xdb\x8d\xd4\x1f\x29\x0f\x65\xd6\x30\xe7\x08\x71\x06\x07\x8f\xa2\x1b\x96\x89\x39\xcf\x42\xe2\xfe\x5a\xae\xc5\xaf\x8c\x07\xb9\x7c\x96\xf9\xab\xde\x15\x64\xec\xfe\xdf\x21\x8b\x52\x6e\x1e\xb1\x0b\xb7\x40\x2d\xa9\x03\x9e\x47\x35\xb5\xd5\x1f\x6c\xad\xa6\x56\xe8\xa4\x6e\x49\x78\x3d\xd8\x3d\x6b\x61\x35\xe3\x12\xcb\xac\x19\xed\xb4\x7b\x32\x63\xfa\x99\x1b\xf2\x6c\x7d\x8d\xd5\xe8\xbb\x23\x19\xf6\xca\x53\x92\x42\xfb\x97\x7e\xc4\x9f\x93\xe4\x69\xc1\xb3\x27\x55\x44\x6f\x9b\x47\x27\xa7\x8c\xb2\xae\xa3\xd7\x54\xdb\x17\x3f\x7f\xfe\xfc\x8f\x4f\xf7\x5f\xfe\xf1\xed\xaa\x70\x8b\x18\x05\x96\x90\x8c\x95\x8b\x34\x12\xe4\xff\x98\xfa\xab\x6a\xcd\x21\xe7\xb1\x71\x0b\x6b\x61\x1c\xf1\x39\x49\xd2\xe2\x2b\xda\x04\x2d\x9b\x8f\xc6\xd7\x70\xad\x58\x28\x55\x90\x09\xfd\xcc\x05\x50\x2a\x81\x10\xeb\xf3\xa8\x5e\xc8\x7b\x21\xb4\x79\xad\x4d\x79\x27\x76\xf5\x72\x98\x3d\xf3\xe8\x86\xc5\x89\x61\xbd\x64\x24\x7b\xc7\xc9\xaa\xef\x8d\x68\xe3\x2b\x73\x6d\xb6\x4e\x2a\x6f\x22\x2b\xa1\x14\x3d\x98\xf3\x3e\x5b\x5f\x8a\xc5\x5c\x15\x8b\x4f\x7f\x4a\x5d\x10\x7a\x7c\x3a\x13\x3c\xd7\x86\xfa\x9c\xe7\x82\xad\x0c\x84\xbd\x92\x88\xb5\x12\x37\x3e\x89\x54\x16\x5c\xb7\xee\xb2\x07\x6c\x22\x35\x53\xe0\x4c\xd6\x16\x42\x10\x10\x82\x80\x10\x04\x84\x20\x20\x04\xa1\x6e\xf1\x05\xdb\x1e\x50\x8f\x00\x77\x02\x77\x02\x77\x02\x77\x02\x77\x02\x77\x8e\x0b\x77\x82\x40\x80\x40\x80\x40\x80\x40\x74\x4e\x20\xf6\xa0\xf4\xc6\x98\x4b\x32\x97\x79\xa9\x87\xdf\x50\x65\xfd\xbd\x29\x6d\x62\x66\x50\x0d\x05\xb7\xea\x24\x7f\x14\x0b\xb3\x6d\xa9\x3c\x13\x7c\x41\xdd\x13\x86\x37\x76\x63\xb8\xb1\xdf\x5d\x24\xcf\xa4\x7d\x4a\xe6\x1d\xfb\x4a\x72\xe5\x75\x75\xaa\x1f\xd2\x85\x2f\xdb\x26\xd8\xf0\xcf\x48\xd8\xf8\x03\x7d\xb3\x9f\x4c\xc7\xff\xd7\x7a\x1f\x34\xb9\x76\xf5\xd7\xfd\x86\x44\x3e\x27\xb2\xe4\xbf\xff\x4d\xaa\x8b\x4c\x8c\xd4\xeb\x58\xdf\x79\xd0\x01\xe7\xd6\xe1\x9c\xb7\xc1\x9d\xf3\x96\xa8\x96\xa9\x9f\xb1\xcc\x18\x6f\x08\xf8\xcc\xd7\x5b\x46\x7c\x3d\x3d\x5b\xa3\xdc\xaa\x66\x8b\x1e\x92\xa6\x46\x90\x34\x85\xc3\x35\x70\xb8\x46\xcd\xc3\xf4\x5a\x98\x0d\xe3\x74\x8d\x83\x1e\xf8\xdd\xce\x07\x36\xc1\xbf\x7d\x79\xe2\x31\xe9\x5e\x92\x1b\xfd\xd4\xbd\x6f\xd8\x31\x47\x82\xd8\x03\xd8\x4f\x74\x32\x48\x53\x71\x55\x3e\x0d\x04\x67\x80\xd4\xb6\x06\x92\x6a\x88\x92\x0a\x59\xd7\x17\x94\x75\x8d\xf4\x32\xa4\x97\x21\xbd\x0c\xe9\x65\xb0\x06\x37\xbd\x45\xbd\xcc\xe5\x38\x8f\xa5\x85\x54\x94\x8d\xa9\x28\x3d\x35\xbc\xbc\x2f\xba\x9b\x52\x55\x55\xa5\xd5\xcc\x6e\xaa\xab\x50\xd5\x6e\xd6\x49\x49\x7f\x88\x3f\x29\x96\x6c\xaa\xff\xe2\x41\x3e\x61\xec\x83\xfe\xaf\xfb\xf7\x05\x97\xe4\xa8\x53\x2c\x88\x96\x2a\x17\x59\xb1\xab\xd8\x23\xee\x23\xf9\x24\xd8\xb5\x7f\xd2\x6b\x2d\x1e\x9d\xe0\x99\xb0\x87\x88\xc7\xb1\xad\x4d\x40\x92\x84\x47\x46\x05\xbd\xfd\xe1\x90\x65\x9a\x9e\xf1\x4c\x62\xc1\x77\x9a\xd7\xda\x53\xd7\x7d\xba\xa5\xec\x83\xe9\x31\xbd\x41\xa4\xca\xf5\x8e\x0d\xb7\xa2\x7a\x01\x01\x8f\x4b\xb2\xf9\xb5\xe3\x8e\xd2\x0f\x33\x5e\xaa\xdd\xef\x5d\x0c\x0e\xb7\x13\x95\x47\x3b\x0b\x67\x2e\xd7\x47\xdb\xf8\x00\x28\x90\x56\xdf\x66\x80\x73\x14\x48\x6b\xa7\x40\xda\x21\xd2\xaa\xb6\x2e\xda\xa8\x70\x3f\x4a\xa2\xc1\x4f\x7d\x79\xe8\x1f\x25\xd1\xda\x9c\x37\x28\x89\x06\xc3\x08\x86\x51\x5d\x47\x0e\xa8\x26\x5a\x0b\xa6\x51\x57\x45\xd1\x0e\x73\x8a\xd5\xd6\x42\x1b\x95\x76\x43\xa8\x26\xf4\xda\x65\xe8\xb5\x1e\xc9\x22\xec\xde\xfe\x13\x84\x6a\x96\xae\x3d\x2a\xb9\xd1\x75\x25\xb4\xf3\xc6\x3d\xde\xa9\x80\x47\xe5\x58\xc7\x8e\x60\x1e\xdd\x66\xbd\x96\x6b\x2b\x54\xef\x2b\x35\x01\x4b\xd0\xce\x37\x7a\x99\x27\x7a\x1c\x64\x3c\xa7\x17\x9b\xba\xed\x02\x5f\xe9\xb6\xd0\x4a\xd1\x9d\x1b\xde\xec\x95\x79\x79\x4a\xb6\xb2\x7e\x6b\x50\x95\xfa\x36\x83\xaa\x80\xaa\xb4\x43\x55\x8e\xda\xe3\x76\xe1\x95\xf5\x4d\x6e\x90\x76\x3a\x18\x0b\x6c\xf6\xcb\xb3\xd9\xc1\x58\xda\x9c\x37\x60\x2c\xf0\xd2\xc0\x44\xea\xd4\x44\x6a\x0f\xb2\x74\x6a\x24\x75\x45\x59\x8e\xf4\x56\xec\xc2\x2d\x23\xd1\x72\xc7\xbc\x2d\x10\x70\x10\x70\x03\x12\x70\x3d\xd2\x49\xd8\xce\xfd\x27\x9d\x6e\xe7\x67\xa2\x2e\x10\x20\xad\x62\x97\x0e\xe4\xc7\x1b\xd6\x0a\x77\x31\x39\x6d\xdd\x83\x17\xba\x4f\x57\xe4\xc5\x34\x02\x0b\x11\x60\x2a\x92\x5a\x90\xd4\x02\xfc\x02\xfc\x72\x46\xfc\x72\xd4\x4e\xb7\x93\xbf\xac\x6f\x75\x83\x34\xda\x01\x60\x60\xbf\x5f\x9e\xfd\x0e\x00\xd3\xe6\xbc\x01\x80\x81\xc7\x06\x86\x52\x5d\x47\xf6\x8f\xbf\x0c\x31\xc9\xe5\x58\x9f\xc5\x4e\xfe\x32\x12\x2d\x87\xa4\x17\xe8\xb7\xcb\xd0\x6f\x3d\x92\x49\xd8\xcd\xfd\x27\x48\x7a\x29\x5d\x7b\x54\xf2\x63\x88\x49\x2f\x7a\xdf\x97\x01\x57\x22\xef\x16\xab\x98\x0a\xba\x99\xad\xba\xe9\x8e\x9e\x4d\x66\x4c\x37\x8e\x7d\x31\x4f\xb1\x5d\xa2\xe8\x4b\x18\x7d\x52\x7c\xfd\xd7\x24\xbb\x8f\x22\xaf\x57\x7a\x41\x55\x36\xfe\xe0\x42\x0b\x60\x15\xa3\x85\xfa\x57\x35\x5f\x6b\x65\x69\xa8\x7d\x81\x3a\x26\x38\x74\x1a\x2f\x95\xe2\xfb\x39\x49\x9e\x16\x3c\x7b\x52\x85\x43\xc8\xbc\xe7\x54\xf0\x58\x59\x41\xf5\x9a\x0a\xf6\xed\xea\xe7\xcf\x9f\xff\xf1\xe9\xfe\xcb\x3f\xbe\x5d\x15\x25\x87\xcd\x69\xbb\x09\xe9\x61\xb9\x48\x23\x41\xb5\x85\xa7\xfe\xaa\x0b\xfe\xca\xe4\x3c\x36\x67\x9d\x4b\x65\x1c\x1a\x5a\x3a\x15\x5f\xe1\x99\x60\xe5\xd2\xac\xa6\x8e\xef\xb5\x62\xa1\x54\x41\x26\xf4\x33\x17\x85\xe1\x4b\xf2\xdb\xd6\x13\xae\x5e\xc8\x57\xf8\xe5\xb9\x29\x93\xeb\x8e\xa0\x94\x71\x2e\xb2\x67\x1e\xdd\xb0\x38\xc9\xe8\xb1\xa8\x00\xad\x2f\x4a\xbc\x5a\xd7\x3a\x0e\xe9\xf7\xae\xcd\xb6\x00\xb4\x2f\x3f\xab\xb4\x1c\xd7\x0f\xe6\x8e\x54\xb7\x75\x8a\x6d\xb9\xfa\xca\xe9\xde\xfa\x53\xea\x02\x7b\x48\xf7\xa3\x60\x33\xc1\xf3\x65\x26\xd8\x9c\xe7\x82\xad\x0c\x84\xbd\x92\x88\xb5\x96\x34\xf5\x7e\x53\x69\x1e\x6e\xd3\x65\xf7\x44\x33\x35\xc3\x5f\xcf\x69\xea\xdc\x3f\x2d\x60\xa7\xdf\xcb\x25\xa3\x8d\x87\xb1\x74\xfc\xbd\x12\xb9\xa9\xcf\x6c\x6b\x7e\xeb\x0e\xaf\x14\x8b\xf6\xe7\x94\x9b\x4e\x99\xb0\xaf\x32\x0e\xc4\xca\xc9\xf6\x76\x34\xad\xf6\xae\x56\xa2\xae\x14\xe3\xf6\x0f\x62\x7e\x4a\x17\xe7\xda\x18\x7c\x96\xc9\x52\xd9\x0a\xe4\xae\x34\xb0\x7e\x1b\x8a\xfa\xd0\xe6\xb3\xe2\xfd\x63\xdf\x89\x3f\x03\x91\x16\x55\x40\xcd\x25\x93\x99\xbf\xc9\xf7\xfe\xe8\x6d\xfb\x7c\xa6\x4a\x39\xe1\x47\xbe\xfa\x28\x52\xbf\x59\xc2\xcc\x06\x6f\x4d\xfa\x29\x54\xb8\x09\x56\x7f\xa6\x7f\x41\x46\x8a\xc8\x98\x31\x48\x5d\x11\xf1\x70\x29\xa8\xba\xfd\x9f\xa9\xb4\x25\x09\xbe\x9b\x8b\x58\x64\x84\x95\x66\xda\x32\xcd\x13\x36\x93\xb3\x5c\x88\x98\x2d\x64\xbc\xcc\x85\xfa\x9e\x51\x65\xf8\x20\x89\x67\x72\xee\x2a\x19\x18\xcb\xc9\x55\x79\x2f\x26\x67\xf5\x2d\x32\x1b\x9a\xb5\xca\x38\xfb\xbf\x6f\xff\x0f\xfb\x62\x4f\x1c\xff\xa0\x1f\x41\x84\xd6\xee\xcd\x93\xb9\x79\x40\xfb\x4d\xdf\xa2\x3c\x79\x12\xb1\x6f\xb2\xad\x44\x1d\x0b\x11\xae\x14\xb0\x8e\xa8\x3a\xbd\xcc\x8d\xfd\x96\x09\x95\x73\x53\xf5\x5c\xda\x9a\xb7\xae\x58\xf7\x7a\xb5\xf2\x09\xfb\xac\x6f\xfd\x22\xdd\xa1\xf9\xf6\x2e\x7a\x64\xec\x32\x60\x3c\xb3\xb6\x46\xb4\x29\x8a\xec\x0d\x4d\x7a\x42\x57\x05\xbb\x64\x80\xea\xc6\x52\xe3\x76\x76\x0b\x5d\x97\x1e\x98\xbc\xc2\x6e\x72\x53\x91\xfb\x27\xf1\x6a\x8e\x84\xf7\xff\x1c\xf1\x5c\xdf\xbf\xa8\xd8\xfd\xf2\x28\x4d\x31\x74\x19\x97\x3a\xc4\x7f\xdf\x4f\xe4\x52\x89\x6b\xc5\x6e\xbd\x8e\x33\xa7\xce\x66\x62\xcf\x42\xe5\x2b\x9d\xb1\x5e\xa3\xdc\x1e\x2f\x4f\x82\x86\xac\x60\x3d\x21\xf5\x7f\xcd\xa0\x3c\x89\x57\x5b\xf5\xdd\x5f\xf8\xdb\x95\x6b\xf2\xb7\x2b\x5b\xd4\x7d\x73\x15\x78\x5a\x20\xaa\x75\xe0\xfd\x1e\x41\x23\x47\x13\xc0\xae\xc6\xe5\xde\x53\x6b\x45\x92\xed\x6b\xe3\x77\x0e\x7b\xaa\xbe\x1d\x31\xe3\x89\xc9\xd9\x42\x2a\x45\x3b\x42\xc5\x1d\xb4\xef\xca\xeb\xa6\x5e\x3b\x58\xbc\xd9\x6a\x7b\xcf\x94\x28\x4e\xda\xd7\xef\x46\x26\x83\xdc\x57\x29\xd6\xcb\x93\x6f\xbb\x2f\x2c\xf1\x6a\xc7\xc9\x40\x8a\x6a\x95\x0f\xf1\x2c\xb2\xd7\xfc\x51\xc6\xf3\x7d\x9b\x4f\x57\xfb\x6a\x9f\x66\x30\x7d\x10\xf1\xa9\x88\x5a\xeb\x03\xba\xda\x39\xfa\xc0\x94\xec\x27\xb7\xd9\x82\xff\x29\x17\xcb\x05\x8b\x97\x8b\xa9\xc8\x4c\xeb\xad\xed\x61\xfa\x87\x6a\x2e\x13\x2c\x2c\x4a\x86\xd3\x32\x4c\x1b\xb1\xd4\x4f\x61\xca\x4e\xac\xaf\x6e\x7a\xfb\xd6\xff\xf6\x6f\x37\xd7\xff\xed\x2a\x5f\xc4\x45\x7f\xbb\xa2\x14\xa6\x68\x8c\x79\x01\x69\x25\x0a\x78\xec\x4a\xcb\x14\x6b\xa9\xe2\x0b\xbd\xb8\xc8\x5c\xfa\x4d\xd7\x3c\xa5\x96\x07\xa2\x58\x2d\xf5\xad\x4d\x5b\xf4\x30\x69\x91\x9a\xe7\x46\xae\x99\xb6\x9b\xcd\xd6\xb4\x4d\xbc\xd0\xb2\xc3\xe3\xb2\x3b\x55\x2f\x74\x8b\x64\x19\xd3\x65\x4c\x2b\xbf\x5b\xa6\xfa\x66\xa6\xb8\x8e\xfe\x97\xef\xdd\xea\x66\x14\x21\xa7\x05\xdd\xfd\xda\xcd\x1d\xbd\xb2\xcd\x64\x94\x0b\xbd\xc7\xe9\x7d\x47\x2f\x23\x41\x55\xc3\x56\x54\x88\x71\x3e\x07\x3e\xae\xaa\xba\x47\x99\x12\x19\xb6\x62\xbc\xdf\xcd\x2b\xa2\x88\xd6\xd2\x67\x2e\x23\xad\x1a\x0b\x7d\xae\x9b\x1c\x3c\x26\x89\xa2\xb2\xd8\xfa\x3a\x76\x0d\xb5\x63\xa1\xbb\x85\x67\xf3\x25\xc9\x76\x1e\x87\x6e\x87\xa2\x4e\xd2\x6d\xb3\xcf\xe3\x2f\x5d\xf4\xee\xc7\x19\xf3\x53\xaa\x10\x23\x4e\xdf\xac\x34\x40\x2a\x26\x16\x69\xfe\x5a\x15\x62\x5e\x7d\xf3\x5c\x6b\x96\x6d\x0d\xda\xb6\x19\xc8\xd9\xca\x56\x60\x76\x0f\x3f\x2f\xe7\x4b\x9e\xf1\x38\x17\xce\xa3\x5f\xd4\xb8\x51\xc5\x6b\x4f\x3b\x0a\x95\xb3\x2f\x9e\xdd\x6f\x6c\x5e\xf2\xe5\x09\x93\x4a\x2d\xad\x11\x20\xe3\x79\x24\x8a\x37\xc4\xab\x0c\x37\xe1\x6e\x9d\xdf\x59\x5b\x1d\xfe\x96\xfb\xed\xb4\x6e\x93\x25\x1b\x43\x2d\x45\x58\xbb\xdd\x92\xad\xb3\x9c\x2a\xfd\xe5\x38\xf7\x2d\x08\x4b\x64\xfa\x77\x6b\xa6\xa8\x64\x21\x72\xb9\x10\xba\xed\x33\x91\x65\x54\x04\xc8\xd4\x56\x2f\x09\x88\x42\x60\xe8\x11\x15\xb1\x5a\x66\xc2\x9f\x51\x6f\x25\x92\x73\xaa\x9b\x5e\x33\x4d\xa6\x17\x93\xc4\x10\x53\x0b\x1e\x45\x22\x63\xc1\xe3\x32\x7e\x32\x05\xed\x99\x5e\x36\x59\xc4\xb3\xb9\x1b\x68\x7a\xe3\xcd\xe5\x8d\x45\xa6\x84\xa0\x89\x97\x26\x4a\x49\x3d\xe1\x6c\xb7\xd1\x84\x2b\xbf\x5f\x26\x0c\x2a\x2c\x6c\x32\xba\x8f\x08\xcd\x78\x90\xfc\xb6\x1b\xbc\x9d\xc3\x36\xcc\x8f\x9e\xfa\x85\x2b\x07\x7c\x9c\xdd\xa9\xfb\x64\x5d\xe1\x18\xdd\xcf\x95\x1e\xe0\x60\x19\x99\xda\x4c\xc5\xb4\xd9\x7b\xf5\xd7\x9d\x54\xbf\xea\xd7\x15\xa7\xba\xa0\x18\xbf\x66\xad\x59\xd5\x6e\x4a\xe4\x6e\xe2\xe6\x19\x97\x7a\xe5\x8e\xd9\x8b\x1e\x61\xf7\x4d\x37\x0b\xf4\xd7\xdc\xbb\xe4\x0b\x2e\x65\xae\xee\x95\x5e\x31\x85\xc7\x33\x25\xff\x9d\x4c\xee\xc2\x24\x50\x77\xf4\xae\xe8\x15\xfa\x8e\x66\xfb\x2d\x4f\xe5\x1d\x4f\xe5\x6d\x90\xc4\xda\xe4\x53\x77\x7f\xf1\xc5\x94\xfc\x0d\x67\xf4\x5a\xe7\x5c\x46\x8a\x96\xa4\xb2\x80\xa0\x60\x8e\x3d\xbb\x7b\xa5\xf1\x67\xec\xf7\x4f\xb4\xdc\xfa\x2d\x49\x51\x49\xac\xd5\xb1\xd1\x52\x23\x4d\x23\x69\x16\x18\xbf\x4a\x9a\x20\x19\xa9\xd8\xa3\x9c\x3f\x52\xec\x4c\x90\x2c\x16\x22\xa6\x6a\x64\xe5\x91\xab\xdc\xcb\x3a\x06\x74\x97\x16\x57\xd2\x8b\x76\x26\xea\x6e\xac\xbf\x3b\xbc\x11\xfd\xb4\xee\x5a\xee\x76\x58\x7f\x97\x0b\xa1\x37\x2c\xe7\xb0\xd0\x5d\x7b\x67\xf6\x52\x23\xf9\x68\xd3\xa0\x45\x4b\x99\xea\x5c\xce\x03\xe0\x74\x0a\x8f\xa2\x1b\x96\x89\x39\xcf\x42\x62\xa6\x7a\x95\x8f\x5f\x19\x0f\x72\xf9\x2c\xf3\x57\xbd\xb3\xc9\xd8\xfd\xbf\x7d\xd7\x97\xdc\x3c\x5e\x5d\x55\xbf\xae\x97\xcd\x7f\x19\xc3\x31\xc9\x1c\x25\xd6\x43\x6c\xea\x93\xe9\xef\x4d\x69\x6b\x35\x83\x67\x42\xc2\xad\x66\xca\x1f\xc5\xc2\x6c\xa6\xc6\xe1\x4f\x1d\x12\x86\x37\x76\xbb\xba\xb1\xdf\x5d\x24\xcf\xa4\xc8\x4a\xa6\x24\xfb\x6a\x8a\xbd\xac\x4e\xe7\x7d\x3b\xad\x86\x4f\x1c\xec\xcf\xb3\x7f\xfd\xb1\x05\x43\x95\x93\x7d\xce\xc8\xa1\x9a\xc5\xca\x14\x20\xaa\xf4\x7d\x90\xa8\xd5\x9e\xef\x1f\x89\x2a\x0d\x17\x50\x54\xcd\xd7\xfa\x12\x22\x07\x16\x05\x16\x05\x16\x05\x16\x05\x16\x05\x16\x05\x16\x05\x16\x05\x16\x05\x16\x05\x16\x05\x16\x05\x16\x05\x16\x05\x16\x05\x16\x05\x16\x05\x16\x05\x16\x35\x84\x11\x05\x8b\xaa\x76\x0f\x58\x54\xff\x59\x14\xdd\xee\x4e\x0b\x8e\x2c\xd1\xdb\x7d\x26\x9e\x25\xbd\x2c\x9d\x82\x29\xab\xf7\xe2\x50\x3e\xcb\x70\xc9\xa3\xf2\x28\x71\x6f\xd3\xfd\xe2\x9f\xea\x8b\x7d\xaa\x09\x0b\x45\x9a\x89\x40\xef\xe3\x3f\x7a\xf5\x7d\x4d\x97\xbb\x2e\x5c\x79\x15\xdf\x8c\xe7\x59\x4c\xc6\x2a\x17\xbc\xb2\x4d\xae\xd2\xae\x97\xe2\x8c\x9f\xf5\xbb\xff\x26\x15\xc8\xd7\xda\xd0\xf6\x86\x7c\x6d\x39\xb7\x88\x96\x83\x0f\xda\xe2\xbb\x44\x0c\x46\x83\xd7\x3d\x0b\x5b\x7f\x61\x80\xc4\x80\xc4\x80\xc4\x80\xc4\x80\xc4\x80\xc4\x80\xc4\x80\xc4\x5a\x5a\x6d\x81\xc4\x80\xc4\x80\xc4\x80\xc4\x80\xc4\x80\xc4\x80\xc4\x80\xc4\x80\xc4\x80\xc4\x80\xc4\x7a\x39\xa2\x40\x62\xd5\xee\x01\x12\x1b\x0a\x12\x0b\xb9\x58\x68\xfb\xa1\xe3\x14\xad\x66\x24\xec\x3d\x3d\xcc\x57\x91\x9f\x12\x80\xf9\x9b\x82\x7b\xd5\x0d\x24\xb8\x17\xb8\x17\xbd\x32\xfe\x3d\x01\xee\x02\xee\x02\xee\x02\xee\x02\xee\x02\xee\x02\xee\x02\xee\x6a\x69\xb5\x05\xee\x02\xee\x02\xee\x02\xee\x02\xee\x02\xee\x02\xee\x02\xee\x02\xee\x02\xee\x02\xee\xea\xe5\x88\x02\x77\x55\xbb\x07\xb8\x6b\x30\xb8\x4b\xa4\x51\xf2\xaa\x55\x64\x2f\x78\x97\x7f\x9a\x93\x02\x2f\x7f\x57\x10\xaf\xba\xa1\x04\xf1\x02\xf1\x32\xc4\xcb\xbf\x28\x40\x5e\x40\x5e\x40\x5e\x40\x5e\x40\x5e\x40\x5e\x40\x5e\x40\x5e\x2d\xad\xb6\x40\x5e\x40\x5e\x40\x5e\x40\x5e\x40\x5e\x40\x5e\x40\x5e\x40\x5e\x40\x5e\x40\x5e\x40\x5e\xbd\x1c\x51\x20\xaf\x6a\xf7\x00\x79\x0d\x05\x79\xc5\x1e\xed\xdc\xfd\xff\xfd\xdf\xff\x8b\xb3\x10\x6b\xc8\x98\xa7\x60\x61\xfd\xa9\x88\x60\x63\x60\x63\x60\x63\x38\x05\x11\x8c\x0c\x8c\x0c\x8c\x0c\x8c\x0c\x8c\x0c\x8c\x0c\x8c\xac\xc7\x7c\x08\x8c\x0c\x8c\x0c\x8c\x0c\x8c\x0c\x8c\x0c\x8c\x0c\x8c\x6c\x88\x8c\xcc\xb6\x5a\x3f\x00\x0d\x25\x5f\xe6\x8f\x4c\x05\x49\x2a\x6e\x98\x5a\x06\x8f\x7a\xe4\xc9\x5e\x11\x7c\x61\xbc\xbd\x69\x96\x50\x2f\xd7\x35\x2d\xe5\xf9\x63\x7d\xcb\xbc\x67\xb4\xfa\xb1\x9e\x7f\x5a\xe9\xdb\xa7\x3f\xe1\x7e\x07\x38\x08\x38\x08\x38\x38\x8c\x11\x05\x1c\xac\x76\x0f\xe0\xe0\xf8\xe0\xa0\xf9\xfc\x7f\x4f\xc0\x08\xcb\x60\x30\x76\xb2\x27\x99\xb1\x27\x19\x87\x5d\x01\xc2\x9b\xc2\xde\x21\x9b\xce\x6a\x63\x6d\x32\x15\x86\xdc\x75\xc5\x01\x50\xba\x76\x0b\x78\x11\x68\x11\x68\x71\x10\x68\x11\x58\x11\x58\x11\x58\x11\x58\x11\x58\x11\x58\x11\x58\x11\x58\x11\x58\x11\x58\x11\x58\x11\x58\x11\x58\x11\x58\x11\x58\x11\x58\x71\x18\x58\x91\x78\xa2\xed\x81\x5d\x3e\x87\x26\xe8\xb0\x2f\xd4\x10\xb8\x14\xb8\x14\xb8\x14\xb8\xb4\xd7\x23\x0a\x5c\x5a\xed\x1e\xe0\xd2\x81\xe3\x52\x14\xd1\x2b\xd0\x66\xa5\x9c\x1e\xa8\x26\xa8\xe6\x20\xa8\x26\xca\xe7\x01\x68\x02\x68\x02\x68\x02\x68\x02\x68\x02\x68\x02\x68\x02\x68\x02\x68\x02\x68\x02\x68\x02\x68\x02\x68\x02\x68\x02\x68\xf6\x1e\x68\x02\xfc\x01\xfc\x01\xfc\x01\xfc\xf5\x7a\x44\x01\xfe\xaa\xdd\x03\xf0\x37\x1a\xf0\xd7\x93\xf4\xc8\x76\xe1\xdf\x89\xb3\x22\xeb\x10\x09\xb0\x21\xb0\xe1\xca\x55\x7b\x84\x0d\x81\x0c\x81\x0c\x81\x0c\xdd\x87\x40\x86\x40\x86\x40\x86\x40\x86\x40\x86\x40\x86\x40\x86\x40\x86\x40\x86\x40\x86\x40\x86\x40\x86\x40\x86\xbd\x44\x86\xe5\x1c\xc8\x0d\xae\x06\xa4\x3e\xd6\xb7\x19\x04\x14\x04\x14\x04\x14\x04\x14\x04\x14\x04\xf4\xc2\x09\xa8\x48\xa3\xe4\x55\x1b\x09\xbd\xc8\x7d\xf4\x4f\x73\xa6\xe4\x47\x7f\x7f\x64\x3f\x02\x63\x0e\x06\x63\x9e\x20\xfb\xd1\xbf\x18\x60\x99\x60\x99\x60\x99\x60\x99\x60\x99\x60\x99\x60\x99\x60\x99\x2d\xad\xb6\x60\x99\x60\x99\x60\x99\x60\x99\x60\x99\x60\x99\x60\x99\x17\xc7\x32\x01\xff\x00\xff\x00\xff\x00\xff\x7a\x3d\xa2\x80\x7f\xd5\xee\x01\xfc\x1b\x0f\xfc\xeb\x4b\xfe\x63\xbb\x00\xf0\xd4\x09\x90\x75\x94\x04\xe8\x10\xe8\x70\xe5\xaa\x3d\x42\x87\xc0\x86\xc0\x86\xc0\x86\xfe\x43\x60\x43\x60\x43\x60\x43\x60\x43\x60\x43\x60\x43\x60\x43\x60\x43\x60\x43\x60\x43\x60\x43\x60\x43\x60\xc3\x5e\x62\xc3\x4a\x0a\xe4\x06\x5f\x03\x72\x20\xeb\xdb\x0c\x0c\x0a\x0c\x0a\x0c\x0a\x0c\x0a\x0c\x0a\x0c\x7a\xd9\x18\x34\x13\x04\xbc\x7a\x52\xff\xf1\x8b\x79\x9a\xb3\x15\x80\x2c\xee\x8f\x1c\x48\x80\xcc\xc1\x80\xcc\xee\x73\x20\x8b\x17\x03\x30\x13\x30\x13\x30\x13\x30\x13\x30\x13\x30\x13\x30\x13\x30\xb3\xa5\xd5\x16\x30\x13\x30\x13\x30\x13\x30\x13\x30\x13\x30\x13\x30\xf3\xe2\x60\x26\xe0\x1f\xe0\x1f\xe0\x1f\xe0\x5f\xaf\x47\x14\xf0\xaf\xda\x3d\x80\x7f\xe3\x81\x7f\x3d\xc9\x81\x6c\x19\x00\x9e\x38\x07\xb2\x96\x92\x00\x1d\x02\x1d\xae\x5c\xb5\x47\xe8\x10\xd8\x10\xd8\x10\xd8\xd0\x7f\x08\x6c\x08\x6c\x08\x6c\x08\x6c\x08\x6c\x08\x6c\x08\x6c\x08\x6c\x08\x6c\x08\x6c\x08\x6c\x08\x6c\x08\x6c\xd8\x4b\x6c\x58\xce\x81\xdc\xe4\x6b\x40\x0e\x64\x7d\x9b\x81\x41\x81\x41\x81\x41\x81\x41\x81\x41\x81\x41\x2f\x1b\x83\xaa\x9c\xe7\x62\xb6\x8c\x7a\x92\x04\xf9\xd5\x3e\xce\xd9\xb2\x20\x4b\x0f\x80\x34\x48\xb0\xcc\xc1\xb0\xcc\xee\xd3\x20\x4b\x6f\x06\x80\x26\x80\x26\x80\x26\x80\x26\x80\x26\x80\x26\x80\x26\x80\x66\x4b\xab\x2d\x80\x26\x80\x26\x80\x26\x80\x26\x80\x26\x80\x26\x80\xe6\xc5\x01\x4d\x00\x40\x00\x40\x00\x40\x00\xc0\x5e\x8f\x28\x00\x60\xb5\x7b\x00\x00\x47\x04\x00\x7b\x92\x08\xd9\x36\x04\x3c\x71\x26\x64\x3d\x28\x01\x3e\x04\x3e\x5c\xb9\x6a\x8f\xf0\x21\xd0\x21\xd0\x21\xd0\x61\xf1\x21\xd0\x21\xd0\x21\xd0\x21\xd0\x21\xd0\x21\xd0\x21\xd0\x21\xd0\x21\xd0\x21\xd0\x21\xd0\x21\xd0\x21\xd0\x61\x2f\xd1\x61\x39\x17\x72\xa3\xb3\x01\xc9\x90\xf5\x6d\x06\x0b\x05\x0b\x05\x0b\x05\x0b\x05\x0b\x05\x0b\xbd\x10\x16\x8a\xca\x8f\xff\x7c\x5b\xad\xf7\xf8\x6b\x92\xdd\x47\x91\x87\x98\x0a\xe4\x12\xe4\x72\x10\xe4\x12\xf5\x1f\x01\x2f\x01\x2f\x01\x2f\x01\x2f\x01\x2f\x01\x2f\x01\x2f\x01\x2f\x01\x2f\x01\x2f\x01\x2f\x01\x2f\x01\x2f\x01\x2f\x01\x2f\xfb\x0f\x2f\x81\xbc\x80\xbc\x80\xbc\x86\x31\xa2\x40\x5e\xd5\xee\x01\xf2\x1a\x0a\xf2\xc2\x41\x9f\xa9\xfa\xe7\xdb\x95\xe3\x3d\x41\xbd\x56\x07\x13\xd4\x0b\xd4\x0b\x39\x7b\xc0\x5e\xc0\x5e\xc0\x5e\xc0\x5e\xc0\x5e\xc0\x5e\xc0\x5e\x7d\x44\x3e\xc0\x5e\xc0\x5e\xc0\x5e\xc0\x5e\xc0\x5e\xc0\x5e\xc0\x5e\xc0\x5e\xd5\xd6\x00\x7b\x01\x7b\x01\x7b\x01\x7b\x01\x7b\x5d\x20\xf6\x5a\xea\xed\x24\xb7\x8f\x4f\x38\x41\x26\x77\x07\x21\xaf\xae\x51\x4f\x13\x9c\x36\x17\x39\x93\xf1\x2c\xc9\x16\x7e\x7e\x73\x66\xfc\xf7\x9b\x89\xd7\x5c\xe4\xf7\x95\x6e\xb8\x7f\xf8\xf8\xdf\xab\xbf\x39\x17\xe0\x1a\x2c\x77\xf2\x9d\x38\x74\xea\x54\x99\x1a\xa5\xdf\xbd\x29\xdf\xbb\xc9\x5b\xf5\xfc\x76\xd8\x2f\x56\xc5\x7a\x34\x6b\xe6\x3e\x6f\xd5\x3f\xdf\xde\x3f\x7c\xfc\x52\xf7\x4b\xbc\x5b\xfb\xbf\x5b\xae\x23\xa9\xee\xe6\xa8\x5e\xb1\x2a\xe2\x3d\xe4\x2d\x23\x6f\x7e\x26\x9e\xa5\x78\xa9\x44\x6f\x1c\xc0\x58\xff\xa5\x8d\x2d\x6b\x62\xde\x50\x9c\x46\xc0\x73\x67\x42\x57\x9c\xc8\x65\xa8\x39\x15\x2c\xd5\xdb\xbe\xd2\xd6\x18\xbb\x8f\x99\x8c\x0d\xc2\x49\x32\xb6\x8c\x3d\x05\x0a\x59\x98\xbd\x7e\x59\xc6\x2c\x94\x99\xd0\xe2\x4a\x78\xb4\xa0\xed\x55\x72\x08\x58\xb6\xe2\x66\xa5\xf5\x64\xb3\xd9\x32\x23\xef\x51\x9a\x25\x81\x50\x64\xb9\x5b\x2d\x67\xad\xa3\x09\xfb\x27\xdd\x91\xbc\x72\x64\x6a\xff\xc8\x6e\xd9\x7d\x14\xfd\x48\x76\x79\x98\xbd\xb2\x6c\x19\x33\x95\x73\xad\x8a\x9c\x33\xc2\x5e\x4e\x84\x7b\xaa\x15\xd3\x8e\x53\x6a\x5e\x72\x22\x7d\xe2\x31\x9f\x8b\xcc\xb8\x43\xcd\xf1\x2f\x4a\x25\x81\x24\xfb\xde\x3b\x1e\x39\x79\x8c\x93\x8c\xe9\xc9\x92\xbf\x7a\x87\xc7\x82\x3f\xe9\x7e\xcb\x1f\x85\x12\x4e\x1f\x6a\xad\xec\x10\x1c\x51\xa8\xa9\x60\xa4\x88\xc9\xc9\x98\x64\xec\xed\xbb\x1f\xf4\x77\x33\x1e\x10\x2b\x8c\x92\x78\x6e\xd4\x20\x39\x02\x83\x24\xce\xb9\x8c\x8d\x25\x4e\x4b\x65\xf1\x5d\xe2\x27\x96\x64\xb2\xe9\xab\x37\x6a\xe6\x49\xc4\xe3\xf9\x24\xc9\xe6\x77\xe9\xd3\xfc\x6e\x19\xcb\x20\x09\xc5\xdd\x5f\x3e\xaa\x07\x7d\x95\x83\xbc\xf3\xb6\x63\x4e\x39\x20\x43\xf1\x50\x38\x31\x5c\x44\x5e\x24\xaa\xe5\xa0\x2e\xe3\x1a\x64\x9c\xfd\xae\x17\xa2\x2f\xb4\x10\x6d\xd9\x29\xcd\xd7\x57\x37\xcb\x0d\xbf\xdd\xb0\x86\xb1\xd5\x65\xdd\xf4\xe9\x34\x09\x5f\x57\x77\x24\xd7\xa9\x75\x9f\x6d\x39\xca\xe8\xa8\xbd\x6c\xb2\xb2\x56\x3f\xbf\x9d\x94\xdb\xb7\x79\xff\xaa\xed\x6e\xe8\x85\x56\xfb\xf8\xa6\xfa\xd4\xbb\x35\xc2\x2f\xc6\xf5\xdd\xbf\x47\x7f\xb7\xf3\xd1\xef\x83\x40\xa4\x3d\x7c\xf6\x21\x4a\xb3\xdd\xd1\x77\xb4\xb4\xb6\x11\x78\x57\xa7\xf4\xea\x23\xf1\xea\x97\xcd\x06\x91\x78\x7b\x08\xcc\xa9\xc8\xf9\xa5\xdb\x72\xd4\x07\x30\xe8\xca\x9f\xc0\xa0\xf3\x63\xb5\xba\x6a\xd0\x6c\x39\xce\xaa\x33\x2f\x1d\x4c\x3b\x98\x76\x30\xed\x60\xda\x0d\xda\xb4\xa3\xa5\x6c\xe4\xf6\x1d\xb5\x11\x46\x5e\xf7\x46\xde\x3e\x1d\xdd\x47\x4b\xef\x88\xe7\xef\x87\xb9\x77\x70\x03\x06\xab\xde\x06\x6c\xf8\xad\x34\x65\x97\xf5\xa7\x3b\x1e\x64\xdc\xf7\x02\xc0\xb8\xfb\x04\x60\xfc\xaa\xf2\x7e\x34\xb7\xed\xd6\x5e\xa9\x8b\xc4\xe2\xbe\x17\x40\xc5\x2b\xff\x83\x13\xa5\x18\xab\xf2\x34\xd9\x0b\x8a\xd7\xbd\x62\x1b\x0a\x1a\x47\x49\xc0\x23\xb5\xa4\x98\x6a\x1e\x04\x42\x29\x38\x57\xe0\x5c\x81\x73\xe5\x74\x03\x82\xe2\x35\xf0\x2a\x79\xaf\xd2\x6f\x7a\x39\xfe\x6a\x96\xe3\x7b\x5a\x8e\xf7\x70\x31\x95\x34\x45\x51\x5f\xbd\xc9\x15\x07\xec\x73\x2a\xb6\xba\xe7\xb7\x93\x8d\x6d\xdd\xac\x04\x6a\x47\x07\xca\xab\xb3\xfe\xee\x89\x07\xaa\xe5\x66\x9c\xcd\x11\xd5\x6a\x3b\x06\x28\x84\x4f\xeb\x89\x5a\xd5\xd5\xf5\x8e\xa8\x06\x2b\xee\xe1\xe1\x08\x75\xd2\x5e\x89\x68\x06\x09\x0f\x09\x0f\x09\x0f\x3e\xda\x1b\x25\xfb\x55\x44\xb3\x16\x84\x6c\x83\xcb\x8c\x45\xbd\x6e\x6a\x2a\xc4\x6b\x4f\xba\xbb\x8f\xda\xf5\xe8\x56\xf4\x43\xba\x1e\xd9\x0c\x28\xd7\x56\x94\xeb\xee\xc5\xb6\x33\xe1\x9a\x2d\x23\x01\xdd\x0a\xdd\x0a\xdd\x0a\xdd\xda\x17\xdd\xfa\x45\xaf\x49\x47\xcb\xd6\x0d\x57\x19\xa1\x6a\x2d\xb7\x14\xa2\xb5\x1f\xbd\xdd\x73\xcd\x7a\x50\x23\x7a\x27\x59\x0f\x68\x05\x14\x6b\xdb\x8a\xb5\x7e\x9d\x6d\x59\xb0\xc2\xcb\x0a\xb5\x0a\xb5\x0a\xb5\xda\x1b\xb5\xda\x82\x87\xf5\x42\xbc\xab\xf0\xac\x9e\x4c\xa4\x0e\xdf\xab\x3a\x02\x8f\x2a\xbc\xa9\xe7\xd6\xa6\xa7\xf3\xa4\x5e\xea\x81\x04\xa5\x6d\x0c\xe7\x11\x20\x94\x9e\x35\x5d\x39\xf6\x3c\x8e\x60\xe3\x1b\x87\xa0\x7a\xd8\x8a\xb0\x15\x7b\x68\x2b\x22\xa8\x1e\x46\x72\xeb\x41\xf5\xb4\xe6\x5f\x64\x64\xbd\x49\x71\x47\x78\xfd\x49\xed\xe8\x83\x3b\xbd\x87\x16\x75\x5b\x6d\xe9\x85\x6d\xdd\x4e\x63\x86\xaa\x95\xfb\x68\x6a\x1f\x10\x72\x7f\xec\x41\x10\xce\x04\x40\xf0\x3d\xa4\x3e\xa4\x3e\xb0\xd0\xce\xd6\x9c\x52\xf1\xb6\x14\x7c\x4f\x2b\xdc\xe5\x44\xe0\x9b\x7d\x1d\x61\xf8\xa7\x17\xb9\xa3\x88\xc5\x6f\xa9\x29\x3d\x92\xb8\x17\x12\x95\x3f\x04\x85\xbb\x7f\x68\x7e\x07\x02\x17\x41\xfa\xd0\xb7\xd0\xb7\xd0\xb7\x7d\xd2\xb7\x47\x04\xe9\xaf\xca\xdb\x71\x47\xea\xaf\x6d\xe9\x08\xd7\x3f\xb9\xb8\x1d\x6c\xcc\x7e\x3b\x2d\xe9\xa7\xb4\x1d\x71\xf4\xfe\xc0\x94\x6d\xb3\x10\xfe\xd6\x84\x2d\xbc\xb6\x50\xb5\x50\xb5\x50\xb5\xbd\x51\xb5\x6d\x79\x6c\x2f\xc9\x5b\x0b\x4f\xed\x69\xc5\xec\x48\xbc\xb4\x63\xf1\xd0\xc2\x3b\xdb\x0b\x0d\xdb\xa1\x67\x36\x51\x01\x8f\x64\x3c\x1f\x76\x78\xff\x81\xa5\x27\x5c\xe3\x51\x78\xc2\x7d\x82\xc2\x13\x57\xa5\x97\xa2\x71\x0c\xbf\x7f\x8b\x2e\xb1\xda\x84\x6b\x3c\x6a\x4d\x54\xfe\x87\x04\x99\x62\xac\x8a\x49\xb2\x4f\xa5\x89\xf2\x5b\x45\x4f\xac\x0d\xda\x28\x4d\x42\xf7\x99\x31\x32\xf6\x7f\xdb\x9a\xda\x4e\x91\x54\xb9\xb6\xb3\x5f\x78\x1e\x3c\x32\x13\xf5\xaf\xf4\x06\xa3\x77\x66\xf6\xff\xf3\x8f\xf4\x90\x84\xf7\xfe\x91\xb6\xbc\x2f\xfa\x7a\x95\x17\x66\xc3\x25\x7e\x4d\xb2\xfb\x28\xf2\xb1\xe0\xbd\x78\x97\x36\xfe\x40\xdf\xec\x27\x95\x67\x82\x2f\xfe\x8b\x3a\x6a\xef\x6b\x57\x7f\xdd\xef\x97\x76\x52\x9a\x97\xfa\x4d\xdd\x30\x82\xa3\x7e\x6b\x77\x6b\x64\x3d\xd1\x5b\xd2\xc8\x7e\x2f\xae\x95\xc6\xbb\xdf\xc1\x06\x99\xb0\x85\xf7\x65\x7f\x9f\x2c\x8f\xa2\xe4\xe5\x5f\x7a\xe2\xfe\x9c\x24\x4f\x0b\x9e\x3d\x29\xe7\xf5\x54\x76\xdd\x10\xcf\x22\xd6\xff\x87\x5c\x80\xaf\xa9\x60\xdf\xae\x7e\xfe\xfc\xf9\x1f\x9f\xee\xbf\xfc\xe3\xdb\xd5\x84\x7d\x15\x99\x7e\x40\xe3\x09\x0c\x13\xf2\xd9\xca\x45\x1a\x89\x85\x88\x73\x36\xf5\x57\x5d\xf0\x57\x26\xe7\x71\x92\x09\x96\x3f\x4a\xc5\x66\x11\x9f\x93\xb3\xaf\xf8\x0a\xcf\x04\x53\xfa\x57\x3c\x27\x97\x97\xa2\x4b\x5f\x2b\x16\x4a\x15\x64\x82\x0c\x0d\xf6\x4b\x24\xe9\x79\x4a\x2e\x62\xae\xf4\x32\xb9\x72\xa1\x4c\xe4\xcb\x2c\x16\xa1\xbe\x18\x8f\x5f\x99\x4a\x45\x20\x67\x32\x60\x32\xce\x45\xf6\xcc\xa3\x1b\x16\x27\x19\x3d\x56\xfe\x28\x5e\xdd\x45\x8a\xfb\x1a\x47\xae\x12\x71\x48\xbf\x77\x6d\x36\xfd\xc1\xc2\x65\x26\xe3\x39\xe3\x4c\x09\xa5\xe8\xc1\x3e\xce\x4c\xc3\xa4\x32\x0f\x65\xba\xef\xc6\xb6\x56\x8a\x28\xd4\x1f\x99\x2e\x08\xed\xd7\x05\x9b\x09\x9e\x2f\x33\xc1\xe6\x3c\x17\x6c\x65\x20\xec\x95\x44\xac\x15\x4d\x48\x3e\xec\x54\x9a\x87\xdb\x74\xd9\x3d\x9d\x81\x35\xc3\x5f\xef\x19\x9c\x26\x49\x24\x78\xdc\xb6\xa3\xf3\xf7\x47\x41\x7e\x5e\x19\x2f\x05\x4b\xe8\x9f\xdd\xc0\x4e\xf5\x38\xe4\xec\xe5\x51\xc4\x7a\x2c\x33\x29\x9e\x75\x87\x2f\x12\x1a\x5b\xb5\x8c\x72\xc5\x66\x59\xb2\x28\x8d\xd8\x84\x7d\x95\x71\x60\xe7\x97\xf1\x3b\x4b\xe5\x46\xd3\x7a\x8b\x6f\x58\x60\x27\x90\x1e\x79\x72\x34\x2f\x95\x19\x76\xff\x20\xe6\xa7\x74\x71\xce\xd2\x4c\x3c\xcb\x64\xa9\x18\x75\xa3\xe3\x09\xf4\x36\xc8\xd0\x54\x5f\x8c\xec\x67\xc5\xfb\xc7\xbe\x13\x7f\x06\x22\xcd\x4d\x1a\x9d\xf7\x82\x27\x33\x7f\x93\xef\x69\xee\x97\x66\x9b\x7e\x9c\x4c\x50\x62\x1e\x5f\x7d\x14\xa9\xdf\x2c\x61\x66\x83\x27\x1e\x7e\x0a\xd9\x99\x2d\xc2\xb5\x9f\xe9\x5f\x90\x5b\x5d\x64\xcc\x40\x93\x97\x47\x41\xac\x23\x5c\x0a\x96\x27\x4c\xfc\x99\x4a\xb3\xc3\xb3\xef\xe6\x22\x16\x19\x8f\xa2\x57\x36\x93\xcf\xf4\xe9\x4c\xce\x72\x21\x62\xb6\x90\xf1\x32\x17\xea\x7b\xad\x25\xe8\xd9\x66\x72\xbe\xb4\x3f\x33\xbe\x7e\x96\xc4\xa5\xb6\xdc\xac\xbd\x45\x66\xff\xb3\x1c\x81\xb3\xff\xfb\xf6\xff\x30\x27\x10\x3f\xe8\x47\x10\xa1\x65\x33\x79\x32\x37\x0f\x68\xbf\xe9\x5b\x44\xa5\xcd\x7d\x93\xcd\x18\xb2\x58\x88\x50\x99\x6f\x11\x20\x8a\x73\xa6\x97\xee\x1b\xdd\x61\x44\x1c\x32\xa1\x72\x9e\xd1\x6a\x22\x33\xfa\x8c\x2e\x9c\x2c\xf3\xea\x88\xd3\x7b\x34\x61\x9f\xf5\xad\x5f\xa4\x12\x37\xe5\xbb\xe8\x91\xb1\xcb\x40\x42\xcf\x46\xd7\xb1\xab\x64\x81\x46\xe8\x09\xf5\xf0\x08\xf9\x5c\x46\x26\xba\xb1\xd4\xb8\x9d\xdd\x42\xd7\xa5\x07\xd6\x33\xdd\x4f\xee\x58\xfc\x99\xb3\x27\xf1\x7a\xc3\xa6\xcb\xbc\xf8\xe7\x88\xe7\xfa\xfe\x2a\xe6\xa9\x7a\x4c\xf2\x1b\xf6\xf2\x28\x83\x47\x5a\x0c\xe2\x52\x87\xf8\xef\xfb\x89\x6c\x1f\xdf\xbc\x42\xb7\x5e\x17\xd2\x02\xae\x57\x4e\xe3\x3b\x0f\x6f\x2c\x93\xd3\x7f\x25\xfa\xfd\x89\x44\xae\x97\xd3\x59\x2e\xcc\x9c\x9e\xc9\x4c\xe5\xab\x9d\x61\xd8\x97\x8c\x83\x68\x19\x9a\x35\xcb\x80\x34\xa3\x7f\x88\xdb\xe8\x09\xa9\xff\x6b\x06\xe5\x49\xbc\x9a\x05\xbb\xb8\xf0\xb7\x2b\xd7\xe4\x6f\x57\x93\x6f\xf1\xb7\xf8\xf7\xca\x5a\xa7\xdf\x02\xb5\x4c\xd3\x24\x23\x34\xa5\x17\x08\xb3\x53\x49\x45\x8b\x50\xb1\x47\xd0\xc8\xd1\x04\xb0\xab\x71\xb9\xf7\x4c\x27\xd0\x1c\xfc\xa7\xd9\x61\xed\x6b\xe3\x77\x8e\xe9\x6b\x79\xc4\x0c\x2d\xcc\xd9\x42\x2a\x45\x3b\x42\x05\x59\xee\xbb\xf2\xba\xa9\x77\x4a\xac\x74\xcf\x94\x88\x04\x11\xbc\x3c\xa1\x77\x23\x93\x81\x79\x13\x8c\xa9\x30\x2b\xda\xee\x66\x85\xe9\x03\x99\x99\xee\x57\x13\xf6\x5e\xcc\x38\xcd\x1c\xbd\x7c\x3c\x8b\xec\x35\x7f\xd4\x5a\xf2\x10\xb2\xf6\xd5\x3e\xcd\x60\xfa\x20\xe2\x53\x11\xb5\xd6\x07\x74\xb5\x73\xf4\x41\x24\x17\x32\x37\xa0\x77\xc1\xff\x94\x8b\xe5\x82\xc5\xcb\xc5\x54\x64\xa6\xf5\xd6\x54\x31\xfd\xa3\xbb\x82\x76\x31\xbb\x3c\x05\x3c\x8a\x68\x19\xa6\x8d\x58\xea\xa7\x60\xe2\x4f\x5a\x74\xd7\xa5\x93\xe9\xd7\x7f\xbb\xb9\xfe\x6f\xfb\x0e\xdb\xcd\x82\xae\xb7\x10\x39\x0f\x79\xce\xf5\xdd\xb8\x7d\x01\x69\x25\x0a\x78\xac\x57\x92\xa5\x2a\xaf\xa5\x8a\x2f\xf4\xe2\x22\x73\xe9\x37\x5d\xf3\x94\x5a\x1e\x88\x62\xb5\xd4\xb7\x36\x6d\xd1\xc3\xa4\x45\x6a\x9e\x1b\xb9\x66\xda\x6e\x36\x5b\xd3\x36\xf1\x42\xcb\x0e\x8f\xcb\xc8\x5f\x2f\x74\x8b\x64\x19\xd3\x65\x4c\x2b\xbf\x5b\xa6\xfa\x66\xff\x11\x59\x62\xfe\xe5\x7b\xb7\xba\x19\x45\xc8\x69\x41\x77\xbf\x76\x73\x47\xaf\x6c\x33\x19\xe5\x42\xef\x71\x7a\xdf\xd1\xcb\x48\x50\xd5\xb0\x15\x15\x62\x02\x24\x02\xe1\x62\x10\xaa\x7b\x94\x7e\x82\x50\x4b\x8c\x85\x8c\x85\xdf\xcd\x2b\xa2\x88\xd6\x52\xe7\x07\x2b\xf4\xb9\x6e\x72\xf0\x98\x24\x4a\xd0\x2a\x96\x27\x6e\x0d\xb5\x63\xa1\xbb\x85\x67\xf3\x25\xc9\x76\x4e\x9b\x12\x35\x88\x3a\x49\xb7\xcd\x3e\x4f\xc5\xc5\x66\x7a\xf7\xe3\x8c\xf9\x29\x55\x88\x11\xa7\x6f\x56\x1a\x20\x15\x13\x8b\x34\x7f\xad\x0a\x31\xaf\xbe\x79\xae\x35\xcb\xb6\x06\x6d\xdb\x0c\xe4\x6c\x65\x2b\x30\xbb\x87\x9f\x97\xf3\x25\xcf\x78\x9c\x0b\x17\x75\x42\x60\xdd\x8e\x94\x7f\xed\x69\x47\x59\x52\x1c\x88\x7f\x76\xbf\xb1\x79\xc9\x97\x27\x4c\x2a\xb5\xb4\x46\x80\x8c\xe7\x91\x28\xde\x10\xaf\x32\xdc\x84\xbb\x75\x91\x12\xda\xea\xf0\xb7\xdc\x6f\xa7\x75\x9b\x2c\xd9\x18\x6a\x29\xc2\xda\xed\x96\x6c\x9d\xe5\x54\xe9\x2f\xc7\xb9\x6f\x41\xe8\xcd\x3a\xdb\x83\x7a\xac\x92\x85\xc8\xe5\x42\xe8\xb6\xcf\x44\xa6\x67\xa8\x7e\x0b\x57\x14\x55\x21\x30\xf4\x88\x8a\x58\x2d\x33\xd7\x7d\xdc\x49\x24\x17\x06\x62\x7a\xcd\x34\x99\x5e\x4c\x12\x43\x4c\x2d\x78\x14\x89\x8c\x05\x8f\xcb\xf8\x49\x19\xc4\xa1\x97\x4d\x16\xf1\x6c\xee\x06\x9a\xde\x78\x73\x79\x63\x91\x29\x21\x68\xe2\xa5\x89\x52\x52\x4f\x38\xdb\x6d\x34\xe1\xca\xef\xd7\x32\x0d\x29\x4a\xc5\xdb\x64\x74\x1f\x11\x9a\xf1\x20\xf9\x6d\x37\x78\x3b\x87\xed\x01\x18\xf4\xd4\x2f\x5c\xb9\xa0\x24\x67\x77\xea\x3e\x59\x57\x38\x46\xf7\x73\xa5\x07\x38\x58\x46\x74\x47\x59\x4c\x9b\xbd\x57\x7f\xdd\x49\xf5\xab\xbe\xb6\x50\xd7\x22\x4e\x2e\x27\xaa\xa4\x59\x6b\x56\xb5\x9b\x12\xb9\x9b\xb8\x79\xc6\xa5\x5e\xb9\x63\xf6\xa2\x47\xd8\x7d\xd3\xcd\x02\xfd\x35\xf7\x2e\xe9\xb5\x67\x6a\x97\x87\x90\xd4\xa1\x5e\x31\x85\x0f\x28\x2a\xb9\xfb\x64\x72\x17\x26\x81\xba\xa3\x77\x45\xaf\xd0\x77\x34\xdb\x6f\x79\x2a\xef\x78\x2a\x6f\x83\x24\xd6\x26\x9f\xba\xfb\x8b\xbb\xe1\xad\xbf\xe1\x8c\x5e\xeb\x9c\xcb\x48\xd1\x92\x54\x16\x10\xcb\x58\x89\x7c\xcf\xee\x5e\x69\xfc\x19\xfb\xfd\x13\x2d\xb7\x7e\x4b\x52\xec\x31\x79\x59\xd3\xd5\x5a\x6a\xa4\x69\x24\xcd\x02\xe3\x57\x49\xfd\x26\xd3\xdc\x7b\x94\xf3\xc7\xe8\x95\x4c\xdb\xc5\x42\xc4\x7a\x25\xcb\xcb\x23\x57\xb9\x97\x75\x0c\xe8\x2e\x2d\xae\xa4\x17\xed\x4c\xd4\xdd\x58\x7f\x77\x78\x23\xfa\x69\xdd\x13\xdd\xed\xb0\xfe\x2e\x17\x42\x6f\x58\xce\x61\xa1\xbb\xf6\xce\xec\xa5\x46\xf2\xd1\xa6\x41\x8b\x16\x59\x6e\x7a\xb1\xf5\xc0\x9a\xb6\x79\x1e\x45\x37\x2c\x13\x73\x9e\x85\x14\xe5\xa7\x57\xf9\xf8\x95\xf1\x20\x97\xcf\x32\x7f\xd5\x3b\x9b\x8c\xdd\xff\xdb\x77\x7d\xc9\xcd\xe3\x7d\x15\x41\x12\x87\x1b\x7c\x54\x1d\x2d\x9b\xff\x32\x86\x63\x92\xb9\xb8\x46\x3d\xc4\xd4\x03\xf4\xbd\x29\x6d\xad\x96\x1a\xd2\x16\x69\x35\x53\xfe\x28\x16\x66\x33\x35\x7c\x80\x3a\x24\x0c\x6f\xec\x76\x75\x63\xbf\xbb\x48\x9e\x49\x91\x95\x4c\x49\xf6\x95\x44\xd4\xeb\xea\x74\xde\xb7\xd3\x6a\x70\xc6\xc1\xfe\x3c\xfb\xd7\x1f\xbb\x51\xd7\x86\x63\xdf\x9a\x10\x30\xa3\x7c\xda\x85\x60\xe6\x9a\x2c\x48\x22\x6d\x68\xd9\x09\xbb\x3f\xfb\x32\x97\xa9\xd0\xaf\x5f\xfc\x25\x8b\x63\x8f\x1a\x5c\xb8\xdb\x08\xc3\x4e\x78\xee\x7b\x6a\xfc\x67\xea\x53\xd5\x90\x0b\x6d\x07\x42\x70\xfc\xc2\xf1\x0b\xc7\x2f\x1c\xbf\x63\x73\xfc\x6e\xd9\x96\x77\x39\x7f\xb7\x4b\xbc\xed\xdb\xf3\x5e\x6b\x2f\xf2\x70\x1a\x0f\x54\x4d\x2e\xce\xc9\x86\xe9\x64\xde\xfa\x66\x5d\xb1\xd9\x63\x7f\xb2\x1e\xf9\xbd\x6c\x76\x48\x6d\xf2\x93\x35\xc0\xa6\x62\x66\xc2\x0a\xbc\x67\xa7\x90\x12\x76\xf5\xa2\xa9\x53\xca\x43\x8a\x93\xf8\x36\x16\x73\x4e\x13\xd4\x1a\x0e\xe5\x7c\x25\xe3\xe5\xf5\xaf\x86\x15\x91\x72\xb1\x10\xa1\xe4\xb9\x88\x5e\x0b\xde\x5f\x6c\xb9\x32\xba\xb1\x86\x01\x75\x3a\x9b\x67\x3c\xa0\xb7\x46\x26\xa1\x17\x04\xc5\xa6\x4d\xc1\x14\x6e\x96\x2e\x95\x7e\xc8\xf2\x70\x71\xfd\x4b\xd7\x20\x7b\x93\x99\x59\x03\xdd\x25\x26\xe6\x39\x17\x82\xc7\xb5\xcf\x78\xc0\x30\xd3\x33\x3f\xd0\x23\xd7\x19\x5b\x3b\xcc\xad\xbe\x4c\xff\x7d\x40\x4d\xb3\x7e\xd9\x0c\x6b\x4e\x36\xfd\x81\x6d\x80\x6d\x80\x6d\x80\x6d\x80\x6d\x3a\xc3\x36\x0d\xf7\x82\x35\x74\x73\xba\x6d\xf1\xbd\x48\x33\xa1\x45\x49\xf8\x23\x4b\x23\xc1\x95\xf0\x4b\xd0\x43\x96\xa4\x7c\x4e\xea\xe8\x21\x89\x64\xf0\x5a\x09\x12\x74\x93\x2e\xf4\x17\xd0\xd3\xee\xed\xe4\x6f\x13\xf6\xd5\xac\x67\x46\xba\xa4\x22\xd6\x2f\x4b\xb1\xa7\x0a\x96\x64\xe9\x23\x8f\x5d\xd0\x62\xb6\x14\x77\x33\x1e\x39\x5b\xf9\xdb\x95\xf9\xf8\xdb\x15\x9b\xc9\x98\x47\xf2\x3f\x6e\x23\x99\x0a\xc6\x43\xf2\xe5\x27\x77\xc6\xcf\x19\x16\x66\x98\xb9\xfc\xb5\x2a\x7e\x64\xec\xd3\x09\xfb\x20\x69\x71\x2c\x3d\x7a\x92\xad\xb7\xad\x20\x37\xb9\x31\x8f\xc9\x46\x49\xf2\xc7\x43\x06\xd4\xb4\xe0\xbd\x6b\xfb\x46\xc9\x53\xe7\x35\x6d\xd7\x30\xa3\xa6\xeb\x17\xf6\x31\x79\x61\x73\x9e\x4d\xf9\xbc\xe2\xbb\xf4\x46\x8d\xc8\x66\x49\xb6\xd0\x63\x52\xdb\x5f\x9f\x57\x5a\xb4\xb9\xbb\x48\xf4\x3a\xc5\x9a\x9a\xbe\x95\x5a\x4d\x06\x32\x2c\x4c\x61\xd2\x0a\xe4\x9c\xf0\x63\xac\x28\x71\x8d\x3e\x75\x6a\x60\x52\x1a\x4c\xb7\x8f\x78\x74\xe2\x03\x70\xab\x37\x9b\x30\x93\x0f\x4a\x7b\x53\xd9\xb2\xbb\x36\x6d\xb8\x66\xb7\x76\x02\x56\x27\xa8\xfa\x89\x5d\xff\xcc\x83\xa7\x79\x96\x2c\xe3\x50\x7f\x8b\x82\x59\xe9\x4b\x2b\x1d\x67\x24\xa4\xd5\xc7\xd5\x8b\xb8\x16\x4c\xfd\x95\x7e\x62\xd7\xbf\x26\x99\x28\x5d\x96\x05\x5c\x05\x3c\xd4\xad\xb7\xfd\x63\x62\x9d\xe9\x7a\xca\x98\x9e\x6b\x17\x9c\xf9\x6b\x1c\x32\x21\xd3\xd5\xe9\x7e\x1e\xc5\x39\x62\xc6\xda\x6c\x1c\xb6\x71\xd6\x73\x8d\x02\x88\x6b\x67\xe3\xbb\x4e\x5d\x4f\xe7\xdb\x38\x27\x7f\x6d\xd6\x59\x5b\x18\xec\xb1\xfa\xa7\x16\xe4\x21\xed\x72\x4f\x4c\xf7\x35\xe7\xf9\xb2\x29\x9f\x1b\x63\xde\x96\xd9\x92\x0b\xb9\x34\xc0\x1c\xae\xe1\x25\x81\x76\x02\xbf\x91\xa6\x76\x39\x69\x6a\xcd\x76\x9f\x5d\xa9\x6a\xa7\x33\xd3\x10\xbb\x80\xd8\x05\xc4\x2e\x20\x76\x01\xb1\x0b\x75\x8b\x2f\xa0\xf8\x80\x7a\x04\x9c\x14\x9c\x14\x9c\x14\x9c\x14\x9c\x14\x9c\x74\x5c\x9c\x14\xe8\x02\xe8\x02\xe8\x02\xe8\xa2\x73\x74\xb1\x07\xde\xef\x69\x22\x59\xb3\x2e\x5c\x4f\x26\x3b\xd6\xe3\xd6\x2b\xe8\xb3\xf1\x07\x38\x1f\x10\xe7\x03\x5e\xee\xf9\x80\x56\x4a\x9a\x7a\x20\x71\xc8\xf4\x30\x31\x15\x24\xa9\xb8\x61\x6a\x19\x3c\xea\x75\x89\xd6\x7d\xc1\x17\x66\xd1\x4a\xb3\x84\xa4\x6b\x5d\xae\x6a\xca\xf3\xc7\xfa\x54\x55\x9f\x28\x5a\xfd\x78\x4b\xbd\x04\x94\xe0\x60\xa7\x2e\xc1\xb1\x3f\x2c\xf4\x65\x38\x3a\xc6\x85\xfd\xab\xc6\xd1\x60\x11\x6d\x25\x91\x16\xc9\x5c\xe5\x19\xd0\xdb\x64\xae\x0b\x2d\xb1\xb4\x87\x17\xbd\xae\xcc\xd2\x91\xc3\xd3\x2b\x81\x39\x0a\xdd\xd7\xfb\x6a\x36\xad\xb6\xe1\x5c\xa5\x6c\x5a\x6c\xc4\x08\xc5\x77\x8b\x05\x6c\x4e\x20\xbe\xdf\xb0\x96\xcf\x4b\x31\x5f\xfa\xdf\x13\x1d\x9b\x72\x88\xe8\xab\x39\x2a\xa5\x47\xa2\x6f\x20\x07\xa4\x40\xd7\x95\x07\xb9\xb7\xba\x0e\x29\xe9\x17\x94\x92\x8e\xdc\x3b\xe4\xde\x21\xf7\x0e\xb9\x77\x30\x49\x37\xbd\x45\xbd\x4c\x74\x39\x8f\x21\x87\x3c\x9d\x5d\x79\x3a\xc3\x31\xe2\xbc\x73\xbd\xf5\xec\x9c\x4c\xf0\x70\x45\x83\xed\x6f\x70\xe9\x8b\x9c\x3c\x25\xa7\x24\x5c\xc4\x9f\x14\x68\x37\xd5\x7f\xf1\x20\x9f\x30\xf6\x41\xff\xd7\xfd\xfb\x82\x4b\x72\x33\x2a\x16\x44\x4b\x95\x8b\xac\xd8\x8e\x4c\x44\x2e\x8b\xe4\x93\x60\xd7\xfe\xa9\xaf\xb5\xea\x74\x4a\x69\xc2\x1e\x22\x1e\xc7\xc2\xc8\x55\xd2\x32\x3c\x32\xf2\xe9\xed\x0f\x87\xac\xef\xf4\x8c\x67\x52\x19\xbe\xd3\xbc\x48\x9f\xba\xee\xd3\x2d\x65\x1f\x4c\x8f\xe9\x9d\x25\x55\xae\x77\x6c\x2c\xda\x52\x89\x8c\x82\xc8\x0a\xbd\xfd\xda\x71\x47\xe9\x87\x19\x2f\xf2\xef\xf7\xf6\x07\x47\xa0\xff\xce\x86\x5d\x64\x2e\x06\xe4\x07\x3c\x06\xc2\x13\x2a\xb2\x5e\x96\x46\x0f\xd3\x84\xb6\xf7\x05\xb4\x23\xc2\x60\x70\x11\x06\x14\xc7\x74\x50\x5d\xe8\x5b\xfa\xed\x5f\xb7\xaf\xe6\x0b\x91\xcd\x45\xa3\x6f\xaa\x3c\xe3\xb9\x98\xcb\xe0\xb6\xf9\x6f\xf4\xdf\xaf\xf6\x9b\xb4\x6f\x34\x91\x69\x29\xcf\x72\x49\x69\x86\x26\xe6\xee\x68\xc9\x46\xf7\xef\xab\x8b\xbc\xab\xb8\x88\x2d\x26\xd1\x43\x35\x36\x8e\xc1\x71\x3e\x72\xc7\xf9\xe5\x04\x44\xac\x64\xf4\xb8\x97\xcb\x64\x9d\xe9\xc5\xa8\x38\xc9\xe0\xbb\x0d\x0b\xd5\xf7\xe4\x36\x34\xa9\xe6\x3c\xa2\x5f\xc6\x49\x7c\x6b\x7e\x4d\xdf\x20\xcf\xbd\x62\xdf\xfd\x5d\x25\xf1\x83\x49\xe8\xff\xa4\x97\x44\xfb\xf7\x57\xb7\x50\x16\xff\xf8\x7d\x9f\x22\x35\x9a\xcf\x9b\x5f\x93\x2c\x20\xb4\x31\x4f\x68\xf0\x13\xf6\xed\x6a\xa6\xff\xed\xdb\x15\xbb\xaf\xf4\x26\xe5\x0b\x18\x0e\x41\xa6\x93\x7d\x51\x6f\x79\x40\x03\x40\x29\xe1\x91\x0c\xac\x67\x95\x2c\xad\xe4\xc5\x8e\xad\x49\x99\x4e\x45\x92\x46\x62\xc2\xcc\x3d\xe9\x24\x08\x37\xa7\x28\x6a\xbf\x76\x20\xfc\xed\x0f\xe9\x5e\x7d\x23\x18\x5c\xe6\x03\x18\x5c\x7d\x33\xb8\xd2\x95\xf0\xf7\xc1\x98\x5c\xcb\xd6\xbd\x76\x69\xc4\x83\xe3\x55\xa0\xbd\xce\xa5\xe9\x40\xc4\xc7\x42\x0e\x5e\xac\x1c\xec\x91\xea\x82\x38\xf0\x9f\x20\x3e\x16\x02\xc7\x08\x85\xc1\xc8\x9b\x37\xac\x9b\xc8\xd2\x3b\x65\xf0\x74\x29\xc0\xb4\x1b\xec\x69\xee\xe3\xb6\xbd\xd3\x02\x50\x8b\xe0\xb1\xee\x61\xcd\x38\x72\xcd\x00\x85\x02\x85\xda\xaf\xcd\xa0\x50\xa0\x50\xed\x50\xa8\xf6\x76\xd0\x03\x78\x54\xcd\x16\x3a\x48\x6f\x04\xa8\x14\xdc\x10\x97\xe7\x86\x00\x95\x6a\x73\xde\x80\x4a\xc1\xf1\x04\x03\xec\x3c\x06\x18\xa8\xd4\x0a\x95\x6a\xd3\xaf\x72\x00\x9f\x1a\x8b\x2e\x04\xa5\x82\x3c\xbc\x58\x79\xd8\x23\x15\x06\xb1\xe0\x3f\x01\xa5\x82\xe0\x19\x1d\xa5\xa2\x63\x31\x37\x42\xa9\x4e\x31\x94\x3d\x4c\x3d\x0e\xe5\xb3\x0c\x97\x3c\x2a\x1f\xcc\xca\x7d\xf9\x84\x0d\xfd\x30\x29\xa5\xf3\xff\xe8\x0f\x02\xb8\xa6\x6b\x5e\x17\x65\x75\x2a\x75\x52\xbc\xbe\x62\x32\x56\xb9\xe0\x15\x97\xea\xaa\xfa\x7a\x59\xf3\xc9\x6d\x39\x8d\xf3\xd7\x24\xbb\x8f\x22\x2f\xce\x7a\x81\xb6\x36\xfe\xe0\xb2\xce\x54\xdd\xe2\x60\xa4\x23\x81\x3f\x3c\x8b\xf8\x92\x4f\x53\xa5\x31\xbc\x9c\x23\x55\x51\xcb\x6e\xc4\xb5\xec\x76\x43\xb1\x5d\x75\xec\xb6\x7a\xd6\x5a\x00\x7e\xa8\x5e\x87\xea\x75\xa8\x5e\x87\xea\x75\x63\xab\x5e\xb7\x7b\xe5\xad\xad\x5c\xd7\x71\x78\xc5\xc9\xea\xd5\xed\x6e\xfe\xe6\x5a\x75\x7d\xee\x83\x7d\x2a\xd4\xed\xee\x83\xcd\xd5\xe9\x3a\xee\x03\xd4\xa4\x43\x4d\x3a\xd4\xa4\x43\x4d\x3a\xd4\xa4\xeb\xac\x26\x5d\x83\xd5\x7f\xad\x1e\xdd\xd6\x93\x43\x2f\x28\xba\xb2\x59\x6b\x46\x5c\x53\x6f\x77\x77\x6f\xab\xa7\x77\xda\x7e\x47\x15\xbd\x4e\x46\x74\xbd\x82\x5e\xc7\xc3\x7a\xd6\xba\x79\xbb\xbb\x67\x4b\xcd\xbc\xae\x97\xcd\xbe\x56\xca\xdb\xdd\x69\x35\x34\xe3\x60\x7f\x9e\xfd\xeb\x8f\xa6\x08\x6d\xcf\x74\x2f\x90\xb5\x7d\xa2\x9a\x7e\x5b\xe1\x13\x60\x6a\x60\x6a\x0c\x4c\x0d\x4c\x0d\x4c\x0d\x4c\x0d\x4c\x0d\x4c\x0d\x4c\x0d\x4c\x0d\x4c\xad\xba\xdc\xf6\x90\x27\x81\xa9\x81\xa9\x81\xa9\x81\xa9\x81\xa9\x81\xa9\x81\xa9\x0d\x91\xa9\xe1\xa8\x16\xc0\x44\xc0\x44\xc0\xc4\x5e\x8f\x28\x60\x62\xb5\x7b\x00\x13\xc7\x0d\x13\x6b\xaa\x92\x77\xc4\x14\xcb\x20\x31\x76\x12\x28\x99\xb1\x27\x19\x6f\x3c\xe2\xa0\x15\xa0\x78\x53\x18\x40\x64\xe4\x59\xb1\xac\x6d\xa8\xc2\xb2\xbb\xae\x78\x04\x4a\xd7\x6e\x19\x47\x02\x45\x02\x45\x0e\x09\x45\x02\x43\x02\x43\x02\x43\x02\x43\x02\x43\x02\x43\x02\x43\x02\x43\x02\x43\x02\x43\x02\x43\x02\x43\x02\x43\x02\x43\x02\x43\x02\x43\x0e\x0f\x43\xa2\x1c\x06\x18\x2b\x18\xeb\x70\x88\x1c\x18\x2b\x18\x2b\x18\x2b\x18\xeb\x4a\xa7\x9d\x83\xb1\xbe\x9b\x8a\x9c\xbf\xbd\x3b\x08\x96\x9e\xe5\x80\xe3\x95\xd1\x9e\x8b\xbc\x6a\xb8\x98\x81\xdd\x42\x38\xe7\x22\x2f\xf3\x4d\xd3\x01\xf7\x0f\x1f\xbf\xd4\xfd\x16\x67\x3b\xef\x89\x19\x4b\x1d\x49\x69\xaa\x63\x62\x8d\x66\xaa\x94\x7e\xfc\xa6\xfc\x00\xbb\x5f\xb2\xb3\x64\x3f\x1b\xdf\x57\x66\xad\x67\x67\x5c\xed\x08\x52\xd8\xf2\xfa\xe8\xeb\xad\xbf\x3f\x1b\xae\x83\x93\x80\x57\x47\xa7\x37\xef\x70\xf5\x6c\x73\x33\x8a\x9b\x0e\x38\x1f\xff\x9b\xbc\x3b\x74\xa0\xbf\x09\xcc\xab\x8d\x41\xf8\x00\xc2\x07\x10\x3e\x80\xf0\x01\x84\x0f\x20\x7c\x00\xe1\x03\x08\x1f\xd8\xbd\xda\x22\x7c\x00\xe1\x03\x08\x1f\x40\xf8\x00\xc2\x07\x10\x3e\x80\xf0\x81\x8b\x0b\x1f\x00\x68\x06\x68\x06\x68\x1e\xc6\x88\x02\x34\x57\xbb\x07\xa0\x79\x58\xa0\xf9\x88\x83\x81\x8d\xfc\x69\x97\x8e\x99\x6b\xb2\x20\x89\xb4\xb5\x65\x67\xed\xfe\x50\xcc\x5c\x66\x1d\x8b\xfd\xe2\xaf\xbb\x5f\x16\x6d\xa7\x45\xca\x3b\xe1\xbe\xef\xa9\x07\x3e\x53\xc7\xaa\x56\xea\x90\xc3\x05\x0c\x17\x30\x5c\xc0\x70\x01\x8f\xcd\x05\xdc\xac\x82\x7d\xad\x1b\xf8\xc8\xea\xf5\xcd\xd7\xde\x7f\xe9\x8e\xb3\xc6\xef\x0d\x1d\x9d\x1f\xe8\x19\x65\xe6\x41\xa5\x6d\x65\xdc\x3a\x15\x2c\xd5\xbd\xa5\xb4\x9d\xc8\xee\x63\x26\x63\xb3\xb2\x24\x19\x5b\xc6\x7e\x71\x0a\x59\x98\xbd\x7e\x59\xc6\x2c\x94\x99\xde\x1c\x9f\x85\x9f\xf1\x7a\xf9\x24\x57\x85\x7d\xe5\xdd\xdc\xb0\x1d\xcc\x66\xcb\x8c\xde\xb2\x34\x4b\x02\xa1\xc8\xa7\x60\x55\xa6\x9d\x65\x13\xf6\x4f\xba\x23\x8d\x16\xcd\x9d\x1f\xd9\x2d\xbb\x8f\xa2\x1f\xc9\x63\x10\xea\x55\x7a\x19\xeb\x81\xd7\x7a\xcd\x4d\x49\x7b\xb9\xf5\xd2\xf1\x0d\x06\xca\xb4\xe5\x3c\xc3\x74\x32\xbf\x7d\xb3\xae\xd8\xec\xbb\x3f\x59\x8f\xfc\x5e\x36\x40\xa4\x36\xfe\xc9\x2e\x60\x53\x31\x33\x01\x06\xde\xc7\x53\x48\x09\xbb\x7a\xd1\xd4\x59\x0a\xb3\x39\x4c\xb5\xf4\x8e\x6f\x63\x31\xe7\x34\x41\xad\x09\xa1\xad\x1d\xb7\x83\x1a\x7f\xaf\x7f\x35\xac\x92\x94\x8b\x85\x08\x25\xcf\x45\xf4\x5a\x90\xff\x62\xcb\x95\xd1\x8d\x35\x11\xa8\xd3\xd9\x3c\xe3\x01\xbd\x35\x32\x09\xbd\x20\x28\x36\x6d\x0a\xab\x70\xb3\x74\xa9\xf4\x43\x96\x87\x8b\xeb\x5f\xba\x06\xd9\x9b\xcc\xcc\x1a\xe8\x2e\x31\x31\xcf\xb9\x10\x3c\xae\x7d\xc6\x03\x86\x99\x9e\xf9\x81\x1e\xb9\xce\xec\xda\x61\x78\xf5\x65\xfa\xef\x83\x6c\x9a\xf5\xcb\x66\x6c\x73\xb2\xe9\x0f\x80\x03\x80\x03\x80\x03\x80\x03\x80\xd3\x19\xc0\x69\xb8\x17\xac\x41\x9c\xd3\x6d\x8b\xef\x4b\xe7\xcb\xa5\x91\xe0\x4a\xf8\x25\xe8\x21\x4b\x52\x3e\x27\x75\xf4\x90\x44\x32\x78\xad\x84\x0b\xba\x49\x57\x1c\x50\xa7\xa7\xdd\xdb\xc9\xdf\x26\xec\xab\x59\xcf\x8c\x74\x49\x45\xac\x5f\x96\x62\x4f\x15\x2c\xc9\xd2\x47\x1e\xbb\xf0\xc5\x6c\x29\xee\x66\x3c\x72\xb6\xf2\xb7\x2b\xf3\xf1\xb7\x2b\x36\x93\x31\x8f\xe4\x7f\xdc\x46\x32\x15\x8c\x87\xe4\xd5\x4f\xee\x8c\xc7\x33\x2c\xcc\x30\x73\xf9\x6b\x55\xfc\xc8\xd8\xa7\x13\xf6\x41\xd2\xe2\x58\x7a\xf4\x24\x5b\x6f\x5b\xc1\x70\x72\x63\x1e\x93\x8d\x92\xe4\x8f\x87\x0c\xa8\x69\xc1\x7b\xd7\xf6\x8d\x92\xa7\xce\x7f\xda\xae\x61\x46\x4d\xd7\x2f\xec\x63\xf2\xc2\xe6\x3c\x9b\xf2\x79\xc5\x81\xe9\x8d\x1a\x91\xcd\x92\x6c\xa1\xc7\xa4\xb6\xbf\x3e\xaf\xb4\x68\x73\x77\x91\xe8\x75\x8a\x35\x35\x7d\x2b\xb5\x9a\x0c\x64\x58\x98\xc2\xa4\x15\xc8\x39\xe1\xc7\x58\x6f\xd6\x76\x27\x75\x6a\x60\x52\x1a\x4c\xb7\x8f\x78\x88\xe2\x43\x71\xab\x37\x9b\xb0\xfb\x20\x10\x69\x4e\x7b\x53\xd9\xb2\xbb\x36\x6d\xb8\x66\xb7\x76\x02\x56\x27\xa8\xfa\x89\x5d\xff\xcc\x83\xa7\x79\x96\x2c\xe3\x50\x7f\x8b\xc2\x5a\xe9\x4b\x2b\x1d\x67\x24\xa4\xd5\xc7\xd5\x8b\xb8\x16\x4c\xfd\x95\x7e\x62\xd7\xbf\x26\x99\x28\x5d\x96\x05\x5c\x05\x3c\xd4\xad\xb7\xfd\x63\xa2\x9e\xe9\x7a\xca\x98\x9e\x6b\x17\x9c\xf9\x6b\x1c\x32\x21\xd3\xd5\xe9\x7e\x1e\xc5\x39\x62\xda\xda\x6c\x1c\xb6\x11\xd7\x73\x8d\x02\xd8\x6b\x67\xe3\xbb\xce\x5f\x4f\xe7\xdb\x38\x27\x89\x6d\xd6\x59\x5b\x68\xec\xb1\xfa\xa7\x96\xe6\x21\x3d\x73\x4f\x4c\xf7\x35\xe7\xf9\xb2\x29\x9f\x1b\x6d\x2e\x97\xd9\x97\x0b\xcd\x34\xd4\xbc\xae\x81\x26\x8b\x76\xc2\xc2\x91\xbf\x76\x39\xf9\x6b\xcd\x36\xa3\x5d\x39\x6c\xa7\xb3\xda\x10\xca\x80\x50\x06\x84\x32\x20\x94\x01\xa1\x0c\x75\x8b\x2f\x18\xf9\x80\x7a\x04\xd8\x14\xd8\x14\xd8\x14\xd8\x14\xd8\x14\xd8\x74\x5c\xd8\x14\x24\x03\x24\x03\x24\x03\x24\xa3\x73\x92\xb1\x07\xed\xef\x69\x86\x59\xb3\x2e\x5c\xcf\x32\x3b\xd6\xe3\xd6\x2b\x06\xb4\xf1\x07\x38\x47\x10\xe7\x08\xe2\x1c\x41\x9c\xde\x3f\x8c\x43\x15\xec\x5f\x7f\x14\x83\x9c\xa8\x96\xa9\xa2\xb1\xea\x18\x3f\x00\x20\x9a\x9f\x9e\x08\x21\x1e\x96\x4e\xbb\x65\x8a\x9d\x6c\x61\x6d\x25\xe1\x16\x49\x5f\xe5\x69\xd0\xdb\xa4\x2f\xf2\xf4\x7c\xe2\x31\x9f\x8b\xcc\xf8\x2c\xcd\xe2\xaa\x54\x12\x48\x32\xc2\xbd\x77\x90\x93\x93\x37\xc9\x98\x88\x73\xad\x8a\x9d\x57\x62\xc1\x9f\x74\x2f\xe6\x8f\x42\x09\x27\x2d\xcb\xa9\x4d\x2e\x05\x8a\xa4\x35\x79\x02\x93\x8c\xbd\x7d\xf7\x83\xfe\x6e\xc6\x03\x42\x7f\x51\x12\xcf\x8d\x90\x24\x6f\x5d\xa0\x27\xa5\x8c\xcd\x8a\x46\xde\xb0\xe2\xbb\x84\x43\x2c\x98\x64\xd3\x57\x6f\x2b\xcd\x93\x88\xc7\xf3\x49\x92\xcd\xef\xd2\xa7\xf9\xdd\x32\x96\x41\x12\x8a\xbb\xbf\x7c\x54\x0f\xfa\x2a\x07\xbb\xd7\x6d\xe7\xb4\x39\x3c\xbd\x52\x9e\xe3\x11\x84\x4d\xc5\xe0\xbb\x06\x62\xf0\x17\xe3\x3b\xec\x7b\x43\xde\xed\x6c\x88\x09\x76\xee\x7b\x4b\xc6\xaa\xcf\x49\xfe\x0c\x4b\x9f\xbf\x61\x5d\x1c\xbd\x62\xbe\xf4\xbf\x27\x3a\x81\xe5\x10\x71\xb8\xe9\xd4\x95\x1e\x89\xc3\x81\x9c\xb5\x02\xe9\x57\x1e\xe4\xde\x4a\x3f\x64\xb7\x5f\x50\x76\x3b\xd2\xf8\x90\xc6\x87\x34\x3e\xa4\xf1\xc1\x6a\xdd\xf4\x16\xf5\x32\x67\xe6\x3c\x16\x1e\x52\x7e\xdc\x17\xb7\xa6\xfc\x0c\xcc\xb0\xf3\x3e\xf9\xd6\x13\x7d\x32\xc1\xc3\x15\x35\xb6\xbf\xfd\xa5\x2f\x72\x9e\xec\x9e\x92\x8e\x11\x7f\x52\xcc\xde\x54\xff\xc5\x83\x7c\xc2\xd8\x07\xfd\x5f\xf7\xef\x0b\x2e\xc9\x31\xa9\x58\x10\x2d\x55\x2e\xb2\x62\x77\x32\xc1\xbd\x2c\x92\x4f\x82\x5d\xfb\xa7\xbe\xd6\x22\xd4\x09\xa7\x09\x7b\x88\x78\x1c\x0b\xa3\x5e\x49\xda\xf0\xc8\xa8\xa9\xb7\x3f\x1c\xb2\xdc\xd3\x33\x9e\x49\x74\xf8\x4e\xf3\x9a\x7d\xea\xba\x4f\xb7\x94\x7d\x30\x3d\xa6\x37\x9a\x54\xb9\xde\xb1\x61\x6d\x4b\x25\x32\x8a\x47\x2b\xe4\xf7\x6b\xc7\x1d\xa5\x1f\x66\xbc\xd1\x03\xfd\xde\x0d\xe1\x30\xac\xf9\xf1\x86\x9d\x65\x2e\x86\xe6\x2f\x3c\x86\xe7\x13\x6b\xb2\x3e\x98\x46\x4f\xd4\x04\xdc\xf7\x85\xd9\x23\x58\x61\x70\xc1\x0a\x14\x21\x75\x50\xb5\xea\x5b\xfa\xed\x5f\xb7\x2f\xee\x0b\x91\xcd\x45\xa3\x6f\xaa\x3c\xe3\xb9\x98\xcb\xe0\xb6\xf9\x6f\xf4\xdf\xaf\xf6\x9b\xb4\x8d\x34\x91\x6e\x29\xcf\x72\x49\x09\x8c\x26\x9a\xef\x68\x19\x47\xf7\xef\xb5\x17\xbd\xab\x10\x8b\x2d\x56\xd3\x43\x35\xf4\x8e\xc1\xb7\x3e\x72\xdf\xfa\xe5\x84\x55\xac\x24\x0c\xb9\x97\xcb\x24\xb5\xe9\x15\xa9\x38\x28\xe1\xbb\x0d\xab\xd5\xf7\xe4\x59\x34\x99\xec\x3c\xa2\x5f\xc6\x49\x7c\x6b\x7e\x4d\xdf\x20\xe7\xbe\x62\xdf\xfd\x5d\x25\xf1\x83\x39\x2f\xe0\x93\x5e\x17\xed\xdf\x5f\xdd\x6a\x59\xfc\xe3\xf7\x7d\x8a\xf7\x68\x3e\x6f\x7e\x4d\xb2\x80\xe8\xc7\x3c\xa1\xc1\x4f\xd8\xb7\xab\x99\xfe\xb7\x6f\x57\xec\xbe\xd2\x9b\x94\x8e\x60\x50\x05\x99\x53\xf6\x45\xbd\xe5\x01\x0d\x00\x65\x9c\x47\x32\xb0\xce\x57\xb2\xbe\x92\x17\x3b\xb6\x26\x23\x3b\x15\x49\x1a\x89\x09\x33\xf7\xa4\x83\x26\xdc\x9c\xa2\xa4\x80\xda\x81\xf0\xb7\x3f\xa4\x7b\xf5\x8d\x60\x84\x99\x0f\x60\x84\xd5\x5c\xb3\x27\x46\x58\xba\x12\x67\x3f\x2c\x33\x6c\xd9\xba\x77\x2f\x8d\x78\x70\xbc\x32\xb4\xd7\xb9\x48\x6d\x88\xf0\x5b\xe8\xc4\xba\x61\xba\x1c\x9d\xd8\x23\x39\x06\xd5\xe0\x3f\x41\xf8\x2d\xe4\xcf\xba\xfc\x59\x0e\xcd\x07\xfd\x86\x75\x18\xb3\x7a\xa7\x0c\xf3\x2e\x85\xae\x76\x43\x50\xcd\x7d\xdc\x7e\x78\x06\x96\x6a\xe1\x3e\x56\x45\x2c\x26\xc5\x68\x01\x68\x01\x68\x01\x68\x01\x68\xd5\x7d\x71\x08\x40\xab\xbd\x5d\xf5\x50\xb4\x55\xb3\xad\x0e\xd2\x89\x01\xc0\x05\xc7\xc5\xe5\x39\x2e\x00\xb8\xda\x9c\x37\x00\x5c\x70\x55\xc1\x28\x3b\xb7\x51\x06\xc0\x55\x07\xb8\xda\xf4\xbf\x1c\x8a\xba\xc6\xa2\x15\x01\xbc\xa0\x1b\xeb\x86\xe9\x72\x74\x63\x8f\xe4\x19\x54\x84\xff\x04\xc0\x0b\x72\xe8\x72\x80\x17\x1d\xf9\xb9\x91\x6f\x75\x4a\xb4\xec\x41\xf1\x71\x28\x9f\x65\xb8\xe4\x51\xf9\xd0\x59\xee\x4b\x43\x6c\xe8\x91\x49\xe9\xb8\x81\x1f\xfd\x41\x05\xd7\x74\xcd\xeb\xa2\x64\x50\xa5\x06\x8c\x97\x60\x4c\xc6\x2a\x17\xbc\xe2\x89\x5d\x15\x68\x2f\xf5\xae\xbc\x2d\x27\x8d\xfe\x9a\x64\xf7\x51\xe4\xf5\x5b\x2f\x28\xd9\xc6\x1f\x5c\xd6\xa1\xb1\x5b\xfc\x92\x74\xe6\xf1\x87\x67\x11\x5f\xfc\x49\xb1\x34\x90\x17\x76\x5c\x2c\xca\xf6\x8d\xb8\x6c\xdf\x6e\xb4\xb6\xab\x64\xdf\x56\xd7\x5c\x0b\xd8\x10\x85\xfa\x50\xa8\x0f\x85\xfa\x50\xa8\x6f\x6c\x85\xfa\x76\xaf\xbc\xb5\x45\xfa\x3a\x0e\xd2\x38\x59\x69\xbe\xdd\xcd\xdf\x5c\x96\xaf\xcf\x7d\xb0\x4f\x31\xbe\xdd\x7d\xb0\xb9\x10\x5f\xc7\x7d\x80\xf2\x7b\x28\xbf\x87\xf2\x7b\x28\xbf\x87\xf2\x7b\x9d\x95\xdf\x6b\xb0\xfa\xaf\x95\xde\xdb\x7a\xd0\xe9\x05\xc5\x68\x36\x6b\xcd\x88\xcb\x07\xee\xee\xee\x6d\xa5\x03\x4f\xdb\xef\x28\x18\xd8\xc9\x88\xae\x17\x0b\xec\x78\x58\xcf\x5a\x22\x70\x77\xf7\x6c\x29\x0f\xd8\xf5\xb2\xd9\xd7\xa2\x80\xbb\x3b\xad\x86\x6b\x1c\xec\xcf\xb3\x7f\xfd\xb1\x17\x56\xdb\x33\x9b\x0c\xb4\x6d\xef\x60\xa8\xdf\x56\x70\x05\x38\x1b\x38\x1b\x03\x67\x03\x67\x03\x67\x03\x67\x03\x67\x03\x67\x03\x67\x03\x67\x03\x67\x03\x67\x03\x67\x03\x67\x03\x67\x03\x67\x03\x67\x03\x67\x03\x67\xeb\xd4\x61\x8c\x43\x60\x00\x18\x01\x18\x01\x18\x7b\x3d\xa2\x00\x8c\xd5\xee\x01\x60\xbc\x00\xc0\x58\x53\x62\xbd\x23\xce\x58\x86\x8b\xb1\xd3\x41\xc9\x8c\x3d\xc9\x78\xe3\x69\x09\xad\x40\xc6\x9b\xc2\x0a\x22\x4b\xcf\x2a\x66\x6d\x48\x15\xe6\xdd\x75\xc5\x2d\x50\xba\x76\x17\x88\x12\x78\x12\x78\x72\x70\x78\x12\x68\x12\x68\x12\x68\x92\x01\x4d\x02\x4d\x02\x4d\x02\x4d\x02\x4d\x02\x4d\x02\x4d\x02\x4d\x02\x4d\x02\x4d\x02\x4d\x02\x4d\x02\x4d\x0e\x13\x4d\xa2\xf8\x06\xb8\x2b\xb8\xeb\x70\x28\x1d\xb8\x2b\xb8\x2b\xb8\x2b\xb8\xeb\x4a\xa7\x9d\x8d\xbb\xbe\xbb\x3b\x88\x9d\x9e\xe5\xc0\xe4\x95\xd1\x9e\x8b\xbc\x6a\xb8\x98\x81\xdd\x02\x3c\xe7\x22\x5f\xc3\x9d\xef\xee\x1f\x3e\x7e\xa9\xfb\x2d\xce\x8a\xde\x13\x38\x96\x3a\x92\x92\x58\x47\x47\x1d\xdf\x95\x7e\xfc\xa6\xfc\x00\xbb\x5f\xb2\xb3\x24\x48\x1b\xdf\x57\x66\xad\x67\x67\x5c\xed\x88\x59\xd8\xf2\xfa\xe8\xeb\xad\xbf\x3f\x1b\xae\x83\xb3\x83\x57\x47\xa7\x37\xef\x70\xcd\x31\xe9\xef\x36\x1d\x93\x3e\xfe\x37\x79\x77\xfc\x40\xcf\x33\x9b\xdf\x21\x7c\x00\xe1\x03\x08\x1f\x40\xf8\x00\xc2\x07\x10\x3e\xf0\xff\xb1\xf7\x6e\xbd\x6d\x23\xd9\xda\xf0\x7d\x7e\x45\xc1\x7d\xa1\x04\x13\xcb\xaf\x83\x17\x98\x46\xfa\xca\x9d\xc3\x46\x7a\x4f\xde\x08\x9d\xc6\xcc\x8d\x1b\x7b\x97\xc8\x12\xcd\xcf\x54\x15\x41\x52\x4e\x7b\x80\xf9\xef\x1f\x6a\xd5\x81\xa4\x44\x49\x94\x4c\x4a\x94\xf4\x5c\xc5\xb1\xc9\x62\xd5\xaa\xd3\xb3\xd6\xb3\x0e\x70\x1f\x80\xfb\xc0\x2e\xa7\x2d\xdc\x07\xe0\x3e\x00\xf7\x01\xb8\x0f\xc0\x7d\x00\xee\x03\x70\x1f\xb8\x38\xf7\x01\x10\xcd\x20\x9a\x41\x34\x9f\xc6\x8c\x82\x68\xae\x8b\x07\x44\xf3\x69\x11\xcd\x2f\xc8\x1d\x6c\xe0\x4f\xb7\xec\x98\x69\x93\x05\x2a\xd1\xda\x96\x5d\xb5\xbb\x93\x62\xa6\x99\x55\x5a\xec\x83\x6f\x77\xb7\x78\xda\x5e\x2b\x9f\xf7\xc2\xfb\x7e\x24\x09\x7c\x23\xc1\xe6\x9d\xd4\x35\x87\x09\x18\x26\x60\x98\x80\x61\x02\x3e\x37\x13\x70\xbb\x8a\xf8\x8d\x66\xe0\x17\x56\xc3\x6f\x7f\xf6\xfe\x4b\x0b\xce\x2a\xbf\x6f\x29\xbb\x7e\xa0\x57\x94\x59\x07\xb5\xb1\x55\xe9\xd6\xa9\x60\xa9\x96\x56\xae\xf5\x44\x76\x27\x59\x2c\xcd\xc9\xa2\x32\xb6\x90\xfe\x70\x0a\x59\x98\x3d\xff\xbe\x90\x2c\x8c\x33\x7d\x39\x3e\x09\xbf\xe2\xf5\xf1\x49\xa6\x0a\xbb\xe5\xdd\xda\xb0\x02\x66\xb3\x45\x46\xbb\x2c\xcd\x54\x20\x72\xb2\x29\x58\x94\x69\x57\xd9\x98\xfd\x93\xbe\x48\xb3\x45\x6b\xe7\x3d\xbb\x66\x77\x49\xf2\x9e\x2c\x06\xa1\x3e\xa5\x17\x52\x4f\xbc\xc6\x6b\x6e\x49\xda\xe6\x56\xab\xd0\xb7\x98\x28\x33\x96\xe3\x4c\xd3\xc1\xec\xf6\xed\x44\xb1\xde\x76\x7f\x30\x89\xfc\x51\x55\x40\x62\xad\xfc\x93\x5e\xc0\xa6\x62\x66\x1c\x0c\xbc\x8d\xa7\x84\x12\xf6\xf4\xa2\xa5\xb3\x10\xe6\x72\x98\x6a\xe8\x2d\xaf\xa5\x88\x38\x2d\x50\xab\x42\x68\x6d\xc7\xdd\xa0\xc6\xde\xeb\xb7\x86\x45\x92\xf1\x7c\x2e\xc2\x98\x17\x22\x79\x2e\x99\xff\xf2\xca\x8d\x93\xb7\x56\x45\x20\xa1\xb3\x28\xe3\x01\xed\x9a\x58\x85\x1e\x10\x94\x97\x36\xb9\x55\xb8\x55\xba\xc8\x75\x27\xab\xd3\xc5\xf5\x9b\x6e\x40\xf6\x23\x33\x73\x06\xba\x26\xc6\xa6\x9f\x73\xc1\x65\x63\x1f\xf7\x98\x66\xea\xf3\x84\xba\xdc\xa4\x76\x6d\x51\xbc\x86\xb2\xfc\x77\xa1\x6c\xda\xc9\x65\x3d\x6d\x73\xb0\xe5\x0f\x02\x07\x04\x0e\x08\x1c\x10\x38\x20\x70\x7a\x23\x70\x5a\xde\x05\x2b\x24\xce\xe1\xae\xc5\x8f\x95\x74\x73\x69\x22\x78\x2e\xfc\x11\x34\xc9\x54\xca\x23\x42\x47\x13\x95\xc4\xc1\x73\xcd\x5d\xd0\x2d\xba\x32\x5f\x9d\x5e\x76\xb7\xe3\xbf\x8f\xd9\x77\x73\x9e\x19\xe8\x92\x0a\xa9\x37\x4b\x79\xa7\x0a\xa6\xb2\xf4\x81\x4b\xe7\xbe\x98\x2d\xc4\xcd\x8c\x27\x4e\x57\xbe\xbf\x32\x7f\xbe\xbf\x62\xb3\x58\xf2\x24\xfe\xb7\xbb\x48\xa6\x82\xf1\x90\xac\xfa\xea\xc6\x58\x3c\xc3\x52\x0d\x33\xcd\x8f\xf2\xf2\x25\xa3\x9f\x8e\xd9\xa7\x98\x0e\xc7\x4a\xd7\x55\xb6\x3a\xb6\x92\xc3\x29\x8c\x7a\x4c\x3a\x8a\x2a\x1e\xf6\x99\x50\x33\x82\x8f\x6e\xec\x6b\x21\x4f\x93\xfd\xb4\x5b\xc5\x8c\x86\xae\x37\xec\x83\xfa\xc1\x22\x9e\x4d\x79\x54\x33\x60\x7a\xa5\x46\x64\x33\x95\xcd\xf5\x9c\x34\xca\xeb\xdb\xd2\x88\xd6\x8b\x8b\x40\xaf\x43\xac\xa9\x91\x6d\xac\xd1\x64\x10\x87\xa5\x2a\x4c\x58\x81\x8c\x13\x7e\x8e\xf5\x65\x6d\x6f\x52\x87\x06\xc6\x95\xc9\x74\xf7\x88\x27\x51\xbc\x2b\x6e\xfd\x63\x63\x76\x17\x04\x22\x2d\xe8\x6e\xaa\x6a\x76\x23\x33\x86\x11\xbb\xb6\x0b\xb0\xbe\x40\xf3\x5f\xd8\xe8\x57\x1e\x3c\x46\x99\x5a\xc8\x50\x3f\x45\x6e\xad\xf4\xd0\x92\xe0\x0c\x84\xb4\xf8\xb8\xde\x88\x1b\xc1\xd4\xb7\xf4\x0b\x1b\x7d\x56\x99\xa8\x34\xcb\x02\x9e\x07\x3c\xd4\xa3\xb7\xf2\x31\x5e\xcf\xd4\x5e\x6e\x54\xcf\x95\x06\x67\xbe\x8d\x7d\x16\x64\xba\xbc\xdc\x8f\x83\x38\xcf\x98\x6d\x6d\x37\x0f\x9b\x18\xd7\x63\xcd\x02\xb8\xd7\xde\xe6\x77\x95\x7f\x3d\x9c\x6d\xe3\x98\x4c\x6c\x3b\x61\x6d\x60\x63\x5f\x8a\x7f\x1a\xd9\x3c\x84\x67\xee\x48\xd3\x7d\x2f\x78\xb1\x68\xcb\xcf\x9d\x6d\x2c\x97\xb9\x97\x4b\xcc\x74\xaa\x71\x5d\x27\x1a\x2c\xda\x0b\x17\x8e\xf8\xb5\xcb\x89\x5f\x6b\x77\x19\x6d\x8b\x61\x3b\x9c\xd6\x06\x57\x06\xb8\x32\xc0\x95\x01\xae\x0c\x70\x65\x68\x3a\x7c\xc1\x91\x9f\x90\x44\x40\x9b\x82\x36\x05\x6d\x0a\xda\x14\xb4\x29\x68\xd3\xf3\xa2\x4d\xc1\x64\x80\xc9\x00\x93\x01\x26\xa3\x77\x26\x63\x07\xb6\x7f\xa0\x11\x66\xed\x44\xb8\x1a\x65\xf6\x52\x8b\xdb\xa0\x38\xa0\xb5\x2f\x20\x8f\x20\xf2\x08\x22\x8f\x20\xb2\xf7\x9f\x46\x52\x05\xfb\xd3\x9f\xe5\x24\xab\xbc\x63\x56\xd1\x68\x75\x8c\xef\x41\x20\x9a\x57\x0f\x44\x21\xee\x17\x4e\xbb\x61\x89\x1d\xec\x60\xed\x24\xe0\x16\x41\x5f\xd5\x65\x30\xd8\xa0\x2f\xb2\xf4\x7c\xe5\x92\x47\x22\x33\x36\x4b\x73\xb8\xe6\xb9\x0a\x62\x52\xc2\xbd\x75\x90\x93\x91\x57\x65\x4c\xc8\x42\xa3\x62\x67\x95\x98\xf3\x47\x2d\xc5\xe2\x41\xe4\xc2\x41\xcb\x6a\x68\x93\x0b\x81\x22\x68\x4d\x96\x40\x95\xb1\xdb\x77\x3f\xeb\x67\x33\x1e\x10\xf5\x97\x28\x19\x19\x20\x49\xd6\xba\x40\x2f\xca\x58\x9a\x13\x8d\xac\x61\xe5\xb3\x44\x87\x58\x62\x92\x4d\x9f\xbd\xae\x14\xa9\x84\xcb\x68\xac\xb2\xe8\x26\x7d\x8c\x6e\x16\x32\x0e\x54\x28\x6e\x7e\xfa\x92\x4f\x74\x2b\x7b\x9b\xd7\xad\x70\xba\x9c\x9e\x41\x21\xcf\xf3\x01\x84\x6d\xc1\xe0\xbb\x16\x60\xf0\x83\xb1\x1d\x0e\x7d\x20\xef\xb6\x0e\xc4\x38\x3b\x0f\x7d\x24\xe7\x8a\xcf\x09\xfe\x9c\x16\x3e\x7f\xc5\xfa\x48\xbd\x62\x1e\xfa\xcf\x81\x32\xb0\xec\x03\x0e\xd7\x65\x5d\x19\x10\x38\x3c\x91\x5c\x2b\x80\x7e\xd5\x49\x1e\x2c\xf4\x43\x74\xfb\x05\x45\xb7\x23\x8c\x0f\x61\x7c\x08\xe3\x43\x18\x1f\xb4\xd6\x75\xbb\x68\x90\x31\x33\xc7\xd1\xf0\x10\xf2\xe3\x1e\xdc\x18\xf2\x73\x62\x8a\x9d\xb7\xc9\x77\x1e\xe8\x93\x09\x1e\x2e\xa1\xb1\xdd\xf5\x2f\xdd\xc8\x71\xa2\x7b\x2a\x38\x46\xfc\x45\x3e\x7b\x53\xfd\x13\x0f\x8a\x31\x63\x9f\xf4\xbf\xee\xf7\x73\x1e\x93\x61\x32\x67\x41\xb2\xc8\x0b\x91\x95\xb7\x93\x71\xee\x65\x49\xfc\x28\xd8\xc8\xf7\x7a\xa4\x41\xa8\x03\x4e\x63\x36\x49\xb8\x94\xc2\xa0\x57\x82\x36\x3c\x31\x68\xea\xf6\xe7\x7d\x8e\x7b\xea\xe3\x91\x40\x87\x17\x9a\xc7\xec\x53\x27\x3e\x3d\x52\xf6\xc9\x48\x4c\x5f\x34\x69\xee\xa4\x63\xdd\xda\x16\xb9\xc8\xc8\x1f\xad\x84\xdf\xcf\x3d\x0b\x4a\x77\xe6\x7c\xbd\x07\x86\x7d\x1b\xc2\x60\xd8\xf0\xf2\x9a\x9b\x25\x12\xa7\x66\x2f\x7c\x09\x9f\x4f\x5c\x93\xb5\xc1\xb4\xea\x51\x1b\xe2\x7e\x28\x9c\x3d\x9c\x15\x4e\xce\x59\x81\x3c\xa4\xf6\xaa\x56\x7d\x4d\xef\xfe\x6d\xf3\xe1\x3e\x17\x59\x24\x5a\x3d\x99\x17\x19\x2f\x44\x14\x07\xd7\xed\xdf\xd1\x3f\x3f\xdb\x27\xe9\x1a\x69\x03\xdd\x52\x9e\x15\x31\x05\x30\x1a\x6f\xbe\x17\xc3\x38\xfa\xfe\xa0\xad\xe8\x7d\xb9\x58\x6c\xd0\x9a\x26\x75\xd7\x3b\x06\xdb\xfa\x99\xdb\xd6\x2f\xc7\xad\x62\x29\x60\xc8\x6d\x2e\x13\xd4\xa6\x4f\xa4\x32\x51\xc2\xeb\x35\xa7\xd5\x1b\xb2\x2c\x9a\x48\x76\x9e\xd0\x9b\x52\xc9\x6b\xf3\x36\x3d\x41\xc6\xfd\x9c\xbd\xfe\x2d\x57\x72\x62\xf2\x05\x7c\xd5\xe7\xa2\xfd\xf9\xbb\x3b\x2d\xcb\x5f\xbe\x19\x92\xbf\x47\xfb\x75\xf3\x59\x65\x01\xb1\x1f\x91\xa2\xc9\x57\xec\xfe\x6a\xa6\x7f\x77\x7f\xc5\xee\x6a\xd2\xa4\x70\x04\x43\x55\x90\x3a\x65\x37\xea\x35\x0f\x68\x02\x28\xe2\x3c\x89\x03\x6b\x7c\x25\xed\x4b\xfd\xb0\x73\x6b\x22\xb2\x53\xa1\xd2\x44\x8c\x99\xf9\x26\x25\x9a\x70\x6b\x8a\x82\x02\x1a\x27\xc2\x7f\x7e\x1f\xf1\xea\x0f\x41\x09\x33\x7f\x80\x12\xd6\xd0\xe6\x40\x94\xb0\x74\xc9\xcf\xfe\xb4\xd4\xb0\x45\xe7\xd6\xbd\x34\xe1\xc1\xcb\x91\xa1\x6d\xe7\x22\xb1\x21\xdc\x6f\x81\x13\x9b\xa6\xe9\x72\x70\xe2\x80\xe0\x18\x50\x83\xff\x0b\xdc\x6f\x01\x7f\x56\xe1\xcf\xe2\xd4\x6c\xd0\xaf\x58\x8f\x3e\xab\x37\xb9\xe1\xbc\x2b\xae\xab\xfd\x30\xa8\xe6\x3b\xee\x3e\x3c\x02\x97\x6a\xc9\x7d\x9c\x8a\x38\x4c\xca\xd9\x02\xa1\x05\x42\x0b\x84\x16\x08\xad\xa6\x07\x4f\x81\xd0\xea\xee\x56\xdd\x97\xda\x6a\xb8\x56\x4f\xd2\x88\x01\x82\x0b\x86\x8b\xcb\x33\x5c\x80\xe0\xea\x72\xdd\x80\xe0\x82\xa9\x0a\x4a\xd9\xb1\x95\x32\x10\x5c\x4d\x04\x57\x97\xf6\x97\x7d\xa9\xae\x73\xc1\x8a\x20\xbc\x80\x1b\x9b\xa6\xe9\x72\x70\xe3\x80\xe0\x19\x50\x84\xff\x0b\x08\x2f\xc0\xa1\xcb\x21\xbc\x28\xe5\xe7\x5a\x7e\xab\x57\x46\xcb\x26\x8a\x97\x61\xfc\x14\x87\x0b\x9e\x54\x93\xce\x72\x5f\x1a\x62\x8d\x44\xc6\x95\x74\x03\xef\x7d\xa2\x82\x11\xb5\x39\x2a\x4b\x06\xd5\x6a\xc0\x78\x08\xc6\x62\x99\x17\x82\xd7\x2c\xb1\xcb\x00\xed\x47\xb3\x29\x6f\x43\xa6\xd1\xcf\x2a\xbb\x4b\x12\x8f\xdf\x06\xc1\x92\xad\x7d\xe1\xb2\x92\xc6\x6e\xb0\x4b\x52\xce\xe3\x4f\x4f\x42\x5e\x7c\xa6\x58\x9a\xc8\x0b\x4b\x17\x8b\xb2\x7d\x67\x5c\xb6\x6f\x3b\xb5\xb6\xad\x64\xdf\x46\xd3\x5c\x07\xb4\x21\x0a\xf5\xa1\x50\x1f\x0a\xf5\xa1\x50\xdf\xb9\x15\xea\xdb\x7e\xf2\x36\x16\xe9\xeb\xd9\x49\xe3\x60\xa5\xf9\xb6\x0f\x7f\x7d\x59\xbe\x21\xcb\x60\x97\x62\x7c\xdb\x65\xb0\xbe\x10\x5f\xcf\x32\x40\xf9\x3d\x94\xdf\x43\xf9\x3d\x94\xdf\x43\xf9\xbd\xde\xca\xef\xb5\x38\xfd\x57\x4a\xef\x6d\x4c\x74\x7a\x41\x3e\x9a\xed\x46\x73\xc6\xe5\x03\xb7\x8b\x7b\x53\xe9\xc0\xc3\xca\x1d\x05\x03\x7b\x99\xd1\xd5\x62\x81\x3d\x4f\xeb\x51\x4b\x04\x6e\x17\xcf\x86\xf2\x80\x7d\x1f\x9b\x43\x2d\x0a\xb8\x5d\x68\x0d\xbc\xc6\xde\xf6\x3c\xfb\xd3\x9f\x3b\xd1\x6a\x3b\x46\x93\x81\x6d\xdb\xd9\x19\xea\x1f\x4b\x74\x05\x78\x36\xf0\x6c\x0c\x3c\x1b\x78\x36\xf0\x6c\xe0\xd9\xc0\xb3\x81\x67\x03\xcf\x06\x9e\x0d\x3c\x1b\x78\x36\xf0\x6c\xe0\xd9\xc0\xb3\x81\x67\x03\xcf\x06\x9e\x0d\x3c\x5b\xaf\x06\x63\x24\x81\x01\xc1\x08\x82\x11\x04\xe3\xa0\x67\x14\x04\x63\x5d\x3c\x20\x18\x2f\x80\x60\x6c\x28\xb1\xde\x13\xcf\x58\x25\x17\xa5\xc3\x41\x6a\xc6\x1e\x63\xb9\x36\x5b\x42\x27\x24\xe3\xdb\x52\x0b\x22\x4d\xcf\x22\x66\xad\x48\x95\xea\xdd\xa8\x66\x16\xa8\xb4\xdd\x07\x45\x09\x7a\x12\xf4\xe4\xc9\xd1\x93\xa0\x26\x41\x4d\x82\x9a\x64\xa0\x26\x41\x4d\x82\x9a\x04\x35\x09\x6a\x12\xd4\x24\xa8\x49\x50\x93\xa0\x26\x41\x4d\x82\x9a\x04\x35\x09\x6a\xf2\x34\xa9\x49\x14\xdf\x00\xef\x0a\xde\xf5\x74\x58\x3a\xf0\xae\xe0\x5d\xc1\xbb\x82\x77\x5d\x12\xda\x81\x78\xd7\x29\x71\xac\x7b\xb1\xa5\x47\x49\x91\xbc\x34\xbf\x91\x28\x58\x2c\x67\x2a\x9b\xfb\xf5\xcc\x99\x61\x67\xd6\xb3\x9c\x91\x28\x7e\x25\xa2\x73\xf2\xe5\xbf\x96\x1f\x45\x3e\xe8\x1d\x49\x45\x2f\xc4\x13\xa7\x14\xa7\x4b\xdc\xee\xab\xea\x27\x9b\xf6\xcc\xd3\xed\x69\x6f\x9b\x9a\x86\x6f\x4e\xc0\x16\x7b\xe6\x9f\xb7\x77\x93\x2f\xbf\x37\xbd\x80\x9d\xb3\xfb\xce\x71\x82\xa4\x10\xef\x73\xd8\x40\xff\xf3\x74\xbb\xe3\x1e\xfa\xff\xd4\xb4\xdf\xa4\x00\xc6\xde\x9b\x59\x8b\x91\x33\x28\x38\x3f\x9d\xdf\xd4\x74\xc3\xaa\xd7\xef\xda\x65\xff\x9b\x9a\x22\xf9\xf5\xb2\xa8\x07\xb3\xcd\xc6\xb4\x9e\xf4\xae\xfa\x4d\x4d\xcf\x74\x37\x6d\x77\x6b\xe9\x2a\xe0\x7e\xba\xba\x5e\x9c\x3f\x4b\x7d\xbf\x2c\xf9\xae\xdc\xc2\x6d\x05\x6e\x2b\x70\x5b\x81\xdb\x0a\xdc\x56\xe0\xb6\x02\xb7\x15\xb8\xad\xec\x72\xda\xc2\x6d\x05\x6e\x2b\x70\x5b\x81\xdb\x0a\xdc\x56\xe0\xb6\x02\xb7\x95\x8b\x73\x5b\x81\x83\x03\x1c\x1c\xe0\xe0\x70\x1a\x33\x0a\x07\x87\xba\x78\xe0\xe0\x30\x74\x07\x87\xa7\xdb\x75\x71\xe4\xcb\xfc\x93\xc1\x37\xdd\x52\x50\xa6\x4d\x16\xa8\x44\xab\x53\x76\x59\x6e\x66\x9e\xcc\x2b\x96\x7b\xfa\xe0\x5f\x2c\x23\xb1\x97\x5e\xef\xb7\x3e\x7e\x2f\xfc\xe7\x47\x1a\xe2\x37\x92\x52\xde\x49\xf5\x7b\x18\x6c\x61\xb0\x85\xc1\x16\x06\xdb\x73\x33\xd8\x6e\xb8\x4e\xb7\x19\x6d\x37\x43\xb3\xcd\xd7\xea\x4e\x67\xef\xbf\xb4\xe0\xac\xaa\xfa\x96\x6a\x30\x04\x7a\x45\x99\x75\x50\x1b\x5b\x95\x1c\x9d\x0a\x96\x6a\x69\xe5\x5a\xab\x63\x77\x92\xc5\xd2\x9c\x2c\x2a\x63\x0b\xe9\x0f\xa7\x90\x85\xd9\xf3\xef\x0b\xc9\xc2\x38\xd3\x17\xe1\x93\xf0\x2b\x5e\x1f\x9f\x64\x58\xb0\x5b\xde\xad\x0d\x2b\x60\x36\x5b\x64\xb4\xcb\xd2\x4c\x05\x22\x27\x0b\x80\xc5\x84\x76\x95\x8d\xd9\x3f\xe9\x8b\x34\x5b\xb4\x76\xde\xb3\x6b\x76\x97\x24\xef\x49\xbf\x0f\xf5\x29\xbd\x90\x7a\xe2\x35\xba\x72\x4b\xd2\x36\x27\xc2\x3d\x26\xca\x8c\xe5\x38\xd3\x74\x30\x2b\x7b\x3b\x51\xac\xb7\xb4\x1f\x4c\x22\x7f\x54\xd5\x85\x58\xab\xea\x84\xe2\xd9\x54\xcc\x8c\x3b\x80\xb7\xc8\x94\x50\xc2\x9e\x5e\xb4\x74\x16\xc2\x5c\x0e\x53\x0d\x94\xe5\xb5\x14\x11\xa7\x05\x6a\x01\xbf\xd6\x4d\xdc\x0d\x6a\xac\xb3\x7e\x6b\x58\x58\x18\xcf\xe7\x22\x8c\x79\x21\x92\xe7\x92\xa7\x2f\xaf\xdc\x38\x79\x6b\x01\x3d\x09\x9d\x45\x19\x0f\x68\xd7\xc4\x2a\xf4\x80\xa0\xbc\xb4\xc9\x09\xc2\xad\xd2\x45\xae\x3b\x59\x9d\x2e\xae\xdf\x74\x03\xb2\x1f\x99\x99\x33\xd0\x35\x31\x36\xfd\x9c\x0b\x2e\x1b\xfb\xb8\xc7\x34\x53\x9f\x27\xd4\xe5\x26\x25\x69\x8b\x9a\x34\x94\xe5\xbf\x0b\xc1\xd2\x4e\x2e\xeb\x49\x96\x83\x2d\x7f\xd0\x2d\xa0\x5b\x40\xb7\x80\x6e\x01\xdd\xd2\x1b\xdd\xd2\xf2\x2e\x58\xa1\x5c\x0e\x77\x2d\x7e\xac\x24\x25\x4c\x13\xc1\x73\xe1\x8f\xa0\x49\xa6\x52\x1e\x11\x3a\x9a\xa8\x24\x0e\x9e\x6b\xce\x7d\x6e\xd1\x95\x59\x0d\xf5\xb2\xbb\x1d\xff\x7d\xcc\xbe\x9b\xf3\xcc\x40\x97\x54\x48\xbd\x59\xca\x3b\x55\x30\x95\xa5\x0f\x5c\x3a\x67\xc3\x6c\x21\x6e\x66\x3c\x71\xba\xf2\xfd\x95\xf9\xf3\xfd\x15\x9b\xc5\x92\x27\xf1\xbf\xdd\x45\x32\x15\x8c\x87\x64\x83\x57\x37\xc6\x3e\x19\x96\x6a\x98\x69\x7e\x94\x97\x2f\x19\xfd\x74\xcc\x3e\xc5\x74\x38\x56\xba\xae\xb2\xd5\xb1\x95\x8c\x4b\x61\xd4\x63\xd2\x51\x54\xf1\xb0\xcf\x84\x9a\x11\x7c\x74\x63\x5f\x0b\x79\x9a\xac\x9d\xdd\x2a\x66\x34\x74\xbd\x61\x1f\xd4\x0f\x16\xf1\x6c\xca\xa3\x9a\x35\xd2\x2b\x35\x22\x9b\xa9\x6c\xae\xe7\xa4\x51\x5e\xdf\x96\x46\xb4\x5e\x5c\x04\x7a\x1d\x62\x4d\x8d\x6c\x63\x8d\x26\x83\x38\x2c\x55\x61\xc2\x0a\x64\x9c\xf0\x73\x9c\x53\x40\x17\xfd\xd5\xa1\x81\x71\x65\x32\xdd\x3d\xe2\x29\x0f\xef\x38\x5b\xff\xd8\x98\xdd\x05\x81\x48\x0b\xba\x9b\xaa\x9a\xdd\xc8\x8c\x61\xc4\xae\xed\x02\xac\x2f\xd0\xfc\x17\x36\xfa\x95\x07\x8f\x51\xa6\x16\x32\xd4\x4f\x91\x13\x2a\x3d\xb4\x24\x38\x03\x21\x2d\x3e\xae\x37\xe2\x46\x30\xf5\x2d\xfd\xc2\x46\x9f\x55\x26\x2a\xcd\xb2\x80\xe7\x01\x0f\xf5\xe8\xad\x7c\x8c\x8f\x32\xb5\x97\x1b\xd5\x73\xa5\xc1\x99\x6f\x63\x9f\x05\x99\x2e\x2f\xf7\xe3\x20\xce\x33\xe6\x46\xdb\xcd\xc3\x26\x7e\xf4\x58\xb3\x00\xa6\xb4\xb7\xf9\x5d\x65\x4b\x0f\x67\xdb\x38\x26\x6f\xda\x4e\x58\x1b\xb8\xd3\x97\xe2\x9f\x46\x6a\x0e\x61\x8a\x3b\xd2\x74\xdf\x0b\x5e\x2c\xda\xf2\x73\xe7\x15\x4f\x65\x2e\xe3\x12\x28\x0d\x36\xb6\x6a\xa8\x41\x93\x2f\xa6\xab\x11\x10\x76\x39\x01\x61\xed\xee\x8b\x6d\x41\x61\x87\x53\xac\xe0\x6d\x00\x6f\x03\x78\x1b\xc0\xdb\x00\xde\x06\x4d\x87\x2f\x68\xec\x13\x92\x08\x98\x4d\x30\x9b\x60\x36\xc1\x6c\x82\xd9\x04\xb3\x79\x5e\xcc\x26\xc8\x06\x90\x0d\x20\x1b\x40\x36\xf4\x4e\x36\xec\x40\xc8\x0f\x34\x64\xab\x9d\x08\x57\xc3\xb6\x5e\x6a\x71\x1b\x14\x4d\xb3\xf6\x05\xe4\xd3\x63\x4d\x73\x76\xd6\xfc\xcf\xb9\xe5\xd3\x43\xf5\x84\x81\x27\x17\xb0\x3f\xfd\x59\x4e\xb2\xca\x3b\x66\xf6\x8c\x32\xc6\xf8\x16\x12\xcf\x3c\xd6\x15\x8d\xb7\x5f\xd4\xe9\x86\xf5\xd2\xdd\xe1\xd6\x49\xe0\x29\x82\x9f\xaa\xf3\x3c\xd8\xe0\x27\x32\xa7\x7c\xe5\x92\x47\x22\x33\x86\x41\x73\x14\xe6\xb9\x0a\x62\xd2\x74\xbd\x09\x8e\x93\x25\x55\x65\x4c\xc8\x42\x43\x4f\xa7\xfa\xcf\xf9\xa3\x96\x62\xf1\x20\x72\xe1\xf0\x5b\x35\xc4\xc7\x85\x02\x11\x7e\x25\x73\x9b\xca\xd8\xed\xbb\x9f\xf5\xb3\x19\x0f\x88\x5f\x4b\x94\x8c\x0c\x5a\x23\x93\x58\xa0\x64\xc1\x63\x69\xce\x1f\x32\x39\x95\xcf\x12\xe7\x60\xd9\x3f\x36\x7d\xf6\x0a\x49\xa4\x12\x2e\xa3\xb1\xca\xa2\x9b\xf4\x31\xba\x59\xc8\x38\x50\xa1\xb8\xf9\xe9\x4b\x3e\xd1\xad\xec\x6d\xc3\xb6\xc2\xe9\x72\x7a\x06\x05\xef\x4e\x08\x75\xb5\x45\x5c\xef\x5a\x20\xae\x0f\xc6\x02\x77\xf4\x9e\xbe\xdb\xda\x53\xe3\xb6\x7b\xf4\xae\x9e\x15\x8c\x25\x10\x31\x30\x18\xfb\x8a\xed\x95\xa9\xc3\xfc\xe2\x3f\x07\x4a\xd8\xb1\x0d\x24\xd5\x92\x74\x20\x35\x47\xed\xeb\x40\x48\xa7\x88\x90\x10\x0c\x7d\x41\xc1\xd0\x88\xfa\x42\xd4\x17\xa2\xbe\x10\xf5\x05\xe5\x6e\xdd\x2e\x1a\x64\x88\xc5\x71\xd4\x28\x44\x88\xac\x8f\x10\x19\x9a\x72\xe5\xcd\xc7\x9d\xc7\x85\x64\x82\x87\x4b\x18\x6b\xb3\x8a\xa4\x5f\xe8\x29\x18\xa4\x02\x35\xc4\x5f\xe4\xe2\x35\xd5\x3f\xf1\xa0\x18\x33\xf6\x49\xff\xeb\x7e\x3f\xe7\x31\x99\xd8\x72\x16\x24\x8b\xbc\x10\x59\x79\x81\x18\x5f\x50\x96\xc4\x8f\x82\x8d\x7c\x0f\x47\x1a\x27\x3a\x6c\x33\x66\x93\x84\x4b\x29\x0c\xc0\x24\xf4\xc1\x13\x03\x78\x6e\x7f\xde\xe7\x44\xa6\x3e\x1e\x09\x17\x78\xa1\x79\x58\x3d\x75\xe2\xd3\x23\x65\x9f\x8c\xc4\xf4\x5d\x90\xe6\x4e\x3a\xd6\x0b\x6a\x91\x8b\x8c\xdc\x97\x4a\x84\xfc\xdc\xb3\xa0\x74\x67\xce\x97\x6c\x1e\xf6\x85\x05\xc3\x59\x24\x06\x67\x37\x7b\x09\xfd\x4b\x64\x87\xb5\x6e\xac\x7c\xb8\x0d\xa7\x3b\x14\x3a\x17\x3c\xf6\xc9\xf1\xd8\xb4\x05\xf6\xaa\x8f\x7b\x4d\xef\xfe\x6d\xf3\xf9\x3b\x17\x59\x24\x5a\x3d\x99\x17\x19\x2f\x44\x14\x07\xd7\xed\xdf\xd1\x3f\x3f\xdb\x27\xe9\xa4\x6f\x03\x95\x52\x9e\x15\x31\x85\xa4\x19\xff\xac\x9d\x60\x13\x7d\xeb\x3c\xd9\xf7\x0d\x8a\xc4\xa4\xee\x19\xc5\x60\x6e\x3e\x73\x73\xf3\xe5\x10\xf2\x4b\xf1\x1c\x6e\x73\x99\x98\x23\x7d\xbc\x94\x71\xec\xaf\xd7\x1c\x3d\x6f\xc8\xd8\x66\x02\x8d\x79\x42\x6f\x4a\x25\xaf\xcd\xdb\xf4\x04\xd9\xbb\x73\xf6\xfa\xb7\x5c\xc9\x89\x09\xe7\xfe\xaa\x0f\x39\xfb\xf3\x77\x77\xf4\x95\xbf\x7c\x33\x24\x4f\x81\xf6\xeb\xe6\xb3\xca\x02\x22\x04\x22\x45\x93\xaf\xd8\xfd\xd5\x4c\xff\xee\xfe\x8a\xdd\xd5\xa4\x49\xde\xe2\xc6\x7a\x4f\xea\x8b\xdd\xa8\xd7\x3c\xa0\x09\xa0\x80\xe0\x24\x0e\xac\x3d\x92\xb4\x1d\xf5\xc3\xce\xad\x09\x98\x4d\x85\x4a\x13\x31\x66\xe6\x9b\x94\x07\xc0\xad\x29\xf2\xd9\x6e\x9c\x08\xff\xf9\x7d\xc4\xab\x3f\x04\xa5\xc7\xfc\x01\x4a\xcf\xa1\x95\x9e\x74\x49\x5b\x19\x98\xda\xb3\xe8\xdc\xa2\x95\x26\x3c\xd8\x0d\x9d\xd9\x77\xce\x13\x9f\xc1\x3b\x12\x60\xec\xcc\xc1\xd8\x80\x30\x0f\xae\x66\xff\x97\x0b\xf7\x8e\x3c\x2f\x10\xb1\x18\x9c\xe5\xf4\x15\x7b\x89\xc7\xe1\x4d\x6e\x48\xce\x8a\xe3\x61\x3f\xe4\x9a\xf9\x8e\xbb\x88\x5e\x4a\xb3\x59\x6a\x16\x67\x0b\x76\xac\xfb\x2b\xb8\x0e\x70\x1d\x6b\xc6\x0c\xae\x03\x5c\x47\x37\x5c\xc7\x7e\xb7\xd8\x5a\xd6\xa3\xe1\x1a\x3b\x49\xdd\x1a\xdc\x07\xd4\xed\xcb\x53\xb7\xc1\x7d\x74\xb9\x6e\xc0\x7d\xc0\xc0\x02\x25\x08\xdc\x47\x87\xdc\xc7\xbe\x36\x87\xb5\x2c\xc8\xb9\xe0\x35\x70\x21\x00\x67\x67\x0e\xce\x06\x84\x81\x70\x55\xfb\xbf\x80\x0b\x39\x23\x50\x71\x5a\x5c\x08\xa5\xa7\x23\xea\xa3\x57\xb2\xc3\x26\x30\x96\x61\xfc\x14\x87\x0b\x9e\x54\x93\x21\x72\x9f\xb2\xfc\x37\x35\x1d\x57\xc2\x8c\xdf\xfb\x00\xe5\x11\xbd\x3f\x2a\xcb\x56\xd4\xea\x10\x78\xa4\xc2\x62\x99\x17\x82\xd7\x0c\x84\xcb\x38\xe6\x47\xc5\xea\x64\xb3\xdd\x7d\x56\xd9\x5d\x92\x78\x48\x33\x08\x02\x65\xed\x0b\x97\x95\x99\x70\x83\x09\x8d\x12\x6b\x7e\x7a\x12\xf2\x32\xb3\x15\xd2\xec\x9d\x5b\xca\x42\x54\x7c\x3a\xe3\x8a\x4f\xdb\x89\x9a\x6d\xd5\x9e\x36\xda\x86\x3a\x20\xa1\x50\xe3\x09\x35\x9e\x50\xe3\x09\x35\x9e\xce\xad\xc6\xd3\xf6\x93\xb7\xb1\xbe\x53\xcf\x94\xff\xc1\xaa\x3a\x6d\x1f\xfe\xfa\x8a\x4e\x43\x96\xc1\x2e\x75\x9c\xb6\xcb\x60\x7d\x0d\xa7\x9e\x65\x80\xca\x4d\xa8\xdc\x84\xca\x4d\xa8\xdc\x84\xca\x4d\xbd\x55\x6e\x6a\x71\xfa\xaf\x54\x6d\xda\x98\x97\xf0\x82\x3c\xfe\xda\x8d\xe6\x8c\x2b\x4f\x6d\x17\xf7\xa6\xaa\x53\x87\x95\x3b\x6a\x4d\xf5\x32\xa3\xab\x75\xa6\x7a\x9e\xd6\xa3\x56\x97\xda\x2e\x9e\x0d\x95\xa5\xfa\x3e\x36\x87\x5a\x4f\x6a\xbb\xd0\x1a\xd8\x8a\xbd\xed\x79\xf6\xa7\x3f\xb7\x53\x5b\x1b\x82\x7d\x2e\x90\xf1\xaa\xf9\xed\xfc\x63\x89\x3d\x00\xd7\x05\xae\x8b\x81\xeb\xaa\xfc\x01\x5c\x17\xb8\x2e\x70\x5d\xe0\xba\xc0\x75\x81\xeb\x02\xd7\x05\xae\x0b\x5c\x17\xb8\x2e\x70\x5d\xe0\xba\xc0\x75\x81\xeb\x02\xd7\x05\xae\x0b\x69\x3d\x40\xf2\x81\xe4\x03\xc9\x07\x92\x0f\x24\x5f\x97\x92\x01\xc9\xd7\x19\xc9\xd7\x50\x43\xb8\x27\xae\xaf\x4a\xf0\x49\x07\x74\xd4\x8c\x3d\xc6\x32\xec\x8c\xe8\x7b\x5b\xaa\x34\xa4\xb6\x59\xf8\xab\xb5\xa2\x52\x57\x1b\xd5\x74\xfc\x4a\xdb\x7b\xd1\x84\xa0\x08\x41\x11\x9e\x06\x45\x08\x7a\x10\xf4\x20\xe8\x41\xd0\x83\xa0\x07\x41\x0f\x82\x1e\x04\x3d\x08\x7a\x10\xf4\x20\xe8\x41\xd0\x83\xa0\x07\x41\x0f\x82\x1e\x04\x3d\xd8\xf2\xf4\x3f\x38\x3d\x88\xf2\x05\xe0\x39\xc1\x73\x0e\x93\x15\x03\xcf\x09\x9e\x13\x3c\x27\x78\xce\x25\xa1\x1d\x98\xe7\x9c\x8a\x82\xdf\xde\xec\x45\x62\x1e\x25\x75\xee\xd2\x3c\x47\xa2\xa8\xab\x27\x66\x4a\x37\xb0\x91\x91\x28\x2c\x17\x49\x43\xbf\x9b\x7c\xf9\xbd\xe9\x2d\xe4\x0b\xde\x91\x26\xac\x08\x92\xc2\x3f\xcf\x84\x2b\xa4\x45\x52\x79\xed\x55\xf5\xd3\x9b\xb6\x54\x90\x29\xd9\x7b\x2c\xb0\xb1\x5f\x65\x56\x03\x76\x0a\x92\x73\x0d\xf8\x90\x29\xb9\x39\xf7\xbe\x7e\xbf\xba\x1b\xec\x1b\xc8\x5b\xbb\x2c\xf7\xc1\xec\x40\x9f\x07\x9b\xe6\x6b\x6c\x27\xec\x9c\x77\xdc\x76\x8a\xfe\x00\x01\xbc\xab\x5b\x69\x99\xa5\x5f\xea\x36\xa8\x7a\x50\xf5\xa0\xea\x41\xd5\x83\xaa\x07\x55\x0f\xaa\x1e\x54\xfd\xf6\xd3\x16\x54\x3d\xa8\x7a\x50\xf5\xa0\xea\x41\xd5\x83\xaa\x07\x55\x7f\x71\x54\x3d\x88\x5e\x10\xbd\x20\x7a\x4f\x63\x46\x41\xf4\xd6\xc5\x03\xa2\xf7\x54\x88\xde\x35\xf1\xac\x4d\x64\x95\x01\x3a\xdd\xf2\x55\xa6\x4d\x16\xa8\x44\xeb\x55\x76\x7d\x6e\xa7\xa9\xcc\x6b\x35\xa2\xca\xb7\x50\x46\x94\x36\xb4\xd3\x6f\xb9\xe8\x5e\x78\xd4\x8f\x34\xd6\x6f\x24\xb2\xbc\x93\x5a\xd1\x30\xe3\xc2\x8c\x0b\x33\x2e\xcc\xb8\xe7\x66\xc6\x6d\x57\x65\xbc\xd1\x94\x7b\xb0\x02\xf0\xa8\xd3\xdf\x7a\xa2\x8e\x59\xa7\xff\x60\xb6\xf7\x1d\x2a\xe3\x37\xda\x9e\x0f\x26\x91\x3f\xaa\x4a\x44\xac\x15\x78\xc2\xf6\x6c\x2a\x66\xc6\x49\xc0\xdb\x69\x4a\x28\x61\x4f\x2f\x5a\x3a\x0b\x61\x2e\x87\xa9\x86\xcf\xf2\x5a\x8a\x88\xd3\x02\xb5\x6a\x80\xd6\x58\xdc\x0d\x6a\x6c\xb6\x7e\x6b\x58\x8c\x18\xcf\xe7\x22\x8c\x79\x21\x92\xe7\x92\xbd\x2f\xaf\xdc\x38\x79\x6b\x61\x3e\x09\x9d\x45\x19\x0f\x68\xd7\xc4\x2a\xf4\x80\xa0\xbc\xb4\xc9\x35\xc2\xad\xd2\x45\xae\x3b\x59\x9d\x2e\xae\xdf\x74\x03\xb2\x1f\x99\x99\x33\xd0\x35\x31\x36\xfd\x9c\x0b\x2e\x1b\xfb\xb8\xc7\x34\x53\x9f\x27\xd4\xe5\x26\xd5\x69\x8b\xf2\x34\x94\xe5\xbf\x0b\xed\xd2\x4e\x2e\xeb\xa9\x97\x83\x2d\x7f\x90\x30\x20\x61\x40\xc2\x80\x84\x01\x09\xd3\x1b\x09\xd3\xf2\x2e\x58\x21\x62\x0e\x77\x2d\x7e\xac\x64\x55\x4b\x13\xc1\x73\xe1\x8f\xa0\x49\xa6\x52\x1e\x11\x3a\x9a\xa8\x24\x0e\x9e\x6b\x2e\x7f\x6e\xd1\x95\x69\xd9\xf4\xb2\xbb\x1d\xff\x7d\xcc\xbe\x9b\xf3\xcc\x40\x97\x54\x48\xbd\x59\xca\x3b\x55\x30\x95\xa5\x0f\x5c\x3a\x17\xc4\x6c\x21\x6e\x66\x3c\x71\xba\xf2\xfd\x95\xf9\xf3\xfd\x15\x9b\xc5\x92\x27\xf1\xbf\xdd\x45\x32\x15\x8c\x87\x64\x99\x57\x37\xc6\x6a\x19\x96\x6a\x98\x69\x7e\x94\x97\x2f\x19\xfd\x74\xcc\x3e\xc5\x74\x38\x56\xba\xae\xb2\xd5\xb1\x95\x3c\x4c\x61\xd4\x63\xd2\x51\x54\xf1\xb0\xcf\x84\x9a\x11\x7c\x74\x63\x5f\x0b\x79\x9a\x6c\xa0\xdd\x2a\x66\x34\x74\xbd\x61\x1f\xd4\x0f\x16\xf1\x6c\xca\xa3\x9a\x69\xd2\x2b\x35\x22\x9b\xa9\x6c\xae\xe7\xa4\x51\x5e\xdf\x96\x46\xb4\x5e\x5c\x04\x7a\x1d\x62\x4d\x8d\x6c\x63\x8d\x26\x83\x38\x2c\x55\x61\xc2\x0a\x64\x9c\xf0\x73\xac\x2f\x6b\x7b\x93\x3a\x34\x30\xae\x4c\xa6\xbb\x47\x3c\x11\xe2\xdd\x69\xeb\x1f\x1b\xb3\xbb\x20\x10\x69\x41\x77\x53\x55\xb3\x1b\x99\x31\x8c\xd8\xb5\x5d\x80\xf5\x05\x9a\xff\xc2\x46\xbf\xf2\xe0\x31\xca\xd4\x42\x86\xfa\x29\x72\x4d\xa5\x87\x96\x04\x67\x20\xa4\xc5\xc7\xf5\x46\xdc\x08\xa6\xbe\xa5\x5f\xd8\xe8\xb3\xca\x44\xa5\x59\x16\xf0\x3c\xe0\xa1\x1e\xbd\x95\x8f\xf1\x5c\xa6\xf6\x72\xa3\x7a\xae\x34\x38\xf3\x6d\xec\xb3\x20\xd3\xe5\xe5\x7e\x1c\xc4\x79\xc6\x8c\x69\xbb\x79\xd8\xc4\x9a\x1e\x6b\x16\xc0\x9f\xf6\x36\xbf\xab\x1c\xea\xe1\x6c\x1b\xc7\x64\x53\xdb\x09\x6b\x03\xa3\xfa\x52\xfc\xd3\xc8\xd3\x21\xdc\x71\x47\x9a\xee\x7b\xc1\x8b\x45\x5b\x7e\xee\x0c\x63\xae\xcc\x8d\x5c\xa2\xa5\xe1\xc7\x5f\x0d\x3e\xf8\xb2\x13\x26\x1b\x11\x64\x97\x13\x41\xd6\xee\x2a\xd9\x16\x45\x76\x38\x9d\x0b\x8e\x08\x70\x44\x80\x23\x02\x1c\x11\xe0\x88\xd0\x74\xf8\x82\xe1\x3e\x21\x89\x80\xf4\x04\xe9\x09\xd2\x13\xa4\x27\x48\x4f\x90\x9e\xe7\x45\x7a\x82\x87\x00\x0f\x01\x1e\x02\x3c\x44\xef\x3c\xc4\x0e\x5c\xfd\x40\x63\xbc\xda\x89\x70\x35\xce\xeb\xa5\x16\xb7\x41\x31\x38\x6b\x5f\x40\x5e\x3e\xe4\xe5\x3b\xd3\xbc\x7c\xc8\x46\x3f\xf0\x24\x05\xf6\xa7\x3f\xcb\x49\x56\x79\xc7\xec\x9f\xd1\xd1\x18\x6f\x41\xf4\x99\x47\x3b\xa7\xfa\xf6\x0b\x5a\xdd\xb0\x78\x7a\x38\x00\x3b\x09\x60\x45\x10\x55\x75\xc2\x07\x1b\x44\x45\xb6\x97\xaf\x5c\xf2\x48\x64\xc6\x8a\x68\x0e\xc8\x3c\x57\x41\x4c\x6a\xb1\xb7\xd7\x71\x32\xbb\xaa\x8c\x09\x59\x68\x9c\xea\xec\x04\x73\xfe\xa8\xa5\x58\x3c\x88\x5c\x38\xb0\x57\x0d\x15\x72\x21\x45\x04\x76\xc9\x36\xa7\x32\x76\xfb\xee\x67\xfd\x6c\xc6\x03\x22\xe3\x12\x25\x23\x03\xed\xc8\x7e\x16\x28\x59\xf0\x58\x9a\x53\x89\xec\x53\xe5\xb3\x44\x50\x58\xaa\x90\x4d\x9f\xbd\xf6\x12\xa9\x84\xcb\x68\xac\xb2\xe8\x26\x7d\x8c\x6e\x16\x32\x0e\x54\x28\x6e\x7e\xfa\x92\x4f\x74\x2b\x7b\x1b\xbc\xad\x70\xba\x9c\x9e\x41\x61\xc1\x53\x84\x68\x6d\xe1\xd9\xbb\x16\xf0\xec\x83\xb1\xdb\x0d\xa7\xcb\xef\xb6\x76\xd9\x38\x04\x0f\xa7\xcf\xe7\x87\x82\x09\x7a\x0c\x15\x05\xbf\x62\x2f\x4b\x18\xd2\x50\x04\xbf\xc7\xbc\x21\x6d\xc0\xd6\x6a\xae\x10\x64\x08\x01\xc0\x3a\x0b\x80\x85\x98\xec\x0b\x8a\xc9\x46\xf0\x19\x82\xcf\x10\x7c\x86\xe0\x33\xe8\x86\xeb\x76\xd1\x20\x23\x3d\x8e\xa3\x73\x21\x50\x65\x4b\xa0\xca\x60\x15\x30\x6f\xa1\xee\x3c\x3c\x25\x13\x3c\x5c\x42\x5c\xdb\xb5\x27\xfd\x52\xdf\x31\x29\x15\x14\x22\xfe\x22\x4f\xb3\xa9\xfe\x89\x07\xc5\x98\xb1\x4f\xfa\x5f\xf7\xfb\x39\x8f\xc9\x78\x97\xb3\x20\x59\xe4\x85\xc8\xca\xbb\xc5\xb8\xa4\xb2\x24\x7e\x14\x6c\xe4\x7b\x39\xd2\x10\xd2\xc1\x9e\x31\x9b\x24\x5c\x4a\x61\xb0\x27\x01\x13\x9e\x18\x2c\x74\xfb\xf3\x3e\x87\x35\xf5\xf1\x48\x90\xc1\x0b\xcd\x23\xee\xa9\x13\x9f\x1e\x29\xfb\x64\x24\xa6\xaf\x89\x34\x77\xd2\xb1\xce\x58\x8b\x5c\x64\xe4\x45\x55\x82\xe7\xe7\x9e\x05\xa5\x3b\x73\xbe\x9c\xf7\xb0\xef\x32\x18\xe0\xea\x37\x40\x24\x86\x6b\x7f\x7b\x09\x0b\x5d\x2d\xee\xde\xd8\x03\x14\x78\x6f\x1e\x33\x28\xf5\x4e\x28\x75\xda\x0f\x7b\x55\x0a\xbe\xa6\x77\xff\xb6\xf9\x68\x9e\x8b\x2c\x12\xad\x9e\xcc\x8b\x8c\x17\x22\x8a\x83\xeb\xf6\xef\xe8\x9f\x9f\xed\x93\x74\x09\xb4\x81\x54\x29\xcf\x8a\x98\x82\xe6\x8c\x07\xd9\xce\xf0\x8a\xbe\x37\x10\xdb\x74\x5f\x8e\x00\x1b\x74\x91\x49\xdd\x91\x8b\xc1\x62\x7d\xe6\x16\xeb\xcb\x71\x09\x58\x0a\x3f\x71\x9b\xcb\x84\x48\xe9\xb3\xa6\x0c\xbb\x7f\xbd\xe6\x1c\x7a\x43\xf6\x3a\x13\x17\xcd\x13\x7a\x53\x2a\x79\x6d\xde\xa6\x27\xc8\x64\x9e\xb3\xd7\xbf\xe5\x4a\x4e\x4c\xf4\xf9\x57\x7d\xe2\xd9\x9f\xbf\xbb\x73\xb0\xfc\xe5\x9b\x21\xf9\x2a\xb4\x5f\x37\x9f\x55\x16\x10\xa7\x10\x29\x9a\x7c\xc5\xee\xaf\x66\xfa\x77\xf7\x57\xec\xae\x26\x4d\x72\x6e\x37\x04\x00\xa9\x39\x76\xa3\x5e\xf3\x80\x26\x80\xe2\x97\x93\x38\xb0\x26\x4d\xd2\x8a\xd4\x0f\x3b\xb7\x26\xbe\x37\x15\x2a\x4d\xc4\x98\x99\x6f\x52\xda\x02\xb7\xa6\xc8\xc5\xbc\x71\x22\xfc\xe7\xf7\x11\xaf\xfe\x10\x94\x23\xf3\x07\x28\x47\x47\xf6\x4e\x58\xd2\x6a\x86\xaa\x1e\x2d\x3a\xb7\x8e\xa5\x09\x0f\x76\x47\x70\xf6\xbd\x33\xc7\x70\x70\xe6\x04\x72\xbb\x14\xe4\x36\x20\x80\x84\x7b\xdc\xff\x05\xce\x9c\xe7\x0f\x3d\x16\xc3\xb5\xcb\xbe\x62\x9d\xf8\x45\xde\xe4\x86\x7d\xad\xb8\x47\xf6\xc3\xf3\x99\xef\xb8\x1b\xab\x53\xc6\xcf\x12\xc8\x38\x91\xb0\xbd\x41\xbb\x80\x76\x01\xed\x02\xda\xe5\xd8\xb4\xcb\xfe\xb7\xdd\x76\x02\xa6\xe1\xba\x3b\x49\x15\x1e\x34\x0c\x94\xf9\xcb\x53\xe6\x41\xc3\x74\xb9\x6e\x40\xc3\xc0\x7c\x03\x65\x09\x34\x4c\xff\x34\xcc\x4b\xec\x17\xdb\x09\x99\x73\xc1\x74\xa0\x65\x80\xe4\x2e\x05\xc9\x0d\x08\x30\xe1\x5e\xf7\x7f\x01\x2d\x73\xfe\x50\xe4\x94\x69\x19\x4a\x15\xe8\x59\x98\x5e\x79\x17\x9b\x50\x5a\x86\xf1\x53\x1c\x2e\x78\x52\x4d\x4e\xc9\x7d\x0a\x79\x3b\xd6\x71\x25\x1c\xfb\xbd\x0f\xe4\x1e\x51\x1b\xa3\xb2\x94\x48\xad\x36\x84\x07\x3a\x2c\x96\x79\x21\x78\xcd\x0e\xb9\x0c\x83\x7e\x2c\x1b\xb6\x2a\x19\x08\x3f\xab\xec\x2e\x49\x3c\x2a\x1a\x04\x97\xb3\xf6\x85\xcb\x4a\x1b\xb9\xc1\x4a\x47\x59\x4f\x3f\x3d\x09\x79\xc1\x19\x24\x69\x0a\xcf\x36\x8d\x24\x8a\x73\x9d\x71\x71\xae\xed\x34\xd1\xb6\xc2\x5c\x1b\x8d\x51\x1d\x50\x60\x28\xc7\x85\x72\x5c\x28\xc7\x85\x72\x5c\xe7\x56\x8e\x6b\xfb\xc9\xdb\x58\x8a\xab\x67\x87\x83\x83\x15\xe0\xda\x3e\xfc\xf5\xc5\xb7\x86\x2c\x83\x5d\x4a\x6e\x6d\x97\xc1\xfa\x72\x5b\x3d\xcb\x00\x45\xb6\x50\x64\x0b\x45\xb6\x50\x64\x0b\x45\xb6\x7a\x2b\xb2\xd5\xe2\xf4\x5f\x29\xb0\xb5\x31\xad\xe3\x05\xf9\x1b\xb6\x1b\xcd\x19\x17\x09\xdb\x2e\xee\x4d\x05\xc2\x0e\x2b\x77\x94\x05\xeb\x65\x46\x57\x4b\x82\xf5\x3c\xad\x47\x2d\x04\xb6\x5d\x3c\x1b\x8a\x80\xf5\x7d\x6c\x0e\xb5\xf4\xd7\x76\xa1\x35\x70\x17\x7b\xdb\xf3\xec\x4f\x7f\xb6\xa4\xbf\xb6\xc4\x26\x5d\x32\x2b\xb6\xe2\x1a\xf4\x8f\x25\x72\x01\x7c\x18\xf8\x30\x06\x3e\x0c\x7c\x18\xf8\x30\xf0\x61\xe0\xc3\xc0\x87\x81\x0f\x03\x1f\x06\x3e\x6c\x60\x5c\x10\xf8\x30\xf0\x61\xe0\xc3\xc0\x87\x81\x0f\x03\x1f\x06\x3e\xec\x14\xf9\x30\x24\x1e\x01\x11\x08\x22\x10\x44\xe0\xa0\x67\x14\x44\x60\x5d\x3c\x20\x02\xcf\x8a\x08\x6c\x28\xde\xdc\x13\x1f\x58\x25\x01\xa5\x43\x3c\x6a\xc6\x1e\x63\x19\x76\x4a\x06\xbe\x2d\xf5\x1b\xd2\xe1\x2c\x16\xd6\x2a\x52\xa9\xb8\x8d\x6a\x0a\x7f\xa5\xed\x97\x51\x89\xa0\x11\x41\x23\x9e\x10\x8d\x08\x0a\x11\x14\x22\x28\x44\x50\x88\xa0\x10\x41\x21\x82\x42\x04\x85\x08\x0a\x11\x14\x22\x28\x44\x50\x88\xa0\x10\x41\x21\x82\x42\x04\x85\x38\x78\x0a\x11\x85\x18\xc0\x87\x82\x0f\x1d\x2e\x7b\x06\x3e\x14\x7c\x28\xf8\x50\xf0\xa1\x4b\x42\x3b\x10\x1f\x1a\x88\xcc\xf6\x5e\xe4\x44\x0b\xc5\xea\x66\x2f\xa6\xf3\x28\x09\x7d\x97\x66\x3b\x12\x05\x8b\xe5\x4c\x65\x73\xbf\xba\x39\x33\x2c\xcc\x7a\xc6\x32\x12\xc5\x87\x8a\x10\xee\x26\x5f\xfe\x6b\xf9\x0d\x24\x31\xde\x91\x3d\xf4\x42\x3c\x71\xee\xb0\xba\x3b\x2a\x6f\xbd\xaa\x7e\x79\xfb\x7e\x7a\xba\x3d\xed\x2d\x55\xd3\xfd\xcd\x59\xd9\x7e\x3f\xfd\xf3\xf6\x6e\xf2\xe5\xf7\xa6\xf7\xb0\xab\x76\xdf\x55\x4e\x90\x14\x8f\x7d\x46\x9b\xeb\x7f\x9e\x6e\x5f\xb4\xbf\xaa\xbf\x8e\x23\x19\xcb\xc8\xd9\x3d\xaa\x3b\xcf\x98\x58\xba\xf5\xdc\x31\x6d\xb2\x40\x25\x89\x08\xdc\xad\x53\xd9\x00\xdf\x4d\x77\x7e\x37\xdd\xd9\xb0\x6f\x4c\x43\xf5\xad\xf3\xc1\xb7\xda\xaa\xc5\x7e\xcb\x75\xf4\xb2\xa6\x3f\xd2\xa8\xbf\x91\x38\xf3\x4e\x4a\x74\x80\x5c\x06\xb9\x0c\x72\x19\xe4\xf2\xb9\x91\xcb\xed\x8a\xbb\x34\x12\xcc\x07\xab\xbb\x83\xf2\x48\xad\x27\xea\x98\xe5\x91\x0e\xe6\x11\xb0\x43\x41\xa2\x46\x46\xfc\x60\x12\xf9\xa3\x6a\x14\x8b\x25\xcb\x8d\xad\x8a\x4d\xc5\xcc\xb8\x2e\x7a\xf6\xa8\x84\x12\xf6\xf4\xa2\xa5\x53\x29\x08\x25\x95\xbc\x96\x22\xe2\xb4\x40\xad\x59\xab\x5a\x38\xca\x30\xc9\x7e\x6b\x58\xfc\x18\xcf\xe7\x22\x8c\x79\x21\x92\xe7\xd2\xa7\xb0\xbc\x72\xe3\xe4\xad\x35\x5b\x91\xd0\x59\x94\xf1\x80\x76\x4d\xac\x42\x0f\x08\xca\x4b\x9b\x1c\x36\xdd\x2a\x5d\xe4\xba\x93\xd5\xe9\xe2\xfa\x4d\x37\x20\xfb\x91\x99\x39\x03\x5d\x13\x63\xd3\x4f\x53\xab\xb2\xa1\x8f\x7b\x4c\x33\xf5\x79\x42\x5d\x6e\x32\x05\x6e\x31\x06\x0e\x65\xf9\xef\xe2\x0c\xd2\x4e\x2e\xeb\x1d\x42\x0e\xb6\xfc\xe1\x1a\x02\xd7\x10\xb8\x86\xc0\x35\x04\xae\x21\xbd\xb9\x86\xb4\xbc\x0b\x56\xdc\x43\x0e\x77\x2d\x7e\xac\xc4\x95\xa5\x89\xe0\xb9\xf0\x47\xd0\x24\x53\x29\x8f\x08\x1d\x4d\x54\x12\x07\xcf\xb5\x40\x04\xb7\xe8\xca\xc0\x34\xbd\xec\x6e\xc7\x7f\x1f\xb3\xef\xe6\x3c\x33\xd0\x25\x15\x52\x6f\x96\xf2\x4e\x15\x4c\x65\xe9\x03\x97\x2e\x30\x22\x5b\x88\x9b\x19\x4f\x9c\xae\x7c\x7f\x65\xfe\x7c\x7f\xc5\x66\xb1\xe4\x49\xfc\x6f\x77\x91\x4c\x05\xe3\x21\x31\xcd\xea\xc6\xb0\x70\x61\xa9\x86\x99\xe6\x47\x79\xf9\x92\xd1\x4f\xc7\xec\x53\x4c\x87\x63\xa5\xeb\x2a\x5b\x1d\x5b\xe9\x57\x50\x18\xf5\x98\x74\x14\x55\x3c\xec\x33\xa1\x66\x04\x1f\xdd\xd8\xd7\x42\x9e\xbd\x2a\x69\xef\xa4\x98\xd1\xd0\xf5\x86\x7d\x50\x3f\x58\xc4\xb3\x29\x8f\x6a\x66\x4b\xaf\xd4\x88\x6c\xa6\xb2\xb9\x9e\x93\x46\x79\x7d\x5b\x1a\xd1\x7a\x71\x11\xe8\x75\x88\x35\x35\xb2\x8d\x35\x9a\x0c\xe2\xb0\x54\x85\x09\x2b\x98\x82\xe7\x6e\x8e\x73\xe2\xf1\xe8\xaf\x0e\x0d\x8c\x2b\x93\xe9\xee\x11\x4f\xec\xfb\x20\x9f\xfa\xc7\xc6\xec\x2e\x08\x44\x6a\x4a\xad\x56\x35\xbb\x91\x19\xc3\x88\x5d\xdb\x05\x58\x5f\xa0\xf9\x2f\x6c\xf4\x2b\x0f\x1e\xa3\x4c\x2d\x64\xa8\x9f\xa2\x80\x19\x7a\x68\x49\x70\x06\x42\x5a\x7c\x5c\x6f\xc4\x8d\x60\xea\x5b\xfa\x85\x8d\x3e\xab\x4c\x54\x9a\x65\x01\xcf\x03\x1e\xea\xd1\x5b\xf9\x98\x78\x2a\x6a\x2f\x37\xaa\xe7\x4a\x83\x33\xdf\xc6\x3e\x0b\x32\x5d\x5e\xee\xc7\x41\x9c\x67\xec\x01\xd4\x6e\x1e\x36\x79\x01\x1d\x6b\x16\xe0\x0f\xd4\xdb\xfc\xae\xfa\x04\x1d\xce\xb6\x71\x4c\xef\xa0\x76\xc2\xda\xe0\x21\xf4\x52\xfc\xd3\xc8\xe1\x81\x7a\xde\x91\xa6\xfb\x5e\xf0\x62\xd1\x96\x9f\x3b\x41\xc6\xb9\xf2\xe2\x9a\x60\x70\x73\x27\x97\x78\xa9\x8b\xb8\xf0\x06\x32\x7b\x4d\x94\x78\x0b\xf6\x77\x39\x6e\x7c\x53\xc8\x78\xe7\xf9\x2b\x8c\xdd\x2c\xb3\xba\xb6\x03\xf8\x3e\x75\xc5\x1e\x74\xb8\x6e\x71\x89\x0c\xef\x92\x02\x47\x40\xfc\xe5\x04\xc4\xb7\xbb\x83\xb6\x05\xc5\x1f\x4e\x59\x83\x07\x03\x3c\x18\xe0\xc1\x00\x0f\x06\x78\x30\x34\x1d\xbe\xa0\xc6\x4f\x48\x22\x60\x4b\xc1\x96\x82\x2d\x05\x5b\x0a\xb6\x14\x6c\xe9\x79\xb1\xa5\x20\x30\x40\x60\x80\xc0\x00\x81\xd1\x3b\x81\xb1\x03\xc9\x3f\xd0\x60\xe7\x76\x22\x5c\x0d\x78\x7e\xa9\xc5\x6d\x50\xd4\xcf\xda\x17\x2e\x2b\xe5\xf0\xb8\xc6\x79\x3c\xdd\x8e\xd7\x5a\xf5\xcf\x3b\xc4\x71\x3b\xe1\xd4\x55\xfd\xd2\xa3\x91\x4c\x7b\xe4\x25\x3e\x95\x2c\x37\xaf\x96\x66\xf1\x2a\x55\x79\xc7\x8c\x9a\xd1\x6d\x18\xdf\x8b\x3c\x33\x2f\xf7\x48\x9f\xed\x17\x41\xba\x21\x7d\xd2\x81\x0e\x95\x4e\x22\x4c\x11\xe5\x54\x5d\x04\x83\x8d\x72\x22\x1b\xc7\x57\x2e\x79\x24\x32\x63\xad\x33\x69\xc3\xf2\x5c\x05\x31\xa9\x9f\xde\x2e\xc6\xc9\xbc\xa9\x32\x26\x64\xa1\xf1\xa0\xd3\xc7\xe7\xfc\x51\x4b\xb1\x78\x10\xb9\x70\xa0\xaa\x1a\xcb\xe3\x62\x7e\x08\x54\x92\x0d\x4c\x65\xec\xf6\xdd\xcf\xfa\xd9\x8c\x07\x44\x7a\x25\x4a\x46\x06\x42\x91\x9d\x2a\x50\xb2\xe0\xb1\x34\xa7\x18\xd9\x81\xca\x67\x89\x08\xb0\x94\x1c\x9b\x3e\x7b\x2d\x21\x52\x09\x97\xd1\x58\x65\xd1\x4d\xfa\x18\xdd\x2c\x64\x1c\xa8\x50\xdc\xfc\xf4\x25\x9f\xe8\x56\xf6\x36\x2c\x5b\xe1\x74\x39\x3d\x83\xc2\x5c\xe7\x02\x85\xda\xc2\xa0\x77\x2d\x60\xd0\x07\x63\x33\x1b\xf6\x30\xde\x6d\x1d\x86\xf1\xec\x1d\xf6\x38\xce\x11\x95\x12\xd0\x39\x41\x54\xfa\x8a\xbd\x3c\x95\x48\x43\x21\xa0\x1e\x33\x8a\xec\x87\xfc\x1a\xb3\x88\x1c\x1f\xf9\x9d\x48\xee\x10\x20\xbb\xea\x24\x0f\x16\xd9\x21\x5a\xfb\x82\xa2\xb5\x11\x96\x86\xb0\x34\x84\xa5\x21\x2c\x0d\x4a\xe9\xba\x5d\x34\xc8\x18\x90\xe3\x28\x71\x08\x61\xd9\xa0\xbb\x59\x65\xe5\x04\xb5\x37\x6f\x67\xef\x3c\x70\x25\x13\x3c\x5c\x82\x63\xfb\xa8\x5d\xba\x99\xc3\x45\xab\x54\xe0\x8b\xf8\x8b\x7c\xd0\xa6\xfa\x27\x1e\x14\x63\xc6\x3e\xe9\x7f\xdd\xef\xe7\x3c\x26\x73\x63\xce\x82\x64\x91\x17\x22\x2b\x2f\x25\xe3\xac\xca\x92\xf8\x51\xb0\x91\xaf\xd2\x3a\xd2\xd8\xd3\xe1\xa5\x31\x9b\x24\x5c\x4a\x61\x40\x2b\x21\x1a\x9e\x18\x10\x75\xfb\xf3\x3e\xa7\x3c\xf5\xf1\x48\x58\xc3\x0b\xcd\x43\xf5\xa9\x13\x9f\x1e\x29\xfb\x64\x24\xa6\xef\x97\x34\x77\xd2\xb1\x6e\x5a\x8b\x5c\x64\xe4\x5f\x55\xa2\xee\xe7\x9e\x05\xa5\x3b\x73\xbe\x6c\xf8\xb0\x2f\x41\x98\x02\xdb\x5c\x27\x91\x38\x49\x4b\xe0\x4b\xf8\xe9\x5a\x2d\x9d\x76\xdd\x39\xa5\xea\x3a\xa7\x4b\xbf\x93\xe7\xcb\x5e\x49\xd5\xaf\xe9\xdd\xbf\x6d\x3e\xe4\xe6\x22\x8b\x44\xab\x27\xf3\x22\xe3\x85\x88\xe2\xe0\xba\xfd\x3b\xfa\xe7\x67\xfb\x24\x1d\xa7\x6d\x80\x4b\xca\xb3\x22\xa6\xc0\x34\xe3\xa5\xd5\x01\x88\xa1\x1e\x0c\xce\x74\xdc\x97\xd3\xc0\x06\x55\x61\x52\x77\xa4\x62\x30\x28\x9f\xb9\x41\xf9\x72\x5c\x05\x96\xc2\x3f\xdc\xe6\x32\x21\x4a\xfa\x1c\x2a\xc3\xde\x5f\xaf\x39\xa3\xde\x90\x39\xcd\xc4\x25\xf3\x84\xde\x94\x4a\x5e\x9b\xb7\xe9\x09\xb2\x68\xe7\xec\xf5\x6f\xb9\x92\x13\x13\xfd\xfd\x55\x9f\x86\xf6\xe7\xef\xee\x8c\x2c\x7f\xf9\x66\x48\x3e\x0c\xed\xd7\xcd\x67\x95\x05\x64\xf2\x8f\x14\x4d\xbe\x62\xf7\x57\x33\xfd\xbb\xfb\x2b\x76\x57\x93\x26\x39\x97\x1b\xfb\x3c\x29\x13\x76\xa3\x5e\xf3\x80\x26\x80\xe2\x87\x93\x38\xb0\x16\x47\xd2\x3d\xd4\x0f\x3b\xb7\x26\xbe\x36\x15\x2a\x4d\xc4\x98\x99\x6f\x52\xda\x00\xb7\xa6\xc8\xc5\xbb\x71\x22\xfc\xe7\xf7\x11\xaf\xfe\x10\x54\x10\xf3\x07\xa8\x20\x2b\x6d\x0e\x40\x05\x49\x97\xfc\xa5\x4f\x50\x09\x59\x74\x6e\xd0\x4a\x13\x1e\x74\x01\x07\x6d\x4b\x17\x03\x08\xe1\x45\x0a\x68\x78\xc9\xd0\x70\x40\x08\x0c\x40\xc1\xff\x05\x5e\xa4\xc0\x3b\x25\xde\x59\x9c\xa4\xc9\xf5\x15\xeb\xcc\xf9\x52\x2b\xa2\x99\x7a\xe2\xc9\x5e\x15\x15\x77\x62\x05\xdd\x97\xdc\xf5\x77\x30\x86\xf0\xce\x0d\x11\x87\x1f\x4e\x0d\xfb\x3b\x10\x35\x20\x6a\x40\xd4\x9c\x05\x51\xd3\xed\xbd\xb2\x0b\x69\xd3\x78\xb1\x9c\xa4\xae\x0e\xf2\x06\x1a\xfa\xe5\x69\xe8\x20\x6f\xba\x5c\x37\x20\x6f\x60\x93\x81\x5a\x02\xf2\x66\x80\xe4\x4d\xd7\xa6\x87\x5d\x88\x9c\xf3\x01\x89\x20\x74\x00\x17\x2f\x19\x2e\x0e\x08\x95\x01\x3c\xf8\xbf\x80\xd0\x01\x06\x02\xa1\x53\x12\x3a\xb9\x89\xcb\xeb\x9d\xce\x31\xdf\x39\x38\x99\x63\xc3\x0e\x71\xec\xe1\xbc\xb0\xbf\x03\x95\x03\x2a\x07\x54\xce\x59\x50\x39\x5d\xde\x29\xbb\x10\x39\x0d\x97\xca\x49\x6a\xe8\xa0\x71\xa0\x97\x5f\x9e\x5e\x0e\x1a\xa7\xcb\x75\x03\x1a\x07\x96\x18\xa8\x24\xa0\x71\x06\x48\xe3\x74\x6b\x72\xd8\x85\xc4\x39\x17\x80\x08\x0a\x07\x50\xf1\x92\xa1\xe2\x80\x10\x19\x80\x83\xff\x0b\x28\x1c\xe0\x9f\xcb\xa1\x70\xa8\xac\xd4\x06\x22\xa7\x57\xea\xc6\x96\x23\x95\x61\xfc\x14\x87\x0b\x9e\x54\x4b\x9b\x71\x5f\x80\x78\xad\x4c\xc6\x95\xec\xbf\xef\x7d\xde\xe0\x11\xb5\x3a\x2a\x4b\xd3\xd7\x6a\x8d\x7b\xe0\xc5\x62\x99\x17\x82\xd7\xcc\xae\xcb\xb0\xec\xc7\x0e\x56\xbb\x7f\x2c\x55\x74\x42\x29\xb2\xa1\xa6\x3a\xa5\x4a\x7a\x9f\x9e\x84\xbc\xe8\x93\x8d\x26\xf1\x12\xcb\x90\x51\x5e\x65\x5a\x03\xbf\x2a\xf5\x38\xe7\xd9\x63\x5e\x9a\xe4\xcc\x89\x44\x35\xab\x73\x8b\x33\x9f\x53\xc1\xee\xaf\x7e\xfd\xf6\xed\xbf\xbf\xde\xfd\xfe\xdf\xf7\x57\x65\xd5\x68\x93\x37\x59\x91\x9a\x10\xcf\xd3\x44\x50\x79\xe8\xa9\x6f\x75\xce\x9f\x59\x1c\x49\x93\xb5\x3e\xce\x8d\x49\x49\x23\xca\xf2\x11\x9e\x09\x56\xad\xae\x6b\x4a\x31\x8f\x72\x16\xc6\x79\x90\x09\xdd\xe7\xb2\xb6\x7f\x45\x2b\xb1\x25\xa1\xeb\x0d\xf9\x22\xcd\xbc\x30\x95\x8e\x5d\x36\xd0\x58\x16\x22\x7b\xe2\xc9\x5b\x26\x55\x46\xdd\xa2\x1a\xc2\xbe\xae\xf4\x72\x69\x72\x19\xd2\xfb\x6e\xcc\xb6\x86\xb7\xaf\x20\x9c\x6b\x2d\x45\x77\xcc\x25\xc7\xb7\xa5\xa6\xb9\x11\x5f\x2d\x4f\xbb\xfe\x2b\x89\xc0\xa6\x5b\x7f\x10\x6c\x26\x78\xb1\xc8\x04\x8b\x78\x21\xd8\xd2\x44\xd8\x96\x84\xd4\x10\xdb\x94\x6c\x4e\x63\xd3\xb9\x75\xcd\xee\x48\x9b\x35\x4c\x7f\x33\x87\xd6\x64\x80\xeb\x80\x12\xfc\xa3\x5a\xf5\xdb\xd8\x78\x2b\x85\x0c\x72\x51\x98\x12\xdb\xb6\x6c\xbb\x16\x78\xad\xde\xb7\xcf\x38\x6f\x84\x32\x66\xdf\x63\x19\x88\xa5\x1a\x05\x76\x36\xad\x4a\x52\x2f\x26\x5e\xab\xa7\xee\x3b\x62\x5e\xa5\xc6\xb9\xd6\x91\x9f\x62\xb5\xc8\x6d\x11\x79\x57\xdd\x59\xef\x86\xb2\xc4\xb7\xf9\x5b\xb9\xff\xd8\x6b\xf1\x57\x20\xd2\xb2\x90\xab\x69\x52\xcd\xfc\x47\xde\xf8\x24\xea\xb6\x7f\xa6\xd0\x3c\x55\x3e\xe0\xcb\x5d\x89\xf5\xce\x12\x66\x35\x78\x25\xdb\x2f\xa1\xd2\xda\xb2\xfc\x9a\x7e\x83\x74\x37\x91\x31\xa3\xa7\xbb\x3a\xf0\xe1\x42\x68\x5c\x21\xfe\x4a\x63\x8b\x00\x5e\x47\x42\x8a\x8c\x28\xbf\x99\x56\xd8\x0b\xc5\x66\xf1\xac\x10\x42\xb2\x79\x2c\x17\x85\xc8\xdf\x30\x2a\xee\x1f\x28\x39\x8b\x23\x57\x93\xc2\x80\x14\x57\xa8\xbf\x5c\x9c\xf5\x5d\x64\x6e\xc2\xd0\x81\x8f\xff\x7b\xfb\x7f\xd8\xef\x36\x77\xfc\x27\xdd\x05\x11\x5a\x73\x40\xa1\x22\xd3\x41\xfb\xa4\x1f\x51\xa1\x1e\x85\xf4\x43\xb6\xc5\xc4\xa5\x10\xe1\x52\x0d\x72\x7d\x88\xbf\xd5\x02\x23\xb5\x36\x13\x79\xc1\x4d\xe1\xfa\xd8\x96\x2d\x76\xf5\xd6\x57\x0b\xce\x8f\xd9\x37\xfd\xe9\x1f\xb1\x2b\x7f\x60\xbf\xa2\x67\xc6\x1e\x03\xc6\x36\x6e\xcb\x7c\x9b\xba\xd6\x5e\xff\xa6\x1e\xba\x42\xe6\x15\xbd\x5c\x0f\x96\x06\xb7\x55\x2c\xd4\x2e\x75\x98\xec\xf2\x6e\x71\x4b\xf1\x57\xc1\x1e\xc5\xb3\x49\xee\xef\x7f\x9d\xe8\xfb\xa5\x5a\x74\xfd\xc7\x43\x6c\xea\xd9\xc7\xb2\x22\x10\xff\xbc\x5f\xc8\x95\x2a\xe5\x39\xbb\xf6\xc5\x20\x4c\x02\xe0\x4c\xec\x58\x6b\x7e\x49\x18\xab\x65\xe6\x6d\xa1\x00\x42\x42\x64\x1c\xd0\x0b\x52\xff\x6b\x26\xe5\x51\x3c\xdb\xc2\xfd\xbe\xe1\xfb\x2b\x37\xe4\xfb\x2b\x5b\x97\x7f\x7d\x21\x7f\x3a\x20\xea\xa5\xfc\xfd\x1d\x41\x33\x47\x0b\xc0\x9e\xc6\x55\xe9\xe5\x2b\x75\xae\xed\xb6\xf1\x37\x87\xad\x8f\x60\x67\xcc\x18\xa8\x0a\x36\x8f\xf3\x9c\x6e\x84\x9a\x95\x6c\xd7\x93\xd7\x2d\xbd\x6e\x5c\x16\xda\x9d\xb6\x77\x2c\x17\x65\xcd\x04\xbd\x37\xb2\x38\x28\x7c\xa1\x69\x7d\x3c\xf9\xb1\xfb\x12\x21\xcf\x76\x9e\x0c\x4d\x54\xaf\xd7\x22\x9e\x44\xf6\x5c\x3c\xc4\x32\xda\x75\xf8\xd4\xda\x77\xdb\x9b\x93\x91\x41\xc2\xa7\x22\xe9\x4c\x06\xd4\xda\x31\x64\x40\xf5\xc3\x8d\x35\x71\xce\xff\x8a\xe7\x8b\x39\x93\x8b\xf9\x54\x64\x66\xf4\x56\x69\x31\xf2\xa1\xb2\xd9\x44\xd7\x96\x55\xdf\xe9\x18\xa6\x8b\x38\xd6\xbd\x30\x05\x44\x56\x4f\x37\x7d\x7d\xeb\xdf\xfd\xaf\x5b\xeb\xff\xeb\x6a\x98\xc8\x52\xde\xae\xbc\x88\xd1\x72\xcd\x06\xa4\x93\x28\xe0\xd2\x15\x09\x2a\xcf\xd2\x9c\xcf\xf5\xe1\x12\x17\xb1\xbf\x74\x4d\x2f\x35\x3c\x10\xe5\x69\xa9\x3f\x6d\xc6\xa2\xa7\x49\x83\xd4\xa2\x30\x70\xcd\x8c\xdd\x5c\xb6\x66\x6c\xe2\x07\x1d\x3b\x5c\x56\xad\xcc\xfa\xa0\x9b\xab\x85\xa4\x66\xcc\x28\x5f\x2f\x52\xfd\x31\x53\x26\x49\xff\xe6\x8d\x3b\xdd\x0c\x22\xe4\x74\xa0\xbb\xb7\xdd\xda\xd1\x27\xdb\x2c\x4e\x0a\xa1\xef\x38\x7d\xef\xe8\x63\x24\xa8\x63\xd8\x1a\x0a\x31\x36\xf9\xc0\x3b\x82\xd5\xef\x28\x53\xec\xc4\x16\xfd\xf7\xb7\x79\x0d\x14\xd1\x59\xfa\xc4\xe3\x44\xa3\xc6\x12\x9f\xeb\x21\x07\x0f\x4a\xe5\x54\xd9\x5c\xb7\x63\xcf\x50\x3b\x17\x5a\x2c\x3c\x8b\x16\x04\xdb\xb9\x0c\xdd\x0d\x45\x42\xd2\x63\xb3\xfd\xf1\x4d\x97\xd2\xfd\x32\x63\x7e\x49\x95\x60\xc4\xe1\x9b\xa5\x01\xc4\x39\x13\xf3\xb4\x78\xae\x03\x31\x8f\xbe\x79\xa1\x31\xcb\xa6\x01\x6d\xba\x0c\xe2\xd9\xd2\x55\x60\x6e\x0f\xbf\x2e\xa3\x05\xcf\xb8\x2c\x84\x23\x3a\xca\x6a\x45\x79\xb9\xed\xe9\x46\x59\x10\xf5\xe0\xfb\xee\x2f\x36\x0f\xf9\x0a\xc5\xe2\x3c\x5f\x58\x25\x20\x96\x51\x22\xca\x1d\xe2\x51\x86\x5b\x70\xd7\xce\x1c\xaf\xb5\x0e\xff\xc9\xdd\x6e\x5a\x77\xc9\x92\x8e\x91\x2f\x44\xd8\x78\xdd\x92\xae\xb3\x98\xe6\xfa\x61\x59\xf8\x11\x84\x15\xdf\x80\x3f\xac\x9a\x92\xab\xb9\x28\xe2\xb9\xd0\x63\x9f\x89\x2c\xa3\x72\x4e\xa6\x3c\x7e\x05\x40\x94\x00\x43\xcf\xa8\x90\xf9\x22\x13\xbe\x5c\x80\x85\x48\x8e\x6b\x30\x52\x33\x43\xa6\x8d\x49\x60\x88\xe5\x73\x9e\x24\x22\x63\xc1\xc3\x42\x3e\x12\x4b\xc8\x99\x3e\x36\x59\xc2\xb3\xc8\x4d\x34\xed\x78\xd3\xbc\xd1\xc8\x72\x21\x68\xe1\xa5\x2a\xcf\x63\xbd\xe0\xac\xd8\x68\xc1\x55\xf7\x97\x71\x51\x0b\x4b\x9d\x8c\xbe\x23\x42\x33\x1f\x04\xbf\xed\x05\x6f\xd7\xb0\xad\x30\x46\xbd\xfe\xc1\x73\xc7\x83\x39\xbd\x53\xcb\x64\x15\xe1\x18\xdc\xcf\x73\x3d\xc1\xc1\x22\x31\x55\xb6\xca\x65\xb3\xf3\xe9\xaf\x85\xd4\x7c\xea\x37\x95\x19\xbb\x20\xff\xcb\x76\xa3\x59\xc6\x6e\xb9\x28\xdc\xc2\x2d\x32\x1e\xeb\x93\x5b\xb2\x1f\x7a\x86\xdd\x93\x6e\x15\xe8\xc7\xdc\x5e\xf2\xa5\xb3\x32\x57\xc1\x4c\x9f\x98\xc2\xb3\x56\x15\xc3\x5f\xac\x6e\x42\x15\xe4\x37\xb4\x57\xf4\x09\x7d\x43\xab\xfd\x9a\xa7\xf1\x0d\x4f\xe3\xeb\x40\x49\xad\xf2\xe5\x37\x3f\xf9\xb2\x58\xfe\x83\x33\xda\xd6\x05\x8f\x93\x9c\x8e\xa4\x2a\x80\x20\x77\x9a\x1d\xc5\xbd\x34\xf8\x23\xca\xfd\x2b\x1d\xb7\xfe\x4a\xca\xa9\xb8\xd9\xf2\xdc\x68\xa8\x91\xa6\x49\x6c\x0e\x18\x7f\x4a\x1a\x37\xa5\x38\x67\x0f\x71\xf4\x40\xde\x4b\x81\x9a\xcf\x85\xa4\xba\x72\xd5\x99\xab\x7d\xcb\x1a\x06\xb4\x48\xcb\x96\xf4\xa1\x9d\x89\xa6\x0f\xeb\x67\x4f\x6f\x46\xbf\xae\xda\xa4\xfb\x9d\xd6\x3f\xe2\xb9\xd0\x17\x96\x33\x58\x68\xd1\x1a\x3e\xc4\x42\x3e\xba\x34\xe8\xd0\xca\x4d\x9d\x35\x67\x01\x70\x38\x85\x27\xc9\x5b\x96\x89\x88\x67\x21\x51\xc9\xfa\x94\x97\xcf\x8c\x07\x45\xfc\x14\x17\xcf\xfa\x66\x8b\xa5\xfb\xdf\xae\xe7\x4b\x61\xba\xd7\x54\x9f\xb1\xef\x63\xf3\x5f\x46\x71\x54\x59\x95\x90\x31\x95\xe6\xf4\x73\x53\xba\x5a\xcd\xe4\x99\xca\x78\x16\x33\x15\x0f\x62\x6e\x2e\x53\xc3\x14\x90\x40\xc2\xf0\xad\xbd\xae\xde\xda\x67\xe7\xea\x89\x10\x59\x45\x95\x64\xdf\x4d\xdd\x9d\xe5\xe5\xbc\xab\xd0\x1a\x88\x8d\xbd\xed\x79\xf6\xa7\x3f\xbb\x23\xd3\x1a\x6a\x0c\xf7\xc4\xa9\x55\x89\x34\xe9\x2e\x7f\x35\x63\x8f\xb1\xdc\xe0\xa1\xd4\x09\xa1\xf6\xb6\x04\xff\xa4\xe0\x58\xa0\xa8\xf5\x87\x52\xab\x19\xd5\xb4\xe1\x4a\xdb\x5d\xd1\x71\xa0\xe2\x40\xc5\x9d\x14\x15\x07\x1a\x0e\x34\x1c\x68\xb8\xf2\x41\xd0\x70\xa0\xe1\x40\xc3\x81\x86\x03\x0d\x07\x1a\x0e\x34\x1c\x68\x38\xd0\x70\xa0\xe1\x40\xc3\x81\x86\x03\x0d\x77\x7a\x34\x1c\xb2\xbc\x80\x65\x04\xcb\x08\x96\x71\x00\x33\x0a\x96\xb1\x2e\x1e\xb0\x8c\xa7\xc6\x32\x4e\x45\xc1\x6f\x6f\xf6\xe2\x10\x8f\x12\xb8\xbb\x34\xeb\x91\x28\xea\x48\xde\x4c\xf0\x06\xda\x2f\x12\x45\x9d\xf4\x23\x09\xdc\x4d\xbe\xfc\xde\xf4\x32\x82\x96\x77\xe4\xe0\x2a\x82\xa4\x18\xc6\xf3\x22\xe2\x68\xad\x54\xde\x7e\x55\xed\x41\xfb\xed\xd6\x2e\x40\xd6\xe8\x4f\xdd\xf2\xf9\xa6\x4d\x16\xa8\x24\x11\x81\xbb\x17\xf6\xc9\x31\x62\x1a\x6a\xd8\x49\x1f\x7c\xd3\x03\xa8\xff\xdb\xcb\x12\xff\x48\x43\xff\x46\x32\xcd\x3b\xc9\x25\x02\xfa\x08\xf4\x11\xe8\x23\xd0\x47\xe7\x46\x1f\xb5\xcb\x42\xd3\x48\x21\x1d\x2c\x41\x10\xf2\x38\xb5\x9e\xa8\x63\xe6\x71\x3a\x18\xe7\xb7\x43\xe6\xa4\x46\xce\xeb\x60\x12\xf9\xa3\xaa\xdd\xc7\x92\xe5\x46\xe9\x66\x53\x31\x33\xce\x49\xde\x3e\x5c\x42\x09\x7b\x7a\xd1\xd2\xa9\x64\xae\x92\x4a\x5e\x4b\x11\x71\x5a\xa0\x56\x3f\xaf\x66\xb8\x32\x5c\x91\xdf\x1a\x16\x44\xc6\xf3\xb9\x08\x63\x5e\x88\xe4\xb9\xf4\x1a\x2a\xaf\xdc\x38\x79\x6b\xf5\x6f\x12\x3a\x8b\x32\x1e\xd0\xae\x89\x55\xe8\x01\x41\x79\x69\x93\x4b\x96\x5b\xa5\x8b\x5c\x77\xb2\x3a\x5d\x5c\xbf\xe9\x06\x64\x3f\x32\x33\x67\xa0\x6b\x62\x6c\xfa\x69\xb2\x76\x36\xf4\x71\x8f\x69\xa6\x3e\x4f\xa8\xcb\x4d\x36\x8d\x2d\x56\x8d\xa1\x2c\xff\x5d\xe8\xde\x76\x72\x59\x4f\xf9\x1e\x6c\xf9\x83\xfc\x05\xf9\x0b\xf2\x17\xe4\x2f\xc8\xdf\xde\xc8\xdf\x96\x77\xc1\x0a\x01\x7c\xb8\x6b\xf1\x63\x25\xc0\x24\x4d\x04\xcf\x85\x3f\x82\x26\x99\x4a\x79\x44\xe8\x68\xa2\x92\x38\x78\xae\xb9\x1a\xbb\x45\x57\x46\xa8\xe8\x65\x77\x3b\xfe\xfb\x98\x7d\x37\xe7\x99\x81\x2e\xa9\x90\x7a\xb3\x94\x77\xaa\x60\x2a\x4b\x1f\xb8\x74\xae\xcf\xd9\x42\xdc\xcc\x78\xe2\x74\xe5\xfb\x2b\xf3\xe7\xfb\x2b\x36\x8b\x25\x4f\xe2\x7f\xbb\x8b\x64\x2a\x18\x0f\x89\x32\x53\x37\x86\x4e\x08\x4b\x35\xcc\x34\x3f\xca\xcb\x97\x8c\x7e\x3a\x66\x9f\x62\x3a\x1c\x2b\x5d\x57\xd9\xea\xd8\x4a\x82\xb4\x30\xea\x31\xe9\x28\xaa\x78\xd8\x67\x42\xcd\x08\x3e\xba\xb1\xaf\x85\x3c\x7b\xe5\x14\xdf\x49\x31\xa3\xa1\xeb\x0d\xfb\xa0\x7e\xb0\x88\x67\x53\x1e\xd5\x6c\x97\x5e\xa9\x11\xd9\x4c\x65\x73\x3d\x27\x8d\xf2\xfa\xb6\x34\xa2\xf5\xe2\x22\xd0\xeb\x10\x6b\x6a\x64\x1b\x6b\x34\x19\xc4\x61\xa9\x0a\x13\x56\x30\xa9\xdf\xdd\x1c\xeb\xcb\xda\xde\xa4\x0e\x0d\x8c\x2b\x93\xe9\xee\x11\xcf\x50\x7a\x37\xfe\xfa\xc7\xc6\xec\x2e\x08\x44\x6a\x72\xc2\x56\x35\xbb\x91\x19\xc3\x88\x5d\xdb\x05\x58\x5f\xa0\xf9\x2f\x6c\xf4\x2b\x0f\x1e\xa3\x4c\x2d\x64\xa8\x9f\x22\x97\x78\x7a\x68\x49\x70\x06\x42\x5a\x7c\x5c\x6f\xc4\x8d\x60\xea\x5b\xfa\x85\x8d\x3e\xab\x4c\x54\x9a\x65\x01\xcf\x03\x1e\xea\xd1\x5b\xf9\x98\x88\x09\x6a\x2f\x37\xaa\xe7\x4a\x83\x33\xdf\xc6\x3e\x0b\x32\x5d\x5e\xee\xc7\x41\x9c\x67\xec\xca\xd0\x6e\x1e\x36\xb9\x33\x1c\x6b\x16\xe0\xd8\xd0\xdb\xfc\xae\x3a\x37\x1c\xce\xb6\x71\x4c\x37\x87\x76\xc2\xda\xe0\xea\xf0\x52\xfc\xd3\x48\xe4\x81\x89\xde\x91\xa6\xb3\x75\x0d\xce\x9b\x80\xae\xbc\xbd\x26\x1c\xd4\x5c\xcc\x25\x68\x1a\x7c\x64\xe8\xd2\x10\x57\xc3\x43\x3b\x0f\x72\x37\x16\xb4\xcc\x6a\xdd\x0e\xea\x6f\x8d\x6f\xdf\xc0\x8e\xeb\x16\x9b\xb8\xf1\x2e\x19\x71\x44\xc0\x5e\x4e\x04\x6c\xbb\x2b\x69\x5b\x14\xec\xe1\x74\x37\x38\x34\xc0\xa1\x01\x0e\x0d\x70\x68\x80\x43\x43\xd3\xe1\x0b\xa6\xfc\x84\x24\x02\xf2\x14\xe4\x29\xc8\x53\x90\xa7\x20\x4f\x41\x9e\x9e\x17\x79\x0a\x3e\x03\x7c\x06\xf8\x0c\xf0\x19\xbd\xf3\x19\x3b\x70\xfe\x03\x0d\xe2\x6c\x27\xc2\xd5\x40\xce\xb3\xaa\xc0\xbe\xf6\x85\xcb\x4a\x40\xba\x5c\xea\x94\x2c\xfb\xeb\xeb\x9d\x5e\x40\x14\xe4\x76\x12\xea\x24\x2a\x03\x6e\x25\x9e\xf6\xc8\x4b\x7a\x2a\xc9\x3c\x5e\x2d\x4d\xe5\x55\xaa\xf2\x8e\x59\x36\xa3\xea\x30\xbe\x17\xa1\x66\x5e\xee\x9b\x52\x1b\x76\x41\xfb\x2d\x07\x0d\xaa\xda\x5f\x4e\x34\x14\xaa\xda\xa3\xaa\x7d\x43\x67\x4e\x15\x23\x9d\x54\x69\xfb\xce\xc6\xf2\x6e\xeb\x58\x8c\x2f\xf0\x09\x0c\xe6\x6c\x81\x2b\xc1\xa0\x53\x05\xae\xaf\x58\x47\x59\x49\x1a\x2a\x8d\xf4\x98\x9c\x64\x3f\x84\xb8\x3e\x21\xc9\xf1\x11\xe2\x89\xa4\x21\x01\xf8\xab\x4e\xf2\x60\xc1\x1f\x02\xbf\x2f\x28\xf0\x1b\x11\x6e\x88\x70\x43\x84\x1b\x22\xdc\xa0\xb7\xae\xdb\x45\x83\x0c\x27\x39\x8e\x76\x87\x68\x18\xff\xe4\xc6\x68\x98\x93\xd5\xe8\xbc\x79\xbe\xf3\x18\x98\x4c\xf0\x70\x09\x98\xed\xa3\x85\xe9\x66\x0e\x1c\xf8\x52\x41\x33\xe2\x2f\x72\x67\x9b\xea\x9f\x78\x50\x8c\x19\xfb\xa4\xff\x75\xbf\x9f\xf3\x98\x0c\x94\x39\x0b\x92\x45\x5e\x88\xac\xbc\xa3\x8c\xdf\x2b\x4b\xe2\x47\xc1\x46\xff\x8f\xcf\x45\x9e\xf2\x40\x8c\x34\x14\x75\xf0\x69\xcc\x26\x09\x97\x52\x18\x0c\x4b\x00\x87\x27\x06\x53\xdd\xfe\xbc\xcf\xa1\x4f\x7d\x3c\x12\xf4\xf0\x42\xf3\xc8\x7d\xea\xc4\xa7\x47\xca\x3e\x19\x89\xe9\xeb\x26\xcd\x9d\x74\xac\xc7\xd7\x22\x17\x19\xb9\x6a\x95\x20\xfc\xb9\x67\x41\xe9\xce\x9c\x2f\xb1\x3e\xec\x3b\x11\x26\xc3\xdd\xae\x98\x48\x9c\xae\xc5\xf0\x25\x54\x37\xca\x72\x0c\x94\xc9\x27\x9f\x9a\xbd\x32\xba\x5f\xd3\xbb\x7f\xdb\x7c\xe6\xcd\x45\x16\x89\x56\x4f\xe6\x45\xc6\x0b\x11\xc5\xc1\x75\xfb\x77\xf4\xcf\xcf\xf6\x49\x3a\x5d\xdb\x80\x99\x94\x67\x45\x4c\x21\x6f\xc6\xff\xab\x03\x60\x93\xae\x56\x8b\x1e\x8a\x75\xb9\x2f\xff\x83\x0d\xda\xc4\xa4\xee\xa7\xc5\x60\x73\x3e\x73\x9b\xf3\xe5\x38\x1c\x2c\x45\x97\xb8\xcd\x65\x22\xa0\xf4\x61\x54\x46\xd5\xbf\x5e\x73\x50\xbd\x21\x8b\x9b\x09\x7b\xe6\x09\xbd\x29\x95\xbc\x36\x6f\xd3\x13\x64\xf4\xce\xd9\xeb\xdf\x72\x25\x27\x26\xb8\xfc\xab\x3e\x12\xed\xcf\xdf\xdd\x41\x59\xfe\xf2\xcd\x90\x3c\x21\xda\xaf\x9b\xcf\x2a\x0b\x88\x15\x88\x14\x4d\xbe\x62\xf7\x57\x33\xfd\xbb\xfb\x2b\x76\x57\x93\x26\xf9\xae\x1b\x13\x3e\x29\x18\x76\xa3\x5e\xf3\x80\x26\x80\xc2\x93\x93\x38\xb0\x46\x49\xd2\x47\xd4\x0f\x3b\xb7\x26\x7c\x37\x15\x2a\x4d\xc4\x98\x99\x6f\x52\x56\x02\xb7\xa6\xc8\x83\xbc\x71\x22\xfc\xe7\xf7\x11\xaf\xfe\x10\xd4\x12\xf3\x07\xa8\x25\xc3\x56\x4b\xd2\x25\xc7\xec\x53\x55\x4c\x16\x9d\x1b\xbe\xd2\x84\x07\x5d\x40\x44\xdb\xd2\x65\x81\x44\x38\xa9\x02\x33\xae\x99\xa6\xcb\xc1\x8c\x03\x82\x66\x40\x10\xfe\x2f\x70\x52\x05\x1a\x5a\x8b\x86\x16\xa7\x6b\xa4\x7d\xc5\xba\x75\xeb\xd4\xaa\x6b\xa6\x9e\x78\xb2\x57\x15\xc8\x9d\x08\x46\xf7\x25\x77\x2f\x1e\x96\x6c\xbc\x73\xe3\xc4\xd1\x88\xe3\xa4\xd3\xe3\x04\x9c\x0f\x38\x1f\x70\x3e\x4d\x4f\x1e\x8f\xf3\xe9\xf6\xae\xd9\x99\xff\x69\xbc\x6c\x4e\x52\xc5\x07\x0f\x04\x9d\xfe\xf2\x74\x7a\xf0\x40\x5d\xae\x1b\xf0\x40\xb0\xe2\x40\x55\x19\x82\xaa\x02\x1e\xa8\x79\x32\x1d\x0f\xd4\xb5\x89\x62\x67\x4e\xe8\x7c\x80\x23\xb8\x21\xe0\xc8\x35\xd3\x74\x39\x38\x72\x40\x70\x0d\xa8\xc2\xff\x05\xdc\x10\x10\x12\xb8\xa1\x16\xdc\x50\x6e\xe2\x06\x7b\x67\x86\xcc\x77\x8e\xc3\x0b\xd9\xd8\x48\x1c\x8a\x38\x48\x3a\x3d\x48\xc0\x0a\x81\x15\x02\x2b\xd4\xf4\xe4\xf1\x58\xa1\x2e\xef\x99\x9d\x39\xa1\x86\x8b\xe6\x24\x15\x7b\x30\x42\xd0\xe4\x2f\x4f\x93\x07\x23\xd4\xe5\xba\x01\x23\x04\xdb\x0d\xd4\x94\x21\xa8\x29\x60\x84\x9a\x27\xd3\x31\x42\xdd\x9a\x26\x76\xe6\x83\xce\x05\x34\x82\x0d\x02\x86\x5c\x33\x4d\x97\x83\x21\x07\x04\xd5\x80\x28\xfc\x5f\xc0\x06\x01\x1d\x81\x0d\x32\x05\xe9\x36\x70\x42\xbd\xb2\x40\xb6\x6a\xab\x0c\xe3\xa7\x38\x5c\xf0\xa4\x5a\x01\x8e\xfb\x3a\xcd\x6b\xa5\x33\xae\x24\x3a\x7e\xef\x53\x24\x8f\xa8\xd5\x51\x59\xc1\xbf\x56\x92\xdd\x63\x33\x16\xcb\xbc\x10\xbc\x66\xad\x5d\x46\x6e\x3f\x76\x35\xf6\xfd\x63\xa9\xe6\x15\xca\xb6\x0d\x35\xb5\x2b\x55\x1d\xfc\xf4\x24\x24\x4e\x3b\x9a\xc9\x8b\xad\xd6\x46\x19\xa5\x69\x35\xfc\xaa\xd4\xe3\x9c\x67\x8f\x79\x69\xd3\x33\x07\x14\x55\xfa\xce\x2d\x1e\x7d\x4e\x05\xbb\xbf\xfa\xf5\xdb\xb7\xff\xfe\x7a\xf7\xfb\x7f\xdf\x5f\x95\xb5\xb6\x4d\xc6\x68\x45\xea\x44\x3c\x4f\x13\x41\x45\xb5\xa7\xbe\xd5\x39\x7f\x66\x71\x24\x4d\xbe\xfe\x38\x37\x36\x29\x8d\x3c\xcb\x47\x78\x26\x58\xb5\x26\xb1\x29\x60\x3d\xca\x59\x18\xe7\x41\x26\x74\x9f\xc7\xec\x43\xbd\x8e\xb8\xfe\x9c\x2d\xa4\x5d\x6f\xc8\x97\xb6\xe6\x85\xa9\x0f\xed\x12\x9f\xc6\xb2\x10\xd9\x13\x4f\xde\x32\xa9\x32\xea\x16\x55\x5e\xf6\xd5\xb8\x97\x0b\xba\xcb\x90\xde\x77\x63\xb6\x95\xcf\x7d\xdd\xe5\x5c\x6b\x33\xba\x63\xae\x2c\x80\x2d\xd0\xcd\x8d\xf8\x6a\x19\xea\xf5\x5f\x49\x04\x36\xd1\xfc\x83\x60\x33\xc1\x8b\x45\x26\x58\xc4\x0b\xc1\x96\x26\xc2\xb6\x24\xa4\x86\xe2\xa6\xd0\x75\x1a\x9b\xce\xad\x6b\x76\x47\xf2\xad\x61\xfa\x9b\x99\xb8\x26\x0b\x5e\x07\xc4\xe2\x1f\xd5\x5a\xe9\xc6\x48\x5c\x29\xe1\x90\x8b\xc2\x14\x26\xb7\xc5\xee\xb5\xc0\x6b\x55\xd2\x7d\xae\x7d\x23\x94\x31\xfb\x1e\xcb\x40\x2c\x55\x67\xb0\xb3\x69\x55\x97\x7a\x09\xf6\x5a\x15\x7a\xdf\x11\xf3\x2a\x35\xce\xb5\x2e\xfd\x14\xab\x45\x6e\x4b\xef\xbb\x9a\xd8\x7a\x37\x94\x85\xd1\xcd\xdf\xca\xfd\xc7\x5e\x8b\xbf\x02\x91\x96\xe5\x6f\x4d\x93\x6a\xe6\x3f\xf2\xc6\xa7\x8f\xb7\xfd\x33\xe5\xf9\xa9\xe6\x03\x5f\xee\x4a\xac\x77\x96\x30\xab\xc1\x2b\xe3\x7e\x09\x95\xf6\x99\xe5\xd7\xf4\x1b\xa4\xe3\x89\x8c\x19\x7d\xde\x55\xcf\x0f\x17\x42\xc3\x0c\xf1\x57\x1a\x5b\x40\xf0\x3a\x12\x52\x64\x44\x1c\xce\xb4\x62\x5f\x28\x36\x8b\x67\x85\x10\x92\xcd\x63\xb9\x28\x44\xfe\x46\x2b\x90\xd4\xb7\x59\x1c\xb9\x6a\x1c\x06\xb3\x30\x25\x2b\x63\x79\xbb\xb2\x8b\xcc\x9d\x18\x3a\x2c\xf2\x7f\x6f\xff\x0f\xfb\xdd\x66\xcd\xff\xa4\xbb\x20\x42\x6b\x36\x28\x54\x64\x3a\x68\x9f\xf4\x23\x2a\xd4\xa3\x90\x7e\xc8\xb6\x04\xbb\x14\x22\x5c\xaa\xdc\xae\x4f\xf2\xb7\x5a\x60\xa4\xfe\x66\x22\x2f\xb8\x29\xf7\x1f\xdb\x62\xcf\xae\x4a\xfd\x6a\x99\xfe\x31\xfb\xa6\x3f\xfd\x23\x76\x85\x1f\xec\x57\xf4\xcc\xd8\x63\xc0\x18\xd7\x6d\x71\x74\x53\x0d\xdc\xeb\xe9\xd4\x43\x57\xfe\xbd\xa2\xbf\xeb\xc1\xd2\xe0\xb6\x8a\x85\xda\xa5\x0e\x93\x61\xdf\x2d\x6e\x29\xfe\x2a\xd8\xa3\x78\x36\x65\x0d\xfc\xaf\x13\x7d\xc9\x54\x4b\xd5\xff\x78\x88\x35\x9e\xcc\x59\x2c\x2b\x02\xf1\xcf\xfb\x85\x5c\xa9\xed\x9e\xb3\x6b\x5f\x06\xc3\xe4\x3a\xce\xc4\x8e\x15\xfa\x97\x84\xb1\x5a\x9c\xdf\x96\x48\x20\x4c\x44\x46\x04\xbd\x20\xf5\xbf\x66\x52\x1e\xc5\xb3\x39\xb0\xcb\x86\xef\xaf\xdc\x90\xef\xaf\xa8\x34\x76\x9d\x86\xa2\x24\xcc\x8b\xd4\x64\x6e\x36\x07\x84\x85\xd2\x39\x1d\x42\xe5\x1d\x41\x33\x47\x0b\xc0\x9e\xc6\x55\xe9\xe5\x2b\xd5\xc1\xed\xb6\xf1\x37\x87\xad\x0c\x61\x67\xcc\x18\xb2\x0a\x36\x8f\xf3\x9c\x6e\x84\x9a\x35\x6d\xd7\x93\xd7\x2d\xbd\x6e\x1c\x1f\xda\x9d\xb6\x77\x2c\x17\x65\xb5\x08\xbd\x37\xb2\x38\x28\x7c\x79\x6e\x7d\x3c\xf9\xb1\xfb\xe2\x28\xcf\x76\x9e\x0c\xcf\x54\xaf\x54\x23\x9e\x44\xf6\x5c\x3c\xc4\x32\xda\x75\xf8\xd4\xda\x77\xdb\x9b\x93\x91\x41\xc2\xa7\x22\xe9\x4c\x06\xd4\xda\x31\x64\x40\x55\xd7\x8d\xd5\x71\xce\xff\x8a\xe7\x8b\x39\x93\x8b\xf9\x54\x64\x66\xf4\x56\x7d\x31\xf2\xa1\x62\xe3\xc4\xf7\x96\xb5\xf2\xe9\x18\xa6\x8b\x38\xd6\xbd\x30\xa5\x53\x56\x4f\x37\x7d\x7d\xeb\xdf\xfd\xaf\x5b\xeb\xff\xeb\xaa\xb7\xc8\x52\xde\xae\xb0\x8a\x51\x7a\xcd\x06\xa4\x93\x28\xe0\xd2\x95\x47\x2a\xcf\xd2\x9c\xcf\xf5\xe1\x12\x17\xb1\xbf\x74\x4d\x2f\x35\x3c\x10\xe5\x69\xa9\x3f\x6d\xc6\xa2\xa7\x49\x83\xd4\xa2\x30\x70\xcd\x8c\xdd\x5c\xb6\x66\x6c\xe2\x07\x1d\x3b\x5c\x56\xad\xd1\xfa\xa0\x9b\xab\x85\xa4\x66\xcc\x28\x5f\x2f\x52\xfd\x31\x53\x20\x4a\xff\xe6\x8d\x3b\xdd\x0c\x22\xe4\x74\xa0\xbb\xb7\xdd\xda\xd1\x27\xdb\x2c\x4e\x0a\xa1\xef\x38\x7d\xef\xe8\x63\x24\xa8\x63\xd8\x1a\x0a\x31\xb6\xfb\xc0\xbb\x93\xd5\xef\x28\x53\xe6\xa5\x10\xd9\x3c\x96\xc2\xdf\xe6\x35\x50\x44\x67\xe9\x13\x8f\x13\x8d\x1a\x4b\x7c\xae\x87\x1c\x3c\x28\x95\x53\x3d\x78\xdd\x8e\x3d\x43\xed\x5c\x68\xb1\xf0\x2c\x5a\x10\x6c\xe7\x32\x74\x37\x14\x09\x49\x8f\xcd\xf6\xc7\x37\x5d\x4a\xf7\xcb\x8c\xf9\x25\x55\x82\x11\x87\x6f\x96\x06\x10\xe7\x4c\xcc\xd3\xe2\xb9\x0e\xc4\x3c\xfa\xe6\x85\xc6\x2c\x9b\x06\xb4\xe9\x32\x88\x67\x4b\x57\x81\xb9\x3d\xfc\xba\x8c\x16\x3c\xe3\xb2\x10\x8e\x10\x29\xeb\x34\xe5\xe5\xb6\xa7\x1b\x65\x41\x14\x85\xef\xbb\xbf\xd8\x3c\xe4\x2b\x14\x8b\xf3\x7c\x61\x95\x80\x58\x46\x89\x28\x77\x88\x47\x19\x6e\xc1\x5d\x3b\xb3\xbd\xd6\x3a\xfc\x27\x77\xbb\x69\xdd\x25\x4b\x3a\x46\xbe\x10\x61\xe3\x75\x4b\xba\xce\x62\x9a\xeb\x87\x65\xe1\x47\x10\x56\x9c\x0b\xfe\xb0\x6a\x4a\xae\xe6\xa2\x88\xe7\x42\x8f\x7d\x26\xb2\x8c\x0a\x59\xe9\x9b\xb9\x86\xa8\x4a\x80\xa1\x67\x54\xc8\x7c\x91\x09\x5f\x19\xc1\x42\x24\xc7\x49\x18\xa9\x99\x21\xd3\xc6\x24\x30\xc4\xf2\x39\x4f\x12\x91\xb1\xe0\x61\x21\x1f\x89\x57\xe4\x4c\x1f\x9b\x2c\xe1\x59\xe4\x26\x9a\x76\xbc\x69\xde\x68\x64\xb9\x10\xb4\xf0\x52\x95\xe7\xb1\x5e\x70\x56\x6c\xb4\xe0\xaa\xfb\xcb\x38\xba\x85\xa5\x4e\x46\xdf\x11\xa1\x99\x0f\x82\xdf\xf6\x82\xb7\x6b\xd8\xd6\x56\xa3\x5e\xff\xe0\xb9\xe3\xcb\x9c\xde\xa9\x65\xb2\x8a\x70\x0c\xee\xe7\xb9\x9e\xe0\x60\x91\x98\xfa\x62\xe5\xb2\xd9\xf9\xf4\xd7\x42\x6a\x3e\xf5\x9b\x0a\xac\x5d\x90\x17\x67\xbb\xd1\x2c\x63\xb7\x5c\x14\x6e\xe1\x16\x19\x8f\xf5\xc9\x2d\xd9\x0f\x3d\xc3\xee\x49\xb7\x0a\xf4\x63\x6e\x2f\xf9\xa2\x61\x99\xab\xdd\xa6\x4f\x4c\xe1\xd9\xad\x8a\x09\x30\x56\x37\xa1\x0a\xf2\x1b\xda\x2b\xfa\x84\xbe\xa1\xd5\x7e\xcd\xd3\xf8\x86\xa7\xf1\x75\xa0\xa4\x56\xf9\xf2\x9b\x9f\x7c\x41\x30\xff\xc1\x19\x6d\xeb\x82\xc7\x49\x4e\x47\x52\x15\x40\x90\x3f\xce\x8e\xe2\x5e\x1a\xfc\x11\xe5\xfe\x95\x8e\x5b\x7f\x25\xe5\x54\xd6\x6d\x79\x6e\x34\xd4\x48\xd3\x24\x36\x07\x8c\x3f\x25\x8d\x9f\x53\x9c\xb3\x87\x38\x7a\x20\xf7\xa7\x40\xcd\xe7\x42\x52\x45\xbd\xea\xcc\xd5\xbe\x65\x0d\x03\x5a\xa4\x65\x4b\xfa\xd0\xce\x44\xd3\x87\xf5\xb3\xa7\x37\xa3\x5f\x57\xad\xd3\xfd\x4e\xeb\x1f\xf1\x5c\xe8\x0b\xcb\x19\x2c\xb4\x68\x0d\x3d\x62\x21\x1f\x5d\x1a\x74\x68\xe5\xa6\xc2\x9c\xb3\x00\x38\x9c\xc2\x93\xe4\x2d\xcb\x44\xc4\xb3\x90\x28\x67\x7d\xca\xcb\x67\xc6\x83\x22\x7e\x8a\x8b\x67\x7d\xb3\xc5\xd2\xfd\x6f\xd7\xf3\xa5\x30\xdd\x6b\xaa\x4c\xd9\xf7\xb1\xf9\x2f\xa3\x38\xaa\xac\xca\xcf\x98\x1a\x7b\xfa\xb9\x29\x5d\xad\x66\xf2\x4c\x4d\x40\x8b\x99\x8a\x07\x31\x37\x97\xa9\xe1\x0c\x48\x20\x61\xf8\xd6\x5e\x57\x6f\xed\xb3\x73\xf5\x44\x88\xac\xa2\x4a\xb2\xef\xa6\xc4\xd0\xf2\x72\xde\x55\x68\x0d\x14\xc7\xde\xf6\x3c\xfb\xd3\x9f\x1d\x13\x6c\x0d\x75\x96\x7b\xe2\xd9\xaa\xe4\x9a\x74\x08\x40\xcd\xd8\x63\x2c\x37\x38\x36\x75\x42\xb2\xbd\x2d\x35\x00\xd2\x72\x2c\x5a\xd4\x4a\x44\xa9\xda\x8c\x6a\x2a\x71\xa5\xed\x4e\x29\x3a\xd0\x73\xa0\xe7\x4e\x8f\x9e\x03\x35\x07\x6a\x0e\xd4\x1c\xa8\x39\x50\x73\xa0\xe6\x40\xcd\x81\x9a\x03\x35\x07\x6a\x0e\xd4\x1c\xa8\x39\x50\x73\xa0\xe6\x40\xcd\x81\x9a\x3b\x79\x6a\x0e\xf9\x63\xc0\x3c\x82\x79\x04\xf3\x38\x80\x19\x05\xf3\x58\x17\x0f\x98\xc7\x01\x33\x8f\x4a\x65\x61\x2c\xa9\xf3\x8e\x79\xdc\x8b\x4a\x3c\x4a\xb0\xef\xd2\x6c\x47\xa2\x60\xb1\x9c\xa9\x6c\xee\x57\x37\x67\x86\xbe\x58\x4f\x00\x46\xa2\xf8\x50\x11\xc2\xdd\xe4\xcb\x7f\x2d\xbf\x81\x00\xe7\x1d\xd9\x37\x2f\xc4\x53\xe7\xde\x2a\x0b\xa3\xf2\xd6\xab\xea\x97\xb7\xef\xa7\xa7\xdb\xd3\xde\x52\x35\xa5\xd8\x9c\x95\xed\xf7\xd3\x3f\x6f\xef\x26\x5f\x7e\x6f\x7a\x0f\xbb\x6a\xf7\x5d\xe5\x04\x49\x71\xc2\x67\xb4\xb9\xfe\xe7\xe9\xf6\x45\xfb\x2b\x11\xbc\x3e\x77\xdd\xfb\xc0\x18\x03\x6a\x66\x4d\x30\x4e\x43\x77\xee\x2f\xff\xd0\x1d\xd8\xb0\x2b\xf4\xdb\xf5\x6d\x41\x6f\x7c\x56\xd9\x5d\x92\xfc\x3f\x3e\x17\x79\xca\x07\xb2\x3f\xe0\x5c\x62\x73\x5e\x54\x97\xda\xd3\xed\x98\x26\xec\xbc\x37\xde\x76\x67\x92\xce\xc2\xbc\x57\xf7\x71\xb3\x2f\xc9\xf2\xc6\x5a\xf6\x1b\x81\xcb\x08\x5c\x46\xe0\x32\x02\x97\x11\xb8\x8c\xc0\x65\x04\x2e\x23\x70\x19\xd9\xe5\xb4\x85\xcb\x08\x5c\x46\xe0\x32\x02\x97\x11\xb8\x8c\xc0\x65\x04\x2e\x23\x17\xe7\x32\x02\x9f\x0a\xf8\x54\xc0\xa7\xe2\x34\x66\x14\x3e\x15\x75\xf1\xc0\xa7\xe2\xb4\x7c\x2a\x9e\x6e\x6f\xa4\x67\x79\x4c\xc8\x36\xfd\xfc\x9f\x06\xea\xca\xe0\x9d\x6e\xd9\x2b\xd3\x26\x0b\x54\xa2\xd5\x2b\xbb\x4c\xb7\x91\x56\xe6\xa5\x3a\x6d\xf5\xc1\xb7\xe0\x59\xab\x70\xa5\x9d\x7e\x8b\x4d\xf4\x42\xae\x7e\xa4\xb1\x7e\x23\x81\xe5\x9d\xd4\x91\x80\x2d\x17\xb6\x5c\xd8\x72\x61\xcb\x3d\x37\x5b\x6e\xbb\x0a\x24\x8d\xf6\xdc\x83\x15\x87\x41\x0d\x9f\xd6\x13\x75\xcc\x1a\x3e\x07\x33\xc0\xef\x50\x35\xa7\xd1\x00\x7d\x30\x89\xfc\x51\xd5\x24\x62\xad\xc5\x13\xc0\x67\x53\x31\x33\x9e\x02\xde\x58\x53\x42\x09\x7b\x7a\xd1\xd2\xa9\x54\x2d\x92\x4a\x5e\x4b\x11\x71\x5a\xa0\x56\x17\xa8\x56\x37\x32\x86\x5b\xbf\x35\x2c\x42\x8c\xe7\x73\x11\xc6\xbc\x10\xc9\x73\x49\xe1\x97\x57\x6e\x9c\xbc\xb5\x58\x9f\x84\xce\xa2\x8c\x07\xb4\x6b\x62\x15\x7a\x40\x50\x5e\xda\xe4\x1f\xe1\x56\xe9\x22\xd7\x9d\xac\x4e\x17\xd7\x6f\xba\x01\xd9\x8f\xcc\xcc\x19\xe8\x9a\x18\x9b\x7e\x9a\x52\x8e\x0d\x7d\xdc\x63\x9a\xa9\xcf\x13\xea\x72\x93\xfe\xb4\x45\x83\x1a\xca\xf2\xdf\x85\x7b\x69\x27\x97\xf5\xfc\xcb\xc1\x96\x3f\x98\x18\x30\x31\x60\x62\xc0\xc4\x80\x89\xe9\x8d\x89\x69\x79\x17\xac\xb0\x31\x87\xbb\x16\x3f\x56\xf2\x05\xa6\x64\x1e\xf3\x47\xd0\x24\x53\x29\x8f\x08\x1d\x4d\x54\x12\x07\xcf\x35\xbf\x3f\xb7\xe8\xca\x84\x83\x7a\xd9\xdd\x8e\xff\x3e\x66\xdf\xcd\x79\x66\xa0\x4b\x2a\xa4\xde\x2c\xe5\x9d\x2a\x98\xca\xd2\x07\x2e\x9d\x1f\x62\xb6\x10\x37\x33\x9e\x38\x5d\xf9\xfe\xca\xfc\xf9\xfe\x8a\xcd\x62\xc9\x93\xf8\xdf\xee\x22\x99\x0a\xc6\x43\x32\xcf\xab\x1b\x63\xba\x0c\x4b\x35\xcc\x34\x3f\xca\xcb\x97\x8c\x7e\x3a\x66\x9f\x62\x3a\x1c\x2b\x5d\x57\xd9\xea\xd8\x4a\x32\xa6\x30\xea\x31\xe9\x28\xaa\x78\xd8\x67\x42\xcd\x08\x3e\xba\xb1\xaf\x85\x3c\x7b\x15\x9a\xde\x49\x31\xa3\xa1\xeb\x0d\xfb\xa0\x7e\xb0\x88\x67\x53\x1e\xd5\x0c\x93\x5e\xa9\x11\xd9\x4c\x65\x73\x3d\x27\x8d\xf2\xfa\xb6\x34\xa2\xf5\xe2\x22\xd0\xeb\x10\x6b\x6a\x64\x1b\x6b\x34\x19\xc4\x61\xa9\x0a\x13\x56\x30\xf5\xc0\xdd\x1c\xe7\x14\x50\x46\x7f\x75\x68\x60\x5c\x99\x4c\x77\x8f\x78\x36\xc4\xfb\xd4\xd6\x3f\x36\x66\x77\x41\x20\x52\x53\x0f\xb4\xaa\xd9\x8d\xcc\x18\x46\xec\xda\x2e\xc0\xfa\x02\xcd\x7f\x61\xa3\x5f\x79\xf0\x18\x65\x6a\x21\x43\xfd\x14\xf9\xa7\xd2\x43\x4b\x82\x33\x10\xd2\xe2\xe3\x7a\x23\x6e\x04\x53\xdf\xd2\x2f\x6c\xf4\x59\x65\xa2\xd2\x2c\x0b\x78\x1e\xf0\x50\x8f\xde\xca\xc7\xb8\x2f\x53\x7b\xb9\x51\x3d\x57\x1a\x9c\xf9\x36\xf6\x59\x90\xe9\xf2\x72\x3f\x0e\xe2\x3c\x63\xda\xb4\xdd\x3c\x6c\xa2\x4e\x8f\x35\x0b\x20\x51\x7b\x9b\xdf\x55\x22\xf5\x70\xb6\x8d\x63\x52\xaa\xed\x84\xb5\x81\x56\x7d\x29\xfe\x69\x64\xe9\x10\x03\xb9\x23\x4d\x67\x0b\xdb\xb7\xe3\xe7\xce\x32\x02\xcb\xdc\xc9\x25\x5e\x3a\x99\x68\xac\xc1\x47\x64\x76\x40\x68\x23\x9a\xec\x72\xa2\xc9\xda\xdd\x28\xdb\x22\xca\x0e\xa7\x7a\xc1\x1f\x01\xfe\x08\xf0\x47\x80\x3f\x02\xfc\x11\x9a\x0e\x5f\x10\xdd\x27\x24\x11\x70\x9f\xe0\x3e\xc1\x7d\x82\xfb\x04\xf7\x09\xee\xf3\xbc\xb8\x4f\xd0\x11\xa0\x23\x40\x47\x80\x8e\xe8\x9d\x8e\xd8\x81\xb2\x1f\x68\xbc\x57\x3b\x11\xae\xc6\x7c\xbd\xd4\xe2\x36\x28\x22\x67\xed\x0b\x48\xd6\x87\x64\x7d\xe7\x9e\xac\xcf\x02\x46\x2a\xfd\xa0\x0f\x13\x3d\x3b\x2c\x0f\x54\x2a\xde\xb2\x7c\x11\x3c\xe8\xd3\x87\x4e\x77\xc1\xe7\xe6\x68\x4a\x33\x45\x00\xb5\x29\x70\x74\x73\x21\x08\x22\x86\xea\x7f\x46\x35\x88\x6d\xa3\xb1\x3f\xfd\x59\x4e\xb2\xca\x3b\x26\x01\x8d\xb2\xc6\xf8\x56\xbe\xcf\x3c\xd8\x39\xe3\xb7\x5f\x08\xeb\x86\xa5\xd3\xc3\x39\xd8\x49\x38\x2b\x42\xaa\xaa\x13\x3e\xd8\x90\x2a\x32\xc1\x7c\xe5\x92\x47\x22\x33\xc6\x44\x73\x3c\xe6\xb9\x0a\x62\xd2\x8e\xbd\xd9\x8e\x93\xf5\x55\x65\x4c\xc8\x42\xc3\x55\x67\x2e\x98\xf3\x47\x2d\xc5\xe2\x41\xe4\xc2\x61\xbe\x6a\xe0\x90\x0b\x30\x22\xcc\x4b\x26\x3a\x95\xb1\xdb\x77\x3f\xeb\x67\x33\x1e\x10\x27\x97\x28\x19\x19\x84\x47\x66\xb4\x40\xc9\x82\xc7\xd2\x9c\x49\x64\xa6\x2a\x9f\x25\x9e\xc2\x32\x86\x6c\xfa\xec\x95\x98\x48\x25\x5c\x46\x63\x95\x45\x37\xe9\x63\x74\xb3\x90\x71\xa0\x42\x71\xf3\xd3\x97\x7c\xa2\x5b\xd9\xdb\xee\x6d\x85\xd3\xe5\xf4\x0c\x0a\x12\x9e\x22\x52\x6b\x8b\xd2\xde\xb5\x40\x69\x1f\x8c\xf9\x6e\x38\x5d\x7e\xb7\xb5\xcb\xc6\x3d\x78\x38\x7d\x3e\x47\x30\x4c\xd0\x63\xe0\x60\xf8\x15\xeb\x24\x99\x88\xf9\xd5\x7f\x0e\x94\x53\x64\x3b\xf4\x6a\xca\x23\x82\xec\x21\x80\x5b\x67\x00\xb7\x10\xaf\x7d\x41\xf1\xda\x08\x4c\x43\x60\x1a\x02\xd3\x10\x98\x06\x4d\x71\xdd\x2e\x1a\x64\x14\xc8\x71\x34\x30\x04\xb1\x6c\x50\xc6\xac\x3a\x32\x70\x75\xcc\x9b\xad\x3b\x0f\x5d\xc9\x04\x0f\x97\xa0\xd7\x36\x25\x4a\xbf\xd2\x77\xbc\x4a\x05\x8c\x88\xbf\xc8\x0b\x6d\xaa\x7f\xe2\x41\x31\x66\xec\x93\xfe\xd7\xfd\x7e\xce\x63\xb2\xe8\xe5\x2c\x48\x16\x79\x21\xb2\xf2\x8a\x31\xee\xaa\x2c\x89\x1f\x05\x1b\xf9\x3e\x8e\x34\x92\x74\xe8\x67\xcc\x26\x09\x97\x52\x18\x08\x4a\xf8\x84\x27\x06\x12\xdd\xfe\xbc\xcf\x99\x4d\x7d\x3c\x12\x72\xf0\x42\xf3\xc0\x7b\xea\xc4\xa7\x47\xca\x3e\x19\x89\xe9\xdb\x22\xcd\x9d\x74\xac\xa3\xd6\x22\x17\x19\x79\x58\x95\x18\xfa\xb9\x67\x41\xe9\xce\x9c\x2f\x1f\x3e\xec\x2b\x0d\x56\xb9\xe5\x8b\x20\x12\x83\x37\xca\xbd\x84\xa1\x26\xee\xc5\xda\x47\x1a\x3e\xdd\x86\x78\x1e\x0a\xe7\x0c\xb2\xfd\xe4\xc8\x76\x72\xdc\xd9\xab\xd4\xf0\x35\xbd\xfb\xb7\xcd\x27\xf4\x5c\x64\x91\x68\xf5\x64\x5e\x64\xbc\x10\x51\x1c\x5c\xb7\x7f\x47\xff\xfc\x6c\x9f\xa4\xbb\xa0\x0d\xae\x4a\x79\x56\xc4\x14\x57\x67\x9c\xcc\x76\xc4\x58\xf4\xb5\x81\xd8\xa9\xfb\x72\x11\xd8\xa0\x97\x4c\xea\x9e\x5e\x0c\xd6\xeb\x33\xb7\x5e\x5f\x8e\xb3\xc0\x52\x7c\x8a\xdb\x5c\x26\x86\x4a\x9f\x34\x65\x5c\xfe\xeb\x35\xa7\xd0\x1b\xb2\xdd\x99\xc0\x69\x9e\xd0\x9b\x52\xc9\x6b\xf3\x36\x3d\x41\xe6\xf3\x9c\xbd\xfe\x2d\x57\x72\x62\xc2\xd3\xbf\xea\xf3\xce\xfe\xfc\xdd\x9d\x82\xe5\x2f\xdf\x0c\xc9\x8b\xa1\xfd\xba\xf9\xac\xb2\x80\xf8\x85\x48\xd1\xe4\x2b\x76\x7f\x35\xd3\xbf\xbb\xbf\x62\x77\x35\x69\x92\xf7\xbb\x21\x03\x48\xd7\xb1\x1b\xf5\x9a\x07\x34\x01\x14\xe0\x9c\xc4\x81\x35\x6f\x92\x6a\xa4\x7e\xd8\xb9\x35\x01\xc0\xa9\x50\x69\x22\xc6\xcc\x7c\x93\xf2\x1a\xb8\x35\x45\x3e\xe8\x8d\x13\xe1\x3f\xbf\x8f\x78\xf5\x87\xa0\x21\x99\x3f\x40\x43\x3a\xb6\x86\x94\x2e\x39\x6f\x0f\x5c\x47\x5a\x74\x6e\x29\x4b\x13\x1e\xec\x0a\xe4\xec\x5b\x67\x0e\xe5\xe0\xed\x09\x00\x77\x29\x00\x6e\x40\x38\x09\xd7\xb9\xff\x0b\xbc\x3d\x2f\x01\x81\x2c\x06\x6f\xa3\x7d\xc5\xda\x3a\x4e\x52\x34\x5b\x43\xd1\xb5\xce\x29\x3e\x9b\xf1\x40\x86\xf1\x53\x1c\x2e\x78\x52\x8d\x9e\xe4\x3e\xc7\x09\x8d\x75\x5c\x71\x0c\x7a\xef\x5d\x8a\x46\xd4\xc2\xa8\xcc\x74\x55\x4b\x5d\xe4\x01\x0f\x8b\x65\x5e\x08\x5e\x33\x3d\x2e\xc3\xa1\x1f\xab\x76\x2d\x1f\x20\xf7\x59\x65\x77\x49\xe2\xb1\x51\x7e\x35\x80\x43\x6d\xed\x0b\x97\x15\xd5\xb8\xc1\x54\x47\x41\xb9\x9f\x9e\x84\xbc\xe8\x00\x47\x9a\xc4\x73\x8f\x72\x44\x12\xc9\x33\x4e\x22\xb9\x9d\x22\xda\x96\x40\x72\xff\x12\xa6\xed\xe8\x2f\xa4\x8d\x44\xda\x48\xa4\x8d\x44\xda\xc8\x73\x4b\x1b\xb9\xfd\xe4\x6d\x4c\x19\xd9\xb3\xb3\xc1\xc1\x12\x45\x6e\x1f\xfe\xfa\x24\x91\x43\x96\xc1\x2e\xa9\x21\xb7\xcb\x60\x7d\x5a\xc8\x9e\x65\x80\x64\x90\x48\x06\x89\x64\x90\x48\x06\x89\x64\x90\xbd\x25\x83\x6c\x71\xfa\xaf\x24\x82\xdc\x18\x69\x78\x41\xbe\x86\xed\x46\x73\xc6\xc9\x2c\xb7\x8b\x7b\x53\x22\xcb\xc3\xca\x1d\xe9\x2b\x7b\x99\xd1\xd5\xd4\x95\x3d\x4f\xeb\x51\x13\x56\x6e\x17\xcf\x86\x64\x95\x7d\x1f\x9b\x43\x4d\x51\xb9\x5d\x68\x0d\x24\xc6\xde\xf6\x3c\xfb\xd3\x9f\xbb\x92\x61\x1b\x73\x89\x5c\x32\x47\xb6\xe4\x30\xf4\x8f\x25\xa2\x01\xec\x18\xd8\x31\x06\x76\xcc\x3e\x09\x76\x0c\xec\x18\xd8\x31\xb0\x63\x60\xc7\xc0\x8e\x81\x1d\x03\x3b\x36\x38\x66\x08\xec\x18\xd8\x31\xb0\x63\x60\xc7\xc0\x8e\x81\x1d\x03\x3b\x76\x8a\xec\x18\x52\x90\x80\x16\x04\x2d\x08\x5a\x70\xd0\x33\x0a\x5a\xb0\x2e\x1e\xd0\x82\xe7\x48\x0b\x36\x94\x18\xe8\x89\x1d\xac\x52\x82\xd2\x01\x1f\x35\x63\x8f\xb1\x0c\x3b\xa4\x06\xdf\x96\x4a\x0e\x29\x72\x16\x10\x6b\x3d\xa9\xd4\xde\x46\x35\xad\xbf\xd2\xf6\xcb\x88\x45\x90\x8a\x20\x15\x4f\x8a\x54\x04\xa1\x08\x42\x11\x84\x22\x08\x45\x10\x8a\x20\x14\x41\x28\x82\x50\x04\xa1\x08\x42\x11\x84\x22\x08\x45\x10\x8a\x20\x14\x41\x28\x82\x50\x3c\x15\x42\x11\xe5\x19\xc0\x8d\x82\x1b\x1d\x2a\x93\x06\x6e\x14\xdc\x28\xb8\x51\x70\xa3\x4b\x42\x3b\x2a\x37\x3a\x15\x05\xbf\xbd\xd9\x8b\xf6\x3c\x4a\x26\xe0\xa5\x59\x8f\x44\x51\x57\x57\xcc\x04\x6f\x60\x2f\x23\x51\xd4\xb9\x4b\x92\xc0\xdd\xe4\xcb\xef\x4d\x2f\x23\x0b\xf2\x8e\xa4\x62\x45\x90\x14\x5e\x7a\x5e\xcc\x22\xad\x95\xca\xdb\xaf\xaa\x3d\x68\xbf\xdd\x0e\x10\x89\x6c\x2c\x5d\x99\xd5\x95\x9d\x2a\x55\x73\x33\xd8\xb0\x49\xf4\xdb\x0d\xbb\x84\x5e\x43\x7e\xdd\x65\xd1\x0f\x66\x5f\x2e\xa7\xfa\xa6\x49\x1b\x97\xb1\xde\xe7\xbd\x19\xb7\x73\xfd\x83\x8b\x1d\x5e\x1a\x02\xf8\x7e\xf0\xfd\xe0\xfb\xc1\xf7\x83\xef\x07\xdf\x0f\xbe\x1f\x7c\xff\xf6\xd3\x16\x7c\x3f\xf8\x7e\xf0\xfd\xe0\xfb\xc1\xf7\x83\xef\x07\xdf\x7f\x71\x7c\x3f\xb8\x62\x70\xc5\xe0\x8a\x4f\x63\x46\xc1\x15\xd7\xc5\x03\xae\xf8\x34\xb9\xe2\xd6\xd9\x75\x0d\xe8\xe9\x96\xd6\x32\x6d\xb2\x40\x25\x5a\xc7\xb2\x6b\x75\x1b\x9b\x65\x5e\x6a\xe0\xb3\x3e\xf8\x66\x8e\x56\x4a\xbb\x17\x12\xf6\x23\x0d\xf8\x1b\x49\x2d\xef\xa4\x7c\x36\xac\xba\xb0\xea\xc2\xaa\x0b\xab\xee\xb9\x59\x75\xdb\x15\x5e\x6f\xb4\xec\x1e\xac\x26\xfe\xbf\xb4\xe0\xac\x3e\xfb\x96\x92\xcb\x07\x7a\x45\x99\x75\x50\x1b\x5b\x95\x41\x9d\x0a\x96\x6a\x69\xe5\x5a\xf5\x63\x77\x92\xc5\xd2\x9c\x2c\x2a\x63\x0b\xe9\x0f\xa7\x90\x99\x72\xff\x2c\x8c\x33\x7d\x15\x3e\x09\xbf\xe2\xf5\xf1\x49\xd6\x07\xbb\xe5\xdd\xda\xb0\x02\x66\xb3\x45\x46\xbb\x2c\xcd\x54\x20\x72\x32\x13\x58\xe0\x68\x57\xd9\x98\xfd\x93\xbe\x48\xb3\x45\x6b\xe7\x3d\xbb\x66\x77\x49\xf2\x9e\x8c\x00\xa1\x3e\xa5\x17\x52\x4f\xbc\x86\x60\x6e\x49\xda\xe6\x56\x4b\xa0\xb7\x98\x28\x33\x96\xe3\x4c\xd3\xc1\x4c\xf1\xed\x44\xb1\xde\x1c\x7f\x30\x89\xfc\x51\xd5\x29\x62\xad\xcf\x13\xd4\x67\x53\x31\x33\x3e\x03\xde\x6c\x53\x42\x09\x7b\x7a\xd1\xd2\x59\x08\x73\x39\x4c\x35\x9a\x96\xd7\x52\x44\x9c\x16\xa8\xd5\x0a\xb4\x02\xe3\x6e\x50\x63\xc2\xf5\x5b\xc3\xc2\xc4\x78\x3e\x17\x61\xcc\x0b\x91\x3c\x97\x64\x7e\x79\xe5\xc6\xc9\x5b\x8b\xfa\x49\xe8\x2c\xca\x78\x40\xbb\x26\x56\xa1\x07\x04\xe5\xa5\x4d\x9e\x12\x6e\x95\x2e\x72\xdd\xc9\xea\x74\x71\xfd\xa6\x1b\x90\xfd\xc8\xcc\x9c\x81\xae\x89\xb1\xe9\xe7\x5c\x70\xd9\xd8\xc7\x3d\xa6\x99\xfa\x3c\xa1\x2e\x37\x69\x52\x5b\x74\xa9\xa1\x2c\xff\x5d\x58\x98\x76\x72\x59\xcf\xc4\x1c\x6c\xf9\x83\x93\x01\x27\x03\x4e\x06\x9c\x0c\x38\x99\xde\x38\x99\x96\x77\xc1\x0a\x2f\x73\xb8\x6b\xf1\x63\x25\x93\x5b\x4a\x36\x32\x7f\x04\x4d\x32\x95\xf2\x88\xd0\xd1\x44\x25\x71\xf0\x5c\xf3\x00\x74\x8b\xae\x4c\x05\xa7\x97\xdd\xed\xf8\xef\x63\xf6\xdd\x9c\x67\x06\xba\xa4\x42\xea\xcd\x52\xde\xa9\x82\xa9\x2c\x7d\xe0\xd2\x79\x24\x66\x0b\x71\x33\xe3\x89\xd3\x95\xef\xaf\xcc\x9f\xef\xaf\xd8\x2c\x96\x3c\x89\xff\xed\x2e\x92\xa9\x60\x3c\x24\x43\xbd\xba\x31\x46\xcc\xb0\x54\xc3\x4c\xf3\xa3\xbc\x7c\xc9\xe8\xa7\x63\xf6\x29\xa6\xc3\xb1\xd2\x75\x95\xad\x8e\xad\xa4\x65\x0a\xa3\x1e\x93\x8e\xa2\x8a\x87\x7d\x26\xd4\x8c\xe0\xa3\x1b\xfb\x5a\xc8\xd3\x64\x12\xed\x56\x31\xa3\xa1\xeb\x0d\xfb\xa0\x7e\xb0\x88\x67\x53\x1e\xd5\xac\x93\x5e\xa9\x11\xd9\x4c\x65\x73\x3d\x27\x8d\xf2\xfa\xb6\x34\xa2\xf5\xe2\x22\xd0\xeb\x10\x6b\x6a\x64\x1b\x6b\x34\x19\xc4\x61\xa9\x0a\x13\x56\x20\xe3\x84\x9f\x63\x7d\x59\xdb\x9b\xd4\xa1\x81\x71\x65\x32\xdd\x3d\xe2\x79\x11\xef\x5d\x5b\xff\xd8\x98\xdd\x05\x81\x48\x0b\xba\x9b\xaa\x9a\xdd\xc8\x8c\x61\xc4\xae\xed\x02\xac\x2f\xd0\xfc\x17\x36\xfa\x95\x07\x8f\x51\xa6\x16\x32\xd4\x4f\x91\xa7\x2a\x3d\xb4\x24\x38\x03\x21\x2d\x3e\xae\x37\xe2\x46\x30\xf5\x2d\xfd\xc2\x46\x9f\x55\x26\x2a\xcd\xb2\x80\xe7\x01\x0f\xf5\xe8\xad\x7c\x8c\x23\x33\xb5\x97\x1b\xd5\x73\xa5\xc1\x99\x6f\x63\x9f\x05\x99\x2e\x2f\xf7\xe3\x20\xce\x33\x26\x50\xdb\xcd\xc3\x26\x12\xf5\x58\xb3\x00\x3a\xb5\xb7\xf9\x5d\xa5\x54\x0f\x67\xdb\x38\x26\xb9\xda\x4e\x58\x1b\x08\xd6\x97\xe2\x9f\x46\xaa\x0e\xb1\x92\x3b\xd2\x74\xdf\x0b\x5e\x2c\xda\xf2\x73\xe7\x1b\x95\x65\x2e\xe6\x12\x34\x9d\x56\x84\xd6\x69\x44\x6e\x76\xc0\x6f\x23\xcc\xec\x72\xc2\xcc\xda\x5d\x30\xdb\x42\xcd\x0e\xa7\x89\xc1\x3d\x01\xee\x09\x70\x4f\x80\x7b\x02\xdc\x13\x9a\x0e\x5f\xf0\xde\x27\x24\x11\x50\xa1\xa0\x42\x41\x85\x82\x0a\x05\x15\x0a\x2a\xf4\xbc\xa8\x50\xb0\x13\x60\x27\xc0\x4e\x80\x9d\xe8\x9d\x9d\xd8\x81\xc1\x1f\x68\x20\x58\x3b\x11\xae\x06\x83\xbd\xd4\xe2\x36\x28\x5e\x67\xed\x0b\x48\xea\x87\xa4\x7e\x17\x96\xd4\x0f\xd9\xf0\x07\x9e\xe1\xc0\xfe\xf4\x67\x39\xc9\x2a\xef\x98\x18\x34\xba\x1b\xe3\x5b\x39\x40\xf3\x60\x3f\x2c\xe0\x7e\x51\xae\x1b\xd6\x4f\x5f\x67\x63\x27\x61\xaf\x08\xbd\xaa\xce\xfa\x60\x43\xaf\xc8\x36\xf3\x95\x4b\x1e\x89\xcc\x58\x19\xcd\x41\x99\xe7\x2a\x88\x49\x6d\xf6\xf6\x3c\x4e\x66\x59\x95\x31\x21\x0b\x8d\x63\x9d\x1d\x61\xce\x1f\xb5\x14\x8b\x07\x91\x0b\x07\x06\xab\x01\x46\x2e\x10\x89\xc0\x30\xd9\xee\x54\xc6\x6e\xdf\xfd\xac\x9f\xcd\x78\x40\x64\x5d\xa2\x64\x64\xa0\x1f\xd9\xd7\x02\x25\x0b\x1e\x4b\x73\x3a\x91\xfd\xaa\x7c\x96\x08\x0c\x4b\x25\xb2\xe9\xb3\xd7\x6e\x22\x95\x70\x19\x8d\x55\x16\xdd\xa4\x8f\xd1\xcd\x42\xc6\x81\x0a\xc5\xcd\x4f\x5f\xf2\x89\x6e\x65\x6f\x83\xb8\x15\x4e\x97\xd3\x33\x28\xac\x78\xb2\x10\xae\x2d\x7c\x7b\xd7\x02\xbe\x7d\x30\xc6\xbd\x81\xf5\xfb\xdd\xd6\x7e\x1b\x87\xe2\x81\x75\xfc\x6c\xf1\x32\x01\x93\x53\xc0\xcb\xaf\x58\x77\x79\x49\x1a\xca\xfb\xf7\x98\x9e\x64\x3b\x44\x5b\x9b\x92\x04\x89\x48\x80\xc8\xce\x00\x91\x21\xf4\xfb\x82\x42\xbf\x11\xe3\x86\x18\x37\xc4\xb8\x21\xc6\x0d\xca\xe4\xba\x5d\x34\xc8\x80\x92\xe3\xa8\x66\x88\x87\xf1\x4f\x6e\x8c\x87\x39\x09\x15\xcd\x5b\xbb\x3b\x8f\x82\xc9\x04\x0f\x97\x40\xd8\x36\x9d\x4a\xbf\x72\x90\xd0\x97\x0a\x36\x11\x7f\x91\x43\xdb\x54\xff\xc4\x83\x62\xcc\xd8\x27\xfd\xaf\xfb\xfd\x9c\xc7\x64\x03\xcc\x59\x90\x2c\xf2\x42\x64\xe5\x8d\x63\x3c\x5f\x59\x12\x3f\x0a\x36\xf2\x7d\x1c\x69\x60\xe9\xc0\xd0\x98\x4d\x12\x2e\xa5\x30\x88\x94\xe0\x0a\x4f\x0c\x42\xba\xfd\x79\x9f\x23\x9c\xfa\x78\x24\x20\xe1\x85\xe6\x71\xf8\xd4\x89\x4f\x8f\x94\x7d\x32\x12\xd3\x97\x47\x9a\x3b\xe9\x58\x9f\xaf\x45\x2e\x32\x72\xd6\x2a\x21\xf5\x73\xcf\x82\xd2\x9d\x39\x5f\x6a\x7d\xd8\x37\x1c\xac\x77\xeb\x2f\x87\x48\x9c\x86\xf1\xee\x25\x64\x37\xaa\xd8\x83\xb7\x3f\x1e\x6f\x4f\x2e\x41\x7b\x15\x40\xbe\xa6\x77\xff\xb6\xf9\xc0\x9e\x8b\x2c\x12\xad\x9e\xcc\x8b\x8c\x17\x22\x8a\x83\xeb\xf6\xef\xe8\x9f\x9f\xed\x93\x74\x35\xb4\xc1\x5a\x29\xcf\x8a\x98\x22\xf6\x8c\xfb\xda\x8e\xb8\x8b\xbe\x36\x24\x53\x76\x5f\xde\x06\x1b\x54\x97\x49\xdd\x91\x8c\xc1\xc0\x7d\xe6\x06\xee\xcb\x71\x39\x58\x0a\x7f\x71\x9b\xcb\x84\x68\xe9\xe3\xa6\x0c\xfb\x7f\xbd\xe6\x28\x7a\x43\xe6\x3d\x13\x97\xcd\x13\x7a\x53\x2a\x79\x6d\xde\xa6\x27\xc8\xc2\x9e\xb3\xd7\xbf\xe5\x4a\x4e\x4c\xf4\xfb\x57\x7d\xe8\xd9\x9f\xbf\xbb\xa3\xb0\xfc\xe5\x9b\x21\xf9\x42\xb4\x5f\x37\x9f\x55\x16\x10\x05\x11\x29\x9a\x7c\xc5\xee\xaf\x66\xfa\x77\xf7\x57\xec\xae\x26\x4d\x72\xae\x37\x7c\x01\xe9\x3f\x76\xa3\x5e\xf3\x80\x26\x80\xe2\xa7\x93\x38\xb0\x16\x50\x52\x97\xd4\x0f\x3b\xb7\x26\xbe\x38\x15\x2a\x4d\xc4\x98\x99\x6f\x52\xda\x04\xb7\xa6\xc8\xc5\xbd\x71\x22\xfc\xe7\xf7\x11\xaf\xfe\x10\xb4\x26\xf3\x07\x68\x4d\xc3\xd1\x9a\xd2\x25\x2f\xf1\x53\xd0\x9b\x16\x9d\x5b\xd4\xd2\x84\x07\xbb\x82\x3b\xfb\xd6\x25\xc0\x3b\x38\x93\x02\xd9\x5d\x14\xb2\x1b\x10\x80\xc2\x3d\xef\xff\x02\x67\xd2\x0b\xc4\x27\x8b\xd3\xb0\xea\xbe\x62\x3b\xb9\x64\x52\x78\x5d\x43\x65\xb8\xce\xd9\x42\x9b\x82\x41\x86\xf1\x53\x1c\x2e\x78\x52\x0d\xe7\xe4\x3e\xe9\x0a\x8d\x7a\x5c\xf1\x36\x7a\xef\xfd\x94\x46\xd4\xc2\xa8\x4c\xbd\x55\xcb\xa5\xe4\x31\x11\x8b\x65\x5e\x08\x5e\xb3\x58\x2e\x23\xa6\x1f\x6b\xcc\x61\x3e\x62\xef\xb3\xca\xee\x92\xc4\xc3\xa7\xfc\x6a\x00\x47\xde\xda\x17\x2e\x2b\xd6\x72\x83\x85\x8f\x42\x85\x3f\x3d\x09\x89\x88\x4b\x9a\xc9\x8b\x08\xbb\x44\x92\xcb\x33\x4e\x72\xb9\x9d\x68\xda\x96\xe0\x72\xff\xda\xab\xed\x48\x34\xa4\xb5\x44\x5a\x4b\xa4\xb5\x44\x5a\xcb\x73\x4b\x6b\xb9\xfd\xe4\x6d\x4c\x69\xd9\xb3\xcb\xc2\xc1\x12\x59\x6e\x1f\xfe\xfa\x24\x96\x43\x96\xc1\x2e\xa9\x2b\xb7\xcb\x60\x7d\xda\xca\x9e\x65\x80\x64\x95\x48\x56\x89\x64\x95\x48\x56\x89\x64\x95\xbd\x25\xab\x6c\x71\xfa\xaf\x24\xaa\xdc\x18\xcd\x78\x41\x1e\x8b\xed\x46\x73\xc6\xc9\x36\xb7\x8b\x7b\x53\xa2\xcd\xc3\xca\x1d\xe9\x35\x7b\x99\xd1\xd5\xd4\x9a\x3d\x4f\xeb\x51\x13\x6a\x6e\x17\xcf\x86\x64\x9a\x7d\x1f\x9b\x43\x4d\xa1\xb9\x5d\x68\x0d\x74\xc6\xde\xf6\x3c\xfb\xd3\x9f\x7b\x11\x64\x1b\x33\x97\x5c\x3c\x6f\xb6\xe4\x67\xf4\x8f\x25\xde\x01\x8c\x19\x18\x33\x06\xc6\x0c\x8c\x19\x18\x33\x30\x66\x60\xcc\xc0\x98\x81\x31\x03\x63\x06\xc6\x6c\xe9\xb8\x1d\x20\x5b\x04\xc6\x0c\x8c\x19\x18\x33\x30\x66\x60\xcc\xc0\x98\x81\x31\x3b\x45\xc6\x0c\xc9\x4d\x40\x15\x82\x2a\x04\x55\x38\xe8\x19\x05\x55\x58\x17\x0f\xa8\xc2\xb3\xa5\x0a\x1b\x8a\x1c\xf4\xc4\x18\x56\x69\x42\xe9\xd0\x8f\x9a\xb1\xc7\x58\x86\x1d\xd2\x85\x6f\x4b\x4d\x87\xb4\x39\x8b\x8a\xb5\xb2\x54\xaa\x70\xa3\x9a\xea\x5f\x69\xbb\x03\xb2\x11\x44\x23\x88\xc6\xd3\x23\x1a\x41\x32\x82\x64\x04\xc9\x08\x92\x11\x24\x23\x48\x46\x90\x8c\x20\x19\x41\x32\x82\x64\x04\xc9\x08\x92\x11\x24\x23\x48\x46\x90\x8c\x20\x19\x4f\x8a\x64\x44\x31\x08\xf0\xa5\xe0\x4b\x87\xca\xae\x81\x2f\x05\x5f\x0a\xbe\x14\x7c\xe9\x92\xd0\x0e\xc4\x97\x86\x71\x1e\x28\x0d\xc9\x1c\x59\xba\x17\xf5\x79\x94\x74\xc2\x4b\x53\x1d\x51\xe1\xda\x99\xca\xe6\x7e\x69\x73\x66\xc8\x98\xf5\x24\x66\x24\x8a\x8f\x4e\x02\x77\x93\x2f\xff\xb5\xfc\x38\xf2\x27\xef\x48\x24\x7a\x21\x9e\x38\x8d\xe8\xf7\x45\xe5\x95\x57\xd5\xcf\x6e\xd9\x46\xce\xe7\xe0\xa4\xb7\x53\x4d\xe5\x37\x87\x64\xcb\xbd\x64\x7d\x01\xee\x26\x5f\x7e\x6f\x7a\x13\xdb\x6a\xf7\x6d\xe5\x04\x49\xd1\xdb\xe7\xb2\xbb\x1a\x18\xfa\x7d\x76\x99\x90\x61\xaa\x62\x59\xe4\x49\x1c\xf4\x1c\xef\x6f\x8c\xc5\x99\x35\x37\x39\x6b\x84\x73\xdc\xf9\x64\x3b\xf2\x5d\x77\x64\xc3\x5e\xd1\xad\x2c\x6f\x96\xda\xbb\xc8\x70\xbd\x3c\x0f\x83\xd9\xa6\xe3\x72\x19\xba\x14\xfc\xb5\xa9\x3b\xf7\x0d\xba\xdd\x85\xa6\xab\x30\xfd\xe5\xfd\xde\xec\x3e\xb3\x6e\xcf\xc1\x8d\x06\x6e\x34\x70\xa3\x81\x1b\x0d\xdc\x68\xe0\x46\x03\x37\x1a\xb8\xd1\xc0\x8d\xe6\xd8\x32\x80\x1b\x0d\xdc\x68\xe0\x46\x03\x37\x1a\xb8\xd1\xc0\x8d\xe6\xf4\xdc\x68\xe0\x82\x01\x17\x0c\xb8\x60\x9c\xc6\x8c\xc2\x05\xa3\x2e\x1e\xb8\x60\x9c\x90\x0b\x86\x63\xb5\xd6\x44\xaa\xaf\x27\xbb\x0c\xf2\xe9\x96\xef\x32\x6d\xb2\x40\x25\x5a\xd1\xb2\x0b\xb6\x2d\xcd\x65\x5e\x5e\x26\xba\x3e\xf8\xb6\xca\x58\xf1\xb5\x2d\xf6\x5b\x08\xbf\x17\xb2\xf6\x23\x8d\xfa\x1b\x89\x30\xef\xa4\xee\x3d\xec\xbc\xb0\xf3\xc2\xce\x0b\x3b\xef\xb9\xd9\x79\x37\xdc\xc2\xdb\x6c\xbd\x9b\x11\xdd\xe6\xdb\x78\xa7\xb3\xf7\x5f\x5a\x70\x56\xc3\x7d\x4b\x85\x1e\x02\xbd\xa2\xcc\x3a\xa8\x8d\xad\xca\xa9\x4e\x05\x4b\xb5\xb4\x72\xad\x0c\xb2\x3b\xc9\x62\x69\x4e\x16\x95\xb1\x85\xf4\x87\x53\xc8\xc2\xec\xf9\xf7\x85\x64\x61\x9c\xe9\x2b\xf1\x49\xf8\x15\xaf\x8f\x4f\xb2\x47\xd8\x2d\xef\xd6\x86\x15\x30\x9b\x2d\x32\xda\x65\x69\xa6\x02\x91\x93\xe1\xc0\x42\x49\xbb\xca\xc6\xec\x9f\xf4\x45\x9a\x2d\x5a\x3b\xef\xd9\x35\xbb\x4b\x92\xf7\x64\x16\x08\xf5\x29\xbd\x90\x7a\xe2\x35\x28\x73\x4b\xd2\x36\x27\xc2\x3d\x26\xca\x8c\xe5\x38\xd3\x74\x30\xe3\x7c\x3b\x51\xac\x37\xd0\x1f\x4c\x22\x7f\x54\xb5\x8c\x58\x6b\xf8\x04\xfe\xd9\x54\xcc\x8c\x17\x81\x37\xe4\x94\x50\xc2\x9e\x5e\xb4\x74\x16\xc2\x5c\x0e\x53\x8d\xaf\xe5\xb5\x14\x11\xa7\x05\x6a\xf5\x04\xad\xd2\xb8\x1b\xd4\x18\x75\xfd\xd6\xb0\x98\x31\x9e\xcf\x45\x18\xf3\x42\x24\xcf\x25\xbd\x5f\x5e\xb9\x71\xf2\xd6\xea\x01\x24\x74\x16\x65\x3c\xa0\x5d\x13\xab\xd0\x03\x82\xf2\xd2\x26\xdf\x09\xb7\x4a\x17\xb9\xee\x64\x75\xba\xb8\x7e\xd3\x0d\xc8\x7e\x64\x66\xce\x40\xd7\xc4\xd8\xf4\x73\x2e\xb8\x6c\xec\xe3\x1e\xd3\x4c\x7d\x9e\x50\x97\x9b\x74\xab\x2d\xda\xd5\x50\x96\xff\x2e\xbc\x4c\x3b\xb9\xac\xe7\x66\x0e\xb6\xfc\xc1\xd2\x80\xa5\x01\x4b\x03\x96\x06\x2c\x4d\x6f\x2c\x4d\xcb\xbb\x60\x85\xa9\x39\xdc\xb5\xf8\xb1\x92\x41\x31\xa5\x14\x8f\xfe\x08\x9a\x64\x2a\xe5\x11\xa1\xa3\x89\x4a\xe2\xe0\xb9\xe6\x13\xe8\x16\x5d\x99\x82\x51\x2f\xbb\xdb\xf1\xdf\xc7\xec\xbb\x39\xcf\x0c\x74\x49\x85\xd4\x9b\xa5\xbc\x53\x05\x53\x59\xfa\xc0\xa5\xf3\x51\xcc\x16\xe2\x66\xc6\x13\xa7\x2b\xdf\x5f\x99\x3f\xdf\x5f\xb1\x59\x2c\x79\x12\xff\xdb\x5d\x24\x53\xc1\x78\x48\xa6\x7b\x75\x63\xcc\x9a\x61\xa9\x86\x99\xe6\x47\x79\xf9\x92\xd1\x4f\xc7\xec\x53\x4c\x87\x63\xa5\xeb\x2a\x5b\x1d\x5b\x49\xd4\x14\x46\x3d\x26\x1d\x45\x15\x0f\xfb\x4c\xa8\x19\xc1\x47\x37\xf6\xb5\x90\xa7\xc9\x48\xda\xad\x62\x46\x43\xd7\x1b\xf6\x41\xfd\x60\x11\xcf\xa6\x3c\xaa\x99\x2a\xbd\x52\x23\xb2\x99\xca\xe6\x7a\x4e\x1a\xe5\xf5\x6d\x69\x44\xeb\xc5\x45\xa0\xd7\x21\xd6\xd4\xc8\x36\xd6\x68\x32\x88\xc3\x52\x15\x26\xac\x40\xc6\x09\x3f\xc7\x39\x85\xa7\xd1\x5f\x1d\x1a\x18\x57\x26\xd3\xdd\x23\x9e\x29\xf1\xfe\xb6\xf5\x8f\x8d\xd9\x5d\x10\x88\xb4\xa0\xbb\xa9\xaa\xd9\x8d\xcc\x18\x46\xec\xda\x2e\xc0\xfa\x02\xcd\x7f\x61\xa3\x5f\x79\xf0\x18\x65\x6a\x21\x43\xfd\x14\xf9\xae\xd2\x43\x4b\x82\x33\x10\xd2\xe2\xe3\x7a\x23\x6e\x04\x53\xdf\xd2\x2f\x6c\xf4\x59\x65\xa2\xd2\x2c\x0b\x78\x1e\xf0\x50\x8f\xde\xca\xc7\xb8\x36\x53\x7b\xb9\x51\x3d\x57\x1a\x9c\xf9\x36\xf6\x59\x90\xe9\xf2\x72\x3f\x0e\xe2\x3c\x63\x4a\xb5\xdd\x3c\x6c\xa2\x55\x8f\x35\x0b\x20\x58\x7b\x9b\xdf\x55\x92\xf5\x70\xb6\x8d\x63\xd2\xad\xed\x84\xb5\x81\x72\x7d\x29\xfe\x69\xe4\xed\x10\x53\xb9\x23\x4d\xf7\xbd\xe0\xc5\xa2\x2d\x3f\x77\xa6\x91\x5a\xe6\x56\x2e\x11\xd3\x09\x46\x6d\x9d\x50\x84\x67\x87\x74\x37\xe2\xd0\x2e\x27\x0e\xad\xdd\x7d\xb3\x2d\x16\xed\x70\x8a\x19\xbc\x15\xe0\xad\x00\x6f\x05\x78\x2b\xc0\x5b\xa1\xe9\xf0\x05\x0d\x7e\x42\x12\x01\x33\x0a\x66\x14\xcc\x28\x98\x51\x30\xa3\x60\x46\xcf\x8b\x19\x05\x59\x01\xb2\x02\x64\x05\xc8\x8a\xde\xc9\x8a\x1d\x08\xfd\x81\x46\x8a\xb5\x13\xe1\x6a\xb4\xd8\x4b\x2d\x6e\x83\xa2\x79\xd6\xbe\x80\xe4\x7f\x48\xfe\x77\x99\xc9\xff\x50\x8c\x62\xe0\x99\x10\xec\x4f\x7f\x96\x93\xac\xf2\x8e\xc9\x42\xa3\xc2\x31\x2e\x5b\x13\x83\xe6\x8d\x1e\xa9\xc1\xfd\x22\x61\x37\xac\xa6\x5e\x0f\xcc\x4e\xe2\x63\x11\xa3\x55\x9d\xfa\xc1\xc6\x68\x91\xd5\xe6\x2b\x97\x3c\x12\x99\xb1\x3f\x9a\xb3\x33\xcf\x55\x10\x93\x42\xed\x2d\x7d\x9c\x0c\xb6\x2a\x63\x42\x16\x1a\xe1\x3a\x0b\xc3\x9c\x3f\x6a\x29\x16\x0f\x22\x17\x0e\x26\x56\x23\x91\x5c\xc4\x12\xc1\x64\xb2\xea\xa9\x8c\xdd\xbe\xfb\x59\x3f\x9b\xf1\x80\x68\xbc\x44\xc9\xc8\x80\x42\xb2\xbc\x05\x4a\x16\x3c\x96\xe6\xc0\x22\xcb\x56\xf9\x2c\x51\x1b\x96\x64\x64\xd3\x67\xaf\xf7\x44\x2a\xe1\x32\x1a\xab\x2c\xba\x49\x1f\xa3\x9b\x85\x8c\x03\x15\x8a\x9b\x9f\xbe\xe4\x13\xdd\xca\xde\xa6\x72\x2b\x9c\x2e\xa7\x67\x50\x28\xf2\xb4\xc1\x5d\x5b\x60\xf7\xae\x05\xb0\xfb\x60\x6c\x7f\x43\xec\xfc\xbb\xad\x9d\x37\x3e\xc8\x43\xec\xfd\x79\x62\x6a\xc2\x2d\x27\x83\xa9\x5f\xb1\x8e\x73\x9c\x98\x3f\xfd\xe7\x40\xa9\x4e\x76\xc0\x72\xcd\xf9\x4d\x8e\x8e\xe5\x4e\x24\xab\x09\x50\x5b\x75\x92\x07\x8b\xda\x10\x47\x7e\x41\x71\xe4\x08\x98\x43\xc0\x1c\x02\xe6\x10\x30\x07\x85\x73\xdd\x2e\x1a\x64\x74\xca\x71\x94\x36\x04\xd7\x98\xc7\x36\x06\xd7\x9c\x8e\xde\xe6\xcd\xe4\x9d\x87\xd4\x64\x82\x87\x4b\x30\xac\xad\x8a\xa5\x5f\x3d\x5c\x1c\x4d\x05\xaa\x88\xbf\xc8\x3b\x6e\xaa\x7f\xe2\x41\x31\x66\xec\x93\xfe\xd7\xfd\x7e\xce\x63\x32\x1b\xe6\x2c\x48\x16\x79\x21\xb2\xf2\x02\x32\x6e\xb4\x2c\x89\x1f\x05\x1b\xf9\xbe\x8e\x34\xce\x74\xd8\x68\xcc\x26\x09\x97\x52\x18\x80\x4a\xe8\x85\x27\x06\x30\xdd\xfe\xbc\xcf\x89\x4e\x7d\x3c\x12\xae\xf0\x42\xf3\xb0\x7c\xea\xc4\xa7\x47\xca\x3e\x19\x89\xe9\xbb\x24\xcd\x9d\x74\xac\x03\xd9\x22\x17\x19\x79\x7e\x95\x08\xfb\xb9\x67\x41\xe9\xce\x9c\x2f\x4f\x3f\xec\x0b\x0f\x66\x3e\xb6\xe1\xc2\x88\xc4\x09\x59\xf9\x5e\xc2\x9c\x13\xed\x63\x6d\x2a\x1b\xfa\xd1\x86\x18\x1f\x0a\x27\x0e\x67\x80\x93\x73\x06\x20\x77\xa3\xbd\x0a\x32\x5f\xd3\xbb\x7f\xdb\x7c\x7e\xcf\x45\x16\x89\x56\x4f\xe6\x45\xc6\x0b\x11\xc5\xc1\x75\xfb\x77\xf4\xcf\xcf\xf6\x49\xba\x29\xda\xe0\xb0\x94\x67\x45\x4c\xd1\x80\xc6\x35\x6e\x4f\x4c\x46\x5f\x1d\x9c\xd5\xbb\x2f\x0f\x86\x0d\x5a\xce\xa4\xee\xb1\xc6\x60\x0b\x3f\x73\x5b\xf8\xe5\x78\x30\x2c\xc5\xd9\xb8\xcd\x65\x62\xc1\xf4\xd9\x53\xe6\x17\x78\xbd\xe6\x5c\x7a\x43\x96\x40\x13\x00\xce\x13\x7a\x53\x2a\x79\x6d\xde\xa6\x27\xc8\x18\x9f\xb3\xd7\xbf\xe5\x4a\x4e\x4c\x98\xfd\x57\x7d\x02\xda\x9f\xbf\xbb\x73\xb1\xfc\xe5\x9b\x21\xb9\x56\xb4\x5f\x37\x9f\x55\x16\x10\x5b\x11\x29\x9a\x7c\xc5\xee\xaf\x66\xfa\x77\xf7\x57\xec\xae\x26\x4d\xf2\xe2\x37\xd4\x02\xe9\x46\x76\xa3\x5e\xf3\x80\x26\x80\x02\xb5\x93\x38\xb0\xc6\x52\x52\xa5\xd4\x0f\x3b\xb7\x26\x90\x39\x15\x2a\x4d\xc4\x98\x99\x6f\x52\x7e\x06\xb7\xa6\xc8\x97\xbe\x71\x22\xfc\xe7\xf7\x11\xaf\xfe\x10\x34\x2a\xf3\x07\x68\x54\xb5\x31\x1d\xdb\x71\x62\xc9\x21\xfd\x64\x74\xaa\x45\xe7\x16\xb8\x34\xe1\xc1\xbe\x80\xcf\xbe\x7d\x31\x90\x0f\x4e\xab\x80\x7c\x97\x07\xf9\x06\x84\xac\x00\x00\xfc\x5f\xe0\xb4\xda\xa2\xf3\x67\x8a\x5e\x16\x27\x64\x0f\x7e\xc5\xda\x7b\x7d\x52\xa4\xdf\x86\x42\x76\x9d\x13\x90\x36\x2b\x84\x0c\xe3\xa7\x38\x5c\xf0\xa4\x1a\x61\xca\x7d\x1e\x98\x9a\x08\xc6\x15\x57\xa6\xf7\xde\x09\x6a\x44\x2d\x8d\xca\xac\x60\xb5\x34\x4f\x1e\x36\xb1\x58\xe6\x85\xe0\x35\x83\xe7\x32\xa8\xfa\xd1\x64\x45\x5b\x09\x26\xfc\xac\xb2\xbb\x24\xf1\x48\x2b\xbf\x1a\xc0\x81\xb8\xf6\x85\xcb\x8a\x05\xdd\x60\x18\xa4\x50\xe6\x4f\x4f\x42\x5e\x78\x30\x28\x4d\xe3\xe5\x44\x84\x22\x0d\xe7\x19\xa7\xe1\xdc\x4e\x57\x6d\x4b\xc1\xb9\x7f\xf9\xd8\x76\x54\x1c\x12\x6f\x22\xf1\x26\x12\x6f\x22\xf1\xe6\xb9\x25\xde\xdc\x7e\xf2\x36\x26\xdd\xec\xd9\xf1\xe1\x60\xa9\x36\xb7\x0f\x7f\x7d\x9a\xcd\x21\xcb\x60\x97\xe4\x9a\xdb\x65\xb0\x3e\xb1\x66\xcf\x32\x40\x3a\x4d\xa4\xd3\x44\x3a\x4d\xa4\xd3\x44\x3a\xcd\xde\xd2\x69\xb6\x38\xfd\x57\x52\x69\x6e\x8c\x98\xbc\x20\xbf\xc7\x76\xa3\x39\xe3\x74\xa0\xdb\xc5\xbd\x29\x15\xe8\x61\xe5\x8e\x04\xa0\xbd\xcc\xe8\x6a\xf2\xcf\x9e\xa7\xf5\xa8\x29\x3f\xb7\x8b\x67\x43\xba\xcf\xbe\x8f\xcd\xa1\x26\xf9\xdc\x2e\xb4\x06\x42\x63\x6f\x7b\x9e\xfd\xe9\xcf\xdd\x49\xb3\x56\x09\x53\xc0\xa5\x6d\x70\x4f\xfa\xc7\x12\x1d\x01\x16\x0d\x2c\x1a\x03\x8b\x66\x1e\x03\x8b\x06\x16\x0d\x2c\x1a\x58\x34\xb0\x68\x60\xd1\xc0\xa2\x81\x45\x1b\x36\x83\x04\x16\x0d\x2c\x1a\x58\x34\xb0\x68\x60\xd1\xc0\xa2\x81\x45\x3b\x45\x16\x0d\x69\x53\x40\x1f\x82\x3e\x04\x7d\x38\xe8\x19\x05\x7d\x58\x17\x0f\xe8\xc3\xf3\xa6\x0f\x1b\xea\x2d\xf4\xc4\x22\x56\xa9\x43\xe9\x20\x90\x9a\xb1\xc7\x58\x86\x3d\x50\x88\x6f\x4b\xb5\x87\x54\x3b\x0b\x91\xb5\xe6\x54\xea\x73\xa3\x9a\x1d\xa0\xd2\x76\x57\x04\x24\xc8\x47\x90\x8f\x27\x46\x3e\x82\x78\x04\xf1\x08\xe2\x11\xc4\x23\x88\x47\x10\x8f\x20\x1e\x41\x3c\x82\x78\x04\xf1\x08\xe2\x11\xc4\x23\x88\x47\x10\x8f\x20\x1e\x41\x3c\x9e\x1e\xf1\x88\x12\x14\xe0\x52\xc1\xa5\x0e\x9d\x79\x03\x97\x0a\x2e\x15\x5c\x2a\xb8\xd4\x25\xa1\x1d\x88\x4b\x35\xc6\x7e\x47\xa4\xee\x45\x87\x1e\x25\x37\xf1\xd2\x3c\x47\x54\x49\x77\xa6\xb2\xb9\x5f\xd7\x9c\x19\x5a\x66\x3d\xa1\x19\x89\x82\xc8\xaf\xfc\x6e\xf2\xe5\xbf\x96\x9f\x45\x26\xe6\x1d\xc9\x44\x2f\xc4\x13\xa7\x12\xcd\x8e\xa8\x3c\xff\xaa\xfa\xcd\x4d\xbb\xe7\xe9\xf6\xb4\x37\x50\x4d\xd3\x37\x67\x62\x9b\xdd\xf3\xcf\xdb\xbb\xc9\x97\xdf\x9b\xde\xc0\x1e\xda\x7d\x0f\x39\x41\x52\x08\xf7\x59\x6c\xa5\xff\x79\xba\xdd\x73\x37\xd9\xad\xd8\xa7\x8f\x8e\xb1\x01\x67\xd6\x8a\xe4\x8c\x0c\xde\x3d\x87\x7c\x23\xd6\xef\x01\xfd\xb6\xdb\x04\xf4\x2f\x52\x59\x2f\xcb\x7b\x30\xdb\x6e\x6c\x97\xd7\xd3\xed\x98\xa6\xea\x5c\x37\xd8\x76\x77\x97\xae\xc2\xec\x6b\xfb\x75\x8d\xab\xcb\xd2\x06\x5a\x76\x71\x81\x77\x0b\xbc\x5b\xe0\xdd\x02\xef\x16\x78\xb7\xc0\xbb\x05\xde\x2d\xf0\x6e\xd9\xe5\xb4\x85\x77\x0b\xbc\x5b\xe0\xdd\x02\xef\x16\x78\xb7\xc0\xbb\x05\xde\x2d\x17\xe7\xdd\x02\x8f\x08\x78\x44\xc0\x23\xe2\x34\x66\x14\x1e\x11\x75\xf1\xc0\x23\xe2\x54\x3c\x22\x9e\x6e\xd7\xc6\x93\xaf\x90\x53\x06\xe9\x74\xcb\x4f\x99\x36\x59\xa0\x12\xad\x58\xd9\x05\xba\x8d\x96\x32\x2f\x39\x62\xea\x83\x7f\xb7\x12\xac\xbd\xdc\x42\xbf\x45\xec\x7b\x21\x4b\x3f\xd2\x28\xbf\x91\xa8\xf2\x4e\xca\xd5\xc3\x7e\x0b\xfb\x2d\xec\xb7\xb0\xdf\x9e\x9b\xfd\x76\xc3\xed\xba\xcd\x86\xbb\x19\xa9\x6d\xbe\x65\x77\x3a\x7b\xff\xa5\x05\x67\x35\xd7\xb7\x54\x7a\x21\xd0\x2b\xca\xac\x83\xda\xd8\xaa\x5c\xe9\x54\xb0\x54\x4b\x2b\xd7\x4a\x1e\xbb\x93\x2c\x96\xe6\x64\x51\x19\x5b\x48\x7f\x38\x85\x2c\xcc\x9e\x7f\x5f\x48\x16\xc6\x99\xbe\x0a\x9f\x84\x5f\xf1\xfa\xf8\x24\x3b\x83\xdd\xf2\x6e\x6d\x58\x01\xb3\xd9\x22\xa3\x5d\x96\x66\x2a\x10\x39\x19\x04\x2c\x44\xb4\xab\x6c\xcc\xfe\x49\x5f\xa4\xd9\xa2\xb5\xf3\x9e\x5d\xb3\xbb\x24\x79\x4f\xea\x7e\xa8\x4f\xe9\x85\xd4\x13\xaf\xc1\x96\x5b\x92\xb6\x39\x11\xee\x31\x51\x66\x2c\xc7\x99\xa6\x83\x19\xdd\xdb\x89\x62\xbd\xe1\xfd\x60\x12\xf9\xa3\xaa\x3d\xc4\x5a\x73\x27\x50\xcf\xa6\x62\x66\xbc\x03\xbc\x81\xa6\x84\x12\xf6\xf4\xa2\xa5\xb3\x10\xe6\x72\x98\x6a\xdc\x2c\xaf\xa5\x88\x38\x2d\x50\x8b\xff\xb5\xaa\xe2\x6e\x50\x63\xac\xf5\x5b\xc3\x62\xc3\x78\x3e\x17\x61\xcc\x0b\x91\x3c\x97\xb4\x7d\x79\xe5\xc6\xc9\x5b\x8b\xef\x49\xe8\x2c\xca\x78\x40\xbb\x26\x56\xa1\x07\x04\xe5\xa5\x4d\x3e\x11\x6e\x95\x2e\x72\xdd\xc9\xea\x74\x71\xfd\xa6\x1b\x90\xfd\xc8\xcc\x9c\x81\xae\x89\xb1\xe9\xe7\x5c\x70\xd9\xd8\xc7\x3d\xa6\x99\xfa\x3c\xa1\x2e\x37\xe9\x4c\x5b\xb4\xa6\xa1\x2c\xff\x5d\xf8\x96\x76\x72\x59\xcf\xb9\x1c\x6c\xf9\x83\x7d\x01\xfb\x02\xf6\x05\xec\x0b\xd8\x97\xde\xd8\x97\x96\x77\xc1\x0a\x03\x73\xb8\x6b\xf1\x63\x25\x6f\x61\x9a\x08\x9e\x0b\x7f\x04\x4d\x32\x95\xf2\x88\xd0\xd1\x44\x25\x71\xf0\x5c\xf3\xf5\x73\x8b\xae\x4c\x7c\xa8\x97\xdd\xed\xf8\xef\x63\xf6\xdd\x9c\x67\x06\xba\xa4\x42\xea\xcd\x52\xde\xa9\x82\xa9\x2c\x7d\xe0\xd2\xf9\x1e\x66\x0b\x71\x33\xe3\x89\xd3\x95\xef\xaf\xcc\x9f\xef\xaf\xd8\x2c\x96\x3c\x89\xff\xed\x2e\x92\xa9\x60\x3c\x24\x93\xbc\xba\x31\xe6\xca\xb0\x54\xc3\x4c\xf3\xa3\xbc\x7c\xc9\xe8\xa7\x63\xf6\x29\xa6\xc3\xb1\xd2\x75\x95\xad\x8e\xad\x24\x60\x0a\xa3\x1e\x93\x8e\xa2\x8a\x87\x7d\x26\xd4\x8c\xe0\xa3\x1b\xfb\x5a\xc8\xd3\x64\xfc\xec\x56\x31\xa3\xa1\xeb\x0d\xfb\xa0\x7e\xb0\x88\x67\x53\x1e\xd5\x4c\x92\x5e\xa9\x11\xd9\x4c\x65\x73\x3d\x27\x8d\xf2\xfa\xb6\x34\xa2\xf5\xe2\x22\xd0\xeb\x10\x6b\x6a\x64\x1b\x6b\x34\x19\xc4\x61\xa9\x0a\x13\x56\x20\xe3\x84\x9f\xe3\x9c\x02\xc1\xe8\xaf\x0e\x0d\x8c\x2b\x93\xe9\xee\x11\xcf\x80\x78\x3f\xda\xfa\xc7\xc6\xec\x2e\x08\x44\x5a\xd0\xdd\x54\xd5\xec\x46\x66\x0c\x23\x76\x6d\x17\x60\x7d\x81\xe6\xbf\xb0\xd1\xaf\x3c\x78\x8c\x32\xb5\x90\xa1\x7e\x8a\x7c\x52\xe9\xa1\x25\xc1\x19\x08\x69\xf1\x71\xbd\x11\x37\x82\xa9\x6f\xe9\x17\x36\xfa\xac\x32\x51\x69\x96\x05\x3c\x0f\x78\xa8\x47\x6f\xe5\x63\x5c\x96\xa9\xbd\xdc\xa8\x9e\x2b\x0d\xce\x7c\x1b\xfb\x2c\xc8\x74\x79\xb9\x1f\x07\x71\x9e\x31\x55\xda\x6e\x1e\x36\xd1\xa5\xc7\x9a\x05\x10\xa7\xbd\xcd\xef\x2a\x79\x7a\x38\xdb\xc6\x31\x69\xd4\x76\xc2\xda\x40\xa5\xbe\x14\xff\x34\xf2\x73\x88\x69\xdc\x91\xa6\xfb\x5e\xf0\x62\xd1\x96\x9f\x3b\xb3\x48\x2b\x73\x1b\x97\x48\xe9\x04\xa2\xae\x06\x1c\x61\xd9\x01\x7d\x8d\x78\xb1\xcb\x89\x17\x6b\x77\x7f\x6c\x8b\x19\x3b\x9c\xa2\x05\xef\x03\x78\x1f\xc0\xfb\x00\xde\x07\xf0\x3e\x68\x3a\x7c\x41\x6b\x9f\x90\x44\xc0\x74\x82\xe9\x04\xd3\x09\xa6\x13\x4c\x27\x98\xce\xf3\x62\x3a\x41\x3e\x80\x7c\x00\xf9\x00\xf2\xa1\x77\xf2\x61\x07\x82\x7e\xa0\x11\x5d\xed\x44\xb8\x1a\xd5\xf5\x52\x8b\xdb\xa0\x68\x9b\xb5\x2f\x20\xf9\xde\x65\x52\x42\xe7\x9b\x7c\x0f\xb5\x19\x06\x9e\x89\xc0\xfe\xf4\x67\x39\xc9\x2a\xef\x98\xec\x33\xaa\x19\xe3\x72\x2b\xb1\x67\x9e\xec\x90\xda\xdb\x2f\x32\x75\xc3\xaa\xe9\xf4\xc0\xeb\x24\x3e\x15\x31\x52\xd5\xa9\x1e\x6c\x8c\x14\x59\x59\xbe\x72\xc9\x23\x91\x19\x7b\xa1\x39\x13\xf3\x5c\x05\x31\x29\xc0\xde\x32\xc7\xc9\xc0\xaa\x32\x26\x64\xa1\x11\xa9\xb3\x08\xcc\xf9\xa3\x96\x62\xf1\x20\x72\xe1\x60\x5d\x35\x12\xc8\x45\x0c\x11\xac\x25\x2b\x9c\xca\xd8\xed\xbb\x9f\xf5\xb3\x19\x0f\x88\x76\x4b\x94\x8c\x0c\x88\x23\x4b\x59\xa0\x64\xc1\x63\x69\x0e\x22\xb2\x44\x95\xcf\x12\x15\x61\x49\x41\x36\x7d\xf6\x7a\x4a\xa4\x12\x2e\xa3\xb1\xca\xa2\x9b\xf4\x31\xba\x59\xc8\x38\x50\xa1\xb8\xf9\xe9\x4b\x3e\xd1\xad\xec\x6d\xda\xb6\xc2\xe9\x72\x7a\x06\x85\xfa\x4e\x0b\x8c\xb5\x05\x62\xef\x5a\x00\xb1\x0f\xc6\x36\x37\x84\xce\xbe\xdb\xda\x59\xe3\xe3\x3b\x84\xde\x9e\x17\xc6\x25\x5c\x31\x58\x8c\xfb\x8a\xbd\x30\xe7\x87\xf9\xd5\x7f\x0e\x94\xfa\xa3\x05\x96\xaa\xe7\xfb\x40\x96\x0f\xa0\xa8\x33\x40\x51\x88\xab\xbe\xa0\xb8\x6a\x04\x90\x21\x80\x0c\x01\x64\x08\x20\x83\x02\xb8\x6e\x17\x0d\x32\x5a\xe3\x38\x4a\x16\x82\x4d\x36\x04\x9b\x0c\x57\xef\xf2\x66\xe7\xce\x43\x4c\x32\xc1\xc3\x25\xb8\xb5\x4d\x65\xd2\xaf\xf4\x17\x57\x52\x81\x1e\xe2\x2f\xf2\x16\x9b\xea\x9f\x78\x50\x8c\x19\xfb\xa4\xff\x75\xbf\x9f\xf3\x98\xcc\x72\x39\x0b\x92\x45\x5e\x88\xac\xbc\x50\x8c\x5b\x29\x4b\xe2\x47\xc1\x46\xbe\x8f\x23\x8d\x1b\x1d\xd6\x19\xb3\x49\xc2\xa5\x14\x06\x70\x12\x1a\xe1\x89\x01\x40\xb7\x3f\xef\x73\x42\x53\x1f\x8f\x84\x13\xbc\xd0\x3c\xcc\x9e\x3a\xf1\xe9\x91\xb2\x4f\x46\x62\xfa\x6e\x48\x73\x27\x1d\xeb\x50\xb5\xc8\x45\x46\x9e\x50\x25\x62\x7e\xee\x59\x50\xba\x33\xe7\xcb\x5b\x0f\xfb\x02\x83\x99\xed\xca\x54\xe0\x3c\x81\xd3\x7e\x0f\x26\x99\xe8\x12\x6b\xfb\x68\xf8\x74\x1b\x82\x78\x28\xdc\x30\x48\xf1\x93\x23\xc5\xc9\x9d\x66\xaf\xc2\xbd\xd7\xf4\xee\xdf\x36\x9f\xc7\x73\x91\x45\xa2\xd5\x93\x79\x91\xf1\x42\x44\x71\x70\xdd\xfe\x1d\xfd\xf3\xb3\x7d\x92\x4e\xfe\x36\xf8\x29\xe5\x59\x11\x53\xb4\x9b\x71\xfd\xda\x11\x4b\xd1\xd7\x8e\x6e\x7d\xee\x8b\xc9\xdf\xa0\x6d\x4c\xea\x9e\x57\x0c\x36\xe9\x33\xb7\x49\x5f\x0e\xb3\xbf\x14\x2f\xe2\x36\x97\x89\x69\xd2\x67\x4c\x19\x27\xff\x7a\xcd\xf9\xf3\x86\x2c\x72\x26\x90\x99\x27\xf4\xa6\x54\xf2\xda\xbc\x4d\x4f\x90\x51\x3c\x67\xaf\x7f\xcb\x95\x9c\x98\x70\xf1\xaf\xfa\xa4\xb3\x3f\x7f\x77\xe7\x5f\xf9\xcb\x37\x43\x72\x39\x68\xbf\x6e\x3e\xab\x2c\x20\xd6\x20\x52\x34\xf9\x8a\xdd\x5f\xcd\xf4\xef\xee\xaf\xd8\x5d\x4d\x9a\xe4\x8d\x6e\x4c\xfc\xa4\xd3\xd8\x8d\x7a\xcd\x03\x9a\x00\x0a\x38\x4e\xe2\xc0\x1a\x2d\x49\x05\x52\x3f\xec\xdc\x9a\x80\xdc\x54\xa8\x34\x11\x63\x66\xbe\x49\x79\x06\xdc\x9a\x22\x9f\xf0\xc6\x89\xf0\x9f\xdf\x47\xbc\xfa\x43\xd0\x84\xcc\x1f\xa0\x09\x1d\xc5\xe1\x60\xc9\x81\x7a\xb0\xba\xd0\xa2\x73\xcb\x57\x9a\xf0\x60\x57\xc0\x66\xdf\x3a\x5b\xc8\x06\xe7\x4b\x40\xb4\xf3\x87\x68\x03\x42\x42\xb8\xb0\xfd\x5f\xe0\x7c\x79\x7e\xe8\x62\x31\x60\x3b\xeb\x2b\xb6\xdd\x9b\x91\x22\xc4\x1a\x0a\x96\x75\x4e\xc4\xd9\x2c\x02\x32\x8c\x9f\xe2\x70\xc1\x93\x6a\x44\x22\xf7\x79\x43\x68\x94\xe3\x8a\xcb\xce\x7b\xef\xec\x33\xa2\x16\x46\x65\xf6\xa8\x5a\x3a\x20\x0f\x63\x58\x2c\xf3\x42\xf0\x9a\xe1\x70\x19\xe4\xfc\xa8\x5a\xa5\x7c\xd0\xd9\x67\x95\xdd\x25\x89\x47\x3c\xf9\xd5\x00\x0e\xac\xb5\x2f\x5c\x56\x8c\xe0\x06\x43\xdb\xbf\xfc\x5c\x5e\xe6\x09\x44\xd3\x77\xbe\x91\x83\x48\xc3\x78\xc6\x69\x18\xb7\xd3\x39\xdb\x52\x30\xee\x5f\xe6\xb3\x1d\x55\x85\xc4\x8b\x48\xbc\x88\xc4\x8b\x48\xbc\x78\x6e\x89\x17\xb7\x9f\xbc\x8d\x49\x17\x7b\x76\x0c\x38\x58\xaa\xc5\xed\xc3\x5f\x9f\x66\x71\xc8\x32\xd8\x25\xb9\xe2\x76\x19\xac\x4f\xac\xd8\xb3\x0c\x90\x4e\x11\xe9\x14\x91\x4e\x11\xe9\x14\x91\x4e\xb1\xb7\x74\x8a\x2d\x4e\xff\x95\x54\x8a\x1b\x23\xfe\x2e\xc8\x2f\xb0\xdd\x68\xce\x38\x1d\xe4\x76\x71\x6f\x4a\x05\x79\x58\xb9\x23\x01\x64\x2f\x33\xba\x9a\xfc\xb1\xe7\x69\x3d\x6a\xca\xc7\xed\xe2\xd9\x90\xee\xb1\xef\x63\x73\xa8\x49\x1e\xb7\x0b\xad\x81\xb8\xd8\xdb\x9e\x67\x7f\xfa\xb3\x3d\xe9\xb5\x31\x91\xc7\x65\x72\x61\x4b\xee\x3e\xff\x58\xa2\x15\xc0\x82\x81\x05\x63\x60\xc1\xc0\x82\x81\x05\x03\x0b\x06\x16\x0c\x2c\x18\x58\x30\xb0\x60\x60\xc1\x86\xc4\x00\x81\x05\x03\x0b\x06\x16\x0c\x2c\x18\x58\x30\xb0\x60\x60\xc1\x4e\x91\x05\x43\x5a\x10\xd0\x7f\xa0\xff\x40\xff\x0d\x7a\x46\x41\xff\xd5\xc5\x03\xfa\xef\xbc\xe8\xbf\x86\x3c\xfe\x3d\xb1\x80\x55\xea\x4f\x3a\xc8\xa3\x66\xec\x31\x96\x61\x87\x14\xe0\xdb\x52\xbd\x21\x15\xce\x42\x61\xad\x21\x95\x7a\xdb\xa8\xa6\xef\x57\xda\xde\x97\x40\x04\x79\x08\xf2\xf0\x44\xc8\x43\x10\x87\x20\x0e\x41\x1c\x82\x38\x04\x71\x08\xe2\x10\xc4\x21\x88\x43\x10\x87\x20\x0e\x41\x1c\x82\x38\x04\x71\x08\xe2\x10\xc4\x21\x88\xc3\xe1\x13\x87\x28\x8d\x00\x0e\x14\x1c\xe8\x50\x19\x33\x70\xa0\xe0\x40\xc1\x81\x82\x03\x5d\x12\xda\x91\x38\xd0\xa9\x28\xf8\xed\xcd\x5e\xf4\xe6\x51\x72\xf4\x2e\xcd\x77\x24\x8a\xba\xa2\x62\xa6\x76\x03\x4b\x19\x89\xc2\x71\x94\x34\xf6\xbb\xc9\x97\xdf\x9b\x5e\x43\x66\xe2\x1d\xc9\xc3\x8a\x20\x29\x5c\xf4\x5c\x18\x44\x5a\x25\x95\xf7\x5e\x55\xbf\xdd\x66\x73\x1d\x20\x8e\xd8\x58\xb4\x32\xab\x13\x3b\x95\xa9\xe6\x3c\xb0\x61\x4b\xe8\xb7\x6b\x7b\x82\xfe\x83\x2c\xb8\xcb\x42\x1f\xcc\x2e\x2c\x53\x6e\xd3\x74\x8d\xcb\x18\xed\x73\xdd\x74\xdb\xb9\xfb\x01\xc5\xfc\x2e\x75\x1e\xfc\x3d\xf8\x7b\xf0\xf7\xe0\xef\xc1\xdf\x83\xbf\x07\x7f\x0f\xfe\x7e\xfb\x69\x0b\xfe\x1e\xfc\x3d\xf8\x7b\xf0\xf7\xe0\xef\xc1\xdf\x83\xbf\xbf\x38\xfe\x1e\xdc\x2f\xb8\x5f\x70\xbf\xa7\x31\xa3\xe0\x7e\xeb\xe2\x01\xf7\x7b\x6a\xdc\x6f\xeb\xec\xb7\x06\xee\x74\x4b\x5c\x99\x36\x59\xa0\x12\xad\x5d\xd9\x55\xba\x8d\xaf\x32\x2f\xd5\x18\xab\x0f\xbe\x81\xa3\x15\xaa\xee\x85\x54\xfd\x48\x43\xfd\x46\xf2\xca\x3b\x29\x51\x0d\x4b\x2e\x2c\xb9\xb0\xe4\xc2\x92\x7b\x6e\x96\xdc\x76\xc5\xcd\x1b\xad\xb9\x07\xab\x3b\xff\x2f\x2d\x38\xab\xc3\xbe\xa5\xb4\xef\x81\x5e\x51\x66\x1d\xd4\xc6\x56\x65\x4d\xa7\x82\xa5\x5a\x5a\xb9\x56\xf7\xd8\x9d\x64\xb1\x34\x27\x8b\xca\xd8\x42\xfa\xc3\x29\x64\xa6\xa4\x3e\x0b\xe3\x4c\x5f\x85\x4f\xc2\xaf\x78\x7d\x7c\x92\xc5\xc1\x6e\x79\xb7\x36\xac\x80\xd9\x6c\x91\xd1\x2e\xb3\xf5\xfc\xf5\x56\xb0\x60\xd1\xae\xb2\x31\xfb\x27\x7d\x91\x66\x8b\xd6\xce\x7b\x76\xcd\xee\x92\xe4\x3d\x29\xfe\xa1\x3e\xa5\x17\x52\x4f\xbc\x86\x5d\x6e\x49\xda\xe6\x56\x8b\x8d\xb7\x98\x28\x33\x96\xe3\x4c\xd3\xc1\xcc\xef\x3b\x14\xe4\x6f\x34\x3f\x1f\x4c\x22\x7f\x54\xf5\x88\x58\xeb\xf0\x04\xef\xd9\x54\xcc\x8c\x9f\x80\x37\xd5\x94\x50\xc2\x9e\x5e\xb4\x74\x16\xc2\x5c\x0e\x53\x8d\xa0\xe5\xb5\x14\x11\xa7\x05\x6a\x35\x01\xad\xb4\xb8\x1b\xd4\x98\x6d\xfd\xd6\xb0\x00\x31\x9e\xcf\x45\x18\xf3\x42\x24\xcf\x25\x81\x5f\x5e\xb9\x71\xf2\xd6\x22\x7d\x12\x3a\x8b\x32\x1e\xd0\xae\x89\x55\xe8\x01\x41\x79\x69\x93\x77\x84\x5b\xa5\x8b\x5c\x77\xb2\x3a\x5d\x5c\xbf\xe9\x06\x64\x3f\x32\x33\x67\xa0\x6b\x62\x6c\xfa\x39\x17\x5c\x36\xf6\x71\x8f\x69\xa6\x3e\x4f\xa8\xcb\x4d\xda\xd3\x16\xfd\x69\x28\xcb\x7f\x17\xe6\xa5\x9d\x5c\xd6\xb3\x2f\x07\x5b\xfe\xe0\x61\xc0\xc3\x80\x87\x01\x0f\x03\x1e\xa6\x37\x1e\xa6\xe5\x5d\xb0\xc2\xc5\x1c\xee\x5a\xfc\x58\xc9\xbd\x96\x26\x82\xe7\xc2\x1f\x41\x93\x4c\xa5\x3c\x22\x74\x34\x51\x49\x1c\x3c\xd7\xbc\xfe\xdc\xa2\x2b\x93\xb7\xe9\x65\x77\x3b\xfe\xfb\x98\x7d\x37\xe7\x99\x81\x2e\xa9\x90\x7a\xb3\x94\x77\xaa\x60\x2a\x4b\x1f\xb8\x74\x5e\x88\xd9\x42\xdc\xcc\x78\xe2\x74\xe5\xfb\x2b\xf3\xe7\xfb\x2b\x36\x8b\x25\x4f\xe2\x7f\xbb\x8b\x64\x2a\x18\x0f\xc9\x38\xaf\x6e\x8c\xe1\x32\x2c\xd5\x30\xd3\xfc\x28\x2f\x5f\x32\xfa\xe9\x98\x7d\x8a\xe9\x70\xac\x74\x5d\x65\xab\x63\x2b\xa9\x98\xc2\xa8\xc7\xa4\xa3\xa8\xe2\x61\x9f\x09\x35\x23\xf8\xe8\xc6\xbe\x16\xf2\x34\x99\x41\xbb\x55\xcc\x68\xe8\x7a\xc3\x3e\xa8\x1f\x2c\xe2\xd9\x94\x47\x35\xbb\xa4\x57\x6a\x44\x36\x53\xd9\x5c\xcf\x49\xa3\xbc\xbe\x2d\x8d\x68\xbd\xb8\x08\xf4\x3a\xc4\x9a\x1a\xd9\xc6\x1a\x4d\x06\x71\x58\xaa\xc2\x84\x15\xc8\x38\xe1\xe7\x58\x5f\xd6\xf6\x26\x75\x68\x60\x5c\x99\x4c\x77\x8f\x78\x2e\xc4\x7b\xd4\xd6\x3f\x36\x66\x77\x41\x20\xd2\x82\xee\xa6\xaa\x66\x37\x32\x63\x18\xb1\x6b\xbb\x00\xeb\x0b\x34\xff\x85\x8d\x7e\xe5\xc1\x63\x94\xa9\x85\x0c\xf5\x53\xe4\x9d\x4a\x0f\x2d\x09\xce\x40\x48\x8b\x8f\xeb\x8d\xb8\x11\x4c\x7d\x4b\xbf\xb0\xd1\x67\x95\x89\x4a\xb3\x2c\xe0\x79\xc0\x43\x3d\x7a\x2b\x1f\xe3\xbc\x4c\xed\xe5\x46\xf5\x5c\x69\x70\xe6\xdb\xd8\x67\x41\xa6\xcb\xcb\xfd\x38\x88\xf3\x8c\x49\xd3\x76\xf3\xb0\x89\x38\x3d\xd6\x2c\x80\x42\xed\x6d\x7e\x57\x69\xd4\xc3\xd9\x36\x8e\x49\xa8\xb6\x13\xd6\x06\x52\xf5\xa5\xf8\xa7\x91\xa4\x43\xec\xe3\x8e\x34\xdd\xf7\x82\x17\x8b\xb6\xfc\xdc\x39\x46\x5f\x99\x2b\xb9\x84\x4b\xa7\x12\x89\x35\xf4\x48\xcc\x0e\xd8\x6c\x04\x92\x5d\x4e\x20\x59\xbb\xeb\x64\x5b\x30\xd9\xe1\xf4\x2e\x38\x23\xc0\x19\x01\xce\x08\x70\x46\x80\x33\x42\xd3\xe1\x0b\x96\xfb\x84\x24\x02\xe2\x13\xc4\x27\x88\x4f\x10\x9f\x20\x3e\x41\x7c\x9e\x17\xf1\x09\x2e\x02\x5c\x04\xb8\x08\x70\x11\xbd\x73\x11\x3b\xf0\xf5\x03\x0d\xf5\x6a\x27\xc2\xd5\x70\xaf\x97\x5a\xdc\x06\xc5\xe2\xac\x7d\x01\x49\xfa\x90\xa4\xef\xac\x93\xf4\x21\x5b\xfd\xc0\x33\x16\xd8\x9f\xfe\x2c\x27\x59\xe5\x1d\x13\x80\x46\x53\x63\x5c\x6e\x25\xfb\xcc\x93\x5d\xd3\x7d\xfb\x05\xaf\x6e\x58\x3a\xdd\x1f\x82\x9d\xc4\xb1\x22\x96\xaa\x3a\xdf\x83\x8d\xa5\x22\xf3\xcb\x57\x2e\x79\x24\x32\x63\x48\x34\xa7\x63\x9e\xab\x20\x26\xcd\xd8\x9b\xec\x38\x59\x5e\x55\xc6\x84\x2c\x34\x54\x75\xa6\x82\x39\x7f\xd4\x52\x2c\x1e\x44\x2e\x1c\xde\xab\x46\x0c\xb9\xc8\x22\xc2\xbb\x64\x9e\x53\x19\xbb\x7d\xf7\xb3\x7e\x36\xe3\x01\xf1\x71\x89\x92\x91\x41\x77\x64\x42\x0b\x94\x2c\x78\x2c\xcd\x91\x44\x26\xaa\xf2\x59\xe2\x28\x2c\x5b\xc8\xa6\xcf\x5e\x81\x89\x54\xc2\x65\x34\x56\x59\x74\x93\x3e\x46\x37\x0b\x19\x07\x2a\x14\x37\x3f\x7d\xc9\x27\xba\x95\xbd\x6d\xde\x56\x38\x5d\x4e\xcf\xa0\xe0\xe0\x09\xa2\xb4\xb6\x08\xed\x5d\x0b\x84\xf6\xc1\x58\xee\x06\xd3\xe3\x77\x5b\x7b\x6c\xbc\x82\x07\xd3\xe5\x33\x84\xc1\x84\x3a\x86\x0d\x83\x5f\xb1\x2e\xd2\x87\x34\x54\xcf\xef\x31\x8b\x48\x0b\xcc\xd5\x90\x3a\x04\x09\x43\x00\xb4\xce\x00\x68\x21\x44\xfb\x82\x42\xb4\x11\x8b\x86\x58\x34\xc4\xa2\x21\x16\x0d\x3a\xe2\xba\x5d\x34\xc8\xc0\x8f\xe3\x68\x5f\x88\x5b\xd9\x16\xb7\x32\x70\x5d\xcc\x5b\xab\x3b\x8f\x56\xc9\x04\x0f\x97\x80\xd7\x36\x0d\x4a\xbf\xd2\x73\x88\x4a\x05\x89\x88\xbf\xc8\xf1\x6c\xaa\x7f\xe2\x41\x31\x66\xec\x93\xfe\xd7\xfd\x7e\xce\x63\x32\xe4\xe5\x2c\x48\x16\x79\x21\xb2\xf2\x7e\x31\x1e\xaa\x2c\x89\x1f\x05\x1b\xf9\x3e\x8e\x34\x8c\x74\xd0\x67\xcc\x26\x09\x97\x52\x18\xfc\x49\xe0\x84\x27\x06\x0f\xdd\xfe\xbc\xcf\x81\x4d\x7d\x3c\x12\x6c\xf0\x42\xf3\xa8\x7b\xea\xc4\xa7\x47\xca\x3e\x19\x89\xe9\xab\x22\xcd\x9d\x74\xac\x6f\xd6\x22\x17\x19\x39\x55\x95\x00\xfa\xb9\x67\x41\xe9\xce\x9c\x2f\x05\x3e\xec\xfb\x0c\xe6\xb8\xfa\x25\x10\x89\xa1\x5b\xe3\x5e\x42\x4a\xa3\x1a\x3c\xf8\xf5\xe3\xf1\xeb\xe4\xa8\xb3\x57\x39\xe1\x6b\x7a\xf7\x6f\x9b\x8f\xe7\xb9\xc8\x22\xd1\xea\xc9\xbc\xc8\x78\x21\xa2\x38\xb8\x6e\xff\x8e\xfe\xf9\xd9\x3e\x49\x17\x41\x1b\x4c\x95\xf2\xac\x88\x29\x8e\xce\x38\x95\xed\x88\xaf\xe8\x6b\xc3\x30\x50\xf7\xe5\x14\xb0\x41\x21\x99\xd4\x1d\xbb\x18\xcc\xd6\x67\x6e\xb6\xbe\x1c\xff\x80\xa5\x70\x14\xb7\xb9\x4c\xc8\x94\x3e\x68\xca\x30\xfc\xd7\x6b\x0e\xa1\x37\x64\xb4\x33\x71\xd2\x3c\xa1\x37\xa5\x92\xd7\xe6\x6d\x7a\x82\xec\xe6\x39\x7b\xfd\x5b\xae\xe4\xc4\x44\xa3\x7f\xd5\xc7\x9d\xfd\xf9\xbb\x3b\x04\xcb\x5f\xbe\x19\x92\xe3\x42\xfb\x75\xf3\x59\x65\x01\x11\x0b\x91\xa2\xc9\x57\xec\xfe\x6a\xa6\x7f\x77\x7f\xc5\xee\x6a\xd2\x24\x67\x77\xc3\x02\x90\x9e\x63\x37\xea\x35\x0f\x68\x02\x28\x9e\x39\x89\x03\x6b\xd7\x24\xb5\x48\xfd\xb0\x73\x6b\xe2\x7d\x53\xa1\xd2\x44\x8c\x99\xf9\x26\xa5\x31\x70\x6b\x8a\x5c\xce\x1b\x27\xc2\x7f\x7e\x1f\xf1\xea\x0f\x41\x3b\x32\x7f\x80\x76\x74\x64\x67\x85\x25\x4f\xed\x61\xeb\x47\x8b\xce\x2d\x64\x69\xc2\x83\x5d\x41\x9c\x7d\xeb\xbc\x61\x1c\x7c\x3b\x81\xdd\x2e\x04\xbb\x0d\x08\x22\xe1\x26\xf7\x7f\x81\x6f\xe7\xd9\x63\x8f\xc5\xd0\x2d\xb3\xaf\x58\x4b\x3f\x49\x0a\x59\x6b\xa8\xaa\xd6\x39\xa7\x67\xd3\x1a\xc8\x30\x7e\x8a\xc3\x05\x4f\xaa\x21\x92\xdc\x27\x32\xa1\xf1\x8e\x2b\x7e\x40\xef\xbd\x07\xd1\x88\x5a\x18\x95\xe9\xac\x6a\xf9\x89\x3c\xd2\x61\xb1\xcc\x0b\xc1\x6b\xf6\xc6\x65\x1c\xf4\x63\xc5\x98\xe5\xa3\xe0\x3e\xab\xec\x2e\x49\x3c\x28\xca\xaf\x06\x70\x9c\xad\x7d\xe1\xb2\x22\x17\x37\xd8\xe7\xfe\xe5\x27\xf4\x82\x4f\x25\x9a\xc3\x33\x0f\x65\x44\x9a\xc8\x33\x4e\x13\xb9\x9d\x14\xda\x96\x22\x72\xff\xfa\xa4\xed\x08\x2f\x24\x86\x44\x62\x48\x24\x86\x44\x62\xc8\x73\x4b\x0c\xb9\xfd\xe4\x6d\x4c\x0a\xd9\xb3\x7b\xc1\xc1\x52\x41\x6e\x1f\xfe\xfa\x34\x90\x43\x96\xc1\x2e\xc9\x1f\xb7\xcb\x60\x7d\xe2\xc7\x9e\x65\x80\x74\x8f\x48\xf7\x88\x74\x8f\x48\xf7\x88\x74\x8f\xbd\xa5\x7b\x6c\x71\xfa\xaf\xa4\x7a\xdc\x18\x55\x78\x41\xde\x85\xed\x46\x73\xc6\xe9\x2a\xb7\x8b\x7b\x53\xaa\xca\xc3\xca\x1d\x09\x2a\x7b\x99\xd1\xd5\xe4\x94\x3d\x4f\xeb\x51\x53\x52\x6e\x17\xcf\x86\x74\x94\x7d\x1f\x9b\x43\x4d\x42\xb9\x5d\x68\x0d\x14\xc6\xde\xf6\x3c\xfb\xd3\x9f\x3b\x12\x61\x1b\xd3\x86\x5c\x30\x3f\xb6\xe4\x25\xf4\x8f\x25\x96\x01\xcc\x18\x98\x31\x06\x66\x0c\xcc\x18\x98\x31\x30\x63\x60\xc6\xc0\x8c\x81\x19\x03\x33\x06\x66\x6c\x98\xac\x10\x98\x31\x30\x63\x60\xc6\xc0\x8c\x81\x19\x03\x33\x06\x66\xec\x14\x99\x31\x24\x1c\x01\x25\x08\x4a\x10\x94\xe0\xa0\x67\x14\x94\x60\x5d\x3c\xa0\x04\xcf\x90\x12\x6c\xa8\x24\xd0\x13\x33\x58\xa5\x03\xa5\xc3\x3d\x6a\xc6\x1e\x63\x19\x76\x48\x0b\xbe\x2d\x75\x1c\xd2\xe3\x2c\x1e\xd6\x6a\x52\xa9\xbc\x8d\x6a\x4a\x7f\xa5\xed\x17\x91\x8a\x20\x14\x41\x28\x9e\x12\xa1\x08\x32\x11\x64\x22\xc8\x44\x90\x89\x20\x13\x41\x26\x82\x4c\x04\x99\x08\x32\x11\x64\x22\xc8\x44\x90\x89\x20\x13\x41\x26\x82\x4c\x04\x99\x78\x22\x64\x22\x0a\x31\x80\x17\x05\x2f\x3a\x54\x16\x0d\xbc\x28\x78\x51\xf0\xa2\xe0\x45\x97\x84\x76\x28\x5e\xf4\xaf\x42\x48\xda\x15\x37\x7b\x51\x9c\x47\x49\xf4\xbb\x34\xc9\x11\x95\x82\x9d\xa9\x6c\xee\x17\x35\x67\x86\x80\x59\x4f\x56\x46\xa2\xf8\xe4\xc7\x7e\x37\xf9\xf2\x5f\xcb\xcf\x23\xb5\xf1\x8e\xbc\xa1\x17\xe2\xa9\xb3\x86\x7e\x59\x54\xde\x79\x55\xfd\xee\xda\x2d\xe4\xfc\x0a\x4e\x7a\x2b\xd5\x14\x7d\x73\x34\xb6\xdd\x47\x96\xf6\xbf\x9b\x7c\xf9\xbd\xe9\x55\x6c\xa9\xdd\xb7\x94\x13\x24\x05\x64\x9f\xcd\xce\x6a\xe0\xe4\x77\xdb\x61\xb1\x8c\x32\x91\xd7\x67\xaf\x7b\xc7\x1c\x63\x19\xce\xac\x6d\xc9\x99\x1e\x9c\x4f\xce\x17\xd3\x87\x0d\x9b\x43\xbf\xbf\xb2\x3b\xec\x6b\xc8\x43\xbd\x2c\xfc\xc1\xec\xc8\x71\xb9\xe0\x7c\x46\x7c\x3b\x6b\x67\xbf\x0d\xb7\xbb\xc6\x74\x16\x66\x5f\xde\xb3\x8d\x6e\x31\xab\xdb\x0b\x8e\x31\x70\x8c\x81\x63\x0c\x1c\x63\xe0\x18\x03\xc7\x18\x38\xc6\xc0\x31\x06\x8e\x31\xc7\x96\x01\x1c\x63\xe0\x18\x03\xc7\x18\x38\xc6\xc0\x31\x06\x8e\x31\xa7\xe7\x18\x03\xa7\x0a\x38\x55\xc0\xa9\xe2\x34\x66\x14\x4e\x15\x75\xf1\xc0\xa9\xe2\x24\x9c\x2a\x1c\x5f\xb5\x26\xc6\xbc\x91\xc6\x32\x70\xa7\x5b\x26\xcb\xb4\xc9\x02\x95\x68\xed\xca\xae\xd2\xed\x04\x96\x79\x6d\x85\xc2\xfa\xe0\x9b\x29\x23\xbc\x1b\x1a\xeb\xb7\xbc\x7c\x2f\x8c\xeb\x47\x1a\xf0\x37\x92\x5b\xde\x49\x4d\x79\x58\x74\x61\xd1\x85\x45\x17\x16\xdd\x73\xb3\xe8\x6e\xb8\x6f\xb7\x59\x75\x37\x63\xb7\xcd\xf7\xee\x4e\x67\xef\xbf\xb4\xe0\xac\x2e\xfb\x96\x4a\x2f\x04\x7a\x45\x99\x75\x50\x1b\x5b\x95\x3d\x9d\x0a\x96\x6a\x69\xe5\x5a\xed\x63\x77\x92\xc5\xd2\x9c\x2c\x2a\x63\x0b\xe9\x0f\xa7\x90\x85\xd9\xf3\xef\x0b\xc9\xc2\x38\xd3\x97\xe1\x93\xf0\x2b\x5e\x1f\x9f\x64\x79\xb0\x5b\xde\xad\x0d\x2b\x60\x36\x5b\x64\xb4\xcb\xd2\x4c\x05\x22\x27\x13\x81\x05\x8d\x76\x95\x8d\xd9\x3f\xe9\x8b\x34\x5b\xb4\x76\xde\xb3\x6b\x76\x97\x24\xef\xc9\x00\x10\xea\x53\x7a\x21\xf5\xc4\x6b\xf8\xe5\x96\xa4\x6d\x4e\x84\x7b\x4c\x94\x19\xcb\x71\xa6\xe9\x60\x66\xf8\x76\xa2\x58\x6f\x8a\x3f\x98\x44\xfe\xa8\xea\x13\xb1\xd6\xe5\x09\xe6\xb3\xa9\x98\x19\x7f\x01\x6f\xb2\x29\xa1\x84\x3d\xbd\x68\xe9\x2c\x84\xb9\x1c\xa6\x1a\x49\xcb\x6b\x29\x22\x4e\x0b\xd4\x6a\x04\x5a\x79\x71\x37\xa8\x31\xdf\xfa\xad\x61\x81\x62\x3c\x9f\x8b\x30\xe6\x85\x48\x9e\x4b\x22\xbf\xbc\x72\xe3\xe4\xad\x45\xfc\x24\x74\x16\x65\x3c\xa0\x5d\x13\xab\xd0\x03\x82\xf2\xd2\x26\x2f\x09\xb7\x4a\x17\xb9\xee\x64\x75\xba\xb8\x7e\xd3\x0d\xc8\x7e\x64\x66\xce\x40\xd7\xc4\xd8\xf4\x73\x2e\xb8\x6c\xec\xe3\x1e\xd3\x4c\x7d\x9e\x50\x97\x9b\xb4\xa8\x2d\x7a\xd4\x50\x96\xff\x2e\x0c\x4c\x3b\xb9\xac\x67\x61\x0e\xb6\xfc\xc1\xc7\x80\x8f\x01\x1f\x03\x3e\x06\x7c\x4c\x6f\x7c\x4c\xcb\xbb\x60\x85\x93\x39\xdc\xb5\xf8\xb1\x92\xeb\x30\x4d\x04\xcf\x85\x3f\x82\x26\x99\x4a\x79\x44\xe8\x68\xa2\x92\x38\x78\xae\x79\xff\xb9\x45\x57\x26\x4b\xd4\xcb\xee\x76\xfc\xf7\x31\xfb\x6e\xce\x33\x03\x5d\x52\x21\xf5\x66\x29\xef\x54\xc1\x54\x96\x3e\x70\xe9\xbc\x11\xb3\x85\xb8\x99\xf1\xc4\xe9\xca\xf7\x57\xe6\xcf\xf7\x57\x6c\x16\x4b\x9e\xc4\xff\x76\x17\xc9\x54\x30\x1e\x92\x91\x5e\xdd\x18\x03\x66\x58\xaa\x61\xa6\xf9\x51\x5e\xbe\x64\xf4\xd3\x31\xfb\x14\xd3\xe1\x58\xe9\xba\xca\x56\xc7\x56\x52\x32\x85\x51\x8f\x49\x47\x51\xc5\xc3\x3e\x13\x6a\x46\xf0\xd1\x8d\x7d\x2d\xe4\x69\x32\x87\x76\xab\x98\xd1\xd0\xf5\x86\x7d\x50\x3f\x58\xc4\xb3\x29\x8f\x6a\xf6\x49\xaf\xd4\x88\x6c\xa6\xb2\xb9\x9e\x93\x46\x79\x7d\x5b\x1a\xd1\x7a\x71\x11\xe8\x75\x88\x35\x35\xb2\x8d\x35\x9a\x0c\xe2\xb0\x54\x85\x09\x2b\x90\x71\xc2\xcf\x71\x4e\x01\x66\xf4\x57\x87\x06\xc6\x95\xc9\x74\xf7\x88\xe7\x44\xbc\x67\x6d\xfd\x63\x63\x76\x17\x04\x22\x2d\xe8\x6e\xaa\x6a\x76\x23\x33\x86\x11\xbb\xb6\x0b\xb0\xbe\x40\xf3\x5f\xd8\xe8\x57\x1e\x3c\x46\x99\x5a\xc8\x50\x3f\x45\x5e\xaa\xf4\xd0\x92\xe0\x0c\x84\xb4\xf8\xb8\xde\x88\x1b\xc1\xd4\xb7\xf4\x0b\x1b\x7d\x56\x99\xa8\x34\xcb\x02\x9e\x07\x3c\xd4\xa3\xb7\xf2\x31\x4e\xcc\xd4\x5e\x6e\x54\xcf\x95\x06\x67\xbe\x8d\x7d\x16\x64\xba\xbc\xdc\x8f\x83\x38\xcf\x98\x3c\x6d\x37\x0f\x9b\x08\xd4\x63\xcd\x02\xa8\xd4\xde\xe6\x77\x95\x4e\x3d\x9c\x6d\xe3\x98\xc4\x6a\x3b\x61\x6d\x20\x57\x5f\x8a\x7f\x1a\xc9\x3a\x04\x46\xee\x48\xd3\x7d\x2f\x78\xb1\x68\xcb\xcf\x9d\x6b\x20\x96\xb9\x96\x4b\xc8\x74\x22\x41\x59\xa7\x11\xa5\xd9\x09\xb1\x8d\xd8\xb2\xcb\x89\x2d\x6b\x77\xb3\x6c\x8b\x2f\x3b\x9c\x0a\x06\xbf\x04\xf8\x25\xc0\x2f\x01\x7e\x09\xf0\x4b\x68\x3a\x7c\x41\x78\x9f\x90\x44\xc0\x81\x82\x03\x05\x07\x0a\x0e\x14\x1c\x28\x38\xd0\xf3\xe2\x40\x41\x4b\x80\x96\x00\x2d\x01\x5a\xa2\x77\x5a\x62\x07\xea\x7e\xa0\xd1\x5f\xed\x44\xb8\x1a\x01\xf6\x52\x8b\xdb\xa0\x08\x9d\xb5\x2f\x20\x81\x1f\x12\xf8\x5d\x46\x02\x3f\x94\x88\x18\x78\x36\x03\xfb\xd3\x9f\xe5\x24\xab\xbc\x63\x46\xd0\xa8\x6c\x8c\xcb\x16\xec\x9f\x79\xb6\x1f\xfe\x6f\xbf\xc0\xd6\x0d\x4b\xa8\xaf\x53\xb1\x93\x48\x57\x44\x5b\x55\x67\x7d\xb0\xd1\x56\x64\x95\xf9\xca\x25\x8f\x44\x66\xec\x8b\xe6\xac\xcc\x73\x15\xc4\xa4\x30\x7b\x4b\x1e\x27\x83\xac\xca\x98\x90\x85\x46\xb0\xce\x82\x30\xe7\x8f\x5a\x8a\xc5\x83\xc8\x85\x83\x81\xd5\x98\x22\x17\x7b\x44\x30\x98\xac\x76\x2a\x63\xb7\xef\x7e\xd6\xcf\x66\x3c\x20\x9a\x2e\x51\x32\x32\xa0\x8f\x2c\x6b\x81\x92\x05\x8f\xa5\x39\xa0\xc8\x72\x55\x3e\x4b\xd4\x85\x25\x11\xd9\xf4\xd9\xeb\x35\x91\x4a\xb8\x8c\xc6\x2a\x8b\x6e\xd2\xc7\xe8\x66\x21\xe3\x40\x85\xe2\xe6\xa7\x2f\xf9\x44\xb7\xb2\xb7\x29\xdc\x0a\xa7\xcb\xe9\x19\x14\x4a\x3c\x59\xf0\xd6\x16\xb8\xbd\x6b\x01\xdc\x3e\x18\xb3\xde\xc0\xfa\xfd\x6e\x6b\xbf\x8d\x0f\xf1\xc0\x3a\x7e\xa6\x48\x99\x90\xc9\xa0\x91\xf2\x2b\xd6\x45\xf6\x11\xf3\xdb\xff\x1c\x28\x09\x49\x2b\x58\xb6\x26\xf3\x08\xf2\x8d\x00\x85\x9d\x05\x0a\x43\x84\xf7\x05\x45\x78\x23\x94\x0d\xa1\x6c\x08\x65\x43\x28\x1b\x14\xc8\x75\xbb\x68\x90\x71\x23\xc7\x51\xc7\x10\xf6\x62\x9f\xdb\x18\xf6\x32\x6c\xb5\xcc\xdb\xb6\x3b\x0f\x76\xc9\x04\x0f\x97\xb0\xd7\x76\x65\x4a\xbf\x74\x90\x08\x97\x0a\x28\x11\x7f\x91\xdf\xda\x54\xff\xc4\x83\x62\xcc\xd8\x27\xfd\xaf\xfb\xfd\x9c\xc7\x64\xf0\xcb\x59\x90\x2c\xf2\x42\x64\xe5\x55\x63\x1c\x5c\x59\x12\x3f\x0a\x36\xf2\xbd\x1c\x69\x44\xe9\x50\xd0\x98\x4d\x12\x2e\xa5\x30\x50\x94\x70\x0a\x4f\x0c\x34\xba\xfd\x79\x9f\xb3\x9b\xfa\x78\x24\x04\xe1\x85\xe6\x01\xf8\xd4\x89\x4f\x8f\x94\x7d\x32\x12\xd3\xb7\x46\x9a\x3b\xe9\x58\xd7\xae\x45\x2e\x32\xf2\xc9\x2a\xb1\xf4\x73\xcf\x82\xd2\x9d\x39\x5f\x06\x7d\xd8\x57\x1b\x4c\x75\xeb\x6e\x85\x48\x0c\xdc\x52\xf7\x12\x4e\x9b\x08\x1a\x6b\x2d\x69\xec\x41\x1b\xb2\x7a\x28\x3c\x35\x08\xfa\x93\x23\xe8\xc9\xe5\x67\xaf\x22\xc6\xd7\xf4\xee\xdf\x36\x9f\xd4\x73\x91\x45\xa2\xd5\x93\x79\x91\xf1\x42\x44\x71\x70\xdd\xfe\x1d\xfd\xf3\xb3\x7d\x92\xee\x84\x36\x30\x2b\xe5\x59\x11\x53\x44\x9e\x71\x4f\xdb\x19\x72\xd1\xf7\x86\x64\xbe\xee\xcb\xab\x60\x83\xba\x32\xa9\xbb\x8a\x31\x18\xb5\xcf\xdc\xa8\x7d\x39\xae\x05\x4b\x01\x2e\x6e\x73\x99\x20\x2c\x7d\xe0\x94\x81\xfd\xaf\xd7\x1c\x46\x6f\xc8\xa4\x67\x22\xaf\x79\x42\x6f\x4a\x25\xaf\xcd\xdb\xf4\x04\x59\xd5\x73\xf6\xfa\xb7\x5c\xc9\x89\x89\x6f\xff\xaa\x8f\x3d\xfb\xf3\x77\x77\x18\x96\xbf\x7c\x33\x24\x9f\x87\xf6\xeb\xe6\xb3\xca\x02\xa2\x1d\x22\x45\x93\xaf\xd8\xfd\xd5\x4c\xff\xee\xfe\x8a\xdd\xd5\xa4\x49\xee\xf3\x86\x23\x20\xd5\xc7\x6e\xd4\x6b\x1e\xd0\x04\x50\x84\x74\x12\x07\xd6\xea\x49\x9a\x92\xfa\x61\xe7\xd6\x44\x10\xa7\x42\xa5\x89\x18\x33\xf3\x4d\x4a\x8c\xe0\xd6\x14\x39\xb1\x37\x4e\x84\xff\xfc\x3e\xe2\xd5\x1f\x82\xc2\x64\xfe\x00\x85\x69\x28\x0a\x53\xba\xe4\x05\x3e\x68\x95\x69\xd1\xb9\x15\x2d\x4d\x78\xb0\x3b\xaa\xb3\xef\x5d\x02\xae\x83\xb7\x28\x20\xdd\x45\x41\xba\x01\x21\x27\x5c\xf0\xfe\x2f\xf0\x16\xbd\x38\x60\xb2\x18\xb8\x25\xf7\x15\xeb\xd0\xe7\xf2\x26\x37\x9c\x6e\xc5\xf5\xb2\x1f\xce\xd0\x7c\xc7\xdd\x65\xdd\xb3\x87\x96\x9b\xc6\x81\x85\x8d\x0f\x0a\x07\x14\x0e\x28\x1c\x50\x38\x8d\x4f\x1e\x8f\xc2\xd9\xff\x06\x6c\x49\xe6\x34\x5c\x81\x27\xa9\xfa\x83\xd2\x81\xfe\x7f\x79\xfa\x3f\x28\x9d\x2e\xd7\x0d\x28\x1d\x58\x7c\xa0\x40\x81\xd2\xa9\x0b\xed\x00\x94\xce\x4b\xec\x1c\x2d\xc9\x9d\x73\xc1\x79\xa0\x78\x00\xf1\x2e\x0a\xe2\x0d\x08\x49\xe1\xc2\xf7\x7f\x01\xc5\x73\x71\x40\xe5\x3c\x28\x1e\x4a\x85\x58\x32\x3a\xbd\x72\x38\x36\x63\xb6\x0c\xe3\xa7\x38\x5c\xf0\xa4\x9a\x7d\x93\xfb\x1c\xf9\x76\xc4\xe3\x4a\xc0\xf8\x7b\x1f\x6a\x3e\xa2\x36\x46\x65\xad\x94\x5a\xf1\x0b\x0f\x86\x58\x2c\xf3\x42\xf0\x9a\xfd\x72\x19\x2a\xfd\x68\x34\x88\x55\x52\x2c\x7e\x56\xd9\x5d\x92\x78\xe4\x34\x08\x5e\x68\xed\x0b\x97\x95\x1c\x73\x83\x75\x8f\x72\xbb\x7e\x7a\x12\xf2\xd2\x53\x64\xd2\x3c\x9e\x77\x9e\x4c\x14\x23\x3b\xe3\x62\x64\xdb\xd9\xa6\x6d\x85\xc8\x36\x9a\xb3\x3a\x60\xd2\x50\x7e\x0c\xe5\xc7\x50\x7e\x0c\xe5\xc7\xce\xad\xfc\xd8\xf6\x93\xb7\xb1\xf4\x58\xcf\x7e\x0b\x07\x2b\x38\xb6\x7d\xf8\xeb\x8b\x8d\x0d\x59\x06\xbb\x94\x18\xdb\x2e\x83\xf5\xe5\xc5\x7a\x96\x01\x8a\x8a\xa1\xa8\x18\x8a\x8a\xa1\xa8\x18\x8a\x8a\xf5\x56\x54\xac\xc5\xe9\xbf\x52\x50\x6c\x63\x1e\xca\x0b\x72\x5b\x6c\x37\x9a\x33\x2e\x8a\xb6\x5d\xdc\x9b\x0a\xa2\x1d\x56\xee\x28\x83\xd6\xcb\x8c\xae\x96\x40\xeb\x79\x5a\x8f\x5a\xf8\x6c\xbb\x78\x36\x14\x3d\xeb\xfb\xd8\x1c\x6a\xa9\xb3\xed\x42\x6b\x60\x31\xf6\xb6\xe7\xd9\x9f\xfe\xdc\x85\x13\xdb\x16\xfc\x74\xf1\x54\xd9\x8a\x4f\xd1\x3f\x96\xc8\x06\x90\x64\x20\xc9\x18\x48\x32\x90\x64\x20\xc9\x40\x92\x81\x24\x03\x49\x06\x92\x0c\x24\x19\x48\xb2\xc1\x12\x44\x20\xc9\x40\x92\x81\x24\x03\x49\x06\x92\x0c\x24\x19\x48\xb2\x53\x24\xc9\x90\xd4\x04\xec\x20\xd8\x41\xb0\x83\x83\x9e\x51\xb0\x83\x75\xf1\x80\x1d\x3c\x43\x76\xb0\xa1\x1c\x75\x4f\x24\x61\x95\x19\x94\x0e\xf7\xa8\x19\x7b\x8c\x65\xd8\x29\x43\xf8\xb6\xd4\x72\x48\x93\xb3\x88\x58\x2b\x4a\xa5\xfa\x36\xaa\xa9\xfd\x95\xb6\x3b\xe0\x17\xc1\x2d\x82\x5b\x3c\x35\x6e\x11\xbc\x22\x78\x45\xf0\x8a\xe0\x15\xc1\x2b\x82\x57\x04\xaf\x08\x5e\x11\xbc\x22\x78\x45\xf0\x8a\xe0\x15\xc1\x2b\x82\x57\x04\xaf\x08\x5e\xf1\x34\x78\x45\x54\x7e\x00\x49\x0a\x92\x74\xb8\x94\x1a\x48\x52\x90\xa4\x20\x49\x41\x92\x2e\x09\xed\x40\x24\xe9\x2c\x51\x3f\x34\x58\xcc\x54\x32\xf6\x66\x66\x62\x8a\x62\x75\xb3\x17\x03\x7a\x94\x64\xc1\x4b\xd3\x1e\x89\x82\xc5\x72\xa6\xb2\xb9\x5f\xe6\x9c\x19\x4e\x66\x3d\x93\x19\x89\xe2\x73\x29\x8d\x3b\x27\x8c\xbb\xc9\x97\xff\x5a\x7e\x13\x89\x92\x77\x24\x16\xbd\x10\x4f\x9c\x56\x9c\x35\x2c\x90\xca\xdb\xaf\xaa\x3d\xd8\x61\xa3\x39\xff\x84\x93\xde\x70\x35\x13\x81\x39\x52\x77\xdf\x6d\xd6\x7f\xe0\x6e\xf2\xe5\xf7\xa6\x46\xb0\xf1\x76\xdf\x78\x4e\x90\x14\xe2\x7d\x86\xfb\xaf\x81\xe0\x7f\xe9\x3e\xd4\x0f\x99\xe9\xa8\xa5\x0a\x30\x26\x9a\x6e\x1d\x81\x4c\x9b\x2c\x50\x49\x22\x02\x77\x59\xe9\x9d\xf1\xdd\x2c\x87\xf5\x3b\xc8\xbc\xb9\x61\x13\x7d\xf0\x6d\x36\xb7\xd7\x6f\xd5\x90\x5e\x96\xf3\x47\x1a\xf3\x37\x92\x5e\x37\x45\x42\xc0\x45\x83\x8b\x06\x17\x0d\x2e\xfa\xdc\xb8\xe8\x76\xe5\x65\x1a\xf9\xe8\x83\x55\xfe\x41\x81\xa6\xd6\x13\x75\xcc\x02\x4d\x07\x73\x20\xd8\xa1\x24\x52\x23\x81\x7e\x30\x89\xfc\x51\xb5\xa1\xc5\x92\xe5\xc6\xb4\xc5\xa6\x62\x66\x3c\x1d\x3d\xd9\x54\x42\x09\x7b\x7a\xd1\xd2\xa9\x94\xa4\x92\x4a\x5e\x4b\x11\x71\x5a\xa0\xd6\x0a\x56\x2d\x5d\x65\x88\x67\xbf\x35\x2c\x5c\x8c\xe7\x73\x11\xc6\xbc\x10\xc9\x73\xe9\x82\x58\x5e\xb9\x71\xf2\xd6\x5a\xb9\x48\xe8\x2c\xca\x78\x40\xbb\x26\x56\xa1\x07\x04\xe5\xa5\x4d\xfe\x9d\x6e\x95\x2e\x72\xdd\xc9\xea\x74\x71\xfd\xa6\x1b\x90\xfd\xc8\xcc\x9c\x81\xae\x89\xb1\xe9\xa7\x29\xa3\xd9\xd0\xc7\x3d\xa6\x99\xfa\x3c\xa1\x2e\x37\x59\x0e\xb7\xd8\x0e\x87\xb2\xfc\x77\xf1\x1d\x69\x27\x97\xf5\xfe\x23\x07\x5b\xfe\xf0\x24\x81\x27\x09\x3c\x49\xe0\x49\x02\x4f\x92\xde\x3c\x49\x5a\xde\x05\x2b\xde\x24\x87\xbb\x16\x3f\x56\xa2\xd2\xd2\x44\xf0\x5c\xf8\x23\x68\x92\xa9\x94\x47\x84\x8e\x26\x2a\x89\x83\xe7\x5a\xdc\x82\x5b\x74\x65\x58\x9b\x5e\x76\xb7\xe3\xbf\x8f\xd9\x77\x73\x9e\x19\xe8\x92\x0a\xa9\x37\x4b\x79\xa7\x0a\xa6\xb2\xf4\x81\x4b\x17\x47\x91\x2d\xc4\xcd\x8c\x27\x4e\x57\xbe\xbf\x32\x7f\xbe\xbf\x62\xb3\x58\xf2\x24\xfe\xb7\xbb\x48\xa6\x82\xf1\x90\x88\x69\x75\x63\x48\xbb\xb0\x54\xc3\x4c\xf3\xa3\xbc\x7c\xc9\xe8\xa7\x63\xf6\x29\xa6\xc3\xb1\xd2\x75\x95\xad\x8e\xad\x74\x43\x28\x8c\x7a\x4c\x3a\x8a\x2a\x1e\xf6\x99\x50\x33\x82\x8f\x6e\xec\x6b\x21\xcf\x5e\x45\xbe\x77\x52\xcc\x68\xe8\x7a\xc3\x3e\xa8\x1f\x2c\xe2\xd9\x94\x47\x35\x2b\xa5\x57\x6a\x44\x36\x53\xd9\x5c\xcf\x49\xa3\xbc\xbe\x2d\x8d\x68\xbd\xb8\x08\xf4\x3a\xc4\x9a\x1a\xd9\xc6\x1a\x4d\x06\x71\x58\xaa\xc2\x84\x15\x4c\x2d\x76\x37\xc7\x39\xb1\x7d\xf4\x57\x87\x06\xc6\x95\xc9\x74\xf7\x88\xf7\x03\xf0\x31\x41\xf5\x8f\x8d\xd9\x5d\x10\x88\xd4\x14\x7b\xad\x6a\x76\x23\x33\x86\x11\xbb\xb6\x0b\xb0\xbe\x40\xf3\x5f\xd8\xe8\x57\x1e\x3c\x46\x99\x5a\xc8\x50\x3f\x45\xf1\x35\xf4\xd0\x92\xe0\x0c\x84\xb4\xf8\xb8\xde\x88\x1b\xc1\xd4\xb7\xf4\x0b\x1b\x7d\x56\x99\xa8\x34\xcb\x02\x9e\x07\x3c\xd4\xa3\xb7\xf2\x31\xe1\x57\xd4\x5e\x6e\x54\xcf\x95\x06\x67\xbe\x8d\x7d\x16\x64\xba\xbc\xdc\x8f\x83\x38\xcf\xd8\x61\xa8\xdd\x3c\x6c\x72\x1a\x3a\xd6\x2c\xc0\x7d\xa8\xb7\xf9\x5d\x75\x21\x3a\x9c\x6d\xe3\x98\xce\x44\xed\x84\xb5\xc1\xa1\xe8\xa5\xf8\xa7\x91\xb2\x03\xeb\xbc\x23\x4d\xf7\xbd\xe0\xc5\xe2\xe4\xab\x4c\xb7\x24\x9b\x2b\xad\xac\x89\x26\x37\x17\x74\x09\x9e\xba\x08\x2c\xdf\xc4\x63\x37\x87\x9a\x37\x92\xc0\x3b\x47\x9b\x77\x9e\x09\xc3\xd8\xd0\x32\xab\x77\x3b\xb0\xef\x92\x60\xb4\x62\xc2\x75\x13\x1b\x78\xf0\x97\xb1\xdf\x08\x9d\xbf\x9c\xd0\xf9\x76\xd7\xcf\xb6\xf0\xf9\xc3\xe9\x69\x70\x5e\x80\xf3\x02\x9c\x17\xe0\xbc\x00\xe7\x85\xa6\xc3\x17\xac\xf8\x09\x49\x04\x44\x29\x88\x52\x10\xa5\x20\x4a\x41\x94\x82\x28\x3d\x2f\xa2\x14\xdc\x05\xb8\x0b\x70\x17\xe0\x2e\x7a\xe7\x2e\x76\xe0\xf7\x07\x1a\x16\xdd\x4e\x84\xab\xa1\xd1\x2f\xb5\xb8\x0d\x8a\xf5\x59\xfb\xc2\x65\xa5\x29\x1e\x57\x19\x0e\x4b\x4c\x8c\x4b\x53\xfe\x05\x45\x33\x6e\x27\x98\xba\xaa\x82\x7a\x2c\x52\x69\x8f\x14\xc6\xa7\x92\x10\xe7\xd5\xd2\x24\x5e\xa5\x2a\xef\x98\x41\x33\xca\x0d\xe3\xed\xc8\x32\xf3\x74\x6f\x74\xd9\x7e\xc1\xa2\x1b\x12\x2b\xf5\x79\x88\x74\x12\x41\x8a\x28\xa6\xea\xcc\x0f\x36\x8a\x89\x0c\x19\x5f\xb9\xe4\x91\xc8\x8c\x49\xce\x64\x11\xcb\x73\x15\xc4\xa4\x63\x7a\xe3\x17\x27\x1b\xa6\xca\x98\x90\x85\x06\x7d\x4e\xe9\x9e\xf3\x47\x2d\xc5\xe2\x41\xe4\xc2\x21\xa7\x6a\xac\x8e\x8b\xe9\x21\xe4\x48\x86\x2e\x95\xb1\xdb\x77\x3f\xeb\x67\x33\x1e\x10\xb3\x95\x28\x19\x19\x9c\x44\xc6\x28\xbd\x36\x79\x2c\xcd\x49\x45\xc6\x9e\xf2\x59\xb2\xf6\x5b\xde\x8d\x4d\x9f\xbd\x2a\x10\xa9\x84\xcb\x68\xac\xb2\xe8\x26\x7d\x8c\x6e\x16\x32\x0e\x54\x28\x6e\x7e\xfa\x92\x4f\x74\x2b\x7b\x5b\x8f\xad\x70\xba\x9c\x9e\x41\x01\xab\x93\xc6\x3b\x6d\xb1\xce\xbb\x16\x58\xe7\x83\xb1\x86\x0d\xb0\xef\xef\xb6\xf6\xdd\xf8\xe8\x0e\xb0\xf3\x67\x0f\x32\x09\xb8\x9c\x1e\xc8\x7c\xc5\x5e\x9c\x03\xa4\xa1\x20\x50\x8f\xa9\x40\x5a\xe2\xb8\xad\xe9\x3f\x90\xf4\x83\xad\x93\x34\x20\x5b\x75\x92\x07\x0b\xd9\x10\x66\x7d\x41\x61\xd6\x88\x27\x43\x3c\x19\xe2\xc9\x10\x4f\x06\x6d\x73\xdd\x2e\x1a\x64\xf0\xc6\x71\x74\x36\xc4\x9e\xac\xb4\xb2\x31\xf6\xe4\x04\xf5\x36\x6f\x30\xef\x3c\xe2\x24\x13\x3c\x5c\x82\x66\xad\x34\x2e\xfd\xde\xa1\xc2\x4c\x2a\xc8\x45\xfc\x45\xce\x63\x53\xfd\x13\x0f\x8a\x31\x63\x9f\xf4\xbf\xee\xf7\x73\x1e\x93\x09\x31\x67\x41\xb2\xc8\x0b\x91\x95\xf7\x91\xf1\x32\x65\x49\xfc\x28\xd8\xc8\x97\x64\x1d\x69\xd8\xe9\xa0\xd2\x98\x4d\x12\x2e\xa5\x30\x78\x95\xc0\x0c\x4f\x0c\x7e\xba\xfd\x79\x9f\x03\x9e\xfa\x78\x24\x98\xe1\x85\xe6\x51\xfa\xd4\x89\x4f\x8f\x94\x7d\x32\x12\xd3\x57\x4b\x9a\x3b\xe9\x58\xff\xaa\x45\x2e\x32\x72\x8c\x2a\x01\xf7\x73\xcf\x82\xd2\x9d\x39\x5f\x1a\x7b\xd8\xf7\x1f\x8c\x7e\xed\xae\x8f\x48\x9c\xa2\xcd\xef\x25\xc4\x72\xb5\x5e\xce\xba\x4e\x9c\x52\xc9\x9c\xd3\x25\xca\xc9\x49\x65\xaf\x14\xe8\xd7\xf4\xee\xdf\x36\x1f\x6b\x73\x91\x45\xa2\xd5\x93\x79\x91\xf1\x42\x44\x71\x70\xdd\xfe\x1d\xfd\xf3\xb3\x7d\x92\x0e\xd0\x36\xc8\x24\xe5\x59\x11\x53\x0c\x99\x71\xa8\xda\x07\xa5\xd0\x27\x07\x66\x16\xee\x8b\xde\xdf\xa0\x06\x4c\xea\x2e\x4e\x0c\xc6\xe2\x33\x37\x16\x5f\x0e\xbf\xbf\x14\x98\xe1\x36\x97\x09\x1e\xd2\xc7\x4e\x19\x90\xfe\x7a\xcd\x91\xf4\x86\x4c\x65\x26\x62\x98\x27\xf4\xa6\x54\xf2\xda\xbc\x4d\x4f\x90\xb5\x3a\x67\xaf\x7f\xcb\x95\x9c\x98\xb8\xec\xaf\xfa\xf0\xb3\x3f\x7f\x77\x47\x62\xf9\xcb\x37\x43\x72\x3c\x68\xbf\x6e\x3e\xab\x2c\x20\x73\x7e\xa4\x68\xf2\x15\xbb\xbf\x9a\xe9\xdf\xdd\x5f\xb1\xbb\x9a\x34\xc9\xed\xdb\xd8\xde\x49\x5b\xb0\x1b\xf5\x9a\x07\x34\x01\x14\xd9\x9b\xc4\x81\xb5\x26\x92\x72\xa1\x7e\xd8\xb9\x35\x91\xaf\xa9\x50\x69\x22\xc6\xcc\x7c\x93\x02\xfa\xdd\x9a\x22\xe7\xeb\xc6\x89\xf0\x9f\xdf\x47\xbc\xfa\x43\xd0\x31\xcc\x1f\xa0\x63\x54\x87\x34\x1c\x1d\x23\x5d\xf2\x65\x3e\x3d\x2d\x63\xd1\xb9\x85\x2a\x4d\x78\xb0\x17\xfc\xfb\xff\xd9\x7b\xb7\xde\xb6\x91\x6c\x61\xfb\xde\xbf\xa2\xe0\xb9\x70\x82\x89\x65\x38\x37\xbb\xd1\x8d\xef\xc2\x93\x4e\x36\x32\xbb\x0f\x46\x67\x30\x73\x93\xc6\x46\x99\x2a\x2b\x44\x68\x52\x20\xa5\x64\xbc\x5f\xcc\x7f\xff\xc0\x2a\x92\x22\x29\x9e\x44\x93\xe2\xe9\xc9\x4d\x04\x4b\x3c\xad\x2a\x56\xad\xb5\x9e\x75\x88\x0e\x5d\x88\x02\x48\x7c\x27\xfa\xdf\xe2\xf4\xbf\x11\xa9\x59\x68\x03\xc9\x37\xc4\x77\xd6\xde\xfb\xfc\x35\x99\xfd\x14\xbd\xa5\x17\xa2\xab\x08\xc9\x9b\xc0\xc0\xd7\x36\x6d\x0c\x4f\xa2\x77\xe6\x3a\xf1\x7e\xd7\x17\xc7\x8b\x50\x32\x4b\x1b\xcb\x03\x30\x05\x98\x02\x4c\x99\x36\x4c\x79\xd1\xa6\xd1\x1c\xab\x14\xec\x1a\x93\xb4\xad\x81\x2b\x18\xd7\xcb\x33\xae\x81\x2b\x5d\xce\x1b\xe0\x0a\xee\x14\x6c\x8e\x41\x5d\x12\xc0\x95\x12\xb8\xf2\x42\x1f\x42\x73\xcc\x32\x17\x85\x10\xd8\x82\x3e\xb8\x38\x7d\x70\x44\x6a\x17\xda\x41\xf2\x0d\xb0\xa5\xf6\xde\xe7\xaf\xd9\x2c\x0a\xb6\x6c\x7d\xdb\xf3\xed\xdd\xb3\xa3\xbe\x29\x27\xd3\x43\x22\x38\x53\x5d\x8a\x54\xb2\xae\xf7\x28\xee\xa3\xfb\xf9\x25\xbc\x9f\x77\xe9\xfb\xa9\xd0\x9a\x6a\x6b\x56\xbc\x4b\xae\xd1\xec\xfc\x54\xb3\xa0\x0b\x0c\x5d\x60\xe8\x02\x43\x17\x18\xba\xc0\x0c\x62\x08\x61\xaf\x36\x1e\xa8\x21\xed\x55\x9a\xf5\x50\x5b\x69\xc1\xb5\x95\xe8\xcc\x44\x67\x26\x3a\x33\xd1\x99\x89\xce\x4c\x74\x66\xa2\x33\x13\x25\x07\x29\x39\x48\xc9\x41\x4a\x0e\xe6\x67\xe4\x59\x1b\x90\xd1\x06\x6e\x0c\xa3\x40\x1b\x38\xda\xc0\xcd\xad\x0d\x5c\x21\xd2\x23\x4c\x80\x32\xa2\x2f\x2f\x23\x7a\x50\x9e\x86\x21\xef\x8d\xa0\xf0\xf0\x05\x46\x8d\x4f\xcd\x8f\xec\xf0\x58\xf9\xf7\x1e\x45\xf8\x1c\xed\xc8\x79\x78\xca\x0a\x6e\xde\x2d\x2d\xcf\x3d\x8e\xd6\x05\x75\xcb\xc8\xbf\x79\xde\xd7\x27\xe9\x7f\x0d\x0e\x41\xf0\xe6\x19\xb5\xfb\x27\x88\x9c\x54\xcf\xdb\xd0\x92\xf9\xdb\xef\xbf\xff\xcf\xaf\x77\x7f\xfc\xcf\xe7\xcb\x83\x03\xc6\xe8\x7a\x9e\x56\x98\xed\xa7\xad\xa3\xb4\xa7\xe5\x21\x39\x6b\xa8\xdd\xd8\x1b\xd7\x38\xa0\x43\x15\xdc\x91\x1b\xad\xfc\x1e\x7e\x12\x1a\xbb\x69\x43\xd5\x88\xe1\x2a\x10\x6b\x3b\xb0\x7c\x15\xde\xf3\x01\x5d\xa5\x90\x4b\xe4\x5d\xc9\x9e\x28\xf1\x77\x84\x86\xbc\xfb\x2c\x12\xb5\x3a\x5c\x78\xfd\x6f\xd2\x79\x23\x5c\xcf\x50\x65\x6d\x8e\x27\x2e\x9a\xbc\x97\x4f\x73\xcd\x67\x11\x3f\x73\xe4\x0e\x4b\x8c\xf1\x40\x05\xba\xd9\x65\xe2\xe7\x8e\xbc\x36\x11\x50\xcb\xd8\x96\xe1\xb7\x5a\x04\xeb\x04\xd4\x3e\x2a\xb9\xdb\xfb\xa1\x2a\xbe\x53\x22\x37\x10\xd1\x99\x94\x1b\xea\xfc\xc6\xfb\x11\xcf\x8d\xb2\xd3\xb6\xd8\xae\x0a\xa6\xc0\x40\x76\x1d\xc1\x0e\x04\x3b\x10\xec\x40\xb0\x03\xc1\x0e\x45\x8b\x2f\x14\x7d\x42\x12\x01\xac\x02\x56\x01\xab\x80\x55\xc0\x2a\x60\x75\x5e\x60\x15\xd6\x01\xeb\x80\x75\xc0\x3a\x7a\x67\x1d\x27\xc4\x03\x18\x63\xce\xf3\xe3\x5c\xd3\x70\xf8\x0d\xbf\x0e\x7f\xf7\xa0\x37\x31\x33\xa8\x86\xb7\x47\xda\xc9\xee\x8b\x7a\x32\xdb\x56\xb0\xf3\x95\x7c\xd2\xe2\x59\xaf\xdf\x44\x1b\xc3\x9b\xe8\xb7\x4f\xde\x37\xad\xfb\xa4\xcc\x3b\xf1\xc9\x74\x11\xca\x4f\xf5\x36\x22\xfc\x5e\x35\xc1\xa6\x5f\x6a\xa2\xf4\x80\xf0\x62\x3f\x19\xc1\xff\x7f\xc7\x32\x68\x72\xee\xec\xd1\xe3\xc6\x51\x85\x99\x9f\xe5\xae\xfd\x5f\xec\x60\x07\xa0\x4a\x31\x97\x39\x41\xa9\x16\xc5\xf6\xa6\x5b\x9c\xce\x0b\x3a\x26\x70\xc6\xf8\x11\xb2\x1d\x6c\x33\x47\x9f\x0d\xb7\x4d\xa0\xca\x47\xc5\x03\x37\x5b\x80\xc8\xa2\x9a\x41\x16\x15\x55\x3f\xa8\xfa\x51\x70\x33\x53\xd5\x9f\xa6\x57\x05\xa4\x8b\x67\x19\xa2\x5d\x73\x4f\x0f\x33\x7b\xa5\x56\x2b\x46\xd3\x57\x6a\x2f\x44\xe7\x35\x4f\xa2\x82\xf3\x67\x2a\x7d\xd2\x52\x8f\xac\x2d\x77\x32\x06\x3d\x72\x22\x45\x4e\x50\x11\xd3\x83\x3c\x5a\x15\x91\xb4\xf2\x05\xa5\x95\x93\x3f\x47\xfe\x1c\xf9\x73\xe4\xcf\x61\xdd\x96\xbd\x45\xa3\x4c\x56\x19\xc6\x06\x24\xd7\xe6\xe8\x2c\x95\xb9\x36\x33\xb0\xfb\x12\x07\x7f\x3f\x4d\xc0\xb2\xaa\x5a\x2b\x0b\xad\xa6\x15\x58\xaf\x69\x35\x29\x4d\x47\xfd\x5b\x07\xcb\x3d\x84\x9f\xa4\xb5\x5b\x09\xf1\x3e\xfc\x3f\xfe\xfb\x93\xb4\xb5\x8b\x33\x10\x96\xb3\x0f\x76\xca\x3f\xec\x5f\x51\x2b\x04\xc7\xfe\xaa\xc4\xd5\x6f\xf2\x49\x05\x5b\x69\xa9\xab\x50\x4d\x8d\x55\xab\x95\xb8\x77\xa4\xeb\x46\x3d\x2c\xb4\xf2\x23\x1d\xa3\x6f\xdd\xfe\xd0\x66\x43\xd0\xf7\x38\x90\x5a\x92\x08\x2d\xd1\xea\x1f\x62\xf1\x85\x4f\x2a\xde\x1b\x89\x85\x5b\xd1\x36\x88\xa5\x13\xc5\x93\xe9\xbe\x12\x96\x74\x53\x0a\xfa\x73\xcf\x82\x0a\x6f\x66\xbe\xd8\x7e\xdc\xfb\x25\x4e\xc7\x89\x75\xa9\x1b\x0d\x48\x4f\x77\xad\x6b\x7a\x53\x74\xb1\xa3\x8b\xdd\x59\xba\xd8\x75\xa0\xf5\xd4\xf5\xb2\x1b\x83\x5b\x9a\xae\x76\x38\xab\x89\x67\xa0\xab\xdd\xf1\x8c\xa1\xab\x1d\x5d\xed\xb0\x59\xb0\x59\x46\xd2\xe5\xae\x27\xab\xa5\xaf\xae\x77\x9d\x38\xcd\xea\x7a\xdf\xcd\x59\x81\x24\x3e\x16\x7d\xb2\x64\x98\x96\xa3\x4f\x8e\x48\x6d\x43\xbb\x48\xbe\x21\x3e\x16\x4d\x29\x39\x62\x6c\x5d\xf3\x26\x12\x51\x7a\x63\xda\x02\xa7\x03\x4b\xfb\xa1\x97\x65\xed\x87\xcf\xcb\x31\x0b\x7a\x13\xb3\x74\xb2\xdc\x00\x93\x04\x30\x09\x98\x14\xff\x7d\xb6\x30\xa9\xd3\x4d\xa8\x3d\x56\x9a\x4b\x87\x7c\xe0\x12\xce\x80\xe5\x39\x03\x80\x4b\x5d\xce\x1b\xe0\x12\xee\x1f\x6c\x98\x31\xd9\x30\xc0\xa5\x23\x49\x95\xc0\xa5\x8e\x7d\x1a\xed\x31\xd3\x5c\x14\x4a\x60\x13\xfa\x65\xc9\x30\x2d\x47\xbf\x1c\x91\x1a\x87\xb6\x91\x7c\x03\x6c\x42\x73\x4a\x8e\x00\x36\x15\xc0\x26\x5d\x72\x52\xff\xd4\xcc\xbc\x7e\xa1\x52\x54\x9b\xdc\x5d\xdb\xdf\xec\xf5\x5e\x3a\xe9\x3a\xa7\x32\xe9\x46\x10\x6a\x53\x9f\xf4\xdd\xac\x52\xd9\xf7\x3f\x26\x79\xfb\x57\xfa\x34\x57\x87\xc6\x34\x99\x4e\x23\x89\x86\x26\x6c\x37\xd8\x29\x99\x71\xe8\xe6\xf5\xb7\xef\x35\xee\xc0\xc3\xad\xfc\x92\xab\xdd\x48\x19\xd2\xb1\x26\x1a\xeb\x2a\xba\xef\xbf\x29\x97\xc2\xa3\x99\xf7\x6e\xb8\xea\xa3\x87\xb7\xe8\xcc\x5c\x8b\xae\x70\x33\xee\x0a\x57\x8f\xe6\xea\x3a\xc2\x55\x7a\xf5\x3a\xc0\x8e\xf4\x81\xa3\x0f\x1c\x7d\xe0\xe8\x03\x37\xb7\x3e\x70\xf5\x2b\x6f\x61\x0f\xb8\x9e\x83\x3c\xce\xd6\xf9\xad\xfe\xf1\xcb\xbb\xbe\x8d\x59\x06\xa7\xf4\x7a\xab\x97\x41\x79\x9f\xb7\x9e\x65\x40\x77\x37\xba\xbb\xd1\xdd\x8d\xee\x6e\x74\x77\xeb\xad\xbb\x5b\x83\xd5\xff\xa8\xb3\x5b\x65\xc1\xcf\x05\xc5\x78\x36\x7b\x9a\x19\x77\xa7\xab\x17\x77\x55\x67\xba\xf3\xca\x9d\x7e\x74\xbd\x8c\xe8\x71\x2f\xba\x9e\x87\x75\xd0\x0e\x74\xf5\xe2\xa9\xe8\x3e\xd7\xf7\xb2\x39\xd6\x9e\x73\xf5\x42\x2b\x80\x1c\xad\xfd\x79\xd1\xa7\x3f\x3b\xc3\x68\x05\xb5\xff\x7b\xa2\x69\x69\x84\xe6\xc6\x7b\xbf\xf7\x28\xbe\xda\xee\xba\x6b\x94\xf6\xe6\xa0\xec\x6b\x83\x26\x52\x0c\x43\x7b\xe1\x60\xc5\x5c\x65\xac\xdf\xd4\xb9\xbb\x01\x71\x40\x38\x20\xdc\x74\x21\x1c\x00\x0e\x00\x07\x80\x3b\xbc\x70\x00\x38\x00\x1c\x00\x0e\x00\x07\x80\x03\xc0\x01\xe0\x00\x70\x00\x38\x00\x1c\x00\x0e\x00\x07\x80\x9b\x1c\x80\x4b\x17\x91\x29\x73\x38\x50\x34\x06\xa0\x38\x3c\x7e\x02\x28\x02\x14\x01\x8a\x00\xc5\x9c\xd0\xc6\x07\x14\x2b\x4a\x41\x8e\x20\x4f\xaf\x3c\x81\x71\xf0\xbc\xbd\xf2\x5b\x23\x8f\x0f\x84\x38\x6d\x84\x38\x5c\x1e\xdf\x68\xea\x55\x82\x15\xc1\x8a\x60\x45\xb0\x22\x58\x11\xac\x08\x56\x04\x2b\x82\x15\xc1\x8a\x60\x45\xb0\x22\x58\x11\xac\x08\x56\x9c\x17\x56\x04\xc3\x81\xe1\xc0\x70\xd3\x18\x51\x30\x5c\x56\x3c\x60\xb8\xb9\x63\xb8\x91\xe4\xf9\xf5\x8c\xe2\x86\xcb\xfb\x6b\xd8\xa5\x17\x88\x07\xc4\x9b\x14\xc4\x03\xe0\x01\xf0\x00\x78\x00\x3c\x00\x1e\x00\x0f\x80\x07\xc0\x03\xe0\x01\xf0\x00\x78\x00\x3c\x00\x1e\x00\x0f\x80\x07\xc0\x9b\x11\xc0\xa3\xb9\x3c\x80\x12\x40\x79\xa2\xdc\x01\x94\x00\x4a\x00\xe5\xa2\x01\xa5\xab\x76\xdf\x3d\xff\x6b\x68\xe1\x45\x54\xb2\x15\x65\x1c\xa4\xc3\x67\x6e\xac\x37\x6a\x27\x6c\xf7\xd1\xf3\x9f\x92\xb9\x2d\x85\xe1\x18\xe5\x68\x70\xa3\x76\xbf\x25\x22\xb8\xbb\xff\xf8\xdf\xf9\xdf\xd3\xd3\xf4\x44\x18\x97\x08\x71\xe2\x28\xee\xf0\x66\xa4\x8e\xb9\x48\x5f\xb7\xee\x4d\xfa\x76\x3b\xed\x97\x29\x63\x0d\x9b\x35\xb2\xe9\x9b\xf4\xcf\xdb\xbb\xfb\x8f\x7f\x14\x1d\xc5\xfb\x74\xfa\xfb\x14\x0b\x52\xa7\x15\xcf\xe6\xb5\xfa\xdf\x6f\xb7\x2f\x78\xb3\x6c\x77\xe3\xab\x20\xb0\x1c\x19\x64\xc7\xef\xd2\xb8\x18\xba\x8d\x8e\x31\xe7\x14\x96\xe7\x38\xca\x8a\x77\x97\x8f\xe6\x16\xde\x85\xb7\x50\xf1\x62\x98\x63\xd3\xef\xc6\xbb\xe4\x34\x65\xa7\xe8\xb7\x49\x7f\x2f\xf3\xf4\x67\xfd\x98\xbf\x6f\x4d\xe1\x80\x66\xb3\xb4\x7a\x7a\x02\x50\x01\xa8\x00\x54\x00\xea\xdc\x00\x6a\x85\xf9\x57\x07\x51\xab\x5d\x09\xd5\x66\xe0\x49\x6b\xef\xbf\x42\xc1\x45\xae\xe3\x37\xba\x48\x8b\x15\xce\x28\x33\x0f\x32\xcf\x96\x0e\x56\x7a\x50\x62\x1b\x4a\x2b\xd8\xa9\xf5\x4a\xdc\xb9\xc2\x76\xcd\xca\xe2\xf9\x62\xef\x26\x8b\xd3\x5a\xac\xfd\xe7\x3f\xf6\xae\x58\xdb\x7e\xb8\x0f\x7e\x53\xc9\x8c\x0f\x97\x4f\xed\xe8\x8f\x5e\xf9\x78\x6e\x44\x02\x16\x8f\x7b\x5f\xbf\x65\x5b\xdf\xb3\x54\xa0\x3d\xf2\x91\x0f\x23\x9a\x65\x2b\xf1\x4f\x7d\x45\x3d\x5a\x7a\xee\xfc\x28\xae\xc5\x9d\xe3\xfc\xa8\xfd\xed\xeb\x70\x95\xde\xbb\xe1\xc0\x6f\x54\x90\x4c\xc9\xe8\x74\x6a\xdd\x62\xa0\xcc\xb3\x0c\x33\x4c\x67\xa3\xde\xcd\x44\x51\x4e\xbe\xcf\x26\x91\x7f\xa4\xdd\x5b\xb6\x2b\x02\xe3\x75\x12\x0f\xea\xd1\x84\xe7\x25\x84\xe4\xa0\x4a\x44\xab\x97\x9e\x3a\x7b\x65\x36\x87\x07\x25\x5c\xcf\xbd\x76\xd5\x46\xea\x09\x1a\x39\xa8\x56\xe2\x1f\xc9\x86\x6d\x68\x69\xf2\x6a\x44\x3a\xa2\xfd\xf4\xa4\xd6\xb6\xdc\x29\xe7\xf9\x10\x37\x77\xd8\x72\x6d\xe7\x4d\xe4\x80\xd2\x42\x17\x1b\x5f\x5a\xfa\xad\xb1\xbd\x75\xa2\x10\x1c\x36\x6d\x1d\x94\x18\xcf\xd2\x7d\x10\xde\x64\x7a\xb8\x64\x78\x64\xfc\x40\xd1\x45\x1e\xcd\x1a\x18\x9f\x62\x65\xee\xf3\x49\x49\xb7\xf0\x1e\x5b\x0c\xb3\xbe\xe7\x7b\x7d\xcb\x45\x4e\xbd\x1a\xb7\xde\x58\xa6\xff\x29\x01\x0f\xcd\xe4\x52\x1e\xf4\x70\xb6\xe9\x4f\xf8\x03\xe1\x0f\x84\x3f\x10\xfe\x40\xf8\x43\x6f\xe1\x0f\x0d\xf7\x82\xa3\x10\x88\xf3\x6d\x8b\x3f\xa7\x92\xb1\xb6\x8e\x92\x81\x4a\x96\xa0\x7b\xdf\xdb\xca\x8d\xd6\x8e\xee\x3d\xc7\xb6\x9e\x33\xc1\xf6\xf1\xa4\x3b\x64\x73\x85\xd3\xee\x76\xf5\x5f\x2b\xf1\xc9\xac\x67\x46\x75\xd9\x2a\x37\x7c\x59\x0e\x7b\xaa\x12\x9e\xbf\xfd\x22\xdd\x38\xf8\xdf\xdf\xab\x9b\x47\xe9\xc4\xb6\xf2\xe7\x4b\xf3\xf5\xe7\x4b\xf1\x68\xbb\xd2\xb1\xff\x2f\xde\x48\x1e\x94\x90\x6b\xcd\x8c\xbd\x1b\xc3\xd3\xd6\x07\x33\xcc\x9c\xfe\x2a\x38\x1c\x64\xec\xd3\x95\x78\x6f\xeb\xc5\x31\x75\xeb\x9e\x7f\xfc\x6c\x87\x08\x81\x9d\x31\x8f\xb5\x8d\xe2\xed\xbe\xb4\x19\x50\xf3\x04\x3f\xc7\xcf\x5e\xaa\xf2\x14\xd1\xb9\x6e\x0d\x33\xfd\xe8\xe1\x0b\xfb\xc5\xfb\x2e\x36\xd2\x7f\x90\x9b\x8c\x6b\x32\x31\x6a\x94\xff\xe8\xf9\x4f\xe1\x98\x14\xca\xeb\xf7\xdc\x13\x95\x8b\x4b\x2b\xbd\xb1\xc6\xba\x35\xb2\xb5\x43\x6d\xd2\xb2\xd7\x07\x53\x58\xeb\x0a\xda\x39\x91\x8c\x71\xa0\x99\x9c\xfe\x36\xd6\x06\x56\xa9\xc1\x8c\xf7\x91\x04\xd1\x27\x89\x2c\xd9\x8b\xad\xc4\x9d\x65\xa9\xed\x4e\xef\x4d\x69\xcb\xee\xca\x3c\xc3\x95\xb8\x8e\x26\x60\x76\x82\x06\x3f\x89\xab\xbf\x49\xeb\xeb\xc6\xf7\xf6\xee\x3a\xfc\x95\x4e\x0a\xd1\x3f\xca\x09\xce\xa8\x90\x91\x7e\x9c\x3d\x49\xfc\x04\x0f\xc9\x99\x7e\x12\x57\x1f\x3c\x5f\xa5\x4e\x2b\x2c\x19\x58\x72\x1d\x3e\x7d\x24\x1f\x93\x33\xa4\xcf\x17\x18\xd3\xf3\xe8\x84\x8f\xc9\x39\xda\x4c\xc8\x6d\x7e\xba\x0f\xa3\x71\xce\x38\x96\xa7\xd9\x38\x54\xc5\xf3\x0c\x35\x0a\x44\xf6\xf4\x36\xbe\xc7\xd1\x3d\xe7\xf3\x6d\x0c\x19\xe7\xd3\x4c\x58\x15\xb1\x3e\x2f\xd5\x7f\x0a\x39\x1d\x38\xf9\x44\x4c\xf7\x69\x27\x77\xfb\xa6\x7c\x6e\x72\x14\x39\x75\x58\x49\x62\xb4\xd9\x91\x0f\xda\x52\x17\x39\xd2\x47\x80\xba\x38\x31\xba\x04\xf6\xe6\x53\xa1\xab\xb2\xa0\x3b\x2f\xfb\x60\xdc\x64\x7e\x64\x5a\xc7\xfa\x7c\x5c\xf1\xa1\x21\xe1\x0e\x4f\x92\xe6\xdb\x2f\xa5\xda\xe4\x71\x2f\x27\x8f\xbb\xd9\xb6\x52\x97\xcb\x7d\x3e\xfb\x8b\xa0\x04\x82\x12\x08\x4a\x20\x28\x81\xa0\x84\xa2\xc5\x17\xda\x3d\x21\x89\x00\x40\x01\xa0\x00\x50\x00\x28\x00\x14\x00\x3a\x2f\x00\x0a\x93\x80\x49\xc0\x24\x60\x12\xbd\x33\x89\x13\xb8\xfd\x48\x33\x91\x9b\x89\xf0\x38\x1b\xf9\xa5\x1e\xb7\x51\xd1\x9c\xd2\x03\x96\x55\x62\x77\x95\x02\x19\xdf\x6e\x57\x69\x37\xfe\x9c\x53\x0f\xeb\xa1\x51\x57\xdd\x30\xcf\x07\x8a\x5a\x94\xcb\x9d\x4a\x89\x99\x8b\xdc\xb0\x5d\x6e\xbd\xa0\x63\x2a\x66\x6c\x17\x21\xdd\xa6\x04\xcc\x1c\xd0\x25\x03\x6b\x97\xd9\x59\x51\xa0\xa8\xaf\x95\xa1\x93\x54\x4f\xd2\x8d\xd2\xa3\x3e\xda\x74\x23\xed\x99\xf8\x55\xba\x72\xa3\x7c\xe3\x63\xd3\x75\xb7\x64\x10\x78\x96\xad\x8d\xc6\xc4\x9b\x25\xb5\x53\xd2\xf3\x85\x72\x77\xa1\x16\x17\x5b\xd1\x4f\x32\x9c\x44\xe1\x4f\x02\x15\xab\x42\xe9\xa4\x9a\x38\xf9\x46\xab\x82\xda\x73\xe5\xf9\xe2\xf6\xed\x0f\xe1\x6f\x7d\x69\x69\x54\xe5\x78\xee\xc6\x28\x3e\xda\xbb\x64\x79\xee\x4e\xda\xae\x59\x9b\xb4\xf7\xe6\xf0\x5b\xed\xbe\x8f\x40\x9a\x78\x78\x4e\x74\xfb\x8d\xe7\x48\x77\xb3\xf2\xfc\xcd\xcd\xf6\xeb\xe6\x66\xef\xda\x96\xb7\x56\x37\x7f\xf9\x18\xdc\x87\x67\x69\xed\x0e\x8e\x84\xd3\xe5\xf0\x8c\x4a\x53\x9a\xac\x02\xd3\x54\x79\x79\xdb\x40\x79\x79\x67\x5c\x5b\x23\xbb\xef\xb7\xb5\xf7\x6d\x82\x68\x47\x76\xe3\xf3\xd3\x16\xb5\x3e\x32\x05\x6d\xf1\x42\xb4\xa9\xb5\x51\xd0\x8d\xa6\xc7\x92\x1b\xcd\x75\xb0\xe3\x3a\x1b\x54\xd7\x48\x5f\x1d\x95\x6b\x8a\x2a\x17\xf9\xcc\x0b\xca\x67\x26\x71\x8b\xc4\x2d\x12\xb7\x48\xdc\xc2\x5a\x2c\x7b\x8b\x46\x99\x25\x31\x8c\xed\x45\x92\x47\x4d\x92\xc7\x24\x6c\xb0\xc4\x8b\xdd\x79\x6a\x87\xaf\xe4\x3a\xa7\x7d\x35\xb4\xa4\xc2\x23\x7b\xcc\xe7\x48\x69\x24\xea\xdf\x3a\x4a\xeb\x21\xfc\x24\xad\xdd\x4a\x88\xf7\xe1\xff\xf1\xdf\x9f\xa4\xad\x5d\x7b\x81\xb0\x9c\x7d\xb0\x53\xfe\x61\x9f\x31\xe1\x9c\xc2\xb1\xbf\x2a\x71\xf5\x9b\x7c\x52\xc1\x56\x5a\xea\x2a\x54\x27\x63\x15\x68\x25\xee\x1d\xe9\xba\xca\xe8\xa1\x5a\x49\x91\x8e\xd1\x8b\x6e\x7f\x68\xb3\x70\xeb\x7b\x1c\x48\x7d\x48\x84\x96\x68\xdf\x0f\xb1\xf8\xc2\x27\x15\xef\x8d\xc4\xc2\x2d\x63\x1b\xc4\xd2\x89\x02\x99\xf6\x81\xf2\x75\x04\xd2\x41\x91\x7e\xee\x59\x50\xe1\xcd\xcc\x97\x17\x8f\x7b\x5f\xc3\x29\x57\xb0\x25\x6c\xd4\x34\x7c\x72\x2f\x21\xb8\xe9\x26\x28\xe5\x77\x40\xdb\x93\x73\x30\x69\x1d\xee\xd1\xaa\xdc\xf7\xb5\x3e\xf6\xaf\xd5\xeb\xd6\x93\xf2\x37\xaa\xd1\x2f\x83\x9d\x2f\x77\x6a\x63\x5b\xd7\xcd\x8f\x09\x3f\x3f\x47\xbf\xd4\x2b\x64\x13\x7d\x63\x2b\xfd\x9d\xad\xb3\xb1\x4c\x68\x52\x3b\xdd\x43\x5f\x74\x78\x27\x6e\x5f\x20\xbd\x42\x69\xbf\xcf\x46\x08\x09\x5c\xbb\x33\x77\xed\x2e\x87\xa6\xe7\xf2\x1a\xe2\x97\xcb\xe4\xde\x84\x6b\xcd\x21\x9f\xfb\x55\xc9\x3a\xf4\x5a\x3b\xb6\x4c\xc2\xad\x74\xf4\x91\xae\xe7\x5e\x9b\xa3\xf5\x2f\xb4\x6f\x39\x10\xaf\xfe\x1e\x78\xee\xbd\x49\x6b\xfe\x35\x5c\xf1\xa2\xcf\x9f\xe2\x75\xf0\xf0\xc7\xd7\x63\xc2\xfc\xcd\xe7\xcd\x07\xcf\xb7\xb4\xf3\x7d\xe3\xe9\xc1\xf7\xc4\xe7\xcb\xc7\xf0\x6f\x9f\x2f\xc5\x5d\x46\x9a\x3a\x6a\xda\x78\xca\xb5\x0d\x10\xbd\xa8\xd7\xd2\xd2\x03\xa0\x13\x63\x1d\xdb\x8a\x7c\x7f\xda\x64\xf0\xbe\x47\x63\x6b\x12\x47\xb7\xca\xdb\x3a\x6a\x25\xcc\x35\x75\x3e\x7c\x3c\xa7\x74\xec\x72\xe1\x40\x24\x97\x6f\x23\xde\xf0\x42\x58\x0e\xe6\x0b\x2c\x87\x11\x58\x0e\xdb\x5c\xdc\xef\x14\x6c\x87\x7d\xe7\xbe\xa4\xad\x23\xad\x96\x2a\x5d\x74\xf0\x7c\x95\x3a\xa2\x23\xd1\xe7\x16\xa5\xcf\x8d\x48\x6d\x62\x77\x4f\xbe\x21\x3a\x72\x49\x5a\xc9\x7e\x1a\xfe\xcc\x0b\x71\x52\x8c\x61\xb6\x95\xd7\x30\xe5\xce\x2a\x54\x99\x92\x4a\x67\x1f\x3c\xff\xce\x71\x12\x0a\x35\x8a\x86\x77\xa5\x07\x90\xd3\x46\x3a\xdb\x10\x01\xca\xe7\xe3\x20\x14\x0c\x9c\x71\xc1\xc0\x7a\xb0\x53\x57\x2c\xb0\x7d\x23\xe5\x66\xd0\x8a\x12\x81\x94\x08\xa4\x44\x20\x25\x02\xe7\x56\x22\xb0\x7e\xe5\x2d\x2c\x0f\xd8\x73\x88\xc0\xd9\x8a\x02\xd6\x3f\x7e\x79\x41\xc0\x31\xcb\xe0\x94\x32\x80\xf5\x32\x28\x2f\x01\xd8\xb3\x0c\x28\xfc\x47\xe1\x3f\x0a\xff\x51\xf8\x8f\xc2\x7f\xbd\x15\xfe\x6b\xb0\xfa\x1f\x15\xfd\xab\x4c\x9d\x5b\x50\x84\x60\xb3\xa7\x99\x71\xe1\xc2\x7a\x71\x57\x15\x2d\x3c\xaf\xdc\x29\x55\xd8\xcb\x88\x1e\x97\x29\xec\x79\x58\x07\x2d\x4e\x58\x2f\x9e\x8a\xc2\x84\x7d\x2f\x9b\x63\x2d\x47\x58\x2f\xb4\x02\x64\xd1\xda\x9f\x17\x7d\xfa\xb3\x29\xa4\x72\x13\xc2\x63\x8a\x60\xe8\xcf\xff\x29\x66\x57\x3d\xd6\xc4\x48\xa5\x0c\x7b\x8f\x0d\xa8\xd5\x71\x65\x8c\x77\xc9\x19\x12\x68\xb5\x2e\x38\x0f\x85\x32\x70\xe7\xe2\xce\xc5\x9d\x8b\x3b\x77\x86\xee\xdc\x29\x74\x7c\x21\xf2\xb1\xf1\x40\x0d\x19\xf9\x48\x63\x1e\xca\x36\x2d\xb8\x6c\x13\x5d\x98\x80\x31\xc0\x18\x60\x0c\x30\x06\x18\x43\x17\x26\xaa\x19\x52\xcd\x90\x6a\x86\x54\x33\xcc\xcf\xc8\xb3\x36\x1b\x9b\x13\x39\xa5\xe5\xdb\xbc\x39\x2a\x2d\xdf\xa6\xd4\xf2\xad\x90\xd3\x91\x70\x4a\x85\xd2\x16\x15\x4a\x0f\xda\xd2\x64\xd2\xb1\x46\x9f\x92\xd9\x09\xd0\x26\xa1\x6c\x39\x09\x65\xcd\x76\x94\xba\xa4\xb2\xf3\x99\x5e\xc4\x23\x10\x8f\x40\x3c\x02\xf1\x08\xc4\x23\x14\x2d\xbe\x80\xee\x09\x49\x04\xf6\x09\xfb\x84\x7d\xc2\x3e\x61\x9f\xb0\xcf\x79\xb1\x4f\x70\x04\x38\x02\x1c\x01\x8e\xe8\x1d\x47\x9c\x80\xec\x47\x9a\xf2\xd5\x4c\x84\xc7\x69\x5f\xb3\xaa\x0b\x5e\x7a\x00\xd5\xfa\xa8\xd6\x37\xef\x6a\x7d\x91\xba\x68\x6a\x25\xbb\x6b\x11\x8e\x8d\x08\x2c\x6f\xab\xde\x88\x60\x6f\x7d\x09\xd7\x1e\xbd\xb6\x2b\xf9\x64\x16\xa6\xad\xef\x69\xf5\xb4\x28\x73\xb4\xba\xaf\x91\x06\x43\xd9\xaf\x69\x6e\x54\xf7\x34\xd1\xa7\x54\x73\x23\x2f\xe8\x18\x02\x1a\x53\x2d\xd5\xec\xbd\x02\xf8\x99\xdf\x76\x8e\xfc\xa6\x50\x52\x9e\x6a\xf2\xcb\xc9\xa9\xa2\x9a\x3c\xd5\xe4\x0b\x6e\x66\xe4\xaa\xda\x04\x0b\xc9\x8f\xbb\xcb\xf3\xcb\xee\x79\x7e\xda\xb0\xd6\x3d\x46\xae\x0d\x5f\x88\x6e\xca\x89\x98\xbf\xfe\xe7\x4c\x55\x45\x1a\x29\x5f\xc7\xa5\x44\x28\x20\x82\xc2\x35\x0b\x85\x8b\x94\xed\x05\xa5\x6c\x93\x9b\x46\x6e\x1a\xb9\x69\xe4\xa6\x61\x2b\x96\xbd\x45\xa3\x4c\x04\x19\xc6\x06\x23\x8f\xa5\x26\x8f\x65\xec\x06\x59\xe2\xb9\xee\x3c\x7b\xc5\x57\x72\x9d\x53\xbc\xea\x8d\xa8\xf0\xa0\xbe\x53\x56\x52\xca\x88\xfa\xb7\x0e\x44\x7b\x08\x3f\x49\x6b\xb7\x12\xe2\x7d\xf8\x7f\xfc\xf7\x27\x69\x6b\x9f\x5e\x20\x2c\x67\x1f\xec\x94\x7f\xd8\x62\xa2\x9e\xd0\x8e\xfd\x55\x89\xab\xe4\x2e\xaf\x42\x4d\x32\xd6\x7e\x56\xe2\xde\x91\xae\x1b\x35\xf3\xd6\xfa\x89\x74\x8c\x4a\x74\xfb\x43\x9b\x35\x5b\xdf\xe3\x40\x9a\x43\x22\xb4\x44\xf1\x7e\x88\xc5\x17\x3e\xa9\x78\x6f\x24\x16\xee\x16\xdb\x20\x96\x4e\x14\xab\xa5\x1b\x6c\x5b\xd2\x4d\xe9\xd0\xcf\x3d\x0b\x2a\xbc\x99\xf9\x22\xf1\x71\x6f\x69\xf8\xe5\xb2\x1b\xc1\x46\x8d\xde\x2d\xf7\x12\x48\xad\xd9\x4b\xe4\x1d\x29\xbc\x78\x13\xfa\x3c\x16\xf0\x0c\x71\x9f\x1c\x71\xd7\xb1\x3b\x8d\x34\x97\xfc\xb2\x7c\xad\x8f\xfd\x6b\xf5\x0a\xfd\xa4\xfc\x8d\x6a\xf4\xcb\x60\xe7\xcb\x9d\xda\xd8\xd6\x75\xf3\x63\xc2\xcf\xcf\xd1\x2f\xf5\x5e\xd0\x44\xb3\xda\x4a\x7f\x67\xeb\xd4\x3a\x13\x67\x76\xb2\x96\xa5\xaf\x37\x12\x4f\x75\x5f\x61\x02\x15\x96\xc9\x7d\x36\xdc\x4b\xe0\xbf\x9e\xb9\xff\x7a\x39\x01\x03\xb9\x24\x95\xf8\xe5\x32\x89\x54\xe1\x5a\x73\x48\xce\x7f\x55\xb2\x0e\xbd\xd6\xde\x3b\x93\x3d\x2d\x1d\x7d\xa4\xeb\xb9\xd7\xe6\x68\xfd\x0b\xed\x40\x0f\xc4\xab\xbf\x07\x9e\x7b\x6f\x72\xd4\x7f\x0d\x57\xbc\xe8\xf3\xa7\x78\x1d\x3c\xfc\xf1\xf5\x98\x22\x19\x9a\xcf\x9b\x0f\x9e\x6f\x69\xc2\xb0\xf1\xf4\xe0\x7b\xe2\xf3\xe5\x63\xf8\xb7\xcf\x97\xe2\x2e\x23\x4d\x1d\x02\x6f\x70\x80\xb6\x76\xa2\x17\xf5\x5a\x5a\x7a\x00\x74\x96\xb3\x63\x5b\x91\x83\x53\x1b\x47\xde\xf7\x68\x6c\x4d\x16\xf0\x56\x79\x5b\x47\xad\x84\xb9\xa6\x2e\x6e\x10\xcf\x29\x1d\x88\x5e\x38\x10\xc9\xe5\xdb\x88\x37\xbc\x10\x36\x92\xf9\x02\x1b\x69\xe0\xd8\x85\x5c\xfc\xf6\xc8\xad\xa4\x7d\xe7\xbe\xb2\xad\x23\xad\xd3\x15\xb9\xe8\xb8\x99\xab\x72\x44\x7c\xa2\xc0\x2d\x45\x81\x1b\x91\x9e\xc4\x76\x9e\x7c\x43\xc4\xe7\xfc\x35\x90\xfd\xe8\xbd\xb4\x17\xa2\xd3\xe0\xc9\x9b\xc0\x10\xda\x54\x0c\x65\x3f\x10\xd0\x5c\x27\xde\xc0\x3a\xc5\x81\x11\x64\x66\x81\xe2\x6d\x87\xc9\xc0\x64\x60\x32\x99\x67\x85\xc9\x0c\xc7\x64\xda\x6f\x7a\xf5\x74\xa6\x60\xd7\x9b\xa4\x61\x0f\xa3\xc1\xc4\x5f\x9e\x89\x0f\xa3\xe9\x72\xde\xc0\x68\x70\xea\x60\x33\xc1\x68\x72\xf2\xea\x8f\xd1\xbc\xc4\x9b\x51\x4f\x6b\xe6\xa2\xda\xc1\x6c\x50\xe8\x96\xa2\xd0\x8d\x48\x6f\x62\x7b\x4f\xbe\x81\xd9\xcc\x5f\x23\x99\x3d\xb3\x89\x7e\xab\xb3\x42\xed\xcc\x3b\xd3\x67\xbd\x8b\x54\x3a\xb0\xf7\x28\x22\x7d\xe5\x28\x4d\xb4\xbe\x00\xc6\xbb\xe4\x3c\x07\x3d\xa7\xf4\x6c\x14\xc4\xa0\x83\x0d\x1d\x6c\xe8\x60\x43\x07\x1b\x3a\xd8\x0c\x62\xb0\x60\x57\x36\x1e\xa8\x21\xed\x4a\x1a\x0d\x51\x9e\x69\xc1\xe5\x99\xe8\x2a\x45\x57\x29\xba\x4a\xd1\x55\x8a\xae\x52\x74\x95\xa2\xab\x14\x55\x0b\xa9\x5a\x48\xd5\x42\xaa\x16\xe6\x67\xe4\x59\x9b\xa7\xd1\xc2\x6e\x0c\xa3\x40\x0b\x3b\x5a\xd8\xcd\xad\x85\x5d\x21\xb3\x03\xe7\x53\x89\xb4\x45\x25\xd2\x83\xb6\x74\x46\x66\x5e\x46\x7b\x07\xad\x4c\x6a\xfc\x64\x7e\x64\x5b\xc7\x0a\xbd\xf7\x28\xc2\xbb\x6e\x8c\xbb\xc3\xb3\x14\x87\xf2\xbd\x18\x71\xe7\xee\x57\x2b\x70\xba\x47\xe5\xdf\x3c\xef\xeb\x93\xf4\xbf\x06\x87\x10\x71\xf3\x10\xda\x67\x13\x44\x9e\xa5\xe7\x6d\x68\x7e\xfc\xed\xf7\xdf\xff\xe7\xd7\xbb\x3f\xfe\xe7\xf3\xe5\xc1\x6b\x62\x14\x34\x4f\x6b\xb9\xf6\xd3\xd6\x51\xda\x3d\xf2\x90\x9c\x35\x54\x49\xec\x8d\x6b\xbc\xc6\xa1\xde\xec\xc8\x8d\xd6\x58\x0f\x3f\x09\x2d\xd4\xb4\x75\x69\x5c\x11\x57\x81\x58\xdb\x81\xe5\xab\xf0\x9e\x0f\xbc\x29\xc5\x49\x22\x97\x48\xf6\x44\x89\x93\x22\xb4\xbe\x43\x4b\x3f\xd6\x85\xc3\xd5\xd2\xff\x26\x9d\x37\xc2\xf5\x0c\x0a\xd6\x36\x74\xe2\x57\xc9\xbb\xe6\x34\x8c\x7c\x16\xf1\x33\x47\x3e\xac\xc4\x82\x0e\x54\xa0\xbb\x6b\x26\xce\xe9\xc8\xd5\x12\x51\xb0\x8c\x41\x18\x7e\xab\x45\xb0\x4e\xe8\xea\xa3\x92\xbb\xd0\x8e\xdf\xc8\x9d\x12\xb9\x81\x88\xce\xa4\xdc\x50\x51\x37\x2e\x8b\xad\x7d\xc0\xbe\x45\xa7\x6d\xb1\xc7\x14\x4c\x81\x81\x8c\x31\x22\x14\x88\x50\x20\x42\x81\x08\x05\x22\x14\x8a\x16\x5f\xd0\xf7\x84\x24\x02\x0d\x85\x86\x42\x43\xa1\xa1\xd0\x50\x68\xe8\xbc\x68\x28\x80\x02\x40\x01\xa0\x00\x50\xf4\x0e\x28\x4e\x80\xf8\xc6\x98\xf3\xfc\x38\x91\x33\x1c\x7e\x03\x9d\xc3\xdf\x3d\xe8\x4d\xcc\x0c\xaa\x81\xe4\x91\x76\xb2\xfb\xa2\x9e\xcc\xb6\x15\xec\x7c\x25\x9f\xb4\x78\xd6\xeb\x37\xd1\xc6\xf0\x26\xfa\xed\x93\xf7\x4d\xeb\x3e\x29\xf3\x4e\x7c\x32\xad\x86\xf2\x53\xbd\x8d\x08\xbf\x57\x4d\xb0\xe9\x17\x62\x28\x3d\x20\xbc\xd8\x4f\x46\xf0\xff\xdf\xb1\x0c\x9a\x9c\x3b\x7b\xf4\xb8\x19\x52\x2e\xbf\x32\xe3\xc7\xff\xc5\x0e\x76\xcb\x45\x48\xe1\xaa\x36\x31\x6c\xd4\xa2\x6c\x1e\x95\xe6\x26\x57\x69\xce\x0b\x3a\x86\x83\xc6\x6c\x13\xb2\x31\x07\x34\x07\xf4\x44\x02\x47\x5d\xd4\x23\xfb\x74\xcd\xd6\x46\x52\xb0\x66\x90\x82\x45\x69\x0f\x4a\x7b\x14\xdc\xcc\x24\xf4\xb8\x29\x15\xf8\x68\x79\xe3\x43\x34\x82\xee\xe2\xce\xe7\xa7\x36\x6b\xf5\x64\x12\x6a\xf3\x85\xe8\xb2\x4e\x49\x54\x61\xfe\x4c\xe5\x4a\x9a\xeb\x6a\xc7\x25\x4a\x06\xd7\xd5\x26\x52\x98\x04\xcd\x2c\x3d\xc8\xa3\xd5\xcc\x48\x05\x5f\x50\x2a\x38\x39\x6f\xe4\xbc\x91\xf3\x46\xce\x1b\x46\x65\xd9\x5b\x34\xca\x04\x93\x61\x0c\x34\xf2\x63\x6a\xf2\x63\xa6\x61\xa7\x25\x9e\xef\x7e\x5a\x75\x65\xd5\xaf\xa6\x66\x55\x79\x9b\xae\xae\x53\x61\x52\xea\x89\xfa\xb7\x0e\x70\x7b\x08\x3f\x49\x6b\xb7\x12\xe2\x7d\xf8\x7f\xfc\xf7\x27\x69\x6b\x77\x60\x20\x2c\x67\x1f\xec\x94\x7f\xd8\x74\xa2\xe2\xfe\x8e\xfd\x55\x89\xab\xe4\x5e\xaf\x42\xdd\x32\xd6\x87\x56\xe2\xde\x91\xae\x1b\x75\x65\xd0\x1a\x8b\x74\x8c\x92\x74\xfb\x43\x9b\x55\x5c\xdf\xe3\x40\xba\x44\x22\xb4\x44\x15\x7f\x88\xc5\x17\x3e\xa9\x78\x6f\x24\x16\xee\x1f\xdb\x20\x96\x4e\x14\x03\xa6\x3b\x25\x58\xd2\x4d\x69\xd5\xcf\x3d\x0b\x2a\xbc\x99\xf9\xa2\xf6\x71\x6f\x72\xb8\xf1\x86\xef\x16\x37\x10\xfc\x4e\xf7\x8c\xab\xb8\x05\x3a\xc7\x15\x3f\x33\x3c\x9f\xce\x71\xdd\x74\x8e\x6b\xa7\x83\x55\x74\x8d\x9b\x59\x14\x02\x5d\xe3\xf0\x77\x2f\x2f\x12\x81\xae\x71\x5d\xce\x1b\xba\xc6\x61\x41\x61\x41\xcd\xb7\x77\x5c\x27\x36\x54\x5f\x1d\xe4\xda\x3a\xd9\x2a\xba\xc7\xcd\x4c\xc5\x23\xd0\x14\xf5\x6e\x59\xea\xdd\x88\xb4\x28\x36\xfb\xe4\x1b\x02\x4d\x97\xa5\xa5\x9c\xb5\x9f\xdc\x39\xa2\x35\xcb\xdb\xc7\x4d\xa5\xaa\x5e\xfa\xb8\x0f\x9e\x7f\xe7\x38\x89\xd6\x93\x6d\x93\x4b\xea\xe4\x58\x57\x42\x52\x27\xa7\xb1\xaa\xbc\x84\x1e\x51\xa3\x72\xc6\x35\x2a\xeb\xa1\x50\x5d\x7d\xca\x4a\xf7\x53\x07\xc0\x8b\xaa\x94\x54\xa5\xa4\x2a\x25\x55\x29\xe7\x56\x95\xb2\x7e\xe5\x2d\xac\x48\xd9\x73\x78\xc1\xd9\xea\x50\xd6\x3f\x7e\x79\x0d\xca\x31\xcb\xe0\x94\xca\x93\xf5\x32\x28\xaf\x3a\xd9\xb3\x0c\xa8\x35\x49\xad\x49\x6a\x4d\x52\x6b\x92\x5a\x93\xbd\xd5\x9a\x6c\xb0\xfa\x1f\xd5\x99\xac\xcc\x3f\x5c\x50\x74\x61\xb3\xa7\x99\x71\xad\xcc\x7a\x71\x57\xd5\xc9\x3c\xaf\xdc\xa9\x8e\xd9\xcb\x88\x1e\x57\xc6\xec\x79\x58\x07\xad\x87\x59\x2f\x9e\x8a\x5a\x98\x7d\x2f\x9b\x63\xad\x80\x59\x2f\xb4\x02\x7c\xd1\xda\x9f\x17\x7d\xfa\xb3\x29\xc2\xd2\xd7\xbe\xb1\xdd\x8d\xaf\x82\xc0\x72\x64\x10\xf4\xcc\xb1\x22\xbd\xcf\x5d\xdb\xdf\xec\xf5\x5e\x3a\xe9\xd1\x92\x89\x6d\xf7\xd1\xdc\xd0\xbb\xf0\x86\x56\xa9\x44\xfa\x1f\x13\xfd\xfb\x4a\x9f\xe8\xea\xe0\xcc\xcb\x78\x67\x12\xec\x25\x6c\x37\xd8\x29\x99\xd9\x28\xf3\x50\xec\x7b\x3e\xb6\x3b\x7d\xf5\x5f\x72\x7c\x01\x10\x36\xd6\x34\x61\xbd\x00\xbc\x0f\x6d\xbc\xe5\xd2\x30\x3d\x84\x67\x46\x62\xe9\xb7\x05\x22\x06\x11\x83\x88\x41\xc4\x20\x62\x10\x31\x88\x18\x44\xac\xa3\xd5\x16\x22\x06\x11\x83\x88\x41\xc4\x20\x62\x10\x31\x88\x18\x44\x0c\x22\x06\x11\x83\x88\x8d\x72\x44\x21\x62\x59\xf1\x40\xc4\x66\x40\xc4\x0a\x0a\xee\xf7\x04\xc6\xd2\x34\xcc\x8d\xb7\xfb\x38\xcb\xab\x73\x2a\xf6\xe6\xa0\xe1\x6b\x2b\x26\xd2\x06\x43\x23\xe1\x60\xba\x5c\x65\x4c\xde\xd4\xb9\x5b\x33\x35\x78\x1a\x3c\x6d\x42\x3c\x0d\x96\x06\x4b\x83\xa5\xc1\xd2\x60\x69\xb0\x34\x58\x1a\x2c\x0d\x96\x06\x4b\x83\xa5\xc1\xd2\x60\x69\xb0\x34\x58\x1a\x2c\x6d\x52\x2c\x2d\xdd\x87\xa0\xdc\xdb\x30\xa5\x36\x04\xd0\x41\xe8\x20\x74\x70\x1a\x23\x0a\x1d\xcc\x8a\x07\x3a\x38\x65\x3a\x38\xa6\x54\xb9\xc1\xb2\xe4\x7e\xb1\x83\x1d\x95\x23\xf3\x43\x09\xe0\x9b\x10\xe0\x1b\x26\x61\x0e\xbe\x07\xdf\x83\xef\xc1\xf7\xe0\x7b\xf0\x3d\xf8\x1e\x7c\xaf\xa3\xd5\x16\xbe\x07\xdf\x83\xef\xc1\xf7\xe0\x7b\xf0\x3d\xf8\xde\xe2\xf8\x1e\x34\x0c\x1a\x06\x0d\x9b\xc6\x88\x42\xc3\xb2\xe2\x81\x86\x4d\x92\x86\xb9\x09\xf7\x31\x79\x72\xfa\xf3\x7f\x80\x64\xd9\x1e\xb2\x29\x5c\x06\x1e\x03\x8f\x81\xc7\xc0\x63\xe0\x31\xf0\x18\x78\x0c\x3c\x06\x1e\x03\x8f\x81\xc7\xf2\xcb\xed\x08\xd1\x10\x78\x0c\x3c\x06\x1e\x03\x8f\x81\xc7\xc0\x63\xe0\xb1\x29\xe2\xb1\xe8\xa9\x75\x16\x5c\x38\x94\x72\xbf\xfb\x22\x02\xcb\xdb\xaa\x37\x22\xd8\x5b\x5f\xc2\x91\xd7\xf6\x8a\x92\x4f\xc6\xd1\xbb\xf5\x3d\x2d\xe5\xd3\x13\xe4\xb4\xdf\x8f\x2c\x39\xb8\x20\x5c\x10\x2e\x08\x17\x84\x0b\xc2\x05\x33\x5c\x70\x5c\x55\x35\xa7\x56\x50\xf3\x88\x2c\x42\x15\xa1\x8a\x13\xa2\x8a\x10\x45\x88\x22\x44\x11\xa2\x08\x51\x84\x28\x42\x14\x21\x8a\x10\x45\x88\x22\x44\x11\xa2\x08\x51\x84\x28\x42\x14\x21\x8a\x53\x21\x8a\x05\x05\x35\x4f\x47\x85\x63\xa1\x84\xe0\x51\xf0\x28\x78\x14\x3c\x3a\xea\x11\x05\x8f\x66\xc5\x03\x1e\x9d\x13\x1e\x8d\x8e\xd8\x7a\x8e\x6d\xd9\xa3\x48\x9e\x8c\xa8\xe3\x7d\x78\x47\xcf\x43\xa6\x50\x66\x6e\x84\x44\x4a\x90\xe7\xc4\x90\xe7\x99\x13\x29\x33\xaf\x0b\xf0\x13\xf8\x09\xfc\x04\x7e\x02\x3f\x81\x9f\xc0\x4f\xe0\x67\x47\xab\x2d\xf0\x13\xf8\x09\xfc\x04\x7e\x02\x3f\x81\x9f\xc0\xcf\xc5\xc1\x4f\x78\x21\xbc\x10\x5e\x08\x2f\x1c\xf5\x88\xc2\x0b\xb3\xe2\x81\x17\xce\x98\x17\x8e\x24\xa9\xb2\x7b\x66\x38\x48\x6a\x65\x19\x42\x81\x36\x42\x1b\x73\x67\x1d\x1d\x6d\x84\x34\x42\x1a\x21\x8d\x90\x46\x48\x23\xa4\x11\xd2\x08\x69\x84\x34\x42\x1a\x21\x8d\x90\x46\x48\x23\xa4\x11\xd2\x08\x69\x9c\x16\x69\x4c\xa7\x59\x56\xb8\x1b\x48\xb6\x2c\x7e\x66\xe0\x29\xf0\x14\x78\x0a\x3c\x05\x9e\x02\x4f\x17\x09\x4f\xc9\xaa\xcc\x31\xce\x7c\x2e\xe5\x07\xcf\xbf\x73\x9c\x04\x7d\x52\x4e\x16\xda\x39\x25\xda\x49\x6e\x25\xc4\x13\xe2\x09\xf1\x84\x78\x42\x3c\x21\x9e\x10\x4f\x88\x27\xc4\x13\xe2\x09\xf1\x84\x78\x42\x3c\x21\x9e\x10\xcf\xe9\x11\x4f\x28\x19\x94\x0c\x4a\x36\x8d\x11\x85\x92\x65\xc5\x03\x25\x9b\x16\x25\x7b\x50\x3b\x79\x7b\xd3\x8a\x8a\xf5\xcd\x80\x9a\x10\xb7\x8d\xda\x65\x15\x5d\x33\xbc\x15\x3c\x6c\xa3\x76\x69\x1a\xa6\x9f\xff\xee\xfe\xe3\x1f\x45\x87\x0e\x45\xbf\x26\x0b\xa5\x52\x82\xd4\x55\x5a\xe7\x44\xa6\xf4\x4c\x49\x1d\x7b\x91\xbe\x7e\xd3\x17\x2d\x6a\x81\x6a\x39\x32\xc8\x8e\xe4\xa5\x31\x26\xba\xe5\xd1\xe6\x9c\xc2\xf2\x1c\x47\x59\xf1\x1e\x10\xb5\x2a\x78\x17\xde\x42\xc5\x7b\x62\x8e\x3d\x7a\x55\xde\x25\xe7\x2a\x3b\x4f\x09\xdc\x12\xf9\xf1\x35\xab\xe2\x83\xb7\x7e\xce\x4f\xcd\x78\x59\x2c\xfa\xae\x97\x69\xfb\xb3\x7e\xd6\xdf\xb5\xdc\x82\x86\x93\xb6\x7a\xb6\xc2\x4b\xe0\x25\xf0\x12\x78\xc9\xdc\x78\x49\x85\x36\x5b\xc7\x4c\xaa\x2d\xa3\x6a\xad\xf6\xa4\xb5\xf7\x5f\xa1\xe0\x22\x4f\xd1\x1b\x1d\x8d\x65\x85\x33\xca\xcc\x83\xcc\xb3\xa5\x63\x13\x1e\x94\xd8\x86\xd2\x0a\x76\x6a\xbd\x12\x77\xae\xb0\x5d\xb3\xb2\x78\xbe\xd8\xbb\xc9\xe2\xb4\x16\x6b\xff\xf9\x8f\xbd\x2b\xd6\xb6\x1f\xee\x83\xdf\x54\x32\xe3\xc3\xe5\x53\xfb\xf5\xa2\x57\x3e\x9e\x1b\x91\x80\xc5\xe3\xde\xd7\x6f\xd9\xd6\xf7\x2c\x15\x68\x07\x5c\x64\x92\x45\xb3\x6c\x25\xfe\xa9\xaf\xa8\x47\x4b\xcf\x9d\x1f\xc5\xb5\xb8\x73\x9c\x1f\xb5\x7b\x6d\x1d\xae\xd2\x7b\x37\x1c\xf8\xd0\xb8\x89\xa7\x64\x74\x3a\xb5\x6e\x31\x50\xe6\x59\x86\x19\xa6\xb3\x41\xae\x66\xa2\x28\x07\x5d\x67\x93\xc8\x3f\xd2\xd6\xba\xed\x8a\xc0\x18\xd1\xe2\x41\x3d\x9a\x68\x9c\xc4\x21\x7a\x50\x25\xa2\xd5\x4b\x4f\x9d\xbd\x32\x9b\xc3\x43\x68\xa7\xba\xd7\xae\xda\x48\x3d\x41\x23\x7b\x7b\x25\xfe\x91\x6c\xd8\x06\x8e\x24\xaf\x46\xa4\x28\xda\x4f\x4f\x6a\x6d\xcb\x9d\x72\x9e\x0f\x61\x32\x87\x2d\xd7\x76\xde\x44\xf6\xb4\x16\xba\xd8\xf8\xd2\xd2\x6f\x8d\xed\xad\x13\x85\xe0\xb0\x69\xeb\x18\xa4\x78\x96\xee\x83\xf0\x26\xd3\xc3\x25\xc3\x23\xe3\x07\x8a\x2e\xf2\x68\xd6\xc0\xf8\x14\x2b\x73\x9f\x4f\x4a\xba\x85\xf7\xd8\x62\x98\xf5\x3d\xdf\xeb\x5b\x2e\xf2\x51\xd4\x78\x29\xc6\x32\xfd\x4f\xe1\x9b\xcd\xe4\x52\xce\x38\xcf\x36\xfd\xa1\x9d\xd0\x4e\x68\x27\xb4\x13\xda\xd9\x1b\xed\x6c\xb8\x17\x1c\x11\xcf\xf3\x6d\x8b\x3f\xa7\xb2\x21\xb6\x8e\x92\x81\x4a\x96\xa0\x7b\xdf\xdb\xca\x8d\xd6\x8e\x4c\xf4\x75\x26\xb6\x36\x9e\x74\x87\x74\x8a\x70\xda\xdd\xae\xfe\x6b\x25\x3e\x99\xf5\xcc\xa8\x2e\x5b\xe5\x86\x2f\xcb\x61\x4f\x55\xc2\xf3\xb7\x5f\xa4\x1b\xc7\xfa\xfa\x7b\x75\xf3\x28\x9d\xd8\x56\xfe\x7c\x69\xbe\xfe\x7c\x29\x1e\x6d\x57\x3a\xf6\xff\xc5\x1b\xc9\x83\x12\x72\xad\x11\x98\x77\x63\xf0\xc0\xfa\x60\x86\x99\xd3\x5f\x05\x87\x83\x8c\x7d\xba\x12\xef\x6d\xbd\x38\xa6\x6e\xdd\xf3\x8f\x9f\xed\x00\x3c\x77\xc6\x3c\xd6\x36\x8a\xb7\xfb\xd2\x66\x40\xcd\x13\xfc\x1c\x3f\x7b\xa9\xca\x53\x04\x1b\xba\x35\xcc\xf4\xa3\x87\x2f\xec\x17\xef\xbb\xd8\x48\xff\x41\x6e\x32\xfe\xc9\xc4\xa8\x51\xfe\xa3\xe7\x3f\x85\x63\x52\x28\xaf\xdf\x73\x4f\x54\x2e\x2e\xad\xf4\xc6\x1a\xeb\xd6\xc8\xd6\x0e\xb5\x49\xcb\x5e\x1f\x4c\x61\xad\x2b\x68\xe7\x44\x32\xc6\xe1\x66\x1d\xed\xa4\xb1\x36\xb0\x4a\x0d\x66\xbc\x8f\x24\xc4\x31\x89\x5b\xcf\x5e\x6c\x25\xee\x2c\x4b\x6d\x77\x7a\x6f\x4a\x5b\x76\x57\xe6\x19\xae\xc4\x75\x34\x01\xb3\x13\x34\xf8\x49\x5c\xfd\x4d\x5a\x5f\x37\xbe\xb7\x77\xd7\xe1\xaf\x74\x0c\xb8\xfe\x51\x4e\x70\x46\x85\x8c\xf4\xe3\xec\x49\xe2\x27\x78\x48\xce\xf4\x93\xb8\xfa\xe0\xf9\x2a\x75\x5a\x61\xc9\xc0\x92\xeb\xf0\xe9\x23\xf9\x98\x14\x01\x7d\xbe\xc0\x98\x9e\x47\x27\x7c\x4c\xce\xd1\x66\x42\x6e\xf3\xd3\x7d\x18\x8d\x73\xc6\xa1\x09\xcd\xc6\xa1\x2a\x3c\x61\xa8\x51\x20\x50\xa1\xb7\xf1\x3d\x0e\x56\x38\x9f\x6f\x63\xc8\xb0\x85\x66\xc2\xaa\x08\x5d\x78\xa9\xfe\x53\x08\xeb\xa0\xcb\x27\x62\xba\x4f\x3b\xb9\xdb\x37\xe5\x73\xd3\x84\xca\xa9\x63\x4b\x72\x1e\xcd\xb6\x7c\x50\x99\xce\x98\xfa\x58\x42\x7c\xf3\x99\x8f\xb9\x67\x3a\x4e\x7f\xec\x3c\xef\xda\x38\xcc\xfc\xc8\xc8\x8e\x35\xfb\xb8\x22\x75\x43\xe0\x1d\x9e\xe4\x08\x77\xbf\x14\x72\x93\xc5\xb9\x9c\x2c\xce\x66\xbb\x4c\x5d\x26\xe7\xf9\xcc\x31\x62\x14\x88\x51\x20\x46\x81\x18\x05\x62\x14\x8a\x16\x5f\xe0\xf7\x84\x24\x02\x0f\x85\x87\xc2\x43\xe1\xa1\xf0\x50\x78\xe8\xbc\x78\x28\x88\x02\x44\x01\xa2\x00\x51\xf4\x8e\x28\x4e\xc0\xf8\x23\xcd\xb3\x6c\x26\xc2\xe3\x5c\xcb\x97\x7a\xdc\x46\x05\x77\x4a\x0f\x58\x56\xe1\xcc\x55\x0a\x69\x44\x44\x62\x95\xf6\xe5\xcf\x3e\x3b\xb1\x1e\x24\x9d\xb9\x6e\x66\x57\xf0\xa8\x45\xed\xcc\xa9\xd4\xd3\xb8\xc8\x8d\xdd\xe5\xd6\x0b\x3a\x26\x65\xc6\x94\x11\xd2\x6d\x4a\xc5\xcc\x01\x9d\x73\xb1\x76\xc9\x9f\x15\x8d\x0b\x7a\x5d\x2d\x3a\x49\x09\x25\x2d\x29\x3d\xf4\xa3\x4d\x4b\xd2\x2e\x8b\x5f\xa5\x2b\x37\xca\x37\xce\x37\xd3\xa6\x23\x08\x3c\xcb\xd6\xd6\x64\xe2\xe6\x92\xda\x5b\xe9\xf9\x42\xb9\xbb\x50\xbd\x8b\xcd\xeb\x27\x19\xce\xa4\xf0\x27\x81\x8a\x75\xa4\x74\xf2\x4d\x9c\xa4\xa3\x75\x44\xed\xd2\xf2\x7c\x71\xfb\xf6\x87\xf0\xb7\xbe\xb4\x34\xc3\x72\x3c\x77\x63\x34\x22\xed\x76\xb2\x3c\x77\x27\x6d\xd7\xac\x52\xda\xad\x73\xf8\xad\xf6\xeb\x47\x84\x4d\x3c\x3c\x27\x4a\xff\xc6\x73\xa4\xbb\x59\x79\xfe\xe6\x66\xfb\x75\x73\xb3\x77\x6d\xcb\x5b\xab\x9b\xbf\x7c\x0c\xee\xc3\xb3\xb4\xf6\x13\x47\xc2\xe9\x72\x78\x46\xa5\x42\x4d\x5b\xb3\x69\xaa\xd5\xbc\x6d\xa0\xd5\xbc\x33\x8e\xaf\x31\xde\xfc\xdb\xda\x9b\x37\x61\xb7\x63\xbc\xfb\x99\x2a\x94\x5a\x5b\x99\x8c\x42\x79\x21\x5a\x97\xed\x28\xe8\xb4\xdf\x63\xf5\x8e\xe6\xba\x5a\x49\xc9\x0e\x0a\x75\xa4\xaf\x8e\x56\x36\x45\xad\x8c\xd4\xe8\x05\xa5\x46\x93\x03\x46\x0e\x18\x39\x60\xe4\x80\x61\x50\x96\xbd\x45\xa3\x4c\xb8\x18\xc6\x28\x23\x5f\x24\xfa\x5d\x65\xbe\xc8\x74\xec\xb2\xc4\xf9\xdd\x79\x96\x88\xaf\xe4\x3a\xa7\x87\x35\x34\xac\xc2\x23\xfb\x4e\x0d\x49\x29\x28\xea\xdf\x3a\xe0\xeb\x21\xfc\x24\xad\xdd\x4a\x88\xf7\xe1\xff\xf1\xdf\x9f\xa4\xad\x9d\x81\x81\xb0\x9c\x7d\xb0\x53\xfe\x61\xdb\x31\x91\xa1\xc2\xb1\xbf\x2a\x71\x95\x74\xf4\xbb\x0a\xb5\xcb\x58\x23\x5a\x89\x7b\x47\xba\xae\x32\x6a\xa9\xd6\x59\xa4\x63\xd4\xa4\xdb\x1f\xda\xac\xe3\xfa\x1e\x07\xd2\x26\x12\xa1\x25\xca\xf8\x43\x2c\xbe\xf0\x49\xc5\x7b\x23\xb1\x70\x07\xd9\x06\xb1\x74\xa2\x98\xa8\x7d\xa0\x7c\x1d\xcc\x74\xd0\xab\x9f\x7b\x16\x54\x78\x33\xf3\x45\xcf\xe3\xde\xe6\x70\xde\x99\xdf\x95\x6c\x13\x1b\x35\x21\xdf\xdd\x4b\x60\x70\xba\x9d\x7c\xf9\x6d\x4c\xa9\x9b\xfc\x74\xf1\xb6\x0e\x24\x69\x55\x6b\xfc\x5a\x1f\xfb\xd7\xea\x65\xec\x49\xf9\x1b\xd5\xe8\x97\xc1\xce\x97\x3b\xb5\xb1\xad\xeb\xe6\xc7\x84\x9f\x9f\xa3\x5f\xea\x05\xb3\x89\x0e\xb2\x95\xfe\xce\xd6\x79\x5e\x26\xe8\xa9\x9d\x3e\xb2\xcd\xf7\xf4\x9d\x21\x93\xaf\xd0\xeb\xef\xb3\x01\x48\x02\xef\xef\xcc\xbd\xbf\xcb\x61\xf2\xb9\xb4\x89\xf8\xe5\x32\xa9\x3d\xe1\x82\x73\x48\x17\x7f\x55\xb2\x18\xbd\xd6\xbe\x2f\x93\xcf\x2b\x1d\x7d\xa4\xeb\xb9\xd7\xe6\x68\xfd\x0b\xed\x7e\x0e\xc4\xab\xbf\x07\x9e\x7b\x6f\xb2\xa6\x7f\x0d\x97\xbd\xe8\xf3\xa7\x78\x31\x3c\xfc\xf1\xf5\x98\x82\x05\x9a\xcf\x9b\x0f\x9e\x6f\x69\xff\xfc\xc6\xd3\x83\xef\x89\xcf\x97\x8f\xe1\xdf\x3e\x5f\x8a\xbb\x8c\x34\x75\x50\xb6\x71\xa6\x6b\xbb\x20\x7a\x51\xaf\xa5\xa5\x07\x40\xe7\xdd\x3a\xb6\x15\xb9\x07\xb5\x19\xe1\x7d\x8f\xc6\xd6\xe4\xa5\x6e\x95\xb7\x75\xd4\x4a\x98\x6b\xea\x74\xfb\x78\x4e\xe9\xd0\xe8\xc2\x81\x48\x2e\xdf\x46\xbc\xe1\x85\xb0\x26\xcc\x17\x58\x13\x99\x67\x1a\xda\x9a\xd8\xe6\x02\x8c\x27\x63\x4f\xec\x3b\xf7\x39\x6d\x1d\x69\xb5\x54\xf3\xa2\x83\x67\xae\xe8\x11\x7c\x89\xa2\xb7\x3c\x45\x6f\x44\xfa\x14\xdb\x7e\xf2\x0d\xc1\x97\x0d\x6e\x7e\xae\x3a\xcb\x7e\x42\x1e\xd0\x0b\x71\x7a\xf4\x62\xb6\xdf\xd8\x30\x45\xd8\x2a\xb4\x9d\xaa\xfa\x6b\x1f\x3c\xff\xce\x71\x12\xa0\x35\x8a\x26\x7d\xa5\x07\x90\x69\x17\x8d\x1a\x49\x76\x03\x25\xd9\x9d\x19\xa9\x50\xd5\x70\xc6\x55\x0d\xeb\x19\x51\x5d\x45\xc3\xf6\xbd\x6c\x9b\xf1\x2f\xea\x18\x52\xc7\x90\x3a\x86\xd4\x31\x9c\x5b\x1d\xc3\xfa\x95\xb7\xb0\x86\x61\xcf\xd1\x06\x67\xab\x5c\x58\xff\xf8\xe5\x55\x0b\xc7\x2c\x83\x53\x6a\x15\xd6\xcb\xa0\xbc\x4e\x61\xcf\x32\xa0\x3a\x21\xd5\x09\xa9\x4e\x48\x75\x42\xaa\x13\xf6\x56\x9d\xb0\xc1\xea\x7f\x54\x99\xb0\x32\x47\x6f\x41\xc1\x86\xcd\x9e\x66\xc6\xd5\x15\xeb\xc5\x5d\x55\x59\xf1\xbc\x72\xa7\x9e\x62\x2f\x23\x7a\x5c\x4b\xb1\xe7\x61\x1d\xb4\x82\x62\xbd\x78\x2a\xaa\x27\xf6\xbd\x6c\x8e\xb5\x66\x62\xbd\xd0\x0a\x08\x46\x6b\x7f\x5e\xf4\xe9\xcf\x93\xe8\x95\x9b\x50\x1f\x53\x77\x43\x7f\xfe\x4f\x31\xd4\xea\xb1\x0c\x47\x2a\x41\xd9\x7b\x6c\x80\xb3\x4a\x8a\x71\xbc\x4b\x4e\x93\xd0\xac\x75\xc1\xc9\xa8\xcd\x81\x63\x17\xc7\x2e\x8e\x5d\x1c\xbb\x33\x74\xec\x4e\xa1\x41\x0d\x01\x93\x8d\x07\x6a\xc8\x80\x49\xfa\x08\x51\x29\x6a\xc1\x95\xa2\x68\x1a\x05\x96\x01\xcb\x80\x65\xc0\x32\x60\x19\x9a\x46\x51\x40\x91\x02\x8a\x14\x50\xa4\x80\x62\x7e\x46\x9e\xb5\x37\xda\x9c\x18\x2a\x1d\xea\xe6\x4d\x54\xe9\x50\x37\xa5\x0e\x75\x85\xb0\x8e\x3c\x55\x8a\xa2\xb6\x2d\x8a\x7a\x50\x99\xa6\x95\xa2\x35\x8d\xd4\xcd\x4e\xf8\x36\x99\x66\xcb\xc9\x34\x6b\xb6\xc1\xd4\x65\x9b\x9d\xcf\x12\x23\x3c\x81\xf0\x04\xc2\x13\x08\x4f\x20\x3c\xa1\x68\xf1\x85\x7b\x4f\x48\x22\xa0\x50\x50\x28\x28\x14\x14\x0a\x0a\x05\x85\xce\x0b\x85\x42\x27\xa0\x13\xd0\x09\xe8\x44\xef\x74\xe2\x04\x82\x3f\xd2\x5c\xb0\x66\x22\x3c\xce\x07\x9b\x55\xd9\xf1\xd2\x03\xa8\xea\x47\x55\xbf\x45\x55\xf5\x8b\xb4\x47\x53\x80\xd9\x5d\x8b\x70\x94\x44\x60\x79\x5b\xf5\x46\x04\x7b\xeb\x4b\xb8\x14\xe9\xa5\x5e\xc9\x27\xb3\x4e\x6d\x7d\x4f\x6b\xab\x45\x19\xa6\xd5\xad\x94\x34\x27\xca\x7e\x4d\x3f\xa5\xba\xa7\x89\x3e\xa5\xfa\x29\x79\x41\xc7\x60\xd0\x58\x6e\xa9\x16\xf4\x15\x10\xd0\xfc\xb6\x1f\x0c\x38\x99\x8a\xf5\x14\xab\x5f\x4e\xee\x15\xc5\xea\x29\x56\x5f\x70\x33\x53\xd0\xe1\xa6\x5a\xa7\x7e\xdc\xad\xa8\x3b\xb8\xf1\x99\x2a\xcc\x5a\x33\x99\x82\xc2\x7c\x21\x3a\xac\x4c\x62\xfe\xfa\x9f\x33\x15\x28\x69\xa4\xa4\x95\x54\x25\xa1\x16\x09\x3a\xd9\x2c\x74\x32\xb2\xbf\x17\x94\xfd\x4d\x9a\x1b\x69\x6e\xa4\xb9\x91\xe6\x86\x39\x59\xf6\x16\x8d\x32\xa7\x64\x18\xe3\x8c\x94\x98\xe8\x77\x95\x29\x31\x93\x30\xd2\x12\x87\x77\xe7\x89\x30\xbe\x92\xeb\x9c\x0a\x56\x6f\x53\x85\x07\x9d\x25\xfb\x25\xa5\x9b\xa8\x7f\xeb\x98\xb6\x87\xf0\x93\xb4\x76\x2b\x21\xde\x87\xff\xc7\x7f\x7f\x92\xb6\xf6\x02\x06\xc2\x72\xf6\xc1\x4e\xf9\x87\x1d\x27\xea\x5e\xed\xd8\x5f\x95\xb8\x4a\xee\xf2\x2a\x54\x2c\x63\x65\x68\x25\xee\x1d\xe9\xba\x51\xdb\x71\xad\xae\x48\xc7\x68\x48\xb7\x3f\xb4\x59\xc2\xf5\x3d\x0e\xa4\x48\x24\x42\x4b\xf4\xf0\x87\x58\x7c\xe1\x93\x8a\xf7\x46\x62\xe1\xe6\xb1\x0d\x62\xe9\x44\x61\x5f\xba\x15\xb8\x25\xdd\x94\x4a\xfd\xdc\xb3\xa0\xc2\x9b\x99\x2f\x5d\x1f\xf7\x0e\x87\xff\xae\x6c\x73\xd8\xa8\x69\xb8\xef\x5e\xc2\xbb\x35\xbc\x89\x7c\x27\x85\x77\xd0\x04\x64\x8f\x85\x61\x03\xef\x27\x07\xef\x75\x54\x50\x23\x6d\x26\xbf\x4a\x5f\xeb\x63\xff\x5a\xbd\x60\x3f\x29\x7f\xa3\x1a\xfd\x32\xd8\xf9\x72\xa7\x36\xb6\x75\xdd\xfc\x98\xf0\xf3\x73\xf4\x4b\xbd\x35\x34\xd1\xb6\xb6\xd2\xdf\xd9\x3a\x69\xcf\x44\xb0\x9d\xac\x79\xe9\xeb\x8d\xc9\x99\xdd\x57\xc4\x41\x85\xf1\x72\x9f\x8d\x26\x13\xb8\xb8\x67\xee\xe2\x5e\x4e\xd8\x41\x2e\x07\x26\x7e\xb9\x4c\x9e\x56\xb8\xe0\x1c\x72\xff\x5f\x95\x2c\x46\xaf\xb5\x83\xcf\x24\x67\x4b\x47\x1f\xe9\x7a\xee\xb5\x39\x5a\xff\x42\xfb\xd8\x03\xf1\xea\xef\x81\xe7\xde\x9b\x14\xf8\x5f\xc3\x65\x2f\xfa\xfc\x29\x5e\x0c\x0f\x7f\x7c\x3d\xa6\x78\x88\xe6\xf3\xe6\x83\xe7\x5b\x1a\x42\x6c\x3c\x3d\xf8\x9e\xf8\x7c\xf9\x18\xfe\xed\xf3\xa5\xb8\xcb\x48\x53\x47\xd8\x1b\x62\xa0\x2d\xa0\xe8\x45\xbd\x96\x96\x1e\x00\x9d\x44\xed\xd8\x56\xe4\x03\xd5\x06\x93\xf7\x3d\x1a\x5b\x93\x64\xbc\x55\xde\xd6\x51\x2b\x61\xae\xa9\x6b\x27\xc4\x73\x4a\xc7\xb9\x17\x0e\x44\x72\xf9\x36\xe2\x0d\x2f\x84\xdd\x64\xbe\xc0\x6e\x1a\x8b\xdd\xb4\xcd\x05\x8a\x4f\xc1\x72\xda\x77\xee\x53\xdb\x3a\xd2\x3a\x5d\xb9\x8b\x8e\x5b\x82\x7a\x47\x40\x29\x9a\xdd\xa2\x34\xbb\x11\x29\x50\xec\xf3\xc9\x37\x04\x94\x2e\x4e\x3f\xd9\x4f\xc3\xaf\x7b\x21\xba\x0f\xcb\xbc\x09\x0c\xf6\x4d\x45\x67\xf6\xc3\x13\xcd\x75\xe2\x9d\xad\x7b\xb2\x18\xe1\x6b\x96\x2f\x96\x01\xf0\x4e\xe9\xb0\x80\x77\xc0\x3b\xe0\x9d\x41\xf1\x4e\xfb\x8d\xb0\x21\xe8\x29\xd8\x09\x27\xe9\x0f\x00\xf7\xe0\x14\x58\x9e\x53\x00\xdc\xd3\xe5\xbc\x01\xf7\xe0\x06\xc2\x8e\x02\xf7\x0c\x85\x7b\x5e\xe2\xf5\x68\x08\x7e\xe6\xa2\xee\x81\x7f\xd0\xf4\x16\xa5\xe9\x8d\x48\xa1\x62\xdf\x4f\xbe\x01\xff\x2c\x4e\x5f\x99\x23\xfe\xd1\xe5\x15\x63\xda\x63\x39\x32\xc8\xbe\x3a\xdd\x43\x9e\xa8\x14\xb7\xbb\xb6\xbf\xd9\xeb\xbd\x74\xd2\x65\x3d\x65\x52\x7c\x3f\x7a\xfa\x77\xe1\x0d\xad\x52\x99\xe7\x3f\x26\x39\xeb\x57\xfa\x44\x57\x87\x4e\x2c\x99\xd6\x1a\x89\x92\x24\x6c\x37\xd8\x29\x99\x71\x6f\xe6\x55\xa8\xef\x85\xfe\xb2\xf4\x2d\xfc\x92\x2b\x61\x48\xbd\xcd\xb1\x26\xd7\xea\x72\xb1\xef\xbf\x29\x77\xe9\x55\x37\xf5\x38\x0e\x53\x7a\x53\xbf\x32\x67\x06\x56\xf4\x3a\x9b\x71\xaf\xb3\x7a\x1a\x55\xd7\xe7\xac\xd2\xdd\xd5\x01\x69\xa3\xbb\x19\xdd\xcd\xe8\x6e\x46\x77\xb3\xb9\x75\x37\xab\x5f\x79\x0b\x3b\x9b\xf5\x1c\xd7\x70\xb6\x7e\x66\xf5\x8f\x5f\xde\xcb\x6c\xcc\x32\x38\xa5\x83\x59\xbd\x0c\xca\xbb\x97\xf5\x2c\x03\x7a\x96\xd1\xb3\x8c\x9e\x65\xf4\x2c\xa3\x67\x59\x6f\x3d\xcb\x1a\xac\xfe\x47\xfd\xca\x2a\x2b\x5a\x2e\x28\xac\xb1\xd9\xd3\xcc\xb8\xe7\x5a\xbd\xb8\xab\xfa\xad\x9d\x57\xee\x74\x59\xeb\x65\x44\x8f\x3b\xac\xf5\x3c\xac\x83\xf6\x55\xab\x17\x4f\x45\x4f\xb5\xbe\x97\xcd\xb1\x76\x52\xab\x17\x5a\x01\xd1\x68\xed\xcf\x8b\x3e\xfd\xf9\x62\x4a\x56\x50\xaf\xbe\x27\x58\x96\x26\x64\x6e\xbc\xe7\x7b\x8f\xe2\xab\xed\xae\xbb\x27\x65\x6f\x0e\x6a\xbe\x36\x65\x22\x95\x30\xb4\x14\x0e\xf6\xcb\x55\xc6\xee\x4d\x9d\xfb\x65\x9c\x0d\xc6\x06\x63\x9b\x1a\x63\x83\xaf\xc1\xd7\xe0\x6b\xf0\x35\xf8\x1a\x7c\x0d\xbe\x06\x5f\x83\xaf\xc1\xd7\xe0\x6b\xf0\x35\xf8\x1a\x7c\x0d\xbe\x06\x5f\x9b\x1e\x5f\x2b\x28\xfe\x52\xe0\x72\x98\x52\x05\x18\x88\x21\xc4\x10\x62\x38\x8d\x11\x85\x18\x66\xc5\x03\x31\x9c\x3c\x31\x1c\x53\x4a\xdd\xb0\xd9\x74\xbf\xd8\xc1\xee\x83\xe7\xdf\x39\x4e\x52\x9f\x00\xe8\x07\xf4\x9b\x1c\xf4\x1b\x26\xb1\x0e\xe6\x07\xf3\x83\xf9\xc1\xfc\x60\x7e\x30\x3f\x98\x1f\xcc\xaf\xcb\xd5\x16\xe6\x07\xf3\x83\xf9\xc1\xfc\x60\x7e\x30\x3f\x98\xdf\xe2\x98\x1f\x84\x0c\x42\x06\x21\x9b\xc6\x88\x42\xc8\xb2\xe2\x81\x90\x4d\x97\x90\xd5\xb5\x1f\x5b\x3c\x38\x3b\xaa\xe3\x4d\x2d\x4a\x90\x19\xc8\x0c\x64\x06\x32\x03\x99\x81\xcc\x40\x66\x20\x33\x90\x19\xc8\x0c\x64\x06\x32\x03\x99\x81\xcc\x40\x66\x20\x33\x90\x19\xc8\xec\x0c\xbe\x5f\xda\x8a\xc3\x0a\x61\x85\xb0\xc2\x51\x8f\x28\xac\x30\x2b\x1e\x58\xe1\x7c\x59\xe1\xb8\x2a\x72\x4e\xb2\x18\xe7\x11\x6d\x84\x34\x42\x1a\xa7\x46\x1a\xa1\x8c\x50\x46\x28\x23\x94\x11\xca\x08\x65\x84\x32\x42\x19\xa1\x8c\x50\x46\x28\x23\x94\x11\xca\x08\x65\x84\x32\x42\x19\x27\x45\x19\x0b\x8a\x71\x9e\x8e\x0f\xc7\x42\x0e\x41\xa6\x20\x53\x90\x29\xc8\x74\xd4\x23\x0a\x32\xcd\x8a\x07\x64\x3a\x62\x64\xea\xad\x55\x0c\x4b\x5b\x71\xcf\xbe\xd9\x5d\x21\xbc\xc9\x8d\xf2\x46\xed\x84\xed\x3e\x7a\xfe\x53\x32\xab\xa5\x30\x24\xa6\x9c\x5f\x6e\xd4\xee\x37\x6f\xad\xee\xee\x3f\xfe\x77\xfe\x97\x43\x71\xca\xc9\xe2\xc3\x44\x88\x53\x87\x87\xde\x5a\xa5\x7e\x7d\x91\xbe\x62\xf9\x7b\xf3\xed\x76\xda\xaf\x4e\xc6\xb6\x37\x6b\x61\xfd\x7b\xf3\xcf\xdb\xbb\xfb\x8f\x7f\x14\xfd\x9e\xb7\xe7\xf4\xb7\x27\x16\xa4\xce\xcd\x9e\xc1\x4b\xf4\xbf\xdf\x6e\x5b\xbd\x47\xfe\xde\x0d\xb5\x85\xa8\x43\x6e\xfa\xad\x32\xee\x91\x6e\x63\x71\xcc\x39\x85\xe5\x39\x8e\xb2\xe2\x9d\xe3\x0f\x73\x0b\x47\xed\x64\x73\xaf\x81\x39\xd6\xbc\x09\xef\x92\x13\x94\x1d\x5c\xc2\xe8\x45\x7e\xf8\x8c\x5a\xf0\xe0\xad\x9f\xf3\x33\x2f\xd6\x0b\x8a\xbe\xeb\x65\x56\xfe\xac\x1f\xf0\x77\x2d\xac\xa0\xe1\x9c\xac\x9e\x8c\x60\x5f\xb0\x2f\xd8\x17\xec\x3b\x37\xec\x5b\x61\xce\xd5\xa1\xdf\x6a\xd7\x40\xb5\x59\x77\xd2\xda\xfb\xaf\x50\x70\x91\xc3\xfb\x8d\xae\x58\x63\x85\x33\xca\xcc\x83\xcc\xb3\xa5\x43\xac\x1e\x94\xd8\x86\xd2\x0a\x76\x6a\xbd\x12\x77\xae\xb0\x5d\xb3\xb2\x78\xbe\xd8\xbb\xc9\xe2\xb4\x16\x6b\xff\xf9\x8f\xbd\x2b\xd6\xb6\x1f\xee\x83\xdf\x54\x32\xe3\xc3\xe5\x53\xe3\x89\xe8\x95\x8f\xe7\x46\x24\x60\xf1\xb8\xf7\xf5\x5b\xb6\xf5\x3d\x4b\x05\x9a\x23\x44\x3e\x89\x68\x96\xad\xc4\x3f\xf5\x15\xf5\x68\xe9\xb9\xf3\xa3\xb8\x16\x77\x8e\xf3\xa3\xa6\x04\xeb\x70\x95\xde\xbb\xe1\xc0\x87\xd6\x7d\x3c\x25\xa3\xd3\xa9\x75\x8b\x81\x32\xcf\x32\xcc\x30\x9d\x8d\xd5\x37\x13\x45\x39\xaf\x3f\x9b\x44\xfe\x91\x76\x57\xd9\xae\x08\x8c\x17\x49\x3c\xa8\x47\x13\x54\x98\x70\x9d\x83\x2a\x11\xad\x5e\x7a\xea\xec\x95\xd9\x1c\x1e\x94\x70\x3d\xf7\xda\x55\x1b\xa9\x27\x68\xe4\x70\x5a\x89\x7f\x24\x1b\xb6\x61\xbc\xc9\xab\x11\x69\x87\xf6\xd3\x93\x5a\xdb\x72\xa7\x9c\xe7\x43\xb4\xdf\x61\xcb\xb5\x9d\x37\x91\x43\x49\x0b\x5d\x6c\x7c\x69\xe9\xb7\xc6\xf6\xd6\x89\x42\x70\xd8\xb4\x75\x28\x65\x3c\x4b\xf7\x41\x78\x93\xe9\xe1\x92\xe1\x91\xf1\x03\x45\x17\x79\x34\x6b\x60\x7c\x8a\x95\xb9\xcf\x27\x25\xdd\xc2\x7b\x6c\x31\xcc\xfa\x9e\xef\xf5\x2d\x17\x39\xe9\x6a\xdc\x74\x63\x99\xfe\xa7\x84\x69\x34\x93\x4b\x79\xa8\xc6\xd9\xa6\x3f\x41\x1b\x04\x6d\x10\xb4\x41\xd0\x06\x41\x1b\xbd\x05\x6d\x34\xdc\x0b\x8e\x02\x37\xce\xb7\x2d\xfe\x9c\xca\x03\xdb\x3a\x4a\x06\x2a\x59\x82\xee\x7d\x6f\x2b\x37\x5a\x3b\xba\xf7\x1c\xdb\x7a\xce\xa4\x08\xc4\x93\xee\x90\x48\x16\x4e\xbb\xdb\xd5\x7f\xad\xc4\x27\xb3\x9e\x19\xd5\x65\xab\xdc\xf0\x65\x39\xec\xa9\x4a\x78\xfe\xf6\x8b\x74\xe3\x94\x05\x7f\xaf\x6e\x1e\xa5\x13\xdb\xca\x9f\x2f\xcd\xd7\x9f\x2f\xc5\xa3\xed\x4a\xc7\xfe\xbf\x78\x23\x79\x50\x42\xae\x35\x03\xf6\x6e\x0c\x1f\x5b\x1f\xcc\x30\x73\xfa\xab\xe0\x70\x90\xb1\x4f\x57\xe2\xbd\xad\x17\xc7\xd4\xad\x7b\xfe\xf1\xb3\x1d\x88\xff\xce\x98\xc7\xda\x46\xf1\x76\x5f\xda\x0c\xa8\x79\x82\x9f\xe3\x67\x2f\x55\x79\x8a\x68\x5b\xb7\x86\x99\x7e\xf4\xf0\x85\xfd\xe2\x7d\x17\x1b\xe9\x3f\xc8\x4d\xc6\x29\x99\x18\x35\xca\x7f\xf4\xfc\xa7\x70\x4c\x0a\xe5\xf5\x7b\xee\x89\xca\xc5\xa5\x95\xde\x58\x63\xdd\x1a\xd9\xda\xa1\x36\x69\xd9\xeb\x83\x29\xac\x75\x05\xed\x9c\x48\xc6\x38\xd0\xa4\x4d\x7f\x1b\x6b\x03\xab\xd4\x60\xc6\xfb\x48\x82\xdc\x93\xf4\x9b\xec\xc5\x56\xe2\xce\xb2\xd4\x76\xa7\xf7\xa6\xb4\x65\x77\x65\x9e\xe1\x4a\x5c\x47\x13\x30\x3b\x41\x83\x9f\xc4\xd5\xdf\xa4\xf5\x75\xe3\x7b\x7b\x77\x1d\xfe\x4a\xa7\xb2\xe8\x1f\xe5\x04\x67\x54\xc8\x48\x3f\xce\x9e\x24\x7e\x82\x87\xe4\x4c\x3f\x89\xab\x0f\x9e\xaf\x52\xa7\x15\x96\x0c\x2c\xb9\x0e\x9f\x3e\x92\x8f\xc9\x74\xd2\xe7\x0b\x8c\xe9\x79\x74\xc2\xc7\xe4\x1c\x6d\x26\xe4\x36\x3f\xdd\x87\xd1\x38\x67\x1c\x9b\xd3\x6c\x1c\xaa\xe2\x73\x86\x1a\x05\x22\x75\x7a\x1b\xdf\xe3\x68\x9d\xf3\xf9\x36\x86\x8c\xdb\x69\x26\xac\x8a\xd8\x9d\x97\xea\x3f\x85\x84\x0e\x78\x7c\x22\xa6\xfb\xb4\x93\xbb\x7d\x53\x3e\x37\x21\x66\x9c\x3a\xa0\x24\x55\xdb\xec\xc5\x07\x3d\xa9\x93\xac\xed\x03\x8e\x2e\xce\xd7\x2e\x01\xbc\xf9\xa4\xed\xaa\x7c\xed\xce\x4b\x4a\x18\xd7\x98\x1f\x99\xd3\xb1\x0e\x1f\x57\x93\x68\xc8\xb3\xc3\x93\x18\x9a\xfd\x52\x86\x4d\xae\xf9\x72\x72\xcd\x9b\x6d\x22\x75\xf9\xe6\xe7\xb3\xb6\x08\x41\x20\x04\x81\x10\x04\x42\x10\x08\x41\x28\x5a\x7c\x61\xdb\x13\x92\x08\xb8\x13\xdc\x09\xee\x04\x77\x82\x3b\xc1\x9d\xf3\xc2\x9d\x10\x08\x08\x04\x04\x02\x02\xd1\x3b\x81\x38\x81\xd2\x8f\x34\x8f\xb8\x99\x08\x8f\x73\x89\x5f\xea\x71\x1b\x15\xbb\x29\x3d\x60\x59\xe5\x7d\x57\x1a\x5e\x7c\xbb\x5d\xa5\x1d\xf8\xf3\x4c\x28\xac\x87\x43\x9d\x35\x0b\x3d\x03\x10\x6a\x51\xc0\x77\x2a\xe5\x60\x2e\x72\x03\x76\xb9\xf5\x82\x8e\xe9\x97\xb1\x54\x84\x6c\x0a\xba\xcc\xef\xbb\x41\x5d\xed\xd2\x35\x2b\xaa\x08\x75\xbf\x00\x74\x92\xb9\x49\xf6\x50\x7a\xbc\x47\x9b\x3d\xa4\x5d\x0f\xbf\x4a\x57\x6e\x94\x6f\x9c\x68\xa6\x50\x56\x10\x78\x96\xad\xad\xc2\xc4\x5d\x25\xb5\xd7\xd1\xf3\x85\x72\x77\xa1\x9a\x16\x9b\xc9\x4f\xf2\x6b\x28\xc5\xdd\x17\x15\xa8\x58\xd7\x49\xe7\xc8\xc4\xb9\x34\x5a\xd7\xd3\xae\x29\xcf\x17\xb7\x6f\x7f\x08\x7f\xeb\x4b\x4b\xb3\x28\xc7\x73\x37\x46\xb3\xd1\xee\xa3\xd0\xce\x97\xb6\x6b\x96\x23\xed\x9e\x39\xfc\x56\xfb\xe7\x23\x52\x26\x1e\x9e\x13\xe5\x7d\xe3\x39\xd2\xdd\xac\x3c\x7f\x73\xb3\xfd\xba\xb9\xd9\xbb\xb6\xe5\xad\xd5\xcd\x5f\x3e\x06\xf7\xe1\x59\x5a\xfb\x7b\x23\xe1\x74\x39\x3c\xa3\x52\x85\x26\xa8\xa1\x34\xd5\x4e\xde\x36\xd0\x4e\xde\x19\xaf\xd5\x68\xee\xf8\x6d\xed\x1d\x9b\x38\xd8\xd1\xdc\xf2\x9c\x54\x40\xad\x6a\x8c\x5b\x05\xbc\x10\xa7\x15\xc4\x28\x68\x50\xd3\x63\x5d\x8c\xc6\x2a\x55\xba\x16\x06\x15\x30\xd2\x57\x47\x8f\x9a\xa2\x1e\x45\xce\xf1\x82\x72\x8e\x49\xae\x22\xb9\x8a\xe4\x2a\x92\xab\x30\x01\xcb\xde\xa2\x51\x66\x32\x0c\x63\x5c\x91\x88\x51\x9a\x88\x31\x72\x53\x2b\xf1\x40\x77\x9e\x7e\xe1\x2b\xb9\xce\x69\x5c\x0d\xed\xa6\xf0\xc8\x5e\x72\x2e\x52\xfa\x87\xfa\xb7\x8e\xa4\x7a\x08\x3f\x49\x6b\xb7\x12\xe2\x7d\xf8\x7f\xfc\xf7\x27\x69\x6b\xef\x5c\x20\x2c\x67\x1f\xec\x94\x7f\xd8\x55\x4c\xc8\xa5\x70\xec\xaf\x4a\x5c\x25\x7d\x3d\xaf\x42\xe5\x31\x56\x78\x56\xe2\xde\x91\xae\xab\x8c\xd6\xa9\x55\x12\xe9\x18\x2d\xe8\xf6\x87\x36\xcb\xb4\xbe\xc7\x81\x94\x85\x44\x68\x89\xae\xfd\x10\x8b\x2f\x7c\x52\xf1\xde\x48\x2c\xdc\x20\xb6\x41\x2c\x9d\x28\xd8\x68\x1f\x28\x5f\x47\x09\x1d\xd4\xe6\xe7\x9e\x05\x15\xde\xcc\x7c\x99\xee\xb8\x77\x31\x7c\x6c\x87\xf2\xc1\x53\x59\xf7\x5b\x50\xd6\x74\xeb\x94\xf2\x3b\x98\x52\xff\x94\xe9\x72\x63\x1d\x80\xd1\xaa\xac\xf6\xb5\x3e\xf6\xaf\xd5\xab\xd4\x93\xf2\x37\xaa\xd1\x2f\x83\x9d\x2f\x77\x6a\x63\x5b\xd7\xcd\x8f\x09\x3f\x3f\x47\xbf\xd4\xeb\x61\x13\xbd\x62\x2b\xfd\x9d\xad\xf3\xa3\x4c\xb0\x50\x3b\x1d\x43\x5f\x74\x8e\xb4\xbb\x42\x15\xbf\xcf\x46\xeb\x08\x1c\xb6\x33\x77\xd8\x2e\x07\x7c\xe7\x72\x0c\xe2\x97\xcb\xe4\xc1\x84\xab\xcc\x21\xb7\xfa\x55\xc9\x0a\xf4\x5a\xbb\xab\x4c\xf2\xab\x74\xf4\x91\xae\xe7\x5e\x9b\xa3\xf5\x2f\xb4\xc7\x38\x10\xaf\xfe\x1e\x78\xee\xbd\x49\x31\xfe\x35\x5c\xeb\xa2\xcf\x9f\xe2\x15\xf0\xf0\xc7\xd7\x63\x22\xf2\xcd\xe7\xcd\x07\xcf\xb7\xb4\x4b\x7d\xe3\xe9\xc1\xf7\xc4\xe7\xcb\xc7\xf0\x6f\x9f\x2f\xc5\x5d\x46\x9a\x3a\x82\xd9\xf8\xbf\xb5\xae\x1f\xbd\xa8\xd7\xd2\xd2\x03\xa0\x93\x54\x1d\xdb\x8a\x3c\x7a\xda\x34\xf0\xbe\x47\x63\x6b\x92\x38\xb7\xca\xdb\x3a\x6a\x25\xcc\x35\x75\x6e\x7a\x3c\xa7\x74\x1c\x71\xe1\x40\x24\x97\x6f\x23\xde\xf0\x42\x58\x08\xe6\x0b\x2c\x84\xa1\x28\x7c\x2e\xee\x76\xdc\x36\xc2\xbe\x73\xdf\xd0\xd6\x91\x56\x4b\xd5\x2d\x3a\x78\x8e\xca\x1b\xa1\x8a\x68\x6c\x0b\xd1\xd8\x46\xa4\x18\xb1\x7f\x27\xdf\x10\xaa\x38\x5f\x8d\x63\x3f\x76\x9f\xe4\x85\xa8\x0b\xfb\xd3\xf9\x46\x15\xdd\xb0\x3a\x87\x58\x51\x6e\xba\xbb\xb6\xbf\xd9\xeb\xbd\x74\xd2\x79\x6e\x32\xa9\x46\x91\x7e\xe4\x55\x2a\xf0\xe5\xc7\x24\x64\xe6\x4a\x9f\xe8\xea\x50\x9a\x28\x53\x6b\x26\x51\x70\x84\xed\x06\x3b\x25\x33\x3e\xc6\xbc\xfa\xf3\xbd\xd8\x73\xf5\x4b\x2e\xb3\x87\xac\xb3\xb1\x02\x7d\x9d\x34\xf9\xfe\x9b\x72\x17\x99\x81\xa6\x07\x6f\xe6\x69\x68\xd4\xf6\x9b\x71\x6d\xbf\x7a\xe2\x53\x57\xd7\xaf\x7d\xc7\xe2\x66\x34\x8b\x6a\x7e\x54\xf3\xa3\x9a\x1f\xd5\xfc\xe6\x56\xcd\xaf\x7e\xe5\x2d\xac\xe4\xd7\x73\xec\xc0\xd9\xea\xf7\xd5\x3f\x7e\x79\xed\xbe\x31\xcb\xe0\x94\x8a\x7d\xf5\x32\x28\xaf\xd6\xd7\xb3\x0c\xa8\xd1\x47\x8d\x3e\x6a\xf4\x51\xa3\x8f\x1a\x7d\xbd\xd5\xe8\x6b\xb0\xfa\x1f\xd5\xe7\xab\xcc\x97\x5b\x50\xe8\x60\xb3\xa7\x99\x71\x8d\xc1\x7a\x71\x57\xd5\x17\x3c\xaf\xdc\xa9\x2a\xd8\xcb\x88\x1e\x57\x14\xec\x79\x58\x07\xad\x23\x58\x2f\x9e\x8a\x1a\x82\x7d\x2f\x9b\x63\xad\x1c\x58\x2f\xb4\x02\x76\xd1\xda\x9f\x17\x7d\xfa\xb3\x1d\xf9\x2a\x28\x7b\xd1\x13\x00\x4b\x53\x2f\x37\xde\xe8\x8b\x3a\xe9\x74\x42\xbf\xde\x1c\x74\x7b\x6d\xbf\x44\x7a\x60\x68\x1e\x1c\x8c\x96\xab\x8c\xb1\x9b\x3a\x77\x0b\x76\x06\x37\x83\x9b\x4d\x82\x9b\xc1\xcc\x60\x66\x30\x33\x98\x19\xcc\x0c\x66\x06\x33\x83\x99\xc1\xcc\x60\x66\x30\x33\x98\x19\xcc\x0c\x66\x06\x33\x83\x99\x4d\x84\x99\x51\x40\xe4\x94\xf1\x81\x02\x42\x01\xa1\x80\x50\x40\x28\xe0\xd2\x29\xe0\x83\xda\xc9\xdb\x9b\x56\xbc\x6f\x90\xb4\xd5\xdc\x68\x6f\xd4\x2e\xab\xb4\x9b\x81\xad\xe0\x75\x1b\xb5\x33\xb4\x4e\x3f\xf9\xdd\xfd\xc7\x3f\x8a\x0e\x22\x55\xf7\x44\x92\x96\x12\xe4\x8c\x1a\xa1\xe9\x39\x92\x3a\xea\x22\x7d\xe5\xfa\xd7\xaa\x3c\xab\xb4\xc7\x5e\x12\xa9\x8a\xdb\xb9\x3c\xd2\x8a\xb7\x22\xdd\x57\x42\xdf\xfb\xbb\xe4\x2c\xb4\x99\x48\x5f\x1d\xc6\x03\xe3\x81\xf1\xc0\x78\x66\xce\x78\x9a\x55\x4f\x29\xe4\x3c\x67\x2b\x6c\x43\xfd\xa1\xc6\x03\x35\x64\xfd\xa1\xb3\x81\xb9\x13\x2a\xfe\x14\x82\x29\x9a\x1e\xd1\xf4\x68\x64\xd3\xff\x14\x26\xdb\x4c\x2e\xe5\x5c\xf6\x6c\xd3\x1f\x42\x0b\xa1\x85\xd0\x42\x68\x21\xb4\xbd\x11\xda\x86\x7b\xc1\x11\xa5\xa5\x17\x20\xbd\x00\xe9\x05\x48\x2f\xc0\x49\xf4\x02\x6c\x3e\x21\x67\x1c\x7c\xd0\x6c\x1c\xaa\x02\x10\x86\x1a\x05\x42\x11\x7a\x1b\xdf\xe3\x70\x84\xf3\xf9\x36\x86\x0c\x4c\x68\x26\xac\x8a\xe0\x84\x97\xea\x3f\x85\x98\x0e\x96\xbc\xe4\xfe\x9e\x79\x84\x9c\x3a\xaa\xb2\xc9\xe7\x41\x59\x1a\x53\x86\x66\xee\x69\xce\xd0\xf3\xd3\x38\xc9\xfc\xc8\xb0\x8e\xb5\xf9\xa2\x44\xf1\x0a\xbc\x1d\x9e\x24\x05\xb7\x3b\xee\x01\x4a\x9e\xe9\x8c\xf3\x4c\x9b\xed\x29\x75\xb9\xa6\xe7\x33\xbe\x88\x48\x20\x22\x81\x88\x04\x22\x12\x88\x48\x28\x5a\x7c\x41\xdd\x13\x92\x08\xf4\x13\xfa\x09\xfd\x84\x7e\x42\x3f\xa1\x9f\xf3\xa2\x9f\x00\x09\x80\x04\x40\x02\x20\xd1\x3b\x90\x38\x01\xda\x8f\x34\x6f\xb2\x99\x08\x8f\x73\x27\x67\xd5\x81\xbb\xf4\x80\x65\x55\xf2\x8c\x1b\x6f\x6a\x27\xfe\xea\xa8\x55\xe1\x52\x81\xd1\xd8\x5a\xdf\xd5\x42\xa2\x16\xb5\x3c\xa7\x52\x0d\xe3\x22\x37\x6a\x97\x5b\x2f\xe8\x98\x88\x19\xc3\x45\xc8\xa6\xf0\xcb\xfc\xbe\x43\xfc\x35\xce\x06\xe7\xc7\x8b\x02\x5d\xce\x97\x93\x65\x44\x97\x73\xba\x9c\x17\xdc\xcc\x04\x54\x97\x49\xb4\x3a\x7f\xc9\x6d\xbf\xad\xbd\x6d\x13\x39\x3b\xae\xfb\x9e\x9d\x96\xa8\x15\x91\x09\x68\x89\x17\xa2\x45\x6d\x8d\x82\xbe\x15\x3d\x96\xd8\x68\xac\x7a\x1d\x95\xd5\xa0\x98\x46\xfa\xea\xa8\x5a\x53\x54\xb5\x48\x5f\x5e\x50\xfa\x32\x79\x5a\xe4\x69\x91\xa7\x45\x9e\x16\x56\x62\xd9\x5b\x34\xca\xa4\x88\x61\xac\x2e\x72\x3a\xaa\x73\x3a\xa6\x60\x7e\x25\x8e\xeb\xce\x33\x39\x7c\x25\xd7\x39\xdd\xab\xa1\x19\x15\x1e\xd9\x5f\xfa\x46\x4a\x1d\x51\xff\xd6\x41\x59\x0f\xe1\x27\x69\xed\x56\x42\xbc\x0f\xff\x8f\xff\xfe\x24\x6d\xed\xcf\x0b\x84\xe5\xec\x83\x9d\xf2\x0f\x9b\x8c\x89\xde\x14\x8e\xfd\x55\x89\xab\xdf\xe4\x93\x0a\xb6\xd2\x52\x57\xa1\x2e\x19\xeb\x3f\x2b\x71\xef\x48\xd7\x55\x46\x09\xd5\x1a\x8a\x74\x8c\x52\x74\xfb\x43\x9b\x55\x5b\xdf\xe3\x40\xba\x43\x22\xb4\x44\xf5\x7e\x88\xc5\x17\x3e\xa9\x78\x6f\x24\x16\xee\x17\xdb\x20\x96\x4e\x14\xb7\xb4\x0f\x94\xaf\x03\x8e\x0e\x5a\xf4\x73\xcf\x82\x0a\x6f\x66\xbe\x78\x78\xdc\x9b\x1a\xbe\xb8\xa3\xed\x60\xa3\x26\xe1\x8a\x7b\x09\xb0\xa5\x21\xc3\xd1\x63\x0e\x86\xa0\x75\x68\x47\xab\x9a\xde\xd7\xfa\xd8\xbf\x56\x2f\x5a\x4f\xca\xdf\xa8\x46\xbf\x0c\x76\xbe\xdc\xa9\x8d\x6d\x5d\x37\x3f\x26\xfc\xfc\x1c\xfd\x52\x2f\x8f\x4d\x74\x8d\xad\xf4\x77\xb6\xce\xbc\x32\x61\x48\xed\xf4\x8e\xed\xa1\xb7\xef\x0c\xc1\x79\x85\xb6\x7e\x9f\x0d\x06\x12\xf8\x74\x67\xee\xd3\x5d\x0e\x3e\xcf\xa5\x30\xc4\x2f\x97\x49\xb3\x09\x97\x9a\x43\xea\xf6\xab\x92\x65\xe8\xb5\xf6\x68\x99\xdc\x5a\xe9\xe8\x23\x5d\xcf\xbd\x36\x47\xeb\x5f\x68\xa7\x72\x20\x5e\xfd\x3d\xf0\xdc\x7b\x93\xc1\xfc\x6b\xb8\xe0\x45\x9f\x3f\xc5\xcb\xe0\xe1\x8f\xaf\xc7\xc4\xf5\x9b\xcf\x9b\x0f\x9e\x6f\x69\xaf\xfb\xc6\xd3\x83\xef\x89\xcf\x97\x8f\xe1\xdf\x3e\x5f\x8a\xbb\x8c\x34\x75\x80\xb4\x71\x91\x6b\xfd\x3f\x7a\x51\xaf\xa5\xa5\x07\x40\xe7\xc0\x3a\xb6\x15\x39\xfd\xb4\xb9\xe0\x7d\x8f\xc6\xd6\xe4\x88\x6e\x95\xb7\x75\xd4\x4a\x98\x6b\xea\xd4\xf7\x78\x4e\xe9\x30\xe5\xc2\x81\x48\x2e\xdf\x46\xbc\xe1\x85\xb0\x1a\xcc\x17\x58\x0d\x83\x5b\x0d\xdb\xb1\xf5\x6b\xaf\xb7\x1b\xf6\x9d\xfb\x90\xb6\x8e\xb4\x5a\xaa\x73\xd1\xc1\xb3\x55\xe8\x88\x84\x44\x95\x5b\x92\x2a\x37\x22\x8d\x89\x8d\x3d\xf9\x86\x48\xc8\x92\xdb\x9e\x9f\x3e\xb2\x9f\x84\x17\xf3\x42\x34\x0a\x28\xd4\x09\x50\x15\x2d\xbb\x3a\xe7\x61\x51\xb2\xbc\xbb\xb6\xbf\xd9\xeb\xbd\x74\xd2\x89\x77\x32\x29\x8f\x91\x7e\xf8\x55\x2a\x9a\xe6\xc7\x24\x0e\xe7\x4a\x9f\xe8\xea\x50\x2b\x29\x53\xfc\x26\xd1\x81\x84\xed\x06\x3b\x25\x33\xae\xc9\xbc\x86\xf4\xbd\xc2\xe1\xf5\x4b\x2e\xcb\x88\x5c\xb8\xb1\x86\x0a\xe8\x54\xce\xf7\xdf\x94\xbb\xdc\x94\x38\x3d\x82\x4b\xc8\x8b\xa3\xf6\xe0\x8c\x6b\x0f\xd6\x73\xa3\xba\xba\x83\xed\x3b\xc8\x36\x63\x62\x54\x1b\xa4\xda\x20\xd5\x06\xa9\x36\x38\xb7\x6a\x83\xf5\x2b\x6f\x61\xa5\xc1\x9e\x23\x10\xce\x56\x5f\xb0\xfe\xf1\xcb\x6b\x0b\x8e\x59\x06\xa7\x54\x14\xac\x97\x41\x79\x35\xc1\x9e\x65\x40\x0d\x41\x6a\x08\x52\x43\x90\x1a\x82\xd4\x10\xec\xad\x86\x60\x83\xd5\xff\xa8\x7e\x60\x65\x4e\xde\x82\x02\x10\x9b\x3d\xcd\x8c\x6b\x20\xd6\x8b\xbb\xaa\xfe\xe1\x79\xe5\x4e\xd5\xc3\x5e\x46\xf4\xb8\xe2\x61\xcf\xc3\x3a\x68\x9d\xc3\x7a\xf1\x54\xd4\x38\xec\x7b\xd9\x1c\x6b\x65\xc3\x7a\xa1\x15\x50\x8c\xd6\xfe\xbc\xe8\xd3\x9f\x2f\xa0\x61\x05\x45\x36\x7a\x82\x62\x69\x12\xe6\xc6\xbb\x7d\x51\xcf\x9f\x4e\x88\xd8\x9b\x83\x82\xaf\x8d\x98\x48\x19\x0c\x6d\x84\x83\xe5\x72\x95\xb1\x78\x53\xe7\x6e\xcb\xd3\x60\x69\xb0\xb4\xe9\xb0\x34\x38\x1a\x1c\x0d\x8e\x06\x47\x83\xa3\xc1\xd1\xe0\x68\x70\x34\x38\x1a\x1c\x0d\x8e\x06\x47\x83\xa3\xc1\xd1\xe0\x68\x70\xb4\x29\x71\x34\x4a\x93\x9c\x32\x3e\x90\x41\xc8\x20\x64\x10\x32\x08\x19\x5c\x1e\x19\x34\xf5\x67\x6f\x5a\x11\xbf\x41\xb2\x5c\x73\x03\xbc\xd1\x35\x83\x1f\x3d\xff\x29\x99\xd0\x52\x18\x1e\x51\x0e\xed\x36\x6a\x67\x8a\xe0\xde\xdd\x7f\xfc\xef\xfc\x6f\xc9\xe9\x3d\x11\xa0\x25\x42\x9c\x38\x3e\x33\xaf\x42\xea\xf7\x17\xe9\x6b\x16\xbe\x36\x31\x4b\x9f\xf4\xeb\x93\x31\x73\xcd\x52\xd8\xe4\xdd\x89\x80\xf7\xdd\xfd\xc7\x3f\x8a\x0e\xe3\x35\x3a\xfd\x35\x8a\x05\x39\x87\x5e\x87\xe6\x0d\x29\xc0\xd1\xcd\xdf\x2a\x37\x2e\xb2\x1b\xc5\xa5\xe8\xcf\xff\xb9\xd9\x7a\xeb\xb5\x1d\xf8\x7b\xfd\x78\x0f\xfb\xf5\x46\xed\x82\x33\xb5\x85\x49\xd5\xcd\xf7\x1e\xc5\xbd\xb7\xfe\x39\xb9\x91\xbf\xe9\x1b\xa9\x78\x71\xcc\x29\x32\xef\xce\xbb\xe4\x74\x49\x3d\xe1\x75\xcd\x49\x69\x23\x03\x4b\x85\xa5\xc2\x52\x61\xa9\x33\x64\xa9\xcd\x2a\x1c\x15\xf2\xd4\xb3\x15\x9f\xa2\x46\x58\xe3\x81\x1a\xb2\x46\xd8\xd9\x00\xf8\x09\x55\xb9\x0a\x01\x30\x4d\xcd\x68\x6a\x36\xb2\xe9\x7f\x4a\xec\x43\x33\xb9\x94\xc7\x3f\x9c\x6d\xfa\x13\x09\x41\x24\x04\x91\x10\x44\x42\x10\x09\xd1\x5b\x24\x44\xc3\xbd\xe0\x28\x1a\x82\x5e\x9f\xf4\xfa\xa4\xd7\x27\xbd\x3e\x27\xd1\xeb\xb3\xf9\x84\x9c\x71\x90\x4f\xb3\x71\xa8\x0a\xf4\x19\x6a\x14\x08\xf9\xe9\x6d\x7c\x8f\xc3\x7e\xce\xe7\xdb\x18\x32\x00\xa8\x99\xb0\x2a\x82\x80\x5e\xaa\xff\x14\x02\x3c\xf8\xf3\x22\xfb\xf7\x96\x62\xe7\xd4\x71\x95\x1d\x7c\x0f\xea\x52\x17\x09\xd1\xdb\xe3\xfd\x37\xc9\x85\xae\x26\xbd\xc3\x77\xf3\x35\x8e\x32\x3f\x32\xae\x63\x8d\x3e\xae\xd1\x70\x1a\xfc\x0e\xcf\x95\x41\xdf\x9d\x03\x6f\xb2\xbd\x97\x93\xed\xdd\x6c\xc7\xa9\xcb\xf8\x3e\x9f\x69\x46\xbc\x02\xf1\x0a\xc4\x2b\x10\xaf\x40\xbc\x42\xd1\xe2\x0b\x08\x9f\x90\x44\x60\xa3\xb0\x51\xd8\x28\x6c\x14\x36\x0a\x1b\x9d\x17\x1b\x05\x57\x80\x2b\xc0\x15\xe0\x8a\xde\x71\xc5\x09\x48\x7f\xa4\xd9\xcb\xcd\x44\x78\x9c\xc1\x3c\xab\xe6\xfa\xa5\x07\x2c\xab\xb2\xee\x2a\x0a\xc4\x88\xfb\xe6\x16\xb8\xf3\x67\x9d\xce\x58\xcf\x95\xba\x6a\x52\x79\x46\x96\xd4\xa2\xbc\x6e\xa4\x42\x9a\x4e\xe4\xee\x5a\x84\x43\x24\x02\xcb\xdb\xaa\x37\x22\xd8\x5b\x5f\xc2\xf5\x48\xaf\xf7\x4a\x3e\x99\xc5\x6a\xeb\x7b\x5a\x65\x2d\x2a\x8c\x50\x5d\x94\x47\x83\xa3\xec\xd7\x54\xe6\xa9\x7b\x9a\xe8\xd3\x9f\x87\x41\xf6\x82\x8e\x89\xa1\x31\xdf\x84\x3c\x11\x0e\x9a\xc3\xfa\xc5\x83\xed\xf2\x61\x2b\x66\x55\xdf\x8b\x66\x27\x89\xb2\x24\x6b\xa5\x47\x7f\xb4\xc9\x5a\xda\x79\xf3\xab\x74\xe5\x46\xf9\xc6\x0d\x69\x96\xd1\x20\xf0\x2c\x5b\xdb\xd5\x89\xc3\x4f\x6a\xbf\xad\xe7\x0b\xe5\xee\x42\x45\x37\x76\x34\x3c\xc9\xaf\xa1\x14\x77\x5f\x54\xa0\x62\x6d\x31\x9d\x92\x14\xa7\x2e\x69\x6d\x59\x3b\xf7\x3c\x5f\xdc\xbe\xfd\x21\xfc\xad\x2f\x2d\x4d\xf3\x1c\xcf\xdd\x18\xdd\x50\x3b\xe0\x2c\xcf\xdd\x49\xdb\x35\x6b\x97\x76\x70\x1d\x7e\xab\x09\x47\xc4\x1a\xc5\xc3\x73\x62\xfe\x6c\x3c\x47\xba\x9b\x95\xe7\x6f\x6e\xb6\x5f\x37\x37\x7b\xd7\xb6\xbc\xb5\xba\xf9\xcb\xc7\xe0\x3e\x3c\x4b\x6b\x8f\x79\x24\x9c\x2e\x87\x67\x54\xca\xe4\xe4\x75\xbc\xa6\xfa\xdd\xdb\x06\xfa\xdd\x3b\xe3\x05\x1c\xe9\xfd\xbf\xad\xbd\x7f\x13\x92\x3c\xd2\x07\x98\xa1\x82\xad\x15\x99\x49\x28\xd8\x17\xa2\xc3\x9a\x27\x05\xcd\x7a\x7a\x2c\x7d\x72\xaa\x52\x57\x50\xee\x64\x24\x4a\xdd\x44\x8a\x9c\xa0\xbb\xa5\x07\x79\xb4\xba\x1b\x69\xe5\x0b\x4a\x2b\x27\x7f\x8e\xfc\x39\xf2\xe7\xc8\x9f\xc3\xec\x2c\x7b\x8b\x46\x99\xac\x32\x8c\xd1\x46\xae\x4d\x5d\xae\xcd\x34\x8c\xb6\xc4\x61\xde\x79\x86\x8d\xaf\xe4\x3a\xa7\x7f\x9d\x66\x64\x85\x27\x38\x6b\x5a\x4d\x4a\x59\x51\xff\xd6\xc1\x72\x0f\xe1\x27\x69\xed\x56\x42\xbc\x0f\xff\x8f\xff\xfe\x24\x6d\xed\x3e\x0c\x84\xe5\xec\x83\x9d\xf2\x0f\x5b\x90\x89\xaa\x15\x8e\xfd\x55\x89\xab\xe4\x8e\xaf\x42\x4d\x33\xd6\x8e\x56\xe2\xde\x91\xae\xab\x8c\x8a\xaa\xf5\x17\xe9\x18\x95\xe9\xf6\x87\x36\x6b\xba\xbe\xc7\x81\x34\x8b\x44\x68\x89\x62\xfe\x10\x8b\x2f\x7c\x52\xf1\xde\x48\x2c\xdc\x4d\xb6\x41\x2c\x9d\x28\x9e\x6c\x1f\x28\x5f\x07\x82\x1d\x74\xec\xe7\x9e\x05\x15\xde\xcc\x7c\xb1\xfd\xb8\xb7\x3c\x1c\x7d\xa2\x62\xd7\xc8\xad\x61\x13\xd8\x32\x5a\x80\xf4\x74\xef\x9a\xda\xbb\x99\x52\x0b\x1b\x22\x04\x26\x17\x21\xa0\xe3\x8f\x5a\x15\xb3\xbf\xd6\xc7\xfe\xb5\x7a\x05\x7f\x52\xfe\x46\x35\xfa\x65\xb0\xf3\xe5\x4e\x6d\x6c\xeb\xba\xf9\x31\xe1\xe7\xe7\xe8\x97\x7a\xaf\x68\xa2\x92\x6d\xa5\xbf\xb3\x75\x7a\xa0\x89\x95\x7b\x91\x7a\xa6\xaf\x3d\x46\x17\x78\x5f\x71\x0d\x15\x26\xcf\x7d\x36\x96\x4d\xe0\x18\x9f\xb9\x63\x7c\x39\x41\x0d\xb9\x0c\x9c\xf8\xe5\x32\x59\x62\xe1\x22\x74\xa8\x3c\xf0\xaa\x64\x81\x7a\xad\xdd\x82\x26\x35\x5c\x3a\xfa\x48\xd7\x73\xaf\xcd\xd1\xfa\x17\xda\x33\x1f\x88\x57\x7f\x0f\x3c\xf7\xde\x24\xe0\xff\x1a\x2e\x85\xd1\xe7\x4f\xf1\x02\x79\xf8\xe3\xeb\x31\x45\x5b\x34\x9f\x37\x1f\x3c\xdf\xd2\xe8\x62\xe3\xe9\xc1\xf7\xc4\xe7\xcb\xc7\xf0\x6f\x9f\x2f\xc5\x5d\x46\x9a\x3a\xbe\xdf\x70\x06\x6d\x26\x45\x2f\xea\xb5\xb4\xf4\x00\xe8\x14\x6e\xc7\xb6\x22\xcf\xa9\xb6\xaa\xbc\xef\xd1\xd8\x9a\x14\xe7\xad\xf2\xb6\x8e\x5a\x09\x73\x4d\x5d\xb9\x21\x9e\x53\x3a\xca\xbe\x70\x20\x92\xcb\xb7\x11\x6f\x78\x21\x8c\x2b\xf3\x05\xc6\xd5\x98\x8c\xab\x6d\x2e\x54\x7d\x12\xe6\xd5\xbe\x73\x8f\xdc\xd6\x91\xd6\xcb\xb4\xbe\xe8\x1c\x4b\xd2\xfb\x88\x67\x45\xf5\x5b\xa4\xea\x37\x22\x0d\x0b\x45\x20\xf9\x86\x78\xd6\x45\x2b\x32\xfb\x89\x78\x89\x2f\x44\xf7\xd1\xa0\x37\x81\x41\xcb\x6d\x1a\x52\x9e\x84\x2d\xcd\x75\xe2\x6d\xee\x3c\x00\x33\xc2\xe6\xac\x6f\xac\x0f\x50\x24\x28\x12\x14\x09\x8a\x34\x11\x8a\xd4\xcd\x6e\x79\x22\x4f\x2a\xd8\x2e\x27\xe9\x5d\x80\x2a\xe1\x5a\x58\x9e\x6b\x01\xaa\xd4\xe5\xbc\x81\x2a\xe1\x4c\xc2\xd8\x8a\xff\x0c\x55\x1a\x84\x2a\x75\xe5\x33\x39\x91\x2f\xcd\x45\x0f\x84\x32\xa1\x0a\x2e\x52\x15\x1c\x91\xc6\x85\x62\x90\x7c\x03\x65\x5a\xb4\x62\x33\x1f\xca\x54\x84\x93\x7a\x05\x48\xbd\x76\x96\x2a\x38\xfc\x83\xe7\xdf\x39\x4e\xa2\x23\x8d\x82\x20\x95\x1e\x40\xf9\x50\xca\x87\x2e\xaf\x7c\x28\xfd\xda\x66\xdc\xaf\xad\x1e\x40\xd5\xf5\x6a\xab\xf4\x66\x75\x00\xd7\xe8\xd0\x46\x87\x36\x3a\xb4\xd1\xa1\x6d\x6e\x1d\xda\xea\x57\xde\xc2\xee\x6c\x3d\x87\x32\x9c\xad\x27\x5b\xfd\xe3\x97\xf7\x63\x1b\xb3\x0c\x4e\xe9\xc2\x56\x2f\x83\xf2\x0e\x6c\x3d\xcb\x80\xbe\x6b\xf4\x5d\xa3\xef\x1a\x7d\xd7\xe8\xbb\xd6\x5b\xdf\xb5\x06\xab\xff\x51\xcf\xb5\xca\x6a\x9a\x0b\x8a\x64\x6c\xf6\x34\x33\xee\x1b\x57\x2f\xee\xaa\x9e\x71\xe7\x95\x3b\x9d\xe2\x7a\x19\xd1\xe3\x2e\x71\x3d\x0f\xeb\xa0\xbd\xe1\xea\xc5\x53\xd1\x17\xae\xef\x65\x73\xac\xdd\xe0\xea\x85\x56\x80\x31\x5a\xfb\xf3\xa2\x4f\x7f\x36\xc2\x5a\x81\xb2\xf6\xbe\xbd\x7b\xd6\xdf\xd8\x19\xda\xd1\x67\xad\xfc\x54\xc9\x60\xef\x51\xdc\xeb\xaa\xd5\xfa\x3e\x8e\xca\xc9\x36\xa8\x9a\xff\x2e\x39\x59\xe5\x89\xa8\x99\x8f\x1b\x17\x37\x2e\x6e\x5c\xdc\xb8\x33\x74\xe3\x36\x8b\xf9\x2a\x74\xe5\x9e\x2d\x1c\x8f\xa8\xc9\xc6\x03\x35\x64\xd4\xe4\xd9\x7c\xef\x27\xc4\x29\x16\xfa\x9e\xe9\xe0\x42\x07\x97\x91\x4d\xff\x53\xb0\x4b\x33\xb9\x94\xa3\x97\xb3\x4d\x7f\x20\x0c\x10\x06\x08\x03\x84\x01\xc2\xf4\x06\x61\x1a\xee\x05\x47\x20\x86\xc6\x66\x34\x36\xa3\xb1\x19\x8d\xcd\x26\xd1\xd8\xac\xf9\x84\x9c\x31\x31\x6d\x36\x0e\x55\xd4\x74\xa8\x51\x80\x9f\xf6\x36\xbe\xc7\x0c\xf5\x7c\xbe\x8d\x21\x69\x6a\x33\x61\x55\x10\xd5\x97\xea\x3f\x85\xc8\x8e\x64\x55\x9a\x15\xb6\x69\x56\x78\x50\x97\xce\x90\x8d\x55\xca\x79\x87\x6f\x5a\x58\x9b\xbc\xd9\x18\x76\x17\xa5\x6e\xbe\x1c\x70\x93\x58\xb6\x9c\xc4\xb2\x66\x3b\x4c\x5d\x72\xd9\xf9\x4c\x31\xe2\x13\x88\x4f\x20\x3e\x81\xf8\x04\xe2\x13\x8a\x16\x5f\xc0\xf7\x84\x24\x02\x0b\x85\x85\xc2\x42\x61\xa1\xb0\x50\x58\xe8\xbc\x58\x28\x78\x02\x3c\x01\x9e\x00\x4f\xf4\x8e\x27\x4e\x40\xf8\x23\x4d\xfd\x6a\x26\xc2\xe3\xf4\xaf\x59\x95\x27\x2f\x3d\x60\xf1\x95\xfc\xb2\xce\x7c\xea\xf8\x9d\xa3\x8e\x5f\x77\xe4\xa8\x45\x15\xbf\xa9\x64\xf6\x5f\xe4\x46\xed\x72\xeb\x05\x1d\x63\x32\x63\xc1\x08\x79\x12\x11\x33\x07\x75\xcf\xc4\x46\x5f\xc7\x3d\xf7\x88\xcd\x56\x09\xf2\x91\x66\x90\x8f\x44\x15\x77\xaa\xb8\x17\xdc\xcc\x74\xd4\x9a\xa9\xd5\x70\x6f\x7b\xf7\x6f\x6b\xef\xde\x44\xdc\x8e\xf2\xf6\x67\xa8\x4f\x6a\x95\x65\x02\xfa\xe4\x85\x68\x51\xa8\x23\xea\x66\x7c\xa6\x7a\x1d\xa7\x29\x69\x05\x35\x3a\xa8\xcc\x81\x36\x36\x0b\x6d\x8c\x5c\xe8\x05\xe5\x42\x93\xf4\x45\xd2\x17\x49\x5f\x24\x7d\x61\x48\x96\xbd\x45\x23\x35\x24\x31\xc5\xc6\x65\x8a\x45\xa6\xc9\x04\x8c\xb1\xc4\xe1\xdd\x79\x5a\x88\xaf\xe4\x3a\xa7\x7d\x9d\x62\x54\x85\x87\xf7\x9e\x0b\x92\x52\x4e\xd4\xbf\x75\x84\xd7\x43\xf8\x49\x5a\xbb\x95\x10\xef\xc3\xff\xe3\xbf\x3f\x49\x5b\x3b\x00\x03\x61\x39\xfb\x60\xa7\xfc\xc3\x96\x13\xf5\x7c\x76\xec\xaf\x4a\x5c\x25\x3d\xc5\xae\x42\xcd\x32\xd6\x86\x56\xe2\xde\x91\xae\x1b\x35\xeb\xd6\xfa\x8a\x74\x8c\x8a\x74\xfb\x43\x9b\x35\x5c\xdf\xe3\x40\x9a\x44\x22\xb4\x44\x11\x7f\x88\xc5\x17\x3e\xa9\x78\x6f\x24\x16\xee\x1e\xdb\x20\x96\x4e\x14\x04\xa5\x1b\x68\x5b\xd2\x4d\xe9\xd4\xcf\x3d\x0b\x2a\xbc\x99\xf9\xb2\xe6\x85\x6c\x71\x33\xdc\x23\x72\x5d\x0c\x47\xbf\x41\xb4\xa0\xbf\x1a\xdc\x44\xde\x93\x9a\x7b\xb1\xe3\xe6\xe0\x5f\x8a\x61\xaf\xfe\x3f\xf3\x4d\x05\x8c\xec\xb9\x22\xf5\x74\xa1\xb6\x8e\x1a\x69\xb4\xcb\xe7\xd7\xad\x6b\x7d\xec\x5f\xab\x97\xb0\x27\xe5\x6f\x54\xa3\x5f\x06\x3b\x5f\xee\xd4\xc6\xb6\xae\x9b\x1f\x13\x7e\x7e\x8e\x7e\xa9\x17\xcb\x26\x5a\xc8\x56\xfa\x3b\x5b\x27\x75\x99\x08\xa7\x17\x68\x24\xfa\xca\x63\xf1\xf2\xf6\x85\xe2\x2b\x7c\xc0\xf7\xd9\x98\x23\x81\xef\x77\xe6\xbe\xdf\xe5\x90\xf8\x5c\xa6\x44\xfc\x72\x99\x6c\x9e\x70\xd9\x39\x64\x88\xbf\x2a\x59\x92\x5e\x6b\xcf\x97\x49\xe1\x95\x8e\x3e\xd2\xf5\xdc\x6b\x73\xb4\xfe\x85\x76\x3e\x07\xe2\xd5\xdf\x03\xcf\xbd\x37\x89\xd2\xbf\x86\x8b\x5f\xf4\xf9\x53\xbc\x24\x1e\xfe\xf8\x7a\x4c\x21\x02\xcd\xe7\xcd\x07\xcf\xb7\xb4\x77\x7e\xe3\xe9\xc1\xf7\xc4\xe7\xcb\xc7\xf0\x6f\x9f\x2f\xc5\x5d\x46\x9a\x3a\x0e\xdb\xb8\xd2\xb5\x65\x10\xbd\xa8\xd7\xd2\xd2\x03\xa0\x53\x6d\x1d\xdb\x8a\x9c\x83\xda\x90\xf0\xbe\x47\x63\x6b\x52\x51\xb7\xca\xdb\x3a\x6a\x25\xcc\x35\x75\x86\x7d\x3c\xa7\x74\x34\x74\xe1\x40\x24\x97\x6f\x23\xde\xf0\x42\xd8\x13\xe6\x0b\xec\x89\xec\x43\x0d\x8a\xff\x73\x01\xc5\x13\xb0\x28\xf6\x9d\xbb\x9c\xb6\x8e\xb4\x5e\xa2\xe3\x45\x67\x98\xbb\x96\x47\xc0\x25\x6a\xde\x02\xd5\xbc\x11\x69\x53\x6c\xfa\xc9\x37\x04\x5c\x36\xba\xfb\x39\xaa\x2c\xfb\x49\xb8\x40\x2f\x44\x5d\xc0\xa2\x4e\xc7\xba\x71\x63\xf6\x13\x45\x2b\xea\xcf\xff\xb9\xd9\x7a\xeb\xb5\x1d\xf8\x7b\x3d\x4a\x0f\xfb\xf5\x46\xed\x32\x7d\xc7\x3a\x27\x6f\x51\x5e\xbf\xbb\xb6\xbf\xd9\xeb\xbd\x74\xd2\x39\x82\x32\xa9\xe4\x71\xef\xad\x7f\x4e\x6e\xeb\x6f\xfa\xb6\x56\xa9\x00\x9e\x1f\x93\xd0\x9f\x2b\x7d\xbe\xab\x43\x75\xa7\x4c\xb9\x9e\x44\x81\x12\xb6\x1b\xec\x94\xcc\x78\x3c\xf3\xea\xd5\xf7\x23\x17\x5a\xc2\xcb\xd6\x05\xf7\xf3\x4b\x2e\x43\x8a\x84\xbe\xb1\x96\x84\xd4\xf9\xa8\xef\xbf\x29\x77\xc9\x09\x7d\x7a\x0c\xcf\x94\xd5\x97\x7f\x55\xce\x4c\x76\x28\xa2\x38\xe3\x22\x8a\xf5\x94\xaa\xae\x80\x62\xfb\x6e\x9e\xcd\x08\x1c\x65\x13\x29\x9b\x48\xd9\x44\xca\x26\xce\xad\x6c\x62\xfd\xca\x5b\x58\x32\xb1\xe7\x78\x87\xb3\x15\x4a\xac\x7f\xfc\xf2\x22\x89\x63\x96\xc1\x29\xa5\x11\xeb\x65\x50\x5e\x16\xb1\x67\x19\x50\x0c\x91\x62\x88\x14\x43\xa4\x18\x22\xc5\x10\x7b\x2b\x86\xd8\x60\xf5\x3f\x2a\x84\x58\x99\x1d\xd8\xc1\xb2\x1f\x3d\xb5\x81\x42\xa1\x3a\xbb\xdf\x7d\x11\x81\xe5\x6d\xd5\x1b\x11\xec\xad\x2f\xe1\xc8\x6b\x7b\x45\xc9\x27\x93\x9a\xb5\xf5\x3d\x2d\xe5\xd3\x43\x3c\xb5\x2b\x90\x38\xcf\x3e\x9e\x66\xc6\x55\x2c\xeb\xc5\x5d\x55\xc1\xf2\xbc\x72\xa7\x6e\x65\x2f\x23\x7a\x5c\xb3\xb2\xe7\x61\x1d\xb4\x52\x65\xbd\x78\x2a\xaa\x54\xf6\xbd\x5f\x8c\xb5\x36\x65\xbd\xd0\x0a\x10\x4e\x6b\x47\x66\xf4\xe9\xcf\x1e\xe0\x61\x41\x2d\x94\x9e\x18\x62\x1a\x1c\xba\xb1\xfa\x93\xea\xec\xd4\x0b\x40\x7c\x73\x30\x7c\xb4\x71\x17\x29\xc9\xa1\xed\x74\xb0\xe8\xae\x32\x9e\x80\xd4\xb9\x3b\xc4\x8f\xa0\x47\xd0\xe3\x94\xd0\x23\xd8\x11\xec\x08\x76\x04\x3b\x82\x1d\xc1\x8e\x60\x47\xb0\x23\xd8\x11\xec\x08\x76\x04\x3b\x82\x1d\xc1\x8e\x60\x47\xb0\xe3\xb4\xb0\x63\xae\x78\x4c\xb5\xe7\x61\x4a\xe5\x63\xe0\xa9\xf0\x54\x78\x2a\x3c\x75\xd4\x23\x0a\x4f\xcd\x8a\x07\x9e\x3a\x31\x9e\x4a\xd6\x65\x05\xf6\x2c\xc9\xb5\xfc\xe0\xf9\x77\x8e\x93\x30\xd1\x00\x00\x0a\x00\x9d\x12\x00\x25\xf7\x12\x08\x0a\x04\x05\x82\x02\x41\x81\xa0\x40\x50\x20\x28\x10\x14\x08\x0a\x04\x05\x82\x02\x41\x81\xa0\x40\x50\x20\xe8\xf4\x20\x28\xc8\x0c\x64\x06\x32\x9b\xc6\x88\x82\xcc\xb2\xe2\x01\x99\x4d\x0f\x99\xe5\xdb\xae\x8f\x83\x98\x65\x2b\xb8\x0e\xc3\xcb\xb2\xf7\x40\x65\x52\xe8\x18\x74\xec\xf0\xe5\x58\x3a\xce\xc1\xc6\x60\x63\xb0\x31\xd8\x18\x6c\x0c\x36\x06\x1b\x83\x8d\xc1\xc6\x60\x63\xb0\x31\xd8\x18\x6c\x0c\x36\x06\x1b\x83\x8d\x35\x7d\x1a\xd8\x18\x6c\x0c\x36\x06\x1b\x83\x8d\xc1\xc6\xca\xd8\xd8\x78\xca\x70\xf6\xc0\xc7\xce\x59\x84\xb3\xba\xc1\x32\x64\x0d\xb2\x36\x72\xb2\x06\x55\x83\xaa\x41\xd5\xa0\x6a\x50\x35\xa8\x1a\x54\x0d\xaa\x06\x55\x83\xaa\x41\xd5\xa0\x6a\x50\x35\xa8\x1a\x54\x0d\xaa\x36\x25\xaa\x96\x2b\xbb\x59\xe5\x77\x98\x52\xd1\x4d\x60\x21\xb0\x10\x58\x38\x8d\x11\x05\x16\x66\xc5\x03\x2c\x1c\x2f\x2c\xf4\x1f\xa4\xb5\x8a\x89\x85\x7e\x04\x4d\x4e\x6c\xef\xa6\x15\x17\xec\x9b\x6a\x35\x61\x8e\x1b\xb5\x13\xb6\xfb\xe8\xf9\x4f\xc9\x1c\x97\xc2\x70\x8a\x72\xaa\xb7\x51\xbb\x3f\x1e\xa4\x75\x97\x96\xc4\xdd\xfd\xc7\xff\xce\x1f\x36\x14\xce\x9b\x2c\x65\x4b\x84\x38\x71\xc6\xe6\xe7\x67\x47\xea\xd0\x8b\xf4\xe5\x9b\xbe\x5f\xdf\x6e\xa7\xfd\x8a\x65\x4c\x64\xb3\x82\x9e\xf8\x7e\xfd\xf3\xf6\xee\xfe\xe3\x1f\x45\x07\xf3\x96\x9d\xfe\x96\xc5\x82\xd4\xa9\xbd\x73\x7b\xd9\xfe\xf7\xdb\x6d\x07\xef\x9b\xe5\xec\x83\x9d\xf2\x7d\xcf\x51\x0f\xb6\xbb\xb6\xdd\x4d\x26\x41\xdc\xb8\x24\xba\x0d\x80\x31\xe7\x14\x96\xe7\x38\xca\x8a\xb7\xa3\x77\xe6\x3e\xfe\xf0\x1c\xf5\x37\x73\x1f\x15\x6f\x8e\x39\x43\xc1\xcb\xf3\x2e\x39\x67\xf5\xf9\x4a\x80\xb9\xc8\x8f\xbb\x51\x49\x1e\xbc\xf5\x73\x7e\xca\xc6\x3a\x49\xd1\x77\xbd\x4c\xe7\x9f\xf5\x33\xff\xae\xa5\x18\x34\x9c\xcc\xd5\xb3\x18\x06\x0b\x83\x85\xc1\xc2\x60\xe7\xc6\x60\x2b\x4c\xc9\x3a\x0e\x5b\xed\x96\xa8\x36\x29\x4f\x5a\x7b\xff\x15\x0a\x2e\xf2\x3e\xbf\xd1\xf5\x52\xac\x70\x46\x99\x79\x90\x79\xb6\x74\xbc\xd3\x83\x12\xdb\x50\x5a\xc1\x4e\xad\x57\xe2\xce\x15\xb6\x6b\x56\x16\xcf\x17\x7b\x37\x59\x9c\xd6\x62\xed\x3f\xff\xb1\x77\xc5\xda\xf6\xc3\xdd\xf0\x9b\x4a\x66\x7c\xb8\x7c\x6a\x56\x10\xbd\xf2\xf1\xdc\x88\x04\x2c\x1e\xf7\xbe\x7e\xcb\xb6\xbe\x67\xa9\x40\x3b\xf5\x23\x7f\x48\x34\xcb\x56\xe2\x9f\xfa\x8a\x7a\xb4\xf4\xdc\xf9\x51\x5c\x8b\x3b\xc7\xf9\x51\xbb\xec\xd7\xe1\x2a\xbd\x77\xc3\x81\xdf\xa8\x20\x99\x92\xd1\xe9\xd4\xba\xc5\x40\x99\x67\x19\x66\x98\xce\x06\xce\x9b\x89\xa2\x1c\x9e\x9f\x4d\x22\xff\x48\xbb\xca\x6c\x57\x04\xc6\x83\x25\x1e\xd4\xa3\x89\xf0\x4b\x20\xcb\x41\x95\x88\x56\x2f\x3d\x75\xf6\xca\x6c\x0e\x0f\x4a\xb8\x9e\x7b\xed\xaa\x8d\xd4\x13\x34\x72\x76\xad\xc4\x3f\x92\x0d\xdb\x00\xd7\xe4\xd5\x88\xd4\x46\xfb\xe9\x49\xad\x6d\xb9\x53\xce\xf3\x21\xf4\xee\xb0\xe5\xda\xce\x9b\xc8\x99\xa5\x85\x2e\x36\xbe\xb4\xf4\x5b\x63\x7b\xeb\x44\x21\x38\x6c\xda\x3a\xae\x31\x9e\xa5\xfb\x20\xbc\xc9\xf4\x70\xc9\xf0\xc8\xf8\x81\xa2\x8b\x3c\x9a\x35\x30\x3e\xc5\xca\xdc\xe7\x93\x92\x6e\xe1\x3d\xb6\x18\x66\x7d\xcf\xf7\xfa\x96\x8b\x1c\x84\x35\x2e\xc2\xb1\x4c\xff\x53\x62\x26\x9a\xc9\xa5\x3c\x6e\xe2\x6c\xd3\x9f\x08\x0a\x22\x28\x88\xa0\x20\x82\x82\x08\x8a\xde\x22\x28\x1a\xee\x05\x47\x51\x14\xe7\xdb\x16\x7f\x4e\xe5\x62\x6d\x1d\x25\x03\x95\x2c\x41\xf7\xbe\xb7\x95\x1b\xad\x1d\x99\xf0\x8a\x4c\xbc\x7e\x3c\xe9\x0e\xc9\x5c\xe1\xb4\xbb\x5d\xfd\xd7\x4a\x7c\x32\xeb\x99\x51\x5d\xb6\xca\x0d\x5f\x96\xc3\x9e\xaa\x84\xe7\x6f\xbf\x48\x37\xce\x1f\xf0\xf7\xea\xe6\x51\x3a\xb1\xad\xfc\xf9\xd2\x7c\xfd\xf9\x52\x3c\xda\xae\x74\xec\xff\x8b\x37\x92\x07\x25\xe4\x5a\xf3\x67\xef\xc6\xb0\xb9\xf5\xc1\x0c\x33\xa7\xbf\x0a\x0e\x07\x19\xfb\x74\x25\xde\xdb\x7a\x71\x4c\xdd\xba\xe7\x1f\x3f\xdb\x21\xda\x60\x67\xcc\x63\x6d\xa3\x78\xbb\x2f\x6d\x06\xd4\x3c\xc1\xcf\xf1\xb3\x97\xaa\x3c\x45\xa4\xaf\x5b\xc3\x4c\x3f\x7a\xf8\xc2\x7e\xf1\xbe\x8b\x8d\xf4\x1f\xe4\x26\xe3\xad\x4c\x8c\x1a\xe5\x3f\x7a\xfe\x53\x38\x26\x85\xf2\xfa\x3d\xf7\x44\xe5\xe2\xd2\x4a\x6f\xac\xb1\x9a\xac\xa1\xf0\xfd\x58\x2b\xcb\x5e\x1f\x4c\x61\xad\x2b\x68\xe7\x44\x32\xc6\x81\xe6\x7a\xfa\xdb\x58\x1b\x58\xa5\x06\x33\xde\x47\x12\xdc\x9f\xe4\xc2\x64\x2f\xb6\x12\x77\x96\xa5\xb6\x3b\xbd\x37\xa5\x2d\xbb\x2b\xf3\x0c\x57\xe2\x3a\x9a\x80\xd9\x09\x1a\xfc\x24\xae\xfe\x26\xad\xaf\x1b\xdf\xdb\xbb\xeb\xf0\x57\x3a\xaf\x44\xff\x28\x27\x38\xa3\x42\x46\xfa\x71\xf6\x24\xf1\x13\x3c\x24\x67\xfa\x49\x5c\x7d\xf0\x7c\x95\x3a\xad\xb0\x64\x60\xc9\x75\xf8\xf4\x91\x7c\x4c\xda\x91\x3e\x5f\x60\x4c\xcf\xa3\x13\x3e\x26\xe7\x68\x33\x21\xb7\xf9\xe9\x3e\x8c\xc6\x39\xe3\xb8\xa0\x66\xe3\x50\x15\x1b\x34\xd4\x28\x10\x25\xd4\xdb\xf8\x1e\x47\x0a\x9d\xcf\xb7\x31\x64\xcc\x50\x33\x61\x55\xc4\x0d\xbd\x54\xff\x29\x44\x77\x50\xe7\x13\x31\xdd\xa7\x9d\xdc\xed\x9b\xf2\xb9\xa9\xc2\xe6\xd4\xd1\x25\x39\xd4\x66\x63\x3e\x28\x4d\x5d\xa4\x53\x97\x72\xec\xe2\x0c\xeb\x4a\x02\x9c\x4f\xb1\xae\xca\xae\xee\xbc\x02\x84\xf1\x9d\xf9\x91\xbd\x1d\x2b\xf9\x71\xf1\x87\x93\x48\x78\x78\xaa\x22\x0e\xde\x09\xfd\x26\x65\x7c\x39\x29\xe3\xcd\xb6\x9f\xba\xb4\xf1\xf3\xd9\x69\x04\x2f\x10\xbc\x40\xf0\x02\xc1\x0b\x04\x2f\x14\x2d\xbe\x50\xf1\x09\x49\x04\x50\x0a\x28\x05\x94\x02\x4a\x01\xa5\x80\xd2\x79\x81\x52\xd8\x05\xec\x02\x76\x01\xbb\xe8\x9d\x5d\x9c\xc0\xf7\x47\x9a\xfd\xdc\x4c\x84\xc7\x19\xd0\x2f\xf5\xb8\x8d\x8a\xfa\x94\x1e\xb0\xac\x02\xbd\x2b\x4d\x3a\xbe\xdd\xae\x8e\xdd\xf8\x0b\xc8\x64\xac\x87\x4b\x5d\x75\xbd\x1c\x0a\x28\xb5\x28\xd7\x3b\x95\x5a\x37\x17\xb9\x41\xbc\xdc\x7a\x41\xc7\xf4\xcc\x18\x34\x42\x9e\x06\xca\xcc\x51\xbd\xa1\xb2\x76\x89\xa2\x15\xb5\x93\xfa\x5a\x40\x3a\xc9\x1c\x25\x7b\x29\x3d\xea\xa3\xcd\x5e\xd2\x0e\x8c\x5f\xa5\x2b\x37\xca\x37\xae\x38\x5d\x09\x4c\x06\x81\x67\xd9\xda\xb6\x4c\x9c\x5e\x52\xfb\x2e\x3d\x5f\x28\x77\x17\x2a\x7b\xb1\xb1\xfd\x24\xbf\x86\x52\xdc\x7d\x51\x81\x8a\x35\xa6\x74\x8e\x4e\x9c\xcb\xa3\x35\x46\xed\xe0\xf2\x7c\x71\xfb\xf6\x87\xf0\xb7\xbe\xb4\x34\xd1\x72\x3c\x77\x63\xf4\x23\xed\x84\xb2\x3c\x77\x27\x6d\xd7\xac\x56\xda\xc9\x73\xf8\xad\xf6\xf2\x47\xbc\x4d\x3c\x3c\x27\x26\xc0\xc6\x73\xa4\xbb\x59\x79\xfe\xe6\x66\xfb\x75\x73\xb3\x77\x6d\xcb\x5b\xab\x9b\xbf\x7c\x0c\xee\xc3\xb3\xb4\xf6\x1a\x47\xc2\xe9\x72\x78\x46\xa5\x50\x4d\x56\xcf\x69\xaa\xe3\xbc\x6d\xa0\xe3\xbc\x33\x1e\xb0\x91\xdd\xf7\xdb\xda\xfb\x36\x31\xb9\x23\xbb\xf1\xd9\x2a\x95\x5a\x51\x99\x9e\x52\x79\x21\x5e\x5c\xef\xa3\xa0\xe9\x4d\x8f\x65\x3f\x4e\xd4\xdb\xca\x4b\x7d\x50\xe0\x03\x35\x6d\x16\x6a\x1a\x29\xd5\x0b\x4a\xa9\x26\x77\x8c\xdc\x31\x72\xc7\xc8\x1d\xc3\xc2\x2c\x7b\x8b\x46\x99\xa8\x31\x8c\xbd\x46\x9e\x49\xf2\xcb\xca\x3c\x93\x09\xda\x6d\x89\x83\xbc\xf3\xec\x12\x5f\xc9\x75\x4e\x25\x3b\xc9\xe2\x0a\x8f\x3f\xdd\xde\x62\xf9\xc1\xdf\x72\xd2\x9b\xbb\x51\x53\x74\xb7\xbc\x84\xe1\xa5\xdb\x70\xd4\xdd\x07\x7d\x38\xce\xc1\x26\x75\x2c\x40\xab\x0a\xd3\xd7\xfa\xd8\xbf\x56\x2f\x69\x4f\xca\xdf\xa8\x46\xbf\x0c\x76\xbe\xdc\xa9\x8d\x6d\x5d\x37\x3f\x26\xfc\xfc\x1c\xfd\x52\x2f\x9e\x4d\x36\x87\xad\xf4\x77\xb6\x4e\xd5\x31\x71\x2b\x2f\xd9\x28\xf4\xa5\x47\xe6\x99\xeb\x8b\xa8\x56\x68\x62\xf7\xd9\x88\x12\x81\xbf\x6e\xe6\xfe\xba\xe5\x60\xd5\x5c\x1c\x7c\xfc\x72\x99\x5c\x8d\x70\xf9\x39\xe4\xff\xbe\x2a\x59\x9a\x5e\x6b\x6f\x85\x49\xd0\x94\x8e\x3e\xd2\xf5\xdc\x6b\x73\xb4\xfe\x85\x76\x18\x06\xe2\xd5\xdf\x03\xcf\xbd\x37\x69\xb0\xbf\x86\x8b\x60\xf4\xf9\x53\xbc\x34\x1e\xfe\xf8\x7a\x4c\xbc\xb7\xf9\xbc\xf9\xe0\xf9\x96\xf6\xa8\x6e\x3c\x3d\xf8\x9e\xf8\x7c\xf9\x18\xfe\xed\xf3\xa5\xb8\xcb\x48\x53\x47\xd9\x1a\xf7\xe7\x3e\x38\xa4\xfc\x5d\x4b\x4b\x0f\x80\x4e\xa4\x74\x6c\x2b\x72\xe8\x28\x67\x1d\x08\xef\x7b\x34\xb6\x26\xd1\x70\xab\xbc\xad\xa3\x56\xc2\x5c\x53\xe7\x4f\xc7\x73\x4a\xc7\xba\x16\x0e\x44\x72\xf9\x36\xe2\x0d\x2f\x34\xdf\xc8\x44\xec\x8c\xa9\xda\x19\xdb\xae\xba\xf9\x0f\x66\x69\xec\x3b\x77\x10\x6c\x1d\x69\xbd\x48\xf5\x8b\x4e\xb1\x10\xe5\x8f\x70\x3a\xf4\xbe\x45\xe9\x7d\x23\x52\xaf\xd0\x02\x92\x6f\x08\xa7\x5b\xa0\xf6\xb2\x9f\xa2\x97\xf4\x42\xb4\x0e\x4a\x1b\xbc\xfb\x54\xab\x58\xb4\xa2\xb6\x53\x84\xa3\x51\xb2\x89\x92\x4d\x94\x6c\xa2\x64\x13\x25\x9b\x06\x2f\xd9\x84\x89\xd9\x78\xa0\xe8\x37\x35\xa6\xca\x5a\x04\x47\x2f\x28\x38\x9a\x32\x6a\x94\x51\xa3\x8c\x1a\x65\xd4\x28\xa3\x46\x19\x35\xca\xa8\x91\x33\x44\xce\x10\x39\x43\xe4\x0c\xe5\x67\x24\xfd\xa6\xa8\xd9\x48\xcd\x46\x6a\x36\x4e\xbc\x66\x63\x21\xac\x83\xec\x93\x07\xd8\x3e\x0f\x70\x2c\xfd\xa6\xc6\x92\x0a\xd8\xb8\xd1\x54\x05\xf4\xae\xef\x30\xd5\x06\x74\xd3\x5a\x8a\xd6\x52\xe6\x2b\x5a\x4b\x11\xa7\x40\x9c\x02\x71\x0a\xc4\x29\x10\xa7\x00\x00\x87\x89\xd6\x4b\x04\x26\x0a\x13\x85\x89\xc2\x44\x61\xa2\x0b\x66\xa2\x60\x0a\x30\x05\x98\x02\x4c\x41\x6b\x29\x5a\x4b\xd1\x5a\x2a\xf9\xa6\x4d\xae\x25\x3d\xa5\x46\xd1\x53\xaa\x6d\x79\x08\x9a\x49\x75\xdc\x4c\xaa\x02\x86\x35\xe9\x22\x35\xcf\x7a\x17\x14\xba\x58\x4e\x16\x12\x85\x2e\x28\x74\x51\x70\x33\xa3\x56\x62\x26\x57\xe1\x62\xdc\x95\xc7\x5f\x72\xc7\xb3\xd5\x11\x87\x6f\x11\x75\xbe\x32\x1c\x03\x36\x85\x6a\x55\x81\x83\xba\x1b\xa2\x4c\xc6\x68\x5d\xe9\x41\x1e\xad\xd6\x45\xa6\xf3\x82\x32\x9d\x49\xe9\x22\xa5\x8b\x94\x2e\x52\xba\x30\x18\xcb\xde\xa2\x51\xe6\x4f\xd0\x06\x6a\x9c\x96\xd9\x18\xda\x40\x8d\x25\xe9\xa3\xba\xff\x53\x85\x71\x55\xdf\xf8\xe9\x92\x95\x06\xbf\xc9\x04\x5b\x3d\x9d\x0f\xad\x95\xf4\x78\x2a\x82\x68\x34\x77\xa2\xb9\x53\xe9\x31\x3d\x37\x77\xaa\xd8\x05\x1a\x74\x75\x9a\x3e\xe1\xa4\x9d\x13\x7e\xb7\xe5\xd1\x4e\xda\x39\x75\x39\x6f\x68\xe7\x84\xbb\x02\x23\xa2\x48\x90\x73\xed\xe3\xd4\xd6\x8c\x38\x7b\x03\xa7\x4a\x23\xbf\x41\xe7\xa6\xe9\x2b\x78\x84\xb0\xa1\xd4\x2d\x43\xa9\x1b\x91\xee\xc4\x16\x9f\x7c\x43\x08\x5b\xea\xdc\xf3\xd5\x49\x86\xee\xce\xd4\x6f\x3c\x58\xb8\x5e\x04\x5b\x69\xc5\xd1\x60\xfa\xf3\x7f\x6e\x7c\xcf\x51\x0f\xa6\x2d\xd4\x30\xdd\x9a\x9a\xf5\xa8\x6c\xd0\xad\xe9\xb7\xf8\xa1\xd6\x83\xf4\xab\x9c\x48\xfc\x18\xf5\x90\xa8\x87\x44\x3d\x24\xea\x21\x51\x0f\x29\xfd\x3d\x7d\x9b\x30\x37\x29\x5b\x55\x2a\x11\xa2\x99\x17\x14\xcd\x4c\x8d\x32\x6a\x94\x51\xa3\x8c\x1a\x65\xd4\x28\xa3\x46\x19\x35\xca\x48\xf2\x21\xc9\x87\x24\x1f\x92\x7c\xf2\x33\x92\xbe\x4d\x14\x44\xa4\x20\x22\x05\x11\x27\x5e\x10\xb1\x10\xdb\x41\xf9\x49\xdc\x6b\x9f\xb8\x37\x68\xdf\xa6\x62\xf4\x3b\xe2\xbe\x4d\xcd\xf0\x77\x49\xdf\xa6\xce\x90\x37\x1d\x9c\xe8\xe0\x64\xbe\xa2\x83\x13\x11\x0b\x44\x2c\x10\xb1\x40\xc4\x02\x11\x0b\xa0\x70\xe8\x68\xbd\x44\xa0\xa3\xd0\x51\xe8\x28\x74\x14\x3a\xba\x60\x3a\x0a\xb0\x00\x58\x00\x2c\x00\x16\x74\x70\xa2\x83\x13\x1d\x9c\x92\x6f\x1a\x27\x62\xa6\xfc\xf7\x74\x70\x1a\xae\x83\xd3\xcb\xf1\x51\x8b\x32\x73\x91\xfe\x68\x72\xda\xdd\xb5\x08\x6f\x57\x04\x96\xb7\x55\x6f\x44\xb0\xb7\xbe\x84\x8b\x91\x5e\xec\x95\x7c\x32\x2b\xd5\xd6\xf7\xb4\xbe\x9a\xbd\xc7\x26\x95\xe8\x34\x2d\xca\x7e\x4d\x39\xba\xba\xa7\x89\x3e\x9d\xa5\x75\x55\x33\x1e\x58\xda\xba\x6a\xe0\x24\xd8\xde\x2b\x80\xa4\x9f\xaa\xd9\x1a\x49\x4a\xd6\x0c\x52\xb2\xa8\x00\x42\x05\x90\x82\x9b\x19\xb5\x1e\x37\x8d\x0a\x20\xad\x6e\x78\xd0\x26\x56\x2d\xee\x78\xb6\x6a\xf2\x40\x4d\xac\x5a\xab\xc9\x17\xa2\xf3\xa2\x25\xe7\xee\x6d\xf5\xc2\x7a\x25\x54\x29\x29\x7c\x1a\xd4\xb2\x29\xaa\x65\xe4\x85\x2f\x28\x2f\x9c\x04\x38\x12\xe0\x48\x80\x23\x01\x0e\x8b\xb2\xec\x2d\x1a\x65\xb6\x09\x5d\xae\xc6\x69\xba\x0d\xd6\xe5\x6a\x84\x29\x32\x05\x5d\xae\x9a\x99\x59\x25\x5d\xae\xea\x8d\x2c\xd6\x1c\x5c\x2c\x63\xee\x77\x35\x08\x88\x4c\xf7\xbb\x2a\xbd\x81\x29\xf5\xbb\x82\xac\x4e\x8e\xac\xd2\xe8\xab\xd5\x46\x58\xd6\xe8\x6b\xa6\x3c\x98\x96\x5f\x38\x21\x97\xc7\x86\x69\xf9\xd5\xe5\xbc\xa1\xe5\x17\xbe\x1b\xec\xa8\x22\x41\xce\xaa\xe5\x57\x07\x96\xd4\x79\x5a\x7e\x35\xf5\x78\x94\xb5\xfc\x9a\xa9\xaa\x47\xe8\x1f\xea\xdd\x32\xd4\xbb\x11\x69\x51\x6c\xf6\xc9\x37\x84\xfe\xa5\xce\x3d\x5f\xed\x64\x90\xe6\x5f\x63\x88\xa3\x1b\xae\xeb\x57\x9b\xf0\xb9\xb2\x76\x5f\x44\xd0\x51\x35\x8b\xaa\x59\x54\xcd\xa2\x6a\x16\x55\xb3\x06\xaf\x9a\x85\x65\xd9\x78\xa0\xe8\xf3\x35\xa6\xe2\x66\xc4\x73\x2f\x28\x9e\x9b\x4a\x76\x54\xb2\xa3\x92\x1d\x95\xec\xa8\x64\x47\x25\x3b\x2a\xd9\x91\xe6\x44\x9a\x13\x69\x4e\xa4\x39\xe5\x67\x24\x7d\xbe\x28\x9b\x49\xd9\x4c\xca\x66\x4e\xbc\x6c\x66\x21\xa8\x03\xe8\x93\xba\xd8\x3e\x75\x71\xf0\x3e\x5f\x63\xc9\x5e\xac\x6f\xf0\x55\x41\xba\x1b\x75\xf6\x6a\x43\xb7\x69\xe9\x45\x4b\x2f\xf3\x15\x2d\xbd\x08\x4e\x20\x38\x81\xe0\x04\x82\x13\x08\x4e\x80\x7a\x03\x42\xeb\x25\x02\x08\x05\x84\x02\x42\x01\xa1\x80\xd0\x05\x83\x50\xd8\x04\x6c\x02\x36\x01\x9b\xa0\xa5\x17\x2d\xbd\x68\xe9\x95\x7c\x73\x52\x7a\x25\xbd\xbc\x86\xed\xe5\xd5\xb6\xe2\x03\x4d\xbc\x16\x50\x6a\xae\xdf\x26\x5e\x15\xcc\xaf\x61\xf7\xae\x99\xd5\xee\xa0\x68\xc7\x72\x52\xab\x28\xda\x41\xd1\x8e\x82\x9b\x19\xa7\x92\x36\x9d\x6a\x1d\xe3\xae\xf9\xde\xea\x56\x67\xab\xf5\x0e\xd8\x9a\x6b\xb8\x5a\x22\x43\x34\xe3\x6a\x53\x46\x84\xe2\x21\x68\x59\xd3\xd7\xb2\x48\xd7\x5e\x50\xba\x36\x79\x69\xe4\xa5\x91\x97\x46\x5e\x1a\x06\x62\xd9\x5b\x34\xca\x24\x10\xda\x6f\x8d\xd3\x3c\x1b\xb4\xfd\xd6\x58\x32\x57\x4a\xfa\x6e\x55\x58\x54\x8d\x1a\x6e\x5d\xb2\xbc\xe0\x2a\x29\x3a\x7a\x74\x2d\xb6\xce\xc7\x07\xf3\xbd\xb5\x4e\xa7\x7e\x63\x01\x7e\x90\xce\xc9\x91\x4e\x9a\x6a\x9d\xb6\xcb\x35\xeb\xa6\x35\x7d\x3e\x4b\x1b\x2d\x9c\x89\xcb\x43\xb6\xb4\xd1\xea\x72\xde\xd0\x46\x0b\x1f\x0c\x46\xd2\xbc\xfb\x67\xb5\x35\x93\xce\xd7\x38\xab\xd2\x65\xd1\xac\x63\xd6\xf4\xd5\x39\xc2\xed\xd0\xdd\x66\xae\xbb\x8d\x48\x45\x62\x27\x4f\xbe\x59\x78\xb8\xdd\x7c\x75\x8e\xc1\xba\x62\xf5\x1b\xc2\xe6\x7b\x8e\x7a\x30\x7d\xb7\x32\xed\xaf\x06\x28\x0d\x56\xdf\xf1\xb3\xa4\x42\x58\xea\xe0\x0f\x9e\x7f\xe7\x38\x89\x36\x13\x8c\x81\xbf\x94\x1e\xb0\xe0\x6c\xb0\x68\xb8\x48\x0a\x1b\x36\x29\xec\x85\xdd\x80\x4f\x67\x3f\xd4\xde\x9b\x71\xed\xbd\x7a\xb6\x53\x57\x77\xaf\xd2\xa1\xd4\x01\xb7\xa2\xda\x1e\xd5\xf6\xa8\xb6\x47\xb5\xbd\xb9\x55\xdb\xab\x5f\x79\x0b\x2b\xed\xf5\x1c\x25\x70\xb6\xfa\x7a\xf5\x8f\x5f\x5e\x5b\x6f\xcc\x32\x38\xa5\xa2\x5e\xbd\x0c\xca\xab\xe9\xf5\x2c\x03\x6a\xe8\x51\x43\x8f\x1a\x7a\xd4\xd0\xa3\x86\x5e\x6f\x35\xf4\x1a\xac\xfe\x47\xf5\xf3\x2a\xd3\xb5\x16\x14\x24\xd8\xec\x69\x66\x5c\x03\xb0\x5e\xdc\x55\xf5\xff\xce\x2b\x77\xaa\xfe\xf5\x32\xa2\xc7\x15\xff\x7a\x1e\xd6\x41\xeb\xfc\xd5\x8b\xa7\xa2\xc6\x5f\xdf\xcb\xe6\x58\x2b\xfb\xd5\x0b\xad\x80\x61\xb4\xf6\xe7\x45\x9f\xfe\x6c\xc3\xb3\x86\x06\x59\xed\x08\x16\xe8\x2a\x2f\xf8\x71\xa2\x2b\x98\xd5\x52\x0a\x19\x02\xab\x80\x55\xc0\x2a\x60\x15\xb0\x0a\x58\x05\xac\x02\x56\x01\xab\x80\x55\xc0\x2a\x60\x15\xb0\x0a\x58\x05\xac\x02\x56\x35\x7d\x1a\x60\x15\xb0\x0a\x58\x05\xac\x02\x56\x01\xab\x32\xb0\x4a\xdf\xc3\x8d\xe5\xec\x83\x9d\xf2\xcf\x96\x89\x15\x29\x81\xee\xda\xfe\x66\xaf\xf7\xd2\x49\x0f\x9d\x4c\x0c\xbd\x77\xe6\xae\x52\x59\x22\xab\x54\xdd\xdc\x1f\x13\x95\xfc\x4a\x9f\xee\xea\xe0\xdf\xcb\x38\x6c\x12\xfc\x25\x6c\x37\xd8\x29\x99\xd9\x3b\xf3\x70\xec\x7b\x49\xad\xa1\xe3\x5b\xf9\x25\x87\x1f\xe0\x63\x63\x2d\x11\xaa\x17\x88\xf7\xa1\x0d\xb8\x78\x66\xa6\x47\x72\x20\x70\x76\xfc\x0a\x81\xd1\xc0\x68\x60\x34\x30\x1a\x18\x0d\x8c\x06\x46\x03\xa3\x75\xb4\xda\x82\xd1\xc0\x68\x60\x34\x30\x1a\x18\x0d\x8c\x06\x46\x03\xa3\x81\xd1\xc0\x68\x60\xb4\x51\x8e\x28\x18\x2d\x2b\x1e\x30\xda\xdc\x30\x5a\x41\x0f\xde\x9e\x68\x5a\x1a\xa1\xb9\xf1\xde\x1f\xe7\x84\xf5\x84\xd2\xde\x1c\x94\x7e\x6d\xd8\x44\x0a\x62\x68\x37\x1c\xac\x99\xab\x8c\x15\x9c\x3a\x77\x37\x20\x0e\x08\x07\x84\x9b\x1e\x84\x03\xc0\x01\xe0\x00\x70\x87\x17\x0d\x00\x07\x80\x03\xc0\x01\xe0\x00\x70\x00\x38\x00\x1c\x00\x0e\x00\x07\x80\x03\xc0\x01\xe0\x00\x70\x93\x03\x70\xe9\xe6\xda\x75\x3e\x87\x29\xb5\xda\x06\x2c\x02\x16\x01\x8b\xd3\x18\x51\xc0\x62\x56\x3c\x80\xc5\xb9\x80\xc5\x91\x25\xe6\x8d\x21\x23\x8f\x54\x3c\x28\xe0\x34\x29\xe0\xf0\xa9\x78\x20\x40\x10\x20\x08\x10\x04\x08\x02\x04\x01\x82\x00\x41\x80\x1d\xad\xb6\x20\x40\x10\x20\x08\x10\x04\x08\x02\x04\x01\x82\x00\x17\x87\x00\x41\x65\xa0\x32\x50\xd9\x34\x46\x14\x54\x96\x15\x0f\xa8\x6c\x36\xa8\x6c\x7c\xc9\x77\xd3\xcf\xba\x03\xb4\x01\xda\xa6\x07\xda\x80\x6c\x40\x36\x20\x1b\x90\x0d\xc8\x06\x64\x03\xb2\x01\xd9\x80\x6c\x40\x36\x20\x1b\x90\x0d\xc8\x06\x64\x03\xb2\x01\xd9\xa6\x08\xd9\x4a\xf2\xec\x48\xb0\x83\x1a\x8e\x8d\x31\x41\x0d\xa1\x86\x50\x43\xa8\x61\x4e\x68\xe3\xa1\x86\xe1\x1d\x05\x5b\x69\xc5\xcc\x50\x7f\xfe\xcf\xcd\xc8\x1a\xe2\x8d\xa1\x13\xde\x6f\xb1\x74\xd6\x34\xc3\x03\x0c\x4e\x1e\x0c\x0e\x94\x81\x47\x11\x4e\xe0\x20\x70\x10\x38\x08\x1c\x04\x0e\x02\x07\x81\x83\x23\x03\x63\xc0\x41\xe0\x20\x70\x10\x38\x08\x1c\x04\x0e\x02\x07\xa7\x08\x07\xa3\xa7\xd6\x8c\x30\x1c\x4a\xb9\xdf\x7d\x11\x81\xe5\x6d\xd5\x1b\x11\xec\xad\x2f\xe1\xc8\x6b\x7b\x45\xc9\x27\xe3\x15\xde\xfa\x9e\x96\xf2\xe9\xfc\x50\xbb\x03\x81\x88\x40\x44\x20\x22\x10\x11\x88\x08\x44\x04\x22\x96\x41\xc4\x91\x64\x24\x4e\xbf\x0f\x60\x21\x86\x04\x41\x82\x20\xa7\x87\x20\xc1\x8f\xe0\x47\xf0\x23\xf8\x11\xfc\x08\x7e\x04\x3f\x82\x1f\xc1\x8f\xe0\x47\xf0\x23\xf8\x11\xfc\x08\x7e\x04\x3f\x82\x1f\xa7\x88\x1f\xd3\xb9\x89\xb3\x68\xfe\x07\x4f\x85\xa7\xc2\x53\xe1\xa9\xa3\x1e\x51\x78\x6a\x56\x3c\xf0\xd4\xb9\xf2\xd4\xb1\x64\x63\x8e\x24\x0d\x93\xfc\x4b\xe0\xe7\x34\xe1\xe7\x80\xf9\x97\x90\x4f\xc8\x27\xe4\x13\xf2\x09\xf9\x84\x7c\x42\x3e\x21\x9f\x1d\xad\xb6\x90\x4f\xc8\x27\xe4\x13\xf2\x09\xf9\x84\x7c\x42\x3e\x17\x47\x3e\x01\x85\x80\x42\x40\x21\xa0\x70\xd4\x23\x0a\x28\xcc\x8a\x07\x50\x38\x5b\x50\x38\xa2\x8c\xcb\x59\xa4\x5a\x82\x19\xc1\x8c\xd3\xc3\x8c\x20\x46\x10\x23\x88\x11\xc4\x08\x62\x04\x31\x82\x18\x41\x8c\x20\x46\x10\x23\x88\x11\xc4\x08\x62\x04\x31\x82\x18\x41\x8c\x93\x42\x8c\xf9\xe4\x4a\xb2\x2a\x81\xa5\xc0\xd2\x91\xa0\x35\x60\x29\xb0\x14\x58\x0a\x2c\xcd\x09\x6d\x3c\xb0\x94\x9e\x96\x47\x84\x33\xd7\xc9\xf2\x83\xe7\xdf\x39\x4e\x82\x3d\x03\x90\x27\xc8\x73\x7a\xc8\x93\xce\x96\xd0\x4f\xe8\x67\xf4\x96\x41\x3f\xa1\x9f\xd0\x4f\xe8\x27\xf4\x13\xfa\x09\xfd\x84\x7e\x42\x3f\xa1\x9f\xd0\x4f\xe8\x27\xf4\x73\x72\xf4\x13\x74\x06\x3a\x03\x9d\x4d\x63\x44\x41\x67\x59\xf1\x80\xce\x26\x8f\xce\xc6\xc2\xcc\x06\x85\x65\x50\xb2\xa2\xb1\x84\x92\x41\xc9\x48\x0e\x04\x8f\x81\xc7\xc0\x63\xe0\x31\xf0\x18\x78\x0c\x3c\x06\x1e\x03\x8f\x81\xc7\xc0\x63\xe0\x31\xf0\x18\x78\x0c\x3c\x06\x1e\x3b\xe9\x69\xc0\x63\xe0\x31\xf0\x58\x67\xc3\x0a\x1e\x2b\x93\x0c\x78\xec\x05\x78\xec\x41\xed\xe4\xed\x4d\x2b\x30\xd6\x37\x11\x6a\x02\xdd\x36\x6a\x97\x55\x78\xcd\x30\x57\xb0\xb1\x8d\xda\x15\x90\x31\x2d\x86\xbb\xfb\x8f\x7f\x14\x9d\x61\x28\x24\x36\x59\x52\x95\x12\xa4\x6e\x6f\x38\x43\x5c\xa5\x27\x4c\xea\x14\x17\xe9\xdb\x38\xf5\xf5\xb3\x9c\x7d\xb0\x53\x7e\x59\x7a\xa7\xb1\x37\xba\xa5\xd5\xe6\x9c\xc2\xf2\x1c\x47\x59\xf1\x36\xf1\xce\xdc\x47\x71\x1e\x58\xfe\x45\x32\x67\x28\x7b\x97\xde\x25\x27\xae\x3e\x69\x09\x12\x13\xf9\x69\x60\xd6\xd2\x07\x6f\xfd\x9c\x9f\xc1\xf1\x62\x5a\xf4\x5d\x2f\xb3\xfb\x67\xfd\xe0\xbf\x6b\x51\x06\x0d\xe7\x76\xf5\xa4\x86\xb2\x40\x59\xa0\x2c\x50\x96\xb9\x51\x96\x0a\x1d\xb8\x8e\xb4\x54\xdb\x53\xd5\xba\xf0\x49\x6b\xef\xbf\x42\xc1\x45\xfe\xa5\x37\x3a\x7c\xcb\x0a\x67\x94\x99\x07\x99\x67\x4b\x47\x34\x3c\x28\xb1\x0d\xa5\x15\xec\xd4\x7a\x25\xee\x5c\x61\xbb\x66\x65\xf1\x7c\xb1\x77\x93\xc5\x69\x2d\xd6\xfe\xf3\x1f\x7b\x57\xac\x6d\x3f\xdc\x0d\xbf\xa9\x64\xc6\x87\xcb\xa7\xf6\x06\x46\xaf\x7c\x3c\x37\x22\x01\x8b\xc7\xbd\xaf\xdf\xb2\xad\xef\x59\x2a\xd0\x6e\xbb\xc8\x90\x8b\x66\xd9\x4a\xfc\x53\x5f\x51\x8f\x96\x9e\x3b\x3f\x8a\x6b\x71\xe7\x38\x3f\x6a\xa7\xdc\x3a\x5c\xa5\xf7\x6e\x38\xf0\xa1\x49\x14\x4f\xc9\xe8\x74\x6a\xdd\x62\xa0\xcc\xb3\x0c\x33\x4c\x67\x43\x63\xcd\x44\x51\x8e\xc7\xce\x26\x91\x7f\xa4\x6d\x7c\xdb\x15\x81\x31\xbd\xc5\x83\x7a\x34\x31\x3c\x89\x1b\xf5\xa0\x4a\x44\xab\x97\x9e\x3a\x7b\x65\x36\x87\x87\xd0\xba\x75\xaf\x5d\xb5\x91\x7a\x82\x46\x56\xfa\x4a\xfc\x23\xd9\xb0\x0d\x52\x49\x5e\x8d\x48\x77\xb4\x9f\x9e\xd4\xda\x96\x3b\xe5\x3c\x1f\x82\x6b\x0e\x5b\xae\xed\xbc\x89\xac\x70\x2d\x74\xb1\xf1\xa5\xa5\xdf\x1a\xdb\x5b\x27\x0a\xc1\x61\xd3\xd6\x91\x4b\xf1\x2c\xdd\x07\xe1\x4d\xa6\x87\x4b\x86\x47\xc6\x0f\x14\x5d\xe4\xd1\xac\x81\xf1\x29\x56\xe6\x3e\x9f\x94\x74\x0b\xef\xb1\xc5\x30\xeb\x7b\xbe\xd7\xb7\x5c\xe4\xd9\xa8\xf1\x6d\x8c\x65\xfa\x9f\x42\x45\x9b\xc9\xa5\x9c\x8c\x9e\x6d\xfa\xc3\x48\x61\xa4\x30\x52\x18\x29\x8c\xb4\x37\x46\xda\x70\x2f\x38\xe2\xa4\xe7\xdb\x16\x7f\x4e\xe5\x51\x6c\x1d\x25\x03\x95\x2c\x41\xf7\xbe\xb7\x95\x1b\xad\x1d\xdd\x7b\x8e\x6d\x3d\x67\x22\x72\xe3\x49\x77\x48\xc4\x08\xa7\xdd\xed\xea\xbf\x56\xe2\x93\x59\xcf\x8c\xea\xb2\x55\x6e\xf8\xb2\x1c\xf6\x54\x25\x3c\x7f\xfb\x45\xba\x71\x84\xb0\xbf\x57\x37\x8f\xd2\x89\x6d\xe5\xcf\x97\xe6\xeb\xcf\x97\xe2\xd1\x76\xa5\x63\xff\x5f\xbc\x91\x3c\x28\x21\xd7\x1a\x9c\x79\x37\x06\x2a\xac\x0f\x66\x98\x39\xfd\x55\x70\x38\xc8\xd8\xa7\x2b\xf1\xde\xd6\x8b\x63\xea\xd6\x3d\xff\xf8\xd9\x0e\x98\x74\x67\xcc\x63\x6d\xa3\x78\xbb\x2f\x6d\x06\xd4\x3c\xc1\xcf\xf1\xb3\x97\xaa\x3c\x45\x88\xa2\x5b\xc3\x4c\x3f\x7a\xf8\xc2\x7e\xf1\xbe\x8b\x8d\xf4\x1f\xe4\x26\xe3\xb2\x4c\x8c\x1a\xe5\x3f\x7a\xfe\x53\x38\x26\x85\xf2\xfa\x3d\xf7\x44\xe5\xe2\xd2\x4a\x6f\xac\xb1\x6e\x8d\x6c\xed\x50\x9b\xb4\xec\xf5\xc1\x14\xd6\xba\x82\x76\x4e\x24\x63\x1c\x6e\xd6\xd1\x4e\x1a\x6b\x03\xab\xd4\x60\xc6\xfb\x48\xc2\x29\x93\x68\xf7\xec\xc5\x56\xe2\xce\xb2\xd4\x76\xa7\xf7\xa6\xb4\x65\x77\x65\x9e\xe1\x4a\x5c\x47\x13\x30\x3b\x41\x83\x9f\xc4\xd5\xdf\xa4\xf5\x75\xe3\x7b\x7b\x77\x1d\xfe\x4a\x47\x8e\xeb\x1f\xe5\x04\x67\x54\xc8\x48\x3f\xce\x9e\x24\x7e\x82\x87\xe4\x4c\x3f\x89\xab\x0f\x9e\xaf\x52\xa7\x15\x96\x0c\x2c\xb9\x0e\x9f\x3e\x92\x8f\x49\x2c\xd0\xe7\x0b\x8c\xe9\x79\x74\xc2\xc7\xe4\x1c\x6d\x26\xe4\x36\x3f\xdd\x87\xd1\x38\x67\x1c\xd0\xd0\x6c\x1c\xaa\x82\x1a\x86\x1a\x05\xc2\x1b\x7a\x1b\xdf\xe3\x10\x87\xf3\xf9\x36\x86\x0c\x76\x68\x26\xac\x8a\x80\x87\x97\xea\x3f\x85\xfc\x0e\x08\x7d\x22\xa6\xfb\xb4\x93\xbb\x7d\x53\x3e\x37\x69\xf6\x9c\x3a\x45\x49\xbe\xa4\xd9\x9d\x0f\x9a\xd3\x00\x69\x93\x95\x18\x38\x9f\x44\x99\x7b\xc2\xe3\x4c\xca\xce\xb3\xb7\x8d\x17\xcd\x8f\x2c\xef\x58\xdd\x8f\x5b\xc0\x9e\x04\xc6\xc3\x53\x95\x62\xf1\x4e\x60\x38\x39\xa2\xcb\xc9\x11\x6d\xb6\x1b\xd5\xe5\x89\x9e\xcf\x6c\x23\x96\x81\x58\x06\x62\x19\x88\x65\x20\x96\xa1\x68\xf1\x05\x92\x4f\x48\x22\x70\x53\xb8\x29\xdc\x14\x6e\x0a\x37\x85\x9b\xce\x8b\x9b\x82\x32\x40\x19\xa0\x0c\x50\x46\xef\x28\xe3\x04\xdc\x3f\xd2\x2c\xce\x66\x22\x3c\xce\xe4\x7c\xa9\xc7\x6d\x54\x10\xa8\xf4\x80\x65\x15\xe7\x5c\x69\xe6\x11\xe1\x89\xd5\xb1\x2f\x7f\x29\xc9\x8e\xf5\xc0\x69\xa0\xda\x9c\xdd\x42\xa6\x16\xe5\x3a\xa7\x52\xc2\xe3\x22\x37\x92\x97\x5b\x2f\xe8\x98\xa8\x19\xfb\x46\xc8\xd3\xe0\x99\x39\xaa\x5f\x7c\xd6\x2e\x97\xb4\xa2\xe3\x78\xaf\x8b\x4a\x27\x19\xa6\x64\x39\xa5\x87\x7e\xb4\x59\x4e\xda\xb3\xf1\xab\x74\xe5\x46\xf9\xc6\x47\x67\xfa\xeb\x07\x81\x67\xd9\xda\xe8\x4c\xbc\x61\x52\x3b\x35\x3d\x5f\x28\x77\x17\x6a\x81\xb1\x15\xfe\x24\xbf\x86\x52\xdc\x7d\x51\x81\x8a\x55\xa9\x74\x2e\x4f\x9c\xf3\xa3\x55\x49\xed\xf9\xf2\x7c\x71\xfb\xf6\x87\xf0\xb7\xbe\xb4\x34\xea\x72\x3c\x77\x63\x14\x27\xed\x9d\xb2\x3c\x77\x27\x6d\xd7\xac\x5b\xda\xfb\x73\xf8\xad\x76\xff\x47\x20\x4e\x3c\x3c\x27\xb6\xc1\xc6\x73\xa4\xbb\x59\x79\xfe\xe6\x66\xfb\x75\x73\xb3\x77\x6d\xcb\x5b\xab\x9b\xbf\x7c\x0c\xee\xc3\xb3\xb4\x76\x27\x47\xc2\xe9\x72\x78\x46\xa5\x69\x4d\x5b\x01\x6a\xaa\xfc\xbc\x6d\xa0\xfc\xbc\x33\xfe\xb1\x31\xde\xfc\xdb\xda\x9b\x37\x51\xbc\x63\xbc\xfb\x79\xeb\x9d\x5a\x8d\x99\xa8\xde\x79\x21\xba\x29\x1d\x72\xf3\xff\xc2\x15\xf3\x3f\x67\xaa\x20\x72\xa2\x7e\x57\x53\x35\x84\x5a\x21\x68\x72\xb3\xd0\xe4\xc8\xce\x5e\x50\x76\x36\x69\x68\xa4\xa1\x91\x86\x46\x1a\x1a\x46\x68\xd9\x5b\x34\xca\x9c\x8f\x61\x0c\x39\x52\x56\x4e\x48\x59\x99\xaa\x2d\x97\xf8\xd5\x3b\x4f\x54\xf1\x95\x5c\xe7\x94\xb3\x93\x0c\xb0\xf0\xf8\x96\xe6\x17\xab\x11\x7e\x99\x96\x6f\xf3\x46\x4d\xd6\x2d\xf3\x12\x1c\xa8\xbd\xf7\x91\x19\x5c\x77\x33\x46\x03\xd9\xca\xdd\x97\x62\xfc\xa7\xff\xcf\x7c\x53\x41\xa4\x7a\x2e\x46\x3e\x5d\xcc\xa9\xa3\x0c\x5a\x95\xb7\xbe\xd6\xc7\xfe\xb5\x7a\x85\x7b\x52\xfe\x46\x35\xfa\x65\xb0\xf3\xe5\x4e\x6d\x6c\xeb\xba\xf9\x31\xe1\xe7\xe7\xe8\x97\x7a\x2d\x6d\xb2\x61\x6c\xa5\xbf\xb3\x75\x12\x90\x89\x88\x79\xc9\xe6\xb1\x2d\x69\x2c\x3b\xb8\xf3\xae\x2f\x38\x5b\xa1\xac\xdd\x67\x03\x56\x04\x2e\xbd\x99\xbb\xf4\x96\x03\x67\x73\x61\xf6\xf1\xcb\x65\x52\x41\xc2\x35\xe8\x90\x5e\xfc\xaa\x64\x7d\x7a\xad\x1d\x1a\x26\xff\x53\x3a\xfa\x48\xd7\x73\xaf\xcd\xd1\xfa\x17\xda\xa7\x18\x88\x57\x7f\x0f\x3c\xf7\xde\x64\xd9\xfe\x1a\xae\x84\xd1\xe7\x4f\xf1\xfa\x78\xf8\xe3\xeb\x31\x51\xe3\xe6\xf3\xe6\x83\xe7\x5b\xda\xe9\xba\xf1\xf4\xe0\x7b\xe2\xf3\xe5\x63\xf8\xb7\xcf\x97\xe2\x2e\x23\x4d\x1d\xc4\x6b\x3c\xa4\xfb\xe0\x90\x51\x78\x2d\x2d\x3d\x00\x3a\x4f\xd3\xb1\xad\xc8\xe7\xa3\x9c\x75\x20\xbc\xef\xd1\xd8\x9a\x3c\xc6\xad\xf2\xb6\x8e\x5a\x09\x73\x4d\x9d\x9e\x1d\xcf\x29\x1d\x4a\x5b\x38\x10\xc9\xe5\xdb\x88\x37\xbc\xd0\x7c\x03\x1f\xb1\x3d\xa6\x6f\x7b\x6c\x73\x71\xa9\x13\xb5\x3e\xf6\x9d\x3b\x12\xb6\x8e\xb4\x5e\xa4\x0e\x46\xa7\x58\x92\x42\x48\xb4\x1e\x0a\xe1\xf2\x14\xc2\x11\xe9\x5d\xa8\x07\xc9\x37\x44\xeb\x35\xb8\xf9\x99\xeb\x36\xfb\xc9\xfa\x55\x2f\xc4\xcb\xc2\xdd\x06\x6f\x91\xd5\x3e\xca\xad\xa8\x37\x16\x81\x6e\x14\x92\xa2\x90\x14\x85\xa4\x28\x24\x45\x21\xa9\xc1\x0b\x49\x61\x80\x36\x1e\x28\x9a\x62\x8d\xa9\xde\x17\x61\xd7\x0b\x0a\xbb\xa6\xb8\x1b\xc5\xdd\x28\xee\x46\x71\x37\x8a\xbb\x51\xdc\x8d\xe2\x6e\x64\x23\x91\x8d\x44\x36\x12\xd9\x48\xf9\x19\x49\x53\x2c\x2a\x49\x52\x49\x92\x4a\x92\x13\xaf\x24\x59\x48\xec\xe0\xfe\x64\x18\xbe\x30\xc3\x70\x2c\x4d\xb1\x46\x95\x64\xd8\xb8\x1b\x56\x05\x03\x6f\xd8\x06\xab\x0d\xf7\xa6\xff\x15\xfd\xaf\xcc\x57\xf4\xbf\x22\x6c\x81\xb0\x05\xc2\x16\x08\x5b\x20\x6c\x01\x1e\x0e\x22\xad\x97\x08\x88\x14\x44\x0a\x22\x05\x91\x82\x48\x17\x8c\x48\xa1\x16\x50\x0b\xa8\x05\xd4\x82\xfe\x57\xf4\xbf\xa2\xff\x55\xf2\x4d\xeb\x9c\x4c\x1a\x5f\xed\x46\xd3\xf8\xea\x45\x45\x26\xe8\x78\xd5\x71\xc7\xab\x0a\x40\xd6\xb8\xd5\xd5\x8c\xab\x66\x50\x2e\x63\x39\xd9\x4a\x94\xcb\xa0\x5c\x46\xc1\xcd\x8c\x5f\xbb\x99\x66\x9d\x8c\x71\x57\x41\x7f\xf1\x6d\xcf\x5b\x8d\x1c\xbe\x8f\xd5\x10\x15\x3d\x06\xec\x5c\xd5\xbe\x98\x07\x25\x3c\x44\x99\xa0\x51\xcc\xd2\x83\x3c\x5a\xc5\x8c\xa4\xe9\x05\x25\x4d\x93\x1d\x46\x76\x18\xd9\x61\x64\x87\x61\x53\x96\xbd\x45\xa3\x4c\xc5\xa0\x57\xd5\x88\xad\xb5\x31\xf4\xaa\x1a\x55\xfe\x48\x75\x93\xaa\x0a\x5b\xab\x61\x77\xaa\x4b\x16\x1e\xfc\x2b\x93\xee\x47\x75\x66\x4a\x57\xd2\x88\xaa\x88\xc7\xd1\x81\x8a\x0e\x54\xa5\xc7\xf4\xdc\x81\xaa\x62\x67\x68\xda\x7a\x6a\xfa\xb0\x94\x9e\x53\xb8\xe6\x96\xc7\x4c\xe9\x39\xd5\xe5\xbc\xa1\xe7\x14\x1e\x0d\x0c\x8b\x65\x36\x9b\x7a\x91\x69\x71\xf6\x2e\x53\x95\xce\x80\xa6\xed\xa5\xa6\xaf\xf4\x11\x21\x87\xb6\xb7\x20\x6d\x6f\x44\x4a\x15\x7b\x7f\xf2\x0d\x11\x72\x85\x77\x3d\x73\x8d\x65\xe8\x16\x52\xe7\x8a\x34\x0b\x17\x92\x60\x2b\xad\x38\xce\x4c\x7f\xfe\xcf\x8d\xef\x39\xea\xc1\x74\xb1\x1a\xa6\xa5\x54\xb3\x5e\x9b\x4d\x5b\x4a\xfd\x16\x3f\xd9\x7a\x90\xbe\x9b\x13\x89\x4c\xa3\x4a\x13\x55\x9a\xa8\xd2\x44\x95\x26\xaa\x34\xa5\xbf\xa7\xb9\x14\xc6\x28\xc5\xb4\x4a\x25\x42\x9c\xf4\x82\xe2\xa4\xa9\x9c\x46\xe5\x34\x2a\xa7\x51\x39\x8d\xca\x69\x54\x4e\xa3\x72\x1a\xe9\x43\xa4\x0f\x91\x3e\x44\xfa\x50\x7e\x46\xd2\x5c\x8a\x32\x8d\x94\x69\xa4\x4c\xe3\xc4\xcb\x34\x16\xb2\x3b\x62\x00\x48\x09\x7c\x61\x4a\xe0\xa0\xcd\xa5\x8a\xf9\xef\xf0\xc9\x81\xd5\xcd\xa5\x9a\xd1\xf0\xaa\xe6\x52\x9d\x11\x70\xda\x4c\xd1\x66\xca\x7c\x45\x9b\x29\x02\x18\x08\x60\x20\x80\x81\x00\x06\x02\x18\x20\xe3\xc0\xd2\x7a\x89\x00\x4b\x81\xa5\xc0\x52\x60\x29\xb0\x74\xc1\xb0\x14\x7e\x01\xbf\x80\x5f\xc0\x2f\x68\x33\x45\x9b\x29\xda\x4c\x25\xdf\x9c\x96\xb0\x99\x72\xe2\xd3\x66\x6a\x37\x6c\x9b\xa9\x8e\x90\x52\x8b\x02\x76\x91\x3a\x69\xf2\xe1\xdd\xb5\x08\xef\x59\x04\x96\xb7\x55\x6f\x44\xb0\xb7\xbe\x84\x6b\x93\x5e\xfb\x95\x7c\x32\x0b\xd7\xd6\xf7\xb4\xfa\x9a\xbd\xd1\x26\x35\xee\x34\x3c\xca\x7e\x4d\xa1\xbb\xba\xa7\x89\x3e\x9d\xa5\xbf\x56\x33\x46\x58\xdd\x5f\x6b\xe0\x3c\xd9\xf3\xd4\x11\x49\x3f\x5a\xb3\x75\x93\xd4\xad\x19\xa4\x6e\x51\x47\x84\x3a\x22\x05\x37\x33\x7e\x05\x6f\x42\x75\x44\x5a\xdd\xf5\xf0\x9d\xb6\x5a\xdc\xf6\xbc\x35\xe9\x81\x3a\x6d\xbd\x4c\x93\xbe\x10\xfd\xd4\x3f\x39\x77\x03\xae\x2e\x4a\x9f\x50\xf0\xa4\xf0\x69\xd0\xdc\xa6\xa8\xb9\x91\x62\xbe\xa0\x14\x73\x72\xe9\xc8\xa5\x23\x97\x8e\x5c\x3a\x8c\xce\xb2\xb7\x68\x94\x89\x2b\xb4\xe2\x1a\xb1\x39\x37\x58\x2b\xae\xb1\x66\xdb\x14\xb4\xe2\x6a\x66\x75\x55\xb5\xe2\xaa\xb7\xb9\x58\x82\x70\xc5\x4c\xa3\x29\xd7\x70\x4c\x33\xdd\x94\xab\xf4\x2e\xa6\xd4\x94\x0b\x48\x3b\x39\x48\x4b\x37\xb2\x56\x9b\x63\x65\x37\xb2\x99\xa2\x65\xfa\x92\xe1\xa7\x5c\x1e\x61\xa6\x2f\x59\x97\xf3\x86\xbe\x64\xb8\x77\xb0\xad\x16\xd4\x97\xac\x2b\xeb\xea\x3c\x7d\xc9\x9a\x7a\x46\x2a\xfb\x92\xcd\x54\xfd\x23\xb2\x10\xbd\x6f\x41\x7a\xdf\x88\xd4\x2b\xb4\x80\xe4\x1b\x22\x0b\x0b\xef\x7a\xe6\xba\xcb\x20\x1d\xca\xc6\x15\xa1\x37\x5c\x6b\xb2\xd6\x81\x79\x65\x3d\xc9\x88\xcd\xa3\x96\x17\xb5\xbc\xa8\xe5\x45\x2d\x2f\x6a\x79\x0d\x5e\xcb\x0b\xbb\xb3\xf1\x40\xd1\x8c\x6c\x4c\x25\xd7\x88\x14\x5f\x50\xa4\x38\xf5\xf5\xa8\xaf\x47\x7d\x3d\xea\xeb\x51\x5f\x8f\xfa\x7a\xd4\xd7\x23\x81\x8a\x04\x2a\x12\xa8\x48\xa0\xca\xcf\x48\x9a\x91\x51\xcc\x93\x62\x9e\x14\xf3\x9c\x78\x31\xcf\x42\x5a\x07\xee\x27\x29\xf2\x85\x49\x91\x83\x37\x23\x1b\x55\x5e\x64\x7d\x17\xb2\x0a\xf0\xdd\xbc\xfd\x58\x1b\xd8\x4d\xdf\x31\xfa\x8e\x99\xaf\xe8\x3b\x46\xac\x02\xb1\x0a\xc4\x2a\x10\xab\x40\xac\x02\x10\x1c\x2e\x5a\x2f\x11\xb8\x28\x5c\x14\x2e\x0a\x17\x85\x8b\x2e\x98\x8b\x82\x2a\x40\x15\xa0\x0a\x50\x05\x7d\xc7\xe8\x3b\x46\xdf\xb1\xe4\x9b\xd3\xd3\x30\x69\x38\xb6\x1b\xbe\xe1\xd8\x8b\xea\x46\xd0\x69\x6c\x01\x45\xec\xfa\xed\x34\x56\xc1\x01\x4f\x69\x31\x36\xc7\x0a\x20\x94\xfe\x58\x4e\x0a\x16\xa5\x3f\x28\xfd\x51\x70\x33\x23\xd6\xde\x26\x56\xf3\x63\xdc\xf5\xe7\xdb\xdf\xef\xbc\x15\xe3\x01\xfb\x87\x8d\xa1\x2c\xc9\x10\x1d\xc3\x5a\x57\x24\xa1\x0e\x09\x8a\xd8\xf4\x15\x31\x32\xbf\x17\x94\xf9\x4d\x8a\x1b\x29\x6e\xa4\xb8\x91\xe2\x86\x0d\x59\xf6\x16\x8d\x32\x9f\x84\x1e\x61\x23\x36\xd9\x06\xed\x11\x36\xaa\x24\x98\x92\xe6\x60\x15\x06\x56\xf3\xae\x60\x97\xac\x36\xb8\x54\x26\xd6\x07\xec\xcc\xa8\x31\xdf\x00\xec\x74\x80\x38\x16\x76\x08\x34\x9d\x1c\x34\xa5\xf3\xd7\x69\x3b\xdf\x09\x2d\xbf\xa6\x8f\x7a\xe9\xf5\x85\xbf\x71\x79\xe0\x97\x5e\x5f\x5d\xce\x1b\x7a\x7d\xe1\xa6\xc1\x70\x3a\x16\xe3\x3c\x9b\x7c\xbd\xc8\x74\x3a\x5f\x77\xaf\x4a\xd7\xc6\x09\x6d\xbd\xa6\xaf\xe2\x11\xcd\x87\x52\xb7\x04\xa5\x6e\x44\xba\x13\x5b\x7c\xf2\x0d\xd1\x7c\xd1\x99\x67\xae\x91\x0c\xd6\xba\xeb\x5c\xc1\x71\xbe\xe7\xa8\x07\xd3\x26\x2c\xd3\xa3\x6b\x80\x82\x65\xf5\x9d\x4b\xab\xea\x96\xa5\xce\xf0\xc1\xf3\xef\x1c\x27\x51\x78\x82\x31\xa0\x9c\xd2\x03\x96\x9e\xa3\x16\x8d\x19\xa9\x6a\x23\x48\x55\xeb\xa2\xd3\xf1\xe9\x18\x89\x02\x81\x33\x2e\x10\x58\x8f\x89\xea\x8a\x03\x56\xba\xa5\x3a\x40\x60\x94\x04\xa4\x24\x20\x25\x01\x29\x09\x38\xb7\x92\x80\xf5\x2b\x6f\x61\x39\xc0\x9e\x03\x0e\xce\x56\x04\xb0\xfe\xf1\xcb\x0b\x00\x8e\x59\x06\xa7\x94\xfd\xab\x97\x41\x79\xc9\xbf\x9e\x65\x40\xa1\x3f\x0a\xfd\x51\xe8\x8f\x42\x7f\x14\xfa\xeb\xad\xd0\x5f\x83\xd5\xff\xa8\xc8\x5f\x65\x5e\xd8\x82\xe2\x0d\x9b\x3d\xcd\x8c\x0b\x15\xd6\x8b\xbb\xaa\x48\xe1\x79\xe5\x4e\x69\xc2\x5e\x46\xf4\xb8\x2c\x61\xcf\xc3\x3a\x68\x31\xc2\x7a\xf1\x54\x14\x22\xec\x7b\xd9\x1c\x6b\xf9\xc1\x7a\xa1\x15\x20\x8d\xd6\xfe\xbc\xe8\xd3\x9f\xad\x41\xd7\xd0\x84\xeb\x05\x68\x0b\xa6\x95\x97\xfe\x88\x99\x16\x30\x6b\x04\x30\x0b\x8a\x05\xc5\x82\x62\x41\xb1\xa0\x58\x50\x2c\x28\x16\x14\xab\xcb\xd5\x16\x8a\x05\xc5\x82\x62\x41\xb1\xa0\x58\x50\x2c\x28\x16\x14\x0b\x8a\x05\xc5\x82\x62\x8d\x72\x44\xa1\x58\x59\xf1\x40\xb1\xa6\x4c\xb1\xf4\x8d\xdc\x58\xce\x3e\xd8\x29\xff\x6c\xb9\x5b\x91\x26\xe8\xae\xed\x6f\xf6\x7a\x2f\x9d\xf4\xf8\xc9\xc4\xda\x7b\x67\xee\x2a\x95\x48\xb2\x4a\x95\xef\xfd\x31\xd1\xcb\xaf\xf4\xe9\xae\x0e\x4e\xbe\x8c\xd7\x26\xe1\x62\xc2\x76\x83\x9d\x92\x99\x0d\x34\x4f\xcd\xbe\x57\x15\x35\x3a\xbe\x9f\x5f\x72\x34\x02\x70\x36\xd6\x72\xa5\x7a\xa9\x78\x1f\x5a\x83\x70\xb4\x64\xa2\x0f\x04\xd3\x8e\xdf\x23\xd0\x1a\x68\x0d\xb4\x06\x5a\x03\xad\x81\xd6\x40\x6b\xa0\xb5\x2e\x57\x5b\xd0\x1a\x68\x0d\xb4\x06\x5a\x03\xad\x81\xd6\x40\x6b\xa0\x35\xd0\x1a\x68\x0d\xb4\x36\xca\x11\x05\xad\x65\xc5\x03\x5a\x9b\x25\x5a\x2b\xe8\x11\xdc\x13\x61\x4b\x63\x35\x37\x56\x00\xe2\x04\xb2\x9e\xf0\xda\x9b\x83\xe6\xaf\xad\x9b\x48\x4b\x0c\x8d\x87\x83\x49\x73\x95\x31\x85\x53\xe7\xee\x10\xce\x01\xe6\x00\x73\x13\x05\x73\x40\x39\xa0\x1c\x50\x0e\x28\x07\x94\x03\xca\x01\xe5\x80\x72\x40\x39\xa0\x1c\x50\x0e\x28\x07\x94\x03\xca\x01\xe5\x80\x72\x53\x87\x72\xe9\x46\xdf\x75\x8e\x87\x29\xb5\xfd\x06\x36\x02\x1b\x81\x8d\xd3\x18\x51\x60\x63\x56\x3c\xc0\xc6\x59\xc1\xc6\x91\x25\xf0\x8d\x26\x73\x8f\x94\x3d\xc8\xe0\x84\xc9\xe0\xf0\x29\x7b\x60\x41\xb0\x20\x58\x10\x2c\x08\x16\x04\x0b\x82\x05\xc1\x82\x5d\xae\xb6\x60\x41\xb0\x20\x58\x10\x2c\x08\x16\x04\x0b\x82\x05\x17\x87\x05\xc1\x67\xe0\x33\xf0\xd9\x34\x46\x14\x7c\x96\x15\x0f\xf8\x6c\x5e\xf8\x6c\x7c\x49\x7a\x33\xc9\xce\x03\xbe\x01\xdf\x26\x0a\xdf\x00\x6f\x80\x37\xc0\x5b\xfc\xae\x01\xde\x00\x6f\x80\x37\xc0\x1b\xe0\x0d\xf0\x06\x78\x03\xbc\x01\xde\x00\x6f\x80\x37\xc0\x1b\xe0\x6d\x72\xe0\xad\x24\x1f\x8f\x44\x3c\x48\xe2\xd8\xb8\x13\x24\x11\x92\x08\x49\x84\x24\xe6\x84\x36\x32\x92\x18\xde\x56\xb0\x95\x56\xcc\x11\xf5\xe7\xff\xdc\x8c\xac\xc1\xde\x68\x3a\xeb\xfd\x16\x8b\x68\x4d\x73\x3d\x60\xe1\x3c\x60\xe1\x40\x99\x7a\x14\xf0\x04\x18\x02\x0c\x01\x86\x00\x43\x80\x21\xc0\x10\x60\x38\x46\x58\x06\x30\x04\x18\x02\x0c\x01\x86\x00\x43\x80\x21\xc0\x70\x8a\xc0\x30\x7a\x6a\xcd\x0d\xc3\xa1\x94\xfb\xdd\x17\x11\x58\xde\x56\xbd\x11\xc1\xde\xfa\x12\x8e\xbc\xb6\x57\x94\x7c\x32\x9e\xe2\xad\xef\x69\x29\x9f\xce\x14\xb5\x63\x10\xb0\x08\x58\x04\x2c\x02\x16\x01\x8b\x80\x45\xc0\x62\x25\x58\x1c\x49\xe6\xe2\x4c\xfa\x0a\x16\xa2\x49\xb0\x24\x58\x72\xa2\x58\x12\x24\x09\x92\x04\x49\xc6\xef\x1a\x48\x12\x24\x09\x92\x04\x49\x82\x24\x41\x92\x20\x49\x90\x24\x48\x12\x24\x09\x92\x04\x49\x82\x24\x27\x87\x24\xd3\x39\x8c\xb3\x68\x26\x08\x63\x85\xb1\xc2\x58\x61\xac\xa3\x1e\x51\x18\x6b\x56\x3c\x30\xd6\x59\x33\xd6\xb1\x64\x6d\x8e\x29\x5d\x93\x3c\x4d\x80\xe8\x84\x81\xe8\x80\x79\x9a\xd0\x50\x68\x28\x34\x14\x1a\x0a\x0d\x85\x86\x42\x43\xa1\xa1\x5d\xae\xb6\xd0\x50\x68\x28\x34\x14\x1a\x0a\x0d\x85\x86\x42\x43\x17\x47\x43\x81\x87\xc0\x43\xe0\x21\xf0\x70\xd4\x23\x0a\x3c\xcc\x8a\x07\x78\x38\x6f\x78\x38\xa2\xcc\xcc\xf9\xa4\x64\x82\x1e\x41\x8f\x13\x45\x8f\x60\x47\xb0\x23\xd8\x11\xec\x08\x76\x04\x3b\x82\x1d\xc1\x8e\x60\x47\xb0\x23\xd8\x11\xec\x08\x76\x04\x3b\x82\x1d\xc1\x8e\xd3\xc3\x8e\xf9\x24\x4c\xb2\x2f\x01\xa8\x00\xd4\x91\xe0\x36\x00\x2a\x00\x15\x80\x0a\x40\xcd\x09\x6d\x64\x00\x95\x1e\x99\xc5\xd4\x33\xd7\x19\xf3\x83\xe7\xdf\x39\x4e\x82\x42\x03\x30\x28\x18\x74\xa2\x18\x94\x4e\x99\x10\x51\x88\x68\xea\x87\x10\x51\x88\x28\x44\x14\x22\x0a\x11\x85\x88\x42\x44\x21\xa2\x10\x51\x88\x28\x44\x14\x22\x0a\x11\x9d\x1e\x11\x05\xa7\x81\xd3\xc0\x69\xd3\x18\x51\x70\x5a\x56\x3c\xe0\xb4\x79\xe0\xb4\xb1\x70\xb4\xe1\x01\x1a\xe4\xac\x68\x40\x21\x67\x90\x33\x92\x08\x41\x66\x20\xb3\xb2\xe9\x07\x32\x03\x99\x81\xcc\x40\x66\x20\xb3\xec\x72\x3b\x42\x5c\x04\x32\x03\x99\x81\xcc\x40\x66\x20\x33\x90\x19\xc8\x0c\x64\x96\x7d\x1a\x90\x19\xc8\x0c\x64\x06\x32\x03\x99\x2d\x0f\x99\x05\xd6\x17\xb5\xde\x3b\xa1\x05\x14\xa1\xb2\x56\x5c\xac\x6f\x16\xd4\x84\xb9\x6d\xd4\x4e\xd8\xee\xa3\xe7\x3f\x25\x73\x5b\x0a\xe3\xce\x2f\xa7\x63\x1b\xb5\xfb\x94\x88\xe0\xee\xfe\xe3\x7f\xe7\x7f\x3f\x14\xfd\x9a\x2c\x94\x4a\x84\x38\x71\x24\x75\x78\x33\x52\xc7\x5c\xa4\xaf\x5b\xf7\x26\x7d\xbb\x9d\xf6\xcb\x94\xb1\x16\xcd\x1a\xd9\xf4\x4d\xfa\xe7\xed\xdd\xfd\xc7\x3f\x8a\x8e\xe2\x7d\x3a\xfd\x7d\x8a\x05\xa9\xbb\x8a\xce\xe6\xb5\xfa\xdf\x6f\xb7\x2f\x78\xb3\xb6\xbe\xed\xf9\xf6\xee\xd9\x72\x64\x90\x1d\xc0\x4b\x63\x83\x77\x1b\xd0\x61\xce\x29\x2c\xcf\x71\x94\x15\x6f\x2f\xf7\xd1\x3d\xbc\x0b\xef\xa1\xe2\xd5\x30\x07\xa7\xdf\x8e\x77\xc9\x79\x4a\xcf\x51\x02\x84\x45\x7e\x4c\x8d\x26\xf1\xe0\xad\x9f\xf3\xd3\x31\x56\x25\x8a\xbe\xeb\x65\xaa\xfe\xac\x9f\xf3\x77\x2d\xb4\xa0\xe1\x44\xad\x9e\xa1\x30\x46\x18\x23\x8c\x11\xc6\x38\x37\xc6\x58\x61\x01\xd6\x71\xc6\x6a\x6f\x42\xb5\x25\x78\xd2\xda\xfb\xaf\x50\x70\x91\x77\xf5\x8d\x8e\x65\xb4\xc2\x19\x65\xe6\x41\xe6\xd9\xd2\xf1\x3c\x0f\x4a\x6c\x43\x69\x05\x3b\xb5\x5e\x89\x3b\x57\xd8\xae\x59\x59\x3c\x5f\xec\xdd\x64\x71\x5a\x8b\xb5\xff\xfc\xc7\xde\x15\x6b\xdb\x0f\x37\xc2\x6f\x2a\x99\xf1\xe1\xf2\xa9\x7d\xe1\xd1\x2b\x1f\xcf\x8d\x48\xc0\xe2\x71\xef\xeb\xb7\x6c\xeb\x7b\x96\x0a\xb4\xd3\x3a\x72\x63\x44\xb3\x6c\x25\xfe\xa9\xaf\xa8\x47\x4b\xcf\x9d\x1f\xc5\xb5\xb8\x73\x9c\x1f\xb5\x4b\x7a\x1d\xae\xd2\x7b\x37\x1c\xf8\x8d\x0a\x92\x29\x19\x9d\x4e\xad\x5b\x0c\x94\x79\x96\x61\x86\xe9\x6c\x60\xb8\x99\x28\xca\xe1\xf0\xd9\x24\xf2\x8f\xb4\x87\xcb\x76\x45\x60\x1c\x4f\xe2\x41\x3d\x9a\x08\xb6\x04\x22\x1c\x54\x89\x68\xf5\xd2\x53\x67\xaf\xcc\xe6\xf0\xa0\x84\xeb\xb9\xd7\xae\xda\x48\x3d\x41\x23\x1f\xd5\x4a\xfc\x23\xd9\xb0\x0d\x50\x4c\x5e\x8d\x48\x4b\xb4\x9f\x9e\xd4\xda\x96\x3b\xe5\x3c\x1f\x42\xcb\x0e\x5b\xae\xed\xbc\x89\x7c\x50\x5a\xe8\x62\xe3\x4b\x4b\xbf\x35\xb6\xb7\x4e\x14\x82\xc3\xa6\xad\xe3\xf6\xe2\x59\xba\x0f\xc2\x9b\x4c\x0f\x97\x0c\x8f\x8c\x1f\x28\xba\xc8\xa3\x59\x03\xe3\x53\xac\xcc\x7d\x3e\x29\xe9\x16\xde\x63\x8b\x61\xd6\xf7\x7c\xaf\x6f\xb9\xc8\xaf\x57\xe3\xd9\x1b\xcb\xf4\x3f\x25\x26\xa0\x99\x5c\xca\xe3\x02\xce\x36\xfd\x89\x10\x20\x42\x80\x08\x01\x22\x04\x88\x10\xe8\x2d\x42\xa0\xe1\x5e\x70\x14\x25\x70\xbe\x6d\xf1\xe7\x54\x52\xd1\xd6\x51\x32\x50\xc9\x12\x74\xef\x7b\x5b\xb9\xd1\xda\xd1\xbd\xe7\xd8\xd6\x73\x26\x1e\x3d\x9e\x74\x87\xac\xa4\x70\xda\xdd\xae\xfe\x6b\x25\x3e\x99\xf5\xcc\xa8\x2e\x5b\xe5\x86\x2f\xcb\x61\x4f\x55\xc2\xf3\xb7\x5f\xa4\x1b\xc7\xc7\xfb\x7b\x75\xf3\x28\x9d\xd8\x56\xfe\x7c\x69\xbe\xfe\x7c\x29\x1e\x6d\x57\x3a\xf6\xff\xc5\x1b\xc9\x83\x12\x72\xad\xb1\xb1\x77\x63\x90\xda\xfa\x60\x86\x99\xd3\x5f\x05\x87\x83\x8c\x7d\xba\x12\xef\x6d\xbd\x38\xa6\x6e\xdd\xf3\x8f\x9f\xed\x10\x24\xb0\x33\xe6\xb1\xb6\x51\xbc\xdd\x97\x36\x03\x6a\x9e\xe0\xe7\xf8\xd9\x4b\x55\x9e\x22\x40\xd7\xad\x61\xa6\x1f\x3d\x7c\x61\xbf\x78\xdf\xc5\x46\xfa\x0f\x72\x93\x71\x4e\x26\x46\x8d\xf2\x1f\x3d\xff\x29\x1c\x93\x42\x79\xfd\x9e\x7b\xa2\x72\x71\x69\xa5\x37\xd6\x58\xb7\x46\xb6\x76\xa8\x4d\x5a\xf6\xfa\x60\x0a\x6b\x5d\x41\x3b\x27\x92\x31\x0e\x34\x96\xd3\xdf\xc6\xda\xc0\x2a\x35\x98\xf1\x3e\x92\x50\xfa\x24\xd7\x23\x7b\xb1\x95\xb8\xb3\x2c\xb5\xdd\xe9\xbd\x29\x6d\xd9\x5d\x99\x67\xb8\x12\xd7\xd1\x04\xcc\x4e\xd0\xe0\x27\x71\xf5\x37\x69\x7d\xdd\xf8\xde\xde\x5d\x87\xbf\xd2\x79\x13\xfa\x47\x39\xc1\x19\x15\x32\xd2\x8f\xb3\x27\x89\x9f\xe0\x21\x39\xd3\x4f\xe2\xea\x83\xe7\xab\xd4\x69\x85\x25\x03\x4b\xae\xc3\xa7\x8f\xe4\x63\xd2\x6a\xf4\xf9\x02\x63\x7a\x1e\x9d\xf0\x31\x39\x47\x9b\x09\xb9\xcd\x4f\xf7\x61\x34\xce\x19\x87\xf3\x34\x1b\x87\xaa\x90\x9e\xa1\x46\x81\xe0\x9e\xde\xc6\xf7\x38\xc0\xe7\x7c\xbe\x8d\x21\x43\x7d\x9a\x09\xab\x22\xdc\xe7\xa5\xfa\x4f\x21\xa9\x83\x28\x9f\x88\xe9\x3e\xed\xe4\x6e\xdf\x94\xcf\x4d\x0e\x24\xa7\x0e\x2b\x49\x13\x36\x3b\xf2\x41\x5b\xea\x22\x5b\xf8\x88\x51\x17\x67\x09\x97\xd1\xde\x7c\xba\x70\x55\xa6\x70\xe7\xc5\x0a\x8c\x9f\xcc\x8f\x6c\xeb\x58\xa1\x8f\x3b\x23\x37\x85\xdc\xe1\x59\xd2\x88\xfb\xc5\x60\x9b\x6c\xe7\xe5\x64\x3b\x37\xdb\x59\xea\x32\x9e\xcf\x67\x82\x11\x97\x40\x5c\x02\x71\x09\xc4\x25\x10\x97\x50\xb4\xf8\x02\xbc\x27\x24\x11\x18\x28\x0c\x14\x06\x0a\x03\x85\x81\xc2\x40\xe7\xc5\x40\xc1\x12\x60\x09\xb0\x04\x58\xa2\x77\x2c\x71\x02\xba\x1f\x69\x3e\x72\x33\x11\x1e\xe7\x24\xbf\xd4\xe3\x36\x2a\xa0\x53\x7a\xc0\xb2\x0a\xce\xae\x52\x2c\xe3\xdb\xed\x2a\xe3\xc7\x9f\x73\x06\x62\x3d\x38\xea\xaa\xb4\xec\x19\x61\x51\x8b\xb2\xb2\x53\x29\x35\x73\x91\x1b\xb7\xcb\xad\x17\x74\x4c\xc6\x8c\xf5\x22\x64\x63\x08\x66\x0e\xe8\x14\x83\xb5\xcb\xef\xac\xe8\x95\xdf\xdb\xe2\xd0\x49\xc6\x27\x59\x47\xe9\x61\x1f\x6d\xd6\x91\xf6\x4e\xfc\x2a\x5d\xb9\x51\xbe\xf1\xb3\x85\x77\x25\x64\x10\x78\x96\xad\x0d\xc7\xc4\xa3\x25\xb5\x63\xd2\xf3\x85\x72\x77\xa1\x26\x17\x5b\xd2\x4f\xf2\x6b\x28\xc5\xdd\x17\x15\xa8\x58\x1d\x4a\xe7\xd6\xc4\x39\x38\x5a\x1d\xd4\xde\x2b\xcf\x17\xb7\x6f\x7f\x08\x7f\xeb\x4b\x4b\xe3\x2a\xc7\x73\x37\x46\xf9\xd1\x1e\x26\xcb\x73\x77\xd2\x76\xcd\xea\xa4\x3d\x38\x87\xdf\x6a\x17\x7e\x04\xd3\xc4\xc3\x73\xa2\xdf\x6f\x3c\x47\xba\x9b\x95\xe7\x6f\x6e\xb6\x5f\x37\x37\x7b\xd7\xb6\xbc\xb5\xba\xf9\xcb\xc7\xe0\x3e\x3c\x4b\x6b\x97\x70\x24\x9c\x2e\x87\x67\x54\xda\xd2\x74\x95\x98\xa6\x0a\xcc\xdb\x06\x0a\xcc\x3b\xe3\xdf\x1a\xdb\x8d\xbf\xad\xbd\x71\x13\x4d\x3b\xb6\x3b\x9f\x9f\xce\xa8\x95\x92\x49\xe8\x8c\x17\xa2\x55\xe5\x8d\x9b\xff\x17\x2e\x7b\xff\x39\x53\x01\x8e\xe6\xaa\xd8\x71\xd1\x0d\x4a\x6d\x64\xae\x8e\xe2\x35\x45\xc5\x8b\xe4\xe6\x05\x25\x37\x93\xc5\x45\x16\x17\x59\x5c\x64\x71\x61\x33\x96\xbd\x45\xa3\x4c\x99\x18\xc6\xfe\x22\xe3\xa3\x26\xe3\x63\x1a\x66\x58\xe2\xce\xee\x3c\xcf\xc3\x57\x72\x9d\x53\xbf\x9a\x1a\x53\xe1\xa1\x7d\x26\x77\xa4\x94\x12\xf5\x6f\x1d\xb2\xf5\x10\x7e\x92\xd6\x6e\x25\xc4\xfb\xf0\xff\xf8\xef\x4f\xd2\xd6\x3e\xbe\x40\x58\xce\x3e\xd8\x29\xff\xb0\xd5\x98\xd8\x4e\xe1\xd8\x5f\x95\xb8\x4a\x7a\x59\x5e\x85\x1a\x65\xac\x05\xad\xc4\xbd\x23\x5d\x57\x19\x55\x54\xeb\x29\xd2\x31\xaa\xd1\xed\x0f\x6d\xd6\x6e\x7d\x8f\x03\x69\x10\x89\xd0\x12\x05\xfc\x21\x16\x5f\xf8\xa4\xe2\xbd\x91\x58\xb8\x6b\x6c\x83\x58\x3a\x51\x54\xd3\x3e\x50\xbe\x0e\x47\x3a\xe8\xd2\xcf\x3d\x0b\x2a\xbc\x99\xf9\xc2\xe3\x71\x6f\x6d\xf8\xe6\x8a\xb6\x85\x8d\x9a\x88\x6b\xee\x25\x38\x57\x73\x99\xc8\x63\x52\x71\x0b\xe6\x15\xde\xca\xdd\x97\x62\x72\xab\xff\xcf\x7c\x53\x81\x18\x7b\xee\x77\x30\x5d\x42\xad\xc3\x3f\x5a\x15\x01\xbf\xd6\xc7\xfe\xb5\x7a\xe9\x7a\x52\xfe\x46\x35\xfa\x65\xb0\xf3\xe5\x4e\x6d\x6c\xeb\xba\xf9\x31\xe1\xe7\xe7\xe8\x97\x7a\x91\x6c\xa2\x74\x6c\xa5\xbf\xb3\x75\x76\x96\x09\x55\x6a\xa9\x80\xe8\xab\x8e\xc0\x99\xdb\x17\x57\xaf\x50\xde\xef\xb3\x31\x43\x02\x17\xef\xcc\x5d\xbc\xcb\x61\xeb\xb9\x4c\x87\xf8\xe5\x32\xd9\x38\xe1\x6a\x73\xc8\xf0\x7e\x55\xb2\x12\xbd\xd6\x0e\x2e\x93\x82\x2b\x1d\x7d\xa4\xeb\xb9\xd7\xe6\x68\xfd\x0b\xed\x63\x0e\xc4\xab\xbf\x07\x9e\x7b\x6f\x12\x9d\x7f\x0d\xd7\xbc\xe8\xf3\xa7\x78\x25\x3c\xfc\xf1\xf5\x98\xa0\x7f\xf3\x79\xf3\xc1\xf3\x2d\xed\x84\xdf\x78\x7a\xf0\x3d\xf1\xf9\xf2\x31\xfc\xdb\xe7\x4b\x71\x97\x91\xa6\x8e\xa3\x36\x1e\x73\x6d\x08\x44\x2f\xea\xb5\xb4\xf4\x00\xe8\x54\x59\xc7\xb6\x22\x1f\xa0\xb6\x1b\xbc\xef\xd1\xd8\x9a\x54\xd2\xad\xf2\xb6\x8e\x5a\x09\x73\x4d\x9d\x21\x1f\xcf\x29\x1d\xcd\x5c\x38\x10\xc9\xe5\xdb\x88\x37\xbc\x10\xe6\x83\xf9\x02\xf3\x61\x0c\xe6\xc3\x36\x17\x0a\x3c\x09\x03\x62\xdf\xb9\x53\x69\xeb\x48\xab\xad\x5a\x17\x1d\x3d\x63\xc5\x8e\x80\x49\x94\xba\x65\x29\x75\x23\xd2\x9d\xd8\xe2\x93\x6f\x08\x98\x5c\x96\x6e\xb2\x9f\x88\x6b\xf3\x42\x34\x8b\x3a\xd4\x99\x53\x55\x5d\xbf\x3a\xc7\x65\x51\x9a\xbd\xbb\xb6\xbf\xd9\xeb\xbd\x74\xd2\x29\x7b\x32\x29\xac\x91\x79\xf4\x55\x2a\xe0\xe6\xc7\x24\x54\xe7\x4a\x9f\xe9\xea\x50\x66\x29\x53\x37\x27\xd1\x88\x84\xed\x06\x3b\x25\x33\x1e\xcb\xbc\xbe\xf4\xbd\xd2\x0d\xf6\x4b\x2e\x3f\x89\x44\xba\xb1\xc6\x13\xe8\x3c\xd0\xf7\xdf\x94\xbb\xe0\x6c\x3a\x3d\x84\xcb\x48\xa9\xa3\x76\xe1\x8c\x6b\x17\xd6\x33\xa5\xba\xba\x85\xed\x3b\x3b\x37\xe3\x65\x54\x2b\xa4\x5a\x21\xd5\x0a\xa9\x56\x38\xb7\x6a\x85\xf5\x2b\x6f\x61\xa5\xc2\x9e\xa3\x13\xce\x56\x9f\xb0\xfe\xf1\xcb\x6b\x13\x8e\x59\x06\xa7\x54\x24\xac\x97\x41\x79\x35\xc2\x9e\x65\x40\x0d\x42\x6a\x10\x52\x83\x90\x1a\x84\xd4\x20\xec\xad\x06\x61\x83\xd5\xff\xa8\xfe\x60\x65\xee\xde\x82\x82\x13\x9b\x3d\xcd\x8c\x6b\x28\xd6\x8b\xbb\xaa\x7e\xe2\x79\xe5\x4e\xd5\xc4\x5e\x46\xf4\xb8\x62\x62\xcf\xc3\x3a\x68\x9d\xc4\x7a\xf1\x54\xd4\x48\xec\x7b\xd9\x1c\x6b\x65\xc4\x7a\xa1\x15\x80\x8c\xd6\xfe\xbc\xe8\xd3\x9f\x2f\xa2\x62\x05\x15\x39\x7a\x82\x63\x69\x22\xe6\xc6\xfb\x7d\x61\xe3\xa0\x4e\xc8\xd8\x9b\x83\x8e\xaf\xed\x98\x48\x1f\x0c\xcd\x84\x83\xf1\x72\x95\x31\x7a\x53\xe7\x6e\xcf\xd5\x60\x6a\x30\xb5\x09\x31\x35\x78\x1a\x3c\x0d\x9e\x06\x4f\x83\xa7\xc1\xd3\xe0\x69\xf0\x34\x78\x1a\x3c\x0d\x9e\x06\x4f\x83\xa7\xc1\xd3\xe0\x69\xf0\xb4\x69\xf1\x34\xea\x97\x80\x08\x27\x03\x94\x40\x84\x20\x42\x10\x21\x88\x30\x27\xb4\x01\x11\xe1\x83\xda\xc9\xdb\x9b\x56\x2c\x70\x90\x84\xd8\xdc\x98\x6f\xd4\x2e\xab\xbb\x9b\xe1\xad\x40\x79\x1b\xb5\x4b\x83\x3c\xfd\xfc\x77\xf7\x1f\xff\x28\x3a\x94\x54\xe0\x13\x19\x5b\x4a\x90\xb3\x6b\x05\xa7\x67\x4a\xea\xd8\x8b\xf4\xf5\x9b\xbe\x68\x15\x09\xaa\x3d\x76\xc5\x48\xd5\x0c\xcf\xa7\xa4\x56\xbc\x29\xc7\x1d\x32\xf4\x33\xbc\x4b\x4e\x46\xc3\x8c\xcc\xd5\xa1\x40\x50\x20\x28\x10\x14\x68\xe6\x14\xa8\x59\xc9\x96\x42\x12\x74\xb6\x6a\x3a\x14\x3d\x6a\x3c\x50\x43\x16\x3d\x3a\x1b\xba\x3b\xa1\xcc\x50\x21\xba\xa2\x7d\x13\xed\x9b\x46\x36\xfd\x4f\xa1\xb6\xcd\xe4\x52\x4e\x6e\xcf\x36\xfd\x61\xb8\x30\x5c\x18\x2e\x0c\x17\x86\xdb\x1b\xc3\x6d\xb8\x17\x1c\x71\x5c\xba\x1a\xd2\xd5\x90\xae\x86\x74\x35\x9c\x44\x57\xc3\xe6\x13\x72\xc6\xd1\x09\xcd\xc6\xa1\x2a\x42\x61\xa8\x51\x20\x56\xa1\xb7\xf1\x3d\x8e\x57\x38\x9f\x6f\x63\xc8\xc8\x85\x66\xc2\xaa\x88\x5e\x78\xa9\xfe\x53\x88\xeb\x00\xcc\x74\x2a\xcd\x73\xe5\xd4\xb1\x95\xed\x4a\x0f\x2a\xd3\x08\x13\x3a\x73\x0f\x75\x86\xee\xa5\xc6\x63\xe6\x47\x56\x76\xac\xda\x17\x26\x9b\x57\x30\xef\xf0\x2c\x47\xc4\xbb\xeb\x6e\xa6\xa4\xa7\xce\x38\x3d\xb5\xd9\x46\x53\x97\xa2\x7a\x3e\x8b\x8c\x30\x05\xc2\x14\x08\x53\x20\x4c\x81\x30\x85\xa2\xc5\x17\xfe\x3d\x21\x89\x80\x44\x41\xa2\x20\x51\x90\x28\x48\x14\x24\x3a\x2f\x24\x0a\xa5\x80\x52\x40\x29\xa0\x14\xbd\x53\x8a\x13\x48\xfe\x48\xb3\x2d\x9b\x89\xf0\x38\xe3\x72\x56\xed\xc2\x4b\x0f\x58\x56\x35\xd0\x6c\xef\x4f\xed\xcb\x5f\x1d\x77\x44\x5c\x36\x4c\x1a\x69\x87\xbd\x5a\x80\xd4\xa2\x2c\xe8\x54\xea\x6a\x5c\xe4\x06\xef\x72\xeb\x05\x1d\xd3\x32\x63\xcc\x08\xd9\x18\x8c\x99\x03\xba\x47\x63\x63\xee\xc6\x5e\xb0\x60\xd0\x92\x7d\x39\xd9\x49\xb4\x64\xa7\x25\x7b\xc1\xcd\x4c\x47\xbb\x99\x50\x5f\xf6\x17\xdd\xfd\xdb\xda\xbb\x37\xf1\xb7\xa3\xbc\xfd\x99\xaa\x95\x5a\x65\x99\x8e\x5a\x79\x21\xda\x17\xf1\x28\xe8\xa7\xd1\x63\x2d\x8f\xe6\x2a\x5b\x49\xfd\x0e\xaa\x76\x64\xae\x8e\x6e\x36\x45\xdd\x8c\x3c\xe9\x05\xe5\x49\x93\x10\x46\x42\x18\x09\x61\x24\x84\x61\x56\x96\xbd\x45\xa3\xcc\xbe\x18\xc6\x30\x23\x79\x24\xfa\x5d\x65\xf2\xc8\x84\x4c\xb3\xc4\x0b\xde\x79\xca\x88\xaf\xe4\x3a\xa7\x88\x35\xb5\xad\xc2\x43\x7b\xcf\x13\x49\xe9\x28\xea\xdf\x3a\xfa\xeb\x21\xfc\x24\xad\xdd\x4a\x88\xf7\xe1\xff\xf1\xdf\x9f\xa4\xad\xbd\x82\x81\xb0\x9c\x7d\xb0\x53\xfe\x61\xe7\x31\x61\xa2\xc2\xb1\xbf\x2a\x71\xf5\x9b\x7c\x52\xc1\x56\x5a\xea\x2a\x54\x30\x63\xa5\x68\x25\xee\x1d\xe9\xba\xca\x68\xa6\x5a\x6d\x91\x8e\xd1\x94\x6e\x7f\x68\xb3\x94\xeb\x7b\x1c\x48\xa1\x48\x84\x96\xe8\xe3\x0f\xb1\xf8\xc2\x27\x15\xef\x8d\xc4\xc2\x4d\x64\x1b\xc4\xd2\x89\x02\xa4\xf6\x81\xf2\x75\x64\xd3\x41\xb5\x7e\xee\x59\x50\xe1\xcd\xcc\x97\x43\x8f\x7b\xa7\xc3\x87\x17\xfd\xae\x64\xab\xd8\xa8\x29\xb9\xf0\x5e\x42\x86\x69\x22\x71\xfc\x98\x83\xc1\x6e\x1d\x58\xd2\xaa\x02\xf9\xb5\x3e\xf6\xaf\xd5\x2b\xd9\x93\xf2\x37\xaa\xd1\x2f\x83\x9d\x2f\x77\x6a\x63\x5b\xd7\xcd\x8f\x09\x3f\x3f\x47\xbf\xd4\x6b\x66\x13\x45\x64\x2b\xfd\x9d\xad\xf3\xbe\x4c\x10\x54\x4b\xa5\x64\x9b\xef\x52\x3c\x47\x44\x5f\xa1\xdf\xdf\x67\x43\x92\x04\x5e\xe0\x99\x7b\x81\x97\x43\xe8\x73\x89\x14\xf1\xcb\x65\x92\x7d\xc2\x25\xe7\x90\x40\xfe\xaa\x64\x39\x7a\xad\x7d\x60\x26\xc3\x57\x3a\xfa\x48\xd7\x73\xaf\xcd\xd1\xfa\x17\xda\x0d\x1d\x88\x57\x7f\x0f\x3c\xf7\xde\xe4\x51\xff\x1a\x2e\x7c\xd1\xe7\x4f\xf1\x72\x78\xf8\xe3\xeb\x31\x85\x0e\x34\x9f\x37\x1f\x3c\xdf\xd2\x7e\xfa\x8d\xa7\x07\xdf\x13\x9f\x2f\x1f\xc3\xbf\x7d\xbe\x14\x77\x19\x69\xea\x30\x6d\xe3\x54\xd7\xc6\x41\xf4\xa2\x5e\x4b\x4b\x0f\x80\xce\xc4\x75\x6c\x2b\x72\x13\x6a\x5b\xc2\xfb\x1e\x8d\xad\xc9\x54\xdd\x2a\x6f\xeb\xa8\x95\x30\xd7\xd4\x09\xf8\xf1\x9c\xd2\xc1\xd2\x85\x03\x91\x5c\xbe\x8d\x78\xc3\x0b\x61\x52\x98\x2f\x30\x29\xb2\x0f\x35\xb4\x49\xb1\x1d\x69\x03\xfa\x7a\xa3\x62\xdf\xb9\xf3\x69\xeb\x48\xab\xad\xaa\x17\x1d\x3d\x77\x65\x8f\x78\x4c\xb4\xbd\x05\x6a\x7b\x23\x52\xaa\xd8\xfb\x93\x6f\x88\xc7\x6c\x74\xf7\x73\xd5\x5c\xf6\x53\x72\x86\x5e\x88\x13\xe2\x19\x75\x2a\x57\x55\x6b\xb2\xce\xc9\x5b\x94\xf7\xef\xae\xed\x6f\xf6\x7a\x2f\x9d\x74\x0e\xa1\x4c\x2a\x7d\x64\x84\xb0\x4a\x45\xf1\xfc\x98\xc4\xff\x5c\xe9\x33\x5d\x1d\xea\x3e\x65\x0a\xf9\x24\x4a\x93\xb0\xdd\x60\xa7\x64\xc6\xd1\x99\x57\xa9\xbe\xd7\x7b\xcf\x7e\xc9\xe5\x4a\x91\xde\x37\xd6\x48\x05\x9d\x9d\xfa\xfe\x9b\x72\x97\x9e\xde\xa7\xc7\x71\x41\x39\x7e\xd4\x56\x9c\x71\x6d\xc5\x7a\x32\x55\x57\x57\xb1\x7d\x5f\xdd\x66\xd4\x8d\x6a\x8a\x54\x53\xa4\x9a\x22\xd5\x14\xe7\x56\x4d\xb1\x7e\xe5\x2d\xac\xa4\xd8\x73\x8c\xc3\xd9\xea\x27\xd6\x3f\x7e\x79\xed\xc4\x31\xcb\xe0\x94\x8a\x89\xf5\x32\x28\xaf\x96\xd8\xb3\x0c\xa8\x91\x48\x8d\x44\x6a\x24\x52\x23\x91\x1a\x89\xbd\xd5\x48\x6c\xb0\xfa\x1f\xd5\x47\xac\xcc\x0f\x5c\x50\x88\x63\xb3\xa7\x99\x71\x8d\xc7\x7a\x71\x57\xd5\x77\x3c\xaf\xdc\xa9\xea\xd8\xcb\x88\x1e\x57\x74\xec\x79\x58\x07\xad\xe3\x58\x2f\x9e\x8a\x1a\x8e\x7d\x2f\x9b\x63\xad\xdc\x58\x2f\xb4\x02\xa4\xd1\xda\x9f\x17\x7d\xfa\xf3\xe5\xa4\xac\xa0\xfe\x47\x4f\xc0\x2c\x4d\xc9\xdc\x78\xd3\x2f\x6c\x71\xd4\x09\x2d\x7b\x73\x50\xf4\xb5\x31\x13\x29\x85\xa1\xad\x70\xb0\x60\xae\x32\x96\x6f\xea\xdc\x2f\x64\x6d\x70\x36\x38\xdb\xd4\x38\x1b\x8c\x0d\xc6\x06\x63\x83\xb1\xc1\xd8\x60\x6c\x30\x36\x18\x1b\x8c\x0d\xc6\x06\x63\x83\xb1\xc1\xd8\x60\x6c\x30\x36\x18\xdb\x04\x19\x1b\x95\x51\xc0\x86\x93\x81\x4c\x60\x43\xb0\x21\xd8\x10\x6c\x98\x13\xda\xb9\xb0\xe1\xce\xf3\xe5\x46\xc5\xcc\xb0\x15\x0f\x1c\x24\x83\x36\x37\xd0\x1b\x5d\xe4\xf8\xd1\xf3\x9f\x92\x89\x2d\x85\xe1\x13\xe5\x44\x6f\xa3\x76\x9f\xcc\xf3\xdf\xdd\x7f\xfc\xef\xfc\x8f\x49\x18\x3e\x91\xab\x25\x42\x9c\x3a\x55\x33\x73\x22\x75\xc0\x45\xfa\xa2\x95\x2f\xd0\xb7\xdb\x69\xbf\x43\x19\xa3\xd7\xac\x8b\x8d\x5e\xa0\x7f\xde\xde\xdd\x7f\xfc\xa3\xe8\x10\x5e\xa3\xd3\x5f\xa3\x58\x90\xb3\x68\xf5\x68\x26\xc8\xff\x7e\xbb\x6d\xfb\x42\x59\x81\xbd\xf6\xed\x6f\x86\xf6\x9e\xa3\x5d\x4d\xaa\x8e\xbf\xf7\x28\xde\x7d\xfa\xf8\xb3\xbe\x7c\xc5\x8b\x10\xb5\xad\x89\xdf\x85\x77\xc9\x09\x0a\x0f\xa6\x69\x0d\x44\x14\x22\x0a\x11\x85\x88\xce\x90\x88\x36\x2b\x7d\x54\x48\x45\xcf\x56\x95\x8a\xe2\x61\x8d\x07\x6a\xc8\xe2\x61\x67\xc3\xd8\x27\x94\xeb\x2a\xc4\xb8\xb4\x50\xa3\x85\xda\xc8\xa6\xff\x29\x11\x0c\xcd\xe4\x52\x1e\xc5\x70\xb6\xe9\x4f\x3c\x03\xf1\x0c\xc4\x33\x10\xcf\x40\x3c\x43\x6f\xf1\x0c\x0d\xf7\x82\xa3\x98\x06\x3a\x8b\xd2\x59\x94\xce\xa2\x74\x16\x9d\x44\x67\xd1\xe6\x13\x72\xc6\x91\x3a\xcd\xc6\xa1\x2a\x5a\x67\xa8\x51\x20\x6e\xa7\xb7\xf1\x3d\x8e\xdd\x39\x9f\x6f\x63\xc8\x28\x9e\x66\xc2\xaa\x88\xe4\x79\xa9\xfe\x53\x88\xe7\x60\xc7\xcb\xec\x16\x5c\x84\x8c\x53\xc7\x54\x76\x09\x3e\xa8\x4a\x9d\x64\x36\x67\x68\x74\x71\x5a\x73\x11\xe3\xcd\xa7\x34\x9f\xb5\x47\xb0\xf1\x8e\xf9\x91\x45\x1d\xab\xf1\x71\xcd\x85\x26\x3c\x3b\x3c\xc3\x81\x66\xbf\x84\x61\x93\x86\xbd\x9c\x34\xec\x66\x9b\x48\x5d\x2a\xf6\xf9\xac\x2d\x42\x10\x08\x41\x20\x04\x81\x10\x04\x42\x10\x8a\x16\x5f\xd8\xf6\x84\x24\x02\xee\x04\x77\x82\x3b\xc1\x9d\xe0\x4e\x70\xe7\xbc\x70\x27\x04\x02\x02\x01\x81\x80\x40\xf4\x4e\x20\x4e\xa0\xf4\x23\xcd\x2a\x6e\x26\xc2\xe3\xcc\xe2\x59\xf5\xda\x2f\x3d\x60\x59\xf5\x6f\x57\x31\xb9\xf8\x76\xbb\x4a\x1c\xf8\xb3\xcd\x27\xac\x87\x43\x9d\xb5\x93\x3c\x03\x10\x6a\x51\xde\x76\x2a\xf5\x61\x2e\x72\x03\x76\xb9\xf5\x82\x8e\xe9\x97\x31\x56\x84\x6c\x04\xba\xcc\x8f\xbb\x41\x5d\xed\xd2\x35\x2b\x6a\x0a\x75\xbf\x00\x74\x92\xb9\x49\xf6\x50\x7a\xbc\x47\x9b\x3d\x94\xee\xae\x6f\x9c\x68\xba\x2e\x96\x0c\x02\xcf\xb2\xb5\x55\x98\xb8\xab\xa4\xf6\x3a\x7a\xbe\x50\xee\x2e\x54\xd3\x62\x33\xf9\x49\x7e\x0d\xa5\xb8\xfb\xa2\x02\x15\xeb\x3a\xe9\x1c\x99\x38\x97\x46\xeb\x7a\xda\x35\xe5\xf9\xe2\xf6\xed\x0f\xe1\x6f\x7d\x69\x69\x16\xe5\x78\xee\xc6\x68\x36\xda\x7d\x14\xda\xf9\xd2\x76\xcd\x5a\xa4\xdd\x33\x87\xdf\x6a\xff\x7c\x44\xca\xc4\xc3\x73\xa2\xbc\x6f\x3c\x47\xba\x9b\x95\xe7\x6f\x6e\xb6\x5f\x37\x37\x7b\xd7\xb6\xbc\xb5\xba\xf9\xcb\xc7\xe0\x3e\x3c\x4b\x6b\x7f\x6f\x24\x9c\x2e\x87\x67\x54\xaa\xd0\x04\x35\x94\xa6\xda\xc9\xdb\x06\xda\xc9\x3b\xe3\xb5\x1a\xcd\x1d\xbf\xad\xbd\x63\x13\x07\x3b\x9a\x5b\x9e\x99\x0a\xa8\x55\x8d\x71\xab\x80\x17\xe2\xa4\x7a\x18\x05\x5d\x5c\x7a\x2c\x8b\xd1\x4c\xa3\xca\x97\xc2\xa0\x00\x46\x89\x54\x51\xa3\xd2\x83\x3c\x5a\x35\x8a\x94\xe3\x05\xa5\x1c\x93\x5b\x45\x6e\x15\xb9\x55\xe4\x56\x61\x01\x96\xbd\x45\x23\xb2\x00\xb1\xa7\xc6\x90\x6f\x31\x72\x8b\x2a\x71\x34\x77\x9e\x65\xe1\x2b\xb9\xce\x29\x57\x4d\xec\xa3\xf0\xb0\x5e\x52\x2b\x52\x7a\x86\xfa\xb7\x0e\x98\x7a\x08\x3f\x49\x6b\xb7\x12\xe2\x7d\xf8\x7f\xfc\xf7\x27\x69\x6b\x27\x5c\x20\x2c\x67\x1f\xec\x94\x7f\xd8\x3d\x4c\x64\xa5\x70\xec\xaf\x4a\x5c\xfd\x26\x9f\x54\xb0\x95\x96\xba\x0a\x95\xc4\x58\xb1\x59\x89\x7b\x47\xba\xae\x32\xda\xa5\x56\x3d\xa4\x63\xb4\x9d\xdb\x1f\xda\x2c\xc7\xfa\x1e\x07\x52\x0a\x12\xa1\x25\x3a\xf5\x43\x2c\xbe\xf0\x49\xc5\x7b\x23\xb1\x70\x23\xd8\x06\xb1\x74\xa2\x98\xa2\x7d\xa0\x7c\x1d\x0c\x74\x50\x8f\x9f\x7b\x16\x54\x78\x33\xf3\x45\xb7\x33\xde\xad\x66\xb6\xf4\x6f\xd4\xd8\x3d\x69\x2f\x81\xa9\xe9\xfe\x21\x25\x97\xa7\x77\xc8\x39\xd8\xb0\x8e\xb3\x68\x55\x3f\xfb\x5a\x1f\xfb\xd7\xea\x55\xea\x49\xf9\x1b\xd5\xe8\x97\xc1\xce\x97\x3b\xb5\xb1\xad\xeb\xe6\xc7\x84\x9f\x9f\xa3\x5f\xea\xf5\xb0\x89\x52\xb1\x95\xfe\xce\xd6\x69\x50\x26\x26\xa8\x85\x82\xa1\xaf\x38\x47\xa2\x5d\xe1\x9d\xbd\xcf\x46\xe4\x08\xbc\xb2\x33\xf7\xca\x2e\x07\x6e\xe7\xf2\x08\xe2\x97\xcb\xe4\xba\x84\x4b\xcc\x21\x7f\xfa\x55\xc9\xf2\xf3\x5a\xfb\xa4\x4c\x82\xab\x74\xf4\x91\xae\xe7\x5e\x9b\xa3\xf5\x2f\xb4\x5b\x38\x10\xaf\xfe\x1e\x78\xee\xbd\x49\x23\xfe\x35\x5c\xe8\xa2\xcf\x9f\xe2\xe5\xef\xf0\xc7\xd7\x63\xa2\xee\xcd\xe7\xcd\x07\xcf\xb7\xb4\xdf\x7c\xe3\xe9\xc1\xf7\xc4\xe7\xcb\xc7\xf0\x6f\x9f\x2f\xc5\x5d\x46\x9a\x3a\x4a\xd9\x38\xb9\xb5\xa2\x1f\xbd\xa8\xd7\xd2\xd2\x03\xa0\x13\x51\x1d\xdb\x8a\xdc\x76\xda\x2e\xf0\xbe\x47\x63\x6b\x12\x35\xb7\xca\xdb\x3a\x6a\x25\xcc\x35\x75\xfe\x79\x3c\xa7\x74\xac\x70\xe1\x40\x24\x97\x6f\x23\xde\xf0\x42\x98\x07\xe6\x0b\xcc\x83\x01\x49\x7b\x2e\xbc\x76\xdc\x06\xc2\xbe\x73\xc7\xd0\xd6\x91\x56\x1b\xd5\x2d\x3a\x72\x8e\xca\x1b\xe1\x88\x68\x6c\x0b\xd1\xd8\x46\xa4\x18\xb1\x7f\x27\xdf\x10\x8e\x38\x6b\x8d\x63\x3f\x76\x87\xe4\x85\x68\x16\xda\xe7\x7a\x6b\x35\x58\xa3\xab\xdf\xbc\xb5\x3a\x21\xb6\x2f\xdd\xe6\x2a\x7f\x28\x31\x7e\x54\x98\xa2\xc2\x14\x15\xa6\xa8\x30\x45\x85\xa9\x41\x0c\x0e\xec\xc2\xc6\x03\x45\x93\xab\x31\x15\x02\x23\xe2\x7c\x41\x11\xe7\x54\x7d\xa3\xea\x1b\x55\xdf\xa8\xfa\x46\xd5\x37\xaa\xbe\x51\xf5\x8d\x44\x2c\x12\xb1\x48\xc4\x22\x11\x2b\x3f\x23\x69\x72\x45\x89\x49\x4a\x4c\x52\x62\x72\xe2\x25\x26\x0b\xd1\x1c\x38\x9e\x26\x57\x05\xc7\x8c\xaf\xc9\x55\x8e\xf0\x8e\xbb\xc5\x55\x0d\xc9\xce\x37\xb8\x6a\x4b\xaf\x69\x6f\x45\x7b\x2b\xf3\x15\xed\xad\x08\x3e\x20\xf8\x80\xe0\x03\x82\x0f\x08\x3e\x80\x6a\x03\x3a\xeb\x25\x02\xe8\x04\x74\x02\x3a\x01\x9d\x80\xce\x05\x83\x4e\xd8\x03\xec\x01\xf6\x00\x7b\xa0\xbd\x15\xed\xad\x68\x6f\x95\x7c\x73\x62\xee\xe3\x6f\xde\x5a\xd1\xdc\xaa\xf8\x67\xa3\x02\x41\xb4\xb6\xea\xaa\xb5\x55\x0d\xe0\x3a\x6e\x6c\x75\xde\x04\xcd\x33\xd5\x91\xd0\x0f\xd5\xec\xa5\x27\x5b\x68\x06\xd9\x42\x54\x91\xa0\x8a\x44\xc1\xcd\x8c\x59\x2f\x99\x52\x0d\x89\xd3\xee\x77\x04\x05\xd8\x4f\xb9\xe1\x99\x29\x7d\x67\x6e\x67\x75\xba\xd2\x77\x21\x4e\xa8\x78\x31\x40\x2b\xab\x13\x8b\x5d\x50\xe2\xa2\x50\xa2\x28\x4e\xe9\x41\x1e\xad\xe2\x44\x52\xf1\x82\x92\x8a\xc9\x9e\x22\x7b\x8a\xec\x29\xb2\xa7\xb0\xf9\xca\xde\xa2\xd1\xd8\x7c\xd8\x50\xc3\x67\x53\x8c\xda\x8a\x4a\xdc\xc9\x67\x6a\x60\x55\x63\x15\xe5\xdb\x57\x75\x94\x38\x41\xf3\xaa\x64\xe0\x9b\xab\x02\x34\xaf\x8a\xfe\xb1\x47\xb1\xe4\x1f\x1d\x33\x8a\xd6\x55\xe7\x45\xa5\xb9\xc6\x55\xc7\x17\xa7\x6d\x15\x6d\xab\x86\x69\x5b\x55\xa3\x56\x1c\x35\xad\x9a\x07\xad\xa6\x65\x15\x1e\xd8\xe5\xa1\x6b\x5a\x56\x75\x39\x6f\x68\x59\x85\x51\x80\x51\x50\x20\xc7\x09\x37\xac\x7a\x89\x59\x70\xb6\x76\x55\xb5\x9e\xa0\xa3\x66\x55\xf3\x50\xda\x08\x31\x44\x4f\x5b\x84\x9e\x36\x22\x75\x88\x5d\x3b\xf9\x86\x10\xc3\xe4\xd4\x73\xd3\x32\xce\xda\xa4\xaa\xa7\x80\xbd\xe8\x2f\x96\x23\x83\x60\xa0\x46\x55\x91\xca\xf1\x2e\xbc\x85\x13\x02\xf8\x92\x73\x94\x1d\x4f\x3c\x1f\x55\xa3\xa8\x1a\x45\xd5\x28\xaa\x46\x51\x35\x6a\x10\xd3\x03\x0b\xb1\xf1\x40\xd1\xb2\x6a\x4c\xc5\xbd\x88\x2e\x5f\x50\x74\x39\x95\xdc\xa8\xe4\x46\x25\x37\x2a\xb9\x51\xc9\x8d\x4a\x6e\x54\x72\x23\xe9\x8a\xa4\x2b\x92\xae\x48\xba\xca\xcf\x48\x5a\x56\x51\x36\x92\xb2\x91\x94\x8d\x9c\x78\xd9\xc8\x42\x48\x07\x98\xa7\x65\x55\xc1\x31\x23\x6b\x59\x55\x82\x79\x47\xdc\xb7\xaa\x21\xd8\xce\x34\xaf\x7a\x29\xcc\xa6\x83\x15\x1d\xac\xcc\x57\x74\xb0\x22\x16\x81\x58\x04\x62\x11\x88\x45\x20\x16\x01\xc8\x0d\xf7\xac\x97\x08\xdc\x13\xee\x09\xf7\x84\x7b\xc2\x3d\x17\xcc\x3d\x41\x11\xa0\x08\x50\x04\x28\x82\x0e\x56\x74\xb0\xa2\x83\x55\xf2\xcd\x29\x69\x91\x69\x1f\x3e\x6d\xac\x8a\x7f\x36\x3e\x38\x44\x2f\xab\x4e\x7a\x59\x35\x84\x5e\xb9\x86\x56\xc3\xe4\x70\x9e\xa3\xe4\x44\xe6\xc9\x9a\x2d\x04\x64\x15\xcd\x20\xab\x88\xba\x13\xd4\x9d\x28\xb8\x99\xd1\x2b\x2c\x93\x29\x3e\xd1\xee\xa6\x87\x2e\xd0\xde\xe6\xae\x67\xa6\x17\x9e\xb3\xd3\x55\x7b\xbd\xf0\x42\x9c\x5c\x3d\xe3\xdc\x4d\xaf\xda\x15\xce\xa0\x5c\x46\xfa\xea\x28\x57\x53\x54\xae\x48\x50\x5e\x50\x82\x32\x99\x58\x64\x62\x91\x89\x45\x26\x16\x76\x61\xd9\x5b\x34\x2e\xbb\x10\x13\x6b\x70\x13\xeb\xbc\x8d\xb0\xc6\x98\x99\x51\xd0\x0d\xab\xa1\xb9\x94\x69\x89\xd5\x71\x3a\x06\x7d\xb1\x92\x29\xd0\x5c\x47\xa0\x2f\x56\xf4\x8f\xcd\x8b\x6d\x60\xac\xcd\xb1\x86\x01\xb0\xe9\x0e\x59\xe5\x77\x40\x9b\x2c\xda\x64\x0d\xd0\x26\xab\xa1\xbe\x91\xed\x95\x35\x2f\x10\x4e\xc3\x2c\x7c\xb6\xcb\x03\xe2\x34\xcc\xea\x72\xde\xd0\x30\x0b\x6b\x01\x6b\x61\x6e\x5d\xb3\xba\xb0\x17\xce\xd3\x3a\xab\xb1\xdb\x28\xdb\x3f\x6b\x5e\x8a\x1c\x11\x8d\x28\x70\xcb\x51\xe0\x46\xa4\x27\xb1\x9d\x27\xdf\x10\xd1\x58\x70\xd3\x73\xd3\x41\xce\xd7\x53\xab\xe7\xd0\xc0\x6f\x9e\xb3\x7f\x52\x72\xb7\x93\xd6\x97\x27\x1d\x61\x31\x44\x6f\xad\x7f\xea\xbb\xb8\x4b\xee\xa2\x79\x98\xe0\xa1\xbf\x56\xd5\x39\x08\x1a\xa4\xae\x15\x75\xad\xa8\x6b\x45\x5d\x2b\xea\x5a\x0d\x62\x94\x60\x3b\x36\x1e\x28\x7a\x6c\x8d\xa9\xfc\x18\x21\xec\x0b\x0a\x61\xa7\xd6\x1c\xb5\xe6\xa8\x35\x47\xad\x39\x6a\xcd\x51\x6b\x8e\x5a\x73\x64\x76\x91\xd9\x45\x66\x17\x99\x5d\xf9\x19\x49\x8f\x2d\x0a\x5b\x52\xd8\x92\xc2\x96\x13\x2f\x6c\x59\x08\xeb\x40\xf6\xf4\xd8\x2a\x38\x66\x64\x3d\xb6\x2a\x50\xef\x88\xfb\x6c\x9d\x00\xb9\x33\xbd\xb6\xba\x00\xdb\xf4\xdb\xa2\xdf\x96\xf9\x8a\x7e\x5b\xc4\x25\x10\x97\x40\x5c\x02\x71\x09\xc4\x25\x00\xbc\x61\xa0\xf5\x12\x81\x81\xc2\x40\x61\xa0\x30\x50\x18\xe8\x82\x19\x28\x58\x02\x2c\x01\x96\x00\x4b\xd0\x6f\x8b\x7e\x5b\xf4\xdb\x4a\xbe\x39\x25\x6f\x32\xef\xc7\xa7\xe7\x56\xf1\xcf\xc6\x09\x8b\xe8\xbb\xd5\x49\xdf\xad\x13\x20\x58\xae\xf7\xd6\x70\xf9\x9d\xe7\xa8\x56\x71\xf4\x74\xcd\x16\x06\xb2\x8e\x66\x90\x75\x44\xc5\x0a\x2a\x56\x14\xdc\xcc\x24\x94\x98\xc9\x54\xad\x68\x7f\xe3\x43\x17\x8a\x6f\x7b\xe7\x33\xd3\x19\xcf\xd9\x8f\xeb\x65\x3a\xe3\x85\x68\x53\x78\xe3\xdc\x6d\xb9\xda\xd7\xdc\xa0\xd2\x06\x7a\xd7\x1c\xf4\x2e\x72\x9b\x17\x94\xdb\x4c\x12\x17\x49\x5c\x24\x71\x91\xc4\x85\xc9\x58\xf6\x16\x8d\xcf\x64\xc4\xf2\xca\x3c\xcf\x32\xda\x74\x8d\x35\xb9\xa3\xa0\x55\xd7\x09\x26\x54\xa6\x5d\x57\x0f\x19\x1d\xb4\xec\x4a\xa6\x42\x73\xbd\x81\x96\x5d\xd1\x3f\x36\x34\xb6\x85\x31\xb7\xed\x1a\x8e\xe1\xa6\x5b\x77\x55\xdf\x05\xed\xbb\x68\xdf\x35\x40\xfb\xae\x13\x74\x90\x6c\x0b\xaf\xf9\xf1\x74\xda\x78\xe1\xdb\x5d\x1e\x53\xa7\x8d\x57\x97\xf3\x86\x36\x5e\x58\x10\x58\x10\x73\x6c\xe5\xd5\x95\x0d\x71\x9e\x76\x5e\x27\xb9\x96\xb2\x2d\xbd\xe6\xa7\xd8\x11\x28\x89\x52\xb7\x2c\xa5\x6e\x44\xba\x13\x5b\x7c\xf2\x0d\x81\x92\x0b\xd2\x4d\xce\xd7\xe2\x6b\xc0\x68\xc3\x9b\xc0\xd4\xaf\x4b\x05\x1d\xf6\x03\xce\xcc\x75\xe2\xdd\xab\x7b\x84\x16\xd5\xe1\x63\x89\xe2\x4d\x87\x63\x14\x8c\x07\x1c\x03\x8e\x51\xf8\xcb\xe1\x38\x46\x07\x5b\x42\x35\xd1\x28\xd8\x13\x26\x69\xfe\xc2\x35\x30\x81\x97\x67\x02\xc3\x35\xba\x9c\x37\x70\x0d\x9c\x1e\x58\x14\x70\x8d\x9c\xd0\xce\xc0\x35\x3a\xb1\xfc\xab\x09\xc7\x5c\x14\x3d\x38\x07\x4a\xde\xb2\x94\xbc\x11\xe9\x52\x6c\xf9\xc9\x37\x70\x8e\x05\xe9\x2a\xb3\xe2\x1c\xba\x26\xdc\x8d\x15\xd8\x6b\xdf\xfe\x66\x76\xff\xfe\xc0\x46\x54\x3b\xd8\x5d\xdb\xdf\xec\xf5\x5e\x3a\xe9\x3a\x84\x32\xa9\x16\xfe\xee\xd3\xc7\x9f\xf5\xcd\xac\x52\x29\xc4\x3f\x26\xc9\xc7\x57\xfa\x2c\x57\x87\xbe\x11\x99\x46\x00\x89\x22\x24\x6c\x37\xd8\x29\x99\xf1\x62\xe6\xd5\xa4\xef\x19\x6f\x58\x72\xdd\x5f\x72\xc5\xd6\x28\x09\x38\xd6\x66\x52\xba\xa2\xe5\xfb\x6f\xcb\x5d\x8c\xf4\xf8\x9d\xb3\x38\x60\xf2\x92\x9c\x8f\xc4\xd0\x7b\x69\xc6\xbd\x97\xea\xb1\x52\x5d\xdf\xa5\x4a\xbf\x55\x07\xc8\x8c\x6e\x4b\x74\x5b\xa2\xdb\x12\xdd\x96\xe6\xd6\x6d\xa9\x7e\xe5\x2d\xec\xb4\xd4\x73\x80\xc2\xd9\xfa\x2b\xd5\x3f\x7e\x79\x6f\xa5\x31\xcb\xe0\x94\x8e\x4a\xf5\x32\x28\xef\xa6\xd4\xb3\x0c\xe8\xa1\x44\x0f\x25\x7a\x28\xd1\x43\x89\x1e\x4a\xbd\xf5\x50\x6a\xb0\xfa\x1f\xf5\x4f\xaa\x2c\x3e\xb8\xa0\xf8\xc4\x66\x4f\x33\xe3\x1e\x50\xf5\xe2\xae\xea\xff\x74\x5e\xb9\xd3\xf5\xa9\x97\x11\x3d\xee\xf8\xd4\xf3\xb0\x0e\xda\xe7\xa9\x5e\x3c\x15\x3d\x9e\xfa\x5e\x36\xc7\xda\xd9\xa9\x5e\x68\x05\xf8\xa2\xb5\x3f\x2f\xfa\xf4\x67\x2b\xf0\x55\x50\x4d\xbc\x27\xfe\x95\x86\x5e\x6e\xbc\xcf\x7b\x8f\xe2\xab\xed\xae\x3b\x86\x5f\x6f\x0e\x7a\xbd\xb6\x5d\x22\x1d\x30\x34\x0d\x0e\x06\xcb\x55\xc6\xd0\x4d\x9d\xbb\x05\x3a\x03\x9b\x81\xcd\xa6\x82\xcd\x40\x66\x20\x33\x90\x19\xc8\x0c\x64\x06\x32\x03\x99\x81\xcc\x40\x66\x20\x33\x90\x19\xc8\x0c\x64\x06\x32\x03\x99\x81\xcc\x26\x82\xcc\xd2\x85\x4a\x4a\x5c\x0d\x54\x28\x81\x00\x0e\xcf\x8b\x20\x80\x10\x40\x08\x20\x04\x30\x27\xb4\xe1\x09\xa0\xeb\xad\xd5\x48\x12\xdf\x7e\xf3\xd6\xea\xfc\x69\x6f\xe1\x55\x49\x7a\x83\xde\x4d\x89\xde\x9d\x39\xe9\x2d\x7c\x45\xe0\x77\xf0\x3b\xf8\x1d\xfc\x0e\x7e\x07\xbf\x83\xdf\xc1\xef\x3a\x5a\x6d\xe1\x77\xf0\x3b\xf8\x1d\xfc\x0e\x7e\x07\xbf\x83\xdf\x2d\x8e\xdf\x01\xbc\x00\x5e\x00\xaf\x69\x8c\x28\xc0\x2b\x2b\x1e\x80\xd7\x74\x81\xd7\x78\x12\xde\x3a\x83\x5e\x67\x4c\x77\xcb\xf1\x00\x70\x19\xb8\x2c\x77\xd6\x71\xe1\x32\x50\x19\xa8\x0c\x54\x06\x2a\x03\x95\x81\xca\x40\x65\xa0\x32\x50\x19\xa8\x0c\x54\x06\x2a\x03\x95\x81\xca\x40\x65\xa0\xb2\x49\xa0\xb2\x5c\xaa\xdb\xb1\xa3\x81\x44\x37\xb8\xdf\xf0\x94\x08\xee\x07\xf7\x83\xfb\xc1\xfd\x72\x42\x1b\x98\xfb\x45\x7f\xb7\x1c\x19\x04\xa3\x48\x77\x8b\x70\xda\xbb\xf0\x86\xce\x9c\xf3\x96\xbe\x34\x89\x6f\x90\xbc\x29\x91\xbc\x73\x26\xbe\xa5\xdf\x13\x90\x1e\x48\x0f\xa4\x07\xd2\x03\xe9\x81\xf4\x40\x7a\x20\xbd\x8e\x56\x5b\x90\x1e\x48\x0f\xa4\x07\xd2\x03\xe9\x81\xf4\x40\x7a\x8b\x43\x7a\x50\x30\x28\x18\x14\x6c\x1a\x23\x0a\x05\xcb\x8a\x07\x0a\x36\x75\x0a\x36\x92\x1c\xb8\xce\x49\xd8\xb9\x12\xe1\x4a\xf8\x00\x0c\x0d\x86\x96\x3b\xeb\xb8\x18\x1a\xfc\x0c\x7e\x06\x3f\x83\x9f\xc1\xcf\xe0\x67\xf0\x33\xf8\x19\xfc\x0c\x7e\x06\x3f\x83\x9f\xc1\xcf\xe0\x67\xf0\x33\xf8\xd9\x74\xf8\x59\x3a\x25\xae\xdc\xdb\x40\x5e\x1c\x44\x70\x78\x7e\x04\x11\x84\x08\x42\x04\x21\x82\x39\xa1\x0d\x4c\x04\xbf\x79\xce\xfe\x49\xc9\xdd\x4e\x5a\x5f\x42\x3d\x79\x0c\xa9\x71\xff\xd4\xf7\x74\x97\xdc\xd3\x99\xd3\xe3\xf2\x97\x27\x45\x0e\xbc\x37\x25\xbc\x77\xce\x14\xb9\xfc\xbb\x02\xe6\x03\xf3\x81\xf9\xc0\x7c\x60\x3e\x30\x1f\x98\x0f\xcc\xd7\xd1\x6a\x0b\xe6\x03\xf3\x81\xf9\xc0\x7c\x60\x3e\x30\x1f\x98\x6f\x71\x98\x0f\x28\x06\x14\x03\x8a\x4d\x63\x44\x81\x62\x59\xf1\x00\xc5\x66\x00\xc5\x46\x92\x29\xd7\x0b\x18\x3b\x57\xb6\x5c\x05\x2a\x00\xa9\x81\xd4\x72\x67\x1d\x17\x52\x03\xa7\x81\xd3\xc0\x69\xe0\x34\x70\x1a\x38\x0d\x9c\x06\x4e\x03\xa7\x81\xd3\xc0\x69\xe0\x34\x70\x1a\x38\x0d\x9c\x06\x4e\x9b\x16\x4e\x4b\x67\xcd\x55\x7b\x1c\xc8\x9c\x03\x12\x0e\x8f\x94\x80\x84\x40\x42\x20\x21\x90\x30\x27\xb4\xa1\x20\xe1\x83\xda\xc9\xdb\x9b\x56\x2c\xb0\x6f\x9e\xd5\x84\x33\x6e\xd4\x2e\xab\xbb\x9b\xb1\xad\xe0\x78\x1b\xb5\x4b\x28\x9e\x7e\xf8\xbb\xfb\x8f\x7f\x14\x1d\x37\x14\xc6\x9b\x2c\x5d\x4b\x09\x52\x67\x19\xce\x06\xb1\xe9\x69\x92\x3a\xf0\x22\x7d\xf1\x46\xef\x97\x15\xd8\x6b\xdf\xfe\x66\x18\x56\xf2\xa6\x19\x93\xa8\x5b\xf0\x6e\xce\x29\x2c\xcf\x71\x94\x15\xaf\xf9\xef\x3e\x7d\xfc\x59\x5f\xbe\xe2\xbd\x30\x07\x66\x5f\x8d\x77\xc9\x59\x0a\xcf\x50\x42\xe6\x44\x7e\x30\xcd\xe2\xf7\xe0\xad\x9f\xf3\xf3\x30\x5e\xfd\x8a\xbe\xeb\x65\x8e\xfe\xac\x9f\xf2\x77\x2d\xae\xa0\xe1\x0c\xad\x9e\x9a\xc0\x1e\x60\x0f\xb0\x07\xd8\x33\x37\xd8\x53\xa1\xb4\xd6\x01\x9f\x6a\x03\xa8\x5a\x79\x3d\x69\xed\xfd\x57\x28\xb8\xc8\xcd\xf5\x46\x57\x62\xb0\xc2\x19\x65\xe6\x41\xe6\xd9\xd2\x81\x15\x0f\x4a\xfc\xff\xec\x9d\xcf\x73\xa3\x46\x16\xc7\xef\xfe\x2b\xba\xbc\x07\x27\x95\x58\xde\x99\xcb\xa6\x26\x27\x67\x66\x52\x3b\xf9\x31\x71\xed\xa4\xb2\x97\xc9\xa1\x0d\x6d\x99\x1d\x0c\x2a\x40\xf6\x7a\xb7\xf6\x7f\xdf\xa2\x1b\x10\x42\x20\x21\x8c\xf8\xf9\xc9\x25\x53\x96\x04\x4d\x77\xd3\xfd\x5e\x7f\xde\x7b\xdf\x55\xdc\x5b\x61\xa4\xec\x85\xb8\xf6\x84\xe3\x99\x95\xc5\x0f\xc4\xda\xcb\x16\x27\x5b\xd8\xc1\xf3\x3f\xd6\x9e\xb0\x9d\x20\xde\x04\x1f\x55\x36\xe3\xe3\xe5\x53\x1f\x4a\x26\xaf\x7c\x3a\x37\x92\x0e\x16\x77\xeb\x40\xbf\x65\xab\xc0\xb7\x54\xa8\x4f\x0f\x13\xcf\x2b\x99\x65\x0b\xf1\x87\xbe\xa3\x1e\x2d\x3d\x77\xde\x88\x4b\x71\xed\xba\x6f\xf4\xd9\xa0\x1d\xaf\xd2\x6b\x2f\x1e\xf8\xd8\x87\x49\xa7\x64\x72\x39\x65\x37\x18\x28\xf3\x2c\xfd\x0c\x53\x67\x84\xae\x5e\x57\x54\x53\xba\xce\x7a\xe4\xf7\xbc\x53\xee\x78\x22\x34\xbe\xb2\xb8\x55\x77\x26\x94\x28\x3b\xcd\xdd\x98\x12\xc9\xea\xa5\xa7\xce\x5a\x99\xcd\xe1\x36\x76\x47\xbd\x4b\x4f\x2d\xa5\x9e\xa0\x89\x5b\xbd\x10\xbf\x67\x1b\xb6\x21\x3b\xd9\xab\x91\xd8\x87\xce\xc3\x83\xb2\x1d\x19\x29\xf7\x79\x13\xe3\xb3\xd9\x72\x1d\xf7\xdb\xc4\x6d\xd6\x9d\x2e\x96\x81\xb4\xf4\x5b\xe3\xf8\x76\x66\x10\x6c\x36\x6d\x1d\x40\x95\xce\xd2\x75\x18\x37\x32\x3f\x5c\x32\xfe\x65\xfa\x40\xc9\x4d\xee\xcc\x1a\x98\x5e\x62\x61\xda\xf9\xa0\xa4\x57\xda\xc6\x06\xc3\xac\xdb\x7c\xa3\x9b\x5c\x76\x14\x71\xe0\x30\x62\x28\xd3\xff\x18\x38\x5b\xaf\x5f\xaa\x01\x6d\x67\xd3\x1f\x54\x0b\xaa\x05\xd5\x82\x6a\x41\xb5\x27\x43\xb5\x35\xf7\x82\x1d\x5c\xdb\xdd\xb6\xf8\x2e\x97\xed\xb1\x72\x95\x0c\x55\xb6\x04\xdd\x04\xfe\x4a\x2e\xb5\x75\x74\xe3\xbb\x8e\xf5\xbc\x15\x18\x9c\x4e\xba\x4d\xba\x48\x3c\xed\x5e\x2d\xfe\xb6\x10\x9f\xcc\x7a\x66\x4c\x97\x95\xf2\xe2\x97\x65\xb3\xa7\x2a\xe1\x07\xab\x7b\xe9\xa5\x81\xca\xc1\x5a\x5d\xdd\x49\x37\xf5\x95\x3f\x9f\x9b\x8f\x3f\x9f\x8b\x3b\xc7\x93\xae\xf3\x9f\x74\x23\xb9\x55\x42\xda\x9a\x74\xf9\x57\x86\x02\xd8\x1b\x37\xcc\x5c\xfe\x22\xdc\xfc\xc8\xf8\xa7\x0b\xf1\xde\xd1\x8b\x63\xae\xe9\x7e\xb0\xfb\x6c\x1b\xae\x19\x19\xf7\x58\xfb\x28\x7e\x74\xdf\x64\x40\xcd\x13\xbc\x4b\x9f\xbd\xd2\xe4\x29\x63\x0a\xed\x3a\x66\xfa\xd1\xe3\x17\xf6\xde\x7f\x12\x4b\x19\xdc\xca\xe5\xd6\xb1\x64\xe6\xd4\xa8\xe0\xce\x0f\x1e\xe2\x31\x29\xed\xaf\xdf\x0a\x4f\x54\xdd\x5d\xda\xe8\x4d\x2d\xd6\x95\xe9\x5b\x27\xb6\x26\x2d\xc7\xde\xb8\xc2\xda\x56\xd0\x87\x13\xd9\x18\xc7\x9b\x75\xb2\x93\xa6\xd6\xc0\x22\x37\x98\xe9\x3e\x92\x81\xc5\x2c\xe8\x7e\xfb\x66\x0b\x71\x6d\x59\x6a\x15\xe9\xbd\x29\xef\xd9\x5d\x98\x67\xb8\x10\x97\xc9\x04\xdc\x9e\xa0\xe1\xf7\xe2\xe2\x07\x69\x7d\x59\x06\xfe\xda\xb3\xe3\x6f\xe9\x00\x76\xfd\xa5\x42\xc7\x19\x13\x32\xb1\x8f\xb7\x2f\x92\x3e\xc1\x6d\x76\xa5\xef\xc5\xc5\x8f\x7e\xa0\x72\x97\x15\x96\x0c\x2d\x69\xc7\x4f\x9f\xf4\x8f\xc9\x6f\xd0\xd7\x0b\x8d\xeb\xb9\x73\xc1\xbb\xec\x1a\x4d\x26\xe4\xaa\x38\xdd\xfb\xb1\x38\x27\x1c\x81\x50\x6f\x1c\xf6\x45\x21\xf4\x35\x0a\xc4\x23\x9c\x6c\x7c\x77\x63\x12\xba\x3b\xdb\xe8\x33\x3a\xa1\x5e\x67\xed\x89\x50\x78\xa9\xfd\x53\xca\xe8\x40\xc9\x47\x62\xba\x4f\x91\x8c\xd6\x75\xf9\xdc\x08\x09\x72\xee\x87\x15\x99\x9a\x66\x4f\xde\xd8\x4b\x5d\x25\x6d\x96\x81\xde\x62\xb6\x66\xe1\x69\x76\x53\x36\x5b\x4f\x27\x37\xe7\x64\x41\xe2\x5b\xa7\x06\x7d\x9a\x49\x5e\x07\x6f\xc7\x57\x28\xc0\xed\x97\x20\x6d\x12\x4e\xe7\x93\x70\x5a\x6f\x4f\x39\x94\x74\xda\x9d\xf3\x45\x44\x02\x11\x09\x44\x24\x10\x91\x40\x44\x42\xd9\xe2\x0b\xea\x1e\x51\x8f\x40\x3f\xa1\x9f\xd0\x4f\xe8\x27\xf4\x13\xfa\x39\x2d\xfa\x09\x90\x00\x48\x00\x24\x00\x12\x27\x07\x12\x47\x40\xfb\x81\x26\x4f\xd6\xeb\xc2\xdd\x04\xca\x97\x9e\xb8\x0d\x0a\xe5\x54\xfe\x60\x5e\xc5\x3d\x17\x29\xc3\x48\x28\xc4\x22\x3b\xc5\x9f\x76\xca\xe1\x61\x60\xd4\xa5\x50\x5e\x2b\x90\xa8\x41\x5d\xcf\xb1\x54\xc5\x38\x2b\x8c\xda\xf9\xca\x0f\x5b\x26\x62\xc6\x77\x11\xb2\x16\xfc\x32\x5f\x6e\x11\x7f\x35\xcb\xe8\xdc\x53\x4e\xe5\x44\x8b\x42\x2b\x19\x9e\x64\x19\xe5\x07\x7d\xb0\x59\x46\xfa\x4c\xe2\x57\xe9\xc9\xa5\x0a\xcc\xe9\x9a\x2e\x0d\x24\xc3\xd0\xb7\x1c\xed\x2e\x66\xe7\x58\x52\x1f\x47\xfa\x81\x50\x5e\x14\xdb\x6f\xa9\xff\xfc\x20\xbf\xc4\xbd\x18\xdd\xab\x50\xa5\x46\x50\x3e\x97\x26\xcd\xb9\xd1\x46\xa0\x3e\xb3\xf2\x03\xf1\xea\xf5\x77\xf1\x77\x03\x69\x69\x48\xe5\xfa\xde\xd2\x98\x3c\xfa\x5c\xc9\xf2\xbd\x48\x3a\x9e\x59\x95\xf4\xb9\xcd\xe6\xbb\xfa\xe0\x3e\x41\x68\xe2\xf6\x39\xb3\xea\x97\xbe\x2b\xbd\xe5\xc2\x0f\x96\x57\xab\x2f\xcb\xab\xb5\xe7\x58\xbe\xad\xae\xfe\xf2\x21\xbc\x89\xaf\xd2\xf8\x20\x38\xe9\x9c\x36\x87\x67\x50\x36\xd2\x58\x4d\x97\xba\x66\xcb\xeb\x1a\x66\xcb\x5b\x73\xa6\x35\xac\x66\xbf\x3e\xd8\x6c\x13\x39\x3b\xac\x76\x4f\xd1\x4a\xd4\x86\xc8\x08\xac\xc4\x33\x71\x7c\x69\x8d\x12\x5d\x8b\x13\x56\xd8\xa8\x67\x79\x95\x56\xd5\xa0\x96\x46\x45\xd7\x62\x69\xe5\x07\x79\xb0\x96\x16\xd9\xcb\x33\xca\x5e\x26\x4d\x8b\x34\x2d\xd2\xb4\x48\xd3\xc2\x49\xac\x7a\x8b\x86\xe6\x24\xe2\x6d\xe5\x9e\x66\x00\x49\x1c\x63\xf0\xb7\xb2\x93\xea\xd6\x53\x37\x02\x25\xed\x82\xc1\x55\xc7\x71\x8a\x7f\x76\xba\x7c\x8d\x9c\x01\xa2\xfe\xad\xa3\xb0\x6e\xe3\x7f\x49\x2b\x5a\x08\xf1\x3e\xfe\x7f\xfa\xf7\x07\xe9\xe8\x03\xbc\x50\x58\xee\x3a\x8c\x54\xb0\xd9\x56\x4c\xb8\xa6\x70\x9d\x2f\x4a\x5c\x7c\x94\x0f\x2a\x5c\x49\x4b\x5d\xc4\xd6\x63\x6a\xf1\x2c\xc4\x8d\x2b\x3d\x4f\x19\xb3\x53\xdb\x24\xd2\x35\x66\xd0\xab\xef\x9a\xac\xd3\xba\x8d\x3d\x59\x0b\x59\xa7\x65\xc6\xf6\x6d\xda\x7d\xf1\x93\x8a\xf7\xa6\xc7\xe2\x1d\x62\x15\xa6\xbd\x93\x04\x2a\xad\x43\x15\xe8\x08\xa3\x8d\xdd\xfc\x7c\xe2\x8e\x8a\x1b\x33\x5d\x1e\x3c\xf5\x6d\x6c\x8a\xdb\xc1\x52\x8d\xe2\xec\xed\x25\x84\x36\xaf\xc6\x50\xd1\x06\x64\x18\xba\x00\xce\x3a\x96\xa3\x51\x19\xef\x4b\xfd\xdb\x6f\xf6\x2f\x5a\x0f\x2a\x58\xaa\x5a\xdf\x0c\xa3\x40\x46\x6a\xe9\x58\x97\xf5\x7f\x13\xff\xfb\x39\xf9\xa6\x5e\x1e\xeb\x18\x1a\x2b\x19\x44\x8e\x4e\xb5\x32\x71\x47\x0d\x8c\x8e\xd5\x96\xc6\xef\xd4\x30\xf9\x9e\xa3\xdc\x9b\xed\xd0\x1f\xc1\x11\xee\xc4\x8f\x70\xe7\x03\xcb\x0b\x09\x0b\xe9\xcb\x65\x92\x6a\xe2\x75\x66\x93\xa8\xfd\x55\xc5\x1a\xf4\xb5\x3e\xc0\x32\x99\xb4\xd2\xd5\xbf\xf4\x7c\xef\xd2\xfc\x5a\x7f\x43\x9f\x21\x87\xe2\xab\x9f\x42\xdf\xbb\x31\xf9\xca\xbf\xc6\xab\x5d\xf2\xef\x4f\xe9\x1a\xb8\xf9\xe3\xd7\x43\xa2\xf8\xf5\xe7\xcd\x8f\x7e\x60\xe9\x43\xf6\xa5\xaf\x07\xdf\x17\x9f\xcf\xef\xe2\xbf\x7d\x3e\x17\xd7\x5b\xbd\xa9\xc3\xa1\xcd\x89\xb8\x36\xfe\x93\x17\xf5\x52\x5a\x7a\x00\x74\xc6\xab\xeb\x58\xc9\x19\x9f\xf6\x15\xfc\xa7\x64\x6c\x4d\x46\xe8\x4a\xf9\x2b\x57\x2d\x84\xb9\xa7\x4e\x74\x4f\xe7\x94\x0e\x4a\x2e\x1d\x88\xec\xf6\x4d\xba\x37\xbe\x11\x2e\x83\xf9\x00\x97\x61\x08\x2e\xc3\xaa\x4b\xc1\xf6\x76\x9c\x86\x75\xeb\x07\x48\x2b\x57\x5a\x4d\xcc\xb9\xe4\x97\x93\x35\xe8\x88\x7b\xc4\x94\x9b\x93\x29\x37\x20\x8b\x89\x8d\x3d\xfb\x84\xb8\xc7\x8a\x66\x4f\xd2\x1e\x59\x8f\xe2\x08\xf3\x4c\x1c\x11\x3e\xe8\xf9\xb6\xea\x4d\x97\xeb\xa3\x6f\xab\x63\xe3\x07\xf3\xaa\x5c\xc5\xdf\x13\x47\x48\x05\x2c\x2a\x60\x51\x01\x8b\x0a\x58\x54\xc0\xea\xc5\x1d\xc1\x6b\xac\x3d\x50\x68\x72\x0d\xa9\x50\x19\x51\xed\x33\x8a\x6a\xa7\x2a\x1d\x55\xe9\xa8\x4a\x47\x55\x3a\xaa\xd2\x51\x95\x8e\xaa\x74\x24\x7b\x91\xec\x45\xb2\x17\xc9\x5e\xc5\x19\x89\x26\x17\x25\x30\x29\x81\x49\x09\xcc\x91\x97\xc0\x2c\xe5\x73\xc0\x7a\x34\xb9\xc6\xa3\xc9\x55\xc0\xbc\xfd\xa7\x75\x1e\x54\xe4\x3a\x00\xb6\x4b\xf5\xb8\x9a\xc2\x6c\xd4\xb8\x50\xe3\x32\x1f\xa1\xc6\x45\x2c\x02\xb1\x08\xc4\x22\x10\x8b\x40\x2c\x02\x90\x1b\xee\x79\xb8\x47\xe0\x9e\x70\x4f\xb8\x27\xdc\x13\xee\x39\x63\xee\x09\x8a\x00\x45\x80\x22\x40\x11\xa8\x71\xa1\xc6\x85\x1a\x57\xf6\x49\x93\x1c\xc9\x8f\xbe\xad\xd0\xe2\xea\x54\x65\xe1\xa5\x70\x08\x25\xae\xb6\x94\xb8\x0e\x40\xaf\x0a\x1d\xae\x6e\x73\x38\xbb\xac\x46\xa1\x9f\xac\xde\x42\x40\x56\xd1\x04\xb2\x8a\xa8\x45\x41\x2d\x8a\x92\xc6\x0c\xde\x60\x19\x5d\x25\x8a\xe3\x1a\x3d\x94\x8a\xf0\xc7\xb4\x7a\x8a\x76\x61\xc7\xea\x5b\x0d\xed\xc2\x33\x71\x6c\xf1\x8c\x1e\x94\xb7\x9a\xd4\xcd\xa0\x5a\x46\x69\xb7\x62\x5b\xe5\x07\x79\xb0\xb6\x15\xf9\xc9\x33\xca\x4f\x26\x11\x8b\x44\x2c\x12\xb1\x48\xc4\xc2\x2d\xac\x7a\x8b\x86\xe5\x16\xe2\x61\x0d\xc3\xc3\xea\x5c\x71\x6b\x70\x89\x19\xe5\x7a\x5b\x07\xdc\xa5\x52\xb5\xad\x96\xb2\x31\xd0\xda\xca\x46\xbf\xbe\x8d\x80\xd6\x56\xf2\x1f\x9b\x17\xdb\xc0\xd0\x95\xb6\x7a\xe0\xaf\x05\x9d\xad\xdd\x16\xa0\xb2\x85\xca\x56\x3f\x2a\x5b\x07\x4c\x8d\x72\x8d\xad\x69\x20\x70\x14\xb6\x38\xae\x9d\x1f\x0a\x47\x61\xab\xcd\x79\x83\xc2\x16\x8e\x02\x8e\xc2\x54\xf5\xb5\x5e\xec\x2a\x74\xa6\xae\x75\xf0\xc4\xa8\x5c\x5b\x6b\x1a\x86\x1c\xb1\x8c\x18\x70\xf3\x31\xe0\x06\x64\x27\xb1\x9d\x67\x9f\x10\xcb\x58\xd2\xe8\x49\xda\x20\x9d\x6a\x6a\x9d\x3c\x28\x30\xf9\xb3\xe5\xca\x30\xec\x49\x57\x2b\xb1\x4a\xde\xc6\x4d\x38\x36\x48\x30\xbb\x50\xd5\x45\x88\x19\xa4\xaa\x15\x55\xad\xa8\x6a\x45\x55\x2b\xaa\x5a\xf5\xe2\x98\xe0\x3f\xd6\x1e\x28\x14\xb6\x86\x54\x7c\x8c\x08\xf6\x19\x45\xb0\x53\x69\x8e\x4a\x73\x54\x9a\xa3\xd2\x1c\x95\xe6\xa8\x34\x47\xa5\x39\x12\xbb\x48\xec\x22\xb1\x8b\xc4\xae\xe2\x8c\x44\x61\x8b\xb2\x96\x94\xb5\xa4\xac\xe5\xc8\xcb\x5a\x96\x92\x3a\xb0\x3d\x0a\x5b\x23\x51\xd8\xaa\x60\xbd\xfd\x67\x73\xee\x97\xd9\xaa\xc9\xb9\x77\xb5\xb6\x5e\xca\xb6\x11\xdc\x42\x70\xcb\x7c\x84\xe0\x16\xa1\x09\x84\x26\x10\x9a\x40\x68\x02\xa1\x09\x30\x6f\x30\xe8\xe1\x1e\x01\x83\x82\x41\xc1\xa0\x60\x50\x30\xe8\x8c\x31\x28\x64\x02\x32\x01\x99\x80\x4c\x20\xb8\x85\xe0\x16\x82\x5b\xd9\x27\x47\xa7\x4f\xe6\x0f\xf2\x51\xdd\xea\x4e\x5d\xa1\x2d\x60\x84\xf4\x56\x2b\xd2\x5b\x35\x41\x58\x99\xfe\x56\x3f\x69\x9e\x9d\x15\xae\xd8\x7a\xbc\x7a\x8b\x03\xd9\x47\x13\xc8\x3e\xa2\x7a\x05\xd5\x2b\x4a\x1a\x33\x0e\x4b\x66\x5c\x25\x2c\x9a\xb5\x7c\x10\x15\xe3\x9b\x34\x7d\x8a\xa6\x63\x97\xc2\x5c\x2f\x34\x1d\xcf\x44\xb3\x42\x1c\x5d\x6b\x74\xbd\xa0\x06\x07\x95\x37\xf2\x77\xc7\xfe\x1a\xa3\xfd\x45\xae\xf3\x8c\x72\x9d\x49\xea\x22\xa9\x8b\xa4\x2e\x92\xba\x70\x1d\xab\xde\xa2\x01\xba\x8e\x38\x60\xdb\x0f\x34\x80\xc4\x8f\x91\xb8\x60\xd9\x89\x76\x17\xe2\x5d\x35\xfd\xa8\x5d\x05\xaf\x96\x73\x3c\x90\xf1\xca\xe6\x41\x7d\xe3\x01\x19\xaf\xe4\x3f\x76\x35\xb6\x86\xe1\x6b\x79\xf5\x48\x75\xf3\x82\x5e\xd5\xcd\x40\xd5\x0b\x55\xaf\x1e\x54\xbd\x6a\xda\x20\x25\xd2\x5e\xd3\xa2\xeb\xe8\x7b\x71\xc0\x3b\x3f\xc0\x8e\xbe\x57\x9b\xf3\x06\x7d\x2f\x3c\x08\x3c\x88\xe9\x8a\x7c\xb5\xe6\x43\x74\xa3\xf4\x55\xfb\x78\xa9\x44\xee\x6b\x5a\xc6\x1d\xa1\x93\x58\x76\x33\xb3\xec\x06\x64\x40\xb1\xcf\x67\x9f\x10\x3a\x39\x3f\x0b\xa5\x3b\x09\xb0\xce\xc2\x0f\x1f\x7d\x77\xfd\xa0\x64\x14\x49\xeb\xfe\x41\x07\x70\xf4\x21\x05\xf6\x87\x6e\xc5\x75\xd6\x8a\x23\x43\x11\x37\x72\x60\xfb\x2e\x44\x60\x22\x75\xb7\xa8\xbb\x45\xdd\x2d\xea\x6e\x51\x77\xab\x17\x97\x05\xcf\xb2\xf6\x40\x21\x09\x36\xa4\xf2\x68\x84\xc9\xcf\x28\x4c\x9e\x5a\x78\xd4\xc2\xa3\x16\x1e\xb5\xf0\xa8\x85\x47\x2d\x3c\x6a\xe1\x91\x3d\x46\xf6\x18\xd9\x63\x64\x8f\x15\x67\x24\x92\x60\x14\xde\xa4\xf0\x26\x85\x37\x47\x5e\x78\xb3\x94\xd8\x01\xf4\x91\x04\x1b\x89\x24\xd8\x1e\xde\xdb\x7f\x9e\xe8\x7e\x59\xb0\x23\x98\xf7\xae\x34\x58\x1b\x9c\x1b\x79\x30\xe4\xc1\xcc\x47\xc8\x83\x11\xa6\x40\x98\x02\x61\x0a\x84\x29\x10\xa6\x00\xff\x06\x89\x1e\xee\x11\x90\x28\x48\x14\x24\x0a\x12\x05\x89\xce\x18\x89\x42\x29\xa0\x14\x50\x0a\x28\x05\xf2\x60\xc8\x83\x21\x0f\x96\x7d\x72\x74\x7e\x65\xf1\x30\x1f\x89\xb0\xee\x74\x1e\xda\x04\x48\xc8\x84\xb5\x22\x13\x76\x04\x18\x2b\x93\x0a\xeb\x2f\x05\xb4\xb3\x9a\x17\x3b\x8f\x58\x6f\xb1\x20\x3b\x69\x02\xd9\x49\xd4\xbd\xa0\xee\x45\x49\x63\xc6\x63\xdd\x8c\xab\xf6\x45\xf3\xd6\x0f\xa2\x72\x7d\xd3\xe6\x4f\xd1\xac\xec\x52\x3e\xac\x05\xb3\xf2\x4c\x34\xae\xe1\xd1\xb5\x8a\xd8\x0b\xcb\x77\x50\xb4\x03\xd3\x6c\x0a\xa6\x19\x69\xd2\x33\x4a\x93\x26\x1f\x8c\x7c\x30\xf2\xc1\xc8\x07\xc3\xab\xac\x7a\x8b\x06\xea\x55\xe2\x97\x0d\xcc\x2f\xeb\x56\x55\x6c\xd0\x19\x23\x25\xca\x62\x47\xf8\x56\xbb\xea\x62\x27\x48\x13\x41\x61\x2c\x9b\x0f\xf5\x0d\x0a\x14\xc6\x92\xff\xd8\xe9\xd8\x2a\xc6\xa1\x32\xd6\x33\x18\xce\x2b\x8d\xed\x6f\x0a\x6a\x63\xa8\x8d\xf5\xa0\x36\x76\x84\x5d\x52\xa2\x38\x36\x3d\x48\x8f\xea\x18\x07\xc1\xf3\x63\xf4\xa8\x8e\xb5\x39\x6f\x50\x1d\xc3\xab\xc0\xab\x30\x7f\x9e\xaa\xf2\x58\xab\x7e\x45\x37\xea\x63\x47\x1d\x41\x95\x28\x90\x4d\xcf\xd8\x23\x22\x13\x6b\x6f\x86\xd6\xde\x80\x8c\x2a\xf6\xfe\xec\x13\x22\x32\x6b\xb5\x7e\x92\x96\x4b\x77\x8a\x64\x9d\x46\x34\xea\x34\xae\x2b\x2b\x74\xec\xc0\x79\x34\xb6\x41\x16\xc9\xd8\x3a\x74\x4b\xd2\xfd\x3d\xdb\x79\x74\xec\xb5\x74\xf3\xa9\x83\x32\x2b\xf0\xf1\xf6\xd3\x87\x77\xba\x31\x8b\x5c\xe4\xce\x9b\x2c\xe6\xe7\x42\x5f\xe5\x62\x53\xea\x69\xab\x76\x4f\x66\x25\x09\xc7\x0b\x23\x25\xb7\x0e\x37\x8b\x36\xd4\xd3\xee\x71\x59\x76\xf3\x5f\x0a\xa9\x51\xa4\xf2\x0d\xb5\x26\xa4\xce\x44\x7d\xff\x38\xf3\x05\x4a\x0f\x62\x97\xf9\x7c\xd9\x9b\xd2\x31\xaf\xa1\x7a\xe2\x84\xab\x27\x1e\x86\x4f\x87\x2a\x27\xee\x3d\xe8\x6a\x01\xac\x51\x2f\x91\x7a\x89\xd4\x4b\xa4\x5e\xe2\xd4\xea\x25\x1e\x5e\x79\x4b\x6b\x25\x9e\x38\x8c\xa1\xb3\x0a\x89\x87\x1f\xbf\xba\x3a\xe2\x90\xfb\xe0\x98\x9a\x88\x87\xfb\xa0\xba\x1e\xe2\x89\xfb\x80\x2a\x88\x54\x41\xa4\x0a\x22\x55\x10\xa9\x82\x78\xb2\x2a\x88\x35\x56\xff\x9d\x0a\x88\x7b\x53\x00\x67\x14\xc5\x58\xef\x69\x26\x5c\xc5\xf1\x70\x77\xef\xab\xe0\xd8\x6d\xbf\x53\xb7\xf1\x24\x23\xba\x5b\xb3\xf1\xc4\xc3\xda\x6b\xa5\xc6\xc3\xdd\xb3\xa7\x4a\xe3\xa9\x97\xcd\xa1\xd6\x66\x3c\xdc\x69\x25\x20\xa3\xf1\x79\x5e\xf2\xaf\x3f\x9b\xc3\xb0\x92\xea\x1e\x27\x62\x62\x79\x10\xe6\xa5\x9b\x7d\xaa\x5f\xd4\x2e\x10\xfb\x76\x63\xdc\x6b\x07\x26\x31\x04\x63\xff\x60\xe3\xb5\x5c\x6c\x79\xbb\xb9\x6b\x37\xc5\x69\xa0\x34\x50\xda\xa8\x50\x1a\x18\x0d\x8c\x06\x46\x03\xa3\x81\xd1\xc0\x68\x60\x34\x30\x1a\x18\x0d\x8c\x06\x46\x03\xa3\x81\xd1\xc0\x68\x60\x34\x30\xda\x98\x30\x5a\xbe\xc4\x49\xc5\x79\x03\xb5\x4d\xa0\x82\xfd\x33\x24\xa8\x20\x54\x10\x2a\x08\x15\x2c\x74\xda\x40\xa8\xa0\xe7\xdb\x6a\x20\x09\x72\x1f\x7d\x5b\xf5\x94\x1e\x17\xdf\x9a\xe4\x38\x88\xde\xe8\x88\x5e\xc7\xc9\x71\xf1\x7b\x02\xd3\x83\xe9\xc1\xf4\x60\x7a\x30\x3d\x98\x1e\x4c\x0f\xa6\xd7\xe6\x6a\x0b\xd3\x83\xe9\xc1\xf4\x60\x7a\x30\x3d\x98\x1e\x4c\x6f\x76\x4c\x0f\x08\x06\x04\x03\x82\x8d\x63\x44\x81\x60\xdb\xdd\x03\x04\x1b\x39\x04\x1b\x4e\x62\x5c\x6b\x20\xac\xeb\xb4\xb8\x02\x1e\x00\xa1\x81\xd0\x0a\x57\x1d\x20\x42\x03\x9f\x81\xcf\xc0\x67\xe0\x33\xf0\x19\xf8\x0c\x7c\x06\x3e\x03\x9f\x81\xcf\xc0\x67\xe0\x33\xf0\x19\xf8\x0c\x7c\x06\x3e\x1b\x0f\x3e\x2b\xa4\xc4\xed\x9e\x36\x90\x10\x07\x0b\xec\x9f\x1c\xc1\x02\x61\x81\xb0\x40\x58\x60\xa1\xd3\x86\xc0\x02\x93\x0f\x2d\x57\x86\xe1\x20\xd2\xe2\x12\xc4\xf6\x36\x6e\x50\x1f\xb9\x71\xf9\xfb\x93\x20\x07\xdd\x1b\x1d\xdd\xeb\x32\x41\x2e\xff\xb2\x80\xf9\xc0\x7c\x60\x3e\x30\x1f\x98\x0f\xcc\x07\xe6\x03\xf3\xb5\xb9\xda\x82\xf9\xc0\x7c\x60\x3e\x30\x1f\x98\x0f\xcc\x07\xe6\x9b\x1d\xe6\x83\x8c\x41\xc6\x20\x63\xe3\x18\x51\xc8\xd8\x76\xf7\x40\xc6\x26\x41\xc6\x06\x92\x2b\xd7\x3a\x1d\xeb\x34\x61\xae\x02\x17\xc0\xd5\xe0\x6a\x85\xab\x0e\x90\xab\xc1\xd4\x60\x6a\x30\x35\x98\x1a\x4c\x0d\xa6\x06\x53\x83\xa9\xc1\xd4\x60\x6a\x30\x35\x98\x1a\x4c\x0d\xa6\x06\x53\x83\xa9\x8d\x8c\xa9\xe5\x53\xe7\xaa\x8f\x1c\xc8\x9f\x83\x12\xf6\xcf\x94\xa0\x84\x50\x42\x28\x21\x94\xb0\xd0\x69\x43\xa0\x84\x8f\xbe\xbb\x7e\x50\x32\x8a\xa4\x75\x1f\x1b\xcb\x43\x48\xa1\xfb\x43\xb7\xe9\x3a\x6b\x53\x1f\x69\x74\xc5\x36\x90\x4a\x07\xf2\x1b\x1d\xf2\xeb\x32\x95\xae\xf8\xc2\x80\xfe\x40\x7f\xa0\x3f\xd0\x1f\xe8\x0f\xf4\x07\xfa\x03\xfd\xb5\xb9\xda\x82\xfe\x40\x7f\xa0\x3f\xd0\x1f\xe8\x0f\xf4\x07\xfa\x9b\x1d\xfa\x03\x94\x01\xca\x00\x65\xe3\x18\x51\x40\xd9\x76\xf7\x00\xca\xa6\x02\xca\x06\x92\x51\x77\x12\x58\xd6\x69\x56\xdd\x1e\x72\x00\x66\x03\xb3\x15\xae\x3a\x40\xcc\x06\x62\x03\xb1\x81\xd8\x40\x6c\x20\x36\x10\x1b\x88\x0d\xc4\x06\x62\x03\xb1\x81\xd8\x40\x6c\x20\x36\x10\x1b\x88\x0d\xc4\x36\x42\xc4\x96\xcf\xae\xdb\x7f\xec\x40\x86\x1d\xe0\xb0\x7f\xcc\x04\x38\x04\x1c\x02\x0e\x01\x87\x85\x4e\x3b\x3d\x38\x74\xfd\x65\x78\xb5\x97\x01\x16\x00\x98\xeb\x2f\x7f\x74\x5c\xf5\x8b\x13\x46\x7f\x97\x9e\xed\x6e\x0d\x57\x35\xf9\x19\x2a\x3c\x89\x9f\x3f\xf7\xed\xb3\xfc\x1d\xb7\x3b\xe9\xbf\xae\xbf\x8c\xcd\x84\xfd\xc4\xb4\xbc\xb7\x26\xdc\x53\x2f\x21\x32\x71\x77\xa6\xef\xa2\xeb\x2f\x8f\x33\xcc\x92\xe1\x38\xbd\x6d\x56\xfe\xe2\xf8\x2b\xe5\x39\xf6\xd5\xe3\xab\xab\x7f\x3d\x7d\x39\xf0\x0a\x15\x1e\x7b\xa9\x22\x6d\xaf\x38\x96\x12\xd2\xb2\xb4\xeb\xad\xbd\x9c\x40\xfc\xb6\x52\xde\x87\x77\xe2\xa7\x4f\xbf\x7d\x14\xff\x54\xb7\xe2\x67\xf5\x1c\x3b\xf4\xe2\xab\xd8\xb7\x91\x8e\x17\x8a\xd5\xfa\xd6\x75\xac\xe4\x04\xf6\x51\x05\xd9\xaa\xa3\x4f\x17\xbf\xde\x83\xae\x97\x2a\xfa\x64\xee\x7a\x6d\x6e\xfa\x41\xdf\xd3\xdc\xf2\x67\xf5\xbc\xbd\xe5\xd5\x43\xd7\x4f\x5f\x2e\x43\x15\x7d\xa3\x11\x76\xe9\x4c\xea\x0c\x05\x17\x46\x77\xeb\xe3\xf1\x31\x5d\x33\xbb\x0e\x2e\x4c\x89\x31\xb3\x7f\xf6\x55\x05\x71\xec\xc4\x20\x94\xb6\xae\x64\xee\x9a\x93\x0e\x3b\x33\xc7\xf7\xcf\xb9\xb7\xbe\x5d\x62\xe5\xd6\x8f\x8c\xe8\x77\x5a\x1d\x17\x61\x90\x74\xc8\xe2\x83\x77\xe7\x8f\x7d\x0a\xa6\x83\x5b\x35\x07\xcf\x92\x9b\x9e\x87\xca\x5a\x07\x4e\xf4\x9c\x5d\x20\x9b\x8a\x3f\x28\x19\xa8\xe0\xf7\x78\xa9\x8a\x3f\xfc\x33\xfb\xe1\x9f\x5b\x3f\x7c\xb7\xe9\xd9\xac\x27\x0a\xbf\xcd\x2e\x59\xe8\x18\xf3\x2d\xa1\xbf\x26\xe2\x3e\x32\x47\x56\x51\x7e\xb2\x25\x3b\xc9\xbd\x92\x76\x6e\x0b\xde\x70\xe1\xa4\x67\x0b\x3f\x4a\xd7\x13\xb9\x72\x7e\x56\xcf\xe7\xc5\x67\x7e\x92\xcb\xd8\x52\x7d\x23\xce\x5f\x2f\xfe\x7a\x7e\xf6\xbf\xb3\xff\x07\x00\x00\xff\xff\x61\x4e\xfc\x38\xec\x0e\x4a\x00") + +func kubernetesapiV1204SwaggerJsonBytes() ([]byte, error) { + return bindataRead( + _kubernetesapiV1204SwaggerJson, + "kubernetesapi/v1204/swagger.json", + ) +} + +func kubernetesapiV1204SwaggerJson() (*asset, error) { + bytes, err := kubernetesapiV1204SwaggerJsonBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "kubernetesapi/v1204/swagger.json", size: 4853484, mode: os.FileMode(420), modTime: time.Unix(1614718756, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +// Asset loads and returns the asset for the given name. +// It returns an error if the asset could not be found or +// could not be loaded. +func Asset(name string) ([]byte, error) { + cannonicalName := strings.Replace(name, "\\", "/", -1) + if f, ok := _bindata[cannonicalName]; ok { + a, err := f() + if err != nil { + return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err) + } + return a.bytes, nil + } + return nil, fmt.Errorf("Asset %s not found", name) +} + +// MustAsset is like Asset but panics when Asset would return an error. +// It simplifies safe initialization of global variables. +func MustAsset(name string) []byte { + a, err := Asset(name) + if err != nil { + panic("asset: Asset(" + name + "): " + err.Error()) + } + + return a +} + +// AssetInfo loads and returns the asset info for the given name. +// It returns an error if the asset could not be found or +// could not be loaded. +func AssetInfo(name string) (os.FileInfo, error) { + cannonicalName := strings.Replace(name, "\\", "/", -1) + if f, ok := _bindata[cannonicalName]; ok { + a, err := f() + if err != nil { + return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err) + } + return a.info, nil + } + return nil, fmt.Errorf("AssetInfo %s not found", name) +} + +// AssetNames returns the names of the assets. +func AssetNames() []string { + names := make([]string, 0, len(_bindata)) + for name := range _bindata { + names = append(names, name) + } + return names +} + +// _bindata is a table, holding each asset generator, mapped to its name. +var _bindata = map[string]func() (*asset, error){ + "kubernetesapi/v1204/swagger.json": kubernetesapiV1204SwaggerJson, +} + +// AssetDir returns the file names below a certain +// directory embedded in the file by go-bindata. +// For example if you run go-bindata on data/... and data contains the +// following hierarchy: +// data/ +// foo.txt +// img/ +// a.png +// b.png +// then AssetDir("data") would return []string{"foo.txt", "img"} +// AssetDir("data/img") would return []string{"a.png", "b.png"} +// AssetDir("foo.txt") and AssetDir("notexist") would return an error +// AssetDir("") will return []string{"data"}. +func AssetDir(name string) ([]string, error) { + node := _bintree + if len(name) != 0 { + cannonicalName := strings.Replace(name, "\\", "/", -1) + pathList := strings.Split(cannonicalName, "/") + for _, p := range pathList { + node = node.Children[p] + if node == nil { + return nil, fmt.Errorf("Asset %s not found", name) + } + } + } + if node.Func != nil { + return nil, fmt.Errorf("Asset %s not found", name) + } + rv := make([]string, 0, len(node.Children)) + for childName := range node.Children { + rv = append(rv, childName) + } + return rv, nil +} + +type bintree struct { + Func func() (*asset, error) + Children map[string]*bintree +} + +var _bintree = &bintree{nil, map[string]*bintree{ + "kubernetesapi": &bintree{nil, map[string]*bintree{ + "v1204": &bintree{nil, map[string]*bintree{ + "swagger.json": &bintree{kubernetesapiV1204SwaggerJson, map[string]*bintree{}}, + }}, + }}, +}} + +// RestoreAsset restores an asset under the given directory +func RestoreAsset(dir, name string) error { + data, err := Asset(name) + if err != nil { + return err + } + info, err := AssetInfo(name) + if err != nil { + return err + } + err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755)) + if err != nil { + return err + } + err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode()) + if err != nil { + return err + } + err = os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime()) + if err != nil { + return err + } + return nil +} + +// RestoreAssets restores an asset under the given directory recursively +func RestoreAssets(dir, name string) error { + children, err := AssetDir(name) + // File + if err != nil { + return RestoreAsset(dir, name) + } + // Dir + for _, child := range children { + err = RestoreAssets(dir, filepath.Join(name, child)) + if err != nil { + return err + } + } + return nil +} + +func _filePath(dir, name string) string { + cannonicalName := strings.Replace(name, "\\", "/", -1) + return filepath.Join(append([]string{dir}, strings.Split(cannonicalName, "/")...)...) +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/openapi/kubernetesapi/v1204/swagger.json b/vendor/sigs.k8s.io/kustomize/kyaml/openapi/kubernetesapi/v1204/swagger.json new file mode 100644 index 000000000000..0ab9de888d1f --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/openapi/kubernetesapi/v1204/swagger.json @@ -0,0 +1,96625 @@ +{ + "definitions": { + "io.k8s.api.admissionregistration.v1.MutatingWebhook": { + "description": "MutatingWebhook describes an admission webhook and the resources and operations it applies to.", + "properties": { + "admissionReviewVersions": { + "description": "AdmissionReviewVersions is an ordered list of preferred `AdmissionReview` versions the Webhook expects. API server will try to use first version in the list which it supports. If none of the versions specified in this list supported by API server, validation will fail for this object. If a persisted webhook configuration specifies allowed versions and does not include any versions known to the API Server, calls to the webhook will fail and be subject to the failure policy.", + "items": { + "type": "string" + }, + "type": "array" + }, + "clientConfig": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1.WebhookClientConfig", + "description": "ClientConfig defines how to communicate with the hook. Required" + }, + "failurePolicy": { + "description": "FailurePolicy defines how unrecognized errors from the admission endpoint are handled - allowed values are Ignore or Fail. Defaults to Fail.", + "type": "string" + }, + "matchPolicy": { + "description": "matchPolicy defines how the \"rules\" list is used to match incoming requests. Allowed values are \"Exact\" or \"Equivalent\".\n\n- Exact: match a request only if it exactly matches a specified rule. For example, if deployments can be modified via apps/v1, apps/v1beta1, and extensions/v1beta1, but \"rules\" only included `apiGroups:[\"apps\"], apiVersions:[\"v1\"], resources: [\"deployments\"]`, a request to apps/v1beta1 or extensions/v1beta1 would not be sent to the webhook.\n\n- Equivalent: match a request if modifies a resource listed in rules, even via another API group or version. For example, if deployments can be modified via apps/v1, apps/v1beta1, and extensions/v1beta1, and \"rules\" only included `apiGroups:[\"apps\"], apiVersions:[\"v1\"], resources: [\"deployments\"]`, a request to apps/v1beta1 or extensions/v1beta1 would be converted to apps/v1 and sent to the webhook.\n\nDefaults to \"Equivalent\"", + "type": "string" + }, + "name": { + "description": "The name of the admission webhook. Name should be fully qualified, e.g., imagepolicy.kubernetes.io, where \"imagepolicy\" is the name of the webhook, and kubernetes.io is the name of the organization. Required.", + "type": "string" + }, + "namespaceSelector": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector", + "description": "NamespaceSelector decides whether to run the webhook on an object based on whether the namespace for that object matches the selector. If the object itself is a namespace, the matching is performed on object.metadata.labels. If the object is another cluster scoped resource, it never skips the webhook.\n\nFor example, to run the webhook on any objects whose namespace is not associated with \"runlevel\" of \"0\" or \"1\"; you will set the selector as follows: \"namespaceSelector\": {\n \"matchExpressions\": [\n {\n \"key\": \"runlevel\",\n \"operator\": \"NotIn\",\n \"values\": [\n \"0\",\n \"1\"\n ]\n }\n ]\n}\n\nIf instead you want to only run the webhook on any objects whose namespace is associated with the \"environment\" of \"prod\" or \"staging\"; you will set the selector as follows: \"namespaceSelector\": {\n \"matchExpressions\": [\n {\n \"key\": \"environment\",\n \"operator\": \"In\",\n \"values\": [\n \"prod\",\n \"staging\"\n ]\n }\n ]\n}\n\nSee https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ for more examples of label selectors.\n\nDefault to the empty LabelSelector, which matches everything." + }, + "objectSelector": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector", + "description": "ObjectSelector decides whether to run the webhook based on if the object has matching labels. objectSelector is evaluated against both the oldObject and newObject that would be sent to the webhook, and is considered to match if either object matches the selector. A null object (oldObject in the case of create, or newObject in the case of delete) or an object that cannot have labels (like a DeploymentRollback or a PodProxyOptions object) is not considered to match. Use the object selector only if the webhook is opt-in, because end users may skip the admission webhook by setting the labels. Default to the empty LabelSelector, which matches everything." + }, + "reinvocationPolicy": { + "description": "reinvocationPolicy indicates whether this webhook should be called multiple times as part of a single admission evaluation. Allowed values are \"Never\" and \"IfNeeded\".\n\nNever: the webhook will not be called more than once in a single admission evaluation.\n\nIfNeeded: the webhook will be called at least one additional time as part of the admission evaluation if the object being admitted is modified by other admission plugins after the initial webhook call. Webhooks that specify this option *must* be idempotent, able to process objects they previously admitted. Note: * the number of additional invocations is not guaranteed to be exactly one. * if additional invocations result in further modifications to the object, webhooks are not guaranteed to be invoked again. * webhooks that use this option may be reordered to minimize the number of additional invocations. * to validate an object after all mutations are guaranteed complete, use a validating admission webhook instead.\n\nDefaults to \"Never\".", + "type": "string" + }, + "rules": { + "description": "Rules describes what operations on what resources/subresources the webhook cares about. The webhook cares about an operation if it matches _any_ Rule. However, in order to prevent ValidatingAdmissionWebhooks and MutatingAdmissionWebhooks from putting the cluster in a state which cannot be recovered from without completely disabling the plugin, ValidatingAdmissionWebhooks and MutatingAdmissionWebhooks are never called on admission requests for ValidatingWebhookConfiguration and MutatingWebhookConfiguration objects.", + "items": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1.RuleWithOperations" + }, + "type": "array" + }, + "sideEffects": { + "description": "SideEffects states whether this webhook has side effects. Acceptable values are: None, NoneOnDryRun (webhooks created via v1beta1 may also specify Some or Unknown). Webhooks with side effects MUST implement a reconciliation system, since a request may be rejected by a future step in the admission change and the side effects therefore need to be undone. Requests with the dryRun attribute will be auto-rejected if they match a webhook with sideEffects == Unknown or Some.", + "type": "string" + }, + "timeoutSeconds": { + "description": "TimeoutSeconds specifies the timeout for this webhook. After the timeout passes, the webhook call will be ignored or the API call will fail based on the failure policy. The timeout value must be between 1 and 30 seconds. Default to 10 seconds.", + "format": "int32", + "type": "integer" + } + }, + "required": [ + "name", + "clientConfig", + "sideEffects", + "admissionReviewVersions" + ], + "type": "object" + }, + "io.k8s.api.admissionregistration.v1.MutatingWebhookConfiguration": { + "description": "MutatingWebhookConfiguration describes the configuration of and admission webhook that accept or reject and may change the object.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object metadata; More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata." + }, + "webhooks": { + "description": "Webhooks is a list of webhooks and the affected resources and operations.", + "items": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1.MutatingWebhook" + }, + "type": "array", + "x-kubernetes-patch-merge-key": "name", + "x-kubernetes-patch-strategy": "merge" + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "admissionregistration.k8s.io", + "kind": "MutatingWebhookConfiguration", + "version": "v1" + } + ] + }, + "io.k8s.api.admissionregistration.v1.MutatingWebhookConfigurationList": { + "description": "MutatingWebhookConfigurationList is a list of MutatingWebhookConfiguration.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "List of MutatingWebhookConfiguration.", + "items": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1.MutatingWebhookConfiguration" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "admissionregistration.k8s.io", + "kind": "MutatingWebhookConfigurationList", + "version": "v1" + } + ] + }, + "io.k8s.api.admissionregistration.v1.RuleWithOperations": { + "description": "RuleWithOperations is a tuple of Operations and Resources. It is recommended to make sure that all the tuple expansions are valid.", + "properties": { + "apiGroups": { + "description": "APIGroups is the API groups the resources belong to. '*' is all groups. If '*' is present, the length of the slice must be one. Required.", + "items": { + "type": "string" + }, + "type": "array" + }, + "apiVersions": { + "description": "APIVersions is the API versions the resources belong to. '*' is all versions. If '*' is present, the length of the slice must be one. Required.", + "items": { + "type": "string" + }, + "type": "array" + }, + "operations": { + "description": "Operations is the operations the admission hook cares about - CREATE, UPDATE, DELETE, CONNECT or * for all of those operations and any future admission operations that are added. If '*' is present, the length of the slice must be one. Required.", + "items": { + "type": "string" + }, + "type": "array" + }, + "resources": { + "description": "Resources is a list of resources this rule applies to.\n\nFor example: 'pods' means pods. 'pods/log' means the log subresource of pods. '*' means all resources, but not subresources. 'pods/*' means all subresources of pods. '*/scale' means all scale subresources. '*/*' means all resources and their subresources.\n\nIf wildcard is present, the validation rule will ensure resources do not overlap with each other.\n\nDepending on the enclosing object, subresources might not be allowed. Required.", + "items": { + "type": "string" + }, + "type": "array" + }, + "scope": { + "description": "scope specifies the scope of this rule. Valid values are \"Cluster\", \"Namespaced\", and \"*\" \"Cluster\" means that only cluster-scoped resources will match this rule. Namespace API objects are cluster-scoped. \"Namespaced\" means that only namespaced resources will match this rule. \"*\" means that there are no scope restrictions. Subresources match the scope of their parent resource. Default is \"*\".", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.admissionregistration.v1.ServiceReference": { + "description": "ServiceReference holds a reference to Service.legacy.k8s.io", + "properties": { + "name": { + "description": "`name` is the name of the service. Required", + "type": "string" + }, + "namespace": { + "description": "`namespace` is the namespace of the service. Required", + "type": "string" + }, + "path": { + "description": "`path` is an optional URL path which will be sent in any request to this service.", + "type": "string" + }, + "port": { + "description": "If specified, the port on the service that hosting webhook. Default to 443 for backward compatibility. `port` should be a valid port number (1-65535, inclusive).", + "format": "int32", + "type": "integer" + } + }, + "required": [ + "namespace", + "name" + ], + "type": "object" + }, + "io.k8s.api.admissionregistration.v1.ValidatingWebhook": { + "description": "ValidatingWebhook describes an admission webhook and the resources and operations it applies to.", + "properties": { + "admissionReviewVersions": { + "description": "AdmissionReviewVersions is an ordered list of preferred `AdmissionReview` versions the Webhook expects. API server will try to use first version in the list which it supports. If none of the versions specified in this list supported by API server, validation will fail for this object. If a persisted webhook configuration specifies allowed versions and does not include any versions known to the API Server, calls to the webhook will fail and be subject to the failure policy.", + "items": { + "type": "string" + }, + "type": "array" + }, + "clientConfig": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1.WebhookClientConfig", + "description": "ClientConfig defines how to communicate with the hook. Required" + }, + "failurePolicy": { + "description": "FailurePolicy defines how unrecognized errors from the admission endpoint are handled - allowed values are Ignore or Fail. Defaults to Fail.", + "type": "string" + }, + "matchPolicy": { + "description": "matchPolicy defines how the \"rules\" list is used to match incoming requests. Allowed values are \"Exact\" or \"Equivalent\".\n\n- Exact: match a request only if it exactly matches a specified rule. For example, if deployments can be modified via apps/v1, apps/v1beta1, and extensions/v1beta1, but \"rules\" only included `apiGroups:[\"apps\"], apiVersions:[\"v1\"], resources: [\"deployments\"]`, a request to apps/v1beta1 or extensions/v1beta1 would not be sent to the webhook.\n\n- Equivalent: match a request if modifies a resource listed in rules, even via another API group or version. For example, if deployments can be modified via apps/v1, apps/v1beta1, and extensions/v1beta1, and \"rules\" only included `apiGroups:[\"apps\"], apiVersions:[\"v1\"], resources: [\"deployments\"]`, a request to apps/v1beta1 or extensions/v1beta1 would be converted to apps/v1 and sent to the webhook.\n\nDefaults to \"Equivalent\"", + "type": "string" + }, + "name": { + "description": "The name of the admission webhook. Name should be fully qualified, e.g., imagepolicy.kubernetes.io, where \"imagepolicy\" is the name of the webhook, and kubernetes.io is the name of the organization. Required.", + "type": "string" + }, + "namespaceSelector": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector", + "description": "NamespaceSelector decides whether to run the webhook on an object based on whether the namespace for that object matches the selector. If the object itself is a namespace, the matching is performed on object.metadata.labels. If the object is another cluster scoped resource, it never skips the webhook.\n\nFor example, to run the webhook on any objects whose namespace is not associated with \"runlevel\" of \"0\" or \"1\"; you will set the selector as follows: \"namespaceSelector\": {\n \"matchExpressions\": [\n {\n \"key\": \"runlevel\",\n \"operator\": \"NotIn\",\n \"values\": [\n \"0\",\n \"1\"\n ]\n }\n ]\n}\n\nIf instead you want to only run the webhook on any objects whose namespace is associated with the \"environment\" of \"prod\" or \"staging\"; you will set the selector as follows: \"namespaceSelector\": {\n \"matchExpressions\": [\n {\n \"key\": \"environment\",\n \"operator\": \"In\",\n \"values\": [\n \"prod\",\n \"staging\"\n ]\n }\n ]\n}\n\nSee https://kubernetes.io/docs/concepts/overview/working-with-objects/labels for more examples of label selectors.\n\nDefault to the empty LabelSelector, which matches everything." + }, + "objectSelector": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector", + "description": "ObjectSelector decides whether to run the webhook based on if the object has matching labels. objectSelector is evaluated against both the oldObject and newObject that would be sent to the webhook, and is considered to match if either object matches the selector. A null object (oldObject in the case of create, or newObject in the case of delete) or an object that cannot have labels (like a DeploymentRollback or a PodProxyOptions object) is not considered to match. Use the object selector only if the webhook is opt-in, because end users may skip the admission webhook by setting the labels. Default to the empty LabelSelector, which matches everything." + }, + "rules": { + "description": "Rules describes what operations on what resources/subresources the webhook cares about. The webhook cares about an operation if it matches _any_ Rule. However, in order to prevent ValidatingAdmissionWebhooks and MutatingAdmissionWebhooks from putting the cluster in a state which cannot be recovered from without completely disabling the plugin, ValidatingAdmissionWebhooks and MutatingAdmissionWebhooks are never called on admission requests for ValidatingWebhookConfiguration and MutatingWebhookConfiguration objects.", + "items": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1.RuleWithOperations" + }, + "type": "array" + }, + "sideEffects": { + "description": "SideEffects states whether this webhook has side effects. Acceptable values are: None, NoneOnDryRun (webhooks created via v1beta1 may also specify Some or Unknown). Webhooks with side effects MUST implement a reconciliation system, since a request may be rejected by a future step in the admission change and the side effects therefore need to be undone. Requests with the dryRun attribute will be auto-rejected if they match a webhook with sideEffects == Unknown or Some.", + "type": "string" + }, + "timeoutSeconds": { + "description": "TimeoutSeconds specifies the timeout for this webhook. After the timeout passes, the webhook call will be ignored or the API call will fail based on the failure policy. The timeout value must be between 1 and 30 seconds. Default to 10 seconds.", + "format": "int32", + "type": "integer" + } + }, + "required": [ + "name", + "clientConfig", + "sideEffects", + "admissionReviewVersions" + ], + "type": "object" + }, + "io.k8s.api.admissionregistration.v1.ValidatingWebhookConfiguration": { + "description": "ValidatingWebhookConfiguration describes the configuration of and admission webhook that accept or reject and object without changing it.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object metadata; More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata." + }, + "webhooks": { + "description": "Webhooks is a list of webhooks and the affected resources and operations.", + "items": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1.ValidatingWebhook" + }, + "type": "array", + "x-kubernetes-patch-merge-key": "name", + "x-kubernetes-patch-strategy": "merge" + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "admissionregistration.k8s.io", + "kind": "ValidatingWebhookConfiguration", + "version": "v1" + } + ] + }, + "io.k8s.api.admissionregistration.v1.ValidatingWebhookConfigurationList": { + "description": "ValidatingWebhookConfigurationList is a list of ValidatingWebhookConfiguration.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "List of ValidatingWebhookConfiguration.", + "items": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1.ValidatingWebhookConfiguration" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "admissionregistration.k8s.io", + "kind": "ValidatingWebhookConfigurationList", + "version": "v1" + } + ] + }, + "io.k8s.api.admissionregistration.v1.WebhookClientConfig": { + "description": "WebhookClientConfig contains the information to make a TLS connection with the webhook", + "properties": { + "caBundle": { + "description": "`caBundle` is a PEM encoded CA bundle which will be used to validate the webhook's server certificate. If unspecified, system trust roots on the apiserver are used.", + "format": "byte", + "type": "string" + }, + "service": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1.ServiceReference", + "description": "`service` is a reference to the service for this webhook. Either `service` or `url` must be specified.\n\nIf the webhook is running within the cluster, then you should use `service`." + }, + "url": { + "description": "`url` gives the location of the webhook, in standard URL form (`scheme://host:port/path`). Exactly one of `url` or `service` must be specified.\n\nThe `host` should not refer to a service running in the cluster; use the `service` field instead. The host might be resolved via external DNS in some apiservers (e.g., `kube-apiserver` cannot resolve in-cluster DNS as that would be a layering violation). `host` may also be an IP address.\n\nPlease note that using `localhost` or `127.0.0.1` as a `host` is risky unless you take great care to run this webhook on all hosts which run an apiserver which might need to make calls to this webhook. Such installs are likely to be non-portable, i.e., not easy to turn up in a new cluster.\n\nThe scheme must be \"https\"; the URL must begin with \"https://\".\n\nA path is optional, and if present may be any string permissible in a URL. You may use the path to pass an arbitrary string to the webhook, for example, a cluster identifier.\n\nAttempting to use a user or basic auth e.g. \"user:password@\" is not allowed. Fragments (\"#...\") and query parameters (\"?...\") are not allowed, either.", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.admissionregistration.v1beta1.MutatingWebhook": { + "description": "MutatingWebhook describes an admission webhook and the resources and operations it applies to.", + "properties": { + "admissionReviewVersions": { + "description": "AdmissionReviewVersions is an ordered list of preferred `AdmissionReview` versions the Webhook expects. API server will try to use first version in the list which it supports. If none of the versions specified in this list supported by API server, validation will fail for this object. If a persisted webhook configuration specifies allowed versions and does not include any versions known to the API Server, calls to the webhook will fail and be subject to the failure policy. Default to `['v1beta1']`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "clientConfig": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1beta1.WebhookClientConfig", + "description": "ClientConfig defines how to communicate with the hook. Required" + }, + "failurePolicy": { + "description": "FailurePolicy defines how unrecognized errors from the admission endpoint are handled - allowed values are Ignore or Fail. Defaults to Ignore.", + "type": "string" + }, + "matchPolicy": { + "description": "matchPolicy defines how the \"rules\" list is used to match incoming requests. Allowed values are \"Exact\" or \"Equivalent\".\n\n- Exact: match a request only if it exactly matches a specified rule. For example, if deployments can be modified via apps/v1, apps/v1beta1, and extensions/v1beta1, but \"rules\" only included `apiGroups:[\"apps\"], apiVersions:[\"v1\"], resources: [\"deployments\"]`, a request to apps/v1beta1 or extensions/v1beta1 would not be sent to the webhook.\n\n- Equivalent: match a request if modifies a resource listed in rules, even via another API group or version. For example, if deployments can be modified via apps/v1, apps/v1beta1, and extensions/v1beta1, and \"rules\" only included `apiGroups:[\"apps\"], apiVersions:[\"v1\"], resources: [\"deployments\"]`, a request to apps/v1beta1 or extensions/v1beta1 would be converted to apps/v1 and sent to the webhook.\n\nDefaults to \"Exact\"", + "type": "string" + }, + "name": { + "description": "The name of the admission webhook. Name should be fully qualified, e.g., imagepolicy.kubernetes.io, where \"imagepolicy\" is the name of the webhook, and kubernetes.io is the name of the organization. Required.", + "type": "string" + }, + "namespaceSelector": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector", + "description": "NamespaceSelector decides whether to run the webhook on an object based on whether the namespace for that object matches the selector. If the object itself is a namespace, the matching is performed on object.metadata.labels. If the object is another cluster scoped resource, it never skips the webhook.\n\nFor example, to run the webhook on any objects whose namespace is not associated with \"runlevel\" of \"0\" or \"1\"; you will set the selector as follows: \"namespaceSelector\": {\n \"matchExpressions\": [\n {\n \"key\": \"runlevel\",\n \"operator\": \"NotIn\",\n \"values\": [\n \"0\",\n \"1\"\n ]\n }\n ]\n}\n\nIf instead you want to only run the webhook on any objects whose namespace is associated with the \"environment\" of \"prod\" or \"staging\"; you will set the selector as follows: \"namespaceSelector\": {\n \"matchExpressions\": [\n {\n \"key\": \"environment\",\n \"operator\": \"In\",\n \"values\": [\n \"prod\",\n \"staging\"\n ]\n }\n ]\n}\n\nSee https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ for more examples of label selectors.\n\nDefault to the empty LabelSelector, which matches everything." + }, + "objectSelector": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector", + "description": "ObjectSelector decides whether to run the webhook based on if the object has matching labels. objectSelector is evaluated against both the oldObject and newObject that would be sent to the webhook, and is considered to match if either object matches the selector. A null object (oldObject in the case of create, or newObject in the case of delete) or an object that cannot have labels (like a DeploymentRollback or a PodProxyOptions object) is not considered to match. Use the object selector only if the webhook is opt-in, because end users may skip the admission webhook by setting the labels. Default to the empty LabelSelector, which matches everything." + }, + "reinvocationPolicy": { + "description": "reinvocationPolicy indicates whether this webhook should be called multiple times as part of a single admission evaluation. Allowed values are \"Never\" and \"IfNeeded\".\n\nNever: the webhook will not be called more than once in a single admission evaluation.\n\nIfNeeded: the webhook will be called at least one additional time as part of the admission evaluation if the object being admitted is modified by other admission plugins after the initial webhook call. Webhooks that specify this option *must* be idempotent, able to process objects they previously admitted. Note: * the number of additional invocations is not guaranteed to be exactly one. * if additional invocations result in further modifications to the object, webhooks are not guaranteed to be invoked again. * webhooks that use this option may be reordered to minimize the number of additional invocations. * to validate an object after all mutations are guaranteed complete, use a validating admission webhook instead.\n\nDefaults to \"Never\".", + "type": "string" + }, + "rules": { + "description": "Rules describes what operations on what resources/subresources the webhook cares about. The webhook cares about an operation if it matches _any_ Rule. However, in order to prevent ValidatingAdmissionWebhooks and MutatingAdmissionWebhooks from putting the cluster in a state which cannot be recovered from without completely disabling the plugin, ValidatingAdmissionWebhooks and MutatingAdmissionWebhooks are never called on admission requests for ValidatingWebhookConfiguration and MutatingWebhookConfiguration objects.", + "items": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1beta1.RuleWithOperations" + }, + "type": "array" + }, + "sideEffects": { + "description": "SideEffects states whether this webhook has side effects. Acceptable values are: Unknown, None, Some, NoneOnDryRun Webhooks with side effects MUST implement a reconciliation system, since a request may be rejected by a future step in the admission change and the side effects therefore need to be undone. Requests with the dryRun attribute will be auto-rejected if they match a webhook with sideEffects == Unknown or Some. Defaults to Unknown.", + "type": "string" + }, + "timeoutSeconds": { + "description": "TimeoutSeconds specifies the timeout for this webhook. After the timeout passes, the webhook call will be ignored or the API call will fail based on the failure policy. The timeout value must be between 1 and 30 seconds. Default to 30 seconds.", + "format": "int32", + "type": "integer" + } + }, + "required": [ + "name", + "clientConfig" + ], + "type": "object" + }, + "io.k8s.api.admissionregistration.v1beta1.MutatingWebhookConfiguration": { + "description": "MutatingWebhookConfiguration describes the configuration of and admission webhook that accept or reject and may change the object. Deprecated in v1.16, planned for removal in v1.19. Use admissionregistration.k8s.io/v1 MutatingWebhookConfiguration instead.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object metadata; More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata." + }, + "webhooks": { + "description": "Webhooks is a list of webhooks and the affected resources and operations.", + "items": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1beta1.MutatingWebhook" + }, + "type": "array", + "x-kubernetes-patch-merge-key": "name", + "x-kubernetes-patch-strategy": "merge" + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "admissionregistration.k8s.io", + "kind": "MutatingWebhookConfiguration", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.admissionregistration.v1beta1.MutatingWebhookConfigurationList": { + "description": "MutatingWebhookConfigurationList is a list of MutatingWebhookConfiguration.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "List of MutatingWebhookConfiguration.", + "items": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1beta1.MutatingWebhookConfiguration" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "admissionregistration.k8s.io", + "kind": "MutatingWebhookConfigurationList", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.admissionregistration.v1beta1.RuleWithOperations": { + "description": "RuleWithOperations is a tuple of Operations and Resources. It is recommended to make sure that all the tuple expansions are valid.", + "properties": { + "apiGroups": { + "description": "APIGroups is the API groups the resources belong to. '*' is all groups. If '*' is present, the length of the slice must be one. Required.", + "items": { + "type": "string" + }, + "type": "array" + }, + "apiVersions": { + "description": "APIVersions is the API versions the resources belong to. '*' is all versions. If '*' is present, the length of the slice must be one. Required.", + "items": { + "type": "string" + }, + "type": "array" + }, + "operations": { + "description": "Operations is the operations the admission hook cares about - CREATE, UPDATE, DELETE, CONNECT or * for all of those operations and any future admission operations that are added. If '*' is present, the length of the slice must be one. Required.", + "items": { + "type": "string" + }, + "type": "array" + }, + "resources": { + "description": "Resources is a list of resources this rule applies to.\n\nFor example: 'pods' means pods. 'pods/log' means the log subresource of pods. '*' means all resources, but not subresources. 'pods/*' means all subresources of pods. '*/scale' means all scale subresources. '*/*' means all resources and their subresources.\n\nIf wildcard is present, the validation rule will ensure resources do not overlap with each other.\n\nDepending on the enclosing object, subresources might not be allowed. Required.", + "items": { + "type": "string" + }, + "type": "array" + }, + "scope": { + "description": "scope specifies the scope of this rule. Valid values are \"Cluster\", \"Namespaced\", and \"*\" \"Cluster\" means that only cluster-scoped resources will match this rule. Namespace API objects are cluster-scoped. \"Namespaced\" means that only namespaced resources will match this rule. \"*\" means that there are no scope restrictions. Subresources match the scope of their parent resource. Default is \"*\".", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.admissionregistration.v1beta1.ServiceReference": { + "description": "ServiceReference holds a reference to Service.legacy.k8s.io", + "properties": { + "name": { + "description": "`name` is the name of the service. Required", + "type": "string" + }, + "namespace": { + "description": "`namespace` is the namespace of the service. Required", + "type": "string" + }, + "path": { + "description": "`path` is an optional URL path which will be sent in any request to this service.", + "type": "string" + }, + "port": { + "description": "If specified, the port on the service that hosting webhook. Default to 443 for backward compatibility. `port` should be a valid port number (1-65535, inclusive).", + "format": "int32", + "type": "integer" + } + }, + "required": [ + "namespace", + "name" + ], + "type": "object" + }, + "io.k8s.api.admissionregistration.v1beta1.ValidatingWebhook": { + "description": "ValidatingWebhook describes an admission webhook and the resources and operations it applies to.", + "properties": { + "admissionReviewVersions": { + "description": "AdmissionReviewVersions is an ordered list of preferred `AdmissionReview` versions the Webhook expects. API server will try to use first version in the list which it supports. If none of the versions specified in this list supported by API server, validation will fail for this object. If a persisted webhook configuration specifies allowed versions and does not include any versions known to the API Server, calls to the webhook will fail and be subject to the failure policy. Default to `['v1beta1']`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "clientConfig": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1beta1.WebhookClientConfig", + "description": "ClientConfig defines how to communicate with the hook. Required" + }, + "failurePolicy": { + "description": "FailurePolicy defines how unrecognized errors from the admission endpoint are handled - allowed values are Ignore or Fail. Defaults to Ignore.", + "type": "string" + }, + "matchPolicy": { + "description": "matchPolicy defines how the \"rules\" list is used to match incoming requests. Allowed values are \"Exact\" or \"Equivalent\".\n\n- Exact: match a request only if it exactly matches a specified rule. For example, if deployments can be modified via apps/v1, apps/v1beta1, and extensions/v1beta1, but \"rules\" only included `apiGroups:[\"apps\"], apiVersions:[\"v1\"], resources: [\"deployments\"]`, a request to apps/v1beta1 or extensions/v1beta1 would not be sent to the webhook.\n\n- Equivalent: match a request if modifies a resource listed in rules, even via another API group or version. For example, if deployments can be modified via apps/v1, apps/v1beta1, and extensions/v1beta1, and \"rules\" only included `apiGroups:[\"apps\"], apiVersions:[\"v1\"], resources: [\"deployments\"]`, a request to apps/v1beta1 or extensions/v1beta1 would be converted to apps/v1 and sent to the webhook.\n\nDefaults to \"Exact\"", + "type": "string" + }, + "name": { + "description": "The name of the admission webhook. Name should be fully qualified, e.g., imagepolicy.kubernetes.io, where \"imagepolicy\" is the name of the webhook, and kubernetes.io is the name of the organization. Required.", + "type": "string" + }, + "namespaceSelector": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector", + "description": "NamespaceSelector decides whether to run the webhook on an object based on whether the namespace for that object matches the selector. If the object itself is a namespace, the matching is performed on object.metadata.labels. If the object is another cluster scoped resource, it never skips the webhook.\n\nFor example, to run the webhook on any objects whose namespace is not associated with \"runlevel\" of \"0\" or \"1\"; you will set the selector as follows: \"namespaceSelector\": {\n \"matchExpressions\": [\n {\n \"key\": \"runlevel\",\n \"operator\": \"NotIn\",\n \"values\": [\n \"0\",\n \"1\"\n ]\n }\n ]\n}\n\nIf instead you want to only run the webhook on any objects whose namespace is associated with the \"environment\" of \"prod\" or \"staging\"; you will set the selector as follows: \"namespaceSelector\": {\n \"matchExpressions\": [\n {\n \"key\": \"environment\",\n \"operator\": \"In\",\n \"values\": [\n \"prod\",\n \"staging\"\n ]\n }\n ]\n}\n\nSee https://kubernetes.io/docs/concepts/overview/working-with-objects/labels for more examples of label selectors.\n\nDefault to the empty LabelSelector, which matches everything." + }, + "objectSelector": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector", + "description": "ObjectSelector decides whether to run the webhook based on if the object has matching labels. objectSelector is evaluated against both the oldObject and newObject that would be sent to the webhook, and is considered to match if either object matches the selector. A null object (oldObject in the case of create, or newObject in the case of delete) or an object that cannot have labels (like a DeploymentRollback or a PodProxyOptions object) is not considered to match. Use the object selector only if the webhook is opt-in, because end users may skip the admission webhook by setting the labels. Default to the empty LabelSelector, which matches everything." + }, + "rules": { + "description": "Rules describes what operations on what resources/subresources the webhook cares about. The webhook cares about an operation if it matches _any_ Rule. However, in order to prevent ValidatingAdmissionWebhooks and MutatingAdmissionWebhooks from putting the cluster in a state which cannot be recovered from without completely disabling the plugin, ValidatingAdmissionWebhooks and MutatingAdmissionWebhooks are never called on admission requests for ValidatingWebhookConfiguration and MutatingWebhookConfiguration objects.", + "items": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1beta1.RuleWithOperations" + }, + "type": "array" + }, + "sideEffects": { + "description": "SideEffects states whether this webhook has side effects. Acceptable values are: Unknown, None, Some, NoneOnDryRun Webhooks with side effects MUST implement a reconciliation system, since a request may be rejected by a future step in the admission change and the side effects therefore need to be undone. Requests with the dryRun attribute will be auto-rejected if they match a webhook with sideEffects == Unknown or Some. Defaults to Unknown.", + "type": "string" + }, + "timeoutSeconds": { + "description": "TimeoutSeconds specifies the timeout for this webhook. After the timeout passes, the webhook call will be ignored or the API call will fail based on the failure policy. The timeout value must be between 1 and 30 seconds. Default to 30 seconds.", + "format": "int32", + "type": "integer" + } + }, + "required": [ + "name", + "clientConfig" + ], + "type": "object" + }, + "io.k8s.api.admissionregistration.v1beta1.ValidatingWebhookConfiguration": { + "description": "ValidatingWebhookConfiguration describes the configuration of and admission webhook that accept or reject and object without changing it. Deprecated in v1.16, planned for removal in v1.19. Use admissionregistration.k8s.io/v1 ValidatingWebhookConfiguration instead.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object metadata; More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata." + }, + "webhooks": { + "description": "Webhooks is a list of webhooks and the affected resources and operations.", + "items": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1beta1.ValidatingWebhook" + }, + "type": "array", + "x-kubernetes-patch-merge-key": "name", + "x-kubernetes-patch-strategy": "merge" + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "admissionregistration.k8s.io", + "kind": "ValidatingWebhookConfiguration", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.admissionregistration.v1beta1.ValidatingWebhookConfigurationList": { + "description": "ValidatingWebhookConfigurationList is a list of ValidatingWebhookConfiguration.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "List of ValidatingWebhookConfiguration.", + "items": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1beta1.ValidatingWebhookConfiguration" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "admissionregistration.k8s.io", + "kind": "ValidatingWebhookConfigurationList", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.admissionregistration.v1beta1.WebhookClientConfig": { + "description": "WebhookClientConfig contains the information to make a TLS connection with the webhook", + "properties": { + "caBundle": { + "description": "`caBundle` is a PEM encoded CA bundle which will be used to validate the webhook's server certificate. If unspecified, system trust roots on the apiserver are used.", + "format": "byte", + "type": "string" + }, + "service": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1beta1.ServiceReference", + "description": "`service` is a reference to the service for this webhook. Either `service` or `url` must be specified.\n\nIf the webhook is running within the cluster, then you should use `service`." + }, + "url": { + "description": "`url` gives the location of the webhook, in standard URL form (`scheme://host:port/path`). Exactly one of `url` or `service` must be specified.\n\nThe `host` should not refer to a service running in the cluster; use the `service` field instead. The host might be resolved via external DNS in some apiservers (e.g., `kube-apiserver` cannot resolve in-cluster DNS as that would be a layering violation). `host` may also be an IP address.\n\nPlease note that using `localhost` or `127.0.0.1` as a `host` is risky unless you take great care to run this webhook on all hosts which run an apiserver which might need to make calls to this webhook. Such installs are likely to be non-portable, i.e., not easy to turn up in a new cluster.\n\nThe scheme must be \"https\"; the URL must begin with \"https://\".\n\nA path is optional, and if present may be any string permissible in a URL. You may use the path to pass an arbitrary string to the webhook, for example, a cluster identifier.\n\nAttempting to use a user or basic auth e.g. \"user:password@\" is not allowed. Fragments (\"#...\") and query parameters (\"?...\") are not allowed, either.", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.apps.v1.ControllerRevision": { + "description": "ControllerRevision implements an immutable snapshot of state data. Clients are responsible for serializing and deserializing the objects that contain their internal state. Once a ControllerRevision has been successfully created, it can not be updated. The API Server will fail validation of all requests that attempt to mutate the Data field. ControllerRevisions may, however, be deleted. Note that, due to its use by both the DaemonSet and StatefulSet controllers for update and rollback, this object is beta. However, it may be subject to name and representation changes in future releases, and clients should not depend on its stability. It is primarily for internal use by controllers.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "data": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.runtime.RawExtension", + "description": "Data is the serialized representation of the state." + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "revision": { + "description": "Revision indicates the revision of the state represented by Data.", + "format": "int64", + "type": "integer" + } + }, + "required": [ + "revision" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "apps", + "kind": "ControllerRevision", + "version": "v1" + } + ] + }, + "io.k8s.api.apps.v1.ControllerRevisionList": { + "description": "ControllerRevisionList is a resource containing a list of ControllerRevision objects.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "Items is the list of ControllerRevisions", + "items": { + "$ref": "#/definitions/io.k8s.api.apps.v1.ControllerRevision" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "apps", + "kind": "ControllerRevisionList", + "version": "v1" + } + ] + }, + "io.k8s.api.apps.v1.DaemonSet": { + "description": "DaemonSet represents the configuration of a daemon set.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.apps.v1.DaemonSetSpec", + "description": "The desired behavior of this daemon set. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" + }, + "status": { + "$ref": "#/definitions/io.k8s.api.apps.v1.DaemonSetStatus", + "description": "The current status of this daemon set. This data may be out of date by some window of time. Populated by the system. Read-only. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "apps", + "kind": "DaemonSet", + "version": "v1" + } + ] + }, + "io.k8s.api.apps.v1.DaemonSetCondition": { + "description": "DaemonSetCondition describes the state of a DaemonSet at a certain point.", + "properties": { + "lastTransitionTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "Last time the condition transitioned from one status to another." + }, + "message": { + "description": "A human readable message indicating details about the transition.", + "type": "string" + }, + "reason": { + "description": "The reason for the condition's last transition.", + "type": "string" + }, + "status": { + "description": "Status of the condition, one of True, False, Unknown.", + "type": "string" + }, + "type": { + "description": "Type of DaemonSet condition.", + "type": "string" + } + }, + "required": [ + "type", + "status" + ], + "type": "object" + }, + "io.k8s.api.apps.v1.DaemonSetList": { + "description": "DaemonSetList is a collection of daemon sets.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "A list of daemon sets.", + "items": { + "$ref": "#/definitions/io.k8s.api.apps.v1.DaemonSet" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "apps", + "kind": "DaemonSetList", + "version": "v1" + } + ] + }, + "io.k8s.api.apps.v1.DaemonSetSpec": { + "description": "DaemonSetSpec is the specification of a daemon set.", + "properties": { + "minReadySeconds": { + "description": "The minimum number of seconds for which a newly created DaemonSet pod should be ready without any of its container crashing, for it to be considered available. Defaults to 0 (pod will be considered available as soon as it is ready).", + "format": "int32", + "type": "integer" + }, + "revisionHistoryLimit": { + "description": "The number of old history to retain to allow rollback. This is a pointer to distinguish between explicit zero and not specified. Defaults to 10.", + "format": "int32", + "type": "integer" + }, + "selector": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector", + "description": "A label query over pods that are managed by the daemon set. Must match in order to be controlled. It must match the pod template's labels. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors" + }, + "template": { + "$ref": "#/definitions/io.k8s.api.core.v1.PodTemplateSpec", + "description": "An object that describes the pod that will be created. The DaemonSet will create exactly one copy of this pod on every node that matches the template's node selector (or on every node if no node selector is specified). More info: https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller#pod-template" + }, + "updateStrategy": { + "$ref": "#/definitions/io.k8s.api.apps.v1.DaemonSetUpdateStrategy", + "description": "An update strategy to replace existing DaemonSet pods with new pods." + } + }, + "required": [ + "selector", + "template" + ], + "type": "object" + }, + "io.k8s.api.apps.v1.DaemonSetStatus": { + "description": "DaemonSetStatus represents the current status of a daemon set.", + "properties": { + "collisionCount": { + "description": "Count of hash collisions for the DaemonSet. The DaemonSet controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ControllerRevision.", + "format": "int32", + "type": "integer" + }, + "conditions": { + "description": "Represents the latest available observations of a DaemonSet's current state.", + "items": { + "$ref": "#/definitions/io.k8s.api.apps.v1.DaemonSetCondition" + }, + "type": "array", + "x-kubernetes-patch-merge-key": "type", + "x-kubernetes-patch-strategy": "merge" + }, + "currentNumberScheduled": { + "description": "The number of nodes that are running at least 1 daemon pod and are supposed to run the daemon pod. More info: https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/", + "format": "int32", + "type": "integer" + }, + "desiredNumberScheduled": { + "description": "The total number of nodes that should be running the daemon pod (including nodes correctly running the daemon pod). More info: https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/", + "format": "int32", + "type": "integer" + }, + "numberAvailable": { + "description": "The number of nodes that should be running the daemon pod and have one or more of the daemon pod running and available (ready for at least spec.minReadySeconds)", + "format": "int32", + "type": "integer" + }, + "numberMisscheduled": { + "description": "The number of nodes that are running the daemon pod, but are not supposed to run the daemon pod. More info: https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/", + "format": "int32", + "type": "integer" + }, + "numberReady": { + "description": "The number of nodes that should be running the daemon pod and have one or more of the daemon pod running and ready.", + "format": "int32", + "type": "integer" + }, + "numberUnavailable": { + "description": "The number of nodes that should be running the daemon pod and have none of the daemon pod running and available (ready for at least spec.minReadySeconds)", + "format": "int32", + "type": "integer" + }, + "observedGeneration": { + "description": "The most recent generation observed by the daemon set controller.", + "format": "int64", + "type": "integer" + }, + "updatedNumberScheduled": { + "description": "The total number of nodes that are running updated daemon pod", + "format": "int32", + "type": "integer" + } + }, + "required": [ + "currentNumberScheduled", + "numberMisscheduled", + "desiredNumberScheduled", + "numberReady" + ], + "type": "object" + }, + "io.k8s.api.apps.v1.DaemonSetUpdateStrategy": { + "description": "DaemonSetUpdateStrategy is a struct used to control the update strategy for a DaemonSet.", + "properties": { + "rollingUpdate": { + "$ref": "#/definitions/io.k8s.api.apps.v1.RollingUpdateDaemonSet", + "description": "Rolling update config params. Present only if type = \"RollingUpdate\"." + }, + "type": { + "description": "Type of daemon set update. Can be \"RollingUpdate\" or \"OnDelete\". Default is RollingUpdate.", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.apps.v1.Deployment": { + "description": "Deployment enables declarative updates for Pods and ReplicaSets.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object metadata." + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.apps.v1.DeploymentSpec", + "description": "Specification of the desired behavior of the Deployment." + }, + "status": { + "$ref": "#/definitions/io.k8s.api.apps.v1.DeploymentStatus", + "description": "Most recently observed status of the Deployment." + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "apps", + "kind": "Deployment", + "version": "v1" + } + ] + }, + "io.k8s.api.apps.v1.DeploymentCondition": { + "description": "DeploymentCondition describes the state of a deployment at a certain point.", + "properties": { + "lastTransitionTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "Last time the condition transitioned from one status to another." + }, + "lastUpdateTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "The last time this condition was updated." + }, + "message": { + "description": "A human readable message indicating details about the transition.", + "type": "string" + }, + "reason": { + "description": "The reason for the condition's last transition.", + "type": "string" + }, + "status": { + "description": "Status of the condition, one of True, False, Unknown.", + "type": "string" + }, + "type": { + "description": "Type of deployment condition.", + "type": "string" + } + }, + "required": [ + "type", + "status" + ], + "type": "object" + }, + "io.k8s.api.apps.v1.DeploymentList": { + "description": "DeploymentList is a list of Deployments.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "Items is the list of Deployments.", + "items": { + "$ref": "#/definitions/io.k8s.api.apps.v1.Deployment" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata." + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "apps", + "kind": "DeploymentList", + "version": "v1" + } + ] + }, + "io.k8s.api.apps.v1.DeploymentSpec": { + "description": "DeploymentSpec is the specification of the desired behavior of the Deployment.", + "properties": { + "minReadySeconds": { + "description": "Minimum number of seconds for which a newly created pod should be ready without any of its container crashing, for it to be considered available. Defaults to 0 (pod will be considered available as soon as it is ready)", + "format": "int32", + "type": "integer" + }, + "paused": { + "description": "Indicates that the deployment is paused.", + "type": "boolean" + }, + "progressDeadlineSeconds": { + "description": "The maximum time in seconds for a deployment to make progress before it is considered to be failed. The deployment controller will continue to process failed deployments and a condition with a ProgressDeadlineExceeded reason will be surfaced in the deployment status. Note that progress will not be estimated during the time a deployment is paused. Defaults to 600s.", + "format": "int32", + "type": "integer" + }, + "replicas": { + "description": "Number of desired pods. This is a pointer to distinguish between explicit zero and not specified. Defaults to 1.", + "format": "int32", + "type": "integer" + }, + "revisionHistoryLimit": { + "description": "The number of old ReplicaSets to retain to allow rollback. This is a pointer to distinguish between explicit zero and not specified. Defaults to 10.", + "format": "int32", + "type": "integer" + }, + "selector": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector", + "description": "Label selector for pods. Existing ReplicaSets whose pods are selected by this will be the ones affected by this deployment. It must match the pod template's labels." + }, + "strategy": { + "$ref": "#/definitions/io.k8s.api.apps.v1.DeploymentStrategy", + "description": "The deployment strategy to use to replace existing pods with new ones.", + "x-kubernetes-patch-strategy": "retainKeys" + }, + "template": { + "$ref": "#/definitions/io.k8s.api.core.v1.PodTemplateSpec", + "description": "Template describes the pods that will be created." + } + }, + "required": [ + "selector", + "template" + ], + "type": "object" + }, + "io.k8s.api.apps.v1.DeploymentStatus": { + "description": "DeploymentStatus is the most recently observed status of the Deployment.", + "properties": { + "availableReplicas": { + "description": "Total number of available pods (ready for at least minReadySeconds) targeted by this deployment.", + "format": "int32", + "type": "integer" + }, + "collisionCount": { + "description": "Count of hash collisions for the Deployment. The Deployment controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ReplicaSet.", + "format": "int32", + "type": "integer" + }, + "conditions": { + "description": "Represents the latest available observations of a deployment's current state.", + "items": { + "$ref": "#/definitions/io.k8s.api.apps.v1.DeploymentCondition" + }, + "type": "array", + "x-kubernetes-patch-merge-key": "type", + "x-kubernetes-patch-strategy": "merge" + }, + "observedGeneration": { + "description": "The generation observed by the deployment controller.", + "format": "int64", + "type": "integer" + }, + "readyReplicas": { + "description": "Total number of ready pods targeted by this deployment.", + "format": "int32", + "type": "integer" + }, + "replicas": { + "description": "Total number of non-terminated pods targeted by this deployment (their labels match the selector).", + "format": "int32", + "type": "integer" + }, + "unavailableReplicas": { + "description": "Total number of unavailable pods targeted by this deployment. This is the total number of pods that are still required for the deployment to have 100% available capacity. They may either be pods that are running but not yet available or pods that still have not been created.", + "format": "int32", + "type": "integer" + }, + "updatedReplicas": { + "description": "Total number of non-terminated pods targeted by this deployment that have the desired template spec.", + "format": "int32", + "type": "integer" + } + }, + "type": "object" + }, + "io.k8s.api.apps.v1.DeploymentStrategy": { + "description": "DeploymentStrategy describes how to replace existing pods with new ones.", + "properties": { + "rollingUpdate": { + "$ref": "#/definitions/io.k8s.api.apps.v1.RollingUpdateDeployment", + "description": "Rolling update config params. Present only if DeploymentStrategyType = RollingUpdate." + }, + "type": { + "description": "Type of deployment. Can be \"Recreate\" or \"RollingUpdate\". Default is RollingUpdate.", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.apps.v1.ReplicaSet": { + "description": "ReplicaSet ensures that a specified number of pod replicas are running at any given time.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "If the Labels of a ReplicaSet are empty, they are defaulted to be the same as the Pod(s) that the ReplicaSet manages. Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.apps.v1.ReplicaSetSpec", + "description": "Spec defines the specification of the desired behavior of the ReplicaSet. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" + }, + "status": { + "$ref": "#/definitions/io.k8s.api.apps.v1.ReplicaSetStatus", + "description": "Status is the most recently observed status of the ReplicaSet. This data may be out of date by some window of time. Populated by the system. Read-only. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "apps", + "kind": "ReplicaSet", + "version": "v1" + } + ] + }, + "io.k8s.api.apps.v1.ReplicaSetCondition": { + "description": "ReplicaSetCondition describes the state of a replica set at a certain point.", + "properties": { + "lastTransitionTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "The last time the condition transitioned from one status to another." + }, + "message": { + "description": "A human readable message indicating details about the transition.", + "type": "string" + }, + "reason": { + "description": "The reason for the condition's last transition.", + "type": "string" + }, + "status": { + "description": "Status of the condition, one of True, False, Unknown.", + "type": "string" + }, + "type": { + "description": "Type of replica set condition.", + "type": "string" + } + }, + "required": [ + "type", + "status" + ], + "type": "object" + }, + "io.k8s.api.apps.v1.ReplicaSetList": { + "description": "ReplicaSetList is a collection of ReplicaSets.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "List of ReplicaSets. More info: https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller", + "items": { + "$ref": "#/definitions/io.k8s.api.apps.v1.ReplicaSet" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "apps", + "kind": "ReplicaSetList", + "version": "v1" + } + ] + }, + "io.k8s.api.apps.v1.ReplicaSetSpec": { + "description": "ReplicaSetSpec is the specification of a ReplicaSet.", + "properties": { + "minReadySeconds": { + "description": "Minimum number of seconds for which a newly created pod should be ready without any of its container crashing, for it to be considered available. Defaults to 0 (pod will be considered available as soon as it is ready)", + "format": "int32", + "type": "integer" + }, + "replicas": { + "description": "Replicas is the number of desired replicas. This is a pointer to distinguish between explicit zero and unspecified. Defaults to 1. More info: https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller/#what-is-a-replicationcontroller", + "format": "int32", + "type": "integer" + }, + "selector": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector", + "description": "Selector is a label query over pods that should match the replica count. Label keys and values that must match in order to be controlled by this replica set. It must match the pod template's labels. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors" + }, + "template": { + "$ref": "#/definitions/io.k8s.api.core.v1.PodTemplateSpec", + "description": "Template is the object that describes the pod that will be created if insufficient replicas are detected. More info: https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller#pod-template" + } + }, + "required": [ + "selector" + ], + "type": "object" + }, + "io.k8s.api.apps.v1.ReplicaSetStatus": { + "description": "ReplicaSetStatus represents the current status of a ReplicaSet.", + "properties": { + "availableReplicas": { + "description": "The number of available replicas (ready for at least minReadySeconds) for this replica set.", + "format": "int32", + "type": "integer" + }, + "conditions": { + "description": "Represents the latest available observations of a replica set's current state.", + "items": { + "$ref": "#/definitions/io.k8s.api.apps.v1.ReplicaSetCondition" + }, + "type": "array", + "x-kubernetes-patch-merge-key": "type", + "x-kubernetes-patch-strategy": "merge" + }, + "fullyLabeledReplicas": { + "description": "The number of pods that have labels matching the labels of the pod template of the replicaset.", + "format": "int32", + "type": "integer" + }, + "observedGeneration": { + "description": "ObservedGeneration reflects the generation of the most recently observed ReplicaSet.", + "format": "int64", + "type": "integer" + }, + "readyReplicas": { + "description": "The number of ready replicas for this replica set.", + "format": "int32", + "type": "integer" + }, + "replicas": { + "description": "Replicas is the most recently oberved number of replicas. More info: https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller/#what-is-a-replicationcontroller", + "format": "int32", + "type": "integer" + } + }, + "required": [ + "replicas" + ], + "type": "object" + }, + "io.k8s.api.apps.v1.RollingUpdateDaemonSet": { + "description": "Spec to control the desired behavior of daemon set rolling update.", + "properties": { + "maxUnavailable": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.util.intstr.IntOrString", + "description": "The maximum number of DaemonSet pods that can be unavailable during the update. Value can be an absolute number (ex: 5) or a percentage of total number of DaemonSet pods at the start of the update (ex: 10%). Absolute number is calculated from percentage by rounding up. This cannot be 0. Default value is 1. Example: when this is set to 30%, at most 30% of the total number of nodes that should be running the daemon pod (i.e. status.desiredNumberScheduled) can have their pods stopped for an update at any given time. The update starts by stopping at most 30% of those DaemonSet pods and then brings up new DaemonSet pods in their place. Once the new pods are available, it then proceeds onto other DaemonSet pods, thus ensuring that at least 70% of original number of DaemonSet pods are available at all times during the update." + } + }, + "type": "object" + }, + "io.k8s.api.apps.v1.RollingUpdateDeployment": { + "description": "Spec to control the desired behavior of rolling update.", + "properties": { + "maxSurge": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.util.intstr.IntOrString", + "description": "The maximum number of pods that can be scheduled above the desired number of pods. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). This can not be 0 if MaxUnavailable is 0. Absolute number is calculated from percentage by rounding up. Defaults to 25%. Example: when this is set to 30%, the new ReplicaSet can be scaled up immediately when the rolling update starts, such that the total number of old and new pods do not exceed 130% of desired pods. Once old pods have been killed, new ReplicaSet can be scaled up further, ensuring that total number of pods running at any time during the update is at most 130% of desired pods." + }, + "maxUnavailable": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.util.intstr.IntOrString", + "description": "The maximum number of pods that can be unavailable during the update. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). Absolute number is calculated from percentage by rounding down. This can not be 0 if MaxSurge is 0. Defaults to 25%. Example: when this is set to 30%, the old ReplicaSet can be scaled down to 70% of desired pods immediately when the rolling update starts. Once new pods are ready, old ReplicaSet can be scaled down further, followed by scaling up the new ReplicaSet, ensuring that the total number of pods available at all times during the update is at least 70% of desired pods." + } + }, + "type": "object" + }, + "io.k8s.api.apps.v1.RollingUpdateStatefulSetStrategy": { + "description": "RollingUpdateStatefulSetStrategy is used to communicate parameter for RollingUpdateStatefulSetStrategyType.", + "properties": { + "partition": { + "description": "Partition indicates the ordinal at which the StatefulSet should be partitioned. Default value is 0.", + "format": "int32", + "type": "integer" + } + }, + "type": "object" + }, + "io.k8s.api.apps.v1.StatefulSet": { + "description": "StatefulSet represents a set of pods with consistent identities. Identities are defined as:\n - Network: A single stable DNS and hostname.\n - Storage: As many VolumeClaims as requested.\nThe StatefulSet guarantees that a given network identity will always map to the same storage identity.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.apps.v1.StatefulSetSpec", + "description": "Spec defines the desired identities of pods in this set." + }, + "status": { + "$ref": "#/definitions/io.k8s.api.apps.v1.StatefulSetStatus", + "description": "Status is the current status of Pods in this StatefulSet. This data may be out of date by some window of time." + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "apps", + "kind": "StatefulSet", + "version": "v1" + } + ] + }, + "io.k8s.api.apps.v1.StatefulSetCondition": { + "description": "StatefulSetCondition describes the state of a statefulset at a certain point.", + "properties": { + "lastTransitionTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "Last time the condition transitioned from one status to another." + }, + "message": { + "description": "A human readable message indicating details about the transition.", + "type": "string" + }, + "reason": { + "description": "The reason for the condition's last transition.", + "type": "string" + }, + "status": { + "description": "Status of the condition, one of True, False, Unknown.", + "type": "string" + }, + "type": { + "description": "Type of statefulset condition.", + "type": "string" + } + }, + "required": [ + "type", + "status" + ], + "type": "object" + }, + "io.k8s.api.apps.v1.StatefulSetList": { + "description": "StatefulSetList is a collection of StatefulSets.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "items": { + "$ref": "#/definitions/io.k8s.api.apps.v1.StatefulSet" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "apps", + "kind": "StatefulSetList", + "version": "v1" + } + ] + }, + "io.k8s.api.apps.v1.StatefulSetSpec": { + "description": "A StatefulSetSpec is the specification of a StatefulSet.", + "properties": { + "podManagementPolicy": { + "description": "podManagementPolicy controls how pods are created during initial scale up, when replacing pods on nodes, or when scaling down. The default policy is `OrderedReady`, where pods are created in increasing order (pod-0, then pod-1, etc) and the controller will wait until each pod is ready before continuing. When scaling down, the pods are removed in the opposite order. The alternative policy is `Parallel` which will create pods in parallel to match the desired scale without waiting, and on scale down will delete all pods at once.", + "type": "string" + }, + "replicas": { + "description": "replicas is the desired number of replicas of the given Template. These are replicas in the sense that they are instantiations of the same Template, but individual replicas also have a consistent identity. If unspecified, defaults to 1.", + "format": "int32", + "type": "integer" + }, + "revisionHistoryLimit": { + "description": "revisionHistoryLimit is the maximum number of revisions that will be maintained in the StatefulSet's revision history. The revision history consists of all revisions not represented by a currently applied StatefulSetSpec version. The default value is 10.", + "format": "int32", + "type": "integer" + }, + "selector": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector", + "description": "selector is a label query over pods that should match the replica count. It must match the pod template's labels. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors" + }, + "serviceName": { + "description": "serviceName is the name of the service that governs this StatefulSet. This service must exist before the StatefulSet, and is responsible for the network identity of the set. Pods get DNS/hostnames that follow the pattern: pod-specific-string.serviceName.default.svc.cluster.local where \"pod-specific-string\" is managed by the StatefulSet controller.", + "type": "string" + }, + "template": { + "$ref": "#/definitions/io.k8s.api.core.v1.PodTemplateSpec", + "description": "template is the object that describes the pod that will be created if insufficient replicas are detected. Each pod stamped out by the StatefulSet will fulfill this Template, but have a unique identity from the rest of the StatefulSet." + }, + "updateStrategy": { + "$ref": "#/definitions/io.k8s.api.apps.v1.StatefulSetUpdateStrategy", + "description": "updateStrategy indicates the StatefulSetUpdateStrategy that will be employed to update Pods in the StatefulSet when a revision is made to Template." + }, + "volumeClaimTemplates": { + "description": "volumeClaimTemplates is a list of claims that pods are allowed to reference. The StatefulSet controller is responsible for mapping network identities to claims in a way that maintains the identity of a pod. Every claim in this list must have at least one matching (by name) volumeMount in one container in the template. A claim in this list takes precedence over any volumes in the template, with the same name.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolumeClaim" + }, + "type": "array" + } + }, + "required": [ + "selector", + "template", + "serviceName" + ], + "type": "object" + }, + "io.k8s.api.apps.v1.StatefulSetStatus": { + "description": "StatefulSetStatus represents the current state of a StatefulSet.", + "properties": { + "collisionCount": { + "description": "collisionCount is the count of hash collisions for the StatefulSet. The StatefulSet controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ControllerRevision.", + "format": "int32", + "type": "integer" + }, + "conditions": { + "description": "Represents the latest available observations of a statefulset's current state.", + "items": { + "$ref": "#/definitions/io.k8s.api.apps.v1.StatefulSetCondition" + }, + "type": "array", + "x-kubernetes-patch-merge-key": "type", + "x-kubernetes-patch-strategy": "merge" + }, + "currentReplicas": { + "description": "currentReplicas is the number of Pods created by the StatefulSet controller from the StatefulSet version indicated by currentRevision.", + "format": "int32", + "type": "integer" + }, + "currentRevision": { + "description": "currentRevision, if not empty, indicates the version of the StatefulSet used to generate Pods in the sequence [0,currentReplicas).", + "type": "string" + }, + "observedGeneration": { + "description": "observedGeneration is the most recent generation observed for this StatefulSet. It corresponds to the StatefulSet's generation, which is updated on mutation by the API Server.", + "format": "int64", + "type": "integer" + }, + "readyReplicas": { + "description": "readyReplicas is the number of Pods created by the StatefulSet controller that have a Ready Condition.", + "format": "int32", + "type": "integer" + }, + "replicas": { + "description": "replicas is the number of Pods created by the StatefulSet controller.", + "format": "int32", + "type": "integer" + }, + "updateRevision": { + "description": "updateRevision, if not empty, indicates the version of the StatefulSet used to generate Pods in the sequence [replicas-updatedReplicas,replicas)", + "type": "string" + }, + "updatedReplicas": { + "description": "updatedReplicas is the number of Pods created by the StatefulSet controller from the StatefulSet version indicated by updateRevision.", + "format": "int32", + "type": "integer" + } + }, + "required": [ + "replicas" + ], + "type": "object" + }, + "io.k8s.api.apps.v1.StatefulSetUpdateStrategy": { + "description": "StatefulSetUpdateStrategy indicates the strategy that the StatefulSet controller will use to perform updates. It includes any additional parameters necessary to perform the update for the indicated strategy.", + "properties": { + "rollingUpdate": { + "$ref": "#/definitions/io.k8s.api.apps.v1.RollingUpdateStatefulSetStrategy", + "description": "RollingUpdate is used to communicate parameters when Type is RollingUpdateStatefulSetStrategyType." + }, + "type": { + "description": "Type indicates the type of the StatefulSetUpdateStrategy. Default is RollingUpdate.", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.authentication.v1.BoundObjectReference": { + "description": "BoundObjectReference is a reference to an object that a token is bound to.", + "properties": { + "apiVersion": { + "description": "API version of the referent.", + "type": "string" + }, + "kind": { + "description": "Kind of the referent. Valid kinds are 'Pod' and 'Secret'.", + "type": "string" + }, + "name": { + "description": "Name of the referent.", + "type": "string" + }, + "uid": { + "description": "UID of the referent.", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.authentication.v1.TokenRequest": { + "description": "TokenRequest requests a token for a given service account.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.authentication.v1.TokenRequestSpec" + }, + "status": { + "$ref": "#/definitions/io.k8s.api.authentication.v1.TokenRequestStatus" + } + }, + "required": [ + "spec" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "authentication.k8s.io", + "kind": "TokenRequest", + "version": "v1" + } + ] + }, + "io.k8s.api.authentication.v1.TokenRequestSpec": { + "description": "TokenRequestSpec contains client provided parameters of a token request.", + "properties": { + "audiences": { + "description": "Audiences are the intendend audiences of the token. A recipient of a token must identitfy themself with an identifier in the list of audiences of the token, and otherwise should reject the token. A token issued for multiple audiences may be used to authenticate against any of the audiences listed but implies a high degree of trust between the target audiences.", + "items": { + "type": "string" + }, + "type": "array" + }, + "boundObjectRef": { + "$ref": "#/definitions/io.k8s.api.authentication.v1.BoundObjectReference", + "description": "BoundObjectRef is a reference to an object that the token will be bound to. The token will only be valid for as long as the bound object exists. NOTE: The API server's TokenReview endpoint will validate the BoundObjectRef, but other audiences may not. Keep ExpirationSeconds small if you want prompt revocation." + }, + "expirationSeconds": { + "description": "ExpirationSeconds is the requested duration of validity of the request. The token issuer may return a token with a different validity duration so a client needs to check the 'expiration' field in a response.", + "format": "int64", + "type": "integer" + } + }, + "required": [ + "audiences" + ], + "type": "object" + }, + "io.k8s.api.authentication.v1.TokenRequestStatus": { + "description": "TokenRequestStatus is the result of a token request.", + "properties": { + "expirationTimestamp": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "ExpirationTimestamp is the time of expiration of the returned token." + }, + "token": { + "description": "Token is the opaque bearer token.", + "type": "string" + } + }, + "required": [ + "token", + "expirationTimestamp" + ], + "type": "object" + }, + "io.k8s.api.authentication.v1.TokenReview": { + "description": "TokenReview attempts to authenticate a token to a known user. Note: TokenReview requests may be cached by the webhook token authenticator plugin in the kube-apiserver.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.authentication.v1.TokenReviewSpec", + "description": "Spec holds information about the request being evaluated" + }, + "status": { + "$ref": "#/definitions/io.k8s.api.authentication.v1.TokenReviewStatus", + "description": "Status is filled in by the server and indicates whether the request can be authenticated." + } + }, + "required": [ + "spec" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "authentication.k8s.io", + "kind": "TokenReview", + "version": "v1" + } + ] + }, + "io.k8s.api.authentication.v1.TokenReviewSpec": { + "description": "TokenReviewSpec is a description of the token authentication request.", + "properties": { + "audiences": { + "description": "Audiences is a list of the identifiers that the resource server presented with the token identifies as. Audience-aware token authenticators will verify that the token was intended for at least one of the audiences in this list. If no audiences are provided, the audience will default to the audience of the Kubernetes apiserver.", + "items": { + "type": "string" + }, + "type": "array" + }, + "token": { + "description": "Token is the opaque bearer token.", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.authentication.v1.TokenReviewStatus": { + "description": "TokenReviewStatus is the result of the token authentication request.", + "properties": { + "audiences": { + "description": "Audiences are audience identifiers chosen by the authenticator that are compatible with both the TokenReview and token. An identifier is any identifier in the intersection of the TokenReviewSpec audiences and the token's audiences. A client of the TokenReview API that sets the spec.audiences field should validate that a compatible audience identifier is returned in the status.audiences field to ensure that the TokenReview server is audience aware. If a TokenReview returns an empty status.audience field where status.authenticated is \"true\", the token is valid against the audience of the Kubernetes API server.", + "items": { + "type": "string" + }, + "type": "array" + }, + "authenticated": { + "description": "Authenticated indicates that the token was associated with a known user.", + "type": "boolean" + }, + "error": { + "description": "Error indicates that the token couldn't be checked", + "type": "string" + }, + "user": { + "$ref": "#/definitions/io.k8s.api.authentication.v1.UserInfo", + "description": "User is the UserInfo associated with the provided token." + } + }, + "type": "object" + }, + "io.k8s.api.authentication.v1.UserInfo": { + "description": "UserInfo holds the information about the user needed to implement the user.Info interface.", + "properties": { + "extra": { + "additionalProperties": { + "items": { + "type": "string" + }, + "type": "array" + }, + "description": "Any additional information provided by the authenticator.", + "type": "object" + }, + "groups": { + "description": "The names of groups this user is a part of.", + "items": { + "type": "string" + }, + "type": "array" + }, + "uid": { + "description": "A unique value that identifies this user across time. If this user is deleted and another user by the same name is added, they will have different UIDs.", + "type": "string" + }, + "username": { + "description": "The name that uniquely identifies this user among all active users.", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.authentication.v1beta1.TokenReview": { + "description": "TokenReview attempts to authenticate a token to a known user. Note: TokenReview requests may be cached by the webhook token authenticator plugin in the kube-apiserver.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.authentication.v1beta1.TokenReviewSpec", + "description": "Spec holds information about the request being evaluated" + }, + "status": { + "$ref": "#/definitions/io.k8s.api.authentication.v1beta1.TokenReviewStatus", + "description": "Status is filled in by the server and indicates whether the request can be authenticated." + } + }, + "required": [ + "spec" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "authentication.k8s.io", + "kind": "TokenReview", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.authentication.v1beta1.TokenReviewSpec": { + "description": "TokenReviewSpec is a description of the token authentication request.", + "properties": { + "audiences": { + "description": "Audiences is a list of the identifiers that the resource server presented with the token identifies as. Audience-aware token authenticators will verify that the token was intended for at least one of the audiences in this list. If no audiences are provided, the audience will default to the audience of the Kubernetes apiserver.", + "items": { + "type": "string" + }, + "type": "array" + }, + "token": { + "description": "Token is the opaque bearer token.", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.authentication.v1beta1.TokenReviewStatus": { + "description": "TokenReviewStatus is the result of the token authentication request.", + "properties": { + "audiences": { + "description": "Audiences are audience identifiers chosen by the authenticator that are compatible with both the TokenReview and token. An identifier is any identifier in the intersection of the TokenReviewSpec audiences and the token's audiences. A client of the TokenReview API that sets the spec.audiences field should validate that a compatible audience identifier is returned in the status.audiences field to ensure that the TokenReview server is audience aware. If a TokenReview returns an empty status.audience field where status.authenticated is \"true\", the token is valid against the audience of the Kubernetes API server.", + "items": { + "type": "string" + }, + "type": "array" + }, + "authenticated": { + "description": "Authenticated indicates that the token was associated with a known user.", + "type": "boolean" + }, + "error": { + "description": "Error indicates that the token couldn't be checked", + "type": "string" + }, + "user": { + "$ref": "#/definitions/io.k8s.api.authentication.v1beta1.UserInfo", + "description": "User is the UserInfo associated with the provided token." + } + }, + "type": "object" + }, + "io.k8s.api.authentication.v1beta1.UserInfo": { + "description": "UserInfo holds the information about the user needed to implement the user.Info interface.", + "properties": { + "extra": { + "additionalProperties": { + "items": { + "type": "string" + }, + "type": "array" + }, + "description": "Any additional information provided by the authenticator.", + "type": "object" + }, + "groups": { + "description": "The names of groups this user is a part of.", + "items": { + "type": "string" + }, + "type": "array" + }, + "uid": { + "description": "A unique value that identifies this user across time. If this user is deleted and another user by the same name is added, they will have different UIDs.", + "type": "string" + }, + "username": { + "description": "The name that uniquely identifies this user among all active users.", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.authorization.v1.LocalSubjectAccessReview": { + "description": "LocalSubjectAccessReview checks whether or not a user or group can perform an action in a given namespace. Having a namespace scoped resource makes it much easier to grant namespace scoped policy that includes permissions checking.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.authorization.v1.SubjectAccessReviewSpec", + "description": "Spec holds information about the request being evaluated. spec.namespace must be equal to the namespace you made the request against. If empty, it is defaulted." + }, + "status": { + "$ref": "#/definitions/io.k8s.api.authorization.v1.SubjectAccessReviewStatus", + "description": "Status is filled in by the server and indicates whether the request is allowed or not" + } + }, + "required": [ + "spec" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "authorization.k8s.io", + "kind": "LocalSubjectAccessReview", + "version": "v1" + } + ] + }, + "io.k8s.api.authorization.v1.NonResourceAttributes": { + "description": "NonResourceAttributes includes the authorization attributes available for non-resource requests to the Authorizer interface", + "properties": { + "path": { + "description": "Path is the URL path of the request", + "type": "string" + }, + "verb": { + "description": "Verb is the standard HTTP verb", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.authorization.v1.NonResourceRule": { + "description": "NonResourceRule holds information that describes a rule for the non-resource", + "properties": { + "nonResourceURLs": { + "description": "NonResourceURLs is a set of partial urls that a user should have access to. *s are allowed, but only as the full, final step in the path. \"*\" means all.", + "items": { + "type": "string" + }, + "type": "array" + }, + "verbs": { + "description": "Verb is a list of kubernetes non-resource API verbs, like: get, post, put, delete, patch, head, options. \"*\" means all.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "verbs" + ], + "type": "object" + }, + "io.k8s.api.authorization.v1.ResourceAttributes": { + "description": "ResourceAttributes includes the authorization attributes available for resource requests to the Authorizer interface", + "properties": { + "group": { + "description": "Group is the API Group of the Resource. \"*\" means all.", + "type": "string" + }, + "name": { + "description": "Name is the name of the resource being requested for a \"get\" or deleted for a \"delete\". \"\" (empty) means all.", + "type": "string" + }, + "namespace": { + "description": "Namespace is the namespace of the action being requested. Currently, there is no distinction between no namespace and all namespaces \"\" (empty) is defaulted for LocalSubjectAccessReviews \"\" (empty) is empty for cluster-scoped resources \"\" (empty) means \"all\" for namespace scoped resources from a SubjectAccessReview or SelfSubjectAccessReview", + "type": "string" + }, + "resource": { + "description": "Resource is one of the existing resource types. \"*\" means all.", + "type": "string" + }, + "subresource": { + "description": "Subresource is one of the existing resource types. \"\" means none.", + "type": "string" + }, + "verb": { + "description": "Verb is a kubernetes resource API verb, like: get, list, watch, create, update, delete, proxy. \"*\" means all.", + "type": "string" + }, + "version": { + "description": "Version is the API Version of the Resource. \"*\" means all.", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.authorization.v1.ResourceRule": { + "description": "ResourceRule is the list of actions the subject is allowed to perform on resources. The list ordering isn't significant, may contain duplicates, and possibly be incomplete.", + "properties": { + "apiGroups": { + "description": "APIGroups is the name of the APIGroup that contains the resources. If multiple API groups are specified, any action requested against one of the enumerated resources in any API group will be allowed. \"*\" means all.", + "items": { + "type": "string" + }, + "type": "array" + }, + "resourceNames": { + "description": "ResourceNames is an optional white list of names that the rule applies to. An empty set means that everything is allowed. \"*\" means all.", + "items": { + "type": "string" + }, + "type": "array" + }, + "resources": { + "description": "Resources is a list of resources this rule applies to. \"*\" means all in the specified apiGroups.\n \"*/foo\" represents the subresource 'foo' for all resources in the specified apiGroups.", + "items": { + "type": "string" + }, + "type": "array" + }, + "verbs": { + "description": "Verb is a list of kubernetes resource API verbs, like: get, list, watch, create, update, delete, proxy. \"*\" means all.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "verbs" + ], + "type": "object" + }, + "io.k8s.api.authorization.v1.SelfSubjectAccessReview": { + "description": "SelfSubjectAccessReview checks whether or the current user can perform an action. Not filling in a spec.namespace means \"in all namespaces\". Self is a special case, because users should always be able to check whether they can perform an action", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.authorization.v1.SelfSubjectAccessReviewSpec", + "description": "Spec holds information about the request being evaluated. user and groups must be empty" + }, + "status": { + "$ref": "#/definitions/io.k8s.api.authorization.v1.SubjectAccessReviewStatus", + "description": "Status is filled in by the server and indicates whether the request is allowed or not" + } + }, + "required": [ + "spec" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "authorization.k8s.io", + "kind": "SelfSubjectAccessReview", + "version": "v1" + } + ] + }, + "io.k8s.api.authorization.v1.SelfSubjectAccessReviewSpec": { + "description": "SelfSubjectAccessReviewSpec is a description of the access request. Exactly one of ResourceAuthorizationAttributes and NonResourceAuthorizationAttributes must be set", + "properties": { + "nonResourceAttributes": { + "$ref": "#/definitions/io.k8s.api.authorization.v1.NonResourceAttributes", + "description": "NonResourceAttributes describes information for a non-resource access request" + }, + "resourceAttributes": { + "$ref": "#/definitions/io.k8s.api.authorization.v1.ResourceAttributes", + "description": "ResourceAuthorizationAttributes describes information for a resource access request" + } + }, + "type": "object" + }, + "io.k8s.api.authorization.v1.SelfSubjectRulesReview": { + "description": "SelfSubjectRulesReview enumerates the set of actions the current user can perform within a namespace. The returned list of actions may be incomplete depending on the server's authorization mode, and any errors experienced during the evaluation. SelfSubjectRulesReview should be used by UIs to show/hide actions, or to quickly let an end user reason about their permissions. It should NOT Be used by external systems to drive authorization decisions as this raises confused deputy, cache lifetime/revocation, and correctness concerns. SubjectAccessReview, and LocalAccessReview are the correct way to defer authorization decisions to the API server.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.authorization.v1.SelfSubjectRulesReviewSpec", + "description": "Spec holds information about the request being evaluated." + }, + "status": { + "$ref": "#/definitions/io.k8s.api.authorization.v1.SubjectRulesReviewStatus", + "description": "Status is filled in by the server and indicates the set of actions a user can perform." + } + }, + "required": [ + "spec" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "authorization.k8s.io", + "kind": "SelfSubjectRulesReview", + "version": "v1" + } + ] + }, + "io.k8s.api.authorization.v1.SelfSubjectRulesReviewSpec": { + "properties": { + "namespace": { + "description": "Namespace to evaluate rules for. Required.", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.authorization.v1.SubjectAccessReview": { + "description": "SubjectAccessReview checks whether or not a user or group can perform an action.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.authorization.v1.SubjectAccessReviewSpec", + "description": "Spec holds information about the request being evaluated" + }, + "status": { + "$ref": "#/definitions/io.k8s.api.authorization.v1.SubjectAccessReviewStatus", + "description": "Status is filled in by the server and indicates whether the request is allowed or not" + } + }, + "required": [ + "spec" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "authorization.k8s.io", + "kind": "SubjectAccessReview", + "version": "v1" + } + ] + }, + "io.k8s.api.authorization.v1.SubjectAccessReviewSpec": { + "description": "SubjectAccessReviewSpec is a description of the access request. Exactly one of ResourceAuthorizationAttributes and NonResourceAuthorizationAttributes must be set", + "properties": { + "extra": { + "additionalProperties": { + "items": { + "type": "string" + }, + "type": "array" + }, + "description": "Extra corresponds to the user.Info.GetExtra() method from the authenticator. Since that is input to the authorizer it needs a reflection here.", + "type": "object" + }, + "groups": { + "description": "Groups is the groups you're testing for.", + "items": { + "type": "string" + }, + "type": "array" + }, + "nonResourceAttributes": { + "$ref": "#/definitions/io.k8s.api.authorization.v1.NonResourceAttributes", + "description": "NonResourceAttributes describes information for a non-resource access request" + }, + "resourceAttributes": { + "$ref": "#/definitions/io.k8s.api.authorization.v1.ResourceAttributes", + "description": "ResourceAuthorizationAttributes describes information for a resource access request" + }, + "uid": { + "description": "UID information about the requesting user.", + "type": "string" + }, + "user": { + "description": "User is the user you're testing for. If you specify \"User\" but not \"Groups\", then is it interpreted as \"What if User were not a member of any groups", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.authorization.v1.SubjectAccessReviewStatus": { + "description": "SubjectAccessReviewStatus", + "properties": { + "allowed": { + "description": "Allowed is required. True if the action would be allowed, false otherwise.", + "type": "boolean" + }, + "denied": { + "description": "Denied is optional. True if the action would be denied, otherwise false. If both allowed is false and denied is false, then the authorizer has no opinion on whether to authorize the action. Denied may not be true if Allowed is true.", + "type": "boolean" + }, + "evaluationError": { + "description": "EvaluationError is an indication that some error occurred during the authorization check. It is entirely possible to get an error and be able to continue determine authorization status in spite of it. For instance, RBAC can be missing a role, but enough roles are still present and bound to reason about the request.", + "type": "string" + }, + "reason": { + "description": "Reason is optional. It indicates why a request was allowed or denied.", + "type": "string" + } + }, + "required": [ + "allowed" + ], + "type": "object" + }, + "io.k8s.api.authorization.v1.SubjectRulesReviewStatus": { + "description": "SubjectRulesReviewStatus contains the result of a rules check. This check can be incomplete depending on the set of authorizers the server is configured with and any errors experienced during evaluation. Because authorization rules are additive, if a rule appears in a list it's safe to assume the subject has that permission, even if that list is incomplete.", + "properties": { + "evaluationError": { + "description": "EvaluationError can appear in combination with Rules. It indicates an error occurred during rule evaluation, such as an authorizer that doesn't support rule evaluation, and that ResourceRules and/or NonResourceRules may be incomplete.", + "type": "string" + }, + "incomplete": { + "description": "Incomplete is true when the rules returned by this call are incomplete. This is most commonly encountered when an authorizer, such as an external authorizer, doesn't support rules evaluation.", + "type": "boolean" + }, + "nonResourceRules": { + "description": "NonResourceRules is the list of actions the subject is allowed to perform on non-resources. The list ordering isn't significant, may contain duplicates, and possibly be incomplete.", + "items": { + "$ref": "#/definitions/io.k8s.api.authorization.v1.NonResourceRule" + }, + "type": "array" + }, + "resourceRules": { + "description": "ResourceRules is the list of actions the subject is allowed to perform on resources. The list ordering isn't significant, may contain duplicates, and possibly be incomplete.", + "items": { + "$ref": "#/definitions/io.k8s.api.authorization.v1.ResourceRule" + }, + "type": "array" + } + }, + "required": [ + "resourceRules", + "nonResourceRules", + "incomplete" + ], + "type": "object" + }, + "io.k8s.api.authorization.v1beta1.LocalSubjectAccessReview": { + "description": "LocalSubjectAccessReview checks whether or not a user or group can perform an action in a given namespace. Having a namespace scoped resource makes it much easier to grant namespace scoped policy that includes permissions checking.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.authorization.v1beta1.SubjectAccessReviewSpec", + "description": "Spec holds information about the request being evaluated. spec.namespace must be equal to the namespace you made the request against. If empty, it is defaulted." + }, + "status": { + "$ref": "#/definitions/io.k8s.api.authorization.v1beta1.SubjectAccessReviewStatus", + "description": "Status is filled in by the server and indicates whether the request is allowed or not" + } + }, + "required": [ + "spec" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "authorization.k8s.io", + "kind": "LocalSubjectAccessReview", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.authorization.v1beta1.NonResourceAttributes": { + "description": "NonResourceAttributes includes the authorization attributes available for non-resource requests to the Authorizer interface", + "properties": { + "path": { + "description": "Path is the URL path of the request", + "type": "string" + }, + "verb": { + "description": "Verb is the standard HTTP verb", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.authorization.v1beta1.NonResourceRule": { + "description": "NonResourceRule holds information that describes a rule for the non-resource", + "properties": { + "nonResourceURLs": { + "description": "NonResourceURLs is a set of partial urls that a user should have access to. *s are allowed, but only as the full, final step in the path. \"*\" means all.", + "items": { + "type": "string" + }, + "type": "array" + }, + "verbs": { + "description": "Verb is a list of kubernetes non-resource API verbs, like: get, post, put, delete, patch, head, options. \"*\" means all.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "verbs" + ], + "type": "object" + }, + "io.k8s.api.authorization.v1beta1.ResourceAttributes": { + "description": "ResourceAttributes includes the authorization attributes available for resource requests to the Authorizer interface", + "properties": { + "group": { + "description": "Group is the API Group of the Resource. \"*\" means all.", + "type": "string" + }, + "name": { + "description": "Name is the name of the resource being requested for a \"get\" or deleted for a \"delete\". \"\" (empty) means all.", + "type": "string" + }, + "namespace": { + "description": "Namespace is the namespace of the action being requested. Currently, there is no distinction between no namespace and all namespaces \"\" (empty) is defaulted for LocalSubjectAccessReviews \"\" (empty) is empty for cluster-scoped resources \"\" (empty) means \"all\" for namespace scoped resources from a SubjectAccessReview or SelfSubjectAccessReview", + "type": "string" + }, + "resource": { + "description": "Resource is one of the existing resource types. \"*\" means all.", + "type": "string" + }, + "subresource": { + "description": "Subresource is one of the existing resource types. \"\" means none.", + "type": "string" + }, + "verb": { + "description": "Verb is a kubernetes resource API verb, like: get, list, watch, create, update, delete, proxy. \"*\" means all.", + "type": "string" + }, + "version": { + "description": "Version is the API Version of the Resource. \"*\" means all.", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.authorization.v1beta1.ResourceRule": { + "description": "ResourceRule is the list of actions the subject is allowed to perform on resources. The list ordering isn't significant, may contain duplicates, and possibly be incomplete.", + "properties": { + "apiGroups": { + "description": "APIGroups is the name of the APIGroup that contains the resources. If multiple API groups are specified, any action requested against one of the enumerated resources in any API group will be allowed. \"*\" means all.", + "items": { + "type": "string" + }, + "type": "array" + }, + "resourceNames": { + "description": "ResourceNames is an optional white list of names that the rule applies to. An empty set means that everything is allowed. \"*\" means all.", + "items": { + "type": "string" + }, + "type": "array" + }, + "resources": { + "description": "Resources is a list of resources this rule applies to. \"*\" means all in the specified apiGroups.\n \"*/foo\" represents the subresource 'foo' for all resources in the specified apiGroups.", + "items": { + "type": "string" + }, + "type": "array" + }, + "verbs": { + "description": "Verb is a list of kubernetes resource API verbs, like: get, list, watch, create, update, delete, proxy. \"*\" means all.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "verbs" + ], + "type": "object" + }, + "io.k8s.api.authorization.v1beta1.SelfSubjectAccessReview": { + "description": "SelfSubjectAccessReview checks whether or the current user can perform an action. Not filling in a spec.namespace means \"in all namespaces\". Self is a special case, because users should always be able to check whether they can perform an action", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.authorization.v1beta1.SelfSubjectAccessReviewSpec", + "description": "Spec holds information about the request being evaluated. user and groups must be empty" + }, + "status": { + "$ref": "#/definitions/io.k8s.api.authorization.v1beta1.SubjectAccessReviewStatus", + "description": "Status is filled in by the server and indicates whether the request is allowed or not" + } + }, + "required": [ + "spec" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "authorization.k8s.io", + "kind": "SelfSubjectAccessReview", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.authorization.v1beta1.SelfSubjectAccessReviewSpec": { + "description": "SelfSubjectAccessReviewSpec is a description of the access request. Exactly one of ResourceAuthorizationAttributes and NonResourceAuthorizationAttributes must be set", + "properties": { + "nonResourceAttributes": { + "$ref": "#/definitions/io.k8s.api.authorization.v1beta1.NonResourceAttributes", + "description": "NonResourceAttributes describes information for a non-resource access request" + }, + "resourceAttributes": { + "$ref": "#/definitions/io.k8s.api.authorization.v1beta1.ResourceAttributes", + "description": "ResourceAuthorizationAttributes describes information for a resource access request" + } + }, + "type": "object" + }, + "io.k8s.api.authorization.v1beta1.SelfSubjectRulesReview": { + "description": "SelfSubjectRulesReview enumerates the set of actions the current user can perform within a namespace. The returned list of actions may be incomplete depending on the server's authorization mode, and any errors experienced during the evaluation. SelfSubjectRulesReview should be used by UIs to show/hide actions, or to quickly let an end user reason about their permissions. It should NOT Be used by external systems to drive authorization decisions as this raises confused deputy, cache lifetime/revocation, and correctness concerns. SubjectAccessReview, and LocalAccessReview are the correct way to defer authorization decisions to the API server.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.authorization.v1beta1.SelfSubjectRulesReviewSpec", + "description": "Spec holds information about the request being evaluated." + }, + "status": { + "$ref": "#/definitions/io.k8s.api.authorization.v1beta1.SubjectRulesReviewStatus", + "description": "Status is filled in by the server and indicates the set of actions a user can perform." + } + }, + "required": [ + "spec" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "authorization.k8s.io", + "kind": "SelfSubjectRulesReview", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.authorization.v1beta1.SelfSubjectRulesReviewSpec": { + "properties": { + "namespace": { + "description": "Namespace to evaluate rules for. Required.", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.authorization.v1beta1.SubjectAccessReview": { + "description": "SubjectAccessReview checks whether or not a user or group can perform an action.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.authorization.v1beta1.SubjectAccessReviewSpec", + "description": "Spec holds information about the request being evaluated" + }, + "status": { + "$ref": "#/definitions/io.k8s.api.authorization.v1beta1.SubjectAccessReviewStatus", + "description": "Status is filled in by the server and indicates whether the request is allowed or not" + } + }, + "required": [ + "spec" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "authorization.k8s.io", + "kind": "SubjectAccessReview", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.authorization.v1beta1.SubjectAccessReviewSpec": { + "description": "SubjectAccessReviewSpec is a description of the access request. Exactly one of ResourceAuthorizationAttributes and NonResourceAuthorizationAttributes must be set", + "properties": { + "extra": { + "additionalProperties": { + "items": { + "type": "string" + }, + "type": "array" + }, + "description": "Extra corresponds to the user.Info.GetExtra() method from the authenticator. Since that is input to the authorizer it needs a reflection here.", + "type": "object" + }, + "group": { + "description": "Groups is the groups you're testing for.", + "items": { + "type": "string" + }, + "type": "array" + }, + "nonResourceAttributes": { + "$ref": "#/definitions/io.k8s.api.authorization.v1beta1.NonResourceAttributes", + "description": "NonResourceAttributes describes information for a non-resource access request" + }, + "resourceAttributes": { + "$ref": "#/definitions/io.k8s.api.authorization.v1beta1.ResourceAttributes", + "description": "ResourceAuthorizationAttributes describes information for a resource access request" + }, + "uid": { + "description": "UID information about the requesting user.", + "type": "string" + }, + "user": { + "description": "User is the user you're testing for. If you specify \"User\" but not \"Group\", then is it interpreted as \"What if User were not a member of any groups", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.authorization.v1beta1.SubjectAccessReviewStatus": { + "description": "SubjectAccessReviewStatus", + "properties": { + "allowed": { + "description": "Allowed is required. True if the action would be allowed, false otherwise.", + "type": "boolean" + }, + "denied": { + "description": "Denied is optional. True if the action would be denied, otherwise false. If both allowed is false and denied is false, then the authorizer has no opinion on whether to authorize the action. Denied may not be true if Allowed is true.", + "type": "boolean" + }, + "evaluationError": { + "description": "EvaluationError is an indication that some error occurred during the authorization check. It is entirely possible to get an error and be able to continue determine authorization status in spite of it. For instance, RBAC can be missing a role, but enough roles are still present and bound to reason about the request.", + "type": "string" + }, + "reason": { + "description": "Reason is optional. It indicates why a request was allowed or denied.", + "type": "string" + } + }, + "required": [ + "allowed" + ], + "type": "object" + }, + "io.k8s.api.authorization.v1beta1.SubjectRulesReviewStatus": { + "description": "SubjectRulesReviewStatus contains the result of a rules check. This check can be incomplete depending on the set of authorizers the server is configured with and any errors experienced during evaluation. Because authorization rules are additive, if a rule appears in a list it's safe to assume the subject has that permission, even if that list is incomplete.", + "properties": { + "evaluationError": { + "description": "EvaluationError can appear in combination with Rules. It indicates an error occurred during rule evaluation, such as an authorizer that doesn't support rule evaluation, and that ResourceRules and/or NonResourceRules may be incomplete.", + "type": "string" + }, + "incomplete": { + "description": "Incomplete is true when the rules returned by this call are incomplete. This is most commonly encountered when an authorizer, such as an external authorizer, doesn't support rules evaluation.", + "type": "boolean" + }, + "nonResourceRules": { + "description": "NonResourceRules is the list of actions the subject is allowed to perform on non-resources. The list ordering isn't significant, may contain duplicates, and possibly be incomplete.", + "items": { + "$ref": "#/definitions/io.k8s.api.authorization.v1beta1.NonResourceRule" + }, + "type": "array" + }, + "resourceRules": { + "description": "ResourceRules is the list of actions the subject is allowed to perform on resources. The list ordering isn't significant, may contain duplicates, and possibly be incomplete.", + "items": { + "$ref": "#/definitions/io.k8s.api.authorization.v1beta1.ResourceRule" + }, + "type": "array" + } + }, + "required": [ + "resourceRules", + "nonResourceRules", + "incomplete" + ], + "type": "object" + }, + "io.k8s.api.autoscaling.v1.CrossVersionObjectReference": { + "description": "CrossVersionObjectReference contains enough information to let you identify the referred resource.", + "properties": { + "apiVersion": { + "description": "API version of the referent", + "type": "string" + }, + "kind": { + "description": "Kind of the referent; More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\"", + "type": "string" + }, + "name": { + "description": "Name of the referent; More info: http://kubernetes.io/docs/user-guide/identifiers#names", + "type": "string" + } + }, + "required": [ + "kind", + "name" + ], + "type": "object" + }, + "io.k8s.api.autoscaling.v1.HorizontalPodAutoscaler": { + "description": "configuration of a horizontal pod autoscaler.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscalerSpec", + "description": "behaviour of autoscaler. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status." + }, + "status": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscalerStatus", + "description": "current information about the autoscaler." + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "autoscaling", + "kind": "HorizontalPodAutoscaler", + "version": "v1" + } + ] + }, + "io.k8s.api.autoscaling.v1.HorizontalPodAutoscalerList": { + "description": "list of horizontal pod autoscaler objects.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "list of horizontal pod autoscaler objects.", + "items": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscaler" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata." + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "autoscaling", + "kind": "HorizontalPodAutoscalerList", + "version": "v1" + } + ] + }, + "io.k8s.api.autoscaling.v1.HorizontalPodAutoscalerSpec": { + "description": "specification of a horizontal pod autoscaler.", + "properties": { + "maxReplicas": { + "description": "upper limit for the number of pods that can be set by the autoscaler; cannot be smaller than MinReplicas.", + "format": "int32", + "type": "integer" + }, + "minReplicas": { + "description": "minReplicas is the lower limit for the number of replicas to which the autoscaler can scale down. It defaults to 1 pod. minReplicas is allowed to be 0 if the alpha feature gate HPAScaleToZero is enabled and at least one Object or External metric is configured. Scaling is active as long as at least one metric value is available.", + "format": "int32", + "type": "integer" + }, + "scaleTargetRef": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v1.CrossVersionObjectReference", + "description": "reference to scaled resource; horizontal pod autoscaler will learn the current resource consumption and will set the desired number of pods by using its Scale subresource." + }, + "targetCPUUtilizationPercentage": { + "description": "target average CPU utilization (represented as a percentage of requested CPU) over all the pods; if not specified the default autoscaling policy will be used.", + "format": "int32", + "type": "integer" + } + }, + "required": [ + "scaleTargetRef", + "maxReplicas" + ], + "type": "object" + }, + "io.k8s.api.autoscaling.v1.HorizontalPodAutoscalerStatus": { + "description": "current status of a horizontal pod autoscaler", + "properties": { + "currentCPUUtilizationPercentage": { + "description": "current average CPU utilization over all pods, represented as a percentage of requested CPU, e.g. 70 means that an average pod is using now 70% of its requested CPU.", + "format": "int32", + "type": "integer" + }, + "currentReplicas": { + "description": "current number of replicas of pods managed by this autoscaler.", + "format": "int32", + "type": "integer" + }, + "desiredReplicas": { + "description": "desired number of replicas of pods managed by this autoscaler.", + "format": "int32", + "type": "integer" + }, + "lastScaleTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "last time the HorizontalPodAutoscaler scaled the number of pods; used by the autoscaler to control how often the number of pods is changed." + }, + "observedGeneration": { + "description": "most recent generation observed by this autoscaler.", + "format": "int64", + "type": "integer" + } + }, + "required": [ + "currentReplicas", + "desiredReplicas" + ], + "type": "object" + }, + "io.k8s.api.autoscaling.v1.Scale": { + "description": "Scale represents a scaling request for a resource.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object metadata; More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata." + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v1.ScaleSpec", + "description": "defines the behavior of the scale. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status." + }, + "status": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v1.ScaleStatus", + "description": "current status of the scale. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status. Read-only." + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "autoscaling", + "kind": "Scale", + "version": "v1" + } + ] + }, + "io.k8s.api.autoscaling.v1.ScaleSpec": { + "description": "ScaleSpec describes the attributes of a scale subresource.", + "properties": { + "replicas": { + "description": "desired number of instances for the scaled object.", + "format": "int32", + "type": "integer" + } + }, + "type": "object" + }, + "io.k8s.api.autoscaling.v1.ScaleStatus": { + "description": "ScaleStatus represents the current status of a scale subresource.", + "properties": { + "replicas": { + "description": "actual number of observed instances of the scaled object.", + "format": "int32", + "type": "integer" + }, + "selector": { + "description": "label query over pods that should match the replicas count. This is same as the label selector but in the string format to avoid introspection by clients. The string will be in the same format as the query-param syntax. More info about label selectors: http://kubernetes.io/docs/user-guide/labels#label-selectors", + "type": "string" + } + }, + "required": [ + "replicas" + ], + "type": "object" + }, + "io.k8s.api.autoscaling.v2beta1.ContainerResourceMetricSource": { + "description": "ContainerResourceMetricSource indicates how to scale on a resource metric known to Kubernetes, as specified in requests and limits, describing each pod in the current scale target (e.g. CPU or memory). The values will be averaged together before being compared to the target. Such metrics are built in to Kubernetes, and have special scaling options on top of those available to normal per-pod metrics using the \"pods\" source. Only one \"target\" type should be set.", + "properties": { + "container": { + "description": "container is the name of the container in the pods of the scaling target", + "type": "string" + }, + "name": { + "description": "name is the name of the resource in question.", + "type": "string" + }, + "targetAverageUtilization": { + "description": "targetAverageUtilization is the target value of the average of the resource metric across all relevant pods, represented as a percentage of the requested value of the resource for the pods.", + "format": "int32", + "type": "integer" + }, + "targetAverageValue": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity", + "description": "targetAverageValue is the target value of the average of the resource metric across all relevant pods, as a raw value (instead of as a percentage of the request), similar to the \"pods\" metric source type." + } + }, + "required": [ + "name", + "container" + ], + "type": "object" + }, + "io.k8s.api.autoscaling.v2beta1.ContainerResourceMetricStatus": { + "description": "ContainerResourceMetricStatus indicates the current value of a resource metric known to Kubernetes, as specified in requests and limits, describing a single container in each pod in the current scale target (e.g. CPU or memory). Such metrics are built in to Kubernetes, and have special scaling options on top of those available to normal per-pod metrics using the \"pods\" source.", + "properties": { + "container": { + "description": "container is the name of the container in the pods of the scaling target", + "type": "string" + }, + "currentAverageUtilization": { + "description": "currentAverageUtilization is the current value of the average of the resource metric across all relevant pods, represented as a percentage of the requested value of the resource for the pods. It will only be present if `targetAverageValue` was set in the corresponding metric specification.", + "format": "int32", + "type": "integer" + }, + "currentAverageValue": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity", + "description": "currentAverageValue is the current value of the average of the resource metric across all relevant pods, as a raw value (instead of as a percentage of the request), similar to the \"pods\" metric source type. It will always be set, regardless of the corresponding metric specification." + }, + "name": { + "description": "name is the name of the resource in question.", + "type": "string" + } + }, + "required": [ + "name", + "currentAverageValue", + "container" + ], + "type": "object" + }, + "io.k8s.api.autoscaling.v2beta1.CrossVersionObjectReference": { + "description": "CrossVersionObjectReference contains enough information to let you identify the referred resource.", + "properties": { + "apiVersion": { + "description": "API version of the referent", + "type": "string" + }, + "kind": { + "description": "Kind of the referent; More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\"", + "type": "string" + }, + "name": { + "description": "Name of the referent; More info: http://kubernetes.io/docs/user-guide/identifiers#names", + "type": "string" + } + }, + "required": [ + "kind", + "name" + ], + "type": "object" + }, + "io.k8s.api.autoscaling.v2beta1.ExternalMetricSource": { + "description": "ExternalMetricSource indicates how to scale on a metric not associated with any Kubernetes object (for example length of queue in cloud messaging service, or QPS from loadbalancer running outside of cluster). Exactly one \"target\" type should be set.", + "properties": { + "metricName": { + "description": "metricName is the name of the metric in question.", + "type": "string" + }, + "metricSelector": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector", + "description": "metricSelector is used to identify a specific time series within a given metric." + }, + "targetAverageValue": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity", + "description": "targetAverageValue is the target per-pod value of global metric (as a quantity). Mutually exclusive with TargetValue." + }, + "targetValue": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity", + "description": "targetValue is the target value of the metric (as a quantity). Mutually exclusive with TargetAverageValue." + } + }, + "required": [ + "metricName" + ], + "type": "object" + }, + "io.k8s.api.autoscaling.v2beta1.ExternalMetricStatus": { + "description": "ExternalMetricStatus indicates the current value of a global metric not associated with any Kubernetes object.", + "properties": { + "currentAverageValue": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity", + "description": "currentAverageValue is the current value of metric averaged over autoscaled pods." + }, + "currentValue": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity", + "description": "currentValue is the current value of the metric (as a quantity)" + }, + "metricName": { + "description": "metricName is the name of a metric used for autoscaling in metric system.", + "type": "string" + }, + "metricSelector": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector", + "description": "metricSelector is used to identify a specific time series within a given metric." + } + }, + "required": [ + "metricName", + "currentValue" + ], + "type": "object" + }, + "io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscaler": { + "description": "HorizontalPodAutoscaler is the configuration for a horizontal pod autoscaler, which automatically manages the replica count of any resource implementing the scale subresource based on the metrics specified.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "metadata is the standard object metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscalerSpec", + "description": "spec is the specification for the behaviour of the autoscaler. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status." + }, + "status": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscalerStatus", + "description": "status is the current information about the autoscaler." + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "autoscaling", + "kind": "HorizontalPodAutoscaler", + "version": "v2beta1" + } + ] + }, + "io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscalerCondition": { + "description": "HorizontalPodAutoscalerCondition describes the state of a HorizontalPodAutoscaler at a certain point.", + "properties": { + "lastTransitionTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "lastTransitionTime is the last time the condition transitioned from one status to another" + }, + "message": { + "description": "message is a human-readable explanation containing details about the transition", + "type": "string" + }, + "reason": { + "description": "reason is the reason for the condition's last transition.", + "type": "string" + }, + "status": { + "description": "status is the status of the condition (True, False, Unknown)", + "type": "string" + }, + "type": { + "description": "type describes the current condition", + "type": "string" + } + }, + "required": [ + "type", + "status" + ], + "type": "object" + }, + "io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscalerList": { + "description": "HorizontalPodAutoscaler is a list of horizontal pod autoscaler objects.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "items is the list of horizontal pod autoscaler objects.", + "items": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscaler" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "metadata is the standard list metadata." + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "autoscaling", + "kind": "HorizontalPodAutoscalerList", + "version": "v2beta1" + } + ] + }, + "io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscalerSpec": { + "description": "HorizontalPodAutoscalerSpec describes the desired functionality of the HorizontalPodAutoscaler.", + "properties": { + "maxReplicas": { + "description": "maxReplicas is the upper limit for the number of replicas to which the autoscaler can scale up. It cannot be less that minReplicas.", + "format": "int32", + "type": "integer" + }, + "metrics": { + "description": "metrics contains the specifications for which to use to calculate the desired replica count (the maximum replica count across all metrics will be used). The desired replica count is calculated multiplying the ratio between the target value and the current value by the current number of pods. Ergo, metrics used must decrease as the pod count is increased, and vice-versa. See the individual metric source types for more information about how each type of metric must respond.", + "items": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta1.MetricSpec" + }, + "type": "array" + }, + "minReplicas": { + "description": "minReplicas is the lower limit for the number of replicas to which the autoscaler can scale down. It defaults to 1 pod. minReplicas is allowed to be 0 if the alpha feature gate HPAScaleToZero is enabled and at least one Object or External metric is configured. Scaling is active as long as at least one metric value is available.", + "format": "int32", + "type": "integer" + }, + "scaleTargetRef": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta1.CrossVersionObjectReference", + "description": "scaleTargetRef points to the target resource to scale, and is used to the pods for which metrics should be collected, as well as to actually change the replica count." + } + }, + "required": [ + "scaleTargetRef", + "maxReplicas" + ], + "type": "object" + }, + "io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscalerStatus": { + "description": "HorizontalPodAutoscalerStatus describes the current status of a horizontal pod autoscaler.", + "properties": { + "conditions": { + "description": "conditions is the set of conditions required for this autoscaler to scale its target, and indicates whether or not those conditions are met.", + "items": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscalerCondition" + }, + "type": "array" + }, + "currentMetrics": { + "description": "currentMetrics is the last read state of the metrics used by this autoscaler.", + "items": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta1.MetricStatus" + }, + "type": "array" + }, + "currentReplicas": { + "description": "currentReplicas is current number of replicas of pods managed by this autoscaler, as last seen by the autoscaler.", + "format": "int32", + "type": "integer" + }, + "desiredReplicas": { + "description": "desiredReplicas is the desired number of replicas of pods managed by this autoscaler, as last calculated by the autoscaler.", + "format": "int32", + "type": "integer" + }, + "lastScaleTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "lastScaleTime is the last time the HorizontalPodAutoscaler scaled the number of pods, used by the autoscaler to control how often the number of pods is changed." + }, + "observedGeneration": { + "description": "observedGeneration is the most recent generation observed by this autoscaler.", + "format": "int64", + "type": "integer" + } + }, + "required": [ + "currentReplicas", + "desiredReplicas", + "conditions" + ], + "type": "object" + }, + "io.k8s.api.autoscaling.v2beta1.MetricSpec": { + "description": "MetricSpec specifies how to scale based on a single metric (only `type` and one other matching field should be set at once).", + "properties": { + "containerResource": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta1.ContainerResourceMetricSource", + "description": "container resource refers to a resource metric (such as those specified in requests and limits) known to Kubernetes describing a single container in each pod of the current scale target (e.g. CPU or memory). Such metrics are built in to Kubernetes, and have special scaling options on top of those available to normal per-pod metrics using the \"pods\" source. This is an alpha feature and can be enabled by the HPAContainerMetrics feature flag." + }, + "external": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta1.ExternalMetricSource", + "description": "external refers to a global metric that is not associated with any Kubernetes object. It allows autoscaling based on information coming from components running outside of cluster (for example length of queue in cloud messaging service, or QPS from loadbalancer running outside of cluster)." + }, + "object": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta1.ObjectMetricSource", + "description": "object refers to a metric describing a single kubernetes object (for example, hits-per-second on an Ingress object)." + }, + "pods": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta1.PodsMetricSource", + "description": "pods refers to a metric describing each pod in the current scale target (for example, transactions-processed-per-second). The values will be averaged together before being compared to the target value." + }, + "resource": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta1.ResourceMetricSource", + "description": "resource refers to a resource metric (such as those specified in requests and limits) known to Kubernetes describing each pod in the current scale target (e.g. CPU or memory). Such metrics are built in to Kubernetes, and have special scaling options on top of those available to normal per-pod metrics using the \"pods\" source." + }, + "type": { + "description": "type is the type of metric source. It should be one of \"ContainerResource\", \"External\", \"Object\", \"Pods\" or \"Resource\", each mapping to a matching field in the object. Note: \"ContainerResource\" type is available on when the feature-gate HPAContainerMetrics is enabled", + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + "io.k8s.api.autoscaling.v2beta1.MetricStatus": { + "description": "MetricStatus describes the last-read state of a single metric.", + "properties": { + "containerResource": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta1.ContainerResourceMetricStatus", + "description": "container resource refers to a resource metric (such as those specified in requests and limits) known to Kubernetes describing a single container in each pod in the current scale target (e.g. CPU or memory). Such metrics are built in to Kubernetes, and have special scaling options on top of those available to normal per-pod metrics using the \"pods\" source." + }, + "external": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta1.ExternalMetricStatus", + "description": "external refers to a global metric that is not associated with any Kubernetes object. It allows autoscaling based on information coming from components running outside of cluster (for example length of queue in cloud messaging service, or QPS from loadbalancer running outside of cluster)." + }, + "object": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta1.ObjectMetricStatus", + "description": "object refers to a metric describing a single kubernetes object (for example, hits-per-second on an Ingress object)." + }, + "pods": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta1.PodsMetricStatus", + "description": "pods refers to a metric describing each pod in the current scale target (for example, transactions-processed-per-second). The values will be averaged together before being compared to the target value." + }, + "resource": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta1.ResourceMetricStatus", + "description": "resource refers to a resource metric (such as those specified in requests and limits) known to Kubernetes describing each pod in the current scale target (e.g. CPU or memory). Such metrics are built in to Kubernetes, and have special scaling options on top of those available to normal per-pod metrics using the \"pods\" source." + }, + "type": { + "description": "type is the type of metric source. It will be one of \"ContainerResource\", \"External\", \"Object\", \"Pods\" or \"Resource\", each corresponds to a matching field in the object. Note: \"ContainerResource\" type is available on when the feature-gate HPAContainerMetrics is enabled", + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + "io.k8s.api.autoscaling.v2beta1.ObjectMetricSource": { + "description": "ObjectMetricSource indicates how to scale on a metric describing a kubernetes object (for example, hits-per-second on an Ingress object).", + "properties": { + "averageValue": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity", + "description": "averageValue is the target value of the average of the metric across all relevant pods (as a quantity)" + }, + "metricName": { + "description": "metricName is the name of the metric in question.", + "type": "string" + }, + "selector": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector", + "description": "selector is the string-encoded form of a standard kubernetes label selector for the given metric When set, it is passed as an additional parameter to the metrics server for more specific metrics scoping When unset, just the metricName will be used to gather metrics." + }, + "target": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta1.CrossVersionObjectReference", + "description": "target is the described Kubernetes object." + }, + "targetValue": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity", + "description": "targetValue is the target value of the metric (as a quantity)." + } + }, + "required": [ + "target", + "metricName", + "targetValue" + ], + "type": "object" + }, + "io.k8s.api.autoscaling.v2beta1.ObjectMetricStatus": { + "description": "ObjectMetricStatus indicates the current value of a metric describing a kubernetes object (for example, hits-per-second on an Ingress object).", + "properties": { + "averageValue": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity", + "description": "averageValue is the current value of the average of the metric across all relevant pods (as a quantity)" + }, + "currentValue": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity", + "description": "currentValue is the current value of the metric (as a quantity)." + }, + "metricName": { + "description": "metricName is the name of the metric in question.", + "type": "string" + }, + "selector": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector", + "description": "selector is the string-encoded form of a standard kubernetes label selector for the given metric When set in the ObjectMetricSource, it is passed as an additional parameter to the metrics server for more specific metrics scoping. When unset, just the metricName will be used to gather metrics." + }, + "target": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta1.CrossVersionObjectReference", + "description": "target is the described Kubernetes object." + } + }, + "required": [ + "target", + "metricName", + "currentValue" + ], + "type": "object" + }, + "io.k8s.api.autoscaling.v2beta1.PodsMetricSource": { + "description": "PodsMetricSource indicates how to scale on a metric describing each pod in the current scale target (for example, transactions-processed-per-second). The values will be averaged together before being compared to the target value.", + "properties": { + "metricName": { + "description": "metricName is the name of the metric in question", + "type": "string" + }, + "selector": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector", + "description": "selector is the string-encoded form of a standard kubernetes label selector for the given metric When set, it is passed as an additional parameter to the metrics server for more specific metrics scoping When unset, just the metricName will be used to gather metrics." + }, + "targetAverageValue": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity", + "description": "targetAverageValue is the target value of the average of the metric across all relevant pods (as a quantity)" + } + }, + "required": [ + "metricName", + "targetAverageValue" + ], + "type": "object" + }, + "io.k8s.api.autoscaling.v2beta1.PodsMetricStatus": { + "description": "PodsMetricStatus indicates the current value of a metric describing each pod in the current scale target (for example, transactions-processed-per-second).", + "properties": { + "currentAverageValue": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity", + "description": "currentAverageValue is the current value of the average of the metric across all relevant pods (as a quantity)" + }, + "metricName": { + "description": "metricName is the name of the metric in question", + "type": "string" + }, + "selector": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector", + "description": "selector is the string-encoded form of a standard kubernetes label selector for the given metric When set in the PodsMetricSource, it is passed as an additional parameter to the metrics server for more specific metrics scoping. When unset, just the metricName will be used to gather metrics." + } + }, + "required": [ + "metricName", + "currentAverageValue" + ], + "type": "object" + }, + "io.k8s.api.autoscaling.v2beta1.ResourceMetricSource": { + "description": "ResourceMetricSource indicates how to scale on a resource metric known to Kubernetes, as specified in requests and limits, describing each pod in the current scale target (e.g. CPU or memory). The values will be averaged together before being compared to the target. Such metrics are built in to Kubernetes, and have special scaling options on top of those available to normal per-pod metrics using the \"pods\" source. Only one \"target\" type should be set.", + "properties": { + "name": { + "description": "name is the name of the resource in question.", + "type": "string" + }, + "targetAverageUtilization": { + "description": "targetAverageUtilization is the target value of the average of the resource metric across all relevant pods, represented as a percentage of the requested value of the resource for the pods.", + "format": "int32", + "type": "integer" + }, + "targetAverageValue": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity", + "description": "targetAverageValue is the target value of the average of the resource metric across all relevant pods, as a raw value (instead of as a percentage of the request), similar to the \"pods\" metric source type." + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "io.k8s.api.autoscaling.v2beta1.ResourceMetricStatus": { + "description": "ResourceMetricStatus indicates the current value of a resource metric known to Kubernetes, as specified in requests and limits, describing each pod in the current scale target (e.g. CPU or memory). Such metrics are built in to Kubernetes, and have special scaling options on top of those available to normal per-pod metrics using the \"pods\" source.", + "properties": { + "currentAverageUtilization": { + "description": "currentAverageUtilization is the current value of the average of the resource metric across all relevant pods, represented as a percentage of the requested value of the resource for the pods. It will only be present if `targetAverageValue` was set in the corresponding metric specification.", + "format": "int32", + "type": "integer" + }, + "currentAverageValue": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity", + "description": "currentAverageValue is the current value of the average of the resource metric across all relevant pods, as a raw value (instead of as a percentage of the request), similar to the \"pods\" metric source type. It will always be set, regardless of the corresponding metric specification." + }, + "name": { + "description": "name is the name of the resource in question.", + "type": "string" + } + }, + "required": [ + "name", + "currentAverageValue" + ], + "type": "object" + }, + "io.k8s.api.autoscaling.v2beta2.ContainerResourceMetricSource": { + "description": "ContainerResourceMetricSource indicates how to scale on a resource metric known to Kubernetes, as specified in requests and limits, describing each pod in the current scale target (e.g. CPU or memory). The values will be averaged together before being compared to the target. Such metrics are built in to Kubernetes, and have special scaling options on top of those available to normal per-pod metrics using the \"pods\" source. Only one \"target\" type should be set.", + "properties": { + "container": { + "description": "container is the name of the container in the pods of the scaling target", + "type": "string" + }, + "name": { + "description": "name is the name of the resource in question.", + "type": "string" + }, + "target": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.MetricTarget", + "description": "target specifies the target value for the given metric" + } + }, + "required": [ + "name", + "target", + "container" + ], + "type": "object" + }, + "io.k8s.api.autoscaling.v2beta2.ContainerResourceMetricStatus": { + "description": "ContainerResourceMetricStatus indicates the current value of a resource metric known to Kubernetes, as specified in requests and limits, describing a single container in each pod in the current scale target (e.g. CPU or memory). Such metrics are built in to Kubernetes, and have special scaling options on top of those available to normal per-pod metrics using the \"pods\" source.", + "properties": { + "container": { + "description": "Container is the name of the container in the pods of the scaling target", + "type": "string" + }, + "current": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.MetricValueStatus", + "description": "current contains the current value for the given metric" + }, + "name": { + "description": "Name is the name of the resource in question.", + "type": "string" + } + }, + "required": [ + "name", + "current", + "container" + ], + "type": "object" + }, + "io.k8s.api.autoscaling.v2beta2.CrossVersionObjectReference": { + "description": "CrossVersionObjectReference contains enough information to let you identify the referred resource.", + "properties": { + "apiVersion": { + "description": "API version of the referent", + "type": "string" + }, + "kind": { + "description": "Kind of the referent; More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\"", + "type": "string" + }, + "name": { + "description": "Name of the referent; More info: http://kubernetes.io/docs/user-guide/identifiers#names", + "type": "string" + } + }, + "required": [ + "kind", + "name" + ], + "type": "object" + }, + "io.k8s.api.autoscaling.v2beta2.ExternalMetricSource": { + "description": "ExternalMetricSource indicates how to scale on a metric not associated with any Kubernetes object (for example length of queue in cloud messaging service, or QPS from loadbalancer running outside of cluster).", + "properties": { + "metric": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.MetricIdentifier", + "description": "metric identifies the target metric by name and selector" + }, + "target": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.MetricTarget", + "description": "target specifies the target value for the given metric" + } + }, + "required": [ + "metric", + "target" + ], + "type": "object" + }, + "io.k8s.api.autoscaling.v2beta2.ExternalMetricStatus": { + "description": "ExternalMetricStatus indicates the current value of a global metric not associated with any Kubernetes object.", + "properties": { + "current": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.MetricValueStatus", + "description": "current contains the current value for the given metric" + }, + "metric": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.MetricIdentifier", + "description": "metric identifies the target metric by name and selector" + } + }, + "required": [ + "metric", + "current" + ], + "type": "object" + }, + "io.k8s.api.autoscaling.v2beta2.HPAScalingPolicy": { + "description": "HPAScalingPolicy is a single policy which must hold true for a specified past interval.", + "properties": { + "periodSeconds": { + "description": "PeriodSeconds specifies the window of time for which the policy should hold true. PeriodSeconds must be greater than zero and less than or equal to 1800 (30 min).", + "format": "int32", + "type": "integer" + }, + "type": { + "description": "Type is used to specify the scaling policy.", + "type": "string" + }, + "value": { + "description": "Value contains the amount of change which is permitted by the policy. It must be greater than zero", + "format": "int32", + "type": "integer" + } + }, + "required": [ + "type", + "value", + "periodSeconds" + ], + "type": "object" + }, + "io.k8s.api.autoscaling.v2beta2.HPAScalingRules": { + "description": "HPAScalingRules configures the scaling behavior for one direction. These Rules are applied after calculating DesiredReplicas from metrics for the HPA. They can limit the scaling velocity by specifying scaling policies. They can prevent flapping by specifying the stabilization window, so that the number of replicas is not set instantly, instead, the safest value from the stabilization window is chosen.", + "properties": { + "policies": { + "description": "policies is a list of potential scaling polices which can be used during scaling. At least one policy must be specified, otherwise the HPAScalingRules will be discarded as invalid", + "items": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.HPAScalingPolicy" + }, + "type": "array" + }, + "selectPolicy": { + "description": "selectPolicy is used to specify which policy should be used. If not set, the default value MaxPolicySelect is used.", + "type": "string" + }, + "stabilizationWindowSeconds": { + "description": "StabilizationWindowSeconds is the number of seconds for which past recommendations should be considered while scaling up or scaling down. StabilizationWindowSeconds must be greater than or equal to zero and less than or equal to 3600 (one hour). If not set, use the default values: - For scale up: 0 (i.e. no stabilization is done). - For scale down: 300 (i.e. the stabilization window is 300 seconds long).", + "format": "int32", + "type": "integer" + } + }, + "type": "object" + }, + "io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscaler": { + "description": "HorizontalPodAutoscaler is the configuration for a horizontal pod autoscaler, which automatically manages the replica count of any resource implementing the scale subresource based on the metrics specified.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "metadata is the standard object metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerSpec", + "description": "spec is the specification for the behaviour of the autoscaler. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status." + }, + "status": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerStatus", + "description": "status is the current information about the autoscaler." + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "autoscaling", + "kind": "HorizontalPodAutoscaler", + "version": "v2beta2" + } + ] + }, + "io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerBehavior": { + "description": "HorizontalPodAutoscalerBehavior configures the scaling behavior of the target in both Up and Down directions (scaleUp and scaleDown fields respectively).", + "properties": { + "scaleDown": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.HPAScalingRules", + "description": "scaleDown is scaling policy for scaling Down. If not set, the default value is to allow to scale down to minReplicas pods, with a 300 second stabilization window (i.e., the highest recommendation for the last 300sec is used)." + }, + "scaleUp": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.HPAScalingRules", + "description": "scaleUp is scaling policy for scaling Up. If not set, the default value is the higher of:\n * increase no more than 4 pods per 60 seconds\n * double the number of pods per 60 seconds\nNo stabilization is used." + } + }, + "type": "object" + }, + "io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerCondition": { + "description": "HorizontalPodAutoscalerCondition describes the state of a HorizontalPodAutoscaler at a certain point.", + "properties": { + "lastTransitionTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "lastTransitionTime is the last time the condition transitioned from one status to another" + }, + "message": { + "description": "message is a human-readable explanation containing details about the transition", + "type": "string" + }, + "reason": { + "description": "reason is the reason for the condition's last transition.", + "type": "string" + }, + "status": { + "description": "status is the status of the condition (True, False, Unknown)", + "type": "string" + }, + "type": { + "description": "type describes the current condition", + "type": "string" + } + }, + "required": [ + "type", + "status" + ], + "type": "object" + }, + "io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerList": { + "description": "HorizontalPodAutoscalerList is a list of horizontal pod autoscaler objects.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "items is the list of horizontal pod autoscaler objects.", + "items": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscaler" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "metadata is the standard list metadata." + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "autoscaling", + "kind": "HorizontalPodAutoscalerList", + "version": "v2beta2" + } + ] + }, + "io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerSpec": { + "description": "HorizontalPodAutoscalerSpec describes the desired functionality of the HorizontalPodAutoscaler.", + "properties": { + "behavior": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerBehavior", + "description": "behavior configures the scaling behavior of the target in both Up and Down directions (scaleUp and scaleDown fields respectively). If not set, the default HPAScalingRules for scale up and scale down are used." + }, + "maxReplicas": { + "description": "maxReplicas is the upper limit for the number of replicas to which the autoscaler can scale up. It cannot be less that minReplicas.", + "format": "int32", + "type": "integer" + }, + "metrics": { + "description": "metrics contains the specifications for which to use to calculate the desired replica count (the maximum replica count across all metrics will be used). The desired replica count is calculated multiplying the ratio between the target value and the current value by the current number of pods. Ergo, metrics used must decrease as the pod count is increased, and vice-versa. See the individual metric source types for more information about how each type of metric must respond. If not set, the default metric will be set to 80% average CPU utilization.", + "items": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.MetricSpec" + }, + "type": "array" + }, + "minReplicas": { + "description": "minReplicas is the lower limit for the number of replicas to which the autoscaler can scale down. It defaults to 1 pod. minReplicas is allowed to be 0 if the alpha feature gate HPAScaleToZero is enabled and at least one Object or External metric is configured. Scaling is active as long as at least one metric value is available.", + "format": "int32", + "type": "integer" + }, + "scaleTargetRef": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.CrossVersionObjectReference", + "description": "scaleTargetRef points to the target resource to scale, and is used to the pods for which metrics should be collected, as well as to actually change the replica count." + } + }, + "required": [ + "scaleTargetRef", + "maxReplicas" + ], + "type": "object" + }, + "io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerStatus": { + "description": "HorizontalPodAutoscalerStatus describes the current status of a horizontal pod autoscaler.", + "properties": { + "conditions": { + "description": "conditions is the set of conditions required for this autoscaler to scale its target, and indicates whether or not those conditions are met.", + "items": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerCondition" + }, + "type": "array" + }, + "currentMetrics": { + "description": "currentMetrics is the last read state of the metrics used by this autoscaler.", + "items": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.MetricStatus" + }, + "type": "array" + }, + "currentReplicas": { + "description": "currentReplicas is current number of replicas of pods managed by this autoscaler, as last seen by the autoscaler.", + "format": "int32", + "type": "integer" + }, + "desiredReplicas": { + "description": "desiredReplicas is the desired number of replicas of pods managed by this autoscaler, as last calculated by the autoscaler.", + "format": "int32", + "type": "integer" + }, + "lastScaleTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "lastScaleTime is the last time the HorizontalPodAutoscaler scaled the number of pods, used by the autoscaler to control how often the number of pods is changed." + }, + "observedGeneration": { + "description": "observedGeneration is the most recent generation observed by this autoscaler.", + "format": "int64", + "type": "integer" + } + }, + "required": [ + "currentReplicas", + "desiredReplicas", + "conditions" + ], + "type": "object" + }, + "io.k8s.api.autoscaling.v2beta2.MetricIdentifier": { + "description": "MetricIdentifier defines the name and optionally selector for a metric", + "properties": { + "name": { + "description": "name is the name of the given metric", + "type": "string" + }, + "selector": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector", + "description": "selector is the string-encoded form of a standard kubernetes label selector for the given metric When set, it is passed as an additional parameter to the metrics server for more specific metrics scoping. When unset, just the metricName will be used to gather metrics." + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "io.k8s.api.autoscaling.v2beta2.MetricSpec": { + "description": "MetricSpec specifies how to scale based on a single metric (only `type` and one other matching field should be set at once).", + "properties": { + "containerResource": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.ContainerResourceMetricSource", + "description": "container resource refers to a resource metric (such as those specified in requests and limits) known to Kubernetes describing a single container in each pod of the current scale target (e.g. CPU or memory). Such metrics are built in to Kubernetes, and have special scaling options on top of those available to normal per-pod metrics using the \"pods\" source. This is an alpha feature and can be enabled by the HPAContainerMetrics feature flag." + }, + "external": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.ExternalMetricSource", + "description": "external refers to a global metric that is not associated with any Kubernetes object. It allows autoscaling based on information coming from components running outside of cluster (for example length of queue in cloud messaging service, or QPS from loadbalancer running outside of cluster)." + }, + "object": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.ObjectMetricSource", + "description": "object refers to a metric describing a single kubernetes object (for example, hits-per-second on an Ingress object)." + }, + "pods": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.PodsMetricSource", + "description": "pods refers to a metric describing each pod in the current scale target (for example, transactions-processed-per-second). The values will be averaged together before being compared to the target value." + }, + "resource": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.ResourceMetricSource", + "description": "resource refers to a resource metric (such as those specified in requests and limits) known to Kubernetes describing each pod in the current scale target (e.g. CPU or memory). Such metrics are built in to Kubernetes, and have special scaling options on top of those available to normal per-pod metrics using the \"pods\" source." + }, + "type": { + "description": "type is the type of metric source. It should be one of \"ContainerResource\", \"External\", \"Object\", \"Pods\" or \"Resource\", each mapping to a matching field in the object. Note: \"ContainerResource\" type is available on when the feature-gate HPAContainerMetrics is enabled", + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + "io.k8s.api.autoscaling.v2beta2.MetricStatus": { + "description": "MetricStatus describes the last-read state of a single metric.", + "properties": { + "containerResource": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.ContainerResourceMetricStatus", + "description": "container resource refers to a resource metric (such as those specified in requests and limits) known to Kubernetes describing a single container in each pod in the current scale target (e.g. CPU or memory). Such metrics are built in to Kubernetes, and have special scaling options on top of those available to normal per-pod metrics using the \"pods\" source." + }, + "external": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.ExternalMetricStatus", + "description": "external refers to a global metric that is not associated with any Kubernetes object. It allows autoscaling based on information coming from components running outside of cluster (for example length of queue in cloud messaging service, or QPS from loadbalancer running outside of cluster)." + }, + "object": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.ObjectMetricStatus", + "description": "object refers to a metric describing a single kubernetes object (for example, hits-per-second on an Ingress object)." + }, + "pods": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.PodsMetricStatus", + "description": "pods refers to a metric describing each pod in the current scale target (for example, transactions-processed-per-second). The values will be averaged together before being compared to the target value." + }, + "resource": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.ResourceMetricStatus", + "description": "resource refers to a resource metric (such as those specified in requests and limits) known to Kubernetes describing each pod in the current scale target (e.g. CPU or memory). Such metrics are built in to Kubernetes, and have special scaling options on top of those available to normal per-pod metrics using the \"pods\" source." + }, + "type": { + "description": "type is the type of metric source. It will be one of \"ContainerResource\", \"External\", \"Object\", \"Pods\" or \"Resource\", each corresponds to a matching field in the object. Note: \"ContainerResource\" type is available on when the feature-gate HPAContainerMetrics is enabled", + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + "io.k8s.api.autoscaling.v2beta2.MetricTarget": { + "description": "MetricTarget defines the target value, average value, or average utilization of a specific metric", + "properties": { + "averageUtilization": { + "description": "averageUtilization is the target value of the average of the resource metric across all relevant pods, represented as a percentage of the requested value of the resource for the pods. Currently only valid for Resource metric source type", + "format": "int32", + "type": "integer" + }, + "averageValue": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity", + "description": "averageValue is the target value of the average of the metric across all relevant pods (as a quantity)" + }, + "type": { + "description": "type represents whether the metric type is Utilization, Value, or AverageValue", + "type": "string" + }, + "value": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity", + "description": "value is the target value of the metric (as a quantity)." + } + }, + "required": [ + "type" + ], + "type": "object" + }, + "io.k8s.api.autoscaling.v2beta2.MetricValueStatus": { + "description": "MetricValueStatus holds the current value for a metric", + "properties": { + "averageUtilization": { + "description": "currentAverageUtilization is the current value of the average of the resource metric across all relevant pods, represented as a percentage of the requested value of the resource for the pods.", + "format": "int32", + "type": "integer" + }, + "averageValue": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity", + "description": "averageValue is the current value of the average of the metric across all relevant pods (as a quantity)" + }, + "value": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity", + "description": "value is the current value of the metric (as a quantity)." + } + }, + "type": "object" + }, + "io.k8s.api.autoscaling.v2beta2.ObjectMetricSource": { + "description": "ObjectMetricSource indicates how to scale on a metric describing a kubernetes object (for example, hits-per-second on an Ingress object).", + "properties": { + "describedObject": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.CrossVersionObjectReference" + }, + "metric": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.MetricIdentifier", + "description": "metric identifies the target metric by name and selector" + }, + "target": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.MetricTarget", + "description": "target specifies the target value for the given metric" + } + }, + "required": [ + "describedObject", + "target", + "metric" + ], + "type": "object" + }, + "io.k8s.api.autoscaling.v2beta2.ObjectMetricStatus": { + "description": "ObjectMetricStatus indicates the current value of a metric describing a kubernetes object (for example, hits-per-second on an Ingress object).", + "properties": { + "current": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.MetricValueStatus", + "description": "current contains the current value for the given metric" + }, + "describedObject": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.CrossVersionObjectReference" + }, + "metric": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.MetricIdentifier", + "description": "metric identifies the target metric by name and selector" + } + }, + "required": [ + "metric", + "current", + "describedObject" + ], + "type": "object" + }, + "io.k8s.api.autoscaling.v2beta2.PodsMetricSource": { + "description": "PodsMetricSource indicates how to scale on a metric describing each pod in the current scale target (for example, transactions-processed-per-second). The values will be averaged together before being compared to the target value.", + "properties": { + "metric": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.MetricIdentifier", + "description": "metric identifies the target metric by name and selector" + }, + "target": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.MetricTarget", + "description": "target specifies the target value for the given metric" + } + }, + "required": [ + "metric", + "target" + ], + "type": "object" + }, + "io.k8s.api.autoscaling.v2beta2.PodsMetricStatus": { + "description": "PodsMetricStatus indicates the current value of a metric describing each pod in the current scale target (for example, transactions-processed-per-second).", + "properties": { + "current": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.MetricValueStatus", + "description": "current contains the current value for the given metric" + }, + "metric": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.MetricIdentifier", + "description": "metric identifies the target metric by name and selector" + } + }, + "required": [ + "metric", + "current" + ], + "type": "object" + }, + "io.k8s.api.autoscaling.v2beta2.ResourceMetricSource": { + "description": "ResourceMetricSource indicates how to scale on a resource metric known to Kubernetes, as specified in requests and limits, describing each pod in the current scale target (e.g. CPU or memory). The values will be averaged together before being compared to the target. Such metrics are built in to Kubernetes, and have special scaling options on top of those available to normal per-pod metrics using the \"pods\" source. Only one \"target\" type should be set.", + "properties": { + "name": { + "description": "name is the name of the resource in question.", + "type": "string" + }, + "target": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.MetricTarget", + "description": "target specifies the target value for the given metric" + } + }, + "required": [ + "name", + "target" + ], + "type": "object" + }, + "io.k8s.api.autoscaling.v2beta2.ResourceMetricStatus": { + "description": "ResourceMetricStatus indicates the current value of a resource metric known to Kubernetes, as specified in requests and limits, describing each pod in the current scale target (e.g. CPU or memory). Such metrics are built in to Kubernetes, and have special scaling options on top of those available to normal per-pod metrics using the \"pods\" source.", + "properties": { + "current": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.MetricValueStatus", + "description": "current contains the current value for the given metric" + }, + "name": { + "description": "Name is the name of the resource in question.", + "type": "string" + } + }, + "required": [ + "name", + "current" + ], + "type": "object" + }, + "io.k8s.api.batch.v1.Job": { + "description": "Job represents the configuration of a single job.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.batch.v1.JobSpec", + "description": "Specification of the desired behavior of a job. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" + }, + "status": { + "$ref": "#/definitions/io.k8s.api.batch.v1.JobStatus", + "description": "Current status of a job. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "batch", + "kind": "Job", + "version": "v1" + } + ] + }, + "io.k8s.api.batch.v1.JobCondition": { + "description": "JobCondition describes current state of a job.", + "properties": { + "lastProbeTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "Last time the condition was checked." + }, + "lastTransitionTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "Last time the condition transit from one status to another." + }, + "message": { + "description": "Human readable message indicating details about last transition.", + "type": "string" + }, + "reason": { + "description": "(brief) reason for the condition's last transition.", + "type": "string" + }, + "status": { + "description": "Status of the condition, one of True, False, Unknown.", + "type": "string" + }, + "type": { + "description": "Type of job condition, Complete or Failed.", + "type": "string" + } + }, + "required": [ + "type", + "status" + ], + "type": "object" + }, + "io.k8s.api.batch.v1.JobList": { + "description": "JobList is a collection of jobs.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "items is the list of Jobs.", + "items": { + "$ref": "#/definitions/io.k8s.api.batch.v1.Job" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "batch", + "kind": "JobList", + "version": "v1" + } + ] + }, + "io.k8s.api.batch.v1.JobSpec": { + "description": "JobSpec describes how the job execution will look like.", + "properties": { + "activeDeadlineSeconds": { + "description": "Specifies the duration in seconds relative to the startTime that the job may be active before the system tries to terminate it; value must be positive integer", + "format": "int64", + "type": "integer" + }, + "backoffLimit": { + "description": "Specifies the number of retries before marking this job failed. Defaults to 6", + "format": "int32", + "type": "integer" + }, + "completions": { + "description": "Specifies the desired number of successfully finished pods the job should be run with. Setting to nil means that the success of any pod signals the success of all pods, and allows parallelism to have any positive value. Setting to 1 means that parallelism is limited to 1 and the success of that pod signals the success of the job. More info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/", + "format": "int32", + "type": "integer" + }, + "manualSelector": { + "description": "manualSelector controls generation of pod labels and pod selectors. Leave `manualSelector` unset unless you are certain what you are doing. When false or unset, the system pick labels unique to this job and appends those labels to the pod template. When true, the user is responsible for picking unique labels and specifying the selector. Failure to pick a unique label may cause this and other jobs to not function correctly. However, You may see `manualSelector=true` in jobs that were created with the old `extensions/v1beta1` API. More info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/#specifying-your-own-pod-selector", + "type": "boolean" + }, + "parallelism": { + "description": "Specifies the maximum desired number of pods the job should run at any given time. The actual number of pods running in steady state will be less than this number when ((.spec.completions - .status.successful) \u003c .spec.parallelism), i.e. when the work left to do is less than max parallelism. More info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/", + "format": "int32", + "type": "integer" + }, + "selector": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector", + "description": "A label query over pods that should match the pod count. Normally, the system sets this field for you. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors" + }, + "template": { + "$ref": "#/definitions/io.k8s.api.core.v1.PodTemplateSpec", + "description": "Describes the pod that will be created when executing a job. More info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/" + }, + "ttlSecondsAfterFinished": { + "description": "ttlSecondsAfterFinished limits the lifetime of a Job that has finished execution (either Complete or Failed). If this field is set, ttlSecondsAfterFinished after the Job finishes, it is eligible to be automatically deleted. When the Job is being deleted, its lifecycle guarantees (e.g. finalizers) will be honored. If this field is unset, the Job won't be automatically deleted. If this field is set to zero, the Job becomes eligible to be deleted immediately after it finishes. This field is alpha-level and is only honored by servers that enable the TTLAfterFinished feature.", + "format": "int32", + "type": "integer" + } + }, + "required": [ + "template" + ], + "type": "object" + }, + "io.k8s.api.batch.v1.JobStatus": { + "description": "JobStatus represents the current state of a Job.", + "properties": { + "active": { + "description": "The number of actively running pods.", + "format": "int32", + "type": "integer" + }, + "completionTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "Represents time when the job was completed. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC. The completion time is only set when the job finishes successfully." + }, + "conditions": { + "description": "The latest available observations of an object's current state. When a job fails, one of the conditions will have type == \"Failed\". More info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/", + "items": { + "$ref": "#/definitions/io.k8s.api.batch.v1.JobCondition" + }, + "type": "array", + "x-kubernetes-patch-merge-key": "type", + "x-kubernetes-patch-strategy": "merge" + }, + "failed": { + "description": "The number of pods which reached phase Failed.", + "format": "int32", + "type": "integer" + }, + "startTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "Represents time when the job was acknowledged by the job controller. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC." + }, + "succeeded": { + "description": "The number of pods which reached phase Succeeded.", + "format": "int32", + "type": "integer" + } + }, + "type": "object" + }, + "io.k8s.api.batch.v1beta1.CronJob": { + "description": "CronJob represents the configuration of a single cron job.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.batch.v1beta1.CronJobSpec", + "description": "Specification of the desired behavior of a cron job, including the schedule. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" + }, + "status": { + "$ref": "#/definitions/io.k8s.api.batch.v1beta1.CronJobStatus", + "description": "Current status of a cron job. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "batch", + "kind": "CronJob", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.batch.v1beta1.CronJobList": { + "description": "CronJobList is a collection of cron jobs.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "items is the list of CronJobs.", + "items": { + "$ref": "#/definitions/io.k8s.api.batch.v1beta1.CronJob" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "batch", + "kind": "CronJobList", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.batch.v1beta1.CronJobSpec": { + "description": "CronJobSpec describes how the job execution will look like and when it will actually run.", + "properties": { + "concurrencyPolicy": { + "description": "Specifies how to treat concurrent executions of a Job. Valid values are: - \"Allow\" (default): allows CronJobs to run concurrently; - \"Forbid\": forbids concurrent runs, skipping next run if previous run hasn't finished yet; - \"Replace\": cancels currently running job and replaces it with a new one", + "type": "string" + }, + "failedJobsHistoryLimit": { + "description": "The number of failed finished jobs to retain. This is a pointer to distinguish between explicit zero and not specified. Defaults to 1.", + "format": "int32", + "type": "integer" + }, + "jobTemplate": { + "$ref": "#/definitions/io.k8s.api.batch.v1beta1.JobTemplateSpec", + "description": "Specifies the job that will be created when executing a CronJob." + }, + "schedule": { + "description": "The schedule in Cron format, see https://en.wikipedia.org/wiki/Cron.", + "type": "string" + }, + "startingDeadlineSeconds": { + "description": "Optional deadline in seconds for starting the job if it misses scheduled time for any reason. Missed jobs executions will be counted as failed ones.", + "format": "int64", + "type": "integer" + }, + "successfulJobsHistoryLimit": { + "description": "The number of successful finished jobs to retain. This is a pointer to distinguish between explicit zero and not specified. Defaults to 3.", + "format": "int32", + "type": "integer" + }, + "suspend": { + "description": "This flag tells the controller to suspend subsequent executions, it does not apply to already started executions. Defaults to false.", + "type": "boolean" + } + }, + "required": [ + "schedule", + "jobTemplate" + ], + "type": "object" + }, + "io.k8s.api.batch.v1beta1.CronJobStatus": { + "description": "CronJobStatus represents the current state of a cron job.", + "properties": { + "active": { + "description": "A list of pointers to currently running jobs.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.ObjectReference" + }, + "type": "array" + }, + "lastScheduleTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "Information when was the last time the job was successfully scheduled." + } + }, + "type": "object" + }, + "io.k8s.api.batch.v1beta1.JobTemplateSpec": { + "description": "JobTemplateSpec describes the data a Job should have when created from a template", + "properties": { + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object's metadata of the jobs created from this template. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.batch.v1.JobSpec", + "description": "Specification of the desired behavior of the job. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" + } + }, + "type": "object" + }, + "io.k8s.api.certificates.v1.CertificateSigningRequest": { + "description": "CertificateSigningRequest objects provide a mechanism to obtain x509 certificates by submitting a certificate signing request, and having it asynchronously approved and issued.\n\nKubelets use this API to obtain:\n 1. client certificates to authenticate to kube-apiserver (with the \"kubernetes.io/kube-apiserver-client-kubelet\" signerName).\n 2. serving certificates for TLS endpoints kube-apiserver can connect to securely (with the \"kubernetes.io/kubelet-serving\" signerName).\n\nThis API can be used to request client certificates to authenticate to kube-apiserver (with the \"kubernetes.io/kube-apiserver-client\" signerName), or to obtain certificates from custom non-Kubernetes signers.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequestSpec", + "description": "spec contains the certificate request, and is immutable after creation. Only the request, signerName, and usages fields can be set on creation. Other fields are derived by Kubernetes and cannot be modified by users." + }, + "status": { + "$ref": "#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequestStatus", + "description": "status contains information about whether the request is approved or denied, and the certificate issued by the signer, or the failure condition indicating signer failure." + } + }, + "required": [ + "spec" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "certificates.k8s.io", + "kind": "CertificateSigningRequest", + "version": "v1" + } + ] + }, + "io.k8s.api.certificates.v1.CertificateSigningRequestCondition": { + "description": "CertificateSigningRequestCondition describes a condition of a CertificateSigningRequest object", + "properties": { + "lastTransitionTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "lastTransitionTime is the time the condition last transitioned from one status to another. If unset, when a new condition type is added or an existing condition's status is changed, the server defaults this to the current time." + }, + "lastUpdateTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "lastUpdateTime is the time of the last update to this condition" + }, + "message": { + "description": "message contains a human readable message with details about the request state", + "type": "string" + }, + "reason": { + "description": "reason indicates a brief reason for the request state", + "type": "string" + }, + "status": { + "description": "status of the condition, one of True, False, Unknown. Approved, Denied, and Failed conditions may not be \"False\" or \"Unknown\".", + "type": "string" + }, + "type": { + "description": "type of the condition. Known conditions are \"Approved\", \"Denied\", and \"Failed\".\n\nAn \"Approved\" condition is added via the /approval subresource, indicating the request was approved and should be issued by the signer.\n\nA \"Denied\" condition is added via the /approval subresource, indicating the request was denied and should not be issued by the signer.\n\nA \"Failed\" condition is added via the /status subresource, indicating the signer failed to issue the certificate.\n\nApproved and Denied conditions are mutually exclusive. Approved, Denied, and Failed conditions cannot be removed once added.\n\nOnly one condition of a given type is allowed.", + "type": "string" + } + }, + "required": [ + "type", + "status" + ], + "type": "object" + }, + "io.k8s.api.certificates.v1.CertificateSigningRequestList": { + "description": "CertificateSigningRequestList is a collection of CertificateSigningRequest objects", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "items is a collection of CertificateSigningRequest objects", + "items": { + "$ref": "#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequest" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "certificates.k8s.io", + "kind": "CertificateSigningRequestList", + "version": "v1" + } + ] + }, + "io.k8s.api.certificates.v1.CertificateSigningRequestSpec": { + "description": "CertificateSigningRequestSpec contains the certificate request.", + "properties": { + "extra": { + "additionalProperties": { + "items": { + "type": "string" + }, + "type": "array" + }, + "description": "extra contains extra attributes of the user that created the CertificateSigningRequest. Populated by the API server on creation and immutable.", + "type": "object" + }, + "groups": { + "description": "groups contains group membership of the user that created the CertificateSigningRequest. Populated by the API server on creation and immutable.", + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, + "request": { + "description": "request contains an x509 certificate signing request encoded in a \"CERTIFICATE REQUEST\" PEM block. When serialized as JSON or YAML, the data is additionally base64-encoded.", + "format": "byte", + "type": "string", + "x-kubernetes-list-type": "atomic" + }, + "signerName": { + "description": "signerName indicates the requested signer, and is a qualified name.\n\nList/watch requests for CertificateSigningRequests can filter on this field using a \"spec.signerName=NAME\" fieldSelector.\n\nWell-known Kubernetes signers are:\n 1. \"kubernetes.io/kube-apiserver-client\": issues client certificates that can be used to authenticate to kube-apiserver.\n Requests for this signer are never auto-approved by kube-controller-manager, can be issued by the \"csrsigning\" controller in kube-controller-manager.\n 2. \"kubernetes.io/kube-apiserver-client-kubelet\": issues client certificates that kubelets use to authenticate to kube-apiserver.\n Requests for this signer can be auto-approved by the \"csrapproving\" controller in kube-controller-manager, and can be issued by the \"csrsigning\" controller in kube-controller-manager.\n 3. \"kubernetes.io/kubelet-serving\" issues serving certificates that kubelets use to serve TLS endpoints, which kube-apiserver can connect to securely.\n Requests for this signer are never auto-approved by kube-controller-manager, and can be issued by the \"csrsigning\" controller in kube-controller-manager.\n\nMore details are available at https://k8s.io/docs/reference/access-authn-authz/certificate-signing-requests/#kubernetes-signers\n\nCustom signerNames can also be specified. The signer defines:\n 1. Trust distribution: how trust (CA bundles) are distributed.\n 2. Permitted subjects: and behavior when a disallowed subject is requested.\n 3. Required, permitted, or forbidden x509 extensions in the request (including whether subjectAltNames are allowed, which types, restrictions on allowed values) and behavior when a disallowed extension is requested.\n 4. Required, permitted, or forbidden key usages / extended key usages.\n 5. Expiration/certificate lifetime: whether it is fixed by the signer, configurable by the admin.\n 6. Whether or not requests for CA certificates are allowed.", + "type": "string" + }, + "uid": { + "description": "uid contains the uid of the user that created the CertificateSigningRequest. Populated by the API server on creation and immutable.", + "type": "string" + }, + "usages": { + "description": "usages specifies a set of key usages requested in the issued certificate.\n\nRequests for TLS client certificates typically request: \"digital signature\", \"key encipherment\", \"client auth\".\n\nRequests for TLS serving certificates typically request: \"key encipherment\", \"digital signature\", \"server auth\".\n\nValid values are:\n \"signing\", \"digital signature\", \"content commitment\",\n \"key encipherment\", \"key agreement\", \"data encipherment\",\n \"cert sign\", \"crl sign\", \"encipher only\", \"decipher only\", \"any\",\n \"server auth\", \"client auth\",\n \"code signing\", \"email protection\", \"s/mime\",\n \"ipsec end system\", \"ipsec tunnel\", \"ipsec user\",\n \"timestamping\", \"ocsp signing\", \"microsoft sgc\", \"netscape sgc\"", + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, + "username": { + "description": "username contains the name of the user that created the CertificateSigningRequest. Populated by the API server on creation and immutable.", + "type": "string" + } + }, + "required": [ + "request", + "signerName" + ], + "type": "object" + }, + "io.k8s.api.certificates.v1.CertificateSigningRequestStatus": { + "description": "CertificateSigningRequestStatus contains conditions used to indicate approved/denied/failed status of the request, and the issued certificate.", + "properties": { + "certificate": { + "description": "certificate is populated with an issued certificate by the signer after an Approved condition is present. This field is set via the /status subresource. Once populated, this field is immutable.\n\nIf the certificate signing request is denied, a condition of type \"Denied\" is added and this field remains empty. If the signer cannot issue the certificate, a condition of type \"Failed\" is added and this field remains empty.\n\nValidation requirements:\n 1. certificate must contain one or more PEM blocks.\n 2. All PEM blocks must have the \"CERTIFICATE\" label, contain no headers, and the encoded data\n must be a BER-encoded ASN.1 Certificate structure as described in section 4 of RFC5280.\n 3. Non-PEM content may appear before or after the \"CERTIFICATE\" PEM blocks and is unvalidated,\n to allow for explanatory text as described in section 5.2 of RFC7468.\n\nIf more than one PEM block is present, and the definition of the requested spec.signerName does not indicate otherwise, the first block is the issued certificate, and subsequent blocks should be treated as intermediate certificates and presented in TLS handshakes.\n\nThe certificate is encoded in PEM format.\n\nWhen serialized as JSON or YAML, the data is additionally base64-encoded, so it consists of:\n\n base64(\n -----BEGIN CERTIFICATE-----\n ...\n -----END CERTIFICATE-----\n )", + "format": "byte", + "type": "string", + "x-kubernetes-list-type": "atomic" + }, + "conditions": { + "description": "conditions applied to the request. Known conditions are \"Approved\", \"Denied\", and \"Failed\".", + "items": { + "$ref": "#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequestCondition" + }, + "type": "array", + "x-kubernetes-list-map-keys": [ + "type" + ], + "x-kubernetes-list-type": "map" + } + }, + "type": "object" + }, + "io.k8s.api.certificates.v1beta1.CertificateSigningRequest": { + "description": "Describes a certificate signing request", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequestSpec", + "description": "The certificate request itself and any additional information." + }, + "status": { + "$ref": "#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequestStatus", + "description": "Derived information about the request." + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "certificates.k8s.io", + "kind": "CertificateSigningRequest", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.certificates.v1beta1.CertificateSigningRequestCondition": { + "properties": { + "lastTransitionTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "lastTransitionTime is the time the condition last transitioned from one status to another. If unset, when a new condition type is added or an existing condition's status is changed, the server defaults this to the current time." + }, + "lastUpdateTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "timestamp for the last update to this condition" + }, + "message": { + "description": "human readable message with details about the request state", + "type": "string" + }, + "reason": { + "description": "brief reason for the request state", + "type": "string" + }, + "status": { + "description": "Status of the condition, one of True, False, Unknown. Approved, Denied, and Failed conditions may not be \"False\" or \"Unknown\". Defaults to \"True\". If unset, should be treated as \"True\".", + "type": "string" + }, + "type": { + "description": "type of the condition. Known conditions include \"Approved\", \"Denied\", and \"Failed\".", + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + "io.k8s.api.certificates.v1beta1.CertificateSigningRequestList": { + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "items": { + "$ref": "#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequest" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "certificates.k8s.io", + "kind": "CertificateSigningRequestList", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.certificates.v1beta1.CertificateSigningRequestSpec": { + "description": "This information is immutable after the request is created. Only the Request and Usages fields can be set on creation, other fields are derived by Kubernetes and cannot be modified by users.", + "properties": { + "extra": { + "additionalProperties": { + "items": { + "type": "string" + }, + "type": "array" + }, + "description": "Extra information about the requesting user. See user.Info interface for details.", + "type": "object" + }, + "groups": { + "description": "Group information about the requesting user. See user.Info interface for details.", + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, + "request": { + "description": "Base64-encoded PKCS#10 CSR data", + "format": "byte", + "type": "string", + "x-kubernetes-list-type": "atomic" + }, + "signerName": { + "description": "Requested signer for the request. It is a qualified name in the form: `scope-hostname.io/name`. If empty, it will be defaulted:\n 1. If it's a kubelet client certificate, it is assigned\n \"kubernetes.io/kube-apiserver-client-kubelet\".\n 2. If it's a kubelet serving certificate, it is assigned\n \"kubernetes.io/kubelet-serving\".\n 3. Otherwise, it is assigned \"kubernetes.io/legacy-unknown\".\nDistribution of trust for signers happens out of band. You can select on this field using `spec.signerName`.", + "type": "string" + }, + "uid": { + "description": "UID information about the requesting user. See user.Info interface for details.", + "type": "string" + }, + "usages": { + "description": "allowedUsages specifies a set of usage contexts the key will be valid for. See: https://tools.ietf.org/html/rfc5280#section-4.2.1.3\n https://tools.ietf.org/html/rfc5280#section-4.2.1.12\nValid values are:\n \"signing\",\n \"digital signature\",\n \"content commitment\",\n \"key encipherment\",\n \"key agreement\",\n \"data encipherment\",\n \"cert sign\",\n \"crl sign\",\n \"encipher only\",\n \"decipher only\",\n \"any\",\n \"server auth\",\n \"client auth\",\n \"code signing\",\n \"email protection\",\n \"s/mime\",\n \"ipsec end system\",\n \"ipsec tunnel\",\n \"ipsec user\",\n \"timestamping\",\n \"ocsp signing\",\n \"microsoft sgc\",\n \"netscape sgc\"", + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, + "username": { + "description": "Information about the requesting user. See user.Info interface for details.", + "type": "string" + } + }, + "required": [ + "request" + ], + "type": "object" + }, + "io.k8s.api.certificates.v1beta1.CertificateSigningRequestStatus": { + "properties": { + "certificate": { + "description": "If request was approved, the controller will place the issued certificate here.", + "format": "byte", + "type": "string", + "x-kubernetes-list-type": "atomic" + }, + "conditions": { + "description": "Conditions applied to the request, such as approval or denial.", + "items": { + "$ref": "#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequestCondition" + }, + "type": "array", + "x-kubernetes-list-map-keys": [ + "type" + ], + "x-kubernetes-list-type": "map" + } + }, + "type": "object" + }, + "io.k8s.api.coordination.v1.Lease": { + "description": "Lease defines a lease concept.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.coordination.v1.LeaseSpec", + "description": "Specification of the Lease. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "coordination.k8s.io", + "kind": "Lease", + "version": "v1" + } + ] + }, + "io.k8s.api.coordination.v1.LeaseList": { + "description": "LeaseList is a list of Lease objects.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "Items is a list of schema objects.", + "items": { + "$ref": "#/definitions/io.k8s.api.coordination.v1.Lease" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "coordination.k8s.io", + "kind": "LeaseList", + "version": "v1" + } + ] + }, + "io.k8s.api.coordination.v1.LeaseSpec": { + "description": "LeaseSpec is a specification of a Lease.", + "properties": { + "acquireTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.MicroTime", + "description": "acquireTime is a time when the current lease was acquired." + }, + "holderIdentity": { + "description": "holderIdentity contains the identity of the holder of a current lease.", + "type": "string" + }, + "leaseDurationSeconds": { + "description": "leaseDurationSeconds is a duration that candidates for a lease need to wait to force acquire it. This is measure against time of last observed RenewTime.", + "format": "int32", + "type": "integer" + }, + "leaseTransitions": { + "description": "leaseTransitions is the number of transitions of a lease between holders.", + "format": "int32", + "type": "integer" + }, + "renewTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.MicroTime", + "description": "renewTime is a time when the current holder of a lease has last updated the lease." + } + }, + "type": "object" + }, + "io.k8s.api.coordination.v1beta1.Lease": { + "description": "Lease defines a lease concept.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.coordination.v1beta1.LeaseSpec", + "description": "Specification of the Lease. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "coordination.k8s.io", + "kind": "Lease", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.coordination.v1beta1.LeaseList": { + "description": "LeaseList is a list of Lease objects.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "Items is a list of schema objects.", + "items": { + "$ref": "#/definitions/io.k8s.api.coordination.v1beta1.Lease" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "coordination.k8s.io", + "kind": "LeaseList", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.coordination.v1beta1.LeaseSpec": { + "description": "LeaseSpec is a specification of a Lease.", + "properties": { + "acquireTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.MicroTime", + "description": "acquireTime is a time when the current lease was acquired." + }, + "holderIdentity": { + "description": "holderIdentity contains the identity of the holder of a current lease.", + "type": "string" + }, + "leaseDurationSeconds": { + "description": "leaseDurationSeconds is a duration that candidates for a lease need to wait to force acquire it. This is measure against time of last observed RenewTime.", + "format": "int32", + "type": "integer" + }, + "leaseTransitions": { + "description": "leaseTransitions is the number of transitions of a lease between holders.", + "format": "int32", + "type": "integer" + }, + "renewTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.MicroTime", + "description": "renewTime is a time when the current holder of a lease has last updated the lease." + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.AWSElasticBlockStoreVolumeSource": { + "description": "Represents a Persistent Disk resource in AWS.\n\nAn AWS EBS disk must exist before mounting to a container. The disk must also be in the same AWS zone as the kubelet. An AWS EBS disk can only be mounted as read/write once. AWS EBS volumes support ownership management and SELinux relabeling.", + "properties": { + "fsType": { + "description": "Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore", + "type": "string" + }, + "partition": { + "description": "The partition in the volume that you want to mount. If omitted, the default is to mount by volume name. Examples: For volume /dev/sda1, you specify the partition as \"1\". Similarly, the volume partition for /dev/sda is \"0\" (or you can leave the property empty).", + "format": "int32", + "type": "integer" + }, + "readOnly": { + "description": "Specify \"true\" to force and set the ReadOnly property in VolumeMounts to \"true\". If omitted, the default is \"false\". More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore", + "type": "boolean" + }, + "volumeID": { + "description": "Unique ID of the persistent disk resource in AWS (Amazon EBS volume). More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore", + "type": "string" + } + }, + "required": [ + "volumeID" + ], + "type": "object" + }, + "io.k8s.api.core.v1.Affinity": { + "description": "Affinity is a group of affinity scheduling rules.", + "properties": { + "nodeAffinity": { + "$ref": "#/definitions/io.k8s.api.core.v1.NodeAffinity", + "description": "Describes node affinity scheduling rules for the pod." + }, + "podAffinity": { + "$ref": "#/definitions/io.k8s.api.core.v1.PodAffinity", + "description": "Describes pod affinity scheduling rules (e.g. co-locate this pod in the same node, zone, etc. as some other pod(s))." + }, + "podAntiAffinity": { + "$ref": "#/definitions/io.k8s.api.core.v1.PodAntiAffinity", + "description": "Describes pod anti-affinity scheduling rules (e.g. avoid putting this pod in the same node, zone, etc. as some other pod(s))." + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.AttachedVolume": { + "description": "AttachedVolume describes a volume attached to a node", + "properties": { + "devicePath": { + "description": "DevicePath represents the device path where the volume should be available", + "type": "string" + }, + "name": { + "description": "Name of the attached volume", + "type": "string" + } + }, + "required": [ + "name", + "devicePath" + ], + "type": "object" + }, + "io.k8s.api.core.v1.AzureDiskVolumeSource": { + "description": "AzureDisk represents an Azure Data Disk mount on the host and bind mount to the pod.", + "properties": { + "cachingMode": { + "description": "Host Caching mode: None, Read Only, Read Write.", + "type": "string" + }, + "diskName": { + "description": "The Name of the data disk in the blob storage", + "type": "string" + }, + "diskURI": { + "description": "The URI the data disk in the blob storage", + "type": "string" + }, + "fsType": { + "description": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.", + "type": "string" + }, + "kind": { + "description": "Expected values Shared: multiple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared", + "type": "string" + }, + "readOnly": { + "description": "Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.", + "type": "boolean" + } + }, + "required": [ + "diskName", + "diskURI" + ], + "type": "object" + }, + "io.k8s.api.core.v1.AzureFilePersistentVolumeSource": { + "description": "AzureFile represents an Azure File Service mount on the host and bind mount to the pod.", + "properties": { + "readOnly": { + "description": "Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.", + "type": "boolean" + }, + "secretName": { + "description": "the name of secret that contains Azure Storage Account Name and Key", + "type": "string" + }, + "secretNamespace": { + "description": "the namespace of the secret that contains Azure Storage Account Name and Key default is the same as the Pod", + "type": "string" + }, + "shareName": { + "description": "Share Name", + "type": "string" + } + }, + "required": [ + "secretName", + "shareName" + ], + "type": "object" + }, + "io.k8s.api.core.v1.AzureFileVolumeSource": { + "description": "AzureFile represents an Azure File Service mount on the host and bind mount to the pod.", + "properties": { + "readOnly": { + "description": "Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.", + "type": "boolean" + }, + "secretName": { + "description": "the name of secret that contains Azure Storage Account Name and Key", + "type": "string" + }, + "shareName": { + "description": "Share Name", + "type": "string" + } + }, + "required": [ + "secretName", + "shareName" + ], + "type": "object" + }, + "io.k8s.api.core.v1.Binding": { + "description": "Binding ties one object to another; for example, a pod is bound to a node by a scheduler. Deprecated in 1.7, please use the bindings subresource of pods instead.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "target": { + "$ref": "#/definitions/io.k8s.api.core.v1.ObjectReference", + "description": "The target object that you want to bind to the standard object." + } + }, + "required": [ + "target" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "", + "kind": "Binding", + "version": "v1" + } + ] + }, + "io.k8s.api.core.v1.CSIPersistentVolumeSource": { + "description": "Represents storage that is managed by an external CSI volume driver (Beta feature)", + "properties": { + "controllerExpandSecretRef": { + "$ref": "#/definitions/io.k8s.api.core.v1.SecretReference", + "description": "ControllerExpandSecretRef is a reference to the secret object containing sensitive information to pass to the CSI driver to complete the CSI ControllerExpandVolume call. This is an alpha field and requires enabling ExpandCSIVolumes feature gate. This field is optional, and may be empty if no secret is required. If the secret object contains more than one secret, all secrets are passed." + }, + "controllerPublishSecretRef": { + "$ref": "#/definitions/io.k8s.api.core.v1.SecretReference", + "description": "ControllerPublishSecretRef is a reference to the secret object containing sensitive information to pass to the CSI driver to complete the CSI ControllerPublishVolume and ControllerUnpublishVolume calls. This field is optional, and may be empty if no secret is required. If the secret object contains more than one secret, all secrets are passed." + }, + "driver": { + "description": "Driver is the name of the driver to use for this volume. Required.", + "type": "string" + }, + "fsType": { + "description": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\".", + "type": "string" + }, + "nodePublishSecretRef": { + "$ref": "#/definitions/io.k8s.api.core.v1.SecretReference", + "description": "NodePublishSecretRef is a reference to the secret object containing sensitive information to pass to the CSI driver to complete the CSI NodePublishVolume and NodeUnpublishVolume calls. This field is optional, and may be empty if no secret is required. If the secret object contains more than one secret, all secrets are passed." + }, + "nodeStageSecretRef": { + "$ref": "#/definitions/io.k8s.api.core.v1.SecretReference", + "description": "NodeStageSecretRef is a reference to the secret object containing sensitive information to pass to the CSI driver to complete the CSI NodeStageVolume and NodeStageVolume and NodeUnstageVolume calls. This field is optional, and may be empty if no secret is required. If the secret object contains more than one secret, all secrets are passed." + }, + "readOnly": { + "description": "Optional: The value to pass to ControllerPublishVolumeRequest. Defaults to false (read/write).", + "type": "boolean" + }, + "volumeAttributes": { + "additionalProperties": { + "type": "string" + }, + "description": "Attributes of the volume to publish.", + "type": "object" + }, + "volumeHandle": { + "description": "VolumeHandle is the unique volume name returned by the CSI volume plugin’s CreateVolume to refer to the volume on all subsequent calls. Required.", + "type": "string" + } + }, + "required": [ + "driver", + "volumeHandle" + ], + "type": "object" + }, + "io.k8s.api.core.v1.CSIVolumeSource": { + "description": "Represents a source location of a volume to mount, managed by an external CSI driver", + "properties": { + "driver": { + "description": "Driver is the name of the CSI driver that handles this volume. Consult with your admin for the correct name as registered in the cluster.", + "type": "string" + }, + "fsType": { + "description": "Filesystem type to mount. Ex. \"ext4\", \"xfs\", \"ntfs\". If not provided, the empty value is passed to the associated CSI driver which will determine the default filesystem to apply.", + "type": "string" + }, + "nodePublishSecretRef": { + "$ref": "#/definitions/io.k8s.api.core.v1.LocalObjectReference", + "description": "NodePublishSecretRef is a reference to the secret object containing sensitive information to pass to the CSI driver to complete the CSI NodePublishVolume and NodeUnpublishVolume calls. This field is optional, and may be empty if no secret is required. If the secret object contains more than one secret, all secret references are passed." + }, + "readOnly": { + "description": "Specifies a read-only configuration for the volume. Defaults to false (read/write).", + "type": "boolean" + }, + "volumeAttributes": { + "additionalProperties": { + "type": "string" + }, + "description": "VolumeAttributes stores driver-specific properties that are passed to the CSI driver. Consult your driver's documentation for supported values.", + "type": "object" + } + }, + "required": [ + "driver" + ], + "type": "object" + }, + "io.k8s.api.core.v1.Capabilities": { + "description": "Adds and removes POSIX capabilities from running containers.", + "properties": { + "add": { + "description": "Added capabilities", + "items": { + "type": "string" + }, + "type": "array" + }, + "drop": { + "description": "Removed capabilities", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.CephFSPersistentVolumeSource": { + "description": "Represents a Ceph Filesystem mount that lasts the lifetime of a pod Cephfs volumes do not support ownership management or SELinux relabeling.", + "properties": { + "monitors": { + "description": "Required: Monitors is a collection of Ceph monitors More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it", + "items": { + "type": "string" + }, + "type": "array" + }, + "path": { + "description": "Optional: Used as the mounted root, rather than the full Ceph tree, default is /", + "type": "string" + }, + "readOnly": { + "description": "Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it", + "type": "boolean" + }, + "secretFile": { + "description": "Optional: SecretFile is the path to key ring for User, default is /etc/ceph/user.secret More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it", + "type": "string" + }, + "secretRef": { + "$ref": "#/definitions/io.k8s.api.core.v1.SecretReference", + "description": "Optional: SecretRef is reference to the authentication secret for User, default is empty. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it" + }, + "user": { + "description": "Optional: User is the rados user name, default is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it", + "type": "string" + } + }, + "required": [ + "monitors" + ], + "type": "object" + }, + "io.k8s.api.core.v1.CephFSVolumeSource": { + "description": "Represents a Ceph Filesystem mount that lasts the lifetime of a pod Cephfs volumes do not support ownership management or SELinux relabeling.", + "properties": { + "monitors": { + "description": "Required: Monitors is a collection of Ceph monitors More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it", + "items": { + "type": "string" + }, + "type": "array" + }, + "path": { + "description": "Optional: Used as the mounted root, rather than the full Ceph tree, default is /", + "type": "string" + }, + "readOnly": { + "description": "Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it", + "type": "boolean" + }, + "secretFile": { + "description": "Optional: SecretFile is the path to key ring for User, default is /etc/ceph/user.secret More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it", + "type": "string" + }, + "secretRef": { + "$ref": "#/definitions/io.k8s.api.core.v1.LocalObjectReference", + "description": "Optional: SecretRef is reference to the authentication secret for User, default is empty. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it" + }, + "user": { + "description": "Optional: User is the rados user name, default is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it", + "type": "string" + } + }, + "required": [ + "monitors" + ], + "type": "object" + }, + "io.k8s.api.core.v1.CinderPersistentVolumeSource": { + "description": "Represents a cinder volume resource in Openstack. A Cinder volume must exist before mounting to a container. The volume must also be in the same region as the kubelet. Cinder volumes support ownership management and SELinux relabeling.", + "properties": { + "fsType": { + "description": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified. More info: https://examples.k8s.io/mysql-cinder-pd/README.md", + "type": "string" + }, + "readOnly": { + "description": "Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. More info: https://examples.k8s.io/mysql-cinder-pd/README.md", + "type": "boolean" + }, + "secretRef": { + "$ref": "#/definitions/io.k8s.api.core.v1.SecretReference", + "description": "Optional: points to a secret object containing parameters used to connect to OpenStack." + }, + "volumeID": { + "description": "volume id used to identify the volume in cinder. More info: https://examples.k8s.io/mysql-cinder-pd/README.md", + "type": "string" + } + }, + "required": [ + "volumeID" + ], + "type": "object" + }, + "io.k8s.api.core.v1.CinderVolumeSource": { + "description": "Represents a cinder volume resource in Openstack. A Cinder volume must exist before mounting to a container. The volume must also be in the same region as the kubelet. Cinder volumes support ownership management and SELinux relabeling.", + "properties": { + "fsType": { + "description": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified. More info: https://examples.k8s.io/mysql-cinder-pd/README.md", + "type": "string" + }, + "readOnly": { + "description": "Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. More info: https://examples.k8s.io/mysql-cinder-pd/README.md", + "type": "boolean" + }, + "secretRef": { + "$ref": "#/definitions/io.k8s.api.core.v1.LocalObjectReference", + "description": "Optional: points to a secret object containing parameters used to connect to OpenStack." + }, + "volumeID": { + "description": "volume id used to identify the volume in cinder. More info: https://examples.k8s.io/mysql-cinder-pd/README.md", + "type": "string" + } + }, + "required": [ + "volumeID" + ], + "type": "object" + }, + "io.k8s.api.core.v1.ClientIPConfig": { + "description": "ClientIPConfig represents the configurations of Client IP based session affinity.", + "properties": { + "timeoutSeconds": { + "description": "timeoutSeconds specifies the seconds of ClientIP type session sticky time. The value must be \u003e0 \u0026\u0026 \u003c=86400(for 1 day) if ServiceAffinity == \"ClientIP\". Default value is 10800(for 3 hours).", + "format": "int32", + "type": "integer" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.ComponentCondition": { + "description": "Information about the condition of a component.", + "properties": { + "error": { + "description": "Condition error code for a component. For example, a health check error code.", + "type": "string" + }, + "message": { + "description": "Message about the condition for a component. For example, information about a health check.", + "type": "string" + }, + "status": { + "description": "Status of the condition for a component. Valid values for \"Healthy\": \"True\", \"False\", or \"Unknown\".", + "type": "string" + }, + "type": { + "description": "Type of condition for a component. Valid value: \"Healthy\"", + "type": "string" + } + }, + "required": [ + "type", + "status" + ], + "type": "object" + }, + "io.k8s.api.core.v1.ComponentStatus": { + "description": "ComponentStatus (and ComponentStatusList) holds the cluster validation info. Deprecated: This API is deprecated in v1.19+", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "conditions": { + "description": "List of component conditions observed", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.ComponentCondition" + }, + "type": "array", + "x-kubernetes-patch-merge-key": "type", + "x-kubernetes-patch-strategy": "merge" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "", + "kind": "ComponentStatus", + "version": "v1" + } + ] + }, + "io.k8s.api.core.v1.ComponentStatusList": { + "description": "Status of all the conditions for the component as a list of ComponentStatus objects. Deprecated: This API is deprecated in v1.19+", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "List of ComponentStatus objects.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.ComponentStatus" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "", + "kind": "ComponentStatusList", + "version": "v1" + } + ] + }, + "io.k8s.api.core.v1.ConfigMap": { + "description": "ConfigMap holds configuration data for pods to consume.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "binaryData": { + "additionalProperties": { + "format": "byte", + "type": "string" + }, + "description": "BinaryData contains the binary data. Each key must consist of alphanumeric characters, '-', '_' or '.'. BinaryData can contain byte sequences that are not in the UTF-8 range. The keys stored in BinaryData must not overlap with the ones in the Data field, this is enforced during validation process. Using this field will require 1.10+ apiserver and kubelet.", + "type": "object" + }, + "data": { + "additionalProperties": { + "type": "string" + }, + "description": "Data contains the configuration data. Each key must consist of alphanumeric characters, '-', '_' or '.'. Values with non-UTF-8 byte sequences must use the BinaryData field. The keys stored in Data must not overlap with the keys in the BinaryData field, this is enforced during validation process.", + "type": "object" + }, + "immutable": { + "description": "Immutable, if set to true, ensures that data stored in the ConfigMap cannot be updated (only object metadata can be modified). If not set to true, the field can be modified at any time. Defaulted to nil. This is a beta field enabled by ImmutableEphemeralVolumes feature gate.", + "type": "boolean" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "", + "kind": "ConfigMap", + "version": "v1" + } + ] + }, + "io.k8s.api.core.v1.ConfigMapEnvSource": { + "description": "ConfigMapEnvSource selects a ConfigMap to populate the environment variables with.\n\nThe contents of the target ConfigMap's Data field will represent the key-value pairs as environment variables.", + "properties": { + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names", + "type": "string" + }, + "optional": { + "description": "Specify whether the ConfigMap must be defined", + "type": "boolean" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.ConfigMapKeySelector": { + "description": "Selects a key from a ConfigMap.", + "properties": { + "key": { + "description": "The key to select.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names", + "type": "string" + }, + "optional": { + "description": "Specify whether the ConfigMap or its key must be defined", + "type": "boolean" + } + }, + "required": [ + "key" + ], + "type": "object" + }, + "io.k8s.api.core.v1.ConfigMapList": { + "description": "ConfigMapList is a resource containing a list of ConfigMap objects.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "Items is the list of ConfigMaps.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.ConfigMap" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "", + "kind": "ConfigMapList", + "version": "v1" + } + ] + }, + "io.k8s.api.core.v1.ConfigMapNodeConfigSource": { + "description": "ConfigMapNodeConfigSource contains the information to reference a ConfigMap as a config source for the Node.", + "properties": { + "kubeletConfigKey": { + "description": "KubeletConfigKey declares which key of the referenced ConfigMap corresponds to the KubeletConfiguration structure This field is required in all cases.", + "type": "string" + }, + "name": { + "description": "Name is the metadata.name of the referenced ConfigMap. This field is required in all cases.", + "type": "string" + }, + "namespace": { + "description": "Namespace is the metadata.namespace of the referenced ConfigMap. This field is required in all cases.", + "type": "string" + }, + "resourceVersion": { + "description": "ResourceVersion is the metadata.ResourceVersion of the referenced ConfigMap. This field is forbidden in Node.Spec, and required in Node.Status.", + "type": "string" + }, + "uid": { + "description": "UID is the metadata.UID of the referenced ConfigMap. This field is forbidden in Node.Spec, and required in Node.Status.", + "type": "string" + } + }, + "required": [ + "namespace", + "name", + "kubeletConfigKey" + ], + "type": "object" + }, + "io.k8s.api.core.v1.ConfigMapProjection": { + "description": "Adapts a ConfigMap into a projected volume.\n\nThe contents of the target ConfigMap's Data field will be presented in a projected volume as files using the keys in the Data field as the file names, unless the items element is populated with specific mappings of keys to paths. Note that this is identical to a configmap volume source without the default mode.", + "properties": { + "items": { + "description": "If unspecified, each key-value pair in the Data field of the referenced ConfigMap will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the ConfigMap, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.KeyToPath" + }, + "type": "array" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names", + "type": "string" + }, + "optional": { + "description": "Specify whether the ConfigMap or its keys must be defined", + "type": "boolean" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.ConfigMapVolumeSource": { + "description": "Adapts a ConfigMap into a volume.\n\nThe contents of the target ConfigMap's Data field will be presented in a volume as files using the keys in the Data field as the file names, unless the items element is populated with specific mappings of keys to paths. ConfigMap volumes support ownership management and SELinux relabeling.", + "properties": { + "defaultMode": { + "description": "Optional: mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Defaults to 0644. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.", + "format": "int32", + "type": "integer" + }, + "items": { + "description": "If unspecified, each key-value pair in the Data field of the referenced ConfigMap will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the ConfigMap, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.KeyToPath" + }, + "type": "array" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names", + "type": "string" + }, + "optional": { + "description": "Specify whether the ConfigMap or its keys must be defined", + "type": "boolean" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.Container": { + "description": "A single application container that you want to run within a pod.", + "properties": { + "args": { + "description": "Arguments to the entrypoint. The docker image's CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell", + "items": { + "type": "string" + }, + "type": "array" + }, + "command": { + "description": "Entrypoint array. Not executed within a shell. The docker image's ENTRYPOINT is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell", + "items": { + "type": "string" + }, + "type": "array" + }, + "env": { + "description": "List of environment variables to set in the container. Cannot be updated.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.EnvVar" + }, + "type": "array", + "x-kubernetes-patch-merge-key": "name", + "x-kubernetes-patch-strategy": "merge" + }, + "envFrom": { + "description": "List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.EnvFromSource" + }, + "type": "array" + }, + "image": { + "description": "Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images This field is optional to allow higher level config management to default or override container images in workload controllers like Deployments and StatefulSets.", + "type": "string" + }, + "imagePullPolicy": { + "description": "Image pull policy. One of Always, Never, IfNotPresent. Defaults to Always if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images", + "type": "string" + }, + "lifecycle": { + "$ref": "#/definitions/io.k8s.api.core.v1.Lifecycle", + "description": "Actions that the management system should take in response to container lifecycle events. Cannot be updated." + }, + "livenessProbe": { + "$ref": "#/definitions/io.k8s.api.core.v1.Probe", + "description": "Periodic probe of container liveness. Container will be restarted if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes" + }, + "name": { + "description": "Name of the container specified as a DNS_LABEL. Each container in a pod must have a unique name (DNS_LABEL). Cannot be updated.", + "type": "string" + }, + "ports": { + "description": "List of ports to expose from the container. Exposing a port here gives the system additional information about the network connections a container uses, but is primarily informational. Not specifying a port here DOES NOT prevent that port from being exposed. Any port which is listening on the default \"0.0.0.0\" address inside a container will be accessible from the network. Cannot be updated.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.ContainerPort" + }, + "type": "array", + "x-kubernetes-list-map-keys": [ + "containerPort", + "protocol" + ], + "x-kubernetes-list-type": "map", + "x-kubernetes-patch-merge-key": "containerPort", + "x-kubernetes-patch-strategy": "merge" + }, + "readinessProbe": { + "$ref": "#/definitions/io.k8s.api.core.v1.Probe", + "description": "Periodic probe of container service readiness. Container will be removed from service endpoints if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes" + }, + "resources": { + "$ref": "#/definitions/io.k8s.api.core.v1.ResourceRequirements", + "description": "Compute Resources required by this container. Cannot be updated. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/" + }, + "securityContext": { + "$ref": "#/definitions/io.k8s.api.core.v1.SecurityContext", + "description": "Security options the pod should run with. More info: https://kubernetes.io/docs/concepts/policy/security-context/ More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/" + }, + "startupProbe": { + "$ref": "#/definitions/io.k8s.api.core.v1.Probe", + "description": "StartupProbe indicates that the Pod has successfully initialized. If specified, no other probes are executed until this completes successfully. If this probe fails, the Pod will be restarted, just as if the livenessProbe failed. This can be used to provide different probe parameters at the beginning of a Pod's lifecycle, when it might take a long time to load data or warm a cache, than during steady-state operation. This cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes" + }, + "stdin": { + "description": "Whether this container should allocate a buffer for stdin in the container runtime. If this is not set, reads from stdin in the container will always result in EOF. Default is false.", + "type": "boolean" + }, + "stdinOnce": { + "description": "Whether the container runtime should close the stdin channel after it has been opened by a single attach. When stdin is true the stdin stream will remain open across multiple attach sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the first client attaches to stdin, and then remains open and accepts data until the client disconnects, at which time stdin is closed and remains closed until the container is restarted. If this flag is false, a container processes that reads from stdin will never receive an EOF. Default is false", + "type": "boolean" + }, + "terminationMessagePath": { + "description": "Optional: Path at which the file to which the container's termination message will be written is mounted into the container's filesystem. Message written is intended to be brief final status, such as an assertion failure message. Will be truncated by the node if greater than 4096 bytes. The total message length across all containers will be limited to 12kb. Defaults to /dev/termination-log. Cannot be updated.", + "type": "string" + }, + "terminationMessagePolicy": { + "description": "Indicate how the termination message should be populated. File will use the contents of terminationMessagePath to populate the container status message on both success and failure. FallbackToLogsOnError will use the last chunk of container log output if the termination message file is empty and the container exited with an error. The log output is limited to 2048 bytes or 80 lines, whichever is smaller. Defaults to File. Cannot be updated.", + "type": "string" + }, + "tty": { + "description": "Whether this container should allocate a TTY for itself, also requires 'stdin' to be true. Default is false.", + "type": "boolean" + }, + "volumeDevices": { + "description": "volumeDevices is the list of block devices to be used by the container.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.VolumeDevice" + }, + "type": "array", + "x-kubernetes-patch-merge-key": "devicePath", + "x-kubernetes-patch-strategy": "merge" + }, + "volumeMounts": { + "description": "Pod volumes to mount into the container's filesystem. Cannot be updated.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.VolumeMount" + }, + "type": "array", + "x-kubernetes-patch-merge-key": "mountPath", + "x-kubernetes-patch-strategy": "merge" + }, + "workingDir": { + "description": "Container's working directory. If not specified, the container runtime's default will be used, which might be configured in the container image. Cannot be updated.", + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "io.k8s.api.core.v1.ContainerImage": { + "description": "Describe a container image", + "properties": { + "names": { + "description": "Names by which this image is known. e.g. [\"k8s.gcr.io/hyperkube:v1.0.7\", \"dockerhub.io/google_containers/hyperkube:v1.0.7\"]", + "items": { + "type": "string" + }, + "type": "array" + }, + "sizeBytes": { + "description": "The size of the image in bytes.", + "format": "int64", + "type": "integer" + } + }, + "required": [ + "names" + ], + "type": "object" + }, + "io.k8s.api.core.v1.ContainerPort": { + "description": "ContainerPort represents a network port in a single container.", + "properties": { + "containerPort": { + "description": "Number of port to expose on the pod's IP address. This must be a valid port number, 0 \u003c x \u003c 65536.", + "format": "int32", + "type": "integer" + }, + "hostIP": { + "description": "What host IP to bind the external port to.", + "type": "string" + }, + "hostPort": { + "description": "Number of port to expose on the host. If specified, this must be a valid port number, 0 \u003c x \u003c 65536. If HostNetwork is specified, this must match ContainerPort. Most containers do not need this.", + "format": "int32", + "type": "integer" + }, + "name": { + "description": "If specified, this must be an IANA_SVC_NAME and unique within the pod. Each named port in a pod must have a unique name. Name for the port that can be referred to by services.", + "type": "string" + }, + "protocol": { + "description": "Protocol for port. Must be UDP, TCP, or SCTP. Defaults to \"TCP\".", + "type": "string" + } + }, + "required": [ + "containerPort" + ], + "type": "object" + }, + "io.k8s.api.core.v1.ContainerState": { + "description": "ContainerState holds a possible state of container. Only one of its members may be specified. If none of them is specified, the default one is ContainerStateWaiting.", + "properties": { + "running": { + "$ref": "#/definitions/io.k8s.api.core.v1.ContainerStateRunning", + "description": "Details about a running container" + }, + "terminated": { + "$ref": "#/definitions/io.k8s.api.core.v1.ContainerStateTerminated", + "description": "Details about a terminated container" + }, + "waiting": { + "$ref": "#/definitions/io.k8s.api.core.v1.ContainerStateWaiting", + "description": "Details about a waiting container" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.ContainerStateRunning": { + "description": "ContainerStateRunning is a running state of a container.", + "properties": { + "startedAt": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "Time at which the container was last (re-)started" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.ContainerStateTerminated": { + "description": "ContainerStateTerminated is a terminated state of a container.", + "properties": { + "containerID": { + "description": "Container's ID in the format 'docker://\u003ccontainer_id\u003e'", + "type": "string" + }, + "exitCode": { + "description": "Exit status from the last termination of the container", + "format": "int32", + "type": "integer" + }, + "finishedAt": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "Time at which the container last terminated" + }, + "message": { + "description": "Message regarding the last termination of the container", + "type": "string" + }, + "reason": { + "description": "(brief) reason from the last termination of the container", + "type": "string" + }, + "signal": { + "description": "Signal from the last termination of the container", + "format": "int32", + "type": "integer" + }, + "startedAt": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "Time at which previous execution of the container started" + } + }, + "required": [ + "exitCode" + ], + "type": "object" + }, + "io.k8s.api.core.v1.ContainerStateWaiting": { + "description": "ContainerStateWaiting is a waiting state of a container.", + "properties": { + "message": { + "description": "Message regarding why the container is not yet running.", + "type": "string" + }, + "reason": { + "description": "(brief) reason the container is not yet running.", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.ContainerStatus": { + "description": "ContainerStatus contains details for the current status of this container.", + "properties": { + "containerID": { + "description": "Container's ID in the format 'docker://\u003ccontainer_id\u003e'.", + "type": "string" + }, + "image": { + "description": "The image the container is running. More info: https://kubernetes.io/docs/concepts/containers/images", + "type": "string" + }, + "imageID": { + "description": "ImageID of the container's image.", + "type": "string" + }, + "lastState": { + "$ref": "#/definitions/io.k8s.api.core.v1.ContainerState", + "description": "Details about the container's last termination condition." + }, + "name": { + "description": "This must be a DNS_LABEL. Each container in a pod must have a unique name. Cannot be updated.", + "type": "string" + }, + "ready": { + "description": "Specifies whether the container has passed its readiness probe.", + "type": "boolean" + }, + "restartCount": { + "description": "The number of times the container has been restarted, currently based on the number of dead containers that have not yet been removed. Note that this is calculated from dead containers. But those containers are subject to garbage collection. This value will get capped at 5 by GC.", + "format": "int32", + "type": "integer" + }, + "started": { + "description": "Specifies whether the container has passed its startup probe. Initialized as false, becomes true after startupProbe is considered successful. Resets to false when the container is restarted, or if kubelet loses state temporarily. Is always true when no startupProbe is defined.", + "type": "boolean" + }, + "state": { + "$ref": "#/definitions/io.k8s.api.core.v1.ContainerState", + "description": "Details about the container's current condition." + } + }, + "required": [ + "name", + "ready", + "restartCount", + "image", + "imageID" + ], + "type": "object" + }, + "io.k8s.api.core.v1.DaemonEndpoint": { + "description": "DaemonEndpoint contains information about a single Daemon endpoint.", + "properties": { + "Port": { + "description": "Port number of the given endpoint.", + "format": "int32", + "type": "integer" + } + }, + "required": [ + "Port" + ], + "type": "object" + }, + "io.k8s.api.core.v1.DownwardAPIProjection": { + "description": "Represents downward API info for projecting into a projected volume. Note that this is identical to a downwardAPI volume source without the default mode.", + "properties": { + "items": { + "description": "Items is a list of DownwardAPIVolume file", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.DownwardAPIVolumeFile" + }, + "type": "array" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.DownwardAPIVolumeFile": { + "description": "DownwardAPIVolumeFile represents information to create the file containing the pod field", + "properties": { + "fieldRef": { + "$ref": "#/definitions/io.k8s.api.core.v1.ObjectFieldSelector", + "description": "Required: Selects a field of the pod: only annotations, labels, name and namespace are supported." + }, + "mode": { + "description": "Optional: mode bits used to set permissions on this file, must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.", + "format": "int32", + "type": "integer" + }, + "path": { + "description": "Required: Path is the relative path name of the file to be created. Must not be absolute or contain the '..' path. Must be utf-8 encoded. The first item of the relative path must not start with '..'", + "type": "string" + }, + "resourceFieldRef": { + "$ref": "#/definitions/io.k8s.api.core.v1.ResourceFieldSelector", + "description": "Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported." + } + }, + "required": [ + "path" + ], + "type": "object" + }, + "io.k8s.api.core.v1.DownwardAPIVolumeSource": { + "description": "DownwardAPIVolumeSource represents a volume containing downward API info. Downward API volumes support ownership management and SELinux relabeling.", + "properties": { + "defaultMode": { + "description": "Optional: mode bits to use on created files by default. Must be a Optional: mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Defaults to 0644. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.", + "format": "int32", + "type": "integer" + }, + "items": { + "description": "Items is a list of downward API volume file", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.DownwardAPIVolumeFile" + }, + "type": "array" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.EmptyDirVolumeSource": { + "description": "Represents an empty directory for a pod. Empty directory volumes support ownership management and SELinux relabeling.", + "properties": { + "medium": { + "description": "What type of storage medium should back this directory. The default is \"\" which means to use the node's default medium. Must be an empty string (default) or Memory. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir", + "type": "string" + }, + "sizeLimit": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity", + "description": "Total amount of local storage required for this EmptyDir volume. The size limit is also applicable for memory medium. The maximum usage on memory medium EmptyDir would be the minimum value between the SizeLimit specified here and the sum of memory limits of all containers in a pod. The default is nil which means that the limit is undefined. More info: http://kubernetes.io/docs/user-guide/volumes#emptydir" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.EndpointAddress": { + "description": "EndpointAddress is a tuple that describes single IP address.", + "properties": { + "hostname": { + "description": "The Hostname of this endpoint", + "type": "string" + }, + "ip": { + "description": "The IP of this endpoint. May not be loopback (127.0.0.0/8), link-local (169.254.0.0/16), or link-local multicast ((224.0.0.0/24). IPv6 is also accepted but not fully supported on all platforms. Also, certain kubernetes components, like kube-proxy, are not IPv6 ready.", + "type": "string" + }, + "nodeName": { + "description": "Optional: Node hosting this endpoint. This can be used to determine endpoints local to a node.", + "type": "string" + }, + "targetRef": { + "$ref": "#/definitions/io.k8s.api.core.v1.ObjectReference", + "description": "Reference to object providing the endpoint." + } + }, + "required": [ + "ip" + ], + "type": "object" + }, + "io.k8s.api.core.v1.EndpointPort": { + "description": "EndpointPort is a tuple that describes a single port.", + "properties": { + "appProtocol": { + "description": "The application protocol for this port. This field follows standard Kubernetes label syntax. Un-prefixed names are reserved for IANA standard service names (as per RFC-6335 and http://www.iana.org/assignments/service-names). Non-standard protocols should use prefixed names such as mycompany.com/my-custom-protocol. This is a beta field that is guarded by the ServiceAppProtocol feature gate and enabled by default.", + "type": "string" + }, + "name": { + "description": "The name of this port. This must match the 'name' field in the corresponding ServicePort. Must be a DNS_LABEL. Optional only if one port is defined.", + "type": "string" + }, + "port": { + "description": "The port number of the endpoint.", + "format": "int32", + "type": "integer" + }, + "protocol": { + "description": "The IP protocol for this port. Must be UDP, TCP, or SCTP. Default is TCP.", + "type": "string" + } + }, + "required": [ + "port" + ], + "type": "object" + }, + "io.k8s.api.core.v1.EndpointSubset": { + "description": "EndpointSubset is a group of addresses with a common set of ports. The expanded set of endpoints is the Cartesian product of Addresses x Ports. For example, given:\n {\n Addresses: [{\"ip\": \"10.10.1.1\"}, {\"ip\": \"10.10.2.2\"}],\n Ports: [{\"name\": \"a\", \"port\": 8675}, {\"name\": \"b\", \"port\": 309}]\n }\nThe resulting set of endpoints can be viewed as:\n a: [ 10.10.1.1:8675, 10.10.2.2:8675 ],\n b: [ 10.10.1.1:309, 10.10.2.2:309 ]", + "properties": { + "addresses": { + "description": "IP addresses which offer the related ports that are marked as ready. These endpoints should be considered safe for load balancers and clients to utilize.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.EndpointAddress" + }, + "type": "array" + }, + "notReadyAddresses": { + "description": "IP addresses which offer the related ports but are not currently marked as ready because they have not yet finished starting, have recently failed a readiness check, or have recently failed a liveness check.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.EndpointAddress" + }, + "type": "array" + }, + "ports": { + "description": "Port numbers available on the related IP addresses.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.EndpointPort" + }, + "type": "array" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.Endpoints": { + "description": "Endpoints is a collection of endpoints that implement the actual service. Example:\n Name: \"mysvc\",\n Subsets: [\n {\n Addresses: [{\"ip\": \"10.10.1.1\"}, {\"ip\": \"10.10.2.2\"}],\n Ports: [{\"name\": \"a\", \"port\": 8675}, {\"name\": \"b\", \"port\": 309}]\n },\n {\n Addresses: [{\"ip\": \"10.10.3.3\"}],\n Ports: [{\"name\": \"a\", \"port\": 93}, {\"name\": \"b\", \"port\": 76}]\n },\n ]", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "subsets": { + "description": "The set of all endpoints is the union of all subsets. Addresses are placed into subsets according to the IPs they share. A single address with multiple ports, some of which are ready and some of which are not (because they come from different containers) will result in the address being displayed in different subsets for the different ports. No address will appear in both Addresses and NotReadyAddresses in the same subset. Sets of addresses and ports that comprise a service.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.EndpointSubset" + }, + "type": "array" + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "", + "kind": "Endpoints", + "version": "v1" + } + ] + }, + "io.k8s.api.core.v1.EndpointsList": { + "description": "EndpointsList is a list of endpoints.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "List of endpoints.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.Endpoints" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "", + "kind": "EndpointsList", + "version": "v1" + } + ] + }, + "io.k8s.api.core.v1.EnvFromSource": { + "description": "EnvFromSource represents the source of a set of ConfigMaps", + "properties": { + "configMapRef": { + "$ref": "#/definitions/io.k8s.api.core.v1.ConfigMapEnvSource", + "description": "The ConfigMap to select from" + }, + "prefix": { + "description": "An optional identifier to prepend to each key in the ConfigMap. Must be a C_IDENTIFIER.", + "type": "string" + }, + "secretRef": { + "$ref": "#/definitions/io.k8s.api.core.v1.SecretEnvSource", + "description": "The Secret to select from" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.EnvVar": { + "description": "EnvVar represents an environment variable present in a Container.", + "properties": { + "name": { + "description": "Name of the environment variable. Must be a C_IDENTIFIER.", + "type": "string" + }, + "value": { + "description": "Variable references $(VAR_NAME) are expanded using the previous defined environment variables in the container and any service environment variables. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Defaults to \"\".", + "type": "string" + }, + "valueFrom": { + "$ref": "#/definitions/io.k8s.api.core.v1.EnvVarSource", + "description": "Source for the environment variable's value. Cannot be used if value is not empty." + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "io.k8s.api.core.v1.EnvVarSource": { + "description": "EnvVarSource represents a source for the value of an EnvVar.", + "properties": { + "configMapKeyRef": { + "$ref": "#/definitions/io.k8s.api.core.v1.ConfigMapKeySelector", + "description": "Selects a key of a ConfigMap." + }, + "fieldRef": { + "$ref": "#/definitions/io.k8s.api.core.v1.ObjectFieldSelector", + "description": "Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['\u003cKEY\u003e']`, `metadata.annotations['\u003cKEY\u003e']`, spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs." + }, + "resourceFieldRef": { + "$ref": "#/definitions/io.k8s.api.core.v1.ResourceFieldSelector", + "description": "Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported." + }, + "secretKeyRef": { + "$ref": "#/definitions/io.k8s.api.core.v1.SecretKeySelector", + "description": "Selects a key of a secret in the pod's namespace" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.EphemeralContainer": { + "description": "An EphemeralContainer is a container that may be added temporarily to an existing pod for user-initiated activities such as debugging. Ephemeral containers have no resource or scheduling guarantees, and they will not be restarted when they exit or when a pod is removed or restarted. If an ephemeral container causes a pod to exceed its resource allocation, the pod may be evicted. Ephemeral containers may not be added by directly updating the pod spec. They must be added via the pod's ephemeralcontainers subresource, and they will appear in the pod spec once added. This is an alpha feature enabled by the EphemeralContainers feature flag.", + "properties": { + "args": { + "description": "Arguments to the entrypoint. The docker image's CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell", + "items": { + "type": "string" + }, + "type": "array" + }, + "command": { + "description": "Entrypoint array. Not executed within a shell. The docker image's ENTRYPOINT is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell", + "items": { + "type": "string" + }, + "type": "array" + }, + "env": { + "description": "List of environment variables to set in the container. Cannot be updated.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.EnvVar" + }, + "type": "array", + "x-kubernetes-patch-merge-key": "name", + "x-kubernetes-patch-strategy": "merge" + }, + "envFrom": { + "description": "List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.EnvFromSource" + }, + "type": "array" + }, + "image": { + "description": "Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images", + "type": "string" + }, + "imagePullPolicy": { + "description": "Image pull policy. One of Always, Never, IfNotPresent. Defaults to Always if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images", + "type": "string" + }, + "lifecycle": { + "$ref": "#/definitions/io.k8s.api.core.v1.Lifecycle", + "description": "Lifecycle is not allowed for ephemeral containers." + }, + "livenessProbe": { + "$ref": "#/definitions/io.k8s.api.core.v1.Probe", + "description": "Probes are not allowed for ephemeral containers." + }, + "name": { + "description": "Name of the ephemeral container specified as a DNS_LABEL. This name must be unique among all containers, init containers and ephemeral containers.", + "type": "string" + }, + "ports": { + "description": "Ports are not allowed for ephemeral containers.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.ContainerPort" + }, + "type": "array" + }, + "readinessProbe": { + "$ref": "#/definitions/io.k8s.api.core.v1.Probe", + "description": "Probes are not allowed for ephemeral containers." + }, + "resources": { + "$ref": "#/definitions/io.k8s.api.core.v1.ResourceRequirements", + "description": "Resources are not allowed for ephemeral containers. Ephemeral containers use spare resources already allocated to the pod." + }, + "securityContext": { + "$ref": "#/definitions/io.k8s.api.core.v1.SecurityContext", + "description": "SecurityContext is not allowed for ephemeral containers." + }, + "startupProbe": { + "$ref": "#/definitions/io.k8s.api.core.v1.Probe", + "description": "Probes are not allowed for ephemeral containers." + }, + "stdin": { + "description": "Whether this container should allocate a buffer for stdin in the container runtime. If this is not set, reads from stdin in the container will always result in EOF. Default is false.", + "type": "boolean" + }, + "stdinOnce": { + "description": "Whether the container runtime should close the stdin channel after it has been opened by a single attach. When stdin is true the stdin stream will remain open across multiple attach sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the first client attaches to stdin, and then remains open and accepts data until the client disconnects, at which time stdin is closed and remains closed until the container is restarted. If this flag is false, a container processes that reads from stdin will never receive an EOF. Default is false", + "type": "boolean" + }, + "targetContainerName": { + "description": "If set, the name of the container from PodSpec that this ephemeral container targets. The ephemeral container will be run in the namespaces (IPC, PID, etc) of this container. If not set then the ephemeral container is run in whatever namespaces are shared for the pod. Note that the container runtime must support this feature.", + "type": "string" + }, + "terminationMessagePath": { + "description": "Optional: Path at which the file to which the container's termination message will be written is mounted into the container's filesystem. Message written is intended to be brief final status, such as an assertion failure message. Will be truncated by the node if greater than 4096 bytes. The total message length across all containers will be limited to 12kb. Defaults to /dev/termination-log. Cannot be updated.", + "type": "string" + }, + "terminationMessagePolicy": { + "description": "Indicate how the termination message should be populated. File will use the contents of terminationMessagePath to populate the container status message on both success and failure. FallbackToLogsOnError will use the last chunk of container log output if the termination message file is empty and the container exited with an error. The log output is limited to 2048 bytes or 80 lines, whichever is smaller. Defaults to File. Cannot be updated.", + "type": "string" + }, + "tty": { + "description": "Whether this container should allocate a TTY for itself, also requires 'stdin' to be true. Default is false.", + "type": "boolean" + }, + "volumeDevices": { + "description": "volumeDevices is the list of block devices to be used by the container.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.VolumeDevice" + }, + "type": "array", + "x-kubernetes-patch-merge-key": "devicePath", + "x-kubernetes-patch-strategy": "merge" + }, + "volumeMounts": { + "description": "Pod volumes to mount into the container's filesystem. Cannot be updated.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.VolumeMount" + }, + "type": "array", + "x-kubernetes-patch-merge-key": "mountPath", + "x-kubernetes-patch-strategy": "merge" + }, + "workingDir": { + "description": "Container's working directory. If not specified, the container runtime's default will be used, which might be configured in the container image. Cannot be updated.", + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "io.k8s.api.core.v1.EphemeralVolumeSource": { + "description": "Represents an ephemeral volume that is handled by a normal storage driver.", + "properties": { + "readOnly": { + "description": "Specifies a read-only configuration for the volume. Defaults to false (read/write).", + "type": "boolean" + }, + "volumeClaimTemplate": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolumeClaimTemplate", + "description": "Will be used to create a stand-alone PVC to provision the volume. The pod in which this EphemeralVolumeSource is embedded will be the owner of the PVC, i.e. the PVC will be deleted together with the pod. The name of the PVC will be `\u003cpod name\u003e-\u003cvolume name\u003e` where `\u003cvolume name\u003e` is the name from the `PodSpec.Volumes` array entry. Pod validation will reject the pod if the concatenated name is not valid for a PVC (for example, too long).\n\nAn existing PVC with that name that is not owned by the pod will *not* be used for the pod to avoid using an unrelated volume by mistake. Starting the pod is then blocked until the unrelated PVC is removed. If such a pre-created PVC is meant to be used by the pod, the PVC has to updated with an owner reference to the pod once the pod exists. Normally this should not be necessary, but it may be useful when manually reconstructing a broken cluster.\n\nThis field is read-only and no changes will be made by Kubernetes to the PVC after it has been created.\n\nRequired, must not be nil." + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.Event": { + "description": "Event is a report of an event somewhere in the cluster. Events have a limited retention time and triggers and messages may evolve with time. Event consumers should not rely on the timing of an event with a given Reason reflecting a consistent underlying trigger, or the continued existence of events with that Reason. Events should be treated as informative, best-effort, supplemental data.", + "properties": { + "action": { + "description": "What action was taken/failed regarding to the Regarding object.", + "type": "string" + }, + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "count": { + "description": "The number of times this event has occurred.", + "format": "int32", + "type": "integer" + }, + "eventTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.MicroTime", + "description": "Time when this Event was first observed." + }, + "firstTimestamp": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "The time at which the event was first recorded. (Time of server receipt is in TypeMeta.)" + }, + "involvedObject": { + "$ref": "#/definitions/io.k8s.api.core.v1.ObjectReference", + "description": "The object that this event is about." + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "lastTimestamp": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "The time at which the most recent occurrence of this event was recorded." + }, + "message": { + "description": "A human-readable description of the status of this operation.", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "reason": { + "description": "This should be a short, machine understandable string that gives the reason for the transition into the object's current status.", + "type": "string" + }, + "related": { + "$ref": "#/definitions/io.k8s.api.core.v1.ObjectReference", + "description": "Optional secondary object for more complex actions." + }, + "reportingComponent": { + "description": "Name of the controller that emitted this Event, e.g. `kubernetes.io/kubelet`.", + "type": "string" + }, + "reportingInstance": { + "description": "ID of the controller instance, e.g. `kubelet-xyzf`.", + "type": "string" + }, + "series": { + "$ref": "#/definitions/io.k8s.api.core.v1.EventSeries", + "description": "Data about the Event series this event represents or nil if it's a singleton Event." + }, + "source": { + "$ref": "#/definitions/io.k8s.api.core.v1.EventSource", + "description": "The component reporting this event. Should be a short machine understandable string." + }, + "type": { + "description": "Type of this event (Normal, Warning), new types could be added in the future", + "type": "string" + } + }, + "required": [ + "metadata", + "involvedObject" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "", + "kind": "Event", + "version": "v1" + } + ] + }, + "io.k8s.api.core.v1.EventList": { + "description": "EventList is a list of events.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "List of events", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.Event" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "", + "kind": "EventList", + "version": "v1" + } + ] + }, + "io.k8s.api.core.v1.EventSeries": { + "description": "EventSeries contain information on series of events, i.e. thing that was/is happening continuously for some time.", + "properties": { + "count": { + "description": "Number of occurrences in this series up to the last heartbeat time", + "format": "int32", + "type": "integer" + }, + "lastObservedTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.MicroTime", + "description": "Time of the last occurrence observed" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.EventSource": { + "description": "EventSource contains information for an event.", + "properties": { + "component": { + "description": "Component from which the event is generated.", + "type": "string" + }, + "host": { + "description": "Node name on which the event is generated.", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.ExecAction": { + "description": "ExecAction describes a \"run in container\" action.", + "properties": { + "command": { + "description": "Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.FCVolumeSource": { + "description": "Represents a Fibre Channel volume. Fibre Channel volumes can only be mounted as read/write once. Fibre Channel volumes support ownership management and SELinux relabeling.", + "properties": { + "fsType": { + "description": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.", + "type": "string" + }, + "lun": { + "description": "Optional: FC target lun number", + "format": "int32", + "type": "integer" + }, + "readOnly": { + "description": "Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.", + "type": "boolean" + }, + "targetWWNs": { + "description": "Optional: FC target worldwide names (WWNs)", + "items": { + "type": "string" + }, + "type": "array" + }, + "wwids": { + "description": "Optional: FC volume world wide identifiers (wwids) Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.FlexPersistentVolumeSource": { + "description": "FlexPersistentVolumeSource represents a generic persistent volume resource that is provisioned/attached using an exec based plugin.", + "properties": { + "driver": { + "description": "Driver is the name of the driver to use for this volume.", + "type": "string" + }, + "fsType": { + "description": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". The default filesystem depends on FlexVolume script.", + "type": "string" + }, + "options": { + "additionalProperties": { + "type": "string" + }, + "description": "Optional: Extra command options if any.", + "type": "object" + }, + "readOnly": { + "description": "Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.", + "type": "boolean" + }, + "secretRef": { + "$ref": "#/definitions/io.k8s.api.core.v1.SecretReference", + "description": "Optional: SecretRef is reference to the secret object containing sensitive information to pass to the plugin scripts. This may be empty if no secret object is specified. If the secret object contains more than one secret, all secrets are passed to the plugin scripts." + } + }, + "required": [ + "driver" + ], + "type": "object" + }, + "io.k8s.api.core.v1.FlexVolumeSource": { + "description": "FlexVolume represents a generic volume resource that is provisioned/attached using an exec based plugin.", + "properties": { + "driver": { + "description": "Driver is the name of the driver to use for this volume.", + "type": "string" + }, + "fsType": { + "description": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". The default filesystem depends on FlexVolume script.", + "type": "string" + }, + "options": { + "additionalProperties": { + "type": "string" + }, + "description": "Optional: Extra command options if any.", + "type": "object" + }, + "readOnly": { + "description": "Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.", + "type": "boolean" + }, + "secretRef": { + "$ref": "#/definitions/io.k8s.api.core.v1.LocalObjectReference", + "description": "Optional: SecretRef is reference to the secret object containing sensitive information to pass to the plugin scripts. This may be empty if no secret object is specified. If the secret object contains more than one secret, all secrets are passed to the plugin scripts." + } + }, + "required": [ + "driver" + ], + "type": "object" + }, + "io.k8s.api.core.v1.FlockerVolumeSource": { + "description": "Represents a Flocker volume mounted by the Flocker agent. One and only one of datasetName and datasetUUID should be set. Flocker volumes do not support ownership management or SELinux relabeling.", + "properties": { + "datasetName": { + "description": "Name of the dataset stored as metadata -\u003e name on the dataset for Flocker should be considered as deprecated", + "type": "string" + }, + "datasetUUID": { + "description": "UUID of the dataset. This is unique identifier of a Flocker dataset", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.GCEPersistentDiskVolumeSource": { + "description": "Represents a Persistent Disk resource in Google Compute Engine.\n\nA GCE PD must exist before mounting to a container. The disk must also be in the same GCE project and zone as the kubelet. A GCE PD can only be mounted as read/write once or read-only many times. GCE PDs support ownership management and SELinux relabeling.", + "properties": { + "fsType": { + "description": "Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk", + "type": "string" + }, + "partition": { + "description": "The partition in the volume that you want to mount. If omitted, the default is to mount by volume name. Examples: For volume /dev/sda1, you specify the partition as \"1\". Similarly, the volume partition for /dev/sda is \"0\" (or you can leave the property empty). More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk", + "format": "int32", + "type": "integer" + }, + "pdName": { + "description": "Unique name of the PD resource in GCE. Used to identify the disk in GCE. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk", + "type": "string" + }, + "readOnly": { + "description": "ReadOnly here will force the ReadOnly setting in VolumeMounts. Defaults to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk", + "type": "boolean" + } + }, + "required": [ + "pdName" + ], + "type": "object" + }, + "io.k8s.api.core.v1.GitRepoVolumeSource": { + "description": "Represents a volume that is populated with the contents of a git repository. Git repo volumes do not support ownership management. Git repo volumes support SELinux relabeling.\n\nDEPRECATED: GitRepo is deprecated. To provision a container with a git repo, mount an EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir into the Pod's container.", + "properties": { + "directory": { + "description": "Target directory name. Must not contain or start with '..'. If '.' is supplied, the volume directory will be the git repository. Otherwise, if specified, the volume will contain the git repository in the subdirectory with the given name.", + "type": "string" + }, + "repository": { + "description": "Repository URL", + "type": "string" + }, + "revision": { + "description": "Commit hash for the specified revision.", + "type": "string" + } + }, + "required": [ + "repository" + ], + "type": "object" + }, + "io.k8s.api.core.v1.GlusterfsPersistentVolumeSource": { + "description": "Represents a Glusterfs mount that lasts the lifetime of a pod. Glusterfs volumes do not support ownership management or SELinux relabeling.", + "properties": { + "endpoints": { + "description": "EndpointsName is the endpoint name that details Glusterfs topology. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod", + "type": "string" + }, + "endpointsNamespace": { + "description": "EndpointsNamespace is the namespace that contains Glusterfs endpoint. If this field is empty, the EndpointNamespace defaults to the same namespace as the bound PVC. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod", + "type": "string" + }, + "path": { + "description": "Path is the Glusterfs volume path. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod", + "type": "string" + }, + "readOnly": { + "description": "ReadOnly here will force the Glusterfs volume to be mounted with read-only permissions. Defaults to false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod", + "type": "boolean" + } + }, + "required": [ + "endpoints", + "path" + ], + "type": "object" + }, + "io.k8s.api.core.v1.GlusterfsVolumeSource": { + "description": "Represents a Glusterfs mount that lasts the lifetime of a pod. Glusterfs volumes do not support ownership management or SELinux relabeling.", + "properties": { + "endpoints": { + "description": "EndpointsName is the endpoint name that details Glusterfs topology. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod", + "type": "string" + }, + "path": { + "description": "Path is the Glusterfs volume path. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod", + "type": "string" + }, + "readOnly": { + "description": "ReadOnly here will force the Glusterfs volume to be mounted with read-only permissions. Defaults to false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod", + "type": "boolean" + } + }, + "required": [ + "endpoints", + "path" + ], + "type": "object" + }, + "io.k8s.api.core.v1.HTTPGetAction": { + "description": "HTTPGetAction describes an action based on HTTP Get requests.", + "properties": { + "host": { + "description": "Host name to connect to, defaults to the pod IP. You probably want to set \"Host\" in httpHeaders instead.", + "type": "string" + }, + "httpHeaders": { + "description": "Custom headers to set in the request. HTTP allows repeated headers.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.HTTPHeader" + }, + "type": "array" + }, + "path": { + "description": "Path to access on the HTTP server.", + "type": "string" + }, + "port": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.util.intstr.IntOrString", + "description": "Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME." + }, + "scheme": { + "description": "Scheme to use for connecting to the host. Defaults to HTTP.", + "type": "string" + } + }, + "required": [ + "port" + ], + "type": "object" + }, + "io.k8s.api.core.v1.HTTPHeader": { + "description": "HTTPHeader describes a custom header to be used in HTTP probes", + "properties": { + "name": { + "description": "The header field name", + "type": "string" + }, + "value": { + "description": "The header field value", + "type": "string" + } + }, + "required": [ + "name", + "value" + ], + "type": "object" + }, + "io.k8s.api.core.v1.Handler": { + "description": "Handler defines a specific action that should be taken", + "properties": { + "exec": { + "$ref": "#/definitions/io.k8s.api.core.v1.ExecAction", + "description": "One and only one of the following should be specified. Exec specifies the action to take." + }, + "httpGet": { + "$ref": "#/definitions/io.k8s.api.core.v1.HTTPGetAction", + "description": "HTTPGet specifies the http request to perform." + }, + "tcpSocket": { + "$ref": "#/definitions/io.k8s.api.core.v1.TCPSocketAction", + "description": "TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.HostAlias": { + "description": "HostAlias holds the mapping between IP and hostnames that will be injected as an entry in the pod's hosts file.", + "properties": { + "hostnames": { + "description": "Hostnames for the above IP address.", + "items": { + "type": "string" + }, + "type": "array" + }, + "ip": { + "description": "IP address of the host file entry.", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.HostPathVolumeSource": { + "description": "Represents a host path mapped into a pod. Host path volumes do not support ownership management or SELinux relabeling.", + "properties": { + "path": { + "description": "Path of the directory on the host. If the path is a symlink, it will follow the link to the real path. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath", + "type": "string" + }, + "type": { + "description": "Type for HostPath Volume Defaults to \"\" More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath", + "type": "string" + } + }, + "required": [ + "path" + ], + "type": "object" + }, + "io.k8s.api.core.v1.ISCSIPersistentVolumeSource": { + "description": "ISCSIPersistentVolumeSource represents an ISCSI disk. ISCSI volumes can only be mounted as read/write once. ISCSI volumes support ownership management and SELinux relabeling.", + "properties": { + "chapAuthDiscovery": { + "description": "whether support iSCSI Discovery CHAP authentication", + "type": "boolean" + }, + "chapAuthSession": { + "description": "whether support iSCSI Session CHAP authentication", + "type": "boolean" + }, + "fsType": { + "description": "Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi", + "type": "string" + }, + "initiatorName": { + "description": "Custom iSCSI Initiator Name. If initiatorName is specified with iscsiInterface simultaneously, new iSCSI interface \u003ctarget portal\u003e:\u003cvolume name\u003e will be created for the connection.", + "type": "string" + }, + "iqn": { + "description": "Target iSCSI Qualified Name.", + "type": "string" + }, + "iscsiInterface": { + "description": "iSCSI Interface Name that uses an iSCSI transport. Defaults to 'default' (tcp).", + "type": "string" + }, + "lun": { + "description": "iSCSI Target Lun number.", + "format": "int32", + "type": "integer" + }, + "portals": { + "description": "iSCSI Target Portal List. The Portal is either an IP or ip_addr:port if the port is other than default (typically TCP ports 860 and 3260).", + "items": { + "type": "string" + }, + "type": "array" + }, + "readOnly": { + "description": "ReadOnly here will force the ReadOnly setting in VolumeMounts. Defaults to false.", + "type": "boolean" + }, + "secretRef": { + "$ref": "#/definitions/io.k8s.api.core.v1.SecretReference", + "description": "CHAP Secret for iSCSI target and initiator authentication" + }, + "targetPortal": { + "description": "iSCSI Target Portal. The Portal is either an IP or ip_addr:port if the port is other than default (typically TCP ports 860 and 3260).", + "type": "string" + } + }, + "required": [ + "targetPortal", + "iqn", + "lun" + ], + "type": "object" + }, + "io.k8s.api.core.v1.ISCSIVolumeSource": { + "description": "Represents an ISCSI disk. ISCSI volumes can only be mounted as read/write once. ISCSI volumes support ownership management and SELinux relabeling.", + "properties": { + "chapAuthDiscovery": { + "description": "whether support iSCSI Discovery CHAP authentication", + "type": "boolean" + }, + "chapAuthSession": { + "description": "whether support iSCSI Session CHAP authentication", + "type": "boolean" + }, + "fsType": { + "description": "Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi", + "type": "string" + }, + "initiatorName": { + "description": "Custom iSCSI Initiator Name. If initiatorName is specified with iscsiInterface simultaneously, new iSCSI interface \u003ctarget portal\u003e:\u003cvolume name\u003e will be created for the connection.", + "type": "string" + }, + "iqn": { + "description": "Target iSCSI Qualified Name.", + "type": "string" + }, + "iscsiInterface": { + "description": "iSCSI Interface Name that uses an iSCSI transport. Defaults to 'default' (tcp).", + "type": "string" + }, + "lun": { + "description": "iSCSI Target Lun number.", + "format": "int32", + "type": "integer" + }, + "portals": { + "description": "iSCSI Target Portal List. The portal is either an IP or ip_addr:port if the port is other than default (typically TCP ports 860 and 3260).", + "items": { + "type": "string" + }, + "type": "array" + }, + "readOnly": { + "description": "ReadOnly here will force the ReadOnly setting in VolumeMounts. Defaults to false.", + "type": "boolean" + }, + "secretRef": { + "$ref": "#/definitions/io.k8s.api.core.v1.LocalObjectReference", + "description": "CHAP Secret for iSCSI target and initiator authentication" + }, + "targetPortal": { + "description": "iSCSI Target Portal. The Portal is either an IP or ip_addr:port if the port is other than default (typically TCP ports 860 and 3260).", + "type": "string" + } + }, + "required": [ + "targetPortal", + "iqn", + "lun" + ], + "type": "object" + }, + "io.k8s.api.core.v1.KeyToPath": { + "description": "Maps a string key to a path within a volume.", + "properties": { + "key": { + "description": "The key to project.", + "type": "string" + }, + "mode": { + "description": "Optional: mode bits used to set permissions on this file. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.", + "format": "int32", + "type": "integer" + }, + "path": { + "description": "The relative path of the file to map the key to. May not be an absolute path. May not contain the path element '..'. May not start with the string '..'.", + "type": "string" + } + }, + "required": [ + "key", + "path" + ], + "type": "object" + }, + "io.k8s.api.core.v1.Lifecycle": { + "description": "Lifecycle describes actions that the management system should take in response to container lifecycle events. For the PostStart and PreStop lifecycle handlers, management of the container blocks until the action is complete, unless the container process fails, in which case the handler is aborted.", + "properties": { + "postStart": { + "$ref": "#/definitions/io.k8s.api.core.v1.Handler", + "description": "PostStart is called immediately after a container is created. If the handler fails, the container is terminated and restarted according to its restart policy. Other management of the container blocks until the hook completes. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks" + }, + "preStop": { + "$ref": "#/definitions/io.k8s.api.core.v1.Handler", + "description": "PreStop is called immediately before a container is terminated due to an API request or management event such as liveness/startup probe failure, preemption, resource contention, etc. The handler is not called if the container crashes or exits. The reason for termination is passed to the handler. The Pod's termination grace period countdown begins before the PreStop hooked is executed. Regardless of the outcome of the handler, the container will eventually terminate within the Pod's termination grace period. Other management of the container blocks until the hook completes or until the termination grace period is reached. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.LimitRange": { + "description": "LimitRange sets resource usage limits for each kind of resource in a Namespace.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.core.v1.LimitRangeSpec", + "description": "Spec defines the limits enforced. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "", + "kind": "LimitRange", + "version": "v1" + } + ] + }, + "io.k8s.api.core.v1.LimitRangeItem": { + "description": "LimitRangeItem defines a min/max usage limit for any resource that matches on kind.", + "properties": { + "default": { + "additionalProperties": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity" + }, + "description": "Default resource requirement limit value by resource name if resource limit is omitted.", + "type": "object" + }, + "defaultRequest": { + "additionalProperties": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity" + }, + "description": "DefaultRequest is the default resource requirement request value by resource name if resource request is omitted.", + "type": "object" + }, + "max": { + "additionalProperties": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity" + }, + "description": "Max usage constraints on this kind by resource name.", + "type": "object" + }, + "maxLimitRequestRatio": { + "additionalProperties": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity" + }, + "description": "MaxLimitRequestRatio if specified, the named resource must have a request and limit that are both non-zero where limit divided by request is less than or equal to the enumerated value; this represents the max burst for the named resource.", + "type": "object" + }, + "min": { + "additionalProperties": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity" + }, + "description": "Min usage constraints on this kind by resource name.", + "type": "object" + }, + "type": { + "description": "Type of resource that this limit applies to.", + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + "io.k8s.api.core.v1.LimitRangeList": { + "description": "LimitRangeList is a list of LimitRange items.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "Items is a list of LimitRange objects. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.LimitRange" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "", + "kind": "LimitRangeList", + "version": "v1" + } + ] + }, + "io.k8s.api.core.v1.LimitRangeSpec": { + "description": "LimitRangeSpec defines a min/max usage limit for resources that match on kind.", + "properties": { + "limits": { + "description": "Limits is the list of LimitRangeItem objects that are enforced.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.LimitRangeItem" + }, + "type": "array" + } + }, + "required": [ + "limits" + ], + "type": "object" + }, + "io.k8s.api.core.v1.LoadBalancerIngress": { + "description": "LoadBalancerIngress represents the status of a load-balancer ingress point: traffic intended for the service should be sent to an ingress point.", + "properties": { + "hostname": { + "description": "Hostname is set for load-balancer ingress points that are DNS based (typically AWS load-balancers)", + "type": "string" + }, + "ip": { + "description": "IP is set for load-balancer ingress points that are IP based (typically GCE or OpenStack load-balancers)", + "type": "string" + }, + "ports": { + "description": "Ports is a list of records of service ports If used, every port defined in the service should have an entry in it", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.PortStatus" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.LoadBalancerStatus": { + "description": "LoadBalancerStatus represents the status of a load-balancer.", + "properties": { + "ingress": { + "description": "Ingress is a list containing ingress points for the load-balancer. Traffic intended for the service should be sent to these ingress points.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.LoadBalancerIngress" + }, + "type": "array" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.LocalObjectReference": { + "description": "LocalObjectReference contains enough information to let you locate the referenced object inside the same namespace.", + "properties": { + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.LocalVolumeSource": { + "description": "Local represents directly-attached storage with node affinity (Beta feature)", + "properties": { + "fsType": { + "description": "Filesystem type to mount. It applies only when the Path is a block device. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". The default value is to auto-select a fileystem if unspecified.", + "type": "string" + }, + "path": { + "description": "The full path to the volume on the node. It can be either a directory or block device (disk, partition, ...).", + "type": "string" + } + }, + "required": [ + "path" + ], + "type": "object" + }, + "io.k8s.api.core.v1.NFSVolumeSource": { + "description": "Represents an NFS mount that lasts the lifetime of a pod. NFS volumes do not support ownership management or SELinux relabeling.", + "properties": { + "path": { + "description": "Path that is exported by the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs", + "type": "string" + }, + "readOnly": { + "description": "ReadOnly here will force the NFS export to be mounted with read-only permissions. Defaults to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs", + "type": "boolean" + }, + "server": { + "description": "Server is the hostname or IP address of the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs", + "type": "string" + } + }, + "required": [ + "server", + "path" + ], + "type": "object" + }, + "io.k8s.api.core.v1.Namespace": { + "description": "Namespace provides a scope for Names. Use of multiple namespaces is optional.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.core.v1.NamespaceSpec", + "description": "Spec defines the behavior of the Namespace. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" + }, + "status": { + "$ref": "#/definitions/io.k8s.api.core.v1.NamespaceStatus", + "description": "Status describes the current status of a Namespace. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "", + "kind": "Namespace", + "version": "v1" + } + ] + }, + "io.k8s.api.core.v1.NamespaceCondition": { + "description": "NamespaceCondition contains details about state of namespace.", + "properties": { + "lastTransitionTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time" + }, + "message": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "status": { + "description": "Status of the condition, one of True, False, Unknown.", + "type": "string" + }, + "type": { + "description": "Type of namespace controller condition.", + "type": "string" + } + }, + "required": [ + "type", + "status" + ], + "type": "object" + }, + "io.k8s.api.core.v1.NamespaceList": { + "description": "NamespaceList is a list of Namespaces.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "Items is the list of Namespace objects in the list. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.Namespace" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "", + "kind": "NamespaceList", + "version": "v1" + } + ] + }, + "io.k8s.api.core.v1.NamespaceSpec": { + "description": "NamespaceSpec describes the attributes on a Namespace.", + "properties": { + "finalizers": { + "description": "Finalizers is an opaque list of values that must be empty to permanently remove object from storage. More info: https://kubernetes.io/docs/tasks/administer-cluster/namespaces/", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.NamespaceStatus": { + "description": "NamespaceStatus is information about the current status of a Namespace.", + "properties": { + "conditions": { + "description": "Represents the latest available observations of a namespace's current state.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.NamespaceCondition" + }, + "type": "array", + "x-kubernetes-patch-merge-key": "type", + "x-kubernetes-patch-strategy": "merge" + }, + "phase": { + "description": "Phase is the current lifecycle phase of the namespace. More info: https://kubernetes.io/docs/tasks/administer-cluster/namespaces/", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.Node": { + "description": "Node is a worker node in Kubernetes. Each node will have a unique identifier in the cache (i.e. in etcd).", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.core.v1.NodeSpec", + "description": "Spec defines the behavior of a node. https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" + }, + "status": { + "$ref": "#/definitions/io.k8s.api.core.v1.NodeStatus", + "description": "Most recently observed status of the node. Populated by the system. Read-only. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "", + "kind": "Node", + "version": "v1" + } + ] + }, + "io.k8s.api.core.v1.NodeAddress": { + "description": "NodeAddress contains information for the node's address.", + "properties": { + "address": { + "description": "The node address.", + "type": "string" + }, + "type": { + "description": "Node address type, one of Hostname, ExternalIP or InternalIP.", + "type": "string" + } + }, + "required": [ + "type", + "address" + ], + "type": "object" + }, + "io.k8s.api.core.v1.NodeAffinity": { + "description": "Node affinity is a group of node affinity scheduling rules.", + "properties": { + "preferredDuringSchedulingIgnoredDuringExecution": { + "description": "The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding \"weight\" to the sum if the node matches the corresponding matchExpressions; the node(s) with the highest sum are the most preferred.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.PreferredSchedulingTerm" + }, + "type": "array" + }, + "requiredDuringSchedulingIgnoredDuringExecution": { + "$ref": "#/definitions/io.k8s.api.core.v1.NodeSelector", + "description": "If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to an update), the system may or may not try to eventually evict the pod from its node." + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.NodeCondition": { + "description": "NodeCondition contains condition information for a node.", + "properties": { + "lastHeartbeatTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "Last time we got an update on a given condition." + }, + "lastTransitionTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "Last time the condition transit from one status to another." + }, + "message": { + "description": "Human readable message indicating details about last transition.", + "type": "string" + }, + "reason": { + "description": "(brief) reason for the condition's last transition.", + "type": "string" + }, + "status": { + "description": "Status of the condition, one of True, False, Unknown.", + "type": "string" + }, + "type": { + "description": "Type of node condition.", + "type": "string" + } + }, + "required": [ + "type", + "status" + ], + "type": "object" + }, + "io.k8s.api.core.v1.NodeConfigSource": { + "description": "NodeConfigSource specifies a source of node configuration. Exactly one subfield (excluding metadata) must be non-nil.", + "properties": { + "configMap": { + "$ref": "#/definitions/io.k8s.api.core.v1.ConfigMapNodeConfigSource", + "description": "ConfigMap is a reference to a Node's ConfigMap" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.NodeConfigStatus": { + "description": "NodeConfigStatus describes the status of the config assigned by Node.Spec.ConfigSource.", + "properties": { + "active": { + "$ref": "#/definitions/io.k8s.api.core.v1.NodeConfigSource", + "description": "Active reports the checkpointed config the node is actively using. Active will represent either the current version of the Assigned config, or the current LastKnownGood config, depending on whether attempting to use the Assigned config results in an error." + }, + "assigned": { + "$ref": "#/definitions/io.k8s.api.core.v1.NodeConfigSource", + "description": "Assigned reports the checkpointed config the node will try to use. When Node.Spec.ConfigSource is updated, the node checkpoints the associated config payload to local disk, along with a record indicating intended config. The node refers to this record to choose its config checkpoint, and reports this record in Assigned. Assigned only updates in the status after the record has been checkpointed to disk. When the Kubelet is restarted, it tries to make the Assigned config the Active config by loading and validating the checkpointed payload identified by Assigned." + }, + "error": { + "description": "Error describes any problems reconciling the Spec.ConfigSource to the Active config. Errors may occur, for example, attempting to checkpoint Spec.ConfigSource to the local Assigned record, attempting to checkpoint the payload associated with Spec.ConfigSource, attempting to load or validate the Assigned config, etc. Errors may occur at different points while syncing config. Earlier errors (e.g. download or checkpointing errors) will not result in a rollback to LastKnownGood, and may resolve across Kubelet retries. Later errors (e.g. loading or validating a checkpointed config) will result in a rollback to LastKnownGood. In the latter case, it is usually possible to resolve the error by fixing the config assigned in Spec.ConfigSource. You can find additional information for debugging by searching the error message in the Kubelet log. Error is a human-readable description of the error state; machines can check whether or not Error is empty, but should not rely on the stability of the Error text across Kubelet versions.", + "type": "string" + }, + "lastKnownGood": { + "$ref": "#/definitions/io.k8s.api.core.v1.NodeConfigSource", + "description": "LastKnownGood reports the checkpointed config the node will fall back to when it encounters an error attempting to use the Assigned config. The Assigned config becomes the LastKnownGood config when the node determines that the Assigned config is stable and correct. This is currently implemented as a 10-minute soak period starting when the local record of Assigned config is updated. If the Assigned config is Active at the end of this period, it becomes the LastKnownGood. Note that if Spec.ConfigSource is reset to nil (use local defaults), the LastKnownGood is also immediately reset to nil, because the local default config is always assumed good. You should not make assumptions about the node's method of determining config stability and correctness, as this may change or become configurable in the future." + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.NodeDaemonEndpoints": { + "description": "NodeDaemonEndpoints lists ports opened by daemons running on the Node.", + "properties": { + "kubeletEndpoint": { + "$ref": "#/definitions/io.k8s.api.core.v1.DaemonEndpoint", + "description": "Endpoint on which Kubelet is listening." + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.NodeList": { + "description": "NodeList is the whole list of all Nodes which have been registered with master.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "List of nodes", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.Node" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "", + "kind": "NodeList", + "version": "v1" + } + ] + }, + "io.k8s.api.core.v1.NodeSelector": { + "description": "A node selector represents the union of the results of one or more label queries over a set of nodes; that is, it represents the OR of the selectors represented by the node selector terms.", + "properties": { + "nodeSelectorTerms": { + "description": "Required. A list of node selector terms. The terms are ORed.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.NodeSelectorTerm" + }, + "type": "array" + } + }, + "required": [ + "nodeSelectorTerms" + ], + "type": "object" + }, + "io.k8s.api.core.v1.NodeSelectorRequirement": { + "description": "A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values.", + "properties": { + "key": { + "description": "The label key that the selector applies to.", + "type": "string" + }, + "operator": { + "description": "Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.", + "type": "string" + }, + "values": { + "description": "An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "key", + "operator" + ], + "type": "object" + }, + "io.k8s.api.core.v1.NodeSelectorTerm": { + "description": "A null or empty node selector term matches no objects. The requirements of them are ANDed. The TopologySelectorTerm type implements a subset of the NodeSelectorTerm.", + "properties": { + "matchExpressions": { + "description": "A list of node selector requirements by node's labels.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.NodeSelectorRequirement" + }, + "type": "array" + }, + "matchFields": { + "description": "A list of node selector requirements by node's fields.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.NodeSelectorRequirement" + }, + "type": "array" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.NodeSpec": { + "description": "NodeSpec describes the attributes that a node is created with.", + "properties": { + "configSource": { + "$ref": "#/definitions/io.k8s.api.core.v1.NodeConfigSource", + "description": "If specified, the source to get node configuration from The DynamicKubeletConfig feature gate must be enabled for the Kubelet to use this field" + }, + "externalID": { + "description": "Deprecated. Not all kubelets will set this field. Remove field after 1.13. see: https://issues.k8s.io/61966", + "type": "string" + }, + "podCIDR": { + "description": "PodCIDR represents the pod IP range assigned to the node.", + "type": "string" + }, + "podCIDRs": { + "description": "podCIDRs represents the IP ranges assigned to the node for usage by Pods on that node. If this field is specified, the 0th entry must match the podCIDR field. It may contain at most 1 value for each of IPv4 and IPv6.", + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-patch-strategy": "merge" + }, + "providerID": { + "description": "ID of the node assigned by the cloud provider in the format: \u003cProviderName\u003e://\u003cProviderSpecificNodeID\u003e", + "type": "string" + }, + "taints": { + "description": "If specified, the node's taints.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.Taint" + }, + "type": "array" + }, + "unschedulable": { + "description": "Unschedulable controls node schedulability of new pods. By default, node is schedulable. More info: https://kubernetes.io/docs/concepts/nodes/node/#manual-node-administration", + "type": "boolean" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.NodeStatus": { + "description": "NodeStatus is information about the current status of a node.", + "properties": { + "addresses": { + "description": "List of addresses reachable to the node. Queried from cloud provider, if available. More info: https://kubernetes.io/docs/concepts/nodes/node/#addresses Note: This field is declared as mergeable, but the merge key is not sufficiently unique, which can cause data corruption when it is merged. Callers should instead use a full-replacement patch. See http://pr.k8s.io/79391 for an example.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.NodeAddress" + }, + "type": "array", + "x-kubernetes-patch-merge-key": "type", + "x-kubernetes-patch-strategy": "merge" + }, + "allocatable": { + "additionalProperties": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity" + }, + "description": "Allocatable represents the resources of a node that are available for scheduling. Defaults to Capacity.", + "type": "object" + }, + "capacity": { + "additionalProperties": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity" + }, + "description": "Capacity represents the total resources of a node. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#capacity", + "type": "object" + }, + "conditions": { + "description": "Conditions is an array of current observed node conditions. More info: https://kubernetes.io/docs/concepts/nodes/node/#condition", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.NodeCondition" + }, + "type": "array", + "x-kubernetes-patch-merge-key": "type", + "x-kubernetes-patch-strategy": "merge" + }, + "config": { + "$ref": "#/definitions/io.k8s.api.core.v1.NodeConfigStatus", + "description": "Status of the config assigned to the node via the dynamic Kubelet config feature." + }, + "daemonEndpoints": { + "$ref": "#/definitions/io.k8s.api.core.v1.NodeDaemonEndpoints", + "description": "Endpoints of daemons running on the Node." + }, + "images": { + "description": "List of container images on this node", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.ContainerImage" + }, + "type": "array" + }, + "nodeInfo": { + "$ref": "#/definitions/io.k8s.api.core.v1.NodeSystemInfo", + "description": "Set of ids/uuids to uniquely identify the node. More info: https://kubernetes.io/docs/concepts/nodes/node/#info" + }, + "phase": { + "description": "NodePhase is the recently observed lifecycle phase of the node. More info: https://kubernetes.io/docs/concepts/nodes/node/#phase The field is never populated, and now is deprecated.", + "type": "string" + }, + "volumesAttached": { + "description": "List of volumes that are attached to the node.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.AttachedVolume" + }, + "type": "array" + }, + "volumesInUse": { + "description": "List of attachable volumes in use (mounted) by the node.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.NodeSystemInfo": { + "description": "NodeSystemInfo is a set of ids/uuids to uniquely identify the node.", + "properties": { + "architecture": { + "description": "The Architecture reported by the node", + "type": "string" + }, + "bootID": { + "description": "Boot ID reported by the node.", + "type": "string" + }, + "containerRuntimeVersion": { + "description": "ContainerRuntime Version reported by the node through runtime remote API (e.g. docker://1.5.0).", + "type": "string" + }, + "kernelVersion": { + "description": "Kernel Version reported by the node from 'uname -r' (e.g. 3.16.0-0.bpo.4-amd64).", + "type": "string" + }, + "kubeProxyVersion": { + "description": "KubeProxy Version reported by the node.", + "type": "string" + }, + "kubeletVersion": { + "description": "Kubelet Version reported by the node.", + "type": "string" + }, + "machineID": { + "description": "MachineID reported by the node. For unique machine identification in the cluster this field is preferred. Learn more from man(5) machine-id: http://man7.org/linux/man-pages/man5/machine-id.5.html", + "type": "string" + }, + "operatingSystem": { + "description": "The Operating System reported by the node", + "type": "string" + }, + "osImage": { + "description": "OS Image reported by the node from /etc/os-release (e.g. Debian GNU/Linux 7 (wheezy)).", + "type": "string" + }, + "systemUUID": { + "description": "SystemUUID reported by the node. For unique machine identification MachineID is preferred. This field is specific to Red Hat hosts https://access.redhat.com/documentation/en-us/red_hat_subscription_management/1/html/rhsm/uuid", + "type": "string" + } + }, + "required": [ + "machineID", + "systemUUID", + "bootID", + "kernelVersion", + "osImage", + "containerRuntimeVersion", + "kubeletVersion", + "kubeProxyVersion", + "operatingSystem", + "architecture" + ], + "type": "object" + }, + "io.k8s.api.core.v1.ObjectFieldSelector": { + "description": "ObjectFieldSelector selects an APIVersioned field of an object.", + "properties": { + "apiVersion": { + "description": "Version of the schema the FieldPath is written in terms of, defaults to \"v1\".", + "type": "string" + }, + "fieldPath": { + "description": "Path of the field to select in the specified API version.", + "type": "string" + } + }, + "required": [ + "fieldPath" + ], + "type": "object" + }, + "io.k8s.api.core.v1.ObjectReference": { + "description": "ObjectReference contains enough information to let you inspect or modify the referred object.", + "properties": { + "apiVersion": { + "description": "API version of the referent.", + "type": "string" + }, + "fieldPath": { + "description": "If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: \"spec.containers{name}\" (where \"name\" refers to the name of the container that triggered the event) or if no container name is specified \"spec.containers[2]\" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object.", + "type": "string" + }, + "kind": { + "description": "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names", + "type": "string" + }, + "namespace": { + "description": "Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/", + "type": "string" + }, + "resourceVersion": { + "description": "Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency", + "type": "string" + }, + "uid": { + "description": "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.PersistentVolume": { + "description": "PersistentVolume (PV) is a storage resource provisioned by an administrator. It is analogous to a node. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolumeSpec", + "description": "Spec defines a specification of a persistent volume owned by the cluster. Provisioned by an administrator. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistent-volumes" + }, + "status": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolumeStatus", + "description": "Status represents the current information/status for the persistent volume. Populated by the system. Read-only. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistent-volumes" + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "", + "kind": "PersistentVolume", + "version": "v1" + } + ] + }, + "io.k8s.api.core.v1.PersistentVolumeClaim": { + "description": "PersistentVolumeClaim is a user's request for and claim to a persistent volume", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolumeClaimSpec", + "description": "Spec defines the desired characteristics of a volume requested by a pod author. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims" + }, + "status": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolumeClaimStatus", + "description": "Status represents the current information/status of a persistent volume claim. Read-only. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims" + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "", + "kind": "PersistentVolumeClaim", + "version": "v1" + } + ] + }, + "io.k8s.api.core.v1.PersistentVolumeClaimCondition": { + "description": "PersistentVolumeClaimCondition contails details about state of pvc", + "properties": { + "lastProbeTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "Last time we probed the condition." + }, + "lastTransitionTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "Last time the condition transitioned from one status to another." + }, + "message": { + "description": "Human-readable message indicating details about last transition.", + "type": "string" + }, + "reason": { + "description": "Unique, this should be a short, machine understandable string that gives the reason for condition's last transition. If it reports \"ResizeStarted\" that means the underlying persistent volume is being resized.", + "type": "string" + }, + "status": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "type", + "status" + ], + "type": "object" + }, + "io.k8s.api.core.v1.PersistentVolumeClaimList": { + "description": "PersistentVolumeClaimList is a list of PersistentVolumeClaim items.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "A list of persistent volume claims. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolumeClaim" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "", + "kind": "PersistentVolumeClaimList", + "version": "v1" + } + ] + }, + "io.k8s.api.core.v1.PersistentVolumeClaimSpec": { + "description": "PersistentVolumeClaimSpec describes the common attributes of storage devices and allows a Source for provider-specific attributes", + "properties": { + "accessModes": { + "description": "AccessModes contains the desired access modes the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1", + "items": { + "type": "string" + }, + "type": "array" + }, + "dataSource": { + "$ref": "#/definitions/io.k8s.api.core.v1.TypedLocalObjectReference", + "description": "This field can be used to specify either: * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot) * An existing PVC (PersistentVolumeClaim) * An existing custom resource that implements data population (Alpha) In order to use custom resource types that implement data population, the AnyVolumeDataSource feature gate must be enabled. If the provisioner or an external controller can support the specified data source, it will create a new volume based on the contents of the specified data source." + }, + "resources": { + "$ref": "#/definitions/io.k8s.api.core.v1.ResourceRequirements", + "description": "Resources represents the minimum resources the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources" + }, + "selector": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector", + "description": "A label query over volumes to consider for binding." + }, + "storageClassName": { + "description": "Name of the StorageClass required by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1", + "type": "string" + }, + "volumeMode": { + "description": "volumeMode defines what type of volume is required by the claim. Value of Filesystem is implied when not included in claim spec.", + "type": "string" + }, + "volumeName": { + "description": "VolumeName is the binding reference to the PersistentVolume backing this claim.", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.PersistentVolumeClaimStatus": { + "description": "PersistentVolumeClaimStatus is the current status of a persistent volume claim.", + "properties": { + "accessModes": { + "description": "AccessModes contains the actual access modes the volume backing the PVC has. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1", + "items": { + "type": "string" + }, + "type": "array" + }, + "capacity": { + "additionalProperties": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity" + }, + "description": "Represents the actual resources of the underlying volume.", + "type": "object" + }, + "conditions": { + "description": "Current Condition of persistent volume claim. If underlying persistent volume is being resized then the Condition will be set to 'ResizeStarted'.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolumeClaimCondition" + }, + "type": "array", + "x-kubernetes-patch-merge-key": "type", + "x-kubernetes-patch-strategy": "merge" + }, + "phase": { + "description": "Phase represents the current phase of PersistentVolumeClaim.", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.PersistentVolumeClaimTemplate": { + "description": "PersistentVolumeClaimTemplate is used to produce PersistentVolumeClaim objects as part of an EphemeralVolumeSource.", + "properties": { + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "May contain labels and annotations that will be copied into the PVC when creating it. No other fields are allowed and will be rejected during validation." + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolumeClaimSpec", + "description": "The specification for the PersistentVolumeClaim. The entire content is copied unchanged into the PVC that gets created from this template. The same fields as in a PersistentVolumeClaim are also valid here." + } + }, + "required": [ + "spec" + ], + "type": "object" + }, + "io.k8s.api.core.v1.PersistentVolumeClaimVolumeSource": { + "description": "PersistentVolumeClaimVolumeSource references the user's PVC in the same namespace. This volume finds the bound PV and mounts that volume for the pod. A PersistentVolumeClaimVolumeSource is, essentially, a wrapper around another type of volume that is owned by someone else (the system).", + "properties": { + "claimName": { + "description": "ClaimName is the name of a PersistentVolumeClaim in the same namespace as the pod using this volume. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims", + "type": "string" + }, + "readOnly": { + "description": "Will force the ReadOnly setting in VolumeMounts. Default false.", + "type": "boolean" + } + }, + "required": [ + "claimName" + ], + "type": "object" + }, + "io.k8s.api.core.v1.PersistentVolumeList": { + "description": "PersistentVolumeList is a list of PersistentVolume items.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "List of persistent volumes. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolume" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "", + "kind": "PersistentVolumeList", + "version": "v1" + } + ] + }, + "io.k8s.api.core.v1.PersistentVolumeSpec": { + "description": "PersistentVolumeSpec is the specification of a persistent volume.", + "properties": { + "accessModes": { + "description": "AccessModes contains all ways the volume can be mounted. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes", + "items": { + "type": "string" + }, + "type": "array" + }, + "awsElasticBlockStore": { + "$ref": "#/definitions/io.k8s.api.core.v1.AWSElasticBlockStoreVolumeSource", + "description": "AWSElasticBlockStore represents an AWS Disk resource that is attached to a kubelet's host machine and then exposed to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore" + }, + "azureDisk": { + "$ref": "#/definitions/io.k8s.api.core.v1.AzureDiskVolumeSource", + "description": "AzureDisk represents an Azure Data Disk mount on the host and bind mount to the pod." + }, + "azureFile": { + "$ref": "#/definitions/io.k8s.api.core.v1.AzureFilePersistentVolumeSource", + "description": "AzureFile represents an Azure File Service mount on the host and bind mount to the pod." + }, + "capacity": { + "additionalProperties": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity" + }, + "description": "A description of the persistent volume's resources and capacity. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#capacity", + "type": "object" + }, + "cephfs": { + "$ref": "#/definitions/io.k8s.api.core.v1.CephFSPersistentVolumeSource", + "description": "CephFS represents a Ceph FS mount on the host that shares a pod's lifetime" + }, + "cinder": { + "$ref": "#/definitions/io.k8s.api.core.v1.CinderPersistentVolumeSource", + "description": "Cinder represents a cinder volume attached and mounted on kubelets host machine. More info: https://examples.k8s.io/mysql-cinder-pd/README.md" + }, + "claimRef": { + "$ref": "#/definitions/io.k8s.api.core.v1.ObjectReference", + "description": "ClaimRef is part of a bi-directional binding between PersistentVolume and PersistentVolumeClaim. Expected to be non-nil when bound. claim.VolumeName is the authoritative bind between PV and PVC. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#binding" + }, + "csi": { + "$ref": "#/definitions/io.k8s.api.core.v1.CSIPersistentVolumeSource", + "description": "CSI represents storage that is handled by an external CSI driver (Beta feature)." + }, + "fc": { + "$ref": "#/definitions/io.k8s.api.core.v1.FCVolumeSource", + "description": "FC represents a Fibre Channel resource that is attached to a kubelet's host machine and then exposed to the pod." + }, + "flexVolume": { + "$ref": "#/definitions/io.k8s.api.core.v1.FlexPersistentVolumeSource", + "description": "FlexVolume represents a generic volume resource that is provisioned/attached using an exec based plugin." + }, + "flocker": { + "$ref": "#/definitions/io.k8s.api.core.v1.FlockerVolumeSource", + "description": "Flocker represents a Flocker volume attached to a kubelet's host machine and exposed to the pod for its usage. This depends on the Flocker control service being running" + }, + "gcePersistentDisk": { + "$ref": "#/definitions/io.k8s.api.core.v1.GCEPersistentDiskVolumeSource", + "description": "GCEPersistentDisk represents a GCE Disk resource that is attached to a kubelet's host machine and then exposed to the pod. Provisioned by an admin. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk" + }, + "glusterfs": { + "$ref": "#/definitions/io.k8s.api.core.v1.GlusterfsPersistentVolumeSource", + "description": "Glusterfs represents a Glusterfs volume that is attached to a host and exposed to the pod. Provisioned by an admin. More info: https://examples.k8s.io/volumes/glusterfs/README.md" + }, + "hostPath": { + "$ref": "#/definitions/io.k8s.api.core.v1.HostPathVolumeSource", + "description": "HostPath represents a directory on the host. Provisioned by a developer or tester. This is useful for single-node development and testing only! On-host storage is not supported in any way and WILL NOT WORK in a multi-node cluster. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath" + }, + "iscsi": { + "$ref": "#/definitions/io.k8s.api.core.v1.ISCSIPersistentVolumeSource", + "description": "ISCSI represents an ISCSI Disk resource that is attached to a kubelet's host machine and then exposed to the pod. Provisioned by an admin." + }, + "local": { + "$ref": "#/definitions/io.k8s.api.core.v1.LocalVolumeSource", + "description": "Local represents directly-attached storage with node affinity" + }, + "mountOptions": { + "description": "A list of mount options, e.g. [\"ro\", \"soft\"]. Not validated - mount will simply fail if one is invalid. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes/#mount-options", + "items": { + "type": "string" + }, + "type": "array" + }, + "nfs": { + "$ref": "#/definitions/io.k8s.api.core.v1.NFSVolumeSource", + "description": "NFS represents an NFS mount on the host. Provisioned by an admin. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs" + }, + "nodeAffinity": { + "$ref": "#/definitions/io.k8s.api.core.v1.VolumeNodeAffinity", + "description": "NodeAffinity defines constraints that limit what nodes this volume can be accessed from. This field influences the scheduling of pods that use this volume." + }, + "persistentVolumeReclaimPolicy": { + "description": "What happens to a persistent volume when released from its claim. Valid options are Retain (default for manually created PersistentVolumes), Delete (default for dynamically provisioned PersistentVolumes), and Recycle (deprecated). Recycle must be supported by the volume plugin underlying this PersistentVolume. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#reclaiming", + "type": "string" + }, + "photonPersistentDisk": { + "$ref": "#/definitions/io.k8s.api.core.v1.PhotonPersistentDiskVolumeSource", + "description": "PhotonPersistentDisk represents a PhotonController persistent disk attached and mounted on kubelets host machine" + }, + "portworxVolume": { + "$ref": "#/definitions/io.k8s.api.core.v1.PortworxVolumeSource", + "description": "PortworxVolume represents a portworx volume attached and mounted on kubelets host machine" + }, + "quobyte": { + "$ref": "#/definitions/io.k8s.api.core.v1.QuobyteVolumeSource", + "description": "Quobyte represents a Quobyte mount on the host that shares a pod's lifetime" + }, + "rbd": { + "$ref": "#/definitions/io.k8s.api.core.v1.RBDPersistentVolumeSource", + "description": "RBD represents a Rados Block Device mount on the host that shares a pod's lifetime. More info: https://examples.k8s.io/volumes/rbd/README.md" + }, + "scaleIO": { + "$ref": "#/definitions/io.k8s.api.core.v1.ScaleIOPersistentVolumeSource", + "description": "ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes." + }, + "storageClassName": { + "description": "Name of StorageClass to which this persistent volume belongs. Empty value means that this volume does not belong to any StorageClass.", + "type": "string" + }, + "storageos": { + "$ref": "#/definitions/io.k8s.api.core.v1.StorageOSPersistentVolumeSource", + "description": "StorageOS represents a StorageOS volume that is attached to the kubelet's host machine and mounted into the pod More info: https://examples.k8s.io/volumes/storageos/README.md" + }, + "volumeMode": { + "description": "volumeMode defines if a volume is intended to be used with a formatted filesystem or to remain in raw block state. Value of Filesystem is implied when not included in spec.", + "type": "string" + }, + "vsphereVolume": { + "$ref": "#/definitions/io.k8s.api.core.v1.VsphereVirtualDiskVolumeSource", + "description": "VsphereVolume represents a vSphere volume attached and mounted on kubelets host machine" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.PersistentVolumeStatus": { + "description": "PersistentVolumeStatus is the current status of a persistent volume.", + "properties": { + "message": { + "description": "A human-readable message indicating details about why the volume is in this state.", + "type": "string" + }, + "phase": { + "description": "Phase indicates if a volume is available, bound to a claim, or released by a claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#phase", + "type": "string" + }, + "reason": { + "description": "Reason is a brief CamelCase string that describes any failure and is meant for machine parsing and tidy display in the CLI.", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.PhotonPersistentDiskVolumeSource": { + "description": "Represents a Photon Controller persistent disk resource.", + "properties": { + "fsType": { + "description": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.", + "type": "string" + }, + "pdID": { + "description": "ID that identifies Photon Controller persistent disk", + "type": "string" + } + }, + "required": [ + "pdID" + ], + "type": "object" + }, + "io.k8s.api.core.v1.Pod": { + "description": "Pod is a collection of containers that can run on a host. This resource is created by clients and scheduled onto hosts.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.core.v1.PodSpec", + "description": "Specification of the desired behavior of the pod. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" + }, + "status": { + "$ref": "#/definitions/io.k8s.api.core.v1.PodStatus", + "description": "Most recently observed status of the pod. This data may not be up to date. Populated by the system. Read-only. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "", + "kind": "Pod", + "version": "v1" + } + ] + }, + "io.k8s.api.core.v1.PodAffinity": { + "description": "Pod affinity is a group of inter pod affinity scheduling rules.", + "properties": { + "preferredDuringSchedulingIgnoredDuringExecution": { + "description": "The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.WeightedPodAffinityTerm" + }, + "type": "array" + }, + "requiredDuringSchedulingIgnoredDuringExecution": { + "description": "If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.PodAffinityTerm" + }, + "type": "array" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.PodAffinityTerm": { + "description": "Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key \u003ctopologyKey\u003e matches that of any node on which a pod of the set of pods is running", + "properties": { + "labelSelector": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector", + "description": "A label query over a set of resources, in this case pods." + }, + "namespaces": { + "description": "namespaces specifies which namespaces the labelSelector applies to (matches against); null or empty list means \"this pod's namespace\"", + "items": { + "type": "string" + }, + "type": "array" + }, + "topologyKey": { + "description": "This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.", + "type": "string" + } + }, + "required": [ + "topologyKey" + ], + "type": "object" + }, + "io.k8s.api.core.v1.PodAntiAffinity": { + "description": "Pod anti affinity is a group of inter pod anti affinity scheduling rules.", + "properties": { + "preferredDuringSchedulingIgnoredDuringExecution": { + "description": "The scheduler will prefer to schedule pods to nodes that satisfy the anti-affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.WeightedPodAffinityTerm" + }, + "type": "array" + }, + "requiredDuringSchedulingIgnoredDuringExecution": { + "description": "If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.PodAffinityTerm" + }, + "type": "array" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.PodCondition": { + "description": "PodCondition contains details for the current condition of this pod.", + "properties": { + "lastProbeTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "Last time we probed the condition." + }, + "lastTransitionTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "Last time the condition transitioned from one status to another." + }, + "message": { + "description": "Human-readable message indicating details about last transition.", + "type": "string" + }, + "reason": { + "description": "Unique, one-word, CamelCase reason for the condition's last transition.", + "type": "string" + }, + "status": { + "description": "Status is the status of the condition. Can be True, False, Unknown. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-conditions", + "type": "string" + }, + "type": { + "description": "Type is the type of the condition. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-conditions", + "type": "string" + } + }, + "required": [ + "type", + "status" + ], + "type": "object" + }, + "io.k8s.api.core.v1.PodDNSConfig": { + "description": "PodDNSConfig defines the DNS parameters of a pod in addition to those generated from DNSPolicy.", + "properties": { + "nameservers": { + "description": "A list of DNS name server IP addresses. This will be appended to the base nameservers generated from DNSPolicy. Duplicated nameservers will be removed.", + "items": { + "type": "string" + }, + "type": "array" + }, + "options": { + "description": "A list of DNS resolver options. This will be merged with the base options generated from DNSPolicy. Duplicated entries will be removed. Resolution options given in Options will override those that appear in the base DNSPolicy.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.PodDNSConfigOption" + }, + "type": "array" + }, + "searches": { + "description": "A list of DNS search domains for host-name lookup. This will be appended to the base search paths generated from DNSPolicy. Duplicated search paths will be removed.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.PodDNSConfigOption": { + "description": "PodDNSConfigOption defines DNS resolver options of a pod.", + "properties": { + "name": { + "description": "Required.", + "type": "string" + }, + "value": { + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.PodIP": { + "description": "IP address information for entries in the (plural) PodIPs field. Each entry includes:\n IP: An IP address allocated to the pod. Routable at least within the cluster.", + "properties": { + "ip": { + "description": "ip is an IP address (IPv4 or IPv6) assigned to the pod", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.PodList": { + "description": "PodList is a list of Pods.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "List of pods. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.Pod" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "", + "kind": "PodList", + "version": "v1" + } + ] + }, + "io.k8s.api.core.v1.PodReadinessGate": { + "description": "PodReadinessGate contains the reference to a pod condition", + "properties": { + "conditionType": { + "description": "ConditionType refers to a condition in the pod's condition list with matching type.", + "type": "string" + } + }, + "required": [ + "conditionType" + ], + "type": "object" + }, + "io.k8s.api.core.v1.PodSecurityContext": { + "description": "PodSecurityContext holds pod-level security attributes and common container settings. Some fields are also present in container.securityContext. Field values of container.securityContext take precedence over field values of PodSecurityContext.", + "properties": { + "fsGroup": { + "description": "A special supplemental group that applies to all containers in a pod. Some volume types allow the Kubelet to change the ownership of that volume to be owned by the pod:\n\n1. The owning GID will be the FSGroup 2. The setgid bit is set (new files created in the volume will be owned by FSGroup) 3. The permission bits are OR'd with rw-rw----\n\nIf unset, the Kubelet will not modify the ownership and permissions of any volume.", + "format": "int64", + "type": "integer" + }, + "fsGroupChangePolicy": { + "description": "fsGroupChangePolicy defines behavior of changing ownership and permission of the volume before being exposed inside Pod. This field will only apply to volume types which support fsGroup based ownership(and permissions). It will have no effect on ephemeral volume types such as: secret, configmaps and emptydir. Valid values are \"OnRootMismatch\" and \"Always\". If not specified, \"Always\" is used.", + "type": "string" + }, + "runAsGroup": { + "description": "The GID to run the entrypoint of the container process. Uses runtime default if unset. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence for that container.", + "format": "int64", + "type": "integer" + }, + "runAsNonRoot": { + "description": "Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run as UID 0 (root) and fail to start the container if it does. If unset or false, no such validation will be performed. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.", + "type": "boolean" + }, + "runAsUser": { + "description": "The UID to run the entrypoint of the container process. Defaults to user specified in image metadata if unspecified. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence for that container.", + "format": "int64", + "type": "integer" + }, + "seLinuxOptions": { + "$ref": "#/definitions/io.k8s.api.core.v1.SELinuxOptions", + "description": "The SELinux context to be applied to all containers. If unspecified, the container runtime will allocate a random SELinux context for each container. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence for that container." + }, + "seccompProfile": { + "$ref": "#/definitions/io.k8s.api.core.v1.SeccompProfile", + "description": "The seccomp options to use by the containers in this pod." + }, + "supplementalGroups": { + "description": "A list of groups applied to the first process run in each container, in addition to the container's primary GID. If unspecified, no groups will be added to any container.", + "items": { + "format": "int64", + "type": "integer" + }, + "type": "array" + }, + "sysctls": { + "description": "Sysctls hold a list of namespaced sysctls used for the pod. Pods with unsupported sysctls (by the container runtime) might fail to launch.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.Sysctl" + }, + "type": "array" + }, + "windowsOptions": { + "$ref": "#/definitions/io.k8s.api.core.v1.WindowsSecurityContextOptions", + "description": "The Windows specific settings applied to all containers. If unspecified, the options within a container's SecurityContext will be used. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence." + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.PodSpec": { + "description": "PodSpec is a description of a pod.", + "properties": { + "activeDeadlineSeconds": { + "description": "Optional duration in seconds the pod may be active on the node relative to StartTime before the system will actively try to mark it failed and kill associated containers. Value must be a positive integer.", + "format": "int64", + "type": "integer" + }, + "affinity": { + "$ref": "#/definitions/io.k8s.api.core.v1.Affinity", + "description": "If specified, the pod's scheduling constraints" + }, + "automountServiceAccountToken": { + "description": "AutomountServiceAccountToken indicates whether a service account token should be automatically mounted.", + "type": "boolean" + }, + "containers": { + "description": "List of containers belonging to the pod. Containers cannot currently be added or removed. There must be at least one container in a Pod. Cannot be updated.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.Container" + }, + "type": "array", + "x-kubernetes-patch-merge-key": "name", + "x-kubernetes-patch-strategy": "merge" + }, + "dnsConfig": { + "$ref": "#/definitions/io.k8s.api.core.v1.PodDNSConfig", + "description": "Specifies the DNS parameters of a pod. Parameters specified here will be merged to the generated DNS configuration based on DNSPolicy." + }, + "dnsPolicy": { + "description": "Set DNS policy for the pod. Defaults to \"ClusterFirst\". Valid values are 'ClusterFirstWithHostNet', 'ClusterFirst', 'Default' or 'None'. DNS parameters given in DNSConfig will be merged with the policy selected with DNSPolicy. To have DNS options set along with hostNetwork, you have to specify DNS policy explicitly to 'ClusterFirstWithHostNet'.", + "type": "string" + }, + "enableServiceLinks": { + "description": "EnableServiceLinks indicates whether information about services should be injected into pod's environment variables, matching the syntax of Docker links. Optional: Defaults to true.", + "type": "boolean" + }, + "ephemeralContainers": { + "description": "List of ephemeral containers run in this pod. Ephemeral containers may be run in an existing pod to perform user-initiated actions such as debugging. This list cannot be specified when creating a pod, and it cannot be modified by updating the pod spec. In order to add an ephemeral container to an existing pod, use the pod's ephemeralcontainers subresource. This field is alpha-level and is only honored by servers that enable the EphemeralContainers feature.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.EphemeralContainer" + }, + "type": "array", + "x-kubernetes-patch-merge-key": "name", + "x-kubernetes-patch-strategy": "merge" + }, + "hostAliases": { + "description": "HostAliases is an optional list of hosts and IPs that will be injected into the pod's hosts file if specified. This is only valid for non-hostNetwork pods.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.HostAlias" + }, + "type": "array", + "x-kubernetes-patch-merge-key": "ip", + "x-kubernetes-patch-strategy": "merge" + }, + "hostIPC": { + "description": "Use the host's ipc namespace. Optional: Default to false.", + "type": "boolean" + }, + "hostNetwork": { + "description": "Host networking requested for this pod. Use the host's network namespace. If this option is set, the ports that will be used must be specified. Default to false.", + "type": "boolean" + }, + "hostPID": { + "description": "Use the host's pid namespace. Optional: Default to false.", + "type": "boolean" + }, + "hostname": { + "description": "Specifies the hostname of the Pod If not specified, the pod's hostname will be set to a system-defined value.", + "type": "string" + }, + "imagePullSecrets": { + "description": "ImagePullSecrets is an optional list of references to secrets in the same namespace to use for pulling any of the images used by this PodSpec. If specified, these secrets will be passed to individual puller implementations for them to use. For example, in the case of docker, only DockerConfig type secrets are honored. More info: https://kubernetes.io/docs/concepts/containers/images#specifying-imagepullsecrets-on-a-pod", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.LocalObjectReference" + }, + "type": "array", + "x-kubernetes-patch-merge-key": "name", + "x-kubernetes-patch-strategy": "merge" + }, + "initContainers": { + "description": "List of initialization containers belonging to the pod. Init containers are executed in order prior to containers being started. If any init container fails, the pod is considered to have failed and is handled according to its restartPolicy. The name for an init container or normal container must be unique among all containers. Init containers may not have Lifecycle actions, Readiness probes, Liveness probes, or Startup probes. The resourceRequirements of an init container are taken into account during scheduling by finding the highest request/limit for each resource type, and then using the max of of that value or the sum of the normal containers. Limits are applied to init containers in a similar fashion. Init containers cannot currently be added or removed. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.Container" + }, + "type": "array", + "x-kubernetes-patch-merge-key": "name", + "x-kubernetes-patch-strategy": "merge" + }, + "nodeName": { + "description": "NodeName is a request to schedule this pod onto a specific node. If it is non-empty, the scheduler simply schedules this pod onto that node, assuming that it fits resource requirements.", + "type": "string" + }, + "nodeSelector": { + "additionalProperties": { + "type": "string" + }, + "description": "NodeSelector is a selector which must be true for the pod to fit on a node. Selector which must match a node's labels for the pod to be scheduled on that node. More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/", + "type": "object" + }, + "overhead": { + "additionalProperties": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity" + }, + "description": "Overhead represents the resource overhead associated with running a pod for a given RuntimeClass. This field will be autopopulated at admission time by the RuntimeClass admission controller. If the RuntimeClass admission controller is enabled, overhead must not be set in Pod create requests. The RuntimeClass admission controller will reject Pod create requests which have the overhead already set. If RuntimeClass is configured and selected in the PodSpec, Overhead will be set to the value defined in the corresponding RuntimeClass, otherwise it will remain unset and treated as zero. More info: https://git.k8s.io/enhancements/keps/sig-node/20190226-pod-overhead.md This field is alpha-level as of Kubernetes v1.16, and is only honored by servers that enable the PodOverhead feature.", + "type": "object" + }, + "preemptionPolicy": { + "description": "PreemptionPolicy is the Policy for preempting pods with lower priority. One of Never, PreemptLowerPriority. Defaults to PreemptLowerPriority if unset. This field is beta-level, gated by the NonPreemptingPriority feature-gate.", + "type": "string" + }, + "priority": { + "description": "The priority value. Various system components use this field to find the priority of the pod. When Priority Admission Controller is enabled, it prevents users from setting this field. The admission controller populates this field from PriorityClassName. The higher the value, the higher the priority.", + "format": "int32", + "type": "integer" + }, + "priorityClassName": { + "description": "If specified, indicates the pod's priority. \"system-node-critical\" and \"system-cluster-critical\" are two special keywords which indicate the highest priorities with the former being the highest priority. Any other name must be defined by creating a PriorityClass object with that name. If not specified, the pod priority will be default or zero if there is no default.", + "type": "string" + }, + "readinessGates": { + "description": "If specified, all readiness gates will be evaluated for pod readiness. A pod is ready when all its containers are ready AND all conditions specified in the readiness gates have status equal to \"True\" More info: https://git.k8s.io/enhancements/keps/sig-network/0007-pod-ready%2B%2B.md", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.PodReadinessGate" + }, + "type": "array" + }, + "restartPolicy": { + "description": "Restart policy for all containers within the pod. One of Always, OnFailure, Never. Default to Always. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy", + "type": "string" + }, + "runtimeClassName": { + "description": "RuntimeClassName refers to a RuntimeClass object in the node.k8s.io group, which should be used to run this pod. If no RuntimeClass resource matches the named class, the pod will not be run. If unset or empty, the \"legacy\" RuntimeClass will be used, which is an implicit class with an empty definition that uses the default runtime handler. More info: https://git.k8s.io/enhancements/keps/sig-node/runtime-class.md This is a beta feature as of Kubernetes v1.14.", + "type": "string" + }, + "schedulerName": { + "description": "If specified, the pod will be dispatched by specified scheduler. If not specified, the pod will be dispatched by default scheduler.", + "type": "string" + }, + "securityContext": { + "$ref": "#/definitions/io.k8s.api.core.v1.PodSecurityContext", + "description": "SecurityContext holds pod-level security attributes and common container settings. Optional: Defaults to empty. See type description for default values of each field." + }, + "serviceAccount": { + "description": "DeprecatedServiceAccount is a depreciated alias for ServiceAccountName. Deprecated: Use serviceAccountName instead.", + "type": "string" + }, + "serviceAccountName": { + "description": "ServiceAccountName is the name of the ServiceAccount to use to run this pod. More info: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/", + "type": "string" + }, + "setHostnameAsFQDN": { + "description": "If true the pod's hostname will be configured as the pod's FQDN, rather than the leaf name (the default). In Linux containers, this means setting the FQDN in the hostname field of the kernel (the nodename field of struct utsname). In Windows containers, this means setting the registry value of hostname for the registry key HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters to FQDN. If a pod does not have FQDN, this has no effect. Default to false.", + "type": "boolean" + }, + "shareProcessNamespace": { + "description": "Share a single process namespace between all of the containers in a pod. When this is set containers will be able to view and signal processes from other containers in the same pod, and the first process in each container will not be assigned PID 1. HostPID and ShareProcessNamespace cannot both be set. Optional: Default to false.", + "type": "boolean" + }, + "subdomain": { + "description": "If specified, the fully qualified Pod hostname will be \"\u003chostname\u003e.\u003csubdomain\u003e.\u003cpod namespace\u003e.svc.\u003ccluster domain\u003e\". If not specified, the pod will not have a domainname at all.", + "type": "string" + }, + "terminationGracePeriodSeconds": { + "description": "Optional duration in seconds the pod needs to terminate gracefully. May be decreased in delete request. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period will be used instead. The grace period is the duration in seconds after the processes running in the pod are sent a termination signal and the time when the processes are forcibly halted with a kill signal. Set this value longer than the expected cleanup time for your process. Defaults to 30 seconds.", + "format": "int64", + "type": "integer" + }, + "tolerations": { + "description": "If specified, the pod's tolerations.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.Toleration" + }, + "type": "array" + }, + "topologySpreadConstraints": { + "description": "TopologySpreadConstraints describes how a group of pods ought to spread across topology domains. Scheduler will schedule pods in a way which abides by the constraints. All topologySpreadConstraints are ANDed.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.TopologySpreadConstraint" + }, + "type": "array", + "x-kubernetes-list-map-keys": [ + "topologyKey", + "whenUnsatisfiable" + ], + "x-kubernetes-list-type": "map", + "x-kubernetes-patch-merge-key": "topologyKey", + "x-kubernetes-patch-strategy": "merge" + }, + "volumes": { + "description": "List of volumes that can be mounted by containers belonging to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.Volume" + }, + "type": "array", + "x-kubernetes-patch-merge-key": "name", + "x-kubernetes-patch-strategy": "merge,retainKeys" + } + }, + "required": [ + "containers" + ], + "type": "object" + }, + "io.k8s.api.core.v1.PodStatus": { + "description": "PodStatus represents information about the status of a pod. Status may trail the actual state of a system, especially if the node that hosts the pod cannot contact the control plane.", + "properties": { + "conditions": { + "description": "Current service state of pod. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-conditions", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.PodCondition" + }, + "type": "array", + "x-kubernetes-patch-merge-key": "type", + "x-kubernetes-patch-strategy": "merge" + }, + "containerStatuses": { + "description": "The list has one entry per container in the manifest. Each entry is currently the output of `docker inspect`. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-and-container-status", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.ContainerStatus" + }, + "type": "array" + }, + "ephemeralContainerStatuses": { + "description": "Status for any ephemeral containers that have run in this pod. This field is alpha-level and is only populated by servers that enable the EphemeralContainers feature.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.ContainerStatus" + }, + "type": "array" + }, + "hostIP": { + "description": "IP address of the host to which the pod is assigned. Empty if not yet scheduled.", + "type": "string" + }, + "initContainerStatuses": { + "description": "The list has one entry per init container in the manifest. The most recent successful init container will have ready = true, the most recently started container will have startTime set. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-and-container-status", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.ContainerStatus" + }, + "type": "array" + }, + "message": { + "description": "A human readable message indicating details about why the pod is in this condition.", + "type": "string" + }, + "nominatedNodeName": { + "description": "nominatedNodeName is set only when this pod preempts other pods on the node, but it cannot be scheduled right away as preemption victims receive their graceful termination periods. This field does not guarantee that the pod will be scheduled on this node. Scheduler may decide to place the pod elsewhere if other nodes become available sooner. Scheduler may also decide to give the resources on this node to a higher priority pod that is created after preemption. As a result, this field may be different than PodSpec.nodeName when the pod is scheduled.", + "type": "string" + }, + "phase": { + "description": "The phase of a Pod is a simple, high-level summary of where the Pod is in its lifecycle. The conditions array, the reason and message fields, and the individual container status arrays contain more detail about the pod's status. There are five possible phase values:\n\nPending: The pod has been accepted by the Kubernetes system, but one or more of the container images has not been created. This includes time before being scheduled as well as time spent downloading images over the network, which could take a while. Running: The pod has been bound to a node, and all of the containers have been created. At least one container is still running, or is in the process of starting or restarting. Succeeded: All containers in the pod have terminated in success, and will not be restarted. Failed: All containers in the pod have terminated, and at least one container has terminated in failure. The container either exited with non-zero status or was terminated by the system. Unknown: For some reason the state of the pod could not be obtained, typically due to an error in communicating with the host of the pod.\n\nMore info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-phase", + "type": "string" + }, + "podIP": { + "description": "IP address allocated to the pod. Routable at least within the cluster. Empty if not yet allocated.", + "type": "string" + }, + "podIPs": { + "description": "podIPs holds the IP addresses allocated to the pod. If this field is specified, the 0th entry must match the podIP field. Pods may be allocated at most 1 value for each of IPv4 and IPv6. This list is empty if no IPs have been allocated yet.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.PodIP" + }, + "type": "array", + "x-kubernetes-patch-merge-key": "ip", + "x-kubernetes-patch-strategy": "merge" + }, + "qosClass": { + "description": "The Quality of Service (QOS) classification assigned to the pod based on resource requirements See PodQOSClass type for available QOS classes More info: https://git.k8s.io/community/contributors/design-proposals/node/resource-qos.md", + "type": "string" + }, + "reason": { + "description": "A brief CamelCase message indicating details about why the pod is in this state. e.g. 'Evicted'", + "type": "string" + }, + "startTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "RFC 3339 date and time at which the object was acknowledged by the Kubelet. This is before the Kubelet pulled the container image(s) for the pod." + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.PodTemplate": { + "description": "PodTemplate describes a template for creating copies of a predefined pod.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "template": { + "$ref": "#/definitions/io.k8s.api.core.v1.PodTemplateSpec", + "description": "Template defines the pods that will be created from this pod template. https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "", + "kind": "PodTemplate", + "version": "v1" + } + ] + }, + "io.k8s.api.core.v1.PodTemplateList": { + "description": "PodTemplateList is a list of PodTemplates.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "List of pod templates", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.PodTemplate" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "", + "kind": "PodTemplateList", + "version": "v1" + } + ] + }, + "io.k8s.api.core.v1.PodTemplateSpec": { + "description": "PodTemplateSpec describes the data a pod should have when created from a template", + "properties": { + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.core.v1.PodSpec", + "description": "Specification of the desired behavior of the pod. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.PortStatus": { + "properties": { + "error": { + "description": "Error is to record the problem with the service port The format of the error shall comply with the following rules: - built-in error values shall be specified in this file and those shall use\n CamelCase names\n- cloud provider specific error values must have names that comply with the\n format foo.example.com/CamelCase.", + "type": "string" + }, + "port": { + "description": "Port is the port number of the service port of which status is recorded here", + "format": "int32", + "type": "integer" + }, + "protocol": { + "description": "Protocol is the protocol of the service port of which status is recorded here The supported values are: \"TCP\", \"UDP\", \"SCTP\"", + "type": "string" + } + }, + "required": [ + "port", + "protocol" + ], + "type": "object" + }, + "io.k8s.api.core.v1.PortworxVolumeSource": { + "description": "PortworxVolumeSource represents a Portworx volume resource.", + "properties": { + "fsType": { + "description": "FSType represents the filesystem type to mount Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\". Implicitly inferred to be \"ext4\" if unspecified.", + "type": "string" + }, + "readOnly": { + "description": "Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.", + "type": "boolean" + }, + "volumeID": { + "description": "VolumeID uniquely identifies a Portworx volume", + "type": "string" + } + }, + "required": [ + "volumeID" + ], + "type": "object" + }, + "io.k8s.api.core.v1.PreferredSchedulingTerm": { + "description": "An empty preferred scheduling term matches all objects with implicit weight 0 (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op).", + "properties": { + "preference": { + "$ref": "#/definitions/io.k8s.api.core.v1.NodeSelectorTerm", + "description": "A node selector term, associated with the corresponding weight." + }, + "weight": { + "description": "Weight associated with matching the corresponding nodeSelectorTerm, in the range 1-100.", + "format": "int32", + "type": "integer" + } + }, + "required": [ + "weight", + "preference" + ], + "type": "object" + }, + "io.k8s.api.core.v1.Probe": { + "description": "Probe describes a health check to be performed against a container to determine whether it is alive or ready to receive traffic.", + "properties": { + "exec": { + "$ref": "#/definitions/io.k8s.api.core.v1.ExecAction", + "description": "One and only one of the following should be specified. Exec specifies the action to take." + }, + "failureThreshold": { + "description": "Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1.", + "format": "int32", + "type": "integer" + }, + "httpGet": { + "$ref": "#/definitions/io.k8s.api.core.v1.HTTPGetAction", + "description": "HTTPGet specifies the http request to perform." + }, + "initialDelaySeconds": { + "description": "Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes", + "format": "int32", + "type": "integer" + }, + "periodSeconds": { + "description": "How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1.", + "format": "int32", + "type": "integer" + }, + "successThreshold": { + "description": "Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.", + "format": "int32", + "type": "integer" + }, + "tcpSocket": { + "$ref": "#/definitions/io.k8s.api.core.v1.TCPSocketAction", + "description": "TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported" + }, + "timeoutSeconds": { + "description": "Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes", + "format": "int32", + "type": "integer" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.ProjectedVolumeSource": { + "description": "Represents a projected volume source", + "properties": { + "defaultMode": { + "description": "Mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.", + "format": "int32", + "type": "integer" + }, + "sources": { + "description": "list of volume projections", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.VolumeProjection" + }, + "type": "array" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.QuobyteVolumeSource": { + "description": "Represents a Quobyte mount that lasts the lifetime of a pod. Quobyte volumes do not support ownership management or SELinux relabeling.", + "properties": { + "group": { + "description": "Group to map volume access to Default is no group", + "type": "string" + }, + "readOnly": { + "description": "ReadOnly here will force the Quobyte volume to be mounted with read-only permissions. Defaults to false.", + "type": "boolean" + }, + "registry": { + "description": "Registry represents a single or multiple Quobyte Registry services specified as a string as host:port pair (multiple entries are separated with commas) which acts as the central registry for volumes", + "type": "string" + }, + "tenant": { + "description": "Tenant owning the given Quobyte volume in the Backend Used with dynamically provisioned Quobyte volumes, value is set by the plugin", + "type": "string" + }, + "user": { + "description": "User to map volume access to Defaults to serivceaccount user", + "type": "string" + }, + "volume": { + "description": "Volume is a string that references an already created Quobyte volume by name.", + "type": "string" + } + }, + "required": [ + "registry", + "volume" + ], + "type": "object" + }, + "io.k8s.api.core.v1.RBDPersistentVolumeSource": { + "description": "Represents a Rados Block Device mount that lasts the lifetime of a pod. RBD volumes support ownership management and SELinux relabeling.", + "properties": { + "fsType": { + "description": "Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd", + "type": "string" + }, + "image": { + "description": "The rados image name. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it", + "type": "string" + }, + "keyring": { + "description": "Keyring is the path to key ring for RBDUser. Default is /etc/ceph/keyring. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it", + "type": "string" + }, + "monitors": { + "description": "A collection of Ceph monitors. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it", + "items": { + "type": "string" + }, + "type": "array" + }, + "pool": { + "description": "The rados pool name. Default is rbd. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it", + "type": "string" + }, + "readOnly": { + "description": "ReadOnly here will force the ReadOnly setting in VolumeMounts. Defaults to false. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it", + "type": "boolean" + }, + "secretRef": { + "$ref": "#/definitions/io.k8s.api.core.v1.SecretReference", + "description": "SecretRef is name of the authentication secret for RBDUser. If provided overrides keyring. Default is nil. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it" + }, + "user": { + "description": "The rados user name. Default is admin. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it", + "type": "string" + } + }, + "required": [ + "monitors", + "image" + ], + "type": "object" + }, + "io.k8s.api.core.v1.RBDVolumeSource": { + "description": "Represents a Rados Block Device mount that lasts the lifetime of a pod. RBD volumes support ownership management and SELinux relabeling.", + "properties": { + "fsType": { + "description": "Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd", + "type": "string" + }, + "image": { + "description": "The rados image name. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it", + "type": "string" + }, + "keyring": { + "description": "Keyring is the path to key ring for RBDUser. Default is /etc/ceph/keyring. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it", + "type": "string" + }, + "monitors": { + "description": "A collection of Ceph monitors. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it", + "items": { + "type": "string" + }, + "type": "array" + }, + "pool": { + "description": "The rados pool name. Default is rbd. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it", + "type": "string" + }, + "readOnly": { + "description": "ReadOnly here will force the ReadOnly setting in VolumeMounts. Defaults to false. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it", + "type": "boolean" + }, + "secretRef": { + "$ref": "#/definitions/io.k8s.api.core.v1.LocalObjectReference", + "description": "SecretRef is name of the authentication secret for RBDUser. If provided overrides keyring. Default is nil. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it" + }, + "user": { + "description": "The rados user name. Default is admin. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it", + "type": "string" + } + }, + "required": [ + "monitors", + "image" + ], + "type": "object" + }, + "io.k8s.api.core.v1.ReplicationController": { + "description": "ReplicationController represents the configuration of a replication controller.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "If the Labels of a ReplicationController are empty, they are defaulted to be the same as the Pod(s) that the replication controller manages. Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.core.v1.ReplicationControllerSpec", + "description": "Spec defines the specification of the desired behavior of the replication controller. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" + }, + "status": { + "$ref": "#/definitions/io.k8s.api.core.v1.ReplicationControllerStatus", + "description": "Status is the most recently observed status of the replication controller. This data may be out of date by some window of time. Populated by the system. Read-only. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "", + "kind": "ReplicationController", + "version": "v1" + } + ] + }, + "io.k8s.api.core.v1.ReplicationControllerCondition": { + "description": "ReplicationControllerCondition describes the state of a replication controller at a certain point.", + "properties": { + "lastTransitionTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "The last time the condition transitioned from one status to another." + }, + "message": { + "description": "A human readable message indicating details about the transition.", + "type": "string" + }, + "reason": { + "description": "The reason for the condition's last transition.", + "type": "string" + }, + "status": { + "description": "Status of the condition, one of True, False, Unknown.", + "type": "string" + }, + "type": { + "description": "Type of replication controller condition.", + "type": "string" + } + }, + "required": [ + "type", + "status" + ], + "type": "object" + }, + "io.k8s.api.core.v1.ReplicationControllerList": { + "description": "ReplicationControllerList is a collection of replication controllers.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "List of replication controllers. More info: https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.ReplicationController" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "", + "kind": "ReplicationControllerList", + "version": "v1" + } + ] + }, + "io.k8s.api.core.v1.ReplicationControllerSpec": { + "description": "ReplicationControllerSpec is the specification of a replication controller.", + "properties": { + "minReadySeconds": { + "description": "Minimum number of seconds for which a newly created pod should be ready without any of its container crashing, for it to be considered available. Defaults to 0 (pod will be considered available as soon as it is ready)", + "format": "int32", + "type": "integer" + }, + "replicas": { + "description": "Replicas is the number of desired replicas. This is a pointer to distinguish between explicit zero and unspecified. Defaults to 1. More info: https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller#what-is-a-replicationcontroller", + "format": "int32", + "type": "integer" + }, + "selector": { + "additionalProperties": { + "type": "string" + }, + "description": "Selector is a label query over pods that should match the Replicas count. If Selector is empty, it is defaulted to the labels present on the Pod template. Label keys and values that must match in order to be controlled by this replication controller, if empty defaulted to labels on Pod template. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors", + "type": "object" + }, + "template": { + "$ref": "#/definitions/io.k8s.api.core.v1.PodTemplateSpec", + "description": "Template is the object that describes the pod that will be created if insufficient replicas are detected. This takes precedence over a TemplateRef. More info: https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller#pod-template" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.ReplicationControllerStatus": { + "description": "ReplicationControllerStatus represents the current status of a replication controller.", + "properties": { + "availableReplicas": { + "description": "The number of available replicas (ready for at least minReadySeconds) for this replication controller.", + "format": "int32", + "type": "integer" + }, + "conditions": { + "description": "Represents the latest available observations of a replication controller's current state.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.ReplicationControllerCondition" + }, + "type": "array", + "x-kubernetes-patch-merge-key": "type", + "x-kubernetes-patch-strategy": "merge" + }, + "fullyLabeledReplicas": { + "description": "The number of pods that have labels matching the labels of the pod template of the replication controller.", + "format": "int32", + "type": "integer" + }, + "observedGeneration": { + "description": "ObservedGeneration reflects the generation of the most recently observed replication controller.", + "format": "int64", + "type": "integer" + }, + "readyReplicas": { + "description": "The number of ready replicas for this replication controller.", + "format": "int32", + "type": "integer" + }, + "replicas": { + "description": "Replicas is the most recently oberved number of replicas. More info: https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller#what-is-a-replicationcontroller", + "format": "int32", + "type": "integer" + } + }, + "required": [ + "replicas" + ], + "type": "object" + }, + "io.k8s.api.core.v1.ResourceFieldSelector": { + "description": "ResourceFieldSelector represents container resources (cpu, memory) and their output format", + "properties": { + "containerName": { + "description": "Container name: required for volumes, optional for env vars", + "type": "string" + }, + "divisor": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity", + "description": "Specifies the output format of the exposed resources, defaults to \"1\"" + }, + "resource": { + "description": "Required: resource to select", + "type": "string" + } + }, + "required": [ + "resource" + ], + "type": "object" + }, + "io.k8s.api.core.v1.ResourceQuota": { + "description": "ResourceQuota sets aggregate quota restrictions enforced per namespace", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.core.v1.ResourceQuotaSpec", + "description": "Spec defines the desired quota. https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" + }, + "status": { + "$ref": "#/definitions/io.k8s.api.core.v1.ResourceQuotaStatus", + "description": "Status defines the actual enforced quota and its current usage. https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "", + "kind": "ResourceQuota", + "version": "v1" + } + ] + }, + "io.k8s.api.core.v1.ResourceQuotaList": { + "description": "ResourceQuotaList is a list of ResourceQuota items.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "Items is a list of ResourceQuota objects. More info: https://kubernetes.io/docs/concepts/policy/resource-quotas/", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.ResourceQuota" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "", + "kind": "ResourceQuotaList", + "version": "v1" + } + ] + }, + "io.k8s.api.core.v1.ResourceQuotaSpec": { + "description": "ResourceQuotaSpec defines the desired hard limits to enforce for Quota.", + "properties": { + "hard": { + "additionalProperties": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity" + }, + "description": "hard is the set of desired hard limits for each named resource. More info: https://kubernetes.io/docs/concepts/policy/resource-quotas/", + "type": "object" + }, + "scopeSelector": { + "$ref": "#/definitions/io.k8s.api.core.v1.ScopeSelector", + "description": "scopeSelector is also a collection of filters like scopes that must match each object tracked by a quota but expressed using ScopeSelectorOperator in combination with possible values. For a resource to match, both scopes AND scopeSelector (if specified in spec), must be matched." + }, + "scopes": { + "description": "A collection of filters that must match each object tracked by a quota. If not specified, the quota matches all objects.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.ResourceQuotaStatus": { + "description": "ResourceQuotaStatus defines the enforced hard limits and observed use.", + "properties": { + "hard": { + "additionalProperties": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity" + }, + "description": "Hard is the set of enforced hard limits for each named resource. More info: https://kubernetes.io/docs/concepts/policy/resource-quotas/", + "type": "object" + }, + "used": { + "additionalProperties": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity" + }, + "description": "Used is the current observed total usage of the resource in the namespace.", + "type": "object" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.ResourceRequirements": { + "description": "ResourceRequirements describes the compute resource requirements.", + "properties": { + "limits": { + "additionalProperties": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity" + }, + "description": "Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/", + "type": "object" + }, + "requests": { + "additionalProperties": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity" + }, + "description": "Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/", + "type": "object" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.SELinuxOptions": { + "description": "SELinuxOptions are the labels to be applied to the container", + "properties": { + "level": { + "description": "Level is SELinux level label that applies to the container.", + "type": "string" + }, + "role": { + "description": "Role is a SELinux role label that applies to the container.", + "type": "string" + }, + "type": { + "description": "Type is a SELinux type label that applies to the container.", + "type": "string" + }, + "user": { + "description": "User is a SELinux user label that applies to the container.", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.ScaleIOPersistentVolumeSource": { + "description": "ScaleIOPersistentVolumeSource represents a persistent ScaleIO volume", + "properties": { + "fsType": { + "description": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Default is \"xfs\"", + "type": "string" + }, + "gateway": { + "description": "The host address of the ScaleIO API Gateway.", + "type": "string" + }, + "protectionDomain": { + "description": "The name of the ScaleIO Protection Domain for the configured storage.", + "type": "string" + }, + "readOnly": { + "description": "Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.", + "type": "boolean" + }, + "secretRef": { + "$ref": "#/definitions/io.k8s.api.core.v1.SecretReference", + "description": "SecretRef references to the secret for ScaleIO user and other sensitive information. If this is not provided, Login operation will fail." + }, + "sslEnabled": { + "description": "Flag to enable/disable SSL communication with Gateway, default false", + "type": "boolean" + }, + "storageMode": { + "description": "Indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned. Default is ThinProvisioned.", + "type": "string" + }, + "storagePool": { + "description": "The ScaleIO Storage Pool associated with the protection domain.", + "type": "string" + }, + "system": { + "description": "The name of the storage system as configured in ScaleIO.", + "type": "string" + }, + "volumeName": { + "description": "The name of a volume already created in the ScaleIO system that is associated with this volume source.", + "type": "string" + } + }, + "required": [ + "gateway", + "system", + "secretRef" + ], + "type": "object" + }, + "io.k8s.api.core.v1.ScaleIOVolumeSource": { + "description": "ScaleIOVolumeSource represents a persistent ScaleIO volume", + "properties": { + "fsType": { + "description": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Default is \"xfs\".", + "type": "string" + }, + "gateway": { + "description": "The host address of the ScaleIO API Gateway.", + "type": "string" + }, + "protectionDomain": { + "description": "The name of the ScaleIO Protection Domain for the configured storage.", + "type": "string" + }, + "readOnly": { + "description": "Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.", + "type": "boolean" + }, + "secretRef": { + "$ref": "#/definitions/io.k8s.api.core.v1.LocalObjectReference", + "description": "SecretRef references to the secret for ScaleIO user and other sensitive information. If this is not provided, Login operation will fail." + }, + "sslEnabled": { + "description": "Flag to enable/disable SSL communication with Gateway, default false", + "type": "boolean" + }, + "storageMode": { + "description": "Indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned. Default is ThinProvisioned.", + "type": "string" + }, + "storagePool": { + "description": "The ScaleIO Storage Pool associated with the protection domain.", + "type": "string" + }, + "system": { + "description": "The name of the storage system as configured in ScaleIO.", + "type": "string" + }, + "volumeName": { + "description": "The name of a volume already created in the ScaleIO system that is associated with this volume source.", + "type": "string" + } + }, + "required": [ + "gateway", + "system", + "secretRef" + ], + "type": "object" + }, + "io.k8s.api.core.v1.ScopeSelector": { + "description": "A scope selector represents the AND of the selectors represented by the scoped-resource selector requirements.", + "properties": { + "matchExpressions": { + "description": "A list of scope selector requirements by scope of the resources.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.ScopedResourceSelectorRequirement" + }, + "type": "array" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.ScopedResourceSelectorRequirement": { + "description": "A scoped-resource selector requirement is a selector that contains values, a scope name, and an operator that relates the scope name and values.", + "properties": { + "operator": { + "description": "Represents a scope's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist.", + "type": "string" + }, + "scopeName": { + "description": "The name of the scope that the selector applies to.", + "type": "string" + }, + "values": { + "description": "An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "scopeName", + "operator" + ], + "type": "object" + }, + "io.k8s.api.core.v1.SeccompProfile": { + "description": "SeccompProfile defines a pod/container's seccomp profile settings. Only one profile source may be set.", + "properties": { + "localhostProfile": { + "description": "localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must only be set if type is \"Localhost\".", + "type": "string" + }, + "type": { + "description": "type indicates which kind of seccomp profile will be applied. Valid options are:\n\nLocalhost - a profile defined in a file on the node should be used. RuntimeDefault - the container runtime default profile should be used. Unconfined - no profile should be applied.", + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object", + "x-kubernetes-unions": [ + { + "discriminator": "type", + "fields-to-discriminateBy": { + "localhostProfile": "LocalhostProfile" + } + } + ] + }, + "io.k8s.api.core.v1.Secret": { + "description": "Secret holds secret data of a certain type. The total bytes of the values in the Data field must be less than MaxSecretSize bytes.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "data": { + "additionalProperties": { + "format": "byte", + "type": "string" + }, + "description": "Data contains the secret data. Each key must consist of alphanumeric characters, '-', '_' or '.'. The serialized form of the secret data is a base64 encoded string, representing the arbitrary (possibly non-string) data value here. Described in https://tools.ietf.org/html/rfc4648#section-4", + "type": "object" + }, + "immutable": { + "description": "Immutable, if set to true, ensures that data stored in the Secret cannot be updated (only object metadata can be modified). If not set to true, the field can be modified at any time. Defaulted to nil. This is a beta field enabled by ImmutableEphemeralVolumes feature gate.", + "type": "boolean" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "stringData": { + "additionalProperties": { + "type": "string" + }, + "description": "stringData allows specifying non-binary secret data in string form. It is provided as a write-only convenience method. All keys and values are merged into the data field on write, overwriting any existing values. It is never output when reading from the API.", + "type": "object" + }, + "type": { + "description": "Used to facilitate programmatic handling of secret data.", + "type": "string" + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "", + "kind": "Secret", + "version": "v1" + } + ] + }, + "io.k8s.api.core.v1.SecretEnvSource": { + "description": "SecretEnvSource selects a Secret to populate the environment variables with.\n\nThe contents of the target Secret's Data field will represent the key-value pairs as environment variables.", + "properties": { + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names", + "type": "string" + }, + "optional": { + "description": "Specify whether the Secret must be defined", + "type": "boolean" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.SecretKeySelector": { + "description": "SecretKeySelector selects a key of a Secret.", + "properties": { + "key": { + "description": "The key of the secret to select from. Must be a valid secret key.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names", + "type": "string" + }, + "optional": { + "description": "Specify whether the Secret or its key must be defined", + "type": "boolean" + } + }, + "required": [ + "key" + ], + "type": "object" + }, + "io.k8s.api.core.v1.SecretList": { + "description": "SecretList is a list of Secret.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "Items is a list of secret objects. More info: https://kubernetes.io/docs/concepts/configuration/secret", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.Secret" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "", + "kind": "SecretList", + "version": "v1" + } + ] + }, + "io.k8s.api.core.v1.SecretProjection": { + "description": "Adapts a secret into a projected volume.\n\nThe contents of the target Secret's Data field will be presented in a projected volume as files using the keys in the Data field as the file names. Note that this is identical to a secret volume source without the default mode.", + "properties": { + "items": { + "description": "If unspecified, each key-value pair in the Data field of the referenced Secret will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the Secret, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.KeyToPath" + }, + "type": "array" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names", + "type": "string" + }, + "optional": { + "description": "Specify whether the Secret or its key must be defined", + "type": "boolean" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.SecretReference": { + "description": "SecretReference represents a Secret Reference. It has enough information to retrieve secret in any namespace", + "properties": { + "name": { + "description": "Name is unique within a namespace to reference a secret resource.", + "type": "string" + }, + "namespace": { + "description": "Namespace defines the space within which the secret name must be unique.", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.SecretVolumeSource": { + "description": "Adapts a Secret into a volume.\n\nThe contents of the target Secret's Data field will be presented in a volume as files using the keys in the Data field as the file names. Secret volumes support ownership management and SELinux relabeling.", + "properties": { + "defaultMode": { + "description": "Optional: mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Defaults to 0644. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.", + "format": "int32", + "type": "integer" + }, + "items": { + "description": "If unspecified, each key-value pair in the Data field of the referenced Secret will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the Secret, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.KeyToPath" + }, + "type": "array" + }, + "optional": { + "description": "Specify whether the Secret or its keys must be defined", + "type": "boolean" + }, + "secretName": { + "description": "Name of the secret in the pod's namespace to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.SecurityContext": { + "description": "SecurityContext holds security configuration that will be applied to a container. Some fields are present in both SecurityContext and PodSecurityContext. When both are set, the values in SecurityContext take precedence.", + "properties": { + "allowPrivilegeEscalation": { + "description": "AllowPrivilegeEscalation controls whether a process can gain more privileges than its parent process. This bool directly controls if the no_new_privs flag will be set on the container process. AllowPrivilegeEscalation is true always when the container is: 1) run as Privileged 2) has CAP_SYS_ADMIN", + "type": "boolean" + }, + "capabilities": { + "$ref": "#/definitions/io.k8s.api.core.v1.Capabilities", + "description": "The capabilities to add/drop when running containers. Defaults to the default set of capabilities granted by the container runtime." + }, + "privileged": { + "description": "Run container in privileged mode. Processes in privileged containers are essentially equivalent to root on the host. Defaults to false.", + "type": "boolean" + }, + "procMount": { + "description": "procMount denotes the type of proc mount to use for the containers. The default is DefaultProcMount which uses the container runtime defaults for readonly paths and masked paths. This requires the ProcMountType feature flag to be enabled.", + "type": "string" + }, + "readOnlyRootFilesystem": { + "description": "Whether this container has a read-only root filesystem. Default is false.", + "type": "boolean" + }, + "runAsGroup": { + "description": "The GID to run the entrypoint of the container process. Uses runtime default if unset. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.", + "format": "int64", + "type": "integer" + }, + "runAsNonRoot": { + "description": "Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run as UID 0 (root) and fail to start the container if it does. If unset or false, no such validation will be performed. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.", + "type": "boolean" + }, + "runAsUser": { + "description": "The UID to run the entrypoint of the container process. Defaults to user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.", + "format": "int64", + "type": "integer" + }, + "seLinuxOptions": { + "$ref": "#/definitions/io.k8s.api.core.v1.SELinuxOptions", + "description": "The SELinux context to be applied to the container. If unspecified, the container runtime will allocate a random SELinux context for each container. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence." + }, + "seccompProfile": { + "$ref": "#/definitions/io.k8s.api.core.v1.SeccompProfile", + "description": "The seccomp options to use by this container. If seccomp options are provided at both the pod \u0026 container level, the container options override the pod options." + }, + "windowsOptions": { + "$ref": "#/definitions/io.k8s.api.core.v1.WindowsSecurityContextOptions", + "description": "The Windows specific settings applied to all containers. If unspecified, the options from the PodSecurityContext will be used. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence." + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.Service": { + "description": "Service is a named abstraction of software service (for example, mysql) consisting of local port (for example 3306) that the proxy listens on, and the selector that determines which pods will answer requests sent through the proxy.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.core.v1.ServiceSpec", + "description": "Spec defines the behavior of a service. https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" + }, + "status": { + "$ref": "#/definitions/io.k8s.api.core.v1.ServiceStatus", + "description": "Most recently observed status of the service. Populated by the system. Read-only. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "", + "kind": "Service", + "version": "v1" + } + ] + }, + "io.k8s.api.core.v1.ServiceAccount": { + "description": "ServiceAccount binds together: * a name, understood by users, and perhaps by peripheral systems, for an identity * a principal that can be authenticated and authorized * a set of secrets", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "automountServiceAccountToken": { + "description": "AutomountServiceAccountToken indicates whether pods running as this service account should have an API token automatically mounted. Can be overridden at the pod level.", + "type": "boolean" + }, + "imagePullSecrets": { + "description": "ImagePullSecrets is a list of references to secrets in the same namespace to use for pulling any images in pods that reference this ServiceAccount. ImagePullSecrets are distinct from Secrets because Secrets can be mounted in the pod, but ImagePullSecrets are only accessed by the kubelet. More info: https://kubernetes.io/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.LocalObjectReference" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "secrets": { + "description": "Secrets is the list of secrets allowed to be used by pods running using this ServiceAccount. More info: https://kubernetes.io/docs/concepts/configuration/secret", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.ObjectReference" + }, + "type": "array", + "x-kubernetes-patch-merge-key": "name", + "x-kubernetes-patch-strategy": "merge" + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "", + "kind": "ServiceAccount", + "version": "v1" + } + ] + }, + "io.k8s.api.core.v1.ServiceAccountList": { + "description": "ServiceAccountList is a list of ServiceAccount objects", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "List of ServiceAccounts. More info: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.ServiceAccount" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "", + "kind": "ServiceAccountList", + "version": "v1" + } + ] + }, + "io.k8s.api.core.v1.ServiceAccountTokenProjection": { + "description": "ServiceAccountTokenProjection represents a projected service account token volume. This projection can be used to insert a service account token into the pods runtime filesystem for use against APIs (Kubernetes API Server or otherwise).", + "properties": { + "audience": { + "description": "Audience is the intended audience of the token. A recipient of a token must identify itself with an identifier specified in the audience of the token, and otherwise should reject the token. The audience defaults to the identifier of the apiserver.", + "type": "string" + }, + "expirationSeconds": { + "description": "ExpirationSeconds is the requested duration of validity of the service account token. As the token approaches expiration, the kubelet volume plugin will proactively rotate the service account token. The kubelet will start trying to rotate the token if the token is older than 80 percent of its time to live or if the token is older than 24 hours.Defaults to 1 hour and must be at least 10 minutes.", + "format": "int64", + "type": "integer" + }, + "path": { + "description": "Path is the path relative to the mount point of the file to project the token into.", + "type": "string" + } + }, + "required": [ + "path" + ], + "type": "object" + }, + "io.k8s.api.core.v1.ServiceList": { + "description": "ServiceList holds a list of services.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "List of services", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.Service" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "", + "kind": "ServiceList", + "version": "v1" + } + ] + }, + "io.k8s.api.core.v1.ServicePort": { + "description": "ServicePort contains information on service's port.", + "properties": { + "appProtocol": { + "description": "The application protocol for this port. This field follows standard Kubernetes label syntax. Un-prefixed names are reserved for IANA standard service names (as per RFC-6335 and http://www.iana.org/assignments/service-names). Non-standard protocols should use prefixed names such as mycompany.com/my-custom-protocol. This is a beta field that is guarded by the ServiceAppProtocol feature gate and enabled by default.", + "type": "string" + }, + "name": { + "description": "The name of this port within the service. This must be a DNS_LABEL. All ports within a ServiceSpec must have unique names. When considering the endpoints for a Service, this must match the 'name' field in the EndpointPort. Optional if only one ServicePort is defined on this service.", + "type": "string" + }, + "nodePort": { + "description": "The port on each node on which this service is exposed when type is NodePort or LoadBalancer. Usually assigned by the system. If a value is specified, in-range, and not in use it will be used, otherwise the operation will fail. If not specified, a port will be allocated if this Service requires one. If this field is specified when creating a Service which does not need it, creation will fail. This field will be wiped when updating a Service to no longer need it (e.g. changing type from NodePort to ClusterIP). More info: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport", + "format": "int32", + "type": "integer" + }, + "port": { + "description": "The port that will be exposed by this service.", + "format": "int32", + "type": "integer" + }, + "protocol": { + "description": "The IP protocol for this port. Supports \"TCP\", \"UDP\", and \"SCTP\". Default is TCP.", + "type": "string" + }, + "targetPort": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.util.intstr.IntOrString", + "description": "Number or name of the port to access on the pods targeted by the service. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. If this is a string, it will be looked up as a named port in the target Pod's container ports. If this is not specified, the value of the 'port' field is used (an identity map). This field is ignored for services with clusterIP=None, and should be omitted or set equal to the 'port' field. More info: https://kubernetes.io/docs/concepts/services-networking/service/#defining-a-service" + } + }, + "required": [ + "port" + ], + "type": "object" + }, + "io.k8s.api.core.v1.ServiceSpec": { + "description": "ServiceSpec describes the attributes that a user creates on a service.", + "properties": { + "allocateLoadBalancerNodePorts": { + "description": "allocateLoadBalancerNodePorts defines if NodePorts will be automatically allocated for services with type LoadBalancer. Default is \"true\". It may be set to \"false\" if the cluster load-balancer does not rely on NodePorts. allocateLoadBalancerNodePorts may only be set for services with type LoadBalancer and will be cleared if the type is changed to any other type. This field is alpha-level and is only honored by servers that enable the ServiceLBNodePortControl feature.", + "type": "boolean" + }, + "clusterIP": { + "description": "clusterIP is the IP address of the service and is usually assigned randomly. If an address is specified manually, is in-range (as per system configuration), and is not in use, it will be allocated to the service; otherwise creation of the service will fail. This field may not be changed through updates unless the type field is also being changed to ExternalName (which requires this field to be blank) or the type field is being changed from ExternalName (in which case this field may optionally be specified, as describe above). Valid values are \"None\", empty string (\"\"), or a valid IP address. Setting this to \"None\" makes a \"headless service\" (no virtual IP), which is useful when direct endpoint connections are preferred and proxying is not required. Only applies to types ClusterIP, NodePort, and LoadBalancer. If this field is specified when creating a Service of type ExternalName, creation will fail. This field will be wiped when updating a Service to type ExternalName. More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies", + "type": "string" + }, + "clusterIPs": { + "description": "ClusterIPs is a list of IP addresses assigned to this service, and are usually assigned randomly. If an address is specified manually, is in-range (as per system configuration), and is not in use, it will be allocated to the service; otherwise creation of the service will fail. This field may not be changed through updates unless the type field is also being changed to ExternalName (which requires this field to be empty) or the type field is being changed from ExternalName (in which case this field may optionally be specified, as describe above). Valid values are \"None\", empty string (\"\"), or a valid IP address. Setting this to \"None\" makes a \"headless service\" (no virtual IP), which is useful when direct endpoint connections are preferred and proxying is not required. Only applies to types ClusterIP, NodePort, and LoadBalancer. If this field is specified when creating a Service of type ExternalName, creation will fail. This field will be wiped when updating a Service to type ExternalName. If this field is not specified, it will be initialized from the clusterIP field. If this field is specified, clients must ensure that clusterIPs[0] and clusterIP have the same value.\n\nUnless the \"IPv6DualStack\" feature gate is enabled, this field is limited to one value, which must be the same as the clusterIP field. If the feature gate is enabled, this field may hold a maximum of two entries (dual-stack IPs, in either order). These IPs must correspond to the values of the ipFamilies field. Both clusterIPs and ipFamilies are governed by the ipFamilyPolicy field. More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies", + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, + "externalIPs": { + "description": "externalIPs is a list of IP addresses for which nodes in the cluster will also accept traffic for this service. These IPs are not managed by Kubernetes. The user is responsible for ensuring that traffic arrives at a node with this IP. A common example is external load-balancers that are not part of the Kubernetes system.", + "items": { + "type": "string" + }, + "type": "array" + }, + "externalName": { + "description": "externalName is the external reference that discovery mechanisms will return as an alias for this service (e.g. a DNS CNAME record). No proxying will be involved. Must be a lowercase RFC-1123 hostname (https://tools.ietf.org/html/rfc1123) and requires Type to be", + "type": "string" + }, + "externalTrafficPolicy": { + "description": "externalTrafficPolicy denotes if this Service desires to route external traffic to node-local or cluster-wide endpoints. \"Local\" preserves the client source IP and avoids a second hop for LoadBalancer and Nodeport type services, but risks potentially imbalanced traffic spreading. \"Cluster\" obscures the client source IP and may cause a second hop to another node, but should have good overall load-spreading.", + "type": "string" + }, + "healthCheckNodePort": { + "description": "healthCheckNodePort specifies the healthcheck nodePort for the service. This only applies when type is set to LoadBalancer and externalTrafficPolicy is set to Local. If a value is specified, is in-range, and is not in use, it will be used. If not specified, a value will be automatically allocated. External systems (e.g. load-balancers) can use this port to determine if a given node holds endpoints for this service or not. If this field is specified when creating a Service which does not need it, creation will fail. This field will be wiped when updating a Service to no longer need it (e.g. changing type).", + "format": "int32", + "type": "integer" + }, + "ipFamilies": { + "description": "IPFamilies is a list of IP families (e.g. IPv4, IPv6) assigned to this service, and is gated by the \"IPv6DualStack\" feature gate. This field is usually assigned automatically based on cluster configuration and the ipFamilyPolicy field. If this field is specified manually, the requested family is available in the cluster, and ipFamilyPolicy allows it, it will be used; otherwise creation of the service will fail. This field is conditionally mutable: it allows for adding or removing a secondary IP family, but it does not allow changing the primary IP family of the Service. Valid values are \"IPv4\" and \"IPv6\". This field only applies to Services of types ClusterIP, NodePort, and LoadBalancer, and does apply to \"headless\" services. This field will be wiped when updating a Service to type ExternalName.\n\nThis field may hold a maximum of two entries (dual-stack families, in either order). These families must correspond to the values of the clusterIPs field, if specified. Both clusterIPs and ipFamilies are governed by the ipFamilyPolicy field.", + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, + "ipFamilyPolicy": { + "description": "IPFamilyPolicy represents the dual-stack-ness requested or required by this Service, and is gated by the \"IPv6DualStack\" feature gate. If there is no value provided, then this field will be set to SingleStack. Services can be \"SingleStack\" (a single IP family), \"PreferDualStack\" (two IP families on dual-stack configured clusters or a single IP family on single-stack clusters), or \"RequireDualStack\" (two IP families on dual-stack configured clusters, otherwise fail). The ipFamilies and clusterIPs fields depend on the value of this field. This field will be wiped when updating a service to type ExternalName.", + "type": "string" + }, + "loadBalancerIP": { + "description": "Only applies to Service Type: LoadBalancer LoadBalancer will get created with the IP specified in this field. This feature depends on whether the underlying cloud-provider supports specifying the loadBalancerIP when a load balancer is created. This field will be ignored if the cloud-provider does not support the feature.", + "type": "string" + }, + "loadBalancerSourceRanges": { + "description": "If specified and supported by the platform, this will restrict traffic through the cloud-provider load-balancer will be restricted to the specified client IPs. This field will be ignored if the cloud-provider does not support the feature.\" More info: https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/", + "items": { + "type": "string" + }, + "type": "array" + }, + "ports": { + "description": "The list of ports that are exposed by this service. More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.ServicePort" + }, + "type": "array", + "x-kubernetes-list-map-keys": [ + "port", + "protocol" + ], + "x-kubernetes-list-type": "map", + "x-kubernetes-patch-merge-key": "port", + "x-kubernetes-patch-strategy": "merge" + }, + "publishNotReadyAddresses": { + "description": "publishNotReadyAddresses indicates that any agent which deals with endpoints for this Service should disregard any indications of ready/not-ready. The primary use case for setting this field is for a StatefulSet's Headless Service to propagate SRV DNS records for its Pods for the purpose of peer discovery. The Kubernetes controllers that generate Endpoints and EndpointSlice resources for Services interpret this to mean that all endpoints are considered \"ready\" even if the Pods themselves are not. Agents which consume only Kubernetes generated endpoints through the Endpoints or EndpointSlice resources can safely assume this behavior.", + "type": "boolean" + }, + "selector": { + "additionalProperties": { + "type": "string" + }, + "description": "Route service traffic to pods with label keys and values matching this selector. If empty or not present, the service is assumed to have an external process managing its endpoints, which Kubernetes will not modify. Only applies to types ClusterIP, NodePort, and LoadBalancer. Ignored if type is ExternalName. More info: https://kubernetes.io/docs/concepts/services-networking/service/", + "type": "object" + }, + "sessionAffinity": { + "description": "Supports \"ClientIP\" and \"None\". Used to maintain session affinity. Enable client IP based session affinity. Must be ClientIP or None. Defaults to None. More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies", + "type": "string" + }, + "sessionAffinityConfig": { + "$ref": "#/definitions/io.k8s.api.core.v1.SessionAffinityConfig", + "description": "sessionAffinityConfig contains the configurations of session affinity." + }, + "topologyKeys": { + "description": "topologyKeys is a preference-order list of topology keys which implementations of services should use to preferentially sort endpoints when accessing this Service, it can not be used at the same time as externalTrafficPolicy=Local. Topology keys must be valid label keys and at most 16 keys may be specified. Endpoints are chosen based on the first topology key with available backends. If this field is specified and all entries have no backends that match the topology of the client, the service has no backends for that client and connections should fail. The special value \"*\" may be used to mean \"any topology\". This catch-all value, if used, only makes sense as the last value in the list. If this is not specified or empty, no topology constraints will be applied. This field is alpha-level and is only honored by servers that enable the ServiceTopology feature.", + "items": { + "type": "string" + }, + "type": "array" + }, + "type": { + "description": "type determines how the Service is exposed. Defaults to ClusterIP. Valid options are ExternalName, ClusterIP, NodePort, and LoadBalancer. \"ClusterIP\" allocates a cluster-internal IP address for load-balancing to endpoints. Endpoints are determined by the selector or if that is not specified, by manual construction of an Endpoints object or EndpointSlice objects. If clusterIP is \"None\", no virtual IP is allocated and the endpoints are published as a set of endpoints rather than a virtual IP. \"NodePort\" builds on ClusterIP and allocates a port on every node which routes to the same endpoints as the clusterIP. \"LoadBalancer\" builds on NodePort and creates an external load-balancer (if supported in the current cloud) which routes to the same endpoints as the clusterIP. \"ExternalName\" aliases this service to the specified externalName. Several other fields do not apply to ExternalName services. More info: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.ServiceStatus": { + "description": "ServiceStatus represents the current status of a service.", + "properties": { + "conditions": { + "description": "Current service state", + "items": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Condition" + }, + "type": "array", + "x-kubernetes-list-map-keys": [ + "type" + ], + "x-kubernetes-list-type": "map", + "x-kubernetes-patch-merge-key": "type", + "x-kubernetes-patch-strategy": "merge" + }, + "loadBalancer": { + "$ref": "#/definitions/io.k8s.api.core.v1.LoadBalancerStatus", + "description": "LoadBalancer contains the current status of the load-balancer, if one is present." + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.SessionAffinityConfig": { + "description": "SessionAffinityConfig represents the configurations of session affinity.", + "properties": { + "clientIP": { + "$ref": "#/definitions/io.k8s.api.core.v1.ClientIPConfig", + "description": "clientIP contains the configurations of Client IP based session affinity." + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.StorageOSPersistentVolumeSource": { + "description": "Represents a StorageOS persistent volume resource.", + "properties": { + "fsType": { + "description": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.", + "type": "string" + }, + "readOnly": { + "description": "Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.", + "type": "boolean" + }, + "secretRef": { + "$ref": "#/definitions/io.k8s.api.core.v1.ObjectReference", + "description": "SecretRef specifies the secret to use for obtaining the StorageOS API credentials. If not specified, default values will be attempted." + }, + "volumeName": { + "description": "VolumeName is the human-readable name of the StorageOS volume. Volume names are only unique within a namespace.", + "type": "string" + }, + "volumeNamespace": { + "description": "VolumeNamespace specifies the scope of the volume within StorageOS. If no namespace is specified then the Pod's namespace will be used. This allows the Kubernetes name scoping to be mirrored within StorageOS for tighter integration. Set VolumeName to any name to override the default behaviour. Set to \"default\" if you are not using namespaces within StorageOS. Namespaces that do not pre-exist within StorageOS will be created.", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.StorageOSVolumeSource": { + "description": "Represents a StorageOS persistent volume resource.", + "properties": { + "fsType": { + "description": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.", + "type": "string" + }, + "readOnly": { + "description": "Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.", + "type": "boolean" + }, + "secretRef": { + "$ref": "#/definitions/io.k8s.api.core.v1.LocalObjectReference", + "description": "SecretRef specifies the secret to use for obtaining the StorageOS API credentials. If not specified, default values will be attempted." + }, + "volumeName": { + "description": "VolumeName is the human-readable name of the StorageOS volume. Volume names are only unique within a namespace.", + "type": "string" + }, + "volumeNamespace": { + "description": "VolumeNamespace specifies the scope of the volume within StorageOS. If no namespace is specified then the Pod's namespace will be used. This allows the Kubernetes name scoping to be mirrored within StorageOS for tighter integration. Set VolumeName to any name to override the default behaviour. Set to \"default\" if you are not using namespaces within StorageOS. Namespaces that do not pre-exist within StorageOS will be created.", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.Sysctl": { + "description": "Sysctl defines a kernel parameter to be set", + "properties": { + "name": { + "description": "Name of a property to set", + "type": "string" + }, + "value": { + "description": "Value of a property to set", + "type": "string" + } + }, + "required": [ + "name", + "value" + ], + "type": "object" + }, + "io.k8s.api.core.v1.TCPSocketAction": { + "description": "TCPSocketAction describes an action based on opening a socket", + "properties": { + "host": { + "description": "Optional: Host name to connect to, defaults to the pod IP.", + "type": "string" + }, + "port": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.util.intstr.IntOrString", + "description": "Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME." + } + }, + "required": [ + "port" + ], + "type": "object" + }, + "io.k8s.api.core.v1.Taint": { + "description": "The node this Taint is attached to has the \"effect\" on any pod that does not tolerate the Taint.", + "properties": { + "effect": { + "description": "Required. The effect of the taint on pods that do not tolerate the taint. Valid effects are NoSchedule, PreferNoSchedule and NoExecute.", + "type": "string" + }, + "key": { + "description": "Required. The taint key to be applied to a node.", + "type": "string" + }, + "timeAdded": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "TimeAdded represents the time at which the taint was added. It is only written for NoExecute taints." + }, + "value": { + "description": "The taint value corresponding to the taint key.", + "type": "string" + } + }, + "required": [ + "key", + "effect" + ], + "type": "object" + }, + "io.k8s.api.core.v1.Toleration": { + "description": "The pod this Toleration is attached to tolerates any taint that matches the triple \u003ckey,value,effect\u003e using the matching operator \u003coperator\u003e.", + "properties": { + "effect": { + "description": "Effect indicates the taint effect to match. Empty means match all taint effects. When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.", + "type": "string" + }, + "key": { + "description": "Key is the taint key that the toleration applies to. Empty means match all taint keys. If the key is empty, operator must be Exists; this combination means to match all values and all keys.", + "type": "string" + }, + "operator": { + "description": "Operator represents a key's relationship to the value. Valid operators are Exists and Equal. Defaults to Equal. Exists is equivalent to wildcard for value, so that a pod can tolerate all taints of a particular category.", + "type": "string" + }, + "tolerationSeconds": { + "description": "TolerationSeconds represents the period of time the toleration (which must be of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, it is not set, which means tolerate the taint forever (do not evict). Zero and negative values will be treated as 0 (evict immediately) by the system.", + "format": "int64", + "type": "integer" + }, + "value": { + "description": "Value is the taint value the toleration matches to. If the operator is Exists, the value should be empty, otherwise just a regular string.", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.TopologySelectorLabelRequirement": { + "description": "A topology selector requirement is a selector that matches given label. This is an alpha feature and may change in the future.", + "properties": { + "key": { + "description": "The label key that the selector applies to.", + "type": "string" + }, + "values": { + "description": "An array of string values. One value must match the label to be selected. Each entry in Values is ORed.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "key", + "values" + ], + "type": "object" + }, + "io.k8s.api.core.v1.TopologySelectorTerm": { + "description": "A topology selector term represents the result of label queries. A null or empty topology selector term matches no objects. The requirements of them are ANDed. It provides a subset of functionality as NodeSelectorTerm. This is an alpha feature and may change in the future.", + "properties": { + "matchLabelExpressions": { + "description": "A list of topology selector requirements by labels.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.TopologySelectorLabelRequirement" + }, + "type": "array" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.TopologySpreadConstraint": { + "description": "TopologySpreadConstraint specifies how to spread matching pods among the given topology.", + "properties": { + "labelSelector": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector", + "description": "LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain." + }, + "maxSkew": { + "description": "MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 1/1/0: | zone1 | zone2 | zone3 | | P | P | | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 1/1/1; scheduling it onto zone1(zone2) would make the ActualSkew(2-0) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It's a required field. Default value is 1 and 0 is not allowed.", + "format": "int32", + "type": "integer" + }, + "topologyKey": { + "description": "TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each \u003ckey, value\u003e as a \"bucket\", and try to put balanced number of pods into each bucket. It's a required field.", + "type": "string" + }, + "whenUnsatisfiable": { + "description": "WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location,\n but giving higher precedence to topologies that would help reduce the\n skew.\nA constraint is considered \"Unsatisfiable\" for an incoming pod if and only if every possible node assigment for that pod would violate \"MaxSkew\" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P | P | P | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won't make it *more* imbalanced. It's a required field.", + "type": "string" + } + }, + "required": [ + "maxSkew", + "topologyKey", + "whenUnsatisfiable" + ], + "type": "object" + }, + "io.k8s.api.core.v1.TypedLocalObjectReference": { + "description": "TypedLocalObjectReference contains enough information to let you locate the typed referenced object inside the same namespace.", + "properties": { + "apiGroup": { + "description": "APIGroup is the group for the resource being referenced. If APIGroup is not specified, the specified Kind must be in the core API group. For any other third-party types, APIGroup is required.", + "type": "string" + }, + "kind": { + "description": "Kind is the type of resource being referenced", + "type": "string" + }, + "name": { + "description": "Name is the name of resource being referenced", + "type": "string" + } + }, + "required": [ + "kind", + "name" + ], + "type": "object" + }, + "io.k8s.api.core.v1.Volume": { + "description": "Volume represents a named volume in a pod that may be accessed by any container in the pod.", + "properties": { + "awsElasticBlockStore": { + "$ref": "#/definitions/io.k8s.api.core.v1.AWSElasticBlockStoreVolumeSource", + "description": "AWSElasticBlockStore represents an AWS Disk resource that is attached to a kubelet's host machine and then exposed to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore" + }, + "azureDisk": { + "$ref": "#/definitions/io.k8s.api.core.v1.AzureDiskVolumeSource", + "description": "AzureDisk represents an Azure Data Disk mount on the host and bind mount to the pod." + }, + "azureFile": { + "$ref": "#/definitions/io.k8s.api.core.v1.AzureFileVolumeSource", + "description": "AzureFile represents an Azure File Service mount on the host and bind mount to the pod." + }, + "cephfs": { + "$ref": "#/definitions/io.k8s.api.core.v1.CephFSVolumeSource", + "description": "CephFS represents a Ceph FS mount on the host that shares a pod's lifetime" + }, + "cinder": { + "$ref": "#/definitions/io.k8s.api.core.v1.CinderVolumeSource", + "description": "Cinder represents a cinder volume attached and mounted on kubelets host machine. More info: https://examples.k8s.io/mysql-cinder-pd/README.md" + }, + "configMap": { + "$ref": "#/definitions/io.k8s.api.core.v1.ConfigMapVolumeSource", + "description": "ConfigMap represents a configMap that should populate this volume" + }, + "csi": { + "$ref": "#/definitions/io.k8s.api.core.v1.CSIVolumeSource", + "description": "CSI (Container Storage Interface) represents ephemeral storage that is handled by certain external CSI drivers (Beta feature)." + }, + "downwardAPI": { + "$ref": "#/definitions/io.k8s.api.core.v1.DownwardAPIVolumeSource", + "description": "DownwardAPI represents downward API about the pod that should populate this volume" + }, + "emptyDir": { + "$ref": "#/definitions/io.k8s.api.core.v1.EmptyDirVolumeSource", + "description": "EmptyDir represents a temporary directory that shares a pod's lifetime. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir" + }, + "ephemeral": { + "$ref": "#/definitions/io.k8s.api.core.v1.EphemeralVolumeSource", + "description": "Ephemeral represents a volume that is handled by a cluster storage driver (Alpha feature). The volume's lifecycle is tied to the pod that defines it - it will be created before the pod starts, and deleted when the pod is removed.\n\nUse this if: a) the volume is only needed while the pod runs, b) features of normal volumes like restoring from snapshot or capacity\n tracking are needed,\nc) the storage driver is specified through a storage class, and d) the storage driver supports dynamic volume provisioning through\n a PersistentVolumeClaim (see EphemeralVolumeSource for more\n information on the connection between this volume type\n and PersistentVolumeClaim).\n\nUse PersistentVolumeClaim or one of the vendor-specific APIs for volumes that persist for longer than the lifecycle of an individual pod.\n\nUse CSI for light-weight local ephemeral volumes if the CSI driver is meant to be used that way - see the documentation of the driver for more information.\n\nA pod can use both types of ephemeral volumes and persistent volumes at the same time." + }, + "fc": { + "$ref": "#/definitions/io.k8s.api.core.v1.FCVolumeSource", + "description": "FC represents a Fibre Channel resource that is attached to a kubelet's host machine and then exposed to the pod." + }, + "flexVolume": { + "$ref": "#/definitions/io.k8s.api.core.v1.FlexVolumeSource", + "description": "FlexVolume represents a generic volume resource that is provisioned/attached using an exec based plugin." + }, + "flocker": { + "$ref": "#/definitions/io.k8s.api.core.v1.FlockerVolumeSource", + "description": "Flocker represents a Flocker volume attached to a kubelet's host machine. This depends on the Flocker control service being running" + }, + "gcePersistentDisk": { + "$ref": "#/definitions/io.k8s.api.core.v1.GCEPersistentDiskVolumeSource", + "description": "GCEPersistentDisk represents a GCE Disk resource that is attached to a kubelet's host machine and then exposed to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk" + }, + "gitRepo": { + "$ref": "#/definitions/io.k8s.api.core.v1.GitRepoVolumeSource", + "description": "GitRepo represents a git repository at a particular revision. DEPRECATED: GitRepo is deprecated. To provision a container with a git repo, mount an EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir into the Pod's container." + }, + "glusterfs": { + "$ref": "#/definitions/io.k8s.api.core.v1.GlusterfsVolumeSource", + "description": "Glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime. More info: https://examples.k8s.io/volumes/glusterfs/README.md" + }, + "hostPath": { + "$ref": "#/definitions/io.k8s.api.core.v1.HostPathVolumeSource", + "description": "HostPath represents a pre-existing file or directory on the host machine that is directly exposed to the container. This is generally used for system agents or other privileged things that are allowed to see the host machine. Most containers will NOT need this. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath" + }, + "iscsi": { + "$ref": "#/definitions/io.k8s.api.core.v1.ISCSIVolumeSource", + "description": "ISCSI represents an ISCSI Disk resource that is attached to a kubelet's host machine and then exposed to the pod. More info: https://examples.k8s.io/volumes/iscsi/README.md" + }, + "name": { + "description": "Volume's name. Must be a DNS_LABEL and unique within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names", + "type": "string" + }, + "nfs": { + "$ref": "#/definitions/io.k8s.api.core.v1.NFSVolumeSource", + "description": "NFS represents an NFS mount on the host that shares a pod's lifetime More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs" + }, + "persistentVolumeClaim": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolumeClaimVolumeSource", + "description": "PersistentVolumeClaimVolumeSource represents a reference to a PersistentVolumeClaim in the same namespace. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims" + }, + "photonPersistentDisk": { + "$ref": "#/definitions/io.k8s.api.core.v1.PhotonPersistentDiskVolumeSource", + "description": "PhotonPersistentDisk represents a PhotonController persistent disk attached and mounted on kubelets host machine" + }, + "portworxVolume": { + "$ref": "#/definitions/io.k8s.api.core.v1.PortworxVolumeSource", + "description": "PortworxVolume represents a portworx volume attached and mounted on kubelets host machine" + }, + "projected": { + "$ref": "#/definitions/io.k8s.api.core.v1.ProjectedVolumeSource", + "description": "Items for all in one resources secrets, configmaps, and downward API" + }, + "quobyte": { + "$ref": "#/definitions/io.k8s.api.core.v1.QuobyteVolumeSource", + "description": "Quobyte represents a Quobyte mount on the host that shares a pod's lifetime" + }, + "rbd": { + "$ref": "#/definitions/io.k8s.api.core.v1.RBDVolumeSource", + "description": "RBD represents a Rados Block Device mount on the host that shares a pod's lifetime. More info: https://examples.k8s.io/volumes/rbd/README.md" + }, + "scaleIO": { + "$ref": "#/definitions/io.k8s.api.core.v1.ScaleIOVolumeSource", + "description": "ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes." + }, + "secret": { + "$ref": "#/definitions/io.k8s.api.core.v1.SecretVolumeSource", + "description": "Secret represents a secret that should populate this volume. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret" + }, + "storageos": { + "$ref": "#/definitions/io.k8s.api.core.v1.StorageOSVolumeSource", + "description": "StorageOS represents a StorageOS volume attached and mounted on Kubernetes nodes." + }, + "vsphereVolume": { + "$ref": "#/definitions/io.k8s.api.core.v1.VsphereVirtualDiskVolumeSource", + "description": "VsphereVolume represents a vSphere volume attached and mounted on kubelets host machine" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "io.k8s.api.core.v1.VolumeDevice": { + "description": "volumeDevice describes a mapping of a raw block device within a container.", + "properties": { + "devicePath": { + "description": "devicePath is the path inside of the container that the device will be mapped to.", + "type": "string" + }, + "name": { + "description": "name must match the name of a persistentVolumeClaim in the pod", + "type": "string" + } + }, + "required": [ + "name", + "devicePath" + ], + "type": "object" + }, + "io.k8s.api.core.v1.VolumeMount": { + "description": "VolumeMount describes a mounting of a Volume within a container.", + "properties": { + "mountPath": { + "description": "Path within the container at which the volume should be mounted. Must not contain ':'.", + "type": "string" + }, + "mountPropagation": { + "description": "mountPropagation determines how mounts are propagated from the host to container and the other way around. When not set, MountPropagationNone is used. This field is beta in 1.10.", + "type": "string" + }, + "name": { + "description": "This must match the Name of a Volume.", + "type": "string" + }, + "readOnly": { + "description": "Mounted read-only if true, read-write otherwise (false or unspecified). Defaults to false.", + "type": "boolean" + }, + "subPath": { + "description": "Path within the volume from which the container's volume should be mounted. Defaults to \"\" (volume's root).", + "type": "string" + }, + "subPathExpr": { + "description": "Expanded path within the volume from which the container's volume should be mounted. Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment. Defaults to \"\" (volume's root). SubPathExpr and SubPath are mutually exclusive.", + "type": "string" + } + }, + "required": [ + "name", + "mountPath" + ], + "type": "object" + }, + "io.k8s.api.core.v1.VolumeNodeAffinity": { + "description": "VolumeNodeAffinity defines constraints that limit what nodes this volume can be accessed from.", + "properties": { + "required": { + "$ref": "#/definitions/io.k8s.api.core.v1.NodeSelector", + "description": "Required specifies hard node constraints that must be met." + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.VolumeProjection": { + "description": "Projection that may be projected along with other supported volume types", + "properties": { + "configMap": { + "$ref": "#/definitions/io.k8s.api.core.v1.ConfigMapProjection", + "description": "information about the configMap data to project" + }, + "downwardAPI": { + "$ref": "#/definitions/io.k8s.api.core.v1.DownwardAPIProjection", + "description": "information about the downwardAPI data to project" + }, + "secret": { + "$ref": "#/definitions/io.k8s.api.core.v1.SecretProjection", + "description": "information about the secret data to project" + }, + "serviceAccountToken": { + "$ref": "#/definitions/io.k8s.api.core.v1.ServiceAccountTokenProjection", + "description": "information about the serviceAccountToken data to project" + } + }, + "type": "object" + }, + "io.k8s.api.core.v1.VsphereVirtualDiskVolumeSource": { + "description": "Represents a vSphere volume resource.", + "properties": { + "fsType": { + "description": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.", + "type": "string" + }, + "storagePolicyID": { + "description": "Storage Policy Based Management (SPBM) profile ID associated with the StoragePolicyName.", + "type": "string" + }, + "storagePolicyName": { + "description": "Storage Policy Based Management (SPBM) profile name.", + "type": "string" + }, + "volumePath": { + "description": "Path that identifies vSphere volume vmdk", + "type": "string" + } + }, + "required": [ + "volumePath" + ], + "type": "object" + }, + "io.k8s.api.core.v1.WeightedPodAffinityTerm": { + "description": "The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s)", + "properties": { + "podAffinityTerm": { + "$ref": "#/definitions/io.k8s.api.core.v1.PodAffinityTerm", + "description": "Required. A pod affinity term, associated with the corresponding weight." + }, + "weight": { + "description": "weight associated with matching the corresponding podAffinityTerm, in the range 1-100.", + "format": "int32", + "type": "integer" + } + }, + "required": [ + "weight", + "podAffinityTerm" + ], + "type": "object" + }, + "io.k8s.api.core.v1.WindowsSecurityContextOptions": { + "description": "WindowsSecurityContextOptions contain Windows-specific options and credentials.", + "properties": { + "gmsaCredentialSpec": { + "description": "GMSACredentialSpec is where the GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the GMSA credential spec named by the GMSACredentialSpecName field.", + "type": "string" + }, + "gmsaCredentialSpecName": { + "description": "GMSACredentialSpecName is the name of the GMSA credential spec to use.", + "type": "string" + }, + "runAsUserName": { + "description": "The UserName in Windows to run the entrypoint of the container process. Defaults to the user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.discovery.v1beta1.Endpoint": { + "description": "Endpoint represents a single logical \"backend\" implementing a service.", + "properties": { + "addresses": { + "description": "addresses of this endpoint. The contents of this field are interpreted according to the corresponding EndpointSlice addressType field. Consumers must handle different types of addresses in the context of their own capabilities. This must contain at least one address but no more than 100.", + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "set" + }, + "conditions": { + "$ref": "#/definitions/io.k8s.api.discovery.v1beta1.EndpointConditions", + "description": "conditions contains information about the current status of the endpoint." + }, + "hostname": { + "description": "hostname of this endpoint. This field may be used by consumers of endpoints to distinguish endpoints from each other (e.g. in DNS names). Multiple endpoints which use the same hostname should be considered fungible (e.g. multiple A values in DNS). Must be lowercase and pass DNS Label (RFC 1123) validation.", + "type": "string" + }, + "nodeName": { + "description": "nodeName represents the name of the Node hosting this endpoint. This can be used to determine endpoints local to a Node. This field can be enabled with the EndpointSliceNodeName feature gate.", + "type": "string" + }, + "targetRef": { + "$ref": "#/definitions/io.k8s.api.core.v1.ObjectReference", + "description": "targetRef is a reference to a Kubernetes object that represents this endpoint." + }, + "topology": { + "additionalProperties": { + "type": "string" + }, + "description": "topology contains arbitrary topology information associated with the endpoint. These key/value pairs must conform with the label format. https://kubernetes.io/docs/concepts/overview/working-with-objects/labels Topology may include a maximum of 16 key/value pairs. This includes, but is not limited to the following well known keys: * kubernetes.io/hostname: the value indicates the hostname of the node\n where the endpoint is located. This should match the corresponding\n node label.\n* topology.kubernetes.io/zone: the value indicates the zone where the\n endpoint is located. This should match the corresponding node label.\n* topology.kubernetes.io/region: the value indicates the region where the\n endpoint is located. This should match the corresponding node label.\nThis field is deprecated and will be removed in future api versions.", + "type": "object" + } + }, + "required": [ + "addresses" + ], + "type": "object" + }, + "io.k8s.api.discovery.v1beta1.EndpointConditions": { + "description": "EndpointConditions represents the current condition of an endpoint.", + "properties": { + "ready": { + "description": "ready indicates that this endpoint is prepared to receive traffic, according to whatever system is managing the endpoint. A nil value indicates an unknown state. In most cases consumers should interpret this unknown state as ready. For compatibility reasons, ready should never be \"true\" for terminating endpoints.", + "type": "boolean" + }, + "serving": { + "description": "serving is identical to ready except that it is set regardless of the terminating state of endpoints. This condition should be set to true for a ready endpoint that is terminating. If nil, consumers should defer to the ready condition. This field can be enabled with the EndpointSliceTerminatingCondition feature gate.", + "type": "boolean" + }, + "terminating": { + "description": "terminating indicates that this endpoint is terminating. A nil value indicates an unknown state. Consumers should interpret this unknown state to mean that the endpoint is not terminating. This field can be enabled with the EndpointSliceTerminatingCondition feature gate.", + "type": "boolean" + } + }, + "type": "object" + }, + "io.k8s.api.discovery.v1beta1.EndpointPort": { + "description": "EndpointPort represents a Port used by an EndpointSlice", + "properties": { + "appProtocol": { + "description": "The application protocol for this port. This field follows standard Kubernetes label syntax. Un-prefixed names are reserved for IANA standard service names (as per RFC-6335 and http://www.iana.org/assignments/service-names). Non-standard protocols should use prefixed names such as mycompany.com/my-custom-protocol.", + "type": "string" + }, + "name": { + "description": "The name of this port. All ports in an EndpointSlice must have a unique name. If the EndpointSlice is dervied from a Kubernetes service, this corresponds to the Service.ports[].name. Name must either be an empty string or pass DNS_LABEL validation: * must be no more than 63 characters long. * must consist of lower case alphanumeric characters or '-'. * must start and end with an alphanumeric character. Default is empty string.", + "type": "string" + }, + "port": { + "description": "The port number of the endpoint. If this is not specified, ports are not restricted and must be interpreted in the context of the specific consumer.", + "format": "int32", + "type": "integer" + }, + "protocol": { + "description": "The IP protocol for this port. Must be UDP, TCP, or SCTP. Default is TCP.", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.discovery.v1beta1.EndpointSlice": { + "description": "EndpointSlice represents a subset of the endpoints that implement a service. For a given service there may be multiple EndpointSlice objects, selected by labels, which must be joined to produce the full set of endpoints.", + "properties": { + "addressType": { + "description": "addressType specifies the type of address carried by this EndpointSlice. All addresses in this slice must be the same type. This field is immutable after creation. The following address types are currently supported: * IPv4: Represents an IPv4 Address. * IPv6: Represents an IPv6 Address. * FQDN: Represents a Fully Qualified Domain Name.", + "type": "string" + }, + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "endpoints": { + "description": "endpoints is a list of unique endpoints in this slice. Each slice may include a maximum of 1000 endpoints.", + "items": { + "$ref": "#/definitions/io.k8s.api.discovery.v1beta1.Endpoint" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object's metadata." + }, + "ports": { + "description": "ports specifies the list of network ports exposed by each endpoint in this slice. Each port must have a unique name. When ports is empty, it indicates that there are no defined ports. When a port is defined with a nil port value, it indicates \"all ports\". Each slice may include a maximum of 100 ports.", + "items": { + "$ref": "#/definitions/io.k8s.api.discovery.v1beta1.EndpointPort" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + } + }, + "required": [ + "addressType", + "endpoints" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "discovery.k8s.io", + "kind": "EndpointSlice", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.discovery.v1beta1.EndpointSliceList": { + "description": "EndpointSliceList represents a list of endpoint slices", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "List of endpoint slices", + "items": { + "$ref": "#/definitions/io.k8s.api.discovery.v1beta1.EndpointSlice" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata." + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "discovery.k8s.io", + "kind": "EndpointSliceList", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.events.v1.Event": { + "description": "Event is a report of an event somewhere in the cluster. It generally denotes some state change in the system. Events have a limited retention time and triggers and messages may evolve with time. Event consumers should not rely on the timing of an event with a given Reason reflecting a consistent underlying trigger, or the continued existence of events with that Reason. Events should be treated as informative, best-effort, supplemental data.", + "properties": { + "action": { + "description": "action is what action was taken/failed regarding to the regarding object. It is machine-readable. This field cannot be empty for new Events and it can have at most 128 characters.", + "type": "string" + }, + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "deprecatedCount": { + "description": "deprecatedCount is the deprecated field assuring backward compatibility with core.v1 Event type.", + "format": "int32", + "type": "integer" + }, + "deprecatedFirstTimestamp": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "deprecatedFirstTimestamp is the deprecated field assuring backward compatibility with core.v1 Event type." + }, + "deprecatedLastTimestamp": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "deprecatedLastTimestamp is the deprecated field assuring backward compatibility with core.v1 Event type." + }, + "deprecatedSource": { + "$ref": "#/definitions/io.k8s.api.core.v1.EventSource", + "description": "deprecatedSource is the deprecated field assuring backward compatibility with core.v1 Event type." + }, + "eventTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.MicroTime", + "description": "eventTime is the time when this Event was first observed. It is required." + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta" + }, + "note": { + "description": "note is a human-readable description of the status of this operation. Maximal length of the note is 1kB, but libraries should be prepared to handle values up to 64kB.", + "type": "string" + }, + "reason": { + "description": "reason is why the action was taken. It is human-readable. This field cannot be empty for new Events and it can have at most 128 characters.", + "type": "string" + }, + "regarding": { + "$ref": "#/definitions/io.k8s.api.core.v1.ObjectReference", + "description": "regarding contains the object this Event is about. In most cases it's an Object reporting controller implements, e.g. ReplicaSetController implements ReplicaSets and this event is emitted because it acts on some changes in a ReplicaSet object." + }, + "related": { + "$ref": "#/definitions/io.k8s.api.core.v1.ObjectReference", + "description": "related is the optional secondary object for more complex actions. E.g. when regarding object triggers a creation or deletion of related object." + }, + "reportingController": { + "description": "reportingController is the name of the controller that emitted this Event, e.g. `kubernetes.io/kubelet`. This field cannot be empty for new Events.", + "type": "string" + }, + "reportingInstance": { + "description": "reportingInstance is the ID of the controller instance, e.g. `kubelet-xyzf`. This field cannot be empty for new Events and it can have at most 128 characters.", + "type": "string" + }, + "series": { + "$ref": "#/definitions/io.k8s.api.events.v1.EventSeries", + "description": "series is data about the Event series this event represents or nil if it's a singleton Event." + }, + "type": { + "description": "type is the type of this event (Normal, Warning), new types could be added in the future. It is machine-readable. This field cannot be empty for new Events.", + "type": "string" + } + }, + "required": [ + "metadata", + "eventTime" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "events.k8s.io", + "kind": "Event", + "version": "v1" + } + ] + }, + "io.k8s.api.events.v1.EventList": { + "description": "EventList is a list of Event objects.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "items is a list of schema objects.", + "items": { + "$ref": "#/definitions/io.k8s.api.events.v1.Event" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "events.k8s.io", + "kind": "EventList", + "version": "v1" + } + ] + }, + "io.k8s.api.events.v1.EventSeries": { + "description": "EventSeries contain information on series of events, i.e. thing that was/is happening continuously for some time. How often to update the EventSeries is up to the event reporters. The default event reporter in \"k8s.io/client-go/tools/events/event_broadcaster.go\" shows how this struct is updated on heartbeats and can guide customized reporter implementations.", + "properties": { + "count": { + "description": "count is the number of occurrences in this series up to the last heartbeat time.", + "format": "int32", + "type": "integer" + }, + "lastObservedTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.MicroTime", + "description": "lastObservedTime is the time when last Event from the series was seen before last heartbeat." + } + }, + "required": [ + "count", + "lastObservedTime" + ], + "type": "object" + }, + "io.k8s.api.events.v1beta1.Event": { + "description": "Event is a report of an event somewhere in the cluster. It generally denotes some state change in the system. Events have a limited retention time and triggers and messages may evolve with time. Event consumers should not rely on the timing of an event with a given Reason reflecting a consistent underlying trigger, or the continued existence of events with that Reason. Events should be treated as informative, best-effort, supplemental data.", + "properties": { + "action": { + "description": "action is what action was taken/failed regarding to the regarding object. It is machine-readable. This field can have at most 128 characters.", + "type": "string" + }, + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "deprecatedCount": { + "description": "deprecatedCount is the deprecated field assuring backward compatibility with core.v1 Event type.", + "format": "int32", + "type": "integer" + }, + "deprecatedFirstTimestamp": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "deprecatedFirstTimestamp is the deprecated field assuring backward compatibility with core.v1 Event type." + }, + "deprecatedLastTimestamp": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "deprecatedLastTimestamp is the deprecated field assuring backward compatibility with core.v1 Event type." + }, + "deprecatedSource": { + "$ref": "#/definitions/io.k8s.api.core.v1.EventSource", + "description": "deprecatedSource is the deprecated field assuring backward compatibility with core.v1 Event type." + }, + "eventTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.MicroTime", + "description": "eventTime is the time when this Event was first observed. It is required." + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta" + }, + "note": { + "description": "note is a human-readable description of the status of this operation. Maximal length of the note is 1kB, but libraries should be prepared to handle values up to 64kB.", + "type": "string" + }, + "reason": { + "description": "reason is why the action was taken. It is human-readable. This field can have at most 128 characters.", + "type": "string" + }, + "regarding": { + "$ref": "#/definitions/io.k8s.api.core.v1.ObjectReference", + "description": "regarding contains the object this Event is about. In most cases it's an Object reporting controller implements, e.g. ReplicaSetController implements ReplicaSets and this event is emitted because it acts on some changes in a ReplicaSet object." + }, + "related": { + "$ref": "#/definitions/io.k8s.api.core.v1.ObjectReference", + "description": "related is the optional secondary object for more complex actions. E.g. when regarding object triggers a creation or deletion of related object." + }, + "reportingController": { + "description": "reportingController is the name of the controller that emitted this Event, e.g. `kubernetes.io/kubelet`. This field cannot be empty for new Events.", + "type": "string" + }, + "reportingInstance": { + "description": "reportingInstance is the ID of the controller instance, e.g. `kubelet-xyzf`. This field cannot be empty for new Events and it can have at most 128 characters.", + "type": "string" + }, + "series": { + "$ref": "#/definitions/io.k8s.api.events.v1beta1.EventSeries", + "description": "series is data about the Event series this event represents or nil if it's a singleton Event." + }, + "type": { + "description": "type is the type of this event (Normal, Warning), new types could be added in the future. It is machine-readable.", + "type": "string" + } + }, + "required": [ + "metadata", + "eventTime" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "events.k8s.io", + "kind": "Event", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.events.v1beta1.EventList": { + "description": "EventList is a list of Event objects.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "items is a list of schema objects.", + "items": { + "$ref": "#/definitions/io.k8s.api.events.v1beta1.Event" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "events.k8s.io", + "kind": "EventList", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.events.v1beta1.EventSeries": { + "description": "EventSeries contain information on series of events, i.e. thing that was/is happening continuously for some time.", + "properties": { + "count": { + "description": "count is the number of occurrences in this series up to the last heartbeat time.", + "format": "int32", + "type": "integer" + }, + "lastObservedTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.MicroTime", + "description": "lastObservedTime is the time when last Event from the series was seen before last heartbeat." + } + }, + "required": [ + "count", + "lastObservedTime" + ], + "type": "object" + }, + "io.k8s.api.extensions.v1beta1.HTTPIngressPath": { + "description": "HTTPIngressPath associates a path with a backend. Incoming urls matching the path are forwarded to the backend.", + "properties": { + "backend": { + "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.IngressBackend", + "description": "Backend defines the referenced service endpoint to which the traffic will be forwarded to." + }, + "path": { + "description": "Path is matched against the path of an incoming request. Currently it can contain characters disallowed from the conventional \"path\" part of a URL as defined by RFC 3986. Paths must begin with a '/'. When unspecified, all paths from incoming requests are matched.", + "type": "string" + }, + "pathType": { + "description": "PathType determines the interpretation of the Path matching. PathType can be one of the following values: * Exact: Matches the URL path exactly. * Prefix: Matches based on a URL path prefix split by '/'. Matching is\n done on a path element by element basis. A path element refers is the\n list of labels in the path split by the '/' separator. A request is a\n match for path p if every p is an element-wise prefix of p of the\n request path. Note that if the last element of the path is a substring\n of the last element in request path, it is not a match (e.g. /foo/bar\n matches /foo/bar/baz, but does not match /foo/barbaz).\n* ImplementationSpecific: Interpretation of the Path matching is up to\n the IngressClass. Implementations can treat this as a separate PathType\n or treat it identically to Prefix or Exact path types.\nImplementations are required to support all path types. Defaults to ImplementationSpecific.", + "type": "string" + } + }, + "required": [ + "backend" + ], + "type": "object" + }, + "io.k8s.api.extensions.v1beta1.HTTPIngressRuleValue": { + "description": "HTTPIngressRuleValue is a list of http selectors pointing to backends. In the example: http://\u003chost\u003e/\u003cpath\u003e?\u003csearchpart\u003e -\u003e backend where where parts of the url correspond to RFC 3986, this resource will be used to match against everything after the last '/' and before the first '?' or '#'.", + "properties": { + "paths": { + "description": "A collection of paths that map requests to backends.", + "items": { + "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.HTTPIngressPath" + }, + "type": "array" + } + }, + "required": [ + "paths" + ], + "type": "object" + }, + "io.k8s.api.extensions.v1beta1.Ingress": { + "description": "Ingress is a collection of rules that allow inbound connections to reach the endpoints defined by a backend. An Ingress can be configured to give services externally-reachable urls, load balance traffic, terminate SSL, offer name based virtual hosting etc. DEPRECATED - This group version of Ingress is deprecated by networking.k8s.io/v1beta1 Ingress. See the release notes for more information.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.IngressSpec", + "description": "Spec is the desired state of the Ingress. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" + }, + "status": { + "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.IngressStatus", + "description": "Status is the current state of the Ingress. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "extensions", + "kind": "Ingress", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.extensions.v1beta1.IngressBackend": { + "description": "IngressBackend describes all endpoints for a given service and port.", + "properties": { + "resource": { + "$ref": "#/definitions/io.k8s.api.core.v1.TypedLocalObjectReference", + "description": "Resource is an ObjectRef to another Kubernetes resource in the namespace of the Ingress object. If resource is specified, serviceName and servicePort must not be specified." + }, + "serviceName": { + "description": "Specifies the name of the referenced service.", + "type": "string" + }, + "servicePort": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.util.intstr.IntOrString", + "description": "Specifies the port of the referenced service." + } + }, + "type": "object" + }, + "io.k8s.api.extensions.v1beta1.IngressList": { + "description": "IngressList is a collection of Ingress.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "Items is the list of Ingress.", + "items": { + "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "extensions", + "kind": "IngressList", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.extensions.v1beta1.IngressRule": { + "description": "IngressRule represents the rules mapping the paths under a specified host to the related backend services. Incoming requests are first evaluated for a host match, then routed to the backend associated with the matching IngressRuleValue.", + "properties": { + "host": { + "description": "Host is the fully qualified domain name of a network host, as defined by RFC 3986. Note the following deviations from the \"host\" part of the URI as defined in RFC 3986: 1. IPs are not allowed. Currently an IngressRuleValue can only apply to\n the IP in the Spec of the parent Ingress.\n2. The `:` delimiter is not respected because ports are not allowed.\n\t Currently the port of an Ingress is implicitly :80 for http and\n\t :443 for https.\nBoth these may change in the future. Incoming requests are matched against the host before the IngressRuleValue. If the host is unspecified, the Ingress routes all traffic based on the specified IngressRuleValue.\n\nHost can be \"precise\" which is a domain name without the terminating dot of a network host (e.g. \"foo.bar.com\") or \"wildcard\", which is a domain name prefixed with a single wildcard label (e.g. \"*.foo.com\"). The wildcard character '*' must appear by itself as the first DNS label and matches only a single label. You cannot have a wildcard label by itself (e.g. Host == \"*\"). Requests will be matched against the Host field in the following way: 1. If Host is precise, the request matches this rule if the http host header is equal to Host. 2. If Host is a wildcard, then the request matches this rule if the http host header is to equal to the suffix (removing the first label) of the wildcard rule.", + "type": "string" + }, + "http": { + "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.HTTPIngressRuleValue" + } + }, + "type": "object" + }, + "io.k8s.api.extensions.v1beta1.IngressSpec": { + "description": "IngressSpec describes the Ingress the user wishes to exist.", + "properties": { + "backend": { + "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.IngressBackend", + "description": "A default backend capable of servicing requests that don't match any rule. At least one of 'backend' or 'rules' must be specified. This field is optional to allow the loadbalancer controller or defaulting logic to specify a global default." + }, + "ingressClassName": { + "description": "IngressClassName is the name of the IngressClass cluster resource. The associated IngressClass defines which controller will implement the resource. This replaces the deprecated `kubernetes.io/ingress.class` annotation. For backwards compatibility, when that annotation is set, it must be given precedence over this field. The controller may emit a warning if the field and annotation have different values. Implementations of this API should ignore Ingresses without a class specified. An IngressClass resource may be marked as default, which can be used to set a default value for this field. For more information, refer to the IngressClass documentation.", + "type": "string" + }, + "rules": { + "description": "A list of host rules used to configure the Ingress. If unspecified, or no rule matches, all traffic is sent to the default backend.", + "items": { + "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.IngressRule" + }, + "type": "array" + }, + "tls": { + "description": "TLS configuration. Currently the Ingress only supports a single TLS port, 443. If multiple members of this list specify different hosts, they will be multiplexed on the same port according to the hostname specified through the SNI TLS extension, if the ingress controller fulfilling the ingress supports SNI.", + "items": { + "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.IngressTLS" + }, + "type": "array" + } + }, + "type": "object" + }, + "io.k8s.api.extensions.v1beta1.IngressStatus": { + "description": "IngressStatus describe the current state of the Ingress.", + "properties": { + "loadBalancer": { + "$ref": "#/definitions/io.k8s.api.core.v1.LoadBalancerStatus", + "description": "LoadBalancer contains the current status of the load-balancer." + } + }, + "type": "object" + }, + "io.k8s.api.extensions.v1beta1.IngressTLS": { + "description": "IngressTLS describes the transport layer security associated with an Ingress.", + "properties": { + "hosts": { + "description": "Hosts are a list of hosts included in the TLS certificate. The values in this list must match the name/s used in the tlsSecret. Defaults to the wildcard host setting for the loadbalancer controller fulfilling this Ingress, if left unspecified.", + "items": { + "type": "string" + }, + "type": "array" + }, + "secretName": { + "description": "SecretName is the name of the secret used to terminate SSL traffic on 443. Field is left optional to allow SSL routing based on SNI hostname alone. If the SNI host in a listener conflicts with the \"Host\" header field used by an IngressRule, the SNI host is used for termination and value of the Host header is used for routing.", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.flowcontrol.v1beta1.FlowDistinguisherMethod": { + "description": "FlowDistinguisherMethod specifies the method of a flow distinguisher.", + "properties": { + "type": { + "description": "`type` is the type of flow distinguisher method The supported types are \"ByUser\" and \"ByNamespace\". Required.", + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + "io.k8s.api.flowcontrol.v1beta1.FlowSchema": { + "description": "FlowSchema defines the schema of a group of flows. Note that a flow is made up of a set of inbound API requests with similar attributes and is identified by a pair of strings: the name of the FlowSchema and a \"flow distinguisher\".", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "`metadata` is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchemaSpec", + "description": "`spec` is the specification of the desired behavior of a FlowSchema. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" + }, + "status": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchemaStatus", + "description": "`status` is the current status of a FlowSchema. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "FlowSchema", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.flowcontrol.v1beta1.FlowSchemaCondition": { + "description": "FlowSchemaCondition describes conditions for a FlowSchema.", + "properties": { + "lastTransitionTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "`lastTransitionTime` is the last time the condition transitioned from one status to another." + }, + "message": { + "description": "`message` is a human-readable message indicating details about last transition.", + "type": "string" + }, + "reason": { + "description": "`reason` is a unique, one-word, CamelCase reason for the condition's last transition.", + "type": "string" + }, + "status": { + "description": "`status` is the status of the condition. Can be True, False, Unknown. Required.", + "type": "string" + }, + "type": { + "description": "`type` is the type of the condition. Required.", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.flowcontrol.v1beta1.FlowSchemaList": { + "description": "FlowSchemaList is a list of FlowSchema objects.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "`items` is a list of FlowSchemas.", + "items": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchema" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "`metadata` is the standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "FlowSchemaList", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.flowcontrol.v1beta1.FlowSchemaSpec": { + "description": "FlowSchemaSpec describes how the FlowSchema's specification looks like.", + "properties": { + "distinguisherMethod": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowDistinguisherMethod", + "description": "`distinguisherMethod` defines how to compute the flow distinguisher for requests that match this schema. `nil` specifies that the distinguisher is disabled and thus will always be the empty string." + }, + "matchingPrecedence": { + "description": "`matchingPrecedence` is used to choose among the FlowSchemas that match a given request. The chosen FlowSchema is among those with the numerically lowest (which we take to be logically highest) MatchingPrecedence. Each MatchingPrecedence value must be ranged in [1,10000]. Note that if the precedence is not specified, it will be set to 1000 as default.", + "format": "int32", + "type": "integer" + }, + "priorityLevelConfiguration": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfigurationReference", + "description": "`priorityLevelConfiguration` should reference a PriorityLevelConfiguration in the cluster. If the reference cannot be resolved, the FlowSchema will be ignored and marked as invalid in its status. Required." + }, + "rules": { + "description": "`rules` describes which requests will match this flow schema. This FlowSchema matches a request if and only if at least one member of rules matches the request. if it is an empty slice, there will be no requests matching the FlowSchema.", + "items": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.PolicyRulesWithSubjects" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + } + }, + "required": [ + "priorityLevelConfiguration" + ], + "type": "object" + }, + "io.k8s.api.flowcontrol.v1beta1.FlowSchemaStatus": { + "description": "FlowSchemaStatus represents the current state of a FlowSchema.", + "properties": { + "conditions": { + "description": "`conditions` is a list of the current states of FlowSchema.", + "items": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchemaCondition" + }, + "type": "array", + "x-kubernetes-list-map-keys": [ + "type" + ], + "x-kubernetes-list-type": "map" + } + }, + "type": "object" + }, + "io.k8s.api.flowcontrol.v1beta1.GroupSubject": { + "description": "GroupSubject holds detailed information for group-kind subject.", + "properties": { + "name": { + "description": "name is the user group that matches, or \"*\" to match all user groups. See https://github.com/kubernetes/apiserver/blob/master/pkg/authentication/user/user.go for some well-known group names. Required.", + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "io.k8s.api.flowcontrol.v1beta1.LimitResponse": { + "description": "LimitResponse defines how to handle requests that can not be executed right now.", + "properties": { + "queuing": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.QueuingConfiguration", + "description": "`queuing` holds the configuration parameters for queuing. This field may be non-empty only if `type` is `\"Queue\"`." + }, + "type": { + "description": "`type` is \"Queue\" or \"Reject\". \"Queue\" means that requests that can not be executed upon arrival are held in a queue until they can be executed or a queuing limit is reached. \"Reject\" means that requests that can not be executed upon arrival are rejected. Required.", + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object", + "x-kubernetes-unions": [ + { + "discriminator": "type", + "fields-to-discriminateBy": { + "queuing": "Queuing" + } + } + ] + }, + "io.k8s.api.flowcontrol.v1beta1.LimitedPriorityLevelConfiguration": { + "description": "LimitedPriorityLevelConfiguration specifies how to handle requests that are subject to limits. It addresses two issues:\n * How are requests for this priority level limited?\n * What should be done with requests that exceed the limit?", + "properties": { + "assuredConcurrencyShares": { + "description": "`assuredConcurrencyShares` (ACS) configures the execution limit, which is a limit on the number of requests of this priority level that may be exeucting at a given time. ACS must be a positive number. The server's concurrency limit (SCL) is divided among the concurrency-controlled priority levels in proportion to their assured concurrency shares. This produces the assured concurrency value (ACV) --- the number of requests that may be executing at a time --- for each such priority level:\n\n ACV(l) = ceil( SCL * ACS(l) / ( sum[priority levels k] ACS(k) ) )\n\nbigger numbers of ACS mean more reserved concurrent requests (at the expense of every other PL). This field has a default value of 30.", + "format": "int32", + "type": "integer" + }, + "limitResponse": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.LimitResponse", + "description": "`limitResponse` indicates what to do with requests that can not be executed right now" + } + }, + "type": "object" + }, + "io.k8s.api.flowcontrol.v1beta1.NonResourcePolicyRule": { + "description": "NonResourcePolicyRule is a predicate that matches non-resource requests according to their verb and the target non-resource URL. A NonResourcePolicyRule matches a request if and only if both (a) at least one member of verbs matches the request and (b) at least one member of nonResourceURLs matches the request.", + "properties": { + "nonResourceURLs": { + "description": "`nonResourceURLs` is a set of url prefixes that a user should have access to and may not be empty. For example:\n - \"/healthz\" is legal\n - \"/hea*\" is illegal\n - \"/hea\" is legal but matches nothing\n - \"/hea/*\" also matches nothing\n - \"/healthz/*\" matches all per-component health checks.\n\"*\" matches all non-resource urls. if it is present, it must be the only entry. Required.", + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "set" + }, + "verbs": { + "description": "`verbs` is a list of matching verbs and may not be empty. \"*\" matches all verbs. If it is present, it must be the only entry. Required.", + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "set" + } + }, + "required": [ + "verbs", + "nonResourceURLs" + ], + "type": "object" + }, + "io.k8s.api.flowcontrol.v1beta1.PolicyRulesWithSubjects": { + "description": "PolicyRulesWithSubjects prescribes a test that applies to a request to an apiserver. The test considers the subject making the request, the verb being requested, and the resource to be acted upon. This PolicyRulesWithSubjects matches a request if and only if both (a) at least one member of subjects matches the request and (b) at least one member of resourceRules or nonResourceRules matches the request.", + "properties": { + "nonResourceRules": { + "description": "`nonResourceRules` is a list of NonResourcePolicyRules that identify matching requests according to their verb and the target non-resource URL.", + "items": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.NonResourcePolicyRule" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, + "resourceRules": { + "description": "`resourceRules` is a slice of ResourcePolicyRules that identify matching requests according to their verb and the target resource. At least one of `resourceRules` and `nonResourceRules` has to be non-empty.", + "items": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.ResourcePolicyRule" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, + "subjects": { + "description": "subjects is the list of normal user, serviceaccount, or group that this rule cares about. There must be at least one member in this slice. A slice that includes both the system:authenticated and system:unauthenticated user groups matches every request. Required.", + "items": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.Subject" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + } + }, + "required": [ + "subjects" + ], + "type": "object" + }, + "io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfiguration": { + "description": "PriorityLevelConfiguration represents the configuration of a priority level.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "`metadata` is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfigurationSpec", + "description": "`spec` is the specification of the desired behavior of a \"request-priority\". More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" + }, + "status": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfigurationStatus", + "description": "`status` is the current status of a \"request-priority\". More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "PriorityLevelConfiguration", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfigurationCondition": { + "description": "PriorityLevelConfigurationCondition defines the condition of priority level.", + "properties": { + "lastTransitionTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "`lastTransitionTime` is the last time the condition transitioned from one status to another." + }, + "message": { + "description": "`message` is a human-readable message indicating details about last transition.", + "type": "string" + }, + "reason": { + "description": "`reason` is a unique, one-word, CamelCase reason for the condition's last transition.", + "type": "string" + }, + "status": { + "description": "`status` is the status of the condition. Can be True, False, Unknown. Required.", + "type": "string" + }, + "type": { + "description": "`type` is the type of the condition. Required.", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfigurationList": { + "description": "PriorityLevelConfigurationList is a list of PriorityLevelConfiguration objects.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "`items` is a list of request-priorities.", + "items": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfiguration" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "`metadata` is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "PriorityLevelConfigurationList", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfigurationReference": { + "description": "PriorityLevelConfigurationReference contains information that points to the \"request-priority\" being used.", + "properties": { + "name": { + "description": "`name` is the name of the priority level configuration being referenced Required.", + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfigurationSpec": { + "description": "PriorityLevelConfigurationSpec specifies the configuration of a priority level.", + "properties": { + "limited": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.LimitedPriorityLevelConfiguration", + "description": "`limited` specifies how requests are handled for a Limited priority level. This field must be non-empty if and only if `type` is `\"Limited\"`." + }, + "type": { + "description": "`type` indicates whether this priority level is subject to limitation on request execution. A value of `\"Exempt\"` means that requests of this priority level are not subject to a limit (and thus are never queued) and do not detract from the capacity made available to other priority levels. A value of `\"Limited\"` means that (a) requests of this priority level _are_ subject to limits and (b) some of the server's limited capacity is made available exclusively to this priority level. Required.", + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object", + "x-kubernetes-unions": [ + { + "discriminator": "type", + "fields-to-discriminateBy": { + "limited": "Limited" + } + } + ] + }, + "io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfigurationStatus": { + "description": "PriorityLevelConfigurationStatus represents the current state of a \"request-priority\".", + "properties": { + "conditions": { + "description": "`conditions` is the current state of \"request-priority\".", + "items": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfigurationCondition" + }, + "type": "array", + "x-kubernetes-list-map-keys": [ + "type" + ], + "x-kubernetes-list-type": "map" + } + }, + "type": "object" + }, + "io.k8s.api.flowcontrol.v1beta1.QueuingConfiguration": { + "description": "QueuingConfiguration holds the configuration parameters for queuing", + "properties": { + "handSize": { + "description": "`handSize` is a small positive number that configures the shuffle sharding of requests into queues. When enqueuing a request at this priority level the request's flow identifier (a string pair) is hashed and the hash value is used to shuffle the list of queues and deal a hand of the size specified here. The request is put into one of the shortest queues in that hand. `handSize` must be no larger than `queues`, and should be significantly smaller (so that a few heavy flows do not saturate most of the queues). See the user-facing documentation for more extensive guidance on setting this field. This field has a default value of 8.", + "format": "int32", + "type": "integer" + }, + "queueLengthLimit": { + "description": "`queueLengthLimit` is the maximum number of requests allowed to be waiting in a given queue of this priority level at a time; excess requests are rejected. This value must be positive. If not specified, it will be defaulted to 50.", + "format": "int32", + "type": "integer" + }, + "queues": { + "description": "`queues` is the number of queues for this priority level. The queues exist independently at each apiserver. The value must be positive. Setting it to 1 effectively precludes shufflesharding and thus makes the distinguisher method of associated flow schemas irrelevant. This field has a default value of 64.", + "format": "int32", + "type": "integer" + } + }, + "type": "object" + }, + "io.k8s.api.flowcontrol.v1beta1.ResourcePolicyRule": { + "description": "ResourcePolicyRule is a predicate that matches some resource requests, testing the request's verb and the target resource. A ResourcePolicyRule matches a resource request if and only if: (a) at least one member of verbs matches the request, (b) at least one member of apiGroups matches the request, (c) at least one member of resources matches the request, and (d) least one member of namespaces matches the request.", + "properties": { + "apiGroups": { + "description": "`apiGroups` is a list of matching API groups and may not be empty. \"*\" matches all API groups and, if present, must be the only entry. Required.", + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "set" + }, + "clusterScope": { + "description": "`clusterScope` indicates whether to match requests that do not specify a namespace (which happens either because the resource is not namespaced or the request targets all namespaces). If this field is omitted or false then the `namespaces` field must contain a non-empty list.", + "type": "boolean" + }, + "namespaces": { + "description": "`namespaces` is a list of target namespaces that restricts matches. A request that specifies a target namespace matches only if either (a) this list contains that target namespace or (b) this list contains \"*\". Note that \"*\" matches any specified namespace but does not match a request that _does not specify_ a namespace (see the `clusterScope` field for that). This list may be empty, but only if `clusterScope` is true.", + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "set" + }, + "resources": { + "description": "`resources` is a list of matching resources (i.e., lowercase and plural) with, if desired, subresource. For example, [ \"services\", \"nodes/status\" ]. This list may not be empty. \"*\" matches all resources and, if present, must be the only entry. Required.", + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "set" + }, + "verbs": { + "description": "`verbs` is a list of matching verbs and may not be empty. \"*\" matches all verbs and, if present, must be the only entry. Required.", + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "set" + } + }, + "required": [ + "verbs", + "apiGroups", + "resources" + ], + "type": "object" + }, + "io.k8s.api.flowcontrol.v1beta1.ServiceAccountSubject": { + "description": "ServiceAccountSubject holds detailed information for service-account-kind subject.", + "properties": { + "name": { + "description": "`name` is the name of matching ServiceAccount objects, or \"*\" to match regardless of name. Required.", + "type": "string" + }, + "namespace": { + "description": "`namespace` is the namespace of matching ServiceAccount objects. Required.", + "type": "string" + } + }, + "required": [ + "namespace", + "name" + ], + "type": "object" + }, + "io.k8s.api.flowcontrol.v1beta1.Subject": { + "description": "Subject matches the originator of a request, as identified by the request authentication system. There are three ways of matching an originator; by user, group, or service account.", + "properties": { + "group": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.GroupSubject" + }, + "kind": { + "description": "Required", + "type": "string" + }, + "serviceAccount": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.ServiceAccountSubject" + }, + "user": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.UserSubject" + } + }, + "required": [ + "kind" + ], + "type": "object", + "x-kubernetes-unions": [ + { + "discriminator": "kind", + "fields-to-discriminateBy": { + "group": "Group", + "serviceAccount": "ServiceAccount", + "user": "User" + } + } + ] + }, + "io.k8s.api.flowcontrol.v1beta1.UserSubject": { + "description": "UserSubject holds detailed information for user-kind subject.", + "properties": { + "name": { + "description": "`name` is the username that matches, or \"*\" to match all usernames. Required.", + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "io.k8s.api.networking.v1.HTTPIngressPath": { + "description": "HTTPIngressPath associates a path with a backend. Incoming urls matching the path are forwarded to the backend.", + "properties": { + "backend": { + "$ref": "#/definitions/io.k8s.api.networking.v1.IngressBackend", + "description": "Backend defines the referenced service endpoint to which the traffic will be forwarded to." + }, + "path": { + "description": "Path is matched against the path of an incoming request. Currently it can contain characters disallowed from the conventional \"path\" part of a URL as defined by RFC 3986. Paths must begin with a '/'. When unspecified, all paths from incoming requests are matched.", + "type": "string" + }, + "pathType": { + "description": "PathType determines the interpretation of the Path matching. PathType can be one of the following values: * Exact: Matches the URL path exactly. * Prefix: Matches based on a URL path prefix split by '/'. Matching is\n done on a path element by element basis. A path element refers is the\n list of labels in the path split by the '/' separator. A request is a\n match for path p if every p is an element-wise prefix of p of the\n request path. Note that if the last element of the path is a substring\n of the last element in request path, it is not a match (e.g. /foo/bar\n matches /foo/bar/baz, but does not match /foo/barbaz).\n* ImplementationSpecific: Interpretation of the Path matching is up to\n the IngressClass. Implementations can treat this as a separate PathType\n or treat it identically to Prefix or Exact path types.\nImplementations are required to support all path types.", + "type": "string" + } + }, + "required": [ + "backend" + ], + "type": "object" + }, + "io.k8s.api.networking.v1.HTTPIngressRuleValue": { + "description": "HTTPIngressRuleValue is a list of http selectors pointing to backends. In the example: http://\u003chost\u003e/\u003cpath\u003e?\u003csearchpart\u003e -\u003e backend where where parts of the url correspond to RFC 3986, this resource will be used to match against everything after the last '/' and before the first '?' or '#'.", + "properties": { + "paths": { + "description": "A collection of paths that map requests to backends.", + "items": { + "$ref": "#/definitions/io.k8s.api.networking.v1.HTTPIngressPath" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + } + }, + "required": [ + "paths" + ], + "type": "object" + }, + "io.k8s.api.networking.v1.IPBlock": { + "description": "IPBlock describes a particular CIDR (Ex. \"192.168.1.1/24\",\"2001:db9::/64\") that is allowed to the pods matched by a NetworkPolicySpec's podSelector. The except entry describes CIDRs that should not be included within this rule.", + "properties": { + "cidr": { + "description": "CIDR is a string representing the IP Block Valid examples are \"192.168.1.1/24\" or \"2001:db9::/64\"", + "type": "string" + }, + "except": { + "description": "Except is a slice of CIDRs that should not be included within an IP Block Valid examples are \"192.168.1.1/24\" or \"2001:db9::/64\" Except values will be rejected if they are outside the CIDR range", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "cidr" + ], + "type": "object" + }, + "io.k8s.api.networking.v1.Ingress": { + "description": "Ingress is a collection of rules that allow inbound connections to reach the endpoints defined by a backend. An Ingress can be configured to give services externally-reachable urls, load balance traffic, terminate SSL, offer name based virtual hosting etc.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.networking.v1.IngressSpec", + "description": "Spec is the desired state of the Ingress. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" + }, + "status": { + "$ref": "#/definitions/io.k8s.api.networking.v1.IngressStatus", + "description": "Status is the current state of the Ingress. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "networking.k8s.io", + "kind": "Ingress", + "version": "v1" + } + ] + }, + "io.k8s.api.networking.v1.IngressBackend": { + "description": "IngressBackend describes all endpoints for a given service and port.", + "properties": { + "resource": { + "$ref": "#/definitions/io.k8s.api.core.v1.TypedLocalObjectReference", + "description": "Resource is an ObjectRef to another Kubernetes resource in the namespace of the Ingress object. If resource is specified, a service.Name and service.Port must not be specified. This is a mutually exclusive setting with \"Service\"." + }, + "service": { + "$ref": "#/definitions/io.k8s.api.networking.v1.IngressServiceBackend", + "description": "Service references a Service as a Backend. This is a mutually exclusive setting with \"Resource\"." + } + }, + "type": "object" + }, + "io.k8s.api.networking.v1.IngressClass": { + "description": "IngressClass represents the class of the Ingress, referenced by the Ingress Spec. The `ingressclass.kubernetes.io/is-default-class` annotation can be used to indicate that an IngressClass should be considered default. When a single IngressClass resource has this annotation set to true, new Ingress resources without a class specified will be assigned this default class.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.networking.v1.IngressClassSpec", + "description": "Spec is the desired state of the IngressClass. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "networking.k8s.io", + "kind": "IngressClass", + "version": "v1" + } + ] + }, + "io.k8s.api.networking.v1.IngressClassList": { + "description": "IngressClassList is a collection of IngressClasses.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "Items is the list of IngressClasses.", + "items": { + "$ref": "#/definitions/io.k8s.api.networking.v1.IngressClass" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata." + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "networking.k8s.io", + "kind": "IngressClassList", + "version": "v1" + } + ] + }, + "io.k8s.api.networking.v1.IngressClassSpec": { + "description": "IngressClassSpec provides information about the class of an Ingress.", + "properties": { + "controller": { + "description": "Controller refers to the name of the controller that should handle this class. This allows for different \"flavors\" that are controlled by the same controller. For example, you may have different Parameters for the same implementing controller. This should be specified as a domain-prefixed path no more than 250 characters in length, e.g. \"acme.io/ingress-controller\". This field is immutable.", + "type": "string" + }, + "parameters": { + "$ref": "#/definitions/io.k8s.api.core.v1.TypedLocalObjectReference", + "description": "Parameters is a link to a custom resource containing additional configuration for the controller. This is optional if the controller does not require extra parameters." + } + }, + "type": "object" + }, + "io.k8s.api.networking.v1.IngressList": { + "description": "IngressList is a collection of Ingress.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "Items is the list of Ingress.", + "items": { + "$ref": "#/definitions/io.k8s.api.networking.v1.Ingress" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "networking.k8s.io", + "kind": "IngressList", + "version": "v1" + } + ] + }, + "io.k8s.api.networking.v1.IngressRule": { + "description": "IngressRule represents the rules mapping the paths under a specified host to the related backend services. Incoming requests are first evaluated for a host match, then routed to the backend associated with the matching IngressRuleValue.", + "properties": { + "host": { + "description": "Host is the fully qualified domain name of a network host, as defined by RFC 3986. Note the following deviations from the \"host\" part of the URI as defined in RFC 3986: 1. IPs are not allowed. Currently an IngressRuleValue can only apply to\n the IP in the Spec of the parent Ingress.\n2. The `:` delimiter is not respected because ports are not allowed.\n\t Currently the port of an Ingress is implicitly :80 for http and\n\t :443 for https.\nBoth these may change in the future. Incoming requests are matched against the host before the IngressRuleValue. If the host is unspecified, the Ingress routes all traffic based on the specified IngressRuleValue.\n\nHost can be \"precise\" which is a domain name without the terminating dot of a network host (e.g. \"foo.bar.com\") or \"wildcard\", which is a domain name prefixed with a single wildcard label (e.g. \"*.foo.com\"). The wildcard character '*' must appear by itself as the first DNS label and matches only a single label. You cannot have a wildcard label by itself (e.g. Host == \"*\"). Requests will be matched against the Host field in the following way: 1. If Host is precise, the request matches this rule if the http host header is equal to Host. 2. If Host is a wildcard, then the request matches this rule if the http host header is to equal to the suffix (removing the first label) of the wildcard rule.", + "type": "string" + }, + "http": { + "$ref": "#/definitions/io.k8s.api.networking.v1.HTTPIngressRuleValue" + } + }, + "type": "object" + }, + "io.k8s.api.networking.v1.IngressServiceBackend": { + "description": "IngressServiceBackend references a Kubernetes Service as a Backend.", + "properties": { + "name": { + "description": "Name is the referenced service. The service must exist in the same namespace as the Ingress object.", + "type": "string" + }, + "port": { + "$ref": "#/definitions/io.k8s.api.networking.v1.ServiceBackendPort", + "description": "Port of the referenced service. A port name or port number is required for a IngressServiceBackend." + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "io.k8s.api.networking.v1.IngressSpec": { + "description": "IngressSpec describes the Ingress the user wishes to exist.", + "properties": { + "defaultBackend": { + "$ref": "#/definitions/io.k8s.api.networking.v1.IngressBackend", + "description": "DefaultBackend is the backend that should handle requests that don't match any rule. If Rules are not specified, DefaultBackend must be specified. If DefaultBackend is not set, the handling of requests that do not match any of the rules will be up to the Ingress controller." + }, + "ingressClassName": { + "description": "IngressClassName is the name of the IngressClass cluster resource. The associated IngressClass defines which controller will implement the resource. This replaces the deprecated `kubernetes.io/ingress.class` annotation. For backwards compatibility, when that annotation is set, it must be given precedence over this field. The controller may emit a warning if the field and annotation have different values. Implementations of this API should ignore Ingresses without a class specified. An IngressClass resource may be marked as default, which can be used to set a default value for this field. For more information, refer to the IngressClass documentation.", + "type": "string" + }, + "rules": { + "description": "A list of host rules used to configure the Ingress. If unspecified, or no rule matches, all traffic is sent to the default backend.", + "items": { + "$ref": "#/definitions/io.k8s.api.networking.v1.IngressRule" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, + "tls": { + "description": "TLS configuration. Currently the Ingress only supports a single TLS port, 443. If multiple members of this list specify different hosts, they will be multiplexed on the same port according to the hostname specified through the SNI TLS extension, if the ingress controller fulfilling the ingress supports SNI.", + "items": { + "$ref": "#/definitions/io.k8s.api.networking.v1.IngressTLS" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + } + }, + "type": "object" + }, + "io.k8s.api.networking.v1.IngressStatus": { + "description": "IngressStatus describe the current state of the Ingress.", + "properties": { + "loadBalancer": { + "$ref": "#/definitions/io.k8s.api.core.v1.LoadBalancerStatus", + "description": "LoadBalancer contains the current status of the load-balancer." + } + }, + "type": "object" + }, + "io.k8s.api.networking.v1.IngressTLS": { + "description": "IngressTLS describes the transport layer security associated with an Ingress.", + "properties": { + "hosts": { + "description": "Hosts are a list of hosts included in the TLS certificate. The values in this list must match the name/s used in the tlsSecret. Defaults to the wildcard host setting for the loadbalancer controller fulfilling this Ingress, if left unspecified.", + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, + "secretName": { + "description": "SecretName is the name of the secret used to terminate TLS traffic on port 443. Field is left optional to allow TLS routing based on SNI hostname alone. If the SNI host in a listener conflicts with the \"Host\" header field used by an IngressRule, the SNI host is used for termination and value of the Host header is used for routing.", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.networking.v1.NetworkPolicy": { + "description": "NetworkPolicy describes what network traffic is allowed for a set of Pods", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.networking.v1.NetworkPolicySpec", + "description": "Specification of the desired behavior for this NetworkPolicy." + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "networking.k8s.io", + "kind": "NetworkPolicy", + "version": "v1" + } + ] + }, + "io.k8s.api.networking.v1.NetworkPolicyEgressRule": { + "description": "NetworkPolicyEgressRule describes a particular set of traffic that is allowed out of pods matched by a NetworkPolicySpec's podSelector. The traffic must match both ports and to. This type is beta-level in 1.8", + "properties": { + "ports": { + "description": "List of destination ports for outgoing traffic. Each item in this list is combined using a logical OR. If this field is empty or missing, this rule matches all ports (traffic not restricted by port). If this field is present and contains at least one item, then this rule allows traffic only if the traffic matches at least one port in the list.", + "items": { + "$ref": "#/definitions/io.k8s.api.networking.v1.NetworkPolicyPort" + }, + "type": "array" + }, + "to": { + "description": "List of destinations for outgoing traffic of pods selected for this rule. Items in this list are combined using a logical OR operation. If this field is empty or missing, this rule matches all destinations (traffic not restricted by destination). If this field is present and contains at least one item, this rule allows traffic only if the traffic matches at least one item in the to list.", + "items": { + "$ref": "#/definitions/io.k8s.api.networking.v1.NetworkPolicyPeer" + }, + "type": "array" + } + }, + "type": "object" + }, + "io.k8s.api.networking.v1.NetworkPolicyIngressRule": { + "description": "NetworkPolicyIngressRule describes a particular set of traffic that is allowed to the pods matched by a NetworkPolicySpec's podSelector. The traffic must match both ports and from.", + "properties": { + "from": { + "description": "List of sources which should be able to access the pods selected for this rule. Items in this list are combined using a logical OR operation. If this field is empty or missing, this rule matches all sources (traffic not restricted by source). If this field is present and contains at least one item, this rule allows traffic only if the traffic matches at least one item in the from list.", + "items": { + "$ref": "#/definitions/io.k8s.api.networking.v1.NetworkPolicyPeer" + }, + "type": "array" + }, + "ports": { + "description": "List of ports which should be made accessible on the pods selected for this rule. Each item in this list is combined using a logical OR. If this field is empty or missing, this rule matches all ports (traffic not restricted by port). If this field is present and contains at least one item, then this rule allows traffic only if the traffic matches at least one port in the list.", + "items": { + "$ref": "#/definitions/io.k8s.api.networking.v1.NetworkPolicyPort" + }, + "type": "array" + } + }, + "type": "object" + }, + "io.k8s.api.networking.v1.NetworkPolicyList": { + "description": "NetworkPolicyList is a list of NetworkPolicy objects.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "Items is a list of schema objects.", + "items": { + "$ref": "#/definitions/io.k8s.api.networking.v1.NetworkPolicy" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "networking.k8s.io", + "kind": "NetworkPolicyList", + "version": "v1" + } + ] + }, + "io.k8s.api.networking.v1.NetworkPolicyPeer": { + "description": "NetworkPolicyPeer describes a peer to allow traffic to/from. Only certain combinations of fields are allowed", + "properties": { + "ipBlock": { + "$ref": "#/definitions/io.k8s.api.networking.v1.IPBlock", + "description": "IPBlock defines policy on a particular IPBlock. If this field is set then neither of the other fields can be." + }, + "namespaceSelector": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector", + "description": "Selects Namespaces using cluster-scoped labels. This field follows standard label selector semantics; if present but empty, it selects all namespaces.\n\nIf PodSelector is also set, then the NetworkPolicyPeer as a whole selects the Pods matching PodSelector in the Namespaces selected by NamespaceSelector. Otherwise it selects all Pods in the Namespaces selected by NamespaceSelector." + }, + "podSelector": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector", + "description": "This is a label selector which selects Pods. This field follows standard label selector semantics; if present but empty, it selects all pods.\n\nIf NamespaceSelector is also set, then the NetworkPolicyPeer as a whole selects the Pods matching PodSelector in the Namespaces selected by NamespaceSelector. Otherwise it selects the Pods matching PodSelector in the policy's own Namespace." + } + }, + "type": "object" + }, + "io.k8s.api.networking.v1.NetworkPolicyPort": { + "description": "NetworkPolicyPort describes a port to allow traffic on", + "properties": { + "port": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.util.intstr.IntOrString", + "description": "The port on the given protocol. This can either be a numerical or named port on a pod. If this field is not provided, this matches all port names and numbers." + }, + "protocol": { + "description": "The protocol (TCP, UDP, or SCTP) which traffic must match. If not specified, this field defaults to TCP.", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.networking.v1.NetworkPolicySpec": { + "description": "NetworkPolicySpec provides the specification of a NetworkPolicy", + "properties": { + "egress": { + "description": "List of egress rules to be applied to the selected pods. Outgoing traffic is allowed if there are no NetworkPolicies selecting the pod (and cluster policy otherwise allows the traffic), OR if the traffic matches at least one egress rule across all of the NetworkPolicy objects whose podSelector matches the pod. If this field is empty then this NetworkPolicy limits all outgoing traffic (and serves solely to ensure that the pods it selects are isolated by default). This field is beta-level in 1.8", + "items": { + "$ref": "#/definitions/io.k8s.api.networking.v1.NetworkPolicyEgressRule" + }, + "type": "array" + }, + "ingress": { + "description": "List of ingress rules to be applied to the selected pods. Traffic is allowed to a pod if there are no NetworkPolicies selecting the pod (and cluster policy otherwise allows the traffic), OR if the traffic source is the pod's local node, OR if the traffic matches at least one ingress rule across all of the NetworkPolicy objects whose podSelector matches the pod. If this field is empty then this NetworkPolicy does not allow any traffic (and serves solely to ensure that the pods it selects are isolated by default)", + "items": { + "$ref": "#/definitions/io.k8s.api.networking.v1.NetworkPolicyIngressRule" + }, + "type": "array" + }, + "podSelector": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector", + "description": "Selects the pods to which this NetworkPolicy object applies. The array of ingress rules is applied to any pods selected by this field. Multiple network policies can select the same set of pods. In this case, the ingress rules for each are combined additively. This field is NOT optional and follows standard label selector semantics. An empty podSelector matches all pods in this namespace." + }, + "policyTypes": { + "description": "List of rule types that the NetworkPolicy relates to. Valid options are \"Ingress\", \"Egress\", or \"Ingress,Egress\". If this field is not specified, it will default based on the existence of Ingress or Egress rules; policies that contain an Egress section are assumed to affect Egress, and all policies (whether or not they contain an Ingress section) are assumed to affect Ingress. If you want to write an egress-only policy, you must explicitly specify policyTypes [ \"Egress\" ]. Likewise, if you want to write a policy that specifies that no egress is allowed, you must specify a policyTypes value that include \"Egress\" (since such a policy would not include an Egress section and would otherwise default to just [ \"Ingress\" ]). This field is beta-level in 1.8", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "podSelector" + ], + "type": "object" + }, + "io.k8s.api.networking.v1.ServiceBackendPort": { + "description": "ServiceBackendPort is the service port being referenced.", + "properties": { + "name": { + "description": "Name is the name of the port on the Service. This is a mutually exclusive setting with \"Number\".", + "type": "string" + }, + "number": { + "description": "Number is the numerical port number (e.g. 80) on the Service. This is a mutually exclusive setting with \"Name\".", + "format": "int32", + "type": "integer" + } + }, + "type": "object" + }, + "io.k8s.api.networking.v1beta1.HTTPIngressPath": { + "description": "HTTPIngressPath associates a path with a backend. Incoming urls matching the path are forwarded to the backend.", + "properties": { + "backend": { + "$ref": "#/definitions/io.k8s.api.networking.v1beta1.IngressBackend", + "description": "Backend defines the referenced service endpoint to which the traffic will be forwarded to." + }, + "path": { + "description": "Path is matched against the path of an incoming request. Currently it can contain characters disallowed from the conventional \"path\" part of a URL as defined by RFC 3986. Paths must begin with a '/'. When unspecified, all paths from incoming requests are matched.", + "type": "string" + }, + "pathType": { + "description": "PathType determines the interpretation of the Path matching. PathType can be one of the following values: * Exact: Matches the URL path exactly. * Prefix: Matches based on a URL path prefix split by '/'. Matching is\n done on a path element by element basis. A path element refers is the\n list of labels in the path split by the '/' separator. A request is a\n match for path p if every p is an element-wise prefix of p of the\n request path. Note that if the last element of the path is a substring\n of the last element in request path, it is not a match (e.g. /foo/bar\n matches /foo/bar/baz, but does not match /foo/barbaz).\n* ImplementationSpecific: Interpretation of the Path matching is up to\n the IngressClass. Implementations can treat this as a separate PathType\n or treat it identically to Prefix or Exact path types.\nImplementations are required to support all path types. Defaults to ImplementationSpecific.", + "type": "string" + } + }, + "required": [ + "backend" + ], + "type": "object" + }, + "io.k8s.api.networking.v1beta1.HTTPIngressRuleValue": { + "description": "HTTPIngressRuleValue is a list of http selectors pointing to backends. In the example: http://\u003chost\u003e/\u003cpath\u003e?\u003csearchpart\u003e -\u003e backend where where parts of the url correspond to RFC 3986, this resource will be used to match against everything after the last '/' and before the first '?' or '#'.", + "properties": { + "paths": { + "description": "A collection of paths that map requests to backends.", + "items": { + "$ref": "#/definitions/io.k8s.api.networking.v1beta1.HTTPIngressPath" + }, + "type": "array" + } + }, + "required": [ + "paths" + ], + "type": "object" + }, + "io.k8s.api.networking.v1beta1.Ingress": { + "description": "Ingress is a collection of rules that allow inbound connections to reach the endpoints defined by a backend. An Ingress can be configured to give services externally-reachable urls, load balance traffic, terminate SSL, offer name based virtual hosting etc.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.networking.v1beta1.IngressSpec", + "description": "Spec is the desired state of the Ingress. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" + }, + "status": { + "$ref": "#/definitions/io.k8s.api.networking.v1beta1.IngressStatus", + "description": "Status is the current state of the Ingress. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "networking.k8s.io", + "kind": "Ingress", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.networking.v1beta1.IngressBackend": { + "description": "IngressBackend describes all endpoints for a given service and port.", + "properties": { + "resource": { + "$ref": "#/definitions/io.k8s.api.core.v1.TypedLocalObjectReference", + "description": "Resource is an ObjectRef to another Kubernetes resource in the namespace of the Ingress object. If resource is specified, serviceName and servicePort must not be specified." + }, + "serviceName": { + "description": "Specifies the name of the referenced service.", + "type": "string" + }, + "servicePort": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.util.intstr.IntOrString", + "description": "Specifies the port of the referenced service." + } + }, + "type": "object" + }, + "io.k8s.api.networking.v1beta1.IngressClass": { + "description": "IngressClass represents the class of the Ingress, referenced by the Ingress Spec. The `ingressclass.kubernetes.io/is-default-class` annotation can be used to indicate that an IngressClass should be considered default. When a single IngressClass resource has this annotation set to true, new Ingress resources without a class specified will be assigned this default class.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.networking.v1beta1.IngressClassSpec", + "description": "Spec is the desired state of the IngressClass. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "networking.k8s.io", + "kind": "IngressClass", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.networking.v1beta1.IngressClassList": { + "description": "IngressClassList is a collection of IngressClasses.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "Items is the list of IngressClasses.", + "items": { + "$ref": "#/definitions/io.k8s.api.networking.v1beta1.IngressClass" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata." + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "networking.k8s.io", + "kind": "IngressClassList", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.networking.v1beta1.IngressClassSpec": { + "description": "IngressClassSpec provides information about the class of an Ingress.", + "properties": { + "controller": { + "description": "Controller refers to the name of the controller that should handle this class. This allows for different \"flavors\" that are controlled by the same controller. For example, you may have different Parameters for the same implementing controller. This should be specified as a domain-prefixed path no more than 250 characters in length, e.g. \"acme.io/ingress-controller\". This field is immutable.", + "type": "string" + }, + "parameters": { + "$ref": "#/definitions/io.k8s.api.core.v1.TypedLocalObjectReference", + "description": "Parameters is a link to a custom resource containing additional configuration for the controller. This is optional if the controller does not require extra parameters." + } + }, + "type": "object" + }, + "io.k8s.api.networking.v1beta1.IngressList": { + "description": "IngressList is a collection of Ingress.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "Items is the list of Ingress.", + "items": { + "$ref": "#/definitions/io.k8s.api.networking.v1beta1.Ingress" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "networking.k8s.io", + "kind": "IngressList", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.networking.v1beta1.IngressRule": { + "description": "IngressRule represents the rules mapping the paths under a specified host to the related backend services. Incoming requests are first evaluated for a host match, then routed to the backend associated with the matching IngressRuleValue.", + "properties": { + "host": { + "description": "Host is the fully qualified domain name of a network host, as defined by RFC 3986. Note the following deviations from the \"host\" part of the URI as defined in RFC 3986: 1. IPs are not allowed. Currently an IngressRuleValue can only apply to\n the IP in the Spec of the parent Ingress.\n2. The `:` delimiter is not respected because ports are not allowed.\n\t Currently the port of an Ingress is implicitly :80 for http and\n\t :443 for https.\nBoth these may change in the future. Incoming requests are matched against the host before the IngressRuleValue. If the host is unspecified, the Ingress routes all traffic based on the specified IngressRuleValue.\n\nHost can be \"precise\" which is a domain name without the terminating dot of a network host (e.g. \"foo.bar.com\") or \"wildcard\", which is a domain name prefixed with a single wildcard label (e.g. \"*.foo.com\"). The wildcard character '*' must appear by itself as the first DNS label and matches only a single label. You cannot have a wildcard label by itself (e.g. Host == \"*\"). Requests will be matched against the Host field in the following way: 1. If Host is precise, the request matches this rule if the http host header is equal to Host. 2. If Host is a wildcard, then the request matches this rule if the http host header is to equal to the suffix (removing the first label) of the wildcard rule.", + "type": "string" + }, + "http": { + "$ref": "#/definitions/io.k8s.api.networking.v1beta1.HTTPIngressRuleValue" + } + }, + "type": "object" + }, + "io.k8s.api.networking.v1beta1.IngressSpec": { + "description": "IngressSpec describes the Ingress the user wishes to exist.", + "properties": { + "backend": { + "$ref": "#/definitions/io.k8s.api.networking.v1beta1.IngressBackend", + "description": "A default backend capable of servicing requests that don't match any rule. At least one of 'backend' or 'rules' must be specified. This field is optional to allow the loadbalancer controller or defaulting logic to specify a global default." + }, + "ingressClassName": { + "description": "IngressClassName is the name of the IngressClass cluster resource. The associated IngressClass defines which controller will implement the resource. This replaces the deprecated `kubernetes.io/ingress.class` annotation. For backwards compatibility, when that annotation is set, it must be given precedence over this field. The controller may emit a warning if the field and annotation have different values. Implementations of this API should ignore Ingresses without a class specified. An IngressClass resource may be marked as default, which can be used to set a default value for this field. For more information, refer to the IngressClass documentation.", + "type": "string" + }, + "rules": { + "description": "A list of host rules used to configure the Ingress. If unspecified, or no rule matches, all traffic is sent to the default backend.", + "items": { + "$ref": "#/definitions/io.k8s.api.networking.v1beta1.IngressRule" + }, + "type": "array" + }, + "tls": { + "description": "TLS configuration. Currently the Ingress only supports a single TLS port, 443. If multiple members of this list specify different hosts, they will be multiplexed on the same port according to the hostname specified through the SNI TLS extension, if the ingress controller fulfilling the ingress supports SNI.", + "items": { + "$ref": "#/definitions/io.k8s.api.networking.v1beta1.IngressTLS" + }, + "type": "array" + } + }, + "type": "object" + }, + "io.k8s.api.networking.v1beta1.IngressStatus": { + "description": "IngressStatus describe the current state of the Ingress.", + "properties": { + "loadBalancer": { + "$ref": "#/definitions/io.k8s.api.core.v1.LoadBalancerStatus", + "description": "LoadBalancer contains the current status of the load-balancer." + } + }, + "type": "object" + }, + "io.k8s.api.networking.v1beta1.IngressTLS": { + "description": "IngressTLS describes the transport layer security associated with an Ingress.", + "properties": { + "hosts": { + "description": "Hosts are a list of hosts included in the TLS certificate. The values in this list must match the name/s used in the tlsSecret. Defaults to the wildcard host setting for the loadbalancer controller fulfilling this Ingress, if left unspecified.", + "items": { + "type": "string" + }, + "type": "array" + }, + "secretName": { + "description": "SecretName is the name of the secret used to terminate TLS traffic on port 443. Field is left optional to allow TLS routing based on SNI hostname alone. If the SNI host in a listener conflicts with the \"Host\" header field used by an IngressRule, the SNI host is used for termination and value of the Host header is used for routing.", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.node.v1.Overhead": { + "description": "Overhead structure represents the resource overhead associated with running a pod.", + "properties": { + "podFixed": { + "additionalProperties": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity" + }, + "description": "PodFixed represents the fixed resource overhead associated with running a pod.", + "type": "object" + } + }, + "type": "object" + }, + "io.k8s.api.node.v1.RuntimeClass": { + "description": "RuntimeClass defines a class of container runtime supported in the cluster. The RuntimeClass is used to determine which container runtime is used to run all containers in a pod. RuntimeClasses are manually defined by a user or cluster provisioner, and referenced in the PodSpec. The Kubelet is responsible for resolving the RuntimeClassName reference before running the pod. For more details, see https://kubernetes.io/docs/concepts/containers/runtime-class/", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "handler": { + "description": "Handler specifies the underlying runtime and configuration that the CRI implementation will use to handle pods of this class. The possible values are specific to the node \u0026 CRI configuration. It is assumed that all handlers are available on every node, and handlers of the same name are equivalent on every node. For example, a handler called \"runc\" might specify that the runc OCI runtime (using native Linux containers) will be used to run the containers in a pod. The Handler must be lowercase, conform to the DNS Label (RFC 1123) requirements, and is immutable.", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "overhead": { + "$ref": "#/definitions/io.k8s.api.node.v1.Overhead", + "description": "Overhead represents the resource overhead associated with running a pod for a given RuntimeClass. For more details, see\n https://kubernetes.io/docs/concepts/scheduling-eviction/pod-overhead/\nThis field is in beta starting v1.18 and is only honored by servers that enable the PodOverhead feature." + }, + "scheduling": { + "$ref": "#/definitions/io.k8s.api.node.v1.Scheduling", + "description": "Scheduling holds the scheduling constraints to ensure that pods running with this RuntimeClass are scheduled to nodes that support it. If scheduling is nil, this RuntimeClass is assumed to be supported by all nodes." + } + }, + "required": [ + "handler" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "node.k8s.io", + "kind": "RuntimeClass", + "version": "v1" + } + ] + }, + "io.k8s.api.node.v1.RuntimeClassList": { + "description": "RuntimeClassList is a list of RuntimeClass objects.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "Items is a list of schema objects.", + "items": { + "$ref": "#/definitions/io.k8s.api.node.v1.RuntimeClass" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "node.k8s.io", + "kind": "RuntimeClassList", + "version": "v1" + } + ] + }, + "io.k8s.api.node.v1.Scheduling": { + "description": "Scheduling specifies the scheduling constraints for nodes supporting a RuntimeClass.", + "properties": { + "nodeSelector": { + "additionalProperties": { + "type": "string" + }, + "description": "nodeSelector lists labels that must be present on nodes that support this RuntimeClass. Pods using this RuntimeClass can only be scheduled to a node matched by this selector. The RuntimeClass nodeSelector is merged with a pod's existing nodeSelector. Any conflicts will cause the pod to be rejected in admission.", + "type": "object" + }, + "tolerations": { + "description": "tolerations are appended (excluding duplicates) to pods running with this RuntimeClass during admission, effectively unioning the set of nodes tolerated by the pod and the RuntimeClass.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.Toleration" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + } + }, + "type": "object" + }, + "io.k8s.api.node.v1beta1.Overhead": { + "description": "Overhead structure represents the resource overhead associated with running a pod.", + "properties": { + "podFixed": { + "additionalProperties": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity" + }, + "description": "PodFixed represents the fixed resource overhead associated with running a pod.", + "type": "object" + } + }, + "type": "object" + }, + "io.k8s.api.node.v1beta1.RuntimeClass": { + "description": "RuntimeClass defines a class of container runtime supported in the cluster. The RuntimeClass is used to determine which container runtime is used to run all containers in a pod. RuntimeClasses are (currently) manually defined by a user or cluster provisioner, and referenced in the PodSpec. The Kubelet is responsible for resolving the RuntimeClassName reference before running the pod. For more details, see https://git.k8s.io/enhancements/keps/sig-node/runtime-class.md", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "handler": { + "description": "Handler specifies the underlying runtime and configuration that the CRI implementation will use to handle pods of this class. The possible values are specific to the node \u0026 CRI configuration. It is assumed that all handlers are available on every node, and handlers of the same name are equivalent on every node. For example, a handler called \"runc\" might specify that the runc OCI runtime (using native Linux containers) will be used to run the containers in a pod. The Handler must be lowercase, conform to the DNS Label (RFC 1123) requirements, and is immutable.", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "overhead": { + "$ref": "#/definitions/io.k8s.api.node.v1beta1.Overhead", + "description": "Overhead represents the resource overhead associated with running a pod for a given RuntimeClass. For more details, see https://git.k8s.io/enhancements/keps/sig-node/20190226-pod-overhead.md This field is alpha-level as of Kubernetes v1.15, and is only honored by servers that enable the PodOverhead feature." + }, + "scheduling": { + "$ref": "#/definitions/io.k8s.api.node.v1beta1.Scheduling", + "description": "Scheduling holds the scheduling constraints to ensure that pods running with this RuntimeClass are scheduled to nodes that support it. If scheduling is nil, this RuntimeClass is assumed to be supported by all nodes." + } + }, + "required": [ + "handler" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "node.k8s.io", + "kind": "RuntimeClass", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.node.v1beta1.RuntimeClassList": { + "description": "RuntimeClassList is a list of RuntimeClass objects.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "Items is a list of schema objects.", + "items": { + "$ref": "#/definitions/io.k8s.api.node.v1beta1.RuntimeClass" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "node.k8s.io", + "kind": "RuntimeClassList", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.node.v1beta1.Scheduling": { + "description": "Scheduling specifies the scheduling constraints for nodes supporting a RuntimeClass.", + "properties": { + "nodeSelector": { + "additionalProperties": { + "type": "string" + }, + "description": "nodeSelector lists labels that must be present on nodes that support this RuntimeClass. Pods using this RuntimeClass can only be scheduled to a node matched by this selector. The RuntimeClass nodeSelector is merged with a pod's existing nodeSelector. Any conflicts will cause the pod to be rejected in admission.", + "type": "object" + }, + "tolerations": { + "description": "tolerations are appended (excluding duplicates) to pods running with this RuntimeClass during admission, effectively unioning the set of nodes tolerated by the pod and the RuntimeClass.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.Toleration" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + } + }, + "type": "object" + }, + "io.k8s.api.policy.v1beta1.AllowedCSIDriver": { + "description": "AllowedCSIDriver represents a single inline CSI Driver that is allowed to be used.", + "properties": { + "name": { + "description": "Name is the registered name of the CSI driver", + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "io.k8s.api.policy.v1beta1.AllowedFlexVolume": { + "description": "AllowedFlexVolume represents a single Flexvolume that is allowed to be used.", + "properties": { + "driver": { + "description": "driver is the name of the Flexvolume driver.", + "type": "string" + } + }, + "required": [ + "driver" + ], + "type": "object" + }, + "io.k8s.api.policy.v1beta1.AllowedHostPath": { + "description": "AllowedHostPath defines the host volume conditions that will be enabled by a policy for pods to use. It requires the path prefix to be defined.", + "properties": { + "pathPrefix": { + "description": "pathPrefix is the path prefix that the host volume must match. It does not support `*`. Trailing slashes are trimmed when validating the path prefix with a host path.\n\nExamples: `/foo` would allow `/foo`, `/foo/` and `/foo/bar` `/foo` would not allow `/food` or `/etc/foo`", + "type": "string" + }, + "readOnly": { + "description": "when set to true, will allow host volumes matching the pathPrefix only if all volume mounts are readOnly.", + "type": "boolean" + } + }, + "type": "object" + }, + "io.k8s.api.policy.v1beta1.Eviction": { + "description": "Eviction evicts a pod from its node subject to certain policies and safety constraints. This is a subresource of Pod. A request to cause such an eviction is created by POSTing to .../pods/\u003cpod name\u003e/evictions.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "deleteOptions": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions", + "description": "DeleteOptions may be provided" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "ObjectMeta describes the pod that is being evicted." + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "policy", + "kind": "Eviction", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.policy.v1beta1.FSGroupStrategyOptions": { + "description": "FSGroupStrategyOptions defines the strategy type and options used to create the strategy.", + "properties": { + "ranges": { + "description": "ranges are the allowed ranges of fs groups. If you would like to force a single fs group then supply a single range with the same start and end. Required for MustRunAs.", + "items": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.IDRange" + }, + "type": "array" + }, + "rule": { + "description": "rule is the strategy that will dictate what FSGroup is used in the SecurityContext.", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.policy.v1beta1.HostPortRange": { + "description": "HostPortRange defines a range of host ports that will be enabled by a policy for pods to use. It requires both the start and end to be defined.", + "properties": { + "max": { + "description": "max is the end of the range, inclusive.", + "format": "int32", + "type": "integer" + }, + "min": { + "description": "min is the start of the range, inclusive.", + "format": "int32", + "type": "integer" + } + }, + "required": [ + "min", + "max" + ], + "type": "object" + }, + "io.k8s.api.policy.v1beta1.IDRange": { + "description": "IDRange provides a min/max of an allowed range of IDs.", + "properties": { + "max": { + "description": "max is the end of the range, inclusive.", + "format": "int64", + "type": "integer" + }, + "min": { + "description": "min is the start of the range, inclusive.", + "format": "int64", + "type": "integer" + } + }, + "required": [ + "min", + "max" + ], + "type": "object" + }, + "io.k8s.api.policy.v1beta1.PodDisruptionBudget": { + "description": "PodDisruptionBudget is an object to define the max disruption that can be caused to a collection of pods", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudgetSpec", + "description": "Specification of the desired behavior of the PodDisruptionBudget." + }, + "status": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudgetStatus", + "description": "Most recently observed status of the PodDisruptionBudget." + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "policy", + "kind": "PodDisruptionBudget", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.policy.v1beta1.PodDisruptionBudgetList": { + "description": "PodDisruptionBudgetList is a collection of PodDisruptionBudgets.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "items": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudget" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "policy", + "kind": "PodDisruptionBudgetList", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.policy.v1beta1.PodDisruptionBudgetSpec": { + "description": "PodDisruptionBudgetSpec is a description of a PodDisruptionBudget.", + "properties": { + "maxUnavailable": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.util.intstr.IntOrString", + "description": "An eviction is allowed if at most \"maxUnavailable\" pods selected by \"selector\" are unavailable after the eviction, i.e. even in absence of the evicted pod. For example, one can prevent all voluntary evictions by specifying 0. This is a mutually exclusive setting with \"minAvailable\"." + }, + "minAvailable": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.util.intstr.IntOrString", + "description": "An eviction is allowed if at least \"minAvailable\" pods selected by \"selector\" will still be available after the eviction, i.e. even in the absence of the evicted pod. So for example you can prevent all voluntary evictions by specifying \"100%\"." + }, + "selector": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector", + "description": "Label query over pods whose evictions are managed by the disruption budget." + } + }, + "type": "object" + }, + "io.k8s.api.policy.v1beta1.PodDisruptionBudgetStatus": { + "description": "PodDisruptionBudgetStatus represents information about the status of a PodDisruptionBudget. Status may trail the actual state of a system.", + "properties": { + "currentHealthy": { + "description": "current number of healthy pods", + "format": "int32", + "type": "integer" + }, + "desiredHealthy": { + "description": "minimum desired number of healthy pods", + "format": "int32", + "type": "integer" + }, + "disruptedPods": { + "additionalProperties": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time" + }, + "description": "DisruptedPods contains information about pods whose eviction was processed by the API server eviction subresource handler but has not yet been observed by the PodDisruptionBudget controller. A pod will be in this map from the time when the API server processed the eviction request to the time when the pod is seen by PDB controller as having been marked for deletion (or after a timeout). The key in the map is the name of the pod and the value is the time when the API server processed the eviction request. If the deletion didn't occur and a pod is still there it will be removed from the list automatically by PodDisruptionBudget controller after some time. If everything goes smooth this map should be empty for the most of the time. Large number of entries in the map may indicate problems with pod deletions.", + "type": "object" + }, + "disruptionsAllowed": { + "description": "Number of pod disruptions that are currently allowed.", + "format": "int32", + "type": "integer" + }, + "expectedPods": { + "description": "total number of pods counted by this disruption budget", + "format": "int32", + "type": "integer" + }, + "observedGeneration": { + "description": "Most recent generation observed when updating this PDB status. DisruptionsAllowed and other status information is valid only if observedGeneration equals to PDB's object generation.", + "format": "int64", + "type": "integer" + } + }, + "required": [ + "disruptionsAllowed", + "currentHealthy", + "desiredHealthy", + "expectedPods" + ], + "type": "object" + }, + "io.k8s.api.policy.v1beta1.PodSecurityPolicy": { + "description": "PodSecurityPolicy governs the ability to make requests that affect the Security Context that will be applied to a pod and container.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.PodSecurityPolicySpec", + "description": "spec defines the policy enforced." + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "policy", + "kind": "PodSecurityPolicy", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.policy.v1beta1.PodSecurityPolicyList": { + "description": "PodSecurityPolicyList is a list of PodSecurityPolicy objects.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "items is a list of schema objects.", + "items": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.PodSecurityPolicy" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "policy", + "kind": "PodSecurityPolicyList", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.policy.v1beta1.PodSecurityPolicySpec": { + "description": "PodSecurityPolicySpec defines the policy enforced.", + "properties": { + "allowPrivilegeEscalation": { + "description": "allowPrivilegeEscalation determines if a pod can request to allow privilege escalation. If unspecified, defaults to true.", + "type": "boolean" + }, + "allowedCSIDrivers": { + "description": "AllowedCSIDrivers is an allowlist of inline CSI drivers that must be explicitly set to be embedded within a pod spec. An empty value indicates that any CSI driver can be used for inline ephemeral volumes. This is a beta field, and is only honored if the API server enables the CSIInlineVolume feature gate.", + "items": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.AllowedCSIDriver" + }, + "type": "array" + }, + "allowedCapabilities": { + "description": "allowedCapabilities is a list of capabilities that can be requested to add to the container. Capabilities in this field may be added at the pod author's discretion. You must not list a capability in both allowedCapabilities and requiredDropCapabilities.", + "items": { + "type": "string" + }, + "type": "array" + }, + "allowedFlexVolumes": { + "description": "allowedFlexVolumes is an allowlist of Flexvolumes. Empty or nil indicates that all Flexvolumes may be used. This parameter is effective only when the usage of the Flexvolumes is allowed in the \"volumes\" field.", + "items": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.AllowedFlexVolume" + }, + "type": "array" + }, + "allowedHostPaths": { + "description": "allowedHostPaths is an allowlist of host paths. Empty indicates that all host paths may be used.", + "items": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.AllowedHostPath" + }, + "type": "array" + }, + "allowedProcMountTypes": { + "description": "AllowedProcMountTypes is an allowlist of allowed ProcMountTypes. Empty or nil indicates that only the DefaultProcMountType may be used. This requires the ProcMountType feature flag to be enabled.", + "items": { + "type": "string" + }, + "type": "array" + }, + "allowedUnsafeSysctls": { + "description": "allowedUnsafeSysctls is a list of explicitly allowed unsafe sysctls, defaults to none. Each entry is either a plain sysctl name or ends in \"*\" in which case it is considered as a prefix of allowed sysctls. Single * means all unsafe sysctls are allowed. Kubelet has to allowlist all allowed unsafe sysctls explicitly to avoid rejection.\n\nExamples: e.g. \"foo/*\" allows \"foo/bar\", \"foo/baz\", etc. e.g. \"foo.*\" allows \"foo.bar\", \"foo.baz\", etc.", + "items": { + "type": "string" + }, + "type": "array" + }, + "defaultAddCapabilities": { + "description": "defaultAddCapabilities is the default set of capabilities that will be added to the container unless the pod spec specifically drops the capability. You may not list a capability in both defaultAddCapabilities and requiredDropCapabilities. Capabilities added here are implicitly allowed, and need not be included in the allowedCapabilities list.", + "items": { + "type": "string" + }, + "type": "array" + }, + "defaultAllowPrivilegeEscalation": { + "description": "defaultAllowPrivilegeEscalation controls the default setting for whether a process can gain more privileges than its parent process.", + "type": "boolean" + }, + "forbiddenSysctls": { + "description": "forbiddenSysctls is a list of explicitly forbidden sysctls, defaults to none. Each entry is either a plain sysctl name or ends in \"*\" in which case it is considered as a prefix of forbidden sysctls. Single * means all sysctls are forbidden.\n\nExamples: e.g. \"foo/*\" forbids \"foo/bar\", \"foo/baz\", etc. e.g. \"foo.*\" forbids \"foo.bar\", \"foo.baz\", etc.", + "items": { + "type": "string" + }, + "type": "array" + }, + "fsGroup": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.FSGroupStrategyOptions", + "description": "fsGroup is the strategy that will dictate what fs group is used by the SecurityContext." + }, + "hostIPC": { + "description": "hostIPC determines if the policy allows the use of HostIPC in the pod spec.", + "type": "boolean" + }, + "hostNetwork": { + "description": "hostNetwork determines if the policy allows the use of HostNetwork in the pod spec.", + "type": "boolean" + }, + "hostPID": { + "description": "hostPID determines if the policy allows the use of HostPID in the pod spec.", + "type": "boolean" + }, + "hostPorts": { + "description": "hostPorts determines which host port ranges are allowed to be exposed.", + "items": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.HostPortRange" + }, + "type": "array" + }, + "privileged": { + "description": "privileged determines if a pod can request to be run as privileged.", + "type": "boolean" + }, + "readOnlyRootFilesystem": { + "description": "readOnlyRootFilesystem when set to true will force containers to run with a read only root file system. If the container specifically requests to run with a non-read only root file system the PSP should deny the pod. If set to false the container may run with a read only root file system if it wishes but it will not be forced to.", + "type": "boolean" + }, + "requiredDropCapabilities": { + "description": "requiredDropCapabilities are the capabilities that will be dropped from the container. These are required to be dropped and cannot be added.", + "items": { + "type": "string" + }, + "type": "array" + }, + "runAsGroup": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.RunAsGroupStrategyOptions", + "description": "RunAsGroup is the strategy that will dictate the allowable RunAsGroup values that may be set. If this field is omitted, the pod's RunAsGroup can take any value. This field requires the RunAsGroup feature gate to be enabled." + }, + "runAsUser": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.RunAsUserStrategyOptions", + "description": "runAsUser is the strategy that will dictate the allowable RunAsUser values that may be set." + }, + "runtimeClass": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.RuntimeClassStrategyOptions", + "description": "runtimeClass is the strategy that will dictate the allowable RuntimeClasses for a pod. If this field is omitted, the pod's runtimeClassName field is unrestricted. Enforcement of this field depends on the RuntimeClass feature gate being enabled." + }, + "seLinux": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.SELinuxStrategyOptions", + "description": "seLinux is the strategy that will dictate the allowable labels that may be set." + }, + "supplementalGroups": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.SupplementalGroupsStrategyOptions", + "description": "supplementalGroups is the strategy that will dictate what supplemental groups are used by the SecurityContext." + }, + "volumes": { + "description": "volumes is an allowlist of volume plugins. Empty indicates that no volumes may be used. To allow all volumes you may use '*'.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "seLinux", + "runAsUser", + "supplementalGroups", + "fsGroup" + ], + "type": "object" + }, + "io.k8s.api.policy.v1beta1.RunAsGroupStrategyOptions": { + "description": "RunAsGroupStrategyOptions defines the strategy type and any options used to create the strategy.", + "properties": { + "ranges": { + "description": "ranges are the allowed ranges of gids that may be used. If you would like to force a single gid then supply a single range with the same start and end. Required for MustRunAs.", + "items": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.IDRange" + }, + "type": "array" + }, + "rule": { + "description": "rule is the strategy that will dictate the allowable RunAsGroup values that may be set.", + "type": "string" + } + }, + "required": [ + "rule" + ], + "type": "object" + }, + "io.k8s.api.policy.v1beta1.RunAsUserStrategyOptions": { + "description": "RunAsUserStrategyOptions defines the strategy type and any options used to create the strategy.", + "properties": { + "ranges": { + "description": "ranges are the allowed ranges of uids that may be used. If you would like to force a single uid then supply a single range with the same start and end. Required for MustRunAs.", + "items": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.IDRange" + }, + "type": "array" + }, + "rule": { + "description": "rule is the strategy that will dictate the allowable RunAsUser values that may be set.", + "type": "string" + } + }, + "required": [ + "rule" + ], + "type": "object" + }, + "io.k8s.api.policy.v1beta1.RuntimeClassStrategyOptions": { + "description": "RuntimeClassStrategyOptions define the strategy that will dictate the allowable RuntimeClasses for a pod.", + "properties": { + "allowedRuntimeClassNames": { + "description": "allowedRuntimeClassNames is an allowlist of RuntimeClass names that may be specified on a pod. A value of \"*\" means that any RuntimeClass name is allowed, and must be the only item in the list. An empty list requires the RuntimeClassName field to be unset.", + "items": { + "type": "string" + }, + "type": "array" + }, + "defaultRuntimeClassName": { + "description": "defaultRuntimeClassName is the default RuntimeClassName to set on the pod. The default MUST be allowed by the allowedRuntimeClassNames list. A value of nil does not mutate the Pod.", + "type": "string" + } + }, + "required": [ + "allowedRuntimeClassNames" + ], + "type": "object" + }, + "io.k8s.api.policy.v1beta1.SELinuxStrategyOptions": { + "description": "SELinuxStrategyOptions defines the strategy type and any options used to create the strategy.", + "properties": { + "rule": { + "description": "rule is the strategy that will dictate the allowable labels that may be set.", + "type": "string" + }, + "seLinuxOptions": { + "$ref": "#/definitions/io.k8s.api.core.v1.SELinuxOptions", + "description": "seLinuxOptions required to run as; required for MustRunAs More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/" + } + }, + "required": [ + "rule" + ], + "type": "object" + }, + "io.k8s.api.policy.v1beta1.SupplementalGroupsStrategyOptions": { + "description": "SupplementalGroupsStrategyOptions defines the strategy type and options used to create the strategy.", + "properties": { + "ranges": { + "description": "ranges are the allowed ranges of supplemental groups. If you would like to force a single supplemental group then supply a single range with the same start and end. Required for MustRunAs.", + "items": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.IDRange" + }, + "type": "array" + }, + "rule": { + "description": "rule is the strategy that will dictate what supplemental groups is used in the SecurityContext.", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.rbac.v1.AggregationRule": { + "description": "AggregationRule describes how to locate ClusterRoles to aggregate into the ClusterRole", + "properties": { + "clusterRoleSelectors": { + "description": "ClusterRoleSelectors holds a list of selectors which will be used to find ClusterRoles and create the rules. If any of the selectors match, then the ClusterRole's permissions will be added", + "items": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector" + }, + "type": "array" + } + }, + "type": "object" + }, + "io.k8s.api.rbac.v1.ClusterRole": { + "description": "ClusterRole is a cluster level, logical grouping of PolicyRules that can be referenced as a unit by a RoleBinding or ClusterRoleBinding.", + "properties": { + "aggregationRule": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.AggregationRule", + "description": "AggregationRule is an optional field that describes how to build the Rules for this ClusterRole. If AggregationRule is set, then the Rules are controller managed and direct changes to Rules will be stomped by the controller." + }, + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object's metadata." + }, + "rules": { + "description": "Rules holds all the PolicyRules for this ClusterRole", + "items": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.PolicyRule" + }, + "type": "array" + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRole", + "version": "v1" + } + ] + }, + "io.k8s.api.rbac.v1.ClusterRoleBinding": { + "description": "ClusterRoleBinding references a ClusterRole, but not contain it. It can reference a ClusterRole in the global namespace, and adds who information via Subject.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object's metadata." + }, + "roleRef": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.RoleRef", + "description": "RoleRef can only reference a ClusterRole in the global namespace. If the RoleRef cannot be resolved, the Authorizer must return an error." + }, + "subjects": { + "description": "Subjects holds references to the objects the role applies to.", + "items": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.Subject" + }, + "type": "array" + } + }, + "required": [ + "roleRef" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRoleBinding", + "version": "v1" + } + ] + }, + "io.k8s.api.rbac.v1.ClusterRoleBindingList": { + "description": "ClusterRoleBindingList is a collection of ClusterRoleBindings", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "Items is a list of ClusterRoleBindings", + "items": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.ClusterRoleBinding" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard object's metadata." + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRoleBindingList", + "version": "v1" + } + ] + }, + "io.k8s.api.rbac.v1.ClusterRoleList": { + "description": "ClusterRoleList is a collection of ClusterRoles", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "Items is a list of ClusterRoles", + "items": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.ClusterRole" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard object's metadata." + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRoleList", + "version": "v1" + } + ] + }, + "io.k8s.api.rbac.v1.PolicyRule": { + "description": "PolicyRule holds information that describes a policy rule, but does not contain information about who the rule applies to or which namespace the rule applies to.", + "properties": { + "apiGroups": { + "description": "APIGroups is the name of the APIGroup that contains the resources. If multiple API groups are specified, any action requested against one of the enumerated resources in any API group will be allowed.", + "items": { + "type": "string" + }, + "type": "array" + }, + "nonResourceURLs": { + "description": "NonResourceURLs is a set of partial urls that a user should have access to. *s are allowed, but only as the full, final step in the path Since non-resource URLs are not namespaced, this field is only applicable for ClusterRoles referenced from a ClusterRoleBinding. Rules can either apply to API resources (such as \"pods\" or \"secrets\") or non-resource URL paths (such as \"/api\"), but not both.", + "items": { + "type": "string" + }, + "type": "array" + }, + "resourceNames": { + "description": "ResourceNames is an optional white list of names that the rule applies to. An empty set means that everything is allowed.", + "items": { + "type": "string" + }, + "type": "array" + }, + "resources": { + "description": "Resources is a list of resources this rule applies to. ResourceAll represents all resources.", + "items": { + "type": "string" + }, + "type": "array" + }, + "verbs": { + "description": "Verbs is a list of Verbs that apply to ALL the ResourceKinds and AttributeRestrictions contained in this rule. VerbAll represents all kinds.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "verbs" + ], + "type": "object" + }, + "io.k8s.api.rbac.v1.Role": { + "description": "Role is a namespaced, logical grouping of PolicyRules that can be referenced as a unit by a RoleBinding.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object's metadata." + }, + "rules": { + "description": "Rules holds all the PolicyRules for this Role", + "items": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.PolicyRule" + }, + "type": "array" + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "rbac.authorization.k8s.io", + "kind": "Role", + "version": "v1" + } + ] + }, + "io.k8s.api.rbac.v1.RoleBinding": { + "description": "RoleBinding references a role, but does not contain it. It can reference a Role in the same namespace or a ClusterRole in the global namespace. It adds who information via Subjects and namespace information by which namespace it exists in. RoleBindings in a given namespace only have effect in that namespace.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object's metadata." + }, + "roleRef": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.RoleRef", + "description": "RoleRef can reference a Role in the current namespace or a ClusterRole in the global namespace. If the RoleRef cannot be resolved, the Authorizer must return an error." + }, + "subjects": { + "description": "Subjects holds references to the objects the role applies to.", + "items": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.Subject" + }, + "type": "array" + } + }, + "required": [ + "roleRef" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "rbac.authorization.k8s.io", + "kind": "RoleBinding", + "version": "v1" + } + ] + }, + "io.k8s.api.rbac.v1.RoleBindingList": { + "description": "RoleBindingList is a collection of RoleBindings", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "Items is a list of RoleBindings", + "items": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.RoleBinding" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard object's metadata." + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "rbac.authorization.k8s.io", + "kind": "RoleBindingList", + "version": "v1" + } + ] + }, + "io.k8s.api.rbac.v1.RoleList": { + "description": "RoleList is a collection of Roles", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "Items is a list of Roles", + "items": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.Role" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard object's metadata." + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "rbac.authorization.k8s.io", + "kind": "RoleList", + "version": "v1" + } + ] + }, + "io.k8s.api.rbac.v1.RoleRef": { + "description": "RoleRef contains information that points to the role being used", + "properties": { + "apiGroup": { + "description": "APIGroup is the group for the resource being referenced", + "type": "string" + }, + "kind": { + "description": "Kind is the type of resource being referenced", + "type": "string" + }, + "name": { + "description": "Name is the name of resource being referenced", + "type": "string" + } + }, + "required": [ + "apiGroup", + "kind", + "name" + ], + "type": "object" + }, + "io.k8s.api.rbac.v1.Subject": { + "description": "Subject contains a reference to the object or user identities a role binding applies to. This can either hold a direct API object reference, or a value for non-objects such as user and group names.", + "properties": { + "apiGroup": { + "description": "APIGroup holds the API group of the referenced subject. Defaults to \"\" for ServiceAccount subjects. Defaults to \"rbac.authorization.k8s.io\" for User and Group subjects.", + "type": "string" + }, + "kind": { + "description": "Kind of object being referenced. Values defined by this API group are \"User\", \"Group\", and \"ServiceAccount\". If the Authorizer does not recognized the kind value, the Authorizer should report an error.", + "type": "string" + }, + "name": { + "description": "Name of the object being referenced.", + "type": "string" + }, + "namespace": { + "description": "Namespace of the referenced object. If the object kind is non-namespace, such as \"User\" or \"Group\", and this value is not empty the Authorizer should report an error.", + "type": "string" + } + }, + "required": [ + "kind", + "name" + ], + "type": "object" + }, + "io.k8s.api.rbac.v1beta1.AggregationRule": { + "description": "AggregationRule describes how to locate ClusterRoles to aggregate into the ClusterRole", + "properties": { + "clusterRoleSelectors": { + "description": "ClusterRoleSelectors holds a list of selectors which will be used to find ClusterRoles and create the rules. If any of the selectors match, then the ClusterRole's permissions will be added", + "items": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector" + }, + "type": "array" + } + }, + "type": "object" + }, + "io.k8s.api.rbac.v1beta1.ClusterRole": { + "description": "ClusterRole is a cluster level, logical grouping of PolicyRules that can be referenced as a unit by a RoleBinding or ClusterRoleBinding. Deprecated in v1.17 in favor of rbac.authorization.k8s.io/v1 ClusterRole, and will no longer be served in v1.22.", + "properties": { + "aggregationRule": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.AggregationRule", + "description": "AggregationRule is an optional field that describes how to build the Rules for this ClusterRole. If AggregationRule is set, then the Rules are controller managed and direct changes to Rules will be stomped by the controller." + }, + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object's metadata." + }, + "rules": { + "description": "Rules holds all the PolicyRules for this ClusterRole", + "items": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.PolicyRule" + }, + "type": "array" + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRole", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.rbac.v1beta1.ClusterRoleBinding": { + "description": "ClusterRoleBinding references a ClusterRole, but not contain it. It can reference a ClusterRole in the global namespace, and adds who information via Subject. Deprecated in v1.17 in favor of rbac.authorization.k8s.io/v1 ClusterRoleBinding, and will no longer be served in v1.22.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object's metadata." + }, + "roleRef": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.RoleRef", + "description": "RoleRef can only reference a ClusterRole in the global namespace. If the RoleRef cannot be resolved, the Authorizer must return an error." + }, + "subjects": { + "description": "Subjects holds references to the objects the role applies to.", + "items": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.Subject" + }, + "type": "array" + } + }, + "required": [ + "roleRef" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRoleBinding", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.rbac.v1beta1.ClusterRoleBindingList": { + "description": "ClusterRoleBindingList is a collection of ClusterRoleBindings. Deprecated in v1.17 in favor of rbac.authorization.k8s.io/v1 ClusterRoleBindingList, and will no longer be served in v1.22.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "Items is a list of ClusterRoleBindings", + "items": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.ClusterRoleBinding" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard object's metadata." + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRoleBindingList", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.rbac.v1beta1.ClusterRoleList": { + "description": "ClusterRoleList is a collection of ClusterRoles. Deprecated in v1.17 in favor of rbac.authorization.k8s.io/v1 ClusterRoles, and will no longer be served in v1.22.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "Items is a list of ClusterRoles", + "items": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.ClusterRole" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard object's metadata." + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRoleList", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.rbac.v1beta1.PolicyRule": { + "description": "PolicyRule holds information that describes a policy rule, but does not contain information about who the rule applies to or which namespace the rule applies to.", + "properties": { + "apiGroups": { + "description": "APIGroups is the name of the APIGroup that contains the resources. If multiple API groups are specified, any action requested against one of the enumerated resources in any API group will be allowed.", + "items": { + "type": "string" + }, + "type": "array" + }, + "nonResourceURLs": { + "description": "NonResourceURLs is a set of partial urls that a user should have access to. *s are allowed, but only as the full, final step in the path Since non-resource URLs are not namespaced, this field is only applicable for ClusterRoles referenced from a ClusterRoleBinding. Rules can either apply to API resources (such as \"pods\" or \"secrets\") or non-resource URL paths (such as \"/api\"), but not both.", + "items": { + "type": "string" + }, + "type": "array" + }, + "resourceNames": { + "description": "ResourceNames is an optional white list of names that the rule applies to. An empty set means that everything is allowed.", + "items": { + "type": "string" + }, + "type": "array" + }, + "resources": { + "description": "Resources is a list of resources this rule applies to. '*' represents all resources in the specified apiGroups. '*/foo' represents the subresource 'foo' for all resources in the specified apiGroups.", + "items": { + "type": "string" + }, + "type": "array" + }, + "verbs": { + "description": "Verbs is a list of Verbs that apply to ALL the ResourceKinds and AttributeRestrictions contained in this rule. VerbAll represents all kinds.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "verbs" + ], + "type": "object" + }, + "io.k8s.api.rbac.v1beta1.Role": { + "description": "Role is a namespaced, logical grouping of PolicyRules that can be referenced as a unit by a RoleBinding. Deprecated in v1.17 in favor of rbac.authorization.k8s.io/v1 Role, and will no longer be served in v1.22.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object's metadata." + }, + "rules": { + "description": "Rules holds all the PolicyRules for this Role", + "items": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.PolicyRule" + }, + "type": "array" + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "rbac.authorization.k8s.io", + "kind": "Role", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.rbac.v1beta1.RoleBinding": { + "description": "RoleBinding references a role, but does not contain it. It can reference a Role in the same namespace or a ClusterRole in the global namespace. It adds who information via Subjects and namespace information by which namespace it exists in. RoleBindings in a given namespace only have effect in that namespace. Deprecated in v1.17 in favor of rbac.authorization.k8s.io/v1 RoleBinding, and will no longer be served in v1.22.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object's metadata." + }, + "roleRef": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.RoleRef", + "description": "RoleRef can reference a Role in the current namespace or a ClusterRole in the global namespace. If the RoleRef cannot be resolved, the Authorizer must return an error." + }, + "subjects": { + "description": "Subjects holds references to the objects the role applies to.", + "items": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.Subject" + }, + "type": "array" + } + }, + "required": [ + "roleRef" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "rbac.authorization.k8s.io", + "kind": "RoleBinding", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.rbac.v1beta1.RoleBindingList": { + "description": "RoleBindingList is a collection of RoleBindings Deprecated in v1.17 in favor of rbac.authorization.k8s.io/v1 RoleBindingList, and will no longer be served in v1.22.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "Items is a list of RoleBindings", + "items": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.RoleBinding" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard object's metadata." + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "rbac.authorization.k8s.io", + "kind": "RoleBindingList", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.rbac.v1beta1.RoleList": { + "description": "RoleList is a collection of Roles Deprecated in v1.17 in favor of rbac.authorization.k8s.io/v1 RoleList, and will no longer be served in v1.22.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "Items is a list of Roles", + "items": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.Role" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard object's metadata." + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "rbac.authorization.k8s.io", + "kind": "RoleList", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.rbac.v1beta1.RoleRef": { + "description": "RoleRef contains information that points to the role being used", + "properties": { + "apiGroup": { + "description": "APIGroup is the group for the resource being referenced", + "type": "string" + }, + "kind": { + "description": "Kind is the type of resource being referenced", + "type": "string" + }, + "name": { + "description": "Name is the name of resource being referenced", + "type": "string" + } + }, + "required": [ + "apiGroup", + "kind", + "name" + ], + "type": "object" + }, + "io.k8s.api.rbac.v1beta1.Subject": { + "description": "Subject contains a reference to the object or user identities a role binding applies to. This can either hold a direct API object reference, or a value for non-objects such as user and group names.", + "properties": { + "apiGroup": { + "description": "APIGroup holds the API group of the referenced subject. Defaults to \"\" for ServiceAccount subjects. Defaults to \"rbac.authorization.k8s.io\" for User and Group subjects.", + "type": "string" + }, + "kind": { + "description": "Kind of object being referenced. Values defined by this API group are \"User\", \"Group\", and \"ServiceAccount\". If the Authorizer does not recognized the kind value, the Authorizer should report an error.", + "type": "string" + }, + "name": { + "description": "Name of the object being referenced.", + "type": "string" + }, + "namespace": { + "description": "Namespace of the referenced object. If the object kind is non-namespace, such as \"User\" or \"Group\", and this value is not empty the Authorizer should report an error.", + "type": "string" + } + }, + "required": [ + "kind", + "name" + ], + "type": "object" + }, + "io.k8s.api.scheduling.v1.PriorityClass": { + "description": "PriorityClass defines mapping from a priority class name to the priority integer value. The value can be any valid integer.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "description": { + "description": "description is an arbitrary string that usually provides guidelines on when this priority class should be used.", + "type": "string" + }, + "globalDefault": { + "description": "globalDefault specifies whether this PriorityClass should be considered as the default priority for pods that do not have any priority class. Only one PriorityClass can be marked as `globalDefault`. However, if more than one PriorityClasses exists with their `globalDefault` field set to true, the smallest value of such global default PriorityClasses will be used as the default priority.", + "type": "boolean" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "preemptionPolicy": { + "description": "PreemptionPolicy is the Policy for preempting pods with lower priority. One of Never, PreemptLowerPriority. Defaults to PreemptLowerPriority if unset. This field is beta-level, gated by the NonPreemptingPriority feature-gate.", + "type": "string" + }, + "value": { + "description": "The value of this priority class. This is the actual priority that pods receive when they have the name of this class in their pod spec.", + "format": "int32", + "type": "integer" + } + }, + "required": [ + "value" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "scheduling.k8s.io", + "kind": "PriorityClass", + "version": "v1" + } + ] + }, + "io.k8s.api.scheduling.v1.PriorityClassList": { + "description": "PriorityClassList is a collection of priority classes.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "items is the list of PriorityClasses", + "items": { + "$ref": "#/definitions/io.k8s.api.scheduling.v1.PriorityClass" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "scheduling.k8s.io", + "kind": "PriorityClassList", + "version": "v1" + } + ] + }, + "io.k8s.api.scheduling.v1beta1.PriorityClass": { + "description": "DEPRECATED - This group version of PriorityClass is deprecated by scheduling.k8s.io/v1/PriorityClass. PriorityClass defines mapping from a priority class name to the priority integer value. The value can be any valid integer.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "description": { + "description": "description is an arbitrary string that usually provides guidelines on when this priority class should be used.", + "type": "string" + }, + "globalDefault": { + "description": "globalDefault specifies whether this PriorityClass should be considered as the default priority for pods that do not have any priority class. Only one PriorityClass can be marked as `globalDefault`. However, if more than one PriorityClasses exists with their `globalDefault` field set to true, the smallest value of such global default PriorityClasses will be used as the default priority.", + "type": "boolean" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "preemptionPolicy": { + "description": "PreemptionPolicy is the Policy for preempting pods with lower priority. One of Never, PreemptLowerPriority. Defaults to PreemptLowerPriority if unset. This field is beta-level, gated by the NonPreemptingPriority feature-gate.", + "type": "string" + }, + "value": { + "description": "The value of this priority class. This is the actual priority that pods receive when they have the name of this class in their pod spec.", + "format": "int32", + "type": "integer" + } + }, + "required": [ + "value" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "scheduling.k8s.io", + "kind": "PriorityClass", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.scheduling.v1beta1.PriorityClassList": { + "description": "PriorityClassList is a collection of priority classes.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "items is the list of PriorityClasses", + "items": { + "$ref": "#/definitions/io.k8s.api.scheduling.v1beta1.PriorityClass" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "scheduling.k8s.io", + "kind": "PriorityClassList", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.storage.v1.CSIDriver": { + "description": "CSIDriver captures information about a Container Storage Interface (CSI) volume driver deployed on the cluster. Kubernetes attach detach controller uses this object to determine whether attach is required. Kubelet uses this object to determine whether pod information needs to be passed on mount. CSIDriver objects are non-namespaced.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object metadata. metadata.Name indicates the name of the CSI driver that this object refers to; it MUST be the same name returned by the CSI GetPluginName() call for that driver. The driver name must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), dots (.), and alphanumerics between. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.storage.v1.CSIDriverSpec", + "description": "Specification of the CSI Driver." + } + }, + "required": [ + "spec" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "storage.k8s.io", + "kind": "CSIDriver", + "version": "v1" + } + ] + }, + "io.k8s.api.storage.v1.CSIDriverList": { + "description": "CSIDriverList is a collection of CSIDriver objects.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "items is the list of CSIDriver", + "items": { + "$ref": "#/definitions/io.k8s.api.storage.v1.CSIDriver" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "storage.k8s.io", + "kind": "CSIDriverList", + "version": "v1" + } + ] + }, + "io.k8s.api.storage.v1.CSIDriverSpec": { + "description": "CSIDriverSpec is the specification of a CSIDriver.", + "properties": { + "attachRequired": { + "description": "attachRequired indicates this CSI volume driver requires an attach operation (because it implements the CSI ControllerPublishVolume() method), and that the Kubernetes attach detach controller should call the attach volume interface which checks the volumeattachment status and waits until the volume is attached before proceeding to mounting. The CSI external-attacher coordinates with CSI volume driver and updates the volumeattachment status when the attach operation is complete. If the CSIDriverRegistry feature gate is enabled and the value is specified to false, the attach operation will be skipped. Otherwise the attach operation will be called.", + "type": "boolean" + }, + "fsGroupPolicy": { + "description": "Defines if the underlying volume supports changing ownership and permission of the volume before being mounted. Refer to the specific FSGroupPolicy values for additional details. This field is alpha-level, and is only honored by servers that enable the CSIVolumeFSGroupPolicy feature gate.", + "type": "string" + }, + "podInfoOnMount": { + "description": "If set to true, podInfoOnMount indicates this CSI volume driver requires additional pod information (like podName, podUID, etc.) during mount operations. If set to false, pod information will not be passed on mount. Default is false. The CSI driver specifies podInfoOnMount as part of driver deployment. If true, Kubelet will pass pod information as VolumeContext in the CSI NodePublishVolume() calls. The CSI driver is responsible for parsing and validating the information passed in as VolumeContext. The following VolumeConext will be passed if podInfoOnMount is set to true. This list might grow, but the prefix will be used. \"csi.storage.k8s.io/pod.name\": pod.Name \"csi.storage.k8s.io/pod.namespace\": pod.Namespace \"csi.storage.k8s.io/pod.uid\": string(pod.UID) \"csi.storage.k8s.io/ephemeral\": \"true\" iff the volume is an ephemeral inline volume\n defined by a CSIVolumeSource, otherwise \"false\"\n\n\"csi.storage.k8s.io/ephemeral\" is a new feature in Kubernetes 1.16. It is only required for drivers which support both the \"Persistent\" and \"Ephemeral\" VolumeLifecycleMode. Other drivers can leave pod info disabled and/or ignore this field. As Kubernetes 1.15 doesn't support this field, drivers can only support one mode when deployed on such a cluster and the deployment determines which mode that is, for example via a command line parameter of the driver.", + "type": "boolean" + }, + "requiresRepublish": { + "description": "RequiresRepublish indicates the CSI driver wants `NodePublishVolume` being periodically called to reflect any possible change in the mounted volume. This field defaults to false.\n\nNote: After a successful initial NodePublishVolume call, subsequent calls to NodePublishVolume should only update the contents of the volume. New mount points will not be seen by a running container.\n\nThis is an alpha feature and only available when the CSIServiceAccountToken feature is enabled.", + "type": "boolean" + }, + "storageCapacity": { + "description": "If set to true, storageCapacity indicates that the CSI volume driver wants pod scheduling to consider the storage capacity that the driver deployment will report by creating CSIStorageCapacity objects with capacity information.\n\nThe check can be enabled immediately when deploying a driver. In that case, provisioning new volumes with late binding will pause until the driver deployment has published some suitable CSIStorageCapacity object.\n\nAlternatively, the driver can be deployed with the field unset or false and it can be flipped later when storage capacity information has been published.\n\nThis is an alpha field and only available when the CSIStorageCapacity feature is enabled. The default is false.", + "type": "boolean" + }, + "tokenRequests": { + "description": "TokenRequests indicates the CSI driver needs pods' service account tokens it is mounting volume for to do necessary authentication. Kubelet will pass the tokens in VolumeContext in the CSI NodePublishVolume calls. The CSI driver should parse and validate the following VolumeContext: \"csi.storage.k8s.io/serviceAccount.tokens\": {\n \"\u003caudience\u003e\": {\n \"token\": \u003ctoken\u003e,\n \"expirationTimestamp\": \u003cexpiration timestamp in RFC3339\u003e,\n },\n ...\n}\n\nNote: Audience in each TokenRequest should be different and at most one token is empty string. To receive a new token after expiry, RequiresRepublish can be used to trigger NodePublishVolume periodically.\n\nThis is an alpha feature and only available when the CSIServiceAccountToken feature is enabled.", + "items": { + "$ref": "#/definitions/io.k8s.api.storage.v1.TokenRequest" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, + "volumeLifecycleModes": { + "description": "volumeLifecycleModes defines what kind of volumes this CSI volume driver supports. The default if the list is empty is \"Persistent\", which is the usage defined by the CSI specification and implemented in Kubernetes via the usual PV/PVC mechanism. The other mode is \"Ephemeral\". In this mode, volumes are defined inline inside the pod spec with CSIVolumeSource and their lifecycle is tied to the lifecycle of that pod. A driver has to be aware of this because it is only going to get a NodePublishVolume call for such a volume. For more information about implementing this mode, see https://kubernetes-csi.github.io/docs/ephemeral-local-volumes.html A driver can support one or more of these modes and more modes may be added in the future. This field is beta.", + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "set" + } + }, + "type": "object" + }, + "io.k8s.api.storage.v1.CSINode": { + "description": "CSINode holds information about all CSI drivers installed on a node. CSI drivers do not need to create the CSINode object directly. As long as they use the node-driver-registrar sidecar container, the kubelet will automatically populate the CSINode object for the CSI driver as part of kubelet plugin registration. CSINode has the same name as a node. If the object is missing, it means either there are no CSI Drivers available on the node, or the Kubelet version is low enough that it doesn't create this object. CSINode has an OwnerReference that points to the corresponding node object.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "metadata.name must be the Kubernetes node name." + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.storage.v1.CSINodeSpec", + "description": "spec is the specification of CSINode" + } + }, + "required": [ + "spec" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "storage.k8s.io", + "kind": "CSINode", + "version": "v1" + } + ] + }, + "io.k8s.api.storage.v1.CSINodeDriver": { + "description": "CSINodeDriver holds information about the specification of one CSI driver installed on a node", + "properties": { + "allocatable": { + "$ref": "#/definitions/io.k8s.api.storage.v1.VolumeNodeResources", + "description": "allocatable represents the volume resources of a node that are available for scheduling. This field is beta." + }, + "name": { + "description": "This is the name of the CSI driver that this object refers to. This MUST be the same name returned by the CSI GetPluginName() call for that driver.", + "type": "string" + }, + "nodeID": { + "description": "nodeID of the node from the driver point of view. This field enables Kubernetes to communicate with storage systems that do not share the same nomenclature for nodes. For example, Kubernetes may refer to a given node as \"node1\", but the storage system may refer to the same node as \"nodeA\". When Kubernetes issues a command to the storage system to attach a volume to a specific node, it can use this field to refer to the node name using the ID that the storage system will understand, e.g. \"nodeA\" instead of \"node1\". This field is required.", + "type": "string" + }, + "topologyKeys": { + "description": "topologyKeys is the list of keys supported by the driver. When a driver is initialized on a cluster, it provides a set of topology keys that it understands (e.g. \"company.com/zone\", \"company.com/region\"). When a driver is initialized on a node, it provides the same topology keys along with values. Kubelet will expose these topology keys as labels on its own node object. When Kubernetes does topology aware provisioning, it can use this list to determine which labels it should retrieve from the node object and pass back to the driver. It is possible for different nodes to use different topology keys. This can be empty if driver does not support topology.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "name", + "nodeID" + ], + "type": "object" + }, + "io.k8s.api.storage.v1.CSINodeList": { + "description": "CSINodeList is a collection of CSINode objects.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "items is the list of CSINode", + "items": { + "$ref": "#/definitions/io.k8s.api.storage.v1.CSINode" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "storage.k8s.io", + "kind": "CSINodeList", + "version": "v1" + } + ] + }, + "io.k8s.api.storage.v1.CSINodeSpec": { + "description": "CSINodeSpec holds information about the specification of all CSI drivers installed on a node", + "properties": { + "drivers": { + "description": "drivers is a list of information of all CSI Drivers existing on a node. If all drivers in the list are uninstalled, this can become empty.", + "items": { + "$ref": "#/definitions/io.k8s.api.storage.v1.CSINodeDriver" + }, + "type": "array", + "x-kubernetes-patch-merge-key": "name", + "x-kubernetes-patch-strategy": "merge" + } + }, + "required": [ + "drivers" + ], + "type": "object" + }, + "io.k8s.api.storage.v1.StorageClass": { + "description": "StorageClass describes the parameters for a class of storage for which PersistentVolumes can be dynamically provisioned.\n\nStorageClasses are non-namespaced; the name of the storage class according to etcd is in ObjectMeta.Name.", + "properties": { + "allowVolumeExpansion": { + "description": "AllowVolumeExpansion shows whether the storage class allow volume expand", + "type": "boolean" + }, + "allowedTopologies": { + "description": "Restrict the node topologies where volumes can be dynamically provisioned. Each volume plugin defines its own supported topology specifications. An empty TopologySelectorTerm list means there is no topology restriction. This field is only honored by servers that enable the VolumeScheduling feature.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.TopologySelectorTerm" + }, + "type": "array" + }, + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "mountOptions": { + "description": "Dynamically provisioned PersistentVolumes of this storage class are created with these mountOptions, e.g. [\"ro\", \"soft\"]. Not validated - mount of the PVs will simply fail if one is invalid.", + "items": { + "type": "string" + }, + "type": "array" + }, + "parameters": { + "additionalProperties": { + "type": "string" + }, + "description": "Parameters holds the parameters for the provisioner that should create volumes of this storage class.", + "type": "object" + }, + "provisioner": { + "description": "Provisioner indicates the type of the provisioner.", + "type": "string" + }, + "reclaimPolicy": { + "description": "Dynamically provisioned PersistentVolumes of this storage class are created with this reclaimPolicy. Defaults to Delete.", + "type": "string" + }, + "volumeBindingMode": { + "description": "VolumeBindingMode indicates how PersistentVolumeClaims should be provisioned and bound. When unset, VolumeBindingImmediate is used. This field is only honored by servers that enable the VolumeScheduling feature.", + "type": "string" + } + }, + "required": [ + "provisioner" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "storage.k8s.io", + "kind": "StorageClass", + "version": "v1" + } + ] + }, + "io.k8s.api.storage.v1.StorageClassList": { + "description": "StorageClassList is a collection of storage classes.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "Items is the list of StorageClasses", + "items": { + "$ref": "#/definitions/io.k8s.api.storage.v1.StorageClass" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "storage.k8s.io", + "kind": "StorageClassList", + "version": "v1" + } + ] + }, + "io.k8s.api.storage.v1.TokenRequest": { + "description": "TokenRequest contains parameters of a service account token.", + "properties": { + "audience": { + "description": "Audience is the intended audience of the token in \"TokenRequestSpec\". It will default to the audiences of kube apiserver.", + "type": "string" + }, + "expirationSeconds": { + "description": "ExpirationSeconds is the duration of validity of the token in \"TokenRequestSpec\". It has the same default value of \"ExpirationSeconds\" in \"TokenRequestSpec\".", + "format": "int64", + "type": "integer" + } + }, + "required": [ + "audience" + ], + "type": "object" + }, + "io.k8s.api.storage.v1.VolumeAttachment": { + "description": "VolumeAttachment captures the intent to attach or detach the specified volume to/from the specified node.\n\nVolumeAttachment objects are non-namespaced.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.storage.v1.VolumeAttachmentSpec", + "description": "Specification of the desired attach/detach volume behavior. Populated by the Kubernetes system." + }, + "status": { + "$ref": "#/definitions/io.k8s.api.storage.v1.VolumeAttachmentStatus", + "description": "Status of the VolumeAttachment request. Populated by the entity completing the attach or detach operation, i.e. the external-attacher." + } + }, + "required": [ + "spec" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "storage.k8s.io", + "kind": "VolumeAttachment", + "version": "v1" + } + ] + }, + "io.k8s.api.storage.v1.VolumeAttachmentList": { + "description": "VolumeAttachmentList is a collection of VolumeAttachment objects.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "Items is the list of VolumeAttachments", + "items": { + "$ref": "#/definitions/io.k8s.api.storage.v1.VolumeAttachment" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "storage.k8s.io", + "kind": "VolumeAttachmentList", + "version": "v1" + } + ] + }, + "io.k8s.api.storage.v1.VolumeAttachmentSource": { + "description": "VolumeAttachmentSource represents a volume that should be attached. Right now only PersistenVolumes can be attached via external attacher, in future we may allow also inline volumes in pods. Exactly one member can be set.", + "properties": { + "inlineVolumeSpec": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolumeSpec", + "description": "inlineVolumeSpec contains all the information necessary to attach a persistent volume defined by a pod's inline VolumeSource. This field is populated only for the CSIMigration feature. It contains translated fields from a pod's inline VolumeSource to a PersistentVolumeSpec. This field is alpha-level and is only honored by servers that enabled the CSIMigration feature." + }, + "persistentVolumeName": { + "description": "Name of the persistent volume to attach.", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.storage.v1.VolumeAttachmentSpec": { + "description": "VolumeAttachmentSpec is the specification of a VolumeAttachment request.", + "properties": { + "attacher": { + "description": "Attacher indicates the name of the volume driver that MUST handle this request. This is the name returned by GetPluginName().", + "type": "string" + }, + "nodeName": { + "description": "The node that the volume should be attached to.", + "type": "string" + }, + "source": { + "$ref": "#/definitions/io.k8s.api.storage.v1.VolumeAttachmentSource", + "description": "Source represents the volume that should be attached." + } + }, + "required": [ + "attacher", + "source", + "nodeName" + ], + "type": "object" + }, + "io.k8s.api.storage.v1.VolumeAttachmentStatus": { + "description": "VolumeAttachmentStatus is the status of a VolumeAttachment request.", + "properties": { + "attachError": { + "$ref": "#/definitions/io.k8s.api.storage.v1.VolumeError", + "description": "The last error encountered during attach operation, if any. This field must only be set by the entity completing the attach operation, i.e. the external-attacher." + }, + "attached": { + "description": "Indicates the volume is successfully attached. This field must only be set by the entity completing the attach operation, i.e. the external-attacher.", + "type": "boolean" + }, + "attachmentMetadata": { + "additionalProperties": { + "type": "string" + }, + "description": "Upon successful attach, this field is populated with any information returned by the attach operation that must be passed into subsequent WaitForAttach or Mount calls. This field must only be set by the entity completing the attach operation, i.e. the external-attacher.", + "type": "object" + }, + "detachError": { + "$ref": "#/definitions/io.k8s.api.storage.v1.VolumeError", + "description": "The last error encountered during detach operation, if any. This field must only be set by the entity completing the detach operation, i.e. the external-attacher." + } + }, + "required": [ + "attached" + ], + "type": "object" + }, + "io.k8s.api.storage.v1.VolumeError": { + "description": "VolumeError captures an error encountered during a volume operation.", + "properties": { + "message": { + "description": "String detailing the error encountered during Attach or Detach operation. This string may be logged, so it should not contain sensitive information.", + "type": "string" + }, + "time": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "Time the error was encountered." + } + }, + "type": "object" + }, + "io.k8s.api.storage.v1.VolumeNodeResources": { + "description": "VolumeNodeResources is a set of resource limits for scheduling of volumes.", + "properties": { + "count": { + "description": "Maximum number of unique volumes managed by the CSI driver that can be used on a node. A volume that is both attached and mounted on a node is considered to be used once, not twice. The same rule applies for a unique volume that is shared among multiple pods on the same node. If this field is not specified, then the supported number of volumes on this node is unbounded.", + "format": "int32", + "type": "integer" + } + }, + "type": "object" + }, + "io.k8s.api.storage.v1beta1.CSIDriver": { + "description": "CSIDriver captures information about a Container Storage Interface (CSI) volume driver deployed on the cluster. CSI drivers do not need to create the CSIDriver object directly. Instead they may use the cluster-driver-registrar sidecar container. When deployed with a CSI driver it automatically creates a CSIDriver object representing the driver. Kubernetes attach detach controller uses this object to determine whether attach is required. Kubelet uses this object to determine whether pod information needs to be passed on mount. CSIDriver objects are non-namespaced.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object metadata. metadata.Name indicates the name of the CSI driver that this object refers to; it MUST be the same name returned by the CSI GetPluginName() call for that driver. The driver name must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), dots (.), and alphanumerics between. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.CSIDriverSpec", + "description": "Specification of the CSI Driver." + } + }, + "required": [ + "spec" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "storage.k8s.io", + "kind": "CSIDriver", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.storage.v1beta1.CSIDriverList": { + "description": "CSIDriverList is a collection of CSIDriver objects.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "items is the list of CSIDriver", + "items": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.CSIDriver" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "storage.k8s.io", + "kind": "CSIDriverList", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.storage.v1beta1.CSIDriverSpec": { + "description": "CSIDriverSpec is the specification of a CSIDriver.", + "properties": { + "attachRequired": { + "description": "attachRequired indicates this CSI volume driver requires an attach operation (because it implements the CSI ControllerPublishVolume() method), and that the Kubernetes attach detach controller should call the attach volume interface which checks the volumeattachment status and waits until the volume is attached before proceeding to mounting. The CSI external-attacher coordinates with CSI volume driver and updates the volumeattachment status when the attach operation is complete. If the CSIDriverRegistry feature gate is enabled and the value is specified to false, the attach operation will be skipped. Otherwise the attach operation will be called.", + "type": "boolean" + }, + "fsGroupPolicy": { + "description": "Defines if the underlying volume supports changing ownership and permission of the volume before being mounted. Refer to the specific FSGroupPolicy values for additional details. This field is alpha-level, and is only honored by servers that enable the CSIVolumeFSGroupPolicy feature gate.", + "type": "string" + }, + "podInfoOnMount": { + "description": "If set to true, podInfoOnMount indicates this CSI volume driver requires additional pod information (like podName, podUID, etc.) during mount operations. If set to false, pod information will not be passed on mount. Default is false. The CSI driver specifies podInfoOnMount as part of driver deployment. If true, Kubelet will pass pod information as VolumeContext in the CSI NodePublishVolume() calls. The CSI driver is responsible for parsing and validating the information passed in as VolumeContext. The following VolumeConext will be passed if podInfoOnMount is set to true. This list might grow, but the prefix will be used. \"csi.storage.k8s.io/pod.name\": pod.Name \"csi.storage.k8s.io/pod.namespace\": pod.Namespace \"csi.storage.k8s.io/pod.uid\": string(pod.UID) \"csi.storage.k8s.io/ephemeral\": \"true\" iff the volume is an ephemeral inline volume\n defined by a CSIVolumeSource, otherwise \"false\"\n\n\"csi.storage.k8s.io/ephemeral\" is a new feature in Kubernetes 1.16. It is only required for drivers which support both the \"Persistent\" and \"Ephemeral\" VolumeLifecycleMode. Other drivers can leave pod info disabled and/or ignore this field. As Kubernetes 1.15 doesn't support this field, drivers can only support one mode when deployed on such a cluster and the deployment determines which mode that is, for example via a command line parameter of the driver.", + "type": "boolean" + }, + "requiresRepublish": { + "description": "RequiresRepublish indicates the CSI driver wants `NodePublishVolume` being periodically called to reflect any possible change in the mounted volume. This field defaults to false.\n\nNote: After a successful initial NodePublishVolume call, subsequent calls to NodePublishVolume should only update the contents of the volume. New mount points will not be seen by a running container.\n\nThis is an alpha feature and only available when the CSIServiceAccountToken feature is enabled.", + "type": "boolean" + }, + "storageCapacity": { + "description": "If set to true, storageCapacity indicates that the CSI volume driver wants pod scheduling to consider the storage capacity that the driver deployment will report by creating CSIStorageCapacity objects with capacity information.\n\nThe check can be enabled immediately when deploying a driver. In that case, provisioning new volumes with late binding will pause until the driver deployment has published some suitable CSIStorageCapacity object.\n\nAlternatively, the driver can be deployed with the field unset or false and it can be flipped later when storage capacity information has been published.\n\nThis is an alpha field and only available when the CSIStorageCapacity feature is enabled. The default is false.", + "type": "boolean" + }, + "tokenRequests": { + "description": "TokenRequests indicates the CSI driver needs pods' service account tokens it is mounting volume for to do necessary authentication. Kubelet will pass the tokens in VolumeContext in the CSI NodePublishVolume calls. The CSI driver should parse and validate the following VolumeContext: \"csi.storage.k8s.io/serviceAccount.tokens\": {\n \"\u003caudience\u003e\": {\n \"token\": \u003ctoken\u003e,\n \"expirationTimestamp\": \u003cexpiration timestamp in RFC3339\u003e,\n },\n ...\n}\n\nNote: Audience in each TokenRequest should be different and at most one token is empty string. To receive a new token after expiry, RequiresRepublish can be used to trigger NodePublishVolume periodically.\n\nThis is an alpha feature and only available when the CSIServiceAccountToken feature is enabled.", + "items": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.TokenRequest" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, + "volumeLifecycleModes": { + "description": "VolumeLifecycleModes defines what kind of volumes this CSI volume driver supports. The default if the list is empty is \"Persistent\", which is the usage defined by the CSI specification and implemented in Kubernetes via the usual PV/PVC mechanism. The other mode is \"Ephemeral\". In this mode, volumes are defined inline inside the pod spec with CSIVolumeSource and their lifecycle is tied to the lifecycle of that pod. A driver has to be aware of this because it is only going to get a NodePublishVolume call for such a volume. For more information about implementing this mode, see https://kubernetes-csi.github.io/docs/ephemeral-local-volumes.html A driver can support one or more of these modes and more modes may be added in the future.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "io.k8s.api.storage.v1beta1.CSINode": { + "description": "DEPRECATED - This group version of CSINode is deprecated by storage/v1/CSINode. See the release notes for more information. CSINode holds information about all CSI drivers installed on a node. CSI drivers do not need to create the CSINode object directly. As long as they use the node-driver-registrar sidecar container, the kubelet will automatically populate the CSINode object for the CSI driver as part of kubelet plugin registration. CSINode has the same name as a node. If the object is missing, it means either there are no CSI Drivers available on the node, or the Kubelet version is low enough that it doesn't create this object. CSINode has an OwnerReference that points to the corresponding node object.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "metadata.name must be the Kubernetes node name." + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.CSINodeSpec", + "description": "spec is the specification of CSINode" + } + }, + "required": [ + "spec" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "storage.k8s.io", + "kind": "CSINode", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.storage.v1beta1.CSINodeDriver": { + "description": "CSINodeDriver holds information about the specification of one CSI driver installed on a node", + "properties": { + "allocatable": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.VolumeNodeResources", + "description": "allocatable represents the volume resources of a node that are available for scheduling." + }, + "name": { + "description": "This is the name of the CSI driver that this object refers to. This MUST be the same name returned by the CSI GetPluginName() call for that driver.", + "type": "string" + }, + "nodeID": { + "description": "nodeID of the node from the driver point of view. This field enables Kubernetes to communicate with storage systems that do not share the same nomenclature for nodes. For example, Kubernetes may refer to a given node as \"node1\", but the storage system may refer to the same node as \"nodeA\". When Kubernetes issues a command to the storage system to attach a volume to a specific node, it can use this field to refer to the node name using the ID that the storage system will understand, e.g. \"nodeA\" instead of \"node1\". This field is required.", + "type": "string" + }, + "topologyKeys": { + "description": "topologyKeys is the list of keys supported by the driver. When a driver is initialized on a cluster, it provides a set of topology keys that it understands (e.g. \"company.com/zone\", \"company.com/region\"). When a driver is initialized on a node, it provides the same topology keys along with values. Kubelet will expose these topology keys as labels on its own node object. When Kubernetes does topology aware provisioning, it can use this list to determine which labels it should retrieve from the node object and pass back to the driver. It is possible for different nodes to use different topology keys. This can be empty if driver does not support topology.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "name", + "nodeID" + ], + "type": "object" + }, + "io.k8s.api.storage.v1beta1.CSINodeList": { + "description": "CSINodeList is a collection of CSINode objects.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "items is the list of CSINode", + "items": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.CSINode" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "storage.k8s.io", + "kind": "CSINodeList", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.storage.v1beta1.CSINodeSpec": { + "description": "CSINodeSpec holds information about the specification of all CSI drivers installed on a node", + "properties": { + "drivers": { + "description": "drivers is a list of information of all CSI Drivers existing on a node. If all drivers in the list are uninstalled, this can become empty.", + "items": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.CSINodeDriver" + }, + "type": "array", + "x-kubernetes-patch-merge-key": "name", + "x-kubernetes-patch-strategy": "merge" + } + }, + "required": [ + "drivers" + ], + "type": "object" + }, + "io.k8s.api.storage.v1beta1.StorageClass": { + "description": "StorageClass describes the parameters for a class of storage for which PersistentVolumes can be dynamically provisioned.\n\nStorageClasses are non-namespaced; the name of the storage class according to etcd is in ObjectMeta.Name.", + "properties": { + "allowVolumeExpansion": { + "description": "AllowVolumeExpansion shows whether the storage class allow volume expand", + "type": "boolean" + }, + "allowedTopologies": { + "description": "Restrict the node topologies where volumes can be dynamically provisioned. Each volume plugin defines its own supported topology specifications. An empty TopologySelectorTerm list means there is no topology restriction. This field is only honored by servers that enable the VolumeScheduling feature.", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.TopologySelectorTerm" + }, + "type": "array" + }, + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "mountOptions": { + "description": "Dynamically provisioned PersistentVolumes of this storage class are created with these mountOptions, e.g. [\"ro\", \"soft\"]. Not validated - mount of the PVs will simply fail if one is invalid.", + "items": { + "type": "string" + }, + "type": "array" + }, + "parameters": { + "additionalProperties": { + "type": "string" + }, + "description": "Parameters holds the parameters for the provisioner that should create volumes of this storage class.", + "type": "object" + }, + "provisioner": { + "description": "Provisioner indicates the type of the provisioner.", + "type": "string" + }, + "reclaimPolicy": { + "description": "Dynamically provisioned PersistentVolumes of this storage class are created with this reclaimPolicy. Defaults to Delete.", + "type": "string" + }, + "volumeBindingMode": { + "description": "VolumeBindingMode indicates how PersistentVolumeClaims should be provisioned and bound. When unset, VolumeBindingImmediate is used. This field is only honored by servers that enable the VolumeScheduling feature.", + "type": "string" + } + }, + "required": [ + "provisioner" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "storage.k8s.io", + "kind": "StorageClass", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.storage.v1beta1.StorageClassList": { + "description": "StorageClassList is a collection of storage classes.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "Items is the list of StorageClasses", + "items": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.StorageClass" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "storage.k8s.io", + "kind": "StorageClassList", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.storage.v1beta1.TokenRequest": { + "description": "TokenRequest contains parameters of a service account token.", + "properties": { + "audience": { + "description": "Audience is the intended audience of the token in \"TokenRequestSpec\". It will default to the audiences of kube apiserver.", + "type": "string" + }, + "expirationSeconds": { + "description": "ExpirationSeconds is the duration of validity of the token in \"TokenRequestSpec\". It has the same default value of \"ExpirationSeconds\" in \"TokenRequestSpec\"", + "format": "int64", + "type": "integer" + } + }, + "required": [ + "audience" + ], + "type": "object" + }, + "io.k8s.api.storage.v1beta1.VolumeAttachment": { + "description": "VolumeAttachment captures the intent to attach or detach the specified volume to/from the specified node.\n\nVolumeAttachment objects are non-namespaced.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "spec": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachmentSpec", + "description": "Specification of the desired attach/detach volume behavior. Populated by the Kubernetes system." + }, + "status": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachmentStatus", + "description": "Status of the VolumeAttachment request. Populated by the entity completing the attach or detach operation, i.e. the external-attacher." + } + }, + "required": [ + "spec" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "storage.k8s.io", + "kind": "VolumeAttachment", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.storage.v1beta1.VolumeAttachmentList": { + "description": "VolumeAttachmentList is a collection of VolumeAttachment objects.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "Items is the list of VolumeAttachments", + "items": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachment" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "storage.k8s.io", + "kind": "VolumeAttachmentList", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.storage.v1beta1.VolumeAttachmentSource": { + "description": "VolumeAttachmentSource represents a volume that should be attached. Right now only PersistenVolumes can be attached via external attacher, in future we may allow also inline volumes in pods. Exactly one member can be set.", + "properties": { + "inlineVolumeSpec": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolumeSpec", + "description": "inlineVolumeSpec contains all the information necessary to attach a persistent volume defined by a pod's inline VolumeSource. This field is populated only for the CSIMigration feature. It contains translated fields from a pod's inline VolumeSource to a PersistentVolumeSpec. This field is alpha-level and is only honored by servers that enabled the CSIMigration feature." + }, + "persistentVolumeName": { + "description": "Name of the persistent volume to attach.", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.api.storage.v1beta1.VolumeAttachmentSpec": { + "description": "VolumeAttachmentSpec is the specification of a VolumeAttachment request.", + "properties": { + "attacher": { + "description": "Attacher indicates the name of the volume driver that MUST handle this request. This is the name returned by GetPluginName().", + "type": "string" + }, + "nodeName": { + "description": "The node that the volume should be attached to.", + "type": "string" + }, + "source": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachmentSource", + "description": "Source represents the volume that should be attached." + } + }, + "required": [ + "attacher", + "source", + "nodeName" + ], + "type": "object" + }, + "io.k8s.api.storage.v1beta1.VolumeAttachmentStatus": { + "description": "VolumeAttachmentStatus is the status of a VolumeAttachment request.", + "properties": { + "attachError": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.VolumeError", + "description": "The last error encountered during attach operation, if any. This field must only be set by the entity completing the attach operation, i.e. the external-attacher." + }, + "attached": { + "description": "Indicates the volume is successfully attached. This field must only be set by the entity completing the attach operation, i.e. the external-attacher.", + "type": "boolean" + }, + "attachmentMetadata": { + "additionalProperties": { + "type": "string" + }, + "description": "Upon successful attach, this field is populated with any information returned by the attach operation that must be passed into subsequent WaitForAttach or Mount calls. This field must only be set by the entity completing the attach operation, i.e. the external-attacher.", + "type": "object" + }, + "detachError": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.VolumeError", + "description": "The last error encountered during detach operation, if any. This field must only be set by the entity completing the detach operation, i.e. the external-attacher." + } + }, + "required": [ + "attached" + ], + "type": "object" + }, + "io.k8s.api.storage.v1beta1.VolumeError": { + "description": "VolumeError captures an error encountered during a volume operation.", + "properties": { + "message": { + "description": "String detailing the error encountered during Attach or Detach operation. This string may be logged, so it should not contain sensitive information.", + "type": "string" + }, + "time": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "Time the error was encountered." + } + }, + "type": "object" + }, + "io.k8s.api.storage.v1beta1.VolumeNodeResources": { + "description": "VolumeNodeResources is a set of resource limits for scheduling of volumes.", + "properties": { + "count": { + "description": "Maximum number of unique volumes managed by the CSI driver that can be used on a node. A volume that is both attached and mounted on a node is considered to be used once, not twice. The same rule applies for a unique volume that is shared among multiple pods on the same node. If this field is nil, then the supported number of volumes on this node is unbounded.", + "format": "int32", + "type": "integer" + } + }, + "type": "object" + }, + "io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceColumnDefinition": { + "description": "CustomResourceColumnDefinition specifies a column for server side printing.", + "properties": { + "description": { + "description": "description is a human readable description of this column.", + "type": "string" + }, + "format": { + "description": "format is an optional OpenAPI type definition for this column. The 'name' format is applied to the primary identifier column to assist in clients identifying column is the resource name. See https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#data-types for details.", + "type": "string" + }, + "jsonPath": { + "description": "jsonPath is a simple JSON path (i.e. with array notation) which is evaluated against each custom resource to produce the value for this column.", + "type": "string" + }, + "name": { + "description": "name is a human readable name for the column.", + "type": "string" + }, + "priority": { + "description": "priority is an integer defining the relative importance of this column compared to others. Lower numbers are considered higher priority. Columns that may be omitted in limited space scenarios should be given a priority greater than 0.", + "format": "int32", + "type": "integer" + }, + "type": { + "description": "type is an OpenAPI type definition for this column. See https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#data-types for details.", + "type": "string" + } + }, + "required": [ + "name", + "type", + "jsonPath" + ], + "type": "object" + }, + "io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceConversion": { + "description": "CustomResourceConversion describes how to convert different versions of a CR.", + "properties": { + "strategy": { + "description": "strategy specifies how custom resources are converted between versions. Allowed values are: - `None`: The converter only change the apiVersion and would not touch any other field in the custom resource. - `Webhook`: API Server will call to an external webhook to do the conversion. Additional information\n is needed for this option. This requires spec.preserveUnknownFields to be false, and spec.conversion.webhook to be set.", + "type": "string" + }, + "webhook": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.WebhookConversion", + "description": "webhook describes how to call the conversion webhook. Required when `strategy` is set to `Webhook`." + } + }, + "required": [ + "strategy" + ], + "type": "object" + }, + "io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinition": { + "description": "CustomResourceDefinition represents a resource that should be exposed on the API server. Its name MUST be in the format \u003c.spec.name\u003e.\u003c.spec.group\u003e.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta" + }, + "spec": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionSpec", + "description": "spec describes how the user wants the resources to appear" + }, + "status": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionStatus", + "description": "status indicates the actual state of the CustomResourceDefinition" + } + }, + "required": [ + "spec" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "apiextensions.k8s.io", + "kind": "CustomResourceDefinition", + "version": "v1" + } + ] + }, + "io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionCondition": { + "description": "CustomResourceDefinitionCondition contains details for the current condition of this pod.", + "properties": { + "lastTransitionTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "lastTransitionTime last time the condition transitioned from one status to another." + }, + "message": { + "description": "message is a human-readable message indicating details about last transition.", + "type": "string" + }, + "reason": { + "description": "reason is a unique, one-word, CamelCase reason for the condition's last transition.", + "type": "string" + }, + "status": { + "description": "status is the status of the condition. Can be True, False, Unknown.", + "type": "string" + }, + "type": { + "description": "type is the type of the condition. Types include Established, NamesAccepted and Terminating.", + "type": "string" + } + }, + "required": [ + "type", + "status" + ], + "type": "object" + }, + "io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionList": { + "description": "CustomResourceDefinitionList is a list of CustomResourceDefinition objects.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "items list individual CustomResourceDefinition objects", + "items": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinition" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "apiextensions.k8s.io", + "kind": "CustomResourceDefinitionList", + "version": "v1" + } + ] + }, + "io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionNames": { + "description": "CustomResourceDefinitionNames indicates the names to serve this CustomResourceDefinition", + "properties": { + "categories": { + "description": "categories is a list of grouped resources this custom resource belongs to (e.g. 'all'). This is published in API discovery documents, and used by clients to support invocations like `kubectl get all`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "kind": { + "description": "kind is the serialized kind of the resource. It is normally CamelCase and singular. Custom resource instances will use this value as the `kind` attribute in API calls.", + "type": "string" + }, + "listKind": { + "description": "listKind is the serialized kind of the list for this resource. Defaults to \"`kind`List\".", + "type": "string" + }, + "plural": { + "description": "plural is the plural name of the resource to serve. The custom resources are served under `/apis/\u003cgroup\u003e/\u003cversion\u003e/.../\u003cplural\u003e`. Must match the name of the CustomResourceDefinition (in the form `\u003cnames.plural\u003e.\u003cgroup\u003e`). Must be all lowercase.", + "type": "string" + }, + "shortNames": { + "description": "shortNames are short names for the resource, exposed in API discovery documents, and used by clients to support invocations like `kubectl get \u003cshortname\u003e`. It must be all lowercase.", + "items": { + "type": "string" + }, + "type": "array" + }, + "singular": { + "description": "singular is the singular name of the resource. It must be all lowercase. Defaults to lowercased `kind`.", + "type": "string" + } + }, + "required": [ + "plural", + "kind" + ], + "type": "object" + }, + "io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionSpec": { + "description": "CustomResourceDefinitionSpec describes how a user wants their resource to appear", + "properties": { + "conversion": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceConversion", + "description": "conversion defines conversion settings for the CRD." + }, + "group": { + "description": "group is the API group of the defined custom resource. The custom resources are served under `/apis/\u003cgroup\u003e/...`. Must match the name of the CustomResourceDefinition (in the form `\u003cnames.plural\u003e.\u003cgroup\u003e`).", + "type": "string" + }, + "names": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionNames", + "description": "names specify the resource and kind names for the custom resource." + }, + "preserveUnknownFields": { + "description": "preserveUnknownFields indicates that object fields which are not specified in the OpenAPI schema should be preserved when persisting to storage. apiVersion, kind, metadata and known fields inside metadata are always preserved. This field is deprecated in favor of setting `x-preserve-unknown-fields` to true in `spec.versions[*].schema.openAPIV3Schema`. See https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/#pruning-versus-preserving-unknown-fields for details.", + "type": "boolean" + }, + "scope": { + "description": "scope indicates whether the defined custom resource is cluster- or namespace-scoped. Allowed values are `Cluster` and `Namespaced`.", + "type": "string" + }, + "versions": { + "description": "versions is the list of all API versions of the defined custom resource. Version names are used to compute the order in which served versions are listed in API discovery. If the version string is \"kube-like\", it will sort above non \"kube-like\" version strings, which are ordered lexicographically. \"Kube-like\" versions start with a \"v\", then are followed by a number (the major version), then optionally the string \"alpha\" or \"beta\" and another number (the minor version). These are sorted first by GA \u003e beta \u003e alpha (where GA is a version with no suffix such as beta or alpha), and then by comparing major version, then minor version. An example sorted list of versions: v10, v2, v1, v11beta2, v10beta3, v3beta1, v12alpha1, v11alpha2, foo1, foo10.", + "items": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionVersion" + }, + "type": "array" + } + }, + "required": [ + "group", + "names", + "scope", + "versions" + ], + "type": "object" + }, + "io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionStatus": { + "description": "CustomResourceDefinitionStatus indicates the state of the CustomResourceDefinition", + "properties": { + "acceptedNames": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionNames", + "description": "acceptedNames are the names that are actually being used to serve discovery. They may be different than the names in spec." + }, + "conditions": { + "description": "conditions indicate state for particular aspects of a CustomResourceDefinition", + "items": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionCondition" + }, + "type": "array" + }, + "storedVersions": { + "description": "storedVersions lists all versions of CustomResources that were ever persisted. Tracking these versions allows a migration path for stored versions in etcd. The field is mutable so a migration controller can finish a migration to another version (ensuring no old objects are left in storage), and then remove the rest of the versions from this list. Versions may not be removed from `spec.versions` while they exist in this list.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionVersion": { + "description": "CustomResourceDefinitionVersion describes a version for CRD.", + "properties": { + "additionalPrinterColumns": { + "description": "additionalPrinterColumns specifies additional columns returned in Table output. See https://kubernetes.io/docs/reference/using-api/api-concepts/#receiving-resources-as-tables for details. If no columns are specified, a single column displaying the age of the custom resource is used.", + "items": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceColumnDefinition" + }, + "type": "array" + }, + "deprecated": { + "description": "deprecated indicates this version of the custom resource API is deprecated. When set to true, API requests to this version receive a warning header in the server response. Defaults to false.", + "type": "boolean" + }, + "deprecationWarning": { + "description": "deprecationWarning overrides the default warning returned to API clients. May only be set when `deprecated` is true. The default warning indicates this version is deprecated and recommends use of the newest served version of equal or greater stability, if one exists.", + "type": "string" + }, + "name": { + "description": "name is the version name, e.g. “v1”, “v2beta1”, etc. The custom resources are served under this version at `/apis/\u003cgroup\u003e/\u003cversion\u003e/...` if `served` is true.", + "type": "string" + }, + "schema": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceValidation", + "description": "schema describes the schema used for validation, pruning, and defaulting of this version of the custom resource." + }, + "served": { + "description": "served is a flag enabling/disabling this version from being served via REST APIs", + "type": "boolean" + }, + "storage": { + "description": "storage indicates this version should be used when persisting custom resources to storage. There must be exactly one version with storage=true.", + "type": "boolean" + }, + "subresources": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceSubresources", + "description": "subresources specify what subresources this version of the defined custom resource have." + } + }, + "required": [ + "name", + "served", + "storage" + ], + "type": "object" + }, + "io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceSubresourceScale": { + "description": "CustomResourceSubresourceScale defines how to serve the scale subresource for CustomResources.", + "properties": { + "labelSelectorPath": { + "description": "labelSelectorPath defines the JSON path inside of a custom resource that corresponds to Scale `status.selector`. Only JSON paths without the array notation are allowed. Must be a JSON Path under `.status` or `.spec`. Must be set to work with HorizontalPodAutoscaler. The field pointed by this JSON path must be a string field (not a complex selector struct) which contains a serialized label selector in string form. More info: https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions#scale-subresource If there is no value under the given path in the custom resource, the `status.selector` value in the `/scale` subresource will default to the empty string.", + "type": "string" + }, + "specReplicasPath": { + "description": "specReplicasPath defines the JSON path inside of a custom resource that corresponds to Scale `spec.replicas`. Only JSON paths without the array notation are allowed. Must be a JSON Path under `.spec`. If there is no value under the given path in the custom resource, the `/scale` subresource will return an error on GET.", + "type": "string" + }, + "statusReplicasPath": { + "description": "statusReplicasPath defines the JSON path inside of a custom resource that corresponds to Scale `status.replicas`. Only JSON paths without the array notation are allowed. Must be a JSON Path under `.status`. If there is no value under the given path in the custom resource, the `status.replicas` value in the `/scale` subresource will default to 0.", + "type": "string" + } + }, + "required": [ + "specReplicasPath", + "statusReplicasPath" + ], + "type": "object" + }, + "io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceSubresourceStatus": { + "description": "CustomResourceSubresourceStatus defines how to serve the status subresource for CustomResources. Status is represented by the `.status` JSON path inside of a CustomResource. When set, * exposes a /status subresource for the custom resource * PUT requests to the /status subresource take a custom resource object, and ignore changes to anything except the status stanza * PUT/POST/PATCH requests to the custom resource ignore changes to the status stanza", + "type": "object" + }, + "io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceSubresources": { + "description": "CustomResourceSubresources defines the status and scale subresources for CustomResources.", + "properties": { + "scale": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceSubresourceScale", + "description": "scale indicates the custom resource should serve a `/scale` subresource that returns an `autoscaling/v1` Scale object." + }, + "status": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceSubresourceStatus", + "description": "status indicates the custom resource should serve a `/status` subresource. When enabled: 1. requests to the custom resource primary endpoint ignore changes to the `status` stanza of the object. 2. requests to the custom resource `/status` subresource ignore changes to anything other than the `status` stanza of the object." + } + }, + "type": "object" + }, + "io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceValidation": { + "description": "CustomResourceValidation is a list of validation methods for CustomResources.", + "properties": { + "openAPIV3Schema": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSONSchemaProps", + "description": "openAPIV3Schema is the OpenAPI v3 schema to use for validation and pruning." + } + }, + "type": "object" + }, + "io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.ExternalDocumentation": { + "description": "ExternalDocumentation allows referencing an external resource for extended documentation.", + "properties": { + "description": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSON": { + "description": "JSON represents any valid JSON value. These types are supported: bool, int64, float64, string, []interface{}, map[string]interface{} and nil." + }, + "io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSONSchemaProps": { + "description": "JSONSchemaProps is a JSON-Schema following Specification Draft 4 (http://json-schema.org/).", + "properties": { + "$ref": { + "type": "string" + }, + "$schema": { + "type": "string" + }, + "additionalItems": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSONSchemaPropsOrBool" + }, + "additionalProperties": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSONSchemaPropsOrBool" + }, + "allOf": { + "items": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSONSchemaProps" + }, + "type": "array" + }, + "anyOf": { + "items": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSONSchemaProps" + }, + "type": "array" + }, + "default": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSON", + "description": "default is a default value for undefined object fields. Defaulting is a beta feature under the CustomResourceDefaulting feature gate. Defaulting requires spec.preserveUnknownFields to be false." + }, + "definitions": { + "additionalProperties": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSONSchemaProps" + }, + "type": "object" + }, + "dependencies": { + "additionalProperties": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSONSchemaPropsOrStringArray" + }, + "type": "object" + }, + "description": { + "type": "string" + }, + "enum": { + "items": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSON" + }, + "type": "array" + }, + "example": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSON" + }, + "exclusiveMaximum": { + "type": "boolean" + }, + "exclusiveMinimum": { + "type": "boolean" + }, + "externalDocs": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.ExternalDocumentation" + }, + "format": { + "description": "format is an OpenAPI v3 format string. Unknown formats are ignored. The following formats are validated:\n\n- bsonobjectid: a bson object ID, i.e. a 24 characters hex string - uri: an URI as parsed by Golang net/url.ParseRequestURI - email: an email address as parsed by Golang net/mail.ParseAddress - hostname: a valid representation for an Internet host name, as defined by RFC 1034, section 3.1 [RFC1034]. - ipv4: an IPv4 IP as parsed by Golang net.ParseIP - ipv6: an IPv6 IP as parsed by Golang net.ParseIP - cidr: a CIDR as parsed by Golang net.ParseCIDR - mac: a MAC address as parsed by Golang net.ParseMAC - uuid: an UUID that allows uppercase defined by the regex (?i)^[0-9a-f]{8}-?[0-9a-f]{4}-?[0-9a-f]{4}-?[0-9a-f]{4}-?[0-9a-f]{12}$ - uuid3: an UUID3 that allows uppercase defined by the regex (?i)^[0-9a-f]{8}-?[0-9a-f]{4}-?3[0-9a-f]{3}-?[0-9a-f]{4}-?[0-9a-f]{12}$ - uuid4: an UUID4 that allows uppercase defined by the regex (?i)^[0-9a-f]{8}-?[0-9a-f]{4}-?4[0-9a-f]{3}-?[89ab][0-9a-f]{3}-?[0-9a-f]{12}$ - uuid5: an UUID5 that allows uppercase defined by the regex (?i)^[0-9a-f]{8}-?[0-9a-f]{4}-?5[0-9a-f]{3}-?[89ab][0-9a-f]{3}-?[0-9a-f]{12}$ - isbn: an ISBN10 or ISBN13 number string like \"0321751043\" or \"978-0321751041\" - isbn10: an ISBN10 number string like \"0321751043\" - isbn13: an ISBN13 number string like \"978-0321751041\" - creditcard: a credit card number defined by the regex ^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\\d{3})\\d{11})$ with any non digit characters mixed in - ssn: a U.S. social security number following the regex ^\\d{3}[- ]?\\d{2}[- ]?\\d{4}$ - hexcolor: an hexadecimal color code like \"#FFFFFF: following the regex ^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$ - rgbcolor: an RGB color code like rgb like \"rgb(255,255,2559\" - byte: base64 encoded binary data - password: any kind of string - date: a date string like \"2006-01-02\" as defined by full-date in RFC3339 - duration: a duration string like \"22 ns\" as parsed by Golang time.ParseDuration or compatible with Scala duration format - datetime: a date time string like \"2014-12-15T19:30:20.000Z\" as defined by date-time in RFC3339.", + "type": "string" + }, + "id": { + "type": "string" + }, + "items": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSONSchemaPropsOrArray" + }, + "maxItems": { + "format": "int64", + "type": "integer" + }, + "maxLength": { + "format": "int64", + "type": "integer" + }, + "maxProperties": { + "format": "int64", + "type": "integer" + }, + "maximum": { + "format": "double", + "type": "number" + }, + "minItems": { + "format": "int64", + "type": "integer" + }, + "minLength": { + "format": "int64", + "type": "integer" + }, + "minProperties": { + "format": "int64", + "type": "integer" + }, + "minimum": { + "format": "double", + "type": "number" + }, + "multipleOf": { + "format": "double", + "type": "number" + }, + "not": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSONSchemaProps" + }, + "nullable": { + "type": "boolean" + }, + "oneOf": { + "items": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSONSchemaProps" + }, + "type": "array" + }, + "pattern": { + "type": "string" + }, + "patternProperties": { + "additionalProperties": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSONSchemaProps" + }, + "type": "object" + }, + "properties": { + "additionalProperties": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSONSchemaProps" + }, + "type": "object" + }, + "required": { + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "uniqueItems": { + "type": "boolean" + }, + "x-kubernetes-embedded-resource": { + "description": "x-kubernetes-embedded-resource defines that the value is an embedded Kubernetes runtime.Object, with TypeMeta and ObjectMeta. The type must be object. It is allowed to further restrict the embedded object. kind, apiVersion and metadata are validated automatically. x-kubernetes-preserve-unknown-fields is allowed to be true, but does not have to be if the object is fully specified (up to kind, apiVersion, metadata).", + "type": "boolean" + }, + "x-kubernetes-int-or-string": { + "description": "x-kubernetes-int-or-string specifies that this value is either an integer or a string. If this is true, an empty type is allowed and type as child of anyOf is permitted if following one of the following patterns:\n\n1) anyOf:\n - type: integer\n - type: string\n2) allOf:\n - anyOf:\n - type: integer\n - type: string\n - ... zero or more", + "type": "boolean" + }, + "x-kubernetes-list-map-keys": { + "description": "x-kubernetes-list-map-keys annotates an array with the x-kubernetes-list-type `map` by specifying the keys used as the index of the map.\n\nThis tag MUST only be used on lists that have the \"x-kubernetes-list-type\" extension set to \"map\". Also, the values specified for this attribute must be a scalar typed field of the child structure (no nesting is supported).\n\nThe properties specified must either be required or have a default value, to ensure those properties are present for all list items.", + "items": { + "type": "string" + }, + "type": "array" + }, + "x-kubernetes-list-type": { + "description": "x-kubernetes-list-type annotates an array to further describe its topology. This extension must only be used on lists and may have 3 possible values:\n\n1) `atomic`: the list is treated as a single entity, like a scalar.\n Atomic lists will be entirely replaced when updated. This extension\n may be used on any type of list (struct, scalar, ...).\n2) `set`:\n Sets are lists that must not have multiple items with the same value. Each\n value must be a scalar, an object with x-kubernetes-map-type `atomic` or an\n array with x-kubernetes-list-type `atomic`.\n3) `map`:\n These lists are like maps in that their elements have a non-index key\n used to identify them. Order is preserved upon merge. The map tag\n must only be used on a list with elements of type object.\nDefaults to atomic for arrays.", + "type": "string" + }, + "x-kubernetes-map-type": { + "description": "x-kubernetes-map-type annotates an object to further describe its topology. This extension must only be used when type is object and may have 2 possible values:\n\n1) `granular`:\n These maps are actual maps (key-value pairs) and each fields are independent\n from each other (they can each be manipulated by separate actors). This is\n the default behaviour for all maps.\n2) `atomic`: the list is treated as a single entity, like a scalar.\n Atomic maps will be entirely replaced when updated.", + "type": "string" + }, + "x-kubernetes-preserve-unknown-fields": { + "description": "x-kubernetes-preserve-unknown-fields stops the API server decoding step from pruning fields which are not specified in the validation schema. This affects fields recursively, but switches back to normal pruning behaviour if nested properties or additionalProperties are specified in the schema. This can either be true or undefined. False is forbidden.", + "type": "boolean" + } + }, + "type": "object" + }, + "io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSONSchemaPropsOrArray": { + "description": "JSONSchemaPropsOrArray represents a value that can either be a JSONSchemaProps or an array of JSONSchemaProps. Mainly here for serialization purposes." + }, + "io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSONSchemaPropsOrBool": { + "description": "JSONSchemaPropsOrBool represents JSONSchemaProps or a boolean value. Defaults to true for the boolean property." + }, + "io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSONSchemaPropsOrStringArray": { + "description": "JSONSchemaPropsOrStringArray represents a JSONSchemaProps or a string array." + }, + "io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.ServiceReference": { + "description": "ServiceReference holds a reference to Service.legacy.k8s.io", + "properties": { + "name": { + "description": "name is the name of the service. Required", + "type": "string" + }, + "namespace": { + "description": "namespace is the namespace of the service. Required", + "type": "string" + }, + "path": { + "description": "path is an optional URL path at which the webhook will be contacted.", + "type": "string" + }, + "port": { + "description": "port is an optional service port at which the webhook will be contacted. `port` should be a valid port number (1-65535, inclusive). Defaults to 443 for backward compatibility.", + "format": "int32", + "type": "integer" + } + }, + "required": [ + "namespace", + "name" + ], + "type": "object" + }, + "io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.WebhookClientConfig": { + "description": "WebhookClientConfig contains the information to make a TLS connection with the webhook.", + "properties": { + "caBundle": { + "description": "caBundle is a PEM encoded CA bundle which will be used to validate the webhook's server certificate. If unspecified, system trust roots on the apiserver are used.", + "format": "byte", + "type": "string" + }, + "service": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.ServiceReference", + "description": "service is a reference to the service for this webhook. Either service or url must be specified.\n\nIf the webhook is running within the cluster, then you should use `service`." + }, + "url": { + "description": "url gives the location of the webhook, in standard URL form (`scheme://host:port/path`). Exactly one of `url` or `service` must be specified.\n\nThe `host` should not refer to a service running in the cluster; use the `service` field instead. The host might be resolved via external DNS in some apiservers (e.g., `kube-apiserver` cannot resolve in-cluster DNS as that would be a layering violation). `host` may also be an IP address.\n\nPlease note that using `localhost` or `127.0.0.1` as a `host` is risky unless you take great care to run this webhook on all hosts which run an apiserver which might need to make calls to this webhook. Such installs are likely to be non-portable, i.e., not easy to turn up in a new cluster.\n\nThe scheme must be \"https\"; the URL must begin with \"https://\".\n\nA path is optional, and if present may be any string permissible in a URL. You may use the path to pass an arbitrary string to the webhook, for example, a cluster identifier.\n\nAttempting to use a user or basic auth e.g. \"user:password@\" is not allowed. Fragments (\"#...\") and query parameters (\"?...\") are not allowed, either.", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.WebhookConversion": { + "description": "WebhookConversion describes how to call a conversion webhook", + "properties": { + "clientConfig": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.WebhookClientConfig", + "description": "clientConfig is the instructions for how to call the webhook if strategy is `Webhook`." + }, + "conversionReviewVersions": { + "description": "conversionReviewVersions is an ordered list of preferred `ConversionReview` versions the Webhook expects. The API server will use the first version in the list which it supports. If none of the versions specified in this list are supported by API server, conversion will fail for the custom resource. If a persisted Webhook configuration specifies allowed versions and does not include any versions known to the API Server, calls to the webhook will fail.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "conversionReviewVersions" + ], + "type": "object" + }, + "io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceColumnDefinition": { + "description": "CustomResourceColumnDefinition specifies a column for server side printing.", + "properties": { + "JSONPath": { + "description": "JSONPath is a simple JSON path (i.e. with array notation) which is evaluated against each custom resource to produce the value for this column.", + "type": "string" + }, + "description": { + "description": "description is a human readable description of this column.", + "type": "string" + }, + "format": { + "description": "format is an optional OpenAPI type definition for this column. The 'name' format is applied to the primary identifier column to assist in clients identifying column is the resource name. See https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#data-types for details.", + "type": "string" + }, + "name": { + "description": "name is a human readable name for the column.", + "type": "string" + }, + "priority": { + "description": "priority is an integer defining the relative importance of this column compared to others. Lower numbers are considered higher priority. Columns that may be omitted in limited space scenarios should be given a priority greater than 0.", + "format": "int32", + "type": "integer" + }, + "type": { + "description": "type is an OpenAPI type definition for this column. See https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#data-types for details.", + "type": "string" + } + }, + "required": [ + "name", + "type", + "JSONPath" + ], + "type": "object" + }, + "io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceConversion": { + "description": "CustomResourceConversion describes how to convert different versions of a CR.", + "properties": { + "conversionReviewVersions": { + "description": "conversionReviewVersions is an ordered list of preferred `ConversionReview` versions the Webhook expects. The API server will use the first version in the list which it supports. If none of the versions specified in this list are supported by API server, conversion will fail for the custom resource. If a persisted Webhook configuration specifies allowed versions and does not include any versions known to the API Server, calls to the webhook will fail. Defaults to `[\"v1beta1\"]`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "strategy": { + "description": "strategy specifies how custom resources are converted between versions. Allowed values are: - `None`: The converter only change the apiVersion and would not touch any other field in the custom resource. - `Webhook`: API Server will call to an external webhook to do the conversion. Additional information\n is needed for this option. This requires spec.preserveUnknownFields to be false, and spec.conversion.webhookClientConfig to be set.", + "type": "string" + }, + "webhookClientConfig": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.WebhookClientConfig", + "description": "webhookClientConfig is the instructions for how to call the webhook if strategy is `Webhook`. Required when `strategy` is set to `Webhook`." + } + }, + "required": [ + "strategy" + ], + "type": "object" + }, + "io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinition": { + "description": "CustomResourceDefinition represents a resource that should be exposed on the API server. Its name MUST be in the format \u003c.spec.name\u003e.\u003c.spec.group\u003e. Deprecated in v1.16, planned for removal in v1.22. Use apiextensions.k8s.io/v1 CustomResourceDefinition instead.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta" + }, + "spec": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionSpec", + "description": "spec describes how the user wants the resources to appear" + }, + "status": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionStatus", + "description": "status indicates the actual state of the CustomResourceDefinition" + } + }, + "required": [ + "spec" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "apiextensions.k8s.io", + "kind": "CustomResourceDefinition", + "version": "v1beta1" + } + ] + }, + "io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionCondition": { + "description": "CustomResourceDefinitionCondition contains details for the current condition of this pod.", + "properties": { + "lastTransitionTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "lastTransitionTime last time the condition transitioned from one status to another." + }, + "message": { + "description": "message is a human-readable message indicating details about last transition.", + "type": "string" + }, + "reason": { + "description": "reason is a unique, one-word, CamelCase reason for the condition's last transition.", + "type": "string" + }, + "status": { + "description": "status is the status of the condition. Can be True, False, Unknown.", + "type": "string" + }, + "type": { + "description": "type is the type of the condition. Types include Established, NamesAccepted and Terminating.", + "type": "string" + } + }, + "required": [ + "type", + "status" + ], + "type": "object" + }, + "io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionList": { + "description": "CustomResourceDefinitionList is a list of CustomResourceDefinition objects.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "items list individual CustomResourceDefinition objects", + "items": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinition" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "apiextensions.k8s.io", + "kind": "CustomResourceDefinitionList", + "version": "v1beta1" + } + ] + }, + "io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionNames": { + "description": "CustomResourceDefinitionNames indicates the names to serve this CustomResourceDefinition", + "properties": { + "categories": { + "description": "categories is a list of grouped resources this custom resource belongs to (e.g. 'all'). This is published in API discovery documents, and used by clients to support invocations like `kubectl get all`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "kind": { + "description": "kind is the serialized kind of the resource. It is normally CamelCase and singular. Custom resource instances will use this value as the `kind` attribute in API calls.", + "type": "string" + }, + "listKind": { + "description": "listKind is the serialized kind of the list for this resource. Defaults to \"`kind`List\".", + "type": "string" + }, + "plural": { + "description": "plural is the plural name of the resource to serve. The custom resources are served under `/apis/\u003cgroup\u003e/\u003cversion\u003e/.../\u003cplural\u003e`. Must match the name of the CustomResourceDefinition (in the form `\u003cnames.plural\u003e.\u003cgroup\u003e`). Must be all lowercase.", + "type": "string" + }, + "shortNames": { + "description": "shortNames are short names for the resource, exposed in API discovery documents, and used by clients to support invocations like `kubectl get \u003cshortname\u003e`. It must be all lowercase.", + "items": { + "type": "string" + }, + "type": "array" + }, + "singular": { + "description": "singular is the singular name of the resource. It must be all lowercase. Defaults to lowercased `kind`.", + "type": "string" + } + }, + "required": [ + "plural", + "kind" + ], + "type": "object" + }, + "io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionSpec": { + "description": "CustomResourceDefinitionSpec describes how a user wants their resource to appear", + "properties": { + "additionalPrinterColumns": { + "description": "additionalPrinterColumns specifies additional columns returned in Table output. See https://kubernetes.io/docs/reference/using-api/api-concepts/#receiving-resources-as-tables for details. If present, this field configures columns for all versions. Top-level and per-version columns are mutually exclusive. If no top-level or per-version columns are specified, a single column displaying the age of the custom resource is used.", + "items": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceColumnDefinition" + }, + "type": "array" + }, + "conversion": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceConversion", + "description": "conversion defines conversion settings for the CRD." + }, + "group": { + "description": "group is the API group of the defined custom resource. The custom resources are served under `/apis/\u003cgroup\u003e/...`. Must match the name of the CustomResourceDefinition (in the form `\u003cnames.plural\u003e.\u003cgroup\u003e`).", + "type": "string" + }, + "names": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionNames", + "description": "names specify the resource and kind names for the custom resource." + }, + "preserveUnknownFields": { + "description": "preserveUnknownFields indicates that object fields which are not specified in the OpenAPI schema should be preserved when persisting to storage. apiVersion, kind, metadata and known fields inside metadata are always preserved. If false, schemas must be defined for all versions. Defaults to true in v1beta for backwards compatibility. Deprecated: will be required to be false in v1. Preservation of unknown fields can be specified in the validation schema using the `x-kubernetes-preserve-unknown-fields: true` extension. See https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/#pruning-versus-preserving-unknown-fields for details.", + "type": "boolean" + }, + "scope": { + "description": "scope indicates whether the defined custom resource is cluster- or namespace-scoped. Allowed values are `Cluster` and `Namespaced`. Default is `Namespaced`.", + "type": "string" + }, + "subresources": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceSubresources", + "description": "subresources specify what subresources the defined custom resource has. If present, this field configures subresources for all versions. Top-level and per-version subresources are mutually exclusive." + }, + "validation": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceValidation", + "description": "validation describes the schema used for validation and pruning of the custom resource. If present, this validation schema is used to validate all versions. Top-level and per-version schemas are mutually exclusive." + }, + "version": { + "description": "version is the API version of the defined custom resource. The custom resources are served under `/apis/\u003cgroup\u003e/\u003cversion\u003e/...`. Must match the name of the first item in the `versions` list if `version` and `versions` are both specified. Optional if `versions` is specified. Deprecated: use `versions` instead.", + "type": "string" + }, + "versions": { + "description": "versions is the list of all API versions of the defined custom resource. Optional if `version` is specified. The name of the first item in the `versions` list must match the `version` field if `version` and `versions` are both specified. Version names are used to compute the order in which served versions are listed in API discovery. If the version string is \"kube-like\", it will sort above non \"kube-like\" version strings, which are ordered lexicographically. \"Kube-like\" versions start with a \"v\", then are followed by a number (the major version), then optionally the string \"alpha\" or \"beta\" and another number (the minor version). These are sorted first by GA \u003e beta \u003e alpha (where GA is a version with no suffix such as beta or alpha), and then by comparing major version, then minor version. An example sorted list of versions: v10, v2, v1, v11beta2, v10beta3, v3beta1, v12alpha1, v11alpha2, foo1, foo10.", + "items": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionVersion" + }, + "type": "array" + } + }, + "required": [ + "group", + "names", + "scope" + ], + "type": "object" + }, + "io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionStatus": { + "description": "CustomResourceDefinitionStatus indicates the state of the CustomResourceDefinition", + "properties": { + "acceptedNames": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionNames", + "description": "acceptedNames are the names that are actually being used to serve discovery. They may be different than the names in spec." + }, + "conditions": { + "description": "conditions indicate state for particular aspects of a CustomResourceDefinition", + "items": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionCondition" + }, + "type": "array" + }, + "storedVersions": { + "description": "storedVersions lists all versions of CustomResources that were ever persisted. Tracking these versions allows a migration path for stored versions in etcd. The field is mutable so a migration controller can finish a migration to another version (ensuring no old objects are left in storage), and then remove the rest of the versions from this list. Versions may not be removed from `spec.versions` while they exist in this list.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionVersion": { + "description": "CustomResourceDefinitionVersion describes a version for CRD.", + "properties": { + "additionalPrinterColumns": { + "description": "additionalPrinterColumns specifies additional columns returned in Table output. See https://kubernetes.io/docs/reference/using-api/api-concepts/#receiving-resources-as-tables for details. Top-level and per-version columns are mutually exclusive. Per-version columns must not all be set to identical values (top-level columns should be used instead). If no top-level or per-version columns are specified, a single column displaying the age of the custom resource is used.", + "items": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceColumnDefinition" + }, + "type": "array" + }, + "deprecated": { + "description": "deprecated indicates this version of the custom resource API is deprecated. When set to true, API requests to this version receive a warning header in the server response. Defaults to false.", + "type": "boolean" + }, + "deprecationWarning": { + "description": "deprecationWarning overrides the default warning returned to API clients. May only be set when `deprecated` is true. The default warning indicates this version is deprecated and recommends use of the newest served version of equal or greater stability, if one exists.", + "type": "string" + }, + "name": { + "description": "name is the version name, e.g. “v1”, “v2beta1”, etc. The custom resources are served under this version at `/apis/\u003cgroup\u003e/\u003cversion\u003e/...` if `served` is true.", + "type": "string" + }, + "schema": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceValidation", + "description": "schema describes the schema used for validation and pruning of this version of the custom resource. Top-level and per-version schemas are mutually exclusive. Per-version schemas must not all be set to identical values (top-level validation schema should be used instead)." + }, + "served": { + "description": "served is a flag enabling/disabling this version from being served via REST APIs", + "type": "boolean" + }, + "storage": { + "description": "storage indicates this version should be used when persisting custom resources to storage. There must be exactly one version with storage=true.", + "type": "boolean" + }, + "subresources": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceSubresources", + "description": "subresources specify what subresources this version of the defined custom resource have. Top-level and per-version subresources are mutually exclusive. Per-version subresources must not all be set to identical values (top-level subresources should be used instead)." + } + }, + "required": [ + "name", + "served", + "storage" + ], + "type": "object" + }, + "io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceSubresourceScale": { + "description": "CustomResourceSubresourceScale defines how to serve the scale subresource for CustomResources.", + "properties": { + "labelSelectorPath": { + "description": "labelSelectorPath defines the JSON path inside of a custom resource that corresponds to Scale `status.selector`. Only JSON paths without the array notation are allowed. Must be a JSON Path under `.status` or `.spec`. Must be set to work with HorizontalPodAutoscaler. The field pointed by this JSON path must be a string field (not a complex selector struct) which contains a serialized label selector in string form. More info: https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions#scale-subresource If there is no value under the given path in the custom resource, the `status.selector` value in the `/scale` subresource will default to the empty string.", + "type": "string" + }, + "specReplicasPath": { + "description": "specReplicasPath defines the JSON path inside of a custom resource that corresponds to Scale `spec.replicas`. Only JSON paths without the array notation are allowed. Must be a JSON Path under `.spec`. If there is no value under the given path in the custom resource, the `/scale` subresource will return an error on GET.", + "type": "string" + }, + "statusReplicasPath": { + "description": "statusReplicasPath defines the JSON path inside of a custom resource that corresponds to Scale `status.replicas`. Only JSON paths without the array notation are allowed. Must be a JSON Path under `.status`. If there is no value under the given path in the custom resource, the `status.replicas` value in the `/scale` subresource will default to 0.", + "type": "string" + } + }, + "required": [ + "specReplicasPath", + "statusReplicasPath" + ], + "type": "object" + }, + "io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceSubresourceStatus": { + "description": "CustomResourceSubresourceStatus defines how to serve the status subresource for CustomResources. Status is represented by the `.status` JSON path inside of a CustomResource. When set, * exposes a /status subresource for the custom resource * PUT requests to the /status subresource take a custom resource object, and ignore changes to anything except the status stanza * PUT/POST/PATCH requests to the custom resource ignore changes to the status stanza", + "type": "object" + }, + "io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceSubresources": { + "description": "CustomResourceSubresources defines the status and scale subresources for CustomResources.", + "properties": { + "scale": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceSubresourceScale", + "description": "scale indicates the custom resource should serve a `/scale` subresource that returns an `autoscaling/v1` Scale object." + }, + "status": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceSubresourceStatus", + "description": "status indicates the custom resource should serve a `/status` subresource. When enabled: 1. requests to the custom resource primary endpoint ignore changes to the `status` stanza of the object. 2. requests to the custom resource `/status` subresource ignore changes to anything other than the `status` stanza of the object." + } + }, + "type": "object" + }, + "io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceValidation": { + "description": "CustomResourceValidation is a list of validation methods for CustomResources.", + "properties": { + "openAPIV3Schema": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaProps", + "description": "openAPIV3Schema is the OpenAPI v3 schema to use for validation and pruning." + } + }, + "type": "object" + }, + "io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.ExternalDocumentation": { + "description": "ExternalDocumentation allows referencing an external resource for extended documentation.", + "properties": { + "description": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSON": { + "description": "JSON represents any valid JSON value. These types are supported: bool, int64, float64, string, []interface{}, map[string]interface{} and nil." + }, + "io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaProps": { + "description": "JSONSchemaProps is a JSON-Schema following Specification Draft 4 (http://json-schema.org/).", + "properties": { + "$ref": { + "type": "string" + }, + "$schema": { + "type": "string" + }, + "additionalItems": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaPropsOrBool" + }, + "additionalProperties": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaPropsOrBool" + }, + "allOf": { + "items": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaProps" + }, + "type": "array" + }, + "anyOf": { + "items": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaProps" + }, + "type": "array" + }, + "default": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSON", + "description": "default is a default value for undefined object fields. Defaulting is a beta feature under the CustomResourceDefaulting feature gate. CustomResourceDefinitions with defaults must be created using the v1 (or newer) CustomResourceDefinition API." + }, + "definitions": { + "additionalProperties": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaProps" + }, + "type": "object" + }, + "dependencies": { + "additionalProperties": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaPropsOrStringArray" + }, + "type": "object" + }, + "description": { + "type": "string" + }, + "enum": { + "items": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSON" + }, + "type": "array" + }, + "example": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSON" + }, + "exclusiveMaximum": { + "type": "boolean" + }, + "exclusiveMinimum": { + "type": "boolean" + }, + "externalDocs": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.ExternalDocumentation" + }, + "format": { + "description": "format is an OpenAPI v3 format string. Unknown formats are ignored. The following formats are validated:\n\n- bsonobjectid: a bson object ID, i.e. a 24 characters hex string - uri: an URI as parsed by Golang net/url.ParseRequestURI - email: an email address as parsed by Golang net/mail.ParseAddress - hostname: a valid representation for an Internet host name, as defined by RFC 1034, section 3.1 [RFC1034]. - ipv4: an IPv4 IP as parsed by Golang net.ParseIP - ipv6: an IPv6 IP as parsed by Golang net.ParseIP - cidr: a CIDR as parsed by Golang net.ParseCIDR - mac: a MAC address as parsed by Golang net.ParseMAC - uuid: an UUID that allows uppercase defined by the regex (?i)^[0-9a-f]{8}-?[0-9a-f]{4}-?[0-9a-f]{4}-?[0-9a-f]{4}-?[0-9a-f]{12}$ - uuid3: an UUID3 that allows uppercase defined by the regex (?i)^[0-9a-f]{8}-?[0-9a-f]{4}-?3[0-9a-f]{3}-?[0-9a-f]{4}-?[0-9a-f]{12}$ - uuid4: an UUID4 that allows uppercase defined by the regex (?i)^[0-9a-f]{8}-?[0-9a-f]{4}-?4[0-9a-f]{3}-?[89ab][0-9a-f]{3}-?[0-9a-f]{12}$ - uuid5: an UUID5 that allows uppercase defined by the regex (?i)^[0-9a-f]{8}-?[0-9a-f]{4}-?5[0-9a-f]{3}-?[89ab][0-9a-f]{3}-?[0-9a-f]{12}$ - isbn: an ISBN10 or ISBN13 number string like \"0321751043\" or \"978-0321751041\" - isbn10: an ISBN10 number string like \"0321751043\" - isbn13: an ISBN13 number string like \"978-0321751041\" - creditcard: a credit card number defined by the regex ^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\\d{3})\\d{11})$ with any non digit characters mixed in - ssn: a U.S. social security number following the regex ^\\d{3}[- ]?\\d{2}[- ]?\\d{4}$ - hexcolor: an hexadecimal color code like \"#FFFFFF: following the regex ^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$ - rgbcolor: an RGB color code like rgb like \"rgb(255,255,2559\" - byte: base64 encoded binary data - password: any kind of string - date: a date string like \"2006-01-02\" as defined by full-date in RFC3339 - duration: a duration string like \"22 ns\" as parsed by Golang time.ParseDuration or compatible with Scala duration format - datetime: a date time string like \"2014-12-15T19:30:20.000Z\" as defined by date-time in RFC3339.", + "type": "string" + }, + "id": { + "type": "string" + }, + "items": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaPropsOrArray" + }, + "maxItems": { + "format": "int64", + "type": "integer" + }, + "maxLength": { + "format": "int64", + "type": "integer" + }, + "maxProperties": { + "format": "int64", + "type": "integer" + }, + "maximum": { + "format": "double", + "type": "number" + }, + "minItems": { + "format": "int64", + "type": "integer" + }, + "minLength": { + "format": "int64", + "type": "integer" + }, + "minProperties": { + "format": "int64", + "type": "integer" + }, + "minimum": { + "format": "double", + "type": "number" + }, + "multipleOf": { + "format": "double", + "type": "number" + }, + "not": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaProps" + }, + "nullable": { + "type": "boolean" + }, + "oneOf": { + "items": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaProps" + }, + "type": "array" + }, + "pattern": { + "type": "string" + }, + "patternProperties": { + "additionalProperties": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaProps" + }, + "type": "object" + }, + "properties": { + "additionalProperties": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaProps" + }, + "type": "object" + }, + "required": { + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "uniqueItems": { + "type": "boolean" + }, + "x-kubernetes-embedded-resource": { + "description": "x-kubernetes-embedded-resource defines that the value is an embedded Kubernetes runtime.Object, with TypeMeta and ObjectMeta. The type must be object. It is allowed to further restrict the embedded object. kind, apiVersion and metadata are validated automatically. x-kubernetes-preserve-unknown-fields is allowed to be true, but does not have to be if the object is fully specified (up to kind, apiVersion, metadata).", + "type": "boolean" + }, + "x-kubernetes-int-or-string": { + "description": "x-kubernetes-int-or-string specifies that this value is either an integer or a string. If this is true, an empty type is allowed and type as child of anyOf is permitted if following one of the following patterns:\n\n1) anyOf:\n - type: integer\n - type: string\n2) allOf:\n - anyOf:\n - type: integer\n - type: string\n - ... zero or more", + "type": "boolean" + }, + "x-kubernetes-list-map-keys": { + "description": "x-kubernetes-list-map-keys annotates an array with the x-kubernetes-list-type `map` by specifying the keys used as the index of the map.\n\nThis tag MUST only be used on lists that have the \"x-kubernetes-list-type\" extension set to \"map\". Also, the values specified for this attribute must be a scalar typed field of the child structure (no nesting is supported).\n\nThe properties specified must either be required or have a default value, to ensure those properties are present for all list items.", + "items": { + "type": "string" + }, + "type": "array" + }, + "x-kubernetes-list-type": { + "description": "x-kubernetes-list-type annotates an array to further describe its topology. This extension must only be used on lists and may have 3 possible values:\n\n1) `atomic`: the list is treated as a single entity, like a scalar.\n Atomic lists will be entirely replaced when updated. This extension\n may be used on any type of list (struct, scalar, ...).\n2) `set`:\n Sets are lists that must not have multiple items with the same value. Each\n value must be a scalar, an object with x-kubernetes-map-type `atomic` or an\n array with x-kubernetes-list-type `atomic`.\n3) `map`:\n These lists are like maps in that their elements have a non-index key\n used to identify them. Order is preserved upon merge. The map tag\n must only be used on a list with elements of type object.\nDefaults to atomic for arrays.", + "type": "string" + }, + "x-kubernetes-map-type": { + "description": "x-kubernetes-map-type annotates an object to further describe its topology. This extension must only be used when type is object and may have 2 possible values:\n\n1) `granular`:\n These maps are actual maps (key-value pairs) and each fields are independent\n from each other (they can each be manipulated by separate actors). This is\n the default behaviour for all maps.\n2) `atomic`: the list is treated as a single entity, like a scalar.\n Atomic maps will be entirely replaced when updated.", + "type": "string" + }, + "x-kubernetes-preserve-unknown-fields": { + "description": "x-kubernetes-preserve-unknown-fields stops the API server decoding step from pruning fields which are not specified in the validation schema. This affects fields recursively, but switches back to normal pruning behaviour if nested properties or additionalProperties are specified in the schema. This can either be true or undefined. False is forbidden.", + "type": "boolean" + } + }, + "type": "object" + }, + "io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaPropsOrArray": { + "description": "JSONSchemaPropsOrArray represents a value that can either be a JSONSchemaProps or an array of JSONSchemaProps. Mainly here for serialization purposes." + }, + "io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaPropsOrBool": { + "description": "JSONSchemaPropsOrBool represents JSONSchemaProps or a boolean value. Defaults to true for the boolean property." + }, + "io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaPropsOrStringArray": { + "description": "JSONSchemaPropsOrStringArray represents a JSONSchemaProps or a string array." + }, + "io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.ServiceReference": { + "description": "ServiceReference holds a reference to Service.legacy.k8s.io", + "properties": { + "name": { + "description": "name is the name of the service. Required", + "type": "string" + }, + "namespace": { + "description": "namespace is the namespace of the service. Required", + "type": "string" + }, + "path": { + "description": "path is an optional URL path at which the webhook will be contacted.", + "type": "string" + }, + "port": { + "description": "port is an optional service port at which the webhook will be contacted. `port` should be a valid port number (1-65535, inclusive). Defaults to 443 for backward compatibility.", + "format": "int32", + "type": "integer" + } + }, + "required": [ + "namespace", + "name" + ], + "type": "object" + }, + "io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.WebhookClientConfig": { + "description": "WebhookClientConfig contains the information to make a TLS connection with the webhook.", + "properties": { + "caBundle": { + "description": "caBundle is a PEM encoded CA bundle which will be used to validate the webhook's server certificate. If unspecified, system trust roots on the apiserver are used.", + "format": "byte", + "type": "string" + }, + "service": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.ServiceReference", + "description": "service is a reference to the service for this webhook. Either service or url must be specified.\n\nIf the webhook is running within the cluster, then you should use `service`." + }, + "url": { + "description": "url gives the location of the webhook, in standard URL form (`scheme://host:port/path`). Exactly one of `url` or `service` must be specified.\n\nThe `host` should not refer to a service running in the cluster; use the `service` field instead. The host might be resolved via external DNS in some apiservers (e.g., `kube-apiserver` cannot resolve in-cluster DNS as that would be a layering violation). `host` may also be an IP address.\n\nPlease note that using `localhost` or `127.0.0.1` as a `host` is risky unless you take great care to run this webhook on all hosts which run an apiserver which might need to make calls to this webhook. Such installs are likely to be non-portable, i.e., not easy to turn up in a new cluster.\n\nThe scheme must be \"https\"; the URL must begin with \"https://\".\n\nA path is optional, and if present may be any string permissible in a URL. You may use the path to pass an arbitrary string to the webhook, for example, a cluster identifier.\n\nAttempting to use a user or basic auth e.g. \"user:password@\" is not allowed. Fragments (\"#...\") and query parameters (\"?...\") are not allowed, either.", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.apimachinery.pkg.api.resource.Quantity": { + "description": "Quantity is a fixed-point representation of a number. It provides convenient marshaling/unmarshaling in JSON and YAML, in addition to String() and AsInt64() accessors.\n\nThe serialization format is:\n\n\u003cquantity\u003e ::= \u003csignedNumber\u003e\u003csuffix\u003e\n (Note that \u003csuffix\u003e may be empty, from the \"\" case in \u003cdecimalSI\u003e.)\n\u003cdigit\u003e ::= 0 | 1 | ... | 9 \u003cdigits\u003e ::= \u003cdigit\u003e | \u003cdigit\u003e\u003cdigits\u003e \u003cnumber\u003e ::= \u003cdigits\u003e | \u003cdigits\u003e.\u003cdigits\u003e | \u003cdigits\u003e. | .\u003cdigits\u003e \u003csign\u003e ::= \"+\" | \"-\" \u003csignedNumber\u003e ::= \u003cnumber\u003e | \u003csign\u003e\u003cnumber\u003e \u003csuffix\u003e ::= \u003cbinarySI\u003e | \u003cdecimalExponent\u003e | \u003cdecimalSI\u003e \u003cbinarySI\u003e ::= Ki | Mi | Gi | Ti | Pi | Ei\n (International System of units; See: http://physics.nist.gov/cuu/Units/binary.html)\n\u003cdecimalSI\u003e ::= m | \"\" | k | M | G | T | P | E\n (Note that 1024 = 1Ki but 1000 = 1k; I didn't choose the capitalization.)\n\u003cdecimalExponent\u003e ::= \"e\" \u003csignedNumber\u003e | \"E\" \u003csignedNumber\u003e\n\nNo matter which of the three exponent forms is used, no quantity may represent a number greater than 2^63-1 in magnitude, nor may it have more than 3 decimal places. Numbers larger or more precise will be capped or rounded up. (E.g.: 0.1m will rounded up to 1m.) This may be extended in the future if we require larger or smaller quantities.\n\nWhen a Quantity is parsed from a string, it will remember the type of suffix it had, and will use the same type again when it is serialized.\n\nBefore serializing, Quantity will be put in \"canonical form\". This means that Exponent/suffix will be adjusted up or down (with a corresponding increase or decrease in Mantissa) such that:\n a. No precision is lost\n b. No fractional digits will be emitted\n c. The exponent (or suffix) is as large as possible.\nThe sign will be omitted unless the number is negative.\n\nExamples:\n 1.5 will be serialized as \"1500m\"\n 1.5Gi will be serialized as \"1536Mi\"\n\nNote that the quantity will NEVER be internally represented by a floating point number. That is the whole point of this exercise.\n\nNon-canonical values will still parse as long as they are well formed, but will be re-emitted in their canonical form. (So always use canonical form, or don't diff.)\n\nThis format is intended to make it difficult to use these numbers without writing some sort of special handling code in the hopes that that will cause implementors to also use a fixed point implementation.", + "type": "string" + }, + "io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup": { + "description": "APIGroup contains the name, the supported versions, and the preferred version of a group.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "name": { + "description": "name is the name of the group.", + "type": "string" + }, + "preferredVersion": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.GroupVersionForDiscovery", + "description": "preferredVersion is the version preferred by the API server, which probably is the storage version." + }, + "serverAddressByClientCIDRs": { + "description": "a map of client CIDR to server address that is serving this group. This is to help clients reach servers in the most network-efficient way possible. Clients can use the appropriate server address as per the CIDR that they match. In case of multiple matches, clients should use the longest matching CIDR. The server returns only those CIDRs that it thinks that the client can match. For example: the master will return an internal IP CIDR only, if the client reaches the server using an internal IP. Server looks at X-Forwarded-For header or X-Real-Ip header or request.RemoteAddr (in that order) to get the client IP.", + "items": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ServerAddressByClientCIDR" + }, + "type": "array" + }, + "versions": { + "description": "versions are the versions supported in this group.", + "items": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.GroupVersionForDiscovery" + }, + "type": "array" + } + }, + "required": [ + "name", + "versions" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "", + "kind": "APIGroup", + "version": "v1" + } + ] + }, + "io.k8s.apimachinery.pkg.apis.meta.v1.APIGroupList": { + "description": "APIGroupList is a list of APIGroup, to allow clients to discover the API at /apis.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "groups": { + "description": "groups is a list of APIGroup.", + "items": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + } + }, + "required": [ + "groups" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "", + "kind": "APIGroupList", + "version": "v1" + } + ] + }, + "io.k8s.apimachinery.pkg.apis.meta.v1.APIResource": { + "description": "APIResource specifies the name of a resource and whether it is namespaced.", + "properties": { + "categories": { + "description": "categories is a list of the grouped resources this resource belongs to (e.g. 'all')", + "items": { + "type": "string" + }, + "type": "array" + }, + "group": { + "description": "group is the preferred group of the resource. Empty implies the group of the containing resource list. For subresources, this may have a different value, for example: Scale\".", + "type": "string" + }, + "kind": { + "description": "kind is the kind for the resource (e.g. 'Foo' is the kind for a resource 'foo')", + "type": "string" + }, + "name": { + "description": "name is the plural name of the resource.", + "type": "string" + }, + "namespaced": { + "description": "namespaced indicates if a resource is namespaced or not.", + "type": "boolean" + }, + "shortNames": { + "description": "shortNames is a list of suggested short names of the resource.", + "items": { + "type": "string" + }, + "type": "array" + }, + "singularName": { + "description": "singularName is the singular name of the resource. This allows clients to handle plural and singular opaquely. The singularName is more correct for reporting status on a single item and both singular and plural are allowed from the kubectl CLI interface.", + "type": "string" + }, + "storageVersionHash": { + "description": "The hash value of the storage version, the version this resource is converted to when written to the data store. Value must be treated as opaque by clients. Only equality comparison on the value is valid. This is an alpha feature and may change or be removed in the future. The field is populated by the apiserver only if the StorageVersionHash feature gate is enabled. This field will remain optional even if it graduates.", + "type": "string" + }, + "verbs": { + "description": "verbs is a list of supported kube verbs (this includes get, list, watch, create, update, patch, delete, deletecollection, and proxy)", + "items": { + "type": "string" + }, + "type": "array" + }, + "version": { + "description": "version is the preferred version of the resource. Empty implies the version of the containing resource list For subresources, this may have a different value, for example: v1 (while inside a v1beta1 version of the core resource's group)\".", + "type": "string" + } + }, + "required": [ + "name", + "singularName", + "namespaced", + "kind", + "verbs" + ], + "type": "object" + }, + "io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList": { + "description": "APIResourceList is a list of APIResource, it is used to expose the name of the resources supported in a specific group and version, and if the resource is namespaced.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "groupVersion": { + "description": "groupVersion is the group and version this APIResourceList is for.", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "resources": { + "description": "resources contains the name of the resources and if they are namespaced.", + "items": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResource" + }, + "type": "array" + } + }, + "required": [ + "groupVersion", + "resources" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "", + "kind": "APIResourceList", + "version": "v1" + } + ] + }, + "io.k8s.apimachinery.pkg.apis.meta.v1.APIVersions": { + "description": "APIVersions lists the versions that are available, to allow clients to discover the API at /api, which is the root path of the legacy v1 API.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "serverAddressByClientCIDRs": { + "description": "a map of client CIDR to server address that is serving this group. This is to help clients reach servers in the most network-efficient way possible. Clients can use the appropriate server address as per the CIDR that they match. In case of multiple matches, clients should use the longest matching CIDR. The server returns only those CIDRs that it thinks that the client can match. For example: the master will return an internal IP CIDR only, if the client reaches the server using an internal IP. Server looks at X-Forwarded-For header or X-Real-Ip header or request.RemoteAddr (in that order) to get the client IP.", + "items": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ServerAddressByClientCIDR" + }, + "type": "array" + }, + "versions": { + "description": "versions are the api versions that are available.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "versions", + "serverAddressByClientCIDRs" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "", + "kind": "APIVersions", + "version": "v1" + } + ] + }, + "io.k8s.apimachinery.pkg.apis.meta.v1.Condition": { + "description": "Condition contains details for one aspect of the current state of this API Resource.", + "properties": { + "lastTransitionTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "lastTransitionTime is the last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable." + }, + "message": { + "description": "message is a human readable message indicating details about the transition. This may be an empty string.", + "type": "string" + }, + "observedGeneration": { + "description": "observedGeneration represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date with respect to the current state of the instance.", + "format": "int64", + "type": "integer" + }, + "reason": { + "description": "reason contains a programmatic identifier indicating the reason for the condition's last transition. Producers of specific condition types may define expected values and meanings for this field, and whether the values are considered a guaranteed API. The value should be a CamelCase string. This field may not be empty.", + "type": "string" + }, + "status": { + "description": "status of the condition, one of True, False, Unknown.", + "type": "string" + }, + "type": { + "description": "type of condition in CamelCase or in foo.example.com/CamelCase.", + "type": "string" + } + }, + "required": [ + "type", + "status", + "lastTransitionTime", + "reason", + "message" + ], + "type": "object" + }, + "io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions": { + "description": "DeleteOptions may be provided when deleting an API object.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "dryRun": { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "items": { + "type": "string" + }, + "type": "array" + }, + "gracePeriodSeconds": { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "format": "int64", + "type": "integer" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "orphanDependents": { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "type": "boolean" + }, + "preconditions": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Preconditions", + "description": "Must be fulfilled before a deletion is carried out. If not possible, a 409 Conflict status will be returned." + }, + "propagationPolicy": { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "type": "string" + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "", + "kind": "DeleteOptions", + "version": "v1" + }, + { + "group": "admission.k8s.io", + "kind": "DeleteOptions", + "version": "v1" + }, + { + "group": "admission.k8s.io", + "kind": "DeleteOptions", + "version": "v1beta1" + }, + { + "group": "admissionregistration.k8s.io", + "kind": "DeleteOptions", + "version": "v1" + }, + { + "group": "admissionregistration.k8s.io", + "kind": "DeleteOptions", + "version": "v1beta1" + }, + { + "group": "apiextensions.k8s.io", + "kind": "DeleteOptions", + "version": "v1" + }, + { + "group": "apiextensions.k8s.io", + "kind": "DeleteOptions", + "version": "v1beta1" + }, + { + "group": "apiregistration.k8s.io", + "kind": "DeleteOptions", + "version": "v1" + }, + { + "group": "apiregistration.k8s.io", + "kind": "DeleteOptions", + "version": "v1beta1" + }, + { + "group": "apps", + "kind": "DeleteOptions", + "version": "v1" + }, + { + "group": "apps", + "kind": "DeleteOptions", + "version": "v1beta1" + }, + { + "group": "apps", + "kind": "DeleteOptions", + "version": "v1beta2" + }, + { + "group": "authentication.k8s.io", + "kind": "DeleteOptions", + "version": "v1" + }, + { + "group": "authentication.k8s.io", + "kind": "DeleteOptions", + "version": "v1beta1" + }, + { + "group": "authorization.k8s.io", + "kind": "DeleteOptions", + "version": "v1" + }, + { + "group": "authorization.k8s.io", + "kind": "DeleteOptions", + "version": "v1beta1" + }, + { + "group": "autoscaling", + "kind": "DeleteOptions", + "version": "v1" + }, + { + "group": "autoscaling", + "kind": "DeleteOptions", + "version": "v2beta1" + }, + { + "group": "autoscaling", + "kind": "DeleteOptions", + "version": "v2beta2" + }, + { + "group": "batch", + "kind": "DeleteOptions", + "version": "v1" + }, + { + "group": "batch", + "kind": "DeleteOptions", + "version": "v1beta1" + }, + { + "group": "batch", + "kind": "DeleteOptions", + "version": "v2alpha1" + }, + { + "group": "certificates.k8s.io", + "kind": "DeleteOptions", + "version": "v1" + }, + { + "group": "certificates.k8s.io", + "kind": "DeleteOptions", + "version": "v1beta1" + }, + { + "group": "coordination.k8s.io", + "kind": "DeleteOptions", + "version": "v1" + }, + { + "group": "coordination.k8s.io", + "kind": "DeleteOptions", + "version": "v1beta1" + }, + { + "group": "discovery.k8s.io", + "kind": "DeleteOptions", + "version": "v1alpha1" + }, + { + "group": "discovery.k8s.io", + "kind": "DeleteOptions", + "version": "v1beta1" + }, + { + "group": "events.k8s.io", + "kind": "DeleteOptions", + "version": "v1" + }, + { + "group": "events.k8s.io", + "kind": "DeleteOptions", + "version": "v1beta1" + }, + { + "group": "extensions", + "kind": "DeleteOptions", + "version": "v1beta1" + }, + { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "DeleteOptions", + "version": "v1alpha1" + }, + { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "DeleteOptions", + "version": "v1beta1" + }, + { + "group": "imagepolicy.k8s.io", + "kind": "DeleteOptions", + "version": "v1alpha1" + }, + { + "group": "internal.apiserver.k8s.io", + "kind": "DeleteOptions", + "version": "v1alpha1" + }, + { + "group": "networking.k8s.io", + "kind": "DeleteOptions", + "version": "v1" + }, + { + "group": "networking.k8s.io", + "kind": "DeleteOptions", + "version": "v1beta1" + }, + { + "group": "node.k8s.io", + "kind": "DeleteOptions", + "version": "v1" + }, + { + "group": "node.k8s.io", + "kind": "DeleteOptions", + "version": "v1alpha1" + }, + { + "group": "node.k8s.io", + "kind": "DeleteOptions", + "version": "v1beta1" + }, + { + "group": "policy", + "kind": "DeleteOptions", + "version": "v1beta1" + }, + { + "group": "rbac.authorization.k8s.io", + "kind": "DeleteOptions", + "version": "v1" + }, + { + "group": "rbac.authorization.k8s.io", + "kind": "DeleteOptions", + "version": "v1alpha1" + }, + { + "group": "rbac.authorization.k8s.io", + "kind": "DeleteOptions", + "version": "v1beta1" + }, + { + "group": "scheduling.k8s.io", + "kind": "DeleteOptions", + "version": "v1" + }, + { + "group": "scheduling.k8s.io", + "kind": "DeleteOptions", + "version": "v1alpha1" + }, + { + "group": "scheduling.k8s.io", + "kind": "DeleteOptions", + "version": "v1beta1" + }, + { + "group": "storage.k8s.io", + "kind": "DeleteOptions", + "version": "v1" + }, + { + "group": "storage.k8s.io", + "kind": "DeleteOptions", + "version": "v1alpha1" + }, + { + "group": "storage.k8s.io", + "kind": "DeleteOptions", + "version": "v1beta1" + } + ] + }, + "io.k8s.apimachinery.pkg.apis.meta.v1.FieldsV1": { + "description": "FieldsV1 stores a set of fields in a data structure like a Trie, in JSON format.\n\nEach key is either a '.' representing the field itself, and will always map to an empty set, or a string representing a sub-field or item. The string will follow one of these four formats: 'f:\u003cname\u003e', where \u003cname\u003e is the name of a field in a struct, or key in a map 'v:\u003cvalue\u003e', where \u003cvalue\u003e is the exact json formatted value of a list item 'i:\u003cindex\u003e', where \u003cindex\u003e is position of a item in a list 'k:\u003ckeys\u003e', where \u003ckeys\u003e is a map of a list item's key fields to their unique values If a key maps to an empty Fields value, the field that key represents is part of the set.\n\nThe exact format is defined in sigs.k8s.io/structured-merge-diff", + "type": "object" + }, + "io.k8s.apimachinery.pkg.apis.meta.v1.GroupVersionForDiscovery": { + "description": "GroupVersion contains the \"group/version\" and \"version\" string of a version. It is made a struct to keep extensibility.", + "properties": { + "groupVersion": { + "description": "groupVersion specifies the API group and version in the form \"group/version\"", + "type": "string" + }, + "version": { + "description": "version specifies the version in the form of \"version\". This is to save the clients the trouble of splitting the GroupVersion.", + "type": "string" + } + }, + "required": [ + "groupVersion", + "version" + ], + "type": "object" + }, + "io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector": { + "description": "A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects.", + "properties": { + "matchExpressions": { + "description": "matchExpressions is a list of label selector requirements. The requirements are ANDed.", + "items": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelectorRequirement" + }, + "type": "array" + }, + "matchLabels": { + "additionalProperties": { + "type": "string" + }, + "description": "matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.", + "type": "object" + } + }, + "type": "object", + "x-kubernetes-map-type": "atomic" + }, + "io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelectorRequirement": { + "description": "A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.", + "properties": { + "key": { + "description": "key is the label key that the selector applies to.", + "type": "string", + "x-kubernetes-patch-merge-key": "key", + "x-kubernetes-patch-strategy": "merge" + }, + "operator": { + "description": "operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.", + "type": "string" + }, + "values": { + "description": "values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "key", + "operator" + ], + "type": "object" + }, + "io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta": { + "description": "ListMeta describes metadata that synthetic resources must have, including lists and various status objects. A resource may have only one of {ObjectMeta, ListMeta}.", + "properties": { + "continue": { + "description": "continue may be set if the user set a limit on the number of items returned, and indicates that the server has more data available. The value is opaque and may be used to issue another request to the endpoint that served this list to retrieve the next set of available objects. Continuing a consistent list may not be possible if the server configuration has changed or more than a few minutes have passed. The resourceVersion field returned when using this continue value will be identical to the value in the first response, unless you have received this token from an error message.", + "type": "string" + }, + "remainingItemCount": { + "description": "remainingItemCount is the number of subsequent items in the list which are not included in this list response. If the list request contained label or field selectors, then the number of remaining items is unknown and the field will be left unset and omitted during serialization. If the list is complete (either because it is not chunking or because this is the last chunk), then there are no more remaining items and this field will be left unset and omitted during serialization. Servers older than v1.15 do not set this field. The intended use of the remainingItemCount is *estimating* the size of a collection. Clients should not rely on the remainingItemCount to be set or to be exact.", + "format": "int64", + "type": "integer" + }, + "resourceVersion": { + "description": "String that identifies the server's internal version of this object that can be used by clients to determine when objects have changed. Value must be treated as opaque by clients and passed unmodified back to the server. Populated by the system. Read-only. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency", + "type": "string" + }, + "selfLink": { + "description": "selfLink is a URL representing this object. Populated by the system. Read-only.\n\nDEPRECATED Kubernetes will stop propagating this field in 1.20 release and the field is planned to be removed in 1.21 release.", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.apimachinery.pkg.apis.meta.v1.ManagedFieldsEntry": { + "description": "ManagedFieldsEntry is a workflow-id, a FieldSet and the group version of the resource that the fieldset applies to.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the version of this resource that this field set applies to. The format is \"group/version\" just like the top-level APIVersion field. It is necessary to track the version of a field set because it cannot be automatically converted.", + "type": "string" + }, + "fieldsType": { + "description": "FieldsType is the discriminator for the different fields format and version. There is currently only one possible value: \"FieldsV1\"", + "type": "string" + }, + "fieldsV1": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.FieldsV1", + "description": "FieldsV1 holds the first JSON version format as described in the \"FieldsV1\" type." + }, + "manager": { + "description": "Manager is an identifier of the workflow managing these fields.", + "type": "string" + }, + "operation": { + "description": "Operation is the type of operation which lead to this ManagedFieldsEntry being created. The only valid values for this field are 'Apply' and 'Update'.", + "type": "string" + }, + "time": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "Time is timestamp of when these fields were set. It should always be empty if Operation is 'Apply'" + } + }, + "type": "object" + }, + "io.k8s.apimachinery.pkg.apis.meta.v1.MicroTime": { + "description": "MicroTime is version of Time with microsecond level precision.", + "format": "date-time", + "type": "string" + }, + "io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta": { + "description": "ObjectMeta is metadata that all persisted resources must have, which includes all objects users must create.", + "properties": { + "annotations": { + "additionalProperties": { + "type": "string" + }, + "description": "Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations", + "type": "object" + }, + "clusterName": { + "description": "The name of the cluster which the object belongs to. This is used to distinguish resources with same name and namespace in different clusters. This field is not set anywhere right now and apiserver is going to ignore it if set in create or update request.", + "type": "string" + }, + "creationTimestamp": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "CreationTimestamp is a timestamp representing the server time when this object was created. It is not guaranteed to be set in happens-before order across separate operations. Clients may not set this value. It is represented in RFC3339 form and is in UTC.\n\nPopulated by the system. Read-only. Null for lists. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "deletionGracePeriodSeconds": { + "description": "Number of seconds allowed for this object to gracefully terminate before it will be removed from the system. Only set when deletionTimestamp is also set. May only be shortened. Read-only.", + "format": "int64", + "type": "integer" + }, + "deletionTimestamp": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "DeletionTimestamp is RFC 3339 date and time at which this resource will be deleted. This field is set by the server when a graceful deletion is requested by the user, and is not directly settable by a client. The resource is expected to be deleted (no longer visible from resource lists, and not reachable by name) after the time in this field, once the finalizers list is empty. As long as the finalizers list contains items, deletion is blocked. Once the deletionTimestamp is set, this value may not be unset or be set further into the future, although it may be shortened or the resource may be deleted prior to this time. For example, a user may request that a pod is deleted in 30 seconds. The Kubelet will react by sending a graceful termination signal to the containers in the pod. After that 30 seconds, the Kubelet will send a hard termination signal (SIGKILL) to the container and after cleanup, remove the pod from the API. In the presence of network partitions, this object may still exist after this timestamp, until an administrator or automated process can determine the resource is fully terminated. If not set, graceful deletion of the object has not been requested.\n\nPopulated by the system when a graceful deletion is requested. Read-only. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "finalizers": { + "description": "Must be empty before the object is deleted from the registry. Each entry is an identifier for the responsible component that will remove the entry from the list. If the deletionTimestamp of the object is non-nil, entries in this list can only be removed. Finalizers may be processed and removed in any order. Order is NOT enforced because it introduces significant risk of stuck finalizers. finalizers is a shared field, any actor with permission can reorder it. If the finalizer list is processed in order, then this can lead to a situation in which the component responsible for the first finalizer in the list is waiting for a signal (field value, external system, or other) produced by a component responsible for a finalizer later in the list, resulting in a deadlock. Without enforced ordering finalizers are free to order amongst themselves and are not vulnerable to ordering changes in the list.", + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-patch-strategy": "merge" + }, + "generateName": { + "description": "GenerateName is an optional prefix, used by the server, to generate a unique name ONLY IF the Name field has not been provided. If this field is used, the name returned to the client will be different than the name passed. This value will also be combined with a unique suffix. The provided value has the same validation rules as the Name field, and may be truncated by the length of the suffix required to make the value unique on the server.\n\nIf this field is specified and the generated name exists, the server will NOT return a 409 - instead, it will either return 201 Created or 500 with Reason ServerTimeout indicating a unique name could not be found in the time allotted, and the client should retry (optionally after the time indicated in the Retry-After header).\n\nApplied only if Name is not specified. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#idempotency", + "type": "string" + }, + "generation": { + "description": "A sequence number representing a specific generation of the desired state. Populated by the system. Read-only.", + "format": "int64", + "type": "integer" + }, + "labels": { + "additionalProperties": { + "type": "string" + }, + "description": "Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels", + "type": "object" + }, + "managedFields": { + "description": "ManagedFields maps workflow-id and version to the set of fields that are managed by that workflow. This is mostly for internal housekeeping, and users typically shouldn't need to set or understand this field. A workflow can be the user's name, a controller's name, or the name of a specific apply path like \"ci-cd\". The set of fields is always in the version that the workflow used when modifying the object.", + "items": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ManagedFieldsEntry" + }, + "type": "array" + }, + "name": { + "description": "Name must be unique within a namespace. Is required when creating resources, although some resources may allow a client to request the generation of an appropriate name automatically. Name is primarily intended for creation idempotence and configuration definition. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/identifiers#names", + "type": "string" + }, + "namespace": { + "description": "Namespace defines the space within which each name must be unique. An empty namespace is equivalent to the \"default\" namespace, but \"default\" is the canonical representation. Not all objects are required to be scoped to a namespace - the value of this field for those objects will be empty.\n\nMust be a DNS_LABEL. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/namespaces", + "type": "string" + }, + "ownerReferences": { + "description": "List of objects depended by this object. If ALL objects in the list have been deleted, this object will be garbage collected. If this object is managed by a controller, then an entry in this list will point to this controller, with the controller field set to true. There cannot be more than one managing controller.", + "items": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.OwnerReference" + }, + "type": "array", + "x-kubernetes-patch-merge-key": "uid", + "x-kubernetes-patch-strategy": "merge" + }, + "resourceVersion": { + "description": "An opaque value that represents the internal version of this object that can be used by clients to determine when objects have changed. May be used for optimistic concurrency, change detection, and the watch operation on a resource or set of resources. Clients must treat these values as opaque and passed unmodified back to the server. They may only be valid for a particular resource or set of resources.\n\nPopulated by the system. Read-only. Value must be treated as opaque by clients and . More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency", + "type": "string" + }, + "selfLink": { + "description": "SelfLink is a URL representing this object. Populated by the system. Read-only.\n\nDEPRECATED Kubernetes will stop propagating this field in 1.20 release and the field is planned to be removed in 1.21 release.", + "type": "string" + }, + "uid": { + "description": "UID is the unique in time and space value for this object. It is typically generated by the server on successful creation of a resource and is not allowed to change on PUT operations.\n\nPopulated by the system. Read-only. More info: http://kubernetes.io/docs/user-guide/identifiers#uids", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.apimachinery.pkg.apis.meta.v1.OwnerReference": { + "description": "OwnerReference contains enough information to let you identify an owning object. An owning object must be in the same namespace as the dependent, or be cluster-scoped, so there is no namespace field.", + "properties": { + "apiVersion": { + "description": "API version of the referent.", + "type": "string" + }, + "blockOwnerDeletion": { + "description": "If true, AND if the owner has the \"foregroundDeletion\" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. Defaults to false. To set this field, a user needs \"delete\" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned.", + "type": "boolean" + }, + "controller": { + "description": "If true, this reference points to the managing controller.", + "type": "boolean" + }, + "kind": { + "description": "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names", + "type": "string" + }, + "uid": { + "description": "UID of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#uids", + "type": "string" + } + }, + "required": [ + "apiVersion", + "kind", + "name", + "uid" + ], + "type": "object" + }, + "io.k8s.apimachinery.pkg.apis.meta.v1.Patch": { + "description": "Patch is provided to give a concrete name and type to the Kubernetes PATCH request body.", + "type": "object" + }, + "io.k8s.apimachinery.pkg.apis.meta.v1.Preconditions": { + "description": "Preconditions must be fulfilled before an operation (update, delete, etc.) is carried out.", + "properties": { + "resourceVersion": { + "description": "Specifies the target ResourceVersion", + "type": "string" + }, + "uid": { + "description": "Specifies the target UID.", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.apimachinery.pkg.apis.meta.v1.ServerAddressByClientCIDR": { + "description": "ServerAddressByClientCIDR helps the client to determine the server address that they should use, depending on the clientCIDR that they match.", + "properties": { + "clientCIDR": { + "description": "The CIDR with which clients can match their IP to figure out the server address that they should use.", + "type": "string" + }, + "serverAddress": { + "description": "Address of this server, suitable for a client that matches the above CIDR. This can be a hostname, hostname:port, IP or IP:port.", + "type": "string" + } + }, + "required": [ + "clientCIDR", + "serverAddress" + ], + "type": "object" + }, + "io.k8s.apimachinery.pkg.apis.meta.v1.Status": { + "description": "Status is a return value for calls that don't return other objects.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "code": { + "description": "Suggested HTTP return code for this status, 0 if not set.", + "format": "int32", + "type": "integer" + }, + "details": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusDetails", + "description": "Extended data associated with the reason. Each reason may define its own extended details. This field is optional and the data returned is not guaranteed to conform to any schema except that defined by the reason type." + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "message": { + "description": "A human-readable description of the status of this operation.", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" + }, + "reason": { + "description": "A machine-readable description of why this operation is in the \"Failure\" status. If this value is empty there is no information available. A Reason clarifies an HTTP status code but does not override it.", + "type": "string" + }, + "status": { + "description": "Status of the operation. One of: \"Success\" or \"Failure\". More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status", + "type": "string" + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "", + "kind": "Status", + "version": "v1" + } + ] + }, + "io.k8s.apimachinery.pkg.apis.meta.v1.StatusCause": { + "description": "StatusCause provides more information about an api.Status failure, including cases when multiple errors are encountered.", + "properties": { + "field": { + "description": "The field of the resource that has caused this error, as named by its JSON serialization. May include dot and postfix notation for nested attributes. Arrays are zero-indexed. Fields may appear more than once in an array of causes due to fields having multiple errors. Optional.\n\nExamples:\n \"name\" - the field \"name\" on the current resource\n \"items[0].name\" - the field \"name\" on the first array entry in \"items\"", + "type": "string" + }, + "message": { + "description": "A human-readable description of the cause of the error. This field may be presented as-is to a reader.", + "type": "string" + }, + "reason": { + "description": "A machine-readable description of the cause of the error. If this value is empty there is no information available.", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.apimachinery.pkg.apis.meta.v1.StatusDetails": { + "description": "StatusDetails is a set of additional properties that MAY be set by the server to provide additional information about a response. The Reason field of a Status object defines what attributes will be set. Clients must ignore fields that do not match the defined type of each attribute, and should assume that any attribute may be empty, invalid, or under defined.", + "properties": { + "causes": { + "description": "The Causes array includes more details associated with the StatusReason failure. Not all StatusReasons may provide detailed causes.", + "items": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.StatusCause" + }, + "type": "array" + }, + "group": { + "description": "The group attribute of the resource associated with the status StatusReason.", + "type": "string" + }, + "kind": { + "description": "The kind attribute of the resource associated with the status StatusReason. On some operations may differ from the requested resource Kind. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "name": { + "description": "The name attribute of the resource associated with the status StatusReason (when there is a single name which can be described).", + "type": "string" + }, + "retryAfterSeconds": { + "description": "If specified, the time in seconds before the operation should be retried. Some errors may indicate the client must take an alternate action - for those errors this field may indicate how long to wait before taking the alternate action.", + "format": "int32", + "type": "integer" + }, + "uid": { + "description": "UID of the resource. (when there is a single resource which can be described). More info: http://kubernetes.io/docs/user-guide/identifiers#uids", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.apimachinery.pkg.apis.meta.v1.Time": { + "description": "Time is a wrapper around time.Time which supports correct marshaling to YAML and JSON. Wrappers are provided for many of the factory methods that the time package offers.", + "format": "date-time", + "type": "string" + }, + "io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent": { + "description": "Event represents a single event to a watched resource.", + "properties": { + "object": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.runtime.RawExtension", + "description": "Object is:\n * If Type is Added or Modified: the new state of the object.\n * If Type is Deleted: the state of the object immediately before deletion.\n * If Type is Error: *Status is recommended; other types may make sense\n depending on context." + }, + "type": { + "type": "string" + } + }, + "required": [ + "type", + "object" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "", + "kind": "WatchEvent", + "version": "v1" + }, + { + "group": "admission.k8s.io", + "kind": "WatchEvent", + "version": "v1" + }, + { + "group": "admission.k8s.io", + "kind": "WatchEvent", + "version": "v1beta1" + }, + { + "group": "admissionregistration.k8s.io", + "kind": "WatchEvent", + "version": "v1" + }, + { + "group": "admissionregistration.k8s.io", + "kind": "WatchEvent", + "version": "v1beta1" + }, + { + "group": "apiextensions.k8s.io", + "kind": "WatchEvent", + "version": "v1" + }, + { + "group": "apiextensions.k8s.io", + "kind": "WatchEvent", + "version": "v1beta1" + }, + { + "group": "apiregistration.k8s.io", + "kind": "WatchEvent", + "version": "v1" + }, + { + "group": "apiregistration.k8s.io", + "kind": "WatchEvent", + "version": "v1beta1" + }, + { + "group": "apps", + "kind": "WatchEvent", + "version": "v1" + }, + { + "group": "apps", + "kind": "WatchEvent", + "version": "v1beta1" + }, + { + "group": "apps", + "kind": "WatchEvent", + "version": "v1beta2" + }, + { + "group": "authentication.k8s.io", + "kind": "WatchEvent", + "version": "v1" + }, + { + "group": "authentication.k8s.io", + "kind": "WatchEvent", + "version": "v1beta1" + }, + { + "group": "authorization.k8s.io", + "kind": "WatchEvent", + "version": "v1" + }, + { + "group": "authorization.k8s.io", + "kind": "WatchEvent", + "version": "v1beta1" + }, + { + "group": "autoscaling", + "kind": "WatchEvent", + "version": "v1" + }, + { + "group": "autoscaling", + "kind": "WatchEvent", + "version": "v2beta1" + }, + { + "group": "autoscaling", + "kind": "WatchEvent", + "version": "v2beta2" + }, + { + "group": "batch", + "kind": "WatchEvent", + "version": "v1" + }, + { + "group": "batch", + "kind": "WatchEvent", + "version": "v1beta1" + }, + { + "group": "batch", + "kind": "WatchEvent", + "version": "v2alpha1" + }, + { + "group": "certificates.k8s.io", + "kind": "WatchEvent", + "version": "v1" + }, + { + "group": "certificates.k8s.io", + "kind": "WatchEvent", + "version": "v1beta1" + }, + { + "group": "coordination.k8s.io", + "kind": "WatchEvent", + "version": "v1" + }, + { + "group": "coordination.k8s.io", + "kind": "WatchEvent", + "version": "v1beta1" + }, + { + "group": "discovery.k8s.io", + "kind": "WatchEvent", + "version": "v1alpha1" + }, + { + "group": "discovery.k8s.io", + "kind": "WatchEvent", + "version": "v1beta1" + }, + { + "group": "events.k8s.io", + "kind": "WatchEvent", + "version": "v1" + }, + { + "group": "events.k8s.io", + "kind": "WatchEvent", + "version": "v1beta1" + }, + { + "group": "extensions", + "kind": "WatchEvent", + "version": "v1beta1" + }, + { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "WatchEvent", + "version": "v1alpha1" + }, + { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "WatchEvent", + "version": "v1beta1" + }, + { + "group": "imagepolicy.k8s.io", + "kind": "WatchEvent", + "version": "v1alpha1" + }, + { + "group": "internal.apiserver.k8s.io", + "kind": "WatchEvent", + "version": "v1alpha1" + }, + { + "group": "networking.k8s.io", + "kind": "WatchEvent", + "version": "v1" + }, + { + "group": "networking.k8s.io", + "kind": "WatchEvent", + "version": "v1beta1" + }, + { + "group": "node.k8s.io", + "kind": "WatchEvent", + "version": "v1" + }, + { + "group": "node.k8s.io", + "kind": "WatchEvent", + "version": "v1alpha1" + }, + { + "group": "node.k8s.io", + "kind": "WatchEvent", + "version": "v1beta1" + }, + { + "group": "policy", + "kind": "WatchEvent", + "version": "v1beta1" + }, + { + "group": "rbac.authorization.k8s.io", + "kind": "WatchEvent", + "version": "v1" + }, + { + "group": "rbac.authorization.k8s.io", + "kind": "WatchEvent", + "version": "v1alpha1" + }, + { + "group": "rbac.authorization.k8s.io", + "kind": "WatchEvent", + "version": "v1beta1" + }, + { + "group": "scheduling.k8s.io", + "kind": "WatchEvent", + "version": "v1" + }, + { + "group": "scheduling.k8s.io", + "kind": "WatchEvent", + "version": "v1alpha1" + }, + { + "group": "scheduling.k8s.io", + "kind": "WatchEvent", + "version": "v1beta1" + }, + { + "group": "storage.k8s.io", + "kind": "WatchEvent", + "version": "v1" + }, + { + "group": "storage.k8s.io", + "kind": "WatchEvent", + "version": "v1alpha1" + }, + { + "group": "storage.k8s.io", + "kind": "WatchEvent", + "version": "v1beta1" + } + ] + }, + "io.k8s.apimachinery.pkg.runtime.RawExtension": { + "description": "RawExtension is used to hold extensions in external versions.\n\nTo use this, make a field which has RawExtension as its type in your external, versioned struct, and Object in your internal struct. You also need to register your various plugin types.\n\n// Internal package: type MyAPIObject struct {\n\truntime.TypeMeta `json:\",inline\"`\n\tMyPlugin runtime.Object `json:\"myPlugin\"`\n} type PluginA struct {\n\tAOption string `json:\"aOption\"`\n}\n\n// External package: type MyAPIObject struct {\n\truntime.TypeMeta `json:\",inline\"`\n\tMyPlugin runtime.RawExtension `json:\"myPlugin\"`\n} type PluginA struct {\n\tAOption string `json:\"aOption\"`\n}\n\n// On the wire, the JSON will look something like this: {\n\t\"kind\":\"MyAPIObject\",\n\t\"apiVersion\":\"v1\",\n\t\"myPlugin\": {\n\t\t\"kind\":\"PluginA\",\n\t\t\"aOption\":\"foo\",\n\t},\n}\n\nSo what happens? Decode first uses json or yaml to unmarshal the serialized data into your external MyAPIObject. That causes the raw JSON to be stored, but not unpacked. The next step is to copy (using pkg/conversion) into the internal struct. The runtime package's DefaultScheme has conversion functions installed which will unpack the JSON stored in RawExtension, turning it into the correct object type, and storing it in the Object. (TODO: In the case where the object is of an unknown type, a runtime.Unknown object will be created and stored.)", + "type": "object" + }, + "io.k8s.apimachinery.pkg.util.intstr.IntOrString": { + "description": "IntOrString is a type that can hold an int32 or a string. When used in JSON or YAML marshalling and unmarshalling, it produces or consumes the inner type. This allows you to have, for example, a JSON field that can accept a name or number.", + "format": "int-or-string", + "type": "string" + }, + "io.k8s.apimachinery.pkg.version.Info": { + "description": "Info contains versioning information. how we'll want to distribute that information.", + "properties": { + "buildDate": { + "type": "string" + }, + "compiler": { + "type": "string" + }, + "gitCommit": { + "type": "string" + }, + "gitTreeState": { + "type": "string" + }, + "gitVersion": { + "type": "string" + }, + "goVersion": { + "type": "string" + }, + "major": { + "type": "string" + }, + "minor": { + "type": "string" + }, + "platform": { + "type": "string" + } + }, + "required": [ + "major", + "minor", + "gitVersion", + "gitCommit", + "gitTreeState", + "buildDate", + "goVersion", + "compiler", + "platform" + ], + "type": "object" + }, + "io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIService": { + "description": "APIService represents a server for a particular GroupVersion. Name must be \"version.group\".", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta" + }, + "spec": { + "$ref": "#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIServiceSpec", + "description": "Spec contains information for locating and communicating with a server" + }, + "status": { + "$ref": "#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIServiceStatus", + "description": "Status contains derived information about an API server" + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "apiregistration.k8s.io", + "kind": "APIService", + "version": "v1" + } + ] + }, + "io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIServiceCondition": { + "description": "APIServiceCondition describes the state of an APIService at a particular point", + "properties": { + "lastTransitionTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "Last time the condition transitioned from one status to another." + }, + "message": { + "description": "Human-readable message indicating details about last transition.", + "type": "string" + }, + "reason": { + "description": "Unique, one-word, CamelCase reason for the condition's last transition.", + "type": "string" + }, + "status": { + "description": "Status is the status of the condition. Can be True, False, Unknown.", + "type": "string" + }, + "type": { + "description": "Type is the type of the condition.", + "type": "string" + } + }, + "required": [ + "type", + "status" + ], + "type": "object" + }, + "io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIServiceList": { + "description": "APIServiceList is a list of APIService objects.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "items": { + "$ref": "#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIService" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "apiregistration.k8s.io", + "kind": "APIServiceList", + "version": "v1" + } + ] + }, + "io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIServiceSpec": { + "description": "APIServiceSpec contains information for locating and communicating with a server. Only https is supported, though you are able to disable certificate verification.", + "properties": { + "caBundle": { + "description": "CABundle is a PEM encoded CA bundle which will be used to validate an API server's serving certificate. If unspecified, system trust roots on the apiserver are used.", + "format": "byte", + "type": "string", + "x-kubernetes-list-type": "atomic" + }, + "group": { + "description": "Group is the API group name this server hosts", + "type": "string" + }, + "groupPriorityMinimum": { + "description": "GroupPriorityMininum is the priority this group should have at least. Higher priority means that the group is preferred by clients over lower priority ones. Note that other versions of this group might specify even higher GroupPriorityMininum values such that the whole group gets a higher priority. The primary sort is based on GroupPriorityMinimum, ordered highest number to lowest (20 before 10). The secondary sort is based on the alphabetical comparison of the name of the object. (v1.bar before v1.foo) We'd recommend something like: *.k8s.io (except extensions) at 18000 and PaaSes (OpenShift, Deis) are recommended to be in the 2000s", + "format": "int32", + "type": "integer" + }, + "insecureSkipTLSVerify": { + "description": "InsecureSkipTLSVerify disables TLS certificate verification when communicating with this server. This is strongly discouraged. You should use the CABundle instead.", + "type": "boolean" + }, + "service": { + "$ref": "#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.ServiceReference", + "description": "Service is a reference to the service for this API server. It must communicate on port 443. If the Service is nil, that means the handling for the API groupversion is handled locally on this server. The call will simply delegate to the normal handler chain to be fulfilled." + }, + "version": { + "description": "Version is the API version this server hosts. For example, \"v1\"", + "type": "string" + }, + "versionPriority": { + "description": "VersionPriority controls the ordering of this API version inside of its group. Must be greater than zero. The primary sort is based on VersionPriority, ordered highest to lowest (20 before 10). Since it's inside of a group, the number can be small, probably in the 10s. In case of equal version priorities, the version string will be used to compute the order inside a group. If the version string is \"kube-like\", it will sort above non \"kube-like\" version strings, which are ordered lexicographically. \"Kube-like\" versions start with a \"v\", then are followed by a number (the major version), then optionally the string \"alpha\" or \"beta\" and another number (the minor version). These are sorted first by GA \u003e beta \u003e alpha (where GA is a version with no suffix such as beta or alpha), and then by comparing major version, then minor version. An example sorted list of versions: v10, v2, v1, v11beta2, v10beta3, v3beta1, v12alpha1, v11alpha2, foo1, foo10.", + "format": "int32", + "type": "integer" + } + }, + "required": [ + "groupPriorityMinimum", + "versionPriority" + ], + "type": "object" + }, + "io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIServiceStatus": { + "description": "APIServiceStatus contains derived information about an API server", + "properties": { + "conditions": { + "description": "Current service state of apiService.", + "items": { + "$ref": "#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIServiceCondition" + }, + "type": "array", + "x-kubernetes-list-map-keys": [ + "type" + ], + "x-kubernetes-list-type": "map", + "x-kubernetes-patch-merge-key": "type", + "x-kubernetes-patch-strategy": "merge" + } + }, + "type": "object" + }, + "io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.ServiceReference": { + "description": "ServiceReference holds a reference to Service.legacy.k8s.io", + "properties": { + "name": { + "description": "Name is the name of the service", + "type": "string" + }, + "namespace": { + "description": "Namespace is the namespace of the service", + "type": "string" + }, + "port": { + "description": "If specified, the port on the service that hosting webhook. Default to 443 for backward compatibility. `port` should be a valid port number (1-65535, inclusive).", + "format": "int32", + "type": "integer" + } + }, + "type": "object" + }, + "io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIService": { + "description": "APIService represents a server for a particular GroupVersion. Name must be \"version.group\".", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta" + }, + "spec": { + "$ref": "#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIServiceSpec", + "description": "Spec contains information for locating and communicating with a server" + }, + "status": { + "$ref": "#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIServiceStatus", + "description": "Status contains derived information about an API server" + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "apiregistration.k8s.io", + "kind": "APIService", + "version": "v1beta1" + } + ] + }, + "io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIServiceCondition": { + "description": "APIServiceCondition describes the state of an APIService at a particular point", + "properties": { + "lastTransitionTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time", + "description": "Last time the condition transitioned from one status to another." + }, + "message": { + "description": "Human-readable message indicating details about last transition.", + "type": "string" + }, + "reason": { + "description": "Unique, one-word, CamelCase reason for the condition's last transition.", + "type": "string" + }, + "status": { + "description": "Status is the status of the condition. Can be True, False, Unknown.", + "type": "string" + }, + "type": { + "description": "Type is the type of the condition.", + "type": "string" + } + }, + "required": [ + "type", + "status" + ], + "type": "object" + }, + "io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIServiceList": { + "description": "APIServiceList is a list of APIService objects.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "items": { + "$ref": "#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIService" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "apiregistration.k8s.io", + "kind": "APIServiceList", + "version": "v1beta1" + } + ] + }, + "io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIServiceSpec": { + "description": "APIServiceSpec contains information for locating and communicating with a server. Only https is supported, though you are able to disable certificate verification.", + "properties": { + "caBundle": { + "description": "CABundle is a PEM encoded CA bundle which will be used to validate an API server's serving certificate. If unspecified, system trust roots on the apiserver are used.", + "format": "byte", + "type": "string", + "x-kubernetes-list-type": "atomic" + }, + "group": { + "description": "Group is the API group name this server hosts", + "type": "string" + }, + "groupPriorityMinimum": { + "description": "GroupPriorityMininum is the priority this group should have at least. Higher priority means that the group is preferred by clients over lower priority ones. Note that other versions of this group might specify even higher GroupPriorityMininum values such that the whole group gets a higher priority. The primary sort is based on GroupPriorityMinimum, ordered highest number to lowest (20 before 10). The secondary sort is based on the alphabetical comparison of the name of the object. (v1.bar before v1.foo) We'd recommend something like: *.k8s.io (except extensions) at 18000 and PaaSes (OpenShift, Deis) are recommended to be in the 2000s", + "format": "int32", + "type": "integer" + }, + "insecureSkipTLSVerify": { + "description": "InsecureSkipTLSVerify disables TLS certificate verification when communicating with this server. This is strongly discouraged. You should use the CABundle instead.", + "type": "boolean" + }, + "service": { + "$ref": "#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.ServiceReference", + "description": "Service is a reference to the service for this API server. It must communicate on port 443. If the Service is nil, that means the handling for the API groupversion is handled locally on this server. The call will simply delegate to the normal handler chain to be fulfilled." + }, + "version": { + "description": "Version is the API version this server hosts. For example, \"v1\"", + "type": "string" + }, + "versionPriority": { + "description": "VersionPriority controls the ordering of this API version inside of its group. Must be greater than zero. The primary sort is based on VersionPriority, ordered highest to lowest (20 before 10). Since it's inside of a group, the number can be small, probably in the 10s. In case of equal version priorities, the version string will be used to compute the order inside a group. If the version string is \"kube-like\", it will sort above non \"kube-like\" version strings, which are ordered lexicographically. \"Kube-like\" versions start with a \"v\", then are followed by a number (the major version), then optionally the string \"alpha\" or \"beta\" and another number (the minor version). These are sorted first by GA \u003e beta \u003e alpha (where GA is a version with no suffix such as beta or alpha), and then by comparing major version, then minor version. An example sorted list of versions: v10, v2, v1, v11beta2, v10beta3, v3beta1, v12alpha1, v11alpha2, foo1, foo10.", + "format": "int32", + "type": "integer" + } + }, + "required": [ + "groupPriorityMinimum", + "versionPriority" + ], + "type": "object" + }, + "io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIServiceStatus": { + "description": "APIServiceStatus contains derived information about an API server", + "properties": { + "conditions": { + "description": "Current service state of apiService.", + "items": { + "$ref": "#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIServiceCondition" + }, + "type": "array", + "x-kubernetes-list-map-keys": [ + "type" + ], + "x-kubernetes-list-type": "map", + "x-kubernetes-patch-merge-key": "type", + "x-kubernetes-patch-strategy": "merge" + } + }, + "type": "object" + }, + "io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.ServiceReference": { + "description": "ServiceReference holds a reference to Service.legacy.k8s.io", + "properties": { + "name": { + "description": "Name is the name of the service", + "type": "string" + }, + "namespace": { + "description": "Namespace is the namespace of the service", + "type": "string" + }, + "port": { + "description": "If specified, the port on the service that hosting webhook. Default to 443 for backward compatibility. `port` should be a valid port number (1-65535, inclusive).", + "format": "int32", + "type": "integer" + } + }, + "type": "object" + } + }, + "info": { + "title": "Kubernetes", + "version": "v1.20.4" + }, + "paths": { + "/.well-known/openid-configuration/": { + "get": { + "description": "get service account issuer OpenID configuration, also known as the 'OIDC discovery doc'", + "operationId": "getServiceAccountIssuerOpenIDConfiguration", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "WellKnown" + ] + } + }, + "/api/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get available API versions", + "operationId": "getCoreAPIVersions", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIVersions" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core" + ] + } + }, + "/api/v1/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get available resources", + "operationId": "getCoreV1APIResources", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ] + } + }, + "/api/v1/componentstatuses": { + "get": { + "consumes": [ + "*/*" + ], + "description": "list objects of kind ComponentStatus", + "operationId": "listCoreV1ComponentStatus", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ComponentStatusList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ComponentStatus", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/componentstatuses/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified ComponentStatus", + "operationId": "readCoreV1ComponentStatus", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ComponentStatus" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ComponentStatus", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the ComponentStatus", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ] + }, + "/api/v1/configmaps": { + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind ConfigMap", + "operationId": "listCoreV1ConfigMapForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ConfigMapList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ConfigMap", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/endpoints": { + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind Endpoints", + "operationId": "listCoreV1EndpointsForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.EndpointsList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Endpoints", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/events": { + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind Event", + "operationId": "listCoreV1EventForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.EventList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Event", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/limitranges": { + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind LimitRange", + "operationId": "listCoreV1LimitRangeForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.LimitRangeList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "LimitRange", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/namespaces": { + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind Namespace", + "operationId": "listCoreV1Namespace", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.NamespaceList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Namespace", + "version": "v1" + } + }, + "parameters": [ + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a Namespace", + "operationId": "createCoreV1Namespace", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Namespace" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Namespace" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Namespace" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Namespace" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Namespace", + "version": "v1" + } + } + }, + "/api/v1/namespaces/{namespace}/bindings": { + "parameters": [ + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a Binding", + "operationId": "createCoreV1NamespacedBinding", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Binding" + } + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Binding" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Binding" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Binding" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Binding", + "version": "v1" + } + } + }, + "/api/v1/namespaces/{namespace}/configmaps": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of ConfigMap", + "operationId": "deleteCoreV1CollectionNamespacedConfigMap", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ConfigMap", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind ConfigMap", + "operationId": "listCoreV1NamespacedConfigMap", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ConfigMapList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ConfigMap", + "version": "v1" + } + }, + "parameters": [ + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a ConfigMap", + "operationId": "createCoreV1NamespacedConfigMap", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ConfigMap" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ConfigMap" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ConfigMap" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ConfigMap" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ConfigMap", + "version": "v1" + } + } + }, + "/api/v1/namespaces/{namespace}/configmaps/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a ConfigMap", + "operationId": "deleteCoreV1NamespacedConfigMap", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ConfigMap", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified ConfigMap", + "operationId": "readCoreV1NamespacedConfigMap", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ConfigMap" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ConfigMap", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the ConfigMap", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified ConfigMap", + "operationId": "patchCoreV1NamespacedConfigMap", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ConfigMap" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ConfigMap", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified ConfigMap", + "operationId": "replaceCoreV1NamespacedConfigMap", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ConfigMap" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ConfigMap" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ConfigMap" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ConfigMap", + "version": "v1" + } + } + }, + "/api/v1/namespaces/{namespace}/endpoints": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of Endpoints", + "operationId": "deleteCoreV1CollectionNamespacedEndpoints", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Endpoints", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind Endpoints", + "operationId": "listCoreV1NamespacedEndpoints", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.EndpointsList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Endpoints", + "version": "v1" + } + }, + "parameters": [ + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create Endpoints", + "operationId": "createCoreV1NamespacedEndpoints", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Endpoints" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Endpoints" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Endpoints" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Endpoints" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Endpoints", + "version": "v1" + } + } + }, + "/api/v1/namespaces/{namespace}/endpoints/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete Endpoints", + "operationId": "deleteCoreV1NamespacedEndpoints", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Endpoints", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified Endpoints", + "operationId": "readCoreV1NamespacedEndpoints", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Endpoints" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Endpoints", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the Endpoints", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified Endpoints", + "operationId": "patchCoreV1NamespacedEndpoints", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Endpoints" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Endpoints", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified Endpoints", + "operationId": "replaceCoreV1NamespacedEndpoints", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Endpoints" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Endpoints" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Endpoints" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Endpoints", + "version": "v1" + } + } + }, + "/api/v1/namespaces/{namespace}/events": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of Event", + "operationId": "deleteCoreV1CollectionNamespacedEvent", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Event", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind Event", + "operationId": "listCoreV1NamespacedEvent", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.EventList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Event", + "version": "v1" + } + }, + "parameters": [ + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create an Event", + "operationId": "createCoreV1NamespacedEvent", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Event" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Event" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Event" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Event" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Event", + "version": "v1" + } + } + }, + "/api/v1/namespaces/{namespace}/events/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete an Event", + "operationId": "deleteCoreV1NamespacedEvent", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Event", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified Event", + "operationId": "readCoreV1NamespacedEvent", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Event" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Event", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the Event", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified Event", + "operationId": "patchCoreV1NamespacedEvent", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Event" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Event", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified Event", + "operationId": "replaceCoreV1NamespacedEvent", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Event" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Event" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Event" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Event", + "version": "v1" + } + } + }, + "/api/v1/namespaces/{namespace}/limitranges": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of LimitRange", + "operationId": "deleteCoreV1CollectionNamespacedLimitRange", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "LimitRange", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind LimitRange", + "operationId": "listCoreV1NamespacedLimitRange", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.LimitRangeList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "LimitRange", + "version": "v1" + } + }, + "parameters": [ + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a LimitRange", + "operationId": "createCoreV1NamespacedLimitRange", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.LimitRange" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.LimitRange" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.LimitRange" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.LimitRange" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "LimitRange", + "version": "v1" + } + } + }, + "/api/v1/namespaces/{namespace}/limitranges/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a LimitRange", + "operationId": "deleteCoreV1NamespacedLimitRange", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "LimitRange", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified LimitRange", + "operationId": "readCoreV1NamespacedLimitRange", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.LimitRange" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "LimitRange", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the LimitRange", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified LimitRange", + "operationId": "patchCoreV1NamespacedLimitRange", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.LimitRange" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "LimitRange", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified LimitRange", + "operationId": "replaceCoreV1NamespacedLimitRange", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.LimitRange" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.LimitRange" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.LimitRange" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "LimitRange", + "version": "v1" + } + } + }, + "/api/v1/namespaces/{namespace}/persistentvolumeclaims": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of PersistentVolumeClaim", + "operationId": "deleteCoreV1CollectionNamespacedPersistentVolumeClaim", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PersistentVolumeClaim", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind PersistentVolumeClaim", + "operationId": "listCoreV1NamespacedPersistentVolumeClaim", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolumeClaimList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PersistentVolumeClaim", + "version": "v1" + } + }, + "parameters": [ + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a PersistentVolumeClaim", + "operationId": "createCoreV1NamespacedPersistentVolumeClaim", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolumeClaim" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolumeClaim" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolumeClaim" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolumeClaim" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PersistentVolumeClaim", + "version": "v1" + } + } + }, + "/api/v1/namespaces/{namespace}/persistentvolumeclaims/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a PersistentVolumeClaim", + "operationId": "deleteCoreV1NamespacedPersistentVolumeClaim", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolumeClaim" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolumeClaim" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PersistentVolumeClaim", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified PersistentVolumeClaim", + "operationId": "readCoreV1NamespacedPersistentVolumeClaim", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolumeClaim" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PersistentVolumeClaim", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the PersistentVolumeClaim", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified PersistentVolumeClaim", + "operationId": "patchCoreV1NamespacedPersistentVolumeClaim", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolumeClaim" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PersistentVolumeClaim", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified PersistentVolumeClaim", + "operationId": "replaceCoreV1NamespacedPersistentVolumeClaim", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolumeClaim" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolumeClaim" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolumeClaim" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PersistentVolumeClaim", + "version": "v1" + } + } + }, + "/api/v1/namespaces/{namespace}/persistentvolumeclaims/{name}/status": { + "get": { + "consumes": [ + "*/*" + ], + "description": "read status of the specified PersistentVolumeClaim", + "operationId": "readCoreV1NamespacedPersistentVolumeClaimStatus", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolumeClaim" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PersistentVolumeClaim", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the PersistentVolumeClaim", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update status of the specified PersistentVolumeClaim", + "operationId": "patchCoreV1NamespacedPersistentVolumeClaimStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolumeClaim" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PersistentVolumeClaim", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace status of the specified PersistentVolumeClaim", + "operationId": "replaceCoreV1NamespacedPersistentVolumeClaimStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolumeClaim" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolumeClaim" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolumeClaim" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PersistentVolumeClaim", + "version": "v1" + } + } + }, + "/api/v1/namespaces/{namespace}/pods": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of Pod", + "operationId": "deleteCoreV1CollectionNamespacedPod", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Pod", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind Pod", + "operationId": "listCoreV1NamespacedPod", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PodList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Pod", + "version": "v1" + } + }, + "parameters": [ + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a Pod", + "operationId": "createCoreV1NamespacedPod", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Pod" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Pod" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Pod" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Pod" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Pod", + "version": "v1" + } + } + }, + "/api/v1/namespaces/{namespace}/pods/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a Pod", + "operationId": "deleteCoreV1NamespacedPod", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Pod" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Pod" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Pod", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified Pod", + "operationId": "readCoreV1NamespacedPod", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Pod" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Pod", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the Pod", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified Pod", + "operationId": "patchCoreV1NamespacedPod", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Pod" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Pod", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified Pod", + "operationId": "replaceCoreV1NamespacedPod", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Pod" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Pod" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Pod" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Pod", + "version": "v1" + } + } + }, + "/api/v1/namespaces/{namespace}/pods/{name}/attach": { + "get": { + "consumes": [ + "*/*" + ], + "description": "connect GET requests to attach of Pod", + "operationId": "connectCoreV1GetNamespacedPodAttach", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PodAttachOptions", + "version": "v1" + } + }, + "parameters": [ + { + "description": "The container in which to execute the command. Defaults to only container if there is only one container in the pod.", + "in": "query", + "name": "container", + "type": "string", + "uniqueItems": true + }, + { + "description": "name of the PodAttachOptions", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "Stderr if true indicates that stderr is to be redirected for the attach call. Defaults to true.", + "in": "query", + "name": "stderr", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Stdin if true, redirects the standard input stream of the pod for this call. Defaults to false.", + "in": "query", + "name": "stdin", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Stdout if true indicates that stdout is to be redirected for the attach call. Defaults to true.", + "in": "query", + "name": "stdout", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "TTY if true indicates that a tty will be allocated for the attach call. This is passed through the container runtime so the tty is allocated on the worker node by the container runtime. Defaults to false.", + "in": "query", + "name": "tty", + "type": "boolean", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "connect POST requests to attach of Pod", + "operationId": "connectCoreV1PostNamespacedPodAttach", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PodAttachOptions", + "version": "v1" + } + } + }, + "/api/v1/namespaces/{namespace}/pods/{name}/binding": { + "parameters": [ + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "name of the Binding", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create binding of a Pod", + "operationId": "createCoreV1NamespacedPodBinding", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Binding" + } + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Binding" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Binding" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Binding" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Binding", + "version": "v1" + } + } + }, + "/api/v1/namespaces/{namespace}/pods/{name}/eviction": { + "parameters": [ + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "name of the Eviction", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create eviction of a Pod", + "operationId": "createCoreV1NamespacedPodEviction", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.Eviction" + } + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.Eviction" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.Eviction" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.Eviction" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "policy", + "kind": "Eviction", + "version": "v1beta1" + } + } + }, + "/api/v1/namespaces/{namespace}/pods/{name}/exec": { + "get": { + "consumes": [ + "*/*" + ], + "description": "connect GET requests to exec of Pod", + "operationId": "connectCoreV1GetNamespacedPodExec", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PodExecOptions", + "version": "v1" + } + }, + "parameters": [ + { + "description": "Command is the remote command to execute. argv array. Not executed within a shell.", + "in": "query", + "name": "command", + "type": "string", + "uniqueItems": true + }, + { + "description": "Container in which to execute the command. Defaults to only container if there is only one container in the pod.", + "in": "query", + "name": "container", + "type": "string", + "uniqueItems": true + }, + { + "description": "name of the PodExecOptions", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "Redirect the standard error stream of the pod for this call. Defaults to true.", + "in": "query", + "name": "stderr", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Redirect the standard input stream of the pod for this call. Defaults to false.", + "in": "query", + "name": "stdin", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Redirect the standard output stream of the pod for this call. Defaults to true.", + "in": "query", + "name": "stdout", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "TTY if true indicates that a tty will be allocated for the exec call. Defaults to false.", + "in": "query", + "name": "tty", + "type": "boolean", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "connect POST requests to exec of Pod", + "operationId": "connectCoreV1PostNamespacedPodExec", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PodExecOptions", + "version": "v1" + } + } + }, + "/api/v1/namespaces/{namespace}/pods/{name}/log": { + "get": { + "consumes": [ + "*/*" + ], + "description": "read log of the specified Pod", + "operationId": "readCoreV1NamespacedPodLog", + "produces": [ + "text/plain", + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Pod", + "version": "v1" + } + }, + "parameters": [ + { + "description": "The container for which to stream logs. Defaults to only container if there is one container in the pod.", + "in": "query", + "name": "container", + "type": "string", + "uniqueItems": true + }, + { + "description": "Follow the log stream of the pod. Defaults to false.", + "in": "query", + "name": "follow", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "insecureSkipTLSVerifyBackend indicates that the apiserver should not confirm the validity of the serving certificate of the backend it is connecting to. This will make the HTTPS connection between the apiserver and the backend insecure. This means the apiserver cannot verify the log data it is receiving came from the real kubelet. If the kubelet is configured to verify the apiserver's TLS credentials, it does not mean the connection to the real kubelet is vulnerable to a man in the middle attack (e.g. an attacker could not intercept the actual log data coming from the real kubelet).", + "in": "query", + "name": "insecureSkipTLSVerifyBackend", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "If set, the number of bytes to read from the server before terminating the log output. This may not display a complete final line of logging, and may return slightly more or slightly less than the specified limit.", + "in": "query", + "name": "limitBytes", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the Pod", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "Return previous terminated container logs. Defaults to false.", + "in": "query", + "name": "previous", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "A relative time in seconds before the current time from which to show logs. If this value precedes the time a pod was started, only logs since the pod start will be returned. If this value is in the future, no logs will be returned. Only one of sinceSeconds or sinceTime may be specified.", + "in": "query", + "name": "sinceSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If set, the number of lines from the end of the logs to show. If not specified, logs are shown from the creation of the container or sinceSeconds or sinceTime", + "in": "query", + "name": "tailLines", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If true, add an RFC3339 or RFC3339Nano timestamp at the beginning of every line of log output. Defaults to false.", + "in": "query", + "name": "timestamps", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/namespaces/{namespace}/pods/{name}/portforward": { + "get": { + "consumes": [ + "*/*" + ], + "description": "connect GET requests to portforward of Pod", + "operationId": "connectCoreV1GetNamespacedPodPortforward", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PodPortForwardOptions", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the PodPortForwardOptions", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "List of ports to forward Required when using WebSockets", + "in": "query", + "name": "ports", + "type": "integer", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "connect POST requests to portforward of Pod", + "operationId": "connectCoreV1PostNamespacedPodPortforward", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PodPortForwardOptions", + "version": "v1" + } + } + }, + "/api/v1/namespaces/{namespace}/pods/{name}/proxy": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "connect DELETE requests to proxy of Pod", + "operationId": "connectCoreV1DeleteNamespacedPodProxy", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PodProxyOptions", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "connect GET requests to proxy of Pod", + "operationId": "connectCoreV1GetNamespacedPodProxy", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PodProxyOptions", + "version": "v1" + } + }, + "head": { + "consumes": [ + "*/*" + ], + "description": "connect HEAD requests to proxy of Pod", + "operationId": "connectCoreV1HeadNamespacedPodProxy", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PodProxyOptions", + "version": "v1" + } + }, + "options": { + "consumes": [ + "*/*" + ], + "description": "connect OPTIONS requests to proxy of Pod", + "operationId": "connectCoreV1OptionsNamespacedPodProxy", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PodProxyOptions", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the PodProxyOptions", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "Path is the URL path to use for the current proxy request to pod.", + "in": "query", + "name": "path", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "*/*" + ], + "description": "connect PATCH requests to proxy of Pod", + "operationId": "connectCoreV1PatchNamespacedPodProxy", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PodProxyOptions", + "version": "v1" + } + }, + "post": { + "consumes": [ + "*/*" + ], + "description": "connect POST requests to proxy of Pod", + "operationId": "connectCoreV1PostNamespacedPodProxy", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PodProxyOptions", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "connect PUT requests to proxy of Pod", + "operationId": "connectCoreV1PutNamespacedPodProxy", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PodProxyOptions", + "version": "v1" + } + } + }, + "/api/v1/namespaces/{namespace}/pods/{name}/proxy/{path}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "connect DELETE requests to proxy of Pod", + "operationId": "connectCoreV1DeleteNamespacedPodProxyWithPath", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PodProxyOptions", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "connect GET requests to proxy of Pod", + "operationId": "connectCoreV1GetNamespacedPodProxyWithPath", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PodProxyOptions", + "version": "v1" + } + }, + "head": { + "consumes": [ + "*/*" + ], + "description": "connect HEAD requests to proxy of Pod", + "operationId": "connectCoreV1HeadNamespacedPodProxyWithPath", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PodProxyOptions", + "version": "v1" + } + }, + "options": { + "consumes": [ + "*/*" + ], + "description": "connect OPTIONS requests to proxy of Pod", + "operationId": "connectCoreV1OptionsNamespacedPodProxyWithPath", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PodProxyOptions", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the PodProxyOptions", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "path to the resource", + "in": "path", + "name": "path", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "Path is the URL path to use for the current proxy request to pod.", + "in": "query", + "name": "path", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "*/*" + ], + "description": "connect PATCH requests to proxy of Pod", + "operationId": "connectCoreV1PatchNamespacedPodProxyWithPath", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PodProxyOptions", + "version": "v1" + } + }, + "post": { + "consumes": [ + "*/*" + ], + "description": "connect POST requests to proxy of Pod", + "operationId": "connectCoreV1PostNamespacedPodProxyWithPath", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PodProxyOptions", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "connect PUT requests to proxy of Pod", + "operationId": "connectCoreV1PutNamespacedPodProxyWithPath", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PodProxyOptions", + "version": "v1" + } + } + }, + "/api/v1/namespaces/{namespace}/pods/{name}/status": { + "get": { + "consumes": [ + "*/*" + ], + "description": "read status of the specified Pod", + "operationId": "readCoreV1NamespacedPodStatus", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Pod" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Pod", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the Pod", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update status of the specified Pod", + "operationId": "patchCoreV1NamespacedPodStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Pod" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Pod", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace status of the specified Pod", + "operationId": "replaceCoreV1NamespacedPodStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Pod" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Pod" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Pod" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Pod", + "version": "v1" + } + } + }, + "/api/v1/namespaces/{namespace}/podtemplates": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of PodTemplate", + "operationId": "deleteCoreV1CollectionNamespacedPodTemplate", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PodTemplate", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind PodTemplate", + "operationId": "listCoreV1NamespacedPodTemplate", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PodTemplateList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PodTemplate", + "version": "v1" + } + }, + "parameters": [ + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a PodTemplate", + "operationId": "createCoreV1NamespacedPodTemplate", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PodTemplate" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PodTemplate" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PodTemplate" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PodTemplate" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PodTemplate", + "version": "v1" + } + } + }, + "/api/v1/namespaces/{namespace}/podtemplates/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a PodTemplate", + "operationId": "deleteCoreV1NamespacedPodTemplate", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PodTemplate" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PodTemplate" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PodTemplate", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified PodTemplate", + "operationId": "readCoreV1NamespacedPodTemplate", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PodTemplate" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PodTemplate", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the PodTemplate", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified PodTemplate", + "operationId": "patchCoreV1NamespacedPodTemplate", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PodTemplate" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PodTemplate", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified PodTemplate", + "operationId": "replaceCoreV1NamespacedPodTemplate", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PodTemplate" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PodTemplate" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PodTemplate" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PodTemplate", + "version": "v1" + } + } + }, + "/api/v1/namespaces/{namespace}/replicationcontrollers": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of ReplicationController", + "operationId": "deleteCoreV1CollectionNamespacedReplicationController", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ReplicationController", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind ReplicationController", + "operationId": "listCoreV1NamespacedReplicationController", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ReplicationControllerList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ReplicationController", + "version": "v1" + } + }, + "parameters": [ + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a ReplicationController", + "operationId": "createCoreV1NamespacedReplicationController", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ReplicationController" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ReplicationController" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ReplicationController" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ReplicationController" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ReplicationController", + "version": "v1" + } + } + }, + "/api/v1/namespaces/{namespace}/replicationcontrollers/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a ReplicationController", + "operationId": "deleteCoreV1NamespacedReplicationController", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ReplicationController", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified ReplicationController", + "operationId": "readCoreV1NamespacedReplicationController", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ReplicationController" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ReplicationController", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the ReplicationController", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified ReplicationController", + "operationId": "patchCoreV1NamespacedReplicationController", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ReplicationController" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ReplicationController", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified ReplicationController", + "operationId": "replaceCoreV1NamespacedReplicationController", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ReplicationController" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ReplicationController" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ReplicationController" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ReplicationController", + "version": "v1" + } + } + }, + "/api/v1/namespaces/{namespace}/replicationcontrollers/{name}/scale": { + "get": { + "consumes": [ + "*/*" + ], + "description": "read scale of the specified ReplicationController", + "operationId": "readCoreV1NamespacedReplicationControllerScale", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v1.Scale" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "Scale", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the Scale", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update scale of the specified ReplicationController", + "operationId": "patchCoreV1NamespacedReplicationControllerScale", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v1.Scale" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "Scale", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace scale of the specified ReplicationController", + "operationId": "replaceCoreV1NamespacedReplicationControllerScale", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v1.Scale" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v1.Scale" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v1.Scale" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "Scale", + "version": "v1" + } + } + }, + "/api/v1/namespaces/{namespace}/replicationcontrollers/{name}/status": { + "get": { + "consumes": [ + "*/*" + ], + "description": "read status of the specified ReplicationController", + "operationId": "readCoreV1NamespacedReplicationControllerStatus", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ReplicationController" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ReplicationController", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the ReplicationController", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update status of the specified ReplicationController", + "operationId": "patchCoreV1NamespacedReplicationControllerStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ReplicationController" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ReplicationController", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace status of the specified ReplicationController", + "operationId": "replaceCoreV1NamespacedReplicationControllerStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ReplicationController" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ReplicationController" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ReplicationController" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ReplicationController", + "version": "v1" + } + } + }, + "/api/v1/namespaces/{namespace}/resourcequotas": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of ResourceQuota", + "operationId": "deleteCoreV1CollectionNamespacedResourceQuota", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ResourceQuota", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind ResourceQuota", + "operationId": "listCoreV1NamespacedResourceQuota", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ResourceQuotaList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ResourceQuota", + "version": "v1" + } + }, + "parameters": [ + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a ResourceQuota", + "operationId": "createCoreV1NamespacedResourceQuota", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ResourceQuota" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ResourceQuota" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ResourceQuota" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ResourceQuota" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ResourceQuota", + "version": "v1" + } + } + }, + "/api/v1/namespaces/{namespace}/resourcequotas/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a ResourceQuota", + "operationId": "deleteCoreV1NamespacedResourceQuota", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ResourceQuota" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ResourceQuota" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ResourceQuota", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified ResourceQuota", + "operationId": "readCoreV1NamespacedResourceQuota", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ResourceQuota" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ResourceQuota", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the ResourceQuota", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified ResourceQuota", + "operationId": "patchCoreV1NamespacedResourceQuota", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ResourceQuota" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ResourceQuota", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified ResourceQuota", + "operationId": "replaceCoreV1NamespacedResourceQuota", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ResourceQuota" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ResourceQuota" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ResourceQuota" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ResourceQuota", + "version": "v1" + } + } + }, + "/api/v1/namespaces/{namespace}/resourcequotas/{name}/status": { + "get": { + "consumes": [ + "*/*" + ], + "description": "read status of the specified ResourceQuota", + "operationId": "readCoreV1NamespacedResourceQuotaStatus", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ResourceQuota" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ResourceQuota", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the ResourceQuota", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update status of the specified ResourceQuota", + "operationId": "patchCoreV1NamespacedResourceQuotaStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ResourceQuota" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ResourceQuota", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace status of the specified ResourceQuota", + "operationId": "replaceCoreV1NamespacedResourceQuotaStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ResourceQuota" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ResourceQuota" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ResourceQuota" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ResourceQuota", + "version": "v1" + } + } + }, + "/api/v1/namespaces/{namespace}/secrets": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of Secret", + "operationId": "deleteCoreV1CollectionNamespacedSecret", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Secret", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind Secret", + "operationId": "listCoreV1NamespacedSecret", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.SecretList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Secret", + "version": "v1" + } + }, + "parameters": [ + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a Secret", + "operationId": "createCoreV1NamespacedSecret", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Secret" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Secret" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Secret" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Secret" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Secret", + "version": "v1" + } + } + }, + "/api/v1/namespaces/{namespace}/secrets/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a Secret", + "operationId": "deleteCoreV1NamespacedSecret", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Secret", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified Secret", + "operationId": "readCoreV1NamespacedSecret", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Secret" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Secret", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the Secret", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified Secret", + "operationId": "patchCoreV1NamespacedSecret", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Secret" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Secret", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified Secret", + "operationId": "replaceCoreV1NamespacedSecret", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Secret" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Secret" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Secret" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Secret", + "version": "v1" + } + } + }, + "/api/v1/namespaces/{namespace}/serviceaccounts": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of ServiceAccount", + "operationId": "deleteCoreV1CollectionNamespacedServiceAccount", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ServiceAccount", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind ServiceAccount", + "operationId": "listCoreV1NamespacedServiceAccount", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ServiceAccountList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ServiceAccount", + "version": "v1" + } + }, + "parameters": [ + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a ServiceAccount", + "operationId": "createCoreV1NamespacedServiceAccount", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ServiceAccount" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ServiceAccount" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ServiceAccount" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ServiceAccount" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ServiceAccount", + "version": "v1" + } + } + }, + "/api/v1/namespaces/{namespace}/serviceaccounts/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a ServiceAccount", + "operationId": "deleteCoreV1NamespacedServiceAccount", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ServiceAccount" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ServiceAccount" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ServiceAccount", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified ServiceAccount", + "operationId": "readCoreV1NamespacedServiceAccount", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ServiceAccount" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ServiceAccount", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the ServiceAccount", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified ServiceAccount", + "operationId": "patchCoreV1NamespacedServiceAccount", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ServiceAccount" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ServiceAccount", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified ServiceAccount", + "operationId": "replaceCoreV1NamespacedServiceAccount", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ServiceAccount" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ServiceAccount" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ServiceAccount" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ServiceAccount", + "version": "v1" + } + } + }, + "/api/v1/namespaces/{namespace}/serviceaccounts/{name}/token": { + "parameters": [ + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "name of the TokenRequest", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create token of a ServiceAccount", + "operationId": "createCoreV1NamespacedServiceAccountToken", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.authentication.v1.TokenRequest" + } + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.authentication.v1.TokenRequest" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.authentication.v1.TokenRequest" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.authentication.v1.TokenRequest" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "authentication.k8s.io", + "kind": "TokenRequest", + "version": "v1" + } + } + }, + "/api/v1/namespaces/{namespace}/services": { + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind Service", + "operationId": "listCoreV1NamespacedService", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ServiceList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Service", + "version": "v1" + } + }, + "parameters": [ + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a Service", + "operationId": "createCoreV1NamespacedService", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Service" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Service" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Service" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Service" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Service", + "version": "v1" + } + } + }, + "/api/v1/namespaces/{namespace}/services/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a Service", + "operationId": "deleteCoreV1NamespacedService", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Service", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified Service", + "operationId": "readCoreV1NamespacedService", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Service" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Service", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the Service", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified Service", + "operationId": "patchCoreV1NamespacedService", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Service" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Service", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified Service", + "operationId": "replaceCoreV1NamespacedService", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Service" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Service" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Service" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Service", + "version": "v1" + } + } + }, + "/api/v1/namespaces/{namespace}/services/{name}/proxy": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "connect DELETE requests to proxy of Service", + "operationId": "connectCoreV1DeleteNamespacedServiceProxy", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ServiceProxyOptions", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "connect GET requests to proxy of Service", + "operationId": "connectCoreV1GetNamespacedServiceProxy", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ServiceProxyOptions", + "version": "v1" + } + }, + "head": { + "consumes": [ + "*/*" + ], + "description": "connect HEAD requests to proxy of Service", + "operationId": "connectCoreV1HeadNamespacedServiceProxy", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ServiceProxyOptions", + "version": "v1" + } + }, + "options": { + "consumes": [ + "*/*" + ], + "description": "connect OPTIONS requests to proxy of Service", + "operationId": "connectCoreV1OptionsNamespacedServiceProxy", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ServiceProxyOptions", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the ServiceProxyOptions", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "Path is the part of URLs that include service endpoints, suffixes, and parameters to use for the current proxy request to service. For example, the whole request URL is http://localhost/api/v1/namespaces/kube-system/services/elasticsearch-logging/_search?q=user:kimchy. Path is _search?q=user:kimchy.", + "in": "query", + "name": "path", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "*/*" + ], + "description": "connect PATCH requests to proxy of Service", + "operationId": "connectCoreV1PatchNamespacedServiceProxy", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ServiceProxyOptions", + "version": "v1" + } + }, + "post": { + "consumes": [ + "*/*" + ], + "description": "connect POST requests to proxy of Service", + "operationId": "connectCoreV1PostNamespacedServiceProxy", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ServiceProxyOptions", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "connect PUT requests to proxy of Service", + "operationId": "connectCoreV1PutNamespacedServiceProxy", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ServiceProxyOptions", + "version": "v1" + } + } + }, + "/api/v1/namespaces/{namespace}/services/{name}/proxy/{path}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "connect DELETE requests to proxy of Service", + "operationId": "connectCoreV1DeleteNamespacedServiceProxyWithPath", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ServiceProxyOptions", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "connect GET requests to proxy of Service", + "operationId": "connectCoreV1GetNamespacedServiceProxyWithPath", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ServiceProxyOptions", + "version": "v1" + } + }, + "head": { + "consumes": [ + "*/*" + ], + "description": "connect HEAD requests to proxy of Service", + "operationId": "connectCoreV1HeadNamespacedServiceProxyWithPath", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ServiceProxyOptions", + "version": "v1" + } + }, + "options": { + "consumes": [ + "*/*" + ], + "description": "connect OPTIONS requests to proxy of Service", + "operationId": "connectCoreV1OptionsNamespacedServiceProxyWithPath", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ServiceProxyOptions", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the ServiceProxyOptions", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "path to the resource", + "in": "path", + "name": "path", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "Path is the part of URLs that include service endpoints, suffixes, and parameters to use for the current proxy request to service. For example, the whole request URL is http://localhost/api/v1/namespaces/kube-system/services/elasticsearch-logging/_search?q=user:kimchy. Path is _search?q=user:kimchy.", + "in": "query", + "name": "path", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "*/*" + ], + "description": "connect PATCH requests to proxy of Service", + "operationId": "connectCoreV1PatchNamespacedServiceProxyWithPath", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ServiceProxyOptions", + "version": "v1" + } + }, + "post": { + "consumes": [ + "*/*" + ], + "description": "connect POST requests to proxy of Service", + "operationId": "connectCoreV1PostNamespacedServiceProxyWithPath", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ServiceProxyOptions", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "connect PUT requests to proxy of Service", + "operationId": "connectCoreV1PutNamespacedServiceProxyWithPath", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ServiceProxyOptions", + "version": "v1" + } + } + }, + "/api/v1/namespaces/{namespace}/services/{name}/status": { + "get": { + "consumes": [ + "*/*" + ], + "description": "read status of the specified Service", + "operationId": "readCoreV1NamespacedServiceStatus", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Service" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Service", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the Service", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update status of the specified Service", + "operationId": "patchCoreV1NamespacedServiceStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Service" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Service", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace status of the specified Service", + "operationId": "replaceCoreV1NamespacedServiceStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Service" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Service" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Service" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Service", + "version": "v1" + } + } + }, + "/api/v1/namespaces/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a Namespace", + "operationId": "deleteCoreV1Namespace", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Namespace", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified Namespace", + "operationId": "readCoreV1Namespace", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Namespace" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Namespace", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the Namespace", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified Namespace", + "operationId": "patchCoreV1Namespace", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Namespace" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Namespace", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified Namespace", + "operationId": "replaceCoreV1Namespace", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Namespace" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Namespace" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Namespace" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Namespace", + "version": "v1" + } + } + }, + "/api/v1/namespaces/{name}/finalize": { + "parameters": [ + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "name of the Namespace", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "put": { + "consumes": [ + "*/*" + ], + "description": "replace finalize of the specified Namespace", + "operationId": "replaceCoreV1NamespaceFinalize", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Namespace" + } + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Namespace" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Namespace" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Namespace", + "version": "v1" + } + } + }, + "/api/v1/namespaces/{name}/status": { + "get": { + "consumes": [ + "*/*" + ], + "description": "read status of the specified Namespace", + "operationId": "readCoreV1NamespaceStatus", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Namespace" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Namespace", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the Namespace", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update status of the specified Namespace", + "operationId": "patchCoreV1NamespaceStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Namespace" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Namespace", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace status of the specified Namespace", + "operationId": "replaceCoreV1NamespaceStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Namespace" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Namespace" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Namespace" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Namespace", + "version": "v1" + } + } + }, + "/api/v1/nodes": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of Node", + "operationId": "deleteCoreV1CollectionNode", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Node", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind Node", + "operationId": "listCoreV1Node", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.NodeList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Node", + "version": "v1" + } + }, + "parameters": [ + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a Node", + "operationId": "createCoreV1Node", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Node" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Node" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Node" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Node" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Node", + "version": "v1" + } + } + }, + "/api/v1/nodes/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a Node", + "operationId": "deleteCoreV1Node", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Node", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified Node", + "operationId": "readCoreV1Node", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Node" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Node", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the Node", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified Node", + "operationId": "patchCoreV1Node", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Node" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Node", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified Node", + "operationId": "replaceCoreV1Node", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Node" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Node" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Node" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Node", + "version": "v1" + } + } + }, + "/api/v1/nodes/{name}/proxy": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "connect DELETE requests to proxy of Node", + "operationId": "connectCoreV1DeleteNodeProxy", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "NodeProxyOptions", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "connect GET requests to proxy of Node", + "operationId": "connectCoreV1GetNodeProxy", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "NodeProxyOptions", + "version": "v1" + } + }, + "head": { + "consumes": [ + "*/*" + ], + "description": "connect HEAD requests to proxy of Node", + "operationId": "connectCoreV1HeadNodeProxy", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "NodeProxyOptions", + "version": "v1" + } + }, + "options": { + "consumes": [ + "*/*" + ], + "description": "connect OPTIONS requests to proxy of Node", + "operationId": "connectCoreV1OptionsNodeProxy", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "NodeProxyOptions", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the NodeProxyOptions", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "Path is the URL path to use for the current proxy request to node.", + "in": "query", + "name": "path", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "*/*" + ], + "description": "connect PATCH requests to proxy of Node", + "operationId": "connectCoreV1PatchNodeProxy", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "NodeProxyOptions", + "version": "v1" + } + }, + "post": { + "consumes": [ + "*/*" + ], + "description": "connect POST requests to proxy of Node", + "operationId": "connectCoreV1PostNodeProxy", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "NodeProxyOptions", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "connect PUT requests to proxy of Node", + "operationId": "connectCoreV1PutNodeProxy", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "NodeProxyOptions", + "version": "v1" + } + } + }, + "/api/v1/nodes/{name}/proxy/{path}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "connect DELETE requests to proxy of Node", + "operationId": "connectCoreV1DeleteNodeProxyWithPath", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "NodeProxyOptions", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "connect GET requests to proxy of Node", + "operationId": "connectCoreV1GetNodeProxyWithPath", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "NodeProxyOptions", + "version": "v1" + } + }, + "head": { + "consumes": [ + "*/*" + ], + "description": "connect HEAD requests to proxy of Node", + "operationId": "connectCoreV1HeadNodeProxyWithPath", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "NodeProxyOptions", + "version": "v1" + } + }, + "options": { + "consumes": [ + "*/*" + ], + "description": "connect OPTIONS requests to proxy of Node", + "operationId": "connectCoreV1OptionsNodeProxyWithPath", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "NodeProxyOptions", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the NodeProxyOptions", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "path to the resource", + "in": "path", + "name": "path", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "Path is the URL path to use for the current proxy request to node.", + "in": "query", + "name": "path", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "*/*" + ], + "description": "connect PATCH requests to proxy of Node", + "operationId": "connectCoreV1PatchNodeProxyWithPath", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "NodeProxyOptions", + "version": "v1" + } + }, + "post": { + "consumes": [ + "*/*" + ], + "description": "connect POST requests to proxy of Node", + "operationId": "connectCoreV1PostNodeProxyWithPath", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "NodeProxyOptions", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "connect PUT requests to proxy of Node", + "operationId": "connectCoreV1PutNodeProxyWithPath", + "produces": [ + "*/*" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "NodeProxyOptions", + "version": "v1" + } + } + }, + "/api/v1/nodes/{name}/status": { + "get": { + "consumes": [ + "*/*" + ], + "description": "read status of the specified Node", + "operationId": "readCoreV1NodeStatus", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Node" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Node", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the Node", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update status of the specified Node", + "operationId": "patchCoreV1NodeStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Node" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Node", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace status of the specified Node", + "operationId": "replaceCoreV1NodeStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Node" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Node" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.Node" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Node", + "version": "v1" + } + } + }, + "/api/v1/persistentvolumeclaims": { + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind PersistentVolumeClaim", + "operationId": "listCoreV1PersistentVolumeClaimForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolumeClaimList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PersistentVolumeClaim", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/persistentvolumes": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of PersistentVolume", + "operationId": "deleteCoreV1CollectionPersistentVolume", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PersistentVolume", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind PersistentVolume", + "operationId": "listCoreV1PersistentVolume", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolumeList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PersistentVolume", + "version": "v1" + } + }, + "parameters": [ + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a PersistentVolume", + "operationId": "createCoreV1PersistentVolume", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolume" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolume" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolume" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolume" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PersistentVolume", + "version": "v1" + } + } + }, + "/api/v1/persistentvolumes/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a PersistentVolume", + "operationId": "deleteCoreV1PersistentVolume", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolume" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolume" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PersistentVolume", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified PersistentVolume", + "operationId": "readCoreV1PersistentVolume", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolume" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PersistentVolume", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the PersistentVolume", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified PersistentVolume", + "operationId": "patchCoreV1PersistentVolume", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolume" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PersistentVolume", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified PersistentVolume", + "operationId": "replaceCoreV1PersistentVolume", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolume" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolume" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolume" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PersistentVolume", + "version": "v1" + } + } + }, + "/api/v1/persistentvolumes/{name}/status": { + "get": { + "consumes": [ + "*/*" + ], + "description": "read status of the specified PersistentVolume", + "operationId": "readCoreV1PersistentVolumeStatus", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolume" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PersistentVolume", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the PersistentVolume", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update status of the specified PersistentVolume", + "operationId": "patchCoreV1PersistentVolumeStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolume" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PersistentVolume", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace status of the specified PersistentVolume", + "operationId": "replaceCoreV1PersistentVolumeStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolume" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolume" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolume" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PersistentVolume", + "version": "v1" + } + } + }, + "/api/v1/pods": { + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind Pod", + "operationId": "listCoreV1PodForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PodList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Pod", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/podtemplates": { + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind PodTemplate", + "operationId": "listCoreV1PodTemplateForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.PodTemplateList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PodTemplate", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/replicationcontrollers": { + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind ReplicationController", + "operationId": "listCoreV1ReplicationControllerForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ReplicationControllerList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ReplicationController", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/resourcequotas": { + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind ResourceQuota", + "operationId": "listCoreV1ResourceQuotaForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ResourceQuotaList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ResourceQuota", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/secrets": { + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind Secret", + "operationId": "listCoreV1SecretForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.SecretList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Secret", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/serviceaccounts": { + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind ServiceAccount", + "operationId": "listCoreV1ServiceAccountForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ServiceAccountList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ServiceAccount", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/services": { + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind Service", + "operationId": "listCoreV1ServiceForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.core.v1.ServiceList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Service", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/watch/configmaps": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of ConfigMap. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchCoreV1ConfigMapListForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ConfigMap", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/watch/endpoints": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of Endpoints. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchCoreV1EndpointsListForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Endpoints", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/watch/events": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of Event. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchCoreV1EventListForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Event", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/watch/limitranges": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of LimitRange. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchCoreV1LimitRangeListForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "LimitRange", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/watch/namespaces": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of Namespace. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchCoreV1NamespaceList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Namespace", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/watch/namespaces/{namespace}/configmaps": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of ConfigMap. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchCoreV1NamespacedConfigMapList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ConfigMap", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/watch/namespaces/{namespace}/configmaps/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind ConfigMap. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchCoreV1NamespacedConfigMap", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ConfigMap", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the ConfigMap", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/watch/namespaces/{namespace}/endpoints": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of Endpoints. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchCoreV1NamespacedEndpointsList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Endpoints", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/watch/namespaces/{namespace}/endpoints/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind Endpoints. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchCoreV1NamespacedEndpoints", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Endpoints", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the Endpoints", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/watch/namespaces/{namespace}/events": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of Event. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchCoreV1NamespacedEventList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Event", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/watch/namespaces/{namespace}/events/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind Event. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchCoreV1NamespacedEvent", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Event", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the Event", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/watch/namespaces/{namespace}/limitranges": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of LimitRange. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchCoreV1NamespacedLimitRangeList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "LimitRange", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/watch/namespaces/{namespace}/limitranges/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind LimitRange. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchCoreV1NamespacedLimitRange", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "LimitRange", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the LimitRange", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/watch/namespaces/{namespace}/persistentvolumeclaims": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of PersistentVolumeClaim. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchCoreV1NamespacedPersistentVolumeClaimList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PersistentVolumeClaim", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/watch/namespaces/{namespace}/persistentvolumeclaims/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind PersistentVolumeClaim. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchCoreV1NamespacedPersistentVolumeClaim", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PersistentVolumeClaim", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the PersistentVolumeClaim", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/watch/namespaces/{namespace}/pods": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of Pod. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchCoreV1NamespacedPodList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Pod", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/watch/namespaces/{namespace}/pods/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind Pod. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchCoreV1NamespacedPod", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Pod", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the Pod", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/watch/namespaces/{namespace}/podtemplates": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of PodTemplate. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchCoreV1NamespacedPodTemplateList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PodTemplate", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/watch/namespaces/{namespace}/podtemplates/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind PodTemplate. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchCoreV1NamespacedPodTemplate", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PodTemplate", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the PodTemplate", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/watch/namespaces/{namespace}/replicationcontrollers": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of ReplicationController. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchCoreV1NamespacedReplicationControllerList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ReplicationController", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/watch/namespaces/{namespace}/replicationcontrollers/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind ReplicationController. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchCoreV1NamespacedReplicationController", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ReplicationController", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the ReplicationController", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/watch/namespaces/{namespace}/resourcequotas": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of ResourceQuota. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchCoreV1NamespacedResourceQuotaList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ResourceQuota", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/watch/namespaces/{namespace}/resourcequotas/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind ResourceQuota. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchCoreV1NamespacedResourceQuota", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ResourceQuota", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the ResourceQuota", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/watch/namespaces/{namespace}/secrets": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of Secret. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchCoreV1NamespacedSecretList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Secret", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/watch/namespaces/{namespace}/secrets/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind Secret. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchCoreV1NamespacedSecret", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Secret", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the Secret", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/watch/namespaces/{namespace}/serviceaccounts": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of ServiceAccount. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchCoreV1NamespacedServiceAccountList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ServiceAccount", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/watch/namespaces/{namespace}/serviceaccounts/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind ServiceAccount. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchCoreV1NamespacedServiceAccount", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ServiceAccount", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the ServiceAccount", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/watch/namespaces/{namespace}/services": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of Service. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchCoreV1NamespacedServiceList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Service", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/watch/namespaces/{namespace}/services/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind Service. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchCoreV1NamespacedService", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Service", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the Service", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/watch/namespaces/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind Namespace. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchCoreV1Namespace", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Namespace", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the Namespace", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/watch/nodes": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of Node. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchCoreV1NodeList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Node", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/watch/nodes/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind Node. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchCoreV1Node", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Node", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the Node", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/watch/persistentvolumeclaims": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of PersistentVolumeClaim. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchCoreV1PersistentVolumeClaimListForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PersistentVolumeClaim", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/watch/persistentvolumes": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of PersistentVolume. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchCoreV1PersistentVolumeList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PersistentVolume", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/watch/persistentvolumes/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind PersistentVolume. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchCoreV1PersistentVolume", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PersistentVolume", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the PersistentVolume", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/watch/pods": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of Pod. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchCoreV1PodListForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Pod", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/watch/podtemplates": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of PodTemplate. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchCoreV1PodTemplateListForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "PodTemplate", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/watch/replicationcontrollers": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of ReplicationController. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchCoreV1ReplicationControllerListForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ReplicationController", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/watch/resourcequotas": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of ResourceQuota. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchCoreV1ResourceQuotaListForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ResourceQuota", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/watch/secrets": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of Secret. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchCoreV1SecretListForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Secret", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/watch/serviceaccounts": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of ServiceAccount. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchCoreV1ServiceAccountListForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "ServiceAccount", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/api/v1/watch/services": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of Service. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchCoreV1ServiceListForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "core_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "", + "kind": "Service", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get available API versions", + "operationId": "getAPIVersions", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroupList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apis" + ] + } + }, + "/apis/admissionregistration.k8s.io/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get information of a group", + "operationId": "getAdmissionregistrationAPIGroup", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "admissionregistration" + ] + } + }, + "/apis/admissionregistration.k8s.io/v1/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get available resources", + "operationId": "getAdmissionregistrationV1APIResources", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "admissionregistration_v1" + ] + } + }, + "/apis/admissionregistration.k8s.io/v1/mutatingwebhookconfigurations": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of MutatingWebhookConfiguration", + "operationId": "deleteAdmissionregistrationV1CollectionMutatingWebhookConfiguration", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "admissionregistration_v1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "admissionregistration.k8s.io", + "kind": "MutatingWebhookConfiguration", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind MutatingWebhookConfiguration", + "operationId": "listAdmissionregistrationV1MutatingWebhookConfiguration", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1.MutatingWebhookConfigurationList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "admissionregistration_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "admissionregistration.k8s.io", + "kind": "MutatingWebhookConfiguration", + "version": "v1" + } + }, + "parameters": [ + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a MutatingWebhookConfiguration", + "operationId": "createAdmissionregistrationV1MutatingWebhookConfiguration", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1.MutatingWebhookConfiguration" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1.MutatingWebhookConfiguration" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1.MutatingWebhookConfiguration" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1.MutatingWebhookConfiguration" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "admissionregistration_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "admissionregistration.k8s.io", + "kind": "MutatingWebhookConfiguration", + "version": "v1" + } + } + }, + "/apis/admissionregistration.k8s.io/v1/mutatingwebhookconfigurations/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a MutatingWebhookConfiguration", + "operationId": "deleteAdmissionregistrationV1MutatingWebhookConfiguration", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "admissionregistration_v1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "admissionregistration.k8s.io", + "kind": "MutatingWebhookConfiguration", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified MutatingWebhookConfiguration", + "operationId": "readAdmissionregistrationV1MutatingWebhookConfiguration", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1.MutatingWebhookConfiguration" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "admissionregistration_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "admissionregistration.k8s.io", + "kind": "MutatingWebhookConfiguration", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the MutatingWebhookConfiguration", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified MutatingWebhookConfiguration", + "operationId": "patchAdmissionregistrationV1MutatingWebhookConfiguration", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1.MutatingWebhookConfiguration" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "admissionregistration_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "admissionregistration.k8s.io", + "kind": "MutatingWebhookConfiguration", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified MutatingWebhookConfiguration", + "operationId": "replaceAdmissionregistrationV1MutatingWebhookConfiguration", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1.MutatingWebhookConfiguration" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1.MutatingWebhookConfiguration" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1.MutatingWebhookConfiguration" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "admissionregistration_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "admissionregistration.k8s.io", + "kind": "MutatingWebhookConfiguration", + "version": "v1" + } + } + }, + "/apis/admissionregistration.k8s.io/v1/validatingwebhookconfigurations": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of ValidatingWebhookConfiguration", + "operationId": "deleteAdmissionregistrationV1CollectionValidatingWebhookConfiguration", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "admissionregistration_v1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "admissionregistration.k8s.io", + "kind": "ValidatingWebhookConfiguration", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind ValidatingWebhookConfiguration", + "operationId": "listAdmissionregistrationV1ValidatingWebhookConfiguration", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1.ValidatingWebhookConfigurationList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "admissionregistration_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "admissionregistration.k8s.io", + "kind": "ValidatingWebhookConfiguration", + "version": "v1" + } + }, + "parameters": [ + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a ValidatingWebhookConfiguration", + "operationId": "createAdmissionregistrationV1ValidatingWebhookConfiguration", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1.ValidatingWebhookConfiguration" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1.ValidatingWebhookConfiguration" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1.ValidatingWebhookConfiguration" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1.ValidatingWebhookConfiguration" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "admissionregistration_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "admissionregistration.k8s.io", + "kind": "ValidatingWebhookConfiguration", + "version": "v1" + } + } + }, + "/apis/admissionregistration.k8s.io/v1/validatingwebhookconfigurations/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a ValidatingWebhookConfiguration", + "operationId": "deleteAdmissionregistrationV1ValidatingWebhookConfiguration", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "admissionregistration_v1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "admissionregistration.k8s.io", + "kind": "ValidatingWebhookConfiguration", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified ValidatingWebhookConfiguration", + "operationId": "readAdmissionregistrationV1ValidatingWebhookConfiguration", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1.ValidatingWebhookConfiguration" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "admissionregistration_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "admissionregistration.k8s.io", + "kind": "ValidatingWebhookConfiguration", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the ValidatingWebhookConfiguration", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified ValidatingWebhookConfiguration", + "operationId": "patchAdmissionregistrationV1ValidatingWebhookConfiguration", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1.ValidatingWebhookConfiguration" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "admissionregistration_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "admissionregistration.k8s.io", + "kind": "ValidatingWebhookConfiguration", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified ValidatingWebhookConfiguration", + "operationId": "replaceAdmissionregistrationV1ValidatingWebhookConfiguration", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1.ValidatingWebhookConfiguration" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1.ValidatingWebhookConfiguration" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1.ValidatingWebhookConfiguration" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "admissionregistration_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "admissionregistration.k8s.io", + "kind": "ValidatingWebhookConfiguration", + "version": "v1" + } + } + }, + "/apis/admissionregistration.k8s.io/v1/watch/mutatingwebhookconfigurations": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of MutatingWebhookConfiguration. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchAdmissionregistrationV1MutatingWebhookConfigurationList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "admissionregistration_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "admissionregistration.k8s.io", + "kind": "MutatingWebhookConfiguration", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/admissionregistration.k8s.io/v1/watch/mutatingwebhookconfigurations/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind MutatingWebhookConfiguration. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchAdmissionregistrationV1MutatingWebhookConfiguration", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "admissionregistration_v1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "admissionregistration.k8s.io", + "kind": "MutatingWebhookConfiguration", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the MutatingWebhookConfiguration", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/admissionregistration.k8s.io/v1/watch/validatingwebhookconfigurations": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of ValidatingWebhookConfiguration. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchAdmissionregistrationV1ValidatingWebhookConfigurationList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "admissionregistration_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "admissionregistration.k8s.io", + "kind": "ValidatingWebhookConfiguration", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/admissionregistration.k8s.io/v1/watch/validatingwebhookconfigurations/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind ValidatingWebhookConfiguration. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchAdmissionregistrationV1ValidatingWebhookConfiguration", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "admissionregistration_v1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "admissionregistration.k8s.io", + "kind": "ValidatingWebhookConfiguration", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the ValidatingWebhookConfiguration", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/admissionregistration.k8s.io/v1beta1/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get available resources", + "operationId": "getAdmissionregistrationV1beta1APIResources", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "admissionregistration_v1beta1" + ] + } + }, + "/apis/admissionregistration.k8s.io/v1beta1/mutatingwebhookconfigurations": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of MutatingWebhookConfiguration", + "operationId": "deleteAdmissionregistrationV1beta1CollectionMutatingWebhookConfiguration", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "admissionregistration_v1beta1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "admissionregistration.k8s.io", + "kind": "MutatingWebhookConfiguration", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind MutatingWebhookConfiguration", + "operationId": "listAdmissionregistrationV1beta1MutatingWebhookConfiguration", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1beta1.MutatingWebhookConfigurationList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "admissionregistration_v1beta1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "admissionregistration.k8s.io", + "kind": "MutatingWebhookConfiguration", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a MutatingWebhookConfiguration", + "operationId": "createAdmissionregistrationV1beta1MutatingWebhookConfiguration", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1beta1.MutatingWebhookConfiguration" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1beta1.MutatingWebhookConfiguration" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1beta1.MutatingWebhookConfiguration" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1beta1.MutatingWebhookConfiguration" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "admissionregistration_v1beta1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "admissionregistration.k8s.io", + "kind": "MutatingWebhookConfiguration", + "version": "v1beta1" + } + } + }, + "/apis/admissionregistration.k8s.io/v1beta1/mutatingwebhookconfigurations/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a MutatingWebhookConfiguration", + "operationId": "deleteAdmissionregistrationV1beta1MutatingWebhookConfiguration", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "admissionregistration_v1beta1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "admissionregistration.k8s.io", + "kind": "MutatingWebhookConfiguration", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified MutatingWebhookConfiguration", + "operationId": "readAdmissionregistrationV1beta1MutatingWebhookConfiguration", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1beta1.MutatingWebhookConfiguration" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "admissionregistration_v1beta1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "admissionregistration.k8s.io", + "kind": "MutatingWebhookConfiguration", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "name of the MutatingWebhookConfiguration", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified MutatingWebhookConfiguration", + "operationId": "patchAdmissionregistrationV1beta1MutatingWebhookConfiguration", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1beta1.MutatingWebhookConfiguration" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "admissionregistration_v1beta1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "admissionregistration.k8s.io", + "kind": "MutatingWebhookConfiguration", + "version": "v1beta1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified MutatingWebhookConfiguration", + "operationId": "replaceAdmissionregistrationV1beta1MutatingWebhookConfiguration", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1beta1.MutatingWebhookConfiguration" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1beta1.MutatingWebhookConfiguration" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1beta1.MutatingWebhookConfiguration" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "admissionregistration_v1beta1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "admissionregistration.k8s.io", + "kind": "MutatingWebhookConfiguration", + "version": "v1beta1" + } + } + }, + "/apis/admissionregistration.k8s.io/v1beta1/validatingwebhookconfigurations": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of ValidatingWebhookConfiguration", + "operationId": "deleteAdmissionregistrationV1beta1CollectionValidatingWebhookConfiguration", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "admissionregistration_v1beta1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "admissionregistration.k8s.io", + "kind": "ValidatingWebhookConfiguration", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind ValidatingWebhookConfiguration", + "operationId": "listAdmissionregistrationV1beta1ValidatingWebhookConfiguration", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1beta1.ValidatingWebhookConfigurationList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "admissionregistration_v1beta1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "admissionregistration.k8s.io", + "kind": "ValidatingWebhookConfiguration", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a ValidatingWebhookConfiguration", + "operationId": "createAdmissionregistrationV1beta1ValidatingWebhookConfiguration", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1beta1.ValidatingWebhookConfiguration" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1beta1.ValidatingWebhookConfiguration" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1beta1.ValidatingWebhookConfiguration" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1beta1.ValidatingWebhookConfiguration" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "admissionregistration_v1beta1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "admissionregistration.k8s.io", + "kind": "ValidatingWebhookConfiguration", + "version": "v1beta1" + } + } + }, + "/apis/admissionregistration.k8s.io/v1beta1/validatingwebhookconfigurations/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a ValidatingWebhookConfiguration", + "operationId": "deleteAdmissionregistrationV1beta1ValidatingWebhookConfiguration", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "admissionregistration_v1beta1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "admissionregistration.k8s.io", + "kind": "ValidatingWebhookConfiguration", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified ValidatingWebhookConfiguration", + "operationId": "readAdmissionregistrationV1beta1ValidatingWebhookConfiguration", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1beta1.ValidatingWebhookConfiguration" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "admissionregistration_v1beta1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "admissionregistration.k8s.io", + "kind": "ValidatingWebhookConfiguration", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "name of the ValidatingWebhookConfiguration", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified ValidatingWebhookConfiguration", + "operationId": "patchAdmissionregistrationV1beta1ValidatingWebhookConfiguration", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1beta1.ValidatingWebhookConfiguration" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "admissionregistration_v1beta1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "admissionregistration.k8s.io", + "kind": "ValidatingWebhookConfiguration", + "version": "v1beta1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified ValidatingWebhookConfiguration", + "operationId": "replaceAdmissionregistrationV1beta1ValidatingWebhookConfiguration", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1beta1.ValidatingWebhookConfiguration" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1beta1.ValidatingWebhookConfiguration" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.admissionregistration.v1beta1.ValidatingWebhookConfiguration" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "admissionregistration_v1beta1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "admissionregistration.k8s.io", + "kind": "ValidatingWebhookConfiguration", + "version": "v1beta1" + } + } + }, + "/apis/admissionregistration.k8s.io/v1beta1/watch/mutatingwebhookconfigurations": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of MutatingWebhookConfiguration. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchAdmissionregistrationV1beta1MutatingWebhookConfigurationList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "admissionregistration_v1beta1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "admissionregistration.k8s.io", + "kind": "MutatingWebhookConfiguration", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/admissionregistration.k8s.io/v1beta1/watch/mutatingwebhookconfigurations/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind MutatingWebhookConfiguration. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchAdmissionregistrationV1beta1MutatingWebhookConfiguration", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "admissionregistration_v1beta1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "admissionregistration.k8s.io", + "kind": "MutatingWebhookConfiguration", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the MutatingWebhookConfiguration", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/admissionregistration.k8s.io/v1beta1/watch/validatingwebhookconfigurations": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of ValidatingWebhookConfiguration. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchAdmissionregistrationV1beta1ValidatingWebhookConfigurationList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "admissionregistration_v1beta1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "admissionregistration.k8s.io", + "kind": "ValidatingWebhookConfiguration", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/admissionregistration.k8s.io/v1beta1/watch/validatingwebhookconfigurations/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind ValidatingWebhookConfiguration. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchAdmissionregistrationV1beta1ValidatingWebhookConfiguration", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "admissionregistration_v1beta1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "admissionregistration.k8s.io", + "kind": "ValidatingWebhookConfiguration", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the ValidatingWebhookConfiguration", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/apiextensions.k8s.io/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get information of a group", + "operationId": "getApiextensionsAPIGroup", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiextensions" + ] + } + }, + "/apis/apiextensions.k8s.io/v1/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get available resources", + "operationId": "getApiextensionsV1APIResources", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiextensions_v1" + ] + } + }, + "/apis/apiextensions.k8s.io/v1/customresourcedefinitions": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of CustomResourceDefinition", + "operationId": "deleteApiextensionsV1CollectionCustomResourceDefinition", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiextensions_v1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "apiextensions.k8s.io", + "kind": "CustomResourceDefinition", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind CustomResourceDefinition", + "operationId": "listApiextensionsV1CustomResourceDefinition", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiextensions_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "apiextensions.k8s.io", + "kind": "CustomResourceDefinition", + "version": "v1" + } + }, + "parameters": [ + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a CustomResourceDefinition", + "operationId": "createApiextensionsV1CustomResourceDefinition", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinition" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinition" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinition" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinition" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiextensions_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "apiextensions.k8s.io", + "kind": "CustomResourceDefinition", + "version": "v1" + } + } + }, + "/apis/apiextensions.k8s.io/v1/customresourcedefinitions/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a CustomResourceDefinition", + "operationId": "deleteApiextensionsV1CustomResourceDefinition", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiextensions_v1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "apiextensions.k8s.io", + "kind": "CustomResourceDefinition", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified CustomResourceDefinition", + "operationId": "readApiextensionsV1CustomResourceDefinition", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinition" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiextensions_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "apiextensions.k8s.io", + "kind": "CustomResourceDefinition", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the CustomResourceDefinition", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified CustomResourceDefinition", + "operationId": "patchApiextensionsV1CustomResourceDefinition", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinition" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiextensions_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "apiextensions.k8s.io", + "kind": "CustomResourceDefinition", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified CustomResourceDefinition", + "operationId": "replaceApiextensionsV1CustomResourceDefinition", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinition" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinition" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinition" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiextensions_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "apiextensions.k8s.io", + "kind": "CustomResourceDefinition", + "version": "v1" + } + } + }, + "/apis/apiextensions.k8s.io/v1/customresourcedefinitions/{name}/status": { + "get": { + "consumes": [ + "*/*" + ], + "description": "read status of the specified CustomResourceDefinition", + "operationId": "readApiextensionsV1CustomResourceDefinitionStatus", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinition" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiextensions_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "apiextensions.k8s.io", + "kind": "CustomResourceDefinition", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the CustomResourceDefinition", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update status of the specified CustomResourceDefinition", + "operationId": "patchApiextensionsV1CustomResourceDefinitionStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinition" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiextensions_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "apiextensions.k8s.io", + "kind": "CustomResourceDefinition", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace status of the specified CustomResourceDefinition", + "operationId": "replaceApiextensionsV1CustomResourceDefinitionStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinition" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinition" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinition" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiextensions_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "apiextensions.k8s.io", + "kind": "CustomResourceDefinition", + "version": "v1" + } + } + }, + "/apis/apiextensions.k8s.io/v1/watch/customresourcedefinitions": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of CustomResourceDefinition. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchApiextensionsV1CustomResourceDefinitionList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiextensions_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "apiextensions.k8s.io", + "kind": "CustomResourceDefinition", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/apiextensions.k8s.io/v1/watch/customresourcedefinitions/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind CustomResourceDefinition. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchApiextensionsV1CustomResourceDefinition", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiextensions_v1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "apiextensions.k8s.io", + "kind": "CustomResourceDefinition", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the CustomResourceDefinition", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/apiextensions.k8s.io/v1beta1/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get available resources", + "operationId": "getApiextensionsV1beta1APIResources", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiextensions_v1beta1" + ] + } + }, + "/apis/apiextensions.k8s.io/v1beta1/customresourcedefinitions": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of CustomResourceDefinition", + "operationId": "deleteApiextensionsV1beta1CollectionCustomResourceDefinition", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiextensions_v1beta1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "apiextensions.k8s.io", + "kind": "CustomResourceDefinition", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind CustomResourceDefinition", + "operationId": "listApiextensionsV1beta1CustomResourceDefinition", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiextensions_v1beta1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "apiextensions.k8s.io", + "kind": "CustomResourceDefinition", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a CustomResourceDefinition", + "operationId": "createApiextensionsV1beta1CustomResourceDefinition", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinition" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinition" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinition" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinition" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiextensions_v1beta1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "apiextensions.k8s.io", + "kind": "CustomResourceDefinition", + "version": "v1beta1" + } + } + }, + "/apis/apiextensions.k8s.io/v1beta1/customresourcedefinitions/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a CustomResourceDefinition", + "operationId": "deleteApiextensionsV1beta1CustomResourceDefinition", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiextensions_v1beta1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "apiextensions.k8s.io", + "kind": "CustomResourceDefinition", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified CustomResourceDefinition", + "operationId": "readApiextensionsV1beta1CustomResourceDefinition", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinition" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiextensions_v1beta1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "apiextensions.k8s.io", + "kind": "CustomResourceDefinition", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "name of the CustomResourceDefinition", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified CustomResourceDefinition", + "operationId": "patchApiextensionsV1beta1CustomResourceDefinition", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinition" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiextensions_v1beta1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "apiextensions.k8s.io", + "kind": "CustomResourceDefinition", + "version": "v1beta1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified CustomResourceDefinition", + "operationId": "replaceApiextensionsV1beta1CustomResourceDefinition", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinition" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinition" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinition" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiextensions_v1beta1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "apiextensions.k8s.io", + "kind": "CustomResourceDefinition", + "version": "v1beta1" + } + } + }, + "/apis/apiextensions.k8s.io/v1beta1/customresourcedefinitions/{name}/status": { + "get": { + "consumes": [ + "*/*" + ], + "description": "read status of the specified CustomResourceDefinition", + "operationId": "readApiextensionsV1beta1CustomResourceDefinitionStatus", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinition" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiextensions_v1beta1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "apiextensions.k8s.io", + "kind": "CustomResourceDefinition", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "name of the CustomResourceDefinition", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update status of the specified CustomResourceDefinition", + "operationId": "patchApiextensionsV1beta1CustomResourceDefinitionStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinition" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiextensions_v1beta1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "apiextensions.k8s.io", + "kind": "CustomResourceDefinition", + "version": "v1beta1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace status of the specified CustomResourceDefinition", + "operationId": "replaceApiextensionsV1beta1CustomResourceDefinitionStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinition" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinition" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinition" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiextensions_v1beta1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "apiextensions.k8s.io", + "kind": "CustomResourceDefinition", + "version": "v1beta1" + } + } + }, + "/apis/apiextensions.k8s.io/v1beta1/watch/customresourcedefinitions": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of CustomResourceDefinition. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchApiextensionsV1beta1CustomResourceDefinitionList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiextensions_v1beta1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "apiextensions.k8s.io", + "kind": "CustomResourceDefinition", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/apiextensions.k8s.io/v1beta1/watch/customresourcedefinitions/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind CustomResourceDefinition. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchApiextensionsV1beta1CustomResourceDefinition", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiextensions_v1beta1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "apiextensions.k8s.io", + "kind": "CustomResourceDefinition", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the CustomResourceDefinition", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/apiregistration.k8s.io/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get information of a group", + "operationId": "getApiregistrationAPIGroup", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiregistration" + ] + } + }, + "/apis/apiregistration.k8s.io/v1/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get available resources", + "operationId": "getApiregistrationV1APIResources", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiregistration_v1" + ] + } + }, + "/apis/apiregistration.k8s.io/v1/apiservices": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of APIService", + "operationId": "deleteApiregistrationV1CollectionAPIService", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiregistration_v1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "apiregistration.k8s.io", + "kind": "APIService", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind APIService", + "operationId": "listApiregistrationV1APIService", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIServiceList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiregistration_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "apiregistration.k8s.io", + "kind": "APIService", + "version": "v1" + } + }, + "parameters": [ + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create an APIService", + "operationId": "createApiregistrationV1APIService", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIService" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIService" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIService" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIService" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiregistration_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "apiregistration.k8s.io", + "kind": "APIService", + "version": "v1" + } + } + }, + "/apis/apiregistration.k8s.io/v1/apiservices/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete an APIService", + "operationId": "deleteApiregistrationV1APIService", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiregistration_v1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "apiregistration.k8s.io", + "kind": "APIService", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified APIService", + "operationId": "readApiregistrationV1APIService", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIService" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiregistration_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "apiregistration.k8s.io", + "kind": "APIService", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the APIService", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified APIService", + "operationId": "patchApiregistrationV1APIService", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIService" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiregistration_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "apiregistration.k8s.io", + "kind": "APIService", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified APIService", + "operationId": "replaceApiregistrationV1APIService", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIService" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIService" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIService" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiregistration_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "apiregistration.k8s.io", + "kind": "APIService", + "version": "v1" + } + } + }, + "/apis/apiregistration.k8s.io/v1/apiservices/{name}/status": { + "get": { + "consumes": [ + "*/*" + ], + "description": "read status of the specified APIService", + "operationId": "readApiregistrationV1APIServiceStatus", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIService" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiregistration_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "apiregistration.k8s.io", + "kind": "APIService", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the APIService", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update status of the specified APIService", + "operationId": "patchApiregistrationV1APIServiceStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIService" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiregistration_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "apiregistration.k8s.io", + "kind": "APIService", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace status of the specified APIService", + "operationId": "replaceApiregistrationV1APIServiceStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIService" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIService" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1.APIService" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiregistration_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "apiregistration.k8s.io", + "kind": "APIService", + "version": "v1" + } + } + }, + "/apis/apiregistration.k8s.io/v1/watch/apiservices": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of APIService. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchApiregistrationV1APIServiceList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiregistration_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "apiregistration.k8s.io", + "kind": "APIService", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/apiregistration.k8s.io/v1/watch/apiservices/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind APIService. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchApiregistrationV1APIService", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiregistration_v1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "apiregistration.k8s.io", + "kind": "APIService", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the APIService", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/apiregistration.k8s.io/v1beta1/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get available resources", + "operationId": "getApiregistrationV1beta1APIResources", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiregistration_v1beta1" + ] + } + }, + "/apis/apiregistration.k8s.io/v1beta1/apiservices": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of APIService", + "operationId": "deleteApiregistrationV1beta1CollectionAPIService", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiregistration_v1beta1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "apiregistration.k8s.io", + "kind": "APIService", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind APIService", + "operationId": "listApiregistrationV1beta1APIService", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIServiceList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiregistration_v1beta1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "apiregistration.k8s.io", + "kind": "APIService", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create an APIService", + "operationId": "createApiregistrationV1beta1APIService", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIService" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIService" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIService" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIService" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiregistration_v1beta1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "apiregistration.k8s.io", + "kind": "APIService", + "version": "v1beta1" + } + } + }, + "/apis/apiregistration.k8s.io/v1beta1/apiservices/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete an APIService", + "operationId": "deleteApiregistrationV1beta1APIService", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiregistration_v1beta1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "apiregistration.k8s.io", + "kind": "APIService", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified APIService", + "operationId": "readApiregistrationV1beta1APIService", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIService" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiregistration_v1beta1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "apiregistration.k8s.io", + "kind": "APIService", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "name of the APIService", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified APIService", + "operationId": "patchApiregistrationV1beta1APIService", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIService" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiregistration_v1beta1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "apiregistration.k8s.io", + "kind": "APIService", + "version": "v1beta1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified APIService", + "operationId": "replaceApiregistrationV1beta1APIService", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIService" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIService" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIService" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiregistration_v1beta1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "apiregistration.k8s.io", + "kind": "APIService", + "version": "v1beta1" + } + } + }, + "/apis/apiregistration.k8s.io/v1beta1/apiservices/{name}/status": { + "get": { + "consumes": [ + "*/*" + ], + "description": "read status of the specified APIService", + "operationId": "readApiregistrationV1beta1APIServiceStatus", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIService" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiregistration_v1beta1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "apiregistration.k8s.io", + "kind": "APIService", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "name of the APIService", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update status of the specified APIService", + "operationId": "patchApiregistrationV1beta1APIServiceStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIService" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiregistration_v1beta1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "apiregistration.k8s.io", + "kind": "APIService", + "version": "v1beta1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace status of the specified APIService", + "operationId": "replaceApiregistrationV1beta1APIServiceStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIService" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIService" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.kube-aggregator.pkg.apis.apiregistration.v1beta1.APIService" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiregistration_v1beta1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "apiregistration.k8s.io", + "kind": "APIService", + "version": "v1beta1" + } + } + }, + "/apis/apiregistration.k8s.io/v1beta1/watch/apiservices": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of APIService. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchApiregistrationV1beta1APIServiceList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiregistration_v1beta1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "apiregistration.k8s.io", + "kind": "APIService", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/apiregistration.k8s.io/v1beta1/watch/apiservices/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind APIService. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchApiregistrationV1beta1APIService", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apiregistration_v1beta1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "apiregistration.k8s.io", + "kind": "APIService", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the APIService", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/apps/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get information of a group", + "operationId": "getAppsAPIGroup", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps" + ] + } + }, + "/apis/apps/v1/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get available resources", + "operationId": "getAppsV1APIResources", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ] + } + }, + "/apis/apps/v1/controllerrevisions": { + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind ControllerRevision", + "operationId": "listAppsV1ControllerRevisionForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.ControllerRevisionList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "ControllerRevision", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/apps/v1/daemonsets": { + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind DaemonSet", + "operationId": "listAppsV1DaemonSetForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.DaemonSetList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "DaemonSet", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/apps/v1/deployments": { + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind Deployment", + "operationId": "listAppsV1DeploymentForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.DeploymentList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "Deployment", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/apps/v1/namespaces/{namespace}/controllerrevisions": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of ControllerRevision", + "operationId": "deleteAppsV1CollectionNamespacedControllerRevision", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "ControllerRevision", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind ControllerRevision", + "operationId": "listAppsV1NamespacedControllerRevision", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.ControllerRevisionList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "ControllerRevision", + "version": "v1" + } + }, + "parameters": [ + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a ControllerRevision", + "operationId": "createAppsV1NamespacedControllerRevision", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.ControllerRevision" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.ControllerRevision" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.ControllerRevision" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.ControllerRevision" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "ControllerRevision", + "version": "v1" + } + } + }, + "/apis/apps/v1/namespaces/{namespace}/controllerrevisions/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a ControllerRevision", + "operationId": "deleteAppsV1NamespacedControllerRevision", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "ControllerRevision", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified ControllerRevision", + "operationId": "readAppsV1NamespacedControllerRevision", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.ControllerRevision" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "ControllerRevision", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the ControllerRevision", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified ControllerRevision", + "operationId": "patchAppsV1NamespacedControllerRevision", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.ControllerRevision" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "ControllerRevision", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified ControllerRevision", + "operationId": "replaceAppsV1NamespacedControllerRevision", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.ControllerRevision" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.ControllerRevision" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.ControllerRevision" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "ControllerRevision", + "version": "v1" + } + } + }, + "/apis/apps/v1/namespaces/{namespace}/daemonsets": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of DaemonSet", + "operationId": "deleteAppsV1CollectionNamespacedDaemonSet", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "DaemonSet", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind DaemonSet", + "operationId": "listAppsV1NamespacedDaemonSet", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.DaemonSetList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "DaemonSet", + "version": "v1" + } + }, + "parameters": [ + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a DaemonSet", + "operationId": "createAppsV1NamespacedDaemonSet", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.DaemonSet" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.DaemonSet" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.DaemonSet" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.DaemonSet" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "DaemonSet", + "version": "v1" + } + } + }, + "/apis/apps/v1/namespaces/{namespace}/daemonsets/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a DaemonSet", + "operationId": "deleteAppsV1NamespacedDaemonSet", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "DaemonSet", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified DaemonSet", + "operationId": "readAppsV1NamespacedDaemonSet", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.DaemonSet" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "DaemonSet", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the DaemonSet", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified DaemonSet", + "operationId": "patchAppsV1NamespacedDaemonSet", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.DaemonSet" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "DaemonSet", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified DaemonSet", + "operationId": "replaceAppsV1NamespacedDaemonSet", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.DaemonSet" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.DaemonSet" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.DaemonSet" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "DaemonSet", + "version": "v1" + } + } + }, + "/apis/apps/v1/namespaces/{namespace}/daemonsets/{name}/status": { + "get": { + "consumes": [ + "*/*" + ], + "description": "read status of the specified DaemonSet", + "operationId": "readAppsV1NamespacedDaemonSetStatus", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.DaemonSet" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "DaemonSet", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the DaemonSet", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update status of the specified DaemonSet", + "operationId": "patchAppsV1NamespacedDaemonSetStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.DaemonSet" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "DaemonSet", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace status of the specified DaemonSet", + "operationId": "replaceAppsV1NamespacedDaemonSetStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.DaemonSet" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.DaemonSet" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.DaemonSet" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "DaemonSet", + "version": "v1" + } + } + }, + "/apis/apps/v1/namespaces/{namespace}/deployments": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of Deployment", + "operationId": "deleteAppsV1CollectionNamespacedDeployment", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "Deployment", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind Deployment", + "operationId": "listAppsV1NamespacedDeployment", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.DeploymentList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "Deployment", + "version": "v1" + } + }, + "parameters": [ + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a Deployment", + "operationId": "createAppsV1NamespacedDeployment", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.Deployment" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.Deployment" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.Deployment" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.Deployment" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "Deployment", + "version": "v1" + } + } + }, + "/apis/apps/v1/namespaces/{namespace}/deployments/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a Deployment", + "operationId": "deleteAppsV1NamespacedDeployment", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "Deployment", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified Deployment", + "operationId": "readAppsV1NamespacedDeployment", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.Deployment" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "Deployment", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the Deployment", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified Deployment", + "operationId": "patchAppsV1NamespacedDeployment", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.Deployment" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "Deployment", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified Deployment", + "operationId": "replaceAppsV1NamespacedDeployment", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.Deployment" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.Deployment" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.Deployment" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "Deployment", + "version": "v1" + } + } + }, + "/apis/apps/v1/namespaces/{namespace}/deployments/{name}/scale": { + "get": { + "consumes": [ + "*/*" + ], + "description": "read scale of the specified Deployment", + "operationId": "readAppsV1NamespacedDeploymentScale", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v1.Scale" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "Scale", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the Scale", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update scale of the specified Deployment", + "operationId": "patchAppsV1NamespacedDeploymentScale", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v1.Scale" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "Scale", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace scale of the specified Deployment", + "operationId": "replaceAppsV1NamespacedDeploymentScale", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v1.Scale" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v1.Scale" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v1.Scale" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "Scale", + "version": "v1" + } + } + }, + "/apis/apps/v1/namespaces/{namespace}/deployments/{name}/status": { + "get": { + "consumes": [ + "*/*" + ], + "description": "read status of the specified Deployment", + "operationId": "readAppsV1NamespacedDeploymentStatus", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.Deployment" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "Deployment", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the Deployment", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update status of the specified Deployment", + "operationId": "patchAppsV1NamespacedDeploymentStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.Deployment" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "Deployment", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace status of the specified Deployment", + "operationId": "replaceAppsV1NamespacedDeploymentStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.Deployment" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.Deployment" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.Deployment" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "Deployment", + "version": "v1" + } + } + }, + "/apis/apps/v1/namespaces/{namespace}/replicasets": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of ReplicaSet", + "operationId": "deleteAppsV1CollectionNamespacedReplicaSet", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "ReplicaSet", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind ReplicaSet", + "operationId": "listAppsV1NamespacedReplicaSet", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.ReplicaSetList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "ReplicaSet", + "version": "v1" + } + }, + "parameters": [ + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a ReplicaSet", + "operationId": "createAppsV1NamespacedReplicaSet", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.ReplicaSet" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.ReplicaSet" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.ReplicaSet" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.ReplicaSet" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "ReplicaSet", + "version": "v1" + } + } + }, + "/apis/apps/v1/namespaces/{namespace}/replicasets/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a ReplicaSet", + "operationId": "deleteAppsV1NamespacedReplicaSet", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "ReplicaSet", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified ReplicaSet", + "operationId": "readAppsV1NamespacedReplicaSet", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.ReplicaSet" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "ReplicaSet", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the ReplicaSet", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified ReplicaSet", + "operationId": "patchAppsV1NamespacedReplicaSet", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.ReplicaSet" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "ReplicaSet", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified ReplicaSet", + "operationId": "replaceAppsV1NamespacedReplicaSet", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.ReplicaSet" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.ReplicaSet" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.ReplicaSet" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "ReplicaSet", + "version": "v1" + } + } + }, + "/apis/apps/v1/namespaces/{namespace}/replicasets/{name}/scale": { + "get": { + "consumes": [ + "*/*" + ], + "description": "read scale of the specified ReplicaSet", + "operationId": "readAppsV1NamespacedReplicaSetScale", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v1.Scale" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "Scale", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the Scale", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update scale of the specified ReplicaSet", + "operationId": "patchAppsV1NamespacedReplicaSetScale", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v1.Scale" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "Scale", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace scale of the specified ReplicaSet", + "operationId": "replaceAppsV1NamespacedReplicaSetScale", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v1.Scale" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v1.Scale" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v1.Scale" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "Scale", + "version": "v1" + } + } + }, + "/apis/apps/v1/namespaces/{namespace}/replicasets/{name}/status": { + "get": { + "consumes": [ + "*/*" + ], + "description": "read status of the specified ReplicaSet", + "operationId": "readAppsV1NamespacedReplicaSetStatus", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.ReplicaSet" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "ReplicaSet", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the ReplicaSet", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update status of the specified ReplicaSet", + "operationId": "patchAppsV1NamespacedReplicaSetStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.ReplicaSet" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "ReplicaSet", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace status of the specified ReplicaSet", + "operationId": "replaceAppsV1NamespacedReplicaSetStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.ReplicaSet" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.ReplicaSet" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.ReplicaSet" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "ReplicaSet", + "version": "v1" + } + } + }, + "/apis/apps/v1/namespaces/{namespace}/statefulsets": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of StatefulSet", + "operationId": "deleteAppsV1CollectionNamespacedStatefulSet", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "StatefulSet", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind StatefulSet", + "operationId": "listAppsV1NamespacedStatefulSet", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.StatefulSetList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "StatefulSet", + "version": "v1" + } + }, + "parameters": [ + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a StatefulSet", + "operationId": "createAppsV1NamespacedStatefulSet", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.StatefulSet" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.StatefulSet" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.StatefulSet" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.StatefulSet" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "StatefulSet", + "version": "v1" + } + } + }, + "/apis/apps/v1/namespaces/{namespace}/statefulsets/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a StatefulSet", + "operationId": "deleteAppsV1NamespacedStatefulSet", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "StatefulSet", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified StatefulSet", + "operationId": "readAppsV1NamespacedStatefulSet", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.StatefulSet" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "StatefulSet", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the StatefulSet", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified StatefulSet", + "operationId": "patchAppsV1NamespacedStatefulSet", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.StatefulSet" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "StatefulSet", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified StatefulSet", + "operationId": "replaceAppsV1NamespacedStatefulSet", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.StatefulSet" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.StatefulSet" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.StatefulSet" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "StatefulSet", + "version": "v1" + } + } + }, + "/apis/apps/v1/namespaces/{namespace}/statefulsets/{name}/scale": { + "get": { + "consumes": [ + "*/*" + ], + "description": "read scale of the specified StatefulSet", + "operationId": "readAppsV1NamespacedStatefulSetScale", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v1.Scale" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "Scale", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the Scale", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update scale of the specified StatefulSet", + "operationId": "patchAppsV1NamespacedStatefulSetScale", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v1.Scale" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "Scale", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace scale of the specified StatefulSet", + "operationId": "replaceAppsV1NamespacedStatefulSetScale", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v1.Scale" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v1.Scale" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v1.Scale" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "Scale", + "version": "v1" + } + } + }, + "/apis/apps/v1/namespaces/{namespace}/statefulsets/{name}/status": { + "get": { + "consumes": [ + "*/*" + ], + "description": "read status of the specified StatefulSet", + "operationId": "readAppsV1NamespacedStatefulSetStatus", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.StatefulSet" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "StatefulSet", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the StatefulSet", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update status of the specified StatefulSet", + "operationId": "patchAppsV1NamespacedStatefulSetStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.StatefulSet" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "StatefulSet", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace status of the specified StatefulSet", + "operationId": "replaceAppsV1NamespacedStatefulSetStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.StatefulSet" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.StatefulSet" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.StatefulSet" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "StatefulSet", + "version": "v1" + } + } + }, + "/apis/apps/v1/replicasets": { + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind ReplicaSet", + "operationId": "listAppsV1ReplicaSetForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.ReplicaSetList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "ReplicaSet", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/apps/v1/statefulsets": { + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind StatefulSet", + "operationId": "listAppsV1StatefulSetForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.apps.v1.StatefulSetList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "StatefulSet", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/apps/v1/watch/controllerrevisions": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of ControllerRevision. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchAppsV1ControllerRevisionListForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "ControllerRevision", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/apps/v1/watch/daemonsets": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of DaemonSet. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchAppsV1DaemonSetListForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "DaemonSet", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/apps/v1/watch/deployments": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of Deployment. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchAppsV1DeploymentListForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "Deployment", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/apps/v1/watch/namespaces/{namespace}/controllerrevisions": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of ControllerRevision. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchAppsV1NamespacedControllerRevisionList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "ControllerRevision", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/apps/v1/watch/namespaces/{namespace}/controllerrevisions/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind ControllerRevision. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchAppsV1NamespacedControllerRevision", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "ControllerRevision", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the ControllerRevision", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/apps/v1/watch/namespaces/{namespace}/daemonsets": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of DaemonSet. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchAppsV1NamespacedDaemonSetList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "DaemonSet", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/apps/v1/watch/namespaces/{namespace}/daemonsets/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind DaemonSet. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchAppsV1NamespacedDaemonSet", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "DaemonSet", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the DaemonSet", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/apps/v1/watch/namespaces/{namespace}/deployments": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of Deployment. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchAppsV1NamespacedDeploymentList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "Deployment", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/apps/v1/watch/namespaces/{namespace}/deployments/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind Deployment. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchAppsV1NamespacedDeployment", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "Deployment", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the Deployment", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/apps/v1/watch/namespaces/{namespace}/replicasets": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of ReplicaSet. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchAppsV1NamespacedReplicaSetList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "ReplicaSet", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/apps/v1/watch/namespaces/{namespace}/replicasets/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind ReplicaSet. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchAppsV1NamespacedReplicaSet", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "ReplicaSet", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the ReplicaSet", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/apps/v1/watch/namespaces/{namespace}/statefulsets": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of StatefulSet. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchAppsV1NamespacedStatefulSetList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "StatefulSet", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/apps/v1/watch/namespaces/{namespace}/statefulsets/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind StatefulSet. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchAppsV1NamespacedStatefulSet", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "StatefulSet", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the StatefulSet", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/apps/v1/watch/replicasets": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of ReplicaSet. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchAppsV1ReplicaSetListForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "ReplicaSet", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/apps/v1/watch/statefulsets": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of StatefulSet. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchAppsV1StatefulSetListForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "apps_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "apps", + "kind": "StatefulSet", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/authentication.k8s.io/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get information of a group", + "operationId": "getAuthenticationAPIGroup", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "authentication" + ] + } + }, + "/apis/authentication.k8s.io/v1/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get available resources", + "operationId": "getAuthenticationV1APIResources", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "authentication_v1" + ] + } + }, + "/apis/authentication.k8s.io/v1/tokenreviews": { + "parameters": [ + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a TokenReview", + "operationId": "createAuthenticationV1TokenReview", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.authentication.v1.TokenReview" + } + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.authentication.v1.TokenReview" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.authentication.v1.TokenReview" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.authentication.v1.TokenReview" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "authentication_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "authentication.k8s.io", + "kind": "TokenReview", + "version": "v1" + } + } + }, + "/apis/authentication.k8s.io/v1beta1/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get available resources", + "operationId": "getAuthenticationV1beta1APIResources", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "authentication_v1beta1" + ] + } + }, + "/apis/authentication.k8s.io/v1beta1/tokenreviews": { + "parameters": [ + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a TokenReview", + "operationId": "createAuthenticationV1beta1TokenReview", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.authentication.v1beta1.TokenReview" + } + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.authentication.v1beta1.TokenReview" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.authentication.v1beta1.TokenReview" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.authentication.v1beta1.TokenReview" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "authentication_v1beta1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "authentication.k8s.io", + "kind": "TokenReview", + "version": "v1beta1" + } + } + }, + "/apis/authorization.k8s.io/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get information of a group", + "operationId": "getAuthorizationAPIGroup", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "authorization" + ] + } + }, + "/apis/authorization.k8s.io/v1/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get available resources", + "operationId": "getAuthorizationV1APIResources", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "authorization_v1" + ] + } + }, + "/apis/authorization.k8s.io/v1/namespaces/{namespace}/localsubjectaccessreviews": { + "parameters": [ + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a LocalSubjectAccessReview", + "operationId": "createAuthorizationV1NamespacedLocalSubjectAccessReview", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.authorization.v1.LocalSubjectAccessReview" + } + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.authorization.v1.LocalSubjectAccessReview" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.authorization.v1.LocalSubjectAccessReview" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.authorization.v1.LocalSubjectAccessReview" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "authorization_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "authorization.k8s.io", + "kind": "LocalSubjectAccessReview", + "version": "v1" + } + } + }, + "/apis/authorization.k8s.io/v1/selfsubjectaccessreviews": { + "parameters": [ + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a SelfSubjectAccessReview", + "operationId": "createAuthorizationV1SelfSubjectAccessReview", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.authorization.v1.SelfSubjectAccessReview" + } + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.authorization.v1.SelfSubjectAccessReview" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.authorization.v1.SelfSubjectAccessReview" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.authorization.v1.SelfSubjectAccessReview" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "authorization_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "authorization.k8s.io", + "kind": "SelfSubjectAccessReview", + "version": "v1" + } + } + }, + "/apis/authorization.k8s.io/v1/selfsubjectrulesreviews": { + "parameters": [ + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a SelfSubjectRulesReview", + "operationId": "createAuthorizationV1SelfSubjectRulesReview", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.authorization.v1.SelfSubjectRulesReview" + } + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.authorization.v1.SelfSubjectRulesReview" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.authorization.v1.SelfSubjectRulesReview" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.authorization.v1.SelfSubjectRulesReview" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "authorization_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "authorization.k8s.io", + "kind": "SelfSubjectRulesReview", + "version": "v1" + } + } + }, + "/apis/authorization.k8s.io/v1/subjectaccessreviews": { + "parameters": [ + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a SubjectAccessReview", + "operationId": "createAuthorizationV1SubjectAccessReview", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.authorization.v1.SubjectAccessReview" + } + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.authorization.v1.SubjectAccessReview" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.authorization.v1.SubjectAccessReview" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.authorization.v1.SubjectAccessReview" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "authorization_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "authorization.k8s.io", + "kind": "SubjectAccessReview", + "version": "v1" + } + } + }, + "/apis/authorization.k8s.io/v1beta1/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get available resources", + "operationId": "getAuthorizationV1beta1APIResources", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "authorization_v1beta1" + ] + } + }, + "/apis/authorization.k8s.io/v1beta1/namespaces/{namespace}/localsubjectaccessreviews": { + "parameters": [ + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a LocalSubjectAccessReview", + "operationId": "createAuthorizationV1beta1NamespacedLocalSubjectAccessReview", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.authorization.v1beta1.LocalSubjectAccessReview" + } + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.authorization.v1beta1.LocalSubjectAccessReview" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.authorization.v1beta1.LocalSubjectAccessReview" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.authorization.v1beta1.LocalSubjectAccessReview" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "authorization_v1beta1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "authorization.k8s.io", + "kind": "LocalSubjectAccessReview", + "version": "v1beta1" + } + } + }, + "/apis/authorization.k8s.io/v1beta1/selfsubjectaccessreviews": { + "parameters": [ + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a SelfSubjectAccessReview", + "operationId": "createAuthorizationV1beta1SelfSubjectAccessReview", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.authorization.v1beta1.SelfSubjectAccessReview" + } + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.authorization.v1beta1.SelfSubjectAccessReview" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.authorization.v1beta1.SelfSubjectAccessReview" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.authorization.v1beta1.SelfSubjectAccessReview" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "authorization_v1beta1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "authorization.k8s.io", + "kind": "SelfSubjectAccessReview", + "version": "v1beta1" + } + } + }, + "/apis/authorization.k8s.io/v1beta1/selfsubjectrulesreviews": { + "parameters": [ + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a SelfSubjectRulesReview", + "operationId": "createAuthorizationV1beta1SelfSubjectRulesReview", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.authorization.v1beta1.SelfSubjectRulesReview" + } + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.authorization.v1beta1.SelfSubjectRulesReview" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.authorization.v1beta1.SelfSubjectRulesReview" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.authorization.v1beta1.SelfSubjectRulesReview" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "authorization_v1beta1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "authorization.k8s.io", + "kind": "SelfSubjectRulesReview", + "version": "v1beta1" + } + } + }, + "/apis/authorization.k8s.io/v1beta1/subjectaccessreviews": { + "parameters": [ + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a SubjectAccessReview", + "operationId": "createAuthorizationV1beta1SubjectAccessReview", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.authorization.v1beta1.SubjectAccessReview" + } + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.authorization.v1beta1.SubjectAccessReview" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.authorization.v1beta1.SubjectAccessReview" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.authorization.v1beta1.SubjectAccessReview" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "authorization_v1beta1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "authorization.k8s.io", + "kind": "SubjectAccessReview", + "version": "v1beta1" + } + } + }, + "/apis/autoscaling/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get information of a group", + "operationId": "getAutoscalingAPIGroup", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "autoscaling" + ] + } + }, + "/apis/autoscaling/v1/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get available resources", + "operationId": "getAutoscalingV1APIResources", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "autoscaling_v1" + ] + } + }, + "/apis/autoscaling/v1/horizontalpodautoscalers": { + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind HorizontalPodAutoscaler", + "operationId": "listAutoscalingV1HorizontalPodAutoscalerForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscalerList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "autoscaling_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "HorizontalPodAutoscaler", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/autoscaling/v1/namespaces/{namespace}/horizontalpodautoscalers": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of HorizontalPodAutoscaler", + "operationId": "deleteAutoscalingV1CollectionNamespacedHorizontalPodAutoscaler", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "autoscaling_v1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "HorizontalPodAutoscaler", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind HorizontalPodAutoscaler", + "operationId": "listAutoscalingV1NamespacedHorizontalPodAutoscaler", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscalerList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "autoscaling_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "HorizontalPodAutoscaler", + "version": "v1" + } + }, + "parameters": [ + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a HorizontalPodAutoscaler", + "operationId": "createAutoscalingV1NamespacedHorizontalPodAutoscaler", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscaler" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscaler" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscaler" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscaler" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "autoscaling_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "HorizontalPodAutoscaler", + "version": "v1" + } + } + }, + "/apis/autoscaling/v1/namespaces/{namespace}/horizontalpodautoscalers/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a HorizontalPodAutoscaler", + "operationId": "deleteAutoscalingV1NamespacedHorizontalPodAutoscaler", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "autoscaling_v1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "HorizontalPodAutoscaler", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified HorizontalPodAutoscaler", + "operationId": "readAutoscalingV1NamespacedHorizontalPodAutoscaler", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscaler" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "autoscaling_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "HorizontalPodAutoscaler", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the HorizontalPodAutoscaler", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified HorizontalPodAutoscaler", + "operationId": "patchAutoscalingV1NamespacedHorizontalPodAutoscaler", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscaler" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "autoscaling_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "HorizontalPodAutoscaler", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified HorizontalPodAutoscaler", + "operationId": "replaceAutoscalingV1NamespacedHorizontalPodAutoscaler", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscaler" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscaler" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscaler" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "autoscaling_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "HorizontalPodAutoscaler", + "version": "v1" + } + } + }, + "/apis/autoscaling/v1/namespaces/{namespace}/horizontalpodautoscalers/{name}/status": { + "get": { + "consumes": [ + "*/*" + ], + "description": "read status of the specified HorizontalPodAutoscaler", + "operationId": "readAutoscalingV1NamespacedHorizontalPodAutoscalerStatus", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscaler" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "autoscaling_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "HorizontalPodAutoscaler", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the HorizontalPodAutoscaler", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update status of the specified HorizontalPodAutoscaler", + "operationId": "patchAutoscalingV1NamespacedHorizontalPodAutoscalerStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscaler" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "autoscaling_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "HorizontalPodAutoscaler", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace status of the specified HorizontalPodAutoscaler", + "operationId": "replaceAutoscalingV1NamespacedHorizontalPodAutoscalerStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscaler" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscaler" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v1.HorizontalPodAutoscaler" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "autoscaling_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "HorizontalPodAutoscaler", + "version": "v1" + } + } + }, + "/apis/autoscaling/v1/watch/horizontalpodautoscalers": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of HorizontalPodAutoscaler. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchAutoscalingV1HorizontalPodAutoscalerListForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "autoscaling_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "HorizontalPodAutoscaler", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/autoscaling/v1/watch/namespaces/{namespace}/horizontalpodautoscalers": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of HorizontalPodAutoscaler. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchAutoscalingV1NamespacedHorizontalPodAutoscalerList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "autoscaling_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "HorizontalPodAutoscaler", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/autoscaling/v1/watch/namespaces/{namespace}/horizontalpodautoscalers/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind HorizontalPodAutoscaler. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchAutoscalingV1NamespacedHorizontalPodAutoscaler", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "autoscaling_v1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "HorizontalPodAutoscaler", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the HorizontalPodAutoscaler", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/autoscaling/v2beta1/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get available resources", + "operationId": "getAutoscalingV2beta1APIResources", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "autoscaling_v2beta1" + ] + } + }, + "/apis/autoscaling/v2beta1/horizontalpodautoscalers": { + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind HorizontalPodAutoscaler", + "operationId": "listAutoscalingV2beta1HorizontalPodAutoscalerForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscalerList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "autoscaling_v2beta1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "HorizontalPodAutoscaler", + "version": "v2beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/autoscaling/v2beta1/namespaces/{namespace}/horizontalpodautoscalers": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of HorizontalPodAutoscaler", + "operationId": "deleteAutoscalingV2beta1CollectionNamespacedHorizontalPodAutoscaler", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "autoscaling_v2beta1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "HorizontalPodAutoscaler", + "version": "v2beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind HorizontalPodAutoscaler", + "operationId": "listAutoscalingV2beta1NamespacedHorizontalPodAutoscaler", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscalerList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "autoscaling_v2beta1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "HorizontalPodAutoscaler", + "version": "v2beta1" + } + }, + "parameters": [ + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a HorizontalPodAutoscaler", + "operationId": "createAutoscalingV2beta1NamespacedHorizontalPodAutoscaler", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscaler" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscaler" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscaler" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscaler" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "autoscaling_v2beta1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "HorizontalPodAutoscaler", + "version": "v2beta1" + } + } + }, + "/apis/autoscaling/v2beta1/namespaces/{namespace}/horizontalpodautoscalers/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a HorizontalPodAutoscaler", + "operationId": "deleteAutoscalingV2beta1NamespacedHorizontalPodAutoscaler", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "autoscaling_v2beta1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "HorizontalPodAutoscaler", + "version": "v2beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified HorizontalPodAutoscaler", + "operationId": "readAutoscalingV2beta1NamespacedHorizontalPodAutoscaler", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscaler" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "autoscaling_v2beta1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "HorizontalPodAutoscaler", + "version": "v2beta1" + } + }, + "parameters": [ + { + "description": "name of the HorizontalPodAutoscaler", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified HorizontalPodAutoscaler", + "operationId": "patchAutoscalingV2beta1NamespacedHorizontalPodAutoscaler", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscaler" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "autoscaling_v2beta1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "HorizontalPodAutoscaler", + "version": "v2beta1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified HorizontalPodAutoscaler", + "operationId": "replaceAutoscalingV2beta1NamespacedHorizontalPodAutoscaler", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscaler" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscaler" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscaler" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "autoscaling_v2beta1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "HorizontalPodAutoscaler", + "version": "v2beta1" + } + } + }, + "/apis/autoscaling/v2beta1/namespaces/{namespace}/horizontalpodautoscalers/{name}/status": { + "get": { + "consumes": [ + "*/*" + ], + "description": "read status of the specified HorizontalPodAutoscaler", + "operationId": "readAutoscalingV2beta1NamespacedHorizontalPodAutoscalerStatus", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscaler" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "autoscaling_v2beta1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "HorizontalPodAutoscaler", + "version": "v2beta1" + } + }, + "parameters": [ + { + "description": "name of the HorizontalPodAutoscaler", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update status of the specified HorizontalPodAutoscaler", + "operationId": "patchAutoscalingV2beta1NamespacedHorizontalPodAutoscalerStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscaler" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "autoscaling_v2beta1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "HorizontalPodAutoscaler", + "version": "v2beta1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace status of the specified HorizontalPodAutoscaler", + "operationId": "replaceAutoscalingV2beta1NamespacedHorizontalPodAutoscalerStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscaler" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscaler" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta1.HorizontalPodAutoscaler" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "autoscaling_v2beta1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "HorizontalPodAutoscaler", + "version": "v2beta1" + } + } + }, + "/apis/autoscaling/v2beta1/watch/horizontalpodautoscalers": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of HorizontalPodAutoscaler. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchAutoscalingV2beta1HorizontalPodAutoscalerListForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "autoscaling_v2beta1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "HorizontalPodAutoscaler", + "version": "v2beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/autoscaling/v2beta1/watch/namespaces/{namespace}/horizontalpodautoscalers": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of HorizontalPodAutoscaler. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchAutoscalingV2beta1NamespacedHorizontalPodAutoscalerList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "autoscaling_v2beta1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "HorizontalPodAutoscaler", + "version": "v2beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/autoscaling/v2beta1/watch/namespaces/{namespace}/horizontalpodautoscalers/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind HorizontalPodAutoscaler. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchAutoscalingV2beta1NamespacedHorizontalPodAutoscaler", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "autoscaling_v2beta1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "HorizontalPodAutoscaler", + "version": "v2beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the HorizontalPodAutoscaler", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/autoscaling/v2beta2/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get available resources", + "operationId": "getAutoscalingV2beta2APIResources", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "autoscaling_v2beta2" + ] + } + }, + "/apis/autoscaling/v2beta2/horizontalpodautoscalers": { + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind HorizontalPodAutoscaler", + "operationId": "listAutoscalingV2beta2HorizontalPodAutoscalerForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "autoscaling_v2beta2" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "HorizontalPodAutoscaler", + "version": "v2beta2" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/autoscaling/v2beta2/namespaces/{namespace}/horizontalpodautoscalers": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of HorizontalPodAutoscaler", + "operationId": "deleteAutoscalingV2beta2CollectionNamespacedHorizontalPodAutoscaler", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "autoscaling_v2beta2" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "HorizontalPodAutoscaler", + "version": "v2beta2" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind HorizontalPodAutoscaler", + "operationId": "listAutoscalingV2beta2NamespacedHorizontalPodAutoscaler", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscalerList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "autoscaling_v2beta2" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "HorizontalPodAutoscaler", + "version": "v2beta2" + } + }, + "parameters": [ + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a HorizontalPodAutoscaler", + "operationId": "createAutoscalingV2beta2NamespacedHorizontalPodAutoscaler", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscaler" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscaler" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscaler" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscaler" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "autoscaling_v2beta2" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "HorizontalPodAutoscaler", + "version": "v2beta2" + } + } + }, + "/apis/autoscaling/v2beta2/namespaces/{namespace}/horizontalpodautoscalers/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a HorizontalPodAutoscaler", + "operationId": "deleteAutoscalingV2beta2NamespacedHorizontalPodAutoscaler", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "autoscaling_v2beta2" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "HorizontalPodAutoscaler", + "version": "v2beta2" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified HorizontalPodAutoscaler", + "operationId": "readAutoscalingV2beta2NamespacedHorizontalPodAutoscaler", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscaler" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "autoscaling_v2beta2" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "HorizontalPodAutoscaler", + "version": "v2beta2" + } + }, + "parameters": [ + { + "description": "name of the HorizontalPodAutoscaler", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified HorizontalPodAutoscaler", + "operationId": "patchAutoscalingV2beta2NamespacedHorizontalPodAutoscaler", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscaler" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "autoscaling_v2beta2" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "HorizontalPodAutoscaler", + "version": "v2beta2" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified HorizontalPodAutoscaler", + "operationId": "replaceAutoscalingV2beta2NamespacedHorizontalPodAutoscaler", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscaler" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscaler" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscaler" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "autoscaling_v2beta2" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "HorizontalPodAutoscaler", + "version": "v2beta2" + } + } + }, + "/apis/autoscaling/v2beta2/namespaces/{namespace}/horizontalpodautoscalers/{name}/status": { + "get": { + "consumes": [ + "*/*" + ], + "description": "read status of the specified HorizontalPodAutoscaler", + "operationId": "readAutoscalingV2beta2NamespacedHorizontalPodAutoscalerStatus", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscaler" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "autoscaling_v2beta2" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "HorizontalPodAutoscaler", + "version": "v2beta2" + } + }, + "parameters": [ + { + "description": "name of the HorizontalPodAutoscaler", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update status of the specified HorizontalPodAutoscaler", + "operationId": "patchAutoscalingV2beta2NamespacedHorizontalPodAutoscalerStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscaler" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "autoscaling_v2beta2" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "HorizontalPodAutoscaler", + "version": "v2beta2" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace status of the specified HorizontalPodAutoscaler", + "operationId": "replaceAutoscalingV2beta2NamespacedHorizontalPodAutoscalerStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscaler" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscaler" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.autoscaling.v2beta2.HorizontalPodAutoscaler" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "autoscaling_v2beta2" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "HorizontalPodAutoscaler", + "version": "v2beta2" + } + } + }, + "/apis/autoscaling/v2beta2/watch/horizontalpodautoscalers": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of HorizontalPodAutoscaler. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchAutoscalingV2beta2HorizontalPodAutoscalerListForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "autoscaling_v2beta2" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "HorizontalPodAutoscaler", + "version": "v2beta2" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/autoscaling/v2beta2/watch/namespaces/{namespace}/horizontalpodautoscalers": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of HorizontalPodAutoscaler. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchAutoscalingV2beta2NamespacedHorizontalPodAutoscalerList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "autoscaling_v2beta2" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "HorizontalPodAutoscaler", + "version": "v2beta2" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/autoscaling/v2beta2/watch/namespaces/{namespace}/horizontalpodautoscalers/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind HorizontalPodAutoscaler. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchAutoscalingV2beta2NamespacedHorizontalPodAutoscaler", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "autoscaling_v2beta2" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "autoscaling", + "kind": "HorizontalPodAutoscaler", + "version": "v2beta2" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the HorizontalPodAutoscaler", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/batch/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get information of a group", + "operationId": "getBatchAPIGroup", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "batch" + ] + } + }, + "/apis/batch/v1/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get available resources", + "operationId": "getBatchV1APIResources", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "batch_v1" + ] + } + }, + "/apis/batch/v1/jobs": { + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind Job", + "operationId": "listBatchV1JobForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.batch.v1.JobList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "batch_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "batch", + "kind": "Job", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/batch/v1/namespaces/{namespace}/jobs": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of Job", + "operationId": "deleteBatchV1CollectionNamespacedJob", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "batch_v1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "batch", + "kind": "Job", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind Job", + "operationId": "listBatchV1NamespacedJob", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.batch.v1.JobList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "batch_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "batch", + "kind": "Job", + "version": "v1" + } + }, + "parameters": [ + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a Job", + "operationId": "createBatchV1NamespacedJob", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.batch.v1.Job" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.batch.v1.Job" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.batch.v1.Job" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.batch.v1.Job" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "batch_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "batch", + "kind": "Job", + "version": "v1" + } + } + }, + "/apis/batch/v1/namespaces/{namespace}/jobs/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a Job", + "operationId": "deleteBatchV1NamespacedJob", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "batch_v1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "batch", + "kind": "Job", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified Job", + "operationId": "readBatchV1NamespacedJob", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.batch.v1.Job" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "batch_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "batch", + "kind": "Job", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the Job", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified Job", + "operationId": "patchBatchV1NamespacedJob", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.batch.v1.Job" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "batch_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "batch", + "kind": "Job", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified Job", + "operationId": "replaceBatchV1NamespacedJob", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.batch.v1.Job" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.batch.v1.Job" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.batch.v1.Job" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "batch_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "batch", + "kind": "Job", + "version": "v1" + } + } + }, + "/apis/batch/v1/namespaces/{namespace}/jobs/{name}/status": { + "get": { + "consumes": [ + "*/*" + ], + "description": "read status of the specified Job", + "operationId": "readBatchV1NamespacedJobStatus", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.batch.v1.Job" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "batch_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "batch", + "kind": "Job", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the Job", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update status of the specified Job", + "operationId": "patchBatchV1NamespacedJobStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.batch.v1.Job" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "batch_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "batch", + "kind": "Job", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace status of the specified Job", + "operationId": "replaceBatchV1NamespacedJobStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.batch.v1.Job" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.batch.v1.Job" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.batch.v1.Job" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "batch_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "batch", + "kind": "Job", + "version": "v1" + } + } + }, + "/apis/batch/v1/watch/jobs": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of Job. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchBatchV1JobListForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "batch_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "batch", + "kind": "Job", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/batch/v1/watch/namespaces/{namespace}/jobs": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of Job. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchBatchV1NamespacedJobList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "batch_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "batch", + "kind": "Job", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/batch/v1/watch/namespaces/{namespace}/jobs/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind Job. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchBatchV1NamespacedJob", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "batch_v1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "batch", + "kind": "Job", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the Job", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/batch/v1beta1/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get available resources", + "operationId": "getBatchV1beta1APIResources", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "batch_v1beta1" + ] + } + }, + "/apis/batch/v1beta1/cronjobs": { + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind CronJob", + "operationId": "listBatchV1beta1CronJobForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.batch.v1beta1.CronJobList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "batch_v1beta1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "batch", + "kind": "CronJob", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/batch/v1beta1/namespaces/{namespace}/cronjobs": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of CronJob", + "operationId": "deleteBatchV1beta1CollectionNamespacedCronJob", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "batch_v1beta1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "batch", + "kind": "CronJob", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind CronJob", + "operationId": "listBatchV1beta1NamespacedCronJob", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.batch.v1beta1.CronJobList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "batch_v1beta1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "batch", + "kind": "CronJob", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a CronJob", + "operationId": "createBatchV1beta1NamespacedCronJob", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.batch.v1beta1.CronJob" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.batch.v1beta1.CronJob" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.batch.v1beta1.CronJob" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.batch.v1beta1.CronJob" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "batch_v1beta1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "batch", + "kind": "CronJob", + "version": "v1beta1" + } + } + }, + "/apis/batch/v1beta1/namespaces/{namespace}/cronjobs/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a CronJob", + "operationId": "deleteBatchV1beta1NamespacedCronJob", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "batch_v1beta1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "batch", + "kind": "CronJob", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified CronJob", + "operationId": "readBatchV1beta1NamespacedCronJob", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.batch.v1beta1.CronJob" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "batch_v1beta1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "batch", + "kind": "CronJob", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "name of the CronJob", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified CronJob", + "operationId": "patchBatchV1beta1NamespacedCronJob", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.batch.v1beta1.CronJob" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "batch_v1beta1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "batch", + "kind": "CronJob", + "version": "v1beta1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified CronJob", + "operationId": "replaceBatchV1beta1NamespacedCronJob", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.batch.v1beta1.CronJob" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.batch.v1beta1.CronJob" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.batch.v1beta1.CronJob" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "batch_v1beta1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "batch", + "kind": "CronJob", + "version": "v1beta1" + } + } + }, + "/apis/batch/v1beta1/namespaces/{namespace}/cronjobs/{name}/status": { + "get": { + "consumes": [ + "*/*" + ], + "description": "read status of the specified CronJob", + "operationId": "readBatchV1beta1NamespacedCronJobStatus", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.batch.v1beta1.CronJob" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "batch_v1beta1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "batch", + "kind": "CronJob", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "name of the CronJob", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update status of the specified CronJob", + "operationId": "patchBatchV1beta1NamespacedCronJobStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.batch.v1beta1.CronJob" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "batch_v1beta1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "batch", + "kind": "CronJob", + "version": "v1beta1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace status of the specified CronJob", + "operationId": "replaceBatchV1beta1NamespacedCronJobStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.batch.v1beta1.CronJob" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.batch.v1beta1.CronJob" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.batch.v1beta1.CronJob" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "batch_v1beta1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "batch", + "kind": "CronJob", + "version": "v1beta1" + } + } + }, + "/apis/batch/v1beta1/watch/cronjobs": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of CronJob. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchBatchV1beta1CronJobListForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "batch_v1beta1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "batch", + "kind": "CronJob", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/batch/v1beta1/watch/namespaces/{namespace}/cronjobs": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of CronJob. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchBatchV1beta1NamespacedCronJobList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "batch_v1beta1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "batch", + "kind": "CronJob", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/batch/v1beta1/watch/namespaces/{namespace}/cronjobs/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind CronJob. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchBatchV1beta1NamespacedCronJob", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "batch_v1beta1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "batch", + "kind": "CronJob", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the CronJob", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/certificates.k8s.io/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get information of a group", + "operationId": "getCertificatesAPIGroup", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "certificates" + ] + } + }, + "/apis/certificates.k8s.io/v1/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get available resources", + "operationId": "getCertificatesV1APIResources", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "certificates_v1" + ] + } + }, + "/apis/certificates.k8s.io/v1/certificatesigningrequests": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of CertificateSigningRequest", + "operationId": "deleteCertificatesV1CollectionCertificateSigningRequest", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "certificates_v1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "certificates.k8s.io", + "kind": "CertificateSigningRequest", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind CertificateSigningRequest", + "operationId": "listCertificatesV1CertificateSigningRequest", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequestList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "certificates_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "certificates.k8s.io", + "kind": "CertificateSigningRequest", + "version": "v1" + } + }, + "parameters": [ + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a CertificateSigningRequest", + "operationId": "createCertificatesV1CertificateSigningRequest", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequest" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequest" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequest" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequest" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "certificates_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "certificates.k8s.io", + "kind": "CertificateSigningRequest", + "version": "v1" + } + } + }, + "/apis/certificates.k8s.io/v1/certificatesigningrequests/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a CertificateSigningRequest", + "operationId": "deleteCertificatesV1CertificateSigningRequest", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "certificates_v1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "certificates.k8s.io", + "kind": "CertificateSigningRequest", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified CertificateSigningRequest", + "operationId": "readCertificatesV1CertificateSigningRequest", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequest" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "certificates_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "certificates.k8s.io", + "kind": "CertificateSigningRequest", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the CertificateSigningRequest", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified CertificateSigningRequest", + "operationId": "patchCertificatesV1CertificateSigningRequest", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequest" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "certificates_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "certificates.k8s.io", + "kind": "CertificateSigningRequest", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified CertificateSigningRequest", + "operationId": "replaceCertificatesV1CertificateSigningRequest", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequest" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequest" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequest" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "certificates_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "certificates.k8s.io", + "kind": "CertificateSigningRequest", + "version": "v1" + } + } + }, + "/apis/certificates.k8s.io/v1/certificatesigningrequests/{name}/approval": { + "get": { + "consumes": [ + "*/*" + ], + "description": "read approval of the specified CertificateSigningRequest", + "operationId": "readCertificatesV1CertificateSigningRequestApproval", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequest" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "certificates_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "certificates.k8s.io", + "kind": "CertificateSigningRequest", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the CertificateSigningRequest", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update approval of the specified CertificateSigningRequest", + "operationId": "patchCertificatesV1CertificateSigningRequestApproval", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequest" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "certificates_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "certificates.k8s.io", + "kind": "CertificateSigningRequest", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace approval of the specified CertificateSigningRequest", + "operationId": "replaceCertificatesV1CertificateSigningRequestApproval", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequest" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequest" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequest" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "certificates_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "certificates.k8s.io", + "kind": "CertificateSigningRequest", + "version": "v1" + } + } + }, + "/apis/certificates.k8s.io/v1/certificatesigningrequests/{name}/status": { + "get": { + "consumes": [ + "*/*" + ], + "description": "read status of the specified CertificateSigningRequest", + "operationId": "readCertificatesV1CertificateSigningRequestStatus", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequest" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "certificates_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "certificates.k8s.io", + "kind": "CertificateSigningRequest", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the CertificateSigningRequest", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update status of the specified CertificateSigningRequest", + "operationId": "patchCertificatesV1CertificateSigningRequestStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequest" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "certificates_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "certificates.k8s.io", + "kind": "CertificateSigningRequest", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace status of the specified CertificateSigningRequest", + "operationId": "replaceCertificatesV1CertificateSigningRequestStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequest" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequest" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.certificates.v1.CertificateSigningRequest" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "certificates_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "certificates.k8s.io", + "kind": "CertificateSigningRequest", + "version": "v1" + } + } + }, + "/apis/certificates.k8s.io/v1/watch/certificatesigningrequests": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of CertificateSigningRequest. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchCertificatesV1CertificateSigningRequestList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "certificates_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "certificates.k8s.io", + "kind": "CertificateSigningRequest", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/certificates.k8s.io/v1/watch/certificatesigningrequests/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind CertificateSigningRequest. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchCertificatesV1CertificateSigningRequest", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "certificates_v1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "certificates.k8s.io", + "kind": "CertificateSigningRequest", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the CertificateSigningRequest", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/certificates.k8s.io/v1beta1/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get available resources", + "operationId": "getCertificatesV1beta1APIResources", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "certificates_v1beta1" + ] + } + }, + "/apis/certificates.k8s.io/v1beta1/certificatesigningrequests": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of CertificateSigningRequest", + "operationId": "deleteCertificatesV1beta1CollectionCertificateSigningRequest", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "certificates_v1beta1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "certificates.k8s.io", + "kind": "CertificateSigningRequest", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind CertificateSigningRequest", + "operationId": "listCertificatesV1beta1CertificateSigningRequest", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequestList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "certificates_v1beta1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "certificates.k8s.io", + "kind": "CertificateSigningRequest", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a CertificateSigningRequest", + "operationId": "createCertificatesV1beta1CertificateSigningRequest", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequest" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequest" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequest" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequest" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "certificates_v1beta1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "certificates.k8s.io", + "kind": "CertificateSigningRequest", + "version": "v1beta1" + } + } + }, + "/apis/certificates.k8s.io/v1beta1/certificatesigningrequests/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a CertificateSigningRequest", + "operationId": "deleteCertificatesV1beta1CertificateSigningRequest", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "certificates_v1beta1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "certificates.k8s.io", + "kind": "CertificateSigningRequest", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified CertificateSigningRequest", + "operationId": "readCertificatesV1beta1CertificateSigningRequest", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequest" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "certificates_v1beta1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "certificates.k8s.io", + "kind": "CertificateSigningRequest", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "name of the CertificateSigningRequest", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified CertificateSigningRequest", + "operationId": "patchCertificatesV1beta1CertificateSigningRequest", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequest" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "certificates_v1beta1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "certificates.k8s.io", + "kind": "CertificateSigningRequest", + "version": "v1beta1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified CertificateSigningRequest", + "operationId": "replaceCertificatesV1beta1CertificateSigningRequest", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequest" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequest" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequest" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "certificates_v1beta1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "certificates.k8s.io", + "kind": "CertificateSigningRequest", + "version": "v1beta1" + } + } + }, + "/apis/certificates.k8s.io/v1beta1/certificatesigningrequests/{name}/approval": { + "get": { + "consumes": [ + "*/*" + ], + "description": "read approval of the specified CertificateSigningRequest", + "operationId": "readCertificatesV1beta1CertificateSigningRequestApproval", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequest" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "certificates_v1beta1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "certificates.k8s.io", + "kind": "CertificateSigningRequest", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "name of the CertificateSigningRequest", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update approval of the specified CertificateSigningRequest", + "operationId": "patchCertificatesV1beta1CertificateSigningRequestApproval", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequest" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "certificates_v1beta1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "certificates.k8s.io", + "kind": "CertificateSigningRequest", + "version": "v1beta1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace approval of the specified CertificateSigningRequest", + "operationId": "replaceCertificatesV1beta1CertificateSigningRequestApproval", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequest" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequest" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequest" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "certificates_v1beta1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "certificates.k8s.io", + "kind": "CertificateSigningRequest", + "version": "v1beta1" + } + } + }, + "/apis/certificates.k8s.io/v1beta1/certificatesigningrequests/{name}/status": { + "get": { + "consumes": [ + "*/*" + ], + "description": "read status of the specified CertificateSigningRequest", + "operationId": "readCertificatesV1beta1CertificateSigningRequestStatus", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequest" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "certificates_v1beta1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "certificates.k8s.io", + "kind": "CertificateSigningRequest", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "name of the CertificateSigningRequest", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update status of the specified CertificateSigningRequest", + "operationId": "patchCertificatesV1beta1CertificateSigningRequestStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequest" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "certificates_v1beta1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "certificates.k8s.io", + "kind": "CertificateSigningRequest", + "version": "v1beta1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace status of the specified CertificateSigningRequest", + "operationId": "replaceCertificatesV1beta1CertificateSigningRequestStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequest" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequest" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.certificates.v1beta1.CertificateSigningRequest" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "certificates_v1beta1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "certificates.k8s.io", + "kind": "CertificateSigningRequest", + "version": "v1beta1" + } + } + }, + "/apis/certificates.k8s.io/v1beta1/watch/certificatesigningrequests": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of CertificateSigningRequest. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchCertificatesV1beta1CertificateSigningRequestList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "certificates_v1beta1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "certificates.k8s.io", + "kind": "CertificateSigningRequest", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/certificates.k8s.io/v1beta1/watch/certificatesigningrequests/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind CertificateSigningRequest. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchCertificatesV1beta1CertificateSigningRequest", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "certificates_v1beta1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "certificates.k8s.io", + "kind": "CertificateSigningRequest", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the CertificateSigningRequest", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/coordination.k8s.io/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get information of a group", + "operationId": "getCoordinationAPIGroup", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "coordination" + ] + } + }, + "/apis/coordination.k8s.io/v1/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get available resources", + "operationId": "getCoordinationV1APIResources", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "coordination_v1" + ] + } + }, + "/apis/coordination.k8s.io/v1/leases": { + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind Lease", + "operationId": "listCoordinationV1LeaseForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.coordination.v1.LeaseList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "coordination_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "coordination.k8s.io", + "kind": "Lease", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/coordination.k8s.io/v1/namespaces/{namespace}/leases": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of Lease", + "operationId": "deleteCoordinationV1CollectionNamespacedLease", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "coordination_v1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "coordination.k8s.io", + "kind": "Lease", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind Lease", + "operationId": "listCoordinationV1NamespacedLease", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.coordination.v1.LeaseList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "coordination_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "coordination.k8s.io", + "kind": "Lease", + "version": "v1" + } + }, + "parameters": [ + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a Lease", + "operationId": "createCoordinationV1NamespacedLease", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.coordination.v1.Lease" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.coordination.v1.Lease" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.coordination.v1.Lease" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.coordination.v1.Lease" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "coordination_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "coordination.k8s.io", + "kind": "Lease", + "version": "v1" + } + } + }, + "/apis/coordination.k8s.io/v1/namespaces/{namespace}/leases/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a Lease", + "operationId": "deleteCoordinationV1NamespacedLease", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "coordination_v1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "coordination.k8s.io", + "kind": "Lease", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified Lease", + "operationId": "readCoordinationV1NamespacedLease", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.coordination.v1.Lease" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "coordination_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "coordination.k8s.io", + "kind": "Lease", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the Lease", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified Lease", + "operationId": "patchCoordinationV1NamespacedLease", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.coordination.v1.Lease" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "coordination_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "coordination.k8s.io", + "kind": "Lease", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified Lease", + "operationId": "replaceCoordinationV1NamespacedLease", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.coordination.v1.Lease" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.coordination.v1.Lease" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.coordination.v1.Lease" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "coordination_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "coordination.k8s.io", + "kind": "Lease", + "version": "v1" + } + } + }, + "/apis/coordination.k8s.io/v1/watch/leases": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of Lease. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchCoordinationV1LeaseListForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "coordination_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "coordination.k8s.io", + "kind": "Lease", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/coordination.k8s.io/v1/watch/namespaces/{namespace}/leases": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of Lease. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchCoordinationV1NamespacedLeaseList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "coordination_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "coordination.k8s.io", + "kind": "Lease", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/coordination.k8s.io/v1/watch/namespaces/{namespace}/leases/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind Lease. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchCoordinationV1NamespacedLease", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "coordination_v1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "coordination.k8s.io", + "kind": "Lease", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the Lease", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/coordination.k8s.io/v1beta1/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get available resources", + "operationId": "getCoordinationV1beta1APIResources", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "coordination_v1beta1" + ] + } + }, + "/apis/coordination.k8s.io/v1beta1/leases": { + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind Lease", + "operationId": "listCoordinationV1beta1LeaseForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.coordination.v1beta1.LeaseList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "coordination_v1beta1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "coordination.k8s.io", + "kind": "Lease", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/coordination.k8s.io/v1beta1/namespaces/{namespace}/leases": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of Lease", + "operationId": "deleteCoordinationV1beta1CollectionNamespacedLease", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "coordination_v1beta1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "coordination.k8s.io", + "kind": "Lease", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind Lease", + "operationId": "listCoordinationV1beta1NamespacedLease", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.coordination.v1beta1.LeaseList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "coordination_v1beta1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "coordination.k8s.io", + "kind": "Lease", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a Lease", + "operationId": "createCoordinationV1beta1NamespacedLease", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.coordination.v1beta1.Lease" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.coordination.v1beta1.Lease" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.coordination.v1beta1.Lease" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.coordination.v1beta1.Lease" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "coordination_v1beta1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "coordination.k8s.io", + "kind": "Lease", + "version": "v1beta1" + } + } + }, + "/apis/coordination.k8s.io/v1beta1/namespaces/{namespace}/leases/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a Lease", + "operationId": "deleteCoordinationV1beta1NamespacedLease", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "coordination_v1beta1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "coordination.k8s.io", + "kind": "Lease", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified Lease", + "operationId": "readCoordinationV1beta1NamespacedLease", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.coordination.v1beta1.Lease" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "coordination_v1beta1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "coordination.k8s.io", + "kind": "Lease", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "name of the Lease", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified Lease", + "operationId": "patchCoordinationV1beta1NamespacedLease", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.coordination.v1beta1.Lease" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "coordination_v1beta1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "coordination.k8s.io", + "kind": "Lease", + "version": "v1beta1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified Lease", + "operationId": "replaceCoordinationV1beta1NamespacedLease", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.coordination.v1beta1.Lease" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.coordination.v1beta1.Lease" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.coordination.v1beta1.Lease" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "coordination_v1beta1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "coordination.k8s.io", + "kind": "Lease", + "version": "v1beta1" + } + } + }, + "/apis/coordination.k8s.io/v1beta1/watch/leases": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of Lease. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchCoordinationV1beta1LeaseListForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "coordination_v1beta1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "coordination.k8s.io", + "kind": "Lease", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/coordination.k8s.io/v1beta1/watch/namespaces/{namespace}/leases": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of Lease. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchCoordinationV1beta1NamespacedLeaseList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "coordination_v1beta1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "coordination.k8s.io", + "kind": "Lease", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/coordination.k8s.io/v1beta1/watch/namespaces/{namespace}/leases/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind Lease. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchCoordinationV1beta1NamespacedLease", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "coordination_v1beta1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "coordination.k8s.io", + "kind": "Lease", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the Lease", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/discovery.k8s.io/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get information of a group", + "operationId": "getDiscoveryAPIGroup", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "discovery" + ] + } + }, + "/apis/discovery.k8s.io/v1beta1/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get available resources", + "operationId": "getDiscoveryV1beta1APIResources", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "discovery_v1beta1" + ] + } + }, + "/apis/discovery.k8s.io/v1beta1/endpointslices": { + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind EndpointSlice", + "operationId": "listDiscoveryV1beta1EndpointSliceForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.discovery.v1beta1.EndpointSliceList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "discovery_v1beta1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "discovery.k8s.io", + "kind": "EndpointSlice", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/discovery.k8s.io/v1beta1/namespaces/{namespace}/endpointslices": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of EndpointSlice", + "operationId": "deleteDiscoveryV1beta1CollectionNamespacedEndpointSlice", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "discovery_v1beta1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "discovery.k8s.io", + "kind": "EndpointSlice", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind EndpointSlice", + "operationId": "listDiscoveryV1beta1NamespacedEndpointSlice", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.discovery.v1beta1.EndpointSliceList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "discovery_v1beta1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "discovery.k8s.io", + "kind": "EndpointSlice", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create an EndpointSlice", + "operationId": "createDiscoveryV1beta1NamespacedEndpointSlice", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.discovery.v1beta1.EndpointSlice" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.discovery.v1beta1.EndpointSlice" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.discovery.v1beta1.EndpointSlice" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.discovery.v1beta1.EndpointSlice" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "discovery_v1beta1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "discovery.k8s.io", + "kind": "EndpointSlice", + "version": "v1beta1" + } + } + }, + "/apis/discovery.k8s.io/v1beta1/namespaces/{namespace}/endpointslices/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete an EndpointSlice", + "operationId": "deleteDiscoveryV1beta1NamespacedEndpointSlice", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "discovery_v1beta1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "discovery.k8s.io", + "kind": "EndpointSlice", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified EndpointSlice", + "operationId": "readDiscoveryV1beta1NamespacedEndpointSlice", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.discovery.v1beta1.EndpointSlice" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "discovery_v1beta1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "discovery.k8s.io", + "kind": "EndpointSlice", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "name of the EndpointSlice", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified EndpointSlice", + "operationId": "patchDiscoveryV1beta1NamespacedEndpointSlice", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.discovery.v1beta1.EndpointSlice" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "discovery_v1beta1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "discovery.k8s.io", + "kind": "EndpointSlice", + "version": "v1beta1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified EndpointSlice", + "operationId": "replaceDiscoveryV1beta1NamespacedEndpointSlice", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.discovery.v1beta1.EndpointSlice" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.discovery.v1beta1.EndpointSlice" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.discovery.v1beta1.EndpointSlice" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "discovery_v1beta1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "discovery.k8s.io", + "kind": "EndpointSlice", + "version": "v1beta1" + } + } + }, + "/apis/discovery.k8s.io/v1beta1/watch/endpointslices": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of EndpointSlice. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchDiscoveryV1beta1EndpointSliceListForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "discovery_v1beta1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "discovery.k8s.io", + "kind": "EndpointSlice", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/discovery.k8s.io/v1beta1/watch/namespaces/{namespace}/endpointslices": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of EndpointSlice. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchDiscoveryV1beta1NamespacedEndpointSliceList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "discovery_v1beta1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "discovery.k8s.io", + "kind": "EndpointSlice", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/discovery.k8s.io/v1beta1/watch/namespaces/{namespace}/endpointslices/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind EndpointSlice. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchDiscoveryV1beta1NamespacedEndpointSlice", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "discovery_v1beta1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "discovery.k8s.io", + "kind": "EndpointSlice", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the EndpointSlice", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/events.k8s.io/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get information of a group", + "operationId": "getEventsAPIGroup", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "events" + ] + } + }, + "/apis/events.k8s.io/v1/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get available resources", + "operationId": "getEventsV1APIResources", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "events_v1" + ] + } + }, + "/apis/events.k8s.io/v1/events": { + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind Event", + "operationId": "listEventsV1EventForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.events.v1.EventList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "events_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "events.k8s.io", + "kind": "Event", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/events.k8s.io/v1/namespaces/{namespace}/events": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of Event", + "operationId": "deleteEventsV1CollectionNamespacedEvent", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "events_v1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "events.k8s.io", + "kind": "Event", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind Event", + "operationId": "listEventsV1NamespacedEvent", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.events.v1.EventList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "events_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "events.k8s.io", + "kind": "Event", + "version": "v1" + } + }, + "parameters": [ + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create an Event", + "operationId": "createEventsV1NamespacedEvent", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.events.v1.Event" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.events.v1.Event" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.events.v1.Event" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.events.v1.Event" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "events_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "events.k8s.io", + "kind": "Event", + "version": "v1" + } + } + }, + "/apis/events.k8s.io/v1/namespaces/{namespace}/events/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete an Event", + "operationId": "deleteEventsV1NamespacedEvent", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "events_v1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "events.k8s.io", + "kind": "Event", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified Event", + "operationId": "readEventsV1NamespacedEvent", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.events.v1.Event" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "events_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "events.k8s.io", + "kind": "Event", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the Event", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified Event", + "operationId": "patchEventsV1NamespacedEvent", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.events.v1.Event" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "events_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "events.k8s.io", + "kind": "Event", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified Event", + "operationId": "replaceEventsV1NamespacedEvent", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.events.v1.Event" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.events.v1.Event" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.events.v1.Event" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "events_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "events.k8s.io", + "kind": "Event", + "version": "v1" + } + } + }, + "/apis/events.k8s.io/v1/watch/events": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of Event. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchEventsV1EventListForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "events_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "events.k8s.io", + "kind": "Event", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/events.k8s.io/v1/watch/namespaces/{namespace}/events": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of Event. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchEventsV1NamespacedEventList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "events_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "events.k8s.io", + "kind": "Event", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/events.k8s.io/v1/watch/namespaces/{namespace}/events/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind Event. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchEventsV1NamespacedEvent", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "events_v1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "events.k8s.io", + "kind": "Event", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the Event", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/events.k8s.io/v1beta1/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get available resources", + "operationId": "getEventsV1beta1APIResources", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "events_v1beta1" + ] + } + }, + "/apis/events.k8s.io/v1beta1/events": { + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind Event", + "operationId": "listEventsV1beta1EventForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.events.v1beta1.EventList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "events_v1beta1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "events.k8s.io", + "kind": "Event", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/events.k8s.io/v1beta1/namespaces/{namespace}/events": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of Event", + "operationId": "deleteEventsV1beta1CollectionNamespacedEvent", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "events_v1beta1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "events.k8s.io", + "kind": "Event", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind Event", + "operationId": "listEventsV1beta1NamespacedEvent", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.events.v1beta1.EventList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "events_v1beta1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "events.k8s.io", + "kind": "Event", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create an Event", + "operationId": "createEventsV1beta1NamespacedEvent", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.events.v1beta1.Event" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.events.v1beta1.Event" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.events.v1beta1.Event" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.events.v1beta1.Event" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "events_v1beta1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "events.k8s.io", + "kind": "Event", + "version": "v1beta1" + } + } + }, + "/apis/events.k8s.io/v1beta1/namespaces/{namespace}/events/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete an Event", + "operationId": "deleteEventsV1beta1NamespacedEvent", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "events_v1beta1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "events.k8s.io", + "kind": "Event", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified Event", + "operationId": "readEventsV1beta1NamespacedEvent", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.events.v1beta1.Event" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "events_v1beta1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "events.k8s.io", + "kind": "Event", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "name of the Event", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified Event", + "operationId": "patchEventsV1beta1NamespacedEvent", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.events.v1beta1.Event" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "events_v1beta1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "events.k8s.io", + "kind": "Event", + "version": "v1beta1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified Event", + "operationId": "replaceEventsV1beta1NamespacedEvent", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.events.v1beta1.Event" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.events.v1beta1.Event" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.events.v1beta1.Event" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "events_v1beta1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "events.k8s.io", + "kind": "Event", + "version": "v1beta1" + } + } + }, + "/apis/events.k8s.io/v1beta1/watch/events": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of Event. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchEventsV1beta1EventListForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "events_v1beta1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "events.k8s.io", + "kind": "Event", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/events.k8s.io/v1beta1/watch/namespaces/{namespace}/events": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of Event. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchEventsV1beta1NamespacedEventList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "events_v1beta1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "events.k8s.io", + "kind": "Event", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/events.k8s.io/v1beta1/watch/namespaces/{namespace}/events/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind Event. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchEventsV1beta1NamespacedEvent", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "events_v1beta1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "events.k8s.io", + "kind": "Event", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the Event", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/extensions/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get information of a group", + "operationId": "getExtensionsAPIGroup", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "extensions" + ] + } + }, + "/apis/extensions/v1beta1/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get available resources", + "operationId": "getExtensionsV1beta1APIResources", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "extensions_v1beta1" + ] + } + }, + "/apis/extensions/v1beta1/ingresses": { + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind Ingress", + "operationId": "listExtensionsV1beta1IngressForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.IngressList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "extensions_v1beta1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "extensions", + "kind": "Ingress", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/extensions/v1beta1/namespaces/{namespace}/ingresses": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of Ingress", + "operationId": "deleteExtensionsV1beta1CollectionNamespacedIngress", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "extensions_v1beta1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "extensions", + "kind": "Ingress", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind Ingress", + "operationId": "listExtensionsV1beta1NamespacedIngress", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.IngressList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "extensions_v1beta1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "extensions", + "kind": "Ingress", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create an Ingress", + "operationId": "createExtensionsV1beta1NamespacedIngress", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "extensions_v1beta1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "extensions", + "kind": "Ingress", + "version": "v1beta1" + } + } + }, + "/apis/extensions/v1beta1/namespaces/{namespace}/ingresses/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete an Ingress", + "operationId": "deleteExtensionsV1beta1NamespacedIngress", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "extensions_v1beta1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "extensions", + "kind": "Ingress", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified Ingress", + "operationId": "readExtensionsV1beta1NamespacedIngress", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "extensions_v1beta1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "extensions", + "kind": "Ingress", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "name of the Ingress", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified Ingress", + "operationId": "patchExtensionsV1beta1NamespacedIngress", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "extensions_v1beta1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "extensions", + "kind": "Ingress", + "version": "v1beta1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified Ingress", + "operationId": "replaceExtensionsV1beta1NamespacedIngress", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "extensions_v1beta1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "extensions", + "kind": "Ingress", + "version": "v1beta1" + } + } + }, + "/apis/extensions/v1beta1/namespaces/{namespace}/ingresses/{name}/status": { + "get": { + "consumes": [ + "*/*" + ], + "description": "read status of the specified Ingress", + "operationId": "readExtensionsV1beta1NamespacedIngressStatus", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "extensions_v1beta1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "extensions", + "kind": "Ingress", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "name of the Ingress", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update status of the specified Ingress", + "operationId": "patchExtensionsV1beta1NamespacedIngressStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "extensions_v1beta1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "extensions", + "kind": "Ingress", + "version": "v1beta1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace status of the specified Ingress", + "operationId": "replaceExtensionsV1beta1NamespacedIngressStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.Ingress" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "extensions_v1beta1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "extensions", + "kind": "Ingress", + "version": "v1beta1" + } + } + }, + "/apis/extensions/v1beta1/watch/ingresses": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of Ingress. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchExtensionsV1beta1IngressListForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "extensions_v1beta1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "extensions", + "kind": "Ingress", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/extensions/v1beta1/watch/namespaces/{namespace}/ingresses": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of Ingress. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchExtensionsV1beta1NamespacedIngressList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "extensions_v1beta1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "extensions", + "kind": "Ingress", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/extensions/v1beta1/watch/namespaces/{namespace}/ingresses/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind Ingress. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchExtensionsV1beta1NamespacedIngress", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "extensions_v1beta1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "extensions", + "kind": "Ingress", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the Ingress", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/flowcontrol.apiserver.k8s.io/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get information of a group", + "operationId": "getFlowcontrolApiserverAPIGroup", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "flowcontrolApiserver" + ] + } + }, + "/apis/flowcontrol.apiserver.k8s.io/v1beta1/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get available resources", + "operationId": "getFlowcontrolApiserverV1beta1APIResources", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "flowcontrolApiserver_v1beta1" + ] + } + }, + "/apis/flowcontrol.apiserver.k8s.io/v1beta1/flowschemas": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of FlowSchema", + "operationId": "deleteFlowcontrolApiserverV1beta1CollectionFlowSchema", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "flowcontrolApiserver_v1beta1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "FlowSchema", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind FlowSchema", + "operationId": "listFlowcontrolApiserverV1beta1FlowSchema", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchemaList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "flowcontrolApiserver_v1beta1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "FlowSchema", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a FlowSchema", + "operationId": "createFlowcontrolApiserverV1beta1FlowSchema", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchema" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchema" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchema" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchema" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "flowcontrolApiserver_v1beta1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "FlowSchema", + "version": "v1beta1" + } + } + }, + "/apis/flowcontrol.apiserver.k8s.io/v1beta1/flowschemas/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a FlowSchema", + "operationId": "deleteFlowcontrolApiserverV1beta1FlowSchema", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "flowcontrolApiserver_v1beta1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "FlowSchema", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified FlowSchema", + "operationId": "readFlowcontrolApiserverV1beta1FlowSchema", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchema" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "flowcontrolApiserver_v1beta1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "FlowSchema", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "name of the FlowSchema", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified FlowSchema", + "operationId": "patchFlowcontrolApiserverV1beta1FlowSchema", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchema" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "flowcontrolApiserver_v1beta1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "FlowSchema", + "version": "v1beta1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified FlowSchema", + "operationId": "replaceFlowcontrolApiserverV1beta1FlowSchema", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchema" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchema" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchema" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "flowcontrolApiserver_v1beta1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "FlowSchema", + "version": "v1beta1" + } + } + }, + "/apis/flowcontrol.apiserver.k8s.io/v1beta1/flowschemas/{name}/status": { + "get": { + "consumes": [ + "*/*" + ], + "description": "read status of the specified FlowSchema", + "operationId": "readFlowcontrolApiserverV1beta1FlowSchemaStatus", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchema" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "flowcontrolApiserver_v1beta1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "FlowSchema", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "name of the FlowSchema", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update status of the specified FlowSchema", + "operationId": "patchFlowcontrolApiserverV1beta1FlowSchemaStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchema" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "flowcontrolApiserver_v1beta1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "FlowSchema", + "version": "v1beta1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace status of the specified FlowSchema", + "operationId": "replaceFlowcontrolApiserverV1beta1FlowSchemaStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchema" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchema" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.FlowSchema" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "flowcontrolApiserver_v1beta1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "FlowSchema", + "version": "v1beta1" + } + } + }, + "/apis/flowcontrol.apiserver.k8s.io/v1beta1/prioritylevelconfigurations": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of PriorityLevelConfiguration", + "operationId": "deleteFlowcontrolApiserverV1beta1CollectionPriorityLevelConfiguration", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "flowcontrolApiserver_v1beta1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "PriorityLevelConfiguration", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind PriorityLevelConfiguration", + "operationId": "listFlowcontrolApiserverV1beta1PriorityLevelConfiguration", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfigurationList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "flowcontrolApiserver_v1beta1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "PriorityLevelConfiguration", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a PriorityLevelConfiguration", + "operationId": "createFlowcontrolApiserverV1beta1PriorityLevelConfiguration", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfiguration" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfiguration" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfiguration" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfiguration" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "flowcontrolApiserver_v1beta1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "PriorityLevelConfiguration", + "version": "v1beta1" + } + } + }, + "/apis/flowcontrol.apiserver.k8s.io/v1beta1/prioritylevelconfigurations/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a PriorityLevelConfiguration", + "operationId": "deleteFlowcontrolApiserverV1beta1PriorityLevelConfiguration", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "flowcontrolApiserver_v1beta1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "PriorityLevelConfiguration", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified PriorityLevelConfiguration", + "operationId": "readFlowcontrolApiserverV1beta1PriorityLevelConfiguration", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfiguration" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "flowcontrolApiserver_v1beta1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "PriorityLevelConfiguration", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "name of the PriorityLevelConfiguration", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified PriorityLevelConfiguration", + "operationId": "patchFlowcontrolApiserverV1beta1PriorityLevelConfiguration", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfiguration" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "flowcontrolApiserver_v1beta1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "PriorityLevelConfiguration", + "version": "v1beta1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified PriorityLevelConfiguration", + "operationId": "replaceFlowcontrolApiserverV1beta1PriorityLevelConfiguration", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfiguration" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfiguration" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfiguration" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "flowcontrolApiserver_v1beta1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "PriorityLevelConfiguration", + "version": "v1beta1" + } + } + }, + "/apis/flowcontrol.apiserver.k8s.io/v1beta1/prioritylevelconfigurations/{name}/status": { + "get": { + "consumes": [ + "*/*" + ], + "description": "read status of the specified PriorityLevelConfiguration", + "operationId": "readFlowcontrolApiserverV1beta1PriorityLevelConfigurationStatus", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfiguration" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "flowcontrolApiserver_v1beta1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "PriorityLevelConfiguration", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "name of the PriorityLevelConfiguration", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update status of the specified PriorityLevelConfiguration", + "operationId": "patchFlowcontrolApiserverV1beta1PriorityLevelConfigurationStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfiguration" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "flowcontrolApiserver_v1beta1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "PriorityLevelConfiguration", + "version": "v1beta1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace status of the specified PriorityLevelConfiguration", + "operationId": "replaceFlowcontrolApiserverV1beta1PriorityLevelConfigurationStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfiguration" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfiguration" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.flowcontrol.v1beta1.PriorityLevelConfiguration" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "flowcontrolApiserver_v1beta1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "PriorityLevelConfiguration", + "version": "v1beta1" + } + } + }, + "/apis/flowcontrol.apiserver.k8s.io/v1beta1/watch/flowschemas": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of FlowSchema. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchFlowcontrolApiserverV1beta1FlowSchemaList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "flowcontrolApiserver_v1beta1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "FlowSchema", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/flowcontrol.apiserver.k8s.io/v1beta1/watch/flowschemas/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind FlowSchema. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchFlowcontrolApiserverV1beta1FlowSchema", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "flowcontrolApiserver_v1beta1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "FlowSchema", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the FlowSchema", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/flowcontrol.apiserver.k8s.io/v1beta1/watch/prioritylevelconfigurations": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of PriorityLevelConfiguration. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchFlowcontrolApiserverV1beta1PriorityLevelConfigurationList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "flowcontrolApiserver_v1beta1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "PriorityLevelConfiguration", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/flowcontrol.apiserver.k8s.io/v1beta1/watch/prioritylevelconfigurations/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind PriorityLevelConfiguration. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchFlowcontrolApiserverV1beta1PriorityLevelConfiguration", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "flowcontrolApiserver_v1beta1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "PriorityLevelConfiguration", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the PriorityLevelConfiguration", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/networking.k8s.io/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get information of a group", + "operationId": "getNetworkingAPIGroup", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking" + ] + } + }, + "/apis/networking.k8s.io/v1/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get available resources", + "operationId": "getNetworkingV1APIResources", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1" + ] + } + }, + "/apis/networking.k8s.io/v1/ingressclasses": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of IngressClass", + "operationId": "deleteNetworkingV1CollectionIngressClass", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "IngressClass", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind IngressClass", + "operationId": "listNetworkingV1IngressClass", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1.IngressClassList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "IngressClass", + "version": "v1" + } + }, + "parameters": [ + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create an IngressClass", + "operationId": "createNetworkingV1IngressClass", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1.IngressClass" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1.IngressClass" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1.IngressClass" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1.IngressClass" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "IngressClass", + "version": "v1" + } + } + }, + "/apis/networking.k8s.io/v1/ingressclasses/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete an IngressClass", + "operationId": "deleteNetworkingV1IngressClass", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "IngressClass", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified IngressClass", + "operationId": "readNetworkingV1IngressClass", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1.IngressClass" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "IngressClass", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the IngressClass", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified IngressClass", + "operationId": "patchNetworkingV1IngressClass", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1.IngressClass" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "IngressClass", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified IngressClass", + "operationId": "replaceNetworkingV1IngressClass", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1.IngressClass" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1.IngressClass" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1.IngressClass" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "IngressClass", + "version": "v1" + } + } + }, + "/apis/networking.k8s.io/v1/ingresses": { + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind Ingress", + "operationId": "listNetworkingV1IngressForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1.IngressList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "Ingress", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/networking.k8s.io/v1/namespaces/{namespace}/ingresses": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of Ingress", + "operationId": "deleteNetworkingV1CollectionNamespacedIngress", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "Ingress", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind Ingress", + "operationId": "listNetworkingV1NamespacedIngress", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1.IngressList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "Ingress", + "version": "v1" + } + }, + "parameters": [ + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create an Ingress", + "operationId": "createNetworkingV1NamespacedIngress", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1.Ingress" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1.Ingress" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1.Ingress" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1.Ingress" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "Ingress", + "version": "v1" + } + } + }, + "/apis/networking.k8s.io/v1/namespaces/{namespace}/ingresses/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete an Ingress", + "operationId": "deleteNetworkingV1NamespacedIngress", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "Ingress", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified Ingress", + "operationId": "readNetworkingV1NamespacedIngress", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1.Ingress" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "Ingress", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the Ingress", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified Ingress", + "operationId": "patchNetworkingV1NamespacedIngress", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1.Ingress" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "Ingress", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified Ingress", + "operationId": "replaceNetworkingV1NamespacedIngress", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1.Ingress" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1.Ingress" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1.Ingress" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "Ingress", + "version": "v1" + } + } + }, + "/apis/networking.k8s.io/v1/namespaces/{namespace}/ingresses/{name}/status": { + "get": { + "consumes": [ + "*/*" + ], + "description": "read status of the specified Ingress", + "operationId": "readNetworkingV1NamespacedIngressStatus", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1.Ingress" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "Ingress", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the Ingress", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update status of the specified Ingress", + "operationId": "patchNetworkingV1NamespacedIngressStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1.Ingress" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "Ingress", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace status of the specified Ingress", + "operationId": "replaceNetworkingV1NamespacedIngressStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1.Ingress" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1.Ingress" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1.Ingress" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "Ingress", + "version": "v1" + } + } + }, + "/apis/networking.k8s.io/v1/namespaces/{namespace}/networkpolicies": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of NetworkPolicy", + "operationId": "deleteNetworkingV1CollectionNamespacedNetworkPolicy", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "NetworkPolicy", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind NetworkPolicy", + "operationId": "listNetworkingV1NamespacedNetworkPolicy", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1.NetworkPolicyList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "NetworkPolicy", + "version": "v1" + } + }, + "parameters": [ + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a NetworkPolicy", + "operationId": "createNetworkingV1NamespacedNetworkPolicy", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1.NetworkPolicy" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1.NetworkPolicy" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1.NetworkPolicy" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1.NetworkPolicy" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "NetworkPolicy", + "version": "v1" + } + } + }, + "/apis/networking.k8s.io/v1/namespaces/{namespace}/networkpolicies/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a NetworkPolicy", + "operationId": "deleteNetworkingV1NamespacedNetworkPolicy", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "NetworkPolicy", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified NetworkPolicy", + "operationId": "readNetworkingV1NamespacedNetworkPolicy", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1.NetworkPolicy" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "NetworkPolicy", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the NetworkPolicy", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified NetworkPolicy", + "operationId": "patchNetworkingV1NamespacedNetworkPolicy", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1.NetworkPolicy" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "NetworkPolicy", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified NetworkPolicy", + "operationId": "replaceNetworkingV1NamespacedNetworkPolicy", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1.NetworkPolicy" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1.NetworkPolicy" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1.NetworkPolicy" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "NetworkPolicy", + "version": "v1" + } + } + }, + "/apis/networking.k8s.io/v1/networkpolicies": { + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind NetworkPolicy", + "operationId": "listNetworkingV1NetworkPolicyForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1.NetworkPolicyList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "NetworkPolicy", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/networking.k8s.io/v1/watch/ingressclasses": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of IngressClass. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchNetworkingV1IngressClassList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "IngressClass", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/networking.k8s.io/v1/watch/ingressclasses/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind IngressClass. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchNetworkingV1IngressClass", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "IngressClass", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the IngressClass", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/networking.k8s.io/v1/watch/ingresses": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of Ingress. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchNetworkingV1IngressListForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "Ingress", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/networking.k8s.io/v1/watch/namespaces/{namespace}/ingresses": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of Ingress. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchNetworkingV1NamespacedIngressList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "Ingress", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/networking.k8s.io/v1/watch/namespaces/{namespace}/ingresses/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind Ingress. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchNetworkingV1NamespacedIngress", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "Ingress", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the Ingress", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/networking.k8s.io/v1/watch/namespaces/{namespace}/networkpolicies": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of NetworkPolicy. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchNetworkingV1NamespacedNetworkPolicyList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "NetworkPolicy", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/networking.k8s.io/v1/watch/namespaces/{namespace}/networkpolicies/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind NetworkPolicy. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchNetworkingV1NamespacedNetworkPolicy", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "NetworkPolicy", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the NetworkPolicy", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/networking.k8s.io/v1/watch/networkpolicies": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of NetworkPolicy. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchNetworkingV1NetworkPolicyListForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "NetworkPolicy", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/networking.k8s.io/v1beta1/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get available resources", + "operationId": "getNetworkingV1beta1APIResources", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1beta1" + ] + } + }, + "/apis/networking.k8s.io/v1beta1/ingressclasses": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of IngressClass", + "operationId": "deleteNetworkingV1beta1CollectionIngressClass", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1beta1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "IngressClass", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind IngressClass", + "operationId": "listNetworkingV1beta1IngressClass", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1beta1.IngressClassList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1beta1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "IngressClass", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create an IngressClass", + "operationId": "createNetworkingV1beta1IngressClass", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1beta1.IngressClass" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1beta1.IngressClass" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1beta1.IngressClass" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1beta1.IngressClass" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1beta1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "IngressClass", + "version": "v1beta1" + } + } + }, + "/apis/networking.k8s.io/v1beta1/ingressclasses/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete an IngressClass", + "operationId": "deleteNetworkingV1beta1IngressClass", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1beta1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "IngressClass", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified IngressClass", + "operationId": "readNetworkingV1beta1IngressClass", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1beta1.IngressClass" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1beta1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "IngressClass", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "name of the IngressClass", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified IngressClass", + "operationId": "patchNetworkingV1beta1IngressClass", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1beta1.IngressClass" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1beta1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "IngressClass", + "version": "v1beta1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified IngressClass", + "operationId": "replaceNetworkingV1beta1IngressClass", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1beta1.IngressClass" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1beta1.IngressClass" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1beta1.IngressClass" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1beta1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "IngressClass", + "version": "v1beta1" + } + } + }, + "/apis/networking.k8s.io/v1beta1/ingresses": { + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind Ingress", + "operationId": "listNetworkingV1beta1IngressForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1beta1.IngressList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1beta1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "Ingress", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/networking.k8s.io/v1beta1/namespaces/{namespace}/ingresses": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of Ingress", + "operationId": "deleteNetworkingV1beta1CollectionNamespacedIngress", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1beta1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "Ingress", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind Ingress", + "operationId": "listNetworkingV1beta1NamespacedIngress", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1beta1.IngressList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1beta1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "Ingress", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create an Ingress", + "operationId": "createNetworkingV1beta1NamespacedIngress", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1beta1.Ingress" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1beta1.Ingress" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1beta1.Ingress" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1beta1.Ingress" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1beta1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "Ingress", + "version": "v1beta1" + } + } + }, + "/apis/networking.k8s.io/v1beta1/namespaces/{namespace}/ingresses/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete an Ingress", + "operationId": "deleteNetworkingV1beta1NamespacedIngress", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1beta1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "Ingress", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified Ingress", + "operationId": "readNetworkingV1beta1NamespacedIngress", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1beta1.Ingress" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1beta1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "Ingress", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "name of the Ingress", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified Ingress", + "operationId": "patchNetworkingV1beta1NamespacedIngress", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1beta1.Ingress" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1beta1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "Ingress", + "version": "v1beta1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified Ingress", + "operationId": "replaceNetworkingV1beta1NamespacedIngress", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1beta1.Ingress" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1beta1.Ingress" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1beta1.Ingress" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1beta1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "Ingress", + "version": "v1beta1" + } + } + }, + "/apis/networking.k8s.io/v1beta1/namespaces/{namespace}/ingresses/{name}/status": { + "get": { + "consumes": [ + "*/*" + ], + "description": "read status of the specified Ingress", + "operationId": "readNetworkingV1beta1NamespacedIngressStatus", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1beta1.Ingress" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1beta1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "Ingress", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "name of the Ingress", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update status of the specified Ingress", + "operationId": "patchNetworkingV1beta1NamespacedIngressStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1beta1.Ingress" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1beta1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "Ingress", + "version": "v1beta1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace status of the specified Ingress", + "operationId": "replaceNetworkingV1beta1NamespacedIngressStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1beta1.Ingress" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1beta1.Ingress" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.networking.v1beta1.Ingress" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1beta1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "Ingress", + "version": "v1beta1" + } + } + }, + "/apis/networking.k8s.io/v1beta1/watch/ingressclasses": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of IngressClass. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchNetworkingV1beta1IngressClassList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1beta1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "IngressClass", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/networking.k8s.io/v1beta1/watch/ingressclasses/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind IngressClass. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchNetworkingV1beta1IngressClass", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1beta1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "IngressClass", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the IngressClass", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/networking.k8s.io/v1beta1/watch/ingresses": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of Ingress. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchNetworkingV1beta1IngressListForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1beta1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "Ingress", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/networking.k8s.io/v1beta1/watch/namespaces/{namespace}/ingresses": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of Ingress. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchNetworkingV1beta1NamespacedIngressList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1beta1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "Ingress", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/networking.k8s.io/v1beta1/watch/namespaces/{namespace}/ingresses/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind Ingress. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchNetworkingV1beta1NamespacedIngress", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "networking_v1beta1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "networking.k8s.io", + "kind": "Ingress", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the Ingress", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/node.k8s.io/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get information of a group", + "operationId": "getNodeAPIGroup", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "node" + ] + } + }, + "/apis/node.k8s.io/v1/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get available resources", + "operationId": "getNodeV1APIResources", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "node_v1" + ] + } + }, + "/apis/node.k8s.io/v1/runtimeclasses": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of RuntimeClass", + "operationId": "deleteNodeV1CollectionRuntimeClass", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "node_v1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "node.k8s.io", + "kind": "RuntimeClass", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind RuntimeClass", + "operationId": "listNodeV1RuntimeClass", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.node.v1.RuntimeClassList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "node_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "node.k8s.io", + "kind": "RuntimeClass", + "version": "v1" + } + }, + "parameters": [ + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a RuntimeClass", + "operationId": "createNodeV1RuntimeClass", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.node.v1.RuntimeClass" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.node.v1.RuntimeClass" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.node.v1.RuntimeClass" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.node.v1.RuntimeClass" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "node_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "node.k8s.io", + "kind": "RuntimeClass", + "version": "v1" + } + } + }, + "/apis/node.k8s.io/v1/runtimeclasses/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a RuntimeClass", + "operationId": "deleteNodeV1RuntimeClass", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "node_v1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "node.k8s.io", + "kind": "RuntimeClass", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified RuntimeClass", + "operationId": "readNodeV1RuntimeClass", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.node.v1.RuntimeClass" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "node_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "node.k8s.io", + "kind": "RuntimeClass", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the RuntimeClass", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified RuntimeClass", + "operationId": "patchNodeV1RuntimeClass", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.node.v1.RuntimeClass" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "node_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "node.k8s.io", + "kind": "RuntimeClass", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified RuntimeClass", + "operationId": "replaceNodeV1RuntimeClass", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.node.v1.RuntimeClass" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.node.v1.RuntimeClass" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.node.v1.RuntimeClass" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "node_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "node.k8s.io", + "kind": "RuntimeClass", + "version": "v1" + } + } + }, + "/apis/node.k8s.io/v1/watch/runtimeclasses": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of RuntimeClass. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchNodeV1RuntimeClassList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "node_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "node.k8s.io", + "kind": "RuntimeClass", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/node.k8s.io/v1/watch/runtimeclasses/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind RuntimeClass. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchNodeV1RuntimeClass", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "node_v1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "node.k8s.io", + "kind": "RuntimeClass", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the RuntimeClass", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/node.k8s.io/v1beta1/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get available resources", + "operationId": "getNodeV1beta1APIResources", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "node_v1beta1" + ] + } + }, + "/apis/node.k8s.io/v1beta1/runtimeclasses": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of RuntimeClass", + "operationId": "deleteNodeV1beta1CollectionRuntimeClass", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "node_v1beta1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "node.k8s.io", + "kind": "RuntimeClass", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind RuntimeClass", + "operationId": "listNodeV1beta1RuntimeClass", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.node.v1beta1.RuntimeClassList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "node_v1beta1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "node.k8s.io", + "kind": "RuntimeClass", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a RuntimeClass", + "operationId": "createNodeV1beta1RuntimeClass", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.node.v1beta1.RuntimeClass" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.node.v1beta1.RuntimeClass" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.node.v1beta1.RuntimeClass" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.node.v1beta1.RuntimeClass" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "node_v1beta1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "node.k8s.io", + "kind": "RuntimeClass", + "version": "v1beta1" + } + } + }, + "/apis/node.k8s.io/v1beta1/runtimeclasses/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a RuntimeClass", + "operationId": "deleteNodeV1beta1RuntimeClass", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "node_v1beta1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "node.k8s.io", + "kind": "RuntimeClass", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified RuntimeClass", + "operationId": "readNodeV1beta1RuntimeClass", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.node.v1beta1.RuntimeClass" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "node_v1beta1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "node.k8s.io", + "kind": "RuntimeClass", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "name of the RuntimeClass", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified RuntimeClass", + "operationId": "patchNodeV1beta1RuntimeClass", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.node.v1beta1.RuntimeClass" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "node_v1beta1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "node.k8s.io", + "kind": "RuntimeClass", + "version": "v1beta1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified RuntimeClass", + "operationId": "replaceNodeV1beta1RuntimeClass", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.node.v1beta1.RuntimeClass" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.node.v1beta1.RuntimeClass" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.node.v1beta1.RuntimeClass" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "node_v1beta1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "node.k8s.io", + "kind": "RuntimeClass", + "version": "v1beta1" + } + } + }, + "/apis/node.k8s.io/v1beta1/watch/runtimeclasses": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of RuntimeClass. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchNodeV1beta1RuntimeClassList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "node_v1beta1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "node.k8s.io", + "kind": "RuntimeClass", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/node.k8s.io/v1beta1/watch/runtimeclasses/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind RuntimeClass. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchNodeV1beta1RuntimeClass", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "node_v1beta1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "node.k8s.io", + "kind": "RuntimeClass", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the RuntimeClass", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/policy/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get information of a group", + "operationId": "getPolicyAPIGroup", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "policy" + ] + } + }, + "/apis/policy/v1beta1/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get available resources", + "operationId": "getPolicyV1beta1APIResources", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "policy_v1beta1" + ] + } + }, + "/apis/policy/v1beta1/namespaces/{namespace}/poddisruptionbudgets": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of PodDisruptionBudget", + "operationId": "deletePolicyV1beta1CollectionNamespacedPodDisruptionBudget", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "policy_v1beta1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "policy", + "kind": "PodDisruptionBudget", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind PodDisruptionBudget", + "operationId": "listPolicyV1beta1NamespacedPodDisruptionBudget", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudgetList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "policy_v1beta1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "policy", + "kind": "PodDisruptionBudget", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a PodDisruptionBudget", + "operationId": "createPolicyV1beta1NamespacedPodDisruptionBudget", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudget" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudget" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudget" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudget" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "policy_v1beta1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "policy", + "kind": "PodDisruptionBudget", + "version": "v1beta1" + } + } + }, + "/apis/policy/v1beta1/namespaces/{namespace}/poddisruptionbudgets/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a PodDisruptionBudget", + "operationId": "deletePolicyV1beta1NamespacedPodDisruptionBudget", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "policy_v1beta1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "policy", + "kind": "PodDisruptionBudget", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified PodDisruptionBudget", + "operationId": "readPolicyV1beta1NamespacedPodDisruptionBudget", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudget" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "policy_v1beta1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "policy", + "kind": "PodDisruptionBudget", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "name of the PodDisruptionBudget", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified PodDisruptionBudget", + "operationId": "patchPolicyV1beta1NamespacedPodDisruptionBudget", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudget" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "policy_v1beta1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "policy", + "kind": "PodDisruptionBudget", + "version": "v1beta1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified PodDisruptionBudget", + "operationId": "replacePolicyV1beta1NamespacedPodDisruptionBudget", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudget" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudget" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudget" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "policy_v1beta1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "policy", + "kind": "PodDisruptionBudget", + "version": "v1beta1" + } + } + }, + "/apis/policy/v1beta1/namespaces/{namespace}/poddisruptionbudgets/{name}/status": { + "get": { + "consumes": [ + "*/*" + ], + "description": "read status of the specified PodDisruptionBudget", + "operationId": "readPolicyV1beta1NamespacedPodDisruptionBudgetStatus", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudget" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "policy_v1beta1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "policy", + "kind": "PodDisruptionBudget", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "name of the PodDisruptionBudget", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update status of the specified PodDisruptionBudget", + "operationId": "patchPolicyV1beta1NamespacedPodDisruptionBudgetStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudget" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "policy_v1beta1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "policy", + "kind": "PodDisruptionBudget", + "version": "v1beta1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace status of the specified PodDisruptionBudget", + "operationId": "replacePolicyV1beta1NamespacedPodDisruptionBudgetStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudget" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudget" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudget" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "policy_v1beta1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "policy", + "kind": "PodDisruptionBudget", + "version": "v1beta1" + } + } + }, + "/apis/policy/v1beta1/poddisruptionbudgets": { + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind PodDisruptionBudget", + "operationId": "listPolicyV1beta1PodDisruptionBudgetForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.PodDisruptionBudgetList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "policy_v1beta1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "policy", + "kind": "PodDisruptionBudget", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/policy/v1beta1/podsecuritypolicies": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of PodSecurityPolicy", + "operationId": "deletePolicyV1beta1CollectionPodSecurityPolicy", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "policy_v1beta1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "policy", + "kind": "PodSecurityPolicy", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind PodSecurityPolicy", + "operationId": "listPolicyV1beta1PodSecurityPolicy", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.PodSecurityPolicyList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "policy_v1beta1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "policy", + "kind": "PodSecurityPolicy", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a PodSecurityPolicy", + "operationId": "createPolicyV1beta1PodSecurityPolicy", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.PodSecurityPolicy" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.PodSecurityPolicy" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.PodSecurityPolicy" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.PodSecurityPolicy" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "policy_v1beta1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "policy", + "kind": "PodSecurityPolicy", + "version": "v1beta1" + } + } + }, + "/apis/policy/v1beta1/podsecuritypolicies/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a PodSecurityPolicy", + "operationId": "deletePolicyV1beta1PodSecurityPolicy", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.PodSecurityPolicy" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.PodSecurityPolicy" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "policy_v1beta1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "policy", + "kind": "PodSecurityPolicy", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified PodSecurityPolicy", + "operationId": "readPolicyV1beta1PodSecurityPolicy", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.PodSecurityPolicy" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "policy_v1beta1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "policy", + "kind": "PodSecurityPolicy", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "name of the PodSecurityPolicy", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified PodSecurityPolicy", + "operationId": "patchPolicyV1beta1PodSecurityPolicy", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.PodSecurityPolicy" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "policy_v1beta1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "policy", + "kind": "PodSecurityPolicy", + "version": "v1beta1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified PodSecurityPolicy", + "operationId": "replacePolicyV1beta1PodSecurityPolicy", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.PodSecurityPolicy" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.PodSecurityPolicy" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.policy.v1beta1.PodSecurityPolicy" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "policy_v1beta1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "policy", + "kind": "PodSecurityPolicy", + "version": "v1beta1" + } + } + }, + "/apis/policy/v1beta1/watch/namespaces/{namespace}/poddisruptionbudgets": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of PodDisruptionBudget. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchPolicyV1beta1NamespacedPodDisruptionBudgetList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "policy_v1beta1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "policy", + "kind": "PodDisruptionBudget", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/policy/v1beta1/watch/namespaces/{namespace}/poddisruptionbudgets/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind PodDisruptionBudget. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchPolicyV1beta1NamespacedPodDisruptionBudget", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "policy_v1beta1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "policy", + "kind": "PodDisruptionBudget", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the PodDisruptionBudget", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/policy/v1beta1/watch/poddisruptionbudgets": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of PodDisruptionBudget. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchPolicyV1beta1PodDisruptionBudgetListForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "policy_v1beta1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "policy", + "kind": "PodDisruptionBudget", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/policy/v1beta1/watch/podsecuritypolicies": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of PodSecurityPolicy. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchPolicyV1beta1PodSecurityPolicyList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "policy_v1beta1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "policy", + "kind": "PodSecurityPolicy", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/policy/v1beta1/watch/podsecuritypolicies/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind PodSecurityPolicy. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchPolicyV1beta1PodSecurityPolicy", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "policy_v1beta1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "policy", + "kind": "PodSecurityPolicy", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the PodSecurityPolicy", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/rbac.authorization.k8s.io/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get information of a group", + "operationId": "getRbacAuthorizationAPIGroup", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization" + ] + } + }, + "/apis/rbac.authorization.k8s.io/v1/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get available resources", + "operationId": "getRbacAuthorizationV1APIResources", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ] + } + }, + "/apis/rbac.authorization.k8s.io/v1/clusterrolebindings": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of ClusterRoleBinding", + "operationId": "deleteRbacAuthorizationV1CollectionClusterRoleBinding", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRoleBinding", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind ClusterRoleBinding", + "operationId": "listRbacAuthorizationV1ClusterRoleBinding", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.ClusterRoleBindingList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRoleBinding", + "version": "v1" + } + }, + "parameters": [ + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a ClusterRoleBinding", + "operationId": "createRbacAuthorizationV1ClusterRoleBinding", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.ClusterRoleBinding" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.ClusterRoleBinding" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.ClusterRoleBinding" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.ClusterRoleBinding" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRoleBinding", + "version": "v1" + } + } + }, + "/apis/rbac.authorization.k8s.io/v1/clusterrolebindings/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a ClusterRoleBinding", + "operationId": "deleteRbacAuthorizationV1ClusterRoleBinding", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRoleBinding", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified ClusterRoleBinding", + "operationId": "readRbacAuthorizationV1ClusterRoleBinding", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.ClusterRoleBinding" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRoleBinding", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the ClusterRoleBinding", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified ClusterRoleBinding", + "operationId": "patchRbacAuthorizationV1ClusterRoleBinding", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.ClusterRoleBinding" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRoleBinding", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified ClusterRoleBinding", + "operationId": "replaceRbacAuthorizationV1ClusterRoleBinding", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.ClusterRoleBinding" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.ClusterRoleBinding" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.ClusterRoleBinding" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRoleBinding", + "version": "v1" + } + } + }, + "/apis/rbac.authorization.k8s.io/v1/clusterroles": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of ClusterRole", + "operationId": "deleteRbacAuthorizationV1CollectionClusterRole", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRole", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind ClusterRole", + "operationId": "listRbacAuthorizationV1ClusterRole", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.ClusterRoleList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRole", + "version": "v1" + } + }, + "parameters": [ + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a ClusterRole", + "operationId": "createRbacAuthorizationV1ClusterRole", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.ClusterRole" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.ClusterRole" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.ClusterRole" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.ClusterRole" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRole", + "version": "v1" + } + } + }, + "/apis/rbac.authorization.k8s.io/v1/clusterroles/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a ClusterRole", + "operationId": "deleteRbacAuthorizationV1ClusterRole", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRole", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified ClusterRole", + "operationId": "readRbacAuthorizationV1ClusterRole", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.ClusterRole" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRole", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the ClusterRole", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified ClusterRole", + "operationId": "patchRbacAuthorizationV1ClusterRole", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.ClusterRole" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRole", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified ClusterRole", + "operationId": "replaceRbacAuthorizationV1ClusterRole", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.ClusterRole" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.ClusterRole" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.ClusterRole" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRole", + "version": "v1" + } + } + }, + "/apis/rbac.authorization.k8s.io/v1/namespaces/{namespace}/rolebindings": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of RoleBinding", + "operationId": "deleteRbacAuthorizationV1CollectionNamespacedRoleBinding", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "RoleBinding", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind RoleBinding", + "operationId": "listRbacAuthorizationV1NamespacedRoleBinding", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.RoleBindingList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "RoleBinding", + "version": "v1" + } + }, + "parameters": [ + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a RoleBinding", + "operationId": "createRbacAuthorizationV1NamespacedRoleBinding", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.RoleBinding" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.RoleBinding" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.RoleBinding" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.RoleBinding" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "RoleBinding", + "version": "v1" + } + } + }, + "/apis/rbac.authorization.k8s.io/v1/namespaces/{namespace}/rolebindings/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a RoleBinding", + "operationId": "deleteRbacAuthorizationV1NamespacedRoleBinding", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "RoleBinding", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified RoleBinding", + "operationId": "readRbacAuthorizationV1NamespacedRoleBinding", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.RoleBinding" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "RoleBinding", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the RoleBinding", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified RoleBinding", + "operationId": "patchRbacAuthorizationV1NamespacedRoleBinding", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.RoleBinding" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "RoleBinding", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified RoleBinding", + "operationId": "replaceRbacAuthorizationV1NamespacedRoleBinding", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.RoleBinding" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.RoleBinding" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.RoleBinding" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "RoleBinding", + "version": "v1" + } + } + }, + "/apis/rbac.authorization.k8s.io/v1/namespaces/{namespace}/roles": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of Role", + "operationId": "deleteRbacAuthorizationV1CollectionNamespacedRole", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "Role", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind Role", + "operationId": "listRbacAuthorizationV1NamespacedRole", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.RoleList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "Role", + "version": "v1" + } + }, + "parameters": [ + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a Role", + "operationId": "createRbacAuthorizationV1NamespacedRole", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.Role" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.Role" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.Role" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.Role" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "Role", + "version": "v1" + } + } + }, + "/apis/rbac.authorization.k8s.io/v1/namespaces/{namespace}/roles/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a Role", + "operationId": "deleteRbacAuthorizationV1NamespacedRole", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "Role", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified Role", + "operationId": "readRbacAuthorizationV1NamespacedRole", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.Role" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "Role", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the Role", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified Role", + "operationId": "patchRbacAuthorizationV1NamespacedRole", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.Role" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "Role", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified Role", + "operationId": "replaceRbacAuthorizationV1NamespacedRole", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.Role" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.Role" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.Role" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "Role", + "version": "v1" + } + } + }, + "/apis/rbac.authorization.k8s.io/v1/rolebindings": { + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind RoleBinding", + "operationId": "listRbacAuthorizationV1RoleBindingForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.RoleBindingList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "RoleBinding", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/rbac.authorization.k8s.io/v1/roles": { + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind Role", + "operationId": "listRbacAuthorizationV1RoleForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1.RoleList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "Role", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/rbac.authorization.k8s.io/v1/watch/clusterrolebindings": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of ClusterRoleBinding. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchRbacAuthorizationV1ClusterRoleBindingList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRoleBinding", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/rbac.authorization.k8s.io/v1/watch/clusterrolebindings/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind ClusterRoleBinding. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchRbacAuthorizationV1ClusterRoleBinding", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRoleBinding", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the ClusterRoleBinding", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/rbac.authorization.k8s.io/v1/watch/clusterroles": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of ClusterRole. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchRbacAuthorizationV1ClusterRoleList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRole", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/rbac.authorization.k8s.io/v1/watch/clusterroles/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind ClusterRole. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchRbacAuthorizationV1ClusterRole", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRole", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the ClusterRole", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/rbac.authorization.k8s.io/v1/watch/namespaces/{namespace}/rolebindings": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of RoleBinding. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchRbacAuthorizationV1NamespacedRoleBindingList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "RoleBinding", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/rbac.authorization.k8s.io/v1/watch/namespaces/{namespace}/rolebindings/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind RoleBinding. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchRbacAuthorizationV1NamespacedRoleBinding", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "RoleBinding", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the RoleBinding", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/rbac.authorization.k8s.io/v1/watch/namespaces/{namespace}/roles": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of Role. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchRbacAuthorizationV1NamespacedRoleList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "Role", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/rbac.authorization.k8s.io/v1/watch/namespaces/{namespace}/roles/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind Role. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchRbacAuthorizationV1NamespacedRole", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "Role", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the Role", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/rbac.authorization.k8s.io/v1/watch/rolebindings": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of RoleBinding. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchRbacAuthorizationV1RoleBindingListForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "RoleBinding", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/rbac.authorization.k8s.io/v1/watch/roles": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of Role. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchRbacAuthorizationV1RoleListForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "Role", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/rbac.authorization.k8s.io/v1beta1/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get available resources", + "operationId": "getRbacAuthorizationV1beta1APIResources", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1beta1" + ] + } + }, + "/apis/rbac.authorization.k8s.io/v1beta1/clusterrolebindings": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of ClusterRoleBinding", + "operationId": "deleteRbacAuthorizationV1beta1CollectionClusterRoleBinding", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1beta1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRoleBinding", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind ClusterRoleBinding", + "operationId": "listRbacAuthorizationV1beta1ClusterRoleBinding", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.ClusterRoleBindingList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1beta1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRoleBinding", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a ClusterRoleBinding", + "operationId": "createRbacAuthorizationV1beta1ClusterRoleBinding", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.ClusterRoleBinding" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.ClusterRoleBinding" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.ClusterRoleBinding" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.ClusterRoleBinding" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1beta1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRoleBinding", + "version": "v1beta1" + } + } + }, + "/apis/rbac.authorization.k8s.io/v1beta1/clusterrolebindings/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a ClusterRoleBinding", + "operationId": "deleteRbacAuthorizationV1beta1ClusterRoleBinding", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1beta1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRoleBinding", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified ClusterRoleBinding", + "operationId": "readRbacAuthorizationV1beta1ClusterRoleBinding", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.ClusterRoleBinding" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1beta1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRoleBinding", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "name of the ClusterRoleBinding", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified ClusterRoleBinding", + "operationId": "patchRbacAuthorizationV1beta1ClusterRoleBinding", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.ClusterRoleBinding" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1beta1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRoleBinding", + "version": "v1beta1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified ClusterRoleBinding", + "operationId": "replaceRbacAuthorizationV1beta1ClusterRoleBinding", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.ClusterRoleBinding" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.ClusterRoleBinding" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.ClusterRoleBinding" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1beta1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRoleBinding", + "version": "v1beta1" + } + } + }, + "/apis/rbac.authorization.k8s.io/v1beta1/clusterroles": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of ClusterRole", + "operationId": "deleteRbacAuthorizationV1beta1CollectionClusterRole", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1beta1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRole", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind ClusterRole", + "operationId": "listRbacAuthorizationV1beta1ClusterRole", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.ClusterRoleList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1beta1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRole", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a ClusterRole", + "operationId": "createRbacAuthorizationV1beta1ClusterRole", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.ClusterRole" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.ClusterRole" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.ClusterRole" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.ClusterRole" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1beta1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRole", + "version": "v1beta1" + } + } + }, + "/apis/rbac.authorization.k8s.io/v1beta1/clusterroles/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a ClusterRole", + "operationId": "deleteRbacAuthorizationV1beta1ClusterRole", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1beta1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRole", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified ClusterRole", + "operationId": "readRbacAuthorizationV1beta1ClusterRole", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.ClusterRole" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1beta1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRole", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "name of the ClusterRole", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified ClusterRole", + "operationId": "patchRbacAuthorizationV1beta1ClusterRole", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.ClusterRole" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1beta1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRole", + "version": "v1beta1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified ClusterRole", + "operationId": "replaceRbacAuthorizationV1beta1ClusterRole", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.ClusterRole" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.ClusterRole" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.ClusterRole" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1beta1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRole", + "version": "v1beta1" + } + } + }, + "/apis/rbac.authorization.k8s.io/v1beta1/namespaces/{namespace}/rolebindings": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of RoleBinding", + "operationId": "deleteRbacAuthorizationV1beta1CollectionNamespacedRoleBinding", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1beta1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "RoleBinding", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind RoleBinding", + "operationId": "listRbacAuthorizationV1beta1NamespacedRoleBinding", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.RoleBindingList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1beta1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "RoleBinding", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a RoleBinding", + "operationId": "createRbacAuthorizationV1beta1NamespacedRoleBinding", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.RoleBinding" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.RoleBinding" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.RoleBinding" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.RoleBinding" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1beta1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "RoleBinding", + "version": "v1beta1" + } + } + }, + "/apis/rbac.authorization.k8s.io/v1beta1/namespaces/{namespace}/rolebindings/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a RoleBinding", + "operationId": "deleteRbacAuthorizationV1beta1NamespacedRoleBinding", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1beta1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "RoleBinding", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified RoleBinding", + "operationId": "readRbacAuthorizationV1beta1NamespacedRoleBinding", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.RoleBinding" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1beta1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "RoleBinding", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "name of the RoleBinding", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified RoleBinding", + "operationId": "patchRbacAuthorizationV1beta1NamespacedRoleBinding", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.RoleBinding" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1beta1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "RoleBinding", + "version": "v1beta1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified RoleBinding", + "operationId": "replaceRbacAuthorizationV1beta1NamespacedRoleBinding", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.RoleBinding" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.RoleBinding" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.RoleBinding" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1beta1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "RoleBinding", + "version": "v1beta1" + } + } + }, + "/apis/rbac.authorization.k8s.io/v1beta1/namespaces/{namespace}/roles": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of Role", + "operationId": "deleteRbacAuthorizationV1beta1CollectionNamespacedRole", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1beta1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "Role", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind Role", + "operationId": "listRbacAuthorizationV1beta1NamespacedRole", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.RoleList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1beta1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "Role", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a Role", + "operationId": "createRbacAuthorizationV1beta1NamespacedRole", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.Role" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.Role" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.Role" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.Role" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1beta1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "Role", + "version": "v1beta1" + } + } + }, + "/apis/rbac.authorization.k8s.io/v1beta1/namespaces/{namespace}/roles/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a Role", + "operationId": "deleteRbacAuthorizationV1beta1NamespacedRole", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1beta1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "Role", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified Role", + "operationId": "readRbacAuthorizationV1beta1NamespacedRole", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.Role" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1beta1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "Role", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "name of the Role", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified Role", + "operationId": "patchRbacAuthorizationV1beta1NamespacedRole", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.Role" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1beta1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "Role", + "version": "v1beta1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified Role", + "operationId": "replaceRbacAuthorizationV1beta1NamespacedRole", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.Role" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.Role" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.Role" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1beta1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "Role", + "version": "v1beta1" + } + } + }, + "/apis/rbac.authorization.k8s.io/v1beta1/rolebindings": { + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind RoleBinding", + "operationId": "listRbacAuthorizationV1beta1RoleBindingForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.RoleBindingList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1beta1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "RoleBinding", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/rbac.authorization.k8s.io/v1beta1/roles": { + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind Role", + "operationId": "listRbacAuthorizationV1beta1RoleForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.rbac.v1beta1.RoleList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1beta1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "Role", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/rbac.authorization.k8s.io/v1beta1/watch/clusterrolebindings": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of ClusterRoleBinding. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchRbacAuthorizationV1beta1ClusterRoleBindingList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1beta1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRoleBinding", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/rbac.authorization.k8s.io/v1beta1/watch/clusterrolebindings/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind ClusterRoleBinding. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchRbacAuthorizationV1beta1ClusterRoleBinding", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1beta1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRoleBinding", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the ClusterRoleBinding", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/rbac.authorization.k8s.io/v1beta1/watch/clusterroles": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of ClusterRole. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchRbacAuthorizationV1beta1ClusterRoleList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1beta1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRole", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/rbac.authorization.k8s.io/v1beta1/watch/clusterroles/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind ClusterRole. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchRbacAuthorizationV1beta1ClusterRole", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1beta1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "ClusterRole", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the ClusterRole", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/rbac.authorization.k8s.io/v1beta1/watch/namespaces/{namespace}/rolebindings": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of RoleBinding. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchRbacAuthorizationV1beta1NamespacedRoleBindingList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1beta1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "RoleBinding", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/rbac.authorization.k8s.io/v1beta1/watch/namespaces/{namespace}/rolebindings/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind RoleBinding. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchRbacAuthorizationV1beta1NamespacedRoleBinding", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1beta1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "RoleBinding", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the RoleBinding", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/rbac.authorization.k8s.io/v1beta1/watch/namespaces/{namespace}/roles": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of Role. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchRbacAuthorizationV1beta1NamespacedRoleList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1beta1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "Role", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/rbac.authorization.k8s.io/v1beta1/watch/namespaces/{namespace}/roles/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind Role. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchRbacAuthorizationV1beta1NamespacedRole", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1beta1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "Role", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the Role", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "object name and auth scope, such as for teams and projects", + "in": "path", + "name": "namespace", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/rbac.authorization.k8s.io/v1beta1/watch/rolebindings": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of RoleBinding. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchRbacAuthorizationV1beta1RoleBindingListForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1beta1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "RoleBinding", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/rbac.authorization.k8s.io/v1beta1/watch/roles": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of Role. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchRbacAuthorizationV1beta1RoleListForAllNamespaces", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "rbacAuthorization_v1beta1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "rbac.authorization.k8s.io", + "kind": "Role", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/scheduling.k8s.io/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get information of a group", + "operationId": "getSchedulingAPIGroup", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "scheduling" + ] + } + }, + "/apis/scheduling.k8s.io/v1/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get available resources", + "operationId": "getSchedulingV1APIResources", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "scheduling_v1" + ] + } + }, + "/apis/scheduling.k8s.io/v1/priorityclasses": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of PriorityClass", + "operationId": "deleteSchedulingV1CollectionPriorityClass", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "scheduling_v1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "scheduling.k8s.io", + "kind": "PriorityClass", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind PriorityClass", + "operationId": "listSchedulingV1PriorityClass", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.scheduling.v1.PriorityClassList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "scheduling_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "scheduling.k8s.io", + "kind": "PriorityClass", + "version": "v1" + } + }, + "parameters": [ + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a PriorityClass", + "operationId": "createSchedulingV1PriorityClass", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.scheduling.v1.PriorityClass" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.scheduling.v1.PriorityClass" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.scheduling.v1.PriorityClass" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.scheduling.v1.PriorityClass" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "scheduling_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "scheduling.k8s.io", + "kind": "PriorityClass", + "version": "v1" + } + } + }, + "/apis/scheduling.k8s.io/v1/priorityclasses/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a PriorityClass", + "operationId": "deleteSchedulingV1PriorityClass", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "scheduling_v1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "scheduling.k8s.io", + "kind": "PriorityClass", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified PriorityClass", + "operationId": "readSchedulingV1PriorityClass", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.scheduling.v1.PriorityClass" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "scheduling_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "scheduling.k8s.io", + "kind": "PriorityClass", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the PriorityClass", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified PriorityClass", + "operationId": "patchSchedulingV1PriorityClass", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.scheduling.v1.PriorityClass" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "scheduling_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "scheduling.k8s.io", + "kind": "PriorityClass", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified PriorityClass", + "operationId": "replaceSchedulingV1PriorityClass", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.scheduling.v1.PriorityClass" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.scheduling.v1.PriorityClass" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.scheduling.v1.PriorityClass" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "scheduling_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "scheduling.k8s.io", + "kind": "PriorityClass", + "version": "v1" + } + } + }, + "/apis/scheduling.k8s.io/v1/watch/priorityclasses": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of PriorityClass. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchSchedulingV1PriorityClassList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "scheduling_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "scheduling.k8s.io", + "kind": "PriorityClass", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/scheduling.k8s.io/v1/watch/priorityclasses/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind PriorityClass. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchSchedulingV1PriorityClass", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "scheduling_v1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "scheduling.k8s.io", + "kind": "PriorityClass", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the PriorityClass", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/scheduling.k8s.io/v1beta1/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get available resources", + "operationId": "getSchedulingV1beta1APIResources", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "scheduling_v1beta1" + ] + } + }, + "/apis/scheduling.k8s.io/v1beta1/priorityclasses": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of PriorityClass", + "operationId": "deleteSchedulingV1beta1CollectionPriorityClass", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "scheduling_v1beta1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "scheduling.k8s.io", + "kind": "PriorityClass", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind PriorityClass", + "operationId": "listSchedulingV1beta1PriorityClass", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.scheduling.v1beta1.PriorityClassList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "scheduling_v1beta1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "scheduling.k8s.io", + "kind": "PriorityClass", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a PriorityClass", + "operationId": "createSchedulingV1beta1PriorityClass", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.scheduling.v1beta1.PriorityClass" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.scheduling.v1beta1.PriorityClass" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.scheduling.v1beta1.PriorityClass" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.scheduling.v1beta1.PriorityClass" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "scheduling_v1beta1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "scheduling.k8s.io", + "kind": "PriorityClass", + "version": "v1beta1" + } + } + }, + "/apis/scheduling.k8s.io/v1beta1/priorityclasses/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a PriorityClass", + "operationId": "deleteSchedulingV1beta1PriorityClass", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "scheduling_v1beta1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "scheduling.k8s.io", + "kind": "PriorityClass", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified PriorityClass", + "operationId": "readSchedulingV1beta1PriorityClass", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.scheduling.v1beta1.PriorityClass" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "scheduling_v1beta1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "scheduling.k8s.io", + "kind": "PriorityClass", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "name of the PriorityClass", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified PriorityClass", + "operationId": "patchSchedulingV1beta1PriorityClass", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.scheduling.v1beta1.PriorityClass" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "scheduling_v1beta1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "scheduling.k8s.io", + "kind": "PriorityClass", + "version": "v1beta1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified PriorityClass", + "operationId": "replaceSchedulingV1beta1PriorityClass", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.scheduling.v1beta1.PriorityClass" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.scheduling.v1beta1.PriorityClass" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.scheduling.v1beta1.PriorityClass" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "scheduling_v1beta1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "scheduling.k8s.io", + "kind": "PriorityClass", + "version": "v1beta1" + } + } + }, + "/apis/scheduling.k8s.io/v1beta1/watch/priorityclasses": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of PriorityClass. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchSchedulingV1beta1PriorityClassList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "scheduling_v1beta1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "scheduling.k8s.io", + "kind": "PriorityClass", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/scheduling.k8s.io/v1beta1/watch/priorityclasses/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind PriorityClass. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchSchedulingV1beta1PriorityClass", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "scheduling_v1beta1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "scheduling.k8s.io", + "kind": "PriorityClass", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the PriorityClass", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/storage.k8s.io/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get information of a group", + "operationId": "getStorageAPIGroup", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage" + ] + } + }, + "/apis/storage.k8s.io/v1/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get available resources", + "operationId": "getStorageV1APIResources", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1" + ] + } + }, + "/apis/storage.k8s.io/v1/csidrivers": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of CSIDriver", + "operationId": "deleteStorageV1CollectionCSIDriver", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "CSIDriver", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind CSIDriver", + "operationId": "listStorageV1CSIDriver", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.CSIDriverList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "CSIDriver", + "version": "v1" + } + }, + "parameters": [ + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a CSIDriver", + "operationId": "createStorageV1CSIDriver", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.CSIDriver" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.CSIDriver" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.CSIDriver" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.CSIDriver" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "CSIDriver", + "version": "v1" + } + } + }, + "/apis/storage.k8s.io/v1/csidrivers/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a CSIDriver", + "operationId": "deleteStorageV1CSIDriver", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.CSIDriver" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.CSIDriver" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "CSIDriver", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified CSIDriver", + "operationId": "readStorageV1CSIDriver", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.CSIDriver" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "CSIDriver", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the CSIDriver", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified CSIDriver", + "operationId": "patchStorageV1CSIDriver", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.CSIDriver" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "CSIDriver", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified CSIDriver", + "operationId": "replaceStorageV1CSIDriver", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.CSIDriver" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.CSIDriver" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.CSIDriver" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "CSIDriver", + "version": "v1" + } + } + }, + "/apis/storage.k8s.io/v1/csinodes": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of CSINode", + "operationId": "deleteStorageV1CollectionCSINode", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "CSINode", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind CSINode", + "operationId": "listStorageV1CSINode", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.CSINodeList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "CSINode", + "version": "v1" + } + }, + "parameters": [ + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a CSINode", + "operationId": "createStorageV1CSINode", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.CSINode" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.CSINode" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.CSINode" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.CSINode" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "CSINode", + "version": "v1" + } + } + }, + "/apis/storage.k8s.io/v1/csinodes/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a CSINode", + "operationId": "deleteStorageV1CSINode", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.CSINode" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.CSINode" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "CSINode", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified CSINode", + "operationId": "readStorageV1CSINode", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.CSINode" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "CSINode", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the CSINode", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified CSINode", + "operationId": "patchStorageV1CSINode", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.CSINode" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "CSINode", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified CSINode", + "operationId": "replaceStorageV1CSINode", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.CSINode" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.CSINode" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.CSINode" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "CSINode", + "version": "v1" + } + } + }, + "/apis/storage.k8s.io/v1/storageclasses": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of StorageClass", + "operationId": "deleteStorageV1CollectionStorageClass", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "StorageClass", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind StorageClass", + "operationId": "listStorageV1StorageClass", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.StorageClassList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "StorageClass", + "version": "v1" + } + }, + "parameters": [ + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a StorageClass", + "operationId": "createStorageV1StorageClass", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.StorageClass" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.StorageClass" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.StorageClass" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.StorageClass" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "StorageClass", + "version": "v1" + } + } + }, + "/apis/storage.k8s.io/v1/storageclasses/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a StorageClass", + "operationId": "deleteStorageV1StorageClass", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.StorageClass" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.StorageClass" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "StorageClass", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified StorageClass", + "operationId": "readStorageV1StorageClass", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.StorageClass" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "StorageClass", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the StorageClass", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified StorageClass", + "operationId": "patchStorageV1StorageClass", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.StorageClass" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "StorageClass", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified StorageClass", + "operationId": "replaceStorageV1StorageClass", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.StorageClass" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.StorageClass" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.StorageClass" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "StorageClass", + "version": "v1" + } + } + }, + "/apis/storage.k8s.io/v1/volumeattachments": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of VolumeAttachment", + "operationId": "deleteStorageV1CollectionVolumeAttachment", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "VolumeAttachment", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind VolumeAttachment", + "operationId": "listStorageV1VolumeAttachment", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.VolumeAttachmentList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "VolumeAttachment", + "version": "v1" + } + }, + "parameters": [ + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a VolumeAttachment", + "operationId": "createStorageV1VolumeAttachment", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.VolumeAttachment" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.VolumeAttachment" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.VolumeAttachment" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.VolumeAttachment" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "VolumeAttachment", + "version": "v1" + } + } + }, + "/apis/storage.k8s.io/v1/volumeattachments/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a VolumeAttachment", + "operationId": "deleteStorageV1VolumeAttachment", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.VolumeAttachment" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.VolumeAttachment" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "VolumeAttachment", + "version": "v1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified VolumeAttachment", + "operationId": "readStorageV1VolumeAttachment", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.VolumeAttachment" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "VolumeAttachment", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the VolumeAttachment", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified VolumeAttachment", + "operationId": "patchStorageV1VolumeAttachment", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.VolumeAttachment" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "VolumeAttachment", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified VolumeAttachment", + "operationId": "replaceStorageV1VolumeAttachment", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.VolumeAttachment" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.VolumeAttachment" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.VolumeAttachment" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "VolumeAttachment", + "version": "v1" + } + } + }, + "/apis/storage.k8s.io/v1/volumeattachments/{name}/status": { + "get": { + "consumes": [ + "*/*" + ], + "description": "read status of the specified VolumeAttachment", + "operationId": "readStorageV1VolumeAttachmentStatus", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.VolumeAttachment" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "VolumeAttachment", + "version": "v1" + } + }, + "parameters": [ + { + "description": "name of the VolumeAttachment", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update status of the specified VolumeAttachment", + "operationId": "patchStorageV1VolumeAttachmentStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.VolumeAttachment" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "VolumeAttachment", + "version": "v1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace status of the specified VolumeAttachment", + "operationId": "replaceStorageV1VolumeAttachmentStatus", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.VolumeAttachment" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.VolumeAttachment" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1.VolumeAttachment" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "VolumeAttachment", + "version": "v1" + } + } + }, + "/apis/storage.k8s.io/v1/watch/csidrivers": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of CSIDriver. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchStorageV1CSIDriverList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "CSIDriver", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/storage.k8s.io/v1/watch/csidrivers/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind CSIDriver. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchStorageV1CSIDriver", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "CSIDriver", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the CSIDriver", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/storage.k8s.io/v1/watch/csinodes": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of CSINode. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchStorageV1CSINodeList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "CSINode", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/storage.k8s.io/v1/watch/csinodes/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind CSINode. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchStorageV1CSINode", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "CSINode", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the CSINode", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/storage.k8s.io/v1/watch/storageclasses": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of StorageClass. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchStorageV1StorageClassList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "StorageClass", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/storage.k8s.io/v1/watch/storageclasses/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind StorageClass. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchStorageV1StorageClass", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "StorageClass", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the StorageClass", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/storage.k8s.io/v1/watch/volumeattachments": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of VolumeAttachment. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchStorageV1VolumeAttachmentList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "VolumeAttachment", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/storage.k8s.io/v1/watch/volumeattachments/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind VolumeAttachment. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchStorageV1VolumeAttachment", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "VolumeAttachment", + "version": "v1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the VolumeAttachment", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/storage.k8s.io/v1beta1/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get available resources", + "operationId": "getStorageV1beta1APIResources", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1beta1" + ] + } + }, + "/apis/storage.k8s.io/v1beta1/csidrivers": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of CSIDriver", + "operationId": "deleteStorageV1beta1CollectionCSIDriver", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1beta1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "CSIDriver", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind CSIDriver", + "operationId": "listStorageV1beta1CSIDriver", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.CSIDriverList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1beta1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "CSIDriver", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a CSIDriver", + "operationId": "createStorageV1beta1CSIDriver", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.CSIDriver" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.CSIDriver" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.CSIDriver" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.CSIDriver" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1beta1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "CSIDriver", + "version": "v1beta1" + } + } + }, + "/apis/storage.k8s.io/v1beta1/csidrivers/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a CSIDriver", + "operationId": "deleteStorageV1beta1CSIDriver", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.CSIDriver" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.CSIDriver" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1beta1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "CSIDriver", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified CSIDriver", + "operationId": "readStorageV1beta1CSIDriver", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.CSIDriver" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1beta1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "CSIDriver", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "name of the CSIDriver", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified CSIDriver", + "operationId": "patchStorageV1beta1CSIDriver", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.CSIDriver" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1beta1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "CSIDriver", + "version": "v1beta1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified CSIDriver", + "operationId": "replaceStorageV1beta1CSIDriver", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.CSIDriver" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.CSIDriver" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.CSIDriver" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1beta1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "CSIDriver", + "version": "v1beta1" + } + } + }, + "/apis/storage.k8s.io/v1beta1/csinodes": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of CSINode", + "operationId": "deleteStorageV1beta1CollectionCSINode", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1beta1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "CSINode", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind CSINode", + "operationId": "listStorageV1beta1CSINode", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.CSINodeList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1beta1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "CSINode", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a CSINode", + "operationId": "createStorageV1beta1CSINode", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.CSINode" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.CSINode" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.CSINode" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.CSINode" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1beta1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "CSINode", + "version": "v1beta1" + } + } + }, + "/apis/storage.k8s.io/v1beta1/csinodes/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a CSINode", + "operationId": "deleteStorageV1beta1CSINode", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.CSINode" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.CSINode" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1beta1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "CSINode", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified CSINode", + "operationId": "readStorageV1beta1CSINode", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.CSINode" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1beta1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "CSINode", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "name of the CSINode", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified CSINode", + "operationId": "patchStorageV1beta1CSINode", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.CSINode" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1beta1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "CSINode", + "version": "v1beta1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified CSINode", + "operationId": "replaceStorageV1beta1CSINode", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.CSINode" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.CSINode" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.CSINode" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1beta1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "CSINode", + "version": "v1beta1" + } + } + }, + "/apis/storage.k8s.io/v1beta1/storageclasses": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of StorageClass", + "operationId": "deleteStorageV1beta1CollectionStorageClass", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1beta1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "StorageClass", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind StorageClass", + "operationId": "listStorageV1beta1StorageClass", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.StorageClassList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1beta1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "StorageClass", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a StorageClass", + "operationId": "createStorageV1beta1StorageClass", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.StorageClass" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.StorageClass" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.StorageClass" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.StorageClass" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1beta1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "StorageClass", + "version": "v1beta1" + } + } + }, + "/apis/storage.k8s.io/v1beta1/storageclasses/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a StorageClass", + "operationId": "deleteStorageV1beta1StorageClass", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.StorageClass" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.StorageClass" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1beta1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "StorageClass", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified StorageClass", + "operationId": "readStorageV1beta1StorageClass", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.StorageClass" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1beta1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "StorageClass", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "name of the StorageClass", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified StorageClass", + "operationId": "patchStorageV1beta1StorageClass", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.StorageClass" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1beta1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "StorageClass", + "version": "v1beta1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified StorageClass", + "operationId": "replaceStorageV1beta1StorageClass", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.StorageClass" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.StorageClass" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.StorageClass" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1beta1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "StorageClass", + "version": "v1beta1" + } + } + }, + "/apis/storage.k8s.io/v1beta1/volumeattachments": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of VolumeAttachment", + "operationId": "deleteStorageV1beta1CollectionVolumeAttachment", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1beta1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "VolumeAttachment", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind VolumeAttachment", + "operationId": "listStorageV1beta1VolumeAttachment", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachmentList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1beta1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "VolumeAttachment", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a VolumeAttachment", + "operationId": "createStorageV1beta1VolumeAttachment", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachment" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachment" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachment" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachment" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1beta1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "VolumeAttachment", + "version": "v1beta1" + } + } + }, + "/apis/storage.k8s.io/v1beta1/volumeattachments/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a VolumeAttachment", + "operationId": "deleteStorageV1beta1VolumeAttachment", + "parameters": [ + { + "in": "body", + "name": "body", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachment" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachment" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1beta1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "VolumeAttachment", + "version": "v1beta1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified VolumeAttachment", + "operationId": "readStorageV1beta1VolumeAttachment", + "parameters": [ + { + "description": "Should the export be exact. Exact export maintains cluster-specific fields like 'Namespace'. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "exact", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "Should this value be exported. Export strips fields that a user can not specify. Deprecated. Planned for removal in 1.18.", + "in": "query", + "name": "export", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachment" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1beta1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "VolumeAttachment", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "name of the VolumeAttachment", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified VolumeAttachment", + "operationId": "patchStorageV1beta1VolumeAttachment", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "type": "boolean", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachment" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1beta1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "VolumeAttachment", + "version": "v1beta1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified VolumeAttachment", + "operationId": "replaceStorageV1beta1VolumeAttachment", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachment" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachment" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachment" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1beta1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "VolumeAttachment", + "version": "v1beta1" + } + } + }, + "/apis/storage.k8s.io/v1beta1/watch/csidrivers": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of CSIDriver. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchStorageV1beta1CSIDriverList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1beta1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "CSIDriver", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/storage.k8s.io/v1beta1/watch/csidrivers/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind CSIDriver. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchStorageV1beta1CSIDriver", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1beta1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "CSIDriver", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the CSIDriver", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/storage.k8s.io/v1beta1/watch/csinodes": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of CSINode. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchStorageV1beta1CSINodeList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1beta1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "CSINode", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/storage.k8s.io/v1beta1/watch/csinodes/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind CSINode. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchStorageV1beta1CSINode", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1beta1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "CSINode", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the CSINode", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/storage.k8s.io/v1beta1/watch/storageclasses": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of StorageClass. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchStorageV1beta1StorageClassList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1beta1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "StorageClass", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/storage.k8s.io/v1beta1/watch/storageclasses/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind StorageClass. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchStorageV1beta1StorageClass", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1beta1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "StorageClass", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the StorageClass", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/storage.k8s.io/v1beta1/watch/volumeattachments": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of VolumeAttachment. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchStorageV1beta1VolumeAttachmentList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1beta1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "VolumeAttachment", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/apis/storage.k8s.io/v1beta1/watch/volumeattachments/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind VolumeAttachment. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchStorageV1beta1VolumeAttachment", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1beta1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "VolumeAttachment", + "version": "v1beta1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. If the feature gate WatchBookmarks is not enabled in apiserver, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "type": "boolean", + "uniqueItems": true + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "type": "string", + "uniqueItems": true + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "type": "integer", + "uniqueItems": true + }, + { + "description": "name of the VolumeAttachment", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "description": "If 'true', then the output is pretty printed.", + "in": "query", + "name": "pretty", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "type": "string", + "uniqueItems": true + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "type": "string", + "uniqueItems": true + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "type": "integer", + "uniqueItems": true + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "type": "boolean", + "uniqueItems": true + } + ] + }, + "/logs/": { + "get": { + "operationId": "logFileListHandler", + "responses": { + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "logs" + ] + } + }, + "/logs/{logpath}": { + "get": { + "operationId": "logFileHandler", + "responses": { + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "logs" + ] + }, + "parameters": [ + { + "description": "path to the log", + "in": "path", + "name": "logpath", + "required": true, + "type": "string", + "uniqueItems": true + } + ] + }, + "/openid/v1/jwks/": { + "get": { + "description": "get service account issuer OpenID JSON Web Key Set (contains public token verification keys)", + "operationId": "getServiceAccountIssuerOpenIDKeyset", + "produces": [ + "application/jwk-set+json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "openid" + ] + } + }, + "/version/": { + "get": { + "consumes": [ + "application/json" + ], + "description": "get the code version", + "operationId": "getCodeVersion", + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.version.Info" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "version" + ] + } + } + }, + "security": [ + { + "BearerToken": [] + } + ], + "securityDefinitions": { + "BearerToken": { + "description": "Bearer Token authentication", + "in": "header", + "name": "authorization", + "type": "apiKey" + } + }, + "swagger": "2.0" +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/openapi/kustomizationapi/swagger.go b/vendor/sigs.k8s.io/kustomize/kyaml/openapi/kustomizationapi/swagger.go new file mode 100644 index 000000000000..4f4ec3e4ac21 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/openapi/kustomizationapi/swagger.go @@ -0,0 +1,249 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +// Code generated for package kustomizationapi by go-bindata DO NOT EDIT. (@generated) +// sources: +// kustomizationapi/swagger.json +package kustomizationapi + +import ( + "bytes" + "compress/gzip" + "fmt" + "io" + "io/ioutil" + "os" + "path/filepath" + "strings" + "time" +) + +func bindataRead(data []byte, name string) ([]byte, error) { + gz, err := gzip.NewReader(bytes.NewBuffer(data)) + if err != nil { + return nil, fmt.Errorf("Read %q: %v", name, err) + } + + var buf bytes.Buffer + _, err = io.Copy(&buf, gz) + clErr := gz.Close() + + if err != nil { + return nil, fmt.Errorf("Read %q: %v", name, err) + } + if clErr != nil { + return nil, err + } + + return buf.Bytes(), nil +} + +type asset struct { + bytes []byte + info os.FileInfo +} + +type bindataFileInfo struct { + name string + size int64 + mode os.FileMode + modTime time.Time +} + +// Name return file name +func (fi bindataFileInfo) Name() string { + return fi.name +} + +// Size return file size +func (fi bindataFileInfo) Size() int64 { + return fi.size +} + +// Mode return file mode +func (fi bindataFileInfo) Mode() os.FileMode { + return fi.mode +} + +// Mode return file modify time +func (fi bindataFileInfo) ModTime() time.Time { + return fi.modTime +} + +// IsDir return file whether a directory +func (fi bindataFileInfo) IsDir() bool { + return fi.mode&os.ModeDir != 0 +} + +// Sys return file is sys mode +func (fi bindataFileInfo) Sys() interface{} { + return nil +} + +var _kustomizationapiSwaggerJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xe4\x56\xc1\x6e\xdb\x30\x0c\xbd\xe7\x2b\x04\x6d\xc7\xd8\x45\x6e\x43\x6e\xc3\x0e\x3b\x14\x05\x0a\x74\xb7\xa1\x07\xc6\xa1\x5d\xce\x8e\xa4\x51\xb4\xb1\x6c\xc8\xbf\x0f\xd6\x62\xd7\x4a\xec\x75\x0b\x1a\xac\x4b\x0f\x06\x0c\x99\x7c\x4f\xe4\x7b\x24\xfc\x63\xa6\x94\x5e\x63\x4e\x86\x84\xac\xf1\x7a\xa9\xda\x23\xa5\x34\xd9\xb4\x7c\xe7\x53\x70\x94\x82\x73\x3e\x6d\x16\xe9\x07\x6b\x72\x2a\x6e\xc0\xbd\xe7\xe2\x31\x52\x29\xed\xd8\x3a\x64\x21\x1c\x9e\x2a\xa5\x3f\xa2\x41\x06\xb1\x7c\x90\x10\x3e\xbe\x65\xcc\xf5\x52\xe9\x37\x57\x03\xfe\xab\x11\xda\x18\xa5\x87\xd8\xed\xdf\x76\xf3\xee\x1a\xb0\x5e\x07\x14\xa8\x6e\x87\x17\xca\xa1\xf2\xd8\x07\xc9\xd6\x61\x4b\x6b\x57\x5f\x30\x13\xdd\x9f\x7f\x4b\xca\x7a\x85\x6c\x50\xd0\x27\x05\xdb\xda\x25\x0d\xb2\x27\x6b\x92\x92\xcc\x5a\x2f\xd5\xe7\x9e\x3a\xaa\x23\xc4\xb6\x88\x65\xed\xc5\x6e\xe8\x3b\xa6\x59\x68\x54\x28\x84\x6c\x4f\x11\xa2\xf7\x58\x3a\xee\x65\x14\xb2\xa7\x6d\xa3\x9a\xc5\x0a\x05\x16\xc7\x45\xdf\xcf\x06\xa5\x8f\x69\x75\x87\x19\xa3\xbc\x0c\xa1\x1e\xab\xeb\xba\x1f\xe1\x77\x8a\x78\x61\x32\xc5\xa5\x08\x3c\x10\xe0\xf9\xd5\x9d\xd2\x6b\x52\x60\x03\x1b\xf4\x0e\xb2\x3f\x6f\xfe\x3c\x4e\x3e\x25\x6f\x85\x0f\xd0\x90\xe5\x53\x72\xaf\x9b\x5b\x20\xbe\xb3\x35\x67\x78\xba\x23\x63\x94\x0b\x71\x56\x2c\xfe\xf3\x9b\xeb\x7a\x7f\x19\x90\x5f\x50\xbd\xb9\x18\xbf\xd6\xc4\x18\x17\xa4\x3f\x6d\x1d\xde\xa0\x40\xc7\x74\x3f\x7f\xca\x8c\x59\xb7\xfb\xfa\x4a\x0e\x05\x26\xc1\xcd\xa1\xea\x7f\xa3\x7b\xbc\x5d\x07\x20\xbb\xf9\x98\x11\x81\x19\xb6\x71\x27\x23\x4d\x1d\x48\xf6\x90\x6c\x90\x0b\x4c\x4a\xdc\xb6\x29\x61\x26\x9e\xca\xf0\xc2\x20\x58\x84\x84\x90\x3d\xee\x75\x1f\x56\xc5\xd9\x9a\x31\xd8\x44\x2f\xb2\x13\xff\xf5\x30\xc6\xc3\x72\x86\x61\x9c\xd8\x83\x93\xc3\x55\x91\x20\x43\x75\xb4\x33\x27\x5c\x34\xb5\x8b\x7f\x6f\x90\x51\x1b\xe7\x54\x1d\xaf\xea\xf3\xd3\xa2\x69\xfe\x0d\xeb\xeb\xf8\x8f\x89\x0d\x78\xaa\xc1\x67\xed\xb3\xfb\x19\x00\x00\xff\xff\x2f\x39\x79\xd0\x6e\x0c\x00\x00") + +func kustomizationapiSwaggerJsonBytes() ([]byte, error) { + return bindataRead( + _kustomizationapiSwaggerJson, + "kustomizationapi/swagger.json", + ) +} + +func kustomizationapiSwaggerJson() (*asset, error) { + bytes, err := kustomizationapiSwaggerJsonBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "kustomizationapi/swagger.json", size: 3182, mode: os.FileMode(420), modTime: time.Unix(1615228558, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +// Asset loads and returns the asset for the given name. +// It returns an error if the asset could not be found or +// could not be loaded. +func Asset(name string) ([]byte, error) { + cannonicalName := strings.Replace(name, "\\", "/", -1) + if f, ok := _bindata[cannonicalName]; ok { + a, err := f() + if err != nil { + return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err) + } + return a.bytes, nil + } + return nil, fmt.Errorf("Asset %s not found", name) +} + +// MustAsset is like Asset but panics when Asset would return an error. +// It simplifies safe initialization of global variables. +func MustAsset(name string) []byte { + a, err := Asset(name) + if err != nil { + panic("asset: Asset(" + name + "): " + err.Error()) + } + + return a +} + +// AssetInfo loads and returns the asset info for the given name. +// It returns an error if the asset could not be found or +// could not be loaded. +func AssetInfo(name string) (os.FileInfo, error) { + cannonicalName := strings.Replace(name, "\\", "/", -1) + if f, ok := _bindata[cannonicalName]; ok { + a, err := f() + if err != nil { + return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err) + } + return a.info, nil + } + return nil, fmt.Errorf("AssetInfo %s not found", name) +} + +// AssetNames returns the names of the assets. +func AssetNames() []string { + names := make([]string, 0, len(_bindata)) + for name := range _bindata { + names = append(names, name) + } + return names +} + +// _bindata is a table, holding each asset generator, mapped to its name. +var _bindata = map[string]func() (*asset, error){ + "kustomizationapi/swagger.json": kustomizationapiSwaggerJson, +} + +// AssetDir returns the file names below a certain +// directory embedded in the file by go-bindata. +// For example if you run go-bindata on data/... and data contains the +// following hierarchy: +// data/ +// foo.txt +// img/ +// a.png +// b.png +// then AssetDir("data") would return []string{"foo.txt", "img"} +// AssetDir("data/img") would return []string{"a.png", "b.png"} +// AssetDir("foo.txt") and AssetDir("notexist") would return an error +// AssetDir("") will return []string{"data"}. +func AssetDir(name string) ([]string, error) { + node := _bintree + if len(name) != 0 { + cannonicalName := strings.Replace(name, "\\", "/", -1) + pathList := strings.Split(cannonicalName, "/") + for _, p := range pathList { + node = node.Children[p] + if node == nil { + return nil, fmt.Errorf("Asset %s not found", name) + } + } + } + if node.Func != nil { + return nil, fmt.Errorf("Asset %s not found", name) + } + rv := make([]string, 0, len(node.Children)) + for childName := range node.Children { + rv = append(rv, childName) + } + return rv, nil +} + +type bintree struct { + Func func() (*asset, error) + Children map[string]*bintree +} + +var _bintree = &bintree{nil, map[string]*bintree{ + "kustomizationapi": &bintree{nil, map[string]*bintree{ + "swagger.json": &bintree{kustomizationapiSwaggerJson, map[string]*bintree{}}, + }}, +}} + +// RestoreAsset restores an asset under the given directory +func RestoreAsset(dir, name string) error { + data, err := Asset(name) + if err != nil { + return err + } + info, err := AssetInfo(name) + if err != nil { + return err + } + err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755)) + if err != nil { + return err + } + err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode()) + if err != nil { + return err + } + err = os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime()) + if err != nil { + return err + } + return nil +} + +// RestoreAssets restores an asset under the given directory recursively +func RestoreAssets(dir, name string) error { + children, err := AssetDir(name) + // File + if err != nil { + return RestoreAsset(dir, name) + } + // Dir + for _, child := range children { + err = RestoreAssets(dir, filepath.Join(name, child)) + if err != nil { + return err + } + } + return nil +} + +func _filePath(dir, name string) string { + cannonicalName := strings.Replace(name, "\\", "/", -1) + return filepath.Join(append([]string{dir}, strings.Split(cannonicalName, "/")...)...) +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/openapi/kustomizationapi/swagger.json b/vendor/sigs.k8s.io/kustomize/kyaml/openapi/kustomizationapi/swagger.json new file mode 100644 index 000000000000..7441a5ee64ce --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/openapi/kustomizationapi/swagger.json @@ -0,0 +1,130 @@ +{ + "definitions": { + "io.k8s.api.apps.v1.ConfigMapArgs": { + "properties": { + "GeneratorArgs": { + "$ref": "#/definitions/io.k8s.api.apps.v1.GeneratorArgs" + } + }, + "additionalProperties": false, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "kustomize.config.k8s.io", + "kind": "ConfigMapArgs", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.apps.v1.SecretArgs": { + "properties": { + "GeneratorArgs": { + "$ref": "#/definitions/io.k8s.api.apps.v1.GeneratorArgs" + }, + "type": { + "type": "string" + } + }, + "additionalProperties": false, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "kustomize.config.k8s.io", + "kind": "SecretArgs", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.apps.v1.GeneratorArgs": { + "properties": { + "namespace": { + "type": "string" + }, + "name": { + "type": "string" + }, + "behavior": { + "type": "string" + }, + "KvPairSources": { + "$ref": "#/definitions/io.k8s.api.apps.v1.KvPairSources" + } + }, + "additionalProperties": false, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "kustomize.config.k8s.io", + "kind": "GeneratorArgs", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.apps.v1.Kustomization": { + "required": [ + "TypeMeta" + ], + "properties": { + "configMapGenerator": { + "items": { + "$ref": "#/definitions/io.k8s.api.apps.v1.ConfigMapArgs" + }, + "type": "array", + "x-kubernetes-patch-merge-key": "name", + "x-kubernetes-patch-strategy": "merge" + }, + "secretGenerator": { + "items": { + "$ref": "#/definitions/io.k8s.api.apps.v1.SecretArgs" + }, + "type": "array", + "x-kubernetes-patch-merge-key": "name", + "x-kubernetes-patch-strategy": "merge" + } + }, + "additionalProperties": false, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "kustomize.config.k8s.io", + "kind": "Kustomization", + "version": "v1beta1" + } + ] + }, + "io.k8s.api.apps.v1.KvPairSources": { + "properties": { + "literals": { + "items": { + "type": "string" + }, + "type": "array" + }, + "files": { + "items": { + "type": "string" + }, + "type": "array" + }, + "envs": { + "items": { + "type": "string" + }, + "type": "array" + }, + "env": { + "type": "string" + } + }, + "additionalProperties": false, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "kustomize.config.k8s.io", + "kind": "KvPairSources", + "version": "v1beta1" + } + ] + } + } +} \ No newline at end of file diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/openapi/openapi.go b/vendor/sigs.k8s.io/kustomize/kyaml/openapi/openapi.go new file mode 100644 index 000000000000..cfe18e469cd7 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/openapi/openapi.go @@ -0,0 +1,607 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package openapi + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "path/filepath" + "reflect" + "strings" + + "github.com/go-openapi/spec" + "sigs.k8s.io/kustomize/kyaml/errors" + "sigs.k8s.io/kustomize/kyaml/openapi/kubernetesapi" + "sigs.k8s.io/kustomize/kyaml/openapi/kustomizationapi" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +// globalSchema contains global state information about the openapi +var globalSchema openapiData + +// kubernetesOpenAPIVersion specifies which builtin kubernetes schema to use +var kubernetesOpenAPIVersion string + +// customSchemaFile stores the custom OpenApi schema if it is provided +var customSchema []byte + +// openapiData contains the parsed openapi state. this is in a struct rather than +// a list of vars so that it can be reset from tests. +type openapiData struct { + // schema holds the OpenAPI schema data + schema spec.Schema + + // schemaForResourceType is a map of Resource types to their schemas + schemaByResourceType map[yaml.TypeMeta]*spec.Schema + + // namespaceabilityByResourceType stores whether a given Resource type + // is namespaceable or not + namespaceabilityByResourceType map[yaml.TypeMeta]bool + + // noUseBuiltInSchema stores whether we want to prevent using the built-n + // Kubernetes schema as part of the global schema + noUseBuiltInSchema bool + + // currentOpenAPIVersion stores the version if the kubernetes openapi data + // that is currently stored as the schema, so that we only reparse the + // schema when necessary (to speed up performance) + currentOpenAPIVersion string +} + +// ResourceSchema wraps the OpenAPI Schema. +type ResourceSchema struct { + // Schema is the OpenAPI schema for a Resource or field + Schema *spec.Schema +} + +// IsEmpty returns true if the ResourceSchema is empty +func (rs *ResourceSchema) IsMissingOrNull() bool { + if rs == nil || rs.Schema == nil { + return true + } + return reflect.DeepEqual(*rs.Schema, spec.Schema{}) +} + +// SchemaForResourceType returns the Schema for the given Resource +// TODO(pwittrock): create a version of this function that will return a schema +// which can be used for duck-typed Resources -- e.g. contains common fields such +// as metadata, replicas and spec.template.spec +func SchemaForResourceType(t yaml.TypeMeta) *ResourceSchema { + initSchema() + rs, found := globalSchema.schemaByResourceType[t] + if !found { + return nil + } + return &ResourceSchema{Schema: rs} +} + +// SupplementaryOpenAPIFieldName is the conventional field name (JSON/YAML) containing +// supplementary OpenAPI definitions. +const SupplementaryOpenAPIFieldName = "openAPI" + +const Definitions = "definitions" + +// AddSchemaFromFile reads the file at path and parses the OpenAPI definitions +// from the field "openAPI", also returns a function to clean the added definitions +// The returned clean function is a no-op on error, or else it's a function +// that the caller should use to remove the added openAPI definitions from +// global schema +func SchemaFromFile(path string) (*spec.Schema, error) { + object, err := parseOpenAPI(path) + if err != nil { + return nil, err + } + + return schemaUsingField(object, SupplementaryOpenAPIFieldName) +} + +// DefinitionRefs returns the list of openAPI definition references present in the +// input openAPIPath +func DefinitionRefs(openAPIPath string) ([]string, error) { + object, err := parseOpenAPI(openAPIPath) + if err != nil { + return nil, err + } + return definitionRefsFromRNode(object) +} + +// definitionRefsFromRNode returns the list of openAPI definitions keys from input +// yaml RNode +func definitionRefsFromRNode(object *yaml.RNode) ([]string, error) { + definitions, err := object.Pipe(yaml.Lookup(SupplementaryOpenAPIFieldName, Definitions)) + if definitions == nil { + return nil, err + } + if err != nil { + return nil, err + } + return definitions.Fields() +} + +// parseOpenAPI reads openAPIPath yaml and converts it to RNode +func parseOpenAPI(openAPIPath string) (*yaml.RNode, error) { + b, err := ioutil.ReadFile(openAPIPath) + if err != nil { + return nil, err + } + + object, err := yaml.Parse(string(b)) + if err != nil { + return nil, errors.Errorf("invalid file %q: %v", openAPIPath, err) + } + return object, nil +} + +// addSchemaUsingField parses the OpenAPI definitions from the specified field. +// If field is the empty string, use the whole document as OpenAPI. +func schemaUsingField(object *yaml.RNode, field string) (*spec.Schema, error) { + if field != "" { + // get the field containing the openAPI + m := object.Field(field) + if m.IsNilOrEmpty() { + // doesn't contain openAPI definitions + return nil, nil + } + object = m.Value + } + + oAPI, err := object.String() + if err != nil { + return nil, err + } + + // convert the yaml openAPI to a JSON string by unmarshalling it to an + // interface{} and the marshalling it to a string + var o interface{} + err = yaml.Unmarshal([]byte(oAPI), &o) + if err != nil { + return nil, err + } + j, err := json.Marshal(o) + if err != nil { + return nil, err + } + + var sc spec.Schema + err = sc.UnmarshalJSON(j) + if err != nil { + return nil, err + } + + return &sc, nil +} + +// AddSchema parses s, and adds definitions from s to the global schema. +func AddSchema(s []byte) error { + return parse(s) +} + +// ResetOpenAPI resets the openapi data to empty +func ResetOpenAPI() { + globalSchema = openapiData{} +} + +// AddDefinitions adds the definitions to the global schema. +func AddDefinitions(definitions spec.Definitions) { + // initialize values if they have not yet been set + if globalSchema.schemaByResourceType == nil { + globalSchema.schemaByResourceType = map[yaml.TypeMeta]*spec.Schema{} + } + if globalSchema.schema.Definitions == nil { + globalSchema.schema.Definitions = spec.Definitions{} + } + + // index the schema definitions so we can lookup them up for Resources + for k := range definitions { + // index by GVK, if no GVK is found then it is the schema for a subfield + // of a Resource + d := definitions[k] + + // copy definitions to the schema + globalSchema.schema.Definitions[k] = d + gvk, found := d.VendorExtensible.Extensions[kubernetesGVKExtensionKey] + if !found { + continue + } + // cast the extension to a []map[string]string + exts, ok := gvk.([]interface{}) + if !ok || len(exts) != 1 { + continue + } + + typeMeta, ok := toTypeMeta(exts[0]) + if !ok { + continue + } + globalSchema.schemaByResourceType[typeMeta] = &d + } +} + +func toTypeMeta(ext interface{}) (yaml.TypeMeta, bool) { + m, ok := ext.(map[string]interface{}) + if !ok { + return yaml.TypeMeta{}, false + } + + g := m[groupKey].(string) + apiVersion := m[versionKey].(string) + if g != "" { + apiVersion = g + "/" + apiVersion + } + return yaml.TypeMeta{Kind: m[kindKey].(string), APIVersion: apiVersion}, true +} + +// Resolve resolves the reference against the global schema +func Resolve(ref *spec.Ref, schema *spec.Schema) (*spec.Schema, error) { + return resolve(schema, ref) +} + +// Schema returns the global schema +func Schema() *spec.Schema { + return rootSchema() +} + +// GetSchema parses s into a ResourceSchema, resolving References within the +// global schema. +func GetSchema(s string, schema *spec.Schema) (*ResourceSchema, error) { + var sc spec.Schema + if err := sc.UnmarshalJSON([]byte(s)); err != nil { + return nil, errors.Wrap(err) + } + if sc.Ref.String() != "" { + r, err := Resolve(&sc.Ref, schema) + if err != nil { + return nil, errors.Wrap(err) + } + sc = *r + } + + return &ResourceSchema{Schema: &sc}, nil +} + +// IsNamespaceScoped determines whether a resource is namespace or +// cluster-scoped by looking at the information in the openapi schema. +// The second return value tells whether the provided type could be found +// in the openapi schema. If the value is false here, the scope of the +// resource is not known. If the type if found, the first return value will +// be true if the resource is namespace-scoped, and false if the type is +// cluster-scoped. +func IsNamespaceScoped(typeMeta yaml.TypeMeta) (bool, bool) { + initSchema() + isNamespaceScoped, found := globalSchema.namespaceabilityByResourceType[typeMeta] + return isNamespaceScoped, found +} + +// SuppressBuiltInSchemaUse can be called to prevent using the built-in Kubernetes +// schema as part of the global schema. +// Must be called before the schema is used. +func SuppressBuiltInSchemaUse() { + globalSchema.noUseBuiltInSchema = true +} + +// Elements returns the Schema for the elements of an array. +func (rs *ResourceSchema) Elements() *ResourceSchema { + // load the schema from swagger.json + initSchema() + + if len(rs.Schema.Type) != 1 || rs.Schema.Type[0] != "array" { + // either not an array, or array has multiple types + return nil + } + if rs == nil || rs.Schema == nil || rs.Schema.Items == nil { + // no-scheme for the items + return nil + } + s := *rs.Schema.Items.Schema + for s.Ref.String() != "" { + sc, e := Resolve(&s.Ref, Schema()) + if e != nil { + return nil + } + s = *sc + } + return &ResourceSchema{Schema: &s} +} + +const Elements = "[]" + +// Lookup calls either Field or Elements for each item in the path. +// If the path item is "[]", then Elements is called, otherwise +// Field is called. +// If any Field or Elements call returns nil, then Lookup returns +// nil immediately. +func (rs *ResourceSchema) Lookup(path ...string) *ResourceSchema { + s := rs + for _, p := range path { + if s == nil { + break + } + if p == Elements { + s = s.Elements() + continue + } + s = s.Field(p) + } + return s +} + +// Field returns the Schema for a field. +func (rs *ResourceSchema) Field(field string) *ResourceSchema { + // load the schema from swagger.json + initSchema() + + // locate the Schema + s, found := rs.Schema.Properties[field] + switch { + case found: + // no-op, continue with s as the schema + case rs.Schema.AdditionalProperties != nil && rs.Schema.AdditionalProperties.Schema != nil: + // map field type -- use Schema of the value + // (the key doesn't matter, they all have the same value type) + s = *rs.Schema.AdditionalProperties.Schema + default: + // no Schema found from either swagger.json or line comments + return nil + } + + // resolve the reference to the Schema if the Schema has one + for s.Ref.String() != "" { + sc, e := Resolve(&s.Ref, Schema()) + if e != nil { + return nil + } + s = *sc + } + + // return the merged Schema + return &ResourceSchema{Schema: &s} +} + +// PatchStrategyAndKeyList returns the patch strategy and complete merge key list +func (rs *ResourceSchema) PatchStrategyAndKeyList() (string, []string) { + ps, found := rs.Schema.Extensions[kubernetesPatchStrategyExtensionKey] + if !found { + // empty patch strategy + return "", []string{} + } + mkList, found := rs.Schema.Extensions[kubernetesMergeKeyMapList] + if found { + // mkList is []interface, convert to []string + mkListStr := make([]string, len(mkList.([]interface{}))) + for i, v := range mkList.([]interface{}) { + mkListStr[i] = v.(string) + } + return ps.(string), mkListStr + } + mk, found := rs.Schema.Extensions[kubernetesMergeKeyExtensionKey] + if !found { + // no mergeKey -- may be a primitive associative list (e.g. finalizers) + return ps.(string), []string{} + } + return ps.(string), []string{mk.(string)} +} + +// PatchStrategyAndKey returns the patch strategy and merge key extensions +func (rs *ResourceSchema) PatchStrategyAndKey() (string, string) { + ps, found := rs.Schema.Extensions[kubernetesPatchStrategyExtensionKey] + if !found { + // empty patch strategy + return "", "" + } + + mk, found := rs.Schema.Extensions[kubernetesMergeKeyExtensionKey] + if !found { + // no mergeKey -- may be a primitive associative list (e.g. finalizers) + mk = "" + } + return ps.(string), mk.(string) +} + +const ( + // kubernetesOpenAPIDefaultVersion is the latest version number of the statically compiled in + // OpenAPI schema for kubernetes built-in types + kubernetesOpenAPIDefaultVersion = kubernetesapi.DefaultOpenAPI + + // kustomizationAPIAssetName is the name of the asset containing the statically compiled in + // OpenAPI definitions for Kustomization built-in types + kustomizationAPIAssetName = "kustomizationapi/swagger.json" + + // kubernetesGVKExtensionKey is the key to lookup the kubernetes group version kind extension + // -- the extension is an array of objects containing a gvk + kubernetesGVKExtensionKey = "x-kubernetes-group-version-kind" + + // kubernetesMergeKeyExtensionKey is the key to lookup the kubernetes merge key extension + // -- the extension is a string + kubernetesMergeKeyExtensionKey = "x-kubernetes-patch-merge-key" + + // kubernetesPatchStrategyExtensionKey is the key to lookup the kubernetes patch strategy + // extension -- the extension is a string + kubernetesPatchStrategyExtensionKey = "x-kubernetes-patch-strategy" + + // kubernetesMergeKeyMapList is the list of merge keys when there needs to be multiple + // -- the extension is an array of strings + kubernetesMergeKeyMapList = "x-kubernetes-list-map-keys" + + // groupKey is the key to lookup the group from the GVK extension + groupKey = "group" + // versionKey is the key to lookup the version from the GVK extension + versionKey = "version" + // kindKey is the the to lookup the kind from the GVK extension + kindKey = "kind" +) + +// SetSchema sets the kubernetes OpenAPI schema version to use +func SetSchema(openAPIField map[string]string, schema []byte, reset bool) error { + // this should only be set once + schemaIsSet := (kubernetesOpenAPIVersion != "") || customSchema != nil + if schemaIsSet && !reset { + return nil + } + + version, exists := openAPIField["version"] + if exists && schema != nil { + return fmt.Errorf("builtin version and custom schema provided, cannot use both") + } + + if schema != nil { // use custom schema + customSchema = schema + kubernetesOpenAPIVersion = "custom" + return nil + } + + // use builtin version + kubernetesOpenAPIVersion = strings.ReplaceAll(version, ".", "") + if kubernetesOpenAPIVersion == "" { + return nil + } + if _, ok := kubernetesapi.OpenAPIMustAsset[kubernetesOpenAPIVersion]; !ok { + return fmt.Errorf("the specified OpenAPI version is not built in") + } + customSchema = nil + return nil +} + +// GetSchemaVersion returns what kubernetes OpenAPI version is being used +func GetSchemaVersion() string { + switch { + case kubernetesOpenAPIVersion == "" && customSchema == nil: + return kubernetesOpenAPIDefaultVersion + case customSchema != nil: + return "using custom schema from file provided" + default: + return kubernetesOpenAPIVersion + } +} + +// initSchema parses the json schema +func initSchema() { + if customSchema != nil { + ResetOpenAPI() + err := parse(customSchema) + if err != nil { + panic("invalid schema file") + } + if err := parse(kustomizationapi.MustAsset(kustomizationAPIAssetName)); err != nil { + // this should never happen + panic(err) + } + return + } + + currentVersion := kubernetesOpenAPIVersion + if currentVersion == "" { + currentVersion = kubernetesOpenAPIDefaultVersion + } + if globalSchema.currentOpenAPIVersion != currentVersion { + parseBuiltinSchema(currentVersion) + } + globalSchema.currentOpenAPIVersion = currentVersion +} + +// parseBuiltinSchema calls parse to parse the json schemas +func parseBuiltinSchema(version string) { + if globalSchema.noUseBuiltInSchema { + // don't parse the built in schema + return + } + + // parse the swagger, this should never fail + assetName := filepath.Join( + "kubernetesapi", + version, + "swagger.json") + + if err := parse(kubernetesapi.OpenAPIMustAsset[version](assetName)); err != nil { + // this should never happen + panic(err) + } + + if err := parse(kustomizationapi.MustAsset(kustomizationAPIAssetName)); err != nil { + // this should never happen + panic(err) + } +} + +// parse parses and indexes a single json schema +func parse(b []byte) error { + var swagger spec.Swagger + + if err := swagger.UnmarshalJSON(b); err != nil { + return errors.Wrap(err) + } + AddDefinitions(swagger.Definitions) + findNamespaceability(swagger.Paths) + + return nil +} + +// findNamespaceability looks at the api paths for the resource to determine +// if it is cluster-scoped or namespace-scoped. The gvk of the resource +// for each path is found by looking at the x-kubernetes-group-version-kind +// extension. If a path exists for the resource that contains a namespace path +// parameter, the resource is namespace-scoped. +func findNamespaceability(paths *spec.Paths) { + if globalSchema.namespaceabilityByResourceType == nil { + globalSchema.namespaceabilityByResourceType = make(map[yaml.TypeMeta]bool) + } + + if paths == nil { + return + } + + for path, pathInfo := range paths.Paths { + if pathInfo.Get == nil { + continue + } + gvk, found := pathInfo.Get.VendorExtensible.Extensions[kubernetesGVKExtensionKey] + if !found { + continue + } + typeMeta, found := toTypeMeta(gvk) + if !found { + continue + } + + if strings.Contains(path, "namespaces/{namespace}") { + // if we find a namespace path parameter, we just update the map + // directly + globalSchema.namespaceabilityByResourceType[typeMeta] = true + } else if _, found := globalSchema.namespaceabilityByResourceType[typeMeta]; !found { + // if the resource doesn't have the namespace path parameter, we + // only add it to the map if it doesn't already exist. + globalSchema.namespaceabilityByResourceType[typeMeta] = false + } + } +} + +func resolve(root interface{}, ref *spec.Ref) (*spec.Schema, error) { + res, _, err := ref.GetPointer().Get(root) + if err != nil { + return nil, errors.Wrap(err) + } + switch sch := res.(type) { + case spec.Schema: + return &sch, nil + case *spec.Schema: + return sch, nil + case map[string]interface{}: + b, err := json.Marshal(sch) + if err != nil { + return nil, err + } + newSch := new(spec.Schema) + if err = json.Unmarshal(b, newSch); err != nil { + return nil, err + } + return newSch, nil + default: + return nil, errors.Wrap(fmt.Errorf("unknown type for the resolved reference")) + } +} + +func rootSchema() *spec.Schema { + initSchema() + return &globalSchema.schema +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/runfn/runfn.go b/vendor/sigs.k8s.io/kustomize/kyaml/runfn/runfn.go new file mode 100644 index 000000000000..5f5481797bcb --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/runfn/runfn.go @@ -0,0 +1,521 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package runfn + +import ( + "fmt" + "io" + "os" + "os/user" + "path" + "path/filepath" + "sort" + "strconv" + "strings" + "sync/atomic" + + "sigs.k8s.io/kustomize/kyaml/errors" + "sigs.k8s.io/kustomize/kyaml/fn/runtime/container" + "sigs.k8s.io/kustomize/kyaml/fn/runtime/exec" + "sigs.k8s.io/kustomize/kyaml/fn/runtime/runtimeutil" + "sigs.k8s.io/kustomize/kyaml/fn/runtime/starlark" + "sigs.k8s.io/kustomize/kyaml/kio" + "sigs.k8s.io/kustomize/kyaml/kio/kioutil" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +// RunFns runs the set of configuration functions in a local directory against +// the Resources in that directory +type RunFns struct { + StorageMounts []runtimeutil.StorageMount + + // Path is the path to the directory containing functions + Path string + + // FunctionPaths Paths allows functions to be specified outside the configuration + // directory. + // Functions provided on FunctionPaths are globally scoped. + // If FunctionPaths length is > 0, then NoFunctionsFromInput defaults to true + FunctionPaths []string + + // Functions is an explicit list of functions to run against the input. + // Functions provided on Functions are globally scoped. + // If Functions length is > 0, then NoFunctionsFromInput defaults to true + Functions []*yaml.RNode + + // GlobalScope if true, functions read from input will be scoped globally rather + // than only to Resources under their subdirs. + GlobalScope bool + + // Input can be set to read the Resources from Input rather than from a directory + Input io.Reader + + // Network enables network access for functions that declare it + Network bool + + // Output can be set to write the result to Output rather than back to the directory + Output io.Writer + + // NoFunctionsFromInput if set to true will not read any functions from the input, + // and only use explicit sources + NoFunctionsFromInput *bool + + // EnableStarlark will enable functions run as starlark scripts + EnableStarlark bool + + // EnableExec will enable exec functions + EnableExec bool + + // DisableContainers will disable functions run as containers + DisableContainers bool + + // ResultsDir is where to write each functions results + ResultsDir string + + // LogSteps enables logging the function that is running. + LogSteps bool + + // LogWriter can be set to write the logs to LogWriter rather than stderr if LogSteps is enabled. + LogWriter io.Writer + + // resultsCount is used to generate the results filename for each container + resultsCount uint32 + + // functionFilterProvider provides a filter to perform the function. + // this is a variable so it can be mocked in tests + functionFilterProvider func( + filter runtimeutil.FunctionSpec, api *yaml.RNode, currentUser currentUserFunc) (kio.Filter, error) + + // AsCurrentUser is a boolean to indicate whether docker container should use + // the uid and gid that run the command + AsCurrentUser bool + + // Env contains environment variables that will be exported to container + Env []string + + // ContinueOnEmptyResult configures what happens when the underlying pipeline + // returns an empty result. + // If it is false (default), subsequent functions will be skipped and the + // result will be returned immediately. + // If it is true, the empty result will be provided as input to the next + // function in the list. + ContinueOnEmptyResult bool +} + +// Execute runs the command +func (r RunFns) Execute() error { + // make the path absolute so it works on mac + var err error + r.Path, err = filepath.Abs(r.Path) + if err != nil { + return errors.Wrap(err) + } + + // default the containerFilterProvider if it hasn't been override. Split out for testing. + (&r).init() + nodes, fltrs, output, err := r.getNodesAndFilters() + if err != nil { + return err + } + return r.runFunctions(nodes, output, fltrs) +} + +func (r RunFns) getNodesAndFilters() ( + *kio.PackageBuffer, []kio.Filter, *kio.LocalPackageReadWriter, error) { + // Read Resources from Directory or Input + buff := &kio.PackageBuffer{} + p := kio.Pipeline{Outputs: []kio.Writer{buff}} + // save the output dir because we will need it to write back + // the same one for reading must be used for writing if deleting Resources + var outputPkg *kio.LocalPackageReadWriter + if r.Path != "" { + outputPkg = &kio.LocalPackageReadWriter{PackagePath: r.Path, MatchFilesGlob: kio.MatchAll} + } + + if r.Input == nil { + p.Inputs = []kio.Reader{outputPkg} + } else { + p.Inputs = []kio.Reader{&kio.ByteReader{Reader: r.Input}} + } + if err := p.Execute(); err != nil { + return nil, nil, outputPkg, err + } + + fltrs, err := r.getFilters(buff.Nodes) + if err != nil { + return nil, nil, outputPkg, err + } + return buff, fltrs, outputPkg, nil +} + +func (r RunFns) getFilters(nodes []*yaml.RNode) ([]kio.Filter, error) { + var fltrs []kio.Filter + + // fns from annotations on the input resources + f, err := r.getFunctionsFromInput(nodes) + if err != nil { + return nil, err + } + fltrs = append(fltrs, f...) + + // fns from directories specified on the struct + f, err = r.getFunctionsFromFunctionPaths() + if err != nil { + return nil, err + } + fltrs = append(fltrs, f...) + + // explicit fns specified on the struct + f, err = r.getFunctionsFromFunctions() + if err != nil { + return nil, err + } + fltrs = append(fltrs, f...) + + return fltrs, nil +} + +// runFunctions runs the fltrs against the input and writes to either r.Output or output +func (r RunFns) runFunctions( + input kio.Reader, output kio.Writer, fltrs []kio.Filter) error { + // use the previously read Resources as input + var outputs []kio.Writer + if r.Output == nil { + // write back to the package + outputs = append(outputs, output) + } else { + // write to the output instead of the directory if r.Output is specified or + // the output is nil (reading from Input) + outputs = append(outputs, kio.ByteWriter{Writer: r.Output}) + } + + var err error + pipeline := kio.Pipeline{ + Inputs: []kio.Reader{input}, + Filters: fltrs, + Outputs: outputs, + ContinueOnEmptyResult: r.ContinueOnEmptyResult, + } + if r.LogSteps { + err = pipeline.ExecuteWithCallback(func(op kio.Filter) { + var identifier string + + switch filter := op.(type) { + case *container.Filter: + identifier = filter.Image + case *exec.Filter: + identifier = filter.Path + case *starlark.Filter: + identifier = filter.String() + default: + identifier = "unknown-type function" + } + + _, _ = fmt.Fprintf(r.LogWriter, "Running %s\n", identifier) + }) + } else { + err = pipeline.Execute() + } + if err != nil { + return err + } + + // check for deferred function errors + var errs []string + for i := range fltrs { + cf, ok := fltrs[i].(runtimeutil.DeferFailureFunction) + if !ok { + continue + } + if cf.GetExit() != nil { + errs = append(errs, cf.GetExit().Error()) + } + } + if len(errs) > 0 { + return fmt.Errorf(strings.Join(errs, "\n---\n")) + } + return nil +} + +// getFunctionsFromInput scans the input for functions and runs them +func (r RunFns) getFunctionsFromInput(nodes []*yaml.RNode) ([]kio.Filter, error) { + if *r.NoFunctionsFromInput { + return nil, nil + } + + buff := &kio.PackageBuffer{} + err := kio.Pipeline{ + Inputs: []kio.Reader{&kio.PackageBuffer{Nodes: nodes}}, + Filters: []kio.Filter{&runtimeutil.IsReconcilerFilter{}}, + Outputs: []kio.Writer{buff}, + }.Execute() + if err != nil { + return nil, err + } + err = sortFns(buff) + if err != nil { + return nil, err + } + return r.getFunctionFilters(false, buff.Nodes...) +} + +// getFunctionsFromFunctionPaths returns the set of functions read from r.FunctionPaths +// as a slice of Filters +func (r RunFns) getFunctionsFromFunctionPaths() ([]kio.Filter, error) { + buff := &kio.PackageBuffer{} + for i := range r.FunctionPaths { + err := kio.Pipeline{ + Inputs: []kio.Reader{ + kio.LocalPackageReader{PackagePath: r.FunctionPaths[i]}, + }, + Outputs: []kio.Writer{buff}, + }.Execute() + if err != nil { + return nil, err + } + } + return r.getFunctionFilters(true, buff.Nodes...) +} + +// getFunctionsFromFunctions returns the set of explicitly provided functions as +// Filters +func (r RunFns) getFunctionsFromFunctions() ([]kio.Filter, error) { + return r.getFunctionFilters(true, r.Functions...) +} + +// mergeContainerEnv will merge the envs specified by command line (imperative) and config +// file (declarative). If they have same key, the imperative value will be respected. +func (r RunFns) mergeContainerEnv(envs []string) []string { + imperative := runtimeutil.NewContainerEnvFromStringSlice(r.Env) + declarative := runtimeutil.NewContainerEnvFromStringSlice(envs) + for key, value := range imperative.EnvVars { + declarative.AddKeyValue(key, value) + } + + for _, key := range imperative.VarsToExport { + declarative.AddKey(key) + } + + return declarative.Raw() +} + +func (r RunFns) getFunctionFilters(global bool, fns ...*yaml.RNode) ( + []kio.Filter, error) { + var fltrs []kio.Filter + for i := range fns { + api := fns[i] + spec := runtimeutil.GetFunctionSpec(api) + if spec == nil { + // resource doesn't have function spec + continue + } + if spec.Container.Network && !r.Network { + // TODO(eddiezane): Provide error info about which function needs the network + return fltrs, errors.Errorf("network required but not enabled with --network") + } + // merge envs from imperative and declarative + spec.Container.Env = r.mergeContainerEnv(spec.Container.Env) + + c, err := r.functionFilterProvider(*spec, api, user.Current) + if err != nil { + return nil, err + } + + if c == nil { + continue + } + cf, ok := c.(*container.Filter) + if global && ok { + cf.Exec.GlobalScope = true + } + fltrs = append(fltrs, c) + } + return fltrs, nil +} + +// sortFns sorts functions so that functions with the longest paths come first +func sortFns(buff *kio.PackageBuffer) error { + var outerErr error + // sort the nodes so that we traverse them depth first + // functions deeper in the file system tree should be run first + sort.Slice(buff.Nodes, func(i, j int) bool { + mi, _ := buff.Nodes[i].GetMeta() + pi := filepath.ToSlash(mi.Annotations[kioutil.PathAnnotation]) + + mj, _ := buff.Nodes[j].GetMeta() + pj := filepath.ToSlash(mj.Annotations[kioutil.PathAnnotation]) + + // If the path is the same, we decide the ordering based on the + // index annotation. + if pi == pj { + iIndex, err := strconv.Atoi(mi.Annotations[kioutil.IndexAnnotation]) + if err != nil { + outerErr = err + return false + } + jIndex, err := strconv.Atoi(mj.Annotations[kioutil.IndexAnnotation]) + if err != nil { + outerErr = err + return false + } + return iIndex < jIndex + } + + if filepath.Base(path.Dir(pi)) == "functions" { + // don't count the functions dir, the functions are scoped 1 level above + pi = filepath.Dir(path.Dir(pi)) + } else { + pi = filepath.Dir(pi) + } + + if filepath.Base(path.Dir(pj)) == "functions" { + // don't count the functions dir, the functions are scoped 1 level above + pj = filepath.Dir(path.Dir(pj)) + } else { + pj = filepath.Dir(pj) + } + + // i is "less" than j (comes earlier) if its depth is greater -- e.g. run + // i before j if it is deeper in the directory structure + li := len(strings.Split(pi, "/")) + if pi == "." { + // local dir should have 0 path elements instead of 1 + li = 0 + } + lj := len(strings.Split(pj, "/")) + if pj == "." { + // local dir should have 0 path elements instead of 1 + lj = 0 + } + if li != lj { + // use greater-than because we want to sort with the longest + // paths FIRST rather than last + return li > lj + } + + // sort by path names if depths are equal + return pi < pj + }) + return outerErr +} + +// init initializes the RunFns with a containerFilterProvider. +func (r *RunFns) init() { + if r.NoFunctionsFromInput == nil { + // default no functions from input if any function sources are explicitly provided + nfn := len(r.FunctionPaths) > 0 || len(r.Functions) > 0 + r.NoFunctionsFromInput = &nfn + } + + // if no path is specified, default reading from stdin and writing to stdout + if r.Path == "" { + if r.Output == nil { + r.Output = os.Stdout + } + if r.Input == nil { + r.Input = os.Stdin + } + } + + // functionFilterProvider set the filter provider + if r.functionFilterProvider == nil { + r.functionFilterProvider = r.ffp + } + + // if LogSteps is enabled and LogWriter is not specified, use stderr + if r.LogSteps && r.LogWriter == nil { + r.LogWriter = os.Stderr + } +} + +type currentUserFunc func() (*user.User, error) + +// getUIDGID will return "nobody" if asCurrentUser is false. Otherwise +// return "uid:gid" according to the return from currentUser function. +func getUIDGID(asCurrentUser bool, currentUser currentUserFunc) (string, error) { + if !asCurrentUser { + return "nobody", nil + } + + u, err := currentUser() + if err != nil { + return "", err + } + return fmt.Sprintf("%s:%s", u.Uid, u.Gid), nil +} + +// ffp provides function filters +func (r *RunFns) ffp(spec runtimeutil.FunctionSpec, api *yaml.RNode, currentUser currentUserFunc) (kio.Filter, error) { + var resultsFile string + if r.ResultsDir != "" { + resultsFile = filepath.Join(r.ResultsDir, fmt.Sprintf( + "results-%v.yaml", r.resultsCount)) + atomic.AddUint32(&r.resultsCount, 1) + } + if !r.DisableContainers && spec.Container.Image != "" { + // TODO: Add a test for this behavior + uidgid, err := getUIDGID(r.AsCurrentUser, currentUser) + if err != nil { + return nil, err + } + c := container.NewContainer( + runtimeutil.ContainerSpec{ + Image: spec.Container.Image, + Network: spec.Container.Network, + StorageMounts: r.StorageMounts, + Env: spec.Container.Env, + }, + uidgid, + ) + cf := &c + cf.Exec.FunctionConfig = api + cf.Exec.GlobalScope = r.GlobalScope + cf.Exec.ResultsFile = resultsFile + cf.Exec.DeferFailure = spec.DeferFailure + return cf, nil + } + if r.EnableStarlark && (spec.Starlark.Path != "" || spec.Starlark.URL != "") { + // the script path is relative to the function config file + m, err := api.GetMeta() + if err != nil { + return nil, errors.Wrap(err) + } + + var p string + if spec.Starlark.Path != "" { + p = filepath.ToSlash(path.Clean(m.Annotations[kioutil.PathAnnotation])) + spec.Starlark.Path = filepath.ToSlash(path.Clean(spec.Starlark.Path)) + if filepath.IsAbs(spec.Starlark.Path) || path.IsAbs(spec.Starlark.Path) { + return nil, errors.Errorf( + "absolute function path %s not allowed", spec.Starlark.Path) + } + if strings.HasPrefix(spec.Starlark.Path, "..") { + return nil, errors.Errorf( + "function path %s not allowed to start with ../", spec.Starlark.Path) + } + p = filepath.ToSlash(filepath.Join(r.Path, filepath.Dir(p), spec.Starlark.Path)) + } + fmt.Println(p) + + sf := &starlark.Filter{Name: spec.Starlark.Name, Path: p, URL: spec.Starlark.URL} + + sf.FunctionConfig = api + sf.GlobalScope = r.GlobalScope + sf.ResultsFile = resultsFile + sf.DeferFailure = spec.DeferFailure + return sf, nil + } + + if r.EnableExec && spec.Exec.Path != "" { + ef := &exec.Filter{Path: spec.Exec.Path} + + ef.FunctionConfig = api + ef.GlobalScope = r.GlobalScope + ef.ResultsFile = resultsFile + ef.DeferFailure = spec.DeferFailure + return ef, nil + } + + return nil, nil +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/sets/string.go b/vendor/sigs.k8s.io/kustomize/kyaml/sets/string.go new file mode 100644 index 000000000000..07f02afb0b5c --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/sets/string.go @@ -0,0 +1,64 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package sets + +type String map[string]interface{} + +func (s String) Len() int { + return len(s) +} + +func (s String) List() []string { + var val []string + for k := range s { + val = append(val, k) + } + return val +} + +func (s String) Has(val string) bool { + _, found := s[val] + return found +} + +func (s String) Insert(vals ...string) { + for _, val := range vals { + s[val] = nil + } +} + +func (s String) Difference(s2 String) String { + s3 := String{} + for k := range s { + if _, found := s2[k]; !found { + s3.Insert(k) + } + } + return s3 +} + +func (s String) SymmetricDifference(s2 String) String { + s3 := String{} + for k := range s { + if _, found := s2[k]; !found { + s3.Insert(k) + } + } + for k := range s2 { + if _, found := s[k]; !found { + s3.Insert(k) + } + } + return s3 +} + +func (s String) Intersection(s2 String) String { + s3 := String{} + for k := range s { + if _, found := s2[k]; found { + s3.Insert(k) + } + } + return s3 +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/sets/stringlist.go b/vendor/sigs.k8s.io/kustomize/kyaml/sets/stringlist.go new file mode 100644 index 000000000000..2d75978fcf1e --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/sets/stringlist.go @@ -0,0 +1,44 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package sets + +// StringList is a set, where each element of +// the set is a string slice. +type StringList [][]string + +func (s StringList) Len() int { + return len(s) +} + +func (s StringList) Insert(val []string) StringList { + if !s.Has(val) { + return append(s, val) + } + return s +} + +func (s StringList) Has(val []string) bool { + if len(s) == 0 { + return false + } + + for i := range s { + if isStringSliceEqual(s[i], val) { + return true + } + } + return false +} + +func isStringSliceEqual(s []string, t []string) bool { + if len(s) != len(t) { + return false + } + for i := range s { + if s[i] != t[i] { + return false + } + } + return true +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/yaml/alias.go b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/alias.go new file mode 100644 index 000000000000..ee0d5cbb172d --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/alias.go @@ -0,0 +1,44 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package yaml + +import ( + "io" + + "gopkg.in/yaml.v3" +) + +// Expose the yaml.v3 functions so this package can be used as a replacement + +type Decoder = yaml.Decoder +type Encoder = yaml.Encoder +type IsZeroer = yaml.IsZeroer +type Kind = yaml.Kind +type Marshaler = yaml.Marshaler +type Node = yaml.Node +type Style = yaml.Style +type TypeError = yaml.TypeError +type Unmarshaler = yaml.Unmarshaler + +var Marshal = yaml.Marshal +var Unmarshal = yaml.Unmarshal +var NewDecoder = yaml.NewDecoder +var NewEncoder = func(w io.Writer) *yaml.Encoder { + e := yaml.NewEncoder(w) + e.SetIndent(2) + return e +} + +var AliasNode yaml.Kind = yaml.AliasNode +var DocumentNode yaml.Kind = yaml.DocumentNode +var MappingNode yaml.Kind = yaml.MappingNode +var ScalarNode yaml.Kind = yaml.ScalarNode +var SequenceNode yaml.Kind = yaml.SequenceNode + +var DoubleQuotedStyle yaml.Style = yaml.DoubleQuotedStyle +var FlowStyle yaml.Style = yaml.FlowStyle +var FoldedStyle yaml.Style = yaml.FoldedStyle +var LiteralStyle yaml.Style = yaml.LiteralStyle +var SingleQuotedStyle yaml.Style = yaml.SingleQuotedStyle +var TaggedStyle yaml.Style = yaml.TaggedStyle diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/yaml/compatibility.go b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/compatibility.go new file mode 100644 index 000000000000..e2cd811ce1dd --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/compatibility.go @@ -0,0 +1,92 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package yaml + +import ( + "reflect" + "strings" + + "github.com/go-openapi/spec" + y1_1 "gopkg.in/yaml.v2" + y1_2 "gopkg.in/yaml.v3" +) + +// typeToTag maps OpenAPI schema types to yaml 1.2 tags +var typeToTag = map[string]string{ + "string": NodeTagString, + "integer": NodeTagInt, + "boolean": NodeTagBool, + "number": NodeTagFloat, +} + +// FormatNonStringStyle makes sure that values which parse as non-string values in yaml 1.1 +// are correctly formatted given the Schema type. +func FormatNonStringStyle(node *Node, schema spec.Schema) { + if len(schema.Type) != 1 { + return + } + t := schema.Type[0] + + if !IsYaml1_1NonString(node) { + return + } + switch { + case t == "string" && schema.Format != "int-or-string": + if (node.Style&DoubleQuotedStyle == 0) && (node.Style&SingleQuotedStyle == 0) { + // must quote values so they are parsed as strings + node.Style = DoubleQuotedStyle + } + case t == "boolean" || t == "integer" || t == "number": + if (node.Style&DoubleQuotedStyle != 0) || (node.Style&SingleQuotedStyle != 0) { + // must NOT quote the values so they aren't parsed as strings + node.Style = 0 + } + default: + return + } + if tag, found := typeToTag[t]; found { + // make sure the right tag is set + node.Tag = tag + } +} + +// IsYaml1_1NonString returns true if the value parses as a non-string value in yaml 1.1 +// when unquoted. +// +// Note: yaml 1.2 uses different keywords than yaml 1.1. Example: yaml 1.2 interprets +// `field: on` and `field: "on"` as equivalent (both strings). However Yaml 1.1 interprets +// `field: on` as on being a bool and `field: "on"` as on being a string. +// If an input is read with `field: "on"`, and the style is changed from DoubleQuote to 0, +// it will change the type of the field from a string to a bool. For this reason, fields +// which are keywords in yaml 1.1 should never have their style changed, as it would break +// backwards compatibility with yaml 1.1 -- which is what is used by the Kubernetes apiserver. +func IsYaml1_1NonString(node *Node) bool { + if node.Kind != y1_2.ScalarNode { + // not a keyword + return false + } + return IsValueNonString(node.Value) +} + +func IsValueNonString(value string) bool { + if value == "" { + return false + } + if strings.Contains(value, "\n") { + // multi-line strings will fail to unmarshal + return false + } + // check if the value will unmarshal into a non-string value using a yaml 1.1 parser + var i1 interface{} + if err := y1_1.Unmarshal([]byte(value), &i1); err != nil { + return false + } + if reflect.TypeOf(i1) != stringType { + return true + } + + return false +} + +var stringType = reflect.TypeOf("string") diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/yaml/const.go b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/const.go new file mode 100644 index 000000000000..6a2cc4516697 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/const.go @@ -0,0 +1,30 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package yaml + +const ( + // NodeTagNull is the tag set for a yaml.Document that contains no data; + // e.g. it isn't a Map, Slice, Document, etc + NodeTagNull = "!!null" + NodeTagFloat = "!!float" + NodeTagString = "!!str" + NodeTagBool = "!!bool" + NodeTagInt = "!!int" + NodeTagMap = "!!map" + NodeTagSeq = "!!seq" + NodeTagEmpty = "" +) + +// Field names +const ( + AnnotationsField = "annotations" + APIVersionField = "apiVersion" + KindField = "kind" + MetadataField = "metadata" + DataField = "data" + BinaryDataField = "binaryData" + NameField = "name" + NamespaceField = "namespace" + LabelsField = "labels" +) diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/yaml/datamap.go b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/datamap.go new file mode 100644 index 000000000000..f4b7e6664e38 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/datamap.go @@ -0,0 +1,121 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package yaml + +import ( + "encoding/base64" + "sort" + "strings" + "unicode/utf8" +) + +// SortedMapKeys returns a sorted slice of keys to the given map. +// Writing this function never gets old. +func SortedMapKeys(m map[string]string) []string { + keys := make([]string, len(m)) + i := 0 + for k := range m { + keys[i] = k + i++ + } + sort.Strings(keys) + return keys +} + +func (rn *RNode) LoadMapIntoConfigMapData(m map[string]string) error { + for _, k := range SortedMapKeys(m) { + fldName, vrN := makeConfigMapValueRNode(m[k]) + if _, err := rn.Pipe( + LookupCreate(MappingNode, fldName), + SetField(k, vrN)); err != nil { + return err + } + } + return nil +} + +func (rn *RNode) LoadMapIntoConfigMapBinaryData(m map[string]string) error { + for _, k := range SortedMapKeys(m) { + _, vrN := makeConfigMapValueRNode(m[k]) + // we know this is binary data + fldName := BinaryDataField + if _, err := rn.Pipe( + LookupCreate(MappingNode, fldName), + SetField(k, vrN)); err != nil { + return err + } + } + return nil +} + +func makeConfigMapValueRNode(s string) (field string, rN *RNode) { + yN := &Node{Kind: ScalarNode} + yN.Tag = NodeTagString + if utf8.ValidString(s) { + field = DataField + yN.Value = s + } else { + field = BinaryDataField + yN.Value = encodeBase64(s) + } + if strings.Contains(yN.Value, "\n") { + yN.Style = LiteralStyle + } + return field, NewRNode(yN) +} + +func (rn *RNode) LoadMapIntoSecretData(m map[string]string) error { + mapNode, err := rn.Pipe(LookupCreate(MappingNode, DataField)) + if err != nil { + return err + } + for _, k := range SortedMapKeys(m) { + vrN := makeSecretValueRNode(m[k]) + if _, err := mapNode.Pipe(SetField(k, vrN)); err != nil { + return err + } + } + return nil +} + +// In a secret, all data is base64 encoded, regardless of its conformance +// or lack thereof to UTF-8. +func makeSecretValueRNode(s string) *RNode { + yN := &Node{Kind: ScalarNode} + // Purposely don't use YAML tags to identify the data as being plain text or + // binary. It kubernetes Secrets the values in the `data` map are expected + // to be base64 encoded, and in ConfigMaps that same can be said for the + // values in the `binaryData` field. + yN.Tag = NodeTagString + yN.Value = encodeBase64(s) + if strings.Contains(yN.Value, "\n") { + yN.Style = LiteralStyle + } + return NewRNode(yN) +} + +// encodeBase64 encodes s as base64 that is broken up into multiple lines +// as appropriate for the resulting length. +func encodeBase64(s string) string { + const lineLen = 70 + encLen := base64.StdEncoding.EncodedLen(len(s)) + lines := encLen/lineLen + 1 + buf := make([]byte, encLen*2+lines) + in := buf[0:encLen] + out := buf[encLen:] + base64.StdEncoding.Encode(in, []byte(s)) + k := 0 + for i := 0; i < len(in); i += lineLen { + j := i + lineLen + if j > len(in) { + j = len(in) + } + k += copy(out[k:], in[i:j]) + if lines > 1 { + out[k] = '\n' + k++ + } + } + return string(out[:k]) +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/yaml/doc.go b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/doc.go new file mode 100644 index 000000000000..b58811cf8b4d --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/doc.go @@ -0,0 +1,49 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +// Package yaml contains libraries for manipulating individual Kubernetes Resource +// Configuration as yaml, keeping yaml structure and comments. +// +// Parsing Resources +// +// Typically Resources will be initialized as collections through the kio package libraries. +// However it is possible to directly initialize Resources using Parse. +// resource, err := yaml.Parse("apiVersion: apps/v1\nkind: Deployment") +// +// Processing Resources +// +// Individual Resources are manipulated using the Pipe and PipeE to apply Filter functions +// to transform the Resource data. +// err := resource.PipeE(yaml.SetAnnotation("key", "value")) +// +// If multiple Filter functions are provided to Pipe or PipeE, each function is applied to +// the result of the last function -- e.g. yaml.Lookup(...), yaml.SetField(...) +// +// Field values may also be retrieved using Pipe. +// annotationValue, err := resource.Pipe(yaml.GetAnnotation("key")) +// +// See http://www.linfo.org/filters.html for a definition of filters. +// +// Common Filters +// +// There are a number of standard filter functions provided by the yaml package. +// +// Working with annotations: +// [AnnotationSetter{}, AnnotationGetter{}, AnnotationClearer{}] +// +// Working with fields by path: +// [PathMatcher{}, PathGetter{}] +// +// Working with individual fields on Maps and Objects: +// [FieldMatcher{}, FieldSetter{}, FieldGetter{}] +// +// Working with individual elements in Sequences: +// [ElementAppender{}, ElementSetter{}, ElementMatcher{}] +// +// Writing Filters +// +// Users may implement their own filter functions. When doing so, can be necessary to work with +// the RNode directly rather than through Pipe. RNode provides a number of functions for doing +// so. See: +// [GetMeta(), Fields(), Elements(), String()] +package yaml diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/yaml/filters.go b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/filters.go new file mode 100644 index 000000000000..e364035e612f --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/filters.go @@ -0,0 +1,146 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package yaml + +import ( + "fmt" + "regexp" + "sort" + "strings" +) + +// Filters is the list of serializable Pipeline Filters +var Filters = map[string]func() Filter{ + "AnnotationClearer": func() Filter { return &AnnotationClearer{} }, + "AnnotationGetter": func() Filter { return &AnnotationGetter{} }, + "AnnotationSetter": func() Filter { return &AnnotationSetter{} }, + "LabelSetter": func() Filter { return &LabelSetter{} }, + "ElementAppender": func() Filter { return &ElementAppender{} }, + "ElementMatcher": func() Filter { return &ElementMatcher{} }, + "FieldClearer": func() Filter { return &FieldClearer{} }, + "FilterMatcher": func() Filter { return &FilterMatcher{} }, + "FieldMatcher": func() Filter { return &FieldMatcher{} }, + "FieldSetter": func() Filter { return &FieldSetter{} }, + "PathGetter": func() Filter { return &PathGetter{} }, + "PathMatcher": func() Filter { return &PathMatcher{} }, + "Parser": func() Filter { return &Parser{} }, + "PrefixSetter": func() Filter { return &PrefixSetter{} }, + "ValueReplacer": func() Filter { return &ValueReplacer{} }, + "SuffixSetter": func() Filter { return &SuffixSetter{} }, + "TeePiper": func() Filter { return &TeePiper{} }, +} + +// YFilter wraps the Filter interface so the filter can be represented as +// data and can be unmarshalled into a struct from a yaml config file. +// This allows Pipelines to be expressed as data rather than code. +type YFilter struct { + Filter +} + +func (y YFilter) MarshalYAML() (interface{}, error) { + return y.Filter, nil +} + +func (y *YFilter) UnmarshalYAML(unmarshal func(interface{}) error) error { + meta := &ResourceMeta{} + if err := unmarshal(meta); err != nil { + return err + } + filter, found := Filters[meta.Kind] + if !found { + var knownFilters []string + for k := range Filters { + knownFilters = append(knownFilters, k) + } + sort.Strings(knownFilters) + return fmt.Errorf("unsupported Filter Kind %s: may be one of: [%s]", + meta.Kind, strings.Join(knownFilters, ",")) + } + y.Filter = filter() + + if err := unmarshal(y.Filter); err != nil { + return err + } + return nil +} + +type YFilters []YFilter + +func (y YFilters) Filters() []Filter { + var f []Filter + for i := range y { + f = append(f, y[i].Filter) + } + return f +} + +type FilterMatcher struct { + Kind string `yaml:"kind"` + + // Filters are the set of Filters run by TeePiper. + Filters YFilters `yaml:"pipeline,omitempty"` +} + +func (t FilterMatcher) Filter(rn *RNode) (*RNode, error) { + v, err := rn.Pipe(t.Filters.Filters()...) + if v == nil || err != nil { + return nil, err + } + // return the original input if the pipeline resolves to true + return rn, err +} + +type ValueReplacer struct { + Kind string `yaml:"kind"` + + StringMatch string `yaml:"stringMatch"` + RegexMatch string `yaml:"regexMatch"` + Replace string `yaml:"replace"` + Count int `yaml:"count"` +} + +func (s ValueReplacer) Filter(object *RNode) (*RNode, error) { + if s.Count == 0 { + s.Count = -1 + } + switch { + case s.StringMatch != "": + object.value.Value = strings.Replace(object.value.Value, s.StringMatch, s.Replace, s.Count) + case s.RegexMatch != "": + r, err := regexp.Compile(s.RegexMatch) + if err != nil { + return nil, fmt.Errorf("ValueReplacer RegexMatch does not compile: %v", err) + } + object.value.Value = r.ReplaceAllString(object.value.Value, s.Replace) + default: + return nil, fmt.Errorf("ValueReplacer missing StringMatch and RegexMatch") + } + return object, nil +} + +type PrefixSetter struct { + Kind string `yaml:"kind"` + + Value string `yaml:"value"` +} + +func (s PrefixSetter) Filter(object *RNode) (*RNode, error) { + if !strings.HasPrefix(object.value.Value, s.Value) { + object.value.Value = s.Value + object.value.Value + } + return object, nil +} + +type SuffixSetter struct { + Kind string `yaml:"kind"` + + Value string `yaml:"value"` +} + +func (s SuffixSetter) Filter(object *RNode) (*RNode, error) { + if !strings.HasSuffix(object.value.Value, s.Value) { + object.value.Value += s.Value + } + return object, nil +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/yaml/fns.go b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/fns.go new file mode 100644 index 000000000000..ab01b98159ac --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/fns.go @@ -0,0 +1,769 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package yaml + +import ( + "fmt" + "regexp" + "strconv" + "strings" + + "github.com/davecgh/go-spew/spew" + "gopkg.in/yaml.v3" + "sigs.k8s.io/kustomize/kyaml/errors" +) + +// Append creates an ElementAppender +func Append(elements ...*yaml.Node) ElementAppender { + return ElementAppender{Elements: elements} +} + +// ElementAppender adds all element to a SequenceNode's Content. +// Returns Elements[0] if len(Elements) == 1, otherwise returns nil. +type ElementAppender struct { + Kind string `yaml:"kind,omitempty"` + + // Elem is the value to append. + Elements []*yaml.Node `yaml:"elements,omitempty"` +} + +func (a ElementAppender) Filter(rn *RNode) (*RNode, error) { + if err := ErrorIfInvalid(rn, yaml.SequenceNode); err != nil { + return nil, err + } + for i := range a.Elements { + rn.YNode().Content = append(rn.Content(), a.Elements[i]) + } + if len(a.Elements) == 1 { + return NewRNode(a.Elements[0]), nil + } + return nil, nil +} + +// ElementSetter sets the value for an Element in an associative list. +// ElementSetter will append, replace or delete an element in an associative list. +// To append, user a key-value pair that doesn't exist in the sequence. this +// behavior is intended to handle the case that not matching element found. It's +// not designed for this purpose. To append an element, please use ElementAppender. +// To replace, set the key-value pair and a non-nil Element. +// To delete, set the key-value pair and leave the Element as nil. +// Every key must have a corresponding value. +type ElementSetter struct { + Kind string `yaml:"kind,omitempty"` + + // Element is the new value to set -- remove the existing element if nil + Element *Node + + // Key is a list of fields on the elements. It is used to find matching elements to + // update / delete + Keys []string + + // Value is a list of field values on the elements corresponding to the keys. It is + // used to find matching elements to update / delete. + Values []string +} + +// isMappingNode returns whether node is a mapping node +func (e ElementSetter) isMappingNode(node *RNode) bool { + return ErrorIfInvalid(node, yaml.MappingNode) == nil +} + +// isMappingSetter returns is this setter intended to set a mapping node +func (e ElementSetter) isMappingSetter() bool { + return len(e.Keys) > 0 && e.Keys[0] != "" && + len(e.Values) > 0 && e.Values[0] != "" +} + +func (e ElementSetter) Filter(rn *RNode) (*RNode, error) { + if len(e.Keys) == 0 { + e.Keys = append(e.Keys, "") + } + + if err := ErrorIfInvalid(rn, SequenceNode); err != nil { + return nil, err + } + + // build the new Content slice + var newContent []*yaml.Node + matchingElementFound := false + for i := range rn.YNode().Content { + elem := rn.Content()[i] + newNode := NewRNode(elem) + + // empty elements are not valid -- they at least need an associative key + if IsMissingOrNull(newNode) || IsEmptyMap(newNode) { + continue + } + // keep non-mapping node in the Content when we want to match a mapping. + if !e.isMappingNode(newNode) && e.isMappingSetter() { + newContent = append(newContent, elem) + continue + } + + // check if this is the element we are matching + var val *RNode + var err error + found := true + for j := range e.Keys { + if j < len(e.Values) { + val, err = newNode.Pipe(FieldMatcher{Name: e.Keys[j], StringValue: e.Values[j]}) + } + if err != nil { + return nil, err + } + if val == nil { + found = false + break + } + } + if !found { + // not the element we are looking for, keep it in the Content + if len(e.Values) > 0 { + newContent = append(newContent, elem) + } + continue + } + matchingElementFound = true + + // deletion operation -- remove the element from the new Content + if e.Element == nil { + continue + } + // replace operation -- replace the element in the Content + newContent = append(newContent, e.Element) + } + rn.YNode().Content = newContent + + // deletion operation -- return nil + if IsMissingOrNull(NewRNode(e.Element)) { + return nil, nil + } + + // append operation -- add the element to the Content + if !matchingElementFound { + rn.YNode().Content = append(rn.YNode().Content, e.Element) + } + + return NewRNode(e.Element), nil +} + +// GetElementByIndex will return a Filter which can be applied to a sequence +// node to get the element specified by the index +func GetElementByIndex(index int) ElementIndexer { + return ElementIndexer{Index: index} +} + +// ElementIndexer picks the element with a specified index. Index starts from +// 0 to len(list) - 1. a hyphen ("-") means the last index. +type ElementIndexer struct { + Index int +} + +// Filter implements Filter +func (i ElementIndexer) Filter(rn *RNode) (*RNode, error) { + // rn.Elements will return error if rn is not a sequence node. + elems, err := rn.Elements() + if err != nil { + return nil, err + } + if i.Index < 0 { + return elems[len(elems)-1], nil + } + if i.Index >= len(elems) { + return nil, nil + } + return elems[i.Index], nil +} + +// Clear returns a FieldClearer +func Clear(name string) FieldClearer { + return FieldClearer{Name: name} +} + +// FieldClearer removes the field or map key. +// Returns a RNode with the removed field or map entry. +type FieldClearer struct { + Kind string `yaml:"kind,omitempty"` + + // Name is the name of the field or key in the map. + Name string `yaml:"name,omitempty"` + + IfEmpty bool `yaml:"ifEmpty,omitempty"` +} + +func (c FieldClearer) Filter(rn *RNode) (*RNode, error) { + if err := ErrorIfInvalid(rn, yaml.MappingNode); err != nil { + return nil, err + } + + for i := 0; i < len(rn.Content()); i += 2 { + // if name matches, remove these 2 elements from the list because + // they are treated as a fieldName/fieldValue pair. + if rn.Content()[i].Value == c.Name { + if c.IfEmpty { + if len(rn.Content()[i+1].Content) > 0 { + continue + } + } + + // save the item we are about to remove + removed := NewRNode(rn.Content()[i+1]) + if len(rn.YNode().Content) > i+2 { + l := len(rn.YNode().Content) + // remove from the middle of the list + rn.YNode().Content = rn.Content()[:i] + rn.YNode().Content = append( + rn.YNode().Content, + rn.Content()[i+2:l]...) + } else { + // remove from the end of the list + rn.YNode().Content = rn.Content()[:i] + } + + // return the removed field name and value + return removed, nil + } + } + // nothing removed + return nil, nil +} + +func MatchElement(field, value string) ElementMatcher { + return ElementMatcher{Keys: []string{field}, Values: []string{value}} +} + +func MatchElementList(keys []string, values []string) ElementMatcher { + return ElementMatcher{Keys: keys, Values: values} +} + +func GetElementByKey(key string) ElementMatcher { + return ElementMatcher{Keys: []string{key}, MatchAnyValue: true} +} + +// ElementMatcher returns the first element from a Sequence matching the +// specified key-value pairs. If there's no match, and no configuration error, +// the matcher returns nil, nil. +type ElementMatcher struct { + Kind string `yaml:"kind,omitempty"` + + // Keys are the list of fields upon which to match this element. + Keys []string + + // Values are the list of values upon which to match this element. + Values []string + + // Create will create the Element if it is not found + Create *RNode `yaml:"create,omitempty"` + + // MatchAnyValue indicates that matcher should only consider the key and ignore + // the actual value in the list. Values must be empty when MatchAnyValue is + // set to true. + MatchAnyValue bool `yaml:"noValue,omitempty"` +} + +func (e ElementMatcher) Filter(rn *RNode) (*RNode, error) { + if len(e.Keys) == 0 { + e.Keys = append(e.Keys, "") + } + if len(e.Values) == 0 { + e.Values = append(e.Values, "") + } + + if err := ErrorIfInvalid(rn, yaml.SequenceNode); err != nil { + return nil, err + } + if e.MatchAnyValue && len(e.Values) != 0 && e.Values[0] != "" { + return nil, fmt.Errorf("Values must be empty when MatchAnyValue is set to true") + } + + // SequenceNode Content is a slice of ScalarNodes. Each ScalarNode has a + // YNode containing the primitive data. + if len(e.Keys) == 0 || len(e.Keys[0]) == 0 { + for i := range rn.Content() { + if rn.Content()[i].Value == e.Values[0] { + return &RNode{value: rn.Content()[i]}, nil + } + } + if e.Create != nil { + return rn.Pipe(Append(e.Create.YNode())) + } + return nil, nil + } + + // SequenceNode Content is a slice of MappingNodes. Each MappingNode has Content + // with a slice of key-value pairs containing the fields. + for i := range rn.Content() { + // cast the entry to a RNode so we can operate on it + elem := NewRNode(rn.Content()[i]) + var field *RNode + var err error + + // only check mapping node + if err = ErrorIfInvalid(elem, yaml.MappingNode); err != nil { + continue + } + + if !e.MatchAnyValue && len(e.Keys) != len(e.Values) { + return nil, fmt.Errorf("length of keys must equal length of values when MatchAnyValue is false") + } + + matchesElement := true + for i := range e.Keys { + if e.MatchAnyValue { + field, err = elem.Pipe(Get(e.Keys[i])) + } else { + field, err = elem.Pipe(MatchField(e.Keys[i], e.Values[i])) + } + if !IsFoundOrError(field, err) { + // this is not the element we are looking for + matchesElement = false + break + } + } + if matchesElement { + return elem, err + } + } + + // create the element + if e.Create != nil { + return rn.Pipe(Append(e.Create.YNode())) + } + + return nil, nil +} + +func Get(name string) FieldMatcher { + return FieldMatcher{Name: name} +} + +func MatchField(name, value string) FieldMatcher { + return FieldMatcher{Name: name, Value: NewScalarRNode(value)} +} + +func Match(value string) FieldMatcher { + return FieldMatcher{Value: NewScalarRNode(value)} +} + +// FieldMatcher returns the value of a named field or map entry. +type FieldMatcher struct { + Kind string `yaml:"kind,omitempty"` + + // Name of the field to return + Name string `yaml:"name,omitempty"` + + // YNode of the field to return. + // Optional. Will only need to match field name if unset. + Value *RNode `yaml:"value,omitempty"` + + StringValue string `yaml:"stringValue,omitempty"` + + StringRegexValue string `yaml:"stringRegexValue,omitempty"` + + // Create will cause the field to be created with this value + // if it is set. + Create *RNode `yaml:"create,omitempty"` +} + +func (f FieldMatcher) Filter(rn *RNode) (*RNode, error) { + if f.StringValue != "" && f.Value == nil { + f.Value = NewScalarRNode(f.StringValue) + } + + // never match nil or null fields + if IsMissingOrNull(rn) { + return nil, nil + } + + if f.Name == "" { + if err := ErrorIfInvalid(rn, yaml.ScalarNode); err != nil { + return nil, err + } + switch { + case f.StringRegexValue != "": + // TODO(pwittrock): pre-compile this when unmarshalling and cache to a field + rg, err := regexp.Compile(f.StringRegexValue) + if err != nil { + return nil, err + } + if match := rg.MatchString(rn.value.Value); match { + return rn, nil + } + return nil, nil + case GetValue(rn) == GetValue(f.Value): + return rn, nil + default: + return nil, nil + } + } + + if err := ErrorIfInvalid(rn, yaml.MappingNode); err != nil { + return nil, err + } + + for i := 0; i < len(rn.Content()); i = IncrementFieldIndex(i) { + isMatchingField := rn.Content()[i].Value == f.Name + if isMatchingField { + requireMatchFieldValue := f.Value != nil + if !requireMatchFieldValue || rn.Content()[i+1].Value == f.Value.YNode().Value { + return NewRNode(rn.Content()[i+1]), nil + } + } + } + + if f.Create != nil { + return rn.Pipe(SetField(f.Name, f.Create)) + } + + return nil, nil +} + +// Lookup returns a PathGetter to lookup a field by its path. +func Lookup(path ...string) PathGetter { + return PathGetter{Path: path} +} + +// Lookup returns a PathGetter to lookup a field by its path and create it if it doesn't already +// exist. +func LookupCreate(kind yaml.Kind, path ...string) PathGetter { + return PathGetter{Path: path, Create: kind} +} + +// PathGetter returns the RNode under Path. +type PathGetter struct { + Kind string `yaml:"kind,omitempty"` + + // Path is a slice of parts leading to the RNode to lookup. + // Each path part may be one of: + // * FieldMatcher -- e.g. "spec" + // * Map Key -- e.g. "app.k8s.io/version" + // * List Entry -- e.g. "[name=nginx]" or "[=-jar]" or "0" or "-" + // + // Map Keys and Fields are equivalent. + // See FieldMatcher for more on Fields and Map Keys. + // + // List Entries can be specified as map entry to match [fieldName=fieldValue] + // or a positional index like 0 to get the element. - (unquoted hyphen) is + // special and means the last element. + // + // See Elem for more on List Entries. + // + // Examples: + // * spec.template.spec.container with matching name: [name=nginx] + // * spec.template.spec.container.argument matching a value: [=-jar] + Path []string `yaml:"path,omitempty"` + + // Create will cause missing path parts to be created as they are walked. + // + // * The leaf Node (final path) will be created with a Kind matching Create + // * Intermediary Nodes will be created as either a MappingNodes or + // SequenceNodes as appropriate for each's Path location. + // * If a list item is specified by a index (an offset or "-"), this item will + // not be created even Create is set. + Create yaml.Kind `yaml:"create,omitempty"` + + // Style is the style to apply to created value Nodes. + // Created key Nodes keep an unspecified Style. + Style yaml.Style `yaml:"style,omitempty"` +} + +func (l PathGetter) Filter(rn *RNode) (*RNode, error) { + var err error + fieldPath := append([]string{}, rn.FieldPath()...) + match := rn + + // iterate over path until encountering an error or missing value + l.Path = cleanPath(l.Path) + for i := range l.Path { + var part, nextPart string + part = l.Path[i] + if len(l.Path) > i+1 { + nextPart = l.Path[i+1] + } + var fltr Filter + fltr, err = l.getFilter(part, nextPart, &fieldPath) + if err != nil { + return nil, err + } + match, err = match.Pipe(fltr) + if IsMissingOrError(match, err) { + return nil, err + } + match.AppendToFieldPath(fieldPath...) + } + return match, nil +} + +func (l PathGetter) getFilter(part, nextPart string, fieldPath *[]string) (Filter, error) { + idx, err := strconv.Atoi(part) + switch { + case err == nil: + // part is a number + if idx < 0 { + return nil, fmt.Errorf("array index %d cannot be negative", idx) + } + return GetElementByIndex(idx), nil + case part == "-": + // part is a hyphen + return GetElementByIndex(-1), nil + case IsListIndex(part): + // part is surrounded by brackets + return l.elemFilter(part) + default: + // mapping node + *fieldPath = append(*fieldPath, part) + return l.fieldFilter(part, l.getKind(nextPart)) + } +} + +func (l PathGetter) elemFilter(part string) (Filter, error) { + var match *RNode + name, value, err := SplitIndexNameValue(part) + if err != nil { + return nil, errors.Wrap(err) + } + if !IsCreate(l.Create) { + return MatchElement(name, value), nil + } + + var elem *RNode + primitiveElement := len(name) == 0 + if primitiveElement { + // append a ScalarNode + elem = NewScalarRNode(value) + elem.YNode().Style = l.Style + match = elem + } else { + // append a MappingNode + match = NewRNode(&yaml.Node{Kind: yaml.ScalarNode, Value: value, Style: l.Style}) + elem = NewRNode(&yaml.Node{ + Kind: yaml.MappingNode, + Content: []*yaml.Node{{Kind: yaml.ScalarNode, Value: name}, match.YNode()}, + Style: l.Style, + }) + } + // Append the Node + return ElementMatcher{Keys: []string{name}, Values: []string{value}, Create: elem}, nil +} + +func (l PathGetter) fieldFilter( + name string, kind yaml.Kind) (Filter, error) { + if !IsCreate(l.Create) { + return Get(name), nil + } + return FieldMatcher{Name: name, Create: &RNode{value: &yaml.Node{Kind: kind, Style: l.Style}}}, nil +} + +func (l PathGetter) getKind(nextPart string) yaml.Kind { + if IsListIndex(nextPart) { + // if nextPart is of the form [a=b], then it is an index into a Sequence + // so the current part must be a SequenceNode + return yaml.SequenceNode + } + if nextPart == "" { + // final name in the path, use the l.Create defined Kind + return l.Create + } + + // non-sequence intermediate Node + return yaml.MappingNode +} + +func SetField(name string, value *RNode) FieldSetter { + return FieldSetter{Name: name, Value: value} +} + +func Set(value *RNode) FieldSetter { + return FieldSetter{Value: value} +} + +// FieldSetter sets a field or map entry to a value. +type FieldSetter struct { + Kind string `yaml:"kind,omitempty"` + + // Name is the name of the field or key to lookup in a MappingNode. + // If Name is unspecified, and the input is a ScalarNode, FieldSetter will set the + // value on the ScalarNode. + Name string `yaml:"name,omitempty"` + + // Comments for the field + Comments Comments `yaml:"comments,omitempty"` + + // Value is the value to set. + // Optional if Kind is set. + Value *RNode `yaml:"value,omitempty"` + + StringValue string `yaml:"stringValue,omitempty"` + + // OverrideStyle can be set to override the style of the existing node + // when setting it. Otherwise, if an existing node is found, the style is + // retained. + OverrideStyle bool `yaml:"overrideStyle,omitempty"` +} + +func (s FieldSetter) Filter(rn *RNode) (*RNode, error) { + if s.StringValue != "" && s.Value == nil { + s.Value = NewScalarRNode(s.StringValue) + } + + if s.Name == "" { + if err := ErrorIfInvalid(rn, yaml.ScalarNode); err != nil { + return rn, err + } + if IsMissingOrNull(s.Value) { + return rn, nil + } + // only apply the style if there is not an existing style + // or we want to override it + if !s.OverrideStyle || s.Value.YNode().Style == 0 { + // keep the original style if it exists + s.Value.YNode().Style = rn.YNode().Style + } + rn.SetYNode(s.Value.YNode()) + return rn, nil + } + + // Clear the field if it is empty, or explicitly null + if s.Value == nil || s.Value.IsTaggedNull() { + return rn.Pipe(Clear(s.Name)) + } + + field, err := rn.Pipe(FieldMatcher{Name: s.Name}) + if err != nil { + return nil, err + } + if field != nil { + // only apply the style if there is not an existing style + // or we want to override it + if !s.OverrideStyle || field.YNode().Style == 0 { + // keep the original style if it exists + s.Value.YNode().Style = field.YNode().Style + } + // need to def ref the Node since field is ephemeral + field.SetYNode(s.Value.YNode()) + return field, nil + } + + // create the field + rn.YNode().Content = append( + rn.YNode().Content, + &yaml.Node{ + Kind: yaml.ScalarNode, + Value: s.Name, + HeadComment: s.Comments.HeadComment, + LineComment: s.Comments.LineComment, + FootComment: s.Comments.FootComment, + }, + s.Value.YNode()) + return s.Value, nil +} + +// Tee calls the provided Filters, and returns its argument rather than the result +// of the filters. +// May be used to fork sub-filters from a call. +// e.g. locate field, set value; locate another field, set another value +func Tee(filters ...Filter) Filter { + return TeePiper{Filters: filters} +} + +// TeePiper Calls a slice of Filters and returns its input. +// May be used to fork sub-filters from a call. +// e.g. locate field, set value; locate another field, set another value +type TeePiper struct { + Kind string `yaml:"kind,omitempty"` + + // Filters are the set of Filters run by TeePiper. + Filters []Filter `yaml:"filters,omitempty"` +} + +func (t TeePiper) Filter(rn *RNode) (*RNode, error) { + _, err := rn.Pipe(t.Filters...) + return rn, err +} + +// IsCreate returns true if kind is specified +func IsCreate(kind yaml.Kind) bool { + return kind != 0 +} + +// IsMissingOrError returns true if rn is NOT found or err is non-nil +func IsMissingOrError(rn *RNode, err error) bool { + return rn == nil || err != nil +} + +// IsFoundOrError returns true if rn is found or err is non-nil +func IsFoundOrError(rn *RNode, err error) bool { + return rn != nil || err != nil +} + +func ErrorIfAnyInvalidAndNonNull(kind yaml.Kind, rn ...*RNode) error { + for i := range rn { + if IsMissingOrNull(rn[i]) { + continue + } + if err := ErrorIfInvalid(rn[i], kind); err != nil { + return err + } + } + return nil +} + +var nodeTypeIndex = map[yaml.Kind]string{ + yaml.SequenceNode: "SequenceNode", + yaml.MappingNode: "MappingNode", + yaml.ScalarNode: "ScalarNode", + yaml.DocumentNode: "DocumentNode", + yaml.AliasNode: "AliasNode", +} + +func ErrorIfInvalid(rn *RNode, kind yaml.Kind) error { + if IsMissingOrNull(rn) { + // node has no type, pass validation + return nil + } + + if rn.YNode().Kind != kind { + s, _ := rn.String() + return errors.Errorf( + "wrong Node Kind for %s expected: %v was %v: value: {%s}", + strings.Join(rn.FieldPath(), "."), + nodeTypeIndex[kind], nodeTypeIndex[rn.YNode().Kind], strings.TrimSpace(s)) + } + + if kind == yaml.MappingNode { + if len(rn.YNode().Content)%2 != 0 { + return errors.Errorf( + "yaml MappingNodes must have even length contents: %v", spew.Sdump(rn)) + } + } + + return nil +} + +// IsListIndex returns true if p is an index into a Val. +// e.g. [fieldName=fieldValue] +// e.g. [=primitiveValue] +func IsListIndex(p string) bool { + return strings.HasPrefix(p, "[") && strings.HasSuffix(p, "]") +} + +// SplitIndexNameValue splits a lookup part Val index into the field name +// and field value to match. +// e.g. splits [name=nginx] into (name, nginx) +// e.g. splits [=-jar] into ("", -jar) +func SplitIndexNameValue(p string) (string, string, error) { + elem := strings.TrimSuffix(p, "]") + elem = strings.TrimPrefix(elem, "[") + parts := strings.SplitN(elem, "=", 2) + if len(parts) == 1 { + return "", "", fmt.Errorf("list path element must contain fieldName=fieldValue for element to match") + } + return parts[0], parts[1], nil +} + +// IncrementFieldIndex increments i to point to the next field name element in +// a slice of Contents. +func IncrementFieldIndex(i int) int { + return i + 2 +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/labels/copied.deepcopy.go b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/labels/copied.deepcopy.go new file mode 100644 index 000000000000..e526152daaa6 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/labels/copied.deepcopy.go @@ -0,0 +1,43 @@ +// Code generated by k8scopy from k8s.io/apimachinery@v0.19.8; DO NOT EDIT. +// File content copied from k8s.io/apimachinery@v0.19.8/pkg/labels/zz_generated.deepcopy.go + +// +build !ignore_autogenerated + +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package labels + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Requirement) DeepCopyInto(out *Requirement) { + *out = *in + if in.strValues != nil { + in, out := &in.strValues, &out.strValues + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Requirement. +func (in *Requirement) DeepCopy() *Requirement { + if in == nil { + return nil + } + out := new(Requirement) + in.DeepCopyInto(out) + return out +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/labels/labels.go b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/labels/labels.go new file mode 100644 index 000000000000..300014eac036 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/labels/labels.go @@ -0,0 +1,192 @@ +// Code generated by k8scopy from k8s.io/apimachinery@v0.19.8; DO NOT EDIT. +// File content copied from k8s.io/apimachinery@v0.19.8/pkg/labels/labels.go + +/* +Copyright 2014 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package labels + +import ( + "fmt" + "sort" + "strings" +) + +// Labels allows you to present labels independently from their storage. +type Labels interface { + // Has returns whether the provided label exists. + Has(label string) (exists bool) + + // Get returns the value for the provided label. + Get(label string) (value string) +} + +// Set is a map of label:value. It implements Labels. +type Set map[string]string + +// String returns all labels listed as a human readable string. +// Conveniently, exactly the format that ParseSelector takes. +func (ls Set) String() string { + selector := make([]string, 0, len(ls)) + for key, value := range ls { + selector = append(selector, key+"="+value) + } + // Sort for determinism. + sort.StringSlice(selector).Sort() + return strings.Join(selector, ",") +} + +// Has returns whether the provided label exists in the map. +func (ls Set) Has(label string) bool { + _, exists := ls[label] + return exists +} + +// Get returns the value in the map for the provided label. +func (ls Set) Get(label string) string { + return ls[label] +} + +// AsSelector converts labels into a selectors. It does not +// perform any validation, which means the server will reject +// the request if the Set contains invalid values. +func (ls Set) AsSelector() Selector { + return SelectorFromSet(ls) +} + +// AsValidatedSelector converts labels into a selectors. +// The Set is validated client-side, which allows to catch errors early. +func (ls Set) AsValidatedSelector() (Selector, error) { + return ValidatedSelectorFromSet(ls) +} + +// AsSelectorPreValidated converts labels into a selector, but +// assumes that labels are already validated and thus doesn't +// perform any validation. +// According to our measurements this is significantly faster +// in codepaths that matter at high scale. +func (ls Set) AsSelectorPreValidated() Selector { + return SelectorFromValidatedSet(ls) +} + +// FormatLabels convert label map into plain string +func FormatLabels(labelMap map[string]string) string { + l := Set(labelMap).String() + if l == "" { + l = "" + } + return l +} + +// Conflicts takes 2 maps and returns true if there a key match between +// the maps but the value doesn't match, and returns false in other cases +func Conflicts(labels1, labels2 Set) bool { + small := labels1 + big := labels2 + if len(labels2) < len(labels1) { + small = labels2 + big = labels1 + } + + for k, v := range small { + if val, match := big[k]; match { + if val != v { + return true + } + } + } + + return false +} + +// Merge combines given maps, and does not check for any conflicts +// between the maps. In case of conflicts, second map (labels2) wins +func Merge(labels1, labels2 Set) Set { + mergedMap := Set{} + + for k, v := range labels1 { + mergedMap[k] = v + } + for k, v := range labels2 { + mergedMap[k] = v + } + return mergedMap +} + +// Equals returns true if the given maps are equal +func Equals(labels1, labels2 Set) bool { + if len(labels1) != len(labels2) { + return false + } + + for k, v := range labels1 { + value, ok := labels2[k] + if !ok { + return false + } + if value != v { + return false + } + } + return true +} + +// AreLabelsInWhiteList verifies if the provided label list +// is in the provided whitelist and returns true, otherwise false. +func AreLabelsInWhiteList(labels, whitelist Set) bool { + if len(whitelist) == 0 { + return true + } + + for k, v := range labels { + value, ok := whitelist[k] + if !ok { + return false + } + if value != v { + return false + } + } + return true +} + +// ConvertSelectorToLabelsMap converts selector string to labels map +// and validates keys and values +func ConvertSelectorToLabelsMap(selector string) (Set, error) { + labelsMap := Set{} + + if len(selector) == 0 { + return labelsMap, nil + } + + labels := strings.Split(selector, ",") + for _, label := range labels { + l := strings.Split(label, "=") + if len(l) != 2 { + return labelsMap, fmt.Errorf("invalid selector: %s", l) + } + key := strings.TrimSpace(l[0]) + if err := validateLabelKey(key); err != nil { + return labelsMap, err + } + value := strings.TrimSpace(l[1]) + if err := validateLabelValue(key, value); err != nil { + return labelsMap, err + } + labelsMap[key] = value + } + return labelsMap, nil +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/labels/selector.go b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/labels/selector.go new file mode 100644 index 000000000000..73c5ae6a65a1 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/labels/selector.go @@ -0,0 +1,925 @@ +// Code generated by k8scopy from k8s.io/apimachinery@v0.19.8; DO NOT EDIT. +// File content copied from k8s.io/apimachinery@v0.19.8/pkg/labels/selector.go + +/* +Copyright 2014 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package labels + +import ( + "bytes" + "fmt" + "sort" + "strconv" + "strings" + + "log" + "sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/selection" + "sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/util/sets" + "sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/util/validation" +) + +// Requirements is AND of all requirements. +type Requirements []Requirement + +// Selector represents a label selector. +type Selector interface { + // Matches returns true if this selector matches the given set of labels. + Matches(Labels) bool + + // Empty returns true if this selector does not restrict the selection space. + Empty() bool + + // String returns a human readable string that represents this selector. + String() string + + // Add adds requirements to the Selector + Add(r ...Requirement) Selector + + // Requirements converts this interface into Requirements to expose + // more detailed selection information. + // If there are querying parameters, it will return converted requirements and selectable=true. + // If this selector doesn't want to select anything, it will return selectable=false. + Requirements() (requirements Requirements, selectable bool) + + // Make a deep copy of the selector. + DeepCopySelector() Selector + + // RequiresExactMatch allows a caller to introspect whether a given selector + // requires a single specific label to be set, and if so returns the value it + // requires. + RequiresExactMatch(label string) (value string, found bool) +} + +// Everything returns a selector that matches all labels. +func Everything() Selector { + return internalSelector{} +} + +type nothingSelector struct{} + +func (n nothingSelector) Matches(_ Labels) bool { return false } +func (n nothingSelector) Empty() bool { return false } +func (n nothingSelector) String() string { return "" } +func (n nothingSelector) Add(_ ...Requirement) Selector { return n } +func (n nothingSelector) Requirements() (Requirements, bool) { return nil, false } +func (n nothingSelector) DeepCopySelector() Selector { return n } +func (n nothingSelector) RequiresExactMatch(label string) (value string, found bool) { + return "", false +} + +// Nothing returns a selector that matches no labels +func Nothing() Selector { + return nothingSelector{} +} + +// NewSelector returns a nil selector +func NewSelector() Selector { + return internalSelector(nil) +} + +type internalSelector []Requirement + +func (s internalSelector) DeepCopy() internalSelector { + if s == nil { + return nil + } + result := make([]Requirement, len(s)) + for i := range s { + s[i].DeepCopyInto(&result[i]) + } + return result +} + +func (s internalSelector) DeepCopySelector() Selector { + return s.DeepCopy() +} + +// ByKey sorts requirements by key to obtain deterministic parser +type ByKey []Requirement + +func (a ByKey) Len() int { return len(a) } + +func (a ByKey) Swap(i, j int) { a[i], a[j] = a[j], a[i] } + +func (a ByKey) Less(i, j int) bool { return a[i].key < a[j].key } + +// Requirement contains values, a key, and an operator that relates the key and values. +// The zero value of Requirement is invalid. +// Requirement implements both set based match and exact match +// Requirement should be initialized via NewRequirement constructor for creating a valid Requirement. +type Requirement struct { + key string + operator selection.Operator + // In huge majority of cases we have at most one value here. + // It is generally faster to operate on a single-element slice + // than on a single-element map, so we have a slice here. + strValues []string +} + +// NewRequirement is the constructor for a Requirement. +// If any of these rules is violated, an error is returned: +// (1) The operator can only be In, NotIn, Equals, DoubleEquals, NotEquals, Exists, or DoesNotExist. +// (2) If the operator is In or NotIn, the values set must be non-empty. +// (3) If the operator is Equals, DoubleEquals, or NotEquals, the values set must contain one value. +// (4) If the operator is Exists or DoesNotExist, the value set must be empty. +// (5) If the operator is Gt or Lt, the values set must contain only one value, which will be interpreted as an integer. +// (6) The key is invalid due to its length, or sequence +// of characters. See validateLabelKey for more details. +// +// The empty string is a valid value in the input values set. +func NewRequirement(key string, op selection.Operator, vals []string) (*Requirement, error) { + if err := validateLabelKey(key); err != nil { + return nil, err + } + switch op { + case selection.In, selection.NotIn: + if len(vals) == 0 { + return nil, fmt.Errorf("for 'in', 'notin' operators, values set can't be empty") + } + case selection.Equals, selection.DoubleEquals, selection.NotEquals: + if len(vals) != 1 { + return nil, fmt.Errorf("exact-match compatibility requires one single value") + } + case selection.Exists, selection.DoesNotExist: + if len(vals) != 0 { + return nil, fmt.Errorf("values set must be empty for exists and does not exist") + } + case selection.GreaterThan, selection.LessThan: + if len(vals) != 1 { + return nil, fmt.Errorf("for 'Gt', 'Lt' operators, exactly one value is required") + } + for i := range vals { + if _, err := strconv.ParseInt(vals[i], 10, 64); err != nil { + return nil, fmt.Errorf("for 'Gt', 'Lt' operators, the value must be an integer") + } + } + default: + return nil, fmt.Errorf("operator '%v' is not recognized", op) + } + + for i := range vals { + if err := validateLabelValue(key, vals[i]); err != nil { + return nil, err + } + } + return &Requirement{key: key, operator: op, strValues: vals}, nil +} + +func (r *Requirement) hasValue(value string) bool { + for i := range r.strValues { + if r.strValues[i] == value { + return true + } + } + return false +} + +// Matches returns true if the Requirement matches the input Labels. +// There is a match in the following cases: +// (1) The operator is Exists and Labels has the Requirement's key. +// (2) The operator is In, Labels has the Requirement's key and Labels' +// value for that key is in Requirement's value set. +// (3) The operator is NotIn, Labels has the Requirement's key and +// Labels' value for that key is not in Requirement's value set. +// (4) The operator is DoesNotExist or NotIn and Labels does not have the +// Requirement's key. +// (5) The operator is GreaterThanOperator or LessThanOperator, and Labels has +// the Requirement's key and the corresponding value satisfies mathematical inequality. +func (r *Requirement) Matches(ls Labels) bool { + switch r.operator { + case selection.In, selection.Equals, selection.DoubleEquals: + if !ls.Has(r.key) { + return false + } + return r.hasValue(ls.Get(r.key)) + case selection.NotIn, selection.NotEquals: + if !ls.Has(r.key) { + return true + } + return !r.hasValue(ls.Get(r.key)) + case selection.Exists: + return ls.Has(r.key) + case selection.DoesNotExist: + return !ls.Has(r.key) + case selection.GreaterThan, selection.LessThan: + if !ls.Has(r.key) { + return false + } + lsValue, err := strconv.ParseInt(ls.Get(r.key), 10, 64) + if err != nil { + log.Printf("ParseInt failed for value %+v in label %+v, %+v", ls.Get(r.key), ls, err) + return false + } + + // There should be only one strValue in r.strValues, and can be converted to an integer. + if len(r.strValues) != 1 { + log.Printf("Invalid values count %+v of requirement %#v, for 'Gt', 'Lt' operators, exactly one value is required", len(r.strValues), r) + return false + } + + var rValue int64 + for i := range r.strValues { + rValue, err = strconv.ParseInt(r.strValues[i], 10, 64) + if err != nil { + log.Printf("ParseInt failed for value %+v in requirement %#v, for 'Gt', 'Lt' operators, the value must be an integer", r.strValues[i], r) + return false + } + } + return (r.operator == selection.GreaterThan && lsValue > rValue) || (r.operator == selection.LessThan && lsValue < rValue) + default: + return false + } +} + +// Key returns requirement key +func (r *Requirement) Key() string { + return r.key +} + +// Operator returns requirement operator +func (r *Requirement) Operator() selection.Operator { + return r.operator +} + +// Values returns requirement values +func (r *Requirement) Values() sets.String { + ret := sets.String{} + for i := range r.strValues { + ret.Insert(r.strValues[i]) + } + return ret +} + +// Empty returns true if the internalSelector doesn't restrict selection space +func (lsel internalSelector) Empty() bool { + if lsel == nil { + return true + } + return len(lsel) == 0 +} + +// String returns a human-readable string that represents this +// Requirement. If called on an invalid Requirement, an error is +// returned. See NewRequirement for creating a valid Requirement. +func (r *Requirement) String() string { + var buffer bytes.Buffer + if r.operator == selection.DoesNotExist { + buffer.WriteString("!") + } + buffer.WriteString(r.key) + + switch r.operator { + case selection.Equals: + buffer.WriteString("=") + case selection.DoubleEquals: + buffer.WriteString("==") + case selection.NotEquals: + buffer.WriteString("!=") + case selection.In: + buffer.WriteString(" in ") + case selection.NotIn: + buffer.WriteString(" notin ") + case selection.GreaterThan: + buffer.WriteString(">") + case selection.LessThan: + buffer.WriteString("<") + case selection.Exists, selection.DoesNotExist: + return buffer.String() + } + + switch r.operator { + case selection.In, selection.NotIn: + buffer.WriteString("(") + } + if len(r.strValues) == 1 { + buffer.WriteString(r.strValues[0]) + } else { // only > 1 since == 0 prohibited by NewRequirement + // normalizes value order on output, without mutating the in-memory selector representation + // also avoids normalization when it is not required, and ensures we do not mutate shared data + buffer.WriteString(strings.Join(safeSort(r.strValues), ",")) + } + + switch r.operator { + case selection.In, selection.NotIn: + buffer.WriteString(")") + } + return buffer.String() +} + +// safeSort sort input strings without modification +func safeSort(in []string) []string { + if sort.StringsAreSorted(in) { + return in + } + out := make([]string, len(in)) + copy(out, in) + sort.Strings(out) + return out +} + +// Add adds requirements to the selector. It copies the current selector returning a new one +func (lsel internalSelector) Add(reqs ...Requirement) Selector { + var sel internalSelector + for ix := range lsel { + sel = append(sel, lsel[ix]) + } + for _, r := range reqs { + sel = append(sel, r) + } + sort.Sort(ByKey(sel)) + return sel +} + +// Matches for a internalSelector returns true if all +// its Requirements match the input Labels. If any +// Requirement does not match, false is returned. +func (lsel internalSelector) Matches(l Labels) bool { + for ix := range lsel { + if matches := lsel[ix].Matches(l); !matches { + return false + } + } + return true +} + +func (lsel internalSelector) Requirements() (Requirements, bool) { return Requirements(lsel), true } + +// String returns a comma-separated string of all +// the internalSelector Requirements' human-readable strings. +func (lsel internalSelector) String() string { + var reqs []string + for ix := range lsel { + reqs = append(reqs, lsel[ix].String()) + } + return strings.Join(reqs, ",") +} + +// RequiresExactMatch introspect whether a given selector requires a single specific field +// to be set, and if so returns the value it requires. +func (lsel internalSelector) RequiresExactMatch(label string) (value string, found bool) { + for ix := range lsel { + if lsel[ix].key == label { + switch lsel[ix].operator { + case selection.Equals, selection.DoubleEquals, selection.In: + if len(lsel[ix].strValues) == 1 { + return lsel[ix].strValues[0], true + } + } + return "", false + } + } + return "", false +} + +// Token represents constant definition for lexer token +type Token int + +const ( + // ErrorToken represents scan error + ErrorToken Token = iota + // EndOfStringToken represents end of string + EndOfStringToken + // ClosedParToken represents close parenthesis + ClosedParToken + // CommaToken represents the comma + CommaToken + // DoesNotExistToken represents logic not + DoesNotExistToken + // DoubleEqualsToken represents double equals + DoubleEqualsToken + // EqualsToken represents equal + EqualsToken + // GreaterThanToken represents greater than + GreaterThanToken + // IdentifierToken represents identifier, e.g. keys and values + IdentifierToken + // InToken represents in + InToken + // LessThanToken represents less than + LessThanToken + // NotEqualsToken represents not equal + NotEqualsToken + // NotInToken represents not in + NotInToken + // OpenParToken represents open parenthesis + OpenParToken +) + +// string2token contains the mapping between lexer Token and token literal +// (except IdentifierToken, EndOfStringToken and ErrorToken since it makes no sense) +var string2token = map[string]Token{ + ")": ClosedParToken, + ",": CommaToken, + "!": DoesNotExistToken, + "==": DoubleEqualsToken, + "=": EqualsToken, + ">": GreaterThanToken, + "in": InToken, + "<": LessThanToken, + "!=": NotEqualsToken, + "notin": NotInToken, + "(": OpenParToken, +} + +// ScannedItem contains the Token and the literal produced by the lexer. +type ScannedItem struct { + tok Token + literal string +} + +// isWhitespace returns true if the rune is a space, tab, or newline. +func isWhitespace(ch byte) bool { + return ch == ' ' || ch == '\t' || ch == '\r' || ch == '\n' +} + +// isSpecialSymbol detect if the character ch can be an operator +func isSpecialSymbol(ch byte) bool { + switch ch { + case '=', '!', '(', ')', ',', '>', '<': + return true + } + return false +} + +// Lexer represents the Lexer struct for label selector. +// It contains necessary informationt to tokenize the input string +type Lexer struct { + // s stores the string to be tokenized + s string + // pos is the position currently tokenized + pos int +} + +// read return the character currently lexed +// increment the position and check the buffer overflow +func (l *Lexer) read() (b byte) { + b = 0 + if l.pos < len(l.s) { + b = l.s[l.pos] + l.pos++ + } + return b +} + +// unread 'undoes' the last read character +func (l *Lexer) unread() { + l.pos-- +} + +// scanIDOrKeyword scans string to recognize literal token (for example 'in') or an identifier. +func (l *Lexer) scanIDOrKeyword() (tok Token, lit string) { + var buffer []byte +IdentifierLoop: + for { + switch ch := l.read(); { + case ch == 0: + break IdentifierLoop + case isSpecialSymbol(ch) || isWhitespace(ch): + l.unread() + break IdentifierLoop + default: + buffer = append(buffer, ch) + } + } + s := string(buffer) + if val, ok := string2token[s]; ok { // is a literal token? + return val, s + } + return IdentifierToken, s // otherwise is an identifier +} + +// scanSpecialSymbol scans string starting with special symbol. +// special symbol identify non literal operators. "!=", "==", "=" +func (l *Lexer) scanSpecialSymbol() (Token, string) { + lastScannedItem := ScannedItem{} + var buffer []byte +SpecialSymbolLoop: + for { + switch ch := l.read(); { + case ch == 0: + break SpecialSymbolLoop + case isSpecialSymbol(ch): + buffer = append(buffer, ch) + if token, ok := string2token[string(buffer)]; ok { + lastScannedItem = ScannedItem{tok: token, literal: string(buffer)} + } else if lastScannedItem.tok != 0 { + l.unread() + break SpecialSymbolLoop + } + default: + l.unread() + break SpecialSymbolLoop + } + } + if lastScannedItem.tok == 0 { + return ErrorToken, fmt.Sprintf("error expected: keyword found '%s'", buffer) + } + return lastScannedItem.tok, lastScannedItem.literal +} + +// skipWhiteSpaces consumes all blank characters +// returning the first non blank character +func (l *Lexer) skipWhiteSpaces(ch byte) byte { + for { + if !isWhitespace(ch) { + return ch + } + ch = l.read() + } +} + +// Lex returns a pair of Token and the literal +// literal is meaningfull only for IdentifierToken token +func (l *Lexer) Lex() (tok Token, lit string) { + switch ch := l.skipWhiteSpaces(l.read()); { + case ch == 0: + return EndOfStringToken, "" + case isSpecialSymbol(ch): + l.unread() + return l.scanSpecialSymbol() + default: + l.unread() + return l.scanIDOrKeyword() + } +} + +// Parser data structure contains the label selector parser data structure +type Parser struct { + l *Lexer + scannedItems []ScannedItem + position int +} + +// ParserContext represents context during parsing: +// some literal for example 'in' and 'notin' can be +// recognized as operator for example 'x in (a)' but +// it can be recognized as value for example 'value in (in)' +type ParserContext int + +const ( + // KeyAndOperator represents key and operator + KeyAndOperator ParserContext = iota + // Values represents values + Values +) + +// lookahead func returns the current token and string. No increment of current position +func (p *Parser) lookahead(context ParserContext) (Token, string) { + tok, lit := p.scannedItems[p.position].tok, p.scannedItems[p.position].literal + if context == Values { + switch tok { + case InToken, NotInToken: + tok = IdentifierToken + } + } + return tok, lit +} + +// consume returns current token and string. Increments the position +func (p *Parser) consume(context ParserContext) (Token, string) { + p.position++ + tok, lit := p.scannedItems[p.position-1].tok, p.scannedItems[p.position-1].literal + if context == Values { + switch tok { + case InToken, NotInToken: + tok = IdentifierToken + } + } + return tok, lit +} + +// scan runs through the input string and stores the ScannedItem in an array +// Parser can now lookahead and consume the tokens +func (p *Parser) scan() { + for { + token, literal := p.l.Lex() + p.scannedItems = append(p.scannedItems, ScannedItem{token, literal}) + if token == EndOfStringToken { + break + } + } +} + +// parse runs the left recursive descending algorithm +// on input string. It returns a list of Requirement objects. +func (p *Parser) parse() (internalSelector, error) { + p.scan() // init scannedItems + + var requirements internalSelector + for { + tok, lit := p.lookahead(Values) + switch tok { + case IdentifierToken, DoesNotExistToken: + r, err := p.parseRequirement() + if err != nil { + return nil, fmt.Errorf("unable to parse requirement: %v", err) + } + requirements = append(requirements, *r) + t, l := p.consume(Values) + switch t { + case EndOfStringToken: + return requirements, nil + case CommaToken: + t2, l2 := p.lookahead(Values) + if t2 != IdentifierToken && t2 != DoesNotExistToken { + return nil, fmt.Errorf("found '%s', expected: identifier after ','", l2) + } + default: + return nil, fmt.Errorf("found '%s', expected: ',' or 'end of string'", l) + } + case EndOfStringToken: + return requirements, nil + default: + return nil, fmt.Errorf("found '%s', expected: !, identifier, or 'end of string'", lit) + } + } +} + +func (p *Parser) parseRequirement() (*Requirement, error) { + key, operator, err := p.parseKeyAndInferOperator() + if err != nil { + return nil, err + } + if operator == selection.Exists || operator == selection.DoesNotExist { // operator found lookahead set checked + return NewRequirement(key, operator, []string{}) + } + operator, err = p.parseOperator() + if err != nil { + return nil, err + } + var values sets.String + switch operator { + case selection.In, selection.NotIn: + values, err = p.parseValues() + case selection.Equals, selection.DoubleEquals, selection.NotEquals, selection.GreaterThan, selection.LessThan: + values, err = p.parseExactValue() + } + if err != nil { + return nil, err + } + return NewRequirement(key, operator, values.List()) + +} + +// parseKeyAndInferOperator parse literals. +// in case of no operator '!, in, notin, ==, =, !=' are found +// the 'exists' operator is inferred +func (p *Parser) parseKeyAndInferOperator() (string, selection.Operator, error) { + var operator selection.Operator + tok, literal := p.consume(Values) + if tok == DoesNotExistToken { + operator = selection.DoesNotExist + tok, literal = p.consume(Values) + } + if tok != IdentifierToken { + err := fmt.Errorf("found '%s', expected: identifier", literal) + return "", "", err + } + if err := validateLabelKey(literal); err != nil { + return "", "", err + } + if t, _ := p.lookahead(Values); t == EndOfStringToken || t == CommaToken { + if operator != selection.DoesNotExist { + operator = selection.Exists + } + } + return literal, operator, nil +} + +// parseOperator return operator and eventually matchType +// matchType can be exact +func (p *Parser) parseOperator() (op selection.Operator, err error) { + tok, lit := p.consume(KeyAndOperator) + switch tok { + // DoesNotExistToken shouldn't be here because it's a unary operator, not a binary operator + case InToken: + op = selection.In + case EqualsToken: + op = selection.Equals + case DoubleEqualsToken: + op = selection.DoubleEquals + case GreaterThanToken: + op = selection.GreaterThan + case LessThanToken: + op = selection.LessThan + case NotInToken: + op = selection.NotIn + case NotEqualsToken: + op = selection.NotEquals + default: + return "", fmt.Errorf("found '%s', expected: '=', '!=', '==', 'in', notin'", lit) + } + return op, nil +} + +// parseValues parses the values for set based matching (x,y,z) +func (p *Parser) parseValues() (sets.String, error) { + tok, lit := p.consume(Values) + if tok != OpenParToken { + return nil, fmt.Errorf("found '%s' expected: '('", lit) + } + tok, lit = p.lookahead(Values) + switch tok { + case IdentifierToken, CommaToken: + s, err := p.parseIdentifiersList() // handles general cases + if err != nil { + return s, err + } + if tok, _ = p.consume(Values); tok != ClosedParToken { + return nil, fmt.Errorf("found '%s', expected: ')'", lit) + } + return s, nil + case ClosedParToken: // handles "()" + p.consume(Values) + return sets.NewString(""), nil + default: + return nil, fmt.Errorf("found '%s', expected: ',', ')' or identifier", lit) + } +} + +// parseIdentifiersList parses a (possibly empty) list of +// of comma separated (possibly empty) identifiers +func (p *Parser) parseIdentifiersList() (sets.String, error) { + s := sets.NewString() + for { + tok, lit := p.consume(Values) + switch tok { + case IdentifierToken: + s.Insert(lit) + tok2, lit2 := p.lookahead(Values) + switch tok2 { + case CommaToken: + continue + case ClosedParToken: + return s, nil + default: + return nil, fmt.Errorf("found '%s', expected: ',' or ')'", lit2) + } + case CommaToken: // handled here since we can have "(," + if s.Len() == 0 { + s.Insert("") // to handle (, + } + tok2, _ := p.lookahead(Values) + if tok2 == ClosedParToken { + s.Insert("") // to handle ,) Double "" removed by StringSet + return s, nil + } + if tok2 == CommaToken { + p.consume(Values) + s.Insert("") // to handle ,, Double "" removed by StringSet + } + default: // it can be operator + return s, fmt.Errorf("found '%s', expected: ',', or identifier", lit) + } + } +} + +// parseExactValue parses the only value for exact match style +func (p *Parser) parseExactValue() (sets.String, error) { + s := sets.NewString() + tok, lit := p.lookahead(Values) + if tok == EndOfStringToken || tok == CommaToken { + s.Insert("") + return s, nil + } + tok, lit = p.consume(Values) + if tok == IdentifierToken { + s.Insert(lit) + return s, nil + } + return nil, fmt.Errorf("found '%s', expected: identifier", lit) +} + +// Parse takes a string representing a selector and returns a selector +// object, or an error. This parsing function differs from ParseSelector +// as they parse different selectors with different syntaxes. +// The input will cause an error if it does not follow this form: +// +// ::= | "," +// ::= [!] KEY [ | ] +// ::= "" | +// ::= | +// ::= "notin" +// ::= "in" +// ::= "(" ")" +// ::= VALUE | VALUE "," +// ::= ["="|"=="|"!="] VALUE +// +// KEY is a sequence of one or more characters following [ DNS_SUBDOMAIN "/" ] DNS_LABEL. Max length is 63 characters. +// VALUE is a sequence of zero or more characters "([A-Za-z0-9_-\.])". Max length is 63 characters. +// Delimiter is white space: (' ', '\t') +// Example of valid syntax: +// "x in (foo,,baz),y,z notin ()" +// +// Note: +// (1) Inclusion - " in " - denotes that the KEY exists and is equal to any of the +// VALUEs in its requirement +// (2) Exclusion - " notin " - denotes that the KEY is not equal to any +// of the VALUEs in its requirement or does not exist +// (3) The empty string is a valid VALUE +// (4) A requirement with just a KEY - as in "y" above - denotes that +// the KEY exists and can be any VALUE. +// (5) A requirement with just !KEY requires that the KEY not exist. +// +func Parse(selector string) (Selector, error) { + parsedSelector, err := parse(selector) + if err == nil { + return parsedSelector, nil + } + return nil, err +} + +// parse parses the string representation of the selector and returns the internalSelector struct. +// The callers of this method can then decide how to return the internalSelector struct to their +// callers. This function has two callers now, one returns a Selector interface and the other +// returns a list of requirements. +func parse(selector string) (internalSelector, error) { + p := &Parser{l: &Lexer{s: selector, pos: 0}} + items, err := p.parse() + if err != nil { + return nil, err + } + sort.Sort(ByKey(items)) // sort to grant determistic parsing + return internalSelector(items), err +} + +func validateLabelKey(k string) error { + if errs := validation.IsQualifiedName(k); len(errs) != 0 { + return fmt.Errorf("invalid label key %q: %s", k, strings.Join(errs, "; ")) + } + return nil +} + +func validateLabelValue(k, v string) error { + if errs := validation.IsValidLabelValue(v); len(errs) != 0 { + return fmt.Errorf("invalid label value: %q: at key: %q: %s", v, k, strings.Join(errs, "; ")) + } + return nil +} + +// SelectorFromSet returns a Selector which will match exactly the given Set. A +// nil and empty Sets are considered equivalent to Everything(). +// It does not perform any validation, which means the server will reject +// the request if the Set contains invalid values. +func SelectorFromSet(ls Set) Selector { + return SelectorFromValidatedSet(ls) +} + +// ValidatedSelectorFromSet returns a Selector which will match exactly the given Set. A +// nil and empty Sets are considered equivalent to Everything(). +// The Set is validated client-side, which allows to catch errors early. +func ValidatedSelectorFromSet(ls Set) (Selector, error) { + if ls == nil || len(ls) == 0 { + return internalSelector{}, nil + } + requirements := make([]Requirement, 0, len(ls)) + for label, value := range ls { + r, err := NewRequirement(label, selection.Equals, []string{value}) + if err != nil { + return nil, err + } + requirements = append(requirements, *r) + } + // sort to have deterministic string representation + sort.Sort(ByKey(requirements)) + return internalSelector(requirements), nil +} + +// SelectorFromValidatedSet returns a Selector which will match exactly the given Set. +// A nil and empty Sets are considered equivalent to Everything(). +// It assumes that Set is already validated and doesn't do any validation. +func SelectorFromValidatedSet(ls Set) Selector { + if ls == nil || len(ls) == 0 { + return internalSelector{} + } + requirements := make([]Requirement, 0, len(ls)) + for label, value := range ls { + requirements = append(requirements, Requirement{key: label, operator: selection.Equals, strValues: []string{value}}) + } + // sort to have deterministic string representation + sort.Sort(ByKey(requirements)) + return internalSelector(requirements) +} + +// ParseToRequirements takes a string representing a selector and returns a list of +// requirements. This function is suitable for those callers that perform additional +// processing on selector requirements. +// See the documentation for Parse() function for more details. +// TODO: Consider exporting the internalSelector type instead. +func ParseToRequirements(selector string) ([]Requirement, error) { + return parse(selector) +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/selection/operator.go b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/selection/operator.go new file mode 100644 index 000000000000..29c443df45ea --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/selection/operator.go @@ -0,0 +1,36 @@ +// Code generated by k8scopy from k8s.io/apimachinery@v0.19.8; DO NOT EDIT. +// File content copied from k8s.io/apimachinery@v0.19.8/pkg/selection/operator.go + +/* +Copyright 2016 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package selection + +// Operator represents a key/field's relationship to value(s). +// See labels.Requirement and fields.Requirement for more details. +type Operator string + +const ( + DoesNotExist Operator = "!" + Equals Operator = "=" + DoubleEquals Operator = "==" + In Operator = "in" + NotEquals Operator = "!=" + NotIn Operator = "notin" + Exists Operator = "exists" + GreaterThan Operator = "gt" + LessThan Operator = "lt" +) diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/util/errors/errors.go b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/util/errors/errors.go new file mode 100644 index 000000000000..24d040e06c3a --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/util/errors/errors.go @@ -0,0 +1,252 @@ +// Code generated by k8scopy from k8s.io/apimachinery@v0.19.8; DO NOT EDIT. +// File content copied from k8s.io/apimachinery@v0.19.8/pkg/util/errors/errors.go + +/* +Copyright 2015 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package errors + +import ( + "errors" + "fmt" + + "sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/util/sets" +) + +// MessageCountMap contains occurrence for each error message. +type MessageCountMap map[string]int + +// Aggregate represents an object that contains multiple errors, but does not +// necessarily have singular semantic meaning. +// The aggregate can be used with `errors.Is()` to check for the occurrence of +// a specific error type. +// Errors.As() is not supported, because the caller presumably cares about a +// specific error of potentially multiple that match the given type. +type Aggregate interface { + error + Errors() []error + Is(error) bool +} + +// NewAggregate converts a slice of errors into an Aggregate interface, which +// is itself an implementation of the error interface. If the slice is empty, +// this returns nil. +// It will check if any of the element of input error list is nil, to avoid +// nil pointer panic when call Error(). +func NewAggregate(errlist []error) Aggregate { + if len(errlist) == 0 { + return nil + } + // In case of input error list contains nil + var errs []error + for _, e := range errlist { + if e != nil { + errs = append(errs, e) + } + } + if len(errs) == 0 { + return nil + } + return aggregate(errs) +} + +// This helper implements the error and Errors interfaces. Keeping it private +// prevents people from making an aggregate of 0 errors, which is not +// an error, but does satisfy the error interface. +type aggregate []error + +// Error is part of the error interface. +func (agg aggregate) Error() string { + if len(agg) == 0 { + // This should never happen, really. + return "" + } + if len(agg) == 1 { + return agg[0].Error() + } + seenerrs := sets.NewString() + result := "" + agg.visit(func(err error) bool { + msg := err.Error() + if seenerrs.Has(msg) { + return false + } + seenerrs.Insert(msg) + if len(seenerrs) > 1 { + result += ", " + } + result += msg + return false + }) + if len(seenerrs) == 1 { + return result + } + return "[" + result + "]" +} + +func (agg aggregate) Is(target error) bool { + return agg.visit(func(err error) bool { + return errors.Is(err, target) + }) +} + +func (agg aggregate) visit(f func(err error) bool) bool { + for _, err := range agg { + switch err := err.(type) { + case aggregate: + if match := err.visit(f); match { + return match + } + case Aggregate: + for _, nestedErr := range err.Errors() { + if match := f(nestedErr); match { + return match + } + } + default: + if match := f(err); match { + return match + } + } + } + + return false +} + +// Errors is part of the Aggregate interface. +func (agg aggregate) Errors() []error { + return []error(agg) +} + +// Matcher is used to match errors. Returns true if the error matches. +type Matcher func(error) bool + +// FilterOut removes all errors that match any of the matchers from the input +// error. If the input is a singular error, only that error is tested. If the +// input implements the Aggregate interface, the list of errors will be +// processed recursively. +// +// This can be used, for example, to remove known-OK errors (such as io.EOF or +// os.PathNotFound) from a list of errors. +func FilterOut(err error, fns ...Matcher) error { + if err == nil { + return nil + } + if agg, ok := err.(Aggregate); ok { + return NewAggregate(filterErrors(agg.Errors(), fns...)) + } + if !matchesError(err, fns...) { + return err + } + return nil +} + +// matchesError returns true if any Matcher returns true +func matchesError(err error, fns ...Matcher) bool { + for _, fn := range fns { + if fn(err) { + return true + } + } + return false +} + +// filterErrors returns any errors (or nested errors, if the list contains +// nested Errors) for which all fns return false. If no errors +// remain a nil list is returned. The resulting silec will have all +// nested slices flattened as a side effect. +func filterErrors(list []error, fns ...Matcher) []error { + result := []error{} + for _, err := range list { + r := FilterOut(err, fns...) + if r != nil { + result = append(result, r) + } + } + return result +} + +// Flatten takes an Aggregate, which may hold other Aggregates in arbitrary +// nesting, and flattens them all into a single Aggregate, recursively. +func Flatten(agg Aggregate) Aggregate { + result := []error{} + if agg == nil { + return nil + } + for _, err := range agg.Errors() { + if a, ok := err.(Aggregate); ok { + r := Flatten(a) + if r != nil { + result = append(result, r.Errors()...) + } + } else { + if err != nil { + result = append(result, err) + } + } + } + return NewAggregate(result) +} + +// CreateAggregateFromMessageCountMap converts MessageCountMap Aggregate +func CreateAggregateFromMessageCountMap(m MessageCountMap) Aggregate { + if m == nil { + return nil + } + result := make([]error, 0, len(m)) + for errStr, count := range m { + var countStr string + if count > 1 { + countStr = fmt.Sprintf(" (repeated %v times)", count) + } + result = append(result, fmt.Errorf("%v%v", errStr, countStr)) + } + return NewAggregate(result) +} + +// Reduce will return err or, if err is an Aggregate and only has one item, +// the first item in the aggregate. +func Reduce(err error) error { + if agg, ok := err.(Aggregate); ok && err != nil { + switch len(agg.Errors()) { + case 1: + return agg.Errors()[0] + case 0: + return nil + } + } + return err +} + +// AggregateGoroutines runs the provided functions in parallel, stuffing all +// non-nil errors into the returned Aggregate. +// Returns nil if all the functions complete successfully. +func AggregateGoroutines(funcs ...func() error) Aggregate { + errChan := make(chan error, len(funcs)) + for _, f := range funcs { + go func(f func() error) { errChan <- f() }(f) + } + errs := make([]error, 0) + for i := 0; i < cap(errChan); i++ { + if err := <-errChan; err != nil { + errs = append(errs, err) + } + } + return NewAggregate(errs) +} + +// ErrPreconditionViolated is returned when the precondition is violated +var ErrPreconditionViolated = errors.New("precondition is violated") diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/util/sets/empty.go b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/util/sets/empty.go new file mode 100644 index 000000000000..ef404add15c9 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/util/sets/empty.go @@ -0,0 +1,24 @@ +// Code generated by k8scopy from k8s.io/apimachinery@v0.19.8; DO NOT EDIT. +// File content copied from k8s.io/apimachinery@v0.19.8/pkg/util/sets/empty.go + +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package sets + +// Empty is public since it is used by some internal API objects for conversions between external +// string arrays and internal sets, and conversion logic requires public types today. +type Empty struct{} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/util/sets/string.go b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/util/sets/string.go new file mode 100644 index 000000000000..8af1bac2a236 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/util/sets/string.go @@ -0,0 +1,206 @@ +// Code generated by k8scopy from k8s.io/apimachinery@v0.19.8; DO NOT EDIT. +// File content copied from k8s.io/apimachinery@v0.19.8/pkg/util/sets/string.go + +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package sets + +import ( + "reflect" + "sort" +) + +// sets.String is a set of strings, implemented via map[string]struct{} for minimal memory consumption. +type String map[string]Empty + +// NewString creates a String from a list of values. +func NewString(items ...string) String { + ss := String{} + ss.Insert(items...) + return ss +} + +// StringKeySet creates a String from a keys of a map[string](? extends interface{}). +// If the value passed in is not actually a map, this will panic. +func StringKeySet(theMap interface{}) String { + v := reflect.ValueOf(theMap) + ret := String{} + + for _, keyValue := range v.MapKeys() { + ret.Insert(keyValue.Interface().(string)) + } + return ret +} + +// Insert adds items to the set. +func (s String) Insert(items ...string) String { + for _, item := range items { + s[item] = Empty{} + } + return s +} + +// Delete removes all items from the set. +func (s String) Delete(items ...string) String { + for _, item := range items { + delete(s, item) + } + return s +} + +// Has returns true if and only if item is contained in the set. +func (s String) Has(item string) bool { + _, contained := s[item] + return contained +} + +// HasAll returns true if and only if all items are contained in the set. +func (s String) HasAll(items ...string) bool { + for _, item := range items { + if !s.Has(item) { + return false + } + } + return true +} + +// HasAny returns true if any items are contained in the set. +func (s String) HasAny(items ...string) bool { + for _, item := range items { + if s.Has(item) { + return true + } + } + return false +} + +// Difference returns a set of objects that are not in s2 +// For example: +// s1 = {a1, a2, a3} +// s2 = {a1, a2, a4, a5} +// s1.Difference(s2) = {a3} +// s2.Difference(s1) = {a4, a5} +func (s String) Difference(s2 String) String { + result := NewString() + for key := range s { + if !s2.Has(key) { + result.Insert(key) + } + } + return result +} + +// Union returns a new set which includes items in either s1 or s2. +// For example: +// s1 = {a1, a2} +// s2 = {a3, a4} +// s1.Union(s2) = {a1, a2, a3, a4} +// s2.Union(s1) = {a1, a2, a3, a4} +func (s1 String) Union(s2 String) String { + result := NewString() + for key := range s1 { + result.Insert(key) + } + for key := range s2 { + result.Insert(key) + } + return result +} + +// Intersection returns a new set which includes the item in BOTH s1 and s2 +// For example: +// s1 = {a1, a2} +// s2 = {a2, a3} +// s1.Intersection(s2) = {a2} +func (s1 String) Intersection(s2 String) String { + var walk, other String + result := NewString() + if s1.Len() < s2.Len() { + walk = s1 + other = s2 + } else { + walk = s2 + other = s1 + } + for key := range walk { + if other.Has(key) { + result.Insert(key) + } + } + return result +} + +// IsSuperset returns true if and only if s1 is a superset of s2. +func (s1 String) IsSuperset(s2 String) bool { + for item := range s2 { + if !s1.Has(item) { + return false + } + } + return true +} + +// Equal returns true if and only if s1 is equal (as a set) to s2. +// Two sets are equal if their membership is identical. +// (In practice, this means same elements, order doesn't matter) +func (s1 String) Equal(s2 String) bool { + return len(s1) == len(s2) && s1.IsSuperset(s2) +} + +type sortableSliceOfString []string + +func (s sortableSliceOfString) Len() int { return len(s) } +func (s sortableSliceOfString) Less(i, j int) bool { return lessString(s[i], s[j]) } +func (s sortableSliceOfString) Swap(i, j int) { s[i], s[j] = s[j], s[i] } + +// List returns the contents as a sorted string slice. +func (s String) List() []string { + res := make(sortableSliceOfString, 0, len(s)) + for key := range s { + res = append(res, key) + } + sort.Sort(res) + return []string(res) +} + +// UnsortedList returns the slice with contents in random order. +func (s String) UnsortedList() []string { + res := make([]string, 0, len(s)) + for key := range s { + res = append(res, key) + } + return res +} + +// Returns a single element from the set. +func (s String) PopAny() (string, bool) { + for key := range s { + s.Delete(key) + return key, true + } + var zeroValue string + return zeroValue, false +} + +// Len returns the size of the set. +func (s String) Len() int { + return len(s) +} + +func lessString(lhs, rhs string) bool { + return lhs < rhs +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/util/validation/field/errors.go b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/util/validation/field/errors.go new file mode 100644 index 000000000000..20229a5b6cbf --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/util/validation/field/errors.go @@ -0,0 +1,275 @@ +// Code generated by k8scopy from k8s.io/apimachinery@v0.19.8; DO NOT EDIT. +// File content copied from k8s.io/apimachinery@v0.19.8/pkg/util/validation/field/errors.go + +/* +Copyright 2014 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package field + +import ( + "fmt" + "reflect" + "strconv" + "strings" + + utilerrors "sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/util/errors" + "sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/util/sets" +) + +// Error is an implementation of the 'error' interface, which represents a +// field-level validation error. +type Error struct { + Type ErrorType + Field string + BadValue interface{} + Detail string +} + +var _ error = &Error{} + +// Error implements the error interface. +func (v *Error) Error() string { + return fmt.Sprintf("%s: %s", v.Field, v.ErrorBody()) +} + +// ErrorBody returns the error message without the field name. This is useful +// for building nice-looking higher-level error reporting. +func (v *Error) ErrorBody() string { + var s string + switch v.Type { + case ErrorTypeRequired, ErrorTypeForbidden, ErrorTypeTooLong, ErrorTypeInternal: + s = v.Type.String() + default: + value := v.BadValue + valueType := reflect.TypeOf(value) + if value == nil || valueType == nil { + value = "null" + } else if valueType.Kind() == reflect.Ptr { + if reflectValue := reflect.ValueOf(value); reflectValue.IsNil() { + value = "null" + } else { + value = reflectValue.Elem().Interface() + } + } + switch t := value.(type) { + case int64, int32, float64, float32, bool: + // use simple printer for simple types + s = fmt.Sprintf("%s: %v", v.Type, value) + case string: + s = fmt.Sprintf("%s: %q", v.Type, t) + case fmt.Stringer: + // anything that defines String() is better than raw struct + s = fmt.Sprintf("%s: %s", v.Type, t.String()) + default: + // fallback to raw struct + // TODO: internal types have panic guards against json.Marshalling to prevent + // accidental use of internal types in external serialized form. For now, use + // %#v, although it would be better to show a more expressive output in the future + s = fmt.Sprintf("%s: %#v", v.Type, value) + } + } + if len(v.Detail) != 0 { + s += fmt.Sprintf(": %s", v.Detail) + } + return s +} + +// ErrorType is a machine readable value providing more detail about why +// a field is invalid. These values are expected to match 1-1 with +// CauseType in api/types.go. +type ErrorType string + +// TODO: These values are duplicated in api/types.go, but there's a circular dep. Fix it. +const ( + // ErrorTypeNotFound is used to report failure to find a requested value + // (e.g. looking up an ID). See NotFound(). + ErrorTypeNotFound ErrorType = "FieldValueNotFound" + // ErrorTypeRequired is used to report required values that are not + // provided (e.g. empty strings, null values, or empty arrays). See + // Required(). + ErrorTypeRequired ErrorType = "FieldValueRequired" + // ErrorTypeDuplicate is used to report collisions of values that must be + // unique (e.g. unique IDs). See Duplicate(). + ErrorTypeDuplicate ErrorType = "FieldValueDuplicate" + // ErrorTypeInvalid is used to report malformed values (e.g. failed regex + // match, too long, out of bounds). See Invalid(). + ErrorTypeInvalid ErrorType = "FieldValueInvalid" + // ErrorTypeNotSupported is used to report unknown values for enumerated + // fields (e.g. a list of valid values). See NotSupported(). + ErrorTypeNotSupported ErrorType = "FieldValueNotSupported" + // ErrorTypeForbidden is used to report valid (as per formatting rules) + // values which would be accepted under some conditions, but which are not + // permitted by the current conditions (such as security policy). See + // Forbidden(). + ErrorTypeForbidden ErrorType = "FieldValueForbidden" + // ErrorTypeTooLong is used to report that the given value is too long. + // This is similar to ErrorTypeInvalid, but the error will not include the + // too-long value. See TooLong(). + ErrorTypeTooLong ErrorType = "FieldValueTooLong" + // ErrorTypeTooMany is used to report "too many". This is used to + // report that a given list has too many items. This is similar to FieldValueTooLong, + // but the error indicates quantity instead of length. + ErrorTypeTooMany ErrorType = "FieldValueTooMany" + // ErrorTypeInternal is used to report other errors that are not related + // to user input. See InternalError(). + ErrorTypeInternal ErrorType = "InternalError" +) + +// String converts a ErrorType into its corresponding canonical error message. +func (t ErrorType) String() string { + switch t { + case ErrorTypeNotFound: + return "Not found" + case ErrorTypeRequired: + return "Required value" + case ErrorTypeDuplicate: + return "Duplicate value" + case ErrorTypeInvalid: + return "Invalid value" + case ErrorTypeNotSupported: + return "Unsupported value" + case ErrorTypeForbidden: + return "Forbidden" + case ErrorTypeTooLong: + return "Too long" + case ErrorTypeTooMany: + return "Too many" + case ErrorTypeInternal: + return "Internal error" + default: + panic(fmt.Sprintf("unrecognized validation error: %q", string(t))) + } +} + +// NotFound returns a *Error indicating "value not found". This is +// used to report failure to find a requested value (e.g. looking up an ID). +func NotFound(field *Path, value interface{}) *Error { + return &Error{ErrorTypeNotFound, field.String(), value, ""} +} + +// Required returns a *Error indicating "value required". This is used +// to report required values that are not provided (e.g. empty strings, null +// values, or empty arrays). +func Required(field *Path, detail string) *Error { + return &Error{ErrorTypeRequired, field.String(), "", detail} +} + +// Duplicate returns a *Error indicating "duplicate value". This is +// used to report collisions of values that must be unique (e.g. names or IDs). +func Duplicate(field *Path, value interface{}) *Error { + return &Error{ErrorTypeDuplicate, field.String(), value, ""} +} + +// Invalid returns a *Error indicating "invalid value". This is used +// to report malformed values (e.g. failed regex match, too long, out of bounds). +func Invalid(field *Path, value interface{}, detail string) *Error { + return &Error{ErrorTypeInvalid, field.String(), value, detail} +} + +// NotSupported returns a *Error indicating "unsupported value". +// This is used to report unknown values for enumerated fields (e.g. a list of +// valid values). +func NotSupported(field *Path, value interface{}, validValues []string) *Error { + detail := "" + if validValues != nil && len(validValues) > 0 { + quotedValues := make([]string, len(validValues)) + for i, v := range validValues { + quotedValues[i] = strconv.Quote(v) + } + detail = "supported values: " + strings.Join(quotedValues, ", ") + } + return &Error{ErrorTypeNotSupported, field.String(), value, detail} +} + +// Forbidden returns a *Error indicating "forbidden". This is used to +// report valid (as per formatting rules) values which would be accepted under +// some conditions, but which are not permitted by current conditions (e.g. +// security policy). +func Forbidden(field *Path, detail string) *Error { + return &Error{ErrorTypeForbidden, field.String(), "", detail} +} + +// TooLong returns a *Error indicating "too long". This is used to +// report that the given value is too long. This is similar to +// Invalid, but the returned error will not include the too-long +// value. +func TooLong(field *Path, value interface{}, maxLength int) *Error { + return &Error{ErrorTypeTooLong, field.String(), value, fmt.Sprintf("must have at most %d bytes", maxLength)} +} + +// TooMany returns a *Error indicating "too many". This is used to +// report that a given list has too many items. This is similar to TooLong, +// but the returned error indicates quantity instead of length. +func TooMany(field *Path, actualQuantity, maxQuantity int) *Error { + return &Error{ErrorTypeTooMany, field.String(), actualQuantity, fmt.Sprintf("must have at most %d items", maxQuantity)} +} + +// InternalError returns a *Error indicating "internal error". This is used +// to signal that an error was found that was not directly related to user +// input. The err argument must be non-nil. +func InternalError(field *Path, err error) *Error { + return &Error{ErrorTypeInternal, field.String(), nil, err.Error()} +} + +// ErrorList holds a set of Errors. It is plausible that we might one day have +// non-field errors in this same umbrella package, but for now we don't, so +// we can keep it simple and leave ErrorList here. +type ErrorList []*Error + +// NewErrorTypeMatcher returns an errors.Matcher that returns true +// if the provided error is a Error and has the provided ErrorType. +func NewErrorTypeMatcher(t ErrorType) utilerrors.Matcher { + return func(err error) bool { + if e, ok := err.(*Error); ok { + return e.Type == t + } + return false + } +} + +// ToAggregate converts the ErrorList into an errors.Aggregate. +func (list ErrorList) ToAggregate() utilerrors.Aggregate { + errs := make([]error, 0, len(list)) + errorMsgs := sets.NewString() + for _, err := range list { + msg := fmt.Sprintf("%v", err) + if errorMsgs.Has(msg) { + continue + } + errorMsgs.Insert(msg) + errs = append(errs, err) + } + return utilerrors.NewAggregate(errs) +} + +func fromAggregate(agg utilerrors.Aggregate) ErrorList { + errs := agg.Errors() + list := make(ErrorList, len(errs)) + for i := range errs { + list[i] = errs[i].(*Error) + } + return list +} + +// Filter removes items from the ErrorList that match the provided fns. +func (list ErrorList) Filter(fns ...utilerrors.Matcher) ErrorList { + err := utilerrors.FilterOut(list.ToAggregate(), fns...) + if err == nil { + return nil + } + // FilterOut takes an Aggregate and returns an Aggregate + return fromAggregate(err.(utilerrors.Aggregate)) +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/util/validation/field/path.go b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/util/validation/field/path.go new file mode 100644 index 000000000000..44cdf997a3f6 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/util/validation/field/path.go @@ -0,0 +1,94 @@ +// Code generated by k8scopy from k8s.io/apimachinery@v0.19.8; DO NOT EDIT. +// File content copied from k8s.io/apimachinery@v0.19.8/pkg/util/validation/field/path.go + +/* +Copyright 2015 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package field + +import ( + "bytes" + "fmt" + "strconv" +) + +// Path represents the path from some root to a particular field. +type Path struct { + name string // the name of this field or "" if this is an index + index string // if name == "", this is a subscript (index or map key) of the previous element + parent *Path // nil if this is the root element +} + +// NewPath creates a root Path object. +func NewPath(name string, moreNames ...string) *Path { + r := &Path{name: name, parent: nil} + for _, anotherName := range moreNames { + r = &Path{name: anotherName, parent: r} + } + return r +} + +// Root returns the root element of this Path. +func (p *Path) Root() *Path { + for ; p.parent != nil; p = p.parent { + // Do nothing. + } + return p +} + +// Child creates a new Path that is a child of the method receiver. +func (p *Path) Child(name string, moreNames ...string) *Path { + r := NewPath(name, moreNames...) + r.Root().parent = p + return r +} + +// Index indicates that the previous Path is to be subscripted by an int. +// This sets the same underlying value as Key. +func (p *Path) Index(index int) *Path { + return &Path{index: strconv.Itoa(index), parent: p} +} + +// Key indicates that the previous Path is to be subscripted by a string. +// This sets the same underlying value as Index. +func (p *Path) Key(key string) *Path { + return &Path{index: key, parent: p} +} + +// String produces a string representation of the Path. +func (p *Path) String() string { + // make a slice to iterate + elems := []*Path{} + for ; p != nil; p = p.parent { + elems = append(elems, p) + } + + // iterate, but it has to be backwards + buf := bytes.NewBuffer(nil) + for i := range elems { + p := elems[len(elems)-1-i] + if p.parent != nil && len(p.name) > 0 { + // This is either the root or it is a subscript. + buf.WriteString(".") + } + if len(p.name) > 0 { + buf.WriteString(p.name) + } else { + fmt.Fprintf(buf, "[%s]", p.index) + } + } + return buf.String() +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/util/validation/validation.go b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/util/validation/validation.go new file mode 100644 index 000000000000..5e1ddbc46932 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/util/validation/validation.go @@ -0,0 +1,506 @@ +// Code generated by k8scopy from k8s.io/apimachinery@v0.19.8; DO NOT EDIT. +// File content copied from k8s.io/apimachinery@v0.19.8/pkg/util/validation/validation.go + +/* +Copyright 2014 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package validation + +import ( + "fmt" + "math" + "net" + "regexp" + "strconv" + "strings" + + "sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/util/validation/field" +) + +const qnameCharFmt string = "[A-Za-z0-9]" +const qnameExtCharFmt string = "[-A-Za-z0-9_.]" +const qualifiedNameFmt string = "(" + qnameCharFmt + qnameExtCharFmt + "*)?" + qnameCharFmt +const qualifiedNameErrMsg string = "must consist of alphanumeric characters, '-', '_' or '.', and must start and end with an alphanumeric character" +const qualifiedNameMaxLength int = 63 + +var qualifiedNameRegexp = regexp.MustCompile("^" + qualifiedNameFmt + "$") + +// IsQualifiedName tests whether the value passed is what Kubernetes calls a +// "qualified name". This is a format used in various places throughout the +// system. If the value is not valid, a list of error strings is returned. +// Otherwise an empty list (or nil) is returned. +func IsQualifiedName(value string) []string { + var errs []string + parts := strings.Split(value, "/") + var name string + switch len(parts) { + case 1: + name = parts[0] + case 2: + var prefix string + prefix, name = parts[0], parts[1] + if len(prefix) == 0 { + errs = append(errs, "prefix part "+EmptyError()) + } else if msgs := IsDNS1123Subdomain(prefix); len(msgs) != 0 { + errs = append(errs, prefixEach(msgs, "prefix part ")...) + } + default: + return append(errs, "a qualified name "+RegexError(qualifiedNameErrMsg, qualifiedNameFmt, "MyName", "my.name", "123-abc")+ + " with an optional DNS subdomain prefix and '/' (e.g. 'example.com/MyName')") + } + + if len(name) == 0 { + errs = append(errs, "name part "+EmptyError()) + } else if len(name) > qualifiedNameMaxLength { + errs = append(errs, "name part "+MaxLenError(qualifiedNameMaxLength)) + } + if !qualifiedNameRegexp.MatchString(name) { + errs = append(errs, "name part "+RegexError(qualifiedNameErrMsg, qualifiedNameFmt, "MyName", "my.name", "123-abc")) + } + return errs +} + +// IsFullyQualifiedName checks if the name is fully qualified. This is similar +// to IsFullyQualifiedDomainName but requires a minimum of 3 segments instead of +// 2 and does not accept a trailing . as valid. +// TODO: This function is deprecated and preserved until all callers migrate to +// IsFullyQualifiedDomainName; please don't add new callers. +func IsFullyQualifiedName(fldPath *field.Path, name string) field.ErrorList { + var allErrors field.ErrorList + if len(name) == 0 { + return append(allErrors, field.Required(fldPath, "")) + } + if errs := IsDNS1123Subdomain(name); len(errs) > 0 { + return append(allErrors, field.Invalid(fldPath, name, strings.Join(errs, ","))) + } + if len(strings.Split(name, ".")) < 3 { + return append(allErrors, field.Invalid(fldPath, name, "should be a domain with at least three segments separated by dots")) + } + return allErrors +} + +// IsFullyQualifiedDomainName checks if the domain name is fully qualified. This +// is similar to IsFullyQualifiedName but only requires a minimum of 2 segments +// instead of 3 and accepts a trailing . as valid. +func IsFullyQualifiedDomainName(fldPath *field.Path, name string) field.ErrorList { + var allErrors field.ErrorList + if len(name) == 0 { + return append(allErrors, field.Required(fldPath, "")) + } + if strings.HasSuffix(name, ".") { + name = name[:len(name)-1] + } + if errs := IsDNS1123Subdomain(name); len(errs) > 0 { + return append(allErrors, field.Invalid(fldPath, name, strings.Join(errs, ","))) + } + if len(strings.Split(name, ".")) < 2 { + return append(allErrors, field.Invalid(fldPath, name, "should be a domain with at least two segments separated by dots")) + } + for _, label := range strings.Split(name, ".") { + if errs := IsDNS1123Label(label); len(errs) > 0 { + return append(allErrors, field.Invalid(fldPath, label, strings.Join(errs, ","))) + } + } + return allErrors +} + +// Allowed characters in an HTTP Path as defined by RFC 3986. A HTTP path may +// contain: +// * unreserved characters (alphanumeric, '-', '.', '_', '~') +// * percent-encoded octets +// * sub-delims ("!", "$", "&", "'", "(", ")", "*", "+", ",", ";", "=") +// * a colon character (":") +const httpPathFmt string = `[A-Za-z0-9/\-._~%!$&'()*+,;=:]+` + +var httpPathRegexp = regexp.MustCompile("^" + httpPathFmt + "$") + +// IsDomainPrefixedPath checks if the given string is a domain-prefixed path +// (e.g. acme.io/foo). All characters before the first "/" must be a valid +// subdomain as defined by RFC 1123. All characters trailing the first "/" must +// be valid HTTP Path characters as defined by RFC 3986. +func IsDomainPrefixedPath(fldPath *field.Path, dpPath string) field.ErrorList { + var allErrs field.ErrorList + if len(dpPath) == 0 { + return append(allErrs, field.Required(fldPath, "")) + } + + segments := strings.SplitN(dpPath, "/", 2) + if len(segments) != 2 || len(segments[0]) == 0 || len(segments[1]) == 0 { + return append(allErrs, field.Invalid(fldPath, dpPath, "must be a domain-prefixed path (such as \"acme.io/foo\")")) + } + + host := segments[0] + for _, err := range IsDNS1123Subdomain(host) { + allErrs = append(allErrs, field.Invalid(fldPath, host, err)) + } + + path := segments[1] + if !httpPathRegexp.MatchString(path) { + return append(allErrs, field.Invalid(fldPath, path, RegexError("Invalid path", httpPathFmt))) + } + + return allErrs +} + +const labelValueFmt string = "(" + qualifiedNameFmt + ")?" +const labelValueErrMsg string = "a valid label must be an empty string or consist of alphanumeric characters, '-', '_' or '.', and must start and end with an alphanumeric character" + +// LabelValueMaxLength is a label's max length +const LabelValueMaxLength int = 63 + +var labelValueRegexp = regexp.MustCompile("^" + labelValueFmt + "$") + +// IsValidLabelValue tests whether the value passed is a valid label value. If +// the value is not valid, a list of error strings is returned. Otherwise an +// empty list (or nil) is returned. +func IsValidLabelValue(value string) []string { + var errs []string + if len(value) > LabelValueMaxLength { + errs = append(errs, MaxLenError(LabelValueMaxLength)) + } + if !labelValueRegexp.MatchString(value) { + errs = append(errs, RegexError(labelValueErrMsg, labelValueFmt, "MyValue", "my_value", "12345")) + } + return errs +} + +const dns1123LabelFmt string = "[a-z0-9]([-a-z0-9]*[a-z0-9])?" +const dns1123LabelErrMsg string = "a DNS-1123 label must consist of lower case alphanumeric characters or '-', and must start and end with an alphanumeric character" + +// DNS1123LabelMaxLength is a label's max length in DNS (RFC 1123) +const DNS1123LabelMaxLength int = 63 + +var dns1123LabelRegexp = regexp.MustCompile("^" + dns1123LabelFmt + "$") + +// IsDNS1123Label tests for a string that conforms to the definition of a label in +// DNS (RFC 1123). +func IsDNS1123Label(value string) []string { + var errs []string + if len(value) > DNS1123LabelMaxLength { + errs = append(errs, MaxLenError(DNS1123LabelMaxLength)) + } + if !dns1123LabelRegexp.MatchString(value) { + errs = append(errs, RegexError(dns1123LabelErrMsg, dns1123LabelFmt, "my-name", "123-abc")) + } + return errs +} + +const dns1123SubdomainFmt string = dns1123LabelFmt + "(\\." + dns1123LabelFmt + ")*" +const dns1123SubdomainErrorMsg string = "a DNS-1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character" + +// DNS1123SubdomainMaxLength is a subdomain's max length in DNS (RFC 1123) +const DNS1123SubdomainMaxLength int = 253 + +var dns1123SubdomainRegexp = regexp.MustCompile("^" + dns1123SubdomainFmt + "$") + +// IsDNS1123Subdomain tests for a string that conforms to the definition of a +// subdomain in DNS (RFC 1123). +func IsDNS1123Subdomain(value string) []string { + var errs []string + if len(value) > DNS1123SubdomainMaxLength { + errs = append(errs, MaxLenError(DNS1123SubdomainMaxLength)) + } + if !dns1123SubdomainRegexp.MatchString(value) { + errs = append(errs, RegexError(dns1123SubdomainErrorMsg, dns1123SubdomainFmt, "example.com")) + } + return errs +} + +const dns1035LabelFmt string = "[a-z]([-a-z0-9]*[a-z0-9])?" +const dns1035LabelErrMsg string = "a DNS-1035 label must consist of lower case alphanumeric characters or '-', start with an alphabetic character, and end with an alphanumeric character" + +// DNS1035LabelMaxLength is a label's max length in DNS (RFC 1035) +const DNS1035LabelMaxLength int = 63 + +var dns1035LabelRegexp = regexp.MustCompile("^" + dns1035LabelFmt + "$") + +// IsDNS1035Label tests for a string that conforms to the definition of a label in +// DNS (RFC 1035). +func IsDNS1035Label(value string) []string { + var errs []string + if len(value) > DNS1035LabelMaxLength { + errs = append(errs, MaxLenError(DNS1035LabelMaxLength)) + } + if !dns1035LabelRegexp.MatchString(value) { + errs = append(errs, RegexError(dns1035LabelErrMsg, dns1035LabelFmt, "my-name", "abc-123")) + } + return errs +} + +// wildcard definition - RFC 1034 section 4.3.3. +// examples: +// - valid: *.bar.com, *.foo.bar.com +// - invalid: *.*.bar.com, *.foo.*.com, *bar.com, f*.bar.com, * +const wildcardDNS1123SubdomainFmt = "\\*\\." + dns1123SubdomainFmt +const wildcardDNS1123SubdomainErrMsg = "a wildcard DNS-1123 subdomain must start with '*.', followed by a valid DNS subdomain, which must consist of lower case alphanumeric characters, '-' or '.' and end with an alphanumeric character" + +// IsWildcardDNS1123Subdomain tests for a string that conforms to the definition of a +// wildcard subdomain in DNS (RFC 1034 section 4.3.3). +func IsWildcardDNS1123Subdomain(value string) []string { + wildcardDNS1123SubdomainRegexp := regexp.MustCompile("^" + wildcardDNS1123SubdomainFmt + "$") + + var errs []string + if len(value) > DNS1123SubdomainMaxLength { + errs = append(errs, MaxLenError(DNS1123SubdomainMaxLength)) + } + if !wildcardDNS1123SubdomainRegexp.MatchString(value) { + errs = append(errs, RegexError(wildcardDNS1123SubdomainErrMsg, wildcardDNS1123SubdomainFmt, "*.example.com")) + } + return errs +} + +const cIdentifierFmt string = "[A-Za-z_][A-Za-z0-9_]*" +const identifierErrMsg string = "a valid C identifier must start with alphabetic character or '_', followed by a string of alphanumeric characters or '_'" + +var cIdentifierRegexp = regexp.MustCompile("^" + cIdentifierFmt + "$") + +// IsCIdentifier tests for a string that conforms the definition of an identifier +// in C. This checks the format, but not the length. +func IsCIdentifier(value string) []string { + if !cIdentifierRegexp.MatchString(value) { + return []string{RegexError(identifierErrMsg, cIdentifierFmt, "my_name", "MY_NAME", "MyName")} + } + return nil +} + +// IsValidPortNum tests that the argument is a valid, non-zero port number. +func IsValidPortNum(port int) []string { + if 1 <= port && port <= 65535 { + return nil + } + return []string{InclusiveRangeError(1, 65535)} +} + +// IsInRange tests that the argument is in an inclusive range. +func IsInRange(value int, min int, max int) []string { + if value >= min && value <= max { + return nil + } + return []string{InclusiveRangeError(min, max)} +} + +// Now in libcontainer UID/GID limits is 0 ~ 1<<31 - 1 +// TODO: once we have a type for UID/GID we should make these that type. +const ( + minUserID = 0 + maxUserID = math.MaxInt32 + minGroupID = 0 + maxGroupID = math.MaxInt32 +) + +// IsValidGroupID tests that the argument is a valid Unix GID. +func IsValidGroupID(gid int64) []string { + if minGroupID <= gid && gid <= maxGroupID { + return nil + } + return []string{InclusiveRangeError(minGroupID, maxGroupID)} +} + +// IsValidUserID tests that the argument is a valid Unix UID. +func IsValidUserID(uid int64) []string { + if minUserID <= uid && uid <= maxUserID { + return nil + } + return []string{InclusiveRangeError(minUserID, maxUserID)} +} + +var portNameCharsetRegex = regexp.MustCompile("^[-a-z0-9]+$") +var portNameOneLetterRegexp = regexp.MustCompile("[a-z]") + +// IsValidPortName check that the argument is valid syntax. It must be +// non-empty and no more than 15 characters long. It may contain only [-a-z0-9] +// and must contain at least one letter [a-z]. It must not start or end with a +// hyphen, nor contain adjacent hyphens. +// +// Note: We only allow lower-case characters, even though RFC 6335 is case +// insensitive. +func IsValidPortName(port string) []string { + var errs []string + if len(port) > 15 { + errs = append(errs, MaxLenError(15)) + } + if !portNameCharsetRegex.MatchString(port) { + errs = append(errs, "must contain only alpha-numeric characters (a-z, 0-9), and hyphens (-)") + } + if !portNameOneLetterRegexp.MatchString(port) { + errs = append(errs, "must contain at least one letter or number (a-z, 0-9)") + } + if strings.Contains(port, "--") { + errs = append(errs, "must not contain consecutive hyphens") + } + if len(port) > 0 && (port[0] == '-' || port[len(port)-1] == '-') { + errs = append(errs, "must not begin or end with a hyphen") + } + return errs +} + +// IsValidIP tests that the argument is a valid IP address. +func IsValidIP(value string) []string { + if net.ParseIP(value) == nil { + return []string{"must be a valid IP address, (e.g. 10.9.8.7)"} + } + return nil +} + +// IsValidIPv4Address tests that the argument is a valid IPv4 address. +func IsValidIPv4Address(fldPath *field.Path, value string) field.ErrorList { + var allErrors field.ErrorList + ip := net.ParseIP(value) + if ip == nil || ip.To4() == nil { + allErrors = append(allErrors, field.Invalid(fldPath, value, "must be a valid IPv4 address")) + } + return allErrors +} + +// IsValidIPv6Address tests that the argument is a valid IPv6 address. +func IsValidIPv6Address(fldPath *field.Path, value string) field.ErrorList { + var allErrors field.ErrorList + ip := net.ParseIP(value) + if ip == nil || ip.To4() != nil { + allErrors = append(allErrors, field.Invalid(fldPath, value, "must be a valid IPv6 address")) + } + return allErrors +} + +const percentFmt string = "[0-9]+%" +const percentErrMsg string = "a valid percent string must be a numeric string followed by an ending '%'" + +var percentRegexp = regexp.MustCompile("^" + percentFmt + "$") + +// IsValidPercent checks that string is in the form of a percentage +func IsValidPercent(percent string) []string { + if !percentRegexp.MatchString(percent) { + return []string{RegexError(percentErrMsg, percentFmt, "1%", "93%")} + } + return nil +} + +const httpHeaderNameFmt string = "[-A-Za-z0-9]+" +const httpHeaderNameErrMsg string = "a valid HTTP header must consist of alphanumeric characters or '-'" + +var httpHeaderNameRegexp = regexp.MustCompile("^" + httpHeaderNameFmt + "$") + +// IsHTTPHeaderName checks that a string conforms to the Go HTTP library's +// definition of a valid header field name (a stricter subset than RFC7230). +func IsHTTPHeaderName(value string) []string { + if !httpHeaderNameRegexp.MatchString(value) { + return []string{RegexError(httpHeaderNameErrMsg, httpHeaderNameFmt, "X-Header-Name")} + } + return nil +} + +const envVarNameFmt = "[-._a-zA-Z][-._a-zA-Z0-9]*" +const envVarNameFmtErrMsg string = "a valid environment variable name must consist of alphabetic characters, digits, '_', '-', or '.', and must not start with a digit" + +var envVarNameRegexp = regexp.MustCompile("^" + envVarNameFmt + "$") + +// IsEnvVarName tests if a string is a valid environment variable name. +func IsEnvVarName(value string) []string { + var errs []string + if !envVarNameRegexp.MatchString(value) { + errs = append(errs, RegexError(envVarNameFmtErrMsg, envVarNameFmt, "my.env-name", "MY_ENV.NAME", "MyEnvName1")) + } + + errs = append(errs, hasChDirPrefix(value)...) + return errs +} + +const configMapKeyFmt = `[-._a-zA-Z0-9]+` +const configMapKeyErrMsg string = "a valid config key must consist of alphanumeric characters, '-', '_' or '.'" + +var configMapKeyRegexp = regexp.MustCompile("^" + configMapKeyFmt + "$") + +// IsConfigMapKey tests for a string that is a valid key for a ConfigMap or Secret +func IsConfigMapKey(value string) []string { + var errs []string + if len(value) > DNS1123SubdomainMaxLength { + errs = append(errs, MaxLenError(DNS1123SubdomainMaxLength)) + } + if !configMapKeyRegexp.MatchString(value) { + errs = append(errs, RegexError(configMapKeyErrMsg, configMapKeyFmt, "key.name", "KEY_NAME", "key-name")) + } + errs = append(errs, hasChDirPrefix(value)...) + return errs +} + +// MaxLenError returns a string explanation of a "string too long" validation +// failure. +func MaxLenError(length int) string { + return fmt.Sprintf("must be no more than %d characters", length) +} + +// RegexError returns a string explanation of a regex validation failure. +func RegexError(msg string, fmt string, examples ...string) string { + if len(examples) == 0 { + return msg + " (regex used for validation is '" + fmt + "')" + } + msg += " (e.g. " + for i := range examples { + if i > 0 { + msg += " or " + } + msg += "'" + examples[i] + "', " + } + msg += "regex used for validation is '" + fmt + "')" + return msg +} + +// EmptyError returns a string explanation of a "must not be empty" validation +// failure. +func EmptyError() string { + return "must be non-empty" +} + +func prefixEach(msgs []string, prefix string) []string { + for i := range msgs { + msgs[i] = prefix + msgs[i] + } + return msgs +} + +// InclusiveRangeError returns a string explanation of a numeric "must be +// between" validation failure. +func InclusiveRangeError(lo, hi int) string { + return fmt.Sprintf(`must be between %d and %d, inclusive`, lo, hi) +} + +func hasChDirPrefix(value string) []string { + var errs []string + switch { + case value == ".": + errs = append(errs, `must not be '.'`) + case value == "..": + errs = append(errs, `must not be '..'`) + case strings.HasPrefix(value, ".."): + errs = append(errs, `must not start with '..'`) + } + return errs +} + +// IsValidSocketAddr checks that string represents a valid socket address +// as defined in RFC 789. (e.g 0.0.0.0:10254 or [::]:10254)) +func IsValidSocketAddr(value string) []string { + var errs []string + ip, port, err := net.SplitHostPort(value) + if err != nil { + errs = append(errs, "must be a valid socket address format, (e.g. 0.0.0.0:10254 or [::]:10254)") + return errs + } + portInt, _ := strconv.Atoi(port) + errs = append(errs, IsValidPortNum(portInt)...) + errs = append(errs, IsValidIP(ip)...) + return errs +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/yaml/kfns.go b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/kfns.go new file mode 100644 index 000000000000..d9e5dfaf610d --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/kfns.go @@ -0,0 +1,137 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package yaml + +import ( + "gopkg.in/yaml.v3" + "sigs.k8s.io/kustomize/kyaml/errors" +) + +// AnnotationClearer removes an annotation at metadata.annotations. +// Returns nil if the annotation or field does not exist. +type AnnotationClearer struct { + Kind string `yaml:"kind,omitempty"` + Key string `yaml:"key,omitempty"` +} + +func (c AnnotationClearer) Filter(rn *RNode) (*RNode, error) { + return rn.Pipe( + PathGetter{Path: []string{MetadataField, AnnotationsField}}, + FieldClearer{Name: c.Key}) +} + +func ClearAnnotation(key string) AnnotationClearer { + return AnnotationClearer{Key: key} +} + +// ClearEmptyAnnotations clears the keys, annotations +// and metadata if they are empty/null +func ClearEmptyAnnotations(rn *RNode) error { + _, err := rn.Pipe(Lookup(MetadataField), FieldClearer{ + Name: AnnotationsField, IfEmpty: true}) + if err != nil { + return errors.Wrap(err) + } + _, err = rn.Pipe(FieldClearer{Name: MetadataField, IfEmpty: true}) + if err != nil { + return errors.Wrap(err) + } + return nil +} + +// k8sMetaSetter sets a name at metadata.{key}. +// Creates metadata if does not exist. +type k8sMetaSetter struct { + Key string `yaml:"key,omitempty"` + Value string `yaml:"value,omitempty"` +} + +func (s k8sMetaSetter) Filter(rn *RNode) (*RNode, error) { + _, err := rn.Pipe( + PathGetter{Path: []string{MetadataField}, Create: yaml.MappingNode}, + FieldSetter{Name: s.Key, Value: NewStringRNode(s.Value)}) + return rn, err +} + +func SetK8sName(value string) k8sMetaSetter { + return k8sMetaSetter{Key: NameField, Value: value} +} + +func SetK8sNamespace(value string) k8sMetaSetter { + return k8sMetaSetter{Key: NamespaceField, Value: value} +} + +// AnnotationSetter sets an annotation at metadata.annotations. +// Creates metadata.annotations if does not exist. +type AnnotationSetter struct { + Kind string `yaml:"kind,omitempty"` + Key string `yaml:"key,omitempty"` + Value string `yaml:"value,omitempty"` +} + +func (s AnnotationSetter) Filter(rn *RNode) (*RNode, error) { + v := NewStringRNode(s.Value) + // some tools get confused about the type if annotations are not quoted + v.YNode().Style = yaml.SingleQuotedStyle + if err := ClearEmptyAnnotations(rn); err != nil { + return nil, err + } + return addMetadataNode(rn, AnnotationsField, s.Key, v) +} + +func SetAnnotation(key, value string) AnnotationSetter { + return AnnotationSetter{Key: key, Value: value} +} + +// AnnotationGetter gets an annotation at metadata.annotations. +// Returns nil if metadata.annotations does not exist. +type AnnotationGetter struct { + Kind string `yaml:"kind,omitempty"` + Key string `yaml:"key,omitempty"` + Value string `yaml:"value,omitempty"` +} + +// AnnotationGetter returns the annotation value. +// Returns "", nil if the annotation does not exist. +func (g AnnotationGetter) Filter(rn *RNode) (*RNode, error) { + v, err := rn.Pipe( + PathGetter{Path: []string{MetadataField, AnnotationsField, g.Key}}) + if v == nil || err != nil { + return v, err + } + if g.Value == "" || v.value.Value == g.Value { + return v, err + } + return nil, err +} + +func GetAnnotation(key string) AnnotationGetter { + return AnnotationGetter{Key: key} +} + +// LabelSetter sets a label at metadata.labels. +// Creates metadata.labels if does not exist. +type LabelSetter struct { + Kind string `yaml:"kind,omitempty"` + Key string `yaml:"key,omitempty"` + Value string `yaml:"value,omitempty"` +} + +func (s LabelSetter) Filter(rn *RNode) (*RNode, error) { + v := NewStringRNode(s.Value) + // some tools get confused about the type if labels are not quoted + v.YNode().Style = yaml.SingleQuotedStyle + return addMetadataNode(rn, LabelsField, s.Key, v) +} + +func addMetadataNode(rn *RNode, field, key string, v *RNode) (*RNode, error) { + return rn.Pipe( + PathGetter{ + Path: []string{MetadataField, field}, Create: yaml.MappingNode}, + FieldSetter{Name: key, Value: v}) +} + +func SetLabel(key, value string) LabelSetter { + return LabelSetter{Key: key, Value: value} +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/yaml/mapnode.go b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/mapnode.go new file mode 100644 index 000000000000..31b41b40fbb1 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/mapnode.go @@ -0,0 +1,40 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package yaml + +// MapNode wraps a field key and value. +type MapNode struct { + Key *RNode + Value *RNode +} + +// IsNilOrEmpty returns true if the MapNode is nil, +// has no value, or has a value that appears empty. +func (mn *MapNode) IsNilOrEmpty() bool { + return mn == nil || mn.Value.IsNilOrEmpty() +} + +type MapNodeSlice []*MapNode + +func (m MapNodeSlice) Keys() []*RNode { + var keys []*RNode + for i := range m { + if m[i] != nil { + keys = append(keys, m[i].Key) + } + } + return keys +} + +func (m MapNodeSlice) Values() []*RNode { + var values []*RNode + for i := range m { + if m[i] != nil { + values = append(values, m[i].Value) + } else { + values = append(values, nil) + } + } + return values +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/yaml/match.go b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/match.go new file mode 100644 index 000000000000..149716063cee --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/match.go @@ -0,0 +1,206 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package yaml + +import ( + "regexp" + "strings" +) + +// PathMatcher returns all RNodes matching the path wrapped in a SequenceNode. +// Lists may have multiple elements matching the path, and each matching element +// is added to the return result. +// If Path points to a SequenceNode, the SequenceNode is wrapped in another SequenceNode +// If Path does not contain any lists, the result is still wrapped in a SequenceNode of len == 1 +type PathMatcher struct { + Kind string `yaml:"kind,omitempty"` + + // Path is a slice of parts leading to the RNode to lookup. + // Each path part may be one of: + // * FieldMatcher -- e.g. "spec" + // * Map Key -- e.g. "app.k8s.io/version" + // * List Entry -- e.g. "[name=nginx]" or "[=-jar]" + // + // Map Keys and Fields are equivalent. + // See FieldMatcher for more on Fields and Map Keys. + // + // List Entries are specified as map entry to match [fieldName=fieldValue]. + // See Elem for more on List Entries. + // + // Examples: + // * spec.template.spec.container with matching name: [name=nginx] -- match 'name': 'nginx' + // * spec.template.spec.container.argument matching a value: [=-jar] -- match '-jar' + Path []string `yaml:"path,omitempty"` + + // Matches is set by PathMatch to publish the matched element values for each node. + // After running PathMatcher.Filter, each node from the SequenceNode result may be + // looked up in Matches to find the field values that were matched. + Matches map[*Node][]string + + // StripComments may be set to remove the comments on the matching Nodes. + // This is useful for if the nodes are to be printed in FlowStyle. + StripComments bool + + val *RNode + field string + matchRegex string +} + +func (p *PathMatcher) stripComments(n *Node) { + if n == nil { + return + } + if p.StripComments { + n.LineComment = "" + n.HeadComment = "" + n.FootComment = "" + for i := range n.Content { + p.stripComments(n.Content[i]) + } + } +} + +func (p *PathMatcher) Filter(rn *RNode) (*RNode, error) { + val, err := p.filter(rn) + if err != nil { + return nil, err + } + p.stripComments(val.YNode()) + return val, err +} + +func (p *PathMatcher) filter(rn *RNode) (*RNode, error) { + p.Matches = map[*Node][]string{} + + if len(p.Path) == 0 { + // return the element wrapped in a SequenceNode + p.appendRNode("", rn) + return p.val, nil + } + + if IsListIndex(p.Path[0]) { + // match seq elements + return p.doSeq(rn) + } + // match a field + return p.doField(rn) +} + +func (p *PathMatcher) doField(rn *RNode) (*RNode, error) { + // lookup the field + field, err := rn.Pipe(Get(p.Path[0])) + if err != nil || field == nil { + // if the field doesn't exist, return nil + return nil, err + } + + // recurse on the field, removing the first element of the path + pm := &PathMatcher{Path: p.Path[1:]} + p.val, err = pm.filter(field) + p.Matches = pm.Matches + return p.val, err +} + +// doSeq iterates over a sequence and appends elements matching the path regex to p.Val +func (p *PathMatcher) doSeq(rn *RNode) (*RNode, error) { + // parse the field + match pair + var err error + p.field, p.matchRegex, err = SplitIndexNameValue(p.Path[0]) + if err != nil { + return nil, err + } + + if p.field == "" { + err = rn.VisitElements(p.visitPrimitiveElem) + } else { + err = rn.VisitElements(p.visitElem) + } + if err != nil || p.val == nil || len(p.val.YNode().Content) == 0 { + return nil, err + } + + return p.val, nil +} + +func (p *PathMatcher) visitPrimitiveElem(elem *RNode) error { + r, err := regexp.Compile(p.matchRegex) + if err != nil { + return err + } + + str, err := elem.String() + if err != nil { + return err + } + str = strings.TrimSpace(str) + if !r.MatchString(str) { + return nil + } + + p.appendRNode("", elem) + return nil +} + +func (p *PathMatcher) visitElem(elem *RNode) error { + r, err := regexp.Compile(p.matchRegex) + if err != nil { + return err + } + + // check if this elements field matches the regex + val := elem.Field(p.field) + if val == nil || val.Value == nil { + return nil + } + str, err := val.Value.String() + if err != nil { + return err + } + str = strings.TrimSpace(str) + if !r.MatchString(str) { + return nil + } + + // recurse on the matching element + pm := &PathMatcher{Path: p.Path[1:]} + add, err := pm.filter(elem) + for k, v := range pm.Matches { + p.Matches[k] = v + } + if err != nil || add == nil { + return err + } + p.append(str, add.Content()...) + return nil +} + +func (p *PathMatcher) appendRNode(path string, node *RNode) { + p.append(path, node.YNode()) +} + +func (p *PathMatcher) append(path string, nodes ...*Node) { + if p.val == nil { + p.val = NewRNode(&Node{Kind: SequenceNode}) + } + for i := range nodes { + node := nodes[i] + p.val.YNode().Content = append(p.val.YNode().Content, node) + // record the path if specified + if path != "" { + p.Matches[node] = append(p.Matches[node], path) + } + } +} + +func cleanPath(path []string) []string { + var p []string + for _, elem := range path { + elem = strings.TrimSpace(elem) + if len(elem) == 0 { + continue + } + p = append(p, elem) + } + return p +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/yaml/merge2/merge2.go b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/merge2/merge2.go new file mode 100644 index 000000000000..ab0c8244c433 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/merge2/merge2.go @@ -0,0 +1,182 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +// Package merge contains libraries for merging fields from one RNode to another +// RNode +package merge2 + +import ( + "sigs.k8s.io/kustomize/kyaml/openapi" + "sigs.k8s.io/kustomize/kyaml/yaml" + "sigs.k8s.io/kustomize/kyaml/yaml/walk" +) + +// Merge merges fields from src into dest. +func Merge(src, dest *yaml.RNode, mergeOptions yaml.MergeOptions) (*yaml.RNode, error) { + return walk.Walker{ + Sources: []*yaml.RNode{dest, src}, + Visitor: Merger{}, + MergeOptions: mergeOptions, + }.Walk() +} + +// Merge parses the arguments, and merges fields from srcStr into destStr. +func MergeStrings(srcStr, destStr string, infer bool, mergeOptions yaml.MergeOptions) (string, error) { + src, err := yaml.Parse(srcStr) + if err != nil { + return "", err + } + dest, err := yaml.Parse(destStr) + if err != nil { + return "", err + } + + result, err := walk.Walker{ + Sources: []*yaml.RNode{dest, src}, + Visitor: Merger{}, + InferAssociativeLists: infer, + MergeOptions: mergeOptions, + }.Walk() + if err != nil { + return "", err + } + + return result.String() +} + +type Merger struct { + // for forwards compatibility when new functions are added to the interface +} + +var _ walk.Visitor = Merger{} + +func (m Merger) VisitMap(nodes walk.Sources, s *openapi.ResourceSchema) (*yaml.RNode, error) { + if err := m.SetComments(nodes); err != nil { + return nil, err + } + if err := m.SetStyle(nodes); err != nil { + return nil, err + } + if yaml.IsMissingOrNull(nodes.Dest()) { + // Add + ps, _ := determineSmpDirective(nodes.Origin()) + if ps == smpDelete { + return walk.ClearNode, nil + } + + return nodes.Origin(), nil + } + if nodes.Origin().IsTaggedNull() { + // clear the value + return walk.ClearNode, nil + } + + ps, err := determineSmpDirective(nodes.Origin()) + if err != nil { + return nil, err + } + + switch ps { + case smpDelete: + return walk.ClearNode, nil + case smpReplace: + return nodes.Origin(), nil + default: + return nodes.Dest(), nil + } +} + +func (m Merger) VisitScalar(nodes walk.Sources, s *openapi.ResourceSchema) (*yaml.RNode, error) { + if err := m.SetComments(nodes); err != nil { + return nil, err + } + if err := m.SetStyle(nodes); err != nil { + return nil, err + } + // Override value + if nodes.Origin() != nil { + return nodes.Origin(), nil + } + // Keep + return nodes.Dest(), nil +} + +func (m Merger) VisitList(nodes walk.Sources, s *openapi.ResourceSchema, kind walk.ListKind) (*yaml.RNode, error) { + if err := m.SetComments(nodes); err != nil { + return nil, err + } + if err := m.SetStyle(nodes); err != nil { + return nil, err + } + if kind == walk.NonAssociateList { + // Override value + if nodes.Origin() != nil { + return nodes.Origin(), nil + } + // Keep + return nodes.Dest(), nil + } + + // Add + if yaml.IsMissingOrNull(nodes.Dest()) { + return nodes.Origin(), nil + } + // Clear + if nodes.Origin().IsTaggedNull() { + return walk.ClearNode, nil + } + + ps, err := determineSmpDirective(nodes.Origin()) + if err != nil { + return nil, err + } + + switch ps { + case smpDelete: + return walk.ClearNode, nil + case smpReplace: + return nodes.Origin(), nil + default: + return nodes.Dest(), nil + } +} + +func (m Merger) SetStyle(sources walk.Sources) error { + source := sources.Origin() + dest := sources.Dest() + if dest == nil || dest.YNode() == nil || source == nil || source.YNode() == nil { + // avoid panic + return nil + } + + // copy the style from the source. + // special case: if the dest was an empty map or seq, then it probably had + // folded style applied, but we actually want to keep the style of the origin + // in this case (even if it was the default). otherwise the merged elements + // will get folded even though this probably isn't what is desired. + if dest.YNode().Kind != yaml.ScalarNode && len(dest.YNode().Content) == 0 { + dest.YNode().Style = source.YNode().Style + } + return nil +} + +// SetComments copies the dest comments to the source comments if they are present +// on the source. +func (m Merger) SetComments(sources walk.Sources) error { + source := sources.Origin() + dest := sources.Dest() + if dest == nil || dest.YNode() == nil || source == nil || source.YNode() == nil { + // avoid panic + return nil + } + if source.YNode().FootComment != "" { + dest.YNode().FootComment = source.YNode().FootComment + } + if source.YNode().HeadComment != "" { + dest.YNode().HeadComment = source.YNode().HeadComment + } + if source.YNode().LineComment != "" { + dest.YNode().LineComment = source.YNode().LineComment + } + return nil +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/yaml/merge2/smpdirective.go b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/merge2/smpdirective.go new file mode 100644 index 000000000000..f38b188eac18 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/merge2/smpdirective.go @@ -0,0 +1,101 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package merge2 + +import ( + "fmt" + + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +// A strategic merge patch directive. +// See https://github.com/kubernetes/community/blob/master/contributors/devel/sig-api-machinery/strategic-merge-patch.md +// +//go:generate stringer -type=smpDirective -linecomment +type smpDirective int + +const ( + smpUnknown smpDirective = iota // unknown + smpReplace // replace + smpDelete // delete + smpMerge // merge +) + +const strategicMergePatchDirectiveKey = "$patch" + +// Examine patch for a strategic merge patch directive. +// If found, return it, and remove the directive from the patch. +func determineSmpDirective(patch *yaml.RNode) (smpDirective, error) { + if patch == nil { + return smpMerge, nil + } + switch patch.YNode().Kind { + case yaml.SequenceNode: + return determineSequenceNodePatchStrategy(patch) + case yaml.MappingNode: + return determineMappingNodePatchStrategy(patch) + default: + return smpUnknown, fmt.Errorf( + "no implemented strategic merge patch strategy for '%s' ('%s')", + patch.YNode().ShortTag(), patch.MustString()) + } +} + +func determineSequenceNodePatchStrategy(patch *yaml.RNode) (smpDirective, error) { + // get the $patch element + node, err := patch.Pipe(yaml.GetElementByKey(strategicMergePatchDirectiveKey)) + // if there are more than 1 key/value pair in the map, then this $patch + // is not for the sequence + if err != nil || node == nil || node.YNode() == nil || len(node.Content()) > 2 { + return smpMerge, nil + } + // get the value + value, err := node.Pipe(yaml.Get(strategicMergePatchDirectiveKey)) + if err != nil || value == nil || value.YNode() == nil { + return smpMerge, nil + } + v := value.YNode().Value + if v == smpDelete.String() { + return smpDelete, elideSequencePatchDirective(patch, v) + } + if v == smpReplace.String() { + return smpReplace, elideSequencePatchDirective(patch, v) + } + if v == smpMerge.String() { + return smpMerge, elideSequencePatchDirective(patch, v) + } + return smpUnknown, fmt.Errorf( + "unknown patch strategy '%s'", v) +} + +func determineMappingNodePatchStrategy(patch *yaml.RNode) (smpDirective, error) { + node, err := patch.Pipe(yaml.Get(strategicMergePatchDirectiveKey)) + if err != nil || node == nil || node.YNode() == nil { + return smpMerge, nil + } + v := node.YNode().Value + if v == smpDelete.String() { + return smpDelete, elideMappingPatchDirective(patch) + } + if v == smpReplace.String() { + return smpReplace, elideMappingPatchDirective(patch) + } + if v == smpMerge.String() { + return smpMerge, elideMappingPatchDirective(patch) + } + return smpUnknown, fmt.Errorf( + "unknown patch strategy '%s'", v) +} + +func elideMappingPatchDirective(patch *yaml.RNode) error { + return patch.PipeE(yaml.Clear(strategicMergePatchDirectiveKey)) +} + +func elideSequencePatchDirective(patch *yaml.RNode, value string) error { + return patch.PipeE(yaml.ElementSetter{ + Element: nil, + Keys: []string{strategicMergePatchDirectiveKey}, + Values: []string{value}, + }) +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/yaml/merge2/smpdirective_string.go b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/merge2/smpdirective_string.go new file mode 100644 index 000000000000..b4f937f0e13c --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/merge2/smpdirective_string.go @@ -0,0 +1,26 @@ +// Code generated by "stringer -type=smpDirective -linecomment"; DO NOT EDIT. + +package merge2 + +import "strconv" + +func _() { + // An "invalid array index" compiler error signifies that the constant values have changed. + // Re-run the stringer command to generate them again. + var x [1]struct{} + _ = x[smpUnknown-0] + _ = x[smpReplace-1] + _ = x[smpDelete-2] + _ = x[smpMerge-3] +} + +const _smpDirective_name = "unknownreplacedeletemerge" + +var _smpDirective_index = [...]uint8{0, 7, 14, 20, 25} + +func (i smpDirective) String() string { + if i < 0 || i >= smpDirective(len(_smpDirective_index)-1) { + return "smpDirective(" + strconv.FormatInt(int64(i), 10) + ")" + } + return _smpDirective_name[_smpDirective_index[i]:_smpDirective_index[i+1]] +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/yaml/merge3/merge3.go b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/merge3/merge3.go new file mode 100644 index 000000000000..664270e5b24e --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/merge3/merge3.go @@ -0,0 +1,45 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +// Package merge contains libraries for merging fields from one RNode to another +// RNode +package merge3 + +import ( + "sigs.k8s.io/kustomize/kyaml/yaml" + "sigs.k8s.io/kustomize/kyaml/yaml/walk" +) + +func Merge(dest, original, update *yaml.RNode) (*yaml.RNode, error) { + // if update == nil && original != nil => declarative deletion + + return walk.Walker{ + Visitor: Visitor{}, + VisitKeysAsScalars: true, + Sources: []*yaml.RNode{dest, original, update}}.Walk() +} + +func MergeStrings(dest, original, update string, infer bool) (string, error) { + srcOriginal, err := yaml.Parse(original) + if err != nil { + return "", err + } + srcUpdated, err := yaml.Parse(update) + if err != nil { + return "", err + } + d, err := yaml.Parse(dest) + if err != nil { + return "", err + } + + result, err := walk.Walker{ + InferAssociativeLists: infer, + Visitor: Visitor{}, + VisitKeysAsScalars: true, + Sources: []*yaml.RNode{d, srcOriginal, srcUpdated}}.Walk() + if err != nil { + return "", err + } + return result.String() +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/yaml/merge3/visitor.go b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/merge3/visitor.go new file mode 100644 index 000000000000..978deff0c044 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/merge3/visitor.go @@ -0,0 +1,172 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package merge3 + +import ( + "sigs.k8s.io/kustomize/kyaml/openapi" + "sigs.k8s.io/kustomize/kyaml/yaml" + "sigs.k8s.io/kustomize/kyaml/yaml/walk" +) + +type ConflictStrategy uint + +const ( + // TODO: Support more strategies + TakeUpdate ConflictStrategy = 1 + iota +) + +type Visitor struct{} + +func (m Visitor) VisitMap(nodes walk.Sources, s *openapi.ResourceSchema) (*yaml.RNode, error) { + if nodes.Updated().IsTaggedNull() || nodes.Dest().IsTaggedNull() { + // explicitly cleared from either dest or update + return walk.ClearNode, nil + } + if nodes.Dest() == nil && nodes.Updated() == nil { + // implicitly cleared missing from both dest and update + return walk.ClearNode, nil + } + + if nodes.Dest() == nil { + // not cleared, but missing from the dest + // initialize a new value that can be recursively merged + return yaml.NewRNode(&yaml.Node{Kind: yaml.MappingNode}), nil + } + + // recursively merge the dest with the original and updated + return nodes.Dest(), nil +} + +func (m Visitor) visitAList(nodes walk.Sources, _ *openapi.ResourceSchema) (*yaml.RNode, error) { + if yaml.IsMissingOrNull(nodes.Updated()) && !yaml.IsMissingOrNull(nodes.Origin()) { + // implicitly cleared from update -- element was deleted + return walk.ClearNode, nil + } + if yaml.IsMissingOrNull(nodes.Dest()) { + // not cleared, but missing from the dest + // initialize a new value that can be recursively merged + return yaml.NewRNode(&yaml.Node{Kind: yaml.SequenceNode}), nil + } + + // recursively merge the dest with the original and updated + return nodes.Dest(), nil +} + +func (m Visitor) VisitScalar(nodes walk.Sources, s *openapi.ResourceSchema) (*yaml.RNode, error) { + if nodes.Updated().IsTaggedNull() || nodes.Dest().IsTaggedNull() { + // explicitly cleared from either dest or update + return nil, nil + } + if yaml.IsMissingOrNull(nodes.Updated()) != yaml.IsMissingOrNull(nodes.Origin()) { + // value added or removed in update + return nodes.Updated(), nil + } + if yaml.IsMissingOrNull(nodes.Updated()) && yaml.IsMissingOrNull(nodes.Origin()) { + // value added or removed in update + return nodes.Dest(), nil + } + + values, err := m.getStrValues(nodes) + if err != nil { + return nil, err + } + + if (values.Dest == "" || values.Dest == values.Origin) && values.Origin != values.Update { + // if local is nil or is unchanged but there is new update + return nodes.Updated(), nil + } + + if nodes.Updated().YNode().Value != nodes.Origin().YNode().Value { + // value changed in update + return nodes.Updated(), nil + } + + // unchanged between origin and update, keep the dest + return nodes.Dest(), nil +} + +func (m Visitor) visitNAList(nodes walk.Sources) (*yaml.RNode, error) { + if nodes.Updated().IsTaggedNull() || nodes.Dest().IsTaggedNull() { + // explicitly cleared from either dest or update + return walk.ClearNode, nil + } + + if yaml.IsMissingOrNull(nodes.Updated()) != yaml.IsMissingOrNull(nodes.Origin()) { + // value added or removed in update + return nodes.Updated(), nil + } + if yaml.IsMissingOrNull(nodes.Updated()) && yaml.IsMissingOrNull(nodes.Origin()) { + // value not present in source or dest + return nodes.Dest(), nil + } + + // compare origin and update values to see if they have changed + values, err := m.getStrValues(nodes) + if err != nil { + return nil, err + } + if values.Update != values.Origin { + // value changed in update + return nodes.Updated(), nil + } + + // unchanged between origin and update, keep the dest + return nodes.Dest(), nil +} + +func (m Visitor) VisitList(nodes walk.Sources, s *openapi.ResourceSchema, kind walk.ListKind) (*yaml.RNode, error) { + if kind == walk.AssociativeList { + return m.visitAList(nodes, s) + } + // non-associative list + return m.visitNAList(nodes) +} + +func (m Visitor) getStrValues(nodes walk.Sources) (strValues, error) { + var uStr, oStr, dStr string + var err error + if nodes.Updated() != nil && nodes.Updated().YNode() != nil { + s := nodes.Updated().YNode().Style + defer func() { + nodes.Updated().YNode().Style = s + }() + nodes.Updated().YNode().Style = yaml.FlowStyle | yaml.SingleQuotedStyle + uStr, err = nodes.Updated().String() + if err != nil { + return strValues{}, err + } + } + if nodes.Origin() != nil && nodes.Origin().YNode() != nil { + s := nodes.Origin().YNode().Style + defer func() { + nodes.Origin().YNode().Style = s + }() + nodes.Origin().YNode().Style = yaml.FlowStyle | yaml.SingleQuotedStyle + oStr, err = nodes.Origin().String() + if err != nil { + return strValues{}, err + } + } + if nodes.Dest() != nil && nodes.Dest().YNode() != nil { + s := nodes.Dest().YNode().Style + defer func() { + nodes.Dest().YNode().Style = s + }() + nodes.Dest().YNode().Style = yaml.FlowStyle | yaml.SingleQuotedStyle + dStr, err = nodes.Dest().String() + if err != nil { + return strValues{}, err + } + } + + return strValues{Origin: oStr, Update: uStr, Dest: dStr}, nil +} + +type strValues struct { + Origin string + Update string + Dest string +} + +var _ walk.Visitor = Visitor{} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/yaml/order.go b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/order.go new file mode 100644 index 000000000000..4e01c648957d --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/order.go @@ -0,0 +1,107 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package yaml + +// fieldSortOrder contains the relative ordering of fields when formatting an +// object. +var fieldSortOrder = []string{ + // top-level metadata + "name", "generateName", "namespace", "clusterName", + "apiVersion", "kind", "metadata", "type", + "labels", "annotations", + "spec", "status", + + // secret and configmap + "stringData", "data", "binaryData", + + // cronjobspec, daemonsetspec, deploymentspec, statefulsetspec, + // jobspec fields + "parallelism", "completions", "activeDeadlineSeconds", "backoffLimit", + "replicas", "selector", "manualSelector", "template", + "ttlSecondsAfterFinished", "volumeClaimTemplates", "service", "serviceName", + "podManagementPolicy", "updateStrategy", "strategy", "minReadySeconds", + "revision", "revisionHistoryLimit", "paused", "progressDeadlineSeconds", + + // podspec + // podspec scalars + "restartPolicy", "terminationGracePeriodSeconds", + "activeDeadlineSeconds", "dnsPolicy", "serviceAccountName", + "serviceAccount", "automountServiceAccountToken", "nodeName", + "hostNetwork", "hostPID", "hostIPC", "shareProcessNamespace", "hostname", + "subdomain", "schedulerName", "priorityClassName", "priority", + "runtimeClassName", "enableServiceLinks", + + // podspec lists and maps + "nodeSelector", "hostAliases", + + // podspec objects + "initContainers", "containers", "volumes", "securityContext", + "imagePullSecrets", "affinity", "tolerations", "dnsConfig", + "readinessGates", + + // containers + "image", "command", "args", "workingDir", "ports", "envFrom", "env", + "resources", "volumeMounts", "volumeDevices", "livenessProbe", + "readinessProbe", "lifecycle", "terminationMessagePath", + "terminationMessagePolicy", "imagePullPolicy", "securityContext", + "stdin", "stdinOnce", "tty", + + // service + "clusterIP", "externalIPs", "loadBalancerIP", "loadBalancerSourceRanges", + "externalName", "externalTrafficPolicy", "sessionAffinity", + + // ports + "protocol", "port", "targetPort", "hostPort", "containerPort", "hostIP", + + // volumemount + "readOnly", "mountPath", "subPath", "subPathExpr", "mountPropagation", + + // envvar + envvarsource + "value", "valueFrom", "fieldRef", "resourceFieldRef", "configMapKeyRef", + "secretKeyRef", "prefix", "configMapRef", "secretRef", +} + +type set map[string]interface{} + +func newSet(values ...string) set { + m := map[string]interface{}{} + for _, value := range values { + m[value] = nil + } + return m +} + +func (s set) Has(key string) bool { + _, found := s[key] + return found +} + +// WhitelistedListSortKinds contains the set of kinds that are whitelisted +// for sorting list field elements +var WhitelistedListSortKinds = newSet( + "CronJob", "DaemonSet", "Deployment", "Job", "ReplicaSet", "StatefulSet", + "ValidatingWebhookConfiguration") + +// WhitelistedListSortApis contains the set of apis that are whitelisted for +// sorting list field elements +var WhitelistedListSortApis = newSet( + "apps/v1", "apps/v1beta1", "apps/v1beta2", "batch/v1", "batch/v1beta1", + "extensions/v1beta1", "v1", "admissionregistration.k8s.io/v1") + +// WhitelistedListSortFields contains json paths to list fields that should +// be sorted, and the field they should be sorted by +var WhitelistedListSortFields = map[string]string{ + ".spec.template.spec.containers": "name", + ".webhooks.rules.operations": "", +} + +// FieldOrder indexes fields and maps them to relative precedence +var FieldOrder = func() map[string]int { + // create an index of field orderings + fo := map[string]int{} + for i, f := range fieldSortOrder { + fo[f] = i + 1 + } + return fo +}() diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/yaml/rnode.go b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/rnode.go new file mode 100644 index 000000000000..22e5d326efa4 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/rnode.go @@ -0,0 +1,861 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package yaml + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "log" + "strconv" + "strings" + + "gopkg.in/yaml.v3" + "sigs.k8s.io/kustomize/kyaml/errors" + "sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/labels" +) + +// MakeNullNode returns an RNode that represents an empty document. +func MakeNullNode() *RNode { + return NewRNode(&Node{Tag: NodeTagNull}) +} + +// IsMissingOrNull is true if the RNode is nil or explicitly tagged null. +// TODO: make this a method on RNode. +func IsMissingOrNull(node *RNode) bool { + return node.IsNil() || node.YNode().Tag == NodeTagNull +} + +// IsEmptyMap returns true if the RNode is an empty node or an empty map. +// TODO: make this a method on RNode. +func IsEmptyMap(node *RNode) bool { + return IsMissingOrNull(node) || IsYNodeEmptyMap(node.YNode()) +} + +// GetValue returns underlying yaml.Node Value field +func GetValue(node *RNode) string { + if IsMissingOrNull(node) { + return "" + } + return node.YNode().Value +} + +// Parse parses a yaml string into an *RNode. +// To parse multiple resources, consider a kio.ByteReader +func Parse(value string) (*RNode, error) { + return Parser{Value: value}.Filter(nil) +} + +// ReadFile parses a single Resource from a yaml file. +// To parse multiple resources, consider a kio.ByteReader +func ReadFile(path string) (*RNode, error) { + b, err := ioutil.ReadFile(path) + if err != nil { + return nil, err + } + return Parse(string(b)) +} + +// WriteFile writes a single Resource to a yaml file +func WriteFile(node *RNode, path string) error { + out, err := node.String() + if err != nil { + return err + } + return ioutil.WriteFile(path, []byte(out), 0600) +} + +// UpdateFile reads the file at path, applies the filter to it, and write the result back. +// path must contain a exactly 1 resource (YAML). +func UpdateFile(filter Filter, path string) error { + // Read the yaml + y, err := ReadFile(path) + if err != nil { + return err + } + + // Update the yaml + if err := y.PipeE(filter); err != nil { + return err + } + + // Write the yaml + return WriteFile(y, path) +} + +// MustParse parses a yaml string into an *RNode and panics if there is an error +func MustParse(value string) *RNode { + v, err := Parser{Value: value}.Filter(nil) + if err != nil { + panic(err) + } + return v +} + +// NewScalarRNode returns a new Scalar *RNode containing the provided scalar value. +func NewScalarRNode(value string) *RNode { + return &RNode{ + value: &yaml.Node{ + Kind: yaml.ScalarNode, + Value: value, + }} +} + +// NewStringRNode returns a new Scalar *RNode containing the provided string. +// If the string is non-utf8, it will be base64 encoded, and the tag +// will indicate binary data. +func NewStringRNode(value string) *RNode { + n := yaml.Node{Kind: yaml.ScalarNode} + n.SetString(value) + return NewRNode(&n) +} + +// NewListRNode returns a new List *RNode containing the provided scalar values. +func NewListRNode(values ...string) *RNode { + seq := &RNode{value: &yaml.Node{Kind: yaml.SequenceNode}} + for _, v := range values { + seq.value.Content = append(seq.value.Content, &yaml.Node{ + Kind: yaml.ScalarNode, + Value: v, + }) + } + return seq +} + +// NewMapRNode returns a new Map *RNode containing the provided values +func NewMapRNode(values *map[string]string) *RNode { + m := &RNode{value: &yaml.Node{ + Kind: yaml.MappingNode, + }} + if values == nil { + return m + } + + for k, v := range *values { + m.value.Content = append(m.value.Content, &yaml.Node{ + Kind: yaml.ScalarNode, + Value: k, + }, &yaml.Node{ + Kind: yaml.ScalarNode, + Value: v, + }) + } + + return m +} + +// NewRNode returns a new RNode pointer containing the provided Node. +func NewRNode(value *yaml.Node) *RNode { + return &RNode{value: value} +} + +// RNode provides functions for manipulating Kubernetes Resources +// Objects unmarshalled into *yaml.Nodes +type RNode struct { + // fieldPath contains the path from the root of the KubernetesObject to + // this field. + // Only field names are captured in the path. + // e.g. a image field in a Deployment would be + // 'spec.template.spec.containers.image' + fieldPath []string + + // FieldValue contains the value. + // FieldValue is always set: + // field: field value + // list entry: list entry value + // object root: object root + value *yaml.Node + + Match []string +} + +// Copy returns a distinct copy. +func (rn *RNode) Copy() *RNode { + if rn == nil { + return nil + } + result := *rn + result.value = CopyYNode(rn.value) + return &result +} + +var ErrMissingMetadata = fmt.Errorf("missing Resource metadata") + +// IsNil is true if the node is nil, or its underlying YNode is nil. +func (rn *RNode) IsNil() bool { + return rn == nil || rn.YNode() == nil +} + +// IsTaggedNull is true if a non-nil node is explicitly tagged Null. +func (rn *RNode) IsTaggedNull() bool { + return !rn.IsNil() && IsYNodeTaggedNull(rn.YNode()) +} + +// IsNilOrEmpty is true if the node is nil, +// has no YNode, or has YNode that appears empty. +func (rn *RNode) IsNilOrEmpty() bool { + return rn.IsNil() || + IsYNodeTaggedNull(rn.YNode()) || + IsYNodeEmptyMap(rn.YNode()) || + IsYNodeEmptySeq(rn.YNode()) || + IsYNodeZero(rn.YNode()) +} + +// GetMeta returns the ResourceMeta for an RNode +func (rn *RNode) GetMeta() (ResourceMeta, error) { + if IsMissingOrNull(rn) { + return ResourceMeta{}, nil + } + missingMeta := true + n := rn + if n.YNode().Kind == DocumentNode { + // get the content is this is the document node + n = NewRNode(n.Content()[0]) + } + + // don't decode into the struct directly or it will fail on UTF-8 issues + // which appear in comments + m := ResourceMeta{} + + // TODO: consider optimizing this parsing + if f := n.Field(APIVersionField); !f.IsNilOrEmpty() { + m.APIVersion = GetValue(f.Value) + missingMeta = false + } + if f := n.Field(KindField); !f.IsNilOrEmpty() { + m.Kind = GetValue(f.Value) + missingMeta = false + } + + mf := n.Field(MetadataField) + if mf.IsNilOrEmpty() { + if missingMeta { + return m, ErrMissingMetadata + } + return m, nil + } + meta := mf.Value + + if f := meta.Field(NameField); !f.IsNilOrEmpty() { + m.Name = f.Value.YNode().Value + missingMeta = false + } + if f := meta.Field(NamespaceField); !f.IsNilOrEmpty() { + m.Namespace = GetValue(f.Value) + missingMeta = false + } + + if f := meta.Field(LabelsField); !f.IsNilOrEmpty() { + m.Labels = map[string]string{} + _ = f.Value.VisitFields(func(node *MapNode) error { + m.Labels[GetValue(node.Key)] = GetValue(node.Value) + return nil + }) + missingMeta = false + } + if f := meta.Field(AnnotationsField); !f.IsNilOrEmpty() { + m.Annotations = map[string]string{} + _ = f.Value.VisitFields(func(node *MapNode) error { + m.Annotations[GetValue(node.Key)] = GetValue(node.Value) + return nil + }) + missingMeta = false + } + + if missingMeta { + return m, ErrMissingMetadata + } + return m, nil +} + +// Pipe sequentially invokes each Filter, and passes the result to the next +// Filter. +// +// Analogous to http://www.linfo.org/pipes.html +// +// * rn is provided as input to the first Filter. +// * if any Filter returns an error, immediately return the error +// * if any Filter returns a nil RNode, immediately return nil, nil +// * if all Filters succeed with non-empty results, return the final result +func (rn *RNode) Pipe(functions ...Filter) (*RNode, error) { + // check if rn is nil to make chaining Pipe calls easier + if rn == nil { + return nil, nil + } + + var v *RNode + var err error + if rn.value != nil && rn.value.Kind == yaml.DocumentNode { + // the first node may be a DocumentNode containing a single MappingNode + v = &RNode{value: rn.value.Content[0]} + } else { + v = rn + } + + // return each fn in sequence until encountering an error or missing value + for _, c := range functions { + v, err = c.Filter(v) + if err != nil || v == nil { + return v, errors.Wrap(err) + } + } + return v, err +} + +// PipeE runs Pipe, dropping the *RNode return value. +// Useful for directly returning the Pipe error value from functions. +func (rn *RNode) PipeE(functions ...Filter) error { + _, err := rn.Pipe(functions...) + return errors.Wrap(err) +} + +// Document returns the Node for the value. +func (rn *RNode) Document() *yaml.Node { + return rn.value +} + +// YNode returns the yaml.Node value. If the yaml.Node value is a DocumentNode, +// YNode will return the DocumentNode Content entry instead of the DocumentNode. +func (rn *RNode) YNode() *yaml.Node { + if rn == nil || rn.value == nil { + return nil + } + if rn.value.Kind == yaml.DocumentNode { + return rn.value.Content[0] + } + return rn.value +} + +// SetYNode sets the yaml.Node value on an RNode. +func (rn *RNode) SetYNode(node *yaml.Node) { + if rn.value == nil || node == nil { + rn.value = node + return + } + *rn.value = *node +} + +// GetNamespace gets the metadata namespace field. +func (rn *RNode) GetNamespace() (string, error) { + meta, err := rn.GetMeta() + if err != nil { + return "", err + } + return meta.Namespace, nil +} + +// SetNamespace tries to set the metadata namespace field. +func (rn *RNode) SetNamespace(ns string) error { + meta, err := rn.Pipe(Lookup(MetadataField)) + if err != nil { + return err + } + if ns == "" { + if rn == nil { + return nil + } + return meta.PipeE(Clear(NamespaceField)) + } + return rn.SetMapField( + NewScalarRNode(ns), MetadataField, NamespaceField) +} + +// GetAnnotations gets the metadata annotations field. +func (rn *RNode) GetAnnotations() (map[string]string, error) { + meta, err := rn.GetMeta() + if err != nil { + return nil, err + } + return meta.Annotations, nil +} + +// SetAnnotations tries to set the metadata annotations field. +func (rn *RNode) SetAnnotations(m map[string]string) error { + return rn.setMapInMetadata(m, AnnotationsField) +} + +// GetLabels gets the metadata labels field. +func (rn *RNode) GetLabels() (map[string]string, error) { + meta, err := rn.GetMeta() + if err != nil { + return nil, err + } + return meta.Labels, nil +} + +// SetLabels sets the metadata labels field. +func (rn *RNode) SetLabels(m map[string]string) error { + return rn.setMapInMetadata(m, LabelsField) +} + +// This established proper quoting on string values, and sorts by key. +func (rn *RNode) setMapInMetadata(m map[string]string, field string) error { + meta, err := rn.Pipe(Lookup(MetadataField)) + if err != nil { + return err + } + if err = meta.PipeE(Clear(field)); err != nil { + return err + } + if len(m) == 0 { + return nil + } + mapNode, err := meta.Pipe(LookupCreate(MappingNode, field)) + if err != nil { + return err + } + for _, k := range SortedMapKeys(m) { + if _, err := mapNode.Pipe( + SetField(k, NewStringRNode(m[k]))); err != nil { + return err + } + } + return nil +} + +func (rn *RNode) SetMapField(value *RNode, path ...string) error { + return rn.PipeE( + LookupCreate(yaml.MappingNode, path[0:len(path)-1]...), + SetField(path[len(path)-1], value), + ) +} + +func (rn *RNode) GetDataMap() map[string]string { + n, err := rn.Pipe(Lookup(DataField)) + if err != nil { + return nil + } + result := map[string]string{} + _ = n.VisitFields(func(node *MapNode) error { + result[GetValue(node.Key)] = GetValue(node.Value) + return nil + }) + return result +} + +func (rn *RNode) GetBinaryDataMap() map[string]string { + n, err := rn.Pipe(Lookup(BinaryDataField)) + if err != nil { + return nil + } + result := map[string]string{} + _ = n.VisitFields(func(node *MapNode) error { + result[GetValue(node.Key)] = GetValue(node.Value) + return nil + }) + return result +} + +func (rn *RNode) SetDataMap(m map[string]string) { + if rn == nil { + log.Fatal("cannot set data map on nil Rnode") + } + if err := rn.PipeE(Clear(DataField)); err != nil { + log.Fatal(err) + } + if len(m) == 0 { + return + } + if err := rn.LoadMapIntoConfigMapData(m); err != nil { + log.Fatal(err) + } +} + +func (rn *RNode) SetBinaryDataMap(m map[string]string) { + if rn == nil { + log.Fatal("cannot set binaryData map on nil Rnode") + } + if err := rn.PipeE(Clear(BinaryDataField)); err != nil { + log.Fatal(err) + } + if len(m) == 0 { + return + } + if err := rn.LoadMapIntoConfigMapBinaryData(m); err != nil { + log.Fatal(err) + } +} + +// AppendToFieldPath appends a field name to the FieldPath. +func (rn *RNode) AppendToFieldPath(parts ...string) { + rn.fieldPath = append(rn.fieldPath, parts...) +} + +// FieldPath returns the field path from the Resource root node, to rn. +// Does not include list indexes. +func (rn *RNode) FieldPath() []string { + return rn.fieldPath +} + +// String returns string representation of the RNode +func (rn *RNode) String() (string, error) { + if rn == nil { + return "", nil + } + return String(rn.value) +} + +// MustString returns string representation of the RNode or panics if there is an error +func (rn *RNode) MustString() string { + s, err := rn.String() + if err != nil { + panic(err) + } + return s +} + +// Content returns Node Content field. +func (rn *RNode) Content() []*yaml.Node { + if rn == nil { + return nil + } + return rn.YNode().Content +} + +// Fields returns the list of field names for a MappingNode. +// Returns an error for non-MappingNodes. +func (rn *RNode) Fields() ([]string, error) { + if err := ErrorIfInvalid(rn, yaml.MappingNode); err != nil { + return nil, errors.Wrap(err) + } + var fields []string + for i := 0; i < len(rn.Content()); i += 2 { + fields = append(fields, rn.Content()[i].Value) + } + return fields, nil +} + +// FieldRNodes returns the list of field key RNodes for a MappingNode. +// Returns an error for non-MappingNodes. +func (rn *RNode) FieldRNodes() ([]*RNode, error) { + if err := ErrorIfInvalid(rn, yaml.MappingNode); err != nil { + return nil, errors.Wrap(err) + } + var fields []*RNode + for i := 0; i < len(rn.Content()); i += 2 { + yNode := rn.Content()[i] + // for each key node in the input mapping node contents create equivalent rNode + rNode := &RNode{} + rNode.SetYNode(yNode) + fields = append(fields, rNode) + } + return fields, nil +} + +// Field returns a fieldName, fieldValue pair for MappingNodes. +// Returns nil for non-MappingNodes. +func (rn *RNode) Field(field string) *MapNode { + if rn.YNode().Kind != yaml.MappingNode { + return nil + } + for i := 0; i < len(rn.Content()); i = IncrementFieldIndex(i) { + isMatchingField := rn.Content()[i].Value == field + if isMatchingField { + return &MapNode{Key: NewRNode(rn.Content()[i]), Value: NewRNode(rn.Content()[i+1])} + } + } + return nil +} + +// VisitFields calls fn for each field in the RNode. +// Returns an error for non-MappingNodes. +func (rn *RNode) VisitFields(fn func(node *MapNode) error) error { + // get the list of srcFieldNames + srcFieldNames, err := rn.Fields() + if err != nil { + return errors.Wrap(err) + } + + // visit each field + for _, fieldName := range srcFieldNames { + if err := fn(rn.Field(fieldName)); err != nil { + return errors.Wrap(err) + } + } + return nil +} + +// Elements returns the list of elements in the RNode. +// Returns an error for non-SequenceNodes. +func (rn *RNode) Elements() ([]*RNode, error) { + if err := ErrorIfInvalid(rn, yaml.SequenceNode); err != nil { + return nil, errors.Wrap(err) + } + var elements []*RNode + for i := 0; i < len(rn.Content()); i++ { + elements = append(elements, NewRNode(rn.Content()[i])) + } + return elements, nil +} + +// ElementValues returns a list of all observed values for a given field name +// in a list of elements. +// Returns error for non-SequenceNodes. +func (rn *RNode) ElementValues(key string) ([]string, error) { + if err := ErrorIfInvalid(rn, yaml.SequenceNode); err != nil { + return nil, errors.Wrap(err) + } + var elements []string + for i := 0; i < len(rn.Content()); i++ { + field := NewRNode(rn.Content()[i]).Field(key) + if !field.IsNilOrEmpty() { + elements = append(elements, field.Value.YNode().Value) + } + } + return elements, nil +} + +// ElementValuesList returns a list of lists, where each list is a set of +// values corresponding to each key in keys. +// Returns error for non-SequenceNodes. +func (rn *RNode) ElementValuesList(keys []string) ([][]string, error) { + if err := ErrorIfInvalid(rn, yaml.SequenceNode); err != nil { + return nil, errors.Wrap(err) + } + elements := make([][]string, len(rn.Content())) + + for i := 0; i < len(rn.Content()); i++ { + for _, key := range keys { + field := NewRNode(rn.Content()[i]).Field(key) + if field.IsNilOrEmpty() { + elements[i] = append(elements[i], "") + } else { + elements[i] = append(elements[i], field.Value.YNode().Value) + } + } + } + return elements, nil +} + +// Element returns the element in the list which contains the field matching the value. +// Returns nil for non-SequenceNodes or if no Element matches. +func (rn *RNode) Element(key, value string) *RNode { + if rn.YNode().Kind != yaml.SequenceNode { + return nil + } + elem, err := rn.Pipe(MatchElement(key, value)) + if err != nil { + return nil + } + return elem +} + +// ElementList returns the element in the list in which all fields keys[i] matches all +// corresponding values[i]. +// Returns nil for non-SequenceNodes or if no Element matches. +func (rn *RNode) ElementList(keys []string, values []string) *RNode { + if rn.YNode().Kind != yaml.SequenceNode { + return nil + } + elem, err := rn.Pipe(MatchElementList(keys, values)) + if err != nil { + return nil + } + return elem +} + +// VisitElements calls fn for each element in a SequenceNode. +// Returns an error for non-SequenceNodes +func (rn *RNode) VisitElements(fn func(node *RNode) error) error { + elements, err := rn.Elements() + if err != nil { + return errors.Wrap(err) + } + + for i := range elements { + if err := fn(elements[i]); err != nil { + return errors.Wrap(err) + } + } + return nil +} + +// AssociativeSequenceKeys is a map of paths to sequences that have associative keys. +// The order sets the precedence of the merge keys -- if multiple keys are present +// in Resources in a list, then the FIRST key which ALL elements in the list have is used as the +// associative key for merging that list. +// Only infer name as a merge key. +var AssociativeSequenceKeys = []string{"name"} + +// IsAssociative returns true if the RNode contains an AssociativeSequenceKey as a field. +func (rn *RNode) IsAssociative() bool { + return rn.GetAssociativeKey() != "" +} + +// GetAssociativeKey returns the AssociativeSequenceKey used to merge the elements in the +// SequenceNode, or "" if the list is not associative. +func (rn *RNode) GetAssociativeKey() string { + // look for any associative keys in the first element + for _, key := range AssociativeSequenceKeys { + if checkKey(key, rn.Content()) { + return key + } + } + + // element doesn't have an associative keys + return "" +} + +// MarshalJSON creates a byte slice from the RNode. +func (rn *RNode) MarshalJSON() ([]byte, error) { + s, err := rn.String() + if err != nil { + return nil, err + } + + if rn.YNode().Kind == SequenceNode { + var a []interface{} + if err := Unmarshal([]byte(s), &a); err != nil { + return nil, err + } + return json.Marshal(a) + } + + m := map[string]interface{}{} + if err := Unmarshal([]byte(s), &m); err != nil { + return nil, err + } + return json.Marshal(m) +} + +// UnmarshalJSON overwrites this RNode with data from []byte. +func (rn *RNode) UnmarshalJSON(b []byte) error { + m := map[string]interface{}{} + if err := json.Unmarshal(b, &m); err != nil { + return err + } + r, err := FromMap(m) + if err != nil { + return err + } + rn.value = r.value + return nil +} + +// GetValidatedMetadata returns metadata after subjecting it to some tests. +func (rn *RNode) GetValidatedMetadata() (ResourceMeta, error) { + m, err := rn.GetMeta() + if err != nil { + return m, err + } + if m.Kind == "" { + return m, fmt.Errorf("missing kind in object %v", m) + } + if strings.HasSuffix(m.Kind, "List") { + // A list doesn't require a name. + return m, nil + } + if m.NameMeta.Name == "" { + return m, fmt.Errorf("missing metadata.name in object %v", m) + } + return m, nil +} + +// MatchesAnnotationSelector implements ifc.Kunstructured. +func (rn *RNode) MatchesAnnotationSelector(selector string) (bool, error) { + s, err := labels.Parse(selector) + if err != nil { + return false, err + } + slice, err := rn.GetAnnotations() + if err != nil { + return false, err + } + return s.Matches(labels.Set(slice)), nil +} + +// MatchesLabelSelector implements ifc.Kunstructured. +func (rn *RNode) MatchesLabelSelector(selector string) (bool, error) { + s, err := labels.Parse(selector) + if err != nil { + return false, err + } + slice, err := rn.GetLabels() + if err != nil { + return false, err + } + return s.Matches(labels.Set(slice)), nil +} + +// HasNilEntryInList returns true if the RNode contains a list which has +// a nil item, along with the path to the missing item. +// TODO(broken): This was copied from +// api/k8sdeps/kunstruct/factory.go//checkListItemNil +// and doesn't do what it claims to do (see TODO in unit test and pr 1513). +func (rn *RNode) HasNilEntryInList() (bool, string) { + return hasNilEntryInList(rn.value) +} + +func hasNilEntryInList(in interface{}) (bool, string) { + switch v := in.(type) { + case map[string]interface{}: + for key, s := range v { + if result, path := hasNilEntryInList(s); result { + return result, key + "/" + path + } + } + case []interface{}: + for index, s := range v { + if s == nil { + return true, "" + } + if result, path := hasNilEntryInList(s); result { + return result, "[" + strconv.Itoa(index) + "]/" + path + } + } + } + return false, "" +} + +func FromMap(m map[string]interface{}) (*RNode, error) { + c, err := Marshal(m) + if err != nil { + return nil, err + } + return Parse(string(c)) +} + +func (rn *RNode) Map() (map[string]interface{}, error) { + if rn == nil || rn.value == nil { + return make(map[string]interface{}), nil + } + var result map[string]interface{} + if err := rn.value.Decode(&result); err != nil { + // Should not be able to create an RNode that cannot be decoded; + // this is an unrecoverable error. + str, _ := rn.String() + return nil, fmt.Errorf("received error %w for the following resource:\n%s", err, str) + } + return result, nil +} + +// ConvertJSONToYamlNode parses input json string and returns equivalent yaml node +func ConvertJSONToYamlNode(jsonStr string) (*RNode, error) { + var body map[string]interface{} + err := json.Unmarshal([]byte(jsonStr), &body) + if err != nil { + return nil, err + } + yml, err := yaml.Marshal(body) + if err != nil { + return nil, err + } + node, err := Parse(string(yml)) + if err != nil { + return nil, err + } + return node, nil +} + +// checkKey returns true if all elems have the key +func checkKey(key string, elems []*Node) bool { + count := 0 + for i := range elems { + elem := NewRNode(elems[i]) + if elem.Field(key) != nil { + count++ + } + } + return count == len(elems) +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/yaml/schema/schema.go b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/schema/schema.go new file mode 100644 index 000000000000..9ee592f84785 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/schema/schema.go @@ -0,0 +1,44 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +// Package schema contains libraries for working with the yaml and openapi packages. +package schema + +import ( + "strings" + + "sigs.k8s.io/kustomize/kyaml/openapi" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +// IsAssociative returns true if all elements in the list contain an +// AssociativeSequenceKey as a field. +func IsAssociative(schema *openapi.ResourceSchema, nodes []*yaml.RNode, infer bool) bool { + if schema != nil { + return schemaHasMergeStrategy(schema) + } + if !infer { + return false + } + for i := range nodes { + node := nodes[i] + if yaml.IsMissingOrNull(node) { + continue + } + if node.IsAssociative() { + return true + } + } + return false +} + +func schemaHasMergeStrategy(schema *openapi.ResourceSchema) bool { + tmp, _ := schema.PatchStrategyAndKey() + strategies := strings.Split(tmp, ",") + for _, s := range strategies { + if s == "merge" { + return true + } + } + return false +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/yaml/serialization.go b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/serialization.go new file mode 100644 index 000000000000..92510c5185dd --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/serialization.go @@ -0,0 +1,76 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package yaml + +import "gopkg.in/yaml.v3" + +func DoSerializationHacksOnNodes(nodes []*RNode) { + for _, node := range nodes { + DoSerializationHacks(node.YNode()) + } +} + +// DoSerializationHacks addresses a bug in yaml V3 upstream, it parses the yaml node, +// and rearranges the head comments of the children of sequence node. +// Refer to https://github.com/go-yaml/yaml/issues/587 for more details +func DoSerializationHacks(node *yaml.Node) { + switch node.Kind { + case DocumentNode: + for _, node := range node.Content { + DoSerializationHacks(node) + } + + case MappingNode: + for _, node := range node.Content { + DoSerializationHacks(node) + } + + case SequenceNode: + for _, node := range node.Content { + // for each child mapping node, transfer the head comment of it's + // first child scalar node to the head comment of itself + // This is necessary to address serialization issue + // https://github.com/go-yaml/yaml/issues/587 in go-yaml.v3 + // Remove this hack when the issue has been resolved + if len(node.Content) > 0 && node.Content[0].Kind == ScalarNode { + node.HeadComment = node.Content[0].HeadComment + node.Content[0].HeadComment = "" + } + } + } +} + +func UndoSerializationHacksOnNodes(nodes []*RNode) { + for _, node := range nodes { + UndoSerializationHacks(node.YNode()) + } +} + +// UndoSerializationHacks reverts the changes made by DoSerializationHacks +// Refer to https://github.com/go-yaml/yaml/issues/587 for more details +func UndoSerializationHacks(node *yaml.Node) { + switch node.Kind { + case DocumentNode: + for _, node := range node.Content { + DoSerializationHacks(node) + } + + case MappingNode: + for _, node := range node.Content { + DoSerializationHacks(node) + } + + case SequenceNode: + for _, node := range node.Content { + // revert the changes made in DoSerializationHacks + // This is necessary to address serialization issue + // https://github.com/go-yaml/yaml/issues/587 in go-yaml.v3 + // Remove this hack when the issue has been resolved + if len(node.Content) > 0 && node.Content[0].Kind == ScalarNode { + node.Content[0].HeadComment = node.HeadComment + node.HeadComment = "" + } + } + } +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/yaml/types.go b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/types.go new file mode 100644 index 000000000000..2c424e50806e --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/types.go @@ -0,0 +1,237 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package yaml + +import ( + "bytes" + "strings" + + "gopkg.in/yaml.v3" + "sigs.k8s.io/kustomize/kyaml/errors" + "sigs.k8s.io/kustomize/kyaml/sets" +) + +// CopyYNode returns a distinct copy of its argument. +// Use https://github.com/jinzhu/copier instead? +func CopyYNode(n *yaml.Node) *yaml.Node { + if n == nil { + return nil + } + c := *n + if len(n.Content) > 0 { + // Using Go 'copy' here doesn't yield independent slices. + c.Content = make([]*Node, len(n.Content)) + for i, item := range n.Content { + c.Content[i] = CopyYNode(item) + } + } + return &c +} + +// IsYNodeTaggedNull returns true if the node is explicitly tagged Null. +func IsYNodeTaggedNull(n *yaml.Node) bool { + return n != nil && n.Tag == NodeTagNull +} + +// IsYNodeEmptyMap is true if the Node is a non-nil empty map. +func IsYNodeEmptyMap(n *yaml.Node) bool { + return n != nil && n.Kind == yaml.MappingNode && len(n.Content) == 0 +} + +// IsYNodeEmptyMap is true if the Node is a non-nil empty sequence. +func IsYNodeEmptySeq(n *yaml.Node) bool { + return n != nil && n.Kind == yaml.SequenceNode && len(n.Content) == 0 +} + +// IsYNodeEmptyDoc is true if the node is a Document with no content. +// E.g.: "---\n---" +func IsYNodeEmptyDoc(n *yaml.Node) bool { + return n.Kind == yaml.DocumentNode && n.Content[0].Tag == NodeTagNull +} + +func IsYNodeString(n *yaml.Node) bool { + return n.Kind == yaml.ScalarNode && + (n.Tag == NodeTagString || n.Tag == NodeTagEmpty) +} + +// IsYNodeZero is true if all the public fields in the Node are empty. +// Which means it's not initialized and should be omitted when marshal. +// The Node itself has a method IsZero but it is not released +// in yaml.v3. https://pkg.go.dev/gopkg.in/yaml.v3#Node.IsZero +func IsYNodeZero(n *yaml.Node) bool { + // TODO: Change this to use IsZero when it's avaialable. + return n != nil && n.Kind == 0 && n.Style == 0 && n.Tag == "" && n.Value == "" && + n.Anchor == "" && n.Alias == nil && n.Content == nil && + n.HeadComment == "" && n.LineComment == "" && n.FootComment == "" && + n.Line == 0 && n.Column == 0 +} + +// Parser parses values into configuration. +type Parser struct { + Kind string `yaml:"kind,omitempty"` + Value string `yaml:"value,omitempty"` +} + +func (p Parser) Filter(_ *RNode) (*RNode, error) { + d := yaml.NewDecoder(bytes.NewBuffer([]byte(p.Value))) + o := &RNode{value: &yaml.Node{}} + return o, d.Decode(o.value) +} + +// TODO(pwittrock): test this +func GetStyle(styles ...string) Style { + var style Style + for _, s := range styles { + switch s { + case "TaggedStyle": + style |= TaggedStyle + case "DoubleQuotedStyle": + style |= DoubleQuotedStyle + case "SingleQuotedStyle": + style |= SingleQuotedStyle + case "LiteralStyle": + style |= LiteralStyle + case "FoldedStyle": + style |= FoldedStyle + case "FlowStyle": + style |= FlowStyle + } + } + return style +} + +// Filter defines a function to manipulate an individual RNode such as by changing +// its values, or returning a field. +// +// When possible, Filters should be serializable to yaml so that they can be described +// declaratively as data. +// +// Analogous to http://www.linfo.org/filters.html +type Filter interface { + Filter(object *RNode) (*RNode, error) +} + +type FilterFunc func(object *RNode) (*RNode, error) + +func (f FilterFunc) Filter(object *RNode) (*RNode, error) { + return f(object) +} + +// TypeMeta partially copies apimachinery/pkg/apis/meta/v1.TypeMeta +// No need for a direct dependence; the fields are stable. +type TypeMeta struct { + // APIVersion is the apiVersion field of a Resource + APIVersion string `json:"apiVersion,omitempty" yaml:"apiVersion,omitempty"` + // Kind is the kind field of a Resource + Kind string `json:"kind,omitempty" yaml:"kind,omitempty"` +} + +// NameMeta contains name information. +type NameMeta struct { + // Name is the metadata.name field of a Resource + Name string `json:"name,omitempty" yaml:"name,omitempty"` + // Namespace is the metadata.namespace field of a Resource + Namespace string `json:"namespace,omitempty" yaml:"namespace,omitempty"` +} + +// ResourceMeta contains the metadata for a both Resource Type and Resource. +type ResourceMeta struct { + TypeMeta `json:",inline" yaml:",inline"` + // ObjectMeta is the metadata field of a Resource + ObjectMeta `yaml:"metadata,omitempty"` +} + +// ObjectMeta contains metadata about a Resource +type ObjectMeta struct { + NameMeta `json:",inline" yaml:",inline"` + // Labels is the metadata.labels field of a Resource + Labels map[string]string `yaml:"labels,omitempty"` + // Annotations is the metadata.annotations field of a Resource. + Annotations map[string]string `yaml:"annotations,omitempty"` +} + +// GetIdentifier returns a ResourceIdentifier that includes +// the information needed to uniquely identify a resource in a cluster. +func (m *ResourceMeta) GetIdentifier() ResourceIdentifier { + return ResourceIdentifier{ + TypeMeta: m.TypeMeta, + NameMeta: m.NameMeta, + } +} + +// ResourceIdentifier contains the information needed to uniquely +// identify a resource in a cluster. +type ResourceIdentifier struct { + TypeMeta `json:",inline" yaml:",inline"` + NameMeta `json:",inline" yaml:",inline"` +} + +// Comments struct is comment yaml comment types +type Comments struct { + LineComment string `yaml:"lineComment,omitempty"` + HeadComment string `yaml:"headComment,omitempty"` + FootComment string `yaml:"footComment,omitempty"` +} + +func (r *ResourceIdentifier) GetName() string { + return r.Name +} + +func (r *ResourceIdentifier) GetNamespace() string { + return r.Namespace +} + +func (r *ResourceIdentifier) GetAPIVersion() string { + return r.APIVersion +} + +func (r *ResourceIdentifier) GetKind() string { + return r.Kind +} + +const ( + Trim = "Trim" + Flow = "Flow" +) + +// String returns a string value for a Node, applying the supplied formatting options +func String(node *yaml.Node, opts ...string) (string, error) { + if node == nil { + return "", nil + } + optsSet := sets.String{} + optsSet.Insert(opts...) + if optsSet.Has(Flow) { + oldStyle := node.Style + defer func() { + node.Style = oldStyle + }() + node.Style = yaml.FlowStyle + } + + b := &bytes.Buffer{} + e := NewEncoder(b) + err := e.Encode(node) + e.Close() + val := b.String() + if optsSet.Has(Trim) { + val = strings.TrimSpace(val) + } + return val, errors.Wrap(err) +} + +// MergeOptionsListIncreaseDirection is the type of list growth in merge +type MergeOptionsListIncreaseDirection int + +const ( + MergeOptionsListAppend MergeOptionsListIncreaseDirection = iota + MergeOptionsListPrepend +) + +// MergeOptions is a struct which contains the options for merge +type MergeOptions struct { + // ListIncreaseDirection indicates should merge function prepend the items from + // source list to destination or append. + ListIncreaseDirection MergeOptionsListIncreaseDirection +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/yaml/walk/associative_sequence.go b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/walk/associative_sequence.go new file mode 100644 index 000000000000..3b6222a9a4b5 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/walk/associative_sequence.go @@ -0,0 +1,326 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package walk + +import ( + "strings" + + "github.com/go-errors/errors" + "sigs.k8s.io/kustomize/kyaml/openapi" + "sigs.k8s.io/kustomize/kyaml/sets" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +// appendListNode will append the nodes from src to dst and return dst. +// src and dst should be both sequence node. key is used to call ElementSetter. +// ElementSetter will use key-value pair to find and set the element in sequence +// node. +func appendListNode(dst, src *yaml.RNode, keys []string) (*yaml.RNode, error) { + var err error + for _, elem := range src.Content() { + // If key is empty, we know this is a scalar value and we can directly set the + // node + if keys[0] == "" { + _, err = dst.Pipe(yaml.ElementSetter{ + Element: elem, + Keys: []string{""}, + Values: []string{elem.Value}, + }) + if err != nil { + return nil, err + } + continue + } + + // we need to get the value for key so that we can find the element to set + // in sequence. + v := []string{} + for _, key := range keys { + tmpNode := yaml.NewRNode(elem) + valueNode, err := tmpNode.Pipe(yaml.Get(key)) + if err != nil { + return nil, err + } + if valueNode.IsNil() { + // no key found, directly append to dst + err = dst.PipeE(yaml.Append(elem)) + if err != nil { + return nil, err + } + continue + } + v = append(v, valueNode.YNode().Value) + } + + // We use the key and value from elem to find the corresponding element in dst. + // Then we will use ElementSetter to replace the element with elem. If we cannot + _, err = dst.Pipe(yaml.ElementSetter{ + Element: elem, + Keys: keys, + Values: v, + }) + + if err != nil { + return nil, err + } + } + return dst, nil +} + +// validateKeys returns a list of valid key-value pairs +// if secondary merge key values are missing, use only the available merge keys +func validateKeys(valuesList [][]string, values []string, keys []string) ([]string, []string) { + validKeys := make([]string, 0) + validValues := make([]string, 0) + validKeySet := sets.String{} + for _, values := range valuesList { + for i, v := range values { + if v != "" { + validKeySet.Insert(keys[i]) + } + } + } + if validKeySet.Len() == 0 { // if values missing, fall back to primary keys + return keys, values + } + for _, k := range keys { + if validKeySet.Has(k) { + validKeys = append(validKeys, k) + } + } + for i, v := range values { + if v != "" || validKeySet.Has(keys[i]) { + validValues = append(validValues, v) + } + } + return validKeys, validValues +} + +// setAssociativeSequenceElements recursively set the elements in the list +func (l *Walker) setAssociativeSequenceElements(valuesList [][]string, keys []string, dest *yaml.RNode) (*yaml.RNode, error) { + // itemsToBeAdded contains the items that will be added to dest + itemsToBeAdded := yaml.NewListRNode() + var schema *openapi.ResourceSchema + if l.Schema != nil { + schema = l.Schema.Elements() + } + + // each element in valuesList is a list of values corresponding to the keys + // for example, for the following yaml: + // - containerPort: 8080 + // protocol: UDP + // - containerPort: 8080 + // protocol: TCP + // `keys` would be [containerPort, protocol] + // and `valuesList` would be [ [8080, UDP], [8080, TCP] ] + for _, values := range valuesList { + if len(values) == 0 { + continue + } + + validKeys, validValues := validateKeys(valuesList, values, keys) + val, err := Walker{ + VisitKeysAsScalars: l.VisitKeysAsScalars, + InferAssociativeLists: l.InferAssociativeLists, + Visitor: l, + Schema: schema, + Sources: l.elementValueList(validKeys, validValues), + MergeOptions: l.MergeOptions, + }.Walk() + if err != nil { + return nil, err + } + + exit := false + for i, key := range validKeys { + // delete the node from **dest** if it's null or empty + if yaml.IsMissingOrNull(val) || yaml.IsEmptyMap(val) { + _, err = dest.Pipe(yaml.ElementSetter{ + Keys: validKeys, + Values: validValues, + }) + if err != nil { + return nil, err + } + exit = true + } else if val.Field(key) == nil { + // make sure the key is set on the field + _, err = val.Pipe(yaml.SetField(key, yaml.NewScalarRNode(validValues[i]))) + if err != nil { + return nil, err + } + } + } + if exit { + continue + } + + // Add the val to the sequence. val will replace the item in the sequence if + // there is an item that matches all key-value pairs. Otherwise val will be appended + // the the sequence. + _, err = itemsToBeAdded.Pipe(yaml.ElementSetter{ + Element: val.YNode(), + Keys: validKeys, + Values: values, + }) + if err != nil { + return nil, err + } + } + + var err error + if len(valuesList) > 0 { + validKeys, _ := validateKeys(valuesList, valuesList[0], keys) + if l.MergeOptions.ListIncreaseDirection == yaml.MergeOptionsListPrepend { + // items from patches are needed to be prepended. so we append the + // dest to itemsToBeAdded + dest, err = appendListNode(itemsToBeAdded, dest, validKeys) + } else { + // append the items + dest, err = appendListNode(dest, itemsToBeAdded, validKeys) + } + } + + if err != nil { + return nil, err + } + // sequence is empty + if yaml.IsMissingOrNull(dest) { + return nil, nil + } + return dest, nil +} + +func (l *Walker) walkAssociativeSequence() (*yaml.RNode, error) { + // may require initializing the dest node + dest, err := l.Sources.setDestNode(l.VisitList(l.Sources, l.Schema, AssociativeList)) + if dest == nil || err != nil { + return nil, err + } + + // get the merge key(s) from schema + var strategy string + var keys []string + if l.Schema != nil { + strategy, keys = l.Schema.PatchStrategyAndKeyList() + } + if strategy == "" && len(keys) == 0 { // neither strategy nor keys present in the schema -- infer the key + // find the list of elements we need to recursively walk + key, err := l.elementKey() + if err != nil { + return nil, err + } + if key != "" { + keys = append(keys, key) + } + } + + // non-primitive associative list -- merge the elements + values := l.elementValues(keys) + if len(values) != 0 || len(keys) > 0 { + return l.setAssociativeSequenceElements(values, keys, dest) + } + + // primitive associative list -- merge the values + return l.setAssociativeSequenceElements(l.elementPrimitiveValues(), []string{""}, dest) +} + +// elementKey returns the merge key to use for the associative list +func (l Walker) elementKey() (string, error) { + var key string + for i := range l.Sources { + if l.Sources[i] != nil && len(l.Sources[i].Content()) > 0 { + newKey := l.Sources[i].GetAssociativeKey() + if key != "" && key != newKey { + return "", errors.Errorf( + "conflicting merge keys [%s,%s] for field %s", + key, newKey, strings.Join(l.Path, ".")) + } + key = newKey + } + } + if key == "" { + return "", errors.Errorf("no merge key found for field %s", + strings.Join(l.Path, ".")) + } + return key, nil +} + +// elementValues returns a slice containing all values for the field across all elements +// from all sources. +// Return value slice is ordered using the original ordering from the elements, where +// elements missing from earlier sources appear later. +func (l Walker) elementValues(keys []string) [][]string { + // use slice to to keep elements in the original order + var returnValues [][]string + var seen sets.StringList + + // if we are doing append, dest node should be the first. + // otherwise dest node should be the last. + beginIdx := 0 + if l.MergeOptions.ListIncreaseDirection == yaml.MergeOptionsListPrepend { + beginIdx = 1 + } + for i := range l.Sources { + src := l.Sources[(i+beginIdx)%len(l.Sources)] + if src == nil { + continue + } + + // add the value of the field for each element + // don't check error, we know this is a list node + values, _ := src.ElementValuesList(keys) + for _, s := range values { + if len(s) == 0 || seen.Has(s) { + continue + } + returnValues = append(returnValues, s) + seen = seen.Insert(s) + } + } + return returnValues +} + +// elementPrimitiveValues returns the primitive values in an associative list -- eg. finalizers +func (l Walker) elementPrimitiveValues() [][]string { + // use slice to to keep elements in the original order + var returnValues [][]string + seen := sets.String{} + // if we are doing append, dest node should be the first. + // otherwise dest node should be the last. + beginIdx := 0 + if l.MergeOptions.ListIncreaseDirection == yaml.MergeOptionsListPrepend { + beginIdx = 1 + } + for i := range l.Sources { + src := l.Sources[(i+beginIdx)%len(l.Sources)] + if src == nil { + continue + } + + // add the value of the field for each element + // don't check error, we know this is a list node + for _, item := range src.YNode().Content { + if seen.Has(item.Value) { + continue + } + returnValues = append(returnValues, []string{item.Value}) + seen.Insert(item.Value) + } + } + return returnValues +} + +// fieldValue returns a slice containing each source's value for fieldName +func (l Walker) elementValueList(keys []string, values []string) []*yaml.RNode { + var fields []*yaml.RNode + for i := range l.Sources { + if l.Sources[i] == nil { + fields = append(fields, nil) + continue + } + fields = append(fields, l.Sources[i].ElementList(keys, values)) + } + return fields +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/yaml/walk/map.go b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/walk/map.go new file mode 100644 index 000000000000..998af6d32f8a --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/walk/map.go @@ -0,0 +1,173 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package walk + +import ( + "sort" + + "sigs.k8s.io/kustomize/kyaml/fieldmeta" + "sigs.k8s.io/kustomize/kyaml/openapi" + "sigs.k8s.io/kustomize/kyaml/sets" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +// walkMap returns the value of VisitMap +// +// - call VisitMap +// - set the return value on l.Dest +// - walk each source field +// - set each source field value on l.Dest +func (l Walker) walkMap() (*yaml.RNode, error) { + // get the new map value + dest, err := l.Sources.setDestNode(l.VisitMap(l.Sources, l.Schema)) + if dest == nil || err != nil { + return nil, err + } + + // recursively set the field values on the map + for _, key := range l.fieldNames() { + var res *yaml.RNode + var keys []*yaml.RNode + if l.VisitKeysAsScalars { + // visit the map keys as if they were scalars, + // this is necessary if doing things such as copying + // comments + for i := range l.Sources { + // construct the sources from the keys + if l.Sources[i] == nil { + keys = append(keys, nil) + continue + } + field := l.Sources[i].Field(key) + if field == nil || yaml.IsMissingOrNull(field.Key) { + keys = append(keys, nil) + continue + } + keys = append(keys, field.Key) + } + // visit the sources as a scalar + // keys don't have any schema --pass in nil + res, err = l.Visitor.VisitScalar(keys, nil) + if err != nil { + return nil, err + } + } + + var s *openapi.ResourceSchema + if l.Schema != nil { + s = l.Schema.Field(key) + } + fv, commentSch := l.fieldValue(key) + if commentSch != nil { + s = commentSch + } + val, err := Walker{ + VisitKeysAsScalars: l.VisitKeysAsScalars, + InferAssociativeLists: l.InferAssociativeLists, + Visitor: l, + Schema: s, + Sources: fv, + MergeOptions: l.MergeOptions, + Path: append(l.Path, key)}.Walk() + if err != nil { + return nil, err + } + + // transfer the comments of res to dest node + var comments yaml.Comments + if !yaml.IsMissingOrNull(res) { + comments = yaml.Comments{ + LineComment: res.YNode().LineComment, + HeadComment: res.YNode().HeadComment, + FootComment: res.YNode().FootComment, + } + if len(keys) > 0 && !yaml.IsMissingOrNull(keys[DestIndex]) { + keys[DestIndex].YNode().HeadComment = res.YNode().HeadComment + keys[DestIndex].YNode().LineComment = res.YNode().LineComment + keys[DestIndex].YNode().FootComment = res.YNode().FootComment + } + } + + // this handles empty and non-empty values + _, err = dest.Pipe(yaml.FieldSetter{Name: key, Comments: comments, Value: val}) + if err != nil { + return nil, err + } + } + + return dest, nil +} + +// valueIfPresent returns node.Value if node is non-nil, otherwise returns nil +func (l Walker) valueIfPresent(node *yaml.MapNode) (*yaml.RNode, *openapi.ResourceSchema) { + if node == nil { + return nil, nil + } + + // parse the schema for the field if present + var s *openapi.ResourceSchema + fm := fieldmeta.FieldMeta{} + var err error + // check the value for a schema + if err = fm.Read(node.Value); err == nil { + s = &openapi.ResourceSchema{Schema: &fm.Schema} + if fm.Schema.Ref.String() != "" { + r, err := openapi.Resolve(&fm.Schema.Ref, openapi.Schema()) + if err == nil && r != nil { + s.Schema = r + } + } + } + // check the key for a schema -- this will be used + // when the value is a Sequence (comments are attached) + // to the key + if fm.IsEmpty() { + if err = fm.Read(node.Key); err == nil { + s = &openapi.ResourceSchema{Schema: &fm.Schema} + } + if fm.Schema.Ref.String() != "" { + r, err := openapi.Resolve(&fm.Schema.Ref, openapi.Schema()) + if err == nil && r != nil { + s.Schema = r + } + } + } + return node.Value, s +} + +// fieldNames returns a sorted slice containing the names of all fields that appear in any of +// the sources +func (l Walker) fieldNames() []string { + fields := sets.String{} + for _, s := range l.Sources { + if s == nil { + continue + } + // don't check error, we know this is a mapping node + sFields, _ := s.Fields() + fields.Insert(sFields...) + } + result := fields.List() + sort.Strings(result) + return result +} + +// fieldValue returns a slice containing each source's value for fieldName +func (l Walker) fieldValue(fieldName string) ([]*yaml.RNode, *openapi.ResourceSchema) { + var fields []*yaml.RNode + var sch *openapi.ResourceSchema + for i := range l.Sources { + if l.Sources[i] == nil { + fields = append(fields, nil) + continue + } + field := l.Sources[i].Field(fieldName) + f, s := l.valueIfPresent(field) + fields = append(fields, f) + if sch == nil && !s.IsMissingOrNull() { + sch = s + } + } + return fields, sch +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/yaml/walk/nonassociative_sequence.go b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/walk/nonassociative_sequence.go new file mode 100644 index 000000000000..91b187e5bf1d --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/walk/nonassociative_sequence.go @@ -0,0 +1,13 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package walk + +import ( + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +// walkNonAssociativeSequence returns the value of VisitList +func (l Walker) walkNonAssociativeSequence() (*yaml.RNode, error) { + return l.VisitList(l.Sources, l.Schema, NonAssociateList) +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/yaml/walk/scalar.go b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/walk/scalar.go new file mode 100644 index 000000000000..1a26f6dffe36 --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/walk/scalar.go @@ -0,0 +1,11 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package walk + +import "sigs.k8s.io/kustomize/kyaml/yaml" + +// walkScalar returns the value of VisitScalar +func (l Walker) walkScalar() (*yaml.RNode, error) { + return l.VisitScalar(l.Sources, l.Schema) +} diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/yaml/walk/visitor.go b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/walk/visitor.go new file mode 100644 index 000000000000..153ac29455fc --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/walk/visitor.go @@ -0,0 +1,28 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package walk + +import ( + "sigs.k8s.io/kustomize/kyaml/openapi" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +type ListKind int32 + +const ( + AssociativeList ListKind = 1 + iota + NonAssociateList +) + +// Visitor is invoked by walk with source and destination node pairs +type Visitor interface { + VisitMap(Sources, *openapi.ResourceSchema) (*yaml.RNode, error) + + VisitScalar(Sources, *openapi.ResourceSchema) (*yaml.RNode, error) + + VisitList(Sources, *openapi.ResourceSchema, ListKind) (*yaml.RNode, error) +} + +// ClearNode is returned if GrepFilter should do nothing after calling Set +var ClearNode *yaml.RNode diff --git a/vendor/sigs.k8s.io/kustomize/kyaml/yaml/walk/walk.go b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/walk/walk.go new file mode 100644 index 000000000000..68de1324e0de --- /dev/null +++ b/vendor/sigs.k8s.io/kustomize/kyaml/yaml/walk/walk.go @@ -0,0 +1,186 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package walk + +import ( + "fmt" + "os" + "strings" + + "sigs.k8s.io/kustomize/kyaml/fieldmeta" + "sigs.k8s.io/kustomize/kyaml/openapi" + "sigs.k8s.io/kustomize/kyaml/yaml" + "sigs.k8s.io/kustomize/kyaml/yaml/schema" +) + +// Walker walks the Source RNode and modifies the RNode provided to GrepFilter. +type Walker struct { + // Visitor is invoked by GrepFilter + Visitor + + Schema *openapi.ResourceSchema + + // Source is the RNode to walk. All Source fields and associative list elements + // will be visited. + Sources Sources + + // Path is the field path to the current Source Node. + Path []string + + // InferAssociativeLists if set to true will infer merge strategies for + // fields which it doesn't have the schema based on the fields in the + // list elements. + InferAssociativeLists bool + + // VisitKeysAsScalars if true will call VisitScalar on map entry keys, + // providing nil as the OpenAPI schema. + VisitKeysAsScalars bool + + // MergeOptions is a struct to store options for merge + MergeOptions yaml.MergeOptions +} + +// Kind returns the kind of the first non-null node in Sources. +func (l Walker) Kind() yaml.Kind { + for _, s := range l.Sources { + if !yaml.IsMissingOrNull(s) { + return s.YNode().Kind + } + } + return 0 +} + +// Walk will recursively traverse every item in the Sources and perform corresponding +// actions on them +func (l Walker) Walk() (*yaml.RNode, error) { + l.Schema = l.GetSchema() + + // invoke the handler for the corresponding node type + switch l.Kind() { + case yaml.MappingNode: + if err := yaml.ErrorIfAnyInvalidAndNonNull(yaml.MappingNode, l.Sources...); err != nil { + return nil, err + } + return l.walkMap() + case yaml.SequenceNode: + if err := yaml.ErrorIfAnyInvalidAndNonNull(yaml.SequenceNode, l.Sources...); err != nil { + return nil, err + } + // AssociativeSequence means the items in the sequence are associative. They can be merged + // according to merge key. + if schema.IsAssociative(l.Schema, l.Sources, l.InferAssociativeLists) { + return l.walkAssociativeSequence() + } + return l.walkNonAssociativeSequence() + + case yaml.ScalarNode: + if err := yaml.ErrorIfAnyInvalidAndNonNull(yaml.ScalarNode, l.Sources...); err != nil { + return nil, err + } + return l.walkScalar() + case 0: + // walk empty nodes as maps + return l.walkMap() + default: + return nil, nil + } +} + +func (l Walker) GetSchema() *openapi.ResourceSchema { + for i := range l.Sources { + r := l.Sources[i] + if yaml.IsMissingOrNull(r) { + continue + } + + fm := fieldmeta.FieldMeta{} + if err := fm.Read(r); err == nil && !fm.IsEmpty() { + // per-field schema, this is fine + if fm.Schema.Ref.String() != "" { + // resolve the reference + s, err := openapi.Resolve(&fm.Schema.Ref, openapi.Schema()) + if err == nil && s != nil { + fm.Schema = *s + } + } + return &openapi.ResourceSchema{Schema: &fm.Schema} + } + } + + if l.Schema != nil { + return l.Schema + } + for i := range l.Sources { + r := l.Sources[i] + if yaml.IsMissingOrNull(r) { + continue + } + + m, _ := r.GetMeta() + if m.Kind == "" || m.APIVersion == "" { + continue + } + + s := openapi.SchemaForResourceType(yaml.TypeMeta{Kind: m.Kind, APIVersion: m.APIVersion}) + if s != nil { + return s + } + } + return nil +} + +const ( + DestIndex = iota + OriginIndex + UpdatedIndex +) + +// Sources are a list of RNodes. First item is the dest node, followed by +// multiple source nodes. +type Sources []*yaml.RNode + +// Dest returns the destination node +func (s Sources) Dest() *yaml.RNode { + if len(s) <= DestIndex { + return nil + } + return s[DestIndex] +} + +// Origin returns the origin node +func (s Sources) Origin() *yaml.RNode { + if len(s) <= OriginIndex { + return nil + } + return s[OriginIndex] +} + +// Updated returns the updated node +func (s Sources) Updated() *yaml.RNode { + if len(s) <= UpdatedIndex { + return nil + } + return s[UpdatedIndex] +} + +func (s Sources) String() string { + var values []string + for i := range s { + str, err := s[i].String() + if err != nil { + fmt.Fprintf(os.Stderr, "%v\n", err) + } + values = append(values, str) + } + return strings.Join(values, "\n") +} + +// setDestNode sets the destination source node +func (s Sources) setDestNode(node *yaml.RNode, err error) (*yaml.RNode, error) { + if err != nil { + return nil, err + } + s[0] = node + return node, nil +} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/commands/build/build.go b/vendor/sigs.k8s.io/kustomize/pkg/commands/build/build.go deleted file mode 100644 index e62747e32914..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/commands/build/build.go +++ /dev/null @@ -1,129 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package build - -import ( - "io" - - "github.com/pkg/errors" - "github.com/spf13/cobra" - "sigs.k8s.io/kustomize/pkg/constants" - "sigs.k8s.io/kustomize/pkg/fs" - "sigs.k8s.io/kustomize/pkg/ifc/transformer" - "sigs.k8s.io/kustomize/pkg/loader" - "sigs.k8s.io/kustomize/pkg/resmap" - "sigs.k8s.io/kustomize/pkg/target" -) - -// Options contain the options for running a build -type Options struct { - kustomizationPath string - outputPath string -} - -// NewOptions creates a Options object -func NewOptions(p, o string) *Options { - return &Options{ - kustomizationPath: p, - outputPath: o, - } -} - -var examples = ` -Use the file somedir/kustomization.yaml to generate a set of api resources: - build somedir - -Use a url pointing to a remote directory/kustomization.yaml to generate a set of api resources: - build url -The url should follow hashicorp/go-getter URL format described in -https://github.com/hashicorp/go-getter#url-format - -url examples: - sigs.k8s.io/kustomize//examples/multibases?ref=v1.0.6 - github.com/Liujingfang1/mysql - github.com/Liujingfang1/kustomize//examples/helloWorld?ref=repoUrl2 -` - -// NewCmdBuild creates a new build command. -func NewCmdBuild( - out io.Writer, fs fs.FileSystem, - rf *resmap.Factory, - ptf transformer.Factory) *cobra.Command { - var o Options - - cmd := &cobra.Command{ - Use: "build [path]", - Short: "Print current configuration per contents of " + constants.KustomizationFileNames[0], - Example: examples, - SilenceUsage: true, - RunE: func(cmd *cobra.Command, args []string) error { - err := o.Validate(args) - if err != nil { - return err - } - return o.RunBuild(out, fs, rf, ptf) - }, - } - cmd.Flags().StringVarP( - &o.outputPath, - "output", "o", "", - "If specified, write the build output to this path.") - return cmd -} - -// Validate validates build command. -func (o *Options) Validate(args []string) error { - if len(args) > 1 { - return errors.New("specify one path to " + constants.KustomizationFileNames[0]) - } - if len(args) == 0 { - o.kustomizationPath = "./" - } else { - o.kustomizationPath = args[0] - } - - return nil -} - -// RunBuild runs build command. -func (o *Options) RunBuild( - out io.Writer, fSys fs.FileSystem, - rf *resmap.Factory, ptf transformer.Factory) error { - ldr, err := loader.NewLoader(o.kustomizationPath, fSys) - if err != nil { - return err - } - defer ldr.Cleanup() - kt, err := target.NewKustTarget(ldr, rf, ptf) - if err != nil { - return err - } - allResources, err := kt.MakeCustomizedResMap() - if err != nil { - return err - } - // Output the objects. - res, err := allResources.EncodeAsYaml() - if err != nil { - return err - } - if o.outputPath != "" { - return fSys.WriteFile(o.outputPath, res) - } - _, err = out.Write(res) - return err -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/constants/constants.go b/vendor/sigs.k8s.io/kustomize/pkg/constants/constants.go deleted file mode 100644 index dd50230fbd6c..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/constants/constants.go +++ /dev/null @@ -1,28 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Package constants holds global constants for the kustomize tool. -package constants - -// KustomizationFileNames is a list of filenames that can be recognized and consumbed -// by Kustomize. -// In each directory, Kustomize searches for file with the name in this list. -// Only one match is allowed. -var KustomizationFileNames = []string{ - "kustomization.yaml", - "kustomization.yml", - "Kustomization", -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/expansion/expand.go b/vendor/sigs.k8s.io/kustomize/pkg/expansion/expand.go deleted file mode 100644 index de55e4614882..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/expansion/expand.go +++ /dev/null @@ -1,121 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Package expansion provides functions find and replace $(FOO) style variables in strings. -package expansion - -import ( - "bytes" -) - -const ( - operator = '$' - referenceOpener = '(' - referenceCloser = ')' -) - -// syntaxWrap returns the input string wrapped by the expansion syntax. -func syntaxWrap(input string) string { - return string(operator) + string(referenceOpener) + input + string(referenceCloser) -} - -// MappingFuncFor returns a mapping function for use with Expand that -// implements the expansion semantics defined in the expansion spec; it -// returns the input string wrapped in the expansion syntax if no mapping -// for the input is found. -func MappingFuncFor( - counts map[string]int, - context ...map[string]string) func(string) string { - return func(input string) string { - for _, vars := range context { - val, ok := vars[input] - if ok { - counts[input]++ - return val - } - } - return syntaxWrap(input) - } -} - -// Expand replaces variable references in the input string according to -// the expansion spec using the given mapping function to resolve the -// values of variables. -func Expand(input string, mapping func(string) string) string { - var buf bytes.Buffer - checkpoint := 0 - for cursor := 0; cursor < len(input); cursor++ { - if input[cursor] == operator && cursor+1 < len(input) { - // Copy the portion of the input string since the last - // checkpoint into the buffer - buf.WriteString(input[checkpoint:cursor]) - - // Attempt to read the variable name as defined by the - // syntax from the input string - read, isVar, advance := tryReadVariableName(input[cursor+1:]) - - if isVar { - // We were able to read a variable name correctly; - // apply the mapping to the variable name and copy the - // bytes into the buffer - buf.WriteString(mapping(read)) - } else { - // Not a variable name; copy the read bytes into the buffer - buf.WriteString(read) - } - - // Advance the cursor in the input string to account for - // bytes consumed to read the variable name expression - cursor += advance - - // Advance the checkpoint in the input string - checkpoint = cursor + 1 - } - } - - // Return the buffer and any remaining unwritten bytes in the - // input string. - return buf.String() + input[checkpoint:] -} - -// tryReadVariableName attempts to read a variable name from the input -// string and returns the content read from the input, whether that content -// represents a variable name to perform mapping on, and the number of bytes -// consumed in the input string. -// -// The input string is assumed not to contain the initial operator. -func tryReadVariableName(input string) (string, bool, int) { - switch input[0] { - case operator: - // Escaped operator; return it. - return input[0:1], false, 1 - case referenceOpener: - // Scan to expression closer - for i := 1; i < len(input); i++ { - if input[i] == referenceCloser { - return input[1:i], true, i + 1 - } - } - - // Incomplete reference; return it. - return string(operator) + string(referenceOpener), false, 1 - default: - // Not the beginning of an expression, ie, an operator - // that doesn't begin an expression. Return the operator - // and the first rune in the string. - return string(operator) + string(input[0]), false, 1 - } -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/factory/factory.go b/vendor/sigs.k8s.io/kustomize/pkg/factory/factory.go deleted file mode 100644 index e71669a87181..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/factory/factory.go +++ /dev/null @@ -1,39 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 - Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -// Package factory provides factories for kustomize. -package factory - -import ( - "sigs.k8s.io/kustomize/pkg/ifc" - "sigs.k8s.io/kustomize/pkg/ifc/transformer" - "sigs.k8s.io/kustomize/pkg/resmap" - "sigs.k8s.io/kustomize/pkg/resource" -) - -// KustFactory provides different factories for kustomize -type KustFactory struct { - ResmapF *resmap.Factory - TransformerF transformer.Factory - ValidatorF ifc.Validator - UnstructF ifc.KunstructuredFactory -} - -// NewKustFactory creats a KustFactory instance -func NewKustFactory(u ifc.KunstructuredFactory, v ifc.Validator, t transformer.Factory) *KustFactory { - return &KustFactory{ - ResmapF: resmap.NewFactory(resource.NewFactory(u)), - TransformerF: t, - ValidatorF: v, - UnstructF: u, - } -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/fs/confirmeddir.go b/vendor/sigs.k8s.io/kustomize/pkg/fs/confirmeddir.go deleted file mode 100644 index 5d12bf077910..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/fs/confirmeddir.go +++ /dev/null @@ -1,93 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package fs - -import ( - "io/ioutil" - "path/filepath" - "strings" -) - -// ConfirmedDir is a clean, absolute, delinkified path -// that was confirmed to point to an existing directory. -type ConfirmedDir string - -// NewTmpConfirmedDir returns a temporary dir, else error. -// The directory is cleaned, no symlinks, etc. so its -// returned as a ConfirmedDir. -func NewTmpConfirmedDir() (ConfirmedDir, error) { - n, err := ioutil.TempDir("", "kustomize-") - if err != nil { - return "", err - } - - // In MacOs `ioutil.TempDir` creates a directory - // with root in the `/var` folder, which is in turn a symlinked path - // to `/private/var`. - // Function `filepath.EvalSymlinks`is used to - // resolve the real absolute path. - deLinked, err := filepath.EvalSymlinks(n) - return ConfirmedDir(deLinked), err - -} - -// HasPrefix returns true if the directory argument -// is a prefix of self (d) from the point of view of -// a file system. -// -// I.e., it's true if the argument equals or contains -// self (d) in a file path sense. -// -// HasPrefix emulates the semantics of strings.HasPrefix -// such that the following are true: -// -// strings.HasPrefix("foobar", "foobar") -// strings.HasPrefix("foobar", "foo") -// strings.HasPrefix("foobar", "") -// -// d := fSys.ConfirmDir("/foo/bar") -// d.HasPrefix("/foo/bar") -// d.HasPrefix("/foo") -// d.HasPrefix("/") -// -// Not contacting a file system here to check for -// actual path existence. -// -// This is tested on linux, but will have trouble -// on other operating systems. -// TODO(monopole) Refactor when #golang/go/18358 closes. -// See also: -// https://github.com/golang/go/issues/18358 -// https://github.com/golang/dep/issues/296 -// https://github.com/golang/dep/blob/master/internal/fs/fs.go#L33 -// https://codereview.appspot.com/5712045 -func (d ConfirmedDir) HasPrefix(path ConfirmedDir) bool { - if path.String() == string(filepath.Separator) || path == d { - return true - } - return strings.HasPrefix( - string(d), - string(path)+string(filepath.Separator)) -} - -func (d ConfirmedDir) Join(path string) string { - return filepath.Join(string(d), path) -} - -func (d ConfirmedDir) String() string { - return string(d) -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/fs/fakefile.go b/vendor/sigs.k8s.io/kustomize/pkg/fs/fakefile.go deleted file mode 100644 index 64bc55685f1b..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/fs/fakefile.go +++ /dev/null @@ -1,69 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package fs - -import ( - "bytes" - "os" -) - -var _ File = &FakeFile{} - -// FakeFile implements File in-memory for tests. -type FakeFile struct { - name string - content []byte - dir bool - open bool -} - -// makeDir makes a fake directory. -func makeDir(name string) *FakeFile { - return &FakeFile{name: name, dir: true} -} - -// Close marks the fake file closed. -func (f *FakeFile) Close() error { - f.open = false - return nil -} - -// Read never fails, and doesn't mutate p. -func (f *FakeFile) Read(p []byte) (n int, err error) { - return len(p), nil -} - -// Write saves the contents of the argument to memory. -func (f *FakeFile) Write(p []byte) (n int, err error) { - f.content = p - return len(p), nil -} - -// ContentMatches returns true if v matches fake file's content. -func (f *FakeFile) ContentMatches(v []byte) bool { - return bytes.Equal(v, f.content) -} - -// GetContent the content of a fake file. -func (f *FakeFile) GetContent() []byte { - return f.content -} - -// Stat returns nil. -func (f *FakeFile) Stat() (os.FileInfo, error) { - return nil, nil -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/fs/fakefileinfo.go b/vendor/sigs.k8s.io/kustomize/pkg/fs/fakefileinfo.go deleted file mode 100644 index 6ccca9150915..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/fs/fakefileinfo.go +++ /dev/null @@ -1,47 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package fs - -import ( - "os" - "time" -) - -var _ os.FileInfo = &Fakefileinfo{} - -// Fakefileinfo implements Fakefileinfo using a fake in-memory filesystem. -type Fakefileinfo struct { - *FakeFile -} - -// Name returns the name of the file -func (fi *Fakefileinfo) Name() string { return fi.name } - -// Size returns the size of the file -func (fi *Fakefileinfo) Size() int64 { return int64(len(fi.content)) } - -// Mode returns the file mode -func (fi *Fakefileinfo) Mode() os.FileMode { return 0777 } - -// ModTime returns the modification time -func (fi *Fakefileinfo) ModTime() time.Time { return time.Time{} } - -// IsDir returns if it is a directory -func (fi *Fakefileinfo) IsDir() bool { return fi.dir } - -// Sys should return underlying data source, but it now returns nil -func (fi *Fakefileinfo) Sys() interface{} { return nil } diff --git a/vendor/sigs.k8s.io/kustomize/pkg/fs/fakefs.go b/vendor/sigs.k8s.io/kustomize/pkg/fs/fakefs.go deleted file mode 100644 index 59c0966b214c..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/fs/fakefs.go +++ /dev/null @@ -1,185 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package fs - -import ( - "fmt" - "path/filepath" - "sort" - "strings" - - "sigs.k8s.io/kustomize/pkg/constants" -) - -var _ FileSystem = &fakeFs{} - -// fakeFs implements FileSystem using a fake in-memory filesystem. -type fakeFs struct { - m map[string]*FakeFile -} - -// MakeFakeFS returns an instance of fakeFs with no files in it. -func MakeFakeFS() *fakeFs { - result := &fakeFs{m: map[string]*FakeFile{}} - result.Mkdir("/") - return result -} - -// kustomizationContent is used in tests. -const kustomizationContent = `apiVersion: kustomize.config.k8s.io/v1beta1 -kind: Kustomization -namePrefix: some-prefix -nameSuffix: some-suffix -# Labels to add to all objects and selectors. -# These labels would also be used to form the selector for apply --prune -# Named differently than “labels” to avoid confusion with metadata for this object -commonLabels: - app: helloworld -commonAnnotations: - note: This is an example annotation -resources: [] -#- service.yaml -#- ../some-dir/ -# There could also be configmaps in Base, which would make these overlays -configMapGenerator: [] -# There could be secrets in Base, if just using a fork/rebase workflow -secretGenerator: [] -` - -// Create assures a fake file appears in the in-memory file system. -func (fs *fakeFs) Create(name string) (File, error) { - f := &FakeFile{} - f.open = true - fs.m[name] = f - return fs.m[name], nil -} - -// Mkdir assures a fake directory appears in the in-memory file system. -func (fs *fakeFs) Mkdir(name string) error { - fs.m[name] = makeDir(name) - return nil -} - -// MkdirAll delegates to Mkdir -func (fs *fakeFs) MkdirAll(name string) error { - return fs.Mkdir(name) -} - -// RemoveAll presumably does rm -r on a path. -// There's no error. -func (fs *fakeFs) RemoveAll(name string) error { - var toRemove []string - for k := range fs.m { - if strings.HasPrefix(k, name) { - toRemove = append(toRemove, k) - } - } - for _, k := range toRemove { - delete(fs.m, k) - } - return nil -} - -// Open returns a fake file in the open state. -func (fs *fakeFs) Open(name string) (File, error) { - if _, found := fs.m[name]; !found { - return nil, fmt.Errorf("file %q cannot be opened", name) - } - return fs.m[name], nil -} - -// CleanedAbs cannot fail. -func (fs *fakeFs) CleanedAbs(path string) (ConfirmedDir, string, error) { - if fs.IsDir(path) { - return ConfirmedDir(path), "", nil - } - d := filepath.Dir(path) - if d == path { - return ConfirmedDir(d), "", nil - } - return ConfirmedDir(d), filepath.Base(path), nil -} - -// Exists returns true if file is known. -func (fs *fakeFs) Exists(name string) bool { - _, found := fs.m[name] - return found -} - -// Glob returns the list of matching files -func (fs *fakeFs) Glob(pattern string) ([]string, error) { - var result []string - for p := range fs.m { - if fs.pathMatch(p, pattern) { - result = append(result, p) - } - } - sort.Strings(result) - return result, nil -} - -// IsDir returns true if the file exists and is a directory. -func (fs *fakeFs) IsDir(name string) bool { - f, found := fs.m[name] - if found && f.dir { - return true - } - if !strings.HasSuffix(name, "/") { - name = name + "/" - } - for k := range fs.m { - if strings.HasPrefix(k, name) { - return true - } - } - return false -} - -// ReadFile always returns an empty bytes and error depending on content of m. -func (fs *fakeFs) ReadFile(name string) ([]byte, error) { - if ff, found := fs.m[name]; found { - return ff.content, nil - } - return nil, fmt.Errorf("cannot read file %q", name) -} - -func (fs *fakeFs) ReadTestKustomization() ([]byte, error) { - return fs.ReadFile(constants.KustomizationFileNames[0]) -} - -// WriteFile always succeeds and does nothing. -func (fs *fakeFs) WriteFile(name string, c []byte) error { - ff := &FakeFile{} - ff.Write(c) - fs.m[name] = ff - return nil -} - -// WriteTestKustomization writes a standard test file. -func (fs *fakeFs) WriteTestKustomization() { - fs.WriteTestKustomizationWith([]byte(kustomizationContent)) -} - -// WriteTestKustomizationWith writes a standard test file. -func (fs *fakeFs) WriteTestKustomizationWith(bytes []byte) { - fs.WriteFile(constants.KustomizationFileNames[0], bytes) -} - -func (fs *fakeFs) pathMatch(path, pattern string) bool { - match, _ := filepath.Match(pattern, path) - return match -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/fs/fs.go b/vendor/sigs.k8s.io/kustomize/pkg/fs/fs.go deleted file mode 100644 index 4b47dba648db..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/fs/fs.go +++ /dev/null @@ -1,44 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Package fs provides a file system abstraction layer. -package fs - -import ( - "io" - "os" -) - -// FileSystem groups basic os filesystem methods. -type FileSystem interface { - Create(name string) (File, error) - Mkdir(name string) error - MkdirAll(name string) error - RemoveAll(name string) error - Open(name string) (File, error) - IsDir(name string) bool - CleanedAbs(path string) (ConfirmedDir, string, error) - Exists(name string) bool - Glob(pattern string) ([]string, error) - ReadFile(name string) ([]byte, error) - WriteFile(name string, data []byte) error -} - -// File groups the basic os.File methods. -type File interface { - io.ReadWriteCloser - Stat() (os.FileInfo, error) -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/fs/realfile.go b/vendor/sigs.k8s.io/kustomize/pkg/fs/realfile.go deleted file mode 100644 index 5bfec55abee1..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/fs/realfile.go +++ /dev/null @@ -1,40 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package fs - -import ( - "os" -) - -var _ File = &realFile{} - -// realFile implements File using the local filesystem. -type realFile struct { - file *os.File -} - -// Close closes a file. -func (f *realFile) Close() error { return f.file.Close() } - -// Read reads a file's content. -func (f *realFile) Read(p []byte) (n int, err error) { return f.file.Read(p) } - -// Write writes bytes to a file -func (f *realFile) Write(p []byte) (n int, err error) { return f.file.Write(p) } - -// Stat returns an interface which has all the information regarding the file. -func (f *realFile) Stat() (os.FileInfo, error) { return f.file.Stat() } diff --git a/vendor/sigs.k8s.io/kustomize/pkg/fs/realfs.go b/vendor/sigs.k8s.io/kustomize/pkg/fs/realfs.go deleted file mode 100644 index 11e5813b7815..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/fs/realfs.go +++ /dev/null @@ -1,122 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package fs - -import ( - "fmt" - "io/ioutil" - "log" - "os" - "path/filepath" -) - -var _ FileSystem = realFS{} - -// realFS implements FileSystem using the local filesystem. -type realFS struct{} - -// MakeRealFS makes an instance of realFS. -func MakeRealFS() FileSystem { - return realFS{} -} - -// Create delegates to os.Create. -func (realFS) Create(name string) (File, error) { return os.Create(name) } - -// Mkdir delegates to os.Mkdir. -func (realFS) Mkdir(name string) error { - return os.Mkdir(name, 0777|os.ModeDir) -} - -// MkdirAll delegates to os.MkdirAll. -func (realFS) MkdirAll(name string) error { - return os.MkdirAll(name, 0777|os.ModeDir) -} - -// RemoveAll delegates to os.RemoveAll. -func (realFS) RemoveAll(name string) error { - return os.RemoveAll(name) -} - -// Open delegates to os.Open. -func (realFS) Open(name string) (File, error) { return os.Open(name) } - -// CleanedAbs returns a cleaned, absolute path -// with no symbolic links split into directory -// and file components. If the entire path is -// a directory, the file component is an empty -// string. -func (x realFS) CleanedAbs( - path string) (ConfirmedDir, string, error) { - absRoot, err := filepath.Abs(path) - if err != nil { - return "", "", fmt.Errorf( - "abs path error on '%s' : %v", path, err) - } - deLinked, err := filepath.EvalSymlinks(absRoot) - if err != nil { - return "", "", fmt.Errorf( - "evalsymlink failure on '%s' : %v", path, err) - } - if x.IsDir(deLinked) { - return ConfirmedDir(deLinked), "", nil - } - d := filepath.Dir(deLinked) - if !x.IsDir(d) { - // Programmer/assumption error. - log.Fatalf("first part of '%s' not a directory", deLinked) - } - if d == deLinked { - // Programmer/assumption error. - log.Fatalf("d '%s' should be a subset of deLinked", d) - } - f := filepath.Base(deLinked) - if filepath.Join(d, f) != deLinked { - // Programmer/assumption error. - log.Fatalf("these should be equal: '%s', '%s'", - filepath.Join(d, f), deLinked) - } - return ConfirmedDir(d), f, nil -} - -// Exists returns true if os.Stat succeeds. -func (realFS) Exists(name string) bool { - _, err := os.Stat(name) - return err == nil -} - -// Glob returns the list of matching files -func (realFS) Glob(pattern string) ([]string, error) { - return filepath.Glob(pattern) -} - -// IsDir delegates to os.Stat and FileInfo.IsDir -func (realFS) IsDir(name string) bool { - info, err := os.Stat(name) - if err != nil { - return false - } - return info.IsDir() -} - -// ReadFile delegates to ioutil.ReadFile. -func (realFS) ReadFile(name string) ([]byte, error) { return ioutil.ReadFile(name) } - -// WriteFile delegates to ioutil.WriteFile with read/write permissions. -func (realFS) WriteFile(name string, c []byte) error { - return ioutil.WriteFile(name, c, 0666) -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/git/cloner.go b/vendor/sigs.k8s.io/kustomize/pkg/git/cloner.go deleted file mode 100644 index 465fdb1d135f..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/git/cloner.go +++ /dev/null @@ -1,75 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package git - -import ( - "bytes" - "os/exec" - - "github.com/pkg/errors" - "sigs.k8s.io/kustomize/pkg/fs" -) - -// Cloner is a function that can clone a git repo. -type Cloner func(repoSpec *RepoSpec) error - -// ClonerUsingGitExec uses a local git install, as opposed -// to say, some remote API, to obtain a local clone of -// a remote repo. -func ClonerUsingGitExec(repoSpec *RepoSpec) error { - gitProgram, err := exec.LookPath("git") - if err != nil { - return errors.Wrap(err, "no 'git' program on path") - } - repoSpec.cloneDir, err = fs.NewTmpConfirmedDir() - if err != nil { - return err - } - cmd := exec.Command( - gitProgram, - "clone", - repoSpec.CloneSpec(), - repoSpec.cloneDir.String()) - var out bytes.Buffer - cmd.Stdout = &out - err = cmd.Run() - if err != nil { - return errors.Wrapf(err, "trouble cloning %s", repoSpec.raw) - } - if repoSpec.ref == "" { - return nil - } - cmd = exec.Command(gitProgram, "checkout", repoSpec.ref) - cmd.Dir = repoSpec.cloneDir.String() - err = cmd.Run() - if err != nil { - return errors.Wrapf( - err, "trouble checking out href %s", repoSpec.ref) - } - return nil -} - -// DoNothingCloner returns a cloner that only sets -// cloneDir field in the repoSpec. It's assumed that -// the cloneDir is associated with some fake filesystem -// used in a test. -func DoNothingCloner(dir fs.ConfirmedDir) Cloner { - return func(rs *RepoSpec) error { - rs.cloneDir = dir - return nil - } -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/git/repospec.go b/vendor/sigs.k8s.io/kustomize/pkg/git/repospec.go deleted file mode 100644 index b3251f6535ee..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/git/repospec.go +++ /dev/null @@ -1,214 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package git - -import ( - "fmt" - "path/filepath" - "strings" - - "sigs.k8s.io/kustomize/pkg/fs" -) - -// Used as a temporary non-empty occupant of the cloneDir -// field, as something distinguishable from the empty string -// in various outputs (especially tests). Not using an -// actual directory name here, as that's a temporary directory -// with a unique name that isn't created until clone time. -const notCloned = fs.ConfirmedDir("/notCloned") - -// RepoSpec specifies a git repository and a branch and path therein. -type RepoSpec struct { - // Raw, original spec, used to look for cycles. - // TODO(monopole): Drop raw, use processed fields instead. - raw string - - // Host, e.g. github.com - host string - - // orgRepo name (organization/repoName), - // e.g. kubernetes-sigs/kustomize - orgRepo string - - // ConfirmedDir where the orgRepo is cloned to. - cloneDir fs.ConfirmedDir - - // Relative path in the repository, and in the cloneDir, - // to a Kustomization. - path string - - // Branch or tag reference. - ref string -} - -// CloneSpec returns a string suitable for "git clone {spec}". -func (x *RepoSpec) CloneSpec() string { - if isAzureHost(x.host) || isAWSHost(x.host) { - return x.host + x.orgRepo - } - return x.host + x.orgRepo + gitSuffix -} - -func (x *RepoSpec) CloneDir() fs.ConfirmedDir { - return x.cloneDir -} - -func (x *RepoSpec) Raw() string { - return x.raw -} - -func (x *RepoSpec) AbsPath() string { - return x.cloneDir.Join(x.path) -} - -func (x *RepoSpec) Cleaner(fSys fs.FileSystem) func() error { - return func() error { return fSys.RemoveAll(x.cloneDir.String()) } -} - -// From strings like git@github.com:someOrg/someRepo.git or -// https://github.com/someOrg/someRepo?ref=someHash, extract -// the parts. -func NewRepoSpecFromUrl(n string) (*RepoSpec, error) { - if filepath.IsAbs(n) { - return nil, fmt.Errorf("uri looks like abs path: %s", n) - } - host, orgRepo, path, gitRef := parseGithubUrl(n) - if orgRepo == "" { - return nil, fmt.Errorf("url lacks orgRepo: %s", n) - } - if host == "" { - return nil, fmt.Errorf("url lacks host: %s", n) - } - return &RepoSpec{ - raw: n, host: host, orgRepo: orgRepo, - cloneDir: notCloned, path: path, ref: gitRef}, nil -} - -const ( - refQuery = "?ref=" - gitSuffix = ".git" -) - -// From strings like git@github.com:someOrg/someRepo.git or -// https://github.com/someOrg/someRepo?ref=someHash, extract -// the parts. -func parseGithubUrl(n string) ( - host string, orgRepo string, path string, gitRef string) { - host, n = parseHostSpec(n) - - if strings.Contains(n, gitSuffix) { - index := strings.Index(n, gitSuffix) - orgRepo = n[0:index] - n = n[index+len(gitSuffix):] - path, gitRef = peelQuery(n) - return - } - - i := strings.Index(n, "/") - if i < 1 { - return "", "", "", "" - } - j := strings.Index(n[i+1:], "/") - if j >= 0 { - j += i + 1 - orgRepo = n[:j] - path, gitRef = peelQuery(n[j+1:]) - } else { - path = "" - orgRepo, gitRef = peelQuery(n) - } - return -} - -func peelQuery(arg string) (string, string) { - j := strings.Index(arg, refQuery) - if j >= 0 { - return arg[:j], arg[j+len(refQuery):] - } - return arg, "" -} - -func parseHostSpec(n string) (string, string) { - var host string - // Start accumulating the host part. - for _, p := range []string{ - // Order matters here. - "git::", "gh:", "ssh://", "https://", "http://", - "git@", "github.com:", "github.com/"} { - if len(p) < len(n) && strings.ToLower(n[:len(p)]) == p { - n = n[len(p):] - host += p - } - } - if host == "git@" { - i := strings.Index(n, "/") - if i > -1 { - host += n[:i+1] - n = n[i+1:] - } else { - i = strings.Index(n, ":") - if i > -1 { - host += n[:i+1] - n = n[i+1:] - } - } - return host, n - } - - // If host is a http(s) or ssh URL, grab the domain part. - for _, p := range []string{ - "ssh://", "https://", "http://"} { - if strings.HasSuffix(host, p) { - i := strings.Index(n, "/") - if i > -1 { - host = host + n[0:i+1] - n = n[i+1:] - } - break - } - } - - return normalizeGitHostSpec(host), n -} - -func normalizeGitHostSpec(host string) string { - s := strings.ToLower(host) - if strings.Contains(s, "github.com") { - if strings.Contains(s, "git@") || strings.Contains(s, "ssh:") { - host = "git@github.com:" - } else { - host = "https://github.com/" - } - } - if strings.HasPrefix(s, "git::") { - host = strings.TrimLeft(s, "git::") - } - return host -} - -// The format of Azure repo URL is documented -// https://docs.microsoft.com/en-us/azure/devops/repos/git/clone?view=vsts&tabs=visual-studio#clone_url -func isAzureHost(host string) bool { - return strings.Contains(host, "dev.azure.com") || - strings.Contains(host, "visualstudio.com") -} - -// The format of AWS repo URL is documented -// https://docs.aws.amazon.com/codecommit/latest/userguide/regions.html -func isAWSHost(host string) bool { - return strings.Contains(host, "amazonaws.com") -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/gvk/gvk.go b/vendor/sigs.k8s.io/kustomize/pkg/gvk/gvk.go deleted file mode 100644 index 890c8e8b53df..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/gvk/gvk.go +++ /dev/null @@ -1,180 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package gvk - -import ( - "strings" -) - -// Gvk identifies a Kubernetes API type. -// https://github.com/kubernetes/community/blob/master/contributors/design-proposals/api-machinery/api-group.md -type Gvk struct { - Group string `json:"group,omitempty" yaml:"group,omitempty"` - Version string `json:"version,omitempty" yaml:"version,omitempty"` - Kind string `json:"kind,omitempty" yaml:"kind,omitempty"` -} - -// FromKind makes a Gvk with only the kind specified. -func FromKind(k string) Gvk { - return Gvk{ - Kind: k, - } -} - -// Values that are brief but meaningful in logs. -const ( - noGroup = "~G" - noVersion = "~V" - noKind = "~K" - separator = "_" -) - -// String returns a string representation of the GVK. -func (x Gvk) String() string { - g := x.Group - if g == "" { - g = noGroup - } - v := x.Version - if v == "" { - v = noVersion - } - k := x.Kind - if k == "" { - k = noKind - } - return strings.Join([]string{g, v, k}, separator) -} - -// Equals returns true if the Gvk's have equal fields. -func (x Gvk) Equals(o Gvk) bool { - return x.Group == o.Group && x.Version == o.Version && x.Kind == o.Kind -} - -// An attempt to order things to help k8s, e.g. -// a Service should come before things that refer to it. -// Namespace should be first. -// In some cases order just specified to provide determinism. -var order = []string{ - "Namespace", - "StorageClass", - "CustomResourceDefinition", - "MutatingWebhookConfiguration", - "ValidatingWebhookConfiguration", - "ServiceAccount", - "Role", - "ClusterRole", - "RoleBinding", - "ClusterRoleBinding", - "ConfigMap", - "Secret", - "Service", - "Deployment", - "StatefulSet", - "CronJob", - "PodDisruptionBudget", -} -var typeOrders = func() map[string]int { - m := map[string]int{} - for i, n := range order { - m[n] = i - } - return m -}() - -// IsLessThan returns true if self is less than the argument. -func (x Gvk) IsLessThan(o Gvk) bool { - indexI, foundI := typeOrders[x.Kind] - indexJ, foundJ := typeOrders[o.Kind] - if foundI && foundJ { - if indexI != indexJ { - return indexI < indexJ - } - } - if foundI && !foundJ { - return true - } - if !foundI && foundJ { - return false - } - return x.String() < o.String() -} - -// IsSelected returns true if `selector` selects `x`; otherwise, false. -// If `selector` and `x` are the same, return true. -// If `selector` is nil, it is considered a wildcard match, returning true. -// If selector fields are empty, they are considered wildcards matching -// anything in the corresponding fields, e.g. -// -// this item: -// -// -// is selected by -// -// -// but rejected by -// -// -func (x Gvk) IsSelected(selector *Gvk) bool { - if selector == nil { - return true - } - if len(selector.Group) > 0 { - if x.Group != selector.Group { - return false - } - } - if len(selector.Version) > 0 { - if x.Version != selector.Version { - return false - } - } - if len(selector.Kind) > 0 { - if x.Kind != selector.Kind { - return false - } - } - return true -} - -var clusterLevelKinds = []string{ - "APIService", - "ClusterRoleBinding", - "ClusterRole", - "CustomResourceDefinition", - "Namespace", - "PersistentVolume", -} - -// IsClusterKind returns true if x is a cluster-level Gvk -func (x Gvk) IsClusterKind() bool { - for _, k := range clusterLevelKinds { - if k == x.Kind { - return true - } - } - return false -} - -// ClusterLevelGvks returns a slice of cluster-level Gvks -func ClusterLevelGvks() []Gvk { - var result []Gvk - for _, k := range clusterLevelKinds { - result = append(result, Gvk{Kind: k}) - } - return result -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/ifc/ifc.go b/vendor/sigs.k8s.io/kustomize/pkg/ifc/ifc.go deleted file mode 100644 index e6267cae25fb..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/ifc/ifc.go +++ /dev/null @@ -1,73 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Package ifc holds miscellaneous interfaces used by kustomize. -package ifc - -import ( - "sigs.k8s.io/kustomize/pkg/gvk" - "sigs.k8s.io/kustomize/pkg/types" -) - -// Validator provides functions to validate annotations and labels -type Validator interface { - MakeAnnotationValidator() func(map[string]string) error - MakeLabelValidator() func(map[string]string) error - ValidateNamespace(string) []string -} - -// Loader interface exposes methods to read bytes. -type Loader interface { - // Root returns the root location for this Loader. - Root() string - // New returns Loader located at newRoot. - New(newRoot string) (Loader, error) - // Load returns the bytes read from the location or an error. - Load(location string) ([]byte, error) - // Cleanup cleans the loader - Cleanup() error -} - -// Kunstructured allows manipulation of k8s objects -// that do not have Golang structs. -type Kunstructured interface { - Map() map[string]interface{} - SetMap(map[string]interface{}) - Copy() Kunstructured - GetFieldValue(string) (string, error) - MarshalJSON() ([]byte, error) - UnmarshalJSON([]byte) error - GetGvk() gvk.Gvk - GetKind() string - GetName() string - SetName(string) - GetLabels() map[string]string - SetLabels(map[string]string) - GetAnnotations() map[string]string - SetAnnotations(map[string]string) -} - -// KunstructuredFactory makes instances of Kunstructured. -type KunstructuredFactory interface { - SliceFromBytes([]byte) ([]Kunstructured, error) - FromMap(m map[string]interface{}) Kunstructured - MakeConfigMap(args *types.ConfigMapArgs, options *types.GeneratorOptions) (Kunstructured, error) - MakeSecret(args *types.SecretArgs, options *types.GeneratorOptions) (Kunstructured, error) - Set(ldr Loader) -} - -// See core.v1.SecretTypeOpaque -const SecretTypeOpaque = "Opaque" diff --git a/vendor/sigs.k8s.io/kustomize/pkg/ifc/transformer/factory.go b/vendor/sigs.k8s.io/kustomize/pkg/ifc/transformer/factory.go deleted file mode 100644 index 0a74c2809301..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/ifc/transformer/factory.go +++ /dev/null @@ -1,29 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Package patch holds miscellaneous interfaces used by kustomize. -package transformer - -import ( - "sigs.k8s.io/kustomize/pkg/resource" - "sigs.k8s.io/kustomize/pkg/transformers" -) - -// Factory makes transformers -type Factory interface { - MakePatchTransformer(slice []*resource.Resource, rf *resource.Factory) (transformers.Transformer, error) - MakeHashTransformer() transformers.Transformer -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/image/deprecatedimage.go b/vendor/sigs.k8s.io/kustomize/pkg/image/deprecatedimage.go deleted file mode 100644 index 65db4051b367..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/image/deprecatedimage.go +++ /dev/null @@ -1,32 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package image - -// DeprecatedImage contains an image and a new tag, -// which will replace the original tag. -// Deprecated, instead use Image. -type DeprecatedImage struct { - // Name is a tag-less image name. - Name string `json:"name,omitempty" yaml:"name,omitempty"` - - // NewTag is the value to use in replacing the original tag. - NewTag string `json:"newTag,omitempty" yaml:"newTag,omitempty"` - - // Digest is the value used to replace the original image tag. - // If digest is present NewTag value is ignored. - Digest string `json:"digest,omitempty" yaml:"digest,omitempty"` -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/image/image.go b/vendor/sigs.k8s.io/kustomize/pkg/image/image.go deleted file mode 100644 index dbe3b8b17531..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/image/image.go +++ /dev/null @@ -1,36 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Package image provides struct definitions and libraries -// for image overwriting of names, tags and digest. -package image - -// Image contains an image name, a new name, a new tag or digest, -// which will replace the original name and tag. -type Image struct { - // Name is a tag-less image name. - Name string `json:"name,omitempty" yaml:"name,omitempty"` - - // NewName is the value used to replace the original name. - NewName string `json:"newName,omitempty" yaml:"newName,omitempty"` - - // NewTag is the value used to replace the original tag. - NewTag string `json:"newTag,omitempty" yaml:"newTag,omitempty"` - - // Digest is the value used to replace the original image tag. - // If digest is present NewTag value is ignored. - Digest string `json:"digest,omitempty" yaml:"digest,omitempty"` -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/internal/error/configmaperror.go b/vendor/sigs.k8s.io/kustomize/pkg/internal/error/configmaperror.go deleted file mode 100644 index 1d60d78a231f..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/internal/error/configmaperror.go +++ /dev/null @@ -1,30 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Package error has contextual error types. -package error - -import "fmt" - -// ConfigmapError represents error with a configmap. -type ConfigmapError struct { - Path string - ErrorMsg string -} - -func (e ConfigmapError) Error() string { - return fmt.Sprintf("Kustomization file [%s] encounters a configmap error: %s\n", e.Path, e.ErrorMsg) -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/internal/error/kustomizationerror.go b/vendor/sigs.k8s.io/kustomize/pkg/internal/error/kustomizationerror.go deleted file mode 100644 index 0d53ca9b89e1..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/internal/error/kustomizationerror.go +++ /dev/null @@ -1,61 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package error - -import ( - "fmt" -) - -// KustomizationError represents an error with a kustomization. -type KustomizationError struct { - KustomizationPath string - ErrorMsg string -} - -func (ke KustomizationError) Error() string { - return fmt.Sprintf("Kustomization File [%s]: %s\n", ke.KustomizationPath, ke.ErrorMsg) -} - -// KustomizationErrors collects all errors. -type KustomizationErrors struct { - kErrors []error -} - -func (ke *KustomizationErrors) Error() string { - errormsg := "" - for _, e := range ke.kErrors { - errormsg += e.Error() + "\n" - } - return errormsg -} - -// Append adds error to a collection of errors. -func (ke *KustomizationErrors) Append(e error) { - ke.kErrors = append(ke.kErrors, e) -} - -// Get returns all collected errors. -func (ke *KustomizationErrors) Get() []error { - return ke.kErrors -} - -// BatchAppend adds all errors from another KustomizationErrors -func (ke *KustomizationErrors) BatchAppend(e KustomizationErrors) { - for _, err := range e.Get() { - ke.kErrors = append(ke.kErrors, err) - } -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/internal/error/patcherror.go b/vendor/sigs.k8s.io/kustomize/pkg/internal/error/patcherror.go deleted file mode 100644 index 60c9f80e5b5c..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/internal/error/patcherror.go +++ /dev/null @@ -1,32 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package error - -import ( - "fmt" -) - -// PatchError represents error during Patch. -type PatchError struct { - KustomizationPath string - PatchFilepath string - ErrorMsg string -} - -func (e PatchError) Error() string { - return fmt.Sprintf("Kustomization file [%s] encounters a patch error for [%s]: %s\n", e.KustomizationPath, e.PatchFilepath, e.ErrorMsg) -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/internal/error/resourceerror.go b/vendor/sigs.k8s.io/kustomize/pkg/internal/error/resourceerror.go deleted file mode 100644 index ef3566dd1f73..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/internal/error/resourceerror.go +++ /dev/null @@ -1,30 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package error - -import "fmt" - -// ResourceError represents error in a resource. -type ResourceError struct { - KustomizationPath string - ResourceFilepath string - ErrorMsg string -} - -func (e ResourceError) Error() string { - return fmt.Sprintf("Kustomization file [%s] encounters a resource error for [%s]: %s\n", e.KustomizationPath, e.ResourceFilepath, e.ErrorMsg) -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/internal/error/secreterror.go b/vendor/sigs.k8s.io/kustomize/pkg/internal/error/secreterror.go deleted file mode 100644 index cd72759ce6ca..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/internal/error/secreterror.go +++ /dev/null @@ -1,30 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package error - -import "fmt" - -// SecretError represents error with a secret. -type SecretError struct { - KustomizationPath string - // ErrorMsg is an error message - ErrorMsg string -} - -func (e SecretError) Error() string { - return fmt.Sprintf("Kustomization file [%s] encounters a secret error: %s\n", e.KustomizationPath, e.ErrorMsg) -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/internal/error/yamlformaterror.go b/vendor/sigs.k8s.io/kustomize/pkg/internal/error/yamlformaterror.go deleted file mode 100644 index 4c27d30d7170..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/internal/error/yamlformaterror.go +++ /dev/null @@ -1,48 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Package error has contextual error types. -package error - -import ( - "fmt" - "strings" -) - -// YamlFormatError represents error with yaml file name where json/yaml format error happens. -type YamlFormatError struct { - Path string - ErrorMsg string -} - -func (e YamlFormatError) Error() string { - return fmt.Sprintf("YAML file [%s] encounters a format error.\n%s\n", e.Path, e.ErrorMsg) -} - -// Handler handles YamlFormatError -func Handler(e error, path string) error { - if isYAMLSyntaxError(e) { - return YamlFormatError{ - Path: path, - ErrorMsg: e.Error(), - } - } - return e -} - -func isYAMLSyntaxError(e error) bool { - return strings.Contains(e.Error(), "error converting YAML to JSON") || strings.Contains(e.Error(), "error unmarshaling JSON") -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/loader/fileloader.go b/vendor/sigs.k8s.io/kustomize/pkg/loader/fileloader.go deleted file mode 100644 index 4fa5dca67cde..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/loader/fileloader.go +++ /dev/null @@ -1,312 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package loader - -import ( - "fmt" - "log" - "path/filepath" - "strings" - - "sigs.k8s.io/kustomize/pkg/fs" - "sigs.k8s.io/kustomize/pkg/git" - "sigs.k8s.io/kustomize/pkg/ifc" -) - -// fileLoader is a kustomization's interface to files. -// -// The directory in which a kustomization file sits -// is referred to below as the kustomization's root. -// -// An instance of fileLoader has an immutable root, -// and offers a `New` method returning a new loader -// with a new root. -// -// A kustomization file refers to two kinds of files: -// -// * supplemental data paths -// -// `Load` is used to visit these paths. -// -// They must terminate in or below the root. -// -// They hold things like resources, patches, -// data for ConfigMaps, etc. -// -// * bases; other kustomizations -// -// `New` is used to load bases. -// -// A base can be either a remote git repo URL, or -// a directory specified relative to the current -// root. In the former case, the repo is locally -// cloned, and the new loader is rooted on a path -// in that clone. -// -// As loaders create new loaders, a root history -// is established, and used to disallow: -// -// - A base that is a repository that, in turn, -// specifies a base repository seen previously -// in the loading stack (a cycle). -// -// - An overlay depending on a base positioned at -// or above it. I.e. '../foo' is OK, but '.', -// '..', '../..', etc. are disallowed. Allowing -// such a base has no advantages and encourages -// cycles, particularly if some future change -// were to introduce globbing to file -// specifications in the kustomization file. -// -// These restrictions assure that kustomizations -// are self-contained and relocatable, and impose -// some safety when relying on remote kustomizations, -// e.g. a ConfigMap generator specified to read -// from /etc/passwd will fail. -// -type fileLoader struct { - // Loader that spawned this loader. - // Used to avoid cycles. - referrer *fileLoader - // An absolute, cleaned path to a directory. - // The Load function reads from this directory, - // or directories below it. - root fs.ConfirmedDir - // If this is non-nil, the files were - // obtained from the given repository. - repoSpec *git.RepoSpec - // File system utilities. - fSys fs.FileSystem - // Used to clone repositories. - cloner git.Cloner - // Used to clean up, as needed. - cleaner func() error -} - -// NewFileLoaderAtCwd returns a loader that loads from ".". -func NewFileLoaderAtCwd(fSys fs.FileSystem) *fileLoader { - return newLoaderOrDie(fSys, ".") -} - -// NewFileLoaderAtRoot returns a loader that loads from "/". -func NewFileLoaderAtRoot(fSys fs.FileSystem) *fileLoader { - return newLoaderOrDie(fSys, string(filepath.Separator)) -} - -// Root returns the absolute path that is prepended to any -// relative paths used in Load. -func (l *fileLoader) Root() string { - return l.root.String() -} - -func newLoaderOrDie(fSys fs.FileSystem, path string) *fileLoader { - root, err := demandDirectoryRoot(fSys, path) - if err != nil { - log.Fatalf("unable to make loader at '%s'; %v", path, err) - } - return newLoaderAtConfirmedDir( - root, fSys, nil, git.ClonerUsingGitExec) -} - -// newLoaderAtConfirmedDir returns a new fileLoader with given root. -func newLoaderAtConfirmedDir( - root fs.ConfirmedDir, fSys fs.FileSystem, - referrer *fileLoader, cloner git.Cloner) *fileLoader { - return &fileLoader{ - root: root, - referrer: referrer, - fSys: fSys, - cloner: cloner, - cleaner: func() error { return nil }, - } -} - -// Assure that the given path is in fact a directory. -func demandDirectoryRoot( - fSys fs.FileSystem, path string) (fs.ConfirmedDir, error) { - if path == "" { - return "", fmt.Errorf( - "loader root cannot be empty") - } - d, f, err := fSys.CleanedAbs(path) - if err != nil { - return "", fmt.Errorf( - "absolute path error in '%s' : %v", path, err) - } - if f != "" { - return "", fmt.Errorf( - "got file '%s', but '%s' must be a directory to be a root", - f, path) - } - return d, nil -} - -// New returns a new Loader, rooted relative to current loader, -// or rooted in a temp directory holding a git repo clone. -func (l *fileLoader) New(path string) (ifc.Loader, error) { - if path == "" { - return nil, fmt.Errorf("new root cannot be empty") - } - repoSpec, err := git.NewRepoSpecFromUrl(path) - if err == nil { - // Treat this as git repo clone request. - if err := l.errIfRepoCycle(repoSpec); err != nil { - return nil, err - } - return newLoaderAtGitClone(repoSpec, l.fSys, l.referrer, l.cloner) - } - if filepath.IsAbs(path) { - return nil, fmt.Errorf("new root '%s' cannot be absolute", path) - } - root, err := demandDirectoryRoot(l.fSys, l.root.Join(path)) - if err != nil { - return nil, err - } - if err := l.errIfGitContainmentViolation(root); err != nil { - return nil, err - } - if err := l.errIfArgEqualOrHigher(root); err != nil { - return nil, err - } - return newLoaderAtConfirmedDir( - root, l.fSys, l, l.cloner), nil -} - -// newLoaderAtGitClone returns a new Loader pinned to a temporary -// directory holding a cloned git repo. -func newLoaderAtGitClone( - repoSpec *git.RepoSpec, fSys fs.FileSystem, - referrer *fileLoader, cloner git.Cloner) (ifc.Loader, error) { - err := cloner(repoSpec) - if err != nil { - return nil, err - } - root, f, err := fSys.CleanedAbs(repoSpec.AbsPath()) - if err != nil { - return nil, err - } - // We don't know that the path requested in repoSpec - // is a directory until we actually clone it and look - // inside. That just happened, hence the error check - // is here. - if f != "" { - return nil, fmt.Errorf( - "'%s' refers to file '%s'; expecting directory", - repoSpec.AbsPath(), f) - } - return &fileLoader{ - root: root, - referrer: referrer, - repoSpec: repoSpec, - fSys: fSys, - cloner: cloner, - cleaner: repoSpec.Cleaner(fSys), - }, nil -} - -func (l *fileLoader) errIfGitContainmentViolation( - base fs.ConfirmedDir) error { - containingRepo := l.containingRepo() - if containingRepo == nil { - return nil - } - if !base.HasPrefix(containingRepo.CloneDir()) { - return fmt.Errorf( - "security; bases in kustomizations found in "+ - "cloned git repos must be within the repo, "+ - "but base '%s' is outside '%s'", - base, containingRepo.CloneDir()) - } - return nil -} - -// Looks back through referrers for a git repo, returning nil -// if none found. -func (l *fileLoader) containingRepo() *git.RepoSpec { - if l.repoSpec != nil { - return l.repoSpec - } - if l.referrer == nil { - return nil - } - return l.referrer.containingRepo() -} - -// errIfArgEqualOrHigher tests whether the argument, -// is equal to or above the root of any ancestor. -func (l *fileLoader) errIfArgEqualOrHigher( - candidateRoot fs.ConfirmedDir) error { - if l.root.HasPrefix(candidateRoot) { - return fmt.Errorf( - "cycle detected: candidate root '%s' contains visited root '%s'", - candidateRoot, l.root) - } - if l.referrer == nil { - return nil - } - return l.referrer.errIfArgEqualOrHigher(candidateRoot) -} - -// TODO(monopole): Distinguish branches? -// I.e. Allow a distinction between git URI with -// path foo and tag bar and a git URI with the same -// path but a different tag? -func (l *fileLoader) errIfRepoCycle(newRepoSpec *git.RepoSpec) error { - // TODO(monopole): Use parsed data instead of Raw(). - if l.repoSpec != nil && - strings.HasPrefix(l.repoSpec.Raw(), newRepoSpec.Raw()) { - return fmt.Errorf( - "cycle detected: URI '%s' referenced by previous URI '%s'", - newRepoSpec.Raw(), l.repoSpec.Raw()) - } - if l.referrer == nil { - return nil - } - return l.referrer.errIfRepoCycle(newRepoSpec) -} - -// Load returns content of file at the given relative path, -// else an error. The path must refer to a file in or -// below the current root. -func (l *fileLoader) Load(path string) ([]byte, error) { - if filepath.IsAbs(path) { - return nil, l.loadOutOfBounds(path) - } - d, f, err := l.fSys.CleanedAbs(l.root.Join(path)) - if err != nil { - return nil, err - } - if f == "" { - return nil, fmt.Errorf( - "'%s' must be a file (got d='%s')", path, d) - } - if !d.HasPrefix(l.root) { - return nil, l.loadOutOfBounds(path) - } - return l.fSys.ReadFile(d.Join(f)) -} - -func (l *fileLoader) loadOutOfBounds(path string) error { - return fmt.Errorf( - "security; file '%s' is not in or below '%s'", - path, l.root) -} - -// Cleanup runs the cleaner. -func (l *fileLoader) Cleanup() error { - return l.cleaner() -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/loader/loader.go b/vendor/sigs.k8s.io/kustomize/pkg/loader/loader.go deleted file mode 100644 index 53de6553a742..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/loader/loader.go +++ /dev/null @@ -1,39 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Package loader has a data loading interface and various implementations. -package loader - -import ( - "sigs.k8s.io/kustomize/pkg/fs" - "sigs.k8s.io/kustomize/pkg/git" - "sigs.k8s.io/kustomize/pkg/ifc" -) - -// NewLoader returns a Loader. -func NewLoader(path string, fSys fs.FileSystem) (ifc.Loader, error) { - repoSpec, err := git.NewRepoSpecFromUrl(path) - if err == nil { - return newLoaderAtGitClone( - repoSpec, fSys, nil, git.ClonerUsingGitExec) - } - root, err := demandDirectoryRoot(fSys, path) - if err != nil { - return nil, err - } - return newLoaderAtConfirmedDir( - root, fSys, nil, git.ClonerUsingGitExec), nil -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/patch/json6902.go b/vendor/sigs.k8s.io/kustomize/pkg/patch/json6902.go deleted file mode 100644 index 9ddb1faa1018..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/patch/json6902.go +++ /dev/null @@ -1,40 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package patch - -import "sigs.k8s.io/kustomize/pkg/gvk" - -// Json6902 represents a json patch for an object -// with format documented https://tools.ietf.org/html/rfc6902. -type Json6902 struct { - // Target refers to a Kubernetes object that the json patch will be - // applied to. It must refer to a Kubernetes resource under the - // purview of this kustomization. Target should use the - // raw name of the object (the name specified in its YAML, - // before addition of a namePrefix and a nameSuffix). - Target *Target `json:"target" yaml:"target"` - - // relative file path for a json patch file inside a kustomization - Path string `json:"path,omitempty" yaml:"path,omitempty"` -} - -// Target represents the kubernetes object that the patch is applied to -type Target struct { - gvk.Gvk `json:",inline,omitempty" yaml:",inline,omitempty"` - Namespace string `json:"namespace,omitempty" yaml:"namespace,omitempty"` - Name string `json:"name" yaml:"name"` -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/patch/strategicmerge.go b/vendor/sigs.k8s.io/kustomize/pkg/patch/strategicmerge.go deleted file mode 100644 index 596cc346de1b..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/patch/strategicmerge.go +++ /dev/null @@ -1,40 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package patch - -// StrategicMerge represents a relative path to a -// stategic merge patch with the format -// https://github.com/kubernetes/community/blob/master/contributors/devel/strategic-merge-patch.md -type StrategicMerge string - -// Append appends a slice of patch paths to a StrategicMerge slice -func Append(patches []StrategicMerge, paths ...string) []StrategicMerge { - for _, p := range paths { - patches = append(patches, StrategicMerge(p)) - } - return patches -} - -// Exist determines if a patch path exists in a slice of StrategicMerge -func Exist(patches []StrategicMerge, path string) bool { - for _, p := range patches { - if p == StrategicMerge(path) { - return true - } - } - return false -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/patch/transformer/factory.go b/vendor/sigs.k8s.io/kustomize/pkg/patch/transformer/factory.go deleted file mode 100644 index b373dfb7210b..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/patch/transformer/factory.go +++ /dev/null @@ -1,83 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package transformer - -import ( - "fmt" - "sigs.k8s.io/kustomize/pkg/ifc" - "sigs.k8s.io/kustomize/pkg/resid" - - "sigs.k8s.io/kustomize/pkg/gvk" - "sigs.k8s.io/kustomize/pkg/patch" - "sigs.k8s.io/kustomize/pkg/transformers" -) - -// PatchJson6902Factory makes Json6902 transformers -type PatchJson6902Factory struct { - loader ifc.Loader -} - -// NewPatchJson6902Factory returns a new PatchJson6902Factory. -func NewPatchJson6902Factory(l ifc.Loader) PatchJson6902Factory { - return PatchJson6902Factory{loader: l} -} - -// MakePatchJson6902Transformer returns a transformer for applying Json6902 patch -func (f PatchJson6902Factory) MakePatchJson6902Transformer(patches []patch.Json6902) (transformers.Transformer, error) { - var ts []transformers.Transformer - for _, p := range patches { - t, err := f.makeOnePatchJson6902Transformer(p) - if err != nil { - return nil, err - } - if t != nil { - ts = append(ts, t) - } - } - return transformers.NewMultiTransformerWithConflictCheck(ts), nil -} - -func (f PatchJson6902Factory) makeOnePatchJson6902Transformer(p patch.Json6902) (transformers.Transformer, error) { - if p.Target == nil { - return nil, fmt.Errorf("must specify the target field in patchesJson6902") - } - if p.Path == "" { - return nil, fmt.Errorf("must specify the path for a json patch file") - } - - targetId := resid.NewResIdWithPrefixNamespace( - gvk.Gvk{ - Group: p.Target.Group, - Version: p.Target.Version, - Kind: p.Target.Kind, - }, - p.Target.Name, - "", - p.Target.Namespace, - ) - - rawOp, err := f.loader.Load(p.Path) - if err != nil { - return nil, err - } - - return newPatchJson6902JSONTransformer(targetId, rawOp) -} - -func isJsonFormat(data []byte) bool { - return data[0] == '[' -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/patch/transformer/patchjson6902json.go b/vendor/sigs.k8s.io/kustomize/pkg/patch/transformer/patchjson6902json.go deleted file mode 100644 index 1f09939d1d04..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/patch/transformer/patchjson6902json.go +++ /dev/null @@ -1,108 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package transformer - -import ( - "fmt" - - "github.com/evanphx/json-patch" - "github.com/ghodss/yaml" - "github.com/pkg/errors" - "sigs.k8s.io/kustomize/pkg/resid" - "sigs.k8s.io/kustomize/pkg/resmap" - "sigs.k8s.io/kustomize/pkg/resource" - "sigs.k8s.io/kustomize/pkg/transformers" -) - -// patchJson6902JSONTransformer applies patches. -type patchJson6902JSONTransformer struct { - target resid.ResId - patch jsonpatch.Patch - rawOp []byte -} - -var _ transformers.Transformer = &patchJson6902JSONTransformer{} - -// newPatchJson6902JSONTransformer constructs a PatchJson6902 transformer. -func newPatchJson6902JSONTransformer( - id resid.ResId, rawOp []byte) (transformers.Transformer, error) { - op := rawOp - var err error - if !isJsonFormat(op) { - // if it isn't JSON, try to parse it as YAML - op, err = yaml.YAMLToJSON(rawOp) - if err != nil { - return nil, err - } - } - decodedPatch, err := jsonpatch.DecodePatch(op) - if err != nil { - return nil, err - } - if len(decodedPatch) == 0 { - return transformers.NewNoOpTransformer(), nil - } - return &patchJson6902JSONTransformer{target: id, patch: decodedPatch, rawOp: rawOp}, nil -} - -// Transform apply the json patches on top of the base resources. -func (t *patchJson6902JSONTransformer) Transform(m resmap.ResMap) error { - obj, err := t.findTargetObj(m) - if err != nil { - return err - } - rawObj, err := obj.MarshalJSON() - if err != nil { - return err - } - modifiedObj, err := t.patch.Apply(rawObj) - if err != nil { - return errors.Wrapf(err, "failed to apply json patch '%s'", string(t.rawOp)) - } - err = obj.UnmarshalJSON(modifiedObj) - if err != nil { - return err - } - return nil -} - -func (t *patchJson6902JSONTransformer) findTargetObj( - m resmap.ResMap) (*resource.Resource, error) { - var matched []resid.ResId - // TODO(monopole): namespace bug in json patch? - // Since introduction in PR #300 - // (see pkg/patch/transformer/util.go), - // this code has treated an empty namespace like a wildcard - // rather than like an additional restriction to match - // only the empty namespace. No test coverage to confirm. - // Not sure if desired, keeping it for now. - if t.target.Namespace() != "" { - matched = m.GetMatchingIds(t.target.NsGvknEquals) - } else { - matched = m.GetMatchingIds(t.target.GvknEquals) - } - if len(matched) == 0 { - return nil, fmt.Errorf( - "couldn't find target %v for json patch", t.target) - } - if len(matched) > 1 { - return nil, fmt.Errorf( - "found multiple targets %v matching %v for json patch", - matched, t.target) - } - return m[matched[0]], nil -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/resid/resid.go b/vendor/sigs.k8s.io/kustomize/pkg/resid/resid.go deleted file mode 100644 index dbf9a3e92907..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/resid/resid.go +++ /dev/null @@ -1,207 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package resid - -import ( - "strings" - - "sigs.k8s.io/kustomize/pkg/gvk" -) - -// ResId is an immutable identifier of a k8s resource object. -type ResId struct { - // Gvk of the resource. - gvKind gvk.Gvk - - // name of the resource before transformation. - name string - - // namePrefix of the resource. - // An untransformed resource has no prefix. - // A fully transformed resource has an arbitrary - // number of prefixes concatenated together. - prefix string - - // nameSuffix of the resource. - // An untransformed resource has no suffix. - // A fully transformed resource has an arbitrary - // number of suffixes concatenated together. - suffix string - - // Namespace the resource belongs to. - // An untransformed resource has no namespace. - // A fully transformed resource has the namespace - // from the top most overlay. - namespace string -} - -// NewResIdWithPrefixSuffixNamespace creates new resource identifier with a prefix, suffix and a namespace -func NewResIdWithPrefixSuffixNamespace(k gvk.Gvk, n, p, s, ns string) ResId { - return ResId{gvKind: k, name: n, prefix: p, suffix: s, namespace: ns} -} - -// NewResIdWithPrefixNamespace creates new resource identifier with a prefix and a namespace -func NewResIdWithPrefixNamespace(k gvk.Gvk, n, p, ns string) ResId { - return ResId{gvKind: k, name: n, prefix: p, namespace: ns} -} - -// NewResIdWithSuffixNamespace creates new resource identifier with a suffix and a namespace -func NewResIdWithSuffixNamespace(k gvk.Gvk, n, s, ns string) ResId { - return ResId{gvKind: k, name: n, suffix: s, namespace: ns} -} - -// NewResIdWithPrefixSuffix creates new resource identifier with a prefix and suffix -func NewResIdWithPrefixSuffix(k gvk.Gvk, n, p, s string) ResId { - return ResId{gvKind: k, name: n, prefix: p, suffix: s} -} - -// NewResId creates new resource identifier -func NewResId(k gvk.Gvk, n string) ResId { - return ResId{gvKind: k, name: n} -} - -// NewResIdKindOnly creates new resource identifier -func NewResIdKindOnly(k string, n string) ResId { - return ResId{gvKind: gvk.FromKind(k), name: n} -} - -const ( - noNamespace = "~X" - noPrefix = "~P" - noName = "~N" - noSuffix = "~S" - separator = "|" -) - -// String of ResId based on GVK, name and prefix -func (n ResId) String() string { - ns := n.namespace - if ns == "" { - ns = noNamespace - } - p := n.prefix - if p == "" { - p = noPrefix - } - nm := n.name - if nm == "" { - nm = noName - } - s := n.suffix - if s == "" { - s = noSuffix - } - - return strings.Join( - []string{n.gvKind.String(), ns, p, nm, s}, separator) -} - -// GvknString of ResId based on GVK and name -func (n ResId) GvknString() string { - return n.gvKind.String() + separator + n.name -} - -// GvknEquals returns true if the other id matches -// Group/Version/Kind/name. -func (n ResId) GvknEquals(id ResId) bool { - return n.name == id.name && n.gvKind.Equals(id.gvKind) -} - -// NsGvknEquals returns true if the other id matches -// namespace/Group/Version/Kind/name. -func (n ResId) NsGvknEquals(id ResId) bool { - return n.namespace == id.namespace && n.GvknEquals(id) -} - -// Gvk returns Group/Version/Kind of the resource. -func (n ResId) Gvk() gvk.Gvk { - return n.gvKind -} - -// Name returns resource name. -func (n ResId) Name() string { - return n.name -} - -// Namespace returns resource namespace. -func (n ResId) Namespace() string { - return n.namespace -} - -// CopyWithNewPrefixSuffix make a new copy from current ResId -// and append a new prefix and suffix -func (n ResId) CopyWithNewPrefixSuffix(p, s string) ResId { - result := n - if p != "" { - result.prefix = n.concatPrefix(p) - } - if s != "" { - result.suffix = n.concatSuffix(s) - } - return result -} - -// CopyWithNewNamespace make a new copy from current ResId and set a new namespace -func (n ResId) CopyWithNewNamespace(ns string) ResId { - result := n - result.namespace = ns - return result -} - -// HasSameLeftmostPrefix check if two ResIds have the same -// left most prefix. -func (n ResId) HasSameLeftmostPrefix(id ResId) bool { - prefixes1 := n.prefixList() - prefixes2 := id.prefixList() - return prefixes1[0] == prefixes2[0] -} - -// HasSameRightmostSuffix check if two ResIds have the same -// right most suffix. -func (n ResId) HasSameRightmostSuffix(id ResId) bool { - suffixes1 := n.suffixList() - suffixes2 := id.suffixList() - return suffixes1[len(suffixes1)-1] == suffixes2[len(suffixes2)-1] -} - -func (n ResId) concatPrefix(p string) string { - if p == "" { - return n.prefix - } - if n.prefix == "" { - return p - } - return p + ":" + n.prefix -} - -func (n ResId) concatSuffix(s string) string { - if s == "" { - return n.suffix - } - if n.suffix == "" { - return s - } - return n.suffix + ":" + s -} - -func (n ResId) prefixList() []string { - return strings.Split(n.prefix, ":") -} - -func (n ResId) suffixList() []string { - return strings.Split(n.suffix, ":") -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/resmap/factory.go b/vendor/sigs.k8s.io/kustomize/pkg/resmap/factory.go deleted file mode 100644 index 923cde232516..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/resmap/factory.go +++ /dev/null @@ -1,123 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package resmap - -import ( - "fmt" - - "github.com/pkg/errors" - "sigs.k8s.io/kustomize/pkg/ifc" - internal "sigs.k8s.io/kustomize/pkg/internal/error" - "sigs.k8s.io/kustomize/pkg/resource" - "sigs.k8s.io/kustomize/pkg/types" -) - -// Factory makes instances of ResMap. -type Factory struct { - resF *resource.Factory -} - -// NewFactory returns a new resmap.Factory. -func NewFactory(rf *resource.Factory) *Factory { - return &Factory{resF: rf} -} - -// RF returns a resource.Factory. -func (rmF *Factory) RF() *resource.Factory { - return rmF.resF -} - -// FromFiles returns a ResMap given a resource path slice. -func (rmF *Factory) FromFiles( - loader ifc.Loader, paths []string) (ResMap, error) { - var result []ResMap - for _, path := range paths { - content, err := loader.Load(path) - if err != nil { - return nil, errors.Wrap(err, "Load from path "+path+" failed") - } - res, err := rmF.NewResMapFromBytes(content) - if err != nil { - return nil, internal.Handler(err, path) - } - result = append(result, res) - } - return MergeWithErrorOnIdCollision(result...) -} - -// newResMapFromBytes decodes a list of objects in byte array format. -func (rmF *Factory) NewResMapFromBytes(b []byte) (ResMap, error) { - resources, err := rmF.resF.SliceFromBytes(b) - if err != nil { - return nil, err - } - - result := ResMap{} - for _, res := range resources { - id := res.Id() - if _, found := result[id]; found { - return result, fmt.Errorf("GroupVersionKindName: %#v already exists b the map", id) - } - result[id] = res - } - return result, nil -} - -// NewResMapFromConfigMapArgs returns a Resource slice given -// a configmap metadata slice from kustomization file. -func (rmF *Factory) NewResMapFromConfigMapArgs(argList []types.ConfigMapArgs, options *types.GeneratorOptions) (ResMap, error) { - var resources []*resource.Resource - for _, args := range argList { - res, err := rmF.resF.MakeConfigMap(&args, options) - if err != nil { - return nil, errors.Wrap(err, "NewResMapFromConfigMapArgs") - } - resources = append(resources, res) - } - return newResMapFromResourceSlice(resources) -} - -// NewResMapFromSecretArgs takes a SecretArgs slice, generates -// secrets from each entry, and accumulates them in a ResMap. -func (rmF *Factory) NewResMapFromSecretArgs(argsList []types.SecretArgs, options *types.GeneratorOptions) (ResMap, error) { - var resources []*resource.Resource - for _, args := range argsList { - res, err := rmF.resF.MakeSecret(&args, options) - if err != nil { - return nil, errors.Wrap(err, "NewResMapFromSecretArgs") - } - resources = append(resources, res) - } - return newResMapFromResourceSlice(resources) -} - -// Set sets the loader for the underlying factory -func (rmF *Factory) Set(ldr ifc.Loader) { - rmF.resF.Set(ldr) -} - -func newResMapFromResourceSlice(resources []*resource.Resource) (ResMap, error) { - result := ResMap{} - for _, res := range resources { - id := res.Id() - if _, found := result[id]; found { - return nil, fmt.Errorf("duplicated %#v is not allowed", id) - } - result[id] = res - } - return result, nil -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/resmap/resmap.go b/vendor/sigs.k8s.io/kustomize/pkg/resmap/resmap.go deleted file mode 100644 index ca1e72398087..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/resmap/resmap.go +++ /dev/null @@ -1,200 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Package resmap implements a map from ResId to Resource that tracks all resources in a kustomization. -package resmap - -import ( - "bytes" - "fmt" - "reflect" - "sort" - - "github.com/ghodss/yaml" - "sigs.k8s.io/kustomize/pkg/resid" - "sigs.k8s.io/kustomize/pkg/resource" - "sigs.k8s.io/kustomize/pkg/types" -) - -// ResMap is a map from ResId to Resource. -type ResMap map[resid.ResId]*resource.Resource - -type IdMatcher func(resid.ResId) bool - -// GetMatchingIds returns a slice of ResId keys from the map -// that all satisfy the given matcher function. -func (m ResMap) GetMatchingIds(matches IdMatcher) []resid.ResId { - var result []resid.ResId - for id := range m { - if matches(id) { - result = append(result, id) - } - } - return result -} - -// EncodeAsYaml encodes a ResMap to YAML; encoded objects separated by `---`. -func (m ResMap) EncodeAsYaml() ([]byte, error) { - var ids []resid.ResId - for id := range m { - ids = append(ids, id) - } - sort.Sort(IdSlice(ids)) - - firstObj := true - var b []byte - buf := bytes.NewBuffer(b) - for _, id := range ids { - obj := m[id] - out, err := yaml.Marshal(obj.Map()) - if err != nil { - return nil, err - } - if firstObj { - firstObj = false - } else { - _, err = buf.WriteString("---\n") - if err != nil { - return nil, err - } - } - _, err = buf.Write(out) - if err != nil { - return nil, err - } - } - return buf.Bytes(), nil -} - -// ErrorIfNotEqual returns error if maps are not equal. -func (m ResMap) ErrorIfNotEqual(m2 ResMap) error { - if len(m) != len(m2) { - var keySet1 []resid.ResId - var keySet2 []resid.ResId - for id := range m { - keySet1 = append(keySet1, id) - } - for id := range m2 { - keySet2 = append(keySet2, id) - } - return fmt.Errorf("maps has different number of entries: %#v doesn't equals %#v", keySet1, keySet2) - } - for id, obj1 := range m { - obj2, found := m2[id] - if !found { - return fmt.Errorf("%#v doesn't exist in %#v", id, m2) - } - if !reflect.DeepEqual(obj1, obj2) { - return fmt.Errorf("%#v doesn't deep equal %#v", obj1, obj2) - } - } - return nil -} - -// DeepCopy clone the resmap into a new one -func (m ResMap) DeepCopy(rf *resource.Factory) ResMap { - mcopy := make(ResMap) - for id, obj := range m { - mcopy[id] = obj.DeepCopy() - } - return mcopy -} - -// FilterBy returns a subset ResMap containing ResIds with -// the same namespace and leftmost name prefix and rightmost name -// as the inputId. If inputId is a cluster level resource, this -// returns the original ResMap. -func (m ResMap) FilterBy(inputId resid.ResId) ResMap { - if inputId.Gvk().IsClusterKind() { - return m - } - result := ResMap{} - for id, res := range m { - if id.Gvk().IsClusterKind() || id.Namespace() == inputId.Namespace() && - id.HasSameLeftmostPrefix(inputId) && - id.HasSameRightmostSuffix(inputId) { - result[id] = res - } - } - return result -} - -// MergeWithErrorOnIdCollision combines multiple ResMap instances, failing on -// key collision and skipping nil maps. -// If all of the maps are nil, an empty ResMap is returned. -func MergeWithErrorOnIdCollision(maps ...ResMap) (ResMap, error) { - result := ResMap{} - for _, m := range maps { - if m == nil { - continue - } - for id, res := range m { - if _, found := result[id]; found { - return nil, fmt.Errorf("id '%q' already used", id) - } - result[id] = res - } - } - return result, nil -} - -// MergeWithOverride combines multiple ResMap instances, allowing and sometimes -// demanding certain collisions and skipping nil maps. -// A collision would be demanded, say, when a generated ConfigMap has the -// "replace" option in its generation instructions, meaning it is supposed -// to replace something from the raw resources list. -// If all of the maps are nil, an empty ResMap is returned. -// When looping over the instances to combine them, if a resource id for -// resource X is found to be already in the combined map, then the behavior -// field for X must be BehaviorMerge or BehaviorReplace. If X is not in the -// map, then it's behavior cannot be merge or replace. -func MergeWithOverride(maps ...ResMap) (ResMap, error) { - result := maps[0] - if result == nil { - result = ResMap{} - } - for _, m := range maps[1:] { - if m == nil { - continue - } - for id, r := range m { - matchedId := result.GetMatchingIds(id.GvknEquals) - if len(matchedId) == 1 { - id = matchedId[0] - switch r.Behavior() { - case types.BehaviorReplace: - r.Replace(result[id]) - result[id] = r - case types.BehaviorMerge: - r.Merge(result[id]) - result[id] = r - default: - return nil, fmt.Errorf("id %#v exists; must merge or replace", id) - } - } else if len(matchedId) == 0 { - switch r.Behavior() { - case types.BehaviorMerge, types.BehaviorReplace: - return nil, fmt.Errorf("id %#v does not exist; cannot merge or replace", id) - default: - result[id] = r - } - } else { - return nil, fmt.Errorf("merge conflict, found multiple objects %v the Resmap %v can merge into", matchedId, id) - } - } - } - return result, nil -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/resource/factory.go b/vendor/sigs.k8s.io/kustomize/pkg/resource/factory.go deleted file mode 100644 index 148323dd6b40..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/resource/factory.go +++ /dev/null @@ -1,148 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package resource - -import ( - "encoding/json" - "fmt" - "log" - "strings" - - "sigs.k8s.io/kustomize/pkg/ifc" - internal "sigs.k8s.io/kustomize/pkg/internal/error" - "sigs.k8s.io/kustomize/pkg/patch" - "sigs.k8s.io/kustomize/pkg/types" -) - -// Factory makes instances of Resource. -type Factory struct { - kf ifc.KunstructuredFactory -} - -// NewFactory makes an instance of Factory. -func NewFactory(kf ifc.KunstructuredFactory) *Factory { - return &Factory{kf: kf} -} - -// FromMap returns a new instance of Resource. -func (rf *Factory) FromMap(m map[string]interface{}) *Resource { - return &Resource{ - Kunstructured: rf.kf.FromMap(m), - options: types.NewGenArgs(nil, nil), - } -} - -// FromMapAndOption returns a new instance of Resource with given options. -func (rf *Factory) FromMapAndOption(m map[string]interface{}, args *types.GeneratorArgs, option *types.GeneratorOptions) *Resource { - return &Resource{ - Kunstructured: rf.kf.FromMap(m), - options: types.NewGenArgs(args, option), - } -} - -// FromKunstructured returns a new instance of Resource. -func (rf *Factory) FromKunstructured( - u ifc.Kunstructured) *Resource { - if u == nil { - log.Fatal("unstruct ifc must not be null") - } - return &Resource{ - Kunstructured: u, - options: types.NewGenArgs(nil, nil), - } -} - -// SliceFromPatches returns a slice of resources given a patch path -// slice from a kustomization file. -func (rf *Factory) SliceFromPatches( - ldr ifc.Loader, paths []patch.StrategicMerge) ([]*Resource, error) { - var result []*Resource - for _, path := range paths { - content, err := ldr.Load(string(path)) - if err != nil { - return nil, err - } - res, err := rf.SliceFromBytes(content) - if err != nil { - return nil, internal.Handler(err, string(path)) - } - result = append(result, res...) - } - return result, nil -} - -// SliceFromBytes unmarshalls bytes into a Resource slice. -func (rf *Factory) SliceFromBytes(in []byte) ([]*Resource, error) { - kunStructs, err := rf.kf.SliceFromBytes(in) - if err != nil { - return nil, err - } - var result []*Resource - for len(kunStructs) > 0 { - u := kunStructs[0] - kunStructs = kunStructs[1:] - if strings.HasSuffix(u.GetKind(), "List") { - items := u.Map()["items"] - itemsSlice, ok := items.([]interface{}) - if !ok { - if items == nil { - // an empty list - continue - } - return nil, fmt.Errorf("items in List is type %T, expected array", items) - } - for _, item := range itemsSlice { - itemJSON, err := json.Marshal(item) - if err != nil { - return nil, err - } - innerU, err := rf.kf.SliceFromBytes(itemJSON) - if err != nil { - return nil, err - } - // append innerU to kunStructs so nested Lists can be handled - kunStructs = append(kunStructs, innerU...) - } - } else { - result = append(result, rf.FromKunstructured(u)) - } - } - return result, nil -} - -// Set sets the loader for the underlying factory -func (rf *Factory) Set(ldr ifc.Loader) { - rf.kf.Set(ldr) -} - -// MakeConfigMap makes an instance of Resource for ConfigMap -func (rf *Factory) MakeConfigMap(args *types.ConfigMapArgs, options *types.GeneratorOptions) (*Resource, error) { - u, err := rf.kf.MakeConfigMap(args, options) - if err != nil { - return nil, err - } - return &Resource{Kunstructured: u, options: types.NewGenArgs(&types.GeneratorArgs{Behavior: args.Behavior}, options)}, nil -} - -// MakeSecret makes an instance of Resource for Secret -func (rf *Factory) MakeSecret(args *types.SecretArgs, options *types.GeneratorOptions) (*Resource, error) { - u, err := rf.kf.MakeSecret(args, options) - if err != nil { - return nil, err - } - return &Resource{Kunstructured: u, options: types.NewGenArgs(&types.GeneratorArgs{Behavior: args.Behavior}, options)}, nil -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/resource/resource.go b/vendor/sigs.k8s.io/kustomize/pkg/resource/resource.go deleted file mode 100644 index 1e0e3764b859..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/resource/resource.go +++ /dev/null @@ -1,107 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Package resource implements representations of k8s API resources as "unstructured" objects. -package resource - -import ( - "strings" - - "sigs.k8s.io/kustomize/pkg/ifc" - "sigs.k8s.io/kustomize/pkg/resid" - "sigs.k8s.io/kustomize/pkg/types" -) - -// Resource is map representation of a Kubernetes API resource object -// paired with a GenerationBehavior. -type Resource struct { - ifc.Kunstructured - options *types.GenArgs -} - -// String returns resource as JSON. -func (r *Resource) String() string { - bs, err := r.MarshalJSON() - if err != nil { - return "<" + err.Error() + ">" - } - return strings.TrimSpace(string(bs)) + r.options.String() -} - -// DeepCopy returns a new copy of resource -func (r *Resource) DeepCopy() *Resource { - return &Resource{ - Kunstructured: r.Kunstructured.Copy(), - options: r.options, - } -} - -// Behavior returns the behavior for the resource. -func (r *Resource) Behavior() types.GenerationBehavior { - return r.options.Behavior() -} - -// NeedAppendHash checks if the resource need a hash suffix -func (r *Resource) NeedHashSuffix() bool { - return r.options != nil && r.options.NeedsHashSuffix() -} - -// Id returns the ResId for the resource. -func (r *Resource) Id() resid.ResId { - namespace, _ := r.GetFieldValue("metadata.namespace") - return resid.NewResIdWithPrefixNamespace(r.GetGvk(), r.GetName(), "", namespace) -} - -// Merge performs merge with other resource. -func (r *Resource) Merge(other *Resource) { - r.Replace(other) - mergeConfigmap(r.Map(), other.Map(), r.Map()) -} - -// Replace performs replace with other resource. -func (r *Resource) Replace(other *Resource) { - r.SetLabels(mergeStringMaps(other.GetLabels(), r.GetLabels())) - r.SetAnnotations( - mergeStringMaps(other.GetAnnotations(), r.GetAnnotations())) - r.SetName(other.GetName()) - r.options = other.options -} - -// TODO: Add BinaryData once we sync to new k8s.io/api -func mergeConfigmap( - mergedTo map[string]interface{}, - maps ...map[string]interface{}) { - mergedMap := map[string]interface{}{} - for _, m := range maps { - datamap, ok := m["data"].(map[string]interface{}) - if ok { - for key, value := range datamap { - mergedMap[key] = value - } - } - } - mergedTo["data"] = mergedMap -} - -func mergeStringMaps(maps ...map[string]string) map[string]string { - result := map[string]string{} - for _, m := range maps { - for key, value := range m { - result[key] = value - } - } - return result -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/target/kusttarget.go b/vendor/sigs.k8s.io/kustomize/pkg/target/kusttarget.go deleted file mode 100644 index f136b2683ba9..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/target/kusttarget.go +++ /dev/null @@ -1,315 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Package target implements state for the set of all resources to customize. -package target - -import ( - "bytes" - "encoding/json" - "fmt" - "strings" - - "github.com/ghodss/yaml" - "github.com/pkg/errors" - "sigs.k8s.io/kustomize/pkg/constants" - "sigs.k8s.io/kustomize/pkg/ifc" - "sigs.k8s.io/kustomize/pkg/ifc/transformer" - interror "sigs.k8s.io/kustomize/pkg/internal/error" - patchtransformer "sigs.k8s.io/kustomize/pkg/patch/transformer" - "sigs.k8s.io/kustomize/pkg/resmap" - "sigs.k8s.io/kustomize/pkg/resource" - "sigs.k8s.io/kustomize/pkg/transformers" - "sigs.k8s.io/kustomize/pkg/transformers/config" - "sigs.k8s.io/kustomize/pkg/types" -) - -// KustTarget encapsulates the entirety of a kustomization build. -type KustTarget struct { - kustomization *types.Kustomization - ldr ifc.Loader - rFactory *resmap.Factory - tFactory transformer.Factory -} - -// NewKustTarget returns a new instance of KustTarget primed with a Loader. -func NewKustTarget( - ldr ifc.Loader, - rFactory *resmap.Factory, - tFactory transformer.Factory) (*KustTarget, error) { - content, err := loadKustFile(ldr) - if err != nil { - return nil, err - } - content = types.DealWithDeprecatedFields(content) - var k types.Kustomization - err = unmarshal(content, &k) - if err != nil { - return nil, err - } - errs := k.EnforceFields() - if len(errs) > 0 { - return nil, fmt.Errorf("Failed to read kustomization file under %s:\n"+strings.Join(errs, "\n"), ldr.Root()) - } - return &KustTarget{ - kustomization: &k, - ldr: ldr, - rFactory: rFactory, - tFactory: tFactory, - }, nil -} - -func quoted(l []string) []string { - r := make([]string, len(l)) - for i, v := range l { - r[i] = "'" + v + "'" - } - return r -} - -func commaOr(q []string) string { - return strings.Join(q[:len(q)-1], ", ") + " or " + q[len(q)-1] -} - -func loadKustFile(ldr ifc.Loader) ([]byte, error) { - var content []byte - match := 0 - for _, kf := range constants.KustomizationFileNames { - c, err := ldr.Load(kf) - if err == nil { - match += 1 - content = c - } - } - switch match { - case 0: - return nil, fmt.Errorf( - "unable to find one of %v in directory '%s'", - commaOr(quoted(constants.KustomizationFileNames)), ldr.Root()) - case 1: - return content, nil - default: - return nil, fmt.Errorf("Found multiple kustomization files under: %s\n", ldr.Root()) - } -} - -func unmarshal(y []byte, o interface{}) error { - j, err := yaml.YAMLToJSON(y) - if err != nil { - return err - } - dec := json.NewDecoder(bytes.NewReader(j)) - dec.DisallowUnknownFields() - return dec.Decode(o) -} - -// MakeCustomizedResMap creates a ResMap per kustomization instructions. -// The Resources in the returned ResMap are fully customized. -func (kt *KustTarget) MakeCustomizedResMap() (resmap.ResMap, error) { - ra, err := kt.AccumulateTarget() - if err != nil { - return nil, err - } - err = ra.Transform(kt.tFactory.MakeHashTransformer()) - if err != nil { - return nil, err - } - // Given that names have changed (prefixs/suffixes added), - // fix all the back references to those names. - err = ra.FixBackReferences() - if err != nil { - return nil, err - } - // With all the back references fixed, it's OK to resolve Vars. - err = ra.ResolveVars() - return ra.ResMap(), err -} - -func (kt *KustTarget) shouldAddHashSuffixesToGeneratedResources() bool { - return kt.kustomization.GeneratorOptions == nil || - !kt.kustomization.GeneratorOptions.DisableNameSuffixHash -} - -// AccumulateTarget returns a new ResAccumulator, -// holding customized resources and the data/rules used -// to do so. The name back references and vars are -// not yet fixed. -func (kt *KustTarget) AccumulateTarget() ( - ra *ResAccumulator, err error) { - // TODO(monopole): Get rid of the KustomizationErrors accumulator. - // It's not consistently used, and complicates tests. - errs := &interror.KustomizationErrors{} - ra, errs = kt.accumulateBases() - resources, err := kt.rFactory.FromFiles( - kt.ldr, kt.kustomization.Resources) - if err != nil { - errs.Append(errors.Wrap(err, "rawResources failed to read Resources")) - } - if len(errs.Get()) > 0 { - return ra, errs - } - err = ra.MergeResourcesWithErrorOnIdCollision(resources) - if err != nil { - errs.Append(errors.Wrap(err, "MergeResourcesWithErrorOnIdCollision")) - } - tConfig, err := config.MakeTransformerConfig( - kt.ldr, kt.kustomization.Configurations) - if err != nil { - return nil, err - } - err = ra.MergeConfig(tConfig) - if err != nil { - errs.Append(errors.Wrap(err, "MergeConfig")) - } - err = ra.MergeVars(kt.kustomization.Vars) - if err != nil { - errs.Append(errors.Wrap(err, "MergeVars")) - } - crdTc, err := config.LoadConfigFromCRDs(kt.ldr, kt.kustomization.Crds) - if err != nil { - errs.Append(errors.Wrap(err, "LoadCRDs")) - } - err = ra.MergeConfig(crdTc) - if err != nil { - errs.Append(errors.Wrap(err, "merge CRDs")) - } - resMap, err := kt.generateConfigMapsAndSecrets(errs) - if err != nil { - errs.Append(errors.Wrap(err, "generateConfigMapsAndSecrets")) - } - err = ra.MergeResourcesWithOverride(resMap) - if err != nil { - return nil, err - } - patches, err := kt.rFactory.RF().SliceFromPatches( - kt.ldr, kt.kustomization.PatchesStrategicMerge) - if err != nil { - errs.Append(errors.Wrap(err, "SliceFromPatches")) - } - if len(errs.Get()) > 0 { - return nil, errs - } - t, err := kt.newTransformer(patches, ra.tConfig) - if err != nil { - return nil, err - } - err = ra.Transform(t) - if err != nil { - return nil, err - } - return ra, nil -} - -func (kt *KustTarget) generateConfigMapsAndSecrets( - errs *interror.KustomizationErrors) (resmap.ResMap, error) { - kt.rFactory.Set(kt.ldr) - cms, err := kt.rFactory.NewResMapFromConfigMapArgs( - kt.kustomization.ConfigMapGenerator, kt.kustomization.GeneratorOptions) - if err != nil { - errs.Append(errors.Wrap(err, "NewResMapFromConfigMapArgs")) - } - secrets, err := kt.rFactory.NewResMapFromSecretArgs( - kt.kustomization.SecretGenerator, kt.kustomization.GeneratorOptions) - if err != nil { - errs.Append(errors.Wrap(err, "NewResMapFromSecretArgs")) - } - return resmap.MergeWithErrorOnIdCollision(cms, secrets) -} - -// accumulateBases returns a new ResAccumulator -// holding customized resources and the data/rules -// used to customized them from only the _bases_ -// of this KustTarget. -func (kt *KustTarget) accumulateBases() ( - ra *ResAccumulator, errs *interror.KustomizationErrors) { - errs = &interror.KustomizationErrors{} - ra = MakeEmptyAccumulator() - - for _, path := range kt.kustomization.Bases { - ldr, err := kt.ldr.New(path) - if err != nil { - errs.Append(errors.Wrap(err, "couldn't make loader for "+path)) - continue - } - subKt, err := NewKustTarget( - ldr, kt.rFactory, kt.tFactory) - if err != nil { - errs.Append(errors.Wrap(err, "couldn't make target for "+path)) - ldr.Cleanup() - continue - } - subRa, err := subKt.AccumulateTarget() - if err != nil { - errs.Append(errors.Wrap(err, "AccumulateTarget")) - ldr.Cleanup() - continue - } - err = ra.MergeAccumulator(subRa) - if err != nil { - errs.Append(errors.Wrap(err, path)) - } - ldr.Cleanup() - } - return ra, errs -} - -// newTransformer makes a Transformer that does a collection -// of object transformations. -func (kt *KustTarget) newTransformer( - patches []*resource.Resource, tConfig *config.TransformerConfig) ( - transformers.Transformer, error) { - var r []transformers.Transformer - t, err := kt.tFactory.MakePatchTransformer(patches, kt.rFactory.RF()) - if err != nil { - return nil, err - } - r = append(r, t) - r = append(r, transformers.NewNamespaceTransformer( - string(kt.kustomization.Namespace), tConfig.NameSpace)) - t, err = transformers.NewNamePrefixSuffixTransformer( - string(kt.kustomization.NamePrefix), - string(kt.kustomization.NameSuffix), - tConfig.NamePrefix, - ) - if err != nil { - return nil, err - } - r = append(r, t) - t, err = transformers.NewLabelsMapTransformer( - kt.kustomization.CommonLabels, tConfig.CommonLabels) - if err != nil { - return nil, err - } - r = append(r, t) - t, err = transformers.NewAnnotationsMapTransformer( - kt.kustomization.CommonAnnotations, tConfig.CommonAnnotations) - if err != nil { - return nil, err - } - r = append(r, t) - t, err = patchtransformer.NewPatchJson6902Factory(kt.ldr). - MakePatchJson6902Transformer(kt.kustomization.PatchesJson6902) - if err != nil { - return nil, err - } - r = append(r, t) - t, err = transformers.NewImageTransformer(kt.kustomization.Images) - if err != nil { - return nil, err - } - r = append(r, t) - return transformers.NewMultiTransformer(r), nil -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/target/resaccumulator.go b/vendor/sigs.k8s.io/kustomize/pkg/target/resaccumulator.go deleted file mode 100644 index b8c45015a547..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/target/resaccumulator.go +++ /dev/null @@ -1,161 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package target - -import ( - "fmt" - "log" - "strings" - - "sigs.k8s.io/kustomize/pkg/resid" - "sigs.k8s.io/kustomize/pkg/resmap" - "sigs.k8s.io/kustomize/pkg/transformers" - "sigs.k8s.io/kustomize/pkg/transformers/config" - "sigs.k8s.io/kustomize/pkg/types" -) - -// ResAccumulator accumulates resources and the rules -// used to customize those resources. -// TODO(monopole): Move to "accumulator" package and make members private. -// This will make a better separation between KustTarget, which should -// be mainly concerned with data loading, and this class, which could -// become the home of all transformation data and logic. -type ResAccumulator struct { - resMap resmap.ResMap - tConfig *config.TransformerConfig - varSet types.VarSet -} - -func MakeEmptyAccumulator() *ResAccumulator { - ra := &ResAccumulator{} - ra.resMap = make(resmap.ResMap) - ra.tConfig = &config.TransformerConfig{} - ra.varSet = types.VarSet{} - return ra -} - -// ResMap returns a copy of the internal resMap. -func (ra *ResAccumulator) ResMap() resmap.ResMap { - result := make(resmap.ResMap) - for k, v := range ra.resMap { - result[k] = v - } - return result -} - -// Vars returns a copy of underlying vars. -func (ra *ResAccumulator) Vars() []types.Var { - return ra.varSet.Set() -} - -func (ra *ResAccumulator) MergeResourcesWithErrorOnIdCollision( - resources resmap.ResMap) (err error) { - ra.resMap, err = resmap.MergeWithErrorOnIdCollision( - resources, ra.resMap) - return err -} - -func (ra *ResAccumulator) MergeResourcesWithOverride( - resources resmap.ResMap) (err error) { - ra.resMap, err = resmap.MergeWithOverride( - ra.resMap, resources) - return err -} - -func (ra *ResAccumulator) MergeConfig( - tConfig *config.TransformerConfig) (err error) { - ra.tConfig, err = ra.tConfig.Merge(tConfig) - return err -} - -func (ra *ResAccumulator) MergeVars(incoming []types.Var) error { - return ra.varSet.MergeSlice(incoming) -} - -func (ra *ResAccumulator) MergeAccumulator(other *ResAccumulator) (err error) { - err = ra.MergeResourcesWithErrorOnIdCollision(other.resMap) - if err != nil { - return err - } - err = ra.MergeConfig(other.tConfig) - if err != nil { - return err - } - return ra.varSet.MergeSet(&other.varSet) -} - -// makeVarReplacementMap returns a map of Var names to -// their final values. The values are strings intended -// for substitution wherever the $(var.Name) occurs. -func (ra *ResAccumulator) makeVarReplacementMap() (map[string]string, error) { - result := map[string]string{} - for _, v := range ra.Vars() { - matched := ra.resMap.GetMatchingIds( - resid.NewResId(v.ObjRef.GVK(), v.ObjRef.Name).GvknEquals) - if len(matched) > 1 { - return nil, fmt.Errorf( - "found %d resId matches for var %s "+ - "(unable to disambiguate)", - len(matched), v) - } - if len(matched) == 1 { - s, err := ra.resMap[matched[0]].GetFieldValue(v.FieldRef.FieldPath) - if err != nil { - return nil, fmt.Errorf( - "field specified in var '%v' "+ - "not found in corresponding resource", v) - } - result[v.Name] = s - } else { - return nil, fmt.Errorf( - "var '%v' cannot be mapped to a field "+ - "in the set of known resources", v) - } - } - return result, nil -} - -func (ra *ResAccumulator) Transform(t transformers.Transformer) error { - return t.Transform(ra.resMap) -} - -func (ra *ResAccumulator) ResolveVars() error { - replacementMap, err := ra.makeVarReplacementMap() - if err != nil { - return err - } - if len(replacementMap) == 0 { - return nil - } - t := transformers.NewRefVarTransformer( - replacementMap, ra.tConfig.VarReference) - err = ra.Transform(t) - if len(t.UnusedVars()) > 0 { - log.Printf( - "well-defined vars that were never replaced: %s\n", - strings.Join(t.UnusedVars(), ",")) - } - return err -} - -func (ra *ResAccumulator) FixBackReferences() (err error) { - if ra.tConfig.NameReference == nil { - return nil - } - return ra.Transform(transformers.NewNameReferenceTransformer( - ra.tConfig.NameReference)) -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/transformers/config/defaultconfig/commonannotations.go b/vendor/sigs.k8s.io/kustomize/pkg/transformers/config/defaultconfig/commonannotations.go deleted file mode 100644 index 2754559042dd..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/transformers/config/defaultconfig/commonannotations.go +++ /dev/null @@ -1,60 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package defaultconfig - -const commonAnnotationFieldSpecs = ` -commonAnnotations: -- path: metadata/annotations - create: true - -- path: spec/template/metadata/annotations - create: true - version: v1 - kind: ReplicationController - -- path: spec/template/metadata/annotations - create: true - kind: Deployment - -- path: spec/template/metadata/annotations - create: true - kind: ReplicaSet - -- path: spec/template/metadata/annotations - create: true - kind: DaemonSet - -- path: spec/template/metadata/annotations - create: true - kind: StatefulSet - -- path: spec/template/metadata/annotations - create: true - group: batch - kind: Job - -- path: spec/jobTemplate/metadata/annotations - create: true - group: batch - kind: CronJob - -- path: spec/jobTemplate/spec/template/metadata/annotations - create: true - group: batch - kind: CronJob - -` diff --git a/vendor/sigs.k8s.io/kustomize/pkg/transformers/config/defaultconfig/defaultconfig.go b/vendor/sigs.k8s.io/kustomize/pkg/transformers/config/defaultconfig/defaultconfig.go deleted file mode 100644 index d96639a8ab09..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/transformers/config/defaultconfig/defaultconfig.go +++ /dev/null @@ -1,49 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Package defaultconfig provides the default -// transformer configurations -package defaultconfig - -import ( - "bytes" -) - -// GetDefaultFieldSpecs returns default fieldSpecs. -func GetDefaultFieldSpecs() []byte { - configData := [][]byte{ - []byte(namePrefixFieldSpecs), - []byte(commonLabelFieldSpecs), - []byte(commonAnnotationFieldSpecs), - []byte(namespaceFieldSpecs), - []byte(varReferenceFieldSpecs), - []byte(nameReferenceFieldSpecs), - } - return bytes.Join(configData, []byte("\n")) -} - -// GetDefaultFieldSpecsAsMap returns default fieldSpecs -// as a string->string map. -func GetDefaultFieldSpecsAsMap() map[string]string { - result := make(map[string]string) - result["nameprefix"] = namePrefixFieldSpecs - result["commonlabels"] = commonLabelFieldSpecs - result["commonannotations"] = commonAnnotationFieldSpecs - result["namespace"] = namespaceFieldSpecs - result["varreference"] = varReferenceFieldSpecs - result["namereference"] = nameReferenceFieldSpecs - return result -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/transformers/config/defaultconfig/nameprefix.go b/vendor/sigs.k8s.io/kustomize/pkg/transformers/config/defaultconfig/nameprefix.go deleted file mode 100644 index 94fe07a4859e..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/transformers/config/defaultconfig/nameprefix.go +++ /dev/null @@ -1,24 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package defaultconfig - -const ( - namePrefixFieldSpecs = ` -namePrefix: -- path: metadata/name -` -) diff --git a/vendor/sigs.k8s.io/kustomize/pkg/transformers/config/defaultconfig/namereference.go b/vendor/sigs.k8s.io/kustomize/pkg/transformers/config/defaultconfig/namereference.go deleted file mode 100644 index 35d4b7de0aa6..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/transformers/config/defaultconfig/namereference.go +++ /dev/null @@ -1,317 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package defaultconfig - -const ( - nameReferenceFieldSpecs = ` -nameReference: -- kind: Deployment - fieldSpecs: - - path: spec/scaleTargetRef/name - kind: HorizontalPodAutoscaler - -- kind: ReplicationController - fieldSpecs: - - path: spec/scaleTargetRef/name - kind: HorizontalPodAutoscaler - -- kind: ReplicaSet - fieldSpecs: - - path: spec/scaleTargetRef/name - kind: HorizontalPodAutoscaler - -- kind: ConfigMap - version: v1 - fieldSpecs: - - path: spec/volumes/configMap/name - version: v1 - kind: Pod - - path: spec/containers/env/valueFrom/configMapKeyRef/name - version: v1 - kind: Pod - - path: spec/initContainers/env/valueFrom/configMapKeyRef/name - version: v1 - kind: Pod - - path: spec/containers/envFrom/configMapRef/name - version: v1 - kind: Pod - - path: spec/initContainers/envFrom/configMapRef/name - version: v1 - kind: Pod - - path: spec/template/spec/volumes/configMap/name - kind: Deployment - - path: spec/template/spec/containers/env/valueFrom/configMapKeyRef/name - kind: Deployment - - path: spec/template/spec/initContainers/env/valueFrom/configMapKeyRef/name - kind: Deployment - - path: spec/template/spec/containers/envFrom/configMapRef/name - kind: Deployment - - path: spec/template/spec/initContainers/envFrom/configMapRef/name - kind: Deployment - - path: spec/template/spec/volumes/projected/sources/configMap/name - kind: Deployment - - path: spec/template/spec/volumes/configMap/name - kind: ReplicaSet - - path: spec/template/spec/containers/env/valueFrom/configMapKeyRef/name - kind: ReplicaSet - - path: spec/template/spec/initContainers/env/valueFrom/configMapKeyRef/name - kind: ReplicaSet - - path: spec/template/spec/containers/envFrom/configMapRef/name - kind: ReplicaSet - - path: spec/template/spec/initContainers/envFrom/configMapRef/name - kind: ReplicaSet - - path: spec/template/spec/volumes/configMap/name - kind: DaemonSet - - path: spec/template/spec/containers/env/valueFrom/configMapKeyRef/name - kind: DaemonSet - - path: spec/template/spec/initContainers/env/valueFrom/configMapKeyRef/name - kind: DaemonSet - - path: spec/template/spec/containers/envFrom/configMapRef/name - kind: DaemonSet - - path: spec/template/spec/initContainers/envFrom/configMapRef/name - kind: DaemonSet - - path: spec/template/spec/volumes/configMap/name - kind: StatefulSet - - path: spec/template/spec/containers/env/valueFrom/configMapKeyRef/name - kind: StatefulSet - - path: spec/template/spec/initContainers/env/valueFrom/configMapKeyRef/name - kind: StatefulSet - - path: spec/template/spec/containers/envFrom/configMapRef/name - kind: StatefulSet - - path: spec/template/spec/initContainers/envFrom/configMapRef/name - kind: StatefulSet - - path: spec/template/spec/volumes/projected/sources/configMap/name - kind: StatefulSet - - path: spec/template/spec/volumes/configMap/name - kind: Job - - path: spec/template/spec/containers/env/valueFrom/configMapKeyRef/name - kind: Job - - path: spec/template/spec/initContainers/env/valueFrom/configMapKeyRef/name - kind: Job - - path: spec/template/spec/containers/envFrom/configMapRef/name - kind: Job - - path: spec/template/spec/initContainers/envFrom/configMapRef/name - kind: Job - - path: spec/jobTemplate/spec/template/spec/volumes/configMap/name - kind: CronJob - - path: spec/jobTemplate/spec/template/spec/containers/env/valueFrom/configMapKeyRef/name - kind: CronJob - - path: spec/jobTemplate/spec/template/spec/initContainers/env/valueFrom/configMapKeyRef/name - kind: CronJob - - path: spec/jobTemplate/spec/template/spec/containers/envFrom/configMapRef/name - kind: CronJob - - path: spec/jobTemplate/spec/template/spec/initContainers/envFrom/configmapRef/name - kind: CronJob - -- kind: Secret - version: v1 - fieldSpecs: - - path: spec/volumes/secret/secretName - version: v1 - kind: Pod - - path: spec/containers/env/valueFrom/secretKeyRef/name - version: v1 - kind: Pod - - path: spec/initContainers/env/valueFrom/secretKeyRef/name - version: v1 - kind: Pod - - path: spec/containers/envFrom/secretRef/name - version: v1 - kind: Pod - - path: spec/initContainers/envFrom/secretRef/name - version: v1 - kind: Pod - - path: spec/imagePullSecrets/name - version: v1 - kind: Pod - - path: spec/template/spec/volumes/secret/secretName - kind: Deployment - - path: spec/template/spec/containers/env/valueFrom/secretKeyRef/name - kind: Deployment - - path: spec/template/spec/initContainers/env/valueFrom/secretKeyRef/name - kind: Deployment - - path: spec/template/spec/containers/envFrom/secretRef/name - kind: Deployment - - path: spec/template/spec/initContainers/envFrom/secretRef/name - kind: Deployment - - path: spec/template/spec/imagePullSecrets/name - kind: Deployment - - path: spec/template/spec/volumes/projected/sources/secret/name - kind: Deployment - - path: spec/template/spec/volumes/secret/secretName - kind: ReplicaSet - - path: spec/template/spec/containers/env/valueFrom/secretKeyRef/name - kind: ReplicaSet - - path: spec/template/spec/initContainers/env/valueFrom/secretKeyRef/name - kind: ReplicaSet - - path: spec/template/spec/containers/envFrom/secretRef/name - kind: ReplicaSet - - path: spec/template/spec/initContainers/envFrom/secretRef/name - kind: ReplicaSet - - path: spec/template/spec/imagePullSecrets/name - kind: ReplicaSet - - path: spec/template/spec/volumes/secret/secretName - kind: DaemonSet - - path: spec/template/spec/containers/env/valueFrom/secretKeyRef/name - kind: DaemonSet - - path: spec/template/spec/initContainers/env/valueFrom/secretKeyRef/name - kind: DaemonSet - - path: spec/template/spec/containers/envFrom/secretRef/name - kind: DaemonSet - - path: spec/template/spec/initContainers/envFrom/secretRef/name - kind: DaemonSet - - path: spec/template/spec/imagePullSecrets/name - kind: DaemonSet - - path: spec/template/spec/volumes/secret/secretName - kind: StatefulSet - - path: spec/template/spec/containers/env/valueFrom/secretKeyRef/name - kind: StatefulSet - - path: spec/template/spec/initContainers/env/valueFrom/secretKeyRef/name - kind: StatefulSet - - path: spec/template/spec/containers/envFrom/secretRef/name - kind: StatefulSet - - path: spec/template/spec/initContainers/envFrom/secretRef/name - kind: StatefulSet - - path: spec/template/spec/imagePullSecrets/name - kind: StatefulSet - - path: spec/template/spec/volumes/projected/sources/secret/name - kind: StatefulSet - - path: spec/template/spec/volumes/secret/secretName - kind: Job - - path: spec/template/spec/containers/env/valueFrom/secretKeyRef/name - kind: Job - - path: spec/template/spec/initContainers/env/valueFrom/secretKeyRef/name - kind: Job - - path: spec/template/spec/containers/envFrom/secretRef/name - kind: Job - - path: spec/template/spec/initContainers/envFrom/secretRef/name - kind: Job - - path: spec/template/spec/imagePullSecrets/name - kind: Job - - path: spec/jobTemplate/spec/template/spec/volumes/secret/secretName - kind: CronJob - - path: spec/jobTemplate/spec/template/spec/containers/env/valueFrom/secretKeyRef/name - kind: CronJob - - path: spec/jobTemplate/spec/template/spec/initContainers/env/valueFrom/secretKeyRef/name - kind: CronJob - - path: spec/jobTemplate/spec/template/spec/containers/envFrom/secretRef/name - kind: CronJob - - path: spec/jobTemplate/spec/template/spec/initContainers/envFrom/secretRef/name - kind: CronJob - - path: spec/jobTemplate/spec/template/spec/imagePullSecrets/name - kind: CronJob - - path: spec/tls/secretName - kind: Ingress - - path: metadata/annotations/ingress.kubernetes.io\/auth-secret - kind: Ingress - - path: metadata/annotations/nginx.ingress.kubernetes.io\/auth-secret - kind: Ingress - - path: imagePullSecrets/name - kind: ServiceAccount - - path: parameters/secretName - kind: StorageClass - - path: parameters/adminSecretName - kind: StorageClass - - path: parameters/userSecretName - kind: StorageClass - - path: parameters/secretRef - kind: StorageClass - - path: rules/resourceNames - kind: Role - - path: rules/resourceNames - kind: ClusterRole - -- kind: Service - version: v1 - fieldSpecs: - - path: spec/serviceName - kind: StatefulSet - group: apps - - path: spec/rules/http/paths/backend/serviceName - kind: Ingress - - path: spec/backend/serviceName - kind: Ingress - - path: spec/service/name - kind: APIService - group: apiregistration.k8s.io - -- kind: Role - group: rbac.authorization.k8s.io - fieldSpecs: - - path: roleRef/name - kind: RoleBinding - group: rbac.authorization.k8s.io - -- kind: ClusterRole - group: rbac.authorization.k8s.io - fieldSpecs: - - path: roleRef/name - kind: RoleBinding - group: rbac.authorization.k8s.io - - path: roleRef/name - kind: ClusterRoleBinding - group: rbac.authorization.k8s.io - -- kind: ServiceAccount - version: v1 - fieldSpecs: - - path: subjects/name - kind: RoleBinding - group: rbac.authorization.k8s.io - - path: subjects/name - kind: ClusterRoleBinding - group: rbac.authorization.k8s.io - - path: spec/serviceAccountName - kind: Pod - - path: spec/template/spec/serviceAccountName - kind: StatefulSet - - path: spec/template/spec/serviceAccountName - kind: Deployment - - path: spec/template/spec/serviceAccountName - kind: ReplicationController - - path: spec/jobTemplate/spec/template/spec/serviceAccountName - kind: CronJob - - path: spec/template/spec/serviceAccountName - kind: job - - path: spec/template/spec/serviceAccountName - kind: DaemonSet - -- kind: PersistentVolumeClaim - version: v1 - fieldSpecs: - - path: spec/volumes/persistentVolumeClaim/claimName - kind: Pod - - path: spec/template/spec/volumes/persistentVolumeClaim/claimName - kind: StatefulSet - - path: spec/template/spec/volumes/persistentVolumeClaim/claimName - kind: Deployment - - path: spec/template/spec/volumes/persistentVolumeClaim/claimName - kind: ReplicationController - - path: spec/jobTemplate/spec/template/spec/volumes/persistentVolumeClaim/claimName - kind: CronJob - - path: spec/template/spec/volumes/persistentVolumeClaim/claimName - kind: Job - - path: spec/template/spec/volumes/persistentVolumeClaim/claimName - kind: DaemonSet - -- kind: PersistentVolume - version: v1 - fieldSpecs: - - path: spec/volumeName - kind: PersistentVolumeClaim -` -) diff --git a/vendor/sigs.k8s.io/kustomize/pkg/transformers/config/defaultconfig/namespace.go b/vendor/sigs.k8s.io/kustomize/pkg/transformers/config/defaultconfig/namespace.go deleted file mode 100644 index 431eb07699e8..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/transformers/config/defaultconfig/namespace.go +++ /dev/null @@ -1,25 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package defaultconfig - -const ( - namespaceFieldSpecs = ` -namespace: -- path: metadata/namespace - create: true -` -) diff --git a/vendor/sigs.k8s.io/kustomize/pkg/transformers/config/defaultconfig/varreference.go b/vendor/sigs.k8s.io/kustomize/pkg/transformers/config/defaultconfig/varreference.go deleted file mode 100644 index 71953f576896..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/transformers/config/defaultconfig/varreference.go +++ /dev/null @@ -1,162 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package defaultconfig - -const ( - varReferenceFieldSpecs = ` -varReference: -- path: spec/template/spec/initContainers/command - kind: StatefulSet - -- path: spec/template/spec/containers/command - kind: StatefulSet - -- path: spec/template/spec/initContainers/command - kind: Deployment - -- path: spec/template/spec/containers/command - kind: Deployment - -- path: spec/template/spec/initContainers/command - kind: DaemonSet - -- path: spec/template/spec/containers/command - kind: DaemonSet - -- path: spec/template/spec/containers/command - kind: Job - -- path: spec/jobTemplate/spec/template/spec/containers/command - kind: CronJob - -- path: spec/template/spec/initContainers/args - kind: StatefulSet - -- path: spec/template/spec/containers/args - kind: StatefulSet - -- path: spec/template/spec/initContainers/args - kind: Deployment - -- path: spec/template/spec/containers/args - kind: Deployment - -- path: spec/template/spec/initContainers/args - kind: DaemonSet - -- path: spec/template/spec/containers/args - kind: DaemonSet - -- path: spec/template/spec/containers/args - kind: Job - -- path: spec/jobTemplate/spec/template/spec/containers/args - kind: CronJob - -- path: spec/template/spec/initContainers/env/value - kind: StatefulSet - -- path: spec/template/spec/containers/env/value - kind: StatefulSet - -- path: spec/template/spec/initContainers/env/value - kind: Deployment - -- path: spec/template/spec/containers/env/value - kind: Deployment - -- path: spec/template/spec/initContainers/env/value - kind: DaemonSet - -- path: spec/template/spec/containers/env/value - kind: DaemonSet - -- path: spec/template/spec/containers/env/value - kind: Job - -- path: spec/jobTemplate/spec/template/spec/containers/env/value - kind: CronJob - -- path: spec/containers/command - kind: Pod - -- path: spec/containers/args - kind: Pod - -- path: spec/containers/env/value - kind: Pod - -- path: spec/initContainers/command - kind: Pod - -- path: spec/initContainers/args - kind: Pod - -- path: spec/initContainers/env/value - kind: Pod - -- path: spec/rules/host - kind: Ingress - -- path: spec/tls/hosts - kind: Ingress - -- path: spec/template/spec/containers/volumeMounts/mountPath - kind: StatefulSet - -- path: spec/template/spec/initContainers/volumeMounts/mountPath - kind: StatefulSet - -- path: spec/containers/volumeMounts/mountPath - kind: Pod - -- path: spec/initContainers/volumeMounts/mountPath - kind: Pod - -- path: spec/template/spec/containers/volumeMounts/mountPath - kind: ReplicaSet - -- path: spec/template/spec/initContainers/volumeMounts/mountPath - kind: ReplicaSet - -- path: spec/template/spec/containers/volumeMounts/mountPath - kind: Job - -- path: spec/template/spec/initContainers/volumeMounts/mountPath - kind: Job - -- path: spec/template/spec/containers/volumeMounts/mountPath - kind: CronJob - -- path: spec/template/spec/initContainers/volumeMounts/mountPath - kind: CronJob - -- path: spec/template/spec/containers/volumeMounts/mountPath - kind: DaemonSet - -- path: spec/template/spec/initContainers/volumeMounts/mountPath - kind: DaemonSet - -- path: spec/template/spec/containers/volumeMounts/mountPath - kind: Deployment - -- path: spec/template/spec/initContainers/volumeMounts/mountPath - kind: Deployment - -- path: metadata/labels -` -) diff --git a/vendor/sigs.k8s.io/kustomize/pkg/transformers/config/factory.go b/vendor/sigs.k8s.io/kustomize/pkg/transformers/config/factory.go deleted file mode 100644 index d0ea0d1dd838..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/transformers/config/factory.go +++ /dev/null @@ -1,87 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package config - -import ( - "log" - - "github.com/ghodss/yaml" - "sigs.k8s.io/kustomize/pkg/ifc" -) - -// Factory makes instances of TransformerConfig. -type Factory struct { - ldr ifc.Loader -} - -// MakeTransformerConfig returns a merger of custom config, -// if any, with default config. -func MakeTransformerConfig( - ldr ifc.Loader, paths []string) (*TransformerConfig, error) { - t1 := MakeDefaultConfig() - if len(paths) == 0 { - return t1, nil - } - t2, err := NewFactory(ldr).FromFiles(paths) - if err != nil { - return nil, err - } - return t1.Merge(t2) -} - -func NewFactory(l ifc.Loader) *Factory { - return &Factory{ldr: l} -} - -func (tf *Factory) loader() ifc.Loader { - if tf.ldr.(ifc.Loader) == nil { - log.Fatal("no loader") - } - return tf.ldr -} - -// FromFiles returns a TranformerConfig object from a list of files -func (tf *Factory) FromFiles( - paths []string) (*TransformerConfig, error) { - result := &TransformerConfig{} - for _, path := range paths { - data, err := tf.loader().Load(path) - if err != nil { - return nil, err - } - t, err := makeTransformerConfigFromBytes(data) - if err != nil { - return nil, err - } - result, err = result.Merge(t) - if err != nil { - return nil, err - } - } - return result, nil -} - -// makeTransformerConfigFromBytes returns a TransformerConfig object from bytes -func makeTransformerConfigFromBytes(data []byte) (*TransformerConfig, error) { - var t TransformerConfig - err := yaml.Unmarshal(data, &t) - if err != nil { - return nil, err - } - t.sortFields() - return &t, nil -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/transformers/config/factorycrd.go b/vendor/sigs.k8s.io/kustomize/pkg/transformers/config/factorycrd.go deleted file mode 100644 index 66a24dc86881..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/transformers/config/factorycrd.go +++ /dev/null @@ -1,201 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package config - -import ( - "encoding/json" - "strings" - - "github.com/ghodss/yaml" - "github.com/go-openapi/spec" - "github.com/pkg/errors" - "k8s.io/kube-openapi/pkg/common" - "sigs.k8s.io/kustomize/pkg/gvk" - "sigs.k8s.io/kustomize/pkg/ifc" -) - -type myProperties map[string]spec.Schema -type nameToApiMap map[string]common.OpenAPIDefinition - -// LoadConfigFromCRDs parse CRD schemas from paths into a TransformerConfig -func LoadConfigFromCRDs( - ldr ifc.Loader, paths []string) (*TransformerConfig, error) { - tc := MakeEmptyConfig() - for _, path := range paths { - content, err := ldr.Load(path) - if err != nil { - return nil, err - } - m, err := makeNameToApiMap(content) - if err != nil { - return nil, errors.Wrapf(err, "unable to parse open API definition from '%s'", path) - } - otherTc, err := makeConfigFromApiMap(m) - if err != nil { - return nil, err - } - tc, err = tc.Merge(otherTc) - if err != nil { - return nil, err - } - } - return tc, nil -} - -func makeNameToApiMap(content []byte) (result nameToApiMap, err error) { - if content[0] == '{' { - err = json.Unmarshal(content, &result) - } else { - err = yaml.Unmarshal(content, &result) - } - return -} - -func makeConfigFromApiMap(m nameToApiMap) (*TransformerConfig, error) { - result := MakeEmptyConfig() - for name, api := range m { - if !looksLikeAk8sType(api.Schema.SchemaProps.Properties) { - continue - } - tc := MakeEmptyConfig() - err := loadCrdIntoConfig( - tc, makeGvkFromTypeName(name), m, name, []string{}) - if err != nil { - return result, err - } - result, err = result.Merge(tc) - if err != nil { - return result, err - } - } - return result, nil -} - -// TODO: Get Group and Version for CRD from the -// openAPI definition once -// "x-kubernetes-group-version-kind" is available in CRD -func makeGvkFromTypeName(n string) gvk.Gvk { - names := strings.Split(n, ".") - kind := names[len(names)-1] - return gvk.Gvk{Kind: kind} -} - -func looksLikeAk8sType(properties myProperties) bool { - _, ok := properties["kind"] - if !ok { - return false - } - _, ok = properties["apiVersion"] - if !ok { - return false - } - _, ok = properties["metadata"] - if !ok { - return false - } - return true -} - -const ( - // "x-kubernetes-annotation": "" - xAnnotation = "x-kubernetes-annotation" - - // "x-kubernetes-label-selector": "" - xLabelSelector = "x-kubernetes-label-selector" - - // "x-kubernetes-identity": "" - xIdentity = "x-kubernetes-identity" - - // "x-kubernetes-object-ref-api-version": - xVersion = "x-kubernetes-object-ref-api-version" - - // "x-kubernetes-object-ref-kind": - xKind = "x-kubernetes-object-ref-kind" - - // "x-kubernetes-object-ref-name-key": "name" - // default is "name" - xNameKey = "x-kubernetes-object-ref-name-key" -) - -// loadCrdIntoConfig loads a CRD spec into a TransformerConfig -func loadCrdIntoConfig( - theConfig *TransformerConfig, theGvk gvk.Gvk, theMap nameToApiMap, - typeName string, path []string) (err error) { - api, ok := theMap[typeName] - if !ok { - return nil - } - for propName, property := range api.Schema.SchemaProps.Properties { - _, annotate := property.Extensions.GetString(xAnnotation) - if annotate { - err = theConfig.AddAnnotationFieldSpec( - makeFs(theGvk, append(path, propName))) - if err != nil { - return - } - } - _, label := property.Extensions.GetString(xLabelSelector) - if label { - err = theConfig.AddLabelFieldSpec( - makeFs(theGvk, append(path, propName))) - if err != nil { - return - } - } - _, identity := property.Extensions.GetString(xIdentity) - if identity { - err = theConfig.AddPrefixFieldSpec( - makeFs(theGvk, append(path, propName))) - if err != nil { - return - } - } - version, ok := property.Extensions.GetString(xVersion) - if ok { - kind, ok := property.Extensions.GetString(xKind) - if ok { - nameKey, ok := property.Extensions.GetString(xNameKey) - if !ok { - nameKey = "name" - } - err = theConfig.AddNamereferenceFieldSpec( - NameBackReferences{ - Gvk: gvk.Gvk{Kind: kind, Version: version}, - FieldSpecs: []FieldSpec{ - makeFs(theGvk, append(path, propName, nameKey))}, - }) - if err != nil { - return - } - } - } - if property.Ref.GetURL() != nil { - loadCrdIntoConfig( - theConfig, theGvk, theMap, - property.Ref.String(), append(path, propName)) - } - } - return nil -} - -func makeFs(in gvk.Gvk, path []string) FieldSpec { - return FieldSpec{ - CreateIfNotPresent: false, - Gvk: in, - Path: strings.Join(path, "/"), - } -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/transformers/config/fieldspec.go b/vendor/sigs.k8s.io/kustomize/pkg/transformers/config/fieldspec.go deleted file mode 100644 index 5b0f6ee33a0e..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/transformers/config/fieldspec.go +++ /dev/null @@ -1,139 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package config - -import ( - "fmt" - "strings" - - "sigs.k8s.io/kustomize/pkg/gvk" -) - -// FieldSpec completely specifies a kustomizable field in -// an unstructured representation of a k8s API object. -// It helps define the operands of transformations. -// -// For example, a directive to add a common label to objects -// will need to know that a 'Deployment' object (in API group -// 'apps', any version) can have labels at field path -// 'spec/template/metadata/labels', and further that it is OK -// (or not OK) to add that field path to the object if the -// field path doesn't exist already. -// -// This would look like -// { -// group: apps -// kind: Deployment -// path: spec/template/metadata/labels -// create: true -// } -type FieldSpec struct { - gvk.Gvk `json:",inline,omitempty" yaml:",inline,omitempty"` - Path string `json:"path,omitempty" yaml:"path,omitempty"` - CreateIfNotPresent bool `json:"create,omitempty" yaml:"create,omitempty"` -} - -const ( - escapedForwardSlash = "\\/" - tempSlashReplacement = "???" -) - -func (fs FieldSpec) String() string { - return fmt.Sprintf( - "%s:%v:%s", fs.Gvk.String(), fs.CreateIfNotPresent, fs.Path) -} - -// If true, the primary key is the same, but other fields might not be. -func (fs FieldSpec) effectivelyEquals(other FieldSpec) bool { - return fs.IsSelected(&other.Gvk) && fs.Path == other.Path -} - -// PathSlice converts the path string to a slice of strings, -// separated by a '/'. Forward slash can be contained in a -// fieldname. such as ingress.kubernetes.io/auth-secret in -// Ingress annotations. To deal with this special case, the -// path to this field should be formatted as -// -// metadata/annotations/ingress.kubernetes.io\/auth-secret -// -// Then PathSlice will return -// -// []string{ -// "metadata", -// "annotations", -// "ingress.auth-secretkubernetes.io/auth-secret" -// } -func (fs FieldSpec) PathSlice() []string { - if !strings.Contains(fs.Path, escapedForwardSlash) { - return strings.Split(fs.Path, "/") - } - s := strings.Replace(fs.Path, escapedForwardSlash, tempSlashReplacement, -1) - paths := strings.Split(s, "/") - var result []string - for _, path := range paths { - result = append(result, strings.Replace(path, tempSlashReplacement, "/", -1)) - } - return result -} - -type fsSlice []FieldSpec - -func (s fsSlice) Len() int { return len(s) } -func (s fsSlice) Swap(i, j int) { s[i], s[j] = s[j], s[i] } -func (s fsSlice) Less(i, j int) bool { - return s[i].Gvk.IsLessThan(s[j].Gvk) -} - -// mergeAll merges the argument into this, returning the result. -// Items already present are ignored. -// Items that conflict (primary key matches, but remain data differs) -// result in an error. -func (s fsSlice) mergeAll(incoming fsSlice) (result fsSlice, err error) { - result = s - for _, x := range incoming { - result, err = result.mergeOne(x) - if err != nil { - return nil, err - } - } - return result, nil -} - -// mergeOne merges the argument into this, returning the result. -// If the item's primary key is already present, and there are no -// conflicts, it is ignored (we don't want duplicates). -// If there is a conflict, the merge fails. -func (s fsSlice) mergeOne(x FieldSpec) (fsSlice, error) { - i := s.index(x) - if i > -1 { - // It's already there. - if s[i].CreateIfNotPresent != x.CreateIfNotPresent { - return nil, fmt.Errorf("conflicting fieldspecs") - } - return s, nil - } - return append(s, x), nil -} - -func (s fsSlice) index(fs FieldSpec) int { - for i, x := range s { - if x.effectivelyEquals(fs) { - return i - } - } - return -1 -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/transformers/config/namebackreferences.go b/vendor/sigs.k8s.io/kustomize/pkg/transformers/config/namebackreferences.go deleted file mode 100644 index 172e4b3ca53c..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/transformers/config/namebackreferences.go +++ /dev/null @@ -1,105 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package config - -import ( - "strings" - - "sigs.k8s.io/kustomize/pkg/gvk" -) - -// NameBackReferences is an association between a gvk.GVK and a list -// of FieldSpec instances that could refer to it. -// -// It is used to handle name changes, and can be thought of as a -// a contact list. If you change your own contact info (name, -// phone number, etc.), you must tell your contacts or they won't -// know about the change. -// -// For example, ConfigMaps can be used by Pods and everything that -// contains a Pod; Deployment, Job, StatefulSet, etc. To change -// the name of a ConfigMap instance from 'alice' to 'bob', one -// must visit all objects that could refer to the ConfigMap, see if -// they mention 'alice', and if so, change the reference to 'bob'. -// -// The NameBackReferences instance to aid in this could look like -// { -// kind: ConfigMap -// version: v1 -// FieldSpecs: -// - kind: Pod -// version: v1 -// path: spec/volumes/configMap/name -// - kind: Deployment -// path: spec/template/spec/volumes/configMap/name -// - kind: Job -// path: spec/template/spec/volumes/configMap/name -// (etc.) -// } -type NameBackReferences struct { - gvk.Gvk `json:",inline,omitempty" yaml:",inline,omitempty"` - FieldSpecs fsSlice `json:"FieldSpecs,omitempty" yaml:"FieldSpecs,omitempty"` -} - -func (n NameBackReferences) String() string { - var r []string - for _, f := range n.FieldSpecs { - r = append(r, f.String()) - } - return n.Gvk.String() + ": (\n" + - strings.Join(r, "\n") + "\n)" -} - -type nbrSlice []NameBackReferences - -func (s nbrSlice) Len() int { return len(s) } -func (s nbrSlice) Swap(i, j int) { s[i], s[j] = s[j], s[i] } -func (s nbrSlice) Less(i, j int) bool { - return s[i].Gvk.IsLessThan(s[j].Gvk) -} - -func (s nbrSlice) mergeAll(o nbrSlice) (result nbrSlice, err error) { - result = s - for _, r := range o { - result, err = result.mergeOne(r) - if err != nil { - return nil, err - } - } - return result, nil -} - -func (s nbrSlice) mergeOne(other NameBackReferences) (nbrSlice, error) { - var result nbrSlice - var err error - found := false - for _, c := range s { - if c.Gvk.Equals(other.Gvk) { - c.FieldSpecs, err = c.FieldSpecs.mergeAll(other.FieldSpecs) - if err != nil { - return nil, err - } - found = true - } - result = append(result, c) - } - - if !found { - result = append(result, other) - } - return result, nil -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/transformers/config/transformerconfig.go b/vendor/sigs.k8s.io/kustomize/pkg/transformers/config/transformerconfig.go deleted file mode 100644 index 556f0b814c5e..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/transformers/config/transformerconfig.go +++ /dev/null @@ -1,134 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Package config provides the functions to load default or user provided configurations -// for different transformers -package config - -import ( - "log" - "sort" - - "sigs.k8s.io/kustomize/pkg/transformers/config/defaultconfig" -) - -// TransformerConfig holds the data needed to perform transformations. -type TransformerConfig struct { - NamePrefix fsSlice `json:"namePrefix,omitempty" yaml:"namePrefix,omitempty"` - NameSuffix fsSlice `json:"nameSuffix,omitempty" yaml:"nameSuffix,omitempty"` - NameSpace fsSlice `json:"namespace,omitempty" yaml:"namespace,omitempty"` - CommonLabels fsSlice `json:"commonLabels,omitempty" yaml:"commonLabels,omitempty"` - CommonAnnotations fsSlice `json:"commonAnnotations,omitempty" yaml:"commonAnnotations,omitempty"` - NameReference nbrSlice `json:"nameReference,omitempty" yaml:"nameReference,omitempty"` - VarReference fsSlice `json:"varReference,omitempty" yaml:"varReference,omitempty"` -} - -// MakeEmptyConfig returns an empty TransformerConfig object -func MakeEmptyConfig() *TransformerConfig { - return &TransformerConfig{} -} - -// MakeDefaultConfig returns a default TransformerConfig. -func MakeDefaultConfig() *TransformerConfig { - c, err := makeTransformerConfigFromBytes( - defaultconfig.GetDefaultFieldSpecs()) - if err != nil { - log.Fatalf("Unable to make default transformconfig: %v", err) - } - return c -} - -// sortFields provides determinism in logging, tests, etc. -func (t *TransformerConfig) sortFields() { - sort.Sort(t.NamePrefix) - sort.Sort(t.NameSpace) - sort.Sort(t.CommonLabels) - sort.Sort(t.CommonAnnotations) - sort.Sort(t.NameReference) - sort.Sort(t.VarReference) -} - -// AddPrefixFieldSpec adds a FieldSpec to NamePrefix -func (t *TransformerConfig) AddPrefixFieldSpec(fs FieldSpec) (err error) { - t.NamePrefix, err = t.NamePrefix.mergeOne(fs) - return err -} - -// AddSuffixFieldSpec adds a FieldSpec to NameSuffix -func (t *TransformerConfig) AddSuffixFieldSpec(fs FieldSpec) (err error) { - t.NameSuffix, err = t.NameSuffix.mergeOne(fs) - return err -} - -// AddLabelFieldSpec adds a FieldSpec to CommonLabels -func (t *TransformerConfig) AddLabelFieldSpec(fs FieldSpec) (err error) { - t.CommonLabels, err = t.CommonLabels.mergeOne(fs) - return err -} - -// AddAnnotationFieldSpec adds a FieldSpec to CommonAnnotations -func (t *TransformerConfig) AddAnnotationFieldSpec(fs FieldSpec) (err error) { - t.CommonAnnotations, err = t.CommonAnnotations.mergeOne(fs) - return err -} - -// AddNamereferenceFieldSpec adds a NameBackReferences to NameReference -func (t *TransformerConfig) AddNamereferenceFieldSpec( - nbrs NameBackReferences) (err error) { - t.NameReference, err = t.NameReference.mergeOne(nbrs) - return err -} - -// Merge merges two TransformerConfigs objects into -// a new TransformerConfig object -func (t *TransformerConfig) Merge(input *TransformerConfig) ( - merged *TransformerConfig, err error) { - if input == nil { - return t, nil - } - merged = &TransformerConfig{} - merged.NamePrefix, err = t.NamePrefix.mergeAll(input.NamePrefix) - if err != nil { - return nil, err - } - merged.NameSuffix, err = t.NameSuffix.mergeAll(input.NameSuffix) - if err != nil { - return nil, err - } - merged.NameSpace, err = t.NameSpace.mergeAll(input.NameSpace) - if err != nil { - return nil, err - } - merged.CommonAnnotations, err = t.CommonAnnotations.mergeAll( - input.CommonAnnotations) - if err != nil { - return nil, err - } - merged.CommonLabels, err = t.CommonLabels.mergeAll(input.CommonLabels) - if err != nil { - return nil, err - } - merged.VarReference, err = t.VarReference.mergeAll(input.VarReference) - if err != nil { - return nil, err - } - merged.NameReference, err = t.NameReference.mergeAll(input.NameReference) - if err != nil { - return nil, err - } - merged.sortFields() - return merged, nil -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/transformers/image.go b/vendor/sigs.k8s.io/kustomize/pkg/transformers/image.go deleted file mode 100644 index 2e07976943de..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/transformers/image.go +++ /dev/null @@ -1,171 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package transformers - -import ( - "fmt" - "regexp" - "strings" - - "sigs.k8s.io/kustomize/pkg/image" - "sigs.k8s.io/kustomize/pkg/resmap" -) - -// imageTransformer replace image names and tags -type imageTransformer struct { - images []image.Image -} - -var _ Transformer = &imageTransformer{} - -// NewImageTransformer constructs an imageTransformer. -func NewImageTransformer(slice []image.Image) (Transformer, error) { - return &imageTransformer{slice}, nil -} - -// Transform finds the matching images and replaces name, tag and/or digest -func (pt *imageTransformer) Transform(resources resmap.ResMap) error { - if len(pt.images) == 0 { - return nil - } - for _, res := range resources { - err := pt.findAndReplaceImage(res.Map()) - if err != nil { - return err - } - } - return nil -} - -/* - findAndReplaceImage replaces the image name and tags inside one object - It searches the object for container session - then loops though all images inside containers session, - finds matched ones and update the image name and tag name -*/ -func (pt *imageTransformer) findAndReplaceImage(obj map[string]interface{}) error { - paths := []string{"containers", "initContainers"} - found := false - for _, path := range paths { - _, found = obj[path] - if found { - err := pt.updateContainers(obj, path) - if err != nil { - return err - } - } - } - if !found { - return pt.findContainers(obj) - } - return nil -} - -func (pt *imageTransformer) updateContainers(obj map[string]interface{}, path string) error { - containers, ok := obj[path].([]interface{}) - if !ok { - return fmt.Errorf("containers path is not of type []interface{} but %T", obj[path]) - } - for i := range containers { - container := containers[i].(map[string]interface{}) - containerImage, found := container["image"] - if !found { - continue - } - - imageName := containerImage.(string) - for _, img := range pt.images { - if !isImageMatched(imageName, img.Name) { - continue - } - name, tag := split(imageName) - if img.NewName != "" { - name = img.NewName - } - if img.NewTag != "" { - tag = ":" + img.NewTag - } - if img.Digest != "" { - tag = "@" + img.Digest - } - container["image"] = name + tag - break - } - } - return nil -} - -func (pt *imageTransformer) findContainers(obj map[string]interface{}) error { - for key := range obj { - switch typedV := obj[key].(type) { - case map[string]interface{}: - err := pt.findAndReplaceImage(typedV) - if err != nil { - return err - } - case []interface{}: - for i := range typedV { - item := typedV[i] - typedItem, ok := item.(map[string]interface{}) - if ok { - err := pt.findAndReplaceImage(typedItem) - if err != nil { - return err - } - } - } - } - } - return nil -} - -func isImageMatched(s, t string) bool { - // Tag values are limited to [a-zA-Z0-9_.-]. - pattern, _ := regexp.Compile("^" + t + "(:[a-zA-Z0-9_.-]*)?$") - return pattern.MatchString(s) -} - -// split separates and returns the name and tag parts -// from the image string using either colon `:` or at `@` separators. -// Note that the returned tag keeps its separator. -func split(imageName string) (name string, tag string) { - // check if image name contains a domain - // if domain is present, ignore domain and check for `:` - ic := -1 - if slashIndex := strings.Index(imageName, "/"); slashIndex < 0 { - ic = strings.LastIndex(imageName, ":") - } else { - lastIc := strings.LastIndex(imageName[slashIndex:], ":") - // set ic only if `:` is present - if lastIc > 0 { - ic = slashIndex + lastIc - } - } - ia := strings.LastIndex(imageName, "@") - if ic < 0 && ia < 0 { - return imageName, "" - } - - i := ic - if ic < 0 { - i = ia - } - - name = imageName[:i] - tag = imageName[i:] - return -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/transformers/labelsandannotations.go b/vendor/sigs.k8s.io/kustomize/pkg/transformers/labelsandannotations.go deleted file mode 100644 index 836abcaa4881..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/transformers/labelsandannotations.go +++ /dev/null @@ -1,86 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package transformers - -import ( - "errors" - "fmt" - - "sigs.k8s.io/kustomize/pkg/resmap" - "sigs.k8s.io/kustomize/pkg/transformers/config" -) - -// mapTransformer applies a string->string map to fieldSpecs. -type mapTransformer struct { - m map[string]string - fieldSpecs []config.FieldSpec -} - -var _ Transformer = &mapTransformer{} - -// NewLabelsMapTransformer constructs a mapTransformer. -func NewLabelsMapTransformer( - m map[string]string, fs []config.FieldSpec) (Transformer, error) { - return NewMapTransformer(fs, m) -} - -// NewAnnotationsMapTransformer construct a mapTransformer. -func NewAnnotationsMapTransformer( - m map[string]string, fs []config.FieldSpec) (Transformer, error) { - return NewMapTransformer(fs, m) -} - -// NewMapTransformer construct a mapTransformer. -func NewMapTransformer( - pc []config.FieldSpec, m map[string]string) (Transformer, error) { - if m == nil { - return NewNoOpTransformer(), nil - } - if pc == nil { - return nil, errors.New("fieldSpecs is not expected to be nil") - } - return &mapTransformer{fieldSpecs: pc, m: m}, nil -} - -// Transform apply each pair in the mapTransformer to the -// fields specified in mapTransformer. -func (o *mapTransformer) Transform(m resmap.ResMap) error { - for id := range m { - objMap := m[id].Map() - for _, path := range o.fieldSpecs { - if !id.Gvk().IsSelected(&path.Gvk) { - continue - } - err := mutateField(objMap, path.PathSlice(), path.CreateIfNotPresent, o.addMap) - if err != nil { - return err - } - } - } - return nil -} - -func (o *mapTransformer) addMap(in interface{}) (interface{}, error) { - m, ok := in.(map[string]interface{}) - if !ok { - return nil, fmt.Errorf("%#v is expected to be %T", in, m) - } - for k, v := range o.m { - m[k] = v - } - return m, nil -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/transformers/multitransformer.go b/vendor/sigs.k8s.io/kustomize/pkg/transformers/multitransformer.go deleted file mode 100644 index d5921d1a92e6..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/transformers/multitransformer.go +++ /dev/null @@ -1,95 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package transformers - -import ( - "fmt" - "sigs.k8s.io/kustomize/pkg/resource" - - "sigs.k8s.io/kustomize/pkg/resmap" -) - -// multiTransformer contains a list of transformers. -type multiTransformer struct { - transformers []Transformer - checkConflictEnabled bool - rf *resource.Factory -} - -var _ Transformer = &multiTransformer{} - -// NewMultiTransformer constructs a multiTransformer. -func NewMultiTransformer(t []Transformer) Transformer { - r := &multiTransformer{ - transformers: make([]Transformer, len(t)), - checkConflictEnabled: false} - copy(r.transformers, t) - return r -} - -// NewMultiTransformerWithConflictCheck constructs a multiTransformer with checking of conflicts. -func NewMultiTransformerWithConflictCheck(t []Transformer) Transformer { - r := &multiTransformer{ - transformers: make([]Transformer, len(t)), - checkConflictEnabled: true} - copy(r.transformers, t) - return r -} - -// Transform prepends the name prefix. -func (o *multiTransformer) Transform(m resmap.ResMap) error { - if o.checkConflictEnabled { - return o.transformWithCheckConflict(m) - } - return o.transform(m) -} -func (o *multiTransformer) transform(m resmap.ResMap) error { - for _, t := range o.transformers { - err := t.Transform(m) - if err != nil { - return err - } - } - return nil -} - -// Of the len(o.transformers)! possible transformer orderings, compare to a reversed order. -// A spot check to perform when the transformations are supposed to be commutative. -// Fail if there's a difference in the result. -func (o *multiTransformer) transformWithCheckConflict(m resmap.ResMap) error { - mcopy := m.DeepCopy(o.rf) - err := o.transform(m) - if err != nil { - return err - } - o.reverseTransformers() - err = o.transform(mcopy) - if err != nil { - return err - } - err = m.ErrorIfNotEqual(mcopy) - if err != nil { - return fmt.Errorf("found conflict between different patches\n%v", err) - } - return nil -} - -func (o *multiTransformer) reverseTransformers() { - for i, j := 0, len(o.transformers)-1; i < j; i, j = i+1, j-1 { - o.transformers[i], o.transformers[j] = o.transformers[j], o.transformers[i] - } -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/transformers/mutatefield.go b/vendor/sigs.k8s.io/kustomize/pkg/transformers/mutatefield.go deleted file mode 100644 index eddfeee20bce..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/transformers/mutatefield.go +++ /dev/null @@ -1,81 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package transformers - -import ( - "fmt" - "log" - "strings" -) - -type mutateFunc func(interface{}) (interface{}, error) - -func mutateField( - m map[string]interface{}, - pathToField []string, - createIfNotPresent bool, - fns ...mutateFunc) error { - if len(pathToField) == 0 { - return nil - } - - _, found := m[pathToField[0]] - if !found { - if !createIfNotPresent { - return nil - } - m[pathToField[0]] = map[string]interface{}{} - } - - if len(pathToField) == 1 { - var err error - for _, fn := range fns { - m[pathToField[0]], err = fn(m[pathToField[0]]) - if err != nil { - return err - } - } - return nil - } - - v := m[pathToField[0]] - newPathToField := pathToField[1:] - switch typedV := v.(type) { - case nil: - log.Printf( - "nil value at `%s` ignored in mutation attempt", - strings.Join(pathToField, ".")) - return nil - case map[string]interface{}: - return mutateField(typedV, newPathToField, createIfNotPresent, fns...) - case []interface{}: - for i := range typedV { - item := typedV[i] - typedItem, ok := item.(map[string]interface{}) - if !ok { - return fmt.Errorf("%#v is expected to be %T", item, typedItem) - } - err := mutateField(typedItem, newPathToField, createIfNotPresent, fns...) - if err != nil { - return err - } - } - return nil - default: - return fmt.Errorf("%#v is not expected to be a primitive type", typedV) - } -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/transformers/namereference.go b/vendor/sigs.k8s.io/kustomize/pkg/transformers/namereference.go deleted file mode 100644 index a4e8a7f8edf9..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/transformers/namereference.go +++ /dev/null @@ -1,144 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package transformers - -import ( - "fmt" - "log" - - "sigs.k8s.io/kustomize/pkg/gvk" - "sigs.k8s.io/kustomize/pkg/resmap" - "sigs.k8s.io/kustomize/pkg/transformers/config" -) - -type nameReferenceTransformer struct { - backRefs []config.NameBackReferences -} - -var _ Transformer = &nameReferenceTransformer{} - -// NewNameReferenceTransformer constructs a nameReferenceTransformer -// with a given slice of NameBackReferences. -func NewNameReferenceTransformer(br []config.NameBackReferences) Transformer { - if br == nil { - log.Fatal("backrefs not expected to be nil") - } - return &nameReferenceTransformer{backRefs: br} -} - -// Transform updates name references in resource A that refer to resource B, -// given that B's name may have changed. -// -// For example, a HorizontalPodAutoscaler (HPA) necessarily refers to a -// Deployment (the thing that the HPA scales). The Deployment name might change -// (e.g. prefix added), and the reference in the HPA has to be fixed. -// -// In the outer loop below, we encounter an HPA. In scanning backrefs, we -// find that HPA refers to a Deployment. So we find all resources in the same -// namespace as the HPA (and with the same prefix and suffix), and look through -// them to find all the Deployments with a resId that has a Name matching the -// field in HPA. For each match, we overwrite the HPA name field with the value -// found in the Deployment's name field (the name in the raw object - the -// modified name - not the unmodified name in the resId). -// -// This assumes that the name stored in a ResId (the ResMap key) isn't modified -// by name transformers. Name transformers should only modify the name in the -// body of the resource object (the value in the ResMap). -func (o *nameReferenceTransformer) Transform(m resmap.ResMap) error { - // TODO: Too much looping. - // Even more hidden loops in FilterBy, - // updateNameReference and FindByGVKN. - for id := range m { - for _, backRef := range o.backRefs { - for _, fSpec := range backRef.FieldSpecs { - if id.Gvk().IsSelected(&fSpec.Gvk) { - err := mutateField( - m[id].Map(), fSpec.PathSlice(), - fSpec.CreateIfNotPresent, - o.updateNameReference( - backRef.Gvk, m.FilterBy(id))) - if err != nil { - return err - } - } - } - } - } - return nil -} - -func (o *nameReferenceTransformer) updateNameReference( - backRef gvk.Gvk, m resmap.ResMap) func(in interface{}) (interface{}, error) { - return func(in interface{}) (interface{}, error) { - switch in.(type) { - case string: - s, _ := in.(string) - for id, res := range m { - if id.Gvk().IsSelected(&backRef) && id.Name() == s { - matchedIds := m.GetMatchingIds(id.GvknEquals) - // If there's more than one match, there's no way - // to know which one to pick, so emit error. - if len(matchedIds) > 1 { - return nil, fmt.Errorf( - "Multiple matches for name %s:\n %v", id, matchedIds) - } - // Return transformed name of the object, - // complete with prefixes, hashes, etc. - return res.GetName(), nil - } - } - return in, nil - case []interface{}: - l, _ := in.([]interface{}) - var names []string - for _, item := range l { - name, ok := item.(string) - if !ok { - return nil, fmt.Errorf("%#v is expected to be %T", item, name) - } - names = append(names, name) - } - for id, res := range m { - indexes := indexOf(id.Name(), names) - if id.Gvk().IsSelected(&backRef) && len(indexes) > 0 { - matchedIds := m.GetMatchingIds(id.GvknEquals) - if len(matchedIds) > 1 { - return nil, fmt.Errorf( - "Multiple matches for name %s:\n %v", id, matchedIds) - } - for _, index := range indexes { - l[index] = res.GetName() - } - return l, nil - } - } - return in, nil - default: - return nil, fmt.Errorf("%#v is expected to be either a string or a []interface{}", in) - } - } -} - -func indexOf(s string, slice []string) []int { - var index []int - for i, item := range slice { - if item == s { - index = append(index, i) - } - } - return index -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/transformers/namespace.go b/vendor/sigs.k8s.io/kustomize/pkg/transformers/namespace.go deleted file mode 100644 index 5f0c06482077..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/transformers/namespace.go +++ /dev/null @@ -1,121 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package transformers - -import ( - "sigs.k8s.io/kustomize/pkg/gvk" - "sigs.k8s.io/kustomize/pkg/resmap" - "sigs.k8s.io/kustomize/pkg/transformers/config" -) - -type namespaceTransformer struct { - namespace string - fieldSpecsToUse []config.FieldSpec - fieldSpecsToSkip []config.FieldSpec -} - -var _ Transformer = &namespaceTransformer{} - -// NewNamespaceTransformer construct a namespaceTransformer. -func NewNamespaceTransformer(ns string, cf []config.FieldSpec) Transformer { - if len(ns) == 0 { - return NewNoOpTransformer() - } - var skip []config.FieldSpec - for _, g := range gvk.ClusterLevelGvks() { - skip = append(skip, config.FieldSpec{Gvk: g}) - } - return &namespaceTransformer{ - namespace: ns, - fieldSpecsToUse: cf, - fieldSpecsToSkip: skip, - } -} - -// Transform adds the namespace. -func (o *namespaceTransformer) Transform(m resmap.ResMap) error { - mf := resmap.ResMap{} - - for id := range m { - found := false - for _, path := range o.fieldSpecsToSkip { - if id.Gvk().IsSelected(&path.Gvk) { - found = true - break - } - } - if !found { - mf[id] = m[id] - delete(m, id) - } - } - - for id := range mf { - objMap := mf[id].Map() - for _, path := range o.fieldSpecsToUse { - if !id.Gvk().IsSelected(&path.Gvk) { - continue - } - - err := mutateField(objMap, path.PathSlice(), path.CreateIfNotPresent, func(_ interface{}) (interface{}, error) { - return o.namespace, nil - }) - if err != nil { - return err - } - newid := id.CopyWithNewNamespace(o.namespace) - m[newid] = mf[id] - } - - } - o.updateClusterRoleBinding(m) - return nil -} - -func (o *namespaceTransformer) updateClusterRoleBinding(m resmap.ResMap) { - saMap := map[string]bool{} - for id := range m { - if id.Gvk().Equals(gvk.Gvk{Version: "v1", Kind: "ServiceAccount"}) { - saMap[id.Name()] = true - } - } - - for id := range m { - if id.Gvk().Kind != "ClusterRoleBinding" && id.Gvk().Kind != "RoleBinding" { - continue - } - objMap := m[id].Map() - subjects := objMap["subjects"].([]interface{}) - for i := range subjects { - subject := subjects[i].(map[string]interface{}) - kind, foundk := subject["kind"] - name, foundn := subject["name"] - if !foundk || !foundn || kind.(string) != "ServiceAccount" { - continue - } - // a ServiceAccount named “default” exists in every active namespace - if name.(string) == "default" || saMap[name.(string)] { - subject := subjects[i].(map[string]interface{}) - mutateField(subject, []string{"namespace"}, true, func(_ interface{}) (interface{}, error) { - return o.namespace, nil - }) - subjects[i] = subject - } - } - objMap["subjects"] = subjects - } -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/transformers/nooptransformer.go b/vendor/sigs.k8s.io/kustomize/pkg/transformers/nooptransformer.go deleted file mode 100644 index c07389b31d54..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/transformers/nooptransformer.go +++ /dev/null @@ -1,34 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package transformers - -import "sigs.k8s.io/kustomize/pkg/resmap" - -// noOpTransformer contains a no-op transformer. -type noOpTransformer struct{} - -var _ Transformer = &noOpTransformer{} - -// NewNoOpTransformer constructs a noOpTransformer. -func NewNoOpTransformer() Transformer { - return &noOpTransformer{} -} - -// Transform does nothing. -func (o *noOpTransformer) Transform(_ resmap.ResMap) error { - return nil -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/transformers/prefixsuffixname.go b/vendor/sigs.k8s.io/kustomize/pkg/transformers/prefixsuffixname.go deleted file mode 100644 index c4ca85f53aa6..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/transformers/prefixsuffixname.go +++ /dev/null @@ -1,109 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package transformers - -import ( - "errors" - "fmt" - - "sigs.k8s.io/kustomize/pkg/gvk" - "sigs.k8s.io/kustomize/pkg/resmap" - "sigs.k8s.io/kustomize/pkg/transformers/config" -) - -// namePrefixSuffixTransformer contains the prefix, suffix, and the FieldSpecs -// for each field needing a name prefix and suffix. -type namePrefixSuffixTransformer struct { - prefix string - suffix string - fieldSpecsToUse []config.FieldSpec - fieldSpecsToSkip []config.FieldSpec -} - -var _ Transformer = &namePrefixSuffixTransformer{} - -var prefixSuffixFieldSpecsToSkip = []config.FieldSpec{ - { - Gvk: gvk.Gvk{Kind: "CustomResourceDefinition"}, - }, -} - -// NewNamePrefixSuffixTransformer makes a namePrefixSuffixTransformer. -func NewNamePrefixSuffixTransformer( - np, ns string, fieldSpecs []config.FieldSpec) (Transformer, error) { - if len(np) == 0 && len(ns) == 0 { - return NewNoOpTransformer(), nil - } - if fieldSpecs == nil { - return nil, errors.New("fieldSpecs is not expected to be nil") - } - return &namePrefixSuffixTransformer{ - prefix: np, - suffix: ns, - fieldSpecsToUse: fieldSpecs, - fieldSpecsToSkip: prefixSuffixFieldSpecsToSkip}, nil -} - -// Transform prepends the name prefix and appends the name suffix. -func (o *namePrefixSuffixTransformer) Transform(m resmap.ResMap) error { - // Fill map "mf" with entries subject to name modification, and - // delete these entries from "m", so that for now m retains only - // the entries whose names will not be modified. - mf := resmap.ResMap{} - for id := range m { - found := false - for _, path := range o.fieldSpecsToSkip { - if id.Gvk().IsSelected(&path.Gvk) { - found = true - break - } - } - if !found { - mf[id] = m[id] - delete(m, id) - } - } - - for id := range mf { - objMap := mf[id].Map() - for _, path := range o.fieldSpecsToUse { - if !id.Gvk().IsSelected(&path.Gvk) { - continue - } - err := mutateField( - objMap, - path.PathSlice(), - path.CreateIfNotPresent, - o.addPrefixSuffix) - if err != nil { - return err - } - newId := id.CopyWithNewPrefixSuffix(o.prefix, o.suffix) - m[newId] = mf[id] - } - } - return nil -} - -func (o *namePrefixSuffixTransformer) addPrefixSuffix( - in interface{}) (interface{}, error) { - s, ok := in.(string) - if !ok { - return nil, fmt.Errorf("%#v is expected to be %T", in, s) - } - return fmt.Sprintf("%s%s%s", o.prefix, s, o.suffix), nil -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/transformers/refvars.go b/vendor/sigs.k8s.io/kustomize/pkg/transformers/refvars.go deleted file mode 100644 index b31ec6e7a25b..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/transformers/refvars.go +++ /dev/null @@ -1,94 +0,0 @@ -package transformers - -import ( - "fmt" - "sigs.k8s.io/kustomize/pkg/expansion" - "sigs.k8s.io/kustomize/pkg/resmap" - "sigs.k8s.io/kustomize/pkg/transformers/config" -) - -type RefVarTransformer struct { - varMap map[string]string - replacementCounts map[string]int - fieldSpecs []config.FieldSpec - mappingFunc func(string) string -} - -// NewRefVarTransformer returns a new RefVarTransformer -// that replaces $(VAR) style variables with values. -// The fieldSpecs are the places to look for occurrences of $(VAR). -func NewRefVarTransformer( - varMap map[string]string, fs []config.FieldSpec) *RefVarTransformer { - return &RefVarTransformer{ - varMap: varMap, - fieldSpecs: fs, - } -} - -// replaceVars accepts as 'in' a string, or string array, which can have -// embedded instances of $VAR style variables, e.g. a container command string. -// The function returns the string with the variables expanded to their final -// values. -func (rv *RefVarTransformer) replaceVars(in interface{}) (interface{}, error) { - switch vt := in.(type) { - case []interface{}: - var xs []string - for _, a := range in.([]interface{}) { - xs = append(xs, expansion.Expand(a.(string), rv.mappingFunc)) - } - return xs, nil - case map[string]interface{}: - inMap := in.(map[string]interface{}) - xs := make(map[string]interface{}, len(inMap)) - for k, v := range inMap { - s, ok := v.(string) - if !ok { - return nil, fmt.Errorf("%#v is expected to be %T", v, s) - } - xs[k] = expansion.Expand(s, rv.mappingFunc) - } - return xs, nil - case interface{}: - s, ok := in.(string) - if !ok { - return nil, fmt.Errorf("%#v is expected to be %T", in, s) - } - return expansion.Expand(s, rv.mappingFunc), nil - case nil: - return nil, nil - default: - return "", fmt.Errorf("invalid type encountered %T", vt) - } -} - -// UnusedVars returns slice of Var names that were unused -// after a Transform run. -func (rv *RefVarTransformer) UnusedVars() []string { - var unused []string - for k := range rv.varMap { - _, ok := rv.replacementCounts[k] - if !ok { - unused = append(unused, k) - } - } - return unused -} - -// Transform replaces $(VAR) style variables with values. -func (rv *RefVarTransformer) Transform(m resmap.ResMap) error { - rv.replacementCounts = make(map[string]int) - rv.mappingFunc = expansion.MappingFuncFor( - rv.replacementCounts, rv.varMap) - for id, res := range m { - for _, fieldSpec := range rv.fieldSpecs { - if id.Gvk().IsSelected(&fieldSpec.Gvk) { - if err := mutateField( - res.Map(), fieldSpec.PathSlice(), - false, rv.replaceVars); err != nil { - return err - } - } - } - } - return nil -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/transformers/transformer.go b/vendor/sigs.k8s.io/kustomize/pkg/transformers/transformer.go deleted file mode 100644 index dc6f8807c3bf..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/transformers/transformer.go +++ /dev/null @@ -1,26 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Package transformers has implementations of resmap.ResMap transformers. -package transformers - -import "sigs.k8s.io/kustomize/pkg/resmap" - -// A Transformer modifies an instance of resmap.ResMap. -type Transformer interface { - // Transform modifies data in the argument, e.g. adding labels to resources that can be labelled. - Transform(m resmap.ResMap) error -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/types/genargs.go b/vendor/sigs.k8s.io/kustomize/pkg/types/genargs.go deleted file mode 100644 index bef093d35085..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/types/genargs.go +++ /dev/null @@ -1,64 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package types - -import ( - "strconv" - "strings" -) - -// GenArgs contains both generator args and options -type GenArgs struct { - args *GeneratorArgs - opts *GeneratorOptions -} - -// NewGenArgs returns a new object of GenArgs -func NewGenArgs(args *GeneratorArgs, opts *GeneratorOptions) *GenArgs { - return &GenArgs{ - args: args, - opts: opts, - } -} - -func (g *GenArgs) String() string { - if g == nil { - return "{nilGenArgs}" - } - return "{" + - strings.Join([]string{ - "nsfx:" + strconv.FormatBool(g.NeedsHashSuffix()), - "beh:" + g.Behavior().String()}, - ",") + - "}" -} - -// NeedHashSuffix returns true if the hash suffix is needed. -// It is needed when the two conditions are both met -// 1) GenArgs is not nil -// 2) DisableNameSuffixHash in GeneratorOptions is not set to true -func (g *GenArgs) NeedsHashSuffix() bool { - return g.args != nil && (g.opts == nil || g.opts.DisableNameSuffixHash == false) -} - -// Behavior returns Behavior field of GeneratorArgs -func (g *GenArgs) Behavior() GenerationBehavior { - if g.args == nil { - return BehaviorUnspecified - } - return NewGenerationBehavior(g.args.Behavior) -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/types/generationbehavior.go b/vendor/sigs.k8s.io/kustomize/pkg/types/generationbehavior.go deleted file mode 100644 index 67ba8a0b568d..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/types/generationbehavior.go +++ /dev/null @@ -1,59 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package types - -// GenerationBehavior specifies generation behavior of configmaps, secrets and maybe other resources. -type GenerationBehavior int - -const ( - // BehaviorUnspecified is an Unspecified behavior; typically treated as a Create. - BehaviorUnspecified GenerationBehavior = iota - // BehaviorCreate makes a new resource. - BehaviorCreate - // BehaviorReplace replaces a resource. - BehaviorReplace - // BehaviorMerge attempts to merge a new resource with an existing resource. - BehaviorMerge -) - -// String converts a GenerationBehavior to a string. -func (b GenerationBehavior) String() string { - switch b { - case BehaviorReplace: - return "replace" - case BehaviorMerge: - return "merge" - case BehaviorCreate: - return "create" - default: - return "unspecified" - } -} - -// NewGenerationBehavior converts a string to a GenerationBehavior. -func NewGenerationBehavior(s string) GenerationBehavior { - switch s { - case "replace": - return BehaviorReplace - case "merge": - return BehaviorMerge - case "create": - return BehaviorCreate - default: - return BehaviorUnspecified - } -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/types/kustomization.go b/vendor/sigs.k8s.io/kustomize/pkg/types/kustomization.go deleted file mode 100644 index 12d09820f030..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/types/kustomization.go +++ /dev/null @@ -1,250 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Package types holds struct definitions that should find a better home. -package types - -import ( - "regexp" - - "sigs.k8s.io/kustomize/pkg/image" - "sigs.k8s.io/kustomize/pkg/patch" -) - -const ( - KustomizationVersion = "kustomize.config.k8s.io/v1beta1" - KustomizationKind = "Kustomization" -) - -// TypeMeta copies apimachinery/pkg/apis/meta/v1.TypeMeta -type TypeMeta struct { - // Kind copies apimachinery/pkg/apis/meta/v1.Typemeta.Kind - Kind string `json:"kind,omitempty" protobuf:"bytes,1,opt,name=kind"` - - // APIVersion copies apimachinery/pkg/apis/meta/v1.Typemeta.APIVersion - APIVersion string `json:"apiVersion,omitempty" protobuf:"bytes,2,opt,name=apiVersion"` -} - -// Kustomization holds the information needed to generate customized k8s api resources. -type Kustomization struct { - TypeMeta `json:",inline" yaml:",inline"` - - // - // Operators - what kustomize can do. - // - - // NamePrefix will prefix the names of all resources mentioned in the kustomization - // file including generated configmaps and secrets. - NamePrefix string `json:"namePrefix,omitempty" yaml:"namePrefix,omitempty"` - - // NameSuffix will suffix the names of all resources mentioned in the kustomization - // file including generated configmaps and secrets. - NameSuffix string `json:"nameSuffix,omitempty" yaml:"nameSuffix,omitempty"` - - // Namespace to add to all objects. - Namespace string `json:"namespace,omitempty" yaml:"namespace,omitempty"` - - // CommonLabels to add to all objects and selectors. - CommonLabels map[string]string `json:"commonLabels,omitempty" yaml:"commonLabels,omitempty"` - - // CommonAnnotations to add to all objects. - CommonAnnotations map[string]string `json:"commonAnnotations,omitempty" yaml:"commonAnnotations,omitempty"` - - // PatchesStrategicMerge specifies the relative path to a file - // containing a strategic merge patch. Format documented at - // https://github.com/kubernetes/community/blob/master/contributors/devel/strategic-merge-patch.md - // URLs and globs are not supported. - PatchesStrategicMerge []patch.StrategicMerge `json:"patchesStrategicMerge,omitempty" yaml:"patchesStrategicMerge,omitempty"` - - // JSONPatches is a list of JSONPatch for applying JSON patch. - // Format documented at https://tools.ietf.org/html/rfc6902 - // and http://jsonpatch.com - PatchesJson6902 []patch.Json6902 `json:"patchesJson6902,omitempty" yaml:"patchesJson6902,omitempty"` - - // Images is a list of (image name, new name, new tag or digest) - // for changing image names, tags or digests. This can also be achieved with a - // patch, but this operator is simpler to specify. - Images []image.Image `json:"images,omitempty" yaml:"images,omitempty"` - - // Vars allow things modified by kustomize to be injected into a - // container specification. A var is a name (e.g. FOO) associated - // with a field in a specific resource instance. The field must - // contain a value of type string, and defaults to the name field - // of the instance. Any appearance of "$(FOO)" in the container - // spec will be replaced at kustomize build time, after the final - // value of the specified field has been determined. - Vars []Var `json:"vars,omitempty" yaml:"vars,omitempty"` - - // - // Operands - what kustomize operates on. - // - - // Resources specifies relative paths to files holding YAML representations - // of kubernetes API objects. URLs and globs not supported. - Resources []string `json:"resources,omitempty" yaml:"resources,omitempty"` - - // Crds specifies relative paths to Custom Resource Definition files. - // This allows custom resources to be recognized as operands, making - // it possible to add them to the Resources list. - // CRDs themselves are not modified. - Crds []string `json:"crds,omitempty" yaml:"crds,omitempty"` - - // Bases are relative paths or github repository URLs specifying a - // directory containing a kustomization.yaml file. - // URL format: https://github.com/hashicorp/go-getter#url-format - Bases []string `json:"bases,omitempty" yaml:"bases,omitempty"` - - // - // Generators (operators that create operands) - // - - // ConfigMapGenerator is a list of configmaps to generate from - // local data (one configMap per list item). - // The resulting resource is a normal operand, subject to - // name prefixing, patching, etc. By default, the name of - // the map will have a suffix hash generated from its contents. - ConfigMapGenerator []ConfigMapArgs `json:"configMapGenerator,omitempty" yaml:"configMapGenerator,omitempty"` - - // SecretGenerator is a list of secrets to generate from - // local data (one secret per list item). - // The resulting resource is a normal operand, subject to - // name prefixing, patching, etc. By default, the name of - // the map will have a suffix hash generated from its contents. - SecretGenerator []SecretArgs `json:"secretGenerator,omitempty" yaml:"secretGenerator,omitempty"` - - // GeneratorOptions modify behavior of all ConfigMap and Secret generators. - GeneratorOptions *GeneratorOptions `json:"generatorOptions,omitempty" yaml:"generatorOptions,omitempty"` - - // Configurations is a list of transformer configuration files - Configurations []string `json:"configurations,omitempty" yaml:"configurations,omitempty"` -} - -// DealWithMissingFields fills the missing fields -func (k *Kustomization) DealWithMissingFields() []string { - var msgs []string - if k.APIVersion == "" { - k.APIVersion = KustomizationVersion - msgs = append(msgs, "Fixed the missing field by adding apiVersion: "+KustomizationVersion) - } - if k.Kind == "" { - k.Kind = KustomizationKind - msgs = append(msgs, "Fixed the missing field by adding kind: "+KustomizationKind) - } - return msgs -} - -func (k *Kustomization) EnforceFields() []string { - var errs []string - if k.APIVersion != "" && k.APIVersion != KustomizationVersion { - errs = append(errs, "apiVersion should be "+KustomizationVersion) - } - if k.Kind != "" && k.Kind != KustomizationKind { - errs = append(errs, "kind should be "+KustomizationKind) - } - return errs -} - -// DealWithDeprecatedFields should be called immediately after -// loading from storage. -func DealWithDeprecatedFields(data []byte) []byte { - deprecateFieldsMap := map[string]string{ - "patches:": "patchesStrategicMerge:", - "imageTags:": "images:", - } - for oldname, newname := range deprecateFieldsMap { - pattern := regexp.MustCompile(oldname) - data = pattern.ReplaceAll(data, []byte(newname)) - } - return data -} - -// GeneratorArgs contains arguments common to generators. -type GeneratorArgs struct { - // Namespace for the configmap, optional - Namespace string `json:"namespace,omitempty" yaml:"namespace,omitempty"` - - // Name - actually the partial name - of the generated resource. - // The full name ends up being something like - // NamePrefix + this.Name + hash(content of generated resource). - Name string `json:"name,omitempty" yaml:"name,omitempty"` - - // Behavior of generated resource, must be one of: - // 'create': create a new one - // 'replace': replace the existing one - // 'merge': merge with the existing one - Behavior string `json:"behavior,omitempty" yaml:"behavior,omitempty"` - - // DataSources for the generator. - DataSources `json:",inline,omitempty" yaml:",inline,omitempty"` -} - -// ConfigMapArgs contains the metadata of how to generate a configmap. -type ConfigMapArgs struct { - // GeneratorArgs for the configmap. - GeneratorArgs `json:",inline,omitempty" yaml:",inline,omitempty"` -} - -// SecretArgs contains the metadata of how to generate a secret. -type SecretArgs struct { - // GeneratorArgs for the secret. - GeneratorArgs `json:",inline,omitempty" yaml:",inline,omitempty"` - - // Type of the secret. - // - // This is the same field as the secret type field in v1/Secret: - // It can be "Opaque" (default), or "kubernetes.io/tls". - // - // If type is "kubernetes.io/tls", then "literals" or "files" must have exactly two - // keys: "tls.key" and "tls.crt" - Type string `json:"type,omitempty" yaml:"type,omitempty"` -} - -// DataSources contains some generic sources for configmaps. -type DataSources struct { - // LiteralSources is a list of literal sources. - // Each literal source should be a key and literal value, - // e.g. `somekey=somevalue` - // It will be similar to kubectl create configmap|secret --from-literal - LiteralSources []string `json:"literals,omitempty" yaml:"literals,omitempty"` - - // FileSources is a list of file sources. - // Each file source can be specified using its file path, in which case file - // basename will be used as configmap key, or optionally with a key and file - // path, in which case the given key will be used. - // Specifying a directory will iterate each named file in the directory - // whose basename is a valid configmap key. - // It will be similar to kubectl create configmap|secret --from-file - FileSources []string `json:"files,omitempty" yaml:"files,omitempty"` - - // EnvSource format should be a path to a file to read lines of key=val - // pairs to create a configmap. - // i.e. a Docker .env file or a .ini file. - EnvSource string `json:"env,omitempty" yaml:"env,omitempty"` -} - -// GeneratorOptions modify behavior of all ConfigMap and Secret generators. -type GeneratorOptions struct { - // Labels to add to all generated resources. - Labels map[string]string `json:"labels,omitempty" yaml:"labels,omitempty"` - - // Annotations to add to all generated resources. - Annotations map[string]string `json:"annotations,omitempty" yaml:"annotations,omitempty"` - - // DisableNameSuffixHash if true disables the default behavior of adding a - // suffix to the names of generated resources that is a hash of the - // resource contents. - DisableNameSuffixHash bool `json:"disableNameSuffixHash,omitempty" yaml:"disableNameSuffixHash,omitempty"` -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/types/var.go b/vendor/sigs.k8s.io/kustomize/pkg/types/var.go deleted file mode 100644 index 6a48032a0830..000000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/types/var.go +++ /dev/null @@ -1,145 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package types - -import ( - "fmt" - "sort" - "strings" - - "sigs.k8s.io/kustomize/pkg/gvk" -) - -const defaultFieldPath = "metadata.name" - -// Var represents a variable whose value will be sourced -// from a field in a Kubernetes object. -type Var struct { - // Value of identifier name e.g. FOO used in container args, annotations - // Appears in pod template as $(FOO) - Name string `json:"name" yaml:"name"` - - // ObjRef must refer to a Kubernetes resource under the - // purview of this kustomization. ObjRef should use the - // raw name of the object (the name specified in its YAML, - // before addition of a namePrefix and a nameSuffix). - ObjRef Target `json:"objref" yaml:"objref"` - - // FieldRef refers to the field of the object referred to by - // ObjRef whose value will be extracted for use in - // replacing $(FOO). - // If unspecified, this defaults to fieldPath: $defaultFieldPath - FieldRef FieldSelector `json:"fieldref,omitempty" yaml:"fieldref,omitempty"` -} - -// Target refers to a kubernetes object by Group, Version, Kind and Name -// gvk.Gvk contains Group, Version and Kind -// APIVersion is added to keep the backward compatibility of using ObjectReference -// for Var.ObjRef -type Target struct { - APIVersion string `json:"apiVersion,omitempty" yaml:"apiVersion,omitempty"` - gvk.Gvk `json:",inline,omitempty" yaml:",inline,omitempty"` - Name string `json:"name" yaml:"name"` -} - -// FieldSelector contains the fieldPath to an object field. -// This struct is added to keep the backward compatibility of using ObjectFieldSelector -// for Var.FieldRef -type FieldSelector struct { - FieldPath string `json:"fieldPath,omitempty" yaml:"fieldPath,omitempty"` -} - -// defaulting sets reference to field used by default. -func (v *Var) defaulting() { - if v.FieldRef.FieldPath == "" { - v.FieldRef.FieldPath = defaultFieldPath - } -} - -// VarSet is a slice of Vars where no var.Name is repeated. -type VarSet struct { - set []Var -} - -// Set returns a copy of the var set. -func (vs *VarSet) Set() []Var { - s := make([]Var, len(vs.set)) - copy(s, vs.set) - return s -} - -// MergeSet absorbs other vars with error on name collision. -func (vs *VarSet) MergeSet(incoming *VarSet) error { - return vs.MergeSlice(incoming.set) -} - -// MergeSlice absorbs other vars with error on name collision. -// Empty fields in incoming vars are defaulted. -func (vs *VarSet) MergeSlice(incoming []Var) error { - for _, v := range incoming { - if vs.Contains(v) { - return fmt.Errorf( - "var %s already encountered", v.Name) - } - v.defaulting() - vs.insert(v) - } - return nil -} - -func (vs *VarSet) insert(v Var) { - index := sort.Search( - len(vs.set), - func(i int) bool { return vs.set[i].Name > v.Name }) - // make room - vs.set = append(vs.set, Var{}) - // shift right at index. - // copy will not increase size of destination. - copy(vs.set[index+1:], vs.set[index:]) - vs.set[index] = v -} - -// Contains is true if the set has the other var. -func (vs *VarSet) Contains(other Var) bool { - return vs.Get(other.Name) != nil -} - -// Get returns the var with the given name, else nil. -func (vs *VarSet) Get(name string) *Var { - for _, v := range vs.set { - if v.Name == name { - return &v - } - } - return nil -} - -// GVK returns the Gvk object in Target -func (t *Target) GVK() gvk.Gvk { - if t.APIVersion == "" { - return t.Gvk - } - versions := strings.Split(t.APIVersion, "/") - if len(versions) == 2 { - t.Group = versions[0] - t.Version = versions[1] - } - if len(versions) == 1 { - t.Version = versions[0] - } - return t.Gvk -} diff --git a/vendor/sigs.k8s.io/structured-merge-diff/v4/fieldpath/set.go b/vendor/sigs.k8s.io/structured-merge-diff/v4/fieldpath/set.go index 029c2b6003ed..6d182768d052 100644 --- a/vendor/sigs.k8s.io/structured-merge-diff/v4/fieldpath/set.go +++ b/vendor/sigs.k8s.io/structured-merge-diff/v4/fieldpath/set.go @@ -19,6 +19,8 @@ package fieldpath import ( "sort" "strings" + + "sigs.k8s.io/structured-merge-diff/v4/schema" ) // Set identifies a set of fields. @@ -110,6 +112,30 @@ func (s *Set) RecursiveDifference(s2 *Set) *Set { } } +// EnsureNamedFieldsAreMembers returns a Set that contains all the +// fields in s, as well as all the named fields that are typically not +// included. For example, a set made of "a.b.c" will end-up also owning +// "a" if it's a named fields but not "a.b" if it's a map. +func (s *Set) EnsureNamedFieldsAreMembers(sc *schema.Schema, tr schema.TypeRef) *Set { + members := PathElementSet{ + members: make(sortedPathElements, 0, s.Members.Size()+len(s.Children.members)), + } + atom, _ := sc.Resolve(tr) + members.members = append(members.members, s.Members.members...) + for _, node := range s.Children.members { + // Only insert named fields. + if node.pathElement.FieldName != nil && atom.Map != nil { + if _, has := atom.Map.FindField(*node.pathElement.FieldName); has { + members.Insert(node.pathElement) + } + } + } + return &Set{ + Members: members, + Children: *s.Children.EnsureNamedFieldsAreMembers(sc, tr), + } +} + // Size returns the number of members of the set. func (s *Set) Size() int { return s.Members.Size() + s.Children.Size() @@ -180,6 +206,40 @@ func (s *Set) WithPrefix(pe PathElement) *Set { return subset } +// Leaves returns a set containing only the leaf paths +// of a set. +func (s *Set) Leaves() *Set { + leaves := PathElementSet{} + im := 0 + ic := 0 + + // any members that are not also children are leaves +outer: + for im < len(s.Members.members) { + member := s.Members.members[im] + + for ic < len(s.Children.members) { + d := member.Compare(s.Children.members[ic].pathElement) + if d == 0 { + ic++ + im++ + continue outer + } else if d < 0 { + break + } else /* if d > 0 */ { + ic++ + } + } + leaves.members = append(leaves.members, member) + im++ + } + + return &Set{ + Members: leaves, + Children: *s.Children.Leaves(), + } +} + // setNode is a pair of PathElement / Set, for the purpose of expressing // nested set membership. type setNode struct { @@ -391,6 +451,31 @@ func (s *SetNodeMap) RecursiveDifference(s2 *Set) *SetNodeMap { return out } +// EnsureNamedFieldsAreMembers returns a set that contains all the named fields along with the leaves. +func (s *SetNodeMap) EnsureNamedFieldsAreMembers(sc *schema.Schema, tr schema.TypeRef) *SetNodeMap { + out := make(sortedSetNode, 0, s.Size()) + atom, _ := sc.Resolve(tr) + for _, member := range s.members { + tr := schema.TypeRef{} + if member.pathElement.FieldName != nil && atom.Map != nil { + tr = atom.Map.ElementType + if sf, ok := atom.Map.FindField(*member.pathElement.FieldName); ok { + tr = sf.Type + } + } else if member.pathElement.Key != nil && atom.List != nil { + tr = atom.List.ElementType + } + out = append(out, setNode{ + pathElement: member.pathElement, + set: member.set.EnsureNamedFieldsAreMembers(sc, tr), + }) + } + + return &SetNodeMap{ + members: out, + } +} + // Iterate calls f for each PathElement in the set. func (s *SetNodeMap) Iterate(f func(PathElement)) { for _, n := range s.members { @@ -404,3 +489,17 @@ func (s *SetNodeMap) iteratePrefix(prefix Path, f func(Path)) { n.set.iteratePrefix(append(prefix, pe), f) } } + +// Leaves returns a SetNodeMap containing +// only setNodes with leaf PathElements. +func (s *SetNodeMap) Leaves() *SetNodeMap { + out := &SetNodeMap{} + out.members = make(sortedSetNode, len(s.members)) + for i, n := range s.members { + out.members[i] = setNode{ + pathElement: n.pathElement, + set: n.set.Leaves(), + } + } + return out +} diff --git a/vendor/sigs.k8s.io/structured-merge-diff/v4/merge/update.go b/vendor/sigs.k8s.io/structured-merge-diff/v4/merge/update.go index 73e0ec73f945..33a3085bf2c0 100644 --- a/vendor/sigs.k8s.io/structured-merge-diff/v4/merge/update.go +++ b/vendor/sigs.k8s.io/structured-merge-diff/v4/merge/update.go @@ -226,7 +226,8 @@ func (s *Updater) prune(merged *typed.TypedValue, managers fieldpath.ManagedFiel return nil, fmt.Errorf("failed to convert merged object to last applied version: %v", err) } - pruned := convertedMerged.RemoveItems(lastSet.Set()) + sc, tr := convertedMerged.Schema(), convertedMerged.TypeRef() + pruned := convertedMerged.RemoveItems(lastSet.Set().EnsureNamedFieldsAreMembers(sc, tr)) pruned, err = s.addBackOwnedItems(convertedMerged, pruned, managers, applyingManager) if err != nil { return nil, fmt.Errorf("failed add back owned items: %v", err) @@ -272,7 +273,8 @@ func (s *Updater) addBackOwnedItems(merged, pruned *typed.TypedValue, managedFie if err != nil { return nil, fmt.Errorf("failed to create field set from pruned object at version %v: %v", version, err) } - pruned = merged.RemoveItems(mergedSet.Difference(prunedSet.Union(managed))) + sc, tr := merged.Schema(), merged.TypeRef() + pruned = merged.RemoveItems(mergedSet.EnsureNamedFieldsAreMembers(sc, tr).Difference(prunedSet.EnsureNamedFieldsAreMembers(sc, tr).Union(managed.EnsureNamedFieldsAreMembers(sc, tr)))) } return pruned, nil } @@ -296,7 +298,11 @@ func (s *Updater) addBackDanglingItems(merged, pruned *typed.TypedValue, lastSet if err != nil { return nil, fmt.Errorf("failed to create field set from merged object in last applied version: %v", err) } - return merged.RemoveItems(mergedSet.Difference(prunedSet).Intersection(lastSet.Set())), nil + sc, tr := merged.Schema(), merged.TypeRef() + prunedSet = prunedSet.EnsureNamedFieldsAreMembers(sc, tr) + mergedSet = mergedSet.EnsureNamedFieldsAreMembers(sc, tr) + last := lastSet.Set().EnsureNamedFieldsAreMembers(sc, tr) + return merged.RemoveItems(mergedSet.Difference(prunedSet).Intersection(last)), nil } // reconcileManagedFieldsWithSchemaChanges reconciles the managed fields with any changes to the diff --git a/vendor/sigs.k8s.io/structured-merge-diff/v4/typed/remove.go b/vendor/sigs.k8s.io/structured-merge-diff/v4/typed/remove.go index a20fc16f9ba1..c3e15180a7b1 100644 --- a/vendor/sigs.k8s.io/structured-merge-diff/v4/typed/remove.go +++ b/vendor/sigs.k8s.io/structured-merge-diff/v4/typed/remove.go @@ -20,19 +20,26 @@ import ( ) type removingWalker struct { - value value.Value - out interface{} - schema *schema.Schema - toRemove *fieldpath.Set - allocator value.Allocator + value value.Value + out interface{} + schema *schema.Schema + toRemove *fieldpath.Set + allocator value.Allocator + shouldExtract bool } -func removeItemsWithSchema(val value.Value, toRemove *fieldpath.Set, schema *schema.Schema, typeRef schema.TypeRef) value.Value { +// removeItemsWithSchema will walk the given value and look for items from the toRemove set. +// Depending on whether shouldExtract is set true or false, it will return a modified version +// of the input value with either: +// 1. only the items in the toRemove set (when shouldExtract is true) or +// 2. the items from the toRemove set removed from the value (when shouldExtract is false). +func removeItemsWithSchema(val value.Value, toRemove *fieldpath.Set, schema *schema.Schema, typeRef schema.TypeRef, shouldExtract bool) value.Value { w := &removingWalker{ - value: val, - schema: schema, - toRemove: toRemove, - allocator: value.NewFreelistAllocator(), + value: val, + schema: schema, + toRemove: toRemove, + allocator: value.NewFreelistAllocator(), + shouldExtract: shouldExtract, } resolveSchema(schema, typeRef, val, w) return value.NewValueInterface(w.out) @@ -59,11 +66,22 @@ func (w *removingWalker) doList(t *schema.List) (errs ValidationErrors) { // Ignore error because we have already validated this list pe, _ := listItemToPathElement(w.allocator, w.schema, t, i, item) path, _ := fieldpath.MakePath(pe) + // save items on the path when we shouldExtract + // but ignore them when we are removing (i.e. !w.shouldExtract) if w.toRemove.Has(path) { - continue + if w.shouldExtract { + newItems = append(newItems, item.Unstructured()) + } else { + continue + } } if subset := w.toRemove.WithPrefix(pe); !subset.Empty() { - item = removeItemsWithSchema(item, subset, w.schema, t.ElementType) + item = removeItemsWithSchema(item, subset, w.schema, t.ElementType, w.shouldExtract) + } else { + // don't save items not on the path when we shouldExtract. + if w.shouldExtract { + continue + } } newItems = append(newItems, item.Unstructured()) } @@ -96,11 +114,21 @@ func (w *removingWalker) doMap(t *schema.Map) ValidationErrors { if ft, ok := fieldTypes[k]; ok { fieldType = ft } + // save values on the path when we shouldExtract + // but ignore them when we are removing (i.e. !w.shouldExtract) if w.toRemove.Has(path) { + if w.shouldExtract { + newMap[k] = val.Unstructured() + } return true } if subset := w.toRemove.WithPrefix(pe); !subset.Empty() { - val = removeItemsWithSchema(val, subset, w.schema, fieldType) + val = removeItemsWithSchema(val, subset, w.schema, fieldType, w.shouldExtract) + } else { + // don't save values not on the path when we shouldExtract. + if w.shouldExtract { + return true + } } newMap[k] = val.Unstructured() return true diff --git a/vendor/sigs.k8s.io/structured-merge-diff/v4/typed/tofieldset.go b/vendor/sigs.k8s.io/structured-merge-diff/v4/typed/tofieldset.go index bc88c086c42c..047efff0530d 100644 --- a/vendor/sigs.k8s.io/structured-merge-diff/v4/typed/tofieldset.go +++ b/vendor/sigs.k8s.io/structured-merge-diff/v4/typed/tofieldset.go @@ -137,7 +137,9 @@ func (v *toFieldSetWalker) visitMapItems(t *schema.Map, m value.Map) (errs Valid v2 := v.prepareDescent(pe, tr) v2.value = val errs = append(errs, v2.toFieldSet()...) - if _, ok := t.FindField(key); !ok { + if val.IsNull() || (val.IsMap() && val.AsMap().Length() == 0) { + v2.set.Insert(v2.path) + } else if _, ok := t.FindField(key); !ok { v2.set.Insert(v2.path) } v.finishDescent(v2) diff --git a/vendor/sigs.k8s.io/structured-merge-diff/v4/typed/typed.go b/vendor/sigs.k8s.io/structured-merge-diff/v4/typed/typed.go index 54766f6edcb6..e9e6be8befaa 100644 --- a/vendor/sigs.k8s.io/structured-merge-diff/v4/typed/typed.go +++ b/vendor/sigs.k8s.io/structured-merge-diff/v4/typed/typed.go @@ -150,7 +150,13 @@ func (tv TypedValue) Compare(rhs *TypedValue) (c *Comparison, err error) { // RemoveItems removes each provided list or map item from the value. func (tv TypedValue) RemoveItems(items *fieldpath.Set) *TypedValue { - tv.value = removeItemsWithSchema(tv.value, items, tv.schema, tv.typeRef) + tv.value = removeItemsWithSchema(tv.value, items, tv.schema, tv.typeRef, false) + return &tv +} + +// ExtractItems returns a value with only the provided list or map items extracted from the value. +func (tv TypedValue) ExtractItems(items *fieldpath.Set) *TypedValue { + tv.value = removeItemsWithSchema(tv.value, items, tv.schema, tv.typeRef, true) return &tv } diff --git a/vendor/sigs.k8s.io/structured-merge-diff/v4/typed/validate.go b/vendor/sigs.k8s.io/structured-merge-diff/v4/typed/validate.go index 403ec8fe00f0..378d30219c49 100644 --- a/vendor/sigs.k8s.io/structured-merge-diff/v4/typed/validate.go +++ b/vendor/sigs.k8s.io/structured-merge-diff/v4/typed/validate.go @@ -92,7 +92,7 @@ func validateScalar(t *schema.Scalar, v value.Value, prefix string) (errs Valida case schema.Numeric: if !v.IsFloat() && !v.IsInt() { // TODO: should the schema separate int and float? - return errorf("%vexpected numeric (int or float), got %T", prefix, v) + return errorf("%vexpected numeric (int or float), got %T", prefix, v.Unstructured()) } case schema.String: if !v.IsString() { diff --git a/vendor/sigs.k8s.io/structured-merge-diff/v4/value/reflectcache.go b/vendor/sigs.k8s.io/structured-merge-diff/v4/value/reflectcache.go index 49e6dd1690e0..a5a467c0f00c 100644 --- a/vendor/sigs.k8s.io/structured-merge-diff/v4/value/reflectcache.go +++ b/vendor/sigs.k8s.io/structured-merge-diff/v4/value/reflectcache.go @@ -70,11 +70,11 @@ func (f *FieldCacheEntry) CanOmit(fieldVal reflect.Value) bool { return f.isOmitEmpty && (safeIsNil(fieldVal) || isZero(fieldVal)) } -// GetUsing returns the field identified by this FieldCacheEntry from the provided struct. +// GetFrom returns the field identified by this FieldCacheEntry from the provided struct. func (f *FieldCacheEntry) GetFrom(structVal reflect.Value) reflect.Value { // field might be nested within 'inline' structs for _, elem := range f.fieldPath { - structVal = structVal.FieldByIndex(elem) + structVal = dereference(structVal).FieldByIndex(elem) } return structVal } @@ -150,7 +150,11 @@ func buildStructCacheEntry(t reflect.Type, infos map[string]*FieldCacheEntry, fi continue } if isInline { - buildStructCacheEntry(field.Type, infos, append(fieldPath, field.Index)) + e := field.Type + if field.Type.Kind() == reflect.Ptr { + e = field.Type.Elem() + } + buildStructCacheEntry(e, infos, append(fieldPath, field.Index)) continue } info := &FieldCacheEntry{JsonName: jsonName, isOmitEmpty: isOmitempty, fieldPath: append(fieldPath, field.Index), fieldType: field.Type} From e863e68012f02d7b30843d2429b62d971507d904 Mon Sep 17 00:00:00 2001 From: Maciej Szulik Date: Wed, 7 Apr 2021 12:30:59 +0200 Subject: [PATCH 02/16] React to bump --- test/e2e/upgrade/upgrade.go | 7 ++++--- test/extended/dr/machine_recover.go | 6 +++--- test/extended/dr/quorum_restore.go | 11 ++++++----- test/extended/etcd/etcd_storage_path.go | 8 ++------ test/extended/pods/liveness_override.go | 14 ++++++++------ 5 files changed, 23 insertions(+), 23 deletions(-) diff --git a/test/e2e/upgrade/upgrade.go b/test/e2e/upgrade/upgrade.go index b62e9c0ad945..f515dca54446 100644 --- a/test/e2e/upgrade/upgrade.go +++ b/test/e2e/upgrade/upgrade.go @@ -22,7 +22,8 @@ import ( "k8s.io/client-go/util/retry" "k8s.io/kubernetes/test/e2e/framework" "k8s.io/kubernetes/test/e2e/upgrades" - apps "k8s.io/kubernetes/test/e2e/upgrades/apps" + "k8s.io/kubernetes/test/e2e/upgrades/apps" + "k8s.io/kubernetes/test/e2e/upgrades/node" g "github.com/onsi/ginkgo" "github.com/pborman/uuid" @@ -55,12 +56,12 @@ func AllTests() []upgrades.Test { &alert.UpgradeTest{}, &frontends.AvailableTest{}, &service.UpgradeTest{}, - &upgrades.SecretUpgradeTest{}, + &node.SecretUpgradeTest{}, &apps.ReplicaSetUpgradeTest{}, &apps.StatefulSetUpgradeTest{}, &apps.DeploymentUpgradeTest{}, &apps.JobUpgradeTest{}, - &upgrades.ConfigMapUpgradeTest{}, + &node.ConfigMapUpgradeTest{}, &apps.DaemonSetUpgradeTest{}, &imageregistry.AvailableTest{}, } diff --git a/test/extended/dr/machine_recover.go b/test/extended/dr/machine_recover.go index 8e034073f7cc..db5484a58344 100644 --- a/test/extended/dr/machine_recover.go +++ b/test/extended/dr/machine_recover.go @@ -13,11 +13,11 @@ import ( g "github.com/onsi/ginkgo" o "github.com/onsi/gomega" - "go.etcd.io/etcd/clientv3" "go.etcd.io/etcd/etcdserver/etcdserverpb" "go.etcd.io/etcd/pkg/transport" "google.golang.org/grpc" + corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" @@ -27,9 +27,9 @@ import ( "k8s.io/client-go/dynamic" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" - "k8s.io/kubernetes/test/e2e/framework" "k8s.io/kubernetes/test/e2e/upgrades" + "k8s.io/kubernetes/test/e2e/upgrades/network" exutil "github.com/openshift/origin/test/extended/util" "github.com/openshift/origin/test/extended/util/disruption" @@ -60,7 +60,7 @@ var _ = g.Describe("[sig-cluster-lifecycle][Feature:DisasterRecovery][Disruptive disruption.Run(f, "Machine Shutdown and Restore", "machine_failure", disruption.TestData{}, []upgrades.Test{ - &upgrades.ServiceUpgradeTest{}, + &network.ServiceUpgradeTest{}, controlplane.NewKubeAvailableWithNewConnectionsTest(), controlplane.NewOpenShiftAvailableNewConnectionsTest(), controlplane.NewOAuthAvailableNewConnectionsTest(), diff --git a/test/extended/dr/quorum_restore.go b/test/extended/dr/quorum_restore.go index 37ff2f06847b..7b26434d6402 100644 --- a/test/extended/dr/quorum_restore.go +++ b/test/extended/dr/quorum_restore.go @@ -8,14 +8,13 @@ import ( "strings" "time" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - g "github.com/onsi/ginkgo" o "github.com/onsi/gomega" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/types" @@ -27,7 +26,9 @@ import ( "k8s.io/kubernetes/test/e2e/framework" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" "k8s.io/kubernetes/test/e2e/upgrades" - apps "k8s.io/kubernetes/test/e2e/upgrades/apps" + "k8s.io/kubernetes/test/e2e/upgrades/apps" + "k8s.io/kubernetes/test/e2e/upgrades/network" + "k8s.io/kubernetes/test/e2e/upgrades/node" exutil "github.com/openshift/origin/test/extended/util" "github.com/openshift/origin/test/extended/util/disruption" @@ -38,8 +39,8 @@ const ( ) var disruptionTests []upgrades.Test = []upgrades.Test{ - &upgrades.ServiceUpgradeTest{}, - &upgrades.SecretUpgradeTest{}, + &network.ServiceUpgradeTest{}, + &node.SecretUpgradeTest{}, &apps.ReplicaSetUpgradeTest{}, &apps.StatefulSetUpgradeTest{}, &apps.DeploymentUpgradeTest{}, diff --git a/test/extended/etcd/etcd_storage_path.go b/test/extended/etcd/etcd_storage_path.go index 3d3fb814f6b1..3d58d16d87b9 100644 --- a/test/extended/etcd/etcd_storage_path.go +++ b/test/extended/etcd/etcd_storage_path.go @@ -280,8 +280,6 @@ func testEtcd3StoragePath(t g.GinkgoTInterface, kubeConfig *restclient.Config, e etcdStorageData := etcddata.GetEtcdStorageData() removeStorageData(t, etcdStorageData, - // these alphas resources are not enabled in a real cluster but worked fine in the integration test - gvr("batch", "v2alpha1", "cronjobs"), gvr("node.k8s.io", "v1alpha1", "runtimeclasses"), gvr("rbac.authorization.k8s.io", "v1alpha1", "clusterrolebindings"), gvr("rbac.authorization.k8s.io", "v1alpha1", "clusterroles"), @@ -289,6 +287,7 @@ func testEtcd3StoragePath(t g.GinkgoTInterface, kubeConfig *restclient.Config, e gvr("rbac.authorization.k8s.io", "v1alpha1", "roles"), gvr("scheduling.k8s.io", "v1alpha1", "priorityclasses"), gvr("storage.k8s.io", "v1alpha1", "volumeattachments"), + gvr("storage.k8s.io", "v1alpha1", "csistoragecapacities"), gvr("internal.apiserver.k8s.io", "v1alpha1", "storageversions"), ) @@ -505,7 +504,7 @@ func testEtcd3StoragePath(t g.GinkgoTInterface, kubeConfig *restclient.Config, e } func getCRDs(t g.GinkgoTInterface, crdClient *apiextensionsclientset.Clientset) map[schema.GroupVersionResource]empty { - crdList, err := crdClient.ApiextensionsV1beta1().CustomResourceDefinitions().List(context.Background(), metav1.ListOptions{}) + crdList, err := crdClient.ApiextensionsV1().CustomResourceDefinitions().List(context.Background(), metav1.ListOptions{}) if err != nil { t.Fatal(err) } @@ -517,9 +516,6 @@ func getCRDs(t g.GinkgoTInterface, crdClient *apiextensionsclientset.Clientset) } group := crd.Spec.Group resource := crd.Spec.Names.Plural - if len(crd.Spec.Version) != 0 { - crds[gvr(group, crd.Spec.Version, resource)] = empty{} - } for _, version := range crd.Spec.Versions { if !version.Served { continue diff --git a/test/extended/pods/liveness_override.go b/test/extended/pods/liveness_override.go index f96e8659c179..8811eeea517c 100644 --- a/test/extended/pods/liveness_override.go +++ b/test/extended/pods/liveness_override.go @@ -5,13 +5,15 @@ import ( "time" g "github.com/onsi/ginkgo" - "github.com/openshift/library-go/pkg/build/naming" - v1 "k8s.io/api/core/v1" + + "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/apimachinery/pkg/util/uuid" - e2ecommon "k8s.io/kubernetes/test/e2e/common" + "k8s.io/kubernetes/test/e2e/common/node" "k8s.io/kubernetes/test/e2e/framework" - e2epod "k8s.io/kubernetes/test/e2e/framework/pod" + "k8s.io/kubernetes/test/e2e/framework/pod" + + "github.com/openshift/library-go/pkg/build/naming" ) var _ = g.Describe("[sig-node]", func() { @@ -23,7 +25,7 @@ var _ = g.Describe("[sig-node]", func() { g.It("should override timeoutGracePeriodSeconds when annotation is set", func() { g.By("creating the pod") podName := naming.GetPodName("pod-liveness-override", string(uuid.NewUUID())) - pod := e2epod.NewAgnhostPod(f.Namespace.Name, podName, nil, nil, nil, "bash", "-c", "sleep 1000") + pod := pod.NewAgnhostPod(f.Namespace.Name, podName, nil, nil, nil, "bash", "-c", "sleep 1000") gracePeriod := int64(500) pod.Spec.TerminationGracePeriodSeconds = &gracePeriod @@ -44,6 +46,6 @@ var _ = g.Describe("[sig-node]", func() { "unsupported.do-not-use.openshift.io/override-liveness-grace-period-seconds": strconv.Itoa(gracePeriodOverride), } // 10s delay + 10s period + 5s grace period = 25s < 30s << pod-level timeout 500 - e2ecommon.RunLivenessTest(f, pod, 1, time.Second*30) + node.RunLivenessTest(f, pod, 1, time.Second*30) }) }) From 81c444f5e1790c72c39781621a4afa887ebe63f5 Mon Sep 17 00:00:00 2001 From: Maciej Szulik Date: Tue, 27 Apr 2021 11:24:51 +0200 Subject: [PATCH 03/16] Add custom timeouts to e2e framework This is coming from this PR in k8s https://github.com/kubernetes/kubernetes/pull/96042 --- test/extended/util/client.go | 1 + test/extended/util/disruption/disruption.go | 1 + 2 files changed, 2 insertions(+) diff --git a/test/extended/util/client.go b/test/extended/util/client.go index 38fa1f8d7858..ea2d748f7051 100644 --- a/test/extended/util/client.go +++ b/test/extended/util/client.go @@ -130,6 +130,7 @@ func NewCLIWithoutNamespace(project string) *CLI { ClientQPS: 20, ClientBurst: 50, }, + Timeouts: framework.NewTimeoutContextWithDefaults(), }, username: "admin", execPath: "oc", diff --git a/test/extended/util/disruption/disruption.go b/test/extended/util/disruption/disruption.go index 490a1e9ece06..4644dc4ff4ed 100644 --- a/test/extended/util/disruption/disruption.go +++ b/test/extended/util/disruption/disruption.go @@ -271,6 +271,7 @@ func createTestFrameworks(tests []upgrades.Test) map[string]*framework.Framework ClientQPS: 20, ClientBurst: 50, }, + Timeouts: framework.NewTimeoutContextWithDefaults(), } } return testFrameworks From 4361853083e90bb2d9bfbe905729e267b419bd6f Mon Sep 17 00:00:00 2001 From: Maciej Szulik Date: Wed, 7 Apr 2021 12:32:42 +0200 Subject: [PATCH 04/16] Bug 1945085: enable back etcd test Partially reverting e707fd542c67c765ee0004c9418aad3d24fb53a2 --- test/extended/util/annotate/rules.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/test/extended/util/annotate/rules.go b/test/extended/util/annotate/rules.go index bcbd2e78f861..f8d9a37363e4 100644 --- a/test/extended/util/annotate/rules.go +++ b/test/extended/util/annotate/rules.go @@ -38,9 +38,6 @@ var ( // https://bugzilla.redhat.com/show_bug.cgi?id=1908645 `\[sig-network\] Networking Granular Checks: Services should function for service endpoints using hostNetwork`, - // https://bugzilla.redhat.com/show_bug.cgi?id=1945085 - `API data in etcd should be stored at the correct location and version for all resources`, - // // https://bugzilla.redhat.com/show_bug.cgi?id=1945091 `\[Feature:GenericEphemeralVolume\]`, }, From 7828dda8217de61f1fd978db835f1e2352f960e5 Mon Sep 17 00:00:00 2001 From: Maciej Szulik Date: Wed, 7 Apr 2021 12:41:54 +0200 Subject: [PATCH 05/16] Update images based on k8s bump --- .../cmd/testdata/hello-openshift/hello-pod.json | 2 +- .../test/cmd/testdata/mixed-api-versions.yaml | 2 +- .../testdata/templateinstance_objectkinds.yaml | 2 +- test/extended/testdata/router/ingress.yaml | 4 ++-- .../testdata/router/reencrypt-serving-cert.yaml | 2 +- test/extended/testdata/router/router-common.yaml | 2 +- .../testdata/router/router-config-manager.yaml | 4 ++-- .../extended/testdata/router/router-metrics.yaml | 4 ++-- .../testdata/router/weighted-router.yaml | 6 +++--- .../templates/templateinstance_badobject.yaml | 2 +- .../templates/templateinstance_objectkinds.yaml | 2 +- test/extended/util/image/image.go | 16 +++++++++++----- 12 files changed, 27 insertions(+), 21 deletions(-) diff --git a/test/extended/testdata/cmd/test/cmd/testdata/hello-openshift/hello-pod.json b/test/extended/testdata/cmd/test/cmd/testdata/hello-openshift/hello-pod.json index 9d3471000e12..10b574b5c336 100644 --- a/test/extended/testdata/cmd/test/cmd/testdata/hello-openshift/hello-pod.json +++ b/test/extended/testdata/cmd/test/cmd/testdata/hello-openshift/hello-pod.json @@ -12,7 +12,7 @@ "containers": [ { "name": "hello-openshift", - "image": "k8s.gcr.io/e2e-test-images/agnhost:2.21", + "image": "k8s.gcr.io/e2e-test-images/agnhost:2.30", "args": ["netexec"], "ports": [ { diff --git a/test/extended/testdata/cmd/test/cmd/testdata/mixed-api-versions.yaml b/test/extended/testdata/cmd/test/cmd/testdata/mixed-api-versions.yaml index 996ed1a3cd23..6a315c76745e 100644 --- a/test/extended/testdata/cmd/test/cmd/testdata/mixed-api-versions.yaml +++ b/test/extended/testdata/cmd/test/cmd/testdata/mixed-api-versions.yaml @@ -34,7 +34,7 @@ items: run: v1-job spec: containers: - - image: k8s.gcr.io/e2e-test-images/agnhost:2.21 + - image: k8s.gcr.io/e2e-test-images/agnhost:2.30 name: hello-container restartPolicy: Never diff --git a/test/extended/testdata/cmd/test/cmd/testdata/templateinstance_objectkinds.yaml b/test/extended/testdata/cmd/test/cmd/testdata/templateinstance_objectkinds.yaml index 0af6ac33d843..d010425f61a6 100644 --- a/test/extended/testdata/cmd/test/cmd/testdata/templateinstance_objectkinds.yaml +++ b/test/extended/testdata/cmd/test/cmd/testdata/templateinstance_objectkinds.yaml @@ -40,7 +40,7 @@ items: spec: containers: - name: hello-openshift - image: k8s.gcr.io/e2e-test-images/agnhost:2.21 + image: k8s.gcr.io/e2e-test-images/agnhost:2.30 - kind: Route apiVersion: v1 metadata: diff --git a/test/extended/testdata/router/ingress.yaml b/test/extended/testdata/router/ingress.yaml index 6e60e917a554..153ac4a3849d 100644 --- a/test/extended/testdata/router/ingress.yaml +++ b/test/extended/testdata/router/ingress.yaml @@ -79,7 +79,7 @@ items: terminationGracePeriodSeconds: 1 containers: - name: test - image: k8s.gcr.io/e2e-test-images/agnhost:2.21 + image: k8s.gcr.io/e2e-test-images/agnhost:2.30 args: ["netexec"] ports: - containerPort: 8080 @@ -97,7 +97,7 @@ items: terminationGracePeriodSeconds: 1 containers: - name: test - image: k8s.gcr.io/e2e-test-images/agnhost:2.21 + image: k8s.gcr.io/e2e-test-images/agnhost:2.30 args: ["netexec"] ports: - containerPort: 8080 diff --git a/test/extended/testdata/router/reencrypt-serving-cert.yaml b/test/extended/testdata/router/reencrypt-serving-cert.yaml index a433b4378cf1..fab209af79ba 100644 --- a/test/extended/testdata/router/reencrypt-serving-cert.yaml +++ b/test/extended/testdata/router/reencrypt-serving-cert.yaml @@ -9,7 +9,7 @@ items: app: serving-cert spec: containers: - - image: docker.io/library/nginx:1.15-alpine + - image: k8s.gcr.io/e2e-test-images/nginx:1.15-1 name: serve command: - /usr/sbin/nginx diff --git a/test/extended/testdata/router/router-common.yaml b/test/extended/testdata/router/router-common.yaml index be6c97a9018c..b0c36dcea3bf 100644 --- a/test/extended/testdata/router/router-common.yaml +++ b/test/extended/testdata/router/router-common.yaml @@ -99,7 +99,7 @@ objects: terminationGracePeriodSeconds: 1 containers: - name: test - image: k8s.gcr.io/e2e-test-images/agnhost:2.21 + image: k8s.gcr.io/e2e-test-images/agnhost:2.30 args: ["netexec"] ports: - containerPort: 8080 diff --git a/test/extended/testdata/router/router-config-manager.yaml b/test/extended/testdata/router/router-config-manager.yaml index a0c26666c079..9183aa6c82a6 100644 --- a/test/extended/testdata/router/router-config-manager.yaml +++ b/test/extended/testdata/router/router-config-manager.yaml @@ -136,7 +136,7 @@ objects: terminationGracePeriodSeconds: 1 containers: - name: test - image: k8s.gcr.io/e2e-test-images/agnhost:2.21 + image: k8s.gcr.io/e2e-test-images/agnhost:2.30 args: ["netexec"] ports: - containerPort: 8080 @@ -151,7 +151,7 @@ objects: app: secure-endpoint spec: containers: - - image: docker.io/library/nginx:1.15-alpine + - image: k8s.gcr.io/e2e-test-images/nginx:1.15-1 name: serve command: - /usr/sbin/nginx diff --git a/test/extended/testdata/router/router-metrics.yaml b/test/extended/testdata/router/router-metrics.yaml index 5afee713b8d6..8b6cb877d238 100644 --- a/test/extended/testdata/router/router-metrics.yaml +++ b/test/extended/testdata/router/router-metrics.yaml @@ -80,7 +80,7 @@ items: terminationGracePeriodSeconds: 1 containers: - name: test - image: k8s.gcr.io/e2e-test-images/agnhost:2.21 + image: k8s.gcr.io/e2e-test-images/agnhost:2.30 args: ["netexec"] ports: - containerPort: 8080 @@ -98,7 +98,7 @@ items: terminationGracePeriodSeconds: 1 containers: - name: test - image: k8s.gcr.io/e2e-test-images/agnhost:2.21 + image: k8s.gcr.io/e2e-test-images/agnhost:2.30 args: ["netexec"] ports: - containerPort: 8080 diff --git a/test/extended/testdata/router/weighted-router.yaml b/test/extended/testdata/router/weighted-router.yaml index 524333b60101..052612776a69 100644 --- a/test/extended/testdata/router/weighted-router.yaml +++ b/test/extended/testdata/router/weighted-router.yaml @@ -122,7 +122,7 @@ objects: terminationGracePeriodSeconds: 1 containers: - name: test - image: k8s.gcr.io/e2e-test-images/agnhost:2.21 + image: k8s.gcr.io/e2e-test-images/agnhost:2.30 args: ["netexec"] ports: - containerPort: 8080 @@ -140,7 +140,7 @@ objects: terminationGracePeriodSeconds: 1 containers: - name: test - image: k8s.gcr.io/e2e-test-images/agnhost:2.21 + image: k8s.gcr.io/e2e-test-images/agnhost:2.30 args: ["netexec"] ports: - containerPort: 8080 @@ -158,7 +158,7 @@ objects: terminationGracePeriodSeconds: 1 containers: - name: test - image: k8s.gcr.io/e2e-test-images/agnhost:2.21 + image: k8s.gcr.io/e2e-test-images/agnhost:2.30 args: ["netexec"] ports: - containerPort: 8080 diff --git a/test/extended/testdata/templates/templateinstance_badobject.yaml b/test/extended/testdata/templates/templateinstance_badobject.yaml index e1db120e3628..7ba1266f5c57 100644 --- a/test/extended/testdata/templates/templateinstance_badobject.yaml +++ b/test/extended/testdata/templates/templateinstance_badobject.yaml @@ -28,4 +28,4 @@ items: spec: containers: - name: hello-openshift - image: k8s.gcr.io/e2e-test-images/agnhost:2.21 + image: k8s.gcr.io/e2e-test-images/agnhost:2.30 diff --git a/test/extended/testdata/templates/templateinstance_objectkinds.yaml b/test/extended/testdata/templates/templateinstance_objectkinds.yaml index 0af6ac33d843..d010425f61a6 100644 --- a/test/extended/testdata/templates/templateinstance_objectkinds.yaml +++ b/test/extended/testdata/templates/templateinstance_objectkinds.yaml @@ -40,7 +40,7 @@ items: spec: containers: - name: hello-openshift - image: k8s.gcr.io/e2e-test-images/agnhost:2.21 + image: k8s.gcr.io/e2e-test-images/agnhost:2.30 - kind: Route apiVersion: v1 metadata: diff --git a/test/extended/util/image/image.go b/test/extended/util/image/image.go index ff56c302ffc2..cdbf75f0c432 100644 --- a/test/extended/util/image/image.go +++ b/test/extended/util/image/image.go @@ -32,24 +32,30 @@ func init() { "k8s.gcr.io/sig-storage/csi-attacher:v3.0.0": -1, "k8s.gcr.io/sig-storage/csi-node-driver-registrar:v1.2.0": -1, "k8s.gcr.io/sig-storage/csi-node-driver-registrar:v1.3.0": -1, + "k8s.gcr.io/sig-storage/csi-node-driver-registrar:v2.1.0": -1, "k8s.gcr.io/sig-storage/csi-provisioner:v1.6.0": -1, "k8s.gcr.io/sig-storage/csi-provisioner:v2.0.0": -1, + "k8s.gcr.io/sig-storage/csi-provisioner:v2.1.0": -1, "k8s.gcr.io/sig-storage/csi-resizer:v0.4.0": -1, "k8s.gcr.io/sig-storage/csi-resizer:v0.5.0": -1, + "k8s.gcr.io/sig-storage/csi-resizer:v1.1.0": -1, "k8s.gcr.io/sig-storage/csi-snapshotter:v2.0.1": -1, "k8s.gcr.io/sig-storage/csi-snapshotter:v2.1.0": -1, "k8s.gcr.io/sig-storage/csi-snapshotter:v3.0.2": -1, "k8s.gcr.io/sig-storage/hostpathplugin:v1.4.0": -1, "k8s.gcr.io/sig-storage/livenessprobe:v1.1.0": -1, "k8s.gcr.io/sig-storage/mock-driver:v4.0.2": -1, + "k8s.gcr.io/sig-storage/mock-driver:v4.1.0": -1, "k8s.gcr.io/sig-storage/snapshot-controller:v2.1.1": -1, + "k8s.gcr.io/sig-storage/snapshot-controller:v3.0.2": -1, // allowed upstream kube images - index and value must match upstream or - // tests will fail - "k8s.gcr.io/e2e-test-images/agnhost:2.21": 1, - "docker.io/library/nginx:1.14-alpine": 23, - "docker.io/library/nginx:1.15-alpine": 24, - "docker.io/library/redis:5.0.5-alpine": 31, + // tests will fail (vendor/k8s.io/kubernetes/test/utils/image/manifest.go) + "k8s.gcr.io/e2e-test-images/agnhost:2.30": 1, + "k8s.gcr.io/e2e-test-images/busybox:1.29-1": 7, + "k8s.gcr.io/e2e-test-images/nginx:1.14-1": 23, + "k8s.gcr.io/e2e-test-images/nginx:1.15-1": 24, + "k8s.gcr.io/e2e-test-images/redis:5.0.5-alpine": 34, } images = GetMappedImages(allowedImages, os.Getenv("KUBE_TEST_REPO")) From f49a4160e389bf477257dda21258674a96230883 Mon Sep 17 00:00:00 2001 From: Maciej Szulik Date: Tue, 13 Apr 2021 17:04:59 +0200 Subject: [PATCH 06/16] Add exceptions list for test images --- cmd/openshift-tests/images.go | 12 +++++++++++- test/extended/util/image/image.go | 8 ++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/cmd/openshift-tests/images.go b/cmd/openshift-tests/images.go index a203b271dbce..3c97963f3663 100644 --- a/cmd/openshift-tests/images.go +++ b/cmd/openshift-tests/images.go @@ -47,7 +47,17 @@ const defaultTestImageMirrorLocation = "quay.io/openshift/community-e2e-images" func createImageMirrorForInternalImages(prefix string, ref reference.DockerImageReference, mirrored bool) ([]string, error) { source := ref.Exact() - defaults := k8simage.GetOriginalImageConfigs() + initialDefaults := k8simage.GetOriginalImageConfigs() + exceptions := image.Exceptions.List() + defaults := map[int]k8simage.Config{} + for i, config := range initialDefaults { + for _, exception := range exceptions { + if strings.Contains(config.GetE2EImage(), exception) { + continue + } + defaults[i] = config + } + } updated := k8simage.GetMappedImageConfigs(defaults, ref.Exact()) openshiftDefaults := image.OriginalImages() diff --git a/test/extended/util/image/image.go b/test/extended/util/image/image.go index cdbf75f0c432..760ebda0c6c4 100644 --- a/test/extended/util/image/image.go +++ b/test/extended/util/image/image.go @@ -7,6 +7,8 @@ import ( "os" "regexp" "strings" + + "k8s.io/apimachinery/pkg/util/sets" ) func init() { @@ -150,6 +152,12 @@ func OriginalImages() map[string]int { return images } +// Exceptions is a list of images we don't mirror temporarily due to various +// problems. This list should ideally be empty. +var Exceptions = sets.NewString( + "mcr.microsoft.com/windows:1809", // https://issues.redhat.com/browse/PROJQUAY-1874 +) + // Images returns a map of all images known to the test package. func Images() map[string]struct{} { copied := make(map[string]struct{}) From 1f61cca1130cb4caa61919020885c46a96d6614a Mon Sep 17 00:00:00 2001 From: Maciej Szulik Date: Tue, 20 Apr 2021 17:58:12 +0200 Subject: [PATCH 07/16] Remove unused test files --- .../cmd/test/cmd/testdata/convert/job-v1.yaml | 14 ------ .../cmd/test/cmd/testdata/convert/job-v2.json | 46 ------------------- 2 files changed, 60 deletions(-) delete mode 100644 test/extended/testdata/cmd/test/cmd/testdata/convert/job-v1.yaml delete mode 100644 test/extended/testdata/cmd/test/cmd/testdata/convert/job-v2.json diff --git a/test/extended/testdata/cmd/test/cmd/testdata/convert/job-v1.yaml b/test/extended/testdata/cmd/test/cmd/testdata/convert/job-v1.yaml deleted file mode 100644 index 964de82ec5af..000000000000 --- a/test/extended/testdata/cmd/test/cmd/testdata/convert/job-v1.yaml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: batch/v1 -kind: Job -metadata: - name: pi -spec: - template: - metadata: - name: pi - spec: - containers: - - name: pi - image: perl - command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"] - restartPolicy: Never diff --git a/test/extended/testdata/cmd/test/cmd/testdata/convert/job-v2.json b/test/extended/testdata/cmd/test/cmd/testdata/convert/job-v2.json deleted file mode 100644 index f7423a9d1f3a..000000000000 --- a/test/extended/testdata/cmd/test/cmd/testdata/convert/job-v2.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "kind": "CronJob", - "apiVersion": "batch/v2alpha1", - "metadata": { - "name": "hello", - "creationTimestamp": null - }, - "spec": { - "schedule": "0/1 * * * ?", - "concurrencyPolicy": "Allow", - "suspend": false, - "jobTemplate": { - "metadata": { - "creationTimestamp": null - }, - "spec": { - "template": { - "metadata": { - "creationTimestamp": null - }, - "spec": { - "containers": [ - { - "name": "hello", - "image": "busybox", - "args": [ - "/bin/sh", - "-c", - "date; echo Hello from the Kubernetes cluster" - ], - "resources": {}, - "terminationMessagePath": "/dev/termination-log", - "imagePullPolicy": "Always" - } - ], - "restartPolicy": "OnFailure", - "terminationGracePeriodSeconds": 30, - "dnsPolicy": "ClusterFirst", - "securityContext": {} - } - } - } - } - }, - "status": {} -} From e293d3492f3cd3b5c417373f4241db55bed1bd37 Mon Sep 17 00:00:00 2001 From: Maciej Szulik Date: Tue, 20 Apr 2021 14:35:20 +0200 Subject: [PATCH 08/16] Disable networking hostNetwork test --- test/extended/util/annotate/rules.go | 1 + 1 file changed, 1 insertion(+) diff --git a/test/extended/util/annotate/rules.go b/test/extended/util/annotate/rules.go index f8d9a37363e4..30ec69b2342e 100644 --- a/test/extended/util/annotate/rules.go +++ b/test/extended/util/annotate/rules.go @@ -37,6 +37,7 @@ var ( // https://bugzilla.redhat.com/show_bug.cgi?id=1908645 `\[sig-network\] Networking Granular Checks: Services should function for service endpoints using hostNetwork`, + `\[sig-network\] Networking Granular Checks: Services should function for pod-Service\(hostNetwork\)`, // // https://bugzilla.redhat.com/show_bug.cgi?id=1945091 `\[Feature:GenericEphemeralVolume\]`, From 1c2de9888b7b0026e6274974e5ecfeec32ae0093 Mon Sep 17 00:00:00 2001 From: Maciej Szulik Date: Thu, 22 Apr 2021 12:12:28 +0200 Subject: [PATCH 09/16] Disable crictl test --- test/extended/util/annotate/rules.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/extended/util/annotate/rules.go b/test/extended/util/annotate/rules.go index 30ec69b2342e..e67272eb8e83 100644 --- a/test/extended/util/annotate/rules.go +++ b/test/extended/util/annotate/rules.go @@ -39,6 +39,9 @@ var ( `\[sig-network\] Networking Granular Checks: Services should function for service endpoints using hostNetwork`, `\[sig-network\] Networking Granular Checks: Services should function for pod-Service\(hostNetwork\)`, + // https://bugzilla.redhat.com/show_bug.cgi?id=1952457 + `\[sig-node\] crictl should be able to run crictl on the node`, + // // https://bugzilla.redhat.com/show_bug.cgi?id=1945091 `\[Feature:GenericEphemeralVolume\]`, }, From 9956ff541a31cd58599e8f6ec7d9da2c743077b5 Mon Sep 17 00:00:00 2001 From: Maciej Szulik Date: Thu, 22 Apr 2021 12:20:01 +0200 Subject: [PATCH 10/16] Disable firewall rule test --- test/extended/util/annotate/rules.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/extended/util/annotate/rules.go b/test/extended/util/annotate/rules.go index e67272eb8e83..77b345e197de 100644 --- a/test/extended/util/annotate/rules.go +++ b/test/extended/util/annotate/rules.go @@ -39,6 +39,9 @@ var ( `\[sig-network\] Networking Granular Checks: Services should function for service endpoints using hostNetwork`, `\[sig-network\] Networking Granular Checks: Services should function for pod-Service\(hostNetwork\)`, + // https://bugzilla.redhat.com/show_bug.cgi?id=1952460 + `\[sig-network\] Firewall rule control plane should not expose well-known ports`, + // https://bugzilla.redhat.com/show_bug.cgi?id=1952457 `\[sig-node\] crictl should be able to run crictl on the node`, From 76ff11fa1c428e93241256887ab2d9d58e3b81cd Mon Sep 17 00:00:00 2001 From: Maciej Szulik Date: Mon, 26 Apr 2021 10:26:02 +0200 Subject: [PATCH 11/16] Disable Dynamic Provisioning Invalid AWS KMS key test --- test/extended/util/annotate/rules.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test/extended/util/annotate/rules.go b/test/extended/util/annotate/rules.go index 77b345e197de..14defcb81795 100644 --- a/test/extended/util/annotate/rules.go +++ b/test/extended/util/annotate/rules.go @@ -45,8 +45,11 @@ var ( // https://bugzilla.redhat.com/show_bug.cgi?id=1952457 `\[sig-node\] crictl should be able to run crictl on the node`, - // // https://bugzilla.redhat.com/show_bug.cgi?id=1945091 + // https://bugzilla.redhat.com/show_bug.cgi?id=1945091 `\[Feature:GenericEphemeralVolume\]`, + + // https://bugzilla.redhat.com/show_bug.cgi?id=1953478 + `\[sig-storage\] Dynamic Provisioning Invalid AWS KMS key should report an error and create no PV`, }, // tests that may work, but we don't support them "[Disabled:Unsupported]": {}, From 641688c4bcc6f2807d5c3e37596c1e1f7721bcbb Mon Sep 17 00:00:00 2001 From: Maciej Szulik Date: Tue, 4 May 2021 21:49:32 +0200 Subject: [PATCH 12/16] Disable sig-network tests failing on e2e-metal-ipi-ovn-ipv6 --- test/extended/util/annotate/rules.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/extended/util/annotate/rules.go b/test/extended/util/annotate/rules.go index 14defcb81795..e327d76f3f02 100644 --- a/test/extended/util/annotate/rules.go +++ b/test/extended/util/annotate/rules.go @@ -50,6 +50,11 @@ var ( // https://bugzilla.redhat.com/show_bug.cgi?id=1953478 `\[sig-storage\] Dynamic Provisioning Invalid AWS KMS key should report an error and create no PV`, + + // https://bugzilla.redhat.com/show_bug.cgi?id=1956989 + `\[sig-network\] Services should be possible to connect to a service via ExternalIP when the external IP is not assigned to a node`, + `\[sig-network\] Networking IPerf2 \[Feature:Networking-Performance\] should run iperf2`, + `\[sig-network\] HostPort validates that there is no conflict between pods with same hostPort but different hostIP and protocol`, }, // tests that may work, but we don't support them "[Disabled:Unsupported]": {}, From 5618f54811130af7779209158f67730e47617475 Mon Sep 17 00:00:00 2001 From: Maciej Szulik Date: Tue, 4 May 2021 21:50:11 +0200 Subject: [PATCH 13/16] Disable GlusterFS since it's not supported in OCP 4.x --- test/extended/util/annotate/rules.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/extended/util/annotate/rules.go b/test/extended/util/annotate/rules.go index e327d76f3f02..ad3abf307c17 100644 --- a/test/extended/util/annotate/rules.go +++ b/test/extended/util/annotate/rules.go @@ -57,7 +57,9 @@ var ( `\[sig-network\] HostPort validates that there is no conflict between pods with same hostPort but different hostIP and protocol`, }, // tests that may work, but we don't support them - "[Disabled:Unsupported]": {}, + "[Disabled:Unsupported]": { + `Volumes GlusterFS`, // OpenShift 4.x does not support Gluster + }, // tests too slow to be part of conformance "[Slow]": {}, // tests that are known flaky From 1dee4fc70a0ac1a580f291b14ec177c208a8687c Mon Sep 17 00:00:00 2001 From: Maciej Szulik Date: Thu, 6 May 2021 19:48:49 +0200 Subject: [PATCH 14/16] Disable ttlafterfinished job test --- test/extended/util/annotate/rules.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/extended/util/annotate/rules.go b/test/extended/util/annotate/rules.go index ad3abf307c17..f553a2a0b927 100644 --- a/test/extended/util/annotate/rules.go +++ b/test/extended/util/annotate/rules.go @@ -55,6 +55,9 @@ var ( `\[sig-network\] Services should be possible to connect to a service via ExternalIP when the external IP is not assigned to a node`, `\[sig-network\] Networking IPerf2 \[Feature:Networking-Performance\] should run iperf2`, `\[sig-network\] HostPort validates that there is no conflict between pods with same hostPort but different hostIP and protocol`, + + // https://bugzilla.redhat.com/show_bug.cgi?id=1957886 + `\[sig-apps\] \[Feature:TTLAfterFinished\] job should be deleted once it finishes after TTL seconds`, }, // tests that may work, but we don't support them "[Disabled:Unsupported]": { From 84ffe9ec7b6ef762dcbc8e39f141e8dd5a4aa0cd Mon Sep 17 00:00:00 2001 From: Maciej Szulik Date: Thu, 6 May 2021 20:00:36 +0200 Subject: [PATCH 15/16] Disable pull from private registry with secret test --- test/extended/util/annotate/rules.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/extended/util/annotate/rules.go b/test/extended/util/annotate/rules.go index f553a2a0b927..59b2aa4305b9 100644 --- a/test/extended/util/annotate/rules.go +++ b/test/extended/util/annotate/rules.go @@ -58,6 +58,9 @@ var ( // https://bugzilla.redhat.com/show_bug.cgi?id=1957886 `\[sig-apps\] \[Feature:TTLAfterFinished\] job should be deleted once it finishes after TTL seconds`, + + // https://bugzilla.redhat.com/show_bug.cgi?id=1957894 + `\[sig-node\] Container Runtime blackbox test when running a container with a new image should be able to pull from private registry with secret`, }, // tests that may work, but we don't support them "[Disabled:Unsupported]": { From c5fbd2f74d7959e93db5de6f5f640e2a5cf76735 Mon Sep 17 00:00:00 2001 From: Maciej Szulik Date: Fri, 23 Apr 2021 10:40:30 +0200 Subject: [PATCH 16/16] Generated changes --- test/extended/testdata/bindata.go | 136 +- .../generated/zz_generated.annotations.go | 2618 +++++++++-------- test/extended/util/image/zz_generated.txt | 70 +- 3 files changed, 1465 insertions(+), 1359 deletions(-) diff --git a/test/extended/testdata/bindata.go b/test/extended/testdata/bindata.go index 390aef1f2f9a..8d14e8496114 100644 --- a/test/extended/testdata/bindata.go +++ b/test/extended/testdata/bindata.go @@ -221,8 +221,6 @@ // test/extended/testdata/cmd/test/cmd/testdata/application-template-custombuild.json // test/extended/testdata/cmd/test/cmd/testdata/application-template-dockerbuild.json // test/extended/testdata/cmd/test/cmd/testdata/application-template-stibuild.json -// test/extended/testdata/cmd/test/cmd/testdata/convert/job-v1.yaml -// test/extended/testdata/cmd/test/cmd/testdata/convert/job-v2.json // test/extended/testdata/cmd/test/cmd/testdata/external-service.yaml // test/extended/testdata/cmd/test/cmd/testdata/hello-openshift/hello-pod.json // test/extended/testdata/cmd/test/cmd/testdata/idling-dc.yaml @@ -34342,100 +34340,6 @@ func testExtendedTestdataCmdTestCmdTestdataApplicationTemplateStibuildJson() (*a return a, nil } -var _testExtendedTestdataCmdTestCmdTestdataConvertJobV1Yaml = []byte(`apiVersion: batch/v1 -kind: Job -metadata: - name: pi -spec: - template: - metadata: - name: pi - spec: - containers: - - name: pi - image: perl - command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"] - restartPolicy: Never -`) - -func testExtendedTestdataCmdTestCmdTestdataConvertJobV1YamlBytes() ([]byte, error) { - return _testExtendedTestdataCmdTestCmdTestdataConvertJobV1Yaml, nil -} - -func testExtendedTestdataCmdTestCmdTestdataConvertJobV1Yaml() (*asset, error) { - bytes, err := testExtendedTestdataCmdTestCmdTestdataConvertJobV1YamlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "test/extended/testdata/cmd/test/cmd/testdata/convert/job-v1.yaml", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _testExtendedTestdataCmdTestCmdTestdataConvertJobV2Json = []byte(`{ - "kind": "CronJob", - "apiVersion": "batch/v2alpha1", - "metadata": { - "name": "hello", - "creationTimestamp": null - }, - "spec": { - "schedule": "0/1 * * * ?", - "concurrencyPolicy": "Allow", - "suspend": false, - "jobTemplate": { - "metadata": { - "creationTimestamp": null - }, - "spec": { - "template": { - "metadata": { - "creationTimestamp": null - }, - "spec": { - "containers": [ - { - "name": "hello", - "image": "busybox", - "args": [ - "/bin/sh", - "-c", - "date; echo Hello from the Kubernetes cluster" - ], - "resources": {}, - "terminationMessagePath": "/dev/termination-log", - "imagePullPolicy": "Always" - } - ], - "restartPolicy": "OnFailure", - "terminationGracePeriodSeconds": 30, - "dnsPolicy": "ClusterFirst", - "securityContext": {} - } - } - } - } - }, - "status": {} -} -`) - -func testExtendedTestdataCmdTestCmdTestdataConvertJobV2JsonBytes() ([]byte, error) { - return _testExtendedTestdataCmdTestCmdTestdataConvertJobV2Json, nil -} - -func testExtendedTestdataCmdTestCmdTestdataConvertJobV2Json() (*asset, error) { - bytes, err := testExtendedTestdataCmdTestCmdTestdataConvertJobV2JsonBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "test/extended/testdata/cmd/test/cmd/testdata/convert/job-v2.json", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - var _testExtendedTestdataCmdTestCmdTestdataExternalServiceYaml = []byte(`apiVersion: v1 kind: Service metadata: @@ -34486,7 +34390,7 @@ var _testExtendedTestdataCmdTestCmdTestdataHelloOpenshiftHelloPodJson = []byte(` "containers": [ { "name": "hello-openshift", - "image": "k8s.gcr.io/e2e-test-images/agnhost:2.21", + "image": "k8s.gcr.io/e2e-test-images/agnhost:2.30", "args": ["netexec"], "ports": [ { @@ -36047,7 +35951,7 @@ items: run: v1-job spec: containers: - - image: k8s.gcr.io/e2e-test-images/agnhost:2.21 + - image: k8s.gcr.io/e2e-test-images/agnhost:2.30 name: hello-container restartPolicy: Never @@ -38690,7 +38594,7 @@ items: spec: containers: - name: hello-openshift - image: k8s.gcr.io/e2e-test-images/agnhost:2.21 + image: k8s.gcr.io/e2e-test-images/agnhost:2.30 - kind: Route apiVersion: v1 metadata: @@ -49041,7 +48945,7 @@ items: terminationGracePeriodSeconds: 1 containers: - name: test - image: k8s.gcr.io/e2e-test-images/agnhost:2.21 + image: k8s.gcr.io/e2e-test-images/agnhost:2.30 args: ["netexec"] ports: - containerPort: 8080 @@ -49059,7 +48963,7 @@ items: terminationGracePeriodSeconds: 1 containers: - name: test - image: k8s.gcr.io/e2e-test-images/agnhost:2.21 + image: k8s.gcr.io/e2e-test-images/agnhost:2.30 args: ["netexec"] ports: - containerPort: 8080 @@ -49094,7 +48998,7 @@ items: app: serving-cert spec: containers: - - image: docker.io/library/nginx:1.15-alpine + - image: k8s.gcr.io/e2e-test-images/nginx:1.15-1 name: serve command: - /usr/sbin/nginx @@ -49292,7 +49196,7 @@ objects: terminationGracePeriodSeconds: 1 containers: - name: test - image: k8s.gcr.io/e2e-test-images/agnhost:2.21 + image: k8s.gcr.io/e2e-test-images/agnhost:2.30 args: ["netexec"] ports: - containerPort: 8080 @@ -49454,7 +49358,7 @@ objects: terminationGracePeriodSeconds: 1 containers: - name: test - image: k8s.gcr.io/e2e-test-images/agnhost:2.21 + image: k8s.gcr.io/e2e-test-images/agnhost:2.30 args: ["netexec"] ports: - containerPort: 8080 @@ -49469,7 +49373,7 @@ objects: app: secure-endpoint spec: containers: - - image: docker.io/library/nginx:1.15-alpine + - image: k8s.gcr.io/e2e-test-images/nginx:1.15-1 name: serve command: - /usr/sbin/nginx @@ -50483,7 +50387,7 @@ items: terminationGracePeriodSeconds: 1 containers: - name: test - image: k8s.gcr.io/e2e-test-images/agnhost:2.21 + image: k8s.gcr.io/e2e-test-images/agnhost:2.30 args: ["netexec"] ports: - containerPort: 8080 @@ -50501,7 +50405,7 @@ items: terminationGracePeriodSeconds: 1 containers: - name: test - image: k8s.gcr.io/e2e-test-images/agnhost:2.21 + image: k8s.gcr.io/e2e-test-images/agnhost:2.30 args: ["netexec"] ports: - containerPort: 8080 @@ -50884,7 +50788,7 @@ objects: terminationGracePeriodSeconds: 1 containers: - name: test - image: k8s.gcr.io/e2e-test-images/agnhost:2.21 + image: k8s.gcr.io/e2e-test-images/agnhost:2.30 args: ["netexec"] ports: - containerPort: 8080 @@ -50902,7 +50806,7 @@ objects: terminationGracePeriodSeconds: 1 containers: - name: test - image: k8s.gcr.io/e2e-test-images/agnhost:2.21 + image: k8s.gcr.io/e2e-test-images/agnhost:2.30 args: ["netexec"] ports: - containerPort: 8080 @@ -50920,7 +50824,7 @@ objects: terminationGracePeriodSeconds: 1 containers: - name: test - image: k8s.gcr.io/e2e-test-images/agnhost:2.21 + image: k8s.gcr.io/e2e-test-images/agnhost:2.30 args: ["netexec"] ports: - containerPort: 8080 @@ -52316,7 +52220,7 @@ items: spec: containers: - name: hello-openshift - image: k8s.gcr.io/e2e-test-images/agnhost:2.21 + image: k8s.gcr.io/e2e-test-images/agnhost:2.30 `) func testExtendedTestdataTemplatesTemplateinstance_badobjectYamlBytes() ([]byte, error) { @@ -52376,7 +52280,7 @@ items: spec: containers: - name: hello-openshift - image: k8s.gcr.io/e2e-test-images/agnhost:2.21 + image: k8s.gcr.io/e2e-test-images/agnhost:2.30 - kind: Route apiVersion: v1 metadata: @@ -53590,8 +53494,6 @@ var _bindata = map[string]func() (*asset, error){ "test/extended/testdata/cmd/test/cmd/testdata/application-template-custombuild.json": testExtendedTestdataCmdTestCmdTestdataApplicationTemplateCustombuildJson, "test/extended/testdata/cmd/test/cmd/testdata/application-template-dockerbuild.json": testExtendedTestdataCmdTestCmdTestdataApplicationTemplateDockerbuildJson, "test/extended/testdata/cmd/test/cmd/testdata/application-template-stibuild.json": testExtendedTestdataCmdTestCmdTestdataApplicationTemplateStibuildJson, - "test/extended/testdata/cmd/test/cmd/testdata/convert/job-v1.yaml": testExtendedTestdataCmdTestCmdTestdataConvertJobV1Yaml, - "test/extended/testdata/cmd/test/cmd/testdata/convert/job-v2.json": testExtendedTestdataCmdTestCmdTestdataConvertJobV2Json, "test/extended/testdata/cmd/test/cmd/testdata/external-service.yaml": testExtendedTestdataCmdTestCmdTestdataExternalServiceYaml, "test/extended/testdata/cmd/test/cmd/testdata/hello-openshift/hello-pod.json": testExtendedTestdataCmdTestCmdTestdataHelloOpenshiftHelloPodJson, "test/extended/testdata/cmd/test/cmd/testdata/idling-dc.yaml": testExtendedTestdataCmdTestCmdTestdataIdlingDcYaml, @@ -54242,11 +54144,7 @@ var _bintree = &bintree{nil, map[string]*bintree{ "application-template-custombuild.json": {testExtendedTestdataCmdTestCmdTestdataApplicationTemplateCustombuildJson, map[string]*bintree{}}, "application-template-dockerbuild.json": {testExtendedTestdataCmdTestCmdTestdataApplicationTemplateDockerbuildJson, map[string]*bintree{}}, "application-template-stibuild.json": {testExtendedTestdataCmdTestCmdTestdataApplicationTemplateStibuildJson, map[string]*bintree{}}, - "convert": {nil, map[string]*bintree{ - "job-v1.yaml": {testExtendedTestdataCmdTestCmdTestdataConvertJobV1Yaml, map[string]*bintree{}}, - "job-v2.json": {testExtendedTestdataCmdTestCmdTestdataConvertJobV2Json, map[string]*bintree{}}, - }}, - "external-service.yaml": {testExtendedTestdataCmdTestCmdTestdataExternalServiceYaml, map[string]*bintree{}}, + "external-service.yaml": {testExtendedTestdataCmdTestCmdTestdataExternalServiceYaml, map[string]*bintree{}}, "hello-openshift": {nil, map[string]*bintree{ "hello-pod.json": {testExtendedTestdataCmdTestCmdTestdataHelloOpenshiftHelloPodJson, map[string]*bintree{}}, }}, diff --git a/test/extended/util/annotate/generated/zz_generated.annotations.go b/test/extended/util/annotate/generated/zz_generated.annotations.go index 95ceaee468b0..c8902c2268ce 100644 --- a/test/extended/util/annotate/generated/zz_generated.annotations.go +++ b/test/extended/util/annotate/generated/zz_generated.annotations.go @@ -7,8 +7,6 @@ import ( ) var annotations = map[string]string{ - "[Top Level] Recreate [Feature:Recreate] recreate nodes and ensure they function upon restart": "recreate nodes and ensure they function upon restart [Disabled:Broken] [sig-cluster-lifecycle] [Suite:k8s]", - "[Top Level] [Conformance][sig-api-machinery][Feature:APIServer] local kubeconfig \"lb-ext.kubeconfig\" should be present on all masters and work": "\"lb-ext.kubeconfig\" should be present on all masters and work [Suite:openshift/conformance/parallel/minimal]", "[Top Level] [Conformance][sig-api-machinery][Feature:APIServer] local kubeconfig \"lb-int.kubeconfig\" should be present on all masters and work": "\"lb-int.kubeconfig\" should be present on all masters and work [Suite:openshift/conformance/parallel/minimal]", @@ -45,285 +43,9 @@ var annotations = map[string]string{ "[Top Level] [Serial][sig-node][Feature:TopologyManager] Configured cluster with gu workload should guarantee NUMA-aligned cpu cores in gu pods with single pod, single container requesting 4 cores, 1 device": "with single pod, single container requesting 4 cores, 1 device [Suite:openshift/conformance/serial]", - "[Top Level] [k8s.io] Cluster size autoscaler scalability [Slow] CA ignores unschedulable pods while scheduling schedulable pods [Feature:ClusterAutoscalerScalability6]": "CA ignores unschedulable pods while scheduling schedulable pods [Feature:ClusterAutoscalerScalability6] [sig-cluster-lifecycle] [Suite:k8s]", - - "[Top Level] [k8s.io] Cluster size autoscaler scalability [Slow] should scale down empty nodes [Feature:ClusterAutoscalerScalability3]": "should scale down empty nodes [Feature:ClusterAutoscalerScalability3] [sig-cluster-lifecycle] [Suite:k8s]", - - "[Top Level] [k8s.io] Cluster size autoscaler scalability [Slow] should scale down underutilized nodes [Feature:ClusterAutoscalerScalability4]": "should scale down underutilized nodes [Feature:ClusterAutoscalerScalability4] [sig-cluster-lifecycle] [Suite:k8s]", - - "[Top Level] [k8s.io] Cluster size autoscaler scalability [Slow] should scale up at all [Feature:ClusterAutoscalerScalability1]": "should scale up at all [Feature:ClusterAutoscalerScalability1] [sig-cluster-lifecycle] [Suite:k8s]", - - "[Top Level] [k8s.io] Cluster size autoscaler scalability [Slow] should scale up twice [Feature:ClusterAutoscalerScalability2]": "should scale up twice [Feature:ClusterAutoscalerScalability2] [sig-cluster-lifecycle] [Suite:k8s]", - - "[Top Level] [k8s.io] Cluster size autoscaler scalability [Slow] shouldn't scale down with underutilized nodes due to host port conflicts [Feature:ClusterAutoscalerScalability5]": "shouldn't scale down with underutilized nodes due to host port conflicts [Feature:ClusterAutoscalerScalability5] [sig-cluster-lifecycle] [Suite:k8s]", - - "[Top Level] [k8s.io] Container Lifecycle Hook when create a pod with lifecycle hook should execute poststart exec hook properly [NodeConformance] [Conformance]": "should execute poststart exec hook properly [NodeConformance] [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] Container Lifecycle Hook when create a pod with lifecycle hook should execute poststart http hook properly [NodeConformance] [Conformance]": "should execute poststart http hook properly [NodeConformance] [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] Container Lifecycle Hook when create a pod with lifecycle hook should execute prestop exec hook properly [NodeConformance] [Conformance]": "should execute prestop exec hook properly [NodeConformance] [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] Container Lifecycle Hook when create a pod with lifecycle hook should execute prestop http hook properly [NodeConformance] [Conformance]": "should execute prestop http hook properly [NodeConformance] [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] Container Runtime blackbox test on terminated container should report termination message [LinuxOnly] as empty when pod succeeds and TerminationMessagePolicy FallbackToLogsOnError is set [NodeConformance] [Conformance]": "should report termination message [LinuxOnly] as empty when pod succeeds and TerminationMessagePolicy FallbackToLogsOnError is set [NodeConformance] [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] Container Runtime blackbox test on terminated container should report termination message [LinuxOnly] from file when pod succeeds and TerminationMessagePolicy FallbackToLogsOnError is set [NodeConformance] [Conformance]": "should report termination message [LinuxOnly] from file when pod succeeds and TerminationMessagePolicy FallbackToLogsOnError is set [NodeConformance] [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] Container Runtime blackbox test on terminated container should report termination message [LinuxOnly] from log output if TerminationMessagePolicy FallbackToLogsOnError is set [NodeConformance] [Conformance]": "should report termination message [LinuxOnly] from log output if TerminationMessagePolicy FallbackToLogsOnError is set [NodeConformance] [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] Container Runtime blackbox test on terminated container should report termination message [LinuxOnly] if TerminationMessagePath is set [NodeConformance]": "should report termination message [LinuxOnly] if TerminationMessagePath is set [NodeConformance] [sig-node] [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] Container Runtime blackbox test on terminated container should report termination message [LinuxOnly] if TerminationMessagePath is set as non-root user and at a non-default path [NodeConformance] [Conformance]": "should report termination message [LinuxOnly] if TerminationMessagePath is set as non-root user and at a non-default path [NodeConformance] [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] Container Runtime blackbox test when running a container with a new image should be able to pull from private registry with secret [NodeConformance]": "should be able to pull from private registry with secret [NodeConformance] [sig-node] [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] Container Runtime blackbox test when running a container with a new image should be able to pull image [NodeConformance]": "should be able to pull image [NodeConformance] [sig-node] [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] Container Runtime blackbox test when running a container with a new image should not be able to pull from private registry without secret [NodeConformance]": "should not be able to pull from private registry without secret [NodeConformance] [sig-node] [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] Container Runtime blackbox test when running a container with a new image should not be able to pull image from invalid registry [NodeConformance]": "should not be able to pull image from invalid registry [NodeConformance] [sig-node] [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] Container Runtime blackbox test when starting a container that exits should run with the expected status [NodeConformance] [Conformance]": "should run with the expected status [NodeConformance] [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] Docker Containers should be able to override the image's default arguments (docker cmd) [NodeConformance] [Conformance]": "should be able to override the image's default arguments (docker cmd) [NodeConformance] [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] Docker Containers should be able to override the image's default command (docker entrypoint) [NodeConformance] [Conformance]": "should be able to override the image's default command (docker entrypoint) [NodeConformance] [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] Docker Containers should be able to override the image's default command and arguments [NodeConformance] [Conformance]": "should be able to override the image's default command and arguments [NodeConformance] [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] Docker Containers should use the image defaults if command and args are blank [NodeConformance] [Conformance]": "should use the image defaults if command and args are blank [NodeConformance] [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] Downward API [Serial] [Disruptive] [NodeFeature:EphemeralStorage] Downward API tests for local ephemeral storage should provide container's limits.ephemeral-storage and requests.ephemeral-storage as env vars": "should provide container's limits.ephemeral-storage and requests.ephemeral-storage as env vars [sig-node] [Suite:k8s]", - - "[Top Level] [k8s.io] Downward API [Serial] [Disruptive] [NodeFeature:EphemeralStorage] Downward API tests for local ephemeral storage should provide default limits.ephemeral-storage from node allocatable": "should provide default limits.ephemeral-storage from node allocatable [sig-node] [Suite:k8s]", - - "[Top Level] [k8s.io] GKE local SSD [Feature:GKELocalSSD] should write and read from node local SSD [Feature:GKELocalSSD]": "should write and read from node local SSD [Feature:GKELocalSSD] [sig-arch] [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] GKE node pools [Feature:GKENodePool] should create a cluster with multiple node pools [Feature:GKENodePool]": "should create a cluster with multiple node pools [Feature:GKENodePool] [sig-arch] [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] InitContainer [NodeConformance] should invoke init containers on a RestartAlways pod [Conformance]": "should invoke init containers on a RestartAlways pod [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] InitContainer [NodeConformance] should invoke init containers on a RestartNever pod [Conformance]": "should invoke init containers on a RestartNever pod [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] InitContainer [NodeConformance] should not start app containers and fail the pod if init containers fail on a RestartNever pod [Conformance]": "should not start app containers and fail the pod if init containers fail on a RestartNever pod [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] InitContainer [NodeConformance] should not start app containers if init containers fail on a RestartAlways pod [Conformance]": "should not start app containers if init containers fail on a RestartAlways pod [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] Kubelet when scheduling a busybox Pod with hostAliases should write entries to /etc/hosts [LinuxOnly] [NodeConformance] [Conformance]": "should write entries to /etc/hosts [LinuxOnly] [NodeConformance] [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] Kubelet when scheduling a busybox command in a pod should print the output to logs [NodeConformance] [Conformance]": "should print the output to logs [NodeConformance] [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] Kubelet when scheduling a busybox command that always fails in a pod should be possible to delete [NodeConformance] [Conformance]": "should be possible to delete [NodeConformance] [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] Kubelet when scheduling a busybox command that always fails in a pod should have an terminated reason [NodeConformance] [Conformance]": "should have an terminated reason [NodeConformance] [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] Kubelet when scheduling a read only busybox container should not write to root filesystem [LinuxOnly] [NodeConformance] [Conformance]": "should not write to root filesystem [LinuxOnly] [NodeConformance] [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] KubeletManagedEtcHosts should test kubelet managed /etc/hosts file [LinuxOnly] [NodeConformance] [Conformance]": "should test kubelet managed /etc/hosts file [LinuxOnly] [NodeConformance] [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] Lease lease API should be available [Conformance]": "lease API should be available [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] NodeLease when the NodeLease feature is enabled should have OwnerReferences set": "should have OwnerReferences set [sig-node] [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] NodeLease when the NodeLease feature is enabled the kubelet should create and update a lease in the kube-node-lease namespace": "the kubelet should create and update a lease in the kube-node-lease namespace [sig-node] [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] NodeLease when the NodeLease feature is enabled the kubelet should report node status infrequently": "the kubelet should report node status infrequently [sig-node] [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] Pods should allow activeDeadlineSeconds to be updated [NodeConformance] [Conformance]": "should allow activeDeadlineSeconds to be updated [NodeConformance] [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] Pods should be submitted and removed [NodeConformance] [Conformance]": "should be submitted and removed [NodeConformance] [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] Pods should be updated [NodeConformance] [Conformance]": "should be updated [NodeConformance] [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] Pods should cap back-off at MaxContainerBackOff [Slow][NodeConformance]": "should cap back-off at MaxContainerBackOff [Slow][NodeConformance] [sig-node] [Suite:k8s]", - - "[Top Level] [k8s.io] Pods should contain environment variables for services [NodeConformance] [Conformance]": "should contain environment variables for services [NodeConformance] [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] Pods should delete a collection of pods [Conformance]": "should delete a collection of pods [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] Pods should get a host IP [NodeConformance] [Conformance]": "should get a host IP [NodeConformance] [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] Pods should have their auto-restart back-off timer reset on image update [Slow][NodeConformance]": "should have their auto-restart back-off timer reset on image update [Slow][NodeConformance] [sig-node] [Suite:k8s]", - - "[Top Level] [k8s.io] Pods should run through the lifecycle of Pods and PodStatus [Conformance]": "should run through the lifecycle of Pods and PodStatus [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] Pods should support pod readiness gates [NodeFeature:PodReadinessGate]": "should support pod readiness gates [NodeFeature:PodReadinessGate] [sig-node] [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] Pods should support remote command execution over websockets [NodeConformance] [Conformance]": "should support remote command execution over websockets [NodeConformance] [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] Pods should support retrieving logs from the container over websockets [NodeConformance] [Conformance]": "should support retrieving logs from the container over websockets [NodeConformance] [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] PrivilegedPod [NodeConformance] should enable privileged commands [LinuxOnly]": "should enable privileged commands [LinuxOnly] [sig-node] [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] Probing container should *not* be restarted by liveness probe because startup probe delays it": "should *not* be restarted by liveness probe because startup probe delays it [sig-node] [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] Probing container should *not* be restarted with a /healthz http liveness probe [NodeConformance] [Conformance]": "should *not* be restarted with a /healthz http liveness probe [NodeConformance] [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] Probing container should *not* be restarted with a exec \"cat /tmp/health\" liveness probe [NodeConformance] [Conformance]": "should *not* be restarted with a exec \"cat /tmp/health\" liveness probe [NodeConformance] [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] Probing container should *not* be restarted with a non-local redirect http liveness probe": "should *not* be restarted with a non-local redirect http liveness probe [sig-node] [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] Probing container should *not* be restarted with a tcp:8080 liveness probe [NodeConformance] [Conformance]": "should *not* be restarted with a tcp:8080 liveness probe [NodeConformance] [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] Probing container should be restarted by liveness probe after startup probe enables it": "should be restarted by liveness probe after startup probe enables it [sig-node] [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] Probing container should be restarted startup probe fails": "should be restarted startup probe fails [sig-node] [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] Probing container should be restarted with a /healthz http liveness probe [NodeConformance] [Conformance]": "should be restarted with a /healthz http liveness probe [NodeConformance] [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] Probing container should be restarted with a docker exec liveness probe with timeout ": "should be restarted with a docker exec liveness probe with timeout [sig-node] [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] Probing container should be restarted with a exec \"cat /tmp/health\" liveness probe [NodeConformance] [Conformance]": "should be restarted with a exec \"cat /tmp/health\" liveness probe [NodeConformance] [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] Probing container should be restarted with a local redirect http liveness probe": "should be restarted with a local redirect http liveness probe [sig-node] [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] Probing container should have monotonically increasing restart count [NodeConformance] [Conformance]": "should have monotonically increasing restart count [NodeConformance] [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] Probing container should not be ready until startupProbe succeeds": "should not be ready until startupProbe succeeds [sig-node] [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] Probing container should not be ready with a docker exec readiness probe timeout ": "should not be ready with a docker exec readiness probe timeout [sig-node] [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] Probing container with readiness probe should not be ready before initial delay and never restart [NodeConformance] [Conformance]": "with readiness probe should not be ready before initial delay and never restart [NodeConformance] [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] Probing container with readiness probe that fails should never be ready and never restart [NodeConformance] [Conformance]": "with readiness probe that fails should never be ready and never restart [NodeConformance] [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] Security Context When creating a container with runAsNonRoot should not run with an explicit root user ID [LinuxOnly]": "should not run with an explicit root user ID [LinuxOnly] [sig-node] [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] Security Context When creating a container with runAsNonRoot should not run without a specified user ID": "should not run without a specified user ID [sig-node] [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] Security Context When creating a container with runAsNonRoot should run with an explicit non-root user ID [LinuxOnly]": "should run with an explicit non-root user ID [LinuxOnly] [sig-node] [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] Security Context When creating a container with runAsNonRoot should run with an image specified user ID": "should run with an image specified user ID [sig-node] [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] Security Context When creating a container with runAsUser should run the container with uid 0 [LinuxOnly] [NodeConformance]": "should run the container with uid 0 [LinuxOnly] [NodeConformance] [sig-node] [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] Security Context When creating a container with runAsUser should run the container with uid 65534 [LinuxOnly] [NodeConformance] [Conformance]": "should run the container with uid 65534 [LinuxOnly] [NodeConformance] [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] Security Context When creating a pod with privileged should run the container as privileged when true [LinuxOnly] [NodeFeature:HostAccess]": "should run the container as privileged when true [LinuxOnly] [NodeFeature:HostAccess] [sig-node] [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] Security Context When creating a pod with privileged should run the container as unprivileged when false [LinuxOnly] [NodeConformance] [Conformance]": "should run the container as unprivileged when false [LinuxOnly] [NodeConformance] [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] Security Context When creating a pod with readOnlyRootFilesystem should run the container with readonly rootfs when readOnlyRootFilesystem=true [LinuxOnly] [NodeConformance]": "should run the container with readonly rootfs when readOnlyRootFilesystem=true [LinuxOnly] [NodeConformance] [sig-node] [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] Security Context When creating a pod with readOnlyRootFilesystem should run the container with writable rootfs when readOnlyRootFilesystem=false [NodeConformance] [Conformance]": "should run the container with writable rootfs when readOnlyRootFilesystem=false [NodeConformance] [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] Security Context when creating containers with AllowPrivilegeEscalation should allow privilege escalation when not explicitly set and uid != 0 [LinuxOnly] [NodeConformance]": "should allow privilege escalation when not explicitly set and uid != 0 [LinuxOnly] [NodeConformance] [sig-node] [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] Security Context when creating containers with AllowPrivilegeEscalation should allow privilege escalation when true [LinuxOnly] [NodeConformance]": "should allow privilege escalation when true [LinuxOnly] [NodeConformance] [sig-node] [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] Security Context when creating containers with AllowPrivilegeEscalation should not allow privilege escalation when false [LinuxOnly] [NodeConformance] [Conformance]": "should not allow privilege escalation when false [LinuxOnly] [NodeConformance] [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] Sysctls [LinuxOnly] [NodeFeature:Sysctls] should not launch unsafe, but not explicitly enabled sysctls on the node": "should not launch unsafe, but not explicitly enabled sysctls on the node [Disabled:Broken] [sig-node] [Suite:k8s]", - - "[Top Level] [k8s.io] Sysctls [LinuxOnly] [NodeFeature:Sysctls] should reject invalid sysctls": "should reject invalid sysctls [Disabled:Broken] [sig-node] [Suite:k8s]", - - "[Top Level] [k8s.io] Sysctls [LinuxOnly] [NodeFeature:Sysctls] should support sysctls": "should support sysctls [Disabled:Broken] [sig-node] [Suite:k8s]", - - "[Top Level] [k8s.io] Sysctls [LinuxOnly] [NodeFeature:Sysctls] should support unsafe sysctls which are actually whitelisted": "should support unsafe sysctls which are actually whitelisted [Disabled:Broken] [sig-node] [Suite:k8s]", - - "[Top Level] [k8s.io] Variable Expansion should allow composing env vars into new env vars [NodeConformance] [Conformance]": "should allow composing env vars into new env vars [NodeConformance] [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] Variable Expansion should allow substituting values in a container's args [NodeConformance] [Conformance]": "should allow substituting values in a container's args [NodeConformance] [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] Variable Expansion should allow substituting values in a container's command [NodeConformance] [Conformance]": "should allow substituting values in a container's command [NodeConformance] [Conformance] [sig-node] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] Variable Expansion should allow substituting values in a volume subpath [sig-storage] [Conformance]": "should allow substituting values in a volume subpath [sig-storage] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] Variable Expansion should fail substituting values in a volume subpath with absolute path [sig-storage][Slow] [Conformance]": "should fail substituting values in a volume subpath with absolute path [sig-storage][Slow] [Conformance] [Suite:k8s]", - - "[Top Level] [k8s.io] Variable Expansion should fail substituting values in a volume subpath with backticks [sig-storage][Slow] [Conformance]": "should fail substituting values in a volume subpath with backticks [sig-storage][Slow] [Conformance] [Suite:k8s]", - - "[Top Level] [k8s.io] Variable Expansion should succeed in writing subpaths in container [sig-storage][Slow] [Conformance]": "should succeed in writing subpaths in container [sig-storage][Slow] [Conformance] [Suite:k8s]", - - "[Top Level] [k8s.io] Variable Expansion should verify that a failing subpath expansion can be modified during the lifecycle of a container [sig-storage][Slow] [Conformance]": "should verify that a failing subpath expansion can be modified during the lifecycle of a container [sig-storage][Slow] [Conformance] [Suite:k8s]", - - "[Top Level] [k8s.io] [Feature:Example] [k8s.io] Downward API should create a pod that prints his name and namespace": "should create a pod that prints his name and namespace [sig-node] [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] [Feature:Example] [k8s.io] Liveness liveness pods should be automatically restarted": "liveness pods should be automatically restarted [sig-node] [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] [Feature:Example] [k8s.io] Secret should create a pod that reads a secret": "should create a pod that reads a secret [sig-node] [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] [Feature:TTLAfterFinished][NodeAlphaFeature:TTLAfterFinished] job should be deleted once it finishes after TTL seconds": "job should be deleted once it finishes after TTL seconds [Disabled:Alpha] [sig-node] [Suite:k8s]", - - "[Top Level] [k8s.io] [sig-node] AppArmor load AppArmor profiles can disable an AppArmor profile, using unconfined": "can disable an AppArmor profile, using unconfined [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] [sig-node] AppArmor load AppArmor profiles should enforce an AppArmor profile": "should enforce an AppArmor profile [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] [sig-node] Events should be sent by kubelets and the scheduler about pods scheduling and running [Conformance]": "should be sent by kubelets and the scheduler about pods scheduling and running [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] [sig-node] Kubelet [Serial] [Slow] [k8s.io] [sig-node] experimental resource usage tracking [Feature:ExperimentalResourceUsageTracking] resource tracking for 100 pods per node": "resource tracking for 100 pods per node [Suite:k8s]", - - "[Top Level] [k8s.io] [sig-node] Kubelet [Serial] [Slow] [k8s.io] [sig-node] regular resource usage tracking [Feature:RegularResourceUsageTracking] resource tracking for 0 pods per node": "resource tracking for 0 pods per node [Suite:k8s]", + "[Top Level] [sig-api-machinery] API data in etcd should be stored at the correct location and version for all resources [Serial]": "should be stored at the correct location and version for all resources [Serial] [Suite:openshift/conformance/serial]", - "[Top Level] [k8s.io] [sig-node] Kubelet [Serial] [Slow] [k8s.io] [sig-node] regular resource usage tracking [Feature:RegularResourceUsageTracking] resource tracking for 100 pods per node": "resource tracking for 100 pods per node [Suite:k8s]", - - "[Top Level] [k8s.io] [sig-node] Mount propagation should propagate mounts to the host": "should propagate mounts to the host [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] [sig-node] NoExecuteTaintManager Multiple Pods [Serial] evicts pods with minTolerationSeconds [Disruptive] [Conformance]": "evicts pods with minTolerationSeconds [Disruptive] [Conformance] [Suite:k8s]", - - "[Top Level] [k8s.io] [sig-node] NoExecuteTaintManager Multiple Pods [Serial] only evicts pods without tolerations from tainted nodes": "only evicts pods without tolerations from tainted nodes [Suite:openshift/conformance/serial] [Suite:k8s]", - - "[Top Level] [k8s.io] [sig-node] NoExecuteTaintManager Single Pod [Serial] doesn't evict pod with tolerations from tainted nodes": "doesn't evict pod with tolerations from tainted nodes [Suite:openshift/conformance/serial] [Suite:k8s]", - - "[Top Level] [k8s.io] [sig-node] NoExecuteTaintManager Single Pod [Serial] eventually evict pod with finite tolerations from tainted nodes": "eventually evict pod with finite tolerations from tainted nodes [Suite:openshift/conformance/serial] [Suite:k8s]", - - "[Top Level] [k8s.io] [sig-node] NoExecuteTaintManager Single Pod [Serial] evicts pods from tainted nodes": "evicts pods from tainted nodes [Suite:openshift/conformance/serial] [Suite:k8s]", - - "[Top Level] [k8s.io] [sig-node] NoExecuteTaintManager Single Pod [Serial] removing taint cancels eviction [Disruptive] [Conformance]": "removing taint cancels eviction [Disruptive] [Conformance] [Suite:k8s]", - - "[Top Level] [k8s.io] [sig-node] NodeProblemDetector [DisabledForLargeClusters] should run without error": "should run without error [Disabled:SpecialConfig] [Suite:k8s]", - - "[Top Level] [k8s.io] [sig-node] Pod garbage collector [Feature:PodGarbageCollector] [Slow] should handle the creation of 1000 pods": "should handle the creation of 1000 pods [Suite:k8s]", - - "[Top Level] [k8s.io] [sig-node] Pods Extended [k8s.io] Delete Grace Period should be submitted and removed": "should be submitted and removed [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] [sig-node] Pods Extended [k8s.io] Pod Container Status should never report success for a pending container": "should never report success for a pending container [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] [sig-node] Pods Extended [k8s.io] Pod Container lifecycle should not create extra sandbox if all containers are done": "should not create extra sandbox if all containers are done [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] [sig-node] Pods Extended [k8s.io] Pods Set QOS Class should be set on Pods with matching resource requests and limits for memory and cpu [Conformance]": "should be set on Pods with matching resource requests and limits for memory and cpu [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] [sig-node] PreStop graceful pod terminated should wait until preStop hook completes the process": "graceful pod terminated should wait until preStop hook completes the process [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] [sig-node] PreStop should call prestop when killing a pod [Conformance]": "should call prestop when killing a pod [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [k8s.io] [sig-node] SSH should SSH to all nodes and run commands": "should SSH to all nodes and run commands [Disabled:Broken] [Suite:k8s]", - - "[Top Level] [k8s.io] [sig-node] Security Context should support container.SecurityContext.RunAsUser And container.SecurityContext.RunAsGroup [LinuxOnly]": "should support container.SecurityContext.RunAsUser And container.SecurityContext.RunAsGroup [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] [sig-node] Security Context should support container.SecurityContext.RunAsUser [LinuxOnly]": "should support container.SecurityContext.RunAsUser [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] [sig-node] Security Context should support pod.Spec.SecurityContext.RunAsUser And pod.Spec.SecurityContext.RunAsGroup [LinuxOnly]": "should support pod.Spec.SecurityContext.RunAsUser And pod.Spec.SecurityContext.RunAsGroup [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] [sig-node] Security Context should support pod.Spec.SecurityContext.RunAsUser [LinuxOnly]": "should support pod.Spec.SecurityContext.RunAsUser [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] [sig-node] Security Context should support pod.Spec.SecurityContext.SupplementalGroups [LinuxOnly]": "should support pod.Spec.SecurityContext.SupplementalGroups [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] [sig-node] Security Context should support seccomp default which is unconfined [LinuxOnly]": "should support seccomp default which is unconfined [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] [sig-node] Security Context should support seccomp runtime/default [LinuxOnly]": "should support seccomp runtime/default [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] [sig-node] Security Context should support seccomp unconfined on the container [LinuxOnly]": "should support seccomp unconfined on the container [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] [sig-node] Security Context should support seccomp unconfined on the pod [LinuxOnly]": "should support seccomp unconfined on the pod [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] [sig-node] Security Context should support volume SELinux relabeling [Flaky] [LinuxOnly]": "should support volume SELinux relabeling [Flaky] [LinuxOnly] [Suite:k8s]", - - "[Top Level] [k8s.io] [sig-node] Security Context should support volume SELinux relabeling when using hostIPC [Flaky] [LinuxOnly]": "should support volume SELinux relabeling when using hostIPC [Flaky] [LinuxOnly] [Suite:k8s]", - - "[Top Level] [k8s.io] [sig-node] Security Context should support volume SELinux relabeling when using hostPID [Flaky] [LinuxOnly]": "should support volume SELinux relabeling when using hostPID [Flaky] [LinuxOnly] [Suite:k8s]", - - "[Top Level] [k8s.io] [sig-node] crictl should be able to run crictl on the node": "should be able to run crictl on the node [Skipped:gce] [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [k8s.io] [sig-node] kubelet [k8s.io] [sig-node] Clean up pods on node kubelet should be able to delete 10 pods per node in 1m0s.": "kubelet should be able to delete 10 pods per node in 1m0s. [Serial] [Suite:openshift/conformance/serial] [Suite:k8s]", - - "[Top Level] [k8s.io] [sig-node] kubelet [k8s.io] [sig-node] host cleanup with volume mounts [sig-storage][HostCleanup][Flaky] Host cleanup after disrupting NFS volume [NFS] after stopping the nfs-server and deleting the (active) client pod, the NFS mount and the pod's UID directory should be removed.": "after stopping the nfs-server and deleting the (active) client pod, the NFS mount and the pod's UID directory should be removed. [Suite:k8s]", - - "[Top Level] [k8s.io] [sig-node] kubelet [k8s.io] [sig-node] host cleanup with volume mounts [sig-storage][HostCleanup][Flaky] Host cleanup after disrupting NFS volume [NFS] after stopping the nfs-server and deleting the (sleeping) client pod, the NFS mount and the pod's UID directory should be removed.": "after stopping the nfs-server and deleting the (sleeping) client pod, the NFS mount and the pod's UID directory should be removed. [Suite:k8s]", - - "[Top Level] [sig-api-machinery] API data in etcd should be stored at the correct location and version for all resources [Serial]": "should be stored at the correct location and version for all resources [Serial] [Disabled:Broken]", - - "[Top Level] [sig-api-machinery] API priority and fairness should ensure that requests can be classified by testing flow-schemas/priority-levels": "should ensure that requests can be classified by testing flow-schemas/priority-levels [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-api-machinery] API priority and fairness should ensure that requests can be classified by adding FlowSchema and PriorityLevelConfiguration": "should ensure that requests can be classified by adding FlowSchema and PriorityLevelConfiguration [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-api-machinery] API priority and fairness should ensure that requests can't be drowned out (fairness)": "should ensure that requests can't be drowned out (fairness) [Suite:openshift/conformance/parallel] [Suite:k8s]", @@ -411,10 +133,6 @@ var annotations = map[string]string{ "[Top Level] [sig-api-machinery] Etcd failure [Disruptive] should recover from network partition with master": "should recover from network partition with master [Serial] [Suite:k8s]", - "[Top Level] [sig-api-machinery] Events should delete a collection of events [Conformance]": "should delete a collection of events [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - - "[Top Level] [sig-api-machinery] Events should ensure that an event can be fetched, patched, deleted, and listed [Conformance]": "should ensure that an event can be fetched, patched, deleted, and listed [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - "[Top Level] [sig-api-machinery] Garbage collector should delete RS created by deployment when not orphaning [Conformance]": "should delete RS created by deployment when not orphaning [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", "[Top Level] [sig-api-machinery] Garbage collector should delete jobs and pods created by cronjob": "should delete jobs and pods created by cronjob [Suite:openshift/conformance/parallel] [Suite:k8s]", @@ -451,6 +169,8 @@ var annotations = map[string]string{ "[Top Level] [sig-api-machinery] Namespaces [Serial] should patch a Namespace [Conformance]": "should patch a Namespace [Conformance] [Suite:openshift/conformance/serial/minimal] [Suite:k8s]", + "[Top Level] [sig-api-machinery] ResourceQuota [Feature:CrossNamespacePodAffinity] [alpha] should verify ResourceQuota with cross namespace pod affinity scope using scope-selectors.": "should verify ResourceQuota with cross namespace pod affinity scope using scope-selectors. [Disabled:Alpha] [Suite:k8s]", + "[Top Level] [sig-api-machinery] ResourceQuota [Feature:PodPriority] should verify ResourceQuota's multiple priority class scope (quota set to pod count: 2) against 2 pods with same priority classes.": "should verify ResourceQuota's multiple priority class scope (quota set to pod count: 2) against 2 pods with same priority classes. [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-api-machinery] ResourceQuota [Feature:PodPriority] should verify ResourceQuota's priority class scope (cpu, memory quota set) against a pod with same priority class.": "should verify ResourceQuota's priority class scope (cpu, memory quota set) against a pod with same priority class. [Suite:openshift/conformance/parallel] [Suite:k8s]", @@ -475,9 +195,9 @@ var annotations = map[string]string{ "[Top Level] [sig-api-machinery] ResourceQuota should create a ResourceQuota and capture the life of a custom resource.": "should create a ResourceQuota and capture the life of a custom resource. [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-api-machinery] ResourceQuota should create a ResourceQuota and capture the life of a persistent volume claim with a storage class. [sig-storage]": "should create a ResourceQuota and capture the life of a persistent volume claim with a storage class. [sig-storage] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-api-machinery] ResourceQuota should create a ResourceQuota and capture the life of a persistent volume claim with a storage class": "should create a ResourceQuota and capture the life of a persistent volume claim with a storage class [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-api-machinery] ResourceQuota should create a ResourceQuota and capture the life of a persistent volume claim. [sig-storage]": "should create a ResourceQuota and capture the life of a persistent volume claim. [sig-storage] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-api-machinery] ResourceQuota should create a ResourceQuota and capture the life of a persistent volume claim": "should create a ResourceQuota and capture the life of a persistent volume claim [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-api-machinery] ResourceQuota should create a ResourceQuota and capture the life of a pod. [Conformance]": "should create a ResourceQuota and capture the life of a pod. [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", @@ -495,19 +215,25 @@ var annotations = map[string]string{ "[Top Level] [sig-api-machinery] ResourceQuota should verify ResourceQuota with terminating scopes. [Conformance]": "should verify ResourceQuota with terminating scopes. [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - "[Top Level] [sig-api-machinery] Secrets should be consumable from pods in env vars [NodeConformance] [Conformance]": "should be consumable from pods in env vars [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + "[Top Level] [sig-api-machinery] Server request timeout default timeout should be used if the specified timeout in the request URL is 0s": "default timeout should be used if the specified timeout in the request URL is 0s [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-api-machinery] Server request timeout should return HTTP status code 400 if the user specifies an invalid timeout in the request URL": "should return HTTP status code 400 if the user specifies an invalid timeout in the request URL [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-api-machinery] Server request timeout the request should be served with a default timeout if the specified timeout in the request URL exceeds maximum allowed": "the request should be served with a default timeout if the specified timeout in the request URL exceeds maximum allowed [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-api-machinery] Secrets should be consumable via the environment [NodeConformance] [Conformance]": "should be consumable via the environment [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + "[Top Level] [sig-api-machinery] ServerSideApply should create an applied object if it does not already exist": "should create an applied object if it does not already exist [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-api-machinery] Secrets should fail to create secret due to empty secret key [Conformance]": "should fail to create secret due to empty secret key [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + "[Top Level] [sig-api-machinery] ServerSideApply should give up ownership of a field if forced applied by a controller": "should give up ownership of a field if forced applied by a controller [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-api-machinery] Secrets should patch a secret [Conformance]": "should patch a secret [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + "[Top Level] [sig-api-machinery] ServerSideApply should ignore conflict errors if force apply is used": "should ignore conflict errors if force apply is used [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-api-machinery] Server request timeout default timeout should be used if the specified timeout in the request URL is 0s": "default timeout should be used if the specified timeout in the request URL is 0s [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-api-machinery] ServerSideApply should not remove a field if an owner unsets the field but other managers still have ownership of the field": "should not remove a field if an owner unsets the field but other managers still have ownership of the field [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-api-machinery] Server request timeout should return HTTP status code 400 if the user specifies an invalid timeout in the request URL": "should return HTTP status code 400 if the user specifies an invalid timeout in the request URL [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-api-machinery] ServerSideApply should remove a field if it is owned but removed in the apply request": "should remove a field if it is owned but removed in the apply request [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-api-machinery] Server request timeout the request should be served with a default timeout if the specified timeout in the request URL exceeds maximum allowed": "the request should be served with a default timeout if the specified timeout in the request URL exceeds maximum allowed [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-api-machinery] ServerSideApply should work for CRDs": "should work for CRDs [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-api-machinery] ServerSideApply should work for subresources": "should work for subresources [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-api-machinery] Servers with support for API chunking should return chunks of results for list calls": "should return chunks of results for list calls [Suite:openshift/conformance/parallel] [Suite:k8s]", @@ -521,6 +247,8 @@ var annotations = map[string]string{ "[Top Level] [sig-api-machinery] Servers with support for Table transformation should return pod details": "should return pod details [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-api-machinery] StorageVersion resources [Feature:StorageVersionAPI] storage version with non-existing id should be GC'ed": "storage version with non-existing id should be GC'ed [Disabled:Alpha] [Suite:k8s]", + "[Top Level] [sig-api-machinery] Watchers should be able to restart watching from the last resource version observed by the previous watch [Conformance]": "should be able to restart watching from the last resource version observed by the previous watch [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", "[Top Level] [sig-api-machinery] Watchers should be able to start watching from a specific resource version [Conformance]": "should be able to start watching from a specific resource version [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", @@ -605,15 +333,17 @@ var annotations = map[string]string{ "[Top Level] [sig-apps] CronJob should not emit unexpected warnings": "should not emit unexpected warnings [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-apps] CronJob should not schedule jobs when suspended [Slow]": "should not schedule jobs when suspended [Slow] [Suite:k8s]", + "[Top Level] [sig-apps] CronJob should not schedule jobs when suspended [Slow] [Conformance]": "should not schedule jobs when suspended [Slow] [Conformance] [Suite:k8s]", - "[Top Level] [sig-apps] CronJob should not schedule new jobs when ForbidConcurrent [Slow]": "should not schedule new jobs when ForbidConcurrent [Slow] [Suite:k8s]", + "[Top Level] [sig-apps] CronJob should not schedule new jobs when ForbidConcurrent [Slow] [Conformance]": "should not schedule new jobs when ForbidConcurrent [Slow] [Conformance] [Suite:k8s]", "[Top Level] [sig-apps] CronJob should remove from active list jobs that have been deleted": "should remove from active list jobs that have been deleted [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-apps] CronJob should replace jobs when ReplaceConcurrent": "should replace jobs when ReplaceConcurrent [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-apps] CronJob should replace jobs when ReplaceConcurrent [Conformance]": "should replace jobs when ReplaceConcurrent [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - "[Top Level] [sig-apps] CronJob should schedule multiple jobs concurrently": "should schedule multiple jobs concurrently [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-apps] CronJob should schedule multiple jobs concurrently [Conformance]": "should schedule multiple jobs concurrently [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-apps] CronJob should support CronJob API operations [Conformance]": "should support CronJob API operations [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", "[Top Level] [sig-apps] Daemon set [Serial] should not update pod when spec was updated and update strategy is OnDelete": "should not update pod when spec was updated and update strategy is OnDelete [Suite:openshift/conformance/serial] [Suite:k8s]", @@ -627,6 +357,8 @@ var annotations = map[string]string{ "[Top Level] [sig-apps] Daemon set [Serial] should run and stop simple daemon [Conformance]": "should run and stop simple daemon [Conformance] [Suite:openshift/conformance/serial/minimal] [Suite:k8s]", + "[Top Level] [sig-apps] Daemon set [Serial] should surge pods onto nodes when spec was updated and update strategy is RollingUpdate [Feature:DaemonSetUpdateSurge]": "should surge pods onto nodes when spec was updated and update strategy is RollingUpdate [Feature:DaemonSetUpdateSurge] [Disabled:Alpha] [Suite:k8s]", + "[Top Level] [sig-apps] Daemon set [Serial] should update pod when spec was updated and update strategy is RollingUpdate [Conformance]": "should update pod when spec was updated and update strategy is RollingUpdate [Conformance] [Suite:openshift/conformance/serial/minimal] [Suite:k8s]", "[Top Level] [sig-apps] DaemonRestart [Disruptive] Controller Manager should not create/delete replicas across restart": "Controller Manager should not create/delete replicas across restart [Serial] [Suite:k8s]", @@ -637,6 +369,8 @@ var annotations = map[string]string{ "[Top Level] [sig-apps] DaemonRestart [Disruptive] Scheduler should continue assigning pods to nodes across restart": "Scheduler should continue assigning pods to nodes across restart [Serial] [Suite:k8s]", + "[Top Level] [sig-apps] Deployment Deployment should have a working scale subresource [Conformance]": "Deployment should have a working scale subresource [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + "[Top Level] [sig-apps] Deployment RecreateDeployment should delete old pods and create new ones [Conformance]": "RecreateDeployment should delete old pods and create new ones [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", "[Top Level] [sig-apps] Deployment RollingUpdateDeployment should delete old pods and create new ones [Conformance]": "RollingUpdateDeployment should delete old pods and create new ones [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", @@ -657,7 +391,7 @@ var annotations = map[string]string{ "[Top Level] [sig-apps] Deployment test Deployment ReplicaSet orphaning and adoption regarding controllerRef": "test Deployment ReplicaSet orphaning and adoption regarding controllerRef [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-apps] DisruptionController Listing PodDisruptionBudgets for all namespaces should list and delete a collection of PodDisruptionBudgets": "should list and delete a collection of PodDisruptionBudgets [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-apps] DisruptionController Listing PodDisruptionBudgets for all namespaces should list and delete a collection of PodDisruptionBudgets [Conformance]": "should list and delete a collection of PodDisruptionBudgets [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", "[Top Level] [sig-apps] DisruptionController evictions: enough pods, absolute => should allow an eviction": "evictions: enough pods, absolute => should allow an eviction [Suite:openshift/conformance/parallel] [Suite:k8s]", @@ -675,11 +409,17 @@ var annotations = map[string]string{ "[Top Level] [sig-apps] DisruptionController should block an eviction until the PDB is updated to allow it": "should block an eviction until the PDB is updated to allow it [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-apps] DisruptionController should create a PodDisruptionBudget": "should create a PodDisruptionBudget [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-apps] DisruptionController should create a PodDisruptionBudget [Conformance]": "should create a PodDisruptionBudget [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-apps] DisruptionController should observe PodDisruptionBudget status updated [Conformance]": "should observe PodDisruptionBudget status updated [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-apps] DisruptionController should update/patch PodDisruptionBudget status [Conformance]": "should update/patch PodDisruptionBudget status [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-apps] Job [Feature:IndexedJob] should create pods for an Indexed job with completion indexes": "[Feature:IndexedJob] should create pods for an Indexed job with completion indexes [Disabled:Alpha] [Suite:k8s]", - "[Top Level] [sig-apps] DisruptionController should observe PodDisruptionBudget status updated": "should observe PodDisruptionBudget status updated [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-apps] Job [Feature:SuspendJob] should delete pods when suspended": "[Feature:SuspendJob] should delete pods when suspended [Disabled:Alpha] [Suite:k8s]", - "[Top Level] [sig-apps] DisruptionController should update/patch PodDisruptionBudget status": "should update/patch PodDisruptionBudget status [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-apps] Job [Feature:SuspendJob] should not create pods when created in suspend state": "[Feature:SuspendJob] should not create pods when created in suspend state [Disabled:Alpha] [Suite:k8s]", "[Top Level] [sig-apps] Job should adopt matching orphans and release non-matching pods [Conformance]": "should adopt matching orphans and release non-matching pods [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", @@ -697,19 +437,23 @@ var annotations = map[string]string{ "[Top Level] [sig-apps] Job should run a job to completion when tasks succeed": "should run a job to completion when tasks succeed [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-apps] Network Partition [Disruptive] [Slow] [k8s.io] Pods should be evicted from unready Node [Feature:TaintEviction] All pods on the unreachable node should be marked as NotReady upon the node turn NotReady AND all pods should be evicted after eviction timeout passes": "[Feature:TaintEviction] All pods on the unreachable node should be marked as NotReady upon the node turn NotReady AND all pods should be evicted after eviction timeout passes [Serial] [Suite:k8s]", + "[Top Level] [sig-apps] Network Partition [Disruptive] [Slow] Pods should be evicted from unready Node [Feature:TaintEviction] All pods on the unreachable node should be marked as NotReady upon the node turn NotReady AND all pods should be evicted after eviction timeout passes": "[Feature:TaintEviction] All pods on the unreachable node should be marked as NotReady upon the node turn NotReady AND all pods should be evicted after eviction timeout passes [Serial] [Suite:k8s]", - "[Top Level] [sig-apps] Network Partition [Disruptive] [Slow] [k8s.io] Pods should return to running and ready state after network partition is healed All pods on the unreachable node should be marked as NotReady upon the node turn NotReady AND all pods should be mark back to Ready when the node get back to Ready before pod eviction timeout": "All pods on the unreachable node should be marked as NotReady upon the node turn NotReady AND all pods should be mark back to Ready when the node get back to Ready before pod eviction timeout [Serial] [Suite:k8s]", + "[Top Level] [sig-apps] Network Partition [Disruptive] [Slow] Pods should return to running and ready state after network partition is healed All pods on the unreachable node should be marked as NotReady upon the node turn NotReady AND all pods should be mark back to Ready when the node get back to Ready before pod eviction timeout": "All pods on the unreachable node should be marked as NotReady upon the node turn NotReady AND all pods should be mark back to Ready when the node get back to Ready before pod eviction timeout [Serial] [Suite:k8s]", - "[Top Level] [sig-apps] Network Partition [Disruptive] [Slow] [k8s.io] [Job] should create new pods when node is partitioned": "should create new pods when node is partitioned [Serial] [Suite:k8s]", + "[Top Level] [sig-apps] Network Partition [Disruptive] [Slow] [Job] should create new pods when node is partitioned": "should create new pods when node is partitioned [Serial] [Suite:k8s]", - "[Top Level] [sig-apps] Network Partition [Disruptive] [Slow] [k8s.io] [ReplicationController] should eagerly create replacement pod during network partition when termination grace is non-zero": "should eagerly create replacement pod during network partition when termination grace is non-zero [Serial] [Suite:k8s]", + "[Top Level] [sig-apps] Network Partition [Disruptive] [Slow] [ReplicationController] should eagerly create replacement pod during network partition when termination grace is non-zero": "should eagerly create replacement pod during network partition when termination grace is non-zero [Serial] [Suite:k8s]", - "[Top Level] [sig-apps] Network Partition [Disruptive] [Slow] [k8s.io] [ReplicationController] should recreate pods scheduled on the unreachable node AND allow scheduling of pods on a node after it rejoins the cluster": "should recreate pods scheduled on the unreachable node AND allow scheduling of pods on a node after it rejoins the cluster [Serial] [Suite:k8s]", + "[Top Level] [sig-apps] Network Partition [Disruptive] [Slow] [ReplicationController] should recreate pods scheduled on the unreachable node AND allow scheduling of pods on a node after it rejoins the cluster": "should recreate pods scheduled on the unreachable node AND allow scheduling of pods on a node after it rejoins the cluster [Serial] [Suite:k8s]", - "[Top Level] [sig-apps] Network Partition [Disruptive] [Slow] [k8s.io] [StatefulSet] should come back up if node goes down [Slow] [Disruptive]": "should come back up if node goes down [Slow] [Disruptive] [Serial] [Suite:k8s]", + "[Top Level] [sig-apps] Network Partition [Disruptive] [Slow] [StatefulSet] should come back up if node goes down [Slow] [Disruptive]": "should come back up if node goes down [Slow] [Disruptive] [Serial] [Suite:k8s]", - "[Top Level] [sig-apps] Network Partition [Disruptive] [Slow] [k8s.io] [StatefulSet] should not reschedule stateful pods if there is a network partition [Slow] [Disruptive]": "should not reschedule stateful pods if there is a network partition [Slow] [Disruptive] [Serial] [Suite:k8s]", + "[Top Level] [sig-apps] Network Partition [Disruptive] [Slow] [StatefulSet] should not reschedule stateful pods if there is a network partition [Slow] [Disruptive]": "should not reschedule stateful pods if there is a network partition [Slow] [Disruptive] [Serial] [Suite:k8s]", + + "[Top Level] [sig-apps] ReplicaSet Replace and Patch tests [Conformance]": "Replace and Patch tests [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-apps] ReplicaSet Replicaset should have a working scale subresource [Conformance]": "Replicaset should have a working scale subresource [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", "[Top Level] [sig-apps] ReplicaSet should adopt matching pods on creation and release no longer matching pods [Conformance]": "should adopt matching pods on creation and release no longer matching pods [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", @@ -731,35 +475,37 @@ var annotations = map[string]string{ "[Top Level] [sig-apps] ReplicationController should test the lifecycle of a ReplicationController [Conformance]": "should test the lifecycle of a ReplicationController [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - "[Top Level] [sig-apps] StatefulSet [k8s.io] Basic StatefulSet functionality [StatefulSetBasic] Burst scaling should run to completion even with unhealthy pods [Slow] [Conformance]": "Burst scaling should run to completion even with unhealthy pods [Slow] [Conformance] [Suite:k8s]", + "[Top Level] [sig-apps] StatefulSet Basic StatefulSet functionality [StatefulSetBasic] Burst scaling should run to completion even with unhealthy pods [Slow] [Conformance]": "Burst scaling should run to completion even with unhealthy pods [Slow] [Conformance] [Suite:k8s]", - "[Top Level] [sig-apps] StatefulSet [k8s.io] Basic StatefulSet functionality [StatefulSetBasic] Scaling should happen in predictable order and halt if any stateful pod is unhealthy [Slow] [Conformance]": "Scaling should happen in predictable order and halt if any stateful pod is unhealthy [Slow] [Conformance] [Suite:k8s]", + "[Top Level] [sig-apps] StatefulSet Basic StatefulSet functionality [StatefulSetBasic] Scaling should happen in predictable order and halt if any stateful pod is unhealthy [Slow] [Conformance]": "Scaling should happen in predictable order and halt if any stateful pod is unhealthy [Slow] [Conformance] [Suite:k8s]", - "[Top Level] [sig-apps] StatefulSet [k8s.io] Basic StatefulSet functionality [StatefulSetBasic] Should recreate evicted statefulset [Conformance]": "Should recreate evicted statefulset [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + "[Top Level] [sig-apps] StatefulSet Basic StatefulSet functionality [StatefulSetBasic] Should recreate evicted statefulset [Conformance]": "Should recreate evicted statefulset [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - "[Top Level] [sig-apps] StatefulSet [k8s.io] Basic StatefulSet functionality [StatefulSetBasic] should adopt matching orphans and release non-matching pods": "should adopt matching orphans and release non-matching pods [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-apps] StatefulSet Basic StatefulSet functionality [StatefulSetBasic] should adopt matching orphans and release non-matching pods": "should adopt matching orphans and release non-matching pods [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-apps] StatefulSet [k8s.io] Basic StatefulSet functionality [StatefulSetBasic] should have a working scale subresource [Conformance]": "should have a working scale subresource [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + "[Top Level] [sig-apps] StatefulSet Basic StatefulSet functionality [StatefulSetBasic] should have a working scale subresource [Conformance]": "should have a working scale subresource [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - "[Top Level] [sig-apps] StatefulSet [k8s.io] Basic StatefulSet functionality [StatefulSetBasic] should implement legacy replacement when the update strategy is OnDelete": "should implement legacy replacement when the update strategy is OnDelete [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-apps] StatefulSet Basic StatefulSet functionality [StatefulSetBasic] should implement legacy replacement when the update strategy is OnDelete": "should implement legacy replacement when the update strategy is OnDelete [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-apps] StatefulSet [k8s.io] Basic StatefulSet functionality [StatefulSetBasic] should not deadlock when a pod's predecessor fails": "should not deadlock when a pod's predecessor fails [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-apps] StatefulSet Basic StatefulSet functionality [StatefulSetBasic] should not deadlock when a pod's predecessor fails": "should not deadlock when a pod's predecessor fails [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-apps] StatefulSet [k8s.io] Basic StatefulSet functionality [StatefulSetBasic] should perform canary updates and phased rolling updates of template modifications [Conformance]": "should perform canary updates and phased rolling updates of template modifications [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + "[Top Level] [sig-apps] StatefulSet Basic StatefulSet functionality [StatefulSetBasic] should perform canary updates and phased rolling updates of template modifications [Conformance]": "should perform canary updates and phased rolling updates of template modifications [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - "[Top Level] [sig-apps] StatefulSet [k8s.io] Basic StatefulSet functionality [StatefulSetBasic] should perform rolling updates and roll backs of template modifications [Conformance]": "should perform rolling updates and roll backs of template modifications [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + "[Top Level] [sig-apps] StatefulSet Basic StatefulSet functionality [StatefulSetBasic] should perform rolling updates and roll backs of template modifications [Conformance]": "should perform rolling updates and roll backs of template modifications [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - "[Top Level] [sig-apps] StatefulSet [k8s.io] Basic StatefulSet functionality [StatefulSetBasic] should perform rolling updates and roll backs of template modifications with PVCs": "should perform rolling updates and roll backs of template modifications with PVCs [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-apps] StatefulSet Basic StatefulSet functionality [StatefulSetBasic] should perform rolling updates and roll backs of template modifications with PVCs": "should perform rolling updates and roll backs of template modifications with PVCs [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-apps] StatefulSet [k8s.io] Basic StatefulSet functionality [StatefulSetBasic] should provide basic identity": "should provide basic identity [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-apps] StatefulSet Basic StatefulSet functionality [StatefulSetBasic] should provide basic identity": "should provide basic identity [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-apps] StatefulSet [k8s.io] Deploy clustered applications [Feature:StatefulSet] [Slow] should creating a working CockroachDB cluster": "should creating a working CockroachDB cluster [Suite:k8s]", + "[Top Level] [sig-apps] StatefulSet Deploy clustered applications [Feature:StatefulSet] [Slow] should creating a working CockroachDB cluster": "should creating a working CockroachDB cluster [Suite:k8s]", - "[Top Level] [sig-apps] StatefulSet [k8s.io] Deploy clustered applications [Feature:StatefulSet] [Slow] should creating a working mysql cluster": "should creating a working mysql cluster [Suite:k8s]", + "[Top Level] [sig-apps] StatefulSet Deploy clustered applications [Feature:StatefulSet] [Slow] should creating a working mysql cluster": "should creating a working mysql cluster [Suite:k8s]", - "[Top Level] [sig-apps] StatefulSet [k8s.io] Deploy clustered applications [Feature:StatefulSet] [Slow] should creating a working redis cluster": "should creating a working redis cluster [Suite:k8s]", + "[Top Level] [sig-apps] StatefulSet Deploy clustered applications [Feature:StatefulSet] [Slow] should creating a working redis cluster": "should creating a working redis cluster [Suite:k8s]", - "[Top Level] [sig-apps] StatefulSet [k8s.io] Deploy clustered applications [Feature:StatefulSet] [Slow] should creating a working zookeeper cluster": "should creating a working zookeeper cluster [Suite:k8s]", + "[Top Level] [sig-apps] StatefulSet Deploy clustered applications [Feature:StatefulSet] [Slow] should creating a working zookeeper cluster": "should creating a working zookeeper cluster [Suite:k8s]", + + "[Top Level] [sig-apps] [Feature:TTLAfterFinished] job should be deleted once it finishes after TTL seconds": "job should be deleted once it finishes after TTL seconds [Disabled:Broken] [Suite:k8s]", "[Top Level] [sig-apps][Feature:DeploymentConfig] deploymentconfigs should adhere to Three Laws of Controllers": "should adhere to Three Laws of Controllers [Skipped:Disconnected] [Suite:openshift/conformance/parallel]", @@ -877,11 +623,13 @@ var annotations = map[string]string{ "[Top Level] [sig-auth] PodSecurityPolicy [Feature:PodSecurityPolicy] should forbid pod creation when no PSP is available": "should forbid pod creation when no PSP is available [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-auth] ServiceAccounts ServiceAccountIssuerDiscovery should support OIDC discovery of service account issuer [Conformance]": "ServiceAccountIssuerDiscovery should support OIDC discovery of service account issuer [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + "[Top Level] [sig-auth] ServiceAccounts should allow opting out of API token automount [Conformance]": "should allow opting out of API token automount [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", "[Top Level] [sig-auth] ServiceAccounts should ensure a single API token exists": "should ensure a single API token exists [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-auth] ServiceAccounts should guarantee kube-root-ca.crt exist in any namespace": "should guarantee kube-root-ca.crt exist in any namespace [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-auth] ServiceAccounts should guarantee kube-root-ca.crt exist in any namespace [Conformance]": "should guarantee kube-root-ca.crt exist in any namespace [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", "[Top Level] [sig-auth] ServiceAccounts should mount an API token into pods [Conformance]": "should mount an API token into pods [Conformance] [Disabled:Broken] [Suite:k8s]", @@ -893,8 +641,6 @@ var annotations = map[string]string{ "[Top Level] [sig-auth] ServiceAccounts should support InClusterConfig with token rotation [Slow]": "should support InClusterConfig with token rotation [Slow] [Suite:k8s]", - "[Top Level] [sig-auth] ServiceAccounts should support OIDC discovery of service account issuer [Feature:ServiceAccountIssuerDiscovery]": "should support OIDC discovery of service account issuer [Feature:ServiceAccountIssuerDiscovery] [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-auth] [Feature:NodeAuthenticator] The kubelet can delegate ServiceAccount tokens to the API server": "The kubelet can delegate ServiceAccount tokens to the API server [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-auth] [Feature:NodeAuthenticator] The kubelet's main port 10250 should reject requests with no credentials": "The kubelet's main port 10250 should reject requests with no credentials [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", @@ -1037,6 +783,18 @@ var annotations = map[string]string{ "[Top Level] [sig-auth][Feature:UserAPI] users can manipulate groups": "users can manipulate groups [Suite:openshift/conformance/parallel]", + "[Top Level] [sig-autoscaling] Cluster size autoscaler scalability [Slow] CA ignores unschedulable pods while scheduling schedulable pods [Feature:ClusterAutoscalerScalability6]": "CA ignores unschedulable pods while scheduling schedulable pods [Feature:ClusterAutoscalerScalability6] [Suite:k8s]", + + "[Top Level] [sig-autoscaling] Cluster size autoscaler scalability [Slow] should scale down empty nodes [Feature:ClusterAutoscalerScalability3]": "should scale down empty nodes [Feature:ClusterAutoscalerScalability3] [Suite:k8s]", + + "[Top Level] [sig-autoscaling] Cluster size autoscaler scalability [Slow] should scale down underutilized nodes [Feature:ClusterAutoscalerScalability4]": "should scale down underutilized nodes [Feature:ClusterAutoscalerScalability4] [Suite:k8s]", + + "[Top Level] [sig-autoscaling] Cluster size autoscaler scalability [Slow] should scale up at all [Feature:ClusterAutoscalerScalability1]": "should scale up at all [Feature:ClusterAutoscalerScalability1] [Suite:k8s]", + + "[Top Level] [sig-autoscaling] Cluster size autoscaler scalability [Slow] should scale up twice [Feature:ClusterAutoscalerScalability2]": "should scale up twice [Feature:ClusterAutoscalerScalability2] [Suite:k8s]", + + "[Top Level] [sig-autoscaling] Cluster size autoscaler scalability [Slow] shouldn't scale down with underutilized nodes due to host port conflicts [Feature:ClusterAutoscalerScalability5]": "shouldn't scale down with underutilized nodes due to host port conflicts [Feature:ClusterAutoscalerScalability5] [Suite:k8s]", + "[Top Level] [sig-autoscaling] Cluster size autoscaling [Slow] Should be able to scale a node group down to 0[Feature:ClusterSizeAutoscalingScaleDown]": "Should be able to scale a node group down to 0[Feature:ClusterSizeAutoscalingScaleDown] [Suite:k8s]", "[Top Level] [sig-autoscaling] Cluster size autoscaling [Slow] Should be able to scale a node group up from 0[Feature:ClusterSizeAutoscalingScaleUp]": "Should be able to scale a node group up from 0[Feature:ClusterSizeAutoscalingScaleUp] [Suite:k8s]", @@ -1099,25 +857,25 @@ var annotations = map[string]string{ "[Top Level] [sig-autoscaling] Cluster size autoscaling [Slow] shouldn't trigger additional scale-ups during processing scale-up [Feature:ClusterSizeAutoscalingScaleUp]": "shouldn't trigger additional scale-ups during processing scale-up [Feature:ClusterSizeAutoscalingScaleUp] [Suite:k8s]", - "[Top Level] [sig-autoscaling] DNS horizontal autoscaling [DisabledForLargeClusters] kube-dns-autoscaler should scale kube-dns pods in both nonfaulty and faulty scenarios": "[DisabledForLargeClusters] kube-dns-autoscaler should scale kube-dns pods in both nonfaulty and faulty scenarios [Disabled:SpecialConfig] [Suite:k8s]", - "[Top Level] [sig-autoscaling] DNS horizontal autoscaling [Serial] [Slow] kube-dns-autoscaler should scale kube-dns pods when cluster size changed": "[Serial] [Slow] kube-dns-autoscaler should scale kube-dns pods when cluster size changed [Disabled:SpecialConfig] [Suite:k8s]", - "[Top Level] [sig-autoscaling] [Feature:HPA] Horizontal pod autoscaling (scale resource: CPU) [sig-autoscaling] ReplicationController light Should scale from 1 pod to 2 pods": "Should scale from 1 pod to 2 pods [Flaky] [Serial] [Suite:k8s]", + "[Top Level] [sig-autoscaling] DNS horizontal autoscaling kube-dns-autoscaler should scale kube-dns pods in both nonfaulty and faulty scenarios": "kube-dns-autoscaler should scale kube-dns pods in both nonfaulty and faulty scenarios [Disabled:SpecialConfig] [Suite:k8s]", + + "[Top Level] [sig-autoscaling] [Feature:HPA] Horizontal pod autoscaling (scale resource: CPU) ReplicationController light Should scale from 1 pod to 2 pods": "Should scale from 1 pod to 2 pods [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-autoscaling] [Feature:HPA] Horizontal pod autoscaling (scale resource: CPU) [sig-autoscaling] ReplicationController light Should scale from 2 pods to 1 pod [Slow]": "Should scale from 2 pods to 1 pod [Slow] [Suite:k8s]", + "[Top Level] [sig-autoscaling] [Feature:HPA] Horizontal pod autoscaling (scale resource: CPU) ReplicationController light Should scale from 2 pods to 1 pod [Slow]": "Should scale from 2 pods to 1 pod [Slow] [Suite:k8s]", - "[Top Level] [sig-autoscaling] [Feature:HPA] Horizontal pod autoscaling (scale resource: CPU) [sig-autoscaling] [Serial] [Slow] Deployment Should scale from 1 pod to 3 pods and from 3 to 5": "Should scale from 1 pod to 3 pods and from 3 to 5 [Suite:k8s]", + "[Top Level] [sig-autoscaling] [Feature:HPA] Horizontal pod autoscaling (scale resource: CPU) [Serial] [Slow] Deployment Should scale from 1 pod to 3 pods and from 3 to 5": "Should scale from 1 pod to 3 pods and from 3 to 5 [Suite:k8s]", - "[Top Level] [sig-autoscaling] [Feature:HPA] Horizontal pod autoscaling (scale resource: CPU) [sig-autoscaling] [Serial] [Slow] Deployment Should scale from 5 pods to 3 pods and from 3 to 1": "Should scale from 5 pods to 3 pods and from 3 to 1 [Suite:k8s]", + "[Top Level] [sig-autoscaling] [Feature:HPA] Horizontal pod autoscaling (scale resource: CPU) [Serial] [Slow] Deployment Should scale from 5 pods to 3 pods and from 3 to 1": "Should scale from 5 pods to 3 pods and from 3 to 1 [Suite:k8s]", - "[Top Level] [sig-autoscaling] [Feature:HPA] Horizontal pod autoscaling (scale resource: CPU) [sig-autoscaling] [Serial] [Slow] ReplicaSet Should scale from 1 pod to 3 pods and from 3 to 5": "Should scale from 1 pod to 3 pods and from 3 to 5 [Suite:k8s]", + "[Top Level] [sig-autoscaling] [Feature:HPA] Horizontal pod autoscaling (scale resource: CPU) [Serial] [Slow] ReplicaSet Should scale from 1 pod to 3 pods and from 3 to 5": "Should scale from 1 pod to 3 pods and from 3 to 5 [Suite:k8s]", - "[Top Level] [sig-autoscaling] [Feature:HPA] Horizontal pod autoscaling (scale resource: CPU) [sig-autoscaling] [Serial] [Slow] ReplicaSet Should scale from 5 pods to 3 pods and from 3 to 1": "Should scale from 5 pods to 3 pods and from 3 to 1 [Suite:k8s]", + "[Top Level] [sig-autoscaling] [Feature:HPA] Horizontal pod autoscaling (scale resource: CPU) [Serial] [Slow] ReplicaSet Should scale from 5 pods to 3 pods and from 3 to 1": "Should scale from 5 pods to 3 pods and from 3 to 1 [Suite:k8s]", - "[Top Level] [sig-autoscaling] [Feature:HPA] Horizontal pod autoscaling (scale resource: CPU) [sig-autoscaling] [Serial] [Slow] ReplicationController Should scale from 1 pod to 3 pods and from 3 to 5 and verify decision stability": "Should scale from 1 pod to 3 pods and from 3 to 5 and verify decision stability [Suite:k8s]", + "[Top Level] [sig-autoscaling] [Feature:HPA] Horizontal pod autoscaling (scale resource: CPU) [Serial] [Slow] ReplicationController Should scale from 1 pod to 3 pods and from 3 to 5 and verify decision stability": "Should scale from 1 pod to 3 pods and from 3 to 5 and verify decision stability [Suite:k8s]", - "[Top Level] [sig-autoscaling] [Feature:HPA] Horizontal pod autoscaling (scale resource: CPU) [sig-autoscaling] [Serial] [Slow] ReplicationController Should scale from 5 pods to 3 pods and from 3 to 1 and verify decision stability": "Should scale from 5 pods to 3 pods and from 3 to 1 and verify decision stability [Suite:k8s]", + "[Top Level] [sig-autoscaling] [Feature:HPA] Horizontal pod autoscaling (scale resource: CPU) [Serial] [Slow] ReplicationController Should scale from 5 pods to 3 pods and from 3 to 1 and verify decision stability": "Should scale from 5 pods to 3 pods and from 3 to 1 and verify decision stability [Suite:k8s]", "[Top Level] [sig-autoscaling] [HPA] Horizontal pod autoscaling (scale resource: Custom Metrics from Stackdriver) should scale down with Custom Metric of type Object from Stackdriver [Feature:CustomMetricsAutoscaling]": "should scale down with Custom Metric of type Object from Stackdriver [Feature:CustomMetricsAutoscaling] [Skipped:gce] [Suite:openshift/conformance/parallel] [Suite:k8s]", @@ -1855,6 +1613,10 @@ var annotations = map[string]string{ "[Top Level] [sig-instrumentation] Events API should ensure that an event can be fetched, patched, deleted, and listed [Conformance]": "should ensure that an event can be fetched, patched, deleted, and listed [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + "[Top Level] [sig-instrumentation] Events should delete a collection of events [Conformance]": "should delete a collection of events [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-instrumentation] Events should ensure that an event can be fetched, patched, deleted, and listed [Conformance]": "should ensure that an event can be fetched, patched, deleted, and listed [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + "[Top Level] [sig-instrumentation] Kibana Logging Instances Is Alive [Feature:Elasticsearch] should check that the Kibana logging instance is alive": "should check that the Kibana logging instance is alive [Disabled:Unimplemented] [Suite:k8s]", "[Top Level] [sig-instrumentation] Logging soak [Performance] [Slow] [Disruptive] should survive logging 1KB every 1s seconds, for a duration of 2m0s": "should survive logging 1KB every 1s seconds, for a duration of 2m0s [Serial] [Suite:k8s]", @@ -1937,6 +1699,8 @@ var annotations = map[string]string{ "[Top Level] [sig-network] Conntrack should be able to preserve UDP traffic when server pod cycles for a NodePort service": "should be able to preserve UDP traffic when server pod cycles for a NodePort service [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-network] Conntrack should drop INVALID conntrack entries": "should drop INVALID conntrack entries [Disabled:Broken] [Suite:k8s]", + "[Top Level] [sig-network] DNS configMap nameserver Change stubDomain should be able to change stubDomain configuration [Slow][Serial]": "should be able to change stubDomain configuration [Slow][Serial] [Disabled:SpecialConfig] [Suite:k8s]", "[Top Level] [sig-network] DNS configMap nameserver Forward PTR lookup should forward PTR records lookup to upstream nameserver [Slow][Serial]": "should forward PTR records lookup to upstream nameserver [Slow][Serial] [Disabled:SpecialConfig] [Suite:k8s]", @@ -1965,7 +1729,7 @@ var annotations = map[string]string{ "[Top Level] [sig-network] DNS should support configurable pod resolv.conf": "should support configurable pod resolv.conf [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-network] ESIPP [Slow] should handle updates to ExternalTrafficPolicy field [DisabledForLargeClusters]": "should handle updates to ExternalTrafficPolicy field [DisabledForLargeClusters] [Suite:k8s]", + "[Top Level] [sig-network] ESIPP [Slow] should handle updates to ExternalTrafficPolicy field": "should handle updates to ExternalTrafficPolicy field [Suite:k8s]", "[Top Level] [sig-network] ESIPP [Slow] should only target nodes with endpoints": "should only target nodes with endpoints [Suite:k8s]", @@ -1975,18 +1739,24 @@ var annotations = map[string]string{ "[Top Level] [sig-network] ESIPP [Slow] should work from pods": "should work from pods [Suite:k8s]", - "[Top Level] [sig-network] EndpointSlice should create Endpoints and EndpointSlices for Pods matching a Service": "should create Endpoints and EndpointSlices for Pods matching a Service [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-network] EndpointSlice should create Endpoints and EndpointSlices for Pods matching a Service [Conformance]": "should create Endpoints and EndpointSlices for Pods matching a Service [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-network] EndpointSlice should create and delete Endpoints and EndpointSlices for a Service with a selector specified [Conformance]": "should create and delete Endpoints and EndpointSlices for a Service with a selector specified [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - "[Top Level] [sig-network] EndpointSlice should create and delete Endpoints and EndpointSlices for a Service with a selector specified": "should create and delete Endpoints and EndpointSlices for a Service with a selector specified [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-network] EndpointSlice should have Endpoints and EndpointSlices pointing to API Server [Conformance]": "should have Endpoints and EndpointSlices pointing to API Server [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - "[Top Level] [sig-network] EndpointSlice should have Endpoints and EndpointSlices pointing to API Server": "should have Endpoints and EndpointSlices pointing to API Server [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-network] EndpointSlice should support creating EndpointSlice API operations [Conformance]": "should support creating EndpointSlice API operations [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - "[Top Level] [sig-network] EndpointSliceMirroring should mirror a custom Endpoints resource through create update and delete": "should mirror a custom Endpoints resource through create update and delete [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-network] EndpointSliceMirroring should mirror a custom Endpoints resource through create update and delete [Conformance]": "should mirror a custom Endpoints resource through create update and delete [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", "[Top Level] [sig-network] Firewall rule [Slow] [Serial] should create valid firewall rules for LoadBalancer type service": "[Slow] [Serial] should create valid firewall rules for LoadBalancer type service [Suite:k8s]", + "[Top Level] [sig-network] Firewall rule control plane should not expose well-known ports": "control plane should not expose well-known ports [Disabled:Broken] [Suite:k8s]", + "[Top Level] [sig-network] Firewall rule should have correct firewall rules for e2e cluster": "should have correct firewall rules for e2e cluster [Disabled:SpecialConfig] [Suite:k8s]", + "[Top Level] [sig-network] HostPort validates that there is no conflict between pods with same hostPort but different hostIP and protocol [LinuxOnly] [Conformance]": "validates that there is no conflict between pods with same hostPort but different hostIP and protocol [LinuxOnly] [Conformance] [Disabled:Broken] [Suite:k8s]", + "[Top Level] [sig-network] Ingress API should support creating Ingress API operations [Conformance]": "should support creating Ingress API operations [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", "[Top Level] [sig-network] IngressClass API should support creating IngressClass API operations [Conformance]": " should support creating IngressClass API operations [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", @@ -1999,27 +1769,45 @@ var annotations = map[string]string{ "[Top Level] [sig-network] Internal connectivity for TCP and UDP on ports 9000-9999 is allowed": "for TCP and UDP on ports 9000-9999 is allowed [Suite:openshift/conformance/parallel]", - "[Top Level] [sig-network] KubeProxy should resolve connection reset issue #74839 [Slow]": "should resolve connection reset issue #74839 [Slow] [Suite:k8s]", - "[Top Level] [sig-network] KubeProxy should set TCP CLOSE_WAIT timeout [Privileged]": "should set TCP CLOSE_WAIT timeout [Privileged] [Disabled:Broken] [Suite:k8s]", + "[Top Level] [sig-network] LoadBalancers should be able to change the type and ports of a TCP service [Slow]": "should be able to change the type and ports of a TCP service [Slow] [Suite:k8s]", + + "[Top Level] [sig-network] LoadBalancers should be able to change the type and ports of a UDP service [Slow]": "should be able to change the type and ports of a UDP service [Slow] [Suite:k8s]", + + "[Top Level] [sig-network] LoadBalancers should be able to create an internal type load balancer [Slow]": "should be able to create an internal type load balancer [Slow] [Suite:k8s]", + + "[Top Level] [sig-network] LoadBalancers should be able to switch session affinity for LoadBalancer service with ESIPP off [Slow] [DisabledForLargeClusters] [LinuxOnly]": "should be able to switch session affinity for LoadBalancer service with ESIPP off [Slow] [DisabledForLargeClusters] [LinuxOnly] [Suite:k8s]", + + "[Top Level] [sig-network] LoadBalancers should be able to switch session affinity for LoadBalancer service with ESIPP on [Slow] [DisabledForLargeClusters] [LinuxOnly]": "should be able to switch session affinity for LoadBalancer service with ESIPP on [Slow] [DisabledForLargeClusters] [LinuxOnly] [Suite:k8s]", + + "[Top Level] [sig-network] LoadBalancers should handle load balancer cleanup finalizer for service [Slow]": "should handle load balancer cleanup finalizer for service [Slow] [Suite:k8s]", + + "[Top Level] [sig-network] LoadBalancers should have session affinity work for LoadBalancer service with ESIPP off [Slow] [DisabledForLargeClusters] [LinuxOnly]": "should have session affinity work for LoadBalancer service with ESIPP off [Slow] [DisabledForLargeClusters] [LinuxOnly] [Suite:k8s]", + + "[Top Level] [sig-network] LoadBalancers should have session affinity work for LoadBalancer service with ESIPP on [Slow] [DisabledForLargeClusters] [LinuxOnly]": "should have session affinity work for LoadBalancer service with ESIPP on [Slow] [DisabledForLargeClusters] [LinuxOnly] [Suite:k8s]", + + "[Top Level] [sig-network] LoadBalancers should only allow access from service loadbalancer source ranges [Slow]": "should only allow access from service loadbalancer source ranges [Slow] [Suite:k8s]", + + "[Top Level] [sig-network] LoadBalancers should reconcile LB health check interval [Slow][Serial]": "should reconcile LB health check interval [Slow][Serial] [Suite:k8s]", + "[Top Level] [sig-network] Loadbalancing: L7 GCE [Slow] [Feature:Ingress] multicluster ingress should get instance group annotation": "multicluster ingress should get instance group annotation [Suite:k8s]", "[Top Level] [sig-network] Loadbalancing: L7 GCE [Slow] [Feature:Ingress] should conform to Ingress spec": "should conform to Ingress spec [Suite:k8s]", - "[Top Level] [sig-network] Loadbalancing: L7 GCE [Slow] [Feature:NEG] rolling update backend pods should not cause service disruption": "rolling update backend pods should not cause service disruption [Suite:k8s]", + "[Top Level] [sig-network] Loadbalancing: L7 GCE [Slow] [Feature:NEG] [Flaky] rolling update backend pods should not cause service disruption": "rolling update backend pods should not cause service disruption [Suite:k8s]", - "[Top Level] [sig-network] Loadbalancing: L7 GCE [Slow] [Feature:NEG] should be able to create a ClusterIP service": "should be able to create a ClusterIP service [Suite:k8s]", + "[Top Level] [sig-network] Loadbalancing: L7 GCE [Slow] [Feature:NEG] [Flaky] should be able to create a ClusterIP service": "should be able to create a ClusterIP service [Suite:k8s]", - "[Top Level] [sig-network] Loadbalancing: L7 GCE [Slow] [Feature:NEG] should be able to switch between IG and NEG modes": "should be able to switch between IG and NEG modes [Suite:k8s]", + "[Top Level] [sig-network] Loadbalancing: L7 GCE [Slow] [Feature:NEG] [Flaky] should be able to switch between IG and NEG modes": "should be able to switch between IG and NEG modes [Suite:k8s]", - "[Top Level] [sig-network] Loadbalancing: L7 GCE [Slow] [Feature:NEG] should conform to Ingress spec": "should conform to Ingress spec [Suite:k8s]", + "[Top Level] [sig-network] Loadbalancing: L7 GCE [Slow] [Feature:NEG] [Flaky] should conform to Ingress spec": "should conform to Ingress spec [Suite:k8s]", - "[Top Level] [sig-network] Loadbalancing: L7 GCE [Slow] [Feature:NEG] should create NEGs for all ports with the Ingress annotation, and NEGs for the standalone annotation otherwise": "should create NEGs for all ports with the Ingress annotation, and NEGs for the standalone annotation otherwise [Suite:k8s]", + "[Top Level] [sig-network] Loadbalancing: L7 GCE [Slow] [Feature:NEG] [Flaky] should create NEGs for all ports with the Ingress annotation, and NEGs for the standalone annotation otherwise": "should create NEGs for all ports with the Ingress annotation, and NEGs for the standalone annotation otherwise [Suite:k8s]", - "[Top Level] [sig-network] Loadbalancing: L7 GCE [Slow] [Feature:NEG] should sync endpoints for both Ingress-referenced NEG and standalone NEG": "should sync endpoints for both Ingress-referenced NEG and standalone NEG [Suite:k8s]", + "[Top Level] [sig-network] Loadbalancing: L7 GCE [Slow] [Feature:NEG] [Flaky] should sync endpoints for both Ingress-referenced NEG and standalone NEG": "should sync endpoints for both Ingress-referenced NEG and standalone NEG [Suite:k8s]", - "[Top Level] [sig-network] Loadbalancing: L7 GCE [Slow] [Feature:NEG] should sync endpoints to NEG": "should sync endpoints to NEG [Suite:k8s]", + "[Top Level] [sig-network] Loadbalancing: L7 GCE [Slow] [Feature:NEG] [Flaky] should sync endpoints to NEG": "should sync endpoints to NEG [Suite:k8s]", "[Top Level] [sig-network] Loadbalancing: L7 GCE [Slow] [Feature:kubemci] should conform to Ingress spec": "should conform to Ingress spec [Suite:k8s]", @@ -2037,6 +1825,98 @@ var annotations = map[string]string{ "[Top Level] [sig-network] Loadbalancing: L7 [Slow] Nginx should conform to Ingress spec": "should conform to Ingress spec [Suite:k8s]", + "[Top Level] [sig-network] Netpol API should support creating NetworkPolicy API operations": "should support creating NetworkPolicy API operations [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-network] Netpol [Feature:SCTPConnectivity][LinuxOnly][Disruptive] NetworkPolicy between server and client using SCTP should enforce policy based on Ports [Feature:NetworkPolicy]": "should enforce policy based on Ports [Feature:NetworkPolicy] [Disabled:Alpha] [Serial] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", + + "[Top Level] [sig-network] Netpol [Feature:SCTPConnectivity][LinuxOnly][Disruptive] NetworkPolicy between server and client using SCTP should enforce policy to allow traffic only from a pod in a different namespace based on PodSelector and NamespaceSelector [Feature:NetworkPolicy]": "should enforce policy to allow traffic only from a pod in a different namespace based on PodSelector and NamespaceSelector [Feature:NetworkPolicy] [Disabled:Alpha] [Serial] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", + + "[Top Level] [sig-network] Netpol [Feature:SCTPConnectivity][LinuxOnly][Disruptive] NetworkPolicy between server and client using SCTP should support a 'default-deny-ingress' policy [Feature:NetworkPolicy]": "should support a 'default-deny-ingress' policy [Feature:NetworkPolicy] [Disabled:Alpha] [Serial] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", + + "[Top Level] [sig-network] Netpol [Feature:UDPConnectivity][LinuxOnly] NetworkPolicy between server and client using UDP should enforce policy based on Ports [Feature:NetworkPolicy]": "should enforce policy based on Ports [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", + + "[Top Level] [sig-network] Netpol [Feature:UDPConnectivity][LinuxOnly] NetworkPolicy between server and client using UDP should enforce policy to allow traffic only from a pod in a different namespace based on PodSelector and NamespaceSelector [Feature:NetworkPolicy]": "should enforce policy to allow traffic only from a pod in a different namespace based on PodSelector and NamespaceSelector [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", + + "[Top Level] [sig-network] Netpol [Feature:UDPConnectivity][LinuxOnly] NetworkPolicy between server and client using UDP should support a 'default-deny-ingress' policy [Feature:NetworkPolicy]": "should support a 'default-deny-ingress' policy [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", + + "[Top Level] [sig-network] Netpol [LinuxOnly] NetworkPolicy between server and client should allow egress access on one named port [Feature:NetworkPolicy]": "should allow egress access on one named port [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OVNKubernetes] [Skipped:Network/OpenShiftSDN/Multitenant] [Skipped:Network/OpenShiftSDN] [Suite:k8s]", + + "[Top Level] [sig-network] Netpol [LinuxOnly] NetworkPolicy between server and client should allow egress access to server in CIDR block [Feature:NetworkPolicy]": "should allow egress access to server in CIDR block [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Skipped:Network/OpenShiftSDN] [Suite:k8s]", + + "[Top Level] [sig-network] Netpol [LinuxOnly] NetworkPolicy between server and client should allow ingress access from namespace on one named port [Feature:NetworkPolicy]": "should allow ingress access from namespace on one named port [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OVNKubernetes] [Skipped:Network/OpenShiftSDN/Multitenant] [Skipped:Network/OpenShiftSDN] [Suite:k8s]", + + "[Top Level] [sig-network] Netpol [LinuxOnly] NetworkPolicy between server and client should allow ingress access from updated namespace [Feature:NetworkPolicy]": "should allow ingress access from updated namespace [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", + + "[Top Level] [sig-network] Netpol [LinuxOnly] NetworkPolicy between server and client should allow ingress access from updated pod [Feature:NetworkPolicy]": "should allow ingress access from updated pod [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", + + "[Top Level] [sig-network] Netpol [LinuxOnly] NetworkPolicy between server and client should allow ingress access on one named port [Feature:NetworkPolicy]": "should allow ingress access on one named port [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OVNKubernetes] [Skipped:Network/OpenShiftSDN/Multitenant] [Skipped:Network/OpenShiftSDN] [Suite:k8s]", + + "[Top Level] [sig-network] Netpol [LinuxOnly] NetworkPolicy between server and client should deny egress from all pods in a namespace [Feature:NetworkPolicy] ": "should deny egress from all pods in a namespace [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Skipped:Network/OpenShiftSDN] [Suite:k8s]", + + "[Top Level] [sig-network] Netpol [LinuxOnly] NetworkPolicy between server and client should deny egress from pods based on PodSelector [Feature:NetworkPolicy] ": "should deny egress from pods based on PodSelector [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Skipped:Network/OpenShiftSDN] [Suite:k8s]", + + "[Top Level] [sig-network] Netpol [LinuxOnly] NetworkPolicy between server and client should deny ingress access to updated pod [Feature:NetworkPolicy]": "should deny ingress access to updated pod [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", + + "[Top Level] [sig-network] Netpol [LinuxOnly] NetworkPolicy between server and client should deny ingress from pods on other namespaces [Feature:NetworkPolicy]": "should deny ingress from pods on other namespaces [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", + + "[Top Level] [sig-network] Netpol [LinuxOnly] NetworkPolicy between server and client should enforce egress policy allowing traffic to a server in a different namespace based on PodSelector and NamespaceSelector [Feature:NetworkPolicy]": "should enforce egress policy allowing traffic to a server in a different namespace based on PodSelector and NamespaceSelector [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Skipped:Network/OpenShiftSDN] [Suite:k8s]", + + "[Top Level] [sig-network] Netpol [LinuxOnly] NetworkPolicy between server and client should enforce except clause while egress access to server in CIDR block [Feature:NetworkPolicy]": "should enforce except clause while egress access to server in CIDR block [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Skipped:Network/OpenShiftSDN] [Suite:k8s]", + + "[Top Level] [sig-network] Netpol [LinuxOnly] NetworkPolicy between server and client should enforce ingress policy allowing any port traffic to a server on a specific protocol [Feature:NetworkPolicy] [Feature:UDP]": "should enforce ingress policy allowing any port traffic to a server on a specific protocol [Feature:NetworkPolicy] [Feature:UDP] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", + + "[Top Level] [sig-network] Netpol [LinuxOnly] NetworkPolicy between server and client should enforce multiple egress policies with egress allow-all policy taking precedence [Feature:NetworkPolicy]": "should enforce multiple egress policies with egress allow-all policy taking precedence [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Skipped:Network/OpenShiftSDN] [Suite:k8s]", + + "[Top Level] [sig-network] Netpol [LinuxOnly] NetworkPolicy between server and client should enforce multiple ingress policies with ingress allow-all policy taking precedence [Feature:NetworkPolicy]": "should enforce multiple ingress policies with ingress allow-all policy taking precedence [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", + + "[Top Level] [sig-network] Netpol [LinuxOnly] NetworkPolicy between server and client should enforce multiple, stacked policies with overlapping podSelectors [Feature:NetworkPolicy]": "should enforce multiple, stacked policies with overlapping podSelectors [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", + + "[Top Level] [sig-network] Netpol [LinuxOnly] NetworkPolicy between server and client should enforce policies to check ingress and egress policies can be controlled independently based on PodSelector [Feature:NetworkPolicy]": "should enforce policies to check ingress and egress policies can be controlled independently based on PodSelector [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Skipped:Network/OpenShiftSDN] [Suite:k8s]", + + "[Top Level] [sig-network] Netpol [LinuxOnly] NetworkPolicy between server and client should enforce policy based on Multiple PodSelectors and NamespaceSelectors [Feature:NetworkPolicy]": "should enforce policy based on Multiple PodSelectors and NamespaceSelectors [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", + + "[Top Level] [sig-network] Netpol [LinuxOnly] NetworkPolicy between server and client should enforce policy based on NamespaceSelector with MatchExpressions[Feature:NetworkPolicy]": "should enforce policy based on NamespaceSelector with MatchExpressions[Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", + + "[Top Level] [sig-network] Netpol [LinuxOnly] NetworkPolicy between server and client should enforce policy based on PodSelector and NamespaceSelector [Feature:NetworkPolicy]": "should enforce policy based on PodSelector and NamespaceSelector [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", + + "[Top Level] [sig-network] Netpol [LinuxOnly] NetworkPolicy between server and client should enforce policy based on PodSelector or NamespaceSelector [Feature:NetworkPolicy]": "should enforce policy based on PodSelector or NamespaceSelector [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", + + "[Top Level] [sig-network] Netpol [LinuxOnly] NetworkPolicy between server and client should enforce policy based on PodSelector with MatchExpressions[Feature:NetworkPolicy]": "should enforce policy based on PodSelector with MatchExpressions[Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", + + "[Top Level] [sig-network] Netpol [LinuxOnly] NetworkPolicy between server and client should enforce policy based on Ports [Feature:NetworkPolicy]": "should enforce policy based on Ports [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", + + "[Top Level] [sig-network] Netpol [LinuxOnly] NetworkPolicy between server and client should enforce policy based on any PodSelectors [Feature:NetworkPolicy]": "should enforce policy based on any PodSelectors [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", + + "[Top Level] [sig-network] Netpol [LinuxOnly] NetworkPolicy between server and client should enforce policy to allow ingress traffic for a target [Feature:NetworkPolicy] ": "should enforce policy to allow ingress traffic for a target [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", + + "[Top Level] [sig-network] Netpol [LinuxOnly] NetworkPolicy between server and client should enforce policy to allow ingress traffic from pods in all namespaces [Feature:NetworkPolicy]": "should enforce policy to allow ingress traffic from pods in all namespaces [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", + + "[Top Level] [sig-network] Netpol [LinuxOnly] NetworkPolicy between server and client should enforce policy to allow traffic from pods within server namespace based on PodSelector [Feature:NetworkPolicy]": "should enforce policy to allow traffic from pods within server namespace based on PodSelector [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", + + "[Top Level] [sig-network] Netpol [LinuxOnly] NetworkPolicy between server and client should enforce policy to allow traffic only from a different namespace, based on NamespaceSelector [Feature:NetworkPolicy]": "should enforce policy to allow traffic only from a different namespace, based on NamespaceSelector [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", + + "[Top Level] [sig-network] Netpol [LinuxOnly] NetworkPolicy between server and client should enforce policy to allow traffic only from a pod in a different namespace based on PodSelector and NamespaceSelector [Feature:NetworkPolicy]": "should enforce policy to allow traffic only from a pod in a different namespace based on PodSelector and NamespaceSelector [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", + + "[Top Level] [sig-network] Netpol [LinuxOnly] NetworkPolicy between server and client should enforce updated policy [Feature:NetworkPolicy]": "should enforce updated policy [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", + + "[Top Level] [sig-network] Netpol [LinuxOnly] NetworkPolicy between server and client should ensure an IP overlapping both IPBlock.CIDR and IPBlock.Except is allowed [Feature:NetworkPolicy]": "should ensure an IP overlapping both IPBlock.CIDR and IPBlock.Except is allowed [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Skipped:Network/OpenShiftSDN] [Suite:k8s]", + + "[Top Level] [sig-network] Netpol [LinuxOnly] NetworkPolicy between server and client should not allow access by TCP when a policy specifies only SCTP [Feature:NetworkPolicy] [Feature:SCTP]": "should not allow access by TCP when a policy specifies only SCTP [Feature:NetworkPolicy] [Feature:SCTP] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", + + "[Top Level] [sig-network] Netpol [LinuxOnly] NetworkPolicy between server and client should not allow access by TCP when a policy specifies only UDP [Feature:NetworkPolicy] [Feature:UDP]": "should not allow access by TCP when a policy specifies only UDP [Feature:NetworkPolicy] [Feature:UDP] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", + + "[Top Level] [sig-network] Netpol [LinuxOnly] NetworkPolicy between server and client should stop enforcing policies after they are deleted [Feature:NetworkPolicy]": "should stop enforcing policies after they are deleted [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", + + "[Top Level] [sig-network] Netpol [LinuxOnly] NetworkPolicy between server and client should support a 'default-deny-all' policy [Feature:NetworkPolicy]": "should support a 'default-deny-all' policy [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Skipped:Network/OpenShiftSDN] [Suite:k8s]", + + "[Top Level] [sig-network] Netpol [LinuxOnly] NetworkPolicy between server and client should support a 'default-deny-ingress' policy [Feature:NetworkPolicy]": "should support a 'default-deny-ingress' policy [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", + + "[Top Level] [sig-network] Netpol [LinuxOnly] NetworkPolicy between server and client should support allow-all policy [Feature:NetworkPolicy]": "should support allow-all policy [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", + + "[Top Level] [sig-network] Netpol [LinuxOnly] NetworkPolicy between server and client should support denying of egress traffic on the client side (even if the server explicitly allows this traffic) [Feature:NetworkPolicy]": "should support denying of egress traffic on the client side (even if the server explicitly allows this traffic) [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Skipped:Network/OpenShiftSDN] [Suite:k8s]", + + "[Top Level] [sig-network] Netpol [LinuxOnly] NetworkPolicy between server and client should work with Ingress, Egress specified together [Feature:NetworkPolicy]": "should work with Ingress, Egress specified together [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Skipped:Network/OpenShiftSDN] [Suite:k8s]", + "[Top Level] [sig-network] NetworkPolicy API should support creating NetworkPolicy API operations": "should support creating NetworkPolicy API operations [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-network] NetworkPolicy [Feature:SCTPConnectivity][LinuxOnly][Disruptive] NetworkPolicy between server and client using SCTP should enforce policy based on Ports [Feature:NetworkPolicy]": "should enforce policy based on Ports [Feature:NetworkPolicy] [Disabled:Alpha] [Serial] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", @@ -2045,63 +1925,63 @@ var annotations = map[string]string{ "[Top Level] [sig-network] NetworkPolicy [Feature:SCTPConnectivity][LinuxOnly][Disruptive] NetworkPolicy between server and client using SCTP should support a 'default-deny' policy [Feature:NetworkPolicy]": "should support a 'default-deny' policy [Feature:NetworkPolicy] [Disabled:Alpha] [Serial] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", - "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should allow egress access on one named port [Feature:NetworkPolicy]": "should allow egress access on one named port [Feature:NetworkPolicy] [Skipped:Network/OVNKubernetes] [Skipped:Network/OpenShiftSDN/Multitenant] [Skipped:Network/OpenShiftSDN] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should allow egress access on one named port [Feature:NetworkPolicy]": "should allow egress access on one named port [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OVNKubernetes] [Skipped:Network/OpenShiftSDN/Multitenant] [Skipped:Network/OpenShiftSDN] [Suite:k8s]", - "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should allow egress access to server in CIDR block [Feature:NetworkPolicy]": "should allow egress access to server in CIDR block [Feature:NetworkPolicy] [Skipped:Network/OpenShiftSDN/Multitenant] [Skipped:Network/OpenShiftSDN] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should allow egress access to server in CIDR block [Feature:NetworkPolicy]": "should allow egress access to server in CIDR block [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Skipped:Network/OpenShiftSDN] [Suite:k8s]", - "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should allow ingress access from namespace on one named port [Feature:NetworkPolicy]": "should allow ingress access from namespace on one named port [Feature:NetworkPolicy] [Skipped:Network/OVNKubernetes] [Skipped:Network/OpenShiftSDN/Multitenant] [Skipped:Network/OpenShiftSDN] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should allow ingress access from namespace on one named port [Feature:NetworkPolicy]": "should allow ingress access from namespace on one named port [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OVNKubernetes] [Skipped:Network/OpenShiftSDN/Multitenant] [Skipped:Network/OpenShiftSDN] [Suite:k8s]", - "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should allow ingress access from updated namespace [Feature:NetworkPolicy]": "should allow ingress access from updated namespace [Feature:NetworkPolicy] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should allow ingress access from updated namespace [Feature:NetworkPolicy]": "should allow ingress access from updated namespace [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", - "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should allow ingress access from updated pod [Feature:NetworkPolicy]": "should allow ingress access from updated pod [Feature:NetworkPolicy] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should allow ingress access from updated pod [Feature:NetworkPolicy]": "should allow ingress access from updated pod [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", - "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should allow ingress access on one named port [Feature:NetworkPolicy]": "should allow ingress access on one named port [Feature:NetworkPolicy] [Skipped:Network/OVNKubernetes] [Skipped:Network/OpenShiftSDN/Multitenant] [Skipped:Network/OpenShiftSDN] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should allow ingress access on one named port [Feature:NetworkPolicy]": "should allow ingress access on one named port [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OVNKubernetes] [Skipped:Network/OpenShiftSDN/Multitenant] [Skipped:Network/OpenShiftSDN] [Suite:k8s]", - "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should deny ingress access to updated pod [Feature:NetworkPolicy]": "should deny ingress access to updated pod [Feature:NetworkPolicy] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should deny ingress access to updated pod [Feature:NetworkPolicy]": "should deny ingress access to updated pod [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", - "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should enforce egress policy allowing traffic to a server in a different namespace based on PodSelector and NamespaceSelector [Feature:NetworkPolicy]": "should enforce egress policy allowing traffic to a server in a different namespace based on PodSelector and NamespaceSelector [Feature:NetworkPolicy] [Skipped:Network/OpenShiftSDN/Multitenant] [Skipped:Network/OpenShiftSDN] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should enforce egress policy allowing traffic to a server in a different namespace based on PodSelector and NamespaceSelector [Feature:NetworkPolicy]": "should enforce egress policy allowing traffic to a server in a different namespace based on PodSelector and NamespaceSelector [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Skipped:Network/OpenShiftSDN] [Suite:k8s]", - "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should enforce except clause while egress access to server in CIDR block [Feature:NetworkPolicy]": "should enforce except clause while egress access to server in CIDR block [Feature:NetworkPolicy] [Skipped:Network/OpenShiftSDN/Multitenant] [Skipped:Network/OpenShiftSDN] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should enforce except clause while egress access to server in CIDR block [Feature:NetworkPolicy]": "should enforce except clause while egress access to server in CIDR block [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Skipped:Network/OpenShiftSDN] [Suite:k8s]", - "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should enforce multiple egress policies with egress allow-all policy taking precedence [Feature:NetworkPolicy]": "should enforce multiple egress policies with egress allow-all policy taking precedence [Feature:NetworkPolicy] [Skipped:Network/OpenShiftSDN/Multitenant] [Skipped:Network/OpenShiftSDN] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should enforce multiple egress policies with egress allow-all policy taking precedence [Feature:NetworkPolicy]": "should enforce multiple egress policies with egress allow-all policy taking precedence [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Skipped:Network/OpenShiftSDN] [Suite:k8s]", - "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should enforce multiple ingress policies with ingress allow-all policy taking precedence [Feature:NetworkPolicy]": "should enforce multiple ingress policies with ingress allow-all policy taking precedence [Feature:NetworkPolicy] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should enforce multiple ingress policies with ingress allow-all policy taking precedence [Feature:NetworkPolicy]": "should enforce multiple ingress policies with ingress allow-all policy taking precedence [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", - "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should enforce multiple, stacked policies with overlapping podSelectors [Feature:NetworkPolicy]": "should enforce multiple, stacked policies with overlapping podSelectors [Feature:NetworkPolicy] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should enforce multiple, stacked policies with overlapping podSelectors [Feature:NetworkPolicy]": "should enforce multiple, stacked policies with overlapping podSelectors [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", - "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should enforce policies to check ingress and egress policies can be controlled independently based on PodSelector [Feature:NetworkPolicy]": "should enforce policies to check ingress and egress policies can be controlled independently based on PodSelector [Feature:NetworkPolicy] [Skipped:Network/OpenShiftSDN/Multitenant] [Skipped:Network/OpenShiftSDN] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should enforce policies to check ingress and egress policies can be controlled independently based on PodSelector [Feature:NetworkPolicy]": "should enforce policies to check ingress and egress policies can be controlled independently based on PodSelector [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Skipped:Network/OpenShiftSDN] [Suite:k8s]", - "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should enforce policy based on NamespaceSelector with MatchExpressions[Feature:NetworkPolicy]": "should enforce policy based on NamespaceSelector with MatchExpressions[Feature:NetworkPolicy] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should enforce policy based on NamespaceSelector with MatchExpressions[Feature:NetworkPolicy]": "should enforce policy based on NamespaceSelector with MatchExpressions[Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", - "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should enforce policy based on PodSelector and NamespaceSelector [Feature:NetworkPolicy]": "should enforce policy based on PodSelector and NamespaceSelector [Feature:NetworkPolicy] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should enforce policy based on PodSelector and NamespaceSelector [Feature:NetworkPolicy]": "should enforce policy based on PodSelector and NamespaceSelector [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", - "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should enforce policy based on PodSelector or NamespaceSelector [Feature:NetworkPolicy]": "should enforce policy based on PodSelector or NamespaceSelector [Feature:NetworkPolicy] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should enforce policy based on PodSelector or NamespaceSelector [Feature:NetworkPolicy]": "should enforce policy based on PodSelector or NamespaceSelector [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", - "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should enforce policy based on PodSelector with MatchExpressions[Feature:NetworkPolicy]": "should enforce policy based on PodSelector with MatchExpressions[Feature:NetworkPolicy] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should enforce policy based on PodSelector with MatchExpressions[Feature:NetworkPolicy]": "should enforce policy based on PodSelector with MatchExpressions[Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", - "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should enforce policy based on Ports [Feature:NetworkPolicy]": "should enforce policy based on Ports [Feature:NetworkPolicy] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should enforce policy based on Ports [Feature:NetworkPolicy]": "should enforce policy based on Ports [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", - "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should enforce policy to allow traffic from pods within server namespace based on PodSelector [Feature:NetworkPolicy]": "should enforce policy to allow traffic from pods within server namespace based on PodSelector [Feature:NetworkPolicy] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should enforce policy to allow traffic from pods within server namespace based on PodSelector [Feature:NetworkPolicy]": "should enforce policy to allow traffic from pods within server namespace based on PodSelector [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", - "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should enforce policy to allow traffic only from a different namespace, based on NamespaceSelector [Feature:NetworkPolicy]": "should enforce policy to allow traffic only from a different namespace, based on NamespaceSelector [Feature:NetworkPolicy] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should enforce policy to allow traffic only from a different namespace, based on NamespaceSelector [Feature:NetworkPolicy]": "should enforce policy to allow traffic only from a different namespace, based on NamespaceSelector [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", - "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should enforce policy to allow traffic only from a pod in a different namespace based on PodSelector and NamespaceSelector [Feature:NetworkPolicy]": "should enforce policy to allow traffic only from a pod in a different namespace based on PodSelector and NamespaceSelector [Feature:NetworkPolicy] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should enforce policy to allow traffic only from a pod in a different namespace based on PodSelector and NamespaceSelector [Feature:NetworkPolicy]": "should enforce policy to allow traffic only from a pod in a different namespace based on PodSelector and NamespaceSelector [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", - "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should enforce updated policy [Feature:NetworkPolicy]": "should enforce updated policy [Feature:NetworkPolicy] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should enforce updated policy [Feature:NetworkPolicy]": "should enforce updated policy [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", - "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should ensure an IP overlapping both IPBlock.CIDR and IPBlock.Except is allowed [Feature:NetworkPolicy]": "should ensure an IP overlapping both IPBlock.CIDR and IPBlock.Except is allowed [Feature:NetworkPolicy] [Skipped:Network/OpenShiftSDN/Multitenant] [Skipped:Network/OpenShiftSDN] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should ensure an IP overlapping both IPBlock.CIDR and IPBlock.Except is allowed [Feature:NetworkPolicy]": "should ensure an IP overlapping both IPBlock.CIDR and IPBlock.Except is allowed [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Skipped:Network/OpenShiftSDN] [Suite:k8s]", - "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should not allow access by TCP when a policy specifies only SCTP [Feature:NetworkPolicy] [Feature:SCTP]": "should not allow access by TCP when a policy specifies only SCTP [Feature:NetworkPolicy] [Feature:SCTP] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should not allow access by TCP when a policy specifies only SCTP [Feature:NetworkPolicy] [Feature:SCTP]": "should not allow access by TCP when a policy specifies only SCTP [Feature:NetworkPolicy] [Feature:SCTP] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", - "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should stop enforcing policies after they are deleted [Feature:NetworkPolicy]": "should stop enforcing policies after they are deleted [Feature:NetworkPolicy] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should stop enforcing policies after they are deleted [Feature:NetworkPolicy]": "should stop enforcing policies after they are deleted [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", - "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should support a 'default-deny-all' policy [Feature:NetworkPolicy]": "should support a 'default-deny-all' policy [Feature:NetworkPolicy] [Skipped:Network/OpenShiftSDN/Multitenant] [Skipped:Network/OpenShiftSDN] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should support a 'default-deny-all' policy [Feature:NetworkPolicy]": "should support a 'default-deny-all' policy [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Skipped:Network/OpenShiftSDN] [Suite:k8s]", - "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should support a 'default-deny-ingress' policy [Feature:NetworkPolicy]": "should support a 'default-deny-ingress' policy [Feature:NetworkPolicy] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should support a 'default-deny-ingress' policy [Feature:NetworkPolicy]": "should support a 'default-deny-ingress' policy [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", - "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should support allow-all policy [Feature:NetworkPolicy]": "should support allow-all policy [Feature:NetworkPolicy] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should support allow-all policy [Feature:NetworkPolicy]": "should support allow-all policy [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Suite:k8s]", - "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should work with Ingress,Egress specified together [Feature:NetworkPolicy]": "should work with Ingress,Egress specified together [Feature:NetworkPolicy] [Skipped:Network/OpenShiftSDN/Multitenant] [Skipped:Network/OpenShiftSDN] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-network] NetworkPolicy [LinuxOnly] NetworkPolicy between server and client should work with Ingress,Egress specified together [Feature:NetworkPolicy]": "should work with Ingress,Egress specified together [Feature:NetworkPolicy] [Disabled:Alpha] [Skipped:Network/OpenShiftSDN/Multitenant] [Skipped:Network/OpenShiftSDN] [Suite:k8s]", "[Top Level] [sig-network] Networking Granular Checks: Pods should function for intra-pod communication: http [NodeConformance] [Conformance]": "should function for intra-pod communication: http [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", @@ -2137,7 +2017,7 @@ var annotations = map[string]string{ "[Top Level] [sig-network] Networking Granular Checks: Services should function for node-Service: udp": "should function for node-Service: udp [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-network] Networking Granular Checks: Services should function for pod-Service(hostNetwork): udp": "should function for pod-Service(hostNetwork): udp [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-network] Networking Granular Checks: Services should function for pod-Service(hostNetwork): udp": "should function for pod-Service(hostNetwork): udp [Disabled:Broken] [Suite:k8s]", "[Top Level] [sig-network] Networking Granular Checks: Services should function for pod-Service: http": "should function for pod-Service: http [Suite:openshift/conformance/parallel] [Suite:k8s]", @@ -2157,7 +2037,7 @@ var annotations = map[string]string{ "[Top Level] [sig-network] Networking Granular Checks: Services should update nodePort: udp [Slow]": "should update nodePort: udp [Slow] [Suite:k8s]", - "[Top Level] [sig-network] Networking IPerf [Experimental] [Slow] [Feature:Networking-Performance] should transfer ~ 1GB onto the service endpoint 1 servers (maximum of 1 clients)": "should transfer ~ 1GB onto the service endpoint 1 servers (maximum of 1 clients) [Suite:k8s]", + "[Top Level] [sig-network] Networking IPerf2 [Feature:Networking-Performance] should run iperf2": "should run iperf2 [Disabled:Broken] [Suite:k8s]", "[Top Level] [sig-network] Networking should check kube-proxy urls": "should check kube-proxy urls [Disabled:Broken] [Suite:k8s]", @@ -2171,6 +2051,8 @@ var annotations = map[string]string{ "[Top Level] [sig-network] NoSNAT [Feature:NoSNAT] [Slow] Should be able to send traffic between Pods without SNAT": "Should be able to send traffic between Pods without SNAT [Suite:k8s]", + "[Top Level] [sig-network] Proxy version v1 A set of valid responses are returned for both pod and service ProxyWithPath [Conformance]": "A set of valid responses are returned for both pod and service ProxyWithPath [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + "[Top Level] [sig-network] Proxy version v1 should proxy logs on node using proxy subresource ": "should proxy logs on node using proxy subresource [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-network] Proxy version v1 should proxy logs on node with explicit kubelet port using proxy subresource ": "should proxy logs on node with explicit kubelet port using proxy subresource [Suite:openshift/conformance/parallel] [Suite:k8s]", @@ -2189,8 +2071,6 @@ var annotations = map[string]string{ "[Top Level] [sig-network] Services should allow pods to hairpin back to themselves through services": "should allow pods to hairpin back to themselves through services [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-network] Services should be able to change the type and ports of a service [Slow] [DisabledForLargeClusters]": "should be able to change the type and ports of a service [Slow] [DisabledForLargeClusters] [Suite:k8s]", - "[Top Level] [sig-network] Services should be able to change the type from ClusterIP to ExternalName [Conformance]": "should be able to change the type from ClusterIP to ExternalName [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", "[Top Level] [sig-network] Services should be able to change the type from ExternalName to ClusterIP [Conformance]": "should be able to change the type from ExternalName to ClusterIP [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", @@ -2201,12 +2081,6 @@ var annotations = map[string]string{ "[Top Level] [sig-network] Services should be able to create a functioning NodePort service [Conformance]": "should be able to create a functioning NodePort service [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - "[Top Level] [sig-network] Services should be able to create an internal type load balancer [Slow]": "should be able to create an internal type load balancer [Slow] [Suite:k8s]", - - "[Top Level] [sig-network] Services should be able to switch session affinity for LoadBalancer service with ESIPP off [Slow] [DisabledForLargeClusters] [LinuxOnly]": "should be able to switch session affinity for LoadBalancer service with ESIPP off [Slow] [DisabledForLargeClusters] [LinuxOnly] [Suite:k8s]", - - "[Top Level] [sig-network] Services should be able to switch session affinity for LoadBalancer service with ESIPP on [Slow] [DisabledForLargeClusters] [LinuxOnly]": "should be able to switch session affinity for LoadBalancer service with ESIPP on [Slow] [DisabledForLargeClusters] [LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-network] Services should be able to switch session affinity for NodePort service [LinuxOnly] [Conformance]": "should be able to switch session affinity for NodePort service [LinuxOnly] [Conformance] [Skipped:Network/OVNKubernetes] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", "[Top Level] [sig-network] Services should be able to switch session affinity for service with type clusterIP [LinuxOnly] [Conformance]": "should be able to switch session affinity for service with type clusterIP [LinuxOnly] [Conformance] [Skipped:Network/OVNKubernetes] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", @@ -2215,24 +2089,22 @@ var annotations = map[string]string{ "[Top Level] [sig-network] Services should be able to update service type to NodePort listening on same port number but different protocols": "should be able to update service type to NodePort listening on same port number but different protocols [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-network] Services should be possible to connect to a service via ExternalIP when the external IP is not assigned to a node": "should be possible to connect to a service via ExternalIP when the external IP is not assigned to a node [Disabled:Broken] [Suite:k8s]", + "[Top Level] [sig-network] Services should be rejected when no endpoints exist": "should be rejected when no endpoints exist [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-network] Services should check NodePort out-of-range": "should check NodePort out-of-range [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-network] Services should complete a service status lifecycle [Conformance]": "should complete a service status lifecycle [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + "[Top Level] [sig-network] Services should create endpoints for unready pods": "should create endpoints for unready pods [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-network] Services should find a service from listing all namespaces [Conformance]": "should find a service from listing all namespaces [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - "[Top Level] [sig-network] Services should handle load balancer cleanup finalizer for service [Slow]": "should handle load balancer cleanup finalizer for service [Slow] [Suite:k8s]", - "[Top Level] [sig-network] Services should have session affinity timeout work for NodePort service [LinuxOnly] [Conformance]": "should have session affinity timeout work for NodePort service [LinuxOnly] [Conformance] [Skipped:Network/OVNKubernetes] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", "[Top Level] [sig-network] Services should have session affinity timeout work for service with type clusterIP [LinuxOnly] [Conformance]": "should have session affinity timeout work for service with type clusterIP [LinuxOnly] [Conformance] [Skipped:Network/OVNKubernetes] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - "[Top Level] [sig-network] Services should have session affinity work for LoadBalancer service with ESIPP off [Slow] [DisabledForLargeClusters] [LinuxOnly]": "should have session affinity work for LoadBalancer service with ESIPP off [Slow] [DisabledForLargeClusters] [LinuxOnly] [Suite:k8s]", - - "[Top Level] [sig-network] Services should have session affinity work for LoadBalancer service with ESIPP on [Slow] [DisabledForLargeClusters] [LinuxOnly]": "should have session affinity work for LoadBalancer service with ESIPP on [Slow] [DisabledForLargeClusters] [LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-network] Services should have session affinity work for NodePort service [LinuxOnly] [Conformance]": "should have session affinity work for NodePort service [LinuxOnly] [Conformance] [Skipped:Network/OVNKubernetes] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", "[Top Level] [sig-network] Services should have session affinity work for service with type clusterIP [LinuxOnly] [Conformance]": "should have session affinity work for service with type clusterIP [LinuxOnly] [Conformance] [Skipped:Network/OVNKubernetes] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", @@ -2241,16 +2113,12 @@ var annotations = map[string]string{ "[Top Level] [sig-network] Services should implement service.kubernetes.io/service-proxy-name": "should implement service.kubernetes.io/service-proxy-name [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-network] Services should only allow access from service loadbalancer source ranges [Slow]": "should only allow access from service loadbalancer source ranges [Slow] [Suite:k8s]", - "[Top Level] [sig-network] Services should preserve source pod IP for traffic thru service cluster IP [LinuxOnly]": "should preserve source pod IP for traffic thru service cluster IP [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-network] Services should prevent NodePort collisions": "should prevent NodePort collisions [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-network] Services should provide secure master service [Conformance]": "should provide secure master service [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - "[Top Level] [sig-network] Services should reconcile LB health check interval [Slow][Serial]": "should reconcile LB health check interval [Slow][Serial] [Suite:k8s]", - "[Top Level] [sig-network] Services should release NodePorts on delete": "should release NodePorts on delete [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-network] Services should serve a basic endpoint from pods [Conformance]": "should serve a basic endpoint from pods [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", @@ -2263,49 +2131,51 @@ var annotations = map[string]string{ "[Top Level] [sig-network] Services should work after restarting kube-proxy [Disruptive]": "should work after restarting kube-proxy [Disruptive] [Serial] [Suite:k8s]", - "[Top Level] [sig-network] [Feature:IPv6DualStackAlphaFeature] [LinuxOnly] Granular Checks: Services Secondary IP Family should be able to handle large requests: http": "should be able to handle large requests: http [Disabled:Alpha] [Suite:k8s]", + "[Top Level] [sig-network] [Feature:IPv6DualStack] [LinuxOnly] Granular Checks: Services Secondary IP Family should be able to handle large requests: http": "should be able to handle large requests: http [Disabled:Broken] [Suite:k8s]", + + "[Top Level] [sig-network] [Feature:IPv6DualStack] [LinuxOnly] Granular Checks: Services Secondary IP Family should be able to handle large requests: udp": "should be able to handle large requests: udp [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-network] [Feature:IPv6DualStackAlphaFeature] [LinuxOnly] Granular Checks: Services Secondary IP Family should be able to handle large requests: udp": "should be able to handle large requests: udp [Disabled:Alpha] [Suite:k8s]", + "[Top Level] [sig-network] [Feature:IPv6DualStack] [LinuxOnly] Granular Checks: Services Secondary IP Family should function for client IP based session affinity: http [LinuxOnly]": "should function for client IP based session affinity: http [LinuxOnly] [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-network] [Feature:IPv6DualStackAlphaFeature] [LinuxOnly] Granular Checks: Services Secondary IP Family should function for client IP based session affinity: http [LinuxOnly]": "should function for client IP based session affinity: http [LinuxOnly] [Disabled:Alpha] [Suite:k8s]", + "[Top Level] [sig-network] [Feature:IPv6DualStack] [LinuxOnly] Granular Checks: Services Secondary IP Family should function for client IP based session affinity: udp [LinuxOnly]": "should function for client IP based session affinity: udp [LinuxOnly] [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-network] [Feature:IPv6DualStackAlphaFeature] [LinuxOnly] Granular Checks: Services Secondary IP Family should function for client IP based session affinity: udp [LinuxOnly]": "should function for client IP based session affinity: udp [LinuxOnly] [Disabled:Alpha] [Suite:k8s]", + "[Top Level] [sig-network] [Feature:IPv6DualStack] [LinuxOnly] Granular Checks: Services Secondary IP Family should function for endpoint-Service: http": "should function for endpoint-Service: http [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-network] [Feature:IPv6DualStackAlphaFeature] [LinuxOnly] Granular Checks: Services Secondary IP Family should function for endpoint-Service: http": "should function for endpoint-Service: http [Disabled:Alpha] [Suite:k8s]", + "[Top Level] [sig-network] [Feature:IPv6DualStack] [LinuxOnly] Granular Checks: Services Secondary IP Family should function for endpoint-Service: udp": "should function for endpoint-Service: udp [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-network] [Feature:IPv6DualStackAlphaFeature] [LinuxOnly] Granular Checks: Services Secondary IP Family should function for endpoint-Service: udp": "should function for endpoint-Service: udp [Disabled:Alpha] [Suite:k8s]", + "[Top Level] [sig-network] [Feature:IPv6DualStack] [LinuxOnly] Granular Checks: Services Secondary IP Family should function for node-Service: http": "should function for node-Service: http [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-network] [Feature:IPv6DualStackAlphaFeature] [LinuxOnly] Granular Checks: Services Secondary IP Family should function for node-Service: http": "should function for node-Service: http [Disabled:Alpha] [Suite:k8s]", + "[Top Level] [sig-network] [Feature:IPv6DualStack] [LinuxOnly] Granular Checks: Services Secondary IP Family should function for node-Service: udp": "should function for node-Service: udp [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-network] [Feature:IPv6DualStackAlphaFeature] [LinuxOnly] Granular Checks: Services Secondary IP Family should function for node-Service: udp": "should function for node-Service: udp [Disabled:Alpha] [Suite:k8s]", + "[Top Level] [sig-network] [Feature:IPv6DualStack] [LinuxOnly] Granular Checks: Services Secondary IP Family should function for pod-Service: http": "should function for pod-Service: http [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-network] [Feature:IPv6DualStackAlphaFeature] [LinuxOnly] Granular Checks: Services Secondary IP Family should function for pod-Service: http": "should function for pod-Service: http [Disabled:Alpha] [Suite:k8s]", + "[Top Level] [sig-network] [Feature:IPv6DualStack] [LinuxOnly] Granular Checks: Services Secondary IP Family should function for pod-Service: sctp [Feature:SCTPConnectivity][Disruptive]": "should function for pod-Service: sctp [Feature:SCTPConnectivity][Disruptive] [Disabled:Alpha] [Disabled:Broken] [Serial] [Suite:k8s]", - "[Top Level] [sig-network] [Feature:IPv6DualStackAlphaFeature] [LinuxOnly] Granular Checks: Services Secondary IP Family should function for pod-Service: sctp [Feature:SCTPConnectivity][Disruptive]": "should function for pod-Service: sctp [Feature:SCTPConnectivity][Disruptive] [Disabled:Alpha] [Serial] [Suite:k8s]", + "[Top Level] [sig-network] [Feature:IPv6DualStack] [LinuxOnly] Granular Checks: Services Secondary IP Family should function for pod-Service: udp": "should function for pod-Service: udp [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-network] [Feature:IPv6DualStackAlphaFeature] [LinuxOnly] Granular Checks: Services Secondary IP Family should function for pod-Service: udp": "should function for pod-Service: udp [Disabled:Alpha] [Suite:k8s]", + "[Top Level] [sig-network] [Feature:IPv6DualStack] [LinuxOnly] Granular Checks: Services Secondary IP Family should function for service endpoints using hostNetwork": "should function for service endpoints using hostNetwork [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-network] [Feature:IPv6DualStackAlphaFeature] [LinuxOnly] Granular Checks: Services Secondary IP Family should update endpoints: http": "should update endpoints: http [Disabled:Alpha] [Suite:k8s]", + "[Top Level] [sig-network] [Feature:IPv6DualStack] [LinuxOnly] Granular Checks: Services Secondary IP Family should update endpoints: http": "should update endpoints: http [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-network] [Feature:IPv6DualStackAlphaFeature] [LinuxOnly] Granular Checks: Services Secondary IP Family should update endpoints: udp": "should update endpoints: udp [Disabled:Alpha] [Suite:k8s]", + "[Top Level] [sig-network] [Feature:IPv6DualStack] [LinuxOnly] Granular Checks: Services Secondary IP Family should update endpoints: udp": "should update endpoints: udp [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-network] [Feature:IPv6DualStackAlphaFeature] [LinuxOnly] should be able to reach pod on ipv4 and ipv6 ip [Feature:IPv6DualStackAlphaFeature:Phase2]": "should be able to reach pod on ipv4 and ipv6 ip [Feature:IPv6DualStackAlphaFeature:Phase2] [Disabled:Alpha] [Suite:k8s]", + "[Top Level] [sig-network] [Feature:IPv6DualStack] [LinuxOnly] should be able to reach pod on ipv4 and ipv6 ip [Feature:IPv6DualStack]": "should be able to reach pod on ipv4 and ipv6 ip [Feature:IPv6DualStack] [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-network] [Feature:IPv6DualStackAlphaFeature] [LinuxOnly] should create a single stack service with cluster ip from primary service range [Feature:IPv6DualStackAlphaFeature:Phase2]": "should create a single stack service with cluster ip from primary service range [Feature:IPv6DualStackAlphaFeature:Phase2] [Disabled:Alpha] [Suite:k8s]", + "[Top Level] [sig-network] [Feature:IPv6DualStack] [LinuxOnly] should create a single stack service with cluster ip from primary service range [Feature:IPv6DualStack]": "should create a single stack service with cluster ip from primary service range [Feature:IPv6DualStack] [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-network] [Feature:IPv6DualStackAlphaFeature] [LinuxOnly] should create pod, add ipv6 and ipv4 ip to pod ips": "should create pod, add ipv6 and ipv4 ip to pod ips [Disabled:Alpha] [Suite:k8s]", + "[Top Level] [sig-network] [Feature:IPv6DualStack] [LinuxOnly] should create pod, add ipv6 and ipv4 ip to pod ips": "should create pod, add ipv6 and ipv4 ip to pod ips [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-network] [Feature:IPv6DualStackAlphaFeature] [LinuxOnly] should create service with ipv4 cluster ip [Feature:IPv6DualStackAlphaFeature:Phase2]": "should create service with ipv4 cluster ip [Feature:IPv6DualStackAlphaFeature:Phase2] [Disabled:Alpha] [Suite:k8s]", + "[Top Level] [sig-network] [Feature:IPv6DualStack] [LinuxOnly] should create service with ipv4 cluster ip [Feature:IPv6DualStack]": "should create service with ipv4 cluster ip [Feature:IPv6DualStack] [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-network] [Feature:IPv6DualStackAlphaFeature] [LinuxOnly] should create service with ipv4,v6 cluster ip [Feature:IPv6DualStackAlphaFeature:Phase2]": "should create service with ipv4,v6 cluster ip [Feature:IPv6DualStackAlphaFeature:Phase2] [Disabled:Alpha] [Suite:k8s]", + "[Top Level] [sig-network] [Feature:IPv6DualStack] [LinuxOnly] should create service with ipv4,v6 cluster ip [Feature:IPv6DualStack]": "should create service with ipv4,v6 cluster ip [Feature:IPv6DualStack] [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-network] [Feature:IPv6DualStackAlphaFeature] [LinuxOnly] should create service with ipv6 cluster ip [Feature:IPv6DualStackAlphaFeature:Phase2]": "should create service with ipv6 cluster ip [Feature:IPv6DualStackAlphaFeature:Phase2] [Disabled:Alpha] [Suite:k8s]", + "[Top Level] [sig-network] [Feature:IPv6DualStack] [LinuxOnly] should create service with ipv6 cluster ip [Feature:IPv6DualStack]": "should create service with ipv6 cluster ip [Feature:IPv6DualStack] [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-network] [Feature:IPv6DualStackAlphaFeature] [LinuxOnly] should create service with ipv6,v4 cluster ip [Feature:IPv6DualStackAlphaFeature:Phase2]": "should create service with ipv6,v4 cluster ip [Feature:IPv6DualStackAlphaFeature:Phase2] [Disabled:Alpha] [Suite:k8s]", + "[Top Level] [sig-network] [Feature:IPv6DualStack] [LinuxOnly] should create service with ipv6,v4 cluster ip [Feature:IPv6DualStack]": "should create service with ipv6,v4 cluster ip [Feature:IPv6DualStack] [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-network] [Feature:IPv6DualStackAlphaFeature] [LinuxOnly] should have ipv4 and ipv6 internal node ip": "should have ipv4 and ipv6 internal node ip [Disabled:Alpha] [Suite:k8s]", + "[Top Level] [sig-network] [Feature:IPv6DualStack] [LinuxOnly] should have ipv4 and ipv6 internal node ip": "should have ipv4 and ipv6 internal node ip [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-network] [Feature:IPv6DualStackAlphaFeature] [LinuxOnly] should have ipv4 and ipv6 node podCIDRs": "should have ipv4 and ipv6 node podCIDRs [Disabled:Alpha] [Suite:k8s]", + "[Top Level] [sig-network] [Feature:IPv6DualStack] [LinuxOnly] should have ipv4 and ipv6 node podCIDRs": "should have ipv4 and ipv6 node podCIDRs [Disabled:Broken] [Suite:k8s]", "[Top Level] [sig-network] [Feature:PerformanceDNS][Serial] Should answer DNS query for maximum number of services per cluster": "Should answer DNS query for maximum number of services per cluster [Slow] [Suite:k8s]", @@ -2385,6 +2255,10 @@ var annotations = map[string]string{ "[Top Level] [sig-network][endpoints] admission TestEndpointAdmission": "TestEndpointAdmission [Suite:openshift/conformance/parallel]", + "[Top Level] [sig-node] AppArmor load AppArmor profiles can disable an AppArmor profile, using unconfined": "can disable an AppArmor profile, using unconfined [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-node] AppArmor load AppArmor profiles should enforce an AppArmor profile": "should enforce an AppArmor profile [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-node] ConfigMap should be consumable via environment variable [NodeConformance] [Conformance]": "should be consumable via environment variable [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", "[Top Level] [sig-node] ConfigMap should be consumable via the environment [NodeConformance] [Conformance]": "should be consumable via the environment [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", @@ -2395,6 +2269,46 @@ var annotations = map[string]string{ "[Top Level] [sig-node] ConfigMap should update ConfigMap successfully": "should update ConfigMap successfully [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-node] Container Lifecycle Hook when create a pod with lifecycle hook should execute poststart exec hook properly [NodeConformance] [Conformance]": "should execute poststart exec hook properly [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Container Lifecycle Hook when create a pod with lifecycle hook should execute poststart http hook properly [NodeConformance] [Conformance]": "should execute poststart http hook properly [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Container Lifecycle Hook when create a pod with lifecycle hook should execute prestop exec hook properly [NodeConformance] [Conformance]": "should execute prestop exec hook properly [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Container Lifecycle Hook when create a pod with lifecycle hook should execute prestop http hook properly [NodeConformance] [Conformance]": "should execute prestop http hook properly [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Container Runtime blackbox test on terminated container should report termination message [LinuxOnly] as empty when pod succeeds and TerminationMessagePolicy FallbackToLogsOnError is set [NodeConformance] [Conformance]": "should report termination message [LinuxOnly] as empty when pod succeeds and TerminationMessagePolicy FallbackToLogsOnError is set [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Container Runtime blackbox test on terminated container should report termination message [LinuxOnly] from file when pod succeeds and TerminationMessagePolicy FallbackToLogsOnError is set [NodeConformance] [Conformance]": "should report termination message [LinuxOnly] from file when pod succeeds and TerminationMessagePolicy FallbackToLogsOnError is set [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Container Runtime blackbox test on terminated container should report termination message [LinuxOnly] from log output if TerminationMessagePolicy FallbackToLogsOnError is set [NodeConformance] [Conformance]": "should report termination message [LinuxOnly] from log output if TerminationMessagePolicy FallbackToLogsOnError is set [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Container Runtime blackbox test on terminated container should report termination message [LinuxOnly] if TerminationMessagePath is set [NodeConformance]": "should report termination message [LinuxOnly] if TerminationMessagePath is set [NodeConformance] [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-node] Container Runtime blackbox test on terminated container should report termination message [LinuxOnly] if TerminationMessagePath is set as non-root user and at a non-default path [NodeConformance] [Conformance]": "should report termination message [LinuxOnly] if TerminationMessagePath is set as non-root user and at a non-default path [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Container Runtime blackbox test when running a container with a new image should be able to pull from private registry with secret [NodeConformance]": "should be able to pull from private registry with secret [NodeConformance] [Disabled:Broken] [Suite:k8s]", + + "[Top Level] [sig-node] Container Runtime blackbox test when running a container with a new image should be able to pull image [NodeConformance]": "should be able to pull image [NodeConformance] [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-node] Container Runtime blackbox test when running a container with a new image should not be able to pull from private registry without secret [NodeConformance]": "should not be able to pull from private registry without secret [NodeConformance] [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-node] Container Runtime blackbox test when running a container with a new image should not be able to pull image from invalid registry [NodeConformance]": "should not be able to pull image from invalid registry [NodeConformance] [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-node] Container Runtime blackbox test when starting a container that exits should run with the expected status [NodeConformance] [Conformance]": "should run with the expected status [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Docker Containers should be able to override the image's default arguments (docker cmd) [NodeConformance] [Conformance]": "should be able to override the image's default arguments (docker cmd) [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Docker Containers should be able to override the image's default command (docker entrypoint) [NodeConformance] [Conformance]": "should be able to override the image's default command (docker entrypoint) [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Docker Containers should be able to override the image's default command and arguments [NodeConformance] [Conformance]": "should be able to override the image's default command and arguments [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Docker Containers should use the image defaults if command and args are blank [NodeConformance] [Conformance]": "should use the image defaults if command and args are blank [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Downward API [Serial] [Disruptive] [NodeFeature:DownwardAPIHugePages] Downward API tests for hugepages should provide container's limits.hugepages- and requests.hugepages- as env vars": "should provide container's limits.hugepages- and requests.hugepages- as env vars [Suite:k8s]", + + "[Top Level] [sig-node] Downward API [Serial] [Disruptive] [NodeFeature:DownwardAPIHugePages] Downward API tests for hugepages should provide default limits.hugepages- from node allocatable": "should provide default limits.hugepages- from node allocatable [Suite:k8s]", + "[Top Level] [sig-node] Downward API should provide container's limits.cpu/memory and requests.cpu/memory as env vars [NodeConformance] [Conformance]": "should provide container's limits.cpu/memory and requests.cpu/memory as env vars [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", "[Top Level] [sig-node] Downward API should provide default limits.cpu/memory from node allocatable [NodeConformance] [Conformance]": "should provide default limits.cpu/memory from node allocatable [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", @@ -2407,12 +2321,140 @@ var annotations = map[string]string{ "[Top Level] [sig-node] Downward API should provide pod name, namespace and IP address as env vars [NodeConformance] [Conformance]": "should provide pod name, namespace and IP address as env vars [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + "[Top Level] [sig-node] Events should be sent by kubelets and the scheduler about pods scheduling and running [Conformance]": "should be sent by kubelets and the scheduler about pods scheduling and running [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] InitContainer [NodeConformance] should invoke init containers on a RestartAlways pod [Conformance]": "should invoke init containers on a RestartAlways pod [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] InitContainer [NodeConformance] should invoke init containers on a RestartNever pod [Conformance]": "should invoke init containers on a RestartNever pod [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] InitContainer [NodeConformance] should not start app containers and fail the pod if init containers fail on a RestartNever pod [Conformance]": "should not start app containers and fail the pod if init containers fail on a RestartNever pod [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] InitContainer [NodeConformance] should not start app containers if init containers fail on a RestartAlways pod [Conformance]": "should not start app containers if init containers fail on a RestartAlways pod [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Kubelet [Serial] [Slow] experimental resource usage tracking [Feature:ExperimentalResourceUsageTracking] resource tracking for 100 pods per node": "resource tracking for 100 pods per node [Suite:k8s]", + + "[Top Level] [sig-node] Kubelet [Serial] [Slow] regular resource usage tracking [Feature:RegularResourceUsageTracking] resource tracking for 0 pods per node": "resource tracking for 0 pods per node [Suite:k8s]", + + "[Top Level] [sig-node] Kubelet [Serial] [Slow] regular resource usage tracking [Feature:RegularResourceUsageTracking] resource tracking for 100 pods per node": "resource tracking for 100 pods per node [Suite:k8s]", + + "[Top Level] [sig-node] Kubelet when scheduling a busybox Pod with hostAliases should write entries to /etc/hosts [LinuxOnly] [NodeConformance] [Conformance]": "should write entries to /etc/hosts [LinuxOnly] [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Kubelet when scheduling a busybox command in a pod should print the output to logs [NodeConformance] [Conformance]": "should print the output to logs [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Kubelet when scheduling a busybox command that always fails in a pod should be possible to delete [NodeConformance] [Conformance]": "should be possible to delete [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Kubelet when scheduling a busybox command that always fails in a pod should have an terminated reason [NodeConformance] [Conformance]": "should have an terminated reason [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Kubelet when scheduling a read only busybox container should not write to root filesystem [LinuxOnly] [NodeConformance] [Conformance]": "should not write to root filesystem [LinuxOnly] [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] KubeletManagedEtcHosts should test kubelet managed /etc/hosts file [LinuxOnly] [NodeConformance] [Conformance]": "should test kubelet managed /etc/hosts file [LinuxOnly] [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Lease lease API should be available [Conformance]": "lease API should be available [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + "[Top Level] [sig-node] Managed cluster should report ready nodes the entire duration of the test run [Late]": "should report ready nodes the entire duration of the test run [Late] [Skipped:Disconnected] [Suite:openshift/conformance/parallel]", + "[Top Level] [sig-node] Mount propagation should propagate mounts to the host": "should propagate mounts to the host [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-node] NoExecuteTaintManager Multiple Pods [Serial] evicts pods with minTolerationSeconds [Disruptive] [Conformance]": "evicts pods with minTolerationSeconds [Disruptive] [Conformance] [Suite:k8s]", + + "[Top Level] [sig-node] NoExecuteTaintManager Multiple Pods [Serial] only evicts pods without tolerations from tainted nodes": "only evicts pods without tolerations from tainted nodes [Suite:openshift/conformance/serial] [Suite:k8s]", + + "[Top Level] [sig-node] NoExecuteTaintManager Single Pod [Serial] doesn't evict pod with tolerations from tainted nodes": "doesn't evict pod with tolerations from tainted nodes [Suite:openshift/conformance/serial] [Suite:k8s]", + + "[Top Level] [sig-node] NoExecuteTaintManager Single Pod [Serial] eventually evict pod with finite tolerations from tainted nodes": "eventually evict pod with finite tolerations from tainted nodes [Suite:openshift/conformance/serial] [Suite:k8s]", + + "[Top Level] [sig-node] NoExecuteTaintManager Single Pod [Serial] evicts pods from tainted nodes": "evicts pods from tainted nodes [Suite:openshift/conformance/serial] [Suite:k8s]", + + "[Top Level] [sig-node] NoExecuteTaintManager Single Pod [Serial] removing taint cancels eviction [Disruptive] [Conformance]": "removing taint cancels eviction [Disruptive] [Conformance] [Suite:k8s]", + + "[Top Level] [sig-node] NodeLease when the NodeLease feature is enabled should have OwnerReferences set": "should have OwnerReferences set [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-node] NodeLease when the NodeLease feature is enabled the kubelet should create and update a lease in the kube-node-lease namespace": "the kubelet should create and update a lease in the kube-node-lease namespace [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-node] NodeLease when the NodeLease feature is enabled the kubelet should report node status infrequently": "the kubelet should report node status infrequently [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-node] NodeProblemDetector should run without error": "should run without error [Disabled:SpecialConfig] [Suite:k8s]", + + "[Top Level] [sig-node] Pod garbage collector [Feature:PodGarbageCollector] [Slow] should handle the creation of 1000 pods": "should handle the creation of 1000 pods [Suite:k8s]", + "[Top Level] [sig-node] PodTemplates should delete a collection of pod templates [Conformance]": "should delete a collection of pod templates [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", "[Top Level] [sig-node] PodTemplates should run the lifecycle of PodTemplates [Conformance]": "should run the lifecycle of PodTemplates [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + "[Top Level] [sig-node] Pods Extended Delete Grace Period should be submitted and removed": "should be submitted and removed [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-node] Pods Extended Pod Container Status should never report success for a pending container": "should never report success for a pending container [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-node] Pods Extended Pod Container lifecycle should not create extra sandbox if all containers are done": "should not create extra sandbox if all containers are done [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-node] Pods Extended Pods Set QOS Class should be set on Pods with matching resource requests and limits for memory and cpu [Conformance]": "should be set on Pods with matching resource requests and limits for memory and cpu [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Pods should allow activeDeadlineSeconds to be updated [NodeConformance] [Conformance]": "should allow activeDeadlineSeconds to be updated [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Pods should be submitted and removed [NodeConformance] [Conformance]": "should be submitted and removed [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Pods should be updated [NodeConformance] [Conformance]": "should be updated [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Pods should cap back-off at MaxContainerBackOff [Slow][NodeConformance]": "should cap back-off at MaxContainerBackOff [Slow][NodeConformance] [Suite:k8s]", + + "[Top Level] [sig-node] Pods should contain environment variables for services [NodeConformance] [Conformance]": "should contain environment variables for services [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Pods should delete a collection of pods [Conformance]": "should delete a collection of pods [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Pods should get a host IP [NodeConformance] [Conformance]": "should get a host IP [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Pods should have their auto-restart back-off timer reset on image update [Slow][NodeConformance]": "should have their auto-restart back-off timer reset on image update [Slow][NodeConformance] [Suite:k8s]", + + "[Top Level] [sig-node] Pods should run through the lifecycle of Pods and PodStatus [Conformance]": "should run through the lifecycle of Pods and PodStatus [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Pods should support pod readiness gates [NodeFeature:PodReadinessGate]": "should support pod readiness gates [NodeFeature:PodReadinessGate] [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-node] Pods should support remote command execution over websockets [NodeConformance] [Conformance]": "should support remote command execution over websockets [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Pods should support retrieving logs from the container over websockets [NodeConformance] [Conformance]": "should support retrieving logs from the container over websockets [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] PreStop graceful pod terminated should wait until preStop hook completes the process": "graceful pod terminated should wait until preStop hook completes the process [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-node] PreStop should call prestop when killing a pod [Conformance]": "should call prestop when killing a pod [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] PrivilegedPod [NodeConformance] should enable privileged commands [LinuxOnly]": "should enable privileged commands [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-node] Probing container should *not* be restarted by liveness probe because startup probe delays it": "should *not* be restarted by liveness probe because startup probe delays it [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-node] Probing container should *not* be restarted with a /healthz http liveness probe [NodeConformance] [Conformance]": "should *not* be restarted with a /healthz http liveness probe [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Probing container should *not* be restarted with a exec \"cat /tmp/health\" liveness probe [NodeConformance] [Conformance]": "should *not* be restarted with a exec \"cat /tmp/health\" liveness probe [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Probing container should *not* be restarted with a non-local redirect http liveness probe": "should *not* be restarted with a non-local redirect http liveness probe [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-node] Probing container should *not* be restarted with a tcp:8080 liveness probe [NodeConformance] [Conformance]": "should *not* be restarted with a tcp:8080 liveness probe [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Probing container should be ready immediately after startupProbe succeeds": "should be ready immediately after startupProbe succeeds [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-node] Probing container should be restarted by liveness probe after startup probe enables it": "should be restarted by liveness probe after startup probe enables it [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-node] Probing container should be restarted startup probe fails": "should be restarted startup probe fails [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-node] Probing container should be restarted with a /healthz http liveness probe [NodeConformance] [Conformance]": "should be restarted with a /healthz http liveness probe [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Probing container should be restarted with a exec \"cat /tmp/health\" liveness probe [NodeConformance] [Conformance]": "should be restarted with a exec \"cat /tmp/health\" liveness probe [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Probing container should be restarted with a local redirect http liveness probe": "should be restarted with a local redirect http liveness probe [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-node] Probing container should be restarted with an exec liveness probe with timeout [MinimumKubeletVersion:1.20] [NodeConformance]": "should be restarted with an exec liveness probe with timeout [MinimumKubeletVersion:1.20] [NodeConformance] [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-node] Probing container should have monotonically increasing restart count [NodeConformance] [Conformance]": "should have monotonically increasing restart count [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Probing container should not be ready with an exec readiness probe timeout [MinimumKubeletVersion:1.20] [NodeConformance]": "should not be ready with an exec readiness probe timeout [MinimumKubeletVersion:1.20] [NodeConformance] [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-node] Probing container should override timeoutGracePeriodSeconds when LivenessProbe field is set [Feature:ProbeTerminationGracePeriod]": "should override timeoutGracePeriodSeconds when LivenessProbe field is set [Feature:ProbeTerminationGracePeriod] [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-node] Probing container should override timeoutGracePeriodSeconds when StartupProbe field is set [Feature:ProbeTerminationGracePeriod]": "should override timeoutGracePeriodSeconds when StartupProbe field is set [Feature:ProbeTerminationGracePeriod] [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-node] Probing container with readiness probe should not be ready before initial delay and never restart [NodeConformance] [Conformance]": "with readiness probe should not be ready before initial delay and never restart [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Probing container with readiness probe that fails should never be ready and never restart [NodeConformance] [Conformance]": "with readiness probe that fails should never be ready and never restart [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + "[Top Level] [sig-node] RuntimeClass should support RuntimeClasses API operations [Conformance]": " should support RuntimeClasses API operations [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", "[Top Level] [sig-node] RuntimeClass should reject a Pod requesting a RuntimeClass with an unconfigured handler [NodeFeature:RuntimeHandler]": "should reject a Pod requesting a RuntimeClass with an unconfigured handler [NodeFeature:RuntimeHandler] [Disabled:Broken] [Suite:k8s]", @@ -2429,6 +2471,104 @@ var annotations = map[string]string{ "[Top Level] [sig-node] RuntimeClass should run a Pod requesting a RuntimeClass with scheduling without taints ": "should run a Pod requesting a RuntimeClass with scheduling without taints [Disabled:Broken] [Suite:k8s]", + "[Top Level] [sig-node] SSH should SSH to all nodes and run commands": "should SSH to all nodes and run commands [Disabled:Broken] [Suite:k8s]", + + "[Top Level] [sig-node] Secrets should be consumable from pods in env vars [NodeConformance] [Conformance]": "should be consumable from pods in env vars [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Secrets should be consumable via the environment [NodeConformance] [Conformance]": "should be consumable via the environment [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Secrets should fail to create secret due to empty secret key [Conformance]": "should fail to create secret due to empty secret key [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Secrets should patch a secret [Conformance]": "should patch a secret [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Security Context When creating a container with runAsNonRoot should not run with an explicit root user ID [LinuxOnly]": "should not run with an explicit root user ID [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-node] Security Context When creating a container with runAsNonRoot should not run without a specified user ID": "should not run without a specified user ID [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-node] Security Context When creating a container with runAsNonRoot should run with an explicit non-root user ID [LinuxOnly]": "should run with an explicit non-root user ID [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-node] Security Context When creating a container with runAsNonRoot should run with an image specified user ID": "should run with an image specified user ID [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-node] Security Context When creating a container with runAsUser should run the container with uid 0 [LinuxOnly] [NodeConformance]": "should run the container with uid 0 [LinuxOnly] [NodeConformance] [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-node] Security Context When creating a container with runAsUser should run the container with uid 65534 [LinuxOnly] [NodeConformance] [Conformance]": "should run the container with uid 65534 [LinuxOnly] [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Security Context When creating a pod with privileged should run the container as privileged when true [LinuxOnly] [NodeFeature:HostAccess]": "should run the container as privileged when true [LinuxOnly] [NodeFeature:HostAccess] [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-node] Security Context When creating a pod with privileged should run the container as unprivileged when false [LinuxOnly] [NodeConformance] [Conformance]": "should run the container as unprivileged when false [LinuxOnly] [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Security Context When creating a pod with readOnlyRootFilesystem should run the container with readonly rootfs when readOnlyRootFilesystem=true [LinuxOnly] [NodeConformance]": "should run the container with readonly rootfs when readOnlyRootFilesystem=true [LinuxOnly] [NodeConformance] [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-node] Security Context When creating a pod with readOnlyRootFilesystem should run the container with writable rootfs when readOnlyRootFilesystem=false [NodeConformance] [Conformance]": "should run the container with writable rootfs when readOnlyRootFilesystem=false [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Security Context should support container.SecurityContext.RunAsUser And container.SecurityContext.RunAsGroup [LinuxOnly] [Conformance]": "should support container.SecurityContext.RunAsUser And container.SecurityContext.RunAsGroup [LinuxOnly] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Security Context should support container.SecurityContext.RunAsUser [LinuxOnly]": "should support container.SecurityContext.RunAsUser [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-node] Security Context should support pod.Spec.SecurityContext.RunAsUser And pod.Spec.SecurityContext.RunAsGroup [LinuxOnly] [Conformance]": "should support pod.Spec.SecurityContext.RunAsUser And pod.Spec.SecurityContext.RunAsGroup [LinuxOnly] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Security Context should support pod.Spec.SecurityContext.RunAsUser [LinuxOnly]": "should support pod.Spec.SecurityContext.RunAsUser [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-node] Security Context should support pod.Spec.SecurityContext.SupplementalGroups [LinuxOnly]": "should support pod.Spec.SecurityContext.SupplementalGroups [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-node] Security Context should support seccomp default which is unconfined [LinuxOnly]": "should support seccomp default which is unconfined [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-node] Security Context should support seccomp runtime/default [LinuxOnly]": "should support seccomp runtime/default [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-node] Security Context should support seccomp unconfined on the container [LinuxOnly]": "should support seccomp unconfined on the container [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-node] Security Context should support seccomp unconfined on the pod [LinuxOnly]": "should support seccomp unconfined on the pod [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-node] Security Context should support volume SELinux relabeling [Flaky] [LinuxOnly]": "should support volume SELinux relabeling [Flaky] [LinuxOnly] [Suite:k8s]", + + "[Top Level] [sig-node] Security Context should support volume SELinux relabeling when using hostIPC [Flaky] [LinuxOnly]": "should support volume SELinux relabeling when using hostIPC [Flaky] [LinuxOnly] [Suite:k8s]", + + "[Top Level] [sig-node] Security Context should support volume SELinux relabeling when using hostPID [Flaky] [LinuxOnly]": "should support volume SELinux relabeling when using hostPID [Flaky] [LinuxOnly] [Suite:k8s]", + + "[Top Level] [sig-node] Security Context when creating containers with AllowPrivilegeEscalation should allow privilege escalation when not explicitly set and uid != 0 [LinuxOnly] [NodeConformance]": "should allow privilege escalation when not explicitly set and uid != 0 [LinuxOnly] [NodeConformance] [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-node] Security Context when creating containers with AllowPrivilegeEscalation should allow privilege escalation when true [LinuxOnly] [NodeConformance]": "should allow privilege escalation when true [LinuxOnly] [NodeConformance] [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-node] Security Context when creating containers with AllowPrivilegeEscalation should not allow privilege escalation when false [LinuxOnly] [NodeConformance] [Conformance]": "should not allow privilege escalation when false [LinuxOnly] [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Sysctls [LinuxOnly] [NodeFeature:Sysctls] should not launch unsafe, but not explicitly enabled sysctls on the node": "should not launch unsafe, but not explicitly enabled sysctls on the node [Disabled:Broken] [Suite:k8s]", + + "[Top Level] [sig-node] Sysctls [LinuxOnly] [NodeFeature:Sysctls] should reject invalid sysctls": "should reject invalid sysctls [Disabled:Broken] [Suite:k8s]", + + "[Top Level] [sig-node] Sysctls [LinuxOnly] [NodeFeature:Sysctls] should support sysctls": "should support sysctls [Disabled:Broken] [Suite:k8s]", + + "[Top Level] [sig-node] Sysctls [LinuxOnly] [NodeFeature:Sysctls] should support unsafe sysctls which are actually whitelisted": "should support unsafe sysctls which are actually whitelisted [Disabled:Broken] [Suite:k8s]", + + "[Top Level] [sig-node] Variable Expansion should allow composing env vars into new env vars [NodeConformance] [Conformance]": "should allow composing env vars into new env vars [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Variable Expansion should allow substituting values in a container's args [NodeConformance] [Conformance]": "should allow substituting values in a container's args [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Variable Expansion should allow substituting values in a container's command [NodeConformance] [Conformance]": "should allow substituting values in a container's command [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Variable Expansion should allow substituting values in a volume subpath [Conformance]": "should allow substituting values in a volume subpath [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + + "[Top Level] [sig-node] Variable Expansion should fail substituting values in a volume subpath with absolute path [Slow] [Conformance]": "should fail substituting values in a volume subpath with absolute path [Slow] [Conformance] [Suite:k8s]", + + "[Top Level] [sig-node] Variable Expansion should fail substituting values in a volume subpath with backticks [Slow] [Conformance]": "should fail substituting values in a volume subpath with backticks [Slow] [Conformance] [Suite:k8s]", + + "[Top Level] [sig-node] Variable Expansion should succeed in writing subpaths in container [Slow] [Conformance]": "should succeed in writing subpaths in container [Slow] [Conformance] [Suite:k8s]", + + "[Top Level] [sig-node] Variable Expansion should verify that a failing subpath expansion can be modified during the lifecycle of a container [Slow] [Conformance]": "should verify that a failing subpath expansion can be modified during the lifecycle of a container [Slow] [Conformance] [Suite:k8s]", + + "[Top Level] [sig-node] [Feature:Example] Downward API should create a pod that prints his name and namespace": "should create a pod that prints his name and namespace [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-node] [Feature:Example] Liveness liveness pods should be automatically restarted": "liveness pods should be automatically restarted [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-node] [Feature:Example] Secret should create a pod that reads a secret": "should create a pod that reads a secret [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-node] crictl should be able to run crictl on the node": "should be able to run crictl on the node [Disabled:Broken] [Suite:k8s]", + + "[Top Level] [sig-node] kubelet Clean up pods on node kubelet should be able to delete 10 pods per node in 1m0s.": "kubelet should be able to delete 10 pods per node in 1m0s. [Serial] [Suite:openshift/conformance/serial] [Suite:k8s]", + + "[Top Level] [sig-node] kubelet host cleanup with volume mounts [HostCleanup][Flaky] Host cleanup after disrupting NFS volume [NFS] after stopping the nfs-server and deleting the (active) client pod, the NFS mount and the pod's UID directory should be removed.": "after stopping the nfs-server and deleting the (active) client pod, the NFS mount and the pod's UID directory should be removed. [Suite:k8s]", + + "[Top Level] [sig-node] kubelet host cleanup with volume mounts [HostCleanup][Flaky] Host cleanup after disrupting NFS volume [NFS] after stopping the nfs-server and deleting the (sleeping) client pod, the NFS mount and the pod's UID directory should be removed.": "after stopping the nfs-server and deleting the (sleeping) client pod, the NFS mount and the pod's UID directory should be removed. [Suite:k8s]", + "[Top Level] [sig-node] should override timeoutGracePeriodSeconds when annotation is set": "should override timeoutGracePeriodSeconds when annotation is set [Suite:openshift/conformance/parallel]", "[Top Level] [sig-node] supplemental groups Ensure supplemental groups propagate to docker should propagate requested groups to the container [Local]": "should propagate requested groups to the container [Local]", @@ -2467,13 +2607,9 @@ var annotations = map[string]string{ "[Top Level] [sig-scheduling] LimitRange should create a LimitRange with defaults and ensure pod has those defaults applied. [Conformance]": "should create a LimitRange with defaults and ensure pod has those defaults applied. [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - "[Top Level] [sig-scheduling] Multi-AZ Cluster Volumes [sig-storage] should only be allowed to provision PDs in zones where nodes exist": "should only be allowed to provision PDs in zones where nodes exist [Skipped:gce] [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [sig-scheduling] Multi-AZ Cluster Volumes [sig-storage] should schedule pods in the same zones as statically provisioned PVs": "should schedule pods in the same zones as statically provisioned PVs [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-scheduling] Multi-AZ Clusters should spread the pods of a replication controller across zones [Serial]": "should spread the pods of a replication controller across zones [Serial] [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-scheduling] Multi-AZ Clusters should spread the pods of a replication controller across zones": "should spread the pods of a replication controller across zones [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [sig-scheduling] Multi-AZ Clusters should spread the pods of a service across zones": "should spread the pods of a service across zones [Serial] [Suite:openshift/conformance/serial] [Suite:k8s]", + "[Top Level] [sig-scheduling] Multi-AZ Clusters should spread the pods of a service across zones [Serial]": "should spread the pods of a service across zones [Serial] [Suite:openshift/conformance/serial] [Suite:k8s]", "[Top Level] [sig-scheduling] SchedulerPredicates [Serial] PodTopologySpread Filtering validates 4 pods with MaxSkew=1 are evenly distributed into 2 nodes": "validates 4 pods with MaxSkew=1 are evenly distributed into 2 nodes [Suite:openshift/conformance/serial] [Suite:k8s]", @@ -2497,7 +2633,7 @@ var annotations = map[string]string{ "[Top Level] [sig-scheduling] SchedulerPredicates [Serial] validates that there exists conflict between pods with same hostPort and protocol but one using 0.0.0.0 hostIP [Conformance]": "validates that there exists conflict between pods with same hostPort and protocol but one using 0.0.0.0 hostIP [Conformance] [Slow] [Suite:k8s]", - "[Top Level] [sig-scheduling] SchedulerPredicates [Serial] validates that there is no conflict between pods with same hostPort but different hostIP and protocol [Conformance]": "validates that there is no conflict between pods with same hostPort but different hostIP and protocol [Conformance] [Suite:openshift/conformance/serial/minimal] [Suite:k8s]", + "[Top Level] [sig-scheduling] SchedulerPredicates [Serial] validates that there is no conflict between pods with same hostPort but different hostIP and protocol": "validates that there is no conflict between pods with same hostPort but different hostIP and protocol [Suite:openshift/conformance/serial] [Suite:k8s]", "[Top Level] [sig-scheduling] SchedulerPreemption [Serial] PodTopologySpread Preemption validates proper pods are preempted": "validates proper pods are preempted [Suite:openshift/conformance/serial] [Suite:k8s]", @@ -2573,6 +2709,8 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (default fs)(allowExpansion)] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (default fs)] capacity provides storage capacity information": "provides storage capacity information [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents [Suite:openshift/conformance/parallel] [Suite:k8s]", @@ -2667,6 +2805,8 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (filesystem volmode)] multiVolume [Slow] should concurrently access the single volume from pods on the same node [LinuxOnly]": "should concurrently access the single volume from pods on the same node [LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (filesystem volmode)] volume-lifecycle-performance should provision volumes at scale within performance constraints [Slow] [Serial]": "should provision volumes at scale within performance constraints [Slow] [Serial] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (filesystem volmode)] volumeLimits should support volume limits [Serial]": "should support volume limits [Serial] [Suite:openshift/conformance/serial] [Suite:k8s]", "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (filesystem volmode)] volumeMode should fail to use a volume in a pod with mismatched mode [Slow]": "should fail to use a volume in a pod with mismatched mode [Slow] [Suite:k8s]", @@ -2677,59 +2817,59 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (immediate binding)] topology should provision a volume and schedule a pod with AllowedTopologies": "should provision a volume and schedule a pod with AllowedTopologies [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with mount options": "should provision storage with mount options [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with mount options": "should provision storage with mount options [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directory": "should support existing directory [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directory": "should support existing directory [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support non-existent path": "should support non-existent path [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support non-existent path": "should support non-existent path [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][sig-windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -2743,21 +2883,21 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Dynamic Snapshot (retain policy)] snapshottable[Feature:VolumeSnapshotDataSource] volume snapshot controller should check snapshot fields, check restore correctly works after modifying source data, check deletion": "should check snapshot fields, check restore correctly works after modifying source data, check deletion [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Generic Ephemeral-volume (default fs) [Feature:GenericEphemeralVolume] (immediate-binding)] ephemeral should create read-only inline ephemeral volume": "should create read-only inline ephemeral volume [Disabled:Broken] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Generic Ephemeral-volume (default fs) (immediate-binding)] ephemeral should create read-only inline ephemeral volume": "should create read-only inline ephemeral volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Generic Ephemeral-volume (default fs) [Feature:GenericEphemeralVolume] (immediate-binding)] ephemeral should create read/write inline ephemeral volume": "should create read/write inline ephemeral volume [Disabled:Broken] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Generic Ephemeral-volume (default fs) (immediate-binding)] ephemeral should create read/write inline ephemeral volume": "should create read/write inline ephemeral volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Generic Ephemeral-volume (default fs) [Feature:GenericEphemeralVolume] (immediate-binding)] ephemeral should support multiple inline ephemeral volumes": "should support multiple inline ephemeral volumes [Disabled:Broken] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Generic Ephemeral-volume (default fs) (immediate-binding)] ephemeral should support multiple inline ephemeral volumes": "should support multiple inline ephemeral volumes [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Generic Ephemeral-volume (default fs) [Feature:GenericEphemeralVolume] (immediate-binding)] ephemeral should support two pods which share the same volume": "should support two pods which share the same volume [Disabled:Broken] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Generic Ephemeral-volume (default fs) (immediate-binding)] ephemeral should support two pods which share the same volume": "should support two pods which share the same volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Generic Ephemeral-volume (default fs) [Feature:GenericEphemeralVolume] (late-binding)] ephemeral should create read-only inline ephemeral volume": "should create read-only inline ephemeral volume [Disabled:Broken] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Generic Ephemeral-volume (default fs) (late-binding)] ephemeral should create read-only inline ephemeral volume": "should create read-only inline ephemeral volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Generic Ephemeral-volume (default fs) [Feature:GenericEphemeralVolume] (late-binding)] ephemeral should create read/write inline ephemeral volume": "should create read/write inline ephemeral volume [Disabled:Broken] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Generic Ephemeral-volume (default fs) (late-binding)] ephemeral should create read/write inline ephemeral volume": "should create read/write inline ephemeral volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Generic Ephemeral-volume (default fs) [Feature:GenericEphemeralVolume] (late-binding)] ephemeral should support multiple inline ephemeral volumes": "should support multiple inline ephemeral volumes [Disabled:Broken] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Generic Ephemeral-volume (default fs) (late-binding)] ephemeral should support multiple inline ephemeral volumes": "should support multiple inline ephemeral volumes [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Generic Ephemeral-volume (default fs) [Feature:GenericEphemeralVolume] (late-binding)] ephemeral should support two pods which share the same volume": "should support two pods which share the same volume [Disabled:Broken] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Generic Ephemeral-volume (default fs) (late-binding)] ephemeral should support two pods which share the same volume": "should support two pods which share the same volume [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Inline-volume (default fs)] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", @@ -2809,9 +2949,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Inline-volume (ext4)] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Inline-volume (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -2913,9 +3053,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Pre-provisioned PV (filesystem volmode)] volumeMode should not mount / map unused volumes in a pod [LinuxOnly]": "should not mount / map unused volumes in a pod [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] CSI Volumes [Driver: csi-hostpath] [Testpattern: Pre-provisioned PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -2979,6 +3119,8 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (default fs)(allowExpansion)] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (default fs)] capacity provides storage capacity information": "provides storage capacity information [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", @@ -3073,6 +3215,8 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (filesystem volmode)] multiVolume [Slow] should concurrently access the single volume from pods on the same node [LinuxOnly]": "should concurrently access the single volume from pods on the same node [LinuxOnly] [Skipped:gce] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (filesystem volmode)] volume-lifecycle-performance should provision volumes at scale within performance constraints [Slow] [Serial]": "should provision volumes at scale within performance constraints [Slow] [Serial] [Skipped:gce] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (filesystem volmode)] volumeLimits should support volume limits [Serial]": "should support volume limits [Serial] [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (filesystem volmode)] volumeMode should fail to use a volume in a pod with mismatched mode [Slow]": "should fail to use a volume in a pod with mismatched mode [Slow] [Skipped:gce] [Suite:k8s]", @@ -3083,59 +3227,59 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (immediate binding)] topology should provision a volume and schedule a pod with AllowedTopologies": "should provision a volume and schedule a pod with AllowedTopologies [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with mount options": "should provision storage with mount options [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with mount options": "should provision storage with mount options [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Skipped:gce] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Skipped:gce] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Skipped:gce] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Skipped:gce] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Skipped:gce] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Skipped:gce] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Skipped:gce] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Skipped:gce] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Skipped:gce] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Skipped:gce] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Skipped:gce] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Skipped:gce] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directory": "should support existing directory [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directory": "should support existing directory [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support non-existent path": "should support non-existent path [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support non-existent path": "should support non-existent path [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Skipped:gce] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Skipped:gce] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Skipped:gce] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Skipped:gce] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Skipped:gce] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Skipped:gce] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Skipped:gce] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Skipped:gce] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Skipped:gce] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Skipped:gce] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should store data": "should store data [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Skipped:gce] [Suite:k8s]", @@ -3149,21 +3293,21 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Dynamic Snapshot (retain policy)] snapshottable[Feature:VolumeSnapshotDataSource] volume snapshot controller should check snapshot fields, check restore correctly works after modifying source data, check deletion": "should check snapshot fields, check restore correctly works after modifying source data, check deletion [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Generic Ephemeral-volume (default fs) [Feature:GenericEphemeralVolume] (immediate-binding)] ephemeral should create read-only inline ephemeral volume": "should create read-only inline ephemeral volume [Disabled:Broken] [Skipped:gce] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Generic Ephemeral-volume (default fs) (immediate-binding)] ephemeral should create read-only inline ephemeral volume": "should create read-only inline ephemeral volume [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Generic Ephemeral-volume (default fs) [Feature:GenericEphemeralVolume] (immediate-binding)] ephemeral should create read/write inline ephemeral volume": "should create read/write inline ephemeral volume [Disabled:Broken] [Skipped:gce] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Generic Ephemeral-volume (default fs) (immediate-binding)] ephemeral should create read/write inline ephemeral volume": "should create read/write inline ephemeral volume [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Generic Ephemeral-volume (default fs) [Feature:GenericEphemeralVolume] (immediate-binding)] ephemeral should support multiple inline ephemeral volumes": "should support multiple inline ephemeral volumes [Disabled:Broken] [Skipped:gce] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Generic Ephemeral-volume (default fs) (immediate-binding)] ephemeral should support multiple inline ephemeral volumes": "should support multiple inline ephemeral volumes [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Generic Ephemeral-volume (default fs) [Feature:GenericEphemeralVolume] (immediate-binding)] ephemeral should support two pods which share the same volume": "should support two pods which share the same volume [Disabled:Broken] [Skipped:gce] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Generic Ephemeral-volume (default fs) (immediate-binding)] ephemeral should support two pods which share the same volume": "should support two pods which share the same volume [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Generic Ephemeral-volume (default fs) [Feature:GenericEphemeralVolume] (late-binding)] ephemeral should create read-only inline ephemeral volume": "should create read-only inline ephemeral volume [Disabled:Broken] [Skipped:gce] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Generic Ephemeral-volume (default fs) (late-binding)] ephemeral should create read-only inline ephemeral volume": "should create read-only inline ephemeral volume [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Generic Ephemeral-volume (default fs) [Feature:GenericEphemeralVolume] (late-binding)] ephemeral should create read/write inline ephemeral volume": "should create read/write inline ephemeral volume [Disabled:Broken] [Skipped:gce] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Generic Ephemeral-volume (default fs) (late-binding)] ephemeral should create read/write inline ephemeral volume": "should create read/write inline ephemeral volume [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Generic Ephemeral-volume (default fs) [Feature:GenericEphemeralVolume] (late-binding)] ephemeral should support multiple inline ephemeral volumes": "should support multiple inline ephemeral volumes [Disabled:Broken] [Skipped:gce] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Generic Ephemeral-volume (default fs) (late-binding)] ephemeral should support multiple inline ephemeral volumes": "should support multiple inline ephemeral volumes [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Generic Ephemeral-volume (default fs) [Feature:GenericEphemeralVolume] (late-binding)] ephemeral should support two pods which share the same volume": "should support two pods which share the same volume [Disabled:Broken] [Skipped:gce] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Generic Ephemeral-volume (default fs) (late-binding)] ephemeral should support two pods which share the same volume": "should support two pods which share the same volume [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Inline-volume (default fs)] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", @@ -3215,9 +3359,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Inline-volume (ext4)] volumes should store data": "should store data [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should store data": "should store data [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should store data": "should store data [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Inline-volume (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Skipped:gce] [Suite:k8s]", @@ -3319,9 +3463,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Pre-provisioned PV (filesystem volmode)] volumeMode should not mount / map unused volumes in a pod [LinuxOnly]": "should not mount / map unused volumes in a pod [LinuxOnly] [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should store data": "should store data [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", + "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", "[Top Level] [sig-storage] CSI Volumes [Driver: pd.csi.storage.gke.io][Serial] [Testpattern: Pre-provisioned PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Skipped:gce] [Suite:k8s]", @@ -3351,6 +3495,8 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] CSI mock volume CSI Volume Snapshots [Feature:VolumeSnapshotDataSource] volumesnapshotcontent and pvc in Bound state with deletion timestamp set should not get deleted while snapshot finalizer exists": "volumesnapshotcontent and pvc in Bound state with deletion timestamp set should not get deleted while snapshot finalizer exists [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] CSI mock volume CSI Volume Snapshots secrets [Feature:VolumeSnapshotDataSource] volume snapshot create/delete with secrets": "volume snapshot create/delete with secrets [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] CSI mock volume CSI Volume expansion should expand volume by restarting pod if attach=off, nodeExpansion=on": "should expand volume by restarting pod if attach=off, nodeExpansion=on [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] CSI mock volume CSI Volume expansion should expand volume by restarting pod if attach=on, nodeExpansion=on": "should expand volume by restarting pod if attach=on, nodeExpansion=on [Suite:openshift/conformance/parallel] [Suite:k8s]", @@ -3381,21 +3527,21 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] CSI mock volume CSI workload information using mock driver should not be passed when podInfoOnMount=nil": "should not be passed when podInfoOnMount=nil [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] CSI mock volume CSIServiceAccountToken [Feature:CSIServiceAccountToken] token should be plumbed down when csiServiceAccountTokenEnabled=true": "token should be plumbed down when csiServiceAccountTokenEnabled=true [Disabled:Alpha] [Suite:k8s]", + "[Top Level] [sig-storage] CSI mock volume CSIServiceAccountToken token should be plumbed down when csiServiceAccountTokenEnabled=true": "token should be plumbed down when csiServiceAccountTokenEnabled=true [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] CSI mock volume CSIServiceAccountToken [Feature:CSIServiceAccountToken] token should not be plumbed down when CSIDriver is not deployed": "token should not be plumbed down when CSIDriver is not deployed [Disabled:Alpha] [Suite:k8s]", + "[Top Level] [sig-storage] CSI mock volume CSIServiceAccountToken token should not be plumbed down when CSIDriver is not deployed": "token should not be plumbed down when CSIDriver is not deployed [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] CSI mock volume CSIServiceAccountToken [Feature:CSIServiceAccountToken] token should not be plumbed down when csiServiceAccountTokenEnabled=false": "token should not be plumbed down when csiServiceAccountTokenEnabled=false [Disabled:Alpha] [Suite:k8s]", + "[Top Level] [sig-storage] CSI mock volume CSIServiceAccountToken token should not be plumbed down when csiServiceAccountTokenEnabled=false": "token should not be plumbed down when csiServiceAccountTokenEnabled=false [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] CSI mock volume CSIStorageCapacity [Feature:CSIStorageCapacity] CSIStorageCapacity disabled": "CSIStorageCapacity disabled [Disabled:Alpha] [Suite:k8s]", + "[Top Level] [sig-storage] CSI mock volume CSIStorageCapacity CSIStorageCapacity disabled": "CSIStorageCapacity disabled [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] CSI mock volume CSIStorageCapacity [Feature:CSIStorageCapacity] CSIStorageCapacity unused": "CSIStorageCapacity unused [Disabled:Alpha] [Suite:k8s]", + "[Top Level] [sig-storage] CSI mock volume CSIStorageCapacity CSIStorageCapacity unused": "CSIStorageCapacity unused [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] CSI mock volume CSIStorageCapacity [Feature:CSIStorageCapacity] CSIStorageCapacity used, have capacity": "CSIStorageCapacity used, have capacity [Disabled:Alpha] [Suite:k8s]", + "[Top Level] [sig-storage] CSI mock volume CSIStorageCapacity CSIStorageCapacity used, have capacity": "CSIStorageCapacity used, have capacity [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] CSI mock volume CSIStorageCapacity [Feature:CSIStorageCapacity] CSIStorageCapacity used, insufficient capacity": "CSIStorageCapacity used, insufficient capacity [Disabled:Alpha] [Suite:k8s]", + "[Top Level] [sig-storage] CSI mock volume CSIStorageCapacity CSIStorageCapacity used, insufficient capacity": "CSIStorageCapacity used, insufficient capacity [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] CSI mock volume CSIStorageCapacity [Feature:CSIStorageCapacity] CSIStorageCapacity used, no capacity": "CSIStorageCapacity used, no capacity [Disabled:Alpha] [Suite:k8s]", + "[Top Level] [sig-storage] CSI mock volume CSIStorageCapacity CSIStorageCapacity used, no capacity": "CSIStorageCapacity used, no capacity [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] CSI mock volume storage capacity exhausted, immediate binding": "exhausted, immediate binding [Suite:openshift/conformance/parallel] [Suite:k8s]", @@ -3433,10 +3579,14 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] ConfigMap should be consumable in multiple volumes in the same pod [NodeConformance] [Conformance]": "should be consumable in multiple volumes in the same pod [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - "[Top Level] [sig-storage] ConfigMap should be immutable if `immutable` field is set": "should be immutable if `immutable` field is set [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] ConfigMap should be immutable if `immutable` field is set [Conformance]": "should be immutable if `immutable` field is set [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", "[Top Level] [sig-storage] ConfigMap updates should be reflected in volume [NodeConformance] [Conformance]": "updates should be reflected in volume [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", + "[Top Level] [sig-storage] Downward API [Serial] [Disruptive] [NodeFeature:EphemeralStorage] Downward API tests for local ephemeral storage should provide container's limits.ephemeral-storage and requests.ephemeral-storage as env vars": "should provide container's limits.ephemeral-storage and requests.ephemeral-storage as env vars [Suite:k8s]", + + "[Top Level] [sig-storage] Downward API [Serial] [Disruptive] [NodeFeature:EphemeralStorage] Downward API tests for local ephemeral storage should provide default limits.ephemeral-storage from node allocatable": "should provide default limits.ephemeral-storage from node allocatable [Suite:k8s]", + "[Top Level] [sig-storage] Downward API volume should provide container's cpu limit [NodeConformance] [Conformance]": "should provide container's cpu limit [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", "[Top Level] [sig-storage] Downward API volume should provide container's cpu request [NodeConformance] [Conformance]": "should provide container's cpu request [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", @@ -3481,9 +3631,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] Dynamic Provisioning DynamicProvisioner [Slow] should test that deleting a claim before the volume is provisioned deletes the volume.": "should test that deleting a claim before the volume is provisioned deletes the volume. [Suite:k8s]", - "[Top Level] [sig-storage] Dynamic Provisioning Invalid AWS KMS key should report an error and create no PV": "should report an error and create no PV [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] Dynamic Provisioning GlusterDynamicProvisioner should create and delete persistent volumes [fast]": "should create and delete persistent volumes [fast] [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] Dynamic Provisioning [k8s.io] GlusterDynamicProvisioner should create and delete persistent volumes [fast]": "should create and delete persistent volumes [fast] [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] Dynamic Provisioning Invalid AWS KMS key should report an error and create no PV": "should report an error and create no PV [Disabled:Broken] [Suite:k8s]", "[Top Level] [sig-storage] EmptyDir volumes pod should support memory backed volumes of specified size": "pod should support memory backed volumes of specified size [Suite:openshift/conformance/parallel] [Suite:k8s]", @@ -3545,11 +3695,7 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] Flexvolumes should be mountable when non-attachable": "should be mountable when non-attachable [Skipped:gce] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] GCP Volumes GlusterFS should be mountable": "should be mountable [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [sig-storage] GCP Volumes NFSv3 should be mountable for NFSv3": "should be mountable for NFSv3 [Suite:openshift/conformance/parallel] [Suite:k8s]", - - "[Top Level] [sig-storage] GCP Volumes NFSv4 should be mountable for NFSv4": "should be mountable for NFSv4 [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] GKE local SSD [Feature:GKELocalSSD] should write and read from node local SSD [Feature:GKELocalSSD]": "should write and read from node local SSD [Feature:GKELocalSSD] [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] GenericPersistentVolume[Disruptive] When kubelet restarts Should test that a file written to the mount before kubelet restart is readable after restart.": "Should test that a file written to the mount before kubelet restart is readable after restart. [Serial] [Suite:k8s]", @@ -3679,6 +3825,8 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (default fs)(allowExpansion)] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (default fs)] capacity provides storage capacity information": "provides storage capacity information [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents [Suite:openshift/conformance/parallel] [Suite:k8s]", @@ -3783,59 +3931,59 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (immediate binding)] topology should provision a volume and schedule a pod with AllowedTopologies": "should provision a volume and schedule a pod with AllowedTopologies [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with mount options": "should provision storage with mount options [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with mount options": "should provision storage with mount options [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directory": "should support existing directory [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directory": "should support existing directory [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support non-existent path": "should support non-existent path [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support non-existent path": "should support non-existent path [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][sig-windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Dynamic PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -3891,9 +4039,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Inline-volume (ext4)] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Inline-volume (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -3995,9 +4143,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Pre-provisioned PV (filesystem volmode)] volumeMode should not mount / map unused volumes in a pod [LinuxOnly]": "should not mount / map unused volumes in a pod [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: aws] [Testpattern: Pre-provisioned PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -4049,6 +4197,8 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (default fs)(allowExpansion)] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (default fs)] capacity provides storage capacity information": "provides storage capacity information [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents [Suite:openshift/conformance/parallel] [Suite:k8s]", @@ -4153,59 +4303,59 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (immediate binding)] topology should provision a volume and schedule a pod with AllowedTopologies": "should provision a volume and schedule a pod with AllowedTopologies [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with mount options": "should provision storage with mount options [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with mount options": "should provision storage with mount options [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directory": "should support existing directory [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directory": "should support existing directory [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support non-existent path": "should support non-existent path [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support non-existent path": "should support non-existent path [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][sig-windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Dynamic PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -4261,9 +4411,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Inline-volume (ext4)] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Inline-volume (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -4365,9 +4515,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Pre-provisioned PV (filesystem volmode)] volumeMode should not mount / map unused volumes in a pod [LinuxOnly]": "should not mount / map unused volumes in a pod [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: azure-disk] [Testpattern: Pre-provisioned PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -4421,6 +4571,8 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (default fs)(allowExpansion)] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (default fs)] capacity provides storage capacity information": "provides storage capacity information [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents [Disabled:Unsupported] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents [Disabled:Unsupported] [Suite:k8s]", @@ -4525,59 +4677,59 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (immediate binding)] topology should provision a volume and schedule a pod with AllowedTopologies": "should provision a volume and schedule a pod with AllowedTopologies [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with mount options": "should provision storage with mount options [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with mount options": "should provision storage with mount options [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directory": "should support existing directory [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directory": "should support existing directory [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support non-existent path": "should support non-existent path [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support non-existent path": "should support non-existent path [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should store data": "should store data [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Disabled:Unsupported] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Dynamic PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Disabled:Unsupported] [Suite:k8s]", @@ -4633,9 +4785,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Inline-volume (ext4)] volumes should store data": "should store data [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should store data": "should store data [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should store data": "should store data [Disabled:Unsupported] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Inline-volume (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Disabled:Unsupported] [Suite:k8s]", @@ -4739,9 +4891,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Pre-provisioned PV (filesystem volmode)] volumeMode should not mount / map unused volumes in a pod [LinuxOnly]": "should not mount / map unused volumes in a pod [LinuxOnly] [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should store data": "should store data [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Disabled:Unsupported] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: ceph][Feature:Volumes][Serial] [Testpattern: Pre-provisioned PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Disabled:Unsupported] [Suite:k8s]", @@ -4793,6 +4945,8 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (default fs)(allowExpansion)] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (default fs)] capacity provides storage capacity information": "provides storage capacity information [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents [Suite:openshift/conformance/parallel] [Suite:k8s]", @@ -4897,59 +5051,59 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (immediate binding)] topology should provision a volume and schedule a pod with AllowedTopologies": "should provision a volume and schedule a pod with AllowedTopologies [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with mount options": "should provision storage with mount options [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with mount options": "should provision storage with mount options [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directory": "should support existing directory [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directory": "should support existing directory [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support non-existent path": "should support non-existent path [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support non-existent path": "should support non-existent path [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][sig-windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Dynamic PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -5005,9 +5159,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Inline-volume (ext4)] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Inline-volume (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -5109,9 +5263,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Pre-provisioned PV (filesystem volmode)] volumeMode should not mount / map unused volumes in a pod [LinuxOnly]": "should not mount / map unused volumes in a pod [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: cinder] [Testpattern: Pre-provisioned PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -5165,6 +5319,8 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (default fs)(allowExpansion)] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (default fs)] capacity provides storage capacity information": "provides storage capacity information [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents [Suite:openshift/conformance/parallel] [Suite:k8s]", @@ -5269,59 +5425,59 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (immediate binding)] topology should provision a volume and schedule a pod with AllowedTopologies": "should provision a volume and schedule a pod with AllowedTopologies [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with mount options": "should provision storage with mount options [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with mount options": "should provision storage with mount options [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directory": "should support existing directory [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directory": "should support existing directory [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support non-existent path": "should support non-existent path [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support non-existent path": "should support non-existent path [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][sig-windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Dynamic PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -5377,9 +5533,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Inline-volume (ext4)] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Inline-volume (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -5483,9 +5639,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Pre-provisioned PV (filesystem volmode)] volumeMode should not mount / map unused volumes in a pod [LinuxOnly]": "should not mount / map unused volumes in a pod [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: emptydir] [Testpattern: Pre-provisioned PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -5537,6 +5693,8 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (default fs)(allowExpansion)] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (default fs)] capacity provides storage capacity information": "provides storage capacity information [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents [Suite:openshift/conformance/parallel] [Suite:k8s]", @@ -5641,59 +5799,59 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (immediate binding)] topology should provision a volume and schedule a pod with AllowedTopologies": "should provision a volume and schedule a pod with AllowedTopologies [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with mount options": "should provision storage with mount options [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with mount options": "should provision storage with mount options [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directory": "should support existing directory [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directory": "should support existing directory [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support non-existent path": "should support non-existent path [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support non-existent path": "should support non-existent path [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Dynamic PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -5749,9 +5907,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Inline-volume (ext4)] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Inline-volume (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -5853,9 +6011,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Pre-provisioned PV (filesystem volmode)] volumeMode should not mount / map unused volumes in a pod [LinuxOnly]": "should not mount / map unused volumes in a pod [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: gcepd] [Testpattern: Pre-provisioned PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -5909,6 +6067,8 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (default fs)(allowExpansion)] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (default fs)] capacity provides storage capacity information": "provides storage capacity information [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", @@ -6013,59 +6173,59 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (immediate binding)] topology should provision a volume and schedule a pod with AllowedTopologies": "should provision a volume and schedule a pod with AllowedTopologies [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with mount options": "should provision storage with mount options [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with mount options": "should provision storage with mount options [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Skipped:ibmcloud] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Skipped:ibmcloud] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Skipped:ibmcloud] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Skipped:ibmcloud] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Skipped:ibmcloud] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Skipped:ibmcloud] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Skipped:ibmcloud] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Skipped:ibmcloud] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Skipped:ibmcloud] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Skipped:ibmcloud] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Skipped:ibmcloud] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Skipped:ibmcloud] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directory": "should support existing directory [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directory": "should support existing directory [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support non-existent path": "should support non-existent path [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support non-existent path": "should support non-existent path [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Skipped:ibmcloud] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Skipped:ibmcloud] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Skipped:ibmcloud] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Skipped:ibmcloud] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Skipped:ibmcloud] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Skipped:ibmcloud] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Skipped:ibmcloud] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Skipped:ibmcloud] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Skipped:ibmcloud] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Skipped:ibmcloud] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][sig-windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should store data": "should store data [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Dynamic PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Skipped:ibmcloud] [Suite:k8s]", @@ -6121,9 +6281,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Inline-volume (ext4)] volumes should store data": "should store data [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should store data": "should store data [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should store data": "should store data [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Inline-volume (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Skipped:ibmcloud] [Suite:k8s]", @@ -6227,9 +6387,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Pre-provisioned PV (filesystem volmode)] volumeMode should not mount / map unused volumes in a pod [LinuxOnly]": "should not mount / map unused volumes in a pod [LinuxOnly] [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should store data": "should store data [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Skipped:ibmcloud] [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: gluster] [Testpattern: Pre-provisioned PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Skipped:ibmcloud] [Suite:k8s]", @@ -6283,6 +6443,8 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (default fs)(allowExpansion)] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (default fs)] capacity provides storage capacity information": "provides storage capacity information [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents [Suite:openshift/conformance/parallel] [Suite:k8s]", @@ -6387,59 +6549,59 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (immediate binding)] topology should provision a volume and schedule a pod with AllowedTopologies": "should provision a volume and schedule a pod with AllowedTopologies [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with mount options": "should provision storage with mount options [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with mount options": "should provision storage with mount options [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directory": "should support existing directory [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directory": "should support existing directory [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support non-existent path": "should support non-existent path [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support non-existent path": "should support non-existent path [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][sig-windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Dynamic PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -6495,9 +6657,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Inline-volume (ext4)] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Inline-volume (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -6601,9 +6763,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Pre-provisioned PV (filesystem volmode)] volumeMode should not mount / map unused volumes in a pod [LinuxOnly]": "should not mount / map unused volumes in a pod [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPathSymlink] [Testpattern: Pre-provisioned PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -6657,6 +6819,8 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (default fs)(allowExpansion)] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (default fs)] capacity provides storage capacity information": "provides storage capacity information [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents [Suite:openshift/conformance/parallel] [Suite:k8s]", @@ -6761,59 +6925,59 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (immediate binding)] topology should provision a volume and schedule a pod with AllowedTopologies": "should provision a volume and schedule a pod with AllowedTopologies [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with mount options": "should provision storage with mount options [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with mount options": "should provision storage with mount options [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directory": "should support existing directory [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directory": "should support existing directory [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support non-existent path": "should support non-existent path [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support non-existent path": "should support non-existent path [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][sig-windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Dynamic PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -6869,9 +7033,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Inline-volume (ext4)] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Inline-volume (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -6975,9 +7139,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Pre-provisioned PV (filesystem volmode)] volumeMode should not mount / map unused volumes in a pod [LinuxOnly]": "should not mount / map unused volumes in a pod [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: hostPath] [Testpattern: Pre-provisioned PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -7029,6 +7193,8 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (default fs)(allowExpansion)] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Disabled:Broken] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (default fs)] capacity provides storage capacity information": "provides storage capacity information [Disabled:Broken] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents [Disabled:Broken] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents [Disabled:Broken] [Suite:k8s]", @@ -7133,59 +7299,59 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (immediate binding)] topology should provision a volume and schedule a pod with AllowedTopologies": "should provision a volume and schedule a pod with AllowedTopologies [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Disabled:Broken] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Disabled:Broken] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with mount options": "should provision storage with mount options [Disabled:Broken] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with mount options": "should provision storage with mount options [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Disabled:Broken] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Disabled:Broken] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Disabled:Broken] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Disabled:Broken] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Disabled:Broken] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Disabled:Broken] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Disabled:Broken] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Disabled:Broken] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Disabled:Broken] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Disabled:Broken] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directory": "should support existing directory [Disabled:Broken] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directory": "should support existing directory [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Disabled:Broken] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Disabled:Broken] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support non-existent path": "should support non-existent path [Disabled:Broken] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support non-existent path": "should support non-existent path [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Disabled:Broken] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Disabled:Broken] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Disabled:Broken] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Disabled:Broken] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Disabled:Broken] [Serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Disabled:Broken] [Serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Disabled:Broken] [Serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Disabled:Broken] [Serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Disabled:Broken] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][sig-windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Disabled:Broken] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Disabled:Broken] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should store data": "should store data [Disabled:Broken] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Disabled:Broken] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Dynamic PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Disabled:Broken] [Suite:k8s]", @@ -7241,9 +7407,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Inline-volume (ext4)] volumes should store data": "should store data [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Disabled:Broken] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should store data": "should store data [Disabled:Broken] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should store data": "should store data [Disabled:Broken] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Inline-volume (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Disabled:Broken] [Suite:k8s]", @@ -7345,9 +7511,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Pre-provisioned PV (filesystem volmode)] volumeMode should not mount / map unused volumes in a pod [LinuxOnly]": "should not mount / map unused volumes in a pod [LinuxOnly] [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Disabled:Broken] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Disabled:Broken] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should store data": "should store data [Disabled:Broken] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Disabled:Broken] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: iscsi][Feature:Volumes] [Testpattern: Pre-provisioned PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Disabled:Broken] [Suite:k8s]", @@ -7399,6 +7565,8 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (default fs)(allowExpansion)] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (default fs)] capacity provides storage capacity information": "provides storage capacity information [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents [Suite:openshift/conformance/parallel] [Suite:k8s]", @@ -7503,59 +7671,59 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (immediate binding)] topology should provision a volume and schedule a pod with AllowedTopologies": "should provision a volume and schedule a pod with AllowedTopologies [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with mount options": "should provision storage with mount options [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with mount options": "should provision storage with mount options [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directory": "should support existing directory [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directory": "should support existing directory [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support non-existent path": "should support non-existent path [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support non-existent path": "should support non-existent path [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][sig-windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Dynamic PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -7611,9 +7779,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Inline-volume (ext4)] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Inline-volume (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -7715,9 +7883,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Pre-provisioned PV (filesystem volmode)] volumeMode should not mount / map unused volumes in a pod [LinuxOnly]": "should not mount / map unused volumes in a pod [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: block] [Testpattern: Pre-provisioned PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -7771,6 +7939,8 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (default fs)(allowExpansion)] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (default fs)] capacity provides storage capacity information": "provides storage capacity information [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents [Suite:openshift/conformance/parallel] [Suite:k8s]", @@ -7875,59 +8045,59 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (immediate binding)] topology should provision a volume and schedule a pod with AllowedTopologies": "should provision a volume and schedule a pod with AllowedTopologies [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with mount options": "should provision storage with mount options [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with mount options": "should provision storage with mount options [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directory": "should support existing directory [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directory": "should support existing directory [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support non-existent path": "should support non-existent path [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support non-existent path": "should support non-existent path [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Dynamic PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -7983,9 +8153,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Inline-volume (ext4)] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Inline-volume (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -8089,9 +8259,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Pre-provisioned PV (filesystem volmode)] volumeMode should not mount / map unused volumes in a pod [LinuxOnly]": "should not mount / map unused volumes in a pod [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: blockfs] [Testpattern: Pre-provisioned PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -8145,6 +8315,8 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (default fs)(allowExpansion)] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (default fs)] capacity provides storage capacity information": "provides storage capacity information [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents [Suite:openshift/conformance/parallel] [Suite:k8s]", @@ -8249,59 +8421,59 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (immediate binding)] topology should provision a volume and schedule a pod with AllowedTopologies": "should provision a volume and schedule a pod with AllowedTopologies [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with mount options": "should provision storage with mount options [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with mount options": "should provision storage with mount options [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directory": "should support existing directory [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directory": "should support existing directory [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support non-existent path": "should support non-existent path [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support non-existent path": "should support non-existent path [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Dynamic PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -8357,9 +8529,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Inline-volume (ext4)] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Inline-volume (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -8463,9 +8635,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Pre-provisioned PV (filesystem volmode)] volumeMode should not mount / map unused volumes in a pod [LinuxOnly]": "should not mount / map unused volumes in a pod [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-bindmounted] [Testpattern: Pre-provisioned PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -8519,6 +8691,8 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (default fs)(allowExpansion)] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (default fs)] capacity provides storage capacity information": "provides storage capacity information [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents [Suite:openshift/conformance/parallel] [Suite:k8s]", @@ -8623,59 +8797,59 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (immediate binding)] topology should provision a volume and schedule a pod with AllowedTopologies": "should provision a volume and schedule a pod with AllowedTopologies [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with mount options": "should provision storage with mount options [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with mount options": "should provision storage with mount options [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directory": "should support existing directory [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directory": "should support existing directory [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support non-existent path": "should support non-existent path [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support non-existent path": "should support non-existent path [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Dynamic PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -8731,9 +8905,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Inline-volume (ext4)] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Inline-volume (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -8837,9 +9011,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Pre-provisioned PV (filesystem volmode)] volumeMode should not mount / map unused volumes in a pod [LinuxOnly]": "should not mount / map unused volumes in a pod [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link-bindmounted] [Testpattern: Pre-provisioned PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -8893,6 +9067,8 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (default fs)(allowExpansion)] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (default fs)] capacity provides storage capacity information": "provides storage capacity information [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents [Suite:openshift/conformance/parallel] [Suite:k8s]", @@ -8997,59 +9173,59 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (immediate binding)] topology should provision a volume and schedule a pod with AllowedTopologies": "should provision a volume and schedule a pod with AllowedTopologies [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with mount options": "should provision storage with mount options [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with mount options": "should provision storage with mount options [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directory": "should support existing directory [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directory": "should support existing directory [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support non-existent path": "should support non-existent path [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support non-existent path": "should support non-existent path [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][sig-windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Dynamic PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -9105,9 +9281,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Inline-volume (ext4)] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Inline-volume (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -9211,9 +9387,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Pre-provisioned PV (filesystem volmode)] volumeMode should not mount / map unused volumes in a pod [LinuxOnly]": "should not mount / map unused volumes in a pod [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir-link] [Testpattern: Pre-provisioned PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -9267,6 +9443,8 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (default fs)(allowExpansion)] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (default fs)] capacity provides storage capacity information": "provides storage capacity information [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents [Suite:openshift/conformance/parallel] [Suite:k8s]", @@ -9371,59 +9549,59 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (immediate binding)] topology should provision a volume and schedule a pod with AllowedTopologies": "should provision a volume and schedule a pod with AllowedTopologies [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with mount options": "should provision storage with mount options [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with mount options": "should provision storage with mount options [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directory": "should support existing directory [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directory": "should support existing directory [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support non-existent path": "should support non-existent path [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support non-existent path": "should support non-existent path [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][sig-windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Dynamic PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -9479,9 +9657,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Inline-volume (ext4)] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Inline-volume (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -9585,9 +9763,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Pre-provisioned PV (filesystem volmode)] volumeMode should not mount / map unused volumes in a pod [LinuxOnly]": "should not mount / map unused volumes in a pod [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: dir] [Testpattern: Pre-provisioned PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -9641,6 +9819,8 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (default fs)(allowExpansion)] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (default fs)] capacity provides storage capacity information": "provides storage capacity information [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", @@ -9745,59 +9925,59 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (immediate binding)] topology should provision a volume and schedule a pod with AllowedTopologies": "should provision a volume and schedule a pod with AllowedTopologies [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with mount options": "should provision storage with mount options [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with mount options": "should provision storage with mount options [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Skipped:gce] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Skipped:gce] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Skipped:gce] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Skipped:gce] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Skipped:gce] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Skipped:gce] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Skipped:gce] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Skipped:gce] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Skipped:gce] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Skipped:gce] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Skipped:gce] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Skipped:gce] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directory": "should support existing directory [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directory": "should support existing directory [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support non-existent path": "should support non-existent path [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support non-existent path": "should support non-existent path [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Skipped:gce] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Skipped:gce] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Skipped:gce] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Skipped:gce] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Skipped:gce] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Skipped:gce] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Skipped:gce] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Skipped:gce] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Skipped:gce] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Skipped:gce] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should store data": "should store data [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Dynamic PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Skipped:gce] [Suite:k8s]", @@ -9853,9 +10033,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Inline-volume (ext4)] volumes should store data": "should store data [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should store data": "should store data [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should store data": "should store data [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Inline-volume (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Skipped:gce] [Suite:k8s]", @@ -9959,9 +10139,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Pre-provisioned PV (filesystem volmode)] volumeMode should not mount / map unused volumes in a pod [LinuxOnly]": "should not mount / map unused volumes in a pod [LinuxOnly] [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should store data": "should store data [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Skipped:gce] [Suite:openshift/conformance/serial] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: gce-localssd-scsi-fs] [Serial] [Testpattern: Pre-provisioned PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Skipped:gce] [Suite:k8s]", @@ -10015,6 +10195,8 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (default fs)(allowExpansion)] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (default fs)] capacity provides storage capacity information": "provides storage capacity information [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents [Suite:openshift/conformance/parallel] [Suite:k8s]", @@ -10119,59 +10301,59 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (immediate binding)] topology should provision a volume and schedule a pod with AllowedTopologies": "should provision a volume and schedule a pod with AllowedTopologies [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with mount options": "should provision storage with mount options [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with mount options": "should provision storage with mount options [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directory": "should support existing directory [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directory": "should support existing directory [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support non-existent path": "should support non-existent path [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support non-existent path": "should support non-existent path [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Dynamic PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -10227,9 +10409,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Inline-volume (ext4)] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Inline-volume (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -10333,9 +10515,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Pre-provisioned PV (filesystem volmode)] volumeMode should not mount / map unused volumes in a pod [LinuxOnly]": "should not mount / map unused volumes in a pod [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: local][LocalVolumeType: tmpfs] [Testpattern: Pre-provisioned PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -10389,6 +10571,8 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (default fs)(allowExpansion)] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (default fs)] capacity provides storage capacity information": "provides storage capacity information [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents [Suite:openshift/conformance/parallel] [Suite:k8s]", @@ -10493,59 +10677,59 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (immediate binding)] topology should provision a volume and schedule a pod with AllowedTopologies": "should provision a volume and schedule a pod with AllowedTopologies [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with mount options": "should provision storage with mount options [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with mount options": "should provision storage with mount options [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directory": "should support existing directory [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directory": "should support existing directory [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support non-existent path": "should support non-existent path [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support non-existent path": "should support non-existent path [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Dynamic PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -10601,9 +10785,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Inline-volume (ext4)] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Inline-volume (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -10707,9 +10891,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Pre-provisioned PV (filesystem volmode)] volumeMode should not mount / map unused volumes in a pod [LinuxOnly]": "should not mount / map unused volumes in a pod [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: nfs] [Testpattern: Pre-provisioned PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -10761,6 +10945,8 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (default fs)(allowExpansion)] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (default fs)] capacity provides storage capacity information": "provides storage capacity information [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents [Disabled:Unsupported] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents [Disabled:Unsupported] [Suite:k8s]", @@ -10865,59 +11051,59 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (immediate binding)] topology should provision a volume and schedule a pod with AllowedTopologies": "should provision a volume and schedule a pod with AllowedTopologies [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with mount options": "should provision storage with mount options [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with mount options": "should provision storage with mount options [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directory": "should support existing directory [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directory": "should support existing directory [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support non-existent path": "should support non-existent path [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support non-existent path": "should support non-existent path [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should store data": "should store data [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Disabled:Unsupported] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Dynamic PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Disabled:Unsupported] [Suite:k8s]", @@ -10973,9 +11159,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Inline-volume (ext4)] volumes should store data": "should store data [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should store data": "should store data [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should store data": "should store data [Disabled:Unsupported] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Inline-volume (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Disabled:Unsupported] [Suite:k8s]", @@ -11077,9 +11263,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Pre-provisioned PV (filesystem volmode)] volumeMode should not mount / map unused volumes in a pod [LinuxOnly]": "should not mount / map unused volumes in a pod [LinuxOnly] [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Disabled:Unsupported] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should store data": "should store data [Disabled:Unsupported] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Disabled:Unsupported] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: rbd][Feature:Volumes][Serial] [Testpattern: Pre-provisioned PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Disabled:Unsupported] [Suite:k8s]", @@ -11133,6 +11319,8 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (default fs)(allowExpansion)] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (default fs)] capacity provides storage capacity information": "provides storage capacity information [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents [Suite:openshift/conformance/parallel] [Suite:k8s]", @@ -11237,59 +11425,59 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (immediate binding)] topology should provision a volume and schedule a pod with AllowedTopologies": "should provision a volume and schedule a pod with AllowedTopologies [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with mount options": "should provision storage with mount options [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with mount options": "should provision storage with mount options [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directory": "should support existing directory [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directory": "should support existing directory [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support non-existent path": "should support non-existent path [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support non-existent path": "should support non-existent path [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][sig-windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Dynamic PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -11345,9 +11533,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Inline-volume (ext4)] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Inline-volume (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -11451,9 +11639,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Pre-provisioned PV (filesystem volmode)] volumeMode should not mount / map unused volumes in a pod [LinuxOnly]": "should not mount / map unused volumes in a pod [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: vsphere] [Testpattern: Pre-provisioned PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -11507,6 +11695,8 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (default fs)(allowExpansion)] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (default fs)] capacity provides storage capacity information": "provides storage capacity information [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, new pod fsgroup applied to volume contents [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (default fs)] fsgroupchangepolicy (Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents": "(Always)[LinuxOnly], pod created with an initial fsgroup, volume contents ownership changed in first pod, new pod with different fsgroup applied to the volume contents [Suite:openshift/conformance/parallel] [Suite:k8s]", @@ -11611,59 +11801,59 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (immediate binding)] topology should provision a volume and schedule a pod with AllowedTopologies": "should provision a volume and schedule a pod with AllowedTopologies [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand Verify if offline PVC expansion works": "Verify if offline PVC expansion works [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][sig-windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)(allowExpansion)][Feature:Windows] volume-expand should resize volume when PVC is edited while pod is using it": "should resize volume when PVC is edited while pod is using it [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with mount options": "should provision storage with mount options [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with mount options": "should provision storage with mount options [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source in parallel [Slow]": "should provision storage with pvc data source in parallel [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with pvc data source": "should provision storage with pvc data source [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] provisioning should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]": "should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should be able to unmount after the subpath directory is deleted [LinuxOnly]": "should be able to unmount after the subpath directory is deleted [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if non-existent subpath is outside the volume [Slow][LinuxOnly]": "should fail if non-existent subpath is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath directory is outside the volume [Slow][LinuxOnly]": "should fail if subpath directory is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath file is outside the volume [Slow][LinuxOnly]": "should fail if subpath file is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly]": "should fail if subpath with backstepping is outside the volume [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support creating multiple subpath from same volumes [Slow]": "should support creating multiple subpath from same volumes [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directories when readOnly specified in the volumeSource": "should support existing directories when readOnly specified in the volumeSource [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing directory": "should support existing directory [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing directory": "should support existing directory [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support existing single file [LinuxOnly]": "should support existing single file [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support file as subpath [LinuxOnly]": "should support file as subpath [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support non-existent path": "should support non-existent path [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support non-existent path": "should support non-existent path [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly directory specified in the volumeMount": "should support readOnly directory specified in the volumeMount [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support readOnly file specified in the volumeMount [LinuxOnly]": "should support readOnly file specified in the volumeMount [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using directory as subpath [Slow]": "should support restarting containers using directory as subpath [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should support restarting containers using file as subpath [Slow][LinuxOnly]": "should support restarting containers using file as subpath [Slow][LinuxOnly] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is force deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly]": "should unmount if pod is gracefully deleted while kubelet is down [Disruptive][Slow][LinuxOnly] [Serial] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] subPath should verify container cannot write to subpath readonly volumes [Slow]": "should verify container cannot write to subpath readonly volumes [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volume-expand should not allow expansion of pvcs without AllowVolumeExpansion property": "should not allow expansion of pvcs without AllowVolumeExpansion property [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Dynamic PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -11719,9 +11909,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Inline-volume (ext4)] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Inline-volume (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Inline-volume (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Inline-volume (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -11825,9 +12015,9 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Pre-provisioned PV (filesystem volmode)] volumeMode should not mount / map unused volumes in a pod [LinuxOnly]": "should not mount / map unused volumes in a pod [LinuxOnly] [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Pre-provisioned PV (ntfs)][sig-windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Pre-provisioned PV (ntfs)][Feature:Windows] volumes should store data": "should store data [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] In-tree Volumes [Driver: windows-gcepd] [Testpattern: Pre-provisioned PV (xfs)][Slow] volumes should allow exec of files on the volume": "should allow exec of files on the volume [Suite:k8s]", @@ -11839,6 +12029,10 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] Mounted volume expand Should verify mounted devices can be resized": "Should verify mounted devices can be resized [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] Multi-AZ Cluster Volumes should only be allowed to provision PDs in zones where nodes exist": "should only be allowed to provision PDs in zones where nodes exist [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-storage] Multi-AZ Cluster Volumes should schedule pods in the same zones as statically provisioned PVs": "should schedule pods in the same zones as statically provisioned PVs [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] NFSPersistentVolumes[Disruptive][Flaky] when kube-controller-manager restarts should delete a bound PVC from a clientPod, restart the kube-control-manager, and ensure the kube-controller-manager does not crash": "should delete a bound PVC from a clientPod, restart the kube-control-manager, and ensure the kube-controller-manager does not crash [Serial] [Suite:k8s]", "[Top Level] [sig-storage] NFSPersistentVolumes[Disruptive][Flaky] when kubelet restarts Should test that a file written to the mount before kubelet restart is readable after restart.": "Should test that a file written to the mount before kubelet restart is readable after restart. [Serial] [Suite:k8s]", @@ -11885,13 +12079,13 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] PersistentVolumes NFS with multiple PVs and PVCs all in same ns should create 4 PVs and 2 PVCs: test write access [Slow]": "should create 4 PVs and 2 PVCs: test write access [Slow] [Suite:k8s]", - "[Top Level] [sig-storage] PersistentVolumes [Feature:vsphere][Feature:LabelSelector] [sig-storage] Selector-Label Volume Binding:vsphere [Feature:vsphere] should bind volume with claim for given label": "should bind volume with claim for given label [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] PersistentVolumes [Feature:vsphere][Feature:LabelSelector] Selector-Label Volume Binding:vsphere [Feature:vsphere] should bind volume with claim for given label": "should bind volume with claim for given label [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] PersistentVolumes [Feature:vsphere][Feature:ReclaimPolicy] [sig-storage] persistentvolumereclaim:vsphere [Feature:vsphere] should delete persistent volume when reclaimPolicy set to delete and associated claim is deleted": "should delete persistent volume when reclaimPolicy set to delete and associated claim is deleted [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] PersistentVolumes [Feature:vsphere][Feature:ReclaimPolicy] persistentvolumereclaim:vsphere [Feature:vsphere] should delete persistent volume when reclaimPolicy set to delete and associated claim is deleted": "should delete persistent volume when reclaimPolicy set to delete and associated claim is deleted [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] PersistentVolumes [Feature:vsphere][Feature:ReclaimPolicy] [sig-storage] persistentvolumereclaim:vsphere [Feature:vsphere] should not detach and unmount PV when associated pvc with delete as reclaimPolicy is deleted when it is in use by the pod": "should not detach and unmount PV when associated pvc with delete as reclaimPolicy is deleted when it is in use by the pod [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] PersistentVolumes [Feature:vsphere][Feature:ReclaimPolicy] persistentvolumereclaim:vsphere [Feature:vsphere] should not detach and unmount PV when associated pvc with delete as reclaimPolicy is deleted when it is in use by the pod": "should not detach and unmount PV when associated pvc with delete as reclaimPolicy is deleted when it is in use by the pod [Suite:openshift/conformance/parallel] [Suite:k8s]", - "[Top Level] [sig-storage] PersistentVolumes [Feature:vsphere][Feature:ReclaimPolicy] [sig-storage] persistentvolumereclaim:vsphere [Feature:vsphere] should retain persistent volume when reclaimPolicy set to retain when associated claim is deleted": "should retain persistent volume when reclaimPolicy set to retain when associated claim is deleted [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] PersistentVolumes [Feature:vsphere][Feature:ReclaimPolicy] persistentvolumereclaim:vsphere [Feature:vsphere] should retain persistent volume when reclaimPolicy set to retain when associated claim is deleted": "should retain persistent volume when reclaimPolicy set to retain when associated claim is deleted [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] PersistentVolumes-local Local volume that cannot be mounted [Slow] should fail due to non-existent path": "should fail due to non-existent path [Suite:k8s]", @@ -12175,7 +12369,7 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] Secrets should be consumable in multiple volumes in a pod [NodeConformance] [Conformance]": "should be consumable in multiple volumes in a pod [NodeConformance] [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", - "[Top Level] [sig-storage] Secrets should be immutable if `immutable` field is set": "should be immutable if `immutable` field is set [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] Secrets should be immutable if `immutable` field is set [Conformance]": "should be immutable if `immutable` field is set [Conformance] [Suite:openshift/conformance/parallel/minimal] [Suite:k8s]", "[Top Level] [sig-storage] Storage Policy Based Volume Provisioning [Feature:vsphere] verify VSAN storage capability with invalid capability name objectSpaceReserve is not honored for dynamically provisioned pvc using storageclass": "verify VSAN storage capability with invalid capability name objectSpaceReserve is not honored for dynamically provisioned pvc using storageclass [Suite:openshift/conformance/parallel] [Suite:k8s]", @@ -12257,6 +12451,12 @@ var annotations = map[string]string{ "[Top Level] [sig-storage] Volumes ConfigMap should be mountable": "should be mountable [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] Volumes GlusterFS should be mountable": "should be mountable [Disabled:Unsupported] [Skipped:ibmcloud] [Suite:k8s]", + + "[Top Level] [sig-storage] Volumes NFSv3 should be mountable for NFSv3": "should be mountable for NFSv3 [Suite:openshift/conformance/parallel] [Suite:k8s]", + + "[Top Level] [sig-storage] Volumes NFSv4 should be mountable for NFSv4": "should be mountable for NFSv4 [Suite:openshift/conformance/parallel] [Suite:k8s]", + "[Top Level] [sig-storage] Zone Support [Feature:vsphere] Verify PVC creation fails if no zones are specified in the storage class (No shared datastores exist among all the nodes)": "Verify PVC creation fails if no zones are specified in the storage class (No shared datastores exist among all the nodes) [Suite:openshift/conformance/parallel] [Suite:k8s]", "[Top Level] [sig-storage] Zone Support [Feature:vsphere] Verify PVC creation fails if only datastore is specified in the storage class (No shared datastores exist among all the nodes)": "Verify PVC creation fails if only datastore is specified in the storage class (No shared datastores exist among all the nodes) [Suite:openshift/conformance/parallel] [Suite:k8s]", diff --git a/test/extended/util/image/zz_generated.txt b/test/extended/util/image/zz_generated.txt index e8797d53cb2c..76562178a86e 100644 --- a/test/extended/util/image/zz_generated.txt +++ b/test/extended/util/image/zz_generated.txt @@ -1,55 +1,63 @@ # This file is generated by hack/update-generated-bindata.sh -docker.io/gluster/glusterdynamic-provisioner:v1.0 quay.io/openshift/community-e2e-images:e2e-14-docker-io-gluster-glusterdynamic-provisioner-v1-0-KoXS0hk-A1Z9s5b8 -docker.io/library/busybox:1.29 quay.io/openshift/community-e2e-images:e2e-7-docker-io-library-busybox-1-29-pBq11zdTXE-KGsre -docker.io/library/httpd:2.4.38-alpine quay.io/openshift/community-e2e-images:e2e-15-docker-io-library-httpd-2-4-38-alpine-PcS4HbFNhO5PfBub -docker.io/library/httpd:2.4.39-alpine quay.io/openshift/community-e2e-images:e2e-16-docker-io-library-httpd-2-4-39-alpine-Gj-c8OFZVVxvtHu2 -docker.io/library/nginx:1.14-alpine quay.io/openshift/community-e2e-images:e2e-23-docker-io-library-nginx-1-14-alpine-yxm61cIl0fz2I0Zz -docker.io/library/nginx:1.15-alpine quay.io/openshift/community-e2e-images:e2e-24-docker-io-library-nginx-1-15-alpine-l2aP4Mr7LpVdV6gu -docker.io/library/perl:5.26 quay.io/openshift/community-e2e-images:e2e-28-docker-io-library-perl-5-26-FBqTQxmHsu0UjDlZ -docker.io/library/redis:5.0.5-alpine quay.io/openshift/community-e2e-images:e2e-31-docker-io-library-redis-5-0-5-alpine-dd1_y0PD70cxSx_m docker.io/library/registry:2.7.1 quay.io/openshift/community-e2e-images:e2e-docker-io-library-registry-2-7-1-g9zRqt2aidLQrnbe docker.io/mrogers950/origin-openldap-test:fedora29 quay.io/openshift/community-e2e-images:e2e-docker-io-mrogers950-origin-openldap-test-fedora29-spJ_eLUO2k2GFYK_ docker.io/openshift/test-multicast:latest quay.io/openshift/community-e2e-images:e2e-docker-io-openshift-test-multicast-latest-4AxcBBxKg_prX34z -gcr.io/kubernetes-e2e-test-images/apparmor-loader:1.0 quay.io/openshift/community-e2e-images:e2e-4-gcr-io-kubernetes-e2e-test-images-apparmor-loader-1-0-aNcoUDFEmADPugAY gcr.io/kubernetes-e2e-test-images/cuda-vector-add:1.0 quay.io/openshift/community-e2e-images:e2e-9-gcr-io-kubernetes-e2e-test-images-cuda-vector-add-1-0-8kiue1R1E2L4K4Cu -gcr.io/kubernetes-e2e-test-images/cuda-vector-add:2.0 quay.io/openshift/community-e2e-images:e2e-10-gcr-io-kubernetes-e2e-test-images-cuda-vector-add-2-0-athN2DOyoc4ux5JO -gcr.io/kubernetes-e2e-test-images/echoserver:2.2 quay.io/openshift/community-e2e-images:e2e-12-gcr-io-kubernetes-e2e-test-images-echoserver-2-2-flifUTtzBQYThevq -gcr.io/kubernetes-e2e-test-images/ipc-utils:1.0 quay.io/openshift/community-e2e-images:e2e-18-gcr-io-kubernetes-e2e-test-images-ipc-utils-1-0-bVpFSazzlPF0h7Sh -gcr.io/kubernetes-e2e-test-images/jessie-dnsutils:1.0 quay.io/openshift/community-e2e-images:e2e-19-gcr-io-kubernetes-e2e-test-images-jessie-dnsutils-1-0-eIx8izd3E579FYKJ -gcr.io/kubernetes-e2e-test-images/kitten:1.0 quay.io/openshift/community-e2e-images:e2e-20-gcr-io-kubernetes-e2e-test-images-kitten-1-0-nyaXRBZKp1MUalek -gcr.io/kubernetes-e2e-test-images/metadata-concealment:1.2 quay.io/openshift/community-e2e-images:e2e-8-gcr-io-kubernetes-e2e-test-images-metadata-concealment-1-2-hVXHl0CaKh0yxj30 -gcr.io/kubernetes-e2e-test-images/nautilus:1.0 quay.io/openshift/community-e2e-images:e2e-21-gcr-io-kubernetes-e2e-test-images-nautilus-1-0-ot9uKfkPJ1nHoaa5 -gcr.io/kubernetes-e2e-test-images/nonewprivs:1.0 quay.io/openshift/community-e2e-images:e2e-25-gcr-io-kubernetes-e2e-test-images-nonewprivs-1-0-99FQZQqpju_wLImS -gcr.io/kubernetes-e2e-test-images/nonroot:1.0 quay.io/openshift/community-e2e-images:e2e-26-gcr-io-kubernetes-e2e-test-images-nonroot-1-0-6UP--2eZSLen4EJ- -gcr.io/kubernetes-e2e-test-images/regression-issue-74839-amd64:1.0 quay.io/openshift/community-e2e-images:e2e-32-gcr-io-kubernetes-e2e-test-images-regression-issue-74839-amd64-1-0-zKI5eDEBSTF6x1_L -gcr.io/kubernetes-e2e-test-images/resource-consumer:1.5 quay.io/openshift/community-e2e-images:e2e-33-gcr-io-kubernetes-e2e-test-images-resource-consumer-1-5-dkUnrzChb3aARMbw -gcr.io/kubernetes-e2e-test-images/sample-apiserver:1.17 quay.io/openshift/community-e2e-images:e2e-3-gcr-io-kubernetes-e2e-test-images-sample-apiserver-1-17-NgZupChxq-wmkUzw -gcr.io/kubernetes-e2e-test-images/volume/gluster:1.0 quay.io/openshift/community-e2e-images:e2e-37-gcr-io-kubernetes-e2e-test-images-volume-gluster-1-0-gLYeM8gU2klsD8wi -gcr.io/kubernetes-e2e-test-images/volume/iscsi:2.0 quay.io/openshift/community-e2e-images:e2e-36-gcr-io-kubernetes-e2e-test-images-volume-iscsi-2-0-RuKnuHHE9bwOcqDI -gcr.io/kubernetes-e2e-test-images/volume/nfs:1.0 quay.io/openshift/community-e2e-images:e2e-35-gcr-io-kubernetes-e2e-test-images-volume-nfs-1-0-AW-qOVYbJYyLsrEa -gcr.io/kubernetes-e2e-test-images/volume/rbd:1.0.1 quay.io/openshift/community-e2e-images:e2e-38-gcr-io-kubernetes-e2e-test-images-volume-rbd-1-0-1-ijh6-o3bvnWWIAFM -k8s.gcr.io/build-image/debian-iptables:buster-v1.3.0 quay.io/openshift/community-e2e-images:e2e-11-k8s-gcr-io-build-image-debian-iptables-buster-v1-3-0-2IwrNjgvp777TKmc -k8s.gcr.io/e2e-test-images/agnhost:2.21 quay.io/openshift/community-e2e-images:e2e-1-k8s-gcr-io-e2e-test-images-agnhost-2-21-v0OxZ-MhmEqtUyE9 +k8s.gcr.io/build-image/debian-iptables:buster-v1.5.0 quay.io/openshift/community-e2e-images:e2e-11-k8s-gcr-io-build-image-debian-iptables-buster-v1-5-0-8u9b7niBCAXaez0P +k8s.gcr.io/e2e-test-images/agnhost:2.30 quay.io/openshift/community-e2e-images:e2e-1-k8s-gcr-io-e2e-test-images-agnhost-2-30-j8g9ITN9Ry5o-H1C +k8s.gcr.io/e2e-test-images/apparmor-loader:1.3 quay.io/openshift/community-e2e-images:e2e-4-k8s-gcr-io-e2e-test-images-apparmor-loader-1-3-atmRgGmQDe44o0Vt +k8s.gcr.io/e2e-test-images/busybox:1.29-1 quay.io/openshift/community-e2e-images:e2e-7-k8s-gcr-io-e2e-test-images-busybox-1-29-1-4vRlLJlMSKkJ4csR +k8s.gcr.io/e2e-test-images/cuda-vector-add:2.2 quay.io/openshift/community-e2e-images:e2e-10-k8s-gcr-io-e2e-test-images-cuda-vector-add-2-2-jfn9MO1ZuFYZo9B7 +k8s.gcr.io/e2e-test-images/echoserver:2.3 quay.io/openshift/community-e2e-images:e2e-12-k8s-gcr-io-e2e-test-images-echoserver-2-3-1dQAXkPNCG1sbs7r +k8s.gcr.io/e2e-test-images/glusterdynamic-provisioner:v1.0 quay.io/openshift/community-e2e-images:e2e-14-k8s-gcr-io-e2e-test-images-glusterdynamic-provisioner-v1-0-mauMETP19NLZc2Oo +k8s.gcr.io/e2e-test-images/httpd:2.4.38-1 quay.io/openshift/community-e2e-images:e2e-15-k8s-gcr-io-e2e-test-images-httpd-2-4-38-1-IML2TQPIHpWx2svj +k8s.gcr.io/e2e-test-images/httpd:2.4.39-1 quay.io/openshift/community-e2e-images:e2e-16-k8s-gcr-io-e2e-test-images-httpd-2-4-39-1-n3rCdS4qndowrZLm +k8s.gcr.io/e2e-test-images/ipc-utils:1.2 quay.io/openshift/community-e2e-images:e2e-18-k8s-gcr-io-e2e-test-images-ipc-utils-1-2-TCO6JJjBPaK8Pd0R +k8s.gcr.io/e2e-test-images/jessie-dnsutils:1.4 quay.io/openshift/community-e2e-images:e2e-19-k8s-gcr-io-e2e-test-images-jessie-dnsutils-1-4-CpNW9DGSHMTImzVj +k8s.gcr.io/e2e-test-images/kitten:1.4 quay.io/openshift/community-e2e-images:e2e-20-k8s-gcr-io-e2e-test-images-kitten-1-4-fIRRjydRNtLQmFaw +k8s.gcr.io/e2e-test-images/metadata-concealment:1.6 quay.io/openshift/community-e2e-images:e2e-8-k8s-gcr-io-e2e-test-images-metadata-concealment-1-6-UXBlSe0FnHlINNGI +k8s.gcr.io/e2e-test-images/nautilus:1.4 quay.io/openshift/community-e2e-images:e2e-21-k8s-gcr-io-e2e-test-images-nautilus-1-4-zQQL3_vG6alzsLPL +k8s.gcr.io/e2e-test-images/nginx:1.14-1 quay.io/openshift/community-e2e-images:e2e-23-k8s-gcr-io-e2e-test-images-nginx-1-14-1-U1lW202kkIjKDoCV +k8s.gcr.io/e2e-test-images/nginx:1.15-1 quay.io/openshift/community-e2e-images:e2e-24-k8s-gcr-io-e2e-test-images-nginx-1-15-1-xzoGFMK91kwaelhK +k8s.gcr.io/e2e-test-images/node-perf/npb-ep:1.1 quay.io/openshift/community-e2e-images:e2e-25-k8s-gcr-io-e2e-test-images-node-perf-npb-ep-1-1-qAobiiB2OPoVTh1n +k8s.gcr.io/e2e-test-images/node-perf/npb-is:1.1 quay.io/openshift/community-e2e-images:e2e-26-k8s-gcr-io-e2e-test-images-node-perf-npb-is-1-1-ZcYvdXxf361K6QKX +k8s.gcr.io/e2e-test-images/node-perf/tf-wide-deep:1.1 quay.io/openshift/community-e2e-images:e2e-27-k8s-gcr-io-e2e-test-images-node-perf-tf-wide-deep-1-1-2DopDvEqY-2YMGDn +k8s.gcr.io/e2e-test-images/nonewprivs:1.3 quay.io/openshift/community-e2e-images:e2e-28-k8s-gcr-io-e2e-test-images-nonewprivs-1-3-DGw_U3sKWdzLxqlb +k8s.gcr.io/e2e-test-images/nonroot:1.1 quay.io/openshift/community-e2e-images:e2e-29-k8s-gcr-io-e2e-test-images-nonroot-1-1-T5YXMLbuStbhPYq8 +k8s.gcr.io/e2e-test-images/perl:5.26 quay.io/openshift/community-e2e-images:e2e-31-k8s-gcr-io-e2e-test-images-perl-5-26-gT7a6sfEpQ0rddQY +k8s.gcr.io/e2e-test-images/redis:5.0.5-alpine quay.io/openshift/community-e2e-images:e2e-34-k8s-gcr-io-e2e-test-images-redis-5-0-5-alpine-qg68bAMRa63lBVTX +k8s.gcr.io/e2e-test-images/regression-issue-74839:1.2 quay.io/openshift/community-e2e-images:e2e-35-k8s-gcr-io-e2e-test-images-regression-issue-74839-1-2-lZkv-zFysOVUIYZ- +k8s.gcr.io/e2e-test-images/resource-consumer:1.9 quay.io/openshift/community-e2e-images:e2e-36-k8s-gcr-io-e2e-test-images-resource-consumer-1-9-S7ZomN0-BB444w1p +k8s.gcr.io/e2e-test-images/sample-apiserver:1.17.4 quay.io/openshift/community-e2e-images:e2e-3-k8s-gcr-io-e2e-test-images-sample-apiserver-1-17-4-AC3A0x1ePf4fLoiv +k8s.gcr.io/e2e-test-images/volume/gluster:1.2 quay.io/openshift/community-e2e-images:e2e-40-k8s-gcr-io-e2e-test-images-volume-gluster-1-2-xqLdbLwlWynjTK1e +k8s.gcr.io/e2e-test-images/volume/iscsi:2.2 quay.io/openshift/community-e2e-images:e2e-39-k8s-gcr-io-e2e-test-images-volume-iscsi-2-2-X8Y8iCo_6trylR_a +k8s.gcr.io/e2e-test-images/volume/nfs:1.2 quay.io/openshift/community-e2e-images:e2e-38-k8s-gcr-io-e2e-test-images-volume-nfs-1-2-f5AtFwpu7FTF0BR7 +k8s.gcr.io/e2e-test-images/volume/rbd:1.0.3 quay.io/openshift/community-e2e-images:e2e-41-k8s-gcr-io-e2e-test-images-volume-rbd-1-0-3-xrKSxriXVbRV05Yx k8s.gcr.io/etcd:3.4.13-0 quay.io/openshift/community-e2e-images:e2e-13-k8s-gcr-io-etcd-3-4-13-0-VKSltRW2wd8-QWft -k8s.gcr.io/pause:3.2 quay.io/openshift/community-e2e-images:e2e-27-k8s-gcr-io-pause-3-2-pZ7kB8CESdFpJJRs -k8s.gcr.io/prometheus-dummy-exporter:v0.1.0 quay.io/openshift/community-e2e-images:e2e-29-k8s-gcr-io-prometheus-dummy-exporter-v0-1-0-fNZIUrKnAwcvKTvF -k8s.gcr.io/prometheus-to-sd:v0.5.0 quay.io/openshift/community-e2e-images:e2e-30-k8s-gcr-io-prometheus-to-sd-v0-5-0-6JI59Yih4oaj3oQO -k8s.gcr.io/sd-dummy-exporter:v0.2.0 quay.io/openshift/community-e2e-images:e2e-34-k8s-gcr-io-sd-dummy-exporter-v0-2-0-pPp4DDTpVamU2YNi +k8s.gcr.io/pause:3.4.1 quay.io/openshift/community-e2e-images:e2e-30-k8s-gcr-io-pause-3-4-1-icxi3fblKRX1-v20 +k8s.gcr.io/prometheus-dummy-exporter:v0.1.0 quay.io/openshift/community-e2e-images:e2e-32-k8s-gcr-io-prometheus-dummy-exporter-v0-1-0-fNZIUrKnAwcvKTvF +k8s.gcr.io/prometheus-to-sd:v0.5.0 quay.io/openshift/community-e2e-images:e2e-33-k8s-gcr-io-prometheus-to-sd-v0-5-0-6JI59Yih4oaj3oQO +k8s.gcr.io/sd-dummy-exporter:v0.2.0 quay.io/openshift/community-e2e-images:e2e-37-k8s-gcr-io-sd-dummy-exporter-v0-2-0-pPp4DDTpVamU2YNi k8s.gcr.io/sig-storage/csi-attacher:v2.2.0 quay.io/openshift/community-e2e-images:e2e-k8s-gcr-io-sig-storage-csi-attacher-v2-2-0-rkWV0rp07ep86NLk k8s.gcr.io/sig-storage/csi-attacher:v3.0.0 quay.io/openshift/community-e2e-images:e2e-k8s-gcr-io-sig-storage-csi-attacher-v3-0-0-aRfAQ93WCiGD8Zvq k8s.gcr.io/sig-storage/csi-node-driver-registrar:v1.2.0 quay.io/openshift/community-e2e-images:e2e-k8s-gcr-io-sig-storage-csi-node-driver-registrar-v1-2-0-61xf9FtqLwOVEKfv k8s.gcr.io/sig-storage/csi-node-driver-registrar:v1.3.0 quay.io/openshift/community-e2e-images:e2e-k8s-gcr-io-sig-storage-csi-node-driver-registrar-v1-3-0-2QBE0hLaWwzOxqR6 +k8s.gcr.io/sig-storage/csi-node-driver-registrar:v2.1.0 quay.io/openshift/community-e2e-images:e2e-k8s-gcr-io-sig-storage-csi-node-driver-registrar-v2-1-0-RfMBAN1FDvFToeQO k8s.gcr.io/sig-storage/csi-provisioner:v1.6.0 quay.io/openshift/community-e2e-images:e2e-k8s-gcr-io-sig-storage-csi-provisioner-v1-6-0-JY3N9ZcwCflk372F k8s.gcr.io/sig-storage/csi-provisioner:v2.0.0 quay.io/openshift/community-e2e-images:e2e-k8s-gcr-io-sig-storage-csi-provisioner-v2-0-0-twLyh6EaAecaDbK8 +k8s.gcr.io/sig-storage/csi-provisioner:v2.1.0 quay.io/openshift/community-e2e-images:e2e-k8s-gcr-io-sig-storage-csi-provisioner-v2-1-0-Efz5FPIgZHYa_A55 k8s.gcr.io/sig-storage/csi-resizer:v0.4.0 quay.io/openshift/community-e2e-images:e2e-k8s-gcr-io-sig-storage-csi-resizer-v0-4-0-XqHBnRtAgovNyXK3 k8s.gcr.io/sig-storage/csi-resizer:v0.5.0 quay.io/openshift/community-e2e-images:e2e-k8s-gcr-io-sig-storage-csi-resizer-v0-5-0-O79EW2-1fDT39X15 +k8s.gcr.io/sig-storage/csi-resizer:v1.1.0 quay.io/openshift/community-e2e-images:e2e-k8s-gcr-io-sig-storage-csi-resizer-v1-1-0-ZXkYIsulx6mpNWVA k8s.gcr.io/sig-storage/csi-snapshotter:v2.0.1 quay.io/openshift/community-e2e-images:e2e-k8s-gcr-io-sig-storage-csi-snapshotter-v2-0-1-NIPtB_SC-LRqBaeq k8s.gcr.io/sig-storage/csi-snapshotter:v2.1.0 quay.io/openshift/community-e2e-images:e2e-k8s-gcr-io-sig-storage-csi-snapshotter-v2-1-0-1kbgyjhsZ5sWpBwq k8s.gcr.io/sig-storage/csi-snapshotter:v3.0.2 quay.io/openshift/community-e2e-images:e2e-k8s-gcr-io-sig-storage-csi-snapshotter-v3-0-2-xM4zaRecqro9vBr7 k8s.gcr.io/sig-storage/hostpathplugin:v1.4.0 quay.io/openshift/community-e2e-images:e2e-k8s-gcr-io-sig-storage-hostpathplugin-v1-4-0-AfY5JyX6DsfCefAR k8s.gcr.io/sig-storage/livenessprobe:v1.1.0 quay.io/openshift/community-e2e-images:e2e-k8s-gcr-io-sig-storage-livenessprobe-v1-1-0-d49j-mlARufXkhrZ k8s.gcr.io/sig-storage/mock-driver:v4.0.2 quay.io/openshift/community-e2e-images:e2e-k8s-gcr-io-sig-storage-mock-driver-v4-0-2-GE9vfPm7mdvjzZh_ +k8s.gcr.io/sig-storage/mock-driver:v4.1.0 quay.io/openshift/community-e2e-images:e2e-k8s-gcr-io-sig-storage-mock-driver-v4-1-0-P27Wam4odKjKMUsy k8s.gcr.io/sig-storage/nfs-provisioner:v2.2.2 quay.io/openshift/community-e2e-images:e2e-22-k8s-gcr-io-sig-storage-nfs-provisioner-v2-2-2-dbgtOCwYmEGggl01 k8s.gcr.io/sig-storage/snapshot-controller:v2.1.1 quay.io/openshift/community-e2e-images:e2e-k8s-gcr-io-sig-storage-snapshot-controller-v2-1-1-n5BM_jX2npV3RxHM +k8s.gcr.io/sig-storage/snapshot-controller:v3.0.2 quay.io/openshift/community-e2e-images:e2e-k8s-gcr-io-sig-storage-snapshot-controller-v3-0-2-IVmgAhsROusslTdY quay.io/redhat-developer/nfs-server:1.0 quay.io/openshift/community-e2e-images:e2e-quay-io-redhat-developer-nfs-server-1-0-Wz4GFQ2IuhYmh2mB registry.ci.openshift.org/ocp/4.7:test-build-roots2i quay.io/openshift/community-e2e-images:e2e-registry-ci-openshift-org-ocp-4-7-test-build-roots2i-tG08qb6aSmDhxBBy